From 6cedb0c78d33d64596e5beabf5f09bf81f36953c Mon Sep 17 00:00:00 2001 From: Adrian Catangiu Date: Mon, 11 Dec 2023 12:07:01 +0200 Subject: [PATCH 001/191] pallet-xcm: fix test benchmarks (#2679) For some reason original PR passed CI - when it shouldn't have. Fix `pallet-xcm` test benchmarks. --- polkadot/xcm/pallet-xcm/src/mock.rs | 30 +++++++++++-------- .../pallet-xcm/src/tests/assets_transfer.rs | 29 +++++++++++++----- 2 files changed, 40 insertions(+), 19 deletions(-) diff --git a/polkadot/xcm/pallet-xcm/src/mock.rs b/polkadot/xcm/pallet-xcm/src/mock.rs index 9a734d0f276..e7f5870c914 100644 --- a/polkadot/xcm/pallet-xcm/src/mock.rs +++ b/polkadot/xcm/pallet-xcm/src/mock.rs @@ -589,10 +589,23 @@ impl super::benchmarking::Config for Test { let asset_amount = 10u128; let fee_amount = 2u128; + let existential_deposit = ExistentialDeposit::get(); + let caller = frame_benchmarking::whitelisted_caller(); + + // Give some multiple of the existential deposit + let balance = asset_amount + existential_deposit * 1000; + let _ = >::make_free_balance_be( + &caller, balance, + ); // create sufficient foreign asset USDT let usdt_initial_local_amount = fee_amount * 10; - let (usdt_chain, _, usdt_id_multilocation) = - set_up_foreign_asset(USDT_PARA_ID, None, usdt_initial_local_amount, true); + let (usdt_chain, _, usdt_id_multilocation) = set_up_foreign_asset( + USDT_PARA_ID, + None, + caller.clone(), + usdt_initial_local_amount, + true, + ); // native assets transfer destination is USDT chain (teleport trust only for USDT) let dest = usdt_chain; @@ -602,20 +615,13 @@ impl super::benchmarking::Config for Test { // native asset to transfer (not used for fees) - local reserve (MultiLocation::here(), asset_amount).into(), ); - - let existential_deposit = ExistentialDeposit::get(); - let caller = frame_benchmarking::whitelisted_caller(); - // Give some multiple of the existential deposit - let balance = asset_amount + existential_deposit * 1000; - let _ = >::make_free_balance_be( - &caller, balance, - ); - // verify initial balance + // verify initial balances assert_eq!(Balances::free_balance(&caller), balance); + assert_eq!(Assets::balance(usdt_id_multilocation, &caller), usdt_initial_local_amount); // verify transferred successfully let verify = Box::new(move || { - // verify balance after transfer, decreased by transferred amount + // verify balances after transfer, decreased by transferred amounts assert_eq!(Balances::free_balance(&caller), balance - asset_amount); assert_eq!( Assets::balance(usdt_id_multilocation, &caller), diff --git a/polkadot/xcm/pallet-xcm/src/tests/assets_transfer.rs b/polkadot/xcm/pallet-xcm/src/tests/assets_transfer.rs index fb0bef26ebd..6893bae2b6c 100644 --- a/polkadot/xcm/pallet-xcm/src/tests/assets_transfer.rs +++ b/polkadot/xcm/pallet-xcm/src/tests/assets_transfer.rs @@ -244,6 +244,7 @@ fn reserve_transfer_assets_with_paid_router_works() { pub(crate) fn set_up_foreign_asset( reserve_para_id: u32, inner_junction: Option, + benficiary: AccountId, initial_amount: u128, is_sufficient: bool, ) -> (MultiLocation, AccountId, MultiLocation) { @@ -271,7 +272,7 @@ pub(crate) fn set_up_foreign_asset( assert_ok!(Assets::mint( RuntimeOrigin::signed(BOB), foreign_asset_id_multilocation, - ALICE, + benficiary, initial_amount )); @@ -440,6 +441,7 @@ fn destination_asset_reserve_and_local_fee_reserve_call( set_up_foreign_asset( FOREIGN_ASSET_RESERVE_PARA_ID, Some(FOREIGN_ASSET_INNER_JUNCTION), + ALICE, foreign_initial_amount, false, ); @@ -595,6 +597,7 @@ fn remote_asset_reserve_and_local_fee_reserve_call_disallowed( let (_, _, foreign_asset_id_multilocation) = set_up_foreign_asset( FOREIGN_ASSET_RESERVE_PARA_ID, Some(FOREIGN_ASSET_INNER_JUNCTION), + ALICE, foreign_initial_amount, false, ); @@ -712,6 +715,7 @@ fn local_asset_reserve_and_destination_fee_reserve_call( set_up_foreign_asset( USDC_RESERVE_PARA_ID, Some(USDC_INNER_JUNCTION), + ALICE, usdc_initial_local_amount, true, ); @@ -870,6 +874,7 @@ fn destination_asset_reserve_and_destination_fee_reserve_call( set_up_foreign_asset( FOREIGN_ASSET_RESERVE_PARA_ID, Some(FOREIGN_ASSET_INNER_JUNCTION), + ALICE, foreign_initial_amount, true, ); @@ -1013,6 +1018,7 @@ fn remote_asset_reserve_and_destination_fee_reserve_call_disallowed( let (usdc_chain, _, usdc_id_multilocation) = set_up_foreign_asset( USDC_RESERVE_PARA_ID, Some(USDC_INNER_JUNCTION), + ALICE, usdc_initial_local_amount, true, ); @@ -1022,6 +1028,7 @@ fn remote_asset_reserve_and_destination_fee_reserve_call_disallowed( let (_, _, foreign_asset_id_multilocation) = set_up_foreign_asset( FOREIGN_ASSET_RESERVE_PARA_ID, Some(FOREIGN_ASSET_INNER_JUNCTION), + ALICE, foreign_initial_amount, false, ); @@ -1135,6 +1142,7 @@ fn local_asset_reserve_and_remote_fee_reserve_call_disallowed( let (_, usdc_chain_sovereign_account, usdc_id_multilocation) = set_up_foreign_asset( USDC_RESERVE_PARA_ID, Some(USDC_INNER_JUNCTION), + ALICE, usdc_initial_local_amount, true, ); @@ -1244,6 +1252,7 @@ fn destination_asset_reserve_and_remote_fee_reserve_call_disallowed( let (_, usdc_chain_sovereign_account, usdc_id_multilocation) = set_up_foreign_asset( USDC_RESERVE_PARA_ID, Some(USDC_INNER_JUNCTION), + ALICE, usdc_initial_local_amount, true, ); @@ -1254,6 +1263,7 @@ fn destination_asset_reserve_and_remote_fee_reserve_call_disallowed( set_up_foreign_asset( FOREIGN_ASSET_RESERVE_PARA_ID, Some(FOREIGN_ASSET_INNER_JUNCTION), + ALICE, foreign_initial_amount, false, ); @@ -1383,6 +1393,7 @@ fn remote_asset_reserve_and_remote_fee_reserve_call( set_up_foreign_asset( USDC_RESERVE_PARA_ID, Some(USDC_INNER_JUNCTION), + ALICE, usdc_initial_local_amount, true, ); @@ -1526,7 +1537,7 @@ fn local_asset_reserve_and_teleported_fee_call( // create sufficient foreign asset USDT let usdt_initial_local_amount = 42; let (usdt_chain, usdt_chain_sovereign_account, usdt_id_multilocation) = - set_up_foreign_asset(USDT_PARA_ID, None, usdt_initial_local_amount, true); + set_up_foreign_asset(USDT_PARA_ID, None, ALICE, usdt_initial_local_amount, true); // native assets transfer destination is USDT chain (teleport trust only for USDT) let dest = usdt_chain; @@ -1675,7 +1686,7 @@ fn destination_asset_reserve_and_teleported_fee_call( // create sufficient foreign asset USDT let usdt_initial_local_amount = 42; let (_, usdt_chain_sovereign_account, usdt_id_multilocation) = - set_up_foreign_asset(USDT_PARA_ID, None, usdt_initial_local_amount, true); + set_up_foreign_asset(USDT_PARA_ID, None, ALICE, usdt_initial_local_amount, true); // create non-sufficient foreign asset BLA let foreign_initial_amount = 142; @@ -1683,6 +1694,7 @@ fn destination_asset_reserve_and_teleported_fee_call( set_up_foreign_asset( FOREIGN_ASSET_RESERVE_PARA_ID, Some(FOREIGN_ASSET_INNER_JUNCTION), + ALICE, foreign_initial_amount, false, ); @@ -1845,13 +1857,14 @@ fn remote_asset_reserve_and_teleported_fee_reserve_call_disallowed( // create sufficient foreign asset USDT let usdt_initial_local_amount = 42; let (usdt_chain, usdt_chain_sovereign_account, usdt_id_multilocation) = - set_up_foreign_asset(USDT_PARA_ID, None, usdt_initial_local_amount, true); + set_up_foreign_asset(USDT_PARA_ID, None, ALICE, usdt_initial_local_amount, true); // create non-sufficient foreign asset BLA let foreign_initial_amount = 142; let (_, reserve_sovereign_account, foreign_asset_id_multilocation) = set_up_foreign_asset( FOREIGN_ASSET_RESERVE_PARA_ID, Some(FOREIGN_ASSET_INNER_JUNCTION), + ALICE, foreign_initial_amount, false, ); @@ -1952,7 +1965,7 @@ fn reserve_transfer_assets_with_teleportable_asset_disallowed() { // create sufficient foreign asset USDT let usdt_initial_local_amount = 42; let (usdt_chain, usdt_chain_sovereign_account, usdt_id_multilocation) = - set_up_foreign_asset(USDT_PARA_ID, None, usdt_initial_local_amount, true); + set_up_foreign_asset(USDT_PARA_ID, None, ALICE, usdt_initial_local_amount, true); // transfer destination is USDT chain (foreign asset needs to go through its reserve chain) let dest = usdt_chain; @@ -2037,6 +2050,7 @@ fn intermediary_error_reverts_side_effects() { let (_, usdc_chain_sovereign_account, usdc_id_multilocation) = set_up_foreign_asset( USDC_RESERVE_PARA_ID, Some(USDC_INNER_JUNCTION), + ALICE, usdc_initial_local_amount, true, ); @@ -2106,7 +2120,7 @@ fn teleport_asset_using_local_fee_reserve_call( // create non-sufficient foreign asset USDT let usdt_initial_local_amount = 42; let (usdt_chain, usdt_chain_sovereign_account, usdt_id_multilocation) = - set_up_foreign_asset(USDT_PARA_ID, None, usdt_initial_local_amount, false); + set_up_foreign_asset(USDT_PARA_ID, None, ALICE, usdt_initial_local_amount, false); // transfer destination is reserve location (no teleport trust) let dest = usdt_chain; @@ -2258,6 +2272,7 @@ fn teleported_asset_using_destination_reserve_fee_call( set_up_foreign_asset( FOREIGN_ASSET_RESERVE_PARA_ID, Some(FOREIGN_ASSET_INNER_JUNCTION), + ALICE, foreign_initial_amount, true, ); @@ -2265,7 +2280,7 @@ fn teleported_asset_using_destination_reserve_fee_call( // create non-sufficient foreign asset USDT let usdt_initial_local_amount = 42; let (_, usdt_chain_sovereign_account, usdt_id_multilocation) = - set_up_foreign_asset(USDT_PARA_ID, None, usdt_initial_local_amount, false); + set_up_foreign_asset(USDT_PARA_ID, None, ALICE, usdt_initial_local_amount, false); // transfer destination is BLA reserve location let dest = reserve_location; -- GitLab From 84c932cd8ace8e389f753608e7a796f77ccdb00d Mon Sep 17 00:00:00 2001 From: Alexandru Gheorghe <49718502+alexggh@users.noreply.github.com> Date: Mon, 11 Dec 2023 12:49:11 +0200 Subject: [PATCH 002/191] Add feature flag to enable v2 assignments (#2444) Scaffold everything, so that we can enable v2 assignments via a node feature bit, once all nodes have upgraded to the new protocol. Implements: https://github.com/paritytech/polkadot-sdk/issues/628 --------- Signed-off-by: Alexandru Gheorghe --- .../node/core/approval-voting/src/criteria.rs | 4 +- .../node/core/approval-voting/src/import.rs | 339 ++++++++++-------- .../node/core/approval-voting/src/tests.rs | 14 +- .../core/dispute-coordinator/src/tests.rs | 43 ++- .../src/pov_requester/mod.rs | 10 +- .../src/requester/tests.rs | 8 +- .../src/tests/state.rs | 7 +- .../src/collator_side/tests/mod.rs | 12 +- .../dispute-distribution/src/tests/mod.rs | 22 +- .../src/legacy_v1/tests.rs | 57 ++- .../node/subsystem-util/src/runtime/mod.rs | 27 +- polkadot/primitives/src/vstaging/mod.rs | 16 + 12 files changed, 393 insertions(+), 166 deletions(-) diff --git a/polkadot/node/core/approval-voting/src/criteria.rs b/polkadot/node/core/approval-voting/src/criteria.rs index acad1c66a43..b6ad1971ef6 100644 --- a/polkadot/node/core/approval-voting/src/criteria.rs +++ b/polkadot/node/core/approval-voting/src/criteria.rs @@ -261,6 +261,7 @@ pub(crate) trait AssignmentCriteria { relay_vrf_story: RelayVRFStory, config: &Config, leaving_cores: Vec<(CandidateHash, CoreIndex, GroupIndex)>, + enable_v2_assignments: bool, ) -> HashMap; fn check_assignment_cert( @@ -284,8 +285,9 @@ impl AssignmentCriteria for RealAssignmentCriteria { relay_vrf_story: RelayVRFStory, config: &Config, leaving_cores: Vec<(CandidateHash, CoreIndex, GroupIndex)>, + enable_v2_assignments: bool, ) -> HashMap { - compute_assignments(keystore, relay_vrf_story, config, leaving_cores, false) + compute_assignments(keystore, relay_vrf_story, config, leaving_cores, enable_v2_assignments) } fn check_assignment_cert( diff --git a/polkadot/node/core/approval-voting/src/import.rs b/polkadot/node/core/approval-voting/src/import.rs index d7667e8e405..a64685326cf 100644 --- a/polkadot/node/core/approval-voting/src/import.rs +++ b/polkadot/node/core/approval-voting/src/import.rs @@ -45,8 +45,8 @@ use polkadot_node_subsystem::{ }; use polkadot_node_subsystem_util::{determine_new_blocks, runtime::RuntimeInfo}; use polkadot_primitives::{ - BlockNumber, CandidateEvent, CandidateHash, CandidateReceipt, ConsensusLog, CoreIndex, - GroupIndex, Hash, Header, SessionIndex, + vstaging::node_features, BlockNumber, CandidateEvent, CandidateHash, CandidateReceipt, + ConsensusLog, CoreIndex, GroupIndex, Hash, Header, SessionIndex, }; use sc_keystore::LocalKeystore; use sp_consensus_slots::Slot; @@ -60,7 +60,7 @@ use super::approval_db::v2; use crate::{ backend::{Backend, OverlayedBackend}, criteria::{AssignmentCriteria, OurAssignment}, - get_session_info, + get_extended_session_info, get_session_info, persisted_entries::CandidateEntry, time::{slot_number_to_tick, Tick}, }; @@ -214,10 +214,21 @@ async fn imported_block_info( } }; + let extended_session_info = + get_extended_session_info(env.runtime_info, ctx.sender(), block_hash, session_index).await; + let enable_v2_assignments = extended_session_info.map_or(false, |extended_session_info| { + *extended_session_info + .node_features + .get(node_features::FeatureIndex::EnableAssignmentsV2 as usize) + .as_deref() + .unwrap_or(&false) + }); + let session_info = get_session_info(env.runtime_info, ctx.sender(), block_hash, session_index) .await .ok_or(ImportedBlockInfoError::SessionInfoUnavailable)?; + gum::debug!(target: LOG_TARGET, ?enable_v2_assignments, "V2 assignments"); let (assignments, slot, relay_vrf_story) = { let unsafe_vrf = approval_types::v1::babe_unsafe_vrf_info(&block_header); @@ -239,6 +250,7 @@ async fn imported_block_info( .iter() .map(|(c_hash, _, core, group)| (*c_hash, *core, *group)) .collect(), + enable_v2_assignments, ); (assignments, slot, relay_vrf) @@ -603,6 +615,7 @@ pub(crate) mod tests { use polkadot_node_subsystem_test_helpers::make_subsystem_context; use polkadot_node_subsystem_util::database::Database; use polkadot_primitives::{ + vstaging::{node_features::FeatureIndex, NodeFeatures}, ExecutorParams, Id as ParaId, IndexedVec, SessionInfo, ValidatorId, ValidatorIndex, }; pub(crate) use sp_consensus_babe::{ @@ -639,7 +652,7 @@ pub(crate) mod tests { keystore: Arc::new(LocalKeystore::in_memory()), slot_duration_millis: 6_000, clock: Box::new(MockClock::default()), - assignment_criteria: Box::new(MockAssignmentCriteria), + assignment_criteria: Box::new(MockAssignmentCriteria::default()), spans: HashMap::new(), } } @@ -654,7 +667,10 @@ pub(crate) mod tests { ) } - struct MockAssignmentCriteria; + #[derive(Default)] + struct MockAssignmentCriteria { + enable_v2: bool, + } impl AssignmentCriteria for MockAssignmentCriteria { fn compute_assignments( @@ -667,7 +683,9 @@ pub(crate) mod tests { polkadot_primitives::CoreIndex, polkadot_primitives::GroupIndex, )>, + enable_assignments_v2: bool, ) -> HashMap { + assert_eq!(enable_assignments_v2, self.enable_v2); HashMap::new() } @@ -711,154 +729,164 @@ pub(crate) mod tests { #[test] fn imported_block_info_is_good() { - let pool = TaskExecutor::new(); - let (mut ctx, mut handle) = - make_subsystem_context::(pool.clone()); - - let session = 5; - let session_info = dummy_session_info(session); - - let slot = Slot::from(10); - - let header = Header { - digest: { - let mut d = Digest::default(); - let vrf_signature = garbage_vrf_signature(); - d.push(DigestItem::babe_pre_digest(PreDigest::SecondaryVRF( - SecondaryVRFPreDigest { authority_index: 0, slot, vrf_signature }, - ))); - - d - }, - extrinsics_root: Default::default(), - number: 5, - state_root: Default::default(), - parent_hash: Default::default(), - }; - - let hash = header.hash(); - let make_candidate = |para_id| { - let mut r = dummy_candidate_receipt(dummy_hash()); - r.descriptor.para_id = para_id; - r.descriptor.relay_parent = hash; - r - }; - let candidates = vec![ - (make_candidate(1.into()), CoreIndex(0), GroupIndex(2)), - (make_candidate(2.into()), CoreIndex(1), GroupIndex(3)), - ]; + for enable_v2 in [false, true] { + let pool = TaskExecutor::new(); + let (mut ctx, mut handle) = + make_subsystem_context::(pool.clone()); + + let session = 5; + let session_info = dummy_session_info(session); + + let slot = Slot::from(10); + let header = Header { + digest: { + let mut d = Digest::default(); + let vrf_signature = garbage_vrf_signature(); + d.push(DigestItem::babe_pre_digest(PreDigest::SecondaryVRF( + SecondaryVRFPreDigest { authority_index: 0, slot, vrf_signature }, + ))); + + d + }, + extrinsics_root: Default::default(), + number: 5, + state_root: Default::default(), + parent_hash: Default::default(), + }; - let inclusion_events = candidates - .iter() - .cloned() - .map(|(r, c, g)| CandidateEvent::CandidateIncluded(r, Vec::new().into(), c, g)) - .collect::>(); + let hash = header.hash(); + let make_candidate = |para_id| { + let mut r = dummy_candidate_receipt(dummy_hash()); + r.descriptor.para_id = para_id; + r.descriptor.relay_parent = hash; + r + }; + let candidates = vec![ + (make_candidate(1.into()), CoreIndex(0), GroupIndex(2)), + (make_candidate(2.into()), CoreIndex(1), GroupIndex(3)), + ]; - let test_fut = { - let included_candidates = candidates + let inclusion_events = candidates .iter() - .map(|(r, c, g)| (r.hash(), r.clone(), *c, *g)) + .cloned() + .map(|(r, c, g)| CandidateEvent::CandidateIncluded(r, Vec::new().into(), c, g)) .collect::>(); - let mut runtime_info = RuntimeInfo::new_with_config(RuntimeInfoConfig { - keystore: None, - session_cache_lru_size: DISPUTE_WINDOW.get(), - }); + let test_fut = { + let included_candidates = candidates + .iter() + .map(|(r, c, g)| (r.hash(), r.clone(), *c, *g)) + .collect::>(); + + let mut runtime_info = RuntimeInfo::new_with_config(RuntimeInfoConfig { + keystore: None, + session_cache_lru_size: DISPUTE_WINDOW.get(), + }); + + let header = header.clone(); + Box::pin(async move { + let env = ImportedBlockInfoEnv { + runtime_info: &mut runtime_info, + assignment_criteria: &MockAssignmentCriteria { enable_v2 }, + keystore: &LocalKeystore::in_memory(), + }; - let header = header.clone(); - Box::pin(async move { - let env = ImportedBlockInfoEnv { - runtime_info: &mut runtime_info, - assignment_criteria: &MockAssignmentCriteria, - keystore: &LocalKeystore::in_memory(), - }; + let info = + imported_block_info(&mut ctx, env, hash, &header, &Some(4)).await.unwrap(); - let info = - imported_block_info(&mut ctx, env, hash, &header, &Some(4)).await.unwrap(); + assert_eq!(info.included_candidates, included_candidates); + assert_eq!(info.session_index, session); + assert!(info.assignments.is_empty()); + assert_eq!(info.n_validators, 0); + assert_eq!(info.slot, slot); + assert!(info.force_approve.is_none()); + }) + }; - assert_eq!(info.included_candidates, included_candidates); - assert_eq!(info.session_index, session); - assert!(info.assignments.is_empty()); - assert_eq!(info.n_validators, 0); - assert_eq!(info.slot, slot); - assert!(info.force_approve.is_none()); - }) - }; + let aux_fut = Box::pin(async move { + assert_matches!( + handle.recv().await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + h, + RuntimeApiRequest::CandidateEvents(c_tx), + )) => { + assert_eq!(h, hash); + let _ = c_tx.send(Ok(inclusion_events)); + } + ); - let aux_fut = Box::pin(async move { - assert_matches!( - handle.recv().await, - AllMessages::RuntimeApi(RuntimeApiMessage::Request( - h, - RuntimeApiRequest::CandidateEvents(c_tx), - )) => { - assert_eq!(h, hash); - let _ = c_tx.send(Ok(inclusion_events)); - } - ); + assert_matches!( + handle.recv().await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + h, + RuntimeApiRequest::SessionIndexForChild(c_tx), + )) => { + assert_eq!(h, header.parent_hash); + let _ = c_tx.send(Ok(session)); + } + ); - assert_matches!( - handle.recv().await, - AllMessages::RuntimeApi(RuntimeApiMessage::Request( - h, - RuntimeApiRequest::SessionIndexForChild(c_tx), - )) => { - assert_eq!(h, header.parent_hash); - let _ = c_tx.send(Ok(session)); - } - ); + assert_matches!( + handle.recv().await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + h, + RuntimeApiRequest::CurrentBabeEpoch(c_tx), + )) => { + assert_eq!(h, hash); + let _ = c_tx.send(Ok(BabeEpoch { + epoch_index: session as _, + start_slot: Slot::from(0), + duration: 200, + authorities: vec![(Sr25519Keyring::Alice.public().into(), 1)], + randomness: [0u8; 32], + config: BabeEpochConfiguration { + c: (1, 4), + allowed_slots: AllowedSlots::PrimarySlots, + }, + })); + } + ); - assert_matches!( - handle.recv().await, - AllMessages::RuntimeApi(RuntimeApiMessage::Request( - h, - RuntimeApiRequest::CurrentBabeEpoch(c_tx), - )) => { - assert_eq!(h, hash); - let _ = c_tx.send(Ok(BabeEpoch { - epoch_index: session as _, - start_slot: Slot::from(0), - duration: 200, - authorities: vec![(Sr25519Keyring::Alice.public().into(), 1)], - randomness: [0u8; 32], - config: BabeEpochConfiguration { - c: (1, 4), - allowed_slots: AllowedSlots::PrimarySlots, - }, - })); - } - ); + assert_matches!( + handle.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request( + req_block_hash, + RuntimeApiRequest::SessionInfo(idx, si_tx), + ) + ) => { + assert_eq!(session, idx); + assert_eq!(req_block_hash, hash); + si_tx.send(Ok(Some(session_info.clone()))).unwrap(); + } + ); - assert_matches!( - handle.recv().await, - AllMessages::RuntimeApi( - RuntimeApiMessage::Request( - req_block_hash, - RuntimeApiRequest::SessionInfo(idx, si_tx), - ) - ) => { - assert_eq!(session, idx); - assert_eq!(req_block_hash, hash); - si_tx.send(Ok(Some(session_info.clone()))).unwrap(); - } - ); + assert_matches!( + handle.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request( + req_block_hash, + RuntimeApiRequest::SessionExecutorParams(idx, si_tx), + ) + ) => { + assert_eq!(session, idx); + assert_eq!(req_block_hash, hash); + si_tx.send(Ok(Some(ExecutorParams::default()))).unwrap(); + } + ); - assert_matches!( - handle.recv().await, - AllMessages::RuntimeApi( - RuntimeApiMessage::Request( - req_block_hash, - RuntimeApiRequest::SessionExecutorParams(idx, si_tx), - ) - ) => { - assert_eq!(session, idx); - assert_eq!(req_block_hash, hash); - si_tx.send(Ok(Some(ExecutorParams::default()))).unwrap(); - } - ); - }); + assert_matches!( + handle.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(_, RuntimeApiRequest::NodeFeatures(_, si_tx), ) + ) => { + si_tx.send(Ok(NodeFeatures::repeat(enable_v2, FeatureIndex::EnableAssignmentsV2 as usize + 1))).unwrap(); + } + ); + }); - futures::executor::block_on(futures::future::join(test_fut, aux_fut)); + futures::executor::block_on(futures::future::join(test_fut, aux_fut)); + } } #[test] @@ -906,7 +934,7 @@ pub(crate) mod tests { Box::pin(async move { let env = ImportedBlockInfoEnv { runtime_info: &mut runtime_info, - assignment_criteria: &MockAssignmentCriteria, + assignment_criteria: &MockAssignmentCriteria::default(), keystore: &LocalKeystore::in_memory(), }; @@ -987,6 +1015,15 @@ pub(crate) mod tests { si_tx.send(Ok(Some(ExecutorParams::default()))).unwrap(); } ); + + assert_matches!( + handle.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(_, RuntimeApiRequest::NodeFeatures(_, si_tx), ) + ) => { + si_tx.send(Ok(NodeFeatures::EMPTY)).unwrap(); + } + ); }); futures::executor::block_on(futures::future::join(test_fut, aux_fut)); @@ -1036,7 +1073,7 @@ pub(crate) mod tests { Box::pin(async move { let env = ImportedBlockInfoEnv { runtime_info: &mut runtime_info, - assignment_criteria: &MockAssignmentCriteria, + assignment_criteria: &MockAssignmentCriteria::default(), keystore: &LocalKeystore::in_memory(), }; @@ -1134,7 +1171,7 @@ pub(crate) mod tests { Box::pin(async move { let env = ImportedBlockInfoEnv { runtime_info: &mut runtime_info, - assignment_criteria: &MockAssignmentCriteria, + assignment_criteria: &MockAssignmentCriteria::default(), keystore: &LocalKeystore::in_memory(), }; @@ -1221,6 +1258,15 @@ pub(crate) mod tests { si_tx.send(Ok(Some(ExecutorParams::default()))).unwrap(); } ); + + assert_matches!( + handle.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(_, RuntimeApiRequest::NodeFeatures(_, si_tx), ) + ) => { + si_tx.send(Ok(NodeFeatures::EMPTY)).unwrap(); + } + ); }); futures::executor::block_on(futures::future::join(test_fut, aux_fut)); @@ -1438,6 +1484,15 @@ pub(crate) mod tests { } ); + assert_matches!( + handle.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(_, RuntimeApiRequest::NodeFeatures(_, si_tx), ) + ) => { + si_tx.send(Ok(NodeFeatures::EMPTY)).unwrap(); + } + ); + assert_matches!( handle.recv().await, AllMessages::ApprovalDistribution(ApprovalDistributionMessage::NewBlocks( diff --git a/polkadot/node/core/approval-voting/src/tests.rs b/polkadot/node/core/approval-voting/src/tests.rs index e1ec194cb54..cdfc170cd2b 100644 --- a/polkadot/node/core/approval-voting/src/tests.rs +++ b/polkadot/node/core/approval-voting/src/tests.rs @@ -37,8 +37,8 @@ use polkadot_node_subsystem_test_helpers as test_helpers; use polkadot_node_subsystem_util::TimeoutExt; use polkadot_overseer::HeadSupportsParachains; use polkadot_primitives::{ - CandidateCommitments, CandidateEvent, CoreIndex, GroupIndex, Header, Id as ParaId, IndexedVec, - ValidationCode, ValidatorSignature, + vstaging::NodeFeatures, CandidateCommitments, CandidateEvent, CoreIndex, GroupIndex, Header, + Id as ParaId, IndexedVec, ValidationCode, ValidatorSignature, }; use std::time::Duration; @@ -243,6 +243,7 @@ where polkadot_primitives::CoreIndex, polkadot_primitives::GroupIndex, )>, + _enable_assignments_v2: bool, ) -> HashMap { self.0() } @@ -1003,6 +1004,15 @@ async fn import_block( si_tx.send(Ok(Some(ExecutorParams::default()))).unwrap(); } ); + + assert_matches!( + overseer_recv(overseer).await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(_, RuntimeApiRequest::NodeFeatures(_, si_tx), ) + ) => { + si_tx.send(Ok(NodeFeatures::EMPTY)).unwrap(); + } + ); } assert_matches!( diff --git a/polkadot/node/core/dispute-coordinator/src/tests.rs b/polkadot/node/core/dispute-coordinator/src/tests.rs index 9254c2a851c..6912bbf67e1 100644 --- a/polkadot/node/core/dispute-coordinator/src/tests.rs +++ b/polkadot/node/core/dispute-coordinator/src/tests.rs @@ -61,10 +61,11 @@ use polkadot_node_subsystem_test_helpers::{ make_buffered_subsystem_context, mock::new_leaf, TestSubsystemContextHandle, }; use polkadot_primitives::{ - ApprovalVote, BlockNumber, CandidateCommitments, CandidateEvent, CandidateHash, - CandidateReceipt, CoreIndex, DisputeStatement, ExecutorParams, GroupIndex, Hash, HeadData, - Header, IndexedVec, MultiDisputeStatementSet, ScrapedOnChainVotes, SessionIndex, SessionInfo, - SigningContext, ValidDisputeStatementKind, ValidatorId, ValidatorIndex, ValidatorSignature, + vstaging::NodeFeatures, ApprovalVote, BlockNumber, CandidateCommitments, CandidateEvent, + CandidateHash, CandidateReceipt, CoreIndex, DisputeStatement, ExecutorParams, GroupIndex, Hash, + HeadData, Header, IndexedVec, MultiDisputeStatementSet, ScrapedOnChainVotes, SessionIndex, + SessionInfo, SigningContext, ValidDisputeStatementKind, ValidatorId, ValidatorIndex, + ValidatorSignature, }; use crate::{ @@ -352,6 +353,15 @@ impl TestState { let _ = tx.send(Ok(Some(ExecutorParams::default()))); } ); + + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(_, RuntimeApiRequest::NodeFeatures(_, si_tx), ) + ) => { + si_tx.send(Ok(NodeFeatures::EMPTY)).unwrap(); + } + ); } } @@ -3492,6 +3502,14 @@ fn session_info_is_requested_only_once() { let _ = tx.send(Ok(Some(ExecutorParams::default()))); } ); + assert_matches!( + virtual_overseer.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(_, RuntimeApiRequest::NodeFeatures(_, si_tx), ) + ) => { + si_tx.send(Ok(NodeFeatures::EMPTY)).unwrap(); + } + ); test_state }) }); @@ -3552,6 +3570,15 @@ fn session_info_big_jump_works() { let _ = tx.send(Ok(Some(ExecutorParams::default()))); } ); + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(_, RuntimeApiRequest::NodeFeatures(_, si_tx), ) + ) => { + si_tx.send(Ok(NodeFeatures::EMPTY)).unwrap(); + } + ); } test_state }) @@ -3612,6 +3639,14 @@ fn session_info_small_jump_works() { let _ = tx.send(Ok(Some(ExecutorParams::default()))); } ); + assert_matches!( + virtual_overseer.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(_, RuntimeApiRequest::NodeFeatures(_, si_tx), ) + ) => { + si_tx.send(Ok(NodeFeatures::EMPTY)).unwrap(); + } + ); } test_state }) diff --git a/polkadot/node/network/availability-distribution/src/pov_requester/mod.rs b/polkadot/node/network/availability-distribution/src/pov_requester/mod.rs index 12a97a1fb5a..6f9ef9f6a9f 100644 --- a/polkadot/node/network/availability-distribution/src/pov_requester/mod.rs +++ b/polkadot/node/network/availability-distribution/src/pov_requester/mod.rs @@ -146,7 +146,9 @@ mod tests { AllMessages, AvailabilityDistributionMessage, RuntimeApiMessage, RuntimeApiRequest, }; use polkadot_node_subsystem_test_helpers as test_helpers; - use polkadot_primitives::{CandidateHash, ExecutorParams, Hash, ValidatorIndex}; + use polkadot_primitives::{ + vstaging::NodeFeatures, CandidateHash, ExecutorParams, Hash, ValidatorIndex, + }; use test_helpers::mock::make_ferdie_keystore; use super::*; @@ -214,6 +216,12 @@ mod tests { )) => { tx.send(Ok(Some(ExecutorParams::default()))).unwrap(); }, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + _, + RuntimeApiRequest::NodeFeatures(_, si_tx), + )) => { + si_tx.send(Ok(NodeFeatures::EMPTY)).unwrap(); + }, AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::SendRequests( mut reqs, _, diff --git a/polkadot/node/network/availability-distribution/src/requester/tests.rs b/polkadot/node/network/availability-distribution/src/requester/tests.rs index c4252b4e439..2f5d900b037 100644 --- a/polkadot/node/network/availability-distribution/src/requester/tests.rs +++ b/polkadot/node/network/availability-distribution/src/requester/tests.rs @@ -25,8 +25,8 @@ use polkadot_node_primitives::{BlockData, ErasureChunk, PoV}; use polkadot_node_subsystem_test_helpers::mock::new_leaf; use polkadot_node_subsystem_util::runtime::RuntimeInfo; use polkadot_primitives::{ - BlockNumber, CoreState, ExecutorParams, GroupIndex, Hash, Id as ParaId, ScheduledCore, - SessionIndex, SessionInfo, + vstaging::NodeFeatures, BlockNumber, CoreState, ExecutorParams, GroupIndex, Hash, Id as ParaId, + ScheduledCore, SessionIndex, SessionInfo, }; use sp_core::traits::SpawnNamed; @@ -125,6 +125,10 @@ fn spawn_virtual_overseer( tx.send(Ok(Some(ExecutorParams::default()))) .expect("Receiver should be alive."); }, + RuntimeApiRequest::NodeFeatures(_, tx) => { + tx.send(Ok(NodeFeatures::EMPTY)) + .expect("Receiver should be alive."); + }, RuntimeApiRequest::AvailabilityCores(tx) => { let para_id = ParaId::from(1_u32); let maybe_block_position = diff --git a/polkadot/node/network/availability-distribution/src/tests/state.rs b/polkadot/node/network/availability-distribution/src/tests/state.rs index 101d917c0db..e95c1c3a27c 100644 --- a/polkadot/node/network/availability-distribution/src/tests/state.rs +++ b/polkadot/node/network/availability-distribution/src/tests/state.rs @@ -46,8 +46,8 @@ use polkadot_node_subsystem::{ }; use polkadot_node_subsystem_test_helpers as test_helpers; use polkadot_primitives::{ - CandidateHash, CoreState, ExecutorParams, GroupIndex, Hash, Id as ParaId, ScheduledCore, - SessionInfo, ValidatorIndex, + vstaging::NodeFeatures, CandidateHash, CoreState, ExecutorParams, GroupIndex, Hash, + Id as ParaId, ScheduledCore, SessionInfo, ValidatorIndex, }; use test_helpers::mock::{make_ferdie_keystore, new_leaf}; @@ -264,6 +264,9 @@ impl TestState { tx.send(Ok(Some(ExecutorParams::default()))) .expect("Receiver should be alive."); }, + RuntimeApiRequest::NodeFeatures(_, si_tx) => { + si_tx.send(Ok(NodeFeatures::EMPTY)).expect("Receiver should be alive."); + }, RuntimeApiRequest::AvailabilityCores(tx) => { gum::trace!(target: LOG_TARGET, cores= ?self.cores[&hash], hash = ?hash, "Sending out cores for hash"); tx.send(Ok(self.cores[&hash].clone())) diff --git a/polkadot/node/network/collator-protocol/src/collator_side/tests/mod.rs b/polkadot/node/network/collator-protocol/src/collator_side/tests/mod.rs index 7dd2287dab6..1b1194c7270 100644 --- a/polkadot/node/network/collator-protocol/src/collator_side/tests/mod.rs +++ b/polkadot/node/network/collator-protocol/src/collator_side/tests/mod.rs @@ -45,8 +45,9 @@ use polkadot_node_subsystem::{ use polkadot_node_subsystem_test_helpers as test_helpers; use polkadot_node_subsystem_util::{reputation::add_reputation, TimeoutExt}; use polkadot_primitives::{ - AuthorityDiscoveryId, CollatorPair, ExecutorParams, GroupIndex, GroupRotationInfo, IndexedVec, - ScheduledCore, SessionIndex, SessionInfo, ValidatorId, ValidatorIndex, + vstaging::NodeFeatures, AuthorityDiscoveryId, CollatorPair, ExecutorParams, GroupIndex, + GroupRotationInfo, IndexedVec, ScheduledCore, SessionIndex, SessionInfo, ValidatorId, + ValidatorIndex, }; use polkadot_primitives_test_helpers::TestCandidateBuilder; use test_helpers::mock::new_leaf; @@ -406,7 +407,12 @@ async fn distribute_collation_with_receipt( tx.send(Ok(Some(ExecutorParams::default()))).unwrap(); }, - + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + _, + RuntimeApiRequest::NodeFeatures(_, si_tx), + )) => { + si_tx.send(Ok(NodeFeatures::EMPTY)).unwrap(); + }, AllMessages::RuntimeApi(RuntimeApiMessage::Request( _relay_parent, RuntimeApiRequest::ValidatorGroups(tx), diff --git a/polkadot/node/network/dispute-distribution/src/tests/mod.rs b/polkadot/node/network/dispute-distribution/src/tests/mod.rs index 96f045cbf76..a3520bf35f8 100644 --- a/polkadot/node/network/dispute-distribution/src/tests/mod.rs +++ b/polkadot/node/network/dispute-distribution/src/tests/mod.rs @@ -57,8 +57,8 @@ use polkadot_node_subsystem_test_helpers::{ subsystem_test_harness, TestSubsystemContextHandle, }; use polkadot_primitives::{ - AuthorityDiscoveryId, CandidateHash, CandidateReceipt, ExecutorParams, Hash, SessionIndex, - SessionInfo, + vstaging::NodeFeatures, AuthorityDiscoveryId, CandidateHash, CandidateReceipt, ExecutorParams, + Hash, SessionIndex, SessionInfo, }; use self::mock::{ @@ -646,6 +646,16 @@ async fn nested_network_dispute_request<'a, F, O>( }, unexpected => panic!("Unexpected message {:?}", unexpected), } + + match handle.recv().await { + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + _, + RuntimeApiRequest::NodeFeatures(_, si_tx), + )) => { + si_tx.send(Ok(NodeFeatures::EMPTY)).unwrap(); + }, + unexpected => panic!("Unexpected message {:?}", unexpected), + } } // Import should get initiated: @@ -773,6 +783,14 @@ async fn activate_leaf( tx.send(Ok(Some(ExecutorParams::default()))).expect("Receiver should stay alive."); } ); + assert_matches!( + handle.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(_, RuntimeApiRequest::NodeFeatures(_, si_tx), ) + ) => { + si_tx.send(Ok(NodeFeatures::EMPTY)).unwrap(); + } + ); } assert_matches!( diff --git a/polkadot/node/network/statement-distribution/src/legacy_v1/tests.rs b/polkadot/node/network/statement-distribution/src/legacy_v1/tests.rs index ca3038f9b3f..8ac9895ec5a 100644 --- a/polkadot/node/network/statement-distribution/src/legacy_v1/tests.rs +++ b/polkadot/node/network/statement-distribution/src/legacy_v1/tests.rs @@ -43,8 +43,8 @@ use polkadot_node_subsystem::{ }; use polkadot_node_subsystem_test_helpers::mock::{make_ferdie_keystore, new_leaf}; use polkadot_primitives::{ - ExecutorParams, GroupIndex, Hash, HeadData, Id as ParaId, IndexedVec, SessionInfo, - ValidationCode, + vstaging::NodeFeatures, ExecutorParams, GroupIndex, Hash, HeadData, Id as ParaId, IndexedVec, + SessionInfo, ValidationCode, }; use polkadot_primitives_test_helpers::{ dummy_committed_candidate_receipt, dummy_hash, AlwaysZeroRng, @@ -834,6 +834,15 @@ fn receiving_from_one_sends_to_another_and_to_candidate_backing() { } ); + assert_matches!( + handle.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(_, RuntimeApiRequest::NodeFeatures(_, si_tx), ) + ) => { + si_tx.send(Ok(NodeFeatures::EMPTY)).unwrap(); + } + ); + // notify of peers and view handle .send(FromOrchestra::Communication { @@ -1074,6 +1083,15 @@ fn receiving_large_statement_from_one_sends_to_another_and_to_candidate_backing( } ); + assert_matches!( + handle.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(_, RuntimeApiRequest::NodeFeatures(_, si_tx), ) + ) => { + si_tx.send(Ok(NodeFeatures::EMPTY)).unwrap(); + } + ); + // notify of peers and view handle .send(FromOrchestra::Communication { @@ -1604,6 +1622,15 @@ fn delay_reputation_changes() { } ); + assert_matches!( + handle.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(_, RuntimeApiRequest::NodeFeatures(_, si_tx), ) + ) => { + si_tx.send(Ok(NodeFeatures::EMPTY)).unwrap(); + } + ); + // notify of peers and view handle .send(FromOrchestra::Communication { @@ -2084,6 +2111,15 @@ fn share_prioritizes_backing_group() { } ); + assert_matches!( + handle.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(_, RuntimeApiRequest::NodeFeatures(_, si_tx), ) + ) => { + si_tx.send(Ok(NodeFeatures::EMPTY)).unwrap(); + } + ); + // notify of dummy peers and view for (peer, pair) in dummy_peers.clone().into_iter().zip(dummy_pairs) { handle @@ -2406,6 +2442,15 @@ fn peer_cant_flood_with_large_statements() { } ); + assert_matches!( + handle.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(_, RuntimeApiRequest::NodeFeatures(_, si_tx), ) + ) => { + si_tx.send(Ok(NodeFeatures::EMPTY)).unwrap(); + } + ); + // notify of peers and view handle .send(FromOrchestra::Communication { @@ -2631,6 +2676,14 @@ fn handle_multiple_seconded_statements() { } ); + assert_matches!( + handle.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(_, RuntimeApiRequest::NodeFeatures(_, si_tx), ) + ) => { + si_tx.send(Ok(NodeFeatures::EMPTY)).unwrap(); + } + ); // notify of peers and view for peer in all_peers.iter() { handle diff --git a/polkadot/node/subsystem-util/src/runtime/mod.rs b/polkadot/node/subsystem-util/src/runtime/mod.rs index aada7a5d77a..0e44423b4e3 100644 --- a/polkadot/node/subsystem-util/src/runtime/mod.rs +++ b/polkadot/node/subsystem-util/src/runtime/mod.rs @@ -30,10 +30,12 @@ use polkadot_node_subsystem::{ }; use polkadot_node_subsystem_types::UnpinHandle; use polkadot_primitives::{ - slashing, vstaging::NodeFeatures, AsyncBackingParams, CandidateEvent, CandidateHash, CoreState, - EncodeAs, ExecutorParams, GroupIndex, GroupRotationInfo, Hash, IndexedVec, OccupiedCore, - ScrapedOnChainVotes, SessionIndex, SessionInfo, Signed, SigningContext, UncheckedSigned, - ValidationCode, ValidationCodeHash, ValidatorId, ValidatorIndex, LEGACY_MIN_BACKING_VOTES, + slashing, + vstaging::{node_features::FeatureIndex, NodeFeatures}, + AsyncBackingParams, CandidateEvent, CandidateHash, CoreState, EncodeAs, ExecutorParams, + GroupIndex, GroupRotationInfo, Hash, IndexedVec, OccupiedCore, ScrapedOnChainVotes, + SessionIndex, SessionInfo, Signed, SigningContext, UncheckedSigned, ValidationCode, + ValidationCodeHash, ValidatorId, ValidatorIndex, LEGACY_MIN_BACKING_VOTES, }; use crate::{ @@ -92,6 +94,8 @@ pub struct ExtendedSessionInfo { pub validator_info: ValidatorInfo, /// Session executor parameters pub executor_params: ExecutorParams, + /// Node features + pub node_features: NodeFeatures, } /// Information about ourselves, in case we are an `Authority`. @@ -202,7 +206,20 @@ impl RuntimeInfo { let validator_info = self.get_validator_info(&session_info)?; - let full_info = ExtendedSessionInfo { session_info, validator_info, executor_params }; + let node_features = request_node_features(parent, session_index, sender) + .await? + .unwrap_or(NodeFeatures::EMPTY); + let last_set_index = node_features.iter_ones().last().unwrap_or_default(); + if last_set_index >= FeatureIndex::FirstUnassigned as usize { + gum::warn!(target: LOG_TARGET, "Runtime requires feature bit {} that node doesn't support, please upgrade node version", last_set_index); + } + + let full_info = ExtendedSessionInfo { + session_info, + validator_info, + executor_params, + node_features, + }; self.session_info_cache.insert(session_index, full_info); } diff --git a/polkadot/primitives/src/vstaging/mod.rs b/polkadot/primitives/src/vstaging/mod.rs index 083e0f42d56..1639dc15e21 100644 --- a/polkadot/primitives/src/vstaging/mod.rs +++ b/polkadot/primitives/src/vstaging/mod.rs @@ -22,3 +22,19 @@ use bitvec::vec::BitVec; /// Bit indices in the `HostConfiguration.node_features` that correspond to different node features. pub type NodeFeatures = BitVec; + +/// Module containing feature-specific bit indices into the `NodeFeatures` bitvec. +pub mod node_features { + /// A feature index used to indentify a bit into the node_features array stored + /// in the HostConfiguration. + #[repr(u8)] + pub enum FeatureIndex { + /// Tells if tranch0 assignments could be sent in a single certificate. + /// Reserved for: `` + EnableAssignmentsV2 = 0, + /// First unassigned feature bit. + /// Every time a new feature flag is assigned it should take this value. + /// and this should be incremented. + FirstUnassigned = 1, + } +} -- GitLab From 1e878780a54791c627bf6eae210b77e1bd5f098f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Dec 2023 11:49:28 +0100 Subject: [PATCH 003/191] Bump num-traits from 0.2.16 to 0.2.17 (#2674) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [num-traits](https://github.com/rust-num/num-traits) from 0.2.16 to 0.2.17.
Changelog

Sourced from num-traits's changelog.

Release 0.2.17 (2023-10-07)

Contributors: @​robamu

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=num-traits&package-manager=cargo&previous-version=0.2.16&new-version=0.2.17)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 10 +++++----- substrate/client/consensus/babe/Cargo.toml | 2 +- substrate/primitives/arithmetic/Cargo.toml | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 11e4de35e45..baaa561bb80 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1361,8 +1361,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93f2635620bf0b9d4576eb7bb9a38a55df78bd1205d26fa994b25911a69f212f" dependencies = [ "bitcoin_hashes", - "rand 0.7.3", - "rand_core 0.5.1", + "rand 0.8.5", + "rand_core 0.6.4", "serde", "unicode-normalization", ] @@ -8797,9 +8797,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" dependencies = [ "autocfg", "libm", @@ -19951,7 +19951,7 @@ checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" dependencies = [ "cfg-if", "digest 0.10.7", - "rand 0.7.3", + "rand 0.8.5", "static_assertions", ] diff --git a/substrate/client/consensus/babe/Cargo.toml b/substrate/client/consensus/babe/Cargo.toml index c8cff0981b3..6008a5a99f8 100644 --- a/substrate/client/consensus/babe/Cargo.toml +++ b/substrate/client/consensus/babe/Cargo.toml @@ -20,7 +20,7 @@ futures = "0.3.21" log = "0.4.17" num-bigint = "0.4.3" num-rational = "0.4.1" -num-traits = "0.2.8" +num-traits = "0.2.17" parking_lot = "0.12.1" thiserror = "1.0" fork-tree = { path = "../../../utils/fork-tree" } diff --git a/substrate/primitives/arithmetic/Cargo.toml b/substrate/primitives/arithmetic/Cargo.toml index 8634dabe854..ecd3d9585bc 100644 --- a/substrate/primitives/arithmetic/Cargo.toml +++ b/substrate/primitives/arithmetic/Cargo.toml @@ -19,7 +19,7 @@ codec = { package = "parity-scale-codec", version = "3.6.1", default-features = "max-encoded-len", ] } integer-sqrt = "0.1.2" -num-traits = { version = "0.2.8", default-features = false } +num-traits = { version = "0.2.17", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } serde = { version = "1.0.193", default-features = false, features = ["alloc", "derive"], optional = true } static_assertions = "1.1.0" -- GitLab From f6548aee31153df576d31820d23bbefca2a5eee4 Mon Sep 17 00:00:00 2001 From: Michal Kucharczyk <1728078+michalkucharczyk@users.noreply.github.com> Date: Mon, 11 Dec 2023 15:21:20 +0100 Subject: [PATCH 004/191] `keyring`: remove `lazy_static` public keys hash maps (#2387) The `lazy_static` package does not work well in `no-std`: it requires `spin_no_std` feature, which also will propagate into `std` if enabled. This is not what we want. This PR removes public/private key hash-maps and replaces them with simple static byte arrays. `&T` versions of `AsRef/Deref/From` traits implementation were removed. Little const helper for converting hex strings into array during compile time was also added. (somewhat similar to _hex_literal_). --------- Co-authored-by: command-bot <> Co-authored-by: Koute --- Cargo.lock | 1 - .../primitives/core/src/const_hex2array.rs | 162 ++++++++++++++++++ substrate/primitives/core/src/lib.rs | 1 + substrate/primitives/keyring/Cargo.toml | 1 - .../primitives/keyring/src/bandersnatch.rs | 69 +++----- substrate/primitives/keyring/src/ed25519.rs | 78 ++++----- substrate/primitives/keyring/src/sr25519.rs | 76 ++++---- 7 files changed, 266 insertions(+), 122 deletions(-) create mode 100644 substrate/primitives/core/src/const_hex2array.rs diff --git a/Cargo.lock b/Cargo.lock index baaa561bb80..a55223b4bcd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17687,7 +17687,6 @@ dependencies = [ name = "sp-keyring" version = "24.0.0" dependencies = [ - "lazy_static", "sp-core", "sp-runtime", "strum", diff --git a/substrate/primitives/core/src/const_hex2array.rs b/substrate/primitives/core/src/const_hex2array.rs new file mode 100644 index 00000000000..cd6071028e6 --- /dev/null +++ b/substrate/primitives/core/src/const_hex2array.rs @@ -0,0 +1,162 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Provides a const function for converting a hex string to a `u8` array at compile time, when used +//! in the proper context. + +/// Provides a const array from given string literal. +/// +/// Valid characters are `[0-9a-fA-F]`, and the hex string should not start +/// with the `0x` prefix. +#[macro_export] +macro_rules! hex2array { + ($input:expr) => {{ + const BYTES: [u8; $input.len() / 2] = $crate::const_hex2array::private_hex2array($input); + BYTES + }}; +} + +/// Generates array from (static) string literal. +/// +/// Valid characters are `[0-9a-fA-F]`, and the hex string should not start +/// with the `0x` prefix. +/// +/// # Panics +/// +/// The function will panic at compile time when used in a const context if: +/// - The given hex string has an invalid length. +/// - It contains invalid characters. +/// +/// The function will panic at runtime when used in a non-const context if the above conditions are +/// met. +#[doc(hidden)] +pub const fn private_hex2array(hex: &str) -> [u8; N] { + const fn c2b(c: u8) -> u8 { + match c as char { + '0'..='9' => c - b'0', + 'a'..='f' => c - (b'a' - 10), + 'A'..='F' => c - (b'A' - 10), + _ => panic!("hex string contains invalid character"), + } + } + let mut output = [0; N]; + let mut i = 0; + if hex.len() != 2 * N { + panic!("hex string length is not valid"); + } + while i < N { + output[i] = 16 * c2b(hex.as_bytes()[2 * i]) + c2b(hex.as_bytes()[2 * i + 1]); + i += 1; + } + output +} + +#[cfg(test)] +mod testh2b { + use super::private_hex2array; + + #[test] + fn t00() { + const T0: [u8; 0] = private_hex2array(""); + const EMPTY: [u8; 0] = []; + assert_eq!(T0, EMPTY); + } + + macro_rules! test_byte { + ($a:expr, $b:expr) => {{ + const X: [u8; 1] = private_hex2array($a); + assert_eq!(X, [$b]); + }}; + } + + #[test] + fn t01() { + test_byte!("00", 0); + test_byte!("01", 1); + test_byte!("02", 2); + test_byte!("03", 3); + test_byte!("04", 4); + test_byte!("05", 5); + test_byte!("06", 6); + test_byte!("07", 7); + test_byte!("08", 8); + test_byte!("09", 9); + test_byte!("0a", 10); + test_byte!("0A", 10); + test_byte!("0b", 11); + test_byte!("0B", 11); + test_byte!("0c", 12); + test_byte!("0C", 12); + test_byte!("0d", 13); + test_byte!("0D", 13); + test_byte!("0e", 14); + test_byte!("0E", 14); + test_byte!("0f", 15); + test_byte!("0F", 15); + } + + #[test] + fn t02() { + const T0: [u8; 2] = private_hex2array("0a10"); + assert_eq!(T0, [10, 16]); + const T1: [u8; 2] = private_hex2array("4545"); + assert_eq!(T1, [69, 69]); + } + + #[test] + fn t02m() { + assert_eq!(hex2array!("0a10"), [10, 16]); + assert_eq!(hex2array!("4545"), [69, 69]); + assert_eq!( + hex2array!("000102030405060708090a0b0c0d0e0f"), + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] + ); + } + + #[test] + fn t16() { + const T16: [u8; 16] = private_hex2array("000102030405060708090a0b0c0d0e0f"); + + assert_eq!(T16, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]); + } + + #[test] + fn t33() { + const T33: [u8; 33] = + private_hex2array("9c8af77d3a4e3f6f076853922985b9e6724fc9675329087f47aff1ceaaae772180"); + + assert_eq!( + T33, + [ + 156, 138, 247, 125, 58, 78, 63, 111, 7, 104, 83, 146, 41, 133, 185, 230, 114, 79, + 201, 103, 83, 41, 8, 127, 71, 175, 241, 206, 170, 174, 119, 33, 128 + ] + ); + } + + #[test] + #[should_panic = "hex string length is not valid"] + fn t_panic_incorrect_length2() { + let _ = private_hex2array::<2>("454"); + } + + #[test] + #[should_panic = "hex string contains invalid character"] + fn t_panic_invalid_character() { + let _ = private_hex2array::<2>("45ag"); + } +} diff --git a/substrate/primitives/core/src/lib.rs b/substrate/primitives/core/src/lib.rs index 4873d1a2112..c7232563cb7 100644 --- a/substrate/primitives/core/src/lib.rs +++ b/substrate/primitives/core/src/lib.rs @@ -51,6 +51,7 @@ pub mod hashing; #[cfg(feature = "full_crypto")] pub use hashing::{blake2_128, blake2_256, keccak_256, twox_128, twox_256, twox_64}; +pub mod const_hex2array; pub mod crypto; pub mod hexdisplay; pub use paste; diff --git a/substrate/primitives/keyring/Cargo.toml b/substrate/primitives/keyring/Cargo.toml index a504cda756e..5b58a4f97ca 100644 --- a/substrate/primitives/keyring/Cargo.toml +++ b/substrate/primitives/keyring/Cargo.toml @@ -14,7 +14,6 @@ readme = "README.md" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -lazy_static = "1.4.0" strum = { version = "0.24.1", features = ["derive"], default-features = false } sp-core = { path = "../core" } sp-runtime = { path = "../runtime" } diff --git a/substrate/primitives/keyring/src/bandersnatch.rs b/substrate/primitives/keyring/src/bandersnatch.rs index 8de6786a6fb..eb60f856327 100644 --- a/substrate/primitives/keyring/src/bandersnatch.rs +++ b/substrate/primitives/keyring/src/bandersnatch.rs @@ -21,12 +21,9 @@ pub use sp_core::bandersnatch; use sp_core::{ bandersnatch::{Pair, Public, Signature}, crypto::UncheckedFrom, - ByteArray, Pair as PairT, + hex2array, ByteArray, Pair as PairT, }; -use lazy_static::lazy_static; -use std::{collections::HashMap, ops::Deref, sync::Mutex}; - /// Set of test accounts. #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, strum::Display, strum::EnumIter)] pub enum Keyring { @@ -74,7 +71,7 @@ impl Keyring { } pub fn public(self) -> Public { - self.pair().public() + Public::from(self) } pub fn to_seed(self) -> String { @@ -129,20 +126,9 @@ impl std::str::FromStr for Keyring { } } -lazy_static! { - static ref PRIVATE_KEYS: Mutex> = - Mutex::new(Keyring::iter().map(|who| (who, who.pair())).collect()); - static ref PUBLIC_KEYS: HashMap = PRIVATE_KEYS - .lock() - .unwrap() - .iter() - .map(|(&who, pair)| (who, pair.public())) - .collect(); -} - impl From for Public { fn from(k: Keyring) -> Self { - *(*PUBLIC_KEYS).get(&k).unwrap() + Public::unchecked_from(<[u8; PUBLIC_RAW_LEN]>::from(k)) } } @@ -154,32 +140,24 @@ impl From for Pair { impl From for [u8; PUBLIC_RAW_LEN] { fn from(k: Keyring) -> Self { - *(*PUBLIC_KEYS).get(&k).unwrap().as_ref() - } -} - -impl From for &'static [u8; PUBLIC_RAW_LEN] { - fn from(k: Keyring) -> Self { - PUBLIC_KEYS.get(&k).unwrap().as_ref() - } -} - -impl AsRef<[u8; PUBLIC_RAW_LEN]> for Keyring { - fn as_ref(&self) -> &[u8; PUBLIC_RAW_LEN] { - PUBLIC_KEYS.get(self).unwrap().as_ref() - } -} - -impl AsRef for Keyring { - fn as_ref(&self) -> &Public { - PUBLIC_KEYS.get(self).unwrap() - } -} - -impl Deref for Keyring { - type Target = [u8; PUBLIC_RAW_LEN]; - fn deref(&self) -> &[u8; PUBLIC_RAW_LEN] { - PUBLIC_KEYS.get(self).unwrap().as_ref() + match k { + Keyring::Alice => + hex2array!("9c8af77d3a4e3f6f076853922985b9e6724fc9675329087f47aff1ceaaae772180"), + Keyring::Bob => + hex2array!("1abfbb76dc8374a1a6d93d59a5c81f07c18835f4681a6258aa0f514d363bff4780"), + Keyring::Charlie => + hex2array!("0f4a9990aca3d39a7cd8bf187e2e81a9ea6f9cedb2db405f2fffff384c5dd02680"), + Keyring::Dave => + hex2array!("bd7a87d4dfa89926a408b5acbed554ae3b053fa3532531053295cbabf07d337000"), + Keyring::Eve => + hex2array!("f992d5b8eac8fc004d521bee6edc1174cfa7fae3a1baec8262511ee351f9f85e00"), + Keyring::Ferdie => + hex2array!("1ce2613e89bc5c8e358aad884099cfb576a61176f2f9968cd0d486a04457245180"), + Keyring::One => + hex2array!("a29e03ac273e521274d8e501a6242abd2ab393d7e197221a9113bdf8e2e5b34d00"), + Keyring::Two => + hex2array!("f968d47e819ddb18a9d0f2ebd16501680b1a3f07ee375c6f81310e5f99a04f4d00"), + } } } @@ -206,4 +184,9 @@ mod tests { &Keyring::Bob.public(), )); } + #[test] + fn verify_static_public_keys() { + assert!(Keyring::iter() + .all(|k| { k.pair().public().as_ref() == <[u8; PUBLIC_RAW_LEN]>::from(k) })); + } } diff --git a/substrate/primitives/keyring/src/ed25519.rs b/substrate/primitives/keyring/src/ed25519.rs index 3060bfb1ad9..ade42b29494 100644 --- a/substrate/primitives/keyring/src/ed25519.rs +++ b/substrate/primitives/keyring/src/ed25519.rs @@ -17,14 +17,12 @@ //! Support code for the runtime. A set of test accounts. -use lazy_static::lazy_static; pub use sp_core::ed25519; use sp_core::{ ed25519::{Pair, Public, Signature}, - ByteArray, Pair as PairT, H256, + hex2array, ByteArray, Pair as PairT, H256, }; use sp_runtime::AccountId32; -use std::{collections::HashMap, ops::Deref}; /// Set of test accounts. #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, strum::Display, strum::EnumIter)] @@ -93,7 +91,7 @@ impl Keyring { } pub fn public(self) -> Public { - self.pair().public() + Public::from(self) } pub fn to_seed(self) -> String { @@ -128,16 +126,9 @@ impl From for sp_runtime::MultiSigner { } } -lazy_static! { - static ref PRIVATE_KEYS: HashMap = - Keyring::iter().map(|i| (i, i.pair())).collect(); - static ref PUBLIC_KEYS: HashMap = - PRIVATE_KEYS.iter().map(|(&name, pair)| (name, pair.public())).collect(); -} - impl From for Public { fn from(k: Keyring) -> Self { - *(*PUBLIC_KEYS).get(&k).unwrap() + Public::from_raw(k.into()) } } @@ -155,38 +146,42 @@ impl From for Pair { impl From for [u8; 32] { fn from(k: Keyring) -> Self { - *(*PUBLIC_KEYS).get(&k).unwrap().as_array_ref() + match k { + Keyring::Alice => + hex2array!("88dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0ee"), + Keyring::Bob => + hex2array!("d17c2d7823ebf260fd138f2d7e27d114c0145d968b5ff5006125f2414fadae69"), + Keyring::Charlie => + hex2array!("439660b36c6c03afafca027b910b4fecf99801834c62a5e6006f27d978de234f"), + Keyring::Dave => + hex2array!("5e639b43e0052c47447dac87d6fd2b6ec50bdd4d0f614e4299c665249bbd09d9"), + Keyring::Eve => + hex2array!("1dfe3e22cc0d45c70779c1095f7489a8ef3cf52d62fbd8c2fa38c9f1723502b5"), + Keyring::Ferdie => + hex2array!("568cb4a574c6d178feb39c27dfc8b3f789e5f5423e19c71633c748b9acf086b5"), + Keyring::AliceStash => + hex2array!("451781cd0c5504504f69ceec484cc66e4c22a2b6a9d20fb1a426d91ad074a2a8"), + Keyring::BobStash => + hex2array!("292684abbb28def63807c5f6e84e9e8689769eb37b1ab130d79dbfbf1b9a0d44"), + Keyring::CharlieStash => + hex2array!("dd6a6118b6c11c9c9e5a4f34ed3d545e2c74190f90365c60c230fa82e9423bb9"), + Keyring::DaveStash => + hex2array!("1d0432d75331ab299065bee79cdb1bdc2497c597a3087b4d955c67e3c000c1e2"), + Keyring::EveStash => + hex2array!("c833bdd2e1a7a18acc1c11f8596e2e697bb9b42d6b6051e474091a1d43a294d7"), + Keyring::FerdieStash => + hex2array!("199d749dbf4b8135cb1f3c8fd697a390fc0679881a8a110c1d06375b3b62cd09"), + Keyring::One => + hex2array!("16f97016bbea8f7b45ae6757b49efc1080accc175d8f018f9ba719b60b0815e4"), + Keyring::Two => + hex2array!("5079bcd20fd97d7d2f752c4607012600b401950260a91821f73e692071c82bf5"), + } } } impl From for H256 { fn from(k: Keyring) -> Self { - (*PUBLIC_KEYS).get(&k).unwrap().as_array_ref().into() - } -} - -impl From for &'static [u8; 32] { - fn from(k: Keyring) -> Self { - (*PUBLIC_KEYS).get(&k).unwrap().as_array_ref() - } -} - -impl AsRef<[u8; 32]> for Keyring { - fn as_ref(&self) -> &[u8; 32] { - (*PUBLIC_KEYS).get(self).unwrap().as_array_ref() - } -} - -impl AsRef for Keyring { - fn as_ref(&self) -> &Public { - (*PUBLIC_KEYS).get(self).unwrap() - } -} - -impl Deref for Keyring { - type Target = [u8; 32]; - fn deref(&self) -> &[u8; 32] { - (*PUBLIC_KEYS).get(self).unwrap().as_array_ref() + k.into() } } @@ -213,4 +208,9 @@ mod tests { &Keyring::Bob.public(), )); } + + #[test] + fn verify_static_public_keys() { + assert!(Keyring::iter().all(|k| { k.pair().public().as_ref() == <[u8; 32]>::from(k) })); + } } diff --git a/substrate/primitives/keyring/src/sr25519.rs b/substrate/primitives/keyring/src/sr25519.rs index 914a66b4d83..1c2a2526efb 100644 --- a/substrate/primitives/keyring/src/sr25519.rs +++ b/substrate/primitives/keyring/src/sr25519.rs @@ -17,14 +17,13 @@ //! Support code for the runtime. A set of test accounts. -use lazy_static::lazy_static; pub use sp_core::sr25519; use sp_core::{ + hex2array, sr25519::{Pair, Public, Signature}, ByteArray, Pair as PairT, H256, }; use sp_runtime::AccountId32; -use std::{collections::HashMap, ops::Deref}; /// Set of test accounts. #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, strum::Display, strum::EnumIter)] @@ -93,7 +92,7 @@ impl Keyring { } pub fn public(self) -> Public { - self.pair().public() + Public::from(self) } pub fn to_seed(self) -> String { @@ -165,13 +164,6 @@ impl std::str::FromStr for Keyring { } } -lazy_static! { - static ref PRIVATE_KEYS: HashMap = - Keyring::iter().map(|i| (i, i.pair())).collect(); - static ref PUBLIC_KEYS: HashMap = - PRIVATE_KEYS.iter().map(|(&name, pair)| (name, pair.public())).collect(); -} - impl From for AccountId32 { fn from(k: Keyring) -> Self { k.to_account_id() @@ -180,7 +172,7 @@ impl From for AccountId32 { impl From for Public { fn from(k: Keyring) -> Self { - *(*PUBLIC_KEYS).get(&k).unwrap() + Public::from_raw(k.into()) } } @@ -192,38 +184,42 @@ impl From for Pair { impl From for [u8; 32] { fn from(k: Keyring) -> Self { - *(*PUBLIC_KEYS).get(&k).unwrap().as_array_ref() + match k { + Keyring::Alice => + hex2array!("d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d"), + Keyring::Bob => + hex2array!("8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48"), + Keyring::Charlie => + hex2array!("90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22"), + Keyring::Dave => + hex2array!("306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20"), + Keyring::Eve => + hex2array!("e659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e"), + Keyring::Ferdie => + hex2array!("1cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c"), + Keyring::AliceStash => + hex2array!("be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f"), + Keyring::BobStash => + hex2array!("fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e"), + Keyring::CharlieStash => + hex2array!("1e07379407fecc4b89eb7dbd287c2c781cfb1907a96947a3eb18e4f8e7198625"), + Keyring::DaveStash => + hex2array!("e860f1b1c7227f7c22602f53f15af80747814dffd839719731ee3bba6edc126c"), + Keyring::EveStash => + hex2array!("8ac59e11963af19174d0b94d5d78041c233f55d2e19324665bafdfb62925af2d"), + Keyring::FerdieStash => + hex2array!("101191192fc877c24d725b337120fa3edc63d227bbc92705db1e2cb65f56981a"), + Keyring::One => + hex2array!("ac859f8a216eeb1b320b4c76d118da3d7407fa523484d0a980126d3b4d0d220a"), + Keyring::Two => + hex2array!("1254f7017f0b8347ce7ab14f96d818802e7e9e0c0d1b7c9acb3c726b080e7a03"), + } } } impl From for H256 { fn from(k: Keyring) -> Self { - (*PUBLIC_KEYS).get(&k).unwrap().as_array_ref().into() - } -} - -impl From for &'static [u8; 32] { - fn from(k: Keyring) -> Self { - (*PUBLIC_KEYS).get(&k).unwrap().as_array_ref() - } -} - -impl AsRef<[u8; 32]> for Keyring { - fn as_ref(&self) -> &[u8; 32] { - (*PUBLIC_KEYS).get(self).unwrap().as_array_ref() - } -} - -impl AsRef for Keyring { - fn as_ref(&self) -> &Public { - (*PUBLIC_KEYS).get(self).unwrap() - } -} - -impl Deref for Keyring { - type Target = [u8; 32]; - fn deref(&self) -> &[u8; 32] { - (*PUBLIC_KEYS).get(self).unwrap().as_array_ref() + k.into() } } @@ -250,4 +246,8 @@ mod tests { &Keyring::Bob.public(), )); } + #[test] + fn verify_static_public_keys() { + assert!(Keyring::iter().all(|k| { k.pair().public().as_ref() == <[u8; 32]>::from(k) })); + } } -- GitLab From 7b416d84ff97588e00e069a7850ca33c9fe734e6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Dec 2023 17:26:09 +0100 Subject: [PATCH 005/191] Bump the known_good_semver group with 2 updates (#2675) Bumps the known_good_semver group with 2 updates: [clap](https://github.com/clap-rs/clap) and [syn](https://github.com/dtolnay/syn). Updates `clap` from 4.4.10 to 4.4.11
Release notes

Sourced from clap's releases.

v4.4.11

[4.4.11] - 2023-12-04

Features

  • Add Command::mut_group
Changelog

Sourced from clap's changelog.

[4.4.11] - 2023-12-04

Features

  • Add Command::mut_group
Commits

Updates `syn` from 2.0.39 to 2.0.40
Release notes

Sourced from syn's releases.

2.0.40

Commits
  • cf7f40a Release 2.0.40
  • 1ce8ccf Merge pull request #1538 from dtolnay/testinvisible
  • d06bff8 Add test for parsing Delimiter::None in expressions
  • 9ec66d4 Merge pull request #1545 from dtolnay/groupedlet
  • 384621a Fix None-delimited let expression in stmt position
  • 5325b6d Add test of let expr surrounded in None-delimited group
  • 0ddfc27 Merge pull request #1544 from dtolnay/nonedelimloop
  • 9c99b3f Fix stmt boundary after None-delimited group containing loop
  • 2781584 Add test of None-delimited group containing loop in match arm
  • d332928 Simplify token stream construction in Delimiter::None tests
  • Additional commits viewable in compare view

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 166 +++++++++--------- cumulus/client/cli/Cargo.toml | 2 +- .../parachain-system/proc-macro/Cargo.toml | 2 +- cumulus/parachain-template/node/Cargo.toml | 2 +- cumulus/polkadot-parachain/Cargo.toml | 2 +- cumulus/test/service/Cargo.toml | 2 +- polkadot/cli/Cargo.toml | 2 +- polkadot/node/gum/proc-macro/Cargo.toml | 2 +- polkadot/node/malus/Cargo.toml | 2 +- .../test-parachains/adder/collator/Cargo.toml | 2 +- .../undying/collator/Cargo.toml | 2 +- polkadot/utils/generate-bags/Cargo.toml | 2 +- .../remote-ext-tests/bags-list/Cargo.toml | 2 +- polkadot/xcm/procedural/Cargo.toml | 2 +- substrate/bin/minimal/node/Cargo.toml | 2 +- substrate/bin/node-template/node/Cargo.toml | 2 +- substrate/bin/node/bench/Cargo.toml | 2 +- substrate/bin/node/cli/Cargo.toml | 4 +- substrate/bin/node/inspect/Cargo.toml | 2 +- .../bin/utils/chain-spec-builder/Cargo.toml | 2 +- substrate/bin/utils/subkey/Cargo.toml | 2 +- substrate/client/chain-spec/derive/Cargo.toml | 2 +- substrate/client/cli/Cargo.toml | 2 +- substrate/client/storage-monitor/Cargo.toml | 2 +- .../client/tracing/proc-macro/Cargo.toml | 2 +- .../frame/contracts/proc-macro/Cargo.toml | 2 +- .../solution-type/Cargo.toml | 2 +- .../solution-type/fuzzer/Cargo.toml | 2 +- .../frame/staking/reward-curve/Cargo.toml | 2 +- substrate/frame/support/procedural/Cargo.toml | 2 +- .../frame/support/procedural/tools/Cargo.toml | 2 +- .../procedural/tools/derive/Cargo.toml | 2 +- .../primitives/api/proc-macro/Cargo.toml | 2 +- .../core/hashing/proc-macro/Cargo.toml | 2 +- substrate/primitives/debug-derive/Cargo.toml | 2 +- .../npos-elections/fuzzer/Cargo.toml | 2 +- .../runtime-interface/proc-macro/Cargo.toml | 2 +- .../primitives/version/proc-macro/Cargo.toml | 2 +- .../ci/node-template-release/Cargo.toml | 2 +- .../utils/frame/benchmarking-cli/Cargo.toml | 2 +- .../frame/frame-utilities-cli/Cargo.toml | 2 +- .../generate-bags/node-runtime/Cargo.toml | 2 +- .../utils/frame/try-runtime/cli/Cargo.toml | 2 +- 43 files changed, 126 insertions(+), 126 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a55223b4bcd..05e6063cff9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1158,7 +1158,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -1175,7 +1175,7 @@ checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -1351,7 +1351,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -2522,9 +2522,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.10" +version = "4.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fffed7514f420abec6d183b1d3acfd9099c79c3a10a06ade4f8203f1411272" +checksum = "bfaff671f6b22ca62406885ece523383b9b64022e341e53e009a62ebc47a45f2" dependencies = [ "clap_builder", "clap_derive 4.4.7", @@ -2532,9 +2532,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.9" +version = "4.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63361bae7eef3771745f02d8d892bec2fee5f6e34af316ba556e7f97a7069ff1" +checksum = "a216b506622bb1d316cd51328dce24e07bdff4a6128a47c7e7fad11878d5adbb" dependencies = [ "anstream", "anstyle", @@ -2549,7 +2549,7 @@ version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "586a385f7ef2f8b4d86bddaa0c094794e7ccbfe5ffef1f434fe928143fc783a5" dependencies = [ - "clap 4.4.10", + "clap 4.4.11", ] [[package]] @@ -2574,7 +2574,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -3141,7 +3141,7 @@ dependencies = [ "anes", "cast", "ciborium", - "clap 4.4.10", + "clap 4.4.11", "criterion-plot", "futures", "is-terminal", @@ -3316,7 +3316,7 @@ dependencies = [ name = "cumulus-client-cli" version = "0.1.0" dependencies = [ - "clap 4.4.10", + "clap 4.4.11", "parity-scale-codec", "sc-chain-spec", "sc-cli", @@ -3649,7 +3649,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -4037,7 +4037,7 @@ name = "cumulus-test-service" version = "0.1.0" dependencies = [ "async-trait", - "clap 4.4.10", + "clap 4.4.11", "criterion 0.5.1", "cumulus-client-cli", "cumulus-client-consensus-common", @@ -4160,7 +4160,7 @@ checksum = "83fdaf97f4804dcebfa5862639bc9ce4121e82140bec2a987ac5140294865b5b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -4200,7 +4200,7 @@ dependencies = [ "proc-macro2", "quote", "scratch", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -4217,7 +4217,7 @@ checksum = "50c49547d73ba8dcfd4ad7325d64c6d5391ff4224d498fc39a6f3f49825a530d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -4516,7 +4516,7 @@ checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -4577,7 +4577,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.39", + "syn 2.0.40", "termcolor", "toml 0.7.6", "walkdir", @@ -4833,7 +4833,7 @@ checksum = "5e9a1f9f7d83e59740248a6e14ecf93929ade55027844dfcea78beafccc15745" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -4844,7 +4844,7 @@ checksum = "c2ad8cef1d801a4686bfd8919f0b30eac4c8e48968c437a6405ded4fb5272d2b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -4999,7 +4999,7 @@ dependencies = [ "fs-err", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -5320,7 +5320,7 @@ dependencies = [ "Inflector", "array-bytes 6.1.0", "chrono", - "clap 4.4.10", + "clap 4.4.11", "comfy-table", "frame-benchmarking", "frame-support", @@ -5386,7 +5386,7 @@ dependencies = [ "quote", "scale-info", "sp-arithmetic", - "syn 2.0.39", + "syn 2.0.40", "trybuild", ] @@ -5412,7 +5412,7 @@ dependencies = [ name = "frame-election-solution-type-fuzzer" version = "2.0.0-alpha.5" dependencies = [ - "clap 4.4.10", + "clap 4.4.11", "frame-election-provider-solution-type", "frame-election-provider-support", "frame-support", @@ -5539,7 +5539,7 @@ dependencies = [ "quote", "regex", "sp-core-hashing", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -5550,7 +5550,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -5559,7 +5559,7 @@ version = "3.0.0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -5792,7 +5792,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -7797,7 +7797,7 @@ dependencies = [ "macro_magic_core", "macro_magic_macros", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -7811,7 +7811,7 @@ dependencies = [ "macro_magic_core_macros", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -7822,7 +7822,7 @@ checksum = "9ea73aa640dc01d62a590d48c0c3521ed739d53b27f919b25c3551e233481654" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -7833,7 +7833,7 @@ checksum = "ef9d79ae96aaba821963320eb2b6e34d17df1e5a83d8a1985c29cc5be59577b3" dependencies = [ "macro_magic_core", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -8002,7 +8002,7 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" name = "minimal-node" version = "4.0.0-dev" dependencies = [ - "clap 4.4.10", + "clap 4.4.11", "frame", "futures", "futures-timer", @@ -8476,7 +8476,7 @@ name = "node-bench" version = "0.9.0-dev" dependencies = [ "array-bytes 6.1.0", - "clap 4.4.10", + "clap 4.4.11", "derive_more", "fs_extra", "futures", @@ -8551,7 +8551,7 @@ dependencies = [ name = "node-runtime-generate-bags" version = "3.0.0" dependencies = [ - "clap 4.4.10", + "clap 4.4.11", "generate-bags", "kitchensink-runtime", ] @@ -8560,7 +8560,7 @@ dependencies = [ name = "node-template" version = "4.0.0-dev" dependencies = [ - "clap 4.4.10", + "clap 4.4.11", "frame-benchmarking", "frame-benchmarking-cli", "frame-system", @@ -8604,7 +8604,7 @@ dependencies = [ name = "node-template-release" version = "3.0.0" dependencies = [ - "clap 4.4.10", + "clap 4.4.11", "flate2", "fs_extra", "glob", @@ -9617,7 +9617,7 @@ version = "4.0.0-dev" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -10777,7 +10777,7 @@ dependencies = [ "proc-macro2", "quote", "sp-runtime", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -11183,7 +11183,7 @@ dependencies = [ name = "parachain-template-node" version = "0.1.0" dependencies = [ - "clap 4.4.10", + "clap 4.4.11", "color-print", "cumulus-client-cli", "cumulus-client-collator", @@ -11671,7 +11671,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -11712,7 +11712,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -11934,7 +11934,7 @@ name = "polkadot-cli" version = "1.1.0" dependencies = [ "cfg-if", - "clap 4.4.10", + "clap 4.4.11", "frame-benchmarking-cli", "futures", "log", @@ -12773,7 +12773,7 @@ dependencies = [ "async-trait", "bridge-hub-rococo-runtime", "bridge-hub-westend-runtime", - "clap 4.4.10", + "clap 4.4.11", "collectives-westend-runtime", "color-print", "contracts-rococo-runtime", @@ -13305,7 +13305,7 @@ version = "1.0.0" dependencies = [ "assert_matches", "async-trait", - "clap 4.4.10", + "clap 4.4.11", "color-eyre", "futures", "futures-timer", @@ -13452,7 +13452,7 @@ dependencies = [ name = "polkadot-voter-bags" version = "1.0.0" dependencies = [ - "clap 4.4.10", + "clap 4.4.11", "generate-bags", "sp-io", "westend-runtime", @@ -13630,7 +13630,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c64d9ba0963cdcea2e1b2230fbae2bab30eb25a174be395c41e764bfb65dd62" dependencies = [ "proc-macro2", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -13722,7 +13722,7 @@ checksum = "9b698b0b09d40e9b7c1a47b132d66a8b54bcd20583d9b6d06e4535e383b4405c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -13794,7 +13794,7 @@ checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -14196,7 +14196,7 @@ checksum = "7f7473c2cfcf90008193dd0e3e16599455cb601a9fce322b5bb55de799664925" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -14265,7 +14265,7 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" name = "remote-ext-tests-bags-list" version = "1.0.0" dependencies = [ - "clap 4.4.10", + "clap 4.4.11", "frame-system", "log", "pallet-bags-list-remote-tests", @@ -15039,7 +15039,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -15049,7 +15049,7 @@ dependencies = [ "array-bytes 6.1.0", "bip39", "chrono", - "clap 4.4.10", + "clap 4.4.11", "fdlimit", "futures", "futures-timer", @@ -16193,7 +16193,7 @@ dependencies = [ name = "sc-storage-monitor" version = "0.1.0" dependencies = [ - "clap 4.4.10", + "clap 4.4.11", "fs4", "log", "sc-client-db", @@ -16295,7 +16295,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -16688,7 +16688,7 @@ checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -16765,7 +16765,7 @@ checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -17209,7 +17209,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -17544,7 +17544,7 @@ version = "9.0.0" dependencies = [ "quote", "sp-core-hashing", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -17602,7 +17602,7 @@ version = "8.0.0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -17612,7 +17612,7 @@ source = "git+https://github.com/paritytech/polkadot-sdk#82912acb33a9030c0ef3bf5 dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -17771,7 +17771,7 @@ dependencies = [ name = "sp-npos-elections-fuzzer" version = "2.0.0-alpha.5" dependencies = [ - "clap 4.4.10", + "clap 4.4.11", "honggfuzz", "rand 0.8.5", "sp-npos-elections", @@ -17885,7 +17885,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -17897,7 +17897,7 @@ dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -18168,7 +18168,7 @@ dependencies = [ "proc-macro2", "quote", "sp-version", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -18279,7 +18279,7 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" name = "staging-chain-spec-builder" version = "2.0.0" dependencies = [ - "clap 4.4.10", + "clap 4.4.11", "log", "sc-chain-spec", "serde_json", @@ -18292,7 +18292,7 @@ version = "3.0.0-dev" dependencies = [ "array-bytes 6.1.0", "assert_cmd", - "clap 4.4.10", + "clap 4.4.11", "clap_complete", "criterion 0.4.0", "frame-benchmarking", @@ -18397,7 +18397,7 @@ dependencies = [ name = "staging-node-inspect" version = "0.9.0-dev" dependencies = [ - "clap 4.4.10", + "clap 4.4.11", "parity-scale-codec", "sc-cli", "sc-client-api", @@ -18620,7 +18620,7 @@ dependencies = [ name = "subkey" version = "3.0.0" dependencies = [ - "clap 4.4.10", + "clap 4.4.11", "sc-cli", ] @@ -18662,7 +18662,7 @@ dependencies = [ name = "substrate-frame-cli" version = "4.0.0-dev" dependencies = [ - "clap 4.4.10", + "clap 4.4.11", "frame-support", "frame-system", "sc-cli", @@ -19017,9 +19017,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.39" +version = "2.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +checksum = "13fa70a4ee923979ffb522cacce59d34421ebdea5625e1073c4326ef9d2dd42e" dependencies = [ "proc-macro2", "quote", @@ -19137,7 +19137,7 @@ dependencies = [ name = "test-parachain-adder-collator" version = "1.0.0" dependencies = [ - "clap 4.4.10", + "clap 4.4.11", "futures", "futures-timer", "log", @@ -19185,7 +19185,7 @@ dependencies = [ name = "test-parachain-undying-collator" version = "1.0.0" dependencies = [ - "clap 4.4.10", + "clap 4.4.11", "futures", "futures-timer", "log", @@ -19274,7 +19274,7 @@ checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -19446,7 +19446,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -19652,7 +19652,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -19694,7 +19694,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] @@ -19847,7 +19847,7 @@ version = "0.10.0-dev" dependencies = [ "assert_cmd", "async-trait", - "clap 4.4.10", + "clap 4.4.11", "frame-remote-externalities", "frame-try-runtime", "hex", @@ -20249,7 +20249,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", "wasm-bindgen-shared", ] @@ -20283,7 +20283,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -21463,7 +21463,7 @@ dependencies = [ "proc-macro2", "quote", "staging-xcm", - "syn 2.0.39", + "syn 2.0.40", "trybuild", ] @@ -21583,7 +21583,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.40", ] [[package]] diff --git a/cumulus/client/cli/Cargo.toml b/cumulus/client/cli/Cargo.toml index 35945bf4052..c1b27673c40 100644 --- a/cumulus/client/cli/Cargo.toml +++ b/cumulus/client/cli/Cargo.toml @@ -7,7 +7,7 @@ description = "Parachain node CLI utilities." license = "GPL-3.0-or-later WITH Classpath-exception-2.0" [dependencies] -clap = { version = "4.4.10", features = ["derive"] } +clap = { version = "4.4.11", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } url = "2.4.0" diff --git a/cumulus/pallets/parachain-system/proc-macro/Cargo.toml b/cumulus/pallets/parachain-system/proc-macro/Cargo.toml index ffe44c32902..fe960f716de 100644 --- a/cumulus/pallets/parachain-system/proc-macro/Cargo.toml +++ b/cumulus/pallets/parachain-system/proc-macro/Cargo.toml @@ -10,7 +10,7 @@ license = "Apache-2.0" proc-macro = true [dependencies] -syn = "2.0.39" +syn = "2.0.40" proc-macro2 = "1.0.64" quote = "1.0.33" proc-macro-crate = "2.0.1" diff --git a/cumulus/parachain-template/node/Cargo.toml b/cumulus/parachain-template/node/Cargo.toml index 19ee334cf95..a83b4e21ac5 100644 --- a/cumulus/parachain-template/node/Cargo.toml +++ b/cumulus/parachain-template/node/Cargo.toml @@ -11,7 +11,7 @@ build = "build.rs" publish = false [dependencies] -clap = { version = "4.4.10", features = ["derive"] } +clap = { version = "4.4.11", features = ["derive"] } log = "0.4.20" codec = { package = "parity-scale-codec", version = "3.0.0" } serde = { version = "1.0.193", features = ["derive"] } diff --git a/cumulus/polkadot-parachain/Cargo.toml b/cumulus/polkadot-parachain/Cargo.toml index 67ebc244adf..fed076132a4 100644 --- a/cumulus/polkadot-parachain/Cargo.toml +++ b/cumulus/polkadot-parachain/Cargo.toml @@ -13,7 +13,7 @@ path = "src/main.rs" [dependencies] async-trait = "0.1.73" -clap = { version = "4.4.10", features = ["derive"] } +clap = { version = "4.4.11", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } futures = "0.3.28" hex-literal = "0.4.1" diff --git a/cumulus/test/service/Cargo.toml b/cumulus/test/service/Cargo.toml index 271c450539b..cc25c80d4bf 100644 --- a/cumulus/test/service/Cargo.toml +++ b/cumulus/test/service/Cargo.toml @@ -11,7 +11,7 @@ path = "src/main.rs" [dependencies] async-trait = "0.1.73" -clap = { version = "4.4.10", features = ["derive"] } +clap = { version = "4.4.11", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } criterion = { version = "0.5.1", features = ["async_tokio"] } jsonrpsee = { version = "0.16.2", features = ["server"] } diff --git a/polkadot/cli/Cargo.toml b/polkadot/cli/Cargo.toml index 72b2a18f36b..77f73ead2ed 100644 --- a/polkadot/cli/Cargo.toml +++ b/polkadot/cli/Cargo.toml @@ -16,7 +16,7 @@ crate-type = ["cdylib", "rlib"] [dependencies] cfg-if = "1.0" -clap = { version = "4.4.10", features = ["derive"], optional = true } +clap = { version = "4.4.11", features = ["derive"], optional = true } log = "0.4.17" thiserror = "1.0.48" futures = "0.3.21" diff --git a/polkadot/node/gum/proc-macro/Cargo.toml b/polkadot/node/gum/proc-macro/Cargo.toml index 055eafa1b9c..e260cf1f929 100644 --- a/polkadot/node/gum/proc-macro/Cargo.toml +++ b/polkadot/node/gum/proc-macro/Cargo.toml @@ -13,7 +13,7 @@ targets = ["x86_64-unknown-linux-gnu"] proc-macro = true [dependencies] -syn = { version = "2.0.39", features = ["extra-traits", "full"] } +syn = { version = "2.0.40", features = ["extra-traits", "full"] } quote = "1.0.28" proc-macro2 = "1.0.56" proc-macro-crate = "2.0.1" diff --git a/polkadot/node/malus/Cargo.toml b/polkadot/node/malus/Cargo.toml index 1958bcf4620..2955bfbee18 100644 --- a/polkadot/node/malus/Cargo.toml +++ b/polkadot/node/malus/Cargo.toml @@ -40,7 +40,7 @@ assert_matches = "1.5" async-trait = "0.1.57" sp-keystore = { path = "../../../substrate/primitives/keystore" } sp-core = { path = "../../../substrate/primitives/core" } -clap = { version = "4.4.10", features = ["derive"] } +clap = { version = "4.4.11", features = ["derive"] } futures = "0.3.21" futures-timer = "3.0.2" gum = { package = "tracing-gum", path = "../gum" } diff --git a/polkadot/parachain/test-parachains/adder/collator/Cargo.toml b/polkadot/parachain/test-parachains/adder/collator/Cargo.toml index eeb367f8aee..8a018e330ba 100644 --- a/polkadot/parachain/test-parachains/adder/collator/Cargo.toml +++ b/polkadot/parachain/test-parachains/adder/collator/Cargo.toml @@ -13,7 +13,7 @@ path = "src/main.rs" [dependencies] parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive"] } -clap = { version = "4.4.10", features = ["derive"] } +clap = { version = "4.4.11", features = ["derive"] } futures = "0.3.21" futures-timer = "3.0.2" log = "0.4.17" diff --git a/polkadot/parachain/test-parachains/undying/collator/Cargo.toml b/polkadot/parachain/test-parachains/undying/collator/Cargo.toml index 0de349eac01..8e4022a718f 100644 --- a/polkadot/parachain/test-parachains/undying/collator/Cargo.toml +++ b/polkadot/parachain/test-parachains/undying/collator/Cargo.toml @@ -13,7 +13,7 @@ path = "src/main.rs" [dependencies] parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive"] } -clap = { version = "4.4.10", features = ["derive"] } +clap = { version = "4.4.11", features = ["derive"] } futures = "0.3.21" futures-timer = "3.0.2" log = "0.4.17" diff --git a/polkadot/utils/generate-bags/Cargo.toml b/polkadot/utils/generate-bags/Cargo.toml index 1cd7b057c87..361c6af71bc 100644 --- a/polkadot/utils/generate-bags/Cargo.toml +++ b/polkadot/utils/generate-bags/Cargo.toml @@ -7,7 +7,7 @@ license.workspace = true description = "CLI to generate voter bags for Polkadot runtimes" [dependencies] -clap = { version = "4.4.10", features = ["derive"] } +clap = { version = "4.4.11", features = ["derive"] } generate-bags = { path = "../../../substrate/utils/frame/generate-bags" } sp-io = { path = "../../../substrate/primitives/io" } diff --git a/polkadot/utils/remote-ext-tests/bags-list/Cargo.toml b/polkadot/utils/remote-ext-tests/bags-list/Cargo.toml index 7f0c49f0c26..4a75142d00c 100644 --- a/polkadot/utils/remote-ext-tests/bags-list/Cargo.toml +++ b/polkadot/utils/remote-ext-tests/bags-list/Cargo.toml @@ -15,6 +15,6 @@ sp-tracing = { path = "../../../../substrate/primitives/tracing" } frame-system = { path = "../../../../substrate/frame/system" } sp-core = { path = "../../../../substrate/primitives/core" } -clap = { version = "4.4.10", features = ["derive"] } +clap = { version = "4.4.11", features = ["derive"] } log = "0.4.17" tokio = { version = "1.24.2", features = ["macros"] } diff --git a/polkadot/xcm/procedural/Cargo.toml b/polkadot/xcm/procedural/Cargo.toml index b42f69d4438..bb67bf0d1b0 100644 --- a/polkadot/xcm/procedural/Cargo.toml +++ b/polkadot/xcm/procedural/Cargo.toml @@ -13,7 +13,7 @@ proc-macro = true [dependencies] proc-macro2 = "1.0.56" quote = "1.0.28" -syn = "2.0.39" +syn = "2.0.40" Inflector = "0.11.4" [dev-dependencies] diff --git a/substrate/bin/minimal/node/Cargo.toml b/substrate/bin/minimal/node/Cargo.toml index d8c8c7740b0..4358009057a 100644 --- a/substrate/bin/minimal/node/Cargo.toml +++ b/substrate/bin/minimal/node/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] name = "minimal-node" [dependencies] -clap = { version = "4.4.10", features = ["derive"] } +clap = { version = "4.4.11", features = ["derive"] } futures = { version = "0.3.21", features = ["thread-pool"] } futures-timer = "3.0.1" jsonrpsee = { version = "0.16.2", features = ["server"] } diff --git a/substrate/bin/node-template/node/Cargo.toml b/substrate/bin/node-template/node/Cargo.toml index a76aaf2a631..1541ffec27f 100644 --- a/substrate/bin/node-template/node/Cargo.toml +++ b/substrate/bin/node-template/node/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] name = "node-template" [dependencies] -clap = { version = "4.4.10", features = ["derive"] } +clap = { version = "4.4.11", features = ["derive"] } futures = { version = "0.3.21", features = ["thread-pool"] } serde_json = "1.0.108" diff --git a/substrate/bin/node/bench/Cargo.toml b/substrate/bin/node/bench/Cargo.toml index 903eb4de7e6..1d9ce149d4f 100644 --- a/substrate/bin/node/bench/Cargo.toml +++ b/substrate/bin/node/bench/Cargo.toml @@ -13,7 +13,7 @@ publish = false [dependencies] array-bytes = "6.1" -clap = { version = "4.4.10", features = ["derive"] } +clap = { version = "4.4.11", features = ["derive"] } log = "0.4.17" node-primitives = { path = "../primitives" } node-testing = { path = "../testing" } diff --git a/substrate/bin/node/cli/Cargo.toml b/substrate/bin/node/cli/Cargo.toml index e511633ff50..307aae1189e 100644 --- a/substrate/bin/node/cli/Cargo.toml +++ b/substrate/bin/node/cli/Cargo.toml @@ -38,7 +38,7 @@ crate-type = ["cdylib", "rlib"] [dependencies] # third-party dependencies array-bytes = "6.1" -clap = { version = "4.4.10", features = ["derive"], optional = true } +clap = { version = "4.4.11", features = ["derive"], optional = true } codec = { package = "parity-scale-codec", version = "3.6.1" } serde = { version = "1.0.193", features = ["derive"] } jsonrpsee = { version = "0.16.2", features = ["server"] } @@ -157,7 +157,7 @@ sp-trie = { path = "../../../primitives/trie" } sp-state-machine = { path = "../../../primitives/state-machine" } [build-dependencies] -clap = { version = "4.4.10", optional = true } +clap = { version = "4.4.11", optional = true } clap_complete = { version = "4.0.2", optional = true } node-inspect = { package = "staging-node-inspect", path = "../inspect", optional = true } frame-benchmarking-cli = { path = "../../../utils/frame/benchmarking-cli", optional = true } diff --git a/substrate/bin/node/inspect/Cargo.toml b/substrate/bin/node/inspect/Cargo.toml index cdf4b1ff146..0457fd54cab 100644 --- a/substrate/bin/node/inspect/Cargo.toml +++ b/substrate/bin/node/inspect/Cargo.toml @@ -12,7 +12,7 @@ repository.workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -clap = { version = "4.4.10", features = ["derive"] } +clap = { version = "4.4.11", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.6.1" } thiserror = "1.0" sc-cli = { path = "../../../client/cli" } diff --git a/substrate/bin/utils/chain-spec-builder/Cargo.toml b/substrate/bin/utils/chain-spec-builder/Cargo.toml index bfa2951cf00..110c1b6ce02 100644 --- a/substrate/bin/utils/chain-spec-builder/Cargo.toml +++ b/substrate/bin/utils/chain-spec-builder/Cargo.toml @@ -20,7 +20,7 @@ name = "chain-spec-builder" crate-type = ["rlib"] [dependencies] -clap = { version = "4.4.10", features = ["derive"] } +clap = { version = "4.4.11", features = ["derive"] } log = "0.4.17" sc-chain-spec = { path = "../../../client/chain-spec" } serde_json = "1.0.108" diff --git a/substrate/bin/utils/subkey/Cargo.toml b/substrate/bin/utils/subkey/Cargo.toml index 1769afd865b..37eba299cb2 100644 --- a/substrate/bin/utils/subkey/Cargo.toml +++ b/substrate/bin/utils/subkey/Cargo.toml @@ -17,5 +17,5 @@ path = "src/main.rs" name = "subkey" [dependencies] -clap = { version = "4.4.10", features = ["derive"] } +clap = { version = "4.4.11", features = ["derive"] } sc-cli = { path = "../../../client/cli" } diff --git a/substrate/client/chain-spec/derive/Cargo.toml b/substrate/client/chain-spec/derive/Cargo.toml index 36ad67ce1c5..0fbe1074d27 100644 --- a/substrate/client/chain-spec/derive/Cargo.toml +++ b/substrate/client/chain-spec/derive/Cargo.toml @@ -18,4 +18,4 @@ proc-macro = true proc-macro-crate = "2.0.1" proc-macro2 = "1.0.56" quote = "1.0.28" -syn = "2.0.39" +syn = "2.0.40" diff --git a/substrate/client/cli/Cargo.toml b/substrate/client/cli/Cargo.toml index d75eac1ac98..1f3e8f44f82 100644 --- a/substrate/client/cli/Cargo.toml +++ b/substrate/client/cli/Cargo.toml @@ -15,7 +15,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] array-bytes = "6.1" chrono = "0.4.27" -clap = { version = "4.4.10", features = ["derive", "string", "wrap_help"] } +clap = { version = "4.4.11", features = ["derive", "string", "wrap_help"] } fdlimit = "0.3.0" futures = "0.3.21" itertools = "0.10.3" diff --git a/substrate/client/storage-monitor/Cargo.toml b/substrate/client/storage-monitor/Cargo.toml index c0eb9d94b92..f7c62f44af4 100644 --- a/substrate/client/storage-monitor/Cargo.toml +++ b/substrate/client/storage-monitor/Cargo.toml @@ -9,7 +9,7 @@ description = "Storage monitor service for substrate" homepage = "https://substrate.io" [dependencies] -clap = { version = "4.4.10", features = ["derive", "string"] } +clap = { version = "4.4.11", features = ["derive", "string"] } log = "0.4.17" fs4 = "0.7.0" sc-client-db = { path = "../db", default-features = false } diff --git a/substrate/client/tracing/proc-macro/Cargo.toml b/substrate/client/tracing/proc-macro/Cargo.toml index 673ef50aead..509e87174da 100644 --- a/substrate/client/tracing/proc-macro/Cargo.toml +++ b/substrate/client/tracing/proc-macro/Cargo.toml @@ -18,4 +18,4 @@ proc-macro = true proc-macro-crate = "2.0.1" proc-macro2 = "1.0.56" quote = { version = "1.0.28", features = ["proc-macro"] } -syn = { version = "2.0.39", features = ["extra-traits", "full", "parsing", "proc-macro"] } +syn = { version = "2.0.40", features = ["extra-traits", "full", "parsing", "proc-macro"] } diff --git a/substrate/frame/contracts/proc-macro/Cargo.toml b/substrate/frame/contracts/proc-macro/Cargo.toml index 8aa6e6679cd..f05df18954c 100644 --- a/substrate/frame/contracts/proc-macro/Cargo.toml +++ b/substrate/frame/contracts/proc-macro/Cargo.toml @@ -17,7 +17,7 @@ proc-macro = true [dependencies] proc-macro2 = "1.0.56" quote = "1.0.28" -syn = { version = "2.0.39", features = ["full"] } +syn = { version = "2.0.40", features = ["full"] } [dev-dependencies] diff --git a/substrate/frame/election-provider-support/solution-type/Cargo.toml b/substrate/frame/election-provider-support/solution-type/Cargo.toml index 2e95163fc26..f81b366a5ec 100644 --- a/substrate/frame/election-provider-support/solution-type/Cargo.toml +++ b/substrate/frame/election-provider-support/solution-type/Cargo.toml @@ -15,7 +15,7 @@ targets = ["x86_64-unknown-linux-gnu"] proc-macro = true [dependencies] -syn = { version = "2.0.39", features = ["full", "visit"] } +syn = { version = "2.0.40", features = ["full", "visit"] } quote = "1.0.28" proc-macro2 = "1.0.56" proc-macro-crate = "2.0.1" diff --git a/substrate/frame/election-provider-support/solution-type/fuzzer/Cargo.toml b/substrate/frame/election-provider-support/solution-type/fuzzer/Cargo.toml index 144ed8b18c5..1f0261571a5 100644 --- a/substrate/frame/election-provider-support/solution-type/fuzzer/Cargo.toml +++ b/substrate/frame/election-provider-support/solution-type/fuzzer/Cargo.toml @@ -13,7 +13,7 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -clap = { version = "4.4.10", features = ["derive"] } +clap = { version = "4.4.11", features = ["derive"] } honggfuzz = "0.5" rand = { version = "0.8", features = ["small_rng", "std"] } diff --git a/substrate/frame/staking/reward-curve/Cargo.toml b/substrate/frame/staking/reward-curve/Cargo.toml index 1e5717e4075..136cdd7d1b0 100644 --- a/substrate/frame/staking/reward-curve/Cargo.toml +++ b/substrate/frame/staking/reward-curve/Cargo.toml @@ -18,7 +18,7 @@ proc-macro = true proc-macro-crate = "2.0.1" proc-macro2 = "1.0.56" quote = "1.0.28" -syn = { version = "2.0.39", features = ["full", "visit"] } +syn = { version = "2.0.40", features = ["full", "visit"] } [dev-dependencies] sp-runtime = { path = "../../../primitives/runtime" } diff --git a/substrate/frame/support/procedural/Cargo.toml b/substrate/frame/support/procedural/Cargo.toml index 7c207b230f3..769cb9f1cfb 100644 --- a/substrate/frame/support/procedural/Cargo.toml +++ b/substrate/frame/support/procedural/Cargo.toml @@ -21,7 +21,7 @@ cfg-expr = "0.15.5" itertools = "0.10.3" proc-macro2 = "1.0.56" quote = "1.0.28" -syn = { version = "2.0.39", features = ["full"] } +syn = { version = "2.0.40", features = ["full"] } frame-support-procedural-tools = { path = "tools" } macro_magic = { version = "0.5.0", features = ["proc_support"] } proc-macro-warning = { version = "1.0.0", default-features = false } diff --git a/substrate/frame/support/procedural/tools/Cargo.toml b/substrate/frame/support/procedural/tools/Cargo.toml index 0b04d64a4bc..9be7a029ef9 100644 --- a/substrate/frame/support/procedural/tools/Cargo.toml +++ b/substrate/frame/support/procedural/tools/Cargo.toml @@ -15,5 +15,5 @@ targets = ["x86_64-unknown-linux-gnu"] proc-macro-crate = "2.0.1" proc-macro2 = "1.0.56" quote = "1.0.28" -syn = { version = "2.0.39", features = ["extra-traits", "full", "visit"] } +syn = { version = "2.0.40", features = ["extra-traits", "full", "visit"] } frame-support-procedural-tools-derive = { path = "derive" } diff --git a/substrate/frame/support/procedural/tools/derive/Cargo.toml b/substrate/frame/support/procedural/tools/derive/Cargo.toml index 6040449df65..dc2774cb177 100644 --- a/substrate/frame/support/procedural/tools/derive/Cargo.toml +++ b/substrate/frame/support/procedural/tools/derive/Cargo.toml @@ -17,4 +17,4 @@ proc-macro = true [dependencies] proc-macro2 = "1.0.56" quote = { version = "1.0.28", features = ["proc-macro"] } -syn = { version = "2.0.39", features = ["extra-traits", "full", "parsing", "proc-macro"] } +syn = { version = "2.0.40", features = ["extra-traits", "full", "parsing", "proc-macro"] } diff --git a/substrate/primitives/api/proc-macro/Cargo.toml b/substrate/primitives/api/proc-macro/Cargo.toml index 487b2cd9b84..c66a7c65d11 100644 --- a/substrate/primitives/api/proc-macro/Cargo.toml +++ b/substrate/primitives/api/proc-macro/Cargo.toml @@ -17,7 +17,7 @@ proc-macro = true [dependencies] quote = "1.0.28" -syn = { version = "2.0.39", features = ["extra-traits", "fold", "full", "visit"] } +syn = { version = "2.0.40", features = ["extra-traits", "fold", "full", "visit"] } proc-macro2 = "1.0.56" blake2 = { version = "0.10.4", default-features = false } proc-macro-crate = "2.0.1" diff --git a/substrate/primitives/core/hashing/proc-macro/Cargo.toml b/substrate/primitives/core/hashing/proc-macro/Cargo.toml index a5e5956e94f..a16bec5a2a1 100644 --- a/substrate/primitives/core/hashing/proc-macro/Cargo.toml +++ b/substrate/primitives/core/hashing/proc-macro/Cargo.toml @@ -17,5 +17,5 @@ proc-macro = true [dependencies] quote = "1.0.28" -syn = { version = "2.0.39", features = ["full", "parsing"] } +syn = { version = "2.0.40", features = ["full", "parsing"] } sp-core-hashing = { path = "..", default-features = false } diff --git a/substrate/primitives/debug-derive/Cargo.toml b/substrate/primitives/debug-derive/Cargo.toml index 1f739c256d0..0662cd309ed 100644 --- a/substrate/primitives/debug-derive/Cargo.toml +++ b/substrate/primitives/debug-derive/Cargo.toml @@ -18,7 +18,7 @@ proc-macro = true [dependencies] quote = "1.0.28" -syn = "2.0.39" +syn = "2.0.40" proc-macro2 = "1.0.56" [features] diff --git a/substrate/primitives/npos-elections/fuzzer/Cargo.toml b/substrate/primitives/npos-elections/fuzzer/Cargo.toml index bd1fa856813..591ef412363 100644 --- a/substrate/primitives/npos-elections/fuzzer/Cargo.toml +++ b/substrate/primitives/npos-elections/fuzzer/Cargo.toml @@ -14,7 +14,7 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -clap = { version = "4.4.10", features = ["derive"] } +clap = { version = "4.4.11", features = ["derive"] } honggfuzz = "0.5" rand = { version = "0.8", features = ["small_rng", "std"] } sp-npos-elections = { path = ".." } diff --git a/substrate/primitives/runtime-interface/proc-macro/Cargo.toml b/substrate/primitives/runtime-interface/proc-macro/Cargo.toml index 8179e88546c..f94f568c913 100644 --- a/substrate/primitives/runtime-interface/proc-macro/Cargo.toml +++ b/substrate/primitives/runtime-interface/proc-macro/Cargo.toml @@ -21,4 +21,4 @@ proc-macro-crate = "2.0.1" proc-macro2 = "1.0.56" quote = "1.0.28" expander = "2.0.0" -syn = { version = "2.0.39", features = ["extra-traits", "fold", "full", "visit"] } +syn = { version = "2.0.40", features = ["extra-traits", "fold", "full", "visit"] } diff --git a/substrate/primitives/version/proc-macro/Cargo.toml b/substrate/primitives/version/proc-macro/Cargo.toml index 715316b842d..05a3dcb2e27 100644 --- a/substrate/primitives/version/proc-macro/Cargo.toml +++ b/substrate/primitives/version/proc-macro/Cargo.toml @@ -19,7 +19,7 @@ proc-macro = true codec = { package = "parity-scale-codec", version = "3.6.1", features = ["derive"] } proc-macro2 = "1.0.56" quote = "1.0.28" -syn = { version = "2.0.39", features = ["extra-traits", "fold", "full", "visit"] } +syn = { version = "2.0.40", features = ["extra-traits", "fold", "full", "visit"] } [dev-dependencies] sp-version = { path = ".." } diff --git a/substrate/scripts/ci/node-template-release/Cargo.toml b/substrate/scripts/ci/node-template-release/Cargo.toml index 59c53e952b9..beb0e0852de 100644 --- a/substrate/scripts/ci/node-template-release/Cargo.toml +++ b/substrate/scripts/ci/node-template-release/Cargo.toml @@ -11,7 +11,7 @@ publish = false targets = ["x86_64-unknown-linux-gnu"] [dependencies] -clap = { version = "4.4.10", features = ["derive"] } +clap = { version = "4.4.11", features = ["derive"] } flate2 = "1.0" fs_extra = "1.3" glob = "0.3" diff --git a/substrate/utils/frame/benchmarking-cli/Cargo.toml b/substrate/utils/frame/benchmarking-cli/Cargo.toml index e88eb60ee63..8fb2c731520 100644 --- a/substrate/utils/frame/benchmarking-cli/Cargo.toml +++ b/substrate/utils/frame/benchmarking-cli/Cargo.toml @@ -15,7 +15,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] array-bytes = "6.1" chrono = "0.4" -clap = { version = "4.4.10", features = ["derive"] } +clap = { version = "4.4.11", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.6.1" } comfy-table = { version = "7.0.1", default-features = false } handlebars = "4.2.2" diff --git a/substrate/utils/frame/frame-utilities-cli/Cargo.toml b/substrate/utils/frame/frame-utilities-cli/Cargo.toml index 6e33ed88e0a..5dc974cf89b 100644 --- a/substrate/utils/frame/frame-utilities-cli/Cargo.toml +++ b/substrate/utils/frame/frame-utilities-cli/Cargo.toml @@ -11,7 +11,7 @@ documentation = "https://docs.rs/substrate-frame-cli" readme = "README.md" [dependencies] -clap = { version = "4.4.10", features = ["derive"] } +clap = { version = "4.4.11", features = ["derive"] } frame-support = { path = "../../../frame/support" } frame-system = { path = "../../../frame/system" } sc-cli = { path = "../../../client/cli" } diff --git a/substrate/utils/frame/generate-bags/node-runtime/Cargo.toml b/substrate/utils/frame/generate-bags/node-runtime/Cargo.toml index a2ee3883786..8dfc78c63ca 100644 --- a/substrate/utils/frame/generate-bags/node-runtime/Cargo.toml +++ b/substrate/utils/frame/generate-bags/node-runtime/Cargo.toml @@ -14,4 +14,4 @@ kitchensink-runtime = { path = "../../../../bin/node/runtime" } generate-bags = { path = ".." } # third-party -clap = { version = "4.4.10", features = ["derive"] } +clap = { version = "4.4.11", features = ["derive"] } diff --git a/substrate/utils/frame/try-runtime/cli/Cargo.toml b/substrate/utils/frame/try-runtime/cli/Cargo.toml index 31e95a8be41..3745198db31 100644 --- a/substrate/utils/frame/try-runtime/cli/Cargo.toml +++ b/substrate/utils/frame/try-runtime/cli/Cargo.toml @@ -35,7 +35,7 @@ frame-try-runtime = { path = "../../../../frame/try-runtime", optional = true } substrate-rpc-client = { path = "../../rpc/client" } async-trait = "0.1.57" -clap = { version = "4.4.10", features = ["derive"] } +clap = { version = "4.4.11", features = ["derive"] } hex = { version = "0.4.3", default-features = false } log = "0.4.17" parity-scale-codec = "3.6.1" -- GitLab From 50b7b6f39999c825276454fe9bd4ba6e34fc4dd4 Mon Sep 17 00:00:00 2001 From: zhiqiangxu <652732310@qq.com> Date: Tue, 12 Dec 2023 00:47:24 +0800 Subject: [PATCH 006/191] fix comment of exit_runtime (#2616) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Bastian Köcher --- .../primitives/state-machine/src/overlayed_changes/changeset.rs | 2 +- substrate/primitives/state-machine/src/overlayed_changes/mod.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/substrate/primitives/state-machine/src/overlayed_changes/changeset.rs b/substrate/primitives/state-machine/src/overlayed_changes/changeset.rs index 8f2d02fd684..59589dbbb37 100644 --- a/substrate/primitives/state-machine/src/overlayed_changes/changeset.rs +++ b/substrate/primitives/state-machine/src/overlayed_changes/changeset.rs @@ -298,7 +298,7 @@ impl OverlayedMap { /// Call this when control returns from the runtime. /// - /// This commits all dangling transaction left open by the runtime. + /// This rollbacks all dangling transaction left open by the runtime. /// Calling this while already outside the runtime will return an error. pub fn exit_runtime(&mut self) -> Result<(), NotInRuntime> { if let ExecutionMode::Client = self.execution_mode { diff --git a/substrate/primitives/state-machine/src/overlayed_changes/mod.rs b/substrate/primitives/state-machine/src/overlayed_changes/mod.rs index 28cfecf1dbd..9525c2c9dfe 100644 --- a/substrate/primitives/state-machine/src/overlayed_changes/mod.rs +++ b/substrate/primitives/state-machine/src/overlayed_changes/mod.rs @@ -498,7 +498,7 @@ impl OverlayedChanges { /// Call this when control returns from the runtime. /// - /// This commits all dangling transaction left open by the runtime. + /// This rollbacks all dangling transaction left open by the runtime. /// Calling this while outside the runtime will return an error. pub fn exit_runtime(&mut self) -> Result<(), NotInRuntime> { self.top.exit_runtime()?; -- GitLab From c2d45e7e474c94e77b57c0aefe181fa8708d7965 Mon Sep 17 00:00:00 2001 From: Gabriel Facco de Arruda Date: Mon, 11 Dec 2023 20:12:15 -0300 Subject: [PATCH 007/191] pallet-vesting: Configurable block number provider (#2403) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR makes the block number provider configurable through the Config trait in pallet-vesting, this gives parachains the option to use the relay chain block number provider from ParachainSystem. --------- Co-authored-by: Bastian Köcher --- polkadot/runtime/common/src/claims.rs | 1 + polkadot/runtime/common/src/purchase.rs | 1 + polkadot/runtime/rococo/src/lib.rs | 1 + polkadot/runtime/test-runtime/src/lib.rs | 1 + polkadot/runtime/westend/src/lib.rs | 1 + prdoc/pr_2403.prdoc | 9 +++++++++ substrate/bin/node/runtime/src/lib.rs | 1 + substrate/frame/system/src/lib.rs | 5 +++++ substrate/frame/vesting/src/benchmarking.rs | 8 ++++---- substrate/frame/vesting/src/lib.rs | 13 ++++++++----- substrate/frame/vesting/src/mock.rs | 1 + 11 files changed, 33 insertions(+), 9 deletions(-) create mode 100644 prdoc/pr_2403.prdoc diff --git a/polkadot/runtime/common/src/claims.rs b/polkadot/runtime/common/src/claims.rs index 4f04a79be55..e05c0fe5c4c 100644 --- a/polkadot/runtime/common/src/claims.rs +++ b/polkadot/runtime/common/src/claims.rs @@ -801,6 +801,7 @@ mod tests { type MinVestedTransfer = MinVestedTransfer; type WeightInfo = (); type UnvestedFundsAllowedWithdrawReasons = UnvestedFundsAllowedWithdrawReasons; + type BlockNumberProvider = System; const MAX_VESTING_SCHEDULES: u32 = 28; } diff --git a/polkadot/runtime/common/src/purchase.rs b/polkadot/runtime/common/src/purchase.rs index 06b0a0a0211..f43f16b838c 100644 --- a/polkadot/runtime/common/src/purchase.rs +++ b/polkadot/runtime/common/src/purchase.rs @@ -573,6 +573,7 @@ mod tests { type MinVestedTransfer = MinVestedTransfer; type WeightInfo = (); type UnvestedFundsAllowedWithdrawReasons = UnvestedFundsAllowedWithdrawReasons; + type BlockNumberProvider = System; const MAX_VESTING_SCHEDULES: u32 = 28; } diff --git a/polkadot/runtime/rococo/src/lib.rs b/polkadot/runtime/rococo/src/lib.rs index 572cdf1aade..26cc6d95449 100644 --- a/polkadot/runtime/rococo/src/lib.rs +++ b/polkadot/runtime/rococo/src/lib.rs @@ -744,6 +744,7 @@ impl pallet_vesting::Config for Runtime { type MinVestedTransfer = MinVestedTransfer; type WeightInfo = weights::pallet_vesting::WeightInfo; type UnvestedFundsAllowedWithdrawReasons = UnvestedFundsAllowedWithdrawReasons; + type BlockNumberProvider = System; const MAX_VESTING_SCHEDULES: u32 = 28; } diff --git a/polkadot/runtime/test-runtime/src/lib.rs b/polkadot/runtime/test-runtime/src/lib.rs index 81b9b63f75b..351a1393fa0 100644 --- a/polkadot/runtime/test-runtime/src/lib.rs +++ b/polkadot/runtime/test-runtime/src/lib.rs @@ -463,6 +463,7 @@ impl pallet_vesting::Config for Runtime { type MinVestedTransfer = MinVestedTransfer; type WeightInfo = (); type UnvestedFundsAllowedWithdrawReasons = UnvestedFundsAllowedWithdrawReasons; + type BlockNumberProvider = System; const MAX_VESTING_SCHEDULES: u32 = 28; } diff --git a/polkadot/runtime/westend/src/lib.rs b/polkadot/runtime/westend/src/lib.rs index 25d4c1d2d6f..11f267a327b 100644 --- a/polkadot/runtime/westend/src/lib.rs +++ b/polkadot/runtime/westend/src/lib.rs @@ -948,6 +948,7 @@ impl pallet_vesting::Config for Runtime { type MinVestedTransfer = MinVestedTransfer; type WeightInfo = weights::pallet_vesting::WeightInfo; type UnvestedFundsAllowedWithdrawReasons = UnvestedFundsAllowedWithdrawReasons; + type BlockNumberProvider = System; const MAX_VESTING_SCHEDULES: u32 = 28; } diff --git a/prdoc/pr_2403.prdoc b/prdoc/pr_2403.prdoc new file mode 100644 index 00000000000..f1c4d3ecbaf --- /dev/null +++ b/prdoc/pr_2403.prdoc @@ -0,0 +1,9 @@ +title: Configurable block number provider in pallet-vesting + +doc: + - audience: Runtime Dev + description: | + Adds `BlockNumberProvider` type to pallet-vesting Config trait, allowing for custom providers instead of hardcoding frame-system. + This is particularly useful for parachains wanting to use `cumulus_pallet_parachain_system::RelaychainDataProvider` with `pallet-vesting`. + +crates: [ ] diff --git a/substrate/bin/node/runtime/src/lib.rs b/substrate/bin/node/runtime/src/lib.rs index eded60adfd7..b8c638ef155 100644 --- a/substrate/bin/node/runtime/src/lib.rs +++ b/substrate/bin/node/runtime/src/lib.rs @@ -1552,6 +1552,7 @@ impl pallet_vesting::Config for Runtime { type MinVestedTransfer = MinVestedTransfer; type WeightInfo = pallet_vesting::weights::SubstrateWeight; type UnvestedFundsAllowedWithdrawReasons = UnvestedFundsAllowedWithdrawReasons; + type BlockNumberProvider = System; // `VestingInfo` encode length is 36bytes. 28 schedules gets encoded as 1009 bytes, which is the // highest number of schedules that encodes less than 2^10. const MAX_VESTING_SCHEDULES: u32 = 28; diff --git a/substrate/frame/system/src/lib.rs b/substrate/frame/system/src/lib.rs index 6624bb43a80..3697e36f3fc 100644 --- a/substrate/frame/system/src/lib.rs +++ b/substrate/frame/system/src/lib.rs @@ -1919,6 +1919,11 @@ impl BlockNumberProvider for Pallet { fn current_block_number() -> Self::BlockNumber { Pallet::::block_number() } + + #[cfg(feature = "runtime-benchmarks")] + fn set_block_number(n: BlockNumberFor) { + Self::set_block_number(n) + } } /// Implement StoredMap for a simple single-item, provide-when-not-default system. This works fine diff --git a/substrate/frame/vesting/src/benchmarking.rs b/substrate/frame/vesting/src/benchmarking.rs index 34aa04607ad..311590873d9 100644 --- a/substrate/frame/vesting/src/benchmarking.rs +++ b/substrate/frame/vesting/src/benchmarking.rs @@ -55,7 +55,7 @@ fn add_vesting_schedules( let source_lookup = T::Lookup::unlookup(source.clone()); T::Currency::make_free_balance_be(&source, BalanceOf::::max_value()); - System::::set_block_number(BlockNumberFor::::zero()); + T::BlockNumberProvider::set_block_number(BlockNumberFor::::zero()); let mut total_locked: BalanceOf = Zero::zero(); for _ in 0..n { @@ -116,7 +116,7 @@ benchmarks! { add_vesting_schedules::(caller_lookup, s)?; // At block 21, everything is unlocked. - System::::set_block_number(21u32.into()); + T::BlockNumberProvider::set_block_number(21u32.into()); assert_eq!( Vesting::::vesting_balance(&caller), Some(BalanceOf::::zero()), @@ -173,7 +173,7 @@ benchmarks! { add_locks::(&other, l as u8); add_vesting_schedules::(other_lookup.clone(), s)?; // At block 21 everything is unlocked. - System::::set_block_number(21u32.into()); + T::BlockNumberProvider::set_block_number(21u32.into()); assert_eq!( Vesting::::vesting_balance(&other), @@ -335,7 +335,7 @@ benchmarks! { let total_transferred = add_vesting_schedules::(caller_lookup, s)?; // Go to about half way through all the schedules duration. (They all start at 1, and have a duration of 20 or 21). - System::::set_block_number(11u32.into()); + T::BlockNumberProvider::set_block_number(11u32.into()); // We expect half the original locked balance (+ any remainder that vests on the last block). let expected_balance = total_transferred / 2u32.into(); assert_eq!( diff --git a/substrate/frame/vesting/src/lib.rs b/substrate/frame/vesting/src/lib.rs index dbad7926a30..4101caded41 100644 --- a/substrate/frame/vesting/src/lib.rs +++ b/substrate/frame/vesting/src/lib.rs @@ -71,8 +71,8 @@ use frame_system::pallet_prelude::BlockNumberFor; use scale_info::TypeInfo; use sp_runtime::{ traits::{ - AtLeast32BitUnsigned, Bounded, Convert, MaybeSerializeDeserialize, One, Saturating, - StaticLookup, Zero, + AtLeast32BitUnsigned, BlockNumberProvider, Bounded, Convert, MaybeSerializeDeserialize, + One, Saturating, StaticLookup, Zero, }, DispatchError, RuntimeDebug, }; @@ -176,6 +176,9 @@ pub mod pallet { /// the unvested amount. type UnvestedFundsAllowedWithdrawReasons: Get; + /// Provider for the block number. + type BlockNumberProvider: BlockNumberProvider>; + /// Maximum number of vesting schedules an account may have at a given moment. const MAX_VESTING_SCHEDULES: u32; } @@ -565,7 +568,7 @@ impl Pallet { schedules: Vec, BlockNumberFor>>, action: VestingAction, ) -> (Vec, BlockNumberFor>>, BalanceOf) { - let now = >::block_number(); + let now = T::BlockNumberProvider::current_block_number(); let mut total_locked_now: BalanceOf = Zero::zero(); let filtered_schedules = action @@ -649,7 +652,7 @@ impl Pallet { let (mut schedules, mut locked_now) = Self::report_schedule_updates(schedules.to_vec(), action); - let now = >::block_number(); + let now = T::BlockNumberProvider::current_block_number(); if let Some(new_schedule) = Self::merge_vesting_info(now, schedule1, schedule2) { // Merging created a new schedule so we: // 1) need to add it to the accounts vesting schedule collection, @@ -685,7 +688,7 @@ where /// Get the amount that is currently being vested and cannot be transferred out of this account. fn vesting_balance(who: &T::AccountId) -> Option> { if let Some(v) = Self::vesting(who) { - let now = >::block_number(); + let now = T::BlockNumberProvider::current_block_number(); let total_locked_now = v.iter().fold(Zero::zero(), |total, schedule| { schedule.locked_at::(now).saturating_add(total) }); diff --git a/substrate/frame/vesting/src/mock.rs b/substrate/frame/vesting/src/mock.rs index 67444b8d125..3af4a9c962d 100644 --- a/substrate/frame/vesting/src/mock.rs +++ b/substrate/frame/vesting/src/mock.rs @@ -96,6 +96,7 @@ impl Config for Test { type MinVestedTransfer = MinVestedTransfer; type WeightInfo = (); type UnvestedFundsAllowedWithdrawReasons = UnvestedFundsAllowedWithdrawReasons; + type BlockNumberProvider = System; } pub struct ExtBuilder { -- GitLab From 048a9c2744ca83ef6faeadd2cd19466295d52b9d Mon Sep 17 00:00:00 2001 From: Ross Bulat Date: Tue, 12 Dec 2023 13:23:02 +0700 Subject: [PATCH 008/191] Staking: Add `deprecate_controller_batch` AdminOrigin call (#2589) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Partially Addresses #2500 Adds a `deprecate_controller_batch` call to the staking pallet that is callable by `Root` and `StakingAdmin`. To be used for controller account deprecation and removed thereafter. Adds `MaxControllersDeprecationBatch` pallet constant that defines max possible deprecations per call. - [x] Add `deprecate_controller_batch` call, and `MaxControllersInDeprecationBatch` constant. - [x] Add tests, benchmark, weights. Tests that weight is only consumed if unique pair. - [x] Adds `StakingAdmin` origin to staking's `AdminOrigin` type in westend runtime. - [x] Determined that worst case 5,900 deprecations does fit into `maxBlock` `proofSize` and `refTime` in both normal and operational thresholds, meaning we can deprecate all controllers for each network in one call. ## Block Weights By querying `consts.system.blockWeights` we can see that the `deprecate_controller_batch` weights fit within the `normal` threshold on Polkadot. #### `controller_deprecation_batch` where i = 5900: #### Ref time: 69,933,325,300 #### Proof size: 21,040,390 ### Polkadot ``` // consts.query.blockWeights maxBlock: { refTime: 2,000,000,000,000 proofSize: 18,446,744,073,709,551,615 } normal: { maxExtrinsic: { refTime: 1,479,873,955,000 proofSize: 13,650,590,614,545,068,195 } maxTotal: { refTime: 1,500,000,000,000 proofSize: 13,835,058,055,282,163,711 } } ``` ### Kusama ``` // consts.query.blockWeights maxBlock: { refTime: 2,000,000,000,000 proofSize: 18,446,744,073,709,551,615 } normal: { maxExtrinsic: { refTime: 1,479,875,294,000 proofSize: 13,650,590,614,545,068,195 } maxTotal: { refTime: 1,500,000,000,000 proofSize: 13,835,058,055,282,163,711 } } ``` --------- Co-authored-by: command-bot <> Co-authored-by: Gonçalo Pestana --- polkadot/runtime/test-runtime/src/lib.rs | 1 + polkadot/runtime/westend/src/lib.rs | 4 +- .../westend/src/weights/pallet_staking.rs | 214 ++++----- substrate/bin/node/runtime/src/lib.rs | 2 + substrate/frame/babe/src/mock.rs | 1 + substrate/frame/beefy/src/mock.rs | 1 + .../test-staking-e2e/src/mock.rs | 1 + substrate/frame/fast-unstake/src/mock.rs | 1 + substrate/frame/grandpa/src/mock.rs | 1 + .../nomination-pools/benchmarking/src/mock.rs | 1 + .../nomination-pools/test-staking/src/mock.rs | 1 + .../frame/offences/benchmarking/src/mock.rs | 1 + substrate/frame/root-offences/src/mock.rs | 1 + .../frame/session/benchmarking/src/mock.rs | 1 + substrate/frame/staking/src/benchmarking.rs | 34 ++ substrate/frame/staking/src/mock.rs | 2 + substrate/frame/staking/src/pallet/mod.rs | 56 ++- substrate/frame/staking/src/tests.rs | 179 +++++++- substrate/frame/staking/src/weights.rs | 407 ++++++++++-------- 19 files changed, 624 insertions(+), 285 deletions(-) diff --git a/polkadot/runtime/test-runtime/src/lib.rs b/polkadot/runtime/test-runtime/src/lib.rs index 351a1393fa0..cd9590796ae 100644 --- a/polkadot/runtime/test-runtime/src/lib.rs +++ b/polkadot/runtime/test-runtime/src/lib.rs @@ -356,6 +356,7 @@ impl pallet_staking::Config for Runtime { type TargetList = pallet_staking::UseValidatorsMap; type NominationsQuota = pallet_staking::FixedNominationsQuota; type MaxUnlockingChunks = frame_support::traits::ConstU32<32>; + type MaxControllersInDeprecationBatch = ConstU32<5900>; type HistoryDepth = frame_support::traits::ConstU32<84>; type BenchmarkingConfig = runtime_common::StakingBenchmarkingConfig; type EventListeners = (); diff --git a/polkadot/runtime/westend/src/lib.rs b/polkadot/runtime/westend/src/lib.rs index 11f267a327b..827a4953ec3 100644 --- a/polkadot/runtime/westend/src/lib.rs +++ b/polkadot/runtime/westend/src/lib.rs @@ -672,6 +672,7 @@ parameter_types! { pub const MaxNominators: u32 = 64; pub const OffendingValidatorsThreshold: Perbill = Perbill::from_percent(17); pub const MaxNominations: u32 = ::LIMIT as u32; + pub const MaxControllersInDeprecationBatch: u32 = 751; } impl pallet_staking::Config for Runtime { @@ -686,7 +687,7 @@ impl pallet_staking::Config for Runtime { type SessionsPerEra = SessionsPerEra; type BondingDuration = BondingDuration; type SlashDeferDuration = SlashDeferDuration; - type AdminOrigin = EnsureRoot; + type AdminOrigin = EitherOf, StakingAdmin>; type SessionInterface = Self; type EraPayout = pallet_staking::ConvertCurve; type MaxExposurePageSize = MaxExposurePageSize; @@ -699,6 +700,7 @@ impl pallet_staking::Config for Runtime { type NominationsQuota = pallet_staking::FixedNominationsQuota<{ MaxNominations::get() }>; type MaxUnlockingChunks = frame_support::traits::ConstU32<32>; type HistoryDepth = frame_support::traits::ConstU32<84>; + type MaxControllersInDeprecationBatch = MaxControllersInDeprecationBatch; type BenchmarkingConfig = runtime_common::StakingBenchmarkingConfig; type EventListeners = NominationPools; type WeightInfo = weights::pallet_staking::WeightInfo; diff --git a/polkadot/runtime/westend/src/weights/pallet_staking.rs b/polkadot/runtime/westend/src/weights/pallet_staking.rs index 87b603621e8..1ecd44747ef 100644 --- a/polkadot/runtime/westend/src/weights/pallet_staking.rs +++ b/polkadot/runtime/westend/src/weights/pallet_staking.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_staking` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-11-21, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-12-10, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-yprdrvc7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-itmxxexx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("westend-dev")`, DB CACHE: 1024 // Executed Command: @@ -62,8 +62,8 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `894` // Estimated: `4764` - // Minimum execution time: 38_052_000 picoseconds. - Weight::from_parts(39_303_000, 0) + // Minimum execution time: 38_316_000 picoseconds. + Weight::from_parts(40_022_000, 0) .saturating_add(Weight::from_parts(0, 4764)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) @@ -84,8 +84,8 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `1921` // Estimated: `8877` - // Minimum execution time: 81_690_000 picoseconds. - Weight::from_parts(83_889_000, 0) + // Minimum execution time: 81_027_000 picoseconds. + Weight::from_parts(83_964_000, 0) .saturating_add(Weight::from_parts(0, 8877)) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(7)) @@ -112,8 +112,8 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `2128` // Estimated: `8877` - // Minimum execution time: 84_409_000 picoseconds. - Weight::from_parts(87_330_000, 0) + // Minimum execution time: 85_585_000 picoseconds. + Weight::from_parts(87_256_000, 0) .saturating_add(Weight::from_parts(0, 8877)) .saturating_add(T::DbWeight::get().reads(12)) .saturating_add(T::DbWeight::get().writes(7)) @@ -133,11 +133,11 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `1075` // Estimated: `4764` - // Minimum execution time: 39_770_000 picoseconds. - Weight::from_parts(40_828_632, 0) + // Minimum execution time: 39_520_000 picoseconds. + Weight::from_parts(41_551_548, 0) .saturating_add(Weight::from_parts(0, 4764)) - // Standard Error: 824 - .saturating_add(Weight::from_parts(51_107, 0).saturating_mul(s.into())) + // Standard Error: 1_094 + .saturating_add(Weight::from_parts(50_426, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -174,11 +174,11 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `2127 + s * (4 ±0)` // Estimated: `6248 + s * (4 ±0)` - // Minimum execution time: 82_500_000 picoseconds. - Weight::from_parts(90_099_121, 0) + // Minimum execution time: 82_915_000 picoseconds. + Weight::from_parts(89_597_160, 0) .saturating_add(Weight::from_parts(0, 6248)) - // Standard Error: 3_280 - .saturating_add(Weight::from_parts(1_273_212, 0).saturating_mul(s.into())) + // Standard Error: 3_146 + .saturating_add(Weight::from_parts(1_228_061, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(13)) .saturating_add(T::DbWeight::get().writes(11)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(s.into()))) @@ -210,8 +210,8 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `1301` // Estimated: `4556` - // Minimum execution time: 48_236_000 picoseconds. - Weight::from_parts(49_518_000, 0) + // Minimum execution time: 48_070_000 picoseconds. + Weight::from_parts(49_226_000, 0) .saturating_add(Weight::from_parts(0, 4556)) .saturating_add(T::DbWeight::get().reads(11)) .saturating_add(T::DbWeight::get().writes(5)) @@ -225,11 +225,11 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `1243 + k * (569 ±0)` // Estimated: `4556 + k * (3033 ±0)` - // Minimum execution time: 28_280_000 picoseconds. - Weight::from_parts(29_182_740, 0) + // Minimum execution time: 29_140_000 picoseconds. + Weight::from_parts(30_225_579, 0) .saturating_add(Weight::from_parts(0, 4556)) - // Standard Error: 6_102 - .saturating_add(Weight::from_parts(6_412_107, 0).saturating_mul(k.into())) + // Standard Error: 5_394 + .saturating_add(Weight::from_parts(6_401_367, 0).saturating_mul(k.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(k.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(k.into()))) @@ -262,11 +262,11 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `1797 + n * (102 ±0)` // Estimated: `6248 + n * (2520 ±0)` - // Minimum execution time: 59_846_000 picoseconds. - Weight::from_parts(58_029_857, 0) + // Minimum execution time: 59_287_000 picoseconds. + Weight::from_parts(58_285_052, 0) .saturating_add(Weight::from_parts(0, 6248)) - // Standard Error: 15_967 - .saturating_add(Weight::from_parts(3_898_764, 0).saturating_mul(n.into())) + // Standard Error: 14_556 + .saturating_add(Weight::from_parts(3_863_008, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(12)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes(6)) @@ -290,8 +290,8 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `1581` // Estimated: `6248` - // Minimum execution time: 51_223_000 picoseconds. - Weight::from_parts(52_310_000, 0) + // Minimum execution time: 51_035_000 picoseconds. + Weight::from_parts(52_163_000, 0) .saturating_add(Weight::from_parts(0, 6248)) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(6)) @@ -306,8 +306,8 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `865` // Estimated: `4556` - // Minimum execution time: 15_762_000 picoseconds. - Weight::from_parts(16_381_000, 0) + // Minimum execution time: 15_809_000 picoseconds. + Weight::from_parts(16_451_000, 0) .saturating_add(Weight::from_parts(0, 4556)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -322,8 +322,8 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `932` // Estimated: `4556` - // Minimum execution time: 21_904_000 picoseconds. - Weight::from_parts(22_373_000, 0) + // Minimum execution time: 21_695_000 picoseconds. + Weight::from_parts(22_351_000, 0) .saturating_add(Weight::from_parts(0, 4556)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) @@ -336,8 +336,8 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `865` // Estimated: `4556` - // Minimum execution time: 18_869_000 picoseconds. - Weight::from_parts(19_422_000, 0) + // Minimum execution time: 18_548_000 picoseconds. + Weight::from_parts(19_205_000, 0) .saturating_add(Weight::from_parts(0, 4556)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(3)) @@ -348,8 +348,8 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_205_000 picoseconds. - Weight::from_parts(2_320_000, 0) + // Minimum execution time: 2_193_000 picoseconds. + Weight::from_parts(2_408_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -359,8 +359,8 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_179_000 picoseconds. - Weight::from_parts(7_843_000, 0) + // Minimum execution time: 7_475_000 picoseconds. + Weight::from_parts(7_874_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -370,8 +370,8 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_206_000 picoseconds. - Weight::from_parts(7_829_000, 0) + // Minimum execution time: 7_393_000 picoseconds. + Weight::from_parts(7_643_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -381,8 +381,8 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_414_000 picoseconds. - Weight::from_parts(7_770_000, 0) + // Minimum execution time: 7_474_000 picoseconds. + Weight::from_parts(7_814_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -393,13 +393,33 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_256_000 picoseconds. - Weight::from_parts(2_645_840, 0) + // Minimum execution time: 2_358_000 picoseconds. + Weight::from_parts(2_589_423, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 37 - .saturating_add(Weight::from_parts(10_207, 0).saturating_mul(v.into())) + // Standard Error: 81 + .saturating_add(Weight::from_parts(13_612, 0).saturating_mul(v.into())) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: `Staking::Ledger` (r:751 w:1502) + /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Staking::Payee` (r:751 w:0) + /// Proof: `Staking::Payee` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Staking::Bonded` (r:0 w:751) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) + /// The range of component `i` is `[0, 751]`. + fn deprecate_controller_batch(i: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `668 + i * (148 ±0)` + // Estimated: `990 + i * (3566 ±0)` + // Minimum execution time: 1_934_000 picoseconds. + Weight::from_parts(2_070_000, 0) + .saturating_add(Weight::from_parts(0, 990)) + // Standard Error: 19_129 + .saturating_add(Weight::from_parts(13_231_580, 0).saturating_mul(i.into())) + .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(i.into()))) + .saturating_add(T::DbWeight::get().writes((3_u64).saturating_mul(i.into()))) + .saturating_add(Weight::from_parts(0, 3566).saturating_mul(i.into())) + } /// Storage: `Staking::SlashingSpans` (r:1 w:1) /// Proof: `Staking::SlashingSpans` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Staking::Bonded` (r:1 w:1) @@ -433,11 +453,11 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `2127 + s * (4 ±0)` // Estimated: `6248 + s * (4 ±0)` - // Minimum execution time: 81_032_000 picoseconds. - Weight::from_parts(88_297_596, 0) + // Minimum execution time: 80_290_000 picoseconds. + Weight::from_parts(87_901_664, 0) .saturating_add(Weight::from_parts(0, 6248)) - // Standard Error: 3_070 - .saturating_add(Weight::from_parts(1_207_207, 0).saturating_mul(s.into())) + // Standard Error: 2_960 + .saturating_add(Weight::from_parts(1_195_050, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(13)) .saturating_add(T::DbWeight::get().writes(12)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(s.into()))) @@ -450,11 +470,11 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `66639` // Estimated: `70104` - // Minimum execution time: 131_456_000 picoseconds. - Weight::from_parts(935_254_517, 0) + // Minimum execution time: 132_682_000 picoseconds. + Weight::from_parts(932_504_297, 0) .saturating_add(Weight::from_parts(0, 70104)) - // Standard Error: 57_806 - .saturating_add(Weight::from_parts(4_823_189, 0).saturating_mul(s.into())) + // Standard Error: 57_593 + .saturating_add(Weight::from_parts(4_829_705, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -490,12 +510,12 @@ impl pallet_staking::WeightInfo for WeightInfo { fn payout_stakers_alive_staked(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `8249 + n * (396 ±0)` - // Estimated: `10779 + n * (3774 ±0)` - // Minimum execution time: 129_233_000 picoseconds. - Weight::from_parts(165_096_042, 0) + // Estimated: `10779 + n * (3774 ±3)` + // Minimum execution time: 129_091_000 picoseconds. + Weight::from_parts(166_186_167, 0) .saturating_add(Weight::from_parts(0, 10779)) - // Standard Error: 29_598 - .saturating_add(Weight::from_parts(40_716_425, 0).saturating_mul(n.into())) + // Standard Error: 36_242 + .saturating_add(Weight::from_parts(40_467_481, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(14)) .saturating_add(T::DbWeight::get().reads((6_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes(4)) @@ -519,11 +539,11 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `1922 + l * (5 ±0)` // Estimated: `8877` - // Minimum execution time: 77_223_000 picoseconds. - Weight::from_parts(80_026_259, 0) + // Minimum execution time: 77_461_000 picoseconds. + Weight::from_parts(80_118_021, 0) .saturating_add(Weight::from_parts(0, 8877)) - // Standard Error: 4_493 - .saturating_add(Weight::from_parts(52_909, 0).saturating_mul(l.into())) + // Standard Error: 4_343 + .saturating_add(Weight::from_parts(59_113, 0).saturating_mul(l.into())) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(7)) } @@ -558,11 +578,11 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `2127 + s * (4 ±0)` // Estimated: `6248 + s * (4 ±0)` - // Minimum execution time: 89_871_000 picoseconds. - Weight::from_parts(92_313_331, 0) + // Minimum execution time: 89_366_000 picoseconds. + Weight::from_parts(91_964_557, 0) .saturating_add(Weight::from_parts(0, 6248)) - // Standard Error: 3_321 - .saturating_add(Weight::from_parts(1_243_347, 0).saturating_mul(s.into())) + // Standard Error: 2_799 + .saturating_add(Weight::from_parts(1_206_123, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(12)) .saturating_add(T::DbWeight::get().writes(11)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(s.into()))) @@ -607,14 +627,14 @@ impl pallet_staking::WeightInfo for WeightInfo { fn new_era(v: u32, n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0 + n * (716 ±0) + v * (3594 ±0)` - // Estimated: `456136 + n * (3566 ±0) + v * (3566 ±0)` - // Minimum execution time: 518_819_000 picoseconds. - Weight::from_parts(522_108_000, 0) + // Estimated: `456136 + n * (3566 ±4) + v * (3566 ±40)` + // Minimum execution time: 520_430_000 picoseconds. + Weight::from_parts(527_125_000, 0) .saturating_add(Weight::from_parts(0, 456136)) - // Standard Error: 1_987_848 - .saturating_add(Weight::from_parts(64_855_377, 0).saturating_mul(v.into())) - // Standard Error: 198_078 - .saturating_add(Weight::from_parts(18_343_485, 0).saturating_mul(n.into())) + // Standard Error: 1_974_092 + .saturating_add(Weight::from_parts(64_885_491, 0).saturating_mul(v.into())) + // Standard Error: 196_707 + .saturating_add(Weight::from_parts(18_100_326, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(184)) .saturating_add(T::DbWeight::get().reads((5_u64).saturating_mul(v.into()))) .saturating_add(T::DbWeight::get().reads((4_u64).saturating_mul(n.into()))) @@ -645,13 +665,13 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `3108 + n * (907 ±0) + v * (391 ±0)` // Estimated: `456136 + n * (3566 ±0) + v * (3566 ±0)` - // Minimum execution time: 34_976_277_000 picoseconds. - Weight::from_parts(35_245_501_000, 0) + // Minimum execution time: 33_917_323_000 picoseconds. + Weight::from_parts(34_173_565_000, 0) .saturating_add(Weight::from_parts(0, 456136)) - // Standard Error: 386_461 - .saturating_add(Weight::from_parts(5_145_210, 0).saturating_mul(v.into())) - // Standard Error: 386_461 - .saturating_add(Weight::from_parts(3_762_623, 0).saturating_mul(n.into())) + // Standard Error: 367_135 + .saturating_add(Weight::from_parts(4_696_840, 0).saturating_mul(v.into())) + // Standard Error: 367_135 + .saturating_add(Weight::from_parts(3_889_075, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(179)) .saturating_add(T::DbWeight::get().reads((5_u64).saturating_mul(v.into()))) .saturating_add(T::DbWeight::get().reads((4_u64).saturating_mul(n.into()))) @@ -668,11 +688,11 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `946 + v * (50 ±0)` // Estimated: `3510 + v * (2520 ±0)` - // Minimum execution time: 2_577_411_000 picoseconds. - Weight::from_parts(86_073_486, 0) + // Minimum execution time: 2_447_197_000 picoseconds. + Weight::from_parts(13_003_614, 0) .saturating_add(Weight::from_parts(0, 3510)) - // Standard Error: 8_363 - .saturating_add(Weight::from_parts(5_074_828, 0).saturating_mul(v.into())) + // Standard Error: 9_738 + .saturating_add(Weight::from_parts(4_953_442, 0).saturating_mul(v.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(v.into()))) .saturating_add(Weight::from_parts(0, 2520).saturating_mul(v.into())) @@ -693,8 +713,8 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_539_000 picoseconds. - Weight::from_parts(3_903_000, 0) + // Minimum execution time: 3_714_000 picoseconds. + Weight::from_parts(3_956_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(6)) } @@ -714,11 +734,13 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_244_000 picoseconds. - Weight::from_parts(3_450_000, 0) + // Minimum execution time: 3_361_000 picoseconds. + Weight::from_parts(3_632_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(6)) } + /// Storage: `Staking::Bonded` (r:1 w:0) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) /// Storage: `Staking::Ledger` (r:1 w:0) /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) /// Storage: `Staking::Nominators` (r:1 w:1) @@ -741,12 +763,12 @@ impl pallet_staking::WeightInfo for WeightInfo { /// Proof: `VoterList::CounterForListNodes` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn chill_other() -> Weight { // Proof Size summary in bytes: - // Measured: `1704` + // Measured: `1870` // Estimated: `6248` - // Minimum execution time: 62_606_000 picoseconds. - Weight::from_parts(64_678_000, 0) + // Minimum execution time: 65_329_000 picoseconds. + Weight::from_parts(67_247_000, 0) .saturating_add(Weight::from_parts(0, 6248)) - .saturating_add(T::DbWeight::get().reads(11)) + .saturating_add(T::DbWeight::get().reads(12)) .saturating_add(T::DbWeight::get().writes(6)) } /// Storage: `Staking::MinCommission` (r:1 w:0) @@ -757,8 +779,8 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `658` // Estimated: `3510` - // Minimum execution time: 11_490_000 picoseconds. - Weight::from_parts(11_867_000, 0) + // Minimum execution time: 11_760_000 picoseconds. + Weight::from_parts(12_095_000, 0) .saturating_add(Weight::from_parts(0, 3510)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -769,8 +791,8 @@ impl pallet_staking::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_125_000 picoseconds. - Weight::from_parts(2_337_000, 0) + // Minimum execution time: 2_256_000 picoseconds. + Weight::from_parts(2_378_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/substrate/bin/node/runtime/src/lib.rs b/substrate/bin/node/runtime/src/lib.rs index b8c638ef155..4d0b253413a 100644 --- a/substrate/bin/node/runtime/src/lib.rs +++ b/substrate/bin/node/runtime/src/lib.rs @@ -632,6 +632,7 @@ parameter_types! { pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; pub const MaxNominators: u32 = 64; pub const OffendingValidatorsThreshold: Perbill = Perbill::from_percent(17); + pub const MaxControllersInDeprecationBatch: u32 = 5900; pub OffchainRepeat: BlockNumber = 5; pub HistoryDepth: u32 = 84; } @@ -674,6 +675,7 @@ impl pallet_staking::Config for Runtime { // This a placeholder, to be introduced in the next PR as an instance of bags-list type TargetList = pallet_staking::UseValidatorsMap; type MaxUnlockingChunks = ConstU32<32>; + type MaxControllersInDeprecationBatch = MaxControllersInDeprecationBatch; type HistoryDepth = HistoryDepth; type EventListeners = NominationPools; type WeightInfo = pallet_staking::weights::SubstrateWeight; diff --git a/substrate/frame/babe/src/mock.rs b/substrate/frame/babe/src/mock.rs index 0003c6f9f11..72abbc805db 100644 --- a/substrate/frame/babe/src/mock.rs +++ b/substrate/frame/babe/src/mock.rs @@ -183,6 +183,7 @@ impl pallet_staking::Config for Test { type TargetList = pallet_staking::UseValidatorsMap; type NominationsQuota = FixedNominationsQuota<16>; type MaxUnlockingChunks = ConstU32<32>; + type MaxControllersInDeprecationBatch = ConstU32<100>; type HistoryDepth = ConstU32<84>; type EventListeners = (); type BenchmarkingConfig = pallet_staking::TestBenchmarkingConfig; diff --git a/substrate/frame/beefy/src/mock.rs b/substrate/frame/beefy/src/mock.rs index 53d523cf724..8dc30614c33 100644 --- a/substrate/frame/beefy/src/mock.rs +++ b/substrate/frame/beefy/src/mock.rs @@ -201,6 +201,7 @@ impl pallet_staking::Config for Test { type TargetList = pallet_staking::UseValidatorsMap; type NominationsQuota = pallet_staking::FixedNominationsQuota<16>; type MaxUnlockingChunks = ConstU32<32>; + type MaxControllersInDeprecationBatch = ConstU32<100>; type HistoryDepth = ConstU32<84>; type EventListeners = (); type BenchmarkingConfig = pallet_staking::TestBenchmarkingConfig; diff --git a/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/mock.rs b/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/mock.rs index 751ffc07aa5..ecb2ae435b8 100644 --- a/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/mock.rs +++ b/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/mock.rs @@ -276,6 +276,7 @@ impl pallet_staking::Config for Runtime { type NominationsQuota = pallet_staking::FixedNominationsQuota; type TargetList = pallet_staking::UseValidatorsMap; type MaxUnlockingChunks = ConstU32<32>; + type MaxControllersInDeprecationBatch = ConstU32<100>; type HistoryDepth = HistoryDepth; type EventListeners = (); type WeightInfo = pallet_staking::weights::SubstrateWeight; diff --git a/substrate/frame/fast-unstake/src/mock.rs b/substrate/frame/fast-unstake/src/mock.rs index 09a08f222b6..f9326919fd3 100644 --- a/substrate/frame/fast-unstake/src/mock.rs +++ b/substrate/frame/fast-unstake/src/mock.rs @@ -142,6 +142,7 @@ impl pallet_staking::Config for Runtime { type TargetList = pallet_staking::UseValidatorsMap; type NominationsQuota = pallet_staking::FixedNominationsQuota<16>; type MaxUnlockingChunks = ConstU32<32>; + type MaxControllersInDeprecationBatch = ConstU32<100>; type EventListeners = (); type BenchmarkingConfig = pallet_staking::TestBenchmarkingConfig; type WeightInfo = (); diff --git a/substrate/frame/grandpa/src/mock.rs b/substrate/frame/grandpa/src/mock.rs index 4766d5c3780..f1f51e0b118 100644 --- a/substrate/frame/grandpa/src/mock.rs +++ b/substrate/frame/grandpa/src/mock.rs @@ -206,6 +206,7 @@ impl pallet_staking::Config for Test { type TargetList = pallet_staking::UseValidatorsMap; type NominationsQuota = pallet_staking::FixedNominationsQuota<16>; type MaxUnlockingChunks = ConstU32<32>; + type MaxControllersInDeprecationBatch = ConstU32<100>; type HistoryDepth = ConstU32<84>; type EventListeners = (); type BenchmarkingConfig = pallet_staking::TestBenchmarkingConfig; diff --git a/substrate/frame/nomination-pools/benchmarking/src/mock.rs b/substrate/frame/nomination-pools/benchmarking/src/mock.rs index 095df219dc8..c58a66f6163 100644 --- a/substrate/frame/nomination-pools/benchmarking/src/mock.rs +++ b/substrate/frame/nomination-pools/benchmarking/src/mock.rs @@ -119,6 +119,7 @@ impl pallet_staking::Config for Runtime { type VoterList = VoterList; type TargetList = pallet_staking::UseValidatorsMap; type NominationsQuota = pallet_staking::FixedNominationsQuota<16>; + type MaxControllersInDeprecationBatch = ConstU32<100>; type MaxUnlockingChunks = ConstU32<32>; type HistoryDepth = ConstU32<84>; type EventListeners = Pools; diff --git a/substrate/frame/nomination-pools/test-staking/src/mock.rs b/substrate/frame/nomination-pools/test-staking/src/mock.rs index ee24b53db06..491cd619161 100644 --- a/substrate/frame/nomination-pools/test-staking/src/mock.rs +++ b/substrate/frame/nomination-pools/test-staking/src/mock.rs @@ -134,6 +134,7 @@ impl pallet_staking::Config for Runtime { type TargetList = pallet_staking::UseValidatorsMap; type NominationsQuota = pallet_staking::FixedNominationsQuota<16>; type MaxUnlockingChunks = ConstU32<32>; + type MaxControllersInDeprecationBatch = ConstU32<100>; type HistoryDepth = ConstU32<84>; type EventListeners = Pools; type BenchmarkingConfig = pallet_staking::TestBenchmarkingConfig; diff --git a/substrate/frame/offences/benchmarking/src/mock.rs b/substrate/frame/offences/benchmarking/src/mock.rs index 62ce1990112..1d642b9b498 100644 --- a/substrate/frame/offences/benchmarking/src/mock.rs +++ b/substrate/frame/offences/benchmarking/src/mock.rs @@ -185,6 +185,7 @@ impl pallet_staking::Config for Test { type TargetList = pallet_staking::UseValidatorsMap; type NominationsQuota = pallet_staking::FixedNominationsQuota<16>; type MaxUnlockingChunks = ConstU32<32>; + type MaxControllersInDeprecationBatch = ConstU32<100>; type HistoryDepth = ConstU32<84>; type EventListeners = (); type BenchmarkingConfig = pallet_staking::TestBenchmarkingConfig; diff --git a/substrate/frame/root-offences/src/mock.rs b/substrate/frame/root-offences/src/mock.rs index 5e04e9abc13..c0c83dd08d2 100644 --- a/substrate/frame/root-offences/src/mock.rs +++ b/substrate/frame/root-offences/src/mock.rs @@ -188,6 +188,7 @@ impl pallet_staking::Config for Test { type NominationsQuota = pallet_staking::FixedNominationsQuota<16>; type MaxUnlockingChunks = ConstU32<32>; type HistoryDepth = ConstU32<84>; + type MaxControllersInDeprecationBatch = ConstU32<100>; type VoterList = pallet_staking::UseNominatorsAndValidatorsMap; type EventListeners = (); type BenchmarkingConfig = pallet_staking::TestBenchmarkingConfig; diff --git a/substrate/frame/session/benchmarking/src/mock.rs b/substrate/frame/session/benchmarking/src/mock.rs index 5c00d4bb491..e1744fa43ab 100644 --- a/substrate/frame/session/benchmarking/src/mock.rs +++ b/substrate/frame/session/benchmarking/src/mock.rs @@ -179,6 +179,7 @@ impl pallet_staking::Config for Test { type ElectionProvider = onchain::OnChainExecution; type GenesisElectionProvider = Self::ElectionProvider; type MaxUnlockingChunks = ConstU32<32>; + type MaxControllersInDeprecationBatch = ConstU32<100>; type HistoryDepth = ConstU32<84>; type VoterList = pallet_staking::UseNominatorsAndValidatorsMap; type TargetList = pallet_staking::UseValidatorsMap; diff --git a/substrate/frame/staking/src/benchmarking.rs b/substrate/frame/staking/src/benchmarking.rs index c0c6a838aa5..abb78b7e304 100644 --- a/substrate/frame/staking/src/benchmarking.rs +++ b/substrate/frame/staking/src/benchmarking.rs @@ -25,6 +25,7 @@ use codec::Decode; use frame_election_provider_support::{bounds::DataProviderBounds, SortedListProvider}; use frame_support::{ pallet_prelude::*, + storage::bounded_vec::BoundedVec, traits::{Currency, Get, Imbalance, UnfilteredDispatchable}, }; use sp_runtime::{ @@ -525,6 +526,39 @@ benchmarks! { assert_eq!(Invulnerables::::get().len(), v as usize); } + deprecate_controller_batch { + // We pass a dynamic number of controllers to the benchmark, up to + // `MaxControllersInDeprecationBatch`. + let i in 0 .. T::MaxControllersInDeprecationBatch::get(); + + let mut controllers: Vec<_> = vec![]; + let mut stashes: Vec<_> = vec![]; + for n in 0..i as u32 { + let (stash, controller) = create_unique_stash_controller::( + n, + 100, + RewardDestination::Staked, + false + )?; + controllers.push(controller); + stashes.push(stash); + } + let bounded_controllers: BoundedVec<_, T::MaxControllersInDeprecationBatch> = + BoundedVec::try_from(controllers.clone()).unwrap(); + }: _(RawOrigin::Root, bounded_controllers) + verify { + for n in 0..i as u32 { + let stash = &stashes[n as usize]; + let controller = &controllers[n as usize]; + // Ledger no longer keyed by controller. + assert_eq!(Ledger::::get(controller), None); + // Bonded now maps to the stash. + assert_eq!(Bonded::::get(stash), Some(stash.clone())); + // Ledger is now keyed by stash. + assert_eq!(Ledger::::get(stash).unwrap().stash, *stash); + } + } + force_unstake { // Slashing Spans let s in 0 .. MAX_SPANS; diff --git a/substrate/frame/staking/src/mock.rs b/substrate/frame/staking/src/mock.rs index 90b0ee0260d..5332dbfdd5b 100644 --- a/substrate/frame/staking/src/mock.rs +++ b/substrate/frame/staking/src/mock.rs @@ -122,6 +122,7 @@ parameter_types! { pub static SlashDeferDuration: EraIndex = 0; pub static Period: BlockNumber = 5; pub static Offset: BlockNumber = 0; + pub static MaxControllersInDeprecationBatch: u32 = 5900; } #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] @@ -316,6 +317,7 @@ impl crate::pallet::pallet::Config for Test { type NominationsQuota = WeightedNominationsQuota<16>; type MaxUnlockingChunks = MaxUnlockingChunks; type HistoryDepth = HistoryDepth; + type MaxControllersInDeprecationBatch = MaxControllersInDeprecationBatch; type EventListeners = EventListenerMock; type BenchmarkingConfig = TestBenchmarkingConfig; type WeightInfo = (); diff --git a/substrate/frame/staking/src/pallet/mod.rs b/substrate/frame/staking/src/pallet/mod.rs index ce80f22c2bb..b914545a76b 100644 --- a/substrate/frame/staking/src/pallet/mod.rs +++ b/substrate/frame/staking/src/pallet/mod.rs @@ -269,6 +269,9 @@ pub mod pallet { #[pallet::constant] type MaxUnlockingChunks: Get; + /// The maximum amount of controller accounts that can be deprecated in one call. + type MaxControllersInDeprecationBatch: Get; + /// Something that listens to staking updates and performs actions based on the data it /// receives. /// @@ -1323,7 +1326,7 @@ pub mod pallet { pub fn set_controller(origin: OriginFor) -> DispatchResult { let stash = ensure_signed(origin)?; - // the bonded map and ledger are mutated directly as this extrinsic is related to a + // The bonded map and ledger are mutated directly as this extrinsic is related to a // (temporary) passive migration. Self::ledger(StakingAccount::Stash(stash.clone())).map(|ledger| { let controller = ledger.controller() @@ -1331,10 +1334,9 @@ pub mod pallet { .ok_or(Error::::NotController)?; if controller == stash { - // stash is already its own controller. + // Stash is already its own controller. return Err(Error::::AlreadyPaired.into()) } - // update bond and ledger. >::remove(controller); >::insert(&stash, &stash); >::insert(&stash, ledger); @@ -1920,6 +1922,54 @@ pub mod pallet { Ok(Pays::No.into()) } + + /// Updates a batch of controller accounts to their corresponding stash account if they are + /// not the same. Ignores any controller accounts that do not exist, and does not operate if + /// the stash and controller are already the same. + /// + /// Effects will be felt instantly (as soon as this function is completed successfully). + /// + /// The dispatch origin must be `T::AdminOrigin`. + #[pallet::call_index(28)] + #[pallet::weight(T::WeightInfo::deprecate_controller_batch(controllers.len() as u32))] + pub fn deprecate_controller_batch( + origin: OriginFor, + controllers: BoundedVec, + ) -> DispatchResultWithPostInfo { + T::AdminOrigin::ensure_origin(origin)?; + + // Ignore controllers that do not exist or are already the same as stash. + let filtered_batch_with_ledger: Vec<_> = controllers + .iter() + .filter_map(|controller| { + let ledger = Self::ledger(StakingAccount::Controller(controller.clone())); + ledger.ok().map_or(None, |ledger| { + // If the controller `RewardDestination` is still the deprecated + // `Controller` variant, skip deprecating this account. + let payee_deprecated = Payee::::get(&ledger.stash) == { + #[allow(deprecated)] + RewardDestination::Controller + }; + + if ledger.stash != *controller && !payee_deprecated { + Some((controller.clone(), ledger)) + } else { + None + } + }) + }) + .collect(); + + // Update unique pairs. + for (controller, ledger) in filtered_batch_with_ledger { + let stash = ledger.stash.clone(); + + >::insert(&stash, &stash); + >::remove(controller); + >::insert(stash, ledger); + } + Ok(Some(T::WeightInfo::deprecate_controller_batch(controllers.len() as u32)).into()) + } } } diff --git a/substrate/frame/staking/src/tests.rs b/substrate/frame/staking/src/tests.rs index 7d967609f52..0e9be70ee7d 100644 --- a/substrate/frame/staking/src/tests.rs +++ b/substrate/frame/staking/src/tests.rs @@ -6206,7 +6206,7 @@ fn proportional_ledger_slash_works() { #[test] fn reducing_max_unlocking_chunks_abrupt() { // Concern is on validators only - // By Default 11, 10 are stash and ctrl and 21,20 + // By Default 11, 10 are stash and ctlr and 21,20 ExtBuilder::default().build_and_execute(|| { // given a staker at era=10 and MaxUnlockChunks set to 2 MaxUnlockingChunks::set(2); @@ -6867,4 +6867,181 @@ mod ledger { assert_eq!(Payee::::get(&21), RewardDestination::Stash); }) } + + #[test] + fn deprecate_controller_batch_works_full_weight() { + ExtBuilder::default().build_and_execute(|| { + // Given: + + let start = 1001; + let mut controllers: Vec<_> = vec![]; + for n in start..(start + MaxControllersInDeprecationBatch::get()).into() { + let ctlr: u64 = n.into(); + let stash: u64 = (n + 10000).into(); + + Ledger::::insert( + ctlr, + StakingLedger { + controller: None, + total: (10 + ctlr).into(), + active: (10 + ctlr).into(), + ..StakingLedger::default_from(stash) + }, + ); + Bonded::::insert(stash, ctlr); + Payee::::insert(stash, RewardDestination::Staked); + + controllers.push(ctlr); + } + + // When: + + let bounded_controllers: BoundedVec< + _, + ::MaxControllersInDeprecationBatch, + > = BoundedVec::try_from(controllers).unwrap(); + + // Only `AdminOrigin` can sign. + assert_noop!( + Staking::deprecate_controller_batch( + RuntimeOrigin::signed(2), + bounded_controllers.clone() + ), + BadOrigin + ); + + let result = + Staking::deprecate_controller_batch(RuntimeOrigin::root(), bounded_controllers); + assert_ok!(result); + assert_eq!( + result.unwrap().actual_weight.unwrap(), + ::WeightInfo::deprecate_controller_batch( + ::MaxControllersInDeprecationBatch::get() + ) + ); + + // Then: + + for n in start..(start + MaxControllersInDeprecationBatch::get()).into() { + let ctlr: u64 = n.into(); + let stash: u64 = (n + 10000).into(); + + // Ledger no longer keyed by controller. + assert_eq!(Ledger::::get(ctlr), None); + // Bonded now maps to the stash. + assert_eq!(Bonded::::get(stash), Some(stash)); + + // Ledger is now keyed by stash. + let ledger_updated = Ledger::::get(stash).unwrap(); + assert_eq!(ledger_updated.stash, stash); + + // Check `active` and `total` values match the original ledger set by controller. + assert_eq!(ledger_updated.active, (10 + ctlr).into()); + assert_eq!(ledger_updated.total, (10 + ctlr).into()); + } + }) + } + + #[test] + fn deprecate_controller_batch_works_half_weight() { + ExtBuilder::default().build_and_execute(|| { + // Given: + + let start = 1001; + let mut controllers: Vec<_> = vec![]; + for n in start..(start + MaxControllersInDeprecationBatch::get()).into() { + let ctlr: u64 = n.into(); + + // Only half of entries are unique pairs. + let stash: u64 = if n % 2 == 0 { (n + 10000).into() } else { ctlr }; + + Ledger::::insert( + ctlr, + StakingLedger { controller: None, ..StakingLedger::default_from(stash) }, + ); + Bonded::::insert(stash, ctlr); + Payee::::insert(stash, RewardDestination::Staked); + + controllers.push(ctlr); + } + + // When: + let bounded_controllers: BoundedVec< + _, + ::MaxControllersInDeprecationBatch, + > = BoundedVec::try_from(controllers.clone()).unwrap(); + + let result = + Staking::deprecate_controller_batch(RuntimeOrigin::root(), bounded_controllers); + assert_ok!(result); + assert_eq!( + result.unwrap().actual_weight.unwrap(), + ::WeightInfo::deprecate_controller_batch(controllers.len() as u32) + ); + + // Then: + + for n in start..(start + MaxControllersInDeprecationBatch::get()).into() { + let unique_pair = n % 2 == 0; + let ctlr: u64 = n.into(); + let stash: u64 = if unique_pair { (n + 10000).into() } else { ctlr }; + + // Side effect of migration for unique pair. + if unique_pair { + assert_eq!(Ledger::::get(ctlr), None); + } + // Bonded maps to the stash. + assert_eq!(Bonded::::get(stash), Some(stash)); + + // Ledger is keyed by stash. + let ledger_updated = Ledger::::get(stash).unwrap(); + assert_eq!(ledger_updated.stash, stash); + } + }) + } + + #[test] + fn deprecate_controller_batch_skips_unmigrated_controller_payees() { + ExtBuilder::default().build_and_execute(|| { + // Given: + + let stash: u64 = 1000; + let ctlr: u64 = 1001; + + Ledger::::insert( + ctlr, + StakingLedger { controller: None, ..StakingLedger::default_from(stash) }, + ); + Bonded::::insert(stash, ctlr); + #[allow(deprecated)] + Payee::::insert(stash, RewardDestination::Controller); + + // When: + + let bounded_controllers: BoundedVec< + _, + ::MaxControllersInDeprecationBatch, + > = BoundedVec::try_from(vec![ctlr]).unwrap(); + + let result = + Staking::deprecate_controller_batch(RuntimeOrigin::root(), bounded_controllers); + assert_ok!(result); + assert_eq!( + result.unwrap().actual_weight.unwrap(), + ::WeightInfo::deprecate_controller_batch(1 as u32) + ); + + // Then: + + // Esure deprecation did not happen. + assert_eq!(Ledger::::get(ctlr).is_some(), true); + + // Bonded still keyed by controller. + assert_eq!(Bonded::::get(stash), Some(ctlr)); + + // Ledger is still keyed by controller. + let ledger_updated = Ledger::::get(ctlr).unwrap(); + assert_eq!(ledger_updated.stash, stash); + }) + } } diff --git a/substrate/frame/staking/src/weights.rs b/substrate/frame/staking/src/weights.rs index ae00509eaa8..7c9a0500164 100644 --- a/substrate/frame/staking/src/weights.rs +++ b/substrate/frame/staking/src/weights.rs @@ -18,9 +18,9 @@ //! Autogenerated weights for `pallet_staking` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-11-27, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-12-10, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-yprdrvc7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-itmxxexx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: @@ -66,6 +66,7 @@ pub trait WeightInfo { fn force_new_era() -> Weight; fn force_new_era_always() -> Weight; fn set_invulnerables(v: u32, ) -> Weight; + fn deprecate_controller_batch(i: u32, ) -> Weight; fn force_unstake(s: u32, ) -> Weight; fn cancel_deferred_slash(s: u32, ) -> Weight; fn payout_stakers_alive_staked(n: u32, ) -> Weight; @@ -98,8 +99,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `927` // Estimated: `4764` - // Minimum execution time: 42_895_000 picoseconds. - Weight::from_parts(44_924_000, 4764) + // Minimum execution time: 42_491_000 picoseconds. + Weight::from_parts(44_026_000, 4764) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(4_u64)) } @@ -119,8 +120,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `1990` // Estimated: `8877` - // Minimum execution time: 87_734_000 picoseconds. - Weight::from_parts(90_762_000, 8877) + // Minimum execution time: 88_756_000 picoseconds. + Weight::from_parts(91_000_000, 8877) .saturating_add(T::DbWeight::get().reads(9_u64)) .saturating_add(T::DbWeight::get().writes(7_u64)) } @@ -146,8 +147,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `2195` // Estimated: `8877` - // Minimum execution time: 90_914_000 picoseconds. - Weight::from_parts(94_156_000, 8877) + // Minimum execution time: 91_331_000 picoseconds. + Weight::from_parts(94_781_000, 8877) .saturating_add(T::DbWeight::get().reads(12_u64)) .saturating_add(T::DbWeight::get().writes(7_u64)) } @@ -166,10 +167,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `1115` // Estimated: `4764` - // Minimum execution time: 43_141_000 picoseconds. - Weight::from_parts(45_081_969, 4764) - // Standard Error: 1_010 - .saturating_add(Weight::from_parts(39_539, 0).saturating_mul(s.into())) + // Minimum execution time: 42_495_000 picoseconds. + Weight::from_parts(44_189_470, 4764) + // Standard Error: 1_389 + .saturating_add(Weight::from_parts(47_484, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(5_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } @@ -206,10 +207,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `2196 + s * (4 ±0)` // Estimated: `6248 + s * (4 ±0)` - // Minimum execution time: 87_743_000 picoseconds. - Weight::from_parts(96_983_484, 6248) - // Standard Error: 4_271 - .saturating_add(Weight::from_parts(1_382_993, 0).saturating_mul(s.into())) + // Minimum execution time: 89_004_000 picoseconds. + Weight::from_parts(96_677_570, 6248) + // Standard Error: 4_635 + .saturating_add(Weight::from_parts(1_387_718, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(13_u64)) .saturating_add(T::DbWeight::get().writes(11_u64)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(s.into()))) @@ -241,8 +242,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `1372` // Estimated: `4556` - // Minimum execution time: 51_888_000 picoseconds. - Weight::from_parts(54_353_000, 4556) + // Minimum execution time: 51_532_000 picoseconds. + Weight::from_parts(53_308_000, 4556) .saturating_add(T::DbWeight::get().reads(11_u64)) .saturating_add(T::DbWeight::get().writes(5_u64)) } @@ -255,10 +256,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `1280 + k * (569 ±0)` // Estimated: `4556 + k * (3033 ±0)` - // Minimum execution time: 28_944_000 picoseconds. - Weight::from_parts(31_116_533, 4556) - // Standard Error: 11_848 - .saturating_add(Weight::from_parts(6_422_601, 0).saturating_mul(k.into())) + // Minimum execution time: 28_955_000 picoseconds. + Weight::from_parts(29_609_869, 4556) + // Standard Error: 6_793 + .saturating_add(Weight::from_parts(6_412_124, 0).saturating_mul(k.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(k.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(k.into()))) @@ -291,10 +292,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `1866 + n * (102 ±0)` // Estimated: `6248 + n * (2520 ±0)` - // Minimum execution time: 63_921_000 picoseconds. - Weight::from_parts(62_662_863, 6248) - // Standard Error: 15_071 - .saturating_add(Weight::from_parts(3_950_084, 0).saturating_mul(n.into())) + // Minimum execution time: 64_080_000 picoseconds. + Weight::from_parts(61_985_382, 6248) + // Standard Error: 13_320 + .saturating_add(Weight::from_parts(4_030_513, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(12_u64)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes(6_u64)) @@ -318,8 +319,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `1650` // Estimated: `6248` - // Minimum execution time: 54_605_000 picoseconds. - Weight::from_parts(56_406_000, 6248) + // Minimum execution time: 54_194_000 picoseconds. + Weight::from_parts(55_578_000, 6248) .saturating_add(T::DbWeight::get().reads(8_u64)) .saturating_add(T::DbWeight::get().writes(6_u64)) } @@ -333,8 +334,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `902` // Estimated: `4556` - // Minimum execution time: 16_826_000 picoseconds. - Weight::from_parts(17_326_000, 4556) + // Minimum execution time: 16_597_000 picoseconds. + Weight::from_parts(16_980_000, 4556) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -348,8 +349,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `969` // Estimated: `4556` - // Minimum execution time: 20_831_000 picoseconds. - Weight::from_parts(21_615_000, 4556) + // Minimum execution time: 20_626_000 picoseconds. + Weight::from_parts(21_242_000, 4556) .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -361,8 +362,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `902` // Estimated: `4556` - // Minimum execution time: 20_190_000 picoseconds. - Weight::from_parts(20_993_000, 4556) + // Minimum execution time: 19_972_000 picoseconds. + Weight::from_parts(20_470_000, 4556) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(3_u64)) } @@ -372,8 +373,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_603_000 picoseconds. - Weight::from_parts(2_747_000, 0) + // Minimum execution time: 2_571_000 picoseconds. + Weight::from_parts(2_720_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: `Staking::ForceEra` (r:0 w:1) @@ -382,8 +383,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_070_000 picoseconds. - Weight::from_parts(8_745_000, 0) + // Minimum execution time: 8_056_000 picoseconds. + Weight::from_parts(8_413_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: `Staking::ForceEra` (r:0 w:1) @@ -392,8 +393,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_999_000 picoseconds. - Weight::from_parts(8_624_000, 0) + // Minimum execution time: 8_162_000 picoseconds. + Weight::from_parts(8_497_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: `Staking::ForceEra` (r:0 w:1) @@ -402,8 +403,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_131_000 picoseconds. - Weight::from_parts(8_467_000, 0) + // Minimum execution time: 8_320_000 picoseconds. + Weight::from_parts(8_564_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: `Staking::Invulnerables` (r:0 w:1) @@ -413,12 +414,31 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_731_000 picoseconds. - Weight::from_parts(3_298_421, 0) - // Standard Error: 31 - .saturating_add(Weight::from_parts(10_075, 0).saturating_mul(v.into())) + // Minimum execution time: 2_470_000 picoseconds. + Weight::from_parts(3_110_242, 0) + // Standard Error: 63 + .saturating_add(Weight::from_parts(11_786, 0).saturating_mul(v.into())) .saturating_add(T::DbWeight::get().writes(1_u64)) } + /// Storage: `Staking::Ledger` (r:5900 w:11800) + /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Staking::Payee` (r:5900 w:0) + /// Proof: `Staking::Payee` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Staking::Bonded` (r:0 w:5900) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) + /// The range of component `i` is `[0, 5900]`. + fn deprecate_controller_batch(i: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `1356 + i * (151 ±0)` + // Estimated: `990 + i * (3566 ±0)` + // Minimum execution time: 2_101_000 picoseconds. + Weight::from_parts(2_238_000, 990) + // Standard Error: 56_753 + .saturating_add(Weight::from_parts(18_404_902, 0).saturating_mul(i.into())) + .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(i.into()))) + .saturating_add(T::DbWeight::get().writes((3_u64).saturating_mul(i.into()))) + .saturating_add(Weight::from_parts(0, 3566).saturating_mul(i.into())) + } /// Storage: `Staking::SlashingSpans` (r:1 w:1) /// Proof: `Staking::SlashingSpans` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Staking::Bonded` (r:1 w:1) @@ -452,10 +472,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `2196 + s * (4 ±0)` // Estimated: `6248 + s * (4 ±0)` - // Minimum execution time: 86_305_000 picoseconds. - Weight::from_parts(94_494_401, 6248) - // Standard Error: 3_602 - .saturating_add(Weight::from_parts(1_339_477, 0).saturating_mul(s.into())) + // Minimum execution time: 86_765_000 picoseconds. + Weight::from_parts(95_173_565, 6248) + // Standard Error: 4_596 + .saturating_add(Weight::from_parts(1_354_849, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(13_u64)) .saturating_add(T::DbWeight::get().writes(12_u64)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(s.into()))) @@ -468,10 +488,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `66672` // Estimated: `70137` - // Minimum execution time: 100_007_000 picoseconds. - Weight::from_parts(894_033_025, 70137) - // Standard Error: 57_584 - .saturating_add(Weight::from_parts(4_870_504, 0).saturating_mul(s.into())) + // Minimum execution time: 104_490_000 picoseconds. + Weight::from_parts(1_162_956_951, 70137) + // Standard Error: 76_760 + .saturating_add(Weight::from_parts(6_485_569, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -508,10 +528,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `33297 + n * (377 ±0)` // Estimated: `30944 + n * (3774 ±0)` - // Minimum execution time: 142_575_000 picoseconds. - Weight::from_parts(196_320_577, 30944) - // Standard Error: 29_330 - .saturating_add(Weight::from_parts(45_325_062, 0).saturating_mul(n.into())) + // Minimum execution time: 144_790_000 picoseconds. + Weight::from_parts(36_764_791, 30944) + // Standard Error: 89_592 + .saturating_add(Weight::from_parts(49_620_105, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(14_u64)) .saturating_add(T::DbWeight::get().reads((6_u64).saturating_mul(n.into()))) .saturating_add(T::DbWeight::get().writes(4_u64)) @@ -535,10 +555,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `1991 + l * (7 ±0)` // Estimated: `8877` - // Minimum execution time: 81_113_000 picoseconds. - Weight::from_parts(84_470_927, 8877) - // Standard Error: 5_588 - .saturating_add(Weight::from_parts(97_606, 0).saturating_mul(l.into())) + // Minimum execution time: 81_768_000 picoseconds. + Weight::from_parts(85_332_982, 8877) + // Standard Error: 5_380 + .saturating_add(Weight::from_parts(70_298, 0).saturating_mul(l.into())) .saturating_add(T::DbWeight::get().reads(9_u64)) .saturating_add(T::DbWeight::get().writes(7_u64)) } @@ -573,10 +593,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `2196 + s * (4 ±0)` // Estimated: `6248 + s * (4 ±0)` - // Minimum execution time: 94_810_000 picoseconds. - Weight::from_parts(99_292_156, 6248) - // Standard Error: 3_677 - .saturating_add(Weight::from_parts(1_345_598, 0).saturating_mul(s.into())) + // Minimum execution time: 96_123_000 picoseconds. + Weight::from_parts(100_278_672, 6248) + // Standard Error: 3_487 + .saturating_add(Weight::from_parts(1_326_503, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(12_u64)) .saturating_add(T::DbWeight::get().writes(11_u64)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(s.into()))) @@ -621,13 +641,13 @@ impl WeightInfo for SubstrateWeight { fn new_era(v: u32, n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0 + n * (720 ±0) + v * (3598 ±0)` - // Estimated: `512390 + n * (3566 ±4) + v * (3566 ±40)` - // Minimum execution time: 583_230_000 picoseconds. - Weight::from_parts(585_794_000, 512390) - // Standard Error: 1_984_644 - .saturating_add(Weight::from_parts(65_914_551, 0).saturating_mul(v.into())) - // Standard Error: 197_758 - .saturating_add(Weight::from_parts(18_105_424, 0).saturating_mul(n.into())) + // Estimated: `512390 + n * (3566 ±0) + v * (3566 ±0)` + // Minimum execution time: 572_893_000 picoseconds. + Weight::from_parts(578_010_000, 512390) + // Standard Error: 2_094_268 + .saturating_add(Weight::from_parts(68_419_710, 0).saturating_mul(v.into())) + // Standard Error: 208_682 + .saturating_add(Weight::from_parts(18_826_175, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(206_u64)) .saturating_add(T::DbWeight::get().reads((5_u64).saturating_mul(v.into()))) .saturating_add(T::DbWeight::get().reads((4_u64).saturating_mul(n.into()))) @@ -658,12 +678,12 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `3175 + n * (911 ±0) + v * (395 ±0)` // Estimated: `512390 + n * (3566 ±0) + v * (3566 ±0)` - // Minimum execution time: 33_312_958_000 picoseconds. - Weight::from_parts(4_949_866_209, 512390) - // Standard Error: 402_931 - .saturating_add(Weight::from_parts(16_448_367, 0).saturating_mul(v.into())) - // Standard Error: 402_931 - .saturating_add(Weight::from_parts(25_361_503, 0).saturating_mul(n.into())) + // Minimum execution time: 33_836_205_000 picoseconds. + Weight::from_parts(34_210_443_000, 512390) + // Standard Error: 441_692 + .saturating_add(Weight::from_parts(6_122_533, 0).saturating_mul(v.into())) + // Standard Error: 441_692 + .saturating_add(Weight::from_parts(4_418_264, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(201_u64)) .saturating_add(T::DbWeight::get().reads((5_u64).saturating_mul(v.into()))) .saturating_add(T::DbWeight::get().reads((4_u64).saturating_mul(n.into()))) @@ -680,10 +700,10 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `979 + v * (50 ±0)` // Estimated: `3510 + v * (2520 ±0)` - // Minimum execution time: 2_474_646_000 picoseconds. - Weight::from_parts(2_512_113_000, 3510) - // Standard Error: 33_996 - .saturating_add(Weight::from_parts(1_992_173, 0).saturating_mul(v.into())) + // Minimum execution time: 2_454_689_000 picoseconds. + Weight::from_parts(161_771_064, 3510) + // Standard Error: 31_022 + .saturating_add(Weight::from_parts(4_820_158, 0).saturating_mul(v.into())) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(v.into()))) .saturating_add(Weight::from_parts(0, 2520).saturating_mul(v.into())) @@ -704,8 +724,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_466_000 picoseconds. - Weight::from_parts(5_861_000, 0) + // Minimum execution time: 5_073_000 picoseconds. + Weight::from_parts(5_452_000, 0) .saturating_add(T::DbWeight::get().writes(6_u64)) } /// Storage: `Staking::MinCommission` (r:0 w:1) @@ -724,8 +744,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_780_000 picoseconds. - Weight::from_parts(4_998_000, 0) + // Minimum execution time: 4_465_000 picoseconds. + Weight::from_parts(4_832_000, 0) .saturating_add(T::DbWeight::get().writes(6_u64)) } /// Storage: `Staking::Bonded` (r:1 w:0) @@ -754,8 +774,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `1939` // Estimated: `6248` - // Minimum execution time: 71_261_000 picoseconds. - Weight::from_parts(72_778_000, 6248) + // Minimum execution time: 71_239_000 picoseconds. + Weight::from_parts(74_649_000, 6248) .saturating_add(T::DbWeight::get().reads(12_u64)) .saturating_add(T::DbWeight::get().writes(6_u64)) } @@ -767,8 +787,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `691` // Estimated: `3510` - // Minimum execution time: 12_497_000 picoseconds. - Weight::from_parts(13_049_000, 3510) + // Minimum execution time: 12_525_000 picoseconds. + Weight::from_parts(13_126_000, 3510) .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) } @@ -778,8 +798,8 @@ impl WeightInfo for SubstrateWeight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_044_000 picoseconds. - Weight::from_parts(3_278_000, 0) + // Minimum execution time: 2_918_000 picoseconds. + Weight::from_parts(3_176_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } } @@ -800,8 +820,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `927` // Estimated: `4764` - // Minimum execution time: 42_895_000 picoseconds. - Weight::from_parts(44_924_000, 4764) + // Minimum execution time: 42_491_000 picoseconds. + Weight::from_parts(44_026_000, 4764) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(4_u64)) } @@ -821,8 +841,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `1990` // Estimated: `8877` - // Minimum execution time: 87_734_000 picoseconds. - Weight::from_parts(90_762_000, 8877) + // Minimum execution time: 88_756_000 picoseconds. + Weight::from_parts(91_000_000, 8877) .saturating_add(RocksDbWeight::get().reads(9_u64)) .saturating_add(RocksDbWeight::get().writes(7_u64)) } @@ -848,8 +868,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `2195` // Estimated: `8877` - // Minimum execution time: 90_914_000 picoseconds. - Weight::from_parts(94_156_000, 8877) + // Minimum execution time: 91_331_000 picoseconds. + Weight::from_parts(94_781_000, 8877) .saturating_add(RocksDbWeight::get().reads(12_u64)) .saturating_add(RocksDbWeight::get().writes(7_u64)) } @@ -868,10 +888,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `1115` // Estimated: `4764` - // Minimum execution time: 43_141_000 picoseconds. - Weight::from_parts(45_081_969, 4764) - // Standard Error: 1_010 - .saturating_add(Weight::from_parts(39_539, 0).saturating_mul(s.into())) + // Minimum execution time: 42_495_000 picoseconds. + Weight::from_parts(44_189_470, 4764) + // Standard Error: 1_389 + .saturating_add(Weight::from_parts(47_484, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(5_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } @@ -908,10 +928,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `2196 + s * (4 ±0)` // Estimated: `6248 + s * (4 ±0)` - // Minimum execution time: 87_743_000 picoseconds. - Weight::from_parts(96_983_484, 6248) - // Standard Error: 4_271 - .saturating_add(Weight::from_parts(1_382_993, 0).saturating_mul(s.into())) + // Minimum execution time: 89_004_000 picoseconds. + Weight::from_parts(96_677_570, 6248) + // Standard Error: 4_635 + .saturating_add(Weight::from_parts(1_387_718, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(13_u64)) .saturating_add(RocksDbWeight::get().writes(11_u64)) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(s.into()))) @@ -943,8 +963,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `1372` // Estimated: `4556` - // Minimum execution time: 51_888_000 picoseconds. - Weight::from_parts(54_353_000, 4556) + // Minimum execution time: 51_532_000 picoseconds. + Weight::from_parts(53_308_000, 4556) .saturating_add(RocksDbWeight::get().reads(11_u64)) .saturating_add(RocksDbWeight::get().writes(5_u64)) } @@ -957,10 +977,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `1280 + k * (569 ±0)` // Estimated: `4556 + k * (3033 ±0)` - // Minimum execution time: 28_944_000 picoseconds. - Weight::from_parts(31_116_533, 4556) - // Standard Error: 11_848 - .saturating_add(Weight::from_parts(6_422_601, 0).saturating_mul(k.into())) + // Minimum execution time: 28_955_000 picoseconds. + Weight::from_parts(29_609_869, 4556) + // Standard Error: 6_793 + .saturating_add(Weight::from_parts(6_412_124, 0).saturating_mul(k.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(k.into()))) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(k.into()))) @@ -993,10 +1013,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `1866 + n * (102 ±0)` // Estimated: `6248 + n * (2520 ±0)` - // Minimum execution time: 63_921_000 picoseconds. - Weight::from_parts(62_662_863, 6248) - // Standard Error: 15_071 - .saturating_add(Weight::from_parts(3_950_084, 0).saturating_mul(n.into())) + // Minimum execution time: 64_080_000 picoseconds. + Weight::from_parts(61_985_382, 6248) + // Standard Error: 13_320 + .saturating_add(Weight::from_parts(4_030_513, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads(12_u64)) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(n.into()))) .saturating_add(RocksDbWeight::get().writes(6_u64)) @@ -1020,8 +1040,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `1650` // Estimated: `6248` - // Minimum execution time: 54_605_000 picoseconds. - Weight::from_parts(56_406_000, 6248) + // Minimum execution time: 54_194_000 picoseconds. + Weight::from_parts(55_578_000, 6248) .saturating_add(RocksDbWeight::get().reads(8_u64)) .saturating_add(RocksDbWeight::get().writes(6_u64)) } @@ -1035,8 +1055,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `902` // Estimated: `4556` - // Minimum execution time: 16_826_000 picoseconds. - Weight::from_parts(17_326_000, 4556) + // Minimum execution time: 16_597_000 picoseconds. + Weight::from_parts(16_980_000, 4556) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -1050,8 +1070,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `969` // Estimated: `4556` - // Minimum execution time: 20_831_000 picoseconds. - Weight::from_parts(21_615_000, 4556) + // Minimum execution time: 20_626_000 picoseconds. + Weight::from_parts(21_242_000, 4556) .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -1063,8 +1083,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `902` // Estimated: `4556` - // Minimum execution time: 20_190_000 picoseconds. - Weight::from_parts(20_993_000, 4556) + // Minimum execution time: 19_972_000 picoseconds. + Weight::from_parts(20_470_000, 4556) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } @@ -1074,8 +1094,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_603_000 picoseconds. - Weight::from_parts(2_747_000, 0) + // Minimum execution time: 2_571_000 picoseconds. + Weight::from_parts(2_720_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: `Staking::ForceEra` (r:0 w:1) @@ -1084,8 +1104,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_070_000 picoseconds. - Weight::from_parts(8_745_000, 0) + // Minimum execution time: 8_056_000 picoseconds. + Weight::from_parts(8_413_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: `Staking::ForceEra` (r:0 w:1) @@ -1094,8 +1114,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_999_000 picoseconds. - Weight::from_parts(8_624_000, 0) + // Minimum execution time: 8_162_000 picoseconds. + Weight::from_parts(8_497_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: `Staking::ForceEra` (r:0 w:1) @@ -1104,8 +1124,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_131_000 picoseconds. - Weight::from_parts(8_467_000, 0) + // Minimum execution time: 8_320_000 picoseconds. + Weight::from_parts(8_564_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: `Staking::Invulnerables` (r:0 w:1) @@ -1115,12 +1135,31 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_731_000 picoseconds. - Weight::from_parts(3_298_421, 0) - // Standard Error: 31 - .saturating_add(Weight::from_parts(10_075, 0).saturating_mul(v.into())) + // Minimum execution time: 2_470_000 picoseconds. + Weight::from_parts(3_110_242, 0) + // Standard Error: 63 + .saturating_add(Weight::from_parts(11_786, 0).saturating_mul(v.into())) .saturating_add(RocksDbWeight::get().writes(1_u64)) } + /// Storage: `Staking::Ledger` (r:5900 w:11800) + /// Proof: `Staking::Ledger` (`max_values`: None, `max_size`: Some(1091), added: 3566, mode: `MaxEncodedLen`) + /// Storage: `Staking::Payee` (r:5900 w:0) + /// Proof: `Staking::Payee` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Staking::Bonded` (r:0 w:5900) + /// Proof: `Staking::Bonded` (`max_values`: None, `max_size`: Some(72), added: 2547, mode: `MaxEncodedLen`) + /// The range of component `i` is `[0, 5900]`. + fn deprecate_controller_batch(i: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `1356 + i * (151 ±0)` + // Estimated: `990 + i * (3566 ±0)` + // Minimum execution time: 2_101_000 picoseconds. + Weight::from_parts(2_238_000, 990) + // Standard Error: 56_753 + .saturating_add(Weight::from_parts(18_404_902, 0).saturating_mul(i.into())) + .saturating_add(RocksDbWeight::get().reads((2_u64).saturating_mul(i.into()))) + .saturating_add(RocksDbWeight::get().writes((3_u64).saturating_mul(i.into()))) + .saturating_add(Weight::from_parts(0, 3566).saturating_mul(i.into())) + } /// Storage: `Staking::SlashingSpans` (r:1 w:1) /// Proof: `Staking::SlashingSpans` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Staking::Bonded` (r:1 w:1) @@ -1154,10 +1193,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `2196 + s * (4 ±0)` // Estimated: `6248 + s * (4 ±0)` - // Minimum execution time: 86_305_000 picoseconds. - Weight::from_parts(94_494_401, 6248) - // Standard Error: 3_602 - .saturating_add(Weight::from_parts(1_339_477, 0).saturating_mul(s.into())) + // Minimum execution time: 86_765_000 picoseconds. + Weight::from_parts(95_173_565, 6248) + // Standard Error: 4_596 + .saturating_add(Weight::from_parts(1_354_849, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(13_u64)) .saturating_add(RocksDbWeight::get().writes(12_u64)) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(s.into()))) @@ -1170,10 +1209,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `66672` // Estimated: `70137` - // Minimum execution time: 100_007_000 picoseconds. - Weight::from_parts(894_033_025, 70137) - // Standard Error: 57_584 - .saturating_add(Weight::from_parts(4_870_504, 0).saturating_mul(s.into())) + // Minimum execution time: 104_490_000 picoseconds. + Weight::from_parts(1_162_956_951, 70137) + // Standard Error: 76_760 + .saturating_add(Weight::from_parts(6_485_569, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -1210,10 +1249,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `33297 + n * (377 ±0)` // Estimated: `30944 + n * (3774 ±0)` - // Minimum execution time: 142_575_000 picoseconds. - Weight::from_parts(196_320_577, 30944) - // Standard Error: 29_330 - .saturating_add(Weight::from_parts(45_325_062, 0).saturating_mul(n.into())) + // Minimum execution time: 144_790_000 picoseconds. + Weight::from_parts(36_764_791, 30944) + // Standard Error: 89_592 + .saturating_add(Weight::from_parts(49_620_105, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads(14_u64)) .saturating_add(RocksDbWeight::get().reads((6_u64).saturating_mul(n.into()))) .saturating_add(RocksDbWeight::get().writes(4_u64)) @@ -1237,10 +1276,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `1991 + l * (7 ±0)` // Estimated: `8877` - // Minimum execution time: 81_113_000 picoseconds. - Weight::from_parts(84_470_927, 8877) - // Standard Error: 5_588 - .saturating_add(Weight::from_parts(97_606, 0).saturating_mul(l.into())) + // Minimum execution time: 81_768_000 picoseconds. + Weight::from_parts(85_332_982, 8877) + // Standard Error: 5_380 + .saturating_add(Weight::from_parts(70_298, 0).saturating_mul(l.into())) .saturating_add(RocksDbWeight::get().reads(9_u64)) .saturating_add(RocksDbWeight::get().writes(7_u64)) } @@ -1275,10 +1314,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `2196 + s * (4 ±0)` // Estimated: `6248 + s * (4 ±0)` - // Minimum execution time: 94_810_000 picoseconds. - Weight::from_parts(99_292_156, 6248) - // Standard Error: 3_677 - .saturating_add(Weight::from_parts(1_345_598, 0).saturating_mul(s.into())) + // Minimum execution time: 96_123_000 picoseconds. + Weight::from_parts(100_278_672, 6248) + // Standard Error: 3_487 + .saturating_add(Weight::from_parts(1_326_503, 0).saturating_mul(s.into())) .saturating_add(RocksDbWeight::get().reads(12_u64)) .saturating_add(RocksDbWeight::get().writes(11_u64)) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(s.into()))) @@ -1323,13 +1362,13 @@ impl WeightInfo for () { fn new_era(v: u32, n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0 + n * (720 ±0) + v * (3598 ±0)` - // Estimated: `512390 + n * (3566 ±4) + v * (3566 ±40)` - // Minimum execution time: 583_230_000 picoseconds. - Weight::from_parts(585_794_000, 512390) - // Standard Error: 1_984_644 - .saturating_add(Weight::from_parts(65_914_551, 0).saturating_mul(v.into())) - // Standard Error: 197_758 - .saturating_add(Weight::from_parts(18_105_424, 0).saturating_mul(n.into())) + // Estimated: `512390 + n * (3566 ±0) + v * (3566 ±0)` + // Minimum execution time: 572_893_000 picoseconds. + Weight::from_parts(578_010_000, 512390) + // Standard Error: 2_094_268 + .saturating_add(Weight::from_parts(68_419_710, 0).saturating_mul(v.into())) + // Standard Error: 208_682 + .saturating_add(Weight::from_parts(18_826_175, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads(206_u64)) .saturating_add(RocksDbWeight::get().reads((5_u64).saturating_mul(v.into()))) .saturating_add(RocksDbWeight::get().reads((4_u64).saturating_mul(n.into()))) @@ -1360,12 +1399,12 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `3175 + n * (911 ±0) + v * (395 ±0)` // Estimated: `512390 + n * (3566 ±0) + v * (3566 ±0)` - // Minimum execution time: 33_312_958_000 picoseconds. - Weight::from_parts(4_949_866_209, 512390) - // Standard Error: 402_931 - .saturating_add(Weight::from_parts(16_448_367, 0).saturating_mul(v.into())) - // Standard Error: 402_931 - .saturating_add(Weight::from_parts(25_361_503, 0).saturating_mul(n.into())) + // Minimum execution time: 33_836_205_000 picoseconds. + Weight::from_parts(34_210_443_000, 512390) + // Standard Error: 441_692 + .saturating_add(Weight::from_parts(6_122_533, 0).saturating_mul(v.into())) + // Standard Error: 441_692 + .saturating_add(Weight::from_parts(4_418_264, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads(201_u64)) .saturating_add(RocksDbWeight::get().reads((5_u64).saturating_mul(v.into()))) .saturating_add(RocksDbWeight::get().reads((4_u64).saturating_mul(n.into()))) @@ -1382,10 +1421,10 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `979 + v * (50 ±0)` // Estimated: `3510 + v * (2520 ±0)` - // Minimum execution time: 2_474_646_000 picoseconds. - Weight::from_parts(2_512_113_000, 3510) - // Standard Error: 33_996 - .saturating_add(Weight::from_parts(1_992_173, 0).saturating_mul(v.into())) + // Minimum execution time: 2_454_689_000 picoseconds. + Weight::from_parts(161_771_064, 3510) + // Standard Error: 31_022 + .saturating_add(Weight::from_parts(4_820_158, 0).saturating_mul(v.into())) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(v.into()))) .saturating_add(Weight::from_parts(0, 2520).saturating_mul(v.into())) @@ -1406,8 +1445,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_466_000 picoseconds. - Weight::from_parts(5_861_000, 0) + // Minimum execution time: 5_073_000 picoseconds. + Weight::from_parts(5_452_000, 0) .saturating_add(RocksDbWeight::get().writes(6_u64)) } /// Storage: `Staking::MinCommission` (r:0 w:1) @@ -1426,8 +1465,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_780_000 picoseconds. - Weight::from_parts(4_998_000, 0) + // Minimum execution time: 4_465_000 picoseconds. + Weight::from_parts(4_832_000, 0) .saturating_add(RocksDbWeight::get().writes(6_u64)) } /// Storage: `Staking::Bonded` (r:1 w:0) @@ -1456,8 +1495,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `1939` // Estimated: `6248` - // Minimum execution time: 71_261_000 picoseconds. - Weight::from_parts(72_778_000, 6248) + // Minimum execution time: 71_239_000 picoseconds. + Weight::from_parts(74_649_000, 6248) .saturating_add(RocksDbWeight::get().reads(12_u64)) .saturating_add(RocksDbWeight::get().writes(6_u64)) } @@ -1469,8 +1508,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `691` // Estimated: `3510` - // Minimum execution time: 12_497_000 picoseconds. - Weight::from_parts(13_049_000, 3510) + // Minimum execution time: 12_525_000 picoseconds. + Weight::from_parts(13_126_000, 3510) .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) } @@ -1480,8 +1519,8 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_044_000 picoseconds. - Weight::from_parts(3_278_000, 0) + // Minimum execution time: 2_918_000 picoseconds. + Weight::from_parts(3_176_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } } -- GitLab From bbc2d870b78987d197238450589f15eabe00d821 Mon Sep 17 00:00:00 2001 From: Chevdor Date: Tue, 12 Dec 2023 11:04:01 +0100 Subject: [PATCH 009/191] Upgrade srtool GHA to v0.9.1 (#2655) Upgrade to [srtool-actions v0.9.1](https://github.com/chevdor/srtool-actions/releases/tag/v0.9.1) to fix issue introduced in https://github.com/paritytech/polkadot-sdk/pull/2217 --- .github/workflows/build-and-attach-release-runtimes.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-and-attach-release-runtimes.yml b/.github/workflows/build-and-attach-release-runtimes.yml index 8e0a5ba04b4..a480784aea3 100644 --- a/.github/workflows/build-and-attach-release-runtimes.yml +++ b/.github/workflows/build-and-attach-release-runtimes.yml @@ -23,7 +23,7 @@ jobs: - { name: glutton-westend, package: glutton-westend-runtime, path: cumulus/parachains/runtimes/glutton/glutton-westend } build_config: # Release build has logging disabled and no dev features - - { type: on-chain-release, opts: --features on-chain-release-build } + - { type: on-chain-release, opts: --features on-chain-release-build } # Debug build has logging enabled and developer features - { type: dev-debug-build, opts: --features try-runtime } @@ -35,7 +35,7 @@ jobs: - name: Build ${{ matrix.runtime.name }} ${{ matrix.build_config.type }} id: srtool_build - uses: chevdor/srtool-actions@v0.9.0 + uses: chevdor/srtool-actions@v0.9.1 env: BUILD_OPTS: ${{ matrix.build_config.opts }} with: -- GitLab From 2aaa9af3746b0cf671de9dc98fe2465c7ef59be2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Dec 2023 11:26:44 +0100 Subject: [PATCH 010/191] Bump names from 0.13.0 to 0.14.0 (#2686) Bumps [names](https://github.com/fnichol/names) from 0.13.0 to 0.14.0.
Release notes

Sourced from names's releases.

Release 0.14.0

0.14.0 - 2022-06-28

Changed

  • upgrade to regex 1.5.6
Changelog

Sourced from names's changelog.

[0.14.0] - 2022-06-28

Changed

  • upgrade to regex 1.5.6
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=names&package-manager=cargo&previous-version=0.13.0&new-version=0.14.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 19 +++++-------------- substrate/client/cli/Cargo.toml | 2 +- 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 05e6063cff9..72fa4a8e2bc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1361,8 +1361,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93f2635620bf0b9d4576eb7bb9a38a55df78bd1205d26fa994b25911a69f212f" dependencies = [ "bitcoin_hashes", - "rand 0.8.5", - "rand_core 0.6.4", + "rand 0.7.3", + "rand_core 0.5.1", "serde", "unicode-normalization", ] @@ -8337,15 +8337,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "names" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7d66043b25d4a6cccb23619d10c19c25304b355a7dccd4a8e11423dd2382146" -dependencies = [ - "rand 0.8.5", -] - [[package]] name = "names" version = "0.14.0" @@ -13882,7 +13873,7 @@ dependencies = [ "libc", "libflate", "log", - "names 0.14.0", + "names", "prost", "reqwest", "thiserror", @@ -15056,7 +15047,7 @@ dependencies = [ "itertools 0.10.5", "libp2p-identity", "log", - "names 0.13.0", + "names", "parity-scale-codec", "rand 0.8.5", "regex", @@ -19950,7 +19941,7 @@ checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" dependencies = [ "cfg-if", "digest 0.10.7", - "rand 0.8.5", + "rand 0.7.3", "static_assertions", ] diff --git a/substrate/client/cli/Cargo.toml b/substrate/client/cli/Cargo.toml index 1f3e8f44f82..de303975031 100644 --- a/substrate/client/cli/Cargo.toml +++ b/substrate/client/cli/Cargo.toml @@ -21,7 +21,7 @@ futures = "0.3.21" itertools = "0.10.3" libp2p-identity = { version = "0.1.3", features = ["ed25519", "peerid"] } log = "0.4.17" -names = { version = "0.13.0", default-features = false } +names = { version = "0.14.0", default-features = false } parity-scale-codec = "3.6.1" rand = "0.8.5" regex = "1.6.0" -- GitLab From ef62acfbcfefbbed5bcf934447578c9e9ef07eec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Tue, 12 Dec 2023 12:37:52 +0100 Subject: [PATCH 011/191] pallet-uniques: Move migration over to `VersionedMigration` (#2687) --- prdoc/pr_2687.prdoc | 18 +++++++ substrate/frame/uniques/src/migration.rs | 65 ++++++++++++------------ 2 files changed, 51 insertions(+), 32 deletions(-) create mode 100644 prdoc/pr_2687.prdoc diff --git a/prdoc/pr_2687.prdoc b/prdoc/pr_2687.prdoc new file mode 100644 index 00000000000..90e635d8052 --- /dev/null +++ b/prdoc/pr_2687.prdoc @@ -0,0 +1,18 @@ +title: "pallet-uniques: Move migration over to `VersionedMigration`" + +doc: + - audience: Runtime Dev + description: | + Moves the migration over to `VersionedMigration`. Thus, if you had + used `migrate_to_v1` before in a custom `OnRuntimeUpgrade` implementation + you can now directly use the `MigrateV0ToV1`. + +migrations: + runtime: + - reference: MigrateV0ToV1 + description: | + Migrate the pallet storage from `0` to `1` by initializing + the `CollectionAccount` storage entry from all collections. + +crates: + - name: "pallet-uniques" diff --git a/substrate/frame/uniques/src/migration.rs b/substrate/frame/uniques/src/migration.rs index 6c92b753b4a..6b2bbf375e7 100644 --- a/substrate/frame/uniques/src/migration.rs +++ b/substrate/frame/uniques/src/migration.rs @@ -17,38 +17,39 @@ //! Various pieces of common functionality. use super::*; -use frame_support::traits::{Get, GetStorageVersion, PalletInfoAccess, StorageVersion}; - -/// Migrate the pallet storage to v1. -pub fn migrate_to_v1, I: 'static, P: GetStorageVersion + PalletInfoAccess>( -) -> frame_support::weights::Weight { - let on_chain_storage_version =

::on_chain_storage_version(); - log::info!( - target: LOG_TARGET, - "Running migration storage v1 for uniques with storage version {:?}", - on_chain_storage_version, - ); - - if on_chain_storage_version < 1 { - let mut count = 0; - for (collection, detail) in Collection::::iter() { - CollectionAccount::::insert(&detail.owner, &collection, ()); - count += 1; +use frame_support::traits::{Get, OnRuntimeUpgrade}; +use sp_std::marker::PhantomData; + +mod v1 { + use super::*; + + /// Actual implementation of the storage migration. + pub struct MigrateToV1Impl(PhantomData<(T, I)>); + + impl, I: 'static> OnRuntimeUpgrade for MigrateToV1Impl { + fn on_runtime_upgrade() -> frame_support::weights::Weight { + let mut count = 0; + for (collection, detail) in Collection::::iter() { + CollectionAccount::::insert(&detail.owner, &collection, ()); + count += 1; + } + + log::info!( + target: LOG_TARGET, + "Storage migration v1 for uniques finished.", + ); + + // calculate and return migration weights + T::DbWeight::get().reads_writes(count as u64 + 1, count as u64 + 1) } - StorageVersion::new(1).put::

(); - log::info!( - target: LOG_TARGET, - "Running migration storage v1 for uniques with storage version {:?} was complete", - on_chain_storage_version, - ); - // calculate and return migration weights - T::DbWeight::get().reads_writes(count as u64 + 1, count as u64 + 1) - } else { - log::warn!( - target: LOG_TARGET, - "Attempted to apply migration to v1 but failed because storage version is {:?}", - on_chain_storage_version, - ); - T::DbWeight::get().reads(1) } } + +/// Migrate the pallet storage from `0` to `1`. +pub type MigrateV0ToV1 = frame_support::migrations::VersionedMigration< + 0, + 1, + v1::MigrateToV1Impl, + Pallet, + ::DbWeight, +>; -- GitLab From 6b5995ffd162d88df1e3baeaafe05869d1a7d966 Mon Sep 17 00:00:00 2001 From: Juan Girini Date: Tue, 12 Dec 2023 14:24:27 +0100 Subject: [PATCH 012/191] Add a deprecation section to the Contributing notes (#2248) A brief explanation of the Deprecation Checklist is added to the Contributing notes with a link to it --- docs/contributor/CONTRIBUTING.md | 6 ++++++ docs/contributor/DEPRECATION_CHECKLIST.md | 6 ++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/contributor/CONTRIBUTING.md b/docs/contributor/CONTRIBUTING.md index 3350d134414..96dc86e9780 100644 --- a/docs/contributor/CONTRIBUTING.md +++ b/docs/contributor/CONTRIBUTING.md @@ -152,3 +152,9 @@ We use [zepter](https://github.com/ggwpez/zepter) to enforce features are propag If you're member of **paritytech** org - you can use command-bot to run various of common commands in CI: Start with comment in PR: `bot help` to see the list of available commands. + + +## Deprecating code + +When deprecating and removing code you need to be mindful of how this could impact downstream developers. In order to +mitigate this impact, it is recommended to adhere to the steps outlined in the [Deprecation Checklist](./DEPRECATION_CHECKLIST.md). diff --git a/docs/contributor/DEPRECATION_CHECKLIST.md b/docs/contributor/DEPRECATION_CHECKLIST.md index ffb99e1ec3f..687c0a7cd7d 100644 --- a/docs/contributor/DEPRECATION_CHECKLIST.md +++ b/docs/contributor/DEPRECATION_CHECKLIST.md @@ -1,9 +1,7 @@ # Deprecation Checklist -This deprecation checklist makes sense while we don’t use [SemVer](https://semver.org/). -After that, this document will most likely change. -As deprecation and removal of existing code can happen on any release, we need to be mindful that external builders -could be impacted by the changes we make. +Polkadot SDK is under constant development and improvement, thus deprecation and removal of existing code happen often. +When creating a breaking change we need to be mindful that external builders could be impacted by this. The deprecation checklist tries to mitigate this impact, while still keeping the developer experience, the DevEx, as smooth as possible. -- GitLab From 42a3afba945c88b8e1364c710565299116958dea Mon Sep 17 00:00:00 2001 From: Chevdor Date: Tue, 12 Dec 2023 15:29:56 +0100 Subject: [PATCH 013/191] Changelogs local generation (#1411) This PR introduces a script and some templates to use the prdoc involved in a release and build: - the changelog - a simple draft of audience documentation Since the prdoc presence was enforced in the middle of the version 1.5.0, not all PRs did come with a `prdoc` file. This PR creates all the missing `prdoc` files with some minimum content allowing to properly generate the changelog. The generated content is **not** suitable for the audience documentation. The audience documentation will be possible with the next version, when all PR come with a proper `prdoc`. ## Assumptions - the prdoc files for release `vX.Y.Z` have been moved under `prdoc/X.Y.Z` - the changelog requires for now for the prdoc files to contain author + topic. Thos fields are optional. The build script can be called as: ``` VERSION=X.Y.Z ./scripts/release/build-changelogs.sh ``` Related: - #1408 --------- Co-authored-by: EgorPopelyaev --- Cargo.lock | 4 +- .../assets/asset-hub-rococo/src/lib.rs | 4 +- .../assets/asset-hub-westend/src/lib.rs | 2 +- .../bridge-hubs/bridge-hub-rococo/src/lib.rs | 2 +- .../bridge-hubs/bridge-hub-westend/src/lib.rs | 2 +- .../collectives-westend/src/lib.rs | 2 +- .../contracts/contracts-rococo/src/lib.rs | 2 +- .../glutton/glutton-westend/src/lib.rs | 2 +- .../testing/rococo-parachain/src/lib.rs | 2 +- cumulus/polkadot-parachain/Cargo.toml | 2 +- polkadot/Cargo.toml | 2 +- polkadot/node/primitives/src/lib.rs | 2 +- polkadot/runtime/rococo/src/lib.rs | 2 +- polkadot/runtime/westend/src/lib.rs | 2 +- prdoc/{ => 1.3.0}/pr_1234.prdoc | 0 prdoc/{ => 1.3.0}/pr_1255.prdoc | 0 prdoc/{ => 1.3.0}/pr_1818.prdoc | 0 prdoc/{ => 1.3.0}/pr_1873.prdoc | 0 prdoc/{ => 1.3.0}/pr_1913.prdoc | 0 prdoc/{ => 1.3.0}/pr_1921.prdoc | 0 prdoc/1.3.0/readme.md | 2 + prdoc/{ => 1.4.0}/pr_1178.prdoc | 0 prdoc/{ => 1.4.0}/pr_1246.prdoc | 0 prdoc/{ => 1.4.0}/pr_1256.prdoc | 0 prdoc/{ => 1.4.0}/pr_1805.prdoc | 0 prdoc/{ => 1.4.0}/pr_1926.prdoc | 0 prdoc/{ => 1.4.0}/pr_2086.prdoc | 0 prdoc/{ => 1.4.0}/pr_2107.prdoc | 0 prdoc/{ => 1.4.0}/pr_2165.prdoc | 0 prdoc/1.4.0/readme.md | 2 + prdoc/1.5.0/pr_1370_special.prdoc | 9 ++++ .../pr_1408_prodc-introduction.prdoc | 3 ++ prdoc/1.5.0/pr_1497_special.prdoc | 9 ++++ prdoc/1.5.0/pr_1918_special.prdoc | 9 ++++ .../pr_1946_prdoc_new_schema.prdoc | 3 ++ prdoc/1.5.0/pr_1985_special.prdoc | 9 ++++ prdoc/1.5.0/pr_2001_special.prdoc | 9 ++++ prdoc/1.5.0/pr_2058_special.prdoc | 9 ++++ prdoc/{ => 1.5.0}/pr_2142.prdoc | 3 ++ prdoc/1.5.0/pr_2167_special.prdoc | 9 ++++ prdoc/1.5.0/pr_2174_special.prdoc | 9 ++++ prdoc/1.5.0/pr_2182_special.prdoc | 9 ++++ prdoc/1.5.0/pr_2184_special.prdoc | 9 ++++ prdoc/1.5.0/pr_2221_special.prdoc | 9 ++++ prdoc/1.5.0/pr_2250_special.prdoc | 9 ++++ prdoc/{ => 1.5.0}/pr_2253.prdoc | 3 ++ prdoc/1.5.0/pr_2265_special.prdoc | 9 ++++ prdoc/1.5.0/pr_2300_special.prdoc | 9 ++++ prdoc/1.5.0/pr_2351_special.prdoc | 9 ++++ prdoc/1.5.0/pr_2354_special.prdoc | 9 ++++ prdoc/1.5.0/pr_2361_special.prdoc | 9 ++++ prdoc/1.5.0/pr_2368_special.prdoc | 9 ++++ prdoc/1.5.0/pr_2369_special.prdoc | 9 ++++ prdoc/1.5.0/pr_2377_special.prdoc | 9 ++++ prdoc/1.5.0/pr_2378_special.prdoc | 9 ++++ prdoc/1.5.0/pr_2380_special.prdoc | 9 ++++ prdoc/1.5.0/pr_2381_special.prdoc | 9 ++++ prdoc/1.5.0/pr_2385_special.prdoc | 9 ++++ prdoc/{ => 1.5.0}/pr_2388.prdoc | 8 ++- prdoc/1.5.0/pr_2397_special.prdoc | 9 ++++ prdoc/1.5.0/pr_2406_special.prdoc | 9 ++++ prdoc/1.5.0/pr_2411_special.prdoc | 9 ++++ prdoc/1.5.0/pr_2413_special.prdoc | 9 ++++ prdoc/1.5.0/pr_2426_special.prdoc | 9 ++++ prdoc/1.5.0/pr_2435_special.prdoc | 9 ++++ prdoc/1.5.0/pr_2442_special.prdoc | 9 ++++ prdoc/1.5.0/pr_2446_special.prdoc | 9 ++++ prdoc/1.5.0/pr_2450_special.prdoc | 9 ++++ prdoc/1.5.0/pr_2455_special.prdoc | 9 ++++ prdoc/1.5.0/pr_2457_special.prdoc | 9 ++++ prdoc/1.5.0/pr_2459_special.prdoc | 9 ++++ prdoc/1.5.0/pr_2461_special.prdoc | 9 ++++ prdoc/1.5.0/pr_2462_special.prdoc | 9 ++++ prdoc/1.5.0/pr_2463_special.prdoc | 9 ++++ prdoc/1.5.0/pr_2474_special.prdoc | 9 ++++ prdoc/1.5.0/pr_2483_special.prdoc | 9 ++++ prdoc/{ => 1.5.0}/pr_2486.prdoc | 3 ++ prdoc/1.5.0/pr_2487_special.prdoc | 9 ++++ prdoc/1.5.0/pr_2501_special.prdoc | 9 ++++ prdoc/1.5.0/pr_2509_special.prdoc | 9 ++++ prdoc/1.5.0/pr_2515_special.prdoc | 9 ++++ prdoc/1.5.0/pr_2516_special.prdoc | 9 ++++ prdoc/1.5.0/pr_2521_special.prdoc | 10 ++++ prdoc/1.5.0/pr_2526_special.prdoc | 10 ++++ prdoc/1.5.0/pr_2552_special.prdoc | 10 ++++ prdoc/1.5.0/pr_2555_special.prdoc | 10 ++++ prdoc/1.5.0/pr_2572_special.prdoc | 10 ++++ prdoc/1.5.0/pr_2579_special.prdoc | 10 ++++ prdoc/1.5.0/pr_2581_special.prdoc | 10 ++++ prdoc/1.5.0/pr_2591.prdoc | 12 +++++ prdoc/1.5.0/pr_2602_special.prdoc | 10 ++++ prdoc/1.5.0/pr_2625_special.prdoc | 10 ++++ prdoc/1.5.0/readme.md | 2 + prdoc/pr_2591.prdoc | 9 ---- prdoc/schema_user.json | 10 ++++ scripts/release/build-changelogs.sh | 54 +++++++++++++++++++ scripts/release/templates/audience.md.tera | 13 +++++ scripts/release/templates/changelog.md.tera | 7 +++ 98 files changed, 643 insertions(+), 27 deletions(-) rename prdoc/{ => 1.3.0}/pr_1234.prdoc (100%) rename prdoc/{ => 1.3.0}/pr_1255.prdoc (100%) rename prdoc/{ => 1.3.0}/pr_1818.prdoc (100%) rename prdoc/{ => 1.3.0}/pr_1873.prdoc (100%) rename prdoc/{ => 1.3.0}/pr_1913.prdoc (100%) rename prdoc/{ => 1.3.0}/pr_1921.prdoc (100%) create mode 100644 prdoc/1.3.0/readme.md rename prdoc/{ => 1.4.0}/pr_1178.prdoc (100%) rename prdoc/{ => 1.4.0}/pr_1246.prdoc (100%) rename prdoc/{ => 1.4.0}/pr_1256.prdoc (100%) rename prdoc/{ => 1.4.0}/pr_1805.prdoc (100%) rename prdoc/{ => 1.4.0}/pr_1926.prdoc (100%) rename prdoc/{ => 1.4.0}/pr_2086.prdoc (100%) rename prdoc/{ => 1.4.0}/pr_2107.prdoc (100%) rename prdoc/{ => 1.4.0}/pr_2165.prdoc (100%) create mode 100644 prdoc/1.4.0/readme.md create mode 100644 prdoc/1.5.0/pr_1370_special.prdoc rename prdoc/{ => 1.5.0}/pr_1408_prodc-introduction.prdoc (89%) create mode 100644 prdoc/1.5.0/pr_1497_special.prdoc create mode 100644 prdoc/1.5.0/pr_1918_special.prdoc rename prdoc/{ => 1.5.0}/pr_1946_prdoc_new_schema.prdoc (90%) create mode 100644 prdoc/1.5.0/pr_1985_special.prdoc create mode 100644 prdoc/1.5.0/pr_2001_special.prdoc create mode 100644 prdoc/1.5.0/pr_2058_special.prdoc rename prdoc/{ => 1.5.0}/pr_2142.prdoc (93%) create mode 100644 prdoc/1.5.0/pr_2167_special.prdoc create mode 100644 prdoc/1.5.0/pr_2174_special.prdoc create mode 100644 prdoc/1.5.0/pr_2182_special.prdoc create mode 100644 prdoc/1.5.0/pr_2184_special.prdoc create mode 100644 prdoc/1.5.0/pr_2221_special.prdoc create mode 100644 prdoc/1.5.0/pr_2250_special.prdoc rename prdoc/{ => 1.5.0}/pr_2253.prdoc (95%) create mode 100644 prdoc/1.5.0/pr_2265_special.prdoc create mode 100644 prdoc/1.5.0/pr_2300_special.prdoc create mode 100644 prdoc/1.5.0/pr_2351_special.prdoc create mode 100644 prdoc/1.5.0/pr_2354_special.prdoc create mode 100644 prdoc/1.5.0/pr_2361_special.prdoc create mode 100644 prdoc/1.5.0/pr_2368_special.prdoc create mode 100644 prdoc/1.5.0/pr_2369_special.prdoc create mode 100644 prdoc/1.5.0/pr_2377_special.prdoc create mode 100644 prdoc/1.5.0/pr_2378_special.prdoc create mode 100644 prdoc/1.5.0/pr_2380_special.prdoc create mode 100644 prdoc/1.5.0/pr_2381_special.prdoc create mode 100644 prdoc/1.5.0/pr_2385_special.prdoc rename prdoc/{ => 1.5.0}/pr_2388.prdoc (91%) create mode 100644 prdoc/1.5.0/pr_2397_special.prdoc create mode 100644 prdoc/1.5.0/pr_2406_special.prdoc create mode 100644 prdoc/1.5.0/pr_2411_special.prdoc create mode 100644 prdoc/1.5.0/pr_2413_special.prdoc create mode 100644 prdoc/1.5.0/pr_2426_special.prdoc create mode 100644 prdoc/1.5.0/pr_2435_special.prdoc create mode 100644 prdoc/1.5.0/pr_2442_special.prdoc create mode 100644 prdoc/1.5.0/pr_2446_special.prdoc create mode 100644 prdoc/1.5.0/pr_2450_special.prdoc create mode 100644 prdoc/1.5.0/pr_2455_special.prdoc create mode 100644 prdoc/1.5.0/pr_2457_special.prdoc create mode 100644 prdoc/1.5.0/pr_2459_special.prdoc create mode 100644 prdoc/1.5.0/pr_2461_special.prdoc create mode 100644 prdoc/1.5.0/pr_2462_special.prdoc create mode 100644 prdoc/1.5.0/pr_2463_special.prdoc create mode 100644 prdoc/1.5.0/pr_2474_special.prdoc create mode 100644 prdoc/1.5.0/pr_2483_special.prdoc rename prdoc/{ => 1.5.0}/pr_2486.prdoc (95%) create mode 100644 prdoc/1.5.0/pr_2487_special.prdoc create mode 100644 prdoc/1.5.0/pr_2501_special.prdoc create mode 100644 prdoc/1.5.0/pr_2509_special.prdoc create mode 100644 prdoc/1.5.0/pr_2515_special.prdoc create mode 100644 prdoc/1.5.0/pr_2516_special.prdoc create mode 100644 prdoc/1.5.0/pr_2521_special.prdoc create mode 100644 prdoc/1.5.0/pr_2526_special.prdoc create mode 100644 prdoc/1.5.0/pr_2552_special.prdoc create mode 100644 prdoc/1.5.0/pr_2555_special.prdoc create mode 100644 prdoc/1.5.0/pr_2572_special.prdoc create mode 100644 prdoc/1.5.0/pr_2579_special.prdoc create mode 100644 prdoc/1.5.0/pr_2581_special.prdoc create mode 100644 prdoc/1.5.0/pr_2591.prdoc create mode 100644 prdoc/1.5.0/pr_2602_special.prdoc create mode 100644 prdoc/1.5.0/pr_2625_special.prdoc create mode 100644 prdoc/1.5.0/readme.md delete mode 100644 prdoc/pr_2591.prdoc create mode 100755 scripts/release/build-changelogs.sh create mode 100644 scripts/release/templates/audience.md.tera create mode 100644 scripts/release/templates/changelog.md.tera diff --git a/Cargo.lock b/Cargo.lock index 72fa4a8e2bc..e62e7f900c5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11786,7 +11786,7 @@ dependencies = [ [[package]] name = "polkadot" -version = "1.1.0" +version = "1.5.0" dependencies = [ "assert_cmd", "color-eyre", @@ -12756,7 +12756,7 @@ dependencies = [ [[package]] name = "polkadot-parachain-bin" -version = "1.1.0" +version = "1.5.0" dependencies = [ "assert_cmd", "asset-hub-rococo-runtime", diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs index 86000a20b5b..a4a42aa9e88 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs @@ -112,7 +112,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("statemine"), impl_name: create_runtime_str!("statemine"), authoring_version: 1, - spec_version: 1_004_000, + spec_version: 1_005_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 13, @@ -125,7 +125,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("statemine"), impl_name: create_runtime_str!("statemine"), authoring_version: 1, - spec_version: 1_004_000, + spec_version: 1_005_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 13, diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs index 6709a20b275..7443de54cb6 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs @@ -109,7 +109,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("westmint"), impl_name: create_runtime_str!("westmint"), authoring_version: 1, - spec_version: 1_004_000, + spec_version: 1_005_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 13, diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs index 8bd5c196016..1bb2faeb2fc 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs @@ -171,7 +171,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("bridge-hub-rococo"), impl_name: create_runtime_str!("bridge-hub-rococo"), authoring_version: 1, - spec_version: 1_004_000, + spec_version: 1_005_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 3, diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs index 07e664d67be..6157aa90a5a 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs @@ -172,7 +172,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("bridge-hub-westend"), impl_name: create_runtime_str!("bridge-hub-westend"), authoring_version: 1, - spec_version: 1_004_000, + spec_version: 1_005_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 3, diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs index 9135405155b..9074323fe31 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs @@ -114,7 +114,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("collectives-westend"), impl_name: create_runtime_str!("collectives-westend"), authoring_version: 1, - spec_version: 1_004_000, + spec_version: 1_005_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 5, diff --git a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/lib.rs b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/lib.rs index 4ab3014cace..79b6b6be299 100644 --- a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/lib.rs @@ -133,7 +133,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("contracts-rococo"), impl_name: create_runtime_str!("contracts-rococo"), authoring_version: 1, - spec_version: 1_004_000, + spec_version: 1_005_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 6, diff --git a/cumulus/parachains/runtimes/glutton/glutton-westend/src/lib.rs b/cumulus/parachains/runtimes/glutton/glutton-westend/src/lib.rs index c9dc5131644..2c51791c074 100644 --- a/cumulus/parachains/runtimes/glutton/glutton-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/glutton/glutton-westend/src/lib.rs @@ -99,7 +99,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("glutton-westend"), impl_name: create_runtime_str!("glutton-westend"), authoring_version: 1, - spec_version: 1_004_000, + spec_version: 1_005_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 1, diff --git a/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs b/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs index 9d2ba98a67c..4967ca86854 100644 --- a/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs +++ b/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs @@ -106,7 +106,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("test-parachain"), impl_name: create_runtime_str!("test-parachain"), authoring_version: 1, - spec_version: 1_004_000, + spec_version: 1_005_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 6, diff --git a/cumulus/polkadot-parachain/Cargo.toml b/cumulus/polkadot-parachain/Cargo.toml index fed076132a4..860c420d45b 100644 --- a/cumulus/polkadot-parachain/Cargo.toml +++ b/cumulus/polkadot-parachain/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-parachain-bin" -version = "1.1.0" +version = "1.5.0" authors.workspace = true build = "build.rs" edition.workspace = true diff --git a/polkadot/Cargo.toml b/polkadot/Cargo.toml index c0227823c6b..6896d3c4b22 100644 --- a/polkadot/Cargo.toml +++ b/polkadot/Cargo.toml @@ -18,7 +18,7 @@ rust-version = "1.64.0" readme = "README.md" authors.workspace = true edition.workspace = true -version = "1.1.0" +version = "1.5.0" default-run = "polkadot" [dependencies] diff --git a/polkadot/node/primitives/src/lib.rs b/polkadot/node/primitives/src/lib.rs index be62145b999..6ac6b82c223 100644 --- a/polkadot/node/primitives/src/lib.rs +++ b/polkadot/node/primitives/src/lib.rs @@ -58,7 +58,7 @@ pub use disputes::{ /// relatively rare. /// /// The associated worker binaries should use the same version as the node that spawns them. -pub const NODE_VERSION: &'static str = "1.1.0"; +pub const NODE_VERSION: &'static str = "1.5.0"; // For a 16-ary Merkle Prefix Trie, we can expect at most 16 32-byte hashes per node // plus some overhead: diff --git a/polkadot/runtime/rococo/src/lib.rs b/polkadot/runtime/rococo/src/lib.rs index 26cc6d95449..1e40f14f492 100644 --- a/polkadot/runtime/rococo/src/lib.rs +++ b/polkadot/runtime/rococo/src/lib.rs @@ -149,7 +149,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("rococo"), impl_name: create_runtime_str!("parity-rococo-v2.0"), authoring_version: 0, - spec_version: 1_004_000, + spec_version: 1_005_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 22, diff --git a/polkadot/runtime/westend/src/lib.rs b/polkadot/runtime/westend/src/lib.rs index 827a4953ec3..0a70a493b29 100644 --- a/polkadot/runtime/westend/src/lib.rs +++ b/polkadot/runtime/westend/src/lib.rs @@ -145,7 +145,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("westend"), impl_name: create_runtime_str!("parity-westend"), authoring_version: 2, - spec_version: 1_004_000, + spec_version: 1_005_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 22, diff --git a/prdoc/pr_1234.prdoc b/prdoc/1.3.0/pr_1234.prdoc similarity index 100% rename from prdoc/pr_1234.prdoc rename to prdoc/1.3.0/pr_1234.prdoc diff --git a/prdoc/pr_1255.prdoc b/prdoc/1.3.0/pr_1255.prdoc similarity index 100% rename from prdoc/pr_1255.prdoc rename to prdoc/1.3.0/pr_1255.prdoc diff --git a/prdoc/pr_1818.prdoc b/prdoc/1.3.0/pr_1818.prdoc similarity index 100% rename from prdoc/pr_1818.prdoc rename to prdoc/1.3.0/pr_1818.prdoc diff --git a/prdoc/pr_1873.prdoc b/prdoc/1.3.0/pr_1873.prdoc similarity index 100% rename from prdoc/pr_1873.prdoc rename to prdoc/1.3.0/pr_1873.prdoc diff --git a/prdoc/pr_1913.prdoc b/prdoc/1.3.0/pr_1913.prdoc similarity index 100% rename from prdoc/pr_1913.prdoc rename to prdoc/1.3.0/pr_1913.prdoc diff --git a/prdoc/pr_1921.prdoc b/prdoc/1.3.0/pr_1921.prdoc similarity index 100% rename from prdoc/pr_1921.prdoc rename to prdoc/1.3.0/pr_1921.prdoc diff --git a/prdoc/1.3.0/readme.md b/prdoc/1.3.0/readme.md new file mode 100644 index 00000000000..3d74fa34247 --- /dev/null +++ b/prdoc/1.3.0/readme.md @@ -0,0 +1,2 @@ +Version 1.3.0 does not support `prddoc` yet. +Some prdoc files are provided but the list is NOT complete. diff --git a/prdoc/pr_1178.prdoc b/prdoc/1.4.0/pr_1178.prdoc similarity index 100% rename from prdoc/pr_1178.prdoc rename to prdoc/1.4.0/pr_1178.prdoc diff --git a/prdoc/pr_1246.prdoc b/prdoc/1.4.0/pr_1246.prdoc similarity index 100% rename from prdoc/pr_1246.prdoc rename to prdoc/1.4.0/pr_1246.prdoc diff --git a/prdoc/pr_1256.prdoc b/prdoc/1.4.0/pr_1256.prdoc similarity index 100% rename from prdoc/pr_1256.prdoc rename to prdoc/1.4.0/pr_1256.prdoc diff --git a/prdoc/pr_1805.prdoc b/prdoc/1.4.0/pr_1805.prdoc similarity index 100% rename from prdoc/pr_1805.prdoc rename to prdoc/1.4.0/pr_1805.prdoc diff --git a/prdoc/pr_1926.prdoc b/prdoc/1.4.0/pr_1926.prdoc similarity index 100% rename from prdoc/pr_1926.prdoc rename to prdoc/1.4.0/pr_1926.prdoc diff --git a/prdoc/pr_2086.prdoc b/prdoc/1.4.0/pr_2086.prdoc similarity index 100% rename from prdoc/pr_2086.prdoc rename to prdoc/1.4.0/pr_2086.prdoc diff --git a/prdoc/pr_2107.prdoc b/prdoc/1.4.0/pr_2107.prdoc similarity index 100% rename from prdoc/pr_2107.prdoc rename to prdoc/1.4.0/pr_2107.prdoc diff --git a/prdoc/pr_2165.prdoc b/prdoc/1.4.0/pr_2165.prdoc similarity index 100% rename from prdoc/pr_2165.prdoc rename to prdoc/1.4.0/pr_2165.prdoc diff --git a/prdoc/1.4.0/readme.md b/prdoc/1.4.0/readme.md new file mode 100644 index 00000000000..e1a1055d918 --- /dev/null +++ b/prdoc/1.4.0/readme.md @@ -0,0 +1,2 @@ +Version 1.4.0 does not support `prddoc` yet. +Some prdoc files are provided but the list is NOT complete. diff --git a/prdoc/1.5.0/pr_1370_special.prdoc b/prdoc/1.5.0/pr_1370_special.prdoc new file mode 100644 index 00000000000..692a6e03170 --- /dev/null +++ b/prdoc/1.5.0/pr_1370_special.prdoc @@ -0,0 +1,9 @@ +title: Rework the event system of `sc-network` +author: altonen +topic: Node + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/pr_1408_prodc-introduction.prdoc b/prdoc/1.5.0/pr_1408_prodc-introduction.prdoc similarity index 89% rename from prdoc/pr_1408_prodc-introduction.prdoc rename to prdoc/1.5.0/pr_1408_prodc-introduction.prdoc index 85b4661b127..46f56068e27 100644 --- a/prdoc/pr_1408_prodc-introduction.prdoc +++ b/prdoc/1.5.0/pr_1408_prodc-introduction.prdoc @@ -1,6 +1,9 @@ # This PR does not need a prdoc but it is provided in order to test title: PRdoc check +author: chevdor +topic: documentation + doc: - audience: Node Dev description: | diff --git a/prdoc/1.5.0/pr_1497_special.prdoc b/prdoc/1.5.0/pr_1497_special.prdoc new file mode 100644 index 00000000000..3d603548260 --- /dev/null +++ b/prdoc/1.5.0/pr_1497_special.prdoc @@ -0,0 +1,9 @@ +title: Update tick collator for async backing +author: Sophia-Gold +topic: Tests + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_1918_special.prdoc b/prdoc/1.5.0/pr_1918_special.prdoc new file mode 100644 index 00000000000..9220ee970bc --- /dev/null +++ b/prdoc/1.5.0/pr_1918_special.prdoc @@ -0,0 +1,9 @@ +title: Preserve artifact cache unless stale +author: eagr +topic: Node + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/pr_1946_prdoc_new_schema.prdoc b/prdoc/1.5.0/pr_1946_prdoc_new_schema.prdoc similarity index 90% rename from prdoc/pr_1946_prdoc_new_schema.prdoc rename to prdoc/1.5.0/pr_1946_prdoc_new_schema.prdoc index c0632177738..fae063f6b1e 100644 --- a/prdoc/pr_1946_prdoc_new_schema.prdoc +++ b/prdoc/1.5.0/pr_1946_prdoc_new_schema.prdoc @@ -3,6 +3,9 @@ title: New PRDoc Schema +author: chevdor +topic: documentation + doc: - audience: Node Dev description: &desc | diff --git a/prdoc/1.5.0/pr_1985_special.prdoc b/prdoc/1.5.0/pr_1985_special.prdoc new file mode 100644 index 00000000000..c4305d6bb29 --- /dev/null +++ b/prdoc/1.5.0/pr_1985_special.prdoc @@ -0,0 +1,9 @@ +title: Enable parallel key scraping +author: eagr +topic: Node + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2001_special.prdoc b/prdoc/1.5.0/pr_2001_special.prdoc new file mode 100644 index 00000000000..366b5fddb8b --- /dev/null +++ b/prdoc/1.5.0/pr_2001_special.prdoc @@ -0,0 +1,9 @@ +title: "cumulus-consensus-common: block import: `delayed_best_block` flag added" +author: michalkucharczyk +topic: Node + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2058_special.prdoc b/prdoc/1.5.0/pr_2058_special.prdoc new file mode 100644 index 00000000000..6e3c83b09fa --- /dev/null +++ b/prdoc/1.5.0/pr_2058_special.prdoc @@ -0,0 +1,9 @@ +title: "PVF: Add test instructions" +author: mrcnski +topic: Node + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/pr_2142.prdoc b/prdoc/1.5.0/pr_2142.prdoc similarity index 93% rename from prdoc/pr_2142.prdoc rename to prdoc/1.5.0/pr_2142.prdoc index 1d379411346..9cd1b23906d 100644 --- a/prdoc/pr_2142.prdoc +++ b/prdoc/1.5.0/pr_2142.prdoc @@ -1,5 +1,8 @@ title: Cleanup XCMP `QueueConfigData` +author: serban300 +topic: runtime + doc: - audience: Runtime Dev description: Removes obsolete fields from the `QueueConfigData` structure. For the remaining fields, if they use the old defaults, we replace them with the new defaults. diff --git a/prdoc/1.5.0/pr_2167_special.prdoc b/prdoc/1.5.0/pr_2167_special.prdoc new file mode 100644 index 00000000000..7bbde7002a2 --- /dev/null +++ b/prdoc/1.5.0/pr_2167_special.prdoc @@ -0,0 +1,9 @@ +title: "add pallet nomination-pools versioned migration to kitchensink" +author: brunopgalvao +topic: Tests + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2174_special.prdoc b/prdoc/1.5.0/pr_2174_special.prdoc new file mode 100644 index 00000000000..f23d2803e96 --- /dev/null +++ b/prdoc/1.5.0/pr_2174_special.prdoc @@ -0,0 +1,9 @@ +title: "chain-spec-builder: cleanup" +author: michalkucharczyk +topic: Node + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2182_special.prdoc b/prdoc/1.5.0/pr_2182_special.prdoc new file mode 100644 index 00000000000..ad57bf64916 --- /dev/null +++ b/prdoc/1.5.0/pr_2182_special.prdoc @@ -0,0 +1,9 @@ +title: "remove retry from backers on failed candidate validation" +author: Jpserrat +topic: Node + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2184_special.prdoc b/prdoc/1.5.0/pr_2184_special.prdoc new file mode 100644 index 00000000000..b838bf41ba1 --- /dev/null +++ b/prdoc/1.5.0/pr_2184_special.prdoc @@ -0,0 +1,9 @@ +title: Zombienet tests - disputes on finalized blocks +author: Overkillus +topic: Tests + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2221_special.prdoc b/prdoc/1.5.0/pr_2221_special.prdoc new file mode 100644 index 00000000000..dbd8c4a1fc1 --- /dev/null +++ b/prdoc/1.5.0/pr_2221_special.prdoc @@ -0,0 +1,9 @@ +title: "PVF worker: switch on seccomp networking restrictions" +author: mrcnski +topic: Node + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2250_special.prdoc b/prdoc/1.5.0/pr_2250_special.prdoc new file mode 100644 index 00000000000..d3f87b81b92 --- /dev/null +++ b/prdoc/1.5.0/pr_2250_special.prdoc @@ -0,0 +1,9 @@ +title: "crypto: `lazy_static` removed, light parser for address URI added" +author: michalkucharczyk +topic: Node + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/pr_2253.prdoc b/prdoc/1.5.0/pr_2253.prdoc similarity index 95% rename from prdoc/pr_2253.prdoc rename to prdoc/1.5.0/pr_2253.prdoc index 8a6dac754d1..3f69bc2461e 100644 --- a/prdoc/pr_2253.prdoc +++ b/prdoc/1.5.0/pr_2253.prdoc @@ -3,6 +3,9 @@ title: Different builder pattern constructors for XCM +author: franciscoaguirre +topic: runtime + doc: - audience: Runtime Dev description: | diff --git a/prdoc/1.5.0/pr_2265_special.prdoc b/prdoc/1.5.0/pr_2265_special.prdoc new file mode 100644 index 00000000000..336adec03ab --- /dev/null +++ b/prdoc/1.5.0/pr_2265_special.prdoc @@ -0,0 +1,9 @@ +title: Remove im-online pallet from Rococo and Westend +author: s0me0ne-unkn0wn +topic: Pallets + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2300_special.prdoc b/prdoc/1.5.0/pr_2300_special.prdoc new file mode 100644 index 00000000000..407f0766325 --- /dev/null +++ b/prdoc/1.5.0/pr_2300_special.prdoc @@ -0,0 +1,9 @@ +title: '[testnet] Remove Wococo stuff from BridgeHubRococo/AssetHubRococo' +author: bkontur  +topic: Bridges + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2351_special.prdoc b/prdoc/1.5.0/pr_2351_special.prdoc new file mode 100644 index 00000000000..16f9e5d15a7 --- /dev/null +++ b/prdoc/1.5.0/pr_2351_special.prdoc @@ -0,0 +1,9 @@ +title: "frame-system: Add last_runtime_upgrade_spec_version" +author: bkchr +topic: Frame + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2354_special.prdoc b/prdoc/1.5.0/pr_2354_special.prdoc new file mode 100644 index 00000000000..5fbedef0361 --- /dev/null +++ b/prdoc/1.5.0/pr_2354_special.prdoc @@ -0,0 +1,9 @@ +title: "Fix Typo: `PalletXcmExtrinsicsBenchmark`" +author: joepetrowski +topic: Benchmarks + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2361_special.prdoc b/prdoc/1.5.0/pr_2361_special.prdoc new file mode 100644 index 00000000000..d44b87287c4 --- /dev/null +++ b/prdoc/1.5.0/pr_2361_special.prdoc @@ -0,0 +1,9 @@ +title: "[ci] Enable zombienet jobs in PRs" +author: alvicsam +topic: Tests + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2368_special.prdoc b/prdoc/1.5.0/pr_2368_special.prdoc new file mode 100644 index 00000000000..e8ebcb38d30 --- /dev/null +++ b/prdoc/1.5.0/pr_2368_special.prdoc @@ -0,0 +1,9 @@ +title: "implementers-guide: update github link" +author: ordian +topic: Documentation + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2369_special.prdoc b/prdoc/1.5.0/pr_2369_special.prdoc new file mode 100644 index 00000000000..ebcc533712d --- /dev/null +++ b/prdoc/1.5.0/pr_2369_special.prdoc @@ -0,0 +1,9 @@ +title: "[NPoS] Check if staker is exposed in paged exposure storage entries" +author: Ank4n +topic: Pallets + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2377_special.prdoc b/prdoc/1.5.0/pr_2377_special.prdoc new file mode 100644 index 00000000000..2985db6f3f8 --- /dev/null +++ b/prdoc/1.5.0/pr_2377_special.prdoc @@ -0,0 +1,9 @@ +title: "fix typo" +author: cuteolaf +topic: Documentation + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2378_special.prdoc b/prdoc/1.5.0/pr_2378_special.prdoc new file mode 100644 index 00000000000..bdc96500094 --- /dev/null +++ b/prdoc/1.5.0/pr_2378_special.prdoc @@ -0,0 +1,9 @@ +title: "Beefy: small fixes" +author: serban300 +topic: Bridges + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2380_special.prdoc b/prdoc/1.5.0/pr_2380_special.prdoc new file mode 100644 index 00000000000..058be28bf5d --- /dev/null +++ b/prdoc/1.5.0/pr_2380_special.prdoc @@ -0,0 +1,9 @@ +title: Deprecate `RewardDestination::Controller` +author: rossbulat +topic: XCM + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2381_special.prdoc b/prdoc/1.5.0/pr_2381_special.prdoc new file mode 100644 index 00000000000..eb4020424d7 --- /dev/null +++ b/prdoc/1.5.0/pr_2381_special.prdoc @@ -0,0 +1,9 @@ +title: Make collator RPC mode non-experimental +author: skunert +topic: Cumulus + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2385_special.prdoc b/prdoc/1.5.0/pr_2385_special.prdoc new file mode 100644 index 00000000000..a5239d30652 --- /dev/null +++ b/prdoc/1.5.0/pr_2385_special.prdoc @@ -0,0 +1,9 @@ +title: "Relax `force_default_xcm_version` for testnet system parachains" +author: bkontur +topic: Cumulus + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/pr_2388.prdoc b/prdoc/1.5.0/pr_2388.prdoc similarity index 91% rename from prdoc/pr_2388.prdoc rename to prdoc/1.5.0/pr_2388.prdoc index fa560197aff..8f79097b8f6 100644 --- a/prdoc/pr_2388.prdoc +++ b/prdoc/1.5.0/pr_2388.prdoc @@ -3,8 +3,11 @@ title: Add new flexible `pallet_xcm::transfer_assets()` call/extrinsic +author: acatangiu +topic: runtime + doc: - - audience: Builder + - audience: Runtime Dev description: | For complex combinations of asset transfers where assets and fees may have different reserves or different reserve/teleport trust configurations, users can use the newly added `transfer_assets()` @@ -21,6 +24,7 @@ migrations: runtime: [] -crates: pallet-xcm +crates: + - name: pallet-xcm host_functions: [] diff --git a/prdoc/1.5.0/pr_2397_special.prdoc b/prdoc/1.5.0/pr_2397_special.prdoc new file mode 100644 index 00000000000..5f07b269b1e --- /dev/null +++ b/prdoc/1.5.0/pr_2397_special.prdoc @@ -0,0 +1,9 @@ +title: "Pools: Add `MaxUnbonding` to metadata" +author: rossbulat +topic: Pallets + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2406_special.prdoc b/prdoc/1.5.0/pr_2406_special.prdoc new file mode 100644 index 00000000000..3fdb7ad8cf2 --- /dev/null +++ b/prdoc/1.5.0/pr_2406_special.prdoc @@ -0,0 +1,9 @@ +title: Refactor ValidationError +author: eagr +topic: Node + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2411_special.prdoc b/prdoc/1.5.0/pr_2411_special.prdoc new file mode 100644 index 00000000000..0bc01e66903 --- /dev/null +++ b/prdoc/1.5.0/pr_2411_special.prdoc @@ -0,0 +1,9 @@ +title: "polkadot-node-subsystems: `ChainApiBackend` added + polkadot-debug image version fixed" +author: michalkucharczyk +topic: Tests + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2413_special.prdoc b/prdoc/1.5.0/pr_2413_special.prdoc new file mode 100644 index 00000000000..38083ba845b --- /dev/null +++ b/prdoc/1.5.0/pr_2413_special.prdoc @@ -0,0 +1,9 @@ +title: "Update documentation for `SafeMode` and `TxPause` Pallets" +author: wilwade +topic: Documentation + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2426_special.prdoc b/prdoc/1.5.0/pr_2426_special.prdoc new file mode 100644 index 00000000000..a0f5ab8ac5b --- /dev/null +++ b/prdoc/1.5.0/pr_2426_special.prdoc @@ -0,0 +1,9 @@ +title: "PVF: Fix unshare `no such file or directory` error" +author: mrcnski +topic: Node + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2435_special.prdoc b/prdoc/1.5.0/pr_2435_special.prdoc new file mode 100644 index 00000000000..b2bb7a2b815 --- /dev/null +++ b/prdoc/1.5.0/pr_2435_special.prdoc @@ -0,0 +1,9 @@ +title: "pallet-staking: Converts all math operations to safe" +author: gpestanaar +topic: Pallets + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2442_special.prdoc b/prdoc/1.5.0/pr_2442_special.prdoc new file mode 100644 index 00000000000..52e672e765f --- /dev/null +++ b/prdoc/1.5.0/pr_2442_special.prdoc @@ -0,0 +1,9 @@ +title: "Fixes cumulus README instructions" +author: gpestana +topic: Documentation + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2446_special.prdoc b/prdoc/1.5.0/pr_2446_special.prdoc new file mode 100644 index 00000000000..9fec1ad139c --- /dev/null +++ b/prdoc/1.5.0/pr_2446_special.prdoc @@ -0,0 +1,9 @@ +title: "sp-api: Move macro related re-exports to `__private`" +author: bkchr +topic: Runtime API + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2450_special.prdoc b/prdoc/1.5.0/pr_2450_special.prdoc new file mode 100644 index 00000000000..343e71fbf6d --- /dev/null +++ b/prdoc/1.5.0/pr_2450_special.prdoc @@ -0,0 +1,9 @@ +title: Adapt test worker to profile flag +author: eagr +topic: Node + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2455_special.prdoc b/prdoc/1.5.0/pr_2455_special.prdoc new file mode 100644 index 00000000000..928b8467807 --- /dev/null +++ b/prdoc/1.5.0/pr_2455_special.prdoc @@ -0,0 +1,9 @@ +title: "Remove `RuntimeApi` dependency on system parachain runtime code" +author: seadanda +topic: "System Parachains" + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2457_special.prdoc b/prdoc/1.5.0/pr_2457_special.prdoc new file mode 100644 index 00000000000..ca6401206f4 --- /dev/null +++ b/prdoc/1.5.0/pr_2457_special.prdoc @@ -0,0 +1,9 @@ +title: "polkadot-parachain: one chain-spec for all" +author: michalkucharczyk +topic: "System Parachains" + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2459_special.prdoc b/prdoc/1.5.0/pr_2459_special.prdoc new file mode 100644 index 00000000000..125f390f4ac --- /dev/null +++ b/prdoc/1.5.0/pr_2459_special.prdoc @@ -0,0 +1,9 @@ +title: '[NPoS] Use `EraInfo` to manipulate exposure in fast-unstake tests' +author: Ank4n +topic: Pallets,Tests + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2461_special.prdoc b/prdoc/1.5.0/pr_2461_special.prdoc new file mode 100644 index 00000000000..60a46714ca4 --- /dev/null +++ b/prdoc/1.5.0/pr_2461_special.prdoc @@ -0,0 +1,9 @@ +title: "PVF: remove audit log access" +author: mrcnski +topic: Node + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2462_special.prdoc b/prdoc/1.5.0/pr_2462_special.prdoc new file mode 100644 index 00000000000..ae1f1486327 --- /dev/null +++ b/prdoc/1.5.0/pr_2462_special.prdoc @@ -0,0 +1,9 @@ +title: "relay-chain-consensus: set a fork_choice" +author: michalkucharczyk +topic: Node + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2463_special.prdoc b/prdoc/1.5.0/pr_2463_special.prdoc new file mode 100644 index 00000000000..0f35d50036f --- /dev/null +++ b/prdoc/1.5.0/pr_2463_special.prdoc @@ -0,0 +1,9 @@ +title: Add `on-chain-release-build` feature for Collectives Westend +author: liamaharon +topic: System Parachains + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2474_special.prdoc b/prdoc/1.5.0/pr_2474_special.prdoc new file mode 100644 index 00000000000..42d67b5efa6 --- /dev/null +++ b/prdoc/1.5.0/pr_2474_special.prdoc @@ -0,0 +1,9 @@ +title: "Pools: Add ability to configure commission claiming permissions" +author: rossbulat +topic: Pallets + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2483_special.prdoc b/prdoc/1.5.0/pr_2483_special.prdoc new file mode 100644 index 00000000000..21fb045cae8 --- /dev/null +++ b/prdoc/1.5.0/pr_2483_special.prdoc @@ -0,0 +1,9 @@ +title: Remove `dmp-queue`` pallet from Rococo Asset Hub and Bridge Hub +author: liamaharon +topic: Frame + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/pr_2486.prdoc b/prdoc/1.5.0/pr_2486.prdoc similarity index 95% rename from prdoc/pr_2486.prdoc rename to prdoc/1.5.0/pr_2486.prdoc index 0d50a7279d1..c716f71c34e 100644 --- a/prdoc/pr_2486.prdoc +++ b/prdoc/1.5.0/pr_2486.prdoc @@ -1,5 +1,8 @@ title: "PVF: Add Secure Validator Mode" +author: mrcnski +topic: node + doc: - audience: Node Operator description: | diff --git a/prdoc/1.5.0/pr_2487_special.prdoc b/prdoc/1.5.0/pr_2487_special.prdoc new file mode 100644 index 00000000000..3d6a2e11e26 --- /dev/null +++ b/prdoc/1.5.0/pr_2487_special.prdoc @@ -0,0 +1,9 @@ +title: "Do not pollute global base path with export genesis/wasm" +author: bkchr +topic: Cumulus + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2501_special.prdoc b/prdoc/1.5.0/pr_2501_special.prdoc new file mode 100644 index 00000000000..125b9452c98 --- /dev/null +++ b/prdoc/1.5.0/pr_2501_special.prdoc @@ -0,0 +1,9 @@ +title: "Staking: `chill_other` takes stash instead of controller" +author: rossbulat +topic: Pallets + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2509_special.prdoc b/prdoc/1.5.0/pr_2509_special.prdoc new file mode 100644 index 00000000000..03ebfd80c96 --- /dev/null +++ b/prdoc/1.5.0/pr_2509_special.prdoc @@ -0,0 +1,9 @@ +title: "Breaking: Remove long deprecated `AllPalletsWithoutSystemReversed`" +author: skunert +topic: Frame + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2515_special.prdoc b/prdoc/1.5.0/pr_2515_special.prdoc new file mode 100644 index 00000000000..4664058f86c --- /dev/null +++ b/prdoc/1.5.0/pr_2515_special.prdoc @@ -0,0 +1,9 @@ +title: Set `frame_system::LastRuntimeUpgrade` after running `try-runtime migrations` +author: liamaharon +topic: Frame + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2516_special.prdoc b/prdoc/1.5.0/pr_2516_special.prdoc new file mode 100644 index 00000000000..5d452b63e59 --- /dev/null +++ b/prdoc/1.5.0/pr_2516_special.prdoc @@ -0,0 +1,9 @@ +title: Remove `dmp_queue pallet` from Westend SP runtimes +author: liamaharon +topic: Frame + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2521_special.prdoc b/prdoc/1.5.0/pr_2521_special.prdoc new file mode 100644 index 00000000000..3b70150619e --- /dev/null +++ b/prdoc/1.5.0/pr_2521_special.prdoc @@ -0,0 +1,10 @@ +title: 'substrate-node: `NativeElseWasmExecutor` is no longer used' + +author: michalkucharczyk +topic: node + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2526_special.prdoc b/prdoc/1.5.0/pr_2526_special.prdoc new file mode 100644 index 00000000000..6008d7bfa9d --- /dev/null +++ b/prdoc/1.5.0/pr_2526_special.prdoc @@ -0,0 +1,10 @@ +title: Remove `pov-recovery` race condition/Improve zombienet test + +author: skunert +topic: testing + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2552_special.prdoc b/prdoc/1.5.0/pr_2552_special.prdoc new file mode 100644 index 00000000000..9f0140c8142 --- /dev/null +++ b/prdoc/1.5.0/pr_2552_special.prdoc @@ -0,0 +1,10 @@ +title: Withdraw Assets Before Checking Out in OnReapIdentity impl + +author: joepetrowski +topic: xcm + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2555_special.prdoc b/prdoc/1.5.0/pr_2555_special.prdoc new file mode 100644 index 00000000000..f817810f433 --- /dev/null +++ b/prdoc/1.5.0/pr_2555_special.prdoc @@ -0,0 +1,10 @@ +title: Remove dependency on rand's SliceRandom shuffle implementation in `gossip-support` + +author: rphmeier +topic: node + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2572_special.prdoc b/prdoc/1.5.0/pr_2572_special.prdoc new file mode 100644 index 00000000000..9d4c285798c --- /dev/null +++ b/prdoc/1.5.0/pr_2572_special.prdoc @@ -0,0 +1,10 @@ +title: Add missing glossary to ref docs + +author: juangirini +topic: documentation + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2579_special.prdoc b/prdoc/1.5.0/pr_2579_special.prdoc new file mode 100644 index 00000000000..2992c92a8c5 --- /dev/null +++ b/prdoc/1.5.0/pr_2579_special.prdoc @@ -0,0 +1,10 @@ +title: "impl guide: update PVF host page; add diagrams" + +author: mrcnsk +topic: documentation + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2581_special.prdoc b/prdoc/1.5.0/pr_2581_special.prdoc new file mode 100644 index 00000000000..ebe5855b401 --- /dev/null +++ b/prdoc/1.5.0/pr_2581_special.prdoc @@ -0,0 +1,10 @@ +title: 'Bandersnatch: `ring-context` generic over domain size' + +author: davxy +topic: node + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2591.prdoc b/prdoc/1.5.0/pr_2591.prdoc new file mode 100644 index 00000000000..f827e70af8b --- /dev/null +++ b/prdoc/1.5.0/pr_2591.prdoc @@ -0,0 +1,12 @@ +title: Ensure to cleanup state in `remove_member` + +author: bkchr +topic: runtime + +doc: + - audience: Runtime Dev + description: | + Cleans up the state properly if a member of a ranked collective is removed. + +crates: + - name: pallet-ranked-collective diff --git a/prdoc/1.5.0/pr_2602_special.prdoc b/prdoc/1.5.0/pr_2602_special.prdoc new file mode 100644 index 00000000000..56896348b4f --- /dev/null +++ b/prdoc/1.5.0/pr_2602_special.prdoc @@ -0,0 +1,10 @@ +title: 'Bridges subtree update' + +author: bkontur +topic: bridges + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/pr_2625_special.prdoc b/prdoc/1.5.0/pr_2625_special.prdoc new file mode 100644 index 00000000000..21803d93dca --- /dev/null +++ b/prdoc/1.5.0/pr_2625_special.prdoc @@ -0,0 +1,10 @@ +title: Bridges update subtree + +author: bkontur +topic: bridges + +doc: + - audience: Runtime Dev + description: n/a + +crates: [] diff --git a/prdoc/1.5.0/readme.md b/prdoc/1.5.0/readme.md new file mode 100644 index 00000000000..14b6d603314 --- /dev/null +++ b/prdoc/1.5.0/readme.md @@ -0,0 +1,2 @@ +Version 1.5.0 does not fully support `prddoc` yet. +While the list is complete, not all prdoc files have a valid or accurate content. diff --git a/prdoc/pr_2591.prdoc b/prdoc/pr_2591.prdoc deleted file mode 100644 index fe967cb6785..00000000000 --- a/prdoc/pr_2591.prdoc +++ /dev/null @@ -1,9 +0,0 @@ -title: Ensure to cleanup state in remove_member - -doc: - - audience: Runtime Dev - description: | - Cleanes up the state properly if a member of a ranked collective is removed. - -crates: - - name: pallet-ranked-collective diff --git a/prdoc/schema_user.json b/prdoc/schema_user.json index 60ff28d3626..82215d51866 100644 --- a/prdoc/schema_user.json +++ b/prdoc/schema_user.json @@ -17,6 +17,16 @@ "type": "string", "description": "Title for the PR. This is what will show up in the release notes.\nif needed, you may provide a different title override for each audience in the `doc` property." }, + "author": { + "title": "Author handle", + "type": "string", + "description": "Author handle" + }, + "topic": { + "title": "Topic", + "type": "string", + "description": "Topic" + }, "doc": { "type": "array", diff --git a/scripts/release/build-changelogs.sh b/scripts/release/build-changelogs.sh new file mode 100755 index 00000000000..a9275f45a50 --- /dev/null +++ b/scripts/release/build-changelogs.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash + +export PRODUCT=polkadot +export VERSION=${VERSION:-1.5.0} + +PROJECT_ROOT=`git rev-parse --show-toplevel` +echo $PROJECT_ROOT + +TMP=$(mktemp -d) +TEMPLATE_AUDIENCE="${PROJECT_ROOT}/scripts/release/templates/audience.md.tera" +TEMPLATE_CHANGELOG="${PROJECT_ROOT}/scripts/release/templates/changelog.md.tera" + +DATA_JSON="${TMP}/data.json" +CONTEXT_JSON="${TMP}/context.json" +echo -e "TEMPLATE_AUDIENCE: \t$TEMPLATE_AUDIENCE" +echo -e "DATA_JSON: \t\t$DATA_JSON" +echo -e "CONTEXT_JSON: \t\t$CONTEXT_JSON" + +# Create output folder +OUTPUT="${TMP}/changelogs/$PRODUCT/$VERSION" +echo -e "OUTPUT: \t\t$OUTPUT" +mkdir -p $OUTPUT + +prdoc load -d "$PROJECT_ROOT/prdoc/$VERSION" --json > $DATA_JSON +# ls -al $DATA_JSON + +cat $DATA_JSON | jq ' { "prdoc" : .}' > $CONTEXT_JSON +# ls -al $CONTEXT_JSON + +# Fetch the list of valid audiences +SCHEMA_URL=https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json +SCHEMA=$(curl -s $SCHEMA_URL | sed 's|^//.*||') +AUDIENCE_ARRAY=$(echo -E $SCHEMA | jq -r '."$defs".audience.oneOf[] | .const') + +readarray -t audiences < <(echo "$AUDIENCE_ARRAY") +declare -p audiences + + +# Generate a changelog +echo "Generating changelog..." +tera -t "${TEMPLATE_CHANGELOG}" --env --env-key env "${CONTEXT_JSON}" > "$OUTPUT/changelog.md" +echo "Changelog ready in $OUTPUT/changelog.md" + +# Generate a release notes doc per audience +for audience in "${audiences[@]}"; do + audience_id="$(tr [A-Z] [a-z] <<< "$audience")" + audience_id="$(tr ' ' '_' <<< "$audience_id")" + echo "Processing audience: $audience ($audience_id)" + export TARGET_AUDIENCE=$audience + tera -t "${TEMPLATE_AUDIENCE}" --env --env-key env "${CONTEXT_JSON}" > "$OUTPUT/relnote_${audience_id}.md" +done + +# Show the files +tree -s -h -c $OUTPUT/ diff --git a/scripts/release/templates/audience.md.tera b/scripts/release/templates/audience.md.tera new file mode 100644 index 00000000000..dc507053dd5 --- /dev/null +++ b/scripts/release/templates/audience.md.tera @@ -0,0 +1,13 @@ +## Release {{ env.PRODUCT }} {{ env.VERSION }} + +Changelog for `{{ env.TARGET_AUDIENCE }}`. + +{% for file in prdoc -%} +#### PR #{{file.doc_filename.number}}: {{ file.content.title }} +{% for doc_item in file.content.doc %} +{%- if doc_item.audience == env.TARGET_AUDIENCE %} +{{ doc_item.description }} +{% endif -%} + +{%- endfor %} +{%- endfor %} diff --git a/scripts/release/templates/changelog.md.tera b/scripts/release/templates/changelog.md.tera new file mode 100644 index 00000000000..aaba761e8e4 --- /dev/null +++ b/scripts/release/templates/changelog.md.tera @@ -0,0 +1,7 @@ +## Changelog for `{{ env.PRODUCT | capitalize }} v{{ env.VERSION }}` + +{% for file in prdoc | sort(attribute="doc_filename.number") -%} +{%- set author= file.content.author | default(value="n/a") -%} +{%- set topic= file.content.topic | default(value="n/a") -%} +- #{{file.doc_filename.number}}: {{ file.content.title }} (@{{ author }}) [{{ topic | capitalize }}] +{% endfor -%} -- GitLab From 575b8f8d15c860f31cc0d5aeb680bbc1025c374a Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Tue, 12 Dec 2023 16:04:26 +0100 Subject: [PATCH 014/191] Ensure xcm versions over bridge (on sending chains) (#2481) ## Summary This pull request proposes a solution for improved control of the versioned XCM flow over the bridge (across different consensus chains) and resolves the situation where the sending chain/consensus has already migrated to a higher XCM version than the receiving chain/consensus. ## Problem/Motivation The current flow over the bridge involves a transfer from AssetHubRococo (AHR) to BridgeHubRococo (BHR) to BridgeHubWestend (BHW) and finally to AssetHubWestend (AHW), beginning with a reserve-backed transfer on AHR. In this process: 1. AHR sends XCM `ExportMessage` through `XcmpQueue`, incorporating XCM version checks using the `WrapVersion` feature, influenced by `pallet_xcm::SupportedVersion` (managed by `pallet_xcm::force_xcm_version` or version discovery). 2. BHR handles the `ExportMessage` instruction, utilizing the latest XCM version. The `HaulBlobExporter` converts the inner XCM to [`VersionedXcm::from`](https://github.com/paritytech/polkadot-sdk/blob/63ac2471aa0210f0ac9903bdd7d8f9351f9a635f/polkadot/xcm/xcm-builder/src/universal_exports.rs#L465-L467), also using the latest XCM version. However, challenges arise: - Incompatibility when BHW uses a different version than BHR. For instance, if BHR migrates to **XCMv4** while BHW remains on **XCMv3**, BHR's `VersionedXcm::from` uses `VersionedXcm::V4` variant, causing encoding issues for BHW. ``` /// Just a simulation of possible error, which could happen on BHW /// (this code is based on actual master without XCMv4) let encoded = hex_literal::hex!("0400"); println!("{:?}", VersionedXcm::<()>::decode(&mut &encoded[..])); Err(Error { cause: None, desc: "Could not decode `VersionedXcm`, variant doesn't exist" }) ``` - Similar compatibility issues exist between AHR and AHW. ## Solution This pull request introduces the following solutions: 1. **New trait `CheckVersion`** - added to the `xcm` module and exposing `pallet_xcm::SupportedVersion`. This enhancement allows checking the actual XCM version for desired destinations outside of the `pallet_xcm` module. 2. **Version Check in `HaulBlobExporter`** uses `CheckVersion` to check known/configured destination versions, ensuring compatibility. For example, in the scenario mentioned, BHR can store the version `3` for BHW. If BHR is on XCMv4, it will attempt to downgrade the message to version `3` instead of using the latest version `4`. 3. **Version Check in `pallet-xcm-bridge-hub-router`** - this check ensures compatibility with the real destination's XCM version, preventing the unnecessary sending of messages to the local bridge hub if versions are incompatible. These additions aim to improve the control and compatibility of XCM flows over the bridge and addressing issues related to version mismatches. ## Possible alternative solution _(More investigation is needed, and at the very least, it should extend to XCMv4/5. If this proves to be a viable option, I can open an RFC for XCM.)._ Add the `XcmVersion` attribute to the `ExportMessage` so that the sending chain can determine, based on what is stored in `pallet_xcm::SupportedVersion`, the version the destination is using. This way, we may not need to handle the version in `HaulBlobExporter`. ``` ExportMessage { network: NetworkId, destination: InteriorMultiLocation, xcm: Xcm<()> destination_xcm_version: Version, // <- new attritbute }, ``` ``` pub trait ExportXcm { fn validate( network: NetworkId, channel: u32, universal_source: &mut Option, destination: &mut Option, message: &mut Option>, destination_xcm_version: Version, , // <- new attritbute ) -> SendResult; ``` ## Future Directions This PR does not fix version discovery over bridge, further investigation will be conducted here: https://github.com/paritytech/polkadot-sdk/issues/2417. ## TODO - [x] `pallet_xcm` mock for tests uses hard-coded XCM version `2` - change to 3 or lastest? - [x] fix `pallet-xcm-bridge-hub-router` - [x] fix HaulBlobExporter with version determination [here](https://github.com/paritytech/polkadot-sdk/blob/2183669d05f9b510f979a0cc3c7847707bacba2e/polkadot/xcm/xcm-builder/src/universal_exports.rs#L465) - [x] add unit-tests to the runtimes - [x] run benchmarks for `ExportMessage` - [x] extend local run scripts about `force_xcm_version(dest, version)` - [ ] when merged, prepare governance calls for Rococo/Westend - [ ] add PRDoc Part of: https://github.com/paritytech/parity-bridges-common/issues/2719 --------- Co-authored-by: command-bot <> --- Cargo.lock | 2 + .../src/messages_xcm_extension.rs | 22 ++ .../xcm-bridge-hub-router/src/benchmarking.rs | 12 +- .../modules/xcm-bridge-hub-router/src/lib.rs | 96 +++++---- .../modules/xcm-bridge-hub-router/src/mock.rs | 20 +- .../modules/xcm-bridge-hub/src/exporter.rs | 3 +- bridges/modules/xcm-bridge-hub/src/lib.rs | 28 ++- bridges/modules/xcm-bridge-hub/src/mock.rs | 8 +- .../assets/asset-hub-rococo/src/lib.rs | 5 +- .../assets/asset-hub-westend/src/lib.rs | 5 +- .../bridges/bridge-hub-rococo/src/lib.rs | 3 +- .../bridges/bridge-hub-westend/src/lib.rs | 3 +- .../emulated/common/src/impls.rs | 55 ++++- .../bridges/bridge-hub-rococo/Cargo.toml | 1 + .../bridges/bridge-hub-rococo/src/lib.rs | 4 +- .../src/tests/asset_transfers.rs | 70 +------ .../bridge-hub-rococo/src/tests/mod.rs | 96 +++++++++ .../bridge-hub-rococo/src/tests/send_xcm.rs | 122 ++++++++++- .../bridges/bridge-hub-westend/Cargo.toml | 1 + .../bridges/bridge-hub-westend/src/lib.rs | 4 +- .../src/tests/asset_transfers.rs | 70 +------ .../bridge-hub-westend/src/tests/mod.rs | 96 +++++++++ .../bridge-hub-westend/src/tests/send_xcm.rs | 122 ++++++++++- .../assets/asset-hub-rococo/src/lib.rs | 22 +- .../weights/pallet_xcm_bridge_hub_router.rs | 32 +-- .../assets/asset-hub-rococo/tests/tests.rs | 9 +- .../assets/asset-hub-westend/src/lib.rs | 20 +- .../weights/pallet_xcm_bridge_hub_router.rs | 46 ++-- .../assets/asset-hub-westend/tests/tests.rs | 12 +- .../src/bridge_to_westend_config.rs | 21 +- .../bridge-hubs/bridge-hub-rococo/src/lib.rs | 17 +- .../xcm/pallet_xcm_benchmarks_generic.rs | 136 ++++++------ .../bridge-hub-rococo/tests/tests.rs | 14 +- .../src/bridge_to_rococo_config.rs | 21 +- .../bridge-hubs/bridge-hub-westend/src/lib.rs | 15 ++ .../xcm/pallet_xcm_benchmarks_generic.rs | 196 +++++++++--------- .../bridge-hub-westend/tests/tests.rs | 15 +- .../bridge-hubs/test-utils/src/test_cases.rs | 60 ++++-- .../parachains/runtimes/test-utils/src/lib.rs | 2 +- cumulus/scripts/bridges_common.sh | 14 +- cumulus/scripts/bridges_rococo_westend.sh | 33 +++ .../generate_hex_encoded_call/index.js | 10 +- polkadot/xcm/pallet-xcm/src/lib.rs | 8 +- polkadot/xcm/pallet-xcm/src/mock.rs | 13 +- polkadot/xcm/pallet-xcm/src/tests/mod.rs | 73 ++++++- polkadot/xcm/src/lib.rs | 20 +- .../src/tests/bridging/local_para_para.rs | 9 +- .../src/tests/bridging/local_relay_relay.rs | 9 +- .../xcm/xcm-builder/src/tests/bridging/mod.rs | 1 + .../tests/bridging/paid_remote_relay_relay.rs | 3 +- .../src/tests/bridging/remote_para_para.rs | 3 +- .../bridging/remote_para_para_via_relay.rs | 3 +- .../src/tests/bridging/remote_relay_relay.rs | 3 +- .../xcm/xcm-builder/src/universal_exports.rs | 68 ++++-- prdoc/pr_2481.prdoc | 13 ++ 55 files changed, 1279 insertions(+), 490 deletions(-) create mode 100644 prdoc/pr_2481.prdoc diff --git a/Cargo.lock b/Cargo.lock index e62e7f900c5..ba8cccca1ed 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1883,6 +1883,7 @@ dependencies = [ "parachains-common", "parity-scale-codec", "rococo-westend-system-emulated-network", + "sp-runtime", "staging-xcm", "staging-xcm-executor", ] @@ -2048,6 +2049,7 @@ dependencies = [ "parachains-common", "parity-scale-codec", "rococo-westend-system-emulated-network", + "sp-runtime", "staging-xcm", "staging-xcm-executor", ] diff --git a/bridges/bin/runtime-common/src/messages_xcm_extension.rs b/bridges/bin/runtime-common/src/messages_xcm_extension.rs index 0159ede6481..53c0579c4cd 100644 --- a/bridges/bin/runtime-common/src/messages_xcm_extension.rs +++ b/bridges/bin/runtime-common/src/messages_xcm_extension.rs @@ -309,6 +309,28 @@ impl LocalXcmQueueManager { } } +/// Adapter for the implementation of `GetVersion`, which attempts to find the minimal +/// configured XCM version between the destination `dest` and the bridge hub location provided as +/// `Get`. +pub struct XcmVersionOfDestAndRemoteBridge( + sp_std::marker::PhantomData<(Version, RemoteBridge)>, +); +impl> GetVersion + for XcmVersionOfDestAndRemoteBridge +{ + fn get_version_for(dest: &MultiLocation) -> Option { + let dest_version = Version::get_version_for(dest); + let bridge_hub_version = Version::get_version_for(&RemoteBridge::get()); + + match (dest_version, bridge_hub_version) { + (Some(dv), Some(bhv)) => Some(sp_std::cmp::min(dv, bhv)), + (Some(dv), None) => Some(dv), + (None, Some(bhv)) => Some(bhv), + (None, None) => None, + } + } +} + #[cfg(test)] mod tests { use super::*; diff --git a/bridges/modules/xcm-bridge-hub-router/src/benchmarking.rs b/bridges/modules/xcm-bridge-hub-router/src/benchmarking.rs index c4d1e3971e7..922e4bf94ba 100644 --- a/bridges/modules/xcm-bridge-hub-router/src/benchmarking.rs +++ b/bridges/modules/xcm-bridge-hub-router/src/benchmarking.rs @@ -21,7 +21,7 @@ use crate::{Bridge, Call}; use bp_xcm_bridge_hub_router::{BridgeState, MINIMAL_DELIVERY_FEE_FACTOR}; -use frame_benchmarking::benchmarks_instance_pallet; +use frame_benchmarking::{benchmarks_instance_pallet, BenchmarkError}; use frame_support::traits::{EnsureOrigin, Get, Hooks, UnfilteredDispatchable}; use sp_runtime::traits::Zero; use xcm::prelude::*; @@ -37,11 +37,11 @@ pub trait Config: crate::Config { /// Returns destination which is valid for this router instance. /// (Needs to pass `T::Bridges`) /// Make sure that `SendXcm` will pass. - fn ensure_bridged_target_destination() -> MultiLocation { - MultiLocation::new( + fn ensure_bridged_target_destination() -> Result { + Ok(MultiLocation::new( Self::UniversalLocation::get().len() as u8, X1(GlobalConsensus(Self::BridgedNetworkId::get().unwrap())), - ) + )) } } @@ -61,7 +61,7 @@ benchmarks_instance_pallet! { delivery_fee_factor: MINIMAL_DELIVERY_FEE_FACTOR + MINIMAL_DELIVERY_FEE_FACTOR, }); - let _ = T::ensure_bridged_target_destination(); + let _ = T::ensure_bridged_target_destination()?; T::make_congested(); }: { crate::Pallet::::on_initialize(Zero::zero()) @@ -81,7 +81,7 @@ benchmarks_instance_pallet! { } send_message { - let dest = T::ensure_bridged_target_destination(); + let dest = T::ensure_bridged_target_destination()?; let xcm = sp_std::vec![].into(); // make local queue congested, because it means additional db write diff --git a/bridges/modules/xcm-bridge-hub-router/src/lib.rs b/bridges/modules/xcm-bridge-hub-router/src/lib.rs index cf51ef82412..229628aedcb 100644 --- a/bridges/modules/xcm-bridge-hub-router/src/lib.rs +++ b/bridges/modules/xcm-bridge-hub-router/src/lib.rs @@ -89,6 +89,8 @@ pub mod pallet { /// **possible fee**. Allows to externalize better control over allowed **bridged /// networks/locations**. type Bridges: ExporterFor; + /// Checks the XCM version for the destination. + type DestinationVersion: GetVersion; /// Origin of the sibling bridge hub that is allowed to report bridge status. type BridgeHubOrigin: EnsureOrigin; @@ -319,12 +321,13 @@ impl, I: 'static> SendXcm for Pallet { dest: &mut Option, xcm: &mut Option>, ) -> SendResult { - // we won't have an access to `dest` and `xcm` in the `delvier` method, so precompute + // `dest` and `xcm` are required here + let dest_ref = dest.as_ref().ok_or(SendError::MissingArgument)?; + let xcm_ref = xcm.as_ref().ok_or(SendError::MissingArgument)?; + + // we won't have an access to `dest` and `xcm` in the `deliver` method, so precompute // everything required here - let message_size = xcm - .as_ref() - .map(|xcm| xcm.encoded_size() as _) - .ok_or(SendError::MissingArgument)?; + let message_size = xcm_ref.encoded_size() as _; // bridge doesn't support oversized/overweight messages now. So it is better to drop such // messages here than at the bridge hub. Let's check the message size. @@ -332,6 +335,18 @@ impl, I: 'static> SendXcm for Pallet { return Err(SendError::ExceedsMaxMessageSize) } + // We need to ensure that the known `dest`'s XCM version can comprehend the current `xcm` + // program. This may seem like an additional, unnecessary check, but it is not. A similar + // check is probably performed by the `ViaBridgeHubExporter`, which attempts to send a + // versioned message to the sibling bridge hub. However, the local bridge hub may have a + // higher XCM version than the remote `dest`. Once again, it is better to discard such + // messages here than at the bridge hub (e.g., to avoid losing funds). + let destination_version = T::DestinationVersion::get_version_for(dest_ref) + .ok_or(SendError::DestinationUnsupported)?; + let _ = VersionedXcm::from(xcm_ref.clone()) + .into_version(destination_version) + .map_err(|()| SendError::DestinationUnsupported)?; + // just use exporter to validate destination and insert instructions to pay message fee // at the sibling/child bridge hub // @@ -358,6 +373,7 @@ impl, I: 'static> SendXcm for Pallet { #[cfg(test)] mod tests { use super::*; + use frame_support::assert_ok; use mock::*; use frame_support::traits::Hooks; @@ -451,6 +467,19 @@ mod tests { }); } + #[test] + fn destination_unsupported_if_wrap_version_fails() { + run_test(|| { + assert_eq!( + send_xcm::( + UnknownXcmVersionLocation::get(), + vec![ClearOrigin].into(), + ), + Err(SendError::DestinationUnsupported), + ); + }); + } + #[test] fn returns_proper_delivery_price() { run_test(|| { @@ -488,17 +517,14 @@ mod tests { fn sent_message_doesnt_increase_factor_if_xcm_channel_is_uncongested() { run_test(|| { let old_bridge = XcmBridgeHubRouter::bridge(); - assert_eq!( - send_xcm::( - MultiLocation::new( - 2, - X2(GlobalConsensus(BridgedNetworkId::get()), Parachain(1000)) - ), - vec![ClearOrigin].into(), - ) - .map(drop), - Ok(()), - ); + assert_ok!(send_xcm::( + MultiLocation::new( + 2, + X2(GlobalConsensus(BridgedNetworkId::get()), Parachain(1000)) + ), + vec![ClearOrigin].into(), + ) + .map(drop)); assert!(TestToBridgeHubSender::is_message_sent()); assert_eq!(old_bridge, XcmBridgeHubRouter::bridge()); @@ -511,17 +537,14 @@ mod tests { TestWithBridgeHubChannel::make_congested(); let old_bridge = XcmBridgeHubRouter::bridge(); - assert_eq!( - send_xcm::( - MultiLocation::new( - 2, - X2(GlobalConsensus(BridgedNetworkId::get()), Parachain(1000)) - ), - vec![ClearOrigin].into(), - ) - .map(drop), - Ok(()), - ); + assert_ok!(send_xcm::( + MultiLocation::new( + 2, + X2(GlobalConsensus(BridgedNetworkId::get()), Parachain(1000)) + ), + vec![ClearOrigin].into(), + ) + .map(drop)); assert!(TestToBridgeHubSender::is_message_sent()); assert!( @@ -536,17 +559,14 @@ mod tests { Bridge::::put(congested_bridge(MINIMAL_DELIVERY_FEE_FACTOR)); let old_bridge = XcmBridgeHubRouter::bridge(); - assert_eq!( - send_xcm::( - MultiLocation::new( - 2, - X2(GlobalConsensus(BridgedNetworkId::get()), Parachain(1000)) - ), - vec![ClearOrigin].into(), - ) - .map(drop), - Ok(()), - ); + assert_ok!(send_xcm::( + MultiLocation::new( + 2, + X2(GlobalConsensus(BridgedNetworkId::get()), Parachain(1000)) + ), + vec![ClearOrigin].into(), + ) + .map(drop)); assert!(TestToBridgeHubSender::is_message_sent()); assert!( diff --git a/bridges/modules/xcm-bridge-hub-router/src/mock.rs b/bridges/modules/xcm-bridge-hub-router/src/mock.rs index 2d173ebc045..9079f4b9c4c 100644 --- a/bridges/modules/xcm-bridge-hub-router/src/mock.rs +++ b/bridges/modules/xcm-bridge-hub-router/src/mock.rs @@ -19,7 +19,10 @@ use crate as pallet_xcm_bridge_hub_router; use bp_xcm_bridge_hub_router::XcmChannelStatusProvider; -use frame_support::{construct_runtime, derive_impl, parameter_types}; +use frame_support::{ + construct_runtime, derive_impl, parameter_types, + traits::{Contains, Equals}, +}; use frame_system::EnsureRoot; use sp_runtime::{traits::ConstU128, BuildStorage}; use xcm::prelude::*; @@ -58,6 +61,7 @@ parameter_types! { Some((BridgeFeeAsset::get(), BASE_FEE).into()) ) ]; + pub UnknownXcmVersionLocation: MultiLocation = MultiLocation::new(2, X2(GlobalConsensus(BridgedNetworkId::get()), Parachain(9999))); } #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] @@ -71,6 +75,8 @@ impl pallet_xcm_bridge_hub_router::Config<()> for TestRuntime { type UniversalLocation = UniversalLocation; type BridgedNetworkId = BridgedNetworkId; type Bridges = NetworkExportTable; + type DestinationVersion = + LatestOrNoneForLocationVersionChecker>; type BridgeHubOrigin = EnsureRoot; type ToBridgeHubSender = TestToBridgeHubSender; @@ -80,6 +86,18 @@ impl pallet_xcm_bridge_hub_router::Config<()> for TestRuntime { type FeeAsset = BridgeFeeAsset; } +pub struct LatestOrNoneForLocationVersionChecker(sp_std::marker::PhantomData); +impl> GetVersion + for LatestOrNoneForLocationVersionChecker +{ + fn get_version_for(dest: &MultiLocation) -> Option { + if Location::contains(dest) { + return None + } + Some(XCM_VERSION) + } +} + pub struct TestToBridgeHubSender; impl TestToBridgeHubSender { diff --git a/bridges/modules/xcm-bridge-hub/src/exporter.rs b/bridges/modules/xcm-bridge-hub/src/exporter.rs index 445551d6934..5318b222c54 100644 --- a/bridges/modules/xcm-bridge-hub/src/exporter.rs +++ b/bridges/modules/xcm-bridge-hub/src/exporter.rs @@ -33,7 +33,8 @@ use xcm_executor::traits::ExportXcm; /// An easy way to access `HaulBlobExporter`. pub type PalletAsHaulBlobExporter = HaulBlobExporter< DummyHaulBlob, - >::BridgedNetworkId, + >::BridgedNetwork, + >::DestinationVersion, >::MessageExportPrice, >; /// An easy way to access associated messages pallet. diff --git a/bridges/modules/xcm-bridge-hub/src/lib.rs b/bridges/modules/xcm-bridge-hub/src/lib.rs index 14439a4d8ff..44f6903b018 100644 --- a/bridges/modules/xcm-bridge-hub/src/lib.rs +++ b/bridges/modules/xcm-bridge-hub/src/lib.rs @@ -37,6 +37,7 @@ pub mod pallet { use super::*; use bridge_runtime_common::messages_xcm_extension::SenderAndLane; use frame_support::pallet_prelude::*; + use frame_system::pallet_prelude::BlockNumberFor; #[pallet::config] #[pallet::disable_frame_system_supertrait_check] @@ -48,15 +49,17 @@ pub mod pallet { // TODO: https://github.com/paritytech/parity-bridges-common/issues/1666 remove `ChainId` and // replace it with the `NetworkId` - then we'll be able to use // `T as pallet_bridge_messages::Config::BridgedChain::NetworkId` - /// Bridged network id. + /// Bridged network as relative location of bridged `GlobalConsensus`. #[pallet::constant] - type BridgedNetworkId: Get; + type BridgedNetwork: Get; /// Associated messages pallet instance that bridges us with the /// `BridgedNetworkId` consensus. type BridgeMessagesPalletInstance: 'static; /// Price of single message export to the bridged consensus (`Self::BridgedNetworkId`). type MessageExportPrice: Get; + /// Checks the XCM version for the destination. + type DestinationVersion: GetVersion; /// Get point-to-point links with bridged consensus (`Self::BridgedNetworkId`). /// (this will be replaced with dynamic on-chain bridges - `Bridges V2`) @@ -69,6 +72,17 @@ pub mod pallet { #[pallet::pallet] pub struct Pallet(PhantomData<(T, I)>); + #[pallet::hooks] + impl, I: 'static> Hooks> for Pallet { + fn integrity_test() { + assert!( + Self::bridged_network_id().is_some(), + "Configured `T::BridgedNetwork`: {:?} does not contain `GlobalConsensus` junction with `NetworkId`", + T::BridgedNetwork::get() + ) + } + } + impl, I: 'static> Pallet { /// Returns dedicated/configured lane identifier. pub(crate) fn lane_for( @@ -83,7 +97,7 @@ pub mod pallet { .find_map(|(lane_source, (lane_dest_network, lane_dest))| { if lane_source.location == source && &lane_dest_network == dest.0 && - &T::BridgedNetworkId::get() == dest.0 && + Self::bridged_network_id().as_ref() == Some(dest.0) && &lane_dest == dest.1 { Some(lane_source) @@ -92,5 +106,13 @@ pub mod pallet { } }) } + + /// Returns some `NetworkId` if contains `GlobalConsensus` junction. + fn bridged_network_id() -> Option { + match T::BridgedNetwork::get().take_first_interior() { + Some(GlobalConsensus(network)) => Some(network), + _ => None, + } + } } } diff --git a/bridges/modules/xcm-bridge-hub/src/mock.rs b/bridges/modules/xcm-bridge-hub/src/mock.rs index 7766aac1fb7..8edd4b1f7aa 100644 --- a/bridges/modules/xcm-bridge-hub/src/mock.rs +++ b/bridges/modules/xcm-bridge-hub/src/mock.rs @@ -170,6 +170,10 @@ impl pallet_bridge_messages::WeightInfoExt for TestMessagesWeights { parameter_types! { pub const RelayNetwork: NetworkId = NetworkId::Kusama; pub const BridgedRelayNetwork: NetworkId = NetworkId::Polkadot; + pub const BridgedRelayNetworkLocation: MultiLocation = MultiLocation { + parents: 1, + interior: X1(GlobalConsensus(BridgedRelayNetwork::get())) + }; pub const NonBridgedRelayNetwork: NetworkId = NetworkId::Rococo; pub const BridgeReserve: Balance = 100_000; pub UniversalLocation: InteriorMultiLocation = X2( @@ -181,10 +185,12 @@ parameter_types! { impl pallet_xcm_bridge_hub::Config for TestRuntime { type UniversalLocation = UniversalLocation; - type BridgedNetworkId = BridgedRelayNetwork; + type BridgedNetwork = BridgedRelayNetworkLocation; type BridgeMessagesPalletInstance = (); type MessageExportPrice = (); + type DestinationVersion = AlwaysLatest; + type Lanes = TestLanes; type LanesSupport = TestXcmBlobHauler; } diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/src/lib.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/src/lib.rs index 877edceae32..05454a2e573 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/src/lib.rs @@ -21,8 +21,8 @@ use frame_support::traits::OnInitialize; // Cumulus use emulated_integration_tests_common::{ impl_accounts_helpers_for_parachain, impl_assert_events_helpers_for_parachain, - impl_assets_helpers_for_parachain, impl_foreign_assets_helpers_for_parachain, impls::Parachain, - xcm_emulator::decl_test_parachains, + impl_assets_helpers_for_parachain, impl_foreign_assets_helpers_for_parachain, + impl_xcm_helpers_for_parachain, impls::Parachain, xcm_emulator::decl_test_parachains, }; use rococo_emulated_chain::Rococo; @@ -55,3 +55,4 @@ impl_accounts_helpers_for_parachain!(AssetHubRococo); impl_assert_events_helpers_for_parachain!(AssetHubRococo); impl_assets_helpers_for_parachain!(AssetHubRococo, Rococo); impl_foreign_assets_helpers_for_parachain!(AssetHubRococo, Rococo); +impl_xcm_helpers_for_parachain!(AssetHubRococo); diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/src/lib.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/src/lib.rs index 1c017c63c6f..56382fad564 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/src/lib.rs @@ -21,8 +21,8 @@ use frame_support::traits::OnInitialize; // Cumulus use emulated_integration_tests_common::{ impl_accounts_helpers_for_parachain, impl_assert_events_helpers_for_parachain, - impl_assets_helpers_for_parachain, impl_foreign_assets_helpers_for_parachain, impls::Parachain, - xcm_emulator::decl_test_parachains, + impl_assets_helpers_for_parachain, impl_foreign_assets_helpers_for_parachain, + impl_xcm_helpers_for_parachain, impls::Parachain, xcm_emulator::decl_test_parachains, }; use westend_emulated_chain::Westend; @@ -55,3 +55,4 @@ impl_accounts_helpers_for_parachain!(AssetHubWestend); impl_assert_events_helpers_for_parachain!(AssetHubWestend); impl_assets_helpers_for_parachain!(AssetHubWestend, Westend); impl_foreign_assets_helpers_for_parachain!(AssetHubWestend, Westend); +impl_xcm_helpers_for_parachain!(AssetHubWestend); diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/src/lib.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/src/lib.rs index 8e5b29e6561..8162823dfce 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/src/lib.rs @@ -21,7 +21,7 @@ use frame_support::traits::OnInitialize; // Cumulus use emulated_integration_tests_common::{ impl_accounts_helpers_for_parachain, impl_assert_events_helpers_for_parachain, - impls::Parachain, xcm_emulator::decl_test_parachains, + impl_xcm_helpers_for_parachain, impls::Parachain, xcm_emulator::decl_test_parachains, }; // BridgeHubRococo Parachain declaration @@ -47,3 +47,4 @@ decl_test_parachains! { // BridgeHubRococo implementation impl_accounts_helpers_for_parachain!(BridgeHubRococo); impl_assert_events_helpers_for_parachain!(BridgeHubRococo); +impl_xcm_helpers_for_parachain!(BridgeHubRococo); diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/src/lib.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/src/lib.rs index a774f31b0fb..c996b8045e7 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/src/lib.rs @@ -21,7 +21,7 @@ use frame_support::traits::OnInitialize; // Cumulus use emulated_integration_tests_common::{ impl_accounts_helpers_for_parachain, impl_assert_events_helpers_for_parachain, - impls::Parachain, xcm_emulator::decl_test_parachains, + impl_xcm_helpers_for_parachain, impls::Parachain, xcm_emulator::decl_test_parachains, }; // BridgeHubWestend Parachain declaration @@ -47,3 +47,4 @@ decl_test_parachains! { // BridgeHubWestend implementation impl_accounts_helpers_for_parachain!(BridgeHubWestend); impl_assert_events_helpers_for_parachain!(BridgeHubWestend); +impl_xcm_helpers_for_parachain!(BridgeHubWestend); diff --git a/cumulus/parachains/integration-tests/emulated/common/src/impls.rs b/cumulus/parachains/integration-tests/emulated/common/src/impls.rs index 768784ac067..42b5847d17c 100644 --- a/cumulus/parachains/integration-tests/emulated/common/src/impls.rs +++ b/cumulus/parachains/integration-tests/emulated/common/src/impls.rs @@ -38,7 +38,7 @@ pub use polkadot_runtime_parachains::{ inclusion::{AggregateMessageOrigin, UmpQueueId}, }; pub use xcm::{ - prelude::{MultiLocation, OriginKind, Outcome, VersionedXcm}, + prelude::{MultiLocation, OriginKind, Outcome, VersionedXcm, XcmVersion}, v3::Error, DoubleEncoded, }; @@ -173,10 +173,14 @@ macro_rules! impl_accounts_helpers_for_relay_chain { pub fn fund_accounts(accounts: Vec<($crate::impls::AccountId, $crate::impls::Balance)>) { ::execute_with(|| { for account in accounts { + let who = account.0; + let actual = ]>::Balances::free_balance(&who); + let actual = actual.saturating_add(]>::Balances::reserved_balance(&who)); + $crate::impls::assert_ok!(]>::Balances::force_set_balance( ::RuntimeOrigin::root(), - account.0.into(), - account.1, + who.into(), + actual.saturating_add(account.1), )); } }); @@ -386,15 +390,26 @@ macro_rules! impl_accounts_helpers_for_parachain { pub fn fund_accounts(accounts: Vec<($crate::impls::AccountId, $crate::impls::Balance)>) { ::execute_with(|| { for account in accounts { + let who = account.0; + let actual = ]>::Balances::free_balance(&who); + let actual = actual.saturating_add(]>::Balances::reserved_balance(&who)); + $crate::impls::assert_ok!(]>::Balances::force_set_balance( ::RuntimeOrigin::root(), - account.0.into(), - account.1, + who.into(), + actual.saturating_add(account.1), )); } }); } + /// Fund a sovereign account of sibling para. + pub fn fund_para_sovereign(sibling_para_id: $crate::impls::ParaId, balance: $crate::impls::Balance) { + let sibling_location = Self::sibling_location_of(sibling_para_id); + let sovereign_account = Self::sovereign_account_id_of(sibling_location); + Self::fund_accounts(vec![(sovereign_account.into(), balance)]) + } + /// Return local sovereign account of `para_id` on other `network_id` pub fn sovereign_account_of_parachain_on_other_global_consensus( network_id: $crate::impls::NetworkId, @@ -790,3 +805,33 @@ macro_rules! impl_foreign_assets_helpers_for_parachain { } }; } + +#[macro_export] +macro_rules! impl_xcm_helpers_for_parachain { + ( $chain:ident ) => { + $crate::impls::paste::paste! { + impl $chain { + /// Set XCM version for destination. + pub fn force_xcm_version(dest: $crate::impls::MultiLocation, version: $crate::impls::XcmVersion) { + ::execute_with(|| { + $crate::impls::assert_ok!(]>::PolkadotXcm::force_xcm_version( + ::RuntimeOrigin::root(), + $crate::impls::bx!(dest), + version, + )); + }); + } + + /// Set default/safe XCM version for runtime. + pub fn force_default_xcm_version(version: Option<$crate::impls::XcmVersion>) { + ::execute_with(|| { + $crate::impls::assert_ok!(]>::PolkadotXcm::force_default_xcm_version( + ::RuntimeOrigin::root(), + version, + )); + }); + } + } + } + } +} diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/Cargo.toml index 826b55507ed..4f33505f9a7 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/Cargo.toml @@ -15,6 +15,7 @@ frame-support = { path = "../../../../../../../substrate/frame/support", default pallet-assets = { path = "../../../../../../../substrate/frame/assets", default-features = false } pallet-balances = { path = "../../../../../../../substrate/frame/balances", default-features = false } pallet-message-queue = { path = "../../../../../../../substrate/frame/message-queue" } +sp-runtime = { path = "../../../../../../../substrate/primitives/runtime", default-features = false } # Polkadot xcm = { package = "staging-xcm", path = "../../../../../../../polkadot/xcm", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/lib.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/lib.rs index 53665437887..4ae2c6cc902 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/lib.rs @@ -14,10 +14,12 @@ // limitations under the License. // Substrate -pub use frame_support::assert_ok; +pub use frame_support::{assert_err, assert_ok, pallet_prelude::DispatchResult}; +pub use sp_runtime::DispatchError; // Polkadot pub use xcm::{ + latest::ParentThen, prelude::{AccountId32 as AccountId32Junction, *}, v3::{ Error, diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/asset_transfers.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/asset_transfers.rs index c55613f2826..5a2111a9be9 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/asset_transfers.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/asset_transfers.rs @@ -13,70 +13,22 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::*; +use crate::tests::*; fn send_asset_from_asset_hub_rococo_to_asset_hub_westend(id: MultiLocation, amount: u128) { - let signed_origin = - ::RuntimeOrigin::signed(AssetHubRococoSender::get().into()); - let asset_hub_westend_para_id = AssetHubWestend::para_id().into(); - let destination = MultiLocation { - parents: 2, - interior: X2(GlobalConsensus(NetworkId::Westend), Parachain(asset_hub_westend_para_id)), - }; - let beneficiary_id = AssetHubWestendReceiver::get(); - let beneficiary: MultiLocation = - AccountId32Junction { network: None, id: beneficiary_id.into() }.into(); - let assets: MultiAssets = (id, amount).into(); - let fee_asset_item = 0; + let destination = asset_hub_westend_location(); // fund the AHR's SA on BHR for paying bridge transport fees - let ahr_as_seen_by_bhr = BridgeHubRococo::sibling_location_of(AssetHubRococo::para_id()); - let sov_ahr_on_bhr = BridgeHubRococo::sovereign_account_id_of(ahr_as_seen_by_bhr); - BridgeHubRococo::fund_accounts(vec![(sov_ahr_on_bhr.into(), 10_000_000_000_000u128)]); - - AssetHubRococo::execute_with(|| { - assert_ok!( - ::PolkadotXcm::limited_reserve_transfer_assets( - signed_origin, - bx!(destination.into()), - bx!(beneficiary.into()), - bx!(assets.into()), - fee_asset_item, - WeightLimit::Unlimited, - ) - ); - }); + BridgeHubRococo::fund_para_sovereign(AssetHubRococo::para_id(), 10_000_000_000_000u128); - BridgeHubRococo::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; - assert_expected_events!( - BridgeHubRococo, - vec![ - // pay for bridge fees - RuntimeEvent::Balances(pallet_balances::Event::Withdraw { .. }) => {}, - // message exported - RuntimeEvent::BridgeWestendMessages( - pallet_bridge_messages::Event::MessageAccepted { .. } - ) => {}, - // message processed successfully - RuntimeEvent::MessageQueue( - pallet_message_queue::Event::Processed { success: true, .. } - ) => {}, - ] - ); - }); - BridgeHubWestend::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; - assert_expected_events!( - BridgeHubWestend, - vec![ - // message dispatched successfully - RuntimeEvent::XcmpQueue( - cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. } - ) => {}, - ] - ); - }); + // set XCM versions + AssetHubRococo::force_xcm_version(destination, XCM_VERSION); + BridgeHubRococo::force_xcm_version(bridge_hub_westend_location(), XCM_VERSION); + + // send message over bridge + assert_ok!(send_asset_from_asset_hub_rococo(destination, (id, amount))); + assert_bridge_hub_rococo_message_accepted(true); + assert_bridge_hub_westend_message_received(); } #[test] diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/mod.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/mod.rs index 4e2ef1434fd..d102dd2e5d6 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/mod.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/mod.rs @@ -13,6 +13,102 @@ // See the License for the specific language governing permissions and // limitations under the License. +use crate::*; + mod asset_transfers; mod send_xcm; mod teleport; + +pub(crate) fn asset_hub_westend_location() -> MultiLocation { + MultiLocation { + parents: 2, + interior: X2( + GlobalConsensus(NetworkId::Westend), + Parachain(AssetHubWestend::para_id().into()), + ), + } +} + +pub(crate) fn bridge_hub_westend_location() -> MultiLocation { + MultiLocation { + parents: 2, + interior: X2( + GlobalConsensus(NetworkId::Westend), + Parachain(BridgeHubWestend::para_id().into()), + ), + } +} + +pub(crate) fn send_asset_from_asset_hub_rococo( + destination: MultiLocation, + (id, amount): (MultiLocation, u128), +) -> DispatchResult { + let signed_origin = + ::RuntimeOrigin::signed(AssetHubRococoSender::get().into()); + + let beneficiary: MultiLocation = + AccountId32Junction { network: None, id: AssetHubWestendReceiver::get().into() }.into(); + + let assets: MultiAssets = (id, amount).into(); + let fee_asset_item = 0; + + AssetHubRococo::execute_with(|| { + ::PolkadotXcm::limited_reserve_transfer_assets( + signed_origin, + bx!(destination.into()), + bx!(beneficiary.into()), + bx!(assets.into()), + fee_asset_item, + WeightLimit::Unlimited, + ) + }) +} + +pub(crate) fn assert_bridge_hub_rococo_message_accepted(expected_processed: bool) { + BridgeHubRococo::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + + if expected_processed { + assert_expected_events!( + BridgeHubRococo, + vec![ + // pay for bridge fees + RuntimeEvent::Balances(pallet_balances::Event::Withdraw { .. }) => {}, + // message exported + RuntimeEvent::BridgeWestendMessages( + pallet_bridge_messages::Event::MessageAccepted { .. } + ) => {}, + // message processed successfully + RuntimeEvent::MessageQueue( + pallet_message_queue::Event::Processed { success: true, .. } + ) => {}, + ] + ); + } else { + assert_expected_events!( + BridgeHubRococo, + vec![ + RuntimeEvent::MessageQueue(pallet_message_queue::Event::Processed { + success: false, + .. + }) => {}, + ] + ); + } + }); +} + +pub(crate) fn assert_bridge_hub_westend_message_received() { + BridgeHubWestend::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + assert_expected_events!( + BridgeHubWestend, + vec![ + // message sent to destination + RuntimeEvent::XcmpQueue( + cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. } + ) => {}, + ] + ); + }) +} diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/send_xcm.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/send_xcm.rs index b31a17034b9..a3a7d96a14a 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/send_xcm.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/send_xcm.rs @@ -13,7 +13,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::*; +use crate::tests::*; #[test] fn send_xcm_from_rococo_relay_to_westend_asset_hub_should_fail_on_not_applicable() { @@ -55,17 +55,123 @@ fn send_xcm_from_rococo_relay_to_westend_asset_hub_should_fail_on_not_applicable }); // Receive XCM message in Bridge Hub source Parachain, it should fail, because we don't have // opened bridge/lane. - BridgeHubRococo::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; + assert_bridge_hub_rococo_message_accepted(false); +} + +#[test] +fn send_xcm_through_opened_lane_with_different_xcm_version_on_hops_works() { + // Initially set only default version on all runtimes + AssetHubRococo::force_default_xcm_version(Some(xcm::v2::prelude::XCM_VERSION)); + BridgeHubRococo::force_default_xcm_version(Some(xcm::v2::prelude::XCM_VERSION)); + BridgeHubWestend::force_default_xcm_version(Some(xcm::v2::prelude::XCM_VERSION)); + AssetHubWestend::force_default_xcm_version(Some(xcm::v2::prelude::XCM_VERSION)); + + // prepare data + let destination = asset_hub_westend_location(); + let native_token = MultiLocation::parent(); + let amount = ASSET_HUB_ROCOCO_ED * 1_000; + + // fund the AHR's SA on BHR for paying bridge transport fees + BridgeHubRococo::fund_para_sovereign(AssetHubRococo::para_id(), 10_000_000_000_000u128); + // fund sender + AssetHubRococo::fund_accounts(vec![(AssetHubRococoSender::get().into(), amount * 10)]); + + // send XCM from AssetHubRococo - fails - destination version not known + assert_err!( + send_asset_from_asset_hub_rococo(destination, (native_token, amount)), + DispatchError::Module(sp_runtime::ModuleError { + index: 31, + error: [1, 0, 0, 0], + message: Some("SendFailure") + }) + ); + + // set destination version + AssetHubRococo::force_xcm_version(destination, xcm::v3::prelude::XCM_VERSION); + + // TODO: remove this block, when removing `xcm:v2` + { + // send XCM from AssetHubRococo - fails - AssetHubRococo is set to the default/safe `2` + // version, which does not have the `ExportMessage` instruction. If the default `2` is + // changed to `3`, then this assert can go away" + assert_err!( + send_asset_from_asset_hub_rococo(destination, (native_token, amount)), + DispatchError::Module(sp_runtime::ModuleError { + index: 31, + error: [1, 0, 0, 0], + message: Some("SendFailure") + }) + ); + // set exact version for BridgeHubWestend to `2` without `ExportMessage` instruction + AssetHubRococo::force_xcm_version( + ParentThen(Parachain(BridgeHubRococo::para_id().into()).into()).into(), + xcm::v2::prelude::XCM_VERSION, + ); + // send XCM from AssetHubRococo - fails - `ExportMessage` is not in `2` + assert_err!( + send_asset_from_asset_hub_rococo(destination, (native_token, amount)), + DispatchError::Module(sp_runtime::ModuleError { + index: 31, + error: [1, 0, 0, 0], + message: Some("SendFailure") + }) + ); + } + + // set version with `ExportMessage` for BridgeHubRococo + AssetHubRococo::force_xcm_version( + ParentThen(Parachain(BridgeHubRococo::para_id().into()).into()).into(), + xcm::v3::prelude::XCM_VERSION, + ); + // send XCM from AssetHubRococo - ok + assert_ok!(send_asset_from_asset_hub_rococo(destination, (native_token, amount))); + + // `ExportMessage` on local BridgeHub - fails - remote BridgeHub version not known + assert_bridge_hub_rococo_message_accepted(false); + + // set version for remote BridgeHub on BridgeHubRococo + BridgeHubRococo::force_xcm_version( + bridge_hub_westend_location(), + xcm::v3::prelude::XCM_VERSION, + ); + // set version for AssetHubWestend on BridgeHubWestend + BridgeHubWestend::force_xcm_version( + ParentThen(Parachain(AssetHubWestend::para_id().into()).into()).into(), + xcm::v3::prelude::XCM_VERSION, + ); + + // send XCM from AssetHubRococo - ok + assert_ok!(send_asset_from_asset_hub_rococo(destination, (native_token, amount))); + assert_bridge_hub_rococo_message_accepted(true); + assert_bridge_hub_westend_message_received(); + // message delivered and processed at destination + AssetHubWestend::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; assert_expected_events!( - BridgeHubRococo, + AssetHubWestend, vec![ - RuntimeEvent::MessageQueue(pallet_message_queue::Event::Processed { - success: false, - .. - }) => {}, + // message processed with failure, but for this scenario it is ok, important is that was delivered + RuntimeEvent::MessageQueue( + pallet_message_queue::Event::Processed { success: false, .. } + ) => {}, ] ); }); + + // TODO: remove this block, when removing `xcm:v2` + { + // set `2` version for remote BridgeHub on BridgeHubRococo, which does not have + // `UniversalOrigin` and `DescendOrigin` + BridgeHubRococo::force_xcm_version( + bridge_hub_westend_location(), + xcm::v2::prelude::XCM_VERSION, + ); + + // send XCM from AssetHubRococo - ok + assert_ok!(send_asset_from_asset_hub_rococo(destination, (native_token, amount))); + // message is not accepted on the local BridgeHub (`DestinationUnsupported`) because we + // cannot add `UniversalOrigin` and `DescendOrigin` + assert_bridge_hub_rococo_message_accepted(false); + } } diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/Cargo.toml index cb53d7fc0e1..00cf54b6541 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/Cargo.toml @@ -15,6 +15,7 @@ frame-support = { path = "../../../../../../../substrate/frame/support", default pallet-assets = { path = "../../../../../../../substrate/frame/assets", default-features = false } pallet-balances = { path = "../../../../../../../substrate/frame/balances", default-features = false } pallet-message-queue = { path = "../../../../../../../substrate/frame/message-queue" } +sp-runtime = { path = "../../../../../../../substrate/primitives/runtime", default-features = false } # Polkadot xcm = { package = "staging-xcm", path = "../../../../../../../polkadot/xcm", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/lib.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/lib.rs index 04746aa8670..90a11d38f77 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/lib.rs @@ -14,10 +14,12 @@ // limitations under the License. // Substrate -pub use frame_support::assert_ok; +pub use frame_support::{assert_err, assert_ok, pallet_prelude::DispatchResult}; +pub use sp_runtime::DispatchError; // Polkadot pub use xcm::{ + latest::ParentThen, prelude::{AccountId32 as AccountId32Junction, *}, v3::{ Error, diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/asset_transfers.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/asset_transfers.rs index f90514f80c3..21f4b4ee235 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/asset_transfers.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/asset_transfers.rs @@ -12,70 +12,22 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -use crate::*; +use crate::tests::*; fn send_asset_from_asset_hub_westend_to_asset_hub_rococo(id: MultiLocation, amount: u128) { - let signed_origin = - ::RuntimeOrigin::signed(AssetHubWestendSender::get().into()); - let asset_hub_rococo_para_id = AssetHubRococo::para_id().into(); - let destination = MultiLocation { - parents: 2, - interior: X2(GlobalConsensus(NetworkId::Rococo), Parachain(asset_hub_rococo_para_id)), - }; - let beneficiary_id = AssetHubRococoReceiver::get(); - let beneficiary: MultiLocation = - AccountId32Junction { network: None, id: beneficiary_id.into() }.into(); - let assets: MultiAssets = (id, amount).into(); - let fee_asset_item = 0; + let destination = asset_hub_rococo_location(); // fund the AHW's SA on BHW for paying bridge transport fees - let ahw_as_seen_by_bhw = BridgeHubWestend::sibling_location_of(AssetHubWestend::para_id()); - let sov_ahw_on_bhw = BridgeHubWestend::sovereign_account_id_of(ahw_as_seen_by_bhw); - BridgeHubWestend::fund_accounts(vec![(sov_ahw_on_bhw.into(), 10_000_000_000_000u128)]); - - AssetHubWestend::execute_with(|| { - assert_ok!( - ::PolkadotXcm::limited_reserve_transfer_assets( - signed_origin, - bx!(destination.into()), - bx!(beneficiary.into()), - bx!(assets.into()), - fee_asset_item, - WeightLimit::Unlimited, - ) - ); - }); + BridgeHubWestend::fund_para_sovereign(AssetHubWestend::para_id(), 10_000_000_000_000u128); - BridgeHubWestend::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; - assert_expected_events!( - BridgeHubWestend, - vec![ - // pay for bridge fees - RuntimeEvent::Balances(pallet_balances::Event::Withdraw { .. }) => {}, - // message exported - RuntimeEvent::BridgeRococoMessages( - pallet_bridge_messages::Event::MessageAccepted { .. } - ) => {}, - // message processed successfully - RuntimeEvent::MessageQueue( - pallet_message_queue::Event::Processed { success: true, .. } - ) => {}, - ] - ); - }); - BridgeHubRococo::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; - assert_expected_events!( - BridgeHubRococo, - vec![ - // message dispatched successfully - RuntimeEvent::XcmpQueue( - cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. } - ) => {}, - ] - ); - }); + // set XCM versions + AssetHubWestend::force_xcm_version(destination, XCM_VERSION); + BridgeHubWestend::force_xcm_version(bridge_hub_rococo_location(), XCM_VERSION); + + // send message over bridge + assert_ok!(send_asset_from_asset_hub_westend(destination, (id, amount))); + assert_bridge_hub_westend_message_accepted(true); + assert_bridge_hub_rococo_message_received(); } #[test] diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/mod.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/mod.rs index 4e2ef1434fd..ec2e68fc889 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/mod.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/mod.rs @@ -13,6 +13,102 @@ // See the License for the specific language governing permissions and // limitations under the License. +use crate::*; + mod asset_transfers; mod send_xcm; mod teleport; + +pub(crate) fn asset_hub_rococo_location() -> MultiLocation { + MultiLocation { + parents: 2, + interior: X2( + GlobalConsensus(NetworkId::Rococo), + Parachain(AssetHubRococo::para_id().into()), + ), + } +} + +pub(crate) fn bridge_hub_rococo_location() -> MultiLocation { + MultiLocation { + parents: 2, + interior: X2( + GlobalConsensus(NetworkId::Rococo), + Parachain(BridgeHubRococo::para_id().into()), + ), + } +} + +pub(crate) fn send_asset_from_asset_hub_westend( + destination: MultiLocation, + (id, amount): (MultiLocation, u128), +) -> DispatchResult { + let signed_origin = + ::RuntimeOrigin::signed(AssetHubWestendSender::get().into()); + + let beneficiary: MultiLocation = + AccountId32Junction { network: None, id: AssetHubRococoReceiver::get().into() }.into(); + + let assets: MultiAssets = (id, amount).into(); + let fee_asset_item = 0; + + AssetHubWestend::execute_with(|| { + ::PolkadotXcm::limited_reserve_transfer_assets( + signed_origin, + bx!(destination.into()), + bx!(beneficiary.into()), + bx!(assets.into()), + fee_asset_item, + WeightLimit::Unlimited, + ) + }) +} + +pub(crate) fn assert_bridge_hub_westend_message_accepted(expected_processed: bool) { + BridgeHubWestend::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + + if expected_processed { + assert_expected_events!( + BridgeHubWestend, + vec![ + // pay for bridge fees + RuntimeEvent::Balances(pallet_balances::Event::Withdraw { .. }) => {}, + // message exported + RuntimeEvent::BridgeRococoMessages( + pallet_bridge_messages::Event::MessageAccepted { .. } + ) => {}, + // message processed successfully + RuntimeEvent::MessageQueue( + pallet_message_queue::Event::Processed { success: true, .. } + ) => {}, + ] + ); + } else { + assert_expected_events!( + BridgeHubWestend, + vec![ + RuntimeEvent::MessageQueue(pallet_message_queue::Event::Processed { + success: false, + .. + }) => {}, + ] + ); + } + }); +} + +pub(crate) fn assert_bridge_hub_rococo_message_received() { + BridgeHubRococo::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + assert_expected_events!( + BridgeHubRococo, + vec![ + // message sent to destination + RuntimeEvent::XcmpQueue( + cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. } + ) => {}, + ] + ); + }) +} diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/send_xcm.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/send_xcm.rs index f5c2ac3677f..0773cbb0599 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/send_xcm.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/send_xcm.rs @@ -13,7 +13,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::*; +use crate::tests::*; #[test] fn send_xcm_from_westend_relay_to_rococo_asset_hub_should_fail_on_not_applicable() { @@ -55,17 +55,123 @@ fn send_xcm_from_westend_relay_to_rococo_asset_hub_should_fail_on_not_applicable }); // Receive XCM message in Bridge Hub source Parachain, it should fail, because we don't have // opened bridge/lane. - BridgeHubWestend::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; + assert_bridge_hub_westend_message_accepted(false); +} + +#[test] +fn send_xcm_through_opened_lane_with_different_xcm_version_on_hops_works() { + // Initially set only default version on all runtimes + AssetHubRococo::force_default_xcm_version(Some(xcm::v2::prelude::XCM_VERSION)); + BridgeHubRococo::force_default_xcm_version(Some(xcm::v2::prelude::XCM_VERSION)); + BridgeHubWestend::force_default_xcm_version(Some(xcm::v2::prelude::XCM_VERSION)); + AssetHubWestend::force_default_xcm_version(Some(xcm::v2::prelude::XCM_VERSION)); + + // prepare data + let destination = asset_hub_rococo_location(); + let native_token = MultiLocation::parent(); + let amount = ASSET_HUB_WESTEND_ED * 1_000; + + // fund the AHR's SA on BHR for paying bridge transport fees + BridgeHubWestend::fund_para_sovereign(AssetHubWestend::para_id(), 10_000_000_000_000u128); + // fund sender + AssetHubWestend::fund_accounts(vec![(AssetHubWestendSender::get().into(), amount * 10)]); + + // send XCM from AssetHubWestend - fails - destination version not known + assert_err!( + send_asset_from_asset_hub_westend(destination, (native_token, amount)), + DispatchError::Module(sp_runtime::ModuleError { + index: 31, + error: [1, 0, 0, 0], + message: Some("SendFailure") + }) + ); + + // set destination version + AssetHubWestend::force_xcm_version(destination, xcm::v3::prelude::XCM_VERSION); + + // TODO: remove this block, when removing `xcm:v2` + { + // send XCM from AssetHubRococo - fails - AssetHubRococo is set to the default/safe `2` + // version, which does not have the `ExportMessage` instruction. If the default `2` is + // changed to `3`, then this assert can go away" + assert_err!( + send_asset_from_asset_hub_westend(destination, (native_token, amount)), + DispatchError::Module(sp_runtime::ModuleError { + index: 31, + error: [1, 0, 0, 0], + message: Some("SendFailure") + }) + ); + // set exact version for BridgeHubWestend to `2` without `ExportMessage` instruction + AssetHubWestend::force_xcm_version( + ParentThen(Parachain(BridgeHubWestend::para_id().into()).into()).into(), + xcm::v2::prelude::XCM_VERSION, + ); + // send XCM from AssetHubWestend - fails - `ExportMessage` is not in `2` + assert_err!( + send_asset_from_asset_hub_westend(destination, (native_token, amount)), + DispatchError::Module(sp_runtime::ModuleError { + index: 31, + error: [1, 0, 0, 0], + message: Some("SendFailure") + }) + ); + } + + // set version with `ExportMessage` for BridgeHubWestend + AssetHubWestend::force_xcm_version( + ParentThen(Parachain(BridgeHubWestend::para_id().into()).into()).into(), + xcm::v3::prelude::XCM_VERSION, + ); + // send XCM from AssetHubWestend - ok + assert_ok!(send_asset_from_asset_hub_westend(destination, (native_token, amount))); + + // `ExportMessage` on local BridgeHub - fails - remote BridgeHub version not known + assert_bridge_hub_westend_message_accepted(false); + + // set version for remote BridgeHub on BridgeHubWestend + BridgeHubWestend::force_xcm_version( + bridge_hub_rococo_location(), + xcm::v3::prelude::XCM_VERSION, + ); + // set version for AssetHubRococo on BridgeHubRococo + BridgeHubRococo::force_xcm_version( + ParentThen(Parachain(AssetHubRococo::para_id().into()).into()).into(), + xcm::v3::prelude::XCM_VERSION, + ); + + // send XCM from AssetHubWestend - ok + assert_ok!(send_asset_from_asset_hub_westend(destination, (native_token, amount))); + assert_bridge_hub_westend_message_accepted(true); + assert_bridge_hub_rococo_message_received(); + // message delivered and processed at destination + AssetHubRococo::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; assert_expected_events!( - BridgeHubWestend, + AssetHubRococo, vec![ - RuntimeEvent::MessageQueue(pallet_message_queue::Event::Processed { - success: false, - .. - }) => {}, + // message processed with failure, but for this scenario it is ok, important is that was delivered + RuntimeEvent::MessageQueue( + pallet_message_queue::Event::Processed { success: false, .. } + ) => {}, ] ); }); + + // TODO: remove this block, when removing `xcm:v2` + { + // set `2` version for remote BridgeHub on BridgeHubRococo, which does not have + // `UniversalOrigin` and `DescendOrigin` + BridgeHubWestend::force_xcm_version( + bridge_hub_rococo_location(), + xcm::v2::prelude::XCM_VERSION, + ); + + // send XCM from AssetHubWestend - ok + assert_ok!(send_asset_from_asset_hub_westend(destination, (native_token, amount))); + // message is not accepted on the local BridgeHub (`DestinationUnsupported`) because we + // cannot add `UniversalOrigin` and `DescendOrigin` + assert_bridge_hub_westend_message_accepted(false); + } } diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs index a4a42aa9e88..0374a99f234 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs @@ -846,6 +846,7 @@ impl pallet_xcm_bridge_hub_router::Config for Runtim type UniversalLocation = xcm_config::UniversalLocation; type BridgedNetworkId = xcm_config::bridging::to_westend::WestendNetwork; type Bridges = xcm_config::bridging::NetworkExportTable; + type DestinationVersion = PolkadotXcm; #[cfg(not(feature = "runtime-benchmarks"))] type BridgeHubOrigin = EnsureXcm>; @@ -1416,11 +1417,26 @@ impl_runtime_apis! { xcm_config::bridging::SiblingBridgeHubParaId::get().into() ); } - fn ensure_bridged_target_destination() -> MultiLocation { + fn ensure_bridged_target_destination() -> Result { ParachainSystem::open_outbound_hrmp_channel_for_benchmarks_or_tests( xcm_config::bridging::SiblingBridgeHubParaId::get().into() ); - xcm_config::bridging::to_westend::AssetHubWestend::get() + let bridged_asset_hub = xcm_config::bridging::to_westend::AssetHubWestend::get(); + let _ = PolkadotXcm::force_xcm_version( + RuntimeOrigin::root(), + Box::new(bridged_asset_hub), + XCM_VERSION, + ).map_err(|e| { + log::error!( + "Failed to dispatch `force_xcm_version({:?}, {:?}, {:?})`, error: {:?}", + RuntimeOrigin::root(), + bridged_asset_hub, + XCM_VERSION, + e + ); + BenchmarkError::Stop("XcmVersion was not stored!") + })?; + Ok(bridged_asset_hub) } } @@ -1439,7 +1455,7 @@ impl_runtime_apis! { type XcmConfig = xcm_config::XcmConfig; type AccountIdConverter = xcm_config::LocationToAccountId; type DeliveryHelper = cumulus_primitives_utility::ToParentDeliveryHelper< - xcm_config::XcmConfig, + xcm_config::XcmConfig, ExistentialDepositMultiAsset, xcm_config::PriceForParentDelivery, >; diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/pallet_xcm_bridge_hub_router.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/pallet_xcm_bridge_hub_router.rs index 7e12453583d..aeaaed45452 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/pallet_xcm_bridge_hub_router.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/pallet_xcm_bridge_hub_router.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_xcm_bridge_hub_router` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-11-15, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-11-29, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-yprdrvc7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-r43aesjn-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-rococo-dev")`, DB CACHE: 1024 // Executed Command: @@ -58,8 +58,8 @@ impl pallet_xcm_bridge_hub_router::WeightInfo for Weigh // Proof Size summary in bytes: // Measured: `154` // Estimated: `1639` - // Minimum execution time: 7_924_000 picoseconds. - Weight::from_parts(8_199_000, 0) + // Minimum execution time: 8_110_000 picoseconds. + Weight::from_parts(8_373_000, 0) .saturating_add(Weight::from_parts(0, 1639)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) @@ -72,8 +72,8 @@ impl pallet_xcm_bridge_hub_router::WeightInfo for Weigh // Proof Size summary in bytes: // Measured: `144` // Estimated: `1629` - // Minimum execution time: 4_265_000 picoseconds. - Weight::from_parts(4_417_000, 0) + // Minimum execution time: 4_459_000 picoseconds. + Weight::from_parts(4_663_000, 0) .saturating_add(Weight::from_parts(0, 1629)) .saturating_add(T::DbWeight::get().reads(2)) } @@ -83,12 +83,14 @@ impl pallet_xcm_bridge_hub_router::WeightInfo for Weigh // Proof Size summary in bytes: // Measured: `150` // Estimated: `1502` - // Minimum execution time: 10_292_000 picoseconds. - Weight::from_parts(10_797_000, 0) + // Minimum execution time: 10_153_000 picoseconds. + Weight::from_parts(10_737_000, 0) .saturating_add(Weight::from_parts(0, 1502)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: `PolkadotXcm::SupportedVersion` (r:2 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) /// Storage: UNKNOWN KEY `0x3302afcb67e838a3f960251b417b9a4f` (r:1 w:0) @@ -99,8 +101,6 @@ impl pallet_xcm_bridge_hub_router::WeightInfo for Weigh /// Proof: `ToWestendXcmRouter::Bridge` (`max_values`: Some(1), `max_size`: Some(17), added: 512, mode: `MaxEncodedLen`) /// Storage: `XcmpQueue::DeliveryFeeFactor` (r:1 w:0) /// Proof: `XcmpQueue::DeliveryFeeFactor` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) @@ -115,12 +115,12 @@ impl pallet_xcm_bridge_hub_router::WeightInfo for Weigh /// Proof: `XcmpQueue::OutboundXcmpMessages` (`max_values`: None, `max_size`: None, mode: `Measured`) fn send_message() -> Weight { // Proof Size summary in bytes: - // Measured: `387` - // Estimated: `3852` - // Minimum execution time: 61_995_000 picoseconds. - Weight::from_parts(65_137_000, 0) - .saturating_add(Weight::from_parts(0, 3852)) - .saturating_add(T::DbWeight::get().reads(11)) + // Measured: `448` + // Estimated: `6388` + // Minimum execution time: 61_258_000 picoseconds. + Weight::from_parts(63_679_000, 0) + .saturating_add(Weight::from_parts(0, 6388)) + .saturating_add(T::DbWeight::get().reads(12)) .saturating_add(T::DbWeight::get().writes(4)) } } diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/tests/tests.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/tests/tests.rs index 7bb71a77de7..030a3723319 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/tests/tests.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/tests/tests.rs @@ -673,9 +673,16 @@ fn limited_reserve_transfer_assets_for_native_asset_over_bridge_works( mod asset_hub_rococo_tests { use super::*; + use asset_hub_rococo_runtime::{PolkadotXcm, RuntimeOrigin}; fn bridging_to_asset_hub_westend() -> TestBridgingConfig { - asset_test_utils::test_cases_over_bridge::TestBridgingConfig { + let _ = PolkadotXcm::force_xcm_version( + RuntimeOrigin::root(), + Box::new(bridging::to_westend::AssetHubWestend::get()), + XCM_VERSION, + ) + .expect("version saved!"); + TestBridgingConfig { bridged_network: bridging::to_westend::WestendNetwork::get(), local_bridge_hub_para_id: bridging::SiblingBridgeHubParaId::get(), local_bridge_hub_location: bridging::SiblingBridgeHub::get(), diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs index 7443de54cb6..e44c7b2c827 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs @@ -822,6 +822,7 @@ impl pallet_xcm_bridge_hub_router::Config for Runtime type UniversalLocation = xcm_config::UniversalLocation; type BridgedNetworkId = xcm_config::bridging::to_rococo::RococoNetwork; type Bridges = xcm_config::bridging::NetworkExportTable; + type DestinationVersion = PolkadotXcm; #[cfg(not(feature = "runtime-benchmarks"))] type BridgeHubOrigin = EnsureXcm>; @@ -1493,11 +1494,26 @@ impl_runtime_apis! { xcm_config::bridging::SiblingBridgeHubParaId::get().into() ); } - fn ensure_bridged_target_destination() -> MultiLocation { + fn ensure_bridged_target_destination() -> Result { ParachainSystem::open_outbound_hrmp_channel_for_benchmarks_or_tests( xcm_config::bridging::SiblingBridgeHubParaId::get().into() ); - xcm_config::bridging::to_rococo::AssetHubRococo::get() + let bridged_asset_hub = xcm_config::bridging::to_rococo::AssetHubRococo::get(); + let _ = PolkadotXcm::force_xcm_version( + RuntimeOrigin::root(), + Box::new(bridged_asset_hub), + XCM_VERSION, + ).map_err(|e| { + log::error!( + "Failed to dispatch `force_xcm_version({:?}, {:?}, {:?})`, error: {:?}", + RuntimeOrigin::root(), + bridged_asset_hub, + XCM_VERSION, + e + ); + BenchmarkError::Stop("XcmVersion was not stored!") + })?; + Ok(bridged_asset_hub) } } diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_xcm_bridge_hub_router.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_xcm_bridge_hub_router.rs index 9d0d0cbc655..ee8d0ae3c45 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_xcm_bridge_hub_router.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_xcm_bridge_hub_router.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_xcm_bridge_hub_router` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-10-26, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-11-29, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-vmdtonbz-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-r43aesjn-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-westend-dev")`, DB CACHE: 1024 // Executed Command: @@ -48,8 +48,8 @@ use core::marker::PhantomData; /// Weight functions for `pallet_xcm_bridge_hub_router`. pub struct WeightInfo(PhantomData); impl pallet_xcm_bridge_hub_router::WeightInfo for WeightInfo { - /// Storage: `XcmpQueue::InboundXcmpStatus` (r:1 w:0) - /// Proof: `XcmpQueue::InboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `XcmpQueue::InboundXcmpSuspended` (r:1 w:0) + /// Proof: `XcmpQueue::InboundXcmpSuspended` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:0) /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// Storage: `ToRococoXcmRouter::Bridge` (r:1 w:1) @@ -58,22 +58,22 @@ impl pallet_xcm_bridge_hub_router::WeightInfo for Weigh // Proof Size summary in bytes: // Measured: `193` // Estimated: `1678` - // Minimum execution time: 8_157_000 picoseconds. - Weight::from_parts(8_481_000, 0) + // Minimum execution time: 8_460_000 picoseconds. + Weight::from_parts(8_730_000, 0) .saturating_add(Weight::from_parts(0, 1678)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: `XcmpQueue::InboundXcmpStatus` (r:1 w:0) - /// Proof: `XcmpQueue::InboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `XcmpQueue::InboundXcmpSuspended` (r:1 w:0) + /// Proof: `XcmpQueue::InboundXcmpSuspended` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:0) /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn on_initialize_when_congested() -> Weight { // Proof Size summary in bytes: // Measured: `111` // Estimated: `1596` - // Minimum execution time: 3_319_000 picoseconds. - Weight::from_parts(3_445_000, 0) + // Minimum execution time: 3_469_000 picoseconds. + Weight::from_parts(3_696_000, 0) .saturating_add(Weight::from_parts(0, 1596)) .saturating_add(T::DbWeight::get().reads(2)) } @@ -83,22 +83,24 @@ impl pallet_xcm_bridge_hub_router::WeightInfo for Weigh // Proof Size summary in bytes: // Measured: `117` // Estimated: `1502` - // Minimum execution time: 10_396_000 picoseconds. - Weight::from_parts(10_914_000, 0) + // Minimum execution time: 10_315_000 picoseconds. + Weight::from_parts(10_651_000, 0) .saturating_add(Weight::from_parts(0, 1502)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: `PolkadotXcm::SupportedVersion` (r:2 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: UNKNOWN KEY `0x3302afcb67e838a3f960251b417b9a4f` (r:1 w:0) + /// Proof: UNKNOWN KEY `0x3302afcb67e838a3f960251b417b9a4f` (r:1 w:0) /// Storage: UNKNOWN KEY `0x0973fe64c85043ba1c965cbc38eb63c7` (r:1 w:0) /// Proof: UNKNOWN KEY `0x0973fe64c85043ba1c965cbc38eb63c7` (r:1 w:0) /// Storage: `ToRococoXcmRouter::Bridge` (r:1 w:1) /// Proof: `ToRococoXcmRouter::Bridge` (`max_values`: Some(1), `max_size`: Some(17), added: 512, mode: `MaxEncodedLen`) /// Storage: `XcmpQueue::DeliveryFeeFactor` (r:1 w:0) /// Proof: `XcmpQueue::DeliveryFeeFactor` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) - /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) @@ -107,18 +109,18 @@ impl pallet_xcm_bridge_hub_router::WeightInfo for Weigh /// Proof: `ParachainSystem::RelevantMessagingState` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:1) /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `XcmpQueue::InboundXcmpStatus` (r:1 w:0) - /// Proof: `XcmpQueue::InboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `XcmpQueue::InboundXcmpSuspended` (r:1 w:0) + /// Proof: `XcmpQueue::InboundXcmpSuspended` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// Storage: `XcmpQueue::OutboundXcmpMessages` (r:0 w:1) /// Proof: `XcmpQueue::OutboundXcmpMessages` (`max_values`: None, `max_size`: None, mode: `Measured`) fn send_message() -> Weight { // Proof Size summary in bytes: - // Measured: `426` - // Estimated: `3891` - // Minimum execution time: 45_902_000 picoseconds. - Weight::from_parts(46_887_000, 0) - .saturating_add(Weight::from_parts(0, 3891)) - .saturating_add(T::DbWeight::get().reads(10)) + // Measured: `487` + // Estimated: `6427` + // Minimum execution time: 64_532_000 picoseconds. + Weight::from_parts(66_901_000, 0) + .saturating_add(Weight::from_parts(0, 6427)) + .saturating_add(T::DbWeight::get().reads(12)) .saturating_add(T::DbWeight::get().writes(4)) } } diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs index 7922b04e807..0aaf1d91879 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs @@ -24,9 +24,9 @@ use asset_hub_westend_runtime::{ WestendLocation, XcmConfig, }, AllPalletsWithoutSystem, AssetDeposit, Assets, Balances, ExistentialDeposit, ForeignAssets, - ForeignAssetsInstance, MetadataDepositBase, MetadataDepositPerByte, ParachainSystem, Runtime, - RuntimeCall, RuntimeEvent, SessionKeys, ToRococoXcmRouterInstance, TrustBackedAssetsInstance, - XcmpQueue, + ForeignAssetsInstance, MetadataDepositBase, MetadataDepositPerByte, ParachainSystem, + PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, SessionKeys, + ToRococoXcmRouterInstance, TrustBackedAssetsInstance, XcmpQueue, }; use asset_test_utils::{ test_cases_over_bridge::TestBridgingConfig, CollatorSessionKey, CollatorSessionKeys, ExtBuilder, @@ -635,6 +635,12 @@ asset_test_utils::include_create_and_manage_foreign_assets_for_local_consensus_p ); fn bridging_to_asset_hub_rococo() -> TestBridgingConfig { + let _ = PolkadotXcm::force_xcm_version( + RuntimeOrigin::root(), + Box::new(bridging::to_rococo::AssetHubRococo::get()), + XCM_VERSION, + ) + .expect("version saved!"); TestBridgingConfig { bridged_network: bridging::to_rococo::RococoNetwork::get(), local_bridge_hub_para_id: bridging::SiblingBridgeHubParaId::get(), diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_westend_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_westend_config.rs index ec9b2646c88..546b032e4f2 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_westend_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_westend_config.rs @@ -20,7 +20,7 @@ use crate::{ bridge_common_config::{BridgeParachainWestendInstance, DeliveryRewardInBalance}, weights, xcm_config::UniversalLocation, - AccountId, BridgeWestendMessages, Runtime, RuntimeEvent, RuntimeOrigin, + AccountId, BridgeWestendMessages, PolkadotXcm, Runtime, RuntimeEvent, RuntimeOrigin, XcmOverBridgeHubWestend, XcmRouter, }; use bp_messages::LaneId; @@ -33,7 +33,7 @@ use bridge_runtime_common::{ }, messages_xcm_extension::{ SenderAndLane, XcmAsPlainPayload, XcmBlobHauler, XcmBlobHaulerAdapter, - XcmBlobMessageDispatch, + XcmBlobMessageDispatch, XcmVersionOfDestAndRemoteBridge, }, refund_relayer_extension::{ ActualFeeRefund, RefundBridgedParachainMessages, RefundSignedExtensionAdapter, @@ -58,6 +58,10 @@ parameter_types! { pub const BridgeHubWestendChainId: bp_runtime::ChainId = bp_runtime::BRIDGE_HUB_WESTEND_CHAIN_ID; pub BridgeRococoToWestendMessagesPalletInstance: InteriorMultiLocation = X1(PalletInstance(::index() as u8)); pub WestendGlobalConsensusNetwork: NetworkId = NetworkId::Westend; + pub WestendGlobalConsensusNetworkLocation: MultiLocation = MultiLocation { + parents: 2, + interior: X1(GlobalConsensus(WestendGlobalConsensusNetwork::get())) + }; // see the `FEE_BOOST_PER_MESSAGE` constant to get the meaning of this value pub PriorityBoostPerMessage: u64 = 182_044_444_444_444; @@ -80,6 +84,14 @@ parameter_types! { pub CongestedMessage: Xcm<()> = build_congestion_message(true).into(); pub UncongestedMessage: Xcm<()> = build_congestion_message(false).into(); + + pub BridgeHubWestendLocation: MultiLocation = MultiLocation { + parents: 2, + interior: X2( + GlobalConsensus(WestendGlobalConsensusNetwork::get()), + Parachain(::PARACHAIN_ID) + ) + }; } pub const XCM_LANE_FOR_ASSET_HUB_ROCOCO_TO_ASSET_HUB_WESTEND: LaneId = LaneId([0, 0, 0, 2]); @@ -120,7 +132,6 @@ pub struct ToBridgeHubWestendXcmBlobHauler; impl XcmBlobHauler for ToBridgeHubWestendXcmBlobHauler { type Runtime = Runtime; type MessagesInstance = WithBridgeHubWestendMessagesInstance; - type ToSourceChainSender = XcmRouter; type CongestedMessage = CongestedMessage; type UncongestedMessage = UncongestedMessage; @@ -234,9 +245,11 @@ impl pallet_bridge_messages::Config for Ru pub type XcmOverBridgeHubWestendInstance = pallet_xcm_bridge_hub::Instance1; impl pallet_xcm_bridge_hub::Config for Runtime { type UniversalLocation = UniversalLocation; - type BridgedNetworkId = WestendGlobalConsensusNetwork; + type BridgedNetwork = WestendGlobalConsensusNetworkLocation; type BridgeMessagesPalletInstance = WithBridgeHubWestendMessagesInstance; type MessageExportPrice = (); + type DestinationVersion = + XcmVersionOfDestAndRemoteBridge; type Lanes = ActiveLanes; type LanesSupport = ToBridgeHubWestendXcmBlobHauler; } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs index 1bb2faeb2fc..3d1d345a95c 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs @@ -853,7 +853,7 @@ impl_runtime_apis! { type XcmConfig = xcm_config::XcmConfig; type AccountIdConverter = xcm_config::LocationToAccountId; type DeliveryHelper = cumulus_primitives_utility::ToParentDeliveryHelper< - xcm_config::XcmConfig, + xcm_config::XcmConfig, ExistentialDepositMultiAsset, xcm_config::PriceForParentDelivery, >; @@ -933,6 +933,21 @@ impl_runtime_apis! { fn export_message_origin_and_destination( ) -> Result<(MultiLocation, NetworkId, InteriorMultiLocation), BenchmarkError> { + // save XCM version for remote bridge hub + let _ = PolkadotXcm::force_xcm_version( + RuntimeOrigin::root(), + Box::new(bridge_to_westend_config::BridgeHubWestendLocation::get()), + XCM_VERSION, + ).map_err(|e| { + log::error!( + "Failed to dispatch `force_xcm_version({:?}, {:?}, {:?})`, error: {:?}", + RuntimeOrigin::root(), + bridge_to_westend_config::BridgeHubWestendLocation::get(), + XCM_VERSION, + e + ); + BenchmarkError::Stop("XcmVersion was not stored!") + })?; Ok( ( bridge_to_westend_config::FromAssetHubRococoToAssetHubWestendRoute::get().location, diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index 0ae6d0b5623..606e47457d2 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::generic` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-11-14, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-11-29, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-yprdrvc7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-r43aesjn-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 // Executed Command: @@ -68,8 +68,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `171` // Estimated: `6196` - // Minimum execution time: 63_453_000 picoseconds. - Weight::from_parts(64_220_000, 6196) + // Minimum execution time: 61_049_000 picoseconds. + Weight::from_parts(62_672_000, 6196) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -77,8 +77,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_238_000 picoseconds. - Weight::from_parts(2_351_000, 0) + // Minimum execution time: 1_972_000 picoseconds. + Weight::from_parts(2_095_000, 0) } // Storage: `PolkadotXcm::Queries` (r:1 w:0) // Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) @@ -86,58 +86,58 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `32` // Estimated: `3497` - // Minimum execution time: 7_953_000 picoseconds. - Weight::from_parts(8_162_000, 3497) + // Minimum execution time: 7_541_000 picoseconds. + Weight::from_parts(7_875_000, 3497) .saturating_add(T::DbWeight::get().reads(1)) } pub fn transact() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 9_080_000 picoseconds. - Weight::from_parts(9_333_000, 0) + // Minimum execution time: 8_467_000 picoseconds. + Weight::from_parts(8_653_000, 0) } pub fn refund_surplus() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_415_000 picoseconds. - Weight::from_parts(2_519_000, 0) + // Minimum execution time: 2_141_000 picoseconds. + Weight::from_parts(2_231_000, 0) } pub fn set_error_handler() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_045_000 picoseconds. - Weight::from_parts(2_184_000, 0) + // Minimum execution time: 1_881_000 picoseconds. + Weight::from_parts(1_941_000, 0) } pub fn set_appendix() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_065_000 picoseconds. - Weight::from_parts(2_125_000, 0) + // Minimum execution time: 1_846_000 picoseconds. + Weight::from_parts(1_916_000, 0) } pub fn clear_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_077_000 picoseconds. - Weight::from_parts(2_164_000, 0) + // Minimum execution time: 1_857_000 picoseconds. + Weight::from_parts(1_910_000, 0) } pub fn descend_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_868_000 picoseconds. - Weight::from_parts(2_933_000, 0) + // Minimum execution time: 2_493_000 picoseconds. + Weight::from_parts(2_570_000, 0) } pub fn clear_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_058_000 picoseconds. - Weight::from_parts(2_164_000, 0) + // Minimum execution time: 1_857_000 picoseconds. + Weight::from_parts(1_930_000, 0) } // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) @@ -159,8 +159,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `171` // Estimated: `6196` - // Minimum execution time: 55_971_000 picoseconds. - Weight::from_parts(56_869_000, 6196) + // Minimum execution time: 54_805_000 picoseconds. + Weight::from_parts(55_690_000, 6196) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -170,8 +170,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `90` // Estimated: `3555` - // Minimum execution time: 11_382_000 picoseconds. - Weight::from_parts(11_672_000, 3555) + // Minimum execution time: 11_062_000 picoseconds. + Weight::from_parts(11_505_000, 3555) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -179,8 +179,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_071_000 picoseconds. - Weight::from_parts(2_193_000, 0) + // Minimum execution time: 1_873_000 picoseconds. + Weight::from_parts(1_962_000, 0) } // Storage: `PolkadotXcm::VersionNotifyTargets` (r:1 w:1) // Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) @@ -200,8 +200,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `38` // Estimated: `3503` - // Minimum execution time: 22_573_000 picoseconds. - Weight::from_parts(23_423_000, 3503) + // Minimum execution time: 22_356_000 picoseconds. + Weight::from_parts(23_066_000, 3503) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -211,44 +211,44 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_870_000 picoseconds. - Weight::from_parts(3_993_000, 0) + // Minimum execution time: 3_819_000 picoseconds. + Weight::from_parts(3_992_000, 0) .saturating_add(T::DbWeight::get().writes(1)) } pub fn burn_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_483_000 picoseconds. - Weight::from_parts(3_598_000, 0) + // Minimum execution time: 3_033_000 picoseconds. + Weight::from_parts(3_157_000, 0) } pub fn expect_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_241_000 picoseconds. - Weight::from_parts(2_297_000, 0) + // Minimum execution time: 1_994_000 picoseconds. + Weight::from_parts(2_056_000, 0) } pub fn expect_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_230_000 picoseconds. - Weight::from_parts(2_318_000, 0) + // Minimum execution time: 1_978_000 picoseconds. + Weight::from_parts(2_069_000, 0) } pub fn expect_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_051_000 picoseconds. - Weight::from_parts(2_153_000, 0) + // Minimum execution time: 1_894_000 picoseconds. + Weight::from_parts(1_977_000, 0) } pub fn expect_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_306_000 picoseconds. - Weight::from_parts(2_380_000, 0) + // Minimum execution time: 2_114_000 picoseconds. + Weight::from_parts(2_223_000, 0) } // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) @@ -270,8 +270,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `171` // Estimated: `6196` - // Minimum execution time: 60_201_000 picoseconds. - Weight::from_parts(61_132_000, 6196) + // Minimum execution time: 58_704_000 picoseconds. + Weight::from_parts(59_677_000, 6196) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -279,8 +279,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_554_000 picoseconds. - Weight::from_parts(4_704_000, 0) + // Minimum execution time: 4_506_000 picoseconds. + Weight::from_parts(4_672_000, 0) } // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) @@ -302,8 +302,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `171` // Estimated: `6196` - // Minimum execution time: 56_071_000 picoseconds. - Weight::from_parts(56_889_000, 6196) + // Minimum execution time: 54_896_000 picoseconds. + Weight::from_parts(56_331_000, 6196) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -311,25 +311,29 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_093_000 picoseconds. - Weight::from_parts(2_169_000, 0) + // Minimum execution time: 1_946_000 picoseconds. + Weight::from_parts(2_002_000, 0) } pub fn set_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_027_000 picoseconds. - Weight::from_parts(2_172_000, 0) + // Minimum execution time: 1_898_000 picoseconds. + Weight::from_parts(1_961_000, 0) } pub fn clear_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_035_000 picoseconds. - Weight::from_parts(2_164_000, 0) + // Minimum execution time: 1_895_000 picoseconds. + Weight::from_parts(1_964_000, 0) } // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + // Storage: `PolkadotXcm::SupportedVersion` (r:2 w:0) + // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `BridgeWestendMessages::PalletOperatingMode` (r:1 w:0) // Proof: `BridgeWestendMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) // Storage: `BridgeWestendMessages::OutboundLanes` (r:1 w:1) @@ -341,27 +345,27 @@ impl WeightInfo { /// The range of component `x` is `[1, 1000]`. pub fn export_message(x: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `96` - // Estimated: `1529` - // Minimum execution time: 25_636_000 picoseconds. - Weight::from_parts(25_405_640, 1529) - // Standard Error: 321 - .saturating_add(Weight::from_parts(365_002, 0).saturating_mul(x.into())) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(2)) + // Measured: `190` + // Estimated: `6130` + // Minimum execution time: 36_547_000 picoseconds. + Weight::from_parts(37_623_117, 6130) + // Standard Error: 735 + .saturating_add(Weight::from_parts(315_274, 0).saturating_mul(x.into())) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) } pub fn set_fees_mode() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_036_000 picoseconds. - Weight::from_parts(2_136_000, 0) + // Minimum execution time: 1_868_000 picoseconds. + Weight::from_parts(1_910_000, 0) } pub fn unpaid_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_147_000 picoseconds. - Weight::from_parts(2_276_000, 0) + // Minimum execution time: 1_998_000 picoseconds. + Weight::from_parts(2_069_000, 0) } } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs index c1af369cdf8..1d544a9dcfa 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs @@ -21,11 +21,11 @@ use bridge_hub_rococo_runtime::{ bridge_common_config, bridge_to_westend_config, xcm_config::{RelayNetwork, TokenLocation, XcmConfig}, AllPalletsWithoutSystem, BridgeRejectObsoleteHeadersAndMessages, Executive, ExistentialDeposit, - ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, SessionKeys, SignedExtra, - TransactionPayment, UncheckedExtrinsic, + ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, SessionKeys, + SignedExtra, TransactionPayment, UncheckedExtrinsic, }; use codec::{Decode, Encode}; -use frame_support::{dispatch::GetDispatchInfo, parameter_types}; +use frame_support::{dispatch::GetDispatchInfo, parameter_types, traits::ConstU8}; use frame_system::pallet_prelude::HeaderFor; use parachains_common::{rococo::fee::WeightToFee, AccountId, AuraId, Balance}; use sp_keyring::AccountKeyring::Alice; @@ -104,8 +104,9 @@ mod bridge_hub_rococo_tests { RequiredStakeForStakeAndSlash, }; use bridge_to_westend_config::{ - BridgeHubWestendChainId, WestendGlobalConsensusNetwork, WithBridgeHubWestendMessageBridge, - WithBridgeHubWestendMessagesInstance, XCM_LANE_FOR_ASSET_HUB_ROCOCO_TO_ASSET_HUB_WESTEND, + BridgeHubWestendChainId, BridgeHubWestendLocation, WestendGlobalConsensusNetwork, + WithBridgeHubWestendMessageBridge, WithBridgeHubWestendMessagesInstance, + XCM_LANE_FOR_ASSET_HUB_ROCOCO_TO_ASSET_HUB_WESTEND, }; bridge_hub_test_utils::test_cases::include_teleports_for_native_asset_works!( @@ -196,7 +197,7 @@ mod bridge_hub_rococo_tests { Some((TokenLocation::get(), ExistentialDeposit::get()).into()), // value should be >= than value generated by `can_calculate_weight_for_paid_export_message_with_reserve_transfer` Some((TokenLocation::get(), bp_bridge_hub_rococo::BridgeHubRococoBaseXcmFeeInRocs::get()).into()), - || (), + || PolkadotXcm::force_xcm_version(RuntimeOrigin::root(), Box::new(BridgeHubWestendLocation::get()), XCM_VERSION).expect("version saved!"), ) } @@ -211,6 +212,7 @@ mod bridge_hub_rococo_tests { WithBridgeHubWestendMessagesInstance, RelayNetwork, WestendGlobalConsensusNetwork, + ConstU8<2>, >( collator_session_keys(), bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/bridge_to_rococo_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/bridge_to_rococo_config.rs index 3b773947b47..eb5493872b4 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/bridge_to_rococo_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/bridge_to_rococo_config.rs @@ -18,8 +18,8 @@ use crate::{ bridge_common_config::DeliveryRewardInBalance, weights, xcm_config::UniversalLocation, - AccountId, BridgeRococoMessages, Runtime, RuntimeEvent, RuntimeOrigin, XcmOverBridgeHubRococo, - XcmRouter, + AccountId, BridgeRococoMessages, PolkadotXcm, Runtime, RuntimeEvent, RuntimeOrigin, + XcmOverBridgeHubRococo, XcmRouter, }; use bp_messages::LaneId; use bp_parachains::SingleParaStoredHeaderDataBuilder; @@ -32,7 +32,7 @@ use bridge_runtime_common::{ }, messages_xcm_extension::{ SenderAndLane, XcmAsPlainPayload, XcmBlobHauler, XcmBlobHaulerAdapter, - XcmBlobMessageDispatch, + XcmBlobMessageDispatch, XcmVersionOfDestAndRemoteBridge, }, refund_relayer_extension::{ ActualFeeRefund, RefundBridgedParachainMessages, RefundSignedExtensionAdapter, @@ -65,6 +65,10 @@ parameter_types! { pub const BridgeHubRococoChainId: bp_runtime::ChainId = bp_runtime::BRIDGE_HUB_ROCOCO_CHAIN_ID; pub BridgeWestendToRococoMessagesPalletInstance: InteriorMultiLocation = X1(PalletInstance(::index() as u8)); pub RococoGlobalConsensusNetwork: NetworkId = NetworkId::Rococo; + pub RococoGlobalConsensusNetworkLocation: MultiLocation = MultiLocation { + parents: 2, + interior: X1(GlobalConsensus(RococoGlobalConsensusNetwork::get())) + }; // see the `FEE_BOOST_PER_MESSAGE` constant to get the meaning of this value pub PriorityBoostPerMessage: u64 = 182_044_444_444_444; @@ -87,6 +91,14 @@ parameter_types! { pub CongestedMessage: Xcm<()> = build_congestion_message(true).into(); pub UncongestedMessage: Xcm<()> = build_congestion_message(false).into(); + + pub BridgeHubRococoLocation: MultiLocation = MultiLocation { + parents: 2, + interior: X2( + GlobalConsensus(RococoGlobalConsensusNetwork::get()), + Parachain(::PARACHAIN_ID) + ) + }; } pub const XCM_LANE_FOR_ASSET_HUB_WESTEND_TO_ASSET_HUB_ROCOCO: LaneId = LaneId([0, 0, 0, 2]); @@ -260,9 +272,10 @@ impl pallet_bridge_messages::Config for Run pub type XcmOverBridgeHubRococoInstance = pallet_xcm_bridge_hub::Instance1; impl pallet_xcm_bridge_hub::Config for Runtime { type UniversalLocation = UniversalLocation; - type BridgedNetworkId = RococoGlobalConsensusNetwork; + type BridgedNetwork = RococoGlobalConsensusNetworkLocation; type BridgeMessagesPalletInstance = WithBridgeHubRococoMessagesInstance; type MessageExportPrice = (); + type DestinationVersion = XcmVersionOfDestAndRemoteBridge; type Lanes = ActiveLanes; type LanesSupport = ToBridgeHubRococoXcmBlobHauler; } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs index 6157aa90a5a..5ea5cea7530 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs @@ -922,6 +922,21 @@ impl_runtime_apis! { fn export_message_origin_and_destination( ) -> Result<(MultiLocation, NetworkId, InteriorMultiLocation), BenchmarkError> { + // save XCM version for remote bridge hub + let _ = PolkadotXcm::force_xcm_version( + RuntimeOrigin::root(), + Box::new(bridge_to_rococo_config::BridgeHubRococoLocation::get()), + XCM_VERSION, + ).map_err(|e| { + log::error!( + "Failed to dispatch `force_xcm_version({:?}, {:?}, {:?})`, error: {:?}", + RuntimeOrigin::root(), + bridge_to_rococo_config::BridgeHubRococoLocation::get(), + XCM_VERSION, + e + ); + BenchmarkError::Stop("XcmVersion was not stored!") + })?; Ok( ( bridge_to_rococo_config::FromAssetHubWestendToAssetHubRococoRoute::get().location, diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index 7c686190208..8f283403400 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -17,10 +17,10 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::generic` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-10-26, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-11-29, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-vmdtonbz-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-r43aesjn-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-westend-dev"), DB CACHE: 1024 // Executed Command: // target/production/polkadot-parachain @@ -33,10 +33,10 @@ // --heap-pages=4096 // --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json // --pallet=pallet_xcm_benchmarks::generic -// --chain=bridge-hub-rococo-dev +// --chain=bridge-hub-westend-dev // --header=./cumulus/file_header.txt // --template=./cumulus/templates/xcm-bench-template.hbs -// --output=./cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/ +// --output=./cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/xcm/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -48,8 +48,6 @@ use sp_std::marker::PhantomData; /// Weights for `pallet_xcm_benchmarks::generic`. pub struct WeightInfo(PhantomData); impl WeightInfo { - // Storage: UNKNOWN KEY `0x48297505634037ef48c848c99c0b1f1b` (r:1 w:0) - // Proof: UNKNOWN KEY `0x48297505634037ef48c848c99c0b1f1b` (r:1 w:0) // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) @@ -68,81 +66,79 @@ impl WeightInfo { // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) pub fn report_holding() -> Weight { // Proof Size summary in bytes: - // Measured: `242` + // Measured: `171` // Estimated: `6196` - // Minimum execution time: 62_732_000 picoseconds. - Weight::from_parts(64_581_000, 6196) - .saturating_add(T::DbWeight::get().reads(10)) + // Minimum execution time: 61_383_000 picoseconds. + Weight::from_parts(62_382_000, 6196) + .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } pub fn buy_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_987_000 picoseconds. - Weight::from_parts(2_107_000, 0) + // Minimum execution time: 2_057_000 picoseconds. + Weight::from_parts(2_153_000, 0) } // Storage: `PolkadotXcm::Queries` (r:1 w:0) // Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) pub fn query_response() -> Weight { // Proof Size summary in bytes: - // Measured: `103` - // Estimated: `3568` - // Minimum execution time: 8_098_000 picoseconds. - Weight::from_parts(8_564_000, 3568) + // Measured: `32` + // Estimated: `3497` + // Minimum execution time: 7_949_000 picoseconds. + Weight::from_parts(8_250_000, 3497) .saturating_add(T::DbWeight::get().reads(1)) } pub fn transact() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_539_000 picoseconds. - Weight::from_parts(9_085_000, 0) + // Minimum execution time: 8_608_000 picoseconds. + Weight::from_parts(9_086_000, 0) } pub fn refund_surplus() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_205_000 picoseconds. - Weight::from_parts(2_369_000, 0) + // Minimum execution time: 2_240_000 picoseconds. + Weight::from_parts(2_348_000, 0) } pub fn set_error_handler() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_828_000 picoseconds. - Weight::from_parts(1_994_000, 0) + // Minimum execution time: 1_969_000 picoseconds. + Weight::from_parts(2_017_000, 0) } pub fn set_appendix() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_869_000 picoseconds. - Weight::from_parts(1_946_000, 0) + // Minimum execution time: 1_907_000 picoseconds. + Weight::from_parts(2_001_000, 0) } pub fn clear_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_842_000 picoseconds. - Weight::from_parts(1_949_000, 0) + // Minimum execution time: 1_880_000 picoseconds. + Weight::from_parts(1_975_000, 0) } pub fn descend_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_460_000 picoseconds. - Weight::from_parts(2_593_000, 0) + // Minimum execution time: 2_549_000 picoseconds. + Weight::from_parts(2_624_000, 0) } pub fn clear_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_868_000 picoseconds. - Weight::from_parts(2_003_000, 0) + // Minimum execution time: 1_895_000 picoseconds. + Weight::from_parts(1_963_000, 0) } - // Storage: UNKNOWN KEY `0x48297505634037ef48c848c99c0b1f1b` (r:1 w:0) - // Proof: UNKNOWN KEY `0x48297505634037ef48c848c99c0b1f1b` (r:1 w:0) // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) @@ -161,21 +157,21 @@ impl WeightInfo { // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) pub fn report_error() -> Weight { // Proof Size summary in bytes: - // Measured: `242` + // Measured: `171` // Estimated: `6196` - // Minimum execution time: 56_813_000 picoseconds. - Weight::from_parts(57_728_000, 6196) - .saturating_add(T::DbWeight::get().reads(10)) + // Minimum execution time: 54_447_000 picoseconds. + Weight::from_parts(55_629_000, 6196) + .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } // Storage: `PolkadotXcm::AssetTraps` (r:1 w:1) // Proof: `PolkadotXcm::AssetTraps` (`max_values`: None, `max_size`: None, mode: `Measured`) pub fn claim_asset() -> Weight { // Proof Size summary in bytes: - // Measured: `160` - // Estimated: `3625` - // Minimum execution time: 11_364_000 picoseconds. - Weight::from_parts(11_872_000, 3625) + // Measured: `90` + // Estimated: `3555` + // Minimum execution time: 11_597_000 picoseconds. + Weight::from_parts(11_809_000, 3555) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -183,8 +179,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_821_000 picoseconds. - Weight::from_parts(1_936_000, 0) + // Minimum execution time: 1_895_000 picoseconds. + Weight::from_parts(1_977_000, 0) } // Storage: `PolkadotXcm::VersionNotifyTargets` (r:1 w:1) // Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) @@ -202,10 +198,10 @@ impl WeightInfo { // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) pub fn subscribe_version() -> Weight { // Proof Size summary in bytes: - // Measured: `109` - // Estimated: `3574` - // Minimum execution time: 23_081_000 picoseconds. - Weight::from_parts(23_512_000, 3574) + // Measured: `38` + // Estimated: `3503` + // Minimum execution time: 23_314_000 picoseconds. + Weight::from_parts(23_905_000, 3503) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -215,47 +211,45 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_747_000 picoseconds. - Weight::from_parts(4_068_000, 0) + // Minimum execution time: 3_948_000 picoseconds. + Weight::from_parts(4_084_000, 0) .saturating_add(T::DbWeight::get().writes(1)) } pub fn burn_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_045_000 picoseconds. - Weight::from_parts(3_208_000, 0) + // Minimum execution time: 3_196_000 picoseconds. + Weight::from_parts(3_285_000, 0) } pub fn expect_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_962_000 picoseconds. - Weight::from_parts(2_284_000, 0) + // Minimum execution time: 2_040_000 picoseconds. + Weight::from_parts(2_162_000, 0) } pub fn expect_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_951_000 picoseconds. - Weight::from_parts(2_026_000, 0) + // Minimum execution time: 1_980_000 picoseconds. + Weight::from_parts(2_082_000, 0) } pub fn expect_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_837_000 picoseconds. - Weight::from_parts(2_084_000, 0) + // Minimum execution time: 1_890_000 picoseconds. + Weight::from_parts(1_971_000, 0) } pub fn expect_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_042_000 picoseconds. - Weight::from_parts(2_145_000, 0) + // Minimum execution time: 2_131_000 picoseconds. + Weight::from_parts(2_187_000, 0) } - // Storage: UNKNOWN KEY `0x48297505634037ef48c848c99c0b1f1b` (r:1 w:0) - // Proof: UNKNOWN KEY `0x48297505634037ef48c848c99c0b1f1b` (r:1 w:0) // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) @@ -274,22 +268,20 @@ impl WeightInfo { // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) pub fn query_pallet() -> Weight { // Proof Size summary in bytes: - // Measured: `242` + // Measured: `171` // Estimated: `6196` - // Minimum execution time: 61_350_000 picoseconds. - Weight::from_parts(62_440_000, 6196) - .saturating_add(T::DbWeight::get().reads(10)) + // Minimum execution time: 59_548_000 picoseconds. + Weight::from_parts(60_842_000, 6196) + .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } pub fn expect_pallet() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_993_000 picoseconds. - Weight::from_parts(5_309_000, 0) + // Minimum execution time: 4_665_000 picoseconds. + Weight::from_parts(4_844_000, 0) } - // Storage: UNKNOWN KEY `0x48297505634037ef48c848c99c0b1f1b` (r:1 w:0) - // Proof: UNKNOWN KEY `0x48297505634037ef48c848c99c0b1f1b` (r:1 w:0) // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) @@ -308,70 +300,72 @@ impl WeightInfo { // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) pub fn report_transact_status() -> Weight { // Proof Size summary in bytes: - // Measured: `242` + // Measured: `171` // Estimated: `6196` - // Minimum execution time: 57_133_000 picoseconds. - Weight::from_parts(58_100_000, 6196) - .saturating_add(T::DbWeight::get().reads(10)) + // Minimum execution time: 55_044_000 picoseconds. + Weight::from_parts(56_103_000, 6196) + .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } pub fn clear_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_899_000 picoseconds. - Weight::from_parts(2_153_000, 0) + // Minimum execution time: 1_904_000 picoseconds. + Weight::from_parts(1_984_000, 0) } pub fn set_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_880_000 picoseconds. - Weight::from_parts(1_960_000, 0) + // Minimum execution time: 1_889_000 picoseconds. + Weight::from_parts(1_950_000, 0) } pub fn clear_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_825_000 picoseconds. - Weight::from_parts(1_960_000, 0) + // Minimum execution time: 1_878_000 picoseconds. + Weight::from_parts(1_963_000, 0) } - // Storage: UNKNOWN KEY `0x48297505634037ef48c848c99c0b1f1b` (r:1 w:0) - // Proof: UNKNOWN KEY `0x48297505634037ef48c848c99c0b1f1b` (r:1 w:0) // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `BridgeRococoToWococoMessages::PalletOperatingMode` (r:1 w:0) - // Proof: `BridgeRococoToWococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) - // Storage: `BridgeRococoToWococoMessages::OutboundLanes` (r:1 w:1) - // Proof: `BridgeRococoToWococoMessages::OutboundLanes` (`max_values`: Some(1), `max_size`: Some(44), added: 539, mode: `MaxEncodedLen`) - // Storage: `BridgeRococoToWococoMessages::OutboundLanesCongestedSignals` (r:1 w:0) - // Proof: `BridgeRococoToWococoMessages::OutboundLanesCongestedSignals` (`max_values`: Some(1), `max_size`: Some(21), added: 516, mode: `MaxEncodedLen`) - // Storage: `BridgeRococoToWococoMessages::OutboundMessages` (r:0 w:1) - // Proof: `BridgeRococoToWococoMessages::OutboundMessages` (`max_values`: None, `max_size`: Some(2621472), added: 2623947, mode: `MaxEncodedLen`) + // Storage: `PolkadotXcm::SupportedVersion` (r:2 w:0) + // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `BridgeRococoMessages::PalletOperatingMode` (r:1 w:0) + // Proof: `BridgeRococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + // Storage: `BridgeRococoMessages::OutboundLanes` (r:1 w:1) + // Proof: `BridgeRococoMessages::OutboundLanes` (`max_values`: Some(1), `max_size`: Some(44), added: 539, mode: `MaxEncodedLen`) + // Storage: `BridgeRococoMessages::OutboundLanesCongestedSignals` (r:1 w:0) + // Proof: `BridgeRococoMessages::OutboundLanesCongestedSignals` (`max_values`: Some(1), `max_size`: Some(21), added: 516, mode: `MaxEncodedLen`) + // Storage: `BridgeRococoMessages::OutboundMessages` (r:0 w:1) + // Proof: `BridgeRococoMessages::OutboundMessages` (`max_values`: None, `max_size`: Some(2621472), added: 2623947, mode: `MaxEncodedLen`) /// The range of component `x` is `[1, 1000]`. pub fn export_message(x: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `139` - // Estimated: `3604` - // Minimum execution time: 28_419_000 picoseconds. - Weight::from_parts(29_387_791, 3604) - // Standard Error: 552 - .saturating_add(Weight::from_parts(316_277, 0).saturating_mul(x.into())) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(2)) + // Measured: `188` + // Estimated: `6128` + // Minimum execution time: 36_960_000 picoseconds. + Weight::from_parts(38_104_333, 6128) + // Standard Error: 510 + .saturating_add(Weight::from_parts(316_499, 0).saturating_mul(x.into())) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) } pub fn set_fees_mode() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_903_000 picoseconds. - Weight::from_parts(2_023_000, 0) + // Minimum execution time: 1_833_000 picoseconds. + Weight::from_parts(1_950_000, 0) } pub fn unpaid_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_963_000 picoseconds. - Weight::from_parts(2_143_000, 0) + // Minimum execution time: 1_980_000 picoseconds. + Weight::from_parts(2_065_000, 0) } } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/tests/tests.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/tests/tests.rs index 822dc2340d4..73bddb16369 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/tests/tests.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/tests/tests.rs @@ -22,16 +22,16 @@ use bridge_hub_westend_runtime::{ bridge_common_config, bridge_to_rococo_config, xcm_config::{RelayNetwork, WestendLocation, XcmConfig}, AllPalletsWithoutSystem, BridgeRejectObsoleteHeadersAndMessages, Executive, ExistentialDeposit, - ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, SessionKeys, SignedExtra, - TransactionPayment, UncheckedExtrinsic, + ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, SessionKeys, + SignedExtra, TransactionPayment, UncheckedExtrinsic, }; use bridge_to_rococo_config::{ - BridgeGrandpaRococoInstance, BridgeHubRococoChainId, BridgeParachainRococoInstance, - WithBridgeHubRococoMessageBridge, WithBridgeHubRococoMessagesInstance, - XCM_LANE_FOR_ASSET_HUB_WESTEND_TO_ASSET_HUB_ROCOCO, + BridgeGrandpaRococoInstance, BridgeHubRococoChainId, BridgeHubRococoLocation, + BridgeParachainRococoInstance, WithBridgeHubRococoMessageBridge, + WithBridgeHubRococoMessagesInstance, XCM_LANE_FOR_ASSET_HUB_WESTEND_TO_ASSET_HUB_ROCOCO, }; use codec::{Decode, Encode}; -use frame_support::{dispatch::GetDispatchInfo, parameter_types}; +use frame_support::{dispatch::GetDispatchInfo, parameter_types, traits::ConstU8}; use frame_system::pallet_prelude::HeaderFor; use parachains_common::{westend::fee::WeightToFee, AccountId, AuraId, Balance}; use sp_keyring::AccountKeyring::Alice; @@ -184,7 +184,7 @@ fn handle_export_message_from_system_parachain_add_to_outbound_queue_works() { Some((WestendLocation::get(), ExistentialDeposit::get()).into()), // value should be >= than value generated by `can_calculate_weight_for_paid_export_message_with_reserve_transfer` Some((WestendLocation::get(), bp_bridge_hub_westend::BridgeHubWestendBaseXcmFeeInWnds::get()).into()), - || (), + || PolkadotXcm::force_xcm_version(RuntimeOrigin::root(), Box::new(BridgeHubRococoLocation::get()), XCM_VERSION).expect("version saved!"), ) } @@ -198,6 +198,7 @@ fn message_dispatch_routing_works() { WithBridgeHubRococoMessagesInstance, RelayNetwork, bridge_to_rococo_config::RococoGlobalConsensusNetwork, + ConstU8<2>, >( collator_session_keys(), bp_bridge_hub_westend::BRIDGE_HUB_WESTEND_PARACHAIN_ID, diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs index fee95a38288..ddcba3b0399 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs @@ -55,7 +55,10 @@ use sp_runtime::{ traits::{Header as HeaderT, Zero}, AccountId32, }; -use xcm::latest::prelude::*; +use xcm::{ + latest::prelude::*, + prelude::{AlwaysLatest, GetVersion}, +}; use xcm_builder::DispatchBlobError; use xcm_executor::{ traits::{TransactAsset, WeightBounds}, @@ -258,6 +261,7 @@ pub fn message_dispatch_routing_works< MessagesPalletInstance, RuntimeNetwork, BridgedNetwork, + NetworkDistanceAsParentCount, >( collator_session_key: CollatorSessionKeys, runtime_para_id: u32, @@ -291,13 +295,19 @@ pub fn message_dispatch_routing_works< HrmpChannelOpener: frame_support::inherent::ProvideInherent< Call = cumulus_pallet_parachain_system::Call, >, - // MessageDispatcher: MessageDispatch, DispatchLevelResult = - // XcmBlobMessageDispatchResult, DispatchPayload = XcmAsPlainPayload>, RuntimeNetwork: Get, BridgedNetwork: Get, + NetworkDistanceAsParentCount: Get, { assert_ne!(runtime_para_id, sibling_parachain_id); + struct NetworkWithParentCount(core::marker::PhantomData<(N, C)>); + impl, C: Get> Get for NetworkWithParentCount { + fn get() -> MultiLocation { + MultiLocation { parents: C::get(), interior: X1(GlobalConsensus(N::get())) } + } + } + ExtBuilder::::default() .with_collators(collator_session_key.collators()) .with_session_keys(collator_session_key.session_keys()) @@ -317,7 +327,11 @@ pub fn message_dispatch_routing_works< ); // 1. this message is sent from other global consensus with destination of this Runtime relay chain (UMP) let bridging_message = - test_data::simulate_message_exporter_on_bridged_chain::( + test_data::simulate_message_exporter_on_bridged_chain::< + BridgedNetwork, + NetworkWithParentCount, + AlwaysLatest, + >( (RuntimeNetwork::get(), Here) ); let result = <>::MessageDispatch>::dispatch( @@ -335,7 +349,11 @@ pub fn message_dispatch_routing_works< // 2. this message is sent from other global consensus with destination of this Runtime sibling parachain (HRMP) let bridging_message = - test_data::simulate_message_exporter_on_bridged_chain::( + test_data::simulate_message_exporter_on_bridged_chain::< + BridgedNetwork, + NetworkWithParentCount, + AlwaysLatest, + >( (RuntimeNetwork::get(), X1(Parachain(sibling_parachain_id))), ); @@ -1524,7 +1542,8 @@ pub mod test_data { /// which are transferred over bridge. pub(crate) fn simulate_message_exporter_on_bridged_chain< SourceNetwork: Get, - DestinationNetwork: Get, + DestinationNetwork: Get, + DestinationVersion: GetVersion, >( (destination_network, destination_junctions): (NetworkId, Junctions), ) -> Vec { @@ -1536,23 +1555,28 @@ pub mod test_data { let channel = 1_u32; // simulate XCM message export - let (ticket, fee) = - validate_export::>( - destination_network, - channel, - universal_source_on_bridged_chain, - destination_junctions, - dummy_xcm(), - ) - .expect("validate_export to pass"); + let (ticket, fee) = validate_export::< + HaulBlobExporter, + >( + destination_network, + channel, + universal_source_on_bridged_chain, + destination_junctions, + dummy_xcm(), + ) + .expect("validate_export to pass"); log::info!( target: "simulate_message_exporter_on_bridged_chain", "HaulBlobExporter::validate fee: {:?}", fee ); - let xcm_hash = - HaulBlobExporter::::deliver(ticket) - .expect("deliver to pass"); + let xcm_hash = HaulBlobExporter::< + GrabbingHaulBlob, + DestinationNetwork, + DestinationVersion, + (), + >::deliver(ticket) + .expect("deliver to pass"); log::info!( target: "simulate_message_exporter_on_bridged_chain", "HaulBlobExporter::deliver xcm_hash: {:?}", diff --git a/cumulus/parachains/runtimes/test-utils/src/lib.rs b/cumulus/parachains/runtimes/test-utils/src/lib.rs index e2a6fb45aec..a8ae63b250a 100644 --- a/cumulus/parachains/runtimes/test-utils/src/lib.rs +++ b/cumulus/parachains/runtimes/test-utils/src/lib.rs @@ -128,7 +128,7 @@ pub struct ExtBuilder< collators: Vec>, // keys added to pallet session keys: Vec<(AccountIdOf, ValidatorIdOf, SessionKeysOf)>, - // safe xcm version for pallet_xcm + // safe XCM version for pallet_xcm safe_xcm_version: Option, // para id para_id: Option, diff --git a/cumulus/scripts/bridges_common.sh b/cumulus/scripts/bridges_common.sh index 8d64c5ede52..97ef8aa1259 100755 --- a/cumulus/scripts/bridges_common.sh +++ b/cumulus/scripts/bridges_common.sh @@ -187,23 +187,25 @@ function open_hrmp_channels() { ${max_message_size} } -function set_storage() { +function force_xcm_version() { local relay_url=$1 local relay_chain_seed=$2 local runtime_para_id=$3 local runtime_para_endpoint=$4 - local items=$5 - echo " calling set_storage:" + local dest=$5 + local xcm_version=$6 + echo " calling force_xcm_version:" echo " relay_url: ${relay_url}" echo " relay_chain_seed: ${relay_chain_seed}" echo " runtime_para_id: ${runtime_para_id}" echo " runtime_para_endpoint: ${runtime_para_endpoint}" - echo " items: ${items}" + echo " dest: ${dest}" + echo " xcm_version: ${xcm_version}" echo " params:" - # 1. generate data for Transact (System::set_storage) + # 1. generate data for Transact (PolkadotXcm::force_xcm_version) local tmp_output_file=$(mktemp) - generate_hex_encoded_call_data "set-storage" "${runtime_para_endpoint}" "${tmp_output_file}" "$items" + generate_hex_encoded_call_data "force-xcm-version" "${runtime_para_endpoint}" "${tmp_output_file}" "$dest" "$xcm_version" local hex_encoded_data=$(cat $tmp_output_file) # 2. trigger governance call diff --git a/cumulus/scripts/bridges_rococo_westend.sh b/cumulus/scripts/bridges_rococo_westend.sh index 9b3bd350276..8bce141d39a 100755 --- a/cumulus/scripts/bridges_rococo_westend.sh +++ b/cumulus/scripts/bridges_rococo_westend.sh @@ -129,6 +129,7 @@ ON_BRIDGE_HUB_WESTEND_SOVEREIGN_ACCOUNT_FOR_LANE_00000002_bhro_ThisChain="5EHnXa ON_BRIDGE_HUB_WESTEND_SOVEREIGN_ACCOUNT_FOR_LANE_00000002_bhro_BridgedChain="5EHnXaT5BhiSGP5h9RgQci1txJ2BDbp7KBRE9k8xty3BMUSi" LANE_ID="00000002" +XCM_VERSION=3 function init_ro_wnd() { ensure_relayer @@ -215,6 +216,14 @@ case "$1" in "ws://127.0.0.1:9942" \ "//Alice" \ 1013 1000 4 524288 + # set XCM version of remote AssetHubWestend + force_xcm_version \ + "ws://127.0.0.1:9942" \ + "//Alice" \ + 1000 \ + "ws://127.0.0.1:9910" \ + "$(jq --null-input '{ "parents": 2, "interior": { "X2": [ { "GlobalConsensus": "Westend" }, { "Parachain": 1000 } ] } }')" \ + $XCM_VERSION ;; init-bridge-hub-rococo-local) ensure_polkadot_js_api @@ -236,6 +245,14 @@ case "$1" in "//Alice" \ "$ON_BRIDGE_HUB_ROCOCO_SOVEREIGN_ACCOUNT_FOR_LANE_00000002_bhwd_BridgedChain" \ $((1000000000000 + 2000000000000)) + # set XCM version of remote BridgeHubWestend + force_xcm_version \ + "ws://127.0.0.1:9942" \ + "//Alice" \ + 1013 \ + "ws://127.0.0.1:8943" \ + "$(jq --null-input '{ "parents": 2, "interior": { "X2": [ { "GlobalConsensus": "Westend" }, { "Parachain": 1002 } ] } }')" \ + $XCM_VERSION ;; init-asset-hub-westend-local) ensure_polkadot_js_api @@ -264,6 +281,14 @@ case "$1" in "ws://127.0.0.1:9945" \ "//Alice" \ 1002 1000 4 524288 + # set XCM version of remote AssetHubRococo + force_xcm_version \ + "ws://127.0.0.1:9945" \ + "//Alice" \ + 1000 \ + "ws://127.0.0.1:9010" \ + "$(jq --null-input '{ "parents": 2, "interior": { "X2": [ { "GlobalConsensus": "Rococo" }, { "Parachain": 1000 } ] } }')" \ + $XCM_VERSION ;; init-bridge-hub-westend-local) # SA of sibling asset hub pays for the execution @@ -284,6 +309,14 @@ case "$1" in "//Alice" \ "$ON_BRIDGE_HUB_WESTEND_SOVEREIGN_ACCOUNT_FOR_LANE_00000002_bhro_BridgedChain" \ $((1000000000000000 + 2000000000000)) + # set XCM version of remote BridgeHubRococo + force_xcm_version \ + "ws://127.0.0.1:9945" \ + "//Alice" \ + 1002 \ + "ws://127.0.0.1:8945" \ + "$(jq --null-input '{ "parents": 2, "interior": { "X2": [ { "GlobalConsensus": "Rococo" }, { "Parachain": 1013 } ] } }')" \ + $XCM_VERSION ;; reserve-transfer-assets-from-asset-hub-rococo-local) ensure_polkadot_js_api diff --git a/cumulus/scripts/generate_hex_encoded_call/index.js b/cumulus/scripts/generate_hex_encoded_call/index.js index 09f0e6aaf61..30f89d754ce 100644 --- a/cumulus/scripts/generate_hex_encoded_call/index.js +++ b/cumulus/scripts/generate_hex_encoded_call/index.js @@ -106,11 +106,11 @@ function forceCreateAsset(endpoint, outputFile, assetId, assetOwnerAccountId, is }); } -function setStorage(endpoint, outputFile, items) { - console.log(`Generating setStorage from RPC endpoint: ${endpoint} to outputFile: ${outputFile}, items: ${items}`); +function forceXcmVersion(endpoint, outputFile, dest, xcm_version) { + console.log(`Generating forceXcmVersion from RPC endpoint: ${endpoint} to outputFile: ${outputFile}, dest: ${dest}, xcm_version: ${xcm_version}`); connect(endpoint) .then((api) => { - const call = api.tx.system.setStorage(JSON.parse(items)); + const call = api.tx.polkadotXcm.forceXcmVersion(JSON.parse(dest), xcm_version); writeHexEncodedBytesToOutput(call.method, outputFile); exit(0); }) @@ -154,8 +154,8 @@ switch (type) { case 'force-create-asset': forceCreateAsset(rpcEnpoint, output, inputArgs[0], inputArgs[1], inputArgs[2], inputArgs[3]); break; - case 'set-storage': - setStorage(rpcEnpoint, output, inputArgs[0]); + case 'force-xcm-version': + forceXcmVersion(rpcEnpoint, output, inputArgs[0], inputArgs[1]); break; case 'check': console.log(`Checking nodejs installation, if you see this everything is ready!`); diff --git a/polkadot/xcm/pallet-xcm/src/lib.rs b/polkadot/xcm/pallet-xcm/src/lib.rs index ab4403f6caa..2848527f150 100644 --- a/polkadot/xcm/pallet-xcm/src/lib.rs +++ b/polkadot/xcm/pallet-xcm/src/lib.rs @@ -2591,7 +2591,7 @@ impl WrapVersion for Pallet { dest: &MultiLocation, xcm: impl Into>, ) -> Result, ()> { - SupportedVersion::::get(XCM_VERSION, LatestVersionedMultiLocation(dest)) + Self::get_version_for(dest) .or_else(|| { Self::note_unknown_version(dest); SafeXcmVersion::::get() @@ -2608,6 +2608,12 @@ impl WrapVersion for Pallet { } } +impl GetVersion for Pallet { + fn get_version_for(dest: &MultiLocation) -> Option { + SupportedVersion::::get(XCM_VERSION, LatestVersionedMultiLocation(dest)) + } +} + impl VersionChangeNotifier for Pallet { /// Start notifying `location` should the XCM version of this chain change. /// diff --git a/polkadot/xcm/pallet-xcm/src/mock.rs b/polkadot/xcm/pallet-xcm/src/mock.rs index e7f5870c914..2443d3a9cac 100644 --- a/polkadot/xcm/pallet-xcm/src/mock.rs +++ b/polkadot/xcm/pallet-xcm/src/mock.rs @@ -655,6 +655,17 @@ pub(crate) fn buy_limited_execution( pub(crate) fn new_test_ext_with_balances( balances: Vec<(AccountId, Balance)>, +) -> sp_io::TestExternalities { + new_test_ext_with_balances_and_xcm_version( + balances, + // By default set actual latest XCM version + Some(XCM_VERSION), + ) +} + +pub(crate) fn new_test_ext_with_balances_and_xcm_version( + balances: Vec<(AccountId, Balance)>, + safe_xcm_version: Option, ) -> sp_io::TestExternalities { let mut t = frame_system::GenesisConfig::::default().build_storage().unwrap(); @@ -662,7 +673,7 @@ pub(crate) fn new_test_ext_with_balances( .assimilate_storage(&mut t) .unwrap(); - pallet_xcm::GenesisConfig:: { safe_xcm_version: Some(2), ..Default::default() } + pallet_xcm::GenesisConfig:: { safe_xcm_version, ..Default::default() } .assimilate_storage(&mut t) .unwrap(); diff --git a/polkadot/xcm/pallet-xcm/src/tests/mod.rs b/polkadot/xcm/pallet-xcm/src/tests/mod.rs index 5829eb6edec..e7a6fdc9dce 100644 --- a/polkadot/xcm/pallet-xcm/src/tests/mod.rs +++ b/polkadot/xcm/pallet-xcm/src/tests/mod.rs @@ -774,12 +774,13 @@ fn subscription_side_upgrades_work_without_notify() { #[test] fn subscriber_side_subscription_works() { - new_test_ext_with_balances(vec![]).execute_with(|| { + new_test_ext_with_balances_and_xcm_version(vec![], Some(XCM_VERSION)).execute_with(|| { let remote: MultiLocation = Parachain(1000).into(); assert_ok!(XcmPallet::force_subscribe_version_notify( RuntimeOrigin::root(), Box::new(remote.into()), )); + assert_eq!(XcmPallet::get_version_for(&remote), None); take_sent_xcm(); // Assume subscription target is working ok. @@ -798,6 +799,7 @@ fn subscriber_side_subscription_works() { let r = XcmExecutor::::execute_xcm(remote, message, hash, weight); assert_eq!(r, Outcome::Complete(weight)); assert_eq!(take_sent_xcm(), vec![]); + assert_eq!(XcmPallet::get_version_for(&remote), Some(1)); // This message cannot be sent to a v2 remote. let v2_msg = xcm::v2::Xcm::<()>(vec![xcm::v2::Instruction::Trap(0)]); @@ -815,6 +817,8 @@ fn subscriber_side_subscription_works() { let hash = fake_message_hash(&message); let r = XcmExecutor::::execute_xcm(remote, message, hash, weight); assert_eq!(r, Outcome::Complete(weight)); + assert_eq!(take_sent_xcm(), vec![]); + assert_eq!(XcmPallet::get_version_for(&remote), Some(2)); // This message can now be sent to remote as it's v2. assert_eq!( @@ -827,7 +831,7 @@ fn subscriber_side_subscription_works() { /// We should auto-subscribe when we don't know the remote's version. #[test] fn auto_subscription_works() { - new_test_ext_with_balances(vec![]).execute_with(|| { + new_test_ext_with_balances_and_xcm_version(vec![], None).execute_with(|| { let remote_v2: MultiLocation = Parachain(1000).into(); let remote_v3: MultiLocation = Parachain(1001).into(); @@ -995,3 +999,68 @@ fn subscription_side_upgrades_work_with_multistage_notify() { ); }); } + +#[test] +fn get_and_wrap_version_works() { + new_test_ext_with_balances_and_xcm_version(vec![], None).execute_with(|| { + let remote_a: MultiLocation = Parachain(1000).into(); + let remote_b: MultiLocation = Parachain(1001).into(); + let remote_c: MultiLocation = Parachain(1002).into(); + + // no `safe_xcm_version` version at `GenesisConfig` + assert_eq!(XcmPallet::get_version_for(&remote_a), None); + assert_eq!(XcmPallet::get_version_for(&remote_b), None); + assert_eq!(XcmPallet::get_version_for(&remote_c), None); + assert_eq!(VersionDiscoveryQueue::::get().into_inner(), vec![]); + + // set default XCM version (a.k.a. `safe_xcm_version`) + assert_ok!(XcmPallet::force_default_xcm_version(RuntimeOrigin::root(), Some(1))); + assert_eq!(XcmPallet::get_version_for(&remote_a), None); + assert_eq!(XcmPallet::get_version_for(&remote_b), None); + assert_eq!(XcmPallet::get_version_for(&remote_c), None); + assert_eq!(VersionDiscoveryQueue::::get().into_inner(), vec![]); + + // set XCM version only for `remote_a` + assert_ok!(XcmPallet::force_xcm_version( + RuntimeOrigin::root(), + Box::new(remote_a), + XCM_VERSION + )); + assert_eq!(XcmPallet::get_version_for(&remote_a), Some(XCM_VERSION)); + assert_eq!(XcmPallet::get_version_for(&remote_b), None); + assert_eq!(XcmPallet::get_version_for(&remote_c), None); + assert_eq!(VersionDiscoveryQueue::::get().into_inner(), vec![]); + + let xcm = Xcm::<()>::default(); + + // wrap version - works because remote_a has `XCM_VERSION` + assert_eq!( + XcmPallet::wrap_version(&remote_a, xcm.clone()), + Ok(VersionedXcm::from(xcm.clone())) + ); + // does not work because remote_b has unknown version and default is set to 1, and + // `XCM_VERSION` cannot be wrapped to the `1` + assert_eq!(XcmPallet::wrap_version(&remote_b, xcm.clone()), Err(())); + assert_eq!(VersionDiscoveryQueue::::get().into_inner(), vec![(remote_b.into(), 1)]); + + // set default to the `XCM_VERSION` + assert_ok!(XcmPallet::force_default_xcm_version(RuntimeOrigin::root(), Some(XCM_VERSION))); + assert_eq!(XcmPallet::get_version_for(&remote_b), None); + assert_eq!(XcmPallet::get_version_for(&remote_c), None); + + // now works, because default is `XCM_VERSION` + assert_eq!( + XcmPallet::wrap_version(&remote_b, xcm.clone()), + Ok(VersionedXcm::from(xcm.clone())) + ); + assert_eq!(VersionDiscoveryQueue::::get().into_inner(), vec![(remote_b.into(), 2)]); + + // change remote_c to `1` + assert_ok!(XcmPallet::force_xcm_version(RuntimeOrigin::root(), Box::new(remote_c), 1)); + + // does not work because remote_c has `1` and default is `XCM_VERSION` which cannot be + // wrapped to the `1` + assert_eq!(XcmPallet::wrap_version(&remote_c, xcm.clone()), Err(())); + assert_eq!(VersionDiscoveryQueue::::get().into_inner(), vec![(remote_b.into(), 2)]); + }) +} diff --git a/polkadot/xcm/src/lib.rs b/polkadot/xcm/src/lib.rs index d804e4bf735..ddad0b5303b 100644 --- a/polkadot/xcm/src/lib.rs +++ b/polkadot/xcm/src/lib.rs @@ -373,6 +373,12 @@ pub trait WrapVersion { ) -> Result, ()>; } +/// Check and return the `Version` that should be used for the `Xcm` datum for the destination +/// `MultiLocation`, which will interpret it. +pub trait GetVersion { + fn get_version_for(dest: &latest::MultiLocation) -> Option; +} + /// `()` implementation does nothing with the XCM, just sending with whatever version it was /// authored as. impl WrapVersion for () { @@ -395,6 +401,11 @@ impl WrapVersion for AlwaysV2 { Ok(VersionedXcm::::V2(xcm.into().try_into()?)) } } +impl GetVersion for AlwaysV2 { + fn get_version_for(_dest: &latest::MultiLocation) -> Option { + Some(v2::VERSION) + } +} /// `WrapVersion` implementation which attempts to always convert the XCM to version 3 before /// wrapping it. @@ -407,6 +418,11 @@ impl WrapVersion for AlwaysV3 { Ok(VersionedXcm::::V3(xcm.into().try_into()?)) } } +impl GetVersion for AlwaysV3 { + fn get_version_for(_dest: &latest::MultiLocation) -> Option { + Some(v3::VERSION) + } +} /// `WrapVersion` implementation which attempts to always convert the XCM to the latest version /// before wrapping it. @@ -418,8 +434,8 @@ pub type AlwaysLts = AlwaysV3; pub mod prelude { pub use super::{ - latest::prelude::*, AlwaysLatest, AlwaysLts, AlwaysV2, AlwaysV3, IntoVersion, Unsupported, - Version as XcmVersion, VersionedAssetId, VersionedInteriorMultiLocation, + latest::prelude::*, AlwaysLatest, AlwaysLts, AlwaysV2, AlwaysV3, GetVersion, IntoVersion, + Unsupported, Version as XcmVersion, VersionedAssetId, VersionedInteriorMultiLocation, VersionedMultiAsset, VersionedMultiAssets, VersionedMultiLocation, VersionedResponse, VersionedXcm, WrapVersion, }; diff --git a/polkadot/xcm/xcm-builder/src/tests/bridging/local_para_para.rs b/polkadot/xcm/xcm-builder/src/tests/bridging/local_para_para.rs index de08dbee953..b1361cc8577 100644 --- a/polkadot/xcm/xcm-builder/src/tests/bridging/local_para_para.rs +++ b/polkadot/xcm/xcm-builder/src/tests/bridging/local_para_para.rs @@ -23,11 +23,16 @@ use super::*; parameter_types! { pub UniversalLocation: Junctions = X2(GlobalConsensus(Local::get()), Parachain(1)); pub RemoteUniversalLocation: Junctions = X2(GlobalConsensus(Remote::get()), Parachain(1)); + pub RemoteNetwork: MultiLocation = AncestorThen(2, GlobalConsensus(Remote::get())).into(); } type TheBridge = TestBridge>; -type Router = - TestTopic, UniversalLocation>>; +type Router = TestTopic< + UnpaidLocalExporter< + HaulBlobExporter, + UniversalLocation, + >, +>; /// ```nocompile /// local | remote diff --git a/polkadot/xcm/xcm-builder/src/tests/bridging/local_relay_relay.rs b/polkadot/xcm/xcm-builder/src/tests/bridging/local_relay_relay.rs index 8433b6e0212..5371abccf66 100644 --- a/polkadot/xcm/xcm-builder/src/tests/bridging/local_relay_relay.rs +++ b/polkadot/xcm/xcm-builder/src/tests/bridging/local_relay_relay.rs @@ -23,11 +23,16 @@ use super::*; parameter_types! { pub UniversalLocation: Junctions = X1(GlobalConsensus(Local::get())); pub RemoteUniversalLocation: Junctions = X1(GlobalConsensus(Remote::get())); + pub RemoteNetwork: MultiLocation = AncestorThen(1, GlobalConsensus(Remote::get())).into(); } type TheBridge = TestBridge>; -type Router = - TestTopic, UniversalLocation>>; +type Router = TestTopic< + UnpaidLocalExporter< + HaulBlobExporter, + UniversalLocation, + >, +>; /// ```nocompile /// local | remote diff --git a/polkadot/xcm/xcm-builder/src/tests/bridging/mod.rs b/polkadot/xcm/xcm-builder/src/tests/bridging/mod.rs index 45630dbfc24..0c749b66da6 100644 --- a/polkadot/xcm/xcm-builder/src/tests/bridging/mod.rs +++ b/polkadot/xcm/xcm-builder/src/tests/bridging/mod.rs @@ -20,6 +20,7 @@ use super::mock::*; use crate::{universal_exports::*, WithTopicSource}; use frame_support::{parameter_types, traits::Get}; use std::{cell::RefCell, marker::PhantomData}; +use xcm::AlwaysLatest; use xcm_executor::{ traits::{export_xcm, validate_export}, XcmExecutor, diff --git a/polkadot/xcm/xcm-builder/src/tests/bridging/paid_remote_relay_relay.rs b/polkadot/xcm/xcm-builder/src/tests/bridging/paid_remote_relay_relay.rs index 23d6eb99a90..079eb0175d7 100644 --- a/polkadot/xcm/xcm-builder/src/tests/bridging/paid_remote_relay_relay.rs +++ b/polkadot/xcm/xcm-builder/src/tests/bridging/paid_remote_relay_relay.rs @@ -30,6 +30,7 @@ parameter_types! { pub UniversalLocation: Junctions = X2(GlobalConsensus(Local::get()), Parachain(100)); pub RelayUniversalLocation: Junctions = X1(GlobalConsensus(Local::get())); pub RemoteUniversalLocation: Junctions = X1(GlobalConsensus(Remote::get())); + pub RemoteNetwork: MultiLocation = AncestorThen(1, GlobalConsensus(Remote::get())).into(); pub BridgeTable: Vec = vec![ NetworkExportTableItem::new( Remote::get(), @@ -41,7 +42,7 @@ parameter_types! { } type TheBridge = TestBridge>; -type RelayExporter = HaulBlobExporter; +type RelayExporter = HaulBlobExporter; type LocalInnerRouter = ExecutingRouter; type LocalBridgeRouter = SovereignPaidRemoteExporter< NetworkExportTable, diff --git a/polkadot/xcm/xcm-builder/src/tests/bridging/remote_para_para.rs b/polkadot/xcm/xcm-builder/src/tests/bridging/remote_para_para.rs index f11143ab9f6..fb6c5da3eb0 100644 --- a/polkadot/xcm/xcm-builder/src/tests/bridging/remote_para_para.rs +++ b/polkadot/xcm/xcm-builder/src/tests/bridging/remote_para_para.rs @@ -24,6 +24,7 @@ parameter_types! { pub UniversalLocation: Junctions = X2(GlobalConsensus(Local::get()), Parachain(1000)); pub ParaBridgeUniversalLocation: Junctions = X2(GlobalConsensus(Local::get()), Parachain(1)); pub RemoteParaBridgeUniversalLocation: Junctions = X2(GlobalConsensus(Remote::get()), Parachain(1)); + pub RemoteNetwork: MultiLocation = AncestorThen(2, GlobalConsensus(Remote::get())).into(); pub BridgeTable: Vec = vec![ NetworkExportTableItem::new( Remote::get(), @@ -36,7 +37,7 @@ parameter_types! { type TheBridge = TestBridge< BridgeBlobDispatcher, >; -type RelayExporter = HaulBlobExporter; +type RelayExporter = HaulBlobExporter; type LocalInnerRouter = UnpaidExecutingRouter; type LocalBridgingRouter = diff --git a/polkadot/xcm/xcm-builder/src/tests/bridging/remote_para_para_via_relay.rs b/polkadot/xcm/xcm-builder/src/tests/bridging/remote_para_para_via_relay.rs index 7218e0a0488..0b6dc01e2bf 100644 --- a/polkadot/xcm/xcm-builder/src/tests/bridging/remote_para_para_via_relay.rs +++ b/polkadot/xcm/xcm-builder/src/tests/bridging/remote_para_para_via_relay.rs @@ -24,6 +24,7 @@ parameter_types! { pub UniversalLocation: Junctions = X1(GlobalConsensus(Local::get())); pub ParaBridgeUniversalLocation: Junctions = X2(GlobalConsensus(Local::get()), Parachain(1)); pub RemoteParaBridgeUniversalLocation: Junctions = X2(GlobalConsensus(Remote::get()), Parachain(1)); + pub RemoteNetwork: MultiLocation = AncestorThen(2, GlobalConsensus(Remote::get())).into(); pub BridgeTable: Vec = vec![ NetworkExportTableItem::new( Remote::get(), @@ -36,7 +37,7 @@ parameter_types! { type TheBridge = TestBridge< BridgeBlobDispatcher, >; -type RelayExporter = HaulBlobExporter; +type RelayExporter = HaulBlobExporter; type LocalInnerRouter = UnpaidExecutingRouter; type LocalBridgingRouter = diff --git a/polkadot/xcm/xcm-builder/src/tests/bridging/remote_relay_relay.rs b/polkadot/xcm/xcm-builder/src/tests/bridging/remote_relay_relay.rs index 45b5efbc44c..e33c7b15b0a 100644 --- a/polkadot/xcm/xcm-builder/src/tests/bridging/remote_relay_relay.rs +++ b/polkadot/xcm/xcm-builder/src/tests/bridging/remote_relay_relay.rs @@ -24,6 +24,7 @@ parameter_types! { pub UniversalLocation: Junctions = X2(GlobalConsensus(Local::get()), Parachain(1000)); pub RelayUniversalLocation: Junctions = X1(GlobalConsensus(Local::get())); pub RemoteUniversalLocation: Junctions = X1(GlobalConsensus(Remote::get())); + pub RemoteNetwork: MultiLocation = AncestorThen(1, GlobalConsensus(Remote::get())).into(); pub BridgeTable: Vec = vec![ NetworkExportTableItem::new( Remote::get(), @@ -35,7 +36,7 @@ parameter_types! { } type TheBridge = TestBridge>; -type RelayExporter = HaulBlobExporter; +type RelayExporter = HaulBlobExporter; type LocalInnerRouter = UnpaidExecutingRouter; type LocalBridgeRouter = diff --git a/polkadot/xcm/xcm-builder/src/universal_exports.rs b/polkadot/xcm/xcm-builder/src/universal_exports.rs index 8e2cf88b3c3..4aa6a0ef7a5 100644 --- a/polkadot/xcm/xcm-builder/src/universal_exports.rs +++ b/polkadot/xcm/xcm-builder/src/universal_exports.rs @@ -422,11 +422,25 @@ impl< } } -pub struct HaulBlobExporter( - PhantomData<(Bridge, BridgedNetwork, Price)>, +pub struct HaulBlobExporter( + PhantomData<(Bridge, BridgedNetwork, DestinationVersion, Price)>, ); -impl, Price: Get> ExportXcm - for HaulBlobExporter +/// `ExportXcm` implementation for `HaulBlobExporter`. +/// +/// # Type Parameters +/// +/// ```text +/// - Bridge: Implements `HaulBlob`. +/// - BridgedNetwork: The relative location of the bridged consensus system with the expected `GlobalConsensus` junction. +/// - DestinationVersion: Implements `GetVersion` for retrieving XCM version for the destination. +/// - Price: potential fees for exporting. +/// ``` +impl< + Bridge: HaulBlob, + BridgedNetwork: Get, + DestinationVersion: GetVersion, + Price: Get, + > ExportXcm for HaulBlobExporter { type Ticket = (Vec, XcmHash); @@ -437,17 +451,35 @@ impl, Price: Get> destination: &mut Option, message: &mut Option>, ) -> Result<((Vec, XcmHash), MultiAssets), SendError> { - let bridged_network = BridgedNetwork::get(); + let (bridged_network, bridged_network_location_parents) = { + let MultiLocation { parents, interior: mut junctions } = BridgedNetwork::get(); + match junctions.take_first() { + Some(GlobalConsensus(network)) => (network, parents), + _ => return Err(SendError::NotApplicable), + } + }; ensure!(&network == &bridged_network, SendError::NotApplicable); // We don't/can't use the `channel` for this adapter. let dest = destination.take().ok_or(SendError::MissingArgument)?; - let universal_dest = match dest.pushed_front_with(GlobalConsensus(bridged_network)) { - Ok(d) => d.into(), - Err((dest, _)) => { - *destination = Some(dest); - return Err(SendError::NotApplicable) - }, - }; + + // Let's resolve the known/supported XCM version for the destination because we don't know + // if it supports the same/latest version. + let (universal_dest, version) = + match dest.pushed_front_with(GlobalConsensus(bridged_network)) { + Ok(d) => { + let version = DestinationVersion::get_version_for(&MultiLocation::from( + AncestorThen(bridged_network_location_parents, d), + )) + .ok_or(SendError::DestinationUnsupported)?; + (d, version) + }, + Err((dest, _)) => { + *destination = Some(dest); + return Err(SendError::NotApplicable) + }, + }; + + // Let's adjust XCM with `UniversalOrigin`, `DescendOrigin` and`SetTopic`. let (local_net, local_sub) = universal_source .take() .ok_or(SendError::MissingArgument)? @@ -462,7 +494,17 @@ impl, Price: Get> if local_sub != Here { message.0.insert(1, DescendOrigin(local_sub)); } - let message = VersionedXcm::from(message); + + // We cannot use the latest `Versioned` because we don't know if the target chain already + // supports the same version. Therefore, we better control the destination version with best + // efforts. + let message = VersionedXcm::from(message) + .into_version(version) + .map_err(|()| SendError::DestinationUnsupported)?; + let universal_dest = VersionedInteriorMultiLocation::from(universal_dest) + .into_version(version) + .map_err(|()| SendError::DestinationUnsupported)?; + let id = maybe_id.unwrap_or_else(|| message.using_encoded(sp_io::hashing::blake2_256)); let blob = BridgeMessage { universal_dest, message }.encode(); Ok(((blob, id), Price::get())) diff --git a/prdoc/pr_2481.prdoc b/prdoc/pr_2481.prdoc new file mode 100644 index 00000000000..d8736b1afd6 --- /dev/null +++ b/prdoc/pr_2481.prdoc @@ -0,0 +1,13 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "xcm-builder: `HaulBlobExporter` with improved XCM version check." + +doc: + - audience: Runtime Dev + description: | + Version check in `HaulBlobExporter` uses new trait `CheckVersion` to check known/configured destination versions, + ensuring compatibility. `HaulBlobExporter` will attempt to downgrade the message to destination's known version + instead of using the latest version. + +crates: [ ] -- GitLab From 313b2c4b6e0e7e262392294f710bc5d864a6d017 Mon Sep 17 00:00:00 2001 From: Francisco Aguirre Date: Tue, 12 Dec 2023 17:36:24 +0100 Subject: [PATCH 015/191] Fix ParentOrSiblings (#2428) We were not filtering for sibling parachains, but for sibling anything --------- Co-authored-by: Branislav Kontur Co-authored-by: command-bot <> --- cumulus/parachains/common/src/xcm_config.rs | 15 +++++++++++++++ .../assets/asset-hub-rococo/src/xcm_config.rs | 8 ++------ .../bridge-hub-rococo/src/xcm_config.rs | 9 +++------ .../bridge-hub-westend/src/xcm_config.rs | 9 +++------ .../collectives-westend/src/xcm_config.rs | 9 +++------ .../contracts/contracts-rococo/src/xcm_config.rs | 9 +++------ 6 files changed, 29 insertions(+), 30 deletions(-) diff --git a/cumulus/parachains/common/src/xcm_config.rs b/cumulus/parachains/common/src/xcm_config.rs index 97dc47cb028..7a63e720b07 100644 --- a/cumulus/parachains/common/src/xcm_config.rs +++ b/cumulus/parachains/common/src/xcm_config.rs @@ -139,6 +139,21 @@ impl> ContainsPair } } +/// Filter to check if a given location is the parent Relay Chain or a sibling parachain. +/// +/// This type should only be used within the context of a parachain, since it does not verify that +/// the parent is indeed a Relay Chain. +pub struct ParentRelayOrSiblingParachains; +impl Contains for ParentRelayOrSiblingParachains { + fn contains(location: &MultiLocation) -> bool { + matches!( + location, + MultiLocation { parents: 1, interior: Here } | + MultiLocation { parents: 1, interior: X1(Parachain(_)) } + ) + } +} + #[cfg(test)] mod tests { use frame_support::{parameter_types, traits::Contains}; diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs index 4b47aded28f..001f2af19fe 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs @@ -33,7 +33,7 @@ use parachains_common::{ impls::ToStakingPot, xcm_config::{ AllSiblingSystemParachains, AssetFeeAsExistentialDepositMultiplier, - ConcreteAssetFromSystem, RelayOrOtherSystemParachains, + ConcreteAssetFromSystem, ParentRelayOrSiblingParachains, RelayOrOtherSystemParachains, }, TREASURY_PALLET_ID, }; @@ -238,10 +238,6 @@ match_types! { MultiLocation { parents: 1, interior: Here } | MultiLocation { parents: 1, interior: X1(Plurality { .. }) } }; - pub type ParentOrSiblings: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(_) } - }; } /// A call filter for the XCM Transact instruction. This is a temporary measure until we properly @@ -486,7 +482,7 @@ pub type Barrier = TrailingSetTopicAsId< Equals, )>, // Subscriptions for version tracking are OK. - AllowSubscriptionsFrom, + AllowSubscriptionsFrom, ), UniversalLocation, ConstU32<8>, diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs index 8092bd16120..bb88c0717b2 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs @@ -34,7 +34,8 @@ use pallet_xcm::XcmPassthrough; use parachains_common::{ impls::ToStakingPot, xcm_config::{ - AllSiblingSystemParachains, ConcreteAssetFromSystem, RelayOrOtherSystemParachains, + AllSiblingSystemParachains, ConcreteAssetFromSystem, ParentRelayOrSiblingParachains, + RelayOrOtherSystemParachains, }, TREASURY_PALLET_ID, }; @@ -126,10 +127,6 @@ match_types! { MultiLocation { parents: 1, interior: Here } | MultiLocation { parents: 1, interior: X1(Plurality { .. }) } }; - pub type ParentOrSiblings: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(_) } - }; } /// A call filter for the XCM Transact instruction. This is a temporary measure until we properly @@ -212,7 +209,7 @@ pub type Barrier = TrailingSetTopicAsId< Equals, )>, // Subscriptions for version tracking are OK. - AllowSubscriptionsFrom, + AllowSubscriptionsFrom, ), UniversalLocation, ConstU32<8>, diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/xcm_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/xcm_config.rs index 009b17a4675..af3ec500f15 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/xcm_config.rs @@ -29,7 +29,8 @@ use pallet_xcm::XcmPassthrough; use parachains_common::{ impls::ToStakingPot, xcm_config::{ - AllSiblingSystemParachains, ConcreteAssetFromSystem, RelayOrOtherSystemParachains, + AllSiblingSystemParachains, ConcreteAssetFromSystem, ParentRelayOrSiblingParachains, + RelayOrOtherSystemParachains, }, TREASURY_PALLET_ID, }; @@ -115,10 +116,6 @@ match_types! { MultiLocation { parents: 1, interior: Here } | MultiLocation { parents: 1, interior: X1(Plurality { .. }) } }; - pub type ParentOrSiblings: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(_) } - }; } /// A call filter for the XCM Transact instruction. This is a temporary measure until we properly @@ -201,7 +198,7 @@ pub type Barrier = TrailingSetTopicAsId< Equals, )>, // Subscriptions for version tracking are OK. - AllowSubscriptionsFrom, + AllowSubscriptionsFrom, ), UniversalLocation, ConstU32<8>, diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/xcm_config.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/xcm_config.rs index 9b5b709ab82..c74b111ce2c 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/xcm_config.rs @@ -28,7 +28,8 @@ use pallet_xcm::XcmPassthrough; use parachains_common::{ impls::ToStakingPot, xcm_config::{ - AllSiblingSystemParachains, ConcreteAssetFromSystem, RelayOrOtherSystemParachains, + AllSiblingSystemParachains, ConcreteAssetFromSystem, ParentRelayOrSiblingParachains, + RelayOrOtherSystemParachains, }, }; use polkadot_parachain_primitives::primitives::Sibling; @@ -137,10 +138,6 @@ match_types! { MultiLocation { parents: 1, interior: Here } | MultiLocation { parents: 1, interior: X1(Plurality { .. }) } }; - pub type ParentOrSiblings: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(_) } - }; } /// A call filter for the XCM Transact instruction. This is a temporary measure until we properly @@ -242,7 +239,7 @@ pub type Barrier = TrailingSetTopicAsId< // Parent and its pluralities (i.e. governance bodies) get free execution. AllowExplicitUnpaidExecutionFrom, // Subscriptions for version tracking are OK. - AllowSubscriptionsFrom, + AllowSubscriptionsFrom, ), UniversalLocation, ConstU32<8>, diff --git a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs index a11c477cc01..e49ec64db92 100644 --- a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs @@ -28,7 +28,8 @@ use frame_system::EnsureRoot; use pallet_xcm::{EnsureXcm, IsMajorityOfBody, XcmPassthrough}; use parachains_common::{ xcm_config::{ - AllSiblingSystemParachains, ConcreteAssetFromSystem, RelayOrOtherSystemParachains, + AllSiblingSystemParachains, ConcreteAssetFromSystem, ParentRelayOrSiblingParachains, + RelayOrOtherSystemParachains, }, TREASURY_PALLET_ID, }; @@ -124,10 +125,6 @@ match_types! { MultiLocation { parents: 1, interior: Here } | MultiLocation { parents: 1, interior: X1(Plurality { .. }) } }; - pub type ParentOrSiblings: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(_) } - }; } pub type Barrier = TrailingSetTopicAsId< @@ -150,7 +147,7 @@ pub type Barrier = TrailingSetTopicAsId< Equals, )>, // Subscriptions for version tracking are OK. - AllowSubscriptionsFrom, + AllowSubscriptionsFrom, ), UniversalLocation, ConstU32<8>, -- GitLab From d43d2fe23b12355eed4afa6dd3e971a248269262 Mon Sep 17 00:00:00 2001 From: Egor_P Date: Tue, 12 Dec 2023 17:51:54 +0100 Subject: [PATCH 016/191] Update prdoc (#2697) Small update of the title in one of the prdoc files --- prdoc/1.5.0/pr_2625_special.prdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prdoc/1.5.0/pr_2625_special.prdoc b/prdoc/1.5.0/pr_2625_special.prdoc index 21803d93dca..3ffcf598660 100644 --- a/prdoc/1.5.0/pr_2625_special.prdoc +++ b/prdoc/1.5.0/pr_2625_special.prdoc @@ -1,4 +1,4 @@ -title: Bridges update subtree +title: Improved `ExportXcm::validate` implementation for BridgeHubs author: bkontur topic: bridges -- GitLab From 0470bd6851bbf7d1a4af593ede35d9a628510150 Mon Sep 17 00:00:00 2001 From: Parth Date: Tue, 12 Dec 2023 23:50:08 +0400 Subject: [PATCH 017/191] Make crate visible methods of `OverlayedChanges` public (#2597) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Description - What does this PR do? This PR make some methods of `OverlayedChanges` public which were previously only visible in same crate. - Why are these changes needed? Since, some methods of the `OverlayedChanges` only have crate level visibility, which makes `OverlayedChanges` somewhat unusable outside the crate to create custom implementation of `Externalities`. We make those method public to enable `OverlayedChanges` to remedy this. - How were these changes implemented and what do they affect? Changes are implemented by replacing crate visibility to public visibility of 4 functions. # Checklist - [x] My PR includes a detailed description as outlined in the "Description" section above - [ ] My PR follows the [labeling requirements](CONTRIBUTING.md#Process) of this project (at minimum one label for `T` required) - [ ] I have made corresponding changes to the documentation (if applicable) - [ ] I have added tests that prove my fix is effective or that my feature works (if applicable) --------- Co-authored-by: Bastian Köcher --- prdoc/pr_2597.prdoc | 17 +++++++++++++++++ .../state-machine/src/overlayed_changes/mod.rs | 8 ++++---- 2 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 prdoc/pr_2597.prdoc diff --git a/prdoc/pr_2597.prdoc b/prdoc/pr_2597.prdoc new file mode 100644 index 00000000000..33d85053184 --- /dev/null +++ b/prdoc/pr_2597.prdoc @@ -0,0 +1,17 @@ +title: Make crate visible methods of `OverlayedChanges` public. + +doc: + - audience: Node Dev + description: | + Make some methods of `OverlayedChanges` namely `set_child_storage`, `clear_child_storage`, `clear_prefix` + and `clear_child_prefix` public which only had crate level visibility. + +migrations: + db: [] + + runtime: [] + +crates: + - name: sp-state-machine + +host_functions: [] diff --git a/substrate/primitives/state-machine/src/overlayed_changes/mod.rs b/substrate/primitives/state-machine/src/overlayed_changes/mod.rs index 9525c2c9dfe..626cf6c3caf 100644 --- a/substrate/primitives/state-machine/src/overlayed_changes/mod.rs +++ b/substrate/primitives/state-machine/src/overlayed_changes/mod.rs @@ -348,7 +348,7 @@ impl OverlayedChanges { /// `None` can be used to delete a value specified by the given key. /// /// Can be rolled back or committed when called inside a transaction. - pub(crate) fn set_child_storage( + pub fn set_child_storage( &mut self, child_info: &ChildInfo, key: StorageKey, @@ -373,7 +373,7 @@ impl OverlayedChanges { /// Clear child storage of given storage key. /// /// Can be rolled back or committed when called inside a transaction. - pub(crate) fn clear_child_storage(&mut self, child_info: &ChildInfo) -> u32 { + pub fn clear_child_storage(&mut self, child_info: &ChildInfo) -> u32 { self.mark_dirty(); let extrinsic_index = self.extrinsic_index(); @@ -391,7 +391,7 @@ impl OverlayedChanges { /// Removes all key-value pairs which keys share the given prefix. /// /// Can be rolled back or committed when called inside a transaction. - pub(crate) fn clear_prefix(&mut self, prefix: &[u8]) -> u32 { + pub fn clear_prefix(&mut self, prefix: &[u8]) -> u32 { self.mark_dirty(); self.top.clear_where(|key, _| key.starts_with(prefix), self.extrinsic_index()) @@ -400,7 +400,7 @@ impl OverlayedChanges { /// Removes all key-value pairs which keys share the given prefix. /// /// Can be rolled back or committed when called inside a transaction - pub(crate) fn clear_child_prefix(&mut self, child_info: &ChildInfo, prefix: &[u8]) -> u32 { + pub fn clear_child_prefix(&mut self, child_info: &ChildInfo, prefix: &[u8]) -> u32 { self.mark_dirty(); let extrinsic_index = self.extrinsic_index(); -- GitLab From d18a682bf710fb3ce2ca21b186fb4e449e9ae857 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Tue, 12 Dec 2023 21:01:36 +0100 Subject: [PATCH 018/191] [ci] Add `-D warnings` for `cargo-check-each-crate` job to fail on warnings (#2670) ## Summary This PR turns on `-D warnings` for `cargo-check-each-crate job` job to fail on warnings e.g. like this: https://gitlab.parity.io/parity/mirrors/polkadot-sdk/-/jobs/4673130 Before this PR, there was a warning and `cargo-check-each-crate` job did not fail: https://gitlab.parity.io/parity/mirrors/polkadot-sdk/-/jobs/4641444 ``` warning: unused import: `ToTokens` --> substrate/primitives/api/proc-macro/src/utils.rs:22:34 | 22 | use quote::{format_ident, quote, ToTokens}; | ^^^^^^^^ | = note: `#[warn(unused_imports)]` on by default warning: `sp-api-proc-macro` (lib) generated 1 warning (run `cargo fix --lib -p sp-api-proc-macro` to apply 1 suggestion) ``` Fixes on the way: https://gitlab.parity.io/parity/mirrors/polkadot-sdk/-/jobs/4641444 https://gitlab.parity.io/parity/mirrors/polkadot-sdk/-/jobs/4673265 https://gitlab.parity.io/parity/mirrors/polkadot-sdk/-/jobs/4673410 https://gitlab.parity.io/parity/mirrors/polkadot-sdk/-/jobs/4673681 https://gitlab.parity.io/parity/mirrors/polkadot-sdk/-/jobs/4673836 https://gitlab.parity.io/parity/mirrors/polkadot-sdk/-/jobs/4673941 https://gitlab.parity.io/parity/mirrors/polkadot-sdk/-/jobs/4674256 https://gitlab.parity.io/parity/mirrors/polkadot-sdk/-/jobs/4679328 ## Questions - [ ] why does this check triggers only `cargo check --locked`? `--all-features` or `--all-targets` are not needed? Or aren't they avoided intentionally? --------- Co-authored-by: command-bot <> --- .gitlab/pipeline/test.yml | 1 + substrate/client/network/src/behaviour.rs | 2 +- substrate/client/network/src/protocol/message.rs | 4 ---- .../client/network/src/protocol/notifications/upgrade.rs | 8 +++++--- substrate/client/offchain/src/api.rs | 1 - substrate/client/transaction-pool/src/graph/mod.rs | 5 +---- substrate/frame/contracts/proc-macro/src/lib.rs | 2 +- substrate/primitives/api/proc-macro/src/utils.rs | 3 ++- substrate/primitives/state-machine/src/lib.rs | 1 - 9 files changed, 11 insertions(+), 16 deletions(-) diff --git a/.gitlab/pipeline/test.yml b/.gitlab/pipeline/test.yml index f6dad887a68..0e7d96f3dba 100644 --- a/.gitlab/pipeline/test.yml +++ b/.gitlab/pipeline/test.yml @@ -438,6 +438,7 @@ cargo-check-each-crate: - .run-immediately # - .collect-artifacts variables: + RUSTFLAGS: "-D warnings" # $CI_JOB_NAME is set manually so that cache could be shared for all jobs # "cargo-check-each-crate I/N" jobs CI_JOB_NAME: cargo-check-each-crate diff --git a/substrate/client/network/src/behaviour.rs b/substrate/client/network/src/behaviour.rs index 9f770bc3ba7..745550412fc 100644 --- a/substrate/client/network/src/behaviour.rs +++ b/substrate/client/network/src/behaviour.rs @@ -39,7 +39,7 @@ use parking_lot::Mutex; use sp_runtime::traits::Block as BlockT; use std::{collections::HashSet, sync::Arc, time::Duration}; -pub use crate::request_responses::{InboundFailure, OutboundFailure, RequestId, ResponseFailure}; +pub use crate::request_responses::{InboundFailure, OutboundFailure, ResponseFailure}; /// General behaviour of the network. Combines all protocols together. #[derive(NetworkBehaviour)] diff --git a/substrate/client/network/src/protocol/message.rs b/substrate/client/network/src/protocol/message.rs index 247580083f9..5f2511fd6dd 100644 --- a/substrate/client/network/src/protocol/message.rs +++ b/substrate/client/network/src/protocol/message.rs @@ -19,10 +19,6 @@ //! Network packet message types. These get serialized and put into the lower level protocol //! payload. -pub use self::generic::{ - RemoteCallRequest, RemoteChangesRequest, RemoteChangesResponse, RemoteHeaderRequest, - RemoteHeaderResponse, RemoteReadChildRequest, RemoteReadRequest, -}; use codec::{Decode, Encode}; use sc_client_api::StorageProof; use sc_network_common::message::RequestId; diff --git a/substrate/client/network/src/protocol/notifications/upgrade.rs b/substrate/client/network/src/protocol/notifications/upgrade.rs index 70c6023623f..8fd837f949d 100644 --- a/substrate/client/network/src/protocol/notifications/upgrade.rs +++ b/substrate/client/network/src/protocol/notifications/upgrade.rs @@ -16,12 +16,14 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +#[cfg(test)] +pub(crate) use self::notifications::{ + NotificationsInOpen, NotificationsInSubstreamHandshake, NotificationsOutOpen, +}; pub use self::{ collec::UpgradeCollec, notifications::{ - NotificationsHandshakeError, NotificationsIn, NotificationsInOpen, - NotificationsInSubstream, NotificationsInSubstreamHandshake, NotificationsOut, - NotificationsOutError, NotificationsOutOpen, NotificationsOutSubstream, + NotificationsIn, NotificationsInSubstream, NotificationsOut, NotificationsOutSubstream, }, }; diff --git a/substrate/client/offchain/src/api.rs b/substrate/client/offchain/src/api.rs index 40f866b6d28..65e2f3ba64d 100644 --- a/substrate/client/offchain/src/api.rs +++ b/substrate/client/offchain/src/api.rs @@ -30,7 +30,6 @@ use sp_core::{ }, OpaquePeerId, }; -pub use sp_offchain::STORAGE_PREFIX; mod http; diff --git a/substrate/client/transaction-pool/src/graph/mod.rs b/substrate/client/transaction-pool/src/graph/mod.rs index 5afdddb7402..484a6d6cf9f 100644 --- a/substrate/client/transaction-pool/src/graph/mod.rs +++ b/substrate/client/transaction-pool/src/graph/mod.rs @@ -39,9 +39,6 @@ pub mod watcher; pub use self::{ base_pool::Transaction, - pool::{ - BlockHash, ChainApi, EventStream, ExtrinsicFor, ExtrinsicHash, NumberFor, Options, Pool, - TransactionFor, - }, + pool::{BlockHash, ChainApi, ExtrinsicFor, ExtrinsicHash, NumberFor, Options, Pool}, }; pub use validated_pool::{IsValidator, ValidatedTransaction}; diff --git a/substrate/frame/contracts/proc-macro/src/lib.rs b/substrate/frame/contracts/proc-macro/src/lib.rs index 4ef02497b8e..9dc34d5223b 100644 --- a/substrate/frame/contracts/proc-macro/src/lib.rs +++ b/substrate/frame/contracts/proc-macro/src/lib.rs @@ -74,7 +74,7 @@ fn derive_debug(input: TokenStream, fmt: impl Fn(&Ident) -> TokenStream2) -> Tok #[cfg(not(feature = "full"))] let fields = { drop(fmt); - drop(data); + let _ = data; TokenStream2::new() }; diff --git a/substrate/primitives/api/proc-macro/src/utils.rs b/substrate/primitives/api/proc-macro/src/utils.rs index 68f0a77a399..c8c1f12d90a 100644 --- a/substrate/primitives/api/proc-macro/src/utils.rs +++ b/substrate/primitives/api/proc-macro/src/utils.rs @@ -19,7 +19,7 @@ use crate::common::API_VERSION_ATTRIBUTE; use inflector::Inflector; use proc_macro2::{Span, TokenStream}; use proc_macro_crate::{crate_name, FoundCrate}; -use quote::{format_ident, quote, ToTokens}; +use quote::{format_ident, quote}; use syn::{ parse_quote, spanned::Spanned, token::And, Attribute, Error, FnArg, GenericArgument, Ident, ImplItem, ItemImpl, Pat, Path, PathArguments, Result, ReturnType, Signature, Type, TypePath, @@ -261,6 +261,7 @@ pub fn versioned_trait_name(trait_ident: &Ident, version: u64) -> Ident { /// Extract the documentation from the provided attributes. #[cfg(feature = "frame-metadata")] pub fn get_doc_literals(attrs: &[syn::Attribute]) -> Vec { + use quote::ToTokens; attrs .iter() .filter_map(|attr| { diff --git a/substrate/primitives/state-machine/src/lib.rs b/substrate/primitives/state-machine/src/lib.rs index 1345097e8f6..5909a30a814 100644 --- a/substrate/primitives/state-machine/src/lib.rs +++ b/substrate/primitives/state-machine/src/lib.rs @@ -142,7 +142,6 @@ pub use crate::{ mod std_reexport { pub use crate::{ basic::BasicExternalities, - error::{Error, ExecutionError}, in_memory_backend::new_in_mem, read_only::{InspectState, ReadOnlyExternalities}, testing::TestExternalities, -- GitLab From a84dd0dba58d51503b8942360aa4fb30a5a96af5 Mon Sep 17 00:00:00 2001 From: Alexandru Gheorghe <49718502+alexggh@users.noreply.github.com> Date: Wed, 13 Dec 2023 08:43:15 +0200 Subject: [PATCH 019/191] Approve multiple candidates with a single signature (#1191) Initial implementation for the plan discussed here: https://github.com/paritytech/polkadot-sdk/issues/701 Built on top of https://github.com/paritytech/polkadot-sdk/pull/1178 v0: https://github.com/paritytech/polkadot/pull/7554, ## Overall idea When approval-voting checks a candidate and is ready to advertise the approval, defer it in a per-relay chain block until we either have MAX_APPROVAL_COALESCE_COUNT candidates to sign or a candidate has stayed MAX_APPROVALS_COALESCE_TICKS in the queue, in both cases we sign what candidates we have available. This should allow us to reduce the number of approvals messages we have to create/send/verify. The parameters are configurable, so we should find some values that balance: - Security of the network: Delaying broadcasting of an approval shouldn't but the finality at risk and to make sure that never happens we won't delay sending a vote if we are past 2/3 from the no-show time. - Scalability of the network: MAX_APPROVAL_COALESCE_COUNT = 1 & MAX_APPROVALS_COALESCE_TICKS =0, is what we have now and we know from the measurements we did on versi, it bottlenecks approval-distribution/approval-voting when increase significantly the number of validators and parachains - Block storage: In case of disputes we have to import this votes on chain and that increase the necessary storage with MAX_APPROVAL_COALESCE_COUNT * CandidateHash per vote. Given that disputes are not the normal way of the network functioning and we will limit MAX_APPROVAL_COALESCE_COUNT in the single digits numbers, this should be good enough. Alternatively, we could try to create a better way to store this on-chain through indirection, if that's needed. ## Other fixes: - Fixed the fact that we were sending random assignments to non-validators, that was wrong because those won't do anything with it and they won't gossip it either because they do not have a grid topology set, so we would waste the random assignments. - Added metrics to be able to debug potential no-shows and mis-processing of approvals/assignments. ## TODO: - [x] Get feedback, that this is moving in the right direction. @ordian @sandreim @eskimor @burdges, let me know what you think. - [x] More and more testing. - [x] Test in versi. - [x] Make MAX_APPROVAL_COALESCE_COUNT & MAX_APPROVAL_COALESCE_WAIT_MILLIS a parachain host configuration. - [x] Make sure the backwards compatibility works correctly - [x] Make sure this direction is compatible with other streams of work: https://github.com/paritytech/polkadot-sdk/issues/635 & https://github.com/paritytech/polkadot-sdk/issues/742 - [x] Final versi burn-in before merging --------- Signed-off-by: Alexandru Gheorghe --- .gitlab/pipeline/zombienet/polkadot.yml | 8 + .../src/blockchain_rpc_client.rs | 14 +- .../src/rpc_client.rs | 15 +- .../emulated/chains/relays/rococo/src/lib.rs | 2 +- .../emulated/chains/relays/westend/src/lib.rs | 2 +- polkadot/Cargo.toml | 1 - polkadot/cli/Cargo.toml | 2 - .../approval-voting/src/approval_checking.rs | 212 +++-- .../approval_db/common/migration_helpers.rs | 39 + .../src/approval_db/common/mod.rs | 293 ++++++ .../approval-voting/src/approval_db/mod.rs | 2 + .../src/approval_db/v1/tests.rs | 4 - .../src/approval_db/v2/migration_helpers.rs | 74 +- .../approval-voting/src/approval_db/v2/mod.rs | 251 +---- .../src/approval_db/v2/tests.rs | 68 +- .../src/approval_db/v3/migration_helpers.rs | 237 +++++ .../approval-voting/src/approval_db/v3/mod.rs | 137 +++ .../src/approval_db/v3/tests.rs | 575 ++++++++++++ .../node/core/approval-voting/src/backend.rs | 18 +- .../node/core/approval-voting/src/import.rs | 24 +- polkadot/node/core/approval-voting/src/lib.rs | 856 ++++++++++++++---- polkadot/node/core/approval-voting/src/ops.rs | 2 +- .../approval-voting/src/persisted_entries.rs | 292 +++++- .../node/core/approval-voting/src/tests.rs | 581 +++++++++++- .../node/core/approval-voting/src/time.rs | 165 +++- .../core/dispute-coordinator/src/import.rs | 38 +- .../dispute-coordinator/src/initialized.rs | 4 +- .../node/core/dispute-coordinator/src/lib.rs | 2 +- .../core/dispute-coordinator/src/tests.rs | 11 +- .../src/disputes/prioritized_selection/mod.rs | 2 +- polkadot/node/core/runtime-api/src/cache.rs | 31 +- polkadot/node/core/runtime-api/src/lib.rs | 13 + polkadot/node/core/runtime-api/src/tests.rs | 22 +- .../network/approval-distribution/src/lib.rs | 734 +++++++++------ .../approval-distribution/src/metrics.rs | 148 +++ .../approval-distribution/src/tests.rs | 746 ++++++++++++--- .../network/bitfield-distribution/src/lib.rs | 18 +- polkadot/node/network/bridge/src/network.rs | 12 +- polkadot/node/network/bridge/src/rx/mod.rs | 97 +- polkadot/node/network/bridge/src/rx/tests.rs | 16 +- polkadot/node/network/bridge/src/tx/mod.rs | 10 +- .../src/collator_side/mod.rs | 6 +- .../src/validator_side/mod.rs | 6 +- .../node/network/gossip-support/src/lib.rs | 2 +- polkadot/node/network/protocol/Cargo.toml | 3 - .../network/protocol/src/grid_topology.rs | 21 +- polkadot/node/network/protocol/src/lib.rs | 61 +- .../node/network/protocol/src/peer_set.rs | 55 +- .../src/legacy_v1/mod.rs | 30 +- .../network/statement-distribution/src/lib.rs | 8 +- .../statement-distribution/src/v2/mod.rs | 90 +- .../src/v2/tests/grid.rs | 2 +- polkadot/node/primitives/src/approval.rs | 57 +- .../node/primitives/src/disputes/message.rs | 2 +- polkadot/node/primitives/src/disputes/mod.rs | 23 +- polkadot/node/service/Cargo.toml | 4 - .../node/service/src/parachains_db/upgrade.rs | 99 +- polkadot/node/subsystem-types/src/messages.rs | 35 +- .../subsystem-types/src/runtime_client.rs | 33 +- .../undying/collator/Cargo.toml | 3 - polkadot/primitives/src/runtime_api.rs | 17 +- polkadot/primitives/src/v6/mod.rs | 70 +- polkadot/primitives/src/vstaging/mod.rs | 32 + .../src/node/approval/approval-voting.md | 47 +- .../src/protocol-approval.md | 12 + polkadot/runtime/parachains/src/builder.rs | 2 +- .../runtime/parachains/src/configuration.rs | 29 +- .../parachains/src/configuration/migration.rs | 1 + .../src/configuration/migration/v10.rs | 110 ++- .../src/configuration/migration/v11.rs | 329 +++++++ .../src/configuration/migration/v8.rs | 2 +- .../parachains/src/configuration/tests.rs | 1 + polkadot/runtime/parachains/src/disputes.rs | 34 +- .../runtime/parachains/src/disputes/tests.rs | 126 ++- .../src/runtime_api_impl/vstaging.rs | 11 +- polkadot/runtime/rococo/src/lib.rs | 20 +- polkadot/runtime/westend/src/lib.rs | 21 +- .../functional/0001-parachains-pvf.zndsl | 2 + .../functional/0002-parachains-disputes.toml | 4 + .../0009-approval-voting-coalescing.toml | 115 +++ .../0009-approval-voting-coalescing.zndsl | 32 + prdoc/pr_1191.prdoc | 21 + 82 files changed, 5878 insertions(+), 1478 deletions(-) create mode 100644 polkadot/node/core/approval-voting/src/approval_db/common/migration_helpers.rs create mode 100644 polkadot/node/core/approval-voting/src/approval_db/common/mod.rs create mode 100644 polkadot/node/core/approval-voting/src/approval_db/v3/migration_helpers.rs create mode 100644 polkadot/node/core/approval-voting/src/approval_db/v3/mod.rs create mode 100644 polkadot/node/core/approval-voting/src/approval_db/v3/tests.rs create mode 100644 polkadot/runtime/parachains/src/configuration/migration/v11.rs create mode 100644 polkadot/zombienet_tests/functional/0009-approval-voting-coalescing.toml create mode 100644 polkadot/zombienet_tests/functional/0009-approval-voting-coalescing.zndsl create mode 100644 prdoc/pr_1191.prdoc diff --git a/.gitlab/pipeline/zombienet/polkadot.yml b/.gitlab/pipeline/zombienet/polkadot.yml index d1f3a201c80..356abaa93cd 100644 --- a/.gitlab/pipeline/zombienet/polkadot.yml +++ b/.gitlab/pipeline/zombienet/polkadot.yml @@ -131,6 +131,14 @@ zombienet-polkadot-functional-0008-dispute-old-finalized: --local-dir="${LOCAL_DIR}/functional" --test="0008-dispute-old-finalized.zndsl" +zombienet-polkadot-functional-0009-approval-voting-coalescing: + extends: + - .zombienet-polkadot-common + script: + - /home/nonroot/zombie-net/scripts/ci/run-test-local-env-manager.sh + --local-dir="${LOCAL_DIR}/functional" + --test="0009-approval-voting-coalescing.zndsl" + zombienet-polkadot-smoke-0001-parachains-smoke-test: extends: - .zombienet-polkadot-common diff --git a/cumulus/client/relay-chain-minimal-node/src/blockchain_rpc_client.rs b/cumulus/client/relay-chain-minimal-node/src/blockchain_rpc_client.rs index d9e4155d9c5..ab56b62c4ca 100644 --- a/cumulus/client/relay-chain-minimal-node/src/blockchain_rpc_client.rs +++ b/cumulus/client/relay-chain-minimal-node/src/blockchain_rpc_client.rs @@ -24,7 +24,7 @@ use polkadot_overseer::{ChainApiBackend, RuntimeApiSubsystemClient}; use polkadot_primitives::{ async_backing::{AsyncBackingParams, BackingState}, slashing, - vstaging::NodeFeatures, + vstaging::{ApprovalVotingParams, NodeFeatures}, }; use sc_authority_discovery::{AuthorityDiscovery, Error as AuthorityDiscoveryError}; use sc_client_api::AuxStore; @@ -427,6 +427,18 @@ impl RuntimeApiSubsystemClient for BlockChainRpcClient { Ok(self.rpc_client.parachain_host_para_backing_state(at, para_id).await?) } + /// Approval voting configuration parameters + async fn approval_voting_params( + &self, + at: Hash, + session_index: polkadot_primitives::SessionIndex, + ) -> Result { + Ok(self + .rpc_client + .parachain_host_staging_approval_voting_params(at, session_index) + .await?) + } + async fn node_features(&self, at: Hash) -> Result { Ok(self.rpc_client.parachain_host_node_features(at).await?) } diff --git a/cumulus/client/relay-chain-rpc-interface/src/rpc_client.rs b/cumulus/client/relay-chain-rpc-interface/src/rpc_client.rs index 8e0d5fae677..c64fff77a29 100644 --- a/cumulus/client/relay-chain-rpc-interface/src/rpc_client.rs +++ b/cumulus/client/relay-chain-rpc-interface/src/rpc_client.rs @@ -32,7 +32,7 @@ use cumulus_primitives_core::{ relay_chain::{ async_backing::{AsyncBackingParams, BackingState}, slashing, - vstaging::NodeFeatures, + vstaging::{ApprovalVotingParams, NodeFeatures}, BlockNumber, CandidateCommitments, CandidateEvent, CandidateHash, CommittedCandidateReceipt, CoreState, DisputeState, ExecutorParams, GroupRotationInfo, Hash as RelayHash, Header as RelayHeader, InboundHrmpMessage, OccupiedCoreAssumption, @@ -625,6 +625,19 @@ impl RelayChainRpcClient { } #[allow(missing_docs)] + pub async fn parachain_host_staging_approval_voting_params( + &self, + at: RelayHash, + _session_index: SessionIndex, + ) -> Result { + self.call_remote_runtime_function( + "ParachainHost_staging_approval_voting_params", + at, + None::<()>, + ) + .await + } + pub async fn parachain_host_para_backing_state( &self, at: RelayHash, diff --git a/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/src/lib.rs b/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/src/lib.rs index 7ace9614710..0791f63235f 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/src/lib.rs @@ -24,7 +24,7 @@ use emulated_integration_tests_common::{ // Rococo declaration decl_test_relay_chains! { - #[api_version(9)] + #[api_version(10)] pub struct Rococo { genesis = genesis::genesis(), on_init = (), diff --git a/cumulus/parachains/integration-tests/emulated/chains/relays/westend/src/lib.rs b/cumulus/parachains/integration-tests/emulated/chains/relays/westend/src/lib.rs index 2ba47250d56..8a5d4bbf808 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/relays/westend/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/relays/westend/src/lib.rs @@ -24,7 +24,7 @@ use emulated_integration_tests_common::{ // Westend declaration decl_test_relay_chains! { - #[api_version(9)] + #[api_version(10)] pub struct Westend { genesis = genesis::genesis(), on_init = (), diff --git a/polkadot/Cargo.toml b/polkadot/Cargo.toml index 6896d3c4b22..d8c6cc51bea 100644 --- a/polkadot/Cargo.toml +++ b/polkadot/Cargo.toml @@ -64,7 +64,6 @@ jemalloc-allocator = [ "polkadot-node-core-pvf/jemalloc-allocator", "polkadot-overseer/jemalloc-allocator", ] -network-protocol-staging = ["polkadot-cli/network-protocol-staging"] # Enables timeout-based tests supposed to be run only in CI environment as they may be flaky diff --git a/polkadot/cli/Cargo.toml b/polkadot/cli/Cargo.toml index 77f73ead2ed..95b63913ccb 100644 --- a/polkadot/cli/Cargo.toml +++ b/polkadot/cli/Cargo.toml @@ -75,5 +75,3 @@ runtime-metrics = [ "polkadot-node-metrics/runtime-metrics", "service/runtime-metrics", ] - -network-protocol-staging = ["service/network-protocol-staging"] diff --git a/polkadot/node/core/approval-voting/src/approval_checking.rs b/polkadot/node/core/approval-voting/src/approval_checking.rs index 5d24ff16419..0aa6102fbd6 100644 --- a/polkadot/node/core/approval-voting/src/approval_checking.rs +++ b/polkadot/node/core/approval-voting/src/approval_checking.rs @@ -25,6 +25,15 @@ use crate::{ time::Tick, }; +/// Result of counting the necessary tranches needed for approving a block. +#[derive(Debug, PartialEq, Clone)] +pub struct TranchesToApproveResult { + /// The required tranches for approving this block + pub required_tranches: RequiredTranches, + /// The total number of no_shows at the moment we are doing the counting. + pub total_observed_no_shows: usize, +} + /// The required tranches of assignments needed to determine whether a candidate is approved. #[derive(Debug, PartialEq, Clone)] pub enum RequiredTranches { @@ -64,7 +73,7 @@ pub enum RequiredTranches { } /// The result of a check. -#[derive(Debug, Clone, Copy)] +#[derive(Debug, Clone, Copy, PartialEq)] pub enum Check { /// The candidate is unapproved. Unapproved, @@ -178,6 +187,7 @@ struct State { next_no_show: Option, /// The last tick at which a considered assignment was received. last_assignment_tick: Option, + total_observed_no_shows: usize, } impl State { @@ -187,41 +197,53 @@ impl State { needed_approvals: usize, n_validators: usize, no_show_duration: Tick, - ) -> RequiredTranches { + ) -> TranchesToApproveResult { let covering = if self.depth == 0 { 0 } else { self.covering }; if self.depth != 0 && self.assignments + covering + self.uncovered >= n_validators { - return RequiredTranches::All + return TranchesToApproveResult { + required_tranches: RequiredTranches::All, + total_observed_no_shows: self.total_observed_no_shows, + } } // If we have enough assignments and all no-shows are covered, we have reached the number // of tranches that we need to have. if self.assignments >= needed_approvals && (covering + self.uncovered) == 0 { - return RequiredTranches::Exact { - needed: tranche, - tolerated_missing: self.covered, - next_no_show: self.next_no_show, - last_assignment_tick: self.last_assignment_tick, + return TranchesToApproveResult { + required_tranches: RequiredTranches::Exact { + needed: tranche, + tolerated_missing: self.covered, + next_no_show: self.next_no_show, + last_assignment_tick: self.last_assignment_tick, + }, + total_observed_no_shows: self.total_observed_no_shows, } } // We're pending more assignments and should look at more tranches. let clock_drift = self.clock_drift(no_show_duration); if self.depth == 0 { - RequiredTranches::Pending { - considered: tranche, - next_no_show: self.next_no_show, - // during the initial assignment-gathering phase, we want to accept assignments - // from any tranche. Note that honest validators will still not broadcast their - // assignment until it is time to do so, regardless of this value. - maximum_broadcast: DelayTranche::max_value(), - clock_drift, + TranchesToApproveResult { + required_tranches: RequiredTranches::Pending { + considered: tranche, + next_no_show: self.next_no_show, + // during the initial assignment-gathering phase, we want to accept assignments + // from any tranche. Note that honest validators will still not broadcast their + // assignment until it is time to do so, regardless of this value. + maximum_broadcast: DelayTranche::max_value(), + clock_drift, + }, + total_observed_no_shows: self.total_observed_no_shows, } } else { - RequiredTranches::Pending { - considered: tranche, - next_no_show: self.next_no_show, - maximum_broadcast: tranche + (covering + self.uncovered) as DelayTranche, - clock_drift, + TranchesToApproveResult { + required_tranches: RequiredTranches::Pending { + considered: tranche, + next_no_show: self.next_no_show, + maximum_broadcast: tranche + (covering + self.uncovered) as DelayTranche, + clock_drift, + }, + total_observed_no_shows: self.total_observed_no_shows, } } } @@ -276,6 +298,7 @@ impl State { uncovered, next_no_show, last_assignment_tick, + total_observed_no_shows: self.total_observed_no_shows + new_no_shows, } } } @@ -372,7 +395,7 @@ pub fn tranches_to_approve( block_tick: Tick, no_show_duration: Tick, needed_approvals: usize, -) -> RequiredTranches { +) -> TranchesToApproveResult { let tick_now = tranche_now as Tick + block_tick; let n_validators = approval_entry.n_validators(); @@ -384,6 +407,7 @@ pub fn tranches_to_approve( uncovered: 0, next_no_show: None, last_assignment_tick: None, + total_observed_no_shows: 0, }; // The `ApprovalEntry` doesn't have any data for empty tranches. We still want to iterate over @@ -434,7 +458,7 @@ pub fn tranches_to_approve( let s = s.advance(n_assignments, no_shows, next_no_show, last_assignment_tick); let output = s.output(tranche, needed_approvals, n_validators, no_show_duration); - *state = match output { + *state = match output.required_tranches { RequiredTranches::Exact { .. } | RequiredTranches::All => { // Wipe the state clean so the next iteration of this closure will terminate // the iterator. This guarantees that we can call `last` further down to see @@ -464,15 +488,17 @@ mod tests { #[test] fn pending_is_not_approved() { - let candidate = approval_db::v1::CandidateEntry { - candidate: dummy_candidate_receipt(dummy_hash()), - session: 0, - block_assignments: BTreeMap::default(), - approvals: BitVec::default(), - } - .into(); + let candidate = CandidateEntry::from_v1( + approval_db::v1::CandidateEntry { + candidate: dummy_candidate_receipt(dummy_hash()), + session: 0, + block_assignments: BTreeMap::default(), + approvals: BitVec::default(), + }, + 0, + ); - let approval_entry = approval_db::v2::ApprovalEntry { + let approval_entry = approval_db::v3::ApprovalEntry { tranches: Vec::new(), assigned_validators: BitVec::default(), our_assignment: None, @@ -497,29 +523,31 @@ mod tests { #[test] fn exact_takes_only_assignments_up_to() { - let mut candidate: CandidateEntry = approval_db::v1::CandidateEntry { - candidate: dummy_candidate_receipt(dummy_hash()), - session: 0, - block_assignments: BTreeMap::default(), - approvals: bitvec![u8, BitOrderLsb0; 0; 10], - } - .into(); + let mut candidate: CandidateEntry = CandidateEntry::from_v1( + approval_db::v1::CandidateEntry { + candidate: dummy_candidate_receipt(dummy_hash()), + session: 0, + block_assignments: BTreeMap::default(), + approvals: bitvec![u8, BitOrderLsb0; 0; 10], + }, + 0, + ); for i in 0..3 { candidate.mark_approval(ValidatorIndex(i)); } - let approval_entry = approval_db::v2::ApprovalEntry { + let approval_entry = approval_db::v3::ApprovalEntry { tranches: vec![ - approval_db::v2::TrancheEntry { + approval_db::v3::TrancheEntry { tranche: 0, assignments: (0..2).map(|i| (ValidatorIndex(i), 0.into())).collect(), }, - approval_db::v2::TrancheEntry { + approval_db::v3::TrancheEntry { tranche: 1, assignments: (2..5).map(|i| (ValidatorIndex(i), 1.into())).collect(), }, - approval_db::v2::TrancheEntry { + approval_db::v3::TrancheEntry { tranche: 2, assignments: (5..10).map(|i| (ValidatorIndex(i), 0.into())).collect(), }, @@ -569,29 +597,31 @@ mod tests { #[test] fn one_honest_node_always_approves() { - let mut candidate: CandidateEntry = approval_db::v1::CandidateEntry { - candidate: dummy_candidate_receipt(dummy_hash()), - session: 0, - block_assignments: BTreeMap::default(), - approvals: bitvec![u8, BitOrderLsb0; 0; 10], - } - .into(); + let mut candidate: CandidateEntry = CandidateEntry::from_v1( + approval_db::v1::CandidateEntry { + candidate: dummy_candidate_receipt(dummy_hash()), + session: 0, + block_assignments: BTreeMap::default(), + approvals: bitvec![u8, BitOrderLsb0; 0; 10], + }, + 0, + ); for i in 0..3 { candidate.mark_approval(ValidatorIndex(i)); } - let approval_entry = approval_db::v2::ApprovalEntry { + let approval_entry = approval_db::v3::ApprovalEntry { tranches: vec![ - approval_db::v2::TrancheEntry { + approval_db::v3::TrancheEntry { tranche: 0, assignments: (0..4).map(|i| (ValidatorIndex(i), 0.into())).collect(), }, - approval_db::v2::TrancheEntry { + approval_db::v3::TrancheEntry { tranche: 1, assignments: (4..6).map(|i| (ValidatorIndex(i), 1.into())).collect(), }, - approval_db::v2::TrancheEntry { + approval_db::v3::TrancheEntry { tranche: 2, assignments: (6..10).map(|i| (ValidatorIndex(i), 0.into())).collect(), }, @@ -647,7 +677,7 @@ mod tests { let no_show_duration = 10; let needed_approvals = 4; - let mut approval_entry: ApprovalEntry = approval_db::v2::ApprovalEntry { + let mut approval_entry: ApprovalEntry = approval_db::v3::ApprovalEntry { tranches: Vec::new(), assigned_validators: bitvec![u8, BitOrderLsb0; 0; 5], our_assignment: None, @@ -675,7 +705,8 @@ mod tests { block_tick, no_show_duration, needed_approvals, - ), + ) + .required_tranches, RequiredTranches::Exact { needed: 1, tolerated_missing: 0, @@ -691,7 +722,7 @@ mod tests { let no_show_duration = 10; let needed_approvals = 4; - let mut approval_entry: ApprovalEntry = approval_db::v2::ApprovalEntry { + let mut approval_entry: ApprovalEntry = approval_db::v3::ApprovalEntry { tranches: Vec::new(), assigned_validators: bitvec![u8, BitOrderLsb0; 0; 10], our_assignment: None, @@ -715,7 +746,8 @@ mod tests { block_tick, no_show_duration, needed_approvals, - ), + ) + .required_tranches, RequiredTranches::Pending { considered: 2, next_no_show: Some(block_tick + no_show_duration), @@ -731,7 +763,7 @@ mod tests { let no_show_duration = 10; let needed_approvals = 4; - let mut approval_entry: ApprovalEntry = approval_db::v2::ApprovalEntry { + let mut approval_entry: ApprovalEntry = approval_db::v3::ApprovalEntry { tranches: Vec::new(), assigned_validators: bitvec![u8, BitOrderLsb0; 0; 10], our_assignment: None, @@ -759,7 +791,8 @@ mod tests { block_tick, no_show_duration, needed_approvals, - ), + ) + .required_tranches, RequiredTranches::Pending { considered: 11, next_no_show: None, @@ -776,7 +809,7 @@ mod tests { let needed_approvals = 4; let n_validators = 8; - let mut approval_entry: ApprovalEntry = approval_db::v2::ApprovalEntry { + let mut approval_entry: ApprovalEntry = approval_db::v3::ApprovalEntry { tranches: Vec::new(), assigned_validators: bitvec![u8, BitOrderLsb0; 0; n_validators], our_assignment: None, @@ -807,7 +840,8 @@ mod tests { block_tick, no_show_duration, needed_approvals, - ), + ) + .required_tranches, RequiredTranches::Pending { considered: 1, next_no_show: None, @@ -826,7 +860,8 @@ mod tests { block_tick, no_show_duration, needed_approvals, - ), + ) + .required_tranches, RequiredTranches::Pending { considered: 1, next_no_show: None, @@ -843,7 +878,7 @@ mod tests { let needed_approvals = 4; let n_validators = 8; - let mut approval_entry: ApprovalEntry = approval_db::v2::ApprovalEntry { + let mut approval_entry: ApprovalEntry = approval_db::v3::ApprovalEntry { tranches: Vec::new(), assigned_validators: bitvec![u8, BitOrderLsb0; 0; n_validators], our_assignment: None, @@ -879,7 +914,8 @@ mod tests { block_tick, no_show_duration, needed_approvals, - ), + ) + .required_tranches, RequiredTranches::Exact { needed: 1, tolerated_missing: 0, @@ -898,7 +934,8 @@ mod tests { block_tick, no_show_duration, needed_approvals, - ), + ) + .required_tranches, RequiredTranches::Exact { needed: 2, tolerated_missing: 1, @@ -917,7 +954,8 @@ mod tests { block_tick, no_show_duration, needed_approvals, - ), + ) + .required_tranches, RequiredTranches::Pending { considered: 2, next_no_show: None, @@ -934,7 +972,7 @@ mod tests { let needed_approvals = 4; let n_validators = 8; - let mut approval_entry: ApprovalEntry = approval_db::v2::ApprovalEntry { + let mut approval_entry: ApprovalEntry = approval_db::v3::ApprovalEntry { tranches: Vec::new(), assigned_validators: bitvec![u8, BitOrderLsb0; 0; n_validators], our_assignment: None, @@ -970,7 +1008,8 @@ mod tests { block_tick, no_show_duration, needed_approvals, - ), + ) + .required_tranches, RequiredTranches::Exact { needed: 2, tolerated_missing: 1, @@ -992,7 +1031,8 @@ mod tests { block_tick, no_show_duration, needed_approvals, - ), + ) + .required_tranches, RequiredTranches::Pending { considered: 2, next_no_show: None, @@ -1013,7 +1053,8 @@ mod tests { block_tick, no_show_duration, needed_approvals, - ), + ) + .required_tranches, RequiredTranches::Exact { needed: 3, tolerated_missing: 2, @@ -1029,22 +1070,24 @@ mod tests { let no_show_duration = 10; let needed_approvals = 3; - let mut candidate: CandidateEntry = approval_db::v1::CandidateEntry { - candidate: dummy_candidate_receipt(dummy_hash()), - session: 0, - block_assignments: BTreeMap::default(), - approvals: bitvec![u8, BitOrderLsb0; 0; 3], - } - .into(); + let mut candidate: CandidateEntry = CandidateEntry::from_v1( + approval_db::v1::CandidateEntry { + candidate: dummy_candidate_receipt(dummy_hash()), + session: 0, + block_assignments: BTreeMap::default(), + approvals: bitvec![u8, BitOrderLsb0; 0; 3], + }, + 0, + ); for i in 0..3 { candidate.mark_approval(ValidatorIndex(i)); } - let approval_entry = approval_db::v2::ApprovalEntry { + let approval_entry = approval_db::v3::ApprovalEntry { tranches: vec![ // Assignments with invalid validator indexes. - approval_db::v2::TrancheEntry { + approval_db::v3::TrancheEntry { tranche: 1, assignments: (2..5).map(|i| (ValidatorIndex(i), 1.into())).collect(), }, @@ -1068,7 +1111,8 @@ mod tests { block_tick, no_show_duration, needed_approvals, - ), + ) + .required_tranches, RequiredTranches::Pending { considered: 10, next_no_show: None, @@ -1094,7 +1138,7 @@ mod tests { ]; for test_tranche in test_tranches { - let mut approval_entry: ApprovalEntry = approval_db::v2::ApprovalEntry { + let mut approval_entry: ApprovalEntry = approval_db::v3::ApprovalEntry { tranches: Vec::new(), backing_group: GroupIndex(0), our_assignment: None, @@ -1345,10 +1389,11 @@ mod tests { uncovered: 0, next_no_show: None, last_assignment_tick: None, + total_observed_no_shows: 0, }; assert_eq!( - state.output(0, 10, 10, 20), + state.output(0, 10, 10, 20).required_tranches, RequiredTranches::Pending { considered: 0, next_no_show: None, @@ -1368,10 +1413,11 @@ mod tests { uncovered: 0, next_no_show: None, last_assignment_tick: None, + total_observed_no_shows: 0, }; assert_eq!( - state.output(0, 10, 10, 20), + state.output(0, 10, 10, 20).required_tranches, RequiredTranches::Exact { needed: 0, tolerated_missing: 0, diff --git a/polkadot/node/core/approval-voting/src/approval_db/common/migration_helpers.rs b/polkadot/node/core/approval-voting/src/approval_db/common/migration_helpers.rs new file mode 100644 index 00000000000..e21c53e4cac --- /dev/null +++ b/polkadot/node/core/approval-voting/src/approval_db/common/migration_helpers.rs @@ -0,0 +1,39 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +use bitvec::{order::Lsb0 as BitOrderLsb0, vec::BitVec}; + +use polkadot_node_primitives::approval::{ + v1::{AssignmentCert, AssignmentCertKind, VrfProof, VrfSignature, RELAY_VRF_MODULO_CONTEXT}, + v2::VrfPreOutput, +}; +pub fn make_bitvec(len: usize) -> BitVec { + bitvec::bitvec![u8, BitOrderLsb0; 0; len] +} + +pub fn dummy_assignment_cert(kind: AssignmentCertKind) -> AssignmentCert { + let ctx = schnorrkel::signing_context(RELAY_VRF_MODULO_CONTEXT); + let msg = b"test-garbage"; + let mut prng = rand_core::OsRng; + let keypair = schnorrkel::Keypair::generate_with(&mut prng); + let (inout, proof, _) = keypair.vrf_sign(ctx.bytes(msg)); + let out = inout.to_output(); + + AssignmentCert { + kind, + vrf: VrfSignature { pre_output: VrfPreOutput(out), proof: VrfProof(proof) }, + } +} diff --git a/polkadot/node/core/approval-voting/src/approval_db/common/mod.rs b/polkadot/node/core/approval-voting/src/approval_db/common/mod.rs new file mode 100644 index 00000000000..249dcf912df --- /dev/null +++ b/polkadot/node/core/approval-voting/src/approval_db/common/mod.rs @@ -0,0 +1,293 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Common helper functions for all versions of approval-voting database. +use std::sync::Arc; + +use parity_scale_codec::{Decode, Encode}; +use polkadot_node_subsystem::{SubsystemError, SubsystemResult}; +use polkadot_node_subsystem_util::database::{DBTransaction, Database}; +use polkadot_primitives::{BlockNumber, CandidateHash, CandidateIndex, Hash}; + +use crate::{ + backend::{Backend, BackendWriteOp, V1ReadBackend, V2ReadBackend}, + persisted_entries, +}; + +use super::{ + v2::{load_block_entry_v1, load_candidate_entry_v1}, + v3::{load_block_entry_v2, load_candidate_entry_v2, BlockEntry, CandidateEntry}, +}; + +pub mod migration_helpers; + +const STORED_BLOCKS_KEY: &[u8] = b"Approvals_StoredBlocks"; + +/// A range from earliest..last block number stored within the DB. +#[derive(Encode, Decode, Debug, Clone, PartialEq)] +pub struct StoredBlockRange(pub BlockNumber, pub BlockNumber); +/// The database config. +#[derive(Debug, Clone, Copy)] +pub struct Config { + /// The column family in the database where data is stored. + pub col_approval_data: u32, +} + +/// `DbBackend` is a concrete implementation of the higher-level Backend trait +pub struct DbBackend { + inner: Arc, + config: Config, +} + +impl DbBackend { + /// Create a new [`DbBackend`] with the supplied key-value store and + /// config. + pub fn new(db: Arc, config: Config) -> Self { + DbBackend { inner: db, config } + } +} + +/// Errors while accessing things from the DB. +#[derive(Debug, derive_more::From, derive_more::Display)] +pub enum Error { + Io(std::io::Error), + InvalidDecoding(parity_scale_codec::Error), + InternalError(SubsystemError), +} + +impl std::error::Error for Error {} + +/// Result alias for DB errors. +pub type Result = std::result::Result; + +impl Backend for DbBackend { + fn load_block_entry( + &self, + block_hash: &Hash, + ) -> SubsystemResult> { + load_block_entry(&*self.inner, &self.config, block_hash).map(|e| e.map(Into::into)) + } + + fn load_candidate_entry( + &self, + candidate_hash: &CandidateHash, + ) -> SubsystemResult> { + load_candidate_entry(&*self.inner, &self.config, candidate_hash).map(|e| e.map(Into::into)) + } + + fn load_blocks_at_height(&self, block_height: &BlockNumber) -> SubsystemResult> { + load_blocks_at_height(&*self.inner, &self.config, block_height) + } + + fn load_all_blocks(&self) -> SubsystemResult> { + load_all_blocks(&*self.inner, &self.config) + } + + fn load_stored_blocks(&self) -> SubsystemResult> { + load_stored_blocks(&*self.inner, &self.config) + } + + /// Atomically write the list of operations, with later operations taking precedence over prior. + fn write(&mut self, ops: I) -> SubsystemResult<()> + where + I: IntoIterator, + { + let mut tx = DBTransaction::new(); + for op in ops { + match op { + BackendWriteOp::WriteStoredBlockRange(stored_block_range) => { + tx.put_vec( + self.config.col_approval_data, + &STORED_BLOCKS_KEY, + stored_block_range.encode(), + ); + }, + BackendWriteOp::DeleteStoredBlockRange => { + tx.delete(self.config.col_approval_data, &STORED_BLOCKS_KEY); + }, + BackendWriteOp::WriteBlocksAtHeight(h, blocks) => { + tx.put_vec( + self.config.col_approval_data, + &blocks_at_height_key(h), + blocks.encode(), + ); + }, + BackendWriteOp::DeleteBlocksAtHeight(h) => { + tx.delete(self.config.col_approval_data, &blocks_at_height_key(h)); + }, + BackendWriteOp::WriteBlockEntry(block_entry) => { + let block_entry: BlockEntry = block_entry.into(); + tx.put_vec( + self.config.col_approval_data, + &block_entry_key(&block_entry.block_hash), + block_entry.encode(), + ); + }, + BackendWriteOp::DeleteBlockEntry(hash) => { + tx.delete(self.config.col_approval_data, &block_entry_key(&hash)); + }, + BackendWriteOp::WriteCandidateEntry(candidate_entry) => { + let candidate_entry: CandidateEntry = candidate_entry.into(); + tx.put_vec( + self.config.col_approval_data, + &candidate_entry_key(&candidate_entry.candidate.hash()), + candidate_entry.encode(), + ); + }, + BackendWriteOp::DeleteCandidateEntry(candidate_hash) => { + tx.delete(self.config.col_approval_data, &candidate_entry_key(&candidate_hash)); + }, + } + } + + self.inner.write(tx).map_err(|e| e.into()) + } +} + +impl V1ReadBackend for DbBackend { + fn load_candidate_entry_v1( + &self, + candidate_hash: &CandidateHash, + candidate_index: CandidateIndex, + ) -> SubsystemResult> { + load_candidate_entry_v1(&*self.inner, &self.config, candidate_hash) + .map(|e| e.map(|e| persisted_entries::CandidateEntry::from_v1(e, candidate_index))) + } + + fn load_block_entry_v1( + &self, + block_hash: &Hash, + ) -> SubsystemResult> { + load_block_entry_v1(&*self.inner, &self.config, block_hash).map(|e| e.map(Into::into)) + } +} + +impl V2ReadBackend for DbBackend { + fn load_candidate_entry_v2( + &self, + candidate_hash: &CandidateHash, + candidate_index: CandidateIndex, + ) -> SubsystemResult> { + load_candidate_entry_v2(&*self.inner, &self.config, candidate_hash) + .map(|e| e.map(|e| persisted_entries::CandidateEntry::from_v2(e, candidate_index))) + } + + fn load_block_entry_v2( + &self, + block_hash: &Hash, + ) -> SubsystemResult> { + load_block_entry_v2(&*self.inner, &self.config, block_hash).map(|e| e.map(Into::into)) + } +} + +pub(crate) fn load_decode( + store: &dyn Database, + col_approval_data: u32, + key: &[u8], +) -> Result> { + match store.get(col_approval_data, key)? { + None => Ok(None), + Some(raw) => D::decode(&mut &raw[..]).map(Some).map_err(Into::into), + } +} + +/// The key a given block entry is stored under. +pub(crate) fn block_entry_key(block_hash: &Hash) -> [u8; 46] { + const BLOCK_ENTRY_PREFIX: [u8; 14] = *b"Approvals_blck"; + + let mut key = [0u8; 14 + 32]; + key[0..14].copy_from_slice(&BLOCK_ENTRY_PREFIX); + key[14..][..32].copy_from_slice(block_hash.as_ref()); + + key +} + +/// The key a given candidate entry is stored under. +pub(crate) fn candidate_entry_key(candidate_hash: &CandidateHash) -> [u8; 46] { + const CANDIDATE_ENTRY_PREFIX: [u8; 14] = *b"Approvals_cand"; + + let mut key = [0u8; 14 + 32]; + key[0..14].copy_from_slice(&CANDIDATE_ENTRY_PREFIX); + key[14..][..32].copy_from_slice(candidate_hash.0.as_ref()); + + key +} + +/// The key a set of block hashes corresponding to a block number is stored under. +pub(crate) fn blocks_at_height_key(block_number: BlockNumber) -> [u8; 16] { + const BLOCKS_AT_HEIGHT_PREFIX: [u8; 12] = *b"Approvals_at"; + + let mut key = [0u8; 12 + 4]; + key[0..12].copy_from_slice(&BLOCKS_AT_HEIGHT_PREFIX); + block_number.using_encoded(|s| key[12..16].copy_from_slice(s)); + + key +} + +/// Return all blocks which have entries in the DB, ascending, by height. +pub fn load_all_blocks(store: &dyn Database, config: &Config) -> SubsystemResult> { + let mut hashes = Vec::new(); + if let Some(stored_blocks) = load_stored_blocks(store, config)? { + for height in stored_blocks.0..stored_blocks.1 { + let blocks = load_blocks_at_height(store, config, &height)?; + hashes.extend(blocks); + } + } + + Ok(hashes) +} + +/// Load the stored-blocks key from the state. +pub fn load_stored_blocks( + store: &dyn Database, + config: &Config, +) -> SubsystemResult> { + load_decode(store, config.col_approval_data, STORED_BLOCKS_KEY) + .map_err(|e| SubsystemError::with_origin("approval-voting", e)) +} + +/// Load a blocks-at-height entry for a given block number. +pub fn load_blocks_at_height( + store: &dyn Database, + config: &Config, + block_number: &BlockNumber, +) -> SubsystemResult> { + load_decode(store, config.col_approval_data, &blocks_at_height_key(*block_number)) + .map(|x| x.unwrap_or_default()) + .map_err(|e| SubsystemError::with_origin("approval-voting", e)) +} + +/// Load a block entry from the aux store. +pub fn load_block_entry( + store: &dyn Database, + config: &Config, + block_hash: &Hash, +) -> SubsystemResult> { + load_decode(store, config.col_approval_data, &block_entry_key(block_hash)) + .map(|u: Option| u.map(|v| v.into())) + .map_err(|e| SubsystemError::with_origin("approval-voting", e)) +} + +/// Load a candidate entry from the aux store in current version format. +pub fn load_candidate_entry( + store: &dyn Database, + config: &Config, + candidate_hash: &CandidateHash, +) -> SubsystemResult> { + load_decode(store, config.col_approval_data, &candidate_entry_key(candidate_hash)) + .map(|u: Option| u.map(|v| v.into())) + .map_err(|e| SubsystemError::with_origin("approval-voting", e)) +} diff --git a/polkadot/node/core/approval-voting/src/approval_db/mod.rs b/polkadot/node/core/approval-voting/src/approval_db/mod.rs index 20fb6aa82d8..78942a507f4 100644 --- a/polkadot/node/core/approval-voting/src/approval_db/mod.rs +++ b/polkadot/node/core/approval-voting/src/approval_db/mod.rs @@ -30,5 +30,7 @@ //! In the future, we may use a temporary DB which doesn't need to be wiped, but for the //! time being we share the same DB with the rest of Substrate. +pub mod common; pub mod v1; pub mod v2; +pub mod v3; diff --git a/polkadot/node/core/approval-voting/src/approval_db/v1/tests.rs b/polkadot/node/core/approval-voting/src/approval_db/v1/tests.rs index 07d8242b772..b979cb7ef45 100644 --- a/polkadot/node/core/approval-voting/src/approval_db/v1/tests.rs +++ b/polkadot/node/core/approval-voting/src/approval_db/v1/tests.rs @@ -40,10 +40,6 @@ fn make_db() -> (DbBackend, Arc) { (DbBackend::new(db_writer.clone(), TEST_CONFIG), db_writer) } -fn make_bitvec(len: usize) -> BitVec { - bitvec::bitvec![u8, BitOrderLsb0; 0; len] -} - fn make_block_entry( block_hash: Hash, parent_hash: Hash, diff --git a/polkadot/node/core/approval-voting/src/approval_db/v2/migration_helpers.rs b/polkadot/node/core/approval-voting/src/approval_db/v2/migration_helpers.rs index efdba41b57a..df6e4754dbd 100644 --- a/polkadot/node/core/approval-voting/src/approval_db/v2/migration_helpers.rs +++ b/polkadot/node/core/approval-voting/src/approval_db/v2/migration_helpers.rs @@ -16,29 +16,19 @@ //! Approval DB migration helpers. use super::*; -use crate::backend::Backend; -use polkadot_node_primitives::approval::v1::{ - AssignmentCert, AssignmentCertKind, VrfPreOutput, VrfProof, VrfSignature, - RELAY_VRF_MODULO_CONTEXT, +use crate::{ + approval_db::common::{ + migration_helpers::{dummy_assignment_cert, make_bitvec}, + Error, Result, StoredBlockRange, + }, + backend::Backend, }; + +use polkadot_node_primitives::approval::v1::AssignmentCertKind; use polkadot_node_subsystem_util::database::Database; use sp_application_crypto::sp_core::H256; use std::{collections::HashSet, sync::Arc}; -fn dummy_assignment_cert(kind: AssignmentCertKind) -> AssignmentCert { - let ctx = schnorrkel::signing_context(RELAY_VRF_MODULO_CONTEXT); - let msg = b"test-garbage"; - let mut prng = rand_core::OsRng; - let keypair = schnorrkel::Keypair::generate_with(&mut prng); - let (inout, proof, _) = keypair.vrf_sign(ctx.bytes(msg)); - let preout = inout.to_output(); - - AssignmentCert { - kind, - vrf: VrfSignature { pre_output: VrfPreOutput(preout), proof: VrfProof(proof) }, - } -} - fn make_block_entry_v1( block_hash: Hash, parent_hash: Hash, @@ -58,14 +48,10 @@ fn make_block_entry_v1( } } -fn make_bitvec(len: usize) -> BitVec { - bitvec::bitvec![u8, BitOrderLsb0; 0; len] -} - /// Migrates `OurAssignment`, `CandidateEntry` and `ApprovalEntry` to version 2. /// Returns on any error. /// Must only be used in parachains DB migration code - `polkadot-service` crate. -pub fn v1_to_v2(db: Arc, config: Config) -> Result<()> { +pub fn v1_to_latest(db: Arc, config: Config) -> Result<()> { let mut backend = crate::DbBackend::new(db, config); let all_blocks = backend .load_all_blocks() @@ -89,11 +75,13 @@ pub fn v1_to_v2(db: Arc, config: Config) -> Result<()> { let mut counter = 0; // Get all candidate entries, approval entries and convert each of them. for block in all_blocks { - for (_core_index, candidate_hash) in block.candidates() { + for (candidate_index, (_core_index, candidate_hash)) in + block.candidates().iter().enumerate() + { // Loading the candidate will also perform the conversion to the updated format and // return that represantation. if let Some(candidate_entry) = backend - .load_candidate_entry_v1(&candidate_hash) + .load_candidate_entry_v1(&candidate_hash, candidate_index as CandidateIndex) .map_err(|e| Error::InternalError(e))? { // Write the updated representation. @@ -113,42 +101,8 @@ pub fn v1_to_v2(db: Arc, config: Config) -> Result<()> { Ok(()) } -// Checks if the migration doesn't leave the DB in an unsane state. -// This function is to be used in tests. -pub fn v1_to_v2_sanity_check( - db: Arc, - config: Config, - expected_candidates: HashSet, -) -> Result<()> { - let backend = crate::DbBackend::new(db, config); - - let all_blocks = backend - .load_all_blocks() - .unwrap() - .iter() - .map(|block_hash| backend.load_block_entry(block_hash).unwrap().unwrap()) - .collect::>(); - - let mut candidates = HashSet::new(); - - // Iterate all blocks and approval entries. - for block in all_blocks { - for (_core_index, candidate_hash) in block.candidates() { - // Loading the candidate will also perform the conversion to the updated format and - // return that represantation. - if let Some(candidate_entry) = backend.load_candidate_entry(&candidate_hash).unwrap() { - candidates.insert(candidate_entry.candidate.hash()); - } - } - } - - assert_eq!(candidates, expected_candidates); - - Ok(()) -} - // Fills the db with dummy data in v1 scheme. -pub fn v1_to_v2_fill_test_data( +pub fn v1_fill_test_data( db: Arc, config: Config, dummy_candidate_create: F, diff --git a/polkadot/node/core/approval-voting/src/approval_db/v2/mod.rs b/polkadot/node/core/approval-voting/src/approval_db/v2/mod.rs index 66df6ee8f65..da42fc5be48 100644 --- a/polkadot/node/core/approval-voting/src/approval_db/v2/mod.rs +++ b/polkadot/node/core/approval-voting/src/approval_db/v2/mod.rs @@ -21,145 +21,23 @@ use polkadot_node_primitives::approval::{v1::DelayTranche, v2::AssignmentCertV2} use polkadot_node_subsystem::{SubsystemError, SubsystemResult}; use polkadot_node_subsystem_util::database::{DBTransaction, Database}; use polkadot_primitives::{ - BlockNumber, CandidateHash, CandidateReceipt, CoreIndex, GroupIndex, Hash, SessionIndex, - ValidatorIndex, ValidatorSignature, + BlockNumber, CandidateHash, CandidateIndex, CandidateReceipt, CoreIndex, GroupIndex, Hash, + SessionIndex, ValidatorIndex, ValidatorSignature, }; use sp_consensus_slots::Slot; use bitvec::{order::Lsb0 as BitOrderLsb0, vec::BitVec}; -use std::{collections::BTreeMap, sync::Arc}; +use std::collections::BTreeMap; -use crate::{ - backend::{Backend, BackendWriteOp, V1ReadBackend}, - persisted_entries, -}; +use crate::backend::V1ReadBackend; -const STORED_BLOCKS_KEY: &[u8] = b"Approvals_StoredBlocks"; +use super::common::{block_entry_key, candidate_entry_key, load_decode, Config}; pub mod migration_helpers; #[cfg(test)] pub mod tests; -/// `DbBackend` is a concrete implementation of the higher-level Backend trait -pub struct DbBackend { - inner: Arc, - config: Config, -} - -impl DbBackend { - /// Create a new [`DbBackend`] with the supplied key-value store and - /// config. - pub fn new(db: Arc, config: Config) -> Self { - DbBackend { inner: db, config } - } -} - -impl V1ReadBackend for DbBackend { - fn load_candidate_entry_v1( - &self, - candidate_hash: &CandidateHash, - ) -> SubsystemResult> { - load_candidate_entry_v1(&*self.inner, &self.config, candidate_hash) - .map(|e| e.map(Into::into)) - } - - fn load_block_entry_v1( - &self, - block_hash: &Hash, - ) -> SubsystemResult> { - load_block_entry_v1(&*self.inner, &self.config, block_hash).map(|e| e.map(Into::into)) - } -} - -impl Backend for DbBackend { - fn load_block_entry( - &self, - block_hash: &Hash, - ) -> SubsystemResult> { - load_block_entry(&*self.inner, &self.config, block_hash).map(|e| e.map(Into::into)) - } - - fn load_candidate_entry( - &self, - candidate_hash: &CandidateHash, - ) -> SubsystemResult> { - load_candidate_entry(&*self.inner, &self.config, candidate_hash).map(|e| e.map(Into::into)) - } - - fn load_blocks_at_height(&self, block_height: &BlockNumber) -> SubsystemResult> { - load_blocks_at_height(&*self.inner, &self.config, block_height) - } - - fn load_all_blocks(&self) -> SubsystemResult> { - load_all_blocks(&*self.inner, &self.config) - } - - fn load_stored_blocks(&self) -> SubsystemResult> { - load_stored_blocks(&*self.inner, &self.config) - } - - /// Atomically write the list of operations, with later operations taking precedence over prior. - fn write(&mut self, ops: I) -> SubsystemResult<()> - where - I: IntoIterator, - { - let mut tx = DBTransaction::new(); - for op in ops { - match op { - BackendWriteOp::WriteStoredBlockRange(stored_block_range) => { - tx.put_vec( - self.config.col_approval_data, - &STORED_BLOCKS_KEY, - stored_block_range.encode(), - ); - }, - BackendWriteOp::DeleteStoredBlockRange => { - tx.delete(self.config.col_approval_data, &STORED_BLOCKS_KEY); - }, - BackendWriteOp::WriteBlocksAtHeight(h, blocks) => { - tx.put_vec( - self.config.col_approval_data, - &blocks_at_height_key(h), - blocks.encode(), - ); - }, - BackendWriteOp::DeleteBlocksAtHeight(h) => { - tx.delete(self.config.col_approval_data, &blocks_at_height_key(h)); - }, - BackendWriteOp::WriteBlockEntry(block_entry) => { - let block_entry: BlockEntry = block_entry.into(); - tx.put_vec( - self.config.col_approval_data, - &block_entry_key(&block_entry.block_hash), - block_entry.encode(), - ); - }, - BackendWriteOp::DeleteBlockEntry(hash) => { - tx.delete(self.config.col_approval_data, &block_entry_key(&hash)); - }, - BackendWriteOp::WriteCandidateEntry(candidate_entry) => { - let candidate_entry: CandidateEntry = candidate_entry.into(); - tx.put_vec( - self.config.col_approval_data, - &candidate_entry_key(&candidate_entry.candidate.hash()), - candidate_entry.encode(), - ); - }, - BackendWriteOp::DeleteCandidateEntry(candidate_hash) => { - tx.delete(self.config.col_approval_data, &candidate_entry_key(&candidate_hash)); - }, - } - } - - self.inner.write(tx).map_err(|e| e.into()) - } -} - -/// A range from earliest..last block number stored within the DB. -#[derive(Encode, Decode, Debug, Clone, PartialEq)] -pub struct StoredBlockRange(pub BlockNumber, pub BlockNumber); - // slot_duration * 2 + DelayTranche gives the number of delay tranches since the // unix epoch. #[derive(Encode, Decode, Clone, Copy, Debug, PartialEq)] @@ -168,13 +46,6 @@ pub struct Tick(u64); /// Convenience type definition pub type Bitfield = BitVec; -/// The database config. -#[derive(Debug, Clone, Copy)] -pub struct Config { - /// The column family in the database where data is stored. - pub col_approval_data: u32, -} - /// Details pertaining to our assignment on a block. #[derive(Encode, Decode, Debug, Clone, PartialEq)] pub struct OurAssignment { @@ -259,118 +130,6 @@ impl From for crate::Tick { } } -/// Errors while accessing things from the DB. -#[derive(Debug, derive_more::From, derive_more::Display)] -pub enum Error { - Io(std::io::Error), - InvalidDecoding(parity_scale_codec::Error), - InternalError(SubsystemError), -} - -impl std::error::Error for Error {} - -/// Result alias for DB errors. -pub type Result = std::result::Result; - -pub(crate) fn load_decode( - store: &dyn Database, - col_approval_data: u32, - key: &[u8], -) -> Result> { - match store.get(col_approval_data, key)? { - None => Ok(None), - Some(raw) => D::decode(&mut &raw[..]).map(Some).map_err(Into::into), - } -} - -/// The key a given block entry is stored under. -pub(crate) fn block_entry_key(block_hash: &Hash) -> [u8; 46] { - const BLOCK_ENTRY_PREFIX: [u8; 14] = *b"Approvals_blck"; - - let mut key = [0u8; 14 + 32]; - key[0..14].copy_from_slice(&BLOCK_ENTRY_PREFIX); - key[14..][..32].copy_from_slice(block_hash.as_ref()); - - key -} - -/// The key a given candidate entry is stored under. -pub(crate) fn candidate_entry_key(candidate_hash: &CandidateHash) -> [u8; 46] { - const CANDIDATE_ENTRY_PREFIX: [u8; 14] = *b"Approvals_cand"; - - let mut key = [0u8; 14 + 32]; - key[0..14].copy_from_slice(&CANDIDATE_ENTRY_PREFIX); - key[14..][..32].copy_from_slice(candidate_hash.0.as_ref()); - - key -} - -/// The key a set of block hashes corresponding to a block number is stored under. -pub(crate) fn blocks_at_height_key(block_number: BlockNumber) -> [u8; 16] { - const BLOCKS_AT_HEIGHT_PREFIX: [u8; 12] = *b"Approvals_at"; - - let mut key = [0u8; 12 + 4]; - key[0..12].copy_from_slice(&BLOCKS_AT_HEIGHT_PREFIX); - block_number.using_encoded(|s| key[12..16].copy_from_slice(s)); - - key -} - -/// Return all blocks which have entries in the DB, ascending, by height. -pub fn load_all_blocks(store: &dyn Database, config: &Config) -> SubsystemResult> { - let mut hashes = Vec::new(); - if let Some(stored_blocks) = load_stored_blocks(store, config)? { - for height in stored_blocks.0..stored_blocks.1 { - let blocks = load_blocks_at_height(store, config, &height)?; - hashes.extend(blocks); - } - } - - Ok(hashes) -} - -/// Load the stored-blocks key from the state. -pub fn load_stored_blocks( - store: &dyn Database, - config: &Config, -) -> SubsystemResult> { - load_decode(store, config.col_approval_data, STORED_BLOCKS_KEY) - .map_err(|e| SubsystemError::with_origin("approval-voting", e)) -} - -/// Load a blocks-at-height entry for a given block number. -pub fn load_blocks_at_height( - store: &dyn Database, - config: &Config, - block_number: &BlockNumber, -) -> SubsystemResult> { - load_decode(store, config.col_approval_data, &blocks_at_height_key(*block_number)) - .map(|x| x.unwrap_or_default()) - .map_err(|e| SubsystemError::with_origin("approval-voting", e)) -} - -/// Load a block entry from the aux store. -pub fn load_block_entry( - store: &dyn Database, - config: &Config, - block_hash: &Hash, -) -> SubsystemResult> { - load_decode(store, config.col_approval_data, &block_entry_key(block_hash)) - .map(|u: Option| u.map(|v| v.into())) - .map_err(|e| SubsystemError::with_origin("approval-voting", e)) -} - -/// Load a candidate entry from the aux store in current version format. -pub fn load_candidate_entry( - store: &dyn Database, - config: &Config, - candidate_hash: &CandidateHash, -) -> SubsystemResult> { - load_decode(store, config.col_approval_data, &candidate_entry_key(candidate_hash)) - .map(|u: Option| u.map(|v| v.into())) - .map_err(|e| SubsystemError::with_origin("approval-voting", e)) -} - /// Load a candidate entry from the aux store in v1 format. pub fn load_candidate_entry_v1( store: &dyn Database, diff --git a/polkadot/node/core/approval-voting/src/approval_db/v2/tests.rs b/polkadot/node/core/approval-voting/src/approval_db/v2/tests.rs index 50a5a924ca8..6021b44c276 100644 --- a/polkadot/node/core/approval-voting/src/approval_db/v2/tests.rs +++ b/polkadot/node/core/approval-voting/src/approval_db/v2/tests.rs @@ -16,13 +16,22 @@ //! Tests for the aux-schema of approval voting. -use super::{DbBackend, StoredBlockRange, *}; use crate::{ + approval_db::{ + common::{migration_helpers::make_bitvec, DbBackend, StoredBlockRange, *}, + v2::*, + v3::{load_block_entry_v2, load_candidate_entry_v2}, + }, backend::{Backend, OverlayedBackend}, ops::{add_block_entry, canonicalize, force_approve, NewCandidateInfo}, }; +use polkadot_primitives::{ + BlockNumber, CandidateHash, CandidateReceipt, CoreIndex, GroupIndex, Hash, +}; + use polkadot_node_subsystem_util::database::Database; use polkadot_primitives::Id as ParaId; +use sp_consensus_slots::Slot; use std::{collections::HashMap, sync::Arc}; use ::test_helpers::{dummy_candidate_receipt, dummy_candidate_receipt_bad_sig, dummy_hash}; @@ -60,10 +69,6 @@ fn make_block_entry( } } -fn make_bitvec(len: usize) -> BitVec { - bitvec::bitvec![u8, BitOrderLsb0; 0; len] -} - fn make_candidate(para_id: ParaId, relay_parent: Hash) -> CandidateReceipt { let mut c = dummy_candidate_receipt(dummy_hash()); @@ -110,7 +115,10 @@ fn read_write() { overlay_db.write_stored_block_range(range.clone()); overlay_db.write_blocks_at_height(1, at_height.clone()); overlay_db.write_block_entry(block_entry.clone().into()); - overlay_db.write_candidate_entry(candidate_entry.clone().into()); + overlay_db.write_candidate_entry(crate::persisted_entries::CandidateEntry::from_v2( + candidate_entry.clone(), + 0, + )); let write_ops = overlay_db.into_write_ops(); db.write(write_ops).unwrap(); @@ -118,11 +126,11 @@ fn read_write() { assert_eq!(load_stored_blocks(store.as_ref(), &TEST_CONFIG).unwrap(), Some(range)); assert_eq!(load_blocks_at_height(store.as_ref(), &TEST_CONFIG, &1).unwrap(), at_height); assert_eq!( - load_block_entry(store.as_ref(), &TEST_CONFIG, &hash_a).unwrap(), + load_block_entry_v2(store.as_ref(), &TEST_CONFIG, &hash_a).unwrap(), Some(block_entry.into()) ); assert_eq!( - load_candidate_entry(store.as_ref(), &TEST_CONFIG, &candidate_hash).unwrap(), + load_candidate_entry_v2(store.as_ref(), &TEST_CONFIG, &candidate_hash).unwrap(), Some(candidate_entry.into()), ); @@ -134,8 +142,8 @@ fn read_write() { db.write(write_ops).unwrap(); assert!(load_blocks_at_height(store.as_ref(), &TEST_CONFIG, &1).unwrap().is_empty()); - assert!(load_block_entry(store.as_ref(), &TEST_CONFIG, &hash_a).unwrap().is_none()); - assert!(load_candidate_entry(store.as_ref(), &TEST_CONFIG, &candidate_hash) + assert!(load_block_entry_v2(store.as_ref(), &TEST_CONFIG, &hash_a).unwrap().is_none()); + assert!(load_candidate_entry_v2(store.as_ref(), &TEST_CONFIG, &candidate_hash) .unwrap() .is_none()); } @@ -196,25 +204,27 @@ fn add_block_entry_works() { db.write(write_ops).unwrap(); assert_eq!( - load_block_entry(store.as_ref(), &TEST_CONFIG, &block_hash_a).unwrap(), + load_block_entry_v2(store.as_ref(), &TEST_CONFIG, &block_hash_a).unwrap(), Some(block_entry_a.into()) ); assert_eq!( - load_block_entry(store.as_ref(), &TEST_CONFIG, &block_hash_b).unwrap(), + load_block_entry_v2(store.as_ref(), &TEST_CONFIG, &block_hash_b).unwrap(), Some(block_entry_b.into()) ); - let candidate_entry_a = load_candidate_entry(store.as_ref(), &TEST_CONFIG, &candidate_hash_a) - .unwrap() - .unwrap(); + let candidate_entry_a = + load_candidate_entry_v2(store.as_ref(), &TEST_CONFIG, &candidate_hash_a) + .unwrap() + .unwrap(); assert_eq!( candidate_entry_a.block_assignments.keys().collect::>(), vec![&block_hash_a, &block_hash_b] ); - let candidate_entry_b = load_candidate_entry(store.as_ref(), &TEST_CONFIG, &candidate_hash_b) - .unwrap() - .unwrap(); + let candidate_entry_b = + load_candidate_entry_v2(store.as_ref(), &TEST_CONFIG, &candidate_hash_b) + .unwrap() + .unwrap(); assert_eq!(candidate_entry_b.block_assignments.keys().collect::>(), vec![&block_hash_b]); } @@ -243,11 +253,11 @@ fn add_block_entry_adds_child() { block_entry_a.children.push(block_hash_b); assert_eq!( - load_block_entry(store.as_ref(), &TEST_CONFIG, &block_hash_a).unwrap(), + load_block_entry_v2(store.as_ref(), &TEST_CONFIG, &block_hash_a).unwrap(), Some(block_entry_a.into()) ); assert_eq!( - load_block_entry(store.as_ref(), &TEST_CONFIG, &block_hash_b).unwrap(), + load_block_entry_v2(store.as_ref(), &TEST_CONFIG, &block_hash_b).unwrap(), Some(block_entry_b.into()) ); } @@ -365,13 +375,15 @@ fn canonicalize_works() { for (c_hash, in_blocks) in expected { let (entry, in_blocks) = match in_blocks { None => { - assert!(load_candidate_entry(store.as_ref(), &TEST_CONFIG, &c_hash) + assert!(load_candidate_entry_v2(store.as_ref(), &TEST_CONFIG, &c_hash) .unwrap() .is_none()); continue }, Some(i) => ( - load_candidate_entry(store.as_ref(), &TEST_CONFIG, &c_hash).unwrap().unwrap(), + load_candidate_entry_v2(store.as_ref(), &TEST_CONFIG, &c_hash) + .unwrap() + .unwrap(), i, ), }; @@ -388,13 +400,13 @@ fn canonicalize_works() { for (hash, with_candidates) in expected { let (entry, with_candidates) = match with_candidates { None => { - assert!(load_block_entry(store.as_ref(), &TEST_CONFIG, &hash) + assert!(load_block_entry_v2(store.as_ref(), &TEST_CONFIG, &hash) .unwrap() .is_none()); continue }, Some(i) => - (load_block_entry(store.as_ref(), &TEST_CONFIG, &hash).unwrap().unwrap(), i), + (load_block_entry_v2(store.as_ref(), &TEST_CONFIG, &hash).unwrap().unwrap(), i), }; assert_eq!(entry.candidates.len(), with_candidates.len()); @@ -510,22 +522,22 @@ fn force_approve_works() { let write_ops = overlay_db.into_write_ops(); db.write(write_ops).unwrap(); - assert!(load_block_entry(store.as_ref(), &TEST_CONFIG, &block_hash_a,) + assert!(load_block_entry_v2(store.as_ref(), &TEST_CONFIG, &block_hash_a,) .unwrap() .unwrap() .approved_bitfield .all()); - assert!(load_block_entry(store.as_ref(), &TEST_CONFIG, &block_hash_b,) + assert!(load_block_entry_v2(store.as_ref(), &TEST_CONFIG, &block_hash_b,) .unwrap() .unwrap() .approved_bitfield .all()); - assert!(load_block_entry(store.as_ref(), &TEST_CONFIG, &block_hash_c,) + assert!(load_block_entry_v2(store.as_ref(), &TEST_CONFIG, &block_hash_c,) .unwrap() .unwrap() .approved_bitfield .not_any()); - assert!(load_block_entry(store.as_ref(), &TEST_CONFIG, &block_hash_d,) + assert!(load_block_entry_v2(store.as_ref(), &TEST_CONFIG, &block_hash_d,) .unwrap() .unwrap() .approved_bitfield diff --git a/polkadot/node/core/approval-voting/src/approval_db/v3/migration_helpers.rs b/polkadot/node/core/approval-voting/src/approval_db/v3/migration_helpers.rs new file mode 100644 index 00000000000..ad5e89ef3de --- /dev/null +++ b/polkadot/node/core/approval-voting/src/approval_db/v3/migration_helpers.rs @@ -0,0 +1,237 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Approval DB migration helpers. +use super::*; +use crate::{ + approval_db::common::{ + block_entry_key, candidate_entry_key, + migration_helpers::{dummy_assignment_cert, make_bitvec}, + Config, Error, Result, StoredBlockRange, + }, + backend::{Backend, V2ReadBackend}, +}; +use polkadot_node_primitives::approval::v1::AssignmentCertKind; +use polkadot_node_subsystem_util::database::Database; +use sp_application_crypto::sp_core::H256; +use std::{collections::HashSet, sync::Arc}; + +/// Migrates `BlockEntry`, `CandidateEntry`, `ApprovalEntry` and `OurApproval` to version 3. +/// Returns on any error. +/// Must only be used in parachains DB migration code - `polkadot-service` crate. +pub fn v2_to_latest(db: Arc, config: Config) -> Result<()> { + let mut backend = crate::DbBackend::new(db, config); + let all_blocks = backend + .load_all_blocks() + .map_err(|e| Error::InternalError(e))? + .iter() + .filter_map(|block_hash| { + backend + .load_block_entry_v2(block_hash) + .map_err(|e| Error::InternalError(e)) + .ok()? + }) + .collect::>(); + + gum::info!( + target: crate::LOG_TARGET, + "Migrating candidate entries on top of {} blocks", + all_blocks.len() + ); + + let mut overlay = crate::OverlayedBackend::new(&backend); + let mut counter = 0; + // Get all candidate entries, approval entries and convert each of them. + for block in all_blocks { + for (candidate_index, (_core_index, candidate_hash)) in + block.candidates().iter().enumerate() + { + // Loading the candidate will also perform the conversion to the updated format and + // return that represantation. + if let Some(candidate_entry) = backend + .load_candidate_entry_v2(&candidate_hash, candidate_index as CandidateIndex) + .map_err(|e| Error::InternalError(e))? + { + // Write the updated representation. + overlay.write_candidate_entry(candidate_entry); + counter += 1; + } + } + overlay.write_block_entry(block); + } + + gum::info!(target: crate::LOG_TARGET, "Migrated {} entries", counter); + + // Commit all changes to DB. + let write_ops = overlay.into_write_ops(); + backend.write(write_ops).unwrap(); + + Ok(()) +} + +// Checks if the migration doesn't leave the DB in an unsane state. +// This function is to be used in tests. +pub fn v1_to_latest_sanity_check( + db: Arc, + config: Config, + expected_candidates: HashSet, +) -> Result<()> { + let backend = crate::DbBackend::new(db, config); + + let all_blocks = backend + .load_all_blocks() + .unwrap() + .iter() + .map(|block_hash| backend.load_block_entry(block_hash).unwrap().unwrap()) + .collect::>(); + + let mut candidates = HashSet::new(); + + // Iterate all blocks and approval entries. + for block in all_blocks { + for (_core_index, candidate_hash) in block.candidates() { + // Loading the candidate will also perform the conversion to the updated format and + // return that represantation. + if let Some(candidate_entry) = backend.load_candidate_entry(&candidate_hash).unwrap() { + candidates.insert(candidate_entry.candidate.hash()); + } + } + } + + assert_eq!(candidates, expected_candidates); + + Ok(()) +} + +// Fills the db with dummy data in v2 scheme. +pub fn v2_fill_test_data( + db: Arc, + config: Config, + dummy_candidate_create: F, +) -> Result> +where + F: Fn(H256) -> CandidateReceipt, +{ + let mut backend = crate::DbBackend::new(db.clone(), config); + let mut overlay_db = crate::OverlayedBackend::new(&backend); + let mut expected_candidates = HashSet::new(); + + const RELAY_BLOCK_COUNT: u32 = 10; + + let range = StoredBlockRange(1, 11); + overlay_db.write_stored_block_range(range.clone()); + + for relay_number in 1..=RELAY_BLOCK_COUNT { + let relay_hash = Hash::repeat_byte(relay_number as u8); + let assignment_core_index = CoreIndex(relay_number); + let candidate = dummy_candidate_create(relay_hash); + let candidate_hash = candidate.hash(); + + let at_height = vec![relay_hash]; + + let block_entry = make_block_entry_v2( + relay_hash, + Default::default(), + relay_number, + vec![(assignment_core_index, candidate_hash)], + ); + + let dummy_assignment = crate::approval_db::v2::OurAssignment { + cert: dummy_assignment_cert(AssignmentCertKind::RelayVRFModulo { sample: 0 }).into(), + tranche: 0, + validator_index: ValidatorIndex(0), + triggered: false, + }; + + let candidate_entry = crate::approval_db::v2::CandidateEntry { + candidate, + session: 123, + block_assignments: vec![( + relay_hash, + crate::approval_db::v2::ApprovalEntry { + tranches: Vec::new(), + backing_group: GroupIndex(1), + our_assignment: Some(dummy_assignment), + our_approval_sig: None, + approved: false, + assigned_validators: make_bitvec(1), + }, + )] + .into_iter() + .collect(), + approvals: Default::default(), + }; + + overlay_db.write_blocks_at_height(relay_number, at_height.clone()); + expected_candidates.insert(candidate_entry.candidate.hash()); + + db.write(write_candidate_entry_v2(candidate_entry, config)).unwrap(); + db.write(write_block_entry_v2(block_entry, config)).unwrap(); + } + + let write_ops = overlay_db.into_write_ops(); + backend.write(write_ops).unwrap(); + + Ok(expected_candidates) +} + +fn make_block_entry_v2( + block_hash: Hash, + parent_hash: Hash, + block_number: BlockNumber, + candidates: Vec<(CoreIndex, CandidateHash)>, +) -> crate::approval_db::v2::BlockEntry { + crate::approval_db::v2::BlockEntry { + block_hash, + parent_hash, + block_number, + session: 1, + slot: Slot::from(1), + relay_vrf_story: [0u8; 32], + approved_bitfield: make_bitvec(candidates.len()), + distributed_assignments: make_bitvec(candidates.len()), + candidates, + children: Vec::new(), + } +} + +// Low level DB helper to write a candidate entry in v1 scheme. +fn write_candidate_entry_v2( + candidate_entry: crate::approval_db::v2::CandidateEntry, + config: Config, +) -> DBTransaction { + let mut tx = DBTransaction::new(); + tx.put_vec( + config.col_approval_data, + &candidate_entry_key(&candidate_entry.candidate.hash()), + candidate_entry.encode(), + ); + tx +} + +// Low level DB helper to write a block entry in v1 scheme. +fn write_block_entry_v2( + block_entry: crate::approval_db::v2::BlockEntry, + config: Config, +) -> DBTransaction { + let mut tx = DBTransaction::new(); + tx.put_vec( + config.col_approval_data, + &block_entry_key(&block_entry.block_hash), + block_entry.encode(), + ); + tx +} diff --git a/polkadot/node/core/approval-voting/src/approval_db/v3/mod.rs b/polkadot/node/core/approval-voting/src/approval_db/v3/mod.rs new file mode 100644 index 00000000000..3e4f4302195 --- /dev/null +++ b/polkadot/node/core/approval-voting/src/approval_db/v3/mod.rs @@ -0,0 +1,137 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Version 3 of the DB schema. +//! +//! Version 3 modifies the `our_approval` format of `ApprovalEntry` +//! and adds a new field `pending_signatures` for `BlockEntry` + +use parity_scale_codec::{Decode, Encode}; +use polkadot_node_primitives::approval::v2::CandidateBitfield; +use polkadot_node_subsystem::SubsystemResult; +use polkadot_node_subsystem_util::database::{DBTransaction, Database}; +use polkadot_overseer::SubsystemError; +use polkadot_primitives::{ + BlockNumber, CandidateHash, CandidateIndex, CandidateReceipt, CoreIndex, GroupIndex, Hash, + SessionIndex, ValidatorIndex, ValidatorSignature, +}; + +use sp_consensus_slots::Slot; + +use std::collections::BTreeMap; + +use super::common::{block_entry_key, candidate_entry_key, load_decode, Config}; + +/// Re-export this structs as v3 since they did not change between v2 and v3. +pub use super::v2::{Bitfield, OurAssignment, Tick, TrancheEntry}; + +pub mod migration_helpers; + +#[cfg(test)] +pub mod tests; + +/// Metadata about our approval signature +#[derive(Encode, Decode, Debug, Clone, PartialEq)] +pub struct OurApproval { + /// The signature for the candidates hashes pointed by indices. + pub signature: ValidatorSignature, + /// The indices of the candidates signed in this approval. + pub signed_candidates_indices: CandidateBitfield, +} + +/// Metadata regarding approval of a particular candidate within the context of some +/// particular block. +#[derive(Encode, Decode, Debug, Clone, PartialEq)] +pub struct ApprovalEntry { + pub tranches: Vec, + pub backing_group: GroupIndex, + pub our_assignment: Option, + pub our_approval_sig: Option, + // `n_validators` bits. + pub assigned_validators: Bitfield, + pub approved: bool, +} + +/// Metadata regarding approval of a particular candidate. +#[derive(Encode, Decode, Debug, Clone, PartialEq)] +pub struct CandidateEntry { + pub candidate: CandidateReceipt, + pub session: SessionIndex, + // Assignments are based on blocks, so we need to track assignments separately + // based on the block we are looking at. + pub block_assignments: BTreeMap, + pub approvals: Bitfield, +} + +/// Metadata regarding approval of a particular block, by way of approval of the +/// candidates contained within it. +#[derive(Encode, Decode, Debug, Clone, PartialEq)] +pub struct BlockEntry { + pub block_hash: Hash, + pub block_number: BlockNumber, + pub parent_hash: Hash, + pub session: SessionIndex, + pub slot: Slot, + /// Random bytes derived from the VRF submitted within the block by the block + /// author as a credential and used as input to approval assignment criteria. + pub relay_vrf_story: [u8; 32], + // The candidates included as-of this block and the index of the core they are + // leaving. Sorted ascending by core index. + pub candidates: Vec<(CoreIndex, CandidateHash)>, + // A bitfield where the i'th bit corresponds to the i'th candidate in `candidates`. + // The i'th bit is `true` iff the candidate has been approved in the context of this + // block. The block can be considered approved if the bitfield has all bits set to `true`. + pub approved_bitfield: Bitfield, + pub children: Vec, + // A list of candidates we have checked, but didn't not sign and + // advertise the vote yet. + pub candidates_pending_signature: BTreeMap, + // Assignments we already distributed. A 1 bit means the candidate index for which + // we already have sent out an assignment. We need this to avoid distributing + // multiple core assignments more than once. + pub distributed_assignments: Bitfield, +} + +#[derive(Encode, Decode, Debug, Clone, PartialEq)] +/// Context needed for creating an approval signature for a given candidate. +pub struct CandidateSigningContext { + /// The candidate hash, to be included in the signature. + pub candidate_hash: CandidateHash, + /// The latest tick we have to create and send the approval. + pub sign_no_later_than_tick: Tick, +} + +/// Load a candidate entry from the aux store in v2 format. +pub fn load_candidate_entry_v2( + store: &dyn Database, + config: &Config, + candidate_hash: &CandidateHash, +) -> SubsystemResult> { + load_decode(store, config.col_approval_data, &candidate_entry_key(candidate_hash)) + .map(|u: Option| u.map(|v| v.into())) + .map_err(|e| SubsystemError::with_origin("approval-voting", e)) +} + +/// Load a block entry from the aux store in v2 format. +pub fn load_block_entry_v2( + store: &dyn Database, + config: &Config, + block_hash: &Hash, +) -> SubsystemResult> { + load_decode(store, config.col_approval_data, &block_entry_key(block_hash)) + .map(|u: Option| u.map(|v| v.into())) + .map_err(|e| SubsystemError::with_origin("approval-voting", e)) +} diff --git a/polkadot/node/core/approval-voting/src/approval_db/v3/tests.rs b/polkadot/node/core/approval-voting/src/approval_db/v3/tests.rs new file mode 100644 index 00000000000..08c65461bca --- /dev/null +++ b/polkadot/node/core/approval-voting/src/approval_db/v3/tests.rs @@ -0,0 +1,575 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Tests for the aux-schema of approval voting. + +use crate::{ + approval_db::{ + common::{migration_helpers::make_bitvec, DbBackend, StoredBlockRange, *}, + v3::*, + }, + backend::{Backend, OverlayedBackend}, + ops::{add_block_entry, canonicalize, force_approve, NewCandidateInfo}, +}; +use polkadot_primitives::{ + BlockNumber, CandidateHash, CandidateReceipt, CoreIndex, GroupIndex, Hash, +}; + +use polkadot_node_subsystem_util::database::Database; +use polkadot_primitives::Id as ParaId; +use sp_consensus_slots::Slot; +use std::{collections::HashMap, sync::Arc}; + +use ::test_helpers::{dummy_candidate_receipt, dummy_candidate_receipt_bad_sig, dummy_hash}; + +const DATA_COL: u32 = 0; + +const NUM_COLUMNS: u32 = 1; + +const TEST_CONFIG: Config = Config { col_approval_data: DATA_COL }; + +fn make_db() -> (DbBackend, Arc) { + let db = kvdb_memorydb::create(NUM_COLUMNS); + let db = polkadot_node_subsystem_util::database::kvdb_impl::DbAdapter::new(db, &[]); + let db_writer: Arc = Arc::new(db); + (DbBackend::new(db_writer.clone(), TEST_CONFIG), db_writer) +} + +fn make_block_entry( + block_hash: Hash, + parent_hash: Hash, + block_number: BlockNumber, + candidates: Vec<(CoreIndex, CandidateHash)>, +) -> BlockEntry { + BlockEntry { + block_hash, + parent_hash, + block_number, + session: 1, + slot: Slot::from(1), + relay_vrf_story: [0u8; 32], + approved_bitfield: make_bitvec(candidates.len()), + candidates, + children: Vec::new(), + candidates_pending_signature: Default::default(), + distributed_assignments: Default::default(), + } +} + +fn make_candidate(para_id: ParaId, relay_parent: Hash) -> CandidateReceipt { + let mut c = dummy_candidate_receipt(dummy_hash()); + + c.descriptor.para_id = para_id; + c.descriptor.relay_parent = relay_parent; + + c +} + +#[test] +fn read_write() { + let (mut db, store) = make_db(); + + let hash_a = Hash::repeat_byte(1); + let hash_b = Hash::repeat_byte(2); + let candidate_hash = dummy_candidate_receipt_bad_sig(dummy_hash(), None).hash(); + + let range = StoredBlockRange(10, 20); + let at_height = vec![hash_a, hash_b]; + + let block_entry = + make_block_entry(hash_a, Default::default(), 1, vec![(CoreIndex(0), candidate_hash)]); + + let candidate_entry = CandidateEntry { + candidate: dummy_candidate_receipt_bad_sig(dummy_hash(), None), + session: 5, + block_assignments: vec![( + hash_a, + ApprovalEntry { + tranches: Vec::new(), + backing_group: GroupIndex(1), + our_assignment: None, + our_approval_sig: None, + assigned_validators: Default::default(), + approved: false, + }, + )] + .into_iter() + .collect(), + approvals: Default::default(), + }; + + let mut overlay_db = OverlayedBackend::new(&db); + overlay_db.write_stored_block_range(range.clone()); + overlay_db.write_blocks_at_height(1, at_height.clone()); + overlay_db.write_block_entry(block_entry.clone().into()); + overlay_db.write_candidate_entry(candidate_entry.clone().into()); + + let write_ops = overlay_db.into_write_ops(); + db.write(write_ops).unwrap(); + + assert_eq!(load_stored_blocks(store.as_ref(), &TEST_CONFIG).unwrap(), Some(range)); + assert_eq!(load_blocks_at_height(store.as_ref(), &TEST_CONFIG, &1).unwrap(), at_height); + assert_eq!( + load_block_entry(store.as_ref(), &TEST_CONFIG, &hash_a).unwrap(), + Some(block_entry.into()) + ); + assert_eq!( + load_candidate_entry(store.as_ref(), &TEST_CONFIG, &candidate_hash).unwrap(), + Some(candidate_entry.into()), + ); + + let mut overlay_db = OverlayedBackend::new(&db); + overlay_db.delete_blocks_at_height(1); + overlay_db.delete_block_entry(&hash_a); + overlay_db.delete_candidate_entry(&candidate_hash); + let write_ops = overlay_db.into_write_ops(); + db.write(write_ops).unwrap(); + + assert!(load_blocks_at_height(store.as_ref(), &TEST_CONFIG, &1).unwrap().is_empty()); + assert!(load_block_entry(store.as_ref(), &TEST_CONFIG, &hash_a).unwrap().is_none()); + assert!(load_candidate_entry(store.as_ref(), &TEST_CONFIG, &candidate_hash) + .unwrap() + .is_none()); +} + +#[test] +fn add_block_entry_works() { + let (mut db, store) = make_db(); + + let parent_hash = Hash::repeat_byte(1); + let block_hash_a = Hash::repeat_byte(2); + let block_hash_b = Hash::repeat_byte(69); + + let candidate_receipt_a = make_candidate(ParaId::from(1_u32), parent_hash); + let candidate_receipt_b = make_candidate(ParaId::from(2_u32), parent_hash); + + let candidate_hash_a = candidate_receipt_a.hash(); + let candidate_hash_b = candidate_receipt_b.hash(); + + let block_number = 10; + + let block_entry_a = make_block_entry( + block_hash_a, + parent_hash, + block_number, + vec![(CoreIndex(0), candidate_hash_a)], + ); + + let block_entry_b = make_block_entry( + block_hash_b, + parent_hash, + block_number, + vec![(CoreIndex(0), candidate_hash_a), (CoreIndex(1), candidate_hash_b)], + ); + + let n_validators = 10; + + let mut new_candidate_info = HashMap::new(); + new_candidate_info + .insert(candidate_hash_a, NewCandidateInfo::new(candidate_receipt_a, GroupIndex(0), None)); + + let mut overlay_db = OverlayedBackend::new(&db); + add_block_entry(&mut overlay_db, block_entry_a.clone().into(), n_validators, |h| { + new_candidate_info.get(h).map(|x| x.clone()) + }) + .unwrap(); + let write_ops = overlay_db.into_write_ops(); + db.write(write_ops).unwrap(); + + new_candidate_info + .insert(candidate_hash_b, NewCandidateInfo::new(candidate_receipt_b, GroupIndex(1), None)); + + let mut overlay_db = OverlayedBackend::new(&db); + add_block_entry(&mut overlay_db, block_entry_b.clone().into(), n_validators, |h| { + new_candidate_info.get(h).map(|x| x.clone()) + }) + .unwrap(); + let write_ops = overlay_db.into_write_ops(); + db.write(write_ops).unwrap(); + + assert_eq!( + load_block_entry(store.as_ref(), &TEST_CONFIG, &block_hash_a).unwrap(), + Some(block_entry_a.into()) + ); + assert_eq!( + load_block_entry(store.as_ref(), &TEST_CONFIG, &block_hash_b).unwrap(), + Some(block_entry_b.into()) + ); + + let candidate_entry_a = load_candidate_entry(store.as_ref(), &TEST_CONFIG, &candidate_hash_a) + .unwrap() + .unwrap(); + assert_eq!( + candidate_entry_a.block_assignments.keys().collect::>(), + vec![&block_hash_a, &block_hash_b] + ); + + let candidate_entry_b = load_candidate_entry(store.as_ref(), &TEST_CONFIG, &candidate_hash_b) + .unwrap() + .unwrap(); + assert_eq!(candidate_entry_b.block_assignments.keys().collect::>(), vec![&block_hash_b]); +} + +#[test] +fn add_block_entry_adds_child() { + let (mut db, store) = make_db(); + + let parent_hash = Hash::repeat_byte(1); + let block_hash_a = Hash::repeat_byte(2); + let block_hash_b = Hash::repeat_byte(69); + + let mut block_entry_a = make_block_entry(block_hash_a, parent_hash, 1, Vec::new()); + + let block_entry_b = make_block_entry(block_hash_b, block_hash_a, 2, Vec::new()); + + let n_validators = 10; + + let mut overlay_db = OverlayedBackend::new(&db); + add_block_entry(&mut overlay_db, block_entry_a.clone().into(), n_validators, |_| None).unwrap(); + + add_block_entry(&mut overlay_db, block_entry_b.clone().into(), n_validators, |_| None).unwrap(); + + let write_ops = overlay_db.into_write_ops(); + db.write(write_ops).unwrap(); + + block_entry_a.children.push(block_hash_b); + + assert_eq!( + load_block_entry(store.as_ref(), &TEST_CONFIG, &block_hash_a).unwrap(), + Some(block_entry_a.into()) + ); + assert_eq!( + load_block_entry(store.as_ref(), &TEST_CONFIG, &block_hash_b).unwrap(), + Some(block_entry_b.into()) + ); +} + +#[test] +fn canonicalize_works() { + let (mut db, store) = make_db(); + + // -> B1 -> C1 -> D1 + // A -> B2 -> C2 -> D2 + // + // We'll canonicalize C1. Everytning except D1 should disappear. + // + // Candidates: + // Cand1 in B2 + // Cand2 in C2 + // Cand3 in C2 and D1 + // Cand4 in D1 + // Cand5 in D2 + // Only Cand3 and Cand4 should remain after canonicalize. + + let n_validators = 10; + + let mut overlay_db = OverlayedBackend::new(&db); + overlay_db.write_stored_block_range(StoredBlockRange(1, 5)); + let write_ops = overlay_db.into_write_ops(); + db.write(write_ops).unwrap(); + + let genesis = Hash::repeat_byte(0); + + let block_hash_a = Hash::repeat_byte(1); + let block_hash_b1 = Hash::repeat_byte(2); + let block_hash_b2 = Hash::repeat_byte(3); + let block_hash_c1 = Hash::repeat_byte(4); + let block_hash_c2 = Hash::repeat_byte(5); + let block_hash_d1 = Hash::repeat_byte(6); + let block_hash_d2 = Hash::repeat_byte(7); + + let candidate_receipt_genesis = make_candidate(ParaId::from(1_u32), genesis); + let candidate_receipt_a = make_candidate(ParaId::from(2_u32), block_hash_a); + let candidate_receipt_b = make_candidate(ParaId::from(3_u32), block_hash_a); + let candidate_receipt_b1 = make_candidate(ParaId::from(4_u32), block_hash_b1); + let candidate_receipt_c1 = make_candidate(ParaId::from(5_u32), block_hash_c1); + + let cand_hash_1 = candidate_receipt_genesis.hash(); + let cand_hash_2 = candidate_receipt_a.hash(); + let cand_hash_3 = candidate_receipt_b.hash(); + let cand_hash_4 = candidate_receipt_b1.hash(); + let cand_hash_5 = candidate_receipt_c1.hash(); + + let block_entry_a = make_block_entry(block_hash_a, genesis, 1, Vec::new()); + let block_entry_b1 = make_block_entry(block_hash_b1, block_hash_a, 2, Vec::new()); + let block_entry_b2 = + make_block_entry(block_hash_b2, block_hash_a, 2, vec![(CoreIndex(0), cand_hash_1)]); + let block_entry_c1 = make_block_entry(block_hash_c1, block_hash_b1, 3, Vec::new()); + let block_entry_c2 = make_block_entry( + block_hash_c2, + block_hash_b2, + 3, + vec![(CoreIndex(0), cand_hash_2), (CoreIndex(1), cand_hash_3)], + ); + let block_entry_d1 = make_block_entry( + block_hash_d1, + block_hash_c1, + 4, + vec![(CoreIndex(0), cand_hash_3), (CoreIndex(1), cand_hash_4)], + ); + let block_entry_d2 = + make_block_entry(block_hash_d2, block_hash_c2, 4, vec![(CoreIndex(0), cand_hash_5)]); + + let candidate_info = { + let mut candidate_info = HashMap::new(); + candidate_info.insert( + cand_hash_1, + NewCandidateInfo::new(candidate_receipt_genesis, GroupIndex(1), None), + ); + + candidate_info + .insert(cand_hash_2, NewCandidateInfo::new(candidate_receipt_a, GroupIndex(2), None)); + + candidate_info + .insert(cand_hash_3, NewCandidateInfo::new(candidate_receipt_b, GroupIndex(3), None)); + + candidate_info + .insert(cand_hash_4, NewCandidateInfo::new(candidate_receipt_b1, GroupIndex(4), None)); + + candidate_info + .insert(cand_hash_5, NewCandidateInfo::new(candidate_receipt_c1, GroupIndex(5), None)); + + candidate_info + }; + + // now insert all the blocks. + let blocks = vec![ + block_entry_a.clone(), + block_entry_b1.clone(), + block_entry_b2.clone(), + block_entry_c1.clone(), + block_entry_c2.clone(), + block_entry_d1.clone(), + block_entry_d2.clone(), + ]; + + let mut overlay_db = OverlayedBackend::new(&db); + for block_entry in blocks { + add_block_entry(&mut overlay_db, block_entry.into(), n_validators, |h| { + candidate_info.get(h).map(|x| x.clone()) + }) + .unwrap(); + } + let write_ops = overlay_db.into_write_ops(); + db.write(write_ops).unwrap(); + + let check_candidates_in_store = |expected: Vec<(CandidateHash, Option>)>| { + for (c_hash, in_blocks) in expected { + let (entry, in_blocks) = match in_blocks { + None => { + assert!(load_candidate_entry(store.as_ref(), &TEST_CONFIG, &c_hash) + .unwrap() + .is_none()); + continue + }, + Some(i) => ( + load_candidate_entry(store.as_ref(), &TEST_CONFIG, &c_hash).unwrap().unwrap(), + i, + ), + }; + + assert_eq!(entry.block_assignments.len(), in_blocks.len()); + + for x in in_blocks { + assert!(entry.block_assignments.contains_key(&x)); + } + } + }; + + let check_blocks_in_store = |expected: Vec<(Hash, Option>)>| { + for (hash, with_candidates) in expected { + let (entry, with_candidates) = match with_candidates { + None => { + assert!(load_block_entry(store.as_ref(), &TEST_CONFIG, &hash) + .unwrap() + .is_none()); + continue + }, + Some(i) => + (load_block_entry(store.as_ref(), &TEST_CONFIG, &hash).unwrap().unwrap(), i), + }; + + assert_eq!(entry.candidates.len(), with_candidates.len()); + + for x in with_candidates { + assert!(entry.candidates.iter().any(|(_, c)| c == &x)); + } + } + }; + + check_candidates_in_store(vec![ + (cand_hash_1, Some(vec![block_hash_b2])), + (cand_hash_2, Some(vec![block_hash_c2])), + (cand_hash_3, Some(vec![block_hash_c2, block_hash_d1])), + (cand_hash_4, Some(vec![block_hash_d1])), + (cand_hash_5, Some(vec![block_hash_d2])), + ]); + + check_blocks_in_store(vec![ + (block_hash_a, Some(vec![])), + (block_hash_b1, Some(vec![])), + (block_hash_b2, Some(vec![cand_hash_1])), + (block_hash_c1, Some(vec![])), + (block_hash_c2, Some(vec![cand_hash_2, cand_hash_3])), + (block_hash_d1, Some(vec![cand_hash_3, cand_hash_4])), + (block_hash_d2, Some(vec![cand_hash_5])), + ]); + + let mut overlay_db = OverlayedBackend::new(&db); + canonicalize(&mut overlay_db, 3, block_hash_c1).unwrap(); + let write_ops = overlay_db.into_write_ops(); + db.write(write_ops).unwrap(); + + assert_eq!( + load_stored_blocks(store.as_ref(), &TEST_CONFIG).unwrap().unwrap(), + StoredBlockRange(4, 5) + ); + + check_candidates_in_store(vec![ + (cand_hash_1, None), + (cand_hash_2, None), + (cand_hash_3, Some(vec![block_hash_d1])), + (cand_hash_4, Some(vec![block_hash_d1])), + (cand_hash_5, None), + ]); + + check_blocks_in_store(vec![ + (block_hash_a, None), + (block_hash_b1, None), + (block_hash_b2, None), + (block_hash_c1, None), + (block_hash_c2, None), + (block_hash_d1, Some(vec![cand_hash_3, cand_hash_4])), + (block_hash_d2, None), + ]); +} + +#[test] +fn force_approve_works() { + let (mut db, store) = make_db(); + let n_validators = 10; + + let mut overlay_db = OverlayedBackend::new(&db); + overlay_db.write_stored_block_range(StoredBlockRange(1, 4)); + let write_ops = overlay_db.into_write_ops(); + db.write(write_ops).unwrap(); + + let candidate_hash = CandidateHash(Hash::repeat_byte(42)); + let single_candidate_vec = vec![(CoreIndex(0), candidate_hash)]; + let candidate_info = { + let mut candidate_info = HashMap::new(); + candidate_info.insert( + candidate_hash, + NewCandidateInfo::new( + make_candidate(ParaId::from(1_u32), Default::default()), + GroupIndex(1), + None, + ), + ); + + candidate_info + }; + + let block_hash_a = Hash::repeat_byte(1); // 1 + let block_hash_b = Hash::repeat_byte(2); + let block_hash_c = Hash::repeat_byte(3); + let block_hash_d = Hash::repeat_byte(4); // 4 + + let block_entry_a = + make_block_entry(block_hash_a, Default::default(), 1, single_candidate_vec.clone()); + let block_entry_b = + make_block_entry(block_hash_b, block_hash_a, 2, single_candidate_vec.clone()); + let block_entry_c = + make_block_entry(block_hash_c, block_hash_b, 3, single_candidate_vec.clone()); + let block_entry_d = + make_block_entry(block_hash_d, block_hash_c, 4, single_candidate_vec.clone()); + + let blocks = vec![ + block_entry_a.clone(), + block_entry_b.clone(), + block_entry_c.clone(), + block_entry_d.clone(), + ]; + + let mut overlay_db = OverlayedBackend::new(&db); + for block_entry in blocks { + add_block_entry(&mut overlay_db, block_entry.into(), n_validators, |h| { + candidate_info.get(h).map(|x| x.clone()) + }) + .unwrap(); + } + let approved_hashes = force_approve(&mut overlay_db, block_hash_d, 2).unwrap(); + let write_ops = overlay_db.into_write_ops(); + db.write(write_ops).unwrap(); + + assert!(load_block_entry(store.as_ref(), &TEST_CONFIG, &block_hash_a,) + .unwrap() + .unwrap() + .approved_bitfield + .all()); + assert!(load_block_entry(store.as_ref(), &TEST_CONFIG, &block_hash_b,) + .unwrap() + .unwrap() + .approved_bitfield + .all()); + assert!(load_block_entry(store.as_ref(), &TEST_CONFIG, &block_hash_c,) + .unwrap() + .unwrap() + .approved_bitfield + .not_any()); + assert!(load_block_entry(store.as_ref(), &TEST_CONFIG, &block_hash_d,) + .unwrap() + .unwrap() + .approved_bitfield + .not_any()); + assert_eq!(approved_hashes, vec![block_hash_b, block_hash_a]); +} + +#[test] +fn load_all_blocks_works() { + let (mut db, store) = make_db(); + + let parent_hash = Hash::repeat_byte(1); + let block_hash_a = Hash::repeat_byte(2); + let block_hash_b = Hash::repeat_byte(69); + let block_hash_c = Hash::repeat_byte(42); + + let block_number = 10; + + let block_entry_a = make_block_entry(block_hash_a, parent_hash, block_number, vec![]); + + let block_entry_b = make_block_entry(block_hash_b, parent_hash, block_number, vec![]); + + let block_entry_c = make_block_entry(block_hash_c, block_hash_a, block_number + 1, vec![]); + + let n_validators = 10; + + let mut overlay_db = OverlayedBackend::new(&db); + add_block_entry(&mut overlay_db, block_entry_a.clone().into(), n_validators, |_| None).unwrap(); + + // add C before B to test sorting. + add_block_entry(&mut overlay_db, block_entry_c.clone().into(), n_validators, |_| None).unwrap(); + + add_block_entry(&mut overlay_db, block_entry_b.clone().into(), n_validators, |_| None).unwrap(); + + let write_ops = overlay_db.into_write_ops(); + db.write(write_ops).unwrap(); + + assert_eq!( + load_all_blocks(store.as_ref(), &TEST_CONFIG).unwrap(), + vec![block_hash_a, block_hash_b, block_hash_c], + ) +} diff --git a/polkadot/node/core/approval-voting/src/backend.rs b/polkadot/node/core/approval-voting/src/backend.rs index d98f3c5fd20..9ce25334c0f 100644 --- a/polkadot/node/core/approval-voting/src/backend.rs +++ b/polkadot/node/core/approval-voting/src/backend.rs @@ -22,12 +22,12 @@ //! before any commit to the underlying storage is made. use polkadot_node_subsystem::SubsystemResult; -use polkadot_primitives::{BlockNumber, CandidateHash, Hash}; +use polkadot_primitives::{BlockNumber, CandidateHash, CandidateIndex, Hash}; use std::collections::HashMap; use super::{ - approval_db::v2::StoredBlockRange, + approval_db::common::StoredBlockRange, persisted_entries::{BlockEntry, CandidateEntry}, }; @@ -72,12 +72,26 @@ pub trait V1ReadBackend: Backend { fn load_candidate_entry_v1( &self, candidate_hash: &CandidateHash, + candidate_index: CandidateIndex, ) -> SubsystemResult>; /// Load a block entry from the DB with scheme version 1. fn load_block_entry_v1(&self, block_hash: &Hash) -> SubsystemResult>; } +/// A read only backend to enable db migration from version 2 of DB. +pub trait V2ReadBackend: Backend { + /// Load a candidate entry from the DB with scheme version 1. + fn load_candidate_entry_v2( + &self, + candidate_hash: &CandidateHash, + candidate_index: CandidateIndex, + ) -> SubsystemResult>; + + /// Load a block entry from the DB with scheme version 1. + fn load_block_entry_v2(&self, block_hash: &Hash) -> SubsystemResult>; +} + // Status of block range in the `OverlayedBackend`. #[derive(PartialEq)] enum BlockRangeStatus { diff --git a/polkadot/node/core/approval-voting/src/import.rs b/polkadot/node/core/approval-voting/src/import.rs index a64685326cf..7a56e9fd112 100644 --- a/polkadot/node/core/approval-voting/src/import.rs +++ b/polkadot/node/core/approval-voting/src/import.rs @@ -56,7 +56,7 @@ use futures::{channel::oneshot, prelude::*}; use std::collections::HashMap; -use super::approval_db::v2; +use super::approval_db::v3; use crate::{ backend::{Backend, OverlayedBackend}, criteria::{AssignmentCriteria, OurAssignment}, @@ -512,7 +512,7 @@ pub(crate) async fn handle_new_head( ctx.send_message(ChainSelectionMessage::Approved(block_hash)).await; } - let block_entry = v2::BlockEntry { + let block_entry = v3::BlockEntry { block_hash, parent_hash: block_header.parent_hash, block_number: block_header.number, @@ -525,6 +525,7 @@ pub(crate) async fn handle_new_head( .collect(), approved_bitfield, children: Vec::new(), + candidates_pending_signature: Default::default(), distributed_assignments: Default::default(), }; @@ -604,7 +605,10 @@ pub(crate) async fn handle_new_head( #[cfg(test)] pub(crate) mod tests { use super::*; - use crate::{approval_db::v2::DbBackend, RuntimeInfo, RuntimeInfoConfig}; + use crate::{ + approval_db::common::{load_block_entry, DbBackend}, + RuntimeInfo, RuntimeInfoConfig, + }; use ::test_helpers::{dummy_candidate_receipt, dummy_hash}; use assert_matches::assert_matches; use polkadot_node_primitives::{ @@ -627,7 +631,7 @@ pub(crate) mod tests { pub(crate) use sp_runtime::{Digest, DigestItem}; use std::{pin::Pin, sync::Arc}; - use crate::{approval_db::v2::Config as DatabaseConfig, criteria, BlockEntry}; + use crate::{approval_db::common::Config as DatabaseConfig, criteria, BlockEntry}; const DATA_COL: u32 = 0; @@ -1347,7 +1351,7 @@ pub(crate) mod tests { let (state, mut session_info_provider) = single_session_state(); overlay_db.write_block_entry( - v2::BlockEntry { + v3::BlockEntry { block_hash: parent_hash, parent_hash: Default::default(), block_number: 4, @@ -1357,6 +1361,7 @@ pub(crate) mod tests { candidates: Vec::new(), approved_bitfield: Default::default(), children: Vec::new(), + candidates_pending_signature: Default::default(), distributed_assignments: Default::default(), } .into(), @@ -1389,11 +1394,10 @@ pub(crate) mod tests { assert_eq!(candidates[1].1.approvals().len(), 6); // the first candidate should be insta-approved // the second should not - let entry: BlockEntry = - v2::load_block_entry(db_writer.as_ref(), &TEST_CONFIG, &hash) - .unwrap() - .unwrap() - .into(); + let entry: BlockEntry = load_block_entry(db_writer.as_ref(), &TEST_CONFIG, &hash) + .unwrap() + .unwrap() + .into(); assert!(entry.is_candidate_approved(&candidates[0].0)); assert!(!entry.is_candidate_approved(&candidates[1].0)); }) diff --git a/polkadot/node/core/approval-voting/src/lib.rs b/polkadot/node/core/approval-voting/src/lib.rs index ef01727b7eb..af76b576d7c 100644 --- a/polkadot/node/core/approval-voting/src/lib.rs +++ b/polkadot/node/core/approval-voting/src/lib.rs @@ -21,14 +21,15 @@ //! of others. It uses this information to determine when candidates and blocks have //! been sufficiently approved to finalize. +use itertools::Itertools; use jaeger::{hash_to_trace_identifier, PerLeafSpan}; use polkadot_node_jaeger as jaeger; use polkadot_node_primitives::{ approval::{ - v1::{BlockApprovalMeta, DelayTranche, IndirectSignedApprovalVote}, + v1::{BlockApprovalMeta, DelayTranche}, v2::{ AssignmentCertKindV2, BitfieldError, CandidateBitfield, CoreBitfield, - IndirectAssignmentCertV2, + IndirectAssignmentCertV2, IndirectSignedApprovalVoteV2, }, }, ValidationResult, DISPUTE_WINDOW, @@ -53,9 +54,10 @@ use polkadot_node_subsystem_util::{ TimeoutExt, }; use polkadot_primitives::{ - ApprovalVote, BlockNumber, CandidateHash, CandidateIndex, CandidateReceipt, DisputeStatement, - ExecutorParams, GroupIndex, Hash, PvfExecKind, SessionIndex, SessionInfo, - ValidDisputeStatementKind, ValidatorId, ValidatorIndex, ValidatorPair, ValidatorSignature, + vstaging::{ApprovalVoteMultipleCandidates, ApprovalVotingParams}, + BlockNumber, CandidateHash, CandidateIndex, CandidateReceipt, DisputeStatement, ExecutorParams, + GroupIndex, Hash, PvfExecKind, SessionIndex, SessionInfo, ValidDisputeStatementKind, + ValidatorId, ValidatorIndex, ValidatorPair, ValidatorSignature, }; use sc_keystore::LocalKeystore; use sp_application_crypto::Pair; @@ -67,9 +69,11 @@ use futures::{ future::{BoxFuture, RemoteHandle}, prelude::*, stream::FuturesUnordered, + StreamExt, }; use std::{ + cmp::min, collections::{ btree_map::Entry as BTMEntry, hash_map::Entry as HMEntry, BTreeMap, HashMap, HashSet, }, @@ -83,7 +87,7 @@ use approval_checking::RequiredTranches; use bitvec::{order::Lsb0, vec::BitVec}; use criteria::{AssignmentCriteria, RealAssignmentCriteria}; use persisted_entries::{ApprovalEntry, BlockEntry, CandidateEntry}; -use time::{slot_number_to_tick, Clock, ClockExt, SystemClock, Tick}; +use time::{slot_number_to_tick, Clock, ClockExt, DelayedApprovalTimer, SystemClock, Tick}; mod approval_checking; pub mod approval_db; @@ -95,9 +99,11 @@ mod persisted_entries; mod time; use crate::{ - approval_db::v2::{Config as DatabaseConfig, DbBackend}, + approval_checking::{Check, TranchesToApproveResult}, + approval_db::common::{Config as DatabaseConfig, DbBackend}, backend::{Backend, OverlayedBackend}, criteria::InvalidAssignmentReason, + persisted_entries::OurApproval, }; #[cfg(test)] @@ -115,6 +121,9 @@ const TICK_TOO_FAR_IN_FUTURE: Tick = 20; // 10 seconds. const APPROVAL_DELAY: Tick = 2; pub(crate) const LOG_TARGET: &str = "parachain::approval-voting"; +// The max number of ticks we delay sending the approval after we are ready to issue the approval +const MAX_APPROVAL_COALESCE_WAIT_TICKS: Tick = 12; + /// Configuration for the approval voting subsystem #[derive(Debug, Clone)] pub struct Config { @@ -158,7 +167,14 @@ struct MetricsInner { assignments_produced: prometheus::Histogram, approvals_produced_total: prometheus::CounterVec, no_shows_total: prometheus::Counter, + // The difference from `no_shows_total` is that this counts all observed no-shows at any + // moment in time. While `no_shows_total` catches that the no-shows at the moment the candidate + // is approved, approvals might arrive late and `no_shows_total` wouldn't catch that number. + observed_no_shows: prometheus::Counter, + approved_by_one_third: prometheus::Counter, wakeups_triggered_total: prometheus::Counter, + coalesced_approvals_buckets: prometheus::Histogram, + coalesced_approvals_delay: prometheus::Histogram, candidate_approval_time_ticks: prometheus::Histogram, block_approval_time_ticks: prometheus::Histogram, time_db_transaction: prometheus::Histogram, @@ -184,6 +200,22 @@ impl Metrics { } } + fn on_approval_coalesce(&self, num_coalesced: u32) { + if let Some(metrics) = &self.0 { + // Count how many candidates we covered with this coalesced approvals, + // so that the heat-map really gives a good understanding of the scales. + for _ in 0..num_coalesced { + metrics.coalesced_approvals_buckets.observe(num_coalesced as f64) + } + } + } + + fn on_delayed_approval(&self, delayed_ticks: u64) { + if let Some(metrics) = &self.0 { + metrics.coalesced_approvals_delay.observe(delayed_ticks as f64) + } + } + fn on_approval_stale(&self) { if let Some(metrics) = &self.0 { metrics.approvals_produced_total.with_label_values(&["stale"]).inc() @@ -220,6 +252,18 @@ impl Metrics { } } + fn on_observed_no_shows(&self, n: usize) { + if let Some(metrics) = &self.0 { + metrics.observed_no_shows.inc_by(n as u64); + } + } + + fn on_approved_by_one_third(&self) { + if let Some(metrics) = &self.0 { + metrics.approved_by_one_third.inc(); + } + } + fn on_wakeup(&self) { if let Some(metrics) = &self.0 { metrics.wakeups_triggered_total.inc(); @@ -297,6 +341,13 @@ impl metrics::Metrics for Metrics { )?, registry, )?, + observed_no_shows: prometheus::register( + prometheus::Counter::new( + "polkadot_parachain_approvals_observed_no_shows_total", + "Number of observed no shows at any moment in time", + )?, + registry, + )?, wakeups_triggered_total: prometheus::register( prometheus::Counter::new( "polkadot_parachain_approvals_wakeups_total", @@ -313,6 +364,31 @@ impl metrics::Metrics for Metrics { )?, registry, )?, + coalesced_approvals_buckets: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "polkadot_parachain_approvals_coalesced_approvals_buckets", + "Number of coalesced approvals.", + ).buckets(vec![1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5]), + )?, + registry, + )?, + coalesced_approvals_delay: prometheus::register( + prometheus::Histogram::with_opts( + prometheus::HistogramOpts::new( + "polkadot_parachain_approvals_coalescing_delay", + "Number of ticks we delay the sending of a candidate approval", + ).buckets(vec![1.1, 2.1, 3.1, 4.1, 6.1, 8.1, 12.1, 20.1, 32.1]), + )?, + registry, + )?, + approved_by_one_third: prometheus::register( + prometheus::Counter::new( + "polkadot_parachain_approved_by_one_third", + "Number of candidates where more than one third had to vote ", + )?, + registry, + )?, block_approval_time_ticks: prometheus::register( prometheus::Histogram::with_opts( prometheus::HistogramOpts::new( @@ -383,8 +459,8 @@ impl ApprovalVotingSubsystem { /// The operation is not allowed for blocks older than the last finalized one. pub fn revert_to(&self, hash: Hash) -> Result<(), SubsystemError> { let config = - approval_db::v2::Config { col_approval_data: self.db_config.col_approval_data }; - let mut backend = approval_db::v2::DbBackend::new(self.db.clone(), config); + approval_db::common::Config { col_approval_data: self.db_config.col_approval_data }; + let mut backend = approval_db::common::DbBackend::new(self.db.clone(), config); let mut overlay = OverlayedBackend::new(&backend); ops::revert_to(&mut overlay, hash)?; @@ -559,6 +635,7 @@ struct ApprovalStatus { required_tranches: RequiredTranches, tranche_now: DelayTranche, block_tick: Tick, + last_no_shows: usize, } #[derive(Copy, Clone)] @@ -733,22 +810,73 @@ impl State { ); if let Some(approval_entry) = candidate_entry.approval_entry(&block_hash) { - let required_tranches = approval_checking::tranches_to_approve( - approval_entry, - candidate_entry.approvals(), - tranche_now, - block_tick, - no_show_duration, - session_info.needed_approvals as _, - ); + let TranchesToApproveResult { required_tranches, total_observed_no_shows } = + approval_checking::tranches_to_approve( + approval_entry, + candidate_entry.approvals(), + tranche_now, + block_tick, + no_show_duration, + session_info.needed_approvals as _, + ); - let status = ApprovalStatus { required_tranches, block_tick, tranche_now }; + let status = ApprovalStatus { + required_tranches, + block_tick, + tranche_now, + last_no_shows: total_observed_no_shows, + }; Some((approval_entry, status)) } else { None } } + + // Returns the approval voting params from the RuntimeApi. + #[overseer::contextbounds(ApprovalVoting, prefix = self::overseer)] + async fn get_approval_voting_params_or_default( + &self, + ctx: &mut Context, + session_index: SessionIndex, + block_hash: Hash, + ) -> Option { + let (s_tx, s_rx) = oneshot::channel(); + + ctx.send_message(RuntimeApiMessage::Request( + block_hash, + RuntimeApiRequest::ApprovalVotingParams(session_index, s_tx), + )) + .await; + + match s_rx.await { + Ok(Ok(params)) => { + gum::trace!( + target: LOG_TARGET, + approval_voting_params = ?params, + session = ?session_index, + "Using the following subsystem params" + ); + Some(params) + }, + Ok(Err(err)) => { + gum::debug!( + target: LOG_TARGET, + ?err, + "Could not request approval voting params from runtime" + ); + None + }, + Err(err) => { + gum::debug!( + target: LOG_TARGET, + ?err, + "Could not request approval voting params from runtime" + ); + None + }, + } + } } #[derive(Debug, Clone)] @@ -807,6 +935,7 @@ where }); let mut wakeups = Wakeups::default(); let mut currently_checking_set = CurrentlyCheckingSet::default(); + let mut delayed_approvals_timers = DelayedApprovalTimer::default(); let mut approvals_cache = LruMap::new(ByLength::new(APPROVAL_CACHE_SIZE)); let mut last_finalized_height: Option = { @@ -885,17 +1014,49 @@ where } actions + }, + (block_hash, validator_index) = delayed_approvals_timers.select_next_some() => { + gum::debug!( + target: LOG_TARGET, + ?block_hash, + ?validator_index, + "Sign approval for multiple candidates", + ); + + match maybe_create_signature( + &mut overlayed_db, + &mut session_info_provider, + &state, + &mut ctx, + block_hash, + validator_index, + &subsystem.metrics, + ).await { + Ok(Some(next_wakeup)) => { + delayed_approvals_timers.maybe_arm_timer(next_wakeup, state.clock.as_ref(), block_hash, validator_index); + }, + Ok(None) => {} + Err(err) => { + gum::error!( + target: LOG_TARGET, + ?err, + "Failed to create signature", + ); + } + } + vec![] } }; if handle_actions( &mut ctx, - &state, + &mut state, &mut overlayed_db, &mut session_info_provider, &subsystem.metrics, &mut wakeups, &mut currently_checking_set, + &mut delayed_approvals_timers, &mut approvals_cache, &mut subsystem.mode, actions, @@ -937,12 +1098,13 @@ where #[overseer::contextbounds(ApprovalVoting, prefix = self::overseer)] async fn handle_actions( ctx: &mut Context, - state: &State, + state: &mut State, overlayed_db: &mut OverlayedBackend<'_, impl Backend>, session_info_provider: &mut RuntimeInfo, metrics: &Metrics, wakeups: &mut Wakeups, currently_checking_set: &mut CurrentlyCheckingSet, + delayed_approvals_timers: &mut DelayedApprovalTimer, approvals_cache: &mut LruMap, mode: &mut Mode, actions: Vec, @@ -973,6 +1135,7 @@ async fn handle_actions( session_info_provider, metrics, candidate_hash, + delayed_approvals_timers, approval_request, ) .await? @@ -1075,7 +1238,11 @@ async fn handle_actions( Action::BecomeActive => { *mode = Mode::Active; - let messages = distribution_messages_for_activation(overlayed_db, state)?; + let messages = distribution_messages_for_activation( + overlayed_db, + state, + delayed_approvals_timers, + )?; ctx.send_messages(messages.into_iter()).await; }, @@ -1101,7 +1268,7 @@ fn cores_to_candidate_indices( .iter() .position(|(core_index, _)| core_index.0 == claimed_core_index as u32) { - candidate_indices.push(candidate_index as CandidateIndex); + candidate_indices.push(candidate_index as _); } } @@ -1134,6 +1301,7 @@ fn get_assignment_core_indices( fn distribution_messages_for_activation( db: &OverlayedBackend<'_, impl Backend>, state: &State, + delayed_approvals_timers: &mut DelayedApprovalTimer, ) -> SubsystemResult> { let all_blocks: Vec = db.load_all_blocks()?; @@ -1172,8 +1340,8 @@ fn distribution_messages_for_activation( slot: block_entry.slot(), session: block_entry.session(), }); - - for (i, (_, candidate_hash)) in block_entry.candidates().iter().enumerate() { + let mut signatures_queued = HashSet::new(); + for (_, candidate_hash) in block_entry.candidates() { let _candidate_span = distribution_message_span.child("candidate").with_candidate(*candidate_hash); let candidate_entry = match db.load_candidate_entry(&candidate_hash)? { @@ -1200,6 +1368,15 @@ fn distribution_messages_for_activation( &candidate_hash, &block_entry, ) { + if block_entry.has_candidates_pending_signature() { + delayed_approvals_timers.maybe_arm_timer( + state.clock.tick_now(), + state.clock.as_ref(), + block_entry.block_hash(), + assignment.validator_index(), + ) + } + match cores_to_candidate_indices( &claimed_core_indices, &block_entry, @@ -1267,15 +1444,19 @@ fn distribution_messages_for_activation( continue }, } - - messages.push(ApprovalDistributionMessage::DistributeApproval( - IndirectSignedApprovalVote { - block_hash, - candidate_index: i as _, - validator: assignment.validator_index(), - signature: approval_sig, - }, - )); + if signatures_queued + .insert(approval_sig.signed_candidates_indices.clone()) + { + messages.push(ApprovalDistributionMessage::DistributeApproval( + IndirectSignedApprovalVoteV2 { + block_hash, + candidate_indices: approval_sig + .signed_candidates_indices, + validator: assignment.validator_index(), + signature: approval_sig.signature, + }, + )) + }; } else { gum::warn!( target: LOG_TARGET, @@ -1481,7 +1662,7 @@ async fn get_approval_signatures_for_candidate( ctx: &mut Context, db: &OverlayedBackend<'_, impl Backend>, candidate_hash: CandidateHash, - tx: oneshot::Sender>, + tx: oneshot::Sender, ValidatorSignature)>>, ) -> SubsystemResult<()> { let send_votes = |votes| { if let Err(_) = tx.send(votes) { @@ -1507,6 +1688,11 @@ async fn get_approval_signatures_for_candidate( let relay_hashes = entry.block_assignments.keys(); let mut candidate_indices = HashSet::new(); + let mut candidate_indices_to_candidate_hashes: HashMap< + Hash, + HashMap, + > = HashMap::new(); + // Retrieve `CoreIndices`/`CandidateIndices` as required by approval-distribution: for hash in relay_hashes { let entry = match db.load_block_entry(hash)? { @@ -1524,8 +1710,11 @@ async fn get_approval_signatures_for_candidate( for (candidate_index, (_core_index, c_hash)) in entry.candidates().iter().enumerate() { if c_hash == &candidate_hash { candidate_indices.insert((*hash, candidate_index as u32)); - break } + candidate_indices_to_candidate_hashes + .entry(*hash) + .or_default() + .insert(candidate_index as _, *c_hash); } } @@ -1550,7 +1739,55 @@ async fn get_approval_signatures_for_candidate( target: LOG_TARGET, "Request for approval signatures got cancelled by `approval-distribution`." ), - Some(Ok(votes)) => send_votes(votes), + Some(Ok(votes)) => { + let votes = votes + .into_iter() + .filter_map(|(validator_index, (hash, signed_candidates_indices, signature))| { + let candidates_hashes = candidate_indices_to_candidate_hashes.get(&hash); + + if candidates_hashes.is_none() { + gum::warn!( + target: LOG_TARGET, + ?hash, + "Possible bug! Could not find map of candidate_hashes for block hash received from approval-distribution" + ); + } + + let num_signed_candidates = signed_candidates_indices.len(); + + let signed_candidates_hashes: Vec = + signed_candidates_indices + .into_iter() + .filter_map(|candidate_index| { + candidates_hashes.and_then(|candidate_hashes| { + if let Some(candidate_hash) = + candidate_hashes.get(&candidate_index) + { + Some(*candidate_hash) + } else { + gum::warn!( + target: LOG_TARGET, + ?candidate_index, + "Possible bug! Could not find candidate hash for candidate_index coming from approval-distribution" + ); + None + } + }) + }) + .collect(); + if num_signed_candidates == signed_candidates_hashes.len() { + Some((validator_index, (signed_candidates_hashes, signature))) + } else { + gum::warn!( + target: LOG_TARGET, + "Possible bug! Could not find all hashes for candidates coming from approval-distribution" + ); + None + } + }) + .collect(); + send_votes(votes) + }, } }; @@ -2184,7 +2421,7 @@ async fn check_and_import_approval( db: &mut OverlayedBackend<'_, impl Backend>, session_info_provider: &mut RuntimeInfo, metrics: &Metrics, - approval: IndirectSignedApprovalVote, + approval: IndirectSignedApprovalVoteV2, with_response: impl FnOnce(ApprovalCheckResult) -> T, ) -> SubsystemResult<(Vec, T)> where @@ -2196,13 +2433,12 @@ where return Ok((Vec::new(), t)) }}; } - let mut span = state .spans .get(&approval.block_hash) .map(|span| span.child("check-and-import-approval")) .unwrap_or_else(|| jaeger::Span::new(approval.block_hash, "check-and-import-approval")) - .with_uint_tag("candidate-index", approval.candidate_index as u64) + .with_string_fmt_debug_tag("candidate-index", approval.candidate_indices.clone()) .with_relay_parent(approval.block_hash) .with_stage(jaeger::Stage::ApprovalChecking); @@ -2215,105 +2451,163 @@ where }, }; - let session_info = match get_session_info( - session_info_provider, - sender, - approval.block_hash, - block_entry.session(), - ) - .await - { - Some(s) => s, - None => { - respond_early!(ApprovalCheckResult::Bad(ApprovalCheckError::UnknownSessionIndex( - block_entry.session() - ),)) - }, - }; + let approved_candidates_info: Result, ApprovalCheckError> = + approval + .candidate_indices + .iter_ones() + .map(|candidate_index| { + block_entry + .candidate(candidate_index) + .ok_or(ApprovalCheckError::InvalidCandidateIndex(candidate_index as _)) + .map(|candidate| (candidate_index as _, candidate.1)) + }) + .collect(); - let approved_candidate_hash = match block_entry.candidate(approval.candidate_index as usize) { - Some((_, h)) => *h, - None => respond_early!(ApprovalCheckResult::Bad( - ApprovalCheckError::InvalidCandidateIndex(approval.candidate_index), - )), + let approved_candidates_info = match approved_candidates_info { + Ok(approved_candidates_info) => approved_candidates_info, + Err(err) => { + respond_early!(ApprovalCheckResult::Bad(err)) + }, }; - span.add_string_tag("candidate-hash", format!("{:?}", approved_candidate_hash)); + span.add_string_tag("candidate-hashes", format!("{:?}", approved_candidates_info)); span.add_string_tag( - "traceID", - format!("{:?}", hash_to_trace_identifier(approved_candidate_hash.0)), + "traceIDs", + format!( + "{:?}", + approved_candidates_info + .iter() + .map(|(_, approved_candidate_hash)| hash_to_trace_identifier( + approved_candidate_hash.0 + )) + .collect_vec() + ), ); - let pubkey = match session_info.validators.get(approval.validator) { - Some(k) => k, - None => respond_early!(ApprovalCheckResult::Bad( - ApprovalCheckError::InvalidValidatorIndex(approval.validator), - )), - }; + { + let session_info = match get_session_info( + session_info_provider, + sender, + approval.block_hash, + block_entry.session(), + ) + .await + { + Some(s) => s, + None => { + respond_early!(ApprovalCheckResult::Bad(ApprovalCheckError::UnknownSessionIndex( + block_entry.session() + ),)) + }, + }; - // Signature check: - match DisputeStatement::Valid(ValidDisputeStatementKind::ApprovalChecking).check_signature( - &pubkey, - approved_candidate_hash, - block_entry.session(), - &approval.signature, - ) { - Err(_) => respond_early!(ApprovalCheckResult::Bad(ApprovalCheckError::InvalidSignature( - approval.validator - ),)), - Ok(()) => {}, - }; + let pubkey = match session_info.validators.get(approval.validator) { + Some(k) => k, + None => respond_early!(ApprovalCheckResult::Bad( + ApprovalCheckError::InvalidValidatorIndex(approval.validator), + )), + }; - let candidate_entry = match db.load_candidate_entry(&approved_candidate_hash)? { - Some(c) => c, - None => { - respond_early!(ApprovalCheckResult::Bad(ApprovalCheckError::InvalidCandidate( - approval.candidate_index, - approved_candidate_hash - ),)) - }, - }; + gum::trace!( + target: LOG_TARGET, + "Received approval for num_candidates {:}", + approval.candidate_indices.count_ones() + ); - // Don't accept approvals until assignment. - match candidate_entry.approval_entry(&approval.block_hash) { - None => { - respond_early!(ApprovalCheckResult::Bad(ApprovalCheckError::Internal( - approval.block_hash, - approved_candidate_hash - ),)) - }, - Some(e) if !e.is_assigned(approval.validator) => { - respond_early!(ApprovalCheckResult::Bad(ApprovalCheckError::NoAssignment( - approval.validator - ),)) - }, - _ => {}, + let candidate_hashes: Vec = + approved_candidates_info.iter().map(|candidate| candidate.1).collect(); + // Signature check: + match DisputeStatement::Valid( + ValidDisputeStatementKind::ApprovalCheckingMultipleCandidates(candidate_hashes.clone()), + ) + .check_signature( + &pubkey, + if let Some(candidate_hash) = candidate_hashes.first() { + *candidate_hash + } else { + respond_early!(ApprovalCheckResult::Bad(ApprovalCheckError::InvalidValidatorIndex( + approval.validator + ),)) + }, + block_entry.session(), + &approval.signature, + ) { + Err(_) => { + gum::error!( + target: LOG_TARGET, + "Error while checking signature {:}", + approval.candidate_indices.count_ones() + ); + respond_early!(ApprovalCheckResult::Bad(ApprovalCheckError::InvalidSignature( + approval.validator + ),)) + }, + Ok(()) => {}, + }; } - // importing the approval can be heavy as it may trigger acceptance for a series of blocks. - let t = with_response(ApprovalCheckResult::Accepted); + let mut actions = Vec::new(); + for (approval_candidate_index, approved_candidate_hash) in approved_candidates_info { + let block_entry = match db.load_block_entry(&approval.block_hash)? { + Some(b) => b, + None => { + respond_early!(ApprovalCheckResult::Bad(ApprovalCheckError::UnknownBlock( + approval.block_hash + ),)) + }, + }; - gum::trace!( - target: LOG_TARGET, - validator_index = approval.validator.0, - validator = ?pubkey, - candidate_hash = ?approved_candidate_hash, - para_id = ?candidate_entry.candidate_receipt().descriptor.para_id, - "Importing approval vote", - ); + let candidate_entry = match db.load_candidate_entry(&approved_candidate_hash)? { + Some(c) => c, + None => { + respond_early!(ApprovalCheckResult::Bad(ApprovalCheckError::InvalidCandidate( + approval_candidate_index, + approved_candidate_hash + ),)) + }, + }; - let actions = advance_approval_state( - sender, - state, - db, - session_info_provider, - &metrics, - block_entry, - approved_candidate_hash, - candidate_entry, - ApprovalStateTransition::RemoteApproval(approval.validator), - ) - .await; + // Don't accept approvals until assignment. + match candidate_entry.approval_entry(&approval.block_hash) { + None => { + respond_early!(ApprovalCheckResult::Bad(ApprovalCheckError::Internal( + approval.block_hash, + approved_candidate_hash + ),)) + }, + Some(e) if !e.is_assigned(approval.validator) => { + respond_early!(ApprovalCheckResult::Bad(ApprovalCheckError::NoAssignment( + approval.validator + ),)) + }, + _ => {}, + } + + gum::debug!( + target: LOG_TARGET, + validator_index = approval.validator.0, + candidate_hash = ?approved_candidate_hash, + para_id = ?candidate_entry.candidate_receipt().descriptor.para_id, + "Importing approval vote", + ); + + let new_actions = advance_approval_state( + sender, + state, + db, + session_info_provider, + &metrics, + block_entry, + approved_candidate_hash, + candidate_entry, + ApprovalStateTransition::RemoteApproval(approval.validator), + ) + .await; + actions.extend(new_actions); + } + + // importing the approval can be heavy as it may trigger acceptance for a series of blocks. + let t = with_response(ApprovalCheckResult::Accepted); Ok((actions, t)) } @@ -2321,7 +2615,7 @@ where #[derive(Debug)] enum ApprovalStateTransition { RemoteApproval(ValidatorIndex), - LocalApproval(ValidatorIndex, ValidatorSignature), + LocalApproval(ValidatorIndex), WakeupProcessed, } @@ -2329,7 +2623,7 @@ impl ApprovalStateTransition { fn validator_index(&self) -> Option { match *self { ApprovalStateTransition::RemoteApproval(v) | - ApprovalStateTransition::LocalApproval(v, _) => Some(v), + ApprovalStateTransition::LocalApproval(v) => Some(v), ApprovalStateTransition::WakeupProcessed => None, } } @@ -2337,7 +2631,7 @@ impl ApprovalStateTransition { fn is_local_approval(&self) -> bool { match *self { ApprovalStateTransition::RemoteApproval(_) => false, - ApprovalStateTransition::LocalApproval(_, _) => true, + ApprovalStateTransition::LocalApproval(_) => true, ApprovalStateTransition::WakeupProcessed => false, } } @@ -2404,7 +2698,16 @@ where // assignment tick of `now - APPROVAL_DELAY` - that is, that // all counted assignments are at least `APPROVAL_DELAY` ticks old. let is_approved = check.is_approved(tick_now.saturating_sub(APPROVAL_DELAY)); - + if status.last_no_shows != 0 { + metrics.on_observed_no_shows(status.last_no_shows); + gum::debug!( + target: LOG_TARGET, + ?candidate_hash, + ?block_hash, + last_no_shows = ?status.last_no_shows, + "Observed no_shows", + ); + } if is_approved { gum::trace!( target: LOG_TARGET, @@ -2422,6 +2725,12 @@ where if no_shows != 0 { metrics.on_no_shows(no_shows); } + if check == Check::ApprovedOneThird { + // No-shows are not counted when more than one third of validators approve a + // candidate, so count candidates where more than one third of validators had to + // approve it, this is indicative of something breaking. + metrics.on_approved_by_one_third() + } metrics.on_candidate_approved(status.tranche_now as _); @@ -2430,6 +2739,10 @@ where actions.push(Action::NoteApprovedInChainSelection(block_hash)); } + db.write_block_entry(block_entry.into()); + } else if transition.is_local_approval() { + // Local approvals always update the block_entry, so we need to flush it to + // the database. db.write_block_entry(block_entry.into()); } @@ -2458,10 +2771,6 @@ where approval_entry.mark_approved(); } - if let ApprovalStateTransition::LocalApproval(_, ref sig) = transition { - approval_entry.import_approval_sig(sig.clone()); - } - actions.extend(schedule_wakeup_action( &approval_entry, block_hash, @@ -2599,7 +2908,7 @@ async fn process_wakeup( let should_trigger = should_trigger_assignment( &approval_entry, &candidate_entry, - tranches_to_approve, + tranches_to_approve.required_tranches, tranche_now, ); @@ -2924,11 +3233,12 @@ async fn launch_approval( #[overseer::contextbounds(ApprovalVoting, prefix = self::overseer)] async fn issue_approval( ctx: &mut Context, - state: &State, + state: &mut State, db: &mut OverlayedBackend<'_, impl Backend>, session_info_provider: &mut RuntimeInfo, metrics: &Metrics, candidate_hash: CandidateHash, + delayed_approvals_timers: &mut DelayedApprovalTimer, ApprovalVoteRequest { validator_index, block_hash }: ApprovalVoteRequest, ) -> SubsystemResult> { let mut issue_approval_span = state @@ -2942,7 +3252,7 @@ async fn issue_approval( .with_validator_index(validator_index) .with_stage(jaeger::Stage::ApprovalChecking); - let block_entry = match db.load_block_entry(&block_hash)? { + let mut block_entry = match db.load_block_entry(&block_hash)? { Some(b) => b, None => { // not a cause for alarm - just lost a race with pruning, most likely. @@ -2968,21 +3278,6 @@ async fn issue_approval( }; issue_approval_span.add_int_tag("candidate_index", candidate_index as i64); - let session_info = match get_session_info( - session_info_provider, - ctx.sender(), - block_entry.parent_hash(), - block_entry.session(), - ) - .await - { - Some(s) => s, - None => { - metrics.on_approval_error(); - return Ok(Vec::new()) - }, - }; - let candidate_hash = match block_entry.candidate(candidate_index as usize) { Some((_, h)) => *h, None => { @@ -3013,10 +3308,149 @@ async fn issue_approval( }, }; + let session_info = match get_session_info( + session_info_provider, + ctx.sender(), + block_entry.parent_hash(), + block_entry.session(), + ) + .await + { + Some(s) => s, + None => return Ok(Vec::new()), + }; + + if block_entry + .defer_candidate_signature( + candidate_index as _, + candidate_hash, + compute_delayed_approval_sending_tick( + state, + &block_entry, + &candidate_entry, + session_info, + &metrics, + ), + ) + .is_some() + { + gum::error!( + target: LOG_TARGET, + ?candidate_hash, + ?block_hash, + validator_index = validator_index.0, + "Possible bug, we shouldn't have to defer a candidate more than once", + ); + } + + gum::info!( + target: LOG_TARGET, + ?candidate_hash, + ?block_hash, + validator_index = validator_index.0, + "Ready to issue approval vote", + ); + + let actions = advance_approval_state( + ctx.sender(), + state, + db, + session_info_provider, + metrics, + block_entry, + candidate_hash, + candidate_entry, + ApprovalStateTransition::LocalApproval(validator_index as _), + ) + .await; + + if let Some(next_wakeup) = maybe_create_signature( + db, + session_info_provider, + state, + ctx, + block_hash, + validator_index, + metrics, + ) + .await? + { + delayed_approvals_timers.maybe_arm_timer( + next_wakeup, + state.clock.as_ref(), + block_hash, + validator_index, + ); + } + Ok(actions) +} + +// Create signature for the approved candidates pending signatures +#[overseer::contextbounds(ApprovalVoting, prefix = self::overseer)] +async fn maybe_create_signature( + db: &mut OverlayedBackend<'_, impl Backend>, + session_info_provider: &mut RuntimeInfo, + state: &State, + ctx: &mut Context, + block_hash: Hash, + validator_index: ValidatorIndex, + metrics: &Metrics, +) -> SubsystemResult> { + let mut block_entry = match db.load_block_entry(&block_hash)? { + Some(b) => b, + None => { + // not a cause for alarm - just lost a race with pruning, most likely. + metrics.on_approval_stale(); + gum::debug!( + target: LOG_TARGET, + "Could not find block that needs signature {:}", block_hash + ); + return Ok(None) + }, + }; + + let approval_params = state + .get_approval_voting_params_or_default(ctx, block_entry.session(), block_hash) + .await + .unwrap_or_default(); + + gum::trace!( + target: LOG_TARGET, + "Candidates pending signatures {:}", block_entry.num_candidates_pending_signature() + ); + let tick_now = state.clock.tick_now(); + + let (candidates_to_sign, sign_no_later_then) = block_entry + .get_candidates_that_need_signature(tick_now, approval_params.max_approval_coalesce_count); + + let (candidates_hashes, candidates_indices) = match candidates_to_sign { + Some(candidates_to_sign) => candidates_to_sign, + None => return Ok(sign_no_later_then), + }; + + let session_info = match get_session_info( + session_info_provider, + ctx.sender(), + block_entry.parent_hash(), + block_entry.session(), + ) + .await + { + Some(s) => s, + None => { + metrics.on_approval_error(); + gum::error!( + target: LOG_TARGET, + "Could not retrieve the session" + ); + return Ok(None) + }, + }; + let validator_pubkey = match session_info.validators.get(validator_index) { Some(p) => p, None => { - gum::warn!( + gum::error!( target: LOG_TARGET, "Validator index {} out of bounds in session {}", validator_index.0, @@ -3024,72 +3458,89 @@ async fn issue_approval( ); metrics.on_approval_error(); - return Ok(Vec::new()) + return Ok(None) }, }; - let session = block_entry.session(); - let sig = match sign_approval(&state.keystore, &validator_pubkey, candidate_hash, session) { + let signature = match sign_approval( + &state.keystore, + &validator_pubkey, + &candidates_hashes, + block_entry.session(), + ) { Some(sig) => sig, None => { - gum::warn!( + gum::error!( target: LOG_TARGET, validator_index = ?validator_index, - session, + session = ?block_entry.session(), "Could not issue approval signature. Assignment key present but not validator key?", ); metrics.on_approval_error(); - return Ok(Vec::new()) + return Ok(None) }, }; + metrics.on_approval_coalesce(candidates_hashes.len() as u32); - gum::trace!( - target: LOG_TARGET, - ?candidate_hash, - ?block_hash, - validator_index = validator_index.0, - "Issuing approval vote", - ); + let candidate_entries = candidates_hashes + .iter() + .map(|candidate_hash| db.load_candidate_entry(candidate_hash)) + .collect::>>>()?; - let actions = advance_approval_state( - ctx.sender(), - state, - db, - session_info_provider, - metrics, - block_entry, - candidate_hash, - candidate_entry, - ApprovalStateTransition::LocalApproval(validator_index as _, sig.clone()), - ) - .await; + for mut candidate_entry in candidate_entries { + let approval_entry = candidate_entry.as_mut().and_then(|candidate_entry| { + candidate_entry.approval_entry_mut(&block_entry.block_hash()) + }); + + match approval_entry { + Some(approval_entry) => approval_entry.import_approval_sig(OurApproval { + signature: signature.clone(), + signed_candidates_indices: candidates_indices.clone(), + }), + None => { + gum::error!( + target: LOG_TARGET, + candidate_entry = ?candidate_entry, + "Candidate scheduled for signing approval entry should not be None" + ); + }, + }; + candidate_entry.map(|candidate_entry| db.write_candidate_entry(candidate_entry)); + } metrics.on_approval_produced(); - // dispatch to approval distribution. ctx.send_unbounded_message(ApprovalDistributionMessage::DistributeApproval( - IndirectSignedApprovalVote { - block_hash, - candidate_index: candidate_index as _, + IndirectSignedApprovalVoteV2 { + block_hash: block_entry.block_hash(), + candidate_indices: candidates_indices, validator: validator_index, - signature: sig, + signature, }, )); - Ok(actions) + gum::trace!( + target: LOG_TARGET, + ?block_hash, + signed_candidates = ?block_entry.num_candidates_pending_signature(), + "Issue approval votes", + ); + block_entry.issued_approval(); + db.write_block_entry(block_entry.into()); + Ok(None) } // Sign an approval vote. Fails if the key isn't present in the store. fn sign_approval( keystore: &LocalKeystore, public: &ValidatorId, - candidate_hash: CandidateHash, + candidate_hashes: &[CandidateHash], session_index: SessionIndex, ) -> Option { let key = keystore.key_pair::(public).ok().flatten()?; - let payload = ApprovalVote(candidate_hash).signing_payload(session_index); + let payload = ApprovalVoteMultipleCandidates(candidate_hashes).signing_payload(session_index); Some(key.sign(&payload[..])) } @@ -3119,3 +3570,38 @@ fn issue_local_invalid_statement( false, )); } + +// Computes what is the latest tick we can send an approval +fn compute_delayed_approval_sending_tick( + state: &State, + block_entry: &BlockEntry, + candidate_entry: &CandidateEntry, + session_info: &SessionInfo, + metrics: &Metrics, +) -> Tick { + let current_block_tick = slot_number_to_tick(state.slot_duration_millis, block_entry.slot()); + let assignment_tranche = candidate_entry + .approval_entry(&block_entry.block_hash()) + .and_then(|approval_entry| approval_entry.our_assignment()) + .map(|our_assignment| our_assignment.tranche()) + .unwrap_or_default(); + + let assignment_triggered_tick = current_block_tick + assignment_tranche as Tick; + + let no_show_duration_ticks = slot_number_to_tick( + state.slot_duration_millis, + Slot::from(u64::from(session_info.no_show_slots)), + ); + let tick_now = state.clock.tick_now(); + + let sign_no_later_than = min( + tick_now + MAX_APPROVAL_COALESCE_WAIT_TICKS as Tick, + // We don't want to accidentally cause no-shows, so if we are past + // the second half of the no show time, force the sending of the + // approval immediately. + assignment_triggered_tick + no_show_duration_ticks / 2, + ); + + metrics.on_delayed_approval(sign_no_later_than.checked_sub(tick_now).unwrap_or_default()); + sign_no_later_than +} diff --git a/polkadot/node/core/approval-voting/src/ops.rs b/polkadot/node/core/approval-voting/src/ops.rs index a6f0ecf9d1f..2a8fdba5aa3 100644 --- a/polkadot/node/core/approval-voting/src/ops.rs +++ b/polkadot/node/core/approval-voting/src/ops.rs @@ -25,7 +25,7 @@ use polkadot_primitives::{BlockNumber, CandidateHash, CandidateReceipt, GroupInd use std::collections::{hash_map::Entry, BTreeMap, HashMap}; use super::{ - approval_db::v2::{OurAssignment, StoredBlockRange}, + approval_db::{common::StoredBlockRange, v2::OurAssignment}, backend::{Backend, OverlayedBackend}, persisted_entries::{ApprovalEntry, BlockEntry, CandidateEntry}, LOG_TARGET, diff --git a/polkadot/node/core/approval-voting/src/persisted_entries.rs b/polkadot/node/core/approval-voting/src/persisted_entries.rs index 9cfe1c4cf8d..ef47bdb2213 100644 --- a/polkadot/node/core/approval-voting/src/persisted_entries.rs +++ b/polkadot/node/core/approval-voting/src/persisted_entries.rs @@ -20,13 +20,14 @@ //! Within that context, things are plain-old-data. Within this module, //! data and logic are intertwined. +use itertools::Itertools; use polkadot_node_primitives::approval::{ v1::{DelayTranche, RelayVRFStory}, v2::{AssignmentCertV2, CandidateBitfield}, }; use polkadot_primitives::{ - BlockNumber, CandidateHash, CandidateReceipt, CoreIndex, GroupIndex, Hash, SessionIndex, - ValidatorIndex, ValidatorSignature, + BlockNumber, CandidateHash, CandidateIndex, CandidateReceipt, CoreIndex, GroupIndex, Hash, + SessionIndex, ValidatorIndex, ValidatorSignature, }; use sp_consensus_slots::Slot; @@ -76,6 +77,45 @@ impl From for crate::approval_db::v2::TrancheEntry { } } +impl From for OurApproval { + fn from(approval: crate::approval_db::v3::OurApproval) -> Self { + Self { + signature: approval.signature, + signed_candidates_indices: approval.signed_candidates_indices, + } + } +} +impl From for crate::approval_db::v3::OurApproval { + fn from(approval: OurApproval) -> Self { + Self { + signature: approval.signature, + signed_candidates_indices: approval.signed_candidates_indices, + } + } +} + +/// Metadata about our approval signature +#[derive(Debug, Clone, PartialEq)] +pub struct OurApproval { + /// The signature for the candidates hashes pointed by indices. + pub signature: ValidatorSignature, + /// The indices of the candidates signed in this approval. + pub signed_candidates_indices: CandidateBitfield, +} + +impl OurApproval { + /// Converts a ValidatorSignature to an OurApproval. + /// It used in converting the database from v1 to latest. + pub fn from_v1(value: ValidatorSignature, candidate_index: CandidateIndex) -> Self { + Self { signature: value, signed_candidates_indices: candidate_index.into() } + } + + /// Converts a ValidatorSignature to an OurApproval. + /// It used in converting the database from v2 to latest. + pub fn from_v2(value: ValidatorSignature, candidate_index: CandidateIndex) -> Self { + Self::from_v1(value, candidate_index) + } +} /// Metadata regarding approval of a particular candidate within the context of some /// particular block. #[derive(Debug, Clone, PartialEq)] @@ -83,7 +123,7 @@ pub struct ApprovalEntry { tranches: Vec, backing_group: GroupIndex, our_assignment: Option, - our_approval_sig: Option, + our_approval_sig: Option, // `n_validators` bits. assigned_validators: Bitfield, approved: bool, @@ -95,7 +135,7 @@ impl ApprovalEntry { tranches: Vec, backing_group: GroupIndex, our_assignment: Option, - our_approval_sig: Option, + our_approval_sig: Option, // `n_validators` bits. assigned_validators: Bitfield, approved: bool, @@ -137,7 +177,7 @@ impl ApprovalEntry { } /// Import our local approval vote signature for this candidate. - pub fn import_approval_sig(&mut self, approval_sig: ValidatorSignature) { + pub fn import_approval_sig(&mut self, approval_sig: OurApproval) { self.our_approval_sig = Some(approval_sig); } @@ -224,7 +264,7 @@ impl ApprovalEntry { /// Get the assignment cert & approval signature. /// /// The approval signature will only be `Some` if the assignment is too. - pub fn local_statements(&self) -> (Option, Option) { + pub fn local_statements(&self) -> (Option, Option) { let approval_sig = self.our_approval_sig.clone(); if let Some(our_assignment) = self.our_assignment.as_ref().filter(|a| a.triggered()) { (Some(our_assignment.clone()), approval_sig) @@ -232,10 +272,44 @@ impl ApprovalEntry { (None, None) } } + + // Convert an ApprovalEntry from v1 version to latest version + pub fn from_v1( + value: crate::approval_db::v1::ApprovalEntry, + candidate_index: CandidateIndex, + ) -> Self { + ApprovalEntry { + tranches: value.tranches.into_iter().map(|tranche| tranche.into()).collect(), + backing_group: value.backing_group, + our_assignment: value.our_assignment.map(|assignment| assignment.into()), + our_approval_sig: value + .our_approval_sig + .map(|sig| OurApproval::from_v1(sig, candidate_index)), + assigned_validators: value.assignments, + approved: value.approved, + } + } + + // Convert an ApprovalEntry from v1 version to latest version + pub fn from_v2( + value: crate::approval_db::v2::ApprovalEntry, + candidate_index: CandidateIndex, + ) -> Self { + ApprovalEntry { + tranches: value.tranches.into_iter().map(|tranche| tranche.into()).collect(), + backing_group: value.backing_group, + our_assignment: value.our_assignment.map(|assignment| assignment.into()), + our_approval_sig: value + .our_approval_sig + .map(|sig| OurApproval::from_v2(sig, candidate_index)), + assigned_validators: value.assigned_validators, + approved: value.approved, + } + } } -impl From for ApprovalEntry { - fn from(entry: crate::approval_db::v2::ApprovalEntry) -> Self { +impl From for ApprovalEntry { + fn from(entry: crate::approval_db::v3::ApprovalEntry) -> Self { ApprovalEntry { tranches: entry.tranches.into_iter().map(Into::into).collect(), backing_group: entry.backing_group, @@ -247,7 +321,7 @@ impl From for ApprovalEntry { } } -impl From for crate::approval_db::v2::ApprovalEntry { +impl From for crate::approval_db::v3::ApprovalEntry { fn from(entry: ApprovalEntry) -> Self { Self { tranches: entry.tranches.into_iter().map(Into::into).collect(), @@ -303,10 +377,44 @@ impl CandidateEntry { pub fn approval_entry(&self, block_hash: &Hash) -> Option<&ApprovalEntry> { self.block_assignments.get(block_hash) } + + /// Convert a CandidateEntry from a v1 to its latest equivalent. + pub fn from_v1( + value: crate::approval_db::v1::CandidateEntry, + candidate_index: CandidateIndex, + ) -> Self { + Self { + approvals: value.approvals, + block_assignments: value + .block_assignments + .into_iter() + .map(|(h, ae)| (h, ApprovalEntry::from_v1(ae, candidate_index))) + .collect(), + candidate: value.candidate, + session: value.session, + } + } + + /// Convert a CandidateEntry from a v2 to its latest equivalent. + pub fn from_v2( + value: crate::approval_db::v2::CandidateEntry, + candidate_index: CandidateIndex, + ) -> Self { + Self { + approvals: value.approvals, + block_assignments: value + .block_assignments + .into_iter() + .map(|(h, ae)| (h, ApprovalEntry::from_v2(ae, candidate_index))) + .collect(), + candidate: value.candidate, + session: value.session, + } + } } -impl From for CandidateEntry { - fn from(entry: crate::approval_db::v2::CandidateEntry) -> Self { +impl From for CandidateEntry { + fn from(entry: crate::approval_db::v3::CandidateEntry) -> Self { CandidateEntry { candidate: entry.candidate, session: entry.session, @@ -320,7 +428,7 @@ impl From for CandidateEntry { } } -impl From for crate::approval_db::v2::CandidateEntry { +impl From for crate::approval_db::v3::CandidateEntry { fn from(entry: CandidateEntry) -> Self { Self { candidate: entry.candidate, @@ -353,12 +461,21 @@ pub struct BlockEntry { // block. The block can be considered approved if the bitfield has all bits set to `true`. pub approved_bitfield: Bitfield, pub children: Vec, + // A list of candidates we have checked, but didn't not sign and + // advertise the vote yet. + candidates_pending_signature: BTreeMap, // A list of assignments for which we already distributed the assignment. // We use this to ensure we don't distribute multiple core assignments twice as we track // individual wakeups for each core. distributed_assignments: Bitfield, } +#[derive(Debug, Clone, PartialEq)] +pub struct CandidateSigningContext { + pub candidate_hash: CandidateHash, + pub sign_no_later_than_tick: Tick, +} + impl BlockEntry { /// Mark a candidate as fully approved in the bitfield. pub fn mark_approved_by_hash(&mut self, candidate_hash: &CandidateHash) { @@ -447,10 +564,97 @@ impl BlockEntry { distributed } + + /// Defer signing and issuing an approval for a candidate no later than the specified tick + pub fn defer_candidate_signature( + &mut self, + candidate_index: CandidateIndex, + candidate_hash: CandidateHash, + sign_no_later_than_tick: Tick, + ) -> Option { + self.candidates_pending_signature.insert( + candidate_index, + CandidateSigningContext { candidate_hash, sign_no_later_than_tick }, + ) + } + + /// Returns the number of candidates waiting for an approval to be issued. + pub fn num_candidates_pending_signature(&self) -> usize { + self.candidates_pending_signature.len() + } + + /// Return if we have candidates waiting for signature to be issued + pub fn has_candidates_pending_signature(&self) -> bool { + !self.candidates_pending_signature.is_empty() + } + + /// Candidate hashes for candidates pending signatures + fn candidate_hashes_pending_signature(&self) -> Vec { + self.candidates_pending_signature + .values() + .map(|unsigned_approval| unsigned_approval.candidate_hash) + .collect() + } + + /// Candidate indices for candidates pending signature + fn candidate_indices_pending_signature(&self) -> Option { + self.candidates_pending_signature + .keys() + .map(|val| *val) + .collect_vec() + .try_into() + .ok() + } + + /// Returns a list of candidates hashes that need need signature created at the current tick: + /// This might happen in other of the two reasons: + /// 1. We queued more than max_approval_coalesce_count candidates. + /// 2. We have candidates that waiting in the queue past their `sign_no_later_than_tick` + /// + /// Additionally, we also return the first tick when we will have to create a signature, + /// so that the caller can arm the timer if it is not already armed. + pub fn get_candidates_that_need_signature( + &self, + tick_now: Tick, + max_approval_coalesce_count: u32, + ) -> (Option<(Vec, CandidateBitfield)>, Option) { + let sign_no_later_than_tick = self + .candidates_pending_signature + .values() + .min_by(|a, b| a.sign_no_later_than_tick.cmp(&b.sign_no_later_than_tick)) + .map(|val| val.sign_no_later_than_tick); + + if let Some(sign_no_later_than_tick) = sign_no_later_than_tick { + if sign_no_later_than_tick <= tick_now || + self.num_candidates_pending_signature() >= max_approval_coalesce_count as usize + { + ( + self.candidate_indices_pending_signature().and_then(|candidate_indices| { + Some((self.candidate_hashes_pending_signature(), candidate_indices)) + }), + Some(sign_no_later_than_tick), + ) + } else { + // We can still wait for other candidates to queue in, so just make sure + // we wake up at the tick we have to sign the longest waiting candidate. + (Default::default(), Some(sign_no_later_than_tick)) + } + } else { + // No cached candidates, nothing to do here, this just means the timer fired, + // but the signatures were already sent because we gathered more than + // max_approval_coalesce_count. + (Default::default(), sign_no_later_than_tick) + } + } + + /// Clears the candidates pending signature because the approval was issued. + pub fn issued_approval(&mut self) { + self.candidates_pending_signature.clear(); + } } -impl From for BlockEntry { - fn from(entry: crate::approval_db::v2::BlockEntry) -> Self { +impl From for BlockEntry { + fn from(entry: crate::approval_db::v3::BlockEntry) -> Self { BlockEntry { block_hash: entry.block_hash, parent_hash: entry.parent_hash, @@ -461,6 +665,11 @@ impl From for BlockEntry { candidates: entry.candidates, approved_bitfield: entry.approved_bitfield, children: entry.children, + candidates_pending_signature: entry + .candidates_pending_signature + .into_iter() + .map(|(candidate_index, signing_context)| (candidate_index, signing_context.into())) + .collect(), distributed_assignments: entry.distributed_assignments, } } @@ -479,11 +688,30 @@ impl From for BlockEntry { approved_bitfield: entry.approved_bitfield, children: entry.children, distributed_assignments: Default::default(), + candidates_pending_signature: Default::default(), } } } -impl From for crate::approval_db::v2::BlockEntry { +impl From for BlockEntry { + fn from(entry: crate::approval_db::v2::BlockEntry) -> Self { + BlockEntry { + block_hash: entry.block_hash, + parent_hash: entry.parent_hash, + block_number: entry.block_number, + session: entry.session, + slot: entry.slot, + relay_vrf_story: RelayVRFStory(entry.relay_vrf_story), + candidates: entry.candidates, + approved_bitfield: entry.approved_bitfield, + children: entry.children, + distributed_assignments: entry.distributed_assignments, + candidates_pending_signature: Default::default(), + } + } +} + +impl From for crate::approval_db::v3::BlockEntry { fn from(entry: BlockEntry) -> Self { Self { block_hash: entry.block_hash, @@ -495,36 +723,30 @@ impl From for crate::approval_db::v2::BlockEntry { candidates: entry.candidates, approved_bitfield: entry.approved_bitfield, children: entry.children, + candidates_pending_signature: entry + .candidates_pending_signature + .into_iter() + .map(|(candidate_index, signing_context)| (candidate_index, signing_context.into())) + .collect(), distributed_assignments: entry.distributed_assignments, } } } -/// Migration helpers. -impl From for CandidateEntry { - fn from(value: crate::approval_db::v1::CandidateEntry) -> Self { +impl From for CandidateSigningContext { + fn from(signing_context: crate::approval_db::v3::CandidateSigningContext) -> Self { Self { - approvals: value.approvals, - block_assignments: value - .block_assignments - .into_iter() - .map(|(h, ae)| (h, ae.into())) - .collect(), - candidate: value.candidate, - session: value.session, + candidate_hash: signing_context.candidate_hash, + sign_no_later_than_tick: signing_context.sign_no_later_than_tick.into(), } } } -impl From for ApprovalEntry { - fn from(value: crate::approval_db::v1::ApprovalEntry) -> Self { - ApprovalEntry { - tranches: value.tranches.into_iter().map(|tranche| tranche.into()).collect(), - backing_group: value.backing_group, - our_assignment: value.our_assignment.map(|assignment| assignment.into()), - our_approval_sig: value.our_approval_sig, - assigned_validators: value.assignments, - approved: value.approved, +impl From for crate::approval_db::v3::CandidateSigningContext { + fn from(signing_context: CandidateSigningContext) -> Self { + Self { + candidate_hash: signing_context.candidate_hash, + sign_no_later_than_tick: signing_context.sign_no_later_than_tick.into(), } } } diff --git a/polkadot/node/core/approval-voting/src/tests.rs b/polkadot/node/core/approval-voting/src/tests.rs index cdfc170cd2b..498cf62bb30 100644 --- a/polkadot/node/core/approval-voting/src/tests.rs +++ b/polkadot/node/core/approval-voting/src/tests.rs @@ -37,8 +37,8 @@ use polkadot_node_subsystem_test_helpers as test_helpers; use polkadot_node_subsystem_util::TimeoutExt; use polkadot_overseer::HeadSupportsParachains; use polkadot_primitives::{ - vstaging::NodeFeatures, CandidateCommitments, CandidateEvent, CoreIndex, GroupIndex, Header, - Id as ParaId, IndexedVec, ValidationCode, ValidatorSignature, + vstaging::NodeFeatures, ApprovalVote, CandidateCommitments, CandidateEvent, CoreIndex, + GroupIndex, Header, Id as ParaId, IndexedVec, ValidationCode, ValidatorSignature, }; use std::time::Duration; @@ -56,7 +56,7 @@ use std::{ }; use super::{ - approval_db::v2::StoredBlockRange, + approval_db::common::StoredBlockRange, backend::BackendWriteOp, import::tests::{ garbage_vrf_signature, AllowedSlots, BabeEpoch, BabeEpochConfiguration, @@ -116,7 +116,7 @@ fn make_sync_oracle(val: bool) -> (Box, TestSyncOracleHan #[cfg(test)] pub mod test_constants { - use crate::approval_db::v2::Config as DatabaseConfig; + use crate::approval_db::common::Config as DatabaseConfig; const DATA_COL: u32 = 0; pub(crate) const NUM_COLUMNS: u32 = 1; @@ -281,6 +281,7 @@ impl V1ReadBackend for TestStoreInner { fn load_candidate_entry_v1( &self, candidate_hash: &CandidateHash, + _candidate_index: CandidateIndex, ) -> SubsystemResult> { self.load_candidate_entry(candidate_hash) } @@ -364,6 +365,7 @@ impl V1ReadBackend for TestStore { fn load_candidate_entry_v1( &self, candidate_hash: &CandidateHash, + _candidate_index: CandidateIndex, ) -> SubsystemResult> { self.load_candidate_entry(candidate_hash) } @@ -446,6 +448,15 @@ fn sign_approval( key.sign(&ApprovalVote(candidate_hash).signing_payload(session_index)).into() } +fn sign_approval_multiple_candidates( + key: Sr25519Keyring, + candidate_hashes: Vec, + session_index: SessionIndex, +) -> ValidatorSignature { + key.sign(&ApprovalVoteMultipleCandidates(&candidate_hashes).signing_payload(session_index)) + .into() +} + type VirtualOverseer = test_helpers::TestSubsystemContextHandle; #[derive(Default)] @@ -641,7 +652,12 @@ async fn check_and_import_approval( overseer, FromOrchestra::Communication { msg: ApprovalVotingMessage::CheckAndImportApproval( - IndirectSignedApprovalVote { block_hash, candidate_index, validator, signature }, + IndirectSignedApprovalVoteV2 { + block_hash, + candidate_indices: candidate_index.into(), + validator, + signature, + }, tx, ), }, @@ -2014,6 +2030,91 @@ fn forkful_import_at_same_height_act_on_leaf() { }); } +#[test] +fn test_signing_a_single_candidate_is_backwards_compatible() { + let session_index = 1; + let block_hash = Hash::repeat_byte(0x01); + let candidate_descriptors = (1..10) + .into_iter() + .map(|val| make_candidate(ParaId::from(val as u32), &block_hash)) + .collect::>(); + + let candidate_hashes = candidate_descriptors + .iter() + .map(|candidate_descriptor| candidate_descriptor.hash()) + .collect_vec(); + + let first_descriptor = candidate_descriptors.first().unwrap(); + + let candidate_hash = first_descriptor.hash(); + + let sig_a = sign_approval(Sr25519Keyring::Alice, candidate_hash, session_index); + + let sig_b = sign_approval(Sr25519Keyring::Alice, candidate_hash, session_index); + + assert!(DisputeStatement::Valid(ValidDisputeStatementKind::ApprovalChecking) + .check_signature( + &Sr25519Keyring::Alice.public().into(), + candidate_hash, + session_index, + &sig_a, + ) + .is_ok()); + + assert!(DisputeStatement::Valid(ValidDisputeStatementKind::ApprovalChecking) + .check_signature( + &Sr25519Keyring::Alice.public().into(), + candidate_hash, + session_index, + &sig_b, + ) + .is_ok()); + + let sig_c = sign_approval_multiple_candidates( + Sr25519Keyring::Alice, + vec![candidate_hash], + session_index, + ); + + assert!(DisputeStatement::Valid( + ValidDisputeStatementKind::ApprovalCheckingMultipleCandidates(vec![candidate_hash]) + ) + .check_signature(&Sr25519Keyring::Alice.public().into(), candidate_hash, session_index, &sig_c,) + .is_ok()); + + assert!(DisputeStatement::Valid(ValidDisputeStatementKind::ApprovalChecking) + .check_signature( + &Sr25519Keyring::Alice.public().into(), + candidate_hash, + session_index, + &sig_c, + ) + .is_ok()); + + assert!(DisputeStatement::Valid( + ValidDisputeStatementKind::ApprovalCheckingMultipleCandidates(vec![candidate_hash]) + ) + .check_signature(&Sr25519Keyring::Alice.public().into(), candidate_hash, session_index, &sig_a,) + .is_ok()); + + let sig_all = sign_approval_multiple_candidates( + Sr25519Keyring::Alice, + candidate_hashes.clone(), + session_index, + ); + + assert!(DisputeStatement::Valid( + ValidDisputeStatementKind::ApprovalCheckingMultipleCandidates(candidate_hashes.clone()) + ) + .check_signature( + &Sr25519Keyring::Alice.public().into(), + *candidate_hashes.first().expect("test"), + session_index, + &sig_all, + ) + .is_ok()); +} + #[test] fn import_checked_approval_updates_entries_and_schedules() { let config = HarnessConfig::default(); @@ -2730,11 +2831,29 @@ async fn handle_double_assignment_import( } ); + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request(_, RuntimeApiRequest::ApprovalVotingParams(_, sender))) => { + let _ = sender.send(Ok(ApprovalVotingParams { + max_approval_coalesce_count: 1, + })); + } + ); + assert_matches!( overseer_recv(virtual_overseer).await, AllMessages::ApprovalDistribution(ApprovalDistributionMessage::DistributeApproval(_)) ); + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request(_, RuntimeApiRequest::ApprovalVotingParams(_, sender))) => { + let _ = sender.send(Ok(ApprovalVotingParams { + max_approval_coalesce_count: 1, + })); + } + ); + assert_matches!( overseer_recv(virtual_overseer).await, AllMessages::ApprovalDistribution(ApprovalDistributionMessage::DistributeApproval(_)) @@ -3469,3 +3588,455 @@ fn waits_until_approving_assignments_are_old_enough() { virtual_overseer }); } + +#[test] +fn test_approval_is_sent_on_max_approval_coalesce_count() { + let assignment_criteria = Box::new(MockAssignmentCriteria( + || { + let mut assignments = HashMap::new(); + let _ = assignments.insert( + CoreIndex(0), + approval_db::v2::OurAssignment { + cert: garbage_assignment_cert(AssignmentCertKind::RelayVRFModulo { sample: 0 }) + .into(), + tranche: 0, + validator_index: ValidatorIndex(0), + triggered: false, + } + .into(), + ); + + let assignments_cert = + garbage_assignment_cert_v2(AssignmentCertKindV2::RelayVRFModuloCompact { + core_bitfield: vec![CoreIndex(0), CoreIndex(1), CoreIndex(2)] + .try_into() + .unwrap(), + }); + let _ = assignments.insert( + CoreIndex(0), + approval_db::v2::OurAssignment { + cert: assignments_cert.clone(), + tranche: 0, + validator_index: ValidatorIndex(0), + triggered: false, + } + .into(), + ); + + let _ = assignments.insert( + CoreIndex(1), + approval_db::v2::OurAssignment { + cert: assignments_cert.clone(), + tranche: 0, + validator_index: ValidatorIndex(0), + triggered: false, + } + .into(), + ); + assignments + }, + |_| Ok(0), + )); + + let config = HarnessConfigBuilder::default().assignment_criteria(assignment_criteria).build(); + let store = config.backend(); + + test_harness(config, |test_harness| async move { + let TestHarness { mut virtual_overseer, clock, sync_oracle_handle: _sync_oracle_handle } = + test_harness; + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::ChainApi(ChainApiMessage::FinalizedBlockNumber(rx)) => { + rx.send(Ok(0)).unwrap(); + } + ); + + let block_hash = Hash::repeat_byte(0x01); + + let candidate_commitments = CandidateCommitments::default(); + + let candidate_receipt1 = { + let mut receipt = dummy_candidate_receipt(block_hash); + receipt.descriptor.para_id = ParaId::from(1_u32); + receipt.commitments_hash = candidate_commitments.hash(); + receipt + }; + + let candidate_hash1 = candidate_receipt1.hash(); + + let candidate_receipt2 = { + let mut receipt = dummy_candidate_receipt(block_hash); + receipt.descriptor.para_id = ParaId::from(2_u32); + receipt.commitments_hash = candidate_commitments.hash(); + receipt + }; + + let slot = Slot::from(1); + let candidate_index1 = 0; + let candidate_index2 = 1; + + let validators = vec![ + Sr25519Keyring::Alice, + Sr25519Keyring::Bob, + Sr25519Keyring::Charlie, + Sr25519Keyring::Dave, + Sr25519Keyring::Eve, + ]; + let session_info = SessionInfo { + validator_groups: IndexedVec::>::from(vec![ + vec![ValidatorIndex(0), ValidatorIndex(1)], + vec![ValidatorIndex(2)], + vec![ValidatorIndex(3), ValidatorIndex(4)], + ]), + ..session_info(&validators) + }; + + let candidates = Some(vec![ + (candidate_receipt1.clone(), CoreIndex(0), GroupIndex(0)), + (candidate_receipt2.clone(), CoreIndex(1), GroupIndex(1)), + ]); + ChainBuilder::new() + .add_block( + block_hash, + ChainBuilder::GENESIS_HASH, + 1, + BlockConfig { + slot, + candidates: candidates.clone(), + session_info: Some(session_info.clone()), + }, + ) + .build(&mut virtual_overseer) + .await; + + assert!(!clock.inner.lock().current_wakeup_is(1)); + clock.inner.lock().wakeup_all(1); + + assert!(clock.inner.lock().current_wakeup_is(slot_to_tick(slot))); + clock.inner.lock().wakeup_all(slot_to_tick(slot)); + + futures_timer::Delay::new(Duration::from_millis(200)).await; + + clock.inner.lock().wakeup_all(slot_to_tick(slot + 2)); + + assert_eq!(clock.inner.lock().wakeups.len(), 0); + + futures_timer::Delay::new(Duration::from_millis(200)).await; + + let candidate_entry = store.load_candidate_entry(&candidate_hash1).unwrap().unwrap(); + let our_assignment = + candidate_entry.approval_entry(&block_hash).unwrap().our_assignment().unwrap(); + assert!(our_assignment.triggered()); + + handle_approval_on_max_coalesce_count( + &mut virtual_overseer, + vec![candidate_index1, candidate_index2], + ) + .await; + + virtual_overseer + }); +} + +async fn handle_approval_on_max_coalesce_count( + virtual_overseer: &mut VirtualOverseer, + candidate_indicies: Vec, +) { + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::ApprovalDistribution(ApprovalDistributionMessage::DistributeAssignment( + _, + c_indices, + )) => { + assert_eq!(TryInto::::try_into(candidate_indicies.clone()).unwrap(), c_indices); + } + ); + + for _ in &candidate_indicies { + recover_available_data(virtual_overseer).await; + fetch_validation_code(virtual_overseer).await; + } + + for _ in &candidate_indicies { + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::CandidateValidation(CandidateValidationMessage::ValidateFromExhaustive{exec_kind, response_sender, ..}) if exec_kind == PvfExecKind::Approval => { + response_sender.send(Ok(ValidationResult::Valid(Default::default(), Default::default()))) + .unwrap(); + } + ); + } + + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request(_, RuntimeApiRequest::ApprovalVotingParams(_, sender))) => { + let _ = sender.send(Ok(ApprovalVotingParams { + max_approval_coalesce_count: 2, + })); + } + ); + + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request(_, RuntimeApiRequest::ApprovalVotingParams(_, sender))) => { + let _ = sender.send(Ok(ApprovalVotingParams { + max_approval_coalesce_count: 2, + })); + } + ); + + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::ApprovalDistribution(ApprovalDistributionMessage::DistributeApproval(vote)) => { + assert_eq!(TryInto::::try_into(candidate_indicies).unwrap(), vote.candidate_indices); + } + ); + + // Assert that there are no more messages being sent by the subsystem + assert!(overseer_recv(virtual_overseer).timeout(TIMEOUT / 2).await.is_none()); +} + +async fn handle_approval_on_max_wait_time( + virtual_overseer: &mut VirtualOverseer, + candidate_indicies: Vec, + clock: Box, +) { + const TICK_NOW_BEGIN: u64 = 1; + const MAX_COALESCE_COUNT: u32 = 3; + + clock.inner.lock().set_tick(TICK_NOW_BEGIN); + + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::ApprovalDistribution(ApprovalDistributionMessage::DistributeAssignment( + _, + c_indices, + )) => { + assert_eq!(TryInto::::try_into(candidate_indicies.clone()).unwrap(), c_indices); + } + ); + + for _ in &candidate_indicies { + recover_available_data(virtual_overseer).await; + fetch_validation_code(virtual_overseer).await; + } + + for _ in &candidate_indicies { + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::CandidateValidation(CandidateValidationMessage::ValidateFromExhaustive{exec_kind, response_sender, ..}) if exec_kind == PvfExecKind::Approval => { + response_sender.send(Ok(ValidationResult::Valid(Default::default(), Default::default()))) + .unwrap(); + } + ); + } + + // First time we fetch the configuration when we are ready to approve the first candidate + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request(_, RuntimeApiRequest::ApprovalVotingParams(_, sender))) => { + let _ = sender.send(Ok(ApprovalVotingParams { + max_approval_coalesce_count: MAX_COALESCE_COUNT, + })); + } + ); + + // Second time we fetch the configuration when we are ready to approve the second candidate + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request(_, RuntimeApiRequest::ApprovalVotingParams(_, sender))) => { + let _ = sender.send(Ok(ApprovalVotingParams { + max_approval_coalesce_count: MAX_COALESCE_COUNT, + })); + } + ); + + assert!(overseer_recv(virtual_overseer).timeout(TIMEOUT / 2).await.is_none()); + + // Move the clock just before we should send the approval + clock + .inner + .lock() + .set_tick(MAX_APPROVAL_COALESCE_WAIT_TICKS as Tick + TICK_NOW_BEGIN - 1); + + assert!(overseer_recv(virtual_overseer).timeout(TIMEOUT / 2).await.is_none()); + + // Move the clock tick, so we can trigger a force sending of the approvals + clock + .inner + .lock() + .set_tick(MAX_APPROVAL_COALESCE_WAIT_TICKS as Tick + TICK_NOW_BEGIN); + + // Third time we fetch the configuration when timer expires and we are ready to sent the + // approval + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request(_, RuntimeApiRequest::ApprovalVotingParams(_, sender))) => { + let _ = sender.send(Ok(ApprovalVotingParams { + max_approval_coalesce_count: 3, + })); + } + ); + + assert_matches!( + overseer_recv(virtual_overseer).await, + AllMessages::ApprovalDistribution(ApprovalDistributionMessage::DistributeApproval(vote)) => { + assert_eq!(TryInto::::try_into(candidate_indicies).unwrap(), vote.candidate_indices); + } + ); + + // Assert that there are no more messages being sent by the subsystem + assert!(overseer_recv(virtual_overseer).timeout(TIMEOUT / 2).await.is_none()); +} + +#[test] +fn test_approval_is_sent_on_max_approval_coalesce_wait() { + let assignment_criteria = Box::new(MockAssignmentCriteria( + || { + let mut assignments = HashMap::new(); + let _ = assignments.insert( + CoreIndex(0), + approval_db::v2::OurAssignment { + cert: garbage_assignment_cert(AssignmentCertKind::RelayVRFModulo { sample: 0 }) + .into(), + tranche: 0, + validator_index: ValidatorIndex(0), + triggered: false, + } + .into(), + ); + + let assignments_cert = + garbage_assignment_cert_v2(AssignmentCertKindV2::RelayVRFModuloCompact { + core_bitfield: vec![CoreIndex(0), CoreIndex(1), CoreIndex(2)] + .try_into() + .unwrap(), + }); + let _ = assignments.insert( + CoreIndex(0), + approval_db::v2::OurAssignment { + cert: assignments_cert.clone(), + tranche: 0, + validator_index: ValidatorIndex(0), + triggered: false, + } + .into(), + ); + + let _ = assignments.insert( + CoreIndex(1), + approval_db::v2::OurAssignment { + cert: assignments_cert.clone(), + tranche: 0, + validator_index: ValidatorIndex(0), + triggered: false, + } + .into(), + ); + assignments + }, + |_| Ok(0), + )); + + let config = HarnessConfigBuilder::default().assignment_criteria(assignment_criteria).build(); + let store = config.backend(); + + test_harness(config, |test_harness| async move { + let TestHarness { mut virtual_overseer, clock, sync_oracle_handle: _sync_oracle_handle } = + test_harness; + + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::ChainApi(ChainApiMessage::FinalizedBlockNumber(rx)) => { + rx.send(Ok(0)).unwrap(); + } + ); + + let block_hash = Hash::repeat_byte(0x01); + + let candidate_commitments = CandidateCommitments::default(); + + let candidate_receipt1 = { + let mut receipt = dummy_candidate_receipt(block_hash); + receipt.descriptor.para_id = ParaId::from(1_u32); + receipt.commitments_hash = candidate_commitments.hash(); + receipt + }; + + let candidate_hash1 = candidate_receipt1.hash(); + + let candidate_receipt2 = { + let mut receipt = dummy_candidate_receipt(block_hash); + receipt.descriptor.para_id = ParaId::from(2_u32); + receipt.commitments_hash = candidate_commitments.hash(); + receipt + }; + + let slot = Slot::from(1); + let candidate_index1 = 0; + let candidate_index2 = 1; + + let validators = vec![ + Sr25519Keyring::Alice, + Sr25519Keyring::Bob, + Sr25519Keyring::Charlie, + Sr25519Keyring::Dave, + Sr25519Keyring::Eve, + ]; + let session_info = SessionInfo { + validator_groups: IndexedVec::>::from(vec![ + vec![ValidatorIndex(0), ValidatorIndex(1)], + vec![ValidatorIndex(2)], + vec![ValidatorIndex(3), ValidatorIndex(4)], + ]), + ..session_info(&validators) + }; + + let candidates = Some(vec![ + (candidate_receipt1.clone(), CoreIndex(0), GroupIndex(0)), + (candidate_receipt2.clone(), CoreIndex(1), GroupIndex(1)), + ]); + ChainBuilder::new() + .add_block( + block_hash, + ChainBuilder::GENESIS_HASH, + 1, + BlockConfig { + slot, + candidates: candidates.clone(), + session_info: Some(session_info.clone()), + }, + ) + .build(&mut virtual_overseer) + .await; + + assert!(!clock.inner.lock().current_wakeup_is(1)); + clock.inner.lock().wakeup_all(1); + + assert!(clock.inner.lock().current_wakeup_is(slot_to_tick(slot))); + clock.inner.lock().wakeup_all(slot_to_tick(slot)); + + futures_timer::Delay::new(Duration::from_millis(200)).await; + + clock.inner.lock().wakeup_all(slot_to_tick(slot + 2)); + + assert_eq!(clock.inner.lock().wakeups.len(), 0); + + futures_timer::Delay::new(Duration::from_millis(200)).await; + + let candidate_entry = store.load_candidate_entry(&candidate_hash1).unwrap().unwrap(); + let our_assignment = + candidate_entry.approval_entry(&block_hash).unwrap().our_assignment().unwrap(); + assert!(our_assignment.triggered()); + + handle_approval_on_max_wait_time( + &mut virtual_overseer, + vec![candidate_index1, candidate_index2], + clock, + ) + .await; + + virtual_overseer + }); +} diff --git a/polkadot/node/core/approval-voting/src/time.rs b/polkadot/node/core/approval-voting/src/time.rs index a45866402c8..61091f3c34c 100644 --- a/polkadot/node/core/approval-voting/src/time.rs +++ b/polkadot/node/core/approval-voting/src/time.rs @@ -16,14 +16,23 @@ //! Time utilities for approval voting. -use futures::prelude::*; +use futures::{ + future::BoxFuture, + prelude::*, + stream::{FusedStream, FuturesUnordered}, + Stream, StreamExt, +}; + use polkadot_node_primitives::approval::v1::DelayTranche; use sp_consensus_slots::Slot; use std::{ + collections::HashSet, pin::Pin, + task::Poll, time::{Duration, SystemTime}, }; +use polkadot_primitives::{Hash, ValidatorIndex}; const TICK_DURATION_MILLIS: u64 = 500; /// A base unit of time, starting from the Unix epoch, split into half-second intervals. @@ -88,3 +97,157 @@ pub(crate) fn slot_number_to_tick(slot_duration_millis: u64, slot: Slot) -> Tick let ticks_per_slot = slot_duration_millis / TICK_DURATION_MILLIS; u64::from(slot) * ticks_per_slot } + +/// A list of delayed futures that gets triggered when the waiting time has expired and it is +/// time to sign the candidate. +/// We have a timer per relay-chain block. +#[derive(Default)] +pub struct DelayedApprovalTimer { + timers: FuturesUnordered>, + blocks: HashSet, +} + +impl DelayedApprovalTimer { + /// Starts a single timer per block hash + /// + /// Guarantees that if a timer already exits for the give block hash, + /// no additional timer is started. + pub(crate) fn maybe_arm_timer( + &mut self, + wait_untill: Tick, + clock: &dyn Clock, + block_hash: Hash, + validator_index: ValidatorIndex, + ) { + if self.blocks.insert(block_hash) { + let clock_wait = clock.wait(wait_untill); + self.timers.push(Box::pin(async move { + clock_wait.await; + (block_hash, validator_index) + })); + } + } +} + +impl Stream for DelayedApprovalTimer { + type Item = (Hash, ValidatorIndex); + + fn poll_next( + mut self: std::pin::Pin<&mut Self>, + cx: &mut std::task::Context<'_>, + ) -> std::task::Poll> { + let poll_result = self.timers.poll_next_unpin(cx); + match poll_result { + Poll::Ready(Some(result)) => { + self.blocks.remove(&result.0); + Poll::Ready(Some(result)) + }, + _ => poll_result, + } + } +} + +impl FusedStream for DelayedApprovalTimer { + fn is_terminated(&self) -> bool { + self.timers.is_terminated() + } +} + +#[cfg(test)] +mod tests { + use std::time::Duration; + + use futures::{executor::block_on, FutureExt, StreamExt}; + use futures_timer::Delay; + use polkadot_primitives::{Hash, ValidatorIndex}; + + use crate::time::{Clock, SystemClock}; + + use super::DelayedApprovalTimer; + + #[test] + fn test_select_empty_timer() { + block_on(async move { + let mut timer = DelayedApprovalTimer::default(); + + for _ in 1..10 { + let result = futures::select!( + _ = timer.select_next_some() => { + 0 + } + // Only this arm should fire + _ = Delay::new(Duration::from_millis(100)).fuse() => { + 1 + } + ); + + assert_eq!(result, 1); + } + }); + } + + #[test] + fn test_timer_functionality() { + block_on(async move { + let mut timer = DelayedApprovalTimer::default(); + let test_hashes = + vec![Hash::repeat_byte(0x01), Hash::repeat_byte(0x02), Hash::repeat_byte(0x03)]; + for (index, hash) in test_hashes.iter().enumerate() { + timer.maybe_arm_timer( + SystemClock.tick_now() + index as u64, + &SystemClock, + *hash, + ValidatorIndex::from(2), + ); + timer.maybe_arm_timer( + SystemClock.tick_now() + index as u64, + &SystemClock, + *hash, + ValidatorIndex::from(2), + ); + } + let timeout_hash = Hash::repeat_byte(0x02); + for i in 0..test_hashes.len() * 2 { + let result = futures::select!( + (hash, _) = timer.select_next_some() => { + hash + } + // Timers should fire only once, so for the rest of the iterations we should timeout through here. + _ = Delay::new(Duration::from_secs(2)).fuse() => { + timeout_hash + } + ); + assert_eq!(test_hashes.get(i).cloned().unwrap_or(timeout_hash), result); + } + + // Now check timer can be restarted if already fired + for (index, hash) in test_hashes.iter().enumerate() { + timer.maybe_arm_timer( + SystemClock.tick_now() + index as u64, + &SystemClock, + *hash, + ValidatorIndex::from(2), + ); + timer.maybe_arm_timer( + SystemClock.tick_now() + index as u64, + &SystemClock, + *hash, + ValidatorIndex::from(2), + ); + } + + for i in 0..test_hashes.len() * 2 { + let result = futures::select!( + (hash, _) = timer.select_next_some() => { + hash + } + // Timers should fire only once, so for the rest of the iterations we should timeout through here. + _ = Delay::new(Duration::from_secs(2)).fuse() => { + timeout_hash + } + ); + assert_eq!(test_hashes.get(i).cloned().unwrap_or(timeout_hash), result); + } + }); + } +} diff --git a/polkadot/node/core/dispute-coordinator/src/import.rs b/polkadot/node/core/dispute-coordinator/src/import.rs index 837ad7856e7..98c12bd509b 100644 --- a/polkadot/node/core/dispute-coordinator/src/import.rs +++ b/polkadot/node/core/dispute-coordinator/src/import.rs @@ -34,9 +34,9 @@ use polkadot_node_primitives::{ use polkadot_node_subsystem::overseer; use polkadot_node_subsystem_util::runtime::RuntimeInfo; use polkadot_primitives::{ - CandidateReceipt, DisputeStatement, ExecutorParams, Hash, IndexedVec, SessionIndex, - SessionInfo, ValidDisputeStatementKind, ValidatorId, ValidatorIndex, ValidatorPair, - ValidatorSignature, + CandidateHash, CandidateReceipt, DisputeStatement, ExecutorParams, Hash, IndexedVec, + SessionIndex, SessionInfo, ValidDisputeStatementKind, ValidatorId, ValidatorIndex, + ValidatorPair, ValidatorSignature, }; use sc_keystore::LocalKeystore; @@ -126,7 +126,9 @@ impl OwnVoteState { let our_valid_votes = controlled_indices .iter() .filter_map(|i| votes.valid.raw().get_key_value(i)) - .map(|(index, (kind, sig))| (*index, (DisputeStatement::Valid(*kind), sig.clone()))); + .map(|(index, (kind, sig))| { + (*index, (DisputeStatement::Valid(kind.clone()), sig.clone())) + }); let our_invalid_votes = controlled_indices .iter() .filter_map(|i| votes.invalid.get_key_value(i)) @@ -305,7 +307,7 @@ impl CandidateVoteState { DisputeStatement::Valid(valid_kind) => { let fresh = votes.valid.insert_vote( val_index, - *valid_kind, + valid_kind.clone(), statement.into_validator_signature(), ); if fresh { @@ -511,7 +513,7 @@ impl ImportResult { pub fn import_approval_votes( self, env: &CandidateEnvironment, - approval_votes: HashMap, + approval_votes: HashMap, ValidatorSignature)>, now: Timestamp, ) -> Self { let Self { @@ -525,19 +527,33 @@ impl ImportResult { let (mut votes, _) = new_state.into_old_state(); - for (index, sig) in approval_votes.into_iter() { + for (index, (candidate_hashes, sig)) in approval_votes.into_iter() { debug_assert!( { let pub_key = &env.session_info().validators.get(index).expect("indices are validated by approval-voting subsystem; qed"); - let candidate_hash = votes.candidate_receipt.hash(); let session_index = env.session_index(); - DisputeStatement::Valid(ValidDisputeStatementKind::ApprovalChecking) - .check_signature(pub_key, candidate_hash, session_index, &sig) + candidate_hashes.contains(&votes.candidate_receipt.hash()) && DisputeStatement::Valid(ValidDisputeStatementKind::ApprovalCheckingMultipleCandidates(candidate_hashes.clone())) + .check_signature(pub_key, *candidate_hashes.first().expect("Valid votes have at least one candidate; qed"), session_index, &sig) .is_ok() }, "Signature check for imported approval votes failed! This is a serious bug. Session: {:?}, candidate hash: {:?}, validator index: {:?}", env.session_index(), votes.candidate_receipt.hash(), index ); - if votes.valid.insert_vote(index, ValidDisputeStatementKind::ApprovalChecking, sig) { + if votes.valid.insert_vote( + index, + // There is a hidden dependency here between approval-voting and this subsystem. + // We should be able to start emitting + // ValidDisputeStatementKind::ApprovalCheckingMultipleCandidates only after: + // 1. Runtime have been upgraded to know about the new format. + // 2. All nodes have been upgraded to know about the new format. + // Once those two requirements have been met we should be able to increase + // max_approval_coalesce_count to values greater than 1. + if candidate_hashes.len() > 1 { + ValidDisputeStatementKind::ApprovalCheckingMultipleCandidates(candidate_hashes) + } else { + ValidDisputeStatementKind::ApprovalChecking + }, + sig, + ) { imported_valid_votes += 1; imported_approval_votes += 1; } diff --git a/polkadot/node/core/dispute-coordinator/src/initialized.rs b/polkadot/node/core/dispute-coordinator/src/initialized.rs index e44530b3f1b..d9cd4e39d3c 100644 --- a/polkadot/node/core/dispute-coordinator/src/initialized.rs +++ b/polkadot/node/core/dispute-coordinator/src/initialized.rs @@ -642,7 +642,7 @@ impl Initialized { }; debug_assert!( SignedDisputeStatement::new_checked( - DisputeStatement::Valid(valid_statement_kind), + DisputeStatement::Valid(valid_statement_kind.clone()), candidate_hash, session, validator_public.clone(), @@ -656,7 +656,7 @@ impl Initialized { ); let signed_dispute_statement = SignedDisputeStatement::new_unchecked_from_trusted_source( - DisputeStatement::Valid(valid_statement_kind), + DisputeStatement::Valid(valid_statement_kind.clone()), candidate_hash, session, validator_public, diff --git a/polkadot/node/core/dispute-coordinator/src/lib.rs b/polkadot/node/core/dispute-coordinator/src/lib.rs index e96fee81240..5067d3673da 100644 --- a/polkadot/node/core/dispute-coordinator/src/lib.rs +++ b/polkadot/node/core/dispute-coordinator/src/lib.rs @@ -576,7 +576,7 @@ pub fn make_dispute_message( .next() .ok_or(DisputeMessageCreationError::NoOppositeVote)?; let other_vote = SignedDisputeStatement::new_checked( - DisputeStatement::Valid(*statement_kind), + DisputeStatement::Valid(statement_kind.clone()), *our_vote.candidate_hash(), our_vote.session_index(), validators diff --git a/polkadot/node/core/dispute-coordinator/src/tests.rs b/polkadot/node/core/dispute-coordinator/src/tests.rs index 6912bbf67e1..da449773fe8 100644 --- a/polkadot/node/core/dispute-coordinator/src/tests.rs +++ b/polkadot/node/core/dispute-coordinator/src/tests.rs @@ -661,7 +661,7 @@ fn make_candidate_included_event(candidate_receipt: CandidateReceipt) -> Candida pub async fn handle_approval_vote_request( ctx_handle: &mut VirtualOverseer, expected_hash: &CandidateHash, - votes_to_send: HashMap, + votes_to_send: HashMap, ValidatorSignature)>, ) { assert_matches!( ctx_handle.recv().await, @@ -868,9 +868,12 @@ fn approval_vote_import_works() { .await; gum::trace!("After sending `ImportStatements`"); - let approval_votes = [(ValidatorIndex(4), approval_vote.into_validator_signature())] - .into_iter() - .collect(); + let approval_votes = [( + ValidatorIndex(4), + (vec![candidate_receipt1.hash()], approval_vote.into_validator_signature()), + )] + .into_iter() + .collect(); handle_approval_vote_request(&mut virtual_overseer, &candidate_hash1, approval_votes) .await; diff --git a/polkadot/node/core/provisioner/src/disputes/prioritized_selection/mod.rs b/polkadot/node/core/provisioner/src/disputes/prioritized_selection/mod.rs index 096b73d271a..cb55ce39bc8 100644 --- a/polkadot/node/core/provisioner/src/disputes/prioritized_selection/mod.rs +++ b/polkadot/node/core/provisioner/src/disputes/prioritized_selection/mod.rs @@ -221,7 +221,7 @@ where votes.valid.retain(|validator_idx, (statement_kind, _)| { is_vote_worth_to_keep( validator_idx, - DisputeStatement::Valid(*statement_kind), + DisputeStatement::Valid(statement_kind.clone()), &onchain_state, ) }); diff --git a/polkadot/node/core/runtime-api/src/cache.rs b/polkadot/node/core/runtime-api/src/cache.rs index 8a7a3dc08b8..5eca551db0a 100644 --- a/polkadot/node/core/runtime-api/src/cache.rs +++ b/polkadot/node/core/runtime-api/src/cache.rs @@ -20,12 +20,13 @@ use schnellru::{ByLength, LruMap}; use sp_consensus_babe::Epoch; use polkadot_primitives::{ - async_backing, slashing, vstaging, AuthorityDiscoveryId, BlockNumber, CandidateCommitments, - CandidateEvent, CandidateHash, CommittedCandidateReceipt, CoreState, DisputeState, - ExecutorParams, GroupRotationInfo, Hash, Id as ParaId, InboundDownwardMessage, - InboundHrmpMessage, OccupiedCoreAssumption, PersistedValidationData, PvfCheckStatement, - ScrapedOnChainVotes, SessionIndex, SessionInfo, ValidationCode, ValidationCodeHash, - ValidatorId, ValidatorIndex, ValidatorSignature, + async_backing, slashing, + vstaging::{self, ApprovalVotingParams}, + AuthorityDiscoveryId, BlockNumber, CandidateCommitments, CandidateEvent, CandidateHash, + CommittedCandidateReceipt, CoreState, DisputeState, ExecutorParams, GroupRotationInfo, Hash, + Id as ParaId, InboundDownwardMessage, InboundHrmpMessage, OccupiedCoreAssumption, + PersistedValidationData, PvfCheckStatement, ScrapedOnChainVotes, SessionIndex, SessionInfo, + ValidationCode, ValidationCodeHash, ValidatorId, ValidatorIndex, ValidatorSignature, }; /// For consistency we have the same capacity for all caches. We use 128 as we'll only need that @@ -68,6 +69,7 @@ pub(crate) struct RequestResultCache { para_backing_state: LruMap<(Hash, ParaId), Option>, async_backing_params: LruMap, node_features: LruMap, + approval_voting_params: LruMap, } impl Default for RequestResultCache { @@ -98,6 +100,7 @@ impl Default for RequestResultCache { unapplied_slashes: LruMap::new(ByLength::new(DEFAULT_CACHE_CAP)), key_ownership_proof: LruMap::new(ByLength::new(DEFAULT_CACHE_CAP)), minimum_backing_votes: LruMap::new(ByLength::new(DEFAULT_CACHE_CAP)), + approval_voting_params: LruMap::new(ByLength::new(DEFAULT_CACHE_CAP)), disabled_validators: LruMap::new(ByLength::new(DEFAULT_CACHE_CAP)), para_backing_state: LruMap::new(ByLength::new(DEFAULT_CACHE_CAP)), async_backing_params: LruMap::new(ByLength::new(DEFAULT_CACHE_CAP)), @@ -507,6 +510,21 @@ impl RequestResultCache { ) { self.async_backing_params.insert(key, value); } + + pub(crate) fn approval_voting_params( + &mut self, + key: (Hash, SessionIndex), + ) -> Option<&ApprovalVotingParams> { + self.approval_voting_params.get(&key.1).map(|v| &*v) + } + + pub(crate) fn cache_approval_voting_params( + &mut self, + session_index: SessionIndex, + value: ApprovalVotingParams, + ) { + self.approval_voting_params.insert(session_index, value); + } } pub(crate) enum RequestResult { @@ -554,6 +572,7 @@ pub(crate) enum RequestResult { slashing::OpaqueKeyOwnershipProof, Option<()>, ), + ApprovalVotingParams(Hash, SessionIndex, ApprovalVotingParams), DisabledValidators(Hash, Vec), ParaBackingState(Hash, ParaId, Option), AsyncBackingParams(Hash, async_backing::AsyncBackingParams), diff --git a/polkadot/node/core/runtime-api/src/lib.rs b/polkadot/node/core/runtime-api/src/lib.rs index 8689355c413..4bedfd82734 100644 --- a/polkadot/node/core/runtime-api/src/lib.rs +++ b/polkadot/node/core/runtime-api/src/lib.rs @@ -165,6 +165,8 @@ where KeyOwnershipProof(relay_parent, validator_id, key_ownership_proof) => self .requests_cache .cache_key_ownership_proof((relay_parent, validator_id), key_ownership_proof), + RequestResult::ApprovalVotingParams(_relay_parent, session_index, params) => + self.requests_cache.cache_approval_voting_params(session_index, params), SubmitReportDisputeLost(_, _, _, _) => {}, DisabledValidators(relay_parent, disabled_validators) => self.requests_cache.cache_disabled_validators(relay_parent, disabled_validators), @@ -300,6 +302,9 @@ where Request::SubmitReportDisputeLost(dispute_proof, key_ownership_proof, sender) }, ), + Request::ApprovalVotingParams(session_index, sender) => + query!(approval_voting_params(session_index), sender) + .map(|sender| Request::ApprovalVotingParams(session_index, sender)), Request::DisabledValidators(sender) => query!(disabled_validators(), sender) .map(|sender| Request::DisabledValidators(sender)), Request::ParaBackingState(para, sender) => query!(para_backing_state(para), sender) @@ -571,6 +576,14 @@ where ver = Request::KEY_OWNERSHIP_PROOF_RUNTIME_REQUIREMENT, sender ), + Request::ApprovalVotingParams(session_index, sender) => { + query!( + ApprovalVotingParams, + approval_voting_params(session_index), + ver = Request::APPROVAL_VOTING_PARAMS_REQUIREMENT, + sender + ) + }, Request::SubmitReportDisputeLost(dispute_proof, key_ownership_proof, sender) => query!( SubmitReportDisputeLost, submit_report_dispute_lost(dispute_proof, key_ownership_proof), diff --git a/polkadot/node/core/runtime-api/src/tests.rs b/polkadot/node/core/runtime-api/src/tests.rs index b939bffb0e7..f91723b3d39 100644 --- a/polkadot/node/core/runtime-api/src/tests.rs +++ b/polkadot/node/core/runtime-api/src/tests.rs @@ -20,12 +20,13 @@ use polkadot_node_primitives::{BabeAllowedSlots, BabeEpoch, BabeEpochConfigurati use polkadot_node_subsystem::SpawnGlue; use polkadot_node_subsystem_test_helpers::make_subsystem_context; use polkadot_primitives::{ - async_backing, slashing, vstaging::NodeFeatures, AuthorityDiscoveryId, BlockNumber, - CandidateCommitments, CandidateEvent, CandidateHash, CommittedCandidateReceipt, CoreState, - DisputeState, ExecutorParams, GroupRotationInfo, Id as ParaId, InboundDownwardMessage, - InboundHrmpMessage, OccupiedCoreAssumption, PersistedValidationData, PvfCheckStatement, - ScrapedOnChainVotes, SessionIndex, SessionInfo, Slot, ValidationCode, ValidationCodeHash, - ValidatorId, ValidatorIndex, ValidatorSignature, + async_backing, slashing, + vstaging::{ApprovalVotingParams, NodeFeatures}, + AuthorityDiscoveryId, BlockNumber, CandidateCommitments, CandidateEvent, CandidateHash, + CommittedCandidateReceipt, CoreState, DisputeState, ExecutorParams, GroupRotationInfo, + Id as ParaId, InboundDownwardMessage, InboundHrmpMessage, OccupiedCoreAssumption, + PersistedValidationData, PvfCheckStatement, ScrapedOnChainVotes, SessionIndex, SessionInfo, + Slot, ValidationCode, ValidationCodeHash, ValidatorId, ValidatorIndex, ValidatorSignature, }; use sp_api::ApiError; use sp_core::testing::TaskExecutor; @@ -242,6 +243,15 @@ impl RuntimeApiSubsystemClient for MockSubsystemClient { todo!("Not required for tests") } + /// Approval voting configuration parameters + async fn approval_voting_params( + &self, + _: Hash, + _: SessionIndex, + ) -> Result { + todo!("Not required for tests") + } + async fn current_epoch(&self, _: Hash) -> Result { Ok(self.babe_epoch.as_ref().unwrap().clone()) } diff --git a/polkadot/node/network/approval-distribution/src/lib.rs b/polkadot/node/network/approval-distribution/src/lib.rs index 47482eef764..d520febaef5 100644 --- a/polkadot/node/network/approval-distribution/src/lib.rs +++ b/polkadot/node/network/approval-distribution/src/lib.rs @@ -32,14 +32,15 @@ use polkadot_node_network_protocol::{ self as net_protocol, filter_by_peer_version, grid_topology::{RandomRouting, RequiredRouting, SessionGridTopologies, SessionGridTopology}, peer_set::MAX_NOTIFICATION_SIZE, - v1 as protocol_v1, v2 as protocol_v2, vstaging as protocol_vstaging, PeerId, + v1 as protocol_v1, v2 as protocol_v2, v3 as protocol_v3, PeerId, UnifiedReputationChange as Rep, Versioned, View, }; use polkadot_node_primitives::approval::{ - v1::{ - AssignmentCertKind, BlockApprovalMeta, IndirectAssignmentCert, IndirectSignedApprovalVote, + v1::{AssignmentCertKind, BlockApprovalMeta, IndirectAssignmentCert}, + v2::{ + AsBitIndex, AssignmentCertKindV2, CandidateBitfield, IndirectAssignmentCertV2, + IndirectSignedApprovalVoteV2, }, - v2::{AsBitIndex, AssignmentCertKindV2, CandidateBitfield, IndirectAssignmentCertV2}, }; use polkadot_node_subsystem::{ messages::{ @@ -113,6 +114,14 @@ struct ApprovalRouting { required_routing: RequiredRouting, local: bool, random_routing: RandomRouting, + peers_randomly_routed: Vec, +} + +impl ApprovalRouting { + fn mark_randomly_sent(&mut self, peer: PeerId) { + self.random_routing.inc_sent(); + self.peers_randomly_routed.push(peer); + } } // This struct is responsible for tracking the full state of an assignment and grid routing @@ -121,9 +130,9 @@ struct ApprovalEntry { // The assignment certificate. assignment: IndirectAssignmentCertV2, // The candidates claimed by the certificate. A mapping between bit index and candidate index. - candidates: CandidateBitfield, + assignment_claimed_candidates: CandidateBitfield, // The approval signatures for each `CandidateIndex` claimed by the assignment certificate. - approvals: HashMap, + approvals: HashMap, // The validator index of the assignment signer. validator_index: ValidatorIndex, // Information required for gossiping to other peers using the grid topology. @@ -136,6 +145,8 @@ enum ApprovalEntryError { CandidateIndexOutOfBounds, InvalidCandidateIndex, DuplicateApproval, + UnknownAssignment, + AssignmentsFollowedDifferentPaths(RequiredRouting, RequiredRouting), } impl ApprovalEntry { @@ -148,7 +159,7 @@ impl ApprovalEntry { validator_index: assignment.validator, assignment, approvals: HashMap::with_capacity(candidates.len()), - candidates, + assignment_claimed_candidates: candidates, routing_info, } } @@ -156,23 +167,15 @@ impl ApprovalEntry { // Create a `MessageSubject` to reference the assignment. pub fn create_assignment_knowledge(&self, block_hash: Hash) -> (MessageSubject, MessageKind) { ( - MessageSubject(block_hash, self.candidates.clone(), self.validator_index), + MessageSubject( + block_hash, + self.assignment_claimed_candidates.clone(), + self.validator_index, + ), MessageKind::Assignment, ) } - // Create a `MessageSubject` to reference the approval. - pub fn create_approval_knowledge( - &self, - block_hash: Hash, - candidate_index: CandidateIndex, - ) -> (MessageSubject, MessageKind) { - ( - MessageSubject(block_hash, candidate_index.into(), self.validator_index), - MessageKind::Approval, - ) - } - // Updates routing information and returns the previous information if any. pub fn routing_info_mut(&mut self) -> &mut ApprovalRouting { &mut self.routing_info @@ -188,11 +191,21 @@ impl ApprovalEntry { self.routing_info.required_routing = required_routing; } + // Tells if this entry assignment covers at least one candidate in the approval + pub fn includes_approval_candidates(&self, approval: &IndirectSignedApprovalVoteV2) -> bool { + for candidate_index in approval.candidate_indices.iter_ones() { + if self.assignment_claimed_candidates.bit_at((candidate_index).as_bit_index()) { + return true + } + } + return false + } + // Records a new approval. Returns error if the claimed candidate is not found or we already // have received the approval. pub fn note_approval( &mut self, - approval: IndirectSignedApprovalVote, + approval: IndirectSignedApprovalVoteV2, ) -> Result<(), ApprovalEntryError> { // First do some sanity checks: // - check validator index matches @@ -202,37 +215,29 @@ impl ApprovalEntry { return Err(ApprovalEntryError::InvalidValidatorIndex) } - if self.candidates.len() <= approval.candidate_index as usize { - return Err(ApprovalEntryError::CandidateIndexOutOfBounds) - } - - if !self.candidates.bit_at(approval.candidate_index.as_bit_index()) { + // We need at least one of the candidates in the approval to be in this assignment + if !self.includes_approval_candidates(&approval) { return Err(ApprovalEntryError::InvalidCandidateIndex) } - if self.approvals.contains_key(&approval.candidate_index) { + if self.approvals.contains_key(&approval.candidate_indices) { return Err(ApprovalEntryError::DuplicateApproval) } - self.approvals.insert(approval.candidate_index, approval); + self.approvals.insert(approval.candidate_indices.clone(), approval.clone()); Ok(()) } // Get the assignment certiticate and claimed candidates. pub fn assignment(&self) -> (IndirectAssignmentCertV2, CandidateBitfield) { - (self.assignment.clone(), self.candidates.clone()) + (self.assignment.clone(), self.assignment_claimed_candidates.clone()) } // Get all approvals for all candidates claimed by the assignment. - pub fn approvals(&self) -> Vec { + pub fn approvals(&self) -> Vec { self.approvals.values().cloned().collect::>() } - // Get the approval for a specific candidate index. - pub fn approval(&self, candidate_index: CandidateIndex) -> Option { - self.approvals.get(&candidate_index).cloned() - } - // Get validator index. pub fn validator_index(&self) -> ValidatorIndex { self.validator_index @@ -430,6 +435,41 @@ impl PeerKnowledge { fn contains(&self, message: &MessageSubject, kind: MessageKind) -> bool { self.sent.contains(message, kind) || self.received.contains(message, kind) } + + // Generate the knowledge keys for querying if all assignments of an approval are known + // by this peer. + fn generate_assignments_keys( + approval: &IndirectSignedApprovalVoteV2, + ) -> Vec<(MessageSubject, MessageKind)> { + approval + .candidate_indices + .iter_ones() + .map(|candidate_index| { + ( + MessageSubject( + approval.block_hash, + (candidate_index as CandidateIndex).into(), + approval.validator, + ), + MessageKind::Assignment, + ) + }) + .collect_vec() + } + + // Generate the knowledge keys for querying if an approval is known by peer. + fn generate_approval_key( + approval: &IndirectSignedApprovalVoteV2, + ) -> (MessageSubject, MessageKind) { + ( + MessageSubject( + approval.block_hash, + approval.candidate_indices.clone(), + approval.validator, + ), + MessageKind::Approval, + ) + } } /// Information about blocks in our current view as well as whether peers know of them. @@ -462,13 +502,13 @@ impl BlockEntry { // First map one entry per candidate to the same key we will use in `approval_entries`. // Key is (Validator_index, CandidateBitfield) that links the `ApprovalEntry` to the (K,V) // entry in `candidate_entry.messages`. - for claimed_candidate_index in entry.candidates.iter_ones() { + for claimed_candidate_index in entry.assignment_claimed_candidates.iter_ones() { match self.candidates.get_mut(claimed_candidate_index) { Some(candidate_entry) => { candidate_entry - .messages + .assignments .entry(entry.validator_index()) - .or_insert(entry.candidates.clone()); + .or_insert(entry.assignment_claimed_candidates.clone()); }, None => { // This should never happen, but if it happens, it means the subsystem is @@ -484,50 +524,107 @@ impl BlockEntry { } self.approval_entries - .entry((entry.validator_index, entry.candidates.clone())) + .entry((entry.validator_index, entry.assignment_claimed_candidates.clone())) .or_insert(entry) } - // Returns a mutable reference of `ApprovalEntry` for `candidate_index` from validator - // `validator_index`. - pub fn approval_entry( + // Tels if all candidate_indices are valid candidates + pub fn contains_candidates(&self, candidate_indices: &CandidateBitfield) -> bool { + candidate_indices + .iter_ones() + .all(|candidate_index| self.candidates.get(candidate_index as usize).is_some()) + } + + // Saves the given approval in all ApprovalEntries that contain an assignment for any of the + // candidates in the approval. + // + // Returns the required routing needed for this approval and the lit of random peers the + // covering assignments were sent. + pub fn note_approval( &mut self, - candidate_index: CandidateIndex, - validator_index: ValidatorIndex, - ) -> Option<&mut ApprovalEntry> { - self.candidates - .get(candidate_index as usize) - .map_or(None, |candidate_entry| candidate_entry.messages.get(&validator_index)) - .map_or(None, |candidate_indices| { - self.approval_entries.get_mut(&(validator_index, candidate_indices.clone())) + approval: IndirectSignedApprovalVoteV2, + ) -> Result<(RequiredRouting, HashSet), ApprovalEntryError> { + let mut required_routing = None; + let mut peers_randomly_routed_to = HashSet::new(); + + if self.candidates.len() < approval.candidate_indices.len() as usize { + return Err(ApprovalEntryError::CandidateIndexOutOfBounds) + } + + // First determine all assignments bitfields that might be covered by this approval + let covered_assignments_bitfields: HashSet = approval + .candidate_indices + .iter_ones() + .filter_map(|candidate_index| { + self.candidates.get_mut(candidate_index).map_or(None, |candidate_entry| { + candidate_entry.assignments.get(&approval.validator).cloned() + }) }) - } + .collect(); - // Get all approval entries for a given candidate. - pub fn approval_entries(&self, candidate_index: CandidateIndex) -> Vec<&ApprovalEntry> { - // Get the keys for fetching `ApprovalEntry` from `self.approval_entries`, - let approval_entry_keys = self - .candidates - .get(candidate_index as usize) - .map(|candidate_entry| &candidate_entry.messages); - - if let Some(approval_entry_keys) = approval_entry_keys { - // Ensure no duplicates. - let approval_entry_keys = approval_entry_keys.iter().unique().collect::>(); - - let mut entries = Vec::new(); - for (validator_index, candidate_indices) in approval_entry_keys { - if let Some(entry) = - self.approval_entries.get(&(*validator_index, candidate_indices.clone())) - { - entries.push(entry); + // Mark the vote in all approval entries + for assignment_bitfield in covered_assignments_bitfields { + if let Some(approval_entry) = + self.approval_entries.get_mut(&(approval.validator, assignment_bitfield)) + { + approval_entry.note_approval(approval.clone())?; + peers_randomly_routed_to + .extend(approval_entry.routing_info().peers_randomly_routed.iter()); + + if let Some(required_routing) = required_routing { + if required_routing != approval_entry.routing_info().required_routing { + // This shouldn't happen since the required routing is computed based on the + // validator_index, so two assignments from the same validators will have + // the same required routing. + return Err(ApprovalEntryError::AssignmentsFollowedDifferentPaths( + required_routing, + approval_entry.routing_info().required_routing, + )) + } + } else { + required_routing = Some(approval_entry.routing_info().required_routing) } } - entries + } + + if let Some(required_routing) = required_routing { + Ok((required_routing, peers_randomly_routed_to)) } else { - vec![] + Err(ApprovalEntryError::UnknownAssignment) } } + + /// Returns the list of approval votes covering this candidate + pub fn approval_votes( + &self, + candidate_index: CandidateIndex, + ) -> Vec { + let result: Option< + HashMap<(ValidatorIndex, CandidateBitfield), IndirectSignedApprovalVoteV2>, + > = self.candidates.get(candidate_index as usize).map(|candidate_entry| { + candidate_entry + .assignments + .iter() + .filter_map(|(validator, assignment_bitfield)| { + self.approval_entries.get(&(*validator, assignment_bitfield.clone())) + }) + .flat_map(|approval_entry| { + approval_entry + .approvals + .clone() + .into_iter() + .filter(|(approved_candidates, _)| { + approved_candidates.bit_at(candidate_index.as_bit_index()) + }) + .map(|(approved_candidates, vote)| { + ((approval_entry.validator_index, approved_candidates), vote) + }) + }) + .collect() + }); + + result.map(|result| result.into_values().collect_vec()).unwrap_or_default() + } } // Information about candidates in the context of a particular block they are included in. @@ -537,7 +634,7 @@ impl BlockEntry { struct CandidateEntry { // The value represents part of the lookup key in `approval_entries` to fetch the assignment // and existing votes. - messages: HashMap, + assignments: HashMap, } #[derive(Debug, Clone, PartialEq)] @@ -557,7 +654,7 @@ impl MessageSource { enum PendingMessage { Assignment(IndirectAssignmentCertV2, CandidateBitfield), - Approval(IndirectSignedApprovalVote), + Approval(IndirectSignedApprovalVoteV2), } #[overseer::contextbounds(ApprovalDistribution, prefix = self::overseer)] @@ -830,6 +927,49 @@ impl State { } } + // Entry point for processing an approval coming from a peer. + async fn process_incoming_approvals( + &mut self, + ctx: &mut Context, + metrics: &Metrics, + peer_id: PeerId, + approvals: Vec, + ) { + gum::trace!( + target: LOG_TARGET, + peer_id = %peer_id, + num = approvals.len(), + "Processing approvals from a peer", + ); + for approval_vote in approvals.into_iter() { + if let Some(pending) = self.pending_known.get_mut(&approval_vote.block_hash) { + let block_hash = approval_vote.block_hash; + let validator_index = approval_vote.validator; + + gum::trace!( + target: LOG_TARGET, + %peer_id, + ?block_hash, + ?validator_index, + "Pending assignment candidates {:?}", + approval_vote.candidate_indices, + ); + + pending.push((peer_id, PendingMessage::Approval(approval_vote))); + + continue + } + + self.import_and_circulate_approval( + ctx, + metrics, + MessageSource::Peer(peer_id), + approval_vote, + ) + .await; + } + } + async fn process_incoming_peer_message( &mut self, ctx: &mut Context, @@ -838,16 +978,14 @@ impl State { msg: Versioned< protocol_v1::ApprovalDistributionMessage, protocol_v2::ApprovalDistributionMessage, - protocol_vstaging::ApprovalDistributionMessage, + protocol_v3::ApprovalDistributionMessage, >, rng: &mut R, ) where R: CryptoRng + Rng, { match msg { - Versioned::VStaging(protocol_vstaging::ApprovalDistributionMessage::Assignments( - assignments, - )) => { + Versioned::V3(protocol_v3::ApprovalDistributionMessage::Assignments(assignments)) => { gum::trace!( target: LOG_TARGET, peer_id = %peer_id, @@ -887,45 +1025,18 @@ impl State { ) .await; }, - Versioned::VStaging(protocol_vstaging::ApprovalDistributionMessage::Approvals( - approvals, - )) | + Versioned::V3(protocol_v3::ApprovalDistributionMessage::Approvals(approvals)) => { + self.process_incoming_approvals(ctx, metrics, peer_id, approvals).await; + }, Versioned::V1(protocol_v1::ApprovalDistributionMessage::Approvals(approvals)) | Versioned::V2(protocol_v2::ApprovalDistributionMessage::Approvals(approvals)) => { - gum::trace!( - target: LOG_TARGET, - peer_id = %peer_id, - num = approvals.len(), - "Processing approvals from a peer", - ); - for approval_vote in approvals.into_iter() { - if let Some(pending) = self.pending_known.get_mut(&approval_vote.block_hash) { - let block_hash = approval_vote.block_hash; - let candidate_index = approval_vote.candidate_index; - let validator_index = approval_vote.validator; - - gum::trace!( - target: LOG_TARGET, - %peer_id, - ?block_hash, - ?candidate_index, - ?validator_index, - "Pending assignment", - ); - - pending.push((peer_id, PendingMessage::Approval(approval_vote))); - - continue - } - - self.import_and_circulate_approval( - ctx, - metrics, - MessageSource::Peer(peer_id), - approval_vote, - ) - .await; - } + self.process_incoming_approvals( + ctx, + metrics, + peer_id, + approvals.into_iter().map(|approval| approval.into()).collect::>(), + ) + .await; }, } } @@ -1071,8 +1182,11 @@ impl State { COST_UNEXPECTED_MESSAGE, ) .await; + gum::debug!(target: LOG_TARGET, "Received assignment for invalid block"); + metrics.on_assignment_recent_outdated(); } } + metrics.on_assignment_invalid_block(); return }, }; @@ -1105,6 +1219,7 @@ impl State { COST_DUPLICATE_MESSAGE, ) .await; + metrics.on_assignment_duplicate(); } else { gum::trace!( target: LOG_TARGET, @@ -1132,6 +1247,7 @@ impl State { COST_UNEXPECTED_MESSAGE, ) .await; + metrics.on_assignment_out_of_view(); }, } @@ -1148,6 +1264,7 @@ impl State { gum::trace!(target: LOG_TARGET, ?peer_id, ?message_subject, "Known assignment"); peer_knowledge.received.insert(message_subject, message_kind); } + metrics.on_assignment_good_known(); return } @@ -1204,6 +1321,8 @@ impl State { ?peer_id, "Got an `AcceptedDuplicate` assignment", ); + metrics.on_assignment_duplicatevoting(); + return }, AssignmentCheckResult::TooFarInFuture => { @@ -1220,6 +1339,8 @@ impl State { COST_ASSIGNMENT_TOO_FAR_IN_THE_FUTURE, ) .await; + metrics.on_assignment_far(); + return }, AssignmentCheckResult::Bad(error) => { @@ -1237,6 +1358,7 @@ impl State { COST_INVALID_MESSAGE, ) .await; + metrics.on_assignment_bad(); return }, } @@ -1275,7 +1397,12 @@ impl State { let approval_entry = entry.insert_approval_entry(ApprovalEntry::new( assignment.clone(), claimed_candidate_indices.clone(), - ApprovalRouting { required_routing, local, random_routing: Default::default() }, + ApprovalRouting { + required_routing, + local, + random_routing: Default::default(), + peers_randomly_routed: Default::default(), + }, )); // Dispatch the message to all peers in the routing set which @@ -1305,6 +1432,10 @@ impl State { continue } + if !topology.map(|topology| topology.is_validator(&peer)).unwrap_or(false) { + continue + } + // Note: at this point, we haven't received the message from any peers // other than the source peer, and we just got it, so we haven't sent it // to any peers either. @@ -1312,7 +1443,7 @@ impl State { approval_entry.routing_info().random_routing.sample(n_peers_total, rng); if route_random { - approval_entry.routing_info_mut().random_routing.inc_sent(); + approval_entry.routing_info_mut().mark_randomly_sent(peer); peers.push(peer); } } @@ -1346,12 +1477,94 @@ impl State { } } + // Checks if an approval can be processed. + // Returns true if we can continue with processing the approval and false otherwise. + async fn check_approval_can_be_processed( + ctx: &mut Context, + assignments_knowledge_key: &Vec<(MessageSubject, MessageKind)>, + approval_knowledge_key: &(MessageSubject, MessageKind), + entry: &mut BlockEntry, + reputation: &mut ReputationAggregator, + peer_id: PeerId, + metrics: &Metrics, + ) -> bool { + for message_subject in assignments_knowledge_key { + if !entry.knowledge.contains(&message_subject.0, message_subject.1) { + gum::trace!( + target: LOG_TARGET, + ?peer_id, + ?message_subject, + "Unknown approval assignment", + ); + modify_reputation(reputation, ctx.sender(), peer_id, COST_UNEXPECTED_MESSAGE).await; + metrics.on_approval_unknown_assignment(); + return false + } + } + + // check if our knowledge of the peer already contains this approval + match entry.known_by.entry(peer_id) { + hash_map::Entry::Occupied(mut knowledge) => { + let peer_knowledge = knowledge.get_mut(); + if peer_knowledge.contains(&approval_knowledge_key.0, approval_knowledge_key.1) { + if !peer_knowledge + .received + .insert(approval_knowledge_key.0.clone(), approval_knowledge_key.1) + { + gum::trace!( + target: LOG_TARGET, + ?peer_id, + ?approval_knowledge_key, + "Duplicate approval", + ); + + modify_reputation( + reputation, + ctx.sender(), + peer_id, + COST_DUPLICATE_MESSAGE, + ) + .await; + metrics.on_approval_duplicate(); + } + return false + } + }, + hash_map::Entry::Vacant(_) => { + gum::debug!( + target: LOG_TARGET, + ?peer_id, + ?approval_knowledge_key, + "Approval from a peer is out of view", + ); + modify_reputation(reputation, ctx.sender(), peer_id, COST_UNEXPECTED_MESSAGE).await; + metrics.on_approval_out_of_view(); + }, + } + + if entry.knowledge.contains(&approval_knowledge_key.0, approval_knowledge_key.1) { + if let Some(peer_knowledge) = entry.known_by.get_mut(&peer_id) { + peer_knowledge + .received + .insert(approval_knowledge_key.0.clone(), approval_knowledge_key.1); + } + + // We already processed this approval no need to continue. + gum::trace!(target: LOG_TARGET, ?peer_id, ?approval_knowledge_key, "Known approval"); + metrics.on_approval_good_known(); + modify_reputation(reputation, ctx.sender(), peer_id, BENEFIT_VALID_MESSAGE).await; + false + } else { + true + } + } + async fn import_and_circulate_approval( &mut self, ctx: &mut Context, metrics: &Metrics, source: MessageSource, - vote: IndirectSignedApprovalVote, + vote: IndirectSignedApprovalVoteV2, ) { let _span = self .spans @@ -1370,10 +1583,9 @@ impl State { let block_hash = vote.block_hash; let validator_index = vote.validator; - let candidate_index = vote.candidate_index; - + let candidate_indices = &vote.candidate_indices; let entry = match self.blocks.get_mut(&block_hash) { - Some(entry) if entry.candidates.get(candidate_index as usize).is_some() => entry, + Some(entry) if entry.contains_candidates(&vote.candidate_indices) => entry, _ => { if let Some(peer_id) = source.peer_id() { if !self.recent_outdated_blocks.is_recent_outdated(&block_hash) { @@ -1382,7 +1594,7 @@ impl State { ?peer_id, ?block_hash, ?validator_index, - ?candidate_index, + ?candidate_indices, "Approval from a peer is out of view", ); modify_reputation( @@ -1392,6 +1604,9 @@ impl State { COST_UNEXPECTED_MESSAGE, ) .await; + metrics.on_approval_invalid_block(); + } else { + metrics.on_approval_recent_outdated(); } } return @@ -1399,81 +1614,21 @@ impl State { }; // compute metadata on the assignment. - let message_subject = MessageSubject(block_hash, candidate_index.into(), validator_index); - let message_kind = MessageKind::Approval; + let assignments_knowledge_keys = PeerKnowledge::generate_assignments_keys(&vote); + let approval_knwowledge_key = PeerKnowledge::generate_approval_key(&vote); if let Some(peer_id) = source.peer_id() { - if !entry.knowledge.contains(&message_subject, MessageKind::Assignment) { - gum::debug!( - target: LOG_TARGET, - ?peer_id, - ?message_subject, - "Unknown approval assignment", - ); - modify_reputation( - &mut self.reputation, - ctx.sender(), - peer_id, - COST_UNEXPECTED_MESSAGE, - ) - .await; - return - } - - // check if our knowledge of the peer already contains this approval - match entry.known_by.entry(peer_id) { - hash_map::Entry::Occupied(mut knowledge) => { - let peer_knowledge = knowledge.get_mut(); - if peer_knowledge.contains(&message_subject, message_kind) { - if !peer_knowledge.received.insert(message_subject.clone(), message_kind) { - gum::debug!( - target: LOG_TARGET, - ?peer_id, - ?message_subject, - "Duplicate approval", - ); - - modify_reputation( - &mut self.reputation, - ctx.sender(), - peer_id, - COST_DUPLICATE_MESSAGE, - ) - .await; - } - return - } - }, - hash_map::Entry::Vacant(_) => { - gum::debug!( - target: LOG_TARGET, - ?peer_id, - ?message_subject, - "Approval from a peer is out of view", - ); - modify_reputation( - &mut self.reputation, - ctx.sender(), - peer_id, - COST_UNEXPECTED_MESSAGE, - ) - .await; - }, - } - - // if the approval is known to be valid, reward the peer - if entry.knowledge.contains(&message_subject, message_kind) { - gum::trace!(target: LOG_TARGET, ?peer_id, ?message_subject, "Known approval"); - modify_reputation( - &mut self.reputation, - ctx.sender(), - peer_id, - BENEFIT_VALID_MESSAGE, - ) - .await; - if let Some(peer_knowledge) = entry.known_by.get_mut(&peer_id) { - peer_knowledge.received.insert(message_subject.clone(), message_kind); - } + if !Self::check_approval_can_be_processed( + ctx, + &assignments_knowledge_keys, + &approval_knwowledge_key, + entry, + &mut self.reputation, + peer_id, + metrics, + ) + .await + { return } @@ -1495,8 +1650,8 @@ impl State { gum::trace!( target: LOG_TARGET, ?peer_id, - ?message_subject, ?result, + ?vote, "Checked approval", ); match result { @@ -1509,9 +1664,13 @@ impl State { ) .await; - entry.knowledge.insert(message_subject.clone(), message_kind); + entry + .knowledge + .insert(approval_knwowledge_key.0.clone(), approval_knwowledge_key.1); if let Some(peer_knowledge) = entry.known_by.get_mut(&peer_id) { - peer_knowledge.received.insert(message_subject.clone(), message_kind); + peer_knowledge + .received + .insert(approval_knwowledge_key.0.clone(), approval_knwowledge_key.1); } }, ApprovalCheckResult::Bad(error) => { @@ -1528,74 +1687,55 @@ impl State { %error, "Got a bad approval from peer", ); + metrics.on_approval_bad(); return }, } } else { - if !entry.knowledge.insert(message_subject.clone(), message_kind) { - // if we already imported an approval, there is no need to distribute it again + if !entry + .knowledge + .insert(approval_knwowledge_key.0.clone(), approval_knwowledge_key.1) + { + // if we already imported all approvals, there is no need to distribute it again gum::warn!( target: LOG_TARGET, - ?message_subject, "Importing locally an already known approval", ); return } else { gum::debug!( target: LOG_TARGET, - ?message_subject, "Importing locally a new approval", ); } } - let required_routing = match entry.approval_entry(candidate_index, validator_index) { - Some(approval_entry) => { - // Invariant: to our knowledge, none of the peers except for the `source` know about - // the approval. - metrics.on_approval_imported(); - - if let Err(err) = approval_entry.note_approval(vote.clone()) { - // this would indicate a bug in approval-voting: - // - validator index mismatch - // - candidate index mismatch - // - duplicate approval - gum::warn!( - target: LOG_TARGET, - hash = ?block_hash, - ?candidate_index, - ?validator_index, - ?err, - "Possible bug: Vote import failed", - ); - - return - } - - approval_entry.routing_info().required_routing - }, - None => { - let peer_id = source.peer_id(); - // This indicates a bug in approval-distribution, since we check the knowledge at - // the begining of the function. + let (required_routing, peers_randomly_routed_to) = match entry.note_approval(vote.clone()) { + Ok(required_routing) => required_routing, + Err(err) => { gum::warn!( target: LOG_TARGET, - ?peer_id, - ?message_subject, - "Unknown approval assignment", + hash = ?block_hash, + validator_index = ?vote.validator, + candidate_bitfield = ?vote.candidate_indices, + ?err, + "Possible bug: Vote import failed", ); - // No rep change as this is caused by an issue + metrics.on_approval_bug(); return }, }; + // Invariant: to our knowledge, none of the peers except for the `source` know about the + // approval. + metrics.on_approval_imported(); + // Dispatch a ApprovalDistributionV1Message::Approval(vote) // to all peers required by the topology, with the exception of the source peer. let topology = self.topologies.get_topology(entry.session); let source_peer = source.peer_id(); - let message_subject = &message_subject; - let peer_filter = move |peer, knowledge: &PeerKnowledge| { + let peer_filter = move |peer| { if Some(peer) == source_peer.as_ref() { return false } @@ -1611,13 +1751,13 @@ impl State { // 3. Any randomly selected peers have been sent the assignment already. let in_topology = topology .map_or(false, |t| t.local_grid_neighbors().route_to_peer(required_routing, peer)); - in_topology || knowledge.sent.contains(message_subject, MessageKind::Assignment) + in_topology || peers_randomly_routed_to.contains(peer) }; let peers = entry .known_by .iter() - .filter(|(p, k)| peer_filter(p, k)) + .filter(|(p, _)| peer_filter(p)) .filter_map(|(p, _)| self.peer_views.get(p).map(|entry| (*p, entry.version))) .collect::>(); @@ -1625,7 +1765,7 @@ impl State { for peer in peers.iter() { // we already filtered peers above, so this should always be Some if let Some(entry) = entry.known_by.get_mut(&peer.0) { - entry.sent.insert(message_subject.clone(), message_kind); + entry.sent.insert(approval_knwowledge_key.0.clone(), approval_knwowledge_key.1); } } @@ -1634,7 +1774,6 @@ impl State { gum::trace!( target: LOG_TARGET, ?block_hash, - ?candidate_index, local = source.peer_id().is_none(), num_peers = peers.len(), "Sending an approval to peers", @@ -1647,7 +1786,7 @@ impl State { fn get_approval_signatures( &mut self, indices: HashSet<(Hash, CandidateIndex)>, - ) -> HashMap { + ) -> HashMap, ValidatorSignature)> { let mut all_sigs = HashMap::new(); for (hash, index) in indices { let _span = self @@ -1670,11 +1809,20 @@ impl State { Some(e) => e, }; - let sigs = block_entry - .approval_entries(index) - .into_iter() - .filter_map(|approval_entry| approval_entry.approval(index)) - .map(|approval| (approval.validator, approval.signature)); + let sigs = block_entry.approval_votes(index).into_iter().map(|approval| { + ( + approval.validator, + ( + hash, + approval + .candidate_indices + .iter_ones() + .map(|val| val as CandidateIndex) + .collect_vec(), + approval.signature, + ), + ) + }); all_sigs.extend(sigs); } all_sigs @@ -1718,23 +1866,31 @@ impl State { let peer_knowledge = entry.known_by.entry(peer_id).or_default(); let topology = topologies.get_topology(entry.session); - // We want to iterate the `approval_entries` of the block entry as these contain all - // assignments that also link all approval votes. + // We want to iterate the `approval_entries` of the block entry as these contain + // all assignments that also link all approval votes. for approval_entry in entry.approval_entries.values_mut() { // Propagate the message to all peers in the required routing set OR // randomly sample peers. { let required_routing = approval_entry.routing_info().required_routing; - let random_routing = &mut approval_entry.routing_info_mut().random_routing; + let routing_info = &mut approval_entry.routing_info_mut(); let rng = &mut *rng; let mut peer_filter = move |peer_id| { let in_topology = topology.as_ref().map_or(false, |t| { t.local_grid_neighbors().route_to_peer(required_routing, peer_id) }); in_topology || { - let route_random = random_routing.sample(total_peers, rng); + if !topology + .map(|topology| topology.is_validator(peer_id)) + .unwrap_or(false) + { + return false + } + + let route_random = + routing_info.random_routing.sample(total_peers, rng); if route_random { - random_routing.inc_sent(); + routing_info.mark_randomly_sent(*peer_id); } route_random @@ -1751,7 +1907,8 @@ impl State { let (assignment_knowledge, message_kind) = approval_entry.create_assignment_knowledge(block); - // Only send stuff a peer doesn't know in the context of a relay chain block. + // Only send stuff a peer doesn't know in the context of a relay chain + // block. if !peer_knowledge.contains(&assignment_knowledge, message_kind) { peer_knowledge.sent.insert(assignment_knowledge, message_kind); assignments_to_send.push(assignment_message); @@ -1759,12 +1916,12 @@ impl State { // Filter approval votes. for approval_message in approval_messages { - let (approval_knowledge, message_kind) = approval_entry - .create_approval_knowledge(block, approval_message.candidate_index); + let approval_knowledge = + PeerKnowledge::generate_approval_key(&approval_message); - if !peer_knowledge.contains(&approval_knowledge, message_kind) { - peer_knowledge.sent.insert(approval_knowledge, message_kind); + if !peer_knowledge.contains(&approval_knowledge.0, approval_knowledge.1) { approvals_to_send.push(approval_message); + peer_knowledge.sent.insert(approval_knowledge.0, approval_knowledge.1); } } } @@ -1937,6 +2094,7 @@ impl State { // Punish the peer for the invalid message. modify_reputation(&mut self.reputation, sender, peer_id, COST_OVERSIZED_BITFIELD) .await; + gum::error!(target: LOG_TARGET, block_hash = ?cert.block_hash, ?candidate_index, validator_index = ?cert.validator, kind = ?cert.cert.kind, "Bad assignment v1"); } else { sanitized_assignments.push((cert.into(), candidate_index.into())) } @@ -1979,6 +2137,9 @@ impl State { // Punish the peer for the invalid message. modify_reputation(&mut self.reputation, sender, peer_id, COST_OVERSIZED_BITFIELD) .await; + for candidate_index in candidate_bitfield.iter_ones() { + gum::error!(target: LOG_TARGET, block_hash = ?cert.block_hash, ?candidate_index, validator_index = ?cert.validator, "Bad assignment v2"); + } } else { sanitized_assignments.push((cert, candidate_bitfield)) } @@ -2066,11 +2227,10 @@ async fn adjust_required_routing_and_propagate { gum::debug!( target: LOG_TARGET, - "Distributing our approval vote on candidate (block={}, index={})", + "Distributing our approval vote on candidate (block={}, index={:?})", vote.block_hash, - vote.candidate_index, + vote.candidate_indices, ); state @@ -2296,7 +2456,7 @@ pub const MAX_ASSIGNMENT_BATCH_SIZE: usize = ensure_size_not_zero( /// The maximum amount of approvals per batch is 33% of maximum allowed by protocol. pub const MAX_APPROVAL_BATCH_SIZE: usize = ensure_size_not_zero( - MAX_NOTIFICATION_SIZE as usize / std::mem::size_of::() / 3, + MAX_NOTIFICATION_SIZE as usize / std::mem::size_of::() / 3, ); // Low level helper for sending assignments. @@ -2306,12 +2466,12 @@ async fn send_assignments_batched_inner( peers: Vec, peer_version: ValidationVersion, ) { - if peer_version == ValidationVersion::VStaging { + if peer_version == ValidationVersion::V3 { sender .send_message(NetworkBridgeTxMessage::SendValidationMessage( peers, - Versioned::VStaging(protocol_vstaging::ValidationProtocol::ApprovalDistribution( - protocol_vstaging::ApprovalDistributionMessage::Assignments( + Versioned::V3(protocol_v3::ValidationProtocol::ApprovalDistribution( + protocol_v3::ApprovalDistributionMessage::Assignments( batch.into_iter().collect(), ), )), @@ -2362,7 +2522,7 @@ pub(crate) async fn send_assignments_batched( ) { let v1_peers = filter_by_peer_version(peers, ValidationVersion::V1.into()); let v2_peers = filter_by_peer_version(peers, ValidationVersion::V2.into()); - let vstaging_peers = filter_by_peer_version(peers, ValidationVersion::VStaging.into()); + let v3_peers = filter_by_peer_version(peers, ValidationVersion::V3.into()); // V1 and V2 validation protocol do not have any changes with regard to // ApprovalDistributionMessage so they can be treated the same. @@ -2400,18 +2560,13 @@ pub(crate) async fn send_assignments_batched( } } - if !vstaging_peers.is_empty() { - let mut vstaging = v2_assignments.into_iter().peekable(); + if !v3_peers.is_empty() { + let mut v3 = v2_assignments.into_iter().peekable(); - while vstaging.peek().is_some() { - let batch = vstaging.by_ref().take(MAX_ASSIGNMENT_BATCH_SIZE).collect::>(); - send_assignments_batched_inner( - sender, - batch, - vstaging_peers.clone(), - ValidationVersion::VStaging, - ) - .await; + while v3.peek().is_some() { + let batch = v3.by_ref().take(MAX_ASSIGNMENT_BATCH_SIZE).collect::>(); + send_assignments_batched_inner(sender, batch, v3_peers.clone(), ValidationVersion::V3) + .await; } } } @@ -2419,15 +2574,20 @@ pub(crate) async fn send_assignments_batched( /// Send approvals while honoring the `max_notification_size` of the protocol and peer version. pub(crate) async fn send_approvals_batched( sender: &mut impl overseer::ApprovalDistributionSenderTrait, - approvals: impl IntoIterator + Clone, + approvals: impl IntoIterator + Clone, peers: &[(PeerId, ProtocolVersion)], ) { let v1_peers = filter_by_peer_version(peers, ValidationVersion::V1.into()); let v2_peers = filter_by_peer_version(peers, ValidationVersion::V2.into()); - let vstaging_peers = filter_by_peer_version(peers, ValidationVersion::VStaging.into()); + let v3_peers = filter_by_peer_version(peers, ValidationVersion::V3.into()); if !v1_peers.is_empty() || !v2_peers.is_empty() { - let mut batches = approvals.clone().into_iter().peekable(); + let mut batches = approvals + .clone() + .into_iter() + .filter(|approval| approval.candidate_indices.count_ones() == 1) + .filter_map(|val| val.try_into().ok()) + .peekable(); while batches.peek().is_some() { let batch: Vec<_> = batches.by_ref().take(MAX_APPROVAL_BATCH_SIZE).collect(); @@ -2456,7 +2616,7 @@ pub(crate) async fn send_approvals_batched( } } - if !vstaging_peers.is_empty() { + if !v3_peers.is_empty() { let mut batches = approvals.into_iter().peekable(); while batches.peek().is_some() { @@ -2464,12 +2624,10 @@ pub(crate) async fn send_approvals_batched( sender .send_message(NetworkBridgeTxMessage::SendValidationMessage( - vstaging_peers.clone(), - Versioned::VStaging( - protocol_vstaging::ValidationProtocol::ApprovalDistribution( - protocol_vstaging::ApprovalDistributionMessage::Approvals(batch), - ), - ), + v3_peers.clone(), + Versioned::V3(protocol_v3::ValidationProtocol::ApprovalDistribution( + protocol_v3::ApprovalDistributionMessage::Approvals(batch), + )), )) .await; } diff --git a/polkadot/node/network/approval-distribution/src/metrics.rs b/polkadot/node/network/approval-distribution/src/metrics.rs index 6864259e6fd..0642b1b2e0c 100644 --- a/polkadot/node/network/approval-distribution/src/metrics.rs +++ b/polkadot/node/network/approval-distribution/src/metrics.rs @@ -31,6 +31,8 @@ struct MetricsInner { time_unify_with_peer: prometheus::Histogram, time_import_pending_now_known: prometheus::Histogram, time_awaiting_approval_voting: prometheus::Histogram, + assignments_received_result: prometheus::CounterVec, + approvals_received_result: prometheus::CounterVec, } trait AsLabel { @@ -78,6 +80,132 @@ impl Metrics { .map(|metrics| metrics.time_import_pending_now_known.start_timer()) } + pub fn on_approval_already_known(&self) { + if let Some(metrics) = &self.0 { + metrics.approvals_received_result.with_label_values(&["known"]).inc() + } + } + + pub fn on_approval_entry_not_found(&self) { + if let Some(metrics) = &self.0 { + metrics.approvals_received_result.with_label_values(&["noapprovalentry"]).inc() + } + } + + pub fn on_approval_recent_outdated(&self) { + if let Some(metrics) = &self.0 { + metrics.approvals_received_result.with_label_values(&["outdated"]).inc() + } + } + + pub fn on_approval_invalid_block(&self) { + if let Some(metrics) = &self.0 { + metrics.approvals_received_result.with_label_values(&["invalidblock"]).inc() + } + } + + pub fn on_approval_unknown_assignment(&self) { + if let Some(metrics) = &self.0 { + metrics + .approvals_received_result + .with_label_values(&["unknownassignment"]) + .inc() + } + } + + pub fn on_approval_duplicate(&self) { + if let Some(metrics) = &self.0 { + metrics.approvals_received_result.with_label_values(&["duplicate"]).inc() + } + } + + pub fn on_approval_out_of_view(&self) { + if let Some(metrics) = &self.0 { + metrics.approvals_received_result.with_label_values(&["outofview"]).inc() + } + } + + pub fn on_approval_good_known(&self) { + if let Some(metrics) = &self.0 { + metrics.approvals_received_result.with_label_values(&["goodknown"]).inc() + } + } + + pub fn on_approval_bad(&self) { + if let Some(metrics) = &self.0 { + metrics.approvals_received_result.with_label_values(&["bad"]).inc() + } + } + + pub fn on_approval_unexpected(&self) { + if let Some(metrics) = &self.0 { + metrics.approvals_received_result.with_label_values(&["unexpected"]).inc() + } + } + + pub fn on_approval_bug(&self) { + if let Some(metrics) = &self.0 { + metrics.approvals_received_result.with_label_values(&["bug"]).inc() + } + } + + pub fn on_assignment_already_known(&self) { + if let Some(metrics) = &self.0 { + metrics.assignments_received_result.with_label_values(&["known"]).inc() + } + } + + pub fn on_assignment_recent_outdated(&self) { + if let Some(metrics) = &self.0 { + metrics.assignments_received_result.with_label_values(&["outdated"]).inc() + } + } + + pub fn on_assignment_invalid_block(&self) { + if let Some(metrics) = &self.0 { + metrics.assignments_received_result.with_label_values(&["invalidblock"]).inc() + } + } + + pub fn on_assignment_duplicate(&self) { + if let Some(metrics) = &self.0 { + metrics.assignments_received_result.with_label_values(&["duplicate"]).inc() + } + } + + pub fn on_assignment_out_of_view(&self) { + if let Some(metrics) = &self.0 { + metrics.assignments_received_result.with_label_values(&["outofview"]).inc() + } + } + + pub fn on_assignment_good_known(&self) { + if let Some(metrics) = &self.0 { + metrics.assignments_received_result.with_label_values(&["goodknown"]).inc() + } + } + + pub fn on_assignment_bad(&self) { + if let Some(metrics) = &self.0 { + metrics.assignments_received_result.with_label_values(&["bad"]).inc() + } + } + + pub fn on_assignment_duplicatevoting(&self) { + if let Some(metrics) = &self.0 { + metrics + .assignments_received_result + .with_label_values(&["duplicatevoting"]) + .inc() + } + } + + pub fn on_assignment_far(&self) { + if let Some(metrics) = &self.0 { + metrics.assignments_received_result.with_label_values(&["far"]).inc() + } + } + pub(crate) fn time_awaiting_approval_voting( &self, ) -> Option { @@ -167,6 +295,26 @@ impl MetricsTrait for Metrics { ).buckets(vec![0.0001, 0.0004, 0.0016, 0.0064, 0.0256, 0.1024, 0.4096, 1.6384, 3.2768, 4.9152, 6.5536,]))?, registry, )?, + assignments_received_result: prometheus::register( + prometheus::CounterVec::new( + prometheus::Opts::new( + "polkadot_parachain_assignments_received_result", + "Result of a processed assignement", + ), + &["status"] + )?, + registry, + )?, + approvals_received_result: prometheus::register( + prometheus::CounterVec::new( + prometheus::Opts::new( + "polkadot_parachain_approvals_received_result", + "Result of a processed approval", + ), + &["status"] + )?, + registry, + )?, }; Ok(Metrics(Some(metrics))) } diff --git a/polkadot/node/network/approval-distribution/src/tests.rs b/polkadot/node/network/approval-distribution/src/tests.rs index 4d272d7af0e..ad5d0bb0a9c 100644 --- a/polkadot/node/network/approval-distribution/src/tests.rs +++ b/polkadot/node/network/approval-distribution/src/tests.rs @@ -25,8 +25,8 @@ use polkadot_node_network_protocol::{ }; use polkadot_node_primitives::approval::{ v1::{ - AssignmentCert, AssignmentCertKind, IndirectAssignmentCert, VrfPreOutput, VrfProof, - VrfSignature, + AssignmentCert, AssignmentCertKind, IndirectAssignmentCert, IndirectSignedApprovalVote, + VrfPreOutput, VrfProof, VrfSignature, }, v2::{ AssignmentCertKindV2, AssignmentCertV2, CoreBitfield, IndirectAssignmentCertV2, @@ -133,14 +133,13 @@ fn make_gossip_topology( all_peers: &[(PeerId, AuthorityDiscoveryId)], neighbors_x: &[usize], neighbors_y: &[usize], + local_index: usize, ) -> network_bridge_event::NewGossipTopology { // This builds a grid topology which is a square matrix. // The local validator occupies the top left-hand corner. // The X peers occupy the same row and the Y peers occupy // the same column. - let local_index = 1; - assert_eq!( neighbors_x.len(), neighbors_y.len(), @@ -277,16 +276,16 @@ async fn send_message_from_peer_v2( .await; } -async fn send_message_from_peer_vstaging( +async fn send_message_from_peer_v3( virtual_overseer: &mut VirtualOverseer, peer_id: &PeerId, - msg: protocol_vstaging::ApprovalDistributionMessage, + msg: protocol_v3::ApprovalDistributionMessage, ) { overseer_send( virtual_overseer, ApprovalDistributionMessage::NetworkBridgeUpdate(NetworkBridgeEvent::PeerMessage( *peer_id, - Versioned::VStaging(msg), + Versioned::V3(msg), )), ) .await; @@ -380,10 +379,11 @@ fn state_with_reputation_delay() -> State { /// the new peer sends us the same assignment #[test] fn try_import_the_same_assignment() { - let peer_a = PeerId::random(); - let peer_b = PeerId::random(); - let peer_c = PeerId::random(); - let peer_d = PeerId::random(); + let peers = make_peers_and_authority_ids(15); + let peer_a = peers.get(0).unwrap().0; + let peer_b = peers.get(1).unwrap().0; + let peer_c = peers.get(2).unwrap().0; + let peer_d = peers.get(4).unwrap().0; let parent_hash = Hash::repeat_byte(0xFF); let hash = Hash::repeat_byte(0xAA); @@ -394,6 +394,10 @@ fn try_import_the_same_assignment() { setup_peer_with_view(overseer, &peer_b, view![hash], ValidationVersion::V1).await; setup_peer_with_view(overseer, &peer_c, view![hash], ValidationVersion::V1).await; + // Set up a gossip topology, where a, b, c and d are topology neighboors to the node under + // testing. + setup_gossip_topology(overseer, make_gossip_topology(1, &peers, &[0, 1], &[2, 4], 3)).await; + // new block `hash_a` with 1 candidates let meta = BlockApprovalMeta { hash, @@ -446,7 +450,7 @@ fn try_import_the_same_assignment() { ); // setup new peer with V2 - setup_peer_with_view(overseer, &peer_d, view![], ValidationVersion::VStaging).await; + setup_peer_with_view(overseer, &peer_d, view![], ValidationVersion::V3).await; // send the same assignment from peer_d let msg = protocol_v1::ApprovalDistributionMessage::Assignments(assignments); @@ -464,19 +468,24 @@ fn try_import_the_same_assignment() { /// cores. #[test] fn try_import_the_same_assignment_v2() { - let peer_a = PeerId::random(); - let peer_b = PeerId::random(); - let peer_c = PeerId::random(); - let peer_d = PeerId::random(); + let peers = make_peers_and_authority_ids(15); + let peer_a = peers.get(0).unwrap().0; + let peer_b = peers.get(1).unwrap().0; + let peer_c = peers.get(2).unwrap().0; + let peer_d = peers.get(4).unwrap().0; let parent_hash = Hash::repeat_byte(0xFF); let hash = Hash::repeat_byte(0xAA); let _ = test_harness(state_without_reputation_delay(), |mut virtual_overseer| async move { let overseer = &mut virtual_overseer; // setup peers - setup_peer_with_view(overseer, &peer_a, view![], ValidationVersion::VStaging).await; - setup_peer_with_view(overseer, &peer_b, view![hash], ValidationVersion::VStaging).await; - setup_peer_with_view(overseer, &peer_c, view![hash], ValidationVersion::VStaging).await; + setup_peer_with_view(overseer, &peer_a, view![], ValidationVersion::V3).await; + setup_peer_with_view(overseer, &peer_b, view![hash], ValidationVersion::V3).await; + setup_peer_with_view(overseer, &peer_c, view![hash], ValidationVersion::V3).await; + + // Set up a gossip topology, where a, b, c and d are topology neighboors to the node under + // testing. + setup_gossip_topology(overseer, make_gossip_topology(1, &peers, &[0, 1], &[2, 4], 3)).await; // new block `hash_a` with 1 candidates let meta = BlockApprovalMeta { @@ -503,8 +512,8 @@ fn try_import_the_same_assignment_v2() { let cert = fake_assignment_cert_v2(hash, validator_index, core_bitfield.clone()); let assignments = vec![(cert.clone(), cores.clone().try_into().unwrap())]; - let msg = protocol_vstaging::ApprovalDistributionMessage::Assignments(assignments.clone()); - send_message_from_peer_vstaging(overseer, &peer_a, msg).await; + let msg = protocol_v3::ApprovalDistributionMessage::Assignments(assignments.clone()); + send_message_from_peer_v3(overseer, &peer_a, msg).await; expect_reputation_change(overseer, &peer_a, COST_UNEXPECTED_MESSAGE).await; @@ -528,8 +537,8 @@ fn try_import_the_same_assignment_v2() { overseer_recv(overseer).await, AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::SendValidationMessage( peers, - Versioned::VStaging(protocol_vstaging::ValidationProtocol::ApprovalDistribution( - protocol_vstaging::ApprovalDistributionMessage::Assignments(assignments) + Versioned::V3(protocol_v3::ValidationProtocol::ApprovalDistribution( + protocol_v3::ApprovalDistributionMessage::Assignments(assignments) )) )) => { assert_eq!(peers.len(), 2); @@ -538,11 +547,11 @@ fn try_import_the_same_assignment_v2() { ); // setup new peer - setup_peer_with_view(overseer, &peer_d, view![], ValidationVersion::VStaging).await; + setup_peer_with_view(overseer, &peer_d, view![], ValidationVersion::V3).await; // send the same assignment from peer_d - let msg = protocol_vstaging::ApprovalDistributionMessage::Assignments(assignments); - send_message_from_peer_vstaging(overseer, &peer_d, msg).await; + let msg = protocol_v3::ApprovalDistributionMessage::Assignments(assignments); + send_message_from_peer_v3(overseer, &peer_d, msg).await; expect_reputation_change(overseer, &peer_d, COST_UNEXPECTED_MESSAGE).await; expect_reputation_change(overseer, &peer_d, BENEFIT_VALID_MESSAGE).await; @@ -705,14 +714,19 @@ fn spam_attack_results_in_negative_reputation_change() { #[test] fn peer_sending_us_the_same_we_just_sent_them_is_ok() { let parent_hash = Hash::repeat_byte(0xFF); - let peer_a = PeerId::random(); let hash = Hash::repeat_byte(0xAA); + let peers = make_peers_and_authority_ids(8); + let peer_a = peers.first().unwrap().0; + let _ = test_harness(state_without_reputation_delay(), |mut virtual_overseer| async move { let overseer = &mut virtual_overseer; let peer = &peer_a; setup_peer_with_view(overseer, peer, view![], ValidationVersion::V1).await; + // Setup a topology where peer_a is neigboor to current node. + setup_gossip_topology(overseer, make_gossip_topology(1, &peers, &[0], &[2], 1)).await; + // new block `hash` with 1 candidates let meta = BlockApprovalMeta { hash, @@ -780,10 +794,12 @@ fn peer_sending_us_the_same_we_just_sent_them_is_ok() { } #[test] -fn import_approval_happy_path() { - let peer_a = PeerId::random(); - let peer_b = PeerId::random(); - let peer_c = PeerId::random(); +fn import_approval_happy_path_v1_v2_peers() { + let peers = make_peers_and_authority_ids(15); + + let peer_a = peers.get(0).unwrap().0; + let peer_b = peers.get(1).unwrap().0; + let peer_c = peers.get(2).unwrap().0; let parent_hash = Hash::repeat_byte(0xFF); let hash = Hash::repeat_byte(0xAA); @@ -791,7 +807,7 @@ fn import_approval_happy_path() { let overseer = &mut virtual_overseer; // setup peers with V1 and V2 protocol versions setup_peer_with_view(overseer, &peer_a, view![], ValidationVersion::V1).await; - setup_peer_with_view(overseer, &peer_b, view![hash], ValidationVersion::VStaging).await; + setup_peer_with_view(overseer, &peer_b, view![hash], ValidationVersion::V3).await; setup_peer_with_view(overseer, &peer_c, view![hash], ValidationVersion::V1).await; // new block `hash_a` with 1 candidates @@ -806,6 +822,9 @@ fn import_approval_happy_path() { let msg = ApprovalDistributionMessage::NewBlocks(vec![meta]); overseer_send(overseer, msg).await; + // Set up a gossip topology, where a, b, and c are topology neighboors to the node. + setup_gossip_topology(overseer, make_gossip_topology(1, &peers, &[0, 1], &[2, 4], 3)).await; + // import an assignment related to `hash` locally let validator_index = ValidatorIndex(0); let candidate_index = 0u32; @@ -838,8 +857,8 @@ fn import_approval_happy_path() { overseer_recv(overseer).await, AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::SendValidationMessage( peers, - Versioned::VStaging(protocol_vstaging::ValidationProtocol::ApprovalDistribution( - protocol_vstaging::ApprovalDistributionMessage::Assignments(assignments) + Versioned::V3(protocol_v3::ValidationProtocol::ApprovalDistribution( + protocol_v3::ApprovalDistributionMessage::Assignments(assignments) )) )) => { assert_eq!(peers.len(), 1); @@ -848,14 +867,15 @@ fn import_approval_happy_path() { ); // send the an approval from peer_b - let approval = IndirectSignedApprovalVote { + let approval = IndirectSignedApprovalVoteV2 { block_hash: hash, - candidate_index, + candidate_indices: candidate_index.into(), validator: validator_index, signature: dummy_signature(), }; - let msg = protocol_v1::ApprovalDistributionMessage::Approvals(vec![approval.clone()]); - send_message_from_peer(overseer, &peer_b, msg).await; + let msg: protocol_v3::ApprovalDistributionMessage = + protocol_v3::ApprovalDistributionMessage::Approvals(vec![approval.clone()]); + send_message_from_peer_v3(overseer, &peer_b, msg).await; assert_matches!( overseer_recv(overseer).await, @@ -886,6 +906,474 @@ fn import_approval_happy_path() { }); } +// Test a v2 approval that signs multiple candidate is correctly processed. +#[test] +fn import_approval_happy_path_v2() { + let peers = make_peers_and_authority_ids(15); + + let peer_a = peers.get(0).unwrap().0; + let peer_b = peers.get(1).unwrap().0; + let peer_c = peers.get(2).unwrap().0; + let parent_hash = Hash::repeat_byte(0xFF); + let hash = Hash::repeat_byte(0xAA); + + let _ = test_harness(state_without_reputation_delay(), |mut virtual_overseer| async move { + let overseer = &mut virtual_overseer; + // setup peers with V2 protocol versions + setup_peer_with_view(overseer, &peer_a, view![], ValidationVersion::V3).await; + setup_peer_with_view(overseer, &peer_b, view![hash], ValidationVersion::V3).await; + setup_peer_with_view(overseer, &peer_c, view![hash], ValidationVersion::V3).await; + + // new block `hash_a` with 1 candidates + let meta = BlockApprovalMeta { + hash, + parent_hash, + number: 1, + candidates: vec![Default::default(); 2], + slot: 1.into(), + session: 1, + }; + let msg = ApprovalDistributionMessage::NewBlocks(vec![meta]); + overseer_send(overseer, msg).await; + + // Set up a gossip topology, where a, b, and c are topology neighboors to the node. + setup_gossip_topology(overseer, make_gossip_topology(1, &peers, &[0, 1], &[2, 4], 3)).await; + + // import an assignment related to `hash` locally + let validator_index = ValidatorIndex(0); + let candidate_indices: CandidateBitfield = + vec![0 as CandidateIndex, 1 as CandidateIndex].try_into().unwrap(); + let candidate_bitfields = vec![CoreIndex(0), CoreIndex(1)].try_into().unwrap(); + let cert = fake_assignment_cert_v2(hash, validator_index, candidate_bitfields); + overseer_send( + overseer, + ApprovalDistributionMessage::DistributeAssignment( + cert.clone().into(), + candidate_indices.clone(), + ), + ) + .await; + + // 1 peer is v2 + assert_matches!( + overseer_recv(overseer).await, + AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::SendValidationMessage( + peers, + Versioned::V3(protocol_v3::ValidationProtocol::ApprovalDistribution( + protocol_v3::ApprovalDistributionMessage::Assignments(assignments) + )) + )) => { + assert_eq!(peers.len(), 2); + assert_eq!(assignments.len(), 1); + } + ); + + // send the an approval from peer_b + let approval = IndirectSignedApprovalVoteV2 { + block_hash: hash, + candidate_indices, + validator: validator_index, + signature: dummy_signature(), + }; + let msg = protocol_v3::ApprovalDistributionMessage::Approvals(vec![approval.clone()]); + send_message_from_peer_v3(overseer, &peer_b, msg).await; + + assert_matches!( + overseer_recv(overseer).await, + AllMessages::ApprovalVoting(ApprovalVotingMessage::CheckAndImportApproval( + vote, + tx, + )) => { + assert_eq!(vote, approval); + tx.send(ApprovalCheckResult::Accepted).unwrap(); + } + ); + + expect_reputation_change(overseer, &peer_b, BENEFIT_VALID_MESSAGE_FIRST).await; + + assert_matches!( + overseer_recv(overseer).await, + AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::SendValidationMessage( + peers, + Versioned::V3(protocol_v3::ValidationProtocol::ApprovalDistribution( + protocol_v3::ApprovalDistributionMessage::Approvals(approvals) + )) + )) => { + assert_eq!(peers.len(), 1); + assert_eq!(approvals.len(), 1); + } + ); + virtual_overseer + }); +} + +// Tests that votes that cover multiple assignments candidates are correctly processed on importing +#[test] +fn multiple_assignments_covered_with_one_approval_vote() { + let peers = make_peers_and_authority_ids(15); + + let peer_a = peers.get(0).unwrap().0; + let peer_b = peers.get(1).unwrap().0; + let peer_c = peers.get(2).unwrap().0; + let peer_d = peers.get(4).unwrap().0; + let parent_hash = Hash::repeat_byte(0xFF); + let hash = Hash::repeat_byte(0xAA); + + let _ = test_harness(state_without_reputation_delay(), |mut virtual_overseer| async move { + let overseer = &mut virtual_overseer; + // setup peers with V2 protocol versions + setup_peer_with_view(overseer, &peer_a, view![hash], ValidationVersion::V3).await; + setup_peer_with_view(overseer, &peer_b, view![hash], ValidationVersion::V3).await; + setup_peer_with_view(overseer, &peer_c, view![hash], ValidationVersion::V3).await; + setup_peer_with_view(overseer, &peer_d, view![hash], ValidationVersion::V3).await; + + // new block `hash_a` with 1 candidates + let meta = BlockApprovalMeta { + hash, + parent_hash, + number: 1, + candidates: vec![Default::default(); 2], + slot: 1.into(), + session: 1, + }; + let msg = ApprovalDistributionMessage::NewBlocks(vec![meta]); + overseer_send(overseer, msg).await; + + // Set up a gossip topology, where a, b, and c, d are topology neighboors to the node. + setup_gossip_topology(overseer, make_gossip_topology(1, &peers, &[0, 1], &[2, 4], 3)).await; + + // import an assignment related to `hash` locally + let validator_index = ValidatorIndex(2); // peer_c is the originator + let candidate_indices: CandidateBitfield = + vec![0 as CandidateIndex, 1 as CandidateIndex].try_into().unwrap(); + + let core_bitfields = vec![CoreIndex(0)].try_into().unwrap(); + let cert = fake_assignment_cert_v2(hash, validator_index, core_bitfields); + + // send the candidate 0 assignment from peer_b + let assignment = IndirectAssignmentCertV2 { + block_hash: hash, + validator: validator_index, + cert: cert.cert, + }; + let msg = protocol_v3::ApprovalDistributionMessage::Assignments(vec![( + assignment, + (0 as CandidateIndex).into(), + )]); + send_message_from_peer_v3(overseer, &peer_d, msg).await; + + assert_matches!( + overseer_recv(overseer).await, + AllMessages::ApprovalVoting(ApprovalVotingMessage::CheckAndImportAssignment( + _, _, + tx, + )) => { + tx.send(AssignmentCheckResult::Accepted).unwrap(); + } + ); + expect_reputation_change(overseer, &peer_d, BENEFIT_VALID_MESSAGE_FIRST).await; + + assert_matches!( + overseer_recv(overseer).await, + AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::SendValidationMessage( + peers, + Versioned::V3(protocol_v3::ValidationProtocol::ApprovalDistribution( + protocol_v3::ApprovalDistributionMessage::Assignments(assignments) + )) + )) => { + assert!(peers.len() >= 2); + assert!(peers.contains(&peer_a)); + assert!(peers.contains(&peer_b)); + assert_eq!(assignments.len(), 1); + } + ); + + let candidate_bitfields = vec![CoreIndex(1)].try_into().unwrap(); + let cert = fake_assignment_cert_v2(hash, validator_index, candidate_bitfields); + + // send the candidate 1 assignment from peer_c + let assignment = IndirectAssignmentCertV2 { + block_hash: hash, + validator: validator_index, + cert: cert.cert, + }; + let msg = protocol_v3::ApprovalDistributionMessage::Assignments(vec![( + assignment, + (1 as CandidateIndex).into(), + )]); + + send_message_from_peer_v3(overseer, &peer_c, msg).await; + + assert_matches!( + overseer_recv(overseer).await, + AllMessages::ApprovalVoting(ApprovalVotingMessage::CheckAndImportAssignment( + _, _, + tx, + )) => { + tx.send(AssignmentCheckResult::Accepted).unwrap(); + } + ); + expect_reputation_change(overseer, &peer_c, BENEFIT_VALID_MESSAGE_FIRST).await; + + assert_matches!( + overseer_recv(overseer).await, + AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::SendValidationMessage( + peers, + Versioned::V3(protocol_v3::ValidationProtocol::ApprovalDistribution( + protocol_v3::ApprovalDistributionMessage::Assignments(assignments) + )) + )) => { + assert!(peers.len() >= 2); + assert!(peers.contains(&peer_b)); + assert!(peers.contains(&peer_a)); + assert_eq!(assignments.len(), 1); + } + ); + + // send an approval from peer_b + let approval = IndirectSignedApprovalVoteV2 { + block_hash: hash, + candidate_indices, + validator: validator_index, + signature: dummy_signature(), + }; + let msg = protocol_v3::ApprovalDistributionMessage::Approvals(vec![approval.clone()]); + send_message_from_peer_v3(overseer, &peer_d, msg).await; + + assert_matches!( + overseer_recv(overseer).await, + AllMessages::ApprovalVoting(ApprovalVotingMessage::CheckAndImportApproval( + vote, + tx, + )) => { + assert_eq!(vote, approval); + tx.send(ApprovalCheckResult::Accepted).unwrap(); + } + ); + + expect_reputation_change(overseer, &peer_d, BENEFIT_VALID_MESSAGE_FIRST).await; + + assert_matches!( + overseer_recv(overseer).await, + AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::SendValidationMessage( + peers, + Versioned::V3(protocol_v3::ValidationProtocol::ApprovalDistribution( + protocol_v3::ApprovalDistributionMessage::Approvals(approvals) + )) + )) => { + assert!(peers.len() >= 2); + assert!(peers.contains(&peer_b)); + assert!(peers.contains(&peer_a)); + assert_eq!(approvals.len(), 1); + } + ); + for candidate_index in 0..1 { + let (tx_distribution, rx_distribution) = oneshot::channel(); + let mut candidates_requesting_signatures = HashSet::new(); + candidates_requesting_signatures.insert((hash, candidate_index)); + overseer_send( + overseer, + ApprovalDistributionMessage::GetApprovalSignatures( + candidates_requesting_signatures, + tx_distribution, + ), + ) + .await; + let signatures = rx_distribution.await.unwrap(); + + assert_eq!(signatures.len(), 1); + for (signing_validator, signature) in signatures { + assert_eq!(validator_index, signing_validator); + assert_eq!(signature.0, hash); + assert_eq!(signature.2, approval.signature); + assert_eq!(signature.1, vec![0, 1]); + } + } + virtual_overseer + }); +} + +// Tests that votes that cover multiple assignments candidates are correctly processed when unify +// with peer view +#[test] +fn unify_with_peer_multiple_assignments_covered_with_one_approval_vote() { + let peers = make_peers_and_authority_ids(15); + + let peer_a = peers.get(0).unwrap().0; + let peer_b = peers.get(1).unwrap().0; + let peer_d = peers.get(4).unwrap().0; + let parent_hash = Hash::repeat_byte(0xFF); + let hash = Hash::repeat_byte(0xAA); + + let _ = test_harness(state_without_reputation_delay(), |mut virtual_overseer| async move { + let overseer = &mut virtual_overseer; + setup_peer_with_view(overseer, &peer_d, view![hash], ValidationVersion::V3).await; + + // new block `hash_a` with 1 candidates + let meta = BlockApprovalMeta { + hash, + parent_hash, + number: 1, + candidates: vec![Default::default(); 2], + slot: 1.into(), + session: 1, + }; + let msg = ApprovalDistributionMessage::NewBlocks(vec![meta]); + overseer_send(overseer, msg).await; + + // Set up a gossip topology, where a, b, and c, d are topology neighboors to the node. + setup_gossip_topology(overseer, make_gossip_topology(1, &peers, &[0, 1], &[2, 4], 3)).await; + + // import an assignment related to `hash` locally + let validator_index = ValidatorIndex(2); // peer_c is the originator + let candidate_indices: CandidateBitfield = + vec![0 as CandidateIndex, 1 as CandidateIndex].try_into().unwrap(); + + let core_bitfields = vec![CoreIndex(0)].try_into().unwrap(); + let cert = fake_assignment_cert_v2(hash, validator_index, core_bitfields); + + // send the candidate 0 assignment from peer_b + let assignment = IndirectAssignmentCertV2 { + block_hash: hash, + validator: validator_index, + cert: cert.cert, + }; + let msg = protocol_v3::ApprovalDistributionMessage::Assignments(vec![( + assignment, + (0 as CandidateIndex).into(), + )]); + send_message_from_peer_v3(overseer, &peer_d, msg).await; + + assert_matches!( + overseer_recv(overseer).await, + AllMessages::ApprovalVoting(ApprovalVotingMessage::CheckAndImportAssignment( + _, _, + tx, + )) => { + tx.send(AssignmentCheckResult::Accepted).unwrap(); + } + ); + expect_reputation_change(overseer, &peer_d, BENEFIT_VALID_MESSAGE_FIRST).await; + + let candidate_bitfields = vec![CoreIndex(1)].try_into().unwrap(); + let cert = fake_assignment_cert_v2(hash, validator_index, candidate_bitfields); + + // send the candidate 1 assignment from peer_c + let assignment = IndirectAssignmentCertV2 { + block_hash: hash, + validator: validator_index, + cert: cert.cert, + }; + let msg = protocol_v3::ApprovalDistributionMessage::Assignments(vec![( + assignment, + (1 as CandidateIndex).into(), + )]); + + send_message_from_peer_v3(overseer, &peer_d, msg).await; + + assert_matches!( + overseer_recv(overseer).await, + AllMessages::ApprovalVoting(ApprovalVotingMessage::CheckAndImportAssignment( + _, _, + tx, + )) => { + tx.send(AssignmentCheckResult::Accepted).unwrap(); + } + ); + expect_reputation_change(overseer, &peer_d, BENEFIT_VALID_MESSAGE_FIRST).await; + + // send an approval from peer_b + let approval = IndirectSignedApprovalVoteV2 { + block_hash: hash, + candidate_indices, + validator: validator_index, + signature: dummy_signature(), + }; + let msg = protocol_v3::ApprovalDistributionMessage::Approvals(vec![approval.clone()]); + send_message_from_peer_v3(overseer, &peer_d, msg).await; + + assert_matches!( + overseer_recv(overseer).await, + AllMessages::ApprovalVoting(ApprovalVotingMessage::CheckAndImportApproval( + vote, + tx, + )) => { + assert_eq!(vote, approval); + tx.send(ApprovalCheckResult::Accepted).unwrap(); + } + ); + + expect_reputation_change(overseer, &peer_d, BENEFIT_VALID_MESSAGE_FIRST).await; + + // setup peers with V2 protocol versions + setup_peer_with_view(overseer, &peer_a, view![hash], ValidationVersion::V3).await; + setup_peer_with_view(overseer, &peer_b, view![hash], ValidationVersion::V3).await; + let mut expected_peers_assignments = vec![peer_a, peer_b]; + let mut expected_peers_approvals = vec![peer_a, peer_b]; + assert_matches!( + overseer_recv(overseer).await, + AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::SendValidationMessage( + peers, + Versioned::V3(protocol_v3::ValidationProtocol::ApprovalDistribution( + protocol_v3::ApprovalDistributionMessage::Assignments(assignments) + )) + )) => { + assert!(peers.len() == 1); + assert!(expected_peers_assignments.contains(peers.first().unwrap())); + expected_peers_assignments.retain(|peer| peer != peers.first().unwrap()); + assert_eq!(assignments.len(), 2); + } + ); + + assert_matches!( + overseer_recv(overseer).await, + AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::SendValidationMessage( + peers, + Versioned::V3(protocol_v3::ValidationProtocol::ApprovalDistribution( + protocol_v3::ApprovalDistributionMessage::Approvals(approvals) + )) + )) => { + assert!(peers.len() == 1); + assert!(expected_peers_approvals.contains(peers.first().unwrap())); + expected_peers_approvals.retain(|peer| peer != peers.first().unwrap()); + assert_eq!(approvals.len(), 1); + } + ); + + assert_matches!( + overseer_recv(overseer).await, + AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::SendValidationMessage( + peers, + Versioned::V3(protocol_v3::ValidationProtocol::ApprovalDistribution( + protocol_v3::ApprovalDistributionMessage::Assignments(assignments) + )) + )) => { + assert!(peers.len() == 1); + assert!(expected_peers_assignments.contains(peers.first().unwrap())); + expected_peers_assignments.retain(|peer| peer != peers.first().unwrap()); + assert_eq!(assignments.len(), 2); + } + ); + + assert_matches!( + overseer_recv(overseer).await, + AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::SendValidationMessage( + peers, + Versioned::V3(protocol_v3::ValidationProtocol::ApprovalDistribution( + protocol_v3::ApprovalDistributionMessage::Approvals(approvals) + )) + )) => { + assert!(peers.len() == 1); + assert!(expected_peers_approvals.contains(peers.first().unwrap())); + expected_peers_approvals.retain(|peer| peer != peers.first().unwrap()); + assert_eq!(approvals.len(), 1); + } + ); + + virtual_overseer + }); +} + #[test] fn import_approval_bad() { let peer_a = PeerId::random(); @@ -916,14 +1404,14 @@ fn import_approval_bad() { let cert = fake_assignment_cert(hash, validator_index); // send the an approval from peer_b, we don't have an assignment yet - let approval = IndirectSignedApprovalVote { + let approval = IndirectSignedApprovalVoteV2 { block_hash: hash, - candidate_index, + candidate_indices: candidate_index.into(), validator: validator_index, signature: dummy_signature(), }; - let msg = protocol_v1::ApprovalDistributionMessage::Approvals(vec![approval.clone()]); - send_message_from_peer(overseer, &peer_b, msg).await; + let msg = protocol_v3::ApprovalDistributionMessage::Approvals(vec![approval.clone()]); + send_message_from_peer_v3(overseer, &peer_b, msg).await; expect_reputation_change(overseer, &peer_b, COST_UNEXPECTED_MESSAGE).await; @@ -948,8 +1436,8 @@ fn import_approval_bad() { expect_reputation_change(overseer, &peer_b, BENEFIT_VALID_MESSAGE_FIRST).await; // and try again - let msg = protocol_v1::ApprovalDistributionMessage::Approvals(vec![approval.clone()]); - send_message_from_peer(overseer, &peer_b, msg).await; + let msg = protocol_v3::ApprovalDistributionMessage::Approvals(vec![approval.clone()]); + send_message_from_peer_v3(overseer, &peer_b, msg).await; assert_matches!( overseer_recv(overseer).await, @@ -1048,7 +1536,8 @@ fn update_peer_view() { let hash_b = Hash::repeat_byte(0xBB); let hash_c = Hash::repeat_byte(0xCC); let hash_d = Hash::repeat_byte(0xDD); - let peer_a = PeerId::random(); + let peers = make_peers_and_authority_ids(8); + let peer_a = peers.first().unwrap().0; let peer = &peer_a; let state = test_harness(State::default(), |mut virtual_overseer| async move { @@ -1082,6 +1571,9 @@ fn update_peer_view() { let msg = ApprovalDistributionMessage::NewBlocks(vec![meta_a, meta_b, meta_c]); overseer_send(overseer, msg).await; + // Setup a topology where peer_a is neigboor to current node. + setup_gossip_topology(overseer, make_gossip_topology(1, &peers, &[0], &[2], 1)).await; + let cert_a = fake_assignment_cert(hash_a, ValidatorIndex(0)); let cert_b = fake_assignment_cert(hash_b, ValidatorIndex(0)); @@ -1264,14 +1756,14 @@ fn import_remotely_then_locally() { assert!(overseer.recv().timeout(TIMEOUT).await.is_none(), "no message should be sent"); // send the approval remotely - let approval = IndirectSignedApprovalVote { + let approval = IndirectSignedApprovalVoteV2 { block_hash: hash, - candidate_index, + candidate_indices: candidate_index.into(), validator: validator_index, signature: dummy_signature(), }; - let msg = protocol_v1::ApprovalDistributionMessage::Approvals(vec![approval.clone()]); - send_message_from_peer(overseer, peer, msg).await; + let msg = protocol_v3::ApprovalDistributionMessage::Approvals(vec![approval.clone()]); + send_message_from_peer_v3(overseer, peer, msg).await; assert_matches!( overseer_recv(overseer).await, @@ -1295,7 +1787,8 @@ fn import_remotely_then_locally() { #[test] fn sends_assignments_even_when_state_is_approved() { - let peer_a = PeerId::random(); + let peers = make_peers_and_authority_ids(8); + let peer_a = peers.first().unwrap().0; let parent_hash = Hash::repeat_byte(0xFF); let hash = Hash::repeat_byte(0xAA); let peer = &peer_a; @@ -1315,6 +1808,9 @@ fn sends_assignments_even_when_state_is_approved() { let msg = ApprovalDistributionMessage::NewBlocks(vec![meta]); overseer_send(overseer, msg).await; + // Setup a topology where peer_a is neigboor to current node. + setup_gossip_topology(overseer, make_gossip_topology(1, &peers, &[0], &[2], 1)).await; + let validator_index = ValidatorIndex(0); let candidate_index = 0u32; @@ -1336,8 +1832,11 @@ fn sends_assignments_even_when_state_is_approved() { ) .await; - overseer_send(overseer, ApprovalDistributionMessage::DistributeApproval(approval.clone())) - .await; + overseer_send( + overseer, + ApprovalDistributionMessage::DistributeApproval(approval.clone().into()), + ) + .await; // connect the peer. setup_peer_with_view(overseer, peer, view![hash], ValidationVersion::V1).await; @@ -1380,7 +1879,8 @@ fn sends_assignments_even_when_state_is_approved() { /// assignemnts. #[test] fn sends_assignments_even_when_state_is_approved_v2() { - let peer_a = PeerId::random(); + let peers = make_peers_and_authority_ids(8); + let peer_a = peers.first().unwrap().0; let parent_hash = Hash::repeat_byte(0xFF); let hash = Hash::repeat_byte(0xAA); let peer = &peer_a; @@ -1400,6 +1900,9 @@ fn sends_assignments_even_when_state_is_approved_v2() { let msg = ApprovalDistributionMessage::NewBlocks(vec![meta]); overseer_send(overseer, msg).await; + // Setup a topology where peer_a is neigboor to current node. + setup_gossip_topology(overseer, make_gossip_topology(1, &peers, &[0], &[2], 1)).await; + let validator_index = ValidatorIndex(0); let cores = vec![0, 1, 2, 3]; let candidate_bitfield: CandidateBitfield = cores.clone().try_into().unwrap(); @@ -1416,9 +1919,9 @@ fn sends_assignments_even_when_state_is_approved_v2() { // Assumes candidate index == core index. let approvals = cores .iter() - .map(|core| IndirectSignedApprovalVote { + .map(|core| IndirectSignedApprovalVoteV2 { block_hash: hash, - candidate_index: *core, + candidate_indices: (*core).into(), validator: validator_index, signature: dummy_signature(), }) @@ -1442,7 +1945,7 @@ fn sends_assignments_even_when_state_is_approved_v2() { } // connect the peer. - setup_peer_with_view(overseer, peer, view![hash], ValidationVersion::VStaging).await; + setup_peer_with_view(overseer, peer, view![hash], ValidationVersion::V3).await; let assignments = vec![(cert.clone(), candidate_bitfield.clone())]; @@ -1450,8 +1953,8 @@ fn sends_assignments_even_when_state_is_approved_v2() { overseer_recv(overseer).await, AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::SendValidationMessage( peers, - Versioned::VStaging(protocol_vstaging::ValidationProtocol::ApprovalDistribution( - protocol_vstaging::ApprovalDistributionMessage::Assignments(sent_assignments) + Versioned::V3(protocol_v3::ValidationProtocol::ApprovalDistribution( + protocol_v3::ApprovalDistributionMessage::Assignments(sent_assignments) )) )) => { assert_eq!(peers, vec![*peer]); @@ -1463,14 +1966,14 @@ fn sends_assignments_even_when_state_is_approved_v2() { overseer_recv(overseer).await, AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::SendValidationMessage( peers, - Versioned::VStaging(protocol_vstaging::ValidationProtocol::ApprovalDistribution( - protocol_vstaging::ApprovalDistributionMessage::Approvals(sent_approvals) + Versioned::V3(protocol_v3::ValidationProtocol::ApprovalDistribution( + protocol_v3::ApprovalDistributionMessage::Approvals(sent_approvals) )) )) => { // Construct a hashmaps of approvals for comparison. Approval distribution reorders messages because they are kept in a // hashmap as well. - let sent_approvals = sent_approvals.into_iter().map(|approval| (approval.candidate_index, approval)).collect::>(); - let approvals = approvals.into_iter().map(|approval| (approval.candidate_index, approval)).collect::>(); + let sent_approvals = sent_approvals.into_iter().map(|approval| (approval.candidate_indices.clone(), approval)).collect::>(); + let approvals = approvals.into_iter().map(|approval| (approval.candidate_indices.clone(), approval)).collect::>(); assert_eq!(peers, vec![*peer]); assert_eq!(sent_approvals, approvals); @@ -1580,13 +2083,19 @@ fn propagates_locally_generated_assignment_to_both_dimensions() { // Set up a gossip topology. setup_gossip_topology( overseer, - make_gossip_topology(1, &peers, &[0, 10, 20, 30], &[50, 51, 52, 53]), + make_gossip_topology( + 1, + &peers, + &[0, 10, 20, 30, 40, 60, 70, 80], + &[50, 51, 52, 53, 54, 55, 56, 57], + 1, + ), ) .await; let expected_indices = [ // Both dimensions in the gossip topology - 0, 10, 20, 30, 50, 51, 52, 53, + 0, 10, 20, 30, 40, 60, 70, 80, 50, 51, 52, 53, 54, 55, 56, 57, ]; // new block `hash_a` with 1 candidates @@ -1623,8 +2132,11 @@ fn propagates_locally_generated_assignment_to_both_dimensions() { ) .await; - overseer_send(overseer, ApprovalDistributionMessage::DistributeApproval(approval.clone())) - .await; + overseer_send( + overseer, + ApprovalDistributionMessage::DistributeApproval(approval.clone().into()), + ) + .await; let assignments = vec![(cert.clone(), candidate_index)]; let approvals = vec![approval.clone()]; @@ -1688,7 +2200,7 @@ fn propagates_assignments_along_unshared_dimension() { // Set up a gossip topology. setup_gossip_topology( overseer, - make_gossip_topology(1, &peers, &[0, 10, 20, 30], &[50, 51, 52, 53]), + make_gossip_topology(1, &peers, &[0, 10, 20, 30], &[50, 51, 52, 53], 1), ) .await; @@ -1831,13 +2343,19 @@ fn propagates_to_required_after_connect() { // Set up a gossip topology. setup_gossip_topology( overseer, - make_gossip_topology(1, &peers, &[0, 10, 20, 30], &[50, 51, 52, 53]), + make_gossip_topology( + 1, + &peers, + &[0, 10, 20, 30, 40, 60, 70, 80], + &[50, 51, 52, 53, 54, 55, 56, 57], + 1, + ), ) .await; let expected_indices = [ // Both dimensions in the gossip topology, minus omitted. - 20, 30, 52, 53, + 20, 30, 40, 60, 70, 80, 52, 53, 54, 55, 56, 57, ]; // new block `hash_a` with 1 candidates @@ -1874,8 +2392,11 @@ fn propagates_to_required_after_connect() { ) .await; - overseer_send(overseer, ApprovalDistributionMessage::DistributeApproval(approval.clone())) - .await; + overseer_send( + overseer, + ApprovalDistributionMessage::DistributeApproval(approval.clone().into()), + ) + .await; let assignments = vec![(cert.clone(), candidate_index)]; let approvals = vec![approval.clone()]; @@ -2002,53 +2523,21 @@ fn sends_to_more_peers_after_getting_topology() { ) .await; - overseer_send(overseer, ApprovalDistributionMessage::DistributeApproval(approval.clone())) - .await; + overseer_send( + overseer, + ApprovalDistributionMessage::DistributeApproval(approval.clone().into()), + ) + .await; let assignments = vec![(cert.clone(), candidate_index)]; let approvals = vec![approval.clone()]; - let mut expected_indices = vec![0, 10, 20, 30, 50, 51, 52, 53]; - let assignment_sent_peers = assert_matches!( - overseer_recv(overseer).await, - AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::SendValidationMessage( - sent_peers, - Versioned::V1(protocol_v1::ValidationProtocol::ApprovalDistribution( - protocol_v1::ApprovalDistributionMessage::Assignments(sent_assignments) - )) - )) => { - // Only sends to random peers. - assert_eq!(sent_peers.len(), 4); - for peer in &sent_peers { - let i = peers.iter().position(|p| peer == &p.0).unwrap(); - // Random gossip before topology can send to topology-targeted peers. - // Remove them from the expected indices so we don't expect - // them to get the messages again after the assignment. - expected_indices.retain(|&i2| i2 != i); - } - assert_eq!(sent_assignments, assignments); - sent_peers - } - ); - - assert_matches!( - overseer_recv(overseer).await, - AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::SendValidationMessage( - sent_peers, - Versioned::V1(protocol_v1::ValidationProtocol::ApprovalDistribution( - protocol_v1::ApprovalDistributionMessage::Approvals(sent_approvals) - )) - )) => { - // Random sampling is reused from the assignment. - assert_eq!(sent_peers, assignment_sent_peers); - assert_eq!(sent_approvals, approvals); - } - ); + let expected_indices = vec![0, 10, 20, 30, 50, 51, 52, 53]; // Set up a gossip topology. setup_gossip_topology( overseer, - make_gossip_topology(1, &peers, &[0, 10, 20, 30], &[50, 51, 52, 53]), + make_gossip_topology(1, &peers, &[0, 10, 20, 30], &[50, 51, 52, 53], 1), ) .await; @@ -2151,7 +2640,7 @@ fn originator_aggression_l1() { // Set up a gossip topology. setup_gossip_topology( overseer, - make_gossip_topology(1, &peers, &[0, 10, 20, 30], &[50, 51, 52, 53]), + make_gossip_topology(1, &peers, &[0, 10, 20, 30], &[50, 51, 52, 53], 1), ) .await; @@ -2164,8 +2653,11 @@ fn originator_aggression_l1() { ) .await; - overseer_send(overseer, ApprovalDistributionMessage::DistributeApproval(approval.clone())) - .await; + overseer_send( + overseer, + ApprovalDistributionMessage::DistributeApproval(approval.clone().into()), + ) + .await; let assignments = vec![(cert.clone(), candidate_index)]; let approvals = vec![approval.clone()]; @@ -2307,7 +2799,7 @@ fn non_originator_aggression_l1() { // Set up a gossip topology. setup_gossip_topology( overseer, - make_gossip_topology(1, &peers, &[0, 10, 20, 30], &[50, 51, 52, 53]), + make_gossip_topology(1, &peers, &[0, 10, 20, 30], &[50, 51, 52, 53], 1), ) .await; @@ -2412,7 +2904,7 @@ fn non_originator_aggression_l2() { // Set up a gossip topology. setup_gossip_topology( overseer, - make_gossip_topology(1, &peers, &[0, 10, 20, 30], &[50, 51, 52, 53]), + make_gossip_topology(1, &peers, &[0, 10, 20, 30], &[50, 51, 52, 53], 1), ) .await; @@ -2558,7 +3050,7 @@ fn resends_messages_periodically() { // Set up a gossip topology. setup_gossip_topology( overseer, - make_gossip_topology(1, &peers, &[0, 10, 20, 30], &[50, 51, 52, 53]), + make_gossip_topology(1, &peers, &[0, 10, 20, 30], &[50, 51, 52, 53], 1), ) .await; @@ -2681,12 +3173,13 @@ fn resends_messages_periodically() { /// Tests that peers correctly receive versioned messages. #[test] fn import_versioned_approval() { - let peer_a = PeerId::random(); - let peer_b = PeerId::random(); - let peer_c = PeerId::random(); + let peers = make_peers_and_authority_ids(15); + let peer_a = peers.get(0).unwrap().0; + let peer_b = peers.get(1).unwrap().0; + let peer_c = peers.get(2).unwrap().0; + let parent_hash = Hash::repeat_byte(0xFF); let hash = Hash::repeat_byte(0xAA); - let state = state_without_reputation_delay(); let _ = test_harness(state, |mut virtual_overseer| async move { let overseer = &mut virtual_overseer; @@ -2695,6 +3188,10 @@ fn import_versioned_approval() { setup_peer_with_view(overseer, &peer_b, view![hash], ValidationVersion::V1).await; setup_peer_with_view(overseer, &peer_c, view![hash], ValidationVersion::V2).await; + // Set up a gossip topology, where a, b, c and d are topology neighboors to the node under + // testing. + setup_gossip_topology(overseer, make_gossip_topology(1, &peers, &[0, 1], &[2, 4], 3)).await; + // new block `hash_a` with 1 candidates let meta = BlockApprovalMeta { hash, @@ -2762,7 +3259,7 @@ fn import_versioned_approval() { vote, tx, )) => { - assert_eq!(vote, approval); + assert_eq!(vote, approval.into()); tx.send(ApprovalCheckResult::Accepted).unwrap(); } ); @@ -2782,6 +3279,7 @@ fn import_versioned_approval() { assert_eq!(approvals.len(), 1); } ); + assert_matches!( overseer_recv(overseer).await, AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::SendValidationMessage( @@ -2821,9 +3319,9 @@ fn batch_test_round(message_count: usize) { .collect(); let approvals: Vec<_> = validators - .map(|index| IndirectSignedApprovalVote { + .map(|index| IndirectSignedApprovalVoteV2 { block_hash: Hash::zero(), - candidate_index: 0, + candidate_indices: 0u32.into(), validator: ValidatorIndex(index as u32), signature: dummy_signature(), }) @@ -2890,7 +3388,7 @@ fn batch_test_round(message_count: usize) { assert_eq!(peers.len(), 1); for (message_index, approval) in sent_approvals.iter().enumerate() { - assert_eq!(approval, &approvals[approval_index + message_index]); + assert_eq!(approval, &approvals[approval_index + message_index].clone().try_into().unwrap()); } } ); diff --git a/polkadot/node/network/bitfield-distribution/src/lib.rs b/polkadot/node/network/bitfield-distribution/src/lib.rs index 9cc79aee849..76baf499cad 100644 --- a/polkadot/node/network/bitfield-distribution/src/lib.rs +++ b/polkadot/node/network/bitfield-distribution/src/lib.rs @@ -32,7 +32,7 @@ use polkadot_node_network_protocol::{ GridNeighbors, RandomRouting, RequiredRouting, SessionBoundGridTopologyStorage, }, peer_set::{ProtocolVersion, ValidationVersion}, - v1 as protocol_v1, v2 as protocol_v2, vstaging as protocol_vstaging, OurView, PeerId, + v1 as protocol_v1, v2 as protocol_v2, v3 as protocol_v3, OurView, PeerId, UnifiedReputationChange as Rep, Versioned, View, }; use polkadot_node_subsystem::{ @@ -102,8 +102,8 @@ impl BitfieldGossipMessage { self.relay_parent, self.signed_availability.into(), )), - Some(ValidationVersion::VStaging) => - Versioned::VStaging(protocol_vstaging::BitfieldDistributionMessage::Bitfield( + Some(ValidationVersion::V3) => + Versioned::V3(protocol_v3::BitfieldDistributionMessage::Bitfield( self.relay_parent, self.signed_availability.into(), )), @@ -503,8 +503,8 @@ async fn relay_message( let v2_interested_peers = filter_by_peer_version(&interested_peers, ValidationVersion::V2.into()); - let vstaging_interested_peers = - filter_by_peer_version(&interested_peers, ValidationVersion::VStaging.into()); + let v3_interested_peers = + filter_by_peer_version(&interested_peers, ValidationVersion::V3.into()); if !v1_interested_peers.is_empty() { ctx.send_message(NetworkBridgeTxMessage::SendValidationMessage( @@ -522,10 +522,10 @@ async fn relay_message( .await } - if !vstaging_interested_peers.is_empty() { + if !v3_interested_peers.is_empty() { ctx.send_message(NetworkBridgeTxMessage::SendValidationMessage( - vstaging_interested_peers, - message.into_validation_protocol(ValidationVersion::VStaging.into()), + v3_interested_peers, + message.into_validation_protocol(ValidationVersion::V3.into()), )) .await } @@ -551,7 +551,7 @@ async fn process_incoming_peer_message( relay_parent, bitfield, )) | - Versioned::VStaging(protocol_vstaging::BitfieldDistributionMessage::Bitfield( + Versioned::V3(protocol_v3::BitfieldDistributionMessage::Bitfield( relay_parent, bitfield, )) => (relay_parent, bitfield), diff --git a/polkadot/node/network/bridge/src/network.rs b/polkadot/node/network/bridge/src/network.rs index a9339a5c443..2fcf5cec489 100644 --- a/polkadot/node/network/bridge/src/network.rs +++ b/polkadot/node/network/bridge/src/network.rs @@ -33,7 +33,7 @@ use sc_network::{ use polkadot_node_network_protocol::{ peer_set::{CollationVersion, PeerSet, ProtocolVersion, ValidationVersion}, request_response::{OutgoingRequest, Recipient, ReqProtocolNames, Requests}, - v1 as protocol_v1, v2 as protocol_v2, vstaging as protocol_vstaging, PeerId, + v1 as protocol_v1, v2 as protocol_v2, v3 as protocol_v3, PeerId, }; use polkadot_primitives::{AuthorityDiscoveryId, Block, Hash}; @@ -62,20 +62,20 @@ pub(crate) fn send_validation_message_v1( ); } -// Helper function to send a validation vstaging message to a list of peers. +// Helper function to send a validation v3 message to a list of peers. // Messages are always sent via the main protocol, even legacy protocol messages. -pub(crate) fn send_validation_message_vstaging( +pub(crate) fn send_validation_message_v3( peers: Vec, - message: WireMessage, + message: WireMessage, metrics: &Metrics, notification_sinks: &Arc>>>, ) { - gum::trace!(target: LOG_TARGET, ?peers, ?message, "Sending validation vstaging message to peers",); + gum::trace!(target: LOG_TARGET, ?peers, ?message, "Sending validation v3 message to peers",); send_message( peers, PeerSet::Validation, - ValidationVersion::VStaging.into(), + ValidationVersion::V3.into(), message, metrics, notification_sinks, diff --git a/polkadot/node/network/bridge/src/rx/mod.rs b/polkadot/node/network/bridge/src/rx/mod.rs index 40cd167a968..49d81aea76a 100644 --- a/polkadot/node/network/bridge/src/rx/mod.rs +++ b/polkadot/node/network/bridge/src/rx/mod.rs @@ -37,8 +37,8 @@ use polkadot_node_network_protocol::{ CollationVersion, PeerSet, PeerSetProtocolNames, PerPeerSet, ProtocolVersion, ValidationVersion, }, - v1 as protocol_v1, v2 as protocol_v2, vstaging as protocol_vstaging, ObservedRole, OurView, - PeerId, UnifiedReputationChange as Rep, View, + v1 as protocol_v1, v2 as protocol_v2, v3 as protocol_v3, ObservedRole, OurView, PeerId, + UnifiedReputationChange as Rep, View, }; use polkadot_node_subsystem::{ @@ -70,7 +70,7 @@ use super::validator_discovery; /// Defines the `Network` trait with an implementation for an `Arc`. use crate::network::{ send_collation_message_v1, send_collation_message_v2, send_validation_message_v1, - send_validation_message_v2, send_validation_message_vstaging, Network, + send_validation_message_v2, send_validation_message_v3, Network, }; use crate::{network::get_peer_id_by_authority_id, WireMessage}; @@ -294,9 +294,9 @@ async fn handle_validation_message( metrics, notification_sinks, ), - ValidationVersion::VStaging => send_validation_message_vstaging( + ValidationVersion::V3 => send_validation_message_v3( vec![peer], - WireMessage::::ViewUpdate(local_view), + WireMessage::::ViewUpdate(local_view), metrics, notification_sinks, ), @@ -360,48 +360,47 @@ async fn handle_validation_message( ?peer, ); - let (events, reports) = - if expected_versions[PeerSet::Validation] == Some(ValidationVersion::V1.into()) { - handle_peer_messages::( - peer, - PeerSet::Validation, - &mut shared.0.lock().validation_peers, - vec![notification.into()], - metrics, - ) - } else if expected_versions[PeerSet::Validation] == - Some(ValidationVersion::V2.into()) - { - handle_peer_messages::( - peer, - PeerSet::Validation, - &mut shared.0.lock().validation_peers, - vec![notification.into()], - metrics, - ) - } else if expected_versions[PeerSet::Validation] == - Some(ValidationVersion::VStaging.into()) - { - handle_peer_messages::( - peer, - PeerSet::Validation, - &mut shared.0.lock().validation_peers, - vec![notification.into()], - metrics, - ) - } else { - gum::warn!( - target: LOG_TARGET, - version = ?expected_versions[PeerSet::Validation], - "Major logic bug. Peer somehow has unsupported validation protocol version." - ); + let (events, reports) = if expected_versions[PeerSet::Validation] == + Some(ValidationVersion::V1.into()) + { + handle_peer_messages::( + peer, + PeerSet::Validation, + &mut shared.0.lock().validation_peers, + vec![notification.into()], + metrics, + ) + } else if expected_versions[PeerSet::Validation] == Some(ValidationVersion::V2.into()) { + handle_peer_messages::( + peer, + PeerSet::Validation, + &mut shared.0.lock().validation_peers, + vec![notification.into()], + metrics, + ) + } else if expected_versions[PeerSet::Validation] == Some(ValidationVersion::V3.into()) { + handle_peer_messages::( + peer, + PeerSet::Validation, + &mut shared.0.lock().validation_peers, + vec![notification.into()], + metrics, + ) + } else { + gum::warn!( + target: LOG_TARGET, + version = ?expected_versions[PeerSet::Validation], + "Major logic bug. Peer somehow has unsupported validation protocol version." + ); - never!("Only versions 1 and 2 are supported; peer set connection checked above; qed"); + never!( + "Only versions 1 and 2 are supported; peer set connection checked above; qed" + ); - // If a peer somehow triggers this, we'll disconnect them - // eventually. - (Vec::new(), vec![UNCONNECTED_PEERSET_COST]) - }; + // If a peer somehow triggers this, we'll disconnect them + // eventually. + (Vec::new(), vec![UNCONNECTED_PEERSET_COST]) + }; for report in reports { network_service.report_peer(peer, report.into()); @@ -980,8 +979,8 @@ fn update_our_view( filter_by_peer_version(&validation_peers, ValidationVersion::V2.into()); let v2_collation_peers = filter_by_peer_version(&collation_peers, CollationVersion::V2.into()); - let vstaging_validation_peers = - filter_by_peer_version(&validation_peers, ValidationVersion::VStaging.into()); + let v3_validation_peers = + filter_by_peer_version(&validation_peers, ValidationVersion::V3.into()); send_validation_message_v1( v1_validation_peers, @@ -1011,8 +1010,8 @@ fn update_our_view( notification_sinks, ); - send_validation_message_vstaging( - vstaging_validation_peers, + send_validation_message_v3( + v3_validation_peers, WireMessage::ViewUpdate(new_view.clone()), metrics, notification_sinks, diff --git a/polkadot/node/network/bridge/src/rx/tests.rs b/polkadot/node/network/bridge/src/rx/tests.rs index e0b86feb644..6847b8a7e24 100644 --- a/polkadot/node/network/bridge/src/rx/tests.rs +++ b/polkadot/node/network/bridge/src/rx/tests.rs @@ -224,7 +224,7 @@ impl TestNetworkHandle { PeerSet::Validation => Some(ProtocolName::from("/polkadot/validation/1")), PeerSet::Collation => Some(ProtocolName::from("/polkadot/collation/1")), }, - ValidationVersion::VStaging => match peer_set { + ValidationVersion::V3 => match peer_set { PeerSet::Validation => Some(ProtocolName::from("/polkadot/validation/3")), PeerSet::Collation => unreachable!(), }, @@ -1433,8 +1433,8 @@ fn network_protocol_versioning_view_update() { ValidationVersion::V2 => WireMessage::::ViewUpdate(view.clone()) .encode(), - ValidationVersion::VStaging => - WireMessage::::ViewUpdate(view.clone()) + ValidationVersion::V3 => + WireMessage::::ViewUpdate(view.clone()) .encode(), }; assert_network_actions_contains( @@ -1469,7 +1469,7 @@ fn network_protocol_versioning_subsystem_msg() { NetworkBridgeEvent::PeerConnected( peer, ObservedRole::Full, - ValidationVersion::V2.into(), + ValidationVersion::V3.into(), None, ), &mut virtual_overseer, @@ -1484,9 +1484,9 @@ fn network_protocol_versioning_subsystem_msg() { } let approval_distribution_message = - protocol_v2::ApprovalDistributionMessage::Approvals(Vec::new()); + protocol_v3::ApprovalDistributionMessage::Approvals(Vec::new()); - let msg = protocol_v2::ValidationProtocol::ApprovalDistribution( + let msg = protocol_v3::ValidationProtocol::ApprovalDistribution( approval_distribution_message.clone(), ); @@ -1502,7 +1502,7 @@ fn network_protocol_versioning_subsystem_msg() { virtual_overseer.recv().await, AllMessages::ApprovalDistribution( ApprovalDistributionMessage::NetworkBridgeUpdate( - NetworkBridgeEvent::PeerMessage(p, Versioned::V2(m)) + NetworkBridgeEvent::PeerMessage(p, Versioned::V3(m)) ) ) => { assert_eq!(p, peer); @@ -1536,7 +1536,7 @@ fn network_protocol_versioning_subsystem_msg() { virtual_overseer.recv().await, AllMessages::StatementDistribution( StatementDistributionMessage::NetworkBridgeUpdate( - NetworkBridgeEvent::PeerMessage(p, Versioned::V2(m)) + NetworkBridgeEvent::PeerMessage(p, Versioned::V3(m)) ) ) => { assert_eq!(p, peer); diff --git a/polkadot/node/network/bridge/src/tx/mod.rs b/polkadot/node/network/bridge/src/tx/mod.rs index bdcd1574e33..22802608e1d 100644 --- a/polkadot/node/network/bridge/src/tx/mod.rs +++ b/polkadot/node/network/bridge/src/tx/mod.rs @@ -41,7 +41,7 @@ use crate::validator_discovery; /// Defines the `Network` trait with an implementation for an `Arc`. use crate::network::{ send_collation_message_v1, send_collation_message_v2, send_validation_message_v1, - send_validation_message_v2, send_validation_message_vstaging, Network, + send_validation_message_v2, send_validation_message_v3, Network, }; use crate::metrics::Metrics; @@ -205,7 +205,7 @@ where &metrics, notification_sinks, ), - Versioned::VStaging(msg) => send_validation_message_vstaging( + Versioned::V3(msg) => send_validation_message_v3( peers, WireMessage::ProtocolMessage(msg), &metrics, @@ -235,7 +235,7 @@ where &metrics, notification_sinks, ), - Versioned::VStaging(msg) => send_validation_message_vstaging( + Versioned::V3(msg) => send_validation_message_v3( peers, WireMessage::ProtocolMessage(msg), &metrics, @@ -264,7 +264,7 @@ where &metrics, notification_sinks, ), - Versioned::V2(msg) | Versioned::VStaging(msg) => send_collation_message_v2( + Versioned::V2(msg) | Versioned::V3(msg) => send_collation_message_v2( peers, WireMessage::ProtocolMessage(msg), &metrics, @@ -287,7 +287,7 @@ where &metrics, notification_sinks, ), - Versioned::V2(msg) | Versioned::VStaging(msg) => send_collation_message_v2( + Versioned::V2(msg) | Versioned::V3(msg) => send_collation_message_v2( peers, WireMessage::ProtocolMessage(msg), &metrics, diff --git a/polkadot/node/network/collator-protocol/src/collator_side/mod.rs b/polkadot/node/network/collator-protocol/src/collator_side/mod.rs index b3a396e1be3..8fb0bb21544 100644 --- a/polkadot/node/network/collator-protocol/src/collator_side/mod.rs +++ b/polkadot/node/network/collator-protocol/src/collator_side/mod.rs @@ -882,7 +882,7 @@ async fn handle_incoming_peer_message( match msg { Versioned::V1(V1::Declare(..)) | Versioned::V2(V2::Declare(..)) | - Versioned::VStaging(V2::Declare(..)) => { + Versioned::V3(V2::Declare(..)) => { gum::trace!( target: LOG_TARGET, ?origin, @@ -895,7 +895,7 @@ async fn handle_incoming_peer_message( }, Versioned::V1(V1::AdvertiseCollation(_)) | Versioned::V2(V2::AdvertiseCollation { .. }) | - Versioned::VStaging(V2::AdvertiseCollation { .. }) => { + Versioned::V3(V2::AdvertiseCollation { .. }) => { gum::trace!( target: LOG_TARGET, ?origin, @@ -911,7 +911,7 @@ async fn handle_incoming_peer_message( }, Versioned::V1(V1::CollationSeconded(relay_parent, statement)) | Versioned::V2(V2::CollationSeconded(relay_parent, statement)) | - Versioned::VStaging(V2::CollationSeconded(relay_parent, statement)) => { + Versioned::V3(V2::CollationSeconded(relay_parent, statement)) => { if !matches!(statement.unchecked_payload(), Statement::Seconded(_)) { gum::warn!( target: LOG_TARGET, diff --git a/polkadot/node/network/collator-protocol/src/validator_side/mod.rs b/polkadot/node/network/collator-protocol/src/validator_side/mod.rs index 20b3b9ea1d2..48ad3c711a6 100644 --- a/polkadot/node/network/collator-protocol/src/validator_side/mod.rs +++ b/polkadot/node/network/collator-protocol/src/validator_side/mod.rs @@ -777,7 +777,7 @@ async fn process_incoming_peer_message( match msg { Versioned::V1(V1::Declare(collator_id, para_id, signature)) | Versioned::V2(V2::Declare(collator_id, para_id, signature)) | - Versioned::VStaging(V2::Declare(collator_id, para_id, signature)) => { + Versioned::V3(V2::Declare(collator_id, para_id, signature)) => { if collator_peer_id(&state.peer_data, &collator_id).is_some() { modify_reputation( &mut state.reputation, @@ -894,7 +894,7 @@ async fn process_incoming_peer_message( candidate_hash, parent_head_data_hash, }) | - Versioned::VStaging(V2::AdvertiseCollation { + Versioned::V3(V2::AdvertiseCollation { relay_parent, candidate_hash, parent_head_data_hash, @@ -923,7 +923,7 @@ async fn process_incoming_peer_message( }, Versioned::V1(V1::CollationSeconded(..)) | Versioned::V2(V2::CollationSeconded(..)) | - Versioned::VStaging(V2::CollationSeconded(..)) => { + Versioned::V3(V2::CollationSeconded(..)) => { gum::warn!( target: LOG_TARGET, peer_id = ?origin, diff --git a/polkadot/node/network/gossip-support/src/lib.rs b/polkadot/node/network/gossip-support/src/lib.rs index 0d1b04f2ba2..22417795d5e 100644 --- a/polkadot/node/network/gossip-support/src/lib.rs +++ b/polkadot/node/network/gossip-support/src/lib.rs @@ -477,7 +477,7 @@ where match message { Versioned::V1(m) => match m {}, Versioned::V2(m) => match m {}, - Versioned::VStaging(m) => match m {}, + Versioned::V3(m) => match m {}, } }, } diff --git a/polkadot/node/network/protocol/Cargo.toml b/polkadot/node/network/protocol/Cargo.toml index c33b9eae325..379334ded24 100644 --- a/polkadot/node/network/protocol/Cargo.toml +++ b/polkadot/node/network/protocol/Cargo.toml @@ -27,6 +27,3 @@ bitvec = "1" [dev-dependencies] rand_chacha = "0.3.1" - -[features] -network-protocol-staging = [] diff --git a/polkadot/node/network/protocol/src/grid_topology.rs b/polkadot/node/network/protocol/src/grid_topology.rs index 99dd513c4d7..8bd9adbc17c 100644 --- a/polkadot/node/network/protocol/src/grid_topology.rs +++ b/polkadot/node/network/protocol/src/grid_topology.rs @@ -73,12 +73,20 @@ pub struct SessionGridTopology { shuffled_indices: Vec, /// The canonical shuffling of validators for the session. canonical_shuffling: Vec, + /// The list of peer-ids in an efficient way to search. + peer_ids: HashSet, } impl SessionGridTopology { /// Create a new session grid topology. pub fn new(shuffled_indices: Vec, canonical_shuffling: Vec) -> Self { - SessionGridTopology { shuffled_indices, canonical_shuffling } + let mut peer_ids = HashSet::new(); + for peer_info in canonical_shuffling.iter() { + for peer_id in peer_info.peer_ids.iter() { + peer_ids.insert(*peer_id); + } + } + SessionGridTopology { shuffled_indices, canonical_shuffling, peer_ids } } /// Produces the outgoing routing logic for a particular peer. @@ -111,6 +119,11 @@ impl SessionGridTopology { Some(grid_subset) } + + /// Tells if a given peer id is validator in a session + pub fn is_validator(&self, peer: &PeerId) -> bool { + self.peer_ids.contains(peer) + } } struct MatrixNeighbors { @@ -273,6 +286,11 @@ impl SessionGridTopologyEntry { pub fn get(&self) -> &SessionGridTopology { &self.topology } + + /// Tells if a given peer id is validator in a session + pub fn is_validator(&self, peer: &PeerId) -> bool { + self.topology.is_validator(peer) + } } /// A set of topologies indexed by session @@ -347,6 +365,7 @@ impl Default for SessionBoundGridTopologyStorage { topology: SessionGridTopology { shuffled_indices: Vec::new(), canonical_shuffling: Vec::new(), + peer_ids: Default::default(), }, local_neighbors: GridNeighbors::empty(), }, diff --git a/polkadot/node/network/protocol/src/lib.rs b/polkadot/node/network/protocol/src/lib.rs index 9aeeb98ea9d..ae72230ee43 100644 --- a/polkadot/node/network/protocol/src/lib.rs +++ b/polkadot/node/network/protocol/src/lib.rs @@ -253,29 +253,29 @@ impl View { /// A protocol-versioned type. #[derive(Debug, Clone, PartialEq, Eq)] -pub enum Versioned { +pub enum Versioned { /// V1 type. V1(V1), /// V2 type. V2(V2), - /// VStaging type - VStaging(VStaging), + /// V3 type + V3(V3), } -impl Versioned<&'_ V1, &'_ V2, &'_ VStaging> { +impl Versioned<&'_ V1, &'_ V2, &'_ V3> { /// Convert to a fully-owned version of the message. - pub fn clone_inner(&self) -> Versioned { + pub fn clone_inner(&self) -> Versioned { match *self { Versioned::V1(inner) => Versioned::V1(inner.clone()), Versioned::V2(inner) => Versioned::V2(inner.clone()), - Versioned::VStaging(inner) => Versioned::VStaging(inner.clone()), + Versioned::V3(inner) => Versioned::V3(inner.clone()), } } } /// All supported versions of the validation protocol message. pub type VersionedValidationProtocol = - Versioned; + Versioned; impl From for VersionedValidationProtocol { fn from(v1: v1::ValidationProtocol) -> Self { @@ -289,9 +289,9 @@ impl From for VersionedValidationProtocol { } } -impl From for VersionedValidationProtocol { - fn from(vstaging: vstaging::ValidationProtocol) -> Self { - VersionedValidationProtocol::VStaging(vstaging) +impl From for VersionedValidationProtocol { + fn from(v3: v3::ValidationProtocol) -> Self { + VersionedValidationProtocol::V3(v3) } } @@ -317,7 +317,7 @@ macro_rules! impl_versioned_full_protocol_from { match versioned_from { Versioned::V1(x) => Versioned::V1(x.into()), Versioned::V2(x) => Versioned::V2(x.into()), - Versioned::VStaging(x) => Versioned::VStaging(x.into()), + Versioned::V3(x) => Versioned::V3(x.into()), } } } @@ -331,7 +331,7 @@ macro_rules! impl_versioned_try_from { $out:ty, $v1_pat:pat => $v1_out:expr, $v2_pat:pat => $v2_out:expr, - $vstaging_pat:pat => $vstaging_out:expr + $v3_pat:pat => $v3_out:expr ) => { impl TryFrom<$from> for $out { type Error = crate::WrongVariant; @@ -341,7 +341,7 @@ macro_rules! impl_versioned_try_from { match x { Versioned::V1($v1_pat) => Ok(Versioned::V1($v1_out)), Versioned::V2($v2_pat) => Ok(Versioned::V2($v2_out)), - Versioned::VStaging($vstaging_pat) => Ok(Versioned::VStaging($vstaging_out)), + Versioned::V3($v3_pat) => Ok(Versioned::V3($v3_out)), _ => Err(crate::WrongVariant), } } @@ -355,8 +355,7 @@ macro_rules! impl_versioned_try_from { match x { Versioned::V1($v1_pat) => Ok(Versioned::V1($v1_out.clone())), Versioned::V2($v2_pat) => Ok(Versioned::V2($v2_out.clone())), - Versioned::VStaging($vstaging_pat) => - Ok(Versioned::VStaging($vstaging_out.clone())), + Versioned::V3($v3_pat) => Ok(Versioned::V3($v3_out.clone())), _ => Err(crate::WrongVariant), } } @@ -368,7 +367,7 @@ macro_rules! impl_versioned_try_from { pub type BitfieldDistributionMessage = Versioned< v1::BitfieldDistributionMessage, v2::BitfieldDistributionMessage, - vstaging::BitfieldDistributionMessage, + v3::BitfieldDistributionMessage, >; impl_versioned_full_protocol_from!( BitfieldDistributionMessage, @@ -380,14 +379,14 @@ impl_versioned_try_from!( BitfieldDistributionMessage, v1::ValidationProtocol::BitfieldDistribution(x) => x, v2::ValidationProtocol::BitfieldDistribution(x) => x, - vstaging::ValidationProtocol::BitfieldDistribution(x) => x + v3::ValidationProtocol::BitfieldDistribution(x) => x ); /// Version-annotated messages used by the statement distribution subsystem. pub type StatementDistributionMessage = Versioned< v1::StatementDistributionMessage, v2::StatementDistributionMessage, - vstaging::StatementDistributionMessage, + v3::StatementDistributionMessage, >; impl_versioned_full_protocol_from!( StatementDistributionMessage, @@ -399,14 +398,14 @@ impl_versioned_try_from!( StatementDistributionMessage, v1::ValidationProtocol::StatementDistribution(x) => x, v2::ValidationProtocol::StatementDistribution(x) => x, - vstaging::ValidationProtocol::StatementDistribution(x) => x + v3::ValidationProtocol::StatementDistribution(x) => x ); /// Version-annotated messages used by the approval distribution subsystem. pub type ApprovalDistributionMessage = Versioned< v1::ApprovalDistributionMessage, v2::ApprovalDistributionMessage, - vstaging::ApprovalDistributionMessage, + v3::ApprovalDistributionMessage, >; impl_versioned_full_protocol_from!( ApprovalDistributionMessage, @@ -418,7 +417,7 @@ impl_versioned_try_from!( ApprovalDistributionMessage, v1::ValidationProtocol::ApprovalDistribution(x) => x, v2::ValidationProtocol::ApprovalDistribution(x) => x, - vstaging::ValidationProtocol::ApprovalDistribution(x) => x + v3::ValidationProtocol::ApprovalDistribution(x) => x ); @@ -426,7 +425,7 @@ impl_versioned_try_from!( pub type GossipSupportNetworkMessage = Versioned< v1::GossipSupportNetworkMessage, v2::GossipSupportNetworkMessage, - vstaging::GossipSupportNetworkMessage, + v3::GossipSupportNetworkMessage, >; // This is a void enum placeholder, so never gets sent over the wire. @@ -871,19 +870,17 @@ pub mod v2 { } } -/// vstaging network protocol types, intended to become v3. -/// Initial purpose is for chaning ApprovalDistributionMessage to -/// include more than one assignment in the message. -pub mod vstaging { +/// v3 network protocol types. +/// Purpose is for chaning ApprovalDistributionMessage to +/// include more than one assignment and approval in a message. +pub mod v3 { use parity_scale_codec::{Decode, Encode}; - use polkadot_node_primitives::approval::{ - v1::IndirectSignedApprovalVote, - v2::{CandidateBitfield, IndirectAssignmentCertV2}, + use polkadot_node_primitives::approval::v2::{ + CandidateBitfield, IndirectAssignmentCertV2, IndirectSignedApprovalVoteV2, }; - /// This parts of the protocol did not change from v2, so just alias them in vstaging, - /// no reason why they can't be change untill vstaging becomes v3 and is released. + /// This parts of the protocol did not change from v2, so just alias them in v3. pub use super::v2::{ declare_signature_payload, BackedCandidateAcknowledgement, BackedCandidateManifest, BitfieldDistributionMessage, GossipSupportNetworkMessage, StatementDistributionMessage, @@ -903,7 +900,7 @@ pub mod vstaging { Assignments(Vec<(IndirectAssignmentCertV2, CandidateBitfield)>), /// Approvals for candidates in some recent, unfinalized block. #[codec(index = 1)] - Approvals(Vec), + Approvals(Vec), } /// All network messages on the validation peer-set. diff --git a/polkadot/node/network/protocol/src/peer_set.rs b/polkadot/node/network/protocol/src/peer_set.rs index 7e257d508b5..cb329607ad6 100644 --- a/polkadot/node/network/protocol/src/peer_set.rs +++ b/polkadot/node/network/protocol/src/peer_set.rs @@ -73,7 +73,11 @@ impl PeerSet { // Networking layer relies on `get_main_name()` being the main name of the protocol // for peersets and connection management. let protocol = peerset_protocol_names.get_main_name(self); - let fallback_names = PeerSetProtocolNames::get_fallback_names(self); + let fallback_names = PeerSetProtocolNames::get_fallback_names( + self, + &peerset_protocol_names.genesis_hash, + peerset_protocol_names.fork_id.as_deref(), + ); let max_notification_size = self.get_max_notification_size(is_authority); match self { @@ -127,15 +131,8 @@ impl PeerSet { /// Networking layer relies on `get_main_version()` being the version /// of the main protocol name reported by [`PeerSetProtocolNames::get_main_name()`]. pub fn get_main_version(self) -> ProtocolVersion { - #[cfg(not(feature = "network-protocol-staging"))] - match self { - PeerSet::Validation => ValidationVersion::V2.into(), - PeerSet::Collation => CollationVersion::V2.into(), - } - - #[cfg(feature = "network-protocol-staging")] match self { - PeerSet::Validation => ValidationVersion::VStaging.into(), + PeerSet::Validation => ValidationVersion::V3.into(), PeerSet::Collation => CollationVersion::V2.into(), } } @@ -163,7 +160,7 @@ impl PeerSet { Some("validation/1") } else if version == ValidationVersion::V2.into() { Some("validation/2") - } else if version == ValidationVersion::VStaging.into() { + } else if version == ValidationVersion::V3.into() { Some("validation/3") } else { None @@ -236,9 +233,10 @@ pub enum ValidationVersion { V1 = 1, /// The second version. V2 = 2, - /// The staging version to gather changes - /// that before the release become v3. - VStaging = 3, + /// The third version where changes to ApprovalDistributionMessage had been made. + /// The changes are translatable to V2 format untill assignments v2 and approvals + /// coalescing is enabled through a runtime upgrade. + V3 = 3, } /// Supported collation protocol versions. Only versions defined here must be used in the codebase. @@ -299,6 +297,8 @@ impl From for ProtocolVersion { pub struct PeerSetProtocolNames { protocols: HashMap, names: HashMap<(PeerSet, ProtocolVersion), ProtocolName>, + genesis_hash: Hash, + fork_id: Option, } impl PeerSetProtocolNames { @@ -333,7 +333,7 @@ impl PeerSetProtocolNames { } Self::register_legacy_protocol(&mut protocols, protocol); } - Self { protocols, names } + Self { protocols, names, genesis_hash, fork_id: fork_id.map(|fork_id| fork_id.into()) } } /// Helper function to register main protocol. @@ -437,9 +437,30 @@ impl PeerSetProtocolNames { } /// Get the protocol fallback names. Currently only holds the legacy name - /// for `LEGACY_PROTOCOL_VERSION` = 1. - fn get_fallback_names(protocol: PeerSet) -> Vec { - std::iter::once(Self::get_legacy_name(protocol)).collect() + /// for `LEGACY_PROTOCOL_VERSION` = 1 and v2 for validation. + fn get_fallback_names( + protocol: PeerSet, + genesis_hash: &Hash, + fork_id: Option<&str>, + ) -> Vec { + let mut fallbacks = vec![Self::get_legacy_name(protocol)]; + match protocol { + PeerSet::Validation => { + // Fallbacks are tried one by one, till one matches so push v2 at the top, so + // that it is used ahead of the legacy one(v1). + fallbacks.insert( + 0, + Self::generate_name( + genesis_hash, + fork_id, + protocol, + ValidationVersion::V2.into(), + ), + ) + }, + PeerSet::Collation => {}, + }; + fallbacks } } diff --git a/polkadot/node/network/statement-distribution/src/legacy_v1/mod.rs b/polkadot/node/network/statement-distribution/src/legacy_v1/mod.rs index d9866af1ee2..93f97fe1dd6 100644 --- a/polkadot/node/network/statement-distribution/src/legacy_v1/mod.rs +++ b/polkadot/node/network/statement-distribution/src/legacy_v1/mod.rs @@ -22,8 +22,8 @@ use polkadot_node_network_protocol::{ grid_topology::{GridNeighbors, RequiredRouting, SessionBoundGridTopologyStorage}, peer_set::{IsAuthority, PeerSet, ValidationVersion}, v1::{self as protocol_v1, StatementMetadata}, - v2 as protocol_v2, vstaging as protocol_vstaging, IfDisconnected, PeerId, - UnifiedReputationChange as Rep, Versioned, View, + v2 as protocol_v2, v3 as protocol_v3, IfDisconnected, PeerId, UnifiedReputationChange as Rep, + Versioned, View, }; use polkadot_node_primitives::{ SignedFullStatement, Statement, StatementWithPVD, UncheckedSignedFullStatement, @@ -1075,7 +1075,7 @@ async fn circulate_statement<'a, Context>( }) .partition::, _>(|(_, _, version)| match version { ValidationVersion::V1 => true, - ValidationVersion::V2 | ValidationVersion::VStaging => false, + ValidationVersion::V2 | ValidationVersion::V3 => false, }); // partition is handy here but not if we add more protocol versions let payload = v1_statement_message(relay_parent, stored.statement.clone(), metrics); @@ -1108,8 +1108,7 @@ async fn circulate_statement<'a, Context>( .collect(); let v2_peers_to_send = filter_by_peer_version(&peers_to_send, ValidationVersion::V2.into()); - let vstaging_to_send = - filter_by_peer_version(&peers_to_send, ValidationVersion::VStaging.into()); + let v3_to_send = filter_by_peer_version(&peers_to_send, ValidationVersion::V3.into()); if !v2_peers_to_send.is_empty() { gum::trace!( @@ -1126,17 +1125,17 @@ async fn circulate_statement<'a, Context>( .await; } - if !vstaging_to_send.is_empty() { + if !v3_to_send.is_empty() { gum::trace!( target: LOG_TARGET, - ?vstaging_to_send, + ?v3_to_send, ?relay_parent, statement = ?stored.statement, - "Sending statement to vstaging peers", + "Sending statement to v3 peers", ); ctx.send_message(NetworkBridgeTxMessage::SendValidationMessage( - vstaging_to_send, - compatible_v1_message(ValidationVersion::VStaging, payload.clone()).into(), + v3_to_send, + compatible_v1_message(ValidationVersion::V3, payload.clone()).into(), )) .await; } @@ -1472,10 +1471,8 @@ async fn handle_incoming_message<'a, Context>( let message = match message { Versioned::V1(m) => m, Versioned::V2(protocol_v2::StatementDistributionMessage::V1Compatibility(m)) | - Versioned::VStaging(protocol_vstaging::StatementDistributionMessage::V1Compatibility( - m, - )) => m, - Versioned::V2(_) | Versioned::VStaging(_) => { + Versioned::V3(protocol_v3::StatementDistributionMessage::V1Compatibility(m)) => m, + Versioned::V2(_) | Versioned::V3(_) => { // The higher-level subsystem code is supposed to filter out // all non v1 messages. gum::debug!( @@ -2201,8 +2198,7 @@ fn compatible_v1_message( ValidationVersion::V1 => Versioned::V1(message), ValidationVersion::V2 => Versioned::V2(protocol_v2::StatementDistributionMessage::V1Compatibility(message)), - ValidationVersion::VStaging => Versioned::VStaging( - protocol_vstaging::StatementDistributionMessage::V1Compatibility(message), - ), + ValidationVersion::V3 => + Versioned::V3(protocol_v3::StatementDistributionMessage::V1Compatibility(message)), } } diff --git a/polkadot/node/network/statement-distribution/src/lib.rs b/polkadot/node/network/statement-distribution/src/lib.rs index ef1fc7cd78b..a1ba1137b5a 100644 --- a/polkadot/node/network/statement-distribution/src/lib.rs +++ b/polkadot/node/network/statement-distribution/src/lib.rs @@ -27,7 +27,7 @@ use std::time::Duration; use polkadot_node_network_protocol::{ request_response::{v1 as request_v1, v2::AttestedCandidateRequest, IncomingRequestReceiver}, - v2 as protocol_v2, vstaging as protocol_vstaging, Versioned, + v2 as protocol_v2, v3 as protocol_v3, Versioned, }; use polkadot_node_primitives::StatementWithPVD; use polkadot_node_subsystem::{ @@ -400,11 +400,11 @@ impl StatementDistributionSubsystem { Versioned::V2( protocol_v2::StatementDistributionMessage::V1Compatibility(_), ) | - Versioned::VStaging( - protocol_vstaging::StatementDistributionMessage::V1Compatibility(_), + Versioned::V3( + protocol_v3::StatementDistributionMessage::V1Compatibility(_), ) => VersionTarget::Legacy, Versioned::V1(_) => VersionTarget::Legacy, - Versioned::V2(_) | Versioned::VStaging(_) => VersionTarget::Current, + Versioned::V2(_) | Versioned::V3(_) => VersionTarget::Current, }, _ => VersionTarget::Both, }; diff --git a/polkadot/node/network/statement-distribution/src/v2/mod.rs b/polkadot/node/network/statement-distribution/src/v2/mod.rs index 406f1130590..2f06d3685b8 100644 --- a/polkadot/node/network/statement-distribution/src/v2/mod.rs +++ b/polkadot/node/network/statement-distribution/src/v2/mod.rs @@ -29,8 +29,7 @@ use polkadot_node_network_protocol::{ MAX_PARALLEL_ATTESTED_CANDIDATE_REQUESTS, }, v2::{self as protocol_v2, StatementFilter}, - vstaging as protocol_vstaging, IfDisconnected, PeerId, UnifiedReputationChange as Rep, - Versioned, View, + v3 as protocol_v3, IfDisconnected, PeerId, UnifiedReputationChange as Rep, Versioned, View, }; use polkadot_node_primitives::{ SignedFullStatementWithPVD, StatementWithPVD as FullStatementWithPVD, @@ -366,7 +365,7 @@ pub(crate) async fn handle_network_update( gum::trace!(target: LOG_TARGET, ?peer_id, ?role, ?protocol_version, "Peer connected"); let versioned_protocol = if protocol_version != ValidationVersion::V2.into() && - protocol_version != ValidationVersion::VStaging.into() + protocol_version != ValidationVersion::V3.into() { return } else { @@ -432,28 +431,28 @@ pub(crate) async fn handle_network_update( net_protocol::StatementDistributionMessage::V2( protocol_v2::StatementDistributionMessage::V1Compatibility(_), ) | - net_protocol::StatementDistributionMessage::VStaging( - protocol_vstaging::StatementDistributionMessage::V1Compatibility(_), + net_protocol::StatementDistributionMessage::V3( + protocol_v3::StatementDistributionMessage::V1Compatibility(_), ) => return, net_protocol::StatementDistributionMessage::V2( protocol_v2::StatementDistributionMessage::Statement(relay_parent, statement), ) | - net_protocol::StatementDistributionMessage::VStaging( - protocol_vstaging::StatementDistributionMessage::Statement(relay_parent, statement), + net_protocol::StatementDistributionMessage::V3( + protocol_v3::StatementDistributionMessage::Statement(relay_parent, statement), ) => handle_incoming_statement(ctx, state, peer_id, relay_parent, statement, reputation) .await, net_protocol::StatementDistributionMessage::V2( protocol_v2::StatementDistributionMessage::BackedCandidateManifest(inner), ) | - net_protocol::StatementDistributionMessage::VStaging( - protocol_vstaging::StatementDistributionMessage::BackedCandidateManifest(inner), + net_protocol::StatementDistributionMessage::V3( + protocol_v3::StatementDistributionMessage::BackedCandidateManifest(inner), ) => handle_incoming_manifest(ctx, state, peer_id, inner, reputation).await, net_protocol::StatementDistributionMessage::V2( protocol_v2::StatementDistributionMessage::BackedCandidateKnown(inner), ) | - net_protocol::StatementDistributionMessage::VStaging( - protocol_vstaging::StatementDistributionMessage::BackedCandidateKnown(inner), + net_protocol::StatementDistributionMessage::V3( + protocol_v3::StatementDistributionMessage::BackedCandidateKnown(inner), ) => handle_incoming_acknowledgement(ctx, state, peer_id, inner, reputation).await, }, NetworkBridgeEvent::PeerViewChange(peer_id, view) => @@ -806,13 +805,13 @@ fn pending_statement_network_message( protocol_v2::StatementDistributionMessage::Statement(relay_parent, signed) }) .map(|msg| (vec![peer.0], Versioned::V2(msg).into())), - ValidationVersion::VStaging => statement_store + ValidationVersion::V3 => statement_store .validator_statement(originator, compact) .map(|s| s.as_unchecked().clone()) .map(|signed| { - protocol_vstaging::StatementDistributionMessage::Statement(relay_parent, signed) + protocol_v3::StatementDistributionMessage::Statement(relay_parent, signed) }) - .map(|msg| (vec![peer.0], Versioned::VStaging(msg).into())), + .map(|msg| (vec![peer.0], Versioned::V3(msg).into())), ValidationVersion::V1 => { gum::error!( target: LOG_TARGET, @@ -945,10 +944,10 @@ async fn send_pending_grid_messages( ) .into(), )), - ValidationVersion::VStaging => messages.push(( + ValidationVersion::V3 => messages.push(( vec![peer_id.0], - Versioned::VStaging( - protocol_vstaging::StatementDistributionMessage::BackedCandidateManifest( + Versioned::V3( + protocol_v3::StatementDistributionMessage::BackedCandidateManifest( manifest, ), ) @@ -960,7 +959,7 @@ async fn send_pending_grid_messages( "Bug ValidationVersion::V1 should not be used in statement-distribution v2, legacy should have handled this" ); - } + }, }; }, grid::ManifestKind::Acknowledgement => { @@ -1308,8 +1307,8 @@ async fn circulate_statement( let statement_to_v2_peers = filter_by_peer_version(&statement_to_peers, ValidationVersion::V2.into()); - let statement_to_vstaging_peers = - filter_by_peer_version(&statement_to_peers, ValidationVersion::VStaging.into()); + let statement_to_v3_peers = + filter_by_peer_version(&statement_to_peers, ValidationVersion::V3.into()); // ship off the network messages to the network bridge. if !statement_to_v2_peers.is_empty() { @@ -1331,17 +1330,17 @@ async fn circulate_statement( .await; } - if !statement_to_vstaging_peers.is_empty() { + if !statement_to_v3_peers.is_empty() { gum::debug!( target: LOG_TARGET, ?compact_statement, n_peers = ?statement_to_peers.len(), - "Sending statement to vstaging peers", + "Sending statement to v3 peers", ); ctx.send_message(NetworkBridgeTxMessage::SendValidationMessage( - statement_to_vstaging_peers, - Versioned::VStaging(protocol_vstaging::StatementDistributionMessage::Statement( + statement_to_v3_peers, + Versioned::V3(protocol_v3::StatementDistributionMessage::Statement( relay_parent, statement.as_unchecked().clone(), )) @@ -1887,8 +1886,7 @@ async fn provide_candidate_to_grid( } let manifest_peers_v2 = filter_by_peer_version(&manifest_peers, ValidationVersion::V2.into()); - let manifest_peers_vstaging = - filter_by_peer_version(&manifest_peers, ValidationVersion::VStaging.into()); + let manifest_peers_v3 = filter_by_peer_version(&manifest_peers, ValidationVersion::V3.into()); if !manifest_peers_v2.is_empty() { gum::debug!( target: LOG_TARGET, @@ -1908,27 +1906,27 @@ async fn provide_candidate_to_grid( .await; } - if !manifest_peers_vstaging.is_empty() { + if !manifest_peers_v3.is_empty() { gum::debug!( target: LOG_TARGET, ?candidate_hash, local_validator = ?per_session.local_validator, - n_peers = manifest_peers_vstaging.len(), - "Sending manifest to vstaging peers" + n_peers = manifest_peers_v3.len(), + "Sending manifest to v3 peers" ); ctx.send_message(NetworkBridgeTxMessage::SendValidationMessage( - manifest_peers_vstaging, - Versioned::VStaging( - protocol_vstaging::StatementDistributionMessage::BackedCandidateManifest(manifest), - ) + manifest_peers_v3, + Versioned::V3(protocol_v3::StatementDistributionMessage::BackedCandidateManifest( + manifest, + )) .into(), )) .await; } let ack_peers_v2 = filter_by_peer_version(&ack_peers, ValidationVersion::V2.into()); - let ack_peers_vstaging = filter_by_peer_version(&ack_peers, ValidationVersion::VStaging.into()); + let ack_peers_v3 = filter_by_peer_version(&ack_peers, ValidationVersion::V3.into()); if !ack_peers_v2.is_empty() { gum::debug!( target: LOG_TARGET, @@ -1948,22 +1946,20 @@ async fn provide_candidate_to_grid( .await; } - if !ack_peers_vstaging.is_empty() { + if !ack_peers_v3.is_empty() { gum::debug!( target: LOG_TARGET, ?candidate_hash, local_validator = ?per_session.local_validator, - n_peers = ack_peers_vstaging.len(), - "Sending acknowledgement to vstaging peers" + n_peers = ack_peers_v3.len(), + "Sending acknowledgement to v3 peers" ); ctx.send_message(NetworkBridgeTxMessage::SendValidationMessage( - ack_peers_vstaging, - Versioned::VStaging( - protocol_vstaging::StatementDistributionMessage::BackedCandidateKnown( - acknowledgement, - ), - ) + ack_peers_v3, + Versioned::V3(protocol_v3::StatementDistributionMessage::BackedCandidateKnown( + acknowledgement, + )) .into(), )) .await; @@ -2293,8 +2289,8 @@ fn post_acknowledgement_statement_messages( ) .into(), )), - ValidationVersion::VStaging => messages.push(Versioned::VStaging( - protocol_vstaging::StatementDistributionMessage::Statement( + ValidationVersion::V3 => messages.push(Versioned::V3( + protocol_v3::StatementDistributionMessage::Statement( relay_parent, statement.as_unchecked().clone(), ) @@ -2441,9 +2437,9 @@ fn acknowledgement_and_statement_messages( let mut messages = match peer.1 { ValidationVersion::V2 => vec![(vec![peer.0], msg_v2.into())], - ValidationVersion::VStaging => vec![( + ValidationVersion::V3 => vec![( vec![peer.0], - Versioned::VStaging(protocol_v2::StatementDistributionMessage::BackedCandidateKnown( + Versioned::V3(protocol_v2::StatementDistributionMessage::BackedCandidateKnown( acknowledgement, )) .into(), diff --git a/polkadot/node/network/statement-distribution/src/v2/tests/grid.rs b/polkadot/node/network/statement-distribution/src/v2/tests/grid.rs index 116116659cb..aa1a473b833 100644 --- a/polkadot/node/network/statement-distribution/src/v2/tests/grid.rs +++ b/polkadot/node/network/statement-distribution/src/v2/tests/grid.rs @@ -2830,7 +2830,7 @@ fn inactive_local_participates_in_grid() { send_peer_message( &mut overseer, peer_a.clone(), - protocol_vstaging::StatementDistributionMessage::BackedCandidateManifest(manifest), + protocol_v3::StatementDistributionMessage::BackedCandidateManifest(manifest), ) .await; diff --git a/polkadot/node/primitives/src/approval.rs b/polkadot/node/primitives/src/approval.rs index cc9136b8ae3..f2a79e025af 100644 --- a/polkadot/node/primitives/src/approval.rs +++ b/polkadot/node/primitives/src/approval.rs @@ -219,7 +219,9 @@ pub mod v2 { use std::ops::BitOr; use bitvec::{prelude::Lsb0, vec::BitVec}; - use polkadot_primitives::{CandidateIndex, CoreIndex, Hash, ValidatorIndex}; + use polkadot_primitives::{ + CandidateIndex, CoreIndex, Hash, ValidatorIndex, ValidatorSignature, + }; /// A static context associated with producing randomness for a core. pub const CORE_RANDOMNESS_CONTEXT: &[u8] = b"A&V CORE v2"; @@ -473,6 +475,59 @@ pub mod v2 { }) } } + + impl From for IndirectSignedApprovalVoteV2 { + fn from(value: super::v1::IndirectSignedApprovalVote) -> Self { + Self { + block_hash: value.block_hash, + validator: value.validator, + candidate_indices: value.candidate_index.into(), + signature: value.signature, + } + } + } + + /// Errors that can occur when trying to convert to/from approvals v1/v2 + #[derive(Debug)] + pub enum ApprovalConversionError { + /// More than one candidate was signed. + MoreThanOneCandidate(usize), + } + + impl TryFrom for super::v1::IndirectSignedApprovalVote { + type Error = ApprovalConversionError; + + fn try_from(value: IndirectSignedApprovalVoteV2) -> Result { + if value.candidate_indices.count_ones() != 1 { + return Err(ApprovalConversionError::MoreThanOneCandidate( + value.candidate_indices.count_ones(), + )) + } + Ok(Self { + block_hash: value.block_hash, + validator: value.validator, + candidate_index: value.candidate_indices.first_one().expect("Qed we checked above") + as u32, + signature: value.signature, + }) + } + } + + /// A signed approval vote which references the candidate indirectly via the block. + /// + /// In practice, we have a look-up from block hash and candidate index to candidate hash, + /// so this can be transformed into a `SignedApprovalVote`. + #[derive(Debug, Clone, Encode, Decode, PartialEq, Eq)] + pub struct IndirectSignedApprovalVoteV2 { + /// A block hash where the candidate appears. + pub block_hash: Hash, + /// The index of the candidate in the list of candidates fully included as-of the block. + pub candidate_indices: CandidateBitfield, + /// The validator index. + pub validator: ValidatorIndex, + /// The signature by the validator. + pub signature: ValidatorSignature, + } } #[cfg(test)] diff --git a/polkadot/node/primitives/src/disputes/message.rs b/polkadot/node/primitives/src/disputes/message.rs index 89d3ea6c0af..31fe73a7ba1 100644 --- a/polkadot/node/primitives/src/disputes/message.rs +++ b/polkadot/node/primitives/src/disputes/message.rs @@ -170,7 +170,7 @@ impl DisputeMessage { let valid_vote = ValidDisputeVote { validator_index: valid_index, signature: valid_statement.validator_signature().clone(), - kind: *valid_kind, + kind: valid_kind.clone(), }; let invalid_vote = InvalidDisputeVote { diff --git a/polkadot/node/primitives/src/disputes/mod.rs b/polkadot/node/primitives/src/disputes/mod.rs index 500b705be95..768b95f6553 100644 --- a/polkadot/node/primitives/src/disputes/mod.rs +++ b/polkadot/node/primitives/src/disputes/mod.rs @@ -46,6 +46,15 @@ pub struct SignedDisputeStatement { session_index: SessionIndex, } +/// Errors encountered while signing a dispute statement +#[derive(Debug)] +pub enum SignedDisputeStatementError { + /// Encountered a keystore error while signing + KeyStoreError(KeystoreError), + /// Could not generate signing payload + PayloadError, +} + /// Tracked votes on candidates, for the purposes of dispute resolution. #[derive(Debug, Clone)] pub struct CandidateVotes { @@ -107,8 +116,9 @@ impl ValidCandidateVotes { ValidDisputeStatementKind::BackingValid(_) | ValidDisputeStatementKind::BackingSeconded(_) => false, ValidDisputeStatementKind::Explicit | - ValidDisputeStatementKind::ApprovalChecking => { - occupied.insert((kind, sig)); + ValidDisputeStatementKind::ApprovalChecking | + ValidDisputeStatementKind::ApprovalCheckingMultipleCandidates(_) => { + occupied.insert((kind.clone(), sig)); kind != occupied.get().0 }, }, @@ -213,16 +223,19 @@ impl SignedDisputeStatement { candidate_hash: CandidateHash, session_index: SessionIndex, validator_public: ValidatorId, - ) -> Result, KeystoreError> { + ) -> Result, SignedDisputeStatementError> { let dispute_statement = if valid { DisputeStatement::Valid(ValidDisputeStatementKind::Explicit) } else { DisputeStatement::Invalid(InvalidDisputeStatementKind::Explicit) }; - let data = dispute_statement.payload_data(candidate_hash, session_index); + let data = dispute_statement + .payload_data(candidate_hash, session_index) + .map_err(|_| SignedDisputeStatementError::PayloadError)?; let signature = keystore - .sr25519_sign(ValidatorId::ID, validator_public.as_ref(), &data)? + .sr25519_sign(ValidatorId::ID, validator_public.as_ref(), &data) + .map_err(SignedDisputeStatementError::KeyStoreError)? .map(|sig| Self { dispute_statement, candidate_hash, diff --git a/polkadot/node/service/Cargo.toml b/polkadot/node/service/Cargo.toml index 448ab605aa9..81eff49ee30 100644 --- a/polkadot/node/service/Cargo.toml +++ b/polkadot/node/service/Cargo.toml @@ -225,7 +225,3 @@ runtime-metrics = [ "rococo-runtime?/runtime-metrics", "westend-runtime?/runtime-metrics", ] - -network-protocol-staging = [ - "polkadot-node-network-protocol/network-protocol-staging", -] diff --git a/polkadot/node/service/src/parachains_db/upgrade.rs b/polkadot/node/service/src/parachains_db/upgrade.rs index 1d76c79d3e3..d22eebb5c8d 100644 --- a/polkadot/node/service/src/parachains_db/upgrade.rs +++ b/polkadot/node/service/src/parachains_db/upgrade.rs @@ -20,10 +20,16 @@ use std::{ fs, io, path::{Path, PathBuf}, str::FromStr, + sync::Arc, }; -use polkadot_node_core_approval_voting::approval_db::v2::{ - migration_helpers::v1_to_v2, Config as ApprovalDbConfig, +use polkadot_node_core_approval_voting::approval_db::{ + common::{Config as ApprovalDbConfig, Result as ApprovalDbResult}, + v2::migration_helpers::v1_to_latest, + v3::migration_helpers::v2_to_latest, +}; +use polkadot_node_subsystem_util::database::{ + kvdb_impl::DbAdapter as RocksDbAdapter, paritydb_impl::DbAdapter as ParityDbAdapter, Database, }; type Version = u32; @@ -32,7 +38,9 @@ const VERSION_FILE_NAME: &'static str = "parachain_db_version"; /// Current db version. /// Version 4 changes approval db format for `OurAssignment`. -pub(crate) const CURRENT_VERSION: Version = 4; +/// Version 5 changes approval db format to hold some additional +/// information about delayed approvals. +pub(crate) const CURRENT_VERSION: Version = 5; #[derive(thiserror::Error, Debug)] pub enum Error { @@ -101,7 +109,8 @@ pub(crate) fn try_upgrade_db_to_next_version( // 2 -> 3 migration Some(2) => migrate_from_version_2_to_3(db_path, db_kind)?, // 3 -> 4 migration - Some(3) => migrate_from_version_3_to_4(db_path, db_kind)?, + Some(3) => migrate_from_version_3_or_4_to_5(db_path, db_kind, v1_to_latest)?, + Some(4) => migrate_from_version_3_or_4_to_5(db_path, db_kind, v2_to_latest)?, // Already at current version, do nothing. Some(CURRENT_VERSION) => CURRENT_VERSION, // This is an arbitrary future version, we don't handle it. @@ -174,14 +183,19 @@ fn migrate_from_version_1_to_2(path: &Path, db_kind: DatabaseKind) -> Result Result { +fn migrate_from_version_3_or_4_to_5( + path: &Path, + db_kind: DatabaseKind, + migration_function: F, +) -> Result +where + F: Fn(Arc, ApprovalDbConfig) -> ApprovalDbResult<()>, +{ gum::info!(target: LOG_TARGET, "Migrating parachains db from version 3 to version 4 ..."); - use polkadot_node_subsystem_util::database::{ - kvdb_impl::DbAdapter as RocksDbAdapter, paritydb_impl::DbAdapter as ParityDbAdapter, - }; - use std::sync::Arc; let approval_db_config = ApprovalDbConfig { col_approval_data: super::REAL_COLUMNS.col_approval_data }; @@ -194,7 +208,8 @@ fn migrate_from_version_3_to_4(path: &Path, db_kind: DatabaseKind) -> Result { let db_path = path @@ -207,7 +222,8 @@ fn migrate_from_version_3_to_4(path: &Path, db_kind: DatabaseKind) -> Result), /// Get the node features. NodeFeatures(SessionIndex, RuntimeApiSender), + /// Approval voting params + /// `V10` + ApprovalVotingParams(SessionIndex, RuntimeApiSender), } impl RuntimeApiRequest { @@ -751,6 +755,9 @@ impl RuntimeApiRequest { /// `Node features` pub const NODE_FEATURES_RUNTIME_REQUIREMENT: u32 = 9; + + /// `approval_voting_params` + pub const APPROVAL_VOTING_PARAMS_REQUIREMENT: u32 = 10; } /// A message to the Runtime API subsystem. @@ -936,7 +943,7 @@ pub enum ApprovalVotingMessage { /// protocol. /// /// Should not be sent unless the block hash within the indirect vote is known. - CheckAndImportApproval(IndirectSignedApprovalVote, oneshot::Sender), + CheckAndImportApproval(IndirectSignedApprovalVoteV2, oneshot::Sender), /// Returns the highest possible ancestor hash of the provided block hash which is /// acceptable to vote on finality for. /// The `BlockNumber` provided is the number of the block's ancestor which is the @@ -952,7 +959,7 @@ pub enum ApprovalVotingMessage { /// requires calling into `approval-distribution`: Calls should be infrequent and bounded. GetApprovalSignaturesForCandidate( CandidateHash, - oneshot::Sender>, + oneshot::Sender, ValidatorSignature)>>, ), } @@ -968,7 +975,7 @@ pub enum ApprovalDistributionMessage { /// Distribute an approval vote for the local validator. The approval vote is assumed to be /// valid, relevant, and the corresponding approval already issued. /// If not, the subsystem is free to drop the message. - DistributeApproval(IndirectSignedApprovalVote), + DistributeApproval(IndirectSignedApprovalVoteV2), /// An update from the network bridge. #[from] NetworkBridgeUpdate(NetworkBridgeEvent), @@ -976,7 +983,7 @@ pub enum ApprovalDistributionMessage { /// Get all approval signatures for all chains a candidate appeared in. GetApprovalSignatures( HashSet<(Hash, CandidateIndex)>, - oneshot::Sender>, + oneshot::Sender, ValidatorSignature)>>, ), /// Approval checking lag update measured in blocks. ApprovalCheckingLagUpdate(BlockNumber), diff --git a/polkadot/node/subsystem-types/src/runtime_client.rs b/polkadot/node/subsystem-types/src/runtime_client.rs index 21df1483b9e..7f618307610 100644 --- a/polkadot/node/subsystem-types/src/runtime_client.rs +++ b/polkadot/node/subsystem-types/src/runtime_client.rs @@ -16,12 +16,15 @@ use async_trait::async_trait; use polkadot_primitives::{ - async_backing, runtime_api::ParachainHost, slashing, vstaging, Block, BlockNumber, - CandidateCommitments, CandidateEvent, CandidateHash, CommittedCandidateReceipt, CoreState, - DisputeState, ExecutorParams, GroupRotationInfo, Hash, Header, Id, InboundDownwardMessage, - InboundHrmpMessage, OccupiedCoreAssumption, PersistedValidationData, PvfCheckStatement, - ScrapedOnChainVotes, SessionIndex, SessionInfo, ValidationCode, ValidationCodeHash, - ValidatorId, ValidatorIndex, ValidatorSignature, + async_backing, + runtime_api::ParachainHost, + slashing, + vstaging::{self, ApprovalVotingParams}, + Block, BlockNumber, CandidateCommitments, CandidateEvent, CandidateHash, + CommittedCandidateReceipt, CoreState, DisputeState, ExecutorParams, GroupRotationInfo, Hash, + Header, Id, InboundDownwardMessage, InboundHrmpMessage, OccupiedCoreAssumption, + PersistedValidationData, PvfCheckStatement, ScrapedOnChainVotes, SessionIndex, SessionInfo, + ValidationCode, ValidationCodeHash, ValidatorId, ValidatorIndex, ValidatorSignature, }; use sc_client_api::HeaderBackend; use sc_transaction_pool_api::OffchainTransactionPoolFactory; @@ -316,9 +319,16 @@ pub trait RuntimeApiSubsystemClient { async fn disabled_validators(&self, at: Hash) -> Result, ApiError>; // === v9 === - /// Get the node features. async fn node_features(&self, at: Hash) -> Result; + + // == v10: Approval voting params == + /// Approval voting configuration parameters + async fn approval_voting_params( + &self, + at: Hash, + session_index: SessionIndex, + ) -> Result; } /// Default implementation of [`RuntimeApiSubsystemClient`] using the client. @@ -575,4 +585,13 @@ where async fn disabled_validators(&self, at: Hash) -> Result, ApiError> { self.client.runtime_api().disabled_validators(at) } + + /// Approval voting configuration parameters + async fn approval_voting_params( + &self, + at: Hash, + _session_index: SessionIndex, + ) -> Result { + self.client.runtime_api().approval_voting_params(at) + } } diff --git a/polkadot/parachain/test-parachains/undying/collator/Cargo.toml b/polkadot/parachain/test-parachains/undying/collator/Cargo.toml index 8e4022a718f..29d36452eee 100644 --- a/polkadot/parachain/test-parachains/undying/collator/Cargo.toml +++ b/polkadot/parachain/test-parachains/undying/collator/Cargo.toml @@ -39,6 +39,3 @@ sc-service = { path = "../../../../../substrate/client/service" } sp-keyring = { path = "../../../../../substrate/primitives/keyring" } tokio = { version = "1.24.2", features = ["macros"] } - -[features] -network-protocol-staging = ["polkadot-cli/network-protocol-staging"] diff --git a/polkadot/primitives/src/runtime_api.rs b/polkadot/primitives/src/runtime_api.rs index 331728b2590..d661005e32f 100644 --- a/polkadot/primitives/src/runtime_api.rs +++ b/polkadot/primitives/src/runtime_api.rs @@ -114,12 +114,14 @@ //! separated from the stable primitives. use crate::{ - async_backing, slashing, vstaging, AsyncBackingParams, BlockNumber, CandidateCommitments, - CandidateEvent, CandidateHash, CommittedCandidateReceipt, CoreState, DisputeState, - ExecutorParams, GroupRotationInfo, Hash, OccupiedCoreAssumption, PersistedValidationData, - PvfCheckStatement, ScrapedOnChainVotes, SessionIndex, SessionInfo, ValidatorId, ValidatorIndex, - ValidatorSignature, + async_backing, slashing, + vstaging::{self, ApprovalVotingParams}, + AsyncBackingParams, BlockNumber, CandidateCommitments, CandidateEvent, CandidateHash, + CommittedCandidateReceipt, CoreState, DisputeState, ExecutorParams, GroupRotationInfo, Hash, + OccupiedCoreAssumption, PersistedValidationData, PvfCheckStatement, ScrapedOnChainVotes, + SessionIndex, SessionInfo, ValidatorId, ValidatorIndex, ValidatorSignature, }; + use polkadot_core_primitives as pcp; use polkadot_parachain_primitives::primitives as ppp; use sp_std::{collections::btree_map::BTreeMap, prelude::*}; @@ -274,5 +276,10 @@ sp_api::decl_runtime_apis! { /// This is a staging method! Do not use on production runtimes! #[api_version(9)] fn node_features() -> vstaging::NodeFeatures; + + /***** Added in v10 *****/ + /// Approval voting configuration parameters + #[api_version(10)] + fn approval_voting_params() -> ApprovalVotingParams; } } diff --git a/polkadot/primitives/src/v6/mod.rs b/polkadot/primitives/src/v6/mod.rs index 83b590dc320..c3a947644ff 100644 --- a/polkadot/primitives/src/v6/mod.rs +++ b/polkadot/primitives/src/v6/mod.rs @@ -1070,6 +1070,26 @@ impl ApprovalVote { } } +/// A vote of approval for multiple candidates. +#[derive(Clone, RuntimeDebug)] +pub struct ApprovalVoteMultipleCandidates<'a>(pub &'a [CandidateHash]); + +impl<'a> ApprovalVoteMultipleCandidates<'a> { + /// Yields the signing payload for this approval vote. + pub fn signing_payload(&self, session_index: SessionIndex) -> Vec { + const MAGIC: [u8; 4] = *b"APPR"; + // Make this backwards compatible with `ApprovalVote` so if we have just on candidate the + // signature will look the same. + // This gives us the nice benefit that old nodes can still check signatures when len is 1 + // and the new node can check the signature coming from old nodes. + if self.0.len() == 1 { + (MAGIC, self.0.first().expect("QED: we just checked"), session_index).encode() + } else { + (MAGIC, &self.0, session_index).encode() + } + } +} + /// Custom validity errors used in Polkadot while validating transactions. #[repr(u8)] pub enum ValidityError { @@ -1246,25 +1266,42 @@ pub enum DisputeStatement { impl DisputeStatement { /// Get the payload data for this type of dispute statement. - pub fn payload_data(&self, candidate_hash: CandidateHash, session: SessionIndex) -> Vec { - match *self { + /// + /// Returns Error if the candidate_hash is not included in the list of signed + /// candidate from ApprovalCheckingMultipleCandidate. + pub fn payload_data( + &self, + candidate_hash: CandidateHash, + session: SessionIndex, + ) -> Result, ()> { + match self { DisputeStatement::Valid(ValidDisputeStatementKind::Explicit) => - ExplicitDisputeStatement { valid: true, candidate_hash, session }.signing_payload(), + Ok(ExplicitDisputeStatement { valid: true, candidate_hash, session } + .signing_payload()), DisputeStatement::Valid(ValidDisputeStatementKind::BackingSeconded( inclusion_parent, - )) => CompactStatement::Seconded(candidate_hash).signing_payload(&SigningContext { + )) => Ok(CompactStatement::Seconded(candidate_hash).signing_payload(&SigningContext { session_index: session, - parent_hash: inclusion_parent, - }), + parent_hash: *inclusion_parent, + })), DisputeStatement::Valid(ValidDisputeStatementKind::BackingValid(inclusion_parent)) => - CompactStatement::Valid(candidate_hash).signing_payload(&SigningContext { + Ok(CompactStatement::Valid(candidate_hash).signing_payload(&SigningContext { session_index: session, - parent_hash: inclusion_parent, - }), + parent_hash: *inclusion_parent, + })), DisputeStatement::Valid(ValidDisputeStatementKind::ApprovalChecking) => - ApprovalVote(candidate_hash).signing_payload(session), + Ok(ApprovalVote(candidate_hash).signing_payload(session)), + DisputeStatement::Valid( + ValidDisputeStatementKind::ApprovalCheckingMultipleCandidates(candidate_hashes), + ) => + if candidate_hashes.contains(&candidate_hash) { + Ok(ApprovalVoteMultipleCandidates(candidate_hashes).signing_payload(session)) + } else { + Err(()) + }, DisputeStatement::Invalid(InvalidDisputeStatementKind::Explicit) => - ExplicitDisputeStatement { valid: false, candidate_hash, session }.signing_payload(), + Ok(ExplicitDisputeStatement { valid: false, candidate_hash, session } + .signing_payload()), } } @@ -1276,7 +1313,7 @@ impl DisputeStatement { session: SessionIndex, validator_signature: &ValidatorSignature, ) -> Result<(), ()> { - let payload = self.payload_data(candidate_hash, session); + let payload = self.payload_data(candidate_hash, session)?; if validator_signature.verify(&payload[..], &validator_public) { Ok(()) @@ -1308,13 +1345,14 @@ impl DisputeStatement { Self::Valid(ValidDisputeStatementKind::BackingValid(_)) => true, Self::Valid(ValidDisputeStatementKind::Explicit) | Self::Valid(ValidDisputeStatementKind::ApprovalChecking) | + Self::Valid(ValidDisputeStatementKind::ApprovalCheckingMultipleCandidates(_)) | Self::Invalid(_) => false, } } } /// Different kinds of statements of validity on a candidate. -#[derive(Encode, Decode, Copy, Clone, PartialEq, RuntimeDebug, TypeInfo)] +#[derive(Encode, Decode, Clone, PartialEq, RuntimeDebug, TypeInfo)] pub enum ValidDisputeStatementKind { /// An explicit statement issued as part of a dispute. #[codec(index = 0)] @@ -1328,6 +1366,12 @@ pub enum ValidDisputeStatementKind { /// An approval vote from the approval checking phase. #[codec(index = 3)] ApprovalChecking, + /// An approval vote from the new version. + /// We can't create this version untill all nodes + /// have been updated to support it and max_approval_coalesce_count + /// is set to more than 1. + #[codec(index = 4)] + ApprovalCheckingMultipleCandidates(Vec), } /// Different kinds of statements of invalidity on a candidate. diff --git a/polkadot/primitives/src/vstaging/mod.rs b/polkadot/primitives/src/vstaging/mod.rs index 1639dc15e21..630bcf8679a 100644 --- a/polkadot/primitives/src/vstaging/mod.rs +++ b/polkadot/primitives/src/vstaging/mod.rs @@ -17,6 +17,38 @@ //! Staging Primitives. // Put any primitives used by staging APIs functions here +pub use crate::v6::*; +use sp_std::prelude::*; + +use parity_scale_codec::{Decode, Encode}; +use primitives::RuntimeDebug; +use scale_info::TypeInfo; + +/// Approval voting configuration parameters +#[derive( + RuntimeDebug, + Copy, + Clone, + PartialEq, + Encode, + Decode, + TypeInfo, + serde::Serialize, + serde::Deserialize, +)] +pub struct ApprovalVotingParams { + /// The maximum number of candidates `approval-voting` can vote for with + /// a single signatures. + /// + /// Setting it to 1, means we send the approval as soon as we have it available. + pub max_approval_coalesce_count: u32, +} + +impl Default for ApprovalVotingParams { + fn default() -> Self { + Self { max_approval_coalesce_count: 1 } + } +} use bitvec::vec::BitVec; diff --git a/polkadot/roadmap/implementers-guide/src/node/approval/approval-voting.md b/polkadot/roadmap/implementers-guide/src/node/approval/approval-voting.md index 1a17f90d9ba..345b3d2e697 100644 --- a/polkadot/roadmap/implementers-guide/src/node/approval/approval-voting.md +++ b/polkadot/roadmap/implementers-guide/src/node/approval/approval-voting.md @@ -4,10 +4,13 @@ Reading the [section on the approval protocol](../../protocol-approval.md) will aims of this subsystem. Approval votes are split into two parts: Assignments and Approvals. Validators first broadcast their assignment to -indicate intent to check a candidate. Upon successfully checking, they broadcast an approval vote. If a validator -doesn't broadcast their approval vote shortly after issuing an assignment, this is an indication that they are being -prevented from recovering or validating the block data and that more validators should self-select to check the -candidate. This is known as a "no-show". +indicate intent to check a candidate. Upon successfully checking, they don't immediately send the vote instead +they queue the check for a short period of time `MAX_APPROVAL_COALESCE_WAIT_TICKS` to give the opportunity of the +validator to vote for more than one candidate. Once MAX_APPROVAL_COALESCE_WAIT_TICKS have passed or at least +`MAX_APPROVAL_COALESCE_COUNT` are ready they broadcast an approval vote for all candidates. If a validator +doesn't broadcast their approval vote shortly after issuing an assignment, this is an indication that they are +being prevented from recovering or validating the block data and that more validators should self-select to +check the candidate. This is known as a "no-show". The core of this subsystem is a Tick-based timer loop, where Ticks are 500ms. We also reason about time in terms of `DelayTranche`s, which measure the number of ticks elapsed since a block was produced. We track metadata for all @@ -120,6 +123,13 @@ struct BlockEntry { // this block. The block can be considered approved has all bits set to 1 approved_bitfield: Bitfield, children: Vec, + // A list of candidates we have checked, but didn't not sign and + // advertise the vote yet. + candidates_pending_signature: BTreeMap, + // Assignments we already distributed. A 1 bit means the candidate index for which + // we already have sent out an assignment. We need this to avoid distributing + // multiple core assignments more than once. + distributed_assignments: Bitfield, } // slot_duration * 2 + DelayTranche gives the number of delay tranches since the @@ -303,12 +313,12 @@ entry. The cert itself contains information necessary to determine the candidate On receiving a `CheckAndImportApproval(indirect_approval_vote, response_channel)` message: * Fetch the `BlockEntry` from the indirect approval vote's `block_hash`. If none, return `ApprovalCheckResult::Bad`. - * Fetch the `CandidateEntry` from the indirect approval vote's `candidate_index`. If the block did not trigger + * Fetch all `CandidateEntry` from the indirect approval vote's `candidate_indices`. If the block did not trigger inclusion of enough candidates, return `ApprovalCheckResult::Bad`. - * Construct a `SignedApprovalVote` using the candidate hash and check against the validator's approval key, based on - the session info of the block. If invalid or no such validator, return `ApprovalCheckResult::Bad`. + * Construct a `SignedApprovalVote` using the candidates hashes and check against the validator's approval key, + based on the session info of the block. If invalid or no such validator, return `ApprovalCheckResult::Bad`. * Send `ApprovalCheckResult::Accepted` - * [Import the checked approval vote](#import-checked-approval) + * [Import the checked approval vote](#import-checked-approval) for all candidates #### `ApprovalVotingMessage::ApprovedAncestor` @@ -402,10 +412,25 @@ On receiving an `ApprovedAncestor(Hash, BlockNumber, response_channel)`: #### Issue Approval Vote * Fetch the block entry and candidate entry. Ignore if `None` - we've probably just lost a race with finality. - * Construct a `SignedApprovalVote` with the validator index for the session. * [Import the checked approval vote](#import-checked-approval). It is "checked" as we've just issued the signature. - * Construct a `IndirectSignedApprovalVote` using the information about the vote. - * Dispatch `ApprovalDistributionMessage::DistributeApproval`. + * IF `MAX_APPROVAL_COALESCE_COUNT` candidates are in the waiting queue + * Construct a `SignedApprovalVote` with the validator index for the session and all candidate hashes in the waiting queue. + * Construct a `IndirectSignedApprovalVote` using the information about the vote. + * Dispatch `ApprovalDistributionMessage::DistributeApproval`. + * ELSE + * Queue the candidate in the `BlockEntry::candidates_pending_signature` + * Arm a per BlockEntry timer with latest tick we can send the vote. + +### Delayed vote distribution + * [Issue Approval Vote](#issue-approval-vote) arms once a per block timer if there are no requirements to send the + vote immediately. + * When the timer wakes up it will either: + * IF there is a candidate in the queue past its sending tick: + * Construct a `SignedApprovalVote` with the validator index for the session and all candidate hashes in the waiting queue. + * Construct a `IndirectSignedApprovalVote` using the information about the vote. + * Dispatch `ApprovalDistributionMessage::DistributeApproval`. + * ELSE + * Re-arm the timer with latest tick we have the send a the vote. ### Determining Approval of Candidate diff --git a/polkadot/roadmap/implementers-guide/src/protocol-approval.md b/polkadot/roadmap/implementers-guide/src/protocol-approval.md index 70bc0233d65..b6aa16646ad 100644 --- a/polkadot/roadmap/implementers-guide/src/protocol-approval.md +++ b/polkadot/roadmap/implementers-guide/src/protocol-approval.md @@ -296,6 +296,18 @@ provide somewhat more security. TODO: When? Is this optimal for the network? etc. +## Approval coalescing +To reduce the necessary network bandwidth and cpu time when a validator has more than one candidate to approve we are +doing our best effort to send a single message that approves all available candidates with a single signature. +The implemented heuristic, is that each time we are ready to create a signature and send a vote for a candidate we +delay sending it until one of three things happen: +- We gathered a maximum of `MAX_APPROVAL_COALESCE_COUNT` candidates that we have already checked and we are + ready to sign approval for. +- `MAX_APPROVAL_COALESCE_WAIT_TICKS` have passed since checking oldest candidate and we were ready to sign + and send the approval message. +- We are already in the last third of the no-show period in order to avoid creating accidental no-shows, which in + turn might trigger other assignments. + ## On-chain verification We should verify approval on-chain to reward approval checkers. We therefore require the "no show" timeout to be longer diff --git a/polkadot/runtime/parachains/src/builder.rs b/polkadot/runtime/parachains/src/builder.rs index dced24df0ae..23916bbdc8a 100644 --- a/polkadot/runtime/parachains/src/builder.rs +++ b/polkadot/runtime/parachains/src/builder.rs @@ -636,7 +636,7 @@ impl BenchBuilder { } else { DisputeStatement::Valid(ValidDisputeStatementKind::Explicit) }; - let data = dispute_statement.payload_data(candidate_hash, session); + let data = dispute_statement.payload_data(candidate_hash, session).unwrap(); let statement_sig = validator_public.sign(&data).unwrap(); (dispute_statement, ValidatorIndex(validator_index), statement_sig) diff --git a/polkadot/runtime/parachains/src/configuration.rs b/polkadot/runtime/parachains/src/configuration.rs index bff9cc34b4f..272c227dfef 100644 --- a/polkadot/runtime/parachains/src/configuration.rs +++ b/polkadot/runtime/parachains/src/configuration.rs @@ -26,8 +26,9 @@ use polkadot_parachain_primitives::primitives::{ MAX_HORIZONTAL_MESSAGE_NUM, MAX_UPWARD_MESSAGE_NUM, }; use primitives::{ - vstaging::NodeFeatures, AsyncBackingParams, Balance, ExecutorParamError, ExecutorParams, - SessionIndex, LEGACY_MIN_BACKING_VOTES, MAX_CODE_SIZE, MAX_HEAD_DATA_SIZE, MAX_POV_SIZE, + vstaging::{ApprovalVotingParams, NodeFeatures}, + AsyncBackingParams, Balance, ExecutorParamError, ExecutorParams, SessionIndex, + LEGACY_MIN_BACKING_VOTES, MAX_CODE_SIZE, MAX_HEAD_DATA_SIZE, MAX_POV_SIZE, ON_DEMAND_DEFAULT_QUEUE_MAX_SIZE, }; use sp_runtime::{traits::Zero, Perbill}; @@ -263,6 +264,8 @@ pub struct HostConfiguration { pub minimum_backing_votes: u32, /// Node features enablement. pub node_features: NodeFeatures, + /// Params used by approval-voting + pub approval_voting_params: ApprovalVotingParams, } impl> Default for HostConfiguration { @@ -308,6 +311,7 @@ impl> Default for HostConfiguration /// v8-v9: /// v9-v10: - const STORAGE_VERSION: StorageVersion = StorageVersion::new(10); + /// v10-11: + const STORAGE_VERSION: StorageVersion = StorageVersion::new(11); #[pallet::pallet] #[pallet::storage_version(STORAGE_VERSION)] @@ -1191,6 +1196,7 @@ pub mod pallet { config.on_demand_ttl = new; }) } + /// Set the minimum backing votes threshold. #[pallet::call_index(52)] #[pallet::weight(( @@ -1203,6 +1209,7 @@ pub mod pallet { config.minimum_backing_votes = new; }) } + /// Set/Unset a node feature. #[pallet::call_index(53)] #[pallet::weight(( @@ -1220,6 +1227,22 @@ pub mod pallet { config.node_features.set(index, value); }) } + + /// Set approval-voting-params. + #[pallet::call_index(54)] + #[pallet::weight(( + T::WeightInfo::set_config_with_executor_params(), + DispatchClass::Operational, + ))] + pub fn set_approval_voting_params( + origin: OriginFor, + new: ApprovalVotingParams, + ) -> DispatchResult { + ensure_root(origin)?; + Self::schedule_config_update(|config| { + config.approval_voting_params = new; + }) + } } #[pallet::hooks] diff --git a/polkadot/runtime/parachains/src/configuration/migration.rs b/polkadot/runtime/parachains/src/configuration/migration.rs index db323d3aad9..2838b73092d 100644 --- a/polkadot/runtime/parachains/src/configuration/migration.rs +++ b/polkadot/runtime/parachains/src/configuration/migration.rs @@ -17,6 +17,7 @@ //! A module that is responsible for migration of storage. pub mod v10; +pub mod v11; pub mod v6; pub mod v7; pub mod v8; diff --git a/polkadot/runtime/parachains/src/configuration/migration/v10.rs b/polkadot/runtime/parachains/src/configuration/migration/v10.rs index 3c934082dc1..cf228610e5c 100644 --- a/polkadot/runtime/parachains/src/configuration/migration/v10.rs +++ b/polkadot/runtime/parachains/src/configuration/migration/v10.rs @@ -16,17 +16,121 @@ //! A module that is responsible for migration of storage. -use crate::configuration::{self, Config, Pallet}; +use crate::configuration::{Config, Pallet}; use frame_support::{pallet_prelude::*, traits::Defensive, weights::Weight}; use frame_system::pallet_prelude::BlockNumberFor; -use primitives::{vstaging::NodeFeatures, SessionIndex}; +use primitives::{ + vstaging::NodeFeatures, AsyncBackingParams, Balance, ExecutorParams, SessionIndex, + LEGACY_MIN_BACKING_VOTES, ON_DEMAND_DEFAULT_QUEUE_MAX_SIZE, +}; +use sp_runtime::Perbill; use sp_std::vec::Vec; use frame_support::traits::OnRuntimeUpgrade; use super::v9::V9HostConfiguration; +// All configuration of the runtime with respect to paras. +#[derive(Clone, Encode, PartialEq, Decode, Debug)] +pub struct V10HostConfiguration { + pub max_code_size: u32, + pub max_head_data_size: u32, + pub max_upward_queue_count: u32, + pub max_upward_queue_size: u32, + pub max_upward_message_size: u32, + pub max_upward_message_num_per_candidate: u32, + pub hrmp_max_message_num_per_candidate: u32, + pub validation_upgrade_cooldown: BlockNumber, + pub validation_upgrade_delay: BlockNumber, + pub async_backing_params: AsyncBackingParams, + pub max_pov_size: u32, + pub max_downward_message_size: u32, + pub hrmp_max_parachain_outbound_channels: u32, + pub hrmp_sender_deposit: Balance, + pub hrmp_recipient_deposit: Balance, + pub hrmp_channel_max_capacity: u32, + pub hrmp_channel_max_total_size: u32, + pub hrmp_max_parachain_inbound_channels: u32, + pub hrmp_channel_max_message_size: u32, + pub executor_params: ExecutorParams, + pub code_retention_period: BlockNumber, + pub on_demand_cores: u32, + pub on_demand_retries: u32, + pub on_demand_queue_max_size: u32, + pub on_demand_target_queue_utilization: Perbill, + pub on_demand_fee_variability: Perbill, + pub on_demand_base_fee: Balance, + pub on_demand_ttl: BlockNumber, + pub group_rotation_frequency: BlockNumber, + pub paras_availability_period: BlockNumber, + pub scheduling_lookahead: u32, + pub max_validators_per_core: Option, + pub max_validators: Option, + pub dispute_period: SessionIndex, + pub dispute_post_conclusion_acceptance_period: BlockNumber, + pub no_show_slots: u32, + pub n_delay_tranches: u32, + pub zeroth_delay_tranche_width: u32, + pub needed_approvals: u32, + pub relay_vrf_modulo_samples: u32, + pub pvf_voting_ttl: SessionIndex, + pub minimum_validation_upgrade_delay: BlockNumber, + pub minimum_backing_votes: u32, + pub node_features: NodeFeatures, +} -type V10HostConfiguration = configuration::HostConfiguration; +impl> Default for V10HostConfiguration { + fn default() -> Self { + Self { + async_backing_params: AsyncBackingParams { + max_candidate_depth: 0, + allowed_ancestry_len: 0, + }, + group_rotation_frequency: 1u32.into(), + paras_availability_period: 1u32.into(), + no_show_slots: 1u32.into(), + validation_upgrade_cooldown: Default::default(), + validation_upgrade_delay: 2u32.into(), + code_retention_period: Default::default(), + max_code_size: Default::default(), + max_pov_size: Default::default(), + max_head_data_size: Default::default(), + on_demand_cores: Default::default(), + on_demand_retries: Default::default(), + scheduling_lookahead: 1, + max_validators_per_core: Default::default(), + max_validators: None, + dispute_period: 6, + dispute_post_conclusion_acceptance_period: 100.into(), + n_delay_tranches: Default::default(), + zeroth_delay_tranche_width: Default::default(), + needed_approvals: Default::default(), + relay_vrf_modulo_samples: Default::default(), + max_upward_queue_count: Default::default(), + max_upward_queue_size: Default::default(), + max_downward_message_size: Default::default(), + max_upward_message_size: Default::default(), + max_upward_message_num_per_candidate: Default::default(), + hrmp_sender_deposit: Default::default(), + hrmp_recipient_deposit: Default::default(), + hrmp_channel_max_capacity: Default::default(), + hrmp_channel_max_total_size: Default::default(), + hrmp_max_parachain_inbound_channels: Default::default(), + hrmp_channel_max_message_size: Default::default(), + hrmp_max_parachain_outbound_channels: Default::default(), + hrmp_max_message_num_per_candidate: Default::default(), + pvf_voting_ttl: 2u32.into(), + minimum_validation_upgrade_delay: 2.into(), + executor_params: Default::default(), + on_demand_queue_max_size: ON_DEMAND_DEFAULT_QUEUE_MAX_SIZE, + on_demand_base_fee: 10_000_000u128, + on_demand_fee_variability: Perbill::from_percent(3), + on_demand_target_queue_utilization: Perbill::from_percent(25), + on_demand_ttl: 5u32.into(), + minimum_backing_votes: LEGACY_MIN_BACKING_VOTES, + node_features: NodeFeatures::EMPTY, + } + } +} mod v9 { use super::*; diff --git a/polkadot/runtime/parachains/src/configuration/migration/v11.rs b/polkadot/runtime/parachains/src/configuration/migration/v11.rs new file mode 100644 index 00000000000..b7dec7070f9 --- /dev/null +++ b/polkadot/runtime/parachains/src/configuration/migration/v11.rs @@ -0,0 +1,329 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! A module that is responsible for migration of storage. + +use crate::configuration::{self, Config, Pallet}; +use frame_support::{ + migrations::VersionedMigration, pallet_prelude::*, traits::Defensive, weights::Weight, +}; +use frame_system::pallet_prelude::BlockNumberFor; +use primitives::{vstaging::ApprovalVotingParams, SessionIndex}; +use sp_std::vec::Vec; + +use frame_support::traits::OnRuntimeUpgrade; + +use super::v10::V10HostConfiguration; +type V11HostConfiguration = configuration::HostConfiguration; + +mod v10 { + use super::*; + + #[frame_support::storage_alias] + pub(crate) type ActiveConfig = + StorageValue, V10HostConfiguration>, OptionQuery>; + + #[frame_support::storage_alias] + pub(crate) type PendingConfigs = StorageValue< + Pallet, + Vec<(SessionIndex, V10HostConfiguration>)>, + OptionQuery, + >; +} + +mod v11 { + use super::*; + + #[frame_support::storage_alias] + pub(crate) type ActiveConfig = + StorageValue, V11HostConfiguration>, OptionQuery>; + + #[frame_support::storage_alias] + pub(crate) type PendingConfigs = StorageValue< + Pallet, + Vec<(SessionIndex, V11HostConfiguration>)>, + OptionQuery, + >; +} + +pub type MigrateToV11 = VersionedMigration< + 10, + 11, + UncheckedMigrateToV11, + Pallet, + ::DbWeight, +>; + +pub struct UncheckedMigrateToV11(sp_std::marker::PhantomData); +impl OnRuntimeUpgrade for UncheckedMigrateToV11 { + #[cfg(feature = "try-runtime")] + fn pre_upgrade() -> Result, sp_runtime::TryRuntimeError> { + log::trace!(target: crate::configuration::LOG_TARGET, "Running pre_upgrade() for HostConfiguration MigrateToV11"); + Ok(Vec::new()) + } + + fn on_runtime_upgrade() -> Weight { + log::info!(target: configuration::LOG_TARGET, "HostConfiguration MigrateToV11 started"); + let weight_consumed = migrate_to_v11::(); + + log::info!(target: configuration::LOG_TARGET, "HostConfiguration MigrateToV11 executed successfully"); + + weight_consumed + } + + #[cfg(feature = "try-runtime")] + fn post_upgrade(_state: Vec) -> Result<(), sp_runtime::TryRuntimeError> { + log::trace!(target: crate::configuration::LOG_TARGET, "Running post_upgrade() for HostConfiguration MigrateToV11"); + ensure!( + StorageVersion::get::>() >= 11, + "Storage version should be >= 11 after the migration" + ); + + Ok(()) + } +} + +fn migrate_to_v11() -> Weight { + // Unusual formatting is justified: + // - make it easier to verify that fields assign what they supposed to assign. + // - this code is transient and will be removed after all migrations are done. + // - this code is important enough to optimize for legibility sacrificing consistency. + #[rustfmt::skip] + let translate = + |pre: V10HostConfiguration>| -> + V11HostConfiguration> + { + V11HostConfiguration { +max_code_size : pre.max_code_size, +max_head_data_size : pre.max_head_data_size, +max_upward_queue_count : pre.max_upward_queue_count, +max_upward_queue_size : pre.max_upward_queue_size, +max_upward_message_size : pre.max_upward_message_size, +max_upward_message_num_per_candidate : pre.max_upward_message_num_per_candidate, +hrmp_max_message_num_per_candidate : pre.hrmp_max_message_num_per_candidate, +validation_upgrade_cooldown : pre.validation_upgrade_cooldown, +validation_upgrade_delay : pre.validation_upgrade_delay, +max_pov_size : pre.max_pov_size, +max_downward_message_size : pre.max_downward_message_size, +hrmp_sender_deposit : pre.hrmp_sender_deposit, +hrmp_recipient_deposit : pre.hrmp_recipient_deposit, +hrmp_channel_max_capacity : pre.hrmp_channel_max_capacity, +hrmp_channel_max_total_size : pre.hrmp_channel_max_total_size, +hrmp_max_parachain_inbound_channels : pre.hrmp_max_parachain_inbound_channels, +hrmp_max_parachain_outbound_channels : pre.hrmp_max_parachain_outbound_channels, +hrmp_channel_max_message_size : pre.hrmp_channel_max_message_size, +code_retention_period : pre.code_retention_period, +on_demand_cores : pre.on_demand_cores, +on_demand_retries : pre.on_demand_retries, +group_rotation_frequency : pre.group_rotation_frequency, +paras_availability_period : pre.paras_availability_period, +scheduling_lookahead : pre.scheduling_lookahead, +max_validators_per_core : pre.max_validators_per_core, +max_validators : pre.max_validators, +dispute_period : pre.dispute_period, +dispute_post_conclusion_acceptance_period: pre.dispute_post_conclusion_acceptance_period, +no_show_slots : pre.no_show_slots, +n_delay_tranches : pre.n_delay_tranches, +zeroth_delay_tranche_width : pre.zeroth_delay_tranche_width, +needed_approvals : pre.needed_approvals, +relay_vrf_modulo_samples : pre.relay_vrf_modulo_samples, +pvf_voting_ttl : pre.pvf_voting_ttl, +minimum_validation_upgrade_delay : pre.minimum_validation_upgrade_delay, +async_backing_params : pre.async_backing_params, +executor_params : pre.executor_params, +on_demand_queue_max_size : pre.on_demand_queue_max_size, +on_demand_base_fee : pre.on_demand_base_fee, +on_demand_fee_variability : pre.on_demand_fee_variability, +on_demand_target_queue_utilization : pre.on_demand_target_queue_utilization, +on_demand_ttl : pre.on_demand_ttl, +minimum_backing_votes : pre.minimum_backing_votes, +node_features : pre.node_features, +approval_voting_params : ApprovalVotingParams { + max_approval_coalesce_count: 1, + } + } + }; + + let v10 = v10::ActiveConfig::::get() + .defensive_proof("Could not decode old config") + .unwrap_or_default(); + let v11 = translate(v10); + v11::ActiveConfig::::set(Some(v11)); + + // Allowed to be empty. + let pending_v9 = v10::PendingConfigs::::get().unwrap_or_default(); + let mut pending_v10 = Vec::new(); + + for (session, v10) in pending_v9.into_iter() { + let v11 = translate(v10); + pending_v10.push((session, v11)); + } + v11::PendingConfigs::::set(Some(pending_v10.clone())); + + let num_configs = (pending_v10.len() + 1) as u64; + T::DbWeight::get().reads_writes(num_configs, num_configs) +} + +#[cfg(test)] +mod tests { + use primitives::LEGACY_MIN_BACKING_VOTES; + + use super::*; + use crate::mock::{new_test_ext, Test}; + + #[test] + fn v11_deserialized_from_actual_data() { + // Example how to get new `raw_config`: + // We'll obtain the raw_config at a specified a block + // Steps: + // 1. Go to Polkadot.js -> Developer -> Chain state -> Storage: https://polkadot.js.org/apps/#/chainstate + // 2. Set these parameters: + // 2.1. selected state query: configuration; activeConfig(): + // PolkadotRuntimeParachainsConfigurationHostConfiguration + // 2.2. blockhash to query at: + // 0xf89d3ab5312c5f70d396dc59612f0aa65806c798346f9db4b35278baed2e0e53 (the hash of + // the block) + // 2.3. Note the value of encoded storage key -> + // 0x06de3d8a54d27e44a9d5ce189618f22db4b49d95320d9021994c850f25b8e385 for the + // referenced block. + // 2.4. You'll also need the decoded values to update the test. + // 3. Go to Polkadot.js -> Developer -> Chain state -> Raw storage + // 3.1 Enter the encoded storage key and you get the raw config. + + // This exceeds the maximal line width length, but that's fine, since this is not code and + // doesn't need to be read and also leaving it as one line allows to easily copy it. + let raw_config = + hex_literal::hex![" + 0000300000800000080000000000100000c8000005000000050000000200000002000000000000000000000000005000000010000400000000000000000000000000000000000000000000000000000000000000000000000800000000200000040000000000100000b004000000000000000000001027000080b2e60e80c3c9018096980000000000000000000000000005000000140000000400000001000000010100000000060000006400000002000000190000000000000002000000020000000200000005000000020000000001000000" + ]; + + let v11 = + V11HostConfiguration::::decode(&mut &raw_config[..]).unwrap(); + + // We check only a sample of the values here. If we missed any fields or messed up data + // types that would skew all the fields coming after. + assert_eq!(v11.max_code_size, 3_145_728); + assert_eq!(v11.validation_upgrade_cooldown, 2); + assert_eq!(v11.max_pov_size, 5_242_880); + assert_eq!(v11.hrmp_channel_max_message_size, 1_048_576); + assert_eq!(v11.n_delay_tranches, 25); + assert_eq!(v11.minimum_validation_upgrade_delay, 5); + assert_eq!(v11.group_rotation_frequency, 20); + assert_eq!(v11.on_demand_cores, 0); + assert_eq!(v11.on_demand_base_fee, 10_000_000); + assert_eq!(v11.minimum_backing_votes, LEGACY_MIN_BACKING_VOTES); + assert_eq!(v11.approval_voting_params.max_approval_coalesce_count, 1); + } + + #[test] + fn test_migrate_to_v11() { + // Host configuration has lots of fields. However, in this migration we only add one + // field. The most important part to check are a couple of the last fields. We also pick + // extra fields to check arbitrarily, e.g. depending on their position (i.e. the middle) and + // also their type. + // + // We specify only the picked fields and the rest should be provided by the `Default` + // implementation. That implementation is copied over between the two types and should work + // fine. + let v10 = V10HostConfiguration:: { + needed_approvals: 69, + paras_availability_period: 55, + hrmp_recipient_deposit: 1337, + max_pov_size: 1111, + minimum_validation_upgrade_delay: 20, + ..Default::default() + }; + + let mut pending_configs = Vec::new(); + pending_configs.push((100, v10.clone())); + pending_configs.push((300, v10.clone())); + + new_test_ext(Default::default()).execute_with(|| { + // Implant the v10 version in the state. + v10::ActiveConfig::::set(Some(v10)); + v10::PendingConfigs::::set(Some(pending_configs)); + + migrate_to_v11::(); + + let v11 = v11::ActiveConfig::::get().unwrap(); + assert_eq!(v11.approval_voting_params.max_approval_coalesce_count, 1); + + let mut configs_to_check = v11::PendingConfigs::::get().unwrap(); + configs_to_check.push((0, v11.clone())); + + for (_, v10) in configs_to_check { + #[rustfmt::skip] + { + assert_eq!(v10.max_code_size , v11.max_code_size); + assert_eq!(v10.max_head_data_size , v11.max_head_data_size); + assert_eq!(v10.max_upward_queue_count , v11.max_upward_queue_count); + assert_eq!(v10.max_upward_queue_size , v11.max_upward_queue_size); + assert_eq!(v10.max_upward_message_size , v11.max_upward_message_size); + assert_eq!(v10.max_upward_message_num_per_candidate , v11.max_upward_message_num_per_candidate); + assert_eq!(v10.hrmp_max_message_num_per_candidate , v11.hrmp_max_message_num_per_candidate); + assert_eq!(v10.validation_upgrade_cooldown , v11.validation_upgrade_cooldown); + assert_eq!(v10.validation_upgrade_delay , v11.validation_upgrade_delay); + assert_eq!(v10.max_pov_size , v11.max_pov_size); + assert_eq!(v10.max_downward_message_size , v11.max_downward_message_size); + assert_eq!(v10.hrmp_max_parachain_outbound_channels , v11.hrmp_max_parachain_outbound_channels); + assert_eq!(v10.hrmp_sender_deposit , v11.hrmp_sender_deposit); + assert_eq!(v10.hrmp_recipient_deposit , v11.hrmp_recipient_deposit); + assert_eq!(v10.hrmp_channel_max_capacity , v11.hrmp_channel_max_capacity); + assert_eq!(v10.hrmp_channel_max_total_size , v11.hrmp_channel_max_total_size); + assert_eq!(v10.hrmp_max_parachain_inbound_channels , v11.hrmp_max_parachain_inbound_channels); + assert_eq!(v10.hrmp_channel_max_message_size , v11.hrmp_channel_max_message_size); + assert_eq!(v10.code_retention_period , v11.code_retention_period); + assert_eq!(v10.on_demand_cores , v11.on_demand_cores); + assert_eq!(v10.on_demand_retries , v11.on_demand_retries); + assert_eq!(v10.group_rotation_frequency , v11.group_rotation_frequency); + assert_eq!(v10.paras_availability_period , v11.paras_availability_period); + assert_eq!(v10.scheduling_lookahead , v11.scheduling_lookahead); + assert_eq!(v10.max_validators_per_core , v11.max_validators_per_core); + assert_eq!(v10.max_validators , v11.max_validators); + assert_eq!(v10.dispute_period , v11.dispute_period); + assert_eq!(v10.no_show_slots , v11.no_show_slots); + assert_eq!(v10.n_delay_tranches , v11.n_delay_tranches); + assert_eq!(v10.zeroth_delay_tranche_width , v11.zeroth_delay_tranche_width); + assert_eq!(v10.needed_approvals , v11.needed_approvals); + assert_eq!(v10.relay_vrf_modulo_samples , v11.relay_vrf_modulo_samples); + assert_eq!(v10.pvf_voting_ttl , v11.pvf_voting_ttl); + assert_eq!(v10.minimum_validation_upgrade_delay , v11.minimum_validation_upgrade_delay); + assert_eq!(v10.async_backing_params.allowed_ancestry_len, v11.async_backing_params.allowed_ancestry_len); + assert_eq!(v10.async_backing_params.max_candidate_depth , v11.async_backing_params.max_candidate_depth); + assert_eq!(v10.executor_params , v11.executor_params); + assert_eq!(v10.minimum_backing_votes , v11.minimum_backing_votes); + }; // ; makes this a statement. `rustfmt::skip` cannot be put on an expression. + } + }); + } + + // Test that migration doesn't panic in case there're no pending configurations upgrades in + // pallet's storage. + #[test] + fn test_migrate_to_v11_no_pending() { + let v10 = V10HostConfiguration::::default(); + + new_test_ext(Default::default()).execute_with(|| { + // Implant the v10 version in the state. + v10::ActiveConfig::::set(Some(v10)); + // Ensure there're no pending configs. + v11::PendingConfigs::::set(None); + + // Shouldn't fail. + migrate_to_v11::(); + }); + } +} diff --git a/polkadot/runtime/parachains/src/configuration/migration/v8.rs b/polkadot/runtime/parachains/src/configuration/migration/v8.rs index d1bc9005112..537dfa9abd7 100644 --- a/polkadot/runtime/parachains/src/configuration/migration/v8.rs +++ b/polkadot/runtime/parachains/src/configuration/migration/v8.rs @@ -250,7 +250,7 @@ on_demand_fee_variability : Perbill::from_percent(3), on_demand_target_queue_utilization : Perbill::from_percent(25), on_demand_ttl : 5u32.into(), } - }; +}; let v7 = v7::ActiveConfig::::get() .defensive_proof("Could not decode old config") diff --git a/polkadot/runtime/parachains/src/configuration/tests.rs b/polkadot/runtime/parachains/src/configuration/tests.rs index b62a45355e1..d88572d3b55 100644 --- a/polkadot/runtime/parachains/src/configuration/tests.rs +++ b/polkadot/runtime/parachains/src/configuration/tests.rs @@ -313,6 +313,7 @@ fn setting_pending_config_members() { pvf_voting_ttl: 3, minimum_validation_upgrade_delay: 20, executor_params: Default::default(), + approval_voting_params: ApprovalVotingParams { max_approval_coalesce_count: 1 }, on_demand_queue_max_size: 10_000u32, on_demand_base_fee: 10_000_000u128, on_demand_fee_variability: Perbill::from_percent(3), diff --git a/polkadot/runtime/parachains/src/disputes.rs b/polkadot/runtime/parachains/src/disputes.rs index cf2e99e7359..c2383dad305 100644 --- a/polkadot/runtime/parachains/src/disputes.rs +++ b/polkadot/runtime/parachains/src/disputes.rs @@ -25,11 +25,11 @@ use frame_system::pallet_prelude::*; use parity_scale_codec::{Decode, Encode}; use polkadot_runtime_metrics::get_current_time; use primitives::{ - byzantine_threshold, supermajority_threshold, ApprovalVote, CandidateHash, - CheckedDisputeStatementSet, CheckedMultiDisputeStatementSet, CompactStatement, ConsensusLog, - DisputeState, DisputeStatement, DisputeStatementSet, ExplicitDisputeStatement, - InvalidDisputeStatementKind, MultiDisputeStatementSet, SessionIndex, SigningContext, - ValidDisputeStatementKind, ValidatorId, ValidatorIndex, ValidatorSignature, + byzantine_threshold, supermajority_threshold, vstaging::ApprovalVoteMultipleCandidates, + ApprovalVote, CandidateHash, CheckedDisputeStatementSet, CheckedMultiDisputeStatementSet, + CompactStatement, ConsensusLog, DisputeState, DisputeStatement, DisputeStatementSet, + ExplicitDisputeStatement, InvalidDisputeStatementKind, MultiDisputeStatementSet, SessionIndex, + SigningContext, ValidDisputeStatementKind, ValidatorId, ValidatorIndex, ValidatorSignature, }; use scale_info::TypeInfo; use sp_runtime::{ @@ -952,6 +952,8 @@ impl Pallet { None => return StatementSetFilter::RemoveAll, }; + let config = >::config(); + let n_validators = session_info.validators.len(); // Check for ancient. @@ -1015,7 +1017,14 @@ impl Pallet { set.session, statement, signature, + // This is here to prevent malicious nodes of generating + // `ValidDisputeStatementKind::ApprovalCheckingMultipleCandidates` before that + // is enabled, via setting `max_approval_coalesce_count` in the parachain host + // config. + config.approval_voting_params.max_approval_coalesce_count > 1, ) { + log::warn!("Failed to check dispute signature"); + importer.undo(undo); filter.remove_index(i); continue @@ -1260,22 +1269,31 @@ fn check_signature( session: SessionIndex, statement: &DisputeStatement, validator_signature: &ValidatorSignature, + approval_multiple_candidates_enabled: bool, ) -> Result<(), ()> { - let payload = match *statement { + let payload = match statement { DisputeStatement::Valid(ValidDisputeStatementKind::Explicit) => ExplicitDisputeStatement { valid: true, candidate_hash, session }.signing_payload(), DisputeStatement::Valid(ValidDisputeStatementKind::BackingSeconded(inclusion_parent)) => CompactStatement::Seconded(candidate_hash).signing_payload(&SigningContext { session_index: session, - parent_hash: inclusion_parent, + parent_hash: *inclusion_parent, }), DisputeStatement::Valid(ValidDisputeStatementKind::BackingValid(inclusion_parent)) => CompactStatement::Valid(candidate_hash).signing_payload(&SigningContext { session_index: session, - parent_hash: inclusion_parent, + parent_hash: *inclusion_parent, }), DisputeStatement::Valid(ValidDisputeStatementKind::ApprovalChecking) => ApprovalVote(candidate_hash).signing_payload(session), + DisputeStatement::Valid(ValidDisputeStatementKind::ApprovalCheckingMultipleCandidates( + candidates, + )) => + if approval_multiple_candidates_enabled && candidates.contains(&candidate_hash) { + ApprovalVoteMultipleCandidates(candidates).signing_payload(session) + } else { + return Err(()) + }, DisputeStatement::Invalid(InvalidDisputeStatementKind::Explicit) => ExplicitDisputeStatement { valid: false, candidate_hash, session }.signing_payload(), }; diff --git a/polkadot/runtime/parachains/src/disputes/tests.rs b/polkadot/runtime/parachains/src/disputes/tests.rs index 0757084084f..1f3f00132d6 100644 --- a/polkadot/runtime/parachains/src/disputes/tests.rs +++ b/polkadot/runtime/parachains/src/disputes/tests.rs @@ -1500,7 +1500,8 @@ fn test_check_signature() { candidate_hash, session, &statement_1, - &signed_1 + &signed_1, + true, ) .is_ok()); assert!(check_signature( @@ -1508,7 +1509,8 @@ fn test_check_signature() { candidate_hash, session, &statement_1, - &signed_1 + &signed_1, + true ) .is_err()); assert!(check_signature( @@ -1516,7 +1518,8 @@ fn test_check_signature() { wrong_candidate_hash, session, &statement_1, - &signed_1 + &signed_1, + true, ) .is_err()); assert!(check_signature( @@ -1524,7 +1527,8 @@ fn test_check_signature() { candidate_hash, wrong_session, &statement_1, - &signed_1 + &signed_1, + true ) .is_err()); assert!(check_signature( @@ -1532,7 +1536,8 @@ fn test_check_signature() { candidate_hash, session, &statement_2, - &signed_1 + &signed_1, + true, ) .is_err()); assert!(check_signature( @@ -1540,7 +1545,8 @@ fn test_check_signature() { candidate_hash, session, &statement_3, - &signed_1 + &signed_1, + true ) .is_err()); assert!(check_signature( @@ -1548,7 +1554,8 @@ fn test_check_signature() { candidate_hash, session, &statement_4, - &signed_1 + &signed_1, + true ) .is_err()); assert!(check_signature( @@ -1556,7 +1563,8 @@ fn test_check_signature() { candidate_hash, session, &statement_5, - &signed_1 + &signed_1, + true, ) .is_err()); @@ -1565,7 +1573,8 @@ fn test_check_signature() { candidate_hash, session, &statement_2, - &signed_2 + &signed_2, + true, ) .is_ok()); assert!(check_signature( @@ -1573,7 +1582,8 @@ fn test_check_signature() { candidate_hash, session, &statement_2, - &signed_2 + &signed_2, + true, ) .is_err()); assert!(check_signature( @@ -1581,7 +1591,8 @@ fn test_check_signature() { wrong_candidate_hash, session, &statement_2, - &signed_2 + &signed_2, + true, ) .is_err()); assert!(check_signature( @@ -1589,7 +1600,8 @@ fn test_check_signature() { candidate_hash, wrong_session, &statement_2, - &signed_2 + &signed_2, + true ) .is_err()); assert!(check_signature( @@ -1597,7 +1609,8 @@ fn test_check_signature() { candidate_hash, session, &wrong_statement_2, - &signed_2 + &signed_2, + true, ) .is_err()); assert!(check_signature( @@ -1605,7 +1618,8 @@ fn test_check_signature() { candidate_hash, session, &statement_1, - &signed_2 + &signed_2, + true, ) .is_err()); assert!(check_signature( @@ -1613,7 +1627,8 @@ fn test_check_signature() { candidate_hash, session, &statement_3, - &signed_2 + &signed_2, + true, ) .is_err()); assert!(check_signature( @@ -1621,7 +1636,8 @@ fn test_check_signature() { candidate_hash, session, &statement_4, - &signed_2 + &signed_2, + true, ) .is_err()); assert!(check_signature( @@ -1629,7 +1645,8 @@ fn test_check_signature() { candidate_hash, session, &statement_5, - &signed_2 + &signed_2, + true, ) .is_err()); @@ -1638,7 +1655,8 @@ fn test_check_signature() { candidate_hash, session, &statement_3, - &signed_3 + &signed_3, + true, ) .is_ok()); assert!(check_signature( @@ -1646,7 +1664,8 @@ fn test_check_signature() { candidate_hash, session, &statement_3, - &signed_3 + &signed_3, + true, ) .is_err()); assert!(check_signature( @@ -1654,7 +1673,8 @@ fn test_check_signature() { wrong_candidate_hash, session, &statement_3, - &signed_3 + &signed_3, + true, ) .is_err()); assert!(check_signature( @@ -1662,7 +1682,8 @@ fn test_check_signature() { candidate_hash, wrong_session, &statement_3, - &signed_3 + &signed_3, + true, ) .is_err()); assert!(check_signature( @@ -1670,7 +1691,8 @@ fn test_check_signature() { candidate_hash, session, &wrong_statement_3, - &signed_3 + &signed_3, + true, ) .is_err()); assert!(check_signature( @@ -1678,7 +1700,8 @@ fn test_check_signature() { candidate_hash, session, &statement_1, - &signed_3 + &signed_3, + true, ) .is_err()); assert!(check_signature( @@ -1686,7 +1709,8 @@ fn test_check_signature() { candidate_hash, session, &statement_2, - &signed_3 + &signed_3, + true ) .is_err()); assert!(check_signature( @@ -1694,7 +1718,8 @@ fn test_check_signature() { candidate_hash, session, &statement_4, - &signed_3 + &signed_3, + true, ) .is_err()); assert!(check_signature( @@ -1702,7 +1727,8 @@ fn test_check_signature() { candidate_hash, session, &statement_5, - &signed_3 + &signed_3, + true, ) .is_err()); @@ -1711,7 +1737,8 @@ fn test_check_signature() { candidate_hash, session, &statement_4, - &signed_4 + &signed_4, + true, ) .is_ok()); assert!(check_signature( @@ -1719,7 +1746,8 @@ fn test_check_signature() { candidate_hash, session, &statement_4, - &signed_4 + &signed_4, + true, ) .is_err()); assert!(check_signature( @@ -1727,7 +1755,8 @@ fn test_check_signature() { wrong_candidate_hash, session, &statement_4, - &signed_4 + &signed_4, + true, ) .is_err()); assert!(check_signature( @@ -1735,7 +1764,8 @@ fn test_check_signature() { candidate_hash, wrong_session, &statement_4, - &signed_4 + &signed_4, + true, ) .is_err()); assert!(check_signature( @@ -1743,7 +1773,8 @@ fn test_check_signature() { candidate_hash, session, &statement_1, - &signed_4 + &signed_4, + true, ) .is_err()); assert!(check_signature( @@ -1751,7 +1782,8 @@ fn test_check_signature() { candidate_hash, session, &statement_2, - &signed_4 + &signed_4, + true, ) .is_err()); assert!(check_signature( @@ -1759,7 +1791,8 @@ fn test_check_signature() { candidate_hash, session, &statement_3, - &signed_4 + &signed_4, + true, ) .is_err()); assert!(check_signature( @@ -1767,7 +1800,8 @@ fn test_check_signature() { candidate_hash, session, &statement_5, - &signed_4 + &signed_4, + true, ) .is_err()); @@ -1776,7 +1810,8 @@ fn test_check_signature() { candidate_hash, session, &statement_5, - &signed_5 + &signed_5, + true, ) .is_ok()); assert!(check_signature( @@ -1784,7 +1819,8 @@ fn test_check_signature() { candidate_hash, session, &statement_5, - &signed_5 + &signed_5, + true, ) .is_err()); assert!(check_signature( @@ -1792,7 +1828,8 @@ fn test_check_signature() { wrong_candidate_hash, session, &statement_5, - &signed_5 + &signed_5, + true, ) .is_err()); assert!(check_signature( @@ -1800,7 +1837,8 @@ fn test_check_signature() { candidate_hash, wrong_session, &statement_5, - &signed_5 + &signed_5, + true, ) .is_err()); assert!(check_signature( @@ -1808,7 +1846,8 @@ fn test_check_signature() { candidate_hash, session, &statement_1, - &signed_5 + &signed_5, + true, ) .is_err()); assert!(check_signature( @@ -1816,7 +1855,8 @@ fn test_check_signature() { candidate_hash, session, &statement_2, - &signed_5 + &signed_5, + true, ) .is_err()); assert!(check_signature( @@ -1824,7 +1864,8 @@ fn test_check_signature() { candidate_hash, session, &statement_3, - &signed_5 + &signed_5, + true, ) .is_err()); assert!(check_signature( @@ -1832,7 +1873,8 @@ fn test_check_signature() { candidate_hash, session, &statement_4, - &signed_5 + &signed_5, + true, ) .is_err()); } diff --git a/polkadot/runtime/parachains/src/runtime_api_impl/vstaging.rs b/polkadot/runtime/parachains/src/runtime_api_impl/vstaging.rs index 200fd57915f..0da50f6a537 100644 --- a/polkadot/runtime/parachains/src/runtime_api_impl/vstaging.rs +++ b/polkadot/runtime/parachains/src/runtime_api_impl/vstaging.rs @@ -17,7 +17,10 @@ //! Put implementations of functions from staging APIs here. use crate::{configuration, initializer, shared}; -use primitives::{vstaging::NodeFeatures, ValidatorIndex}; +use primitives::{ + vstaging::{ApprovalVotingParams, NodeFeatures}, + ValidatorIndex, +}; use sp_std::{collections::btree_map::BTreeMap, prelude::Vec}; /// Implementation for `DisabledValidators` @@ -47,3 +50,9 @@ where pub fn node_features() -> NodeFeatures { >::config().node_features } + +/// Approval voting subsystem configuration parameteres +pub fn approval_voting_params() -> ApprovalVotingParams { + let config = >::config(); + config.approval_voting_params +} diff --git a/polkadot/runtime/rococo/src/lib.rs b/polkadot/runtime/rococo/src/lib.rs index 1e40f14f492..43df232e92a 100644 --- a/polkadot/runtime/rococo/src/lib.rs +++ b/polkadot/runtime/rococo/src/lib.rs @@ -23,12 +23,13 @@ use pallet_nis::WithMaximumOf; use parity_scale_codec::{Decode, Encode, MaxEncodedLen}; use primitives::{ - slashing, vstaging::NodeFeatures, AccountId, AccountIndex, Balance, BlockNumber, - CandidateEvent, CandidateHash, CommittedCandidateReceipt, CoreState, DisputeState, - ExecutorParams, GroupRotationInfo, Hash, Id as ParaId, InboundDownwardMessage, - InboundHrmpMessage, Moment, Nonce, OccupiedCoreAssumption, PersistedValidationData, - ScrapedOnChainVotes, SessionInfo, Signature, ValidationCode, ValidationCodeHash, ValidatorId, - ValidatorIndex, PARACHAIN_KEY_TYPE_ID, + slashing, + vstaging::{ApprovalVotingParams, NodeFeatures}, + AccountId, AccountIndex, Balance, BlockNumber, CandidateEvent, CandidateHash, + CommittedCandidateReceipt, CoreState, DisputeState, ExecutorParams, GroupRotationInfo, Hash, + Id as ParaId, InboundDownwardMessage, InboundHrmpMessage, Moment, Nonce, + OccupiedCoreAssumption, PersistedValidationData, ScrapedOnChainVotes, SessionInfo, Signature, + ValidationCode, ValidationCodeHash, ValidatorId, ValidatorIndex, PARACHAIN_KEY_TYPE_ID, }; use runtime_common::{ assigned_slots, auctions, claims, crowdloan, identity_migrator, impl_runtime_weights, @@ -1631,6 +1632,7 @@ pub mod migrations { // Remove `im-online` pallet on-chain storage frame_support::migrations::RemovePallet::DbWeight>, + parachains_configuration::migration::v11::MigrateToV11, ); } @@ -1792,7 +1794,7 @@ sp_api::impl_runtime_apis! { } } - #[api_version(9)] + #[api_version(10)] impl primitives::runtime_api::ParachainHost for Runtime { fn validators() -> Vec { parachains_runtime_api_impl::validators::() @@ -1936,6 +1938,10 @@ sp_api::impl_runtime_apis! { parachains_runtime_api_impl::async_backing_params::() } + fn approval_voting_params() -> ApprovalVotingParams { + parachains_staging_runtime_api_impl::approval_voting_params::() + } + fn disabled_validators() -> Vec { parachains_staging_runtime_api_impl::disabled_validators::() } diff --git a/polkadot/runtime/westend/src/lib.rs b/polkadot/runtime/westend/src/lib.rs index 0a70a493b29..9b8eff480f2 100644 --- a/polkadot/runtime/westend/src/lib.rs +++ b/polkadot/runtime/westend/src/lib.rs @@ -45,12 +45,14 @@ use pallet_session::historical as session_historical; use pallet_transaction_payment::{CurrencyAdapter, FeeDetails, RuntimeDispatchInfo}; use parity_scale_codec::{Decode, Encode, MaxEncodedLen}; use primitives::{ - slashing, vstaging::NodeFeatures, AccountId, AccountIndex, Balance, BlockNumber, - CandidateEvent, CandidateHash, CommittedCandidateReceipt, CoreState, DisputeState, - ExecutorParams, GroupRotationInfo, Hash, Id as ParaId, InboundDownwardMessage, - InboundHrmpMessage, Moment, Nonce, OccupiedCoreAssumption, PersistedValidationData, - PvfCheckStatement, ScrapedOnChainVotes, SessionInfo, Signature, ValidationCode, - ValidationCodeHash, ValidatorId, ValidatorIndex, ValidatorSignature, PARACHAIN_KEY_TYPE_ID, + slashing, + vstaging::{ApprovalVotingParams, NodeFeatures}, + AccountId, AccountIndex, Balance, BlockNumber, CandidateEvent, CandidateHash, + CommittedCandidateReceipt, CoreState, DisputeState, ExecutorParams, GroupRotationInfo, Hash, + Id as ParaId, InboundDownwardMessage, InboundHrmpMessage, Moment, Nonce, + OccupiedCoreAssumption, PersistedValidationData, PvfCheckStatement, ScrapedOnChainVotes, + SessionInfo, Signature, ValidationCode, ValidationCodeHash, ValidatorId, ValidatorIndex, + ValidatorSignature, PARACHAIN_KEY_TYPE_ID, }; use runtime_common::{ assigned_slots, auctions, crowdloan, @@ -1649,6 +1651,7 @@ pub mod migrations { ImOnlinePalletName, ::DbWeight, >, + parachains_configuration::migration::v11::MigrateToV11, ); } @@ -1789,7 +1792,7 @@ sp_api::impl_runtime_apis! { } } - #[api_version(9)] + #[api_version(10)] impl primitives::runtime_api::ParachainHost for Runtime { fn validators() -> Vec { parachains_runtime_api_impl::validators::() @@ -1933,6 +1936,10 @@ sp_api::impl_runtime_apis! { parachains_runtime_api_impl::async_backing_params::() } + fn approval_voting_params() -> ApprovalVotingParams { + parachains_staging_runtime_api_impl::approval_voting_params::() + } + fn disabled_validators() -> Vec { parachains_staging_runtime_api_impl::disabled_validators::() } diff --git a/polkadot/zombienet_tests/functional/0001-parachains-pvf.zndsl b/polkadot/zombienet_tests/functional/0001-parachains-pvf.zndsl index 135999a092a..3e1d8ba771c 100644 --- a/polkadot/zombienet_tests/functional/0001-parachains-pvf.zndsl +++ b/polkadot/zombienet_tests/functional/0001-parachains-pvf.zndsl @@ -32,6 +32,8 @@ alice: parachain 2005 block height is at least 10 within 300 seconds alice: parachain 2006 block height is at least 10 within 300 seconds alice: parachain 2007 block height is at least 10 within 300 seconds +alice: reports substrate_block_height{status="finalized"} is at least 30 within 400 seconds + # Check preparation time is under 10s. # Check all buckets <= 10. alice: reports histogram polkadot_pvf_preparation_time has at least 1 samples in buckets ["0.1", "0.5", "1", "2", "3", "10"] within 10 seconds diff --git a/polkadot/zombienet_tests/functional/0002-parachains-disputes.toml b/polkadot/zombienet_tests/functional/0002-parachains-disputes.toml index e70322e13e6..27cd81dface 100644 --- a/polkadot/zombienet_tests/functional/0002-parachains-disputes.toml +++ b/polkadot/zombienet_tests/functional/0002-parachains-disputes.toml @@ -5,6 +5,10 @@ timeout = 1000 max_validators_per_core = 5 needed_approvals = 8 +[relaychain.genesis.runtime.runtime_genesis_config.configuration.config.approval_voting_params] + max_approval_coalesce_count = 5 + + [relaychain] default_image = "{{ZOMBIENET_INTEGRATION_TEST_IMAGE}}" chain = "rococo-local" diff --git a/polkadot/zombienet_tests/functional/0009-approval-voting-coalescing.toml b/polkadot/zombienet_tests/functional/0009-approval-voting-coalescing.toml new file mode 100644 index 00000000000..19c7015403d --- /dev/null +++ b/polkadot/zombienet_tests/functional/0009-approval-voting-coalescing.toml @@ -0,0 +1,115 @@ +[settings] +timeout = 1000 + +[relaychain] +default_image = "{{ZOMBIENET_INTEGRATION_TEST_IMAGE}}" +chain = "rococo-local" + +[relaychain.genesis.runtimeGenesis.patch.configuration.config] + needed_approvals = 4 + relay_vrf_modulo_samples = 6 + +[relaychain.genesis.runtimeGenesis.patch.configuration.config.approval_voting_params] + max_approval_coalesce_count = 5 + +[relaychain.default_resources] +limits = { memory = "4G", cpu = "2" } +requests = { memory = "2G", cpu = "1" } + + [[relaychain.node_groups]] + name = "alice" + args = [ "-lparachain=trace,runtime=debug" ] + count = 13 + +[[parachains]] +id = 2000 +addToGenesis = true +genesis_state_generator = "undying-collator export-genesis-state --pov-size=100000 --pvf-complexity=1" + + [parachains.collator] + name = "collator01" + image = "{{COL_IMAGE}}" + command = "undying-collator" + args = ["-lparachain=debug", "--pov-size=100000", "--pvf-complexity=1", "--parachain-id=2000"] + +[[parachains]] +id = 2001 +addToGenesis = true +genesis_state_generator = "undying-collator export-genesis-state --pov-size=100000 --pvf-complexity=10" + + [parachains.collator] + name = "collator02" + image = "{{COL_IMAGE}}" + command = "undying-collator" + args = ["-lparachain=debug", "--pov-size=100000", "--parachain-id=2001", "--pvf-complexity=10"] + +[[parachains]] +id = 2002 +addToGenesis = true +genesis_state_generator = "undying-collator export-genesis-state --pov-size=100000 --pvf-complexity=100" + + [parachains.collator] + name = "collator03" + image = "{{COL_IMAGE}}" + command = "undying-collator" + args = ["-lparachain=debug", "--pov-size=100000", "--parachain-id=2002", "--pvf-complexity=100"] + +[[parachains]] +id = 2003 +addToGenesis = true +genesis_state_generator = "undying-collator export-genesis-state --pov-size=20000 --pvf-complexity=300" + + [parachains.collator] + name = "collator04" + image = "{{COL_IMAGE}}" + command = "undying-collator" + args = ["-lparachain=debug", "--pov-size=20000", "--parachain-id=2003", "--pvf-complexity=300"] + +[[parachains]] +id = 2004 +addToGenesis = true +genesis_state_generator = "undying-collator export-genesis-state --pov-size=100000 --pvf-complexity=300" + + [parachains.collator] + name = "collator05" + image = "{{COL_IMAGE}}" + command = "undying-collator" + args = ["-lparachain=debug", "--pov-size=100000", "--parachain-id=2004", "--pvf-complexity=300"] + +[[parachains]] +id = 2005 +addToGenesis = true +genesis_state_generator = "undying-collator export-genesis-state --pov-size=20000 --pvf-complexity=400" + + [parachains.collator] + name = "collator06" + image = "{{COL_IMAGE}}" + command = "undying-collator" + args = ["-lparachain=debug", "--pov-size=20000", "--pvf-complexity=400", "--parachain-id=2005"] + +[[parachains]] +id = 2006 +addToGenesis = true +genesis_state_generator = "undying-collator export-genesis-state --pov-size=100000 --pvf-complexity=300" + + [parachains.collator] + name = "collator07" + image = "{{COL_IMAGE}}" + command = "undying-collator" + args = ["-lparachain=debug", "--pov-size=100000", "--pvf-complexity=300", "--parachain-id=2006"] + +[[parachains]] +id = 2007 +addToGenesis = true +genesis_state_generator = "undying-collator export-genesis-state --pov-size=100000 --pvf-complexity=300" + + [parachains.collator] + name = "collator08" + image = "{{COL_IMAGE}}" + command = "undying-collator" + args = ["-lparachain=debug", "--pov-size=100000", "--pvf-complexity=300", "--parachain-id=2007"] + +[types.Header] +number = "u64" +parent_hash = "Hash" +post_state = "Hash" \ No newline at end of file diff --git a/polkadot/zombienet_tests/functional/0009-approval-voting-coalescing.zndsl b/polkadot/zombienet_tests/functional/0009-approval-voting-coalescing.zndsl new file mode 100644 index 00000000000..1fc4f678446 --- /dev/null +++ b/polkadot/zombienet_tests/functional/0009-approval-voting-coalescing.zndsl @@ -0,0 +1,32 @@ +Description: Approval voting coalescing does not lag finality +Network: ./0009-approval-voting-coalescing.toml +Creds: config + +# Check authority status. +alice: reports node_roles is 4 + +# Ensure parachains are registered. +alice: parachain 2000 is registered within 60 seconds +alice: parachain 2001 is registered within 60 seconds +alice: parachain 2002 is registered within 60 seconds +alice: parachain 2003 is registered within 60 seconds +alice: parachain 2004 is registered within 60 seconds +alice: parachain 2005 is registered within 60 seconds +alice: parachain 2006 is registered within 60 seconds +alice: parachain 2007 is registered within 60 seconds + +# Ensure parachains made progress. +alice: parachain 2000 block height is at least 10 within 300 seconds +alice: parachain 2001 block height is at least 10 within 300 seconds +alice: parachain 2002 block height is at least 10 within 300 seconds +alice: parachain 2003 block height is at least 10 within 300 seconds +alice: parachain 2004 block height is at least 10 within 300 seconds +alice: parachain 2005 block height is at least 10 within 300 seconds +alice: parachain 2006 block height is at least 10 within 300 seconds +alice: parachain 2007 block height is at least 10 within 300 seconds + +alice: reports substrate_block_height{status="finalized"} is at least 30 within 400 seconds + +alice: reports polkadot_parachain_approval_checking_finality_lag < 3 + +alice: reports polkadot_parachain_approvals_no_shows_total < 3 within 10 seconds diff --git a/prdoc/pr_1191.prdoc b/prdoc/pr_1191.prdoc new file mode 100644 index 00000000000..26626731be4 --- /dev/null +++ b/prdoc/pr_1191.prdoc @@ -0,0 +1,21 @@ +title: Approve multiple candidates with a single signature + +doc: + - audience: Node Operator + description: | + Changed approval-voting, approval-distribution to approve multiple candidate with a single message, it adds: + * A new parachains_db version. + * A new validation protocol to support the new message types. + The new logic will be disabled and will be enabled at a later date after all validators have upgraded. + +migrations: + db: + - name: Parachains database change from v4 to v5. + description: | + Approval-voting column format has been updated with several new fields. All existing data will be automatically + be migrated to the new values. + +crates: + - name: "polkadot" + +host_functions: [] -- GitLab From 8683bbeefb688364f5f9e445dffb42fc266dd8f0 Mon Sep 17 00:00:00 2001 From: Joshy Orndorff Date: Wed, 13 Dec 2023 04:18:33 -0500 Subject: [PATCH 020/191] Rename `ExportGenesisStateCommand` to `ExportGenesisHeadCommand` and make it respect custom genesis block builders (#2331) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #2326. This PR both fixes a logic bug and replaces an incorrect name. ## Bug Fix: Respecting custom genesis builder Prior to this PR the standard logic for creating a genesis block was repeated inside of cumulus. This PR removes that duplicated logic, and calls into the proper `BuildGenesisBlock` implementation. One consequence is that if the genesis block has already been initialized, it will not be re-created, but rather read from the database like it is for other node invocations. So you need to watch out for old unpurged data during the development process. Offchain tools may need to be updated accordingly. I've already filed https://github.com/paritytech/zombienet/issues/1519 ## Rename: It doesn't export state. It exports head data. The name export-genesis-state was always wrong, nad it's never too late to right a wrong. I've changed the name of the struct to `ExportGenesisHeadCommand`. There is still the question of what to do with individual nodes' public CLIs. I have updated the parachain template to a reasonable default that preserves compatibility with tools that will expect `export-genesis-state` to still work. And I've chosen not to modify the public CLIs of any other nodes in the repo. I'll leave it up to their individual owners/maintains to decide whether that is appropriate. --------- Co-authored-by: Joshy Orndorff Co-authored-by: Bastian Köcher Co-authored-by: Bastian Köcher --- Cargo.lock | 1 + cumulus/client/cli/Cargo.toml | 1 + cumulus/client/cli/src/lib.rs | 85 ++++++------------- cumulus/parachain-template/node/src/cli.rs | 7 +- .../parachain-template/node/src/command.rs | 4 +- cumulus/polkadot-parachain/src/cli.rs | 3 +- cumulus/polkadot-parachain/src/command.rs | 4 +- cumulus/test/service/src/cli.rs | 37 +------- cumulus/test/service/src/genesis.rs | 43 +++++++++- cumulus/test/service/src/lib.rs | 4 +- cumulus/test/service/src/main.rs | 44 +++------- .../test-parachains/adder/collator/src/cli.rs | 6 +- .../undying/collator/src/cli.rs | 6 +- prdoc/pr_2331.prdoc | 17 ++++ 14 files changed, 119 insertions(+), 143 deletions(-) create mode 100644 prdoc/pr_2331.prdoc diff --git a/Cargo.lock b/Cargo.lock index ba8cccca1ed..0e2194829c2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3324,6 +3324,7 @@ dependencies = [ "sc-cli", "sc-client-api", "sc-service", + "sp-blockchain", "sp-core", "sp-runtime", "url", diff --git a/cumulus/client/cli/Cargo.toml b/cumulus/client/cli/Cargo.toml index c1b27673c40..af4912e2b2d 100644 --- a/cumulus/client/cli/Cargo.toml +++ b/cumulus/client/cli/Cargo.toml @@ -18,3 +18,4 @@ sc-chain-spec = { path = "../../../substrate/client/chain-spec" } sc-service = { path = "../../../substrate/client/service" } sp-core = { path = "../../../substrate/primitives/core" } sp-runtime = { path = "../../../substrate/primitives/runtime" } +sp-blockchain = { path = "../../../substrate/primitives/blockchain" } diff --git a/cumulus/client/cli/src/lib.rs b/cumulus/client/cli/src/lib.rs index 7e78afe6efb..1cebecb0043 100644 --- a/cumulus/client/cli/src/lib.rs +++ b/cumulus/client/cli/src/lib.rs @@ -23,20 +23,18 @@ use std::{ io::{self, Write}, net::SocketAddr, path::PathBuf, + sync::Arc, }; use codec::Encode; use sc_chain_spec::ChainSpec; -use sc_client_api::ExecutorProvider; +use sc_client_api::HeaderBackend; use sc_service::{ config::{PrometheusConfig, TelemetryEndpoints}, BasePath, TransactionPoolOptions, }; use sp_core::hexdisplay::HexDisplay; -use sp_runtime::{ - traits::{Block as BlockT, Hash as HashT, Header as HeaderT, Zero}, - StateVersion, -}; +use sp_runtime::traits::{Block as BlockT, Zero}; use url::Url; /// The `purge-chain` command used to remove the whole chain: the parachain and the relay chain. @@ -129,9 +127,9 @@ impl sc_cli::CliConfiguration for PurgeChainCmd { } } -/// Command for exporting the genesis state of the parachain +/// Command for exporting the genesis head data of the parachain #[derive(Debug, clap::Parser)] -pub struct ExportGenesisStateCommand { +pub struct ExportGenesisHeadCommand { /// Output file name or stdout if unspecified. #[arg()] pub output: Option, @@ -145,24 +143,29 @@ pub struct ExportGenesisStateCommand { pub shared_params: sc_cli::SharedParams, } -impl ExportGenesisStateCommand { - /// Run the export-genesis-state command - pub fn run( - &self, - chain_spec: &dyn ChainSpec, - client: &impl ExecutorProvider, - ) -> sc_cli::Result<()> { - let state_version = sc_chain_spec::resolve_state_version_from_wasm( - &chain_spec.build_storage()?, - client.executor(), - )?; - - let block: Block = generate_genesis_block(chain_spec, state_version)?; - let raw_header = block.header().encode(); +impl ExportGenesisHeadCommand { + /// Run the export-genesis-head command + pub fn run(&self, client: Arc) -> sc_cli::Result<()> + where + B: BlockT, + C: HeaderBackend + 'static, + { + let genesis_hash = client.hash(Zero::zero())?.ok_or(sc_cli::Error::Client( + sp_blockchain::Error::Backend( + "Failed to lookup genesis block hash when exporting genesis head data.".into(), + ), + ))?; + let genesis_header = client.header(genesis_hash)?.ok_or(sc_cli::Error::Client( + sp_blockchain::Error::Backend( + "Failed to lookup genesis header by hash when exporting genesis head data.".into(), + ), + ))?; + + let raw_header = genesis_header.encode(); let output_buf = if self.raw { raw_header } else { - format!("0x{:?}", HexDisplay::from(&block.header().encode())).into_bytes() + format!("0x{:?}", HexDisplay::from(&genesis_header.encode())).into_bytes() }; if let Some(output) = &self.output { @@ -175,43 +178,7 @@ impl ExportGenesisStateCommand { } } -/// Generate the genesis block from a given ChainSpec. -pub fn generate_genesis_block( - chain_spec: &dyn ChainSpec, - genesis_state_version: StateVersion, -) -> Result { - let storage = chain_spec.build_storage()?; - - let child_roots = storage.children_default.iter().map(|(sk, child_content)| { - let state_root = <<::Header as HeaderT>::Hashing as HashT>::trie_root( - child_content.data.clone().into_iter().collect(), - genesis_state_version, - ); - (sk.clone(), state_root.encode()) - }); - let state_root = <<::Header as HeaderT>::Hashing as HashT>::trie_root( - storage.top.clone().into_iter().chain(child_roots).collect(), - genesis_state_version, - ); - - let extrinsics_root = <<::Header as HeaderT>::Hashing as HashT>::trie_root( - Vec::new(), - genesis_state_version, - ); - - Ok(Block::new( - <::Header as HeaderT>::new( - Zero::zero(), - extrinsics_root, - state_root, - Default::default(), - Default::default(), - ), - Default::default(), - )) -} - -impl sc_cli::CliConfiguration for ExportGenesisStateCommand { +impl sc_cli::CliConfiguration for ExportGenesisHeadCommand { fn shared_params(&self) -> &sc_cli::SharedParams { &self.shared_params } diff --git a/cumulus/parachain-template/node/src/cli.rs b/cumulus/parachain-template/node/src/cli.rs index 098f59b0f37..73ef996b750 100644 --- a/cumulus/parachain-template/node/src/cli.rs +++ b/cumulus/parachain-template/node/src/cli.rs @@ -24,8 +24,11 @@ pub enum Subcommand { /// Remove the whole chain. PurgeChain(cumulus_client_cli::PurgeChainCmd), - /// Export the genesis state of the parachain. - ExportGenesisState(cumulus_client_cli::ExportGenesisStateCommand), + /// Export the genesis head data of the parachain. + /// + /// Head data is the encoded block header. + #[command(alias = "export-genesis-state")] + ExportGenesisHead(cumulus_client_cli::ExportGenesisHeadCommand), /// Export the genesis wasm of the parachain. ExportGenesisWasm(cumulus_client_cli::ExportGenesisWasmCommand), diff --git a/cumulus/parachain-template/node/src/command.rs b/cumulus/parachain-template/node/src/command.rs index 4dd8463f6be..6ddb68a359a 100644 --- a/cumulus/parachain-template/node/src/command.rs +++ b/cumulus/parachain-template/node/src/command.rs @@ -162,12 +162,12 @@ pub fn run() -> Result<()> { cmd.run(config, polkadot_config) }) }, - Some(Subcommand::ExportGenesisState(cmd)) => { + Some(Subcommand::ExportGenesisHead(cmd)) => { let runner = cli.create_runner(cmd)?; runner.sync_run(|config| { let partials = new_partial(&config)?; - cmd.run(&*config.chain_spec, &*partials.client) + cmd.run(partials.client) }) }, Some(Subcommand::ExportGenesisWasm(cmd)) => { diff --git a/cumulus/polkadot-parachain/src/cli.rs b/cumulus/polkadot-parachain/src/cli.rs index 63e4baf27ae..fec6e144e40 100644 --- a/cumulus/polkadot-parachain/src/cli.rs +++ b/cumulus/polkadot-parachain/src/cli.rs @@ -45,7 +45,8 @@ pub enum Subcommand { PurgeChain(cumulus_client_cli::PurgeChainCmd), /// Export the genesis state of the parachain. - ExportGenesisState(cumulus_client_cli::ExportGenesisStateCommand), + #[command(alias = "export-genesis-state")] + ExportGenesisHead(cumulus_client_cli::ExportGenesisHeadCommand), /// Export the genesis wasm of the parachain. ExportGenesisWasm(cumulus_client_cli::ExportGenesisWasmCommand), diff --git a/cumulus/polkadot-parachain/src/command.rs b/cumulus/polkadot-parachain/src/command.rs index 98dcc2fea4a..d1b020cc7c9 100644 --- a/cumulus/polkadot-parachain/src/command.rs +++ b/cumulus/polkadot-parachain/src/command.rs @@ -530,10 +530,10 @@ pub fn run() -> Result<()> { cmd.run(config, polkadot_config) }) }, - Some(Subcommand::ExportGenesisState(cmd)) => { + Some(Subcommand::ExportGenesisHead(cmd)) => { let runner = cli.create_runner(cmd)?; runner.sync_run(|config| { - construct_partials!(config, |partials| cmd.run(&*config.chain_spec, &*partials.client)) + construct_partials!(config, |partials| cmd.run(partials.client)) }) }, Some(Subcommand::ExportGenesisWasm(cmd)) => { diff --git a/cumulus/test/service/src/cli.rs b/cumulus/test/service/src/cli.rs index ef1159a3c1f..3dc5b8e3101 100644 --- a/cumulus/test/service/src/cli.rs +++ b/cumulus/test/service/src/cli.rs @@ -16,6 +16,7 @@ use std::{net::SocketAddr, path::PathBuf}; +use cumulus_client_cli::{ExportGenesisHeadCommand, ExportGenesisWasmCommand}; use polkadot_service::{ChainSpec, ParaId, PrometheusConfig}; use sc_cli::{ CliConfiguration, DefaultConfigurationValues, ImportParams, KeystoreParams, NetworkParams, @@ -60,45 +61,13 @@ pub enum Subcommand { BuildSpec(sc_cli::BuildSpecCmd), /// Export the genesis state of the parachain. - ExportGenesisState(ExportGenesisStateCommand), + #[command(alias = "export-genesis-state")] + ExportGenesisHead(ExportGenesisHeadCommand), /// Export the genesis wasm of the parachain. ExportGenesisWasm(ExportGenesisWasmCommand), } -#[derive(Debug, clap::Parser)] -#[group(skip)] -pub struct ExportGenesisStateCommand { - #[arg(default_value_t = 2000u32)] - pub parachain_id: u32, - - #[command(flatten)] - pub base: cumulus_client_cli::ExportGenesisStateCommand, -} - -impl CliConfiguration for ExportGenesisStateCommand { - fn shared_params(&self) -> &SharedParams { - &self.base.shared_params - } -} - -/// Command for exporting the genesis wasm file. -#[derive(Debug, clap::Parser)] -#[group(skip)] -pub struct ExportGenesisWasmCommand { - #[arg(default_value_t = 2000u32)] - pub parachain_id: u32, - - #[command(flatten)] - pub base: cumulus_client_cli::ExportGenesisWasmCommand, -} - -impl CliConfiguration for ExportGenesisWasmCommand { - fn shared_params(&self) -> &SharedParams { - &self.base.shared_params - } -} - #[derive(Debug)] pub struct RelayChainCli { /// The actual relay chain cli object. diff --git a/cumulus/test/service/src/genesis.rs b/cumulus/test/service/src/genesis.rs index d4a9a225626..be4b0427b2e 100644 --- a/cumulus/test/service/src/genesis.rs +++ b/cumulus/test/service/src/genesis.rs @@ -15,11 +15,50 @@ // along with Cumulus. If not, see . use codec::Encode; -use cumulus_client_cli::generate_genesis_block; use cumulus_primitives_core::ParaId; use cumulus_test_runtime::Block; use polkadot_primitives::HeadData; -use sp_runtime::traits::Block as BlockT; +use sc_chain_spec::ChainSpec; +use sp_runtime::{ + traits::{Block as BlockT, Hash as HashT, Header as HeaderT, Zero}, + StateVersion, +}; + +/// Generate a simple test genesis block from a given ChainSpec. +pub fn generate_genesis_block( + chain_spec: &dyn ChainSpec, + genesis_state_version: StateVersion, +) -> Result { + let storage = chain_spec.build_storage()?; + + let child_roots = storage.children_default.iter().map(|(sk, child_content)| { + let state_root = <<::Header as HeaderT>::Hashing as HashT>::trie_root( + child_content.data.clone().into_iter().collect(), + genesis_state_version, + ); + (sk.clone(), state_root.encode()) + }); + let state_root = <<::Header as HeaderT>::Hashing as HashT>::trie_root( + storage.top.clone().into_iter().chain(child_roots).collect(), + genesis_state_version, + ); + + let extrinsics_root = <<::Header as HeaderT>::Hashing as HashT>::trie_root( + Vec::new(), + genesis_state_version, + ); + + Ok(Block::new( + <::Header as HeaderT>::new( + Zero::zero(), + extrinsics_root, + state_root, + Default::default(), + Default::default(), + ), + Default::default(), + )) +} /// Returns the initial head data for a parachain ID. pub fn initial_head_data(para_id: ParaId) -> HeadData { diff --git a/cumulus/test/service/src/lib.rs b/cumulus/test/service/src/lib.rs index 627d060d8a0..586c4603c76 100644 --- a/cumulus/test/service/src/lib.rs +++ b/cumulus/test/service/src/lib.rs @@ -22,7 +22,9 @@ pub mod bench_utils; pub mod chain_spec; -mod genesis; + +/// Utilities for creating test genesis block and head data +pub mod genesis; use runtime::AccountId; use sc_executor::{HeapAllocStrategy, WasmExecutor, DEFAULT_HEAP_ALLOC_STRATEGY}; diff --git a/cumulus/test/service/src/main.rs b/cumulus/test/service/src/main.rs index 55a0f12d671..aace92ca965 100644 --- a/cumulus/test/service/src/main.rs +++ b/cumulus/test/service/src/main.rs @@ -16,16 +16,14 @@ mod cli; -use std::{io::Write, sync::Arc}; +use std::sync::Arc; use cli::{RelayChainCli, Subcommand, TestCollatorCli}; -use cumulus_client_cli::generate_genesis_block; use cumulus_primitives_core::{relay_chain::CollatorPair, ParaId}; -use cumulus_test_service::AnnounceBlockFn; +use cumulus_test_service::{new_partial, AnnounceBlockFn}; use polkadot_service::runtime_traits::AccountIdConversion; use sc_cli::{CliConfiguration, SubstrateCli}; -use sp_core::{hexdisplay::HexDisplay, Encode, Pair}; -use sp_runtime::traits::Block; +use sp_core::Pair; pub fn wrap_announce_block() -> Box AnnounceBlockFn> { tracing::info!("Block announcements disabled."); @@ -44,38 +42,16 @@ fn main() -> Result<(), sc_cli::Error> { runner.sync_run(|config| cmd.run(config.chain_spec, config.network)) }, - Some(Subcommand::ExportGenesisState(params)) => { - let mut builder = sc_cli::LoggerBuilder::new(""); - builder.with_profiling(sc_tracing::TracingReceiver::Log, ""); - let _ = builder.init(); - - let spec = - cli.load_spec(¶ms.base.shared_params.chain.clone().unwrap_or_default())?; - let state_version = cumulus_test_service::runtime::VERSION.state_version(); - - let block: parachains_common::Block = generate_genesis_block(&*spec, state_version)?; - let raw_header = block.header().encode(); - let output_buf = if params.base.raw { - raw_header - } else { - format!("0x{:?}", HexDisplay::from(&block.header().encode())).into_bytes() - }; - - if let Some(output) = ¶ms.base.output { - std::fs::write(output, output_buf)?; - } else { - std::io::stdout().write_all(&output_buf)?; - } - - Ok(()) + Some(Subcommand::ExportGenesisHead(cmd)) => { + let runner = cli.create_runner(cmd)?; + runner.sync_run(|mut config| { + let partial = new_partial(&mut config, false)?; + cmd.run(partial.client) + }) }, Some(Subcommand::ExportGenesisWasm(cmd)) => { let runner = cli.create_runner(cmd)?; - runner.sync_run(|_config| { - let parachain_id = ParaId::from(cmd.parachain_id); - let spec = cumulus_test_service::get_chain_spec(Some(parachain_id)); - cmd.base.run(&spec) - }) + runner.sync_run(|config| cmd.run(&*config.chain_spec)) }, None => { let log_filters = cli.run.normalize().log_filters(); diff --git a/polkadot/parachain/test-parachains/adder/collator/src/cli.rs b/polkadot/parachain/test-parachains/adder/collator/src/cli.rs index 14b25970683..f81e4cc0fff 100644 --- a/polkadot/parachain/test-parachains/adder/collator/src/cli.rs +++ b/polkadot/parachain/test-parachains/adder/collator/src/cli.rs @@ -24,16 +24,16 @@ use sc_cli::SubstrateCli; pub enum Subcommand { /// Export the genesis state of the parachain. #[command(name = "export-genesis-state")] - ExportGenesisState(ExportGenesisStateCommand), + ExportGenesisState(ExportGenesisHeadCommand), /// Export the genesis wasm of the parachain. #[command(name = "export-genesis-wasm")] ExportGenesisWasm(ExportGenesisWasmCommand), } -/// Command for exporting the genesis state of the parachain +/// Command for exporting the genesis head data of the parachain #[derive(Debug, Parser)] -pub struct ExportGenesisStateCommand {} +pub struct ExportGenesisHeadCommand {} /// Command for exporting the genesis wasm file. #[derive(Debug, Parser)] diff --git a/polkadot/parachain/test-parachains/undying/collator/src/cli.rs b/polkadot/parachain/test-parachains/undying/collator/src/cli.rs index d04122f2f68..9572887a51a 100644 --- a/polkadot/parachain/test-parachains/undying/collator/src/cli.rs +++ b/polkadot/parachain/test-parachains/undying/collator/src/cli.rs @@ -25,16 +25,16 @@ use std::path::PathBuf; pub enum Subcommand { /// Export the genesis state of the parachain. #[command(name = "export-genesis-state")] - ExportGenesisState(ExportGenesisStateCommand), + ExportGenesisState(ExportGenesisHeadCommand), /// Export the genesis wasm of the parachain. #[command(name = "export-genesis-wasm")] ExportGenesisWasm(ExportGenesisWasmCommand), } -/// Command for exporting the genesis state of the parachain +/// Command for exporting the genesis head data of the parachain #[derive(Debug, Parser)] -pub struct ExportGenesisStateCommand { +pub struct ExportGenesisHeadCommand { /// Output file name or stdout if unspecified. #[arg()] pub output: Option, diff --git a/prdoc/pr_2331.prdoc b/prdoc/pr_2331.prdoc new file mode 100644 index 00000000000..e3daf4c45bd --- /dev/null +++ b/prdoc/pr_2331.prdoc @@ -0,0 +1,17 @@ +title: Rename `ExportGenesisStateCommand` to `ExportGenesisHeadCommand` + +doc: + - audience: Node Operator + description: | + The `export-genesis-state` subcommand is now called `export-gensis-head`, but + `export-genesis-state` stays as an alias to not break any scripts. + + - audience: Node Dev + description: | + The struct `ExportGenesisStateCommand` is now called `ExportGenesisHeadCommand`. + So, you only need to rename the import and usage. The `run` function is now + taking only a `client` as argument to fetch the genesis header. This way + the exported genesis head is respecting custom genesis block builders. + +crates: + - name: "cumulus-client-cli" -- GitLab From 3c5fcbe637b184e44a000d4e19f8bfd49667dbe4 Mon Sep 17 00:00:00 2001 From: Chevdor Date: Wed, 13 Dec 2023 10:28:34 +0100 Subject: [PATCH 021/191] Add `check runtimes` GH Workflow (#2252) This PR introduces: - a new script - a new GH Workflow - runtime reference spec files for `rococo` and `westend` It brings a mechanism to check that part(s) of the runtimes' metadata that should not change over time, actually did not change over time. Ideally, the GHW should trigger when a release is edited but GH seem to [have an issue](https://github.com/orgs/community/discussions/47794) that prevents the trigger from working. This is why the check has been implemented as `workflow_dispatch` for a start. The `workflow_dispatch` requires a `release_id` that can be found using: ``` curl -s -H "Authorization: Bearer ${GITHUB_TOKEN}" \ https://api.github.com/repos/paritytech/polkadot-sdk/releases | \ jq '.[] | { name: .name, id: .id }' ``` as documented in the workflow. A sample run can be seen [here](https://github.com/chevdor/polkadot-sdk/actions/runs/6811176342). --- .github/runtime_specs/rococo.json | 17 +++ .github/runtime_specs/westend.json | 17 +++ .github/scripts/check-runtime.py | 124 ++++++++++++++++++ .github/scripts/common/lib.sh | 11 +- .../build-and-attach-release-runtimes.yml | 2 +- .github/workflows/check-publish.yml | 2 +- .github/workflows/check-runtimes.yml | 94 +++++++++++++ 7 files changed, 262 insertions(+), 5 deletions(-) create mode 100644 .github/runtime_specs/rococo.json create mode 100644 .github/runtime_specs/westend.json create mode 100755 .github/scripts/check-runtime.py create mode 100644 .github/workflows/check-runtimes.yml diff --git a/.github/runtime_specs/rococo.json b/.github/runtime_specs/rococo.json new file mode 100644 index 00000000000..6568b06400c --- /dev/null +++ b/.github/runtime_specs/rococo.json @@ -0,0 +1,17 @@ +{ + "pallets": { + "1": { + "constants": { + "EpochDuration": { + "value": [ 88, 2, 0, 0, 0, 0, 0, 0 ]} + } + }, + + "2": { + "constants": { + "MinimumPeriod": { + "value": [ 184, 11, 0, 0, 0, 0, 0, 0 ]} + } + } + } + } diff --git a/.github/runtime_specs/westend.json b/.github/runtime_specs/westend.json new file mode 100644 index 00000000000..6568b06400c --- /dev/null +++ b/.github/runtime_specs/westend.json @@ -0,0 +1,17 @@ +{ + "pallets": { + "1": { + "constants": { + "EpochDuration": { + "value": [ 88, 2, 0, 0, 0, 0, 0, 0 ]} + } + }, + + "2": { + "constants": { + "MinimumPeriod": { + "value": [ 184, 11, 0, 0, 0, 0, 0, 0 ]} + } + } + } + } diff --git a/.github/scripts/check-runtime.py b/.github/scripts/check-runtime.py new file mode 100755 index 00000000000..9f3d047e01f --- /dev/null +++ b/.github/scripts/check-runtime.py @@ -0,0 +1,124 @@ +#!/usr/bin/env python3 + +import json +import sys +import logging +import os + + +def check_constant(spec_pallet_id, spec_pallet_value, meta_constant): + """ + Check a single constant + + :param spec_pallet_id: + :param spec_pallet_value: + :param meta_constant: + :return: + """ + if meta_constant['name'] == list(spec_pallet_value.keys())[0]: + constant = meta_constant['name'] + res = list(spec_pallet_value.values())[0]["value"] == meta_constant["value"] + + logging.debug(f" Checking pallet:{spec_pallet_id}/constants/{constant}") + logging.debug(f" spec_pallet_value: {spec_pallet_value}") + logging.debug(f" meta_constant: {meta_constant}") + logging.info(f"pallet:{spec_pallet_id}/constants/{constant} -> {res}") + return res + else: + # logging.warning(f" Skipping pallet:{spec_pallet_id}/constants/{meta_constant['name']}") + pass + + +def check_pallet(metadata, spec_pallet): + """ + Check one pallet + + :param metadata: + :param spec_pallet_id: + :param spec_pallet_value: + :return: + """ + + spec_pallet_id, spec_pallet_value = spec_pallet + logging.debug(f"Pallet: {spec_pallet_id}") + + metadata_pallets = metadata["pallets"] + metadata_pallet = metadata_pallets[spec_pallet_id] + + res = map(lambda meta_constant_value: check_constant( + spec_pallet_id, spec_pallet_value["constants"], meta_constant_value), + metadata_pallet["constants"].values()) + res = list(filter(lambda item: item is not None, res)) + return all(res) + + +def check_pallets(metadata, specs): + """ + CHeck all pallets + + :param metadata: + :param specs: + :return: + """ + + res = list(map(lambda spec_pallet: check_pallet(metadata, spec_pallet), + specs['pallets'].items())) + res = list(filter(lambda item: item is not None, res)) + return all(res) + + +def check_metadata(metadata, specs): + """ + Check metadata (json) against a list of expectations + + :param metadata: Metadata in JSON format + :param expectation: Expectations + :return: Bool + """ + + res = check_pallets(metadata, specs) + return res + + +def help(): + """ Show some simple help """ + + print(f"You must pass 2 args, you passed {len(sys.argv) - 1}") + print("Sample call:") + print("check-runtime.py ") + + +def load_json(file): + """ Load json from a file """ + + f = open(file) + return json.load(f) + + +def main(): + LOGLEVEL = os.environ.get('LOGLEVEL', 'INFO').upper() + logging.basicConfig(level=LOGLEVEL) + + if len(sys.argv) != 3: + help() + exit(1) + + metadata_file = sys.argv[1] + specs_file = sys.argv[2] + print(f"Checking metadata from: {metadata_file} with specs from: {specs_file}") + + metadata = load_json(metadata_file) + specs = load_json(specs_file) + + res = check_metadata(metadata, specs) + + if res: + logging.info(f"OK") + exit(0) + else: + print("") + logging.info(f"Some errors were found, run again with LOGLEVEL=debug") + exit(1) + +if __name__ == "__main__": + main() diff --git a/.github/scripts/common/lib.sh b/.github/scripts/common/lib.sh index 2a835b4472b..e499dfabd64 100755 --- a/.github/scripts/common/lib.sh +++ b/.github/scripts/common/lib.sh @@ -202,21 +202,26 @@ fetch_release_artifacts() { echo "Release ID : $RELEASE_ID" echo "Repo : $REPO" echo "Binary : $BINARY" + OUTPUT_DIR=${OUTPUT_DIR:-"./release-artifacts/${BINARY}"} + echo "OUTPUT_DIR : $OUTPUT_DIR" + echo "Fetching release info..." curl -L -s \ -H "Accept: application/vnd.github+json" \ -H "Authorization: Bearer ${GITHUB_TOKEN}" \ -H "X-GitHub-Api-Version: 2022-11-28" \ https://api.github.com/repos/${REPO}/releases/${RELEASE_ID} > release.json - # Get Asset ids + echo "Extract asset ids..." ids=($(jq -r '.assets[].id' < release.json )) + echo "Extract asset count..." count=$(jq '.assets|length' < release.json ) # Fetch artifacts - mkdir -p "./release-artifacts/${BINARY}" - pushd "./release-artifacts/${BINARY}" > /dev/null + mkdir -p "$OUTPUT_DIR" + pushd "$OUTPUT_DIR" > /dev/null + echo "Fetching assets..." iter=1 for id in "${ids[@]}" do diff --git a/.github/workflows/build-and-attach-release-runtimes.yml b/.github/workflows/build-and-attach-release-runtimes.yml index a480784aea3..f7003379cf0 100644 --- a/.github/workflows/build-and-attach-release-runtimes.yml +++ b/.github/workflows/build-and-attach-release-runtimes.yml @@ -31,7 +31,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Build ${{ matrix.runtime.name }} ${{ matrix.build_config.type }} id: srtool_build diff --git a/.github/workflows/check-publish.yml b/.github/workflows/check-publish.yml index db0863888b8..1941bd98167 100644 --- a/.github/workflows/check-publish.yml +++ b/.github/workflows/check-publish.yml @@ -12,7 +12,7 @@ jobs: check-publish: runs-on: ubuntu-latest steps: - - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Rust Cache uses: Swatinem/rust-cache@3cf7f8cc28d1b4e7d01e3783be10a97d55d483c8 # v2.7.1 diff --git a/.github/workflows/check-runtimes.yml b/.github/workflows/check-runtimes.yml new file mode 100644 index 00000000000..0e5ad104766 --- /dev/null +++ b/.github/workflows/check-runtimes.yml @@ -0,0 +1,94 @@ +name: Check Runtimes Specs +# This GH Workflow fetches the runtimes available in a release. +# It then compares their metadata with reference specs located under +# .github/runtime_specs. + +on: + workflow_dispatch: + inputs: + release_id: + description: | + Release ID. + You can find it using the command: + curl -s \ + -H "Authorization: Bearer ${GITHUB_TOKEN}" https://api.github.com/repos/paritytech/polkadot-sdk/releases | \ + jq '.[] | { name: .name, id: .id }' + required: true + type: string + + # This trigger unfortunately does not work as expected. + # https://github.com/orgs/community/discussions/47794 + # release: + # types: [edited] + +env: + RUNTIME_SPECS_DIR: .github/runtime_specs + DATA_DIR: runtimes + RELEASE_ID: ${{ inputs.release_id }} + REPO: ${{ github.repository }} + +jobs: + find-specs: + name: Fetch runtime specs + outputs: + specs: ${{ steps.get-list.outputs.specs }} + runs-on: ubuntu-latest + steps: + - name: Checkout the repo + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + - name: Get list + id: get-list + run: | + lst=$(ls $RUNTIME_SPECS_DIR/*.json | xargs -I{} basename "{}" .json | jq -R .| jq -sc .) + echo "Found: $lst" + echo "specs=$lst" >> $GITHUB_OUTPUT + + check-runtimes: + name: Check runtime specs + runs-on: ubuntu-latest + needs: + - find-specs + + strategy: + matrix: + specs: ${{ fromJSON(needs.find-specs.outputs.specs) }} + + steps: + - name: Checkout the repo + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + - name: Fetch release artifacts based on release id + env: + OUTPUT_DIR: ${{ env.DATA_DIR }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + . ./.github/scripts/common/lib.sh + fetch_release_artifacts + + - name: Install tooling + env: + SUBWASM_VERSION: v0.20.0 + DL_BASE_URL: https://github.com/chevdor/subwasm/releases/download + run: | + wget $DL_BASE_URL/$SUBWASM_VERSION/subwasm_linux_amd64_$SUBWASM_VERSION.deb \ + -O subwasm.deb + sudo dpkg -i subwasm.deb + subwasm --version + + - name: Extract metadata JSON for ${{ matrix.specs }} + env: + RUNTIME: ${{ matrix.specs }} + run: | + WASM=$(ls ${DATA_DIR}/${RUNTIME}*.wasm) + echo "WASM=$WASM" + subwasm show --json "$WASM" > "${DATA_DIR}/${RUNTIME}.json" + + - name: Check specs for ${{ matrix.specs }} + id: build + env: + RUNTIME: ${{ matrix.specs }} + LOGLEVEL: info + run: | + python --version + .github/scripts/check-runtime.py "${DATA_DIR}/${RUNTIME}.json" "${RUNTIME_SPECS_DIR}/${RUNTIME}.json" -- GitLab From 9ecb2d3391ee27f1d6c8af1a53416f8224653fd9 Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Wed, 13 Dec 2023 12:31:12 +0300 Subject: [PATCH 022/191] Tests for BridgeHub(s) <> remote GRANDPA chain (#2692) So far the `bridge-hub-test-utils` contained a tests set for testing BridgeHub runtime that is bridging with the remote **parachain**. But we have https://github.com/paritytech/polkadot-sdk/pull/2540 coming, which would add Rococo <> Bulletin chain bridge (where Bulletin = standalone chain that is using GRANDPA finality). Then it'll be expanded to Polkadot BH as well. So this PR adds the same set of tests to the `bridge-hub-test-utils`, but for the case when remote chain is the chain with GRANDPA finality. There's a lot of changes in this PR - I'll describe some: - I've added `BasicParachainRuntime` trait to decrease number of lines we need to add to `where` clause. Could revert, but imo it is useful; - `cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data` is a submodule for generating test data for the test sets. `from_parachain.rs` is used in tests for the case when remote chain is a parachain, `from_grandpa_chain.rs` - for the bridges with remote GRANDPA chains. `mod.rs` has some code, shared by both types of tests; - `cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data` is a submodule with all test cases. The `mod.rs` has tests, suitable for all cases. There's also `wth_parachain.rs` and `with_grandpa_chain.rs` with the same meaning as above; - I've merged the "core" code of two previous tests - `relayed_incoming_message_works` and `complex_relay_extrinsic_works` into one single `relayed_incoming_message_works` test. So now we are always constructing extrinsics and are dispatching them using executive module (meaning all signed extensions are also tested). New test set is used here: https://github.com/paritytech/polkadot-sdk/pull/2540. Once this PR is merged, I'll merge that other PR with master to remove duplicate changes. I'm also planning to cleanup generic constraints + remove some unnecessary assumptions about used chains in a follow-up PRs. But for now I think this PR has enough changes, so don't want to complicate it even more. --- Breaking changes for the code that have used those tests before: - the `construct_and_apply_extrinsic` callback now accepts the `RuntimeCall` instead of the `pallet_utility::Call`; - the `construct_and_apply_extrinsic` now may be called multiple times for the single test, so make sure the `frame_system::CheckNonce` is correctly constructed; - all previous tests have been moved from `bridge_hub_test_utils::test_cases` to `bridge_hub_test_utils::test_cases::from_parachain` module; - there are several changes in test arguments - please refer to https://github.com/paritytech/polkadot-sdk/compare/sv-tests-for-bridge-with-remote-grandpa-chain?expand=1#diff-79a28d4d3e1749050341c2424f00c4c139825b1a20937767f83e58b95166735c for details. --- Cargo.lock | 2 + .../bridge-hub-rococo/tests/tests.rs | 32 +- .../bridge-hub-westend/tests/tests.rs | 32 +- .../bridge-hubs/test-utils/Cargo.toml | 3 + .../bridge-hubs/test-utils/src/lib.rs | 2 + .../bridge-hubs/test-utils/src/test_cases.rs | 1588 ----------------- .../src/test_cases/from_grandpa_chain.rs | 442 +++++ .../src/test_cases/from_parachain.rs | 544 ++++++ .../test-utils/src/test_cases/helpers.rs | 340 ++++ .../test-utils/src/test_cases/mod.rs | 485 +++++ .../src/test_data/from_grandpa_chain.rs | 244 +++ .../src/test_data/from_parachain.rs | 326 ++++ .../test-utils/src/test_data/mod.rs | 144 ++ .../parachains/runtimes/test-utils/src/lib.rs | 55 +- 14 files changed, 2588 insertions(+), 1651 deletions(-) delete mode 100644 cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs create mode 100644 cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs create mode 100644 cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs create mode 100644 cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs create mode 100644 cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/mod.rs create mode 100644 cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_grandpa_chain.rs create mode 100644 cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_parachain.rs create mode 100644 cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/mod.rs diff --git a/Cargo.lock b/Cargo.lock index 0e2194829c2..9e17e6803d9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1991,6 +1991,7 @@ dependencies = [ "frame-executive", "frame-support", "frame-system", + "impl-trait-for-tuples", "log", "pallet-balances", "pallet-bridge-grandpa", @@ -2009,6 +2010,7 @@ dependencies = [ "sp-io", "sp-keyring", "sp-runtime", + "sp-std 8.0.0", "sp-tracing 10.0.0", "staging-parachain-info", "staging-xcm", diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs index 1d544a9dcfa..662012a4b41 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs @@ -26,7 +26,6 @@ use bridge_hub_rococo_runtime::{ }; use codec::{Decode, Encode}; use frame_support::{dispatch::GetDispatchInfo, parameter_types, traits::ConstU8}; -use frame_system::pallet_prelude::HeaderFor; use parachains_common::{rococo::fee::WeightToFee, AccountId, AuraId, Balance}; use sp_keyring::AccountKeyring::Alice; use sp_runtime::{ @@ -46,13 +45,16 @@ fn construct_extrinsic( sender: sp_keyring::AccountKeyring, call: RuntimeCall, ) -> UncheckedExtrinsic { + let account_id = AccountId32::from(sender.public()); let extra: SignedExtra = ( frame_system::CheckNonZeroSender::::new(), frame_system::CheckSpecVersion::::new(), frame_system::CheckTxVersion::::new(), frame_system::CheckGenesis::::new(), frame_system::CheckEra::::from(Era::immortal()), - frame_system::CheckNonce::::from(0), + frame_system::CheckNonce::::from( + frame_system::Pallet::::account(&account_id).nonce, + ), frame_system::CheckWeight::::new(), pallet_transaction_payment::ChargeTransactionPayment::::from(0), BridgeRejectObsoleteHeadersAndMessages::default(), @@ -62,7 +64,7 @@ fn construct_extrinsic( let signature = payload.using_encoded(|e| sender.sign(e)); UncheckedExtrinsic::new_signed( call, - AccountId32::from(sender.public()).into(), + account_id.into(), Signature::Sr25519(signature.clone()), extra, ) @@ -70,10 +72,9 @@ fn construct_extrinsic( fn construct_and_apply_extrinsic( relayer_at_target: sp_keyring::AccountKeyring, - batch: pallet_utility::Call, + call: RuntimeCall, ) -> sp_runtime::DispatchOutcome { - let batch_call = RuntimeCall::Utility(batch); - let xt = construct_extrinsic(relayer_at_target, batch_call); + let xt = construct_extrinsic(relayer_at_target, call); let r = Executive::apply_extrinsic(xt); r.unwrap() } @@ -85,10 +86,6 @@ fn construct_and_estimate_extrinsic_fee(batch: pallet_utility::Call) -> TransactionPayment::compute_fee(xt.encoded_size() as _, &batch_info, 0) } -fn executive_init_block(header: &HeaderFor) { - Executive::initialize_block(header) -} - fn collator_session_keys() -> bridge_hub_test_utils::CollatorSessionKeys { bridge_hub_test_utils::CollatorSessionKeys::new( AccountId::from(Alice), @@ -237,10 +234,9 @@ mod bridge_hub_rococo_tests { #[test] fn relayed_incoming_message_works() { // from Westend - bridge_hub_test_utils::test_cases::relayed_incoming_message_works::< + bridge_hub_test_utils::test_cases::from_parachain::relayed_incoming_message_works::< Runtime, AllPalletsWithoutSystem, - XcmConfig, ParachainSystem, BridgeGrandpaWestendInstance, BridgeParachainWestendInstance, @@ -250,17 +246,19 @@ mod bridge_hub_rococo_tests { collator_session_keys(), bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, bp_bridge_hub_westend::BRIDGE_HUB_WESTEND_PARACHAIN_ID, + BridgeHubWestendChainId::get(), SIBLING_PARACHAIN_ID, Rococo, XCM_LANE_FOR_ASSET_HUB_ROCOCO_TO_ASSET_HUB_WESTEND, || (), + construct_and_apply_extrinsic, ) } #[test] pub fn complex_relay_extrinsic_works() { // for Westend - bridge_hub_test_utils::test_cases::complex_relay_extrinsic_works::< + bridge_hub_test_utils::test_cases::from_parachain::complex_relay_extrinsic_works::< Runtime, AllPalletsWithoutSystem, XcmConfig, @@ -277,10 +275,8 @@ mod bridge_hub_rococo_tests { BridgeHubWestendChainId::get(), Rococo, XCM_LANE_FOR_ASSET_HUB_ROCOCO_TO_ASSET_HUB_WESTEND, - ExistentialDeposit::get(), - executive_init_block, - construct_and_apply_extrinsic, || (), + construct_and_apply_extrinsic, ); } @@ -304,7 +300,7 @@ mod bridge_hub_rococo_tests { #[test] pub fn can_calculate_fee_for_complex_message_delivery_transaction() { - let estimated = bridge_hub_test_utils::test_cases::can_calculate_fee_for_complex_message_delivery_transaction::< + let estimated = bridge_hub_test_utils::test_cases::from_parachain::can_calculate_fee_for_complex_message_delivery_transaction::< Runtime, BridgeGrandpaWestendInstance, BridgeParachainWestendInstance, @@ -327,7 +323,7 @@ mod bridge_hub_rococo_tests { #[test] pub fn can_calculate_fee_for_complex_message_confirmation_transaction() { - let estimated = bridge_hub_test_utils::test_cases::can_calculate_fee_for_complex_message_confirmation_transaction::< + let estimated = bridge_hub_test_utils::test_cases::from_parachain::can_calculate_fee_for_complex_message_confirmation_transaction::< Runtime, BridgeGrandpaWestendInstance, BridgeParachainWestendInstance, diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/tests/tests.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/tests/tests.rs index 73bddb16369..ffa2fb1cfdc 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/tests/tests.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/tests/tests.rs @@ -32,7 +32,6 @@ use bridge_to_rococo_config::{ }; use codec::{Decode, Encode}; use frame_support::{dispatch::GetDispatchInfo, parameter_types, traits::ConstU8}; -use frame_system::pallet_prelude::HeaderFor; use parachains_common::{westend::fee::WeightToFee, AccountId, AuraId, Balance}; use sp_keyring::AccountKeyring::Alice; use sp_runtime::{ @@ -52,13 +51,16 @@ fn construct_extrinsic( sender: sp_keyring::AccountKeyring, call: RuntimeCall, ) -> UncheckedExtrinsic { + let account_id = AccountId32::from(sender.public()); let extra: SignedExtra = ( frame_system::CheckNonZeroSender::::new(), frame_system::CheckSpecVersion::::new(), frame_system::CheckTxVersion::::new(), frame_system::CheckGenesis::::new(), frame_system::CheckEra::::from(Era::immortal()), - frame_system::CheckNonce::::from(0), + frame_system::CheckNonce::::from( + frame_system::Pallet::::account(&account_id).nonce, + ), frame_system::CheckWeight::::new(), pallet_transaction_payment::ChargeTransactionPayment::::from(0), BridgeRejectObsoleteHeadersAndMessages::default(), @@ -68,7 +70,7 @@ fn construct_extrinsic( let signature = payload.using_encoded(|e| sender.sign(e)); UncheckedExtrinsic::new_signed( call, - AccountId32::from(sender.public()).into(), + account_id.into(), Signature::Sr25519(signature.clone()), extra, ) @@ -76,10 +78,9 @@ fn construct_extrinsic( fn construct_and_apply_extrinsic( relayer_at_target: sp_keyring::AccountKeyring, - batch: pallet_utility::Call, + call: RuntimeCall, ) -> sp_runtime::DispatchOutcome { - let batch_call = RuntimeCall::Utility(batch); - let xt = construct_extrinsic(relayer_at_target, batch_call); + let xt = construct_extrinsic(relayer_at_target, call); let r = Executive::apply_extrinsic(xt); r.unwrap() } @@ -91,10 +92,6 @@ fn construct_and_estimate_extrinsic_fee(batch: pallet_utility::Call) -> TransactionPayment::compute_fee(xt.encoded_size() as _, &batch_info, 0) } -fn executive_init_block(header: &HeaderFor) { - Executive::initialize_block(header) -} - fn collator_session_keys() -> bridge_hub_test_utils::CollatorSessionKeys { bridge_hub_test_utils::CollatorSessionKeys::new( AccountId::from(Alice), @@ -222,10 +219,9 @@ fn message_dispatch_routing_works() { #[test] fn relayed_incoming_message_works() { - bridge_hub_test_utils::test_cases::relayed_incoming_message_works::< + bridge_hub_test_utils::test_cases::from_parachain::relayed_incoming_message_works::< Runtime, AllPalletsWithoutSystem, - XcmConfig, ParachainSystem, BridgeGrandpaRococoInstance, BridgeParachainRococoInstance, @@ -235,16 +231,18 @@ fn relayed_incoming_message_works() { collator_session_keys(), bp_bridge_hub_westend::BRIDGE_HUB_WESTEND_PARACHAIN_ID, bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, + BridgeHubRococoChainId::get(), SIBLING_PARACHAIN_ID, Westend, XCM_LANE_FOR_ASSET_HUB_WESTEND_TO_ASSET_HUB_ROCOCO, || (), + construct_and_apply_extrinsic, ) } #[test] pub fn complex_relay_extrinsic_works() { - bridge_hub_test_utils::test_cases::complex_relay_extrinsic_works::< + bridge_hub_test_utils::test_cases::from_parachain::complex_relay_extrinsic_works::< Runtime, AllPalletsWithoutSystem, XcmConfig, @@ -261,10 +259,8 @@ pub fn complex_relay_extrinsic_works() { BridgeHubRococoChainId::get(), Westend, XCM_LANE_FOR_ASSET_HUB_WESTEND_TO_ASSET_HUB_ROCOCO, - ExistentialDeposit::get(), - executive_init_block, - construct_and_apply_extrinsic, || (), + construct_and_apply_extrinsic, ); } @@ -288,7 +284,7 @@ pub fn can_calculate_weight_for_paid_export_message_with_reserve_transfer() { #[test] pub fn can_calculate_fee_for_complex_message_delivery_transaction() { - let estimated = bridge_hub_test_utils::test_cases::can_calculate_fee_for_complex_message_delivery_transaction::< + let estimated = bridge_hub_test_utils::test_cases::from_parachain::can_calculate_fee_for_complex_message_delivery_transaction::< Runtime, BridgeGrandpaRococoInstance, BridgeParachainRococoInstance, @@ -311,7 +307,7 @@ pub fn can_calculate_fee_for_complex_message_delivery_transaction() { #[test] pub fn can_calculate_fee_for_complex_message_confirmation_transaction() { - let estimated = bridge_hub_test_utils::test_cases::can_calculate_fee_for_complex_message_confirmation_transaction::< + let estimated = bridge_hub_test_utils::test_cases::from_parachain::can_calculate_fee_for_complex_message_confirmation_transaction::< Runtime, BridgeGrandpaRococoInstance, BridgeParachainRococoInstance, diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml index 7325a87165c..35cab04fcc4 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml @@ -8,6 +8,7 @@ license = "Apache-2.0" [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } +impl-trait-for-tuples = "0.2" log = { version = "0.4.20", default-features = false } # Substrate @@ -19,6 +20,7 @@ sp-core = { path = "../../../../../substrate/primitives/core", default-features sp-io = { path = "../../../../../substrate/primitives/io", default-features = false } sp-keyring = { path = "../../../../../substrate/primitives/keyring" } sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-features = false } +sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } sp-tracing = { path = "../../../../../substrate/primitives/tracing" } pallet-balances = { path = "../../../../../substrate/frame/balances", default-features = false } pallet-utility = { path = "../../../../../substrate/frame/utility", default-features = false } @@ -90,6 +92,7 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", + "sp-std/std", "xcm-builder/std", "xcm-executor/std", "xcm/std", diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/lib.rs index 26eb09b73fa..445f001f1a4 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/lib.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/lib.rs @@ -17,5 +17,7 @@ //! Module contains predefined test-case scenarios for "BridgeHub" `Runtime`s. pub mod test_cases; +pub mod test_data; + pub use bp_test_utils::test_header; pub use parachains_runtimes_test_utils::*; diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs deleted file mode 100644 index ddcba3b0399..00000000000 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases.rs +++ /dev/null @@ -1,1588 +0,0 @@ -// Copyright (C) Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -//! Module contains predefined test-case scenarios for `Runtime` with bridging capabilities. - -use bp_messages::{ - source_chain::TargetHeaderChain, - target_chain::{DispatchMessage, DispatchMessageData, MessageDispatch, SourceHeaderChain}, - LaneId, MessageKey, OutboundLaneData, UnrewardedRelayersState, Weight, -}; -use bp_parachains::{BestParaHeadHash, ParaInfo}; -use bp_polkadot_core::parachains::{ParaHash, ParaId}; -use bp_relayers::{RewardsAccountOwner, RewardsAccountParams}; -use bp_runtime::{HeaderOf, Parachain, StorageProofSize, UnderlyingChainOf}; -use bp_test_utils::{make_default_justification, prepare_parachain_heads_proof}; -use bridge_runtime_common::{ - messages::{ - source::FromBridgedChainMessagesDeliveryProof, target::FromBridgedChainMessagesProof, - BridgedChain as MessageBridgedChain, MessageBridge, - }, - messages_generation::{ - encode_all_messages, encode_lane_data, prepare_message_delivery_storage_proof, - prepare_messages_storage_proof, - }, - messages_xcm_extension::{XcmAsPlainPayload, XcmBlobMessageDispatchResult}, -}; -use codec::Encode; -use frame_support::{ - assert_ok, - traits::{Get, OnFinalize, OnInitialize, OriginTrait, PalletInfoAccess}, -}; -use frame_system::pallet_prelude::{BlockNumberFor, HeaderFor}; -use pallet_bridge_grandpa::BridgedHeader; -use parachains_common::AccountId; -use parachains_runtimes_test_utils::{ - mock_open_hrmp_channel, AccountIdOf, BalanceOf, CollatorSessionKeys, ExtBuilder, ValidatorIdOf, - XcmReceivedFrom, -}; -use sp_core::H256; -use sp_keyring::AccountKeyring::*; -use sp_runtime::{ - traits::{Header as HeaderT, Zero}, - AccountId32, -}; -use xcm::{ - latest::prelude::*, - prelude::{AlwaysLatest, GetVersion}, -}; -use xcm_builder::DispatchBlobError; -use xcm_executor::{ - traits::{TransactAsset, WeightBounds}, - XcmExecutor, -}; - -// Re-export test_case from assets -pub use asset_test_utils::include_teleports_for_native_asset_works; - -type RuntimeHelper = - parachains_runtimes_test_utils::RuntimeHelper; - -// Re-export test_case from `parachains-runtimes-test-utils` -pub use parachains_runtimes_test_utils::test_cases::change_storage_constant_by_governance_works; - -/// Test-case makes sure that `Runtime` can process bridging initialize via governance-like call -pub fn initialize_bridge_by_governance_works( - collator_session_key: CollatorSessionKeys, - runtime_para_id: u32, - runtime_call_encode: Box< - dyn Fn(pallet_bridge_grandpa::Call) -> Vec, - >, -) where - Runtime: frame_system::Config - + pallet_balances::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config - + pallet_collator_selection::Config - + cumulus_pallet_parachain_system::Config - + pallet_bridge_grandpa::Config, - GrandpaPalletInstance: 'static, - ValidatorIdOf: From>, -{ - ExtBuilder::::default() - .with_collators(collator_session_key.collators()) - .with_session_keys(collator_session_key.session_keys()) - .with_para_id(runtime_para_id.into()) - .with_tracing() - .build() - .execute_with(|| { - // check mode before - assert_eq!( - pallet_bridge_grandpa::PalletOperatingMode::::try_get(), - Err(()) - ); - - // encode `initialize` call - let initialize_call = runtime_call_encode(pallet_bridge_grandpa::Call::< - Runtime, - GrandpaPalletInstance, - >::initialize { - init_data: test_data::initialization_data::(12345), - }); - - // overestimate - check weight for `pallet_bridge_grandpa::Pallet::initialize()` call - let require_weight_at_most = - ::DbWeight::get().reads_writes(7, 7); - - // execute XCM with Transacts to `initialize bridge` as governance does - assert_ok!(RuntimeHelper::::execute_as_governance( - initialize_call, - require_weight_at_most - ) - .ensure_complete()); - - // check mode after - assert_eq!( - pallet_bridge_grandpa::PalletOperatingMode::::try_get(), - Ok(bp_runtime::BasicOperatingMode::Normal) - ); - }) -} - -/// Test-case makes sure that `Runtime` can handle xcm `ExportMessage`: -/// Checks if received XCM messages is correctly added to the message outbound queue for delivery. -/// For SystemParachains we expect unpaid execution. -pub fn handle_export_message_from_system_parachain_to_outbound_queue_works< - Runtime, - XcmConfig, - MessagesPalletInstance, ->( - collator_session_key: CollatorSessionKeys, - runtime_para_id: u32, - sibling_parachain_id: u32, - unwrap_pallet_bridge_messages_event: Box< - dyn Fn(Vec) -> Option>, - >, - export_message_instruction: fn() -> Instruction, - expected_lane_id: LaneId, - existential_deposit: Option, - maybe_paid_export_message: Option, - prepare_configuration: impl Fn(), -) where - Runtime: frame_system::Config - + pallet_balances::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config - + pallet_collator_selection::Config - + cumulus_pallet_parachain_system::Config - + pallet_bridge_messages::Config, - XcmConfig: xcm_executor::Config, - MessagesPalletInstance: 'static, - ValidatorIdOf: From>, -{ - assert_ne!(runtime_para_id, sibling_parachain_id); - let sibling_parachain_location = MultiLocation::new(1, Parachain(sibling_parachain_id)); - - ExtBuilder::::default() - .with_collators(collator_session_key.collators()) - .with_session_keys(collator_session_key.session_keys()) - .with_para_id(runtime_para_id.into()) - .with_tracing() - .build() - .execute_with(|| { - prepare_configuration(); - - // check queue before - assert_eq!( - pallet_bridge_messages::OutboundLanes::::try_get( - expected_lane_id - ), - Err(()) - ); - - // prepare `ExportMessage` - let xcm = if let Some(fee) = maybe_paid_export_message { - // deposit ED to origin (if needed) - if let Some(ed) = existential_deposit { - XcmConfig::AssetTransactor::deposit_asset( - &ed, - &sibling_parachain_location, - Some(&XcmContext::with_message_id([0; 32])), - ) - .expect("deposited ed"); - } - // deposit fee to origin - XcmConfig::AssetTransactor::deposit_asset( - &fee, - &sibling_parachain_location, - Some(&XcmContext::with_message_id([0; 32])), - ) - .expect("deposited fee"); - - Xcm(vec![ - WithdrawAsset(MultiAssets::from(vec![fee.clone()])), - BuyExecution { fees: fee, weight_limit: Unlimited }, - export_message_instruction(), - ]) - } else { - Xcm(vec![ - UnpaidExecution { weight_limit: Unlimited, check_origin: None }, - export_message_instruction(), - ]) - }; - - // execute XCM - let hash = xcm.using_encoded(sp_io::hashing::blake2_256); - assert_ok!(XcmExecutor::::execute_xcm( - sibling_parachain_location, - xcm, - hash, - RuntimeHelper::::xcm_max_weight(XcmReceivedFrom::Sibling), - ) - .ensure_complete()); - - // check queue after - assert_eq!( - pallet_bridge_messages::OutboundLanes::::try_get( - expected_lane_id - ), - Ok(OutboundLaneData { - oldest_unpruned_nonce: 1, - latest_received_nonce: 0, - latest_generated_nonce: 1, - }) - ); - - // check events - let mut events = >::events() - .into_iter() - .filter_map(|e| unwrap_pallet_bridge_messages_event(e.event.encode())); - assert!( - events.any(|e| matches!(e, pallet_bridge_messages::Event::MessageAccepted { .. })) - ); - }) -} - -/// Test-case makes sure that Runtime can route XCM messages received in inbound queue, -/// We just test here `MessageDispatch` configuration. -/// We expect that runtime can route messages: -/// 1. to Parent (relay chain) -/// 2. to Sibling parachain -pub fn message_dispatch_routing_works< - Runtime, - AllPalletsWithoutSystem, - XcmConfig, - HrmpChannelOpener, - MessagesPalletInstance, - RuntimeNetwork, - BridgedNetwork, - NetworkDistanceAsParentCount, ->( - collator_session_key: CollatorSessionKeys, - runtime_para_id: u32, - sibling_parachain_id: u32, - unwrap_cumulus_pallet_parachain_system_event: Box< - dyn Fn(Vec) -> Option>, - >, - unwrap_cumulus_pallet_xcmp_queue_event: Box< - dyn Fn(Vec) -> Option>, - >, - expected_lane_id: LaneId, - prepare_configuration: impl Fn(), -) where - Runtime: frame_system::Config - + pallet_balances::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config - + pallet_collator_selection::Config - + cumulus_pallet_parachain_system::Config - + cumulus_pallet_xcmp_queue::Config - + pallet_bridge_messages::Config, - AllPalletsWithoutSystem: - OnInitialize> + OnFinalize>, - ::AccountId: - Into<<::RuntimeOrigin as OriginTrait>::AccountId>, - XcmConfig: xcm_executor::Config, - MessagesPalletInstance: 'static, - ValidatorIdOf: From>, - ::AccountId: From, - HrmpChannelOpener: frame_support::inherent::ProvideInherent< - Call = cumulus_pallet_parachain_system::Call, - >, - RuntimeNetwork: Get, - BridgedNetwork: Get, - NetworkDistanceAsParentCount: Get, -{ - assert_ne!(runtime_para_id, sibling_parachain_id); - - struct NetworkWithParentCount(core::marker::PhantomData<(N, C)>); - impl, C: Get> Get for NetworkWithParentCount { - fn get() -> MultiLocation { - MultiLocation { parents: C::get(), interior: X1(GlobalConsensus(N::get())) } - } - } - - ExtBuilder::::default() - .with_collators(collator_session_key.collators()) - .with_session_keys(collator_session_key.session_keys()) - .with_safe_xcm_version(XCM_VERSION) - .with_para_id(runtime_para_id.into()) - .with_tracing() - .build() - .execute_with(|| { - prepare_configuration(); - - let mut alice = [0u8; 32]; - alice[0] = 1; - - let included_head = RuntimeHelper::::run_to_block( - 2, - AccountId::from(alice).into(), - ); - // 1. this message is sent from other global consensus with destination of this Runtime relay chain (UMP) - let bridging_message = - test_data::simulate_message_exporter_on_bridged_chain::< - BridgedNetwork, - NetworkWithParentCount, - AlwaysLatest, - >( - (RuntimeNetwork::get(), Here) - ); - let result = <>::MessageDispatch>::dispatch( - test_data::dispatch_message(expected_lane_id, 1, bridging_message) - ); - assert_eq!(format!("{:?}", result.dispatch_level_result), format!("{:?}", XcmBlobMessageDispatchResult::Dispatched)); - - // check events - UpwardMessageSent - let mut events = >::events() - .into_iter() - .filter_map(|e| unwrap_cumulus_pallet_parachain_system_event(e.event.encode())); - assert!( - events.any(|e| matches!(e, cumulus_pallet_parachain_system::Event::UpwardMessageSent { .. })) - ); - - // 2. this message is sent from other global consensus with destination of this Runtime sibling parachain (HRMP) - let bridging_message = - test_data::simulate_message_exporter_on_bridged_chain::< - BridgedNetwork, - NetworkWithParentCount, - AlwaysLatest, - >( - (RuntimeNetwork::get(), X1(Parachain(sibling_parachain_id))), - ); - - // 2.1. WITHOUT opened hrmp channel -> RoutingError - let result = - <>::MessageDispatch>::dispatch( - DispatchMessage { - key: MessageKey { lane_id: expected_lane_id, nonce: 1 }, - data: DispatchMessageData { payload: Ok(bridging_message.clone()) }, - } - ); - assert_eq!(format!("{:?}", result.dispatch_level_result), format!("{:?}", XcmBlobMessageDispatchResult::NotDispatched(Some(DispatchBlobError::RoutingError)))); - - // check events - no XcmpMessageSent - assert_eq!(>::events() - .into_iter() - .filter_map(|e| unwrap_cumulus_pallet_xcmp_queue_event(e.event.encode())) - .count(), 0); - - // 2.1. WITH hrmp channel -> Ok - mock_open_hrmp_channel::(runtime_para_id.into(), sibling_parachain_id.into(), included_head, &alice); - let result = <>::MessageDispatch>::dispatch( - DispatchMessage { - key: MessageKey { lane_id: expected_lane_id, nonce: 1 }, - data: DispatchMessageData { payload: Ok(bridging_message) }, - } - ); - assert_eq!(format!("{:?}", result.dispatch_level_result), format!("{:?}", XcmBlobMessageDispatchResult::Dispatched)); - - // check events - XcmpMessageSent - let mut events = >::events() - .into_iter() - .filter_map(|e| unwrap_cumulus_pallet_xcmp_queue_event(e.event.encode())); - assert!( - events.any(|e| matches!(e, cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. })) - ); - }) -} - -/// Test-case makes sure that Runtime can dispatch XCM messages submitted by relayer, -/// with proofs (finality, para heads, message) independently submitted. -pub fn relayed_incoming_message_works( - collator_session_key: CollatorSessionKeys, - runtime_para_id: u32, - bridged_para_id: u32, - sibling_parachain_id: u32, - local_relay_chain_id: NetworkId, - lane_id: LaneId, - prepare_configuration: impl Fn(), -) where - Runtime: frame_system::Config - + pallet_balances::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config - + pallet_collator_selection::Config - + cumulus_pallet_parachain_system::Config - + cumulus_pallet_xcmp_queue::Config - + pallet_bridge_grandpa::Config - + pallet_bridge_parachains::Config - + pallet_bridge_messages::Config, - AllPalletsWithoutSystem: OnInitialize> - + OnFinalize>, - GPI: 'static, - PPI: 'static, - MPI: 'static, - MB: MessageBridge, - ::BridgedChain: Send + Sync + 'static, - ::ThisChain: Send + Sync + 'static, - UnderlyingChainOf>: bp_runtime::Chain + Parachain, - XcmConfig: xcm_executor::Config, - HrmpChannelOpener: frame_support::inherent::ProvideInherent< - Call = cumulus_pallet_parachain_system::Call, - >, - ValidatorIdOf: From>, - <>::SourceHeaderChain as SourceHeaderChain>::MessagesProof: From>, - <>::BridgedChain as bp_runtime::Chain>::Hash: From, - ParaHash: From<<>::BridgedChain as bp_runtime::Chain>::Hash>, - ::AccountId: - Into<<::RuntimeOrigin as OriginTrait>::AccountId>, - ::AccountId: From, - AccountIdOf: From, - >::InboundRelayer: From, -{ - assert_ne!(runtime_para_id, sibling_parachain_id); - - ExtBuilder::::default() - .with_collators(collator_session_key.collators()) - .with_session_keys(collator_session_key.session_keys()) - .with_safe_xcm_version(XCM_VERSION) - .with_para_id(runtime_para_id.into()) - .with_tracing() - .build() - .execute_with(|| { - prepare_configuration(); - - let mut alice = [0u8; 32]; - alice[0] = 1; - - let included_head = RuntimeHelper::::run_to_block( - 2, - AccountId::from(alice).into(), - ); - mock_open_hrmp_channel::( - runtime_para_id.into(), - sibling_parachain_id.into(), - included_head, - &alice, - ); - - // start with bridged chain block#0 - let init_data = test_data::initialization_data::(0); - pallet_bridge_grandpa::Pallet::::initialize( - RuntimeHelper::::root_origin(), - init_data, - ) - .unwrap(); - - // set up relayer details and proofs - - let message_destination = - X2(GlobalConsensus(local_relay_chain_id), Parachain(sibling_parachain_id)); - // some random numbers (checked by test) - let message_nonce = 1; - let para_header_number = 5; - let relay_header_number = 1; - - let relayer_at_target = Bob; - let relayer_id_on_target: AccountIdOf = relayer_at_target.public().into(); - let relayer_at_source = Dave; - let relayer_id_on_source: AccountId32 = relayer_at_source.public().into(); - - let xcm = vec![xcm::v3::Instruction::<()>::ClearOrigin; 42]; - let expected_dispatch = xcm::latest::Xcm::<()>({ - let mut expected_instructions = xcm.clone(); - // dispatch prepends bridge pallet instance - expected_instructions.insert( - 0, - DescendOrigin(X1(PalletInstance( - as PalletInfoAccess>::index() - as u8, - ))), - ); - expected_instructions - }); - // generate bridged relay chain finality, parachain heads and message proofs, - // to be submitted by relayer to this chain. - let ( - relay_chain_header, - grandpa_justification, - bridged_para_head, - parachain_heads, - para_heads_proof, - message_proof, - ) = test_data::make_complex_relayer_delivery_proofs::< - >::BridgedChain, - MB, - (), - >( - lane_id, - xcm.into(), - message_nonce, - message_destination, - para_header_number, - relay_header_number, - bridged_para_id, - ); - - // submit bridged relay chain finality proof - { - let result = pallet_bridge_grandpa::Pallet::::submit_finality_proof( - RuntimeHelper::::origin_of(relayer_id_on_target.clone()), - Box::new(relay_chain_header.clone()), - grandpa_justification, - ); - assert_ok!(result); - assert_eq!(result.unwrap().pays_fee, frame_support::dispatch::Pays::Yes); - } - - // verify finality proof correctly imported - assert_eq!( - pallet_bridge_grandpa::BestFinalized::::get().unwrap().1, - relay_chain_header.hash() - ); - assert!(pallet_bridge_grandpa::ImportedHeaders::::contains_key( - relay_chain_header.hash() - )); - - // submit parachain heads proof - { - let result = - pallet_bridge_parachains::Pallet::::submit_parachain_heads( - RuntimeHelper::::origin_of(relayer_id_on_target.clone()), - (relay_header_number, relay_chain_header.hash().into()), - parachain_heads, - para_heads_proof, - ); - assert_ok!(result); - assert_eq!(result.unwrap().pays_fee, frame_support::dispatch::Pays::Yes); - } - // verify parachain head proof correctly imported - assert_eq!( - pallet_bridge_parachains::ParasInfo::::get(ParaId(bridged_para_id)), - Some(ParaInfo { - best_head_hash: BestParaHeadHash { - at_relay_block_number: relay_header_number, - head_hash: bridged_para_head.hash() - }, - next_imported_hash_position: 1, - }) - ); - - // import message - assert!(RuntimeHelper::>::take_xcm( - sibling_parachain_id.into() - ) - .is_none()); - assert_eq!( - pallet_bridge_messages::InboundLanes::::get(lane_id) - .last_delivered_nonce(), - 0, - ); - // submit message proof - { - let result = pallet_bridge_messages::Pallet::::receive_messages_proof( - RuntimeHelper::::origin_of(relayer_id_on_target), - relayer_id_on_source.into(), - message_proof.into(), - 1, - Weight::MAX / 1000, - ); - assert_ok!(result); - assert_eq!(result.unwrap().pays_fee, frame_support::dispatch::Pays::Yes); - } - // verify message correctly imported and dispatched - assert_eq!( - pallet_bridge_messages::InboundLanes::::get(lane_id) - .last_delivered_nonce(), - 1, - ); - - // verify relayed bridged XCM message is dispatched to destination sibling para - let dispatched = RuntimeHelper::>::take_xcm( - sibling_parachain_id.into(), - ) - .unwrap(); - // verify contains original message - let dispatched = xcm::latest::Xcm::<()>::try_from(dispatched).unwrap(); - let mut dispatched_clone = dispatched.clone(); - for (idx, expected_instr) in expected_dispatch.0.iter().enumerate() { - assert_eq!(expected_instr, &dispatched.0[idx]); - assert_eq!(expected_instr, &dispatched_clone.0.remove(0)); - } - match dispatched_clone.0.len() { - 0 => (), - 1 => assert!(matches!(dispatched_clone.0[0], SetTopic(_))), - count => assert!(false, "Unexpected messages count: {:?}", count), - } - }) -} - -/// Test-case makes sure that Runtime can dispatch XCM messages submitted by relayer, -/// with proofs (finality, para heads, message) batched together in signed extrinsic. -/// Also verifies relayer transaction signed extensions work as intended. -pub fn complex_relay_extrinsic_works( - collator_session_key: CollatorSessionKeys, - runtime_para_id: u32, - bridged_para_id: u32, - sibling_parachain_id: u32, - bridged_chain_id: bp_runtime::ChainId, - local_relay_chain_id: NetworkId, - lane_id: LaneId, - existential_deposit: BalanceOf, - executive_init_block: fn(&HeaderFor), - construct_and_apply_extrinsic: fn( - sp_keyring::AccountKeyring, - pallet_utility::Call:: - ) -> sp_runtime::DispatchOutcome, - prepare_configuration: impl Fn(), -) where - Runtime: frame_system::Config - + pallet_balances::Config - + pallet_utility::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config - + pallet_collator_selection::Config - + cumulus_pallet_parachain_system::Config - + cumulus_pallet_xcmp_queue::Config - + pallet_bridge_grandpa::Config - + pallet_bridge_parachains::Config - + pallet_bridge_messages::Config - + pallet_bridge_relayers::Config, - AllPalletsWithoutSystem: OnInitialize> - + OnFinalize>, - GPI: 'static, - PPI: 'static, - MPI: 'static, - MB: MessageBridge, - ::BridgedChain: Send + Sync + 'static, - ::ThisChain: Send + Sync + 'static, - UnderlyingChainOf>: bp_runtime::Chain + Parachain, - XcmConfig: xcm_executor::Config, - HrmpChannelOpener: frame_support::inherent::ProvideInherent< - Call = cumulus_pallet_parachain_system::Call, - >, - ValidatorIdOf: From>, - <>::SourceHeaderChain as SourceHeaderChain>::MessagesProof: From>, - <>::BridgedChain as bp_runtime::Chain>::Hash: From, - ParaHash: From<<>::BridgedChain as bp_runtime::Chain>::Hash>, - ::AccountId: - Into<<::RuntimeOrigin as OriginTrait>::AccountId>, - AccountIdOf: From, - ::AccountId: From, - >::InboundRelayer: From, - ::RuntimeCall: - From> - + From> - + From> -{ - assert_ne!(runtime_para_id, sibling_parachain_id); - - // Relayer account at local/this BH. - let relayer_at_target = Bob; - let relayer_id_on_target: AccountIdOf = relayer_at_target.public().into(); - let relayer_initial_balance = existential_deposit * 100000u32.into(); - // Relayer account at remote/bridged BH. - let relayer_at_source = Dave; - let relayer_id_on_source: AccountId32 = relayer_at_source.public().into(); - - ExtBuilder::::default() - .with_collators(collator_session_key.collators()) - .with_session_keys(collator_session_key.session_keys()) - .with_safe_xcm_version(XCM_VERSION) - .with_para_id(runtime_para_id.into()) - .with_balances(vec![(relayer_id_on_target.clone(), relayer_initial_balance)]) - .with_tracing() - .build() - .execute_with(|| { - prepare_configuration(); - - let mut alice = [0u8; 32]; - alice[0] = 1; - - let included_head = RuntimeHelper::::run_to_block( - 2, - AccountId::from(alice).into(), - ); - let zero: BlockNumberFor = 0u32.into(); - let genesis_hash = frame_system::Pallet::::block_hash(zero); - let mut header: HeaderFor = bp_test_utils::test_header(1u32.into()); - header.set_parent_hash(genesis_hash); - executive_init_block(&header); - - mock_open_hrmp_channel::( - runtime_para_id.into(), - sibling_parachain_id.into(), - included_head, - &alice, - ); - - // start with bridged chain block#0 - let init_data = test_data::initialization_data::(0); - pallet_bridge_grandpa::Pallet::::initialize( - RuntimeHelper::::root_origin(), - init_data, - ) - .unwrap(); - - // set up relayer details and proofs - - let message_destination = - X2(GlobalConsensus(local_relay_chain_id), Parachain(sibling_parachain_id)); - // some random numbers (checked by test) - let message_nonce = 1; - let para_header_number = 5; - let relay_header_number = 1; - - let xcm = vec![xcm::latest::Instruction::<()>::ClearOrigin; 42]; - let expected_dispatch = xcm::latest::Xcm::<()>({ - let mut expected_instructions = xcm.clone(); - // dispatch prepends bridge pallet instance - expected_instructions.insert( - 0, - DescendOrigin(X1(PalletInstance( - as PalletInfoAccess>::index() - as u8, - ))), - ); - expected_instructions - }); - // generate bridged relay chain finality, parachain heads and message proofs, - // to be submitted by relayer to this chain. - let ( - relay_chain_header, - grandpa_justification, - bridged_para_head, - parachain_heads, - para_heads_proof, - message_proof, - ) = test_data::make_complex_relayer_delivery_proofs::< - >::BridgedChain, - MB, - (), - >( - lane_id, - xcm.clone().into(), - message_nonce, - message_destination, - para_header_number, - relay_header_number, - bridged_para_id, - ); - - let relay_chain_header_hash = relay_chain_header.hash(); - let batch = test_data::make_complex_relayer_delivery_batch::( - relay_chain_header, - grandpa_justification, - parachain_heads, - para_heads_proof, - message_proof, - relayer_id_on_source, - ); - - // sanity checks - before relayer extrinsic - assert!(RuntimeHelper::>::take_xcm( - sibling_parachain_id.into() - ) - .is_none()); - assert_eq!( - pallet_bridge_messages::InboundLanes::::get(lane_id) - .last_delivered_nonce(), - 0, - ); - let msg_proofs_rewards_account = RewardsAccountParams::new( - lane_id, - bridged_chain_id, - RewardsAccountOwner::ThisChain, - ); - assert_eq!( - pallet_bridge_relayers::RelayerRewards::::get( - relayer_id_on_target.clone(), - msg_proofs_rewards_account - ), - None, - ); - - // construct and apply extrinsic containing batch calls: - // bridged relay chain finality proof - // + parachain heads proof - // + submit message proof - let dispatch_outcome = construct_and_apply_extrinsic(relayer_at_target, batch); - - // verify finality proof correctly imported - assert_ok!(dispatch_outcome); - assert_eq!( - >::get().unwrap().1, - relay_chain_header_hash - ); - assert!(>::contains_key( - relay_chain_header_hash - )); - // verify parachain head proof correctly imported - assert_eq!( - pallet_bridge_parachains::ParasInfo::::get(ParaId(bridged_para_id)), - Some(ParaInfo { - best_head_hash: BestParaHeadHash { - at_relay_block_number: relay_header_number, - head_hash: bridged_para_head.hash() - }, - next_imported_hash_position: 1, - }) - ); - // verify message correctly imported and dispatched - assert_eq!( - pallet_bridge_messages::InboundLanes::::get(lane_id) - .last_delivered_nonce(), - 1, - ); - // verify relayer is refunded - assert!(pallet_bridge_relayers::RelayerRewards::::get( - relayer_id_on_target, - msg_proofs_rewards_account - ) - .is_some()); - - // verify relayed bridged XCM message is dispatched to destination sibling para - let dispatched = RuntimeHelper::>::take_xcm( - sibling_parachain_id.into(), - ) - .unwrap(); - // verify contains original message - let dispatched = xcm::latest::Xcm::<()>::try_from(dispatched).unwrap(); - let mut dispatched_clone = dispatched.clone(); - for (idx, expected_instr) in expected_dispatch.0.iter().enumerate() { - assert_eq!(expected_instr, &dispatched.0[idx]); - assert_eq!(expected_instr, &dispatched_clone.0.remove(0)); - } - match dispatched_clone.0.len() { - 0 => (), - 1 => assert!(matches!(dispatched_clone.0[0], SetTopic(_))), - count => assert!(false, "Unexpected messages count: {:?}", count), - } - }) -} - -/// Estimates XCM execution fee for paid `ExportMessage` processing. -pub fn can_calculate_weight_for_paid_export_message_with_reserve_transfer< - Runtime, - XcmConfig, - WeightToFee, ->() -> u128 -where - Runtime: frame_system::Config + pallet_balances::Config, - XcmConfig: xcm_executor::Config, - WeightToFee: frame_support::weights::WeightToFee>, - ::Balance: From + Into, -{ - // data here are not relevant for weighing - let mut xcm = Xcm(vec![ - WithdrawAsset(MultiAssets::from(vec![MultiAsset { - id: Concrete(MultiLocation { parents: 1, interior: Here }), - fun: Fungible(34333299), - }])), - BuyExecution { - fees: MultiAsset { - id: Concrete(MultiLocation { parents: 1, interior: Here }), - fun: Fungible(34333299), - }, - weight_limit: Unlimited, - }, - ExportMessage { - network: Polkadot, - destination: X1(Parachain(1000)), - xcm: Xcm(vec![ - ReserveAssetDeposited(MultiAssets::from(vec![MultiAsset { - id: Concrete(MultiLocation { - parents: 2, - interior: X1(GlobalConsensus(Kusama)), - }), - fun: Fungible(1000000000000), - }])), - ClearOrigin, - BuyExecution { - fees: MultiAsset { - id: Concrete(MultiLocation { - parents: 2, - interior: X1(GlobalConsensus(Kusama)), - }), - fun: Fungible(1000000000000), - }, - weight_limit: Unlimited, - }, - DepositAsset { - assets: Wild(AllCounted(1)), - beneficiary: MultiLocation { - parents: 0, - interior: X1(xcm::latest::prelude::AccountId32 { - network: None, - id: [ - 212, 53, 147, 199, 21, 253, 211, 28, 97, 20, 26, 189, 4, 169, 159, - 214, 130, 44, 133, 88, 133, 76, 205, 227, 154, 86, 132, 231, 165, - 109, 162, 125, - ], - }), - }, - }, - SetTopic([ - 116, 82, 194, 132, 171, 114, 217, 165, 23, 37, 161, 177, 165, 179, 247, 114, - 137, 101, 147, 70, 28, 157, 168, 32, 154, 63, 74, 228, 152, 180, 5, 63, - ]), - ]), - }, - DepositAsset { - assets: Wild(All), - beneficiary: MultiLocation { parents: 1, interior: X1(Parachain(1000)) }, - }, - SetTopic([ - 36, 224, 250, 165, 82, 195, 67, 110, 160, 170, 140, 87, 217, 62, 201, 164, 42, 98, 219, - 157, 124, 105, 248, 25, 131, 218, 199, 36, 109, 173, 100, 122, - ]), - ]); - - // get weight - let weight = XcmConfig::Weigher::weight(&mut xcm); - assert_ok!(weight); - let weight = weight.unwrap(); - // check if sane - let max_expected = Runtime::BlockWeights::get().max_block / 10; - assert!( - weight.all_lte(max_expected), - "calculated weight: {:?}, max_expected: {:?}", - weight, - max_expected - ); - - // check fee, should not be 0 - let estimated_fee = WeightToFee::weight_to_fee(&weight); - assert!(estimated_fee > BalanceOf::::zero()); - - sp_tracing::try_init_simple(); - log::error!( - target: "bridges::estimate", - "Estimate fee: {:?} for `ExportMessage` for runtime: {:?}", - estimated_fee, - Runtime::Version::get(), - ); - - estimated_fee.into() -} - -/// Estimates transaction fee for default message delivery transaction (batched with required -/// proofs) from bridged parachain. -pub fn can_calculate_fee_for_complex_message_delivery_transaction( - collator_session_key: CollatorSessionKeys, - compute_extrinsic_fee: fn(pallet_utility::Call::) -> u128, -) -> u128 -where - Runtime: frame_system::Config - + pallet_balances::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config - + pallet_collator_selection::Config - + cumulus_pallet_parachain_system::Config - + pallet_bridge_grandpa::Config - + pallet_bridge_parachains::Config - + pallet_bridge_messages::Config - + pallet_utility::Config, - GPI: 'static, - PPI: 'static, - MPI: 'static, - MB: MessageBridge, - ::BridgedChain: Send + Sync + 'static, - ::ThisChain: Send + Sync + 'static, - UnderlyingChainOf>: bp_runtime::Chain + Parachain, - ValidatorIdOf: From>, - <>::SourceHeaderChain as SourceHeaderChain>::MessagesProof: - From>, - <>::BridgedChain as bp_runtime::Chain>::Hash: From, - ParaHash: From<<>::BridgedChain as bp_runtime::Chain>::Hash>, - ::AccountId: - Into<<::RuntimeOrigin as OriginTrait>::AccountId>, - ::AccountId: From, - AccountIdOf: From, - >::InboundRelayer: From, - ::RuntimeCall: - From> - + From> - + From>, -{ - ExtBuilder::::default() - .with_collators(collator_session_key.collators()) - .with_session_keys(collator_session_key.session_keys()) - .with_safe_xcm_version(XCM_VERSION) - .with_para_id(1000.into()) - .with_tracing() - .build() - .execute_with(|| { - // generate bridged relay chain finality, parachain heads and message proofs, - // to be submitted by relayer to this chain. - // - // we don't care about parameter values here, apart from the XCM message size. But we - // do not need to have a large message here, because we're charging for every byte of - // the message additionally - let ( - relay_chain_header, - grandpa_justification, - _, - parachain_heads, - para_heads_proof, - message_proof, - ) = test_data::make_complex_relayer_delivery_proofs::< - >::BridgedChain, - MB, - (), - >( - LaneId::default(), - vec![xcm::v3::Instruction::<()>::ClearOrigin; 1_024].into(), - 1, - X2(GlobalConsensus(Polkadot), Parachain(1_000)), - 1, - 5, - 1_000, - ); - - // generate batch call that provides finality for bridged relay and parachains + message - // proof - let batch = test_data::make_complex_relayer_delivery_batch::( - relay_chain_header, - grandpa_justification, - parachain_heads, - para_heads_proof, - message_proof, - Dave.public().into(), - ); - let estimated_fee = compute_extrinsic_fee(batch); - - log::error!( - target: "bridges::estimate", - "Estimate fee: {:?} for single message delivery for runtime: {:?}", - estimated_fee, - Runtime::Version::get(), - ); - - estimated_fee - }) -} - -/// Estimates transaction fee for default message confirmation transaction (batched with required -/// proofs) from bridged parachain. -pub fn can_calculate_fee_for_complex_message_confirmation_transaction( - collator_session_key: CollatorSessionKeys, - compute_extrinsic_fee: fn(pallet_utility::Call::) -> u128, -) -> u128 -where - Runtime: frame_system::Config - + pallet_balances::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config - + pallet_collator_selection::Config - + cumulus_pallet_parachain_system::Config - + pallet_bridge_grandpa::Config - + pallet_bridge_parachains::Config - + pallet_bridge_messages::Config - + pallet_utility::Config, - GPI: 'static, - PPI: 'static, - MPI: 'static, - MB: MessageBridge, - ::BridgedChain: Send + Sync + 'static, - ::ThisChain: Send + Sync + 'static, - <::ThisChain as bp_runtime::Chain>::AccountId: From, - UnderlyingChainOf>: bp_runtime::Chain + Parachain, - ValidatorIdOf: From>, - <>::SourceHeaderChain as SourceHeaderChain>::MessagesProof: - From>, - <>::BridgedChain as bp_runtime::Chain>::Hash: From, - ParaHash: From<<>::BridgedChain as bp_runtime::Chain>::Hash>, - ::AccountId: - Into<<::RuntimeOrigin as OriginTrait>::AccountId>, - ::AccountId: From, - AccountIdOf: From, - >::InboundRelayer: From, - <>::TargetHeaderChain as TargetHeaderChain< - XcmAsPlainPayload, - Runtime::AccountId, - >>::MessagesDeliveryProof: From>, - ::RuntimeCall: - From> - + From> - + From>, -{ - ExtBuilder::::default() - .with_collators(collator_session_key.collators()) - .with_session_keys(collator_session_key.session_keys()) - .with_safe_xcm_version(XCM_VERSION) - .with_para_id(1000.into()) - .with_tracing() - .build() - .execute_with(|| { - // generate bridged relay chain finality, parachain heads and message proofs, - // to be submitted by relayer to this chain. - let unrewarded_relayers = UnrewardedRelayersState { - unrewarded_relayer_entries: 1, - total_messages: 1, - ..Default::default() - }; - let ( - relay_chain_header, - grandpa_justification, - _, - parachain_heads, - para_heads_proof, - message_delivery_proof, - ) = test_data::make_complex_relayer_confirmation_proofs::< - >::BridgedChain, - MB, - (), - >(LaneId::default(), 1, 5, 1_000, Alice.public().into(), unrewarded_relayers.clone()); - - // generate batch call that provides finality for bridged relay and parachains + message - // proof - let batch = test_data::make_complex_relayer_confirmation_batch::( - relay_chain_header, - grandpa_justification, - parachain_heads, - para_heads_proof, - message_delivery_proof, - unrewarded_relayers, - ); - let estimated_fee = compute_extrinsic_fee(batch); - - log::error!( - target: "bridges::estimate", - "Estimate fee: {:?} for single message confirmation for runtime: {:?}", - estimated_fee, - Runtime::Version::get(), - ); - - estimated_fee - }) -} - -pub mod test_data { - use super::*; - use bp_header_chain::{justification::GrandpaJustification, ChainWithGrandpa}; - use bp_messages::{DeliveredMessages, InboundLaneData, MessageNonce, UnrewardedRelayer}; - use bp_polkadot_core::parachains::{ParaHash, ParaHead, ParaHeadsProof, ParaId}; - use bp_runtime::{BasicOperatingMode, HashOf}; - use bp_test_utils::authority_list; - use sp_runtime::{DigestItem, SaturatedConversion}; - use xcm_builder::{HaulBlob, HaulBlobError, HaulBlobExporter}; - use xcm_executor::traits::{validate_export, ExportXcm}; - - pub fn prepare_inbound_xcm( - xcm_message: Xcm, - destination: InteriorMultiLocation, - ) -> Vec { - let location = xcm::VersionedInteriorMultiLocation::V3(destination); - let xcm = xcm::VersionedXcm::::V3(xcm_message); - // this is the `BridgeMessage` from polkadot xcm builder, but it has no constructor - // or public fields, so just tuple - // (double encoding, because `.encode()` is called on original Xcm BLOB when it is pushed - // to the storage) - (location, xcm).encode().encode() - } - - /// Prepare a batch call with relay finality proof, parachain head proof and message proof. - pub fn make_complex_relayer_delivery_batch( - relay_chain_header: BridgedHeader, - grandpa_justification: GrandpaJustification>, - parachain_heads: Vec<(ParaId, ParaHash)>, - para_heads_proof: ParaHeadsProof, - message_proof: FromBridgedChainMessagesProof, - relayer_id_at_bridged_chain: AccountId32, - ) -> pallet_utility::Call where - Runtime:pallet_bridge_grandpa::Config - + pallet_bridge_parachains::Config - + pallet_bridge_messages::Config - + pallet_utility::Config, - GPI: 'static, - PPI: 'static, - MPI: 'static, - ParaHash: From<<>::BridgedChain as bp_runtime::Chain>::Hash>, - <>::BridgedChain as bp_runtime::Chain>::Hash: From, - <>::SourceHeaderChain as SourceHeaderChain>::MessagesProof: - From>, - >::InboundRelayer: From, - ::RuntimeCall: - From> - + From> - + From>, - { - let relay_chain_header_hash = relay_chain_header.hash(); - let relay_chain_header_number = *relay_chain_header.number(); - let submit_grandpa = pallet_bridge_grandpa::Call::::submit_finality_proof { - finality_target: Box::new(relay_chain_header), - justification: grandpa_justification, - }; - let submit_para_head = - pallet_bridge_parachains::Call::::submit_parachain_heads { - at_relay_block: ( - relay_chain_header_number.saturated_into(), - relay_chain_header_hash.into(), - ), - parachains: parachain_heads, - parachain_heads_proof: para_heads_proof, - }; - let submit_message = pallet_bridge_messages::Call::::receive_messages_proof { - relayer_id_at_bridged_chain: relayer_id_at_bridged_chain.into(), - proof: message_proof.into(), - messages_count: 1, - dispatch_weight: Weight::from_parts(1000000000, 0), - }; - pallet_utility::Call::::batch_all { - calls: vec![submit_grandpa.into(), submit_para_head.into(), submit_message.into()], - } - } - - /// Prepare a batch call with relay finality proof, parachain head proof and message delivery - /// proof. - pub fn make_complex_relayer_confirmation_batch( - relay_chain_header: BridgedHeader, - grandpa_justification: GrandpaJustification>, - parachain_heads: Vec<(ParaId, ParaHash)>, - para_heads_proof: ParaHeadsProof, - message_delivery_proof: FromBridgedChainMessagesDeliveryProof, - relayers_state: UnrewardedRelayersState, - ) -> pallet_utility::Call where - Runtime:pallet_bridge_grandpa::Config - + pallet_bridge_parachains::Config - + pallet_bridge_messages::Config - + pallet_utility::Config, - GPI: 'static, - PPI: 'static, - MPI: 'static, - ParaHash: From<<>::BridgedChain as bp_runtime::Chain>::Hash>, - <>::BridgedChain as bp_runtime::Chain>::Hash: From, - <>::TargetHeaderChain as TargetHeaderChain< - XcmAsPlainPayload, - Runtime::AccountId, - >>::MessagesDeliveryProof: From>, - ::RuntimeCall: - From> - + From> - + From>, - { - let relay_chain_header_hash = relay_chain_header.hash(); - let relay_chain_header_number = *relay_chain_header.number(); - let submit_grandpa = pallet_bridge_grandpa::Call::::submit_finality_proof { - finality_target: Box::new(relay_chain_header), - justification: grandpa_justification, - }; - let submit_para_head = - pallet_bridge_parachains::Call::::submit_parachain_heads { - at_relay_block: ( - relay_chain_header_number.saturated_into(), - relay_chain_header_hash.into(), - ), - parachains: parachain_heads, - parachain_heads_proof: para_heads_proof, - }; - let submit_message_delivery_proof = - pallet_bridge_messages::Call::::receive_messages_delivery_proof { - proof: message_delivery_proof.into(), - relayers_state, - }; - pallet_utility::Call::::batch_all { - calls: vec![ - submit_grandpa.into(), - submit_para_head.into(), - submit_message_delivery_proof.into(), - ], - } - } - - /// Prepare storage proofs of messages, stored at the source chain. - pub fn make_complex_relayer_delivery_proofs( - lane_id: LaneId, - xcm_message: Xcm, - message_nonce: MessageNonce, - message_destination: Junctions, - para_header_number: u32, - relay_header_number: u32, - bridged_para_id: u32, - ) -> ( - HeaderOf, - GrandpaJustification>, - ParaHead, - Vec<(ParaId, ParaHash)>, - ParaHeadsProof, - FromBridgedChainMessagesProof, - ) - where - BridgedRelayChain: ChainWithGrandpa, - HashOf: From, - MB: MessageBridge, - ::BridgedChain: Send + Sync + 'static, - ::ThisChain: Send + Sync + 'static, - UnderlyingChainOf>: bp_runtime::Chain + Parachain, - { - let message_payload = prepare_inbound_xcm(xcm_message, message_destination); - let message_size = StorageProofSize::Minimal(message_payload.len() as u32); - // prepare para storage proof containing message - let (para_state_root, para_storage_proof) = prepare_messages_storage_proof::( - lane_id, - message_nonce..=message_nonce, - None, - message_size, - message_payload, - encode_all_messages, - encode_lane_data, - ); - - let ( - relay_chain_header, - justification, - bridged_para_head, - parachain_heads, - para_heads_proof, - ) = make_complex_bridged_heads_proof::( - para_state_root, - para_header_number, - relay_header_number, - bridged_para_id, - ); - - let message_proof = FromBridgedChainMessagesProof { - bridged_header_hash: bridged_para_head.hash(), - storage_proof: para_storage_proof, - lane: lane_id, - nonces_start: message_nonce, - nonces_end: message_nonce, - }; - - ( - relay_chain_header, - justification, - bridged_para_head, - parachain_heads, - para_heads_proof, - message_proof, - ) - } - - /// Prepare storage proofs of message confirmations, stored at the target chain. - pub fn make_complex_relayer_confirmation_proofs( - lane_id: LaneId, - para_header_number: u32, - relay_header_number: u32, - bridged_para_id: u32, - relayer_id_at_this_chain: AccountId32, - relayers_state: UnrewardedRelayersState, - ) -> ( - HeaderOf, - GrandpaJustification>, - ParaHead, - Vec<(ParaId, ParaHash)>, - ParaHeadsProof, - FromBridgedChainMessagesDeliveryProof, - ) - where - BridgedRelayChain: ChainWithGrandpa, - HashOf: From, - MB: MessageBridge, - ::BridgedChain: Send + Sync + 'static, - ::ThisChain: Send + Sync + 'static, - <::ThisChain as bp_runtime::Chain>::AccountId: From, - UnderlyingChainOf>: bp_runtime::Chain + Parachain, - { - // prepare para storage proof containing message delivery proof - let (para_state_root, para_storage_proof) = prepare_message_delivery_storage_proof::( - lane_id, - InboundLaneData { - relayers: vec![ - UnrewardedRelayer { - relayer: relayer_id_at_this_chain.into(), - messages: DeliveredMessages::new(1) - }; - relayers_state.unrewarded_relayer_entries as usize - ] - .into(), - last_confirmed_nonce: 1, - }, - StorageProofSize::Minimal(0), - ); - - let ( - relay_chain_header, - justification, - bridged_para_head, - parachain_heads, - para_heads_proof, - ) = make_complex_bridged_heads_proof::( - para_state_root, - para_header_number, - relay_header_number, - bridged_para_id, - ); - - let message_delivery_proof = FromBridgedChainMessagesDeliveryProof { - bridged_header_hash: bridged_para_head.hash(), - storage_proof: para_storage_proof, - lane: lane_id, - }; - - ( - relay_chain_header, - justification, - bridged_para_head, - parachain_heads, - para_heads_proof, - message_delivery_proof, - ) - } - - /// Make bridged parachain header with given state root and relay header that is finalizing it. - pub fn make_complex_bridged_heads_proof( - para_state_root: ParaHash, - para_header_number: u32, - relay_header_number: u32, - bridged_para_id: u32, - ) -> ( - HeaderOf, - GrandpaJustification>, - ParaHead, - Vec<(ParaId, ParaHash)>, - ParaHeadsProof, - ) - where - BridgedRelayChain: ChainWithGrandpa, - HashOf: From, - MB: MessageBridge, - ::BridgedChain: Send + Sync + 'static, - ::ThisChain: Send + Sync + 'static, - UnderlyingChainOf>: bp_runtime::Chain + Parachain, - { - let bridged_para_head = ParaHead( - bp_test_utils::test_header_with_root::>( - para_header_number.into(), - para_state_root.into(), - ) - .encode(), - ); - let (relay_state_root, para_heads_proof, parachain_heads) = - prepare_parachain_heads_proof::>(vec![( - bridged_para_id, - bridged_para_head.clone(), - )]); - assert_eq!(bridged_para_head.hash(), parachain_heads[0].1); - - // import bridged relay chain block#1 with state root containing head#5 of bridged parachain - let mut relay_chain_header: BridgedRelayChain::Header = - bp_test_utils::test_header_with_root( - relay_header_number.into(), - relay_state_root.into(), - ); - // to compute proper cost of GRANDPA call, let's add some dummy bytes to header, so that the - // `submit_finality_proof` call size would be close to maximal expected (and refundable) - let expected_bytes_in_grandpa_call = BridgedRelayChain::AVERAGE_HEADER_SIZE - .saturating_mul(BridgedRelayChain::REASONABLE_HEADERS_IN_JUSTIFICATON_ANCESTRY) - .saturating_add(BridgedRelayChain::MAX_MANDATORY_HEADER_SIZE) - as usize; - let extra_bytes_required = - expected_bytes_in_grandpa_call.saturating_sub(relay_chain_header.encoded_size()); - relay_chain_header - .digest_mut() - .push(DigestItem::Other(vec![42; extra_bytes_required])); - - let justification = make_default_justification(&relay_chain_header); - (relay_chain_header, justification, bridged_para_head, parachain_heads, para_heads_proof) - } - - /// Helper that creates InitializationData mock data, that can be used to initialize bridge - /// GRANDPA pallet - pub fn initialization_data< - Runtime: pallet_bridge_grandpa::Config, - GrandpaPalletInstance: 'static, - >( - block_number: u32, - ) -> bp_header_chain::InitializationData> { - bp_header_chain::InitializationData { - header: Box::new(bp_test_utils::test_header(block_number.into())), - authority_list: authority_list(), - set_id: 1, - operating_mode: BasicOperatingMode::Normal, - } - } - - /// Dummy xcm - pub(crate) fn dummy_xcm() -> Xcm<()> { - vec![Trap(42)].into() - } - - pub(crate) fn dispatch_message( - lane_id: LaneId, - nonce: MessageNonce, - payload: Vec, - ) -> DispatchMessage> { - DispatchMessage { - key: MessageKey { lane_id, nonce }, - data: DispatchMessageData { payload: Ok(payload) }, - } - } - - /// Macro used for simulate_export_message and capturing bytes - macro_rules! grab_haul_blob ( - ($name:ident, $grabbed_payload:ident) => { - std::thread_local! { - static $grabbed_payload: std::cell::RefCell>> = std::cell::RefCell::new(None); - } - - struct $name; - impl HaulBlob for $name { - fn haul_blob(blob: Vec) -> Result<(), HaulBlobError>{ - $grabbed_payload.with(|rm| *rm.borrow_mut() = Some(blob)); - Ok(()) - } - } - } - ); - - /// Simulates `HaulBlobExporter` and all its wrapping and captures generated plain bytes, - /// which are transferred over bridge. - pub(crate) fn simulate_message_exporter_on_bridged_chain< - SourceNetwork: Get, - DestinationNetwork: Get, - DestinationVersion: GetVersion, - >( - (destination_network, destination_junctions): (NetworkId, Junctions), - ) -> Vec { - grab_haul_blob!(GrabbingHaulBlob, GRABBED_HAUL_BLOB_PAYLOAD); - - // lets pretend that some parachain on bridged chain exported the message - let universal_source_on_bridged_chain = - X2(GlobalConsensus(SourceNetwork::get()), Parachain(5678)); - let channel = 1_u32; - - // simulate XCM message export - let (ticket, fee) = validate_export::< - HaulBlobExporter, - >( - destination_network, - channel, - universal_source_on_bridged_chain, - destination_junctions, - dummy_xcm(), - ) - .expect("validate_export to pass"); - log::info!( - target: "simulate_message_exporter_on_bridged_chain", - "HaulBlobExporter::validate fee: {:?}", - fee - ); - let xcm_hash = HaulBlobExporter::< - GrabbingHaulBlob, - DestinationNetwork, - DestinationVersion, - (), - >::deliver(ticket) - .expect("deliver to pass"); - log::info!( - target: "simulate_message_exporter_on_bridged_chain", - "HaulBlobExporter::deliver xcm_hash: {:?}", - xcm_hash - ); - - GRABBED_HAUL_BLOB_PAYLOAD.with(|r| r.take().expect("Encoded message should be here")) - } -} diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs new file mode 100644 index 00000000000..3a0bbf8f571 --- /dev/null +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs @@ -0,0 +1,442 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +//! Module contains predefined test-case scenarios for `Runtime` with bridging capabilities +//! with remote GRANDPA chain. + +use crate::{ + test_cases::{helpers, run_test}, + test_data, +}; + +use bp_header_chain::ChainWithGrandpa; +use bp_messages::{ + source_chain::TargetHeaderChain, target_chain::SourceHeaderChain, LaneId, + UnrewardedRelayersState, +}; +use bp_relayers::{RewardsAccountOwner, RewardsAccountParams}; +use bp_runtime::{HashOf, UnderlyingChainOf}; +use bridge_runtime_common::{ + messages::{ + source::FromBridgedChainMessagesDeliveryProof, target::FromBridgedChainMessagesProof, + BridgedChain as MessageBridgedChain, MessageBridge, ThisChain as MessageThisChain, + }, + messages_xcm_extension::XcmAsPlainPayload, +}; +use frame_support::traits::{Get, OnFinalize, OnInitialize, OriginTrait}; +use frame_system::pallet_prelude::BlockNumberFor; +use parachains_runtimes_test_utils::{ + AccountIdOf, BasicParachainRuntime, CollatorSessionKeys, ValidatorIdOf, +}; +use sp_keyring::AccountKeyring::*; +use sp_runtime::{traits::Header as HeaderT, AccountId32}; +use xcm::latest::prelude::*; + +/// Test-case makes sure that Runtime can dispatch XCM messages submitted by relayer, +/// with proofs (finality, message) independently submitted. +/// Also verifies relayer transaction signed extensions work as intended. +pub fn relayed_incoming_message_works< + Runtime, + AllPalletsWithoutSystem, + HrmpChannelOpener, + GPI, + MPI, + MB, +>( + collator_session_key: CollatorSessionKeys, + runtime_para_id: u32, + bridged_chain_id: bp_runtime::ChainId, + sibling_parachain_id: u32, + local_relay_chain_id: NetworkId, + lane_id: LaneId, + prepare_configuration: impl Fn(), + construct_and_apply_extrinsic: fn( + sp_keyring::AccountKeyring, + ::RuntimeCall, + ) -> sp_runtime::DispatchOutcome, +) where + Runtime: BasicParachainRuntime + + cumulus_pallet_xcmp_queue::Config + + pallet_bridge_grandpa::Config< + GPI, + BridgedChain = UnderlyingChainOf>, + > + pallet_bridge_messages::Config + + pallet_bridge_relayers::Config, + AllPalletsWithoutSystem: + OnInitialize> + OnFinalize>, + GPI: 'static, + MPI: 'static, + MB: MessageBridge, + ::BridgedChain: Send + Sync + 'static, + ::ThisChain: Send + Sync + 'static, + UnderlyingChainOf>: ChainWithGrandpa, + HrmpChannelOpener: frame_support::inherent::ProvideInherent< + Call = cumulus_pallet_parachain_system::Call, + >, + ValidatorIdOf: From>, + >::SourceHeaderChain: SourceHeaderChain< + MessagesProof = FromBridgedChainMessagesProof>>, + >, + ::AccountId: + Into<<::RuntimeOrigin as OriginTrait>::AccountId>, + ::AccountId: From, + AccountIdOf: From, + >::InboundRelayer: From, + ::RuntimeCall: From> + + From>, +{ + helpers::relayed_incoming_message_works::< + Runtime, + AllPalletsWithoutSystem, + HrmpChannelOpener, + MPI, + >( + collator_session_key, + runtime_para_id, + sibling_parachain_id, + local_relay_chain_id, + construct_and_apply_extrinsic, + |relayer_id_at_this_chain, + relayer_id_at_bridged_chain, + message_destination, + message_nonce, + xcm| { + let relay_header_number = 5u32.into(); + + prepare_configuration(); + + // start with bridged relay chain block#0 + helpers::initialize_bridge_grandpa_pallet::( + test_data::initialization_data::(0), + ); + + // generate bridged relay chain finality, parachain heads and message proofs, + // to be submitted by relayer to this chain. + let (relay_chain_header, grandpa_justification, message_proof) = + test_data::from_grandpa_chain::make_complex_relayer_delivery_proofs::( + lane_id, + xcm.into(), + message_nonce, + message_destination, + relay_header_number, + ); + + let relay_chain_header_hash = relay_chain_header.hash(); + vec![ + ( + pallet_bridge_grandpa::Call::::submit_finality_proof { + finality_target: Box::new(relay_chain_header), + justification: grandpa_justification, + }.into(), + helpers::VerifySubmitGrandpaFinalityProofOutcome::::expect_best_header_hash(relay_chain_header_hash), + ), + ( + pallet_bridge_messages::Call::::receive_messages_proof { + relayer_id_at_bridged_chain, + proof: message_proof, + messages_count: 1, + dispatch_weight: Weight::from_parts(1000000000, 0), + }.into(), + Box::new(( + helpers::VerifySubmitMessagesProofOutcome::::expect_last_delivered_nonce(lane_id, 1), + helpers::VerifyRelayerRewarded::::expect_relayer_reward( + relayer_id_at_this_chain, + RewardsAccountParams::new( + lane_id, + bridged_chain_id, + RewardsAccountOwner::ThisChain, + ), + ), + )), + ), + ] + }, + ); +} + +/// Test-case makes sure that Runtime can dispatch XCM messages submitted by relayer, +/// with proofs (finality, message) batched together in signed extrinsic. +/// Also verifies relayer transaction signed extensions work as intended. +pub fn complex_relay_extrinsic_works< + Runtime, + AllPalletsWithoutSystem, + XcmConfig, + HrmpChannelOpener, + GPI, + MPI, + MB, +>( + collator_session_key: CollatorSessionKeys, + runtime_para_id: u32, + sibling_parachain_id: u32, + bridged_chain_id: bp_runtime::ChainId, + local_relay_chain_id: NetworkId, + lane_id: LaneId, + prepare_configuration: impl Fn(), + construct_and_apply_extrinsic: fn( + sp_keyring::AccountKeyring, + ::RuntimeCall, + ) -> sp_runtime::DispatchOutcome, +) where + Runtime: BasicParachainRuntime + + cumulus_pallet_xcmp_queue::Config + + pallet_bridge_grandpa::Config< + GPI, + BridgedChain = UnderlyingChainOf>, + > + pallet_bridge_messages::Config + + pallet_bridge_relayers::Config + + pallet_utility::Config, + AllPalletsWithoutSystem: + OnInitialize> + OnFinalize>, + GPI: 'static, + MPI: 'static, + MB: MessageBridge, + ::BridgedChain: Send + Sync + 'static, + ::ThisChain: Send + Sync + 'static, + UnderlyingChainOf>: ChainWithGrandpa, + HrmpChannelOpener: frame_support::inherent::ProvideInherent< + Call = cumulus_pallet_parachain_system::Call, + >, + ValidatorIdOf: From>, + >::SourceHeaderChain: SourceHeaderChain< + MessagesProof = FromBridgedChainMessagesProof>>, + >, + ::AccountId: + Into<<::RuntimeOrigin as OriginTrait>::AccountId>, + ::AccountId: From, + AccountIdOf: From, + >::InboundRelayer: From, + ::RuntimeCall: From> + + From>, + ::RuntimeCall: From>, +{ + helpers::relayed_incoming_message_works::< + Runtime, + AllPalletsWithoutSystem, + HrmpChannelOpener, + MPI, + >( + collator_session_key, + runtime_para_id, + sibling_parachain_id, + local_relay_chain_id, + construct_and_apply_extrinsic, + |relayer_id_at_this_chain, + relayer_id_at_bridged_chain, + message_destination, + message_nonce, + xcm| { + let relay_header_number = 1u32.into(); + + prepare_configuration(); + + // start with bridged relay chain block#0 + helpers::initialize_bridge_grandpa_pallet::( + test_data::initialization_data::(0), + ); + + // generate bridged relay chain finality, parachain heads and message proofs, + // to be submitted by relayer to this chain. + let (relay_chain_header, grandpa_justification, message_proof) = + test_data::from_grandpa_chain::make_complex_relayer_delivery_proofs::( + lane_id, + xcm.into(), + message_nonce, + message_destination, + relay_header_number, + ); + + let relay_chain_header_hash = relay_chain_header.hash(); + vec![( + pallet_utility::Call::::batch_all { + calls: vec![ + pallet_bridge_grandpa::Call::::submit_finality_proof { + finality_target: Box::new(relay_chain_header), + justification: grandpa_justification, + }.into(), + pallet_bridge_messages::Call::::receive_messages_proof { + relayer_id_at_bridged_chain, + proof: message_proof, + messages_count: 1, + dispatch_weight: Weight::from_parts(1000000000, 0), + }.into(), + ], + }.into(), + Box::new(( + helpers::VerifySubmitGrandpaFinalityProofOutcome::::expect_best_header_hash(relay_chain_header_hash), + helpers::VerifySubmitMessagesProofOutcome::::expect_last_delivered_nonce(lane_id, 1), + helpers::VerifyRelayerRewarded::::expect_relayer_reward( + relayer_id_at_this_chain, + RewardsAccountParams::new( + lane_id, + bridged_chain_id, + RewardsAccountOwner::ThisChain, + ), + ), + )), + )] + }, + ); +} + +/// Estimates transaction fee for default message delivery transaction (batched with required +/// proofs) from bridged GRANDPA chain. +pub fn can_calculate_fee_for_complex_message_delivery_transaction( + collator_session_key: CollatorSessionKeys, + compute_extrinsic_fee: fn(pallet_utility::Call) -> u128, +) -> u128 +where + Runtime: BasicParachainRuntime + + pallet_bridge_grandpa::Config< + GPI, + BridgedChain = UnderlyingChainOf>, + > + pallet_bridge_messages::Config< + MPI, + InboundPayload = XcmAsPlainPayload, + InboundRelayer = bp_runtime::AccountIdOf>, + > + pallet_utility::Config, + GPI: 'static, + MPI: 'static, + MB: MessageBridge, + ::BridgedChain: Send + Sync + 'static, + ::ThisChain: Send + Sync + 'static, + UnderlyingChainOf>: bp_runtime::Chain + ChainWithGrandpa, + ValidatorIdOf: From>, + >::SourceHeaderChain: SourceHeaderChain< + MessagesProof = FromBridgedChainMessagesProof>>, + >, + bp_runtime::AccountIdOf>: From, + ::RuntimeCall: From> + + From>, +{ + run_test::(collator_session_key, 1000, vec![], || { + // generate bridged relay chain finality, parachain heads and message proofs, + // to be submitted by relayer to this chain. + // + // we don't care about parameter values here, apart from the XCM message size. But we + // do not need to have a large message here, because we're charging for every byte of + // the message additionally + let (relay_chain_header, grandpa_justification, message_proof) = + test_data::from_grandpa_chain::make_complex_relayer_delivery_proofs::( + LaneId::default(), + vec![xcm::v3::Instruction::<()>::ClearOrigin; 1_024].into(), + 1, + X2(GlobalConsensus(Polkadot), Parachain(1_000)), + 1u32.into(), + ); + + // generate batch call that provides finality for bridged relay and parachains + message + // proof + let batch = test_data::from_grandpa_chain::make_complex_relayer_delivery_batch::< + Runtime, + GPI, + MPI, + >( + relay_chain_header, + grandpa_justification, + message_proof, + Dave.public().into(), + ); + let estimated_fee = compute_extrinsic_fee(batch); + + log::error!( + target: "bridges::estimate", + "Estimate fee: {:?} for single message delivery for runtime: {:?}", + estimated_fee, + Runtime::Version::get(), + ); + + estimated_fee + }) +} + +/// Estimates transaction fee for default message confirmation transaction (batched with required +/// proofs) from bridged GRANDPA chain. +pub fn can_calculate_fee_for_complex_message_confirmation_transaction( + collator_session_key: CollatorSessionKeys, + compute_extrinsic_fee: fn(pallet_utility::Call) -> u128, +) -> u128 +where + Runtime: BasicParachainRuntime + + pallet_bridge_grandpa::Config< + GPI, + BridgedChain = UnderlyingChainOf>, + > + pallet_bridge_messages::Config + + pallet_utility::Config, + GPI: 'static, + MPI: 'static, + MB: MessageBridge, + ::BridgedChain: Send + Sync + 'static, + ::ThisChain: Send + Sync + 'static, + <::ThisChain as bp_runtime::Chain>::AccountId: From, + UnderlyingChainOf>: ChainWithGrandpa, + ValidatorIdOf: From>, + ::AccountId: + Into<<::RuntimeOrigin as OriginTrait>::AccountId>, + ::AccountId: From, + AccountIdOf: From, + >::InboundRelayer: From, + >::TargetHeaderChain: TargetHeaderChain< + XcmAsPlainPayload, + Runtime::AccountId, + MessagesDeliveryProof = FromBridgedChainMessagesDeliveryProof< + HashOf>>, + >, + >, + ::RuntimeCall: From> + + From>, + bp_runtime::AccountIdOf>: From, +{ + run_test::(collator_session_key, 1000, vec![], || { + // generate bridged relay chain finality, parachain heads and message proofs, + // to be submitted by relayer to this chain. + let unrewarded_relayers = UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + total_messages: 1, + ..Default::default() + }; + let (relay_chain_header, grandpa_justification, message_delivery_proof) = + test_data::from_grandpa_chain::make_complex_relayer_confirmation_proofs::( + LaneId::default(), + 1u32.into(), + Alice.public().into(), + unrewarded_relayers.clone(), + ); + + // generate batch call that provides finality for bridged relay and parachains + message + // proof + let batch = test_data::from_grandpa_chain::make_complex_relayer_confirmation_batch::< + Runtime, + GPI, + MPI, + >( + relay_chain_header, + grandpa_justification, + message_delivery_proof, + unrewarded_relayers, + ); + let estimated_fee = compute_extrinsic_fee(batch); + + log::error!( + target: "bridges::estimate", + "Estimate fee: {:?} for single message confirmation for runtime: {:?}", + estimated_fee, + Runtime::Version::get(), + ); + + estimated_fee + }) +} diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs new file mode 100644 index 00000000000..7e4ff8f874d --- /dev/null +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs @@ -0,0 +1,544 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +//! Module contains predefined test-case scenarios for `Runtime` with bridging capabilities +//! with remote parachain. + +use crate::{ + test_cases::{helpers, run_test}, + test_data, +}; + +use bp_messages::{ + source_chain::TargetHeaderChain, target_chain::SourceHeaderChain, LaneId, + UnrewardedRelayersState, +}; +use bp_polkadot_core::parachains::ParaHash; +use bp_relayers::{RewardsAccountOwner, RewardsAccountParams}; +use bp_runtime::{Parachain, UnderlyingChainOf}; +use bridge_runtime_common::{ + messages::{ + source::FromBridgedChainMessagesDeliveryProof, target::FromBridgedChainMessagesProof, + BridgedChain as MessageBridgedChain, MessageBridge, + }, + messages_xcm_extension::XcmAsPlainPayload, +}; +use frame_support::traits::{Get, OnFinalize, OnInitialize, OriginTrait}; +use frame_system::pallet_prelude::BlockNumberFor; +use pallet_bridge_parachains::{RelayBlockHash, RelayBlockNumber}; +use parachains_runtimes_test_utils::{ + AccountIdOf, BasicParachainRuntime, CollatorSessionKeys, ValidatorIdOf, +}; +use sp_keyring::AccountKeyring::*; +use sp_runtime::{traits::Header as HeaderT, AccountId32}; +use xcm::latest::prelude::*; + +/// Test-case makes sure that Runtime can dispatch XCM messages submitted by relayer, +/// with proofs (finality, para heads, message) independently submitted. +/// Also verifies relayer transaction signed extensions work as intended. +pub fn relayed_incoming_message_works< + Runtime, + AllPalletsWithoutSystem, + HrmpChannelOpener, + GPI, + PPI, + MPI, + MB, +>( + collator_session_key: CollatorSessionKeys, + runtime_para_id: u32, + bridged_para_id: u32, + bridged_chain_id: bp_runtime::ChainId, + sibling_parachain_id: u32, + local_relay_chain_id: NetworkId, + lane_id: LaneId, + prepare_configuration: impl Fn(), + construct_and_apply_extrinsic: fn( + sp_keyring::AccountKeyring, + ::RuntimeCall, + ) -> sp_runtime::DispatchOutcome, +) where + Runtime: BasicParachainRuntime + + cumulus_pallet_xcmp_queue::Config + + cumulus_pallet_parachain_system::Config + + pallet_bridge_grandpa::Config + + pallet_bridge_parachains::Config + + pallet_bridge_messages::Config + + pallet_bridge_relayers::Config, + AllPalletsWithoutSystem: + OnInitialize> + OnFinalize>, + GPI: 'static, + PPI: 'static, + MPI: 'static, + MB: MessageBridge, + ::BridgedChain: Send + Sync + 'static, + ::ThisChain: Send + Sync + 'static, + UnderlyingChainOf>: bp_runtime::Chain + Parachain, + HrmpChannelOpener: frame_support::inherent::ProvideInherent< + Call = cumulus_pallet_parachain_system::Call, + >, + ValidatorIdOf: From>, + >::SourceHeaderChain: + SourceHeaderChain>, + >::BridgedChain: + bp_runtime::Chain, + ParaHash: From< + <>::BridgedChain as bp_runtime::Chain>::Hash, + >, + ::AccountId: + Into<<::RuntimeOrigin as OriginTrait>::AccountId>, + ::AccountId: From, + AccountIdOf: From, + >::InboundRelayer: From, + ::RuntimeCall: From> + + From> + + From>, +{ + helpers::relayed_incoming_message_works::< + Runtime, + AllPalletsWithoutSystem, + HrmpChannelOpener, + MPI, + >( + collator_session_key, + runtime_para_id, + sibling_parachain_id, + local_relay_chain_id, + construct_and_apply_extrinsic, + |relayer_id_at_this_chain, + relayer_id_at_bridged_chain, + message_destination, + message_nonce, + xcm| { + let para_header_number = 5; + let relay_header_number = 1; + + prepare_configuration(); + + // start with bridged relay chain block#0 + helpers::initialize_bridge_grandpa_pallet::( + test_data::initialization_data::(0), + ); + + // generate bridged relay chain finality, parachain heads and message proofs, + // to be submitted by relayer to this chain. + let ( + relay_chain_header, + grandpa_justification, + parachain_head, + parachain_heads, + para_heads_proof, + message_proof, + ) = test_data::from_parachain::make_complex_relayer_delivery_proofs::< + >::BridgedChain, + MB, + (), + >( + lane_id, + xcm.into(), + message_nonce, + message_destination, + para_header_number, + relay_header_number, + bridged_para_id, + ); + + let parachain_head_hash = parachain_head.hash(); + let relay_chain_header_hash = relay_chain_header.hash(); + let relay_chain_header_number = *relay_chain_header.number(); + vec![ + ( + pallet_bridge_grandpa::Call::::submit_finality_proof { + finality_target: Box::new(relay_chain_header), + justification: grandpa_justification, + }.into(), + helpers::VerifySubmitGrandpaFinalityProofOutcome::::expect_best_header_hash(relay_chain_header_hash), + ), + ( + pallet_bridge_parachains::Call::::submit_parachain_heads { + at_relay_block: (relay_chain_header_number, relay_chain_header_hash), + parachains: parachain_heads, + parachain_heads_proof: para_heads_proof, + }.into(), + helpers::VerifySubmitParachainHeaderProofOutcome::::expect_best_header_hash(bridged_para_id, parachain_head_hash), + ), + ( + pallet_bridge_messages::Call::::receive_messages_proof { + relayer_id_at_bridged_chain, + proof: message_proof, + messages_count: 1, + dispatch_weight: Weight::from_parts(1000000000, 0), + }.into(), + Box::new(( + helpers::VerifySubmitMessagesProofOutcome::::expect_last_delivered_nonce(lane_id, 1), + helpers::VerifyRelayerRewarded::::expect_relayer_reward( + relayer_id_at_this_chain, + RewardsAccountParams::new( + lane_id, + bridged_chain_id, + RewardsAccountOwner::ThisChain, + ), + ), + )), + ), + ] + }, + ); +} + +/// Test-case makes sure that Runtime can dispatch XCM messages submitted by relayer, +/// with proofs (finality, para heads, message) batched together in signed extrinsic. +/// Also verifies relayer transaction signed extensions work as intended. +pub fn complex_relay_extrinsic_works< + Runtime, + AllPalletsWithoutSystem, + XcmConfig, + HrmpChannelOpener, + GPI, + PPI, + MPI, + MB, +>( + collator_session_key: CollatorSessionKeys, + runtime_para_id: u32, + bridged_para_id: u32, + sibling_parachain_id: u32, + bridged_chain_id: bp_runtime::ChainId, + local_relay_chain_id: NetworkId, + lane_id: LaneId, + prepare_configuration: impl Fn(), + construct_and_apply_extrinsic: fn( + sp_keyring::AccountKeyring, + ::RuntimeCall, + ) -> sp_runtime::DispatchOutcome, +) where + Runtime: BasicParachainRuntime + + cumulus_pallet_xcmp_queue::Config + + cumulus_pallet_parachain_system::Config + + pallet_bridge_grandpa::Config + + pallet_bridge_parachains::Config + + pallet_bridge_messages::Config + + pallet_bridge_relayers::Config + + pallet_utility::Config, + AllPalletsWithoutSystem: + OnInitialize> + OnFinalize>, + GPI: 'static, + PPI: 'static, + MPI: 'static, + MB: MessageBridge, + ::BridgedChain: Send + Sync + 'static, + ::ThisChain: Send + Sync + 'static, + UnderlyingChainOf>: bp_runtime::Chain + Parachain, + HrmpChannelOpener: frame_support::inherent::ProvideInherent< + Call = cumulus_pallet_parachain_system::Call, + >, + ValidatorIdOf: From>, + >::SourceHeaderChain: + SourceHeaderChain>, + >::BridgedChain: + bp_runtime::Chain, + ParaHash: From< + <>::BridgedChain as bp_runtime::Chain>::Hash, + >, + ::AccountId: + Into<<::RuntimeOrigin as OriginTrait>::AccountId>, + ::AccountId: From, + AccountIdOf: From, + >::InboundRelayer: From, + ::RuntimeCall: From> + + From> + + From>, + ::RuntimeCall: From>, +{ + helpers::relayed_incoming_message_works::< + Runtime, + AllPalletsWithoutSystem, + HrmpChannelOpener, + MPI, + >( + collator_session_key, + runtime_para_id, + sibling_parachain_id, + local_relay_chain_id, + construct_and_apply_extrinsic, + |relayer_id_at_this_chain, + relayer_id_at_bridged_chain, + message_destination, + message_nonce, + xcm| { + let para_header_number = 5; + let relay_header_number = 1; + + prepare_configuration(); + + // start with bridged relay chain block#0 + helpers::initialize_bridge_grandpa_pallet::( + test_data::initialization_data::(0), + ); + + // generate bridged relay chain finality, parachain heads and message proofs, + // to be submitted by relayer to this chain. + let ( + relay_chain_header, + grandpa_justification, + parachain_head, + parachain_heads, + para_heads_proof, + message_proof, + ) = test_data::from_parachain::make_complex_relayer_delivery_proofs::< + >::BridgedChain, + MB, + (), + >( + lane_id, + xcm.into(), + message_nonce, + message_destination, + para_header_number, + relay_header_number, + bridged_para_id, + ); + + let parachain_head_hash = parachain_head.hash(); + let relay_chain_header_hash = relay_chain_header.hash(); + let relay_chain_header_number = *relay_chain_header.number(); + vec![( + pallet_utility::Call::::batch_all { + calls: vec![ + pallet_bridge_grandpa::Call::::submit_finality_proof { + finality_target: Box::new(relay_chain_header), + justification: grandpa_justification, + }.into(), + pallet_bridge_parachains::Call::::submit_parachain_heads { + at_relay_block: (relay_chain_header_number, relay_chain_header_hash), + parachains: parachain_heads, + parachain_heads_proof: para_heads_proof, + }.into(), + pallet_bridge_messages::Call::::receive_messages_proof { + relayer_id_at_bridged_chain, + proof: message_proof, + messages_count: 1, + dispatch_weight: Weight::from_parts(1000000000, 0), + }.into(), + ], + }.into(), + Box::new(( + helpers::VerifySubmitGrandpaFinalityProofOutcome::::expect_best_header_hash(relay_chain_header_hash), + helpers::VerifySubmitParachainHeaderProofOutcome::::expect_best_header_hash(bridged_para_id, parachain_head_hash), + helpers::VerifySubmitMessagesProofOutcome::::expect_last_delivered_nonce(lane_id, 1), + helpers::VerifyRelayerRewarded::::expect_relayer_reward( + relayer_id_at_this_chain, + RewardsAccountParams::new( + lane_id, + bridged_chain_id, + RewardsAccountOwner::ThisChain, + ), + ), + )), + )] + }, + ); +} + +/// Estimates transaction fee for default message delivery transaction (batched with required +/// proofs) from bridged parachain. +pub fn can_calculate_fee_for_complex_message_delivery_transaction( + collator_session_key: CollatorSessionKeys, + compute_extrinsic_fee: fn(pallet_utility::Call::) -> u128, +) -> u128 +where + Runtime: frame_system::Config + + pallet_balances::Config + + pallet_session::Config + + pallet_xcm::Config + + parachain_info::Config + + pallet_collator_selection::Config + + cumulus_pallet_parachain_system::Config + + pallet_bridge_grandpa::Config + + pallet_bridge_parachains::Config + + pallet_bridge_messages::Config + + pallet_utility::Config, + GPI: 'static, + PPI: 'static, + MPI: 'static, + MB: MessageBridge, + ::BridgedChain: Send + Sync + 'static, + ::ThisChain: Send + Sync + 'static, + UnderlyingChainOf>: bp_runtime::Chain + Parachain, + ValidatorIdOf: From>, + <>::SourceHeaderChain as SourceHeaderChain>::MessagesProof: + From>, + >::BridgedChain: bp_runtime::Chain, + ParaHash: From<<>::BridgedChain as bp_runtime::Chain>::Hash>, + ::AccountId: + Into<<::RuntimeOrigin as OriginTrait>::AccountId>, + ::AccountId: From, + AccountIdOf: From, + >::InboundRelayer: From, + ::RuntimeCall: + From> + + From> + + From>, +{ + run_test::(collator_session_key, 1000, vec![], || { + // generate bridged relay chain finality, parachain heads and message proofs, + // to be submitted by relayer to this chain. + // + // we don't care about parameter values here, apart from the XCM message size. But we + // do not need to have a large message here, because we're charging for every byte of + // the message additionally + let ( + relay_chain_header, + grandpa_justification, + _, + parachain_heads, + para_heads_proof, + message_proof, + ) = test_data::from_parachain::make_complex_relayer_delivery_proofs::< + >::BridgedChain, + MB, + (), + >( + LaneId::default(), + vec![xcm::v3::Instruction::<()>::ClearOrigin; 1_024].into(), + 1, + X2(GlobalConsensus(Polkadot), Parachain(1_000)), + 1, + 5, + 1_000, + ); + + // generate batch call that provides finality for bridged relay and parachains + message + // proof + let batch = test_data::from_parachain::make_complex_relayer_delivery_batch::< + Runtime, + GPI, + PPI, + MPI, + >( + relay_chain_header, + grandpa_justification, + parachain_heads, + para_heads_proof, + message_proof, + Dave.public().into(), + ); + let estimated_fee = compute_extrinsic_fee(batch); + + log::error!( + target: "bridges::estimate", + "Estimate fee: {:?} for single message delivery for runtime: {:?}", + estimated_fee, + Runtime::Version::get(), + ); + + estimated_fee + }) +} + +/// Estimates transaction fee for default message confirmation transaction (batched with required +/// proofs) from bridged parachain. +pub fn can_calculate_fee_for_complex_message_confirmation_transaction( + collator_session_key: CollatorSessionKeys, + compute_extrinsic_fee: fn(pallet_utility::Call::) -> u128, +) -> u128 +where + Runtime: frame_system::Config + + pallet_balances::Config + + pallet_session::Config + + pallet_xcm::Config + + parachain_info::Config + + pallet_collator_selection::Config + + cumulus_pallet_parachain_system::Config + + pallet_bridge_grandpa::Config + + pallet_bridge_parachains::Config + + pallet_bridge_messages::Config + + pallet_utility::Config, + GPI: 'static, + PPI: 'static, + MPI: 'static, + MB: MessageBridge, + ::BridgedChain: Send + Sync + 'static, + ::ThisChain: Send + Sync + 'static, + <::ThisChain as bp_runtime::Chain>::AccountId: From, + UnderlyingChainOf>: bp_runtime::Chain + Parachain, + ValidatorIdOf: From>, + <>::SourceHeaderChain as SourceHeaderChain>::MessagesProof: + From>, + >::BridgedChain: bp_runtime::Chain, + ParaHash: From<<>::BridgedChain as bp_runtime::Chain>::Hash>, + ::AccountId: + Into<<::RuntimeOrigin as OriginTrait>::AccountId>, + ::AccountId: From, + AccountIdOf: From, + >::InboundRelayer: From, + <>::TargetHeaderChain as TargetHeaderChain< + XcmAsPlainPayload, + Runtime::AccountId, + >>::MessagesDeliveryProof: From>, + ::RuntimeCall: + From> + + From> + + From>, +{ + run_test::(collator_session_key, 1000, vec![], || { + // generate bridged relay chain finality, parachain heads and message proofs, + // to be submitted by relayer to this chain. + let unrewarded_relayers = UnrewardedRelayersState { + unrewarded_relayer_entries: 1, + total_messages: 1, + ..Default::default() + }; + let ( + relay_chain_header, + grandpa_justification, + _, + parachain_heads, + para_heads_proof, + message_delivery_proof, + ) = test_data::from_parachain::make_complex_relayer_confirmation_proofs::< + >::BridgedChain, + MB, + (), + >(LaneId::default(), 1, 5, 1_000, Alice.public().into(), unrewarded_relayers.clone()); + + // generate batch call that provides finality for bridged relay and parachains + message + // proof + let batch = test_data::from_parachain::make_complex_relayer_confirmation_batch::< + Runtime, + GPI, + PPI, + MPI, + >( + relay_chain_header, + grandpa_justification, + parachain_heads, + para_heads_proof, + message_delivery_proof, + unrewarded_relayers, + ); + let estimated_fee = compute_extrinsic_fee(batch); + + log::error!( + target: "bridges::estimate", + "Estimate fee: {:?} for single message confirmation for runtime: {:?}", + estimated_fee, + Runtime::Version::get(), + ); + + estimated_fee + }) +} diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs new file mode 100644 index 00000000000..192aa017fff --- /dev/null +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs @@ -0,0 +1,340 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +//! Module contains tests code, that is shared by all types of bridges + +use crate::test_cases::{run_test, RuntimeHelper}; + +use asset_test_utils::BasicParachainRuntime; +use bp_messages::{LaneId, MessageNonce}; +use bp_polkadot_core::parachains::{ParaHash, ParaId}; +use bp_relayers::RewardsAccountParams; +use frame_support::{ + assert_ok, + traits::{OnFinalize, OnInitialize, PalletInfoAccess}, +}; +use frame_system::pallet_prelude::BlockNumberFor; +use pallet_bridge_grandpa::{BridgedBlockHash, BridgedHeader}; +use parachains_common::AccountId; +use parachains_runtimes_test_utils::{ + mock_open_hrmp_channel, AccountIdOf, CollatorSessionKeys, ValidatorIdOf, +}; +use sp_core::Get; +use sp_keyring::AccountKeyring::*; +use sp_runtime::AccountId32; +use sp_std::marker::PhantomData; +use xcm::latest::prelude::*; + +#[impl_trait_for_tuples::impl_for_tuples(30)] +pub trait VerifyTransactionOutcome { + fn verify_outcome(&self); +} + +impl VerifyTransactionOutcome for Box { + fn verify_outcome(&self) { + VerifyTransactionOutcome::verify_outcome(&**self) + } +} + +/// Checks that the best finalized header hash in the bridge GRANDPA pallet equals to given one. +pub struct VerifySubmitGrandpaFinalityProofOutcome +where + Runtime: pallet_bridge_grandpa::Config, + GPI: 'static, +{ + expected_best_hash: BridgedBlockHash, +} + +impl VerifySubmitGrandpaFinalityProofOutcome +where + Runtime: pallet_bridge_grandpa::Config, + GPI: 'static, +{ + /// Expect given header hash to be the best after transaction. + pub fn expect_best_header_hash( + expected_best_hash: BridgedBlockHash, + ) -> Box { + Box::new(Self { expected_best_hash }) + } +} + +impl VerifyTransactionOutcome + for VerifySubmitGrandpaFinalityProofOutcome +where + Runtime: pallet_bridge_grandpa::Config, + GPI: 'static, +{ + fn verify_outcome(&self) { + assert_eq!( + pallet_bridge_grandpa::BestFinalized::::get().unwrap().1, + self.expected_best_hash + ); + assert!(pallet_bridge_grandpa::ImportedHeaders::::contains_key( + self.expected_best_hash + )); + } +} + +/// Checks that the best parachain header hash in the bridge parachains pallet equals to given one. +pub struct VerifySubmitParachainHeaderProofOutcome { + bridged_para_id: u32, + expected_best_hash: ParaHash, + _marker: PhantomData<(Runtime, PPI)>, +} + +impl VerifySubmitParachainHeaderProofOutcome +where + Runtime: pallet_bridge_parachains::Config, + PPI: 'static, +{ + /// Expect given header hash to be the best after transaction. + pub fn expect_best_header_hash( + bridged_para_id: u32, + expected_best_hash: ParaHash, + ) -> Box { + Box::new(Self { bridged_para_id, expected_best_hash, _marker: PhantomData }) + } +} + +impl VerifyTransactionOutcome + for VerifySubmitParachainHeaderProofOutcome +where + Runtime: pallet_bridge_parachains::Config, + PPI: 'static, +{ + fn verify_outcome(&self) { + assert_eq!( + pallet_bridge_parachains::ParasInfo::::get(ParaId(self.bridged_para_id)) + .map(|info| info.best_head_hash.head_hash), + Some(self.expected_best_hash), + ); + } +} + +/// Checks that the latest delivered nonce in the bridge messages pallet equals to given one. +pub struct VerifySubmitMessagesProofOutcome { + lane: LaneId, + expected_nonce: MessageNonce, + _marker: PhantomData<(Runtime, MPI)>, +} + +impl VerifySubmitMessagesProofOutcome +where + Runtime: pallet_bridge_messages::Config, + MPI: 'static, +{ + /// Expect given delivered nonce to be the latest after transaction. + pub fn expect_last_delivered_nonce( + lane: LaneId, + expected_nonce: MessageNonce, + ) -> Box { + Box::new(Self { lane, expected_nonce, _marker: PhantomData }) + } +} + +impl VerifyTransactionOutcome for VerifySubmitMessagesProofOutcome +where + Runtime: pallet_bridge_messages::Config, + MPI: 'static, +{ + fn verify_outcome(&self) { + assert_eq!( + pallet_bridge_messages::InboundLanes::::get(self.lane) + .last_delivered_nonce(), + self.expected_nonce, + ); + } +} + +/// Verifies that relayer is rewarded at this chain. +pub struct VerifyRelayerRewarded { + relayer: Runtime::AccountId, + reward_params: RewardsAccountParams, +} + +impl VerifyRelayerRewarded +where + Runtime: pallet_bridge_relayers::Config, +{ + /// Expect given delivered nonce to be the latest after transaction. + pub fn expect_relayer_reward( + relayer: Runtime::AccountId, + reward_params: RewardsAccountParams, + ) -> Box { + Box::new(Self { relayer, reward_params }) + } +} + +impl VerifyTransactionOutcome for VerifyRelayerRewarded +where + Runtime: pallet_bridge_relayers::Config, +{ + fn verify_outcome(&self) { + assert!(pallet_bridge_relayers::RelayerRewards::::get( + &self.relayer, + &self.reward_params, + ) + .is_some()); + } +} + +/// Initialize bridge GRANDPA pallet. +pub(crate) fn initialize_bridge_grandpa_pallet( + init_data: bp_header_chain::InitializationData>, +) where + Runtime: pallet_bridge_grandpa::Config, +{ + pallet_bridge_grandpa::Pallet::::initialize( + RuntimeHelper::::root_origin(), + init_data, + ) + .unwrap(); +} + +/// Runtime calls and their verifiers. +pub type CallsAndVerifiers = + Vec<(::RuntimeCall, Box)>; + +/// Test-case makes sure that Runtime can dispatch XCM messages submitted by relayer, +/// with proofs (finality, message) independently submitted. +pub fn relayed_incoming_message_works( + collator_session_key: CollatorSessionKeys, + runtime_para_id: u32, + sibling_parachain_id: u32, + local_relay_chain_id: NetworkId, + construct_and_apply_extrinsic: fn( + sp_keyring::AccountKeyring, + ::RuntimeCall, + ) -> sp_runtime::DispatchOutcome, + prepare_message_proof_import: impl FnOnce( + Runtime::AccountId, + Runtime::InboundRelayer, + InteriorMultiLocation, + MessageNonce, + Xcm<()>, + ) -> CallsAndVerifiers, +) where + Runtime: BasicParachainRuntime + + cumulus_pallet_xcmp_queue::Config + + pallet_bridge_messages::Config, + AllPalletsWithoutSystem: + OnInitialize> + OnFinalize>, + HrmpChannelOpener: frame_support::inherent::ProvideInherent< + Call = cumulus_pallet_parachain_system::Call, + >, + MPI: 'static, + ValidatorIdOf: From>, + AccountIdOf: From + From, + >::InboundRelayer: From, +{ + let relayer_at_target = Bob; + let relayer_id_on_target: AccountId32 = relayer_at_target.public().into(); + let relayer_at_source = Dave; + let relayer_id_on_source: AccountId32 = relayer_at_source.public().into(); + + assert_ne!(runtime_para_id, sibling_parachain_id); + + run_test::( + collator_session_key, + runtime_para_id, + vec![( + relayer_id_on_target.clone().into(), + Runtime::ExistentialDeposit::get() * 100000u32.into(), + )], + || { + let mut alice = [0u8; 32]; + alice[0] = 1; + + let included_head = RuntimeHelper::::run_to_block( + 2, + AccountId::from(alice).into(), + ); + mock_open_hrmp_channel::( + runtime_para_id.into(), + sibling_parachain_id.into(), + included_head, + &alice, + ); + + // set up relayer details and proofs + + let message_destination = + X2(GlobalConsensus(local_relay_chain_id), Parachain(sibling_parachain_id)); + // some random numbers (checked by test) + let message_nonce = 1; + + let xcm = vec![xcm::v3::Instruction::<()>::ClearOrigin; 42]; + let expected_dispatch = xcm::latest::Xcm::<()>({ + let mut expected_instructions = xcm.clone(); + // dispatch prepends bridge pallet instance + expected_instructions.insert( + 0, + DescendOrigin(X1(PalletInstance( + as PalletInfoAccess>::index() + as u8, + ))), + ); + expected_instructions + }); + + execute_and_verify_calls::( + relayer_at_target, + construct_and_apply_extrinsic, + prepare_message_proof_import( + relayer_id_on_target.clone().into(), + relayer_id_on_source.clone().into(), + message_destination, + message_nonce, + xcm.clone().into(), + ), + ); + + // verify that imported XCM contains original message + let imported_xcm = + RuntimeHelper::>::take_xcm( + sibling_parachain_id.into(), + ) + .unwrap(); + let dispatched = xcm::latest::Xcm::<()>::try_from(imported_xcm).unwrap(); + let mut dispatched_clone = dispatched.clone(); + for (idx, expected_instr) in expected_dispatch.0.iter().enumerate() { + assert_eq!(expected_instr, &dispatched.0[idx]); + assert_eq!(expected_instr, &dispatched_clone.0.remove(0)); + } + match dispatched_clone.0.len() { + 0 => (), + 1 => assert!(matches!(dispatched_clone.0[0], SetTopic(_))), + count => assert!(false, "Unexpected messages count: {:?}", count), + } + }, + ) +} + +/// Execute every call and verify its outcome. +fn execute_and_verify_calls( + submitter: sp_keyring::AccountKeyring, + construct_and_apply_extrinsic: fn( + sp_keyring::AccountKeyring, + ::RuntimeCall, + ) -> sp_runtime::DispatchOutcome, + calls_and_verifiers: CallsAndVerifiers, +) { + for (call, verifier) in calls_and_verifiers { + let dispatch_outcome = construct_and_apply_extrinsic(submitter, call); + assert_ok!(dispatch_outcome); + verifier.verify_outcome(); + } +} diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/mod.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/mod.rs new file mode 100644 index 00000000000..cc347ecf30d --- /dev/null +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/mod.rs @@ -0,0 +1,485 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +//! Module contains predefined test-case scenarios for `Runtime` with bridging capabilities. +//! +//! This file contains tests, suitable for all bridge runtimes. See `from_parachain` and +//! `from_grandpa_chain` submodules for tests, that are specific to the bridged chain type. + +pub mod from_grandpa_chain; +pub mod from_parachain; + +pub(crate) mod helpers; + +use crate::test_data; + +use asset_test_utils::BasicParachainRuntime; +use bp_messages::{ + target_chain::{DispatchMessage, DispatchMessageData, MessageDispatch}, + LaneId, MessageKey, OutboundLaneData, +}; +use bridge_runtime_common::messages_xcm_extension::{ + XcmAsPlainPayload, XcmBlobMessageDispatchResult, +}; +use codec::Encode; +use frame_support::{ + assert_ok, + traits::{Get, OnFinalize, OnInitialize, OriginTrait}, +}; +use frame_system::pallet_prelude::BlockNumberFor; +use parachains_common::AccountId; +use parachains_runtimes_test_utils::{ + mock_open_hrmp_channel, AccountIdOf, BalanceOf, CollatorSessionKeys, ExtBuilder, ValidatorIdOf, + XcmReceivedFrom, +}; +use sp_runtime::{traits::Zero, AccountId32}; +use xcm::{latest::prelude::*, AlwaysLatest}; +use xcm_builder::DispatchBlobError; +use xcm_executor::{ + traits::{TransactAsset, WeightBounds}, + XcmExecutor, +}; + +// Re-export test_case from assets +pub use asset_test_utils::include_teleports_for_native_asset_works; + +pub type RuntimeHelper = + parachains_runtimes_test_utils::RuntimeHelper; + +// Re-export test_case from `parachains-runtimes-test-utils` +pub use parachains_runtimes_test_utils::test_cases::change_storage_constant_by_governance_works; + +/// Prepare default runtime storage and run test within this context. +pub fn run_test( + collator_session_key: CollatorSessionKeys, + runtime_para_id: u32, + balances: Vec<(Runtime::AccountId, Runtime::Balance)>, + test: impl FnOnce() -> T, +) -> T +where + Runtime: BasicParachainRuntime, + ValidatorIdOf: From>, +{ + ExtBuilder::::default() + .with_collators(collator_session_key.collators()) + .with_session_keys(collator_session_key.session_keys()) + .with_safe_xcm_version(XCM_VERSION) + .with_para_id(runtime_para_id.into()) + .with_balances(balances) + .with_tracing() + .build() + .execute_with(|| test()) +} + +/// Test-case makes sure that `Runtime` can process bridging initialize via governance-like call +pub fn initialize_bridge_by_governance_works( + collator_session_key: CollatorSessionKeys, + runtime_para_id: u32, + runtime_call_encode: Box< + dyn Fn(pallet_bridge_grandpa::Call) -> Vec, + >, +) where + Runtime: BasicParachainRuntime + pallet_bridge_grandpa::Config, + GrandpaPalletInstance: 'static, + ValidatorIdOf: From>, +{ + run_test::(collator_session_key, runtime_para_id, vec![], || { + // check mode before + assert_eq!( + pallet_bridge_grandpa::PalletOperatingMode::::try_get(), + Err(()) + ); + + // encode `initialize` call + let initialize_call = runtime_call_encode(pallet_bridge_grandpa::Call::< + Runtime, + GrandpaPalletInstance, + >::initialize { + init_data: test_data::initialization_data::(12345), + }); + + // overestimate - check weight for `pallet_bridge_grandpa::Pallet::initialize()` call + let require_weight_at_most = + ::DbWeight::get().reads_writes(7, 7); + + // execute XCM with Transacts to `initialize bridge` as governance does + assert_ok!(RuntimeHelper::::execute_as_governance( + initialize_call, + require_weight_at_most + ) + .ensure_complete()); + + // check mode after + assert_eq!( + pallet_bridge_grandpa::PalletOperatingMode::::try_get(), + Ok(bp_runtime::BasicOperatingMode::Normal) + ); + }) +} + +/// Test-case makes sure that `Runtime` can handle xcm `ExportMessage`: +/// Checks if received XCM messages is correctly added to the message outbound queue for delivery. +/// For SystemParachains we expect unpaid execution. +pub fn handle_export_message_from_system_parachain_to_outbound_queue_works< + Runtime, + XcmConfig, + MessagesPalletInstance, +>( + collator_session_key: CollatorSessionKeys, + runtime_para_id: u32, + sibling_parachain_id: u32, + unwrap_pallet_bridge_messages_event: Box< + dyn Fn(Vec) -> Option>, + >, + export_message_instruction: fn() -> Instruction, + expected_lane_id: LaneId, + existential_deposit: Option, + maybe_paid_export_message: Option, + prepare_configuration: impl Fn(), +) where + Runtime: BasicParachainRuntime + pallet_bridge_messages::Config, + XcmConfig: xcm_executor::Config, + MessagesPalletInstance: 'static, + ValidatorIdOf: From>, +{ + assert_ne!(runtime_para_id, sibling_parachain_id); + let sibling_parachain_location = MultiLocation::new(1, Parachain(sibling_parachain_id)); + + run_test::(collator_session_key, runtime_para_id, vec![], || { + prepare_configuration(); + + // check queue before + assert_eq!( + pallet_bridge_messages::OutboundLanes::::try_get( + expected_lane_id + ), + Err(()) + ); + + // prepare `ExportMessage` + let xcm = if let Some(fee) = maybe_paid_export_message { + // deposit ED to origin (if needed) + if let Some(ed) = existential_deposit { + XcmConfig::AssetTransactor::deposit_asset( + &ed, + &sibling_parachain_location, + Some(&XcmContext::with_message_id([0; 32])), + ) + .expect("deposited ed"); + } + // deposit fee to origin + XcmConfig::AssetTransactor::deposit_asset( + &fee, + &sibling_parachain_location, + Some(&XcmContext::with_message_id([0; 32])), + ) + .expect("deposited fee"); + + Xcm(vec![ + WithdrawAsset(MultiAssets::from(vec![fee.clone()])), + BuyExecution { fees: fee, weight_limit: Unlimited }, + export_message_instruction(), + ]) + } else { + Xcm(vec![ + UnpaidExecution { weight_limit: Unlimited, check_origin: None }, + export_message_instruction(), + ]) + }; + + // execute XCM + let hash = xcm.using_encoded(sp_io::hashing::blake2_256); + assert_ok!(XcmExecutor::::execute_xcm( + sibling_parachain_location, + xcm, + hash, + RuntimeHelper::::xcm_max_weight(XcmReceivedFrom::Sibling), + ) + .ensure_complete()); + + // check queue after + assert_eq!( + pallet_bridge_messages::OutboundLanes::::try_get( + expected_lane_id + ), + Ok(OutboundLaneData { + oldest_unpruned_nonce: 1, + latest_received_nonce: 0, + latest_generated_nonce: 1, + }) + ); + + // check events + let mut events = >::events() + .into_iter() + .filter_map(|e| unwrap_pallet_bridge_messages_event(e.event.encode())); + assert!(events.any(|e| matches!(e, pallet_bridge_messages::Event::MessageAccepted { .. }))); + }) +} + +/// Test-case makes sure that Runtime can route XCM messages received in inbound queue, +/// We just test here `MessageDispatch` configuration. +/// We expect that runtime can route messages: +/// 1. to Parent (relay chain) +/// 2. to Sibling parachain +pub fn message_dispatch_routing_works< + Runtime, + AllPalletsWithoutSystem, + XcmConfig, + HrmpChannelOpener, + MessagesPalletInstance, + RuntimeNetwork, + BridgedNetwork, + NetworkDistanceAsParentCount, +>( + collator_session_key: CollatorSessionKeys, + runtime_para_id: u32, + sibling_parachain_id: u32, + unwrap_cumulus_pallet_parachain_system_event: Box< + dyn Fn(Vec) -> Option>, + >, + unwrap_cumulus_pallet_xcmp_queue_event: Box< + dyn Fn(Vec) -> Option>, + >, + expected_lane_id: LaneId, + prepare_configuration: impl Fn(), +) where + Runtime: BasicParachainRuntime + + cumulus_pallet_xcmp_queue::Config + + pallet_bridge_messages::Config, + AllPalletsWithoutSystem: + OnInitialize> + OnFinalize>, + ::AccountId: + Into<<::RuntimeOrigin as OriginTrait>::AccountId>, + XcmConfig: xcm_executor::Config, + MessagesPalletInstance: 'static, + ValidatorIdOf: From>, + ::AccountId: From, + HrmpChannelOpener: frame_support::inherent::ProvideInherent< + Call = cumulus_pallet_parachain_system::Call, + >, + RuntimeNetwork: Get, + BridgedNetwork: Get, + NetworkDistanceAsParentCount: Get, +{ + struct NetworkWithParentCount(core::marker::PhantomData<(N, C)>); + impl, C: Get> Get for NetworkWithParentCount { + fn get() -> MultiLocation { + MultiLocation { parents: C::get(), interior: X1(GlobalConsensus(N::get())) } + } + } + + assert_ne!(runtime_para_id, sibling_parachain_id); + + run_test::(collator_session_key, runtime_para_id, vec![], || { + prepare_configuration(); + + let mut alice = [0u8; 32]; + alice[0] = 1; + + let included_head = RuntimeHelper::::run_to_block( + 2, + AccountId::from(alice).into(), + ); + // 1. this message is sent from other global consensus with destination of this Runtime + // relay chain (UMP) + let bridging_message = test_data::simulate_message_exporter_on_bridged_chain::< + BridgedNetwork, + NetworkWithParentCount, + AlwaysLatest, + >((RuntimeNetwork::get(), Here)); + let result = <>::MessageDispatch>::dispatch( + test_data::dispatch_message(expected_lane_id, 1, bridging_message) + ); + assert_eq!( + format!("{:?}", result.dispatch_level_result), + format!("{:?}", XcmBlobMessageDispatchResult::Dispatched) + ); + + // check events - UpwardMessageSent + let mut events = >::events() + .into_iter() + .filter_map(|e| unwrap_cumulus_pallet_parachain_system_event(e.event.encode())); + assert!(events.any(|e| matches!( + e, + cumulus_pallet_parachain_system::Event::UpwardMessageSent { .. } + ))); + + // 2. this message is sent from other global consensus with destination of this Runtime + // sibling parachain (HRMP) + let bridging_message = test_data::simulate_message_exporter_on_bridged_chain::< + BridgedNetwork, + NetworkWithParentCount, + AlwaysLatest, + >((RuntimeNetwork::get(), X1(Parachain(sibling_parachain_id)))); + + // 2.1. WITHOUT opened hrmp channel -> RoutingError + let result = + <>::MessageDispatch>::dispatch( + DispatchMessage { + key: MessageKey { lane_id: expected_lane_id, nonce: 1 }, + data: DispatchMessageData { payload: Ok(bridging_message.clone()) }, + } + ); + assert_eq!( + format!("{:?}", result.dispatch_level_result), + format!( + "{:?}", + XcmBlobMessageDispatchResult::NotDispatched(Some(DispatchBlobError::RoutingError)) + ) + ); + + // check events - no XcmpMessageSent + assert_eq!( + >::events() + .into_iter() + .filter_map(|e| unwrap_cumulus_pallet_xcmp_queue_event(e.event.encode())) + .count(), + 0 + ); + + // 2.1. WITH hrmp channel -> Ok + mock_open_hrmp_channel::( + runtime_para_id.into(), + sibling_parachain_id.into(), + included_head, + &alice, + ); + let result = <>::MessageDispatch>::dispatch( + DispatchMessage { + key: MessageKey { lane_id: expected_lane_id, nonce: 1 }, + data: DispatchMessageData { payload: Ok(bridging_message) }, + } + ); + assert_eq!( + format!("{:?}", result.dispatch_level_result), + format!("{:?}", XcmBlobMessageDispatchResult::Dispatched) + ); + + // check events - XcmpMessageSent + let mut events = >::events() + .into_iter() + .filter_map(|e| unwrap_cumulus_pallet_xcmp_queue_event(e.event.encode())); + assert!( + events.any(|e| matches!(e, cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. })) + ); + }) +} + +/// Estimates XCM execution fee for paid `ExportMessage` processing. +pub fn can_calculate_weight_for_paid_export_message_with_reserve_transfer< + Runtime, + XcmConfig, + WeightToFee, +>() -> u128 +where + Runtime: frame_system::Config + pallet_balances::Config, + XcmConfig: xcm_executor::Config, + WeightToFee: frame_support::weights::WeightToFee>, + ::Balance: From + Into, +{ + // data here are not relevant for weighing + let mut xcm = Xcm(vec![ + WithdrawAsset(MultiAssets::from(vec![MultiAsset { + id: Concrete(MultiLocation { parents: 1, interior: Here }), + fun: Fungible(34333299), + }])), + BuyExecution { + fees: MultiAsset { + id: Concrete(MultiLocation { parents: 1, interior: Here }), + fun: Fungible(34333299), + }, + weight_limit: Unlimited, + }, + ExportMessage { + network: Polkadot, + destination: X1(Parachain(1000)), + xcm: Xcm(vec![ + ReserveAssetDeposited(MultiAssets::from(vec![MultiAsset { + id: Concrete(MultiLocation { + parents: 2, + interior: X1(GlobalConsensus(Kusama)), + }), + fun: Fungible(1000000000000), + }])), + ClearOrigin, + BuyExecution { + fees: MultiAsset { + id: Concrete(MultiLocation { + parents: 2, + interior: X1(GlobalConsensus(Kusama)), + }), + fun: Fungible(1000000000000), + }, + weight_limit: Unlimited, + }, + DepositAsset { + assets: Wild(AllCounted(1)), + beneficiary: MultiLocation { + parents: 0, + interior: X1(xcm::latest::prelude::AccountId32 { + network: None, + id: [ + 212, 53, 147, 199, 21, 253, 211, 28, 97, 20, 26, 189, 4, 169, 159, + 214, 130, 44, 133, 88, 133, 76, 205, 227, 154, 86, 132, 231, 165, + 109, 162, 125, + ], + }), + }, + }, + SetTopic([ + 116, 82, 194, 132, 171, 114, 217, 165, 23, 37, 161, 177, 165, 179, 247, 114, + 137, 101, 147, 70, 28, 157, 168, 32, 154, 63, 74, 228, 152, 180, 5, 63, + ]), + ]), + }, + DepositAsset { + assets: Wild(All), + beneficiary: MultiLocation { parents: 1, interior: X1(Parachain(1000)) }, + }, + SetTopic([ + 36, 224, 250, 165, 82, 195, 67, 110, 160, 170, 140, 87, 217, 62, 201, 164, 42, 98, 219, + 157, 124, 105, 248, 25, 131, 218, 199, 36, 109, 173, 100, 122, + ]), + ]); + + // get weight + let weight = XcmConfig::Weigher::weight(&mut xcm); + assert_ok!(weight); + let weight = weight.unwrap(); + // check if sane + let max_expected = Runtime::BlockWeights::get().max_block / 10; + assert!( + weight.all_lte(max_expected), + "calculated weight: {:?}, max_expected: {:?}", + weight, + max_expected + ); + + // check fee, should not be 0 + let estimated_fee = WeightToFee::weight_to_fee(&weight); + assert!(estimated_fee > BalanceOf::::zero()); + + sp_tracing::try_init_simple(); + log::error!( + target: "bridges::estimate", + "Estimate fee: {:?} for `ExportMessage` for runtime: {:?}", + estimated_fee, + Runtime::Version::get(), + ); + + estimated_fee.into() +} diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_grandpa_chain.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_grandpa_chain.rs new file mode 100644 index 00000000000..017ec0fd540 --- /dev/null +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_grandpa_chain.rs @@ -0,0 +1,244 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +//! Generating test data for bridges with remote GRANDPA chains. + +use crate::test_data::prepare_inbound_xcm; + +use bp_messages::{ + source_chain::TargetHeaderChain, target_chain::SourceHeaderChain, LaneId, MessageNonce, + UnrewardedRelayersState, +}; +use bp_runtime::{AccountIdOf, BlockNumberOf, HeaderOf, StorageProofSize, UnderlyingChainOf}; +use bp_test_utils::make_default_justification; +use bridge_runtime_common::{ + messages::{ + source::FromBridgedChainMessagesDeliveryProof, target::FromBridgedChainMessagesProof, + BridgedChain as MessageBridgedChain, MessageBridge, ThisChain as MessageThisChain, + }, + messages_generation::{ + encode_all_messages, encode_lane_data, prepare_message_delivery_storage_proof, + prepare_messages_storage_proof, + }, + messages_xcm_extension::XcmAsPlainPayload, +}; +use codec::Encode; +use pallet_bridge_grandpa::{BridgedChain, BridgedHeader}; +use sp_runtime::traits::Header as HeaderT; +use xcm::latest::prelude::*; + +use bp_header_chain::{justification::GrandpaJustification, ChainWithGrandpa}; +use bp_messages::{DeliveredMessages, InboundLaneData, UnrewardedRelayer}; +use bp_runtime::HashOf; +use sp_runtime::DigestItem; + +/// Prepare a batch call with bridged GRANDPA finality and message proof. +pub fn make_complex_relayer_delivery_batch( + bridged_header: BridgedHeader, + bridged_justification: GrandpaJustification>, + message_proof: FromBridgedChainMessagesProof>>, + relayer_id_at_bridged_chain: AccountIdOf>, +) -> pallet_utility::Call +where + Runtime: pallet_bridge_grandpa::Config + + pallet_bridge_messages::Config< + MPI, + InboundPayload = XcmAsPlainPayload, + InboundRelayer = AccountIdOf>, + > + pallet_utility::Config, + GPI: 'static, + MPI: 'static, + >::SourceHeaderChain: SourceHeaderChain< + MessagesProof = FromBridgedChainMessagesProof>>, + >, + ::RuntimeCall: From> + + From>, +{ + let submit_grandpa = pallet_bridge_grandpa::Call::::submit_finality_proof { + finality_target: Box::new(bridged_header), + justification: bridged_justification, + }; + let submit_message = pallet_bridge_messages::Call::::receive_messages_proof { + relayer_id_at_bridged_chain, + proof: message_proof, + messages_count: 1, + dispatch_weight: Weight::from_parts(1000000000, 0), + }; + pallet_utility::Call::::batch_all { + calls: vec![submit_grandpa.into(), submit_message.into()], + } +} + +/// Prepare a batch call with bridged GRANDPA finality and message delivery proof. +pub fn make_complex_relayer_confirmation_batch( + bridged_header: BridgedHeader, + bridged_justification: GrandpaJustification>, + message_delivery_proof: FromBridgedChainMessagesDeliveryProof< + HashOf>, + >, + relayers_state: UnrewardedRelayersState, +) -> pallet_utility::Call +where + Runtime: pallet_bridge_grandpa::Config + + pallet_bridge_messages::Config + + pallet_utility::Config, + GPI: 'static, + MPI: 'static, + >::TargetHeaderChain: TargetHeaderChain< + XcmAsPlainPayload, + Runtime::AccountId, + MessagesDeliveryProof = FromBridgedChainMessagesDeliveryProof< + HashOf>, + >, + >, + ::RuntimeCall: From> + + From>, +{ + let submit_grandpa = pallet_bridge_grandpa::Call::::submit_finality_proof { + finality_target: Box::new(bridged_header), + justification: bridged_justification, + }; + let submit_message_delivery_proof = + pallet_bridge_messages::Call::::receive_messages_delivery_proof { + proof: message_delivery_proof, + relayers_state, + }; + pallet_utility::Call::::batch_all { + calls: vec![submit_grandpa.into(), submit_message_delivery_proof.into()], + } +} + +/// Prepare storage proofs of messages, stored at the (bridged) source GRANDPA chain. +pub fn make_complex_relayer_delivery_proofs( + lane_id: LaneId, + xcm_message: Xcm, + message_nonce: MessageNonce, + message_destination: Junctions, + header_number: BlockNumberOf>, +) -> ( + HeaderOf>, + GrandpaJustification>>, + FromBridgedChainMessagesProof>>, +) +where + MB: MessageBridge, + MessageBridgedChain: Send + Sync + 'static, + UnderlyingChainOf>: ChainWithGrandpa, +{ + let message_payload = prepare_inbound_xcm(xcm_message, message_destination); + let message_size = StorageProofSize::Minimal(message_payload.len() as u32); + // prepare para storage proof containing message + let (state_root, storage_proof) = prepare_messages_storage_proof::( + lane_id, + message_nonce..=message_nonce, + None, + message_size, + message_payload, + encode_all_messages, + encode_lane_data, + ); + + let (header, justification) = make_complex_bridged_grandpa_header_proof::< + MessageBridgedChain, + >(state_root, header_number); + + let message_proof = FromBridgedChainMessagesProof { + bridged_header_hash: header.hash(), + storage_proof, + lane: lane_id, + nonces_start: message_nonce, + nonces_end: message_nonce, + }; + + (header, justification, message_proof) +} + +/// Prepare storage proofs of message confirmations, stored at the (bridged) target GRANDPA chain. +pub fn make_complex_relayer_confirmation_proofs( + lane_id: LaneId, + header_number: BlockNumberOf>, + relayer_id_at_this_chain: AccountIdOf>, + relayers_state: UnrewardedRelayersState, +) -> ( + HeaderOf>, + GrandpaJustification>>, + FromBridgedChainMessagesDeliveryProof>>, +) +where + MB: MessageBridge, + MessageBridgedChain: Send + Sync + 'static, + MessageThisChain: Send + Sync + 'static, + UnderlyingChainOf>: ChainWithGrandpa, +{ + // prepare storage proof containing message delivery proof + let (state_root, storage_proof) = prepare_message_delivery_storage_proof::( + lane_id, + InboundLaneData { + relayers: vec![ + UnrewardedRelayer { + relayer: relayer_id_at_this_chain, + messages: DeliveredMessages::new(1) + }; + relayers_state.unrewarded_relayer_entries as usize + ] + .into(), + last_confirmed_nonce: 1, + }, + StorageProofSize::Minimal(0), + ); + + let (header, justification) = + make_complex_bridged_grandpa_header_proof::(state_root, header_number); + + let message_delivery_proof = FromBridgedChainMessagesDeliveryProof { + bridged_header_hash: header.hash(), + storage_proof, + lane: lane_id, + }; + + (header, justification, message_delivery_proof) +} + +/// Make bridged GRANDPA chain header with given state root. +pub fn make_complex_bridged_grandpa_header_proof( + state_root: HashOf, + header_number: BlockNumberOf, +) -> (HeaderOf, GrandpaJustification>) +where + BridgedChain: ChainWithGrandpa, +{ + let mut header = bp_test_utils::test_header_with_root::>( + header_number.into(), + state_root.into(), + ); + + // to compute proper cost of GRANDPA call, let's add some dummy bytes to header, so that the + // `submit_finality_proof` call size would be close to maximal expected (and refundable) + let extra_bytes_required = maximal_expected_submit_finality_proof_call_size::() + .saturating_sub(header.encoded_size()); + header.digest_mut().push(DigestItem::Other(vec![42; extra_bytes_required])); + + let justification = make_default_justification(&header); + (header, justification) +} + +/// Maximal expected `submit_finality_proof` call size. +pub fn maximal_expected_submit_finality_proof_call_size() -> usize { + bp_header_chain::max_expected_submit_finality_proof_arguments_size::( + false, + BridgedChain::MAX_AUTHORITIES_COUNT * 2 / 3 + 1, + ) as usize +} diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_parachain.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_parachain.rs new file mode 100644 index 00000000000..7ac10aa9e73 --- /dev/null +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_parachain.rs @@ -0,0 +1,326 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +//! Generating test data for bridges with remote parachains. + +use super::{from_grandpa_chain::make_complex_bridged_grandpa_header_proof, prepare_inbound_xcm}; + +use bp_messages::{ + source_chain::TargetHeaderChain, target_chain::SourceHeaderChain, LaneId, + UnrewardedRelayersState, Weight, +}; +use bp_runtime::{BlockNumberOf, HeaderOf, Parachain, StorageProofSize, UnderlyingChainOf}; +use bp_test_utils::prepare_parachain_heads_proof; +use bridge_runtime_common::{ + messages::{ + source::FromBridgedChainMessagesDeliveryProof, target::FromBridgedChainMessagesProof, + BridgedChain as MessageBridgedChain, MessageBridge, + }, + messages_generation::{ + encode_all_messages, encode_lane_data, prepare_message_delivery_storage_proof, + prepare_messages_storage_proof, + }, + messages_xcm_extension::XcmAsPlainPayload, +}; +use codec::Encode; +use pallet_bridge_grandpa::BridgedHeader; +use pallet_bridge_parachains::{RelayBlockHash, RelayBlockNumber}; +use sp_runtime::{traits::Header as HeaderT, AccountId32}; +use xcm::latest::prelude::*; + +use bp_header_chain::{justification::GrandpaJustification, ChainWithGrandpa}; +use bp_messages::{DeliveredMessages, InboundLaneData, MessageNonce, UnrewardedRelayer}; +use bp_polkadot_core::parachains::{ParaHash, ParaHead, ParaHeadsProof, ParaId}; +use sp_runtime::SaturatedConversion; + +/// Prepare a batch call with relay finality proof, parachain head proof and message proof. +pub fn make_complex_relayer_delivery_batch( + relay_chain_header: BridgedHeader, + grandpa_justification: GrandpaJustification>, + parachain_heads: Vec<(ParaId, ParaHash)>, + para_heads_proof: ParaHeadsProof, + message_proof: FromBridgedChainMessagesProof, + relayer_id_at_bridged_chain: AccountId32, +) -> pallet_utility::Call where + Runtime:pallet_bridge_grandpa::Config + + pallet_bridge_parachains::Config + + pallet_bridge_messages::Config + + pallet_utility::Config, + GPI: 'static, + PPI: 'static, + MPI: 'static, + ParaHash: From<<>::BridgedChain as bp_runtime::Chain>::Hash>, + <>::BridgedChain as bp_runtime::Chain>::Hash: From, + <>::SourceHeaderChain as SourceHeaderChain>::MessagesProof: + From>, + >::InboundRelayer: From, + ::RuntimeCall: + From> + + From> + + From>, +{ + let relay_chain_header_hash = relay_chain_header.hash(); + let relay_chain_header_number = *relay_chain_header.number(); + let submit_grandpa = pallet_bridge_grandpa::Call::::submit_finality_proof { + finality_target: Box::new(relay_chain_header), + justification: grandpa_justification, + }; + let submit_para_head = pallet_bridge_parachains::Call::::submit_parachain_heads { + at_relay_block: ( + relay_chain_header_number.saturated_into(), + relay_chain_header_hash.into(), + ), + parachains: parachain_heads, + parachain_heads_proof: para_heads_proof, + }; + let submit_message = pallet_bridge_messages::Call::::receive_messages_proof { + relayer_id_at_bridged_chain: relayer_id_at_bridged_chain.into(), + proof: message_proof.into(), + messages_count: 1, + dispatch_weight: Weight::from_parts(1000000000, 0), + }; + pallet_utility::Call::::batch_all { + calls: vec![submit_grandpa.into(), submit_para_head.into(), submit_message.into()], + } +} + +/// Prepare a batch call with relay finality proof, parachain head proof and message delivery +/// proof. +pub fn make_complex_relayer_confirmation_batch( + relay_chain_header: BridgedHeader, + grandpa_justification: GrandpaJustification>, + parachain_heads: Vec<(ParaId, ParaHash)>, + para_heads_proof: ParaHeadsProof, + message_delivery_proof: FromBridgedChainMessagesDeliveryProof, + relayers_state: UnrewardedRelayersState, +) -> pallet_utility::Call +where + Runtime: pallet_bridge_grandpa::Config + + pallet_bridge_parachains::Config + + pallet_bridge_messages::Config + + pallet_utility::Config, + GPI: 'static, + PPI: 'static, + MPI: 'static, + >::BridgedChain: + bp_runtime::Chain + ChainWithGrandpa, + <>::TargetHeaderChain as TargetHeaderChain< + XcmAsPlainPayload, + Runtime::AccountId, + >>::MessagesDeliveryProof: From>, + ::RuntimeCall: From> + + From> + + From>, +{ + let relay_chain_header_hash = relay_chain_header.hash(); + let relay_chain_header_number = *relay_chain_header.number(); + let submit_grandpa = pallet_bridge_grandpa::Call::::submit_finality_proof { + finality_target: Box::new(relay_chain_header), + justification: grandpa_justification, + }; + let submit_para_head = pallet_bridge_parachains::Call::::submit_parachain_heads { + at_relay_block: ( + relay_chain_header_number.saturated_into(), + relay_chain_header_hash.into(), + ), + parachains: parachain_heads, + parachain_heads_proof: para_heads_proof, + }; + let submit_message_delivery_proof = + pallet_bridge_messages::Call::::receive_messages_delivery_proof { + proof: message_delivery_proof.into(), + relayers_state, + }; + pallet_utility::Call::::batch_all { + calls: vec![ + submit_grandpa.into(), + submit_para_head.into(), + submit_message_delivery_proof.into(), + ], + } +} + +/// Prepare storage proofs of messages, stored at the source chain. +pub fn make_complex_relayer_delivery_proofs( + lane_id: LaneId, + xcm_message: Xcm, + message_nonce: MessageNonce, + message_destination: Junctions, + para_header_number: u32, + relay_header_number: u32, + bridged_para_id: u32, +) -> ( + HeaderOf, + GrandpaJustification>, + ParaHead, + Vec<(ParaId, ParaHash)>, + ParaHeadsProof, + FromBridgedChainMessagesProof, +) +where + BridgedRelayChain: + bp_runtime::Chain + ChainWithGrandpa, + MB: MessageBridge, + ::BridgedChain: Send + Sync + 'static, + ::ThisChain: Send + Sync + 'static, + UnderlyingChainOf>: bp_runtime::Chain + Parachain, +{ + let message_payload = prepare_inbound_xcm(xcm_message, message_destination); + let message_size = StorageProofSize::Minimal(message_payload.len() as u32); + // prepare para storage proof containing message + let (para_state_root, para_storage_proof) = prepare_messages_storage_proof::( + lane_id, + message_nonce..=message_nonce, + None, + message_size, + message_payload, + encode_all_messages, + encode_lane_data, + ); + + let (relay_chain_header, justification, bridged_para_head, parachain_heads, para_heads_proof) = + make_complex_bridged_parachain_heads_proof::( + para_state_root, + para_header_number, + relay_header_number, + bridged_para_id, + ); + + let message_proof = FromBridgedChainMessagesProof { + bridged_header_hash: bridged_para_head.hash(), + storage_proof: para_storage_proof, + lane: lane_id, + nonces_start: message_nonce, + nonces_end: message_nonce, + }; + + ( + relay_chain_header, + justification, + bridged_para_head, + parachain_heads, + para_heads_proof, + message_proof, + ) +} + +/// Prepare storage proofs of message confirmations, stored at the target parachain. +pub fn make_complex_relayer_confirmation_proofs( + lane_id: LaneId, + para_header_number: u32, + relay_header_number: u32, + bridged_para_id: u32, + relayer_id_at_this_chain: AccountId32, + relayers_state: UnrewardedRelayersState, +) -> ( + HeaderOf, + GrandpaJustification>, + ParaHead, + Vec<(ParaId, ParaHash)>, + ParaHeadsProof, + FromBridgedChainMessagesDeliveryProof, +) +where + BridgedRelayChain: + bp_runtime::Chain + ChainWithGrandpa, + MB: MessageBridge, + ::BridgedChain: Send + Sync + 'static, + ::ThisChain: Send + Sync + 'static, + <::ThisChain as bp_runtime::Chain>::AccountId: From, + UnderlyingChainOf>: bp_runtime::Chain + Parachain, +{ + // prepare para storage proof containing message delivery proof + let (para_state_root, para_storage_proof) = prepare_message_delivery_storage_proof::( + lane_id, + InboundLaneData { + relayers: vec![ + UnrewardedRelayer { + relayer: relayer_id_at_this_chain.into(), + messages: DeliveredMessages::new(1) + }; + relayers_state.unrewarded_relayer_entries as usize + ] + .into(), + last_confirmed_nonce: 1, + }, + StorageProofSize::Minimal(0), + ); + + let (relay_chain_header, justification, bridged_para_head, parachain_heads, para_heads_proof) = + make_complex_bridged_parachain_heads_proof::( + para_state_root, + para_header_number, + relay_header_number, + bridged_para_id, + ); + + let message_delivery_proof = FromBridgedChainMessagesDeliveryProof { + bridged_header_hash: bridged_para_head.hash(), + storage_proof: para_storage_proof, + lane: lane_id, + }; + + ( + relay_chain_header, + justification, + bridged_para_head, + parachain_heads, + para_heads_proof, + message_delivery_proof, + ) +} + +/// Make bridged parachain header with given state root and relay header that is finalizing it. +pub fn make_complex_bridged_parachain_heads_proof( + para_state_root: ParaHash, + para_header_number: u32, + relay_header_number: BlockNumberOf, + bridged_para_id: u32, +) -> ( + HeaderOf, + GrandpaJustification>, + ParaHead, + Vec<(ParaId, ParaHash)>, + ParaHeadsProof, +) +where + BridgedRelayChain: + bp_runtime::Chain + ChainWithGrandpa, + MB: MessageBridge, + ::BridgedChain: Send + Sync + 'static, + ::ThisChain: Send + Sync + 'static, + UnderlyingChainOf>: bp_runtime::Chain + Parachain, +{ + let bridged_para_head = ParaHead( + bp_test_utils::test_header_with_root::>( + para_header_number.into(), + para_state_root, + ) + .encode(), + ); + let (relay_state_root, para_heads_proof, parachain_heads) = + prepare_parachain_heads_proof::>(vec![( + bridged_para_id, + bridged_para_head.clone(), + )]); + assert_eq!(bridged_para_head.hash(), parachain_heads[0].1); + + let (relay_chain_header, justification) = make_complex_bridged_grandpa_header_proof::< + BridgedRelayChain, + >(relay_state_root, relay_header_number); + + (relay_chain_header, justification, bridged_para_head, parachain_heads, para_heads_proof) +} diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/mod.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/mod.rs new file mode 100644 index 00000000000..f905d21b187 --- /dev/null +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/mod.rs @@ -0,0 +1,144 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +//! Generating test data, used by all tests. + +pub mod from_grandpa_chain; +pub mod from_parachain; + +use bp_messages::{ + target_chain::{DispatchMessage, DispatchMessageData}, + LaneId, MessageKey, +}; +use codec::Encode; +use frame_support::traits::Get; +use pallet_bridge_grandpa::BridgedHeader; +use xcm::latest::prelude::*; + +use bp_messages::MessageNonce; +use bp_runtime::BasicOperatingMode; +use bp_test_utils::authority_list; +use xcm::GetVersion; +use xcm_builder::{HaulBlob, HaulBlobError, HaulBlobExporter}; +use xcm_executor::traits::{validate_export, ExportXcm}; + +pub fn prepare_inbound_xcm( + xcm_message: Xcm, + destination: InteriorMultiLocation, +) -> Vec { + let location = xcm::VersionedInteriorMultiLocation::V3(destination); + let xcm = xcm::VersionedXcm::::V3(xcm_message); + // this is the `BridgeMessage` from polkadot xcm builder, but it has no constructor + // or public fields, so just tuple + // (double encoding, because `.encode()` is called on original Xcm BLOB when it is pushed + // to the storage) + (location, xcm).encode().encode() +} + +/// Helper that creates InitializationData mock data, that can be used to initialize bridge +/// GRANDPA pallet +pub fn initialization_data< + Runtime: pallet_bridge_grandpa::Config, + GrandpaPalletInstance: 'static, +>( + block_number: u32, +) -> bp_header_chain::InitializationData> { + bp_header_chain::InitializationData { + header: Box::new(bp_test_utils::test_header(block_number.into())), + authority_list: authority_list(), + set_id: 1, + operating_mode: BasicOperatingMode::Normal, + } +} + +/// Dummy xcm +pub(crate) fn dummy_xcm() -> Xcm<()> { + vec![Trap(42)].into() +} + +pub(crate) fn dispatch_message( + lane_id: LaneId, + nonce: MessageNonce, + payload: Vec, +) -> DispatchMessage> { + DispatchMessage { + key: MessageKey { lane_id, nonce }, + data: DispatchMessageData { payload: Ok(payload) }, + } +} + +/// Macro used for simulate_export_message and capturing bytes +macro_rules! grab_haul_blob ( + ($name:ident, $grabbed_payload:ident) => { + std::thread_local! { + static $grabbed_payload: std::cell::RefCell>> = std::cell::RefCell::new(None); + } + + struct $name; + impl HaulBlob for $name { + fn haul_blob(blob: Vec) -> Result<(), HaulBlobError>{ + $grabbed_payload.with(|rm| *rm.borrow_mut() = Some(blob)); + Ok(()) + } + } + } +); + +/// Simulates `HaulBlobExporter` and all its wrapping and captures generated plain bytes, +/// which are transferred over bridge. +pub(crate) fn simulate_message_exporter_on_bridged_chain< + SourceNetwork: Get, + DestinationNetwork: Get, + DestinationVersion: GetVersion, +>( + (destination_network, destination_junctions): (NetworkId, Junctions), +) -> Vec { + grab_haul_blob!(GrabbingHaulBlob, GRABBED_HAUL_BLOB_PAYLOAD); + + // lets pretend that some parachain on bridged chain exported the message + let universal_source_on_bridged_chain = + X2(GlobalConsensus(SourceNetwork::get()), Parachain(5678)); + let channel = 1_u32; + + // simulate XCM message export + let (ticket, fee) = validate_export::< + HaulBlobExporter, + >( + destination_network, + channel, + universal_source_on_bridged_chain, + destination_junctions, + dummy_xcm(), + ) + .expect("validate_export to pass"); + log::info!( + target: "simulate_message_exporter_on_bridged_chain", + "HaulBlobExporter::validate fee: {:?}", + fee + ); + let xcm_hash = + HaulBlobExporter::::deliver( + ticket, + ) + .expect("deliver to pass"); + log::info!( + target: "simulate_message_exporter_on_bridged_chain", + "HaulBlobExporter::deliver xcm_hash: {:?}", + xcm_hash + ); + + GRABBED_HAUL_BLOB_PAYLOAD.with(|r| r.take().expect("Encoded message should be here")) +} diff --git a/cumulus/parachains/runtimes/test-utils/src/lib.rs b/cumulus/parachains/runtimes/test-utils/src/lib.rs index a8ae63b250a..ca1e1633d4f 100644 --- a/cumulus/parachains/runtimes/test-utils/src/lib.rs +++ b/cumulus/parachains/runtimes/test-utils/src/lib.rs @@ -114,14 +114,34 @@ impl BasicParachainRuntime for T +where + T: frame_system::Config + pallet_balances::Config + pallet_session::Config + pallet_xcm::Config - + parachain_info::Config, -> { + + parachain_info::Config + + pallet_collator_selection::Config + + cumulus_pallet_parachain_system::Config, + ValidatorIdOf: From>, +{ +} + +/// Basic builder based on balances, collators and pallet_session. +pub struct ExtBuilder { // endowed accounts with balances balances: Vec<(AccountIdOf, BalanceOf)>, // collators to test block prod @@ -135,14 +155,7 @@ pub struct ExtBuilder< _runtime: PhantomData, } -impl< - Runtime: frame_system::Config - + pallet_balances::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config, - > Default for ExtBuilder -{ +impl Default for ExtBuilder { fn default() -> ExtBuilder { ExtBuilder { balances: vec![], @@ -155,14 +168,7 @@ impl< } } -impl< - Runtime: frame_system::Config - + pallet_balances::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config, - > ExtBuilder -{ +impl ExtBuilder { pub fn with_balances( mut self, balances: Vec<(AccountIdOf, BalanceOf)>, @@ -198,12 +204,7 @@ impl< self } - pub fn build(self) -> sp_io::TestExternalities - where - Runtime: - pallet_collator_selection::Config + pallet_balances::Config + pallet_session::Config, - ValidatorIdOf: From>, - { + pub fn build(self) -> sp_io::TestExternalities { let mut t = frame_system::GenesisConfig::::default().build_storage().unwrap(); pallet_xcm::GenesisConfig:: { -- GitLab From bc82eb6ec9888e0598df9ecdc2d17bcc1f3cd8d4 Mon Sep 17 00:00:00 2001 From: gupnik Date: Wed, 13 Dec 2023 15:30:24 +0530 Subject: [PATCH 023/191] Fixes parsing for config attrs in pallet macros (#2677) --- .../support/procedural/src/derive_impl.rs | 7 ++ .../procedural/src/pallet/expand/call.rs | 22 +++++-- .../procedural/src/pallet/expand/error.rs | 37 ++++++----- .../procedural/src/pallet/parse/call.rs | 4 ++ .../procedural/src/pallet/parse/error.rs | 26 ++++++-- .../frame/support/test/tests/derive_impl.rs | 52 +++++++++++++++ substrate/frame/support/test/tests/pallet.rs | 64 ++++++++++++++++++- 7 files changed, 187 insertions(+), 25 deletions(-) create mode 100644 substrate/frame/support/test/tests/derive_impl.rs diff --git a/substrate/frame/support/procedural/src/derive_impl.rs b/substrate/frame/support/procedural/src/derive_impl.rs index 3e044053116..d6d5bf68efd 100644 --- a/substrate/frame/support/procedural/src/derive_impl.rs +++ b/substrate/frame/support/procedural/src/derive_impl.rs @@ -136,9 +136,15 @@ fn combine_impls( return None } if let ImplItem::Type(typ) = item.clone() { + let cfg_attrs = typ + .attrs + .iter() + .filter(|attr| attr.path().get_ident().map_or(false, |ident| ident == "cfg")) + .map(|attr| attr.to_token_stream()); if is_runtime_type(&typ) { let item: ImplItem = if inject_runtime_types { parse_quote! { + #( #cfg_attrs )* type #ident = #ident; } } else { @@ -148,6 +154,7 @@ fn combine_impls( } // modify and insert uncolliding type items let modified_item: ImplItem = parse_quote! { + #( #cfg_attrs )* type #ident = <#default_impl_path as #disambiguation_path>::#ident; }; return Some(modified_item) diff --git a/substrate/frame/support/procedural/src/pallet/expand/call.rs b/substrate/frame/support/procedural/src/pallet/expand/call.rs index cf302faafc7..624cde018dc 100644 --- a/substrate/frame/support/procedural/src/pallet/expand/call.rs +++ b/substrate/frame/support/procedural/src/pallet/expand/call.rs @@ -241,6 +241,15 @@ pub fn expand_call(def: &mut Def) -> proc_macro2::TokenStream { }) .collect::>(); + let cfg_attrs = methods + .iter() + .map(|method| { + let attrs = + method.cfg_attrs.iter().map(|attr| attr.to_token_stream()).collect::>(); + quote::quote!( #( #attrs )* ) + }) + .collect::>(); + let feeless_check = methods.iter().map(|method| &method.feeless_check).collect::>(); let feeless_check_result = feeless_check.iter().zip(args_name.iter()).map(|(feeless_check, arg_name)| { @@ -297,6 +306,7 @@ pub fn expand_call(def: &mut Def) -> proc_macro2::TokenStream { #frame_support::Never, ), #( + #cfg_attrs #[doc = #fn_doc] #[codec(index = #call_index)] #fn_name { @@ -310,6 +320,7 @@ pub fn expand_call(def: &mut Def) -> proc_macro2::TokenStream { impl<#type_impl_gen> #call_ident<#type_use_gen> #where_clause { #( + #cfg_attrs #[doc = #new_call_variant_doc] pub fn #new_call_variant_fn_name( #( #args_name_stripped: #args_type ),* @@ -328,6 +339,7 @@ pub fn expand_call(def: &mut Def) -> proc_macro2::TokenStream { fn get_dispatch_info(&self) -> #frame_support::dispatch::DispatchInfo { match *self { #( + #cfg_attrs Self::#fn_name { #( #args_name_pattern_ref, )* } => { let __pallet_base_weight = #fn_weight; @@ -365,6 +377,7 @@ pub fn expand_call(def: &mut Def) -> proc_macro2::TokenStream { fn is_feeless(&self, origin: &Self::Origin) -> bool { match *self { #( + #cfg_attrs Self::#fn_name { #( #args_name_pattern_ref, )* } => { #feeless_check_result }, @@ -379,13 +392,13 @@ pub fn expand_call(def: &mut Def) -> proc_macro2::TokenStream { { fn get_call_name(&self) -> &'static str { match *self { - #( Self::#fn_name { .. } => stringify!(#fn_name), )* + #( #cfg_attrs Self::#fn_name { .. } => stringify!(#fn_name), )* Self::__Ignore(_, _) => unreachable!("__PhantomItem cannot be used."), } } fn get_call_names() -> &'static [&'static str] { - &[ #( stringify!(#fn_name), )* ] + &[ #( #cfg_attrs stringify!(#fn_name), )* ] } } @@ -394,13 +407,13 @@ pub fn expand_call(def: &mut Def) -> proc_macro2::TokenStream { { fn get_call_index(&self) -> u8 { match *self { - #( Self::#fn_name { .. } => #call_index, )* + #( #cfg_attrs Self::#fn_name { .. } => #call_index, )* Self::__Ignore(_, _) => unreachable!("__PhantomItem cannot be used."), } } fn get_call_indices() -> &'static [u8] { - &[ #( #call_index, )* ] + &[ #( #cfg_attrs #call_index, )* ] } } @@ -416,6 +429,7 @@ pub fn expand_call(def: &mut Def) -> proc_macro2::TokenStream { #frame_support::dispatch_context::run_in_context(|| { match self { #( + #cfg_attrs Self::#fn_name { #( #args_name_pattern, )* } => { #frame_support::__private::sp_tracing::enter_span!( #frame_support::__private::sp_tracing::trace_span!(stringify!(#fn_name)) diff --git a/substrate/frame/support/procedural/src/pallet/expand/error.rs b/substrate/frame/support/procedural/src/pallet/expand/error.rs index 877489fd605..72fb6e92357 100644 --- a/substrate/frame/support/procedural/src/pallet/expand/error.rs +++ b/substrate/frame/support/procedural/src/pallet/expand/error.rs @@ -16,10 +16,14 @@ // limitations under the License. use crate::{ - pallet::{parse::error::VariantField, Def}, + pallet::{ + parse::error::{VariantDef, VariantField}, + Def, + }, COUNTER, }; use frame_support_procedural_tools::get_doc_literals; +use quote::ToTokens; use syn::spanned::Spanned; /// @@ -67,20 +71,23 @@ pub fn expand_error(def: &mut Def) -> proc_macro2::TokenStream { ) ); - let as_str_matches = error.variants.iter().map(|(variant, field_ty, _)| { - let variant_str = variant.to_string(); - match field_ty { - Some(VariantField { is_named: true }) => { - quote::quote_spanned!(error.attr_span => Self::#variant { .. } => #variant_str,) - }, - Some(VariantField { is_named: false }) => { - quote::quote_spanned!(error.attr_span => Self::#variant(..) => #variant_str,) - }, - None => { - quote::quote_spanned!(error.attr_span => Self::#variant => #variant_str,) - }, - } - }); + let as_str_matches = error.variants.iter().map( + |VariantDef { ident: variant, field: field_ty, docs: _, cfg_attrs }| { + let variant_str = variant.to_string(); + let cfg_attrs = cfg_attrs.iter().map(|attr| attr.to_token_stream()); + match field_ty { + Some(VariantField { is_named: true }) => { + quote::quote_spanned!(error.attr_span => #( #cfg_attrs )* Self::#variant { .. } => #variant_str,) + }, + Some(VariantField { is_named: false }) => { + quote::quote_spanned!(error.attr_span => #( #cfg_attrs )* Self::#variant(..) => #variant_str,) + }, + None => { + quote::quote_spanned!(error.attr_span => #( #cfg_attrs )* Self::#variant => #variant_str,) + }, + } + }, + ); let error_item = { let item = &mut def.item.content.as_mut().expect("Checked by def parser").1[error.index]; diff --git a/substrate/frame/support/procedural/src/pallet/parse/call.rs b/substrate/frame/support/procedural/src/pallet/parse/call.rs index 58e14365e76..4e09b86fdde 100644 --- a/substrate/frame/support/procedural/src/pallet/parse/call.rs +++ b/substrate/frame/support/procedural/src/pallet/parse/call.rs @@ -85,6 +85,8 @@ pub struct CallVariantDef { pub docs: Vec, /// Attributes annotated at the top of the dispatchable function. pub attrs: Vec, + /// The `cfg` attributes. + pub cfg_attrs: Vec, /// The optional `feeless_if` attribute on the `pallet::call`. pub feeless_check: Option, } @@ -266,6 +268,7 @@ impl CallDef { return Err(syn::Error::new(method.sig.span(), msg)) } + let cfg_attrs: Vec = helper::get_item_cfg_attrs(&method.attrs); let mut call_idx_attrs = vec![]; let mut weight_attrs = vec![]; let mut feeless_attrs = vec![]; @@ -442,6 +445,7 @@ impl CallDef { args, docs, attrs: method.attrs.clone(), + cfg_attrs, feeless_check, }); } else { diff --git a/substrate/frame/support/procedural/src/pallet/parse/error.rs b/substrate/frame/support/procedural/src/pallet/parse/error.rs index 6f82ce61fc9..362df8d7340 100644 --- a/substrate/frame/support/procedural/src/pallet/parse/error.rs +++ b/substrate/frame/support/procedural/src/pallet/parse/error.rs @@ -25,19 +25,31 @@ mod keyword { syn::custom_keyword!(Error); } -/// Records information about the error enum variants. +/// Records information about the error enum variant field. pub struct VariantField { /// Whether or not the field is named, i.e. whether it is a tuple variant or struct variant. pub is_named: bool, } +/// Records information about the error enum variants. +pub struct VariantDef { + /// The variant ident. + pub ident: syn::Ident, + /// The variant field, if any. + pub field: Option, + /// The variant doc literals. + pub docs: Vec, + /// The `cfg` attributes. + pub cfg_attrs: Vec, +} + /// This checks error declaration as a enum declaration with only variants without fields nor /// discriminant. pub struct ErrorDef { /// The index of error item in pallet module. pub index: usize, - /// Variants ident, optional field and doc literals (ordered as declaration order) - pub variants: Vec<(syn::Ident, Option, Vec)>, + /// Variant definitions. + pub variants: Vec, /// A set of usage of instance, must be check for consistency with trait. pub instances: Vec, /// The keyword error used (contains span). @@ -87,8 +99,14 @@ impl ErrorDef { let span = variant.discriminant.as_ref().unwrap().0.span(); return Err(syn::Error::new(span, msg)) } + let cfg_attrs: Vec = helper::get_item_cfg_attrs(&variant.attrs); - Ok((variant.ident.clone(), field_ty, get_doc_literals(&variant.attrs))) + Ok(VariantDef { + ident: variant.ident.clone(), + field: field_ty, + docs: get_doc_literals(&variant.attrs), + cfg_attrs, + }) }) .collect::>()?; diff --git a/substrate/frame/support/test/tests/derive_impl.rs b/substrate/frame/support/test/tests/derive_impl.rs new file mode 100644 index 00000000000..675e85f4bfc --- /dev/null +++ b/substrate/frame/support/test/tests/derive_impl.rs @@ -0,0 +1,52 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use frame_support::derive_impl; + +trait Shape { + fn area(&self) -> u32; +} + +struct SomeRectangle {} + +#[frame_support::register_default_impl(SomeRectangle)] +impl Shape for SomeRectangle { + #[cfg(not(feature = "feature-frame-testing"))] + fn area(&self) -> u32 { + 10 + } + + #[cfg(feature = "feature-frame-testing")] + fn area(&self) -> u32 { + 0 + } +} + +struct SomeSquare {} + +#[derive_impl(SomeRectangle)] +impl Shape for SomeSquare {} + +#[test] +fn test_feature_parsing() { + let square = SomeSquare {}; + #[cfg(not(feature = "feature-frame-testing"))] + assert_eq!(square.area(), 10); + + #[cfg(feature = "feature-frame-testing")] + assert_eq!(square.area(), 0); +} diff --git a/substrate/frame/support/test/tests/pallet.rs b/substrate/frame/support/test/tests/pallet.rs index d2e5b185163..0223979d7f0 100644 --- a/substrate/frame/support/test/tests/pallet.rs +++ b/substrate/frame/support/test/tests/pallet.rs @@ -257,6 +257,13 @@ pub mod pallet { pub fn check_for_dispatch_context(_origin: OriginFor) -> DispatchResult { with_context::<(), _>(|_| ()).ok_or_else(|| DispatchError::Unavailable) } + + #[cfg(feature = "frame-feature-testing")] + #[pallet::call_index(5)] + #[pallet::weight({1})] + pub fn foo_feature_test(_origin: OriginFor) -> DispatchResult { + Ok(()) + } } #[pallet::error] @@ -269,6 +276,8 @@ pub mod pallet { #[codec(skip)] Skipped(u128), CompactU8(#[codec(compact)] u8), + #[cfg(feature = "frame-feature-testing")] + FeatureTest, } #[pallet::event] @@ -796,6 +805,7 @@ fn call_expand() { } ); assert_eq!(call_foo.get_call_name(), "foo"); + #[cfg(not(feature = "frame-feature-testing"))] assert_eq!( pallet::Call::::get_call_names(), &[ @@ -806,9 +816,24 @@ fn call_expand() { "check_for_dispatch_context" ], ); + #[cfg(feature = "frame-feature-testing")] + assert_eq!( + pallet::Call::::get_call_names(), + &[ + "foo", + "foo_storage_layer", + "foo_index_out_of_order", + "foo_no_post_info", + "check_for_dispatch_context", + "foo_feature_test" + ], + ); assert_eq!(call_foo.get_call_index(), 0u8); - assert_eq!(pallet::Call::::get_call_indices(), &[0u8, 1u8, 4u8, 2u8, 3u8]) + #[cfg(not(feature = "frame-feature-testing"))] + assert_eq!(pallet::Call::::get_call_indices(), &[0u8, 1u8, 4u8, 2u8, 3u8]); + #[cfg(feature = "frame-feature-testing")] + assert_eq!(pallet::Call::::get_call_indices(), &[0u8, 1u8, 4u8, 2u8, 3u8, 5u8]); } #[test] @@ -816,7 +841,10 @@ fn call_expand_index() { let call_foo = pallet::Call::::foo_index_out_of_order {}; assert_eq!(call_foo.get_call_index(), 4u8); - assert_eq!(pallet::Call::::get_call_indices(), &[0u8, 1u8, 4u8, 2u8, 3u8]) + #[cfg(not(feature = "frame-feature-testing"))] + assert_eq!(pallet::Call::::get_call_indices(), &[0u8, 1u8, 4u8, 2u8, 3u8]); + #[cfg(feature = "frame-feature-testing")] + assert_eq!(pallet::Call::::get_call_indices(), &[0u8, 1u8, 4u8, 2u8, 3u8, 5u8]); } #[test] @@ -838,6 +866,8 @@ fn error_expand() { }), ); assert_eq!( as PalletError>::MAX_ENCODED_SIZE, 3); + #[cfg(feature = "frame-feature-testing")] + assert_eq!(format!("{:?}", pallet::Error::::FeatureTest), String::from("FeatureTest"),); } #[test] @@ -2379,3 +2409,33 @@ fn test_dispatch_context() { .dispatch(RuntimeOrigin::root())); }); } + +#[test] +fn test_call_feature_parsing() { + let call = pallet::Call::::check_for_dispatch_context {}; + match call { + pallet::Call::::check_for_dispatch_context {} | + pallet::Call::::foo { .. } | + pallet::Call::foo_storage_layer { .. } | + pallet::Call::foo_index_out_of_order {} | + pallet::Call::foo_no_post_info {} => (), + #[cfg(feature = "frame-feature-testing")] + pallet::Call::foo_feature_test {} => (), + pallet::Call::__Ignore(_, _) => (), + } +} + +#[test] +fn test_error_feature_parsing() { + let err = pallet::Error::::InsufficientProposersBalance; + match err { + pallet::Error::InsufficientProposersBalance | + pallet::Error::NonExistentStorageValue | + pallet::Error::Code(_) | + pallet::Error::Skipped(_) | + pallet::Error::CompactU8(_) => (), + #[cfg(feature = "frame-feature-testing")] + pallet::Error::FeatureTest => (), + pallet::Error::__Ignore(_, _) => (), + } +} -- GitLab From 4c4407a8930267e139db93019c01444acf49e1ce Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Wed, 13 Dec 2023 12:33:19 +0100 Subject: [PATCH 024/191] Updated benchmarks related to the Rococo/Westend bridge (#2639) Co-authored-by: command-bot <> --- .../weights/pallet_xcm_bridge_hub_router.rs | 20 +- .../weights/pallet_xcm_bridge_hub_router.rs | 20 +- .../src/weights/pallet_bridge_grandpa.rs | 16 +- .../src/weights/pallet_bridge_messages.rs | 58 +++--- .../src/weights/pallet_bridge_parachains.rs | 20 +- .../src/weights/pallet_bridge_relayers.rs | 34 ++-- .../xcm/pallet_xcm_benchmarks_generic.rs | 130 ++++++------ .../src/weights/pallet_bridge_grandpa.rs | 28 ++- .../src/weights/pallet_bridge_messages.rs | 187 +++++++++--------- .../src/weights/pallet_bridge_parachains.rs | 78 ++++---- .../src/weights/pallet_bridge_relayers.rs | 30 +-- .../xcm/pallet_xcm_benchmarks_generic.rs | 142 +++++++------ 12 files changed, 376 insertions(+), 387 deletions(-) diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/pallet_xcm_bridge_hub_router.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/pallet_xcm_bridge_hub_router.rs index aeaaed45452..775bc3bdb80 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/pallet_xcm_bridge_hub_router.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/pallet_xcm_bridge_hub_router.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_xcm_bridge_hub_router` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-11-29, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-12-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-r43aesjn-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-itmxxexx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-rococo-dev")`, DB CACHE: 1024 // Executed Command: @@ -58,8 +58,8 @@ impl pallet_xcm_bridge_hub_router::WeightInfo for Weigh // Proof Size summary in bytes: // Measured: `154` // Estimated: `1639` - // Minimum execution time: 8_110_000 picoseconds. - Weight::from_parts(8_373_000, 0) + // Minimum execution time: 7_853_000 picoseconds. + Weight::from_parts(8_443_000, 0) .saturating_add(Weight::from_parts(0, 1639)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) @@ -72,8 +72,8 @@ impl pallet_xcm_bridge_hub_router::WeightInfo for Weigh // Proof Size summary in bytes: // Measured: `144` // Estimated: `1629` - // Minimum execution time: 4_459_000 picoseconds. - Weight::from_parts(4_663_000, 0) + // Minimum execution time: 4_333_000 picoseconds. + Weight::from_parts(4_501_000, 0) .saturating_add(Weight::from_parts(0, 1629)) .saturating_add(T::DbWeight::get().reads(2)) } @@ -83,8 +83,8 @@ impl pallet_xcm_bridge_hub_router::WeightInfo for Weigh // Proof Size summary in bytes: // Measured: `150` // Estimated: `1502` - // Minimum execution time: 10_153_000 picoseconds. - Weight::from_parts(10_737_000, 0) + // Minimum execution time: 10_167_000 picoseconds. + Weight::from_parts(10_667_000, 0) .saturating_add(Weight::from_parts(0, 1502)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -117,8 +117,8 @@ impl pallet_xcm_bridge_hub_router::WeightInfo for Weigh // Proof Size summary in bytes: // Measured: `448` // Estimated: `6388` - // Minimum execution time: 61_258_000 picoseconds. - Weight::from_parts(63_679_000, 0) + // Minimum execution time: 60_584_000 picoseconds. + Weight::from_parts(62_467_000, 0) .saturating_add(Weight::from_parts(0, 6388)) .saturating_add(T::DbWeight::get().reads(12)) .saturating_add(T::DbWeight::get().writes(4)) diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_xcm_bridge_hub_router.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_xcm_bridge_hub_router.rs index ee8d0ae3c45..84d717b0283 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_xcm_bridge_hub_router.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_xcm_bridge_hub_router.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_xcm_bridge_hub_router` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-11-29, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-12-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-r43aesjn-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-itmxxexx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-westend-dev")`, DB CACHE: 1024 // Executed Command: @@ -58,8 +58,8 @@ impl pallet_xcm_bridge_hub_router::WeightInfo for Weigh // Proof Size summary in bytes: // Measured: `193` // Estimated: `1678` - // Minimum execution time: 8_460_000 picoseconds. - Weight::from_parts(8_730_000, 0) + // Minimum execution time: 8_095_000 picoseconds. + Weight::from_parts(8_393_000, 0) .saturating_add(Weight::from_parts(0, 1678)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) @@ -72,8 +72,8 @@ impl pallet_xcm_bridge_hub_router::WeightInfo for Weigh // Proof Size summary in bytes: // Measured: `111` // Estimated: `1596` - // Minimum execution time: 3_469_000 picoseconds. - Weight::from_parts(3_696_000, 0) + // Minimum execution time: 3_417_000 picoseconds. + Weight::from_parts(3_583_000, 0) .saturating_add(Weight::from_parts(0, 1596)) .saturating_add(T::DbWeight::get().reads(2)) } @@ -83,8 +83,8 @@ impl pallet_xcm_bridge_hub_router::WeightInfo for Weigh // Proof Size summary in bytes: // Measured: `117` // Estimated: `1502` - // Minimum execution time: 10_315_000 picoseconds. - Weight::from_parts(10_651_000, 0) + // Minimum execution time: 10_280_000 picoseconds. + Weight::from_parts(10_703_000, 0) .saturating_add(Weight::from_parts(0, 1502)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -117,8 +117,8 @@ impl pallet_xcm_bridge_hub_router::WeightInfo for Weigh // Proof Size summary in bytes: // Measured: `487` // Estimated: `6427` - // Minimum execution time: 64_532_000 picoseconds. - Weight::from_parts(66_901_000, 0) + // Minimum execution time: 63_624_000 picoseconds. + Weight::from_parts(66_071_000, 0) .saturating_add(Weight::from_parts(0, 6427)) .saturating_add(T::DbWeight::get().reads(12)) .saturating_add(T::DbWeight::get().writes(4)) diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_grandpa.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_grandpa.rs index aaa6a3e0622..8c2435599f5 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_grandpa.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_grandpa.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_bridge_grandpa` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-11-14, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-12-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-yprdrvc7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-itmxxexx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-rococo-dev")`, DB CACHE: 1024 // Executed Command: @@ -66,13 +66,13 @@ impl pallet_bridge_grandpa::WeightInfo for WeightInfo pallet_bridge_messages::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `538` // Estimated: `52645` - // Minimum execution time: 41_577_000 picoseconds. - Weight::from_parts(42_621_000, 0) + // Minimum execution time: 39_918_000 picoseconds. + Weight::from_parts(40_996_000, 0) .saturating_add(Weight::from_parts(0, 52645)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(1)) @@ -82,8 +82,8 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `538` // Estimated: `52645` - // Minimum execution time: 52_880_000 picoseconds. - Weight::from_parts(53_697_000, 0) + // Minimum execution time: 50_245_000 picoseconds. + Weight::from_parts(51_441_000, 0) .saturating_add(Weight::from_parts(0, 52645)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(1)) @@ -102,8 +102,8 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `538` // Estimated: `52645` - // Minimum execution time: 47_424_000 picoseconds. - Weight::from_parts(48_445_000, 0) + // Minimum execution time: 44_572_000 picoseconds. + Weight::from_parts(45_629_000, 0) .saturating_add(Weight::from_parts(0, 52645)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(1)) @@ -120,8 +120,8 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `506` // Estimated: `52645` - // Minimum execution time: 40_619_000 picoseconds. - Weight::from_parts(42_262_000, 0) + // Minimum execution time: 38_804_000 picoseconds. + Weight::from_parts(39_516_000, 0) .saturating_add(Weight::from_parts(0, 52645)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(1)) @@ -138,8 +138,8 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `506` // Estimated: `52645` - // Minimum execution time: 74_603_000 picoseconds. - Weight::from_parts(78_209_000, 0) + // Minimum execution time: 68_674_000 picoseconds. + Weight::from_parts(72_690_000, 0) .saturating_add(Weight::from_parts(0, 52645)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(1)) @@ -156,11 +156,11 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `BridgeRelayers::RelayerRewards` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) fn receive_delivery_proof_for_single_message() -> Weight { // Proof Size summary in bytes: - // Measured: `377` - // Estimated: `3842` - // Minimum execution time: 33_762_000 picoseconds. - Weight::from_parts(34_405_000, 0) - .saturating_add(Weight::from_parts(0, 3842)) + // Measured: `413` + // Estimated: `3878` + // Minimum execution time: 32_833_000 picoseconds. + Weight::from_parts(33_442_000, 0) + .saturating_add(Weight::from_parts(0, 3878)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -176,11 +176,11 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `BridgeRelayers::RelayerRewards` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) fn receive_delivery_proof_for_two_messages_by_single_relayer() -> Weight { // Proof Size summary in bytes: - // Measured: `377` - // Estimated: `3842` - // Minimum execution time: 33_805_000 picoseconds. - Weight::from_parts(35_051_000, 0) - .saturating_add(Weight::from_parts(0, 3842)) + // Measured: `413` + // Estimated: `3878` + // Minimum execution time: 32_528_000 picoseconds. + Weight::from_parts(33_627_000, 0) + .saturating_add(Weight::from_parts(0, 3878)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -196,10 +196,10 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `BridgeRelayers::RelayerRewards` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) fn receive_delivery_proof_for_two_messages_by_two_relayers() -> Weight { // Proof Size summary in bytes: - // Measured: `377` + // Measured: `413` // Estimated: `6086` - // Minimum execution time: 38_612_000 picoseconds. - Weight::from_parts(39_412_000, 0) + // Minimum execution time: 37_493_000 picoseconds. + Weight::from_parts(38_324_000, 0) .saturating_add(Weight::from_parts(0, 6086)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(3)) @@ -231,11 +231,11 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `669` // Estimated: `52645` - // Minimum execution time: 69_285_000 picoseconds. - Weight::from_parts(70_867_498, 0) + // Minimum execution time: 64_104_000 picoseconds. + Weight::from_parts(66_006_268, 0) .saturating_add(Weight::from_parts(0, 52645)) - // Standard Error: 111 - .saturating_add(Weight::from_parts(7_489, 0).saturating_mul(i.into())) + // Standard Error: 91 + .saturating_add(Weight::from_parts(7_932, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().reads(10)) .saturating_add(T::DbWeight::get().writes(4)) } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_parachains.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_parachains.rs index 5c7c4a63682..ea68852804e 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_parachains.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_parachains.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_bridge_parachains` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-11-14, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-12-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-yprdrvc7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-itmxxexx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-rococo-dev")`, DB CACHE: 1024 // Executed Command: @@ -59,13 +59,15 @@ impl pallet_bridge_parachains::WeightInfo for WeightInf /// Storage: `BridgeWestendParachains::ImportedParaHeads` (r:0 w:1) /// Proof: `BridgeWestendParachains::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) /// The range of component `p` is `[1, 2]`. - fn submit_parachain_heads_with_n_parachains(_p: u32, ) -> Weight { + fn submit_parachain_heads_with_n_parachains(p: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `434` // Estimated: `2543` - // Minimum execution time: 31_987_000 picoseconds. - Weight::from_parts(33_060_534, 0) + // Minimum execution time: 31_135_000 picoseconds. + Weight::from_parts(32_061_351, 0) .saturating_add(Weight::from_parts(0, 2543)) + // Standard Error: 80_309 + .saturating_add(Weight::from_parts(99_724, 0).saturating_mul(p.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -83,8 +85,8 @@ impl pallet_bridge_parachains::WeightInfo for WeightInf // Proof Size summary in bytes: // Measured: `434` // Estimated: `2543` - // Minimum execution time: 33_360_000 picoseconds. - Weight::from_parts(34_182_000, 0) + // Minimum execution time: 32_263_000 picoseconds. + Weight::from_parts(33_139_000, 0) .saturating_add(Weight::from_parts(0, 2543)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(3)) @@ -103,8 +105,8 @@ impl pallet_bridge_parachains::WeightInfo for WeightInf // Proof Size summary in bytes: // Measured: `434` // Estimated: `2543` - // Minimum execution time: 65_246_000 picoseconds. - Weight::from_parts(65_985_000, 0) + // Minimum execution time: 61_313_000 picoseconds. + Weight::from_parts(62_200_000, 0) .saturating_add(Weight::from_parts(0, 2543)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(3)) diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_relayers.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_relayers.rs index 70af694645d..5ab4cb900d8 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_relayers.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_relayers.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_bridge_relayers` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-11-14, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-12-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-yprdrvc7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-itmxxexx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-rococo-dev")`, DB CACHE: 1024 // Executed Command: @@ -54,10 +54,10 @@ impl pallet_bridge_relayers::WeightInfo for WeightInfo< /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn claim_rewards() -> Weight { // Proof Size summary in bytes: - // Measured: `207` + // Measured: `244` // Estimated: `3593` - // Minimum execution time: 46_579_000 picoseconds. - Weight::from_parts(48_298_000, 0) + // Minimum execution time: 45_393_000 picoseconds. + Weight::from_parts(46_210_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -70,10 +70,10 @@ impl pallet_bridge_relayers::WeightInfo for WeightInfo< /// Proof: `Balances::Reserves` (`max_values`: None, `max_size`: Some(1249), added: 3724, mode: `MaxEncodedLen`) fn register() -> Weight { // Proof Size summary in bytes: - // Measured: `61` + // Measured: `97` // Estimated: `4714` - // Minimum execution time: 24_219_000 picoseconds. - Weight::from_parts(24_993_000, 0) + // Minimum execution time: 23_767_000 picoseconds. + Weight::from_parts(24_217_000, 0) .saturating_add(Weight::from_parts(0, 4714)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) @@ -84,10 +84,10 @@ impl pallet_bridge_relayers::WeightInfo for WeightInfo< /// Proof: `Balances::Reserves` (`max_values`: None, `max_size`: Some(1249), added: 3724, mode: `MaxEncodedLen`) fn deregister() -> Weight { // Proof Size summary in bytes: - // Measured: `160` + // Measured: `197` // Estimated: `4714` - // Minimum execution time: 26_279_000 picoseconds. - Weight::from_parts(26_810_000, 0) + // Minimum execution time: 25_745_000 picoseconds. + Weight::from_parts(26_319_000, 0) .saturating_add(Weight::from_parts(0, 4714)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -100,10 +100,10 @@ impl pallet_bridge_relayers::WeightInfo for WeightInfo< /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn slash_and_deregister() -> Weight { // Proof Size summary in bytes: - // Measured: `263` + // Measured: `300` // Estimated: `4714` - // Minimum execution time: 27_672_000 picoseconds. - Weight::from_parts(28_946_000, 0) + // Minimum execution time: 27_497_000 picoseconds. + Weight::from_parts(27_939_000, 0) .saturating_add(Weight::from_parts(0, 4714)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) @@ -112,10 +112,10 @@ impl pallet_bridge_relayers::WeightInfo for WeightInfo< /// Proof: `BridgeRelayers::RelayerRewards` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) fn register_relayer_reward() -> Weight { // Proof Size summary in bytes: - // Measured: `6` + // Measured: `42` // Estimated: `3538` - // Minimum execution time: 5_487_000 picoseconds. - Weight::from_parts(5_725_000, 0) + // Minimum execution time: 5_584_000 picoseconds. + Weight::from_parts(5_908_000, 0) .saturating_add(Weight::from_parts(0, 3538)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index 606e47457d2..abd84f8e89b 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::generic` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-11-29, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-12-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-r43aesjn-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-itmxxexx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 // Executed Command: @@ -68,8 +68,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `171` // Estimated: `6196` - // Minimum execution time: 61_049_000 picoseconds. - Weight::from_parts(62_672_000, 6196) + // Minimum execution time: 61_813_000 picoseconds. + Weight::from_parts(62_996_000, 6196) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -77,8 +77,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_972_000 picoseconds. - Weight::from_parts(2_095_000, 0) + // Minimum execution time: 2_044_000 picoseconds. + Weight::from_parts(2_112_000, 0) } // Storage: `PolkadotXcm::Queries` (r:1 w:0) // Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) @@ -86,58 +86,58 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `32` // Estimated: `3497` - // Minimum execution time: 7_541_000 picoseconds. - Weight::from_parts(7_875_000, 3497) + // Minimum execution time: 7_472_000 picoseconds. + Weight::from_parts(7_723_000, 3497) .saturating_add(T::DbWeight::get().reads(1)) } pub fn transact() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_467_000 picoseconds. - Weight::from_parts(8_653_000, 0) + // Minimum execution time: 8_414_000 picoseconds. + Weight::from_parts(8_765_000, 0) } pub fn refund_surplus() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_141_000 picoseconds. - Weight::from_parts(2_231_000, 0) + // Minimum execution time: 2_192_000 picoseconds. + Weight::from_parts(2_243_000, 0) } pub fn set_error_handler() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_881_000 picoseconds. - Weight::from_parts(1_941_000, 0) + // Minimum execution time: 1_866_000 picoseconds. + Weight::from_parts(1_931_000, 0) } pub fn set_appendix() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_846_000 picoseconds. - Weight::from_parts(1_916_000, 0) + // Minimum execution time: 1_847_000 picoseconds. + Weight::from_parts(1_921_000, 0) } pub fn clear_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_857_000 picoseconds. - Weight::from_parts(1_910_000, 0) + // Minimum execution time: 1_797_000 picoseconds. + Weight::from_parts(1_880_000, 0) } pub fn descend_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_493_000 picoseconds. - Weight::from_parts(2_570_000, 0) + // Minimum execution time: 2_458_000 picoseconds. + Weight::from_parts(2_523_000, 0) } pub fn clear_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_857_000 picoseconds. - Weight::from_parts(1_930_000, 0) + // Minimum execution time: 1_833_000 picoseconds. + Weight::from_parts(1_906_000, 0) } // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) @@ -159,8 +159,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `171` // Estimated: `6196` - // Minimum execution time: 54_805_000 picoseconds. - Weight::from_parts(55_690_000, 6196) + // Minimum execution time: 54_659_000 picoseconds. + Weight::from_parts(56_025_000, 6196) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -170,8 +170,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `90` // Estimated: `3555` - // Minimum execution time: 11_062_000 picoseconds. - Weight::from_parts(11_505_000, 3555) + // Minimum execution time: 10_953_000 picoseconds. + Weight::from_parts(11_220_000, 3555) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -179,8 +179,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_873_000 picoseconds. - Weight::from_parts(1_962_000, 0) + // Minimum execution time: 1_834_000 picoseconds. + Weight::from_parts(1_892_000, 0) } // Storage: `PolkadotXcm::VersionNotifyTargets` (r:1 w:1) // Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) @@ -200,8 +200,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `38` // Estimated: `3503` - // Minimum execution time: 22_356_000 picoseconds. - Weight::from_parts(23_066_000, 3503) + // Minimum execution time: 22_238_000 picoseconds. + Weight::from_parts(22_690_000, 3503) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -211,44 +211,44 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_819_000 picoseconds. - Weight::from_parts(3_992_000, 0) + // Minimum execution time: 3_798_000 picoseconds. + Weight::from_parts(3_936_000, 0) .saturating_add(T::DbWeight::get().writes(1)) } pub fn burn_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_033_000 picoseconds. - Weight::from_parts(3_157_000, 0) + // Minimum execution time: 2_985_000 picoseconds. + Weight::from_parts(3_099_000, 0) } pub fn expect_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_994_000 picoseconds. - Weight::from_parts(2_056_000, 0) + // Minimum execution time: 1_955_000 picoseconds. + Weight::from_parts(2_050_000, 0) } pub fn expect_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_978_000 picoseconds. - Weight::from_parts(2_069_000, 0) + // Minimum execution time: 1_939_000 picoseconds. + Weight::from_parts(1_990_000, 0) } pub fn expect_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_894_000 picoseconds. - Weight::from_parts(1_977_000, 0) + // Minimum execution time: 1_841_000 picoseconds. + Weight::from_parts(1_900_000, 0) } pub fn expect_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_114_000 picoseconds. - Weight::from_parts(2_223_000, 0) + // Minimum execution time: 2_081_000 picoseconds. + Weight::from_parts(2_145_000, 0) } // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) @@ -270,8 +270,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `171` // Estimated: `6196` - // Minimum execution time: 58_704_000 picoseconds. - Weight::from_parts(59_677_000, 6196) + // Minimum execution time: 59_600_000 picoseconds. + Weight::from_parts(61_572_000, 6196) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -279,8 +279,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_506_000 picoseconds. - Weight::from_parts(4_672_000, 0) + // Minimum execution time: 4_390_000 picoseconds. + Weight::from_parts(4_517_000, 0) } // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) @@ -302,8 +302,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `171` // Estimated: `6196` - // Minimum execution time: 54_896_000 picoseconds. - Weight::from_parts(56_331_000, 6196) + // Minimum execution time: 53_864_000 picoseconds. + Weight::from_parts(55_527_000, 6196) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -311,29 +311,27 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_946_000 picoseconds. - Weight::from_parts(2_002_000, 0) + // Minimum execution time: 1_879_000 picoseconds. + Weight::from_parts(1_947_000, 0) } pub fn set_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_898_000 picoseconds. - Weight::from_parts(1_961_000, 0) + // Minimum execution time: 1_827_000 picoseconds. + Weight::from_parts(1_900_000, 0) } pub fn clear_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_895_000 picoseconds. - Weight::from_parts(1_964_000, 0) + // Minimum execution time: 1_824_000 picoseconds. + Weight::from_parts(1_898_000, 0) } // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) // Storage: `PolkadotXcm::SupportedVersion` (r:2 w:0) // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `BridgeWestendMessages::PalletOperatingMode` (r:1 w:0) // Proof: `BridgeWestendMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) // Storage: `BridgeWestendMessages::OutboundLanes` (r:1 w:1) @@ -347,25 +345,25 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `190` // Estimated: `6130` - // Minimum execution time: 36_547_000 picoseconds. - Weight::from_parts(37_623_117, 6130) - // Standard Error: 735 - .saturating_add(Weight::from_parts(315_274, 0).saturating_mul(x.into())) - .saturating_add(T::DbWeight::get().reads(7)) - .saturating_add(T::DbWeight::get().writes(3)) + // Minimum execution time: 41_598_000 picoseconds. + Weight::from_parts(42_219_173, 6130) + // Standard Error: 426 + .saturating_add(Weight::from_parts(452_460, 0).saturating_mul(x.into())) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(2)) } pub fn set_fees_mode() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_868_000 picoseconds. - Weight::from_parts(1_910_000, 0) + // Minimum execution time: 1_812_000 picoseconds. + Weight::from_parts(1_898_000, 0) } pub fn unpaid_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_998_000 picoseconds. - Weight::from_parts(2_069_000, 0) + // Minimum execution time: 1_915_000 picoseconds. + Weight::from_parts(1_976_000, 0) } } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_grandpa.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_grandpa.rs index b0634ff2ccf..e87ed668dfc 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_grandpa.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_grandpa.rs @@ -17,10 +17,10 @@ //! Autogenerated weights for `pallet_bridge_grandpa` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-10-27, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-12-13, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-vmdtonbz-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-rococo-dev")`, DB CACHE: 1024 +//! HOSTNAME: `runner-itmxxexx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-westend-dev")`, DB CACHE: 1024 // Executed Command: // target/production/polkadot-parachain @@ -33,9 +33,9 @@ // --heap-pages=4096 // --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json // --pallet=pallet_bridge_grandpa -// --chain=bridge-hub-rococo-dev +// --chain=bridge-hub-westend-dev // --header=./cumulus/file_header.txt -// --output=./cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/ +// --output=./cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -62,21 +62,17 @@ impl pallet_bridge_grandpa::WeightInfo for WeightInfo Weight { // Proof Size summary in bytes: - // Measured: `268 + p * (60 ±0)` + // Measured: `231 + p * (60 ±0)` // Estimated: `51735` - // Minimum execution time: 304_726_000 picoseconds. - Weight::from_parts(16_868_060, 0) + // Minimum execution time: 303_549_000 picoseconds. + Weight::from_parts(306_232_000, 0) .saturating_add(Weight::from_parts(0, 51735)) - // Standard Error: 2_802 - .saturating_add(Weight::from_parts(55_200_017, 0).saturating_mul(p.into())) - // Standard Error: 46_745 - .saturating_add(Weight::from_parts(2_689_151, 0).saturating_mul(v.into())) + // Standard Error: 4_641 + .saturating_add(Weight::from_parts(55_196_301, 0).saturating_mul(p.into())) + // Standard Error: 35_813 + .saturating_add(Weight::from_parts(70_584, 0).saturating_mul(v.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(5)) } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_messages.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_messages.rs index 5d229497f3e..305a8726fa1 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_messages.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_messages.rs @@ -17,10 +17,10 @@ //! Autogenerated weights for `pallet_bridge_messages` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-10-26, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-12-13, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-vmdtonbz-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-rococo-dev")`, DB CACHE: 1024 +//! HOSTNAME: `runner-itmxxexx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-westend-dev")`, DB CACHE: 1024 // Executed Command: // target/production/polkadot-parachain @@ -33,9 +33,9 @@ // --heap-pages=4096 // --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json // --pallet=pallet_bridge_messages -// --chain=bridge-hub-rococo-dev +// --chain=bridge-hub-westend-dev // --header=./cumulus/file_header.txt -// --output=./cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/ +// --output=./cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -48,170 +48,170 @@ use core::marker::PhantomData; /// Weight functions for `pallet_bridge_messages`. pub struct WeightInfo(PhantomData); impl pallet_bridge_messages::WeightInfo for WeightInfo { - /// Storage: `BridgeWestendToRococoMessages::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeWestendToRococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoMessages::PalletOperatingMode` (r:1 w:0) + /// Proof: `BridgeRococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:0) /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `BridgeRococoParachain::ImportedParaHeads` (r:1 w:0) - /// Proof: `BridgeRococoParachain::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) - /// Storage: `BridgeWestendToRococoMessages::InboundLanes` (r:1 w:1) - /// Proof: `BridgeWestendToRococoMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoParachains::ImportedParaHeads` (r:1 w:0) + /// Proof: `BridgeRococoParachains::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoMessages::InboundLanes` (r:1 w:1) + /// Proof: `BridgeRococoMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn receive_single_message_proof() -> Weight { // Proof Size summary in bytes: - // Measured: `575` + // Measured: `502` // Estimated: `52645` - // Minimum execution time: 42_332_000 picoseconds. - Weight::from_parts(43_375_000, 0) + // Minimum execution time: 40_646_000 picoseconds. + Weight::from_parts(41_754_000, 0) .saturating_add(Weight::from_parts(0, 52645)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: `BridgeWestendToRococoMessages::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeWestendToRococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoMessages::PalletOperatingMode` (r:1 w:0) + /// Proof: `BridgeRococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:0) /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `BridgeRococoParachain::ImportedParaHeads` (r:1 w:0) - /// Proof: `BridgeRococoParachain::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) - /// Storage: `BridgeWestendToRococoMessages::InboundLanes` (r:1 w:1) - /// Proof: `BridgeWestendToRococoMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoParachains::ImportedParaHeads` (r:1 w:0) + /// Proof: `BridgeRococoParachains::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoMessages::InboundLanes` (r:1 w:1) + /// Proof: `BridgeRococoMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn receive_two_messages_proof() -> Weight { // Proof Size summary in bytes: - // Measured: `575` + // Measured: `502` // Estimated: `52645` - // Minimum execution time: 53_139_000 picoseconds. - Weight::from_parts(54_236_000, 0) + // Minimum execution time: 50_898_000 picoseconds. + Weight::from_parts(52_743_000, 0) .saturating_add(Weight::from_parts(0, 52645)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: `BridgeWestendToRococoMessages::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeWestendToRococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoMessages::PalletOperatingMode` (r:1 w:0) + /// Proof: `BridgeRococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:0) /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `BridgeRococoParachain::ImportedParaHeads` (r:1 w:0) - /// Proof: `BridgeRococoParachain::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) - /// Storage: `BridgeWestendToRococoMessages::InboundLanes` (r:1 w:1) - /// Proof: `BridgeWestendToRococoMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoParachains::ImportedParaHeads` (r:1 w:0) + /// Proof: `BridgeRococoParachains::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoMessages::InboundLanes` (r:1 w:1) + /// Proof: `BridgeRococoMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn receive_single_message_proof_with_outbound_lane_state() -> Weight { // Proof Size summary in bytes: - // Measured: `575` + // Measured: `502` // Estimated: `52645` - // Minimum execution time: 47_466_000 picoseconds. - Weight::from_parts(48_724_000, 0) + // Minimum execution time: 45_848_000 picoseconds. + Weight::from_parts(47_036_000, 0) .saturating_add(Weight::from_parts(0, 52645)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: `BridgeWestendToRococoMessages::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeWestendToRococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoMessages::PalletOperatingMode` (r:1 w:0) + /// Proof: `BridgeRococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:0) /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `BridgeRococoParachain::ImportedParaHeads` (r:1 w:0) - /// Proof: `BridgeRococoParachain::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) - /// Storage: `BridgeWestendToRococoMessages::InboundLanes` (r:1 w:1) - /// Proof: `BridgeWestendToRococoMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoParachains::ImportedParaHeads` (r:1 w:0) + /// Proof: `BridgeRococoParachains::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoMessages::InboundLanes` (r:1 w:1) + /// Proof: `BridgeRococoMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) fn receive_single_message_proof_1_kb() -> Weight { // Proof Size summary in bytes: - // Measured: `543` + // Measured: `433` // Estimated: `52645` - // Minimum execution time: 40_962_000 picoseconds. - Weight::from_parts(42_002_000, 0) + // Minimum execution time: 39_085_000 picoseconds. + Weight::from_parts(41_623_000, 0) .saturating_add(Weight::from_parts(0, 52645)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: `BridgeWestendToRococoMessages::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeWestendToRococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoMessages::PalletOperatingMode` (r:1 w:0) + /// Proof: `BridgeRococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:0) /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `BridgeRococoParachain::ImportedParaHeads` (r:1 w:0) - /// Proof: `BridgeRococoParachain::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) - /// Storage: `BridgeWestendToRococoMessages::InboundLanes` (r:1 w:1) - /// Proof: `BridgeWestendToRococoMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoParachains::ImportedParaHeads` (r:1 w:0) + /// Proof: `BridgeRococoParachains::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoMessages::InboundLanes` (r:1 w:1) + /// Proof: `BridgeRococoMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) fn receive_single_message_proof_16_kb() -> Weight { // Proof Size summary in bytes: - // Measured: `543` + // Measured: `433` // Estimated: `52645` - // Minimum execution time: 71_599_000 picoseconds. - Weight::from_parts(74_307_000, 0) + // Minimum execution time: 72_754_000 picoseconds. + Weight::from_parts(74_985_000, 0) .saturating_add(Weight::from_parts(0, 52645)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: `BridgeWestendToRococoMessages::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeWestendToRococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoParachain::ImportedParaHeads` (r:1 w:0) - /// Proof: `BridgeRococoParachain::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) - /// Storage: `BridgeWestendToRococoMessages::OutboundLanes` (r:1 w:1) - /// Proof: `BridgeWestendToRococoMessages::OutboundLanes` (`max_values`: Some(1), `max_size`: Some(44), added: 539, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoMessages::PalletOperatingMode` (r:1 w:0) + /// Proof: `BridgeRococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoParachains::ImportedParaHeads` (r:1 w:0) + /// Proof: `BridgeRococoParachains::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoMessages::OutboundLanes` (r:1 w:1) + /// Proof: `BridgeRococoMessages::OutboundLanes` (`max_values`: Some(1), `max_size`: Some(44), added: 539, mode: `MaxEncodedLen`) /// Storage: UNKNOWN KEY `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) /// Proof: UNKNOWN KEY `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) /// Storage: `BridgeRelayers::RelayerRewards` (r:1 w:1) /// Proof: `BridgeRelayers::RelayerRewards` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) fn receive_delivery_proof_for_single_message() -> Weight { // Proof Size summary in bytes: - // Measured: `414` - // Estimated: `3879` - // Minimum execution time: 31_206_000 picoseconds. - Weight::from_parts(32_045_000, 0) - .saturating_add(Weight::from_parts(0, 3879)) + // Measured: `337` + // Estimated: `3802` + // Minimum execution time: 31_479_000 picoseconds. + Weight::from_parts(32_280_000, 0) + .saturating_add(Weight::from_parts(0, 3802)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: `BridgeWestendToRococoMessages::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeWestendToRococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoParachain::ImportedParaHeads` (r:1 w:0) - /// Proof: `BridgeRococoParachain::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) - /// Storage: `BridgeWestendToRococoMessages::OutboundLanes` (r:1 w:1) - /// Proof: `BridgeWestendToRococoMessages::OutboundLanes` (`max_values`: Some(1), `max_size`: Some(44), added: 539, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoMessages::PalletOperatingMode` (r:1 w:0) + /// Proof: `BridgeRococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoParachains::ImportedParaHeads` (r:1 w:0) + /// Proof: `BridgeRococoParachains::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoMessages::OutboundLanes` (r:1 w:1) + /// Proof: `BridgeRococoMessages::OutboundLanes` (`max_values`: Some(1), `max_size`: Some(44), added: 539, mode: `MaxEncodedLen`) /// Storage: UNKNOWN KEY `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) /// Proof: UNKNOWN KEY `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) /// Storage: `BridgeRelayers::RelayerRewards` (r:1 w:1) /// Proof: `BridgeRelayers::RelayerRewards` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) fn receive_delivery_proof_for_two_messages_by_single_relayer() -> Weight { // Proof Size summary in bytes: - // Measured: `414` - // Estimated: `3879` - // Minimum execution time: 31_211_000 picoseconds. - Weight::from_parts(32_171_000, 0) - .saturating_add(Weight::from_parts(0, 3879)) + // Measured: `337` + // Estimated: `3802` + // Minimum execution time: 31_807_000 picoseconds. + Weight::from_parts(32_219_000, 0) + .saturating_add(Weight::from_parts(0, 3802)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: `BridgeWestendToRococoMessages::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeWestendToRococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoParachain::ImportedParaHeads` (r:1 w:0) - /// Proof: `BridgeRococoParachain::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) - /// Storage: `BridgeWestendToRococoMessages::OutboundLanes` (r:1 w:1) - /// Proof: `BridgeWestendToRococoMessages::OutboundLanes` (`max_values`: Some(1), `max_size`: Some(44), added: 539, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoMessages::PalletOperatingMode` (r:1 w:0) + /// Proof: `BridgeRococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoParachains::ImportedParaHeads` (r:1 w:0) + /// Proof: `BridgeRococoParachains::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoMessages::OutboundLanes` (r:1 w:1) + /// Proof: `BridgeRococoMessages::OutboundLanes` (`max_values`: Some(1), `max_size`: Some(44), added: 539, mode: `MaxEncodedLen`) /// Storage: UNKNOWN KEY `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) /// Proof: UNKNOWN KEY `0x6e0a18b62a1de81c5f519181cc611e18` (r:1 w:0) /// Storage: `BridgeRelayers::RelayerRewards` (r:2 w:2) /// Proof: `BridgeRelayers::RelayerRewards` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) fn receive_delivery_proof_for_two_messages_by_two_relayers() -> Weight { // Proof Size summary in bytes: - // Measured: `414` + // Measured: `337` // Estimated: `6086` - // Minimum execution time: 33_790_000 picoseconds. - Weight::from_parts(34_708_000, 0) + // Minimum execution time: 36_450_000 picoseconds. + Weight::from_parts(37_288_000, 0) .saturating_add(Weight::from_parts(0, 6086)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(3)) } - /// Storage: `BridgeWestendToRococoMessages::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeWestendToRococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoMessages::PalletOperatingMode` (r:1 w:0) + /// Proof: `BridgeRococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:1) /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: `BridgeRococoParachain::ImportedParaHeads` (r:1 w:0) - /// Proof: `BridgeRococoParachain::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) - /// Storage: `BridgeWestendToRococoMessages::InboundLanes` (r:1 w:1) - /// Proof: `BridgeWestendToRococoMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoParachains::ImportedParaHeads` (r:1 w:0) + /// Proof: `BridgeRococoParachains::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoMessages::InboundLanes` (r:1 w:1) + /// Proof: `BridgeRococoMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) /// Storage: `XcmpQueue::DeliveryFeeFactor` (r:1 w:0) @@ -227,18 +227,15 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Storage: `XcmpQueue::OutboundXcmpMessages` (r:0 w:1) /// Proof: `XcmpQueue::OutboundXcmpMessages` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `i` is `[128, 2048]`. - /// The range of component `i` is `[128, 2048]`. - /// The range of component `i` is `[128, 2048]`. - /// The range of component `i` is `[128, 2048]`. fn receive_single_message_proof_with_dispatch(i: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `777` + // Measured: `633` // Estimated: `52645` - // Minimum execution time: 61_938_000 picoseconds. - Weight::from_parts(63_009_714, 0) + // Minimum execution time: 67_047_000 picoseconds. + Weight::from_parts(68_717_105, 0) .saturating_add(Weight::from_parts(0, 52645)) - // Standard Error: 23 - .saturating_add(Weight::from_parts(6_677, 0).saturating_mul(i.into())) + // Standard Error: 138 + .saturating_add(Weight::from_parts(8_056, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().reads(10)) .saturating_add(T::DbWeight::get().writes(4)) } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_parachains.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_parachains.rs index 81cb0a66b7d..9819bd40654 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_parachains.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_parachains.rs @@ -17,10 +17,10 @@ //! Autogenerated weights for `pallet_bridge_parachains` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-10-26, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-12-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-vmdtonbz-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-rococo-dev")`, DB CACHE: 1024 +//! HOSTNAME: `runner-itmxxexx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-westend-dev")`, DB CACHE: 1024 // Executed Command: // target/production/polkadot-parachain @@ -33,9 +33,9 @@ // --heap-pages=4096 // --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json // --pallet=pallet_bridge_parachains -// --chain=bridge-hub-rococo-dev +// --chain=bridge-hub-westend-dev // --header=./cumulus/file_header.txt -// --output=./cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/ +// --output=./cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -48,65 +48,63 @@ use core::marker::PhantomData; /// Weight functions for `pallet_bridge_parachains`. pub struct WeightInfo(PhantomData); impl pallet_bridge_parachains::WeightInfo for WeightInfo { - /// Storage: `BridgeRococoParachain::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeRococoParachain::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoParachains::PalletOperatingMode` (r:1 w:0) + /// Proof: `BridgeRococoParachains::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) /// Storage: `BridgeRococoGrandpa::ImportedHeaders` (r:1 w:0) /// Proof: `BridgeRococoGrandpa::ImportedHeaders` (`max_values`: Some(1024), `max_size`: Some(68), added: 1553, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoParachain::ParasInfo` (r:1 w:1) - /// Proof: `BridgeRococoParachain::ParasInfo` (`max_values`: Some(1), `max_size`: Some(60), added: 555, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoParachain::ImportedParaHashes` (r:1 w:1) - /// Proof: `BridgeRococoParachain::ImportedParaHashes` (`max_values`: Some(64), `max_size`: Some(64), added: 1054, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoParachain::ImportedParaHeads` (r:0 w:1) - /// Proof: `BridgeRococoParachain::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) - /// The range of component `p` is `[1, 2]`. - /// The range of component `p` is `[1, 2]`. + /// Storage: `BridgeRococoParachains::ParasInfo` (r:1 w:1) + /// Proof: `BridgeRococoParachains::ParasInfo` (`max_values`: Some(1), `max_size`: Some(60), added: 555, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoParachains::ImportedParaHashes` (r:1 w:1) + /// Proof: `BridgeRococoParachains::ImportedParaHashes` (`max_values`: Some(64), `max_size`: Some(64), added: 1054, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoParachains::ImportedParaHeads` (r:0 w:1) + /// Proof: `BridgeRococoParachains::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) /// The range of component `p` is `[1, 2]`. fn submit_parachain_heads_with_n_parachains(_p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `367` + // Measured: `291` // Estimated: `2543` - // Minimum execution time: 31_241_000 picoseconds. - Weight::from_parts(32_488_584, 0) + // Minimum execution time: 29_994_000 picoseconds. + Weight::from_parts(31_005_636, 0) .saturating_add(Weight::from_parts(0, 2543)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(3)) } - /// Storage: `BridgeRococoParachain::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeRococoParachain::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoParachains::PalletOperatingMode` (r:1 w:0) + /// Proof: `BridgeRococoParachains::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) /// Storage: `BridgeRococoGrandpa::ImportedHeaders` (r:1 w:0) /// Proof: `BridgeRococoGrandpa::ImportedHeaders` (`max_values`: Some(1024), `max_size`: Some(68), added: 1553, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoParachain::ParasInfo` (r:1 w:1) - /// Proof: `BridgeRococoParachain::ParasInfo` (`max_values`: Some(1), `max_size`: Some(60), added: 555, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoParachain::ImportedParaHashes` (r:1 w:1) - /// Proof: `BridgeRococoParachain::ImportedParaHashes` (`max_values`: Some(64), `max_size`: Some(64), added: 1054, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoParachain::ImportedParaHeads` (r:0 w:1) - /// Proof: `BridgeRococoParachain::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoParachains::ParasInfo` (r:1 w:1) + /// Proof: `BridgeRococoParachains::ParasInfo` (`max_values`: Some(1), `max_size`: Some(60), added: 555, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoParachains::ImportedParaHashes` (r:1 w:1) + /// Proof: `BridgeRococoParachains::ImportedParaHashes` (`max_values`: Some(64), `max_size`: Some(64), added: 1054, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoParachains::ImportedParaHeads` (r:0 w:1) + /// Proof: `BridgeRococoParachains::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) fn submit_parachain_heads_with_1kb_proof() -> Weight { // Proof Size summary in bytes: - // Measured: `367` + // Measured: `291` // Estimated: `2543` - // Minimum execution time: 32_962_000 picoseconds. - Weight::from_parts(33_658_000, 0) + // Minimum execution time: 31_425_000 picoseconds. + Weight::from_parts(32_163_000, 0) .saturating_add(Weight::from_parts(0, 2543)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(3)) } - /// Storage: `BridgeRococoParachain::PalletOperatingMode` (r:1 w:0) - /// Proof: `BridgeRococoParachain::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoParachains::PalletOperatingMode` (r:1 w:0) + /// Proof: `BridgeRococoParachains::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(1), added: 496, mode: `MaxEncodedLen`) /// Storage: `BridgeRococoGrandpa::ImportedHeaders` (r:1 w:0) /// Proof: `BridgeRococoGrandpa::ImportedHeaders` (`max_values`: Some(1024), `max_size`: Some(68), added: 1553, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoParachain::ParasInfo` (r:1 w:1) - /// Proof: `BridgeRococoParachain::ParasInfo` (`max_values`: Some(1), `max_size`: Some(60), added: 555, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoParachain::ImportedParaHashes` (r:1 w:1) - /// Proof: `BridgeRococoParachain::ImportedParaHashes` (`max_values`: Some(64), `max_size`: Some(64), added: 1054, mode: `MaxEncodedLen`) - /// Storage: `BridgeRococoParachain::ImportedParaHeads` (r:0 w:1) - /// Proof: `BridgeRococoParachain::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoParachains::ParasInfo` (r:1 w:1) + /// Proof: `BridgeRococoParachains::ParasInfo` (`max_values`: Some(1), `max_size`: Some(60), added: 555, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoParachains::ImportedParaHashes` (r:1 w:1) + /// Proof: `BridgeRococoParachains::ImportedParaHashes` (`max_values`: Some(64), `max_size`: Some(64), added: 1054, mode: `MaxEncodedLen`) + /// Storage: `BridgeRococoParachains::ImportedParaHeads` (r:0 w:1) + /// Proof: `BridgeRococoParachains::ImportedParaHeads` (`max_values`: Some(64), `max_size`: Some(196), added: 1186, mode: `MaxEncodedLen`) fn submit_parachain_heads_with_16kb_proof() -> Weight { // Proof Size summary in bytes: - // Measured: `367` + // Measured: `291` // Estimated: `2543` - // Minimum execution time: 62_685_000 picoseconds. - Weight::from_parts(64_589_000, 0) + // Minimum execution time: 60_062_000 picoseconds. + Weight::from_parts(61_201_000, 0) .saturating_add(Weight::from_parts(0, 2543)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(3)) diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_relayers.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_relayers.rs index fde670ab927..ed96f0cd87c 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_relayers.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/pallet_bridge_relayers.rs @@ -17,10 +17,10 @@ //! Autogenerated weights for `pallet_bridge_relayers` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-10-26, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-12-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-vmdtonbz-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-rococo-dev")`, DB CACHE: 1024 +//! HOSTNAME: `runner-itmxxexx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-westend-dev")`, DB CACHE: 1024 // Executed Command: // target/production/polkadot-parachain @@ -33,9 +33,9 @@ // --heap-pages=4096 // --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json // --pallet=pallet_bridge_relayers -// --chain=bridge-hub-rococo-dev +// --chain=bridge-hub-westend-dev // --header=./cumulus/file_header.txt -// --output=./cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/ +// --output=./cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/ #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -56,8 +56,8 @@ impl pallet_bridge_relayers::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `207` // Estimated: `3593` - // Minimum execution time: 45_338_000 picoseconds. - Weight::from_parts(45_836_000, 0) + // Minimum execution time: 45_732_000 picoseconds. + Weight::from_parts(46_282_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -72,8 +72,8 @@ impl pallet_bridge_relayers::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `61` // Estimated: `4714` - // Minimum execution time: 23_561_000 picoseconds. - Weight::from_parts(24_012_000, 0) + // Minimum execution time: 22_934_000 picoseconds. + Weight::from_parts(23_531_000, 0) .saturating_add(Weight::from_parts(0, 4714)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) @@ -86,8 +86,8 @@ impl pallet_bridge_relayers::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `160` // Estimated: `4714` - // Minimum execution time: 25_133_000 picoseconds. - Weight::from_parts(25_728_000, 0) + // Minimum execution time: 25_187_000 picoseconds. + Weight::from_parts(25_679_000, 0) .saturating_add(Weight::from_parts(0, 4714)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -102,8 +102,8 @@ impl pallet_bridge_relayers::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `263` // Estimated: `4714` - // Minimum execution time: 27_356_000 picoseconds. - Weight::from_parts(27_828_000, 0) + // Minimum execution time: 27_015_000 picoseconds. + Weight::from_parts(27_608_000, 0) .saturating_add(Weight::from_parts(0, 4714)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) @@ -114,8 +114,8 @@ impl pallet_bridge_relayers::WeightInfo for WeightInfo< // Proof Size summary in bytes: // Measured: `6` // Estimated: `3538` - // Minimum execution time: 2_955_000 picoseconds. - Weight::from_parts(3_084_000, 0) + // Minimum execution time: 5_207_000 picoseconds. + Weight::from_parts(5_394_000, 0) .saturating_add(Weight::from_parts(0, 3538)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index 8f283403400..9281a880c7e 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -17,9 +17,9 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::generic` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-11-29, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-12-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-r43aesjn-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-itmxxexx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-westend-dev"), DB CACHE: 1024 // Executed Command: @@ -66,10 +66,10 @@ impl WeightInfo { // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) pub fn report_holding() -> Weight { // Proof Size summary in bytes: - // Measured: `171` + // Measured: `208` // Estimated: `6196` - // Minimum execution time: 61_383_000 picoseconds. - Weight::from_parts(62_382_000, 6196) + // Minimum execution time: 61_577_000 picoseconds. + Weight::from_parts(63_216_000, 6196) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -77,8 +77,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_057_000 picoseconds. - Weight::from_parts(2_153_000, 0) + // Minimum execution time: 2_019_000 picoseconds. + Weight::from_parts(2_146_000, 0) } // Storage: `PolkadotXcm::Queries` (r:1 w:0) // Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) @@ -86,58 +86,58 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `32` // Estimated: `3497` - // Minimum execution time: 7_949_000 picoseconds. - Weight::from_parts(8_250_000, 3497) + // Minimum execution time: 7_473_000 picoseconds. + Weight::from_parts(7_784_000, 3497) .saturating_add(T::DbWeight::get().reads(1)) } pub fn transact() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_608_000 picoseconds. - Weight::from_parts(9_086_000, 0) + // Minimum execution time: 8_385_000 picoseconds. + Weight::from_parts(8_768_000, 0) } pub fn refund_surplus() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_240_000 picoseconds. - Weight::from_parts(2_348_000, 0) + // Minimum execution time: 2_181_000 picoseconds. + Weight::from_parts(2_304_000, 0) } pub fn set_error_handler() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_969_000 picoseconds. - Weight::from_parts(2_017_000, 0) + // Minimum execution time: 1_858_000 picoseconds. + Weight::from_parts(1_919_000, 0) } pub fn set_appendix() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_907_000 picoseconds. - Weight::from_parts(2_001_000, 0) + // Minimum execution time: 1_855_000 picoseconds. + Weight::from_parts(1_979_000, 0) } pub fn clear_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_880_000 picoseconds. - Weight::from_parts(1_975_000, 0) + // Minimum execution time: 1_823_000 picoseconds. + Weight::from_parts(1_890_000, 0) } pub fn descend_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_549_000 picoseconds. - Weight::from_parts(2_624_000, 0) + // Minimum execution time: 2_407_000 picoseconds. + Weight::from_parts(2_507_000, 0) } pub fn clear_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_895_000 picoseconds. - Weight::from_parts(1_963_000, 0) + // Minimum execution time: 1_838_000 picoseconds. + Weight::from_parts(1_894_000, 0) } // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) @@ -157,10 +157,10 @@ impl WeightInfo { // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) pub fn report_error() -> Weight { // Proof Size summary in bytes: - // Measured: `171` + // Measured: `208` // Estimated: `6196` - // Minimum execution time: 54_447_000 picoseconds. - Weight::from_parts(55_629_000, 6196) + // Minimum execution time: 54_847_000 picoseconds. + Weight::from_parts(55_742_000, 6196) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -170,8 +170,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `90` // Estimated: `3555` - // Minimum execution time: 11_597_000 picoseconds. - Weight::from_parts(11_809_000, 3555) + // Minimum execution time: 10_614_000 picoseconds. + Weight::from_parts(11_344_000, 3555) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -179,8 +179,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_895_000 picoseconds. - Weight::from_parts(1_977_000, 0) + // Minimum execution time: 1_826_000 picoseconds. + Weight::from_parts(1_899_000, 0) } // Storage: `PolkadotXcm::VersionNotifyTargets` (r:1 w:1) // Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) @@ -200,8 +200,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `38` // Estimated: `3503` - // Minimum execution time: 23_314_000 picoseconds. - Weight::from_parts(23_905_000, 3503) + // Minimum execution time: 22_312_000 picoseconds. + Weight::from_parts(22_607_000, 3503) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -211,44 +211,44 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_948_000 picoseconds. - Weight::from_parts(4_084_000, 0) + // Minimum execution time: 3_728_000 picoseconds. + Weight::from_parts(3_914_000, 0) .saturating_add(T::DbWeight::get().writes(1)) } pub fn burn_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_196_000 picoseconds. - Weight::from_parts(3_285_000, 0) + // Minimum execution time: 3_054_000 picoseconds. + Weight::from_parts(3_140_000, 0) } pub fn expect_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_040_000 picoseconds. - Weight::from_parts(2_162_000, 0) + // Minimum execution time: 1_996_000 picoseconds. + Weight::from_parts(2_148_000, 0) } pub fn expect_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_980_000 picoseconds. - Weight::from_parts(2_082_000, 0) + // Minimum execution time: 2_008_000 picoseconds. + Weight::from_parts(2_077_000, 0) } pub fn expect_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_890_000 picoseconds. - Weight::from_parts(1_971_000, 0) + // Minimum execution time: 1_837_000 picoseconds. + Weight::from_parts(1_913_000, 0) } pub fn expect_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_131_000 picoseconds. - Weight::from_parts(2_187_000, 0) + // Minimum execution time: 2_052_000 picoseconds. + Weight::from_parts(2_120_000, 0) } // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) @@ -268,10 +268,10 @@ impl WeightInfo { // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) pub fn query_pallet() -> Weight { // Proof Size summary in bytes: - // Measured: `171` + // Measured: `208` // Estimated: `6196` - // Minimum execution time: 59_548_000 picoseconds. - Weight::from_parts(60_842_000, 6196) + // Minimum execution time: 58_725_000 picoseconds. + Weight::from_parts(60_271_000, 6196) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -279,8 +279,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_665_000 picoseconds. - Weight::from_parts(4_844_000, 0) + // Minimum execution time: 4_570_000 picoseconds. + Weight::from_parts(4_707_000, 0) } // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) @@ -300,10 +300,10 @@ impl WeightInfo { // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) pub fn report_transact_status() -> Weight { // Proof Size summary in bytes: - // Measured: `171` + // Measured: `208` // Estimated: `6196` - // Minimum execution time: 55_044_000 picoseconds. - Weight::from_parts(56_103_000, 6196) + // Minimum execution time: 54_903_000 picoseconds. + Weight::from_parts(55_711_000, 6196) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) } @@ -311,29 +311,27 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_904_000 picoseconds. - Weight::from_parts(1_984_000, 0) + // Minimum execution time: 1_872_000 picoseconds. + Weight::from_parts(1_938_000, 0) } pub fn set_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_889_000 picoseconds. - Weight::from_parts(1_950_000, 0) + // Minimum execution time: 1_836_000 picoseconds. + Weight::from_parts(1_903_000, 0) } pub fn clear_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_878_000 picoseconds. - Weight::from_parts(1_963_000, 0) + // Minimum execution time: 1_847_000 picoseconds. + Weight::from_parts(1_900_000, 0) } // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) // Storage: `PolkadotXcm::SupportedVersion` (r:2 w:0) // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) - // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `BridgeRococoMessages::PalletOperatingMode` (r:1 w:0) // Proof: `BridgeRococoMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) // Storage: `BridgeRococoMessages::OutboundLanes` (r:1 w:1) @@ -345,27 +343,27 @@ impl WeightInfo { /// The range of component `x` is `[1, 1000]`. pub fn export_message(x: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `188` - // Estimated: `6128` - // Minimum execution time: 36_960_000 picoseconds. - Weight::from_parts(38_104_333, 6128) - // Standard Error: 510 - .saturating_add(Weight::from_parts(316_499, 0).saturating_mul(x.into())) - .saturating_add(T::DbWeight::get().reads(7)) - .saturating_add(T::DbWeight::get().writes(3)) + // Measured: `225` + // Estimated: `6165` + // Minimum execution time: 41_750_000 picoseconds. + Weight::from_parts(43_496_915, 6165) + // Standard Error: 623 + .saturating_add(Weight::from_parts(457_907, 0).saturating_mul(x.into())) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(2)) } pub fn set_fees_mode() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_833_000 picoseconds. - Weight::from_parts(1_950_000, 0) + // Minimum execution time: 1_826_000 picoseconds. + Weight::from_parts(1_911_000, 0) } pub fn unpaid_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 1_980_000 picoseconds. - Weight::from_parts(2_065_000, 0) + // Minimum execution time: 1_967_000 picoseconds. + Weight::from_parts(2_096_000, 0) } } -- GitLab From be8e626806eafa8aa5b980d387bb0086d80accc2 Mon Sep 17 00:00:00 2001 From: Squirrel Date: Wed, 13 Dec 2023 14:11:07 +0000 Subject: [PATCH 025/191] Set clippy lints in workspace (requires rust 1.74) (#2390) We currently use a bit of a hack in `.cargo/config` to make sure that clippy isn't too annoying by specifying the list of lints. There is now a stable way to define lints for a workspace. The only down side is that every crate seems to have to opt into this so there's a *few* files modified in this PR. Dependencies: - [x] PR that upgrades CI to use rust 1.74 is merged. --------- Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> Co-authored-by: Branislav Kontur Co-authored-by: Liam Aharon --- .cargo/config.toml | 34 ------------------- .config/taplo.toml | 2 +- .gitlab/pipeline/check.yml | 4 ++- Cargo.toml | 28 +++++++++++++++ bridges/bin/runtime-common/Cargo.toml | 3 ++ bridges/modules/grandpa/Cargo.toml | 3 ++ bridges/modules/messages/Cargo.toml | 3 ++ bridges/modules/parachains/Cargo.toml | 3 ++ bridges/modules/relayers/Cargo.toml | 3 ++ .../modules/xcm-bridge-hub-router/Cargo.toml | 3 ++ bridges/modules/xcm-bridge-hub/Cargo.toml | 3 ++ .../chain-asset-hub-rococo/Cargo.toml | 3 ++ .../chain-asset-hub-westend/Cargo.toml | 3 ++ .../chain-bridge-hub-cumulus/Cargo.toml | 3 ++ .../chain-bridge-hub-kusama/Cargo.toml | 3 ++ .../chain-bridge-hub-polkadot/Cargo.toml | 3 ++ .../chain-bridge-hub-rococo/Cargo.toml | 3 ++ .../chain-bridge-hub-westend/Cargo.toml | 3 ++ bridges/primitives/chain-kusama/Cargo.toml | 3 ++ .../chain-polkadot-bulletin/Cargo.toml | 3 ++ bridges/primitives/chain-polkadot/Cargo.toml | 3 ++ bridges/primitives/chain-rococo/Cargo.toml | 3 ++ bridges/primitives/chain-westend/Cargo.toml | 3 ++ bridges/primitives/header-chain/Cargo.toml | 3 ++ bridges/primitives/messages/Cargo.toml | 3 ++ bridges/primitives/parachains/Cargo.toml | 3 ++ bridges/primitives/polkadot-core/Cargo.toml | 3 ++ bridges/primitives/relayers/Cargo.toml | 3 ++ bridges/primitives/runtime/Cargo.toml | 3 ++ bridges/primitives/test-utils/Cargo.toml | 3 ++ .../xcm-bridge-hub-router/Cargo.toml | 3 ++ bridges/primitives/xcm-bridge-hub/Cargo.toml | 3 ++ cumulus/client/cli/Cargo.toml | 3 ++ cumulus/client/collator/Cargo.toml | 3 ++ cumulus/client/consensus/aura/Cargo.toml | 3 ++ cumulus/client/consensus/common/Cargo.toml | 3 ++ cumulus/client/consensus/proposer/Cargo.toml | 3 ++ .../client/consensus/relay-chain/Cargo.toml | 3 ++ cumulus/client/network/Cargo.toml | 3 ++ cumulus/client/pov-recovery/Cargo.toml | 3 ++ .../Cargo.toml | 3 ++ .../client/relay-chain-interface/Cargo.toml | 3 ++ .../relay-chain-minimal-node/Cargo.toml | 3 ++ .../relay-chain-rpc-interface/Cargo.toml | 2 ++ cumulus/client/service/Cargo.toml | 3 ++ cumulus/pallets/aura-ext/Cargo.toml | 3 ++ cumulus/pallets/collator-selection/Cargo.toml | 3 ++ cumulus/pallets/dmp-queue/Cargo.toml | 3 ++ cumulus/pallets/parachain-system/Cargo.toml | 3 ++ .../parachain-system/proc-macro/Cargo.toml | 3 ++ .../pallets/session-benchmarking/Cargo.toml | 3 ++ cumulus/pallets/solo-to-para/Cargo.toml | 3 ++ cumulus/pallets/xcm/Cargo.toml | 3 ++ cumulus/pallets/xcmp-queue/Cargo.toml | 3 ++ cumulus/parachain-template/node/Cargo.toml | 3 ++ .../pallets/template/Cargo.toml | 3 ++ cumulus/parachain-template/runtime/Cargo.toml | 3 ++ cumulus/parachains/common/Cargo.toml | 3 ++ .../assets/asset-hub-rococo/Cargo.toml | 3 ++ .../assets/asset-hub-westend/Cargo.toml | 3 ++ .../bridges/bridge-hub-rococo/Cargo.toml | 3 ++ .../bridges/bridge-hub-westend/Cargo.toml | 3 ++ .../collectives-westend/Cargo.toml | 3 ++ .../parachains/testing/penpal/Cargo.toml | 3 ++ .../emulated/chains/relays/rococo/Cargo.toml | 3 ++ .../emulated/chains/relays/westend/Cargo.toml | 3 ++ .../emulated/common/Cargo.toml | 3 ++ .../networks/rococo-system/Cargo.toml | 3 ++ .../networks/rococo-westend-system/Cargo.toml | 3 ++ .../networks/westend-system/Cargo.toml | 3 ++ .../tests/assets/asset-hub-rococo/Cargo.toml | 3 ++ .../tests/assets/asset-hub-westend/Cargo.toml | 3 ++ .../bridges/bridge-hub-rococo/Cargo.toml | 3 ++ .../bridges/bridge-hub-westend/Cargo.toml | 3 ++ .../pallets/collective-content/Cargo.toml | 3 ++ .../pallets/parachain-info/Cargo.toml | 3 ++ cumulus/parachains/pallets/ping/Cargo.toml | 3 ++ .../assets/asset-hub-rococo/Cargo.toml | 3 ++ .../assets/asset-hub-westend/Cargo.toml | 3 ++ .../runtimes/assets/common/Cargo.toml | 3 ++ .../runtimes/assets/test-utils/Cargo.toml | 3 ++ .../bridge-hubs/bridge-hub-rococo/Cargo.toml | 3 ++ .../bridge-hubs/bridge-hub-westend/Cargo.toml | 3 ++ .../bridge-hubs/test-utils/Cargo.toml | 3 ++ .../collectives-westend/Cargo.toml | 3 ++ .../contracts/contracts-rococo/Cargo.toml | 3 ++ .../glutton/glutton-westend/Cargo.toml | 3 ++ .../runtimes/starters/seedling/Cargo.toml | 3 ++ .../runtimes/starters/shell/Cargo.toml | 3 ++ .../parachains/runtimes/test-utils/Cargo.toml | 3 ++ .../runtimes/testing/penpal/Cargo.toml | 3 ++ .../testing/rococo-parachain/Cargo.toml | 3 ++ cumulus/polkadot-parachain/Cargo.toml | 3 ++ cumulus/primitives/aura/Cargo.toml | 3 ++ cumulus/primitives/core/Cargo.toml | 3 ++ .../primitives/parachain-inherent/Cargo.toml | 3 ++ .../proof-size-hostfunction/Cargo.toml | 3 ++ cumulus/primitives/timestamp/Cargo.toml | 3 ++ cumulus/primitives/utility/Cargo.toml | 3 ++ cumulus/test/client/Cargo.toml | 3 ++ cumulus/test/relay-sproof-builder/Cargo.toml | 3 ++ cumulus/test/runtime/Cargo.toml | 3 ++ cumulus/test/service/Cargo.toml | 3 ++ cumulus/xcm/xcm-emulator/Cargo.toml | 3 ++ docs/sdk/Cargo.toml | 3 ++ polkadot/Cargo.toml | 3 ++ polkadot/cli/Cargo.toml | 3 ++ polkadot/core-primitives/Cargo.toml | 3 ++ polkadot/erasure-coding/Cargo.toml | 3 ++ polkadot/erasure-coding/fuzzer/Cargo.toml | 3 ++ polkadot/node/collation-generation/Cargo.toml | 3 ++ polkadot/node/core/approval-voting/Cargo.toml | 3 ++ polkadot/node/core/av-store/Cargo.toml | 3 ++ polkadot/node/core/backing/Cargo.toml | 3 ++ .../node/core/bitfield-signing/Cargo.toml | 3 ++ .../node/core/candidate-validation/Cargo.toml | 3 ++ polkadot/node/core/chain-api/Cargo.toml | 3 ++ polkadot/node/core/chain-selection/Cargo.toml | 3 ++ .../node/core/dispute-coordinator/Cargo.toml | 3 ++ .../node/core/parachains-inherent/Cargo.toml | 3 ++ .../core/prospective-parachains/Cargo.toml | 3 ++ polkadot/node/core/provisioner/Cargo.toml | 3 ++ polkadot/node/core/pvf-checker/Cargo.toml | 3 ++ polkadot/node/core/pvf/Cargo.toml | 3 ++ .../benches/host_prepare_rococo_runtime.rs | 3 +- polkadot/node/core/pvf/common/Cargo.toml | 3 ++ .../node/core/pvf/execute-worker/Cargo.toml | 3 ++ .../node/core/pvf/prepare-worker/Cargo.toml | 3 ++ polkadot/node/core/runtime-api/Cargo.toml | 3 ++ polkadot/node/gum/Cargo.toml | 3 ++ polkadot/node/gum/proc-macro/Cargo.toml | 3 ++ polkadot/node/jaeger/Cargo.toml | 3 ++ polkadot/node/malus/Cargo.toml | 3 ++ polkadot/node/metrics/Cargo.toml | 3 ++ .../network/approval-distribution/Cargo.toml | 3 ++ .../availability-distribution/Cargo.toml | 3 ++ .../network/availability-recovery/Cargo.toml | 3 ++ .../network/bitfield-distribution/Cargo.toml | 3 ++ polkadot/node/network/bridge/Cargo.toml | 3 ++ .../node/network/collator-protocol/Cargo.toml | 3 ++ .../network/dispute-distribution/Cargo.toml | 3 ++ .../node/network/gossip-support/Cargo.toml | 3 ++ polkadot/node/network/protocol/Cargo.toml | 3 ++ .../network/statement-distribution/Cargo.toml | 3 ++ polkadot/node/overseer/Cargo.toml | 3 ++ polkadot/node/primitives/Cargo.toml | 3 ++ polkadot/node/service/Cargo.toml | 3 ++ .../node/subsystem-test-helpers/Cargo.toml | 3 ++ polkadot/node/subsystem-types/Cargo.toml | 3 ++ polkadot/node/subsystem-util/Cargo.toml | 3 ++ polkadot/node/subsystem/Cargo.toml | 3 ++ polkadot/node/test/client/Cargo.toml | 3 ++ polkadot/node/test/service/Cargo.toml | 3 ++ polkadot/node/tracking-allocator/Cargo.toml | 3 ++ .../node/zombienet-backchannel/Cargo.toml | 3 ++ polkadot/parachain/Cargo.toml | 3 ++ polkadot/parachain/test-parachains/Cargo.toml | 3 ++ .../test-parachains/adder/Cargo.toml | 3 ++ .../test-parachains/adder/collator/Cargo.toml | 3 ++ .../parachain/test-parachains/halt/Cargo.toml | 3 ++ .../test-parachains/undying/Cargo.toml | 3 ++ .../undying/collator/Cargo.toml | 3 ++ polkadot/primitives/Cargo.toml | 3 ++ polkadot/primitives/test-helpers/Cargo.toml | 3 ++ polkadot/rpc/Cargo.toml | 3 ++ polkadot/runtime/common/Cargo.toml | 3 ++ .../common/slot_range_helper/Cargo.toml | 3 ++ polkadot/runtime/metrics/Cargo.toml | 3 ++ polkadot/runtime/parachains/Cargo.toml | 3 ++ polkadot/runtime/rococo/Cargo.toml | 3 ++ polkadot/runtime/rococo/constants/Cargo.toml | 3 ++ polkadot/runtime/test-runtime/Cargo.toml | 3 ++ .../runtime/test-runtime/constants/Cargo.toml | 3 ++ polkadot/runtime/westend/Cargo.toml | 3 ++ polkadot/runtime/westend/constants/Cargo.toml | 3 ++ polkadot/statement-table/Cargo.toml | 3 ++ polkadot/utils/generate-bags/Cargo.toml | 3 ++ .../remote-ext-tests/bags-list/Cargo.toml | 3 ++ polkadot/xcm/Cargo.toml | 3 ++ polkadot/xcm/pallet-xcm-benchmarks/Cargo.toml | 3 ++ polkadot/xcm/pallet-xcm/Cargo.toml | 3 ++ polkadot/xcm/procedural/Cargo.toml | 3 ++ polkadot/xcm/xcm-builder/Cargo.toml | 3 ++ polkadot/xcm/xcm-executor/Cargo.toml | 3 ++ .../xcm-executor/integration-tests/Cargo.toml | 3 ++ polkadot/xcm/xcm-simulator/Cargo.toml | 3 ++ polkadot/xcm/xcm-simulator/example/Cargo.toml | 3 ++ polkadot/xcm/xcm-simulator/fuzzer/Cargo.toml | 3 ++ substrate/bin/minimal/node/Cargo.toml | 3 ++ substrate/bin/minimal/runtime/Cargo.toml | 3 ++ substrate/bin/node-template/node/Cargo.toml | 3 ++ .../node-template/pallets/template/Cargo.toml | 3 ++ .../bin/node-template/runtime/Cargo.toml | 3 ++ substrate/bin/node/bench/Cargo.toml | 3 ++ substrate/bin/node/cli/Cargo.toml | 3 ++ substrate/bin/node/inspect/Cargo.toml | 3 ++ substrate/bin/node/primitives/Cargo.toml | 3 ++ substrate/bin/node/rpc/Cargo.toml | 3 ++ substrate/bin/node/runtime/Cargo.toml | 3 ++ substrate/bin/node/testing/Cargo.toml | 3 ++ .../bin/utils/chain-spec-builder/Cargo.toml | 3 ++ substrate/bin/utils/subkey/Cargo.toml | 3 ++ substrate/client/allocator/Cargo.toml | 3 ++ substrate/client/api/Cargo.toml | 3 ++ .../client/authority-discovery/Cargo.toml | 3 ++ substrate/client/basic-authorship/Cargo.toml | 3 ++ substrate/client/block-builder/Cargo.toml | 3 ++ substrate/client/chain-spec/Cargo.toml | 3 ++ substrate/client/chain-spec/derive/Cargo.toml | 3 ++ substrate/client/cli/Cargo.toml | 3 ++ substrate/client/consensus/aura/Cargo.toml | 3 ++ substrate/client/consensus/babe/Cargo.toml | 3 ++ .../client/consensus/babe/rpc/Cargo.toml | 3 ++ substrate/client/consensus/beefy/Cargo.toml | 3 ++ .../client/consensus/beefy/rpc/Cargo.toml | 3 ++ substrate/client/consensus/common/Cargo.toml | 3 ++ substrate/client/consensus/epochs/Cargo.toml | 3 ++ substrate/client/consensus/grandpa/Cargo.toml | 3 ++ .../client/consensus/grandpa/rpc/Cargo.toml | 3 ++ .../client/consensus/manual-seal/Cargo.toml | 3 ++ substrate/client/consensus/pow/Cargo.toml | 3 ++ substrate/client/consensus/slots/Cargo.toml | 3 ++ substrate/client/db/Cargo.toml | 3 ++ substrate/client/executor/Cargo.toml | 3 ++ substrate/client/executor/common/Cargo.toml | 3 ++ .../client/executor/runtime-test/Cargo.toml | 3 ++ substrate/client/executor/wasmtime/Cargo.toml | 3 ++ substrate/client/informant/Cargo.toml | 3 ++ substrate/client/keystore/Cargo.toml | 3 ++ .../client/merkle-mountain-range/Cargo.toml | 3 ++ .../merkle-mountain-range/rpc/Cargo.toml | 3 ++ substrate/client/mixnet/Cargo.toml | 3 ++ substrate/client/network-gossip/Cargo.toml | 3 ++ substrate/client/network/Cargo.toml | 3 ++ substrate/client/network/bitswap/Cargo.toml | 3 ++ substrate/client/network/common/Cargo.toml | 3 ++ substrate/client/network/light/Cargo.toml | 3 ++ substrate/client/network/statement/Cargo.toml | 3 ++ substrate/client/network/sync/Cargo.toml | 3 ++ substrate/client/network/test/Cargo.toml | 3 ++ .../client/network/transactions/Cargo.toml | 3 ++ substrate/client/offchain/Cargo.toml | 3 ++ substrate/client/proposer-metrics/Cargo.toml | 3 ++ substrate/client/rpc-api/Cargo.toml | 3 ++ substrate/client/rpc-servers/Cargo.toml | 3 ++ substrate/client/rpc-spec-v2/Cargo.toml | 3 ++ substrate/client/rpc/Cargo.toml | 3 ++ substrate/client/service/Cargo.toml | 3 ++ substrate/client/service/test/Cargo.toml | 3 ++ substrate/client/state-db/Cargo.toml | 3 ++ substrate/client/statement-store/Cargo.toml | 3 ++ substrate/client/storage-monitor/Cargo.toml | 3 ++ substrate/client/sync-state-rpc/Cargo.toml | 3 ++ substrate/client/sysinfo/Cargo.toml | 3 ++ substrate/client/telemetry/Cargo.toml | 3 ++ substrate/client/tracing/Cargo.toml | 3 ++ .../client/tracing/proc-macro/Cargo.toml | 3 ++ substrate/client/transaction-pool/Cargo.toml | 3 ++ .../client/transaction-pool/api/Cargo.toml | 3 ++ substrate/client/utils/Cargo.toml | 3 ++ substrate/frame/Cargo.toml | 3 ++ substrate/frame/alliance/Cargo.toml | 3 ++ substrate/frame/asset-conversion/Cargo.toml | 3 ++ substrate/frame/asset-rate/Cargo.toml | 3 ++ substrate/frame/assets/Cargo.toml | 3 ++ substrate/frame/atomic-swap/Cargo.toml | 3 ++ substrate/frame/aura/Cargo.toml | 3 ++ .../frame/authority-discovery/Cargo.toml | 3 ++ substrate/frame/authorship/Cargo.toml | 3 ++ substrate/frame/babe/Cargo.toml | 3 ++ substrate/frame/bags-list/Cargo.toml | 3 ++ substrate/frame/bags-list/fuzzer/Cargo.toml | 3 ++ .../frame/bags-list/remote-tests/Cargo.toml | 3 ++ substrate/frame/balances/Cargo.toml | 3 ++ substrate/frame/beefy-mmr/Cargo.toml | 3 ++ substrate/frame/beefy/Cargo.toml | 3 ++ substrate/frame/benchmarking/Cargo.toml | 3 ++ substrate/frame/benchmarking/pov/Cargo.toml | 3 ++ substrate/frame/bounties/Cargo.toml | 3 ++ substrate/frame/broker/Cargo.toml | 3 ++ substrate/frame/child-bounties/Cargo.toml | 3 ++ substrate/frame/collective/Cargo.toml | 3 ++ substrate/frame/contracts/Cargo.toml | 3 ++ substrate/frame/contracts/fixtures/Cargo.toml | 3 ++ .../fixtures/contracts/common/Cargo.toml | 3 ++ .../frame/contracts/mock-network/Cargo.toml | 3 ++ .../frame/contracts/primitives/Cargo.toml | 3 ++ .../frame/contracts/proc-macro/Cargo.toml | 3 ++ substrate/frame/contracts/uapi/Cargo.toml | 3 ++ substrate/frame/conviction-voting/Cargo.toml | 3 ++ substrate/frame/core-fellowship/Cargo.toml | 3 ++ substrate/frame/democracy/Cargo.toml | 3 ++ .../election-provider-multi-phase/Cargo.toml | 3 ++ .../test-staking-e2e/Cargo.toml | 3 ++ .../election-provider-support/Cargo.toml | 3 ++ .../benchmarking/Cargo.toml | 3 ++ .../solution-type/Cargo.toml | 3 ++ .../solution-type/fuzzer/Cargo.toml | 3 ++ substrate/frame/elections-phragmen/Cargo.toml | 3 ++ substrate/frame/examples/Cargo.toml | 3 ++ substrate/frame/examples/basic/Cargo.toml | 3 ++ .../frame/examples/default-config/Cargo.toml | 3 ++ substrate/frame/examples/dev-mode/Cargo.toml | 3 ++ .../frame/examples/frame-crate/Cargo.toml | 3 ++ .../frame/examples/kitchensink/Cargo.toml | 3 ++ .../frame/examples/offchain-worker/Cargo.toml | 3 ++ substrate/frame/examples/split/Cargo.toml | 3 ++ substrate/frame/examples/tasks/Cargo.toml | 3 ++ substrate/frame/executive/Cargo.toml | 3 ++ substrate/frame/fast-unstake/Cargo.toml | 3 ++ substrate/frame/glutton/Cargo.toml | 3 ++ substrate/frame/grandpa/Cargo.toml | 3 ++ substrate/frame/identity/Cargo.toml | 3 ++ substrate/frame/im-online/Cargo.toml | 3 ++ substrate/frame/indices/Cargo.toml | 3 ++ .../Cargo.toml | 3 ++ substrate/frame/lottery/Cargo.toml | 3 ++ substrate/frame/membership/Cargo.toml | 3 ++ .../frame/merkle-mountain-range/Cargo.toml | 3 ++ substrate/frame/message-queue/Cargo.toml | 3 ++ substrate/frame/mixnet/Cargo.toml | 3 ++ substrate/frame/multisig/Cargo.toml | 3 ++ .../frame/nft-fractionalization/Cargo.toml | 3 ++ substrate/frame/nfts/Cargo.toml | 3 ++ substrate/frame/nfts/runtime-api/Cargo.toml | 3 ++ substrate/frame/nicks/Cargo.toml | 3 ++ substrate/frame/nis/Cargo.toml | 3 ++ substrate/frame/node-authorization/Cargo.toml | 3 ++ substrate/frame/nomination-pools/Cargo.toml | 3 ++ .../nomination-pools/benchmarking/Cargo.toml | 3 ++ .../frame/nomination-pools/fuzzer/Cargo.toml | 3 ++ .../nomination-pools/runtime-api/Cargo.toml | 3 ++ .../nomination-pools/test-staking/Cargo.toml | 3 ++ substrate/frame/offences/Cargo.toml | 3 ++ .../frame/offences/benchmarking/Cargo.toml | 3 ++ substrate/frame/paged-list/Cargo.toml | 3 ++ substrate/frame/paged-list/fuzzer/Cargo.toml | 3 ++ substrate/frame/preimage/Cargo.toml | 3 ++ substrate/frame/proxy/Cargo.toml | 3 ++ substrate/frame/ranked-collective/Cargo.toml | 3 ++ substrate/frame/recovery/Cargo.toml | 3 ++ substrate/frame/referenda/Cargo.toml | 3 ++ substrate/frame/remark/Cargo.toml | 3 ++ substrate/frame/root-offences/Cargo.toml | 3 ++ substrate/frame/root-testing/Cargo.toml | 3 ++ substrate/frame/safe-mode/Cargo.toml | 3 ++ substrate/frame/salary/Cargo.toml | 3 ++ substrate/frame/sassafras/Cargo.toml | 3 ++ substrate/frame/scheduler/Cargo.toml | 3 ++ substrate/frame/scored-pool/Cargo.toml | 3 ++ substrate/frame/session/Cargo.toml | 3 ++ .../frame/session/benchmarking/Cargo.toml | 3 ++ substrate/frame/society/Cargo.toml | 3 ++ substrate/frame/staking/Cargo.toml | 3 ++ .../frame/staking/reward-curve/Cargo.toml | 3 ++ substrate/frame/staking/reward-fn/Cargo.toml | 3 ++ .../frame/staking/runtime-api/Cargo.toml | 3 ++ .../frame/state-trie-migration/Cargo.toml | 3 ++ substrate/frame/statement/Cargo.toml | 3 ++ substrate/frame/sudo/Cargo.toml | 3 ++ substrate/frame/support/Cargo.toml | 3 ++ substrate/frame/support/procedural/Cargo.toml | 3 ++ .../frame/support/procedural/tools/Cargo.toml | 3 ++ .../procedural/tools/derive/Cargo.toml | 3 ++ substrate/frame/support/test/Cargo.toml | 3 ++ .../support/test/compile_pass/Cargo.toml | 3 ++ .../frame/support/test/pallet/Cargo.toml | 3 ++ .../support/test/stg_frame_crate/Cargo.toml | 3 ++ substrate/frame/system/Cargo.toml | 3 ++ .../frame/system/benchmarking/Cargo.toml | 3 ++ .../frame/system/rpc/runtime-api/Cargo.toml | 3 ++ substrate/frame/timestamp/Cargo.toml | 3 ++ substrate/frame/tips/Cargo.toml | 3 ++ .../frame/transaction-payment/Cargo.toml | 3 ++ .../asset-conversion-tx-payment/Cargo.toml | 3 ++ .../asset-tx-payment/Cargo.toml | 3 ++ .../frame/transaction-payment/rpc/Cargo.toml | 3 ++ .../rpc/runtime-api/Cargo.toml | 3 ++ .../skip-feeless-payment/Cargo.toml | 3 ++ .../frame/transaction-storage/Cargo.toml | 3 ++ substrate/frame/treasury/Cargo.toml | 3 ++ substrate/frame/try-runtime/Cargo.toml | 3 ++ substrate/frame/tx-pause/Cargo.toml | 3 ++ substrate/frame/uniques/Cargo.toml | 3 ++ substrate/frame/utility/Cargo.toml | 3 ++ substrate/frame/vesting/Cargo.toml | 3 ++ substrate/frame/whitelist/Cargo.toml | 3 ++ substrate/primitives/api/Cargo.toml | 3 ++ .../primitives/api/proc-macro/Cargo.toml | 3 ++ substrate/primitives/api/test/Cargo.toml | 3 ++ .../primitives/application-crypto/Cargo.toml | 3 ++ .../application-crypto/test/Cargo.toml | 3 ++ substrate/primitives/arithmetic/Cargo.toml | 3 ++ .../primitives/arithmetic/fuzzer/Cargo.toml | 3 ++ .../primitives/authority-discovery/Cargo.toml | 3 ++ substrate/primitives/block-builder/Cargo.toml | 3 ++ substrate/primitives/blockchain/Cargo.toml | 3 ++ .../primitives/consensus/aura/Cargo.toml | 3 ++ .../primitives/consensus/babe/Cargo.toml | 3 ++ .../primitives/consensus/beefy/Cargo.toml | 3 ++ .../primitives/consensus/common/Cargo.toml | 3 ++ .../primitives/consensus/grandpa/Cargo.toml | 3 ++ substrate/primitives/consensus/pow/Cargo.toml | 3 ++ .../primitives/consensus/sassafras/Cargo.toml | 3 ++ .../primitives/consensus/slots/Cargo.toml | 3 ++ substrate/primitives/core/Cargo.toml | 3 ++ substrate/primitives/core/fuzz/Cargo.toml | 3 ++ substrate/primitives/core/hashing/Cargo.toml | 3 ++ .../core/hashing/proc-macro/Cargo.toml | 3 ++ .../primitives/crypto/ec-utils/Cargo.toml | 3 ++ substrate/primitives/database/Cargo.toml | 3 ++ substrate/primitives/debug-derive/Cargo.toml | 2 ++ substrate/primitives/externalities/Cargo.toml | 3 ++ .../primitives/genesis-builder/Cargo.toml | 3 ++ substrate/primitives/inherents/Cargo.toml | 3 ++ substrate/primitives/io/Cargo.toml | 3 ++ substrate/primitives/keyring/Cargo.toml | 3 ++ substrate/primitives/keystore/Cargo.toml | 3 ++ .../maybe-compressed-blob/Cargo.toml | 3 ++ .../merkle-mountain-range/Cargo.toml | 3 ++ substrate/primitives/metadata-ir/Cargo.toml | 3 ++ substrate/primitives/mixnet/Cargo.toml | 3 ++ .../primitives/npos-elections/Cargo.toml | 3 ++ .../npos-elections/fuzzer/Cargo.toml | 3 ++ substrate/primitives/offchain/Cargo.toml | 3 ++ substrate/primitives/panic-handler/Cargo.toml | 3 ++ substrate/primitives/rpc/Cargo.toml | 3 ++ .../primitives/runtime-interface/Cargo.toml | 3 ++ .../runtime-interface/proc-macro/Cargo.toml | 3 ++ .../test-wasm-deprecated/Cargo.toml | 3 ++ .../runtime-interface/test-wasm/Cargo.toml | 3 ++ .../runtime-interface/test/Cargo.toml | 3 ++ substrate/primitives/runtime/Cargo.toml | 3 ++ substrate/primitives/session/Cargo.toml | 3 ++ substrate/primitives/staking/Cargo.toml | 3 ++ substrate/primitives/state-machine/Cargo.toml | 3 ++ .../primitives/statement-store/Cargo.toml | 3 ++ substrate/primitives/std/Cargo.toml | 3 ++ substrate/primitives/storage/Cargo.toml | 3 ++ .../primitives/test-primitives/Cargo.toml | 3 ++ substrate/primitives/timestamp/Cargo.toml | 3 ++ substrate/primitives/tracing/Cargo.toml | 3 ++ .../primitives/transaction-pool/Cargo.toml | 3 ++ .../transaction-storage-proof/Cargo.toml | 3 ++ substrate/primitives/trie/Cargo.toml | 3 ++ substrate/primitives/version/Cargo.toml | 3 ++ .../primitives/version/proc-macro/Cargo.toml | 3 ++ .../primitives/wasm-interface/Cargo.toml | 3 ++ substrate/primitives/weights/Cargo.toml | 3 ++ .../ci/node-template-release/Cargo.toml | 3 ++ substrate/test-utils/Cargo.toml | 3 ++ substrate/test-utils/cli/Cargo.toml | 3 ++ substrate/test-utils/client/Cargo.toml | 3 ++ substrate/test-utils/runtime/Cargo.toml | 3 ++ .../test-utils/runtime/client/Cargo.toml | 3 ++ .../runtime/transaction-pool/Cargo.toml | 3 ++ substrate/utils/binary-merkle-tree/Cargo.toml | 3 ++ substrate/utils/build-script-utils/Cargo.toml | 3 ++ substrate/utils/fork-tree/Cargo.toml | 3 ++ .../utils/frame/benchmarking-cli/Cargo.toml | 3 ++ .../frame/frame-utilities-cli/Cargo.toml | 3 ++ .../utils/frame/generate-bags/Cargo.toml | 3 ++ .../generate-bags/node-runtime/Cargo.toml | 3 ++ .../frame/remote-externalities/Cargo.toml | 3 ++ substrate/utils/frame/rpc/client/Cargo.toml | 3 ++ .../rpc/state-trie-migration-rpc/Cargo.toml | 3 ++ substrate/utils/frame/rpc/support/Cargo.toml | 3 ++ substrate/utils/frame/rpc/system/Cargo.toml | 3 ++ .../utils/frame/try-runtime/cli/Cargo.toml | 3 ++ substrate/utils/prometheus/Cargo.toml | 3 ++ substrate/utils/wasm-builder/Cargo.toml | 3 ++ 471 files changed, 1430 insertions(+), 37 deletions(-) diff --git a/.cargo/config.toml b/.cargo/config.toml index 8bbf7cdb4d9..f113e9114ac 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -4,40 +4,6 @@ rustdocflags = [ "-Arustdoc::redundant_explicit_links", # stylistic ] -# An auto defined `clippy` feature was introduced, -# but it was found to clash with user defined features, -# so was renamed to `cargo-clippy`. -# -# If you want standard clippy run: -# RUSTFLAGS= cargo clippy -[target.'cfg(feature = "cargo-clippy")'] -rustflags = [ - "-Aclippy::all", - "-Dclippy::correctness", - "-Aclippy::if-same-then-else", - "-Asuspicious_double_ref_op", - "-Dclippy::complexity", - "-Aclippy::zero-prefixed-literal", # 00_1000_000 - "-Aclippy::type_complexity", # raison d'etre - "-Aclippy::nonminimal-bool", # maybe - "-Aclippy::borrowed-box", # Reasonable to fix this one - "-Aclippy::too-many-arguments", # (Turning this on would lead to) - "-Aclippy::unnecessary_cast", # Types may change - "-Aclippy::identity-op", # One case where we do 0 + - "-Aclippy::useless_conversion", # Types may change - "-Aclippy::unit_arg", # styalistic. - "-Aclippy::option-map-unit-fn", # styalistic - "-Aclippy::bind_instead_of_map", # styalistic - "-Aclippy::erasing_op", # E.g. 0 * DOLLARS - "-Aclippy::eq_op", # In tests we test equality. - "-Aclippy::while_immutable_condition", # false positives - "-Aclippy::needless_option_as_deref", # false positives - "-Aclippy::derivable_impls", # false positives - "-Aclippy::stable_sort_primitive", # prefer stable sort - "-Aclippy::extra-unused-type-parameters", # stylistic - "-Aclippy::default_constructed_unit_structs", # stylistic -] - [env] # Needed for musl builds so user doesn't have to install musl-tools. CC_x86_64_unknown_linux_musl = { value = ".cargo/musl-gcc", force = true, relative = true } diff --git a/.config/taplo.toml b/.config/taplo.toml index ffe0417e42b..f5d0b7021ba 100644 --- a/.config/taplo.toml +++ b/.config/taplo.toml @@ -27,7 +27,7 @@ reorder_arrays = false # don't re-order order-dependent rustflags [[rule]] include = [".cargo/config.toml"] -keys = ["build", "target.'cfg(feature = \"cargo-clippy\")'"] +keys = ["build"] [rule.formatting] reorder_arrays = false diff --git a/.gitlab/pipeline/check.yml b/.gitlab/pipeline/check.yml index 7d98b9cc71c..3b14034a110 100644 --- a/.gitlab/pipeline/check.yml +++ b/.gitlab/pipeline/check.yml @@ -4,8 +4,10 @@ cargo-clippy: - .docker-env - .common-refs - .pipeline-stopper-artifacts + variables: + RUSTFLAGS: "-D warnings" script: - - SKIP_WASM_BUILD=1 env -u RUSTFLAGS cargo clippy --all-targets --locked --workspace + - SKIP_WASM_BUILD=1 cargo clippy --all-targets --locked --workspace check-try-runtime: stage: check diff --git a/Cargo.toml b/Cargo.toml index 1c791b6118f..0091c2d7c8b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -476,6 +476,34 @@ members = [ ] default-members = ["polkadot", "substrate/bin/node/cli"] +[workspace.lints.rust] +suspicious_double_ref_op = { level = "allow", priority = 2 } + +[workspace.lints.clippy] +all = { level = "allow", priority = 0 } +correctness = { level = "deny", priority = 1 } +if-same-then-else = { level = "allow", priority = 2 } +complexity = { level = "deny", priority = 1 } +zero-prefixed-literal = { level = "allow", priority = 2 } # 00_1000_000 +type_complexity = { level = "allow", priority = 2 } # raison d'etre +nonminimal-bool = { level = "allow", priority = 2 } # maybe +borrowed-box = { level = "allow", priority = 2 } # Reasonable to fix this one +too-many-arguments = { level = "allow", priority = 2 } # (Turning this on would lead to) +unnecessary_cast = { level = "allow", priority = 2 } # Types may change +identity-op = { level = "allow", priority = 2 } # One case where we do 0 + +useless_conversion = { level = "allow", priority = 2 } # Types may change +unit_arg = { level = "allow", priority = 2 } # styalistic. +option-map-unit-fn = { level = "allow", priority = 2 } # styalistic +bind_instead_of_map = { level = "allow", priority = 2 } # styalistic +erasing_op = { level = "allow", priority = 2 } # E.g. 0 * DOLLARS +eq_op = { level = "allow", priority = 2 } # In tests we test equality. +while_immutable_condition = { level = "allow", priority = 2 } # false positives +needless_option_as_deref = { level = "allow", priority = 2 } # false positives +derivable_impls = { level = "allow", priority = 2 } # false positives +stable_sort_primitive = { level = "allow", priority = 2 } # prefer stable sort +extra-unused-type-parameters = { level = "allow", priority = 2 } # stylistic +default_constructed_unit_structs = { level = "allow", priority = 2 } # stylistic + [profile.release] # Polkadot runtime requires unwinding. panic = "unwind" diff --git a/bridges/bin/runtime-common/Cargo.toml b/bridges/bin/runtime-common/Cargo.toml index bac54a0a7a2..8c3e8c989db 100644 --- a/bridges/bin/runtime-common/Cargo.toml +++ b/bridges/bin/runtime-common/Cargo.toml @@ -7,6 +7,9 @@ edition.workspace = true repository.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } hash-db = { version = "0.16.0", default-features = false } diff --git a/bridges/modules/grandpa/Cargo.toml b/bridges/modules/grandpa/Cargo.toml index 573edbf5a65..e346f2061e2 100644 --- a/bridges/modules/grandpa/Cargo.toml +++ b/bridges/modules/grandpa/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] diff --git a/bridges/modules/messages/Cargo.toml b/bridges/modules/messages/Cargo.toml index 751ef45168d..4d9371448df 100644 --- a/bridges/modules/messages/Cargo.toml +++ b/bridges/modules/messages/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } log = { version = "0.4.20", default-features = false } diff --git a/bridges/modules/parachains/Cargo.toml b/bridges/modules/parachains/Cargo.toml index 4af8997c5f3..77a5366c78d 100644 --- a/bridges/modules/parachains/Cargo.toml +++ b/bridges/modules/parachains/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } log = { version = "0.4.20", default-features = false } diff --git a/bridges/modules/relayers/Cargo.toml b/bridges/modules/relayers/Cargo.toml index 3011a11db5c..8c8305ef64c 100644 --- a/bridges/modules/relayers/Cargo.toml +++ b/bridges/modules/relayers/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } log = { version = "0.4.20", default-features = false } diff --git a/bridges/modules/xcm-bridge-hub-router/Cargo.toml b/bridges/modules/xcm-bridge-hub-router/Cargo.toml index e4d25fae9d3..1d84f723ee9 100644 --- a/bridges/modules/xcm-bridge-hub-router/Cargo.toml +++ b/bridges/modules/xcm-bridge-hub-router/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } log = { version = "0.4.20", default-features = false } diff --git a/bridges/modules/xcm-bridge-hub/Cargo.toml b/bridges/modules/xcm-bridge-hub/Cargo.toml index 03ef18170ae..061d4b7ced8 100644 --- a/bridges/modules/xcm-bridge-hub/Cargo.toml +++ b/bridges/modules/xcm-bridge-hub/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } log = { version = "0.4.20", default-features = false } diff --git a/bridges/primitives/chain-asset-hub-rococo/Cargo.toml b/bridges/primitives/chain-asset-hub-rococo/Cargo.toml index 889475840b3..d5f724e581f 100644 --- a/bridges/primitives/chain-asset-hub-rococo/Cargo.toml +++ b/bridges/primitives/chain-asset-hub-rococo/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } diff --git a/bridges/primitives/chain-asset-hub-westend/Cargo.toml b/bridges/primitives/chain-asset-hub-westend/Cargo.toml index 84b9604a61b..d309e50bfbf 100644 --- a/bridges/primitives/chain-asset-hub-westend/Cargo.toml +++ b/bridges/primitives/chain-asset-hub-westend/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } diff --git a/bridges/primitives/chain-bridge-hub-cumulus/Cargo.toml b/bridges/primitives/chain-bridge-hub-cumulus/Cargo.toml index dab1b065f6f..73aaa53269f 100644 --- a/bridges/primitives/chain-bridge-hub-cumulus/Cargo.toml +++ b/bridges/primitives/chain-bridge-hub-cumulus/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + [dependencies] # Bridge Dependencies diff --git a/bridges/primitives/chain-bridge-hub-kusama/Cargo.toml b/bridges/primitives/chain-bridge-hub-kusama/Cargo.toml index 8e6364101f2..ea09712ae30 100644 --- a/bridges/primitives/chain-bridge-hub-kusama/Cargo.toml +++ b/bridges/primitives/chain-bridge-hub-kusama/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + [dependencies] # Bridge Dependencies diff --git a/bridges/primitives/chain-bridge-hub-polkadot/Cargo.toml b/bridges/primitives/chain-bridge-hub-polkadot/Cargo.toml index 961d4aeb2e2..de208895fb4 100644 --- a/bridges/primitives/chain-bridge-hub-polkadot/Cargo.toml +++ b/bridges/primitives/chain-bridge-hub-polkadot/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + [dependencies] # Bridge Dependencies diff --git a/bridges/primitives/chain-bridge-hub-rococo/Cargo.toml b/bridges/primitives/chain-bridge-hub-rococo/Cargo.toml index 28fe3c283bc..281e1f74261 100644 --- a/bridges/primitives/chain-bridge-hub-rococo/Cargo.toml +++ b/bridges/primitives/chain-bridge-hub-rococo/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + [dependencies] # Bridge Dependencies diff --git a/bridges/primitives/chain-bridge-hub-westend/Cargo.toml b/bridges/primitives/chain-bridge-hub-westend/Cargo.toml index 409f84840a8..beebfa8f1a0 100644 --- a/bridges/primitives/chain-bridge-hub-westend/Cargo.toml +++ b/bridges/primitives/chain-bridge-hub-westend/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + [dependencies] # Bridge Dependencies diff --git a/bridges/primitives/chain-kusama/Cargo.toml b/bridges/primitives/chain-kusama/Cargo.toml index 41570d4f9bc..6ca4f051f1c 100644 --- a/bridges/primitives/chain-kusama/Cargo.toml +++ b/bridges/primitives/chain-kusama/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + [dependencies] # Bridge Dependencies diff --git a/bridges/primitives/chain-polkadot-bulletin/Cargo.toml b/bridges/primitives/chain-polkadot-bulletin/Cargo.toml index 3be056dd0a7..98633847462 100644 --- a/bridges/primitives/chain-polkadot-bulletin/Cargo.toml +++ b/bridges/primitives/chain-polkadot-bulletin/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } diff --git a/bridges/primitives/chain-polkadot/Cargo.toml b/bridges/primitives/chain-polkadot/Cargo.toml index 579e997e0ab..361901b7ae0 100644 --- a/bridges/primitives/chain-polkadot/Cargo.toml +++ b/bridges/primitives/chain-polkadot/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + [dependencies] # Bridge Dependencies diff --git a/bridges/primitives/chain-rococo/Cargo.toml b/bridges/primitives/chain-rococo/Cargo.toml index dc7c482a4cc..d59a00cfd14 100644 --- a/bridges/primitives/chain-rococo/Cargo.toml +++ b/bridges/primitives/chain-rococo/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + [dependencies] # Bridge Dependencies diff --git a/bridges/primitives/chain-westend/Cargo.toml b/bridges/primitives/chain-westend/Cargo.toml index 7c74cb1361b..6b6d2748aff 100644 --- a/bridges/primitives/chain-westend/Cargo.toml +++ b/bridges/primitives/chain-westend/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + [dependencies] # Bridge Dependencies diff --git a/bridges/primitives/header-chain/Cargo.toml b/bridges/primitives/header-chain/Cargo.toml index bc92054e5dc..7338996d69f 100644 --- a/bridges/primitives/header-chain/Cargo.toml +++ b/bridges/primitives/header-chain/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } finality-grandpa = { version = "0.16.2", default-features = false } diff --git a/bridges/primitives/messages/Cargo.toml b/bridges/primitives/messages/Cargo.toml index c2f43523aaf..6333000a71a 100644 --- a/bridges/primitives/messages/Cargo.toml +++ b/bridges/primitives/messages/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["bit-vec", "derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["bit-vec", "derive"] } diff --git a/bridges/primitives/parachains/Cargo.toml b/bridges/primitives/parachains/Cargo.toml index a339203fd66..99b447f6c0a 100644 --- a/bridges/primitives/parachains/Cargo.toml +++ b/bridges/primitives/parachains/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } impl-trait-for-tuples = "0.2" diff --git a/bridges/primitives/polkadot-core/Cargo.toml b/bridges/primitives/polkadot-core/Cargo.toml index 67fb9af8b21..80382b3289f 100644 --- a/bridges/primitives/polkadot-core/Cargo.toml +++ b/bridges/primitives/polkadot-core/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["derive"] } parity-util-mem = { version = "0.12.0", optional = true } diff --git a/bridges/primitives/relayers/Cargo.toml b/bridges/primitives/relayers/Cargo.toml index cf94ca44d00..563d27c91c9 100644 --- a/bridges/primitives/relayers/Cargo.toml +++ b/bridges/primitives/relayers/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["bit-vec", "derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["bit-vec", "derive"] } diff --git a/bridges/primitives/runtime/Cargo.toml b/bridges/primitives/runtime/Cargo.toml index a713f636bb8..779030b5278 100644 --- a/bridges/primitives/runtime/Cargo.toml +++ b/bridges/primitives/runtime/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false } hash-db = { version = "0.16.0", default-features = false } diff --git a/bridges/primitives/test-utils/Cargo.toml b/bridges/primitives/test-utils/Cargo.toml index 050c879c6a7..3ccec9d9033 100644 --- a/bridges/primitives/test-utils/Cargo.toml +++ b/bridges/primitives/test-utils/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + [dependencies] bp-header-chain = { path = "../header-chain", default-features = false } bp-parachains = { path = "../parachains", default-features = false } diff --git a/bridges/primitives/xcm-bridge-hub-router/Cargo.toml b/bridges/primitives/xcm-bridge-hub-router/Cargo.toml index 5a49db62fec..fa537bda960 100644 --- a/bridges/primitives/xcm-bridge-hub-router/Cargo.toml +++ b/bridges/primitives/xcm-bridge-hub-router/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.1.5", default-features = false, features = ["bit-vec", "derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["bit-vec", "derive"] } diff --git a/bridges/primitives/xcm-bridge-hub/Cargo.toml b/bridges/primitives/xcm-bridge-hub/Cargo.toml index 212b7b2642f..f9f44fd0f8d 100644 --- a/bridges/primitives/xcm-bridge-hub/Cargo.toml +++ b/bridges/primitives/xcm-bridge-hub/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + [dependencies] # Substrate Dependencies diff --git a/cumulus/client/cli/Cargo.toml b/cumulus/client/cli/Cargo.toml index af4912e2b2d..e57e7a44a56 100644 --- a/cumulus/client/cli/Cargo.toml +++ b/cumulus/client/cli/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true description = "Parachain node CLI utilities." license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + [dependencies] clap = { version = "4.4.11", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } diff --git a/cumulus/client/collator/Cargo.toml b/cumulus/client/collator/Cargo.toml index 7ac0bbfe6f1..7392934f4c9 100644 --- a/cumulus/client/collator/Cargo.toml +++ b/cumulus/client/collator/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true description = "Common node-side functionality and glue code to collate parachain blocks." license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + [dependencies] parking_lot = "0.12.1" codec = { package = "parity-scale-codec", version = "3.0.0", features = ["derive"] } diff --git a/cumulus/client/consensus/aura/Cargo.toml b/cumulus/client/consensus/aura/Cargo.toml index e07f10d6090..cd77504a2a2 100644 --- a/cumulus/client/consensus/aura/Cargo.toml +++ b/cumulus/client/consensus/aura/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + [dependencies] async-trait = "0.1.73" codec = { package = "parity-scale-codec", version = "3.0.0", features = ["derive"] } diff --git a/cumulus/client/consensus/common/Cargo.toml b/cumulus/client/consensus/common/Cargo.toml index 92918cd7b5b..770e5c01e8b 100644 --- a/cumulus/client/consensus/common/Cargo.toml +++ b/cumulus/client/consensus/common/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + [dependencies] async-trait = "0.1.73" codec = { package = "parity-scale-codec", version = "3.0.0", features = ["derive"] } diff --git a/cumulus/client/consensus/proposer/Cargo.toml b/cumulus/client/consensus/proposer/Cargo.toml index 4cfba66cec3..2006eac5bf1 100644 --- a/cumulus/client/consensus/proposer/Cargo.toml +++ b/cumulus/client/consensus/proposer/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + [dependencies] anyhow = "1.0" async-trait = "0.1.73" diff --git a/cumulus/client/consensus/relay-chain/Cargo.toml b/cumulus/client/consensus/relay-chain/Cargo.toml index de280e6e9a8..76b1c9a422f 100644 --- a/cumulus/client/consensus/relay-chain/Cargo.toml +++ b/cumulus/client/consensus/relay-chain/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + [dependencies] async-trait = "0.1.73" futures = "0.3.28" diff --git a/cumulus/client/network/Cargo.toml b/cumulus/client/network/Cargo.toml index 3893647e7c5..5e0d478f5ac 100644 --- a/cumulus/client/network/Cargo.toml +++ b/cumulus/client/network/Cargo.toml @@ -6,6 +6,9 @@ description = "Cumulus-specific networking protocol" edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + [dependencies] async-trait = "0.1.73" codec = { package = "parity-scale-codec", version = "3.0.0", features = ["derive"] } diff --git a/cumulus/client/pov-recovery/Cargo.toml b/cumulus/client/pov-recovery/Cargo.toml index 29f793c7328..93d65016530 100644 --- a/cumulus/client/pov-recovery/Cargo.toml +++ b/cumulus/client/pov-recovery/Cargo.toml @@ -6,6 +6,9 @@ description = "Cumulus-specific networking protocol" edition.workspace = true license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", features = ["derive"] } futures = "0.3.28" diff --git a/cumulus/client/relay-chain-inprocess-interface/Cargo.toml b/cumulus/client/relay-chain-inprocess-interface/Cargo.toml index 1d414736503..15063d09bca 100644 --- a/cumulus/client/relay-chain-inprocess-interface/Cargo.toml +++ b/cumulus/client/relay-chain-inprocess-interface/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true description = "Implementation of the RelayChainInterface trait for Polkadot full-nodes." license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + [dependencies] async-trait = "0.1.73" futures = "0.3.28" diff --git a/cumulus/client/relay-chain-interface/Cargo.toml b/cumulus/client/relay-chain-interface/Cargo.toml index c9d50afe8fa..98893a398fb 100644 --- a/cumulus/client/relay-chain-interface/Cargo.toml +++ b/cumulus/client/relay-chain-interface/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true description = "Common interface for different relay chain datasources." license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + [dependencies] polkadot-overseer = { path = "../../../polkadot/node/overseer" } diff --git a/cumulus/client/relay-chain-minimal-node/Cargo.toml b/cumulus/client/relay-chain-minimal-node/Cargo.toml index acaed5a4f6c..b22731b3a6d 100644 --- a/cumulus/client/relay-chain-minimal-node/Cargo.toml +++ b/cumulus/client/relay-chain-minimal-node/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true description = "Minimal node implementation to be used in tandem with RPC or light-client mode." license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + [dependencies] # polkadot deps polkadot-primitives = { path = "../../../polkadot/primitives" } diff --git a/cumulus/client/relay-chain-rpc-interface/Cargo.toml b/cumulus/client/relay-chain-rpc-interface/Cargo.toml index 11d8bc9b4df..050bea08f0f 100644 --- a/cumulus/client/relay-chain-rpc-interface/Cargo.toml +++ b/cumulus/client/relay-chain-rpc-interface/Cargo.toml @@ -6,6 +6,8 @@ edition.workspace = true description = "Implementation of the RelayChainInterface trait that connects to a remote RPC-node." license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true [dependencies] polkadot-overseer = { path = "../../../polkadot/node/overseer" } diff --git a/cumulus/client/service/Cargo.toml b/cumulus/client/service/Cargo.toml index 55623276eaf..997413ad0da 100644 --- a/cumulus/client/service/Cargo.toml +++ b/cumulus/client/service/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true description = "Common functions used to assemble the components of a parachain node." license = "GPL-3.0-or-later WITH Classpath-exception-2.0" +[lints] +workspace = true + [dependencies] futures = "0.3.28" diff --git a/cumulus/pallets/aura-ext/Cargo.toml b/cumulus/pallets/aura-ext/Cargo.toml index 16f73aa540e..14dcd10ddfc 100644 --- a/cumulus/pallets/aura-ext/Cargo.toml +++ b/cumulus/pallets/aura-ext/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true description = "AURA consensus extension pallet for parachains" license = "Apache-2.0" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } diff --git a/cumulus/pallets/collator-selection/Cargo.toml b/cumulus/pallets/collator-selection/Cargo.toml index 76efbf1caf6..9c2af8893ca 100644 --- a/cumulus/pallets/collator-selection/Cargo.toml +++ b/cumulus/pallets/collator-selection/Cargo.toml @@ -9,6 +9,9 @@ readme = "README.md" repository.workspace = true version = "3.0.0" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/cumulus/pallets/dmp-queue/Cargo.toml b/cumulus/pallets/dmp-queue/Cargo.toml index 0b64410433f..bdcee0f5ff8 100644 --- a/cumulus/pallets/dmp-queue/Cargo.toml +++ b/cumulus/pallets/dmp-queue/Cargo.toml @@ -7,6 +7,9 @@ repository.workspace = true description = "Migrates messages from the old DMP queue pallet." license = "Apache-2.0" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/cumulus/pallets/parachain-system/Cargo.toml b/cumulus/pallets/parachain-system/Cargo.toml index 187cf21cea6..d24fdfe101e 100644 --- a/cumulus/pallets/parachain-system/Cargo.toml +++ b/cumulus/pallets/parachain-system/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true description = "Base pallet for cumulus-based parachains" license = "Apache-2.0" +[lints] +workspace = true + [dependencies] bytes = { version = "1.4.0", default-features = false } codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } diff --git a/cumulus/pallets/parachain-system/proc-macro/Cargo.toml b/cumulus/pallets/parachain-system/proc-macro/Cargo.toml index fe960f716de..11a2ae01374 100644 --- a/cumulus/pallets/parachain-system/proc-macro/Cargo.toml +++ b/cumulus/pallets/parachain-system/proc-macro/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true description = "Proc macros provided by the parachain-system pallet" license = "Apache-2.0" +[lints] +workspace = true + [lib] proc-macro = true diff --git a/cumulus/pallets/session-benchmarking/Cargo.toml b/cumulus/pallets/session-benchmarking/Cargo.toml index 4c85b3d7171..af2dc2300d7 100644 --- a/cumulus/pallets/session-benchmarking/Cargo.toml +++ b/cumulus/pallets/session-benchmarking/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME sessions pallet benchmarking" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/cumulus/pallets/solo-to-para/Cargo.toml b/cumulus/pallets/solo-to-para/Cargo.toml index dc79d287d4d..e1c94cbfde9 100644 --- a/cumulus/pallets/solo-to-para/Cargo.toml +++ b/cumulus/pallets/solo-to-para/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true description = "Adds functionality to migrate from a Solo to a Parachain" license = "Apache-2.0" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } diff --git a/cumulus/pallets/xcm/Cargo.toml b/cumulus/pallets/xcm/Cargo.toml index f36d0aa52de..9bbc281154c 100644 --- a/cumulus/pallets/xcm/Cargo.toml +++ b/cumulus/pallets/xcm/Cargo.toml @@ -6,6 +6,9 @@ version = "0.1.0" license = "Apache-2.0" description = "Pallet for stuff specific to parachains' usage of XCM" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } diff --git a/cumulus/pallets/xcmp-queue/Cargo.toml b/cumulus/pallets/xcmp-queue/Cargo.toml index 1bc21bbbb58..50ec5cacb2e 100644 --- a/cumulus/pallets/xcmp-queue/Cargo.toml +++ b/cumulus/pallets/xcmp-queue/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true description = "Pallet to queue outbound and inbound XCMP messages." license = "Apache-2.0" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", features = ["derive"], default-features = false } log = { version = "0.4.20", default-features = false } diff --git a/cumulus/parachain-template/node/Cargo.toml b/cumulus/parachain-template/node/Cargo.toml index a83b4e21ac5..4be848f4d2d 100644 --- a/cumulus/parachain-template/node/Cargo.toml +++ b/cumulus/parachain-template/node/Cargo.toml @@ -10,6 +10,9 @@ edition.workspace = true build = "build.rs" publish = false +[lints] +workspace = true + [dependencies] clap = { version = "4.4.11", features = ["derive"] } log = "0.4.20" diff --git a/cumulus/parachain-template/pallets/template/Cargo.toml b/cumulus/parachain-template/pallets/template/Cargo.toml index 71b78a7175c..bd7f926d039 100644 --- a/cumulus/parachain-template/pallets/template/Cargo.toml +++ b/cumulus/parachain-template/pallets/template/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true edition.workspace = true +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/cumulus/parachain-template/runtime/Cargo.toml b/cumulus/parachain-template/runtime/Cargo.toml index d83867a9c7c..3944ff4ca08 100644 --- a/cumulus/parachain-template/runtime/Cargo.toml +++ b/cumulus/parachain-template/runtime/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true edition.workspace = true +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/cumulus/parachains/common/Cargo.toml b/cumulus/parachains/common/Cargo.toml index 5475fd2aa26..dcaea40d2da 100644 --- a/cumulus/parachains/common/Cargo.toml +++ b/cumulus/parachains/common/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true description = "Logic which is common to all parachain runtimes" license = "Apache-2.0" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/Cargo.toml index dbf7e9c9a70..1596169efbe 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/Cargo.toml @@ -7,6 +7,9 @@ license = "Apache-2.0" description = "Asset Hub Rococo emulated chain" publish = false +[lints] +workspace = true + [dependencies] serde_json = "1.0.104" diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/Cargo.toml index 0ff817b6b96..ff5a70628db 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/Cargo.toml @@ -7,6 +7,9 @@ license = "Apache-2.0" description = "Asset Hub Westend emulated chain" publish = false +[lints] +workspace = true + [dependencies] serde_json = "1.0.104" diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/Cargo.toml index 43c0f5fd14c..8a56bb7b27f 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/Cargo.toml @@ -7,6 +7,9 @@ license = "Apache-2.0" description = "Bridge Hub Rococo emulated chain" publish = false +[lints] +workspace = true + [dependencies] serde_json = "1.0.104" diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/Cargo.toml index e5e6fd70739..a2268f3b17a 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/Cargo.toml @@ -7,6 +7,9 @@ license = "Apache-2.0" description = "Bridge Hub Westend emulated chain" publish = false +[lints] +workspace = true + [dependencies] serde_json = "1.0.104" diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/collectives/collectives-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/collectives/collectives-westend/Cargo.toml index 5dcf139bdb7..54d2d9b6b98 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/collectives/collectives-westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/collectives/collectives-westend/Cargo.toml @@ -7,6 +7,9 @@ license = "Apache-2.0" description = "Collectives Westend emulated chain" publish = false +[lints] +workspace = true + [dependencies] serde_json = "1.0.104" diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/Cargo.toml index 5886158c263..d325b78fa66 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/Cargo.toml @@ -7,6 +7,9 @@ license = "Apache-2.0" description = "Penpal emulated chain" publish = false +[lints] +workspace = true + [dependencies] serde_json = "1.0.104" diff --git a/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/Cargo.toml index 325c7229517..d2e54367de2 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/Cargo.toml @@ -7,6 +7,9 @@ license = "Apache-2.0" description = "Rococo emulated chain" publish = false +[lints] +workspace = true + [dependencies] serde_json = "1.0.104" diff --git a/cumulus/parachains/integration-tests/emulated/chains/relays/westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/relays/westend/Cargo.toml index 20b9737735f..b073bbb94f9 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/relays/westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/relays/westend/Cargo.toml @@ -7,6 +7,9 @@ license = "Apache-2.0" description = "Westend emulated chain" publish = false +[lints] +workspace = true + [dependencies] serde_json = "1.0.104" diff --git a/cumulus/parachains/integration-tests/emulated/common/Cargo.toml b/cumulus/parachains/integration-tests/emulated/common/Cargo.toml index 92716083d69..f2e799df810 100644 --- a/cumulus/parachains/integration-tests/emulated/common/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/common/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true license = "Apache-2.0" description = "Common resources for integration testing with xcm-emulator" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.4.0", default-features = false } paste = "1.0.14" diff --git a/cumulus/parachains/integration-tests/emulated/networks/rococo-system/Cargo.toml b/cumulus/parachains/integration-tests/emulated/networks/rococo-system/Cargo.toml index 713cc2ecdbb..bb31f8e467d 100644 --- a/cumulus/parachains/integration-tests/emulated/networks/rococo-system/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/networks/rococo-system/Cargo.toml @@ -7,6 +7,9 @@ license = "Apache-2.0" description = "Rococo System emulated network" publish = false +[lints] +workspace = true + [dependencies] # Cumulus emulated-integration-tests-common = { path = "../../common", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/networks/rococo-westend-system/Cargo.toml b/cumulus/parachains/integration-tests/emulated/networks/rococo-westend-system/Cargo.toml index 34713f5b48e..2a538b8e28c 100644 --- a/cumulus/parachains/integration-tests/emulated/networks/rococo-westend-system/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/networks/rococo-westend-system/Cargo.toml @@ -7,6 +7,9 @@ license = "Apache-2.0" description = "Rococo<>Westend emulated bridged network" publish = false +[lints] +workspace = true + [dependencies] # Cumulus emulated-integration-tests-common = { path = "../../common", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/networks/westend-system/Cargo.toml b/cumulus/parachains/integration-tests/emulated/networks/westend-system/Cargo.toml index 634111bc381..80ffb9cfd6c 100644 --- a/cumulus/parachains/integration-tests/emulated/networks/westend-system/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/networks/westend-system/Cargo.toml @@ -7,6 +7,9 @@ license = "Apache-2.0" description = "Westend System emulated network" publish = false +[lints] +workspace = true + [dependencies] # Cumulus emulated-integration-tests-common = { path = "../../common", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/Cargo.toml index bc4e7cfe376..445395fc783 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/Cargo.toml @@ -7,6 +7,9 @@ license = "Apache-2.0" description = "Asset Hub Rococo runtime integration tests with xcm-emulator" publish = false +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.4.0", default-features = false } assert_matches = "1.5.0" diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/Cargo.toml index a0861b49955..3b2d3367d40 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/Cargo.toml @@ -7,6 +7,9 @@ license = "Apache-2.0" description = "Asset Hub Westend runtime integration tests with xcm-emulator" publish = false +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.4.0", default-features = false } assert_matches = "1.5.0" diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/Cargo.toml index 4f33505f9a7..ce6b8c24a44 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/Cargo.toml @@ -7,6 +7,9 @@ license = "Apache-2.0" description = "Bridge Hub Rococo runtime integration tests with xcm-emulator" publish = false +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.4.0", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/Cargo.toml index 00cf54b6541..6dcb57f4161 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/Cargo.toml @@ -7,6 +7,9 @@ license = "Apache-2.0" description = "Bridge Hub Westend runtime integration tests with xcm-emulator" publish = false +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.4.0", default-features = false } diff --git a/cumulus/parachains/pallets/collective-content/Cargo.toml b/cumulus/parachains/pallets/collective-content/Cargo.toml index 26899a9e774..9ed2822fa30 100644 --- a/cumulus/parachains/pallets/collective-content/Cargo.toml +++ b/cumulus/parachains/pallets/collective-content/Cargo.toml @@ -6,6 +6,9 @@ edition = "2021" description = "Managed content" license = "Apache-2.0" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } diff --git a/cumulus/parachains/pallets/parachain-info/Cargo.toml b/cumulus/parachains/pallets/parachain-info/Cargo.toml index b5b6ec304df..31f7b8aef39 100644 --- a/cumulus/parachains/pallets/parachain-info/Cargo.toml +++ b/cumulus/parachains/pallets/parachain-info/Cargo.toml @@ -6,6 +6,9 @@ version = "0.1.0" license = "Apache-2.0" description = "Pallet to store the parachain ID" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } diff --git a/cumulus/parachains/pallets/ping/Cargo.toml b/cumulus/parachains/pallets/ping/Cargo.toml index c661e4260c6..5c1099a110a 100644 --- a/cumulus/parachains/pallets/ping/Cargo.toml +++ b/cumulus/parachains/pallets/ping/Cargo.toml @@ -6,6 +6,9 @@ version = "0.1.0" license = "Apache-2.0" description = "Ping Pallet for Cumulus XCM/UMP testing." +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml b/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml index 15166de15ae..47af627d6b2 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true description = "Rococo variant of Asset Hub parachain runtime" license = "Apache-2.0" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } hex-literal = { version = "0.4.1" } diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml b/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml index 2eb8e9a55d7..1a1ed0465a3 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true description = "Westend variant of Asset Hub parachain runtime" license = "Apache-2.0" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } hex-literal = { version = "0.4.1", optional = true } diff --git a/cumulus/parachains/runtimes/assets/common/Cargo.toml b/cumulus/parachains/runtimes/assets/common/Cargo.toml index e78d8331039..22729df5ed5 100644 --- a/cumulus/parachains/runtimes/assets/common/Cargo.toml +++ b/cumulus/parachains/runtimes/assets/common/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true description = "Assets common utilities" license = "Apache-2.0" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } diff --git a/cumulus/parachains/runtimes/assets/test-utils/Cargo.toml b/cumulus/parachains/runtimes/assets/test-utils/Cargo.toml index c8ea4490d10..a3ed3759600 100644 --- a/cumulus/parachains/runtimes/assets/test-utils/Cargo.toml +++ b/cumulus/parachains/runtimes/assets/test-utils/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true description = "Test utils for Asset Hub runtimes." license = "Apache-2.0" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml index 551615e155c..7902ca76b16 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true description = "Rococo's BridgeHub parachain runtime" license = "Apache-2.0" +[lints] +workspace = true + [build-dependencies] substrate-wasm-builder = { path = "../../../../../substrate/utils/wasm-builder", optional = true } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml index dd713987ffb..07c1a328285 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true description = "Westend's BridgeHub parachain runtime" license = "Apache-2.0" +[lints] +workspace = true + [build-dependencies] substrate-wasm-builder = { path = "../../../../../substrate/utils/wasm-builder", optional = true } diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml index 35cab04fcc4..3049182cd4e 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true description = "Utils for BridgeHub testing" license = "Apache-2.0" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } impl-trait-for-tuples = "0.2" diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/Cargo.toml b/cumulus/parachains/runtimes/collectives/collectives-westend/Cargo.toml index 433e55c6ea9..dd526a9e044 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true license = "Apache-2.0" description = "Westend Collectives Parachain Runtime" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } hex-literal = { version = "0.4.1" } diff --git a/cumulus/parachains/runtimes/contracts/contracts-rococo/Cargo.toml b/cumulus/parachains/runtimes/contracts/contracts-rococo/Cargo.toml index ca45f4760d0..54af73c3d03 100644 --- a/cumulus/parachains/runtimes/contracts/contracts-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/contracts/contracts-rococo/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license = "Apache-2.0" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/cumulus/parachains/runtimes/glutton/glutton-westend/Cargo.toml b/cumulus/parachains/runtimes/glutton/glutton-westend/Cargo.toml index b8efc4fbbcf..831e3242766 100644 --- a/cumulus/parachains/runtimes/glutton/glutton-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/glutton/glutton-westend/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true license = "Apache-2.0" description = "Glutton parachain runtime." +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } diff --git a/cumulus/parachains/runtimes/starters/seedling/Cargo.toml b/cumulus/parachains/runtimes/starters/seedling/Cargo.toml index 23312172bd7..37a3bb4ca26 100644 --- a/cumulus/parachains/runtimes/starters/seedling/Cargo.toml +++ b/cumulus/parachains/runtimes/starters/seedling/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license = "Apache-2.0" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } diff --git a/cumulus/parachains/runtimes/starters/shell/Cargo.toml b/cumulus/parachains/runtimes/starters/shell/Cargo.toml index a285d3d977e..3d7042ecd49 100644 --- a/cumulus/parachains/runtimes/starters/shell/Cargo.toml +++ b/cumulus/parachains/runtimes/starters/shell/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license = "Apache-2.0" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } diff --git a/cumulus/parachains/runtimes/test-utils/Cargo.toml b/cumulus/parachains/runtimes/test-utils/Cargo.toml index b4453e7f1a6..cd100c472ce 100644 --- a/cumulus/parachains/runtimes/test-utils/Cargo.toml +++ b/cumulus/parachains/runtimes/test-utils/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true description = "Utils for Runtimes testing" license = "Apache-2.0" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive", "max-encoded-len"] } diff --git a/cumulus/parachains/runtimes/testing/penpal/Cargo.toml b/cumulus/parachains/runtimes/testing/penpal/Cargo.toml index 6e044319d2e..4e2d145feb4 100644 --- a/cumulus/parachains/runtimes/testing/penpal/Cargo.toml +++ b/cumulus/parachains/runtimes/testing/penpal/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true edition.workspace = true +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/cumulus/parachains/runtimes/testing/rococo-parachain/Cargo.toml b/cumulus/parachains/runtimes/testing/rococo-parachain/Cargo.toml index 3903bbbe31e..a23b7558bce 100644 --- a/cumulus/parachains/runtimes/testing/rococo-parachain/Cargo.toml +++ b/cumulus/parachains/runtimes/testing/rococo-parachain/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true description = "Simple runtime used by the rococo parachain(s)" license = "Apache-2.0" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } diff --git a/cumulus/polkadot-parachain/Cargo.toml b/cumulus/polkadot-parachain/Cargo.toml index 860c420d45b..b8c1508da09 100644 --- a/cumulus/polkadot-parachain/Cargo.toml +++ b/cumulus/polkadot-parachain/Cargo.toml @@ -7,6 +7,9 @@ edition.workspace = true description = "Runs a polkadot parachain node which could be a collator." license = "Apache-2.0" +[lints] +workspace = true + [[bin]] name = "polkadot-parachain" path = "src/main.rs" diff --git a/cumulus/primitives/aura/Cargo.toml b/cumulus/primitives/aura/Cargo.toml index 096ae0a9620..6d917eea270 100644 --- a/cumulus/primitives/aura/Cargo.toml +++ b/cumulus/primitives/aura/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true license = "Apache-2.0" description = "Core primitives for Aura in Cumulus" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } diff --git a/cumulus/primitives/core/Cargo.toml b/cumulus/primitives/core/Cargo.toml index 5f68a3546e6..98c3e8ab567 100644 --- a/cumulus/primitives/core/Cargo.toml +++ b/cumulus/primitives/core/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true license = "Apache-2.0" description = "Cumulus related core primitive types and traits" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } diff --git a/cumulus/primitives/parachain-inherent/Cargo.toml b/cumulus/primitives/parachain-inherent/Cargo.toml index 5d3c72a59f9..bfb101a43f4 100644 --- a/cumulus/primitives/parachain-inherent/Cargo.toml +++ b/cumulus/primitives/parachain-inherent/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true description = "Inherent that needs to be present in every parachain block. Contains messages and a relay chain storage-proof." license = "Apache-2.0" +[lints] +workspace = true + [dependencies] async-trait = { version = "0.1.73", optional = true } codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } diff --git a/cumulus/primitives/proof-size-hostfunction/Cargo.toml b/cumulus/primitives/proof-size-hostfunction/Cargo.toml index 576f7f5ae99..06797f86863 100644 --- a/cumulus/primitives/proof-size-hostfunction/Cargo.toml +++ b/cumulus/primitives/proof-size-hostfunction/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true description = "Hostfunction exposing storage proof size to the runtime." license = "Apache-2.0" +[lints] +workspace = true + [dependencies] sp-runtime-interface = { path = "../../../substrate/primitives/runtime-interface", default-features = false } sp-externalities = { path = "../../../substrate/primitives/externalities", default-features = false } diff --git a/cumulus/primitives/timestamp/Cargo.toml b/cumulus/primitives/timestamp/Cargo.toml index ec5cb57419a..b07a907154d 100644 --- a/cumulus/primitives/timestamp/Cargo.toml +++ b/cumulus/primitives/timestamp/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true description = "Provides timestamp related functionality for parachains." license = "Apache-2.0" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } futures = "0.3.28" diff --git a/cumulus/primitives/utility/Cargo.toml b/cumulus/primitives/utility/Cargo.toml index 5f756c1e361..56b6b928417 100644 --- a/cumulus/primitives/utility/Cargo.toml +++ b/cumulus/primitives/utility/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true license = "Apache-2.0" description = "Helper datatypes for Cumulus" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } log = { version = "0.4.20", default-features = false } diff --git a/cumulus/test/client/Cargo.toml b/cumulus/test/client/Cargo.toml index 037b8600db6..7190172101c 100644 --- a/cumulus/test/client/Cargo.toml +++ b/cumulus/test/client/Cargo.toml @@ -5,6 +5,9 @@ authors.workspace = true edition.workspace = true publish = false +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } diff --git a/cumulus/test/relay-sproof-builder/Cargo.toml b/cumulus/test/relay-sproof-builder/Cargo.toml index 262a4ff92b5..02a9750d78e 100644 --- a/cumulus/test/relay-sproof-builder/Cargo.toml +++ b/cumulus/test/relay-sproof-builder/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true license = "Apache-2.0" description = "Mocked relay state proof builder for testing Cumulus." +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } diff --git a/cumulus/test/runtime/Cargo.toml b/cumulus/test/runtime/Cargo.toml index 7bdb69df2c2..5902a62512b 100644 --- a/cumulus/test/runtime/Cargo.toml +++ b/cumulus/test/runtime/Cargo.toml @@ -5,6 +5,9 @@ authors.workspace = true edition.workspace = true publish = false +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } diff --git a/cumulus/test/service/Cargo.toml b/cumulus/test/service/Cargo.toml index cc25c80d4bf..c4e7f7401b0 100644 --- a/cumulus/test/service/Cargo.toml +++ b/cumulus/test/service/Cargo.toml @@ -5,6 +5,9 @@ authors.workspace = true edition.workspace = true publish = false +[lints] +workspace = true + [[bin]] name = "test-parachain" path = "src/main.rs" diff --git a/cumulus/xcm/xcm-emulator/Cargo.toml b/cumulus/xcm/xcm-emulator/Cargo.toml index 2f851f1bcde..0f10221d600 100644 --- a/cumulus/xcm/xcm-emulator/Cargo.toml +++ b/cumulus/xcm/xcm-emulator/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license = "Apache-2.0" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0" } paste = "1.0.14" diff --git a/docs/sdk/Cargo.toml b/docs/sdk/Cargo.toml index 14b4747d558..c58c3402f6a 100644 --- a/docs/sdk/Cargo.toml +++ b/docs/sdk/Cargo.toml @@ -10,6 +10,9 @@ edition.workspace = true publish = false version = "0.0.1" +[lints] +workspace = true + [dependencies] # Needed for all FRAME-based code parity-scale-codec = { version = "3.0.0", default-features = false } diff --git a/polkadot/Cargo.toml b/polkadot/Cargo.toml index d8c6cc51bea..d769957490e 100644 --- a/polkadot/Cargo.toml +++ b/polkadot/Cargo.toml @@ -21,6 +21,9 @@ edition.workspace = true version = "1.5.0" default-run = "polkadot" +[lints] +workspace = true + [dependencies] color-eyre = { version = "0.6.1", default-features = false } tikv-jemallocator = { version = "0.5.0", optional = true, features = ["unprefixed_malloc_on_supported_platforms"] } diff --git a/polkadot/cli/Cargo.toml b/polkadot/cli/Cargo.toml index 95b63913ccb..ed90b2d58a4 100644 --- a/polkadot/cli/Cargo.toml +++ b/polkadot/cli/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [package.metadata.wasm-pack.profile.release] # `wasm-opt` has some problems on Linux, see # https://github.com/rustwasm/wasm-pack/issues/781 etc. diff --git a/polkadot/core-primitives/Cargo.toml b/polkadot/core-primitives/Cargo.toml index 1b8da759c15..32ee8d3ff3f 100644 --- a/polkadot/core-primitives/Cargo.toml +++ b/polkadot/core-primitives/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] sp-core = { path = "../../substrate/primitives/core", default-features = false } sp-std = { path = "../../substrate/primitives/std", default-features = false } diff --git a/polkadot/erasure-coding/Cargo.toml b/polkadot/erasure-coding/Cargo.toml index c965f5d70aa..f174f8ad0cf 100644 --- a/polkadot/erasure-coding/Cargo.toml +++ b/polkadot/erasure-coding/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] polkadot-primitives = { path = "../primitives" } polkadot-node-primitives = { package = "polkadot-node-primitives", path = "../node/primitives" } diff --git a/polkadot/erasure-coding/fuzzer/Cargo.toml b/polkadot/erasure-coding/fuzzer/Cargo.toml index 862b148cc5b..4e5ef9d229d 100644 --- a/polkadot/erasure-coding/fuzzer/Cargo.toml +++ b/polkadot/erasure-coding/fuzzer/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true license.workspace = true publish = false +[lints] +workspace = true + [dependencies] polkadot-erasure-coding = { path = ".." } honggfuzz = "0.5" diff --git a/polkadot/node/collation-generation/Cargo.toml b/polkadot/node/collation-generation/Cargo.toml index e0c86d233f9..366c08a6c67 100644 --- a/polkadot/node/collation-generation/Cargo.toml +++ b/polkadot/node/collation-generation/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true license.workspace = true description = "Collator-side subsystem that handles incoming candidate submissions from the parachain." +[lints] +workspace = true + [dependencies] futures = "0.3.21" gum = { package = "tracing-gum", path = "../gum" } diff --git a/polkadot/node/core/approval-voting/Cargo.toml b/polkadot/node/core/approval-voting/Cargo.toml index 9516dc52a30..61a1e84dd6f 100644 --- a/polkadot/node/core/approval-voting/Cargo.toml +++ b/polkadot/node/core/approval-voting/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true license.workspace = true description = "Approval Voting Subsystem of the Polkadot node" +[lints] +workspace = true + [dependencies] futures = "0.3.21" futures-timer = "3.0.2" diff --git a/polkadot/node/core/av-store/Cargo.toml b/polkadot/node/core/av-store/Cargo.toml index 3fa81d064a8..4b2baf3fc55 100644 --- a/polkadot/node/core/av-store/Cargo.toml +++ b/polkadot/node/core/av-store/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] futures = "0.3.21" futures-timer = "3.0.2" diff --git a/polkadot/node/core/backing/Cargo.toml b/polkadot/node/core/backing/Cargo.toml index 7a6ce5de8cb..16ed11e7eec 100644 --- a/polkadot/node/core/backing/Cargo.toml +++ b/polkadot/node/core/backing/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true license.workspace = true description = "The Candidate Backing Subsystem. Tracks parachain candidates that can be backed, as well as the issuance of statements about candidates." +[lints] +workspace = true + [dependencies] futures = "0.3.21" sp-keystore = { path = "../../../../substrate/primitives/keystore" } diff --git a/polkadot/node/core/bitfield-signing/Cargo.toml b/polkadot/node/core/bitfield-signing/Cargo.toml index 712a01b46b1..880273c0e7f 100644 --- a/polkadot/node/core/bitfield-signing/Cargo.toml +++ b/polkadot/node/core/bitfield-signing/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true license.workspace = true description = "Bitfield signing subsystem for the Polkadot node" +[lints] +workspace = true + [dependencies] futures = "0.3.21" gum = { package = "tracing-gum", path = "../../gum" } diff --git a/polkadot/node/core/candidate-validation/Cargo.toml b/polkadot/node/core/candidate-validation/Cargo.toml index a2e88778532..9ded9e58a16 100644 --- a/polkadot/node/core/candidate-validation/Cargo.toml +++ b/polkadot/node/core/candidate-validation/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] async-trait = "0.1.57" futures = "0.3.21" diff --git a/polkadot/node/core/chain-api/Cargo.toml b/polkadot/node/core/chain-api/Cargo.toml index fa824e78ffe..32962c9bda4 100644 --- a/polkadot/node/core/chain-api/Cargo.toml +++ b/polkadot/node/core/chain-api/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true license.workspace = true description = "The Chain API subsystem provides access to chain related utility functions like block number to hash conversions." +[lints] +workspace = true + [dependencies] futures = "0.3.21" gum = { package = "tracing-gum", path = "../../gum" } diff --git a/polkadot/node/core/chain-selection/Cargo.toml b/polkadot/node/core/chain-selection/Cargo.toml index 7678379870e..6056ddd41cd 100644 --- a/polkadot/node/core/chain-selection/Cargo.toml +++ b/polkadot/node/core/chain-selection/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] futures = "0.3.21" futures-timer = "3" diff --git a/polkadot/node/core/dispute-coordinator/Cargo.toml b/polkadot/node/core/dispute-coordinator/Cargo.toml index e2086db708f..8ec9bcbe070 100644 --- a/polkadot/node/core/dispute-coordinator/Cargo.toml +++ b/polkadot/node/core/dispute-coordinator/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] futures = "0.3.21" gum = { package = "tracing-gum", path = "../../gum" } diff --git a/polkadot/node/core/parachains-inherent/Cargo.toml b/polkadot/node/core/parachains-inherent/Cargo.toml index c783f21e24d..8d84b586a30 100644 --- a/polkadot/node/core/parachains-inherent/Cargo.toml +++ b/polkadot/node/core/parachains-inherent/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true license.workspace = true description = "Parachains inherent data provider for Polkadot node" +[lints] +workspace = true + [dependencies] futures = "0.3.21" futures-timer = "3.0.2" diff --git a/polkadot/node/core/prospective-parachains/Cargo.toml b/polkadot/node/core/prospective-parachains/Cargo.toml index 9db1259e61d..e6b6aa5e15d 100644 --- a/polkadot/node/core/prospective-parachains/Cargo.toml +++ b/polkadot/node/core/prospective-parachains/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true license.workspace = true description = "The Prospective Parachains subsystem. Tracks and handles prospective parachain fragments." +[lints] +workspace = true + [dependencies] futures = "0.3.19" gum = { package = "tracing-gum", path = "../../gum" } diff --git a/polkadot/node/core/provisioner/Cargo.toml b/polkadot/node/core/provisioner/Cargo.toml index d27e2343925..2d18bd29c1c 100644 --- a/polkadot/node/core/provisioner/Cargo.toml +++ b/polkadot/node/core/provisioner/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] bitvec = { version = "1.0.0", default-features = false, features = ["alloc"] } futures = "0.3.21" diff --git a/polkadot/node/core/pvf-checker/Cargo.toml b/polkadot/node/core/pvf-checker/Cargo.toml index 0326a20e5a5..274d8ee43bf 100644 --- a/polkadot/node/core/pvf-checker/Cargo.toml +++ b/polkadot/node/core/pvf-checker/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] futures = "0.3.21" thiserror = "1.0.48" diff --git a/polkadot/node/core/pvf/Cargo.toml b/polkadot/node/core/pvf/Cargo.toml index a1e70eabc0e..2642377b6e6 100644 --- a/polkadot/node/core/pvf/Cargo.toml +++ b/polkadot/node/core/pvf/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] always-assert = "0.1" blake3 = "1.5" diff --git a/polkadot/node/core/pvf/benches/host_prepare_rococo_runtime.rs b/polkadot/node/core/pvf/benches/host_prepare_rococo_runtime.rs index 368649a8d71..2aea21361a3 100644 --- a/polkadot/node/core/pvf/benches/host_prepare_rococo_runtime.rs +++ b/polkadot/node/core/pvf/benches/host_prepare_rococo_runtime.rs @@ -28,7 +28,8 @@ use tokio::{runtime::Handle, sync::Mutex}; const TEST_PREPARATION_TIMEOUT: Duration = Duration::from_secs(30); struct TestHost { - // Keep a reference to the tempdir as it gets deleted on drop. + // Keep a reference to the tempdir otherwise it gets deleted on drop. + #[allow(dead_code)] cache_dir: tempfile::TempDir, host: Mutex, } diff --git a/polkadot/node/core/pvf/common/Cargo.toml b/polkadot/node/core/pvf/common/Cargo.toml index bfe1be9156f..c5c09300e8a 100644 --- a/polkadot/node/core/pvf/common/Cargo.toml +++ b/polkadot/node/core/pvf/common/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] cfg-if = "1.0" cpu-time = "1.0.0" diff --git a/polkadot/node/core/pvf/execute-worker/Cargo.toml b/polkadot/node/core/pvf/execute-worker/Cargo.toml index 6e6206cf1b9..97dde59ebc2 100644 --- a/polkadot/node/core/pvf/execute-worker/Cargo.toml +++ b/polkadot/node/core/pvf/execute-worker/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] cpu-time = "1.0.0" gum = { package = "tracing-gum", path = "../../../gum" } diff --git a/polkadot/node/core/pvf/prepare-worker/Cargo.toml b/polkadot/node/core/pvf/prepare-worker/Cargo.toml index 4e53f7f46ca..81e887afe4d 100644 --- a/polkadot/node/core/pvf/prepare-worker/Cargo.toml +++ b/polkadot/node/core/pvf/prepare-worker/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] blake3 = "1.5" cfg-if = "1.0" diff --git a/polkadot/node/core/runtime-api/Cargo.toml b/polkadot/node/core/runtime-api/Cargo.toml index 965b280a747..547431b45b2 100644 --- a/polkadot/node/core/runtime-api/Cargo.toml +++ b/polkadot/node/core/runtime-api/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] futures = "0.3.21" gum = { package = "tracing-gum", path = "../../gum" } diff --git a/polkadot/node/gum/Cargo.toml b/polkadot/node/gum/Cargo.toml index acee9efd0e0..ccb21f64e63 100644 --- a/polkadot/node/gum/Cargo.toml +++ b/polkadot/node/gum/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true license.workspace = true description = "Stick logs together with the TraceID as provided by tempo" +[lints] +workspace = true + [dependencies] coarsetime = "0.1.22" tracing = "0.1.35" diff --git a/polkadot/node/gum/proc-macro/Cargo.toml b/polkadot/node/gum/proc-macro/Cargo.toml index e260cf1f929..f7880bfd2f9 100644 --- a/polkadot/node/gum/proc-macro/Cargo.toml +++ b/polkadot/node/gum/proc-macro/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true license.workspace = true description = "Generate an overseer including builder pattern and message wrapper from a single annotated struct definition." +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/polkadot/node/jaeger/Cargo.toml b/polkadot/node/jaeger/Cargo.toml index fcfbbaec611..81947f4f6a4 100644 --- a/polkadot/node/jaeger/Cargo.toml +++ b/polkadot/node/jaeger/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true license.workspace = true description = "Polkadot Jaeger primitives, but equally useful for Grafana/Tempo" +[lints] +workspace = true + [dependencies] mick-jaeger = "0.1.8" lazy_static = "1.4" diff --git a/polkadot/node/malus/Cargo.toml b/polkadot/node/malus/Cargo.toml index 2955bfbee18..d0a9b65f720 100644 --- a/polkadot/node/malus/Cargo.toml +++ b/polkadot/node/malus/Cargo.toml @@ -8,6 +8,9 @@ license.workspace = true readme = "README.md" publish = false +[lints] +workspace = true + [[bin]] name = "malus" path = "src/malus.rs" diff --git a/polkadot/node/metrics/Cargo.toml b/polkadot/node/metrics/Cargo.toml index e8e00a64c05..e9a4d463f4d 100644 --- a/polkadot/node/metrics/Cargo.toml +++ b/polkadot/node/metrics/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] futures = "0.3.21" futures-timer = "3.0.2" diff --git a/polkadot/node/network/approval-distribution/Cargo.toml b/polkadot/node/network/approval-distribution/Cargo.toml index 7db4aa77b7a..7291c1309e1 100644 --- a/polkadot/node/network/approval-distribution/Cargo.toml +++ b/polkadot/node/network/approval-distribution/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] polkadot-node-metrics = { path = "../../metrics" } polkadot-node-network-protocol = { path = "../protocol" } diff --git a/polkadot/node/network/availability-distribution/Cargo.toml b/polkadot/node/network/availability-distribution/Cargo.toml index 91ed1026e41..0d52c013a33 100644 --- a/polkadot/node/network/availability-distribution/Cargo.toml +++ b/polkadot/node/network/availability-distribution/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] futures = "0.3.21" gum = { package = "tracing-gum", path = "../../gum" } diff --git a/polkadot/node/network/availability-recovery/Cargo.toml b/polkadot/node/network/availability-recovery/Cargo.toml index 6048e6323cb..b97572181b0 100644 --- a/polkadot/node/network/availability-recovery/Cargo.toml +++ b/polkadot/node/network/availability-recovery/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] futures = "0.3.21" schnellru = "0.2.1" diff --git a/polkadot/node/network/bitfield-distribution/Cargo.toml b/polkadot/node/network/bitfield-distribution/Cargo.toml index 0e61e9cf620..5c5bd875a96 100644 --- a/polkadot/node/network/bitfield-distribution/Cargo.toml +++ b/polkadot/node/network/bitfield-distribution/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] always-assert = "0.1" futures = "0.3.21" diff --git a/polkadot/node/network/bridge/Cargo.toml b/polkadot/node/network/bridge/Cargo.toml index 6ae765c252f..d6b9a0a5e76 100644 --- a/polkadot/node/network/bridge/Cargo.toml +++ b/polkadot/node/network/bridge/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] always-assert = "0.1" async-trait = "0.1.57" diff --git a/polkadot/node/network/collator-protocol/Cargo.toml b/polkadot/node/network/collator-protocol/Cargo.toml index 367a97f35d9..bcf4f74132f 100644 --- a/polkadot/node/network/collator-protocol/Cargo.toml +++ b/polkadot/node/network/collator-protocol/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] bitvec = { version = "1.0.1", default-features = false, features = ["alloc"] } futures = "0.3.21" diff --git a/polkadot/node/network/dispute-distribution/Cargo.toml b/polkadot/node/network/dispute-distribution/Cargo.toml index f4ea358c41b..15a0edd3661 100644 --- a/polkadot/node/network/dispute-distribution/Cargo.toml +++ b/polkadot/node/network/dispute-distribution/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] futures = "0.3.21" futures-timer = "3.0.2" diff --git a/polkadot/node/network/gossip-support/Cargo.toml b/polkadot/node/network/gossip-support/Cargo.toml index 64a9743d1db..e4d6ac601c3 100644 --- a/polkadot/node/network/gossip-support/Cargo.toml +++ b/polkadot/node/network/gossip-support/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] sp-application-crypto = { path = "../../../../substrate/primitives/application-crypto" } sp-keystore = { path = "../../../../substrate/primitives/keystore" } diff --git a/polkadot/node/network/protocol/Cargo.toml b/polkadot/node/network/protocol/Cargo.toml index 379334ded24..1aded1f3c07 100644 --- a/polkadot/node/network/protocol/Cargo.toml +++ b/polkadot/node/network/protocol/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true license.workspace = true description = "Primitives types for the Node-side" +[lints] +workspace = true + [dependencies] async-channel = "1.8.0" async-trait = "0.1.57" diff --git a/polkadot/node/network/statement-distribution/Cargo.toml b/polkadot/node/network/statement-distribution/Cargo.toml index e251abc445d..85d2c75aa79 100644 --- a/polkadot/node/network/statement-distribution/Cargo.toml +++ b/polkadot/node/network/statement-distribution/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] futures = "0.3.21" futures-timer = "3.0.2" diff --git a/polkadot/node/overseer/Cargo.toml b/polkadot/node/overseer/Cargo.toml index d9266055a39..ec1849404b0 100644 --- a/polkadot/node/overseer/Cargo.toml +++ b/polkadot/node/overseer/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true license.workspace = true description = "System overseer of the Polkadot node" +[lints] +workspace = true + [dependencies] client = { package = "sc-client-api", path = "../../../substrate/client/api" } sp-api = { path = "../../../substrate/primitives/api" } diff --git a/polkadot/node/primitives/Cargo.toml b/polkadot/node/primitives/Cargo.toml index 6c37ebb986f..802a830f3ab 100644 --- a/polkadot/node/primitives/Cargo.toml +++ b/polkadot/node/primitives/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] bounded-vec = "0.7" futures = "0.3.21" diff --git a/polkadot/node/service/Cargo.toml b/polkadot/node/service/Cargo.toml index 81eff49ee30..85accff9e29 100644 --- a/polkadot/node/service/Cargo.toml +++ b/polkadot/node/service/Cargo.toml @@ -7,6 +7,9 @@ edition.workspace = true license.workspace = true description = "Utils to tie different Polkadot components together and allow instantiation of a node." +[lints] +workspace = true + [dependencies] # Substrate Client sc-authority-discovery = { path = "../../../substrate/client/authority-discovery" } diff --git a/polkadot/node/subsystem-test-helpers/Cargo.toml b/polkadot/node/subsystem-test-helpers/Cargo.toml index 9087ca11f5d..eb6e10559c2 100644 --- a/polkadot/node/subsystem-test-helpers/Cargo.toml +++ b/polkadot/node/subsystem-test-helpers/Cargo.toml @@ -7,6 +7,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] async-trait = "0.1.57" futures = "0.3.21" diff --git a/polkadot/node/subsystem-types/Cargo.toml b/polkadot/node/subsystem-types/Cargo.toml index dfda6c1b3c5..5518e9d080c 100644 --- a/polkadot/node/subsystem-types/Cargo.toml +++ b/polkadot/node/subsystem-types/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] derive_more = "0.99.17" futures = "0.3.21" diff --git a/polkadot/node/subsystem-util/Cargo.toml b/polkadot/node/subsystem-util/Cargo.toml index 9150fddc2bb..d6df3fbe3e2 100644 --- a/polkadot/node/subsystem-util/Cargo.toml +++ b/polkadot/node/subsystem-util/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] async-trait = "0.1.57" futures = "0.3.21" diff --git a/polkadot/node/subsystem/Cargo.toml b/polkadot/node/subsystem/Cargo.toml index 9b77359517c..b0b396d7f62 100644 --- a/polkadot/node/subsystem/Cargo.toml +++ b/polkadot/node/subsystem/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] polkadot-overseer = { path = "../overseer" } polkadot-node-subsystem-types = { path = "../subsystem-types" } diff --git a/polkadot/node/test/client/Cargo.toml b/polkadot/node/test/client/Cargo.toml index 646f1ea9732..36748c3b455 100644 --- a/polkadot/node/test/client/Cargo.toml +++ b/polkadot/node/test/client/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive"] } diff --git a/polkadot/node/test/service/Cargo.toml b/polkadot/node/test/service/Cargo.toml index aa143f40300..3199dc262bb 100644 --- a/polkadot/node/test/service/Cargo.toml +++ b/polkadot/node/test/service/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] futures = "0.3.21" hex = "0.4.3" diff --git a/polkadot/node/tracking-allocator/Cargo.toml b/polkadot/node/tracking-allocator/Cargo.toml index b1b33091344..486346e1fe1 100644 --- a/polkadot/node/tracking-allocator/Cargo.toml +++ b/polkadot/node/tracking-allocator/Cargo.toml @@ -5,3 +5,6 @@ version = "1.0.0" authors.workspace = true edition.workspace = true license.workspace = true + +[lints] +workspace = true diff --git a/polkadot/node/zombienet-backchannel/Cargo.toml b/polkadot/node/zombienet-backchannel/Cargo.toml index c1b08b4a2bb..e81ab2db14b 100644 --- a/polkadot/node/zombienet-backchannel/Cargo.toml +++ b/polkadot/node/zombienet-backchannel/Cargo.toml @@ -8,6 +8,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] tokio = { version = "1.24.2", default-features = false, features = ["macros", "net", "rt-multi-thread", "sync"] } url = "2.3.1" diff --git a/polkadot/parachain/Cargo.toml b/polkadot/parachain/Cargo.toml index 7c8935d987e..0521af3bf2d 100644 --- a/polkadot/parachain/Cargo.toml +++ b/polkadot/parachain/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true license.workspace = true version = "1.0.0" +[lints] +workspace = true + [dependencies] # note: special care is taken to avoid inclusion of `sp-io` externals when compiling # this crate for WASM. This is critical to avoid forcing all parachain WASM into implementing diff --git a/polkadot/parachain/test-parachains/Cargo.toml b/polkadot/parachain/test-parachains/Cargo.toml index 7bbeda4893b..6acdedf67ff 100644 --- a/polkadot/parachain/test-parachains/Cargo.toml +++ b/polkadot/parachain/test-parachains/Cargo.toml @@ -7,6 +7,9 @@ edition.workspace = true license.workspace = true publish = false +[lints] +workspace = true + [dependencies] tiny-keccak = { version = "2.0.2", features = ["keccak"] } parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive"] } diff --git a/polkadot/parachain/test-parachains/adder/Cargo.toml b/polkadot/parachain/test-parachains/adder/Cargo.toml index ee0f6f551af..eec19ef788a 100644 --- a/polkadot/parachain/test-parachains/adder/Cargo.toml +++ b/polkadot/parachain/test-parachains/adder/Cargo.toml @@ -8,6 +8,9 @@ version = "1.0.0" authors.workspace = true publish = false +[lints] +workspace = true + [dependencies] parachain = { package = "polkadot-parachain-primitives", path = "../..", default-features = false, features = ["wasm-api"] } parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive"] } diff --git a/polkadot/parachain/test-parachains/adder/collator/Cargo.toml b/polkadot/parachain/test-parachains/adder/collator/Cargo.toml index 8a018e330ba..b8f0c579b8b 100644 --- a/polkadot/parachain/test-parachains/adder/collator/Cargo.toml +++ b/polkadot/parachain/test-parachains/adder/collator/Cargo.toml @@ -7,6 +7,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [[bin]] name = "adder-collator" path = "src/main.rs" diff --git a/polkadot/parachain/test-parachains/halt/Cargo.toml b/polkadot/parachain/test-parachains/halt/Cargo.toml index 428f33f730e..1bdd4392ad3 100644 --- a/polkadot/parachain/test-parachains/halt/Cargo.toml +++ b/polkadot/parachain/test-parachains/halt/Cargo.toml @@ -8,6 +8,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] [build-dependencies] diff --git a/polkadot/parachain/test-parachains/undying/Cargo.toml b/polkadot/parachain/test-parachains/undying/Cargo.toml index e763b65cfdd..19e1261db1e 100644 --- a/polkadot/parachain/test-parachains/undying/Cargo.toml +++ b/polkadot/parachain/test-parachains/undying/Cargo.toml @@ -8,6 +8,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] parachain = { package = "polkadot-parachain-primitives", path = "../..", default-features = false, features = ["wasm-api"] } parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive"] } diff --git a/polkadot/parachain/test-parachains/undying/collator/Cargo.toml b/polkadot/parachain/test-parachains/undying/collator/Cargo.toml index 29d36452eee..4ef24ca83dc 100644 --- a/polkadot/parachain/test-parachains/undying/collator/Cargo.toml +++ b/polkadot/parachain/test-parachains/undying/collator/Cargo.toml @@ -7,6 +7,9 @@ version = "1.0.0" authors.workspace = true publish = false +[lints] +workspace = true + [[bin]] name = "undying-collator" path = "src/main.rs" diff --git a/polkadot/primitives/Cargo.toml b/polkadot/primitives/Cargo.toml index 5e746c622cf..de6df85051a 100644 --- a/polkadot/primitives/Cargo.toml +++ b/polkadot/primitives/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true license.workspace = true description = "Shared primitives used by Polkadot runtime" +[lints] +workspace = true + [dependencies] bitvec = { version = "1.0.0", default-features = false, features = ["alloc", "serde"] } hex-literal = "0.4.1" diff --git a/polkadot/primitives/test-helpers/Cargo.toml b/polkadot/primitives/test-helpers/Cargo.toml index 8215b842ba4..fab9480cfde 100644 --- a/polkadot/primitives/test-helpers/Cargo.toml +++ b/polkadot/primitives/test-helpers/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] sp-keyring = { path = "../../../substrate/primitives/keyring" } sp-application-crypto = { package = "sp-application-crypto", path = "../../../substrate/primitives/application-crypto", default-features = false } diff --git a/polkadot/rpc/Cargo.toml b/polkadot/rpc/Cargo.toml index ce11b26e554..8c582c623ba 100644 --- a/polkadot/rpc/Cargo.toml +++ b/polkadot/rpc/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true license.workspace = true description = "Polkadot specific RPC functionality." +[lints] +workspace = true + [dependencies] jsonrpsee = { version = "0.16.2", features = ["server"] } polkadot-primitives = { path = "../primitives" } diff --git a/polkadot/runtime/common/Cargo.toml b/polkadot/runtime/common/Cargo.toml index 7e8461c73ef..1af29be0ae8 100644 --- a/polkadot/runtime/common/Cargo.toml +++ b/polkadot/runtime/common/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] impl-trait-for-tuples = "0.2.2" bitvec = { version = "1.0.0", default-features = false, features = ["alloc"] } diff --git a/polkadot/runtime/common/slot_range_helper/Cargo.toml b/polkadot/runtime/common/slot_range_helper/Cargo.toml index f31811c1272..3a402d01196 100644 --- a/polkadot/runtime/common/slot_range_helper/Cargo.toml +++ b/polkadot/runtime/common/slot_range_helper/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true license.workspace = true description = "Helper crate for generating slot ranges for the Polkadot runtime." +[lints] +workspace = true + [dependencies] paste = "1.0" enumn = "0.1.12" diff --git a/polkadot/runtime/metrics/Cargo.toml b/polkadot/runtime/metrics/Cargo.toml index ad4a2fa9207..9a16749bf60 100644 --- a/polkadot/runtime/metrics/Cargo.toml +++ b/polkadot/runtime/metrics/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true license.workspace = true description = "Runtime metric interface for the Polkadot node" +[lints] +workspace = true + [dependencies] sp-std = { package = "sp-std", path = "../../../substrate/primitives/std", default-features = false } sp-tracing = { path = "../../../substrate/primitives/tracing", default-features = false } diff --git a/polkadot/runtime/parachains/Cargo.toml b/polkadot/runtime/parachains/Cargo.toml index 2627bc9ef49..0bcf5c04c34 100644 --- a/polkadot/runtime/parachains/Cargo.toml +++ b/polkadot/runtime/parachains/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] impl-trait-for-tuples = "0.2.2" bitvec = { version = "1.0.0", default-features = false, features = ["alloc"] } diff --git a/polkadot/runtime/rococo/Cargo.toml b/polkadot/runtime/rococo/Cargo.toml index 1edce2aa44d..c7236572ed7 100644 --- a/polkadot/runtime/rococo/Cargo.toml +++ b/polkadot/runtime/rococo/Cargo.toml @@ -7,6 +7,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive", "max-encoded-len"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } diff --git a/polkadot/runtime/rococo/constants/Cargo.toml b/polkadot/runtime/rococo/constants/Cargo.toml index a383ca65476..1e6b0a5f903 100644 --- a/polkadot/runtime/rococo/constants/Cargo.toml +++ b/polkadot/runtime/rococo/constants/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] smallvec = "1.8.0" diff --git a/polkadot/runtime/test-runtime/Cargo.toml b/polkadot/runtime/test-runtime/Cargo.toml index 850047c83bc..585f16ac86f 100644 --- a/polkadot/runtime/test-runtime/Cargo.toml +++ b/polkadot/runtime/test-runtime/Cargo.toml @@ -7,6 +7,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] bitvec = { version = "1.0.0", default-features = false, features = ["alloc"] } parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive"] } diff --git a/polkadot/runtime/test-runtime/constants/Cargo.toml b/polkadot/runtime/test-runtime/constants/Cargo.toml index 88cd441f73b..2b387bbd307 100644 --- a/polkadot/runtime/test-runtime/constants/Cargo.toml +++ b/polkadot/runtime/test-runtime/constants/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] smallvec = "1.8.0" diff --git a/polkadot/runtime/westend/Cargo.toml b/polkadot/runtime/westend/Cargo.toml index d8402ff39ee..335ac14d47a 100644 --- a/polkadot/runtime/westend/Cargo.toml +++ b/polkadot/runtime/westend/Cargo.toml @@ -7,6 +7,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] bitvec = { version = "1.0.0", default-features = false, features = ["alloc"] } parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive", "max-encoded-len"] } diff --git a/polkadot/runtime/westend/constants/Cargo.toml b/polkadot/runtime/westend/constants/Cargo.toml index d2fa4158200..d2e86970e50 100644 --- a/polkadot/runtime/westend/constants/Cargo.toml +++ b/polkadot/runtime/westend/constants/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] smallvec = "1.8.0" diff --git a/polkadot/statement-table/Cargo.toml b/polkadot/statement-table/Cargo.toml index d2518591d26..9a313882da7 100644 --- a/polkadot/statement-table/Cargo.toml +++ b/polkadot/statement-table/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true license.workspace = true description = "Stores messages other authorities issue about candidates in Polkadot." +[lints] +workspace = true + [dependencies] parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive"] } sp-core = { path = "../../substrate/primitives/core" } diff --git a/polkadot/utils/generate-bags/Cargo.toml b/polkadot/utils/generate-bags/Cargo.toml index 361c6af71bc..97f15f02e35 100644 --- a/polkadot/utils/generate-bags/Cargo.toml +++ b/polkadot/utils/generate-bags/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true license.workspace = true description = "CLI to generate voter bags for Polkadot runtimes" +[lints] +workspace = true + [dependencies] clap = { version = "4.4.11", features = ["derive"] } diff --git a/polkadot/utils/remote-ext-tests/bags-list/Cargo.toml b/polkadot/utils/remote-ext-tests/bags-list/Cargo.toml index 4a75142d00c..6b8c4be38a1 100644 --- a/polkadot/utils/remote-ext-tests/bags-list/Cargo.toml +++ b/polkadot/utils/remote-ext-tests/bags-list/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] westend-runtime = { path = "../../../runtime/westend" } westend-runtime-constants = { path = "../../../runtime/westend/constants" } diff --git a/polkadot/xcm/Cargo.toml b/polkadot/xcm/Cargo.toml index 3d05957a3fe..235a4b204c9 100644 --- a/polkadot/xcm/Cargo.toml +++ b/polkadot/xcm/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] bounded-collections = { version = "0.1.9", default-features = false, features = ["serde"] } derivative = { version = "2.2.0", default-features = false, features = ["use_core"] } diff --git a/polkadot/xcm/pallet-xcm-benchmarks/Cargo.toml b/polkadot/xcm/pallet-xcm-benchmarks/Cargo.toml index 5438279c673..d9cc7e34c06 100644 --- a/polkadot/xcm/pallet-xcm-benchmarks/Cargo.toml +++ b/polkadot/xcm/pallet-xcm-benchmarks/Cargo.toml @@ -6,6 +6,9 @@ license.workspace = true version = "1.0.0" description = "Benchmarks for the XCM pallet" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/polkadot/xcm/pallet-xcm/Cargo.toml b/polkadot/xcm/pallet-xcm/Cargo.toml index 645ac8f9941..220aad01398 100644 --- a/polkadot/xcm/pallet-xcm/Cargo.toml +++ b/polkadot/xcm/pallet-xcm/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] bounded-collections = { version = "0.1.8", default-features = false } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } diff --git a/polkadot/xcm/procedural/Cargo.toml b/polkadot/xcm/procedural/Cargo.toml index bb67bf0d1b0..8467016070a 100644 --- a/polkadot/xcm/procedural/Cargo.toml +++ b/polkadot/xcm/procedural/Cargo.toml @@ -7,6 +7,9 @@ license.workspace = true version = "1.0.0" publish = true +[lints] +workspace = true + [lib] proc-macro = true diff --git a/polkadot/xcm/xcm-builder/Cargo.toml b/polkadot/xcm/xcm-builder/Cargo.toml index 53743066720..ff528d7d075 100644 --- a/polkadot/xcm/xcm-builder/Cargo.toml +++ b/polkadot/xcm/xcm-builder/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true license.workspace = true version = "1.0.0" +[lints] +workspace = true + [dependencies] impl-trait-for-tuples = "0.2.1" parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive"] } diff --git a/polkadot/xcm/xcm-executor/Cargo.toml b/polkadot/xcm/xcm-executor/Cargo.toml index b435c2d510a..32fa6669c0a 100644 --- a/polkadot/xcm/xcm-executor/Cargo.toml +++ b/polkadot/xcm/xcm-executor/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true license.workspace = true version = "1.0.0" +[lints] +workspace = true + [dependencies] impl-trait-for-tuples = "0.2.2" environmental = { version = "1.1.4", default-features = false } diff --git a/polkadot/xcm/xcm-executor/integration-tests/Cargo.toml b/polkadot/xcm/xcm-executor/integration-tests/Cargo.toml index 0818d16a262..cafe12dc587 100644 --- a/polkadot/xcm/xcm-executor/integration-tests/Cargo.toml +++ b/polkadot/xcm/xcm-executor/integration-tests/Cargo.toml @@ -7,6 +7,9 @@ license.workspace = true version = "1.0.0" publish = false +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1" } frame-support = { path = "../../../../substrate/frame/support", default-features = false } diff --git a/polkadot/xcm/xcm-simulator/Cargo.toml b/polkadot/xcm/xcm-simulator/Cargo.toml index eedcfa0032a..051e9752f6e 100644 --- a/polkadot/xcm/xcm-simulator/Cargo.toml +++ b/polkadot/xcm/xcm-simulator/Cargo.toml @@ -6,6 +6,9 @@ authors.workspace = true edition.workspace = true license.workspace = true +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1" } paste = "1.0.7" diff --git a/polkadot/xcm/xcm-simulator/example/Cargo.toml b/polkadot/xcm/xcm-simulator/example/Cargo.toml index f0caa5ab48e..522b7855837 100644 --- a/polkadot/xcm/xcm-simulator/example/Cargo.toml +++ b/polkadot/xcm/xcm-simulator/example/Cargo.toml @@ -6,6 +6,9 @@ edition.workspace = true license.workspace = true version = "1.0.0" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1" } scale-info = { version = "2.10.0", features = ["derive"] } diff --git a/polkadot/xcm/xcm-simulator/fuzzer/Cargo.toml b/polkadot/xcm/xcm-simulator/fuzzer/Cargo.toml index acf28bec4f1..1d13c76f171 100644 --- a/polkadot/xcm/xcm-simulator/fuzzer/Cargo.toml +++ b/polkadot/xcm/xcm-simulator/fuzzer/Cargo.toml @@ -7,6 +7,9 @@ edition.workspace = true license.workspace = true publish = false +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1" } honggfuzz = "0.5.55" diff --git a/substrate/bin/minimal/node/Cargo.toml b/substrate/bin/minimal/node/Cargo.toml index 4358009057a..532cded68de 100644 --- a/substrate/bin/minimal/node/Cargo.toml +++ b/substrate/bin/minimal/node/Cargo.toml @@ -10,6 +10,9 @@ publish = false repository = "https://github.com/substrate-developer-hub/substrate-node-template/" build = "build.rs" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/bin/minimal/runtime/Cargo.toml b/substrate/bin/minimal/runtime/Cargo.toml index f7685642d27..296106544bb 100644 --- a/substrate/bin/minimal/runtime/Cargo.toml +++ b/substrate/bin/minimal/runtime/Cargo.toml @@ -8,6 +8,9 @@ repository.workspace = true license.workspace = true publish = false +[lints] +workspace = true + [dependencies] parity-scale-codec = { version = "3.0.0", default-features = false } scale-info = { version = "2.6.0", default-features = false } diff --git a/substrate/bin/node-template/node/Cargo.toml b/substrate/bin/node-template/node/Cargo.toml index 1541ffec27f..9d8c4430c21 100644 --- a/substrate/bin/node-template/node/Cargo.toml +++ b/substrate/bin/node-template/node/Cargo.toml @@ -10,6 +10,9 @@ publish = false repository = "https://github.com/substrate-developer-hub/substrate-node-template/" build = "build.rs" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/bin/node-template/pallets/template/Cargo.toml b/substrate/bin/node-template/pallets/template/Cargo.toml index 405d9c229f8..51410a71c7b 100644 --- a/substrate/bin/node-template/pallets/template/Cargo.toml +++ b/substrate/bin/node-template/pallets/template/Cargo.toml @@ -9,6 +9,9 @@ license = "MIT-0" publish = false repository = "https://github.com/substrate-developer-hub/substrate-node-template/" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/bin/node-template/runtime/Cargo.toml b/substrate/bin/node-template/runtime/Cargo.toml index 55fb03159ab..14a64948c0b 100644 --- a/substrate/bin/node-template/runtime/Cargo.toml +++ b/substrate/bin/node-template/runtime/Cargo.toml @@ -9,6 +9,9 @@ license = "MIT-0" publish = false repository = "https://github.com/substrate-developer-hub/substrate-node-template/" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/bin/node/bench/Cargo.toml b/substrate/bin/node/bench/Cargo.toml index 1d9ce149d4f..48b3ef1b67e 100644 --- a/substrate/bin/node/bench/Cargo.toml +++ b/substrate/bin/node/bench/Cargo.toml @@ -9,6 +9,9 @@ homepage = "https://substrate.io" repository.workspace = true publish = false +[lints] +workspace = true + # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] diff --git a/substrate/bin/node/cli/Cargo.toml b/substrate/bin/node/cli/Cargo.toml index 307aae1189e..4f78bd65e8f 100644 --- a/substrate/bin/node/cli/Cargo.toml +++ b/substrate/bin/node/cli/Cargo.toml @@ -11,6 +11,9 @@ homepage = "https://substrate.io" repository.workspace = true publish = false +[lints] +workspace = true + [package.metadata.wasm-pack.profile.release] # `wasm-opt` has some problems on linux, see # https://github.com/rustwasm/wasm-pack/issues/781 etc. diff --git a/substrate/bin/node/inspect/Cargo.toml b/substrate/bin/node/inspect/Cargo.toml index 0457fd54cab..44de013483e 100644 --- a/substrate/bin/node/inspect/Cargo.toml +++ b/substrate/bin/node/inspect/Cargo.toml @@ -8,6 +8,9 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" homepage = "https://substrate.io" repository.workspace = true +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/bin/node/primitives/Cargo.toml b/substrate/bin/node/primitives/Cargo.toml index 40735ff21d4..24279ad09c3 100644 --- a/substrate/bin/node/primitives/Cargo.toml +++ b/substrate/bin/node/primitives/Cargo.toml @@ -9,6 +9,9 @@ homepage = "https://substrate.io" repository.workspace = true publish = false +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/bin/node/rpc/Cargo.toml b/substrate/bin/node/rpc/Cargo.toml index 43db4ab9d34..a4a361fadbc 100644 --- a/substrate/bin/node/rpc/Cargo.toml +++ b/substrate/bin/node/rpc/Cargo.toml @@ -9,6 +9,9 @@ homepage = "https://substrate.io" repository.workspace = true publish = false +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/bin/node/runtime/Cargo.toml b/substrate/bin/node/runtime/Cargo.toml index 8ea2988bee0..1d3f71f3436 100644 --- a/substrate/bin/node/runtime/Cargo.toml +++ b/substrate/bin/node/runtime/Cargo.toml @@ -10,6 +10,9 @@ homepage = "https://substrate.io" repository.workspace = true publish = false +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/bin/node/testing/Cargo.toml b/substrate/bin/node/testing/Cargo.toml index 513cb22b6a2..76188ed446c 100644 --- a/substrate/bin/node/testing/Cargo.toml +++ b/substrate/bin/node/testing/Cargo.toml @@ -9,6 +9,9 @@ homepage = "https://substrate.io" repository.workspace = true publish = false +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/bin/utils/chain-spec-builder/Cargo.toml b/substrate/bin/utils/chain-spec-builder/Cargo.toml index 110c1b6ce02..dcbe26f6a8f 100644 --- a/substrate/bin/utils/chain-spec-builder/Cargo.toml +++ b/substrate/bin/utils/chain-spec-builder/Cargo.toml @@ -9,6 +9,9 @@ homepage = "https://substrate.io" repository.workspace = true publish = false +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/bin/utils/subkey/Cargo.toml b/substrate/bin/utils/subkey/Cargo.toml index 37eba299cb2..58aa036a631 100644 --- a/substrate/bin/utils/subkey/Cargo.toml +++ b/substrate/bin/utils/subkey/Cargo.toml @@ -9,6 +9,9 @@ homepage = "https://substrate.io" repository.workspace = true readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/allocator/Cargo.toml b/substrate/client/allocator/Cargo.toml index 31c714180ce..ef13c1a4573 100644 --- a/substrate/client/allocator/Cargo.toml +++ b/substrate/client/allocator/Cargo.toml @@ -10,6 +10,9 @@ description = "Collection of allocator implementations." documentation = "https://docs.rs/sc-allocator" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/api/Cargo.toml b/substrate/client/api/Cargo.toml index 57a364e791f..8c50b872914 100644 --- a/substrate/client/api/Cargo.toml +++ b/substrate/client/api/Cargo.toml @@ -10,6 +10,9 @@ description = "Substrate client interfaces." documentation = "https://docs.rs/sc-client-api" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/authority-discovery/Cargo.toml b/substrate/client/authority-discovery/Cargo.toml index 40c2162c799..33db0c156eb 100644 --- a/substrate/client/authority-discovery/Cargo.toml +++ b/substrate/client/authority-discovery/Cargo.toml @@ -10,6 +10,9 @@ repository.workspace = true description = "Substrate authority discovery." readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/basic-authorship/Cargo.toml b/substrate/client/basic-authorship/Cargo.toml index 1d60fc7f53e..926909ec7b7 100644 --- a/substrate/client/basic-authorship/Cargo.toml +++ b/substrate/client/basic-authorship/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Basic implementation of block-authoring logic." readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/block-builder/Cargo.toml b/substrate/client/block-builder/Cargo.toml index 852ee84f89b..4477f5f1d77 100644 --- a/substrate/client/block-builder/Cargo.toml +++ b/substrate/client/block-builder/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Substrate block builder" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/chain-spec/Cargo.toml b/substrate/client/chain-spec/Cargo.toml index d041d5bfd2b..c870ff19b2a 100644 --- a/substrate/client/chain-spec/Cargo.toml +++ b/substrate/client/chain-spec/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Substrate chain configurations." readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/chain-spec/derive/Cargo.toml b/substrate/client/chain-spec/derive/Cargo.toml index 0fbe1074d27..b5a2bdc09b3 100644 --- a/substrate/client/chain-spec/derive/Cargo.toml +++ b/substrate/client/chain-spec/derive/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true description = "Macros to derive chain spec extension traits implementation." +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/cli/Cargo.toml b/substrate/client/cli/Cargo.toml index de303975031..82362e35ea6 100644 --- a/substrate/client/cli/Cargo.toml +++ b/substrate/client/cli/Cargo.toml @@ -9,6 +9,9 @@ homepage = "https://substrate.io" repository.workspace = true readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/consensus/aura/Cargo.toml b/substrate/client/consensus/aura/Cargo.toml index bc9648f683a..a323a1dda47 100644 --- a/substrate/client/consensus/aura/Cargo.toml +++ b/substrate/client/consensus/aura/Cargo.toml @@ -9,6 +9,9 @@ homepage = "https://substrate.io" repository.workspace = true readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/consensus/babe/Cargo.toml b/substrate/client/consensus/babe/Cargo.toml index 6008a5a99f8..996063cef1b 100644 --- a/substrate/client/consensus/babe/Cargo.toml +++ b/substrate/client/consensus/babe/Cargo.toml @@ -10,6 +10,9 @@ repository.workspace = true documentation = "https://docs.rs/sc-consensus-babe" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/consensus/babe/rpc/Cargo.toml b/substrate/client/consensus/babe/rpc/Cargo.toml index 913dd990fd3..b23f3f81d43 100644 --- a/substrate/client/consensus/babe/rpc/Cargo.toml +++ b/substrate/client/consensus/babe/rpc/Cargo.toml @@ -9,6 +9,9 @@ homepage = "https://substrate.io" repository.workspace = true readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/consensus/beefy/Cargo.toml b/substrate/client/consensus/beefy/Cargo.toml index 6ee70b523bc..8ffa6b24be8 100644 --- a/substrate/client/consensus/beefy/Cargo.toml +++ b/substrate/client/consensus/beefy/Cargo.toml @@ -8,6 +8,9 @@ repository.workspace = true description = "BEEFY Client gadget for substrate" homepage = "https://substrate.io" +[lints] +workspace = true + [dependencies] array-bytes = "6.1" async-channel = "1.8.0" diff --git a/substrate/client/consensus/beefy/rpc/Cargo.toml b/substrate/client/consensus/beefy/rpc/Cargo.toml index 35041a1208f..157b0cc87fc 100644 --- a/substrate/client/consensus/beefy/rpc/Cargo.toml +++ b/substrate/client/consensus/beefy/rpc/Cargo.toml @@ -8,6 +8,9 @@ repository.workspace = true description = "RPC for the BEEFY Client gadget for substrate" homepage = "https://substrate.io" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", features = ["derive"] } futures = "0.3.21" diff --git a/substrate/client/consensus/common/Cargo.toml b/substrate/client/consensus/common/Cargo.toml index 95ee02a9262..9c0305bb8c9 100644 --- a/substrate/client/consensus/common/Cargo.toml +++ b/substrate/client/consensus/common/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Collection of common consensus specific imlementations for Substrate (client)" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/consensus/epochs/Cargo.toml b/substrate/client/consensus/epochs/Cargo.toml index 07de83980bc..76e4c05a673 100644 --- a/substrate/client/consensus/epochs/Cargo.toml +++ b/substrate/client/consensus/epochs/Cargo.toml @@ -9,6 +9,9 @@ homepage = "https://substrate.io" repository.workspace = true readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/consensus/grandpa/Cargo.toml b/substrate/client/consensus/grandpa/Cargo.toml index e1baff3bbf2..14ce52f2729 100644 --- a/substrate/client/consensus/grandpa/Cargo.toml +++ b/substrate/client/consensus/grandpa/Cargo.toml @@ -10,6 +10,9 @@ description = "Integration of the GRANDPA finality gadget into substrate." documentation = "https://docs.rs/sc-consensus-grandpa" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/consensus/grandpa/rpc/Cargo.toml b/substrate/client/consensus/grandpa/rpc/Cargo.toml index 2a0d51dd616..983f7a4339b 100644 --- a/substrate/client/consensus/grandpa/rpc/Cargo.toml +++ b/substrate/client/consensus/grandpa/rpc/Cargo.toml @@ -9,6 +9,9 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" readme = "README.md" homepage = "https://substrate.io" +[lints] +workspace = true + [dependencies] finality-grandpa = { version = "0.16.2", features = ["derive-codec"] } futures = "0.3.16" diff --git a/substrate/client/consensus/manual-seal/Cargo.toml b/substrate/client/consensus/manual-seal/Cargo.toml index b0b9c1ee6eb..c111f0494de 100644 --- a/substrate/client/consensus/manual-seal/Cargo.toml +++ b/substrate/client/consensus/manual-seal/Cargo.toml @@ -9,6 +9,9 @@ homepage = "https://substrate.io" repository.workspace = true readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/consensus/pow/Cargo.toml b/substrate/client/consensus/pow/Cargo.toml index ef32425685b..d5eebb23e13 100644 --- a/substrate/client/consensus/pow/Cargo.toml +++ b/substrate/client/consensus/pow/Cargo.toml @@ -9,6 +9,9 @@ homepage = "https://substrate.io" repository.workspace = true readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/consensus/slots/Cargo.toml b/substrate/client/consensus/slots/Cargo.toml index 52c528c3028..29206004c23 100644 --- a/substrate/client/consensus/slots/Cargo.toml +++ b/substrate/client/consensus/slots/Cargo.toml @@ -10,6 +10,9 @@ homepage = "https://substrate.io" repository.workspace = true readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/db/Cargo.toml b/substrate/client/db/Cargo.toml index bb22ff4c6c1..e833b90b3ed 100644 --- a/substrate/client/db/Cargo.toml +++ b/substrate/client/db/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Client backend that uses RocksDB database as storage." readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/executor/Cargo.toml b/substrate/client/executor/Cargo.toml index 50aedf8a348..aa8e8c9abf2 100644 --- a/substrate/client/executor/Cargo.toml +++ b/substrate/client/executor/Cargo.toml @@ -10,6 +10,9 @@ description = "A crate that provides means of executing/dispatching calls into t documentation = "https://docs.rs/sc-executor" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/executor/common/Cargo.toml b/substrate/client/executor/common/Cargo.toml index 5118279b43b..b3db6a86a20 100644 --- a/substrate/client/executor/common/Cargo.toml +++ b/substrate/client/executor/common/Cargo.toml @@ -10,6 +10,9 @@ description = "A set of common definitions that are needed for defining executio documentation = "https://docs.rs/sc-executor-common/" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/executor/runtime-test/Cargo.toml b/substrate/client/executor/runtime-test/Cargo.toml index 84ed458fb1c..82610c4f50c 100644 --- a/substrate/client/executor/runtime-test/Cargo.toml +++ b/substrate/client/executor/runtime-test/Cargo.toml @@ -9,6 +9,9 @@ publish = false homepage = "https://substrate.io" repository.workspace = true +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/executor/wasmtime/Cargo.toml b/substrate/client/executor/wasmtime/Cargo.toml index b1434ef7c52..f8df23a026e 100644 --- a/substrate/client/executor/wasmtime/Cargo.toml +++ b/substrate/client/executor/wasmtime/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Defines a `WasmRuntime` that uses the Wasmtime JIT to execute." readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/informant/Cargo.toml b/substrate/client/informant/Cargo.toml index 47e65df3cc1..8373e5a54c1 100644 --- a/substrate/client/informant/Cargo.toml +++ b/substrate/client/informant/Cargo.toml @@ -9,6 +9,9 @@ homepage = "https://substrate.io" repository.workspace = true readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/keystore/Cargo.toml b/substrate/client/keystore/Cargo.toml index 3fd88ae8b87..7671aac0bd7 100644 --- a/substrate/client/keystore/Cargo.toml +++ b/substrate/client/keystore/Cargo.toml @@ -10,6 +10,9 @@ description = "Keystore (and session key management) for ed25519 based chains li documentation = "https://docs.rs/sc-keystore" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/merkle-mountain-range/Cargo.toml b/substrate/client/merkle-mountain-range/Cargo.toml index ae60fd1ce89..f6dbaf86c51 100644 --- a/substrate/client/merkle-mountain-range/Cargo.toml +++ b/substrate/client/merkle-mountain-range/Cargo.toml @@ -8,6 +8,9 @@ repository.workspace = true description = "MMR Client gadget for substrate" homepage = "https://substrate.io" +[lints] +workspace = true + # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] diff --git a/substrate/client/merkle-mountain-range/rpc/Cargo.toml b/substrate/client/merkle-mountain-range/rpc/Cargo.toml index d978d3cd2ed..d4ee0b48522 100644 --- a/substrate/client/merkle-mountain-range/rpc/Cargo.toml +++ b/substrate/client/merkle-mountain-range/rpc/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true description = "Node-specific RPC methods for interaction with Merkle Mountain Range pallet." +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/mixnet/Cargo.toml b/substrate/client/mixnet/Cargo.toml index d11cb1805ff..e8543b5bdf2 100644 --- a/substrate/client/mixnet/Cargo.toml +++ b/substrate/client/mixnet/Cargo.toml @@ -9,6 +9,9 @@ homepage = "https://substrate.io" repository = "https://github.com/paritytech/substrate/" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/network-gossip/Cargo.toml b/substrate/client/network-gossip/Cargo.toml index 0ad9dec4651..d4fb416a4a0 100644 --- a/substrate/client/network-gossip/Cargo.toml +++ b/substrate/client/network-gossip/Cargo.toml @@ -10,6 +10,9 @@ repository.workspace = true documentation = "https://docs.rs/sc-network-gossip" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/network/Cargo.toml b/substrate/client/network/Cargo.toml index ff8046868d5..abad2c80917 100644 --- a/substrate/client/network/Cargo.toml +++ b/substrate/client/network/Cargo.toml @@ -10,6 +10,9 @@ repository.workspace = true documentation = "https://docs.rs/sc-network" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/network/bitswap/Cargo.toml b/substrate/client/network/bitswap/Cargo.toml index f4ad4b3a0e9..cc919d2977e 100644 --- a/substrate/client/network/bitswap/Cargo.toml +++ b/substrate/client/network/bitswap/Cargo.toml @@ -9,6 +9,9 @@ homepage = "https://substrate.io" repository.workspace = true documentation = "https://docs.rs/sc-network-bitswap" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/network/common/Cargo.toml b/substrate/client/network/common/Cargo.toml index 65c8e1d71c7..5b0eb5510a5 100644 --- a/substrate/client/network/common/Cargo.toml +++ b/substrate/client/network/common/Cargo.toml @@ -9,6 +9,9 @@ homepage = "https://substrate.io" repository.workspace = true documentation = "https://docs.rs/sc-network-sync" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/network/light/Cargo.toml b/substrate/client/network/light/Cargo.toml index 17b21432811..c75d14f0deb 100644 --- a/substrate/client/network/light/Cargo.toml +++ b/substrate/client/network/light/Cargo.toml @@ -9,6 +9,9 @@ homepage = "https://substrate.io" repository.workspace = true documentation = "https://docs.rs/sc-network-light" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/network/statement/Cargo.toml b/substrate/client/network/statement/Cargo.toml index ef974b4f33f..e07eb939ea3 100644 --- a/substrate/client/network/statement/Cargo.toml +++ b/substrate/client/network/statement/Cargo.toml @@ -9,6 +9,9 @@ homepage = "https://substrate.io" repository.workspace = true documentation = "https://docs.rs/sc-network-statement" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/network/sync/Cargo.toml b/substrate/client/network/sync/Cargo.toml index a9b8ec577e3..f20592d5f25 100644 --- a/substrate/client/network/sync/Cargo.toml +++ b/substrate/client/network/sync/Cargo.toml @@ -9,6 +9,9 @@ homepage = "https://substrate.io" repository.workspace = true documentation = "https://docs.rs/sc-network-sync" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/network/test/Cargo.toml b/substrate/client/network/test/Cargo.toml index a11ed2a3ec8..cd66c701660 100644 --- a/substrate/client/network/test/Cargo.toml +++ b/substrate/client/network/test/Cargo.toml @@ -9,6 +9,9 @@ publish = false homepage = "https://substrate.io" repository.workspace = true +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/network/transactions/Cargo.toml b/substrate/client/network/transactions/Cargo.toml index 2a6aa4b3a40..8acd4531de8 100644 --- a/substrate/client/network/transactions/Cargo.toml +++ b/substrate/client/network/transactions/Cargo.toml @@ -9,6 +9,9 @@ homepage = "https://substrate.io" repository.workspace = true documentation = "https://docs.rs/sc-network-transactions" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/offchain/Cargo.toml b/substrate/client/offchain/Cargo.toml index 01deb322134..9f9731ba8de 100644 --- a/substrate/client/offchain/Cargo.toml +++ b/substrate/client/offchain/Cargo.toml @@ -9,6 +9,9 @@ homepage = "https://substrate.io" repository.workspace = true readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/proposer-metrics/Cargo.toml b/substrate/client/proposer-metrics/Cargo.toml index b6b4452ecc6..664b72764a3 100644 --- a/substrate/client/proposer-metrics/Cargo.toml +++ b/substrate/client/proposer-metrics/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Basic metrics for block production." readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/rpc-api/Cargo.toml b/substrate/client/rpc-api/Cargo.toml index b5c0f70d94c..6b1270fc370 100644 --- a/substrate/client/rpc-api/Cargo.toml +++ b/substrate/client/rpc-api/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Substrate RPC interfaces." readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/rpc-servers/Cargo.toml b/substrate/client/rpc-servers/Cargo.toml index a7cc374f97a..5bb7317264c 100644 --- a/substrate/client/rpc-servers/Cargo.toml +++ b/substrate/client/rpc-servers/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Substrate RPC servers." readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/rpc-spec-v2/Cargo.toml b/substrate/client/rpc-spec-v2/Cargo.toml index 45a1d862f04..b5fb8b5b204 100644 --- a/substrate/client/rpc-spec-v2/Cargo.toml +++ b/substrate/client/rpc-spec-v2/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Substrate RPC interface v2." readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/rpc/Cargo.toml b/substrate/client/rpc/Cargo.toml index 1cedcb3a6d0..361d98a6b10 100644 --- a/substrate/client/rpc/Cargo.toml +++ b/substrate/client/rpc/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Substrate Client RPC" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/service/Cargo.toml b/substrate/client/service/Cargo.toml index ae03a5dab36..4c03b59a663 100644 --- a/substrate/client/service/Cargo.toml +++ b/substrate/client/service/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Substrate service. Starts a thread that spins up the network, client, and extrinsic pool. Manages communication between them." readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/service/test/Cargo.toml b/substrate/client/service/test/Cargo.toml index 93576be9b59..625d8286396 100644 --- a/substrate/client/service/test/Cargo.toml +++ b/substrate/client/service/test/Cargo.toml @@ -8,6 +8,9 @@ publish = false homepage = "https://substrate.io" repository.workspace = true +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/state-db/Cargo.toml b/substrate/client/state-db/Cargo.toml index c5e8272637d..001ada02ef2 100644 --- a/substrate/client/state-db/Cargo.toml +++ b/substrate/client/state-db/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "State database maintenance. Handles canonicalization and pruning in the database." readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/statement-store/Cargo.toml b/substrate/client/statement-store/Cargo.toml index e7bfd544afe..adfd27a1705 100644 --- a/substrate/client/statement-store/Cargo.toml +++ b/substrate/client/statement-store/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Substrate statement store." readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/storage-monitor/Cargo.toml b/substrate/client/storage-monitor/Cargo.toml index f7c62f44af4..1c4a136ade6 100644 --- a/substrate/client/storage-monitor/Cargo.toml +++ b/substrate/client/storage-monitor/Cargo.toml @@ -8,6 +8,9 @@ repository.workspace = true description = "Storage monitor service for substrate" homepage = "https://substrate.io" +[lints] +workspace = true + [dependencies] clap = { version = "4.4.11", features = ["derive", "string"] } log = "0.4.17" diff --git a/substrate/client/sync-state-rpc/Cargo.toml b/substrate/client/sync-state-rpc/Cargo.toml index 746f1c754f9..c839a4210e4 100644 --- a/substrate/client/sync-state-rpc/Cargo.toml +++ b/substrate/client/sync-state-rpc/Cargo.toml @@ -8,6 +8,9 @@ license = "Apache-2.0" homepage = "https://substrate.io" repository.workspace = true +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/sysinfo/Cargo.toml b/substrate/client/sysinfo/Cargo.toml index 4cd1b222bc6..e5d5987c90e 100644 --- a/substrate/client/sysinfo/Cargo.toml +++ b/substrate/client/sysinfo/Cargo.toml @@ -10,6 +10,9 @@ description = "A crate that provides basic hardware and software telemetry infor documentation = "https://docs.rs/sc-sysinfo" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/telemetry/Cargo.toml b/substrate/client/telemetry/Cargo.toml index 71119df1153..0f7f8ab33ee 100644 --- a/substrate/client/telemetry/Cargo.toml +++ b/substrate/client/telemetry/Cargo.toml @@ -10,6 +10,9 @@ repository.workspace = true documentation = "https://docs.rs/sc-telemetry" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/tracing/Cargo.toml b/substrate/client/tracing/Cargo.toml index 844969c5ce2..94dd6e89231 100644 --- a/substrate/client/tracing/Cargo.toml +++ b/substrate/client/tracing/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Instrumentation implementation for substrate." readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/tracing/proc-macro/Cargo.toml b/substrate/client/tracing/proc-macro/Cargo.toml index 509e87174da..d85a4a7468a 100644 --- a/substrate/client/tracing/proc-macro/Cargo.toml +++ b/substrate/client/tracing/proc-macro/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true description = "Helper macros for Substrate's client CLI" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/transaction-pool/Cargo.toml b/substrate/client/transaction-pool/Cargo.toml index 3e90304497f..493f6680c4c 100644 --- a/substrate/client/transaction-pool/Cargo.toml +++ b/substrate/client/transaction-pool/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Substrate transaction pool implementation." readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/client/transaction-pool/api/Cargo.toml b/substrate/client/transaction-pool/api/Cargo.toml index 89981c27511..29e402c34f8 100644 --- a/substrate/client/transaction-pool/api/Cargo.toml +++ b/substrate/client/transaction-pool/api/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true description = "Transaction pool client facing API." +[lints] +workspace = true + [dependencies] async-trait = "0.1.57" codec = { package = "parity-scale-codec", version = "3.6.1" } diff --git a/substrate/client/utils/Cargo.toml b/substrate/client/utils/Cargo.toml index da618b0259e..a19457ac3d0 100644 --- a/substrate/client/utils/Cargo.toml +++ b/substrate/client/utils/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "I/O for Substrate runtimes" readme = "README.md" +[lints] +workspace = true + [dependencies] async-channel = "1.8.0" futures = "0.3.21" diff --git a/substrate/frame/Cargo.toml b/substrate/frame/Cargo.toml index d6953dac7b8..083d098b22a 100644 --- a/substrate/frame/Cargo.toml +++ b/substrate/frame/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "The single package to get you started with building frame pallets and runtimes" publish = false +[lints] +workspace = true + [package.metadata.docs.rs] # enable `experimental` feature for docs features = ["experimental"] diff --git a/substrate/frame/alliance/Cargo.toml b/substrate/frame/alliance/Cargo.toml index 1afff8ad43e..39f5a6ceb75 100644 --- a/substrate/frame/alliance/Cargo.toml +++ b/substrate/frame/alliance/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "The Alliance pallet provides a collective for standard-setting industry collaboration." readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/asset-conversion/Cargo.toml b/substrate/frame/asset-conversion/Cargo.toml index 5df86d402e0..0c7b06abf55 100644 --- a/substrate/frame/asset-conversion/Cargo.toml +++ b/substrate/frame/asset-conversion/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME asset conversion pallet" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/asset-rate/Cargo.toml b/substrate/frame/asset-rate/Cargo.toml index af2776bba5f..835a15e8c55 100644 --- a/substrate/frame/asset-rate/Cargo.toml +++ b/substrate/frame/asset-rate/Cargo.toml @@ -8,6 +8,9 @@ edition.workspace = true license = "Apache-2.0" repository.workspace = true +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/assets/Cargo.toml b/substrate/frame/assets/Cargo.toml index 87709af2727..7b0af2421ea 100644 --- a/substrate/frame/assets/Cargo.toml +++ b/substrate/frame/assets/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME asset management pallet" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/atomic-swap/Cargo.toml b/substrate/frame/atomic-swap/Cargo.toml index 0a0f20eb8e8..d34779d8bc0 100644 --- a/substrate/frame/atomic-swap/Cargo.toml +++ b/substrate/frame/atomic-swap/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME atomic swap pallet" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/aura/Cargo.toml b/substrate/frame/aura/Cargo.toml index 321a19f74f9..e2419933a20 100644 --- a/substrate/frame/aura/Cargo.toml +++ b/substrate/frame/aura/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME AURA consensus pallet" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/authority-discovery/Cargo.toml b/substrate/frame/authority-discovery/Cargo.toml index 7051276ad88..a1819965744 100644 --- a/substrate/frame/authority-discovery/Cargo.toml +++ b/substrate/frame/authority-discovery/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME pallet for authority discovery" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/authorship/Cargo.toml b/substrate/frame/authorship/Cargo.toml index 737c8da1361..41d4cf13972 100644 --- a/substrate/frame/authorship/Cargo.toml +++ b/substrate/frame/authorship/Cargo.toml @@ -9,6 +9,9 @@ homepage = "https://substrate.io" repository.workspace = true readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/babe/Cargo.toml b/substrate/frame/babe/Cargo.toml index defa89b4f28..639b9544b0c 100644 --- a/substrate/frame/babe/Cargo.toml +++ b/substrate/frame/babe/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Consensus extension module for BABE consensus. Collects on-chain randomness from VRF outputs and manages epoch transitions." readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/bags-list/Cargo.toml b/substrate/frame/bags-list/Cargo.toml index b99726ebf2d..198af21be81 100644 --- a/substrate/frame/bags-list/Cargo.toml +++ b/substrate/frame/bags-list/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true description = "FRAME pallet bags list" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/bags-list/fuzzer/Cargo.toml b/substrate/frame/bags-list/fuzzer/Cargo.toml index f3785dd1bef..20760141b23 100644 --- a/substrate/frame/bags-list/fuzzer/Cargo.toml +++ b/substrate/frame/bags-list/fuzzer/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Fuzzer for FRAME pallet bags list" publish = false +[lints] +workspace = true + [dependencies] honggfuzz = "0.5" rand = { version = "0.8", features = ["small_rng", "std"] } diff --git a/substrate/frame/bags-list/remote-tests/Cargo.toml b/substrate/frame/bags-list/remote-tests/Cargo.toml index 169dd19db9a..fb61a986778 100644 --- a/substrate/frame/bags-list/remote-tests/Cargo.toml +++ b/substrate/frame/bags-list/remote-tests/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME pallet bags list remote test" publish = false +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/balances/Cargo.toml b/substrate/frame/balances/Cargo.toml index a148684e1fb..23fe6e58322 100644 --- a/substrate/frame/balances/Cargo.toml +++ b/substrate/frame/balances/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME pallet to manage balances" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/beefy-mmr/Cargo.toml b/substrate/frame/beefy-mmr/Cargo.toml index ee336def85c..7f647305456 100644 --- a/substrate/frame/beefy-mmr/Cargo.toml +++ b/substrate/frame/beefy-mmr/Cargo.toml @@ -8,6 +8,9 @@ description = "BEEFY + MMR runtime utilities" repository.workspace = true homepage = "https://substrate.io" +[lints] +workspace = true + [dependencies] array-bytes = { version = "6.1", optional = true } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } diff --git a/substrate/frame/beefy/Cargo.toml b/substrate/frame/beefy/Cargo.toml index 4a77dd0e2ff..185e5487414 100644 --- a/substrate/frame/beefy/Cargo.toml +++ b/substrate/frame/beefy/Cargo.toml @@ -8,6 +8,9 @@ repository.workspace = true description = "BEEFY FRAME pallet" homepage = "https://substrate.io" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } log = { version = "0.4.17", default-features = false } diff --git a/substrate/frame/benchmarking/Cargo.toml b/substrate/frame/benchmarking/Cargo.toml index 9cfaac1abfd..980f70a5774 100644 --- a/substrate/frame/benchmarking/Cargo.toml +++ b/substrate/frame/benchmarking/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Macro for benchmarking a FRAME runtime." readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/benchmarking/pov/Cargo.toml b/substrate/frame/benchmarking/pov/Cargo.toml index 1ec02828558..7c36b2f8eec 100644 --- a/substrate/frame/benchmarking/pov/Cargo.toml +++ b/substrate/frame/benchmarking/pov/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true description = "Pallet for testing FRAME PoV benchmarking" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/bounties/Cargo.toml b/substrate/frame/bounties/Cargo.toml index 3b77a8448e3..16da862d488 100644 --- a/substrate/frame/bounties/Cargo.toml +++ b/substrate/frame/bounties/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME pallet to manage bounties" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/broker/Cargo.toml b/substrate/frame/broker/Cargo.toml index 3470cf55b78..77757c30463 100644 --- a/substrate/frame/broker/Cargo.toml +++ b/substrate/frame/broker/Cargo.toml @@ -8,6 +8,9 @@ edition.workspace = true license = "Apache-2.0" repository.workspace = true +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/child-bounties/Cargo.toml b/substrate/frame/child-bounties/Cargo.toml index 8e9d9c17238..6c1c362dc56 100644 --- a/substrate/frame/child-bounties/Cargo.toml +++ b/substrate/frame/child-bounties/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME pallet to manage child bounties" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/collective/Cargo.toml b/substrate/frame/collective/Cargo.toml index 672468450c2..fb0bace740c 100644 --- a/substrate/frame/collective/Cargo.toml +++ b/substrate/frame/collective/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Collective system: Members of a set of account IDs can make their collective feelings known through dispatched calls from one of two specialized origins." readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/contracts/Cargo.toml b/substrate/frame/contracts/Cargo.toml index 29c39c047a3..4c6ca41ed56 100644 --- a/substrate/frame/contracts/Cargo.toml +++ b/substrate/frame/contracts/Cargo.toml @@ -11,6 +11,9 @@ description = "FRAME pallet for WASM contracts" readme = "README.md" include = ["CHANGELOG.md", "README.md", "benchmarks/**", "build.rs", "src/**/*"] +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/contracts/fixtures/Cargo.toml b/substrate/frame/contracts/fixtures/Cargo.toml index 1c247bf22c0..97606479f25 100644 --- a/substrate/frame/contracts/fixtures/Cargo.toml +++ b/substrate/frame/contracts/fixtures/Cargo.toml @@ -7,6 +7,9 @@ edition.workspace = true license.workspace = true description = "Fixtures for testing contracts pallet." +[lints] +workspace = true + [dependencies] wat = "1" frame-system = { path = "../../system" } diff --git a/substrate/frame/contracts/fixtures/contracts/common/Cargo.toml b/substrate/frame/contracts/fixtures/contracts/common/Cargo.toml index 127bb575088..377e8bc9dd5 100644 --- a/substrate/frame/contracts/fixtures/contracts/common/Cargo.toml +++ b/substrate/frame/contracts/fixtures/contracts/common/Cargo.toml @@ -6,3 +6,6 @@ authors.workspace = true edition.workspace = true license.workspace = true description = "Common utilities for pallet-contracts-fixtures." + +[lints] +workspace = true diff --git a/substrate/frame/contracts/mock-network/Cargo.toml b/substrate/frame/contracts/mock-network/Cargo.toml index 9c6231a783a..7b570eed155 100644 --- a/substrate/frame/contracts/mock-network/Cargo.toml +++ b/substrate/frame/contracts/mock-network/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true description = "A mock network for testing pallet-contracts" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive", "max-encoded-len"] } diff --git a/substrate/frame/contracts/primitives/Cargo.toml b/substrate/frame/contracts/primitives/Cargo.toml index f821797c923..d1db766ce81 100644 --- a/substrate/frame/contracts/primitives/Cargo.toml +++ b/substrate/frame/contracts/primitives/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "A crate that hosts a common definitions that are relevant for the pallet-contracts." readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/contracts/proc-macro/Cargo.toml b/substrate/frame/contracts/proc-macro/Cargo.toml index f05df18954c..573cd96d3ab 100644 --- a/substrate/frame/contracts/proc-macro/Cargo.toml +++ b/substrate/frame/contracts/proc-macro/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true description = "Procedural macros used in pallet_contracts" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/contracts/uapi/Cargo.toml b/substrate/frame/contracts/uapi/Cargo.toml index df45872349d..f2901427282 100644 --- a/substrate/frame/contracts/uapi/Cargo.toml +++ b/substrate/frame/contracts/uapi/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true description = "Exposes all the host functions that a contract can import." +[lints] +workspace = true + [dependencies] paste = { version = "1.0", default-features = false } bitflags = "1.0" diff --git a/substrate/frame/conviction-voting/Cargo.toml b/substrate/frame/conviction-voting/Cargo.toml index 19eb6d09fc1..6d96dde1aaa 100644 --- a/substrate/frame/conviction-voting/Cargo.toml +++ b/substrate/frame/conviction-voting/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME pallet for conviction voting in referenda" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/core-fellowship/Cargo.toml b/substrate/frame/core-fellowship/Cargo.toml index c6f99cdaab2..d223ecd4f24 100644 --- a/substrate/frame/core-fellowship/Cargo.toml +++ b/substrate/frame/core-fellowship/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Logic as per the description of The Fellowship for core Polkadot technology" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/democracy/Cargo.toml b/substrate/frame/democracy/Cargo.toml index 061eee106d4..7bfc8c6903b 100644 --- a/substrate/frame/democracy/Cargo.toml +++ b/substrate/frame/democracy/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME pallet for democracy" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/election-provider-multi-phase/Cargo.toml b/substrate/frame/election-provider-multi-phase/Cargo.toml index f1640f7cc70..be3a77065b4 100644 --- a/substrate/frame/election-provider-multi-phase/Cargo.toml +++ b/substrate/frame/election-provider-multi-phase/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true description = "PALLET two phase election providers" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/election-provider-multi-phase/test-staking-e2e/Cargo.toml b/substrate/frame/election-provider-multi-phase/test-staking-e2e/Cargo.toml index 44295d5e20d..05c6a6d4046 100644 --- a/substrate/frame/election-provider-multi-phase/test-staking-e2e/Cargo.toml +++ b/substrate/frame/election-provider-multi-phase/test-staking-e2e/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME election provider multi phase pallet tests with staking pallet, bags-list and session pallets" publish = false +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/election-provider-support/Cargo.toml b/substrate/frame/election-provider-support/Cargo.toml index 7062e54cdbc..8182863d796 100644 --- a/substrate/frame/election-provider-support/Cargo.toml +++ b/substrate/frame/election-provider-support/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true description = "election provider supporting traits" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/election-provider-support/benchmarking/Cargo.toml b/substrate/frame/election-provider-support/benchmarking/Cargo.toml index b1e3564b4d4..7a2ad5cafb4 100644 --- a/substrate/frame/election-provider-support/benchmarking/Cargo.toml +++ b/substrate/frame/election-provider-support/benchmarking/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true description = "Benchmarking for election provider support onchain config trait" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/election-provider-support/solution-type/Cargo.toml b/substrate/frame/election-provider-support/solution-type/Cargo.toml index f81b366a5ec..ba36daebec3 100644 --- a/substrate/frame/election-provider-support/solution-type/Cargo.toml +++ b/substrate/frame/election-provider-support/solution-type/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true description = "NPoS Solution Type" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/election-provider-support/solution-type/fuzzer/Cargo.toml b/substrate/frame/election-provider-support/solution-type/fuzzer/Cargo.toml index 1f0261571a5..a7a84b91dba 100644 --- a/substrate/frame/election-provider-support/solution-type/fuzzer/Cargo.toml +++ b/substrate/frame/election-provider-support/solution-type/fuzzer/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Fuzzer for phragmén solution type implementation." publish = false +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/elections-phragmen/Cargo.toml b/substrate/frame/elections-phragmen/Cargo.toml index ffb939fa4d2..3c0bc56a1d0 100644 --- a/substrate/frame/elections-phragmen/Cargo.toml +++ b/substrate/frame/elections-phragmen/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME pallet based on seq-Phragmén election method." readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/examples/Cargo.toml b/substrate/frame/examples/Cargo.toml index b272a15dd63..eb6355edd31 100644 --- a/substrate/frame/examples/Cargo.toml +++ b/substrate/frame/examples/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "The single package with examples of various types of FRAME pallets" publish = false +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/examples/basic/Cargo.toml b/substrate/frame/examples/basic/Cargo.toml index 53da9ac2eba..3be1a2e558d 100644 --- a/substrate/frame/examples/basic/Cargo.toml +++ b/substrate/frame/examples/basic/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME example pallet" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/examples/default-config/Cargo.toml b/substrate/frame/examples/default-config/Cargo.toml index 0d80e6838f0..01ddf9d3834 100644 --- a/substrate/frame/examples/default-config/Cargo.toml +++ b/substrate/frame/examples/default-config/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME example pallet demonstrating derive_impl / default_config in action" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/examples/dev-mode/Cargo.toml b/substrate/frame/examples/dev-mode/Cargo.toml index ce558fe087b..f634d21cf2c 100644 --- a/substrate/frame/examples/dev-mode/Cargo.toml +++ b/substrate/frame/examples/dev-mode/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME example pallet" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/examples/frame-crate/Cargo.toml b/substrate/frame/examples/frame-crate/Cargo.toml index 586b6c0216e..93a46ba7b24 100644 --- a/substrate/frame/examples/frame-crate/Cargo.toml +++ b/substrate/frame/examples/frame-crate/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME example pallet with umbrella crate" publish = false +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/examples/kitchensink/Cargo.toml b/substrate/frame/examples/kitchensink/Cargo.toml index 3b3b7a3761a..4255ebb66b6 100644 --- a/substrate/frame/examples/kitchensink/Cargo.toml +++ b/substrate/frame/examples/kitchensink/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME example kitchensink pallet" publish = false +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/examples/offchain-worker/Cargo.toml b/substrate/frame/examples/offchain-worker/Cargo.toml index 9d0b682ee02..464719375c6 100644 --- a/substrate/frame/examples/offchain-worker/Cargo.toml +++ b/substrate/frame/examples/offchain-worker/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME example pallet for offchain worker" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/examples/split/Cargo.toml b/substrate/frame/examples/split/Cargo.toml index b6b9ea86dfe..97f9062f181 100644 --- a/substrate/frame/examples/split/Cargo.toml +++ b/substrate/frame/examples/split/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME example splitted pallet" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/examples/tasks/Cargo.toml b/substrate/frame/examples/tasks/Cargo.toml index e26e822e40f..046bad908d1 100644 --- a/substrate/frame/examples/tasks/Cargo.toml +++ b/substrate/frame/examples/tasks/Cargo.toml @@ -7,6 +7,9 @@ license.workspace = true repository.workspace = true description = "Pallet to demonstrate the usage of Tasks to recongnize and execute service work" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/executive/Cargo.toml b/substrate/frame/executive/Cargo.toml index c2a92ad3d72..b98ceb0ba9a 100644 --- a/substrate/frame/executive/Cargo.toml +++ b/substrate/frame/executive/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME executives engine" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/fast-unstake/Cargo.toml b/substrate/frame/fast-unstake/Cargo.toml index 4440a0c0f64..673a2f71d6c 100644 --- a/substrate/frame/fast-unstake/Cargo.toml +++ b/substrate/frame/fast-unstake/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true description = "FRAME fast unstake pallet" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/glutton/Cargo.toml b/substrate/frame/glutton/Cargo.toml index 81388d0e0f5..068fb4e821c 100644 --- a/substrate/frame/glutton/Cargo.toml +++ b/substrate/frame/glutton/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME pallet for pushing a chain to its weight limits" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/grandpa/Cargo.toml b/substrate/frame/grandpa/Cargo.toml index b4444d4580c..b4f51d88c6d 100644 --- a/substrate/frame/grandpa/Cargo.toml +++ b/substrate/frame/grandpa/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME pallet for GRANDPA finality gadget" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/identity/Cargo.toml b/substrate/frame/identity/Cargo.toml index 894365748ce..a562d7607b4 100644 --- a/substrate/frame/identity/Cargo.toml +++ b/substrate/frame/identity/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME identity management pallet" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/im-online/Cargo.toml b/substrate/frame/im-online/Cargo.toml index 5ec260c9b5b..b5b01858c89 100644 --- a/substrate/frame/im-online/Cargo.toml +++ b/substrate/frame/im-online/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME's I'm online pallet" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/indices/Cargo.toml b/substrate/frame/indices/Cargo.toml index 4f12ecfcce3..4f0c780c6af 100644 --- a/substrate/frame/indices/Cargo.toml +++ b/substrate/frame/indices/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME indices management pallet" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/insecure-randomness-collective-flip/Cargo.toml b/substrate/frame/insecure-randomness-collective-flip/Cargo.toml index f7afbb95397..fb1447d1045 100644 --- a/substrate/frame/insecure-randomness-collective-flip/Cargo.toml +++ b/substrate/frame/insecure-randomness-collective-flip/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Insecure do not use in production: FRAME randomness collective flip pallet" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/lottery/Cargo.toml b/substrate/frame/lottery/Cargo.toml index bba17d2718c..49f84b04b25 100644 --- a/substrate/frame/lottery/Cargo.toml +++ b/substrate/frame/lottery/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true description = "FRAME Participation Lottery Pallet" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/membership/Cargo.toml b/substrate/frame/membership/Cargo.toml index f90d70e911d..c4c94e202a4 100644 --- a/substrate/frame/membership/Cargo.toml +++ b/substrate/frame/membership/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME membership management pallet" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/merkle-mountain-range/Cargo.toml b/substrate/frame/merkle-mountain-range/Cargo.toml index 1f31e704928..eaa17d88e99 100644 --- a/substrate/frame/merkle-mountain-range/Cargo.toml +++ b/substrate/frame/merkle-mountain-range/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true description = "FRAME Merkle Mountain Range pallet." +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/message-queue/Cargo.toml b/substrate/frame/message-queue/Cargo.toml index 614e5885b4b..b5162d70ccb 100644 --- a/substrate/frame/message-queue/Cargo.toml +++ b/substrate/frame/message-queue/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true description = "FRAME pallet to queue and process messages" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } diff --git a/substrate/frame/mixnet/Cargo.toml b/substrate/frame/mixnet/Cargo.toml index de5f7411015..949003864a2 100644 --- a/substrate/frame/mixnet/Cargo.toml +++ b/substrate/frame/mixnet/Cargo.toml @@ -9,6 +9,9 @@ homepage = "https://substrate.io" repository = "https://github.com/paritytech/substrate/" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/multisig/Cargo.toml b/substrate/frame/multisig/Cargo.toml index f1ff19c0e34..40b0f4973a8 100644 --- a/substrate/frame/multisig/Cargo.toml +++ b/substrate/frame/multisig/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME multi-signature dispatch pallet" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/nft-fractionalization/Cargo.toml b/substrate/frame/nft-fractionalization/Cargo.toml index 19814d67d79..355bb2a5d3e 100644 --- a/substrate/frame/nft-fractionalization/Cargo.toml +++ b/substrate/frame/nft-fractionalization/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME pallet to convert non-fungible to fungible tokens." readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/nfts/Cargo.toml b/substrate/frame/nfts/Cargo.toml index a70b55bc45e..0d3f542c552 100644 --- a/substrate/frame/nfts/Cargo.toml +++ b/substrate/frame/nfts/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME NFTs pallet" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/nfts/runtime-api/Cargo.toml b/substrate/frame/nfts/runtime-api/Cargo.toml index 8e1424a588a..8eb6726552b 100644 --- a/substrate/frame/nfts/runtime-api/Cargo.toml +++ b/substrate/frame/nfts/runtime-api/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Runtime API for the FRAME NFTs pallet." readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/nicks/Cargo.toml b/substrate/frame/nicks/Cargo.toml index 8636ac34a13..7d43f64cfe2 100644 --- a/substrate/frame/nicks/Cargo.toml +++ b/substrate/frame/nicks/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME pallet for nick management" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/nis/Cargo.toml b/substrate/frame/nis/Cargo.toml index ec251ef6536..f95ebc5864c 100644 --- a/substrate/frame/nis/Cargo.toml +++ b/substrate/frame/nis/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME pallet for rewarding account freezing." readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/node-authorization/Cargo.toml b/substrate/frame/node-authorization/Cargo.toml index abc03a8b0f4..46fc0b34514 100644 --- a/substrate/frame/node-authorization/Cargo.toml +++ b/substrate/frame/node-authorization/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true description = "FRAME pallet for node authorization" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/nomination-pools/Cargo.toml b/substrate/frame/nomination-pools/Cargo.toml index bc24deb6f15..00c90b414de 100644 --- a/substrate/frame/nomination-pools/Cargo.toml +++ b/substrate/frame/nomination-pools/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true description = "FRAME nomination pools pallet" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/nomination-pools/benchmarking/Cargo.toml b/substrate/frame/nomination-pools/benchmarking/Cargo.toml index d522dff82ba..8a4ee07dd74 100644 --- a/substrate/frame/nomination-pools/benchmarking/Cargo.toml +++ b/substrate/frame/nomination-pools/benchmarking/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME nomination pools pallet benchmarking" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/nomination-pools/fuzzer/Cargo.toml b/substrate/frame/nomination-pools/fuzzer/Cargo.toml index b9d0a6197f8..52f49b28457 100644 --- a/substrate/frame/nomination-pools/fuzzer/Cargo.toml +++ b/substrate/frame/nomination-pools/fuzzer/Cargo.toml @@ -10,6 +10,9 @@ description = "Fuzzer for fixed point arithmetic primitives." documentation = "https://docs.rs/sp-arithmetic-fuzzer" publish = false +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/nomination-pools/runtime-api/Cargo.toml b/substrate/frame/nomination-pools/runtime-api/Cargo.toml index 86d1496a41b..12a897cc6b6 100644 --- a/substrate/frame/nomination-pools/runtime-api/Cargo.toml +++ b/substrate/frame/nomination-pools/runtime-api/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Runtime API for nomination-pools FRAME pallet" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/nomination-pools/test-staking/Cargo.toml b/substrate/frame/nomination-pools/test-staking/Cargo.toml index f0558f83142..845535ae04f 100644 --- a/substrate/frame/nomination-pools/test-staking/Cargo.toml +++ b/substrate/frame/nomination-pools/test-staking/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME nomination pools pallet tests with the staking pallet" publish = false +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/offences/Cargo.toml b/substrate/frame/offences/Cargo.toml index 0f153d9eca6..df0fb015e95 100644 --- a/substrate/frame/offences/Cargo.toml +++ b/substrate/frame/offences/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME offences pallet" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/offences/benchmarking/Cargo.toml b/substrate/frame/offences/benchmarking/Cargo.toml index 4de239296a9..cddbd6aa4d5 100644 --- a/substrate/frame/offences/benchmarking/Cargo.toml +++ b/substrate/frame/offences/benchmarking/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME offences pallet benchmarking" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/paged-list/Cargo.toml b/substrate/frame/paged-list/Cargo.toml index 676e1866a43..2370f84898b 100644 --- a/substrate/frame/paged-list/Cargo.toml +++ b/substrate/frame/paged-list/Cargo.toml @@ -8,6 +8,9 @@ edition.workspace = true license = "Apache-2.0" repository.workspace = true +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/paged-list/fuzzer/Cargo.toml b/substrate/frame/paged-list/fuzzer/Cargo.toml index d6590373813..5c245cc72c7 100644 --- a/substrate/frame/paged-list/fuzzer/Cargo.toml +++ b/substrate/frame/paged-list/fuzzer/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Fuzz storage types of pallet-paged-list" publish = false +[lints] +workspace = true + [[bin]] name = "pallet-paged-list-fuzzer" path = "src/paged_list.rs" diff --git a/substrate/frame/preimage/Cargo.toml b/substrate/frame/preimage/Cargo.toml index 1806976ac96..2aa21d2a713 100644 --- a/substrate/frame/preimage/Cargo.toml +++ b/substrate/frame/preimage/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true description = "FRAME pallet for storing preimages of hashes" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } diff --git a/substrate/frame/proxy/Cargo.toml b/substrate/frame/proxy/Cargo.toml index 00a2692a820..fd163e71bc1 100644 --- a/substrate/frame/proxy/Cargo.toml +++ b/substrate/frame/proxy/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME proxying pallet" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/ranked-collective/Cargo.toml b/substrate/frame/ranked-collective/Cargo.toml index 145eff3b0ee..39075b2abf9 100644 --- a/substrate/frame/ranked-collective/Cargo.toml +++ b/substrate/frame/ranked-collective/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Ranked collective system: Members of a set of account IDs can make their collective feelings known through dispatched calls from one of two specialized origins." readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/recovery/Cargo.toml b/substrate/frame/recovery/Cargo.toml index d2cd2d1a4ca..6afd494bf7e 100644 --- a/substrate/frame/recovery/Cargo.toml +++ b/substrate/frame/recovery/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME account recovery pallet" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/referenda/Cargo.toml b/substrate/frame/referenda/Cargo.toml index 1747d0ac22b..f76dbece303 100644 --- a/substrate/frame/referenda/Cargo.toml +++ b/substrate/frame/referenda/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME pallet for inclusive on-chain decisions" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/remark/Cargo.toml b/substrate/frame/remark/Cargo.toml index 9b0c6870d05..646563bdb08 100644 --- a/substrate/frame/remark/Cargo.toml +++ b/substrate/frame/remark/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Remark storage pallet" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/root-offences/Cargo.toml b/substrate/frame/root-offences/Cargo.toml index a17bd51684e..0f3d3a2883d 100644 --- a/substrate/frame/root-offences/Cargo.toml +++ b/substrate/frame/root-offences/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME root offences pallet" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/root-testing/Cargo.toml b/substrate/frame/root-testing/Cargo.toml index f4e914c86b1..78aed99a56d 100644 --- a/substrate/frame/root-testing/Cargo.toml +++ b/substrate/frame/root-testing/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME root testing pallet" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/safe-mode/Cargo.toml b/substrate/frame/safe-mode/Cargo.toml index d33e0b7144a..f86332483c4 100644 --- a/substrate/frame/safe-mode/Cargo.toml +++ b/substrate/frame/safe-mode/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true description = "FRAME safe-mode pallet" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/salary/Cargo.toml b/substrate/frame/salary/Cargo.toml index 18636a60cdb..929151a9c20 100644 --- a/substrate/frame/salary/Cargo.toml +++ b/substrate/frame/salary/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Paymaster" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/sassafras/Cargo.toml b/substrate/frame/sassafras/Cargo.toml index 745297bd416..ad4c0ba12f0 100644 --- a/substrate/frame/sassafras/Cargo.toml +++ b/substrate/frame/sassafras/Cargo.toml @@ -10,6 +10,9 @@ description = "Consensus extension module for Sassafras consensus." readme = "README.md" publish = false +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/scheduler/Cargo.toml b/substrate/frame/scheduler/Cargo.toml index 1dd2e53d054..c27276c607e 100644 --- a/substrate/frame/scheduler/Cargo.toml +++ b/substrate/frame/scheduler/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME Scheduler pallet" readme = "README.md" +[lints] +workspace = true + [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } log = { version = "0.4.17", default-features = false } diff --git a/substrate/frame/scored-pool/Cargo.toml b/substrate/frame/scored-pool/Cargo.toml index 8293c81f590..7a534ddd79d 100644 --- a/substrate/frame/scored-pool/Cargo.toml +++ b/substrate/frame/scored-pool/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME pallet for scored pools" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/session/Cargo.toml b/substrate/frame/session/Cargo.toml index 0a997f6ddb3..4589dbb427a 100644 --- a/substrate/frame/session/Cargo.toml +++ b/substrate/frame/session/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME sessions pallet" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/session/benchmarking/Cargo.toml b/substrate/frame/session/benchmarking/Cargo.toml index db2b8b72209..16f85048d8d 100644 --- a/substrate/frame/session/benchmarking/Cargo.toml +++ b/substrate/frame/session/benchmarking/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME sessions pallet benchmarking" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/society/Cargo.toml b/substrate/frame/society/Cargo.toml index 045993290af..46b4f7a7d66 100644 --- a/substrate/frame/society/Cargo.toml +++ b/substrate/frame/society/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME society pallet" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/staking/Cargo.toml b/substrate/frame/staking/Cargo.toml index 1510d90ed58..31831fd7ed2 100644 --- a/substrate/frame/staking/Cargo.toml +++ b/substrate/frame/staking/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME pallet staking" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/staking/reward-curve/Cargo.toml b/substrate/frame/staking/reward-curve/Cargo.toml index 136cdd7d1b0..e33fd255fa8 100644 --- a/substrate/frame/staking/reward-curve/Cargo.toml +++ b/substrate/frame/staking/reward-curve/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true description = "Reward Curve for FRAME staking pallet" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/staking/reward-fn/Cargo.toml b/substrate/frame/staking/reward-fn/Cargo.toml index 001c2b62656..80a27cc0f53 100644 --- a/substrate/frame/staking/reward-fn/Cargo.toml +++ b/substrate/frame/staking/reward-fn/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true description = "Reward function for FRAME staking pallet" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/staking/runtime-api/Cargo.toml b/substrate/frame/staking/runtime-api/Cargo.toml index 061124fd184..b3fd4cfda01 100644 --- a/substrate/frame/staking/runtime-api/Cargo.toml +++ b/substrate/frame/staking/runtime-api/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "RPC runtime API for transaction payment FRAME pallet" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/state-trie-migration/Cargo.toml b/substrate/frame/state-trie-migration/Cargo.toml index a3e6edd5aee..46f86d203c3 100644 --- a/substrate/frame/state-trie-migration/Cargo.toml +++ b/substrate/frame/state-trie-migration/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true description = "FRAME pallet migration of trie" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/statement/Cargo.toml b/substrate/frame/statement/Cargo.toml index e4caf241233..d41afc3244b 100644 --- a/substrate/frame/statement/Cargo.toml +++ b/substrate/frame/statement/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true description = "FRAME pallet for statement store" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/sudo/Cargo.toml b/substrate/frame/sudo/Cargo.toml index 70323590085..027716ce317 100644 --- a/substrate/frame/sudo/Cargo.toml +++ b/substrate/frame/sudo/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME pallet for sudo" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/support/Cargo.toml b/substrate/frame/support/Cargo.toml index 6d253f29c3f..07f9075c82b 100644 --- a/substrate/frame/support/Cargo.toml +++ b/substrate/frame/support/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Support code for the runtime." readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/support/procedural/Cargo.toml b/substrate/frame/support/procedural/Cargo.toml index 769cb9f1cfb..08995c578c5 100644 --- a/substrate/frame/support/procedural/Cargo.toml +++ b/substrate/frame/support/procedural/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true description = "Proc macro of Support code for the runtime." +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/support/procedural/tools/Cargo.toml b/substrate/frame/support/procedural/tools/Cargo.toml index 9be7a029ef9..5fffe3eeced 100644 --- a/substrate/frame/support/procedural/tools/Cargo.toml +++ b/substrate/frame/support/procedural/tools/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true description = "Proc macro helpers for procedural macros" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/support/procedural/tools/derive/Cargo.toml b/substrate/frame/support/procedural/tools/derive/Cargo.toml index dc2774cb177..9b6122b26fd 100644 --- a/substrate/frame/support/procedural/tools/derive/Cargo.toml +++ b/substrate/frame/support/procedural/tools/derive/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true description = "Use to derive parsing for parsing struct." +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/support/test/Cargo.toml b/substrate/frame/support/test/Cargo.toml index b88a459d92f..8ee1b4b2918 100644 --- a/substrate/frame/support/test/Cargo.toml +++ b/substrate/frame/support/test/Cargo.toml @@ -8,6 +8,9 @@ publish = false homepage = "https://substrate.io" repository.workspace = true +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/support/test/compile_pass/Cargo.toml b/substrate/frame/support/test/compile_pass/Cargo.toml index 916771bd471..0617aa105a2 100644 --- a/substrate/frame/support/test/compile_pass/Cargo.toml +++ b/substrate/frame/support/test/compile_pass/Cargo.toml @@ -8,6 +8,9 @@ publish = false homepage = "https://substrate.io" repository.workspace = true +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/support/test/pallet/Cargo.toml b/substrate/frame/support/test/pallet/Cargo.toml index e1136d5bc02..493c305cb20 100644 --- a/substrate/frame/support/test/pallet/Cargo.toml +++ b/substrate/frame/support/test/pallet/Cargo.toml @@ -8,6 +8,9 @@ publish = false homepage = "https://substrate.io" repository.workspace = true +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/support/test/stg_frame_crate/Cargo.toml b/substrate/frame/support/test/stg_frame_crate/Cargo.toml index 0b3b584910a..632ea4e794f 100644 --- a/substrate/frame/support/test/stg_frame_crate/Cargo.toml +++ b/substrate/frame/support/test/stg_frame_crate/Cargo.toml @@ -8,6 +8,9 @@ publish = false homepage = "https://substrate.io" repository.workspace = true +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/system/Cargo.toml b/substrate/frame/system/Cargo.toml index 3b454ac18f9..2491ccd220c 100644 --- a/substrate/frame/system/Cargo.toml +++ b/substrate/frame/system/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME system module" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/system/benchmarking/Cargo.toml b/substrate/frame/system/benchmarking/Cargo.toml index 3e92c56408e..8b9873f44b8 100644 --- a/substrate/frame/system/benchmarking/Cargo.toml +++ b/substrate/frame/system/benchmarking/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME System benchmarking" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/system/rpc/runtime-api/Cargo.toml b/substrate/frame/system/rpc/runtime-api/Cargo.toml index 68dc7fc9905..8cec5de8d1e 100644 --- a/substrate/frame/system/rpc/runtime-api/Cargo.toml +++ b/substrate/frame/system/rpc/runtime-api/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Runtime API definition required by System RPC extensions." readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/timestamp/Cargo.toml b/substrate/frame/timestamp/Cargo.toml index fd14216bdb3..bcf26d622b0 100644 --- a/substrate/frame/timestamp/Cargo.toml +++ b/substrate/frame/timestamp/Cargo.toml @@ -10,6 +10,9 @@ description = "FRAME Timestamp Module" documentation = "https://docs.rs/pallet-timestamp" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/tips/Cargo.toml b/substrate/frame/tips/Cargo.toml index a86034d92f5..fbd6404d785 100644 --- a/substrate/frame/tips/Cargo.toml +++ b/substrate/frame/tips/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME pallet to manage tips" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/transaction-payment/Cargo.toml b/substrate/frame/transaction-payment/Cargo.toml index c431f7f8243..5ebaa8c98ad 100644 --- a/substrate/frame/transaction-payment/Cargo.toml +++ b/substrate/frame/transaction-payment/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME pallet to manage transaction payments" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/transaction-payment/asset-conversion-tx-payment/Cargo.toml b/substrate/frame/transaction-payment/asset-conversion-tx-payment/Cargo.toml index 7d15740e824..0bfe37a5267 100644 --- a/substrate/frame/transaction-payment/asset-conversion-tx-payment/Cargo.toml +++ b/substrate/frame/transaction-payment/asset-conversion-tx-payment/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Pallet to manage transaction payments in assets by converting them to native assets." readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/transaction-payment/asset-tx-payment/Cargo.toml b/substrate/frame/transaction-payment/asset-tx-payment/Cargo.toml index 9a614316e53..be1bd36231c 100644 --- a/substrate/frame/transaction-payment/asset-tx-payment/Cargo.toml +++ b/substrate/frame/transaction-payment/asset-tx-payment/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "pallet to manage transaction payments in assets" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/transaction-payment/rpc/Cargo.toml b/substrate/frame/transaction-payment/rpc/Cargo.toml index 048b7da63f6..5a574a944d8 100644 --- a/substrate/frame/transaction-payment/rpc/Cargo.toml +++ b/substrate/frame/transaction-payment/rpc/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "RPC interface for the transaction payment pallet." readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/transaction-payment/rpc/runtime-api/Cargo.toml b/substrate/frame/transaction-payment/rpc/runtime-api/Cargo.toml index 17213392e1c..e384fcef692 100644 --- a/substrate/frame/transaction-payment/rpc/runtime-api/Cargo.toml +++ b/substrate/frame/transaction-payment/rpc/runtime-api/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "RPC runtime API for transaction payment FRAME pallet" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/transaction-payment/skip-feeless-payment/Cargo.toml b/substrate/frame/transaction-payment/skip-feeless-payment/Cargo.toml index 25a708d69de..0e3744626d3 100644 --- a/substrate/frame/transaction-payment/skip-feeless-payment/Cargo.toml +++ b/substrate/frame/transaction-payment/skip-feeless-payment/Cargo.toml @@ -7,6 +7,9 @@ license.workspace = true repository.workspace = true description = "Pallet to skip payments for calls annotated with `feeless_if` if the respective conditions are satisfied." +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/transaction-storage/Cargo.toml b/substrate/frame/transaction-storage/Cargo.toml index a2df1a3ce2a..f2c65e3b8a5 100644 --- a/substrate/frame/transaction-storage/Cargo.toml +++ b/substrate/frame/transaction-storage/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Storage chain pallet" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/treasury/Cargo.toml b/substrate/frame/treasury/Cargo.toml index 298c52d0e48..3286f4d7f34 100644 --- a/substrate/frame/treasury/Cargo.toml +++ b/substrate/frame/treasury/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME pallet to manage treasury" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/try-runtime/Cargo.toml b/substrate/frame/try-runtime/Cargo.toml index 4dd51647174..1d036e00447 100644 --- a/substrate/frame/try-runtime/Cargo.toml +++ b/substrate/frame/try-runtime/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true description = "FRAME pallet for democracy" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/tx-pause/Cargo.toml b/substrate/frame/tx-pause/Cargo.toml index 60623bb9d38..5958dcc2c30 100644 --- a/substrate/frame/tx-pause/Cargo.toml +++ b/substrate/frame/tx-pause/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true description = "FRAME transaction pause pallet" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/uniques/Cargo.toml b/substrate/frame/uniques/Cargo.toml index 300b319ede0..218b4ffe4c0 100644 --- a/substrate/frame/uniques/Cargo.toml +++ b/substrate/frame/uniques/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME NFT asset management pallet" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/utility/Cargo.toml b/substrate/frame/utility/Cargo.toml index 73c25a60daf..4aa75f9f616 100644 --- a/substrate/frame/utility/Cargo.toml +++ b/substrate/frame/utility/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME utilities pallet" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/vesting/Cargo.toml b/substrate/frame/vesting/Cargo.toml index 37339d87aea..3b5252d6181 100644 --- a/substrate/frame/vesting/Cargo.toml +++ b/substrate/frame/vesting/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME pallet for manage vesting" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/frame/whitelist/Cargo.toml b/substrate/frame/whitelist/Cargo.toml index 0d7ab6c2967..5d9a362f9aa 100644 --- a/substrate/frame/whitelist/Cargo.toml +++ b/substrate/frame/whitelist/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true description = "FRAME pallet for whitelisting call, and dispatch from specific origin" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/api/Cargo.toml b/substrate/primitives/api/Cargo.toml index 1be131a7b4f..345647cec25 100644 --- a/substrate/primitives/api/Cargo.toml +++ b/substrate/primitives/api/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Substrate runtime api primitives" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/api/proc-macro/Cargo.toml b/substrate/primitives/api/proc-macro/Cargo.toml index c66a7c65d11..544a48062d7 100644 --- a/substrate/primitives/api/proc-macro/Cargo.toml +++ b/substrate/primitives/api/proc-macro/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Macros for declaring and implementing runtime apis." documentation = "https://docs.rs/sp-api-proc-macro" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/api/test/Cargo.toml b/substrate/primitives/api/test/Cargo.toml index f207f5ff02d..0346ad270ab 100644 --- a/substrate/primitives/api/test/Cargo.toml +++ b/substrate/primitives/api/test/Cargo.toml @@ -8,6 +8,9 @@ publish = false homepage = "https://substrate.io" repository.workspace = true +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/application-crypto/Cargo.toml b/substrate/primitives/application-crypto/Cargo.toml index a6c937a3469..33bc22ed84f 100644 --- a/substrate/primitives/application-crypto/Cargo.toml +++ b/substrate/primitives/application-crypto/Cargo.toml @@ -10,6 +10,9 @@ repository.workspace = true documentation = "https://docs.rs/sp-application-crypto" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/application-crypto/test/Cargo.toml b/substrate/primitives/application-crypto/test/Cargo.toml index d9fb743e8cd..0057606b38e 100644 --- a/substrate/primitives/application-crypto/test/Cargo.toml +++ b/substrate/primitives/application-crypto/test/Cargo.toml @@ -9,6 +9,9 @@ publish = false homepage = "https://substrate.io" repository.workspace = true +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/arithmetic/Cargo.toml b/substrate/primitives/arithmetic/Cargo.toml index ecd3d9585bc..f7f1da6a913 100644 --- a/substrate/primitives/arithmetic/Cargo.toml +++ b/substrate/primitives/arithmetic/Cargo.toml @@ -10,6 +10,9 @@ description = "Minimal fixed point arithmetic primitives and types for runtime." documentation = "https://docs.rs/sp-arithmetic" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/arithmetic/fuzzer/Cargo.toml b/substrate/primitives/arithmetic/fuzzer/Cargo.toml index eded5a954c5..b881e8d46db 100644 --- a/substrate/primitives/arithmetic/fuzzer/Cargo.toml +++ b/substrate/primitives/arithmetic/fuzzer/Cargo.toml @@ -10,6 +10,9 @@ description = "Fuzzer for fixed point arithmetic primitives." documentation = "https://docs.rs/sp-arithmetic-fuzzer" publish = false +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/authority-discovery/Cargo.toml b/substrate/primitives/authority-discovery/Cargo.toml index c8a93980be2..82ec5a3eb9a 100644 --- a/substrate/primitives/authority-discovery/Cargo.toml +++ b/substrate/primitives/authority-discovery/Cargo.toml @@ -9,6 +9,9 @@ homepage = "https://substrate.io" repository.workspace = true readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/block-builder/Cargo.toml b/substrate/primitives/block-builder/Cargo.toml index a574689811b..de1ffd9d9e6 100644 --- a/substrate/primitives/block-builder/Cargo.toml +++ b/substrate/primitives/block-builder/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "The block builder runtime api." readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/blockchain/Cargo.toml b/substrate/primitives/blockchain/Cargo.toml index 33db09ce0ac..38b3b2030dc 100644 --- a/substrate/primitives/blockchain/Cargo.toml +++ b/substrate/primitives/blockchain/Cargo.toml @@ -10,6 +10,9 @@ description = "Substrate blockchain traits and primitives." documentation = "https://docs.rs/sp-blockchain" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/consensus/aura/Cargo.toml b/substrate/primitives/consensus/aura/Cargo.toml index 4a19999a469..15159f62611 100644 --- a/substrate/primitives/consensus/aura/Cargo.toml +++ b/substrate/primitives/consensus/aura/Cargo.toml @@ -9,6 +9,9 @@ homepage = "https://substrate.io" repository.workspace = true readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/consensus/babe/Cargo.toml b/substrate/primitives/consensus/babe/Cargo.toml index 6ec50ea022b..72cee3604d5 100644 --- a/substrate/primitives/consensus/babe/Cargo.toml +++ b/substrate/primitives/consensus/babe/Cargo.toml @@ -9,6 +9,9 @@ homepage = "https://substrate.io" repository.workspace = true readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/consensus/beefy/Cargo.toml b/substrate/primitives/consensus/beefy/Cargo.toml index 916125d783d..42383cf14a8 100644 --- a/substrate/primitives/consensus/beefy/Cargo.toml +++ b/substrate/primitives/consensus/beefy/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true description = "Primitives for BEEFY protocol." +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/consensus/common/Cargo.toml b/substrate/primitives/consensus/common/Cargo.toml index e8f6b806f8c..066578406b6 100644 --- a/substrate/primitives/consensus/common/Cargo.toml +++ b/substrate/primitives/consensus/common/Cargo.toml @@ -10,6 +10,9 @@ description = "Common utilities for building and using consensus engines in subs documentation = "https://docs.rs/sp-consensus/" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/consensus/grandpa/Cargo.toml b/substrate/primitives/consensus/grandpa/Cargo.toml index 1ddc89df983..238c9868664 100644 --- a/substrate/primitives/consensus/grandpa/Cargo.toml +++ b/substrate/primitives/consensus/grandpa/Cargo.toml @@ -10,6 +10,9 @@ description = "Primitives for GRANDPA integration, suitable for WASM compilation documentation = "https://docs.rs/sp-consensus-grandpa" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/consensus/pow/Cargo.toml b/substrate/primitives/consensus/pow/Cargo.toml index 5e134eb2a29..e528d8365ce 100644 --- a/substrate/primitives/consensus/pow/Cargo.toml +++ b/substrate/primitives/consensus/pow/Cargo.toml @@ -9,6 +9,9 @@ homepage = "https://substrate.io" repository.workspace = true readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/consensus/sassafras/Cargo.toml b/substrate/primitives/consensus/sassafras/Cargo.toml index e71f82b4382..41385e9d1e9 100644 --- a/substrate/primitives/consensus/sassafras/Cargo.toml +++ b/substrate/primitives/consensus/sassafras/Cargo.toml @@ -11,6 +11,9 @@ documentation = "https://docs.rs/sp-consensus-sassafras" readme = "README.md" publish = false +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/consensus/slots/Cargo.toml b/substrate/primitives/consensus/slots/Cargo.toml index 12940583757..91bbd1663a9 100644 --- a/substrate/primitives/consensus/slots/Cargo.toml +++ b/substrate/primitives/consensus/slots/Cargo.toml @@ -9,6 +9,9 @@ homepage = "https://substrate.io" repository.workspace = true readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/core/Cargo.toml b/substrate/primitives/core/Cargo.toml index a7c4b49fcb8..cb36d7bb6b4 100644 --- a/substrate/primitives/core/Cargo.toml +++ b/substrate/primitives/core/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Shareable Substrate types." documentation = "https://docs.rs/sp-core" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/core/fuzz/Cargo.toml b/substrate/primitives/core/fuzz/Cargo.toml index 9a094b07d4a..c6b5a065b6d 100644 --- a/substrate/primitives/core/fuzz/Cargo.toml +++ b/substrate/primitives/core/fuzz/Cargo.toml @@ -3,6 +3,9 @@ name = "sp-core-fuzz" version = "0.0.0" publish = false +[lints] +workspace = true + [package.metadata] cargo-fuzz = true diff --git a/substrate/primitives/core/hashing/Cargo.toml b/substrate/primitives/core/hashing/Cargo.toml index 7b4f4bc7438..011d312ba90 100644 --- a/substrate/primitives/core/hashing/Cargo.toml +++ b/substrate/primitives/core/hashing/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Primitive core crate hashing implementation." documentation = "https://docs.rs/sp-core-hashing" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/core/hashing/proc-macro/Cargo.toml b/substrate/primitives/core/hashing/proc-macro/Cargo.toml index a16bec5a2a1..312edd85044 100644 --- a/substrate/primitives/core/hashing/proc-macro/Cargo.toml +++ b/substrate/primitives/core/hashing/proc-macro/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "This crate provides procedural macros for calculating static hash." documentation = "https://docs.rs/sp-core-hashing-proc-macro" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/crypto/ec-utils/Cargo.toml b/substrate/primitives/crypto/ec-utils/Cargo.toml index 7519fa5fc68..3baa8ea5b78 100644 --- a/substrate/primitives/crypto/ec-utils/Cargo.toml +++ b/substrate/primitives/crypto/ec-utils/Cargo.toml @@ -8,6 +8,9 @@ license = "Apache-2.0" homepage = "https://substrate.io" repository.workspace = true +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/database/Cargo.toml b/substrate/primitives/database/Cargo.toml index 430895236d4..00ccf97c83e 100644 --- a/substrate/primitives/database/Cargo.toml +++ b/substrate/primitives/database/Cargo.toml @@ -10,6 +10,9 @@ description = "Substrate database trait." documentation = "https://docs.rs/sp-database" readme = "README.md" +[lints] +workspace = true + [dependencies] kvdb = "0.13.0" parking_lot = "0.12.1" diff --git a/substrate/primitives/debug-derive/Cargo.toml b/substrate/primitives/debug-derive/Cargo.toml index 0662cd309ed..acf281f306a 100644 --- a/substrate/primitives/debug-derive/Cargo.toml +++ b/substrate/primitives/debug-derive/Cargo.toml @@ -9,6 +9,8 @@ repository.workspace = true description = "Macros to derive runtime debug implementation." documentation = "https://docs.rs/sp-debug-derive" +[lints] +workspace = true [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/externalities/Cargo.toml b/substrate/primitives/externalities/Cargo.toml index 86d31c31cba..4c7afc38b81 100644 --- a/substrate/primitives/externalities/Cargo.toml +++ b/substrate/primitives/externalities/Cargo.toml @@ -10,6 +10,9 @@ description = "Substrate externalities abstraction" documentation = "https://docs.rs/sp-externalities" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/genesis-builder/Cargo.toml b/substrate/primitives/genesis-builder/Cargo.toml index 00b3bc876ac..b376055d605 100644 --- a/substrate/primitives/genesis-builder/Cargo.toml +++ b/substrate/primitives/genesis-builder/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Substrate GenesisConfig builder API" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/inherents/Cargo.toml b/substrate/primitives/inherents/Cargo.toml index 2b5bad5d746..e011e9ce9b8 100644 --- a/substrate/primitives/inherents/Cargo.toml +++ b/substrate/primitives/inherents/Cargo.toml @@ -10,6 +10,9 @@ description = "Provides types and traits for creating and checking inherents." documentation = "https://docs.rs/sp-inherents" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/io/Cargo.toml b/substrate/primitives/io/Cargo.toml index 5239860c710..9671880069a 100644 --- a/substrate/primitives/io/Cargo.toml +++ b/substrate/primitives/io/Cargo.toml @@ -11,6 +11,9 @@ documentation = "https://docs.rs/sp-io" readme = "README.md" build = "build.rs" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/keyring/Cargo.toml b/substrate/primitives/keyring/Cargo.toml index 5b58a4f97ca..80d773b452a 100644 --- a/substrate/primitives/keyring/Cargo.toml +++ b/substrate/primitives/keyring/Cargo.toml @@ -10,6 +10,9 @@ description = "Keyring support code for the runtime. A set of test accounts." documentation = "https://docs.rs/sp-keyring" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/keystore/Cargo.toml b/substrate/primitives/keystore/Cargo.toml index dcfb272c11a..d60f5d6c568 100644 --- a/substrate/primitives/keystore/Cargo.toml +++ b/substrate/primitives/keystore/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Keystore primitives." documentation = "https://docs.rs/sp-core" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/maybe-compressed-blob/Cargo.toml b/substrate/primitives/maybe-compressed-blob/Cargo.toml index c6fa7103672..86f73626c0a 100644 --- a/substrate/primitives/maybe-compressed-blob/Cargo.toml +++ b/substrate/primitives/maybe-compressed-blob/Cargo.toml @@ -10,6 +10,9 @@ description = "Handling of blobs, usually Wasm code, which may be compresed" documentation = "https://docs.rs/sp-maybe-compressed-blob" readme = "README.md" +[lints] +workspace = true + [dependencies] thiserror = "1.0" zstd = { version = "0.12.4", default-features = false } diff --git a/substrate/primitives/merkle-mountain-range/Cargo.toml b/substrate/primitives/merkle-mountain-range/Cargo.toml index 82a00935b30..dec55a5c8f3 100644 --- a/substrate/primitives/merkle-mountain-range/Cargo.toml +++ b/substrate/primitives/merkle-mountain-range/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true description = "Merkle Mountain Range primitives." +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/metadata-ir/Cargo.toml b/substrate/primitives/metadata-ir/Cargo.toml index f73a1d7b380..0dc496bab53 100644 --- a/substrate/primitives/metadata-ir/Cargo.toml +++ b/substrate/primitives/metadata-ir/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Intermediate representation of the runtime metadata." documentation = "https://docs.rs/sp-metadata-ir" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/mixnet/Cargo.toml b/substrate/primitives/mixnet/Cargo.toml index a03fdab8741..6ea7a6cbe8c 100644 --- a/substrate/primitives/mixnet/Cargo.toml +++ b/substrate/primitives/mixnet/Cargo.toml @@ -9,6 +9,9 @@ homepage = "https://substrate.io" repository = "https://github.com/paritytech/substrate/" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/npos-elections/Cargo.toml b/substrate/primitives/npos-elections/Cargo.toml index 1ab6c2adf82..dcd03e7e5e0 100644 --- a/substrate/primitives/npos-elections/Cargo.toml +++ b/substrate/primitives/npos-elections/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "NPoS election algorithm primitives" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/npos-elections/fuzzer/Cargo.toml b/substrate/primitives/npos-elections/fuzzer/Cargo.toml index 591ef412363..37eaeea2b82 100644 --- a/substrate/primitives/npos-elections/fuzzer/Cargo.toml +++ b/substrate/primitives/npos-elections/fuzzer/Cargo.toml @@ -10,6 +10,9 @@ description = "Fuzzer for phragmén implementation." documentation = "https://docs.rs/sp-npos-elections-fuzzer" publish = false +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/offchain/Cargo.toml b/substrate/primitives/offchain/Cargo.toml index 201e75802cf..19d66ae31e9 100644 --- a/substrate/primitives/offchain/Cargo.toml +++ b/substrate/primitives/offchain/Cargo.toml @@ -9,6 +9,9 @@ homepage = "https://substrate.io" repository.workspace = true readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/panic-handler/Cargo.toml b/substrate/primitives/panic-handler/Cargo.toml index 428062757c1..a0df527f56e 100644 --- a/substrate/primitives/panic-handler/Cargo.toml +++ b/substrate/primitives/panic-handler/Cargo.toml @@ -10,6 +10,9 @@ description = "Custom panic hook with bug report link" documentation = "https://docs.rs/sp-panic-handler" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/rpc/Cargo.toml b/substrate/primitives/rpc/Cargo.toml index cf10af31977..a542b65cdc9 100644 --- a/substrate/primitives/rpc/Cargo.toml +++ b/substrate/primitives/rpc/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Substrate RPC primitives and utilities." readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/runtime-interface/Cargo.toml b/substrate/primitives/runtime-interface/Cargo.toml index 80565420f6b..a4c8457b598 100644 --- a/substrate/primitives/runtime-interface/Cargo.toml +++ b/substrate/primitives/runtime-interface/Cargo.toml @@ -10,6 +10,9 @@ description = "Substrate runtime interface" documentation = "https://docs.rs/sp-runtime-interface/" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/runtime-interface/proc-macro/Cargo.toml b/substrate/primitives/runtime-interface/proc-macro/Cargo.toml index f94f568c913..7cf1abf8048 100644 --- a/substrate/primitives/runtime-interface/proc-macro/Cargo.toml +++ b/substrate/primitives/runtime-interface/proc-macro/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "This crate provides procedural macros for usage within the context of the Substrate runtime interface." documentation = "https://docs.rs/sp-runtime-interface-proc-macro" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/runtime-interface/test-wasm-deprecated/Cargo.toml b/substrate/primitives/runtime-interface/test-wasm-deprecated/Cargo.toml index 07c820c0601..f663c6d4726 100644 --- a/substrate/primitives/runtime-interface/test-wasm-deprecated/Cargo.toml +++ b/substrate/primitives/runtime-interface/test-wasm-deprecated/Cargo.toml @@ -9,6 +9,9 @@ homepage = "https://substrate.io" repository.workspace = true publish = false +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/runtime-interface/test-wasm/Cargo.toml b/substrate/primitives/runtime-interface/test-wasm/Cargo.toml index 79e79857341..ecb3c7f8732 100644 --- a/substrate/primitives/runtime-interface/test-wasm/Cargo.toml +++ b/substrate/primitives/runtime-interface/test-wasm/Cargo.toml @@ -9,6 +9,9 @@ homepage = "https://substrate.io" repository.workspace = true publish = false +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/runtime-interface/test/Cargo.toml b/substrate/primitives/runtime-interface/test/Cargo.toml index 661af1fa391..55d70960989 100644 --- a/substrate/primitives/runtime-interface/test/Cargo.toml +++ b/substrate/primitives/runtime-interface/test/Cargo.toml @@ -8,6 +8,9 @@ publish = false homepage = "https://substrate.io" repository.workspace = true +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/runtime/Cargo.toml b/substrate/primitives/runtime/Cargo.toml index 827ccdbddbb..97100b88a11 100644 --- a/substrate/primitives/runtime/Cargo.toml +++ b/substrate/primitives/runtime/Cargo.toml @@ -10,6 +10,9 @@ description = "Runtime Modules shared primitive types." documentation = "https://docs.rs/sp-runtime" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/session/Cargo.toml b/substrate/primitives/session/Cargo.toml index b7e43f97300..25700210fee 100644 --- a/substrate/primitives/session/Cargo.toml +++ b/substrate/primitives/session/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Primitives for sessions" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/staking/Cargo.toml b/substrate/primitives/staking/Cargo.toml index f52bf3316db..2c721265142 100644 --- a/substrate/primitives/staking/Cargo.toml +++ b/substrate/primitives/staking/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "A crate which contains primitives that are useful for implementation that uses staking approaches in general. Definitions related to sessions, slashing, etc go here." readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/state-machine/Cargo.toml b/substrate/primitives/state-machine/Cargo.toml index ab07d83af6a..f891a74dbf4 100644 --- a/substrate/primitives/state-machine/Cargo.toml +++ b/substrate/primitives/state-machine/Cargo.toml @@ -10,6 +10,9 @@ repository.workspace = true documentation = "https://docs.rs/sp-state-machine" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/statement-store/Cargo.toml b/substrate/primitives/statement-store/Cargo.toml index 089af92f062..f4a80eb0c38 100644 --- a/substrate/primitives/statement-store/Cargo.toml +++ b/substrate/primitives/statement-store/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "A crate which contains primitives related to the statement store" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/std/Cargo.toml b/substrate/primitives/std/Cargo.toml index eae37c6dfe3..f349a7b1196 100644 --- a/substrate/primitives/std/Cargo.toml +++ b/substrate/primitives/std/Cargo.toml @@ -10,6 +10,9 @@ description = "Lowest-abstraction level for the Substrate runtime: just exports documentation = "https://docs.rs/sp-std" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/storage/Cargo.toml b/substrate/primitives/storage/Cargo.toml index b7ff48cdd63..429c17fde50 100644 --- a/substrate/primitives/storage/Cargo.toml +++ b/substrate/primitives/storage/Cargo.toml @@ -10,6 +10,9 @@ repository.workspace = true documentation = "https://docs.rs/sp-storage/" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/test-primitives/Cargo.toml b/substrate/primitives/test-primitives/Cargo.toml index 0f2a399bffb..536cca334dd 100644 --- a/substrate/primitives/test-primitives/Cargo.toml +++ b/substrate/primitives/test-primitives/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true publish = false +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/timestamp/Cargo.toml b/substrate/primitives/timestamp/Cargo.toml index 41afab0dcc2..ea1e4ebbee3 100644 --- a/substrate/primitives/timestamp/Cargo.toml +++ b/substrate/primitives/timestamp/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Substrate core types and inherents for timestamps." readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/tracing/Cargo.toml b/substrate/primitives/tracing/Cargo.toml index 964dbbca144..0ad3cd0705b 100644 --- a/substrate/primitives/tracing/Cargo.toml +++ b/substrate/primitives/tracing/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Instrumentation primitives and macros for Substrate." readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] # let's default to wasm32 default-target = "wasm32-unknown-unknown" diff --git a/substrate/primitives/transaction-pool/Cargo.toml b/substrate/primitives/transaction-pool/Cargo.toml index 136d3200202..6e66910ac38 100644 --- a/substrate/primitives/transaction-pool/Cargo.toml +++ b/substrate/primitives/transaction-pool/Cargo.toml @@ -10,6 +10,9 @@ description = "Transaction pool runtime facing API." documentation = "https://docs.rs/sp-transaction-pool" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/transaction-storage-proof/Cargo.toml b/substrate/primitives/transaction-storage-proof/Cargo.toml index e3bb80b2562..f8c3ded2ef7 100644 --- a/substrate/primitives/transaction-storage-proof/Cargo.toml +++ b/substrate/primitives/transaction-storage-proof/Cargo.toml @@ -9,6 +9,9 @@ homepage = "https://substrate.io" repository.workspace = true readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/trie/Cargo.toml b/substrate/primitives/trie/Cargo.toml index 5da1594e5d4..79ed5c20000 100644 --- a/substrate/primitives/trie/Cargo.toml +++ b/substrate/primitives/trie/Cargo.toml @@ -10,6 +10,9 @@ homepage = "https://substrate.io" documentation = "https://docs.rs/sp-trie" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/version/Cargo.toml b/substrate/primitives/version/Cargo.toml index 9860ef54c2d..ed056f7ac36 100644 --- a/substrate/primitives/version/Cargo.toml +++ b/substrate/primitives/version/Cargo.toml @@ -10,6 +10,9 @@ description = "Version module for the Substrate runtime; Provides a function tha documentation = "https://docs.rs/sp-version" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/version/proc-macro/Cargo.toml b/substrate/primitives/version/proc-macro/Cargo.toml index 05a3dcb2e27..f7df8ec113f 100644 --- a/substrate/primitives/version/proc-macro/Cargo.toml +++ b/substrate/primitives/version/proc-macro/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Macro for defining a runtime version." documentation = "https://docs.rs/sp-api-proc-macro" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/wasm-interface/Cargo.toml b/substrate/primitives/wasm-interface/Cargo.toml index e997f558c9d..9fe5cc1f2d0 100644 --- a/substrate/primitives/wasm-interface/Cargo.toml +++ b/substrate/primitives/wasm-interface/Cargo.toml @@ -10,6 +10,9 @@ description = "Types and traits for interfacing between the host and the wasm ru documentation = "https://docs.rs/sp-wasm-interface" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/primitives/weights/Cargo.toml b/substrate/primitives/weights/Cargo.toml index fb2e2ae8cb1..c01e1a5a07f 100644 --- a/substrate/primitives/weights/Cargo.toml +++ b/substrate/primitives/weights/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Types and traits for interfacing between the host and the wasm runtime." documentation = "https://docs.rs/sp-wasm-interface" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/scripts/ci/node-template-release/Cargo.toml b/substrate/scripts/ci/node-template-release/Cargo.toml index beb0e0852de..ca9759d5963 100644 --- a/substrate/scripts/ci/node-template-release/Cargo.toml +++ b/substrate/scripts/ci/node-template-release/Cargo.toml @@ -7,6 +7,9 @@ license = "GPL-3.0 WITH Classpath-exception-2.0" homepage = "https://substrate.io" publish = false +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/test-utils/Cargo.toml b/substrate/test-utils/Cargo.toml index 17696e8229c..526ed7c049c 100644 --- a/substrate/test-utils/Cargo.toml +++ b/substrate/test-utils/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Substrate test utilities" publish = false +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/test-utils/cli/Cargo.toml b/substrate/test-utils/cli/Cargo.toml index 4f20e9e2ce5..d654a3aaa72 100644 --- a/substrate/test-utils/cli/Cargo.toml +++ b/substrate/test-utils/cli/Cargo.toml @@ -9,6 +9,9 @@ homepage = "https://substrate.io" repository.workspace = true publish = false +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/test-utils/client/Cargo.toml b/substrate/test-utils/client/Cargo.toml index 9829ae531fe..a137e7b17fc 100644 --- a/substrate/test-utils/client/Cargo.toml +++ b/substrate/test-utils/client/Cargo.toml @@ -9,6 +9,9 @@ homepage = "https://substrate.io" repository.workspace = true publish = false +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/test-utils/runtime/Cargo.toml b/substrate/test-utils/runtime/Cargo.toml index 655c7f0fec1..881a77f1f92 100644 --- a/substrate/test-utils/runtime/Cargo.toml +++ b/substrate/test-utils/runtime/Cargo.toml @@ -9,6 +9,9 @@ homepage = "https://substrate.io" repository.workspace = true publish = false +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/test-utils/runtime/client/Cargo.toml b/substrate/test-utils/runtime/client/Cargo.toml index 40cfa8ab1b7..cbb964f6785 100644 --- a/substrate/test-utils/runtime/client/Cargo.toml +++ b/substrate/test-utils/runtime/client/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true publish = false +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/test-utils/runtime/transaction-pool/Cargo.toml b/substrate/test-utils/runtime/transaction-pool/Cargo.toml index cb6ee6d79f4..b52a897438b 100644 --- a/substrate/test-utils/runtime/transaction-pool/Cargo.toml +++ b/substrate/test-utils/runtime/transaction-pool/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true publish = false +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/utils/binary-merkle-tree/Cargo.toml b/substrate/utils/binary-merkle-tree/Cargo.toml index f36e4f4e0b6..441f89b790f 100644 --- a/substrate/utils/binary-merkle-tree/Cargo.toml +++ b/substrate/utils/binary-merkle-tree/Cargo.toml @@ -8,6 +8,9 @@ repository.workspace = true description = "A no-std/Substrate compatible library to construct binary merkle tree." homepage = "https://substrate.io" +[lints] +workspace = true + [dependencies] array-bytes = { version = "6.1", optional = true } log = { version = "0.4", default-features = false, optional = true } diff --git a/substrate/utils/build-script-utils/Cargo.toml b/substrate/utils/build-script-utils/Cargo.toml index ab15d5552c2..464647ea723 100644 --- a/substrate/utils/build-script-utils/Cargo.toml +++ b/substrate/utils/build-script-utils/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Crate with utility functions for `build.rs` scripts." readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/utils/fork-tree/Cargo.toml b/substrate/utils/fork-tree/Cargo.toml index eea500641fe..27bb908986f 100644 --- a/substrate/utils/fork-tree/Cargo.toml +++ b/substrate/utils/fork-tree/Cargo.toml @@ -10,6 +10,9 @@ description = "Utility library for managing tree-like ordered data with logic fo documentation = "https://docs.rs/fork-tree" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/utils/frame/benchmarking-cli/Cargo.toml b/substrate/utils/frame/benchmarking-cli/Cargo.toml index 8fb2c731520..b9495fa46c2 100644 --- a/substrate/utils/frame/benchmarking-cli/Cargo.toml +++ b/substrate/utils/frame/benchmarking-cli/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "CLI for benchmarking FRAME" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/utils/frame/frame-utilities-cli/Cargo.toml b/substrate/utils/frame/frame-utilities-cli/Cargo.toml index 5dc974cf89b..7e0c0241947 100644 --- a/substrate/utils/frame/frame-utilities-cli/Cargo.toml +++ b/substrate/utils/frame/frame-utilities-cli/Cargo.toml @@ -10,6 +10,9 @@ description = "cli interface for FRAME" documentation = "https://docs.rs/substrate-frame-cli" readme = "README.md" +[lints] +workspace = true + [dependencies] clap = { version = "4.4.11", features = ["derive"] } frame-support = { path = "../../../frame/support" } diff --git a/substrate/utils/frame/generate-bags/Cargo.toml b/substrate/utils/frame/generate-bags/Cargo.toml index ac22197c5ac..f075452f4c6 100644 --- a/substrate/utils/frame/generate-bags/Cargo.toml +++ b/substrate/utils/frame/generate-bags/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true description = "Bag threshold generation script for pallet-bag-list" +[lints] +workspace = true + [dependencies] # FRAME frame-support = { path = "../../../frame/support" } diff --git a/substrate/utils/frame/generate-bags/node-runtime/Cargo.toml b/substrate/utils/frame/generate-bags/node-runtime/Cargo.toml index 8dfc78c63ca..4614caa7f7b 100644 --- a/substrate/utils/frame/generate-bags/node-runtime/Cargo.toml +++ b/substrate/utils/frame/generate-bags/node-runtime/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Bag threshold generation script for pallet-bag-list and kitchensink-runtime." publish = false +[lints] +workspace = true + [dependencies] kitchensink-runtime = { path = "../../../../bin/node/runtime" } generate-bags = { path = ".." } diff --git a/substrate/utils/frame/remote-externalities/Cargo.toml b/substrate/utils/frame/remote-externalities/Cargo.toml index 88071f7d634..bd5a51eeec6 100644 --- a/substrate/utils/frame/remote-externalities/Cargo.toml +++ b/substrate/utils/frame/remote-externalities/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true description = "An externalities provided environment that can load itself from remote nodes or cached files" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/utils/frame/rpc/client/Cargo.toml b/substrate/utils/frame/rpc/client/Cargo.toml index d0f323c096f..986f9f3943c 100644 --- a/substrate/utils/frame/rpc/client/Cargo.toml +++ b/substrate/utils/frame/rpc/client/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true description = "Shared JSON-RPC client" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/utils/frame/rpc/state-trie-migration-rpc/Cargo.toml b/substrate/utils/frame/rpc/state-trie-migration-rpc/Cargo.toml index 6d3cb545efb..368273d609f 100644 --- a/substrate/utils/frame/rpc/state-trie-migration-rpc/Cargo.toml +++ b/substrate/utils/frame/rpc/state-trie-migration-rpc/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "Node-specific RPC methods for interaction with state trie migration." readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/utils/frame/rpc/support/Cargo.toml b/substrate/utils/frame/rpc/support/Cargo.toml index da56297c82f..1cc6d8e98b3 100644 --- a/substrate/utils/frame/rpc/support/Cargo.toml +++ b/substrate/utils/frame/rpc/support/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true description = "Substrate RPC for FRAME's support" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/utils/frame/rpc/system/Cargo.toml b/substrate/utils/frame/rpc/system/Cargo.toml index 636f2cd0485..84c3265c93d 100644 --- a/substrate/utils/frame/rpc/system/Cargo.toml +++ b/substrate/utils/frame/rpc/system/Cargo.toml @@ -9,6 +9,9 @@ repository.workspace = true description = "FRAME's system exposed over Substrate RPC" readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/utils/frame/try-runtime/cli/Cargo.toml b/substrate/utils/frame/try-runtime/cli/Cargo.toml index 3745198db31..9f560ab3271 100644 --- a/substrate/utils/frame/try-runtime/cli/Cargo.toml +++ b/substrate/utils/frame/try-runtime/cli/Cargo.toml @@ -8,6 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true description = "Cli command runtime testing and dry-running" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/utils/prometheus/Cargo.toml b/substrate/utils/prometheus/Cargo.toml index bf999a66111..252998d94bd 100644 --- a/substrate/utils/prometheus/Cargo.toml +++ b/substrate/utils/prometheus/Cargo.toml @@ -9,6 +9,9 @@ homepage = "https://substrate.io" repository.workspace = true readme = "README.md" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/substrate/utils/wasm-builder/Cargo.toml b/substrate/utils/wasm-builder/Cargo.toml index fc3f6450fd7..d0787e680e8 100644 --- a/substrate/utils/wasm-builder/Cargo.toml +++ b/substrate/utils/wasm-builder/Cargo.toml @@ -8,6 +8,9 @@ repository.workspace = true license = "Apache-2.0" homepage = "https://substrate.io" +[lints] +workspace = true + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] -- GitLab From 6ff50526a76d37ce1118031938a1bd5e7b18a648 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Dec 2023 14:29:14 +0000 Subject: [PATCH 026/191] Bump toml from 0.7.6 to 0.8.2 (#2685) Bumps [toml](https://github.com/toml-rs/toml) from 0.7.6 to 0.8.2.

Commits
  • fe65b2b chore: Release
  • ed597eb chore: Release
  • 257a0fd docs: Update changelog
  • 4b44f53 Merge pull request #617 from epage/update
  • 7eaf286 fix(parser): Failed on mixed inline tables
  • e1f2037 test: Verify with latest data
  • 2f9253c chore: Update toml-test
  • c9b481c test(toml): Ensure tables are used for validation
  • 43d7f29 Merge pull request #615 from toml-rs/renovate/actions-checkout-4.x
  • ef9b837 chore(deps): update actions/checkout action to v4
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=toml&package-manager=cargo&previous-version=0.7.6&new-version=0.8.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 18 +++++++++--------- substrate/utils/wasm-builder/Cargo.toml | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9e17e6803d9..6d976452e4c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4584,7 +4584,7 @@ dependencies = [ "regex", "syn 2.0.40", "termcolor", - "toml 0.7.6", + "toml 0.7.8", "walkdir", ] @@ -8607,7 +8607,7 @@ dependencies = [ "itertools 0.10.5", "tar", "tempfile", - "toml_edit 0.19.14", + "toml_edit 0.19.15", ] [[package]] @@ -13667,7 +13667,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" dependencies = [ "once_cell", - "toml_edit 0.19.14", + "toml_edit 0.19.15", ] [[package]] @@ -18877,7 +18877,7 @@ dependencies = [ "sp-maybe-compressed-blob", "strum", "tempfile", - "toml 0.7.6", + "toml 0.8.2", "walkdir", "wasm-opt", ] @@ -19529,14 +19529,14 @@ dependencies = [ [[package]] name = "toml" -version = "0.7.6" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17e963a819c331dcacd7ab957d80bc2b9a9c1e71c804826d2f283dd65306542" +checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.19.14", + "toml_edit 0.19.15", ] [[package]] @@ -19562,9 +19562,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.19.14" +version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ "indexmap 2.0.0", "serde", diff --git a/substrate/utils/wasm-builder/Cargo.toml b/substrate/utils/wasm-builder/Cargo.toml index d0787e680e8..2154cfca177 100644 --- a/substrate/utils/wasm-builder/Cargo.toml +++ b/substrate/utils/wasm-builder/Cargo.toml @@ -20,7 +20,7 @@ build-helper = "0.1.1" cargo_metadata = "0.15.4" strum = { version = "0.24.1", features = ["derive"] } tempfile = "3.1.0" -toml = "0.7.3" +toml = "0.8.2" walkdir = "2.3.2" sp-maybe-compressed-blob = { path = "../../primitives/maybe-compressed-blob" } filetime = "0.2.16" -- GitLab From cc846cc296b6d5ffaaf67f53475c70e4d6769ee7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gon=C3=A7alo=20Pestana?= Date: Wed, 13 Dec 2023 17:49:43 +0100 Subject: [PATCH 027/191] [Staking] Adds a round check at signed solution submission (#2690) This PR adds a round check to the `Call::submit` extrinsic to make sure that the solution submission has been prepared for the current election round and avoid penalties for delayed submissions. Related to https://github.com/paritytech-secops/srlabs_findings/issues/329 --------- Co-authored-by: command-bot <> --- .../election-provider-multi-phase/src/lib.rs | 3 ++ .../election-provider-multi-phase/src/mock.rs | 9 +++++ .../src/signed.rs | 34 +++++++++++++++++++ 3 files changed, 46 insertions(+) diff --git a/substrate/frame/election-provider-multi-phase/src/lib.rs b/substrate/frame/election-provider-multi-phase/src/lib.rs index 05f9b24f8f9..41284f6c78b 100644 --- a/substrate/frame/election-provider-multi-phase/src/lib.rs +++ b/substrate/frame/election-provider-multi-phase/src/lib.rs @@ -1024,6 +1024,7 @@ pub mod pallet { // ensure solution is timely. ensure!(Self::current_phase().is_signed(), Error::::PreDispatchEarlySubmission); + ensure!(raw_solution.round == Self::round(), Error::::PreDispatchDifferentRound); // NOTE: this is the only case where having separate snapshot would have been better // because could do just decode_len. But we can create abstractions to do this. @@ -1197,6 +1198,8 @@ pub mod pallet { BoundNotMet, /// Submitted solution has too many winners TooManyWinners, + /// Sumission was prepared for a different round. + PreDispatchDifferentRound, } #[pallet::validate_unsigned] diff --git a/substrate/frame/election-provider-multi-phase/src/mock.rs b/substrate/frame/election-provider-multi-phase/src/mock.rs index 7bdd329d9b0..abad7db037e 100644 --- a/substrate/frame/election-provider-multi-phase/src/mock.rs +++ b/substrate/frame/election-provider-multi-phase/src/mock.rs @@ -112,6 +112,15 @@ pub fn roll_to_with_ocw(n: BlockNumber) { } } +pub fn roll_to_round(n: u32) { + assert!(MultiPhase::round() <= n); + + while MultiPhase::round() != n { + roll_to_signed(); + assert_ok!(MultiPhase::elect()); + } +} + pub struct TrimHelpers { pub voters: Vec>, pub assignments: Vec>, diff --git a/substrate/frame/election-provider-multi-phase/src/signed.rs b/substrate/frame/election-provider-multi-phase/src/signed.rs index 7e4b029ff8c..ae830ed0382 100644 --- a/substrate/frame/election-provider-multi-phase/src/signed.rs +++ b/substrate/frame/election-provider-multi-phase/src/signed.rs @@ -571,6 +571,40 @@ mod tests { use frame_support::{assert_noop, assert_ok, assert_storage_noop}; use sp_runtime::Percent; + #[test] + fn cannot_submit_on_different_round() { + ExtBuilder::default().build_and_execute(|| { + // roll to a few rounds ahead. + roll_to_round(5); + assert_eq!(MultiPhase::round(), 5); + + roll_to_signed(); + assert_eq!(MultiPhase::current_phase(), Phase::Signed); + + // create a temp snapshot only for this test. + MultiPhase::create_snapshot().unwrap(); + let mut solution = raw_solution(); + + // try a solution prepared in a previous round. + solution.round = MultiPhase::round() - 1; + + assert_noop!( + MultiPhase::submit(RuntimeOrigin::signed(10), Box::new(solution)), + Error::::PreDispatchDifferentRound, + ); + + // try a solution prepared in a later round (not expected to happen, but in any case). + MultiPhase::create_snapshot().unwrap(); + let mut solution = raw_solution(); + solution.round = MultiPhase::round() + 1; + + assert_noop!( + MultiPhase::submit(RuntimeOrigin::signed(10), Box::new(solution)), + Error::::PreDispatchDifferentRound, + ); + }) + } + #[test] fn cannot_submit_too_early() { ExtBuilder::default().build_and_execute(|| { -- GitLab From 30151bd357ad3db57f00db1291d1eb4843831091 Mon Sep 17 00:00:00 2001 From: Egor_P Date: Wed, 13 Dec 2023 20:07:16 +0100 Subject: [PATCH 028/191] fix docker tag for polkadot image (#2702) This PR has a tiny fix for the proper creation of the tag for the pokadot's docker tag. --- .github/workflows/release-50_publish-docker.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release-50_publish-docker.yml b/.github/workflows/release-50_publish-docker.yml index 567e996b8fd..f74fb6a0ad1 100644 --- a/.github/workflows/release-50_publish-docker.yml +++ b/.github/workflows/release-50_publish-docker.yml @@ -220,6 +220,7 @@ jobs: runs-on: ubuntu-latest outputs: polkadot_apt_version: ${{ steps.fetch-latest-apt.outputs.polkadot_apt_version }} + polkadot_container_tag: ${{ steps.fetch-latest-apt.outputs.polkadot_container_tag }} container: image: paritytech/parity-keyring options: --user root @@ -230,7 +231,9 @@ jobs: apt update apt show polkadot version=$(apt show polkadot 2>/dev/null | grep "Version:" | awk '{print $2}') + tag=$(echo $version | sed 's/-.*//') echo "polkadot_apt_version=v$version" >> $GITHUB_OUTPUT + echo "polkadot_container_tag=v$tag" >> $GITHUB_OUTPUT echo "You passed ${{ inputs.version }} but this is ignored" echo "We use the version from the Debian Package: $version" @@ -276,7 +279,7 @@ jobs: # TODO: It would be good to get rid of this GHA that we don't really need. tags: | parity/polkadot:latest - parity/polkadot:${{ needs.fetch-latest-debian-package-version.outputs.polkadot_apt_version }} + parity/polkadot:${{ needs.fetch-latest-debian-package-version.outputs.polkadot_container_tag }} build-args: | VCS_REF=${{ github.ref }} POLKADOT_VERSION=${{ needs.fetch-latest-debian-package-version.outputs.polkadot_apt_version }} -- GitLab From c5cf3959639f070fcd9b68dae3f8680d39990366 Mon Sep 17 00:00:00 2001 From: Marcin S Date: Wed, 13 Dec 2023 21:38:27 +0100 Subject: [PATCH 029/191] PVF: fix unshare "could not create temporary directory"; refactor (#2663) Co-authored-by: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> --- polkadot/node/core/pvf/src/artifacts.rs | 103 +++++++----------- polkadot/node/core/pvf/src/host.rs | 5 +- polkadot/node/core/pvf/tests/it/main.rs | 18 +++ ...-could-not-create-temporary-drectory.prdoc | 17 +++ 4 files changed, 78 insertions(+), 65 deletions(-) create mode 100644 prdoc/pr_2663-fix-could-not-create-temporary-drectory.prdoc diff --git a/polkadot/node/core/pvf/src/artifacts.rs b/polkadot/node/core/pvf/src/artifacts.rs index 710e266841f..17ce5b443e3 100644 --- a/polkadot/node/core/pvf/src/artifacts.rs +++ b/polkadot/node/core/pvf/src/artifacts.rs @@ -201,13 +201,20 @@ impl Artifacts { /// Create an empty table and populate it with valid artifacts as [`ArtifactState::Prepared`], /// if any. The existing caches will be checked by their file name to determine whether they are /// valid, e.g., matching the current node version. The ones deemed invalid will be pruned. + /// + /// Create the cache directory on-disk if it doesn't exist. pub async fn new_and_prune(cache_path: &Path) -> Self { let mut artifacts = Self { inner: HashMap::new() }; - artifacts.insert_and_prune(cache_path).await; + let _ = artifacts.insert_and_prune(cache_path).await.map_err(|err| { + gum::error!( + target: LOG_TARGET, + "could not initialize artifacts cache: {err}", + ) + }); artifacts } - async fn insert_and_prune(&mut self, cache_path: &Path) { + async fn insert_and_prune(&mut self, cache_path: &Path) -> Result<(), String> { async fn is_corrupted(path: &Path) -> bool { let checksum = match tokio::fs::read(path).await { Ok(bytes) => blake3::hash(&bytes), @@ -237,24 +244,16 @@ impl Artifacts { artifacts: &mut Artifacts, entry: &tokio::fs::DirEntry, cache_path: &Path, - ) { + ) -> Result<(), String> { let file_type = entry.file_type().await; let file_name = entry.file_name(); match file_type { Ok(file_type) => if !file_type.is_file() { - return + return Ok(()) }, - Err(err) => { - gum::warn!( - target: LOG_TARGET, - ?err, - "unable to get file type for {:?}", - file_name, - ); - return - }, + Err(err) => return Err(format!("unable to get file type for {file_name:?}: {err}")), } if let Some(file_name) = file_name.to_str() { @@ -262,73 +261,51 @@ impl Artifacts { let path = cache_path.join(file_name); if id.is_none() || is_corrupted(&path).await { - gum::warn!( - target: LOG_TARGET, - "discarding invalid artifact {:?}", - &path, - ); let _ = tokio::fs::remove_file(&path).await; - return + return Err(format!("invalid artifact {path:?}, file deleted")) } - if let Some(id) = id { - gum::debug!( - target: LOG_TARGET, - "reusing existing {:?} for node version v{}", - &path, - NODE_VERSION, - ); - artifacts.insert_prepared(id, path, SystemTime::now(), Default::default()); - } - } else { - gum::warn!( + let id = id.expect("checked is_none() above; qed"); + gum::debug!( target: LOG_TARGET, - "non-Unicode file name {:?} found in {:?}", - file_name, - cache_path, + "reusing existing {:?} for node version v{}", + &path, + NODE_VERSION, ); + artifacts.insert_prepared(id, path, SystemTime::now(), Default::default()); + + Ok(()) + } else { + Err(format!("non-Unicode file name {file_name:?} found in {cache_path:?}")) } } // Make sure that the cache path directory and all its parents are created. if let Err(err) = tokio::fs::create_dir_all(cache_path).await { if err.kind() != io::ErrorKind::AlreadyExists { - gum::error!( - target: LOG_TARGET, - ?err, - "failed to create dir {:?}", - cache_path, - ); - return + return Err(format!("failed to create dir {cache_path:?}: {err}")) } } - let mut dir = match tokio::fs::read_dir(cache_path).await { - Ok(dir) => dir, - Err(err) => { - gum::error!( - target: LOG_TARGET, - ?err, - "failed to read dir {:?}", - cache_path, - ); - return - }, - }; + let mut dir = tokio::fs::read_dir(cache_path) + .await + .map_err(|err| format!("failed to read dir {cache_path:?}: {err}"))?; loop { match dir.next_entry().await { - Ok(Some(entry)) => insert_or_prune(self, &entry, cache_path).await, - Ok(None) => break, - Err(err) => { - gum::warn!( - target: LOG_TARGET, - ?err, - "error processing artifacts in {:?}", - cache_path, - ); - break - }, + Ok(Some(entry)) => + if let Err(err) = insert_or_prune(self, &entry, cache_path).await { + gum::warn!( + target: LOG_TARGET, + ?cache_path, + "could not insert entry {:?} into the artifact cache: {}", + entry, + err, + ) + }, + Ok(None) => return Ok(()), + Err(err) => + return Err(format!("error processing artifacts in {cache_path:?}: {err}")), } } } diff --git a/polkadot/node/core/pvf/src/host.rs b/polkadot/node/core/pvf/src/host.rs index f7817853dd1..d17a4d918e0 100644 --- a/polkadot/node/core/pvf/src/host.rs +++ b/polkadot/node/core/pvf/src/host.rs @@ -217,6 +217,9 @@ pub async fn start( ) -> SubsystemResult<(ValidationHost, impl Future)> { gum::debug!(target: LOG_TARGET, ?config, "starting PVF validation host"); + // Make sure the cache is initialized before doing anything else. + let artifacts = Artifacts::new_and_prune(&config.cache_path).await; + // Run checks for supported security features once per host startup. If some checks fail, warn // if Secure Validator Mode is disabled and return an error otherwise. let security_status = match security::check_security_status(&config).await { @@ -260,8 +263,6 @@ pub async fn start( let run_sweeper = sweeper_task(to_sweeper_rx); let run_host = async move { - let artifacts = Artifacts::new_and_prune(&config.cache_path).await; - run(Inner { cleanup_pulse_interval: Duration::from_secs(3600), artifact_ttl: Duration::from_secs(3600 * 24), diff --git a/polkadot/node/core/pvf/tests/it/main.rs b/polkadot/node/core/pvf/tests/it/main.rs index e82ade5edfa..09f975b706d 100644 --- a/polkadot/node/core/pvf/tests/it/main.rs +++ b/polkadot/node/core/pvf/tests/it/main.rs @@ -445,3 +445,21 @@ async fn all_security_features_work() { } ); } + +// Regression test to make sure the unshare-pivot-root capability does not depend on the PVF +// artifacts cache existing. +#[cfg(all(feature = "ci-only-tests", target_os = "linux"))] +#[tokio::test] +async fn nonexistant_cache_dir() { + let host = TestHost::new_with_config(|cfg| { + cfg.cache_path = cfg.cache_path.join("nonexistant_cache_dir"); + }) + .await; + + assert!(host.security_status().await.can_unshare_user_namespace_and_change_root); + + let _stats = host + .precheck_pvf(::adder::wasm_binary_unwrap(), Default::default()) + .await + .unwrap(); +} diff --git a/prdoc/pr_2663-fix-could-not-create-temporary-drectory.prdoc b/prdoc/pr_2663-fix-could-not-create-temporary-drectory.prdoc new file mode 100644 index 00000000000..2119599fce1 --- /dev/null +++ b/prdoc/pr_2663-fix-could-not-create-temporary-drectory.prdoc @@ -0,0 +1,17 @@ +title: "PVF: fix unshare 'could not create temporary directory'" + +doc: + - audience: Node Operator + description: | + For validators: fixes the potential warning/error: + "Cannot unshare user namespace and change root, which are Linux-specific kernel security features: could not create a temporary directory in "/tmp/.tmpIcLriO". + +migrations: + db: [] + + runtime: [] + +crates: + - name: polkadot-node-core-pvf + +host_functions: [] -- GitLab From c1a5fac2628ffebdc8a91d2b99513e47549b0f04 Mon Sep 17 00:00:00 2001 From: Francisco Aguirre Date: Thu, 14 Dec 2023 05:59:40 +0100 Subject: [PATCH 030/191] Add dummy impls of `fungible` and `fungibles` trait families (#2695) In `Currency`, we have a dummy impl that we can use for mocks or examples where we only want to satisfy the trait bounds. I added the same dummy implementations to `fungible` and `fungibles` regular traits. --------- Co-authored-by: command-bot <> --- .../src/traits/tokens/fungible/regular.rs | 44 +++++++++++++ .../src/traits/tokens/fungibles/regular.rs | 63 +++++++++++++++++++ 2 files changed, 107 insertions(+) diff --git a/substrate/frame/support/src/traits/tokens/fungible/regular.rs b/substrate/frame/support/src/traits/tokens/fungible/regular.rs index f2fb5c5f7c2..aece73777d2 100644 --- a/substrate/frame/support/src/traits/tokens/fungible/regular.rs +++ b/substrate/frame/support/src/traits/tokens/fungible/regular.rs @@ -514,3 +514,47 @@ pub trait Balanced: Inspect + Unbalanced { fn done_deposit(_who: &AccountId, _amount: Self::Balance) {} fn done_withdraw(_who: &AccountId, _amount: Self::Balance) {} } + +/// Dummy implementation of [`Inspect`] +#[cfg(feature = "std")] +impl Inspect for () { + type Balance = u32; + fn total_issuance() -> Self::Balance { + 0 + } + fn minimum_balance() -> Self::Balance { + 0 + } + fn total_balance(_: &AccountId) -> Self::Balance { + 0 + } + fn balance(_: &AccountId) -> Self::Balance { + 0 + } + fn reducible_balance(_: &AccountId, _: Preservation, _: Fortitude) -> Self::Balance { + 0 + } + fn can_deposit(_: &AccountId, _: Self::Balance, _: Provenance) -> DepositConsequence { + DepositConsequence::Success + } + fn can_withdraw(_: &AccountId, _: Self::Balance) -> WithdrawConsequence { + WithdrawConsequence::Success + } +} + +/// Dummy implementation of [`Unbalanced`] +#[cfg(feature = "std")] +impl Unbalanced for () { + fn handle_dust(_: Dust) {} + fn write_balance( + _: &AccountId, + _: Self::Balance, + ) -> Result, DispatchError> { + Ok(None) + } + fn set_total_issuance(_: Self::Balance) {} +} + +/// Dummy implementation of [`Mutate`] +#[cfg(feature = "std")] +impl Mutate for () {} diff --git a/substrate/frame/support/src/traits/tokens/fungibles/regular.rs b/substrate/frame/support/src/traits/tokens/fungibles/regular.rs index a2fc4e55095..41ef4b40c75 100644 --- a/substrate/frame/support/src/traits/tokens/fungibles/regular.rs +++ b/substrate/frame/support/src/traits/tokens/fungibles/regular.rs @@ -593,3 +593,66 @@ pub trait Balanced: Inspect + Unbalanced { fn done_deposit(_asset: Self::AssetId, _who: &AccountId, _amount: Self::Balance) {} fn done_withdraw(_asset: Self::AssetId, _who: &AccountId, _amount: Self::Balance) {} } + +/// Dummy implementation of [`Inspect`] +#[cfg(feature = "std")] +impl Inspect for () { + type AssetId = u32; + type Balance = u32; + fn total_issuance(_: Self::AssetId) -> Self::Balance { + 0 + } + fn minimum_balance(_: Self::AssetId) -> Self::Balance { + 0 + } + fn total_balance(_: Self::AssetId, _: &AccountId) -> Self::Balance { + 0 + } + fn balance(_: Self::AssetId, _: &AccountId) -> Self::Balance { + 0 + } + fn reducible_balance( + _: Self::AssetId, + _: &AccountId, + _: Preservation, + _: Fortitude, + ) -> Self::Balance { + 0 + } + fn can_deposit( + _: Self::AssetId, + _: &AccountId, + _: Self::Balance, + _: Provenance, + ) -> DepositConsequence { + DepositConsequence::Success + } + fn can_withdraw( + _: Self::AssetId, + _: &AccountId, + _: Self::Balance, + ) -> WithdrawConsequence { + WithdrawConsequence::Success + } + fn asset_exists(_: Self::AssetId) -> bool { + false + } +} + +/// Dummy implementation of [`Unbalanced`] +#[cfg(feature = "std")] +impl Unbalanced for () { + fn handle_dust(_: Dust) {} + fn write_balance( + _: Self::AssetId, + _: &AccountId, + _: Self::Balance, + ) -> Result, DispatchError> { + Ok(None) + } + fn set_total_issuance(_: Self::AssetId, _: Self::Balance) {} +} + +/// Dummy implementation of [`Mutate`] +#[cfg(feature = "std")] +impl Mutate for () {} -- GitLab From 07550e2d7151bfbf389413dc3c6c0a46e9f647fe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Dec 2023 11:40:54 +0100 Subject: [PATCH 031/191] Bump actions/checkout from 4.1.0 to 4.1.1 (#2705) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [actions/checkout](https://github.com/actions/checkout) from 4.1.0 to 4.1.1.
Release notes

Sourced from actions/checkout's releases.

v4.1.1

What's Changed

New Contributors

Full Changelog: https://github.com/actions/checkout/compare/v4.1.0...v4.1.1

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/checkout&package-manager=github_actions&previous-version=4.1.0&new-version=4.1.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/claim-crates.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/claim-crates.yml b/.github/workflows/claim-crates.yml index 0bd5593b54f..9e272266201 100644 --- a/.github/workflows/claim-crates.yml +++ b/.github/workflows/claim-crates.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest environment: master steps: - - uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Rust Cache uses: Swatinem/rust-cache@3cf7f8cc28d1b4e7d01e3783be10a97d55d483c8 # v2.7.1 -- GitLab From 8a6e9ef189cf6f00f986486e00523a679cd107e2 Mon Sep 17 00:00:00 2001 From: Andrei Sandu <54316454+sandreim@users.noreply.github.com> Date: Thu, 14 Dec 2023 12:57:17 +0200 Subject: [PATCH 032/191] Introduce subsystem benchmarking tool (#2528) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This tool makes it easy to run parachain consensus stress/performance testing on your development machine or in CI. ## Motivation The parachain consensus node implementation spans across many modules which we call subsystems. Each subsystem is responsible for a small part of logic of the parachain consensus pipeline, but in general the most load and performance issues are localized in just a few core subsystems like `availability-recovery`, `approval-voting` or `dispute-coordinator`. In the absence of such a tool, we would run large test nets to load/stress test these parts of the system. Setting up and making sense of the amount of data produced by such a large test is very expensive, hard to orchestrate and is a huge development time sink. ## PR contents - CLI tool - Data Availability Read test - reusable mockups and components needed so far - Documentation on how to get started ### Data Availability Read test An overseer is built with using a real `availability-recovery` susbsytem instance while dependent subsystems like `av-store`, `network-bridge` and `runtime-api` are mocked. The network bridge will emulate all the network peers and their answering to requests. The test is going to be run for a number of blocks. For each block it will generate send a “RecoverAvailableData” request for an arbitrary number of candidates. We wait for the subsystem to respond to all requests before moving to the next block. At the same time we collect the usual subsystem metrics and task CPU metrics and show some nice progress reports while running. ### Here is how the CLI looks like: ``` [2023-11-28T13:06:27Z INFO subsystem_bench::core::display] n_validators = 1000, n_cores = 20, pov_size = 5120 - 5120, error = 3, latency = Some(PeerLatency { min_latency: 1ms, max_latency: 100ms }) [2023-11-28T13:06:27Z INFO subsystem-bench::availability] Generating template candidate index=0 pov_size=5242880 [2023-11-28T13:06:27Z INFO subsystem-bench::availability] Created test environment. [2023-11-28T13:06:27Z INFO subsystem-bench::availability] Pre-generating 60 candidates. [2023-11-28T13:06:30Z INFO subsystem-bench::core] Initializing network emulation for 1000 peers. [2023-11-28T13:06:30Z INFO subsystem-bench::availability] Current block 1/3 [2023-11-28T13:06:30Z INFO substrate_prometheus_endpoint] 〽️ Prometheus exporter started at 127.0.0.1:9999 [2023-11-28T13:06:30Z INFO subsystem_bench::availability] 20 recoveries pending [2023-11-28T13:06:37Z INFO subsystem_bench::availability] Block time 6262ms [2023-11-28T13:06:37Z INFO subsystem-bench::availability] Sleeping till end of block (0ms) [2023-11-28T13:06:37Z INFO subsystem-bench::availability] Current block 2/3 [2023-11-28T13:06:37Z INFO subsystem_bench::availability] 20 recoveries pending [2023-11-28T13:06:43Z INFO subsystem_bench::availability] Block time 6369ms [2023-11-28T13:06:43Z INFO subsystem-bench::availability] Sleeping till end of block (0ms) [2023-11-28T13:06:43Z INFO subsystem-bench::availability] Current block 3/3 [2023-11-28T13:06:43Z INFO subsystem_bench::availability] 20 recoveries pending [2023-11-28T13:06:49Z INFO subsystem_bench::availability] Block time 6194ms [2023-11-28T13:06:49Z INFO subsystem-bench::availability] Sleeping till end of block (0ms) [2023-11-28T13:06:49Z INFO subsystem_bench::availability] All blocks processed in 18829ms [2023-11-28T13:06:49Z INFO subsystem_bench::availability] Throughput: 102400 KiB/block [2023-11-28T13:06:49Z INFO subsystem_bench::availability] Block time: 6276 ms [2023-11-28T13:06:49Z INFO subsystem_bench::availability] Total received from network: 415 MiB Total sent to network: 724 KiB Total subsystem CPU usage 24.00s CPU usage per block 8.00s Total test environment CPU usage 0.15s CPU usage per block 0.05s ``` ### Prometheus/Grafana stack in action Screenshot 2023-11-28 at 15 11 10 Screenshot 2023-11-28 at 15 12 01 Screenshot 2023-11-28 at 15 12 38 --------- Signed-off-by: Andrei Sandu --- Cargo.lock | 92 +- Cargo.toml | 1 + .../network/availability-recovery/Cargo.toml | 4 + .../network/availability-recovery/src/lib.rs | 13 +- .../availability-recovery/src/metrics.rs | 17 +- .../network/availability-recovery/src/task.rs | 3 +- .../availability-recovery/src/tests.rs | 29 +- polkadot/node/overseer/src/lib.rs | 2 + polkadot/node/subsystem-bench/Cargo.toml | 61 + polkadot/node/subsystem-bench/README.md | 216 ++ .../examples/availability_read.yaml | 57 + .../grafana/availability-read.json | 1874 +++++++++++++++++ .../grafana/task-cpu-usage.json | 755 +++++++ .../subsystem-bench/src/availability/cli.rs | 37 + .../subsystem-bench/src/availability/mod.rs | 339 +++ polkadot/node/subsystem-bench/src/cli.rs | 60 + .../subsystem-bench/src/core/configuration.rs | 262 +++ .../node/subsystem-bench/src/core/display.rs | 191 ++ .../subsystem-bench/src/core/environment.rs | 333 +++ .../node/subsystem-bench/src/core/keyring.rs | 40 + .../subsystem-bench/src/core/mock/av_store.rs | 137 ++ .../subsystem-bench/src/core/mock/dummy.rs | 98 + .../node/subsystem-bench/src/core/mock/mod.rs | 77 + .../src/core/mock/network_bridge.rs | 323 +++ .../src/core/mock/runtime_api.rs | 110 + polkadot/node/subsystem-bench/src/core/mod.rs | 24 + .../node/subsystem-bench/src/core/network.rs | 485 +++++ .../subsystem-bench/src/subsystem-bench.rs | 186 ++ .../node/subsystem-test-helpers/Cargo.toml | 3 + .../node/subsystem-test-helpers/src/lib.rs | 31 + .../node/subsystem-test-helpers/src/mock.rs | 7 +- 31 files changed, 5829 insertions(+), 38 deletions(-) create mode 100644 polkadot/node/subsystem-bench/Cargo.toml create mode 100644 polkadot/node/subsystem-bench/README.md create mode 100644 polkadot/node/subsystem-bench/examples/availability_read.yaml create mode 100644 polkadot/node/subsystem-bench/grafana/availability-read.json create mode 100644 polkadot/node/subsystem-bench/grafana/task-cpu-usage.json create mode 100644 polkadot/node/subsystem-bench/src/availability/cli.rs create mode 100644 polkadot/node/subsystem-bench/src/availability/mod.rs create mode 100644 polkadot/node/subsystem-bench/src/cli.rs create mode 100644 polkadot/node/subsystem-bench/src/core/configuration.rs create mode 100644 polkadot/node/subsystem-bench/src/core/display.rs create mode 100644 polkadot/node/subsystem-bench/src/core/environment.rs create mode 100644 polkadot/node/subsystem-bench/src/core/keyring.rs create mode 100644 polkadot/node/subsystem-bench/src/core/mock/av_store.rs create mode 100644 polkadot/node/subsystem-bench/src/core/mock/dummy.rs create mode 100644 polkadot/node/subsystem-bench/src/core/mock/mod.rs create mode 100644 polkadot/node/subsystem-bench/src/core/mock/network_bridge.rs create mode 100644 polkadot/node/subsystem-bench/src/core/mock/runtime_api.rs create mode 100644 polkadot/node/subsystem-bench/src/core/mod.rs create mode 100644 polkadot/node/subsystem-bench/src/core/network.rs create mode 100644 polkadot/node/subsystem-bench/src/subsystem-bench.rs diff --git a/Cargo.lock b/Cargo.lock index 6d976452e4c..40e2d9ebf3d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2534,6 +2534,15 @@ dependencies = [ "clap_derive 4.4.7", ] +[[package]] +name = "clap-num" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488557e97528174edaa2ee268b23a809e0c598213a4bbcb4f34575a46fda147e" +dependencies = [ + "num-traits", +] + [[package]] name = "clap_builder" version = "4.4.11" @@ -2747,6 +2756,17 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +[[package]] +name = "colored" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2674ec482fbc38012cf31e6c42ba0177b431a0cb6f15fe40efa5aab1bda516f6" +dependencies = [ + "is-terminal", + "lazy_static", + "windows-sys 0.48.0", +] + [[package]] name = "comfy-table" version = "7.0.1" @@ -11922,6 +11942,7 @@ dependencies = [ "sp-core", "sp-keyring", "thiserror", + "tokio", "tracing-gum", ] @@ -12651,6 +12672,8 @@ dependencies = [ "async-trait", "futures", "parking_lot 0.12.1", + "polkadot-erasure-coding", + "polkadot-node-primitives", "polkadot-node-subsystem", "polkadot-node-subsystem-util", "polkadot-primitives", @@ -13266,6 +13289,52 @@ dependencies = [ "sp-core", ] +[[package]] +name = "polkadot-subsystem-bench" +version = "1.0.0" +dependencies = [ + "assert_matches", + "async-trait", + "clap 4.4.11", + "clap-num", + "color-eyre", + "colored", + "env_logger 0.9.3", + "futures", + "futures-timer", + "itertools 0.11.0", + "log", + "orchestra", + "parity-scale-codec", + "paste", + "polkadot-availability-recovery", + "polkadot-erasure-coding", + "polkadot-node-metrics", + "polkadot-node-network-protocol", + "polkadot-node-primitives", + "polkadot-node-subsystem", + "polkadot-node-subsystem-test-helpers", + "polkadot-node-subsystem-types", + "polkadot-node-subsystem-util", + "polkadot-overseer", + "polkadot-primitives", + "polkadot-primitives-test-helpers", + "prometheus", + "rand 0.8.5", + "sc-keystore", + "sc-network", + "sc-service", + "serde", + "serde_yaml", + "sp-application-crypto", + "sp-core", + "sp-keyring", + "sp-keystore", + "substrate-prometheus-endpoint", + "tokio", + "tracing-gum", +] + [[package]] name = "polkadot-test-client" version = "1.0.0" @@ -16739,6 +16808,19 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_yaml" +version = "0.9.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cc7a1570e38322cfe4154732e5110f887ea57e22b76f4bfd32b5bdd3368666c" +dependencies = [ + "indexmap 2.0.0", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", +] + [[package]] name = "serial_test" version = "2.0.0" @@ -19417,9 +19499,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.32.0" +version = "1.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9" +checksum = "4f38200e3ef7995e5ef13baec2f432a6da0aa9ac495b2c0e8f3b7eec2c92d653" dependencies = [ "backtrace", "bytes", @@ -20027,6 +20109,12 @@ dependencies = [ "subtle 2.4.1", ] +[[package]] +name = "unsafe-libyaml" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28467d3e1d3c6586d8f25fa243f544f5800fec42d97032474e17222c2b75cfa" + [[package]] name = "unsigned-varint" version = "0.7.1" diff --git a/Cargo.toml b/Cargo.toml index 0091c2d7c8b..e3b6e3aadfe 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -151,6 +151,7 @@ members = [ "polkadot/node/primitives", "polkadot/node/service", "polkadot/node/subsystem", + "polkadot/node/subsystem-bench", "polkadot/node/subsystem-test-helpers", "polkadot/node/subsystem-types", "polkadot/node/subsystem-util", diff --git a/polkadot/node/network/availability-recovery/Cargo.toml b/polkadot/node/network/availability-recovery/Cargo.toml index b97572181b0..063d75275ca 100644 --- a/polkadot/node/network/availability-recovery/Cargo.toml +++ b/polkadot/node/network/availability-recovery/Cargo.toml @@ -11,6 +11,7 @@ workspace = true [dependencies] futures = "0.3.21" +tokio = "1.24.2" schnellru = "0.2.1" rand = "0.8.5" fatality = "0.0.6" @@ -40,3 +41,6 @@ sc-network = { path = "../../../../substrate/client/network" } polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } polkadot-primitives-test-helpers = { path = "../../../primitives/test-helpers" } + +[features] +subsystem-benchmarks = [] diff --git a/polkadot/node/network/availability-recovery/src/lib.rs b/polkadot/node/network/availability-recovery/src/lib.rs index 4a658449f09..fb8064878f4 100644 --- a/polkadot/node/network/availability-recovery/src/lib.rs +++ b/polkadot/node/network/availability-recovery/src/lib.rs @@ -65,7 +65,7 @@ mod error; mod futures_undead; mod metrics; mod task; -use metrics::Metrics; +pub use metrics::Metrics; #[cfg(test)] mod tests; @@ -603,7 +603,8 @@ impl AvailabilityRecoverySubsystem { } } - async fn run(self, mut ctx: Context) -> SubsystemResult<()> { + /// Starts the inner subsystem loop. + pub async fn run(self, mut ctx: Context) -> SubsystemResult<()> { let mut state = State::default(); let Self { mut req_receiver, @@ -681,6 +682,7 @@ impl AvailabilityRecoverySubsystem { &mut state, signal, ).await? { + gum::debug!(target: LOG_TARGET, "subsystem concluded"); return Ok(()); } FromOrchestra::Communication { msg } => { @@ -845,12 +847,17 @@ async fn erasure_task_thread( let _ = sender.send(maybe_data); }, None => { - gum::debug!( + gum::trace!( target: LOG_TARGET, "Erasure task channel closed. Node shutting down ?", ); break }, } + + // In benchmarks this is a very hot loop not yielding at all. + // To update CPU metrics for the task we need to yield. + #[cfg(feature = "subsystem-benchmarks")] + tokio::task::yield_now().await; } } diff --git a/polkadot/node/network/availability-recovery/src/metrics.rs b/polkadot/node/network/availability-recovery/src/metrics.rs index aa721673950..d82a8f9ae5f 100644 --- a/polkadot/node/network/availability-recovery/src/metrics.rs +++ b/polkadot/node/network/availability-recovery/src/metrics.rs @@ -29,7 +29,10 @@ struct MetricsInner { /// /// Gets incremented on each sent chunk requests. chunk_requests_issued: Counter, - + /// Total number of bytes recovered + /// + /// Gets incremented on each succesful recovery + recovered_bytes_total: Counter, /// A counter for finished chunk requests. /// /// Split by result: @@ -133,9 +136,10 @@ impl Metrics { } /// A full recovery succeeded. - pub fn on_recovery_succeeded(&self) { + pub fn on_recovery_succeeded(&self, bytes: usize) { if let Some(metrics) = &self.0 { - metrics.full_recoveries_finished.with_label_values(&["success"]).inc() + metrics.full_recoveries_finished.with_label_values(&["success"]).inc(); + metrics.recovered_bytes_total.inc_by(bytes as u64) } } @@ -171,6 +175,13 @@ impl metrics::Metrics for Metrics { )?, registry, )?, + recovered_bytes_total: prometheus::register( + Counter::new( + "polkadot_parachain_availability_recovery_bytes_total", + "Total number of bytes recovered", + )?, + registry, + )?, chunk_requests_finished: prometheus::register( CounterVec::new( Opts::new( diff --git a/polkadot/node/network/availability-recovery/src/task.rs b/polkadot/node/network/availability-recovery/src/task.rs index f705d5c0e4c..c300c221da5 100644 --- a/polkadot/node/network/availability-recovery/src/task.rs +++ b/polkadot/node/network/availability-recovery/src/task.rs @@ -23,6 +23,7 @@ use crate::{ PostRecoveryCheck, LOG_TARGET, }; use futures::{channel::oneshot, SinkExt}; +use parity_scale_codec::Encode; #[cfg(not(test))] use polkadot_node_network_protocol::request_response::CHUNK_REQUEST_TIMEOUT; use polkadot_node_network_protocol::request_response::{ @@ -432,7 +433,7 @@ where return Err(err) }, Ok(data) => { - self.params.metrics.on_recovery_succeeded(); + self.params.metrics.on_recovery_succeeded(data.encoded_size()); return Ok(data) }, } diff --git a/polkadot/node/network/availability-recovery/src/tests.rs b/polkadot/node/network/availability-recovery/src/tests.rs index 63ccf0e94f9..1cb52757bac 100644 --- a/polkadot/node/network/availability-recovery/src/tests.rs +++ b/polkadot/node/network/availability-recovery/src/tests.rs @@ -24,12 +24,12 @@ use parity_scale_codec::Encode; use polkadot_node_network_protocol::request_response::{ self as req_res, IncomingRequest, Recipient, ReqProtocolNames, Requests, }; +use polkadot_node_subsystem_test_helpers::derive_erasure_chunks_with_proofs_and_root; use super::*; use sc_network::{config::RequestResponseConfig, IfDisconnected, OutboundFailure, RequestFailure}; -use polkadot_erasure_coding::{branches, obtain_chunks_v1 as obtain_chunks}; use polkadot_node_primitives::{BlockData, PoV, Proof}; use polkadot_node_subsystem::messages::{ AllMessages, NetworkBridgeTxMessage, RuntimeApiMessage, RuntimeApiRequest, @@ -456,33 +456,6 @@ fn validator_authority_id(val_ids: &[Sr25519Keyring]) -> Vec), -) -> (Vec, Hash) { - let mut chunks: Vec> = obtain_chunks(n_validators, available_data).unwrap(); - - for (i, chunk) in chunks.iter_mut().enumerate() { - alter_chunk(i, chunk) - } - - // create proofs for each erasure chunk - let branches = branches(chunks.as_ref()); - - let root = branches.root(); - let erasure_chunks = branches - .enumerate() - .map(|(index, (proof, chunk))| ErasureChunk { - chunk: chunk.to_vec(), - index: ValidatorIndex(index as _), - proof: Proof::try_from(proof).unwrap(), - }) - .collect::>(); - - (erasure_chunks, root) -} - impl Default for TestState { fn default() -> Self { let validators = vec![ diff --git a/polkadot/node/overseer/src/lib.rs b/polkadot/node/overseer/src/lib.rs index da99546a44f..f4eddf1f41c 100644 --- a/polkadot/node/overseer/src/lib.rs +++ b/polkadot/node/overseer/src/lib.rs @@ -276,6 +276,7 @@ impl From> for BlockInfo { /// An event from outside the overseer scope, such /// as the substrate framework or user interaction. +#[derive(Debug)] pub enum Event { /// A new block was imported. /// @@ -300,6 +301,7 @@ pub enum Event { } /// Some request from outer world. +#[derive(Debug)] pub enum ExternalRequest { /// Wait for the activation of a particular hash /// and be notified by means of the return channel. diff --git a/polkadot/node/subsystem-bench/Cargo.toml b/polkadot/node/subsystem-bench/Cargo.toml new file mode 100644 index 00000000000..08d1a31adf5 --- /dev/null +++ b/polkadot/node/subsystem-bench/Cargo.toml @@ -0,0 +1,61 @@ +[package] +name = "polkadot-subsystem-bench" +description = "Subsystem performance benchmark client" +version = "1.0.0" +authors.workspace = true +edition.workspace = true +license.workspace = true +readme = "README.md" +publish = false + +[[bin]] +name = "subsystem-bench" +path = "src/subsystem-bench.rs" + +# Prevent rustdoc error. Already documented from top-level Cargo.toml. +doc = false + +[dependencies] +polkadot-node-subsystem = { path = "../subsystem" } +polkadot-node-subsystem-util = { path = "../subsystem-util" } +polkadot-node-subsystem-types = { path = "../subsystem-types" } +polkadot-node-primitives = { path = "../primitives" } +polkadot-primitives = { path = "../../primitives" } +polkadot-node-network-protocol = { path = "../network/protocol" } +polkadot-availability-recovery = { path = "../network/availability-recovery", features = ["subsystem-benchmarks"] } +color-eyre = { version = "0.6.1", default-features = false } +polkadot-overseer = { path = "../overseer" } +colored = "2.0.4" +assert_matches = "1.5" +async-trait = "0.1.57" +sp-keystore = { path = "../../../substrate/primitives/keystore" } +sc-keystore = { path = "../../../substrate/client/keystore" } +sp-core = { path = "../../../substrate/primitives/core" } +clap = { version = "4.4.6", features = ["derive"] } +futures = "0.3.21" +futures-timer = "3.0.2" +gum = { package = "tracing-gum", path = "../gum" } +polkadot-erasure-coding = { package = "polkadot-erasure-coding", path = "../../erasure-coding" } +log = "0.4.17" +env_logger = "0.9.0" +rand = "0.8.5" +parity-scale-codec = { version = "3.6.1", features = ["derive", "std"] } +tokio = "1.24.2" +clap-num = "1.0.2" +polkadot-node-subsystem-test-helpers = { path = "../subsystem-test-helpers" } +sp-keyring = { path = "../../../substrate/primitives/keyring" } +sp-application-crypto = { path = "../../../substrate/primitives/application-crypto" } +sc-network = { path = "../../../substrate/client/network" } +sc-service = { path = "../../../substrate/client/service" } +polkadot-node-metrics = { path = "../metrics" } +itertools = "0.11.0" +polkadot-primitives-test-helpers = { path = "../../primitives/test-helpers" } +prometheus_endpoint = { package = "substrate-prometheus-endpoint", path = "../../../substrate/utils/prometheus" } +prometheus = { version = "0.13.0", default-features = false } +serde = "1.0.192" +serde_yaml = "0.9" +paste = "1.0.14" +orchestra = { version = "0.3.3", default-features = false, features = ["futures_channel"] } + +[features] +default = [] diff --git a/polkadot/node/subsystem-bench/README.md b/polkadot/node/subsystem-bench/README.md new file mode 100644 index 00000000000..21844853334 --- /dev/null +++ b/polkadot/node/subsystem-bench/README.md @@ -0,0 +1,216 @@ +# Subsystem benchmark client + +Run parachain consensus stress and performance tests on your development machine. + +## Motivation + +The parachain consensus node implementation spans across many modules which we call subsystems. Each subsystem is +responsible for a small part of logic of the parachain consensus pipeline, but in general the most load and +performance issues are localized in just a few core subsystems like `availability-recovery`, `approval-voting` or +`dispute-coordinator`. In the absence of such a tool, we would run large test nets to load/stress test these parts of +the system. Setting up and making sense of the amount of data produced by such a large test is very expensive, hard +to orchestrate and is a huge development time sink. + +This tool aims to solve the problem by making it easy to: + +- set up and run core subsystem load tests locally on your development machine +- iterate and conclude faster when benchmarking new optimizations or comparing implementations +- automate and keep track of performance regressions in CI runs +- simulate various networking topologies, bandwidth and connectivity issues + +## Test environment setup + +`cargo build --profile=testnet --bin subsystem-bench -p polkadot-subsystem-bench` + +The output binary will be placed in `target/testnet/subsystem-bench`. + +### Test metrics + +Subsystem, CPU usage and network metrics are exposed via a prometheus endpoint during the test execution. +A small subset of these collected metrics are displayed in the CLI, but for an in depth analysys of the test results, +a local Grafana/Prometheus stack is needed. + +### Install Prometheus + +Please follow the [official installation guide](https://prometheus.io/docs/prometheus/latest/installation/) for your +platform/OS. + +After succesfully installing and starting up Prometheus, we need to alter it's configuration such that it +will scrape the benchmark prometheus endpoint `127.0.0.1:9999`. Please check the prometheus official documentation +regarding the location of `prometheus.yml`. On MacOS for example the full path `/opt/homebrew/etc/prometheus.yml` + +prometheus.yml: + +``` +global: + scrape_interval: 5s + +scrape_configs: + - job_name: "prometheus" + static_configs: + - targets: ["localhost:9090"] + - job_name: "subsystem-bench" + scrape_interval: 0s500ms + static_configs: + - targets: ['localhost:9999'] +``` + +To complete this step restart Prometheus server such that it picks up the new configuration. + +### Install and setup Grafana + +Follow the [installation guide](https://grafana.com/docs/grafana/latest/setup-grafana/installation/) relevant +to your operating system. + +Once you have the installation up and running, configure the local Prometheus as a data source by following +[this guide](https://grafana.com/docs/grafana/latest/datasources/prometheus/configure-prometheus-data-source/) + +#### Import dashboards + +Follow [this guide](https://grafana.com/docs/grafana/latest/dashboards/manage-dashboards/#export-and-import-dashboards) +to import the dashboards from the repository `grafana` folder. + +## How to run a test + +To run a test, you need to first choose a test objective. Currently, we support the following: + +``` +target/testnet/subsystem-bench --help +The almighty Subsystem Benchmark Tool™️ + +Usage: subsystem-bench [OPTIONS] + +Commands: + data-availability-read Benchmark availability recovery strategies + +``` + +Note: `test-sequence` is a special test objective that wraps up an arbitrary number of test objectives. It is tipically + used to run a suite of tests defined in a `yaml` file like in this [example](examples/availability_read.yaml). + +### Standard test options + +``` +Options: + --network The type of network to be emulated [default: ideal] [possible values: + ideal, healthy, degraded] + --n-cores Number of cores to fetch availability for [default: 100] + --n-validators Number of validators to fetch chunks from [default: 500] + --min-pov-size The minimum pov size in KiB [default: 5120] + --max-pov-size The maximum pov size bytes [default: 5120] + -n, --num-blocks The number of blocks the test is going to run [default: 1] + -p, --peer-bandwidth The bandwidth of simulated remote peers in KiB + -b, --bandwidth The bandwidth of our simulated node in KiB + --peer-error Simulated conection error ratio [0-100] + --peer-min-latency Minimum remote peer latency in milliseconds [0-5000] + --peer-max-latency Maximum remote peer latency in milliseconds [0-5000] + -h, --help Print help + -V, --version Print version +``` + +These apply to all test objectives, except `test-sequence` which relies on the values being specified in a file. + +### Test objectives + +Each test objective can have it's specific configuration options, in contrast with the standard test options. + +For `data-availability-read` the recovery strategy to be used is configurable. + +``` +target/testnet/subsystem-bench data-availability-read --help +Benchmark availability recovery strategies + +Usage: subsystem-bench data-availability-read [OPTIONS] + +Options: + -f, --fetch-from-backers Turbo boost AD Read by fetching the full availability datafrom backers first. Saves CPU + as we don't need to re-construct from chunks. Tipically this is only faster if nodes + have enough bandwidth + -h, --help Print help +``` + +### Understanding the test configuration + +A single test configuration `TestConfiguration` struct applies to a single run of a certain test objective. + +The configuration describes the following important parameters that influence the test duration and resource +usage: + +- how many validators are on the emulated network (`n_validators`) +- how many cores per block the subsystem will have to do work on (`n_cores`) +- for how many blocks the test should run (`num_blocks`) + +From the perspective of the subsystem under test, this means that it will receive an `ActiveLeavesUpdate` signal +followed by an arbitrary amount of messages. This process repeats itself for `num_blocks`. The messages are generally +test payloads pre-generated before the test run, or constructed on pre-genereated payloads. For example the +`AvailabilityRecoveryMessage::RecoverAvailableData` message includes a `CandidateReceipt` which is generated before +the test is started. + +### Example run + +Let's run an availabilty read test which will recover availability for 10 cores with max PoV size on a 500 +node validator network. + +``` + target/testnet/subsystem-bench --n-cores 10 data-availability-read +[2023-11-28T09:01:59Z INFO subsystem_bench::core::display] n_validators = 500, n_cores = 10, pov_size = 5120 - 5120, + error = 0, latency = None +[2023-11-28T09:01:59Z INFO subsystem-bench::availability] Generating template candidate index=0 pov_size=5242880 +[2023-11-28T09:01:59Z INFO subsystem-bench::availability] Created test environment. +[2023-11-28T09:01:59Z INFO subsystem-bench::availability] Pre-generating 10 candidates. +[2023-11-28T09:02:01Z INFO subsystem-bench::core] Initializing network emulation for 500 peers. +[2023-11-28T09:02:01Z INFO substrate_prometheus_endpoint] 〽️ Prometheus exporter started at 127.0.0.1:9999 +[2023-11-28T09:02:01Z INFO subsystem-bench::availability] Current block 1/1 +[2023-11-28T09:02:01Z INFO subsystem_bench::availability] 10 recoveries pending +[2023-11-28T09:02:04Z INFO subsystem_bench::availability] Block time 3231ms +[2023-11-28T09:02:04Z INFO subsystem-bench::availability] Sleeping till end of block (2768ms) +[2023-11-28T09:02:07Z INFO subsystem_bench::availability] All blocks processed in 6001ms +[2023-11-28T09:02:07Z INFO subsystem_bench::availability] Throughput: 51200 KiB/block +[2023-11-28T09:02:07Z INFO subsystem_bench::availability] Block time: 6001 ms +[2023-11-28T09:02:07Z INFO subsystem_bench::availability] + + Total received from network: 66 MiB + Total sent to network: 58 KiB + Total subsystem CPU usage 4.16s + CPU usage per block 4.16s + Total test environment CPU usage 0.00s + CPU usage per block 0.00s +``` + +`Block time` in the context of `data-availability-read` has a different meaning. It measures the amount of time it +took the subsystem to finish processing all of the messages sent in the context of the current test block. + +### Test logs + +You can select log target, subtarget and verbosity just like with Polkadot node CLI, simply setting +`RUST_LOOG="parachain=debug"` turns on debug logs for all parachain consensus subsystems in the test. + +### View test metrics + +Assuming the Grafana/Prometheus stack installation steps completed succesfully, you should be able to +view the test progress in real time by accessing [this link](http://localhost:3000/goto/SM5B8pNSR?orgId=1). + +Now run +`target/testnet/subsystem-bench test-sequence --path polkadot/node/subsystem-bench/examples/availability_read.yaml` +and view the metrics in real time and spot differences between different `n_valiator` values. + +## Create new test objectives + +This tool is intended to make it easy to write new test objectives that focus individual subsystems, +or even multiple subsystems (for example `approval-distribution` and `approval-voting`). + +A special kind of test objectives are performance regression tests for the CI pipeline. These should be sequences +of tests that check the performance characteristics (such as CPU usage, speed) of the subsystem under test in both +happy and negative scenarios (low bandwidth, network errors and low connectivity). + +### Reusable test components + +To faster write a new test objective you need to use some higher level wrappers and logic: `TestEnvironment`, +`TestConfiguration`, `TestAuthorities`, `NetworkEmulator`. To create the `TestEnvironment` you will +need to also build an `Overseer`, but that should be easy using the mockups for subsystems in`core::mock`. + +### Mocking + +Ideally we want to have a single mock implementation for subsystems that can be minimally configured to +be used in different tests. A good example is `runtime-api` which currently only responds to session information +requests based on static data. It can be easily extended to service other requests. diff --git a/polkadot/node/subsystem-bench/examples/availability_read.yaml b/polkadot/node/subsystem-bench/examples/availability_read.yaml new file mode 100644 index 00000000000..311ea972141 --- /dev/null +++ b/polkadot/node/subsystem-bench/examples/availability_read.yaml @@ -0,0 +1,57 @@ +TestConfiguration: +# Test 1 +- objective: !DataAvailabilityRead + fetch_from_backers: false + n_validators: 300 + n_cores: 20 + min_pov_size: 5120 + max_pov_size: 5120 + peer_bandwidth: 52428800 + bandwidth: 52428800 + latency: + min_latency: + secs: 0 + nanos: 1000000 + max_latency: + secs: 0 + nanos: 100000000 + error: 3 + num_blocks: 3 + +# Test 2 +- objective: !DataAvailabilityRead + fetch_from_backers: false + n_validators: 500 + n_cores: 20 + min_pov_size: 5120 + max_pov_size: 5120 + peer_bandwidth: 52428800 + bandwidth: 52428800 + latency: + min_latency: + secs: 0 + nanos: 1000000 + max_latency: + secs: 0 + nanos: 100000000 + error: 3 + num_blocks: 3 + +# Test 3 +- objective: !DataAvailabilityRead + fetch_from_backers: false + n_validators: 1000 + n_cores: 20 + min_pov_size: 5120 + max_pov_size: 5120 + peer_bandwidth: 52428800 + bandwidth: 52428800 + latency: + min_latency: + secs: 0 + nanos: 1000000 + max_latency: + secs: 0 + nanos: 100000000 + error: 3 + num_blocks: 3 diff --git a/polkadot/node/subsystem-bench/grafana/availability-read.json b/polkadot/node/subsystem-bench/grafana/availability-read.json new file mode 100644 index 00000000000..31c4ad3c795 --- /dev/null +++ b/polkadot/node/subsystem-bench/grafana/availability-read.json @@ -0,0 +1,1874 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "description": "Subsystem and test environment metrics", + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 2, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "e56e7dd2-a992-4eec-aa96-e47b21c9020b" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": 60000, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 90, + "interval": "1s", + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "e56e7dd2-a992-4eec-aa96-e47b21c9020b" + }, + "editorMode": "code", + "expr": "subsystem_benchmark_n_validators{}", + "instant": false, + "legendFormat": "n_vaidators", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "e56e7dd2-a992-4eec-aa96-e47b21c9020b" + }, + "editorMode": "code", + "expr": "subsystem_benchmark_n_cores{}", + "hide": false, + "instant": false, + "legendFormat": "n_cores", + "range": true, + "refId": "B" + } + ], + "title": "Test configuration", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 9 + }, + "id": 31, + "panels": [], + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "refId": "A" + } + ], + "title": "Overview", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$data_source" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 30, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 24, + "x": 0, + "y": 10 + }, + "id": 57, + "interval": "1s", + "options": { + "legend": { + "calcs": [ + "mean", + "min", + "max" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true, + "sortBy": "Mean", + "sortDesc": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "10.0.2", + "repeat": "nodename", + "targets": [ + { + "datasource": { + "uid": "$data_source" + }, + "editorMode": "code", + "expr": "sum(rate(substrate_tasks_polling_duration_sum{}[2s])) by ($cpu_group_by)", + "interval": "", + "legendFormat": "{{task_group}}", + "range": true, + "refId": "A" + } + ], + "title": "All tasks CPU usage breakdown", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$data_source" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 30, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "area" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 6 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 24, + "x": 0, + "y": 20 + }, + "id": 93, + "interval": "1s", + "options": { + "legend": { + "calcs": [ + "mean", + "min", + "max" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true, + "sortBy": "Mean", + "sortDesc": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "10.0.2", + "targets": [ + { + "datasource": { + "uid": "$data_source" + }, + "editorMode": "code", + "expr": "increase(substrate_tasks_polling_duration_sum{task_group=\"availability-recovery\"}[6s])", + "interval": "", + "legendFormat": "{{task_name}}", + "range": true, + "refId": "A" + } + ], + "title": "Availability subsystem CPU usage per block", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$data_source" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 30, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "log": 10, + "type": "log" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 24, + "x": 0, + "y": 30 + }, + "id": 94, + "interval": "1s", + "options": { + "legend": { + "calcs": [ + "last" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true, + "sortBy": "Last", + "sortDesc": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "10.0.2", + "targets": [ + { + "datasource": { + "uid": "$data_source" + }, + "editorMode": "code", + "expr": "sum(substrate_tasks_polling_duration_sum{}) by ($cpu_group_by)", + "interval": "", + "legendFormat": "{{task_name}}", + "range": true, + "refId": "A" + } + ], + "title": "Total CPU burn", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$data_source" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 30, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "log": 10, + "type": "log" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "area" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "dark-red", + "value": 6000 + } + ] + }, + "unit": "ms" + }, + "overrides": [] + }, + "gridPos": { + "h": 12, + "w": 12, + "x": 0, + "y": 40 + }, + "id": 95, + "interval": "1s", + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true, + "sortBy": "Last", + "sortDesc": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "10.0.2", + "targets": [ + { + "datasource": { + "uid": "$data_source" + }, + "editorMode": "code", + "expr": "subsystem_benchmark_block_time", + "interval": "", + "legendFormat": "Instant block time", + "range": true, + "refId": "A" + } + ], + "title": "All candidates in block recovery time", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "e56e7dd2-a992-4eec-aa96-e47b21c9020b" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 100, + "gradientMode": "hue", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 2, + "scaleDistribution": { + "log": 2, + "type": "log" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "binBps" + }, + "overrides": [] + }, + "gridPos": { + "h": 12, + "w": 12, + "x": 12, + "y": 40 + }, + "id": 89, + "interval": "1s", + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "e56e7dd2-a992-4eec-aa96-e47b21c9020b" + }, + "editorMode": "code", + "expr": "sum(rate(subsystem_benchmark_network_peer_total_bytes_received{}[5s]))", + "instant": false, + "legendFormat": "Received", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "e56e7dd2-a992-4eec-aa96-e47b21c9020b" + }, + "editorMode": "code", + "expr": "sum(rate(subsystem_benchmark_network_peer_total_bytes_sent{}[5s]))", + "hide": false, + "instant": false, + "legendFormat": "Sent", + "range": true, + "refId": "B" + } + ], + "title": "Emulated network throughput ", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "e56e7dd2-a992-4eec-aa96-e47b21c9020b" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "log": 2, + "type": "log" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 15, + "w": 12, + "x": 0, + "y": 52 + }, + "id": 88, + "interval": "1s", + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "e56e7dd2-a992-4eec-aa96-e47b21c9020b" + }, + "editorMode": "code", + "expr": "rate(subsystem_benchmark_network_peer_total_bytes_received{}[10s])", + "instant": false, + "legendFormat": "Received by {{peer}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "e56e7dd2-a992-4eec-aa96-e47b21c9020b" + }, + "editorMode": "code", + "expr": "rate(subsystem_benchmark_network_peer_total_bytes_sent{}[10s])", + "hide": false, + "instant": false, + "legendFormat": "Sent by {{peer}}", + "range": true, + "refId": "B" + } + ], + "title": "Emulated peer throughput", + "type": "timeseries" + }, + { + "cards": {}, + "color": { + "cardColor": "#b4ff00", + "colorScale": "sqrt", + "colorScheme": "interpolateInferno", + "exponent": 0.5, + "mode": "spectrum" + }, + "dataFormat": "tsbuckets", + "datasource": { + "type": "prometheus", + "uid": "${data_source}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + } + }, + "overrides": [] + }, + "gridPos": { + "h": 15, + "w": 12, + "x": 12, + "y": 52 + }, + "heatmap": {}, + "hideZeroBuckets": true, + "highlightCards": true, + "id": 92, + "interval": "1s", + "legend": { + "show": true + }, + "maxDataPoints": 1340, + "options": { + "calculate": false, + "calculation": {}, + "cellGap": 2, + "cellValues": { + "decimals": 0 + }, + "color": { + "exponent": 0.5, + "fill": "#b4ff00", + "mode": "scheme", + "reverse": false, + "scale": "exponential", + "scheme": "Inferno", + "steps": 128 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-9 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto" + }, + "showValue": "never", + "tooltip": { + "show": true, + "yHistogram": true + }, + "yAxis": { + "axisPlacement": "left", + "decimals": 0, + "reverse": false, + "unit": "bytes" + } + }, + "pluginVersion": "10.1.1", + "reverseYBuckets": false, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${data_source}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(subsystem_benchmark_pov_size_bucket{}[$__rate_interval])) by (le)", + "format": "heatmap", + "hide": false, + "instant": false, + "interval": "", + "legendFormat": "{{le}}", + "queryType": "randomWalk", + "refId": "B" + } + ], + "title": "Recovered PoV sizes", + "tooltip": { + "show": true, + "showHistogram": true + }, + "tooltipDecimals": 0, + "transformations": [], + "type": "heatmap", + "xAxis": { + "show": true + }, + "yAxis": { + "decimals": 0, + "format": "s", + "logBase": 1, + "show": true + }, + "yBucketBound": "auto" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${data_source}" + }, + "description": "Number of erasure-encoded chunks of data belonging to candidate blocks. ", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic", + "seriesBy": "max" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "chunks/s" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 67 + }, + "id": 43, + "interval": "1s", + "maxDataPoints": 1340, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.2.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${data_source}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(polkadot_parachain_availability_recovery_chunk_requests_issued{}[10s]))", + "format": "time_series", + "hide": false, + "instant": false, + "interval": "", + "legendFormat": "Chunks requested", + "queryType": "randomWalk", + "refId": "B" + } + ], + "title": "Availability", + "transformations": [], + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 77 + }, + "id": 35, + "panels": [], + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "refId": "A" + } + ], + "title": "Availability subystem metrics", + "type": "row" + }, + { + "cards": {}, + "color": { + "cardColor": "#b4ff00", + "colorScale": "sqrt", + "colorScheme": "interpolateInferno", + "exponent": 0.5, + "mode": "spectrum" + }, + "dataFormat": "tsbuckets", + "datasource": { + "type": "prometheus", + "uid": "${data_source}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + } + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 78 + }, + "heatmap": {}, + "hideZeroBuckets": true, + "highlightCards": true, + "id": 68, + "interval": "1s", + "legend": { + "show": true + }, + "maxDataPoints": 1340, + "options": { + "calculate": false, + "calculation": {}, + "cellGap": 2, + "cellValues": { + "decimals": 0 + }, + "color": { + "exponent": 0.5, + "fill": "#b4ff00", + "mode": "scheme", + "reverse": false, + "scale": "exponential", + "scheme": "Inferno", + "steps": 128 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-9 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto" + }, + "showValue": "never", + "tooltip": { + "show": true, + "yHistogram": true + }, + "yAxis": { + "axisPlacement": "left", + "decimals": 0, + "reverse": false, + "unit": "s" + } + }, + "pluginVersion": "10.1.1", + "reverseYBuckets": false, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${data_source}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(polkadot_parachain_availability_recovery_time_total_bucket{}[$__rate_interval])) by (le)", + "format": "heatmap", + "hide": false, + "instant": false, + "interval": "", + "legendFormat": "{{le}}", + "queryType": "randomWalk", + "refId": "B" + } + ], + "title": "Time to recover a PoV", + "tooltip": { + "show": true, + "showHistogram": true + }, + "tooltipDecimals": 0, + "transformations": [], + "type": "heatmap", + "xAxis": { + "show": true + }, + "yAxis": { + "decimals": 0, + "format": "s", + "logBase": 1, + "show": true + }, + "yBucketBound": "auto" + }, + { + "cards": {}, + "color": { + "cardColor": "#b4ff00", + "colorScale": "sqrt", + "colorScheme": "interpolateInferno", + "exponent": 0.5, + "mode": "spectrum" + }, + "dataFormat": "tsbuckets", + "datasource": { + "type": "prometheus", + "uid": "${data_source}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + } + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 78 + }, + "heatmap": {}, + "hideZeroBuckets": true, + "highlightCards": true, + "id": 67, + "interval": "1s", + "legend": { + "show": true + }, + "maxDataPoints": 1340, + "options": { + "calculate": false, + "calculation": {}, + "cellGap": 2, + "cellValues": { + "decimals": 0 + }, + "color": { + "exponent": 0.5, + "fill": "#b4ff00", + "mode": "scheme", + "reverse": false, + "scale": "exponential", + "scheme": "Inferno", + "steps": 128 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-9 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto" + }, + "showValue": "never", + "tooltip": { + "show": true, + "yHistogram": true + }, + "yAxis": { + "axisPlacement": "left", + "decimals": 0, + "reverse": false, + "unit": "s" + } + }, + "pluginVersion": "10.1.1", + "reverseYBuckets": false, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${data_source}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(polkadot_parachain_availability_recovery_time_chunk_request_bucket{}[$__rate_interval])) by (le)", + "format": "heatmap", + "instant": false, + "interval": "", + "legendFormat": "{{le}}", + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Chunk request duration", + "tooltip": { + "show": true, + "showHistogram": true + }, + "tooltipDecimals": 0, + "transformations": [], + "type": "heatmap", + "xAxis": { + "show": true + }, + "yAxis": { + "decimals": 0, + "format": "bitfields", + "logBase": 1, + "show": true + }, + "yBucketBound": "auto" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${data_source}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic", + "seriesBy": "max" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "Bps" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 88 + }, + "id": 85, + "interval": "1s", + "maxDataPoints": 1340, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.2.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${data_source}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "rate(polkadot_parachain_availability_recovery_bytes_total{}[30s])", + "format": "time_series", + "hide": false, + "instant": false, + "interval": "", + "legendFormat": "Bytes recovered", + "queryType": "randomWalk", + "refId": "B" + } + ], + "title": "Recovery throughtput", + "transformations": [], + "type": "timeseries" + }, + { + "cards": {}, + "color": { + "cardColor": "#b4ff00", + "colorScale": "sqrt", + "colorScheme": "interpolateInferno", + "exponent": 0.5, + "mode": "spectrum" + }, + "dataFormat": "tsbuckets", + "datasource": { + "type": "prometheus", + "uid": "${data_source}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + } + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 88 + }, + "heatmap": {}, + "hideZeroBuckets": true, + "highlightCards": true, + "id": 84, + "interval": "1s", + "legend": { + "show": true + }, + "maxDataPoints": 1340, + "options": { + "calculate": false, + "calculation": {}, + "cellGap": 2, + "cellValues": { + "decimals": 0 + }, + "color": { + "exponent": 0.5, + "fill": "#b4ff00", + "mode": "scheme", + "reverse": false, + "scale": "exponential", + "scheme": "Inferno", + "steps": 128 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-9 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto" + }, + "showValue": "never", + "tooltip": { + "show": true, + "yHistogram": true + }, + "yAxis": { + "axisPlacement": "left", + "decimals": 0, + "reverse": false, + "unit": "s" + } + }, + "pluginVersion": "10.1.1", + "reverseYBuckets": false, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${data_source}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(polkadot_parachain_availability_reencode_chunks_bucket{}[$__rate_interval])) by (le)", + "format": "heatmap", + "hide": false, + "instant": false, + "interval": "", + "legendFormat": "{{le}}", + "queryType": "randomWalk", + "refId": "B" + } + ], + "title": "Re-encoding chunks timing", + "tooltip": { + "show": true, + "showHistogram": true + }, + "tooltipDecimals": 0, + "transformations": [], + "type": "heatmap", + "xAxis": { + "show": true + }, + "yAxis": { + "decimals": 0, + "format": "s", + "logBase": 1, + "show": true + }, + "yBucketBound": "auto" + }, + { + "cards": {}, + "color": { + "cardColor": "#b4ff00", + "colorScale": "sqrt", + "colorScheme": "interpolateInferno", + "exponent": 0.5, + "mode": "spectrum" + }, + "dataFormat": "tsbuckets", + "datasource": { + "type": "prometheus", + "uid": "${data_source}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + } + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 98 + }, + "heatmap": {}, + "hideZeroBuckets": true, + "highlightCards": true, + "id": 83, + "interval": "1s", + "legend": { + "show": true + }, + "maxDataPoints": 1340, + "options": { + "calculate": false, + "calculation": {}, + "cellGap": 2, + "cellValues": { + "decimals": 0 + }, + "color": { + "exponent": 0.5, + "fill": "#b4ff00", + "mode": "scheme", + "reverse": false, + "scale": "exponential", + "scheme": "Inferno", + "steps": 128 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-9 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto" + }, + "showValue": "never", + "tooltip": { + "show": true, + "yHistogram": true + }, + "yAxis": { + "axisPlacement": "left", + "decimals": 0, + "reverse": false, + "unit": "s" + } + }, + "pluginVersion": "10.1.1", + "reverseYBuckets": false, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${data_source}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(polkadot_parachain_availability_recovery_time_erasure_recovery_bucket{}[$__rate_interval])) by (le)", + "format": "heatmap", + "hide": false, + "instant": false, + "interval": "", + "legendFormat": "{{le}}", + "queryType": "randomWalk", + "refId": "B" + } + ], + "title": "Erasure recovery (no I/O)", + "tooltip": { + "show": true, + "showHistogram": true + }, + "tooltipDecimals": 0, + "transformations": [], + "type": "heatmap", + "xAxis": { + "show": true + }, + "yAxis": { + "decimals": 0, + "format": "s", + "logBase": 1, + "show": true + }, + "yBucketBound": "auto" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${data_source}" + }, + "description": "Number of erasure-encoded chunks of data belonging to candidate blocks. ", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic", + "seriesBy": "max" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "stepAfter", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "cps" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 108 + }, + "id": 86, + "interval": "1s", + "maxDataPoints": 1340, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.2.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${data_source}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(polkadot_parachain_availability_recovery_recoveries_finished{}[1s]))", + "format": "time_series", + "hide": false, + "instant": false, + "interval": "", + "legendFormat": "Finished", + "queryType": "randomWalk", + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${data_source}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(polkadot_parachain_availability_recovery_recovieries_started{}[1s]))", + "format": "time_series", + "hide": false, + "instant": false, + "interval": "", + "legendFormat": "Started", + "queryType": "randomWalk", + "refId": "A" + } + ], + "title": "Recoveries", + "transformations": [], + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 118 + }, + "id": 2, + "panels": [], + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "refId": "A" + } + ], + "title": "Approval voting", + "type": "row" + } + ], + "refresh": false, + "schemaVersion": 38, + "style": "dark", + "tags": [ + "subsystem", + "benchmark" + ], + "templating": { + "list": [ + { + "current": { + "selected": false, + "text": "Prometheus", + "value": "e56e7dd2-a992-4eec-aa96-e47b21c9020b" + }, + "hide": 0, + "includeAll": false, + "label": "Source of data", + "multi": false, + "name": "data_source", + "options": [], + "query": "prometheus", + "queryValue": "", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + }, + { + "current": { + "selected": true, + "text": "task_name", + "value": "task_name" + }, + "description": "Sum CPU usage by task name or task group.", + "hide": 0, + "includeAll": false, + "label": "Group CPU usage", + "multi": false, + "name": "cpu_group_by", + "options": [ + { + "selected": true, + "text": "task_name", + "value": "task_name" + }, + { + "selected": false, + "text": "task_group", + "value": "task_group" + } + ], + "query": "task_name, task_group", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + } + ] + }, + "time": { + "from": "2023-11-28T13:05:32.794Z", + "to": "2023-11-28T13:06:56.173Z" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s" + ] + }, + "timezone": "utc", + "title": "Data Availability Read", + "uid": "asdadasd1", + "version": 58, + "weekStart": "" +} \ No newline at end of file diff --git a/polkadot/node/subsystem-bench/grafana/task-cpu-usage.json b/polkadot/node/subsystem-bench/grafana/task-cpu-usage.json new file mode 100644 index 00000000000..90763444abf --- /dev/null +++ b/polkadot/node/subsystem-bench/grafana/task-cpu-usage.json @@ -0,0 +1,755 @@ +{ + "annotations": { + "list": [ + { + "$$hashKey": "object:326", + "builtIn": 1, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "limit": 100, + "name": "Annotations & Alerts", + "showIn": 0, + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + }, + { + "$$hashKey": "object:327", + "datasource": { + "uid": "$data_source" + }, + "enable": true, + "expr": "increase(${metric_namespace}_tasks_ended_total{reason=\"panic\", node=~\"${nodename}\"}[10m])", + "hide": true, + "iconColor": "rgba(255, 96, 96, 1)", + "limit": 100, + "name": "Task panics", + "rawQuery": "SELECT\n extract(epoch from time_column) AS time,\n text_column as text,\n tags_column as tags\nFROM\n metric_table\nWHERE\n $__timeFilter(time_column)\n", + "showIn": 0, + "step": "10m", + "tags": [], + "textFormat": "{{node}} - {{task_name}}", + "titleFormat": "Panic!", + "type": "tags" + }, + { + "$$hashKey": "object:621", + "datasource": { + "uid": "$data_source" + }, + "enable": true, + "expr": "changes(${metric_namespace}_process_start_time_seconds{node=~\"${nodename}\"}[10m])", + "hide": false, + "iconColor": "#8AB8FF", + "name": "Node reboots", + "showIn": 0, + "step": "10m", + "textFormat": "{{node}}", + "titleFormat": "Reboots" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 1, + "links": [], + "liveNow": false, + "panels": [ + { + "collapsed": false, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 29, + "panels": [], + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "refId": "A" + } + ], + "title": "Tasks", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "type": "prometheus", + "uid": "e56e7dd2-a992-4eec-aa96-e47b21c9020b" + }, + "fieldConfig": { + "defaults": { + "links": [] + }, + "overrides": [] + }, + "fill": 3, + "fillGradient": 0, + "gridPos": { + "h": 9, + "w": 24, + "x": 0, + "y": 1 + }, + "hiddenSeries": false, + "id": 11, + "interval": "1s", + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "10.1.1", + "pointradius": 2, + "points": false, + "renderer": "flot", + "repeat": "nodename", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "datasource": { + "uid": "$data_source" + }, + "editorMode": "code", + "expr": "sum(rate(substrate_tasks_polling_duration_sum{}[$__rate_interval])) by (task_name)", + "interval": "", + "legendFormat": "{{task_name}}", + "range": true, + "refId": "A" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "CPU time spent on each task", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:2721", + "format": "percentunit", + "logBase": 1, + "show": true + }, + { + "$$hashKey": "object:2722", + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "type": "prometheus", + "uid": "e56e7dd2-a992-4eec-aa96-e47b21c9020b" + }, + "fieldConfig": { + "defaults": { + "links": [] + }, + "overrides": [] + }, + "fill": 3, + "fillGradient": 0, + "gridPos": { + "h": 6, + "w": 24, + "x": 0, + "y": 10 + }, + "hiddenSeries": false, + "id": 30, + "interval": "1s", + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "connected", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "10.1.1", + "pointradius": 2, + "points": false, + "renderer": "flot", + "repeat": "nodename", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "datasource": { + "uid": "$data_source" + }, + "editorMode": "code", + "expr": "rate(substrate_tasks_polling_duration_count{}[$__rate_interval])", + "interval": "", + "legendFormat": "{{task_name}}", + "range": true, + "refId": "A" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Task polling rate per second", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:2571", + "format": "cps", + "logBase": 1, + "show": true + }, + { + "$$hashKey": "object:2572", + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "type": "prometheus", + "uid": "e56e7dd2-a992-4eec-aa96-e47b21c9020b" + }, + "fieldConfig": { + "defaults": { + "links": [] + }, + "overrides": [] + }, + "fill": 0, + "fillGradient": 0, + "gridPos": { + "h": 6, + "w": 24, + "x": 0, + "y": 16 + }, + "hiddenSeries": false, + "id": 43, + "interval": "1s", + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "hideEmpty": true, + "hideZero": false, + "max": true, + "min": true, + "rightSide": true, + "show": true, + "total": true, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "connected", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "10.1.1", + "pointradius": 2, + "points": false, + "renderer": "flot", + "repeat": "nodename", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "datasource": { + "uid": "$data_source" + }, + "editorMode": "code", + "expr": "increase(substrate_tasks_polling_duration_sum{}[$__rate_interval]) / increase(substrate_tasks_polling_duration_count{}[$__rate_interval])", + "interval": "", + "legendFormat": "{{task_name}}", + "range": true, + "refId": "A" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Average time it takes to call Future::poll()", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:2571", + "format": "s", + "logBase": 1, + "min": "0", + "show": true + }, + { + "$$hashKey": "object:2572", + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "aliasColors": {}, + "bars": true, + "dashLength": 10, + "dashes": false, + "datasource": { + "type": "prometheus", + "uid": "e56e7dd2-a992-4eec-aa96-e47b21c9020b" + }, + "fieldConfig": { + "defaults": { + "links": [] + }, + "overrides": [] + }, + "fill": 0, + "fillGradient": 0, + "gridPos": { + "h": 6, + "w": 24, + "x": 0, + "y": 22 + }, + "hiddenSeries": false, + "id": 15, + "interval": "1s", + "legend": { + "alignAsTable": true, + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": true, + "values": true + }, + "lines": false, + "linewidth": 1, + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "10.1.1", + "pointradius": 2, + "points": false, + "renderer": "flot", + "repeat": "nodename", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": true, + "targets": [ + { + "datasource": { + "uid": "$data_source" + }, + "editorMode": "code", + "expr": "increase(substrate_tasks_spawned_total{}[$__rate_interval])", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{task_name}}", + "range": true, + "refId": "A" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Number of tasks started", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:771", + "format": "short", + "logBase": 10, + "min": "0", + "show": true + }, + { + "$$hashKey": "object:772", + "format": "short", + "logBase": 1, + "show": true + } + ], + "yaxis": { + "align": false + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "type": "prometheus", + "uid": "e56e7dd2-a992-4eec-aa96-e47b21c9020b" + }, + "fieldConfig": { + "defaults": { + "links": [] + }, + "overrides": [] + }, + "fill": 0, + "fillGradient": 0, + "gridPos": { + "h": 6, + "w": 24, + "x": 0, + "y": 28 + }, + "hiddenSeries": false, + "id": 2, + "interval": "1s", + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "max": true, + "min": true, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "connected", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "10.1.1", + "pointradius": 2, + "points": false, + "renderer": "flot", + "repeat": "nodename", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "datasource": { + "uid": "$data_source" + }, + "editorMode": "code", + "expr": "substrate_tasks_spawned_total{} - sum(substrate_tasks_ended_total{}) without(reason)\n\n# Fallback if tasks_ended_total is null for that task\nor on(task_name) substrate_tasks_spawned_total{}", + "interval": "", + "legendFormat": "{{task_name}}", + "range": true, + "refId": "A" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Number of tasks running", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:919", + "format": "short", + "logBase": 1, + "min": "0", + "show": true + }, + { + "$$hashKey": "object:920", + "format": "short", + "logBase": 1, + "show": true + } + ], + "yaxis": { + "align": false + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "type": "prometheus", + "uid": "e56e7dd2-a992-4eec-aa96-e47b21c9020b" + }, + "fieldConfig": { + "defaults": { + "links": [] + }, + "overrides": [] + }, + "fill": 0, + "fillGradient": 0, + "gridPos": { + "h": 6, + "w": 24, + "x": 0, + "y": 34 + }, + "hiddenSeries": false, + "id": 7, + "interval": "1s", + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "hideEmpty": true, + "hideZero": true, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null as zero", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "10.1.1", + "pointradius": 2, + "points": false, + "renderer": "flot", + "repeat": "nodename", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": true, + "targets": [ + { + "datasource": { + "uid": "$data_source" + }, + "editorMode": "code", + "expr": "irate(substrate_tasks_polling_duration_bucket{le=\"+Inf\"}[$__rate_interval])\n - ignoring(le)\n irate(substrate_tasks_polling_duration_bucket{le=\"1.024\"}[$__rate_interval]) > 0", + "interval": "", + "legendFormat": "{{task_name}}", + "range": true, + "refId": "A" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "Number of calls to `Future::poll` that took more than one second", + "tooltip": { + "shared": true, + "sort": 2, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:3040", + "format": "cps", + "label": "Calls to `Future::poll`/second", + "logBase": 1, + "min": "0", + "show": true + }, + { + "$$hashKey": "object:3041", + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "collapsed": false, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 40 + }, + "id": 27, + "panels": [], + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "refId": "A" + } + ], + "title": "Unbounded Channels", + "type": "row" + } + ], + "refresh": "5s", + "schemaVersion": 38, + "style": "dark", + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-15m", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ] + }, + "timezone": "utc", + "title": "Substrate Service Tasks with substrate prefix", + "uid": "S7sc-M_Gk", + "version": 17, + "weekStart": "" + } \ No newline at end of file diff --git a/polkadot/node/subsystem-bench/src/availability/cli.rs b/polkadot/node/subsystem-bench/src/availability/cli.rs new file mode 100644 index 00000000000..65df8c1552a --- /dev/null +++ b/polkadot/node/subsystem-bench/src/availability/cli.rs @@ -0,0 +1,37 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +use serde::{Deserialize, Serialize}; + +#[derive(clap::ValueEnum, Clone, Copy, Debug, PartialEq)] +#[value(rename_all = "kebab-case")] +#[non_exhaustive] +pub enum NetworkEmulation { + Ideal, + Healthy, + Degraded, +} + +#[derive(Debug, Clone, Serialize, Deserialize, clap::Parser)] +#[clap(rename_all = "kebab-case")] +#[allow(missing_docs)] +pub struct DataAvailabilityReadOptions { + #[clap(short, long, default_value_t = false)] + /// Turbo boost AD Read by fetching the full availability datafrom backers first. Saves CPU as + /// we don't need to re-construct from chunks. Tipically this is only faster if nodes have + /// enough bandwidth. + pub fetch_from_backers: bool, +} diff --git a/polkadot/node/subsystem-bench/src/availability/mod.rs b/polkadot/node/subsystem-bench/src/availability/mod.rs new file mode 100644 index 00000000000..7c81b931365 --- /dev/null +++ b/polkadot/node/subsystem-bench/src/availability/mod.rs @@ -0,0 +1,339 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . +use itertools::Itertools; +use std::{collections::HashMap, iter::Cycle, ops::Sub, sync::Arc, time::Instant}; + +use crate::TestEnvironment; +use polkadot_node_subsystem::{Overseer, OverseerConnector, SpawnGlue}; +use polkadot_node_subsystem_test_helpers::derive_erasure_chunks_with_proofs_and_root; +use polkadot_overseer::Handle as OverseerHandle; +use sc_network::request_responses::ProtocolConfig; + +use colored::Colorize; + +use futures::{channel::oneshot, stream::FuturesUnordered, StreamExt}; +use polkadot_node_metrics::metrics::Metrics; + +use polkadot_availability_recovery::AvailabilityRecoverySubsystem; + +use crate::GENESIS_HASH; +use parity_scale_codec::Encode; +use polkadot_node_network_protocol::request_response::{IncomingRequest, ReqProtocolNames}; +use polkadot_node_primitives::{BlockData, PoV}; +use polkadot_node_subsystem::messages::{AllMessages, AvailabilityRecoveryMessage}; + +use crate::core::{ + environment::TestEnvironmentDependencies, + mock::{ + av_store, + network_bridge::{self, MockNetworkBridgeTx, NetworkAvailabilityState}, + runtime_api, MockAvailabilityStore, MockRuntimeApi, + }, +}; + +use super::core::{configuration::TestConfiguration, mock::dummy_builder, network::*}; + +const LOG_TARGET: &str = "subsystem-bench::availability"; + +use polkadot_node_primitives::{AvailableData, ErasureChunk}; + +use super::{cli::TestObjective, core::mock::AlwaysSupportsParachains}; +use polkadot_node_subsystem_test_helpers::mock::new_block_import_info; +use polkadot_primitives::{ + CandidateHash, CandidateReceipt, GroupIndex, Hash, HeadData, PersistedValidationData, +}; +use polkadot_primitives_test_helpers::{dummy_candidate_receipt, dummy_hash}; +use sc_service::SpawnTaskHandle; + +mod cli; +pub use cli::{DataAvailabilityReadOptions, NetworkEmulation}; + +fn build_overseer( + spawn_task_handle: SpawnTaskHandle, + runtime_api: MockRuntimeApi, + av_store: MockAvailabilityStore, + network_bridge: MockNetworkBridgeTx, + availability_recovery: AvailabilityRecoverySubsystem, +) -> (Overseer, AlwaysSupportsParachains>, OverseerHandle) { + let overseer_connector = OverseerConnector::with_event_capacity(64000); + let dummy = dummy_builder!(spawn_task_handle); + let builder = dummy + .replace_runtime_api(|_| runtime_api) + .replace_availability_store(|_| av_store) + .replace_network_bridge_tx(|_| network_bridge) + .replace_availability_recovery(|_| availability_recovery); + + let (overseer, raw_handle) = + builder.build_with_connector(overseer_connector).expect("Should not fail"); + + (overseer, OverseerHandle::new(raw_handle)) +} + +/// Takes a test configuration and uses it to creates the `TestEnvironment`. +pub fn prepare_test( + config: TestConfiguration, + state: &mut TestState, +) -> (TestEnvironment, ProtocolConfig) { + prepare_test_inner(config, state, TestEnvironmentDependencies::default()) +} + +fn prepare_test_inner( + config: TestConfiguration, + state: &mut TestState, + dependencies: TestEnvironmentDependencies, +) -> (TestEnvironment, ProtocolConfig) { + // Generate test authorities. + let test_authorities = config.generate_authorities(); + + let runtime_api = runtime_api::MockRuntimeApi::new(config.clone(), test_authorities.clone()); + + let av_store = + av_store::MockAvailabilityStore::new(state.chunks.clone(), state.candidate_hashes.clone()); + + let availability_state = NetworkAvailabilityState { + candidate_hashes: state.candidate_hashes.clone(), + available_data: state.available_data.clone(), + chunks: state.chunks.clone(), + }; + + let network = NetworkEmulator::new(&config, &dependencies, &test_authorities); + + let network_bridge_tx = network_bridge::MockNetworkBridgeTx::new( + config.clone(), + availability_state, + network.clone(), + ); + + let use_fast_path = match &state.config().objective { + TestObjective::DataAvailabilityRead(options) => options.fetch_from_backers, + _ => panic!("Unexpected objective"), + }; + + let (collation_req_receiver, req_cfg) = + IncomingRequest::get_config_receiver(&ReqProtocolNames::new(GENESIS_HASH, None)); + + let subsystem = if use_fast_path { + AvailabilityRecoverySubsystem::with_fast_path( + collation_req_receiver, + Metrics::try_register(&dependencies.registry).unwrap(), + ) + } else { + AvailabilityRecoverySubsystem::with_chunks_only( + collation_req_receiver, + Metrics::try_register(&dependencies.registry).unwrap(), + ) + }; + + let (overseer, overseer_handle) = build_overseer( + dependencies.task_manager.spawn_handle(), + runtime_api, + av_store, + network_bridge_tx, + subsystem, + ); + + (TestEnvironment::new(dependencies, config, network, overseer, overseer_handle), req_cfg) +} + +#[derive(Clone)] +pub struct TestState { + // Full test configuration + config: TestConfiguration, + // A cycle iterator on all PoV sizes used in the test. + pov_sizes: Cycle>, + // Generated candidate receipts to be used in the test + candidates: Cycle>, + // Map from pov size to candidate index + pov_size_to_candidate: HashMap, + // Map from generated candidate hashes to candidate index in `available_data` + // and `chunks`. + candidate_hashes: HashMap, + // Per candidate index receipts. + candidate_receipt_templates: Vec, + // Per candidate index `AvailableData` + available_data: Vec, + // Per candiadte index chunks + chunks: Vec>, +} + +impl TestState { + fn config(&self) -> &TestConfiguration { + &self.config + } + + pub fn next_candidate(&mut self) -> Option { + let candidate = self.candidates.next(); + let candidate_hash = candidate.as_ref().unwrap().hash(); + gum::trace!(target: LOG_TARGET, "Next candidate selected {:?}", candidate_hash); + candidate + } + + /// Generate candidates to be used in the test. + fn generate_candidates(&mut self) { + let count = self.config.n_cores * self.config.num_blocks; + gum::info!(target: LOG_TARGET,"{}", format!("Pre-generating {} candidates.", count).bright_blue()); + + // Generate all candidates + self.candidates = (0..count) + .map(|index| { + let pov_size = self.pov_sizes.next().expect("This is a cycle; qed"); + let candidate_index = *self + .pov_size_to_candidate + .get(&pov_size) + .expect("pov_size always exists; qed"); + let mut candidate_receipt = + self.candidate_receipt_templates[candidate_index].clone(); + + // Make it unique. + candidate_receipt.descriptor.relay_parent = Hash::from_low_u64_be(index as u64); + // Store the new candidate in the state + self.candidate_hashes.insert(candidate_receipt.hash(), candidate_index); + + gum::debug!(target: LOG_TARGET, candidate_hash = ?candidate_receipt.hash(), "new candidate"); + + candidate_receipt + }) + .collect::>() + .into_iter() + .cycle(); + } + + pub fn new(config: &TestConfiguration) -> Self { + let config = config.clone(); + + let mut chunks = Vec::new(); + let mut available_data = Vec::new(); + let mut candidate_receipt_templates = Vec::new(); + let mut pov_size_to_candidate = HashMap::new(); + + // we use it for all candidates. + let persisted_validation_data = PersistedValidationData { + parent_head: HeadData(vec![7, 8, 9]), + relay_parent_number: Default::default(), + max_pov_size: 1024, + relay_parent_storage_root: Default::default(), + }; + + // For each unique pov we create a candidate receipt. + for (index, pov_size) in config.pov_sizes().iter().cloned().unique().enumerate() { + gum::info!(target: LOG_TARGET, index, pov_size, "{}", "Generating template candidate".bright_blue()); + + let mut candidate_receipt = dummy_candidate_receipt(dummy_hash()); + let pov = PoV { block_data: BlockData(vec![index as u8; pov_size]) }; + + let new_available_data = AvailableData { + validation_data: persisted_validation_data.clone(), + pov: Arc::new(pov), + }; + + let (new_chunks, erasure_root) = derive_erasure_chunks_with_proofs_and_root( + config.n_validators, + &new_available_data, + |_, _| {}, + ); + + candidate_receipt.descriptor.erasure_root = erasure_root; + + chunks.push(new_chunks); + available_data.push(new_available_data); + pov_size_to_candidate.insert(pov_size, index); + candidate_receipt_templates.push(candidate_receipt); + } + + let pov_sizes = config.pov_sizes().to_owned(); + let pov_sizes = pov_sizes.into_iter().cycle(); + gum::info!(target: LOG_TARGET, "{}","Created test environment.".bright_blue()); + + let mut _self = Self { + config, + available_data, + candidate_receipt_templates, + chunks, + pov_size_to_candidate, + pov_sizes, + candidate_hashes: HashMap::new(), + candidates: Vec::new().into_iter().cycle(), + }; + + _self.generate_candidates(); + _self + } +} + +pub async fn benchmark_availability_read(env: &mut TestEnvironment, mut state: TestState) { + let config = env.config().clone(); + + env.import_block(new_block_import_info(Hash::repeat_byte(1), 1)).await; + + let start_marker = Instant::now(); + let mut batch = FuturesUnordered::new(); + let mut availability_bytes = 0u128; + + env.metrics().set_n_validators(config.n_validators); + env.metrics().set_n_cores(config.n_cores); + + for block_num in 0..env.config().num_blocks { + gum::info!(target: LOG_TARGET, "Current block {}/{}", block_num + 1, env.config().num_blocks); + env.metrics().set_current_block(block_num); + + let block_start_ts = Instant::now(); + for candidate_num in 0..config.n_cores as u64 { + let candidate = + state.next_candidate().expect("We always send up to n_cores*num_blocks; qed"); + let (tx, rx) = oneshot::channel(); + batch.push(rx); + + let message = AllMessages::AvailabilityRecovery( + AvailabilityRecoveryMessage::RecoverAvailableData( + candidate.clone(), + 1, + Some(GroupIndex( + candidate_num as u32 % (std::cmp::max(5, config.n_cores) / 5) as u32, + )), + tx, + ), + ); + env.send_message(message).await; + } + + gum::info!("{}", format!("{} recoveries pending", batch.len()).bright_black()); + while let Some(completed) = batch.next().await { + let available_data = completed.unwrap().unwrap(); + env.metrics().on_pov_size(available_data.encoded_size()); + availability_bytes += available_data.encoded_size() as u128; + } + + let block_time = Instant::now().sub(block_start_ts).as_millis() as u64; + env.metrics().set_block_time(block_time); + gum::info!("All work for block completed in {}", format!("{:?}ms", block_time).cyan()); + } + + let duration: u128 = start_marker.elapsed().as_millis(); + let availability_bytes = availability_bytes / 1024; + gum::info!("All blocks processed in {}", format!("{:?}ms", duration).cyan()); + gum::info!( + "Throughput: {}", + format!("{} KiB/block", availability_bytes / env.config().num_blocks as u128).bright_red() + ); + gum::info!( + "Block time: {}", + format!("{} ms", start_marker.elapsed().as_millis() / env.config().num_blocks as u128) + .red() + ); + + gum::info!("{}", &env); + env.stop().await; +} diff --git a/polkadot/node/subsystem-bench/src/cli.rs b/polkadot/node/subsystem-bench/src/cli.rs new file mode 100644 index 00000000000..3352f33a350 --- /dev/null +++ b/polkadot/node/subsystem-bench/src/cli.rs @@ -0,0 +1,60 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . +use super::availability::DataAvailabilityReadOptions; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize, clap::Parser)] +#[clap(rename_all = "kebab-case")] +#[allow(missing_docs)] +pub struct TestSequenceOptions { + #[clap(short, long, ignore_case = true)] + pub path: String, +} + +/// Define the supported benchmarks targets +#[derive(Debug, Clone, clap::Parser, Serialize, Deserialize)] +#[command(rename_all = "kebab-case")] +pub enum TestObjective { + /// Benchmark availability recovery strategies. + DataAvailabilityRead(DataAvailabilityReadOptions), + /// Run a test sequence specified in a file + TestSequence(TestSequenceOptions), +} + +#[derive(Debug, clap::Parser)] +#[clap(rename_all = "kebab-case")] +#[allow(missing_docs)] +pub struct StandardTestOptions { + #[clap(long, ignore_case = true, default_value_t = 100)] + /// Number of cores to fetch availability for. + pub n_cores: usize, + + #[clap(long, ignore_case = true, default_value_t = 500)] + /// Number of validators to fetch chunks from. + pub n_validators: usize, + + #[clap(long, ignore_case = true, default_value_t = 5120)] + /// The minimum pov size in KiB + pub min_pov_size: usize, + + #[clap(long, ignore_case = true, default_value_t = 5120)] + /// The maximum pov size bytes + pub max_pov_size: usize, + + #[clap(short, long, ignore_case = true, default_value_t = 1)] + /// The number of blocks the test is going to run. + pub num_blocks: usize, +} diff --git a/polkadot/node/subsystem-bench/src/core/configuration.rs b/polkadot/node/subsystem-bench/src/core/configuration.rs new file mode 100644 index 00000000000..164addb5190 --- /dev/null +++ b/polkadot/node/subsystem-bench/src/core/configuration.rs @@ -0,0 +1,262 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . +// +//! Test configuration definition and helpers. +use super::*; +use keyring::Keyring; +use std::{path::Path, time::Duration}; + +pub use crate::cli::TestObjective; +use polkadot_primitives::{AuthorityDiscoveryId, ValidatorId}; +use rand::{distributions::Uniform, prelude::Distribution, thread_rng}; +use serde::{Deserialize, Serialize}; + +pub fn random_pov_size(min_pov_size: usize, max_pov_size: usize) -> usize { + random_uniform_sample(min_pov_size, max_pov_size) +} + +fn random_uniform_sample + From>(min_value: T, max_value: T) -> T { + Uniform::from(min_value.into()..=max_value.into()) + .sample(&mut thread_rng()) + .into() +} + +/// Peer response latency configuration. +#[derive(Clone, Debug, Default, Serialize, Deserialize)] +pub struct PeerLatency { + /// Min latency for `NetworkAction` completion. + pub min_latency: Duration, + /// Max latency or `NetworkAction` completion. + pub max_latency: Duration, +} + +// Default PoV size in KiB. +fn default_pov_size() -> usize { + 5120 +} + +// Default bandwidth in bytes +fn default_bandwidth() -> usize { + 52428800 +} + +// Default connectivity percentage +fn default_connectivity() -> usize { + 100 +} + +/// The test input parameters +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct TestConfiguration { + /// The test objective + pub objective: TestObjective, + /// Number of validators + pub n_validators: usize, + /// Number of cores + pub n_cores: usize, + /// The min PoV size + #[serde(default = "default_pov_size")] + pub min_pov_size: usize, + /// The max PoV size, + #[serde(default = "default_pov_size")] + pub max_pov_size: usize, + /// Randomly sampled pov_sizes + #[serde(skip)] + pov_sizes: Vec, + /// The amount of bandiwdth remote validators have. + #[serde(default = "default_bandwidth")] + pub peer_bandwidth: usize, + /// The amount of bandiwdth our node has. + #[serde(default = "default_bandwidth")] + pub bandwidth: usize, + /// Optional peer emulation latency + #[serde(default)] + pub latency: Option, + /// Error probability, applies to sending messages to the emulated network peers + #[serde(default)] + pub error: usize, + /// Connectivity ratio, the percentage of peers we are not connected to, but ar part of + /// the topology. + #[serde(default = "default_connectivity")] + pub connectivity: usize, + /// Number of blocks to run the test for + pub num_blocks: usize, +} + +fn generate_pov_sizes(count: usize, min_kib: usize, max_kib: usize) -> Vec { + (0..count).map(|_| random_pov_size(min_kib * 1024, max_kib * 1024)).collect() +} + +#[derive(Serialize, Deserialize)] +pub struct TestSequence { + #[serde(rename(serialize = "TestConfiguration", deserialize = "TestConfiguration"))] + test_configurations: Vec, +} + +impl TestSequence { + pub fn into_vec(self) -> Vec { + self.test_configurations + .into_iter() + .map(|mut config| { + config.pov_sizes = + generate_pov_sizes(config.n_cores, config.min_pov_size, config.max_pov_size); + config + }) + .collect() + } +} + +impl TestSequence { + pub fn new_from_file(path: &Path) -> std::io::Result { + let string = String::from_utf8(std::fs::read(path)?).expect("File is valid UTF8"); + Ok(serde_yaml::from_str(&string).expect("File is valid test sequence YA")) + } +} + +/// Helper struct for authority related state. +#[derive(Clone)] +pub struct TestAuthorities { + pub keyrings: Vec, + pub validator_public: Vec, + pub validator_authority_id: Vec, +} + +impl TestConfiguration { + #[allow(unused)] + pub fn write_to_disk(&self) { + // Serialize a slice of configurations + let yaml = serde_yaml::to_string(&TestSequence { test_configurations: vec![self.clone()] }) + .unwrap(); + std::fs::write("last_test.yaml", yaml).unwrap(); + } + + pub fn pov_sizes(&self) -> &[usize] { + &self.pov_sizes + } + + /// Generates the authority keys we need for the network emulation. + pub fn generate_authorities(&self) -> TestAuthorities { + let keyrings = (0..self.n_validators) + .map(|peer_index| Keyring::new(format!("Node{}", peer_index))) + .collect::>(); + + // Generate `AuthorityDiscoveryId`` for each peer + let validator_public: Vec = keyrings + .iter() + .map(|keyring: &Keyring| keyring.clone().public().into()) + .collect::>(); + + let validator_authority_id: Vec = keyrings + .iter() + .map(|keyring| keyring.clone().public().into()) + .collect::>(); + + TestAuthorities { keyrings, validator_public, validator_authority_id } + } + + /// An unconstrained standard configuration matching Polkadot/Kusama + pub fn ideal_network( + objective: TestObjective, + num_blocks: usize, + n_validators: usize, + n_cores: usize, + min_pov_size: usize, + max_pov_size: usize, + ) -> TestConfiguration { + Self { + objective, + n_cores, + n_validators, + pov_sizes: generate_pov_sizes(n_cores, min_pov_size, max_pov_size), + bandwidth: 50 * 1024 * 1024, + peer_bandwidth: 50 * 1024 * 1024, + // No latency + latency: None, + error: 0, + num_blocks, + min_pov_size, + max_pov_size, + connectivity: 100, + } + } + + pub fn healthy_network( + objective: TestObjective, + num_blocks: usize, + n_validators: usize, + n_cores: usize, + min_pov_size: usize, + max_pov_size: usize, + ) -> TestConfiguration { + Self { + objective, + n_cores, + n_validators, + pov_sizes: generate_pov_sizes(n_cores, min_pov_size, max_pov_size), + bandwidth: 50 * 1024 * 1024, + peer_bandwidth: 50 * 1024 * 1024, + latency: Some(PeerLatency { + min_latency: Duration::from_millis(1), + max_latency: Duration::from_millis(100), + }), + error: 3, + num_blocks, + min_pov_size, + max_pov_size, + connectivity: 95, + } + } + + pub fn degraded_network( + objective: TestObjective, + num_blocks: usize, + n_validators: usize, + n_cores: usize, + min_pov_size: usize, + max_pov_size: usize, + ) -> TestConfiguration { + Self { + objective, + n_cores, + n_validators, + pov_sizes: generate_pov_sizes(n_cores, min_pov_size, max_pov_size), + bandwidth: 50 * 1024 * 1024, + peer_bandwidth: 50 * 1024 * 1024, + latency: Some(PeerLatency { + min_latency: Duration::from_millis(10), + max_latency: Duration::from_millis(500), + }), + error: 33, + num_blocks, + min_pov_size, + max_pov_size, + connectivity: 67, + } + } +} + +/// Produce a randomized duration between `min` and `max`. +pub fn random_latency(maybe_peer_latency: Option<&PeerLatency>) -> Option { + maybe_peer_latency.map(|peer_latency| { + Uniform::from(peer_latency.min_latency..=peer_latency.max_latency).sample(&mut thread_rng()) + }) +} + +/// Generate a random error based on `probability`. +/// `probability` should be a number between 0 and 100. +pub fn random_error(probability: usize) -> bool { + Uniform::from(0..=99).sample(&mut thread_rng()) < probability +} diff --git a/polkadot/node/subsystem-bench/src/core/display.rs b/polkadot/node/subsystem-bench/src/core/display.rs new file mode 100644 index 00000000000..d600cc484c1 --- /dev/null +++ b/polkadot/node/subsystem-bench/src/core/display.rs @@ -0,0 +1,191 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . +// +//! Display implementations and helper methods for parsing prometheus metrics +//! to a format that can be displayed in the CLI. +//! +//! Currently histogram buckets are skipped. +use super::{configuration::TestConfiguration, LOG_TARGET}; +use colored::Colorize; +use prometheus::{ + proto::{MetricFamily, MetricType}, + Registry, +}; +use std::fmt::Display; + +#[derive(Default)] +pub struct MetricCollection(Vec); + +impl From> for MetricCollection { + fn from(metrics: Vec) -> Self { + MetricCollection(metrics) + } +} + +impl MetricCollection { + pub fn all(&self) -> &Vec { + &self.0 + } + + /// Sums up all metrics with the given name in the collection + pub fn sum_by(&self, name: &str) -> f64 { + self.all() + .iter() + .filter(|metric| metric.name == name) + .map(|metric| metric.value) + .sum() + } + + pub fn subset_with_label_value(&self, label_name: &str, label_value: &str) -> MetricCollection { + self.0 + .iter() + .filter_map(|metric| { + if let Some(index) = metric.label_names.iter().position(|label| label == label_name) + { + if Some(&String::from(label_value)) == metric.label_values.get(index) { + Some(metric.clone()) + } else { + None + } + } else { + None + } + }) + .collect::>() + .into() + } +} + +impl Display for MetricCollection { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + writeln!(f)?; + let metrics = self.all(); + for metric in metrics { + writeln!(f, "{}", metric)?; + } + Ok(()) + } +} +#[derive(Debug, Clone)] +pub struct TestMetric { + name: String, + label_names: Vec, + label_values: Vec, + value: f64, +} + +impl Display for TestMetric { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "({} = {}) [{:?}, {:?}]", + self.name.cyan(), + format!("{}", self.value).white(), + self.label_names, + self.label_values + ) + } +} + +// Returns `false` if metric should be skipped. +fn check_metric_family(mf: &MetricFamily) -> bool { + if mf.get_metric().is_empty() { + gum::error!(target: LOG_TARGET, "MetricFamily has no metrics: {:?}", mf); + return false + } + if mf.get_name().is_empty() { + gum::error!(target: LOG_TARGET, "MetricFamily has no name: {:?}", mf); + return false + } + + true +} + +pub fn parse_metrics(registry: &Registry) -> MetricCollection { + let metric_families = registry.gather(); + let mut test_metrics = Vec::new(); + for mf in metric_families { + if !check_metric_family(&mf) { + continue + } + + let name: String = mf.get_name().into(); + let metric_type = mf.get_field_type(); + for m in mf.get_metric() { + let (label_names, label_values): (Vec, Vec) = m + .get_label() + .iter() + .map(|pair| (String::from(pair.get_name()), String::from(pair.get_value()))) + .unzip(); + + match metric_type { + MetricType::COUNTER => { + test_metrics.push(TestMetric { + name: name.clone(), + label_names, + label_values, + value: m.get_counter().get_value(), + }); + }, + MetricType::GAUGE => { + test_metrics.push(TestMetric { + name: name.clone(), + label_names, + label_values, + value: m.get_gauge().get_value(), + }); + }, + MetricType::HISTOGRAM => { + let h = m.get_histogram(); + let h_name = name.clone() + "_sum"; + test_metrics.push(TestMetric { + name: h_name, + label_names: label_names.clone(), + label_values: label_values.clone(), + value: h.get_sample_sum(), + }); + + let h_name = name.clone() + "_count"; + test_metrics.push(TestMetric { + name: h_name, + label_names, + label_values, + value: h.get_sample_sum(), + }); + }, + MetricType::SUMMARY => { + unimplemented!(); + }, + MetricType::UNTYPED => { + unimplemented!(); + }, + } + } + } + test_metrics.into() +} + +pub fn display_configuration(test_config: &TestConfiguration) { + gum::info!( + "{}, {}, {}, {}, {}", + format!("n_validators = {}", test_config.n_validators).blue(), + format!("n_cores = {}", test_config.n_cores).blue(), + format!("pov_size = {} - {}", test_config.min_pov_size, test_config.max_pov_size) + .bright_black(), + format!("error = {}", test_config.error).bright_black(), + format!("latency = {:?}", test_config.latency).bright_black(), + ); +} diff --git a/polkadot/node/subsystem-bench/src/core/environment.rs b/polkadot/node/subsystem-bench/src/core/environment.rs new file mode 100644 index 00000000000..24759647407 --- /dev/null +++ b/polkadot/node/subsystem-bench/src/core/environment.rs @@ -0,0 +1,333 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . +//! Test environment implementation +use crate::{ + core::{mock::AlwaysSupportsParachains, network::NetworkEmulator}, + TestConfiguration, +}; +use colored::Colorize; +use core::time::Duration; +use futures::FutureExt; +use polkadot_overseer::{BlockInfo, Handle as OverseerHandle}; + +use polkadot_node_subsystem::{messages::AllMessages, Overseer, SpawnGlue, TimeoutExt}; +use polkadot_node_subsystem_types::Hash; +use polkadot_node_subsystem_util::metrics::prometheus::{ + self, Gauge, Histogram, PrometheusError, Registry, U64, +}; + +use sc_network::peer_store::LOG_TARGET; +use sc_service::{SpawnTaskHandle, TaskManager}; +use std::{ + fmt::Display, + net::{Ipv4Addr, SocketAddr}, +}; +use tokio::runtime::Handle; + +const MIB: f64 = 1024.0 * 1024.0; + +/// Test environment/configuration metrics +#[derive(Clone)] +pub struct TestEnvironmentMetrics { + /// Number of bytes sent per peer. + n_validators: Gauge, + /// Number of received sent per peer. + n_cores: Gauge, + /// PoV size + pov_size: Histogram, + /// Current block + current_block: Gauge, + /// Current block + block_time: Gauge, +} + +impl TestEnvironmentMetrics { + pub fn new(registry: &Registry) -> Result { + let mut buckets = prometheus::exponential_buckets(16384.0, 2.0, 9) + .expect("arguments are always valid; qed"); + buckets.extend(vec![5.0 * MIB, 6.0 * MIB, 7.0 * MIB, 8.0 * MIB, 9.0 * MIB, 10.0 * MIB]); + + Ok(Self { + n_validators: prometheus::register( + Gauge::new( + "subsystem_benchmark_n_validators", + "Total number of validators in the test", + )?, + registry, + )?, + n_cores: prometheus::register( + Gauge::new( + "subsystem_benchmark_n_cores", + "Number of cores we fetch availability for each block", + )?, + registry, + )?, + current_block: prometheus::register( + Gauge::new("subsystem_benchmark_current_block", "The current test block")?, + registry, + )?, + block_time: prometheus::register( + Gauge::new("subsystem_benchmark_block_time", "The time it takes for the target subsystems(s) to complete all the requests in a block")?, + registry, + )?, + pov_size: prometheus::register( + Histogram::with_opts( + prometheus::HistogramOpts::new( + "subsystem_benchmark_pov_size", + "The compressed size of the proof of validity of a candidate", + ) + .buckets(buckets), + )?, + registry, + )?, + }) + } + + pub fn set_n_validators(&self, n_validators: usize) { + self.n_validators.set(n_validators as u64); + } + + pub fn set_n_cores(&self, n_cores: usize) { + self.n_cores.set(n_cores as u64); + } + + pub fn set_current_block(&self, current_block: usize) { + self.current_block.set(current_block as u64); + } + + pub fn set_block_time(&self, block_time_ms: u64) { + self.block_time.set(block_time_ms); + } + + pub fn on_pov_size(&self, pov_size: usize) { + self.pov_size.observe(pov_size as f64); + } +} + +fn new_runtime() -> tokio::runtime::Runtime { + tokio::runtime::Builder::new_multi_thread() + .thread_name("subsystem-bench") + .enable_all() + .thread_stack_size(3 * 1024 * 1024) + .build() + .unwrap() +} + +/// Wrapper for dependencies +pub struct TestEnvironmentDependencies { + pub registry: Registry, + pub task_manager: TaskManager, + pub runtime: tokio::runtime::Runtime, +} + +impl Default for TestEnvironmentDependencies { + fn default() -> Self { + let runtime = new_runtime(); + let registry = Registry::new(); + let task_manager: TaskManager = + TaskManager::new(runtime.handle().clone(), Some(®istry)).unwrap(); + + Self { runtime, registry, task_manager } + } +} + +// A dummy genesis hash +pub const GENESIS_HASH: Hash = Hash::repeat_byte(0xff); + +// We use this to bail out sending messages to the subsystem if it is overloaded such that +// the time of flight is breaches 5s. +// This should eventually be a test parameter. +const MAX_TIME_OF_FLIGHT: Duration = Duration::from_millis(5000); + +/// The test environment is the high level wrapper of all things required to test +/// a certain subsystem. +/// +/// ## Mockups +/// The overseer is passed in during construction and it can host an arbitrary number of +/// real subsystems instances and the corresponding mocked instances such that the real +/// subsystems can get their messages answered. +/// +/// As the subsystem's performance depends on network connectivity, the test environment +/// emulates validator nodes on the network, see `NetworkEmulator`. The network emulation +/// is configurable in terms of peer bandwidth, latency and connection error rate using +/// uniform distribution sampling. +/// +/// +/// ## Usage +/// `TestEnvironment` is used in tests to send `Overseer` messages or signals to the subsystem +/// under test. +/// +/// ## Collecting test metrics +/// +/// ### Prometheus +/// A prometheus endpoint is exposed while the test is running. A local Prometheus instance +/// can scrape it every 1s and a Grafana dashboard is the preferred way of visualizing +/// the performance characteristics of the subsystem. +/// +/// ### CLI +/// A subset of the Prometheus metrics are printed at the end of the test. +pub struct TestEnvironment { + /// Test dependencies + dependencies: TestEnvironmentDependencies, + /// A runtime handle + runtime_handle: tokio::runtime::Handle, + /// A handle to the lovely overseer + overseer_handle: OverseerHandle, + /// The test configuration. + config: TestConfiguration, + /// A handle to the network emulator. + network: NetworkEmulator, + /// Configuration/env metrics + metrics: TestEnvironmentMetrics, +} + +impl TestEnvironment { + /// Create a new test environment + pub fn new( + dependencies: TestEnvironmentDependencies, + config: TestConfiguration, + network: NetworkEmulator, + overseer: Overseer, AlwaysSupportsParachains>, + overseer_handle: OverseerHandle, + ) -> Self { + let metrics = TestEnvironmentMetrics::new(&dependencies.registry) + .expect("Metrics need to be registered"); + + let spawn_handle = dependencies.task_manager.spawn_handle(); + spawn_handle.spawn_blocking("overseer", "overseer", overseer.run().boxed()); + + let registry_clone = dependencies.registry.clone(); + dependencies.task_manager.spawn_handle().spawn_blocking( + "prometheus", + "test-environment", + async move { + prometheus_endpoint::init_prometheus( + SocketAddr::new(std::net::IpAddr::V4(Ipv4Addr::LOCALHOST), 9999), + registry_clone, + ) + .await + .unwrap(); + }, + ); + + TestEnvironment { + runtime_handle: dependencies.runtime.handle().clone(), + dependencies, + overseer_handle, + config, + network, + metrics, + } + } + + pub fn config(&self) -> &TestConfiguration { + &self.config + } + + pub fn network(&self) -> &NetworkEmulator { + &self.network + } + + pub fn registry(&self) -> &Registry { + &self.dependencies.registry + } + + pub fn metrics(&self) -> &TestEnvironmentMetrics { + &self.metrics + } + + pub fn runtime(&self) -> Handle { + self.runtime_handle.clone() + } + + // Send a message to the subsystem under test environment. + pub async fn send_message(&mut self, msg: AllMessages) { + self.overseer_handle + .send_msg(msg, LOG_TARGET) + .timeout(MAX_TIME_OF_FLIGHT) + .await + .unwrap_or_else(|| { + panic!("{}ms maximum time of flight breached", MAX_TIME_OF_FLIGHT.as_millis()) + }); + } + + // Send an `ActiveLeavesUpdate` signal to all subsystems under test. + pub async fn import_block(&mut self, block: BlockInfo) { + self.overseer_handle + .block_imported(block) + .timeout(MAX_TIME_OF_FLIGHT) + .await + .unwrap_or_else(|| { + panic!("{}ms maximum time of flight breached", MAX_TIME_OF_FLIGHT.as_millis()) + }); + } + + // Stop overseer and subsystems. + pub async fn stop(&mut self) { + self.overseer_handle.stop().await; + } +} + +impl Display for TestEnvironment { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let stats = self.network().stats(); + + writeln!(f, "\n")?; + writeln!( + f, + "Total received from network: {}", + format!( + "{} MiB", + stats + .iter() + .enumerate() + .map(|(_index, stats)| stats.tx_bytes_total as u128) + .sum::() / (1024 * 1024) + ) + .cyan() + )?; + writeln!( + f, + "Total sent to network: {}", + format!("{} KiB", stats[0].tx_bytes_total / (1024)).cyan() + )?; + + let test_metrics = super::display::parse_metrics(self.registry()); + let subsystem_cpu_metrics = + test_metrics.subset_with_label_value("task_group", "availability-recovery"); + let total_cpu = subsystem_cpu_metrics.sum_by("substrate_tasks_polling_duration_sum"); + writeln!(f, "Total subsystem CPU usage {}", format!("{:.2}s", total_cpu).bright_purple())?; + writeln!( + f, + "CPU usage per block {}", + format!("{:.2}s", total_cpu / self.config().num_blocks as f64).bright_purple() + )?; + + let test_env_cpu_metrics = + test_metrics.subset_with_label_value("task_group", "test-environment"); + let total_cpu = test_env_cpu_metrics.sum_by("substrate_tasks_polling_duration_sum"); + writeln!( + f, + "Total test environment CPU usage {}", + format!("{:.2}s", total_cpu).bright_purple() + )?; + writeln!( + f, + "CPU usage per block {}", + format!("{:.2}s", total_cpu / self.config().num_blocks as f64).bright_purple() + ) + } +} diff --git a/polkadot/node/subsystem-bench/src/core/keyring.rs b/polkadot/node/subsystem-bench/src/core/keyring.rs new file mode 100644 index 00000000000..2d9aa348a92 --- /dev/null +++ b/polkadot/node/subsystem-bench/src/core/keyring.rs @@ -0,0 +1,40 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +pub use sp_core::sr25519; +use sp_core::{ + sr25519::{Pair, Public}, + Pair as PairT, +}; +/// Set of test accounts. +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct Keyring { + name: String, +} + +impl Keyring { + pub fn new(name: String) -> Keyring { + Self { name } + } + + pub fn pair(self) -> Pair { + Pair::from_string(&format!("//{}", self.name), None).expect("input is always good; qed") + } + + pub fn public(self) -> Public { + self.pair().public() + } +} diff --git a/polkadot/node/subsystem-bench/src/core/mock/av_store.rs b/polkadot/node/subsystem-bench/src/core/mock/av_store.rs new file mode 100644 index 00000000000..a471230f1b3 --- /dev/null +++ b/polkadot/node/subsystem-bench/src/core/mock/av_store.rs @@ -0,0 +1,137 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . +//! +//! A generic av store subsystem mockup suitable to be used in benchmarks. + +use parity_scale_codec::Encode; +use polkadot_primitives::CandidateHash; + +use std::collections::HashMap; + +use futures::{channel::oneshot, FutureExt}; + +use polkadot_node_primitives::ErasureChunk; + +use polkadot_node_subsystem::{ + messages::AvailabilityStoreMessage, overseer, SpawnedSubsystem, SubsystemError, +}; + +use polkadot_node_subsystem_types::OverseerSignal; + +pub struct AvailabilityStoreState { + candidate_hashes: HashMap, + chunks: Vec>, +} + +const LOG_TARGET: &str = "subsystem-bench::av-store-mock"; + +/// A mock of the availability store subsystem. This one also generates all the +/// candidates that a +pub struct MockAvailabilityStore { + state: AvailabilityStoreState, +} + +impl MockAvailabilityStore { + pub fn new( + chunks: Vec>, + candidate_hashes: HashMap, + ) -> MockAvailabilityStore { + Self { state: AvailabilityStoreState { chunks, candidate_hashes } } + } + + async fn respond_to_query_all_request( + &self, + candidate_hash: CandidateHash, + send_chunk: impl Fn(usize) -> bool, + tx: oneshot::Sender>, + ) { + let candidate_index = self + .state + .candidate_hashes + .get(&candidate_hash) + .expect("candidate was generated previously; qed"); + gum::debug!(target: LOG_TARGET, ?candidate_hash, candidate_index, "Candidate mapped to index"); + + let v = self + .state + .chunks + .get(*candidate_index) + .unwrap() + .iter() + .filter(|c| send_chunk(c.index.0 as usize)) + .cloned() + .collect(); + + let _ = tx.send(v); + } +} + +#[overseer::subsystem(AvailabilityStore, error=SubsystemError, prefix=self::overseer)] +impl MockAvailabilityStore { + fn start(self, ctx: Context) -> SpawnedSubsystem { + let future = self.run(ctx).map(|_| Ok(())).boxed(); + + SpawnedSubsystem { name: "test-environment", future } + } +} + +#[overseer::contextbounds(AvailabilityStore, prefix = self::overseer)] +impl MockAvailabilityStore { + async fn run(self, mut ctx: Context) { + gum::debug!(target: LOG_TARGET, "Subsystem running"); + loop { + let msg = ctx.recv().await.expect("Overseer never fails us"); + + match msg { + orchestra::FromOrchestra::Signal(signal) => + if signal == OverseerSignal::Conclude { + return + }, + orchestra::FromOrchestra::Communication { msg } => match msg { + AvailabilityStoreMessage::QueryAvailableData(candidate_hash, tx) => { + gum::debug!(target: LOG_TARGET, candidate_hash = ?candidate_hash, "Responding to QueryAvailableData"); + + // We never have the full available data. + let _ = tx.send(None); + }, + AvailabilityStoreMessage::QueryAllChunks(candidate_hash, tx) => { + // We always have our own chunk. + gum::debug!(target: LOG_TARGET, candidate_hash = ?candidate_hash, "Responding to QueryAllChunks"); + self.respond_to_query_all_request(candidate_hash, |index| index == 0, tx) + .await; + }, + AvailabilityStoreMessage::QueryChunkSize(candidate_hash, tx) => { + gum::debug!(target: LOG_TARGET, candidate_hash = ?candidate_hash, "Responding to QueryChunkSize"); + + let candidate_index = self + .state + .candidate_hashes + .get(&candidate_hash) + .expect("candidate was generated previously; qed"); + gum::debug!(target: LOG_TARGET, ?candidate_hash, candidate_index, "Candidate mapped to index"); + + let chunk_size = + self.state.chunks.get(*candidate_index).unwrap()[0].encoded_size(); + let _ = tx.send(Some(chunk_size)); + }, + _ => { + unimplemented!("Unexpected av-store message") + }, + }, + } + } + } +} diff --git a/polkadot/node/subsystem-bench/src/core/mock/dummy.rs b/polkadot/node/subsystem-bench/src/core/mock/dummy.rs new file mode 100644 index 00000000000..0628368a49c --- /dev/null +++ b/polkadot/node/subsystem-bench/src/core/mock/dummy.rs @@ -0,0 +1,98 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . +//! Dummy subsystem mocks. +use paste::paste; + +use futures::FutureExt; +use polkadot_node_subsystem::{overseer, SpawnedSubsystem, SubsystemError}; +use std::time::Duration; +use tokio::time::sleep; + +const LOG_TARGET: &str = "subsystem-bench::mockery"; + +macro_rules! mock { + // Just query by relay parent + ($subsystem_name:ident) => { + paste! { + pub struct [] {} + #[overseer::subsystem($subsystem_name, error=SubsystemError, prefix=self::overseer)] + impl [] { + fn start(self, ctx: Context) -> SpawnedSubsystem { + let future = self.run(ctx).map(|_| Ok(())).boxed(); + + // The name will appear in substrate CPU task metrics as `task_group`.` + SpawnedSubsystem { name: "test-environment", future } + } + } + + #[overseer::contextbounds($subsystem_name, prefix = self::overseer)] + impl [] { + async fn run(self, mut ctx: Context) { + let mut count_total_msg = 0; + loop { + futures::select!{ + msg = ctx.recv().fuse() => { + match msg.unwrap() { + orchestra::FromOrchestra::Signal(signal) => { + match signal { + polkadot_node_subsystem_types::OverseerSignal::Conclude => {return}, + _ => {} + } + }, + orchestra::FromOrchestra::Communication { msg } => { + gum::debug!(target: LOG_TARGET, msg = ?msg, "mocked subsystem received message"); + } + } + + count_total_msg +=1; + } + _ = sleep(Duration::from_secs(6)).fuse() => { + if count_total_msg > 0 { + gum::trace!(target: LOG_TARGET, "Subsystem {} processed {} messages since last time", stringify!($subsystem_name), count_total_msg); + } + count_total_msg = 0; + } + } + } + } + } + } + }; +} + +mock!(AvailabilityStore); +mock!(StatementDistribution); +mock!(BitfieldSigning); +mock!(BitfieldDistribution); +mock!(Provisioner); +mock!(NetworkBridgeRx); +mock!(CollationGeneration); +mock!(CollatorProtocol); +mock!(GossipSupport); +mock!(DisputeDistribution); +mock!(DisputeCoordinator); +mock!(ProspectiveParachains); +mock!(PvfChecker); +mock!(CandidateBacking); +mock!(AvailabilityDistribution); +mock!(CandidateValidation); +mock!(AvailabilityRecovery); +mock!(NetworkBridgeTx); +mock!(ChainApi); +mock!(ChainSelection); +mock!(ApprovalVoting); +mock!(ApprovalDistribution); +mock!(RuntimeApi); diff --git a/polkadot/node/subsystem-bench/src/core/mock/mod.rs b/polkadot/node/subsystem-bench/src/core/mock/mod.rs new file mode 100644 index 00000000000..d59642e9605 --- /dev/null +++ b/polkadot/node/subsystem-bench/src/core/mock/mod.rs @@ -0,0 +1,77 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +use polkadot_node_subsystem::HeadSupportsParachains; +use polkadot_node_subsystem_types::Hash; + +pub mod av_store; +pub mod dummy; +pub mod network_bridge; +pub mod runtime_api; + +pub use av_store::*; +pub use network_bridge::*; +pub use runtime_api::*; + +pub struct AlwaysSupportsParachains {} +#[async_trait::async_trait] +impl HeadSupportsParachains for AlwaysSupportsParachains { + async fn head_supports_parachains(&self, _head: &Hash) -> bool { + true + } +} + +// An orchestra with dummy subsystems +macro_rules! dummy_builder { + ($spawn_task_handle: ident) => {{ + use super::core::mock::dummy::*; + + // Initialize a mock overseer. + // All subsystem except approval_voting and approval_distribution are mock subsystems. + Overseer::builder() + .approval_voting(MockApprovalVoting {}) + .approval_distribution(MockApprovalDistribution {}) + .availability_recovery(MockAvailabilityRecovery {}) + .candidate_validation(MockCandidateValidation {}) + .chain_api(MockChainApi {}) + .chain_selection(MockChainSelection {}) + .dispute_coordinator(MockDisputeCoordinator {}) + .runtime_api(MockRuntimeApi {}) + .network_bridge_tx(MockNetworkBridgeTx {}) + .availability_distribution(MockAvailabilityDistribution {}) + .availability_store(MockAvailabilityStore {}) + .pvf_checker(MockPvfChecker {}) + .candidate_backing(MockCandidateBacking {}) + .statement_distribution(MockStatementDistribution {}) + .bitfield_signing(MockBitfieldSigning {}) + .bitfield_distribution(MockBitfieldDistribution {}) + .provisioner(MockProvisioner {}) + .network_bridge_rx(MockNetworkBridgeRx {}) + .collation_generation(MockCollationGeneration {}) + .collator_protocol(MockCollatorProtocol {}) + .gossip_support(MockGossipSupport {}) + .dispute_distribution(MockDisputeDistribution {}) + .prospective_parachains(MockProspectiveParachains {}) + .activation_external_listeners(Default::default()) + .span_per_active_leaf(Default::default()) + .active_leaves(Default::default()) + .metrics(Default::default()) + .supports_parachains(AlwaysSupportsParachains {}) + .spawner(SpawnGlue($spawn_task_handle)) + }}; +} + +pub(crate) use dummy_builder; diff --git a/polkadot/node/subsystem-bench/src/core/mock/network_bridge.rs b/polkadot/node/subsystem-bench/src/core/mock/network_bridge.rs new file mode 100644 index 00000000000..b106b832011 --- /dev/null +++ b/polkadot/node/subsystem-bench/src/core/mock/network_bridge.rs @@ -0,0 +1,323 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . +//! +//! A generic av store subsystem mockup suitable to be used in benchmarks. + +use futures::Future; +use parity_scale_codec::Encode; +use polkadot_node_subsystem_types::OverseerSignal; +use std::{collections::HashMap, pin::Pin}; + +use futures::FutureExt; + +use polkadot_node_primitives::{AvailableData, ErasureChunk}; + +use polkadot_primitives::CandidateHash; +use sc_network::{OutboundFailure, RequestFailure}; + +use polkadot_node_subsystem::{ + messages::NetworkBridgeTxMessage, overseer, SpawnedSubsystem, SubsystemError, +}; + +use polkadot_node_network_protocol::request_response::{ + self as req_res, v1::ChunkResponse, Requests, +}; +use polkadot_primitives::AuthorityDiscoveryId; + +use crate::core::{ + configuration::{random_error, random_latency, TestConfiguration}, + network::{NetworkAction, NetworkEmulator, RateLimit}, +}; + +/// The availability store state of all emulated peers. +/// The network bridge tx mock will respond to requests as if the request is being serviced +/// by a remote peer on the network +pub struct NetworkAvailabilityState { + pub candidate_hashes: HashMap, + pub available_data: Vec, + pub chunks: Vec>, +} + +const LOG_TARGET: &str = "subsystem-bench::network-bridge-tx-mock"; + +/// A mock of the network bridge tx subsystem. +pub struct MockNetworkBridgeTx { + /// The test configurationg + config: TestConfiguration, + /// The network availability state + availabilty: NetworkAvailabilityState, + /// A network emulator instance + network: NetworkEmulator, +} + +impl MockNetworkBridgeTx { + pub fn new( + config: TestConfiguration, + availabilty: NetworkAvailabilityState, + network: NetworkEmulator, + ) -> MockNetworkBridgeTx { + Self { config, availabilty, network } + } + + fn not_connected_response( + &self, + authority_discovery_id: &AuthorityDiscoveryId, + future: Pin + Send>>, + ) -> NetworkAction { + // The network action will send the error after a random delay expires. + return NetworkAction::new( + authority_discovery_id.clone(), + future, + 0, + // Generate a random latency based on configuration. + random_latency(self.config.latency.as_ref()), + ) + } + /// Returns an `NetworkAction` corresponding to the peer sending the response. If + /// the peer is connected, the error is sent with a randomized latency as defined in + /// configuration. + fn respond_to_send_request( + &mut self, + request: Requests, + ingress_tx: &mut tokio::sync::mpsc::UnboundedSender, + ) -> NetworkAction { + let ingress_tx = ingress_tx.clone(); + + match request { + Requests::ChunkFetchingV1(outgoing_request) => { + let authority_discovery_id = match outgoing_request.peer { + req_res::Recipient::Authority(authority_discovery_id) => authority_discovery_id, + _ => unimplemented!("Peer recipient not supported yet"), + }; + // Account our sent request bytes. + self.network.peer_stats(0).inc_sent(outgoing_request.payload.encoded_size()); + + // If peer is disconnected return an error + if !self.network.is_peer_connected(&authority_discovery_id) { + // We always send `NotConnected` error and we ignore `IfDisconnected` value in + // the caller. + let future = async move { + let _ = outgoing_request + .pending_response + .send(Err(RequestFailure::NotConnected)); + } + .boxed(); + return self.not_connected_response(&authority_discovery_id, future) + } + + // Account for remote received request bytes. + self.network + .peer_stats_by_id(&authority_discovery_id) + .inc_received(outgoing_request.payload.encoded_size()); + + let validator_index: usize = outgoing_request.payload.index.0 as usize; + let candidate_hash = outgoing_request.payload.candidate_hash; + + let candidate_index = self + .availabilty + .candidate_hashes + .get(&candidate_hash) + .expect("candidate was generated previously; qed"); + gum::warn!(target: LOG_TARGET, ?candidate_hash, candidate_index, "Candidate mapped to index"); + + let chunk: ChunkResponse = self.availabilty.chunks.get(*candidate_index).unwrap() + [validator_index] + .clone() + .into(); + let mut size = chunk.encoded_size(); + + let response = if random_error(self.config.error) { + // Error will not account to any bandwidth used. + size = 0; + Err(RequestFailure::Network(OutboundFailure::ConnectionClosed)) + } else { + Ok(req_res::v1::ChunkFetchingResponse::from(Some(chunk)).encode()) + }; + + let authority_discovery_id_clone = authority_discovery_id.clone(); + + let future = async move { + let _ = outgoing_request.pending_response.send(response); + } + .boxed(); + + let future_wrapper = async move { + // Forward the response to the ingress channel of our node. + // On receive side we apply our node receiving rate limit. + let action = + NetworkAction::new(authority_discovery_id_clone, future, size, None); + ingress_tx.send(action).unwrap(); + } + .boxed(); + + NetworkAction::new( + authority_discovery_id, + future_wrapper, + size, + // Generate a random latency based on configuration. + random_latency(self.config.latency.as_ref()), + ) + }, + Requests::AvailableDataFetchingV1(outgoing_request) => { + let candidate_hash = outgoing_request.payload.candidate_hash; + let candidate_index = self + .availabilty + .candidate_hashes + .get(&candidate_hash) + .expect("candidate was generated previously; qed"); + gum::debug!(target: LOG_TARGET, ?candidate_hash, candidate_index, "Candidate mapped to index"); + + let authority_discovery_id = match outgoing_request.peer { + req_res::Recipient::Authority(authority_discovery_id) => authority_discovery_id, + _ => unimplemented!("Peer recipient not supported yet"), + }; + + // Account our sent request bytes. + self.network.peer_stats(0).inc_sent(outgoing_request.payload.encoded_size()); + + // If peer is disconnected return an error + if !self.network.is_peer_connected(&authority_discovery_id) { + let future = async move { + let _ = outgoing_request + .pending_response + .send(Err(RequestFailure::NotConnected)); + } + .boxed(); + return self.not_connected_response(&authority_discovery_id, future) + } + + // Account for remote received request bytes. + self.network + .peer_stats_by_id(&authority_discovery_id) + .inc_received(outgoing_request.payload.encoded_size()); + + let available_data = + self.availabilty.available_data.get(*candidate_index).unwrap().clone(); + + let size = available_data.encoded_size(); + + let response = if random_error(self.config.error) { + Err(RequestFailure::Network(OutboundFailure::ConnectionClosed)) + } else { + Ok(req_res::v1::AvailableDataFetchingResponse::from(Some(available_data)) + .encode()) + }; + + let future = async move { + let _ = outgoing_request.pending_response.send(response); + } + .boxed(); + + let authority_discovery_id_clone = authority_discovery_id.clone(); + + let future_wrapper = async move { + // Forward the response to the ingress channel of our node. + // On receive side we apply our node receiving rate limit. + let action = + NetworkAction::new(authority_discovery_id_clone, future, size, None); + ingress_tx.send(action).unwrap(); + } + .boxed(); + + NetworkAction::new( + authority_discovery_id, + future_wrapper, + size, + // Generate a random latency based on configuration. + random_latency(self.config.latency.as_ref()), + ) + }, + _ => panic!("received an unexpected request"), + } + } +} + +#[overseer::subsystem(NetworkBridgeTx, error=SubsystemError, prefix=self::overseer)] +impl MockNetworkBridgeTx { + fn start(self, ctx: Context) -> SpawnedSubsystem { + let future = self.run(ctx).map(|_| Ok(())).boxed(); + + SpawnedSubsystem { name: "test-environment", future } + } +} + +#[overseer::contextbounds(NetworkBridgeTx, prefix = self::overseer)] +impl MockNetworkBridgeTx { + async fn run(mut self, mut ctx: Context) { + let (mut ingress_tx, mut ingress_rx) = + tokio::sync::mpsc::unbounded_channel::(); + + // Initialize our node bandwidth limits. + let mut rx_limiter = RateLimit::new(10, self.config.bandwidth); + + let our_network = self.network.clone(); + + // This task will handle node messages receipt from the simulated network. + ctx.spawn_blocking( + "network-receive", + async move { + while let Some(action) = ingress_rx.recv().await { + let size = action.size(); + + // account for our node receiving the data. + our_network.inc_received(size); + rx_limiter.reap(size).await; + action.run().await; + } + } + .boxed(), + ) + .expect("We never fail to spawn tasks"); + + // Main subsystem loop. + loop { + let msg = ctx.recv().await.expect("Overseer never fails us"); + + match msg { + orchestra::FromOrchestra::Signal(signal) => + if signal == OverseerSignal::Conclude { + return + }, + orchestra::FromOrchestra::Communication { msg } => match msg { + NetworkBridgeTxMessage::SendRequests(requests, _if_disconnected) => { + for request in requests { + gum::debug!(target: LOG_TARGET, request = ?request, "Processing request"); + self.network.inc_sent(request_size(&request)); + let action = self.respond_to_send_request(request, &mut ingress_tx); + + // Will account for our node sending the request over the emulated + // network. + self.network.submit_peer_action(action.peer(), action); + } + }, + _ => { + unimplemented!("Unexpected network bridge message") + }, + }, + } + } + } +} + +// A helper to determine the request payload size. +fn request_size(request: &Requests) -> usize { + match request { + Requests::ChunkFetchingV1(outgoing_request) => outgoing_request.payload.encoded_size(), + Requests::AvailableDataFetchingV1(outgoing_request) => + outgoing_request.payload.encoded_size(), + _ => unimplemented!("received an unexpected request"), + } +} diff --git a/polkadot/node/subsystem-bench/src/core/mock/runtime_api.rs b/polkadot/node/subsystem-bench/src/core/mock/runtime_api.rs new file mode 100644 index 00000000000..d664ebead3c --- /dev/null +++ b/polkadot/node/subsystem-bench/src/core/mock/runtime_api.rs @@ -0,0 +1,110 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . +//! +//! A generic runtime api subsystem mockup suitable to be used in benchmarks. + +use polkadot_primitives::{GroupIndex, IndexedVec, SessionInfo, ValidatorIndex}; + +use polkadot_node_subsystem::{ + messages::{RuntimeApiMessage, RuntimeApiRequest}, + overseer, SpawnedSubsystem, SubsystemError, +}; +use polkadot_node_subsystem_types::OverseerSignal; + +use crate::core::configuration::{TestAuthorities, TestConfiguration}; +use futures::FutureExt; + +const LOG_TARGET: &str = "subsystem-bench::runtime-api-mock"; + +pub struct RuntimeApiState { + authorities: TestAuthorities, +} + +pub struct MockRuntimeApi { + state: RuntimeApiState, + config: TestConfiguration, +} + +impl MockRuntimeApi { + pub fn new(config: TestConfiguration, authorities: TestAuthorities) -> MockRuntimeApi { + Self { state: RuntimeApiState { authorities }, config } + } + + fn session_info(&self) -> SessionInfo { + let all_validators = (0..self.config.n_validators) + .map(|i| ValidatorIndex(i as _)) + .collect::>(); + + let validator_groups = all_validators.chunks(5).map(Vec::from).collect::>(); + + SessionInfo { + validators: self.state.authorities.validator_public.clone().into(), + discovery_keys: self.state.authorities.validator_authority_id.clone(), + validator_groups: IndexedVec::>::from(validator_groups), + assignment_keys: vec![], + n_cores: self.config.n_cores as u32, + zeroth_delay_tranche_width: 0, + relay_vrf_modulo_samples: 0, + n_delay_tranches: 0, + no_show_slots: 0, + needed_approvals: 0, + active_validator_indices: vec![], + dispute_period: 6, + random_seed: [0u8; 32], + } + } +} + +#[overseer::subsystem(RuntimeApi, error=SubsystemError, prefix=self::overseer)] +impl MockRuntimeApi { + fn start(self, ctx: Context) -> SpawnedSubsystem { + let future = self.run(ctx).map(|_| Ok(())).boxed(); + + SpawnedSubsystem { name: "test-environment", future } + } +} + +#[overseer::contextbounds(RuntimeApi, prefix = self::overseer)] +impl MockRuntimeApi { + async fn run(self, mut ctx: Context) { + loop { + let msg = ctx.recv().await.expect("Overseer never fails us"); + + match msg { + orchestra::FromOrchestra::Signal(signal) => + if signal == OverseerSignal::Conclude { + return + }, + orchestra::FromOrchestra::Communication { msg } => { + gum::debug!(target: LOG_TARGET, msg=?msg, "recv message"); + + match msg { + RuntimeApiMessage::Request( + _request, + RuntimeApiRequest::SessionInfo(_session_index, sender), + ) => { + let _ = sender.send(Ok(Some(self.session_info()))); + }, + // Long term TODO: implement more as needed. + _ => { + unimplemented!("Unexpected runtime-api message") + }, + } + }, + } + } + } +} diff --git a/polkadot/node/subsystem-bench/src/core/mod.rs b/polkadot/node/subsystem-bench/src/core/mod.rs new file mode 100644 index 00000000000..282788d143b --- /dev/null +++ b/polkadot/node/subsystem-bench/src/core/mod.rs @@ -0,0 +1,24 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +const LOG_TARGET: &str = "subsystem-bench::core"; + +pub mod configuration; +pub mod display; +pub mod environment; +pub mod keyring; +pub mod mock; +pub mod network; diff --git a/polkadot/node/subsystem-bench/src/core/network.rs b/polkadot/node/subsystem-bench/src/core/network.rs new file mode 100644 index 00000000000..c4e20b421d3 --- /dev/null +++ b/polkadot/node/subsystem-bench/src/core/network.rs @@ -0,0 +1,485 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . +use super::{ + configuration::{TestAuthorities, TestConfiguration}, + environment::TestEnvironmentDependencies, + *, +}; +use colored::Colorize; +use polkadot_primitives::AuthorityDiscoveryId; +use prometheus_endpoint::U64; +use rand::{seq::SliceRandom, thread_rng}; +use sc_service::SpawnTaskHandle; +use std::{ + collections::HashMap, + sync::{ + atomic::{AtomicU64, Ordering}, + Arc, + }, + time::{Duration, Instant}, +}; +use tokio::sync::mpsc::UnboundedSender; + +// An emulated node egress traffic rate_limiter. +#[derive(Debug)] +pub struct RateLimit { + // How often we refill credits in buckets + tick_rate: usize, + // Total ticks + total_ticks: usize, + // Max refill per tick + max_refill: usize, + // Available credit. We allow for bursts over 1/tick_rate of `cps` budget, but we + // account it by negative credit. + credits: isize, + // When last refilled. + last_refill: Instant, +} + +impl RateLimit { + // Create a new `RateLimit` from a `cps` (credits per second) budget and + // `tick_rate`. + pub fn new(tick_rate: usize, cps: usize) -> Self { + // Compute how much refill for each tick + let max_refill = cps / tick_rate; + RateLimit { + tick_rate, + total_ticks: 0, + max_refill, + // A fresh start + credits: max_refill as isize, + last_refill: Instant::now(), + } + } + + pub async fn refill(&mut self) { + // If this is called to early, we need to sleep until next tick. + let now = Instant::now(); + let next_tick_delta = + (self.last_refill + Duration::from_millis(1000 / self.tick_rate as u64)) - now; + + // Sleep until next tick. + if !next_tick_delta.is_zero() { + gum::trace!(target: LOG_TARGET, "need to sleep {}ms", next_tick_delta.as_millis()); + tokio::time::sleep(next_tick_delta).await; + } + + self.total_ticks += 1; + self.credits += self.max_refill as isize; + self.last_refill = Instant::now(); + } + + // Reap credits from the bucket. + // Blocks if credits budged goes negative during call. + pub async fn reap(&mut self, amount: usize) { + self.credits -= amount as isize; + + if self.credits >= 0 { + return + } + + while self.credits < 0 { + gum::trace!(target: LOG_TARGET, "Before refill: {:?}", &self); + self.refill().await; + gum::trace!(target: LOG_TARGET, "After refill: {:?}", &self); + } + } +} + +#[cfg(test)] +mod tests { + use std::time::Instant; + + use super::RateLimit; + + #[tokio::test] + async fn test_expected_rate() { + let tick_rate = 200; + let budget = 1_000_000; + // rate must not exceeed 100 credits per second + let mut rate_limiter = RateLimit::new(tick_rate, budget); + let mut total_sent = 0usize; + let start = Instant::now(); + + let mut reap_amount = 0; + while rate_limiter.total_ticks < tick_rate { + reap_amount += 1; + reap_amount %= 100; + + rate_limiter.reap(reap_amount).await; + total_sent += reap_amount; + } + + let end = Instant::now(); + + println!("duration: {}", (end - start).as_millis()); + + // Allow up to `budget/max_refill` error tolerance + let lower_bound = budget as u128 * ((end - start).as_millis() / 1000u128); + let upper_bound = budget as u128 * + ((end - start).as_millis() / 1000u128 + rate_limiter.max_refill as u128); + assert!(total_sent as u128 >= lower_bound); + assert!(total_sent as u128 <= upper_bound); + } +} + +// A network peer emulator. It spawns a task that accepts `NetworkActions` and +// executes them with a configurable delay and bandwidth constraints. Tipically +// these actions wrap a future that performs a channel send to the subsystem(s) under test. +#[derive(Clone)] +struct PeerEmulator { + // The queue of requests waiting to be served by the emulator + actions_tx: UnboundedSender, +} + +impl PeerEmulator { + pub fn new( + bandwidth: usize, + spawn_task_handle: SpawnTaskHandle, + stats: Arc, + ) -> Self { + let (actions_tx, mut actions_rx) = tokio::sync::mpsc::unbounded_channel(); + + spawn_task_handle + .clone() + .spawn("peer-emulator", "test-environment", async move { + // Rate limit peer send. + let mut rate_limiter = RateLimit::new(10, bandwidth); + loop { + let stats_clone = stats.clone(); + let maybe_action: Option = actions_rx.recv().await; + if let Some(action) = maybe_action { + let size = action.size(); + rate_limiter.reap(size).await; + if let Some(latency) = action.latency { + spawn_task_handle.spawn( + "peer-emulator-latency", + "test-environment", + async move { + tokio::time::sleep(latency).await; + action.run().await; + stats_clone.inc_sent(size); + }, + ) + } else { + action.run().await; + stats_clone.inc_sent(size); + } + } else { + break + } + } + }); + + Self { actions_tx } + } + + // Queue a send request from the emulated peer. + pub fn send(&mut self, action: NetworkAction) { + self.actions_tx.send(action).expect("peer emulator task lives"); + } +} + +pub type ActionFuture = std::pin::Pin + std::marker::Send>>; +/// An network action to be completed by the emulator task. +pub struct NetworkAction { + // The function that performs the action + run: ActionFuture, + // The payload size that we simulate sending/receiving from a peer + size: usize, + // Peer which should run the action. + peer: AuthorityDiscoveryId, + // The amount of time to delay the polling `run` + latency: Option, +} + +unsafe impl Send for NetworkAction {} + +/// Book keeping of sent and received bytes. +pub struct PeerEmulatorStats { + rx_bytes_total: AtomicU64, + tx_bytes_total: AtomicU64, + metrics: Metrics, + peer_index: usize, +} + +impl PeerEmulatorStats { + pub(crate) fn new(peer_index: usize, metrics: Metrics) -> Self { + Self { + metrics, + rx_bytes_total: AtomicU64::from(0), + tx_bytes_total: AtomicU64::from(0), + peer_index, + } + } + + pub fn inc_sent(&self, bytes: usize) { + self.tx_bytes_total.fetch_add(bytes as u64, Ordering::Relaxed); + self.metrics.on_peer_sent(self.peer_index, bytes); + } + + pub fn inc_received(&self, bytes: usize) { + self.rx_bytes_total.fetch_add(bytes as u64, Ordering::Relaxed); + self.metrics.on_peer_received(self.peer_index, bytes); + } + + pub fn sent(&self) -> u64 { + self.tx_bytes_total.load(Ordering::Relaxed) + } + + pub fn received(&self) -> u64 { + self.rx_bytes_total.load(Ordering::Relaxed) + } +} + +#[derive(Debug, Default)] +pub struct PeerStats { + pub rx_bytes_total: u64, + pub tx_bytes_total: u64, +} +impl NetworkAction { + pub fn new( + peer: AuthorityDiscoveryId, + run: ActionFuture, + size: usize, + latency: Option, + ) -> Self { + Self { run, size, peer, latency } + } + + pub fn size(&self) -> usize { + self.size + } + + pub async fn run(self) { + self.run.await; + } + + pub fn peer(&self) -> AuthorityDiscoveryId { + self.peer.clone() + } +} + +/// The state of a peer on the emulated network. +#[derive(Clone)] +enum Peer { + Connected(PeerEmulator), + Disconnected(PeerEmulator), +} + +impl Peer { + pub fn disconnect(&mut self) { + let new_self = match self { + Peer::Connected(peer) => Peer::Disconnected(peer.clone()), + _ => return, + }; + *self = new_self; + } + + pub fn is_connected(&self) -> bool { + matches!(self, Peer::Connected(_)) + } + + pub fn emulator(&mut self) -> &mut PeerEmulator { + match self { + Peer::Connected(ref mut emulator) => emulator, + Peer::Disconnected(ref mut emulator) => emulator, + } + } +} + +/// Mocks the network bridge and an arbitrary number of connected peer nodes. +/// Implements network latency, bandwidth and connection errors. +#[derive(Clone)] +pub struct NetworkEmulator { + // Per peer network emulation. + peers: Vec, + /// Per peer stats. + stats: Vec>, + /// Each emulated peer is a validator. + validator_authority_ids: HashMap, +} + +impl NetworkEmulator { + pub fn new( + config: &TestConfiguration, + dependencies: &TestEnvironmentDependencies, + authorities: &TestAuthorities, + ) -> Self { + let n_peers = config.n_validators; + gum::info!(target: LOG_TARGET, "{}",format!("Initializing emulation for a {} peer network.", n_peers).bright_blue()); + gum::info!(target: LOG_TARGET, "{}",format!("connectivity {}%, error {}%", config.connectivity, config.error).bright_black()); + + let metrics = + Metrics::new(&dependencies.registry).expect("Metrics always register succesfully"); + let mut validator_authority_id_mapping = HashMap::new(); + + // Create a `PeerEmulator` for each peer. + let (stats, mut peers): (_, Vec<_>) = (0..n_peers) + .zip(authorities.validator_authority_id.clone()) + .map(|(peer_index, authority_id)| { + validator_authority_id_mapping.insert(authority_id, peer_index); + let stats = Arc::new(PeerEmulatorStats::new(peer_index, metrics.clone())); + ( + stats.clone(), + Peer::Connected(PeerEmulator::new( + config.peer_bandwidth, + dependencies.task_manager.spawn_handle(), + stats, + )), + ) + }) + .unzip(); + + let connected_count = config.n_validators as f64 / (100.0 / config.connectivity as f64); + + let (_connected, to_disconnect) = + peers.partial_shuffle(&mut thread_rng(), connected_count as usize); + + for peer in to_disconnect { + peer.disconnect(); + } + + gum::info!(target: LOG_TARGET, "{}",format!("Network created, connected validator count {}", connected_count).bright_black()); + + Self { peers, stats, validator_authority_ids: validator_authority_id_mapping } + } + + pub fn is_peer_connected(&self, peer: &AuthorityDiscoveryId) -> bool { + self.peer(peer).is_connected() + } + + pub fn submit_peer_action(&mut self, peer: AuthorityDiscoveryId, action: NetworkAction) { + let index = self + .validator_authority_ids + .get(&peer) + .expect("all test authorities are valid; qed"); + + let peer = self.peers.get_mut(*index).expect("We just retrieved the index above; qed"); + + // Only actions of size 0 are allowed on disconnected peers. + // Typically this are delayed error response sends. + if action.size() > 0 && !peer.is_connected() { + gum::warn!(target: LOG_TARGET, peer_index = index, "Attempted to send data from a disconnected peer, operation ignored"); + return + } + + peer.emulator().send(action); + } + + // Returns the sent/received stats for `peer_index`. + pub fn peer_stats(&self, peer_index: usize) -> Arc { + self.stats[peer_index].clone() + } + + // Helper to get peer index by `AuthorityDiscoveryId` + fn peer_index(&self, peer: &AuthorityDiscoveryId) -> usize { + *self + .validator_authority_ids + .get(peer) + .expect("all test authorities are valid; qed") + } + + // Return the Peer entry for a given `AuthorityDiscoveryId`. + fn peer(&self, peer: &AuthorityDiscoveryId) -> &Peer { + &self.peers[self.peer_index(peer)] + } + // Returns the sent/received stats for `peer`. + pub fn peer_stats_by_id(&mut self, peer: &AuthorityDiscoveryId) -> Arc { + let peer_index = self.peer_index(peer); + + self.stats[peer_index].clone() + } + + // Returns the sent/received stats for all peers. + pub fn stats(&self) -> Vec { + let r = self + .stats + .iter() + .map(|stats| PeerStats { + rx_bytes_total: stats.received(), + tx_bytes_total: stats.sent(), + }) + .collect::>(); + r + } + + // Increment bytes sent by our node (the node that contains the subsystem under test) + pub fn inc_sent(&self, bytes: usize) { + // Our node always is peer 0. + self.peer_stats(0).inc_sent(bytes); + } + + // Increment bytes received by our node (the node that contains the subsystem under test) + pub fn inc_received(&self, bytes: usize) { + // Our node always is peer 0. + self.peer_stats(0).inc_received(bytes); + } +} + +use polkadot_node_subsystem_util::metrics::prometheus::{ + self, CounterVec, Opts, PrometheusError, Registry, +}; + +/// Emulated network metrics. +#[derive(Clone)] +pub(crate) struct Metrics { + /// Number of bytes sent per peer. + peer_total_sent: CounterVec, + /// Number of received sent per peer. + peer_total_received: CounterVec, +} + +impl Metrics { + pub fn new(registry: &Registry) -> Result { + Ok(Self { + peer_total_sent: prometheus::register( + CounterVec::new( + Opts::new( + "subsystem_benchmark_network_peer_total_bytes_sent", + "Total number of bytes a peer has sent.", + ), + &["peer"], + )?, + registry, + )?, + peer_total_received: prometheus::register( + CounterVec::new( + Opts::new( + "subsystem_benchmark_network_peer_total_bytes_received", + "Total number of bytes a peer has received.", + ), + &["peer"], + )?, + registry, + )?, + }) + } + + /// Increment total sent for a peer. + pub fn on_peer_sent(&self, peer_index: usize, bytes: usize) { + self.peer_total_sent + .with_label_values(vec![format!("node{}", peer_index).as_str()].as_slice()) + .inc_by(bytes as u64); + } + + /// Increment total receioved for a peer. + pub fn on_peer_received(&self, peer_index: usize, bytes: usize) { + self.peer_total_received + .with_label_values(vec![format!("node{}", peer_index).as_str()].as_slice()) + .inc_by(bytes as u64); + } +} diff --git a/polkadot/node/subsystem-bench/src/subsystem-bench.rs b/polkadot/node/subsystem-bench/src/subsystem-bench.rs new file mode 100644 index 00000000000..da7e5441f74 --- /dev/null +++ b/polkadot/node/subsystem-bench/src/subsystem-bench.rs @@ -0,0 +1,186 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! A tool for running subsystem benchmark tests designed for development and +//! CI regression testing. +use clap::Parser; +use color_eyre::eyre; + +use colored::Colorize; +use std::{path::Path, time::Duration}; + +pub(crate) mod availability; +pub(crate) mod cli; +pub(crate) mod core; + +use availability::{prepare_test, NetworkEmulation, TestState}; +use cli::TestObjective; + +use core::{ + configuration::TestConfiguration, + environment::{TestEnvironment, GENESIS_HASH}, +}; + +use clap_num::number_range; + +use crate::core::display::display_configuration; + +fn le_100(s: &str) -> Result { + number_range(s, 0, 100) +} + +fn le_5000(s: &str) -> Result { + number_range(s, 0, 5000) +} + +#[derive(Debug, Parser)] +#[allow(missing_docs)] +struct BenchCli { + #[arg(long, value_enum, ignore_case = true, default_value_t = NetworkEmulation::Ideal)] + /// The type of network to be emulated + pub network: NetworkEmulation, + + #[clap(flatten)] + pub standard_configuration: cli::StandardTestOptions, + + #[clap(short, long)] + /// The bandwidth of simulated remote peers in KiB + pub peer_bandwidth: Option, + + #[clap(short, long)] + /// The bandwidth of our simulated node in KiB + pub bandwidth: Option, + + #[clap(long, value_parser=le_100)] + /// Simulated conection error ratio [0-100]. + pub peer_error: Option, + + #[clap(long, value_parser=le_5000)] + /// Minimum remote peer latency in milliseconds [0-5000]. + pub peer_min_latency: Option, + + #[clap(long, value_parser=le_5000)] + /// Maximum remote peer latency in milliseconds [0-5000]. + pub peer_max_latency: Option, + + #[command(subcommand)] + pub objective: cli::TestObjective, +} + +impl BenchCli { + fn launch(self) -> eyre::Result<()> { + let configuration = self.standard_configuration; + let mut test_config = match self.objective { + TestObjective::TestSequence(options) => { + let test_sequence = + core::configuration::TestSequence::new_from_file(Path::new(&options.path)) + .expect("File exists") + .into_vec(); + let num_steps = test_sequence.len(); + gum::info!( + "{}", + format!("Sequence contains {} step(s)", num_steps).bright_purple() + ); + for (index, test_config) in test_sequence.into_iter().enumerate() { + gum::info!("{}", format!("Step {}/{}", index + 1, num_steps).bright_purple(),); + display_configuration(&test_config); + + let mut state = TestState::new(&test_config); + let (mut env, _protocol_config) = prepare_test(test_config, &mut state); + env.runtime() + .block_on(availability::benchmark_availability_read(&mut env, state)); + } + return Ok(()) + }, + TestObjective::DataAvailabilityRead(ref _options) => match self.network { + NetworkEmulation::Healthy => TestConfiguration::healthy_network( + self.objective, + configuration.num_blocks, + configuration.n_validators, + configuration.n_cores, + configuration.min_pov_size, + configuration.max_pov_size, + ), + NetworkEmulation::Degraded => TestConfiguration::degraded_network( + self.objective, + configuration.num_blocks, + configuration.n_validators, + configuration.n_cores, + configuration.min_pov_size, + configuration.max_pov_size, + ), + NetworkEmulation::Ideal => TestConfiguration::ideal_network( + self.objective, + configuration.num_blocks, + configuration.n_validators, + configuration.n_cores, + configuration.min_pov_size, + configuration.max_pov_size, + ), + }, + }; + + let mut latency_config = test_config.latency.clone().unwrap_or_default(); + + if let Some(latency) = self.peer_min_latency { + latency_config.min_latency = Duration::from_millis(latency); + } + + if let Some(latency) = self.peer_max_latency { + latency_config.max_latency = Duration::from_millis(latency); + } + + if let Some(error) = self.peer_error { + test_config.error = error; + } + + if let Some(bandwidth) = self.peer_bandwidth { + // CLI expects bw in KiB + test_config.peer_bandwidth = bandwidth * 1024; + } + + if let Some(bandwidth) = self.bandwidth { + // CLI expects bw in KiB + test_config.bandwidth = bandwidth * 1024; + } + + display_configuration(&test_config); + + let mut state = TestState::new(&test_config); + let (mut env, _protocol_config) = prepare_test(test_config, &mut state); + // test_config.write_to_disk(); + env.runtime() + .block_on(availability::benchmark_availability_read(&mut env, state)); + + Ok(()) + } +} + +fn main() -> eyre::Result<()> { + color_eyre::install()?; + env_logger::builder() + .filter(Some("hyper"), log::LevelFilter::Info) + // Avoid `Terminating due to subsystem exit subsystem` warnings + .filter(Some("polkadot_overseer"), log::LevelFilter::Error) + .filter(None, log::LevelFilter::Info) + // .filter(None, log::LevelFilter::Trace) + .try_init() + .unwrap(); + + let cli: BenchCli = BenchCli::parse(); + cli.launch()?; + Ok(()) +} diff --git a/polkadot/node/subsystem-test-helpers/Cargo.toml b/polkadot/node/subsystem-test-helpers/Cargo.toml index eb6e10559c2..7b616bdb438 100644 --- a/polkadot/node/subsystem-test-helpers/Cargo.toml +++ b/polkadot/node/subsystem-test-helpers/Cargo.toml @@ -15,8 +15,11 @@ async-trait = "0.1.57" futures = "0.3.21" parking_lot = "0.12.0" polkadot-node-subsystem = { path = "../subsystem" } +polkadot-erasure-coding = { path = "../../erasure-coding" } polkadot-node-subsystem-util = { path = "../subsystem-util" } polkadot-primitives = { path = "../../primitives" } +polkadot-node-primitives = { path = "../primitives" } + sc-client-api = { path = "../../../substrate/client/api" } sc-utils = { path = "../../../substrate/client/utils" } sp-core = { path = "../../../substrate/primitives/core" } diff --git a/polkadot/node/subsystem-test-helpers/src/lib.rs b/polkadot/node/subsystem-test-helpers/src/lib.rs index 3f92513498c..dfa78e04b8c 100644 --- a/polkadot/node/subsystem-test-helpers/src/lib.rs +++ b/polkadot/node/subsystem-test-helpers/src/lib.rs @@ -18,11 +18,14 @@ #![warn(missing_docs)] +use polkadot_erasure_coding::{branches, obtain_chunks_v1 as obtain_chunks}; +use polkadot_node_primitives::{AvailableData, ErasureChunk, Proof}; use polkadot_node_subsystem::{ messages::AllMessages, overseer, FromOrchestra, OverseerSignal, SpawnGlue, SpawnedSubsystem, SubsystemError, SubsystemResult, TrySendError, }; use polkadot_node_subsystem_util::TimeoutExt; +use polkadot_primitives::{Hash, ValidatorIndex}; use futures::{channel::mpsc, poll, prelude::*}; use parking_lot::Mutex; @@ -440,6 +443,34 @@ impl Future for Yield { } } +/// Helper for chunking available data. +pub fn derive_erasure_chunks_with_proofs_and_root( + n_validators: usize, + available_data: &AvailableData, + alter_chunk: impl Fn(usize, &mut Vec), +) -> (Vec, Hash) { + let mut chunks: Vec> = obtain_chunks(n_validators, available_data).unwrap(); + + for (i, chunk) in chunks.iter_mut().enumerate() { + alter_chunk(i, chunk) + } + + // create proofs for each erasure chunk + let branches = branches(chunks.as_ref()); + + let root = branches.root(); + let erasure_chunks = branches + .enumerate() + .map(|(index, (proof, chunk))| ErasureChunk { + chunk: chunk.to_vec(), + index: ValidatorIndex(index as _), + proof: Proof::try_from(proof).unwrap(), + }) + .collect::>(); + + (erasure_chunks, root) +} + #[cfg(test)] mod tests { use super::*; diff --git a/polkadot/node/subsystem-test-helpers/src/mock.rs b/polkadot/node/subsystem-test-helpers/src/mock.rs index 522bc3c2cc4..14026960ac1 100644 --- a/polkadot/node/subsystem-test-helpers/src/mock.rs +++ b/polkadot/node/subsystem-test-helpers/src/mock.rs @@ -16,7 +16,7 @@ use std::sync::Arc; -use polkadot_node_subsystem::{jaeger, ActivatedLeaf}; +use polkadot_node_subsystem::{jaeger, ActivatedLeaf, BlockInfo}; use sc_client_api::UnpinHandle; use sc_keystore::LocalKeystore; use sc_utils::mpsc::tracing_unbounded; @@ -59,3 +59,8 @@ pub fn new_leaf(hash: Hash, number: BlockNumber) -> ActivatedLeaf { span: Arc::new(jaeger::Span::Disabled), } } + +/// Create a new leaf with the given hash and number. +pub fn new_block_import_info(hash: Hash, number: BlockNumber) -> BlockInfo { + BlockInfo { hash, parent_hash: Hash::default(), number, unpin_handle: dummy_unpin_handle(hash) } +} -- GitLab From 3e4e8c0bd1b1487c47c95dc27f2fff9e2f4e7fa0 Mon Sep 17 00:00:00 2001 From: Egor_P Date: Thu, 14 Dec 2023 12:13:48 +0100 Subject: [PATCH 033/191] [Backport] txn version bump from 1.5.0 (#2709) This PR backports `transaction_version` bump from `1.5.0` release back to `master` --- .../parachains/runtimes/assets/asset-hub-rococo/src/lib.rs | 4 ++-- .../parachains/runtimes/assets/asset-hub-westend/src/lib.rs | 2 +- .../runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs | 2 +- .../runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs | 2 +- polkadot/runtime/rococo/src/lib.rs | 2 +- polkadot/runtime/westend/src/lib.rs | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs index 0374a99f234..e00327a3ef6 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs @@ -115,7 +115,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_version: 1_005_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 13, + transaction_version: 14, state_version: 1, }; @@ -128,7 +128,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_version: 1_005_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 13, + transaction_version: 14, state_version: 0, }; diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs index e44c7b2c827..ceb02187350 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs @@ -112,7 +112,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_version: 1_005_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 13, + transaction_version: 14, state_version: 0, }; diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs index 3d1d345a95c..22f5d9f5fb3 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs @@ -174,7 +174,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_version: 1_005_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 3, + transaction_version: 4, state_version: 1, }; diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs index 5ea5cea7530..a052cd929b7 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs @@ -175,7 +175,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_version: 1_005_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 3, + transaction_version: 4, state_version: 1, }; diff --git a/polkadot/runtime/rococo/src/lib.rs b/polkadot/runtime/rococo/src/lib.rs index 43df232e92a..acc3f723cdd 100644 --- a/polkadot/runtime/rococo/src/lib.rs +++ b/polkadot/runtime/rococo/src/lib.rs @@ -153,7 +153,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_version: 1_005_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 22, + transaction_version: 24, state_version: 1, }; diff --git a/polkadot/runtime/westend/src/lib.rs b/polkadot/runtime/westend/src/lib.rs index 9b8eff480f2..0f068b093f5 100644 --- a/polkadot/runtime/westend/src/lib.rs +++ b/polkadot/runtime/westend/src/lib.rs @@ -150,7 +150,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_version: 1_005_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, - transaction_version: 22, + transaction_version: 24, state_version: 1, }; -- GitLab From 10a91f821e04a38207aa52599889347c726f3efd Mon Sep 17 00:00:00 2001 From: Francisco Aguirre Date: Thu, 14 Dec 2023 15:34:35 +0100 Subject: [PATCH 034/191] Add FungibleAdapter (#2684) In the move from the old `Currency` traits to the new `fungible/s` family of traits, we already had the `FungiblesAdapter` and `NonFungiblesAdapter` for multiple fungible and non fungible assets respectively. However, for handling only one fungible asset, we were missing a `FungibleAdapter`, and so used the old `CurrencyAdapter` instead. This PR aims to fill in that gap, and provide the new adapter for more updated examples. I marked the old `CurrencyAdapter` as deprecated as part of this PR, and I'll change it to the new `FungibleAdapter` in a following PR. The two stages are separated so as to not bloat this PR with some name fixes in tests. --------- Co-authored-by: command-bot <> --- cumulus/pallets/xcmp-queue/src/mock.rs | 5 +- .../runtime/src/xcm_config.rs | 13 +- .../assets/asset-hub-rococo/src/xcm_config.rs | 20 +- .../asset-hub-westend/src/xcm_config.rs | 20 +- .../bridge-hub-rococo/src/xcm_config.rs | 7 +- .../bridge-hub-westend/src/xcm_config.rs | 9 +- .../collectives-westend/src/xcm_config.rs | 17 +- .../contracts-rococo/src/xcm_config.rs | 15 +- .../runtimes/testing/penpal/src/xcm_config.rs | 14 +- .../testing/rococo-parachain/src/lib.rs | 11 +- polkadot/runtime/rococo/src/xcm_config.rs | 14 +- polkadot/runtime/westend/src/xcm_config.rs | 13 +- .../src/fungible/mock.rs | 1 + polkadot/xcm/pallet-xcm/src/mock.rs | 11 +- .../xcm/xcm-builder/src/currency_adapter.rs | 3 + .../xcm/xcm-builder/src/fungible_adapter.rs | 317 ++++++++++++++++++ polkadot/xcm/xcm-builder/src/lib.rs | 4 + polkadot/xcm/xcm-builder/tests/mock/mod.rs | 9 +- .../xcm-simulator/example/src/parachain.rs | 9 +- .../xcm-simulator/example/src/relay_chain.rs | 8 +- .../xcm/xcm-simulator/fuzzer/src/parachain.rs | 10 +- .../xcm-simulator/fuzzer/src/relay_chain.rs | 9 +- prdoc/pr_2684.prdoc | 14 + .../contracts/mock-network/src/parachain.rs | 10 +- .../contracts/mock-network/src/relay_chain.rs | 9 +- 25 files changed, 479 insertions(+), 93 deletions(-) create mode 100644 polkadot/xcm/xcm-builder/src/fungible_adapter.rs create mode 100644 prdoc/pr_2684.prdoc diff --git a/cumulus/pallets/xcmp-queue/src/mock.rs b/cumulus/pallets/xcmp-queue/src/mock.rs index 755b685d5b8..a41be6fa9ca 100644 --- a/cumulus/pallets/xcmp-queue/src/mock.rs +++ b/cumulus/pallets/xcmp-queue/src/mock.rs @@ -30,7 +30,9 @@ use sp_runtime::{ BuildStorage, }; use xcm::prelude::*; -use xcm_builder::{CurrencyAdapter, FixedWeightBounds, IsConcrete, NativeAsset, ParentIsPreset}; +#[allow(deprecated)] +use xcm_builder::CurrencyAdapter; +use xcm_builder::{FixedWeightBounds, IsConcrete, NativeAsset, ParentIsPreset}; use xcm_executor::traits::ConvertOrigin; type Block = frame_system::mocking::MockBlock; @@ -130,6 +132,7 @@ parameter_types! { } /// Means for transacting assets on this chain. +#[allow(deprecated)] pub type LocalAssetTransactor = CurrencyAdapter< // Use this currency: Balances, diff --git a/cumulus/parachain-template/runtime/src/xcm_config.rs b/cumulus/parachain-template/runtime/src/xcm_config.rs index 752137c96f1..7d1a748819c 100644 --- a/cumulus/parachain-template/runtime/src/xcm_config.rs +++ b/cumulus/parachain-template/runtime/src/xcm_config.rs @@ -12,13 +12,15 @@ use pallet_xcm::XcmPassthrough; use polkadot_parachain_primitives::primitives::Sibling; use polkadot_runtime_common::impls::ToAuthor; use xcm::latest::prelude::*; +#[allow(deprecated)] +use xcm_builder::CurrencyAdapter; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowTopLevelPaidExecutionFrom, - CurrencyAdapter, DenyReserveTransferToRelayChain, DenyThenTry, EnsureXcmOrigin, - FixedWeightBounds, IsConcrete, NativeAsset, ParentIsPreset, RelayChainAsNative, - SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, - SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, - UsingComponents, WithComputedOrigin, WithUniqueTopic, + DenyReserveTransferToRelayChain, DenyThenTry, EnsureXcmOrigin, FixedWeightBounds, IsConcrete, + NativeAsset, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, + SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, + SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, + WithComputedOrigin, WithUniqueTopic, }; use xcm_executor::XcmExecutor; @@ -42,6 +44,7 @@ pub type LocationToAccountId = ( ); /// Means for transacting assets on this chain. +#[allow(deprecated)] pub type LocalAssetTransactor = CurrencyAdapter< // Use this currency: Balances, diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs index 001f2af19fe..003b71093e0 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs @@ -41,17 +41,18 @@ use polkadot_parachain_primitives::primitives::Sibling; use polkadot_runtime_common::xcm_sender::ExponentialPrice; use sp_runtime::traits::{AccountIdConversion, ConvertInto}; use xcm::latest::prelude::*; +#[allow(deprecated)] +use xcm_builder::CurrencyAdapter; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, - AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, - DenyReserveTransferToRelayChain, DenyThenTry, DescribeAllTerminal, DescribeFamily, - EnsureXcmOrigin, FungiblesAdapter, GlobalConsensusParachainConvertsFor, HashedDescription, - IsConcrete, LocalMint, NetworkExportTableItem, NoChecking, ParentAsSuperuser, ParentIsPreset, - RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, - SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, StartsWith, - StartsWithExplicitGlobalConsensus, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, - WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, XcmFeeManagerFromComponents, - XcmFeeToAccount, + AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, DenyReserveTransferToRelayChain, + DenyThenTry, DescribeAllTerminal, DescribeFamily, EnsureXcmOrigin, FungiblesAdapter, + GlobalConsensusParachainConvertsFor, HashedDescription, IsConcrete, LocalMint, + NetworkExportTableItem, NoChecking, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, + SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, + SignedToAccountId32, SovereignSignedViaLocation, StartsWith, StartsWithExplicitGlobalConsensus, + TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, WeightInfoBounds, WithComputedOrigin, + WithUniqueTopic, XcmFeeManagerFromComponents, XcmFeeToAccount, }; use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; @@ -95,6 +96,7 @@ pub type LocationToAccountId = ( ); /// Means for transacting the native currency on this chain. +#[allow(deprecated)] pub type CurrencyTransactor = CurrencyAdapter< // Use this currency: Balances, diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs index 946ab9696f7..4bcc2bad5f6 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs @@ -41,17 +41,18 @@ use polkadot_parachain_primitives::primitives::Sibling; use polkadot_runtime_common::xcm_sender::ExponentialPrice; use sp_runtime::traits::{AccountIdConversion, ConvertInto}; use xcm::latest::prelude::*; +#[allow(deprecated)] +use xcm_builder::CurrencyAdapter; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, - AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, - DenyReserveTransferToRelayChain, DenyThenTry, DescribeFamily, DescribePalletTerminal, - EnsureXcmOrigin, FungiblesAdapter, GlobalConsensusParachainConvertsFor, HashedDescription, - IsConcrete, LocalMint, NetworkExportTableItem, NoChecking, ParentAsSuperuser, ParentIsPreset, - RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, - SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, StartsWith, - StartsWithExplicitGlobalConsensus, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, - WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, XcmFeeManagerFromComponents, - XcmFeeToAccount, + AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, DenyReserveTransferToRelayChain, + DenyThenTry, DescribeFamily, DescribePalletTerminal, EnsureXcmOrigin, FungiblesAdapter, + GlobalConsensusParachainConvertsFor, HashedDescription, IsConcrete, LocalMint, + NetworkExportTableItem, NoChecking, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, + SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, + SignedToAccountId32, SovereignSignedViaLocation, StartsWith, StartsWithExplicitGlobalConsensus, + TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, WeightInfoBounds, WithComputedOrigin, + WithUniqueTopic, XcmFeeManagerFromComponents, XcmFeeToAccount, }; use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; @@ -95,6 +96,7 @@ pub type LocationToAccountId = ( ); /// Means for transacting the native currency on this chain. +#[allow(deprecated)] pub type CurrencyTransactor = CurrencyAdapter< // Use this currency: Balances, diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs index bb88c0717b2..c9b9d94920d 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs @@ -45,11 +45,13 @@ use sp_core::Get; use sp_runtime::traits::AccountIdConversion; use sp_std::marker::PhantomData; use xcm::latest::prelude::*; +#[allow(deprecated)] +use xcm_builder::CurrencyAdapter; use xcm_builder::{ deposit_or_burn_fee, AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, - CurrencyAdapter, DenyReserveTransferToRelayChain, DenyThenTry, EnsureXcmOrigin, HandleFee, - IsConcrete, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, + DenyReserveTransferToRelayChain, DenyThenTry, EnsureXcmOrigin, HandleFee, IsConcrete, + ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, XcmFeeManagerFromComponents, @@ -85,6 +87,7 @@ pub type LocationToAccountId = ( ); /// Means for transacting the native currency on this chain. +#[allow(deprecated)] pub type CurrencyTransactor = CurrencyAdapter< // Use this currency: Balances, diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/xcm_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/xcm_config.rs index af3ec500f15..26dc1f62950 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/xcm_config.rs @@ -38,11 +38,13 @@ use polkadot_parachain_primitives::primitives::Sibling; use polkadot_runtime_common::xcm_sender::ExponentialPrice; use sp_runtime::traits::AccountIdConversion; use xcm::latest::prelude::*; +#[allow(deprecated)] +use xcm_builder::CurrencyAdapter; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, - AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, - DenyReserveTransferToRelayChain, DenyThenTry, EnsureXcmOrigin, IsConcrete, ParentAsSuperuser, - ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, + AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, DenyReserveTransferToRelayChain, + DenyThenTry, EnsureXcmOrigin, IsConcrete, ParentAsSuperuser, ParentIsPreset, + RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, XcmFeeManagerFromComponents, XcmFeeToAccount, @@ -74,6 +76,7 @@ pub type LocationToAccountId = ( ); /// Means for transacting the native currency on this chain. +#[allow(deprecated)] pub type CurrencyTransactor = CurrencyAdapter< // Use this currency: Balances, diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/xcm_config.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/xcm_config.rs index c74b111ce2c..1fde722e42e 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/xcm_config.rs @@ -36,15 +36,17 @@ use polkadot_parachain_primitives::primitives::Sibling; use polkadot_runtime_common::xcm_sender::ExponentialPrice; use westend_runtime_constants::xcm as xcm_constants; use xcm::latest::prelude::*; +#[allow(deprecated)] +use xcm_builder::CurrencyAdapter; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, - AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, - DenyReserveTransferToRelayChain, DenyThenTry, EnsureXcmOrigin, FixedWeightBounds, IsConcrete, - LocatableAssetId, OriginToPluralityVoice, ParentAsSuperuser, ParentIsPreset, - RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, - SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, - TrailingSetTopicAsId, UsingComponents, WithComputedOrigin, WithUniqueTopic, - XcmFeeManagerFromComponents, XcmFeeToAccount, + AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, DenyReserveTransferToRelayChain, + DenyThenTry, EnsureXcmOrigin, FixedWeightBounds, IsConcrete, LocatableAssetId, + OriginToPluralityVoice, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, + SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, + SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, + UsingComponents, WithComputedOrigin, WithUniqueTopic, XcmFeeManagerFromComponents, + XcmFeeToAccount, }; use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; @@ -84,6 +86,7 @@ pub type LocationToAccountId = ( ); /// Means for transacting the native currency on this chain. +#[allow(deprecated)] pub type CurrencyTransactor = CurrencyAdapter< // Use this currency: Balances, diff --git a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs index e49ec64db92..569ca6e587c 100644 --- a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs @@ -37,14 +37,16 @@ use polkadot_parachain_primitives::primitives::Sibling; use polkadot_runtime_common::xcm_sender::ExponentialPrice; use sp_runtime::traits::AccountIdConversion; use xcm::latest::prelude::*; +#[allow(deprecated)] +use xcm_builder::CurrencyAdapter; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, - AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, - DenyReserveTransferToRelayChain, DenyThenTry, EnsureXcmOrigin, FixedWeightBounds, IsConcrete, - NativeAsset, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, - SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, - SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, - WithComputedOrigin, WithUniqueTopic, XcmFeeManagerFromComponents, XcmFeeToAccount, + AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, DenyReserveTransferToRelayChain, + DenyThenTry, EnsureXcmOrigin, FixedWeightBounds, IsConcrete, NativeAsset, ParentAsSuperuser, + ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, + SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, + TrailingSetTopicAsId, UsingComponents, WithComputedOrigin, WithUniqueTopic, + XcmFeeManagerFromComponents, XcmFeeToAccount, }; use xcm_executor::XcmExecutor; @@ -77,6 +79,7 @@ pub type LocationToAccountId = ( ); /// Means for transacting the native currency on this chain. +#[allow(deprecated)] pub type CurrencyTransactor = CurrencyAdapter< // Use this currency: Balances, diff --git a/cumulus/parachains/runtimes/testing/penpal/src/xcm_config.rs b/cumulus/parachains/runtimes/testing/penpal/src/xcm_config.rs index 21f421f8285..e4f0afc854b 100644 --- a/cumulus/parachains/runtimes/testing/penpal/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/testing/penpal/src/xcm_config.rs @@ -44,15 +44,16 @@ use polkadot_parachain_primitives::primitives::Sibling; use polkadot_runtime_common::impls::ToAuthor; use sp_runtime::traits::Zero; use xcm::latest::prelude::*; +#[allow(deprecated)] +use xcm_builder::CurrencyAdapter; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, AsPrefixedGeneralIndex, - ConvertedConcreteId, CurrencyAdapter, DenyReserveTransferToRelayChain, DenyThenTry, - EnsureXcmOrigin, FixedWeightBounds, FungiblesAdapter, IsConcrete, LocalMint, NativeAsset, - ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, - SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, - SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, - WithComputedOrigin, WithUniqueTopic, + ConvertedConcreteId, DenyReserveTransferToRelayChain, DenyThenTry, EnsureXcmOrigin, + FixedWeightBounds, FungiblesAdapter, IsConcrete, LocalMint, NativeAsset, ParentAsSuperuser, + ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, + SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, + TrailingSetTopicAsId, UsingComponents, WithComputedOrigin, WithUniqueTopic, }; use xcm_executor::{traits::JustTry, XcmExecutor}; @@ -76,6 +77,7 @@ pub type LocationToAccountId = ( ); /// Means for transacting assets on this chain. +#[allow(deprecated)] pub type CurrencyTransactor = CurrencyAdapter< // Use this currency: Balances, diff --git a/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs b/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs index 4967ca86854..206e4970bae 100644 --- a/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs +++ b/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs @@ -83,12 +83,14 @@ use xcm_executor::traits::JustTry; use pallet_xcm::{EnsureXcm, IsMajorityOfBody, XcmPassthrough}; use polkadot_parachain_primitives::primitives::Sibling; use xcm::latest::prelude::*; +#[allow(deprecated)] +use xcm_builder::CurrencyAdapter; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowTopLevelPaidExecutionFrom, - CurrencyAdapter, EnsureXcmOrigin, FixedWeightBounds, IsConcrete, NativeAsset, - ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, - SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, - SovereignSignedViaLocation, TakeWeightCredit, UsingComponents, + EnsureXcmOrigin, FixedWeightBounds, IsConcrete, NativeAsset, ParentAsSuperuser, ParentIsPreset, + RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, + SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, + UsingComponents, }; use xcm_executor::XcmExecutor; @@ -345,6 +347,7 @@ pub type LocationToAccountId = ( ); /// Means for transacting assets on this chain. +#[allow(deprecated)] pub type CurrencyTransactor = CurrencyAdapter< // Use this currency: Balances, diff --git a/polkadot/runtime/rococo/src/xcm_config.rs b/polkadot/runtime/rococo/src/xcm_config.rs index c8f8f59dae9..e5edba2570c 100644 --- a/polkadot/runtime/rococo/src/xcm_config.rs +++ b/polkadot/runtime/rococo/src/xcm_config.rs @@ -36,15 +36,16 @@ use runtime_common::{ }; use sp_core::ConstU32; use xcm::latest::prelude::*; +#[allow(deprecated)] +use xcm_builder::CurrencyAdapter as XcmCurrencyAdapter; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, ChildParachainAsNative, - ChildParachainConvertsVia, CurrencyAdapter as XcmCurrencyAdapter, DescribeBodyTerminal, - DescribeFamily, FixedWeightBounds, HashedDescription, IsChildSystemParachain, IsConcrete, - MintLocation, OriginToPluralityVoice, SignedAccountId32AsNative, SignedToAccountId32, - SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, - WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, XcmFeeManagerFromComponents, - XcmFeeToAccount, + ChildParachainConvertsVia, DescribeBodyTerminal, DescribeFamily, FixedWeightBounds, + HashedDescription, IsChildSystemParachain, IsConcrete, MintLocation, OriginToPluralityVoice, + SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, + TrailingSetTopicAsId, UsingComponents, WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, + XcmFeeManagerFromComponents, XcmFeeToAccount, }; use xcm_executor::XcmExecutor; @@ -70,6 +71,7 @@ pub type LocationConverter = ( /// point of view of XCM-only concepts like `MultiLocation` and `MultiAsset`. /// /// Ours is only aware of the Balances pallet, which is mapped to `RocLocation`. +#[allow(deprecated)] pub type LocalAssetTransactor = XcmCurrencyAdapter< // Use this currency: Balances, diff --git a/polkadot/runtime/westend/src/xcm_config.rs b/polkadot/runtime/westend/src/xcm_config.rs index d846b982e9a..506df3025fd 100644 --- a/polkadot/runtime/westend/src/xcm_config.rs +++ b/polkadot/runtime/westend/src/xcm_config.rs @@ -39,14 +39,16 @@ use westend_runtime_constants::{ xcm::body::{FELLOWSHIP_ADMIN_INDEX, TREASURER_INDEX}, }; use xcm::latest::prelude::*; +#[allow(deprecated)] +use xcm_builder::CurrencyAdapter as XcmCurrencyAdapter; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, ChildParachainAsNative, - ChildParachainConvertsVia, CurrencyAdapter as XcmCurrencyAdapter, DescribeBodyTerminal, - DescribeFamily, HashedDescription, IsConcrete, MintLocation, OriginToPluralityVoice, - SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, - TrailingSetTopicAsId, UsingComponents, WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, - XcmFeeManagerFromComponents, XcmFeeToAccount, + ChildParachainConvertsVia, DescribeBodyTerminal, DescribeFamily, HashedDescription, IsConcrete, + MintLocation, OriginToPluralityVoice, SignedAccountId32AsNative, SignedToAccountId32, + SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, + WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, XcmFeeManagerFromComponents, + XcmFeeToAccount, }; use xcm_executor::XcmExecutor; @@ -72,6 +74,7 @@ pub type LocationConverter = ( HashedDescription>, ); +#[allow(deprecated)] pub type LocalAssetTransactor = XcmCurrencyAdapter< // Use this currency: Balances, diff --git a/polkadot/xcm/pallet-xcm-benchmarks/src/fungible/mock.rs b/polkadot/xcm/pallet-xcm-benchmarks/src/fungible/mock.rs index 4d566fd585d..43892c31c7c 100644 --- a/polkadot/xcm/pallet-xcm-benchmarks/src/fungible/mock.rs +++ b/polkadot/xcm/pallet-xcm-benchmarks/src/fungible/mock.rs @@ -103,6 +103,7 @@ impl xcm_executor::traits::MatchesFungible for MatchAnyFungible { } // Use balances as the asset transactor. +#[allow(deprecated)] pub type AssetTransactor = xcm_builder::CurrencyAdapter< Balances, MatchAnyFungible, diff --git a/polkadot/xcm/pallet-xcm/src/mock.rs b/polkadot/xcm/pallet-xcm/src/mock.rs index 2443d3a9cac..bc9a3c3c35a 100644 --- a/polkadot/xcm/pallet-xcm/src/mock.rs +++ b/polkadot/xcm/pallet-xcm/src/mock.rs @@ -32,13 +32,15 @@ pub use sp_std::{ cell::RefCell, collections::btree_map::BTreeMap, fmt::Debug, marker::PhantomData, }; use xcm::prelude::*; +#[allow(deprecated)] +use xcm_builder::CurrencyAdapter as XcmCurrencyAdapter; use xcm_builder::{ AccountId32Aliases, AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, Case, ChildParachainAsNative, ChildParachainConvertsVia, - ChildSystemParachainAsSuperuser, CurrencyAdapter as XcmCurrencyAdapter, DescribeAllTerminal, - FixedRateOfFungible, FixedWeightBounds, FungiblesAdapter, HashedDescription, IsConcrete, - MatchedConvertedConcreteId, NoChecking, SignedAccountId32AsNative, SignedToAccountId32, - SovereignSignedViaLocation, TakeWeightCredit, XcmFeeManagerFromComponents, XcmFeeToAccount, + ChildSystemParachainAsSuperuser, DescribeAllTerminal, FixedRateOfFungible, FixedWeightBounds, + FungiblesAdapter, HashedDescription, IsConcrete, MatchedConvertedConcreteId, NoChecking, + SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, + XcmFeeManagerFromComponents, XcmFeeToAccount, }; use xcm_executor::{ traits::{Identity, JustTry}, @@ -428,6 +430,7 @@ pub type ForeignAssetsConvertedConcreteId = MatchedConvertedConcreteId< JustTry, >; +#[allow(deprecated)] pub type AssetTransactors = ( XcmCurrencyAdapter, SovereignAccountOf, AccountId, ()>, FungiblesAdapter< diff --git a/polkadot/xcm/xcm-builder/src/currency_adapter.rs b/polkadot/xcm/xcm-builder/src/currency_adapter.rs index 8ecf1dee72d..c3842a498ad 100644 --- a/polkadot/xcm/xcm-builder/src/currency_adapter.rs +++ b/polkadot/xcm/xcm-builder/src/currency_adapter.rs @@ -16,6 +16,8 @@ //! Adapters to work with `frame_support::traits::Currency` through XCM. +#![allow(deprecated)] + use super::MintLocation; use frame_support::traits::{ExistenceRequirement::AllowDeath, Get, WithdrawReasons}; use sp_runtime::traits::CheckedSub; @@ -85,6 +87,7 @@ impl From for XcmError { /// CheckingAccount, /// >; /// ``` +#[deprecated = "Use `FungibleAdapter` instead"] pub struct CurrencyAdapter( PhantomData<(Currency, Matcher, AccountIdConverter, AccountId, CheckedAccount)>, ); diff --git a/polkadot/xcm/xcm-builder/src/fungible_adapter.rs b/polkadot/xcm/xcm-builder/src/fungible_adapter.rs new file mode 100644 index 00000000000..90608faa447 --- /dev/null +++ b/polkadot/xcm/xcm-builder/src/fungible_adapter.rs @@ -0,0 +1,317 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Adapters to work with [`frame_support::traits::fungible`] through XCM. + +use super::MintLocation; +use frame_support::traits::{ + tokens::{ + fungible, Fortitude::Polite, Precision::Exact, Preservation::Preserve, Provenance::Minted, + }, + Get, +}; +use sp_std::{marker::PhantomData, prelude::*, result}; +use xcm::latest::prelude::*; +use xcm_executor::traits::{ConvertLocation, Error as MatchError, MatchesFungible, TransactAsset}; + +/// [`TransactAsset`] implementation that allows the use of a [`fungible`] implementation for +/// handling an asset in the XCM executor. +/// Only works for transfers. +pub struct FungibleTransferAdapter( + PhantomData<(Fungible, Matcher, AccountIdConverter, AccountId)>, +); +impl< + Fungible: fungible::Mutate, + Matcher: MatchesFungible, + AccountIdConverter: ConvertLocation, + AccountId: Eq + Clone, + > TransactAsset for FungibleTransferAdapter +{ + fn internal_transfer_asset( + what: &MultiAsset, + from: &MultiLocation, + to: &MultiLocation, + _context: &XcmContext, + ) -> result::Result { + log::trace!( + target: "xcm::fungible_adapter", + "internal_transfer_asset what: {:?}, from: {:?}, to: {:?}", + what, from, to + ); + // Check we handle the asset + let amount = Matcher::matches_fungible(what).ok_or(MatchError::AssetNotHandled)?; + let source = AccountIdConverter::convert_location(from) + .ok_or(MatchError::AccountIdConversionFailed)?; + let dest = AccountIdConverter::convert_location(to) + .ok_or(MatchError::AccountIdConversionFailed)?; + Fungible::transfer(&source, &dest, amount, Preserve) + .map_err(|error| XcmError::FailedToTransactAsset(error.into()))?; + Ok(what.clone().into()) + } +} + +/// [`TransactAsset`] implementation that allows the use of a [`fungible`] implementation for +/// handling an asset in the XCM executor. +/// Works for everything but transfers. +pub struct FungibleMutateAdapter( + PhantomData<(Fungible, Matcher, AccountIdConverter, AccountId, CheckingAccount)>, +); + +impl< + Fungible: fungible::Mutate, + Matcher: MatchesFungible, + AccountIdConverter: ConvertLocation, + AccountId: Eq + Clone, + CheckingAccount: Get>, + > FungibleMutateAdapter +{ + fn can_accrue_checked(checking_account: AccountId, amount: Fungible::Balance) -> XcmResult { + Fungible::can_deposit(&checking_account, amount, Minted) + .into_result() + .map_err(|_| XcmError::NotDepositable) + } + + fn can_reduce_checked(checking_account: AccountId, amount: Fungible::Balance) -> XcmResult { + Fungible::can_withdraw(&checking_account, amount) + .into_result(false) + .map_err(|_| XcmError::NotWithdrawable) + .map(|_| ()) + } + + fn accrue_checked(checking_account: AccountId, amount: Fungible::Balance) { + let ok = Fungible::mint_into(&checking_account, amount).is_ok(); + debug_assert!(ok, "`can_accrue_checked` must have returned `true` immediately prior; qed"); + } + + fn reduce_checked(checking_account: AccountId, amount: Fungible::Balance) { + let ok = Fungible::burn_from(&checking_account, amount, Exact, Polite).is_ok(); + debug_assert!(ok, "`can_reduce_checked` must have returned `true` immediately prior; qed"); + } +} + +impl< + Fungible: fungible::Mutate, + Matcher: MatchesFungible, + AccountIdConverter: ConvertLocation, + AccountId: Eq + Clone, + CheckingAccount: Get>, + > TransactAsset + for FungibleMutateAdapter +{ + fn can_check_in( + _origin: &MultiLocation, + what: &MultiAsset, + _context: &XcmContext, + ) -> XcmResult { + log::trace!( + target: "xcm::fungible_adapter", + "can_check_in origin: {:?}, what: {:?}", + _origin, what + ); + // Check we handle this asset + let amount = Matcher::matches_fungible(what).ok_or(MatchError::AssetNotHandled)?; + match CheckingAccount::get() { + Some((checking_account, MintLocation::Local)) => + Self::can_reduce_checked(checking_account, amount), + Some((checking_account, MintLocation::NonLocal)) => + Self::can_accrue_checked(checking_account, amount), + None => Ok(()), + } + } + + fn check_in(_origin: &MultiLocation, what: &MultiAsset, _context: &XcmContext) { + log::trace!( + target: "xcm::fungible_adapter", + "check_in origin: {:?}, what: {:?}", + _origin, what + ); + if let Some(amount) = Matcher::matches_fungible(what) { + match CheckingAccount::get() { + Some((checking_account, MintLocation::Local)) => + Self::reduce_checked(checking_account, amount), + Some((checking_account, MintLocation::NonLocal)) => + Self::accrue_checked(checking_account, amount), + None => (), + } + } + } + + fn can_check_out(_dest: &MultiLocation, what: &MultiAsset, _context: &XcmContext) -> XcmResult { + log::trace!( + target: "xcm::fungible_adapter", + "check_out dest: {:?}, what: {:?}", + _dest, + what + ); + let amount = Matcher::matches_fungible(what).ok_or(MatchError::AssetNotHandled)?; + match CheckingAccount::get() { + Some((checking_account, MintLocation::Local)) => + Self::can_accrue_checked(checking_account, amount), + Some((checking_account, MintLocation::NonLocal)) => + Self::can_reduce_checked(checking_account, amount), + None => Ok(()), + } + } + + fn check_out(_dest: &MultiLocation, what: &MultiAsset, _context: &XcmContext) { + log::trace!( + target: "xcm::fungible_adapter", + "check_out dest: {:?}, what: {:?}", + _dest, + what + ); + if let Some(amount) = Matcher::matches_fungible(what) { + match CheckingAccount::get() { + Some((checking_account, MintLocation::Local)) => + Self::accrue_checked(checking_account, amount), + Some((checking_account, MintLocation::NonLocal)) => + Self::reduce_checked(checking_account, amount), + None => (), + } + } + } + + fn deposit_asset( + what: &MultiAsset, + who: &MultiLocation, + _context: Option<&XcmContext>, + ) -> XcmResult { + log::trace!( + target: "xcm::fungible_adapter", + "deposit_asset what: {:?}, who: {:?}", + what, who, + ); + let amount = Matcher::matches_fungible(what).ok_or(MatchError::AssetNotHandled)?; + let who = AccountIdConverter::convert_location(who) + .ok_or(MatchError::AccountIdConversionFailed)?; + Fungible::mint_into(&who, amount) + .map_err(|error| XcmError::FailedToTransactAsset(error.into()))?; + Ok(()) + } + + fn withdraw_asset( + what: &MultiAsset, + who: &MultiLocation, + _context: Option<&XcmContext>, + ) -> result::Result { + log::trace!( + target: "xcm::fungible_adapter", + "deposit_asset what: {:?}, who: {:?}", + what, who, + ); + let amount = Matcher::matches_fungible(what).ok_or(MatchError::AssetNotHandled)?; + let who = AccountIdConverter::convert_location(who) + .ok_or(MatchError::AccountIdConversionFailed)?; + Fungible::burn_from(&who, amount, Exact, Polite) + .map_err(|error| XcmError::FailedToTransactAsset(error.into()))?; + Ok(what.clone().into()) + } +} + +/// [`TransactAsset`] implementation that allows the use of a [`fungible`] implementation for +/// handling an asset in the XCM executor. +/// Works for everything, transfers and teleport bookkeeping. +pub struct FungibleAdapter( + PhantomData<(Fungible, Matcher, AccountIdConverter, AccountId, CheckingAccount)>, +); +impl< + Fungible: fungible::Mutate, + Matcher: MatchesFungible, + AccountIdConverter: ConvertLocation, + AccountId: Eq + Clone, + CheckingAccount: Get>, + > TransactAsset + for FungibleAdapter +{ + fn can_check_in(origin: &MultiLocation, what: &MultiAsset, context: &XcmContext) -> XcmResult { + FungibleMutateAdapter::< + Fungible, + Matcher, + AccountIdConverter, + AccountId, + CheckingAccount, + >::can_check_in(origin, what, context) + } + + fn check_in(origin: &MultiLocation, what: &MultiAsset, context: &XcmContext) { + FungibleMutateAdapter::< + Fungible, + Matcher, + AccountIdConverter, + AccountId, + CheckingAccount, + >::check_in(origin, what, context) + } + + fn can_check_out(dest: &MultiLocation, what: &MultiAsset, context: &XcmContext) -> XcmResult { + FungibleMutateAdapter::< + Fungible, + Matcher, + AccountIdConverter, + AccountId, + CheckingAccount, + >::can_check_out(dest, what, context) + } + + fn check_out(dest: &MultiLocation, what: &MultiAsset, context: &XcmContext) { + FungibleMutateAdapter::< + Fungible, + Matcher, + AccountIdConverter, + AccountId, + CheckingAccount, + >::check_out(dest, what, context) + } + + fn deposit_asset( + what: &MultiAsset, + who: &MultiLocation, + context: Option<&XcmContext>, + ) -> XcmResult { + FungibleMutateAdapter::< + Fungible, + Matcher, + AccountIdConverter, + AccountId, + CheckingAccount, + >::deposit_asset(what, who, context) + } + + fn withdraw_asset( + what: &MultiAsset, + who: &MultiLocation, + maybe_context: Option<&XcmContext>, + ) -> result::Result { + FungibleMutateAdapter::< + Fungible, + Matcher, + AccountIdConverter, + AccountId, + CheckingAccount, + >::withdraw_asset(what, who, maybe_context) + } + + fn internal_transfer_asset( + what: &MultiAsset, + from: &MultiLocation, + to: &MultiLocation, + context: &XcmContext, + ) -> result::Result { + FungibleTransferAdapter::::internal_transfer_asset( + what, from, to, context + ) + } +} diff --git a/polkadot/xcm/xcm-builder/src/lib.rs b/polkadot/xcm/xcm-builder/src/lib.rs index 455f17a5348..e7431ae0254 100644 --- a/polkadot/xcm/xcm-builder/src/lib.rs +++ b/polkadot/xcm/xcm-builder/src/lib.rs @@ -65,6 +65,7 @@ mod process_xcm_message; pub use process_xcm_message::ProcessXcmMessage; mod currency_adapter; +#[allow(deprecated)] pub use currency_adapter::CurrencyAdapter; mod fee_handling; @@ -72,6 +73,9 @@ pub use fee_handling::{ deposit_or_burn_fee, HandleFee, XcmFeeManagerFromComponents, XcmFeeToAccount, }; +mod fungible_adapter; +pub use fungible_adapter::{FungibleAdapter, FungibleMutateAdapter, FungibleTransferAdapter}; + mod fungibles_adapter; pub use fungibles_adapter::{ AssetChecking, DualMint, FungiblesAdapter, FungiblesMutateAdapter, FungiblesTransferAdapter, diff --git a/polkadot/xcm/xcm-builder/tests/mock/mod.rs b/polkadot/xcm/xcm-builder/tests/mock/mod.rs index 968b294c6a4..6b4d893f73c 100644 --- a/polkadot/xcm/xcm-builder/tests/mock/mod.rs +++ b/polkadot/xcm/xcm-builder/tests/mock/mod.rs @@ -32,12 +32,14 @@ use xcm_executor::XcmExecutor; use staging_xcm_builder as xcm_builder; +#[allow(deprecated)] +use xcm_builder::CurrencyAdapter as XcmCurrencyAdapter; use xcm_builder::{ AccountId32Aliases, AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom, ChildParachainAsNative, ChildParachainConvertsVia, ChildSystemParachainAsSuperuser, - CurrencyAdapter as XcmCurrencyAdapter, FixedRateOfFungible, FixedWeightBounds, - IsChildSystemParachain, IsConcrete, MintLocation, RespectSuspension, SignedAccountId32AsNative, - SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, + FixedRateOfFungible, FixedWeightBounds, IsChildSystemParachain, IsConcrete, MintLocation, + RespectSuspension, SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, + TakeWeightCredit, }; pub type AccountId = AccountId32; @@ -143,6 +145,7 @@ parameter_types! { pub type SovereignAccountOf = (ChildParachainConvertsVia, AccountId32Aliases); +#[allow(deprecated)] pub type LocalCurrencyAdapter = XcmCurrencyAdapter< Balances, IsConcrete, diff --git a/polkadot/xcm/xcm-simulator/example/src/parachain.rs b/polkadot/xcm/xcm-simulator/example/src/parachain.rs index 951e946372d..34828a4d2c0 100644 --- a/polkadot/xcm/xcm-simulator/example/src/parachain.rs +++ b/polkadot/xcm/xcm-simulator/example/src/parachain.rs @@ -40,10 +40,9 @@ use polkadot_parachain_primitives::primitives::{ use xcm::{latest::prelude::*, VersionedXcm}; use xcm_builder::{ Account32Hash, AccountId32Aliases, AllowUnpaidExecutionFrom, ConvertedConcreteId, - CurrencyAdapter as XcmCurrencyAdapter, EnsureXcmOrigin, FixedRateOfFungible, FixedWeightBounds, - IsConcrete, NativeAsset, NoChecking, NonFungiblesAdapter, ParentIsPreset, - SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, - SovereignSignedViaLocation, + EnsureXcmOrigin, FixedRateOfFungible, FixedWeightBounds, FungibleAdapter, IsConcrete, + NativeAsset, NoChecking, NonFungiblesAdapter, ParentIsPreset, SiblingParachainConvertsVia, + SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, }; use xcm_executor::{ traits::{ConvertLocation, JustTry}, @@ -202,7 +201,7 @@ parameter_types! { } pub type LocalAssetTransactor = ( - XcmCurrencyAdapter, LocationToAccountId, AccountId, ()>, + FungibleAdapter, LocationToAccountId, AccountId, ()>, NonFungiblesAdapter< ForeignUniques, ConvertedConcreteId, diff --git a/polkadot/xcm/xcm-simulator/example/src/relay_chain.rs b/polkadot/xcm/xcm-simulator/example/src/relay_chain.rs index 20070d192b5..24fc56eb717 100644 --- a/polkadot/xcm/xcm-simulator/example/src/relay_chain.rs +++ b/polkadot/xcm/xcm-simulator/example/src/relay_chain.rs @@ -36,9 +36,9 @@ use xcm::latest::prelude::*; use xcm_builder::{ Account32Hash, AccountId32Aliases, AllowUnpaidExecutionFrom, AsPrefixedGeneralIndex, ChildParachainAsNative, ChildParachainConvertsVia, ChildSystemParachainAsSuperuser, - ConvertedConcreteId, CurrencyAdapter as XcmCurrencyAdapter, FixedRateOfFungible, - FixedWeightBounds, IsConcrete, NoChecking, NonFungiblesAdapter, SignedAccountId32AsNative, - SignedToAccountId32, SovereignSignedViaLocation, + ConvertedConcreteId, FixedRateOfFungible, FixedWeightBounds, FungibleAdapter, IsConcrete, + NoChecking, NonFungiblesAdapter, SignedAccountId32AsNative, SignedToAccountId32, + SovereignSignedViaLocation, }; use xcm_executor::{traits::JustTry, Config, XcmExecutor}; @@ -141,7 +141,7 @@ pub type LocationToAccountId = ( ); pub type LocalAssetTransactor = ( - XcmCurrencyAdapter, LocationToAccountId, AccountId, ()>, + FungibleAdapter, LocationToAccountId, AccountId, ()>, NonFungiblesAdapter< Uniques, ConvertedConcreteId, JustTry>, diff --git a/polkadot/xcm/xcm-simulator/fuzzer/src/parachain.rs b/polkadot/xcm/xcm-simulator/fuzzer/src/parachain.rs index 0aa1b54f5e7..2262d18e860 100644 --- a/polkadot/xcm/xcm-simulator/fuzzer/src/parachain.rs +++ b/polkadot/xcm/xcm-simulator/fuzzer/src/parachain.rs @@ -37,11 +37,12 @@ use polkadot_parachain_primitives::primitives::{ DmpMessageHandler, Id as ParaId, Sibling, XcmpMessageFormat, XcmpMessageHandler, }; use xcm::{latest::prelude::*, VersionedXcm}; +#[allow(deprecated)] +use xcm_builder::CurrencyAdapter as XcmCurrencyAdapter; use xcm_builder::{ - AccountId32Aliases, AllowUnpaidExecutionFrom, CurrencyAdapter as XcmCurrencyAdapter, - EnsureXcmOrigin, FixedRateOfFungible, FixedWeightBounds, IsConcrete, NativeAsset, - ParentIsPreset, SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, - SovereignSignedViaLocation, + AccountId32Aliases, AllowUnpaidExecutionFrom, EnsureXcmOrigin, FixedRateOfFungible, + FixedWeightBounds, IsConcrete, NativeAsset, ParentIsPreset, SiblingParachainConvertsVia, + SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, }; use xcm_executor::{Config, XcmExecutor}; @@ -132,6 +133,7 @@ parameter_types! { pub const MaxAssetsIntoHolding: u32 = 64; } +#[allow(deprecated)] pub type LocalAssetTransactor = XcmCurrencyAdapter, LocationToAccountId, AccountId, ()>; diff --git a/polkadot/xcm/xcm-simulator/fuzzer/src/relay_chain.rs b/polkadot/xcm/xcm-simulator/fuzzer/src/relay_chain.rs index 085773f3073..bbf4f1e6cc5 100644 --- a/polkadot/xcm/xcm-simulator/fuzzer/src/relay_chain.rs +++ b/polkadot/xcm/xcm-simulator/fuzzer/src/relay_chain.rs @@ -33,11 +33,13 @@ use polkadot_runtime_parachains::{ origin, shared, }; use xcm::latest::prelude::*; +#[allow(deprecated)] +use xcm_builder::CurrencyAdapter as XcmCurrencyAdapter; use xcm_builder::{ AccountId32Aliases, AllowUnpaidExecutionFrom, ChildParachainAsNative, - ChildParachainConvertsVia, ChildSystemParachainAsSuperuser, - CurrencyAdapter as XcmCurrencyAdapter, FixedRateOfFungible, FixedWeightBounds, IsConcrete, - SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, + ChildParachainConvertsVia, ChildSystemParachainAsSuperuser, FixedRateOfFungible, + FixedWeightBounds, IsConcrete, SignedAccountId32AsNative, SignedToAccountId32, + SovereignSignedViaLocation, }; use xcm_executor::{Config, XcmExecutor}; @@ -114,6 +116,7 @@ parameter_types! { pub type SovereignAccountOf = (ChildParachainConvertsVia, AccountId32Aliases); +#[allow(deprecated)] pub type LocalAssetTransactor = XcmCurrencyAdapter, SovereignAccountOf, AccountId, ()>; diff --git a/prdoc/pr_2684.prdoc b/prdoc/pr_2684.prdoc new file mode 100644 index 00000000000..8960b6460f0 --- /dev/null +++ b/prdoc/pr_2684.prdoc @@ -0,0 +1,14 @@ +title: Add XCM FungibleAdapter + +doc: + - audience: Runtime Dev + description: | + A new AssetTransactor has been added to xcm-builder: FungibleAdapter. + It's meant to be used instead of the old CurrencyAdapter for configuring the XCM executor + to handle only one asset. + +crates: + - name: "xcm-builder" + +migrations: [] +host_functions: [] diff --git a/substrate/frame/contracts/mock-network/src/parachain.rs b/substrate/frame/contracts/mock-network/src/parachain.rs index 2ef579276ae..a79b7e4e2d6 100644 --- a/substrate/frame/contracts/mock-network/src/parachain.rs +++ b/substrate/frame/contracts/mock-network/src/parachain.rs @@ -37,12 +37,13 @@ use sp_runtime::traits::{Get, IdentityLookup, MaybeEquivalence}; use sp_std::prelude::*; use xcm::latest::prelude::*; +#[allow(deprecated)] +use xcm_builder::CurrencyAdapter as XcmCurrencyAdapter; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowTopLevelPaidExecutionFrom, - ConvertedConcreteId, CurrencyAdapter as XcmCurrencyAdapter, EnsureXcmOrigin, - FixedRateOfFungible, FixedWeightBounds, FungiblesAdapter, IsConcrete, NativeAsset, NoChecking, - ParentAsSuperuser, ParentIsPreset, SignedAccountId32AsNative, SignedToAccountId32, - SovereignSignedViaLocation, WithComputedOrigin, + ConvertedConcreteId, EnsureXcmOrigin, FixedRateOfFungible, FixedWeightBounds, FungiblesAdapter, + IsConcrete, NativeAsset, NoChecking, ParentAsSuperuser, ParentIsPreset, + SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, WithComputedOrigin, }; use xcm_executor::{traits::JustTry, Config, XcmExecutor}; @@ -183,6 +184,7 @@ pub fn estimate_fee_for_weight(weight: Weight) -> u128 { units_per_mb * (weight.proof_size() as u128) / (WEIGHT_PROOF_SIZE_PER_MB as u128) } +#[allow(deprecated)] pub type LocalBalancesTransactor = XcmCurrencyAdapter, SovereignAccountOf, AccountId, ()>; diff --git a/substrate/frame/contracts/mock-network/src/relay_chain.rs b/substrate/frame/contracts/mock-network/src/relay_chain.rs index 17e36eada25..136cc2e3ed6 100644 --- a/substrate/frame/contracts/mock-network/src/relay_chain.rs +++ b/substrate/frame/contracts/mock-network/src/relay_chain.rs @@ -29,12 +29,14 @@ use sp_runtime::traits::IdentityLookup; use polkadot_parachain_primitives::primitives::Id as ParaId; use polkadot_runtime_parachains::{configuration, origin, shared}; use xcm::latest::prelude::*; +#[allow(deprecated)] +use xcm_builder::CurrencyAdapter as XcmCurrencyAdapter; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, ChildParachainAsNative, ChildParachainConvertsVia, - ChildSystemParachainAsSuperuser, CurrencyAdapter as XcmCurrencyAdapter, DescribeAllTerminal, - DescribeFamily, FixedRateOfFungible, FixedWeightBounds, HashedDescription, IsConcrete, - SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, WithComputedOrigin, + ChildSystemParachainAsSuperuser, DescribeAllTerminal, DescribeFamily, FixedRateOfFungible, + FixedWeightBounds, HashedDescription, IsConcrete, SignedAccountId32AsNative, + SignedToAccountId32, SovereignSignedViaLocation, WithComputedOrigin, }; use xcm_executor::{Config, XcmExecutor}; @@ -116,6 +118,7 @@ pub type SovereignAccountOf = ( ChildParachainConvertsVia, ); +#[allow(deprecated)] pub type LocalBalancesTransactor = XcmCurrencyAdapter, SovereignAccountOf, AccountId, ()>; -- GitLab From 097308e385eca6da20dcef79f1a00f21d4dd5dae Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Thu, 14 Dec 2023 17:54:26 +0300 Subject: [PATCH 035/191] Add Rococo People <> Rococo Bulletin bridge support to Rococo Bridge Hub (#2540) This PR adds [Rococo People](https://github.com/paritytech/polkadot-sdk/pull/2281) <> [Rococo Bulletin](https://github.com/zdave-parity/polkadot-bulletin-chain) to the Rococo Bridge Hub code. There's a couple of things left to do here: - [x] add remaining tests - it'd need some refactoring in the `bridge-hub-test-utils` - will do in a separate PR; - [x] actually run benchmarks for new messaging pallet (do we have bot nowadays?). The reason why I'm opening it before this ^^^ is ready, is that I'd like to hear others opinion on how to deal with hacks with that bridge. Initially I was assuming that Rococo Bulletin will be the 1:1 copy of the Polkadot Bulletin (to avoid maintaining multiple runtimes/releases/...), so you can see many `PolkadotBulletin` mentions in this PR, even though we are going to bridge with the parallel chain (`RococoBulletin`). That's because e.g. pallet names from `construct_runtime` are affecting runtime storage keys and bridges are using runtime storage proofs => it is important to use names that the Bulletin chain expects. But in the end, this hack won't work - we can't use Polkadot Bulletin runtime to bridge with Rococo Bridge Hub, because Polkadot Bulletin expects Polkadot Bridge hub to use `1002` parachain id and Rococo Bridge Hub seats on the `1013`. This also affects storage keys using in bridging, so I had to add the [`rococo` feature](https://github.com/svyatonik/polkadot-bulletin-chain/blob/add-bridge-pallets/runtime/Cargo.toml#L198) to the Bulletin chain. So now we can actually alter its runtime and adapt it for Rococo. So the question here is - what's better for us here - to leave everything as is (seems hacky and non-trivial); - change Bulletin chain runtime when `rococo` feature is used - e.g. use proper names there (`WithPolkadotGrandpa` -> `WithRococoGrandpa`, ...) - add another set of pallets to the Bulletin chain runtime to bridge with Rococo and never use them in production. Similar to hack that we had in Rococo/Wococo cc @acatangiu @bkontur @serban300 also cc @joepetrowski as the main "client" of this bridge --- A couple words on how this bridge is different from the Rococo <> Westend bridge: - it is a bridge with a chain that uses GRANDPA finality, not the parachain finality (hence the tests needs to be changed); - it is a fee-free bridge. So `AllowExplicitUnpaidExecutionFrom>` + we are not paying any rewards to relayers (apart from compensating transaction costs). --------- Signed-off-by: dependabot[bot] Signed-off-by: Andrei Sandu Co-authored-by: Adrian Catangiu Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Andrei Sandu <54316454+sandreim@users.noreply.github.com> Co-authored-by: Egor_P Co-authored-by: command-bot <> --- Cargo.lock | 2 + bridges/modules/messages/src/weights_ext.rs | 3 +- .../chain-bridge-hub-rococo/src/lib.rs | 2 + .../bridge-hubs/bridge-hub-rococo/Cargo.toml | 4 + .../src/bridge_common_config.rs | 39 ++- .../src/bridge_to_bulletin_config.rs | 292 ++++++++++++++++++ .../src/bridge_to_westend_config.rs | 26 +- .../bridge-hubs/bridge-hub-rococo/src/lib.rs | 133 +++++++- .../bridge-hub-rococo/src/weights/mod.rs | 24 +- ...idge_messages_rococo_to_rococo_bulletin.rs | 221 +++++++++++++ ...llet_bridge_messages_rococo_to_westend.rs} | 69 +++-- .../bridge-hub-rococo/src/xcm_config.rs | 18 +- .../bridge-hub-rococo/tests/tests.rs | 287 ++++++++++++++--- polkadot/runtime/rococo/constants/src/lib.rs | 2 + 14 files changed, 1000 insertions(+), 122 deletions(-) create mode 100644 cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_bulletin_config.rs create mode 100644 cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages_rococo_to_rococo_bulletin.rs rename cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/{pallet_bridge_messages.rs => pallet_bridge_messages_rococo_to_westend.rs} (90%) diff --git a/Cargo.lock b/Cargo.lock index 40e2d9ebf3d..b5df40a5d17 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1894,11 +1894,13 @@ version = "0.1.0" dependencies = [ "bp-asset-hub-rococo", "bp-asset-hub-westend", + "bp-bridge-hub-polkadot", "bp-bridge-hub-rococo", "bp-bridge-hub-westend", "bp-header-chain", "bp-messages", "bp-parachains", + "bp-polkadot-bulletin", "bp-polkadot-core", "bp-relayers", "bp-rococo", diff --git a/bridges/modules/messages/src/weights_ext.rs b/bridges/modules/messages/src/weights_ext.rs index aeb3a581a69..c12e04f692b 100644 --- a/bridges/modules/messages/src/weights_ext.rs +++ b/bridges/modules/messages/src/weights_ext.rs @@ -60,7 +60,8 @@ pub fn ensure_weights_are_correct() { // W::receive_messages_delivery_proof_messages_overhead(1).ref_time() may be zero because: // there's no code that iterates over confirmed messages in confirmation transaction assert_eq!(W::receive_messages_delivery_proof_messages_overhead(1).proof_size(), 0); - assert_ne!(W::receive_messages_delivery_proof_relayers_overhead(1).ref_time(), 0); + // W::receive_messages_delivery_proof_relayers_overhead(1).ref_time() may be zero because: + // runtime **can** choose not to pay any rewards to relayers // W::receive_messages_delivery_proof_relayers_overhead(1).proof_size() is an exception // it may or may not cause additional db reads, so proof size may vary assert_ne!(W::storage_proof_size_overhead(1).ref_time(), 0); diff --git a/bridges/primitives/chain-bridge-hub-rococo/src/lib.rs b/bridges/primitives/chain-bridge-hub-rococo/src/lib.rs index 59d293edf1c..1fe44597c3d 100644 --- a/bridges/primitives/chain-bridge-hub-rococo/src/lib.rs +++ b/bridges/primitives/chain-bridge-hub-rococo/src/lib.rs @@ -76,6 +76,8 @@ pub const WITH_BRIDGE_HUB_ROCOCO_RELAYERS_PALLET_NAME: &str = "BridgeRelayers"; /// Pallet index of `BridgeWestendMessages: pallet_bridge_messages::`. pub const WITH_BRIDGE_ROCOCO_TO_WESTEND_MESSAGES_PALLET_INDEX: u8 = 51; +/// Pallet index of `BridgePolkadotBulletinMessages: pallet_bridge_messages::`. +pub const WITH_BRIDGE_ROCOCO_TO_BULLETIN_MESSAGES_PALLET_INDEX: u8 = 61; decl_bridge_finality_runtime_apis!(bridge_hub_rococo); decl_bridge_messages_runtime_apis!(bridge_hub_rococo); diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml index 7902ca76b16..f8b279e3e3d 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml @@ -87,11 +87,13 @@ parachains-common = { path = "../../../common", default-features = false } # Bridges bp-asset-hub-rococo = { path = "../../../../../bridges/primitives/chain-asset-hub-rococo", default-features = false } bp-asset-hub-westend = { path = "../../../../../bridges/primitives/chain-asset-hub-westend", default-features = false } +bp-bridge-hub-polkadot = { path = "../../../../../bridges/primitives/chain-bridge-hub-polkadot", default-features = false } bp-bridge-hub-rococo = { path = "../../../../../bridges/primitives/chain-bridge-hub-rococo", default-features = false } bp-bridge-hub-westend = { path = "../../../../../bridges/primitives/chain-bridge-hub-westend", default-features = false } bp-header-chain = { path = "../../../../../bridges/primitives/header-chain", default-features = false } bp-messages = { path = "../../../../../bridges/primitives/messages", default-features = false } bp-parachains = { path = "../../../../../bridges/primitives/parachains", default-features = false } +bp-polkadot-bulletin = { path = "../../../../../bridges/primitives/chain-polkadot-bulletin", default-features = false } bp-polkadot-core = { path = "../../../../../bridges/primitives/polkadot-core", default-features = false } bp-relayers = { path = "../../../../../bridges/primitives/relayers", default-features = false } bp-runtime = { path = "../../../../../bridges/primitives/runtime", default-features = false } @@ -117,11 +119,13 @@ default = ["std"] std = [ "bp-asset-hub-rococo/std", "bp-asset-hub-westend/std", + "bp-bridge-hub-polkadot/std", "bp-bridge-hub-rococo/std", "bp-bridge-hub-westend/std", "bp-header-chain/std", "bp-messages/std", "bp-parachains/std", + "bp-polkadot-bulletin/std", "bp-polkadot-core/std", "bp-relayers/std", "bp-rococo/std", diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_common_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_common_config.rs index 8153e52beac..93ef9470363 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_common_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_common_config.rs @@ -21,15 +21,20 @@ //! For example, the messaging pallet needs to know the sending and receiving chains, but the //! GRANDPA tracking pallet only needs to be aware of one chain. -use super::{weights, AccountId, Balance, Balances, BlockNumber, Runtime, RuntimeEvent}; +use super::{ + weights, AccountId, Balance, Balances, BlockNumber, Runtime, RuntimeEvent, RuntimeOrigin, +}; use bp_parachains::SingleParaStoredHeaderDataBuilder; +use bp_runtime::UnderlyingChainProvider; +use bridge_runtime_common::messages::ThisChainWithMessages; use frame_support::{parameter_types, traits::ConstU32}; +use sp_runtime::RuntimeDebug; parameter_types! { pub const RelayChainHeadersToKeep: u32 = 1024; pub const ParachainHeadsToKeep: u32 = 64; - pub const WestendBridgeParachainPalletName: &'static str = "Paras"; + pub const WestendBridgeParachainPalletName: &'static str = bp_westend::PARAS_PALLET_NAME; pub const MaxWestendParaHeadDataSize: u32 = bp_westend::MAX_NESTED_PARACHAIN_HEAD_DATA_SIZE; pub storage RequiredStakeForStakeAndSlash: Balance = 1_000_000; @@ -78,3 +83,33 @@ impl pallet_bridge_relayers::Config for Runtime { >; type WeightInfo = weights::pallet_bridge_relayers::WeightInfo; } + +/// Add GRANDPA bridge pallet to track Rococo Bulletin chain. +pub type BridgeGrandpaRococoBulletinInstance = pallet_bridge_grandpa::Instance4; +impl pallet_bridge_grandpa::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type BridgedChain = bp_polkadot_bulletin::PolkadotBulletin; + type MaxFreeMandatoryHeadersPerBlock = ConstU32<4>; + type HeadersToKeep = RelayChainHeadersToKeep; + // Technically this is incorrect - we have two pallet instances and ideally we shall + // benchmark every instance separately. But the benchmarking engine has a flaw - it + // messes with components. E.g. in Kusama maximal validators count is 1024 and in + // Bulletin chain it is 100. But benchmarking engine runs Bulletin benchmarks using + // components range, computed for Kusama => it causes an error. + // + // In practice, however, GRANDPA pallet works the same way for all bridged chains, so + // weights are also the same for both bridges. + type WeightInfo = weights::pallet_bridge_grandpa::WeightInfo; +} + +/// BridgeHubRococo chain from message lane point of view. +#[derive(RuntimeDebug, Clone, Copy)] +pub struct BridgeHubRococo; + +impl UnderlyingChainProvider for BridgeHubRococo { + type Chain = bp_bridge_hub_rococo::BridgeHubRococo; +} + +impl ThisChainWithMessages for BridgeHubRococo { + type RuntimeOrigin = RuntimeOrigin; +} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_bulletin_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_bulletin_config.rs new file mode 100644 index 00000000000..c9d7f60e71a --- /dev/null +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_bulletin_config.rs @@ -0,0 +1,292 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +//! Bridge definitions used on BridgeHubRococo for bridging to Rococo Bulletin. +//! +//! Rococo Bulletin chain will be the 1:1 copy of the Polkadot Bulletin, so we +//! are reusing Polkadot Bulletin chain primitives everywhere here. + +use crate::{ + bridge_common_config::{BridgeGrandpaRococoBulletinInstance, BridgeHubRococo}, + weights, + xcm_config::UniversalLocation, + AccountId, BridgeRococoBulletinGrandpa, BridgeRococoBulletinMessages, PolkadotXcm, Runtime, + RuntimeEvent, XcmOverRococoBulletin, XcmRouter, +}; +use bp_messages::LaneId; +use bridge_runtime_common::{ + messages, + messages::{ + source::{FromBridgedChainMessagesDeliveryProof, TargetHeaderChainAdapter}, + target::{FromBridgedChainMessagesProof, SourceHeaderChainAdapter}, + MessageBridge, UnderlyingChainProvider, + }, + messages_xcm_extension::{ + SenderAndLane, XcmAsPlainPayload, XcmBlobHauler, XcmBlobHaulerAdapter, + XcmBlobMessageDispatch, XcmVersionOfDestAndRemoteBridge, + }, + refund_relayer_extension::{ + ActualFeeRefund, RefundBridgedGrandpaMessages, RefundSignedExtensionAdapter, + RefundableMessagesLane, + }, +}; + +use frame_support::{parameter_types, traits::PalletInfoAccess}; +use sp_runtime::RuntimeDebug; +use xcm::{ + latest::prelude::*, + prelude::{InteriorMultiLocation, NetworkId}, +}; +use xcm_builder::BridgeBlobDispatcher; + +parameter_types! { + /// Maximal number of entries in the unrewarded relayers vector at the Rococo Bridge Hub. It matches the + /// maximal number of unrewarded relayers that the single confirmation transaction at Rococo Bulletin Chain + /// may process. + pub const MaxUnrewardedRelayerEntriesAtInboundLane: bp_messages::MessageNonce = + bp_polkadot_bulletin::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX; + /// Maximal number of unconfirmed messages at the Rococo Bridge Hub. It matches the maximal number of + /// unconfirmed messages that the single confirmation transaction at Rococo Bulletin Chain may process. + pub const MaxUnconfirmedMessagesAtInboundLane: bp_messages::MessageNonce = + bp_polkadot_bulletin::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX; + /// Bridge specific chain (network) identifier of the Rococo Bulletin Chain. + pub const RococoBulletinChainId: bp_runtime::ChainId = bp_runtime::POLKADOT_BULLETIN_CHAIN_ID; + /// Interior location (relative to this runtime) of the with-RococoBulletin messages pallet. + pub BridgeRococoToRococoBulletinMessagesPalletInstance: InteriorMultiLocation = X1( + PalletInstance(::index() as u8) + ); + /// Rococo Bulletin Network identifier. + pub RococoBulletinGlobalConsensusNetwork: NetworkId = NetworkId::PolkadotBulletin; + /// Relative location of the Rococo Bulletin chain. + pub RococoBulletinGlobalConsensusNetworkLocation: MultiLocation = MultiLocation { + parents: 2, + interior: X1(GlobalConsensus(RococoBulletinGlobalConsensusNetwork::get())) + }; + /// All active lanes that the current bridge supports. + pub ActiveOutboundLanesToRococoBulletin: &'static [bp_messages::LaneId] + = &[XCM_LANE_FOR_ROCOCO_PEOPLE_TO_ROCOCO_BULLETIN]; + /// Lane identifier, used to connect Rococo People and Rococo Bulletin chain. + pub const RococoPeopleToRococoBulletinMessagesLane: bp_messages::LaneId + = XCM_LANE_FOR_ROCOCO_PEOPLE_TO_ROCOCO_BULLETIN; + + /// Priority boost that the registered relayer receives for every additional message in the message + /// delivery transaction. + /// + /// It is determined semi-automatically - see `FEE_BOOST_PER_MESSAGE` constant to get the + /// meaning of this value. + pub PriorityBoostPerMessage: u64 = 182_044_444_444_444; + + /// Identifier of the sibling Rococo People parachain. + pub RococoPeopleParaId: cumulus_primitives_core::ParaId = rococo_runtime_constants::system_parachain::PEOPLE_ID.into(); + /// A route (XCM location and bridge lane) that the Rococo People Chain -> Rococo Bulletin Chain + /// message is following. + pub FromRococoPeopleToRococoBulletinRoute: SenderAndLane = SenderAndLane::new( + ParentThen(X1(Parachain(RococoPeopleParaId::get().into()))).into(), + XCM_LANE_FOR_ROCOCO_PEOPLE_TO_ROCOCO_BULLETIN, + ); + /// All active routes and their destinations. + pub ActiveLanes: sp_std::vec::Vec<(SenderAndLane, (NetworkId, InteriorMultiLocation))> = sp_std::vec![ + ( + FromRococoPeopleToRococoBulletinRoute::get(), + (RococoBulletinGlobalConsensusNetwork::get(), Here) + ) + ]; + + /// XCM message that is never sent. + pub NeverSentMessage: Option> = None; +} +pub const XCM_LANE_FOR_ROCOCO_PEOPLE_TO_ROCOCO_BULLETIN: LaneId = LaneId([0, 0, 0, 0]); + +/// Proof of messages, coming from Rococo Bulletin chain. +pub type FromRococoBulletinMessagesProof = + FromBridgedChainMessagesProof; +/// Messages delivery proof for Rococo Bridge Hub -> Rococo Bulletin messages. +pub type ToRococoBulletinMessagesDeliveryProof = + FromBridgedChainMessagesDeliveryProof; + +/// Dispatches received XCM messages from other bridge. +type FromRococoBulletinMessageBlobDispatcher = BridgeBlobDispatcher< + XcmRouter, + UniversalLocation, + BridgeRococoToRococoBulletinMessagesPalletInstance, +>; + +/// Export XCM messages to be relayed to the other side +pub type ToRococoBulletinHaulBlobExporter = XcmOverRococoBulletin; + +pub struct ToRococoBulletinXcmBlobHauler; +impl XcmBlobHauler for ToRococoBulletinXcmBlobHauler { + type Runtime = Runtime; + type MessagesInstance = WithRococoBulletinMessagesInstance; + type ToSourceChainSender = XcmRouter; + type CongestedMessage = NeverSentMessage; + type UncongestedMessage = NeverSentMessage; +} + +/// On messages delivered callback. +type OnMessagesDeliveredFromRococoBulletin = + XcmBlobHaulerAdapter; + +/// Messaging Bridge configuration for BridgeHubRococo -> Rococo Bulletin. +pub struct WithRococoBulletinMessageBridge; +impl MessageBridge for WithRococoBulletinMessageBridge { + // Bulletin chain assumes it is bridged with Polkadot Bridge Hub + const BRIDGED_MESSAGES_PALLET_NAME: &'static str = + bp_bridge_hub_polkadot::WITH_BRIDGE_HUB_POLKADOT_MESSAGES_PALLET_NAME; + type ThisChain = BridgeHubRococo; + type BridgedChain = RococoBulletin; + type BridgedHeaderChain = BridgeRococoBulletinGrandpa; +} + +/// Message verifier for RococoBulletin messages sent from BridgeHubRococo. +pub type ToRococoBulletinMessageVerifier = + messages::source::FromThisChainMessageVerifier; + +/// Maximal outbound payload size of BridgeHubRococo -> RococoBulletin messages. +pub type ToRococoBulletinMaximalOutboundPayloadSize = + messages::source::FromThisChainMaximalOutboundPayloadSize; + +/// RococoBulletin chain from message lane point of view. +#[derive(RuntimeDebug, Clone, Copy)] +pub struct RococoBulletin; + +impl UnderlyingChainProvider for RococoBulletin { + type Chain = bp_polkadot_bulletin::PolkadotBulletin; +} + +impl messages::BridgedChainWithMessages for RococoBulletin {} + +/// Signed extension that refunds relayers that are delivering messages from the Rococo Bulletin +/// chain. +pub type OnBridgeHubRococoRefundRococoBulletinMessages = RefundSignedExtensionAdapter< + RefundBridgedGrandpaMessages< + Runtime, + BridgeGrandpaRococoBulletinInstance, + RefundableMessagesLane< + WithRococoBulletinMessagesInstance, + RococoPeopleToRococoBulletinMessagesLane, + >, + ActualFeeRefund, + PriorityBoostPerMessage, + StrOnBridgeHubRococoRefundRococoBulletinMessages, + >, +>; +bp_runtime::generate_static_str_provider!(OnBridgeHubRococoRefundRococoBulletinMessages); + +/// Add XCM messages support for BridgeHubRococo to support Rococo->Rococo Bulletin XCM messages. +pub type WithRococoBulletinMessagesInstance = pallet_bridge_messages::Instance4; +impl pallet_bridge_messages::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type WeightInfo = + weights::pallet_bridge_messages_rococo_to_rococo_bulletin::WeightInfo; + type BridgedChainId = RococoBulletinChainId; + type ActiveOutboundLanes = ActiveOutboundLanesToRococoBulletin; + type MaxUnrewardedRelayerEntriesAtInboundLane = MaxUnrewardedRelayerEntriesAtInboundLane; + type MaxUnconfirmedMessagesAtInboundLane = MaxUnconfirmedMessagesAtInboundLane; + + type MaximalOutboundPayloadSize = ToRococoBulletinMaximalOutboundPayloadSize; + type OutboundPayload = XcmAsPlainPayload; + + type InboundPayload = XcmAsPlainPayload; + type InboundRelayer = AccountId; + type DeliveryPayments = (); + + type TargetHeaderChain = TargetHeaderChainAdapter; + type LaneMessageVerifier = ToRococoBulletinMessageVerifier; + type DeliveryConfirmationPayments = (); + + type SourceHeaderChain = SourceHeaderChainAdapter; + type MessageDispatch = + XcmBlobMessageDispatch; + type OnMessagesDelivered = OnMessagesDeliveredFromRococoBulletin; +} + +/// Add support for the export and dispatch of XCM programs. +pub type XcmOverPolkadotBulletinInstance = pallet_xcm_bridge_hub::Instance2; +impl pallet_xcm_bridge_hub::Config for Runtime { + type UniversalLocation = UniversalLocation; + type BridgedNetwork = RococoBulletinGlobalConsensusNetworkLocation; + type BridgeMessagesPalletInstance = WithRococoBulletinMessagesInstance; + type MessageExportPrice = (); + type DestinationVersion = + XcmVersionOfDestAndRemoteBridge; + type Lanes = ActiveLanes; + type LanesSupport = ToRococoBulletinXcmBlobHauler; +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::bridge_common_config::BridgeGrandpaRococoBulletinInstance; + use bridge_runtime_common::{ + assert_complete_bridge_types, integrity::check_message_lane_weights, + }; + use parachains_common::{rococo, Balance}; + + /// Every additional message in the message delivery transaction boosts its priority. + /// So the priority of transaction with `N+1` messages is larger than priority of + /// transaction with `N` messages by the `PriorityBoostPerMessage`. + /// + /// Economically, it is an equivalent of adding tip to the transaction with `N` messages. + /// The `FEE_BOOST_PER_MESSAGE` constant is the value of this tip. + /// + /// We want this tip to be large enough (delivery transactions with more messages = less + /// operational costs and a faster bridge), so this value should be significant. + const FEE_BOOST_PER_MESSAGE: Balance = 2 * rococo::currency::UNITS; + + #[test] + fn ensure_bridge_hub_rococo_message_lane_weights_are_correct() { + check_message_lane_weights::< + bp_bridge_hub_rococo::BridgeHubRococo, + Runtime, + WithRococoBulletinMessagesInstance, + >( + bp_polkadot_bulletin::EXTRA_STORAGE_PROOF_SIZE, + bp_bridge_hub_rococo::MAX_UNREWARDED_RELAYERS_IN_CONFIRMATION_TX, + bp_bridge_hub_rococo::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX, + true, + ); + } + + #[test] + fn ensure_bridge_integrity() { + assert_complete_bridge_types!( + runtime: Runtime, + with_bridged_chain_grandpa_instance: BridgeGrandpaRococoBulletinInstance, + with_bridged_chain_messages_instance: WithRococoBulletinMessagesInstance, + bridge: WithRococoBulletinMessageBridge, + this_chain: bp_rococo::Rococo, + bridged_chain: bp_polkadot_bulletin::PolkadotBulletin, + ); + + // we can't use `assert_complete_bridge_constants` here, because there's a trick with + // Bulletin chain - it has the same (almost) runtime for Polkadot Bulletin and Rococo + // Bulletin, so we have to adhere Polkadot names here + + bridge_runtime_common::priority_calculator::ensure_priority_boost_is_sane::< + Runtime, + WithRococoBulletinMessagesInstance, + PriorityBoostPerMessage, + >(FEE_BOOST_PER_MESSAGE); + + assert_eq!( + BridgeRococoToRococoBulletinMessagesPalletInstance::get(), + X1(PalletInstance( + bp_bridge_hub_rococo::WITH_BRIDGE_ROCOCO_TO_BULLETIN_MESSAGES_PALLET_INDEX + )) + ); + } +} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_westend_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_westend_config.rs index 546b032e4f2..961b47e1e13 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_westend_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_westend_config.rs @@ -14,14 +14,16 @@ // You should have received a copy of the GNU General Public License // along with Cumulus. If not, see . -//! Bridge definitions used on BridgeHub with the Rococo flavor for bridging to BridgeHubWestend. +//! Bridge definitions used on BridgeHubRococo for bridging to BridgeHubWestend. use crate::{ - bridge_common_config::{BridgeParachainWestendInstance, DeliveryRewardInBalance}, + bridge_common_config::{ + BridgeHubRococo, BridgeParachainWestendInstance, DeliveryRewardInBalance, + }, weights, xcm_config::UniversalLocation, - AccountId, BridgeWestendMessages, PolkadotXcm, Runtime, RuntimeEvent, RuntimeOrigin, - XcmOverBridgeHubWestend, XcmRouter, + AccountId, BridgeWestendMessages, PolkadotXcm, Runtime, RuntimeEvent, XcmOverBridgeHubWestend, + XcmRouter, }; use bp_messages::LaneId; use bridge_runtime_common::{ @@ -29,7 +31,7 @@ use bridge_runtime_common::{ messages::{ source::{FromBridgedChainMessagesDeliveryProof, TargetHeaderChainAdapter}, target::{FromBridgedChainMessagesProof, SourceHeaderChainAdapter}, - MessageBridge, ThisChainWithMessages, UnderlyingChainProvider, + MessageBridge, UnderlyingChainProvider, }, messages_xcm_extension::{ SenderAndLane, XcmAsPlainPayload, XcmBlobHauler, XcmBlobHaulerAdapter, @@ -173,18 +175,6 @@ impl UnderlyingChainProvider for BridgeHubWestend { impl messages::BridgedChainWithMessages for BridgeHubWestend {} -/// BridgeHubRococo chain from message lane point of view. -#[derive(RuntimeDebug, Clone, Copy)] -pub struct BridgeHubRococo; - -impl UnderlyingChainProvider for BridgeHubRococo { - type Chain = bp_bridge_hub_rococo::BridgeHubRococo; -} - -impl ThisChainWithMessages for BridgeHubRococo { - type RuntimeOrigin = RuntimeOrigin; -} - /// Signed extension that refunds relayers that are delivering messages from the Westend parachain. pub type OnBridgeHubRococoRefundBridgeHubWestendMessages = RefundSignedExtensionAdapter< RefundBridgedParachainMessages< @@ -208,7 +198,7 @@ bp_runtime::generate_static_str_provider!(OnBridgeHubRococoRefundBridgeHubWesten pub type WithBridgeHubWestendMessagesInstance = pallet_bridge_messages::Instance3; impl pallet_bridge_messages::Config for Runtime { type RuntimeEvent = RuntimeEvent; - type WeightInfo = weights::pallet_bridge_messages::WeightInfo; + type WeightInfo = weights::pallet_bridge_messages_rococo_to_westend::WeightInfo; type BridgedChainId = BridgeHubWestendChainId; type ActiveOutboundLanes = ActiveOutboundLanesToBridgeHubWestend; type MaxUnrewardedRelayerEntriesAtInboundLane = MaxUnrewardedRelayerEntriesAtInboundLane; diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs index 22f5d9f5fb3..75af5a8ef7b 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs @@ -18,6 +18,7 @@ //! //! This runtime currently supports bridging between: //! - Rococo <> Westend +//! - Rococo <> Rococo Bulletin #![cfg_attr(not(feature = "std"), no_std)] // `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. @@ -28,6 +29,7 @@ include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); pub mod bridge_common_config; +pub mod bridge_to_bulletin_config; pub mod bridge_to_westend_config; mod weights; pub mod xcm_config; @@ -106,7 +108,10 @@ pub type SignedExtra = ( frame_system::CheckWeight, pallet_transaction_payment::ChargeTransactionPayment, BridgeRejectObsoleteHeadersAndMessages, - (bridge_to_westend_config::OnBridgeHubRococoRefundBridgeHubWestendMessages,), + ( + bridge_to_westend_config::OnBridgeHubRococoRefundBridgeHubWestendMessages, + bridge_to_bulletin_config::OnBridgeHubRococoRefundRococoBulletinMessages, + ), ); /// Unchecked extrinsic type as expected by this runtime. @@ -483,39 +488,56 @@ construct_runtime!( Utility: pallet_utility::{Pallet, Call, Event} = 40, Multisig: pallet_multisig::{Pallet, Call, Storage, Event} = 36, - // BridgeHubRococo uses: - // - BridgeWestendGrandpa - // - BridgeWestendParachains - // - BridgeWestendMessages - // - BridgeRelayers + // Bridge relayers pallet, used by several bridges here. + BridgeRelayers: pallet_bridge_relayers::{Pallet, Call, Storage, Event} = 47, - // GRANDPA bridge modules. + // With-Westend GRANDPA bridge module. BridgeWestendGrandpa: pallet_bridge_grandpa::::{Pallet, Call, Storage, Event, Config} = 48, - - // Parachain bridge modules. + // With-Westend parachain bridge module. BridgeWestendParachains: pallet_bridge_parachains::::{Pallet, Call, Storage, Event} = 49, - - // Messaging bridge modules. + // With-Westend messaging bridge module. BridgeWestendMessages: pallet_bridge_messages::::{Pallet, Call, Storage, Event, Config} = 51, - - BridgeRelayers: pallet_bridge_relayers::{Pallet, Call, Storage, Event} = 47, - + // With-Westend bridge hub pallet. XcmOverBridgeHubWestend: pallet_xcm_bridge_hub::::{Pallet} = 52, + // With-Rococo Bulletin GRANDPA bridge module. + // + // we can't use `BridgeRococoBulletinGrandpa` name here, because the same Bulletin runtime will be + // used for both Rococo and Polkadot Bulletin chains AND this name affects runtime storage keys, used + // by the relayer process + BridgePolkadotBulletinGrandpa: pallet_bridge_grandpa::::{Pallet, Call, Storage, Event, Config} = 60, + // With-Rococo Bulletin messaging bridge module. + // + // we can't use `BridgeRococoBulletinMessages` name here, because the same Bulletin runtime will be + // used for both Rococo and Polkadot Bulletin chains AND this name affects runtime storage keys, used + // by this runtime and the relayer process + BridgePolkadotBulletinMessages: pallet_bridge_messages::::{Pallet, Call, Storage, Event, Config} = 61, + // With-Rococo Bulletin bridge hub pallet. + XcmOverPolkadotBulletin: pallet_xcm_bridge_hub::::{Pallet} = 62, + // Message Queue. Importantly, is registered last so that messages are processed after // the `on_initialize` hooks of bridging pallets. MessageQueue: pallet_message_queue::{Pallet, Call, Storage, Event} = 250, } ); +/// Proper alias for bridge GRANDPA pallet used to bridge with the bulletin chain. +pub type BridgeRococoBulletinGrandpa = BridgePolkadotBulletinGrandpa; +/// Proper alias for bridge messages pallet used to bridge with the bulletin chain. +pub type BridgeRococoBulletinMessages = BridgePolkadotBulletinMessages; +/// Proper alias for bridge messages pallet used to bridge with the bulletin chain. +pub type XcmOverRococoBulletin = XcmOverPolkadotBulletin; + bridge_runtime_common::generate_bridge_reject_obsolete_headers_and_messages! { RuntimeCall, AccountId, // Grandpa BridgeWestendGrandpa, + BridgeRococoBulletinGrandpa, // Parachains BridgeWestendParachains, // Messages - BridgeWestendMessages + BridgeWestendMessages, + BridgeRococoBulletinMessages } #[cfg(feature = "runtime-benchmarks")] @@ -540,6 +562,7 @@ mod benches { [pallet_bridge_grandpa, WestendFinality] [pallet_bridge_parachains, WithinWestend] [pallet_bridge_messages, RococoToWestend] + [pallet_bridge_messages, RococoToRococoBulletin] [pallet_bridge_relayers, BridgeRelayersBench::] ); } @@ -733,6 +756,42 @@ impl_runtime_apis! { } } + impl bp_polkadot_bulletin::PolkadotBulletinFinalityApi for Runtime { + fn best_finalized() -> Option> { + BridgePolkadotBulletinGrandpa::best_finalized() + } + + fn synced_headers_grandpa_info( + ) -> Vec> { + BridgePolkadotBulletinGrandpa::synced_headers_grandpa_info() + } + } + + impl bp_polkadot_bulletin::FromPolkadotBulletinInboundLaneApi for Runtime { + fn message_details( + lane: bp_messages::LaneId, + messages: Vec<(bp_messages::MessagePayload, bp_messages::OutboundMessageDetails)>, + ) -> Vec { + bridge_runtime_common::messages_api::inbound_message_details::< + Runtime, + bridge_to_bulletin_config::WithRococoBulletinMessagesInstance, + >(lane, messages) + } + } + + impl bp_polkadot_bulletin::ToPolkadotBulletinOutboundLaneApi for Runtime { + fn message_details( + lane: bp_messages::LaneId, + begin: bp_messages::MessageNonce, + end: bp_messages::MessageNonce, + ) -> Vec { + bridge_runtime_common::messages_api::outbound_message_details::< + Runtime, + bridge_to_bulletin_config::WithRococoBulletinMessagesInstance, + >(lane, begin, end) + } + } + #[cfg(feature = "try-runtime")] impl frame_try_runtime::TryRuntime for Runtime { fn on_runtime_upgrade(checks: frame_try_runtime::UpgradeCheckSelect) -> (Weight, Weight) { @@ -775,6 +834,7 @@ impl_runtime_apis! { type WestendFinality = BridgeWestendGrandpa; type WithinWestend = pallet_bridge_parachains::benchmarking::Pallet::; type RococoToWestend = pallet_bridge_messages::benchmarking::Pallet ::; + type RococoToRococoBulletin = pallet_bridge_messages::benchmarking::Pallet ::; let mut list = Vec::::new(); list_benchmarks!(list, extra); @@ -968,9 +1028,12 @@ impl_runtime_apis! { type WestendFinality = BridgeWestendGrandpa; type WithinWestend = pallet_bridge_parachains::benchmarking::Pallet::; type RococoToWestend = pallet_bridge_messages::benchmarking::Pallet ::; + type RococoToRococoBulletin = pallet_bridge_messages::benchmarking::Pallet ::; use bridge_runtime_common::messages_benchmarking::{ + prepare_message_delivery_proof_from_grandpa_chain, prepare_message_delivery_proof_from_parachain, + prepare_message_proof_from_grandpa_chain, prepare_message_proof_from_parachain, generate_xcm_builder_bridge_message_sample, }; @@ -1023,6 +1086,41 @@ impl_runtime_apis! { } } + impl BridgeMessagesConfig for Runtime { + fn is_relayer_rewarded(_relayer: &Self::AccountId) -> bool { + // we do not pay any rewards in this bridge + true + } + + fn prepare_message_proof( + params: MessageProofParams, + ) -> (bridge_to_bulletin_config::FromRococoBulletinMessagesProof, Weight) { + use cumulus_primitives_core::XcmpMessageSource; + assert!(XcmpQueue::take_outbound_messages(usize::MAX).is_empty()); + ParachainSystem::open_outbound_hrmp_channel_for_benchmarks_or_tests(42.into()); + prepare_message_proof_from_grandpa_chain::< + Runtime, + bridge_common_config::BridgeGrandpaRococoBulletinInstance, + bridge_to_bulletin_config::WithRococoBulletinMessageBridge, + >(params, generate_xcm_builder_bridge_message_sample(X2(GlobalConsensus(Rococo), Parachain(42)))) + } + + fn prepare_message_delivery_proof( + params: MessageDeliveryProofParams, + ) -> bridge_to_bulletin_config::ToRococoBulletinMessagesDeliveryProof { + prepare_message_delivery_proof_from_grandpa_chain::< + Runtime, + bridge_common_config::BridgeGrandpaRococoBulletinInstance, + bridge_to_bulletin_config::WithRococoBulletinMessageBridge, + >(params) + } + + fn is_message_successfully_dispatched(_nonce: bp_messages::MessageNonce) -> bool { + use cumulus_primitives_core::XcmpMessageSource; + !XcmpQueue::take_outbound_messages(usize::MAX).is_empty() + } + } + use bridge_runtime_common::parachains_benchmarking::prepare_parachain_heads_proof; use pallet_bridge_parachains::benchmarking::Config as BridgeParachainsConfig; use pallet_bridge_relayers::benchmarking::{ @@ -1134,7 +1232,10 @@ mod tests { frame_system::CheckWeight::new(), pallet_transaction_payment::ChargeTransactionPayment::from(10), BridgeRejectObsoleteHeadersAndMessages, - (bridge_to_westend_config::OnBridgeHubRococoRefundBridgeHubWestendMessages::default(),) + ( + bridge_to_westend_config::OnBridgeHubRococoRefundBridgeHubWestendMessages::default(), + bridge_to_bulletin_config::OnBridgeHubRococoRefundRococoBulletinMessages::default(), + ) ); // for BridgeHubRococo diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/mod.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/mod.rs index 3604ab3c0ff..69461be38ed 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/mod.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/mod.rs @@ -27,7 +27,8 @@ pub mod extrinsic_weights; pub mod frame_system; pub mod pallet_balances; pub mod pallet_bridge_grandpa; -pub mod pallet_bridge_messages; +pub mod pallet_bridge_messages_rococo_to_rococo_bulletin; +pub mod pallet_bridge_messages_rococo_to_westend; pub mod pallet_bridge_parachains; pub mod pallet_bridge_relayers; pub mod pallet_collator_selection; @@ -52,7 +53,26 @@ use frame_support::weights::Weight; // import trait from dependency module use ::pallet_bridge_relayers::WeightInfoExt as _; -impl MessagesWeightInfoExt for pallet_bridge_messages::WeightInfo { +impl MessagesWeightInfoExt + for pallet_bridge_messages_rococo_to_rococo_bulletin::WeightInfo +{ + fn expected_extra_storage_proof_size() -> u32 { + bp_polkadot_bulletin::EXTRA_STORAGE_PROOF_SIZE + } + + fn receive_messages_proof_overhead_from_runtime() -> Weight { + pallet_bridge_relayers::WeightInfo::::receive_messages_proof_overhead_from_runtime( + ) + } + + fn receive_messages_delivery_proof_overhead_from_runtime() -> Weight { + pallet_bridge_relayers::WeightInfo::::receive_messages_delivery_proof_overhead_from_runtime() + } +} + +impl MessagesWeightInfoExt + for pallet_bridge_messages_rococo_to_westend::WeightInfo +{ fn expected_extra_storage_proof_size() -> u32 { bp_bridge_hub_westend::EXTRA_STORAGE_PROOF_SIZE } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages_rococo_to_rococo_bulletin.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages_rococo_to_rococo_bulletin.rs new file mode 100644 index 00000000000..d3255ab3875 --- /dev/null +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages_rococo_to_rococo_bulletin.rs @@ -0,0 +1,221 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +//! Autogenerated weights for `pallet_bridge_messages` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-12-14, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `runner-itmxxexx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-rococo-dev")`, DB CACHE: 1024 + +// Executed Command: +// target/production/polkadot-parachain +// benchmark +// pallet +// --steps=50 +// --repeat=20 +// --extrinsic=* +// --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json +// --pallet=pallet_bridge_messages +// --chain=bridge-hub-rococo-dev +// --header=./cumulus/file_header.txt +// --output=./cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/ + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_bridge_messages`. +pub struct WeightInfo(PhantomData); +impl pallet_bridge_messages::WeightInfo for WeightInfo { + /// Storage: `BridgePolkadotBulletinMessages::PalletOperatingMode` (r:1 w:0) + /// Proof: `BridgePolkadotBulletinMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `BridgePolkadotBulletinGrandpa::ImportedHeaders` (r:1 w:0) + /// Proof: `BridgePolkadotBulletinGrandpa::ImportedHeaders` (`max_values`: Some(1024), `max_size`: Some(68), added: 1553, mode: `MaxEncodedLen`) + /// Storage: `BridgePolkadotBulletinMessages::InboundLanes` (r:1 w:1) + /// Proof: `BridgePolkadotBulletinMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) + /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) + /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + fn receive_single_message_proof() -> Weight { + // Proof Size summary in bytes: + // Measured: `621` + // Estimated: `52645` + // Minimum execution time: 36_661_000 picoseconds. + Weight::from_parts(38_106_000, 0) + .saturating_add(Weight::from_parts(0, 52645)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `BridgePolkadotBulletinMessages::PalletOperatingMode` (r:1 w:0) + /// Proof: `BridgePolkadotBulletinMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `BridgePolkadotBulletinGrandpa::ImportedHeaders` (r:1 w:0) + /// Proof: `BridgePolkadotBulletinGrandpa::ImportedHeaders` (`max_values`: Some(1024), `max_size`: Some(68), added: 1553, mode: `MaxEncodedLen`) + /// Storage: `BridgePolkadotBulletinMessages::InboundLanes` (r:1 w:1) + /// Proof: `BridgePolkadotBulletinMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) + /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) + /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + fn receive_two_messages_proof() -> Weight { + // Proof Size summary in bytes: + // Measured: `621` + // Estimated: `52645` + // Minimum execution time: 47_599_000 picoseconds. + Weight::from_parts(49_731_000, 0) + .saturating_add(Weight::from_parts(0, 52645)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `BridgePolkadotBulletinMessages::PalletOperatingMode` (r:1 w:0) + /// Proof: `BridgePolkadotBulletinMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `BridgePolkadotBulletinGrandpa::ImportedHeaders` (r:1 w:0) + /// Proof: `BridgePolkadotBulletinGrandpa::ImportedHeaders` (`max_values`: Some(1024), `max_size`: Some(68), added: 1553, mode: `MaxEncodedLen`) + /// Storage: `BridgePolkadotBulletinMessages::InboundLanes` (r:1 w:1) + /// Proof: `BridgePolkadotBulletinMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) + /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) + /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + fn receive_single_message_proof_with_outbound_lane_state() -> Weight { + // Proof Size summary in bytes: + // Measured: `621` + // Estimated: `52645` + // Minimum execution time: 42_211_000 picoseconds. + Weight::from_parts(43_454_000, 0) + .saturating_add(Weight::from_parts(0, 52645)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `BridgePolkadotBulletinMessages::PalletOperatingMode` (r:1 w:0) + /// Proof: `BridgePolkadotBulletinMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `BridgePolkadotBulletinGrandpa::ImportedHeaders` (r:1 w:0) + /// Proof: `BridgePolkadotBulletinGrandpa::ImportedHeaders` (`max_values`: Some(1024), `max_size`: Some(68), added: 1553, mode: `MaxEncodedLen`) + /// Storage: `BridgePolkadotBulletinMessages::InboundLanes` (r:1 w:1) + /// Proof: `BridgePolkadotBulletinMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) + fn receive_single_message_proof_1_kb() -> Weight { + // Proof Size summary in bytes: + // Measured: `589` + // Estimated: `52645` + // Minimum execution time: 36_072_000 picoseconds. + Weight::from_parts(37_260_000, 0) + .saturating_add(Weight::from_parts(0, 52645)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `BridgePolkadotBulletinMessages::PalletOperatingMode` (r:1 w:0) + /// Proof: `BridgePolkadotBulletinMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `BridgePolkadotBulletinGrandpa::ImportedHeaders` (r:1 w:0) + /// Proof: `BridgePolkadotBulletinGrandpa::ImportedHeaders` (`max_values`: Some(1024), `max_size`: Some(68), added: 1553, mode: `MaxEncodedLen`) + /// Storage: `BridgePolkadotBulletinMessages::InboundLanes` (r:1 w:1) + /// Proof: `BridgePolkadotBulletinMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) + fn receive_single_message_proof_16_kb() -> Weight { + // Proof Size summary in bytes: + // Measured: `589` + // Estimated: `52645` + // Minimum execution time: 66_995_000 picoseconds. + Weight::from_parts(68_661_000, 0) + .saturating_add(Weight::from_parts(0, 52645)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `BridgePolkadotBulletinMessages::PalletOperatingMode` (r:1 w:0) + /// Proof: `BridgePolkadotBulletinMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `BridgePolkadotBulletinGrandpa::ImportedHeaders` (r:1 w:0) + /// Proof: `BridgePolkadotBulletinGrandpa::ImportedHeaders` (`max_values`: Some(1024), `max_size`: Some(68), added: 1553, mode: `MaxEncodedLen`) + /// Storage: `BridgePolkadotBulletinMessages::OutboundLanes` (r:1 w:1) + /// Proof: `BridgePolkadotBulletinMessages::OutboundLanes` (`max_values`: Some(1), `max_size`: Some(44), added: 539, mode: `MaxEncodedLen`) + fn receive_delivery_proof_for_single_message() -> Weight { + // Proof Size summary in bytes: + // Measured: `588` + // Estimated: `2543` + // Minimum execution time: 25_553_000 picoseconds. + Weight::from_parts(26_205_000, 0) + .saturating_add(Weight::from_parts(0, 2543)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `BridgePolkadotBulletinMessages::PalletOperatingMode` (r:1 w:0) + /// Proof: `BridgePolkadotBulletinMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `BridgePolkadotBulletinGrandpa::ImportedHeaders` (r:1 w:0) + /// Proof: `BridgePolkadotBulletinGrandpa::ImportedHeaders` (`max_values`: Some(1024), `max_size`: Some(68), added: 1553, mode: `MaxEncodedLen`) + /// Storage: `BridgePolkadotBulletinMessages::OutboundLanes` (r:1 w:1) + /// Proof: `BridgePolkadotBulletinMessages::OutboundLanes` (`max_values`: Some(1), `max_size`: Some(44), added: 539, mode: `MaxEncodedLen`) + fn receive_delivery_proof_for_two_messages_by_single_relayer() -> Weight { + // Proof Size summary in bytes: + // Measured: `588` + // Estimated: `2543` + // Minimum execution time: 25_610_000 picoseconds. + Weight::from_parts(26_273_000, 0) + .saturating_add(Weight::from_parts(0, 2543)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `BridgePolkadotBulletinMessages::PalletOperatingMode` (r:1 w:0) + /// Proof: `BridgePolkadotBulletinMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `BridgePolkadotBulletinGrandpa::ImportedHeaders` (r:1 w:0) + /// Proof: `BridgePolkadotBulletinGrandpa::ImportedHeaders` (`max_values`: Some(1024), `max_size`: Some(68), added: 1553, mode: `MaxEncodedLen`) + /// Storage: `BridgePolkadotBulletinMessages::OutboundLanes` (r:1 w:1) + /// Proof: `BridgePolkadotBulletinMessages::OutboundLanes` (`max_values`: Some(1), `max_size`: Some(44), added: 539, mode: `MaxEncodedLen`) + fn receive_delivery_proof_for_two_messages_by_two_relayers() -> Weight { + // Proof Size summary in bytes: + // Measured: `588` + // Estimated: `2543` + // Minimum execution time: 25_651_000 picoseconds. + Weight::from_parts(26_172_000, 0) + .saturating_add(Weight::from_parts(0, 2543)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `BridgePolkadotBulletinMessages::PalletOperatingMode` (r:1 w:0) + /// Proof: `BridgePolkadotBulletinMessages::PalletOperatingMode` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// Storage: `BridgePolkadotBulletinGrandpa::ImportedHeaders` (r:1 w:0) + /// Proof: `BridgePolkadotBulletinGrandpa::ImportedHeaders` (`max_values`: Some(1024), `max_size`: Some(68), added: 1553, mode: `MaxEncodedLen`) + /// Storage: `BridgePolkadotBulletinMessages::InboundLanes` (r:1 w:1) + /// Proof: `BridgePolkadotBulletinMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) + /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) + /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `XcmpQueue::DeliveryFeeFactor` (r:1 w:0) + /// Proof: `XcmpQueue::DeliveryFeeFactor` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::RelevantMessagingState` (r:1 w:0) + /// Proof: `ParachainSystem::RelevantMessagingState` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:1) + /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `XcmpQueue::OutboundXcmpMessages` (r:0 w:1) + /// Proof: `XcmpQueue::OutboundXcmpMessages` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// The range of component `i` is `[128, 2048]`. + /// The range of component `i` is `[128, 2048]`. + fn receive_single_message_proof_with_dispatch(i: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `780` + // Estimated: `52645` + // Minimum execution time: 64_219_000 picoseconds. + Weight::from_parts(65_848_290, 0) + .saturating_add(Weight::from_parts(0, 52645)) + // Standard Error: 43 + .saturating_add(Weight::from_parts(7_577, 0).saturating_mul(i.into())) + .saturating_add(T::DbWeight::get().reads(10)) + .saturating_add(T::DbWeight::get().writes(4)) + } +} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages_rococo_to_westend.rs similarity index 90% rename from cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages.rs rename to cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages_rococo_to_westend.rs index b887f855f01..30ea9eed4a5 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/pallet_bridge_messages_rococo_to_westend.rs @@ -17,7 +17,7 @@ //! Autogenerated weights for `pallet_bridge_messages` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-12-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-12-14, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `runner-itmxxexx-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-rococo-dev")`, DB CACHE: 1024 @@ -60,10 +60,10 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn receive_single_message_proof() -> Weight { // Proof Size summary in bytes: - // Measured: `538` + // Measured: `605` // Estimated: `52645` - // Minimum execution time: 39_918_000 picoseconds. - Weight::from_parts(40_996_000, 0) + // Minimum execution time: 40_349_000 picoseconds. + Weight::from_parts(41_856_000, 0) .saturating_add(Weight::from_parts(0, 52645)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(1)) @@ -80,10 +80,10 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn receive_two_messages_proof() -> Weight { // Proof Size summary in bytes: - // Measured: `538` + // Measured: `605` // Estimated: `52645` - // Minimum execution time: 50_245_000 picoseconds. - Weight::from_parts(51_441_000, 0) + // Minimum execution time: 50_514_000 picoseconds. + Weight::from_parts(52_254_000, 0) .saturating_add(Weight::from_parts(0, 52645)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(1)) @@ -100,10 +100,10 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) fn receive_single_message_proof_with_outbound_lane_state() -> Weight { // Proof Size summary in bytes: - // Measured: `538` + // Measured: `605` // Estimated: `52645` - // Minimum execution time: 44_572_000 picoseconds. - Weight::from_parts(45_629_000, 0) + // Minimum execution time: 45_761_000 picoseconds. + Weight::from_parts(47_075_000, 0) .saturating_add(Weight::from_parts(0, 52645)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(1)) @@ -118,10 +118,10 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `BridgeWestendMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) fn receive_single_message_proof_1_kb() -> Weight { // Proof Size summary in bytes: - // Measured: `506` + // Measured: `573` // Estimated: `52645` - // Minimum execution time: 38_804_000 picoseconds. - Weight::from_parts(39_516_000, 0) + // Minimum execution time: 39_098_000 picoseconds. + Weight::from_parts(40_577_000, 0) .saturating_add(Weight::from_parts(0, 52645)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(1)) @@ -136,10 +136,10 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `BridgeWestendMessages::InboundLanes` (`max_values`: None, `max_size`: Some(49180), added: 51655, mode: `MaxEncodedLen`) fn receive_single_message_proof_16_kb() -> Weight { // Proof Size summary in bytes: - // Measured: `506` + // Measured: `573` // Estimated: `52645` - // Minimum execution time: 68_674_000 picoseconds. - Weight::from_parts(72_690_000, 0) + // Minimum execution time: 69_120_000 picoseconds. + Weight::from_parts(71_810_000, 0) .saturating_add(Weight::from_parts(0, 52645)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(1)) @@ -156,11 +156,11 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `BridgeRelayers::RelayerRewards` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) fn receive_delivery_proof_for_single_message() -> Weight { // Proof Size summary in bytes: - // Measured: `413` - // Estimated: `3878` - // Minimum execution time: 32_833_000 picoseconds. - Weight::from_parts(33_442_000, 0) - .saturating_add(Weight::from_parts(0, 3878)) + // Measured: `447` + // Estimated: `3912` + // Minimum execution time: 32_325_000 picoseconds. + Weight::from_parts(33_070_000, 0) + .saturating_add(Weight::from_parts(0, 3912)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -176,11 +176,11 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `BridgeRelayers::RelayerRewards` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) fn receive_delivery_proof_for_two_messages_by_single_relayer() -> Weight { // Proof Size summary in bytes: - // Measured: `413` - // Estimated: `3878` - // Minimum execution time: 32_528_000 picoseconds. - Weight::from_parts(33_627_000, 0) - .saturating_add(Weight::from_parts(0, 3878)) + // Measured: `447` + // Estimated: `3912` + // Minimum execution time: 32_180_000 picoseconds. + Weight::from_parts(33_202_000, 0) + .saturating_add(Weight::from_parts(0, 3912)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -196,10 +196,10 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Proof: `BridgeRelayers::RelayerRewards` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) fn receive_delivery_proof_for_two_messages_by_two_relayers() -> Weight { // Proof Size summary in bytes: - // Measured: `413` + // Measured: `447` // Estimated: `6086` - // Minimum execution time: 37_493_000 picoseconds. - Weight::from_parts(38_324_000, 0) + // Minimum execution time: 36_774_000 picoseconds. + Weight::from_parts(37_774_000, 0) .saturating_add(Weight::from_parts(0, 6086)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(3)) @@ -227,15 +227,16 @@ impl pallet_bridge_messages::WeightInfo for WeightInfo< /// Storage: `XcmpQueue::OutboundXcmpMessages` (r:0 w:1) /// Proof: `XcmpQueue::OutboundXcmpMessages` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `i` is `[128, 2048]`. + /// The range of component `i` is `[128, 2048]`. fn receive_single_message_proof_with_dispatch(i: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `669` + // Measured: `736` // Estimated: `52645` - // Minimum execution time: 64_104_000 picoseconds. - Weight::from_parts(66_006_268, 0) + // Minimum execution time: 65_934_000 picoseconds. + Weight::from_parts(67_915_916, 0) .saturating_add(Weight::from_parts(0, 52645)) - // Standard Error: 91 - .saturating_add(Weight::from_parts(7_932, 0).saturating_mul(i.into())) + // Standard Error: 65 + .saturating_add(Weight::from_parts(7_190, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().reads(10)) .saturating_add(T::DbWeight::get().writes(4)) } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs index c9b9d94920d..19fb4fdea0f 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs @@ -20,7 +20,8 @@ use super::{ TransactionByteFee, WeightToFee, XcmpQueue, }; use crate::bridge_common_config::{ - BridgeGrandpaWestendInstance, DeliveryRewardInBalance, RequiredStakeForStakeAndSlash, + BridgeGrandpaRococoBulletinInstance, BridgeGrandpaWestendInstance, DeliveryRewardInBalance, + RequiredStakeForStakeAndSlash, }; use bp_messages::LaneId; use bp_relayers::{PayRewardFromAccount, RewardsAccountOwner, RewardsAccountParams}; @@ -72,6 +73,7 @@ parameter_types! { pub const MaxAssetsIntoHolding: u32 = 64; pub TreasuryAccount: AccountId = TREASURY_PALLET_ID.into_account_truncating(); pub RelayTreasuryLocation: MultiLocation = (Parent, PalletInstance(rococo_runtime_constants::TREASURY_PALLET_ID)).into(); + pub SiblingPeople: MultiLocation = (Parent, Parachain(rococo_runtime_constants::system_parachain::PEOPLE_ID)).into(); } /// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used @@ -187,6 +189,10 @@ impl Contains for SafeCallFilter { RuntimeCall::BridgeWestendGrandpa(pallet_bridge_grandpa::Call::< Runtime, BridgeGrandpaWestendInstance, + >::initialize { .. }) | + RuntimeCall::BridgePolkadotBulletinGrandpa(pallet_bridge_grandpa::Call::< + Runtime, + BridgeGrandpaRococoBulletinInstance, >::initialize { .. }) ) } @@ -205,11 +211,12 @@ pub type Barrier = TrailingSetTopicAsId< // If the message is one that immediately attempts to pay for execution, then // allow it. AllowTopLevelPaidExecutionFrom, - // Parent, its pluralities (i.e. governance bodies) and relay treasury pallet - // get free execution. + // Parent, its pluralities (i.e. governance bodies), relay treasury pallet + // and sibling People get free execution. AllowExplicitUnpaidExecutionFrom<( ParentOrParentsPlurality, Equals, + Equals, )>, // Subscriptions for version tracking are OK. AllowSubscriptionsFrom, @@ -273,7 +280,10 @@ impl xcm_executor::Config for XcmConfig { XcmFeeToAccount, ), >; - type MessageExporter = (crate::bridge_to_westend_config::ToBridgeHubWestendHaulBlobExporter,); + type MessageExporter = ( + crate::bridge_to_westend_config::ToBridgeHubWestendHaulBlobExporter, + crate::bridge_to_bulletin_config::ToRococoBulletinHaulBlobExporter, + ); type UniversalAliases = Nothing; type CallDispatcher = WithOriginFilter; type SafeCallFilter = SafeCallFilter; diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs index 662012a4b41..b5e4552c452 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs @@ -18,7 +18,7 @@ use bp_polkadot_core::Signature; use bridge_hub_rococo_runtime::{ - bridge_common_config, bridge_to_westend_config, + bridge_common_config, bridge_to_bulletin_config, bridge_to_westend_config, xcm_config::{RelayNetwork, TokenLocation, XcmConfig}, AllPalletsWithoutSystem, BridgeRejectObsoleteHeadersAndMessages, Executive, ExistentialDeposit, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, SessionKeys, @@ -34,9 +34,6 @@ use sp_runtime::{ }; use xcm::latest::prelude::*; -// Para id of sibling chain used in tests. -pub const SIBLING_PARACHAIN_ID: u32 = 1000; - parameter_types! { pub CheckingAccount: AccountId = PolkadotXcm::check_account(); } @@ -58,7 +55,10 @@ fn construct_extrinsic( frame_system::CheckWeight::::new(), pallet_transaction_payment::ChargeTransactionPayment::::from(0), BridgeRejectObsoleteHeadersAndMessages::default(), - (bridge_to_westend_config::OnBridgeHubRococoRefundBridgeHubWestendMessages::default(),), + ( + bridge_to_westend_config::OnBridgeHubRococoRefundBridgeHubWestendMessages::default(), + bridge_to_bulletin_config::OnBridgeHubRococoRefundRococoBulletinMessages::default(), + ), ); let payload = SignedPayload::new(call.clone(), extra.clone()).unwrap(); let signature = payload.using_encoded(|e| sender.sign(e)); @@ -94,11 +94,48 @@ fn collator_session_keys() -> bridge_hub_test_utils::CollatorSessionKeys| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::PolkadotXcm(event)) => Some(event), + _ => None, + } + }), + bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID +); + +#[test] +fn change_required_stake_by_governance_works() { + bridge_hub_test_utils::test_cases::change_storage_constant_by_governance_works::< + Runtime, + bridge_common_config::RequiredStakeForStakeAndSlash, + Balance, + >( + collator_session_keys(), + bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, + Box::new(|call| RuntimeCall::System(call).encode()), + || { + ( + bridge_common_config::RequiredStakeForStakeAndSlash::key().to_vec(), + bridge_common_config::RequiredStakeForStakeAndSlash::get(), + ) + }, + |old_value| old_value.checked_mul(2).unwrap(), + ) +} + +mod bridge_hub_westend_tests { use super::*; use bridge_common_config::{ BridgeGrandpaWestendInstance, BridgeParachainWestendInstance, DeliveryRewardInBalance, - RequiredStakeForStakeAndSlash, }; use bridge_to_westend_config::{ BridgeHubWestendChainId, BridgeHubWestendLocation, WestendGlobalConsensusNetwork, @@ -106,27 +143,12 @@ mod bridge_hub_rococo_tests { XCM_LANE_FOR_ASSET_HUB_ROCOCO_TO_ASSET_HUB_WESTEND, }; - bridge_hub_test_utils::test_cases::include_teleports_for_native_asset_works!( - Runtime, - AllPalletsWithoutSystem, - XcmConfig, - CheckingAccount, - WeightToFee, - ParachainSystem, - collator_session_keys(), - ExistentialDeposit::get(), - Box::new(|runtime_event_encoded: Vec| { - match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { - Ok(RuntimeEvent::PolkadotXcm(event)) => Some(event), - _ => None, - } - }), - bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID - ); + // Para id of sibling chain used in tests. + pub const SIBLING_PARACHAIN_ID: u32 = 1000; #[test] fn initialize_bridge_by_governance_works() { - // for Westend finality + // for RococoBulletin finality bridge_hub_test_utils::test_cases::initialize_bridge_by_governance_works::< Runtime, BridgeGrandpaWestendInstance, @@ -152,26 +174,6 @@ mod bridge_hub_rococo_tests { ) } - #[test] - fn change_required_stake_by_governance_works() { - bridge_hub_test_utils::test_cases::change_storage_constant_by_governance_works::< - Runtime, - RequiredStakeForStakeAndSlash, - Balance, - >( - collator_session_keys(), - bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, - Box::new(|call| RuntimeCall::System(call).encode()), - || { - ( - RequiredStakeForStakeAndSlash::key().to_vec(), - RequiredStakeForStakeAndSlash::get(), - ) - }, - |old_value| old_value.checked_mul(2).unwrap(), - ) - } - #[test] fn handle_export_message_from_system_parachain_add_to_outbound_queue_works() { // for Westend @@ -344,3 +346,198 @@ mod bridge_hub_rococo_tests { ); } } + +mod bridge_hub_bulletin_tests { + use super::*; + use bridge_common_config::BridgeGrandpaRococoBulletinInstance; + use bridge_to_bulletin_config::{ + RococoBulletinChainId, RococoBulletinGlobalConsensusNetwork, + RococoBulletinGlobalConsensusNetworkLocation, WithRococoBulletinMessageBridge, + WithRococoBulletinMessagesInstance, XCM_LANE_FOR_ROCOCO_PEOPLE_TO_ROCOCO_BULLETIN, + }; + + // Para id of sibling chain used in tests. + pub const SIBLING_PARACHAIN_ID: u32 = rococo_runtime_constants::system_parachain::PEOPLE_ID; + + #[test] + fn initialize_bridge_by_governance_works() { + // for Bulletin finality + bridge_hub_test_utils::test_cases::initialize_bridge_by_governance_works::< + Runtime, + BridgeGrandpaRococoBulletinInstance, + >( + collator_session_keys(), + bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, + Box::new(|call| RuntimeCall::BridgePolkadotBulletinGrandpa(call).encode()), + ) + } + + #[test] + fn handle_export_message_from_system_parachain_add_to_outbound_queue_works() { + // for Bulletin + bridge_hub_test_utils::test_cases::handle_export_message_from_system_parachain_to_outbound_queue_works::< + Runtime, + XcmConfig, + WithRococoBulletinMessagesInstance, + >( + collator_session_keys(), + bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, + SIBLING_PARACHAIN_ID, + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::BridgePolkadotBulletinMessages(event)) => Some(event), + _ => None, + } + }), + || ExportMessage { + network: RococoBulletinGlobalConsensusNetwork::get(), + destination: Here, + xcm: Xcm(vec![]), + }, + XCM_LANE_FOR_ROCOCO_PEOPLE_TO_ROCOCO_BULLETIN, + Some((TokenLocation::get(), ExistentialDeposit::get()).into()), + None, + || PolkadotXcm::force_xcm_version(RuntimeOrigin::root(), Box::new(RococoBulletinGlobalConsensusNetworkLocation::get()), XCM_VERSION).expect("version saved!"), + ) + } + + #[test] + fn message_dispatch_routing_works() { + // from Bulletin + bridge_hub_test_utils::test_cases::message_dispatch_routing_works::< + Runtime, + AllPalletsWithoutSystem, + XcmConfig, + ParachainSystem, + WithRococoBulletinMessagesInstance, + RelayNetwork, + RococoBulletinGlobalConsensusNetwork, + ConstU8<2>, + >( + collator_session_keys(), + bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, + SIBLING_PARACHAIN_ID, + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::ParachainSystem(event)) => Some(event), + _ => None, + } + }), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::XcmpQueue(event)) => Some(event), + _ => None, + } + }), + XCM_LANE_FOR_ROCOCO_PEOPLE_TO_ROCOCO_BULLETIN, + || (), + ) + } + + #[test] + fn relayed_incoming_message_works() { + // from Bulletin + bridge_hub_test_utils::test_cases::from_grandpa_chain::relayed_incoming_message_works::< + Runtime, + AllPalletsWithoutSystem, + ParachainSystem, + BridgeGrandpaRococoBulletinInstance, + WithRococoBulletinMessagesInstance, + WithRococoBulletinMessageBridge, + >( + collator_session_keys(), + bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, + RococoBulletinChainId::get(), + SIBLING_PARACHAIN_ID, + Rococo, + XCM_LANE_FOR_ROCOCO_PEOPLE_TO_ROCOCO_BULLETIN, + || (), + construct_and_apply_extrinsic, + ) + } + + #[test] + pub fn complex_relay_extrinsic_works() { + // for Bulletin + bridge_hub_test_utils::test_cases::from_grandpa_chain::complex_relay_extrinsic_works::< + Runtime, + AllPalletsWithoutSystem, + XcmConfig, + ParachainSystem, + BridgeGrandpaRococoBulletinInstance, + WithRococoBulletinMessagesInstance, + WithRococoBulletinMessageBridge, + >( + collator_session_keys(), + bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, + SIBLING_PARACHAIN_ID, + RococoBulletinChainId::get(), + Rococo, + XCM_LANE_FOR_ROCOCO_PEOPLE_TO_ROCOCO_BULLETIN, + || (), + construct_and_apply_extrinsic, + ); + } + + #[test] + pub fn can_calculate_weight_for_paid_export_message_with_reserve_transfer() { + let estimated = bridge_hub_test_utils::test_cases::can_calculate_weight_for_paid_export_message_with_reserve_transfer::< + Runtime, + XcmConfig, + WeightToFee, + >(); + + // check if estimated value is sane + let max_expected = bp_bridge_hub_rococo::BridgeHubRococoBaseXcmFeeInRocs::get(); + assert!( + estimated <= max_expected, + "calculated: {:?}, max_expected: {:?}, please adjust `bp_bridge_hub_rococo::BridgeHubRococoBaseXcmFeeInRocs` value", + estimated, + max_expected + ); + } + + #[test] + pub fn can_calculate_fee_for_complex_message_delivery_transaction() { + let estimated = bridge_hub_test_utils::test_cases::from_grandpa_chain::can_calculate_fee_for_complex_message_delivery_transaction::< + Runtime, + BridgeGrandpaRococoBulletinInstance, + WithRococoBulletinMessagesInstance, + WithRococoBulletinMessageBridge, + >( + collator_session_keys(), + construct_and_estimate_extrinsic_fee + ); + + // check if estimated value is sane + let max_expected = bp_bridge_hub_rococo::BridgeHubRococoBaseDeliveryFeeInRocs::get(); + assert!( + estimated <= max_expected, + "calculated: {:?}, max_expected: {:?}, please adjust `bp_bridge_hub_rococo::BridgeHubRococoBaseDeliveryFeeInRocs` value", + estimated, + max_expected + ); + } + + #[test] + pub fn can_calculate_fee_for_complex_message_confirmation_transaction() { + let estimated = bridge_hub_test_utils::test_cases::from_grandpa_chain::can_calculate_fee_for_complex_message_confirmation_transaction::< + Runtime, + BridgeGrandpaRococoBulletinInstance, + WithRococoBulletinMessagesInstance, + WithRococoBulletinMessageBridge, + >( + collator_session_keys(), + construct_and_estimate_extrinsic_fee + ); + + // check if estimated value is sane + let max_expected = bp_bridge_hub_rococo::BridgeHubRococoBaseConfirmationFeeInRocs::get(); + assert!( + estimated <= max_expected, + "calculated: {:?}, max_expected: {:?}, please adjust `bp_bridge_hub_rococo::BridgeHubRococoBaseConfirmationFeeInRocs` value", + estimated, + max_expected + ); + } +} diff --git a/polkadot/runtime/rococo/constants/src/lib.rs b/polkadot/runtime/rococo/constants/src/lib.rs index dd08b4fcab2..4e728421b67 100644 --- a/polkadot/runtime/rococo/constants/src/lib.rs +++ b/polkadot/runtime/rococo/constants/src/lib.rs @@ -112,6 +112,8 @@ pub mod system_parachain { pub const CONTRACTS_ID: u32 = 1002; /// Encointer parachain ID. pub const ENCOINTER_ID: u32 = 1003; + /// People parachain ID. + pub const PEOPLE_ID: u32 = 1004; /// BridgeHub parachain ID. pub const BRIDGE_HUB_ID: u32 = 1013; -- GitLab From 19984f22410a835797581f2df0a6ac26ed822639 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Dec 2023 21:41:22 +0100 Subject: [PATCH 036/191] Bump the known_good_semver group with 1 update (#2698) Bumps the known_good_semver group with 1 update: [syn](https://github.com/dtolnay/syn). Updates `syn` from 2.0.40 to 2.0.41
Release notes

Sourced from syn's releases.

2.0.41

  • Support parsing syn::Field in parse_quote! (#1548)
Commits
  • 63b1701 Release 2.0.41
  • 920ab7d Merge pull request #1548 from dtolnay/parsequotefield
  • 5e15924 Test parse_quote implementation for Field
  • c268c67 Support parsing Field in parse_quote
  • 2ab0f6a Merge pull request #1547 from dtolnay/testparsequote
  • 46172a4 Add parse_quote tests
  • 0fcdad0 Support punctuated Pairs iterator in snapshot tests
  • 06161ba Update test suite to nightly-2023-12-12
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=syn&package-manager=cargo&previous-version=2.0.40&new-version=2.0.41)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 108 +++++++++--------- .../parachain-system/proc-macro/Cargo.toml | 2 +- polkadot/node/gum/proc-macro/Cargo.toml | 2 +- polkadot/xcm/procedural/Cargo.toml | 2 +- substrate/client/chain-spec/derive/Cargo.toml | 2 +- .../client/tracing/proc-macro/Cargo.toml | 2 +- .../frame/contracts/proc-macro/Cargo.toml | 2 +- .../solution-type/Cargo.toml | 2 +- .../frame/staking/reward-curve/Cargo.toml | 2 +- substrate/frame/support/procedural/Cargo.toml | 2 +- .../frame/support/procedural/tools/Cargo.toml | 2 +- .../procedural/tools/derive/Cargo.toml | 2 +- .../primitives/api/proc-macro/Cargo.toml | 2 +- .../core/hashing/proc-macro/Cargo.toml | 2 +- substrate/primitives/debug-derive/Cargo.toml | 2 +- .../runtime-interface/proc-macro/Cargo.toml | 2 +- .../primitives/version/proc-macro/Cargo.toml | 2 +- 17 files changed, 70 insertions(+), 70 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b5df40a5d17..5e2d6bd1531 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1158,7 +1158,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -1175,7 +1175,7 @@ checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -1351,7 +1351,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -1361,8 +1361,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93f2635620bf0b9d4576eb7bb9a38a55df78bd1205d26fa994b25911a69f212f" dependencies = [ "bitcoin_hashes", - "rand 0.7.3", - "rand_core 0.5.1", + "rand 0.8.5", + "rand_core 0.6.4", "serde", "unicode-normalization", ] @@ -2589,7 +2589,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -3676,7 +3676,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -4187,7 +4187,7 @@ checksum = "83fdaf97f4804dcebfa5862639bc9ce4121e82140bec2a987ac5140294865b5b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -4227,7 +4227,7 @@ dependencies = [ "proc-macro2", "quote", "scratch", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -4244,7 +4244,7 @@ checksum = "50c49547d73ba8dcfd4ad7325d64c6d5391ff4224d498fc39a6f3f49825a530d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -4543,7 +4543,7 @@ checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -4604,7 +4604,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.40", + "syn 2.0.41", "termcolor", "toml 0.7.8", "walkdir", @@ -4860,7 +4860,7 @@ checksum = "5e9a1f9f7d83e59740248a6e14ecf93929ade55027844dfcea78beafccc15745" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -4871,7 +4871,7 @@ checksum = "c2ad8cef1d801a4686bfd8919f0b30eac4c8e48968c437a6405ded4fb5272d2b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -5026,7 +5026,7 @@ dependencies = [ "fs-err", "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -5413,7 +5413,7 @@ dependencies = [ "quote", "scale-info", "sp-arithmetic", - "syn 2.0.40", + "syn 2.0.41", "trybuild", ] @@ -5566,7 +5566,7 @@ dependencies = [ "quote", "regex", "sp-core-hashing", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -5577,7 +5577,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -5586,7 +5586,7 @@ version = "3.0.0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -5819,7 +5819,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -7824,7 +7824,7 @@ dependencies = [ "macro_magic_core", "macro_magic_macros", "quote", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -7838,7 +7838,7 @@ dependencies = [ "macro_magic_core_macros", "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -7849,7 +7849,7 @@ checksum = "9ea73aa640dc01d62a590d48c0c3521ed739d53b27f919b25c3551e233481654" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -7860,7 +7860,7 @@ checksum = "ef9d79ae96aaba821963320eb2b6e34d17df1e5a83d8a1985c29cc5be59577b3" dependencies = [ "macro_magic_core", "quote", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -9635,7 +9635,7 @@ version = "4.0.0-dev" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -10795,7 +10795,7 @@ dependencies = [ "proc-macro2", "quote", "sp-runtime", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -11689,7 +11689,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -11730,7 +11730,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -13697,7 +13697,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c64d9ba0963cdcea2e1b2230fbae2bab30eb25a174be395c41e764bfb65dd62" dependencies = [ "proc-macro2", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -13789,7 +13789,7 @@ checksum = "9b698b0b09d40e9b7c1a47b132d66a8b54bcd20583d9b6d06e4535e383b4405c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -13861,7 +13861,7 @@ checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -14263,7 +14263,7 @@ checksum = "7f7473c2cfcf90008193dd0e3e16599455cb601a9fce322b5bb55de799664925" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -15106,7 +15106,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -16362,7 +16362,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -16755,7 +16755,7 @@ checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -16845,7 +16845,7 @@ checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -17289,7 +17289,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -17624,7 +17624,7 @@ version = "9.0.0" dependencies = [ "quote", "sp-core-hashing", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -17682,7 +17682,7 @@ version = "8.0.0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -17692,7 +17692,7 @@ source = "git+https://github.com/paritytech/polkadot-sdk#82912acb33a9030c0ef3bf5 dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -17965,7 +17965,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -17977,7 +17977,7 @@ dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -18248,7 +18248,7 @@ dependencies = [ "proc-macro2", "quote", "sp-version", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -19097,9 +19097,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.40" +version = "2.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13fa70a4ee923979ffb522cacce59d34421ebdea5625e1073c4326ef9d2dd42e" +checksum = "44c8b28c477cc3bf0e7966561e3460130e1255f7a1cf71931075f1c5e7a7e269" dependencies = [ "proc-macro2", "quote", @@ -19354,7 +19354,7 @@ checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -19526,7 +19526,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -19732,7 +19732,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -19774,7 +19774,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] @@ -20030,7 +20030,7 @@ checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" dependencies = [ "cfg-if", "digest 0.10.7", - "rand 0.7.3", + "rand 0.8.5", "static_assertions", ] @@ -20335,7 +20335,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.41", "wasm-bindgen-shared", ] @@ -20369,7 +20369,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.41", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -21549,7 +21549,7 @@ dependencies = [ "proc-macro2", "quote", "staging-xcm", - "syn 2.0.40", + "syn 2.0.41", "trybuild", ] @@ -21669,7 +21669,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.40", + "syn 2.0.41", ] [[package]] diff --git a/cumulus/pallets/parachain-system/proc-macro/Cargo.toml b/cumulus/pallets/parachain-system/proc-macro/Cargo.toml index 11a2ae01374..676f333e065 100644 --- a/cumulus/pallets/parachain-system/proc-macro/Cargo.toml +++ b/cumulus/pallets/parachain-system/proc-macro/Cargo.toml @@ -13,7 +13,7 @@ workspace = true proc-macro = true [dependencies] -syn = "2.0.40" +syn = "2.0.41" proc-macro2 = "1.0.64" quote = "1.0.33" proc-macro-crate = "2.0.1" diff --git a/polkadot/node/gum/proc-macro/Cargo.toml b/polkadot/node/gum/proc-macro/Cargo.toml index f7880bfd2f9..3f1c2fd6475 100644 --- a/polkadot/node/gum/proc-macro/Cargo.toml +++ b/polkadot/node/gum/proc-macro/Cargo.toml @@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"] proc-macro = true [dependencies] -syn = { version = "2.0.40", features = ["extra-traits", "full"] } +syn = { version = "2.0.41", features = ["extra-traits", "full"] } quote = "1.0.28" proc-macro2 = "1.0.56" proc-macro-crate = "2.0.1" diff --git a/polkadot/xcm/procedural/Cargo.toml b/polkadot/xcm/procedural/Cargo.toml index 8467016070a..c5f837a001d 100644 --- a/polkadot/xcm/procedural/Cargo.toml +++ b/polkadot/xcm/procedural/Cargo.toml @@ -16,7 +16,7 @@ proc-macro = true [dependencies] proc-macro2 = "1.0.56" quote = "1.0.28" -syn = "2.0.40" +syn = "2.0.41" Inflector = "0.11.4" [dev-dependencies] diff --git a/substrate/client/chain-spec/derive/Cargo.toml b/substrate/client/chain-spec/derive/Cargo.toml index b5a2bdc09b3..a63520ffb31 100644 --- a/substrate/client/chain-spec/derive/Cargo.toml +++ b/substrate/client/chain-spec/derive/Cargo.toml @@ -21,4 +21,4 @@ proc-macro = true proc-macro-crate = "2.0.1" proc-macro2 = "1.0.56" quote = "1.0.28" -syn = "2.0.40" +syn = "2.0.41" diff --git a/substrate/client/tracing/proc-macro/Cargo.toml b/substrate/client/tracing/proc-macro/Cargo.toml index d85a4a7468a..3d862a021b3 100644 --- a/substrate/client/tracing/proc-macro/Cargo.toml +++ b/substrate/client/tracing/proc-macro/Cargo.toml @@ -21,4 +21,4 @@ proc-macro = true proc-macro-crate = "2.0.1" proc-macro2 = "1.0.56" quote = { version = "1.0.28", features = ["proc-macro"] } -syn = { version = "2.0.40", features = ["extra-traits", "full", "parsing", "proc-macro"] } +syn = { version = "2.0.41", features = ["extra-traits", "full", "parsing", "proc-macro"] } diff --git a/substrate/frame/contracts/proc-macro/Cargo.toml b/substrate/frame/contracts/proc-macro/Cargo.toml index 573cd96d3ab..972b23c373e 100644 --- a/substrate/frame/contracts/proc-macro/Cargo.toml +++ b/substrate/frame/contracts/proc-macro/Cargo.toml @@ -20,7 +20,7 @@ proc-macro = true [dependencies] proc-macro2 = "1.0.56" quote = "1.0.28" -syn = { version = "2.0.40", features = ["full"] } +syn = { version = "2.0.41", features = ["full"] } [dev-dependencies] diff --git a/substrate/frame/election-provider-support/solution-type/Cargo.toml b/substrate/frame/election-provider-support/solution-type/Cargo.toml index ba36daebec3..601355fdb7a 100644 --- a/substrate/frame/election-provider-support/solution-type/Cargo.toml +++ b/substrate/frame/election-provider-support/solution-type/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] proc-macro = true [dependencies] -syn = { version = "2.0.40", features = ["full", "visit"] } +syn = { version = "2.0.41", features = ["full", "visit"] } quote = "1.0.28" proc-macro2 = "1.0.56" proc-macro-crate = "2.0.1" diff --git a/substrate/frame/staking/reward-curve/Cargo.toml b/substrate/frame/staking/reward-curve/Cargo.toml index e33fd255fa8..c21b79bc2e5 100644 --- a/substrate/frame/staking/reward-curve/Cargo.toml +++ b/substrate/frame/staking/reward-curve/Cargo.toml @@ -21,7 +21,7 @@ proc-macro = true proc-macro-crate = "2.0.1" proc-macro2 = "1.0.56" quote = "1.0.28" -syn = { version = "2.0.40", features = ["full", "visit"] } +syn = { version = "2.0.41", features = ["full", "visit"] } [dev-dependencies] sp-runtime = { path = "../../../primitives/runtime" } diff --git a/substrate/frame/support/procedural/Cargo.toml b/substrate/frame/support/procedural/Cargo.toml index 08995c578c5..dd75f6b4ac1 100644 --- a/substrate/frame/support/procedural/Cargo.toml +++ b/substrate/frame/support/procedural/Cargo.toml @@ -24,7 +24,7 @@ cfg-expr = "0.15.5" itertools = "0.10.3" proc-macro2 = "1.0.56" quote = "1.0.28" -syn = { version = "2.0.40", features = ["full"] } +syn = { version = "2.0.41", features = ["full"] } frame-support-procedural-tools = { path = "tools" } macro_magic = { version = "0.5.0", features = ["proc_support"] } proc-macro-warning = { version = "1.0.0", default-features = false } diff --git a/substrate/frame/support/procedural/tools/Cargo.toml b/substrate/frame/support/procedural/tools/Cargo.toml index 5fffe3eeced..a5d0f4cc17a 100644 --- a/substrate/frame/support/procedural/tools/Cargo.toml +++ b/substrate/frame/support/procedural/tools/Cargo.toml @@ -18,5 +18,5 @@ targets = ["x86_64-unknown-linux-gnu"] proc-macro-crate = "2.0.1" proc-macro2 = "1.0.56" quote = "1.0.28" -syn = { version = "2.0.40", features = ["extra-traits", "full", "visit"] } +syn = { version = "2.0.41", features = ["extra-traits", "full", "visit"] } frame-support-procedural-tools-derive = { path = "derive" } diff --git a/substrate/frame/support/procedural/tools/derive/Cargo.toml b/substrate/frame/support/procedural/tools/derive/Cargo.toml index 9b6122b26fd..0ccb02a3329 100644 --- a/substrate/frame/support/procedural/tools/derive/Cargo.toml +++ b/substrate/frame/support/procedural/tools/derive/Cargo.toml @@ -20,4 +20,4 @@ proc-macro = true [dependencies] proc-macro2 = "1.0.56" quote = { version = "1.0.28", features = ["proc-macro"] } -syn = { version = "2.0.40", features = ["extra-traits", "full", "parsing", "proc-macro"] } +syn = { version = "2.0.41", features = ["extra-traits", "full", "parsing", "proc-macro"] } diff --git a/substrate/primitives/api/proc-macro/Cargo.toml b/substrate/primitives/api/proc-macro/Cargo.toml index 544a48062d7..ae46b45ccbf 100644 --- a/substrate/primitives/api/proc-macro/Cargo.toml +++ b/substrate/primitives/api/proc-macro/Cargo.toml @@ -20,7 +20,7 @@ proc-macro = true [dependencies] quote = "1.0.28" -syn = { version = "2.0.40", features = ["extra-traits", "fold", "full", "visit"] } +syn = { version = "2.0.41", features = ["extra-traits", "fold", "full", "visit"] } proc-macro2 = "1.0.56" blake2 = { version = "0.10.4", default-features = false } proc-macro-crate = "2.0.1" diff --git a/substrate/primitives/core/hashing/proc-macro/Cargo.toml b/substrate/primitives/core/hashing/proc-macro/Cargo.toml index 312edd85044..d379fc38ffb 100644 --- a/substrate/primitives/core/hashing/proc-macro/Cargo.toml +++ b/substrate/primitives/core/hashing/proc-macro/Cargo.toml @@ -20,5 +20,5 @@ proc-macro = true [dependencies] quote = "1.0.28" -syn = { version = "2.0.40", features = ["full", "parsing"] } +syn = { version = "2.0.41", features = ["full", "parsing"] } sp-core-hashing = { path = "..", default-features = false } diff --git a/substrate/primitives/debug-derive/Cargo.toml b/substrate/primitives/debug-derive/Cargo.toml index acf281f306a..d23e311ee0b 100644 --- a/substrate/primitives/debug-derive/Cargo.toml +++ b/substrate/primitives/debug-derive/Cargo.toml @@ -20,7 +20,7 @@ proc-macro = true [dependencies] quote = "1.0.28" -syn = "2.0.40" +syn = "2.0.41" proc-macro2 = "1.0.56" [features] diff --git a/substrate/primitives/runtime-interface/proc-macro/Cargo.toml b/substrate/primitives/runtime-interface/proc-macro/Cargo.toml index 7cf1abf8048..190ccd51ecf 100644 --- a/substrate/primitives/runtime-interface/proc-macro/Cargo.toml +++ b/substrate/primitives/runtime-interface/proc-macro/Cargo.toml @@ -24,4 +24,4 @@ proc-macro-crate = "2.0.1" proc-macro2 = "1.0.56" quote = "1.0.28" expander = "2.0.0" -syn = { version = "2.0.40", features = ["extra-traits", "fold", "full", "visit"] } +syn = { version = "2.0.41", features = ["extra-traits", "fold", "full", "visit"] } diff --git a/substrate/primitives/version/proc-macro/Cargo.toml b/substrate/primitives/version/proc-macro/Cargo.toml index f7df8ec113f..413a1e9940a 100644 --- a/substrate/primitives/version/proc-macro/Cargo.toml +++ b/substrate/primitives/version/proc-macro/Cargo.toml @@ -22,7 +22,7 @@ proc-macro = true codec = { package = "parity-scale-codec", version = "3.6.1", features = ["derive"] } proc-macro2 = "1.0.56" quote = "1.0.28" -syn = { version = "2.0.40", features = ["extra-traits", "fold", "full", "visit"] } +syn = { version = "2.0.41", features = ["extra-traits", "fold", "full", "visit"] } [dev-dependencies] sp-version = { path = ".." } -- GitLab From c1a11b73259306ab535d929c3b23c09fcb1aab57 Mon Sep 17 00:00:00 2001 From: Sergei Shulepov Date: Thu, 14 Dec 2023 22:42:05 +0100 Subject: [PATCH 037/191] sc-tracing: swap atty with is-terminal (#2718) `atty` is unmaintaned. See the advisory https://github.com/advisories/GHSA-g98v-hv3f-hcfr I picked is-terminal because rustix is already in-tree, so doesn't increase the dependency footprint, and I am not sure if we can rely on `IsTerminal` from the std because I am not sure what our MSRV. --- Cargo.lock | 2 +- substrate/client/tracing/Cargo.toml | 2 +- substrate/client/tracing/src/logging/mod.rs | 5 +++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5e2d6bd1531..f858df0abe8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -16330,9 +16330,9 @@ name = "sc-tracing" version = "4.0.0-dev" dependencies = [ "ansi_term", - "atty", "chrono", "criterion 0.4.0", + "is-terminal", "lazy_static", "libc", "log", diff --git a/substrate/client/tracing/Cargo.toml b/substrate/client/tracing/Cargo.toml index 94dd6e89231..39428c6c6f5 100644 --- a/substrate/client/tracing/Cargo.toml +++ b/substrate/client/tracing/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] ansi_term = "0.12.1" -atty = "0.2.13" +is-terminal = "0.4.9" chrono = "0.4.27" codec = { package = "parity-scale-codec", version = "3.6.1" } lazy_static = "1.4.0" diff --git a/substrate/client/tracing/src/logging/mod.rs b/substrate/client/tracing/src/logging/mod.rs index a3cf277fbd5..403839390d6 100644 --- a/substrate/client/tracing/src/logging/mod.rs +++ b/substrate/client/tracing/src/logging/mod.rs @@ -33,6 +33,7 @@ pub(crate) type DefaultLogger = stderr_writer::MakeStderrWriter; pub use directives::*; pub use sc_tracing_proc_macro::*; +use is_terminal::IsTerminal; use std::io; use tracing::Subscriber; use tracing_subscriber::{ @@ -170,7 +171,7 @@ where _ => true, } || detailed_output; - let enable_color = force_colors.unwrap_or_else(|| atty::is(atty::Stream::Stderr)); + let enable_color = force_colors.unwrap_or_else(|| io::stderr().is_terminal()); let timer = fast_local_time::FastLocalTime { with_fractional: detailed_output }; let event_format = EventFormat { @@ -179,7 +180,7 @@ where display_level: detailed_output, display_thread_name: detailed_output, enable_color, - dup_to_stdout: !atty::is(atty::Stream::Stderr) && atty::is(atty::Stream::Stdout), + dup_to_stdout: !io::stderr().is_terminal() && io::stdout().is_terminal(), }; let builder = FmtSubscriber::builder().with_env_filter(env_filter); -- GitLab From 6dece52e9de15162fa1dcfb1296cc7faf41e9224 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Thu, 14 Dec 2023 22:51:07 +0100 Subject: [PATCH 038/191] pallet-nomination-pools: Enable function for `fuzzing` feature as well (#2711) The function is called by `do_try_state` which is also enabled for the `fuzzing` feature. --------- Co-authored-by: command-bot <> --- substrate/frame/nomination-pools/src/lib.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/substrate/frame/nomination-pools/src/lib.rs b/substrate/frame/nomination-pools/src/lib.rs index c3fd6a98e88..3a23b894ec8 100644 --- a/substrate/frame/nomination-pools/src/lib.rs +++ b/substrate/frame/nomination-pools/src/lib.rs @@ -3467,7 +3467,13 @@ impl Pallet { /// Check if any pool have an incorrect amount of ED frozen. /// /// This can happen if the ED has changed since the pool was created. - #[cfg(any(feature = "try-runtime", feature = "runtime-benchmarks", test, debug_assertions))] + #[cfg(any( + feature = "try-runtime", + feature = "runtime-benchmarks", + feature = "fuzzing", + test, + debug_assertions + ))] pub fn check_ed_imbalance() -> Result<(), DispatchError> { let mut failed: u32 = 0; BondedPools::::iter_keys().for_each(|id| { -- GitLab From 2cee87474203ce8fcf8a49e09522cda4a80bb08c Mon Sep 17 00:00:00 2001 From: yjh Date: Fri, 15 Dec 2023 05:55:46 +0800 Subject: [PATCH 039/191] feat: add super trait for block number (#2334) And also related to a subxt PR https://github.com/paritytech/subxt/pull/1265 --- polkadot/runtime/parachains/src/scheduler.rs | 2 +- .../client/consensus/beefy/src/worker.rs | 2 +- .../client/rpc-spec-v2/src/archive/archive.rs | 2 +- .../primitives/runtime/src/generic/header.rs | 22 +------- substrate/primitives/runtime/src/traits.rs | 53 ++++++++++++++----- 5 files changed, 45 insertions(+), 36 deletions(-) diff --git a/polkadot/runtime/parachains/src/scheduler.rs b/polkadot/runtime/parachains/src/scheduler.rs index b81b68b5745..dea84c69f52 100644 --- a/polkadot/runtime/parachains/src/scheduler.rs +++ b/polkadot/runtime/parachains/src/scheduler.rs @@ -446,7 +446,7 @@ impl Pallet { } let rotations_since_session_start: BlockNumberFor = - (at - session_start_block) / config.group_rotation_frequency.into(); + (at - session_start_block) / config.group_rotation_frequency; let rotations_since_session_start = as TryInto>::try_into(rotations_since_session_start) diff --git a/substrate/client/consensus/beefy/src/worker.rs b/substrate/client/consensus/beefy/src/worker.rs index 1fbda974053..da73a0d17d7 100644 --- a/substrate/client/consensus/beefy/src/worker.rs +++ b/substrate/client/consensus/beefy/src/worker.rs @@ -212,7 +212,7 @@ impl VoterOracle { // Accept any vote for a GRANDPA finalized block in a better round. Ok(( rounds.session_start().max(self.best_beefy_block), - (*self.best_grandpa_block_header.number()).into(), + (*self.best_grandpa_block_header.number()), )) } else { // Current session has mandatory not done. diff --git a/substrate/client/rpc-spec-v2/src/archive/archive.rs b/substrate/client/rpc-spec-v2/src/archive/archive.rs index b2bcc62ce31..269962cfd74 100644 --- a/substrate/client/rpc-spec-v2/src/archive/archive.rs +++ b/substrate/client/rpc-spec-v2/src/archive/archive.rs @@ -124,7 +124,7 @@ where let finalized_num = self.client.info().finalized_number; if finalized_num >= height { - let Ok(Some(hash)) = self.client.block_hash(height.into()) else { return Ok(vec![]) }; + let Ok(Some(hash)) = self.client.block_hash(height) else { return Ok(vec![]) }; return Ok(vec![hex_string(&hash.as_ref())]) } diff --git a/substrate/primitives/runtime/src/generic/header.rs b/substrate/primitives/runtime/src/generic/header.rs index 82ab9a61f96..0eeef363a06 100644 --- a/substrate/primitives/runtime/src/generic/header.rs +++ b/substrate/primitives/runtime/src/generic/header.rs @@ -21,16 +21,11 @@ use crate::{ codec::{Codec, Decode, Encode}, generic::Digest, scale_info::TypeInfo, - traits::{ - self, AtLeast32BitUnsigned, Hash as HashT, MaybeDisplay, MaybeFromStr, - MaybeSerializeDeserialize, Member, - }, + traits::{self, AtLeast32BitUnsigned, BlockNumber, Hash as HashT, MaybeDisplay, Member}, }; -use codec::{FullCodec, MaxEncodedLen}; #[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use sp_core::U256; -use sp_std::fmt::Debug; /// Abstraction over a block header for a substrate chain. #[derive(Encode, Decode, PartialEq, Eq, Clone, sp_core::RuntimeDebug, TypeInfo)] @@ -79,20 +74,7 @@ where impl traits::Header for Header where - Number: Member - + MaybeSerializeDeserialize - + MaybeFromStr - + Debug - + Default - + sp_std::hash::Hash - + MaybeDisplay - + AtLeast32BitUnsigned - + FullCodec - + Copy - + MaxEncodedLen - + Into - + TryFrom - + TypeInfo, + Number: BlockNumber, Hash: HashT, { type Number = Number; diff --git a/substrate/primitives/runtime/src/traits.rs b/substrate/primitives/runtime/src/traits.rs index ec79f43cabd..ecb751e9bfb 100644 --- a/substrate/primitives/runtime/src/traits.rs +++ b/substrate/primitives/runtime/src/traits.rs @@ -38,7 +38,7 @@ pub use sp_arithmetic::traits::{ EnsureOp, EnsureOpAssign, EnsureSub, EnsureSubAssign, IntegerSquareRoot, One, SaturatedConversion, Saturating, UniqueSaturatedFrom, UniqueSaturatedInto, Zero, }; -use sp_core::{self, storage::StateVersion, Hasher, RuntimeDebug, TypeId}; +use sp_core::{self, storage::StateVersion, Hasher, RuntimeDebug, TypeId, U256}; #[doc(hidden)] pub use sp_core::{ parameter_types, ConstBool, ConstI128, ConstI16, ConstI32, ConstI64, ConstI8, ConstU128, @@ -1149,6 +1149,44 @@ pub trait IsMember { fn is_member(member_id: &MemberId) -> bool; } +/// Super trait with all the attributes for a block number. +pub trait BlockNumber: + Member + + MaybeSerializeDeserialize + + MaybeFromStr + + Debug + + sp_std::hash::Hash + + Copy + + MaybeDisplay + + AtLeast32BitUnsigned + + Into + + TryFrom + + Default + + TypeInfo + + MaxEncodedLen + + FullCodec +{ +} + +impl< + T: Member + + MaybeSerializeDeserialize + + MaybeFromStr + + Debug + + sp_std::hash::Hash + + Copy + + MaybeDisplay + + AtLeast32BitUnsigned + + Into + + TryFrom + + Default + + TypeInfo + + MaxEncodedLen + + FullCodec, + > BlockNumber for T +{ +} + /// Something which fulfills the abstract idea of a Substrate header. It has types for a `Number`, /// a `Hash` and a `Hashing`. It provides access to an `extrinsics_root`, `state_root` and /// `parent_hash`, as well as a `digest` and a block `number`. @@ -1158,18 +1196,7 @@ pub trait Header: Clone + Send + Sync + Codec + Eq + MaybeSerialize + Debug + TypeInfo + 'static { /// Header number. - type Number: Member - + MaybeSerializeDeserialize - + MaybeFromStr - + Debug - + sp_std::hash::Hash - + Copy - + MaybeDisplay - + AtLeast32BitUnsigned - + Default - + TypeInfo - + MaxEncodedLen - + FullCodec; + type Number: BlockNumber; /// Header hash type type Hash: HashOutput; /// Hashing algorithm -- GitLab From 11edbaf6c05e9e969bd277cc6452b48f2fff3367 Mon Sep 17 00:00:00 2001 From: gupnik Date: Fri, 15 Dec 2023 11:17:19 +0530 Subject: [PATCH 040/191] Feature gate `do_task` in `frame_system` (#2707) https://github.com/paritytech/polkadot-sdk/pull/1343/ introduced Tasks API. This one moves `do_task` call in frame_system under the experimental flag, till the previous one is audited. --------- Co-authored-by: command-bot <> --- substrate/bin/node/runtime/Cargo.toml | 5 +++++ substrate/frame/examples/tasks/Cargo.toml | 1 + substrate/frame/examples/tasks/src/tests.rs | 11 ++++++++--- substrate/frame/support/test/Cargo.toml | 5 ++++- .../support/test/tests/pallet_outer_enums_explicit.rs | 2 ++ .../support/test/tests/pallet_outer_enums_implicit.rs | 2 ++ substrate/frame/system/Cargo.toml | 1 + substrate/frame/system/src/lib.rs | 10 +++++++++- 8 files changed, 32 insertions(+), 5 deletions(-) diff --git a/substrate/bin/node/runtime/Cargo.toml b/substrate/bin/node/runtime/Cargo.toml index 1d3f71f3436..693fd673da5 100644 --- a/substrate/bin/node/runtime/Cargo.toml +++ b/substrate/bin/node/runtime/Cargo.toml @@ -407,3 +407,8 @@ try-runtime = [ "pallet-whitelist/try-runtime", "sp-runtime/try-runtime", ] +experimental = [ + "frame-support/experimental", + "frame-system/experimental", + "pallet-example-tasks/experimental", +] diff --git a/substrate/frame/examples/tasks/Cargo.toml b/substrate/frame/examples/tasks/Cargo.toml index 046bad908d1..438cb60c756 100644 --- a/substrate/frame/examples/tasks/Cargo.toml +++ b/substrate/frame/examples/tasks/Cargo.toml @@ -53,3 +53,4 @@ try-runtime = [ "frame-system/try-runtime", "sp-runtime/try-runtime", ] +experimental = ["frame-support/experimental", "frame-system/experimental"] diff --git a/substrate/frame/examples/tasks/src/tests.rs b/substrate/frame/examples/tasks/src/tests.rs index 6b255491091..fc3c69f4aef 100644 --- a/substrate/frame/examples/tasks/src/tests.rs +++ b/substrate/frame/examples/tasks/src/tests.rs @@ -18,10 +18,13 @@ //! Tests for `pallet-example-tasks`. #![cfg(test)] -use crate::{mock::*, Numbers, Total}; -use frame_support::{assert_noop, assert_ok, traits::Task}; +use crate::{mock::*, Numbers}; +use frame_support::traits::Task; use sp_runtime::BuildStorage; +#[cfg(feature = "experimental")] +use frame_support::{assert_noop, assert_ok}; + // This function basically just builds a genesis storage key/value store according to // our desired mockup. pub fn new_test_ext() -> sp_io::TestExternalities { @@ -89,6 +92,7 @@ fn task_index_works_at_runtime_level() { }); } +#[cfg(feature = "experimental")] #[test] fn task_execution_works() { new_test_ext().execute_with(|| { @@ -105,11 +109,12 @@ fn task_execution_works() { assert_ok!(System::do_task(RuntimeOrigin::signed(1), task.clone(),)); assert_eq!(Numbers::::get(0), Some(1)); assert_eq!(Numbers::::get(1), None); - assert_eq!(Total::::get(), (1, 4)); + assert_eq!(crate::Total::::get(), (1, 4)); System::assert_last_event(frame_system::Event::::TaskCompleted { task }.into()); }); } +#[cfg(feature = "experimental")] #[test] fn task_execution_fails_for_invalid_task() { new_test_ext().execute_with(|| { diff --git a/substrate/frame/support/test/Cargo.toml b/substrate/frame/support/test/Cargo.toml index 8ee1b4b2918..e0c263fb4a1 100644 --- a/substrate/frame/support/test/Cargo.toml +++ b/substrate/frame/support/test/Cargo.toml @@ -61,7 +61,10 @@ std = [ "sp-version/std", "test-pallet/std", ] -experimental = ["frame-support/experimental"] +experimental = [ + "frame-support/experimental", + "frame-system/experimental", +] try-runtime = [ "frame-executive/try-runtime", "frame-support/try-runtime", diff --git a/substrate/frame/support/test/tests/pallet_outer_enums_explicit.rs b/substrate/frame/support/test/tests/pallet_outer_enums_explicit.rs index 6246ad93d67..d2acb798a2e 100644 --- a/substrate/frame/support/test/tests/pallet_outer_enums_explicit.rs +++ b/substrate/frame/support/test/tests/pallet_outer_enums_explicit.rs @@ -90,7 +90,9 @@ fn module_error_outer_enum_expand_explicit() { frame_system::Error::NonDefaultComposite => (), frame_system::Error::NonZeroRefCount => (), frame_system::Error::CallFiltered => (), + #[cfg(feature = "experimental")] frame_system::Error::InvalidTask => (), + #[cfg(feature = "experimental")] frame_system::Error::FailedTask => (), frame_system::Error::__Ignore(_, _) => (), }, diff --git a/substrate/frame/support/test/tests/pallet_outer_enums_implicit.rs b/substrate/frame/support/test/tests/pallet_outer_enums_implicit.rs index 26023dfa7b7..16a4b378f75 100644 --- a/substrate/frame/support/test/tests/pallet_outer_enums_implicit.rs +++ b/substrate/frame/support/test/tests/pallet_outer_enums_implicit.rs @@ -90,7 +90,9 @@ fn module_error_outer_enum_expand_implicit() { frame_system::Error::NonDefaultComposite => (), frame_system::Error::NonZeroRefCount => (), frame_system::Error::CallFiltered => (), + #[cfg(feature = "experimental")] frame_system::Error::InvalidTask => (), + #[cfg(feature = "experimental")] frame_system::Error::FailedTask => (), frame_system::Error::__Ignore(_, _) => (), }, diff --git a/substrate/frame/system/Cargo.toml b/substrate/frame/system/Cargo.toml index 2491ccd220c..c64c32b4575 100644 --- a/substrate/frame/system/Cargo.toml +++ b/substrate/frame/system/Cargo.toml @@ -56,6 +56,7 @@ runtime-benchmarks = [ "sp-runtime/runtime-benchmarks", ] try-runtime = ["frame-support/try-runtime", "sp-runtime/try-runtime"] +experimental = ["frame-support/experimental"] [[bench]] name = "bench" diff --git a/substrate/frame/system/src/lib.rs b/substrate/frame/system/src/lib.rs index 3697e36f3fc..20794d58cb6 100644 --- a/substrate/frame/system/src/lib.rs +++ b/substrate/frame/system/src/lib.rs @@ -323,9 +323,11 @@ pub mod pallet { #[inject_runtime_type] type RuntimeCall = (); - /// Converts a module to the index of the module, injected by `construct_runtime!`. + /// The aggregated Task type, injected by `construct_runtime!`. #[inject_runtime_type] type RuntimeTask = (); + + /// Converts a module to the index of the module, injected by `construct_runtime!`. #[inject_runtime_type] type PalletInfo = (); @@ -637,6 +639,7 @@ pub mod pallet { Ok(().into()) } + #[cfg(feature = "experimental")] #[pallet::call_index(8)] #[pallet::weight(task.weight())] pub fn do_task(origin: OriginFor, task: T::RuntimeTask) -> DispatchResultWithPostInfo { @@ -675,10 +678,13 @@ pub mod pallet { KilledAccount { account: T::AccountId }, /// On on-chain remark happened. Remarked { sender: T::AccountId, hash: T::Hash }, + #[cfg(feature = "experimental")] /// A [`Task`] has started executing TaskStarted { task: T::RuntimeTask }, + #[cfg(feature = "experimental")] /// A [`Task`] has finished executing. TaskCompleted { task: T::RuntimeTask }, + #[cfg(feature = "experimental")] /// A [`Task`] failed during execution. TaskFailed { task: T::RuntimeTask, err: DispatchError }, } @@ -702,8 +708,10 @@ pub mod pallet { NonZeroRefCount, /// The origin filter prevent the call to be dispatched. CallFiltered, + #[cfg(feature = "experimental")] /// The specified [`Task`] is not valid. InvalidTask, + #[cfg(feature = "experimental")] /// The specified [`Task`] failed during execution. FailedTask, } -- GitLab From b58f0aef2d85b1a70097de4f6530c382f7c24099 Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Fri, 15 Dec 2023 10:01:49 +0300 Subject: [PATCH 041/191] Governance can halt and resume Rococo <> Wococo bridge pallets over XCM (#2712) This PR adds possibility for relay chain governance to halt and resume bridge pallets using XCM calls. Following calls are enabled over XCM for the `root` origin: `pallet_bridge_grandpa::set_operating_mode`, `pallet_bridge_parachains::set_operating_mode` and `pallet_bridge_messages::set_operating_mode`. --- .../bridge-hub-rococo/src/xcm_config.rs | 32 ++- .../bridge-hub-rococo/tests/tests.rs | 57 ++++- .../bridge-hub-westend/src/xcm_config.rs | 14 +- .../bridge-hub-westend/tests/tests.rs | 30 ++- .../test-utils/src/test_cases/mod.rs | 210 +++++++++++++++++- 5 files changed, 312 insertions(+), 31 deletions(-) diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs index 19fb4fdea0f..f89e7b39db8 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs @@ -19,9 +19,13 @@ use super::{ ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, TransactionByteFee, WeightToFee, XcmpQueue, }; -use crate::bridge_common_config::{ - BridgeGrandpaRococoBulletinInstance, BridgeGrandpaWestendInstance, DeliveryRewardInBalance, - RequiredStakeForStakeAndSlash, +use crate::{ + bridge_common_config::{ + BridgeGrandpaRococoBulletinInstance, BridgeGrandpaWestendInstance, + BridgeParachainWestendInstance, DeliveryRewardInBalance, RequiredStakeForStakeAndSlash, + }, + bridge_to_bulletin_config::WithRococoBulletinMessagesInstance, + bridge_to_westend_config::WithBridgeHubWestendMessagesInstance, }; use bp_messages::LaneId; use bp_relayers::{PayRewardFromAccount, RewardsAccountOwner, RewardsAccountParams}; @@ -190,10 +194,30 @@ impl Contains for SafeCallFilter { Runtime, BridgeGrandpaWestendInstance, >::initialize { .. }) | + RuntimeCall::BridgeWestendGrandpa(pallet_bridge_grandpa::Call::< + Runtime, + BridgeGrandpaWestendInstance, + >::set_operating_mode { .. }) | + RuntimeCall::BridgeWestendParachains(pallet_bridge_parachains::Call::< + Runtime, + BridgeParachainWestendInstance, + >::set_operating_mode { .. }) | + RuntimeCall::BridgeWestendMessages(pallet_bridge_messages::Call::< + Runtime, + WithBridgeHubWestendMessagesInstance, + >::set_operating_mode { .. }) | RuntimeCall::BridgePolkadotBulletinGrandpa(pallet_bridge_grandpa::Call::< Runtime, BridgeGrandpaRococoBulletinInstance, - >::initialize { .. }) + >::initialize { .. }) | + RuntimeCall::BridgePolkadotBulletinGrandpa(pallet_bridge_grandpa::Call::< + Runtime, + BridgeGrandpaRococoBulletinInstance, + >::set_operating_mode { .. }) | + RuntimeCall::BridgePolkadotBulletinMessages(pallet_bridge_messages::Call::< + Runtime, + WithRococoBulletinMessagesInstance, + >::set_operating_mode { .. }) ) } } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs index b5e4552c452..0ba5fb37aef 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs @@ -152,11 +152,34 @@ mod bridge_hub_westend_tests { bridge_hub_test_utils::test_cases::initialize_bridge_by_governance_works::< Runtime, BridgeGrandpaWestendInstance, - >( - collator_session_keys(), - bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, - Box::new(|call| RuntimeCall::BridgeWestendGrandpa(call).encode()), - ) + >(collator_session_keys(), bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID) + } + + #[test] + fn change_bridge_grandpa_pallet_mode_by_governance_works() { + // for Westend finality + bridge_hub_test_utils::test_cases::change_bridge_grandpa_pallet_mode_by_governance_works::< + Runtime, + BridgeGrandpaWestendInstance, + >(collator_session_keys(), bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID) + } + + #[test] + fn change_bridge_parachains_pallet_mode_by_governance_works() { + // for Westend finality + bridge_hub_test_utils::test_cases::change_bridge_parachains_pallet_mode_by_governance_works::< + Runtime, + BridgeParachainWestendInstance, + >(collator_session_keys(), bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID) + } + + #[test] + fn change_bridge_messages_pallet_mode_by_governance_works() { + // for Westend finality + bridge_hub_test_utils::test_cases::change_bridge_messages_pallet_mode_by_governance_works::< + Runtime, + WithBridgeHubWestendMessagesInstance, + >(collator_session_keys(), bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID) } #[test] @@ -365,11 +388,25 @@ mod bridge_hub_bulletin_tests { bridge_hub_test_utils::test_cases::initialize_bridge_by_governance_works::< Runtime, BridgeGrandpaRococoBulletinInstance, - >( - collator_session_keys(), - bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, - Box::new(|call| RuntimeCall::BridgePolkadotBulletinGrandpa(call).encode()), - ) + >(collator_session_keys(), bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID) + } + + #[test] + fn change_bridge_grandpa_pallet_mode_by_governance_works() { + // for Bulletin finality + bridge_hub_test_utils::test_cases::change_bridge_grandpa_pallet_mode_by_governance_works::< + Runtime, + BridgeGrandpaRococoBulletinInstance, + >(collator_session_keys(), bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID) + } + + #[test] + fn change_bridge_messages_pallet_mode_by_governance_works() { + // for Bulletin finality + bridge_hub_test_utils::test_cases::change_bridge_messages_pallet_mode_by_governance_works::< + Runtime, + WithRococoBulletinMessagesInstance, + >(collator_session_keys(), bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID) } #[test] diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/xcm_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/xcm_config.rs index 26dc1f62950..d112328723d 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/xcm_config.rs @@ -176,7 +176,19 @@ impl Contains for SafeCallFilter { RuntimeCall::BridgeRococoGrandpa(pallet_bridge_grandpa::Call::< Runtime, crate::bridge_to_rococo_config::BridgeGrandpaRococoInstance, - >::initialize { .. }) + >::initialize { .. }) | + RuntimeCall::BridgeRococoGrandpa(pallet_bridge_grandpa::Call::< + Runtime, + crate::bridge_to_rococo_config::BridgeGrandpaRococoInstance, + >::set_operating_mode { .. }) | + RuntimeCall::BridgeRococoParachains(pallet_bridge_parachains::Call::< + Runtime, + crate::bridge_to_rococo_config::BridgeParachainRococoInstance, + >::set_operating_mode { .. }) | + RuntimeCall::BridgeRococoMessages(pallet_bridge_messages::Call::< + Runtime, + crate::bridge_to_rococo_config::WithBridgeHubRococoMessagesInstance, + >::set_operating_mode { .. }) ) } } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/tests/tests.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/tests/tests.rs index ffa2fb1cfdc..9a7f13f14c3 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/tests/tests.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/tests/tests.rs @@ -123,11 +123,31 @@ fn initialize_bridge_by_governance_works() { bridge_hub_test_utils::test_cases::initialize_bridge_by_governance_works::< Runtime, BridgeGrandpaRococoInstance, - >( - collator_session_keys(), - bp_bridge_hub_westend::BRIDGE_HUB_WESTEND_PARACHAIN_ID, - Box::new(|call| RuntimeCall::BridgeRococoGrandpa(call).encode()), - ) + >(collator_session_keys(), bp_bridge_hub_westend::BRIDGE_HUB_WESTEND_PARACHAIN_ID) +} + +#[test] +fn change_bridge_grandpa_pallet_mode_by_governance_works() { + bridge_hub_test_utils::test_cases::change_bridge_grandpa_pallet_mode_by_governance_works::< + Runtime, + BridgeGrandpaRococoInstance, + >(collator_session_keys(), bp_bridge_hub_westend::BRIDGE_HUB_WESTEND_PARACHAIN_ID) +} + +#[test] +fn change_bridge_parachains_pallet_mode_by_governance_works() { + bridge_hub_test_utils::test_cases::change_bridge_parachains_pallet_mode_by_governance_works::< + Runtime, + BridgeParachainRococoInstance, + >(collator_session_keys(), bp_bridge_hub_westend::BRIDGE_HUB_WESTEND_PARACHAIN_ID) +} + +#[test] +fn change_bridge_messages_pallet_mode_by_governance_works() { + bridge_hub_test_utils::test_cases::change_bridge_messages_pallet_mode_by_governance_works::< + Runtime, + WithBridgeHubRococoMessagesInstance, + >(collator_session_keys(), bp_bridge_hub_westend::BRIDGE_HUB_WESTEND_PARACHAIN_ID) } #[test] diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/mod.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/mod.rs index cc347ecf30d..c12a12548c7 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/mod.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/mod.rs @@ -29,8 +29,9 @@ use crate::test_data; use asset_test_utils::BasicParachainRuntime; use bp_messages::{ target_chain::{DispatchMessage, DispatchMessageData, MessageDispatch}, - LaneId, MessageKey, OutboundLaneData, + LaneId, MessageKey, MessagesOperatingMode, OutboundLaneData, }; +use bp_runtime::BasicOperatingMode; use bridge_runtime_common::messages_xcm_extension::{ XcmAsPlainPayload, XcmBlobMessageDispatchResult, }; @@ -88,13 +89,12 @@ where pub fn initialize_bridge_by_governance_works( collator_session_key: CollatorSessionKeys, runtime_para_id: u32, - runtime_call_encode: Box< - dyn Fn(pallet_bridge_grandpa::Call) -> Vec, - >, ) where Runtime: BasicParachainRuntime + pallet_bridge_grandpa::Config, GrandpaPalletInstance: 'static, ValidatorIdOf: From>, + ::RuntimeCall: + From>, { run_test::(collator_session_key, runtime_para_id, vec![], || { // check mode before @@ -104,12 +104,14 @@ pub fn initialize_bridge_by_governance_works( ); // encode `initialize` call - let initialize_call = runtime_call_encode(pallet_bridge_grandpa::Call::< - Runtime, - GrandpaPalletInstance, - >::initialize { - init_data: test_data::initialization_data::(12345), - }); + let initialize_call = + ::RuntimeCall::from(pallet_bridge_grandpa::Call::< + Runtime, + GrandpaPalletInstance, + >::initialize { + init_data: test_data::initialization_data::(12345), + }) + .encode(); // overestimate - check weight for `pallet_bridge_grandpa::Pallet::initialize()` call let require_weight_at_most = @@ -125,11 +127,197 @@ pub fn initialize_bridge_by_governance_works( // check mode after assert_eq!( pallet_bridge_grandpa::PalletOperatingMode::::try_get(), - Ok(bp_runtime::BasicOperatingMode::Normal) + Ok(BasicOperatingMode::Normal) ); }) } +/// Test-case makes sure that `Runtime` can change bridge GRANDPA pallet operating mode via +/// governance-like call. +pub fn change_bridge_grandpa_pallet_mode_by_governance_works( + collator_session_key: CollatorSessionKeys, + runtime_para_id: u32, +) where + Runtime: BasicParachainRuntime + pallet_bridge_grandpa::Config, + GrandpaPalletInstance: 'static, + ValidatorIdOf: From>, + ::RuntimeCall: + From>, +{ + run_test::(collator_session_key, runtime_para_id, vec![], || { + let dispatch_set_operating_mode_call = |old_mode, new_mode| { + // check old mode + assert_eq!( + pallet_bridge_grandpa::PalletOperatingMode::::get(), + old_mode, + ); + + // overestimate - check weight for `pallet_bridge_grandpa::Pallet::set_operating_mode()` + // call + let require_weight_at_most = + ::DbWeight::get().reads_writes(7, 7); + + // encode `set_operating_mode` call + let set_operating_mode_call = ::RuntimeCall::from( + pallet_bridge_grandpa::Call::::set_operating_mode { + operating_mode: new_mode, + }, + ) + .encode(); + + // execute XCM with Transacts to `initialize bridge` as governance does + assert_ok!(RuntimeHelper::::execute_as_governance( + set_operating_mode_call, + require_weight_at_most + ) + .ensure_complete()); + + // check mode after + assert_eq!( + pallet_bridge_grandpa::PalletOperatingMode::::try_get(), + Ok(new_mode) + ); + }; + + // check mode before + assert_eq!( + pallet_bridge_grandpa::PalletOperatingMode::::try_get(), + Err(()) + ); + + dispatch_set_operating_mode_call(BasicOperatingMode::Normal, BasicOperatingMode::Halted); + dispatch_set_operating_mode_call(BasicOperatingMode::Halted, BasicOperatingMode::Normal); + }); +} + +/// Test-case makes sure that `Runtime` can change bridge parachains pallet operating mode via +/// governance-like call. +pub fn change_bridge_parachains_pallet_mode_by_governance_works( + collator_session_key: CollatorSessionKeys, + runtime_para_id: u32, +) where + Runtime: BasicParachainRuntime + pallet_bridge_parachains::Config, + ParachainsPalletInstance: 'static, + ValidatorIdOf: From>, + ::RuntimeCall: + From>, +{ + run_test::(collator_session_key, runtime_para_id, vec![], || { + let dispatch_set_operating_mode_call = |old_mode, new_mode| { + // check old mode + assert_eq!( + pallet_bridge_parachains::PalletOperatingMode::::get(), + old_mode, + ); + + // overestimate - check weight for + // `pallet_bridge_parachains::Pallet::set_operating_mode()` call + let require_weight_at_most = + ::DbWeight::get().reads_writes(7, 7); + + // encode `set_operating_mode` call + let set_operating_mode_call = ::RuntimeCall::from(pallet_bridge_parachains::Call::< + Runtime, + ParachainsPalletInstance, + >::set_operating_mode { + operating_mode: new_mode, + }).encode(); + + // execute XCM with Transacts to `initialize bridge` as governance does + assert_ok!(RuntimeHelper::::execute_as_governance( + set_operating_mode_call, + require_weight_at_most + ) + .ensure_complete()); + + // check mode after + assert_eq!( + pallet_bridge_parachains::PalletOperatingMode::::try_get(), + Ok(new_mode) + ); + }; + + // check mode before + assert_eq!( + pallet_bridge_parachains::PalletOperatingMode::::try_get(), + Err(()) + ); + + dispatch_set_operating_mode_call(BasicOperatingMode::Normal, BasicOperatingMode::Halted); + dispatch_set_operating_mode_call(BasicOperatingMode::Halted, BasicOperatingMode::Normal); + }); +} + +/// Test-case makes sure that `Runtime` can change bridge messaging pallet operating mode via +/// governance-like call. +pub fn change_bridge_messages_pallet_mode_by_governance_works( + collator_session_key: CollatorSessionKeys, + runtime_para_id: u32, +) where + Runtime: BasicParachainRuntime + pallet_bridge_messages::Config, + MessagesPalletInstance: 'static, + ValidatorIdOf: From>, + ::RuntimeCall: + From>, +{ + run_test::(collator_session_key, runtime_para_id, vec![], || { + let dispatch_set_operating_mode_call = |old_mode, new_mode| { + // check old mode + assert_eq!( + pallet_bridge_messages::PalletOperatingMode::::get( + ), + old_mode, + ); + + // overestimate - check weight for + // `pallet_bridge_messages::Pallet::set_operating_mode()` call + let require_weight_at_most = + ::DbWeight::get().reads_writes(7, 7); + + // encode `set_operating_mode` call + let set_operating_mode_call = ::RuntimeCall::from(pallet_bridge_messages::Call::< + Runtime, + MessagesPalletInstance, + >::set_operating_mode { + operating_mode: new_mode, + }).encode(); + + // execute XCM with Transacts to `initialize bridge` as governance does + assert_ok!(RuntimeHelper::::execute_as_governance( + set_operating_mode_call, + require_weight_at_most + ) + .ensure_complete()); + + // check mode after + assert_eq!( + pallet_bridge_messages::PalletOperatingMode::::try_get(), + Ok(new_mode) + ); + }; + + // check mode before + assert_eq!( + pallet_bridge_messages::PalletOperatingMode::::try_get( + ), + Err(()) + ); + + dispatch_set_operating_mode_call( + MessagesOperatingMode::Basic(BasicOperatingMode::Normal), + MessagesOperatingMode::RejectingOutboundMessages, + ); + dispatch_set_operating_mode_call( + MessagesOperatingMode::RejectingOutboundMessages, + MessagesOperatingMode::Basic(BasicOperatingMode::Halted), + ); + dispatch_set_operating_mode_call( + MessagesOperatingMode::Basic(BasicOperatingMode::Halted), + MessagesOperatingMode::Basic(BasicOperatingMode::Normal), + ); + }); +} + /// Test-case makes sure that `Runtime` can handle xcm `ExportMessage`: /// Checks if received XCM messages is correctly added to the message outbound queue for delivery. /// For SystemParachains we expect unpaid execution. -- GitLab From 99df39194d5de45f46aa107fe5debb49ef2678db Mon Sep 17 00:00:00 2001 From: Serban Iorga Date: Fri, 15 Dec 2023 08:09:39 +0100 Subject: [PATCH 042/191] BEEFY: `expect_validator_set()` fix (#2716) Fixes #https://github.com/paritytech/polkadot-sdk/issues/2699 Modifying `expect_validator_set()` in order to be able to walk back until block 0. The chain state at block 0 is available even if we use `--sync fast` or `--sync warp`. This way we can retrieve the initial authority set even when BEEFY genesis is 1 and there is no authority change entry in the headers log. Credits to @acatangiu for the solution --------- Co-authored-by: Adrian Catangiu --- substrate/client/consensus/beefy/src/lib.rs | 38 ++++++++++----------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/substrate/client/consensus/beefy/src/lib.rs b/substrate/client/consensus/beefy/src/lib.rs index b3ff11add27..c3da2b886f4 100644 --- a/substrate/client/consensus/beefy/src/lib.rs +++ b/substrate/client/consensus/beefy/src/lib.rs @@ -543,25 +543,23 @@ where R: ProvideRuntimeApi, R::Api: BeefyApi, { - debug!(target: LOG_TARGET, "🥩 Try to find validator set active at header: {:?}", at_header); - runtime - .runtime_api() - .validator_set(at_header.hash()) - .ok() - .flatten() - .or_else(|| { - // if state unavailable, fallback to walking up the chain looking for the header - // Digest emitted when validator set active 'at_header' was enacted. - let blockchain = backend.blockchain(); - let mut header = at_header.clone(); - loop { - debug!(target: LOG_TARGET, "🥩 look for auth set change digest in header number: {:?}", *header.number()); - match worker::find_authorities_change::(&header) { - Some(active) => return Some(active), - // Move up the chain. - None => header = blockchain.expect_header(*header.parent_hash()).ok()?, - } + let blockchain = backend.blockchain(); + + // Walk up the chain looking for the validator set active at 'at_header'. Process both state and + // header digests. + debug!(target: LOG_TARGET, "🥩 Trying to find validator set active at header: {:?}", at_header); + let mut header = at_header.clone(); + loop { + if let Ok(Some(active)) = runtime.runtime_api().validator_set(at_header.hash()) { + return Ok(active) + } else { + debug!(target: LOG_TARGET, "🥩 Looking for auth set change at block number: {:?}", *header.number()); + match worker::find_authorities_change::(&header) { + Some(active) => return Ok(active), + // Move up the chain. Ultimately we'll get it from chain genesis state, or error out + // here. + None => header = blockchain.expect_header(*header.parent_hash())?, } - }) - .ok_or_else(|| ClientError::Backend("Could not find initial validator set".into())) + } + } } -- GitLab From ce1c9a44a79841ee03878be9710ac49401c71aa6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Fri, 15 Dec 2023 11:29:57 +0100 Subject: [PATCH 043/191] parachain-system: Do not take `self` for `last_relay_block_number` (#2720) FRAME DSL is working in a static context. --- cumulus/pallets/parachain-system/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cumulus/pallets/parachain-system/src/lib.rs b/cumulus/pallets/parachain-system/src/lib.rs index bac1ee28a7c..fc2c83627fb 100644 --- a/cumulus/pallets/parachain-system/src/lib.rs +++ b/cumulus/pallets/parachain-system/src/lib.rs @@ -1630,7 +1630,7 @@ impl Pallet { /// Get the relay chain block number which was used as an anchor for the last block in this /// chain. - pub fn last_relay_block_number(&self) -> RelayChainBlockNumber { + pub fn last_relay_block_number() -> RelayChainBlockNumber { LastRelayChainBlockNumber::::get() } } -- GitLab From ddd5434e148b4dd51c77040575e7850f92d42510 Mon Sep 17 00:00:00 2001 From: Javier Viola Date: Fri, 15 Dec 2023 09:26:35 -0300 Subject: [PATCH 044/191] fix zombienet test (#2719) Remove old version for `cli_args`, since this was fixed in the latest version of zombienet and the `latest` version of polkadot introduce the new flag `--insecure-validator-i-know-what-i-do`. Fix jobs like https://gitlab.parity.io/parity/mirrors/polkadot-sdk/-/jobs/4726174 Thx! --- .gitlab/pipeline/zombienet/polkadot.yml | 2 +- polkadot/zombienet_tests/misc/0002-upgrade-node.toml | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/.gitlab/pipeline/zombienet/polkadot.yml b/.gitlab/pipeline/zombienet/polkadot.yml index 356abaa93cd..6b89648c4e3 100644 --- a/.gitlab/pipeline/zombienet/polkadot.yml +++ b/.gitlab/pipeline/zombienet/polkadot.yml @@ -209,7 +209,7 @@ zombienet-polkadot-misc-0002-upgrade-node: # Exit if the job is not merge queue # - if [[ $CI_COMMIT_REF_NAME != *"gh-readonly-queue"* ]]; then echo "I will run only in a merge queue"; exit 0; fi - export ZOMBIENET_INTEGRATION_TEST_IMAGE="docker.io/parity/polkadot:latest" - - echo "Overrided poladot image ${ZOMBIENET_INTEGRATION_TEST_IMAGE}" + - echo "Overrided polkadot image ${ZOMBIENET_INTEGRATION_TEST_IMAGE}" - export COL_IMAGE="${COLANDER_IMAGE}":${PIPELINE_IMAGE_TAG} - BUILD_LINUX_JOB_ID="$(cat ./artifacts/BUILD_LINUX_JOB_ID)" - export POLKADOT_PR_ARTIFACTS_URL="https://gitlab.parity.io/parity/mirrors/polkadot-sdk/-/jobs/${BUILD_LINUX_JOB_ID}/artifacts/raw/artifacts" diff --git a/polkadot/zombienet_tests/misc/0002-upgrade-node.toml b/polkadot/zombienet_tests/misc/0002-upgrade-node.toml index b6fff6c8cb8..1edb18abcec 100644 --- a/polkadot/zombienet_tests/misc/0002-upgrade-node.toml +++ b/polkadot/zombienet_tests/misc/0002-upgrade-node.toml @@ -9,12 +9,10 @@ chain = "rococo-local" [[relaychain.nodes]] name = "alice" args = [ "-lparachain=debug,runtime=debug", "--db paritydb" ] - substrate_cli_args_version = 1 [[relaychain.nodes]] name = "bob" args = [ "-lparachain=debug,runtime=debug", "--db rocksdb" ] - substrate_cli_args_version = 1 [[relaychain.nodes]] name = "charlie" -- GitLab From ffb2125f4a135906bc2aaddc6f31a04891309a32 Mon Sep 17 00:00:00 2001 From: Ankan <10196091+Ank4n@users.noreply.github.com> Date: Fri, 15 Dec 2023 20:59:39 +0100 Subject: [PATCH 045/191] [NPoS] Remove better solution threshold for unsigned submissions (#2694) closes https://github.com/paritytech-secops/srlabs_findings/issues/78. Removes `BetterUnsignedThreshold` from pallet EPM. This will essentially mean any solution submitted by the validator that is strictly better than the current queued solution would be accepted. The reason for having these thresholds is to limit number of solutions submitted on-chain. However for unsigned submissions, the number of solutions that could be submitted on average is limited even without thresholding (calculation shown in the corresponding issue). --- polkadot/runtime/westend/src/lib.rs | 2 - prdoc/pr_2694.prdoc | 14 +++ substrate/bin/node/runtime/src/lib.rs | 3 - .../election-provider-multi-phase/src/lib.rs | 10 +- .../election-provider-multi-phase/src/mock.rs | 7 +- .../src/unsigned.rs | 91 +++++++++++++++---- .../test-staking-e2e/src/mock.rs | 1 - 7 files changed, 92 insertions(+), 36 deletions(-) create mode 100644 prdoc/pr_2694.prdoc diff --git a/polkadot/runtime/westend/src/lib.rs b/polkadot/runtime/westend/src/lib.rs index 0f068b093f5..e958a660e6e 100644 --- a/polkadot/runtime/westend/src/lib.rs +++ b/polkadot/runtime/westend/src/lib.rs @@ -531,7 +531,6 @@ parameter_types! { pub const SignedDepositByte: Balance = deposit(0, 10) / 1024; // Each good submission will get 1 WND as reward pub SignedRewardBase: Balance = 1 * UNITS; - pub BetterUnsignedThreshold: Perbill = Perbill::from_rational(5u32, 10_000); // 1 hour session, 15 minutes unsigned phase, 4 offchain executions. pub OffchainRepeat: BlockNumber = UnsignedPhase::get() / 4; @@ -608,7 +607,6 @@ impl pallet_election_provider_multi_phase::Config for Runtime { type MinerConfig = Self; type SlashHandler = (); // burn slashes type RewardHandler = (); // nothing to do upon rewards - type BetterUnsignedThreshold = BetterUnsignedThreshold; type BetterSignedThreshold = (); type OffchainRepeat = OffchainRepeat; type MinerTxPriority = NposSolutionPriority; diff --git a/prdoc/pr_2694.prdoc b/prdoc/pr_2694.prdoc new file mode 100644 index 00000000000..c393dcfeb9a --- /dev/null +++ b/prdoc/pr_2694.prdoc @@ -0,0 +1,14 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "pallet-election-provider-multi-phase: Removes `BetterUnsignedThreshold` from pallet config" + +doc: + - audience: Runtime Dev + description: | + Removes thresholding for accepting solutions better than the last queued for unsigned phase. This is unnecessary + as even without thresholding, the number of solutions that can be submitted to on-chain which is better than the + previous one is limited. + +crates: + - name: "pallet-election-provider-multi-phase" diff --git a/substrate/bin/node/runtime/src/lib.rs b/substrate/bin/node/runtime/src/lib.rs index 4d0b253413a..76a5c2bf65f 100644 --- a/substrate/bin/node/runtime/src/lib.rs +++ b/substrate/bin/node/runtime/src/lib.rs @@ -704,8 +704,6 @@ parameter_types! { pub const SignedDepositIncreaseFactor: Percent = Percent::from_percent(10); pub const SignedDepositByte: Balance = 1 * CENTS; - pub BetterUnsignedThreshold: Perbill = Perbill::from_rational(1u32, 10_000); - // miner configs pub const MultiPhaseUnsignedPriority: TransactionPriority = StakingUnsignedPriority::get() - 1u64; pub MinerMaxWeight: Weight = RuntimeBlockWeights::get() @@ -822,7 +820,6 @@ impl pallet_election_provider_multi_phase::Config for Runtime { type EstimateCallFee = TransactionPayment; type SignedPhase = SignedPhase; type UnsignedPhase = UnsignedPhase; - type BetterUnsignedThreshold = BetterUnsignedThreshold; type BetterSignedThreshold = (); type OffchainRepeat = OffchainRepeat; type MinerTxPriority = MultiPhaseUnsignedPriority; diff --git a/substrate/frame/election-provider-multi-phase/src/lib.rs b/substrate/frame/election-provider-multi-phase/src/lib.rs index 41284f6c78b..04325a40d0a 100644 --- a/substrate/frame/election-provider-multi-phase/src/lib.rs +++ b/substrate/frame/election-provider-multi-phase/src/lib.rs @@ -101,9 +101,8 @@ //! unsigned transaction, thus the name _unsigned_ phase. This unsigned transaction can never be //! valid if propagated, and it acts similar to an inherent. //! -//! Validators will only submit solutions if the one that they have computed is sufficiently better -//! than the best queued one (see [`pallet::Config::BetterUnsignedThreshold`]) and will limit the -//! weight of the solution to [`MinerConfig::MaxWeight`]. +//! Validators will only submit solutions if the one that they have computed is strictly better than +//! the best queued one and will limit the weight of the solution to [`MinerConfig::MaxWeight`]. //! //! The unsigned phase can be made passive depending on how the previous signed phase went, by //! setting the first inner value of [`Phase`] to `false`. For now, the signed phase is always @@ -598,11 +597,6 @@ pub mod pallet { #[pallet::constant] type BetterSignedThreshold: Get; - /// The minimum amount of improvement to the solution score that defines a solution as - /// "better" in the Unsigned phase. - #[pallet::constant] - type BetterUnsignedThreshold: Get; - /// The repeat threshold of the offchain worker. /// /// For example, if it is 5, that means that at least 5 blocks will elapse between attempts diff --git a/substrate/frame/election-provider-multi-phase/src/mock.rs b/substrate/frame/election-provider-multi-phase/src/mock.rs index abad7db037e..af126f08d51 100644 --- a/substrate/frame/election-provider-multi-phase/src/mock.rs +++ b/substrate/frame/election-provider-multi-phase/src/mock.rs @@ -301,7 +301,6 @@ parameter_types! { pub static SignedMaxWeight: Weight = BlockWeights::get().max_block; pub static MinerTxPriority: u64 = 100; pub static BetterSignedThreshold: Perbill = Perbill::zero(); - pub static BetterUnsignedThreshold: Perbill = Perbill::zero(); pub static OffchainRepeat: BlockNumber = 5; pub static MinerMaxWeight: Weight = BlockWeights::get().max_block; pub static MinerMaxLength: u32 = 256; @@ -399,7 +398,6 @@ impl crate::Config for Runtime { type EstimateCallFee = frame_support::traits::ConstU32<8>; type SignedPhase = SignedPhase; type UnsignedPhase = UnsignedPhase; - type BetterUnsignedThreshold = BetterUnsignedThreshold; type BetterSignedThreshold = BetterSignedThreshold; type OffchainRepeat = OffchainRepeat; type MinerTxPriority = MinerTxPriority; @@ -538,10 +536,7 @@ impl ExtBuilder { ::set(p); self } - pub fn better_unsigned_threshold(self, p: Perbill) -> Self { - ::set(p); - self - } + pub fn phases(self, signed: BlockNumber, unsigned: BlockNumber) -> Self { ::set(signed); ::set(unsigned); diff --git a/substrate/frame/election-provider-multi-phase/src/unsigned.rs b/substrate/frame/election-provider-multi-phase/src/unsigned.rs index e3d0ded9751..94348181334 100644 --- a/substrate/frame/election-provider-multi-phase/src/unsigned.rs +++ b/substrate/frame/election-provider-multi-phase/src/unsigned.rs @@ -384,9 +384,8 @@ impl Pallet { // ensure score is being improved. Panic henceforth. ensure!( - Self::queued_solution().map_or(true, |q: ReadySolution<_, _>| raw_solution - .score - .strict_threshold_better(q.score, T::BetterUnsignedThreshold::get())), + Self::queued_solution() + .map_or(true, |q: ReadySolution<_, _>| raw_solution.score > q.score), Error::::PreDispatchWeakSubmission, ); @@ -1025,7 +1024,7 @@ mod tests { bounded_vec, offchain::storage_lock::{BlockAndTime, StorageLock}, traits::{Dispatchable, ValidateUnsigned, Zero}, - ModuleError, PerU16, Perbill, + ModuleError, PerU16, }; type Assignment = crate::unsigned::Assignment; @@ -1360,7 +1359,7 @@ mod tests { .desired_targets(1) .add_voter(7, 2, bounded_vec![10]) .add_voter(8, 5, bounded_vec![10]) - .better_unsigned_threshold(Perbill::from_percent(50)) + .add_voter(9, 1, bounded_vec![10]) .build_and_execute(|| { roll_to_unsigned(); assert!(MultiPhase::current_phase().is_unsigned()); @@ -1368,12 +1367,15 @@ mod tests { // an initial solution let result = ElectionResult { - // note: This second element of backing stake is not important here. - winners: vec![(10, 10)], - assignments: vec![Assignment { - who: 10, - distribution: vec![(10, PerU16::one())], - }], + winners: vec![(10, 12)], + assignments: vec![ + Assignment { who: 10, distribution: vec![(10, PerU16::one())] }, + Assignment { + who: 7, + // note: this percent doesn't even matter, in solution it is 100%. + distribution: vec![(10, PerU16::one())], + }, + ], }; let RoundSnapshot { voters, targets } = MultiPhase::snapshot().unwrap(); @@ -1394,9 +1396,35 @@ mod tests { Box::new(solution), witness )); - assert_eq!(MultiPhase::queued_solution().unwrap().score.minimal_stake, 10); + assert_eq!(MultiPhase::queued_solution().unwrap().score.minimal_stake, 12); - // trial 1: a solution who's score is only 2, i.e. 20% better in the first element. + // trial 1: a solution who's minimal stake is 10, i.e. worse than the first solution + // of 12. + let result = ElectionResult { + winners: vec![(10, 10)], + assignments: vec![Assignment { + who: 10, + distribution: vec![(10, PerU16::one())], + }], + }; + let (raw, score, _, _) = Miner::::prepare_election_result_with_snapshot( + result, + voters.clone(), + targets.clone(), + desired_targets, + ) + .unwrap(); + let solution = RawSolution { solution: raw, score, round: MultiPhase::round() }; + // 10 is not better than 12 + assert_eq!(solution.score.minimal_stake, 10); + // submitting this will actually panic. + assert_noop!( + MultiPhase::unsigned_pre_dispatch_checks(&solution), + Error::::PreDispatchWeakSubmission, + ); + + // trial 2: try resubmitting another solution with same score (12) as the queued + // solution. let result = ElectionResult { winners: vec![(10, 12)], assignments: vec![ @@ -1408,6 +1436,7 @@ mod tests { }, ], }; + let (raw, score, _, _) = Miner::::prepare_election_result_with_snapshot( result, voters.clone(), @@ -1416,15 +1445,45 @@ mod tests { ) .unwrap(); let solution = RawSolution { solution: raw, score, round: MultiPhase::round() }; - // 12 is not 50% more than 10 + // 12 is not better than 12. We need score of atleast 13 to be accepted. assert_eq!(solution.score.minimal_stake, 12); + // submitting this will panic. assert_noop!( MultiPhase::unsigned_pre_dispatch_checks(&solution), Error::::PreDispatchWeakSubmission, ); - // submitting this will actually panic. - // trial 2: a solution who's score is only 7, i.e. 70% better in the first element. + // trial 3: a solution who's minimal stake is 13, i.e. 1 better than the queued + // solution of 12. + let result = ElectionResult { + winners: vec![(10, 12)], + assignments: vec![ + Assignment { who: 10, distribution: vec![(10, PerU16::one())] }, + Assignment { who: 7, distribution: vec![(10, PerU16::one())] }, + Assignment { who: 9, distribution: vec![(10, PerU16::one())] }, + ], + }; + let (raw, score, witness, _) = + Miner::::prepare_election_result_with_snapshot( + result, + voters.clone(), + targets.clone(), + desired_targets, + ) + .unwrap(); + let solution = RawSolution { solution: raw, score, round: MultiPhase::round() }; + assert_eq!(solution.score.minimal_stake, 13); + + // this should work + assert_ok!(MultiPhase::unsigned_pre_dispatch_checks(&solution)); + assert_ok!(MultiPhase::submit_unsigned( + RuntimeOrigin::none(), + Box::new(solution), + witness + )); + + // trial 4: a solution who's minimal stake is 17, i.e. 4 better than the last + // soluton. let result = ElectionResult { winners: vec![(10, 12)], assignments: vec![ diff --git a/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/mock.rs b/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/mock.rs index ecb2ae435b8..04d218acf8f 100644 --- a/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/mock.rs +++ b/substrate/frame/election-provider-multi-phase/test-staking-e2e/src/mock.rs @@ -190,7 +190,6 @@ impl pallet_election_provider_multi_phase::Config for Runtime { type SignedPhase = SignedPhase; type UnsignedPhase = UnsignedPhase; type BetterSignedThreshold = (); - type BetterUnsignedThreshold = (); type OffchainRepeat = OffchainRepeat; type MinerTxPriority = TransactionPriority; type MinerConfig = Self; -- GitLab From e5b2adac7ad5c44f0231af808e18258f4599c882 Mon Sep 17 00:00:00 2001 From: Liam Aharon Date: Sat, 16 Dec 2023 15:26:22 +0400 Subject: [PATCH 046/191] `chain-spec-builder`: Improve output path example (#2693) Example currently broken. It writes something to the given path, but not the full chain spec. --------- Co-authored-by: Michal Kucharczyk <1728078+michalkucharczyk@users.noreply.github.com> --- .../bin/utils/chain-spec-builder/src/lib.rs | 36 +++++++++++-------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/substrate/bin/utils/chain-spec-builder/src/lib.rs b/substrate/bin/utils/chain-spec-builder/src/lib.rs index 60ec0f1a656..8c78030c885 100644 --- a/substrate/bin/utils/chain-spec-builder/src/lib.rs +++ b/substrate/bin/utils/chain-spec-builder/src/lib.rs @@ -30,46 +30,52 @@ //! ## Typical use-cases. //! ##### Get default config from runtime. //! -//! Query the default genesis config from the provided `runtime.wasm` and use it in the chain -//! spec. Tool can also store runtime's default genesis config in given file: -//! ```text -//! chain-spec-builder create -r runtime.wasm default /dev/stdout +//! Query the default genesis config from the provided `runtime.wasm` and use it in the chain +//! spec. The tool allows specifying where to write the chain spec, and optionally also where the +//! write the default genesis state config (which is `/dev/stdout` in the following example): +//! ```text +//! chain-spec-builder --chain_spec_path ./my_chain_spec.json create -r runtime.wasm default /dev/stdout //! ``` -//! -//! _Note:_ [`GenesisBuilder::create_default_config`][sp-genesis-builder-create] runtime function is called. +//! +//! _Note:_ [`GenesisBuilder::create_default_config`][sp-genesis-builder-create] runtime function is +//! called. //! //! //! ##### Generate raw storage chain spec using genesis config patch. //! //! Patch the runtime's default genesis config with provided `patch.json` and generate raw //! storage (`-s`) version of chain spec: -//! ```text +//! +//! ```bash //! chain-spec-builder create -s -r runtime.wasm patch patch.json //! ``` -//! +//! //! _Note:_ [`GenesisBuilder::build_config`][sp-genesis-builder-build] runtime function is called. //! //! ##### Generate raw storage chain spec using full genesis config. //! //! Build the chain spec using provided full genesis config json file. No defaults will be used: -//! ```text +//! +//! ```bash //! chain-spec-builder create -s -r runtime.wasm full full-genesis-config.json //! ``` -//! +//! //! _Note_: [`GenesisBuilder::build_config`][sp-genesis-builder-build] runtime function is called. //! //! ##### Generate human readable chain spec using provided genesis config patch. -//! ```text +//! ```bash //! chain-spec-builder create -r runtime.wasm patch patch.json //! ``` -//! +//! //! ##### Generate human readable chain spec using provided full genesis config. -//! ```text +//! +//! ```bash //! chain-spec-builder create -r runtime.wasm full full-genesis-config.json //! ``` -//! +//! //! ##### Extra tools. -//! The `chain-spec-builder` provides also some extra utilities: [`VerifyCmd`], [`ConvertToRawCmd`], [`UpdateCodeCmd`]. +//! The `chain-spec-builder` provides also some extra utilities: [`VerifyCmd`], [`ConvertToRawCmd`], +//! [`UpdateCodeCmd`]. //! //! [`sc-chain-spec`]: ../sc_chain_spec/index.html //! [`node-cli`]: ../node_cli/index.html -- GitLab From 64d52f225e127575b51ab7fdf677783f5cd497f4 Mon Sep 17 00:00:00 2001 From: Sergej Sakac <73715684+Szegoo@users.noreply.github.com> Date: Sat, 16 Dec 2023 23:41:53 +0100 Subject: [PATCH 047/191] Publicly expose inaccessible `pallet_uniques` state (#2727) A small PR to publicly expose the `pallet_uniques` state that is not accessible through the nonfungibles implementation. Currently, this state is unreachable from chain extensions. --- substrate/frame/uniques/src/lib.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/substrate/frame/uniques/src/lib.rs b/substrate/frame/uniques/src/lib.rs index 8334a8d943e..63a6e83de07 100644 --- a/substrate/frame/uniques/src/lib.rs +++ b/substrate/frame/uniques/src/lib.rs @@ -165,7 +165,7 @@ pub mod pallet { #[pallet::storage] #[pallet::storage_prefix = "Class"] /// Details of a collection. - pub(super) type Collection, I: 'static = ()> = StorageMap< + pub type Collection, I: 'static = ()> = StorageMap< _, Blake2_128Concat, T::CollectionId, @@ -174,7 +174,7 @@ pub mod pallet { #[pallet::storage] /// The collection, if any, of which an account is willing to take ownership. - pub(super) type OwnershipAcceptance, I: 'static = ()> = + pub type OwnershipAcceptance, I: 'static = ()> = StorageMap<_, Blake2_128Concat, T::AccountId, T::CollectionId>; #[pallet::storage] @@ -208,7 +208,7 @@ pub mod pallet { #[pallet::storage] #[pallet::storage_prefix = "Asset"] /// The items in existence and their ownership details. - pub(super) type Item, I: 'static = ()> = StorageDoubleMap< + pub type Item, I: 'static = ()> = StorageDoubleMap< _, Blake2_128Concat, T::CollectionId, @@ -257,7 +257,7 @@ pub mod pallet { #[pallet::storage] /// Price of an asset instance. - pub(super) type ItemPriceOf, I: 'static = ()> = StorageDoubleMap< + pub type ItemPriceOf, I: 'static = ()> = StorageDoubleMap< _, Blake2_128Concat, T::CollectionId, -- GitLab From a250652b3bdf228188d435f57501cc40cc8caf86 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Dec 2023 09:35:33 +0100 Subject: [PATCH 048/191] Bump async-trait from 0.1.73 to 0.1.74 (#2730) Bumps [async-trait](https://github.com/dtolnay/async-trait) from 0.1.73 to 0.1.74.
Release notes

Sourced from async-trait's releases.

0.1.74

  • Documentation improvements
Commits
  • 265979b Release 0.1.74
  • 5e67709 Fix doc test when async fn in trait is natively supported
  • ef144ae Update ui test suite to nightly-2023-10-15
  • 9398a28 Test docs.rs documentation build in CI
  • 8737173 Update ui test suite to nightly-2023-09-24
  • 5ba643c Test dyn Trait containing async fn
  • 247c8e7 Add ui test testing the recommendation to use async-trait
  • 799db66 Update ui test suite to nightly-2023-09-23
  • 0e60248 Update actions/checkout@v3 -> v4
  • 7fcbc83 Update ui test suite to nightly-2023-08-29
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=async-trait&package-manager=cargo&previous-version=0.1.73&new-version=0.1.74)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- cumulus/client/collator/Cargo.toml | 2 +- cumulus/client/consensus/aura/Cargo.toml | 2 +- cumulus/client/consensus/common/Cargo.toml | 2 +- cumulus/client/consensus/proposer/Cargo.toml | 2 +- cumulus/client/consensus/relay-chain/Cargo.toml | 2 +- cumulus/client/network/Cargo.toml | 2 +- cumulus/client/pov-recovery/Cargo.toml | 2 +- cumulus/client/relay-chain-inprocess-interface/Cargo.toml | 2 +- cumulus/client/relay-chain-interface/Cargo.toml | 2 +- cumulus/client/relay-chain-minimal-node/Cargo.toml | 2 +- cumulus/client/relay-chain-rpc-interface/Cargo.toml | 2 +- cumulus/polkadot-parachain/Cargo.toml | 2 +- cumulus/primitives/parachain-inherent/Cargo.toml | 2 +- cumulus/test/service/Cargo.toml | 2 +- polkadot/node/core/approval-voting/Cargo.toml | 2 +- polkadot/node/core/candidate-validation/Cargo.toml | 2 +- polkadot/node/core/parachains-inherent/Cargo.toml | 2 +- polkadot/node/core/runtime-api/Cargo.toml | 2 +- polkadot/node/malus/Cargo.toml | 2 +- polkadot/node/network/availability-recovery/Cargo.toml | 2 +- polkadot/node/network/bridge/Cargo.toml | 2 +- polkadot/node/network/dispute-distribution/Cargo.toml | 2 +- polkadot/node/network/gossip-support/Cargo.toml | 2 +- polkadot/node/network/protocol/Cargo.toml | 2 +- polkadot/node/overseer/Cargo.toml | 2 +- polkadot/node/service/Cargo.toml | 2 +- polkadot/node/subsystem-bench/Cargo.toml | 2 +- polkadot/node/subsystem-test-helpers/Cargo.toml | 2 +- polkadot/node/subsystem-types/Cargo.toml | 2 +- polkadot/node/subsystem-util/Cargo.toml | 2 +- substrate/client/authority-discovery/Cargo.toml | 2 +- substrate/client/consensus/aura/Cargo.toml | 2 +- substrate/client/consensus/babe/Cargo.toml | 2 +- substrate/client/consensus/beefy/Cargo.toml | 2 +- substrate/client/consensus/common/Cargo.toml | 2 +- substrate/client/consensus/grandpa/Cargo.toml | 2 +- substrate/client/consensus/manual-seal/Cargo.toml | 2 +- substrate/client/consensus/pow/Cargo.toml | 2 +- substrate/client/consensus/slots/Cargo.toml | 2 +- substrate/client/network-gossip/Cargo.toml | 2 +- substrate/client/network/common/Cargo.toml | 2 +- substrate/client/network/sync/Cargo.toml | 2 +- substrate/client/network/test/Cargo.toml | 2 +- substrate/client/service/Cargo.toml | 2 +- substrate/client/transaction-pool/Cargo.toml | 2 +- substrate/client/transaction-pool/api/Cargo.toml | 2 +- substrate/primitives/consensus/aura/Cargo.toml | 2 +- substrate/primitives/consensus/babe/Cargo.toml | 2 +- substrate/primitives/consensus/common/Cargo.toml | 2 +- substrate/primitives/inherents/Cargo.toml | 2 +- substrate/primitives/timestamp/Cargo.toml | 2 +- substrate/primitives/transaction-storage-proof/Cargo.toml | 2 +- substrate/test-utils/client/Cargo.toml | 2 +- substrate/utils/frame/rpc/client/Cargo.toml | 2 +- substrate/utils/frame/try-runtime/cli/Cargo.toml | 2 +- 56 files changed, 57 insertions(+), 57 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f858df0abe8..32e68779fd1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1169,9 +1169,9 @@ checksum = "ecc7ab41815b3c653ccd2978ec3255c81349336702dfdf62ee6f7069b12a3aae" [[package]] name = "async-trait" -version = "0.1.73" +version = "0.1.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" +checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" dependencies = [ "proc-macro2", "quote", diff --git a/cumulus/client/collator/Cargo.toml b/cumulus/client/collator/Cargo.toml index 7392934f4c9..5aa260eae1b 100644 --- a/cumulus/client/collator/Cargo.toml +++ b/cumulus/client/collator/Cargo.toml @@ -34,7 +34,7 @@ cumulus-client-network = { path = "../network" } cumulus-primitives-core = { path = "../../primitives/core" } [dev-dependencies] -async-trait = "0.1.73" +async-trait = "0.1.74" # Substrate sp-maybe-compressed-blob = { path = "../../../substrate/primitives/maybe-compressed-blob" } diff --git a/cumulus/client/consensus/aura/Cargo.toml b/cumulus/client/consensus/aura/Cargo.toml index cd77504a2a2..4c20911c645 100644 --- a/cumulus/client/consensus/aura/Cargo.toml +++ b/cumulus/client/consensus/aura/Cargo.toml @@ -10,7 +10,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" workspace = true [dependencies] -async-trait = "0.1.73" +async-trait = "0.1.74" codec = { package = "parity-scale-codec", version = "3.0.0", features = ["derive"] } futures = "0.3.28" tracing = "0.1.37" diff --git a/cumulus/client/consensus/common/Cargo.toml b/cumulus/client/consensus/common/Cargo.toml index 770e5c01e8b..4796667d695 100644 --- a/cumulus/client/consensus/common/Cargo.toml +++ b/cumulus/client/consensus/common/Cargo.toml @@ -10,7 +10,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" workspace = true [dependencies] -async-trait = "0.1.73" +async-trait = "0.1.74" codec = { package = "parity-scale-codec", version = "3.0.0", features = ["derive"] } dyn-clone = "1.0.12" futures = "0.3.28" diff --git a/cumulus/client/consensus/proposer/Cargo.toml b/cumulus/client/consensus/proposer/Cargo.toml index 2006eac5bf1..107f466ca10 100644 --- a/cumulus/client/consensus/proposer/Cargo.toml +++ b/cumulus/client/consensus/proposer/Cargo.toml @@ -11,7 +11,7 @@ workspace = true [dependencies] anyhow = "1.0" -async-trait = "0.1.73" +async-trait = "0.1.74" thiserror = "1.0.48" # Substrate diff --git a/cumulus/client/consensus/relay-chain/Cargo.toml b/cumulus/client/consensus/relay-chain/Cargo.toml index 76b1c9a422f..d7702809779 100644 --- a/cumulus/client/consensus/relay-chain/Cargo.toml +++ b/cumulus/client/consensus/relay-chain/Cargo.toml @@ -10,7 +10,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" workspace = true [dependencies] -async-trait = "0.1.73" +async-trait = "0.1.74" futures = "0.3.28" parking_lot = "0.12.1" tracing = "0.1.37" diff --git a/cumulus/client/network/Cargo.toml b/cumulus/client/network/Cargo.toml index 5e0d478f5ac..edd349155fa 100644 --- a/cumulus/client/network/Cargo.toml +++ b/cumulus/client/network/Cargo.toml @@ -10,7 +10,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" workspace = true [dependencies] -async-trait = "0.1.73" +async-trait = "0.1.74" codec = { package = "parity-scale-codec", version = "3.0.0", features = ["derive"] } futures = "0.3.28" futures-timer = "3.0.2" diff --git a/cumulus/client/pov-recovery/Cargo.toml b/cumulus/client/pov-recovery/Cargo.toml index 93d65016530..ad55e0e9c4b 100644 --- a/cumulus/client/pov-recovery/Cargo.toml +++ b/cumulus/client/pov-recovery/Cargo.toml @@ -32,7 +32,7 @@ polkadot-primitives = { path = "../../../polkadot/primitives" } # Cumulus cumulus-primitives-core = { path = "../../primitives/core" } cumulus-relay-chain-interface = { path = "../relay-chain-interface" } -async-trait = "0.1.73" +async-trait = "0.1.74" [dev-dependencies] tokio = { version = "1.32.0", features = ["macros"] } diff --git a/cumulus/client/relay-chain-inprocess-interface/Cargo.toml b/cumulus/client/relay-chain-inprocess-interface/Cargo.toml index 15063d09bca..63f4c915474 100644 --- a/cumulus/client/relay-chain-inprocess-interface/Cargo.toml +++ b/cumulus/client/relay-chain-inprocess-interface/Cargo.toml @@ -10,7 +10,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" workspace = true [dependencies] -async-trait = "0.1.73" +async-trait = "0.1.74" futures = "0.3.28" futures-timer = "3.0.2" diff --git a/cumulus/client/relay-chain-interface/Cargo.toml b/cumulus/client/relay-chain-interface/Cargo.toml index 98893a398fb..5100119a2e4 100644 --- a/cumulus/client/relay-chain-interface/Cargo.toml +++ b/cumulus/client/relay-chain-interface/Cargo.toml @@ -20,7 +20,7 @@ sp-state-machine = { path = "../../../substrate/primitives/state-machine" } sc-client-api = { path = "../../../substrate/client/api" } futures = "0.3.28" -async-trait = "0.1.73" +async-trait = "0.1.74" thiserror = "1.0.48" jsonrpsee-core = "0.16.2" parity-scale-codec = "3.6.4" diff --git a/cumulus/client/relay-chain-minimal-node/Cargo.toml b/cumulus/client/relay-chain-minimal-node/Cargo.toml index b22731b3a6d..45b958998bd 100644 --- a/cumulus/client/relay-chain-minimal-node/Cargo.toml +++ b/cumulus/client/relay-chain-minimal-node/Cargo.toml @@ -48,6 +48,6 @@ cumulus-primitives-core = { path = "../../primitives/core" } array-bytes = "6.1" tracing = "0.1.37" -async-trait = "0.1.73" +async-trait = "0.1.74" futures = "0.3.28" parking_lot = "0.12.1" diff --git a/cumulus/client/relay-chain-rpc-interface/Cargo.toml b/cumulus/client/relay-chain-rpc-interface/Cargo.toml index 050bea08f0f..2295bffddcf 100644 --- a/cumulus/client/relay-chain-rpc-interface/Cargo.toml +++ b/cumulus/client/relay-chain-rpc-interface/Cargo.toml @@ -35,7 +35,7 @@ futures-timer = "3.0.2" parity-scale-codec = "3.6.4" jsonrpsee = { version = "0.16.2", features = ["ws-client"] } tracing = "0.1.37" -async-trait = "0.1.73" +async-trait = "0.1.74" url = "2.4.0" serde_json = "1.0.108" serde = "1.0.193" diff --git a/cumulus/polkadot-parachain/Cargo.toml b/cumulus/polkadot-parachain/Cargo.toml index b8c1508da09..8b7d1c1483c 100644 --- a/cumulus/polkadot-parachain/Cargo.toml +++ b/cumulus/polkadot-parachain/Cargo.toml @@ -15,7 +15,7 @@ name = "polkadot-parachain" path = "src/main.rs" [dependencies] -async-trait = "0.1.73" +async-trait = "0.1.74" clap = { version = "4.4.11", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } futures = "0.3.28" diff --git a/cumulus/primitives/parachain-inherent/Cargo.toml b/cumulus/primitives/parachain-inherent/Cargo.toml index bfb101a43f4..f914af11751 100644 --- a/cumulus/primitives/parachain-inherent/Cargo.toml +++ b/cumulus/primitives/parachain-inherent/Cargo.toml @@ -10,7 +10,7 @@ license = "Apache-2.0" workspace = true [dependencies] -async-trait = { version = "0.1.73", optional = true } +async-trait = { version = "0.1.74", optional = true } codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } tracing = { version = "0.1.37", optional = true } diff --git a/cumulus/test/service/Cargo.toml b/cumulus/test/service/Cargo.toml index c4e7f7401b0..c6d82191a9e 100644 --- a/cumulus/test/service/Cargo.toml +++ b/cumulus/test/service/Cargo.toml @@ -13,7 +13,7 @@ name = "test-parachain" path = "src/main.rs" [dependencies] -async-trait = "0.1.73" +async-trait = "0.1.74" clap = { version = "4.4.11", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } criterion = { version = "0.5.1", features = ["async_tokio"] } diff --git a/polkadot/node/core/approval-voting/Cargo.toml b/polkadot/node/core/approval-voting/Cargo.toml index 61a1e84dd6f..4e9c88a9078 100644 --- a/polkadot/node/core/approval-voting/Cargo.toml +++ b/polkadot/node/core/approval-voting/Cargo.toml @@ -40,7 +40,7 @@ rand_chacha = { version = "0.3.1" } rand = "0.8.5" [dev-dependencies] -async-trait = "0.1.57" +async-trait = "0.1.74" parking_lot = "0.12.0" # rand_core should match schnorrkel rand_core = "0.5.1" diff --git a/polkadot/node/core/candidate-validation/Cargo.toml b/polkadot/node/core/candidate-validation/Cargo.toml index 9ded9e58a16..4f0ad67dbf1 100644 --- a/polkadot/node/core/candidate-validation/Cargo.toml +++ b/polkadot/node/core/candidate-validation/Cargo.toml @@ -10,7 +10,7 @@ license.workspace = true workspace = true [dependencies] -async-trait = "0.1.57" +async-trait = "0.1.74" futures = "0.3.21" futures-timer = "3.0.2" gum = { package = "tracing-gum", path = "../../gum" } diff --git a/polkadot/node/core/parachains-inherent/Cargo.toml b/polkadot/node/core/parachains-inherent/Cargo.toml index 8d84b586a30..23840200251 100644 --- a/polkadot/node/core/parachains-inherent/Cargo.toml +++ b/polkadot/node/core/parachains-inherent/Cargo.toml @@ -14,7 +14,7 @@ futures = "0.3.21" futures-timer = "3.0.2" gum = { package = "tracing-gum", path = "../../gum" } thiserror = "1.0.48" -async-trait = "0.1.57" +async-trait = "0.1.74" polkadot-node-subsystem = { path = "../../subsystem" } polkadot-overseer = { path = "../../overseer" } polkadot-primitives = { path = "../../../primitives" } diff --git a/polkadot/node/core/runtime-api/Cargo.toml b/polkadot/node/core/runtime-api/Cargo.toml index 547431b45b2..07be4d128c2 100644 --- a/polkadot/node/core/runtime-api/Cargo.toml +++ b/polkadot/node/core/runtime-api/Cargo.toml @@ -25,7 +25,7 @@ polkadot-node-subsystem-types = { path = "../../subsystem-types" } sp-api = { path = "../../../../substrate/primitives/api" } sp-core = { path = "../../../../substrate/primitives/core" } sp-keyring = { path = "../../../../substrate/primitives/keyring" } -async-trait = "0.1.57" +async-trait = "0.1.74" futures = { version = "0.3.21", features = ["thread-pool"] } polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } polkadot-node-primitives = { path = "../../primitives" } diff --git a/polkadot/node/malus/Cargo.toml b/polkadot/node/malus/Cargo.toml index d0a9b65f720..659c6eb8cd8 100644 --- a/polkadot/node/malus/Cargo.toml +++ b/polkadot/node/malus/Cargo.toml @@ -40,7 +40,7 @@ polkadot-node-primitives = { path = "../primitives" } polkadot-primitives = { path = "../../primitives" } color-eyre = { version = "0.6.1", default-features = false } assert_matches = "1.5" -async-trait = "0.1.57" +async-trait = "0.1.74" sp-keystore = { path = "../../../substrate/primitives/keystore" } sp-core = { path = "../../../substrate/primitives/core" } clap = { version = "4.4.11", features = ["derive"] } diff --git a/polkadot/node/network/availability-recovery/Cargo.toml b/polkadot/node/network/availability-recovery/Cargo.toml index 063d75275ca..ec1cf475302 100644 --- a/polkadot/node/network/availability-recovery/Cargo.toml +++ b/polkadot/node/network/availability-recovery/Cargo.toml @@ -16,7 +16,7 @@ schnellru = "0.2.1" rand = "0.8.5" fatality = "0.0.6" thiserror = "1.0.48" -async-trait = "0.1.73" +async-trait = "0.1.74" gum = { package = "tracing-gum", path = "../../gum" } polkadot-erasure-coding = { path = "../../../erasure-coding" } diff --git a/polkadot/node/network/bridge/Cargo.toml b/polkadot/node/network/bridge/Cargo.toml index d6b9a0a5e76..a2a4735d7a1 100644 --- a/polkadot/node/network/bridge/Cargo.toml +++ b/polkadot/node/network/bridge/Cargo.toml @@ -11,7 +11,7 @@ workspace = true [dependencies] always-assert = "0.1" -async-trait = "0.1.57" +async-trait = "0.1.74" futures = "0.3.21" gum = { package = "tracing-gum", path = "../../gum" } polkadot-primitives = { path = "../../../primitives" } diff --git a/polkadot/node/network/dispute-distribution/Cargo.toml b/polkadot/node/network/dispute-distribution/Cargo.toml index 15a0edd3661..6b494c65336 100644 --- a/polkadot/node/network/dispute-distribution/Cargo.toml +++ b/polkadot/node/network/dispute-distribution/Cargo.toml @@ -31,7 +31,7 @@ indexmap = "1.9.1" [dev-dependencies] async-channel = "1.8.0" -async-trait = "0.1.57" +async-trait = "0.1.74" polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } sp-keyring = { path = "../../../../substrate/primitives/keyring" } sp-tracing = { path = "../../../../substrate/primitives/tracing" } diff --git a/polkadot/node/network/gossip-support/Cargo.toml b/polkadot/node/network/gossip-support/Cargo.toml index e4d6ac601c3..9ad7292b0fd 100644 --- a/polkadot/node/network/gossip-support/Cargo.toml +++ b/polkadot/node/network/gossip-support/Cargo.toml @@ -36,6 +36,6 @@ sp-authority-discovery = { path = "../../../../substrate/primitives/authority-di polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } assert_matches = "1.4.0" -async-trait = "0.1.57" +async-trait = "0.1.74" lazy_static = "1.4.0" quickcheck = "1.0.3" diff --git a/polkadot/node/network/protocol/Cargo.toml b/polkadot/node/network/protocol/Cargo.toml index 1aded1f3c07..e683c662fbe 100644 --- a/polkadot/node/network/protocol/Cargo.toml +++ b/polkadot/node/network/protocol/Cargo.toml @@ -11,7 +11,7 @@ workspace = true [dependencies] async-channel = "1.8.0" -async-trait = "0.1.57" +async-trait = "0.1.74" hex = "0.4.3" polkadot-primitives = { path = "../../../primitives" } polkadot-node-primitives = { path = "../../primitives" } diff --git a/polkadot/node/overseer/Cargo.toml b/polkadot/node/overseer/Cargo.toml index ec1849404b0..40df8d3514a 100644 --- a/polkadot/node/overseer/Cargo.toml +++ b/polkadot/node/overseer/Cargo.toml @@ -23,7 +23,7 @@ polkadot-primitives = { path = "../../primitives" } orchestra = { version = "0.3.3", default-features = false, features = ["futures_channel"] } gum = { package = "tracing-gum", path = "../gum" } sp-core = { path = "../../../substrate/primitives/core" } -async-trait = "0.1.57" +async-trait = "0.1.74" tikv-jemalloc-ctl = { version = "0.5.0", optional = true } [dev-dependencies] diff --git a/polkadot/node/service/Cargo.toml b/polkadot/node/service/Cargo.toml index 85accff9e29..0671b912120 100644 --- a/polkadot/node/service/Cargo.toml +++ b/polkadot/node/service/Cargo.toml @@ -78,7 +78,7 @@ frame-benchmarking-cli = { path = "../../../substrate/utils/frame/benchmarking-c frame-benchmarking = { path = "../../../substrate/frame/benchmarking" } # External Crates -async-trait = "0.1.57" +async-trait = "0.1.74" futures = "0.3.21" hex-literal = "0.4.1" is_executable = "1.0.1" diff --git a/polkadot/node/subsystem-bench/Cargo.toml b/polkadot/node/subsystem-bench/Cargo.toml index 08d1a31adf5..cf9fd8822dd 100644 --- a/polkadot/node/subsystem-bench/Cargo.toml +++ b/polkadot/node/subsystem-bench/Cargo.toml @@ -27,7 +27,7 @@ color-eyre = { version = "0.6.1", default-features = false } polkadot-overseer = { path = "../overseer" } colored = "2.0.4" assert_matches = "1.5" -async-trait = "0.1.57" +async-trait = "0.1.74" sp-keystore = { path = "../../../substrate/primitives/keystore" } sc-keystore = { path = "../../../substrate/client/keystore" } sp-core = { path = "../../../substrate/primitives/core" } diff --git a/polkadot/node/subsystem-test-helpers/Cargo.toml b/polkadot/node/subsystem-test-helpers/Cargo.toml index 7b616bdb438..d0be9af4ed6 100644 --- a/polkadot/node/subsystem-test-helpers/Cargo.toml +++ b/polkadot/node/subsystem-test-helpers/Cargo.toml @@ -11,7 +11,7 @@ license.workspace = true workspace = true [dependencies] -async-trait = "0.1.57" +async-trait = "0.1.74" futures = "0.3.21" parking_lot = "0.12.0" polkadot-node-subsystem = { path = "../subsystem" } diff --git a/polkadot/node/subsystem-types/Cargo.toml b/polkadot/node/subsystem-types/Cargo.toml index 5518e9d080c..6713e903123 100644 --- a/polkadot/node/subsystem-types/Cargo.toml +++ b/polkadot/node/subsystem-types/Cargo.toml @@ -29,5 +29,5 @@ sc-transaction-pool-api = { path = "../../../substrate/client/transaction-pool/a smallvec = "1.8.0" substrate-prometheus-endpoint = { path = "../../../substrate/utils/prometheus" } thiserror = "1.0.48" -async-trait = "0.1.57" +async-trait = "0.1.74" bitvec = { version = "1.0.0", default-features = false, features = ["alloc"] } diff --git a/polkadot/node/subsystem-util/Cargo.toml b/polkadot/node/subsystem-util/Cargo.toml index d6df3fbe3e2..6668430d3b7 100644 --- a/polkadot/node/subsystem-util/Cargo.toml +++ b/polkadot/node/subsystem-util/Cargo.toml @@ -10,7 +10,7 @@ license.workspace = true workspace = true [dependencies] -async-trait = "0.1.57" +async-trait = "0.1.74" futures = "0.3.21" futures-channel = "0.3.23" itertools = "0.10" diff --git a/substrate/client/authority-discovery/Cargo.toml b/substrate/client/authority-discovery/Cargo.toml index 33db0c156eb..e8b9b3f7b7b 100644 --- a/substrate/client/authority-discovery/Cargo.toml +++ b/substrate/client/authority-discovery/Cargo.toml @@ -42,7 +42,7 @@ sp-blockchain = { path = "../../primitives/blockchain" } sp-core = { path = "../../primitives/core" } sp-keystore = { path = "../../primitives/keystore" } sp-runtime = { path = "../../primitives/runtime" } -async-trait = "0.1.56" +async-trait = "0.1.74" multihash-codetable = { version = "0.1.1", features = [ "digest", "serde", diff --git a/substrate/client/consensus/aura/Cargo.toml b/substrate/client/consensus/aura/Cargo.toml index a323a1dda47..89a63a94416 100644 --- a/substrate/client/consensus/aura/Cargo.toml +++ b/substrate/client/consensus/aura/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -async-trait = "0.1.57" +async-trait = "0.1.74" codec = { package = "parity-scale-codec", version = "3.6.1" } futures = "0.3.21" log = "0.4.17" diff --git a/substrate/client/consensus/babe/Cargo.toml b/substrate/client/consensus/babe/Cargo.toml index 996063cef1b..40c69d5780a 100644 --- a/substrate/client/consensus/babe/Cargo.toml +++ b/substrate/client/consensus/babe/Cargo.toml @@ -17,7 +17,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -async-trait = "0.1.57" +async-trait = "0.1.74" codec = { package = "parity-scale-codec", version = "3.6.1", features = ["derive"] } futures = "0.3.21" log = "0.4.17" diff --git a/substrate/client/consensus/beefy/Cargo.toml b/substrate/client/consensus/beefy/Cargo.toml index 8ffa6b24be8..1736929e9b4 100644 --- a/substrate/client/consensus/beefy/Cargo.toml +++ b/substrate/client/consensus/beefy/Cargo.toml @@ -14,7 +14,7 @@ workspace = true [dependencies] array-bytes = "6.1" async-channel = "1.8.0" -async-trait = "0.1.57" +async-trait = "0.1.74" codec = { package = "parity-scale-codec", version = "3.6.1", features = ["derive"] } fnv = "1.0.6" futures = "0.3" diff --git a/substrate/client/consensus/common/Cargo.toml b/substrate/client/consensus/common/Cargo.toml index 9c0305bb8c9..ba0147b8952 100644 --- a/substrate/client/consensus/common/Cargo.toml +++ b/substrate/client/consensus/common/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -async-trait = "0.1.57" +async-trait = "0.1.74" futures = { version = "0.3.21", features = ["thread-pool"] } futures-timer = "3.0.1" libp2p-identity = { version = "0.1.3", features = ["ed25519", "peerid"] } diff --git a/substrate/client/consensus/grandpa/Cargo.toml b/substrate/client/consensus/grandpa/Cargo.toml index 14ce52f2729..2adedb5b3b5 100644 --- a/substrate/client/consensus/grandpa/Cargo.toml +++ b/substrate/client/consensus/grandpa/Cargo.toml @@ -19,7 +19,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] ahash = "0.8.2" array-bytes = "6.1" -async-trait = "0.1.57" +async-trait = "0.1.74" dyn-clone = "1.0" finality-grandpa = { version = "0.16.2", features = ["derive-codec"] } futures = "0.3.21" diff --git a/substrate/client/consensus/manual-seal/Cargo.toml b/substrate/client/consensus/manual-seal/Cargo.toml index c111f0494de..77cd88dfc19 100644 --- a/substrate/client/consensus/manual-seal/Cargo.toml +++ b/substrate/client/consensus/manual-seal/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] jsonrpsee = { version = "0.16.2", features = ["client-core", "macros", "server"] } assert_matches = "1.3.0" -async-trait = "0.1.57" +async-trait = "0.1.74" codec = { package = "parity-scale-codec", version = "3.6.1" } futures = "0.3.21" futures-timer = "3.0.1" diff --git a/substrate/client/consensus/pow/Cargo.toml b/substrate/client/consensus/pow/Cargo.toml index d5eebb23e13..7077fb84bab 100644 --- a/substrate/client/consensus/pow/Cargo.toml +++ b/substrate/client/consensus/pow/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -async-trait = "0.1.57" +async-trait = "0.1.74" codec = { package = "parity-scale-codec", version = "3.6.1", features = ["derive"] } futures = "0.3.21" futures-timer = "3.0.1" diff --git a/substrate/client/consensus/slots/Cargo.toml b/substrate/client/consensus/slots/Cargo.toml index 29206004c23..801558a276a 100644 --- a/substrate/client/consensus/slots/Cargo.toml +++ b/substrate/client/consensus/slots/Cargo.toml @@ -17,7 +17,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -async-trait = "0.1.57" +async-trait = "0.1.74" codec = { package = "parity-scale-codec", version = "3.6.1" } futures = "0.3.21" futures-timer = "3.0.1" diff --git a/substrate/client/network-gossip/Cargo.toml b/substrate/client/network-gossip/Cargo.toml index d4fb416a4a0..c34ce0cd538 100644 --- a/substrate/client/network-gossip/Cargo.toml +++ b/substrate/client/network-gossip/Cargo.toml @@ -32,7 +32,7 @@ sp-runtime = { path = "../../primitives/runtime" } [dev-dependencies] tokio = "1.22.0" -async-trait = "0.1.73" +async-trait = "0.1.74" codec = { package = "parity-scale-codec", version = "3.0.0", features = ["derive"] } quickcheck = { version = "1.0.3", default-features = false } substrate-test-runtime-client = { path = "../../test-utils/runtime/client" } diff --git a/substrate/client/network/common/Cargo.toml b/substrate/client/network/common/Cargo.toml index 5b0eb5510a5..8e5ad61d5e4 100644 --- a/substrate/client/network/common/Cargo.toml +++ b/substrate/client/network/common/Cargo.toml @@ -19,7 +19,7 @@ targets = ["x86_64-unknown-linux-gnu"] prost-build = "0.11" [dependencies] -async-trait = "0.1.57" +async-trait = "0.1.74" bitflags = "1.3.2" codec = { package = "parity-scale-codec", version = "3.6.1", features = [ "derive", diff --git a/substrate/client/network/sync/Cargo.toml b/substrate/client/network/sync/Cargo.toml index f20592d5f25..1cb06e2bd88 100644 --- a/substrate/client/network/sync/Cargo.toml +++ b/substrate/client/network/sync/Cargo.toml @@ -21,7 +21,7 @@ prost-build = "0.11" [dependencies] array-bytes = "6.1" async-channel = "1.8.0" -async-trait = "0.1.58" +async-trait = "0.1.74" codec = { package = "parity-scale-codec", version = "3.6.1", features = ["derive"] } futures = "0.3.21" futures-timer = "3.0.2" diff --git a/substrate/client/network/test/Cargo.toml b/substrate/client/network/test/Cargo.toml index cd66c701660..b5c5c9e1e3f 100644 --- a/substrate/client/network/test/Cargo.toml +++ b/substrate/client/network/test/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] tokio = "1.22.0" -async-trait = "0.1.57" +async-trait = "0.1.74" futures = "0.3.21" futures-timer = "3.0.1" libp2p = "0.51.3" diff --git a/substrate/client/service/Cargo.toml b/substrate/client/service/Cargo.toml index 4c03b59a663..0dd6db75332 100644 --- a/substrate/client/service/Cargo.toml +++ b/substrate/client/service/Cargo.toml @@ -79,7 +79,7 @@ sc-tracing = { path = "../tracing" } sc-sysinfo = { path = "../sysinfo" } tracing = "0.1.29" tracing-futures = { version = "0.2.4" } -async-trait = "0.1.57" +async-trait = "0.1.74" tokio = { version = "1.22.0", features = ["parking_lot", "rt-multi-thread", "time"] } tempfile = "3.1.0" directories = "5.0.1" diff --git a/substrate/client/transaction-pool/Cargo.toml b/substrate/client/transaction-pool/Cargo.toml index 493f6680c4c..2eeeb69d5cf 100644 --- a/substrate/client/transaction-pool/Cargo.toml +++ b/substrate/client/transaction-pool/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -async-trait = "0.1.57" +async-trait = "0.1.74" codec = { package = "parity-scale-codec", version = "3.6.1" } futures = "0.3.21" futures-timer = "3.0.2" diff --git a/substrate/client/transaction-pool/api/Cargo.toml b/substrate/client/transaction-pool/api/Cargo.toml index 29e402c34f8..c7325dc2bb6 100644 --- a/substrate/client/transaction-pool/api/Cargo.toml +++ b/substrate/client/transaction-pool/api/Cargo.toml @@ -12,7 +12,7 @@ description = "Transaction pool client facing API." workspace = true [dependencies] -async-trait = "0.1.57" +async-trait = "0.1.74" codec = { package = "parity-scale-codec", version = "3.6.1" } futures = "0.3.21" log = "0.4.17" diff --git a/substrate/primitives/consensus/aura/Cargo.toml b/substrate/primitives/consensus/aura/Cargo.toml index 15159f62611..6c797e15ae8 100644 --- a/substrate/primitives/consensus/aura/Cargo.toml +++ b/substrate/primitives/consensus/aura/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -async-trait = { version = "0.1.57", optional = true } +async-trait = { version = "0.1.74", optional = true } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } sp-api = { path = "../../api", default-features = false } diff --git a/substrate/primitives/consensus/babe/Cargo.toml b/substrate/primitives/consensus/babe/Cargo.toml index 72cee3604d5..8690c73e34c 100644 --- a/substrate/primitives/consensus/babe/Cargo.toml +++ b/substrate/primitives/consensus/babe/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -async-trait = { version = "0.1.57", optional = true } +async-trait = { version = "0.1.74", optional = true } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } serde = { version = "1.0.193", default-features = false, features = ["alloc", "derive"], optional = true } diff --git a/substrate/primitives/consensus/common/Cargo.toml b/substrate/primitives/consensus/common/Cargo.toml index 066578406b6..afb7a9895fc 100644 --- a/substrate/primitives/consensus/common/Cargo.toml +++ b/substrate/primitives/consensus/common/Cargo.toml @@ -17,7 +17,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -async-trait = "0.1.57" +async-trait = "0.1.74" futures = { version = "0.3.21", features = ["thread-pool"] } log = "0.4.17" thiserror = "1.0.48" diff --git a/substrate/primitives/inherents/Cargo.toml b/substrate/primitives/inherents/Cargo.toml index e011e9ce9b8..5c13694ceac 100644 --- a/substrate/primitives/inherents/Cargo.toml +++ b/substrate/primitives/inherents/Cargo.toml @@ -17,7 +17,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -async-trait = { version = "0.1.57", optional = true } +async-trait = { version = "0.1.74", optional = true } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } impl-trait-for-tuples = "0.2.2" diff --git a/substrate/primitives/timestamp/Cargo.toml b/substrate/primitives/timestamp/Cargo.toml index ea1e4ebbee3..b61f36f2056 100644 --- a/substrate/primitives/timestamp/Cargo.toml +++ b/substrate/primitives/timestamp/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -async-trait = { version = "0.1.57", optional = true } +async-trait = { version = "0.1.74", optional = true } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } thiserror = { version = "1.0.48", optional = true } sp-inherents = { path = "../inherents", default-features = false } diff --git a/substrate/primitives/transaction-storage-proof/Cargo.toml b/substrate/primitives/transaction-storage-proof/Cargo.toml index f8c3ded2ef7..e1c50a09c59 100644 --- a/substrate/primitives/transaction-storage-proof/Cargo.toml +++ b/substrate/primitives/transaction-storage-proof/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -async-trait = { version = "0.1.57", optional = true } +async-trait = { version = "0.1.74", optional = true } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } sp-core = { path = "../core", optional = true } diff --git a/substrate/test-utils/client/Cargo.toml b/substrate/test-utils/client/Cargo.toml index a137e7b17fc..2e343f4155b 100644 --- a/substrate/test-utils/client/Cargo.toml +++ b/substrate/test-utils/client/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] array-bytes = "6.1" -async-trait = "0.1.57" +async-trait = "0.1.74" codec = { package = "parity-scale-codec", version = "3.6.1" } futures = "0.3.21" serde = "1.0.193" diff --git a/substrate/utils/frame/rpc/client/Cargo.toml b/substrate/utils/frame/rpc/client/Cargo.toml index 986f9f3943c..1e8a298726e 100644 --- a/substrate/utils/frame/rpc/client/Cargo.toml +++ b/substrate/utils/frame/rpc/client/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] jsonrpsee = { version = "0.16.2", features = ["ws-client"] } sc-rpc-api = { path = "../../../../client/rpc-api" } -async-trait = "0.1.57" +async-trait = "0.1.74" serde = "1" sp-runtime = { path = "../../../../primitives/runtime" } log = "0.4" diff --git a/substrate/utils/frame/try-runtime/cli/Cargo.toml b/substrate/utils/frame/try-runtime/cli/Cargo.toml index 9f560ab3271..e7ae9a6d3db 100644 --- a/substrate/utils/frame/try-runtime/cli/Cargo.toml +++ b/substrate/utils/frame/try-runtime/cli/Cargo.toml @@ -37,7 +37,7 @@ sp-weights = { path = "../../../../primitives/weights" } frame-try-runtime = { path = "../../../../frame/try-runtime", optional = true } substrate-rpc-client = { path = "../../rpc/client" } -async-trait = "0.1.57" +async-trait = "0.1.74" clap = { version = "4.4.11", features = ["derive"] } hex = { version = "0.4.3", default-features = false } log = "0.4.17" -- GitLab From d941784b397517a9e03e0e260450bfb9f7724fbf Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Mon, 18 Dec 2023 13:18:30 +0100 Subject: [PATCH 049/191] Relaxed clippy fixes/nits (#2661) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains just a few clippy fixes and nits, which are, however, relaxed by workspace clippy settings here: https://github.com/paritytech/polkadot-sdk/blob/master/Cargo.toml#L483-L506 --------- Co-authored-by: Dmitry Sinyavin Co-authored-by: ordian Co-authored-by: command-bot <> Co-authored-by: Bastian Köcher --- cumulus/parachain-template/node/src/rpc.rs | 2 +- .../runtime/src/weights/mod.rs | 1 - .../asset-hub-rococo/src/weights/mod.rs | 1 - .../asset-hub-westend/src/weights/mod.rs | 1 - .../bridge-hub-rococo/src/weights/mod.rs | 1 - .../bridge-hub-westend/src/weights/mod.rs | 1 - .../collectives-westend/src/weights/mod.rs | 1 - .../contracts-rococo/src/contracts.rs | 2 +- .../contracts-rococo/src/weights/mod.rs | 1 - .../testing/penpal/src/weights/mod.rs | 1 - cumulus/polkadot-parachain/src/rpc.rs | 2 +- cumulus/polkadot-parachain/src/service.rs | 2 +- .../primitives/parachain-inherent/src/lib.rs | 2 -- polkadot/node/malus/src/interceptor.rs | 2 +- polkadot/node/network/bridge/src/rx/mod.rs | 5 ---- polkadot/node/network/bridge/src/tx/mod.rs | 4 --- .../node/service/src/parachains_db/mod.rs | 5 +--- polkadot/node/tracking-allocator/src/lib.rs | 2 +- polkadot/runtime/common/src/claims.rs | 2 +- .../parachains/src/assigner_on_demand/mod.rs | 7 ++++- polkadot/xcm/pallet-xcm/src/mock.rs | 4 +-- .../xcm/procedural/src/builder_pattern.rs | 30 +++++++++---------- .../xcm/xcm-builder/src/currency_adapter.rs | 4 +-- polkadot/xcm/xcm-builder/src/tests/mock.rs | 8 ++--- .../chain-spec/src/genesis_config_builder.rs | 2 +- substrate/frame/alliance/src/mock.rs | 8 ++--- substrate/frame/assets/src/benchmarking.rs | 2 +- substrate/frame/beefy/src/mock.rs | 5 +--- substrate/frame/broker/src/lib.rs | 2 -- .../frame/contracts/src/migration/v10.rs | 2 +- substrate/frame/contracts/src/wasm/mod.rs | 8 +++-- .../election-provider-multi-phase/src/mock.rs | 10 +++---- .../elections-phragmen/src/benchmarking.rs | 2 +- substrate/frame/fast-unstake/src/lib.rs | 2 +- substrate/frame/indices/src/lib.rs | 2 +- substrate/frame/lottery/src/lib.rs | 3 +- substrate/frame/paged-list/src/paged_list.rs | 12 ++++---- substrate/frame/staking/src/benchmarking.rs | 2 +- substrate/frame/support/src/dispatch.rs | 2 +- substrate/primitives/database/src/lib.rs | 4 ++- .../runtime-interface/proc-macro/src/utils.rs | 2 +- substrate/primitives/storage/src/lib.rs | 9 ++---- substrate/utils/build-script-utils/src/git.rs | 10 +++++-- .../utils/build-script-utils/src/version.rs | 2 +- 44 files changed, 76 insertions(+), 106 deletions(-) diff --git a/cumulus/parachain-template/node/src/rpc.rs b/cumulus/parachain-template/node/src/rpc.rs index ed4003ed6d2..bb52b974f0c 100644 --- a/cumulus/parachain-template/node/src/rpc.rs +++ b/cumulus/parachain-template/node/src/rpc.rs @@ -9,7 +9,7 @@ use std::sync::Arc; use parachain_template_runtime::{opaque::Block, AccountId, Balance, Nonce}; -pub use sc_rpc::{DenyUnsafe, SubscriptionTaskExecutor}; +pub use sc_rpc::DenyUnsafe; use sc_transaction_pool_api::TransactionPool; use sp_api::ProvideRuntimeApi; use sp_block_builder::BlockBuilder; diff --git a/cumulus/parachain-template/runtime/src/weights/mod.rs b/cumulus/parachain-template/runtime/src/weights/mod.rs index 30fa2c40606..b473d49e20e 100644 --- a/cumulus/parachain-template/runtime/src/weights/mod.rs +++ b/cumulus/parachain-template/runtime/src/weights/mod.rs @@ -24,5 +24,4 @@ pub mod rocksdb_weights; pub use block_weights::constants::BlockExecutionWeight; pub use extrinsic_weights::constants::ExtrinsicBaseWeight; -pub use paritydb_weights::constants::ParityDbWeight; pub use rocksdb_weights::constants::RocksDbWeight; diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/mod.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/mod.rs index aa994a7608a..fa9e86102c6 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/mod.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/mod.rs @@ -42,5 +42,4 @@ pub mod xcm; pub use block_weights::constants::BlockExecutionWeight; pub use extrinsic_weights::constants::ExtrinsicBaseWeight; -pub use paritydb_weights::constants::ParityDbWeight; pub use rocksdb_weights::constants::RocksDbWeight; diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/mod.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/mod.rs index 2462138b04a..2f1fcfb05f3 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/mod.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/mod.rs @@ -41,5 +41,4 @@ pub mod xcm; pub use block_weights::constants::BlockExecutionWeight; pub use extrinsic_weights::constants::ExtrinsicBaseWeight; -pub use paritydb_weights::constants::ParityDbWeight; pub use rocksdb_weights::constants::RocksDbWeight; diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/mod.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/mod.rs index 69461be38ed..41e7ac54163 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/mod.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/mod.rs @@ -44,7 +44,6 @@ pub mod xcm; pub use block_weights::constants::BlockExecutionWeight; pub use extrinsic_weights::constants::ExtrinsicBaseWeight; -pub use paritydb_weights::constants::ParityDbWeight; pub use rocksdb_weights::constants::RocksDbWeight; use crate::Runtime; diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/mod.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/mod.rs index ee49c72ea5f..a65ee31d3e5 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/mod.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/mod.rs @@ -43,7 +43,6 @@ pub mod xcm; pub use block_weights::constants::BlockExecutionWeight; pub use extrinsic_weights::constants::ExtrinsicBaseWeight; -pub use paritydb_weights::constants::ParityDbWeight; pub use rocksdb_weights::constants::RocksDbWeight; use crate::Runtime; diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/mod.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/mod.rs index 77f76342a2e..a9a298e547e 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/mod.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/mod.rs @@ -47,5 +47,4 @@ pub mod rocksdb_weights; pub use block_weights::constants::BlockExecutionWeight; pub use extrinsic_weights::constants::ExtrinsicBaseWeight; -pub use paritydb_weights::constants::ParityDbWeight; pub use rocksdb_weights::constants::RocksDbWeight; diff --git a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/contracts.rs b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/contracts.rs index 6c100deaa9e..94f2d34b265 100644 --- a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/contracts.rs +++ b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/contracts.rs @@ -26,7 +26,7 @@ use pallet_contracts::{ }; use sp_runtime::Perbill; -pub use parachains_common::{rococo::currency::deposit, AVERAGE_ON_INITIALIZE_RATIO}; +pub use parachains_common::rococo::currency::deposit; // Prints debug output of the `contracts` pallet to stdout if the node is // started with `-lruntime::contracts=debug`. diff --git a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/weights/mod.rs b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/weights/mod.rs index 30fa2c40606..b473d49e20e 100644 --- a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/weights/mod.rs +++ b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/weights/mod.rs @@ -24,5 +24,4 @@ pub mod rocksdb_weights; pub use block_weights::constants::BlockExecutionWeight; pub use extrinsic_weights::constants::ExtrinsicBaseWeight; -pub use paritydb_weights::constants::ParityDbWeight; pub use rocksdb_weights::constants::RocksDbWeight; diff --git a/cumulus/parachains/runtimes/testing/penpal/src/weights/mod.rs b/cumulus/parachains/runtimes/testing/penpal/src/weights/mod.rs index 30fa2c40606..b473d49e20e 100644 --- a/cumulus/parachains/runtimes/testing/penpal/src/weights/mod.rs +++ b/cumulus/parachains/runtimes/testing/penpal/src/weights/mod.rs @@ -24,5 +24,4 @@ pub mod rocksdb_weights; pub use block_weights::constants::BlockExecutionWeight; pub use extrinsic_weights::constants::ExtrinsicBaseWeight; -pub use paritydb_weights::constants::ParityDbWeight; pub use rocksdb_weights::constants::RocksDbWeight; diff --git a/cumulus/polkadot-parachain/src/rpc.rs b/cumulus/polkadot-parachain/src/rpc.rs index d106c52a364..caee14e5552 100644 --- a/cumulus/polkadot-parachain/src/rpc.rs +++ b/cumulus/polkadot-parachain/src/rpc.rs @@ -22,7 +22,7 @@ use std::sync::Arc; use parachains_common::{AccountId, Balance, Block, Nonce}; use sc_client_api::AuxStore; -pub use sc_rpc::{DenyUnsafe, SubscriptionTaskExecutor}; +pub use sc_rpc::DenyUnsafe; use sc_transaction_pool_api::TransactionPool; use sp_api::ProvideRuntimeApi; use sp_block_builder::BlockBuilder; diff --git a/cumulus/polkadot-parachain/src/service.rs b/cumulus/polkadot-parachain/src/service.rs index 6280d86e9f9..1eb19a5fb27 100644 --- a/cumulus/polkadot-parachain/src/service.rs +++ b/cumulus/polkadot-parachain/src/service.rs @@ -41,7 +41,7 @@ use sp_core::Pair; use jsonrpsee::RpcModule; use crate::{fake_runtime_api::aura::RuntimeApi, rpc}; -pub use parachains_common::{AccountId, Balance, Block, BlockNumber, Hash, Header, Nonce}; +pub use parachains_common::{AccountId, Balance, Block, Hash, Header, Nonce}; use cumulus_client_consensus_relay_chain::Verifier as RelayChainVerifier; use futures::{lock::Mutex, prelude::*}; diff --git a/cumulus/primitives/parachain-inherent/src/lib.rs b/cumulus/primitives/parachain-inherent/src/lib.rs index 08407023bb4..f98c748e82f 100644 --- a/cumulus/primitives/parachain-inherent/src/lib.rs +++ b/cumulus/primitives/parachain-inherent/src/lib.rs @@ -39,8 +39,6 @@ use sp_std::{collections::btree_map::BTreeMap, vec::Vec}; #[cfg(feature = "std")] mod client_side; #[cfg(feature = "std")] -pub use client_side::*; -#[cfg(feature = "std")] mod mock; #[cfg(feature = "std")] pub use mock::{MockValidationDataInherentDataProvider, MockXcmConfig}; diff --git a/polkadot/node/malus/src/interceptor.rs b/polkadot/node/malus/src/interceptor.rs index 04ee0905dee..e994319beb9 100644 --- a/polkadot/node/malus/src/interceptor.rs +++ b/polkadot/node/malus/src/interceptor.rs @@ -21,7 +21,7 @@ //! messages on the overseer level. use polkadot_node_subsystem::*; -pub use polkadot_node_subsystem::{messages, messages::*, overseer, FromOrchestra}; +pub use polkadot_node_subsystem::{messages::*, overseer, FromOrchestra}; use std::{future::Future, pin::Pin}; /// Filter incoming and outgoing messages. diff --git a/polkadot/node/network/bridge/src/rx/mod.rs b/polkadot/node/network/bridge/src/rx/mod.rs index 49d81aea76a..11ac73259e3 100644 --- a/polkadot/node/network/bridge/src/rx/mod.rs +++ b/polkadot/node/network/bridge/src/rx/mod.rs @@ -53,11 +53,6 @@ use polkadot_node_subsystem::{ use polkadot_primitives::{AuthorityDiscoveryId, BlockNumber, Hash, ValidatorIndex}; -/// Peer set info for network initialization. -/// -/// To be passed to [`FullNetworkConfiguration::add_notification_protocol`](). -pub use polkadot_node_network_protocol::peer_set::{peer_sets_info, IsAuthority}; - use std::{ collections::{hash_map, HashMap}, iter::ExactSizeIterator, diff --git a/polkadot/node/network/bridge/src/tx/mod.rs b/polkadot/node/network/bridge/src/tx/mod.rs index 22802608e1d..d5be6f01c33 100644 --- a/polkadot/node/network/bridge/src/tx/mod.rs +++ b/polkadot/node/network/bridge/src/tx/mod.rs @@ -27,10 +27,6 @@ use polkadot_node_subsystem::{ overseer, FromOrchestra, OverseerSignal, SpawnedSubsystem, }; -/// Peer set info for network initialization. -/// -/// To be passed to [`FullNetworkConfiguration::add_notification_protocol`](). -pub use polkadot_node_network_protocol::peer_set::{peer_sets_info, IsAuthority}; use polkadot_node_network_protocol::request_response::Requests; use sc_network::{MessageSink, ReputationChange}; diff --git a/polkadot/node/service/src/parachains_db/mod.rs b/polkadot/node/service/src/parachains_db/mod.rs index 92f3f167f22..59af30dceeb 100644 --- a/polkadot/node/service/src/parachains_db/mod.rs +++ b/polkadot/node/service/src/parachains_db/mod.rs @@ -43,10 +43,7 @@ pub(crate) mod columns { // Version 4 only changed structures in approval voting, so we can re-export the v4 definitions. pub mod v3 { - pub use super::v4::{ - COL_APPROVAL_DATA, COL_AVAILABILITY_DATA, COL_AVAILABILITY_META, - COL_CHAIN_SELECTION_DATA, COL_DISPUTE_COORDINATOR_DATA, NUM_COLUMNS, ORDERED_COL, - }; + pub use super::v4::{NUM_COLUMNS, ORDERED_COL}; } pub mod v4 { diff --git a/polkadot/node/tracking-allocator/src/lib.rs b/polkadot/node/tracking-allocator/src/lib.rs index ab8597b5c38..33f110ce711 100644 --- a/polkadot/node/tracking-allocator/src/lib.rs +++ b/polkadot/node/tracking-allocator/src/lib.rs @@ -226,7 +226,7 @@ unsafe impl GlobalAlloc for TrackingAllocator { } #[inline] - unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) -> () { + unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) { let guard = ALLOCATOR_DATA.lock(); TrackingAllocatorData::track_and_check_limits(guard, -(layout.size() as isize)); self.0.dealloc(ptr, layout) diff --git a/polkadot/runtime/common/src/claims.rs b/polkadot/runtime/common/src/claims.rs index e05c0fe5c4c..d15e04a660f 100644 --- a/polkadot/runtime/common/src/claims.rs +++ b/polkadot/runtime/common/src/claims.rs @@ -561,7 +561,7 @@ impl Pallet { } // We first need to deposit the balance to ensure that the account exists. - CurrencyOf::::deposit_creating(&dest, balance_due); + let _ = CurrencyOf::::deposit_creating(&dest, balance_due); // Check if this claim should have a vesting schedule. if let Some(vs) = vesting { diff --git a/polkadot/runtime/parachains/src/assigner_on_demand/mod.rs b/polkadot/runtime/parachains/src/assigner_on_demand/mod.rs index 75c29bd6fbe..f4214027a6b 100644 --- a/polkadot/runtime/parachains/src/assigner_on_demand/mod.rs +++ b/polkadot/runtime/parachains/src/assigner_on_demand/mod.rs @@ -337,7 +337,12 @@ where ensure!(spot_price.le(&max_amount), Error::::SpotPriceHigherThanMaxAmount); // Charge the sending account the spot price - T::Currency::withdraw(&sender, spot_price, WithdrawReasons::FEE, existence_requirement)?; + let _ = T::Currency::withdraw( + &sender, + spot_price, + WithdrawReasons::FEE, + existence_requirement, + )?; let assignment = Assignment::new(para_id); diff --git a/polkadot/xcm/pallet-xcm/src/mock.rs b/polkadot/xcm/pallet-xcm/src/mock.rs index bc9a3c3c35a..0ac4205ed94 100644 --- a/polkadot/xcm/pallet-xcm/src/mock.rs +++ b/polkadot/xcm/pallet-xcm/src/mock.rs @@ -28,9 +28,7 @@ use polkadot_parachain_primitives::primitives::Id as ParaId; use polkadot_runtime_parachains::origin; use sp_core::H256; use sp_runtime::{traits::IdentityLookup, AccountId32, BuildStorage}; -pub use sp_std::{ - cell::RefCell, collections::btree_map::BTreeMap, fmt::Debug, marker::PhantomData, -}; +pub use sp_std::cell::RefCell; use xcm::prelude::*; #[allow(deprecated)] use xcm_builder::CurrencyAdapter as XcmCurrencyAdapter; diff --git a/polkadot/xcm/procedural/src/builder_pattern.rs b/polkadot/xcm/procedural/src/builder_pattern.rs index 1cb795ea9b2..e58c5110349 100644 --- a/polkadot/xcm/procedural/src/builder_pattern.rs +++ b/polkadot/xcm/procedural/src/builder_pattern.rs @@ -87,8 +87,8 @@ fn generate_builder_raw_impl(name: &Ident, data_enum: &DataEnum) -> TokenStream2 let methods = data_enum.variants.iter().map(|variant| { let variant_name = &variant.ident; let method_name_string = &variant_name.to_string().to_snake_case(); - let method_name = syn::Ident::new(&method_name_string, variant_name.span()); - let docs = get_doc_comments(&variant); + let method_name = syn::Ident::new(method_name_string, variant_name.span()); + let docs = get_doc_comments(variant); let method = match &variant.fields { Fields::Unit => { quote! { @@ -148,9 +148,7 @@ fn generate_builder_impl(name: &Ident, data_enum: &DataEnum) -> Result { - return list.path.is_ident("builder"); - }, + Meta::List(ref list) => list.path.is_ident("builder"), _ => false, }); let builder_attr = match maybe_builder_attr { @@ -159,7 +157,7 @@ fn generate_builder_impl(name: &Ident, data_enum: &DataEnum) -> Result Result { let arg_names: Vec<_> = fields @@ -217,7 +215,7 @@ fn generate_builder_impl(name: &Ident, data_enum: &DataEnum) -> Result return Err(Error::new_spanned( - &variant, + variant, "Instructions that load the holding register should take operands", )), }; @@ -235,14 +233,14 @@ fn generate_builder_impl(name: &Ident, data_enum: &DataEnum) -> Result { let arg_names: Vec<_> = @@ -263,7 +261,7 @@ fn generate_builder_impl(name: &Ident, data_enum: &DataEnum) -> Result return Err(Error::new_spanned( - &variant, + variant, "BuyExecution should have named fields", )), }; @@ -289,19 +287,19 @@ fn generate_builder_unpaid_impl(name: &Ident, data_enum: &DataEnum) -> Result fields, _ => return Err(Error::new_spanned( - &unpaid_execution_variant, + unpaid_execution_variant, "UnpaidExecution should have named fields", )), }; diff --git a/polkadot/xcm/xcm-builder/src/currency_adapter.rs b/polkadot/xcm/xcm-builder/src/currency_adapter.rs index c3842a498ad..68ca0111174 100644 --- a/polkadot/xcm/xcm-builder/src/currency_adapter.rs +++ b/polkadot/xcm/xcm-builder/src/currency_adapter.rs @@ -116,7 +116,7 @@ impl< .map_err(|_| XcmError::NotWithdrawable) } fn accrue_checked(checked_account: AccountId, amount: Currency::Balance) { - Currency::deposit_creating(&checked_account, amount); + let _ = Currency::deposit_creating(&checked_account, amount); Currency::deactivate(amount); } fn reduce_checked(checked_account: AccountId, amount: Currency::Balance) { @@ -218,7 +218,7 @@ impl< let amount = Matcher::matches_fungible(what).ok_or(Error::AssetNotHandled)?; let who = AccountIdConverter::convert_location(who).ok_or(Error::AccountIdConversionFailed)?; - Currency::withdraw(&who, amount, WithdrawReasons::TRANSFER, AllowDeath) + let _ = Currency::withdraw(&who, amount, WithdrawReasons::TRANSFER, AllowDeath) .map_err(|e| XcmError::FailedToTransactAsset(e.into()))?; Ok(what.clone().into()) } diff --git a/polkadot/xcm/xcm-builder/src/tests/mock.rs b/polkadot/xcm/xcm-builder/src/tests/mock.rs index 189274eb5f5..843c39bbfeb 100644 --- a/polkadot/xcm/xcm-builder/src/tests/mock.rs +++ b/polkadot/xcm/xcm-builder/src/tests/mock.rs @@ -27,20 +27,16 @@ pub use crate::{ }; use frame_support::traits::{ContainsPair, Everything}; pub use frame_support::{ - dispatch::{ - DispatchInfo, DispatchResultWithPostInfo, GetDispatchInfo, Parameter, PostDispatchInfo, - }, + dispatch::{DispatchInfo, DispatchResultWithPostInfo, GetDispatchInfo, PostDispatchInfo}, ensure, match_types, parameter_types, sp_runtime::{traits::Dispatchable, DispatchError, DispatchErrorWithPostInfo}, - traits::{ConstU32, Contains, Get, IsInVec}, + traits::{Contains, Get, IsInVec}, }; pub use parity_scale_codec::{Decode, Encode}; -pub use sp_io::hashing::blake2_256; pub use sp_std::{ cell::{Cell, RefCell}, collections::{btree_map::BTreeMap, btree_set::BTreeSet}, fmt::Debug, - marker::PhantomData, }; pub use xcm::latest::{prelude::*, Weight}; use xcm_executor::traits::{Properties, QueryHandler, QueryResponseStatus}; diff --git a/substrate/client/chain-spec/src/genesis_config_builder.rs b/substrate/client/chain-spec/src/genesis_config_builder.rs index 68f3d886049..d6ef99fafdd 100644 --- a/substrate/client/chain-spec/src/genesis_config_builder.rs +++ b/substrate/client/chain-spec/src/genesis_config_builder.rs @@ -141,7 +141,7 @@ where mod tests { use super::*; use serde_json::{from_str, json}; - pub use sp_consensus_babe::{AllowedSlots, BabeEpochConfiguration, Slot}; + pub use sp_consensus_babe::{AllowedSlots, BabeEpochConfiguration}; #[test] fn get_default_config_works() { diff --git a/substrate/frame/alliance/src/mock.rs b/substrate/frame/alliance/src/mock.rs index ace5214f145..01e0e01fe7e 100644 --- a/substrate/frame/alliance/src/mock.rs +++ b/substrate/frame/alliance/src/mock.rs @@ -19,16 +19,12 @@ pub use sp_core::H256; use sp_runtime::traits::Hash; -pub use sp_runtime::{ - traits::{BlakeTwo256, IdentityLookup}, - BuildStorage, -}; +pub use sp_runtime::{traits::BlakeTwo256, BuildStorage}; use sp_std::convert::{TryFrom, TryInto}; pub use frame_support::{ assert_noop, assert_ok, derive_impl, ord_parameter_types, parameter_types, - traits::{EitherOfDiverse, SortedMembers}, - BoundedVec, + traits::EitherOfDiverse, BoundedVec, }; use frame_system::{EnsureRoot, EnsureSignedBy}; use pallet_identity::{ diff --git a/substrate/frame/assets/src/benchmarking.rs b/substrate/frame/assets/src/benchmarking.rs index f8495a1c8f2..8fe5a7e2493 100644 --- a/substrate/frame/assets/src/benchmarking.rs +++ b/substrate/frame/assets/src/benchmarking.rs @@ -102,7 +102,7 @@ fn add_sufficients, I: 'static>(minter: T::AccountId, n: u32) { fn add_approvals, I: 'static>(minter: T::AccountId, n: u32) { let asset_id = default_asset_id::(); - T::Currency::deposit_creating( + let _ = T::Currency::deposit_creating( &minter, T::ApprovalDeposit::get() * n.into() + T::Currency::minimum_balance(), ); diff --git a/substrate/frame/beefy/src/mock.rs b/substrate/frame/beefy/src/mock.rs index 8dc30614c33..8828fa36218 100644 --- a/substrate/frame/beefy/src/mock.rs +++ b/substrate/frame/beefy/src/mock.rs @@ -37,10 +37,7 @@ use sp_state_machine::BasicExternalities; use crate as pallet_beefy; -pub use sp_consensus_beefy::{ - ecdsa_crypto::{AuthorityId as BeefyId, AuthoritySignature as BeefySignature}, - ConsensusLog, EquivocationProof, BEEFY_ENGINE_ID, -}; +pub use sp_consensus_beefy::{ecdsa_crypto::AuthorityId as BeefyId, ConsensusLog, BEEFY_ENGINE_ID}; impl_opaque_keys! { pub struct MockSessionKeys { diff --git a/substrate/frame/broker/src/lib.rs b/substrate/frame/broker/src/lib.rs index 42895512ec0..ee3501d5607 100644 --- a/substrate/frame/broker/src/lib.rs +++ b/substrate/frame/broker/src/lib.rs @@ -42,9 +42,7 @@ pub use weights::WeightInfo; pub use adapt_price::*; pub use core_mask::*; pub use coretime_interface::*; -pub use nonfungible_impl::*; pub use types::*; -pub use utility_impls::*; #[frame_support::pallet] pub mod pallet { diff --git a/substrate/frame/contracts/src/migration/v10.rs b/substrate/frame/contracts/src/migration/v10.rs index f02e28f6fde..22fad38739e 100644 --- a/substrate/frame/contracts/src/migration/v10.rs +++ b/substrate/frame/contracts/src/migration/v10.rs @@ -219,7 +219,7 @@ where "Failed to transfer the base deposit, reason: {:?}", err ); - OldCurrency::deposit_creating(&deposit_account, min_balance); + let _ = OldCurrency::deposit_creating(&deposit_account, min_balance); min_balance }); diff --git a/substrate/frame/contracts/src/wasm/mod.rs b/substrate/frame/contracts/src/wasm/mod.rs index 448c0dd7496..4650a9bc79a 100644 --- a/substrate/frame/contracts/src/wasm/mod.rs +++ b/substrate/frame/contracts/src/wasm/mod.rs @@ -25,13 +25,15 @@ mod runtime; pub use crate::wasm::runtime::api_doc; pub use crate::wasm::runtime::{ - AllowDeprecatedInterface, AllowUnstableInterface, Environment, ReturnErrorCode, Runtime, - RuntimeCosts, + AllowDeprecatedInterface, AllowUnstableInterface, Environment, Runtime, RuntimeCosts, }; -pub use pallet_contracts_uapi::ReturnFlags; + #[cfg(test)] pub use tests::MockExt; +#[cfg(test)] +pub use crate::wasm::runtime::ReturnErrorCode; + use crate::{ exec::{ExecResult, Executable, ExportedFunction, Ext}, gas::{GasMeter, Token}, diff --git a/substrate/frame/election-provider-multi-phase/src/mock.rs b/substrate/frame/election-provider-multi-phase/src/mock.rs index af126f08d51..e7dd8acf36b 100644 --- a/substrate/frame/election-provider-multi-phase/src/mock.rs +++ b/substrate/frame/election-provider-multi-phase/src/mock.rs @@ -21,7 +21,7 @@ use frame_election_provider_support::{ bounds::{DataProviderBounds, ElectionBounds}, data_provider, onchain, ElectionDataProvider, NposSolution, SequentialPhragmen, }; -pub use frame_support::{assert_noop, assert_ok, derive_impl, pallet_prelude::GetDefault}; +pub use frame_support::derive_impl; use frame_support::{ parameter_types, traits::{ConstU32, Hooks}, @@ -117,7 +117,7 @@ pub fn roll_to_round(n: u32) { while MultiPhase::round() != n { roll_to_signed(); - assert_ok!(MultiPhase::elect()); + frame_support::assert_ok!(MultiPhase::elect()); } } @@ -638,9 +638,9 @@ impl ExtBuilder { #[cfg(feature = "try-runtime")] ext.execute_with(|| { - assert_ok!(>::try_state( - System::block_number() - )); + frame_support::assert_ok!( + >::try_state(System::block_number()) + ); }); } } diff --git a/substrate/frame/elections-phragmen/src/benchmarking.rs b/substrate/frame/elections-phragmen/src/benchmarking.rs index 9878f7fd41c..55bb1b968fa 100644 --- a/substrate/frame/elections-phragmen/src/benchmarking.rs +++ b/substrate/frame/elections-phragmen/src/benchmarking.rs @@ -38,7 +38,7 @@ fn endowed_account(name: &'static str, index: u32) -> T::AccountId { let _ = T::Currency::make_free_balance_be(&account, amount); // important to increase the total issuance since T::CurrencyToVote will need it to be sane for // phragmen to work. - T::Currency::issue(amount); + let _ = T::Currency::issue(amount); account } diff --git a/substrate/frame/fast-unstake/src/lib.rs b/substrate/frame/fast-unstake/src/lib.rs index 153b6c2c353..04a50543bcc 100644 --- a/substrate/frame/fast-unstake/src/lib.rs +++ b/substrate/frame/fast-unstake/src/lib.rs @@ -571,7 +571,7 @@ pub mod pallet { .any(|e| T::Staking::is_exposed_in_era(&stash, e)); if is_exposed { - T::Currency::slash_reserved(&stash, deposit); + let _ = T::Currency::slash_reserved(&stash, deposit); log!(info, "slashed {:?} by {:?}", stash, deposit); Self::deposit_event(Event::::Slashed { stash, amount: deposit }); false diff --git a/substrate/frame/indices/src/lib.rs b/substrate/frame/indices/src/lib.rs index 3c0b4930413..ff12d092cfb 100644 --- a/substrate/frame/indices/src/lib.rs +++ b/substrate/frame/indices/src/lib.rs @@ -223,7 +223,7 @@ pub mod pallet { let (account, amount, perm) = maybe_value.take().ok_or(Error::::NotAssigned)?; ensure!(!perm, Error::::Permanent); ensure!(account == who, Error::::NotOwner); - T::Currency::slash_reserved(&who, amount); + let _ = T::Currency::slash_reserved(&who, amount); *maybe_value = Some((account, Zero::zero(), true)); Ok(()) })?; diff --git a/substrate/frame/lottery/src/lib.rs b/substrate/frame/lottery/src/lib.rs index c54f6d76803..54a8edd3860 100644 --- a/substrate/frame/lottery/src/lib.rs +++ b/substrate/frame/lottery/src/lib.rs @@ -368,7 +368,8 @@ pub mod pallet { // Make sure pot exists. let lottery_account = Self::account_id(); if T::Currency::total_balance(&lottery_account).is_zero() { - T::Currency::deposit_creating(&lottery_account, T::Currency::minimum_balance()); + let _ = + T::Currency::deposit_creating(&lottery_account, T::Currency::minimum_balance()); } Self::deposit_event(Event::::LotteryStarted); Ok(()) diff --git a/substrate/frame/paged-list/src/paged_list.rs b/substrate/frame/paged-list/src/paged_list.rs index beea8ecc644..75467f3ceeb 100644 --- a/substrate/frame/paged-list/src/paged_list.rs +++ b/substrate/frame/paged-list/src/paged_list.rs @@ -407,13 +407,11 @@ where #[allow(dead_code)] pub(crate) mod mock { pub use super::*; - pub use frame_support::{ - parameter_types, - storage::{types::ValueQuery, StorageList as _}, - StorageNoopGuard, - }; - pub use sp_io::{hashing::twox_128, TestExternalities}; - pub use sp_metadata_ir::{StorageEntryModifierIR, StorageEntryTypeIR, StorageHasherIR}; + pub use frame_support::parameter_types; + #[cfg(test)] + pub use frame_support::{storage::StorageList as _, StorageNoopGuard}; + #[cfg(test)] + pub use sp_io::TestExternalities; parameter_types! { pub const ValuesPerNewPage: u32 = 5; diff --git a/substrate/frame/staking/src/benchmarking.rs b/substrate/frame/staking/src/benchmarking.rs index abb78b7e304..f1159c06aa1 100644 --- a/substrate/frame/staking/src/benchmarking.rs +++ b/substrate/frame/staking/src/benchmarking.rs @@ -250,7 +250,7 @@ benchmarks! { let original_bonded: BalanceOf = Ledger::::get(&controller).map(|l| l.active).ok_or("ledger not created after")?; - T::Currency::deposit_into_existing(&stash, max_additional).unwrap(); + let _ = T::Currency::deposit_into_existing(&stash, max_additional).unwrap(); whitelist_account!(stash); }: _(RawOrigin::Signed(stash), max_additional) diff --git a/substrate/frame/support/src/dispatch.rs b/substrate/frame/support/src/dispatch.rs index 449b6f23165..4a313551aca 100644 --- a/substrate/frame/support/src/dispatch.rs +++ b/substrate/frame/support/src/dispatch.rs @@ -664,7 +664,7 @@ mod weight_tests { use sp_runtime::{generic, traits::BlakeTwo256}; use sp_weights::RuntimeDbWeight; - pub use self::frame_system::{Call, Config, Pallet}; + pub use self::frame_system::{Call, Config}; fn from_actual_ref_time(ref_time: Option) -> PostDispatchInfo { PostDispatchInfo { diff --git a/substrate/primitives/database/src/lib.rs b/substrate/primitives/database/src/lib.rs index 012f699552d..42920bbefb4 100644 --- a/substrate/primitives/database/src/lib.rs +++ b/substrate/primitives/database/src/lib.rs @@ -101,7 +101,9 @@ pub trait Database>: Send + Sync { /// This may be faster than `get` since it doesn't allocate. /// Use `with_get` helper function if you need `f` to return a value from `f` fn with_get(&self, col: ColumnId, key: &[u8], f: &mut dyn FnMut(&[u8])) { - self.get(col, key).map(|v| f(&v)); + if let Some(v) = self.get(col, key) { + f(&v) + } } /// Check if database supports internal ref counting for state data. diff --git a/substrate/primitives/runtime-interface/proc-macro/src/utils.rs b/substrate/primitives/runtime-interface/proc-macro/src/utils.rs index 9818fd6842a..7d97f9f3e1c 100644 --- a/substrate/primitives/runtime-interface/proc-macro/src/utils.rs +++ b/substrate/primitives/runtime-interface/proc-macro/src/utils.rs @@ -89,7 +89,7 @@ struct RuntimeInterfaceFunctionSet { impl RuntimeInterfaceFunctionSet { fn new(version: VersionAttribute, trait_item: &TraitItemFn) -> Result { Ok(Self { - latest_version_to_call: version.is_callable().then(|| version.version), + latest_version_to_call: version.is_callable().then_some(version.version), versions: BTreeMap::from([( version.version, RuntimeInterfaceFunction::new(trait_item)?, diff --git a/substrate/primitives/storage/src/lib.rs b/substrate/primitives/storage/src/lib.rs index f8dc40f051c..3528d0558f5 100644 --- a/substrate/primitives/storage/src/lib.rs +++ b/substrate/primitives/storage/src/lib.rs @@ -414,12 +414,13 @@ impl ChildTrieParentKeyId { /// /// V0 and V1 uses a same trie implementation, but V1 will write external value node in the trie for /// value with size at least `TRIE_VALUE_NODE_THRESHOLD`. -#[derive(Debug, Clone, Copy, Eq, PartialEq)] +#[derive(Debug, Default, Clone, Copy, Eq, PartialEq)] #[cfg_attr(feature = "std", derive(Encode, Decode))] pub enum StateVersion { /// Old state version, no value nodes. V0 = 0, /// New state version can use value nodes. + #[default] V1 = 1, } @@ -432,12 +433,6 @@ impl Display for StateVersion { } } -impl Default for StateVersion { - fn default() -> Self { - StateVersion::V1 - } -} - impl From for u8 { fn from(version: StateVersion) -> u8 { version as u8 diff --git a/substrate/utils/build-script-utils/src/git.rs b/substrate/utils/build-script-utils/src/git.rs index 057ee0af15f..430a3e17c19 100644 --- a/substrate/utils/build-script-utils/src/git.rs +++ b/substrate/utils/build-script-utils/src/git.rs @@ -15,7 +15,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -use std::{env, fs, fs::File, io, io::Read, path::PathBuf}; +use std::{ + env, fs, + fs::File, + io, + io::Read, + path::{Path, PathBuf}, +}; /// Make sure the calling `build.rs` script is rerun when `.git/HEAD` or the ref of `.git/HEAD` /// changed. @@ -55,7 +61,7 @@ pub fn rerun_if_git_head_changed() { } // Code taken from https://github.com/rustyhorde/vergen/blob/8d522db8c8e16e26c0fc9ea8e6b0247cbf5cca84/src/output/envvar.rs -fn get_git_paths(path: &PathBuf) -> Result>, io::Error> { +fn get_git_paths(path: &Path) -> Result>, io::Error> { let git_dir_or_file = path.join(".git"); if let Ok(metadata) = fs::metadata(&git_dir_or_file) { diff --git a/substrate/utils/build-script-utils/src/version.rs b/substrate/utils/build-script-utils/src/version.rs index 549e499b110..d85c78d2c99 100644 --- a/substrate/utils/build-script-utils/src/version.rs +++ b/substrate/utils/build-script-utils/src/version.rs @@ -25,7 +25,7 @@ pub fn generate_cargo_keys() { // We deliberately set the length here to `11` to ensure that // the emitted hash is always of the same length; otherwise // it can (and will!) vary between different build environments. - match Command::new("git").args(&["rev-parse", "--short=11", "HEAD"]).output() { + match Command::new("git").args(["rev-parse", "--short=11", "HEAD"]).output() { Ok(o) if o.status.success() => { let sha = String::from_utf8_lossy(&o.stdout).trim().to_owned(); Cow::from(sha) -- GitLab From 792e374395078ee571bf14e4d7e09e753b79e819 Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Mon, 18 Dec 2023 15:01:06 +0100 Subject: [PATCH 050/191] Bridges subtree update (#2736) --- bridges/primitives/runtime/src/chain.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/bridges/primitives/runtime/src/chain.rs b/bridges/primitives/runtime/src/chain.rs index b78023efb1b..469c839ba15 100644 --- a/bridges/primitives/runtime/src/chain.rs +++ b/bridges/primitives/runtime/src/chain.rs @@ -15,7 +15,7 @@ // along with Parity Bridges Common. If not, see . use crate::HeaderIdProvider; -use codec::{Decode, Encode, MaxEncodedLen}; +use codec::{Codec, Decode, Encode, MaxEncodedLen}; use frame_support::{weights::Weight, Parameter}; use num_traits::{AsPrimitive, Bounded, CheckedSub, Saturating, SaturatingAdd, Zero}; use sp_runtime::{ @@ -39,7 +39,7 @@ pub enum EncodedOrDecodedCall { Decoded(ChainCall), } -impl EncodedOrDecodedCall { +impl EncodedOrDecodedCall { /// Returns decoded call. pub fn to_decoded(&self) -> Result { match self { @@ -57,6 +57,14 @@ impl EncodedOrDecodedCall { Self::Decoded(decoded_call) => Ok(decoded_call), } } + + /// Converts self to encoded call. + pub fn into_encoded(self) -> Vec { + match self { + Self::Encoded(encoded_call) => encoded_call, + Self::Decoded(decoded_call) => decoded_call.encode(), + } + } } impl From for EncodedOrDecodedCall { -- GitLab From ebe2aad6f0ae576a0e176f38a084fe7579f936dd Mon Sep 17 00:00:00 2001 From: Serban Iorga Date: Mon, 18 Dec 2023 15:14:29 +0100 Subject: [PATCH 051/191] BEEFY: expect_validator_set() small fix (#2737) Follow-up on https://github.com/paritytech/polkadot-sdk/pull/2716 Sorry, small miss --- substrate/client/consensus/beefy/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/substrate/client/consensus/beefy/src/lib.rs b/substrate/client/consensus/beefy/src/lib.rs index c3da2b886f4..e6224cbf3e9 100644 --- a/substrate/client/consensus/beefy/src/lib.rs +++ b/substrate/client/consensus/beefy/src/lib.rs @@ -550,7 +550,7 @@ where debug!(target: LOG_TARGET, "🥩 Trying to find validator set active at header: {:?}", at_header); let mut header = at_header.clone(); loop { - if let Ok(Some(active)) = runtime.runtime_api().validator_set(at_header.hash()) { + if let Ok(Some(active)) = runtime.runtime_api().validator_set(header.hash()) { return Ok(active) } else { debug!(target: LOG_TARGET, "🥩 Looking for auth set change at block number: {:?}", *header.number()); -- GitLab From f93f461acc24022bf7ef07c5913e620121776708 Mon Sep 17 00:00:00 2001 From: Alexander Samusev <41779041+alvicsam@users.noreply.github.com> Date: Mon, 18 Dec 2023 16:17:52 +0100 Subject: [PATCH 052/191] [ci] Fix node-bench-regression-guard job (#2732) After GitLab update it started to remove artifacts from master if PR has more than 20 commits. PR fixes this for `node-bench-regression-guard` job cc https://github.com/paritytech/ci_cd/issues/915 --- .gitlab/pipeline/test.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.gitlab/pipeline/test.yml b/.gitlab/pipeline/test.yml index 0e7d96f3dba..bbe9b612bc3 100644 --- a/.gitlab/pipeline/test.yml +++ b/.gitlab/pipeline/test.yml @@ -303,8 +303,15 @@ node-bench-regression-guard: artifacts: true variables: CI_IMAGE: "paritytech/node-bench-regression-guard:latest" + # current git limit is 20, set to 100 to avoid failures (gitlab removes old artifacts) + GIT_DEPTH: 100 + GIT_STRATEGY: fetch before_script: [""] script: + - if [ $(ls -la artifacts/benches/ | grep master | wc -l) == 0 ]; then + echo "Couldn't find master artifacts, consider increasing GIT_LIMIT variable"; + exit 1; + fi - echo "------- IMPORTANT -------" - echo "node-bench-regression-guard depends on the results of a cargo-check-benches job" - echo "In case of this job failure, check your pipeline's cargo-check-benches" @@ -520,6 +527,6 @@ test-syscalls: - ./list-syscalls.rb ../../../target/x86_64-unknown-linux-musl/production/polkadot-prepare-worker --only-used-syscalls | diff -u prepare-worker-syscalls - after_script: - if [[ "$CI_JOB_STATUS" == "failed" ]]; then - printf "The x86_64 syscalls used by the worker binaries have changed. Please review if this is expected and update polkadot/scripts/list-syscalls/*-worker-syscalls as needed.\n"; + printf "The x86_64 syscalls used by the worker binaries have changed. Please review if this is expected and update polkadot/scripts/list-syscalls/*-worker-syscalls as needed.\n"; fi allow_failure: false # this rarely triggers in practice -- GitLab From 526c81b138220dbff9c847508d3db32e33145bdd Mon Sep 17 00:00:00 2001 From: Andrei Eres Date: Tue, 19 Dec 2023 12:14:22 +0100 Subject: [PATCH 053/191] subsystem benchmarks: add cpu profiling (#2734) Ready-to-merge version of https://github.com/paritytech/polkadot-sdk/pull/2601 - Added optional CPU profiling - Updated instructions how to set up Prometheus, Pyroscope and Graphana - Added a flamegraph dashboard image --------- Co-authored-by: ordian --- Cargo.lock | 2 + polkadot/node/subsystem-bench/Cargo.toml | 2 + polkadot/node/subsystem-bench/README.md | 87 ++++++++++++------- .../subsystem-bench/docker/docker-compose.yml | 35 ++++++++ .../docker/prometheus/prometheus.yml | 11 +++ .../grafana/cpu-profiling.json | 70 +++++++++++++++ .../subsystem-bench/src/subsystem-bench.rs | 29 +++++++ 7 files changed, 206 insertions(+), 30 deletions(-) create mode 100644 polkadot/node/subsystem-bench/docker/docker-compose.yml create mode 100644 polkadot/node/subsystem-bench/docker/prometheus/prometheus.yml create mode 100644 polkadot/node/subsystem-bench/grafana/cpu-profiling.json diff --git a/Cargo.lock b/Cargo.lock index 32e68779fd1..b65d6fc1b71 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13322,6 +13322,8 @@ dependencies = [ "polkadot-primitives", "polkadot-primitives-test-helpers", "prometheus", + "pyroscope", + "pyroscope_pprofrs", "rand 0.8.5", "sc-keystore", "sc-network", diff --git a/polkadot/node/subsystem-bench/Cargo.toml b/polkadot/node/subsystem-bench/Cargo.toml index cf9fd8822dd..6504c8f714d 100644 --- a/polkadot/node/subsystem-bench/Cargo.toml +++ b/polkadot/node/subsystem-bench/Cargo.toml @@ -56,6 +56,8 @@ serde = "1.0.192" serde_yaml = "0.9" paste = "1.0.14" orchestra = { version = "0.3.3", default-features = false, features = ["futures_channel"] } +pyroscope = "0.5.7" +pyroscope_pprofrs = "0.2.7" [features] default = [] diff --git a/polkadot/node/subsystem-bench/README.md b/polkadot/node/subsystem-bench/README.md index 21844853334..b1476db2754 100644 --- a/polkadot/node/subsystem-bench/README.md +++ b/polkadot/node/subsystem-bench/README.md @@ -1,6 +1,6 @@ # Subsystem benchmark client -Run parachain consensus stress and performance tests on your development machine. +Run parachain consensus stress and performance tests on your development machine. ## Motivation @@ -26,17 +26,26 @@ The output binary will be placed in `target/testnet/subsystem-bench`. ### Test metrics -Subsystem, CPU usage and network metrics are exposed via a prometheus endpoint during the test execution. +Subsystem, CPU usage and network metrics are exposed via a prometheus endpoint during the test execution. A small subset of these collected metrics are displayed in the CLI, but for an in depth analysys of the test results, a local Grafana/Prometheus stack is needed. +### Run Prometheus, Pyroscope and Graphana in Docker + +If docker is not usable, then follow the next sections to manually install Prometheus, Pyroscope and Graphana on your machine. + +```bash +cd polkadot/node/subsystem-bench/docker +docker compose up +``` + ### Install Prometheus Please follow the [official installation guide](https://prometheus.io/docs/prometheus/latest/installation/) for your platform/OS. After succesfully installing and starting up Prometheus, we need to alter it's configuration such that it -will scrape the benchmark prometheus endpoint `127.0.0.1:9999`. Please check the prometheus official documentation +will scrape the benchmark prometheus endpoint `127.0.0.1:9999`. Please check the prometheus official documentation regarding the location of `prometheus.yml`. On MacOS for example the full path `/opt/homebrew/etc/prometheus.yml` prometheus.yml: @@ -57,13 +66,29 @@ scrape_configs: To complete this step restart Prometheus server such that it picks up the new configuration. -### Install and setup Grafana +### Install Pyroscope + +To collect CPU profiling data, you must be running the Pyroscope server. +Follow the [installation guide](https://grafana.com/docs/pyroscope/latest/get-started/) +relevant to your operating system. + +### Install Grafana Follow the [installation guide](https://grafana.com/docs/grafana/latest/setup-grafana/installation/) relevant to your operating system. -Once you have the installation up and running, configure the local Prometheus as a data source by following -[this guide](https://grafana.com/docs/grafana/latest/datasources/prometheus/configure-prometheus-data-source/) +### Setup Grafana + +Once you have the installation up and running, configure the local Prometheus and Pyroscope (if needed) +as data sources by following these guides: + +- [Prometheus](https://grafana.com/docs/grafana/latest/datasources/prometheus/configure-prometheus-data-source/) +- [Pyroscope](https://grafana.com/docs/grafana/latest/datasources/grafana-pyroscope/) + +If you are running the servers in Docker, use the following URLs: + +- Prometheus `http://prometheus:9090/` +- Pyroscope `http://pyroscope:4040/` #### Import dashboards @@ -86,26 +111,29 @@ Commands: ``` Note: `test-sequence` is a special test objective that wraps up an arbitrary number of test objectives. It is tipically - used to run a suite of tests defined in a `yaml` file like in this [example](examples/availability_read.yaml). +used to run a suite of tests defined in a `yaml` file like in this [example](examples/availability_read.yaml). ### Standard test options - + ``` Options: - --network The type of network to be emulated [default: ideal] [possible values: - ideal, healthy, degraded] - --n-cores Number of cores to fetch availability for [default: 100] - --n-validators Number of validators to fetch chunks from [default: 500] - --min-pov-size The minimum pov size in KiB [default: 5120] - --max-pov-size The maximum pov size bytes [default: 5120] - -n, --num-blocks The number of blocks the test is going to run [default: 1] - -p, --peer-bandwidth The bandwidth of simulated remote peers in KiB - -b, --bandwidth The bandwidth of our simulated node in KiB - --peer-error Simulated conection error ratio [0-100] - --peer-min-latency Minimum remote peer latency in milliseconds [0-5000] - --peer-max-latency Maximum remote peer latency in milliseconds [0-5000] - -h, --help Print help - -V, --version Print version + --network The type of network to be emulated [default: ideal] [possible values: + ideal, healthy, degraded] + --n-cores Number of cores to fetch availability for [default: 100] + --n-validators Number of validators to fetch chunks from [default: 500] + --min-pov-size The minimum pov size in KiB [default: 5120] + --max-pov-size The maximum pov size bytes [default: 5120] + -n, --num-blocks The number of blocks the test is going to run [default: 1] + -p, --peer-bandwidth The bandwidth of simulated remote peers in KiB + -b, --bandwidth The bandwidth of our simulated node in KiB + --peer-error Simulated conection error ratio [0-100] + --peer-min-latency Minimum remote peer latency in milliseconds [0-5000] + --peer-max-latency Maximum remote peer latency in milliseconds [0-5000] + --profile Enable CPU Profiling with Pyroscope + --pyroscope-url Pyroscope Server URL [default: http://localhost:4040] + --pyroscope-sample-rate Pyroscope Sample Rate [default: 113] + -h, --help Print help + -V, --version Print version ``` These apply to all test objectives, except `test-sequence` which relies on the values being specified in a file. @@ -123,8 +151,8 @@ Benchmark availability recovery strategies Usage: subsystem-bench data-availability-read [OPTIONS] Options: - -f, --fetch-from-backers Turbo boost AD Read by fetching the full availability datafrom backers first. Saves CPU - as we don't need to re-construct from chunks. Tipically this is only faster if nodes + -f, --fetch-from-backers Turbo boost AD Read by fetching the full availability datafrom backers first. Saves CPU + as we don't need to re-construct from chunks. Tipically this is only faster if nodes have enough bandwidth -h, --help Print help ``` @@ -152,8 +180,8 @@ Let's run an availabilty read test which will recover availability for 10 cores node validator network. ``` - target/testnet/subsystem-bench --n-cores 10 data-availability-read -[2023-11-28T09:01:59Z INFO subsystem_bench::core::display] n_validators = 500, n_cores = 10, pov_size = 5120 - 5120, + target/testnet/subsystem-bench --n-cores 10 data-availability-read +[2023-11-28T09:01:59Z INFO subsystem_bench::core::display] n_validators = 500, n_cores = 10, pov_size = 5120 - 5120, error = 0, latency = None [2023-11-28T09:01:59Z INFO subsystem-bench::availability] Generating template candidate index=0 pov_size=5242880 [2023-11-28T09:01:59Z INFO subsystem-bench::availability] Created test environment. @@ -167,8 +195,8 @@ node validator network. [2023-11-28T09:02:07Z INFO subsystem_bench::availability] All blocks processed in 6001ms [2023-11-28T09:02:07Z INFO subsystem_bench::availability] Throughput: 51200 KiB/block [2023-11-28T09:02:07Z INFO subsystem_bench::availability] Block time: 6001 ms -[2023-11-28T09:02:07Z INFO subsystem_bench::availability] - +[2023-11-28T09:02:07Z INFO subsystem_bench::availability] + Total received from network: 66 MiB Total sent to network: 58 KiB Total subsystem CPU usage 4.16s @@ -192,8 +220,7 @@ view the test progress in real time by accessing [this link](http://localhost:30 Now run `target/testnet/subsystem-bench test-sequence --path polkadot/node/subsystem-bench/examples/availability_read.yaml` -and view the metrics in real time and spot differences between different `n_valiator` values. - +and view the metrics in real time and spot differences between different `n_validators` values. ## Create new test objectives This tool is intended to make it easy to write new test objectives that focus individual subsystems, diff --git a/polkadot/node/subsystem-bench/docker/docker-compose.yml b/polkadot/node/subsystem-bench/docker/docker-compose.yml new file mode 100644 index 00000000000..fc5eb1f634e --- /dev/null +++ b/polkadot/node/subsystem-bench/docker/docker-compose.yml @@ -0,0 +1,35 @@ +services: + grafana: + image: grafana/grafana-enterprise:latest + container_name: grafana + restart: always + networks: + - subsystem-bench + ports: + - "3000:3000" + + prometheus: + image: prom/prometheus:latest + container_name: prometheus + restart: always + networks: + - subsystem-bench + volumes: + - ./prometheus:/etc/prometheus + extra_hosts: + - "host.docker.internal:host-gateway" + ports: + - "9090:9090" + - "9999:9999" + + pyroscope: + container_name: pyroscope + image: grafana/pyroscope:latest + restart: always + networks: + - subsystem-bench + ports: + - "4040:4040" + +networks: + subsystem-bench: diff --git a/polkadot/node/subsystem-bench/docker/prometheus/prometheus.yml b/polkadot/node/subsystem-bench/docker/prometheus/prometheus.yml new file mode 100644 index 00000000000..0bb25cfcb36 --- /dev/null +++ b/polkadot/node/subsystem-bench/docker/prometheus/prometheus.yml @@ -0,0 +1,11 @@ +global: + scrape_interval: 5s + +scrape_configs: + - job_name: "prometheus" + static_configs: + - targets: ["localhost:9090"] + - job_name: "subsystem-bench" + scrape_interval: 0s500ms + static_configs: + - targets: ['host.docker.internal:9999'] diff --git a/polkadot/node/subsystem-bench/grafana/cpu-profiling.json b/polkadot/node/subsystem-bench/grafana/cpu-profiling.json new file mode 100644 index 00000000000..0d53a1b9365 --- /dev/null +++ b/polkadot/node/subsystem-bench/grafana/cpu-profiling.json @@ -0,0 +1,70 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 1, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "grafana-pyroscope-datasource", + "uid": "bc3bc04f-85f9-464b-8ae3-fbe0949063f6" + }, + "gridPos": { + "h": 18, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 1, + "targets": [ + { + "datasource": { + "type": "grafana-pyroscope-datasource", + "uid": "bc3bc04f-85f9-464b-8ae3-fbe0949063f6" + }, + "groupBy": [], + "labelSelector": "{service_name=\"subsystem-bench\"}", + "profileTypeId": "process_cpu:cpu:nanoseconds:cpu:nanoseconds", + "queryType": "profile", + "refId": "A" + } + ], + "title": "CPU Profiling", + "type": "flamegraph" + } + ], + "refresh": "", + "schemaVersion": 38, + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "CPU Profiling", + "uid": "c31191d5-fe2b-49e2-8b1c-1451f31d1628", + "version": 1, + "weekStart": "" + } diff --git a/polkadot/node/subsystem-bench/src/subsystem-bench.rs b/polkadot/node/subsystem-bench/src/subsystem-bench.rs index da7e5441f74..29b62b27855 100644 --- a/polkadot/node/subsystem-bench/src/subsystem-bench.rs +++ b/polkadot/node/subsystem-bench/src/subsystem-bench.rs @@ -18,6 +18,8 @@ //! CI regression testing. use clap::Parser; use color_eyre::eyre; +use pyroscope::PyroscopeAgent; +use pyroscope_pprofrs::{pprof_backend, PprofConfig}; use colored::Colorize; use std::{path::Path, time::Duration}; @@ -76,12 +78,34 @@ struct BenchCli { /// Maximum remote peer latency in milliseconds [0-5000]. pub peer_max_latency: Option, + #[clap(long, default_value_t = false)] + /// Enable CPU Profiling with Pyroscope + pub profile: bool, + + #[clap(long, requires = "profile", default_value_t = String::from("http://localhost:4040"))] + /// Pyroscope Server URL + pub pyroscope_url: String, + + #[clap(long, requires = "profile", default_value_t = 113)] + /// Pyroscope Sample Rate + pub pyroscope_sample_rate: u32, + #[command(subcommand)] pub objective: cli::TestObjective, } impl BenchCli { fn launch(self) -> eyre::Result<()> { + let agent_running = if self.profile { + let agent = PyroscopeAgent::builder(self.pyroscope_url.as_str(), "subsystem-bench") + .backend(pprof_backend(PprofConfig::new().sample_rate(self.pyroscope_sample_rate))) + .build()?; + + Some(agent.start()?) + } else { + None + }; + let configuration = self.standard_configuration; let mut test_config = match self.objective { TestObjective::TestSequence(options) => { @@ -165,6 +189,11 @@ impl BenchCli { env.runtime() .block_on(availability::benchmark_availability_read(&mut env, state)); + if let Some(agent_running) = agent_running { + let agent_ready = agent_running.stop()?; + agent_ready.shutdown(); + } + Ok(()) } } -- GitLab From 657fc2a6605232db21bf2a57450ceff947fad424 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Dec 2023 13:47:08 +0100 Subject: [PATCH 054/191] Bump dyn-clone from 1.0.13 to 1.0.16 (#2748) Bumps [dyn-clone](https://github.com/dtolnay/dyn-clone) from 1.0.13 to 1.0.16.
Release notes

Sourced from dyn-clone's releases.

1.0.16

  • Documentation improvements

1.0.15

  • Documentation improvements

1.0.14

  • Documentation improvements
Commits
  • f2f0a02 Release 1.0.16
  • 7e5037b Fix crate name in html_root_url
  • e84a6e1 Release 1.0.15
  • 453e078 Fix documentation on no-std targets
  • 4bcfc07 Let rustdoc see std crate
  • 8bd3355 Allow rustdoc to take care of intra-doc links
  • 638fa8b Remove 'remember to update' reminder from Cargo.toml
  • 2e6b761 Test docs.rs documentation build in CI
  • cee9947 Release 1.0.14
  • 7b6a707 Delete dyn-clonable link
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=dyn-clone&package-manager=cargo&previous-version=1.0.13&new-version=1.0.16)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- cumulus/client/consensus/common/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b65d6fc1b71..1829155ac9b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4651,9 +4651,9 @@ dependencies = [ [[package]] name = "dyn-clone" -version = "1.0.13" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbfc4744c1b8f2a09adc0e55242f60b1af195d88596bd8700be74418c056c555" +checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d" [[package]] name = "ecdsa" diff --git a/cumulus/client/consensus/common/Cargo.toml b/cumulus/client/consensus/common/Cargo.toml index 4796667d695..e7fc7a88640 100644 --- a/cumulus/client/consensus/common/Cargo.toml +++ b/cumulus/client/consensus/common/Cargo.toml @@ -12,7 +12,7 @@ workspace = true [dependencies] async-trait = "0.1.74" codec = { package = "parity-scale-codec", version = "3.0.0", features = ["derive"] } -dyn-clone = "1.0.12" +dyn-clone = "1.0.16" futures = "0.3.28" log = "0.4.20" tracing = "0.1.37" -- GitLab From 81156d03cec0b34c62faa853c3b38e3ba7c82ced Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Dec 2023 13:48:54 +0100 Subject: [PATCH 055/191] Bump actions/setup-node from 4.0.0 to 4.0.1 (#2746) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [actions/setup-node](https://github.com/actions/setup-node) from 4.0.0 to 4.0.1.
Release notes

Sourced from actions/setup-node's releases.

v4.0.1

What's Changed

New Contributors

Full Changelog: https://github.com/actions/setup-node/compare/v4...v4.0.1

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/setup-node&package-manager=github_actions&previous-version=4.0.0&new-version=4.0.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/check-licenses.yml | 2 +- .github/workflows/check-markdown.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/check-licenses.yml b/.github/workflows/check-licenses.yml index a5d7ba6ec27..e1e92d288ce 100644 --- a/.github/workflows/check-licenses.yml +++ b/.github/workflows/check-licenses.yml @@ -16,7 +16,7 @@ jobs: steps: - name: Checkout sources uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - uses: actions/setup-node@v4.0.0 + - uses: actions/setup-node@v4.0.1 with: node-version: "18.x" registry-url: "https://npm.pkg.github.com" diff --git a/.github/workflows/check-markdown.yml b/.github/workflows/check-markdown.yml index 2108f942090..dc02970a173 100644 --- a/.github/workflows/check-markdown.yml +++ b/.github/workflows/check-markdown.yml @@ -16,7 +16,7 @@ jobs: - name: Checkout sources uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - uses: actions/setup-node@v4.0.0 + - uses: actions/setup-node@v4.0.1 with: node-version: "18.x" registry-url: "https://npm.pkg.github.com" -- GitLab From 0b74812ce8a87a716179b2a52c988d1663232c5e Mon Sep 17 00:00:00 2001 From: Muharem Date: Tue, 19 Dec 2023 13:51:05 +0100 Subject: [PATCH 056/191] `UnionOf` types for merged `fungible` and `fungibles` implementations (#2033) Introduces `UnionOf` types, crafted to merge `fungible` and `fungibles` implementations or two `fungibles` implementations into a single type implementing `fungibles`. This also addresses an issue where `ItemOf` initiates a double drop for an imbalance type, leading to inaccurate total issuance accounting. Find the application of these types in this PR - [link](https://github.com/paritytech/polkadot-sdk/pull/2031), places in code - [1](https://github.com/paritytech/polkadot-sdk/blob/4ec7496fa2632385b08fae860fcf28a523a7b5de/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs#L327), [2](https://github.com/paritytech/polkadot-sdk/blob/4ec7496fa2632385b08fae860fcf28a523a7b5de/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs#L343). --------- Co-authored-by: Liam Aharon Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> Co-authored-by: Oliver Tale-Yazdi Co-authored-by: joepetrowski --- .../common/src/local_and_foreign_assets.rs | 12 +- prdoc/pr_2033.prdoc | 14 + substrate/frame/asset-conversion/src/lib.rs | 6 +- substrate/frame/assets/src/lib.rs | 16 +- substrate/frame/assets/src/tests.rs | 2 + substrate/frame/assets/src/tests/sets.rs | 346 +++++++ substrate/frame/balances/src/impl_fungible.rs | 24 +- substrate/frame/support/src/traits/misc.rs | 17 +- .../src/traits/tokens/fungible/imbalance.rs | 29 +- .../src/traits/tokens/fungible/item_of.rs | 41 +- .../support/src/traits/tokens/fungible/mod.rs | 4 +- .../src/traits/tokens/fungible/union_of.rs | 924 ++++++++++++++++++ .../src/traits/tokens/fungibles/imbalance.rs | 54 +- .../src/traits/tokens/fungibles/mod.rs | 4 +- .../src/traits/tokens/fungibles/union_of.rs | 897 +++++++++++++++++ 15 files changed, 2353 insertions(+), 37 deletions(-) create mode 100644 prdoc/pr_2033.prdoc create mode 100644 substrate/frame/assets/src/tests/sets.rs create mode 100644 substrate/frame/support/src/traits/tokens/fungible/union_of.rs create mode 100644 substrate/frame/support/src/traits/tokens/fungibles/union_of.rs diff --git a/cumulus/parachains/runtimes/assets/common/src/local_and_foreign_assets.rs b/cumulus/parachains/runtimes/assets/common/src/local_and_foreign_assets.rs index 9f429016f53..ed588798556 100644 --- a/cumulus/parachains/runtimes/assets/common/src/local_and_foreign_assets.rs +++ b/cumulus/parachains/runtimes/assets/common/src/local_and_foreign_assets.rs @@ -318,10 +318,18 @@ where } } + fn should_touch(asset_id: MultiLocation, who: &AccountId) -> bool { + if let Some(asset_id) = LocalAssetIdConverter::convert(&asset_id) { + Assets::should_touch(asset_id, who) + } else { + ForeignAssets::should_touch(asset_id, who) + } + } + fn touch( asset_id: MultiLocation, - who: AccountId, - depositor: AccountId, + who: &AccountId, + depositor: &AccountId, ) -> Result<(), DispatchError> { if let Some(asset_id) = LocalAssetIdConverter::convert(&asset_id) { Assets::touch(asset_id, who, depositor) diff --git a/prdoc/pr_2033.prdoc b/prdoc/pr_2033.prdoc new file mode 100644 index 00000000000..eeb7ff2b4ee --- /dev/null +++ b/prdoc/pr_2033.prdoc @@ -0,0 +1,14 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "`UnionOf` types for merged `fungible` and `fungibles` implementations" + +doc: + - audience: Runtime Dev + description: | + Introduces `UnionOf` types, crafted to merge `fungible` and `fungibles` implementations or two + `fungibles` implementations into a single type implementing `fungibles`. This also addresses + an issue where `ItemOf` initiates a double drop for an imbalance type, leading to inaccurate + total issuance accounting. + +crates: [ ] diff --git a/substrate/frame/asset-conversion/src/lib.rs b/substrate/frame/asset-conversion/src/lib.rs index 8d811473e86..5cbc2821ce6 100644 --- a/substrate/frame/asset-conversion/src/lib.rs +++ b/substrate/frame/asset-conversion/src/lib.rs @@ -417,7 +417,7 @@ pub mod pallet { match T::MultiAssetIdConverter::try_convert(asset1) { MultiAssetIdConversionResult::Converted(asset) => if !T::Assets::contains(&asset, &pool_account) { - T::Assets::touch(asset, pool_account.clone(), sender.clone())? + T::Assets::touch(asset, &pool_account, &sender)? }, MultiAssetIdConversionResult::Unsupported(_) => Err(Error::::UnsupportedAsset)?, MultiAssetIdConversionResult::Native => (), @@ -425,7 +425,7 @@ pub mod pallet { match T::MultiAssetIdConverter::try_convert(asset2) { MultiAssetIdConversionResult::Converted(asset) => if !T::Assets::contains(&asset, &pool_account) { - T::Assets::touch(asset, pool_account.clone(), sender.clone())? + T::Assets::touch(asset, &pool_account, &sender)? }, MultiAssetIdConversionResult::Unsupported(_) => Err(Error::::UnsupportedAsset)?, MultiAssetIdConversionResult::Native => (), @@ -438,7 +438,7 @@ pub mod pallet { NextPoolAssetId::::set(Some(next_lp_token_id)); T::PoolAssets::create(lp_token.clone(), pool_account.clone(), false, 1u32.into())?; - T::PoolAssets::touch(lp_token.clone(), pool_account.clone(), sender.clone())?; + T::PoolAssets::touch(lp_token.clone(), &pool_account, &sender)?; let pool_info = PoolInfo { lp_token: lp_token.clone() }; Pools::::insert(pool_id.clone(), pool_info); diff --git a/substrate/frame/assets/src/lib.rs b/substrate/frame/assets/src/lib.rs index 13aee138ad3..f3ae03d667b 100644 --- a/substrate/frame/assets/src/lib.rs +++ b/substrate/frame/assets/src/lib.rs @@ -1648,8 +1648,20 @@ pub mod pallet { T::AssetAccountDeposit::get() } - fn touch(asset: T::AssetId, who: T::AccountId, depositor: T::AccountId) -> DispatchResult { - Self::do_touch(asset, who, depositor, false) + fn should_touch(asset: T::AssetId, who: &T::AccountId) -> bool { + match Asset::::get(&asset) { + Some(info) if info.is_sufficient => false, + Some(_) => !Account::::contains_key(asset, who), + _ => true, + } + } + + fn touch( + asset: T::AssetId, + who: &T::AccountId, + depositor: &T::AccountId, + ) -> DispatchResult { + Self::do_touch(asset, who.clone(), depositor.clone(), false) } } diff --git a/substrate/frame/assets/src/tests.rs b/substrate/frame/assets/src/tests.rs index f1b116a0f4a..e09648a51ec 100644 --- a/substrate/frame/assets/src/tests.rs +++ b/substrate/frame/assets/src/tests.rs @@ -28,6 +28,8 @@ use pallet_balances::Error as BalancesError; use sp_io::storage; use sp_runtime::{traits::ConvertInto, TokenError}; +mod sets; + fn asset_ids() -> Vec { let mut s: Vec<_> = Assets::asset_ids().collect(); s.sort(); diff --git a/substrate/frame/assets/src/tests/sets.rs b/substrate/frame/assets/src/tests/sets.rs new file mode 100644 index 00000000000..bdff5175185 --- /dev/null +++ b/substrate/frame/assets/src/tests/sets.rs @@ -0,0 +1,346 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Tests for [`ItemOf`], [`fungible::UnionOf`] and [`fungibles::UnionOf`] set types. + +use super::*; +use frame_support::{ + parameter_types, + traits::{ + fungible, + fungible::ItemOf, + fungibles, + tokens::{ + fungibles::{ + Balanced as FungiblesBalanced, Create as FungiblesCreate, + Inspect as FungiblesInspect, Mutate as FungiblesMutate, + }, + Fortitude, Precision, Preservation, + }, + }, +}; +use sp_runtime::{traits::ConvertToValue, Either}; + +const FIRST_ASSET: u32 = 0; +const UNKNOWN_ASSET: u32 = 10; + +parameter_types! { + pub const LeftAsset: Either<(), u32> = Either::Left(()); + pub const RightAsset: Either = Either::Right(()); + pub const RightUnitAsset: Either<(), ()> = Either::Right(()); +} + +/// Implementation of the `fungible` traits through the [`ItemOf`] type, specifically for a +/// single asset class from [`T`] identified by [`FIRST_ASSET`]. +type FirstFungible = ItemOf, u64>; + +/// Implementation of the `fungible` traits through the [`ItemOf`] type, specifically for a +/// single asset class from [`T`] identified by [`UNKNOWN_ASSET`]. +type UnknownFungible = ItemOf, u64>; + +/// Implementation of `fungibles` traits using [`fungibles::UnionOf`] that exclusively utilizes +/// the [`FirstFungible`] from the left. +type LeftFungible = fungible::UnionOf, T, ConvertToValue, (), u64>; + +/// Implementation of `fungibles` traits using [`fungibles::UnionOf`] that exclusively utilizes +/// the [`LeftFungible`] from the right. +type RightFungible = + fungible::UnionOf, LeftFungible, ConvertToValue, (), u64>; + +/// Implementation of `fungibles` traits using [`fungibles::UnionOf`] that exclusively utilizes +/// the [`RightFungible`] from the left. +type LeftFungibles = fungibles::UnionOf, T, ConvertToValue, (), u64>; + +/// Implementation of `fungibles` traits using [`fungibles::UnionOf`] that exclusively utilizes +/// the [`LeftFungibles`] from the right. +/// +/// By using this type, we can navigate through each branch of [`fungible::UnionOf`], +/// [`fungibles::UnionOf`], and [`ItemOf`] to access the underlying `fungibles::*` +/// implementation provided by the pallet. +type First = fungibles::UnionOf, ConvertToValue, (), u64>; + +#[test] +fn deposit_from_set_types_works() { + new_test_ext().execute_with(|| { + let asset1 = 0; + let account1 = 1; + let account2 = 2; + + assert_ok!(>::create(asset1, account1, true, 1)); + assert_ok!(Assets::mint_into(asset1, &account1, 100)); + + assert_eq!(First::::total_issuance(()), 100); + assert_eq!(First::::total_issuance(()), Assets::total_issuance(asset1)); + + let imb = First::::deposit((), &account2, 50, Precision::Exact).unwrap(); + assert_eq!(First::::balance((), &account2), 50); + assert_eq!(First::::total_issuance(()), 100); + + assert_eq!(imb.peek(), 50); + + let (imb1, imb2) = imb.split(30); + assert_eq!(imb1.peek(), 30); + assert_eq!(imb2.peek(), 20); + + drop(imb2); + assert_eq!(First::::total_issuance(()), 120); + + assert!(First::::settle(&account1, imb1, Preservation::Preserve).is_ok()); + assert_eq!(First::::balance((), &account1), 70); + assert_eq!(First::::balance((), &account2), 50); + assert_eq!(First::::total_issuance(()), 120); + + assert_eq!(First::::total_issuance(()), Assets::total_issuance(asset1)); + }); +} + +#[test] +fn issue_from_set_types_works() { + new_test_ext().execute_with(|| { + let asset1: u32 = 0; + let account1: u64 = 1; + + assert_ok!(>::create(asset1, account1, true, 1)); + assert_ok!(Assets::mint_into(asset1, &account1, 100)); + + assert_eq!(First::::balance((), &account1), 100); + assert_eq!(First::::total_issuance(()), 100); + assert_eq!(First::::total_issuance(()), Assets::total_issuance(asset1)); + + let imb = First::::issue((), 100); + assert_eq!(First::::total_issuance(()), 200); + assert_eq!(imb.peek(), 100); + + let (imb1, imb2) = imb.split(30); + assert_eq!(imb1.peek(), 30); + assert_eq!(imb2.peek(), 70); + + drop(imb2); + assert_eq!(First::::total_issuance(()), 130); + + assert!(First::::resolve(&account1, imb1).is_ok()); + assert_eq!(First::::balance((), &account1), 130); + assert_eq!(First::::total_issuance(()), 130); + + assert_eq!(First::::total_issuance(()), Assets::total_issuance(asset1)); + }); +} + +#[test] +fn pair_from_set_types_works() { + new_test_ext().execute_with(|| { + let asset1: u32 = 0; + let account1: u64 = 1; + + assert_ok!(>::create(asset1, account1, true, 1)); + assert_ok!(Assets::mint_into(asset1, &account1, 100)); + + assert_eq!(First::::balance((), &account1), 100); + assert_eq!(First::::total_issuance(()), 100); + assert_eq!(First::::total_issuance(()), Assets::total_issuance(asset1)); + + let (debt, credit) = First::::pair((), 100); + assert_eq!(First::::total_issuance(()), 100); + assert_eq!(debt.peek(), 100); + assert_eq!(credit.peek(), 100); + + let (debt1, debt2) = debt.split(30); + assert_eq!(debt1.peek(), 30); + assert_eq!(debt2.peek(), 70); + + drop(debt2); + assert_eq!(First::::total_issuance(()), 170); + + assert!(First::::settle(&account1, debt1, Preservation::Preserve).is_ok()); + assert_eq!(First::::balance((), &account1), 70); + assert_eq!(First::::total_issuance(()), 170); + + let (credit1, credit2) = credit.split(40); + assert_eq!(credit1.peek(), 40); + assert_eq!(credit2.peek(), 60); + + drop(credit2); + assert_eq!(First::::total_issuance(()), 110); + + assert!(First::::resolve(&account1, credit1).is_ok()); + assert_eq!(First::::balance((), &account1), 110); + assert_eq!(First::::total_issuance(()), 110); + + assert_eq!(First::::total_issuance(()), Assets::total_issuance(asset1)); + }); +} + +#[test] +fn rescind_from_set_types_works() { + new_test_ext().execute_with(|| { + let asset1: u32 = 0; + let account1: u64 = 1; + + assert_ok!(>::create(asset1, account1, true, 1)); + assert_ok!(Assets::mint_into(asset1, &account1, 100)); + + assert_eq!(First::::total_issuance(()), 100); + assert_eq!(First::::total_issuance(()), Assets::total_issuance(asset1)); + + let imb = First::::rescind((), 20); + assert_eq!(First::::total_issuance(()), 80); + + assert_eq!(imb.peek(), 20); + + let (imb1, imb2) = imb.split(15); + assert_eq!(imb1.peek(), 15); + assert_eq!(imb2.peek(), 5); + + drop(imb2); + assert_eq!(First::::total_issuance(()), 85); + + assert!(First::::settle(&account1, imb1, Preservation::Preserve).is_ok()); + assert_eq!(First::::balance((), &account1), 85); + assert_eq!(First::::total_issuance(()), 85); + + assert_eq!(First::::total_issuance(()), Assets::total_issuance(asset1)); + }); +} + +#[test] +fn resolve_from_set_types_works() { + new_test_ext().execute_with(|| { + let asset1: u32 = 0; + let account1: u64 = 1; + let account2: u64 = 2; + let ed = 11; + + assert_ok!(>::create(asset1, account1, true, ed)); + assert_ok!(Assets::mint_into(asset1, &account1, 100)); + + assert_eq!(First::::balance((), &account1), 100); + assert_eq!(First::::total_issuance(()), 100); + assert_eq!(First::::total_issuance(()), Assets::total_issuance(asset1)); + + let imb = First::::issue((), 100); + assert_eq!(First::::total_issuance(()), 200); + assert_eq!(imb.peek(), 100); + + let (imb1, imb2) = imb.split(10); + assert_eq!(imb1.peek(), 10); + assert_eq!(imb2.peek(), 90); + assert_eq!(First::::total_issuance(()), 200); + + // ed requirements not met. + let imb1 = First::::resolve(&account2, imb1).unwrap_err(); + assert_eq!(imb1.peek(), 10); + drop(imb1); + assert_eq!(First::::total_issuance(()), 190); + assert_eq!(First::::balance((), &account2), 0); + + // resolve to new account `2`. + assert_ok!(First::::resolve(&account2, imb2)); + assert_eq!(First::::total_issuance(()), 190); + assert_eq!(First::::balance((), &account2), 90); + + assert_eq!(First::::total_issuance(()), Assets::total_issuance(asset1)); + }); +} + +#[test] +fn settle_from_set_types_works() { + new_test_ext().execute_with(|| { + let asset1: u32 = 0; + let account1: u64 = 1; + let account2: u64 = 2; + let ed = 11; + + assert_ok!(>::create(asset1, account1, true, ed)); + assert_ok!(Assets::mint_into(asset1, &account1, 100)); + assert_ok!(Assets::mint_into(asset1, &account2, 100)); + + assert_eq!(First::::balance((), &account2), 100); + assert_eq!(First::::total_issuance(()), 200); + assert_eq!(First::::total_issuance(()), Assets::total_issuance(asset1)); + + let imb = First::::rescind((), 100); + assert_eq!(First::::total_issuance(()), 100); + assert_eq!(imb.peek(), 100); + + let (imb1, imb2) = imb.split(10); + assert_eq!(imb1.peek(), 10); + assert_eq!(imb2.peek(), 90); + assert_eq!(First::::total_issuance(()), 100); + + // ed requirements not met. + let imb2 = First::::settle(&account2, imb2, Preservation::Preserve).unwrap_err(); + assert_eq!(imb2.peek(), 90); + drop(imb2); + assert_eq!(First::::total_issuance(()), 190); + assert_eq!(First::::balance((), &account2), 100); + + // settle to account `1`. + assert_ok!(First::::settle(&account2, imb1, Preservation::Preserve)); + assert_eq!(First::::total_issuance(()), 190); + assert_eq!(First::::balance((), &account2), 90); + + let imb = First::::rescind((), 85); + assert_eq!(First::::total_issuance(()), 105); + assert_eq!(imb.peek(), 85); + + // settle to account `1` and expect some dust. + let imb = First::::settle(&account2, imb, Preservation::Expendable).unwrap(); + assert_eq!(imb.peek(), 5); + assert_eq!(First::::total_issuance(()), 105); + assert_eq!(First::::balance((), &account2), 0); + + drop(imb); + assert_eq!(First::::total_issuance(()), 100); + + assert_eq!(First::::total_issuance(()), Assets::total_issuance(asset1)); + }); +} + +#[test] +fn withdraw_from_set_types_works() { + new_test_ext().execute_with(|| { + let asset1 = 0; + let account1 = 1; + let account2 = 2; + + assert_ok!(>::create(asset1, account1, true, 1)); + assert_ok!(Assets::mint_into(asset1, &account1, 100)); + assert_ok!(Assets::mint_into(asset1, &account2, 100)); + + assert_eq!(First::::total_issuance(()), 200); + assert_eq!(First::::total_issuance(()), Assets::total_issuance(asset1)); + + let imb = First::::withdraw( + (), + &account2, + 50, + Precision::Exact, + Preservation::Preserve, + Fortitude::Polite, + ) + .unwrap(); + assert_eq!(First::::balance((), &account2), 50); + assert_eq!(First::::total_issuance(()), 200); + + assert_eq!(imb.peek(), 50); + drop(imb); + assert_eq!(First::::total_issuance(()), 150); + assert_eq!(First::::balance((), &account2), 50); + + assert_eq!(First::::total_issuance(()), Assets::total_issuance(asset1)); + }); +} diff --git a/substrate/frame/balances/src/impl_fungible.rs b/substrate/frame/balances/src/impl_fungible.rs index fc8c2d71f25..6737727e0a2 100644 --- a/substrate/frame/balances/src/impl_fungible.rs +++ b/substrate/frame/balances/src/impl_fungible.rs @@ -17,10 +17,13 @@ //! Implementation of `fungible` traits for Balances pallet. use super::*; -use frame_support::traits::tokens::{ - Fortitude, - Preservation::{self, Preserve, Protect}, - Provenance::{self, Minted}, +use frame_support::traits::{ + tokens::{ + Fortitude, + Preservation::{self, Preserve, Protect}, + Provenance::{self, Minted}, + }, + AccountTouch, }; impl, I: 'static> fungible::Inspect for Pallet { @@ -356,3 +359,16 @@ impl, I: 'static> fungible::Balanced for Pallet } impl, I: 'static> fungible::BalancedHold for Pallet {} + +impl, I: 'static> AccountTouch<(), T::AccountId> for Pallet { + type Balance = T::Balance; + fn deposit_required(_: ()) -> Self::Balance { + Self::Balance::zero() + } + fn should_touch(_: (), _: &T::AccountId) -> bool { + false + } + fn touch(_: (), _: &T::AccountId, _: &T::AccountId) -> DispatchResult { + Ok(()) + } +} diff --git a/substrate/frame/support/src/traits/misc.rs b/substrate/frame/support/src/traits/misc.rs index 78032cc0a94..bf3053a3f8f 100644 --- a/substrate/frame/support/src/traits/misc.rs +++ b/substrate/frame/support/src/traits/misc.rs @@ -1170,17 +1170,26 @@ impl PreimageRecipient for () { fn unnote_preimage(_: &Hash) {} } -/// Trait for creating an asset account with a deposit taken from a designated depositor specified -/// by the client. +/// Trait for touching/creating an asset account with a deposit taken from a designated depositor +/// specified by the client. +/// +/// Ensures that transfers to the touched account will succeed without being denied by the account +/// creation requirements. For example, it is useful for the account creation of non-sufficient +/// assets when its system account may not have the free consumer reference required for it. If +/// there is no risk of failing to meet those requirements, the touch operation can be a no-op, as +/// is common for native assets. pub trait AccountTouch { /// The type for currency units of the deposit. type Balance; - /// The deposit amount of a native currency required for creating an account of the `asset`. + /// The deposit amount of a native currency required for touching an account of the `asset`. fn deposit_required(asset: AssetId) -> Self::Balance; + /// Check if an account for a given asset should be touched to meet the existence requirements. + fn should_touch(asset: AssetId, who: &AccountId) -> bool; + /// Create an account for `who` of the `asset` with a deposit taken from the `depositor`. - fn touch(asset: AssetId, who: AccountId, depositor: AccountId) -> DispatchResult; + fn touch(asset: AssetId, who: &AccountId, depositor: &AccountId) -> DispatchResult; } #[cfg(test)] diff --git a/substrate/frame/support/src/traits/tokens/fungible/imbalance.rs b/substrate/frame/support/src/traits/tokens/fungible/imbalance.rs index 995797bc8f6..0e251021970 100644 --- a/substrate/frame/support/src/traits/tokens/fungible/imbalance.rs +++ b/substrate/frame/support/src/traits/tokens/fungible/imbalance.rs @@ -20,8 +20,9 @@ use super::{super::Imbalance as ImbalanceT, Balanced, *}; use crate::traits::{ + fungibles, misc::{SameOrOther, TryDrop}, - tokens::Balance, + tokens::{AssetId, Balance}, }; use frame_support_procedural::{EqNoBound, PartialEqNoBound, RuntimeDebugNoBound}; use sp_runtime::traits::Zero; @@ -87,6 +88,11 @@ impl, OppositeOnDrop: HandleImbalance pub(crate) fn new(amount: B) -> Self { Self { amount, _phantom: PhantomData } } + + /// Forget the imbalance without invoking the on-drop handler. + pub(crate) fn forget(imbalance: Self) { + sp_std::mem::forget(imbalance); + } } impl, OppositeOnDrop: HandleImbalanceDrop> @@ -149,6 +155,27 @@ impl, OppositeOnDrop: HandleImbalance } } +/// Converts a `fungibles` `imbalance` instance to an instance of a `fungible` imbalance type. +/// +/// This function facilitates imbalance conversions within the implementations of +/// [`frame_support::traits::fungibles::UnionOf`], [`frame_support::traits::fungible::UnionOf`], and +/// [`frame_support::traits::fungible::ItemOf`] adapters. It is intended only for internal use +/// within the current crate. +pub(crate) fn from_fungibles< + A: AssetId, + B: Balance, + OnDropIn: fungibles::HandleImbalanceDrop, + OppositeIn: fungibles::HandleImbalanceDrop, + OnDropOut: HandleImbalanceDrop, + OppositeOut: HandleImbalanceDrop, +>( + imbalance: fungibles::Imbalance, +) -> Imbalance { + let new = Imbalance::new(imbalance.peek()); + fungibles::Imbalance::forget(imbalance); + new +} + /// Imbalance implying that the total_issuance value is less than the sum of all account balances. pub type Debt = Imbalance< >::Balance, diff --git a/substrate/frame/support/src/traits/tokens/fungible/item_of.rs b/substrate/frame/support/src/traits/tokens/fungible/item_of.rs index 636866ab93c..fe252c6b089 100644 --- a/substrate/frame/support/src/traits/tokens/fungible/item_of.rs +++ b/substrate/frame/support/src/traits/tokens/fungible/item_of.rs @@ -17,14 +17,16 @@ //! Adapter to use `fungibles::*` implementations as `fungible::*`. -use sp_core::Get; -use sp_runtime::{DispatchError, DispatchResult}; - use super::*; -use crate::traits::tokens::{ - fungibles, DepositConsequence, Fortitude, Imbalance as ImbalanceT, Precision, Preservation, - Provenance, Restriction, WithdrawConsequence, +use crate::traits::{ + fungible::imbalance, + tokens::{ + fungibles, DepositConsequence, Fortitude, Precision, Preservation, Provenance, Restriction, + WithdrawConsequence, + }, }; +use sp_core::Get; +use sp_runtime::{DispatchError, DispatchResult}; /// Convert a `fungibles` trait implementation into a `fungible` trait implementation by identifying /// a single item. @@ -381,35 +383,38 @@ impl< precision: Precision, ) -> Result, DispatchError> { >::deposit(A::get(), who, value, precision) - .map(|debt| Imbalance::new(debt.peek())) + .map(imbalance::from_fungibles) } fn issue(amount: Self::Balance) -> Credit { - Imbalance::new(>::issue(A::get(), amount).peek()) + let credit = >::issue(A::get(), amount); + imbalance::from_fungibles(credit) } fn pair(amount: Self::Balance) -> (Debt, Credit) { let (a, b) = >::pair(A::get(), amount); - (Imbalance::new(a.peek()), Imbalance::new(b.peek())) + (imbalance::from_fungibles(a), imbalance::from_fungibles(b)) } fn rescind(amount: Self::Balance) -> Debt { - Imbalance::new(>::rescind(A::get(), amount).peek()) + let debt = >::rescind(A::get(), amount); + imbalance::from_fungibles(debt) } fn resolve( who: &AccountId, credit: Credit, ) -> Result<(), Credit> { - let credit = fungibles::Imbalance::new(A::get(), credit.peek()); + let credit = fungibles::imbalance::from_fungible(credit, A::get()); >::resolve(who, credit) - .map_err(|credit| Imbalance::new(credit.peek())) + .map_err(imbalance::from_fungibles) } fn settle( who: &AccountId, debt: Debt, preservation: Preservation, ) -> Result, Debt> { - let debt = fungibles::Imbalance::new(A::get(), debt.peek()); - >::settle(who, debt, preservation) - .map(|credit| Imbalance::new(credit.peek())) - .map_err(|debt| Imbalance::new(debt.peek())) + let debt = fungibles::imbalance::from_fungible(debt, A::get()); + >::settle(who, debt, preservation).map_or_else( + |d| Err(imbalance::from_fungibles(d)), + |c| Ok(imbalance::from_fungibles(c)), + ) } fn withdraw( who: &AccountId, @@ -426,7 +431,7 @@ impl< preservation, force, ) - .map(|credit| Imbalance::new(credit.peek())) + .map(imbalance::from_fungibles) } } @@ -443,7 +448,7 @@ impl< ) -> (Credit, Self::Balance) { let (credit, amount) = >::slash(A::get(), reason, who, amount); - (Imbalance::new(credit.peek()), amount) + (imbalance::from_fungibles(credit), amount) } } diff --git a/substrate/frame/support/src/traits/tokens/fungible/mod.rs b/substrate/frame/support/src/traits/tokens/fungible/mod.rs index 61b75fd6563..ba4a2e5e21a 100644 --- a/substrate/frame/support/src/traits/tokens/fungible/mod.rs +++ b/substrate/frame/support/src/traits/tokens/fungible/mod.rs @@ -41,9 +41,10 @@ pub mod conformance_tests; pub mod freeze; pub mod hold; -mod imbalance; +pub(crate) mod imbalance; mod item_of; mod regular; +mod union_of; use codec::{Decode, Encode, MaxEncodedLen}; use frame_support_procedural::{CloneNoBound, EqNoBound, PartialEqNoBound, RuntimeDebugNoBound}; @@ -67,6 +68,7 @@ pub use regular::{ use sp_arithmetic::traits::Zero; use sp_core::Get; use sp_runtime::{traits::Convert, DispatchError}; +pub use union_of::{NativeFromLeft, NativeOrWithId, UnionOf}; use crate::{ ensure, diff --git a/substrate/frame/support/src/traits/tokens/fungible/union_of.rs b/substrate/frame/support/src/traits/tokens/fungible/union_of.rs new file mode 100644 index 00000000000..86505befc05 --- /dev/null +++ b/substrate/frame/support/src/traits/tokens/fungible/union_of.rs @@ -0,0 +1,924 @@ +// This file is part of Substrate. + +// Copyright (Criterion) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Types to combine some `fungible::*` and `fungibles::*` implementations into one union +//! `fungibles::*` implementation. + +use codec::{Decode, Encode, MaxEncodedLen}; +use frame_support::traits::{ + fungible::imbalance, + tokens::{ + fungible, fungibles, AssetId, DepositConsequence, Fortitude, Precision, Preservation, + Provenance, Restriction, WithdrawConsequence, + }, + AccountTouch, +}; +use scale_info::TypeInfo; +use sp_runtime::{ + traits::Convert, + DispatchError, DispatchResult, Either, + Either::{Left, Right}, + RuntimeDebug, +}; +use sp_std::cmp::Ordering; + +/// The `NativeOrWithId` enum classifies an asset as either `Native` to the current chain or as an +/// asset with a specific ID. +#[derive(Decode, Encode, Default, MaxEncodedLen, TypeInfo, Clone, RuntimeDebug, Eq)] +pub enum NativeOrWithId +where + AssetId: Ord, +{ + /// Represents the native asset of the current chain. + /// + /// E.g., DOT for the Polkadot Asset Hub. + #[default] + Native, + /// Represents an asset identified by its underlying `AssetId`. + WithId(AssetId), +} +impl From for NativeOrWithId { + fn from(asset: AssetId) -> Self { + Self::WithId(asset) + } +} +impl Ord for NativeOrWithId { + fn cmp(&self, other: &Self) -> Ordering { + match (self, other) { + (Self::Native, Self::Native) => Ordering::Equal, + (Self::Native, Self::WithId(_)) => Ordering::Less, + (Self::WithId(_), Self::Native) => Ordering::Greater, + (Self::WithId(id1), Self::WithId(id2)) => ::cmp(id1, id2), + } + } +} +impl PartialOrd for NativeOrWithId { + fn partial_cmp(&self, other: &Self) -> Option { + Some(::cmp(self, other)) + } +} +impl PartialEq for NativeOrWithId { + fn eq(&self, other: &Self) -> bool { + self.cmp(other) == Ordering::Equal + } +} + +/// Criterion for [`UnionOf`] where a set for [`NativeOrWithId::Native`] asset located from the left +/// and for [`NativeOrWithId::WithId`] from the right. +pub struct NativeFromLeft; +impl Convert, Either<(), AssetId>> for NativeFromLeft { + fn convert(asset: NativeOrWithId) -> Either<(), AssetId> { + match asset { + NativeOrWithId::Native => Either::Left(()), + NativeOrWithId::WithId(id) => Either::Right(id), + } + } +} + +/// Type to combine some `fungible::*` and `fungibles::*` implementations into one union +/// `fungibles::*` implementation. +/// +/// ### Parameters: +/// - `Left` is `fungible::*` implementation that is incorporated into the resulting union. +/// - `Right` is `fungibles::*` implementation that is incorporated into the resulting union. +/// - `Criterion` determines whether the `AssetKind` belongs to the `Left` or `Right` set. +/// - `AssetKind` is a superset type encompassing asset kinds from `Left` and `Right` sets. +/// - `AccountId` is an account identifier type. +pub struct UnionOf( + sp_std::marker::PhantomData<(Left, Right, Criterion, AssetKind, AccountId)>, +); + +impl< + Left: fungible::Inspect, + Right: fungibles::Inspect, + Criterion: Convert>, + AssetKind: AssetId, + AccountId, + > fungibles::Inspect for UnionOf +{ + type AssetId = AssetKind; + type Balance = Left::Balance; + + fn total_issuance(asset: Self::AssetId) -> Self::Balance { + match Criterion::convert(asset) { + Left(()) => >::total_issuance(), + Right(a) => >::total_issuance(a), + } + } + fn active_issuance(asset: Self::AssetId) -> Self::Balance { + match Criterion::convert(asset) { + Left(()) => >::active_issuance(), + Right(a) => >::active_issuance(a), + } + } + fn minimum_balance(asset: Self::AssetId) -> Self::Balance { + match Criterion::convert(asset) { + Left(()) => >::minimum_balance(), + Right(a) => >::minimum_balance(a), + } + } + fn balance(asset: Self::AssetId, who: &AccountId) -> Self::Balance { + match Criterion::convert(asset) { + Left(()) => >::balance(who), + Right(a) => >::balance(a, who), + } + } + fn total_balance(asset: Self::AssetId, who: &AccountId) -> Self::Balance { + match Criterion::convert(asset) { + Left(()) => >::total_balance(who), + Right(a) => >::total_balance(a, who), + } + } + fn reducible_balance( + asset: Self::AssetId, + who: &AccountId, + preservation: Preservation, + force: Fortitude, + ) -> Self::Balance { + match Criterion::convert(asset) { + Left(()) => + >::reducible_balance(who, preservation, force), + Right(a) => >::reducible_balance( + a, + who, + preservation, + force, + ), + } + } + fn can_deposit( + asset: Self::AssetId, + who: &AccountId, + amount: Self::Balance, + provenance: Provenance, + ) -> DepositConsequence { + match Criterion::convert(asset) { + Left(()) => + >::can_deposit(who, amount, provenance), + Right(a) => + >::can_deposit(a, who, amount, provenance), + } + } + fn can_withdraw( + asset: Self::AssetId, + who: &AccountId, + amount: Self::Balance, + ) -> WithdrawConsequence { + match Criterion::convert(asset) { + Left(()) => >::can_withdraw(who, amount), + Right(a) => >::can_withdraw(a, who, amount), + } + } + fn asset_exists(asset: Self::AssetId) -> bool { + match Criterion::convert(asset) { + Left(()) => true, + Right(a) => >::asset_exists(a), + } + } +} + +impl< + Left: fungible::InspectHold, + Right: fungibles::InspectHold, + Criterion: Convert>, + AssetKind: AssetId, + AccountId, + > fungibles::InspectHold for UnionOf +{ + type Reason = Left::Reason; + + fn reducible_total_balance_on_hold( + asset: Self::AssetId, + who: &AccountId, + force: Fortitude, + ) -> Self::Balance { + match Criterion::convert(asset) { + Left(()) => + >::reducible_total_balance_on_hold( + who, force, + ), + Right(a) => + >::reducible_total_balance_on_hold( + a, who, force, + ), + } + } + fn hold_available(asset: Self::AssetId, reason: &Self::Reason, who: &AccountId) -> bool { + match Criterion::convert(asset) { + Left(()) => >::hold_available(reason, who), + Right(a) => + >::hold_available(a, reason, who), + } + } + fn total_balance_on_hold(asset: Self::AssetId, who: &AccountId) -> Self::Balance { + match Criterion::convert(asset) { + Left(()) => >::total_balance_on_hold(who), + Right(a) => >::total_balance_on_hold(a, who), + } + } + fn balance_on_hold( + asset: Self::AssetId, + reason: &Self::Reason, + who: &AccountId, + ) -> Self::Balance { + match Criterion::convert(asset) { + Left(()) => >::balance_on_hold(reason, who), + Right(a) => + >::balance_on_hold(a, reason, who), + } + } + fn can_hold( + asset: Self::AssetId, + reason: &Self::Reason, + who: &AccountId, + amount: Self::Balance, + ) -> bool { + match Criterion::convert(asset) { + Left(()) => >::can_hold(reason, who, amount), + Right(a) => + >::can_hold(a, reason, who, amount), + } + } +} + +impl< + Left: fungible::InspectFreeze, + Right: fungibles::InspectFreeze, + Criterion: Convert>, + AssetKind: AssetId, + AccountId, + > fungibles::InspectFreeze for UnionOf +{ + type Id = Left::Id; + fn balance_frozen(asset: Self::AssetId, id: &Self::Id, who: &AccountId) -> Self::Balance { + match Criterion::convert(asset) { + Left(()) => >::balance_frozen(id, who), + Right(a) => >::balance_frozen(a, id, who), + } + } + fn balance_freezable(asset: Self::AssetId, who: &AccountId) -> Self::Balance { + match Criterion::convert(asset) { + Left(()) => >::balance_freezable(who), + Right(a) => >::balance_freezable(a, who), + } + } + fn can_freeze(asset: Self::AssetId, id: &Self::Id, who: &AccountId) -> bool { + match Criterion::convert(asset) { + Left(()) => >::can_freeze(id, who), + Right(a) => >::can_freeze(a, id, who), + } + } +} + +impl< + Left: fungible::Unbalanced, + Right: fungibles::Unbalanced, + Criterion: Convert>, + AssetKind: AssetId, + AccountId, + > fungibles::Unbalanced for UnionOf +{ + fn handle_dust(dust: fungibles::Dust) + where + Self: Sized, + { + match Criterion::convert(dust.0) { + Left(()) => + >::handle_dust(fungible::Dust(dust.1)), + Right(a) => + >::handle_dust(fungibles::Dust(a, dust.1)), + } + } + fn write_balance( + asset: Self::AssetId, + who: &AccountId, + amount: Self::Balance, + ) -> Result, DispatchError> { + match Criterion::convert(asset) { + Left(()) => >::write_balance(who, amount), + Right(a) => >::write_balance(a, who, amount), + } + } + fn set_total_issuance(asset: Self::AssetId, amount: Self::Balance) -> () { + match Criterion::convert(asset) { + Left(()) => >::set_total_issuance(amount), + Right(a) => >::set_total_issuance(a, amount), + } + } + fn decrease_balance( + asset: Self::AssetId, + who: &AccountId, + amount: Self::Balance, + precision: Precision, + preservation: Preservation, + force: Fortitude, + ) -> Result { + match Criterion::convert(asset) { + Left(()) => >::decrease_balance( + who, + amount, + precision, + preservation, + force, + ), + Right(a) => >::decrease_balance( + a, + who, + amount, + precision, + preservation, + force, + ), + } + } + fn increase_balance( + asset: Self::AssetId, + who: &AccountId, + amount: Self::Balance, + precision: Precision, + ) -> Result { + match Criterion::convert(asset) { + Left(()) => + >::increase_balance(who, amount, precision), + Right(a) => >::increase_balance( + a, who, amount, precision, + ), + } + } +} + +impl< + Left: fungible::UnbalancedHold, + Right: fungibles::UnbalancedHold, + Criterion: Convert>, + AssetKind: AssetId, + AccountId, + > fungibles::UnbalancedHold for UnionOf +{ + fn set_balance_on_hold( + asset: Self::AssetId, + reason: &Self::Reason, + who: &AccountId, + amount: Self::Balance, + ) -> DispatchResult { + match Criterion::convert(asset) { + Left(()) => >::set_balance_on_hold( + reason, who, amount, + ), + Right(a) => >::set_balance_on_hold( + a, reason, who, amount, + ), + } + } + fn decrease_balance_on_hold( + asset: Self::AssetId, + reason: &Self::Reason, + who: &AccountId, + amount: Self::Balance, + precision: Precision, + ) -> Result { + match Criterion::convert(asset) { + Left(()) => >::decrease_balance_on_hold( + reason, who, amount, precision, + ), + Right(a) => >::decrease_balance_on_hold( + a, reason, who, amount, precision, + ), + } + } + fn increase_balance_on_hold( + asset: Self::AssetId, + reason: &Self::Reason, + who: &AccountId, + amount: Self::Balance, + precision: Precision, + ) -> Result { + match Criterion::convert(asset) { + Left(()) => >::increase_balance_on_hold( + reason, who, amount, precision, + ), + Right(a) => >::increase_balance_on_hold( + a, reason, who, amount, precision, + ), + } + } +} + +impl< + Left: fungible::Mutate, + Right: fungibles::Mutate, + Criterion: Convert>, + AssetKind: AssetId, + AccountId: Eq, + > fungibles::Mutate for UnionOf +{ + fn mint_into( + asset: Self::AssetId, + who: &AccountId, + amount: Self::Balance, + ) -> Result { + match Criterion::convert(asset) { + Left(()) => >::mint_into(who, amount), + Right(a) => >::mint_into(a, who, amount), + } + } + fn burn_from( + asset: Self::AssetId, + who: &AccountId, + amount: Self::Balance, + precision: Precision, + force: Fortitude, + ) -> Result { + match Criterion::convert(asset) { + Left(()) => + >::burn_from(who, amount, precision, force), + Right(a) => + >::burn_from(a, who, amount, precision, force), + } + } + fn shelve( + asset: Self::AssetId, + who: &AccountId, + amount: Self::Balance, + ) -> Result { + match Criterion::convert(asset) { + Left(()) => >::shelve(who, amount), + Right(a) => >::shelve(a, who, amount), + } + } + fn restore( + asset: Self::AssetId, + who: &AccountId, + amount: Self::Balance, + ) -> Result { + match Criterion::convert(asset) { + Left(()) => >::restore(who, amount), + Right(a) => >::restore(a, who, amount), + } + } + fn transfer( + asset: Self::AssetId, + source: &AccountId, + dest: &AccountId, + amount: Self::Balance, + preservation: Preservation, + ) -> Result { + match Criterion::convert(asset) { + Left(()) => + >::transfer(source, dest, amount, preservation), + Right(a) => >::transfer( + a, + source, + dest, + amount, + preservation, + ), + } + } + + fn set_balance(asset: Self::AssetId, who: &AccountId, amount: Self::Balance) -> Self::Balance { + match Criterion::convert(asset) { + Left(()) => >::set_balance(who, amount), + Right(a) => >::set_balance(a, who, amount), + } + } +} + +impl< + Left: fungible::MutateHold, + Right: fungibles::MutateHold, + Criterion: Convert>, + AssetKind: AssetId, + AccountId, + > fungibles::MutateHold for UnionOf +{ + fn hold( + asset: Self::AssetId, + reason: &Self::Reason, + who: &AccountId, + amount: Self::Balance, + ) -> DispatchResult { + match Criterion::convert(asset) { + Left(()) => >::hold(reason, who, amount), + Right(a) => >::hold(a, reason, who, amount), + } + } + fn release( + asset: Self::AssetId, + reason: &Self::Reason, + who: &AccountId, + amount: Self::Balance, + precision: Precision, + ) -> Result { + match Criterion::convert(asset) { + Left(()) => + >::release(reason, who, amount, precision), + Right(a) => >::release( + a, reason, who, amount, precision, + ), + } + } + fn burn_held( + asset: Self::AssetId, + reason: &Self::Reason, + who: &AccountId, + amount: Self::Balance, + precision: Precision, + force: Fortitude, + ) -> Result { + match Criterion::convert(asset) { + Left(()) => >::burn_held( + reason, who, amount, precision, force, + ), + Right(a) => >::burn_held( + a, reason, who, amount, precision, force, + ), + } + } + fn transfer_on_hold( + asset: Self::AssetId, + reason: &Self::Reason, + source: &AccountId, + dest: &AccountId, + amount: Self::Balance, + precision: Precision, + mode: Restriction, + force: Fortitude, + ) -> Result { + match Criterion::convert(asset) { + Left(()) => >::transfer_on_hold( + reason, source, dest, amount, precision, mode, force, + ), + Right(a) => >::transfer_on_hold( + a, reason, source, dest, amount, precision, mode, force, + ), + } + } + fn transfer_and_hold( + asset: Self::AssetId, + reason: &Self::Reason, + source: &AccountId, + dest: &AccountId, + amount: Self::Balance, + precision: Precision, + preservation: Preservation, + force: Fortitude, + ) -> Result { + match Criterion::convert(asset) { + Left(()) => >::transfer_and_hold( + reason, + source, + dest, + amount, + precision, + preservation, + force, + ), + Right(a) => >::transfer_and_hold( + a, + reason, + source, + dest, + amount, + precision, + preservation, + force, + ), + } + } +} + +impl< + Left: fungible::MutateFreeze, + Right: fungibles::MutateFreeze, + Criterion: Convert>, + AssetKind: AssetId, + AccountId, + > fungibles::MutateFreeze for UnionOf +{ + fn set_freeze( + asset: Self::AssetId, + id: &Self::Id, + who: &AccountId, + amount: Self::Balance, + ) -> DispatchResult { + match Criterion::convert(asset) { + Left(()) => >::set_freeze(id, who, amount), + Right(a) => + >::set_freeze(a, id, who, amount), + } + } + fn extend_freeze( + asset: Self::AssetId, + id: &Self::Id, + who: &AccountId, + amount: Self::Balance, + ) -> DispatchResult { + match Criterion::convert(asset) { + Left(()) => >::extend_freeze(id, who, amount), + Right(a) => + >::extend_freeze(a, id, who, amount), + } + } + fn thaw(asset: Self::AssetId, id: &Self::Id, who: &AccountId) -> DispatchResult { + match Criterion::convert(asset) { + Left(()) => >::thaw(id, who), + Right(a) => >::thaw(a, id, who), + } + } +} + +pub struct ConvertImbalanceDropHandler< + Left, + Right, + Criterion, + AssetKind, + Balance, + AssetId, + AccountId, +>(sp_std::marker::PhantomData<(Left, Right, Criterion, AssetKind, Balance, AssetId, AccountId)>); + +impl< + Left: fungible::HandleImbalanceDrop, + Right: fungibles::HandleImbalanceDrop, + Criterion: Convert>, + AssetKind, + Balance, + AssetId, + AccountId, + > fungibles::HandleImbalanceDrop + for ConvertImbalanceDropHandler +{ + fn handle(asset: AssetKind, amount: Balance) { + match Criterion::convert(asset) { + Left(()) => Left::handle(amount), + Right(a) => Right::handle(a, amount), + } + } +} + +impl< + Left: fungible::Balanced, + Right: fungibles::Balanced, + Criterion: Convert>, + AssetKind: AssetId, + AccountId, + > fungibles::Balanced for UnionOf +{ + type OnDropDebt = ConvertImbalanceDropHandler< + Left::OnDropDebt, + Right::OnDropDebt, + Criterion, + AssetKind, + Left::Balance, + Right::AssetId, + AccountId, + >; + type OnDropCredit = ConvertImbalanceDropHandler< + Left::OnDropCredit, + Right::OnDropCredit, + Criterion, + AssetKind, + Left::Balance, + Right::AssetId, + AccountId, + >; + + fn deposit( + asset: Self::AssetId, + who: &AccountId, + value: Self::Balance, + precision: Precision, + ) -> Result, DispatchError> { + match Criterion::convert(asset.clone()) { + Left(()) => >::deposit(who, value, precision) + .map(|d| fungibles::imbalance::from_fungible(d, asset)), + Right(a) => + >::deposit(a, who, value, precision) + .map(|d| fungibles::imbalance::from_fungibles(d, asset)), + } + } + fn issue(asset: Self::AssetId, amount: Self::Balance) -> fungibles::Credit { + match Criterion::convert(asset.clone()) { + Left(()) => { + let credit = >::issue(amount); + fungibles::imbalance::from_fungible(credit, asset) + }, + Right(a) => { + let credit = >::issue(a, amount); + fungibles::imbalance::from_fungibles(credit, asset) + }, + } + } + fn pair( + asset: Self::AssetId, + amount: Self::Balance, + ) -> (fungibles::Debt, fungibles::Credit) { + match Criterion::convert(asset.clone()) { + Left(()) => { + let (a, b) = >::pair(amount); + ( + fungibles::imbalance::from_fungible(a, asset.clone()), + fungibles::imbalance::from_fungible(b, asset), + ) + }, + Right(a) => { + let (a, b) = >::pair(a, amount); + ( + fungibles::imbalance::from_fungibles(a, asset.clone()), + fungibles::imbalance::from_fungibles(b, asset), + ) + }, + } + } + fn rescind(asset: Self::AssetId, amount: Self::Balance) -> fungibles::Debt { + match Criterion::convert(asset.clone()) { + Left(()) => { + let debt = >::rescind(amount); + fungibles::imbalance::from_fungible(debt, asset) + }, + Right(a) => { + let debt = >::rescind(a, amount); + fungibles::imbalance::from_fungibles(debt, asset) + }, + } + } + fn resolve( + who: &AccountId, + credit: fungibles::Credit, + ) -> Result<(), fungibles::Credit> { + let asset = credit.asset(); + match Criterion::convert(asset.clone()) { + Left(()) => { + let credit = imbalance::from_fungibles(credit); + >::resolve(who, credit) + .map_err(|credit| fungibles::imbalance::from_fungible(credit, asset)) + }, + Right(a) => { + let credit = fungibles::imbalance::from_fungibles(credit, a); + >::resolve(who, credit) + .map_err(|credit| fungibles::imbalance::from_fungibles(credit, asset)) + }, + } + } + fn settle( + who: &AccountId, + debt: fungibles::Debt, + preservation: Preservation, + ) -> Result, fungibles::Debt> { + let asset = debt.asset(); + match Criterion::convert(asset.clone()) { + Left(()) => { + let debt = imbalance::from_fungibles(debt); + match >::settle(who, debt, preservation) { + Ok(c) => Ok(fungibles::imbalance::from_fungible(c, asset)), + Err(d) => Err(fungibles::imbalance::from_fungible(d, asset)), + } + }, + Right(a) => { + let debt = fungibles::imbalance::from_fungibles(debt, a); + match >::settle(who, debt, preservation) { + Ok(c) => Ok(fungibles::imbalance::from_fungibles(c, asset)), + Err(d) => Err(fungibles::imbalance::from_fungibles(d, asset)), + } + }, + } + } + fn withdraw( + asset: Self::AssetId, + who: &AccountId, + value: Self::Balance, + precision: Precision, + preservation: Preservation, + force: Fortitude, + ) -> Result, DispatchError> { + match Criterion::convert(asset.clone()) { + Left(()) => >::withdraw( + who, + value, + precision, + preservation, + force, + ) + .map(|c| fungibles::imbalance::from_fungible(c, asset)), + Right(a) => >::withdraw( + a, + who, + value, + precision, + preservation, + force, + ) + .map(|c| fungibles::imbalance::from_fungibles(c, asset)), + } + } +} + +impl< + Left: fungible::BalancedHold, + Right: fungibles::BalancedHold, + Criterion: Convert>, + AssetKind: AssetId, + AccountId, + > fungibles::BalancedHold for UnionOf +{ + fn slash( + asset: Self::AssetId, + reason: &Self::Reason, + who: &AccountId, + amount: Self::Balance, + ) -> (fungibles::Credit, Self::Balance) { + match Criterion::convert(asset.clone()) { + Left(()) => { + let (credit, amount) = + >::slash(reason, who, amount); + (fungibles::imbalance::from_fungible(credit, asset), amount) + }, + Right(a) => { + let (credit, amount) = + >::slash(a, reason, who, amount); + (fungibles::imbalance::from_fungibles(credit, asset), amount) + }, + } + } +} + +impl< + Left: fungible::Inspect, + Right: fungibles::Inspect + fungibles::Create, + Criterion: Convert>, + AssetKind: AssetId, + AccountId, + > fungibles::Create for UnionOf +{ + fn create( + asset: AssetKind, + admin: AccountId, + is_sufficient: bool, + min_balance: Self::Balance, + ) -> DispatchResult { + match Criterion::convert(asset) { + // no-op for `Left` since `Create` trait is not defined within `fungible::*`. + Left(()) => Ok(()), + Right(a) => >::create( + a, + admin, + is_sufficient, + min_balance, + ), + } + } +} + +impl< + Left: fungible::Inspect + + AccountTouch<(), AccountId, Balance = >::Balance>, + Right: fungibles::Inspect + + AccountTouch< + Right::AssetId, + AccountId, + Balance = >::Balance, + >, + Criterion: Convert>, + AssetKind: AssetId, + AccountId, + > AccountTouch for UnionOf +{ + type Balance = >::Balance; + + fn deposit_required(asset: AssetKind) -> Self::Balance { + match Criterion::convert(asset) { + Left(()) => >::deposit_required(()), + Right(a) => >::deposit_required(a), + } + } + + fn should_touch(asset: AssetKind, who: &AccountId) -> bool { + match Criterion::convert(asset) { + Left(()) => >::should_touch((), who), + Right(a) => >::should_touch(a, who), + } + } + + fn touch(asset: AssetKind, who: &AccountId, depositor: &AccountId) -> DispatchResult { + match Criterion::convert(asset) { + Left(()) => >::touch((), who, depositor), + Right(a) => + >::touch(a, who, depositor), + } + } +} diff --git a/substrate/frame/support/src/traits/tokens/fungibles/imbalance.rs b/substrate/frame/support/src/traits/tokens/fungibles/imbalance.rs index 7c0d7721a2e..54c1e900b6e 100644 --- a/substrate/frame/support/src/traits/tokens/fungibles/imbalance.rs +++ b/substrate/frame/support/src/traits/tokens/fungibles/imbalance.rs @@ -20,8 +20,9 @@ use super::*; use crate::traits::{ + fungible, misc::{SameOrOther, TryDrop}, - tokens::{AssetId, Balance}, + tokens::{imbalance::Imbalance as ImbalanceT, AssetId, Balance}, }; use frame_support_procedural::{EqNoBound, PartialEqNoBound, RuntimeDebugNoBound}; use sp_runtime::traits::Zero; @@ -93,6 +94,11 @@ impl< Self { asset, amount, _phantom: PhantomData } } + /// Forget the imbalance without invoking the on-drop handler. + pub(crate) fn forget(imbalance: Self) { + sp_std::mem::forget(imbalance); + } + pub fn drop_zero(self) -> Result<(), Self> { if self.amount.is_zero() { sp_std::mem::forget(self); @@ -168,6 +174,52 @@ impl< } } +/// Converts a `fungible` `imbalance` instance to an instance of a `fungibles` imbalance type using +/// a specified `asset`. +/// +/// This function facilitates imbalance conversions within the implementations of +/// [`frame_support::traits::fungibles::UnionOf`], [`frame_support::traits::fungible::UnionOf`], and +/// [`frame_support::traits::fungible::ItemOf`] adapters. It is intended only for internal use +/// within the current crate. +pub(crate) fn from_fungible< + A: AssetId, + B: Balance, + OnDropIn: fungible::HandleImbalanceDrop, + OppositeIn: fungible::HandleImbalanceDrop, + OnDropOut: HandleImbalanceDrop, + OppositeOut: HandleImbalanceDrop, +>( + imbalance: fungible::Imbalance, + asset: A, +) -> Imbalance { + let new = Imbalance::new(asset, imbalance.peek()); + fungible::Imbalance::forget(imbalance); + new +} + +/// Converts a `fungibles` `imbalance` instance of one type to another using a specified `asset`. +/// +/// This function facilitates imbalance conversions within the implementations of +/// [`frame_support::traits::fungibles::UnionOf`], [`frame_support::traits::fungible::UnionOf`], and +/// [`frame_support::traits::fungible::ItemOf`] adapters. It is intended only for internal use +/// within the current crate. +pub(crate) fn from_fungibles< + A: AssetId, + B: Balance, + OnDropIn: HandleImbalanceDrop, + OppositeIn: HandleImbalanceDrop, + AssetOut: AssetId, + OnDropOut: HandleImbalanceDrop, + OppositeOut: HandleImbalanceDrop, +>( + imbalance: Imbalance, + asset: AssetOut, +) -> Imbalance { + let new = Imbalance::new(asset, imbalance.peek()); + Imbalance::forget(imbalance); + new +} + /// Imbalance implying that the total_issuance value is less than the sum of all account balances. pub type Debt = Imbalance< >::AssetId, diff --git a/substrate/frame/support/src/traits/tokens/fungibles/mod.rs b/substrate/frame/support/src/traits/tokens/fungibles/mod.rs index 4fd6ef43a15..1db0706ba4f 100644 --- a/substrate/frame/support/src/traits/tokens/fungibles/mod.rs +++ b/substrate/frame/support/src/traits/tokens/fungibles/mod.rs @@ -21,11 +21,12 @@ pub mod approvals; mod enumerable; pub mod freeze; pub mod hold; -mod imbalance; +pub(crate) mod imbalance; mod lifetime; pub mod metadata; mod regular; pub mod roles; +mod union_of; pub use enumerable::Inspect as InspectEnumerable; pub use freeze::{Inspect as InspectFreeze, Mutate as MutateFreeze}; @@ -38,3 +39,4 @@ pub use lifetime::{Create, Destroy}; pub use regular::{ Balanced, DecreaseIssuance, Dust, IncreaseIssuance, Inspect, Mutate, Unbalanced, }; +pub use union_of::UnionOf; diff --git a/substrate/frame/support/src/traits/tokens/fungibles/union_of.rs b/substrate/frame/support/src/traits/tokens/fungibles/union_of.rs new file mode 100644 index 00000000000..3619db3a37b --- /dev/null +++ b/substrate/frame/support/src/traits/tokens/fungibles/union_of.rs @@ -0,0 +1,897 @@ +// This file is part of Substrate. + +// Copyright (Criterion) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Type to combine two `fungibles::*` implementations into one union `fungibles::*` implementation. + +use frame_support::traits::{ + tokens::{ + fungibles, fungibles::imbalance, AssetId, DepositConsequence, Fortitude, Precision, + Preservation, Provenance, Restriction, WithdrawConsequence, + }, + AccountTouch, +}; +use sp_runtime::{ + traits::Convert, + DispatchError, DispatchResult, Either, + Either::{Left, Right}, +}; + +/// Type to combine two `fungibles::*` implementations into one union `fungibles::*` implementation. +/// +/// ### Parameters: +/// - `Left` is `fungibles::*` implementation that is incorporated into the resulting union. +/// - `Right` is `fungibles::*` implementation that is incorporated into the resulting union. +/// - `Criterion` determines whether the `AssetKind` belongs to the `Left` or `Right` set. +/// - `AssetKind` is a superset type encompassing asset kinds from `Left` and `Right` sets. +/// - `AccountId` is an account identifier type. +pub struct UnionOf( + sp_std::marker::PhantomData<(Left, Right, Criterion, AssetKind, AccountId)>, +); + +impl< + Left: fungibles::Inspect, + Right: fungibles::Inspect, + Criterion: Convert>, + AssetKind: AssetId, + AccountId, + > fungibles::Inspect for UnionOf +{ + type AssetId = AssetKind; + type Balance = Left::Balance; + + fn total_issuance(asset: Self::AssetId) -> Self::Balance { + match Criterion::convert(asset) { + Left(a) => >::total_issuance(a), + Right(a) => >::total_issuance(a), + } + } + fn active_issuance(asset: Self::AssetId) -> Self::Balance { + match Criterion::convert(asset) { + Left(a) => >::active_issuance(a), + Right(a) => >::active_issuance(a), + } + } + fn minimum_balance(asset: Self::AssetId) -> Self::Balance { + match Criterion::convert(asset) { + Left(a) => >::minimum_balance(a), + Right(a) => >::minimum_balance(a), + } + } + fn balance(asset: Self::AssetId, who: &AccountId) -> Self::Balance { + match Criterion::convert(asset) { + Left(a) => >::balance(a, who), + Right(a) => >::balance(a, who), + } + } + fn total_balance(asset: Self::AssetId, who: &AccountId) -> Self::Balance { + match Criterion::convert(asset) { + Left(a) => >::total_balance(a, who), + Right(a) => >::total_balance(a, who), + } + } + fn reducible_balance( + asset: Self::AssetId, + who: &AccountId, + preservation: Preservation, + force: Fortitude, + ) -> Self::Balance { + match Criterion::convert(asset) { + Left(a) => >::reducible_balance( + a, + who, + preservation, + force, + ), + Right(a) => >::reducible_balance( + a, + who, + preservation, + force, + ), + } + } + fn can_deposit( + asset: Self::AssetId, + who: &AccountId, + amount: Self::Balance, + provenance: Provenance, + ) -> DepositConsequence { + match Criterion::convert(asset) { + Left(a) => + >::can_deposit(a, who, amount, provenance), + Right(a) => + >::can_deposit(a, who, amount, provenance), + } + } + fn can_withdraw( + asset: Self::AssetId, + who: &AccountId, + amount: Self::Balance, + ) -> WithdrawConsequence { + match Criterion::convert(asset) { + Left(a) => >::can_withdraw(a, who, amount), + Right(a) => >::can_withdraw(a, who, amount), + } + } + fn asset_exists(asset: Self::AssetId) -> bool { + match Criterion::convert(asset) { + Left(a) => >::asset_exists(a), + Right(a) => >::asset_exists(a), + } + } +} + +impl< + Left: fungibles::InspectHold, + Right: fungibles::InspectHold, + Criterion: Convert>, + AssetKind: AssetId, + AccountId, + > fungibles::InspectHold for UnionOf +{ + type Reason = Left::Reason; + + fn reducible_total_balance_on_hold( + asset: Self::AssetId, + who: &AccountId, + force: Fortitude, + ) -> Self::Balance { + match Criterion::convert(asset) { + Left(a) => + >::reducible_total_balance_on_hold( + a, who, force, + ), + Right(a) => + >::reducible_total_balance_on_hold( + a, who, force, + ), + } + } + fn hold_available(asset: Self::AssetId, reason: &Self::Reason, who: &AccountId) -> bool { + match Criterion::convert(asset) { + Left(a) => >::hold_available(a, reason, who), + Right(a) => + >::hold_available(a, reason, who), + } + } + fn total_balance_on_hold(asset: Self::AssetId, who: &AccountId) -> Self::Balance { + match Criterion::convert(asset) { + Left(a) => >::total_balance_on_hold(a, who), + Right(a) => >::total_balance_on_hold(a, who), + } + } + fn balance_on_hold( + asset: Self::AssetId, + reason: &Self::Reason, + who: &AccountId, + ) -> Self::Balance { + match Criterion::convert(asset) { + Left(a) => >::balance_on_hold(a, reason, who), + Right(a) => + >::balance_on_hold(a, reason, who), + } + } + fn can_hold( + asset: Self::AssetId, + reason: &Self::Reason, + who: &AccountId, + amount: Self::Balance, + ) -> bool { + match Criterion::convert(asset) { + Left(a) => + >::can_hold(a, reason, who, amount), + Right(a) => + >::can_hold(a, reason, who, amount), + } + } +} + +impl< + Left: fungibles::InspectFreeze, + Right: fungibles::InspectFreeze, + Criterion: Convert>, + AssetKind: AssetId, + AccountId, + > fungibles::InspectFreeze for UnionOf +{ + type Id = Left::Id; + fn balance_frozen(asset: Self::AssetId, id: &Self::Id, who: &AccountId) -> Self::Balance { + match Criterion::convert(asset) { + Left(a) => >::balance_frozen(a, id, who), + Right(a) => >::balance_frozen(a, id, who), + } + } + fn balance_freezable(asset: Self::AssetId, who: &AccountId) -> Self::Balance { + match Criterion::convert(asset) { + Left(a) => >::balance_freezable(a, who), + Right(a) => >::balance_freezable(a, who), + } + } + fn can_freeze(asset: Self::AssetId, id: &Self::Id, who: &AccountId) -> bool { + match Criterion::convert(asset) { + Left(a) => >::can_freeze(a, id, who), + Right(a) => >::can_freeze(a, id, who), + } + } +} + +impl< + Left: fungibles::Unbalanced, + Right: fungibles::Unbalanced, + Criterion: Convert>, + AssetKind: AssetId, + AccountId, + > fungibles::Unbalanced for UnionOf +{ + fn handle_dust(dust: fungibles::Dust) + where + Self: Sized, + { + match Criterion::convert(dust.0) { + Left(a) => + >::handle_dust(fungibles::Dust(a, dust.1)), + Right(a) => + >::handle_dust(fungibles::Dust(a, dust.1)), + } + } + fn write_balance( + asset: Self::AssetId, + who: &AccountId, + amount: Self::Balance, + ) -> Result, DispatchError> { + match Criterion::convert(asset) { + Left(a) => >::write_balance(a, who, amount), + Right(a) => >::write_balance(a, who, amount), + } + } + fn set_total_issuance(asset: Self::AssetId, amount: Self::Balance) -> () { + match Criterion::convert(asset) { + Left(a) => >::set_total_issuance(a, amount), + Right(a) => >::set_total_issuance(a, amount), + } + } + fn decrease_balance( + asset: Self::AssetId, + who: &AccountId, + amount: Self::Balance, + precision: Precision, + preservation: Preservation, + force: Fortitude, + ) -> Result { + match Criterion::convert(asset) { + Left(a) => >::decrease_balance( + a, + who, + amount, + precision, + preservation, + force, + ), + Right(a) => >::decrease_balance( + a, + who, + amount, + precision, + preservation, + force, + ), + } + } + fn increase_balance( + asset: Self::AssetId, + who: &AccountId, + amount: Self::Balance, + precision: Precision, + ) -> Result { + match Criterion::convert(asset) { + Left(a) => >::increase_balance( + a, who, amount, precision, + ), + Right(a) => >::increase_balance( + a, who, amount, precision, + ), + } + } +} + +impl< + Left: fungibles::UnbalancedHold, + Right: fungibles::UnbalancedHold, + Criterion: Convert>, + AssetKind: AssetId, + AccountId, + > fungibles::UnbalancedHold for UnionOf +{ + fn set_balance_on_hold( + asset: Self::AssetId, + reason: &Self::Reason, + who: &AccountId, + amount: Self::Balance, + ) -> DispatchResult { + match Criterion::convert(asset) { + Left(a) => >::set_balance_on_hold( + a, reason, who, amount, + ), + Right(a) => >::set_balance_on_hold( + a, reason, who, amount, + ), + } + } + fn decrease_balance_on_hold( + asset: Self::AssetId, + reason: &Self::Reason, + who: &AccountId, + amount: Self::Balance, + precision: Precision, + ) -> Result { + match Criterion::convert(asset) { + Left(a) => >::decrease_balance_on_hold( + a, reason, who, amount, precision, + ), + Right(a) => >::decrease_balance_on_hold( + a, reason, who, amount, precision, + ), + } + } + fn increase_balance_on_hold( + asset: Self::AssetId, + reason: &Self::Reason, + who: &AccountId, + amount: Self::Balance, + precision: Precision, + ) -> Result { + match Criterion::convert(asset) { + Left(a) => >::increase_balance_on_hold( + a, reason, who, amount, precision, + ), + Right(a) => >::increase_balance_on_hold( + a, reason, who, amount, precision, + ), + } + } +} + +impl< + Left: fungibles::Mutate, + Right: fungibles::Mutate, + Criterion: Convert>, + AssetKind: AssetId, + AccountId: Eq, + > fungibles::Mutate for UnionOf +{ + fn mint_into( + asset: Self::AssetId, + who: &AccountId, + amount: Self::Balance, + ) -> Result { + match Criterion::convert(asset) { + Left(a) => >::mint_into(a, who, amount), + Right(a) => >::mint_into(a, who, amount), + } + } + fn burn_from( + asset: Self::AssetId, + who: &AccountId, + amount: Self::Balance, + precision: Precision, + force: Fortitude, + ) -> Result { + match Criterion::convert(asset) { + Left(a) => + >::burn_from(a, who, amount, precision, force), + Right(a) => + >::burn_from(a, who, amount, precision, force), + } + } + fn shelve( + asset: Self::AssetId, + who: &AccountId, + amount: Self::Balance, + ) -> Result { + match Criterion::convert(asset) { + Left(a) => >::shelve(a, who, amount), + Right(a) => >::shelve(a, who, amount), + } + } + fn restore( + asset: Self::AssetId, + who: &AccountId, + amount: Self::Balance, + ) -> Result { + match Criterion::convert(asset) { + Left(a) => >::restore(a, who, amount), + Right(a) => >::restore(a, who, amount), + } + } + fn transfer( + asset: Self::AssetId, + source: &AccountId, + dest: &AccountId, + amount: Self::Balance, + preservation: Preservation, + ) -> Result { + match Criterion::convert(asset) { + Left(a) => >::transfer( + a, + source, + dest, + amount, + preservation, + ), + Right(a) => >::transfer( + a, + source, + dest, + amount, + preservation, + ), + } + } + + fn set_balance(asset: Self::AssetId, who: &AccountId, amount: Self::Balance) -> Self::Balance { + match Criterion::convert(asset) { + Left(a) => >::set_balance(a, who, amount), + Right(a) => >::set_balance(a, who, amount), + } + } +} + +impl< + Left: fungibles::MutateHold, + Right: fungibles::MutateHold, + Criterion: Convert>, + AssetKind: AssetId, + AccountId, + > fungibles::MutateHold for UnionOf +{ + fn hold( + asset: Self::AssetId, + reason: &Self::Reason, + who: &AccountId, + amount: Self::Balance, + ) -> DispatchResult { + match Criterion::convert(asset) { + Left(a) => >::hold(a, reason, who, amount), + Right(a) => >::hold(a, reason, who, amount), + } + } + fn release( + asset: Self::AssetId, + reason: &Self::Reason, + who: &AccountId, + amount: Self::Balance, + precision: Precision, + ) -> Result { + match Criterion::convert(asset) { + Left(a) => >::release( + a, reason, who, amount, precision, + ), + Right(a) => >::release( + a, reason, who, amount, precision, + ), + } + } + fn burn_held( + asset: Self::AssetId, + reason: &Self::Reason, + who: &AccountId, + amount: Self::Balance, + precision: Precision, + force: Fortitude, + ) -> Result { + match Criterion::convert(asset) { + Left(a) => >::burn_held( + a, reason, who, amount, precision, force, + ), + Right(a) => >::burn_held( + a, reason, who, amount, precision, force, + ), + } + } + fn transfer_on_hold( + asset: Self::AssetId, + reason: &Self::Reason, + source: &AccountId, + dest: &AccountId, + amount: Self::Balance, + precision: Precision, + mode: Restriction, + force: Fortitude, + ) -> Result { + match Criterion::convert(asset) { + Left(a) => >::transfer_on_hold( + a, reason, source, dest, amount, precision, mode, force, + ), + Right(a) => >::transfer_on_hold( + a, reason, source, dest, amount, precision, mode, force, + ), + } + } + fn transfer_and_hold( + asset: Self::AssetId, + reason: &Self::Reason, + source: &AccountId, + dest: &AccountId, + amount: Self::Balance, + precision: Precision, + preservation: Preservation, + force: Fortitude, + ) -> Result { + match Criterion::convert(asset) { + Left(a) => >::transfer_and_hold( + a, + reason, + source, + dest, + amount, + precision, + preservation, + force, + ), + Right(a) => >::transfer_and_hold( + a, + reason, + source, + dest, + amount, + precision, + preservation, + force, + ), + } + } +} + +impl< + Left: fungibles::MutateFreeze, + Right: fungibles::MutateFreeze, + Criterion: Convert>, + AssetKind: AssetId, + AccountId, + > fungibles::MutateFreeze for UnionOf +{ + fn set_freeze( + asset: Self::AssetId, + id: &Self::Id, + who: &AccountId, + amount: Self::Balance, + ) -> DispatchResult { + match Criterion::convert(asset) { + Left(a) => >::set_freeze(a, id, who, amount), + Right(a) => + >::set_freeze(a, id, who, amount), + } + } + fn extend_freeze( + asset: Self::AssetId, + id: &Self::Id, + who: &AccountId, + amount: Self::Balance, + ) -> DispatchResult { + match Criterion::convert(asset) { + Left(a) => + >::extend_freeze(a, id, who, amount), + Right(a) => + >::extend_freeze(a, id, who, amount), + } + } + fn thaw(asset: Self::AssetId, id: &Self::Id, who: &AccountId) -> DispatchResult { + match Criterion::convert(asset) { + Left(a) => >::thaw(a, id, who), + Right(a) => >::thaw(a, id, who), + } + } +} + +pub struct ConvertImbalanceDropHandler< + Left, + Right, + LeftAssetId, + RightAssetId, + Criterion, + AssetKind, + Balance, + AccountId, +>( + sp_std::marker::PhantomData<( + Left, + Right, + LeftAssetId, + RightAssetId, + Criterion, + AssetKind, + Balance, + AccountId, + )>, +); + +impl< + Left: fungibles::HandleImbalanceDrop, + Right: fungibles::HandleImbalanceDrop, + LeftAssetId, + RightAssetId, + Criterion: Convert>, + AssetKind, + Balance, + AccountId, + > fungibles::HandleImbalanceDrop + for ConvertImbalanceDropHandler< + Left, + Right, + LeftAssetId, + RightAssetId, + Criterion, + AssetKind, + Balance, + AccountId, + > +{ + fn handle(asset: AssetKind, amount: Balance) { + match Criterion::convert(asset) { + Left(a) => Left::handle(a, amount), + Right(a) => Right::handle(a, amount), + } + } +} + +impl< + Left: fungibles::Balanced, + Right: fungibles::Balanced, + Criterion: Convert>, + AssetKind: AssetId, + AccountId, + > fungibles::Balanced for UnionOf +{ + type OnDropDebt = ConvertImbalanceDropHandler< + Left::OnDropDebt, + Right::OnDropDebt, + Left::AssetId, + Right::AssetId, + Criterion, + AssetKind, + Left::Balance, + AccountId, + >; + type OnDropCredit = ConvertImbalanceDropHandler< + Left::OnDropCredit, + Right::OnDropCredit, + Left::AssetId, + Right::AssetId, + Criterion, + AssetKind, + Left::Balance, + AccountId, + >; + + fn deposit( + asset: Self::AssetId, + who: &AccountId, + value: Self::Balance, + precision: Precision, + ) -> Result, DispatchError> { + match Criterion::convert(asset.clone()) { + Left(a) => >::deposit(a, who, value, precision) + .map(|debt| imbalance::from_fungibles(debt, asset)), + Right(a) => + >::deposit(a, who, value, precision) + .map(|debt| imbalance::from_fungibles(debt, asset)), + } + } + fn issue(asset: Self::AssetId, amount: Self::Balance) -> fungibles::Credit { + match Criterion::convert(asset.clone()) { + Left(a) => { + let credit = >::issue(a, amount); + imbalance::from_fungibles(credit, asset) + }, + Right(a) => { + let credit = >::issue(a, amount); + imbalance::from_fungibles(credit, asset) + }, + } + } + fn pair( + asset: Self::AssetId, + amount: Self::Balance, + ) -> (fungibles::Debt, fungibles::Credit) { + match Criterion::convert(asset.clone()) { + Left(a) => { + let (a, b) = >::pair(a, amount); + (imbalance::from_fungibles(a, asset.clone()), imbalance::from_fungibles(b, asset)) + }, + Right(a) => { + let (a, b) = >::pair(a, amount); + (imbalance::from_fungibles(a, asset.clone()), imbalance::from_fungibles(b, asset)) + }, + } + } + fn rescind(asset: Self::AssetId, amount: Self::Balance) -> fungibles::Debt { + match Criterion::convert(asset.clone()) { + Left(a) => { + let debt = >::rescind(a, amount); + imbalance::from_fungibles(debt, asset) + }, + Right(a) => { + let debt = >::rescind(a, amount); + imbalance::from_fungibles(debt, asset) + }, + } + } + fn resolve( + who: &AccountId, + credit: fungibles::Credit, + ) -> Result<(), fungibles::Credit> { + let asset = credit.asset(); + match Criterion::convert(asset.clone()) { + Left(a) => { + let credit = imbalance::from_fungibles(credit, a); + >::resolve(who, credit) + .map_err(|credit| imbalance::from_fungibles(credit, asset)) + }, + Right(a) => { + let credit = imbalance::from_fungibles(credit, a); + >::resolve(who, credit) + .map_err(|credit| imbalance::from_fungibles(credit, asset)) + }, + } + } + fn settle( + who: &AccountId, + debt: fungibles::Debt, + preservation: Preservation, + ) -> Result, fungibles::Debt> { + let asset = debt.asset(); + match Criterion::convert(asset.clone()) { + Left(a) => { + let debt = imbalance::from_fungibles(debt, a); + match >::settle(who, debt, preservation) { + Ok(credit) => Ok(imbalance::from_fungibles(credit, asset)), + Err(debt) => Err(imbalance::from_fungibles(debt, asset)), + } + }, + Right(a) => { + let debt = imbalance::from_fungibles(debt, a); + match >::settle(who, debt, preservation) { + Ok(credit) => Ok(imbalance::from_fungibles(credit, asset)), + Err(debt) => Err(imbalance::from_fungibles(debt, asset)), + } + }, + } + } + fn withdraw( + asset: Self::AssetId, + who: &AccountId, + value: Self::Balance, + precision: Precision, + preservation: Preservation, + force: Fortitude, + ) -> Result, DispatchError> { + match Criterion::convert(asset.clone()) { + Left(a) => >::withdraw( + a, + who, + value, + precision, + preservation, + force, + ) + .map(|credit| imbalance::from_fungibles(credit, asset)), + Right(a) => >::withdraw( + a, + who, + value, + precision, + preservation, + force, + ) + .map(|credit| imbalance::from_fungibles(credit, asset)), + } + } +} + +impl< + Left: fungibles::BalancedHold, + Right: fungibles::BalancedHold, + Criterion: Convert>, + AssetKind: AssetId, + AccountId, + > fungibles::BalancedHold for UnionOf +{ + fn slash( + asset: Self::AssetId, + reason: &Self::Reason, + who: &AccountId, + amount: Self::Balance, + ) -> (fungibles::Credit, Self::Balance) { + match Criterion::convert(asset.clone()) { + Left(a) => { + let (credit, amount) = + >::slash(a, reason, who, amount); + (imbalance::from_fungibles(credit, asset), amount) + }, + Right(a) => { + let (credit, amount) = + >::slash(a, reason, who, amount); + (imbalance::from_fungibles(credit, asset), amount) + }, + } + } +} + +impl< + Left: fungibles::Inspect + fungibles::Create, + Right: fungibles::Inspect + fungibles::Create, + Criterion: Convert>, + AssetKind: AssetId, + AccountId, + > fungibles::Create for UnionOf +{ + fn create( + asset: AssetKind, + admin: AccountId, + is_sufficient: bool, + min_balance: Self::Balance, + ) -> DispatchResult { + match Criterion::convert(asset) { + Left(a) => + >::create(a, admin, is_sufficient, min_balance), + Right(a) => >::create( + a, + admin, + is_sufficient, + min_balance, + ), + } + } +} + +impl< + Left: fungibles::Inspect + AccountTouch, + Right: fungibles::Inspect + + AccountTouch< + Right::AssetId, + AccountId, + Balance = >::Balance, + >, + Criterion: Convert>, + AssetKind: AssetId, + AccountId, + > AccountTouch for UnionOf +{ + type Balance = >::Balance; + + fn deposit_required(asset: AssetKind) -> Self::Balance { + match Criterion::convert(asset) { + Left(a) => >::deposit_required(a), + Right(a) => >::deposit_required(a), + } + } + + fn should_touch(asset: AssetKind, who: &AccountId) -> bool { + match Criterion::convert(asset) { + Left(a) => >::should_touch(a, who), + Right(a) => >::should_touch(a, who), + } + } + + fn touch(asset: AssetKind, who: &AccountId, depositor: &AccountId) -> DispatchResult { + match Criterion::convert(asset) { + Left(a) => >::touch(a, who, depositor), + Right(a) => + >::touch(a, who, depositor), + } + } +} -- GitLab From 166ae5ae1295c2431c83421439c3869d4f40de7e Mon Sep 17 00:00:00 2001 From: Jegor Sidorenko <5252494+jsidorenko@users.noreply.github.com> Date: Tue, 19 Dec 2023 15:23:58 +0200 Subject: [PATCH 057/191] [NFTs] Fix consumers issue (#2653) When we call the `set_accept_ownership` method, we increase the number of account consumers, but then we don't decrease it on collection transfer, which leads to the wrong consumers number an account has. --- substrate/frame/nfts/src/features/transfer.rs | 17 ++++++++------- substrate/frame/nfts/src/lib.rs | 6 +++--- substrate/frame/nfts/src/tests.rs | 5 +++++ substrate/frame/uniques/src/lib.rs | 21 +++++++++++-------- substrate/frame/uniques/src/tests.rs | 3 +++ 5 files changed, 32 insertions(+), 20 deletions(-) diff --git a/substrate/frame/nfts/src/features/transfer.rs b/substrate/frame/nfts/src/features/transfer.rs index 0471bd67b29..ac73d283ee0 100644 --- a/substrate/frame/nfts/src/features/transfer.rs +++ b/substrate/frame/nfts/src/features/transfer.rs @@ -124,10 +124,10 @@ impl, I: 'static> Pallet { pub(crate) fn do_transfer_ownership( origin: T::AccountId, collection: T::CollectionId, - owner: T::AccountId, + new_owner: T::AccountId, ) -> DispatchResult { // Check if the new owner is acceptable based on the collection's acceptance settings. - let acceptable_collection = OwnershipAcceptance::::get(&owner); + let acceptable_collection = OwnershipAcceptance::::get(&new_owner); ensure!(acceptable_collection.as_ref() == Some(&collection), Error::::Unaccepted); // Try to retrieve and mutate the collection details. @@ -135,27 +135,28 @@ impl, I: 'static> Pallet { let details = maybe_details.as_mut().ok_or(Error::::UnknownCollection)?; // Check if the `origin` is the current owner of the collection. ensure!(origin == details.owner, Error::::NoPermission); - if details.owner == owner { + if details.owner == new_owner { return Ok(()) } // Move the deposit to the new owner. T::Currency::repatriate_reserved( &details.owner, - &owner, + &new_owner, details.owner_deposit, Reserved, )?; // Update account ownership information. CollectionAccount::::remove(&details.owner, &collection); - CollectionAccount::::insert(&owner, &collection, ()); + CollectionAccount::::insert(&new_owner, &collection, ()); - details.owner = owner.clone(); - OwnershipAcceptance::::remove(&owner); + details.owner = new_owner.clone(); + OwnershipAcceptance::::remove(&new_owner); + frame_system::Pallet::::dec_consumers(&new_owner); // Emit `OwnerChanged` event. - Self::deposit_event(Event::OwnerChanged { collection, new_owner: owner }); + Self::deposit_event(Event::OwnerChanged { collection, new_owner }); Ok(()) }) } diff --git a/substrate/frame/nfts/src/lib.rs b/substrate/frame/nfts/src/lib.rs index 92b27432ab2..a7d505e2e39 100644 --- a/substrate/frame/nfts/src/lib.rs +++ b/substrate/frame/nfts/src/lib.rs @@ -1153,11 +1153,11 @@ pub mod pallet { pub fn transfer_ownership( origin: OriginFor, collection: T::CollectionId, - owner: AccountIdLookupOf, + new_owner: AccountIdLookupOf, ) -> DispatchResult { let origin = ensure_signed(origin)?; - let owner = T::Lookup::lookup(owner)?; - Self::do_transfer_ownership(origin, collection, owner) + let new_owner = T::Lookup::lookup(new_owner)?; + Self::do_transfer_ownership(origin, collection, new_owner) } /// Change the Issuer, Admin and Freezer of a collection. diff --git a/substrate/frame/nfts/src/tests.rs b/substrate/frame/nfts/src/tests.rs index 0c32aea2be0..9e521537534 100644 --- a/substrate/frame/nfts/src/tests.rs +++ b/substrate/frame/nfts/src/tests.rs @@ -614,8 +614,13 @@ fn transfer_owner_should_work() { Nfts::transfer_ownership(RuntimeOrigin::signed(account(1)), 0, account(2)), Error::::Unaccepted ); + assert_eq!(System::consumers(&account(2)), 0); + assert_ok!(Nfts::set_accept_ownership(RuntimeOrigin::signed(account(2)), Some(0))); + assert_eq!(System::consumers(&account(2)), 1); + assert_ok!(Nfts::transfer_ownership(RuntimeOrigin::signed(account(1)), 0, account(2))); + assert_eq!(System::consumers(&account(2)), 1); // one consumer is added due to deposit repatriation assert_eq!(collections(), vec![(account(2), 0)]); assert_eq!(Balances::total_balance(&account(1)), 98); diff --git a/substrate/frame/uniques/src/lib.rs b/substrate/frame/uniques/src/lib.rs index 63a6e83de07..253a318e474 100644 --- a/substrate/frame/uniques/src/lib.rs +++ b/substrate/frame/uniques/src/lib.rs @@ -856,34 +856,37 @@ pub mod pallet { pub fn transfer_ownership( origin: OriginFor, collection: T::CollectionId, - owner: AccountIdLookupOf, + new_owner: AccountIdLookupOf, ) -> DispatchResult { let origin = ensure_signed(origin)?; - let owner = T::Lookup::lookup(owner)?; + let new_owner = T::Lookup::lookup(new_owner)?; - let acceptable_collection = OwnershipAcceptance::::get(&owner); + let acceptable_collection = OwnershipAcceptance::::get(&new_owner); ensure!(acceptable_collection.as_ref() == Some(&collection), Error::::Unaccepted); Collection::::try_mutate(collection.clone(), |maybe_details| { let details = maybe_details.as_mut().ok_or(Error::::UnknownCollection)?; ensure!(origin == details.owner, Error::::NoPermission); - if details.owner == owner { + if details.owner == new_owner { return Ok(()) } // Move the deposit to the new owner. T::Currency::repatriate_reserved( &details.owner, - &owner, + &new_owner, details.total_deposit, Reserved, )?; + CollectionAccount::::remove(&details.owner, &collection); - CollectionAccount::::insert(&owner, &collection, ()); - details.owner = owner.clone(); - OwnershipAcceptance::::remove(&owner); + CollectionAccount::::insert(&new_owner, &collection, ()); + + details.owner = new_owner.clone(); + OwnershipAcceptance::::remove(&new_owner); + frame_system::Pallet::::dec_consumers(&new_owner); - Self::deposit_event(Event::OwnerChanged { collection, new_owner: owner }); + Self::deposit_event(Event::OwnerChanged { collection, new_owner }); Ok(()) }) } diff --git a/substrate/frame/uniques/src/tests.rs b/substrate/frame/uniques/src/tests.rs index 52f7df3b5ef..351dac09f7f 100644 --- a/substrate/frame/uniques/src/tests.rs +++ b/substrate/frame/uniques/src/tests.rs @@ -254,8 +254,11 @@ fn transfer_owner_should_work() { Uniques::transfer_ownership(RuntimeOrigin::signed(1), 0, 2), Error::::Unaccepted ); + assert_eq!(System::consumers(&2), 0); assert_ok!(Uniques::set_accept_ownership(RuntimeOrigin::signed(2), Some(0))); + assert_eq!(System::consumers(&2), 1); assert_ok!(Uniques::transfer_ownership(RuntimeOrigin::signed(1), 0, 2)); + assert_eq!(System::consumers(&2), 1); assert_eq!(collections(), vec![(2, 0)]); assert_eq!(Balances::total_balance(&1), 98); -- GitLab From 2e70dd3bbe2deff61eabfb574a077a2ece04f7c4 Mon Sep 17 00:00:00 2001 From: joe petrowski <25483142+joepetrowski@users.noreply.github.com> Date: Tue, 19 Dec 2023 15:12:24 +0100 Subject: [PATCH 058/191] Rococo/Westend Coretime Runtime MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New runtimes for the Coretime Chain (a.k.a. "Broker Chain") described in RFC-1. Replaces https://github.com/paritytech/cumulus/pull/2889 - [x] Add Agile Coretime pallet https://github.com/paritytech/substrate/pull/14568 - [x] Generate chain specs for local and testnets - [x] Deploy parachain on Rococo - Done: [rococo-coretime-rpc.polkadot.io](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frococo-coretime-rpc.polkadot.io#/explorer) DevOps issue for Aura keygen: https://github.com/paritytech/devops/issues/2725 Edit (Dónal): This PR is mainly for Rococo, the Westend runtime is a shell with no `Broker` pallet. The Rococo runtime has the broker calls filtered for initial deployment. --------- Co-authored-by: Dónal Murray Co-authored-by: 0xmovses Co-authored-by: Liam Aharon Co-authored-by: Bastian Köcher Co-authored-by: Marcin S. Co-authored-by: Bastian Köcher Co-authored-by: command-bot <> Co-authored-by: Branislav Kontur --- .gitlab/pipeline/build.yml | 10 + .gitlab/pipeline/check.yml | 13 + .gitlab/pipeline/short-benchmarks.yml | 10 + Cargo.lock | 129 +++ Cargo.toml | 2 + .../chain-specs/coretime-rococo.json | 70 ++ .../parachains/runtimes/coretime/README.md | 4 + .../coretime/coretime-rococo/Cargo.toml | 196 ++++ .../coretime/coretime-rococo/build.rs | 26 + .../coretime/coretime-rococo/src/coretime.rs | 238 +++++ .../coretime/coretime-rococo/src/lib.rs | 851 ++++++++++++++++++ .../src/weights/block_weights.rs | 53 ++ .../cumulus_pallet_parachain_system.rs | 71 ++ .../src/weights/cumulus_pallet_xcmp_queue.rs | 152 ++++ .../src/weights/extrinsic_weights.rs | 53 ++ .../src/weights/frame_system.rs | 141 +++ .../coretime-rococo/src/weights/mod.rs | 41 + .../src/weights/pallet_balances.rs | 147 +++ .../src/weights/pallet_broker.rs | 484 ++++++++++ .../src/weights/pallet_collator_selection.rs | 265 ++++++ .../src/weights/pallet_message_queue.rs | 178 ++++ .../src/weights/pallet_multisig.rs | 150 +++ .../src/weights/pallet_session.rs | 78 ++ .../src/weights/pallet_timestamp.rs | 72 ++ .../src/weights/pallet_utility.rs | 93 ++ .../coretime-rococo/src/weights/pallet_xcm.rs | 333 +++++++ .../src/weights/paritydb_weights.rs | 63 ++ .../src/weights/rocksdb_weights.rs | 63 ++ .../coretime-rococo/src/weights/xcm/mod.rs | 244 +++++ .../xcm/pallet_xcm_benchmarks_fungible.rs | 201 +++++ .../xcm/pallet_xcm_benchmarks_generic.rs | 355 ++++++++ .../coretime-rococo/src/xcm_config.rs | 289 ++++++ .../coretime/coretime-westend/Cargo.toml | 192 ++++ .../coretime/coretime-westend/build.rs | 26 + .../coretime/coretime-westend/src/lib.rs | 850 +++++++++++++++++ .../src/weights/block_weights.rs | 53 ++ .../cumulus_pallet_parachain_system.rs | 53 ++ .../src/weights/cumulus_pallet_xcmp_queue.rs | 151 ++++ .../src/weights/extrinsic_weights.rs | 53 ++ .../src/weights/frame_system.rs | 134 +++ .../coretime-westend/src/weights/mod.rs | 40 + .../src/weights/pallet_balances.rs | 151 ++++ .../src/weights/pallet_collator_selection.rs | 243 +++++ .../src/weights/pallet_message_queue.rs | 155 ++++ .../src/weights/pallet_multisig.rs | 163 ++++ .../src/weights/pallet_session.rs | 79 ++ .../src/weights/pallet_timestamp.rs | 73 ++ .../src/weights/pallet_utility.rs | 100 ++ .../src/weights/pallet_xcm.rs | 323 +++++++ .../src/weights/paritydb_weights.rs | 63 ++ .../src/weights/rocksdb_weights.rs | 63 ++ .../coretime-westend/src/weights/xcm/mod.rs | 244 +++++ .../xcm/pallet_xcm_benchmarks_fungible.rs | 200 ++++ .../xcm/pallet_xcm_benchmarks_generic.rs | 354 ++++++++ .../coretime-westend/src/xcm_config.rs | 292 ++++++ cumulus/polkadot-parachain/Cargo.toml | 6 + .../src/chain_spec/coretime.rs | 282 ++++++ .../polkadot-parachain/src/chain_spec/mod.rs | 1 + cumulus/polkadot-parachain/src/command.rs | 67 +- cumulus/polkadot-parachain/src/service.rs | 24 + .../scripts/create_coretime_rococo_spec.sh | 86 ++ .../scripts/create_coretime_westend_spec.sh | 108 +++ prdoc/pr_1479.prdoc | 11 + substrate/bin/node/runtime/src/lib.rs | 15 +- substrate/frame/broker/src/benchmarking.rs | 90 +- .../frame/broker/src/coretime_interface.rs | 48 +- substrate/frame/broker/src/mock.rs | 55 +- substrate/frame/broker/src/tick_impls.rs | 14 +- substrate/frame/broker/src/types.rs | 5 +- substrate/frame/broker/src/utility_impls.rs | 6 +- .../runtime/src/offchain/storage_lock.rs | 2 +- substrate/primitives/runtime/src/traits.rs | 17 +- 72 files changed, 9856 insertions(+), 111 deletions(-) create mode 100644 cumulus/parachains/chain-specs/coretime-rococo.json create mode 100644 cumulus/parachains/runtimes/coretime/README.md create mode 100644 cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml create mode 100644 cumulus/parachains/runtimes/coretime/coretime-rococo/build.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-rococo/src/coretime.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/block_weights.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/cumulus_pallet_parachain_system.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/cumulus_pallet_xcmp_queue.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/extrinsic_weights.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/frame_system.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/mod.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_balances.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_broker.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_collator_selection.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_message_queue.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_multisig.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_session.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_timestamp.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_utility.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_xcm.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/paritydb_weights.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/rocksdb_weights.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/mod.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-rococo/src/xcm_config.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml create mode 100644 cumulus/parachains/runtimes/coretime/coretime-westend/build.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/block_weights.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/cumulus_pallet_parachain_system.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/cumulus_pallet_xcmp_queue.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/extrinsic_weights.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/frame_system.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/mod.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_balances.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_collator_selection.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_message_queue.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_multisig.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_session.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_timestamp.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_utility.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_xcm.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/paritydb_weights.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/rocksdb_weights.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/mod.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs create mode 100644 cumulus/parachains/runtimes/coretime/coretime-westend/src/xcm_config.rs create mode 100644 cumulus/polkadot-parachain/src/chain_spec/coretime.rs create mode 100755 cumulus/scripts/create_coretime_rococo_spec.sh create mode 100755 cumulus/scripts/create_coretime_westend_spec.sh create mode 100644 prdoc/pr_1479.prdoc diff --git a/.gitlab/pipeline/build.yml b/.gitlab/pipeline/build.yml index 377236193cc..20aa4a5c2a2 100644 --- a/.gitlab/pipeline/build.yml +++ b/.gitlab/pipeline/build.yml @@ -220,6 +220,7 @@ build-test-parachain: # DAG: build-runtime-assets -> build-runtime-collectives -> build-runtime-bridge-hubs # DAG: build-runtime-assets -> build-runtime-collectives -> build-runtime-contracts +# DAG: build-runtime-assets -> build-runtime-coretime # DAG: build-runtime-assets -> build-runtime-starters -> build-runtime-testing build-runtime-assets: <<: *build-runtime-template @@ -235,6 +236,15 @@ build-runtime-collectives: - job: build-runtime-assets artifacts: false +build-runtime-coretime: + <<: *build-runtime-template + variables: + RUNTIME_PATH: "cumulus/parachains/runtimes/coretime" + # this is an artificial job dependency, for pipeline optimization using GitLab's DAGs + needs: + - job: build-runtime-assets + artifacts: false + build-runtime-bridge-hubs: <<: *build-runtime-template variables: diff --git a/.gitlab/pipeline/check.yml b/.gitlab/pipeline/check.yml index 3b14034a110..25d6ef8c84e 100644 --- a/.gitlab/pipeline/check.yml +++ b/.gitlab/pipeline/check.yml @@ -223,6 +223,19 @@ check-runtime-migration-collectives-westend: URI: "wss://westend-collectives-rpc.polkadot.io:443" COMMAND_EXTRA_ARGS: "--disable-spec-name-check" +# Check runtime migrations for Parity managed coretime chain +check-runtime-migration-coretime-rococo: + stage: check + extends: + - .docker-env + - .test-pr-refs + - .check-runtime-migration + variables: + NETWORK: "coretime-rococo" + PACKAGE: "coretime-rococo-runtime" + WASM: "coretime_rococo_runtime.compact.compressed.wasm" + URI: "wss://rococo-coretime-rpc.polkadot.io:443" + find-fail-ci-phrase: stage: check variables: diff --git a/.gitlab/pipeline/short-benchmarks.yml b/.gitlab/pipeline/short-benchmarks.yml index 97bce479927..e9dbe200881 100644 --- a/.gitlab/pipeline/short-benchmarks.yml +++ b/.gitlab/pipeline/short-benchmarks.yml @@ -74,6 +74,16 @@ short-benchmark-collectives-westend: variables: RUNTIME_CHAIN: collectives-westend-dev +short-benchmark-coretime-rococo: + <<: *short-bench-cumulus + variables: + RUNTIME_CHAIN: coretime-rococo-dev + +short-benchmark-coretime-westend: + <<: *short-bench-cumulus + variables: + RUNTIME_CHAIN: coretime-westend-dev + short-benchmark-glutton-westend: <<: *short-bench-cumulus variables: diff --git a/Cargo.lock b/Cargo.lock index 1829155ac9b..171f50f2bd8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2971,6 +2971,133 @@ dependencies = [ "memchr", ] +[[package]] +name = "coretime-rococo-runtime" +version = "0.1.0" +dependencies = [ + "cumulus-pallet-aura-ext", + "cumulus-pallet-parachain-system", + "cumulus-pallet-session-benchmarking", + "cumulus-pallet-xcm", + "cumulus-pallet-xcmp-queue", + "cumulus-primitives-core", + "cumulus-primitives-utility", + "frame-benchmarking", + "frame-executive", + "frame-support", + "frame-system", + "frame-system-benchmarking", + "frame-system-rpc-runtime-api", + "frame-try-runtime", + "hex-literal", + "log", + "pallet-aura", + "pallet-authorship", + "pallet-balances", + "pallet-broker", + "pallet-collator-selection", + "pallet-message-queue", + "pallet-multisig", + "pallet-session", + "pallet-sudo", + "pallet-timestamp", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", + "pallet-utility", + "pallet-xcm", + "pallet-xcm-benchmarks", + "parachains-common", + "parity-scale-codec", + "polkadot-core-primitives", + "polkadot-parachain-primitives", + "polkadot-runtime-common", + "rococo-runtime-constants", + "scale-info", + "serde", + "smallvec", + "sp-api", + "sp-block-builder", + "sp-consensus-aura", + "sp-core", + "sp-genesis-builder", + "sp-inherents", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-std 8.0.0", + "sp-storage 13.0.0", + "sp-transaction-pool", + "sp-version", + "staging-parachain-info", + "staging-xcm", + "staging-xcm-builder", + "staging-xcm-executor", + "substrate-wasm-builder", +] + +[[package]] +name = "coretime-westend-runtime" +version = "0.1.0" +dependencies = [ + "cumulus-pallet-aura-ext", + "cumulus-pallet-parachain-system", + "cumulus-pallet-session-benchmarking", + "cumulus-pallet-xcm", + "cumulus-pallet-xcmp-queue", + "cumulus-primitives-core", + "cumulus-primitives-utility", + "frame-benchmarking", + "frame-executive", + "frame-support", + "frame-system", + "frame-system-benchmarking", + "frame-system-rpc-runtime-api", + "frame-try-runtime", + "hex-literal", + "log", + "pallet-aura", + "pallet-authorship", + "pallet-balances", + "pallet-collator-selection", + "pallet-message-queue", + "pallet-multisig", + "pallet-session", + "pallet-sudo", + "pallet-timestamp", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", + "pallet-utility", + "pallet-xcm", + "pallet-xcm-benchmarks", + "parachains-common", + "parity-scale-codec", + "polkadot-core-primitives", + "polkadot-parachain-primitives", + "polkadot-runtime-common", + "scale-info", + "serde", + "smallvec", + "sp-api", + "sp-block-builder", + "sp-consensus-aura", + "sp-core", + "sp-genesis-builder", + "sp-inherents", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-std 8.0.0", + "sp-storage 13.0.0", + "sp-transaction-pool", + "sp-version", + "staging-parachain-info", + "staging-xcm", + "staging-xcm-builder", + "staging-xcm-executor", + "substrate-wasm-builder", + "westend-runtime-constants", +] + [[package]] name = "cpp_demangle" version = "0.3.5" @@ -12798,6 +12925,8 @@ dependencies = [ "collectives-westend-runtime", "color-print", "contracts-rococo-runtime", + "coretime-rococo-runtime", + "coretime-westend-runtime", "cumulus-client-cli", "cumulus-client-collator", "cumulus-client-consensus-aura", diff --git a/Cargo.toml b/Cargo.toml index e3b6e3aadfe..aa388404fa1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -90,6 +90,8 @@ members = [ "cumulus/parachains/runtimes/bridge-hubs/test-utils", "cumulus/parachains/runtimes/collectives/collectives-westend", "cumulus/parachains/runtimes/contracts/contracts-rococo", + "cumulus/parachains/runtimes/coretime/coretime-rococo", + "cumulus/parachains/runtimes/coretime/coretime-westend", "cumulus/parachains/runtimes/glutton/glutton-westend", "cumulus/parachains/runtimes/starters/seedling", "cumulus/parachains/runtimes/starters/shell", diff --git a/cumulus/parachains/chain-specs/coretime-rococo.json b/cumulus/parachains/chain-specs/coretime-rococo.json new file mode 100644 index 00000000000..39506095bfe --- /dev/null +++ b/cumulus/parachains/chain-specs/coretime-rococo.json @@ -0,0 +1,70 @@ +{ + "name": "Rococo Coretime", + "id": "coretime-rococo", + "chainType": "Live", + "bootNodes": [ + "/dns/rococo-coretime-collator-node-0.polkadot.io/tcp/30333/p2p/12D3KooWHBUH9wGBx1Yq1ZePov9VL3AzxRPv5DTR4KadiCU6VKxy", + "/dns/rococo-coretime-collator-node-1.polkadot.io/tcp/30333/p2p/12D3KooWB3SKxdj6kpwTkdMnHJi6YmadojCzmEqFkeFJjxN812XX" + ], + "telemetryEndpoints": null, + "protocolId": null, + "properties": { + "ss58Format": 42, + "tokenDecimals": 12, + "tokenSymbol": "ROC" + }, + "relay_chain": "rococo", + "para_id": 1005, + "codeSubstitutes": {}, + "genesis": { + "raw": { + "top": { + "0x0d715f2646c8f85767b5d2764bb2782604a74d81251e398fd8a0a4d55023bb3f": "0xed030000", + "0x0d715f2646c8f85767b5d2764bb278264e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x15464cac3378d46f113cd5b7a4d71c84476f594316a7dfe49c1f352d95abdaf1": "0x00000000", + "0x15464cac3378d46f113cd5b7a4d71c844e7b9012096b41c4eb3aaf947f6ea429": "0x0100", + "0x15464cac3378d46f113cd5b7a4d71c845579297f4dfb9609e7e4c2ebab9ce40a": "0x0802f40601439cb3765ef8e2a0a5770a78fdda8ea3675f0d4262ceac46fe9b8a38b25ca9a71a8570a05814e75eee9eab0757d2c98e91b24c1fa2e3eb75f7b26d4b", + "0x15464cac3378d46f113cd5b7a4d71c84579f5a43435b04a98d64da0cefe18505": "0x50cd2d03000000000000000000000000", + "0x26aa394eea5630e07c48ae0c9558cef734abf5cb34d6244378cddbf18e849d96": "0x00000000829e74677a0a0600", + "0x26aa394eea5630e07c48ae0c9558cef74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", + "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", + "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", + "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9bb2c1ae8590211c475b041d595d99230b25ca9a71a8570a05814e75eee9eab0757d2c98e91b24c1fa2e3eb75f7b26d4b": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9d440d8395438d7269bad990f83715c2002f40601439cb3765ef8e2a0a5770a78fdda8ea3675f0d4262ceac46fe9b8a38": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x59933c636f726574696d652d726f636f636f", + "0x3a63": "0x", + "0x3a636f6465": "0x52bc537646db8e0528b52ffd0058f41c04ee820524125110306b291df7ec1bbc35021becd0370bad392219fb2238ceceb48c316bc12c7a11911586bf0e3140e7c0b16cc35ff0661d0ab1738ce914ce06c7dc9a10bd34368cb56fffdbfe2664efbdf7de524a29650a291376109b10d43fa5f9d446f3a95d693ec9a7de349fa457dca4c63399fdccaf20d3ab4faf994abecc75c2da671ea74b9f3365cd8fdcb79434dfcecda7ae4d49f3ede07c921d1b8dbebd6f749672a84fba7ce293a0549a30e9f3bb66c39e379aaadfd43a64ee09a30e353b94a0c41af44fc9ac6fef306c1dd331d83aa6532ce6c7faf3cb4b2b62d7a450f976fb5d9322e547eea773f389faf4703a951e7ed7ac08bdd18449afed530efa1a87d82e9f44e9eddd7dfd73ba9c33f74c4a205f7be328631e14777cfd7de3e3e6d3c864430851fa08fe2c80285d8874299aabc4b3164e909b4fa37ccebb7b481fa97f141b40a4ae01cddc374189eb83dd63891cf453db3721727d1494987ed8e4827dbe09d8ea1e4b24eda714f0d2a77728a4d2640844a4bd0422692f5d9c724af1750f35e0843e13d61ffaa813d60e35bbe9eb1ba33ff5848ddc8fdcb7f7e4014ea7e9ed5f63205297ff7506e2d71206b16b51ba7cd7a07cf9b1c64f1fc077ed49a09fa18f21a2f4ae3db9f3a3d283e07cda9c7afff46f863eb6dc72a80127049ab07eea4c0da012a875f4cb9083d953ff244871ff86e57f32a4fe514c25a77cd409ab0e447cea32dca09f7a873e7ac246f0a5cde3ec2d47373cd61fab53d1bfdea18faf430d6e1eeb5fe77cc3a3ffe6148fe3385210421847f8cd7bc23687a21c9e923df50d8f4d5ffd93e0c5fd14f77728a43e75a809352d9ea24fbde29e30e91dfaa0b94e9874a8e9df36669ba42f7c2da7d4240962d79ea0f951fce9b0f934824af36984fdf4e939e693fce9e27cea1a2dcd4f379a4ff3a7f7e4216363d34fefb00154aa681dfd50737adf98596ac7b78d999472ccd7f3ebf955ef1ba3f8d4bfda53bcd18475ae1346bdc32999f5d6a1e66731d73aa87f1dca3cce5e7ae3517ebbc4228ee0531feb5307e7533b7528daa10fe950b3cea7e9d4b9ee619d7ad73dfaa95bdc74089cb09eb051e9a7cbef9a0d80de68c2a6572cbf6fd02c257edb98512971685946ec5a163c2f694ffd73b5f78d51d27efac7e377fcd8593fb64f87a28dfb29eed6d1fe49b0711151aabd7f94b41fdba7cfef5a963f2f5ffa0c8348dad33c4adab77f1d0a11bf3ac54dead73c25b39e7ae371f6eddd3dc6ea2f20ded73ce57aea9de777fcd8593fb64f87a28dfb29eed6d1fe4db0b1c412a5cbefbea05d8653fed43b9c129fe6a609930e35a126d4849a50b3714f587bdf98594ad2be6dcca89c4a7c92264aef096b6ff06b1da2f4f6ee6ca89170e290f16cf460238d0d3436acd8b862438b0d2836a2d838c146161b586c3cc92dd89062a38a0d2b1bb40c45c622f371381e032e23abc960b2991c26c78091c82f6418b2982c439e01dfc958f90a2791a3e429380b5b81ed602cf017d92a43c956301adc4326010bc27e300fb9842c0543c159e041980bec02f6026b81bbc060f016784be6015781e5e038f90b2e02d3c1476037f80a6c04c621af8073c857b055f682a5649a57e159f8152e283f712c9c8ecff13ad88bc7713e6ec7e57820dcc5ef602edec75b70187c8d63e1295c0c5ec15ff0205c06fcc75dc08170141810a6024be133602dfe03d68387c06c1c0817023f81b3e035d8074c048602c3c17dfc8f43e17bdc07dc8403ca3a6035d889bc037e93abe42eee26a7c14ce41bf2991a6f6ac0a9b1a6469b1ab51a6c6afc50234d8d1e6aa8a9c1438d196a8ca941438d2e35acd4b0aa11a506141a65d080a2068d46568d2734c8a0d187461e1a56d0f88246201a55d0d843030b1a52d0b88286201a4bd0e043230a1a7f688841a38b170f2f2568107a2d4143091a4fbcf4d01844438b26169abc34add0d4a5c98526304d2d347d6982a12986a6ab26129aa6344969b26a22d36443530d4d34348d69c26a9aa1498626314d4f9a6e6842d374a6c94c539926159a526842a1894bd396262d4d599ab0345d69b2d254a589ca2b8c17a1d715af412f305e5abcbe7865f1c2e225e865c50bcf0bd0cb881713af3baf235e48bce4bc8a78e579a579e9f092e125e635c32b86570a2f185e2bbcbcbc547861bdbabcbebcb2bcb4bcb08840d620f5baf2aaf22ae16585890f13144c7a98986082c39486c90526304c6598b62c7db1548217094b602c65b184c592a0a52b96a05872624989a524969658c2b314c5929b252296de2cc95982b314674908a52e94c05022a4f4855209940a298da1248692174a8194b25012a48485d2154c4328d1512a42698e521da59ad20e4c4524b9412a23e987241e92cc20fd49ea21c94a920f496592aa245149ba923444121ba42e90b8400a03c90ba42f92d62001429a02290aa42c928840e283a403d20e486a907840c2018906242ca41a90d2208d41b2016906a41c904a40ba729d1066f1b042128e78100175551061e16a473b147971a4c4119ea324709ead96d4a6cb02a90c121924335d954e0e51a1253e358458f2b3a4a748cb05e2fa916390a4181db105d15de1a27556885bb8a288828e8ae8b428c2234231f2a1a5e7480dd1174460745a5a4c101152e2417cd2e9e9ac2c8d41c487480e911b222288de101541a404511c223c447088e6dc2a88aa20a262488f92159c105c10db9b8dce501e1a630c2df1f2e2d5c5c6a6c84a0d1fc2329b122f3b442c1079211a43b48258c5d11177869be576b9295c19ee975be692b9365cac4bc3ade18eb95e2e98cbe5be7055b82e5c2d37cc157359b830dc15ee139b7569b68c8bc26de16eb9666e0c368ab5b250885a2002933426092b6986241992c424c5900443d20b4961925c480293d442d297241692bc24ad90d4254985a414925048e292b425490b9396a2276219ac03d11434b2706d3942624b33c4a668900d12bcc661915110b3289a5364470c246a215a2162512447bca2a888223a3c442e38268ee474588457e21762174c3f0ce1e9ec74578ea6781b1b26d8b8723d21ca626990d19aa52dc418c41744179686b051829826ab40140327088fe1b2429455b4c595820b850d8990875087a13de10e2e2e442a1cd929ba53e4a6284e2b8b83a255e8684e1111ad12707c88521007717b5a651cd52932a2a84e119cd6182e2b57094c6d5a54145d1565a1e18591106109e1094c4e7446746e2e114b59d74d07a723e2beb9703a2c9707a62744508a4aa8914351151a5414d1ba37dd10446474755e3b7c3c7c52be34df942f878f04223444377c553c42de171e185e18df095b998dcc77e5d3f26dd9d61471d16dd18141c4860885a337446d383d476e8e8688bdb8745d1cc53922e205a6fbe2084ee7c58b8a170aaf2d4443d41842a9874d88d7109b115d1c233545515e718a4c10cd10897194a6688a7803d118e299221298a01449590aa3e8caab8557151c15dc141b139b1ed79416192e29dc1347743827926a99050e502788fbf3e282f363e38c38c5ab07af0d931c242db62236372d2d8e7a58aa6d70b63a4b768c7ab87198681d1b1a5bbcea74452c15518465288bd08c521613111b10578a1b6833b3d9e079e17571a7f0acf0aef0aaf0047981bc2dbc41db0d1b0e1b9a2d87edccb6c3a6c3a542dab0cd79b9d98e582a83a88ca53c448144323550a891420d158ab4b8578abab85490065d2cb28b5ce156617a6374c3518d0bc4e4a6e80dd74416e48252834bd116477798d6e0399e093588e07e30da82c88a1113a01dd008a617b83a1b1145543a402f2896da1c9539a2a10b84db80808e745862738b60a243830bf0cf521d6e0d0ee275e559dd1da23b4945e42d4683381f5e7c72961612a09fa138b90c77c2911547a7c86a1be2280a47e5a806a5326814c24b0cc931faa1884bd109344a70cf30a160e44497658bd3a530e444a7c21109e1195c73295a49f89b21385c95ad0d7ec2b4a786942333dc1c3108a2308aa0183521d2960a3151e9bab89fee8f53d171c1859c8d77b1dd212a01d39425325e518ea00c2931c44488a66bf3b27a3d51aac208881b44e682afb8b2363b3905a6393907e762a8091f62688a1a6ef00e1d0add9617142ecb26e715e82565e889d7141048291205c9456e0941469129482b0e54cda6462073c26489d422b3c82a1a903724c980071288800f087420e4011c3400c8061a2c00a6000b24940b7628c931000110c0a9024903f7e493dfd2b5a79b348a49910e0c09a148140843867c927e90246ac8104f878e2130ada1163e407244840ebc86bef4078e7820899228aa22514b8c3039c2242a49940637865830324489079200418244c902a88c442141a26401150c79d931b4021224458c20415264015d40a0fa409228242a745494078628a11a4205c2078e4485c06928856682e44811aaa80f8644457900c7100aadc403498e0c11c1922811a6861c09e1a99244814004453af0212e1d6524899224438a0c3912c2471949a2e4015449445062c4c8cf18daf2811223511fd418d2d24c4410253584091311440549a2e40813265112c043593a044742f82551524b945440081ec2d25154453e3882a44893215122448900010f3e88fac0078a7850c1d095662265240a0423569a095592a82551202439e24355921cf1c06b884a1b39c224c991255423440d110192104228326449d407488e88109332a20449ac69e88466c23464421719d234544283604811aa221f14a18a72c0d0d0d5088e20297284ea489223474324b4941125483a30248a4a0423512344110d4de9254a16000e4969265147a88e2c5102029508458a86ac3a89922354459688f0c1102a2548980c3912c2175922c21fb58c42d28122544944f0c0102a23514b8e7c90e4c890214bce99d9be2ea20aad082a5e7ccfbeaed1682f6774e9725038283204b9d5a222b0a828491487869244d148a441831a19514aa9d1d2d2921135a246467469b6b5b5dbded9d79b76de7bfbde9be7b4f75a5b6d9db5daa87d5bf6edd9ddb34e7b6f774b79af9c3ded6c79efb56de595f4ce3be76dd9b7db5a3ba7adb6da9ead69bb72ddf3d27be7b51f57a7e5ba4ac4715eabf62df2acf5b63ab7cedabb71d3ce9eb2ed9c745a3b6b5f6bafedee591dd077cec941dfbe72de69695f2ae5bdf7a3b7d533e4e6b5b75a6b996edfee1bd3ce7aafa5d3da7a27ecde396d9db3b6b5b576d7f376ad2d5bde9eb36fdf59edec0e626dd86ae5ecbe5576f79c7576b593ab2d8fab1d11b76d9bb5dc9cd7d6aecebeb4dada725acb7513b7ad1cd7d6f6bdb7d25ae5bdd5ca6aada47676dcedbeb7efedd9755b7bb97b27707174ce06f4e492bae7f48078b46ff716866dbbabab72f24a8febda498ece6e19864ca1b4ddb2a81ba94658370893e69cd376f77667f766bbafc7d9696fdb683b39ced2297bdadbd3da69e7bcf7369d52ce3befbcd47295ab5c37314774efec6e0dec90ccd576276d755d39e56dcde9b3657f586fc6f551279d734ed05edb5cf7e4babbbbc339edacddcd4ddbdd7baded9a769daeeeb6edc9596b611369360316d0dd7d67d26dd9ee39aded5cb1eece356dcf9eb42ba5ddd49b96d27bc339e5ac6f6b77cfee397bbbddd31e7d50ddb3a7b573f6b4f3a86f2b60da696d51d19cb6d6aeebe6388ee32c57eb6cb56aab55ebecba39398eab5cb5d6daca59db6dafbdb7ded9ddb55addb4b3b939bd4b2b476bdbda969b1cc7d96ab9aeb676adad04c8eb72755dd74d39a79db39bf35ee99a7376b39b977a575e6bdbde2eec393b4f4b6dd7d9b6daeea694f2524e4a04d8d7ebf5a2b356cb5dcbdd7b396b6fcf39c3eedb073080adb6de3abb47774bcf7a73d6b0762ecd696b9d349c35b4b6bb6ff76c2befa5d5729552aca4a4a4444464adadf7ce396d9d76ce29e7ec2965cf9e5dbbab94cdcde638afb6bc72b35a3aede46c259addddbd595b2b676b3029d57aafadb35a3be5acd6b69dd6da39674fa630bcf75e39e7b4d6d66927c7751cc77195e32c77adb556de7b6f01b87a398ede2b01800347ebde3befa5f75aeaa22d8eb376cedb7d6ddf0c783c71f5d28b010106000001d04b5d13547a6ddf0b76d4ba5d5b6bedaaadd536776f17de69e7ac76bb73d27bbb7bce6e7aefb4a1c6860fb4a8a708962801411408eed717443589423264842220a891d4177c400992211f4872e4031f50826409c98f4688fa20c99121498e1401c188073ca0245bf041d492a80f962819f2848100a28e2ca1a2600048901c91da11001c34603a60620e11470e0a2ad881f401922320181942854484221e88fac089004f33465012022a1a4f1808c0870470c1100144491541d281211f487204042645407001d8a080aac892a824511f583201d8028862c2246a490820506264c892a8264a8c442d195284c90746a2865c20f5848100423012c584c70c0f1c29c005186020800fa28628a10a41044b8cd85852848a090e24264b375a004a942c61923252a4034890285942815391a8254c2288921a42354254121a4d54511f581a6242c5e4c808511b9591224c921459423584ea080840a00426b6008e78206a4908f96849912824465e481f24890a21842243a23e506489122a26b22f00018d8e8a5ae281214b94501531a2040992224d7d4114088e5025116149cec0035422cc6892248a1ef50543922839c2644954932123448130842ac99125210c31c2e4080886508d10d5d42449148581806657556d557636e388f4ac6a56359b715c5555956c223dab9ab33aabaaaa9a49d98cca66b50b89cce4d7b9aaaa2a9db4aa1299c9aaaa594589cc64d56c5651225d359b51d94c56c999ac9a7d1d91b644aae4ac6a468954c92a49a46755b35955d56c7689f4acaa6a563d4aa4abaa2691ae9244baaaaaaa6a668974d56cce38223359258954c9aa2a3bdb887455d56c568954c92632933dbb334ba47b12e9d9ac1299c9d96c4689f46c3689cce44c12e99924f2004b4576b7040193221d78f4f00b48a5d13ef4faf43bf489e7870e3527f875eb70b9f5895beec2e3ace18fe9ad4c7d863fa68b0e4545fc0a32bde5d35b19bf82783fddfb99995a07dd44caa363d427369a30ea2e6fe1fed63182be8542bc079da97b50b7a19057eba00e66a6560b4bda77a881a4610d39d414298fa14cbd5d79e4febad474cfc7e9cdc14c08cff3bce932fc217d4e20d33da956eba0ee6a1d94f6b575d00d8895f6e4c3ee0bb3cbbb7574a1cb5be048fff3d6e754f75b215ed272810e355da0b7be10f42ec7973b879a50b37d8ed27b4a0ffb0e6d599cb09bf3db6c542567adb97df98c88f5bb8602114644fb5d43a1d6adc346188621e89f87611886de37c269f57ddff77ddff779dff8c8e8baaee37cf3aeebbacefb4607c6e65ffb79a3508ac6f267d687ad639b989bb0cde5e68de5157945acbe6d1e760f1fd3b7cdc1eeb179dfd85cfe757777b7ece9c260eb70b9c4d28ad8f2d041ff5c5a11bdcda515f1ba1db977b5bba6bb5c3eb10b8acffacd23d8ddf48a7f8cdc63cfad8ff2a787e0bd979378138f555f3bff5a0a89f73627f1e6773e76288479fb5de71d0ab9dfe59eb0b1829d9dd63b0a76d6e6292db823f777723ef194165cffa8bcdefed539fd9b41baf6338f5060d321eb5dfbae71e9f36dd9fccc75c2eee53824e0db697bc27cd45c276c3a276bd667ad389fb8cddb3f8b8154ffaaf51a75fd93b3bf0a76e8a3f3eb33f401452f3692b636915f2daed69392eeb4e691eaab5fb77804dffaf7e73fa73ffff38be5bf80b41d2cffb9fdfa1d02d902fd975b5a30ce09fb2678b1f5afe56cda6a6981755a3112f06b94285d69c2fa1584faf59ba5ae53eff7e2a75789fb3bbce3bd7bc86ff7ee043dbc79873997f87a8753dc37711bf6d62173e79ab91114eb181f90cdab7f158fb3af5ef1567d839a95eb1c6a562c9ff3eb9d8fb3bf5cfdb6cd2b6e227ff34f82dbe6df9c52d5ad77e880ea96c3157378ec5cde2e8ff53b3ab93c7650744af6b3bfce3bebacd3e5ac2efcaa2ebdfac4affa55bc01d4e6f29be0b66d3e25b3965081210021f29c73ed52d537ff383cd6af4ebbbc64aa07d1684f45f49c534a053e2724040f2f9952c0cfd6519deabe37bf7a8797784e759ff30e830cf9cea12687a76a4c29e065ebe8badae5ee1c75863fac5797a18f8a390ecb3b61168fd3e5929a394e6e6abea64320b53294f647bb897d2e209c73ce49d02de81ee89d7b1e369ab0f60e8b98c34de48ff23997b8897c8ee3fc9b2d7bd696ccde3adaa12687a538efc4f9f4ddcf25ffebd047df2171c23cdff1a0cbd087c4a37c29ce3bbfd85bc78e6fffb03861cdfd0dc279975d1ee832ecc0e65e569ab076301bf584358747ce6597c7d9770e62895d3a1405f1e8755e1eeb7bfeb9c4748ef2411f1b3013e2bb738079f43cdc2fbb962e88d44570e2febb611d7f318747f9d63f097278b42e7dc32f99a7e4dfdc3461ed15fc266dd6c74d27392a89de3dbc75486f6f9a4f46d349fa7423ee029ff44fd6e97f9d9b61dfa13a6179a4a22fbd73a3f9f46ddfe67979f4bc736ff39cfae7e1065d861ad4f83a619d6fb81fc454f43dffe46c495b1beeef0983cda71c4d2f5de6f1ba75ea1f95f2e2fe0e730ac8caca7a0e53d997463f47f8eb8d476e0cfb0edd9830ea9bfb846d198a36ee51fe94cccacacafa8ba9a80c7d74b6599cb0e9b4fb9be6933ff51cdd833e1d6fbc276d0cdf10b1dda8e84b62cd7b5ef7e8e17d4b0b46eec7fbb4795ce944a192b0d33afac73600541274da82fe9947e9e315f2bdcc63d53799ff8125f2a577469ef881201736a9adb16b48d47ecaf5d2a9bbba4793f1d4af34403f1de78f17ecee2169128c28fd93a124234e879a7668edc6c754a5d1ba4f55639fb87f5a1a40067ae2dba7f4a4012aeddbbf0da4d2bfde388ee3eee4382a398e83b5a46f51be9e9f0324ed691ea126f56eea9d477ef9ac5b5c4494b28ee347dbdfb52d4ffcec8fea1e4b763c56fbaca770e9ddf966ab293a62d7af8a62d2e8ab33d958238e48defa8e1f8d7e6c4010e898d5b5585299b0ea17104749e5ab8f0de8abcbda45eaf4c5171e5ce0014d1f1a2d765dfa7771c724a6551bacc40005062062565374c4a45f15c5daada6ccd8e657098849bff82a013159190fa4cbe41d59190f36bf5906b56559190faecb2cf3bcc37fe47eec5a4dfad8771a0c12e46061d1440d5120e13314e80001060c1b3d387411eb58fbb8c303a7d16292ca7cc2f17356305f8f71c7d799ab6bf55add563d7569fd7ccdf656df72929ba590e4ebd7479a47d957b7f83ac56de7cadf8cc5591fabfeb3580a49fff9cd6d92b683e5ad8f23f8bbe524fde7ed4d8200abdadb8ce5a4ca823c6d2cc8d3268f233c75e95be87cd3776d8b99ff2668319693aafe13ebbca76856d663d1665491814b98251384391387461542ff792c9a0579dad09a20c0aa3602aded6089b58f23780ba5ffc4ba4ceb3fb1f651f6368f6d806e0bc6ae6599e2a9e463d190f8dc10a50a1a2dd6d94915976956ed637599c7109e3a87db2ba63e430a5890874d160586a2e033431951b2b262408c7e56cd999db7863a9facc52312ead66ffdeee6dbb651219bdb3c5edf3256a7413fd695c7ba5cc57919ebd796a15dad5e73884660d59cd559057d7d639458be7a770fd9df9447e7a3f89cb77f9f7bb5c39cc77d153b2c2be341e75c9795a853f5a64eb60cf5ce391f95be7af5af82b27bcc6fff3ecf39f7e0f3ce6ff6c073ae7e59f639e711e858e7df0bc83873e1af5bb7799cd1f0372ff1b73efb0e81786f33d4f47006d4a9fa8761b8a9d3e61dde419d6a06b0af4e373c76edab8f17063ee7dc03cf3bcf6ff6e0732ecbca5cffb205a853f589c7d94f1b2ef180732fcb36a04ed5b9dcd4c97a043ad60175aa7e4321d46f1e3bf08e713eb69eaf6e2308b1635e2e43bd639d8f1de7abd7d0c77428dae18e71b863168fdd27880704bff854863e661e673f644f495be304be5b87c4a2e7c71ef4d5e5d57c1a5bd008f36994575442c072e7ab53cd27f9b50b7df56f82b27bf4b7cb20f9c7aa47329fa857ef1b354b492cdf36aaeaacce0dcad7f24aecda952e6fbf6b56d47c137dd4fbc6d8777efa4771953e378fb3bf1f05291a09ce1d6206f369146134a4153134f431441cc571c78e0c260fa7d168b4d874a8c9c363d337984fdc4fe7a07bd09fae262b5f5efe8c866224f2e18f7ea262a9a0b56265c11bfa20b481d7ab1f60f2e898a0af5e696d5b6aa345ddd53d68eed6216538441c77fc749b6b36cae0ce4fdf81e7a713603e49f907f8e97de7dbc6cc4a5b8234b2662ef70d3ac2e70071c25c9fa480d86103665feb4c4a06fcb0802169c450d7ec5983ed529da7aabe7d9c2e3b5359ab92e6bb5685cb8faeaf5ec1778d4aa0afdf27430e66df1336d69ffdcd1f0d7dd81972307bf05ac75503f9d7a126379f5e3fe45fbf997be9b64e193e074829896db091b27f7c4d01f0eb7faeeb3353aff64ea7fefa319d3abd2ead4bd1ebdc7c9a7fc1879a507326a58cf33505c4cf55c5cdcfcac14c666ec2aa57ff5c4144ead3a7aabeb6fc9a3bf0f574d1896d0821d64aa33e107f7d63dcf1d4bf3c722fa574e9ed546a0c10e78f4d4fa9a0f9b1de984f638e1cf3a93a759f4f2ed78f301e3d9d6ae5e693d474ce7bf2a8d3897a7bcd23f75d877ac2daeb84491febf77cea1a95ab6faf3c3ad6dee1fc31bdd6ccf57c9a6bbe9e277cb126a0796bc298b7d6fae7b2def3a9fa08526ffff6517ef50e81549f0e35fb86cd520ea59b07a5eda37ae326f5db2b06227e3ba54d714fd8c440d2269daff55d3381ca1b3509faea9747bba1d162edb46faf9fabcea7ebed51befdebeed1f2ef9b81dec2dd3ac03c7e53f3af7f799cffb974108f550fca6f8d4caafef3ea9e77f7e8bcd53a5a79fc9c7ae81deed611e61174da2ff1d496959555c65707f138fb21bf3ad4fc70bf87a56a6e22ff3a90f9d76918a4facce3eca7f77f2e310d7f5c6ff9875f405e861a80dead433a14859a209e9259cf790bbf420d36eff228bf730f8ff23dff2e1ee55f0fbd8642aa830e35bf9666c4ae9550e8ab5ffffa9b60871a84fee5b1fe476713ee5bdeca320452fffaf775d8cae3ec5b0ee226dc83fee151fee7dd3dc03c828ea4c777ebf8fc7328fae10f53efb095a7e85ff7713dc4e30d52fdbaa141f9cf3d6f97a10632ebc1dcad63fcf294ccfacfad77b841ff97bb73744e3ddcdf61e957d25a879d2ea743cd5927afd5e794871497bbf7e65290fcba8ee95296bce501a02ea504e94a6e8137e5216529cb889c32b9941afe793b477948d92125c997bc5d89f29082946548ee72f9d290bbb023b90c29cb866ef892cb901c74974ba159c6712e6699e81b7519cd322e97205dc6390d1ff2d0db45ca438a97659ecfe9df529665df6c380e9f9b2fb96cfa529659eb6296792eba6cc93f97529d29cb8c8c9c28cba87759d639fe5c86fdcb324a5df6f9cb8b44d1c12cb3d6bd2ca35936c33d17a98b2e035dcc325be432eb4e3e81cb449f20cb8c8cfc28cb8e7cdb9c469619d1f0a3edc82770d9e61364198d8ed27059772397002bcab2223f3af257d1d151761b9ee7346678dee775f8680969888adbec3c24ca7d47d6852d38b9a521d7e4f02652d1db8e3e0b222d2171d83564bdaea39fb81d0d812252072e0d6d939b9e0bdb236a8f9628878302f19b2efc79054313783870142d7db4737272d97427a70e09293b4ce41c06524081cb3ca78002bc6d2ecfee047aee646130976187e18071ae23d1b353b034e41478052e43f20a9c9c5cf6b9d3044e5e81cb3a8b03c7873d3bcc1e396ce2c0818302976d4e4196e1c03144bd82092698e132d067749edd8986cfb08154813bb96cc99d603000f8045906731b13b893cb3cb7e13231dff0a2a2b9e4d971cc98e13668d0f097cfb0e1335c36e43338c7e1395ce6f21c72479357e0329757206fb88d0a3c87cb90dc86cb3877823535656f72f22697616f922efbbcc92778bddc068d2c9b916533dc86bf68f8cb65a0bfa4cbac4fe03097890e9300c0e1b2cd716419007078ce3200380d1a0e7319f5ecb2ce7364190514f88d2c7b65d9cb8b8abc29cb9898fc95654d5e54e42f971df92bcb985ecee4323043b593f41b5e810d90c8676419539631f90c0741cf2ef33c6719910dcf2efb7208ed249dc82b709997476827e915641905b904e9f4f90459e6796e946546fe4de09fcbba6c812fcbbccf9bb2cc73b073d0653877d04ed29b5c7694376827e9b02cc371e400c8b29c65d927c07e23cb6cb8e72c6b2bacc4a093d542175aae62f80812b81851022dbc48392226053bd452e6da493ace32cf8e94bb9da4d7c84d9dda69cc58f2a62c7b29395396cd7ec8e18a3b7a66a8c1ce0fb1a5190b509ac8d2860931f4b8105b72d950566a27e94b59a6949b3a599047d8b7cb5c596c27e94999a34eed482ea3198476928e946547b904199332e44659e6f2a25cc28e9814ea445936d4725796cd64c022034b06425e60b1458cb613837288210b0b84da88119342dde5323167d04ed25d59d6ca4d9d0290c70cbe5db6e51ded243dcc4ad4a95d36339176920e66d9974b80c5a45cf7b2ec003cacc9e28c17490cb221d6e5123c26a5061b307410a2892925b8222665fae6322ec3da49fa9665373775d291c71ddf2eb3d9db497acd22756a6f9fd12aa7a923eba34094ce8925d066a09f73ced96452a794d22b354f29ed7a8332b9e2e2f3697afd39fa0d120a3dfde923f8a3cfd8087e379994522aa7434d3aa7cb39a72b3551299d7b995f41a45797348ff2a5cbf97a3ec996dffeb97a3ef5d3f4fac9d0879c9fec9056a72e9d863ee48451f9339cde61cd3ea6d4823a06624fd8e832fc31028d467bf2d2bf09f67c92de5ee7d3e42406278c7a0f71347aead3ab8fdc075c1e7bc2ae8bad71c609a7aa5afd9ffcafff86429cfecbaf2099069ab0ea9d338d5ca1afee7d994f5d966198a418d1c5881123cacdfbebe650338cc879ff4805cd384c328c28bd72598a203e95e831d94c13a6ce0bb458550dc4c64b9b981311c866311a4ec28ed8941db132d22d95f94405cd27f95fbe7fa4837ec6f9ea93ce0c1a68c68c331330639462beba1cd334dd34493133014db2cbf78fdc57aff3e9751debca632fefd77df97c998097c54c9d4336f9cb69e8c1cb5f339a5e5e98a469811d57fbab365bdfb53657dfb44d50d7ea13ce245f6083e7c59f9b4f3cd60d5f796c03b72dcb36afda362ac3cc762ccea1e6c4b2af3e3187af3cc681dc95c7aedf3cd6047059c679d5e63d3198b5d0d7768e4e510cc6aeb1b17aaa29c3d02cc3f898796a7be96178f1d5bd3f5fbdab7e6b6efefa574b137abb915293df80cda7ebb5ebc00e049d03c1cf3f09829f7f5fc73afca45e4136b7be6dad2d48b771ad6d04fde55dfcf2f20fce3befb294f52e83ce7560e71d02f1bc5048752f4b591fab3399fdf51b0a61327bd0a5ae90ea5b1eaf83b9f38e9bbdc5a17b78f60ad279e89d87fecd1ef48b5df862a9d06be72e6c656565e5f229dd17c8f9d7656c4af70523fd9b650c8a4ec95cb863df14b551470c9d06a9fef9cd63e85f7e7dbe79985f5f0ec2f975ceaf5fec39b7715b106ee3ba3c5efffc93f2c6eb600dcf57fff008bebafcc3fae75ff630d8f997bb7574ee5f1e3dbf0e353fff2b9f23c0f778806f6fca3df9f6d68e0caae4cc9b2009d547a5b7d612603e4df0d6958448f3d69b6eec783ba95beba0948f86f9da39cd3684106598afde9c779dcbdcb9c49cfc715d76d28c67418a5b9e9c3ebc8c254e97791ee749f730e8176fd73f0fdb7cf187b9d03da79873107f0e45b9cfab7f2d3cfb6b50e2d0bbce69277db3fe39d4c4129d62eb5f87601e650f7a54c4571e13bd6702c42cab72794f0c3c97f5c480bae8b097ee127f0ee2e922ee980b97015de230e3f6b00d7f5ccf3f8fe336bfd8c9da5823ca30df320c382f96d96f4e55bdf34805c466e9148fb2254d38bf54d5af8f5508ecc7aab7e3083fb67378aa8610eb328fd437aaf9d6db3acd4db82c25bdff52cd0dc7d33cce5ced32cc540d1a04183fce7ea43e83a0f3b0873d0d7fc0bee0e802002e1360b941c5c6557eead20a3f7549f3a72eabf1d447a0f1d4a9663cf5109a9e3a92d7530781e9a97fb0f4d489283d750d243d750b203d750f8e9e7a07464f9d83a2a7be01d15367c0d05387129ffa015c4f3d83d6532740f8d477804f3dc7f7d461de53bfd13d75e79e7ad3f6d495ee5337b24f5da44f9dfb319fe6571039bd76eda5d31088bf94fdf5b64170fc48ef389dbac5a3ecc7f61a04f6548699b06e62bfcbe2b0be397bce9ba33ea594b27dce29d9cb4e48a52fa5f4a926e95fd7656ec2ba3a615d936de2717a13f19154da931f3b9fda0a3dc9fa26dc26559dfae732775d9de2aca03cf9254dee73de647b26b3e7ae7723d57ccfaf97a764a1af54f3abe71710597bea33f441fd4e8a9bccaffecd293b47e7d7ad5f3c25fbea9c94d8e5c8494d2e8ff539975dd775b29ffec864f6ed73cb3f5ad69aa5a8d32cd53edba56fb44fb620ce33dfb51fcafc74e1bbd68395877dd7d40421fd9318085594413fced6dc1f45c8f2e6db5db20591b6f9aea529f4d2cd772d07359fe3bb86431f196ae0d5e9f353440681f9a9aad68f5452f05172e147aa312e7c52fc48758214f647264ce850810f777e64a2e6ceb7d368df9df5eddf3e51f8a6e46f326bf03966227ff3b294740f87da57f05dbbe1cb2fe9d6319d8afba9cefad02d1ee58fcfe70cb3084a4fa5f43277ebb03ff1a841ff6dfff078dd9aa91efad7f28cd8351cee7ce89e7ff6f35ce28969e863f482d420a173a07b38f41906e95c7a873f3a97211e6796ad43bae7201ee74baf09f753b40cda53c99f2e7fb6492ae52bf4137cd7d0e0e93800bdcb3b640038879a3388a07720164104f30bc8a4d19e7a158df652d4fb3beb5d1e8fbe497d249dbf36e8ef40b74ff550f3bb814aa5d30bbfb025431f9e583454248a62d1908b88a83524b65aae560b0321fdce8dcac779cfa7ce47f0416faf567fffa27173eff541bdc3f33f0aa2795241104fdcf74c197ffffa6739ef70f5226e7e9dfa0e6901e739268c73d88471cef907a33c08309d38e708f01c27038c0013c6518996f39100cfa1498346ca7f54564a5b13bfa637d97e4ad2de73f91d960fe2d7f457e7af2e3760f65ec6224101b1d0bb76a6d077ed0c193f431f5f7e01a1df39fd2e577de7b97b74ce394779b89c7391f29031ce95280f22e7dca50140e7fcf3fcd57908e87c08e63c117e752e6333e6c2af2e438073f9141973b97f1224ea4074108f21a8f35efd8f4ed9b4b6c6d9bf3a68f9ebf3faf45f1018f2d7973b18ca513a8b50e8f5e7cb879af4451c45c65cf9e5e52957d6635d1120167a145719b1293216ba15478bb28545a4cb100331f4b6fee6dc9dd969c5f87a3e59c7f5616ffd86d5e7ef9a1929d4703923e84c9cff2858f1781d407de64ab394e8b5cfdbae60c552d3abdbd00193be6834b314f5e9a3d369413350fcd8f456e9db4089e777489d03a501faadd34ca59406986f7dca10c8054f6f68ed298304f5da819514277ca4dcc122050e9f3fb1e952fe081cb6d0092446186c624d9da6f7cc331c228eb09f30caa339e9a3f861d3a13277be8213d6d2e7f41d52c442f3d38d6007f84945aee9d0cde084d90c7ed7cab8a17366e524746710191ea4b8620916b062ed47ca14486c795203963db1f6ce3bcaf8641571b66c08f4aee393554429a594338c8fd68aad4bb9597b9dfa66adb53e43f9a75a9fd6eb94cc9aaab6d63993a092724eafd3ebd433e02e757a9d52eab669c2ae7f73f6a90e35fb0e5d97d75fd5e5cf7f5528aedb2d374dd8edcab58e9e557c5d7bebd5760f89093061b689df3161d63b1c9bde3a0d65951df369049b260fcfad1f8073eb39e693f50ce653e7d63ddcd389f31b930767349fc6d75bb70e726e09f0d65fdd43beed70d384714ef338c729f14a9cbfb6d796bb66c39def9a0d49bc11965d6e9a306ec3b675b477582f96df376c96ea9a9df4cc77fdbb32f4e16d3874ebdf877f78dfad639cfd08bab7796fde0ee271734ae76bebb0df6c3c3dc4db748ef31073de6920f3c879e3f9b9fc28e714e4f004f3077a871a78ef7d0eba034207f3c83d28c3a911aca03ca1fdd4188231c8c87a267d670c1713be9dc9ecbb3c821f88fb43ec80308f23fce76067d06df8c37bcfa168fb00b394f7c3f3ce53b21fe97bdc7f598af3e923c779d78f7bf6c93a44addf351bc8f8061de4c0f39bbb758e6bcaa3a7d328bef551fcebd20491fe98c16f4ebf6b3510fab1f5fce6196c4f23b7c17cdafc00f36902374f377e6c3abfb975a8d9349f26de6a3288dffc9be0c4f395e653d76a583365d3d6e646f3a9fab6f5200ae56b4945ac4ebb5603996febe07c9a6ebd6fd80290a18df9234df01abefcc87d0e0e50a526ea75836e3241346aea1ef2a78334e8f9e94a0aa03c6aad95d6c98dd1f3d37bcc9d9f5ec1a758d26aed0c7d1411a56ab5d502a9d6d6eaa34a5bc4981a1a5bc358bfc7cc70bf6b63c28cc132c60a2bceb77fdf352c31baef1ad6a03a29a5944e2ea412cb2b62d7b0fafcf4b152ffae61e979a309a359cc10717a4f576a9c633e81d0387e7a6351f9e935034069070a6586a0d4e9044fb1c43ca51ca881afe73782383d04e2746ec270d30ada279e922f9333390df0cd3e4f7de20fc4b1ef3c0b62fda11f7f7af779aef6d529fe401c39345fbd5d7e11eb8f1cedabd39143c3d568f5fef313cf4f9fc18b9f4e9fe2517ade790d39b05ebd8642a653aff8a392ba87777c778f0b5e5ef059d0f31d6f4321d447f9529e53e9a07f1dfe28c05397e10fcfe987a58fd4a55f9086416676c2f9bd53648c73275364ec5e77722dc0b913ce37efd0029c6f5e25f5f2d1bc98ed1ff4d4a5f7b9ecfa94cdcb8432f4713511ad7b7ebdbacb875ce621bf380a57e5c5ac77f7d8fce62a2f765d4807579d5b19eb70992905fc387b19ee7c3889f79f831888d722027dc452483e073df419fec0493e0f1d8a12e171f643f90584ba947497531741acee721183de21073257776511c41f2b8d26bd2543dae3ef9a0c5633a4f91bdfb519b0cce0e6821f7eb5c2700b39f0c3afaf855f5f68c3ef8641c2aec920e6a9e653bf6110ef3bb8390a9765b39897a76c2e6336c458571b983f877a9b65d7fad6dd5c657314d7755915e7375f79ec7abef298cd53ae141093328b59b7beddf965a909ccacbfbe5a25723271049b5f9f5beb52e6d76767619e863ea84beb1d76607353a71957752707683ecdf934a9cbab2c101329107a959152e84a4a4b1eded095420c4a0374fdcdd002b2aad8cb83191331e084c94177223a93cbd0032607b3ace52293434d8bbf4f861868f991bbb09396bb7c08cb5a3ee42296b55cf40e3150e44b0e358fb0cce5351cc4b29683b3ffdc13f190872e732d6599e8610dec44260b5df4ec3346849dc864a0879ee41d7361190d976197b9cff021ec04bb137727335c56e5a4c989fcc8654a2e437299918b1d7ad0f221efd002a21765d92ce672a8c9846532e6ca1663a0657d283b117de8852ebff45d7b01cd7f1627f180786f9fa0f3d437b0430c2cf9908338f41676b2e42ddf420c140d6559cb8fbcbb070664a0d77059cb89bc430f8a3cccb22507bd6344d809e8455e033b29f2253fc24e64a02ff986c7d9dbd002a0176527a117b90d3d58f2962b6159e845b9ca4992d7f0d02fc6c092b7b213d05dfe75680130472972d05db9ca8b0d7988abbc98d8ddc3e671c7635db51ccc555e0cf45152973e845d2ee2d0a16888654ce2b1861410b30cf4304f6979999ba59058dffcfa9077f7f8f2b8e337f7f2287d3a4d62fd3a147d178e52e443593663afec24671993cb5e2e7375d23907719422afe14958a6e449fee50541ffc95b25ccb71d2cb74a98bf2f5c7d1ff1f204b16b65acde47b17a993465b8c0f0c4ebf8aec140260631cfe3bb0683a01804fdd3772d86345d622814e7677cd7c48c79315e88d1f31f085afce27290eeafcbf77e0bf4fd670bf4b7ff20c0aa56a52843fbebdbdfff5aa0c52feb1c7ed90c843e710517da5fef9efb0e815890a70ded0b8120c0aa0624635db5bc4696c958986538d7105de63568e4aa263ff21962ae6a2ab3b9e8a1434d89a1bcf4217ce5b1217fe12b8f81eec2552e3f72a65c05fad150ae72b9cb432fc2b2596c294f69e532530a78a9b1a50563d752a0bd74ebfd32a684af3c26e364515cb22b8f55811e7a9127611952ae02413f725915911fe52b8fb5dc285f79ac285711e52b8f8179ca508ea280d890831ee628aeb16b28107a99a9ea4bef42217dc4cb0c02d1ce8f160bcd23e93befb330cf81a0b7bc7a531e5e7d0b29d072978b94471497b7f2d5502e737d16ab7ec30dfa6f16417c2af1a56c96daf204663171c65a5eab444e2669347184aed168f965bde5533cd6f2eb63087ff3cb660fc4964b1f893ce5e1ca4e4207bd3a270d20b392b420a4408dac58cb6d0864c883d041a7a107a0b7b2ace5a0cfb0835616a99374197610668e3a49efb003303775929e34e3a6a8c46744ace2d777089cb0ea463cfa022528e5f1557c5563d529f6408c55ea2f20ded33ce57aacea9da7a9137592b439671e4177a8dd88d82efd6b5c3f6c42e40ab17cb07b74776b8642aa6c6f1f4bb0288eafb35bc7f5ea126f7ef1287d3a0d7f48dff274ee1544fae6d2b72cdd7b99bdd64141fbf57489eb84cdebd36f28c4fb76af7b4cafa190af754cefecb58eb96d58d2fee291fbe9bd01713e711c4fb17c71b6a1f3d2f35bf9c9197200fac4d2412c35359841a64b9f69c4aea1f0c47b2d4b10bb96c49df71ef4efa3a00c35e0bc73a9cf3dff66dbc651d986b8526a8f14c8b021072c3488c9e3003159e431410b1c2f6354d1c3c928dbb66ddbd643182d7e2c148328dde6a029c01c3d74d07060eee8e94425d148490935a212c7c25117585cec499cfac5201f3c3e46542324ba1c68395c8905985ddc7b2f0c69a653afe96230b851fa441aa50eead2767e20e38723f41cb184952dfa6c01e82f9c2fb2c84384973f35a08941112715165075b36ddbb66d826e9a3ecdc75aeb7556460c102b5cd9405be2cdcc0412acf072c294327058413e016365d0193e6fb240e992e5a5082e7dc4b88ac10949b36ce2341e3c50d48ce10394293e0c9149214ea02865ea7c31a74f6b4e16465974c6dc191472798c9a8c949af8d09a2c14d84b5016286e78a0c1882cca3833e80918594f78387343196396b843469f407bb448c1014b4d0c1cf2f09192464b1b25cc349161adb52c1002b9dac21f7bbd9e3014856e5dac10eeb9b5893ed4a939ce05a24253b539548411c28b345bdc5982852b386f70d853660c30d65a1ba8ebacb5b696012e56e6d0eacc41a14b132e78c2949105892f2ddcb0a9d15102894605ab0c6e183506258e929b2f8a2a4a70c4184e6441c24a0621857088a1842758d45153850e2846065cb7591f44a3d148b8f75e2ef470d1878b405c0c52e282907741837571359dda66f050b3e3ecb66ddb76c33d81b6581a3439dcfb0468c352c60dc33d56e402c94fd785b5d6fea0405d67adb57cc828210a3d56f2c8412368c6831836357c11a8509f355cccd0717186508d9dd1c345e7429f1890a013ea893874498aab6f87aa74858cbbc77e6dc0ac2b3cc76e81b66ddbb060a14ecdd5eeb204c1d5a163b8de62cf9b31ded0808556a5c9175674b0c2628a3f5daeaa5ca5f0db16469637ddd5810d0d59c6cc505b13c5ca9c30bcf4b0a78c1e5c380346d18c4606153172b60863a68b2d335cc9a9a3a5842eb6f8420a21ec50d1859e12aeccf11204134da8c90246166ea85c552f8ca813dd93a1c75a13b66ddbbee862bf0803f5c51851498a6d8b13ee094292d1a7761d5a41151c683a58a960c20939c67802a84b1a3b5624c4b6ed04335ddcf9e6f5617ed6986df3a47c9952c0d46ddbb66dbb6190b5db367390a2002c7875d6c8e0a70b9a9722703842101768aa50838610961d98b621b0f4b1b4b7d4b6c4a973852b8f119ba03673cb7282c845fd2f5d5ad8b3596b6d56980e2a6b8c386743c2b37685708fd72f1dcb32280ba13659c6f87ba1f6e831f3d7ebbd77a2d0078a7b034d013be27a4f10d578e2041d18b054a0e204ab14c70b1d3d64c8a0292266ad15b9b0d65b0b0c6fbd0ecdc9b3dd40bb5eaf38ffb4a9b18115c61024051a2a4ad8e0c58f0b6c7058b3070b32e86419b4c51705c76d4bbf6ddbb6fd30284e4b0e9638e19e2e5d9f3b4a76aab5d66be8c6da5bc31745130260f2c1893368ccdc21f48405b6d0f9418a1aa408a3a78d1e403306dd189b419c13795c28b4870c0c73dac8a0072462880f0002028b0a3d41d4292376b540faab2b23b18441bf6511ee9938b2fcb8e0c78d1053bac440e6892fca8cd1654f172760a92770a958349c1972a042072ce4c8d12289384cf4d122083e609011e4c2d1939a1d20b85813830e325499f1610b0c5fac38e2aa8dd315634e8882900e41f0b0678c31b82e62b268e86245137dde70e1851516eb6a0c9abf5ec119074df8e74e0a57747726578707bf61d502561577ca74b9635523020c973e5608f124cf10b98a3a85cc74ea296938d12d99de8110137287383ca0a132063429f4f90be7ef9dace58c6bcb09df9b2d501123ae28d385ca0e59d41021e50b165d640983868a2c47d42a5504b2db0bf7de9bc255d7398531a7863d4060e1414b0a7e2c9b1402852d28f834c1860c22a6f0818a196a587de80b8382e0b3678a0a2d142ad4431e2c4ac0e285acac3648ac699a82cc67adb54c6fadb5d65a6bed10d65abb0de19489a30ef809a3e54c0b59494c6927ac8cd1a60b96174ab892840848de69c17b3184b828c2cb0e7d0a4591a6082c391cd6119c066bacd21401466d8b17fe8c31618c957b67db362e8f0b45615c69e189516786afcddceeec81016914c24c9628600a95a0842f2cb840021a2dacb001509b25aef0d305dab66d83b3f9f05beb374abd88f981883a695e78a126e74f173a646cc101081aae164b525c7ddbb66ddb9647b6165cb65843e80b23809062c30c5904c9b0c30f5f78f14541038d18e89460092ad48431a706a83b25d043870e191cf0b449020ba73e34e28457df153fde0c4b94276a9ed4047941a748ca1275f65c9185972daab857b080c25a6bbf1002396b5198f3d6deb1d612d99124d43cc0254e0e77a464a1c1890c601168093c337041c699ca050935f8d0253625421a211344a9654d17d3e2a6ce15385a8f0d5128e1a7ce155bee74392205314e50d1420e5bc4ac162e6faddd33820e6286f0e385192d94d01203187ef82451c49c306259066199f2046d4214420628356061040e41ccc8d4d27c49b38410377071e4c4b66ddbb64d51636dad4f0bde768503578782208687385b94e0c2192294be9861f3e6082ea09823c745829e1b4d0cc1d2039d42341401480d08c094c04d187fca5c115168080c1a98684342c78515f56d896d0c98e58a28c3e5bee8f202478d90b0d65afb58685a35640183115450d863a5b0c0147a9e28a402154590d173234b15247050618a1d665750cce0d112e64b0b5d60a9e9b0d870796a6c883628e0f97b6f7b51b3b11ceeb491a205d826073dded21d42540282ca04828bf8c4d5e667101613b5b3e20a278aa00f34aed62de1a7b6f998a2e5083d83f0a030c316b438246c4106991ec2c820bab084b5464a4bb85962cd746a1f57b42eece05d28d65aaf367380a84ca77e4056d3a9ffba0d7d5c31cc15104c9dce895aa585826a940a8af3814f587471618910095a18163c36478419fa3d7a5c34a32876b09ac28827290cea6090c2842b65f23881441c3c7fb15022098b2f615859e14d1779c01ade88b17343185cf0c11386e80bdda1df45a00dc090f1a687287860c10a0c2d1688da9c1596b84325871a624974430c92828f96397ce4bc929003440c42080126d01765bcb54850f17ad033673d60c5e0a7064259f0200526861f3a4c7c59c2042e63007163b0388213395094a34616ad31e3a776e7ca2a50029c50c1083657e6c8c913dbec1da32623a52623b018353da197ab23632d74e9709d30aa174e40d3c40b57acbac446a5076203f4db6f39142ac10e4fcab8f1a18c9811b40d983cdfadf950c7cc15327c9101081b26a84346d6971db6dc60c296db26053b447600656561829d31bc5cc9132487365300ea12a80b0bb1cdd97491e5b7dfaab8f96dabd383b5d65a6b6351d0809cb5d6da276bad050b60c2e77feb77cc8318aef890c54f1470b418e4454a0950c46c31869b2362f819746cb031e30819de640123851c316690d952338386d01c1574189af32111c20a105a7238e20527e8b8b0c20d78b4f0b3c60a0b96a32254b821cc0956e4000395199648b1e2094130cca0868d153f7f8dfecab1d682b7d65a2b013540ec40278a31666a3df0f9a28621c688d113049b13ba388a53e30a4170663033458e141d55d040869a4034a8d043ec0ae4f2d6c271aa47e61fe6005ad3c30f3ff86926b6d0c2e5ca9331b290e28d38c14c40a4092068008485192a599c156c8ce09382096e9e64f98223020bbc0244d1953b7488207386e0e10a3092a04185cd0d961151288144153db010dbea0aa19b6e6384152c7e18446788137e94d152823228583168ca10829ab4f851f3429c316590b873cffce0c6cf1a2fa414ca32a186bfdfdf3634dc09dce1e20b2b4049a8d0030d596688828414c03803050b0e554ba0223614702993268a17405778b680e9a30397ab2ce440f1c56f48bff5c1faedb7da06c8c093660e0c62bc2c314b334309659030c419247ac842c687e50a4f0157b8b5d65a6b6dbfb5d65a2827682077e68c1381bcbc99420b1662a3d24371c30605a03f7a2b06909723e89459c2072fb1047022c8511e463d87893885cad4f006853676883b326c2184202b305ac4acf70e6fed96b7afb708786bad517523a35a4569078d468b12dbb6dfb66ddba470994efd653af58fdc4b11339d941e6a52a1e21dc0ce2993850e942a584cd175cc80c9d246892c799c7002a4621ec0042b8e8d0954b60cec0fdfbdf3efbd7746031c392854d1850424c2b813a0f2c2943e4160d99112bb70a6f89bc51b409c63b84e89e84d8d769c550a5b96c85203095c140008268ce033484f0f53f0e953f9fc117b18294111676edbc51af4d45ce5a4e8223118436ba20a9c2778001d29c20f0e315491c6061fea5cfde6b585231efccd7d3e15e03787e5c84a1356992064add2a563632f0c9a8111f4868c12ae50b9daa2858f6d13831a578e27bc680163839f2a64c860dbb6cdebb6b9789bbadfb66ddb8c26acbac5e284d52b693a516914dfa8a995e1d6ebb536e5214ea7ea79e49ec914405d02f1c9428e0f3191f2986131e1050c2f5a7ae86226b661c9d3fdc627ce6f1b8fdfb6ed66517cebb58aaf3110b9af7fbd6ecef975a3f9d4f975a5c943a4d1684f62d7bd7b8837fe5ecc09215e973c7e0c3dd4a9bfe31e6a7278c375c26a531e3dc61877625022083d2454111b95feb2c1b2e2ef5f3660a8f0d7c1f9e4fd7591f220c1173b5a6ab073650a2962d77d3e3dfd7518e55163d777e41149066f333861d5af1ab17fac3cb858bd72025ae28bb779faf80d181110302080a0b79e0326a594d7e9f56ee954f75bfe8df93425b3dea96e90213ffd4e6f39339552d465ad6438d00244e49fb74c04faebd4250e22fdb1e3bcd5f307d6c17c1a450bcca7518983f924f14cf0633ff1d661d5a5539761036642500da84b19faa0148f24f8eb32274eaab89e3fa6530ea6b71497c77b9dfacd4e30f54f4eeaf2e620d2a75b6fdaf0c55d5b62d05f6c5f9c4f7dddfa77b124a38c32bec3acced17eb1ccfa0e699da39df61d02994fe6d3a483382dbe963a889f0634f3b0f2dcaa8c7f5f87bb36e737c13e21073514423b363fdbb301b32bcf09d9d1831e00f59cd330c874fde69f6d8d5558e60650cff90c3548f25355bf798740c0afd180990bcffd9885f92922cff9d76a8d5561fe76e7183997d7a56f1ce8711deed8d7811eee58873b364320d36ff6c6aac733e8af77d827484321d5691eb9a7348f341452a7e84bd1ede66e1d54fa94ecab087e7aff9d9786a74f127d9210f43538a34c8dc4183c61981c419b7ddee679e99f6b4abead7994320c427de6b1082fbefea8739cbd82d83c5f9dfa1899ccbe3a9eeaacac2c2fe4dc79fcf86d9e9fb8c6cb50036f722433d5f49f3e29969a34bf8048a7ae81749aa9be9733e8a9e6db3c4e6f229ffaecf1538c7f527ddf3eb3728af14d60169bee84ba149a4950406cfaac9ad2bf5a71fc18074f778f71c7cc5a1f6b1e3b07b49fb7198bf3c69c5b5cb1c57252d576b0c4b84cab3e764f71fc273bc4008e47020e9ea7eeddda5bcfcd53f7e0a49115f43cd06b2884bae735e460cb537a3bde86423cf7386fd2d0c754b6a18fcfbf2b7bb6a664969c77acecace5ac9d9cecbaae73f98ee470bc78ea5e928770fe8020e820187a4a3ebaa82be151869e44d3125ba244138661e85033e9e66f0b93bcf324ff94b8d0c7c4b334f12c25254d3cf653c24bea2bb924339f5aee83125a4aa284925aad25b0e55033a4add08d3cf42fc449ae84b99764e653925bff88a4a4ef789947974f270a7f78eef21a06a1eec9700a04bf0c290d0d790bc44b8080a283a1032172ce4131832148f405c4b29594e4507308f72be129f9490e26f954c2fde0db24af49a11f79e8dfad12098ff25da16324a423236cbb4c98f5224cbd9830eb1dfef0287b4a88127aebb6cb7c629a78de3af5e29be0e75d971b5c32f32974eb5f18863e4326895b1ec72a0e973862e2a489e3a63f4fbcf21813c85579312f3365191357c80bfdfbc010ecbce59db7fcae994f2db7feb55aadd6e7792e1074d1c34b8078dee79c7b9ef781127b53555ecbd56ab55af9152474e961966426ccfa5d336196c95f2fcce44dfef2a64c63f2d70b7c7dd784d8f2df045f32e49c0997b9ee811c28bb50081b324f35dfe965be6b1cd0bd97c710bce75fcf04d098aafebac4e3082f9d094ff19893aa9733392dc694ada6788cc9b93cd6cf2ff7e5fa94bc798a6675ee61ea1f1e477807c03c0fd3d17e79eb77cdbc3361d6ad44f3368c659a77241a2bd3bc1599bcdfba24c3641d9c0960725b430f5ecee434f480c9654dced4f462ba7476346169bce520088214fc2808820e3545716969c93f098a7869c967e863a9d5fabe8f8e17e66bd2463d898cfc3a17d3772d8827dcac79ea49feb5c0243cce57f29627d958232af98e1fe58edff11d2a39d49c177c87492d90c9c61af1fa8e1fe773de0a8524f9383f9cdcc5a3fc71f1ec2556f2161e937cfad70a85ccbfceb906377379f612b7426f51415433bc968ae4b20c23ca07587739d40cc30758bfa228863e3e11f7bbb8429ee746eeb991e7799ee731759dc7e4791ee7e55710d03f073f974b8a49c2a37c25df96fcf3a5cff351c9a77fe10fea4afe791c15440575d6c83b37f26e9cddb5583e97c5e2eae4772e8b8586429cbecbaf2047eef22377f9e7e125f53d77d59be6bb693e97cbe572a8d9fa7bd3b8dc955f4190bce548def2af853ff730f732ccdcf4749b9eea2196dffa1c6ab6707f177e41e45fdff428e12487a249b81f096f7826acfa11be6826acba11ee3008acc85b5e9439421356bd55e98f9b9e4dcf57e708cd1f6f9a9be6ab6f78e693fdd162f9ea17cd7c6a79f58f069a4f43439e17683e795ee70c7d783eddcc2729455174d13b849ae2475fb8c5bce834f4210e09717a314f371356fdeb3ad979edbc5f2ef1fd9c082a6e9e20020f115fde7c21e2cf9b386fc8fc1b426ff4c01103e7ea3f2270c3a3fc3e5026be7c81dc95c71250e5c57a62c071fe7de0abfae5e407825db781f5eb2fe9fdb37f69c051415f5dbacca3eca5cf5e52aaf9d2b95088d3e72dffbc952d9509fbbcfaf77161101c3e3e795d862ea5cb4c35bf05b6dc7543bc0448e89c0321f2d07b3e71795c0284f32107223ae72151ee090b3decf93494c729f9a1079b8ba8b4a995ca33991a2471902134433333012001231640303824140c07f33c13861f14000e88aa4c544492c662a13045510c832010c30086210400000c000631c62c5a0344aec8650c42440201d3924271f94b4cbb6210b10a946717d5ee0628a9212e982b6da126ce25b1185453f038f2ea7547127312f3a9cc424236df4747b031b63066f313b256e6cc7c8a9f369f45fe2123bb130413bee4443dce4abff0eef0f4725844b8e4fe0a1a79d015b68e22500cb51261432829a1ec176850d16811078a5edfa8b748451ec34b5d18473c86b52c753cdf32787634a7abb7227786ffa0d87c6796ce33fd8c4df43abef4da7b7916bb33c74eb3770756659defe355c7abf434507d9f827ea09dc2ccde3e5b99f8c6daae99f9f945632761a43ae98bed9ba0976b07058e8402d63be993d5ec3e1e5bb5371889ef94e65dda29823cc2879ae58177ea14fc949971de320ad27781a854f87c3052c4e78703f58d45ab998438284ab193030823cf365f82e53a515457e7598d88fb03311df8e115a36fd399f7d09fdb154b02245431f9131d9580a2a4c7b7319a8f4ad838b60e76c9464c5ad963134836ee4025707c5fd0d821fa841c0cec6d9c50c39c29c62ef8e2e4943ce169134d13e2be4a787ee1643eb775633c0ae8df84e6484cad733468e2b7115c866a1c3924c04d93ccdeb23b3aea03aa5ea07b5911a475e9f153ce510200a994aced909f6e64737be3b9ae6f5889adafa142ee16bcbd719e86fb6752b8fdd90e6b930b9fc144ccf5159e2eb623e8c34a96f889fbc42ebd8179ff7c883d6e577075140ddf3e4b046ae169c3d5d839825859a6a55ee35dfc4a19312185aa6c51eca048a041b787ad40018dcb6e8048cf43552183f52436e4ae22c9dddafca09e82d3ea240fa8acc358d4bbcb31f430a32df26ea0620c7a689ddb95a781d9fb878a8bb4780259a7fc67dccb6922ec7e684232908182dc043ab6153e33a6d2dd5d541ac9416047270eb1588c3fb2423e61d2c07b2d48e75f337b55b2003f25bf54d2bc626781200aa02023a7ca9229dcd376e6ae829d9278fdc0bb486b77800329c9d564e99b2daf07459ef4b8b89ad10ff7c76ada4a2e2cd5f28d396260bfca3dfefba21a2d0a0cc5756b62bd5200afd9f2d9ae0d5947fff7c0ac75dc96ef8cc7d84b5273b985f4a021a46c5924cfeaac8f7e039822d36078069fb664482231c97e5e34732374727d54caf9d21b345519842437b8c0b28145cd2764ff07aacea24211d499d00349147763b9c9d5fa16ff5e634a029afde4a1d72f0e02a394fd88a22e64ec71d8bb3b2794d710d1823c8949993b62f2a85ee208c4082a8f6d3791a8d2692eac758a62ab4b23934c06e997148a041759e529e56c3576f47062abf59848f09445be43b868c51a250232b36e1669f1f0ea53aade865931e13b60b6c77448820c38dce7859353c5957c105c9d3055d991a322412fe82bd011c3b44224056ba0db7933c393960364d2ce65826dc06e1ea306f3503c32e2df0a37069ca36f32237f38eb9fe9867dcaf110491ee0786e416f2aca5b1faaa704fbedc7b1a5765eb6f20940c5d094adcae5040e6f4ce1af5e3a8860dc5ad004d92dcf54850971c631d558d9f8f96c58c4f171212bef00208440d6c75069e0123d2f990c8955de134b0a655281f309c038735c9790c15c4294199bb502024e5929c2d102e39becc9479fe846534b489af38116f6856f2e0da34c9bf60b2f146b4ed05d022e96b42bb189b232556e9361e9075034996e73a7dce10a0f12c60dfc8c825db1a592b7c256608a71cfe14ded7662fe399f24a92e80626475c66afef246d1d9f2999b8b96606a80696b345811ace3ad00a7981201024f9d8712b733c3edb4113389479f0e1b8e339a32a25f397c668a19347da3912003c182141002ca2e22587f14c9e37bb5f93f55e0e7a1ed580d80abd61ae4b15b9d500c763412d72cb8cdc0280b054764cd7e41cedd9af39496a8d3691e4850dad2502d9b704f48f55c121af45486ae859c718494cadc6bc34821b78d23f53106f35e4c49b42fbaeedbf6bd1fbb88fa89c5e20b76384725676974d0edc0915c9da73676c39e4d5ff69aa7e67bf4eb1d50b957f369f4ab313cdb50fbc34c0a9fe10eb3140daf43ad55ce696fb316d5ee716e4738c562aae558f32bdf185e748bb0741b9842afd5f20b2cd59220b10d9018a6b87cd726ba0ec08b892049ac5872d6500b8fd93b7f5e79760d9b5188b88b1404d6b43cf62930e664402b6674770afa0ac80ef1b8bd501d59c3513808eda13868a75ff209c33312c2d92d10957d364fb476172fe91d58348aa1330c526832bcbdcf726406c64d7d9c448c7841cc9487586f5fb1fc2024287d761ad97f52643104fce076e7b8101310632a5de2b08491e627add4caaf3aea89a27b2d2b457a593d4fbc15e160a3a04b56358fc3591cce8f584c180bf3d3830cbc3ffc304035468f80fe75b999741ae9c4257a35c88547a063b674d2844bf9a7f274f03e453bd5613af261f6a4b549049588e5b2b345cb5c825e1c2cf3bb991681e3a8d5d4582cc2e197f9a5d0cf4352d82c23d550181c271315418941712d53e31bab8ea35aee59e1aa469972ff089456edf96f40527c74db9c0b6c8b0bf686f0290540e7a87613f33e94a5a43f446e92c74e244a80ed0270a2d112513b671c63f6524e7d9cd6dd66661abfb9b93c8c73974421eb4bf86e8931aa838c4d2d828314422f3c18c70abce8ab24e30066d84dbc2cc8425dbd1f0960917ef29b29c258a2b702b784a8609ca0db03d3352dc223f4d1a34ed447b4a593dfdba50ca038eb8d088c1f7289f189b20b60a1a808c503958ff1e2555e5450db1d44ffa976bc85c233a9b66792c4635df40150b0a54d86d3d8394d85566d8bf713f069c5362148e94f604b4e431414833c8569ca106ef6508d0526e549164d0f5fa4cbf0e5b984cf534900bde579da6b51d1d345bb43b3ba3a3fa30ac1928cd6e088aa26bea94172f23812df52424e31172da1cc48ad36ce1d3ec0280be4c46fe1f66e5d8de9ed997bad4c96ad5aebf8a3258219a1a3daa758ba3b48cded0057a78638128c3963d610928313ca0ac0e32730817034ab305782239942ceddf8460249233643c7986a6ca6041b1347a436076daab11226b5c234d38ca7169b69d8a47e2b9308156f58041d6863cd3d3f4b9ac2919a4022717b869d30d9369734c6c487eef180b80eb538c23e69b4027e0eb20a111aa8b0c8d6949dd2e7ee624854d8a0692b40d9a58428b3d9c05534d2ccb9fb7f9c1d933e07853030efc7770e43fa50ca72599c710c1d2a6a091f90b629f25eea6bbc8590512e2f42075d66ec947f8eec8a62c8a49c98777620926b94969862e301102d37fb0b9745e4e91ef7d4a6b88b0371d1d1be9655419fbe4b0e194e03a368182115b84adfce4b3be184a6372dd7c10c7bff9fb8fadbc6ca8df2b19ee0a81fb355abc6ba3e5ea1228a01b168d48dd9c575a3d0d93df21f16fb19e4888a5b1c0afddcf8c7c5f36b365b1662b93d2d96135562594c29529d18e9bdbff96bb03451efb4c881f964d266c87a71a89b5d22c82cc6673483e3c4e28d966cff7c7cc1daa4bdd433985845c418a32b4088d4efd420ddaedf95935fc0a60a22ddea1e73fcf8dbde53fe9de888dae010af22598a5549c16305bca7241e05b2d499aab7e419586e7ce0183040e959cdd2d87a7625c716a04cb9571e1cf91b0b56b04d8c8dafb43b8b424ce3cc95656c6e3424b8d4c268ecdb412bb269248e55c5218a7d2ebf2ce91028e45895796c73458a0321032a6e8f066e71aba560aa247d88c634961dd1eec65feb5cade94596ab0d51ebaa676c194216f137c83ccf48b00d3a8a48e8bceef4c0e23cdb493ce650458a4c8bf29e9bc9e376b9bd44656beb308e9417520504391b241412f493ea1ce3f59b8f39811a820ceae6da6fa3c286c1cf0281fd3e8014f5a8c2fe41c5945b4597c12248dce54447ae70e6e231373cace143cfe0c788ded98cc1ff990bb28cc5a780949c696951b337198e9b3b6d97f243a3e34a12e6872b5acce1e4bb5cb136d204a350afac9d38f11e48b3077c812e28e81685bc9219c1192e82602c263796cf0908202eb2ea28e9e740839b8ab87cd62436b63e8e50c2d601a03577e73ca9923f3722c8e3a9214b92c37317449f4e013168263df5eb07caf92bc17a08306c1631ec2de3bd2efee84713704afee579fd52ccb7fc34004a46853e5e3f2063adbacdfbc671ec3b2483a9c79fde518bc94ebc48ec4aa9cffe88df3298b7fe5e6808c40eca4008e6bb909f066a45dbd9509442db48dca0258b80862ef95428698aaf102b75ba08077e950814a4711b3416c9c1119f2aaa2c8d8d17f02e384b86fd7603b62ff7e417c300aeb0f1e98015dfa24cf3e4b3375b5a2a9ca3ff0218521fed1513d3c00c53d3525ce2d2fc39dd39e2fb56560bd7371f1bf2e65d5890846cbfcbf676886984c9544787c161759517b3bc8b8916aa8a290c6d59bfc83771539eaadf02b080b367cbc9525e0b51b3c9cd234ce3ce6ecf9128dac82009b13630a9b21da7108339ee35b8efbf13b3b8e662509f54b7f8d0f2fa9dd7b2c730f1474314dd99fce98c6316f00b10437d845373300368d80b16267b2db123e878c2a333a6138de5f030ca6f8eb96e230e56b0b871f17a94c9074eeddb2643aba38f7ff18db910ef879df31e278a5b72e6eee736f1d74e12bfa9cd0bdcb9bd471f017a9e3f47c88d97a9403d4c26f3f1bc7222db6d050f89a11a8b9b03838e27d5b8359fbb1645d9158c02f50910d8658a21c68517454639fd73d190e88bf79416d2644245204a5e97a4c3d2a2c066e9690529a3625c7aace89743873a36bb602a06ec20e359770e53ff05f92a998381270ed44485ac4b1248e68b16d2c3d384581fc9be52311205124a5d93034be561d6a02e1e27176eb0d5dfae85cd8aca07acc5986ca2dcb4961a5355a45fa4475ff88d54f015ad3cf4503e0efac080d5c075df0fa38c2d870fbc7ec33ea4949a7cef16e6c1eb0b08ef1fb712ab7c8e19d8d2b3a732414fdc285021b5c2a4678f84f63469c7d065c439126a79e84bdb69b066ba78b3971201513a6a54afb7a145ed538b6f38c6d25f44c6cc007307a15fa78133d40d2b0313181fa6373ef8d9a0b5575981110b53a2c83841f1e44816d8b50b2e5aecf942cf505a75624cb034a9399bd81c1c54589a1424fd6f176b60544e1ea36c2f703692970e91273180e1b808c234b777344cdbf4ee6e4620b1c4f60ced5efb0218390e7213e43183bb044a7ea35a863548aeb0a6999f337a86264cc1bf53b29d6070f99b8a1a3a1b5eb5e02aa8a5eb329e1b2021bd9bd13ecdd9d59ea7141a67a83704ddae8eb52b573810aa9afe5d3e8a3c835165148265751fce0718d166c66d5dfd9841b4f0d589985fbb302ba789c2d954dc2d8052d81e11fb115e59aed3385ca50223000f2d40e3b34cf4bb77f4a9b0052c72abd1414e64144ea22535d4f35247d937f33eb35eddb2b9da166e0262c1d76b260ba74dd71ede4d5010eafdef150c834945aefc080b6ec22a79f4e61eea715861b3cee1467a3ce2f588c36b491eeae6bb94453b67d7a6aaf43a484e98223a401fb9a7c4b25eb8d8229476c9d38538928e499422951b90811b1d9833adf54c9f114058d2e817cdd0c51a2630d392a10e62afcad9b0298194261209c4cc3451e3cf7a650b353a6e4186f6e456b6642413f9b21e3840109a1d4103d78b6484bfc8d5b98d208b41442fba12f736db21708f60983909c2d2ad5d2e46d4f6c44b68277cc485d004fd7416aa5ec27a3dabaa8b52de2571eed494280e6eb758b843fac04e3e74a7609e7956c36adc3de92505aab589089026de8d5943f44b383a66025209a68dbc46c1ff035c06d7767483f8d525baed8ece01e8a05c6629c7f085e49086cb575598686c94c3435c120cd845ced705426b88f6d5406a3bdc859c5da06978dadcd16f52726b0a403f660dcdee2685726a51dbc5f4a05293bb1b9378d71dccd1a7828376d20178462f32d9ca818c0b7b36a155b3a8b551bb07a468e6a028591c5742b6da0226fe504294c1b1bdc9875184294ee2f21b05eac8cd85acb8e0104c55b18850cf2029b8ae32b5dd411553ba209951820b31818e8283a2d8fe7382e0deab5636a0154a33a4d9de54a4ac636c0a31dae0df5d31b272e07c33add9a48cf803295bad2bc95712725d8f301fe0c6c46e99e1da0e822bfeb9f4ba6b4cfe54d97aa323100e2aca3b0f5417a0b3c47fb8e445b601c4d269ea0374052c4d1998dbee1894d41a3dc9e697404120a659a5e71d6e80c09d039f82eb3e5b4d6c7a630e12b882b49d464c8c1384aa1cb6ad3f4d78b4a57dd6c43df26f4295776241111c81972b955ec03dfdb3811806cad701ddc5d4e50fcb0d33c7879cccedd243e1ddb15aae5ad6efb7a03c9e154292fc7bbc7edd53870a159d9b48f73a2461b327a9388d9b82d42bc47bf5962e3bcbbeb99633a89edaa4d6dee954a0bf60036a53b7eae52e926e7ae53f7b932fca8ca8ad2dffa9dbf5aea8623e19cce1e4622705515f6e735ab890d8c6c1d0d010f531ca122976e70add2f0a1c076a310755597e319c08fa8408ecb55bc020593bc3e250332231a70def43de89967f19cb0ae6893a607a91113bad497a894464ff749d8723001bb4eba4a44c05af6dc13fc82b1ddb54af31d2d7341a65e6a9db50e7fd880f8cb69482f7b55b2fbb105dc3d4356b69f65f397f0391e38448892108a8448f7286b0b2cf816fef8c8eec88d2a3acd1803077a1dd5556483d242dde49a3e73fd94a4b910f054d776d2c4f7220c435de97a4116172910260667dc926148d562de24f2c2cfc4f65a22845ca894829ce2ccaa6ab42b68535d80fd8422b91bbc2710f7ac7799240be2c2dc31166a1915aa91e69a133f346b57f32a08bb7b988076a9bae46fb5af827347547cbd76d6003d75415600e7f957e82610817866b7e101a5d69f9604ef532f38b9fb3edb0b395fd2389c567912e0e9d0da93b54d728a09c7c1cb1e0c07117e2fca8f4b55ea6af46e61fd3b85e1018373f0625f36e834dcc46be7fb7b8c5de766030a8d6c479857c1973c6b36676b8c431c89c6029e242830e47bf986504736ce9c774d8c350b991a76f4b394ea54075e1d9c2ec48b193727508e4f8ed4abea5113d7f5048722303cc470f8dde90ae167f9a37d2cbfa69d116ce9adeef1bf2e94320cc40872e17de7f36d80d49deff5289bfb0923f0cb08d8bcbeafd69461440d5c328df08e3053c9c97eb4d194f348e753c4073d655d4744d0e15559d9024c27357e7fc22b6acbd66476958d3e3771739d2f066c0f7d93faee5366591e368f9a21d41f9c408402f7e97d5a76d245240a6a8d40cad8a8a23bd4290102c66a24734fff5ff4a944bdfd40d0c654a6978d31a7221c8b6a51828d7a4528f3bb32d254797a02e8c47bba879f5aca165d4dc20e653cc9120ff39d814d56f501b370e62cfe89df7e00d85e7acb2c0212081526502be698426c334e77c9daf5d29aa41bbc359843c891ca372c489845615c2008e6041cbe7a472955b44d3bd97fedbea241838b5c372243c175a14cd61712e84eb24db5b2457c3cd0f8b769b154f6c082d6e4aaa8a124248154168fc0a0b6c370c6ae99e718bab494f6432683afa914ad1ed47baa5cda8b61814a2882ce8c5e9d2f0b9f27fbe09e8c232848f205491477c509ee1d7bb36df686fadca21862ecb2619c9b9af9ed5037de30aa9a73333607c469a216a3ccab35d672819ae2fadd254a653d3339c6916e7029c82a3e6b2a73f438ef569b0f32b309a826027d4b0406472366ae6a25a6757d7e0e2db0aebd8deb84ea2f398cbc39cd4a4626da03609687ab16e073b382c2377ec4661bd5567a15dbe06cc7b22fa870c26c8d66526062545a904340c1b18803b009ffa3fdd5a5918bae3675ca6d114f16fc72a1079fd270d58d9e132aa6353c101edf289a6b9cc3a0206d42e6b98ce99bb946fe43277041039ec12fd774215cf736ca27b97cf50e88e2197a24a01cf666aada860480278e97f1376d7d16c7cc970dc74903ac9f3fed0001a290aa0f9260c98254c5cea6a6b3ca728b5274235573be8bb96af15d086278826cc507fb5e7a1ef35c6859a6114991187c77ce8bb8a8f0c44e293b3d3c414aa807b9e6fd8284e69083d449154ea4485a8b1749cb1227d4fb6d9adf8bc11fbcca5f856006b21c2100582e0aaf815a39289852cc15fd90f29bc73975081024a58404a709131bc916467863436c5968d658fde70a53c39b3fde72b49729ad556b90197efe042ce49862d9cfc39577203b09c4421b91c6fbbb7e66bafcb87b3c72ebd77b84ab1942d98c854fa24ee07c4d051cb08b85d7bc71c8a9f3b989770cff512288a0e1d98b4c906cf8868cd27fd088ee653f11542ca0f4d6e392a041a0cc67af79a443a96e4b650b781eddfabb711316ad6fb99c9ef9420c11a7f793362e771bfbfa99f756b7b24dc16beb8d89d393803422d8a5d654e3b9f25b3db68ff27fd283ba488cde19a1808252398005d6da71840f814a76bbedfff2c89c1837cf38f357d7a4d6a9713208687cf03ec3e526d53010612e7b4ed5d650f293f76b9fb2392e280a9fdd3234f65b8948455e28775736d99dfe9e6dfde035b19742d6181bd64cc742bc5b92736b09b26a25ee71898c06d807f2d776d9d96e2ab95f565c042c37d8ab068b2f5ba5d5c91b5a5340acb090ca70b59384e68ba54f13204dfddc618d38369e2e3592eb98def94eb511ddcbee3909fdb3d654324524e12e46fb34c1b917473e01db0aad428f0bb92d275ab067f8da1249873de103f55de0918f28b14ab4d88678b4ff2a07c91564609ff1dbea4e38eb1a94662a5bf6b3ab74e481f9841384f1b4e4b7972a6bd1a1dd47d2a68db74ed1680afd2736741fbaf4ea34163d75e8d7ff501ce9b6c4f1b9ccaf05dc6f019cc210b3b433843c7572dad4d0815f6da8155c1123773e6b022b177ed9a3486910c6baa052b6f296bef730308b057d298b6db2b47eb36a2e8227ab1df5e76aaf0680159981c0443505aa3b55a93ab4e370b5d44630243b5fa66af295f6e58d058821d36dc71901da1754a5d807a9a89b371f0e69b4e5b2bfa2e7d69d85c023262fb5027325e0bafb495f0f5524baa5f8431b7ad06e1ce6adf1e01c25c40fbf632049aad3c585e42fd8dd818a545a294e9b6d69bd7c7646274868dc66853b3a4da0cdd3a6b4b62d0beb641396341c1e61018cdb46a8f53cdf256cc55099bb220fe6623cdb4d6164e3e2882317b7f8febb19434a52e45810ab7e276ac05a53e6962b80208335ddd1a106c09b834a00e3b9ba55dd23a9e08ba6ecb6afb63ecd819912c6c48a6a1839165af1ad62f073bd5ce832e561d08cc11f8b50b84edba490eba4380a9c5197bac1bd722d5acec09d16c5c327b550a01a603b6f91d1f0177cd3f876f8f7d34edc9b407dad881de812ce84971284311fd372245b2c1b46139776a27f429ac7be8475fd6a2d898557abf34667986de9dd748440f8a66356c45b49013b62d5603fdd1c6ffed3de80b982bcd7dd3cef6fe58b45afacdda313a75d3ae7859853363d2bcdcb5b0d0d0ac27443fc849fa53816d2df7057b34d6ff82805575a4354349b96a5355997a6afc1b5d0aefe3d141f5c8180741d7ae53023c3241b64d69c429a125c46f142208b429459f1e7804b89617fea0288802c0083ecf102041566c6c74e3900e2d76e5a008d08aeb9a0de11374981e0061941718c0a82c5750c5e3dd3ffedd3a9620c82ffef6cc25a5d83f81ba50d42896e94fe83f82b14f81f34018b2925c2a5dc83238c837478a2be3f34b875d04e35b3b99d029dc8e804745731a83eb9e533a357c228811ee1c35b8039e3cee1c7eaf4ca77b0491a175972944cb9628c456e89abb2b66d67ed40205c3f7e76480677433c9c1c375fe1cfd11c80eee0a8e49abce67f5f8615114849f83d3b6b9c7ccd7caade47a59dbe4ba207fdc02c81d9277219f868d1405238a4d575df570c0ad79bfdc7143e11f51a0e3746cf598aee191533b14ad2fce31e6c1e98ca977159578ecf621a5d03792c4ca6fc3c002faf9ec58565654de87e4b3c4a12b1c77159c7d85c8eb8eb4ae6ea8f0f5b46bb217f9b0a09c3d80d97cae5f703989609d9707c3c46971a01e57009af3710fbb78bae17cf7c4c1aa05fc8bccd85ab9b534f26fa70af62a985d785aceb4d969b2344c853c76ebb875452e390fd132c796f2465258fa0dd1517e466e6827740523db66b45078ea078875d966d9b497630c55134a65692844cad5b94226f92321ee91678828461938e36c738cb9ca16ea803e9c8e77fa10141032ef056b90c8ade6fa0203b4c4d92f554f425ac65fce40b74a5865a3431392d466880806dcf759db4910cf1a8330e7a5fc9ad52fd222374b7c4e7bc6aa08dc6042b20821bcbb986835bf5c87942c70812d3df04473906a782f0714f28c9f247abe1552501e171a0df15d3b883463028a03ea8f0e6d0994aa7b87ea9e8be169c916da62e43ca954ab6c61ac47417ab57c69607013727a68e5a80494f898c12bee605626d6ec0d96eecb67268263f05df80a38d5407e91b9dfef91c26be64d170e5f9bbebd4aa7f755e909238a1f58e98350c983d2d38e046311c5a14d2861de7a2cb5478cc9446562c235bd5aa982e0f8ece1efd62d1b2da07127718d13ddfe743d8e0816a9f78ea7bda55f6a15229f0d1d33bb254672dddf4ff22134f48f657cc5bfc846353bfdecf98f3b053630c0072c28b081051ee0a0800d4cf00007152c60c103382861010b3e0043b6c4b9834d6bf1875dd24164bb4e46f9ff9097acf8856e71075d28c5ae516f4ecef99d6fb7089ee0cccc41a4c77ce1eb9b0d514550a34741c7569a01391e80c8d01231733a1d328ce7982a6151ac631257d899ac00366dc55ed34c4b802896498b06e1878de0ef200c4ec84e64cfcf4858c400d4681864cf114e5c17cef324a1b20b9dc98a52c2e28b80cea75b1ef60e5d6d56a1f4df83b2b11d80440c7e34df28eb3a69a569b5d296f58592520f06a35e52958744f8d58ebbeb934c4929d35ce48156afa44a8003c14ec69130136ad7068ba172ecc90e61f1a0fc086c155843a851837496b2d95a8b06a4dce0be4be46fa3182a0debbc9efc1a1b9031e96304bcf84a630497edb4576594a3ed20bab2f7ceb2644df4ed00c5229bb8db8961f829e6b795ea6d8c497fbe5266e17a9c6a4617d4bd4823e8303ad27a7c3026f35326d2e69cb8da42576f40667c4b7f81e810e117f049af82a0a3ba25067dad8ef390086cbefb7d8bf87307741b0bfd0e218a48d9b6853b68af1c1ad2821edb93c654dac6a21a1ee9527e562d1fbd85253a3003830dc9941f8c712ba599252e90f2c832299e200ecdbd80ec1b6fe4ad3723c0719bc562d310b2afbe602f5446e46832f2e0815841671543282bf50805ca77e5fcee227f2cbeb425c9b044d7bd71ebd9dc8ad042370a79941a8f00c381d9ea2165908a3750873fbadc8ec658bc307291bab0458eca9d0d81a8fd1b62397e768166fd8775c6278f1058d33b62f590460e6ef891cafa2ada85e5fd992452ae4e59eaecff75092473c8ff8c87fd29fc4f30cb0d7d0b680b72c66534413da70e0924b7f21fe1575bff8bb5fad4c200bf203b4e530a3b5fef1ef982d605a9807f3bbe53a82b40b040f9ee2048d861a1d977c405801b538b4530b1328d89febedea4dff99f6e4f87a1e40cd76ab6d7b42832683f15d1a29a68592e139e80441f17496180de7358a117271762d7a8a3f5ae0d27c11609de0d877bb89786de89acf9eaf942cf2e35bf6c3ba0b7731c1e7d9f24109662452ef4c586e5b696f587870447fab05b8d5596bcd21ad024ab6d11e602529119061184892491aaee3264a9b207ad641d19719e195649496cad7cfcb485034a5a845666c76a978fd399bca014381008ebe9b6a6ee32e7aa352679fad9915335f02596bad6db88aae6c5ecccebdf943ced2e48c8592af3298ea1aa9abaf99d03fc4435ac9ce0d45007e97a5583431a48227ed54c8ee90c047e41c31bebeb1ea7ed35e3a7c73de8270016b4042ccafc5d060421271036d1fa6026df6d933f11e5e55bef8f93e8d5de2e5f36d3c5aad84eb77313bc02b460365be98d72874914856a30bb5de87c8a7aa7c99eaf738e2a2a49a51d18f194df1d701b3e6f0be4c7b13455f953ba21ab20c9239664e277e051f1bf6b72eeee032ec53d6a02e89eb0f2184651dabccb0e74e7e3c5c802141171e5d6d5a3cd70502c637a6bf1dff436c9c6013dcdfa960424a55606fb5ad45ce3348884fb844cc3cb13c3af4d74a645914838497c9bdadf920ee0a3ff28bde965ed373bddf5e0a13e530ac48d34b70904e67875fb0ae6fcbe29dba934d44b6bb61c219805e4fe61c882c32bca63e5c415b6dcd9f2684838ec9120d3df86336c20f5dc1c786323514e309a083c659c0eb74a125ca124235bc4b6ed802d70ae023ab9171e60aaf258690b28900b41a757417a79a9660483dd673f12736a0f0aea1a0f02557fa01eead9158036a263e4238a33ca194b049f21b881bc04b14f094bd7c0fddc588be84a45d36c1463047645cd35dd22e0753776a7209c7cc1cfbcc2d250712d73a2bd046e5dc1517b02e853575608f4d7b5e9e428bca97b132ea744136b445a7410ac9ced36f4f771e5eb4447eef19bce95e8306a7d42ebf88648b4a11a4af286329677186594dcd89cce61b26d56d9952f9ea8d43f6139156ee890bba10d91a54d463c49ea60f2f7c0f22c403e741a147f5d6e18bb6e900333f3c56d09bc0ec00e16d17c627a568a20dcc987bffa7cc601808be642d0f633b6c743496bca1fcb8ae394964f007ecfa2ab0a0bf5e17544c941c9c26ba070e041eb1bf960ed95f5c4670c164f5bb63fa1a6e015502edbef9f62ac4e37b702370b3f192e67acc39a12746aa2ed342f0be827ed9941d40c35e94c6b1170862535309c6e0fffc004d6f2b7674f53dcf2c6a0f8448df28971879ba42d8eb32831de71ad1e734d296fc57b0e3b7f2b9201577c25b79050533c6ed84a8173bce268227be1005a7914bb5f702d15ac9eda10840ba096334e1d0d02a4d105887537949e11efbaee2adecdb30c32d5eb1f6801073f8858c030081d50b37d84703656b5605570c301b5be6a28247b2a546a8b79dac60e830230d3f0cf0b08f5dc5e25fd167c89aceb7686086ac2373e941100e8eb21d946a35444f0694cd5cd0be026dcad92f06d96ab638b3a1d13eba8081427679cbde49524fe000884dd8c475d1788a2ee016d261fb0aeedacbb9a7c91cd328d4074357e491c0590cdc02dcaff8fa5537a16174a1125b5e38d4898f7d566ce2784d92252a57dbe9a71ef66c501c297b362afa64825399c051a096f9531ec0bc826e8808908992f778a02fe9cdd3663e186867f4c2350ddc3e2547c52cc8400eddbef4ec8be9a217014d0171e52bd83177c7461040f01224003bec6339478286b76f0292fbd36351a64c556efe721dcd0439f2ad64b0a48c91990df67348c806e241f33396fa2593c01aa01381ee3e5683b835db755f6f6d8d3d6522084eb3d34f633b0a4c83716a44e23dc1584560cc15e0b9b0de873403d0c3c093024af404ca93ad5aa7e5d3ead9f07e639e567a0711ec0dde568771e693817559a3f5a71a425b2036b5925a97af99a7299649d2aaa32543ec0ef15bdd389f69c3424c3880ea8a9b3b25a9f1967e05b3fcabd87f276ce042544cb04456f2690581e908bd697528e7a6721406c4255fabf1e154160cc1e3570fdb0fbb7662900753a603fe2027598632320b3030782e0140608a249db2b251a738d1c7673b692f0eeb0330258d27130823a5ad4f075cecfd315d08417bc2fe42886bcae86b7db3ccb319998ea26c43ca6b059aae7c8952f4606fe98a977009be6b64d6a07cf7271290a3fc2531342ca097244fbfef126e0561c3c07fb8ed4e6a940a658e2a9e8c682cfb84df397e3d8ca8bbca3cd7b5211872e40d2a6ffb1fa86f3e060df028f24996b5624b952f0f364ff1ab13fdb4c1c8021dc12e2967205993c8d84411879715d442fd0a2eca84c6e47174570ea10b7235754c82c2125ec8455e5691de1676aee06da592fb75f848eb0103a25c2fa12f279527673c69c6f43fbe2b64c51ab08335966bc85b0219bdf02e3ff44d429dc99f863d6c3491b3af5a6a29f14bfe369654124e7a8433a80a65348a5e6ef73380479b84147083c88b48b03b136db058d54d52a83165ff6416483e131f2e308ecc73a86771f5e4d4754b44811f009d40a9c223969993be1afa226979610465d6fe40257a06175bdec17feadf348c3e4067a88ee68a2a1628b9e3cdc010e3a36069622f5219cae2cb8c28a06a6e6564c43cb22b87295b40ed4bfd8c60a84a0ca85a39f3166392cba33f3eacc03fa7ece2c9155c140c5379f1f292264d5aeb8c4ce8415573be00d55382d9f5ec81a61f13357cc0eb3ea61ba50ae8ef6a065b4f536a2ba3e6e28d4a034b7f018fc511ea0255ad2a4dcd3175ca207042769370abb16f24b8b1502c56bc0b13bd48b7a4a8caf3afb91093506a1934a2a3fcddc3b53991d88772f593ea9fd96c1645920e190e6620dd32dcbac3728db86e65d8d184f6d2b1cbc26fb19fecb43481ef37a477975190ba3a3501e182dc550e14409c4e978495415cd921c954dc8f3288effc6a2a521043814aa9c1e064d7c8e41c7a2b15bcf241f6f9b32a025a3a23d3d2560f15a42547e174fc2d571bc7faa2f091706d05e4f4b2314374257adec60cf7ba7095f2d53ff80b70d0b0bc0e7880dd76675e8d6fae4adc0f6e980fb83e9eac3057629e06ade2aee21fae59037c97d1b582fdef2eba42e879922b714e20b085f97ec32bc4e0fbf58eed2824cc55a41494c2e66eaf4a411371031c130546b3e87008c80d914dd9f0484059cb3b704883da58b0a603d522ffdda6b1bb86d03884b2a8a0bad1c31ea7bddffc8e48362983eff320c362d2e54373fb17bda843e6b2b3b9d3a069dfaa62304945f2532a30d588dff9aacfd993b595234ab9935dbb166e68e232f2f94904f447f5b58666dd4abf884031d0d8b366250258408eb95a94fd00706fbff03e4053196216e8418053f6104f444582df14be14488b5cfb99ab2c52787718519004485167a5a856909d052b248e12cfae454f2e9c6e6492be4acdde0f128662501ed2b57560212f90108b5291ce1cf8b4bcab9c04a02cb5a590ed61949308300b2c63f341ee5ffa6f227b3cfec5d11af2628952f56cff2b4ca488f1bf2e4ad48e49a0cbf6374c42a5eaeb92b8e3db44c3c8dc58234e66b37172dfb287b3601140bb5ec5940daa31166421a05a49b1219b5197bda0f175662a45d3efef9da5b9e85b3445190aa5be3ef648fe14a05396166a6ae07c0d5daba6d6607e51ba52457c48eea27a87349edf2c294ec5c881f0f9acc1d5a69f43c21d6a15072547a9e00ddf524dbec306eb7a03689405aef2f89091a9d08e6d486cb00847da26852777120885becba08267e88c570f54770e226e66bf1f0c8c2154208be70832dfa015001a246df5be2ca225ca0d48ffac632fc7fbf1320233402aebd2d5d74a781027e33cbd4ffe0113d8efaa5b192d45dc3bae051195f3e0c5d7c8495276aa759cacbaef1495bdedd13c8a7b9de866cba30a838f762900b8bbca60c77f806bb8685d628fc10b1ab7910d518e8a83ad7a40c22b7fdd15528d43a3608435ee96ac0a06c33f513f1fb23490186a4af11113b7b28980435a1f74b29a61aaeecc58c4b4dcafebfab54a066a2341c1950a8b093ac1b82acf67d5e06022453f8de0369bf8501f41890c81178992800d36b7478318a090bb2e986f67dbe9bf19fb4d4e0caf6a9a8d4bc524ae2875d2e20476a146c9518b7ffe731230a7d3ab2b57bf83a58b17d054491e8080e7e8d903938107ee9dd04fd29bc9e983013faa54e38b8149ef7b63713d9e3a0d4ef465242da24fa6720d0d78fd9971902397a647ef576ec1e76001ba853ab26477e8801fb96394e8eaee9a5cdc719561e47ed74f7d97401e0fe695b8587270d88845587228120c961b905017df8eebd09583fa4e8ed004804da1d001bc16860e827f821cd806baa5ed030393713c733b40bcc9b01df9bcbc3d6cb2dd8d9549e448168fb8a7a954b844bd2f4ff023622e63cfb8bfc244e7857038141cbcebf03487f834494bb574ae04913db09bcf6d20a8a41627da854c2630cbf8de506d5b8e2cfb669d3e90353173926fa15aa075e51d9458169873c8b4db7dc952e296dc24d1920a60558efd864e42c8677f4170b3857698545a1bd42faabe65d943a3ef01a94b27ca9e6f8d74aae1ca55209f8061dbe6c0d48fc5d25797bb274e96fbd7ba33bba237da47617f8f5c81c1114aeda9ae311cafbc5c84d982af66b0240c8c7c63c4fb095d6ef153e620af7196e761860d5261ce52e3e2071d195cacfeebc4151932f6ccbd941dd4356cb02f5664f2c04267330bfc87bc5322a4ebbd87c7922316340812c2895c5096c41824582c5915aa43b265367a26fdc1f7e834e38fc9d85fed8a8443ee861ba190a1dbd9ba256605b6293d2f0cfd08db354b89112b66d764b0edbd2bb1b6477adbb84a43649816b4e481b260081567a6d34a0756f209b789178176471409842f5969989a36c7a7266ebbf12d506fc822551665f4d5d01f1473afb91bbfc1bfc6618c366cd3c5c87d985d57f03aeff4fc790dcb6b35ac7b7a186765a304548ac9e813f9adfca2482e2b282819cea128f1195cfbd3fb08b3314ec42193ce8fb65b47265be621793af11a44b6d40ba7c68bd658c6c62a9260399cd9d77a044916324446f98f54d13b149db29ffb6983f0645e5cf02896cd8947bb68d209591027a901bc8fb26f3e570258ee59094f35f65a000b26510f7abca60d473e3c89ecb89cf871fe0d61924b84c1b74636cada2a9fc6529c72be001b6c6d1adea39d949dc501abf2aecb3fc99122125547f18f3f2861ca685650123318b6a9c49decbf6b43073a4994b7e180e73c69b826e12ecc0b4e5daa260205406800cf34a6bb024587c3847de6d04cf30212be8d842442808841b9f59e1824251fdb24e6e90c608a1c29ff25b3090f1486e8ae556aa18d0c211047c88129d12993f1fc5ba93e898bd9fde05a67a6ddacc00ace910ead7b5eae2da16f179c6d786b7142ad1ba71bb6e18ae88137bac70e71c077aa29224ae05f87fc3a44b57ae8ad651a04de92f4ab25cae51b485521b52253e0df0d1a1899cf73b2d2acf4ac65311044c4cff4b775acab0f10a7a6a4fc78b2d24b572b950b56ce74bc1f53862c617fe8289fa32f904a265998e0e3c1b2c4cbd7dea447724cb3bd2c7b6d0971b00c16df612e8e04601341e4c41db86ad5a2a21bad29dbe9861a201d720c0da8b6534c3f3e26a498d2e75a4c987f2801fc50c2ffb77c1b60c10fc260e0b28b54545e70aaa4b4a155b7795f2f602213b37a5110f52a4b8e408ec036b068bf424774957410cb0bf16ed06ca3954ba85aae1093b05406857a6e293c0c5cf80f6161c410648aefa2b012ba434bb0f638ec0fa08a5a1ff7149b701d3777880e7df00aa88ae243c3bf1fdb20aeb51a01d631ecf39502cd00950d832379d3387a83a11534f6de3226ab47d5c54544a13a31e920a1357a96daa68208aeeaf025728f883c2697b1797a788283d0de6909edf316d3ab47717d34204ea100a26c626e0650d9f4366b04ced56f9f01f7cddbcd8486068718060ed743c574811c0733de8649c452106f837b60eb98f668458ad580a884ffd033f5146c01f5055094101932b33aa08349e50470b7adb5c68a921578152495aac7fd021d4e474f6b26f8740e0672a1ce603224c135dc71f66a78a9247b878f578800a82a8b40104afd9dbd0ead905ccc60816fc79bd344f6102b331869d42f4a47618f90ccf1e43c295e1824d75f5ff99f31ef4e3cfb383cfa027c8ab933a0e0ad8731d0417c21eddce3a5efa3717285c24b04022bf7546da6a31566d3b0e971f52ed14661c6c8ef87e8e7c23b4505e4fb519e3a07ff373e0a19d2a77800553208b8f9dda7b390f9cd985b875f820a7f48891d8b440b0eacde9069446f98b08f6da124bb3d1fc38134fb0df32b6502fe8bd2f529969d74511b238199bb7ddb03f68e3a35675c691659d354281627d16289f2e7c8ba7eb3f6ffbfddcc8beff67e18f5c46349e8385ec58397498934d26d56ec858cba67626eec08281e55e6e6eb960594133812806dab748d652a9cbc2e8cdfe73a1036c4be6c0b86b32dcad360a983c83daf63c5cfb18b8fe5563f438bda50bc785ac81ba3d8000d10259abacc2fb7e8e68c0d20b6d03892e2bb6f2880445ef80598e47b94dc7103a9a62490d396252100a768700f33ae718144cb1dd30405ec721868253b43b0094d770c4a6608aed8400e435ceb1149c825d0180bc9e3336055164470038af738ea16014d8697deea0e1430c0255604e18305c2775a423188862cb9d6bff3445eb476ecb5c9dc060e6eed573fd7cc337136d8e8a87763989d84679bc26a861d0c386fd4059859d24eb6dc564439001eaef1129e43519de3109ca2913c5a05641bfa8428f302617c002e14285d78e047263ac87428050bf1d9cd13e2c86d3d1222fe016fe21d9fc8acc906b2626c29306ea5eed2cd322f58c6a69853361b77d4f1c0fdb941e1fb77555ac4e53dddd14de064b789d7416e7adfbc65aa68990ad02a2d988ceb82efadeacd61563ec6bb1e95600f3d7a3e6f477a253eafaf3c0a9a1a8cd5ba7700c39cf52f194bc4c23dbeb2c26adddb14ed223ebf63abb0283cc83ed9e2bdec1bb18960d5df583f4985aed7516b7ec76f207bf1f405fee916bb18f3ed5bd2444b9b28d999c217e5af7361f5935bbaca0022946536577a39ec30ad946a0112ceb3a720e741254e62d808fa630688180ac5b049e7b21b040109ce75b2840bd2c68084c97fb0380fc7c49417150d1f5bcdf7370ff31977046d355fcdb1b47a1b6aa2111d8393a16f12df76ccc7a2a7ee9f4f69434fc3dbbf55e8da627844c76fe4041f8095e758aca216cadf80fce404c8907a5c4ac9dc1a6f800448c611eaf95096e2de1b1f629585a626e6574793b84a6cc46c498c8fb65ec5396b38197be8353f129abd4b329c584b13c7dfb2bb5bd011a9530b4d884ad72a50acc7d32bfa607ddcd60793d26f5748434d19e34dfb8cf1a62e9793b26e636fc2a69d3f9b7b45aaa8f4f5867c05d6466085197b668440be55b70574c3db30f973d60e36712a2ce64737ff837ca84b4863a22166960f6df532b3accd1c8c1ba643483888287da0771efb0f0e6fccbc0e3fb3c9049d1d89e75dac3575559ff626fafccdf58a3da54fc78d005ede7334c8c597e75e386d6bdab1bf9fe30792b7535f5d75f2d6d4f7cb47fc75f0eccbf608ede7214be6bc492b6d794ae6f07b6fce6a53254a0f4fc14e24bf8ecad93769645443f3f9b5613874b0c585b5358dabe771e4cb779aa5db1b05c85c838ddc10997e9e66966679eba2e016a24b1cc0c029a039f82425c8271aefbe7cd2928a6e5d9e584e6bdb8de546066516a61610bcf4785799f3a540e54a70dd1f7cb7882f89405d31a57e54cfc0f1fafcb7a8c3e2cfd7371b5f5323365e40d6a4b33920f79c92b299aaf0a91f36f462aefcd320c789e00b5f40059a425a04d1aab985c0b1c4fa9ee97ae05e8a34c25dde2430363d09d010053e58044e9f9bbd0cdc1016d4b243ac25f78053c76af949f03b1300f17d3457926595bb25001352bbcfbc7935f346c6281183b493ce991187460e9faea34ef3690226411b1b4a13fc3e0cf6dce42652a9120ca81558cdc2cd0d35b42837cc8be008cfbb93d550a0163207e69f6b8b1070b7eeb371583910db66fa0242d6a32e64e8a5e2e2a49d680a8e92d56ac71f3677e796d84a6d9586e235c4cf4fda0a395fb1a443b00fecbcc3ca281c59e6a3a5c23d38b4fdb35995219e8ffb1790676a458bba632eb0ad16b3466b9e4e5606ee23487772a5f46add7deb46de4340f260b3640a878959c90de132031f2982f535da7bb8167d107a59160fa0c08612ec5811e0a17205fd0e5f136a37cd046c49074b53b8dd105e7f56deb050d61c080a7c40fa6f7c616ec384cdc8f147a3df7cb861d31fb0817d0c9e8d5b8ca111be4898bb1180cb0603278eb700babb6db2e681ed9948c683c5298d8560f96223400749d8f4d81bf6d5de3d5357283b4c7baa103b82682d3e00bc60ac98a09a02f1cc8b15cec0e22db86d0812e2ec6a1f8560063508b1627053e1dedb91c61454b2830951168dc0b78480c7c55bd8f29de5b433abd6044c4901c088f7495b0998c5d92266f9d22343095ef0c31e809e18d12355635fd244b844827fe13d359b38fafeb0093af75df2c2ba123c89fb92bff1b9e8c30ebaf3a606a0204cd9ff0fb4ae49a0601f38f07633e96e93626af8c56a3671bf39e406b047a8f78a5a0076330ee0f543d7992564b647025cc79e9e96421d8efc14e106adf0a51e11bac24280e9a3760b47bfd2e2490b7c8106ea3c509e7d6e0a03daa6f1dcaa4c3a6b1dd9a5ee749d35b5051da1a7c705c8127d08a311ffd706fce3edc1773132848af9e8a1f86fdee51daaeaac14622cefb0403903fc95fe592b17fe218569a2d23058b196984047d3bf966f80d9becf5abca98436470fe3369cce2b65d4f19ede01920d2c5ab0fd3cd0cf794a446e3fdfcb515e4de8e2583252d6cb6f3a58bf42b9d658ec70a20d70eedbc35229688741d4917374ed07546e51611d91e15b5965e70848b59d4a4be5f5842647d8fec1d30f3273aaa6dfe11e89cd8a4dca70c977f8cccdcbaf4ed032add9810e4bd1623f079c73e431630dc54fff3d0ad5affafda61b14d7ed8aee36bb661b3d1c2babdea4376cc60c8e720cab25ba41881a9f177137ab9c4f6049a6727f8c3d534f057586cafd0918c99cf8fcfbc35cb0e53116d58f3af5e961dc019fd4b9713a117b403ad3c375039a8cd40e25edfd2e3fc85c10bd008c0a5241572d2e1a0df4a1440ea343ced68c298d16d9ace8a8707082f759e816c4829bb5a5731d6f5751e224c0d72ebeef70ebc1a885f542aa9276befb5133b38d1b29b8b52820922cb322b806cf5fdc7897b500a86c0312d891fc3598805477295cd834724cf109a8320e49a0ab144a4d56ff8da366ab0fe0f2462029a04ea695d500a4a930eeacb10acacdd93371c8edaeed6ddd9a5d8383ef3a012556ddc38408219863f2a647f6c6e5340110ca129790db11e46018c20280610a0184910c7f035932fcdd3f72729d7305e9e1442a51fe0a34df6de7b6f29a59432a51dcf077606f5054ce1122cd982d30b49c45a6b6dc8bc4793b23115bea62667b5c24d755a8f26d9a3dd095885c15203ca162437688f275bc09450e34b12148e62b4d395b24429a54edea3216112be7610b9812233c6c8132b204011634324350310593e2ce510a4a789504aa91244b247bb4210312502a48c0a276e90e3c60c4e6033a81c28289af2012f5c7c5cd12185831e8282460c46a48a8e21ce1049d1a2ced4f0523585288bd30d408010d23d54a09260aecca32f8c60600c4f1387fa456a3e29aa1293596bed192c14c6992ee1962e5b7224814a8288dee0e2802b329cb9820205c89118dd642728723f2f1ef026d08cfc82ccba26249bfaa2870aa9e141515195180fab580d61cefc30e1696986142ad02cd913598a2ad70c44eedd6d2a4ad5538eed22a3324587f8bcd83aa48bbad1b28cd0d18408a433401841a30310a248c901c89918a2d4e084882043a4aba92503e743cb0daf17fa30d574aa483b01f6e2610485c20a466a7082fa4e8022e48883590b465449740ab12e9b47f34456af2cd1bbb9785c2f9e1d8a5c3c44f505cd92dd8f999516ea778b044235a33da628a5b44e81168c5432b950870e3a184ac4ba8a484b612901368e20e2880d4494a29a5ea84d4eb0c814a112e248104845c460ba6244169825a5242b282728e12464468504232420cdc20d47cce0430b3faece24e029ea4756901c4888e91f1e0395758560ee0fb78a95ab9aa5884a2974939235a70f2d54b01d609b961d6653aeb294264aff43b25c9e4210a28822b0c0ecf01445630853932760a270f0b24488148dc28bd6af49ad4d334aa917f620eb412aec01aabeea18333d4ef40ff6e9933a6cb037525c95c5acb596893fa1744597a323a214baf80012637ce50f7ed47c8024042324221f4a90e5d812a397e49441dad8a4489e22acb596060799d402855b80a961cc8f1166b8b1c4c1911fb120c2d4e8814a845cdb870ad21572920613285916a32a3ace08513566892c5d98b63cd92186b5f6760f19c2f9437f4014e383a2d0feec40cb682839c2036090f041a6e40603dcc044020f39b07a7870c27d62a686993f95e15a45b222a91b319c56aa2fc4649582f936c56589cacc8bca657aa2e024220a949218254e20c304861f46c6508102d3240713e4132c895c6b729533c915a594524a7fb8f2ee0f59945e615991d2c11632583e6a60814709453c31e24c8f2031e8fca14cf3c02163bc6046877963adb54bb247bbae30c8084fd9be87c57a08b0577e48d513960e8809e20b94911907647a104287972a563ad0246b30e51a4ea177938260318d00e50403074749f7a8870498ec50e48a132e446a88d1b1094ca8527088ac189d612a410b8e22344ef0018b8da732b21172d8b004ab042f039952946a695ae205cd15162146055586e948aa082d4a04614487138c48012288a421fd34e36c8aaa192044408a5e2d5fd2048357a570e8ce10c9228650c16a071c3faa8a70dab294a4490e12aca2ae8828d124d45a6b0a59b247bbdbc388e5c88187185608c301079a80900444191da4a88c90056ca49b1c2d1821e3818f2248706c604a0e593c60c547114b76f44cf002123aaabcf4b0f4240350594c4b3ed0a40a142a37e8c86076c48e29400c3902450383830d244218a922f20196a4110230c48d0d3446a8b163c9ca179992202860c6c715161193111267ec8e1a5bc3ae2683cda9dd6d4af640c17b318b85d65a7bb75c9192555494beae928b184240b8f164e4020d5ebc1742308383931d488ca6a0721d93c35558eae181765144d6de2a3450c9a9a51ed245cdae8baa39220a8c23b0701830fa82c2d50747b282a8b18452d48dd8121168c862440a1cd65a6b3940f21e4d89660e985eae30cae64692efed1006c8b54598212088963475c563891d61b0c4c070e4c3508c070ea32376e05842c5a245b0d65a28d9a3592b937436b7296b6dcd149a91669a1264986069a172a203564208258890eb104ea0c620493963d4473e50280358591a824814207810d1e1089ad98d5c551ce1d14313262ba724316eb8b2b5d6da109a680ee129b436a42c504ae90fef36a94029a594d2bb85a35284084aae5ac8d181141d47ac50158492a72b48aed84861d4f2a0a8560e8c0bd991244610f9c043941d2270c40e31544bbec480946584131d4225a20906114f168aec6e778b0d57b5d65a731058ad55c42c5f6e983204c9142723ec00018b283605852b5bc0ace8222136324aa9950127acd65a2bbb923d9a8c2a26164eb95e63c6d4f0ca144d568805aa0b51f572e4e908982f0693261e1d5899c06504303c10b1a3ca8c62d2e486460a5a64286324364be2c88694592b1b4a3b1a26d5900f2a38b1c103ac0f806021d28153160e2f2d340828504a2985c56e08654605205db0c674f042d48e292741108141c90c49b094f40794d22b25848e9127a5942681cde9dd4c9aaa8a4a2d0250e2ba7451e1105688708b92ea3b9b88b84dcbf4e6f5acc85688f104ca900bc508cd0f947655a6a53025c55968e224ecce2817aa6afd81524ae9ccbbb3d65a6b989f396c12302d8827ae89524e8653b6eb961eb5d65a2b0a4437b2502ab7d6cd87851d1860ee5d159098db14d9dca6a8a6b4a4222e4906d64ca194524ae913d4b6518f4b612209211f28c2a4c4820ea62270545de1c2820c4308d1690f688c403242c908a6a91d39b9a42c51e8a552596badb55166648f769bac6c535cb2b444a9778b962c4a29a59452ea5d4aa4db81d25007025c2903a845954ae846dc45f33d711dae97a51db4542f3e6aa626a5b5a10e5ad9f15871b7ac96ed90cdc95f7c32aa7f32a64fddbf11414e6cbd4bf4cf40fa6856019afddedea5ad698312e2ec6b9eb5f53ffbdff6f479dedb87e1db90fe915fc7fe1b0f8f9eb9bfc1a3e7dadddfd7ef9658e87bee65c54e4303db3737541eef7b6d69f14823db9ef9be77dd9ef278adc442d5e57fed0fb90552b4e2b839e5fb9ae68301ad87fe03349f0ca403340a6ede621bff6bed8f333c5b41ebeb8f9789c87b6803388b5bfc5ee21deffdafcb2a1e2be8af5fbf3f0bfaebdfa5ada97feadb9a65bd3f6e4ed9bf25b6be20db7af0b3c06be4134efdfb7e73ec7fd2df93344899b5f5ef53e3d1bbfa39f771b07ceabaadcb47b3276ab9e65aebcffc89b57a2dbc0d6916f76178b318b7a65cdf7e41ade7fe8afd30e48d08be4bfcbe256ad9461c3dfa3562eb2ef98a0ca48fcb2406341f7711d17c7f41ee32e92365d269d07c240d5a0f7d1ad2885cffa8cd72e3b0bb87d85996f7fbeef7f7fb9ae6bb78bc4cdb5bbc0d192fd3f7b58b94499f269234683e6d43eba163cf3c9f923e19c81efa3e95edd7ff4415318433b459ee6f7dfdaef5de8f9729770f8a0ed00af0fd6d61f06ddbd07c34ad67d4a8f2f7f49b48fa3c40ebf99e6a53f9c3e30c6dd6b34c3f83efe96f43ec83781bf261a67c97b621ddd74f46b739719ba8656bb76db3e2b6d96d889cca9a0a1a36ad03420e58f9b316c545d6c529b7c85a540e48642e4f7900598bc2a1062c7b99e737ac3caba8f201b21655b594a3bc64e515598bf22295a3aa887297db99e499b5ac4cc3d7aef6b7f3bcd19930c07be86fb8bd9964c7123ff82d80cbdbf705e16c52dbbadf99f80bf9fdde27a35dec3e1912c390373f5e9ba7f9f1d55911e7ffe66d9ee6bb4e8a639865bbecf7ed5d0eb915855abf4196d9c477dd937cdb6ec2f6c66381c5a3e7d6f33893dcdb86ddbb37c742e0b7de691e1b8779ab3434d820f74bbcc99103791bebbb2884f31be416e75781cc76abefdbbbcbf2587105641e1b86cfcf82d133ce6faff90b13ee42ffb867fba3c4a333c9f5873cf753297f9ce175edbd5e2fa9c4799cdfeccd6fdf5f035afd126fa237de69bdc3903df477fe73d554b07d5bb07d43f54fbfb40f435acf3dfee84cb23f8ed8fa8278beb1503fce833cfe30a40f06fee3cd39af798eceefe0f17e7ddfe4267fe7fb82b61792fd3cef6dff2eb77e9efa9fecdfd1c11d164873abe696a865b07b6650ecdc3850797bfb05e1bcfd2af69b10bddfc4da3d8ea8e5578e387a388dfbc957d4f7f90fdfe0f1bab00d1ec35c83c7170d0ebbb1e53e0cbb2d16c2d685fe99db6bafb9773a2a9c844333b71efcaaa3c24938c3cb2d2cb48d33bcaebd06d8073db1e5dfdfdf02b8dfc26f917b1be29dfbd20703d943fff51a43fbe3cd0ca0db57d9336a5832b558450ce1d0ccfde3d0f466ccf0b2fdefc74692bdaf5f50bf90c5ada79f05e0d3c7c03eeded5bef81781c9a797b6af138c3cbdb7f786c24da4ccbdebb0bfda365efe727c363923b7172b4e63b6a20730e8e1bc8dc73af7d15d0cce55b41972d76179a45c5af36b1035f4089cad3d58e259a98e025f428e3c3c7123ab03c41e118d59051b94108a5301630812025440d284e5450f4925a6bad4348c91eedd66ac1d4a06086ab3f62b56a018340d9c040555f4821a2d75a1b046c811a23eb8e64c9a1481120c014c1c2820d49367a5825f1b8d21213809217c86411720584294900c29c7003075398964899c1462771725dc97ea294d213c68027182142adb5825181524a65de75a10aa55428b53f504a294cf66857de78a1a40a29072f3d6445c580d9a831039923a526537440a2c1b25ca194a6bb29d55a2b53d19db56ea9b5d62bd9a3dd3b8d92e46ac4e40321b5d6dac191f768484a4c4e4872074c3428d9a35d9867577049b231f5a506335958b852c40d386e08d254821258b0a03822a49200452593cad4a433f2ca8380d578750cb079ab84a1924fe12b74bdc22885610a83545f21e581684ac998a4a829e302cc09122638ed3013210a0e48217c3045445663c45a6bc9506aadb5d6ce32665c567aa9899524513310488831be6a909262a4044bc7992c36b020442241e930699826a59b169c6d470a1a45ae1869da224545891396b6f4804415148c5445d991e47ad2716126bb902065958493952c2560588218e198f56043ca0c52dc0c565464eb011a96709882dd4c4d5dcdf015ba5e445a951ba8abbbe586a67e020585e886841b143d68f08186282eb10e440da04a15a3205bac24f1b485a888e431a12aeacc0a644aa082c0142c3123a278f8414915aca95ea1a905a5182d0448d97e8e6f2fb190fc9ccdf27c8dd461b713d85a6f7b1ebc8375b0e7c927b4e6504a29a50ca584e5962f11fc166bf7393912fb0ca7fb564beab8577efd641886fd0d798847b7923a9a456bc85b305ab43a9faff8ec07c33eb5b64a1d52870e241d9a897e2921d33dc980f349cb72bdf19ae6e79c13dbfb17dbc6f3fb8272fefef417366a3ef13e19f68af393d158ebfc79449a1773eef3e8ec9cb08fe2fd530088c7b0f1f89a78fc6cf11841ae134b1a1a80e04fd97c508a42dd6f90a7aba77df9536641d75b13734e5727c7f9245b14f8041e3f891d3cbecae8e031cc638bc983e79cd83e288e2d7ffe38ed9cf2bb9f3f5a8bc33c9d860676ba9de39ccaa3ff1585727e836ce74fd0ffcebf580a7407e77c92fd578826685ae4feee9fdf3b3afdda96f6602a09a9323fe49e20d71f35302d644ffd51f3c2f3a3d6a573dee6e8ec34a06b3ccab778c7f5f7fd1b76e2b730c57f2df15f15ccb76fff8229eb1f0b82f3c9389fe4fb395dbfc542f673e6bcaf17f11841eb1f8f9f028faff051e013d8be8f276effe83578f4f91f88ef7b1d75bdd7fcd6fc6f7e38ed9ff0df3c6f92912e97a86569adfd99a568ad2bc7df4e59b66fbfa09cefdec5f930248f48f33ba2cdeb88356f42747d4eab61a19833f105bea245fdf9e31d5ff2fdc708f2d8a22d8e156fbebf20497313c14b3cfe6b7c551c51eb5274d30d7654ffd82ed72ac47a91c9fd79fea821917b6c0f7263eb710f7e3f28ef37085e1c501c87e48ddcd9def5f63190358208fe5faff0be2540067f9c41801c7eeb47ad4b76c90cfe3824736823d688f3be7d1a51d30ad0e00b8517fc86499fd67afaeb6bda0b4d5b31ae58223e9968a2c9fd632fe5ba1120df6fe151eb92ed8f1dcbf56754ff80f7bff7fe821955e7139a3751ab79bb79bb7846350b5bb150cb783a85931c078a02a47433cbf43b9f01c5fa67fbee5baf97fbc5637fdf02b82fa8e6b79ffea236100f20257ff1c9a8dc27a3dd25b6ac58f336e2f6b5d298eca95f6dad3455a4318b63de759eb540310bd4e489429f6663adf74031afdab8807878fffd98e3c239404ab9befb67bdeaee2ebddb6f033509d5fc06b9fabbfbfded8162404b0dc3bde66d7e0452baf70229e5fbb3df7ebf7f77dbfef17ed71e85bacadddd355ff3f786e1f8e2a6648f6c406317f1cef7dbdfb00934a1f338eedbf703c5dada71c84720a5bc7d8df805e5d47ccb31108f66b149295feae0f16542ca07e291b3f9fdeec12fc85fa8f1f89fb7ecfa39f7c3a67ef9403cfac771f0f8bac16348413c5ee90145f13ecff3be1a0cc403281654f3f6afe80f43bac4d6db88dfd7d4c81f295496cf4d499fb048f6c81fef186edc5496dccdad9722971516499fb049f6d07fbdc2d07191bd44d93d201e4a597adcfb8f1e16e2ba391a0e88c7c86565fa6193f4a150b287feeb15363565fa403ca852eef71efcfe7af87b4b63799c52997e4bd47c8587c719548942794f1f88c7878178bc5e1e85f2460a05c40348c9721b108f9b194ea32892a2a792c4f25e5e492cc7923d14bb53ffbe209d973ffd856b79d3b263f98b4d86cb0d0389f3893affc2013f6f693cfedfcbabcf250f16b29f14e33c9bfdd696e2c329f0e8edfd8dfd65e39658c87eebddb1acfe5bdda419219ddf20fbb76d3e935732cb379d6f9e1f259698fe91433e6e789458d9b7dff038c31b6748ba49ba49bab5cd8f8e65b3d57b35cd67d379d7f15e3f5e1cd9f2b7f61defb45e6280e24dfce7880fba56e45173b760e62faefac77ffb5cd4f228b1e4eb7c29deb190bf4e0a29a659c8c740fab438f1e3cd3bafb9cfce8bf81f8fe1a3c0e37514d2db708af75a6cfe29b03f8a1318ccd9fceb9b984a56d4b2bb75ff99ade8ded2717995fbed17a4e3cf237adf9fd8bd8ea8e51d71fc3c6a331dc73e6b217be89bc02f3cde1c3c8638780c3388c7571e5bbc3e8f2d7e451e5bacf846cfca8ec3eeeeefa518c7ca8e6bcbdf7ba7b98585beb7bf79bd6ddbe67ddb776f18be341f4d93628668e63ec43bb785f4c1186b00f8f1f18f2f153f86103c0070c3640ffdf121b8574518be3431e08f6e952da6f46b981423c558e5fab0d76b0cb59e21ea3329466249317dc24f18b1bd75d99ce454d781ed5de414dbbdf7ba90d77bb76ddeeae190bbe89fede7fdeec7ee3d0f8f12e4f95cc5439e857aecf090e7e65af4cffd6d8e437e29c52ebafb2d2e752181bfb89f8c4bbbefba908606f4b5164dc7afa21047698bfea15f27c863cd5faf2d1794a64583479720df1a3ce4b972cd6117cde23ebd7887d2fb2dfaa7ff764b90479a9f3f4a90b7ef44ef0beabeb1d0f62e461adc715f107d211a3cf6f659e065fa2efa87e2d102f793b1695695e3442dd75a39ef1641dddf9f627fe83d7d17fdf3d99dfa5abef439fc7d78a7fef6d345ffd09fafc371de61eedb057deeb7d75cf48f04998ab4666b73a5d845b398345addb22273b90c36f579b5524f1402bb5ae97b5e07c23a87ddae8617fcf6c0223f6af797e300dffbe92fba7a91e3709807fe75d1d0a0df2bf223cf95c2967b911f21e5b17a341f768ea37fbcaf2da7719c0ec761e1f5683ea4f9fa63ad78277cef29cdc3f0096a6cbcc85f785fdf8fbace619dc3b2f7a00b74798f73e3ddd3ef5ccfb9cb06d7e0f1ba8c26a4a1a10941ec38fc086c818ea3f33cfcf23ad08b7c05fdeb7d77c357dfff3ebc63bf5ffa4c30410e3dfce2eb95bda7ef4de0fd749ff1caf527c8f31d87e3f022c7e130c7a1b95eb0f166d24713b4af71b556fa9c28d4fa6aa5cf71b4b653ee691f653aabd7b5576b733ec31b27f75dd43ff5b971c88fc6e9e1d6b7002e7b3ff805b5fefbe92fbcab76f47d32faab62eb359befbaeefbb42eeaff629d28e4fd06b93dfcb07b1775b05cbf100b75efd518f5cff7357477d5e0a389bfeebd7eaf7ef7d227acdf45f5fb8e8e32f72df1fb826c5aefd97035ed35dd17e436cfb9db7c35789cdb27836b269dd77562b71765fffb05b5be3e15fb43917b17e9d64d8f528de3707f7dae5b40fdee6bf5f7e30585eee8e5ee7e830fc341bc639f7bfae1fcf9d5a7dcdf9fb58dbae7b86fa3fed132f7f593c1f5d176ad15b57cefbd77665b711b350b3a69ba4607291dc9b6558b1caefb9ed9b8cb6fbcf52e251e1be7475943f3e13b9652c7a596e505fda5ad5cfaebbb0ea4a14183a2d0f71b6487c05af77e503ed8570d01f85f5a8594108010b455ee97e37edbeeeeee2edb6b67595148c741f70b7ad63fde57b2a78e8a1fdb0af4b6ca524a97524a2aa594d629d8f9d166aff9c44f8d0214295ea3e0dfbf350a44dc5f1aef40f00f0077ffee9904c1b602db2adbd7f9a4ce03e04db40c8095eeeeeeeeb8ca1702adfc97fda50b0000bace913c082010b5ec791e04fda567d95588dd63b1e64591e65f0c3f8588f328c4d69f106f9e4774fd8e68f3cebd8ece05a1093cde9cd6ae72e7b4c542dbfb777f7110ec1e043b2ce46f1ff41af48ec0717f691639dfdbe784a1dbaf2d882373ff0dcdfdae9afb6d6ceeafa1115b2b407f28b6c4a915a0fd2dedaff697feb11eee2f17f497d956eedbe6fd2502b145d3c0fecae166f360dd4c3e859a371d6796de5ebbd65575337fe1d2a5e87df749d97501b596949fb76ebaaa16687363d3cdb283dfe9a87022bb08949686065ebdc312f2a4bbd675b19d957bbffdd8cdbaaadbcd727dffdefc6bdc7f9be15d0771578577c0ae8b4bd9cdbc9b65fb9ebcf16ec4b1b3a5914bb287be4d6ffe388e6fdedb70e492dfb86c96acf5601f088a5afebe0ff47057d575f15eb66af79e9769629ed630eec3b18b3cc88db9aeaae58f5de481ef9e07765735cedc450df33c267deef558a6df557ddfb21ed590c8e30c0d89bc15e5fab7abeaaaac87c7d95559dbcdba2af954d3391e4849cdd8844da4ab5918be5ef7ce249fb0993463523e99266c224da5993463d9af86e638ab9369c226d2549ab1993463b3abd9d09c49133691666cc666920fcd99d44c9a481366b92fec6e4ac399e4574373680ecdd94c9a493d9b49336968ce266c26cdd84c62b2b57c2291662dcff32412957293d64a980e89f4de2743daae7331e7b51b1bb756da25a1f0b356c2fcc44bebd2c4166e2f0fff2591b27c4da3c1a194fd58e8fbf0fb25b630099330b964a5f75b19db24920d7ffc90727d6ff30ef19067c74272fcf090e7d6b44d7e7bf815cadfbeb7782784217d1ec755f33c128f52dadf5ec2fa47fe865d8a5a76399e0897f3a8644c783639c99082040000400053170000300c080744a389a0474af70114800d63a2545c4e308e062391388a62188801180441100000008061188661404a92055b9a951d830fa3a83458c71bd5c0c43f435f519d108bc46d9abd239fe526cfd40ce0296c0856ae65d6010c251deb5ae1c949e65934ae09994c885e6fe000be4b21234fa64c185b4858b3f9d19041316aabe9cf1966d59035c63a3261e5b436262f014bd187d40ecf432910000f0fa635f86b10d71688b47f3f839388d20816f51c750a8f34b35f110109339699b585b8561358a2134323cf9d0ca2ddec8d0b3b68901850ff1e9d3ff052fb2c7716dd5bd53e53999eb053b3e7e77a1dd11de7edd9709015755b050a157b04139bf4799dcc5b0ef5ff113cd56287b543742a8ffa7440700eca93e43f881a9f2ed84a6023cb8d8f3f98a3958da91ea902ee59123b96863a0a07180f511f0c6dc90756ca8d0ab4d43a59b399075d55f4e95a4747f392b84fd8faa30533dbb7526f067029686c856f6b68bb27c67c95e4ef507ab7aab8dc6e4449772db624ddb315582349fa8c658bf72427de864e34bd89d6054a9e4f4a4cd5994561c778444786148607886a443fdf390deec2675eba2ce034629da0bf3971641447c226c781b210c0a75c19a738169add0e70f9456382f203c5320141228e48fc5052086f4e10df40ca87ee62bdc8fb42e013ca0c1a7523846ac426a4207f3cec26086962925675cd4909d420fe4702f8be502d7e4d2f08928784c1d388000af7bbb3a362cad5d9c5288277cf1e858e40a942d0b64a04f7b62c14b7511df9f31237d4cc535c118c9f3429ded0fe18c7445b8e293d250e52f009f97b218343d612bbee55855142db44b64a95285635aadf9490426a9c75a0e2f97f383f359665249b60ff00f1646d16764c11fd79088406fc316ad0092b71cb939592cff647742fdbbf213bd2f97b848e9156e4571e4be41e9d31beec0115222121da03633e0bd4e01b34653315c720747bca355ad4445e22b6a12728ad4ba510bc6c9dc04cea397f9ca0ed7475d8fe828618c9243a6e9b3f7ccd09cd3cc797f13927479b727d32bbbc26908a960e2bbc6d7cedcb70884ebf23306df485256e68e1224e128db4b6ac95a966388b3a8e119c166ea2742804c700da89ca88332aca231b3cf233b927500ba46ea4c6e62551f86ad69eef0632c8186c122c82ac7f4c8307b145081af96eb710dff0df45a021bd644f633922ab7264570b22c9fc24979e954f3878958a0cde62ceaa28243c7ce0fe60bccaed6d6b5d8351a667e20eafbcab56b7cc00f79fb5cce57af57282156e6852b557d6bbad9d1c6694faa48b72751d3a44db8c87f355b4016e00cd82ebf4ee1832d8ccf5290bb1ec76d622bdad3656ba97220192e500d76e53ff85919f0e99ad250e4905d2704bb3f92b4d780e406a6014cc29088d87484408d12872bf53933f710f9fab58d3b9a9e2e204aa51aae68f6eef2ba38a18d65816b6ee24c319c947f8fd30b55cd2ff983819c1d9877860e7c9c918c9b72d89d206bbf82d19abf729dc5d1841710e05b0538180155a415743671006055e330450ebbfab81b8884603b730b40f4dc51744651c8054401afb0f244f89274e8fed38a1b3822a13c0f64a56d091144b53ac86e36f16e386f1fb461f9a8fc79874da8ddb6eac0a24dd0b54b293dc02600821c0a79508448e412284143c9f3ecc09dd162e0f60a45a99c9956e39e64e14014421c1f57f713fc0ad0a545ece43615325d64ae77024ff40d4e0a2a7d26d5c3465661f798eea55d7f35c34b0b5bb819b40b19b7ef64327df5002c34dda17e604618ea74eee309060151cbcac602c0d965e60f6a4cbea1593d42d519d9b9cdf9b55da3c6e159b933a371726b69955d9eb6a86d014d44076289ebe9217e91de2ab4ba45fc57c46de206dfbb80a92dbaf51a97ae71ba52e1aa45502b2d239fe9256f2e9df84d94374fc3f2d90beefaa183e69f3779c97855f55d85a87d1248e03186c015588c615a5201449a3c1d2f16507925db8e418c1a4238378cde5732894e9c188e5e17a4d153221f18393345fb10f18b7ae80a96ac11cb6f0fb7fedd5b6e95c6efc00d37f29482be6dae947e5b0afbac844909da935a12d4a55aa8bc3fce390e3fcec8aad74fb4397659aa867d57ba36aac2c5d655727358420941a79ffc05914bada80e0da82b16cd8f0532b303e6ffbeae1dc15d910009890be94d5f634caa6a6d39647b25680a6f66d0d8df1dc17bc21b4ee45306bef8769439e6817d17874d97545ea1008567770a865dc96528a8bae2174542a35c7d77070b745092f610c3664e4a132b3aba6785b7cb3687cbee8c7c95f6143c4daec954b9ed60547f91e366830ebcc6266e3440b3beac8ddddfa47e7314ba8de1e20e50c4d0563d3b8076a03189c89d88163de386296e0549b1d2829b70d82de97283c771bb6308553ec5a656c27fdb19bb43a707ec9f1646f4fad00fc36f06c5afc3607e321dbd82a92cb914db88dfcaf1f2fd0f5af73aa18582698508c3264485faf0260d321dfc7a385727c1d4666f0a1949cd54f23191a5867b7ddde89fad812e748a5237db5af739923ad124be84c41dc56e73ed3f7907aa145e6ed026578be43e80dd00e5a08bd019e035bff2ff931192285a270ea69f6cc8b18522dcca0b3730b072a1800608690bdd273a7ad592c15599b8ea2bd6e789c0dd7b29c5dc524d57ece21e572b5f86b283ec14250b933ba55554752c3457ae92cd20de1ab966b9179660929e6ac5a6e9480ed4ab7666d9394f895336923294f8a861af7cd5da63910800f57af40e5c71e12e012edecea662b53304458abde6f30f5120076a4dd5692a4242262c3a912cab6ab57759c48732f50b11e214cff83f2aab8acda1e2995db1373d46d2a0429c8f565b3c76ed351700f82e8fed141d9bac10819b0252c1a08c4a0ba33d4a2b4f6947df8cd9bb9ea0a17bf4fb3d7679fe06aee2036249eb4d6da24dd2b8378ccb0b0c313d2697b22cb09b8410d858c344f6236171171e42e576fbc138e2970ff24a91c323d9970ccdb739f77c7458e8ded3511dc16c8433e2514852549e86dc558b173010a22aedb91faed1d3f0adb0b8e1ad2e6c0336231c74dffc8cb901732b717f56e7d378bd4944bdc4db863c874cba4d905601a921d4ef8b11a7896dc818c4239219a0308ae1c1320d91512a457d7c5ffca75d0b993c6ebf652a2ef94c8501732a586f1d5c577fe4c86506c0ef65fc6494d1bafa744e5cc4901e1d830a60fc3f984987e172ba1098572cdfa10df5c657502f5b8aa240688293e0ab1a0bdb214b9eec5f58fbe90d21df7afaa6a890c3768a69cce400e2c9f34104c65ff3524190343c5d6747f36a7281c9131b45b8aefd1bc774d517a65201c7495aa5e2059385016a38dc1cc380a5a643bafde53001fcd5a430c00609d8cd41ee4a0887278e1538b6a5cdb29dfc186e184669885622b35ab38065d89301a128a5c5094dc4bd751ad38d6692ab56a5483edd454a9b899b984eef2af350cf478dcf00d6abe952c8f218e1d1a09e01afe9cb35160d5f3d90f10c1826a5f2ab6b18b0da36f68aeb0ad876cd85f84b10e058dfc6cd8b2bbfe337495c3c5015c6b43a42a27da75fa5b5fc46210845257899f17d136b40f71090ef6ed8c5d40a1b6428d04a9d8125295482657126aa4312afb4ffcbd18d3bf82eafb32b3325066ebd143b10a5dfbbbd2ac24ace376f08e61cd8d8d0f66e7f43b078a95a66d456490e2892c5aa7d72ae41663c86e1a10b92790f2aec269836b908611a12859565c3622fa1fe4a5b3ae9bb33e12a614b416a29c8721146956fd428750ee87d18b6d0eb98b50703c402218f34384088756f8ea6288ef8820a97badf2608c16ee635dcc75beb60004da022df51525230abfb3e78824b1c36c0b66cf52ecf24f00699185e7084b6a021fde299c614cb3fcca6152009e28be5bd2421ba315cbf14a29db55bd812108c2ce9acd16095e601ae3b06759e689dd386885b061cf3a398f6955f1725e80619288b38cc6c1ec527186be118addde241b2565411e70e1f848073581d97332a2d18d71d4c85fb8b0fc55271d5f097e12311df5ba4e3e0864f456c63ee6bc31c5199784ca619b4c02e1b683854265147aecdd8c1c17da1f625141c95ef6dc081b03e87a16605a94a44e20138fdb36d436aad9c3a4243d6e0588e7ea3b18ccb189c1c20952caa4243f56969af0038b537299812b33e2f9276d1f6c6a314cf62ed8cc3588e77c7fb2e13513372ea028758dba01960df3ebea95f3c25f34137a171a29084810e72605a6d0c1088ff51187e049a6a1156ae6f5b3d10a96122fc73569aa68b4a204cea51b70ceeb1f576d16e03e6fa0f89bd78c160942d409243fc8a163879a49841460df02d2b9400a7450c1f3200af33906c507dc480405dd06d1baea94bb48feb1f63db485a6b417bc2b4d6ea06eeeb43283b6598ffeb056a8846ed75b91f3f8a6d0d07d7c49e09223ec834c3b663e81d58bc21be984dc19aa9d9b555c60a22f03c99f7d69887a660e69af6a55e361487b89ef569fa352050ddd78ea7d89a3ef03db907c8590ae04a9ca9cb0c29cb96f9369afec1df08538f26029764f2d66e6cfd9569a7b7ebe82856c96b281dad9166d488c4d0997973ade77bacf4fc0d6dd5b0310b499942e029c974e3823442fcd942bf0ccd6544117b133a1ed4d5ec2377f69bd605ff55fdaf066b2e9590bf0a488bd51e815905813e8e4c4b47b79ec136edf6600376f2e3e84e7fc53b6c91e08873b1dc1289d8f29f0d39331394c4043e043b1c74a9680d69d64bfa2fe528a4c48be980d641c200c8bcba341376f2c28bc7f5a23c827a8d98a6ed4a06f48f14feb83be50d3a0e273b14cee35e82a715ce0ce0d1098ab5394bd1663b113e430a6b725df8523235b13a00ac3e331afff1a809e20e488db47c3a279169838c8c9bf7916e5a9c9ed37b8398bd8cc33db26de6ddec47b224b67701527b2620cc70dbf13f1848b200774da4a518d2a0234b29827e3b8e59c9399b30a91d8303a522cc7fbd389293bf138353dd0a8fc5b76737b079d68a4d92dd0257ca7227c589fcdd88f2174752c8387ed2da98b9b517ce48e508d961ded8c102391ab63c28a44925db77fae4e8a9067a657ec29505b8b605a3cf62e5d4ceebdd8d3cb25abebfa941eee04feb8fa3dcd87901c78e7d2d63ad2286d771af295dd3f11c548f153b713a8caeb1e541620b6d7c4de02d739e35f17b7296aa5a91c129692f9c7ac6575f74683683eaa2caa4518252734b10bf71290e69830a441ad42d8580bd39b3012086bce6039f351030c4cff75b5a4aa8dacbc578af5a2034775caf36d0e47d7147d1c6bb4f9c774dcd3728208f7f3795b0bac80f9ba0ddd51f49928fe792abc70d187933959a7b92860c711bf4a5c04d6acb733f73e0a582d49d91dd9e66c97be1700099c4b319e35d907f0f941236176b51a2b616ad7562e9612eb12074b1d012c0aebaf45ae315f851b4475b900c3ca1e48cff51d0dd425a16ff6d48c688f276e831da442d87083bea9479ef9c578a8dee5d1d4e2990828ff5d41f52f0677de8c05e349c31930a70a864dca3a5d3d6641c3c9f92c1530290426c532d516ae8132ba84ab2f0d70ac6bbac7062cdf46040766f7b44c5e79440ecfcdf8de69fe4c3bda5c50b10b11506d34b5d952573e53045509860d576c98726194520d35aeae24f50161c15137df78f585e50c327ae2a635ef915bddddeff081ddbeafe3bc9173247877a5b668a0945916d7cbc2030967aeddabefcc1cdbc3f2d8a83a3942568137c898c4a85c80de9423ce6094bf4a8a888cdc2b2698210f66240515c140945d61f512b8962169cb03edfdb02e68e88b2f13304d6e984187a85395974025884cd322389d74d0e4ad9362ebff1e8cf4739de9e40a8c50eb267c8f3a2108798da51994dc9ae901e0b633254a08194b5605d3b4906cd364a453a7b0a7505131e80c15045d749b5c684ccf193a075c714793f70435fb246df6e0c671409f30fbf8b85936b3610db36ce785de7db9c9525f6104efdbb3a0ad2fa874e18d5385236f12c4332e1a79d4decabb9d33aed812d4c746a368bd8d86332b86cf28329bcc11208f538b4352681901717db1a07ee6cf012bfac08dba7ab5dd68dc452fd9e65f2622e78333e1de4f6f38be9a07a0ef856801c2afa9e885b878d82b048d5e264752ae4a46b6b7fccef1bf26ef579dae15ca26842bde303ed32bc446b505cd2b0037e692b9abf72df86d447c1e724408a8aa9b538847b3b1ccb51a714d61f4ac056f4903cf18069d50bffc860f15d5116ba2dff5713a2c681177e46b33c89c40af346e4d79404d8921bb9ae46e7e87d9f7e9ba9b10ac98c7adea1cf17ae2d2adf46e5bc5b0cc3c7c275a9047a1cf8ba1bab6d5c65ae785a440ce5cb1f6771ed9920dbdd1af051bfeb53c71255b3082aa15bcc478d2f42f5ad66375b341548fc06ba1d171bb0c98dd05519f5ef5cfce838afab37497c87628d0f945ca91b87e10e4332cdd6c1a5fd92b51de0f7efd7e907b1478be801306308aeccc604a4155b664ab60183d2c31c0e2cf9eed4309dabb0ab287184332fb8f71577b1485cbd38eed237711c25da404384851570c07fcc037943b6181a503ff1c4ed3fb06ae017a9c6d5d42f5df0364f56d7fa19d782cccf5d981b594be73783de73ebf96e61eac7f7929b4550fc8cc8d6e1a246ec03895d522a55db84ee9c6aebd365fef7e2e35d456e899aff783faf5c455ea659d709a72c6ac5a4bdffe9066b0217d9a2bad3a7f415a4e926021ea2566ba86d89c5c8fcb41dcaa714680753b18a2c41893a36359df9a7dda218a7d04be48bc8f442202a268508d803494fb6fda9a38d746cda2b78de1455beb1efe410f5aad4c0a39aacc5654d3cc522954a98e45205f16e5c06785e1e841c98d87646b8d9826aac79da5a6f805c295b2d2eff7ffda93f343ac4f63f2549ed4b4fa5b65d3112312562c11287173d012270b7c48840a35f7cffcc76a1383710336d0b23df3f8ef7d9839d567fd719eb950b1e9e2f52b762019708dcd10d18515930c17a7f5083508651dd0d519925d868a4da440353ecbb970157c6c007309cc42b3481836e09d41ed406739737aab3e6aab29b42d9d4ad8ca0a094e75167b496756f3d2244c82428bb0d48b2668458799a3b2079132eba21631195c7892d521d4e5d80bcfb202c5ecd4d3eea3658556d734eb60084a4b2e442e8d1f55a5f0b44e7674455d66bbea0259b0bb4cf5a185f6c9c7990ff8564cdf96b162e5f33dd2d1a17c959547263e9b293cd97b0eb902a904a5790eb224568be5366bc5332fe9e5f46cdc0c1c761346fbd1dbb955558967134f4a00be14865d372bd1a13df591b3454a203c44b10eec649225ec91c7c417d6761b8a4367d48df0f5b5ecef25e0693178bc44cc5ea7e7fac80ae44b2e89858218473065fcc9c8bdad3056d62e4f49bd8966959a4ed7aafdaebe1cdf785a8322b7053de309c8da9ccd7c539fb800eed63590da900d4e2db922b2624af32750f52281512496651caf8c7f64494d533fd15ac24cffd42e47125e6d534cdc2b8c9917f05dbe75498893926f0b3772b9e517c5372dbf11959c6dd6b22603da6a05f7852dcb5cdee281da7510558ed2fce89e22b45bffe941fee8d6b5306181d237e8085ab8e6b314dac6e3e3d168dc22d5b97d42072e1984af87e463ad55baf340665a0805b322038dc8c6f76c0cc3d0de5e8d281d447e3f5fa2b90338fb7b9f59e2d9330cf524b1c391449a4b51bc981e9e39c6503ca71a316e3c5b86b64e7b65c2f03cd0e42ba076ab613147fbbb2dd2f27b422f5672d3e1947d31cc57e6d5640fadc06246195fea2d7a5b2a88241936a16bbf7770a1e3d1155f2d8ad656792f7ae59d3c8768bf57b4dcc5e47cb4b507d83c16487d3234c7f2c7d7cf6379de5a98997f3af0598b81d6b1b938a1ee0839d93b79f3d89ea4b01081c84f0d588d2652157cf1095c60dc4c66b829caadb4bf702059cf983594901e103639d261f90423b84120879a8530b31208f6d52e59a5a84ad122ea650619f9b639b160c5a0b5c21d9eb05749d969061483fe84e8bfe2582ebdc9b8b0c2554fc9df1ca75a0ce113e14adbce401aac63a0d6c6d1433b9d7fde5280de3d3e21d575183506e834c6e79ca2aa3330223785b6534db30a2ee1ee6ae324eb3152f20a565f40908b0af6d19dfef1d0756ad82f9e46aa3a44ffd636bbd475a2da66ee94f967e6bcd79c9d229d09b0531dcefac16d74c34204a8ecb279e4c8cdc4036f523b9714781ff64bf19d8115fea6fb0e1ffa628d6020511c610bf2841dc61a287687d09b732ef0993a8ac6cf14e2adb879745ca8a0b470910a5a03a15089219e3f5c06b2dbaea5f07900b36a13fff98dfeab9d4d9bfd4ebcc123eb3b1ce60248a4481616bc28bc04b7880d4e59c1d0b97bff5935cb6fd5b82df38eeaac2027809fb0a680a416183e9c95c742982a981f3543e12cba2e62a99d63e0b7d3cef62fc31683c93a21b9a6dfb97ff20d30358e4d707c4534d1420d3d929a5cbb0c7ba36aac2c5d42d1c50b65d851b88fa4f4fa7d7619ea7845074692ff6f82dd08d639d4721d3437a1337d4ef40db35a9f1c3382d1529f21403215f6f499fbf8faf3375dcf8c91695fed15fa2dcf8db234d49c6c50db3777a047f86521b3c74a56d9b529af0e95016183cca3478fb43b2a697235644a43a1f85b75e167af1d0208ab1167a7f691f655f68b6b3ee26838eb14bd2c4d9c868e209cfa959b957b4e66d2ef4734b4df7b0d1ff532e3e54e1857bc7c4f93a706696fe80c1a54a53d138fc8f1e817016931575bda830a486752c30549c05ad2df119565b13432979ff453d49967de88d199f870c8cc525d6cf2d13687f1de9d49dd72714933094f8a1c50fba29a9c07e3880b1524cb39ecdd36d4d51b22379a5845006b974d11c498be5a7859691bb4dced537ca421cac112f52dfcefca752c6df32a024b620bacf5102d1047882eab76e2d0bd18bc98175bd6a44d6347c0b54e9aae6cb409eb471433a18e78d7f8fa6335a13d551f9df9145e49d67c205366e61f4eea1332ee8c4b072234231da32e6c90701f69a5b09eaf59a7fd30adfcd6cd08fe7c98b2784facb84d47bb379a55c8173d3be159abcd093ab8f6f7dc36df4a79dca9c552830f095320ee84fd556a03b85e0a298e57f6813dda4ee4ab5dccc9066bd79529eb166f2c2b1a21e4cf45b1c54b6fd2dd86a225bd982525ee8f9676da662158d2cd34cef86ee0d6a3fb1b4b4edfa85d2eb82ef786bc47522e96eca51491cd63bf55717ec666c7f38a1d50503d903a092e99aa7e4537ba3ff7b11c5cd8b824e8f5a68f218703cae2de0e70bd2f2d15d86650323d96847904d5f79b89b2871de34e2a336270748b19471bcaf53f074d5614428d89da3495f28943d3a427164d054e6ee65cfa757d446ea01cb274a8f6c69dd9485a1d69374d6af08900decb78df9ba5355969aa169899c44ad35e468b1b0ca801012221970f03732aae852b3c2a38a8cc8f354a44a8cd5f073f5fca6e5603e65eceda0d372741cd6e7398124c9eeb898b95baf93eb59436b24d58f1a5642a7a2d348afc0bfe41373f4ced8cdb921b65d3d5cdaaeaaafcac1975af56d11404818c15af37c6c02c1cb48bb3220a2d8b391791dc55e14d06e56928f9675fc6f39ac5f903294997226a1ff5271c72e2d134c995384b5505f3cad0a976b397090351d64722e26ffcc67ffe4bf753942ba996aea9a331abcf05969a61f49394e0dac01987b77492a2fc91638c992d10b4242f7d38348c3d1a706be043cedc7b59eab6e88738ab9017efb6b4e44735cccd7c70ffbd6ba84fc3f0fb87e32056a5e600bb5663e6f526fe84fcc232c7d656e5d24f9bb476350882690bd9ee097f6f9d3bca8c2b4610c5cea129124726dc9c278a38a60f045037419bb9cfef1cb8ce436834c08b82ccd08db94a13fee34c5a5081b880386e09d2a28f23127a3ed0c67677b1f2836b2489257843c622535ccc95d46c4f7c2df817d8f120a7024375e53113345e627171a9d574c8e56db5f674d018c9fcf111c3e440fad5b68201f916126b615301994c805cc549c712fb5ed87968b83442c634390dc5d249f0d8de92e5e259986d813e88b2c4a0a67caa300d1289ce9d2a5ec9427b42d4456650c40734fc46c1eafc0addb91fd5844e31e545f1eb4131f765a1d0bab4e1c0f775cfe14c626d05d51800fc54089b493e796f7da6ac11ea4d7222b30406d3bac153d06426644cff0bf78a12ffa9c0b17c0b2f139fb6471ac72ab9f7ece8b2c304c7f6ee9695fd06afbe2e5df51a6f70b12ac11fea967f3e980cceded8b51cf01beec5576d5a7c21a132e8cbdcd426773a1d0f0c6bb8eccb19086b5d9e92c7f1f67a749df395544632184618a432c02ff96985d5cd16327988791432cd0c779099021dfbd2ce2d111b276dce544d7953583456410beb5ab537e9ccfda272fdb66268c805afe9bccffe4f0fc3944803c21c8b5c56d943aa0af9d8f6f48bbb9a34e598750fd563ba644dcf8496f70d3cf6e9cad4fdcf4a7d711e9fdd80e9d1ac2261c714d718dd63bcd073b2df5f4e1627b850d6af23373599698f15a1ccd44d0a39e24ee40cfb2ddc3df414d1bda34fc53736815fb6876e523fb35d66dd76149c3f79541cb7c8032b65a8d23067bc865a3b3a8a2c1fca59777842a846cd6ccc946e40eab27d2ddd24837910f28ef5f015d0ae5ebd2ca5ee1012c787ba6739c20673fb49c0c614c01aaf0a1075505cc1d28536f4e72db6702209174c0966cf6e3af95cddd070b845842a471baec1113502b71afd9fceacb96bc3ca18e572aecee1a18de702b81b138d43b7ea66c3d0f179db9a32e6e449205a0b169f1833b367cbc217e8669eca9751698d1159fcdae4e9d05ba2aedb4789c9188f652aa460307494902c5924794e67882b44769fe1fbd2e6b10cd0fd85044604254834c0b0622127aa9b637ae9d3ca61368a118884a958e97288231621a59fbe2d279cf5b793192717e0cb049b20863aabcdac887fe5e309925b5585b96b3f3c01279387aa0a71b153dca94e5e10e1a649cf689ee02d90da62cee981376cb707cb93a51cc824bb1ffefe009a8ebed36bb31c1d20cc75ec821f0031149636cae176210aa8e115ab8bf84d2956013f79bf73c3045fad930adfac2aefb10df633593145b88a5a6114f1046b8090ea471c95892d0215aa0f55b0f662b420a9ba1cbd6a8faf6eda391292e2edc51a4eda242ce65f49d9c8f622a93066c503aa6787d5e8b972cc744c90c56c5ac6a3261aaba77fd2fb41ae91871bd82251f4f5a8e3b1c8fbf771a93062e52525925d0a81bba7147b8e5f8eee17891597e66ef7fce243a3c5c327b3481eb97638233908cd6c2d117ef016eb6687272a64a46a4efe936157e1f2664087ade49d4e5bd4d1197861ce062e024d28a609221a13b021d183064db395bcbd885c856c26d48b2728bdf0e98a3e1b08b1249b690812a9caf60168592ea3967de301c4e8ed1548292096ba4638ae2562fadee853ed386845b362034983f2afbcaf11b32054444ded25471c75e634798f15b5e7addcba88c503536fd83eeaf66308416528b40e550940d06cb68d0d8c8853265a09e27ce276301b26d35eff83341d60824258bbf7cbbf98f06234d6242f094b6b3ab1c027d6092808750410bd85f2224cce5f92b6d5288a5182eb26aa6c50182c4978269e017c3d7c950efce76862e2e755860587b8694ba249fff050de85b35b0379dc995554c429d874520d60d788e9462ccdc8d3735a439a1442bdc34955ff31f34c4221e754689471f3cb298d9014a2afa336021d255ac29aae3a8ea9a913970b8d324510e5966b63ff316ba7599552906a40a5aeea43a01942600a068a441411d54daf15e907e750c16420629578eb19a9fa315ef65f4e59c335cca8cc1372b884834e4f503baf99180e2685ad835bbd3be3359e454dbf08e32d9871761b248bed867012cda1f605201caa38cd1ebac565082d216d1cbda29f21d1140862e3c6a52e05b58e3193a13d91f60e6308d42d5696964b4bbda0528b17a903e500bb220185f81c47c25a0d9a6be2d15a56304d735892bd2630ae38f31d3a6bedac23b54c611e38c35e0333d71e67c5626f7d5a6c03f400f2e6a5959a57ff15775c8708ec9afb661598a5c28ce35909931f22eac087e04f18f24e036e585ab97745fd97c84001a7f54565f7d3a58d905d141c5a6336c60828fda9f48da42f8e1c6959e5b8925860695a77eddbe3012a54699e73ad5a89013ad3de486e8da5855beb15e3c899d9fd4e220a3796afb6dcc221a823482d406e476bb339c50ae7133d7172b36fce00297459cdafb9891ba5108a97ac43d453c32a09f20a9fc7ddd2796d682e9a64103fc8c46476211c188f883e6a08217198994aeebb8a443661efdec80d76ca05780a8411198ce8f56cd708ccd3a7471087c215c31d5de3f2eca5a6ae521923fc43f45051c3017cd06834a84a268d2d0bc50b136ec1f4b1c9f934cee6d822ed67865ad57064fa5e6b5757a07101f8ea3e748cac18a6a9d6f881f7ce843a48df40fe85aec0a2d177559dc5d02a9a1dc431f33780e61376a1d5f314c99910ba619d1aa6f061dbaeb51f4210315db30616bf1d2177aca76a7ab0f092b5c67575392dd675cd1908ef0b28d5338f1227bd1951747245094a2e3175c5c62fe5c4be5823dfca2efe3f7142847ceaa2febe46fe2f42d3ed453bef20ecbccf6cacb109ef46b383014e9af3fbfd7a9b2d23b17b907c0c12c3d953b3bf946a5ae44f8a71c52c100c1ced1a49ae24054f6551da85136261c6dcd2f6122385de47fef3a33c9ac21ed48d5abb479e8a9813ab662f161e8d35fff45fbc0196219351c046b1cd36d11698af112e714c1b951dd0cdc605c63ab2b5c0017e22788e4f47c03e89c22f2d8d09549b5ad12822dd9cf081ec166c2e3291b261bf17d4395fc5d3b771c304321abb79e1b28a8c31897ca2747401d6e040b0a87db71f521e3e3db09d87f3105b8c1969d0b389b2342854c9b8c4029f8f058aa477c5b17b392186087a57e55f420af41191817070eb5ba53eb4bc8e5703686bc2fe5c631c0047971d8e5f4266e27d83519045a46d713d21f5920a9ff25df33ed120da4c13983cf76b4656b6c513e9abcbe22d832bc19893a6efc8a2358e185fa74f11083459a6ba621b0bcfd7a8a5a289225da9e69d090e1e1370eb89690461d53a8e202e50225be982968d336ff6b51a02f626e3d7f7eaec4984207339fea6fd6fccff476e8bee49df6a8c2c3d684a68e8730bd0ff7891831207a3d811136027a2cfa0cc4bae4008404cb42c9d9a6205675f57ee07c5ca1ec1b8c15fb1449ff227a6f17ce4654489eccc2d2e2b06769410e033536a64f99bab6bc5a179dd73897cb48d40c8619b928f66d9d4e6f3a2d83cf063b7c24d0c0622ad9a214efae6e873fd67e7496800061dbe23021288356d5f1e678715192b6a0b73f77cc5428ec1a7017fdc8ee675807560e988a0fa84e1ab62ed63ae57097dc49c311f1d3ce3faf6be6c470439651b9e9bc87424244b5fe9b9283049daef0bd1636948be6812156af3d3852b192310bb9a85005d3bd490749446f13eb2aca920f2513b3718f9662d0a0925422754639e20240fa2982265b34ccdff98e58461573c2488d2d4021d46931de9688897e72836849657c2d1715d18c6cd005abb0e55635f35a2c87586e44045a2cdbc35aca62114f82086c209a8e6deb51590ee794c85f4e45c4fe9dabe1c9fc4552da0a7ef1d1f96d0f27611d1dfd04ce92eb0ae883e22dd032d310ffcb08a82645f43aa0fe2edc67341e5a4c500df322e91520be9ede0a93a7dcf665fb18f0de6199c29f5d52428619bf469a66ed8230e435d2e27f84028c6508a0876f7e9e2136c49e76d0223079d10c661b62143413f4543261903e3216aa7d8c79a80f695fbe90b48567e87535acc5085dea08c0e026eb9d62d55a8531a7abf51fa3c0d1d9d3284d188e929fdc7add8c40877a57b82e2140097e83571ab45c08867c8ce67fa0f6b516de25b830d365c76d04d6c0b35ee5e8eca8cde661027d22dc2f224f02d36bee038ccb43d9bb1e5753b0f03a122cd0a75670de002a8f6d27875d41ab81a470c1d3039528ba1dc5353aa8844073228ba4723849a65e9164e1099c35407f4b9be55000756c2731d3d391c6042a851784938b12a8091c45515fb566e5f77524842531b7c00110b1986ed2ea936f5c8068602a47acd23d55133ef1fb2d62391bf23d8f0292364b43d30a3a5b4f82a23cfc2bc7584525dae60756279dc0ae8637d95d3d53930dbf6636560d8110c992d385214b9b57ec4a57e4a41f86b7ef419e96a8c8f829f38bae842ca303013becc213babe35944c9f8426dec6ed6c64ddc6780dff3621537f0c5edd9eef8938b299a13480ff4670d8e571dec66e94fd2e364484fa84d6cf46d61ecfa85eae1b9ab04c6b0371cd1cd30f8ad74d1ef605dcdcb880a8564d4a96bc61385a9ec543cd83194af06dfe4a53534c38473e909ae79bb1e36b90c5d8ff55ddcd376c212bdba5621858eec88db2d096531e6ccf0ce446e4ebddb2674d84f7d0c0c4267a970ff53718bc850ca3d9f127a2cee02617ff3a4fd7658ecc4809b5238e9a55cba4c971a4e40276553d5c6862656925e92eadcf27e9ed80c1f63a2904051a76a5dfa56b027e1220a0054fc20afb7e136aab3189c83a061800705fa9f0b378b267dad7c7a036fcc14eca3bc5b1ea9c85e28d055b9acefff165183a1c024ca74d992c1e3d682d23ba91bfa5599dc6c147ba5e595964185a03f6ce4b21e2eca01d6bcd1ec3d8561c19765c8c30684e8da2ecafa70cb788baec408c80fc72072526949aff3a2375dcd124de5620cc74fb852a8d9a31f979b9f4fbe8ff6e1307b467104cb68e27393052c803422b98fdee99138699d677f022417b0137c54e5681d2c516195d8441466cebcff0cc9543271360666d50cd12af06960a1dc93e458d5fe5319d7b762e60ccf1e88e3c165a4d9215784186170e938adf81a8223c7218389b98bb8c2207050ae2913279a7f591c0caed8bc467b4d2ad744e2d08dea3ae8d53779e34940a05bb7ca26a94562e81bb71d05a6b27761a98e2382646f3e25b4041c8248d1fb38d8cab7437277c86db4153224d454575e67565472740a911edd0c98449dfc284b774e4240ceb1e4ba62763223ae22be6eb424f813d119245035995ba2b2f60ed5db5c121f5d74df3586368f104ed2926c5a9e55133ea39eb6ca472d292ee957a0677683c6a242b83313604b148f064239ac51b895acf0eab07c03630a98293478ee669f2f734635a926e925bcb08571ff49b90a798577dfe41378eb38b53947a7b4985abe1ec574f99e9a1644d949d64fa963705cb821ebc1312a0b20edf6de46c34619a2c5ba795bd812f7c8c3f1d075ea803c39626490ee2faa92cd58c13fd5b091c9db935533ca597fed6c55f5435eebbd844a95a6532210c802b2f2a5054ed4b1552b4d2ae00810f85861652d22578276ad04d87cef40f717ec522475b136efb22ea1a97709cfa8690ab8eb01f615c813f1e9afd4ea97f1461be9d091f57c3adb2ae33ea85b5782a7714aaa27a963f86547f27a3e9c180fe29bed45f6ce2d448d6a3457900641d91f961d09ae6337b0124d3e820d6f98ba51d9d680cbdd3d7e1b52160c0bc9ea25dce1b4fa0a53f3c94c05f70b19c8e5b086e4055c5d4209f7d3b02b15a52410d49a125698cf86d546d4c15244364a587d63d19eb3a589ae232d7b6a3bc8f494b523769f05c5027eefaa18c7ab14d9378a3d111178ef391b3b207a2626ceff64133395f6f1c61f49f55c8a2b1a1a12541d411af6f2a730285a327ec325cb1c49b41f21a0a4f79c711495fa45e54dde78c56f10628687cc6ee285c471aac9bf5a333f73d86e02d5d44aa9d639798f742f201c84717d7dbe570bd0f961119e71092a466279e9efa6201d59f06b581265b0ab84b38ff356ab2865a46bb3e9dfaa418d891d3184fa97e2eb32b38a09f5756cde15dd0412b3bad53f704755836e4b00db2ad7fe8a9a80add4129376db8ec8b240f51a5b57aef64c644cd064afaaddbe943120729a97da7817cb51bd170745f6406b1daef86519a647d97cc4f685592211ef639639b550688a79b4c520ac5eb15ba5a2918cb0c4897c1aa3b1def1f6390a1eeaa09d51029a55cd35be44455d0faedee916f4c4f61fb46fbcee11706b4c3383c654e5eb61cfa5e29e09f1952aab5e73870262ea8e59659ea90fd31ffbe71dc6a28ff0fa72ebbad420b3f94388293dda10a98cf47c35b4f790337246efa71bc2885b35e5b8ef840e66b07428c9d148baa4e926adfacf1999081ff426fa9257dd1035557a704b00aa79be73f0de22acaa58f9474288a1dc53f242c8445602252c496a267da085e4b0a13c371e19685b126620a8a1d67450eae68e7774045d79e5a7f94b2073eb6ecda7081165eb686cb088acc100eebbb8af37f614adb19050c4b6222716822a9f3c09e5b4a1a713cca28992edc4513d12557b77c50fec71b6248b5cd8329a003b95a6c8282fba0ed4e112f9184cbd436e0560b19094b82d34af7336cd91c9943a086d52f6887b94d876bc671b7243bea3b4ce4ff1dda94c62437cc7a51189d2c28fe4d8aa2aed85df869ca4dbe2ef6940d81078525c6b50575397ca82d867daddde03fc9d858e8c9b9febad45216e081dbe3b9fc0d759a16389d8f055537ed4f6f787559d323a38c533472566fbf4cb779c1480d00a538699cc303b66e49cfb5ce22fd8b7c511521a2b3133eaa6ff1616e90354f9c0ef7b0348302879ea95e0e159577df61a2b1b28015d7dec0b11079405a1c1d1ac4fc069831eccf6414372fc6c9c7ad391b0c8e4d6d67485e93b83cbd115c8867936c045419c8de80b1ad3337320f8b53eae493917049e7cbf84b08553e1d77f6a213a91f984ea8ebf2c4c44fb3519d4d7a26d428c2776654b9a046d603ac2442b45838ca05ca556930b807795068aa8b940af1eb2296cafe43b97f9db87569c509022d76c4eb26c2bc9912e76a54dd12d70c34436b1792b0c691dc476cf26d8d55a70de4af9904423499b45e6884d77234b5af15d647db54930bcbb98fb93b8376e3b519602c4ddb0a76bee300ffb122204020cf108327fe4177cb5d260cd8a5f26c724d00d8d80e1c936cfdecfd936315ef7fa9cf53fd9ddbe22743c6d747fb9ff38e6f4721c788a31e552886410242fa8b7486dba109c58d77d8a8f2d362d2862089a6ef8c4338ef21107a6f5bc0df98830def0296b6976c9692909f8a2d8ec9725136144fd32c9d8c647c66c23f79ba6a9867f0866621885455729ef161e8b474304451a23d317898eb56f1566833a6430fcd74b491ee0ae95b866229d1b6102936c0d087272398bfce44d2367842173d422a5f7d67e551495039c31e4484f6f46295a4b568ee30b9378cd458db077bdcf50b117e18ea3a4f7c78e23a23f2f6f14ad2b23652cb76bf0b4284301d5d913401a8d554959bb3eaaa54ca48502f212518834c8baec8a5254b2ddae3e272e2846737f684a8afb856e7593c96802eb82de7619092d2a1e11ed01cf72bab9c4091c78e48994113feebabd60d6d011b788c14cc53309e436bf9c2cfb748e520b12c6099375c2228f5bdf7e1ebae4d4698bb92e9fcc55f30dec59412e8c915504fbd076141621a18fe236b655e46b4153a9bcaf891de0a8db7aa9556104869e4547842c00a655b448e1eb632dad4bf33e693f904c9aed8da7e218c80e3a1ebb084be13b48bf47584034ebedcbec8a134a41628d84ccdcf8a9f99fe588463583cef2f8ea0a340d91026105f98bb700620454a2037a032b945830da11a70de59446a24da13de081f64b75bb9622029bc10c61738c7036a067effa2b71eb0c66664c791628480a31120f203c743b050428f82bdc6537e5a4b859ea99608aa57296a61e481b46d1d336a32d894476f7ce2403b4081d093709d25ffedc1c867883f061aed8c55538f3fb1bf6abc52ef063aef846af6c10e3c8f246af4819210ef96e381c12c618df0d1c4f462735b7dfe294cea7f5ad5677507b432f57d72bd427b519cd803d8f0ce7f13032f415b5289678f355c96f74bb2293971fa2a1a77f421f45738e44f126927fa2912c92c4db8f087fc40c7ffb112784f37ebc0fdfbad0c2d684ab2cfd8b5e913242e82b195fc96c74bba2538e47fa11fd0bdff12f7c2513fd0b5f45dff12f7c25e35fc4e85fe478a7221ee93dbdf0766f8efcbe5e91e8b6cc23bdb7bedecff3795c6fdde8dccfb7e617f132d0db779f1ba4703f5b3f45201c71f32882beeda93df949fc44224aaf9793d27b37119df83a9527b52cbfad65fe47b994fbb792affc8b8e2f202f09a33a1b30f640321e8f87917b9571eff8686ebd23bd772cb9d1face9db2dfb09f7f696e27cbeb4bb0fcf7e37d481ffcc19f8f76c314d7e2ed83ebcf2d3eec87d96217877d60bf1cbbf4c73c23c5db0b8ed2ba221f857ce410b81ab94379f311b251da19ede8ece8ece8ece8ece80491b373e9c8d9f2ee6f3f9e4e103941e8ec04a1b313444e103a3b3a4168a3477adff2ac51696774af48f4bfa3b3a3b3a3b3a3b3a303ca420907bc7103c78dd20d1c37e27c5f210c6e8f9825bee1a6c79143355ea89be0cf9ff5dd629fb7343af10677b01ffad3e26171e7a96d10d32ced63d1b7ac83d447f6867cd4386ebcd8b682f041748c7c52e2edbda849194406116384f8bd4ba2833c195f103e7aef7890fd47e341cca3b2af767e05c918638cef8388cf5edf1fe36ff6e3831b751f23063df6f7c7cbf51bdb3e1fffbd8ccd0bfff0c67670790f33865d28de7eb3784aac07c52eef63c63ef8e5611a3b46783d8f2ae5d5b2972daf3e2bed4b6d13655af2549b2fff6a2515fb12399fdec7b46aa193e857cd613ca66b7f1ffb56d32eed861a0886ffb4f792257c8745089f11ef05730c0d7546151cf2645c4867ec3fe76f11fff088f1e8dc3fddd3f9d6b4fe7a4c734ebaf006ad663d758e3ecc0ebb54ece4538a3718b3855de2bb1e11bbc88fd9b9fb9cf3fae83dbc39d42efc96db8f0fd80cb14b3f8435f2837eb2e1a437013f61bfc16cfd66f3b491c4ec243a4827d131ae93e8209d448c2ec2a779b361c3475edcf744a20ed2495cfe91417dd00b22b986ec8e781193ebb3710612792a1f92e7cc12cb64fc84f868621f5fda9758f4347ea328efdce9e4e9cfcddfca3e2729c2ce91e43bd2e548529edc3fd19c2365efeecbec43d99b649f8f5f32b51ba6b814ff88995ada0d535cc71828bef53053ec9261fa307b68b1f55bdd89f9835db2a71976991f338d17de5e1e36818833acb67559966519dc9e1077fa9049499f5a1ee9fd94b3e7c41bdc7cc7d928b5999a4f889be457d1f220b6239342a09b32e839421cdb01e5046aceb4c67640783af9f7ff4e275888477a7ff219de44282f1f0ee18da26093135cf2f541cfa424fbeb23de6ce496e7849872874f67f7d184786f82374a658637d1b3912374527c4b4339d6c8d1f9a87e7cd05fedf30df3367aaf077a90e63438428056c2f1debd7e14086e79f109c94bf40a7c89788897632cf19014168d1542081dca7f10c20abffa9b9fa7d6d4b6fb02a47ec9fa1fee724d6c4e3bdf5af57e8b63d7f5b3821ec31b8e6c610cf37bfdc430bc59fcc32bbe7169377ac5a2136ffd39a601a3315624b3a55f2f40ae1a86fdd8af48e8b7f8875a8b3d6afff39866b18ffd60d761b735494d5293fcc0be83f405488cf1b96cf3e18cf1e994cfbafebaaeebbafe87bbd477945efff95cf4f32d8ed5ff50a7d794f1dddfc76254468a514b3f4fdf3da7ffbe6a56a7572e8be22db7633d9d007a01122d4fb42bbb6377ac8ed5c95e80788ccdb13cd985d9db9cccaeb2bad91d0f02f220d96f2f06a4dd6afd16eb7673cdead7faf5afc8ea581dab6375ac0ead819be035e9c75a6be14773d9ac8f6f8465ede7d3f361b4d6dc60ce7ec391e98d1bbd62df7efa3f9f8ffd1fee82bdcb2d2f08643f26dfe217c34afee20d47b619de2efce01f9e4df036827bf106c23ffc73a375c8878f69377ac5d64be2cd9af186bd2d71747ab201b23ba263854e14b96390dd912e667205dd77f07d8abbafb5be009911c6d75cb6ebe505e177c7497f4678d1b7e186292eeb2336bf56d00b905a27c8c1acd68710041f54718b67da6604e82106e1cbfa0d5ef930565006c270bb5976f1368297fbee36a87efc8f5673c5db65e1d0cf9aa457423e6a19b1b5013f3dd3e00e63f418a365c92735cd659ff3bd9496252d4b5a25f92d4fba945287fce72ffe86233bc556fe452195212b9350a1bf0099724e9f2f4066ceb43ceeee6e57734ebbe373ce49af9ffedc7a1beadf9ba1adf5ebad587d5babb5b6665f4ddef1764ddc430faa260ffa10c841ef6f5202c2db07fb1065eba563983aedc24174ac0ec8ad2a728640f9f5693959e440d1854cbe91dd919c9df75e80c86749fa6f88972dcce325d3aff005886559efa1e612df6537279c0f2b1ce2e57eebdd3bcbb22cfa967d5bdffa0d8435b683cbbc4013f49f0fe8f3f9dc0799643f3f3e9a78b3397be7256f52925d10761a86ed5631b66a9290cddc825165873507be00711509ac61d49a33ff4a3d927f7ea3d67bea9d3ae691fc3db5596b314895fd3be69d4adee95fbcd97cb30c6f305fbcd10f76146f3eac0d9fbf66fdcff556b5eaf560929aa426a94954d76710e770b8afce392c5f80b887f04beee1cb52731922b706b11e325a38b24bb9c9bfbede30c595db455d1eb6e0fbdf681d13bb487ca35722c45bffc3377ac56b432bb4904ab29af0fd0fcfad69e1261720bb235ac8099271c8ee8816b6c8da765f8050f79ebecda1ee654b73190248a6efb2d336cb935ffc1ee2e59dec36987ff8d6d8e1cdeee4f712db4177d077980dd87f641e696eb4fe7b97994fdfc21bbdf35ddb44ee78f3204e9327e867f616deee7debb3772a798a614ed9d32fc1d6671afdab5149b23076ec28867d3833f27c8b370ff2b41ba6b815fb10e579fdf6922f0cdf0a92dfc77f6f755a07c52efdb347ff94d8faa8e688b77e88ad4eaf3cecd8e5d1603ea1501ddc7ef8f6d1608d6e074786b97e2cd4023243fcf15846b5e856caf16d376f22ecb7d1e76a20cd3d1fa54ca92ce352eb316dda1aff0a419e7ff37c4ba33e1222c36f4b00194aaab95c3af181163ea0a50c31bc1c3a518a51d619638cf77ae9798286c8f2a1552b2441963bacff0bbb874464f9b0c70565745009b14390db881ccaf25d8b437fe9913e31639c1f35eba136bfad85bfddd37da4777d8cf2add5eaa579ae5a75a3f8a02132ec1133ed5c633b7f9f0b5f4e255a78ab3992805e391291e195a19c33461931842e786a61741ebf9d3644d31ba7354304b370e1374e86183a6aaf774319483927a68fd259138a216a6f10208cbd31768fdbc9d0ad32cc2ec7fbc6dae6c9b05719764e868df36edee97a88bda67b24193cf59ef5a8a7def4d4939eea9bbc89bc86020f75e1ce79a4f79918a25ed91bea1e983a12d33d102622414ae8a20ba566a594524a193fcf87934229e5fb4b4c44cc63bc8610367648b868aa490d2e7c87ed100048139d1842860f69244c4c4d25a2139046c20820470c6dee910d0e21e5042ea82095e14503052c4a1813244d866f82850b5dc64859033485b455e8e81076a44080534eecea8e28a33b9190a8867d08c6140f0d1a8d48c4384d72102f95116cd03246ca1a20319c7b4ed08b678b118918a7099108634b4185149126c3cb0bad637e7c491d8bf5f12dc772f9b066b8952aebca9c4678bee494d9f2613f602f84c1c767b90902b160b454a33e7a193e25a8e47934197e853bb23b4680490dee4976081f148fc81bf284bc2019be23327c37c34fcfc67bf0fbcdc7a391677836f6d98844d6b3a1cfa694b767935f4fde6e0f4a96f8c598d8e005a1f6d1b8108a2c411f8de4913313c2890548ad77f7c0adf5d10b6577d85ea1773bf8714e05be8f10a6945e67b9d3885e6aaf732050de46314b1c9a4708c590bdee5ed450c8bda3fc76092784f4e3a4787e8d76ca372184aa88edf091ab62832fff613d608cd1053e27e48c6cd4c8f0ca319265c87189727c8ecf15463558f10511e028e75081050d7cd003237c09ff49fcf03be38c2e027ffbbcbd254496d562968559bcc5bfbede89f9007dc8408e97062d6a516a519cd2c37fbeffc444c42c31c410a653f65e45b890666b6d28844365001902e024143ac2de9048243a4182c8de508e12224f5822c71842809efb9b7e94143684109a71e17593bc618a0b7f8b0fdfd280305ffec47ac48ff05da614420a217689f8d227684854a3ddfae0b4f081163eb0aac671395a6c4e0c6906a7852c7f73629424c1e55c5af8400b97d3383238026930bfe913dd3ae10aeebcf70af151463927fe110570c61967c858b2fa1d893762071dcb7c13c6f3c4cea9cc774f35e746f2496adf8c11ff78594a87c99721862b78efed8eeb1f271c85441e1fca21608e3b426e0a49fbd7b1c4173dd2836f43f68644ef6443867c64a3e6c2f772c4d0a9c00c4d90a373a309276e79f1e167187f402d8f4915ee26a99034315208928a1a202c406a254dab7066a8a4c9d0f2f81835f441907f236427d247c38511d7283dd2a313e3f1b2c454648284126c9a21dee0cb8fa5f811f301f38104db95e1d769a126f2d1cb2e105f1a12d508e1d084155f84a0c8de188223910a46ef343289e28620b5220368e1032d44ce4605b0527aaf8fec2b20435286ef9c766b70a71f448e45ea90e1d31b84dafbc3fb22de13408e02c89bc38938d1c2ae674a8c00a7f29e2e71fbb7507e2ad45e1db2982a9e803a64d8a92538c801c1dff9c7e8ef76c0777fdd32f424b59920b9f05b1ef4ba5d57c48778f371d96408670a2e84d71459fe765d91df3bc6a394e3470a117484d1c765e383eb620948d0941e1fb86cb2cb49eadd207e7f48d41d23debebbbb5bbe778762876a3c6884f531542324aa61694088efe8777c1b6e88e2c689ed80315a0cb18cc86da939378a3047ec8038863b6ab843e9b109f910fa2846e978f318638c43189123d486e81c9f5b1f3df83ee20d46cda6e1c687edff7b7a7df4dee2e2f6b73c77184229f10fe88303ce38e38c1c537a7cc444c00c614eb25364a344f2e6c3fa884ddf82c247d029b4a0c833fec3ae57e443cd9ac954052d1ff40aa4224807719dc4911c72c821871c72c8c1539ef21857c2e990993a64e8741d321f6b85ff9e0e21b975a4a08e19c0d9be044fb91220faa876fd7b957ebe3a8c87763dad7eb41d5cfebc7d874900c2ffe0cfc3ffe0ad7e7ffce0141e5cfefc0e2e7f70caf52e9f977fe11ba470537a7c5efe07531fbde4166f4cbbbee5f5d7976c694e7ba9ed486c6282a4626a4ecdb16c3ac6e6fa2769204d5291b89a443543243f6b434369725093d42439b0992e7b507d168103879450420971c0f853eb09dce895c63610e0da6befe113d75f7423f49eb84eed2d4d519d8dedb51037f543e8b008bbe3a369777c3463778570739cfc5ef44ef6e53bd19a477a0f49106f3e44d535f951eb15ffa849bcb5cdc9f0bb35a8d32bf0bde3224d939f0827bfef9a771239e9bda826bf8744ae5f3f0109010c0c0c0c0a8947599dc601087efdd288ed85c8f58714faa81d7c38964b2e6c84cc39244f21746207979835cea6c1dd7a662a11adda1ddf61755a9dd71e6353c58d4d1537ce660938a75dcd19ccd814a989c2e64689db3d8bd444616375ecce9c333451cc4051c4ead89ce8315348de7ac666d2396d329ddf3333a219ab63d353e1d6411adffc288c41d71d99bbb54ceabad08f755ab6c68e767eb528ae495ce5447cc6554e64c6c118039761ac3b42aefc7695cfa46e0f51351137d17fdf330dc5f53549afd09a43b737a4659a484d42b1cc11365814bf6d042fdb6d99777a16d3f854961797742c6d7d6deca033d1b671844ddcedf3c35c6ecd650883eb627dccdb67eb5bfcdd342b6663bf38cce286d9c22d2f8634518d90a8869bdcc1c8048c11cae0cadf42cfd68030b83d3fd67f5fc291a3f376a357f0f672240b47e4edf34362467e6f0301377aa5df6115c34b833e821bfde111bb579bcae414b1a2c84d912a8ad81489a2480df65bd7e40df471c27f26d2fa7aff7a99234f13bccda7ef54f2aec4650efbb0b966782b5d17842f591dde4a1b76e10dc6ecd8c5fafad1c22eb28df48ab58c748d1128a2357cf43e779c6f79c8facef0ad88b71f44c0ec521f521c3e7a5f63a4c6488d911a2335468acc1cd996ac112335bdca5132e28a382335ce488d2be28cd4f4ca883352b5928f4a1987cea51bed9a36e272409e7d515fbc8155bcac437ea51cf9611ceedbbec41b8e587fcaf710ce874138219cf01dd6f42de0288a811881728fd4518b323e8298d2f7cca8cec63653ef7409712e93a1c1e048fe2da473d029d82a54c97b25a4310a38eafa5453e1546cbac6a994dea98f34696b001468b27f636d6b95eb30ba011703b6131d624aa8eb371af941fbfdf49d1ae5be5697dd54f25103707418a6776a55e9f3c95573548ca1a8fa0fc288dcd431ed827681333917e3a63e42aa5310e6912a8ca9c9fe25575cedf3a70820417a8a1842a461401df0e12377c16a1ee1a65207549be3b9416040be27b2f7bd0ea293d822889c08f8c8bb9b871d2fb6e04e1837f160596865292d9beb65a1d65d702aed8526f99b81a6c79879a994908f95ebc3ecd3446de3581c646bdac6b150e14edd0547f2f716e309d9bb078707c5e26e8da491e4f48e9be677c88a3b3fbe7c6a599645572ba922d22937f5aa738043f6f7921bf9c34e657f9b84bbb5cab1c0fe2bbb235e704176a7fafd16b6a3a9897d9a95210cd9a779aec18abb4d18647f113886ed90b445b083cb3cb8de028eba30102350d7b7aa55dd4e2555df6ab5897a854ba5ec46efd437af57efd4336d937d5501475db8558fe46f85bbd1ecee4fe9677bc933451d01211b2bee169a22fbd71a77cfb9e798c331d53a2cc7f2c9ee4353b897ca4dce24c7b11c206688901c85b809beca47fe7789fbf21665fa3bca449938c4472d1365a24c94792f64f39e50b3e82db27bcfc29164f76f0bcf622707463929a4f4795339a925ad73d4baaa85d63e6f4bad7357b518ce077e3ecffb637359e7acc31ca8649df621f28122bb07cd10c9eeafb67991ec3ea329812525cfbbc47bc830a3870c3fc261786eaab0e2a68a2c706c5a46480f699916d2443ae53b6164f76fb543068f103872e880c35551aaedfe1e845142299fb76c7f0fc218e584733eef09a39473526a5df0ba9ef735a9655d57ad168318f6bcb1ab5a8b619f0fe8c27b9ff7b5fdb10d02d9bed77696d92e31812626cfdba4c43a173a39b10e05c53a1a2228123d6f51564bac0934b1ad8568c8f609b6c3896d0d05dba1f37534200d1acf9b06fda4f4c88e4fe827a507cdfd23c88ee323f790c6a97827c089ea6c6c2834d9bf3aa9da0260aa60b891bf0dced4d25f836389df9f3953ff752caff356572bc712ff0c65c0820539d0422a0aae0a4fe83c61092e6a8e60813f988a37bc5442c6c4a7f1a0bec48d4a01e27afb160331810ceafa1794acfe75d29475bd77613b206ca23e1961c45206ca3c99d6f1f2fd8cab177162166ea275655914d7157cb61491b8cfbd4c3c638c3db10b575cc9b48e58865ba15e883252f5282a14226e9a9b2823b9719315386e82ef5fb370d3db6286d2296aa1c9fd35b93ddae4fe08df0c261f8c114af824b4537c648c54a24930bde294e8936c128430ad43cac83e4530c05c188f4f96320e0b99ec5acb09183785c7ccfd56c6b2e788c43d01e3d66c5b1ccb27ef30ca8debca47fe99142ac702dfffc2712c4e385349e558a4090737f2cf52d71515874aa4e4a6ea84bbae902aa9722a54c8db6d420859049bb3a92ba71280dcf8ca38157f2d752d9553f1c6178e5389c90fc61885806ccdac7b2747b95f42f6df6c64d7a26557e24e75e548fe29e7590f49c0f8c8652bbff7394b499a777a91a2c80b6a6e7450d3849a7782400c8a8084174081b38317a05e92c08425546348e9e0c00b94bf9c79a720b8b082119832c8388204e5ff308984bb49551108e59b2d7ab29f567b54ad43e25a866b7c86ecbfc927b2579efc7eaa2b47a13e39b2e046e126f9fd9b549986c8dbe226309c29c58dfc453e527db2bf57e980bde2bfb92ab2ff28aee8fbed23613cc599a40adc4b1520c91b68128c9b2ee04631ef74611e1ec9ff9b67fb782153ec1e2986089ae573c04f3e3c5309e12689332156865062d1e2f1a1104ec53f6a1a702afe2760dc1af2566b08c3edc9eec816b2c89da5cc2665e410377512dce48e7c1124fbd73050f52577ff0e9d1bbfe4949b3a937927d0fb67aa77c2deff83f1187dbe6af641daf518eaa339546b3cb8fe5d5fafebfb3e293d5e96df59e22d080c67338fe4ffb44c8896c93c927fd532d523f95b2da379a403e4c659ca47fe252cb8f5af7fb5c647fe488d6b143eba3e4a3922f7a73cccc309671892e5d7959f5c1a6cfc2b8f1936c64d31fb5b2148b267a921ae3aa2ae8e9836303030302820b8235b9841de4479278cbcd920d9f36653d9f36665b2ab7a081286d6430b70b41e5a90858f5cce64dcb495dcb44519216e6a24643f4296ca1e85f71084c7472e4359e3a617e3f5fe39dea9c619f94a9e8c30c207e5833626ae753c5c8aab0806195ac1ed971fe37b73be52eb9031bdb27aa72c15c1d0a76c06a51f9c8a3fd4b25369712afe32a67550c0adb84635c9246fce264bc29db1aedec9a11eb5ac988a4288e47e3993fb670d59916371d93dfc4dcbeeb7928ef79b02b2fb0d87ec3eae5ac7c332a65736cf5b5c654fe1ec66d024ff6d94ad7cd92069ac6544e2c218fb9d8f640d56dc0d45083531a9776ac966d0271e4df28fc9fed18c2f647f8bf1f8e4c6350ca7e2150d3cba9291fdbd495b05433d23d79553f1cfc8b8efe15657d9bfd21471534ce57e37b31e92c0f191cb306f5295fda52a0d79e21aa2704db273021878724c6951c88baadc5fdd65d129237cdeae7eb6971c659c4a3f0a0df508b4a0baccbd01da2a01a525a01404f7522628bd7713658733f04f2faadf9f7331f680d9c5bdc02e41778a7b9753783815cf9dafdbf1f0f5fcf2ba04ef14e53b94d49c239520bf7f0e15b546396c02f4792731320174791e0361ebe877efade3b995edbdbb0f27c8efa1b6794fc0b3cbf39807ddf5d1730f9d730e4324207408fda10b8c30420891581bfa3df8e07b35de7bf0bb0b08b31e92b8f191cb5b7f7c18dffa08867c04af8fe06633ace12691bda108cde0fe2fb9825c3b167ff7d577f080f8e617d84438bcdd0c9fdca49492fa2862617bff1ef4913fc07af9d49de8cfa9b90bca2e6d69ee915cfddaf25bc2129be87d06dc627f7c8f98fac8b31f58ec4cf1b77e6a8391ebd20fdd0f98fbbb0b5894309e26be80248c2a3cc163047bdb3d3463052778c9117086406aa3186c44264aa8817404a185500b48ad3383c7ded00ac280852ce6dc66be7e93796e8e05fbb9bd3cefcf6fc702faf9ee583e3fe79c325ecd3995f820ad9d4afc8fe64e253ea641a712df6acea9d4f8577c2bd22232a453c629e78c51461863453f2ae5f821270b2ea5a11f5dbc8d4aa09be383b71c98fd1fde29844d44a2128c9d736e9a6fcda71214bfb98ce3ac261677e6b8c97adfc2e4fd1de79d6a787f47e2a692f7bfb01da1905583e628ba7aa7b9a220ba2a31c9e6cadab9b27365e7cae51a4a6a10bd89fd8dae4a6aa8415475eed62a987caddf1c153b2cfc5034873ad11c2aa3a1916026063da8d65cbeaad576fd316d731b94b780a3507e94fd044573a8c6e243cd879b28293f9ca0a0a09c340a0a0662040a05a2a09ca0a0a09cac5622fa62e22124b58272e8506b84b27bde107e527ac0dc0f64a2c58d5289bbd9ec62afb877bfce592cdabbdb865670fd9da891b4b76bef88c4755ce994b15ed80ebb034629e7a4d4bd3572d705aa193a956e69775c41b89bcb22bbaf367f43eeab16eeaba3cef27e9fed25ef0851f707dddddddf4790658286eb78b357b5d8a7e7677bc9d44720ea993a956959d28af059de36a5079687e8331cc73e01030d1e1a61a0f45e91e87f445331227153bf7b0d4e769becef4f813c2b7001072820266f84c73841060a08f1b75be29feeacc87d1f7039b93eed55c051278f124209a1a03c0d1494a7f1212d0508d1875e14a281e205745da77df4e6517aaf48f43f1acdaf2764dced77c47fb7bd9968711fa4d6c2f4e6c6b1dcec4f23e5589c8dfd1637d1528030f913937f419568294094fc494948eb9e13cd61425a0a10281f7a14dc3d29f4438ff2275a0a1034fee469603fc129f451b0ab661e89620a38eae44fb087b0cbd01b6c0b375118fb14c74d2218a2cfc8d7ffa0f9be3fbd79a793f7a759b809f4fe16b623cb4e3447bd9977a294be193a53af26821fd7722befe94c7dd1bd95ce5cb8c55d3ed1202af4572382e6ebeb6f6f26fb5f20cdb6f39393d0d6325bf764ec5bc6b1d0f72d07cba958260e656935bf8889600797af37790b38cae4b196b999b664be49f4e1a8eb4af9a1c4a1ae872626dfe24e83d49a681065a201a1020e55f2d5ad89e6a867f29d7960828118812ac1ee911ea637f4e63d9ef9729dc60d6cc8c16a14b506be5aa5a8358daa9a7da8f1a0d6dcc89dabab513e386b4d956262515f37d71460cb6bd5158978ad5a47a9576090e85395a22e71615cc52ec41e29224ff442bc91fde34dc90e925be3589c9b1ea3c738bba514326fae295c53e88a445e5d37ef5461dcb59af3b21718d7ea9ac275536b4a6c80712c4e092ee23021c72b5871f34e14c8b942e602277ba9b54f2ed929c9c295bf95e6a3f4515a6bbae710156582d62830cda1a466651bb4e0ef22cf98e6504b5cf8be519776c411483c0a7b244aa8eb3fffd16a136e01fe52ab2a279c8a3fa63987c3566fe09c02b68a83ec1f803ed599579fe81101f20eb2ff85619aa3ac9602847dec310ca4012950020ccafe0baa5aed5aa560f85aa5f4dbc7be6a29405c3c38a51fc3ee91647e48697ce10af36a4c8917b7c2d494e85cf8dbb5cafe2556b85bada935efb79516001137cfdf4a727f89863b5d3726ce64e9987f842339085011c4ddb879a74829be6ee2cd75136f6eb2ab80435d57adb9695cf34e150606a68ae0c7d5b1b2e590fd2bcc16303031d973386a6a44d04cffd2527ea8ff82320205536b72f8c8dfd21e4d01e2a1aeefcc838a4b8fe41f6d62156e92b5a666ce276b6a6a4d29889a77ca51aa29d5e0d49ad2bd89c1bd71d3566bb2156ef3166fb27f8dec957e1b72a81b6008d551e13d67e5769ffc2a84300747724705280718778b32b945ef7994b2bef7e614891c4ea4427536a2840f621bbd626394001bad43875ef1bf09e8138a0e365e9d02c2faac8c283adc0e8571b7e8628c3d2f46291fec8631f6c49e39e183daf7b48e87b51bcc90fdce0b83bbc59eb84594c9c945a2a8361618d5d9d868d8d42954d184fe645964382f3b37cab2b87137b567dae074c4efafe14cf0a50a24cccc8890331a37f2f7d1c89d5ced79b5fedf7c4ca27cb024ca765045ada3a2a4a8544ca4542ad53b65342a26687e00d58c1e189d1524c04304aa199de13c522646c63346d6856c8b47f27756c8321ec7e2f4130240d4323156097850460993d174eda96978375a47b5e9151e6a1afa24816ae350cb7224d05be4d69175915521f3a21ec9fe9de1a4e1ba5e79efb2ccd02bd4b22c7841657c40201044394143e8e4e4a446ca2cc3b52125254533cd2085add42a0e15f58a23158b36a3f6f4f4bca669af26aaf2e66ee24cdedccd0d4ddedc0d01e600329c5526863bd5322c0ab2326c4c094cf6a767b8251ff5d818c00006e05433f454cf507baaab677093e8a14ded90fa9e946dc2a9f87f8a15626bd0247f1b839485b133f6091b93b2327dc6ddc1a9a832caea91fc79284a4f761a1a3034aa6a53a9a84fa857542e60778d13f20ea51cd9bfe6b00e27c3a93e549bc7c3ab363e3853c644ad2295ad3ea3a9c9c450311146364693b22eb891e36c8b5902939921cbc9feb48c27e3c9fe4d5170dfa9f8dbf0e0fabdeeeeee0763377c8ee62012e910d92086d2239552a5179bc81d9dc84d8425ca073355b60388bf57b21dbc2c6322b5039566639c4a194ec55be056aa19ac0bb2ff8679f4645738951d190e19b7e4a38c86871eee0ac785eb22fbbbe86037ec07e183df9a67184bef6534aa999a6ce98043299b41967224ff52b519e3369e62dc0d65d54343e3583ad7329cb328b02d703606d93f01756565a5c64dfe501489a20a5771900bc061a5d6a3875ef1875a047cf48393dcc15cd72b3770c00107ff1c2c7676cec142ad52c1c33bd523b50ad9ffa6ba9b6ac373339ce75c86f3640b4ef1bd98c33ef81ece81bdf90eb380a3260662046a7e8bbf9a92308f14e354329cee066439c8543e82a936590e5ccfcd52bde24fa2c966cd3bd15803078ce166aad410d8f21c8d45a2a6a1f63c474353cdb0a1e1c1031dd8fa399373ae0137f2ffc1f55824dc18b5a7033c7840089a6a43b345b5e141080fb8537645c6851323cb713d190e196ea6f2518693e1643819ce7b55c64d5ba6ca0eb04fb36460ee5653d9bf3ac0b658a8f5702a3d382cc454c1c2647f131e9c8aff0cc3dd329a8c262b92d57803e6ab86f848c6479ee1a0ac5078b27f454d0923619c1519163c4498e1645264469ae4eff28c9a953398bba1e44c1edc94d1381638ef94a5b2225654c0519346967aa74c95a5aacd2375517368dea9ea34c91f09176ee45f6f1ec9bff24851bd405371fab76a9345b9e638161b1ab58bba452a9bb8da64aacfd5e69ddc168ea50b776a47f2b76a179c9b63dcadf6f4bc5355d199ecb5a7d264ff24dcadf6e4da93fd250c0c4c4ddedc0d4ef698436405054ff658a4a724bba00f66ab098d540d9a509d8d0dc4130650cab12ce0e626c7ecef62d6830b7ae26f5af677d4cab255c30eddb01bd6c67ea0ef3077c30388a7abbb7bb8fb6f98e2b6c476c08f58045e68d6431231b931c5ee27a5945ad69443dea341800d09e5d4867810ca1a809c6379ef35d9bd6f1d56760f852452b994bbbf7d88f27b08ad8f607e3f03a2e8a8742c3786452c55cd08040004006315000028100c87034312c1aaea217d14800e7fa24e5e4c1789c35112e3300832ca186390318410638c880cd1903601550a0a63ebf11b3c5136b6d458e560247adc254c60a5d2a6c59de14c2dbc05e550ddc2c9fc0f8142d15e9b81021d175183199ea0522b322fff88990a7c9d9a8fc4ea568b1db21828927baa3e2ba450dfa8d65afde6a36f083103b51db1927f3a001f7f831cd5a622db0d600bde6c15c77ffa9db51b4936e6e82e78e5d52afa53cae412cd2954ab3644eae55b1bdf685d9fd7b8256d284f965597e7d16d4f87e3d183535b71b490a692f8f5896d7a418e824fe0d5b68886430bfa53c41ad602bdf49b61693903f29b963381bc1495fbf90d0ee78b82860141cf9a28d7d68367f081d5aed2994d57fabe781f679a7092e611b22a3bbba4223b5ae3b5cf10e246945c06afc29d66a3290303e488893daa8c5d56c56c82a177fe170f0be1d3d1fe680dec3ff428d2a03339fb1bf5d925f229706e284c73354607d0328bca57f8c6495a43e641a0ee81b222267e433d9c87d04d1ab93c0892269c2b56fe3467fc5bf78f4a24ee966a21fe7b76b44854f233df104fc0105e760d5478cf22f5f58823d811c70093a6967672deb538c047983e871a52b3962c50caa340776f01867e67b6fbdbc7b4c3300dfcf12d0c2b9f395f3923dfdc16cc98ae2a4749efc01bc502ff9b83ea3039b0c358abbe293b07bc15721d3f856ff06cf13537d520d6020e118e5b0897c850949d54d5604f23a5805e1481f553d46a9697e698c550370539251a9d6a6593c4d7943db2afdf9d1c896022afd4745ec145418004538ecc56051219021454931f158ca6584a356d07106008bb28396e847404e40cba0055262a1003a920b1c43e0ca3c259b0f8a26e80eedcac5c7060b82331bfd502c869e3d08338638d83764a3149b47e19d80427af4b45c93c01fb45061cb75c69d33d94bf993e670e64068ac5eae2642c2692efcb8dd99df46a0008b7493a82862cfb420dcbf72730cfb8558f94758c9a463c376f2c330fa2faa4a650154030434ceebcff194fc7807e6a5f34661f4a7dd6e04758e3fb8de432dc521f733f05d3bb2d2151101ad2f5a8fc28cb6336a1e05bfc14016b794a85623014dce9b6d02352ddd3d9d287b4da8e057a7e9bbd9fbeb761a9edb6e23fb40d933f213eece00bda355595d40a5e1b48ef13b9400041ea01c7f2a2870d46b6147f0c53d2811f20e65d84ad7eeee7f5193d320912294242e0a1966433461476d7ff64db4ea7e712e34bb950e4ae8743d6756687441ac7cf8ca6a00c6aacbc08668b27180aac6249676775a021e51d2c074bf81b3e0d4f023aae5924b484fcb5d443a219a05d2cbf9c18d18fde846854aa8746258b13f8f4cdf97f82b29f3af4f8196d0e8e77259541b551455b72a144e308bc4b0ca0851034d72661d69c6d716a1da998ddef0f44c01508403ebf768093838e246a59958c1af600e976d699213a48fa6967d77e48c5b2816400ea77369c2fbc7417e4b6e50a3567be62708b8d9d8b28745fee8cc03b559d6325f70c218ee3f432481be183222152f93497e01083cbcbd610efd7333fb2eebb9cd3fdad56901f07676d76269540eef07acd48bcfa069f121ed06bd307f51d907e42099d433b058ee2d0791a1c09d694ed494aceea396f1533f266ea86f592e7c9ebbca8626f1124ae0012d5766439ab9f903da9de5d816c5f0325cddd45788cc323cf23ed913aaa6cdbb714e5ac2016565e26346a8190e7cdece27c6c3b1e15612b7378ae997502b093d178d5054afdc7f51bca38b0b8b1911aabd1d0aceae62f5324a739c86101cabe4bfb97048303d2ba3466f60f1d3599098daefade3a58124ad6dadd38d7ae75401a53b3d1925e9e02ec6c947ebd492c83c14ae90710a20ad3b3a1460374c2091bd364f284af70292a8fac92e801b9f033e456dd83f88a7d9d85527f2e3d2ba2d30c44b1d6a742964ea0b2fa198e4e8fec98063bb0c7ee171b06626310ec22133dd1a0e2722279c3b7362fc33ef127229a5feda35f0e5f0eec0b193633cb87600267626f8a189ac2bcc7ec4b872b3daeb315f4472b6e05c9f9a051e15b284c36c402823a2c36158a80e1f8c52ab504c1c78d7446c57821b10e946e96bb6dcd62ba61598826bd25fe1f22b86c7913397706478535d3308ea8cfc46988b74a33f273e80bd2fc25d55f9f6978fa12da20072c1e5dd5dc1ed8f61e291660eb281cf12c73fb8afafc2d3523af18ab89cd2e367ea88fc00645840ee8768bf77a083f86a8a2eef6375f4a708d05117801fe0b66caa1655e94366f92094f99d35b28887c60d752fd15bf45ce8fbeaac846abfbba4369baf864024c3887b266274bb5961c62c295b94b427e63c2c900d6063439406470a63a3a80dd24a7577fa4142fc42204d8b1defe6f0f1a29a7bbfd70ba8cff1c99d0ab68d5fa7a241d12ef63375bb8b78391ceac4570886fe3af067c71b11310a528a8748a20978a6690136a4b6b62834d0026747e44b343a162441ee45daee8980b373361ad125fd3f3169ca9115d6de075c48e631c05821cd9f6ec90ba653fe8f4c2a5cc60d2ff027ad82055d0c0e0c9babd99da4e09d9160daa7befd8ca5b6e6391f37ef3d2d9c12ee1b714845a9804eb5c240ccdc4f3c2645a97b1395966f53b444840958e7ec474285369468cc58684a6c586441fabd41ee71d7377233f2087fc096aba4ecd4734e24c1560335a4a15d0f439010048db71095f6a433c0fb24cfb963ddafdffa2f36335d24c8ce46a281aa117249888396fddd2c51b3828455f92614291a5c865f387f25ac92f6e5b5626effebacbb8a72b12059072bae8380c7034d48ca137bb34fffe769061e932a4ff69e3bc71c37b1e61f9dec5b48fd8950749a9672bb93885f6dc5837363d7d09520e59d06d248dafc39eb57c36aff6582874906b2f1e392a290d2796ac9e1b6bad8b1ade3673d93318be00bd8de33db279219d1b5bc9850baa22f2e49b5124b570cddcab7706dfe56f95a9dbae29a750c971766ca3cd150c68773b087e6e042b53af27286e1fefed183802e64d93e48397aed97a29f6aa9b4ddb27e007c74840765801591aca80bc99ef4c4ffcf107a3aaad0dbc8b014ae1bb5f324c2ba484d99ce352066b8814d274115fe15397974c94539f6a8e07368daa5726c90255a54277ef8d13a0ff09281f1e9fc526252878502f4f0c9840a2b97d99e1dd4b6a1021c2db9e1adbc8c289eb1bda465d85d1ec22dd4bb6e5785d1aa23a6419713b621a33402f8435f1ce2f9e90af0509026dc889737e57b835ba58a631b09b43addb39c3b99ee8589dd5c92c9e8026818a5ebc685109303d1c8c053a411cbaa8294c55bc096e142c6f56d364eab0cd670d2e9e792795a66b58d172fbe400c555ffeb4fa7aac8672175e903929ec3fe30fa8c905cfbd3f783a7b68c6889fba317a6dd1fde1e1c3d388ff32a03405107f06192053d996bfb01cdf0ad83ec9167c2a5c3bf0320cf5082de5766e0b1846542c96e8930a32a56b527e36e38b0ebdde9961a36aff23bd1272f49d3233e7d0a19f092f8da7a6e5ca234eeb3a7def8e166fb71980684e5f555d7f2142302f88b8370ab1921eaefec52db15b8646075873cfcd7df0fa6ef614e616329d99db180e8acd5641aada04c40b73e973c06f60d484a85b62590c09d497ab9833c2a2297307569604ca6e3d3159b31093112891e1645e3cb499a179ecfbaf9108bf38d94f4eaf99d5c435ac9f5950c7a55328e41707092ff63f395102f7e817c84cf6f9374d5df0fe39c782d0d281c8df28b39fd5be9061b221d246f150013e402645130695b17218f5856880320ff8f297977a0d806c4a413655a47bb657e473ebaa4370cefc45a2769cd71cc5640c8a11c468bb505452af1e19a3cf60166e8f8cf49a9a96b7996239ff287fbafe2ae5687e0744b7aba2ed8254605543711876e689ff2c26a709605c6d28276d0db50aae75eca9ac9749641ef3e8e5c677a9ae67f20ebb0f458df8fef70b2ae4e902775d2b1ce241134c158caabc7ca8e693fa7d94aeeee97dbedcbccf5a43a527d4d374fec4ef22f29dcfbe1a7f672c102a8388f344fafc1e748e374f1747592372400a795cdcc41fb0610d76344a86c454f9c8cb1bf0f76c8e4184ea6d0d13d6c2b4793e76f881e7d1019339889339736cc900d0c2f720660f4f26e970ca00ca30460c4745584437012415ed004b4b44728cc363b7344e9a9e60f617d1f614419042029050eec15df3ada13299d952c2db00037375a78981ede333096e11eb5e40048f0127dc6e40a5e62dc91da15de46dac04c6bb5032b52e0323a323b0d4405bae98308b4cec54bc378d04d96dc1e51858b88954e388b128498a30a2b13db4cfa9c179a646febb1b0e0ddeb3b911718919c631629e921416fbe7c56046415c8c481ae2a9c6aa8811b91cc1bd44be608dbe3ccf0a3139b7ee752294e47ee708f534f6e6cec5acf4b4d0ae0f59906d2632eade5d413f3fa248642464b55ecbf1da455044221e2f783fc1604c14c33c67818262563c274661744e9d88d32882cdda856258cd3939b8006a164baceb5a523eeae37d50793d9eb35018095e14e2b53168cafd4c7abd1820e88b72d56675a983e7994acf47bf65aaac6a4a991cbac277c19daa17cd6f28c0464682d3ef1b8056c959658add0a609dff45d1fbc78d67f5d6da12973a3ba620681c704496b5c73a1d155986b9e7affc7d10f08994049376591d7cac83b541c6164d52aae3069f55da8405a26d536f35c8d559f44a061d24ce9c824225dca04cec667e5efad51ba35be76bd97b36ae15f1d2772b3d158c7943f329a567c2ebd9e78fab9dc4608136464b7a7f388dea4c6a566601eaa8051d3f9e0b6b60968016a42ea889473a8025131bde1a10cf433f2c0cbce4582acf417d8b59620ba46a5f99a10abd1e09f5dc7bcf0086888ed94852e56c7fa47c18b81f19fa5c40aef71a92a1331313e83dd6a05241569dcf09716bb88b83b0c8275c035014d268f080f27262373b4b52460a8ccae62fc1aa9728bd10de051e0d279d77826b643cbf4a84fe35532bf3ee319e06c55b9ab2ae9444f74e2835578ec7e1ba0e08a6b228d75463a6e36e7f99ce7893f33bc1701fab8af52a46c1c0720ffba6824cfed4bd1961e4d8c63d049908060dc63086f04828b93e0ff534858d4c46000309ab03a3f00b63cead4488fa5323b80713d8428019012c52b23ad3c7033b95b794f730d5e7a73be45992429d4160a5f16b117c217238404551f95985573a7e43af7a3a0e18a6d7640ef1550d027c328d886d440d8c340522e7293449f3b57d7eed3360ded9acc85e093fcd3b42ec87c94aa1c7736af5a41ba90d9624b827d0e48c0175bd8b40f23175bdbaf3b6181ba2ff5c220ae8f04fe527cbb6eaea4b57b5ae233971b410a09193555403bd6bfccdf15358cd6a017640b051d4e433adddfd9b2895f58a5ac31e4e2936ae6f58dc1e456ea37a1f98aba96073ae24f293e4d3f5c5d09d7ca6213c95f1f7e5078aa68888c86226964a5211477d7f22aac5c0bcd07910b128b6c5235d1b68f4566c87ab091e5da3613866d8a767b80badbcda85ac8cfc172fd7c23ed241d5f9e28a9f22dc99aa16cc88dcb2e720d1d4ac4a21a33921e21cb4eb7c8ae46ffac09ef8afe9ec45f1705b7164c9b215882a7adb0aef08a577393427dd286c29052ea1e03020408f4b405c7bc59818c3fb272a5200dabc6f531dfd6532e851796cb71b877ce24e297f25305c08205440531d67c579593cf35788908103fe220133ad25170d3865d614258856089b9c9df850796f992ead2f9e7e48971b25ac2decb84f55f22fd82af57b8a95372680d263fe37e83066a26ea0acd42d0f360a4becc8c2b20268bcdc556c29425523e8ebabff18a35f24de618578dcc057f17c04f07ffa643dd880dcc379eaee7035fd1ea3f684f3c1ccdac07ccacea83b770fc8eff932d3e3491dfbb086534dc2873f6a2b2f757ed6f60623f457660be29c0f58bbdd0f16332ae24bf34788dd4ff5138c7b50b8bb6859d71453fbdb70a44e0a0e01fc04f7fd4bce6f7872f35988f3785e64bd2eeb1a8c27f305b34a64ac91a4ecc4ed21b88fe72695adb2d85037686b6cd96b3907d00768faf918a75cb25015d27cfaeffa44be2126fe4353f41f3753082f1a69d6cea03b846483238d70321a72a275992341b01daa5c54be58f5dd230ddd55ab386df4c8a61168e60e8a7d1821a46f6c235d30094896930be1fb60bb5b9561e409098035981c4bca21666c6310ef34e5eef921b5548cf42bc49a7f542076c61a26d444db11904f5ba6edc501908fdaafa78282bf5b68ff72cf576c9fc873e001d80695e0f3727c80280eb01f7107ff8e8200a826500713b42007c09b2c2893b36c4d932887e89b002c054d29315845c9b4cc79bba3ec0f5a4b8ac1b2894de8c4376ef03c6c61bbe20beed5e873eed1a4621228dd9f2c0b6102073cd7b7964511bcd8d1f9622ae4e65dfcb6ea2f8338590e8e9dd8ce8b7f60b4b72bf9532f707c9d622df8e72073cea8642f6cfab6da17822c2dae80bfa786ccb2d0641b73bda239e869ca3299c878000133f27dc161387283b5fc2bd9392c64d41ef5493818918b66de7dbe66e574154149293d06a27afed24f4d087ca79414f5aa051f01202324c80430eb349713a2f1e5e3f3e42b1b718bf81bd632f0cbaa8e4e9c497a11898b571bca78d3f241104de6bf212a80cec901716869b2c0119c9437fa7c712d6e2e87d2acaaec3bdacd26a6d5a2560134ba49765a5572630a3c1b5a6af30ff292003358206b17d2b913e154202428922c945ae6ff389ac206aadc51779f79f2b37747ed5a81b573302478ea92dfb6c8a7830a33321cb4fbb3272063444b74716410c6e97341d0f03a36c2aa5b5a2911a68161a1b284076afaeebb08d382ecdea405df57f7356734012494b46d23026f71f13da4d990c7182d1c0e02ca9d3eacd8567e164e7eefb6a16e2a61e2ff336c7362172556ab53fa5fda00ed4be464c37ad1ad6f83e37f1e69a7d13b84491ad5174ca00772922659c10b91380904a830f1f6098757fe4563404f7cbaa57646b2a9e1c3f72175e5442c1b9553a0437d4c58d0a9985a42f6d525d8f2a4805c0c590cfb915ab025a1967ff87d2f769f0bccf53f4a27acb6bac28830011d3a5de140647d2f11d8a3c31163410fa4f78ea8082694f09854d4348ae5bd801dd34b58b484ec720af0492f6c42c64b865a541ae0db48f9b99351c30afed4a5166c2777268a067971548adc843cb6a1acefb518a33c100835665a8508d24408b1055a820b9509a539653798cff505dc32ae26d83220e2a14b466b4c0de9042ca7b9a4ad6e898fb364cac0c89a49af338e89bbaa6fc20891b3d9167f01cfda08307c7880e1297e7676b5c9af0ffbcfcae511098a10c634b2b92c9386fc8ad77df76f835c822ccc029d81d8eb367c010463192014cc77f820755812191cf8b45cbd062ecf439018980f10f46ce3595b929ce0d114b2cdb3d6d42b7c90d08ca172407037837068003d8af6313e7316be2c01d3a05134a0ead81c0b48a179484245cf6d32d36f14524d0947323701275cfe74923fe8904e6503b2bfe69aa90938cf355064a8dd7570cded7f2b0052cba4ea84c0f8d2c5502a305aeef057d4ed09f58dcc566a963d68cb1dfc5879b5d8d1d9cc2c8111a06412a72fa52bdbbda01a21934634590d497591a823042446e86041875b8ad68559a561d34b087e4291c90519a3403f5d08e01192c631bb126f2fc2a58482ee385a74ba9adcc780f72a20d7ffd9ad92aa611f4d9595024b6a586022a2477aeaba698350eb4068da7b462abbc80978c03385c789bb5c8ea0d2cd4d76c799784bdc40c7f395e6ca7964adc70e2cad3422a3e6230d8a9cd6a57c0700c014067aafec5bb5a49042f49ada7905c552b676940f59dec9bb0b56aaa705e83711764c9f77638ad06a5b128b52ee0fd1aa00d7c43fa4939de0504bb4261c1d1d8cca7d7dfeb90171a27bba22cf89a11ce54915f6aad59474c2901757a2ca913df433caab34ec4f99d79eb03f5116590e2609a70d690fc8d119b185845c8e429575013f2d813d68c85bd4d2347edd90c333fdebf1814e7bda62b95ed22f3a428d22a811e912926369722d5a93757ec8b542bb73a7a33f782fa5d7eb280f88cecf471e368be0f4a1f364a85e5aa277bc60c37b882c3cefa5fb331b95ac4bc311e6d8e9d92541b78fb9259d4261ff0c675abfe71aa4ceda71f12c1a72c482e5d15a239cb6b1465b4928222ffa67e527a489aaa012c99444ea0fee2bdfcdbc64d979ff201fc5647d50090073988663c497ed132c312caadf35161dc1bdba0a67c0e462eb1b392f4a0324bfb3957c137d0d7c1f7bd6edc4cc5024bec6f181499e371c0b6919aa33a67c56b6545c9bba57a3f1f0f14ae8412620483e4f1d618cf7b251d9af7d7b096a7be6e708a1f845fdb623ecea6809458139df07de64b39ee9853f8840d8dc22ad587bc606f44b501151d51773a86d5297e21945adef84cf4e965ac341ce3160e1cba7f88fcebb206109d057a396250fcb1ac876ba745cd0edb065d5a10f7a49adbdf942fee7dd446dfdfa77c5692b5df07348eae3b6c90d84d46aa655de4f1d4aea28ea97fdd539602c3e1975975023e3db39f169f00fc5cb06555b8a38631f2b38e417869d2e0319d05f3566fc0e8660c240844aa90b71db0a0e1d07866444a01eb40c080d8ef7f5ed1ea45edc81a6fc7f0d815e329aebe68d09e90fe36bed4972e49bfe121f65ee9dab44eb66b27cbd4350712e070e5f8db699697921de5db06c054faacaf16c957e04d1c6f13b5fe522197080fe6a1cba8720ff2590ac6ca6aea3e3a3f5e5fc1fda9eab33f26c0e0bf654ee278d79fcf483b768e3f3440d414f59096159c5a33ced914d2d25461aa73f65082d0c4665f36f85a428a11188a06f14c481ee1004e8b1901fc5698e672cb72ef61b5722e0030d51aa2fbcd1268ecbf5cab6b07ba627159a23be2c59e1f832cc89ed6ecbed591e5dcfe41abff612ccf8071af5407be508a61012b27df57a6322a06889c0d3ae0bf07453116713d2b00994686d57922c1b3a0d7ef330cc2ab9440e89cea124385950891c8a0fcc83019a5342e22a2ed9ac46baf76385dc51bd1f926c803504901c04a8c6119b0b376d50a7f08848d8b27def97275a52a1cd0caf568153f0b01ac8ddad4773529bd93031da71b778fca14fffca83ec6240dd9b5efbb1b2527b2dd4086e4d9f5b0f1a158038aee5a6d301c0205544db72f10a552f9986e96cb4ad3c680efa660815020b88cb7f399d66eec3b03d30a6f95b32701012434aaf4db64ac342da7be730560616129ea92bb90fbc0ac8edb80d81ab1d61aa2a5909060f26a1830f82ffe077c859b4604c516de4a11e7b063554aa21e317918c92cca10d53ca1976017f6768956c38589b9eb4d89c8f752dd0c0834f816158a60d5b24aee86d7198abc25ae2322b4f52c6c6cfc47d273ac8ff9c16209b84a0aa205fc9f0b21c6e8e95679aab576098729004bedd858c2a7b89e7d5a07fb9c5babbd0a8a03c495f8f7f088556309f3d0bd2a53e2bd400aa047551b48a38c28e50c3fde86696490b6a70c6c681cf5f8b73438b99d38a9a6650a318e5a38a9fac2ce0a01588de954378a3ddb6a43e0ac645cb0448880810840d882fafa01ccaaf43f423c00d358a30e7e0f9fb65d24f88afae05cd6413595d9e6610608f391423606ebe480b24e30978a1527d9bf196e0afc65a5452957e24f1a5bd67adbacc4a23ca234a76a2b1bdbd9036d5eaddfd6aa798dca9d61e3a04dc968b45aad4b4fc14bb31228a5b66f9c85a277405d81cda98eef3a3546613126e4fdf24fc9268b4a5e5f656550172f37ca88033455b6b91432ccb0695eba77080705eb5cdba178621a8e99fba9bf2e495c5afac3ec5f87c2a071642b569acd8282eaba6ffc9686af063496d2f9a449ba488a630ad981857698a89855185574bfddc145fdc83a902cb7804d92f761b4fea4bcf354a5fc2900ee24ad0d18edcc2459b25ee29175c7c3ce83385ff319d335b101a9f0ced15d79499c6804e4626e20d0384de3fb83088e0292fce342e294a4feeff24269514692110a1e76f2419df5d9e5c57ff41f0ab12933b8deeb860962d190b3f8d0156dad12764989d3a354b9327cc6256b44e5abcc8a936f8bd50fae072b7540d0ea068e4ac43409221544e760695cbd41d0a133bc3a0080de36254542b02c0254d8cb2ee5a2a255913c046e9f10883d1568263ed2db2108001d87bd007c7ddd861853912bd57dd043a29409d25d9420dfe48e5f4a76b73ac145195dad17a80eea86e8f0173a41eb41a8a78b22e6870d041c1e8d4b3278d5404d00afb35213790e1b1f01297ccebcd20653219c42830e2ad8f14af305d21d987af8db52cea96b65b3daed93ff1ced3171db5b05201b5d2684b22d4e8008c1077ec25e1b3476f27407fe4197011ca73e7cc01db54866d2cc89c4c1c6db5deba9009aa9ab9275140e9c57b87b11e75ec493f0577d28a15d752b76146a76f85976dab51689e9b3e97fb2f32cf7f27d6653a08c480388a092d635bb5a656bdbc64522c11bbe88b38ff971bec49fd601134358c0f6d68f18974e132cb1f7334896ed357dd48448084c57af40fbffb82cf8035b166c6d6ce672a0140ca6b256c6670785c9a7f50aa23783ee5deb9363ac23a736de5c9af07a9a0dccdc2a188a6af351cab4adbd7baf16019e516c576ce9870ed2be840ff4467f1b7c4be094290dfb425be3c0ef41bd02708a2fe5db4a2ba88a8a78a4d84e412625e0395a676851d409364b65d17dc5de922af68ec17828920b241dddadb823a3f33b467efb0a670e1c3d4340b494d648e21e1920fa5a15ca5ad4e45401b2afc78e683373fe81eb5fd9d8c34475b3953e643b8cf46e37c55f7b1f9c8a0f0caa95085fc0ace87de87f73bf9985e7ca75abd0a308891a3e1c31af9f1af1f304a4991709c983d9394cdbea5ff6a1e7f389dc09183473ee1f81dea46253f5e3d5d6ff1f2124eb07444ad71fd0a4cab526a2609f2b5f9677f0cad0e87dac8b3c22350a1086b7c0e60ab977046e14ce476b0b27794aa1ae2de0aebba134b52d749a971d259d048012869849635746b5d344665a7b7d18ee4877dda74ea2400310a19fd91a231d0d078d724b4860198f8e92575ab8eff8b1304e564225cbc314f20e69de0d5986d604d90b8919e789c756fd88bd006a8ed9e9089d98d5528784fe24fb0107ba57f7588609b86fb229d32fb3afa8fd660afb55b8111319623adaa9e0e1cfa2f8ecd34de6da57b3021fefb570cccf66c86dcf677b32fb5d33bab9c3f9ecbdd38607244325a9e1cf1b1515cfec0b532e1895954536967169d243133f4e2aaa3172f344fbc07f41a24b1e9ec20b3f3fe51376aeabf1c05316553680bfb59e0650f76bdbd5825a3c3854419d849dfddafa7db03e4a5c1ff46646121bc2b7c457011d98b334acbbc6e40e2d5ab7242f83d929c5dabe1ec9a2f1e234d88c5527530395377d73e3f01738f1d0f5e468122c06fa691f23e639721203b8a3c263b2a7ff5a64fb973d8001c57de736f788a5049a979350d59a25e0fc9d0ab5c60b86c58fe325fb73d095a8e9b9a1c1dda4e688960b6ce76cf0bd8a71626f420ce2df32fa94a7b3b06683e81eac58f4c9d9407f2f21f1ec3f728d148b04743783debf08dd30e917c470e9aabc8a2c831bc7fca0305a15bfa6ccb64f5580a586184a4287fef1df252abe8f34aefe1af1a91564100768cb725033097a3d86890f6cf6812f4ac1d630cd452e81f9f8124e84a2913804d6449099776658c99822d31d0893be7291a494d93516c6c7eb1bfe2cd6b328e6fe600290e82c65838314aa1da67375eba8817123a7ae22214f06cdc7f971c292dc589ac86000f006afe717dcaf22c6854c67e1eb9228a1243d5736424c610638c70435968a82e24b342c1d72a233888fb899e8402e4bd4d73280e097d1e86c38db23e5847acbc2cf5817317ba4b5970d996dfb5084ccc80abb3cb4607891e24ead6d9085a73aac043f0f1fec5804d1894da6b0c852bc3a3ea7bcb71d62ae35dc34ac5a8c8a19ab6256e70dc1738502191c13152d7be44f09b2f5cef582c059267fab3b57faad75e1faff2aeef8fa4e1835343abdf7393b6e6c3a56b650e2be9a25046fdc72a311e32bc135a9585904ae8a812f42399e0454af1cf787c67aa3039df49d1ce5df328240e0a07616fe793075b0b19fcd897a31650465c9ea00292615fbbed245fc813eac17e2d17e21919b052c658b54d98eaa7844c44569d16cb1efe85c066097e0837607604927f86e02cecae50a073195a1c36b1b8af1d1ae46ef1b842c97c0ac68ab018ede528ef483af937ded88bd5a99f9e1108b1f83c34503fd701e124791972b27359b2c9369549ad8030673e41db480a258b4f5aba9bcbe03eebe49899eae214567b403551c7da0a97010e792d468639b933ef147cad907cc8e2c1c44820224e0c90e39574b806fe800627f06a2808261ce7fa617b4284efa3fed86016c3f99f47854eb40274f8e3029219d808f24a124077c63506752acd7f6912a5e9cf01cfb66319d3dd53c6ebc2bbe7f5a2d4f1c46c0cf1bd9c7a449559fb51c9fe2544fa7144e24937dc0512e23e4a1afc271533779ffde9f33449014e1c4221140091d419470319e317a757dd8184412e9ef25f19ce6b42c1d29f74f00fc92ddc3def651fd3ded3f22973af58b14d6faaeeacdb58c414d4ff79bb2ffece335265004e80d32442fc6b1f4ec22a11af44ebda13b89a0ed90c54b82653866afe3e3a0e73ff291c8b619bba61b20a529d4a5aabdabfc944499b04030b36ccdde3e68403ad20c48623b5f8f501f67dc1dd07e5ca3a4a7765564a8e548bcfe3ffa44362c783e6495997a9dc4ca6c424c3f636231a07b77c3c4858c63884bf4c80dcfa7c9754e9505925bc9ae5959dd969f2ab3a8cad830077cea057fd5f7deade00da1d4cc7da0a3aafc0ea73e53091f3b52ded9ead984530cdd36e5881421889a1f8dec7101ade58d38db713ca41f06295eb198feb2f0a29edfcd0a6f8d90935b10ddc495b7834e34c8fc20aad6d03d4fca07941b75f011690bbd07ad2b72df8ef7d2c0857a4861025a291deb8b06dc04121bcfacf40d53ecf954815dd2081082b530ec4d5702ba4a421c85d49e0c3997e07ef3ebbd01295a22b6faa4256723bbb547026b47fb20858306e9ab5b817b98548d8706150a9aedd0b091a8fb5a08a23724dae1f19f6b0563afbf957c05eb6f8af099509b97915fc9207099f479d1da169f705f12475cbc74c8dde15897edfcea8c93923f2f5780589057d8941312127c14bfb929b25ff3014165858e3820d1c1a7683068002c232999eaab68cc44c48c0e2167c0da9a5c584ced6e60914ee7c92b1a3a7bf691cedc8667694416f06342f0e363791ee6d2c9e679c2f4f2b116cac0e72cfb76ff2e1b5bf8b460c9936083e3c6da8544d77b7db3150ee630bfc949f9c440883363ef64e002a01b42f5a687fc6c891ebe23e4778f42da1b12ed7fcc6d0f9009b859f56c2ad2adad0d4a3f9cd912bbe7e641f39f16a1992e2db01c3764e71d6c00d6b6a2af17840d8618cbc5c43290f8059f4bc61ac2a262dd7e242658cbe8d359755d724555d88a68ddd4604d474cfc4933875760419e6fd0b204401cfbbb526b9008727ed857c38ca7f8c53b84f39b7a09f903c51cafc56fce5c20d450e7881d08dd2bca9b97b7b1055665e00e4a2af40c47fbf119320ad633eba9607732f55a426cb53015087b64c176ab4dc939a2c393711eb7acde9415ee6d993ff005cbc857d82c0a86a73256388803034fda4cda008ec080409b969f39acc9df9e86322c2587a1794b40efcb806054032a3d2383082db21a9c244740972562a4eda95c961f8e3017c121b580b9395d6e524f9487d8eb4889b944ecc91c46214aeae5293ccca3018f527ac4239481f8fb170154faea4a30f82a1e60098cca61da6e4705a1469563ac0ebcec221149ec3dcdb0436186b4ceb992c2b923788613f851a5ce82ad4bd8adeeaabb269a57888ede02f75cfb212a79893d90461919db217e348ce268f79c33df9bbe91d23e73d6cdf54d7b6ed950edd46ce1eadbef53d0b07fe282c99060d80fba09050512c5fb53ebb036e679fae18dc4fce2d27bb0b4852f2947ec094790dadea92ba68a0cd61b9aaa2fce22681b5b80cc4b6fb1461f4363a80a1fb7230ca62ffac67188df4e929c37e2349d0c5caedbc3698919bc3e59dfd1be6f9dff24f906cff24d182fe9ed72a3e832123bcb9e0027fc325cf16bf138041c58aada3341079d2f1ae08f73d965fba648c1e50e6a0d2f71118723546f741c25e1b856e5a0b819b165ab6969a648652ea7d72acf9e0b6e3642560a4ed7a2be6bcfe7483b08dfc3441ceda168f12e1947940aa82e871e041c919f3e6d23e70d1873ba5e2f7949a052f0a64b18e841761239dde672bbc44286e4fb620f49308c45bbd812fd1195f32b8744934e7d6f0294cdb005a8c1efe1c2201f511160df9acfa05530c3263bf804454cdcf13338fffd5ce5124ba1d6e3ffad0b9425b20162d1ac16d8572a1b48ae0bcf45a272a4e9f59b302a2cd9652a046862713d5452a0d1bfa3558e860a38deb51dacfac3d39cbd56798f41107b13d65189011416455fe97d25d0508c4001ce15b085d9d3f1f94d18c815b6a0352022ab233c8a86e3978aea8ee8335272ddeeea5eaef974bcbedeb54cbdb0b2802d043500429ee8a0578ed4e924015d2206cb354eb4a787e4f629d37a64538c88773ef404b401a7172618b0d6fb307b1838f110ac0ff6ef91ca7cbf1dee2dbde356cd8094b151cbeecfcf8293ee0531c0e31117348657d63ed9647a1a8025a08704f8a6d31eefaf871310349605ac77236d1f2dec5b68f6def558771a525f6e5b2513268cb07f706955e90b0bcd4ae31b2449b3cba411ad4cdfe04ce86a9eb4a03f6a81153d393101de381f61a30015f8bf8bdff6bf3cf56aacb141d4c899d4f0e58c2b193e6c3b07bdb4329d019890358ca4dd88984a2325a20856ad24de5b05e8d12a14a084bc865e52dc4251001bc94218668c4140df7090d2a66e58a4d9ed1c2b79db070ab32c04e86ddb449ea003696514e56b3c29b5ef2f0e783647ccfae5d3ceec18cb44b6a65d3ecfed3820ccce13a50efc8c24a19008c55e8ce2fd2fd433598cd1027cf41846d85981e7a292796c1dc0a90e9ee00d4f4c06143173fe94dbcb48bfb94837439bca8ff51217c9c04383ccc5ba79f4ae888abb6ba2a180280608162567180498510f7822261be7476150324c034224874bb017b1c703b6058b171a6089b732c69248161754b4a2c6d4f149045f542885869513e5044eb654635a4a7c6e4d34fd849912c20ce660167386336faba12230364ddf4c42236876a6435df3004794301210285b1c6f42c8d8fad642fad173abca6862536b8961294947dd69eb5d3a45968cf4294e7bb188defddf162d11305246a9a5ae92f1430a36d94f0f4746774335685512f42391edec633b49725053c6292f5905869539f7ee8ec4879562ef8d7535b92dbe1572d047e88ea3c24e93b941ebe4b67decbf1b001e074a954f17da0f76ade028610fee6a4150c45a43c36bea3720b69091494f643fa2936e8d403aa634dfcd708d242c4e08cf8b4927b67ebd0477301ce1846748a44866a87accbd664e378018ec226261151d1fe7f05bb5e65bc3231c4d7dc3c66b99bf142de7249027a56e74f278b5309475dc9b93afce576f9a5e0e54c789c78bc9dbf5849f79993ba31f4c8b33c81658b600cdfdc93339ddb0c17da6473648a04387b4ca47bc28f3a8927e17f73668bbc1a9969d81ab38a44d3e38e0c2059dd03040c9dcf40dfc6ba05b458879b780f77562543df1b5d03b9ee79d56f3cbd3e00b0d5b042cebe96d9da6b8e91a3ba44e7eecbf4ecab443a6cbda4539787154651b64b8f6fa7500bf01727d90cf9914b11ade7fce00faf9b1b0c51d5893c5b51971b96bb4fe2ee5af64af474e03668f52b60f2159d62c8b69bfe257961540be877841013ae355128343674f0c6ef5b8ec313dd6e9a5e784829f9d739bf4584a0ed26323c368f5ce62100f2f80d6982048f1b2c9b05d34a1cd04daa8284a2e54c0c0ae0f4d13f8f5885ff95306678b7381339e07c3b2a3754344854e1a4ad10c681436aae6f93378ad1364c31551631d6a05f80934834e42529d26e9a4d1b5081a14fa86e4b44c81f4cc8e501c613b3448474417013a77890447e50004ab21aeb00f08afdca560836180294f5f4e10e4c7c76afc10d232245f13f27324bd8355112f153032c91505a04cbbf0e25093a22e879459a7be0d91928fd5f30784b63e017d9f223be508efcf9ad495c04b2b81b7ce557d99f0200b5d2ed1d2df49d6f5b40587a925450cdfad83a994c3a53407a1b39ce78b7cf3e9565749efe729f7d122106d9d8b122eb40349d69a97aa4c1e9161adc06c55b1c386d2e32eaa1231d012d72717904243a4494aa4c7923dd90ae54183427d0c8336935b4f0d2ae34500b5706e780f7a6cfc6b2cff8b78019d3e234f07fd2853c32287010101834aa8eb337b793aae36491d7983c004e14d3476d1a815fc57d2125c34dc906381ee46a5f606ebf6669b7b53d63f280c6f389c766ba975120449f45b91c96f521f8a33cd1a0a7083bc1425c916e3f6e38d0338900312d8647cf850fb171989278955687848e26b3644c8e01d7f3ce2b57b1054d73d857f8651c464a80be4ac9e2c64fe801585819999ce30470004ae477b3c5b497565494e6d1b9a331f1dab912d3440be70b842ef748d82da82436368975900bda4f375dc260513faeec7e522499aad2e5a5468936d366b69cb2061b89799a1a0ecd854115db110b0553fcb7223907deadfbe3fa495536ff9b409b7e727988407dc5fbc48f381b23c61dd3a9d3f94008e314d383f2a65a5f141c4d4327c5b9abfaa2d7e333706865a32114ba18902b337c2d8e2ef9155722095ab97568cd2eacc6f20ea3df0b0f83595e48f8621f4157d85a20ba5de6925e0fa7af8dec1465d2d14e375b171e8dfd560cb2851191120d8945db724678af72240940190c456bbe19b27357a53aaece03a04c28bb2a2c33c855dbd6898b4a98e30cb1667af8e97eed227897eccfb24a4daaf0aba555a1276a9f3041eee874670217af516e46a8c65698cb36c673127991d6ed0fc10b5a84ad013118a74ec2e6f3941fdb9edfd34993347dcbf3aa56a86641375085574d4f5f40b080e57cd497e7096e303ce91f27b7e1b3afe6a8ab71cf383851aa5173bc1f6c9b7c5b3f0b1e2c44720fd27178101b0337b96884cfdae8fe2118c3b788990f5176065bad46fb4396c9e5073f21d084a0d12c540775a6ae2ced9454a1f756de1ed4abc73bae35edf147db9465f41ca2693811b1e1b290d209b2d61d32ea9c308aedd2129e892c6c320a93c0f7ea5fbd69505f6590e1911ea333ab01a447a1e2ddd8bbc9532fca7c4f54d3155ddf5a30c58ce0b1a2eb1c9ff921699e0bafa684c9c4577382f000f24be24f4ba42264da384c4eeadc6418d8762db1eec4658f34157ea68b021c58dd5e6441e47d1dff20f3ce8f530f607adc03830dc02213ae8466fcd6e86a3c25fddaeab4788ee81c4f1804877a5213c20bab0b1aa5ff07f91cacb2d3782587dcda4660bbcca74b2fce783d936351a744a42595db7c3481c70140f3df58d8730730fd24b4188c49c6add4a0ca8f938df6c373034d3918f910494ad4d2fb6f1f91fbe7afa42125557ff69943e8da58928d23286a655e804cd2f3654f72d99d72ddc9c24741072c13194d205120b866f11f43688cfbd9416deed365a5459790ea264e565ccfccd2dac91a74e07ca035dd63b50f3d30139fc4998315db31e101b99bf15304e9cedbfbda7bdd4c332eeef086d049f9d3a7db1b9ce10d36f062d4f219cf24596dc9756d0ed53548e54342444e2068a6cf434e72e729a3349c914059b3e1e5940c032c19739109f7490e881c8c172742f6c29204574d5377afa8ab78a2e0b7b2efd5e238e787ea083bbec3ee422ad2329a144bafa1c4db08c58d50db784a60d909fad01c44d5720c643fb9e5117e8dbfdaece606a064d6e48151aaa46ecd9d9424ca30d1d8db3b31fe14933b561b023c4d260813b7908d84448d3c643f5015ef13a3f5725c02c1617c02d296c8f98de03e46e8642ca949e12ccf5628446c49e334011340c0a967312f5921738bfe8a97db9448e1eef622e61a8d9c189ba2cb73dd0a8d4fd903880c31b0b11e113eefb52099f3bcf6580e43e59b576b0391212615fc2f2bf5e0ef87809937366e8f18e34dd723102e849056a34eb853d81826c95adc36a97ee4fde741d92afd6dce02784531a078c74e31397626b327f508628e96c50241acce48aa3ecc7e889be6606816935b8790d39506ee063fbecae3426e0d6d7e8109fb5bc4d696ae40233df243dd5143308292235ab44365939c3f3198827cec29be66586f2fdf7933ba3f8e4bed63e1426cf9f3d6a3b6006b502155462f49c3af4fb82a77a8df6a3fcee8553400697f024f4e509bf21a66270f5c3b88b12b2a61c875f5084e7ed8dcd152b4523f07887be1f5d8930bd1e16d2338911f3750f9ce27b981990f02dead8817e0f01103629742c5caffdda5b1358ea4b7190f9339eb20a7a1809e6b53d584b3608b7fce16922e612db8686720a32892561b0c0557cf34a968486805c390adcd7c21606977fa707e6ca9ed679e960f2861c4d3ac3773a7fad103fab749bb54143951f55c4ffad37f7739b5f46a3b15dac2b8f9d562f436d5e8e938ca5766241b11d8c56cdbcb04718ed77535e70081b4e4cccb8f69df171c1b662f9b904561005bbd38a00077b98a1c4f92fca857db690588273131580df439502b5b4c97621c5fc67564ed83222c2ed1240a3d478453d44588aa5ee0411fd31c03dbb82079cbee6d44514086af17364a19e2a5f32e2a890fa93aaa9ae375b95970a44f5b74925afced4b322faeabd92354fabfde7c1667882e6acf6f3742de8b0aeaa5774b19be99dadd5ae80a05009ae12a10e05bf9910f2bbe69b1a72660805b6fb67be952544eec6a29b2365c298f8f16f78d75093e6ad5fe11a314bf0e5235ce93eb10245a301de58856bc9b1c4f0d5dd4068036f4daf3dc480922d2a56af5708dd2b3402d0a10c8ec40402aca421e15837f23bdbc0259f3d0e73916391b94a1b83839de1c7e546725bc1ea4bd764d00a4f69a17bd8a5b352da96d94185ab36a6fc5764b5892bf05d0aa7a4d03f52c85090506aa2630429808edecb46af7d16b697647959e3038bd7f83853291a7906744ef2ba4dd0bdbc75f3adfbc808defb69c309809bf4975560ed294aded7464aa87661d1b400e5c91fa7a3850616d999e5f850298fe77ea86f313be60e21328d7fea55006927c37501272516c7607a3f03e1d50c8e29bb853fbec9eb0f512bc36a3fc08f0317505bdac15d890e84df1229ce8a2a84363f18671e2637bdc028e0f56e5224e57d22d5e1d267093040fb6c901fa67b4bc34f8cd9c0eeb3c8a7f8440c0051d2ed83ee86185ac1cc83bb889d0ef93492f9f1a5350db5daa7cc060ca4b30ed24946451fbb8e7bb855f7e4b9ccd601b54cdda7eaa70f822c085f9fc4d33008f60d2a07030ba2fbca5bd492d856d779d2ec66507d4507f940aa77c1b6a9061393bc0da9e34183e4dc50daf39bddc1906c6fda77193ead2aaa327b12a68b9aca31a7e9b70149ae247cd2a9439b5bb0942360edce080c05985e975b4e984be51053ef057339090c98bf64e18b5cbdc4eb81b0eafad265e555a889897808ce86587c8a72899b0d0d808ab0de29a9c22ab85354e73c41427064619eb4d90318bcd2b56d8c15d1ab8bcc71f789afbabbfcecab33eda2bfa700903ccbf314cc3bdb6a649291da01d982bdc81d35929508ef000f77121166100ffb941d45906247c098655e42db2e7fab9d80fc02c37a455aa82504ee5897c9fa4f9778680580543fa0f1b915b2d8126923b3326b7cc4fa7fd9e20e045c3ede01a8bfef67d67eaf88de6d69f23bf5ce4dd74fc108d13aae1897bab584198d02ec822143acdff531d1b597002251899e4fa4ebe9b62b2d8fc468d3d118d54ab40bbb8bf47081c85da71489a628eeca70d46168777babe0340d408aac45951f3f814678e29947b5033897356a2b8af6f07bffd63b92fec8e1ac24f5e07c19ca1fd8d2fe5e8234606eb5971869880fc269b501ced7eccc62203318df921650666f73631fd1ef80d1e3882b417b371860eb021c74fd01aaa9754b06c87f0c7cabb30e3f8540db6e877d3f4d809f41c49a11b8cdb8b54112a9a685b47d2ee6ade7a3d42efe973917174a54a71d60010633e45c3fc23749a001c50efd8e2aa6974ee69901421a1287427b20518e0a091622f50b1cc29cea7dc93301fd4d65e9d7061caf37718081000042c02b19a56ccbd8f305d4916a985c7964e49f2caf680d2966a4ebe094b04b52c0f457e16a5f7a67164a8c2d561be91d7a3b36251a519994dc2505ff601dfa3e12223cf3a0378f133fdc69dcab752f27106f9f688e475b4ee01de8c661839ef9b7cc10032e2426f31e70490a8659397fa7ec5d909106bd153fc6d773602a4ef9f9bc99472d8cd3b7181bdb2d41eb6f21e543790c1708599082e0c8412f26692ad76dd81f0c7bdea184fef1e3aa2bf0ff5b6c82793ae7143c8433e0f2ba3ae2d12c41b30a68737aa82e1fdc9c3798f2cd4dddc88bf7ec7a2acb921fa6ff0993ea99c51a4f29bc3fc07bf3b7cc72213a783a5704cd4a85bfcf7a9ad884ccc04983fd6e32532aac4c5200d6468fdac754eea595eb0dd22048e5caca86cbd89c2bac73c0dfb97af8609e9f47ab85363e0d608a3348159dd116faf283efa09eaa0c51cf64d6c4392a4717c3a93d260166da45667226ed14ab39dbcb5cd755ac0e9379f1d31bb19cbe6366186e9c18643628bbf18526416f02e0df09c9c3c8a100d63c15f2a35741b27c674f62f2032dec7b0191e270525fbb67903b50631f6a79c9d4173eb9249052f8a8babbada6b279ac3c75af10f8365b77d10cd294ebef3ca440b03536a61f39c635073201df4f47f0685d9bc59291612056c6c020c960f06d55ed3a7817f4779d07993754e6c15dca7917873f6a4d7411c0a0a53df512a6176bba203d97aba7998d28155098afd5b89467e7cff48616040e9506e73a7329c7d2aa0e52581f3aed2cd2f7f074a9f83f4413b3c61245fc9adb8ee9bb8ce8984407f0968f71a940264a89526610a77e6c482f32e08c20b3bb005c4ad984a163c7e93c2ce8cc1c9b5c4a6371fe9929ce5dc44289049420cb41698b2b130526e3ad10620d4676dff25c2330af58b61a761eb54061e33c57fda5eb7c269cca98f759f5fc6137f27e96784b75c19bbca41817ed27052cb9a4cf4618191d624b23923e5d4ba47cfebde88b9393dab59497df61f37c1ea4ab1494e3bdd02a80a4e44bb64c6825bab4017c3b48b71e8bc3c30168131fdebd155f9ea91fb71b9a6e099567ef3f8c57eb044b63420be6cb57f6d76671de0cc025107a5e5dce2102437a2b73e4c00bfa9457887f65767b2c782915900c6a75866bb62e975d1f05d4686d13dc7caa4014c60d1d3382ebbc19354a8531b20f4795541c18684501346ef2f6b7c4498a574b00a32737487dbf4ee52cc1544266d6571c3f3c982dca6e470ed63586c82adc7c827bf324def039ead8905190ec1a0b74a96e27ebafda75527864ca58ab1610248fb77bb83f8e43a5106e91ce9e3e6a15f552f82af31b7bddb44f5170f1adab163b6f9b039472b53b636ca03035b5ede36f868cef2b0da8d0c4097ed053c777693cb6341821261789ecd6f7fa64101785e51650cd452bd38f2132eefb420e6cee9490134036ba300f3b1add0309a1a7ee17d15791b94805c93fc4b44ad411353c81e7a7436292843d9919cd099ae731d733b34e7bc2ef7eb91c1510b6edcd6d00b382a2438fb764e6db069c41f6298ef5c6911b8a2b3e4cedcfafed3b047878659dd4ffc9a302003c6147e88d64eb625d4e7d7f2b0fc60d5d66040cd9452889aa84557ece261f3c32fd6c0d356e8a16933057cc2eaeb555cfea8dc216b68f908d144f1d391d5ca986efe2367654f98f01d57dd068476962893f253c6e973a51c88313e71df9758078b84dfa43d606fc65f679595807f6fdbee0680114240f39184d73fc397b75c7156f9ae1dada949d85accd62367c9d57010d5c6ec4befc434343a434d6d96621cfa0baf9cca492c162119491fb92df7fb4a00ded1ad705db48a9e5edf477018c08457ace2bcad990612fa5c84119822287928929021c0bc08e3e92d5815b1e11128e24e083e1c710274b8ec9cf18a4c0689b7c4c5ac0021819dfca523d00888f8f4bd596217a257138eb607e93ab28c9316724400e761240c8c2f6696b181afe11592272a03005cfb87b56e85895daac0a1f6305d38ee632ca6456cb1f4bd0e38c534760508b42c9d27b102682562a81596f4bc341ad908784db2af391c26ce449ba9a375586b594503f760d283cb20593102ed980e0bcd8cf1c35ebed375982ccb310b6c57140b6e7925d009b25b1f275e553ab1f854fd96a37ed67ab8285a79de1791a9ef5910370598ca5429f702a89b948e47f3692ae03611a8c9df3efbc204d40ab78db94c445d6eaf02378cea3654bab7a4e76d5a1f93eff7355bef8733740970b5c48516aa6b62ca177cd47b5f8e221c4fdd28373b6fc4ec53532811d29814df600434c5a2d07539add105ddb03b4f6ac6d9c7be770d5835fe93d30596951e1f5f7fb9cb7767c188c6c8486904adc4605006c92f3753c9dedbdc8b0fe80b62d0bd5db06d54d6d28f5e26b6819149cae8dca0539a1e5f3d116771cf792f80a1abf7b7fb4e6d0a7dfdaa94a03571482ec0941f0d5148377bf12aa849bb35a4ca8f0920665f7162e1691243702b218224af21fa5115b556e05370aa63addb0122fea20ae30b63067d2ac55f04264f89bce60f9b855c6ed378d7d71f602a7335763e78ef57e0390e2750005b8b8fc15c0dc7ddd06dedc9704a1a9f0fcad1535394a619aef55df9fb38eecc14d944ba2485ed145f5845b08257532e83850700a3ab856879eca459543808bce59a2cc5d9f544ba212ae421c7d57d92b24222688a592de217161ce6fc59ce2fd6fdfa0fa41ea38ff2773d42e874f117808a33fe38f91dd5e98be78c37f08a6fb7da44cdd1f78db62c620aaa3e87847b1786ba1b97d07cd06b7510e83f0a62a9d440b4b6e8d4da548e038a87ef92c2d5bc4552c4586a9ff813c06eaca3b01c16b65b12892fbdd6db638110c7a7c56c10880b22fc7b5fa0507c006fbf243535f8224e25963a14412ef65aa5d7962ba994a228714d37496eec68fd1f0b2ede6d47f22fe394ca04d11fae70c41ae87abec319cd93222f9e52e92c764a5a2539ad81f633c795af71101d54de6e23b8d9c4d748d5a69cdc20e153bf07b11e35cea8ed1244e382ed25246e4d0c9108f5c930c3fc1d6f8ac0205663a1107a62d2c3461e698c24fcd12fc089289b4b74089f47ad06cd9844ac75865572c8950bd4a437b23c12d866fc537316646c07397611ca1b59ae47838dbb3e8ba848f2575f449aa90289451fcd145d7d368565bfc3cb2a8a30f78d0223c9e2d157b62b546070197f00143c8c0dc04814065cb1ce1c5f0744780416c8eb7bf51023470dfd080b0dd45b7c01d0592e4690f8ba4a052562bfc7948e8f95b61ba731a36b53e881174e607026a42972ad29e46fa85a17671db363eaab05ee3a9f4142f2773309a7f3f87e94caaa6962bef4584639463cbe3daae03dd6eb32cb718e4298973e7c69c523ebfa9112ec6586a478666c995d90d91b1e8c22884d8c5b68be5c9f859dc926d41e4c0198927552b8972eca437a50d46246870326c51b610935ce97a985faac86c5b9779d4bbc99dc7d97f0e11b5471a66e513fca0cd1e76daf3850c09ae6d8ff8ec7866424a3d4e83e69ff37c5635e3dea7b456df9450846945cf1a8116b4932111057f64fb000bc9704f240abe0316aaeed6921bd67fc5179483b810645a24b3e66556664aea7bb1600750637c908b45428f3c2fd2e09757ab2d45b19e28c0d5afc63bd820ed28758a0030f950e783c1c30cf5f5ee68197d071f11f7dac155d4e8bbfb00b6510b7ee0f54d421757a0a8fec5ecaccc4d0576df2195197ab03c0e6e3391d03c1c61ef598cd2e7b3f7097c18e83190227f4930511e4385067471cbef80d6284c8ed411e55be5d934fc6847c8638d88885d9a348e0eb0cc14ef7c40c36812f8f4e86d6d5712791d14ce61a89fa48db48b4cd7bc92d71f24211aa1c6abbca8f2003d753bde1dcb1c066f737a07780ddf9503f182e3ddc478cc0f6acb0e040cdb8d00059044e80a83ff4d7a41dedd29cdca54b5558c67b80bdc1d6da67b7ee907994fa5340a3b2ab8a3446eb5f5137995aa35cd733ad6ba20fe273ef8a6c38d08ae92f857fcc0c518b563ae8045dee7a3f8efd08a398747f0d5df86bc3672f2b4a7f10ff3a0302249183d7f964c9285c34c000719a2b1d605c80dddd54d0bb1a59f769beb4f92aa7e4b04354be3b33d0e25fb82c16fa6f6b33018eb041b71604d735b1001a7d006b8ddabd801401b77e3544d357fac3e56d3cd700957308aba5c7acc8c90d89ad904e91c6aa4360fd37ca1cdbe263e582b553fb6005115b60980f64b43ff27fa8bdd82a5ec621b098d051fcb7cd5fc3d0ca0d8421f29b01e5aaf97bd75c569c9233caf362a4fce14224f2267d7b002fb95a3554ae91e2aafbbf1afd787564789c4d23b797b15de96687a85d274bde6d1c31f0fbb480f84624142d52d1cf07497a55fe9b6d1539a3e37e599428de6b58965caffdb9a440b2fa23adfcca26a1c14ffe1cc71dd02a2e006f997c81195214a0dc934b6cd01b6c40314e95b84df75eb392a2cbec1fb45ab8467e93daa1a61b29cf31e6e8bf075e362809a7d58554f5d6a77a1e5bdfe6d7674d784f6ccd79d94b821791c34646453089057a2ed9949f1f73b812919abad431d515fd73c81562de26b420ca769f3f382fabaa981336431e68cb7e12b222815b1ec2862a26ff9453b4991e8ebbb13be1ef00fc3db0910cbe91484bc8660b8c004b09558eeebfe9bf346d3c436d42689f8130b74a0551b561c83af991593b96ae4d64ea6f140d69d2d9c690f3dd2f88b00f0d0687b26274c9461588cb711a143426301b0218eebbff0c79097c19ef66d1ce17b8827048536d157b061fac4619df23c89d4400858e120ee636df8a731652206ded5f9c73eb7df16b7227ade4986b69f18cbadb475bd75300df0ed6ff1e020fe0c5565e9e6ed1a8478dca97d75774bba1fef3131034e76205b13a05c4f63cd7f650422e23d5de66f7dd3ff5d40f45c3c20debb6ed86e99c78fa08d82b90ad6594b30adb29799cc578fe1a65e9eb2d024c70741e4ae64a967393e58c2ac9293b51a59f00cacb3fef355885c4079d390e10129b14ba8a52d843556a92491fefc9b24d5cf9ad8d6d92a24f64763e884c3b2412e384d66778a67d8db87d2c279dca58963ea0f585a35f64fa43e80268ff743583f872d608ae93d0b095a5209a69a4a898f36d9a403b0bee9f304ab4b52ec1ece8014c2ea0bac1f91abf62b79aea7d66f4a963ada601cff8309d6f888dcd2e71214ea0c162ed583c2bbd7c5807fdb450bb339ce4add147dd0027e9071a7ff1901eefea221e418773bdd0700a400aedb46371bb65f488280542d62b6e7b2008e6bb6d1a70371f5363ed43fcab43f1addfc920c68d7e9e62e65157d32464a217a7f0609c747dda21f0aa7bbb36f52cf5b699d329d4dd9bcfb92ac526db93d3da9f4e9387b88e10b9943f4c54636efc6aefe2194d932dd8eebcefd4e4c8170dace3a6e37de3251356a615765a9fce92a5b08bc0978b88882e9c5cacc63c7c900d85004094c04dbffe56e1fee5af85cb6a1452e606c0e4131df0f561496b0bf445bfe85e3fe937eb5554b76a91505021a7086304232d98679a6a5810eb59275c9002c454b7338735aa5983d8d42c0044420e292e331d408c1990b774e59c9195a00cfedcc9277d21393d7c5e7c256f64e8fcb00f4d955ed47bd933b9ab04eda1fdad5c45da018417bf215807ea8f66475dffe21f483219afb36bf5632867fb8b49601087487314e3426b1b7eda0a96cdb6d990a59a256bd770673f58140dec8e1e2c943ffa3e588221f7648548b8a37b7d9c38996f0a966f5d162a0af4efec559743b0c5cb1ce7206f48870b469a1c87032cb6e41c16e2449337448d0ed8b4d4f6a0e2dd2ab1405e595857a0807c645c3311ce9fd2acffc0adff7414a1779420d992253cfaf2f6dc0ebaab04995f32bdaf36642b862c4442157394240bfb2ce27a0fa6412874496cf4a476d0284d8c4b354dda80e058668fb5c6b403797e12eb8a0bc30f1e7534024df480b0c7fc7114b58e0594a8f1fbc8b79d60ff5d289d88d561a75cf1d4ba03bf7f76795437e6214e367e782b4e32e7219a9ce9c4d40852aa0f9202a967a178ea9c90e920de8833faa4f30bd78ff9f45cd89d6439003d08dcad3199276552e68c6595e6d6fd3b5076ddcffc3ce5a8bb1a81c3650e19f9216e0669ec152aedf32935411040422b78087216becffe59559473f5a6f0b28190566b5de45040894c16d42814f56d6390c351b2d5aedadfd5799b1165e98542dd78f4237ec23ae04b0aff931409c7899c594754985d1286c201f0d24b20369999867bd9c6b3eb0e3f043b937e7078c90816dd08d43b06a613aa563c84cb434de08d375adfe29aacb15ce9cb7b7e61cde0a9753dd7890d4ea344fbe2799d93c7911f26a18f0833d069e7cb6083390915c338220cf7e4382f8f0a698059515a0ea974e5e6c5c5b137380a5260b22724d225ec8b182294f51ef3f3565c0b004ccf9a3aa038ce90243bc37e791b7c26a9d27e59731711cc7d61a998af40bfd716821f5cb99d58589e416ee83a40898be007147ba2fd5753775722d7cea5c52b1c6fbb3f841cfc18571717c82d08d1bdffd25339ab01b74482ff5d3b404ba71d7ed81c635764ed018dcef6601de71fa57c2dce960dca26fadb2b6058c8cb606480504417e85d73428ae0a363630099923f7851c9445b6587f3d0a211d420c2e0d01cb9f95420b890364525b06572b5430c3f8e3c345119cc64216635c05b04a7b7476bf124e3d8518da58d5144ecf6e3b851cc84c59fd2303fbbb4543bf4478b37e112dccd81344a53959a6a5b0dac1d1c21cb9c167e51ca4051dac1d83601e9116c817acf26b1a74dba7ad335592923c4ee201fb0cfd8509bb8bcc93ae6edf92bf1850113fbd2d152dac7f4ec265a4f80eba8a11e447348d9f0883fef7b10cf8a7f31c1ce8f0595cc49abec929c9cf26575be2a949ec823b6188d391555060a581de66b48be9c344d24afe2e4ace98de28f0b36625b3b02b1b8f65b9de432d6fea81f0934a89b8a567acc35da64079fa980d04c283c0fb5939f226d972be632eb5c002a11459e0a1b8183fac1c8d01d3081b2f6050e4313f97d006fcd97190c186b7236f88d636109f72a616d825b860c9df247ba9f850657eac5dafb875206dccc3337134184edb0f8c3a8689c4a909487498e2db3758992031a83818dfa3c9a4d39566a0f15b721d234cc518e738254e640f40cf9327413877e92fabca0ddc883878f521456f5ee651b3695db63657a1a258fa1b322dc874e84df666cb4499057da7da0cfa80774c2f8a67c629bea69ed9522ee5d95b605cd8164feb106dc84896ad97626d079a38b4f6ad98f65c401026036db0d4f40eb4c2c20555bcd52947999a34358950d6883cca7c25d138140ea731287e631546ab02536d60a56abefa1af3da300542a864544543e22b4faefc071f6bc194afaceedfda136b0a764c9a610066035ded639112f2d2bb9f04870d5df834879f0e9ee58ea65f6f9fc452ec9dd17ca0691c8fe160443baca22e08805b930d330792339a33dcbf4831e8e28f618bf43376ccaa67e05fe4691a50177b2c9a163780e29b28f6a62ac2fd4f8f0a094aae588a6d3db3204aa7f97c2b5d832a989412fea6049d368b8a18d8991d1e978e0203921e5d91669ad2252513a9ce830ceaf3644daa365c4a48b4e011c3f4abbd121d936bbc6a7ec75c5d5e1f3ce8643bc694e5695e9ace154b09383dc3312b63bf34526fb8561fd3282c7761d7a6360b2dc1ebda2eb8af67bee160a80e83a28c21d0315745d23c9e56efcbe9dbb0cdba5cc58108d7891d65e5166911b36db0e8e26d6d703db2ebf132e7c6398eb4dccc886e015519735e3f6554ecd2c2b87390a52812c7a117afdfdf1ab7439b88de32d2c3182c5b98246435fb4dd7412742824dcd7f452e5e8d9d2a28f34a9dbcd98a578df6127c846b2f65625a1364543e03fad0a2915b20d2aa9a0eea21e9a7e9c9437d75c9f43b2b8c6ddf00c3be60db5ea03d1bd0d1ffe9985f3c16d10fb8d0ba39c8599530188343a0088039080a764f31afc0502231a3ac6502751c69b80f3d341093400cd9f6deddb6dc5b4a99a40cfb0843094d09a59934a3b02973a486acc2941912cb5e4fb0e9aebbf7520a0e2921bd40e9ddbe52a9de17688f3b66608631cd9846434a43ae10b99c48df257e9d66217d36d78eb767f3883c5babad3585ca240559bcf1af84f3095e2073e38b49f5224c5c285d05b346ae4e5db579ce8b44eed74bb78d725cad35f0a68e325b4ce7fcb64b290f94f5b4c71d3d3079b4cfcc55cb42182940a6daac69d5d60c5dc5705191d1b7c332e88486d0738b9b1c9c651aab2d1a98dc98bcc569c81ed6160d266f5151bf093dfb4d8b9b7c822a3aaa107af615f2b842cb4863a691c2f2dd5ed68081f24061305872ae18e684c2c1714040a506fa412e294c45dde4d3a5a2a36a48e8f36fa8154d6ee03279e8d3d5de6326019365e710067f54e770676bed30c618c77c404040990251200a040494c799ba721d49f2366b9657b2e26b2df8813fb0832090fe4b2b2ed5f0baf5baceebbcaef33a9fa0b59d3de2dbda8a7f66452e2ed8b3875974f9b0bd61e4f97824421fc8cc9ed7d2d2d2e1c0d1384e2814cafecc8a44ece5187aa9a31990bddc416548c0d6d9b4e7652c2edebcdbbace7a80f2680ad4590efb26f67b7513e95f713e9dd4d6f02660b6668fa63f9447bf7c394339ecb9d7e0f781df07360866a73dbc16dae30379b4884e9e0e3d9d565ef6829f6fcf2b61ae237aeab60889ba27c2573b8c45f84271d6d5969d8a4a60a42b8f5794213f760e8f7407fc41614db6c32891e787401426030a0483c95262b2aa834017088adfc6f2bae0291016699de94dc5cd9c0ee3cecbf1e5c078cc01e29c479c22aeec368d818030ce228f357199f6758d0edb6bcaac0021115191cda2d08c8eaad4626f002d09028acd12649f8e8961524eee98a191095d59bb4c66b19ddb4be64d1de5b5b15913809fb35b382f2f5087fd52e9e1ba8ef36b7483a25ca06e511d786e4ca859338afaf9a48c9fee30e7d3acf2a6f149ee4fb3a810e5388ea34cf27c5246d063f047750a9e1080b732dc92f2cd3bc039f69283f1725417479022d7fe66b754579517e8c5dc6475986ee9f4d18e9f163de2935b3a7886f4c43f6a3e414af2b4455dcdd50b7497348b46516bad0d6eb55225a5afc90b54025252bdbcb95b25a7abe69c1b7193eddfd306ba35dcf88a3a6f0baea50e6fb3aedab6eb34ddaad56d20c0820674befaacd5bed05842f3b5e341230a1a49be9c543ed7fae544fa3a6b5f7dbb969c6f7c751a7c15faf2b3d65aeac2e29c2bfc7454c2798e263187e76d1192834f9373d257ad6244330d5961054af3b4871d794c1eed08e0318bac0832b71832df98b5073c2cf07cfb9066cd273d807dfbcda492b1e4392484eccb49fb21cd9a4342c4befd66a8c7cab7b7d0ada902766e54e15c573dd93750c58c2052b0032b49e0f0012d88807005126e4c5106193558a203116eac51e382e6871a6a58c306178071c485c7d7ccc1918b73caf90d8e016a2e3c048faa94cb2f0bb2a7263086d1174e809048f1821c28dc6081cf154e54e144e782736b1192438f0bb54502268e5822894f114540e16a7fa1b6a618b19e9a123990e2072870750fce5841932c41b0000535573b0bb5f5802334257cd828438c335ced0dc600a4adc593368452ecf1785347e9c2d92d3bc08604000983928530c0a68fcb67d6f4e6009bdcb9b79075ce32e4055698d01ab2bad5be98b95981ca28177a38d2a4900bc7175d83d62a0f1506726e6b85551e688df6a8a30de55179a02d034c6a437b7416186498336f993279cab4cb907ada439c3c5ce8aa47f0f2ace9ee13969c73c0bcd8fc0de94103c3cd90bed263b21a4b9eb386e54ace4dcb3d0537adb668ee9a86c7def9576df50f74d54726d91d7d3510b513967cbfa43edb56390e4ba65fe6ee8425735ee60f6ca0267b499e356185d59ae5cd9ae9443657ed5c7c3b4c36c4944d598dd2ad212ea92a994ae3baa45bf43557ed38280b35d1b75328e6a443935a61836fcf49723969305872e77da5c9f65a93ed7d0335ab366b2a6cca10f560b6ea91493433b35a89624c4c4b4b596118fc51c73a43924b2a1b5257ed18e70e8a97c56eab1deb6794b73aab5c11549b6e5aadb57620908fe33eae54e2b812c8711cd76d75c89c467312953cd35639ce34660fc92cdf8eeb91d9a2afba9a3513fb905b305f43d8e02cf5a5d3ac4b29a5f947c7e59438aec4711cc7715cb7d5284ffdd2e8ebf5ba3d2f7cb455fbf259b161cdd33e802ab40b7450a4b52e72e8d9cb0aabb50c86beb2a7e48e762aabd67a1ea574c96c328bb7a7ae88c210c0eeef0fb9725d47bdd477c292ed9734848ffacc1abaa45b15c94fb7ea4eafba473d3279e83065da4b5a04eda9add0dbe91041cdea3c7b9b1c7b496348dcd13a1e61d468ca84e20c3d1c71f28f2120ed825a09c0078a2d6b56ee3526cb01936cb769b2b6c8ba6a87117259926b6b48ce9da51d3059fdc624dbc921b54589a0ab3792749666d1164c18bc1b491a9bb424bec759db3925a1530a0bdd0345eacad9f388637270c4b9513c69c355c4f2b898709ee3f2e8072ac9e0486575d5d424d22291ba84516b5ad368cd452857efa0c865851139d141427bd0df1167adb0cf2897ddd3765aa3579a95d42c7002b3ca5f1c39a5ae2ba5be54d7a5c00e04479c222ed06dbaabb00aeb3a10db9eed92f1f365857d7be56956e9b2a4c2c6a0f2ed75a72b925bc7f24e79ea2e31af1910848b4e8ef2d3888d66664a7c84695e68a2d9f3680dc376be791e4a54b9380ecf719d4455c9539ee3f2e8b77c9bbeac40a6395b1568aeda4d36db4ebc41398e110787a3bc24de9c3ce5e1106992d82fd54d8ce3f0989126a93ac7e1311ed3a53c85a3031dd3522ea9944b0a87bf7c2ea9148eb0f3ae34e1a7cc74a1386f114bef4db8288c951506a5ef244e170a372e2a7a691c63a478523d34ad6975d575d58e71766fda0d0a35e260276800e12ad22a78030d1793eb39aeb28fbe6766305936d2b7abec1109294669e7b41b4b8fe32eb839253bf0c7e6f796393edf015ce6f8bca50187e3a86e507e72d478438e2be5274f35cadb5d9cad5e62825ed27cfb63fc51eb3052320e118706335e3fb87038468a9d3cc64f9ee38a719b46a91ce5392e2f25f64b6c585da544d54d089ef210c67ea93a4f7908ae125539c686a94655e7218c0d14eb4615da15e331a9b1abf47c3b9864725cc348f84ad7b4dac2451d16350d17e1225cd4b49898944b18b9c448014de4f27474b2029ed07fa2019d6893888a262d70011752c2308253830cd090adc0481218a722668d1d4f594c990602fe8966257f509c68cdba4038f9a9418b2f4f53befdbb924bd469863a6ad645cd5a44d26f9051b4971e54116a3646d6f9123543a1cac8e589f6edaa92cf2adf79899a9191b1572f4fb413ad5946db4b4f6db9d05e7a5e7a664a503293d343922a888c729881149d06e4a0c88c1d98fce0c46872918509d80e9808c20e761080d012284ecca0066690e16adfc008a8687cdc237249538215207ed0e4061cda202287066ce8240105610732a25cd1254a93ed2fb0da72096a97a4da7249d2ab76a117d8cfb78b0bd0926f7799d5564bad2529c35c66efc2f32e48efd2e3285a6d69000d29c4509286ce14535ced28a3da9a64a0710592a428888c40c2d58e9ad5969743166d60d1e44a95295ceda8a2da7ac9e2c91533700276d4c4d5b56e750b7d857685234e11d7565457bd7d34d40c35a3b4f6e5342a7a23a146faa911bdd1926fdf62546a5564df1bac379ede7a3e8a25a1f67503d8f0bcdcf1d5bd22eb4186b4f002119a2cb3e8c84a2dc95e1a9b6695b4071f34f7de3bd382c018a4c9ea764abe5ece14a500f332dc3186eb3110c14f270fea44526fab154ff0d78bfc15fb6dfdae2843573a6d2882fa779cb6368b8e3a9aac3d2ae1bc66fcf1dc2be69c3e9d07dc751d16b3ed9ae5d66ab7766b55766bedb8060302091f66ca34b9e34adfa49ba5599d63dc39f538f007376932f54d249beca7e3ecfc4319e1ba71064bf62f6fedce36d8addda49244099165660f19f0db5973536fbde4f17d45259f7bf4bbe2fd09a270fa3a5e985953b2b604d6ca7d30df16fc71af2c354bb5babab126afec865cbdbcb11b345e59ad72b64ac9e5adcd9aeedb6164f4e28b74ade0f156b935b2ca97d823c9da0a47901b4b8c3d3b96398f73aeea58a666df315094917cbf84a1a212cfada8e41b61eef2c60bda11b3269802cc57af220651b0ff358971b546b7f6b456abd57ae2e91adcc19b3a4a116c95611f300f37a33416e39935adf3aa97e36854d08474a2a0af66b56c6846a3b5900e05da6572b076c5308b9016164d99500bba6a0f8fa80871200b67612ca4855d737d2be78a816e806c985c969d08baca63cc8d2472f3d0fa55573ded3365fa05d2c0ae816cd4c006853dedd13e4c1e6d43a780896ceae621d638c87ce8576de11fc01a97847d7878203c8cb550cbb89a894aa147980a6a34654c6e1a7b565748d568d674a53d3c9d512fa8113da24474367b6ad42ccea8bd982cce8b49766d71475d783159731a35abb3988d03babadc6c07df5eb92326aaea138b205093b3864820f60e3b677a7d7b19267d87b56fff74c86508fb2f89cd8e5f0b6a16064b0e7940a3da0a837a4584140a1d997af87e4d3a446760acae643e4c196e6892dc8ce362302a72307315f994547199bcc407e8c1b5c964325918d40a68f74c9f92968e75926ec16c5a1751fc40e1c229c259e171652f42a5ccc0651a710ed0830ba788025c7964a29a01a7c9f62224b84c2393249dd71899864d422721949fa9afe2f4b1e2c4e2c32c86260b94c16c16186b92569341948f352b8432c976da64c30d23925c45b6249a7031515d9faf4ac13af5af3660e12ac322537659b3c05a935c1893e48e9a6ce76675055e69a1e7c2982c3a34c9763a6b72565b944b1ac2f8c8244d381406554c1184abc816c4192ed388536dc0c255e4002ed3c8a4a4cfdd6f10d3b2d1910af3746de47d2823b9fbb28ddaa8bbd081f572661bc3181b79d6555d6d230804c6be6bb515ca6a3896a47b2af56369ac7561ac7f4ce3ac2b6e2c679684b124b90c7fc29f6695606c0950b3300c480369b3068c4d992c660b4ca55a5a4090863292c32fdbe8268fb39a6e52b5ba82412e537fc1d81d4fa06e5b47c5397d4ec58dfd6ad8fdc9feafce8a28cae0a20d23d4b841490d252a88e20b1da09001c6c018180363a5ea7d1e481d046ad6e645b119105723e3cbd5532f575f72b55a1b5cd2acb99ef2e13b1f9918d7f06d2dadd59669b3e16745cc33653ed38791342b0c6ab2a7b64259afba47b8c4e411ca00a7c016914b90464dbe421e675dad00d2ea6a457b5a2693856d376bb7cd640237b762ff662dadb64cf98a9f0b08a45fde89760d61ecb5c46cdc243bf90ea1fce4da5445617447457d7e4522521e6befb5559c569c7f4ffdea9e59334423518fc8742c41588c232a22734523376bd23b23972d9b7d7b376901082b9b860494ef219c5cb1df244ed786d43218b8c4531f24c01e90e7b99a15a7b59eea4319c9fd650800930861167da48befe6098fbe1df76b49a65f72351734d064fbd1db57a160552f786054599fde18b99c480f438dabd11ae56aa9cf21820822881fca48a65fe2113e2b765fc539c28779b00fb3152e1136c12d0867d8278cb92097200da481461f0c60ccc865cb664dbfbac96c750d73d5de2f59bf5ad6afd6f1a18ce4ed4bccf31d066de309d4af873191c8fdf05392cb901b552cb4d064bb18b95ffd1a4718610493c964aad52361baa66bba4a1c9f00285820b9a8fd328c89600dfc66b9e4c0dab74a85ec2d7e81ec2d638b5fc0e42aead3e5d2ac3aaac8dfd1a418b9243397c48933224d5db5b7889788ec5f86b11c246c58015210106644c1c57d924483da186540d9c1de0bd6c0a4dacad5346bcb140685316e0dae66aaa67e35a9230218afda6a195dad5182b55ab3c0da24c3b065dfaf30366b6ad2ac31e1db9dab85b3dad2401a65eca00a10627c5185ab3d2caa2d11f0200935b428638a14495ced61acb6661a660881c3133b58624705aef650565b393a3c3471c58a28a624f9e0aa4e7e3e0982d0f787b230d6acf924083cdf1e068542fdd481f4539bfe326cd62ca2665d9e3016c6b6ad0ec064c2af29d31ec6688f3ae21ab09190092e89ab99b89a170b1a229761acf6ed2f45cd0a639d08476067600d6fea284b5ded76b73107e5711b871ed29600ece602b0630ecaa239688f92959295ef1cd55edadd62521eb4da9ad982b658b407a63c58b42501ba6ac741ee1697e67d1e1680833ca534b6eddb3f2172e9cf79d70d51fa6abd591c5dda35ba578b1b864f8e01c8b4d65a6b39a794bb2623723d80cd9d9932ed02a0ad494b56688f9f3cda11405743687cfbf7825cce7c0309c0dba4297324d36865ce976a0098e1313b4feaa594c8b3c954adb595ea1328c7d5add6ad2649d53af3c486f4c224aac0907b452594bae848ce23162eaec0648d30c9767f01454ea48ff2086bdd7a60d1f40893d583eca1f3ed9d03a5354c1b1848d40f01f75e3085fa9b97d0828e923827894ba5b1c4f9ad1b679aac439aac10f03c6e0a1df88e59b3e159537f3a9d3d68288f1a1f34d65a6badcccb079eba8de1ba4c1e7deac0538bfa2e9f5adbe2f20d029849b697441d1cb26bce0394217c7b6a26a09de67af599f67a695028bd0db731cfb48460a65935371d9560dc1fcf6dce888b2a4ded37a5bd83ecee16fba94827692f9db586b6be7d591ba6f818b1e082079a357588e88e512d0b85511e7b1fd0ac12432008d19ca92d6e7c40af46a2194f8b5c4ea2b7004c15b99c4644e5e4c2470b2e5860d64c0ec9878d0f1b1f363e6c7cd8709fcfd6c56b0769adb578ae287e11ccf04d73406b92c2b683cf5f6f7102f6af5bb7d65a1decbdd65a6b5ba5bb713e3d95a3d4d9d7ebbb59cebc98613cf0c140319119b02d95be1ff45c75ab3461dacb224f6967b947f952308559e56ff73d81b5b42b1b3498dbb5f6de7b2f4d29964b9aaf3d4c1925f24d90660de961d6cccd49b372e480d1d1d3ed6cd9b9ea12e729ed9725828724677c04b99959a890b32834a379742d4eb3745e334bcea9943b49ced0d0e049d655d5412ee795af4e24c70c3c1787b6f75a6badede922c0f96e246b376bedb66d9b03a1bfb5f015eb43a05775b375925c09befd3ebd7533c145a15f316c4e047f9d3232f46f5d9f063b6b87b459d5afd85f42b3ec5816f9fe719bda69438cedf6039b23870e1d3b76d84e0b3b06945b032956b0029f2d7ca04031c288241f9f258898620a15a800a9c806403d37f8f9e40d27a57e15fd1c7ac9e6153f9fb871e5b79e7dcdb2e29c732269b2b2384fe5986996aa2ba159aacf5d47b31aa8c9eabda457753af5a9ad3c561518f443140484c51152a07091c384e808932a72a8fde8f089b8494cc1284247e868288b170fa0624889297670c30a52d0b6d44f504528698284152e5e52c2c8010c0d2dacc0a684d18959843922cf1004276651807145195b60c08a23689094648ba3345eafe75a4865ddaaecd8414dca9c04bdc0c54f114984b4f899a24212120e51dae8c10e0ff501fa9ae3440e6e0061891a134d7270d5793483286e70c60d4e9ad0c0559dfa54a740d54f69e492fa80b25ca6907cb5dfd45a71135bc8521f0ae4437dbe67608740ecb003cdc94f1451dc7043d1a402d35d7fd87bb78de330b64107542a79def7a5f294012d883deb85489e7ad8f3f62fcf94b93fe4eaa69af429f047f5172ab9ba4d6d697181d1c9752c6fd0cb0bf803460603fe08ead3899e6ea84261fbeafd752c2df02f2f3030a7ef14c28de559839d289f6f904790229766a55993f53b261513138303758a898179898989718969c93131311d1e4038a70c8d40e96d9943fe15e7260ee08dee6dd60bd9316a723ead298d3685ca119526e70bd9a9d2e4fc16b273848dba35a7d076a208d969c942832297f84b45df25a18c71c6251a87830b5c20bbd5d65a6dbd8287e7565b6bb5f58a348870c289277e9a6862b3d75a7b2d14182c76abadb5da7a45104124113d71a30ac6b5d54960accff7576b0aac734e18582a36494552452edb22e1f16956ac59b37954d767f36c364dd63c797c1aa8796a93a9a47c2bcc5bd1d22a442dad6eedb64d3b7bd5d6a713238802996f9d7a5fb368ab52a8f36bb77f4d4efb5121da63d974ce3961ac9d75d2a693ce39e79c3de91df25a30d9f2205b213b9bcfb7f29353373caa5028b79caf42768484ec0859099a142c89b07e1b85ec083539ff85bafa0bd921da36213b33213bf613b243d442ddca2f6447d62cfaf385ec04352be7e73728642768b608d98965213bb23a0ad9096a723e6eb2c5270b61ad12f672dcbdd75e252ec7711cbef7de6bedbdf6de59ef66afb5f65a282f78818f1524f6c91957fab3a9211d24f6fb524dd28f87ef4ba54a224d93f2e64052d93afe9ab5b92d6a564e49a3fc7c7286ce57cf3f9f98a1c60b513002d6c26c5bea090fa8fc7c6245e7aba77e3e310307efd5fa51dc644e0adc1b6fbce1c6dbed0a6f35239a7123d33ae29f75912c68c9cf2c3fe9eb270d020f39a7d29ecd6bedbdf7de20bdaace44be9e05857ec97411fad149de13dc09d40aa260bf699d1fcf86c31118dfeecdd03889439c2d4c451d247c7b0932b525ce55af707c7bf5491b72d3acca4dc974c4d57d1e5923dade6b7dd0586bed84f9721695397e8e414e50e4fe786c143edbdaeeeeb67392d429b501c9e9e7500d60fc89f6f4fb49a86514116a66c3307453b630ec6a719bdafa9ea0abef8939fb9ef8ae9e3dc7e5326bb25d6090cb971e15ade28dc9f389ca4d8b879e459ceca6d39426a7eac6e4d9e439ae50c4c1a3aa65c469f1d0735c988bec1205764ae52d72e992f42dc93fbd6ac738e754eaf4f3ed519a04714c9e3d1471426f21c333726d71c0066d5cc103273c24e16a4701d5161983264682d861688731787a92bae5e2dff72f587279a2b98828a3eeaff435812a32ed901dc5c3d3ac59afdabfb17427496e3cd168be44cd682cf80335439991cbd3cfc988d311b4853ac5e034835314272aa8972729ffa3809f433524f1a8d9acd9be1de5c4ebbeee07e7289eda3ae19c3aa1789ea4a869d3de155144a82968b585a282aeda5168248d51fb02a9a2b6381da1a4187de3a02297a79fd3cf09a8190073970baae8db1b4504a266386ec8feb30a2657be7ce961225bbfde813fae53f1d2925ada42bd9ffb710bc04492d74f133cc0a2c634c30c272e2882054348bcb02168fc3954030cf320972f3d9e911e9e1f4a5c1c460a6d05b838154578f19e8b789ad2ab761771ba4eb49b447614adb626304405ac87a12a8ae041c011471c91c4133db08183674fb413ed4588971ed48c04d8ac61bd635af63faa2d2ca402222fdea0420b255ced1f526d45000b268cd0b0c832032caef68ff619a19cccd656b4d15050bec77233426551b72254172f41bcf46c52b6a2b96ac75072398d5868a159163b10f21c7a259d8ab8d5d61008351b7a193d6a565b275aaf868cc87e3e71634a007e3e09c2947fe9a92d14112a8acfb70fe9e80c19216a32e50bf093880837be8a2aa27c899acd2aaad0f99e555041848a127e34140a89565ba822d44743cd3e1aeae8a385236a7691c8e587a2d5f0a5e745881721e817271aed614797d9e4515b2ccc6fc318e3cdd6264f7d2b1a828684d16f47a6ad6893b249a15b7c0fed61c7136df228aaad8f3657f544a32010fa5dd775a1db74b8d52671284e9745cd9a65d3f301282212d2700972f17149f2d2f3e2f3d2e302d482f42df9be5fcf7b86f992bcf82169b23f5a094a2e51331afd2a0245a1f2fd7c1315356b0acae8f3396ab2fd03819c68b3863af552cd2a4bf0413353c2ad755f20f8bcc53fbd63becc181bbda546bdb2d64b49b3a6ddda99c7638399e52dadd4c65beff5d6522f4b43bcf592cfacb96e6bd8addfa49ba5698f2a15beaf1d07f46f2cf14df87968d42c2ad627a59796d467f694ca681015a2945ea3661d592b6ffdce2aad59d7e8da60b2ae1793b46e2d85f2d62f259bdc31530206af17b5da4af9356a96fd98a4bede165574dcbe9675b70fa68c750f7fdd7d5dfadafb5a84792a96403a821f4dcaf2369c6178af4c19eb4d7bf4262df5f92810e8265f21f46fa4e1f3d04d230d4c6e3e0f41d0a70bc459c44d5a183272796b37a9aeac874d5a1f64fafd9f835eae7e356b6e0fa68c75eb0498fd47de5a1bde7a59f3f6076fbd44c0db9a8e5bfbe8ad519fa5daac29f9584add9bb457756f08b49bc4637d4bb2e44beaf3f3d65a246faddd80defa6dea40cd2a75d01f6b5d87e783db44f3a68ed28bfdadb40576cf7da1cffca1b8c1eaeaba093c8f3fe6a7b77d52e6e49cfed66dddcf8dc69abc5eb222dbd4edd52ccad32cea33bf4b7e7d4b82677b09f39e9739369d5edd66953a0e08f975dc5ebdc1f2f5ba796309f3e5f62ab7d7f64241be138a0ea6bcb77d9c38bf8a1749bc569aacdd2b4d5e07c59bd4abeb5e0863d2bdf2d73dd8aca17e3da0bfb4baf20963eefc3df28efcf578fe7a3d4bfc6dbfd7b757e73ba0e7b8369f2a840efa4de8e088c3843a0ee8db8dc943d398e3dac692436a96956eddcd716d81be95b30b1df466a9ec37a73121136026f0407bd0df4ce0f9099e108017017d03a959b56e4dd7bd59fefaa51d35eb22f50d63b2ee1993bc7e2f17bf8da5ede2372f67177fbd45ebf3a5b1a489914d6ede899b77cfb8a9ba426a169de4e677738ffb363143790f7f9b08f34dbcd77d40ef95be4d7c51c17bde478b7a60e567911a41fc26aae8589dc7b3defb72582203bfed0895399483ce6fa308707e04a827927f135dd830f29ee9dbc40fcb7bf9db4417315ec5f92cf24116cfc13c76cfe5dbc45215cf79f3f34a1dcc0cc376f0a9388b7cf0c473b0bf8eb71d20dbdf1ec74da7c9fb6af2821e7a19334407f4d04da899d70413fefab4e99c4486a961caccd69c36fcf5988f89f91ecbed8796b1dc72f81bf3f73565aee724726ef27a08b6c47249fec6b9f7e2807ef3526cd6a0fe6e0078a3ebdbdd5eddca41db60489ae5b32d69d67c82c5ca1664693f6cafcec7074e5c36625f6e3f7f4f5f6e407fb7d8df4df6d731b77db2128606358b0e7dffe44b4ab489d4bdd84b1ad385bd13b9eef088937f0cc1144fd7e694767d6e6f8d7e5ea09fd5a7c8fd047f0cd169af2ebb8d2a153ac7be42e778a481c94d75ec34b477e30a3454c763ae2bead345034da5c1a6aeaee31667a5a92dd54de7ed9d4d6da96eb057c7358ba9babace5d57711c4db74488d9408085356a7fefbdf77ab72fb7d9ab63c79d5d1dcdb2de7e3d555bd5af4f1db7b67562a38f9b05f3d3a558eb59cb591aa4c9cd4b56d85417606816b59c7835f082079a657d069c4ea46972ebcacc897753596fcf71a9eca852a17afb4df51e719858c769afe37853f2ea75c4a95e1af34c4dd5cde6a51c17756b4b983bee68721bcdc841ea86b7dedc8559b3fde62f7cb9c17e1b715d6d1e820c7299fa0dabf078423f76a15b395e9bbf40e4ae11fb6d07921a1bfaf2c3af34bed8d2907d49757efb5a5d25edf9cd317777346b236736df9cecf86df642766a64aab6aa6fbef1706c785347d9b12f79e1110aab6fd814a3ee9ed251f9ead76dc1f33986f166d9ff7cc7d73eff7dffa5fed3f11ff9dfcc7f34ff79edba7dbeafbb1d88fdf6aae77cdd496269779fabbaae9df6746b4ea1959cfa2c21daf992cf284deb29e19a1a4c4a6a20f9920a7dc94b3afb122dfa12a57dc9bbfe442147a6b0ca56e24b548a2f7ddfa84ac1fee740ec7f34d9e97bf79b81f634f975e8585461cf79557bcef778fa217fdff4e99f6e85fe754f931f92263fb7e91eb292f646f29f7bf8131b87227df5eaf30bfee811a7c9cf37f0c70c4d7e5e82227fde6e3fa742cd9adff96753b1383bb1a442ff79fb306b3affbc7fa03db07f6ec5ef73dad3acf6c197bc1b7b872953f25217b99c495ff292cfd02ceb25c779350b7bc9299292e7a5afe4dee79e83e0573ff01bb1571a3bd03190896afdf4432e61dec2d4eab656cbe39d7ec84d53399ada4adfb65fe19d76b2098a1214fc0451307d92dae2b69bcebb316fde8de0924c4730fbeba59b9273234ec91bbce97c1b71bcae2a05a6eb0621b75b9b7a450f94667fdd7ab33a70dd7a8bd4555799d2ee9e2d6169829fd355bb653c2dbcd9b6965adadddd76fc62dbeeb576dbb67bedb65d6bb78dbbdb1d95609c3d6720e69059e6b82a1508559d409f561a8ee32e777d34ee660e5257a20f1aebe54c0a9e35a1878f0750eb44f09b30656a4ec0eed96f010e0053a8b4f6b4218d0940bebd0699a141be6b49c473be90ca34536692619b35afbd97bb9cb5d6da3b49da3d25c137c75d3ac337e744f0df29b371dc68b791358f38e3de5a2b10623633ca9c482fc090182541a22fba4379680ff561c18566955489168cb098715d55f7aa24d562442e276dc8036e6666c81db1257307497ed3dc34eb4bd596933673d5412030c44e72923dfb1286a76fad1dad7da5a06d0af4ede853c6ddbe8670a2698f169bf2a8b3bbc5692b1ba5a352946b4b519a35a55965098ca795a2d458167c0cf44b72be1dc929d342452e4b4425a25251fdd211e5e195d261efb53bc894bd24c8e868e19bb261efb5d65adbd1d4563706b1944ef2fa7ddcf8de5bb113c17fbd5a7cfdd2a693bc5deb56b7ae9b5806299cad48e7edd3d3895376081f34432a3706a9abcd8a8fe707b447db7bad0f1a6badb55e2afd74f9d9b42584521e1b16bd75b3e56d88393b49ea97da293cdaaee3bbafea5edbdddddddddddd7e2d6d4a299d4a36b7e9d9db38bbbde280ca0c6b5307dcf7d9f1a484e3b815349e64e33c6dfbaa6a505aa7bdd75a6bed2c7227c9594443135ec946fc27f63cadcf6bedf54173039c6da8b40b170d8b9a748c9100000000014315003020100a86c462d180449265d90714000b86984e64481a4a84498ee3280a32c61863100084006208013053431833d3ef907a259df4a3eba1fa329c30137c03b36b261f4eb5143f74b4a0299149485213ecc213724776ec80ffe76e35a1db3aa42c42fc031a03392a63a09270844c8c94e0c72b9142843c6529dc318dd255be155edda244084d1f0860cdb2b7fe9a5e9e8fcdafb8c8ee5cea8910a1cd13848b7b146ec326982576a28b7bb9e708852eacb1083113484a7d2bfd020a12a16c36c513a1afd8271812c89522fe26a3e811b07f7cd0e3275040b2b2114acdbf8c17c07f38ce8a2294955ba278ce81ce45ccc14e33582e5067edbf6648b1af8c508c36133276cb9bcea9b3057db2a51db79fc3ccee5e63fade6b8c9017e64c00a989ccfe1d22e4cf58285657b4a403cae717c4dc1fe034fb86e6cb7e3e63d30410e1fc8c38a0f555f054901440acaae40ea00d1d34dd71928884de56762cf3ef4c6c38ff19f58443393c0f07cf58bfe8798c4a7907e04ee01ce12dacd5f0143a3149a40b3951dcded9723f867beff3b416a0dcfb5d4a1aa057a62817e0047e9ce7da3983b7bca7ff22f9bd0fc26fba04044ef879cf8b1f940c52a6e5fad98d805b94689049d3958ccabf7f37f0408a3715075fffeffed56d9525cde2789b3d3df9fa6e7f0ace615477e775ec8bd5486b950351310718409cdac4c43226049a5a9fe0c14f39635becf3d9360d353159f505d9d532a729be17e184e59681e1032a7da9d2d9388be66a15244fe5a96af4f65d04cc702d9d546ef48908976cc9cfdc7a8574009a881594ce4ebf1c87b93b2ec520d0a5a780ba9c3b80e51e1c23a0605262ca4d5b7575bc6fe03413618f5c08731d116d80487c1925decc206d84b2a006988c89d949f7baea17414829818a05ded5170b457fb3077c6c72626dcf2fc35bef9818d47174018c857725d8cd68f0d9826e43f3e00e9450e903457447b1d7dcf40edb9b580530666e36246ef873c8d381aaa6936ee3549fad3cca2ce3b9021b66041e6bc318384d8031425478d2f8d348cfe9cbea41fb538d0ccbed94a67f4514985697218be6e29f0ebbd2c2b45635d0c87adf20fed1d5048e788b7884b94d682bb0a719077d8e442773223447bf5ab26f67e52ceb56998f535e22ced995a09a2650acebdcd124afa18a26dbca461dc4dd0bc54ea8d0601743e45bb010b06f993e5336a582c9b2c936dab2f99c7ca92a6a3f73f7e6b6753a4c5eca5458797dd23164b9fd4881d144e121e4c69d0e1772db036985589702e1dbd120906f8335eb116568ac3ea71f5642b4afb69386e3f6a16e912382ce74ca040e37f55fb2642b258afcc75d496e4ed81cee94b23ae340517b69bc79ce600387813442815a05b3b6ad16f65e35e5a77148241aa71f70ff24cfdefd5a099ceee8577a2b25f6a65766101a0d2ef0f2fb20fcb025482cd6f1112d0f25047e03a38f1c918b7da79e2945820baf953cfc481035d7370a984a13b92164266cc77d55c5b271d9fe507f14c6002928ca6f901d3fcf3d5f3bb60975671c84bdb68361ad449fd8c80949accddb79517fb0059c96f87977bb3dab6abe02e8b73e3b59de7dbdc5b487b4d5c3307542696a0bb10e573eb58052a587c7170192cbbf47335cfc93042bf953246d332a0f434353dede919231bfcbf71e8864258412a2ef44cb2a8d70241a82c577c74514bd7f8b2959f984820ae5b82bad509941891ddb06b1f8c9cdc8d1dd2e6f54cfb9e0e2ff28e4758b679f3520b62d8ed0990afc6375869dbe61664e9fe49e818d52740bd5d1d93c14bb26b454bc72190cfc25d6c02b6ea94de7ad44161e32a2539499b06831cb5f215f54a0f0ad28117af44d12e42ba3bf43ebb12bca9fd7b9f9b6c68d9b5def5735bb8f9d8ed42a85dedf10bfb1dcac7e2401ef7d06fd57c61645a68a7fb344c2c45db2b398a49e81fba1baf315566ee0416dfc9fc8801ed437861f57d4189af1118a3adc22073c1a2f1cccf3e1bce93196e4ee55da5e9dd43bcf64fccf14a1ccfd29b23ac1e1daf89c7131b095e002041878ca85665e3b9c570c370819a7bace502e8fc0c2a69cad32679a63d7e27d8351f6761fe2a45163ba33cad94d3ecffc5facced308a8a2077e5ed52e0038e318d2fbee8596b4ff048051f41e54097a168b55f989ec6f8e73e3ec0fb4633704b9810526e235fee15b14b45622ef40691b9ac818b6c2c5b0c64c11c2dcf0109f4382db34257bd086100a64d1948df5517d28b5002f544ae6bd6099fc7e682251dab60242399622e8170b142e08456196586b49419e3115c1f949db6886531e49a5075b3951ffea46302f3dac99f20674649803a38763b78d3a9335391061dd461af86cc38069782f070a7178e77a939e1436d0d2f9b52ebad23d6519d4c37d0f67390012ff4fddff83b27cc19a0702faf78eb04bf2cc37b5b8ae04c2dc7043a07be45b9d6fc51fd6e87a596b9d574569b5645e2ca62cea61b902e9718473796bdbbf9af5ebb2127b189af0c7eddf8b7863c9d662bffad4048c0d402f788667ed89c49df23eb970a6a8badc60f8556d98417a170f56f4c79adf70d56173a186e92fda810b9178335ba9c35de821ce480260db99e7a95eb285acac2b9fcdb0df38e509572f79ad26f6f1406ed52897a10b380514162a3758c534d1014d626b6601f62a09e05a465babf67cc40f40a53eb129beb96a6c7425a63c123e3039100803bb4311e26fa10c57ffe393ec73521b900c71901990101b1e020d11d164459aa50b37bac294e420f6e8c10481032093554f9d886a839deaaf152aeb04b39588a1c8557ac0d24e2231fd7714426af7d914cdcc853a863c2fad4dae5ad4cca5dde7ef6bd0d295563c6561b75ab92deaa1e854be72085a8e83489fd8970d615293fdb10804c76ae2aef8cf1838f179cece0bb4cec7be6463791ec176864d040e3da5bee5a809e88c2a5bc20222a80f3b9d621f0ec4eb612f749a90416bbcb383e3992588cb052733345c07ea046c41beea34e5dc01aa2600b34bb080616926deef79209df0e8b25292673d3cf381e338d8cf13f05620f64015df347669df53b6a9691fd65f156f1148e7fedb63a9d0052d8d354c62fd755f078aed8e9bef45a7dfe5d398544486aeca5fb9a2b9dd142b7f95e9529b1e5983cc708c8e31ffefcd7a968523fc5c1d48d6409fc8821d3e032e190a133c1be3843df4e33afe8580c2161c578f708dc7900677bfecfaa943e1a82b53d3e8c71ddf71603eeb7da882a0aca5f12376dc589e23b746bf7400ccb8ab64ac2818bf9d7e79bb686775d0cbf65d5e9f21c4a9855c0760329cde4865b69b4c654a5646595a9f5e05ec7a43ec48c08812e1f448d02a9d210f9d280794801689dc118f5413e22f9d5d453835f8d4c23a932534ba99accf6d1dc8fcc85d3ef77fe872548ebff46416bddf47c58ee9067e38a125696de21b2d01be1b71711c4a2b99db9ab380e1c6009927b499fb9b217018edf70bc292943074b80d1324fd7bdbee6d9e50572a531adc9db9848efb65e195bc9e6434daa24d0097948ab7682d931027663114240f53e620f08707d4ef6ae016cd125441e1963ceed056ea9e851082a159ee8cd59b8bc89c594e778821c6554f6a87269c5eaa99620b9788b075c6acbaa2d6811676157945d97decfa8eecc83da50555f7d3ce9de12de30a1b6089fb6de334ab80e0b19e8874f709b55cf8a709c1c6c2e8a8e0dab753d3ba978279daa90700bbf54e394230a4ae4e985f263b0549c7985d018ec00c02a6af81b2b8cabb35fe484f89174b8f2c482cb10f4308ae4ea354e3512cdd9c70115c77b1016f1422158ab9cfdcce479e11f476d28cc9c2653fa1d73d8e18da3e0b04685a9d4ca015eeb2ceab0482ed57bc2a99d1202fa8e819d5f31db5be2c0777514ff982cd663264d0ed7e36cad0ac7305c3b5b906f1e68a31096306e6842936079857e4725469a34aa78789f69d0ef88c5432c6a9c9065a352429d1976108aff0b6463c8c8a85e088aeab34192ba9bae12324e7373a080c86ed7278cea0ac20662b8f3622e40245b9e8138660b4cc90c23e9e9ef27d3c44fefc60e1197092e0e2ab1196cf2d6d768ee4a373ba7c36b71d9dc7f19bb5d19476f37e813e647f16d0d9020e554b65675368d993bccdcc985df1f015b051a27de89e30b744fc13b8142e0ed8987f077d9d031b92e9847fa3e2f375f81cf3e54981b3fc60996b0ba4888e970109fe6c5a8b9bb67548e649349dc46840a5a13574ec08d8cf3b918cf2b2bd0f266ad7680da98e7422520f2d7d420bbfccbd06095886504aecedeed385ddd265ece151c4c110746872d8a7669b5e926f0f4b347331c60ba136c71ca9061b26599194bc51fe2870862c088ed43421d95195c673eb6fea3e5f0cbb7b99cf85e0e124ebd0f12ba531114ac693c0ece818447374a97dccf0c4def7cbcb5b30f751a0343136c41001c9f5770764b10c13a4d7953478f19fccb7bf79d665d60413bb44cb846f7ac19d51597f019d0bce1c641df4331e32956bb3da477028da0cabc35737fc9a7e15c056ece088841013a13771c0fe6b3d2cd0461c22724a04f9e3689436cfff06c1fec3c8a0d769b6ea65cf4327766fa742c9dc862ec8ec7a853d48e6a5739bf9591ba14f137be47d1e3ec43fc127224856d386ed5eb3fac47c845029da1b0b2ef7ec0ca36063d998da3760a8ac2342ec4a44b223055fdd6f93b0c52645afafa0e924089342408c4c05cad469fcb4ccd39f975a74f2540bcb746cbc9cab000b590da84cf879c87b8444fe50add3bd46b77774d949d055dd23cff55d6bcdb55c0f5b9eb5651feab019100eece720e15b09108f4403a27604d63047609e46e7dfc9bb26fe6c3f0cba38e048fcdd255c5102b9bfe19d54a6e2fd050ca9d50b4bcb7ffef5871690da0838baaa93cbca7963318f1529a54d7b149b3235707480aaec154aff57a20b9be817136d78f41782a2d3d514a3ae732dcf381c1b84003a9e2ef6347d854dff4142c7c3afd545cf57442c1a7c314c67cf0aa46a4cc765a8d8408ffe4f5e75876258b52e6d564d1481a7ebc031e902adf539d0b4eab1240086065a9d3d058e505b53d8f0260b0edc6bf62ed73fbf2c404f4daf119cee635a1883c7956609af556812ee75c372e53efc836f5f0c7c361ccce7020ac7219c68b58bd6412f70fd6e23ce95119530a8c114e3afd67dda7df57e4dc725bffaa2f75b41c2cc0d49aeb70f347ee76387412a67749940baa2d21a882f2e957e181231a1d1b76a2e2310e6a29bd6d34e9d102e84229c15b8f9e56207608cdb16ee9a94fbbc06103b02b6bb4e7299e48682276dbffd759ceaafad56a4a3b76f500a30313116eb1162939d7e1626ae38175aee74162e4ce57e4e55b89d7a910a9f819a52e407087ed9d6b7867ca2cfe5727847cc1c566962eb3b06548bf9ed7732ae74f49ba106396740baaf7e87cb84c5a600c100f77da17054681178e1777c14904d1c850dda2b146e880baa57abead63263d7f63261eb11311ad287f5e37a57ede313aa82f97236f942ddb3821b9ca0b7353ec3359b0bb3613f397395d7062897c34e030a336dbf1a75787ee906915d093fcf846c6de784c81a9b9dc9426249bec062683bcdf039612d928f266d01354cc4830c5a44a96e101e7401ef8944de86a3355dc8ff4ded5b66773c200803a94a25eb34c43872088b33c3b762431727ea3d4fd370a8f7442badfcf0e66760e9bcc2354056b5493bb15bc16cbc174dab919089d53f1785cc20d5b0b9963e14caec08d384609eef91172508da6d5338d005e095155296c5981ce746ebce9ed0731f77899589b98461426c5504feaac908b2f890ba36f325c0b571b547dda63c1e81c9f0310d62432f4d376abff10e4c2caa7ab795ebe5a3add97a8cee61f8ac91eb1dcd1af4ec384732409f32e8344c0f33e87a9019755a9bf035b7e7b3f5e58c5efc9829c384e374a7e504f32017107c1c6ee4e65ddacb742e4368a45b04dc31ced1900825d0af7848f5bb9dcbf5739fbd8c7a493d0d3c4068c18711b12981f6592064be2cb259ac5b54c9afb1353bd901c169d15d8d240a5af7a1248691d888444d58c6a48f6b4e626a55165cfbe147cc1a0d5dbf4525736e8e4eedd576ccfcbc6ea1f44f63f58046695cbb2b8b4d1e64bd702e816fdf18b91b58bba5657789d5e074649d99365c13f9039d8bb630b190eb2e3e934d01417656ab77ab077465b6a28871f73004cd26924ca954367e0d369faf99424e7299a76737875bf617011f0070420dde699b38c34cb656a57bb980d7f1e7fa378bcaaf1c2c4ec30848b389a6dfbd0ed99b17ff5ddf4c9679471855945181f26b922617555a2a2a7c2e375652e39a7f77bba78525429327401ca0fba5c7aac941ce677a0ca759547c6b606afc5bf7de7cba66c61d1212e78b0466ed0727fcfc0cb74fbcaf6442c4e84de6e605e5b39ec8fb64ce0dcd15fa67b97aecb6a22bf154f168cfb59ea6ee26b0da9ba6005ba23e3fd434336ac6609ee6b27460704c8b3f2ca3d4b0d76d2d02ac77818b0ad9379225da7838102dfee53005dbfd720e4953062eaf44f5ea541f32eb858861c227a832966beab2b457477a83cb5e1ae57d604177a5ff46579d67705c1a8eb6ce47ab42ba074480e42a155960c759b789a9316a7f948142aa092156ff4109baa23b62eaa2bdcbabd7456480d379fb3f2ffe73e0bf0592fe3823303dcf3e22f26af52489fa0755c58fb8b81fc4480d28bab747afa0c41e1f28f8637e84c477926b615689f0be84d17a26772feaad17322bb356e905dde165dd7bf636de18472916c013f0c41d03e3fb83475af4f75ff805f3666f7c4b5059f19cfde5b470262aee344ed42d88306b612bd57826dece576d068fbb3fdfa0ea302879d4cdef37b32683e65644ae7931ec44c36d7c5277a09340dcdb3095dbabb7e3d52170d0a8da6051fbb2e2b3b0c3ba1fe8b44b99855982642f0fcf7360be4e149e90ac83670131809cfa465194323be843fcfa58ade59553c9572d9429ecf0e52983d1c2da8939121fb1f696f356567553214adbec86ca6193a0626788694c6d11655664518930cf69afbf3ae9760380c4f446add21a10a2a9fb6461524653d8aade0860946b6935c993a46b4710da8dfee5b2ed51a71b1a47fc8271d9f7c12299c7aa3379f9a0276adffa43065af4d5f0e69cff337a6beb45315db71cb1942a22f9f2a8a3eb509382663f82ee02a0f21c171596e0375abf7724ad22062611d0126d8dc128fed5b6a0de068f216b5e12ef4b868002d0cbf19826362905584bd9b8d49e88519e6759fdb1bcca6a2e00d2f263b0acbd3a1eff4613bb8b480e31911e0dfea513e73bb70389222182f49f984651188a002ae8bb2ce0adeb89b0b25e3d9162a1aef1bab19227042609d3ce98ccfa693d3da17bb8b05ebdeb79d8e1f774231e2e05b4f6eb4595fcb68527fa0ec9e7bda28012c58cb5a737e2759390f9a72adf6ec903bd43f3f05c5540a9625cd5ab977a1f2eb4474f7a0f7fabeb8178b773c04efb30c4b06387ba075a9147af9579c606e1c1e681681a300f3ef6b671a42d890a7a8269ab32537523354fdcacc36fe7b6b6b7a7551d613d7839f5f31fd4cd9d836b989a20d558d22bb36f35adc78a47fd9cdcb5e520b7d2f7c33bf49acfb4a9e1a42644e74523ebfb70c74157780df24324272a3250e91a726d6ce4ba8f1ab9f6d10850f3e86ff10388b9303a2ab4fb724b8dcdc722fa909e6be5608aead85778ea8ec7956a36364e6cbe321197c14112c0589a3901600e72baa6ab7a08baf3edf9492fbda71e29ac603c9cd214abe2eab342841b23f0a8721affaf9aff2b1f58f1df28b2d73782d2702284aebc8dee3a88264196df3040a996a6c010cba141fda028011bb469425d3fafa10f60c0b2ac264d05605b0edde106cd5ccb639cc47b3ff703684aff11b872d414affd0a85a1120b31c59130c578a3809deb15aafb64bd10c010e976d276e8a8e37e3ff2c656b46a1fbda8cebf5af300fd27612d4f53e2594aa16ec5d887333d81ba1b8d45b9c6cdfd827bf477ec62df935f0174a863a1cd2f5ccec30e28f5cdb1f9c9548f18592de0732f00b7d60b78802e5b0c053483deee745dc6b8e186ca1091360b6cf96d3bd817879950f0aef7f280bb2ebc57f9b4d0e0c494a7292b5ad27f1074944d6c9e2ae44c303a3b8f41b51af4372fb6c357032488e9cecb06efe9b70b00b31235d331d63eda942b9400dba12965ecb93821281aaf35e90541dd3e411db005c5a106aa8ce1745a022e5bf5733b598dc2f4c7e5117bf1126e8d2d5fd8b938f86e8898ea3089b5020dcdc0b638677de5f9504908dcdde7f6795492634356ac599c9e7142e32c1893a4ab3a00f3f6f2cab88fb85b6aa02ee4dc7548914e1768a5801b6c9400ccf469069c2f5550d08dc7c8dd4e9e509af70d6577942f68f9e86c10744657f034fd07e7a929a4a9809007d5566afcf11122f506539ee4d0822c6705c328a48ccb16adf4c8531044231d8c3dd1c4bcc50e20a064af4efc709690aef1e570d363cde195c12d36101cae724667e20b3c3570b03d91134b090e083129b9815455d8e4046f39b1481dd290e5084feb7a4ed5499fe7af46e196b2a883dcca20c43c8119b8588ff223ec1c3e99d6667583cf09da9959830bdbd23a6149d0028606bd17b4ba6718502bb49b5e419ae42c2af83774b9cab987c9caf252734b14a4d51e1356903e0727a8abe67b9b9aca92bc10e1712926fa0da96b0aede2f1fa22eda345505657e669492a4ae8872c0d15712db39fb6f1b21538aae45b163c87de1377cf4f815325ff66c92bb4529ca2b9f0db3ef717753fed43645a39cf1205b8df38445742a45111d3b2fbdf16215b4a799628ce7d717a882f49af63afe69b19685a8dabed85aad82d18f4292ec0b98c220b8d380dc84b93d539b6aa022345011e171a44170543d2c4a4a030c5215d84cc966e2016321f56406cc0fc7363323160ca5277c04465706f784ebc9a78730a6cc9823a9b6cacf4accbe1c11dce0c871abeb45cb61aaeea44a5dbe68d93553fa03cac0353f59e7076d5458e2f711ec59c8108b2981129ca56aa210e5eba45bfe622f5bc26d7a99df324588563708b8c19b3769eeb1a98513a0aaa7fc132193753e8b759dcd32dda8ca1fe2464b7f85f077fc2724678b8403abfe33c1334be51430c403465596d02e989545a4f631e41a982ca0bd4edb3015fb2a517384bd96aa4836d5681ac8c0afe75a43b40997249078213a538ee214b748742255b47793f3041b8e28555b2b134b86f2ec8a8e9dab3cffaecf50e2feb1cc259467ba7238f6ca69b9fae9864042525da858010f3edcd86f9833d855245455ddd8965f1be4f41b71ce2f0ad5e678592589ce65c76df27f63daa62700379c7514b4553bf04b425ff50fba150cdc07cc7afdc4d8132f154bf20e83456c2f6ebc1295e3bc83e3326092fd945051a0863f8c97352d9cb6bb7c788bbae282cd849b703609e1fcbaa6cf7b05bdec504128092b1ac13064001664b12eac896212230e7efea7dd1b15770d911c90fd5bc98ec23b8db28b8a1e325d5dddc8e0cf9b4e1b3ef2e22378f6df9d1f3f0f16035ecbbd83f929ae75201005762b7febf4973736a8782a3d6e586f44c875260932ee65fd3480a1e04f13b01dd419e9da5635185d1529337d58bc97f0540b3082e807612c027b9ef41e1e774bc409943d66abb966621c4535d42619bff11a364d3e6c02013d075b8c2e3ee546204227a3768bafebcbb3d196fb44da9fda64c53d0088167cbb7fdb30dd138afb812d218430f386d8859447c6f6eeb2470139b4326b31d66bd49fbf7ab3d63c5e61bbcacfdf6e03fa26aae699bf9bee06ce7a824eff7c8a80450286abfccdc9e54e000ccd9bb878286f454ca907413937569308689a541718078a2a0f899dcd2da7e69c27a4641c016a082d6ccdee9226aad0974259d207e20fc30553c1b0eb3d31a1ecc9d0afb83c4690d24cbd641b1aca44ec5a836f5f1e0688e57c015a7784730f63660f4eafa832c29d435466828a6f192fb0b94f34bb980e347ad7ec26245e974e875057c226c7ce7737571f7bb2d46a694f12c555cb7c552f371beb666d8b419832d11c9f8261d9de261639c8affdea3467e360eb01c849d86a35fdc98a4cab963df26d8a55ef476ec4f50452d14ec20640a5e1c5cb67147ca32ed8d6ce627b7fde0afd6137ee601aa4e96ba4be7578183d04b075569bf2bcca4e45babda2aad519aac039fc09e68705950d2361421f6c5ae18d1ed3abdbb566d98b7399fb1988edb137b86d3e5ef4c50c2896a62bd4faa4bd58f0596ce23bcb9cd28d880a9da1805d2172f7994ec6257edf40bb82a110cead3f036514255ec9653f2e4b94d890a830d40f2fd678044bd509a40d8e6cee8daed5f50d8a27d4baf097cb84a122f6840a303b01ae5916d54de53482bd6399a8e4e70057b1546c1d0db534be522cefc32910c0456ff300a6443b9a5e1d9935f5e26f790f5e0a4d33dba63b0595279572b52babe388a2112200efe74139e90ba94695fbdee610556174ad4c34a3ce36688b738fa9d7590043fd519ffafda8d6a03cf7253382035fe43490adb65a27090ca3f0ed02f2d7d9738ab1cd0c2e259a7a3b5a0080cc479560673e3ecb3707e1677dfb8ff0863c61cd6d9181652deedb16c7e2a544f7daec55e48ab1a44755f516df4abf64da053c3ab731e289786af4414b6da340c5c4cafa55a41aa3f3a98c9228c662bcc733e30744cf849e85b5883a89dd4f8f0551f7f8980f3ce323d97a1cde70601b2742db7bccefff20fba31382d37994754a2818f44a4bb2de0d27080f20122669df3cc3cbc90c4d69fe451436c72aa402a3e0358e0670a4a90d087c84b6e5fd030f16c53f3c48a645393e7429a3c18ce9c41e5ae49a8d72c9caf9986b2ba916c79de7bb31d24ce9c0786f1ee19fc2ff0cc208bfba44557d0292c15dd48f9ebb0c5238e9c3f79433fdc24427c8097d788bbe39e4c11e42edc9a4c6069fefabee93a9ebe272c016826b9321f198c22c297c3739dc8a9ea669c2d0f1e295109f159e2211ed0b51d4a1e397bc430f10f76e8cb35e1bd2ca2c0c7d40ffca0883888cac6bde52039569e5cb294e245d449b780a5194b6f2ef1be0f031a1e898de7f8569d5424364a8c243386aa840cf241afd98ffab159a462c27bc3580b68ce1577690e32a2bcb710d2988c09fba816066d21dda80235809a71fd8f7e09514378d28c31ab4372b4cd5eebbfc35fc9438048dcc7a2e5246e5b96d9ea4ee1080f1448b392eeba4b78f87560ba7ef7a45db783f5b7707a27f338e9d4f8bee66c679cf8de87234bcf855a7c96c006d4cf03d41aedd08f73b11014f37f855aa42650ec3c837617115b6e517c96761afaff0d5e656ff04a8d7078abf2036dcf28006298a9fa79a4d507708403ecc29339ed8c6ad733d3e99c84ae43f15b78fb19fa90b86c45f6bde6fb5e665e5be013c9c957992722e40d32d5f22f51bf521d7ecd1f9ed8081193e52b5d9ed627b5c3d9ea1033ede0c27530876c2ae5d238a31a097a380dbd5a702aa510c8a09270ac5c14aad79c1026706dbc08b82746299f236ce0576719d61c6db948c39444b328aea424f66880625f1569d668c4d0afa99f9ee75cc0a00c470431fd48c8b00c73906b26508e75e1536f6c0d47951b2bc3482ff38e314a994a6d1514d1518f9361b1eeb65f62a7fd732d120749e47bf21fde9810e390436c25d9174fd005aa6bf3b71613474e074d6c7b7fc6f8eb28b8c7e03d4a178c1ce4bf0ae5493eb2f64b3d412394450e28c4f28c1bd7bd900546e9f545076a014231ac3bb38466725bd7fcc4540b11a459c778e682030994a3f0ed9cb8ee06e34c643a0d219d233625f0538722724e70caf9a042791f1d68b251799467c6691792b18ed169e00d6e2d41c1a7d14d93671bc60ba5cc5cbfd91d6386b1360764e312554b282a3081f65331ab24ba30848e146bc379570d667be3531d7ea3a512e666c5fe66f1c920b441507aba75253aa9a113f72adbf1f74aac49dd8b357ccc5beecb3c1209a1e33cca3fbb34b092983644343dd93da02df194fc6524ee1bc76f5be5800f317dd9556abae917e3a7d457927e09b69c02fc157510175c75fe6253dbb170dd5642f5e7f65dd76ef7359f97d39bfae2c29f69df5ca1988310bdb3458fc23359107cdf92afe6ce3a1062173e0e6db87b36c70e0ffa05e5c8347aa03fae599c372c402083543d671baef9053f2544ee4fed5c6b062ca235e7360539473060ba5a14d717099a936c0a472226e76a38adcadc91b015e469b25c6427f66c2f22dbc9df520ccf7df5e38c51af74f3acf5e1ebd57dad22ed3d66656c837b9f356462a0d09a85eeb75fbd1fbbc3333a1807daa0ea56d0d1e1ef4cc1a29ff0ae750d8412160fe95fe86865c9d849647f1afe6190e54ba5e2713ac78a722bc11ba976cd3da72c2374e2cedc3231dde1c03444c895561e9a080286ec2c005a82841881ffc043a78d33befa9936eff2a85b848e0bf93443993598438588293a77e3e6cae179c108e2a12b49b187868648a73648e87aa804cf0c061d06a0b425b19d0617d34d900120a1ab40c49938ebf7666d92749871f71a6190496c5cc5044ecb893199be4ce0c1458b267a4aefff1d5bbc40d04260baaa7b53c852afe065abb9d170ac0029d927fef697f507c26660e5c50adaf552850486af6529eaa12920eb33489971602356b5fc3dd4f325dff5d760c3a8a1efc54deaf31abda99e96e223da1a9bb69a9fba2ce6f58aa95bfd77458ab0ecbf536fddfeac7a6c62cecefacbd1b475640d1d66aa99cd5686d3864a9dded98724358fe84c6642faad6f16c5c93773fc2e0f3674ac7804d5474b1c7c4dda6b1d4d2d30fad9bb58293a162383a5e82d09f04f751a7bb6aa75dd5f11972a58bd76fba46bc0296fd0b14d1bfef1b8da2e1642330b99daffb1ee592c70647004ac863575558db2e34a7ed24fb856d25bebb95d2bd0db5afa3fec44a6c25efd743585ce6edea054f24b181fd1a0f087cbb028ab0b0c1c0a542acc248306110750cacc04f0a47bba0e4bcda9c53c07d286461626d642cd5c7240ba7ab50db1fc7ac909cd19a3e51fb1e8c3d7a7c5e87ff9977d295925336f3197b24a8edf23be3c6f4ca55521112bcbbf1b7438ec27b7eccb85f76fedab6839f50402ac92a27209223d0cbdcbc1eb1b9387a83c6c6b81a70b9a9548cd18aeccab33f2cc8a1aa4d3d10a1973d4ca11de630faf161d5445c8a66672d2f0a66e4234ac5a48f89aa5e8128b323df85a699d20b9954a28008f7f6b84ccbf7adc4cc5a3643b5800ac2d3a3a594dd7b659001cec527a2112ca0aeef79262012c3ba75f40bf029c658d08acf9b6d7ce8994d4f446e4056b758f6640052a3844538770d84c9f125877313f4dae0d2222448f7eae4c4304510ae94545d188b94280f70fb9b14cf32a892401106b80a17fb1d37a89d6a4d77f0f70379394203e41b5abccfe6829cb66ee2127652d08ca88bd0ab836cd385dc0623703472242cb6c1a647f5ff7caf4a06673df93811e81a1d9574ca5092feef56d21b1b715f68951147bda370a65e4444475be6b6ef63db522c9b7ce435a326133c24fcf4ed5a3e1d3d9e88905d101a58f5fdbf98f113e0f43d82efd65485d7bf1e92c06aba9fd26254f367c8e956f219091da42c73498a1718c4c6914881e0004d208c73934876150e535845ec64b2dcd292acfc45512194fe9e0e0a4247402db336bf6a03812ee2b929e4583a1b7b765bbe0ce4faced919c957a8b5b1e91901e0ccf939c985e50af95525c5205bb83fbb124726054a6e684b86b6ec5002209b27ce337e5f4fae75402168f719b6b51e5f480a98900e0ea51e0331163a9ec0015126c217a6575c522b3b14eec642572e249790c539bc7ba2ef9d6358ad6baab2d02dd7f351e17f138b72644d3177053782e7e8c5d955cb6755c93cdaac5a8083e0b832c2bcafd932a96c8f2fb100de0e51f3e5284e1bd56ffd0a58b7f6a5988e407368a73fc01a13bdd081501d7b1cc775dc829dca0a15d037bf4c4019d0cd312c36a2f1dc4a1777b865b65cd0ab407530100c9144ffa44d4bace352c5d5c631f501cc363515bd621efd9d8718a81656f52416a19bdee5a2a5e3911f4511495aa3f22742167f00b302034aa3932c8bc1b86444a81791fdaf93abeef1709e1fac3612471c893b29d0e681a750bbdd49e9513bdd1dd4d216a90d6373500cba78c1d5300e74b328406b1eab68c8fd86e4f4ba335917b71da8e28a08aa7b035ebdf843694113f5b7bc487d6f8461828892cf4987166451ff6de02b2fed1dbef7e86a037abd35dbf064bf64a77a57676029750404563a281f583e6e67ced191a5789ce7c611de493d421fc5ece3f610aff3e92ecd53a9817469277fdaf0acf005597a46b782ca55d5d1be76a0cbcaa4ad348ebe5d2c074d04cafb26ce229e66d3cbef17a677313de2503f59fed0c3c3f60c85a154a8653c63b98b52bce24e0b56a4a2f93e71d685b8570b15359a23e958b567fd754ad8b265da0f88eb06e52a7e358ec09292d6b483c6e10308e90b53344cf781a6261bfc2755050d38dcc1c79958184ce41d5292e6f584a613caaf1e6585f330b42700dbbf26736e99a445899edcd33137d6ebbcf72054f3b040b6ba579cd52b45a5bf91f6eabaf180803606e502078e7f4b6a51708e1192303c09cc8d872efa97c17b21723cd5764b26fd6510d57a0a7cc7d86b6b82aa23ad742f666557ca1277d21befe911e10396de47db8e39905a36a51971d2147d4348b30f8c9ade74521167a1e43ccca56b6468230238ef09da30e34cbfbb0c95c350abb3b57e171e712ce050c6a6c6c6733b2e7a78eef6e4149ae7b1baa8d396830b36953f73ab420a5e0b04c064249b0ebc6aa9aa5ab01c00aa2d5cf74d59a41e71444edf3b36a0d23ea19f388542a793b42564e6ef3381263ddae08a636fbb768fd11da2dd19ee8e885476d22de01772154cf9b060b608a91b0ca73361d68cbdfdb314e810c2172c9127f935b444ba4625e9e9ddd7a89227f8698544b03ae70e0481cda59f46cce2d2ff6a359e3963091ca79551c2d6d4f315d77cd203d46e57aa641e31e91c1dac070e589ef77bf094031b528061c425a87c6875dabb0225d126c3719b9a35cf1be1b3a0c5d7ed1f9152fb8580395b4a52fe660c38d2c61eb18ac0a03484a65c711cab46a271c965fc87c996e5e16348e80d423bb2b8823ab954cfeee1c44cdd01c84ca3e4705508af0ebfe3c0285d08f82a6414291fb21287ecbbd8a9152eb75f04a59a07f23269182f5e90a306fa0f44feb9cbdfdaf92eb6d90e730b2e6fb49b8199f61959e4989df35456feb31a732988663f4328b53eee5c99869c6ce4ab69af4d2fe47169ff07a7de3502b600a064b209d65bbf986a526640f948c4f4ad462be9294bdec90476660079e4b52a7c2ffc4fdceeff1b9d4aa12887be89896d9ca46b5468502418c63034ff222f122021adea3269b4cf08003fa3141c434e940fb1ee8ea2ea69f942a4538baca3f75171888af3bc5696df9710061f5ceacef7251746046c4304b6e92cef19c6e2517c5061fcb9142c4a6dc288ee730739b9d4ec31983bc84a4e0203617e7e2db003d131dca7dfd8f59537638a0d1d600df866f8a7af827c41aa453c48e6d0e33da75c69ebd4a05ca84811716f3a59ae976d880ee5ff38e98361532f06143ccdcdd7efe17160a574885830da67a6e77732bcedd9331f97c70969a8c01348fc9936030564a64ffed72af7bb3e6f9ee006909ef98d3fdb7ca0601711614ac35f0ae6d3a648ce1d118714a87557090984575e599aafbbb430be565ce747c9ba440dde9ec52c8b7ea8cf87090df00c1ad7b0e7e4db2a8fbc1d0a1665d5701f42477916a0743f4916226955cef0eb0b2f1d574a2821ce920e3a0010a3ee8cbeb9d0cc47f09c06fb2593fe957831c384b5406644a27fa560c09d6f12d3580e3f7b22eab085b80e704bf5a49f843c060c3d0d81c5e8240735307455a54a57642e18e98a450404c7a77e335741eee359d398274b141b7f2e7bfa7eb609194c58e341183d4b257eb2e4969d7c356b7caed6f08f0aa56171eae012678a900ddb7a769b1cc2f4aeb6a8fb1ca18c37c5601ff0182edd29fb570abf2b00d9be0041ace92c9562aa0dce70ad86857dcc701e0433053a87b100d5658e3e34e1fbca0627755330f019b6c9f02090660a50e24e3e68a522f79435ded827228dddaa500edd4fc9ff848cd905ad57e3e2f2b1cec1c511fd7cfa366b682ff1989382ec26eab72f95ee70f9a01deb92bde46f887175ca7dcfa7d1d82cc799464b34e94263942b12fa64eb41519f18ed378c5e5b94b80e20692e10f4aa83bd2b35eb6c712370b00d3dbc71423317728a07a7acc2eb0b911a307e33cfe55624a170bdde80eccc7eee2a648cbf8b78d787a1625404c66c18a4904b115cbe233c486c80baa0c17115c3b450ed8be75e2f5d7226fc9a8a18cc16a2a4a2261ee0dd024ea4bca453b2922c57bf657379d0f531328ab8b367f8f197d7e9d7452204bdd70c46b24f9f920b7d20be6364c6d70f9c689e825c080891c24365e44b03bea24b6adddc90999f1908efc8cb2c755492ba1008b2b4aa0523995156371b11c597f21aa9688090d604935181d82bc66f329c515b874060cd5dd7ec0e9c685d58d5b6a3e37b7d6e5090c538ffb1185a74d926c7cb14ab1794bc93d9a439ea522db598bde96b322202f1edd6ab1d0b130588f54c180bc6d4fcd3a682311fa8c520e2356b200498c5c31aea0501a5c01f9a4aa40afa4b7f3f6c6d385758a64b26e428d8d117c07caa511127f9bd4f22f198bc46d242a08f7abeba7d197d8db573dc22542424c358e843db44f79a284477d869e78f853a621796141ff0b780e88fdfb679dc4b873cbe0a484d62ca135e3faa535c0185c9c08f65413c445e9171f0967a8a83272056793d81a891f786506dfe1e9d229b922c5aaad948abe267d74183a510c746871ae142d725db0b8bf1d45b09198e78a6b364bb97ddab2cfd49dad03ed906994a7a407548198f879fb4ae045da9bcd79a493f46adeffc801b60f345bea921376f8ec29490b7a2af94cac4674b622be6996ce27dd9432bbe85809cbd6f9ad23cfaba7501fcef1091ef3669176c365360f4fc9d1a015269236207f88ad3661041a72d7980cd3d3fac5b37229bf2734523283e28b89ba4a55984218b313ea75c20fb3421547fecb7ef7f96629a13edbb9d55d755ff8e6a46815f7d92205d6a94f740b30d836f52a15baf529af1f72d9b03a5593ae045b00d0edc179732bd60ba3dfea40eefb0612a19cdfca72405f4a15cdfdcd190b6517ae6abee7abf0ea2111548f52f17c310728b12069b318e065d8e3fd537307934cae9bccbed9b0b4fe0d969a0c25a9a4c9eec13f9d3b61f5a205ed8f2e667a710f4d8f10a8e40048cfd6ce65330a2307282c2b18ef3d51f6f9c7c7659e9a217aeab97c1721871b801e8f971a4e15330bfe6da5a1ef0419540e73d0bc95dd8d581e8785ddf0b50ebe9f410337c0baacb4d85ede9b0b4033abd1605c2c841bf2248ee154c405677e57a7a5bba810777885a1d148ae3f03a7d64c304d681f34b5a48c81f829e326840c5ba465b86d82ff99dc35362e5c22db9940690cb327a071ae2293c6a2945522f09c67a4c1cda4543fabb3256f9f9e2babe76d8edf46cd346319c80b821cb1f282f27c25d9bfd8d1eabd3ac2d8abfb4b621f34f32e0a86ee194984e25b1ac185d448386fef7a036cf7d58eb3cefbbdc0e0acb38bc8f35e314fb2e2b4ce62cb89d8994c4617d83ce215f6f62622b505af3530a72bc5fb243a9e1af40ebec3a2b7ba22c583d5b46c8921260f87857397b889c6df1ccca7ce90588d899fb83285231ea417bbc8d57fe18ae1ccf09c7d766c2a614f6fb2a90fdc8fd931c095419f756ae5bdc3146b9e612d4a9de6ad56b33d813cc2d10b51bd35df39d6caac81a879d30feffa6ca5262c6aae0cdd23df707c48d4d866ee9309281051b3583dbe655f1f30884a18106740a513fa81894049c1e327eecaf8eda4365acf6d328f40f53e818cffd0e712bf40eb5ea325149aae4d8522a0d3beea61221580333ae0f2243798708a85ab0be2ad052d8656e512e2479d16e081ba3caca4cacdbf5b1a008eefadc8306079c06189340a8f2afa25db0245a2247b3f42922a49f4870efa920d6c3bcc7b40dd40f661fe994f3828e3bc79cff397ec1ce3620d9f15cafb47cb20ab34b592dca37f68483811ff96c479ab55d40711e33de1a441f080f5da745da545199fc5864efb5e3b01728844029f0e1a33abf3b1a137caf01e823f0e2a0caf76563e0c29ae9181e9e7e2bdea7cdfc6f249ba810b93fa7f21b40e870ad61a4ce2f9250e02983eb0fc689ad4ff23fed5136ba0a08c8099e5812b0f414cacdb9ab88ab83c02d99d78b6de08de6691b52f3f53e31923fa0256f484200abb62e4c219f165afd9e855a17018b39efd295a42da5a4803ba2db5cd6ca1f735ab38864e738424b3125ca7a1246d749a57cdc591da39cdf5e76535c81c825f6732555f94118b69cd465438513d826946824b5919b40b0ca38d090702e3f97c04f53cde4ed8d2b65a73585d97bb2acf09e604211373e0684327b310717e4e0867e8b4b04377a0817bb3b406da4358bf46cce6e067c2979e22203259edd198b99713bcaf2e91b91926d60d2743c809c320aaee28c7473e14191f078cc4792469d9507a7b233253df34e140ba2f00682bd367014aeb3aaed9f579ad478f5cf1d0bcc56042cccb7f05e5ae102ad1b5a112dbeedac25d7990ff144dca705617f39610ecdc0deee596388e09343673fe8376dc9b13a3f3e08cbccc6c65813d5aef6b1f168d222a92dd9de41c9b79bfdfe97278ec59c510e70811790f5ebf70bf39da4e06362ccab28c25e5cdc4f7803df1f7ec5cd18c9f6361bf1188a9818c359407c1c168a4a976f87e83dd1a0728a7462faa9d978d315b602fab3d8d6f0376abfea10d3b04b5ea9ddbf0723708c6f71bef337aff4fd216d385679674d450288986e1496349fb4e2912402c6926c2ad64deb2860685467006fe5166e3a7cc4ab07b64dd87453742a8725c4642a6da9ddb695706e9bd17dcaee7cf1672c7f53480c968277081db18a8408c1bd0f0e77a89e6466ea15fc622cfae8803592b172174f80723a0bbb6bea91c3d4ce235595db86c22087c17cefbfe98cefbbe0bd7128e7e8680c9509d351f98125e8f29649b9f7fff1380626f547c2be4fdd4a112d1c5c77183fccab02f3fbba584443fd38a6b9ddec655ff199440e5b5c264080a0280c05885f47c005b6e12e7993b8663bb7ad96fd702181f7387758b89fc373e1bd09b33f5ddfdaddf4eb74ccc883d46b7f025d1e0b12b0c70acc6249ff5927db448d599af64dd80cb97e352821e9d764b0e63a352277d7f314fb108f1f20bb8057ed09bc54dcbef6f9d2a24348a646ebb089dbd3794b6d70d70322e175dd8dda9e4541f2c7bf45db834943c3d183ed3a8cbcbc9693c502b2b9adf6504c91938e06a128ffb8a20eac97e19c4e13e4990ae55a337e16e3f45524a42296463e196f116e476f28c1bc6909cc1686e49e408c97ebde69a095e7538e576583fd9b9ba2f39756efb0514466273b00df3f565c59e3e489d999018d30e79f3b5deb2c46280ed61050d4067f7ee414e398a722a6ce0c74ece563db3ff18f2e04038377a76ac028e04f5c2f6254dbcb758e0ac8cc00527b2afda7ad49560ed11b185fce5cfa264af0093ef62d4e7ccccfef27c83fecbde52131ac1a234bf25d841600b61181d9cf827f9808624f0e6780f14d8b9fb264325089c6f37f904291c97ac367d50a3cfacf016b947a44c0619e7c16787b3d274985fbf71fc151a6ebcc0ed6497922c2732a20a373d18dc98316c5e9cc819907c2cc97c806468b0c2f61104a73623477885d4d481c1bc84a12c1230bff69fb5ae602f30cdfed5b4045c96e2836916f2991035d2f0c61c9f3187fd0239ca903b824982e0846e7e18dc42ca11ae91004f59504518f85f12988dc31cee1a4d281f8acf8cbe864b064c6885d79eb9c9071a411f70eef02df3e6c3aaf1049aa345cc8f2301940b12a9f3f454e8a165ffd1527dc28ac4667307e65865d83dcc7087d3360304faf53084933c3f8a4dd408d3053def4813c7b68d0c44732f174743421231223bd965409d4f427cdea8212fd24fb84c0028135872f99ee0f046a488772bd247048d74b8470808c1c53211519d5ff24b0ecc1e6e919bdbf2531bcd739a30ee990318ec5781fdb8632320cdaed72567db064c8105476a0a1a4c6e7c8d40e0aaa980a47fb445c8564177af569562352a8cf1dc8762dfd5302cc0225f5ff6c5ab79090b655d8c5516e6cb7892701809e357cadb8a29bf1864819847307a36f1d87c7cd3adc71fa58869887a608dfdfb70164004b1c3c45507071d6d2728bf09c5273bd80b7d318bbeb0a2aee5e7b4829eca8c9e8cc8d6e5826e0a22afcb342a079a7047cd370769a7da5d44525537a6b5144108a7107edad0fe04a101f69aa49094b227611c6bf00711ed702ca1be09e27d54141e055383430ad0934d4a1aa0d77db051c099564a2e11a62ae0f3d57b1052886fb684b77375745b632ed29be33e7b62d936a0e0c6f7d53645b0658a5bf62b9414567e5e613279c7f79eaaaff070edd2409ebe03920081e055147a71b7fe52b05f79ca986704d0bf3b50d345275641368cc8e844984b27562b1e2e92e59632bb9ecba5b6990efc913082165427eacb899cd82725fd68ae13fa20caa1648404d7e97bd7709db889418fd660eaaa2e7232a713daa8e92035d8e88640467c05883e19e88b1e7bc90c73fb044baa584a1364fb811843215c224802f0999510feb20fe1baf12f2a62cf4ebd57d2ced2191000d93f6bcc6aacea6008ed6041781b48909186188100d65b40e208c2dca3d2c86b36483b8636393b19b6a5ea1343c1925c08beff82df568890fc561d94eabc0453f33c4bf87a0cf3d66cdc250079465bcfa5e4bb8f75e02382cee1c2cf747e00af478667030ea46ac578d74009527239d023c37bfcba7a5d54d75881e590f82694266d6c7599a808c68c9ef4f3b23607aa881ed616428720bab80c22d52676e1ee062ee8d5597450c69c83ddf6412650a4b89edbc466353d3d68ba3a858d26a6329eca99b5feb94cf4e36ff87acfacfa7f3ae3df40b4ab6b0fecc846a98ea023a891c5184178387677764605421347385c42ff83c8bf692dcad928d8f4f09bee8dfec1ac2a7066a5c61d1a9254aa35b294e2563f637ef3d4b6950eff90e2c366129f74885e4dbc1c7ac03a1ae323f892467928f51d2d17b43d6c63142eaf3fb317b97aac773e1fa05c9108e2fbec4f32e89ca95a119e3bb04343d7522bc37736f425f6fe2057ee5115d857c1fde002bc5c67ec60ed56cbe58a6fcd40f581f297bcbbbb2cce93990e3b4376b0a817300d185ec2a776c971130a47d088e59b39c04fd7afc577a3f8bc78cf743c48b99316189300d50b4810aa51341de5c1ccedef99029a235c2e40c494610ccda0131350fd35c77b34aa2eef5441f4cf5cd62ff575a777cbec7bcc8264f8110347d91e4da0b698e42427153f568efbc441a38f788ab5823f5f9e22496cf667c1cacb90d7bdf75f030a1b88e7e70f766c8c158c0fb40d7d23275cd19d5b6080937e216181ffc570eb0d1f83eeeb123342a2b6940ecb2263a79996b1e16f371d29eea281f7db8fc9c76e15f35fb9ec59c745a784751d4ab415295023e94a27c1b6677ea62818174284202905bea4f809c20282875be190497b5c535ea2eefc7b42d8e8a406d20f00ae0111b30ba37e0786c11ae2b43924af551ac5bf64fd3cbc8424a9f4aa0ff734fd4200c003d048a7d0f7c7e1ca63be7d1563e1f650c228a743ab157cbe3df9491ba80c0be65fc06738c933ac5dd226b8c7b3fd544e53468a6e36789d72e308f6e2a4b838f548291f463e621d081fd2641a348e15591af2cc9138ac9a42ab76b91685066db801c26014ab84460290a344786d78166714cd2166cf93f20e8f60a4ac3cf46bc14683426db87a69eb19f4fb070c0ae00a757cdc7b177c41ea2b8a3610a99891408a3323c4acafa6ad3d1ca6acb129986da06e19cb97add4c76b6a14f01a3961ac4841b0d7ce1cf089f5e5d0185bb0fbb8048c22c8ddbe351e2630e286027f5b8e364cfc262133b40af643393aebfcb6d3dbff11e92f311b8e7e2ffe1d38c00daa59f70b4323f5fc865972c221ec0befdf0d08a7498ae3f09cc20db46943b8aca9f21b28e7eb9ec274381e08201039dfde2aabfc10ebeb4282d7079cf5a6e56e013141bf2646df7813fbff886c1135f6c116058da42123605c1938f17a53120f57f340a4ecd6eb12c1652e94df6d125f622ac3d28a5c9223d9b0e1b5a27e00d0a6c6016aa31f7cdf371521f585b079b768253ab6a7aefc4369831a479f997c6bc335d6c91ed6c108393745474b1eb0c7bf6edf671dc5ad5ac40c5d8642134aafbffabef516ea2880d5322b7f9794ff22e6f2df3786da09bb14fb036c63bc4706c736a2f894a2c61163e15e205222255dd5fe55913ff19580ff80c516824be8c043e91d84b8d784aa998b7c0424307b857cc0cdaf804607dd65d59db9706f5722a0d563a7ca4a1d5dff6463c88a7be1a8de5ed69c293a927fbc1a36a7fc2a8e0ee9bf7bb834e0cb39be9d9034b1b2fce97e4a3c5ff88cc627fe908ac623d09974048d8cf28cef442e1f00c7bba98356e482fc8b29224504c426f20f4468e6a4f84f5b921954e640e538423b8dc113c270c8239e4140d10333748f0c505676d08302edea3b20f4372020e9a7e63ae766401f030a96878dc2a61cfba80354fec39698229ff28ee5d6e23eae400ec4d54e9f86434f6a80fa6fce88a622e6d5ea0d0b4eef8efe9923df0f04b4210498be80b8619792d2490e077466a6224ce1072bc8c39cd40e178a558f50557fb8785b7f887a9626f2fbde23851ed4aa3621d5d50746df352ae75491eaa597d2991e847c4fbde576c6011fc042ed4f05689b397828b041719c61673200ad04f09e662fee809b5fa0a388a0b4a8083681f3497ace429bd42dc5fe5b16d397e305907a9416f8ee1a3ba832b7307d09b08ea08f4e6c2965262dfd0b04827c586ffe2bc44d424dec9ccc6e1aa4d94524b30ad01abb54aac11b1592868643b133f622e5450b578e484762ce0494565e500e1225e51a5b19640232058651631b0e740eae09856790aa4db67116e920ada4b2a21ee1b1a42166b42ff3eb131d50c9a4e4e4040baf4026478441eef45158ec434402cca4bb24336418454bc1c6dbdf224cf1490992c82760c23f68d9670f9492773fb0c81f3d9af7c7287f8dbccde25aeae2dca07cc8a7493b3e59008b4067f80cffc6e8e20e364466c6c48b1b9c4b454c97842bfa5db1ec31c96012fba0c9ae46ea1cc3c01f255e62355802f346645e1a576091db650d0f81d2c8a91302a7c57eeaf7da1ddeb951712771970c3e79db2480020efb4d1aee8358291f60877b0415425aa07218829db3a63f1664682340f9d606bb8da7283584fab572d0d671865cd0384e2023b44803cd305d8321356c849f2ce195f97e45380328f8896856a5f7608437c462f4bb654f4af8b7e8a1206ab643e8d112e67bf54972ea04ea4d1f49aa6536a8472b0b8ef7cd71c0b63be0f4b68ed863daa1a1b986306912d0e04185d9afb107b1b6be1be80791eab0f42694ab025e2adf1f0c0c8daa0a9dd6867aa0a605a0907e3d5e712d7ddb92e1ee8d2bd4179b490343010f0c37a3f4f82f6bee81a0d702c5221a974b46103cf5326fc564f245b57c9a06746cea4ef72cdb99ebc3efa62ef718a915d846007747365f1e753f288bc45f6963d7d5d22afb9f07e98a5848c7383fd8b6005a1d6e07444c348511835ca6de25ca22ded8b596789dd7a15058a55750f82636cc1662be4f793a826806b62e01afad793808aa96e2abbf3e072fedbef9e15ab64bed3bf4dd1957aed1d5a2ce450818009714bbf3754cd1ddc5a22268f52f686e614d47db841e7f68f98758620e933880c760adadb8cc037aeadbc48a341937deae9e0286ed502ff241dd85b82c74821e244ccee170573889db36bc92704f41f3e9e0800e166f0fb593c47ca7037afefa985820d23a4a0705cfd5782493f82f01ed07c6bf0f68a8f536c16b7d303934bccd2ba773c013d734404dc4d9bc886637103800ba331be0ddf0673d47fd7b86a774c8783b3cc886f642b2c7303e6bbf2464efbdb7dc5bca94520a0f096e09b709af7d2844ee17f92921e451f96daad0505579fee42ce2161b6f313f55833931d8bee94d59d2ccb22df33efb1c20d792254d908754a1b3840657aadee1e7ffc1f7f77ce1911f10e3fd7ef44ecfe7a8dc060a1a0295d03e5df987a4c03ab5b7a8439ec0820747434822c509960b614059a3a98b2a82e08115f6d4fe85a2f64755e760a5f6cf2455afe626b55a8d93035daeae520e4dd4adae520e453554d55dd2b67438b32d63235938778376bf0994917ba8280deed790a10c84ab4ffce95c8df8e7bf653b15d6c83efbffeeeeee4eba065d2c4644c1f28469b6cf6231a2a8f673585c1066b5acceaa11c740b758f22f8edd2b1f3381253f253fdde3607c96f43057a2625d1ee64a284b7e24f0aa8409e45f9e92c992df9d0ab153813b153689253fa07e6fb9c5d3489909482209259458d6f45554820609aa5282fa4e338b0609cadd818ddb25c65d7f7541361976cd13f7289b0f7b7cd853f76785fc69ba3b6edb4d406808231ad00022cb942dbe60b5d77d21179170341ed79ea1d277ef08576b6c3c2552a90fec9df8341e57d905d1302827bb3917ec7ebb67249c17632743d59ec1eebde3be7086aa3dffa67d31a668a0803d1a8c4834a7c1a86a30fe85c47eb84975c3af5c3db2226b27bf8a7b7a6a154bb84476e7c0a0b1dddf3bc6f84b96b0525175af4429b2b2440a777472e1a249cdc2c550dd2c4c647eea66f122a67217744304ba55fec73508038a7d38db872bcb50339f5573a19a69afc180554d732852b873cfdecb3e2eead13efe3111df2b66f1abd8bbbb3143b75e0fe4334cc9de4112314b88a8abb48449ef5057298999ba6d1774e38476922f75959270a921b3a0f22f96ba4a4986aa77413744b4df7d6968f663250d32b7b6d030564ee9b48f7cae93a3aa9cf6596ed33ef7545443754f3faec118e9a3a8b7952e8d7be41a649447532a2fe775c01e3fbc1f4f4883fc2da05ca3cbdafc1961a299243ac718e38d13206e7ca0ab394b693e02a54196420428554a1562662ab6d58aa01181c64d667375a477e46fa853a5102d0a699f75ff5c68507e1785da482ef66ae8fb24cffa7e7f6d9ee6fdd7c6c66ddebfe6b7c19a3fa2c2f10f0559fdfd93a1c19a8f0dd63c50afb02db772c177e4c73f71a72e68fea90bca9cdde36103ff0d0cbfe77d38bf39478277e40524b173e10be5dff1fdd793f028d49f4effb30bfa0f07857ad4e9f437247c38a837c28f3dea777ca6facec3f19a7783f3b84a942a512e8ee36244c50db56d31d2ede4454a4f1f3dfe53fc6d8bf169fc11baa018e2ebf86deef0b641146ac70effed3a94ffc9bba011fc47f84d725f67428ea72fbb13747cfcd805e9f8af0bc279ad7381adf89cfef4b19570c3e4bcf6b13b61841f61ab79f66c7e8747f3db91f0400ed424cc47cd11bc5483f27370bcd7013dafa741f939bc9f06e5ab3ca006e5e3f04a6850fe0d6f480a2a3428c4c653e2fb9aef5760a17d68fefb70b78dbe4eed2143e577e7dcdb9a98ebb8f38dfa9fb66ddbbaaddb62f0a7f1b641fa9f37341b01f4933c6b0aea67fbd0adebba6d3b5154f71bfbe8de3dfece0b372feb7eebb28b6b9fed62a0e16477828c5d5017f41d5b79175ef227c46577c236d8bd7f27276f9ffcc9b09520ee8b0dce504895afc92ef586074efb42e35f9c3442abd0d86e84a0f16b6297a87541fd63fc1e2cc3300cc37e6b67de4d10b47f622ac89edb9e731acc7e9f3d55835996cde76e7ed0b21aaee0205e58cf967d49968cc51ef2eb515529dc34a1dec395dc40454ae9de31c6e8524a295b4a29a5945246295f4a29a594f2b52e687c19e5ef5284b2add606767accabf928509e2b0ae85a710495ba66ea5af18469dbbaa09adfbaa0133bdfd064bf38d5f86fdbc65d1066f3ed711764f3e1609b734135df435228d2ed956e7e7b5cbb5ffb23aa8abdd605611f4e7f287c3234a87d6c507b89d36fc4fffa3e3d7741a7dfb25985394e89284a25405da51dccb87b47645623db9d00e4996704060c06ac629f91fead5d90fbe4bc399f3dff19e45fe6694d84fb57754131f06fbfe5e0b83b81e639768fbee675ed276f3e90d778d80339c80de9d550ea933c2bf54da11fbf84f6e161034a1ff5cc943e7da06e9f5842efc412ba2668f6e15e098fa86a17e41f0e7f28c8cacf9f0c60f79151b4fbf8d49b0d6a8ff252dc47f793fbc9352535e4aa4540fb967d68efdef6a5fab71732fb6bb20b8a617bef4e88dbfb76413166d96f3d7630a1e15ed1be84212914699f66366a3055a3c6443dc626940ddbeaec20a2fd21773304e59f0d5660db1b867c54dffd4e9a16f454fd4ff8661ab68e47a27bffe51ebdb95791b54bc9843baa64ce0bd51199237bfcd15b1adfc16f1d8a98435ae5ec171af41d73c5a805a85fe815b3b4f8ea05576d2f5c8d31cdef9687acc59398a877fcc139867214551287d102ee126b79a177fcc3fd54356a66687fc6cf953dbe1e2856cfbc192be6c58b53f9b351bfe0abddf8ad2dc3444a2a50633c85d81601f42b5730759586bad4f83d759586a0ac7af44efc9efeedec2103fa75af2fa45d107f8f5e312bfe8f6d8b3cbb131f0153013562a9f1fdebb13cf1352da88351a7c16f30166d33e59faac1f9dafcad81621f72373b64cde30aeafe338b6d3536686c9071541ced81aab6ed6d8bcf1ee3d3546418b8366fd95667ebee96967666c952fa4d34438474762985007d3f0de248ea36c28cd01ceea8fb5aea76475513b39146ab86fba5c67b289932b58aba54b40125cb863f2227bba0f8d725658e2466e3cb5e6183490df7cb081cae9865feab65cbee547b11e3befd3730a5f27e098313fe96727f2be7a02e156c48a9b1863f3efb40fb3acb58eafe4ffb2c156c0cd57d21eeee530a3dd346952b0448fe34b82f3ff01b5cba030d5521277fc70271ff0be7bae48dd66eacfb1d0053f77737269531b34b6b14edaf991aeae8aceffe25fddb87afd49d9ca2cc42a01f72f57108f343992b3388820a6bbf88afbe8a2f986c88a28b285f58bb4c5a75b19c29427de78f5b246871a3490da6a2eabfe9a031a2a1aafabe74b240a2168faa1857364bdfa3fa97d03e4b451927d57f7baa0ba91e7752ce7f434e16f90ddbeacc289b6afcf942acf832ccf5d8ab70cd30853f15b09fdf0cd887c3f367b8aec75e887565cbb44cdefb4e4c8141afc7fe67815c20015dd4f8415822a3c60d6385e589ff03bb96493249253d2bd598168ec8c0434335fec68ff1267694cd01d163238ec2040db9294ad59e9b5cfb75aa0a5ffb9ef6d1b417d23ed86bff030ab75ea3400b84abf6cc44fb0ef42ab2b470a7e83e5c2bc2cd62b51553353255d3b4544d0bbb2f9c93fb68d5b68fa82e8f6e075bb65cc1a5a9cedfb6dd8c28a1825d624da1f16ca0f99a2f525d865daa27a0f9adf1661062d114a1f968de3d14b46aa4b99ec6b341a8955444a464a8061a5aac1b8458cb4283b38506e70395f0a3c1f9db05fda46aa0da6f56d0f91b5369d03f4a048a71a58f7927faa17e6b8e3b13b8437d1ca5c1f9db3af7097be7a10582fd7c56d23ea88fa96c8c05fd48a5acd8c746cb337fbb01e51ef5d8cf8f0d62d94b2f063ef1d0500c1ca5cee7bc1049f4196ee0f0857bdc92a1c1f9a92568c84665ea7c36f2e994aa546f74c2cef9f35f689febe792690a53e77c16da67af405154e7ffe85564cd2f32bd9d3a9384d479a5ce493466ce5f9df919e1a6acb934b655a93ca7073cf0a08c1a5f0ae7f6c21989747777776e2f3a3f29777777e7e6c2dddddbdddd23737177777e775671e1eeeece5c17eeeeceefcecd5eb8bbbb3bb717777777ee2edcdd9ddf9d3b3a1744558c312489b608a15172e5082164a21041e440868b0d9389510269c31cd9262f57d1d212d775556eb55a5d24d7600a1b48249225916fb55a5d62eb4035802d98f0a2d28196b46028ad404bc201126cb65a2d249873cb9962e7b40f92b8499129750021b88c913ac2ed164c6cd104c7e446ed04151fdc888b6dd2b660c2cb36f5dc30b145133d48ba5bad560b49338139b8f8800ac8652211154bb80c171dd41fffd6e62641e4ce638ccc2fd4cc396c91fda577920410359800a2260ae2a451ab65c9e0ffd19d9d3907db5689e261dcb6ee6e3943a1befe8afdf1a394ed1f14439fc0b994d5b677b5bde34fd987ffd6d49a0ad41f9031ba4a45e9757d1faecfcf7515c11e01150015a8691241f0e852da48413f757d613c92f262837481704d5def7f7d8a260c4195ef434353695cba3815874828ebee7724f555f735367fc72e19bd976e161caad490e3b2c839d8361ee84644c3597558db86da6e2e5a6a1428432d6ff22f56aa3869d2647acc12172951940c31186e4ab24284932db364ba2cd59e1e62f8f9eb8296b848891295c421304d49562a11eea40c992e4b46529a492b0903e64a1217311166cad465ea525171291168ecee82f8fbd1e0fe0e478940c3c8421e3dfaa987aff5c64215d45314db6e2c8a449829c3d4858a911339133161b45c81d245dd32f385a90a156e529968cc91e53244e71283f21779d94f42cc528a70d67e9d7ed00a27c4d47e6e07dd49b61d5828876199b671d8e518b769d9e4e22ecb7360fe99b2bbafad2878f58f5e4f83aa2a941fa8dbb3887cc28fe5d9e48c1ea3c7cd5923568dc4c7917f3dd7040d636d1dafbbbbbf41eeeece89f2fa504ad9d794f343296355c99f0d5212ba70a9195e3fbffb49e84223ed9fdce21009638d37357e581b71bac03d47f5e114b93e47cd2a50b398b8bebfdf74f7a791427dab6f8c32935ed72b5e7f43af8fdee9eaaa77ff60df7f1bf4df08f8676449e8010d69dd52ed133915776a36b8fe513992fa924a2d55ae1b2a466a4439859e5cec8e357a2534c84bbe54815aa7fb062ee3e454fb85f1f7fde77a741ad98f721b095d6814344cbdff460fe76525c2ad5695f2eb32b6dd207bb18f209d2dcfca0643720ac9c5448f7095638c47b8c84168a93146fbe517ca0faf0fe79c59967de6f126a5bcae8b72dddc7dfa4ef48c6c9fd5ed5488ad56acbb6d5ca91761f466839ba2eedc87557ab3c1e813a3fc70e28f5077d4d5f178b4dd2041ca28636c4e5519a37f57dd77a6ed54f7da9d8d517ef4e64af6717d31c66ffe008381570e351f578782a330828a69180a29b86a6c5e671ab65d9fcd51b141f937451be41a9ccd9e455c90fbe5322d7644aeeedb05396e062dfbe210e882a923dc8291be3017e49044cab197f1f13327b2c7b078798c6d50fe7ead9b3da8611ffd920a2167aa6e7a40f963f69763d903fc63c699945be63fb1cfbc90c3dec3c85d043a145010ce3a3b221d0a28a8f1a591f85132684efbec82fecb72bb66e61a5fa0f6abc5df3c8d7df45f9d095de537d947ff54e30b109ad050fddb056316a7632da357d97683f8f7ee02d8c7fe7401e55f21403a48f30ffbf8d160cff7cf5dc5efef63f47a449f7e15b45077f401b747796133db346e01fefb4cb7ae47fb60ffc341b4df07c24138880ae5d1ee2ae71ce39ecefa9001083150fdc37458d0bc5f1ff2af6f039997b3a07cd911e91a5db5a0fc98d381eabf3bf2378f8874212e28bf3b22b4c679c967ffafb38e6814c520950317802ac67c01050852b2c85264854dd1171afe22643426871c8c6e68410f470ee8418d27607ce0a1054578f2829b274160ec8590122d88b852449736c04879a2d4bd60a9db9e3c41b7a2324e456d50ba6de16a708a72a4ba8d14943fd2dddd3d920ab2eb2346adc6e7d5b592ef5fe84ffdd9a9efec4b6f7dc77990653768d907d4209750a6d35284195a478bf0a265452ce0b26e2b1a422ba2075bf84306e6a3c3132724a81848b10827fc8a0cf309c19e04e820440e197802072eb0b22508295414d1e28a6082ea628b23bc8851030b76802288228648512f6ec6d0128086a44006a67ad58dba4a3ad8a05ac2aaf09225a08aaccad46a82f044db2a29d503bab87245e989245dc0bc608af60228281757acb1822f921c11851345b03afb7a7e66cffc7e3c912f4802f3f9a932351f32b094979aa202cab6ebeedf1637c6ef90fd657b11b5dbee36afb715db2e3b211d08f3b2fc8b9f03b223f2d5887cff8b6b8cd74ffd3dfd4213e2e7554872b7a089b56cb392311c65bf7bb216e5dfa53ec35d5ed8f49e9e8a621ef8ffd3d333c4771a688522bbd4c4cd6574625722395582004627c98643edaa275beec121031a7295b1c935e01a4c51da68d0abae12932ab5c7571c9521563f176beb80970de8d6905bc5fe745294db9eca3f7a7e8424802a3169824b71595d2526467049d28cd72103627b4192eb054c364987690e268eba4a4c72a8b40d6ccbf661fcd820cdf2eccff81b235d9e65192cc7dccd2d89a2749730042971bd0a1e9fd8f657a73d465f8f59d67ca1a12ca2f2f3cb227e59c4b25156f78c1aeed4fd70a776770b49a206afeb9b4105ac95498ed4a407474918f124ca0d3ea071f9b0c6c5e4450e6028a1c4c5074b6838239b0c317b01438723b86881a1048d229adc209be02075b059bef8f003d20e86304689b78c275c6ad0c51136cc000a2d98bde460bb1205109c3041c50e3fa862f68046eac84ff56f245e89d440b1c287233fad832974a05269ea4ec124a926d5c93baa0a675740bdc3015f6481dc787e2e7a1eb34052cfdf490bc4e6f99d6881d43cbf372d101cdf1e56e35d6fe3d57ccab3f91b2ff537bc9b5779375e07d51fc763de8d9a44f5975b1ad57f7257aa7fe643f5d7ba30aaffc675a7dfe6875b1223641f6e69e45cc1d93eec7c684f07f7611786e4dacbd17d783a6a4f757a1c5553b265aa9f55f5460be48609372a0ed4879a92ea8fc34bb596877e2897d8182d0faae525a1395a0b24bed300f98d1bafc8f2f0a73c2e5a1e7e1b8fc72c0f7f8dd7494ee44dcbc34f935a0ae3510d51adea8ff2c2140d75b3a84f420e42ed2942e7a13a18953f5b523d944cd55fb616c8356b887d384466ed9fb5bfb0c66f7d2d5bcbc37f54397ad16879f875788e254e8b2de45f8efc3c83b8e5b909831a9154c3c9b551c388fd40b9c6c7c2fb718370696a430824b04421630345d061298c0fae50ea81656689073f2485d9a9affdd388219eb4513b35c6092d464668910312ac90a2608a9729625441854c0f58de2bba40b8fa0f69a3ee152f506c9c97c270a0ce6056031aeae8f48a59fba4a976edee21cabca8f19613289a7a60e24596858993ea3f89e852374b5d252274a81b6a43751f9e4e1f76a857f5873d493b0bd20f379a0f352de573f3382a1c7f63a5a2599bdfcf1648cdef75fd0c2f8e39743c4de5d0f1f18a2f548e2157737cdb20906b5868b84b455e689f1b2aacc042075c681f950f8e6f9c0f91c43a3f65c27cffd4957d324bbd9cf3813a9b389e91f9eebfcd9fbf0d7eea81bc2e92581d07a76512d485222b7891eb73446c4e9c4fc7174ef96513dc512be3f06e780ca541265ecae3214f85e5e9aff128e0a5f6531decf29c3ace8b2f9535b06ba68a34caa82d46ed2fd260ffa98c270311373009e96054ebaa8be54cd245b4e46405463e0081e54cd285238b1d90f1c3162520ae18c152134a9e687103911a526cdb3e24b8aa91dd5f1edbb60fb8dbe1b63a32c81548fd392df82a6777f827f34d5d2c356855ff421ae6d4b00ffe8813e34adbf5556a8195ca4db58d805023a73251abd56ab1a6ac52104b6af8a332104d372a3b77a9fcb15b689f30e542fb7096d60e95f93bc06cf0095e9d83ece56d698c4962496f591b77f1795c4169d569f0bf9c06997ff927b7a495274dea2a3d194a405da5222dff64492546e98996ec48152f1d9e74f19b897ee57290c4929827434c78c01a2149185cb8000c19666a60f553557f9934a5ea516d21b3a4a585972224add005066d5c3146124d647418a3e9c0c6698d9e9f9e1f3b28d961872170139b3f7e84645c66d7d8420a1fd2a832c61a4a0480a2c60e9a58b1030d865020c60c20783006131ee820440e170f41081e6a9391c40c6670268b18fc90868eba4a4e8250a5982b8d6d75b655c680ea1fd2d42aaafbd81ddf6e0cd159c3786388620ba4fdc3ae364960fb2bb23cfe292edca1aafba83dcbb32b03ec8e7f8e1c353535f4119eaafb581e4783b6e0ef827f9115764c0cfa39b65aad5611ab7f6fe608950150b90b6a6e79f8b1ede6d85384241b4c5e1d5b09cbd3e1e57efc085171a91c01d45582c202273c702aa2a0435250d247ec1096f8103c444bb1031c6e90e45984692b4b1c898fe0b204aba12aebfe8efc5428ceb05135860306d4ddf3a35454a961aa1accb2e0e0bdba4a596090c58bea4b12dbc61218300ddd831a384c9185c75852d2c35eb1e4861fa8c481daec0a4893d74f093e210e462bf7119d2ae407bf3741635d25275dfc58519fcc899738698fde61d5e65095932da80a8789131c50b924046b1afbeb015663c510a30326ae5841e5075fa45177969e9061e58a275b8a300024564003262e4c86cec009a305126ce4e0822396c8e203304e400185510ec494c10a2999ba3850238b163348599c1081b5bf2e5460d3802832cab22c7ba13a6736e76c1762c3a9c00c4c86114bfbec9170c5000e7f01c6b06628c018d6f6d9735d6f064141aada51fa41e9872c4010d55502a25579ea2afd2044a534bbeaa9e20406550c11032dc8b0fab94301ab5b509c1fce90adf34fd83a5fa8aec7e30aaaf4030f756b0e637fcc13aaec21f17af94b2f62ed2ed81c95eaea14a517e65a3635672aca26e6b54777a6220eba56b0758c93cbb48deb3647a5e2b653a728dd3454bc5cc90877e9f5f2c42f945a87827f94357edca89211349bd6054913b0207a1688dc1c95eaea14a518e7158bdf60ef34d7cb13ffeaf8ee557ff6df26b702bbc1de067ba3f7ee7216b7678c7dcf037495783053430e8d902af110a6ae120f4c75ffaaabc4c3126ba0676b4fe5adef5f3f397af57417b4660a8d51520683d53821c3c87e663552e27cedbb5e9b9f65bf55d3b26c6251faa047e7cfe86a62aa6674c69eeeb21ed713be5483bebece33323db64ed3fbf1b0c1bc1ec37eebe42e05a1eb931dcf98349bdcc7c9456e7219563411a6cec77e662bbb20ae9d933a83f29ac13efbb09ff3b766f3b16ffe11454b304154fbbf8b8a0bdd2b3f7a255bad9f1e5487e6d054d3a1f6893a6296e43bfd5c522a292749a7472413cdd49543155bd9a4ee4731bd8a4bbed349becac26461929292923231da50662613938de126d39cdf3638695c526171292ef5b2115d251e92aafcaf494361ea26d92026c986a46ac599a5ea524757045daa59986c0ca52ad5771626290be3abb8d43bfdf2ff552a4a6397282682d112bf74092353ede727287f5ca04eaa21e52e3072494747040de35218c94412b54f18976a4b0e5d51b2f46385198aae701826465dba0c11490e4649944264a7ca8f9e1c8a0b848bb48f7c6cb9f4e815f5cc933a2a2a6dc0a492ded9209286f5215b4ad090b6e450eff473210d652b7c4fb6641499619c1c6ad90a2593fa556eb9814bdd2d3758a96116a6f613a0ee961b886aac5d2739c95b8db38b0076e6cc99346aa40db26cf54eff9c94aa54ffb4368f25280e0962c51e0654c5be56edc7ba08f8631f09b84a1c146afc8cc8979f8cd25bcbc8dbf24494e3d4aafd44d4586364ac45846c52c389b5c034d81f37351885865c93a62f956bd20cd626dfe91f3341ffc267c52f54c9ca430621d7c449afba31ce35e15235e4a6906b525d7663c0e739e3b2ea8ec751bde7aeb0dd715fde58799b5d1077290899f075f68ac1f44e7f73f2e32633b89e5a1816d8e4aa12dccb2ea83b0b08b1388cfbb6efb24fd5e0f6a906b70f43a76e1fa6eaf625b4cff63aed73c2f7d8b6ffd13e277c0aed137ffba9db37b6cd8d0729dbf6dcea6cdc0d042bacb801164c6cd9c2e50a2bacb80116433451d57ed33eccb40f69c0aa7d98a3d2df16a8636cd4fcb2efec63a606b5a6b240fab5e72aed937d0ce637f76ca04f1323fda6a1f4a31f3d49bd4b5266d2a0a6bdd0a086a441ad030d6a2e34a871bf6da1614fd5b62e32185e2ef4b7bee4252f7949f6eb259b106b7fdcb43cda6f57d09ea6b9bd7b3170945462e07af24266aada635e88444a83da73dadfc08186dcf4dcd43e61b320cbb375bb09304b6381deceee2c024203d47e6e75801001b57fd3bef79d1f5036283f20e47fd0bd9c069b7d3419b3af2b11550617ca0508d41f15c4b949fbe01091df2354238ef455f81307858f045c71885cd78783fdd6eb6bfc14da0787361857cb8a4f5539aaff16088bc7ae1ab03bf1552a1b9bad865b059264d0dfa4a54b0b8a198711ff08a66a770f773791a6df1addd3ffd3ff6092108c8eecaa38ba2e2507d9ea8969812c15b15ed717befcb81b21d01c752348552823bf4152f5a01b21d0f8fb1ca4abfe3ae0290c47854e5a7196045c6383385526d1f3f3a0bba77a7e1c95e45a145ddc3ee3106fd96a7190a8a5065e816088efc435a38735e385d63649b9d68ce6d66a91ff3f643908f387cb834ae7cb0800f9f7575b2d25442d254b5aad56abd5e296efc44fa1c890068b2e36381aeabe46030d1ce444438c9f23ab11bc6226bc43a557237ca48c54434dc7873935e4229c0ff94ace87cca5c6e71df8e308df909c6f7b875b38df0abd13bfed9d15da47f5f159e020393efe061688086e3c8eefef3edc2fe49fae477db860604f3fd4e6d37cb83dc8bee6434e7b9b0f578ced534c22e0fee6c31d233e0478b59b0207c9f1c51fd23eaa6f5d4b7855f62e88c71554ababc50626f5c90281a13342fee988eb5150e233120b04069a24b2af51427b9b28dba796e0fee6230c2210aa38be6b79f86f7cf16fbc0c5b1eff1aef5a1e7f1a4f2e8f3ff5e2f2f8a33c5f1e5f1e7fcee3e1c73c96938db868fa4ac7c7a73473ce3957071371938f9934189949bdd11a129b10684eddbfb6a05fc3df2b36a0b2454b1643b09284c5b346921ec0c82245134bb0fa1fec6e28367e7f1c143e23df4ff515f6fd5949110ee2d51fe5a4c8b91ba8cac3e9f554c73cb0fab3d7959dddddddddddddfdfa8a442fa141dfd6a0fbe15e896bd0a4177c273e07457290adf1590b2a0c47e19f1f3253b73de6b5d0ea9df8f1e36ea02d1ee220497825c48aac78eabec949d9171ff33ae0b5d0607cee091af66c96517eb23bad398d9cdcaeec460814d5e33fbe427d2c72faed88b82041c04142be3e2e5a9ef85819b41ff5b2ab807f7f385805fa511f0e26c46223df8934aff29df853a6a8409fe69b81fe46d49702140ac33e163e1c14b09f3f3f2333760f98df0a1fced61e4980f1bd8b40c83ee25f1f08d847fcee1e20bf23ec23befc1e5f9d9ea3f0125cd4c345614f0f17853d5c14f67051d873fab8c877e24b31f4ab9093246480858b1958a810b162192c8a00429429a460228a9612e9f5b01157e1229aa4b5d646442dd5e630ad310cc3304c7b0ed3bcec4608b4a6aee47eb4daffe3548693010d7bea9c5dec55f7b387ba4ff2acee9b7255eca3a98a7dc67d482bd73bd877de464d70cc8baf79d71f49d50be30efbbdfe5a5fa5686a0cfa15a87f487f4fff4f3f6a69ebcb4afc4dc717899108fcf91e15e8ab56a17df833d27fade0abed221c2455e3a3b6a99d51d559dc0d3446e0fa7e1a8c2fcfd0f0aafc917df003e4f7b7118cdf5f91065d558b78569ba629fe5c202b64bbbac0eec4fff931800176763c2f478e1a439a1a9fb733680ad7b7ad71c50bfd1abf055fed192b4d679cd9c249131e58f15df09550113e183346a9280a229cc18a5f24fe0a63ae32dbea84a8a21a7ff3f77c90c282c657f949cb0259d518698c74bb5418b4a28a9ab6d51162c9df9f4586d677de7b7c077b2a6798a2c2f5d837c3f5ad4b29bf1448d9fdf1fbebf1e1a0f019011bacbbd4cd411853fd8ba8d0a07f6ba8412c68c84b15477b2156cdfbf31207e1aa3f6bc141380eb2bd77ef4e16c85251fdb98caf6e70b4afc810cda75e8865f3e1fbdf782df84e83fe9df74283fe29afc6e326cfc6534dd59c5f0a6c1e9b8197282dd6b2388aeff84fe97e59537088749f7df7b195affb8c7095062bf7040d998883705fa884cd5780cd88c196162b052af85a366ff3a960caf636efcf5b38c8f6e110d9befb6dfb60f033b5fb70b817aa1d1618f6d90bbd70a57d9034c885836c567c3fa213b00fffcbe3306f7acd3ef86dbc5423809f9b42436e19e99e7bff8df3b0cd08120fd9c8f5dc6f6702f6d7ffe57527cc201b3128b73a6c694c97f609978deaefe192a95fdac79988fb5add5696ff764c24af506308387061c6066a70f105006620b1060ea4d8c1cb16ae879399cca37f7dd7755d1bf75d87a4761f08b87a7d46b89f3f43aac6f91bf71bcef6d777dfe4041c04fb7088b89f3953b32fe42a02195aadcd1341f7dbef0876d4eb3b6f48f6d7e60dd9da6d0b7bed3d4cd5ebb7cea30961e033f5d4d5eb436eabd787da07eaf5e10776794254bdbedb6c1ea83b6f2b13b54f935ed97cb177b677ce0bb9baa13ef32ae7a19e7adcc443bd7741287f390613add4f8620a286200850c2a1bc60da01c210db92006ad1370903d7da1f6f485f6d1dedf055fd9bc7f0bbea2b1f1683c9ceb8558dce43bd7576448284cf5c7c1429755f33fbee33f45059b292ad07c0dcd67f3f1a8015d96cd2fabc6c6bb7e5953b69f01a70af59afdb26cf0336758538c5c0f80c1cf7c3844b29f1e8de785aa701659dff97eb81eb4ef870e34dc2f2cb4cf45247b18fccc99ba7d215fdf3dd6a5411f727df7656528337dbcd4a07f1b34d47e7b8ca87de65f42d8c77e40d8c7fefc16c03eb6a7c17d168a08d590aeae141af4e7a5c5c1d214349ad821c9961a58fe1cc6574252a6d062064b68818529072c6fc1c90f3b8012041f744982e5cf4cbe2ac11840f4b024c60c88ccb07ccca96f96d46e14981c464818c5314784596a419706835a252492babb97e8b0e8314d4308910d0105161db7c56ac9938468c12c0a828a2db81dc0209a81106b00a10a8b7f2004145f74c0e4891a5fd060a3624385326a63139bcd13338c46757f1fdbbff6e57e749b27babbdbe609cadfdd981448484848484848374829241ba41a241aa41d8f44834491504827a40ee93da40e8943da903424ef43d29032a489f4f1409a4818120f1d240c490700480008c0cd9018ee4224ecf823128e4638ca39c239d27194e34875f4de91ea08c7d18da39ba3d491cd91f71dd91cd51cd11cd123d4d1c7e30875743aea8eb8231e3a47dcd176a41de900e0483bca8e001080a3ec280002381200c86d916fa8788c3d70e984c6ed515ed8ccb48deb4e284a536393bab981439543074ece0824704d45ad689483a323870ac70d12768ce0444572a9e9c64dcaa68666c7e774529113d150d4a97b0f8789ae319dd471db35a6f66bdea78389b0a4315a363f1e39bee6a249c443475567535d1d6166d454fbb1ce841b35b331a2fc616684a3f2b001dda51b756d8c00c0ed6f01e0b253eb66896c2d10ff8d461818eec9d6d0b63a618ea5968ccfdf1a2d1012ea925061e033351ec15457e9082506a8ab64449718b8b540b0f71b9eea6fbc1b9ff26edec64b7d8d67f39757f3ed5d8f79fddb9d70a362aae7a07da8942c9775490b992a1a010000001315002028100a884462c168304f7459fa14800c8aac4462481949a324484110c33090418418658c01001860880c150d7500bc2829045770dcb203c4c8542f1d3ef89961411794a4e0d4937febe59952e7d4794c643a4b12a8c4be5f21128c24474de1ecb4b9ce79acd28ab490be4965322991d603b7b70ee3431f8c0d5c88f462a24d61dbc3ec972a837baa3c6b862e88a0a0d63c37d9aa118edaa075d07505232474ce41422ee6aa790cac07dadea7817c68fd2fea38b3502e10db5e852cf087bbc95d959ac7c6808d5100ba56e525a40989383f92bde8b874c0568e42e95c551ae3cb4e81df1bb1d18ecb9503d174446e20e83ae3ee4ed60a183438383a326ebb72a96353de6565ed81151daf2d34b61ab456a653291fa534f0a443be084e9331f63cf648d46096ba457c2b8de7ede5bc4c3b1163d348d100630e43cd1441f45c946021d5fc38d86da44ab9044b959e8d1cea68838beea1598465919b81495db6049f38e4e674e1e7e48ee6f44f7ed6b0c629340a8ccadb441f010550e2242940ea3f4ccb555e32e3a96e310d3e00873a4cfef9a79cbfc0a9967d75eba7b48fa7713c492389e607f3e489a1a7b56639b474f5b27168bc393f5bc3d4726e72b2e703296972ae33569d4c039eba21a63f85728e4bde2435b2b098726d6e13a6b30d932d531580d23a3543a5d73cb6fa3611444974f77267de19ce4423802cf4e4659fb0ee586acf8bd03ce6e6a7c4b24597c1349273a8a079c41c3c54f28d33bb8f6b4ada9bf1747a21ff221e3e3ad800ca28968e5615de1479009bfdce1bf5949ef9c299d6512787b0a95b2567ce5170854701336a061b49bf4a700be1c769ed9aa1482dc2a7d0a17ebbd0703301efc55980879ac8457f4e14a0748e7bf3a444e84944d51386b027281a69f7c94b1c813c92c68055d8db16d0ca0339b222e3827365f98a69797be332d24bdb084149f3d7292bfbf9dd55c7d1745aeca55c8ac317c74004b4943d2f1a622bc8e5adfbab8b4eeeeda2d8281d806efaafa16c65af7826807c99bc985b265ce5ca045c4413c9ea8feb42c5bc45620675ea097eb9d29955ff8416018e767f96d256f1b3a5a304fa1645e808f4cad7d3d916e477611426b9110b326dd8c6050935eb7f0760e3cc85b8b9b765159ab1ffdc70525532ca21522381c614b0e7f9d4e9a62a8dae3ff76cf0d3b65eed69a3158514694adad424c73929962cb5ea650e07acecd6b4ffb1ec855f8027b29bc30867b9c246187105f17d6afd12ad1322c4093d25f89c919d3b1a24fa3737a837b54b09ec9a3600008b602ab9051fb43c1f73f391cf8d5953e2f727d64564f31b9cd67a0bc70bbbb4537cbd7cce94e2397b667fe09fb6f728bc7cfd13f82760c133747711507a93c3b4c57db846382cfe5d553e6c9c1400befe39d3c1af2d68777d51ba223e2bc76ac6936364de86daf618cb5d68d2b4aeffc310cafe31b69d551a418cd9e33802c52542226f8eb9b490a2490364be57e84155589fa8f6d31db16662fd2555f1831d395e7c1c8be1af17c62fffb476f166b7e2a31d81d9477fb6a27f3a7934231ea52e0af3f4a34a77448720ce5493785409fd71a25fb9c7f0054098ae9e215c5d95a07bb89b417517d1c8c15afb90222527eae9eb5aaffe695b0cce5a4bed0238628c064ccf927d28b8323940b72547a09be28d161c7cb6e1bb7a68bd0fcde7c00e10f5868532f09fa26fec828818021ddacc0bbc5509b906845a8ca45572e9cd6e08b962709fcf2668fa61939495ed68411b6c0f3ccd01e8eb008be68f0809fa6c3db6906f771c9cba4c83df5c6c509f0fcb33caa45867d1da96bb53a353674776509f9b0449ea8728cb7091aa9f9c78594384b0ffc70468aa71fde2257c92fc4f2bf05d920f8cacfdcb944595eb5d9a20992a69944351637d9f9e1479de7003b2f19f380ea6aac04fa4858c0aa2d5986eeb4918fecad925a6076e7726b94787065409c622d59fd7eb980aeacf1fa2e7e7f465b3219429a6f2ce5dc3213c4ac6d260e6c8cf09a659e4f894f134d8fb907198d2c9c2dab1285de9ef58879b30d8994d5d0b95e40747b40cb0b45058fbaa3a77933cd8d71523369c39562629e90d88b117c4bd3d09b638d2cb43718720bb355d112f2d214bb429d4a30bd9540e10b8a606e050c28f874acc8a668e56aa3248d00a3bd10c8018c807d9baee1063b6603ea0223559f8a6742e01199ab4d118e460fbe33502bc333fe660732051e8d3da1b7e7b169d5c4219fb884452d8ce8ccfa223440b0a8beea908f3672774c6967082750b5ec93faa36b0c94d73f0a5baef051ece636b184db6e50551c241b59b175f56ec54bb5d38f34752ad5a5b79df8f6f2903e98ca15690191e4579f3608671f0dae9aeb91a6e369a04d2d0e0a96bbdc6b48b7aad50d7b2ce250bfe85e9bc92abe74adeeb8e6f6a7f90b28d7ad35a5e3a37ca642aede4f62e621ac6ee232c93ee1f3e73c513974b51e58c138f31b3d76d57b82ac7aa3a86cc773e00b2cb58581f186550bbc31e7cddf27a754ba19d2b75a00705914afcec268553d1f99079844872ea1bd61096c2f23a24649dc2ced9093c2db0d56395998beae7b459aa12a7ce0c18e347a52dde7490320bac2b1ac2e35aebb2e896c41ccd4b9ebf5a84b74278ef174a401f4733712a99511815d994068b7e122f78a89c143d00c89da105005ce5c4c057a05a81fb378ef935e592bf161bd979a71c138b3c23028e973a729aef8ecf8aae230d27e33c10e847e1548abe0805f7a795163c1d5f68ec8a4b28cb17de3d711ac75b3462a4b5802a27ba782a913592d7aa33705ad190b97d04c8e355f2d878f5412fb2370836904fbb9f877de800f43c367d949c520efbaa4c0a3ef055d6aeafce23810eb3e68654253ec75ac7d5c6e3c63667656e5ed7d2d117183eba737d47a1d38c9c79ce8fdc40c2805f2eb4c590ebff0de37bee3f527c876e759c70b0000c405e2f4b3885042c9f783ec3c6c0b1c47655d98d1de0e61fb82a7458337695f0387912c8191cc3a3b1370d381e9d5a200469c7514446d47a7c91980ad07159e7650e8729d5748f3c609b538fd5f2d1dab640c457cb788f3523cf45f3af7455353978d259659fbe80caa6ca951ade74208c21bf28465e80c6b703d8d4256d9041e0d1ed65547c793f521b46dcc8caf6a2ef71bb7da1ba1995d3b03fdff7f8269b756507406d2e3e70de4ba3a6e98db7277027f4de8a35f116cbaee4f1e504d2b1f9f24624e4bc948a54c405ee1064ebb363518a94743a23fab07f14f5b9891a841c8df7a6dd32a62c15c45e85b12e09425608eeade127ed86bddcbb0daff16f013af3e23cd230d9cc84108b9698463e76793fea3f13214a004e1ad658f0ad7c9d21d6817a7d004df93a5e293913c1c1157c281e156ced69bd1064c78287fb86bc00062a464845f7f0322de4ebf29c9a64f29d13725e46e5c85113b17372ef63e545ce5ee0267cdf6d23e1e6e17549b46c6f153ae0f91c12b8f098bab8a7db77255f6ba51363278559ae957199e8c373a680ed9d94a82aaed4b848e6c3b0c35732fec7fa0646b8bdfb715536fb8dd413c34f987f66a4bd5d113a8d371f1f396f88d341ca40e056db81d41b422e0ac44fb85491ebb1a70da5f4986f503161f1a5e25f14fae3fed0f75058482cf45b644a34c4bed084ee94a161c93d8faa758d2ad4df5dbfe2d1d0dda5cba06f14cff2684ef0f3b6ec3c80177d4ec09eb62815b03ce283d345b448cdee7f437825586215a08ed17bb1b6d0e69d7b1721f015493c0f19407a474f1c841d9dced1cd95f565feb2f056467b65de71e039113ad5cf27289a76ca00085346a896513d220042c4b8ceb76655f628af256e38e376a48e38e56272c37d4d008babd80c1d8578981065c8c35193c0fb66471be2d92535adfb62728389013d21f24415cf7243f0e49b41d7d2efe9f39e93a9d2e850e2402ef8d38c1c5169319a1d97edc8b8b195398a09174f04e260383c6f1be6668183bd96ca432a7bc5a880446a48888a6c7c8b19d6d1c2be53166c47e1e584a89b335588dcca67d7d732c0ea66f23324aca15f4ea7a15eb3e8fa762fd01347d06ea6e6c0ede175db6cccbb714756e9c82e9db74c2660581ee684cc43c6f9f19a08153fb7c1b096d3a7f9435af9f355df1b8e4e8a3c8f7de0d56b1099cbcb0d8a5a4541b215f6c142b50c34c30f02b9a8593b1deb27cedf5cab274102f26201af9ec4bfc078789232b5c1801418d7408155c680f948e77e467a28a735c026dcbbde7e8d0465d74ce88d7733ad1eec92408f69fa45cfa2fd9ce99f4d7cf6159f944a2be21b0661eaba6aa2dc820f80f3e37b002cd7555e01765cd08186b9a365797e2fadcc05479f50a5e2915ac1920a4969e82c04178a9625b7d8aeffa4c5a820d18ee083123b33bcc1e3f0ee04ce3cf863f1b288d6eebef5211dbb94d8489f9c591d2dcad9fe969232b19a9e3033caa49f503c20ab951a5032657784346151ed88379322fa16dca78e669b0eb5e0f2f627b873139a2680acbfd50fbcd3e378a4934e46b515a5524daed7a56ba644d368813a8bbe7a293b5d76ffcf79b2d194889f20e999025deabccfd7ab988db1a6ccdf7fea7f355701ce49ff4f1b6c1cbf6ec3c9ba06a6bde1fee6d3463f0a004be38010c03bde82c17245961f39f018efbeec7ee0ef9def863c7429e4436db655dabdb98eff4112e5c37a9a8d34e7c27ff4d482b3eaeca4d5c682e412eb2e687a76212dd67a7244e3b215623624a0aea03682102f3679819b174a687d2598d081219426284447816c51026a5d6807ff909f80c5e0d848493c4f0a995c341b5b7271049dc6f0e0c5defd03b764e9cbe1f1ad3baae4d2e3fad9988fb15010a21f7a438539770eedabdaf6f1b1a5e61100079a3655f38bac3d7c1cc929fa0410b8dcc431ba1e54fbcf06a8f6ba9c982c10724d8853cacb899bf9a14f0e755b97cee30d7511201ec205c99e623c7d34405adfb76067f85a93d77734141aa904df3baf040711957a9ff97ef5faedbdb6856a597819fffef7fe3eef64121bcebc8a1075beeeadc46cb782216dd23933f1edfeed446cb5822d653eeeed20177b2968f9f2b61b69d332f414ea789535d828f2756ec0b986c5af878126d797311b4949efceb06e115ac93a75a1581ff0435060a0d759de6e84bf6decc5384b9b867e8b72c0a84d7a0d3271fde955d1939277f7f6f1362cc04697afef96d8f6f927ceee70b616b171252cdaf9fbb78e62c97a4a70ab77bb781baf61a690cf6f07cbc55a0a7dfedd6d47d8b404cc841eaeb20e7b6ade1d3b202e81b86b6151ce7733ec46e8727d192c5b87eeb4d5befa01a48d40b82801b480fcf96797c0e204003d4823bb2b2c5388bf09f77980278b4b80465d95d0488729f628183b987554f7f1a471f9790153947bae448aa7dfd59892dc6f11b590fd5ec6a365c30c1af2f045d7c88dc71252807584087baaabe6205ce1e1febbbef377cf7bb1bfa7c1f9b009472ac8f9798ac23fbc12f447dc9977c3adeffb7eff2ee7f7343932dfd4190862fe3c5e3c9790430ebb130656876befaa7783f93efbe276aab1e73dd44dbab5022e85360796c6aa70b857ef92f8ce238d3dd3a1f6743812b92610bdbbc715fddd8e0c1a3575103ff8f51018ce759470d626d4573f86adcda25e4561ff68522062548121fc5b34ff6545c121db5206eeb32112b032f4e5b56642414f591d7a6c3843a6c259a7a07d705ce247dae6bc4bcd555031efacf6e1badf2f6f22d3debb4ce24dc0122f71ce827ba432d6ac7063f6e43ab311601e5175afa53464cc841f0fd96304cb4f183c7aac3ff6e9ce24b394abe70b4a18f0cd20225e2ab260253cd4727f45125ed8d983a9665efbbe0d4fada0c41c682ded6fd330fccffac3ad974271f2b1b6347f8da644b085d6424f1839fa13990949085d4a207241494528e4903caa10a17ec2104a0367b8eb6e71a121260e2c44b9d5f10bf4abc0847a1af76549e783abe20b7d665d23a376a10149451d45aa60ffe633b7016e6c2413e603e3b71922515630b6112f00cd8860cc4eef58d57ec27548e300b0b517d1a97d62a1f7205daff0fe5360b68f9f064ecedc8dfedef03fa2842b5346624c56165ef71cd1fae17f1edc4a065d2d2711db7075de6bef1bb68ae7f50dd92df2eccd0c316fa035cba203d804b16a4127e93eb6c34b21dd2e27b4ae28ab7b987fa56671244c6cc1ba91dfcaa3e888e215c5d7561804cd9a2f6f74cbbe1f38139a1a79948c4257f11f64355163b70b013119320fe6203f482499e1594e93d527d71d2d5736cf0e063d513634a3096b328aa08ae245445232852dfb4cb4070080b970963ab5c14c9d117d64ff82b364938a443e5963a28823c2c20a39d9fedb743c89bc811ccf377f114d2d563c167c8e4d55a5f3315226159b615389b8e77f912c05d74b201d484f6a312b6c80011a7cd3b5bd4a34584f3de9c4c74ee5695e73b62f4822b4e0e012492154c8ad4a6ba52771d3a28d21577a733615aad850a0cebe128005a1e4ef2053c7a756cd6d0a67b5b5f2dd936a64852d19ef54c6374636e3d9becb6b5760425ebab5017d37b0a7cb13a512f72a7a5ade1a4f350994d815d2d7b5c4bf3cbd5407f8516d33ea87422e9d3cf4810fe325bb32c7518cd33d7ad1a142483d76f4610b9842087ebc8203640abd20734c06ea8511edfb2165a8abbadbfbf9083661868df56bc78910a462c1f6995a4c60d1578abcc34263e6c242c3e27c1d8529ddfbaa03cfb45a12e432df83b0c61c2c09331532bd2fb254783b1ab6246b1dfed37d724b3a7bf94c1ebdea428eb95a381d73a08bc484ddc3909fb35a714e7d093f22773dc358da4e9442b5b90d9e1806c785306893be2806dc462206162da1013293a65c7d3931614945f4955b37676df1d36385c5cd8d1787f11a39e34023ae104ffa9ddd8031860478ba56a0423822afe31d9e410601c952115a63bb02afe37e97708047ce8aaa9a0a7ca16b426e14d986e01ca0a65884a98d8574d43bf5304d68d3eb6b9af9b72a09ca96a057496cbc6dd81a1a6c804a056f2d5f7e71f939cc8112f2cf206c88c621f91cf34792cd3a4fb644c7e476e62c064859d04f834f43d4a844440dd07db0065db88b1be70de19f5fc7230910e5baa6a3c3c0492f373659572929c5cac248acd6dc8f3472b6d0be040725108cc6ad3eeb1d25fc19791973ddf956ef062275bca0c053ee348e3e52d7b5808f5cd8ec0b431da9f1e1adbf3866f9ff862c3f788a29dfa3aefefa3017c8fc9869efaee546334ad6b73daf284f2c2abc7a76955faf035c6d6824700aea6b96f539d48a691f423c8b1936799a7c7d3eafcc8047d5c853ab40207170192fdfca9d95c593a913b6446e7acb4c951675fa9d9283da0186a36a9fd11371d313a6c9c89349ade37ba66b6ce581e37dd1a2bccbf3c543e85346932974a88afcca30645680eb5ce6f020252fee7bb7d286f22cbdc9746e7e6aa14cbb7a71017c7722b86071d14921a282596e42b05b9a734a7ab0f56a6f370fe46384a2444f957a498bd51586c0faec01e6e27729e1eb7b2e7e9d2a5f633dd77daafcd2d2336380b9086b8f9f653ff03157d1b9cd453a8d9284b2ccb6c3af29683f5b50b7b63d4b05b4f4382bee1a809b4e3246cd39633c30acaacab07948375cb8aa1f42120a0b7850d4cbb0acbfc053375e2a3488365a7f9d6b2c1b2afaece5d361b32c1454d878ab1bdf6603a803e46223791b92766d056908385d5ccd1971de2ba965a9e33516a49bbd5fe472c5c180563d46f7da14ccd946409e35f3b21c29f82e491a156a4560dbfca1a74cc3212e6df5cdbeab1c9c6b40db98249c04135ac5a042037b562d0096b90a5c58554dd51be286b4a883a7947156802720d788bd003725190968d999951815968c640f65ec7a9bd673352c757807f0a92ac7a148476b530e3e25b5ca1135dc82a5ba847bb8fc5903925a62f1a55e2a353b57843e989e1dd297efed38a175c1f2ebfb95f6905684d82ce0eff24a1506ed6a5dcb4ce9f74187fc494d974f3045ccc4e744f0e259e088a4763931037d61de64f9d3019e259a2dd12610b5c92991ea09026df91145600586e0cc36b55e1a3301c4b6a1870883ae03c713e6697e2aa112efa843070df34e038f5a67be4d2b05c690db0627a9779011ee997c358d11ac52896bd46fa369a099880f3349d3ba6e58a9644e0447fe4af7d7324a80d1914e4d2b5d44bdd52fc15e2da95e103e9894f41961a655472142f518d513e4869ac8b725f0876d47b60739c084269d762e85af22e764d8db1dfc0c8abe2647460f8d1f31fb4978274430b1bc7eb0a8ec7834d22f4cbc1f6bf4591f237eb2b867f6e73afd7a5b3261f103826d4850710b2979e5f95675629e179649d24d33cbe92ac8da18c3b5fff7a2d8ad20ea641d75221e2b99ac596e37a76d7fee1fd2ed76303fb5a58e8cb6e3eee61c19549bce8d70586be21b8f2f32c44bae795979248a14c6ea10bd1510df298f227631a4956c8c0c690bb46a86c99f251341c728d7f2c65ddc61bd8fc3dedc812a732778acd0515b7ca3cbdb13271cbd1f5833ff9d55e1dbdc9d25b288f64218f9a819f27daa2036e17d8efc7e88bb09619c9978a21de472255c58a2bd10686372b3f8ae73975964a144f43ab0b88e9ac585f32bf9297fc1277678fa3e90677c937445b17949da91c18347171fcb00896433711124114cde89c4429f3e5cb0a51e1217a0624b148ee83acd21eeccc37be93da9b6544a832ecf36af1d93ad63f9b9ea5275980dac41fd255830f114d60ac8b2dcc055612aba40e15762d8dcf1d88f15a7d194a57440ebe78ba531f8cd578238a2b0fa464a0c3a87e258fa54dfd48409111d6129b077cdd5975228c532a681907320c46e7a00ebc8187e0d7f873957c35de0ff10bfc983aa0c8d76af681b9fdd443211bd11723f12d3b7f415d3b6b5f423bfcfe26f22508231f503bdeba8cd17fa410be08ae1410f42a3168c823953ea4e655f531e3fe262e9e14005fcc2e459cbd171e40216f6ff14c39b061ed90e92a81623286bb3a637bfd9ec5a688e6494eae38caf8443fd62c7deeb87e56a53fd99228c0347cf72d360b070f1e5abf7d5c6435245607eb941d86e0c54e6fe7885d1b9f5836d513a220e12e8f8fcc2aff20f07596a4156b9e81c5a4692eea0de260ceaa647743c89b881a2308f761af3d28f1b73317829eab7ea7e169231d88e03f6cdfa559e7c5c7b3d8d38f6a0682f4ffe7f733deab8ea2f09ecfe787a35d356a45e81276f9851792f55ec9bee8dcf54658b99fd12a52be5cb6c99511b3068667b00829686322b4f380ef2045d6383db1e519c919fd20a8acb138cb2cc1352e78e048b3ed3c5540e7ac6941ec7241442e3cf143332e5844c4da6945c6d32d85908ace89f99c0f2676280dec5f4c5616c9d7ea1bfdcc44914a922cc166612bde34e894dec0750b36f9450cf3c0c4febc2c32e8c9775ddf162f3380b36627915796f9275bada588630cec82a9b598fcd5a0773f03b00c0e82487552ea6935d41a2a7ce2d075ec6da0c4a1826d8c89175988f0cddf85ae3e0a58bde1f349c1c7117f701fc191a8d6e4f51d181fa4120bc3c8b37eba33cef80c1fcba04f8f4ea0023f3a51e48be4d9cdc936a758e7b5c47e8a88b8db60fae75bef7cc2564529f88b9311924fa976acb768f8c532c7fecd2e788a2a84e522483a2cfa42c272d4604e10123143347992d34fe31ccf6575ee2fa0896348c417c7dc7def7649504897f1108f53c2cb4f6e3db44cb3d7f40d076593dbd94d673b2a8ed99c10c49019d28f478f45953f0645936ab1351acf0d0101ae4cf7ac2cd0c2d42e702381f92d63b3319fab5d23ab102303e6767ea9351f6bfb48cd09be121ab77662f73cc816a74917bfbc7a116d188d8f003658db8559461189f5e921e61c1cf058610b5e3868f4966bb1c825422f41e78d36dcf5f98b5df4d0ec6b295037d72dd290b2ac49d61cdbe1a9f4855fd52b88928974431c2b94c06b2b40f160415c4713dfa42c890c148c361275bf410ce56fc15078e0de08c2054e8ecf8a828818d53372c148455e6c413e6b2296ee116077200413c933686c116255d916f2921ad962376407462f9db0adfe7cf8e1645e7d00c7661b005051a834419e3cbe6cc38635400f900179439a72bc5a11089cc16886fe90f227507543b23375bc77fc74f2df2e7cd0663697730e074d37aa4733b67126934a681e840c31f6ecd9cbb1c5e9e513ea99c43e6165270f0757b12237b1a1b0385d8dc3a158dc2f55074ae814e75d3553898562414584fe448466331482f76beea91af7d9232f890838db6a17b49879615df9e435a877ac58d985e88f0be621debbe926892a2200d9460f22632a5236266ae29f7dc7ca9a88b0ddae906c82e7436a580b6b82bee88332503aa6e0f12d46b8edf358a6693f898d82a205a4f6b5e55411c0fff401059308579f133f789fe022769b4ee07f3988f3d14545be2d751f927f2501da6a518dc24ee6f56eaae55d0cd9bca479b43579fa442d6c75ef22cdda0669eb8eecfa364ef0a398b6f472a24871ae5c5e91f7fa1ec7d08ba236ad5f4ecc399f205c958517e94bbf39059a11008be638b1db3cc14f63406093dda804852549c8923905d6199ec320f1a176e5a574baa793c8679c7dde414a57f406a01f71d5a0253b2c5c4dfaff066e6043573466bc1c4a0ec6c9be6ce265120eca3643f52ac4c22f0a00212066c374147ec25f3323a849be19c2b81b1be2b8c25c247570d9c00d06651825b715fb8eb8ee44d18099cc547c2fdc77156320d101c83b0689b5c1869d618a4dac2d30e19994938c7b8c315109248665c93ac559a60c88131dde186c814f6f631c6d4ac7bc054d411b8161cb45f9fb8d4d860d5a19d931af44fcb3ef6f49a9ef6a76808b90b4453008d31271147436f2277d7602074b78630311f328c5b9ea643487ea315bae2d70798a4c14a9ebd54a5b57bc88974fc85118d7cb8998b4d910737f1aeb46118291d40b0bcc2c2428d52e3d941326880f955e7c365e993eda6e42031ba254026d82b11025464f6065f195093b1e6bfe3d01aa0eac5cf2ca465ec6064a8f808bffc3981f688f30845f6cf801cb7e9384ab4140618d645f3cd6462042451d4cde3355368f10c5dd7c7980d8431548173e7201d128a160cd28f1cce816531c206375306852b17b7754c01bbc5fee34954330123180bfdf104c96ca02390ef17b9c8906eeb2747f23bfeff329e5123f2125cf8c442a4fc6c2e26c196e009e51a765932fbcbaefe9004df112923a1f646fd9dfa8cfefc6dc8865fcb520f8713064a1883bdc935ec2f0dc4ab6e798c5a22e5c3cbdf50714c092287ecb6f0519b82f1211e105d05567db9d92dd304c4ce97a8e3456818a88ec1e349d1a59bc204774c3fd34a5af6e270360ac2b61591183e1f91e63e05a0ef60fc7f1596386ae16c8e29d403f5655604c242a234d936c74a29c8e43425c97ac29b08827dac10240464f8ef602286dd5f16718301e18027022e78f676b28212a806d7c30dca90f77d2c7d792124dd2783e35bd6e2b5da40d179b75bd1cf4f701a2ebd1a1035e4b1a6a931515c283406d5453ba93426a7b1a185bc2bb52436928c8790930b8194e4c7905595f7447e1a13ec26228bca93286a22d956f4907b23de951dca751c50644c730fbb31a332a4074de04e42235f410eda07052476cec7e136ce1c32ba443e9d46191cac3ff4f1d85e46fca272ac5c1226d195cfec4ce1300016c1c3ad1d9e0adfa9836fe1eaee98a6ec8199ad41e7e3382ac75eec21265522a472702cb357cfbbfbc2c35ec9d1e67369c9080e53f9f8528de2af1f88c618ba6150eb9d5a4630ad4ce892a16f25e9e5e449174d671ccc83e317beb0daeab48fce570c04b122e2d6a06b2483cf841db6e07dcab2b42db017ab0d33b749b3a98893f670573ace89df450791cfed4f8d9b09aa2b18e95b71ff01de4c4fc9475ad352cc13b7687063ea93aeddcd0240db3e07371016e6c0fea642f55542c3384d46c9703ec9cc709a48f6a5056069d1c32237a5bb44dbe7bb43da6f79713a3bcd56c26c845827949b56dfd95d1fa8efe27eb8b8ea1d133e4e02ec42ff6a5082f9c8025e85fbd83f79ae77b09078a721a4da10c0d4b49a24a0da4a2ab6020b316e0c88ef59c1564887aa01b17530578c3f028e00837d511c81324df8f29cd596c3480d56a75736ac1144e7adb93cba15c5ad4e1ea738aac78ac2bea3852c0d9977c7515b4171e37aa62b24cc50d9162f2ce8b8428c1c0dc6c39e3c5db15858fb4de21c2475704ce91c97934309580b4ada067ff41766c5964d618eebf43a2eac6831c59ed0a445a1aaab3e3a49db7e7b767552aeaf974d271c610b1b90837384d8259fc899c2d1d1ec46d3db1c52f897fdccf2bc1488badfb112caee661e8dbab891c28912a04d16c1017272ea1eefb7c1c7fc6ee4da4524e811068a652dc8843b92e00b0ef48a791a628c3842e3b1ecd27fdd09b0932da7dbe5ad5354eadab7b01417281f2f183a76cc706e56ca07f89945a951565281fd763fa6862277c443adb19572a0d4e92bbcb48830a9f05ca98e5d2442e9b637afbd45dc13dea679034cfbf1ae2f9a7ea21be8df8f173d11ba89dc6874c3575c6ae3e98bbddbf9747bd0dc481e4f128c09536ec5a7ae04136e79bce284a6c3c92b97e01a23de777caf1d4243512da891ca1ca23a0116cd2275426c7442b59e2b5c913a370568ab6a3279c050a3db34c0efd33556f380ef1debc4d5ecea354464396482ff1e57f3c19e856a2a1f7d685106644995bce26b23d0c1024f5f14829536e0b274c0692b9504eb5aa37e1201a3109a268436ce2634c97efff9ae51414b9cf2909e28c5cb42c2f2cfec9cb9a01866f105d77451991d08b2f7c7a4369c799486dc832af4e041837e563f76a447f1ae511058f743247a194ea9a9a66200579880f8f3d0c9544ab745510aea47b4a7cfd03a7ae910cfca010d82599d6ed742844f8e8d7288361f57d9eb847747cd37cbcd27de54ae3952d257b2dc0fe14e383385abb0688b0b08e2c4b07dc36131e0792ac971c5f9afd404cd9fa082831653e2a15ee41a5e35a8c879405f333eca6560c0924caa802825eba80fa43e5cbf00caa6df0fb8788aa45cd544b0c3641160ef0cfa04c6840bf4994a1825d0f1191202433b5cfdabc266ef387b79dcf323f446e8b9671337c0a2380f38af3cdf6899063d66bd75fdbcd245b07fe5cbc2b6c033deb99ae80e73c415c584d4c48b2a5ca89254c938ff238a5d182a481e167c269c380001e2d899f25c99cf960c53acb4a93343e5820f4077af8290d685b5454193f01be8b61a34efc747a8b4e8074417dbbc3bf95a4a222fa2012e1de1f8ba1d285b380a1a63365d12bedf260011ec955356782b8cce2ee768f37fcfd883228cfe1da1a9d4413fe1a06bb8ae61742981520820240736dd4f899dea452697e11edd69220abaa009e6b25d0f64df55171d07fe890b9252f9e8293fe28fff565b9ee4d7ed3a43471a710ab39cd6b669fa0a3270a95b0e118d04156e00a851fcb3a002d5ee549e15c446e56d155675d1822734d75f9d18dd6981a25f320a721279d0e861dd1149985217bb05a2b39565d3fe80857d338ef18185bd48e81914edd27194abd8b13b5660fbf777946ce5a69586699d631c14bbd5d7762ac0fac4dd5adc08c9dec6d205261e1e62d2fcfbe570dfc4f4696d89323a0d02673ca5ceb7e8b7ab0decaf25e95ae8a55d49c4dae1536e87417cd75dd869e318ae76b053c65a2e736ec5ad05de704fcaea5aef7acef6088ac7050a38159200bc329920a86264f17326fabd8e6b6c88089be9fe5f621186f0569a9e513a472c317be7b69e9bc92a6e565d80ed11de9114c8fe261d2981996c7132368d0df01bf1bbbe0cec6c595ae92b9de729e9c4b30c7dd2d533ef5d846dc0dbcf8a984be7530f17c56d3d28e9880b4a048c99087ae80eeb3b26bc289b01246b9f28881c485a19c88133f99c5a1cf3917c4f3429a315828814748d5e2b349b459e2ca8c6e2972a190edf824e80ec215e3614d84377487bc2df9bcbe7ac3790effcd3a11f8eabd299d5c3c37d13daf1f61e6187053c23e1a90f624720e1e24776691141576944655bfebed203522f942829de54f750a7e946f9ce7f5df4a1e973550ae1989cac8a54b579a906897245f9f34113449ad929ec9fa2a89ef005b943aec83b533563939446d800c2a5410a4d110fd06a7aab426e5de671cf90adc430b9c2a263ba31f9b646872ba321193a1d785c2067d50db404fe5b1bab5fe97d9a482a35c4d8b07313b4298e49847ee244b92446e41a5482d6b7f6f2e160879d9d0cb035dfce13894cb42b01cafc7f709c4086d2012b5b4f4a2f95c218dbbbd6ec1547a7c09f14b265c431e2f2acd3d198b67f86861d5a59bf8f9ceb12723da048558bd37a71aff9237f724329d09f1bef8a4bbb6d6ccfeb4129e5a5fb7211aec94a904a5f095d93da4a2528a5a1f63eebb245a9e29606bff21e7a0ed706193d81ef52a4244d5056d095162928e85d4ff2087ad143180fdd399dd460dbf4407cfce8af7ac96ce250aa07d18345aa204ded2247c498c67ef294cfa255d9a6d1f0721d78c203021cd40a0a4e60e80380d70832bf3d494c5be8389ce3dece6ff4f8b973896f22189164cc12ba719bc47ff1ca5cd9bd5f002b48da4447dbdf98870a6f2cece3e1c36540ec1ac796f1c97b7102ce1685fc5d8aa224fa548a1eb20435280b3bf025f88d839d46367ce877103202b1feba3cc10a7648ec27bbef8302f1096cec1065fce1c1a12bf56624afecb83125be910dbdfcd3a78712d8b4c07cd33cda4ff0d013088903e482064ae2851425e0c313f6fe552548aaf0bd42a98ea7652c3fcb2bfa17bd6c2cf5a2897e8c2b495ae24329ef1b84435c2c33ff85c8da8ff85d7c27b47633a1f17b9097c1613577478bb9383d8fd3d388d22ebb4ea4d9ff5a19575e5bbb28d30ff261e8161cdbabe222fe20877bb47b03a808f4a080076c7c7a508950598dcae66821abdd522067c31dee67939ecb6edec243c2703fcc034c9871cbb07ad33d3feb93ee1b96dbab1b2ae26bfc3f64a54d9bbf7fbfabefbb2004499e422fe936f7a7bfdafa0a7ef2000787237aa4944827f6612554da503874d6d8ab7c343271f57dc9d68dc769bbf6b144f0c5d8acd34b2e68254b5e4e67eae19b129e711be9904a8f067761072b0c68b5ac9e1148cc81eaacf13077248adbbbdaf455d45632ca348bd426f1ef5dd44b28f242fc116e119300e245faf954178442f2ec7b145b1cd52fffd861479e60445651bdfea4816d4732a057d6f81372719005396f0994854bfcb99beb036fa8a6c3b874fe8f538842a07c53f10b5e2acedb83074834edeb4ccda33cc206e410fcfaa172b4461d99de68cbf6c130da672f870c12fbeff971d0433861c8c3b2beba832573c62830289338381cb7d3ae40e89410475444237e20be9723cc11fa0b61213b6a5054c1547722fab315ede83cf748c698913894c4fdad0774d4008971d50f4411159b723e972385aac29d397d9e59e3a653774fdde9baa5842990eff511a8ef157d981f9ac05f886d1e4a405ee31a0c0110d6d4215e6a2f44205e73e7f877894fda050108d7d8215e6b3fc403228ad6f3d3cbba9734ae74a98df900a97a04d61bb8fa7a59a58633e233256134e83c43f35000d21ad12484825aebd741fef825d31ac48158b3aef8ed1a8f340de1a0d7ba43bcd016843448b275677796d702c92f946b967658a139de2397af151e73c40b28fad68c12b442e7581c415aec1637d86c4b20c68a56595088f6655f140e09ef18d75676fe3034104377f81c38c5f8a26d59f637e607e6e93ca77f4ce692a4ebcd98e4f1731aab804125eb68c8c17318abb0ad75dd21342315196a95f27e6f15a4ad6e4dce0e36ac09358ea301557b710dfe9e895ad62121c5df4a0c5ce6314133c9ced4e8023cbffcd05412748028ccbc5e72efdad42a27067a9e3570ec76dabb48b8a24535e8d4728207ef806c66bd301d6fe751ba70a3dca27fdf60b56e8c03ce8a8b01ee54c390f2cb213ee9ef50f81c8c6a8c28befe0600d7efd24c96a76d0f07b2e7cf2635219ed200d0f5759970d4faa8bd6a7f6363eeeaec193a8835a9c349f5078d25c041d93c8958fc7a3db221f64a030607a3318667c703af9d17a044b14b00ff08be8a7e8ac95052f9b0aaf99968534d210d0dcbd2276e7f890358895d6a81968dd49de24e8c885faac7c038182a1374a104106efd8b98c91dcaac80e7d8131ff68aa91b0836cffd39ba2b7c7652c37d2411296913436a2e815e5d0fdcd21eea1d3011f218fdc28119743b391643166785eb1b67a761316621d3e8b18ce59f7062398d4bc8d2715b1d2291a32105f85def5ec0dde50b7fb742cbbddd4274fd9148731759846b432fa7955eceffb0056720941df74c279c4f23a5b1725b8405e499089501325d54470b20b13f87bfcd11139e744f6a87967a9b1f6b3f1d218282adb81bb46d1f5bf33bd1761430075201e2293d8f1c8ad21ed1a22e313322347f41736a3b298ee837898798ed53d0bc63b74a2fd6b350ab016ff69831f06f1c7deb42a6b48e49499d10de5bf4775a6f1ea85eb609ce0745c008b80cc26ffa5cd59d4dee526321ba4d3d918d05c7f1793b940b223d715b9646bfdee62869396eefded10180e6c30d85daf6d0244ff3862d6d071eb960ece3d419c75e021fa15527dccab6bfba707e188c89e45009a91ef9c1cec23421f4d491f2837672ec40a51c030f7c0083bc7cfe0b55589ecfeb7e0831c6fda661ff0319d3a5981fc8825bf0a389e61b7a76c00b40f5fa5f4927510ef7e3535a60fe2f64527bca6293290a28c2c13d16c91516113549cce0d097d08102afc365b8110cc0816b7d89a4db12ea7a08bdfe33d402ffaabae6b635a5ee41a221ee6c783c57d6a29c37b7cb51f7287a30e356950ddde3212dc92b5ab9227a5711929d26b885c4db511c495dd95468273b31c63ab5c9f35b880fb0358a7dac3f14a462b77ae65816e1b65e9f7ca0812709631275a78ee52ee527f5d6b383320adb66c29e7614be38050b6bf1f035f7509c345b7fad0af6ab319ffaf3e0cdaf8635f8d3c67f9911ab5dfa6e307bb2b9df31ddd19abb68e4182054374d6cac108fff5611efbfd62e47abd2948502d1ee23c50ea3b031fc5c15f7e0251b6f0ce2cf6d024bbfd40a83c543a1dc09558501ac71842d8b1573ced9997e1fe094d03c9c9b1a59458b967ae838a7c1060ff539839dab1304e00d5f84e74c7881200ba0ebe8d42c45b3bd10cc44224eb95f420514f02f9a44046c7e57f9707dc5e8a767bde0dbf9d498eb9cd678518965913d86c3659c8b64f55e4b0dd86aecadb16498a4e2bb17de4c2ffc16c8b6b4836a6d0f499f5d773ca7a46c867f86042212a27b357ec972aad4f60db000b957d0bb960efc274be644d5df222f50a051baaae9d7a84f9b224189de071ed374b42243839331396aa21e15a035aa48c8341e01a755020cd251427fb4fbb0714a105667fa76b1d1d0f6d53781e390b1dff41d3378d79ba09a1e71db8587903f8d41ee443812932a683bfd1b004fe6313a75e87238a8b8fb0cb2be234167d0827559982ff0e6fec69de316a0abb64b4a213cc079e81b9b7257d496d56ea4525cf6ae2ae14dd6c9a68843cd62810dfd267633c6f6a776519db96c52b540cb81c48384da553ca8fc158445fdb9df28ac2ce3206662f47a814048c0dfda92a3000db59bce168d290c249b6e6c3f2f3646078e87768d4c71ea24ea4363435fe7841449bf0988cc0c2c8e9b6c0a709399603709a343f2d9bf6e58b7e35c6e1d798cfb42872eadda0516032752cd12343d13ed5be7ecbd4c421712c5922463328010e944f011a3bf2c5f5b6513b3b9c202f38705641fa6a591f3a0cf7f0a3a576c46f00e2d21c183f7d8ba0bfd68290056072cc0b5f7d859d4d7650e75ed87d285f9a16b2384b5296e271b881c8a4c1f52f6b4fe42dd0e65f026efc8e90ba3d7a1c06fb2722885199114dd93f4fa6998ca76cb061d9fd2fbfa6b76012ad40636f271bf34b1efe9b4574027366cf9d16d4970fb5252d97e636303e394388c91c4376d04010f65741504d536fc1704135926bd38b812f8a4bb8b702b3031fe10eda80b55bbb201845ee4ccd3404ca37aeee619230e7617c71075b1724bcc13b82fefe1f28b50d37f2b0a10638d61bfb1c1011ef557851c83f9786a3c4fa930f4daebae17305b959a9cc6f0cdb97f9b3175e3618214d76c09ef7042cbdcd1fae26ae6426bb193dd852b1e2e31e7f67f3ee63545f3f94c7fbd5b132deb1edcf4349efd07556ab2f9c5f33860ceca872580cb08485cefe6667201ed2db703f193766770bb628927f1346ae0e08a3b1a95ac4c712e188c25ce0f1f3556cfc9e2176a4fbecf8fe1ba637964da46e41b1207caaab553c8213bbdb2fb2115ff31298ed5e7d3a682702710441c40a4627f93d1b096765af164a957e9e2a2294c25d37ea998151d2ea14ad9cccce53fb7df340fd4711ba5028c3e2c5091c9a16b5549db1d236decb82223716960bf0499a49bd34f3f182364535262cae59f5776a4296bcec12a2d900e409fa90e6f261e7124db1182fea5e75c698fae56df2c6a779d009343fb5d1c1e1b80dc4788e7f56a1ab312133a6c9cdc02f89c0c6658963c232b28d1d31a5c30cbdaa49e6a3109429696761fd72c6f913f155892b4aa8b8518a8c7528ea1df190159f45d34c1170210fb7a853e363ac2563f0318359876df5dadf979d25f5118eb834da7ad3e0bc35f9aa9580d01636f5e019d7f278fe8aaf0e28ff8944e55543d20c32739dbd1ce017b8f03d810961a6cea70ec4ea1d6b829c2ade62b695609cd03a1c88d0fb174c343bcd35be48cdc75ae7ffce62b0cb4af6b001c2b2797d18cfcbc76d56e34d5cf0f2936140c5a3e5174f9254d815214a8c2efe866a5f77e3242640fec490845fc9f54e3a7986e0a1f6d43ba411a1c09cfc4eb43800f854007eaac6d82d05896b97843cff3ae1d84a07105ef4a59034ecd067de935873011a20e8fe79d1576b17613294c06bf36e5af497808e283f33f7aa9bb8c5649f237e99714d71fd35ba632f155f1196ac21fc36451d2e5d0da6bfa5d45e4626e76f910d0763ed9d7276520ae927716c786fa34edae44e1a3740a6ca9b3201a2287454b0321084a6533ac0ea1eb3166b93b69619da5c17e21b9407c06c2393c33129ff65cd4af4be3479d83b6a1700d0efc31d00e9a57cfe0fddcd06a05f5aeb0daa2cd8390cf1e6e30eeb36bd4eb966cfa624ed2aea698b71a525fe53a64d4bbdd84b597470f936ee2dcadca7031b1ba55d6f1c5f71dd081b8b27b209026ab924481397ff9e83bf48a83e9440306613e044058a8b2bd796187a253a54e8fe8f77007d89868c3d743e9ff2335ed804745073414c567ac56d44c320b612b68ed760ca3f4f2be1ae6ae5ee8554a186e5448e048f019c803f401b274571a2d5ec919112d17e09f8b136d00c41ee3a8444d8aac6988f481458454ed15c2dccf7a82f001ff6372c21f2b930f41f25d0ed47d35962e1fa874ac128005af9d8f97279ab6be85dfa9ab20808fd74257efbdba1af52531aca3ba1e59d32cefc724246e599dea7c8ccbcad45654b526d7ab984ffe4c76b1b1ee7f035d427c8b3f654611e71ab743b5ab6e90b9e21f3671c7142328872332d82303c512be98b206cbe0df650497ba0c1e914e9a4c16e69c9840df6fbf7aceae7e6d6a9deeafb53a4d1e6333ebdb494043522d41cb8880bfd56398da03a52af96c1905117eee15d7c1aef4d9811f4ab18c69a3661a11cd8dcba6e452f2eb118b754a1515ec85d0c4a41b3e06ddee2f3ad2b566f3eb75dfced1856d1a43371f0bb2e124c5da94551654caf91895228c8b05cec427f637dc3d86988cefb1e1da4e08f8367a775a304f66adf781830fbd775e89bfa2401485af3108c2e401a39bc3d76b7ab7f5c1ec520fd03f098fb8dc056acecdb4d12248269b2a7195aabea182f44d335515c8375e2ddc5b7c0d066de300af4212f08af9fc0d88af1c7ca1f1fa77be24207bb80a136c26113d79d690243578b8d1415659c1fb6738e52ffb5499f2ab527140850afb06022138aa0dab142dcbd2c7ed74f6e2a77e5e0e8377f7bd3e7c81946e9bed82626c757ba85b536d859d46b046336ecb3c2a117abe207883f53c978f321aa469170cecae3f80ac928b831bb035be77a083cabffd135df035963df9f926c4834db2611262c9e5f110f70842d0b5affb2c34a4636a8eac3bb395227162156e168ff734ab84153860d9039b191677650d76ee347ef31a3ca3de04d67a40fd5eab590784133f5bf3198d99f81ef60acaf9102310e516b41a439cff7aeb800e8872077438d70b02d26a423451444dd0a09f27d4e53a01bc8cc2816d7d8e6b9e2e0a02aafe26302f05ab210e727520a8960a551ebfd707fd3d63c1938532b094738e26267c789e7fc078abac74a24fd783ab1cfac45483208e4bcb0a9c5efeed27a051d0d0d1f2d355e3b5ef10eaf05ee05f341a1a23f57109feb3c69acc2c6fd4e6458687763deb82775f928aad80b4949b26a371b497bc6ddeaaa24c9ae7d0dec0971cc4d85ceb9f83f61e7f94eb8ea017afffdc96777fb43979ce484f15fd61964dfbaeda24eaa6166bb979283756786c768ef87130131d8788a7eef777b05f92fd3ae599b6b4c0e634631da0415855976e0c1dc557e7e24d615c385585c96d6544a0d494067186b80061eea13ae8612520354be4050c6fb99c4ef70abcc236fe3c8447be1d50538de8b3e94c8a7983e3155c1540b1384e84774029884769a83b4d65ea3a20abe28a20552b44f72bd44e029b45b8251af12f544c44e8354cf1e36d561fc582bcce8d76d965041da12a847f560a332125f56a5de351824d5adebfc784d8c7aef02d7fce8411c82eca86ffccbac7e624bef9d5389643b2af4eb4061e3f760d2df92016d021b63fecaab360e10020ffd8c2afdd1b91b6ea472e317cf435e3fc6dbfa6e6165e6f93eb1451270cee98d0ebc5844c63d8977220cba00d984c24bb64b47eab41121cc76c9f5872e1c92fa930dc64e2e647986e9364fc1d87abc5c8307e123b5b3d9978b6750a9d4597e7dd006ba69097ef76ed8d171ec555f405b366617f95d79762f221fea45d1c2fe60ee43355294ad29f4251e420ad1184df5e62c81ac189b009bc570bdc4e905aa360843ccfe23d5f84c9d4903b4ba8207e635fbbadcb24cd34820cf57ba06544de5274d914f3ba1c6755e72e955125954ba42af9843d9b524854916d41b5c06928d7fc537e0ae12666d38c1c2bf8b7c4e524b2449e356282ce713ecec8aae7251bd809a1378d9ad58eb79796cb0371502cd829438ea492747b35d5d043a49166c184010e2808e25cdfe295a7c802b9aa59a3c7799a42783bcf46a007dd34c58f99e72e15e9da562305469566708007d6cbc6a726330d3e4946077689f21206022d45fc7c8d63e82503d9e0846effa3da1db86bbce78bdc4a3b0baf2c9d739848f0b7d0208aed8a27f93678da443ee7993351a991e297d5289ffabe90cbfb169bd76108d89893989c8917d797a9204dbed97cd6387737de8e62b32b9497f1f689839bbbe772fdba2d169fb85cff9f6372089b5a9d1c22181e37d643e13cf32453b92ddec8cfe5254361d7433870338b0e06745c041587e8d55cdb59575f0a6773e81e0251470e5d4166bd152dab16b5ebd0195c56afb7286c3f9bc827e2d1d88a5aca4cf967b10d800893f341ac2393c26eaf51e3e80b3b4933e592fcb8fd14cb6689930af1351ae862a111e931a333d459f9030c63259d117665be625ac61d0820db802b0c3a4eebf49a60070b4ee66a57b4dba7470e38cf2b318184a7acc7861543fe1f9092bffe78595839b46615b965231dcf35b850daca02ed7fea203d529eb54d95bb8404fa07a097fd39d942467973e543ba45f125b33c4e592f87faba0e88a58879b70370affab55adb4a0be3233cc00a76cdde240ef2aa2851c9c1207510588b08780b05760d849d7dc3810051520df21aaed6ae1714021239275851a052f5c5908e0183a665025c8a740dbce56bec23f4a3a2f370015c0ce3dd0619e1fbbe9dfab828bfefaaa261a83c066b14eeb81eb78749031ce0e66078e307bb6e77549a57613fd489cb07309901db6aefcfcd2fc300e872e07b85e3668d89b03a1614c84cbaffe285db5f04ba8b5405dbda0609e0786e134de77f16c481b2e825269093f4da95db1b7d74573f2116b001ddb0b2d94a342b608fd719c06b950505bf104d755ce44361c41fa655514a55d53b89a93bfe9929c2d4bd902a494730da2553eb5ed1d6c0187d8fe81b3ee2aec18babb1df811da610f8216f5a6147c1c9cd5074b79e60340b461323543107da2c9ba6dcd72e70a523cbbdec4561520d0a4349218bc32c7561cc4fa2ec23f1953460c63ea33dbd0c338df65307f52781c6f06c4794d575ccda2d29f36b2019b73c7bdf4b145d7758f53bb29c3fa52bf60c4bfe2e924c20c125e8ea7bcedef2a9618e90fa722be3bbd6e568a7cfef39ecb8ca7af73adac2265934677b029c9e2e5e7a03be01e410c89138f2381b419d026750820d81020b390d7fc81e3d53140d87e7641916446dc106e6c0696d7624f625cfdd8a4729b6f566c1620bf90025e01862d1a3286e6aef76376f57186321f3c3ba3a4f44ec892ffee888b34fb82e1e489ce05962ee64110e1a028ebeb51e8dd57a6edc0ac4d118986421fd5c8603bd594fb47d667d97f1d432f70441c06ff75070dab152f4a247ab242e5435504291c909e0f545d03f6cd659f92d472dc90729ec69f8aa27088477587b8524afa9b6bfb97447346c324ecea4ccb2f0f7791970afea8adc7a08dc412f02e56ab9a44415339cfcc885fde72fe9025894a148609db9b6b9b94b28bdef1b3aaf1000b160d0acf86890e406cb930f0abbdd54811e796ee85a315746495b52d5c0141772ef8da1867fe46339d35674116ce1d2c258205125b311cfd1fc27b5f0e9873877eb01498cbf3c90680a7b855147e7055ee5f21913698a12ed9792ba0972be7125aea59a2e52989f1925ff0600bcecd7c0e63159a60c0244eab2d32160b493c84c976d37c980b23c97ea243d3fee8027a63278df871eed1e005c3321c501b713cd37215d1f8a8648fc7d2854fb44788041434be68ed4f07560aa500f099eb3f32d0499d2fa8fd1f2f40361d61c3a88a4a6923ad6d601927a2fc19636b138f45ee96e3433ed6574fa17e4d61323751b237151496ae1d583fd97bd8bde5bfd3a30eb5598d1e58e8d16e290ed1999a01ec696a8e8c42e95bc91ffd28d51cf483d80d45ae47d51b1266a45a67825351cdd9da0652948f71fddebeac502ce2fe5b115025d5f7ea29e5659992346a6a2f35e4e1a56d80e58b73cab326ab21fe985dfb4361435b0eb1d96cc4cc051755300e1e92059351416a09e6b5a610c6a555750f07c8e791336b359a0d36dbb2d011fe116b9e5f2ddc5ccc615d742a0951722185817e389111003e7bc038a565a782d7e5c1c8aa4ec3c39a64ebbfd014068edd89d935e3d443d323e5e84290e13d824f4d2e186988737535f1328ac66416c6bf66c6c8a653458c9ee3b41d9e2fc4f8ecd3b358d1bbd0221f1ea0d608793f02bea8da2d5ad101e20fd6ca89e07387a501adbb420e9734b57797fee0c7b2413e088c80c03b7c483d90156554d1d9455af936804348b0077b700926cbe26321f4995e28312445aab0017972dc9b7cc21c1e50d3946a3e4dddd034e3de34ce9306795150b226a6f4340ab795a6301962630b92341247ad8cecc9c82869136e865a059345a981a0fa80e88fad201c04670e2e5826380d3c96b0f63d40af834b5a6260e49730b00a5140e613741f0943f5761ee40850df91151cb531651318843e8d7dca30fd909d003911a6a1776a60ba7c17eff05683650c1f3aa55e81b13bf6d9183e5c78c8c31760107b89fe3547eb85e98349e715c1f661972d80fb855f150087b5d552b214d4886b52bdf7d901c042c0c330aa26492b6d8654e24f3c7e6615b17df7f0cb6fc44b3b9b826b4c6c67a87c249b714618809e682a704a763e4c508531b0d4a0aff5ebc3e193d847334b690e5d562e662fedc68cbd18d46ade6ac1d037c074c9838937d290e399d4dfa805283241b1fba295fc70b1f13e7fe0efa64d2d66b37013437e7171b02b945cdf1ff3ac2aa5bd5771bc84875542911914de423144abea40dca6520dc8d700ec792e22009ca89be915b01a16f19321398d28342629ae6ee194ce3610fb2bad78595270b17cbab0e1952983783d680b0e99cc2ed7cf273a7f8dcae27fb5d4a9d2b7131cdad41af16616913443986cd3da85afc09d98718a4c3c2dc761e6b498b1e4ef253c82768e46801c07adc9a1255546746e3d9fdaea0f4c5d5fb1e096479c159ef9cf2acd614445999e29f032f3025104e9ee6492be4aeb7d5ac7180a53bc199b2ca46647316120ace88f6084abbf128ae9245e914b33865249013daff59fbcdf1aae94a8f0633c49e844e0859c1509bc3f4fd10757f680579f1e81fe50ea04960aad197d18524139fc3190233e78783437f91bc15c1fdfad10a0e4a426dbfc7c90c0c93a135e075dd8a5c3927dadb61aa74e21bfd8eb5e5e90938362711c7bbc5a94a26a31c026c53d2aaa3ebf225818ad2b2ace5b9ee815dbbca32382705a01fd7e6af827e6020ed9e58c6c7df739f6f18e05a2df32ae5d499659bae65e70b2b8b58f60c6bd4623a9496fccc30100e71ef24e101ea96cd636f817d1e20ce61b74e6d4c1fb1a57b387087e3e7a87f58c58d93b26cac77f55d301afa1e9a87d3824695ac5e1ac5f7ec68196dcb098e2f05421a8a665fd54142bd6bac85cf5094525e0b912fc6f087acf2225003b550faaf93904f81b79779a4bdbb4680f5d8d6d84b23088588f4acf2d5b2cd494924a85d9083962dfdbe557a6d025cd516ce3ecc9ed8d27fb620f2ec3a3c94be130a5434929c08275d9b09affb92c6c5686405097f2b59618f2e62ccaa818f9a8234ad0a185911000e200b10644aca8c1eabfd8e7dd4e34c79af22476136ffdd7214a1af37500a24b80d262917facf13346b800a81874befe67cb476d77fcdefe7d77f11c04ed915fb2380fbded2841fe75ce4d80b6e96fbac837b78adf5b5b516f44e7912b6d65bfbced642aaed1f2c06f574b246362a9dabb74b267ab42387e46b3c007dc2d717311eccd74e44703ddb53ec1263503ea07d8680a5d96da978e58216826e033365c1c6f1d5e63ea088f468b2eff8fed167ea9d890b400fde19b163adbcd25fdec0abce004beb8604afb864cd5d876c58ea1da39feb460bc4d1b48baa31a3c95dd49e0e086e0088dc2ac2c22c03d88fcdbbbea3664c271b22efcaf701d313474dde8e7906fe56757e0776a515053e0de95b511efdbe52410fabc255b19949ed11cd356f216a96f1aa2a44afaa034285f77de1de8419f7cde33b208f8b186ee0b077134ea23c518ff260cef8ede43dc88352755a4486108c52d077bba2a30ded664e27c30aac67ffe8712ab92b9a520a083416ae1d6d07f5bd61c661275c00862a6aa1536a87d1ad84587ad941fb9d376587c59cd1e03b98d188d922b6c3f821238a3f5a2530f5ae6b475a5a1bfbdc4475990205a2621624180321a4d40e90da00603d175e0661c2647640cb96a88856ec0dbca18008cb865b2e428ae2f415ff8a54ab864fe5781e54f252eba89fb808f67206b6d00ed8d8e924313cbc45d58a1dad025bd83bde5003749266a2eca983330df596d0e084fd2f01ea6ccf3fcdd7048b18bd89ace256c166cabd771e897d9e0c785c08ef2b86fde2bcc207b7295a52411bafca5219e209eb81c1c9297b32464e10d8e5a62af99b4be1c037ee48aabc142048de8c07f1b60d927bb25bcec79c92acde29a1a1a77dba13865709b1196fdb04e198c5397e6852c1d1efbc03f9428e9d4286352dcbe41f585393daa077cc3f64cb86a36b9f31f28ec7081b2780e04f11763c89bc4fd4a8032d3e4f3983c311bb43a7c66732da724eb349baeb9480370f8a17cfe44d4891cc78d489878737ad5b78c8685488347c5c00296c2532cdc2fd9ee9069407582050e65fbe7d71d73c6ab4e0dd6c2d7d3d878f65868d4b9acc6280bfc4e4bd48e051d9a4d512a22e9a39ebc98af0678ee130e88ab0d9a2df17fcb1d565856d093ff523911068c1a101f5d0cfe5116b1dc871f0c40db6e57118c6c3c8481615a1ec54b2f2b7ba2bb134cf2d5137d1ca4fc8b34c2c58ae55cd47982b440f21b71b19dfc079d019f89e2b3e5359ff10720648e88ff844a6f6c98cf3cbcc6584e9e4539ed642bdce5a62b0866ea47ea2a070ac632df7a559c03c9638f6ae96424e0e7a2d386e3aa1234eb34cc484b062ff3f85fb9ab7f190dd60f1ef23a6c09a3b47e0d6c86f572d9bfb77515733d0ff9ab713913a7ce1c8540b1b8ec400c044d379fd422d293b24cb2fbb5b5c03b602b9eabd6ef5ad690a252b810abb65cbfd0362cbb8b22a7330a72ddeb8a7577b1b5af65010af21a9c0cfed7827a9ce07c39ae6e1408b194e2dd4175a2d17ecd5159060bf23043b7343d710762a9ca6821638250ed60f0806ae6353baf426ba76b8af2bc4479106d25861cb3e3d4f07510563dd6cb338feab820d1e659f3083f8fca729ca6b0c34c7595933442b6eb6d50bc85e2382f3d905a5fb9221cdd07a48475bb0c796377b1221e8e5ad33416d363c0e811748582a0c2ee81618565e5028b6e4d21a8bda04541e171cdaf1d2bcc5391131c192e154603f81e10dde072808dac46817227d3600d576173e4925bac32a63db2a9557263edf96f7bee0bc522a42cb1d420ff173f63c4fce9a454f5f8348ba1f758a377e1f6b3d78077d83fbc695a9a26995bc389c111036abbf9e8189eed54c9eb58d9dfb23151e5e71b21ed66b12b3aa83409d02dedde4f8e9618657f686f0e3aa7b75b318a84285304225131988fa7f20a7f54bd8c8cc8d611b1b6bc2740d51a02ce2142e9f3452bfdf42bc9700022f4fc73b62319776ca6cf5ed50951e8bc247d1c81372487c68fb02688aa4f50a96adc2fd43ffb2d4b4b6a58709a5b7edfdd4f01688ca067d820fad9326dd40704bbe641823ed90a3bba1b320a4a00acb2a80b34fe7c838e79299b9c761a4e0dc7b869db97ed7a90a80641770c000c122777d849cf4e8efb12875dcf9bd1373f30232b1cfdce5a685d886d1b5a55df313a34322e6f63afd4f54db7c8524c29a210401caca35d2b251ba6b15c90792f74180275392044aa94144437c891eff7514e191f90f937035a8fe18c9b0d3804adfa82969e53599c01125b40aafc633de54ab8836f2ed68ab5def9360a3acda8173d8cf70731982755cf4dfceef1b3f5d5033b445e5047773707cd0d8a023c86654b29bcdb5601d320500ddf20e8f38c0f0145cc2f4cd03b887913c5ceb575bece57d9b9b7d1fc4b5957885f8c052e1e4da1a01657824549c0b974217f59e10ce2e9cebd1d6ffd661157a587111a6da9051b24584a8f02ad02eac234ffc4c609a550d6f7ade1b3d0c8ba43eaf7b6b90b56a7605c2169593e87b06ce685e1c90b664becdc126f3eaf7a4096e03090e74792a4e6fd8d36da9bdab05960b1c7233096b429869660c4f1350cbb8182e9a55c81d060c97e4f1c31dcd12c7e28158b3320fe260b8b012b8b102e6e6331d4c0677c20d8246900cdaf041b4455813b9624db611f538e8dc44bb460bff530e773cf8e0227b6439d9e7a6f10403ab1940f7bc0c572fe01c08a60a1926339a8c5e23920de27e756cc9b1359206ec7648641b41d50abbe7ae3d7bbabe705d26ea271c7bd3efb4ab88f1bf2b8bb9c4664759909ea1fe52da416f0fce4a528372c24dd79a48f0746431ca50d6162ee90bea2883b174e90053f37ca79cbe2f4d3f79e45e2b8ce9b8b1c7725f61353af48e5debd15022c2a6cf185a5fa818ac588b77a50dd1b60e99abb93e50607fca9f544ca8969e3ced34f090bee8a008a8acd9bd886905ae7a17d4f94faa2fd62dffe21c7bda631c29fcfe44a89ec4046a06fe67eabc3214359e8b368af3abafb80621175c3a627c0a912e25e8de50a62f91da38cad7aa1e0f35f241cce7963ed362f3682b68c7cf7c017ade6b387abf70e929ba4cb7578a41e7000d67e0dbbe18742cb6129e557b3a407225441854d27508a50edc6004ea7c7fb457204cbb4a07d5692488b70924810a29e30a2d1c6083d60163a349b349c2cd9280b8073a501e17bf6e26df1b9a5c950302d1955ceeebe7831d05576b67ccbf11ce5b18b70d7b217f7e390416553642f6265beebd654a29051f0b280bb00b0ddbcaa24fa4e01191b43a62051593d207840a1d92778214e611522a1f6470814362aaf321854d88a2694709b42d485c1bf2082edb19165c8b93366351567ad2f9d121bcc8984fa823f6792204aa4d530edb3adf5747e6ec1e9e5870cd3aab11510eeb9f959ae13815e8d34fbf39a94e0a4d5ca61301ca8c7365b186f16fd73e7a953f27092ae717c4eda038778c41bf378ce87786b7416fea3ec940668d0c563815d4a6ee930c4c20d1d510ce85ca20d80cbaf5c06368770507dac5d0686458a10eaad57d9201054e43a71d2e50ef0ddf42bb3494c468332857f7298614d431e646d0aeee530c59ec6c40539377604fce16ba93ea5459f7698832eae822c21b79ab1eab3e9feaf9573ded6390566fe33e0617aabe2ea80b45f53ad5c720ceacdef73148a47a2bca9a36adeadd78381f83b11553bdd63ab978e4a91c426955a2eaed7c0cae14d55b7d9ea7ea26c76d9adc4ac4ec33bc361ca7e438517e108af3740f7797741ebb2375b8d67420297338e7892e9093c451dd78f4739b15b35645ba99871491f247ba38bf1bea1ece8d0aa7fb7efcc76566d9e2e474a47fdb26864a8dc7b789a1fca374edbabb3b9094cee3ee2e7b7c459a798890d4b49e2a5f3c74943f5d44f28bdab8a49452ac727b5e3c3d5c3c76745a3dace521fbb2333c1c965da4b979c84d53f7cf46b23429b7f97152d3a4c72b447aab45a9ea54bec5d739cfe97d2e17a5bcbcbb05e56f630eb522dddc3c847bb9bddc406933593afd64bb7b38dfaea47c77779737ceee1b145d77f71c570a39d5a5fbb3df546d76943df9377277e98a65f363ac2eb501592b5e9876e3819beaef79df4a761d4f26171800029b5033e966d76923e8b8db32d05921fe2c7542e8a6caebba9706aa3fabba706eef7437fe3c65e7792b253d55ab1e9fbafa40ef820daa3f773f375578d385a0b65c08aaf38a5adf70b5b988736ff586deec901c0e547ff67861a0f67be3da8afe2c5ddbbea09a8685993dcffb56abcf8b857169bf5dbf54f03a95e7e347ce0f1f4088c462437cf4ac9650f1fe9b9e171886168c8cf444886f306281cfecf2a291174fcf4a09f501c02a8828f200c08c99270ceb0f032ce3224dd55a46729902c030d298a5dacfa38a818b7a0480911806963de170cb82b24f8fd57f4b0940fc7683945e3975df7b41d5756e88b0af7b5c8c94041bc0c73a5046da1856f6c4e70db58df480a9fda3cf98200a58581b59213150fed18890112d28bf37008eebe15a2da1e24d80adba8bc76a89076e6810215f7311fe9d382b4ac70c79ecac9678e0860a29c037fb8757307774b6001cb73aad1d22a5901124a86644933cc43e2f8c1831626419b0b2f93dc327f3c7e5a26e98a56219c9cc0cb761484fb0a017ece8f02cb74b2da77609bd499cba2c9bbba9923bdaa9bab9fd10b95529822937b931ab3cd7ca58bfdf8fe28fb1ca5a819f2729f5be55d775df276b2d13978b52292593aeeb5641feee22f01dcb2b4a968daaee7f94a7eee374bf9d6a04d5eedab058c655f63c496fbedda059552c9b0e5b99f7ebb3ef81abe27f52f9bde7cbd07dc8f6bbdaad6e22a8db90bce1aa73098db3d5f58d4273beee129a46a12d9d6ff60ff33bbbbba7e3554adef93a0c2a5f89c7b71b54053057d67561ac613d5a50fbc757ed1f739a76e1362cc643fac17cad9c9c29ae7f244d337556cf667f9f2a33096a9018901c95eb68c44907673e4a16561d370dbf0c5778694c652d95bdf0152d5ba7df91a32ae7820d4b30d100e64b1433ee82061db2b0020d30d6cc46eab45e56cdc84d95b90c8144edbac90d8142e57e5b1de1b42d48d5acd07eba4a8980ea42b450bd9f8fb0994ad4f156077ffdb4d9ebcfbdfb6be6b0c5ab23f27bfafbbfe7aa85b3dfe059b94aaebcb2bfcf0e2623bca8f2e937871a362668c9224595cf5a1d912b1204217f85012431cae4000596252666b12aeb2842ea4b174757b6b062265f5cf97256a9f281fa67b3e8a2856902ede1208cea00628cf0885c5501a28b8f2abf6303081bcad0018e304f2cacac3023c71465e800870e5d44668639778a3b6a3fb7c5a94b123fe4a08413194feac0e28a2a389459c1e90e2821b68d013fa4d1c33fe850c12a5fce355250e28da42c689821c36ca444456491010a247628e34c1c33c90eb3038a87afc77b2a7f10ae5226675c97a6e8af7f98563925962ac71cad6a1327922592f93380a52bf2a36778dac788fc56b576c9f7b8c8f6fc6ee3e5e659e90387f1100f5a942b44fe77448d54f94f2eb03226145898fc558364ab4f6065b11f2f98b82c83854913d471a7a8d208c906495920493648caf6bb42946c90140e74c00649993fba966c9094ce020d36488acae7011b24c50300043648ca17800d3648caea77858c02c86083a4b0fec70ae12a2b84046c021b9db042e47720a300720a5f095490c0ce8c4e483a8191bee59c8baacb0f9eb4e8ad41fd8df40fbf873dafbd0d570d7c2de1105c2d4a354ffa678c0101b528b9a8632d0269445a94405ce4b21f01a8f273ced0918be48f98cb9ec4808cf84814fbc715848bf4b83648fb69e3f2d26212a864f3426db3b25d59c5266424908bb8284a8b4f7888b4a945669092bcfe4ee0b1d8eb6c6cb8af6b6361fecb45b4dff7dce022daf39a96addefb248739cb80b4428ca09f097464a42f89f673cf4a2ef3c2977cef59efcf2fac8ca71686b4411cbee437f19ef55f38c4d4e47b2f1c621ab3789ef75e5882cd53a10efb2f1cf29e8643df23b11cf38d95b151c37805d59fb5e2d0d00f086792cffad5fb5be0c42a7cfabdf7a5504214121781818b3417d1c2d712e69ea372e6a0231b316be9239809ef5440bff79e8d8e36a87b7f2ec1feb014abb1a2bf2a34f21c16b2f31cabf1d40ad1c2a09c344346eae7c2282d6e109630c443dc7bff241bc46a5688bfbf9295f11c0bf30702bae002180c047b3845a0675ec85368282bf9f31252920662a98e444682bc84c443fc85ba8bfcfb684acdc7858fbf0cd2a21017e1ea1e2591eefe398368e8483f13d09148b542472222901f3eaa7c11f88e3ad217cf08c2ce0a91cfa353432416fb699990e860ac0e1aa44519a6fa1391af255c3168d9ce8f2ae58bf26392488b52eb822609855a94efa9a1e387d4878bb478887cc92d4cbe7ca1e6eac2e4fb6c135a839ae9e686e8ef225e74caa0acb4001db669e721756ad8df2de77bf852126e8b1a5195475e43b38399aa6d9f8324f80a71919caabdcd91f6495cd67fb49a365fe70ced85dabbd7420d346ed3c2106cccac7183541d47f2d191cb807ac965ada3a98944bba93a1ff506e3f64e5af48da76422ab31ea1fa4feb982c65ba8e337bbe8f0431d7b4d1d5b86eabe75fff876c9214d652aaad751cd78d030ff273adffa11e8c8e5e235de56a4949f4fe56aa545fffe9bd7a07a64fb54a1d6403e021969ea6875e3b5c097f63db8efbc1b2eaea7bfab08eccc28e75d4d74bef51a18019d6fbdf7a140b57ffdce9c67ae85af08ec3ccf73c0e35f2115d7f3789e900a5313d7f3782a39bff33b4bd3a23fabe1a91697ccd7727ee79db89e0738c4d4854d5aad1fca799d67a510e66bef025d39a00553d09d3169ffea5e5d28a549cebb24b0337174f1f851649abfb39d0d7485acd4a23f0f90911ce6bf03aec372429e9a3a9a3ae22987f97bd0a27ff0840e2ac3d71259e5f62d7067131c41d07e0481fb1184f9dd8f20a87e04c1fb1184ef4710563f8260f320b0de6b1d5e29c109c79b6d813b4bd33f6a68f5a75c3668a3781ab23a95c769401860594ec84d0ef3771710500ecb72c2268e6ab1c9659ca661febca67a93515ba9fe32f09416540bb90c8b41838e6c46cc4d47441b270d1b9e57f50fb9888fe69a8ff86b50f67777f72eedb1ab79b88dd49a476d9b8f994159af62490189bd5e564543a323a019eb519833ef5188cdbe5fbd4d686402df3163928fc2ec3e88d7d10891da6520e1c51a3ebcd0841b5333ff024aad84a5c5fe5ee281a57fb6ceba8d5aec3eeaa25672231f614fd84db55f4bc21178c544270d8f073432c4ac85057d81437d9443095c989510f36f252ed2d5fee6818b3ce1221e3a8087f427e121fd68d00fb808cb58c961fdcd49d43e7a81ec050c31a2663ce04b31f37885a4ab875dc443fa83165bc9654d02e623974169583f270183920ab57fcd919686464649aab9b4d20dd42472b5056c48a9c9e60d4aab724ec5524d40dd271ca02a154922154835c8ea08122a9e4e5034f3cea01f11b4fb5d55a0fbef07ba52a20277e655e848b7b0fb7a852ad210a3ee8ae3f6e3f6fe502a94968359e65397cd108396a285411c2b0515697021e38e33c2d4e0031524a0410d0d74a49975bfa81579ebb25d0ae5ea7663179717bc0d86900263a4c41a3f70618138aa58e3e9e8045674c1e58ac66587d509ebd46d4e31385cefcaa9fb34c518ae1db6a0f10bbe784286267ae8d2c5060920b9418232505f98a14414ab303eda68723306644455f7690a2c4298a1fb0c46972ffc46172e5d86f0a82e3a4824de69aae25881bba1cc0d676e40d3b0adae26c0a8336936ff6b996bce3927ad818986ad14f38a86750d621ab6fd4d5c0183531353a0304b5a6a220924a826984a30b3e1a8892c28cc6868e2ca0a50b32b510ddb3a4e3adb66cc54520fed857657623d759f6ab041c6e08d5aed6a0dd2e23eac0aa9fc637f5803d0c98e01b5b8ef75d7a014b9fee89d83d259b20c25e0b398c3f6b584ab4f8bfb6005405de92b485fd183c8988873026529a5949c8302ca3827f87095ebcd45d1ee717731efe29c20d7dd69d8b8e9464c395db6f46de5e65bb85a1a6e97da74f5a8984c871141b76df3b05b366b5fff70d709f68ada6f22a8fe5b75ceb990578826b9965c5e254115b8ee436cdb4b6e32d98a703d2744f7dd385ff3e97dda06fedaabbcb790caaf7fb8dfc9ad96ac968c60941a8e5173b35c33c125caa53a1baaf2afb85074993e41a08a8a8a4e98f5d396dab3fbb7bbc0507bd526d410a801c715287a2093c597d90f3c7001038731a05a988d5c2493fc559edaaa5ccf00eae853b9a7272af792fbe942e59e72ef92e287cafd4b2155b9d75647381d5cede4949986e6abbab004f6c18d2c73fec4c9828e1f03ead8aadb2f98babddca2c052b728d454d7d4a46c55f9bbf20931553a0151251455aa7ce204511615c923bdd450130c2f3de30419b59bd2d9bd58d486daa2767f120d9eac14a742100f71e20814e838ab13550e30e9bb1d9e4a057a375b41f278e564be8a03ee630eeb9ebb67a3230cfa028b85765df7495a36d1a8dd6ca37673d0a8aedb5d8d9565f5b2b6b0a07cf43beb38e0a874dd5f6083b6ef9e93f88acdd20631a0768f0196cd85754fd358376af7cb74d4ee3730b642bae77625016db60a4587756f06dd444f05766108b448dbc271cf3daf8e60c01be4fd4ed66fe1936da2fd167ee030ee896623ed9a43ea1fa06f90b9b4c8791cf75ec8454d6b837c04c84cb4c8bdc702d9852f9628026aa0ca3dc581e2f0c61aa99906ca24e498511a2827d430eee7a4bd4e1a885498fab7507c97bd38d88688665bf80ee33a2e68f755f51ec855af97bb25eba5a4b22a9c4450a219d1ac5f8adc6f358acbb4e7fec9c649c9fa7daf54ef81af2f94b2819316b9ef1e49d5eaae96f87b61ac45eec711d45685bb5e535f1d794f4937be9434915c29e97077044bb84aafaf02e5cfdf55120c36888d5608f7dc1f59199fb030eeb99e1e1d9d15f73406eabfeac4a0a3ace3acdc6cb1b9392975b99e73eebd72ff33ee817e9de33e089fb4c8fdac1c7b593c7f6fa70aedee9d2a94a5703f65d64d6883bc35b039da200654ef1f09d4619044684a7082465ae4800ad3fc2fa41cacfe5b852e87f9bb27116af101fdaf25f2b564d6ee67edc20eac13af947455f5aa3084d712957c55e8d385a2061c8801934680ff766487389046a42590cf49a9cbf5b40a1921b24efc23119bcd0e332df68fbfcbb6dd0d7cedc71c7cad4b884e979c4cb47fc1fd97a641ffc824fdd3328e01c9a765463e950211557e9058031991c2e962a454e5336959cfe46bbd5d4e58aaf23f795454e5144afc8e35d58d26d4d151dd176a3781b73e4b5d94b96f49d923f744950b47aedcef7763683f839e2a945be8bec7dcdbcd9d31b5629adb264e3ae89f7d6a428629568cdcdd6515b158abe7a2966d1a483ffb8402a3eabfeea4041875fc2a272971451d190b2f71136b25f749092b95a9a8ce8499ea52db059b74d0a2f6792a1ebff393dbfc8d3a23e8486b0ca8c5dfef554786f6c71ae63f27a5b116352e281fd11828f781515a84f281072d6a24784e3a68d1df0b9b682b66ca109a34363739ad772ae9911596136a7393d3a22e63a41b2a3b089bb4e868a4131b57b78536e9a0457f964dffd0f71b9cc701e5af1c64231b0af252cc651c2bfab64ad02b0bdc0ae4b29db974ad423aee99d54b39bf70a10c097038a3862d3db4317322a6a82954e842055d802862e6cf45f3b9676a1ee08b09cf749e68e67d201bf1115bd199202b311690975ad4b279d5422ec28202c5dea05038ad13e5795d187444f2bfbd7c0719fc5ae44dd4c097ffcf1a7c799881ac4055c3826af0069d4c94a1180bafeda05cf7898b9acabf1680e1a246dd6faff2cf56c5cbbfa78edc5a214c3c57f0931a77dc855f2847c9b146e577f526586d7c3a47528c540fa76815e8081d265e1974ed5921ece14b897cf973d5aa9450be320050db874e955fe56b2b73f1fe00b5f85303508394d35b5a3ee915ca57cbe8b270552677e6eee6eefe15c2f288d4348d47a7ae833915a7bee072b2e06077f952e22f5f7ae8e3573d8462a44e28466a6bdb0ab92bfb460b6d6d8ef2bd93edb94a73d0376742867c838e5f654d8a56a74813bcb94b6d24b05c06d7ee7618ffeac88b89f63c55c5614866aefcf25bcad6d7faa826fd1b0eba46babfb645270f89f6d27f32b7edcf7039395fbafcf99a8d59033f579ff2969ac6e04c93600bd49fcd90d2e6049433836e9bf44d6a7584d254b5a6fa924f54c116a8875488217643afb79bd3c2d155ddbdb9c38d5b8bb7afc9ddf96678ae6d76aff27edfb541ab9f605d87ed0575bfc7f6260049f50757a16b7b6ca07a6bc556b71f17c24f9d40bdee5392918f6b8bdf1103e2f2a532af99a2a2221466cc4feb37b6b4a8a34f4f1d8324d142b5c09f264144f5771955df42a6fa8b5c84881500a83ab7197eea45f7c90db3c55367c43cf6fc1c21854413471451fbfb81b2c8c1a778840af2a32f785254efd57dee89b649f7f377c326f3b970c87f86af1d5aa26e2eb85de91914c86554baf7577d2c89cb78a6626ad2bd3f95d7bef6aad786af086c3fbf893655efcd99e7aafffac4652f4ff51fb8ece585af0870efcf01f73ea9303599df852f8f8af73be37e679ceb1da67a0f74f140bf56d5b7cea0be62c2fd7ab3b35efb53b8be56df84fbee59cf7582af7d2a4cde53e99e7b2a4cacb089fcf954b8efdec1d786af55d8a47b2e7cedafc3665ed864be7c2a327c6d186b51f540b3f9ad3474672f8fe3e477cfc1a4e2fb63acaab270bf5331741554a7ee931170d4311606fdd0e035d403030aca9f28abee931151f4184634814173ea3e198183144620adc0882a8c024adb588252315a0a7a03f504fda47030d4438133d1cd8830589a0edaaafb5404d29722aa90a1b48d1d284e1867d0ad8b1ce8cc420b55517105135c8820a2890820a476683b88482202692795aaa30bcca4934e6a333d15c73f3995ffc7eac836e7475b6387507cea920b2cbc92e0e263a94a0b3c4134f5c46696375ae811038a1101dae2f412030697114b3cb199258a470c284604a8c97b4c2c54d82962caa5840c3a4d4d4d5c78d02c5962687141da89cd2c35b49013038a110102620a08353a348b1516707ef0d29a23869b20d4e4acb102fd610ac707338e6c8480baf1a10b961635d487302aac84506333635394e09b747eb488a2866d9d451c05ee2358a505c0eadb392be35cc685511ad6ffc3138be645652f51ec250a4b0d95bfad24865be7ae67fb88739c71c2183462cc10a305bd790acd58ba61a79c512c7d417bd47d32c3855a861c493b8b426a678f6bcae55c9893ce2f6aac704ddd97335ed8664e98995fbcb0a21d715f9cc04172d9be60b1c19dcc685f7240a1e7479b986a424dc3b68e937e514186279caa902306272487edb429010d3828c181830b405057dda72b7298b972267602a94959bafe632c02b962539577a5b458c27543eb0c1ad5cb30a2fa87ab23eee2c2c31d5cb87044868e1366c8c20b23b6a431450f33740b63b4dcfc70668902547f708e51a307196590f9d511a76470a8cd53bbbb5b879d15600c33d5fd27195baa3f902d5400bbbbfbe787343206162b8e38759101264b1859cc60514111a3336a58010a6840410a9a053260f068f9737b6802c480a1fabfc690d13133050f6f11042b270c999cb9991b08d0c325c5df61b801abfdb3dfe5ca226ac5430ce34bf5df591d71971813748a18a0ba87e142f55f30bea8feadd511777d204b1c44a851e14c1b44ec0a8ed802451930696011c56d450c1754d5448bdc1d8c15aabbbb7fcea3f1b57aca7ca180da3fe91736d47ed7176fd47e9c6f00194c5682d80205193f780b4b20518413603071b10216377bb33a22f94b99188e748c28098c151bd628e3c5cb0eee6a0107a83b947458010a335f27ad821669765c4a38ad1e9f205e2c95a952fba9ebc5d8910662630b02d4314817395c50bb8b3029002205751ce998ab0537c030e3cc172a08e247131c4d184141061c6866fe25e06289f5b57a7c64b57f52d7479dd1a21b56ccc8a10225a0e082341b694d0ac344840b4ee0f0c4ccfba83a1938aabbaafb947bab2332ea350621f205991ec8d4c1451217696a7f5498315e6a03418d69a2077fad8fb6ba908a313e54ff0da3facf305a6469f1d7fa688b031293c5271d689031c7520d66829822c232459634aeac4963c20cb3a8eeee146a6fd1456d56edeeee9ea55d6d714325b24518313654d71e7173c3cf8f2eb288820b2d6ad062cb1622adeebe52d5a1d0a8ae53dddddd49149a3aaed4ba9cb1ecc294a9a34f951de68ada61c64061c9a2088b386ac75a2d104ce0c41a682831cda005014ca061a38a982c9ee862e6c461fc8d426d2e58a8fd187437127414ab6bfae0b2a20586a9fa4bc72285ea5868f1ad41c72f2aa783d47e2bb4b082cc1542d47ed7155080c9a1f65402ea686ab2ebeda350fb6da29a2cacdf06ca43ed5f0ec500a17193fb54dcabbaff9aa02323b1be5f9b52979ba7cfc4f48a00eb6fbe096bfba1755813d6d37088153e23ed8cf54cc61069f8608309518a8a66b15f4d3191516209a4a2a2d9ce98465055df25abf7fef3a07cf513ea95e77550b70feaf653847c058a303406a9dc7bddb7b9e61fb875b58114c16bf7ddea48174e368242aaa16ee473860730a65068224a05a2a6324b6f48f1c2152fced8406d5becef672546e2a4a62f07d93f212c91d5e54bca9f46a1294913284f5544f546551155c73d03a4aee41ee048da0adefa782bc3dfdee35e8221f81df3e523e197a1913ac351fe263f274249da28a10898229c664cfedaff8f873eb55f33837e1d6342fd49fa6340fdae7ed70705f534707a29b346d1ac9f6a52359ca0a56846fb5dfd3bc7c4c6b9bc44fba3dce5702ca1ca176af91ab864081750dc51f79fd458c202691c52d5c502a9aeaa3ab8ed5654485016d74ddae2583f27c7eab8d0f9ac8fc24f4209c63ea236d209e8b8665ac965fb4514097c4853c417345499710096901ac206388c500189197f2375d2134a5dae7f518cad190e870b132df2e384ada344c746ea239adc9b386f1a41d6ce0b13759dea3e51b1a6565154f7c9cb5458f7c9cb15f58907fd331fe7f9a1f40f0e9aad72a1072d72131ff1ccc565ad671c2f38610be4c0343c9ca04ae6e3847c448bdcd4223ff752b271214eed6f46e1331b74c20645b58c95be67eff947e64024fdcaa02b17f2152b84bf899bbaf23b712a36e8284294da8521b0de9ff5ac1f59891ba7d09f73ce3971401116e7274e3882ac341ca3d410b89f63943a6fdea38b239fc58d3464fdae8ed8841fb056a0075fd0973ff79abf216df940df606a638ba8291aa6c690a2c50d6b788021081c5ce04021d7c7041d8d2041fd3f292854c3f8e7a4502dd228fc24701ab42ce7f97914d1118a913aa54586128e33a93d88d222178ef12ef3a061fc68d2ac61662b957f5c2fbed27e574f5a34e3eb723455050a2b5dba3c992075e4850b1a23320c156503a178d04f5ae41783f2b3197e96e267288e728d0eda4d5ba6d858010638a4887a48e1083b705843e98e2a515c968120b44cd144111d3a6099f193e0b2fda205cd1865d8307534c38cff09ff074d84d32e31bcf519250f5881cfa0c76b3660575f21e96af39c7c1baedac81512af3b3f41ed3950be0de8d5ebc2a01b4339f9a0c58d3a961b3151372143f93add6c4a373755946e36252c4b6ab434f777b329dddcec174a379b12962526b868f16f083a245748365f21f1bfb9d1bea09f0b31d0ed875aecea2444e99f9d6f4fe5bd6aa702db163e692327af7d825319a93438479a7427f6d23ffbb4c4154f3c688f3f5f1d69a30f3e68b1a3186aabf7ca9f822f25f4257da2ca3b4b212b690ce504f550373fbada632b2fa2aa85233bb3b3342dd4deaba67d27866aef840a138fe7099dbc38e0f9d7bfc221a2194fe87a07bd7abedcbef35e775ce12482f6bc8fe7117ecf327ceb75beab06ee84730b3a7211cff7c79c88425d819e21dc909af1842e21176a096444a961fd33271c274e58a4e41d4563a0db4331b3bc418924422d762fe0294dd1163ef1a0c5fe80bce9cae5127ac25af192129052e5690ec4ef55931f648298fd08df6dc65957e1483f2029b28eeb34eed45493d7f384430c471960d4cc5ea1cb61dd6fa47f66c85f4786d2ea6ed0fe6cef2d43a1ae2315ada15a8ce23258d024422d362b29d12fe85733fd2cd5cf50fd3f3888fdae3878fd088704e0c28c277c87f1fc2b1cda2f504320793ce0ce7c80434367c85c419af17c0f38248233accc7cbcc72de321cc6c9de2359da636aba92d5da8a9a8fd49a4a8fd3b7e3ec09df11c7177e7404b7a63e6e377d5c46ff8818ca9190fcf8be7c5f3fad7f7bb7c843f9ec7c7ffe0f1c1f33c3fc67ac09dbd4097e2f1a92257836678eb33de40d5fe7da94069c9f37070d231834e610f3b68b17f84f9b27a5e7fbc52a2fad50b7c357971d19a3450b3d713cd787cbc8f70c8a78a19cf13cd3c9ed57b7c74a42345fdb7b68ecef77f1fb771e0e421f25b3aefab23b3355b2f413e6ae9fceae8783c90ecbc87e3878424a78a8bb45e8623940fe9c8cae422e3f69387e8bcce7cd9a20ea7a331d2e421fe2d50c543fc7b9581571ebfc3e35d20ab4973e4bfccb9873b30d0f1264cede735eebec67fe4346a784d08feb3a2ca6b5aec288aaa87ec460e1a94d3b8d156588acf1cf54f6f6df7a2fee99712a8ea21473543b560e829a0b4eacde77c3f43f50feb9b7e3f47e57ce37c4fb141546c90970de2be9fabe02f1b64c506b5be9fafd8209def67301bb4f3fd8cc506f1f87e0eb341aeef118e44b5c73b084a91538af6bb4238500ae7bf8152364fcafc5d212d504aeba5e8fcae901d50caceef0ae1014ae1f1bb425ca014d7ef0a11f21ea0cd3bc87a09bab6ee805b75c0ad2d70ebb4f997bf7cf90d28b9366af1a8c5a22e687369e8ca1b0bd84b2c19f651d10ae8ea3b219fc2b57b11d6298819bccc5e3dcc78763a2d9f111dbba826f595fef1f0f58124dbfb27f170e4c2976f619396e1eb0349e6cb4fb2200052a5ff32c1d26237965e6a5183a25cc872d0ee050e6d37a8208a8ad95009da1aed370a23663ccfa941b5f0090f79c2433668a847435fa9bf938a8e9cf44fe7afbd0c5fb4a5f940df498bfd4f6a1cd51e759f96281a62292b768043210c339ef75c3d3e7a00f9fee6f2e3478a8212ed0ffc7e2c92573fdec73b01f23d20f8920ffece1e7cc9f015011fffcf41cf83211520dff31f52616a02e47b9eca8ff7f13bf35a6650f0ff697379a76ef0c156faf140bec865df4a0f6a6926fa88da40fc07281fc813cd5e3294d2e4c70309877e8412d819d16c147f673d16384177f6236492bf331f3fba88aa27b9b4d83f7e0466807982a18bb74b95a5d801aa7238c52ff0d665de5b879c081ebecc50102344104e1d8752992297da92050acccc9364c868418df639b85ad830c6d1acc19e12ccbced7370a8b72891c30ab312be2d5ec898f93738143b6256424ed4cc43d90860b09d304189a8598305403363a51fc6709935e853c5cceba6ce4852c1e1450b2f9e911051b3065f60ccbcef73b07f28424bd2ac419f14ccbcd5e7202f9910d5346b909e30f3585f831b8511330787b630aaf012352bc167cd07e0f76ca2d8010545b306bd38661eed22051450379f833b050c5353b30683bccc3c9c1cd648542f384198a259833b2ba1d97fd0a4bfa669feda061ece97ad8572d3dcb5f7972ee58f2d19ce77d9aaf25bdca669eb23493066befb77da4f876d53e6cf16e77bf70e7acda29429dc3f274f1254fba97d08d3480502da00ac1a9d2efa5fb939673872e5b86db506b9f256eacd396718c2d4a6a66d9a167e2d6e468cf44f87929b4db79f2d722cd0af0b698bdb9c33c8eb6a5da59b736ebf6d2d243a7eae9e0db76e4e2e5c27551a26f837c64808f95da6f6abd0d4af39afcd2252a6ccdf25329caa6fd0e31166ddfe3b1c7d6a73cfe0949cf7d79ec79d27099af39ef3213891aa2d9aaae56c00d69cf5ce05a43a8fea36d5dff727e79df523ebfdb90d478ee35ee388bcd36f8568ef5519893879d03fda6bff01081b245fd3f9d5e7fc4b275c22569dd70983b438bff5da1bc901658bf3717ef7e6d7475a6dfe061c5dd5e6293802a936a114667d555b81dfa4a19ca3fc96dd21f4d82fe50c3404296f82a0da0bb526d7593d576381aa5e7ba16e50c5717283bcaec65af7ad17287f0b898eebc4b531e81faed3b8117824aa5bb89ae20a29d9b052a719fac486511de5055a0f25278db7aedb23e9ba7d4bd03156b52dd63f5c0c63a2a8523531ea48a46abf53445f7b4debe650b2b1a0445db6a8cd7d6d9841d7950d000a0803261df4cf3ee9a0a66abfdca434431d8d544de9a846558db7676696ab076c2c2881f37bb5c17cce80c7afdbb8fdca8f9b4726922d9c33147d5ad4be45eda384b44fa27d4c7b20ed5b4a749fd658aadb8f53b6df8d8b3a2fe40fb793d7ed1ed4526a5b77b795deeeeef670e32ee3f96bee2ea56bdc499c19bfbbfbc5d37a79887cde97fea394524ae972782c30284be9d377598b216fb988941ac83bc4bdbd76ada2016149c48652fb4dbeff000264d3b466421c8126570a3aa4e024d8a3ba2a0f09ee549dca81dbc258526a3f570d6c556ffb249883536f2ab5a9dec7aadef7497055bdd527c1af7ad5b3f924a8aadecdcd27c1593d9c4f82dc56bdd62741adcaeaed7c12f4eaf1f85cdfcbc5634787878725437fde405e0478bfc66333fbe72567e07eb946d2557389e2fb4f91157b7620cd325d3d000eaaec856d535537d5e695fb9b856ddd5b58e57bd2dddbdddd793d961632e7d54dabebd352935bcf78b681bc307f0d74bfa9fd3edb6d61b3a8fda357a9bcb446298dac4ce56f315db44150613779440c51c759258b226e094dd211875c19db8fda452ee3c434acbfccd11924345c1a6e4ded1f7b49a76a21078585f20ad13c675f678d44958174d3063df710de6f4f6c68f1b48da3ad96b19cea189b1b8fdff75525ee0822d8547e2e662449932750483042bab27484d31567faa78d983c6eb544f51d8e61dd7ea56a8541a814245bb947c22b11fc8e3b868cdbf77bdfab2554eaa67a2f1cbb6ebf44b55da9fdf3bd9ed3a5f62a399770f53816bb27c856b972ed40479fea4142311c47e03a3eb1c144ed971bb4557b804de59753a865178ac0412e5821cedef23790488b546a9561ace5021d7da63a219490ae78eb33ba1309435ce4d16e292ae8d8500dd5539e98a8327da67fa41a4dff7cef5f5ba552a954452d6676734e95ea3d954aa552a9a05a74a2150b7464299642d33f5b554324f40f0969a45a0cd8512d321736549a2ec3522da6a37a0a09431eab3aca1412faa7fbfda91d517d7777f7aa39c3522dfac63ce79c73763fbf7cb9e2fc650ae8993a329aea67588acdac5040a1f44fff14280d05de22806e2f6b7b2b9b1f5dd406ec154824c139bfbb1fbdf97be92a709c63d72f1c998848acdb0fb1122731121fa9593325b566ea16b5502b6603aadb18e31feec720aedf7e77ae6c93fbc3fd04411186ea74afb35747240995fb0d1cdba993a6bcb0929a85128184cafd5882085ce5b8d6b6edb77ffbe514f3eeeeaeb35b8466aa8eae4fba74e8062d9a6ec1e37ec7564f0d2513e16d9d7d319aaa9c543b4dede72bfdd32ed4fe62c29adadf419f995cd4220a3f537dab66dd56c8f653866ac4332326f928fc8c89bf19e442ad2883dd68dda7755f8263094575ca7cff795239c641965d1e39e1d9432a03a0b28fca31273ba49f7fb5b26ef22f388d283fc73d87041dd94a6de690adacb75a98014bb6d23ff2fd3bd08227e8fc97d4fe08bf64b844acf265f8b5285b7420a011883794dff60b8e44eaf6be6dbbc6daf616689168ea264a96db720bdb821f6896a3395399c0776c44fac749c3fae7a4d4e51ac54a061d5fdcefbfb8708958f7396adb28512e4ce9d38265f33d01f5028ffd776a3d0cd761dfe1f62eabebe44ebe21876a50ff76ada5104f6a243de520a669b6089ae0d48307ae80f2af8d4d5d2f26380257c0cfbbbbcfdbbe4f2a804ac153129915d28dc56bd57de2c2456df5a47154574cdd27348ea89e8da6d3fafd55abce57cd706c0e94502a17a57273f5bd506bcf25a66aa2aa3b588b1634b05458dd272935d5f39ac3d1486507273f4fea36bf1eae60a0ccdbb66d38381bb3df80231423b55f076c81130cfae27e1d66138eb42e5451d1ecc5854c988bc3b467a72cc4682145d18cf5abd75e8303054988c122441d58d04144440a34a4c912c6872fc66071218f6bfb150c74fb91955e376ff3ba79f9f4bd58ffcc7f6f594bd57cfac7c379ed83e0e0e0a894f419a29147eebdcf7927aa53bae6840e030ff15ec8b9a9c5167dfa67642d1b6bb901a528a1e1119bd5db7c505aac65955cc64c344c7b4d8aa5aa2931176d0bfada183248600216dc5841862666da03b92cc8094dc871e58a2c61729869ffda8bdaef98e0fb1587b1fa400d5ad4be95a469cfe44994291d4069e2c4830f56dc732155811e07b6ca43a2f2c291fb11b8aa88fa5560ed9e73b5a8bd4a09fa31aeda1be91f2e943eda16b220b536665653a9be9bf3bbad9309ff9c943ad1bc5f009899cff95fc319ba6a372713274249a610d435952a045d75d071be265f93d5dfc6c121662387a6a359091e1b57929831c9f7debf0a318b2ec45815f262882e4ee060431a245e0841106898014205a9a43a66fe2fca2c524a5249361b6826208d719a7d5d6814973169a8d0498b51cce96740d59191cef0c257681c749fa49ea4a0aa7f95ed6ca1a60560a0a24c4dcd26dd29ba4ba1e8c2fce7a434e6327e6161fe35ece0f4837fb1f5157282e58010459c3142073027a830730dc2c461851a13c071b4c4cc3f0a090d6e942955be5665d8dd384085a6aad571a12a1213a424cfa269e17628e5880c916c65a41d3528ffc8484e9e0abfb2cedffdf9c9aafdf6d2c6d6ea6344fac726f4622ef36958afb850fe31e69384058a4024691fa6aa9b50248901716010d1270aa1243120daf24128490c2869c788fafeb88c83d67ea017e7007a51aba36b670ce84535f46331a0f5690d8c7f206357e68de9eecf98cbdddd7be5eeae74d9bbcbbbbbcbb15434f8822b647fce39d7d7d7d79f35c7ca4d05a2eab39bf389874ec5ad3220aadc4b700cab7cf7de346e7a73323ff1e031731c1fb77da169ee514a4e29a5ad69ee514aee2ec7955672f975ef831bc4bf41570ec1907aa6c6a8d48c56854d0c19aa191100008000b314002020100c88c542b15830509561fb14800b88a4466e52954bb32c87619032c6104308300020400819019a22d20400003365fc89744578b1fb8e15af4c40d83c06965b3b4d9bcd8df41b24a0f0ec0989aebc22e5e046003ca503a891e93349b3a3bc2711692107b7b50f9ab94b2fe085d9edf5e3760275161d5dffa9b11768c8b67f609b24d043163d935cc0aef777ce1448cc980981fc5b1d8391e0db4ff8562804a28f9f25965dd33a378fa2664daecb53106eee23f7549745920e6a63090904242edfde5b91b11046534b0c6d6301450ef7d737cfca82dbea9f7bd51c6814bf0a16d89304227864f5f886d1a26c98ad86d1565be3379a2ba835e5972b0280145745b60ea57828ec9f40848ba1a2f0f06f2c46bbc206bc3de9fc1851e847314e8b412d0e73b6050e942482525211280b138ca2dec6d09ab390cb998e2146bac45f101f7358472748d9abcfa05a651d208af8cd4296378022eeca6a577a2a824529218fc537642b03cedfba1e5f79280774ddc91bb768f28b67988c88850a3141066d452509d668609e9d62377c4ff927a60a39c02368f1c823881dd722f0049268dc69d0e051ccf59afc0c79578b6583ed2fb4d69b3d1aac7085ca5d804715c5cc7d1813723cf687867a0c31d6c7b23a0aff27011a73ac2392bdc29223b27b3478f53a7365056882f9bbe3e6c1e5439005e4cff6e08c4fdb0640223a5b69df439d363a267a2820fe22a6d22520880be5fbf4eeeb7f82af33e1ab46329d12c97cf3017fb87a6f5c681c2d4ae68a435b782556a3c7467f6600bab84b58ac8e33dae9e7f954e5946d0bf99b764e976aed0212c1f80bedecbda6a9b75f0e4437359266e2f176744cb8755849c6273fbf68c7a467a3e82c6d80050646317e4f5c7eea58160544136b9b6aa193e0fe64c95f1fa9a99baf77e456eb11c087556177bf193f648b7e7759641c0cd07426bf066d94cabd6dbb130254094b3a9e3256f1c7716a510ba48ad8204f6f95290be229ffdedf1509de5e339762022476ebcd7a3f0aba641f7a344c2e0db21d14cff508e18c07a86c1e0ed7add0f49dd1e1fdc99a0c44b78d387642791b59bb3218d6b3e3088cec8a2cddaab1a54940f95bc7bac763f18c04dbcc209b503868d3273498e75603d9733f58575ff1e37dbe83b5f71b053f96a7cd87aa84b93b37a6d3d96199c49d2ff869de405d7c0c830fe0e17f7f746e265e3481dff67cba395fda0663f95721de462194ec952ac626008c5df7b187e63619b40bb0e021279ac08388ec3437a21cf6d1e518e7c3dc68a622264b69178dcbc2cc11599cfc553772b9d50e063b31be6715d7f2cee55f6798f0b2fd64d21dd94c16d2b9de04fec14c87f72fbf47f79c81a8beb6b10993627d605bb0104e55d0de9d450869df49761a7673f79f603ba5daa49db68d6300ba1db546e43d76758d1531e6e0c93f696128967605d5192790f48978fbc012b440c0306309f2552a30251335d7fd15e6a239644de4296a34c1351b0390cbe8c190f1b80a6ab8eed988a1063251e6d91f505588eccc355d47e2a81cb4737c031dad9e31e18d6346826088d74eb0c1ff4fbaaed5c7eac5f11cb75ef7e310c74e965b7c2c97cc47fc02d637216447448a1c484d39432119f899e3da62991e01c0bc163192e309cc05b7606f2600bd93798c43add40c7400909b1c41908a2a5cc913bd34371e7a71daf9d4cbae058c167dec31d0dcb27c81bc4782450d7ab85deba8f052eee3ed30ff1d8d568b6fa06e7166ad1147a339dda95183f242b5eb68ee5910e9b993f4ba26c94a6c9a4fe47196bf9573e64f4d6676073b92b54e755d924e46228b93418a4bab1de57b70af4cc6e178fdf4c428a04c6194315e7796b42b5429b893f459f56e5f472da8484c80d5cae85998002129d4dc10b6f051a220fd50ea607ac28ccefe8a8fcab66f4a5933e9b9e612a1ea1f61dd8cbdeb49f9ccd79e010361d31468a7c12a886686763c9f911cdf92f8db2370318dcd398767f32beb899d76941f70a2d999930b2eb13dc1668f863db3c026611d17285a3248580f97f180549abf9958e277becd94abc8297c08920004ad0859e34ce9ffd49bb70f1ca7f8a0b6248dfd76c80f520a7598d53725f44b886f135a42509c0f328c569a7b029032b3023d77fb2d83a5ca9564a6f02c2e2a29ee6a6854c95713a7251a08ce54a0b1cef644d691eac55b864079e90002ccf6c730170ed16243fc5a0a914339295f90a92e03d8fc4a06407d4cbb162b6f958d8da9a7ec904e98fd3acefa623b3de48cd029c8ffdeb70b251cbb837312cde82aa04c4657284a57cea4857b7cc399da96d07330b553130af67e291dba0200912e02c681a2ad8e614926072d6701fd959c4db6d6412031f136e321b94faffad6b710c86f332e4122889b2df1c47852f3b163f4ba68a25df91d0fdd32df7b06fd51539b6ee74886238e1bcfa52c1b03629fe3b89da9afe1890d1992814d145c916f0e3b1402dee4b93d32868b0d761d03eae57cc95ced00a1087cb0ed3e910413c9cc4033d1a0bb712602c4b7ff4510d68f1381ec47545ab8a2bd3c7c939650464261df01cadd85e5f8fc263e4293e5b2a5535a5169726661d8991601a279ef76782e9bf4051c9f38fd1a4f1bc49a0950eabc37db5d4a77b7d88c250027bdf18f4c784b451e833b356d6178aac30c99acd5e352670e85e7b59581e6157c6ecd3429125b192320ef7565ff1c04106988def05ba54526ee5f5a517d400201818354300d7f8fde28b6330140df2b46649807b57c4c4dd071649da9e592060ae341cdf0dfa4d930f445272618878909ff54c3851411a830268d4823f8941466ee91ac998bdf44b57e769b4a579115aab5d02caa5eae58e6963a6dc6c9876deae19fcc308a6d3442b19907ece39e353cd95f88e9532912e9dbaf08a7287678753739d73df3e8b03013f31e6dff46d967585d8f50ecbfbe9e6df003f23a3815f8a5c7915f53ec0403533abf9811b03742fa9a2801e2a85aa87915c45abc4874407e490a0343aa1faba62a174bf92c02b143c48619bb7d86c489886cf637138c6510b81eb3e52602b33ce4e68111c113335fd33a0a20d0761e00a73222e705cb31a5c4e149f564b390dcc2f5d4f3ffc26e12af7a701bf66fe61bf500efb7e38dfadae9fcbd4af93bb8453a5ad161f2e3920d58bed92bee7f35789ebdc218437c0ccd45e04b09531f2fc85072af37cae373be63d0806b25565130cc44a5641e9e4e731015dd8e4b03ea2c7239f94354dd35763f49c71d28f0c6102668751a9e80889c7ee9188eed1cac02ebf74f2171708b15da8e631deec5b684dc0ac09fe73b874ce1c9dfdc84f9c8a80b6e2668c17dacc370882ef669a30286208e8b489c89169e1812d7a2dbfe1d55c7d2158a6173213418349fee88b33d33282db0369f02164d0ca42886ae4013b3dc369519fa0d04f02e13dcb025e5c25d84343e6cf0c4b57d1d311b2a51ec1c77607ed037468b5197f59bc5c1686704fe50bd20c062e777e7e8b30ccee170b5441ecf506713e08c5010df1bb49c2a1253fb51642c180b5931d9b4202b4a57d757994817bcc2a9728cc6399a5164c06727d7c25efcecf59fd52145873896a45de5ac40ab968c8112d7f9f75f529dc0c30241a036328f442b7e908c2a3f56a01eb2825ebb2abae41f9dfbeb47c080775407b4340fe834b9abe69625f6005d241a9a0d14abe9a13b76a70b4c5b6e30716af723a7dd410a845592b77b1f61d24776b402bf82bea60d326e457dd055579ac23bce2b133690d465647bec6c9da579a250ab11137b4e7664632179cc46ee59ee32c7db023d4f3b12999813fb48a8fb15d5d06b39b04c0f000ca9e74c2ea7bf764f9108556e9009f1a3125b6d098e8ea01db7d217b49b8333d34dd7523b0825340487c3a7bf2421d7b0070f6a4422e426f1aa14a0711c80ad47ff50a7a2634310c96e7029e316e7b7dfde0de5d95478a749089ce92513801f307dc139df329b2860c63f25232527bd5b2b94202d9b7f12400eafadb0632acefcde14cf35165c71f178595335cc07c0f469d92748ba052af5e3c71b7bd9b08ea449ef898b144ff244ec05594a14d8279cd8f316fcccd674cf3cca85b433589d001147acbe15f0294a1970da64f5d37ae3906ff499dec13bdf0d701685f431c1cd4c0c5b6dc4e2b90125d779abb2f3dc31b6adca7344210f965ebc890244e8bf84b43bd6712c33cdb2037d0e4e4121ed5ac4c2cd93864f7063b0e9d63af2ccbc662ed530ce5206b34fa67b6fbe3c4b37eff9739c946d8565376805a41dee0f7cfc2f067e19602a38cb5c2497400d6a82c33d541b1a008cd37b92eb4bb28c50434835dc3f371f74a8970dcc357d5963418af2cab01b339e18ec2189a6d02ed7545fab15624b9c51c664e96058f36d42752f08da00453353485e45a931d8913e57fd95f2c130cd0f02770c1331a3e05783f77dbcb2f809c32bff1c7eec0b09d6120480dc4c5f8085341b419b4776ee729dac5e88f559b2817aa453b509b8e760ff57eee83eb4caa2b13f1fdbe381c8e69d3523b93476924c6de366dbcfb7028e60e10c0d99c491a3a536691da7248fa1b9f0a7c7a5a93d324c617e3f34bf989359b81e9ef1bbd35e821ff40cabcde9337679f67953af77c0a6aa42a9298073304017906e6ff899cc8f72699add05c6b40efc3981fd425320f5ab0d34edfac5a02181674d0a03573f362f8030358d7f48ff079d75645f76e6f3b617fce66dc28409977ffe8f7c7ce4726da7ca5ae132c9d2c9a16fa56e53f27ac6911890d84f3b984b6aad0f6e278a46853b1fbddfaec523f99d46ee6f0eb678138ebd0f67654df8904006e93712c0ec5ae29b9c0eb523932c238f3993e6548c7540c23ea104f8b3564487031bd36c200d0361404f9aba71e2ea8a89df9625f42bba98f7893593e87fff92661cc4788b1864b345e5cfa4e8d8a6c99af02f0d95860c7294fc256c81756a8bf9213cb313c6ddba17d152c91aa36b6bc2f708105026b3081c45a182e15562b8b15bdca8b0e6bb5a641db791438b8a516113227179023990d4626804edb1eaff7f567ea97990f1ce3f6bf25d73a8be99099553aebcf4b41a64d899cb82df2fd4571bc4d07f30d760d52a70cb72c4863401d8f8c8538365b08ddbacfc00cf7f105905d136e7152e1b23b976afe247b91eeaf136fc09edb77f549b54c1235ae4ec13604badc073b087391496c7634911b01e09216203ae13442c65ae0667e39f564b7c2cd9c3f4936c30e467dc4146084f0dc83954b56c054b33c18e6e32d57ed7e44c0ff19528f83cdb9a1367106f6e4877aa0697546330a9c4d361cf822842c9e83258f1c447e350fa698cb0d96af0b45949b1c165fe3b399d1e8de091c5df48e9ed9b34ac992a4dcff96ef0069ea75ceb7a8b1ec4f1c951643360512fc577dd964eb4947f881458d9274730788050913ca8cd7b99ca0149c5ac50cddecfe1d24fd492147894e3333ad4854b82c4616252c23d1f31ab30b5b10bdd950d8434a64442d7237ebe98ad29df9e7c2612a22921e927c11fcc3ae2b70244b5bdb5e8a82947a899f1cd558e66fb16563decd84c51c63896239a80bf21fc00f8bc6796bd94bbd06e8ff8110e0613a8dc1f2d5ed0e74408ae5493967e7460b8480360a14b073b498668a9fce69d04da7bf767a197ff63db88f1249d40c6bf6a86e2ef24c727e2826162ca3712eb1c42032421131195223e58167011a1a2d6a8a3601b49d29886615ca3152759f1011b15dcac2991fb4b9e337911c03ec51b770919cdba91d5fc61f7f6adfdee2a46ba54710991b8bbee22eb4827b24236f74e279cbca17f1d6a54d2df04e2e4920d688faae95043df02ac32367411978b362cd9351b431f7048854ed8a94037a8d2223ff7e61950de9b457adead8a0618b64ba0e37c39ab22d4a0c3306fc9d8027b8b7794149ba045cdb1577dbd3cfeca5effb48ec191676b2f6df1cd986ef252da2d2fc54954e3be99f20c283eef53a272fae27144e0498c582e6bc500cdad209954100032c55805605612140409d69919f1ede26dfaad5c78ecbb9dcec71f9d08c8f1ef5496932bd6a05d97cc07290d940774c4db21796c65e5c0d8aed9b9d6c368766c415ad8eef039938047e86808a79ea03f4f9ab75761ef88e19e10d5d3cdf06520fe741ab63000cbd1eeb124bdef1c1b8cad22c55e115250a0059e8efc1f6aa4bb7168d9d5ff471400ef8ec65afbf001087f95a9bfbd2af90170d40f04a0b70f54502875fa2d7a10d3d97a944375569f6ce3b1c4004ccbd050708828f8625bf89babf9a4a1193c793d352c32d568f80735ae6ac727dedf82967a8d5785abab27b4609af8061401c9f32897b2aaa14440463445baab4ae731bd6a15896a6c6185983698ef14eb71aa16ebdf33772dffa6636f70f50d18aa3d2ed69053aa377cee953f516d7545c94b8d9baabd3e19d0bb5f7ab2784c07fc75e27fc26d9c57b540dff13499449f6ebb600a477d99ac17e42d0067acffaa7f0d895bf7cac7ef730683affea57f5a077e59aaf3d692c1e87c98a04e6e16190b831e034e626d372e4984ed30809637b24a4efe602f81bee9ac2175530005bfcc3e17e3ea574e859ab3e7d3563d43be41ff50608a90077c470d10b46dabbe489ba01d67b094f6e42a3496ead7d556673994f563684ae2696d89615b861b6eec821e105b618962de3f248fb8b5027a661f23b43f7b01eccd2e4746d0029822e2896d5004f65877d39019eb09d147a86ec8af2e5d2fb2d3300c334603692fc433786c573b14ffd981cc676a10b020f5def29c19e9af561fb2696ab5a36d73bfeaef6ca1d49013d3e850f07f77025f901a248221974f15008795f193550b990d804e0dd81a09bdb4352312d1b26f26a4572ca17f836bbcff211f26029112440e8bfe4a619e8dbc8153fbcb5d0c4009a03d02b459b6bab9e3345961ed4846d45103482f5a946dcb7af39a445acda28020342e26a5b5ab0372226769991097e444b5d8d206d2f1a21e3a4423b541292767a20d2c3c3fdf30da649d5b26fbb61cded2954342d2459287f47b298bb58ad3cb32a26f350ef27f41294ff482f0a1885c0fe55b1e755191449aab1d26e9f24ba23fe6b00a12aa8ee848f3b83521ae08dbf051f14aad2865d19c12c34a39b1f3b54a3fe1169487cc0ca53eb30ac92a826d8b7c6cb4a59c41c643831e62ae4b8ff7482b622cbf8ae9adf0300bfe0261a2c3d248dea00697a9be5d461516818ee6af3a96125bf05e52ae55324274a6ae597a62c8ba9d612b93094976c428693b1a3029c5f89a80e5541f9b2a13ba6f3f304c1766a3aa00602fbdf6df1552834ad18eb0d5ca6817b6997bc28a00dd5fd2fac056f0a181916d2a7ea9175026abb62804ba9ea3999fc87496cfcb317ebea8a9ae220a063512075fa555c03286c1b2ee6d5a4fed4ca497ea99f08c31701fe140e2b3f863ab3cbc2117eab6c0f7a3a892ca5ac2edffdd37702a9c8f1888a974224a49db100846b3ac2b240ba5bd6e832964a33ce86943f06b594cf51df3b701eda4fcc0b34d52a5d27ad719ff034d565c3af4d92ff74483f3c107f4b9a3f197d0a7d238b3b119564503dcb33117734c481ab25df2a2d76cfd73a4fba9a6ae8d253656e859cf8834c1260ffb4034b9e7ce9b7b3f7547afb237bff9fc5b25a0eba9973feaac690897ee82d56a75954c090eecaadb710813dab028ca782e9079c602531869a0c15b135d94c84a424f5ce0ae97594cbaf16360e0cebac440b0cd4a84cda48d1e01a1dcf30c65de0a25c67079d2bbf0f24bafb9802a4d88760b2f3ff3d158351f25a48ea8d566635812786a6c59a9fd655a1cb6f2e74b245d4974738cc81c1a644914760af2f2efc6974295c2818c676cbc7906b92112df1d14ce434091dd22063fd49a1b0242ccd8b3000f140889aa8ea8ccadc51529ce4722ac90031164b7498dc9b9ca9179adc2179e05da728ad4ddd091b3f1393048460ca06a930eec3910bed4a54ec01bbf25a50fa4abda465deef28e71c49e1d019e50c0bda3d72d229e012ee0445391775c96a6be330496b9133359b897cfe85f182529a8d7a81db1e06d4fed42f87276c4c3a7a78116b8a611122df76e3cd46933c82c7bee72be8b819d3aa148cfc4c3b800e4f579b5d32dd00f63319eea8b246af48c003e725a92786cee12d1c25a6399d6dd6bda1b11b66a02e2246de3e6746146ebb1803c6cb7af9d38feaa0c6b8079b7aa6d5671e41eb61845102153f8a0c7f163a9c1484fb4500cd37b9de826c25cd8d1705e86420ad143e36d1eb4996ed616af5d9f84304463a6f6c83c5fdcb68f11823e1adf8049732a05089f79d584ab1200e174c5c93da31073f119998ded8ab62fc2cf3f2d6b8dc5e7ac18d65ce65565bc948a5a467e93fb3931ec7d5f8aa7d032ffc28800de51daa1512d8e11f066796ee7797a79397bc1e60202c895f7753f586cdb0b4fdeefc28af42b67611ab21be384c4c8e32c3c61686c0165aa25542b7635c0f2d65d9150d0fd5428568a1eb1ada52a03d09dc54d2cf986f66e423a861e2b3a72052adf2561cc154459bf3e87c0790b466b0fa9f0ad667a3ac4a9034a033c348fe1b82d0abc689d0808b5ff47665850c8bb416865d6c4c2607da9b6b1ceb00018bd2384afa62691fdf0a638fce9071a19d3b1aa0cc087f19e85a74d2d5d5df1d485c4824ceba621e991e594a37c3d904fec165ee72d7c98e24ca872722e1beac4830b8bf6e002f5770533295fed08fa24812bd9ecb9de0e377ccc5be2784e258e598a805f100312e673c925a2a98fa584f0a18088f32254c1d172a688ed1fa75186bcbe368d45e1002e42164974bbda900cb24e49640bc9fc501a50575af65b549fa33aab716c3f532483aadc7d1f6c87be2c59382d8a16abd0381f4af0f1c548b63c243bc40f9612c3473d0443ac97e10d8f3f6aaa832c9d317a81949037bb5165c7ea9f2648830203772c0d71a0c6c6e343f27886cd51d54588fbc511368800dc60b59ed48857697d4ddf46907483e20a22a7d2cbf854a2611a9eaf486ce68ddbe6a3a400b358ec64caf014415fa703cec59087c09e89c4841dbf81eaa832440239501abe9e7340470b5bd994da65a2ad394d194e18fe7875d9699220a1d32c3c16dd7db9df562255a062d346edf8e1b6c3e7c164f530d6faef927c6f2a80e2e67401fd573f46d95ce78cbffadce175c5ca4991255fdac833c18d2e273266b1228e31e35f0cd012c276f15eb963042439f1a17ed7a72c50f255502b8826e63d4613f1b5584a985314487c2616271d048eb7642481ca30d41591cf4f9c8de72771630406993b6f0a60fc17157bff20287f1a3589414446d5c8215be82899d7546efbd502f14c5f37e036bb5d14540a6a51cf0f94808150062d82a1702dcd3cb71ef7ecc2ee974d5f512d356010a1e3991f863d241c43ef81c89baa419b624e95c66076efa08ea64ae3d90cda71bbf691240f2c915b53975d42bb7a35d6a89952071f31d079b5e5bf427266b999855c391add1a0a19216463b228e58987447aa09b77c4907761a2848d46f53a552eaf8cda8399058a31ddc972216e9b4619985f250936137f1c2b3828e763898d0cf98fac1633e541fcdd9a8a7c8e81fe455768f64af91885971a268af10c423f2dfc7849683960dc27e04e50bbaf62d1b98bc5c9d5bb87dcf684a0b14ebdbac70e055336e05a045cd9b1fe200984702290207f933c8c41766de63ec318b65fa9afdc4b7fc9fa7b5e547171bdf2311e412aec175ac0318d102fa0024020524bf69482176e402eec205dfb0075d9f5992f84cf5ccc3b755e075ba183b04f60af11b62647fd83d60832b22061cd5df35aac7f5bf7c442bcf882030438cf3ed82760cbe3c7e931dd45d46149565ff7ba28a5edb04cb2a95e95ed6185a90f28ba568bdb6005532a93c7a08bb5da0e56401501dc09b926ccc3b27c373488f5d22891c4b573dd37e7cd89373b3a23a4453ae325f0821faa0d0a3691390d44bd1a99deb2b51ef15332534b93d106e95db234f1793985e41c2d29b19696db3aed5ee0a1ab9309058327a81d793c195e56f63f68d5cdef9103b68e120e2b0c428d86267856aa4590d8a8b558f62872703c80bb3c6d9fce460df7533a91f9b40cdaae6d17913295c6a8e3433d6c591d2629f19cffca17ab75ed8197629bf84cc6eb6521c291d7640a300b64046c364337f08d2b2ca9a60ba2d31dfa0be95f3f1da5d02baf0b4f9326dd1960e67f64975b596a817d5ab41a80a5a34050ca0936124c98c29cbe805a488a27e0c4e57637d8307c4f95544f222f7d9b25ef943b72670f0f86150a5a61e3b6bb1ac0395cc2fb0028bc202bf50596d67f281e4a4f340f9d427f370e210cbdd95945227582e29ce74081b4a5d9a0b2e020488c4492cd13012b234b84a30420e04bc6beb7c4f96ae5218979f370306101a3009fb9a7bd39a9d71ad07ecce75be2564617068c01527c33e80039ff081bd6ae5d79b0906d89485acc9c4956a69eae05fd3c0aaaf70ba05e82164cf55040d270ab1cd2ce887d07585378c4bb6edf65b6fb15ab0228afe50ed463d10d98891e431a6c1ba85b096f8a8a3117dd622c92ea7943bda79c806e24d7ad3a27ffc0d944e7e1edf9cec57b4a5e0121131e10c130ddbc190e73fd59043274e0019e90af9064494366be3f85a553637c8108256bb95ef7e28ea88327d18079053c46ff21a497774270b6163853ce4d460148453c186ca946253a8d5f4ca4cfd01c4d79fe4606ca418bf0d4923af1060e261da83657c837ab99265c07db9c95f92e8fd92255eb182e4146de681f1d7684edeb11adeec5a86866a83d1d55438a3d5b6b895988dcee622b5d37764318d5eeeba118446d4ca0619060e3c9d912d2f235c502292a1e3019e6992e1968003f4a2deb2af464811032321f7a098f24e12fc9362db56c9d06a9cf2f76002033b397978c153673508972d40de1a3ca9a71630f9a48863246646c9c9cdccb238b9cca45b14d187fe42465cc54e357642050a565903b6066f295c572abc0cf78b19b044fb5587666f953e734691002e13f9db1a59b0a33b2a70fb4dafbb8db6d96d08be8ec8545ea5569d25e49c778f6121a2f6c42e637f2f785d6d119ac2d54d8169e84145ab77298ee0c67430183ab501283f35c373fba41ce055b1aa69e9d521ec0da0007a02ffd4749d3356d766169b05673b86db119369c0be433a2052fbc7f0318c131c85bb9b60001498eecb29bf0781e8b01de6284d7ae3818fd27410f7d7a4fda8994ffbcc06e8ba2cbc601fe16d19a620ff6ba8869856566efadc6fab79b6f1531166dfe7e310cbd1f231d7f27ede5805d129a00e2dde4da35f766dd7456db2b32a1b434675299088d61594c35c4ceb33dc71b415b475241e756e9eb3d7d9bbc951f0ce26a83f938b4ad1fabc24b56b5a32d3f0d36f78ffc6dfa960bd3fba43141267786143369a5c8e1ab69fc8f92a12b7daadbf4bea4f2a9ec9daa253fa73fc49215b9e4f890d49513e48f8a1b6df60f2da6e765ad70d2c9af0c54b81e3a4469896de32b344cf92aedb8d378543b9283aaaa7af42d75ed49802abcb6f66c52875218c3591cf74cce4745d6f9581c3645b84a9d51564b4ed84a81e1faae06ffa5b1b8b90eac024c6221b7c3a22030f0cff2acbf621cfe586e229c6a2fd6782c82cdc86861a60604d8115389c656a83bc5ac1ea38c8866a8b319fbcc211a4903faf0915280b98f8d319898e39897b13ca6ee16b8c29af248ea2bbfa208aa34a465effa6bd94402347dce9d2849763c724c627602b2a0c4717b5c044e1a85d8cd47ce98a8b01a70891339e571e5d9c3a3e0a95341a12343a6eef3ad5d154540e91b7883c198a207c0dc66aa0a906f8841f458862aba42d049e1cd908d9c271f6d04fb59545e2756c68c602fabb8dc4daec0597a816bc56816104dfe00fd49616076bb565a987a9004680249cdaa96b26bb2ef44aaf346d6d5c85ff573b31fd1a934783c5462b681fea5d58177fea95f7d6bcb511d3edea8aee22cdb1e79cef3c4cd8eb0314433d45f2396a54556ec21a943072af189c6c27f9bdbb5de27503efaea51c6cb857a9e40458183f0519c1afe3332ff4eff2efd2e0468936aad67e39ba8658ac96eb6270da52f1c533814fbd37b6a8ba015fa0d9858259d9248efeb0b3db5c392ac6f3e9b88d94d5b704e9d686f0afb696e10c702e64cb3cd99cfee350a9ef0414f889d636b2e91307142190185f40ed433903441f9903b145a7c8e91d236a0a85c53ce04f2fcbacf772b23136f3a6b8bc62f8ab6c096aeb5c1d4ec701b2acbbfb67ffeb62e13d241fca00d7b94e38a1eb53b42e53d0ef9de91046e64586e627e54557b5474365b2d7b3100f52d46740dfb58235b074f08420b752a6576045e0eb6f8f910c447789964eed3733db04a3b9d20cd8a692e12c3e42bb1c6891b41c4be22b71947f1ea06b8eb770a002e9b91a7822c952ed302cc0ec5d03641322d16e0900ad3efdf768abd129034da127d36995b4050bdb8d2431491b1c8ab666a56a9cea0767ce4c5762b5e967ef41619328d3d8e5f4a191bc799e0fc2706db12d274374f0723ac0a5155c3c95535fc0cfac4cd6c5b5900902224b43a11de5a282d4ad439e0d606671406080d551b557b0a828caa555aac74dfadd80d15f03b02f58af639f9e96795088dcff87f2a508e24a802732a39275a2327e1db4ec90b2875a0bc40613323c04176346ccd4f9856811eb50a388f9cac5ee380630d34f758774784cdaa263299cb1560138fb902e2889673b30f57aae4cbac05a4d44043df70d6abec87ecc4a7d9d1d9ebadfe877508695652e072c4de401403bb1dbe4f2f348756ef1762487a4cc734554256ae21d10f1e52e7979fd39bca13d2ca4b53fb20700de90a38caeab2869bef06cab9d3d6c51cb286744da52e5d5651d9670d89d8b5a9336d5d787cb6deac65260da8257755d3b6149c76a022081d1d8f54c5f14bf0a0e9bf8e9bfc4a0f8f43696fd2bea70fd5bfa9a19bea47bd6eacb15f95fd09c6f0af4f9eddd81f2ba117fcf0862ed2e62714c020c8062d8800f8d045c9e4a601b8711a70f0b42d8461be06628cfccdf1c10ed7b51cfd5d0df2df4dbb4eb985d4859a2860a14f51c73eddc30261002006dba5eb630e4ba253d3fde69a46b8ee9be7c7d58bfacaf1d2394886f5b0d0f08b158beb2b2f9a9c7b3ac052fbfaba7eda230b15fddc8796e455aacdb7a061cd011a741b8dc625bcecab55bd9e072ba83635c4e6a8d1c423b46d7075897a6d79dabc0738818788a8cbe90b547ca834ed3b88da53682e3ac3e09ff564aedd27b74640e42edd1aee99b4e4725199e0198bac871312c55dd7ead487a24f8725cd8e09c318cce984fba5abc6e04126c1cbfd674d93c47ebc09c0062d9c003d7f06e9aac04ff4f2aa5d21d6605fef3e32059b947d68f4060bd996113531f8ea16781d2678af9c7c1031614d8620a9815557e6d1262835b0c7464a91dd710b73ae6ef5b72966b2d58927cb5ff7aadd4a31fe5afa39775158c53499412b454f78dc2c107aac01915b421915d8a505540a2ee119c56734ead1b6c88abc9aadf0a1958b735ae1a5b095ed8ca56cba9f936c1b119ec4cd9a421ea3a05664533a366b6b0ea587a94e33ee554e828e374657349d18308eb33006949058d19a34509c3cb868084b68f8b89745a68fcd88615775c93d96e215d99bc959b57f3c1c8b32aafded7ee509ecd4456514c6aa2ad62718745582487dc9ff571bc1063f396ff18c82a93b8e8a190c7cef1b0e4ad1cce156cd1c1e19af092b71a2933fb08d2cd01090f5114e916e40f246aca8253e2a0504600f5b9a24e84bc4245d5d73f069f389031785f4922e1c2af73ecef590b149e746a24034496f861856cf9694b4e5e94346e5f5e8459f4125fdff1792f6243acb43755cf1a1a536869df38b40f0486b6483659f0a3ea809ae6691ef9fb54477abb44f32580fd3b7a004b389b608ca4b3c5a484cb9369d7ace8a12e5c54f004e71a6b69a96a3987ba60847e585ed9a2a2f22f6245e7643900092747af32aefb4e9b394435cfedf7600e63a54c0d6822ae8ec4a17d71a92388fc64b4d89c0bc195b644acab345d4f4ae262f2b043fa662d8f7aefa3feee560558675c4ffe3d48fe3c3563fd1791f7111cab8a6bd11f09cc8268a314b7dff6683b059390537867a3042f34bf849f16b4d29af44a5fe44924cb65059850c6678eca0992c40e990a0e5948f133685b376449e27e3d2a2c2a9cdc7cc540b8a28374eac168f79e46ca48b13482b553901d7b7ab7717e91e52fbb0e72acdbb326cc1b18d188e41bf307938055ec40a605cedc09f93ef8667e74f7b6252a938e8ad047c8e8a177cb958019049f344377358ab43a4f5d45021b2c4dea8d8a015a242815f9a79e85c040f8a72cfbef362305ea5b1ae448b58628d9680abba2a624b724609c88b66e9844a7b333732894b85253d24a2926d46633688b3ff318214c647bc3adebe01c443f79b753b16388fc9022341d08a58620d1003832ebea2b9ec9cc90b3e0214443e8e1873184cf66d143c9ab00257b4344b0024a363120499bee90cba438cccd86c05a29a73b9f6e39ff255a11bc63d9885fa8b82b523c6c876a5e0f37b0d47cdc0804311fd000f1d6d0b7e27c28ec1968643c83becee1def9ddecf70ab987d11b1507fd37bc72cdc8eebc6ed9e45480dd13f1a230c79a46411201ab27fadf5e1dd3f4ecfa228c00140be6e0594fdd4076402a1d87e66dc0167cf004394bea18429e9a595361d5772099a0cd4650eef888b4b34c1c183539c42bfd8e03866d542948cbc52e11fdec1a13f756addd66f919a4e7a1175f5f3fe60c89a4a99bb2e261ce9ade02d5da664cf7c44df658dac2a0e904250396ba08d7d7101998fad656051726a92f702a66c3e47ed35d1d62555346d98924c15a9cf0f293019b538365a29a8d571af996079e225c9b2993a04ee54b929cbffd0a728477602c2819aa82a1aa2c2ee14801f9f211158e0a584576a4b86ee061dd98fb9278095d229cc4c840538cdab261030273681d8cfd4a9e74162a74538e6bd9d22b15a124634b8c6b4553684e825a9a6d04af4f99474dcb2d91f0ab48c4ce40b86b07d845d18b7063fac3c0d23406846347e28345ca5da74302e96035e2f89c9569684a6765fe2d9913f21a243548e544fd5df813cc77ec7254fd90d366ebb828c9640bf43f0dd2c045527b0f7af22599082dbe84ce521d82751fd2d021b6d244a36ee23023364648a9c9d23bf8516db64e80f4949f8f66874394f9b43f4dc420d8907ca9f8441db5cf325ee4c12809920baa9a21b784b7f7ac38ae849a98ddddc978c8315fc01d90cbd3e8e8382652ced23a54707d9c1e481393c528008cebebaec55072ace0b2a524d4950f24da406c77485ca0e2eb4bb201d0bc5d620eba5c07b15c33458df05d55415ccc80220e7f7972fd0397cf6107482ca8262e0c7d3440c666097bd0d5ecd5eab9878e24bb9ac2376e0b27e0f0689c6593e045d15f4db78031ada836125b32c677167e3b64b12140af6a72aa6aedecbb9f801532f9a048fc48ba73f11f2f96fe0bba4ed120687917ed6e2b31bc654f3b9f114e77dde6ecb08a9e63ab212fb5618b1bdd6acfd290f15144f7ac61a191fcbda192f4b34a7eaeadb2f77e53af511a2ae02ae328cde8cc23b37c89c5434d864a0760d51cecfbd39095fdf76d48629575498a88e2e8f54c7d020820c6a91ed2afa9673b9c475ca8b837c1ec8abd628000f4ef12cd0a93a620eb04d775923fe518ab8ed645718a1a6d476c873b7ed2fff0d512a0cc599b93dd6a0835d3714b30d2c0cd35ff2e060f65f916c9193c8dcf022037508dab83e128385567e90cda447576b81ac2b59ea8cc215065304462054519d670cb772dc465e7fdd3644a4bed9a5d3556fb1abccdbb5733acea2623b0f6a91c1ede326757f11f30d06f5a03a97b6644e677b5079877da41032703d276ada86e8d1a6414f0a4457f856da7b70c53bac2aa195a9ed40eb3f6567b3225296cc89ec209c6c15f71b186efbcfd4019d58fc8f7ea342f9313819b1907dd687293c801ded01dd719a6542c1f1e8a21adda0b38fff4ca05e912876db9334baf93efd0f706ca5345f4422e62b67f93723668d12f3cb19107f593fda76ef6b6685525a38052717743927b6f78a90c69f071a82ec6cbb2766b71db4dc191e48c4abd433272af1cf8b31199b851cdad6657d2ccbcd200fe363054587a29a7f3efdadcc72ec8f684f2033302efd5cd405fba3e3fd8ed2b04c2aeb88fcb2969c2f7e69518c239a299fe19fe39ab9ccffb7f5839268a9e670b8eddda0a244d78b7b4efa73c05d75bbd87a9aaf3278e4482d13688ba752ab235c604b8e9e631e655ea8df22c8cb513074a48fc9781492d8aba5a4d8e0641bd70deeaa9cfc98355be20a5d8afd8c729fcc6b18e5eec0fa3f86da588f03bc82879b96cda112f3ff8a15a4f0ec2fffe1e29971a4957f3dac74e96c98a70ca246a4eb94465469170280761397c8cc50c838616007601514ed597208c816486c03727205b15fcf5f0678ece22459870a1a5a352ef46cd1a4475b7110dac84c4955ad81d016cecc2b2d1ee6809c01ff8502d26553b84b069a354c4180bfed0a59d4056ad5a2e6f7e8ab925f3475cb31bad2ba5522e7359b4bdebe5e2cbe201272bcbae03ca049bef12995d00d9b33201bb4c5c127f9231e255e9cee9238391416c67387f7c1e056fa1bfe1bee002a44d2ac3cdc9cc85cbb29deff2d06011a9ca0ef84d8a8062504382b33991000c94faf7afbf01c61b710593bbae11f8a0a5a8800f045ba1e2c44d12b84b2b678582a64ad1226102c6774d2331c503bf055bb8145db01c5e087d7cc0ed8eb094671b8a72ca43301d281a7bdc0c11e3879a399fb4766ab896dd20e08afe1d00adf430aa72cf30834277d2f1a47ed787a6557a2340958e409c572ede4437fe33f4ec9c18ed282570891cfa8b9b234ff11d53a022f96b0819a57c785a6c413fd954bdaa563d07b30386c180035225d6ea4e92eb63d47d6d7d64ccd58a7384d6614b07624702b38846f93e2d27b60a69a81478da02261fea8de8291daa0702a26dcfa661844a273504607838ecce9a819e23622c1957c2b3d409df1da71c10fc0efcdcd3a025031d462d95a298e118376305d1b128fafac7accbdc89c8fb8a827d63582d0e110ae39cc2e6406230380c7bcb835aaee4f2564dee3b0a15fe5bbdb7313da759e41ec33891b3b9e9e2179841322001eda946dc93364f542138adb9901ce29855cfde4ddd891fb2b90c8fc0edf0dbacae4324e8411963d0305448b8474f70bc225410fac69f8d8af609e4f0084330d75a7e0d8c15396ca68a7bea59ffc4b47456c308991101fa1746b92177f2b9124216389afa5b16b1bcf1b5983aa52dddb89a5c4c36f5defdd44415d9cc86d3612ed2a2e278206c5a106449f692b4adf570b007885c4dcf3c269d1804e2ef9b2c06ae086fa5827525fa85d06dd07f2ba5fc08953d2193d2e1832f6db35de9a261f01986592a736b017d1fe790e23e8e5cd04884303923dd19953f7e0f0aa2afac03d88e6c06508d39aa841a9b93ab73fba70bf04997a89dde376a9f5434f2acc0497e9c851707c979088c9d0b5d35991c3264ccc0389823fd90a460064534200b9455dcb81c78a98c0802b0dab9173d47de86f2f01ab99175e83f09b323174d3e7941a04973e4a090ed5764380fed72028451143f31fb8247add12e24883e4a42288a380e938c5412b14248038228442f1cb2351992a0852f4422345b699744d96cf98337531bb8355bd948346ca7a4663a2f46bc243de55dc2bcdd97435c19c7bbdcad0d2ef8ad6480daf84c2ee1d2c467ac7be82e1698869fb09343c3133c8d2ba510231b37723e90869a647d2cb080deb4fe380f15a0074ced7d9f81eb0b2e7fa020e699924600e647ff291e45a332cd407e92d2770f9066c4a6320a452c3d94fe8917f5b59850d22e9df99397fa8c95e383f1a3cdd6b4fa4aa26062aaf6e14c101548ba095ddc759e04ef70b3efe90e32a259d2e47f06a4634408efd9b691f96322144c6bf59328d7016b6219d24060cc2c84b58c898b024d09f888135015dd8cf41b0baa902ba4339f7fa48d0b8335a8ab46e3cb9b98032615d4e605dc29317e6ccee34f9538b245ef646fbfa8057b38160e773c3f20f2a5f99abd120ef97b23f9dc7d237862782b7f7a8a02a66c7a8088345b47c47e3812bf02c01d8d299c373cde6d7a5084ca2220d240706d62a3140815bcc867ed8d9f2beacf72276cbc73d9661061d87013d0015f5b042027f42610ff3ae7296db994c0cc6a3d0689d294b0e907bcf17d541bdd56945d6ee08deee65f2afd660210861a99d7000101cf0ad2b0d0da621fc154cbb0e5536ae7375bd61109e2da4914e29012dfb5dc66738718b7a8baba40d33bc11683400b196360e128bd8c60c1908ee8380028b9bfe7fdbbce7f0dedad4c667362eac31e3f01e423b88bbb5fd5f90d570dfca8eac192bbde69ce6babff0b7166a0af316e551f52c2243b55fa1b77fceb857d601d6fbf7269c2a2dd342fa000b149b2c5726a388fa3a948079cad98f1821f9bfe00d59048f5459a38fea49e39b8baa0810cde4c9636d4e59793dad5f9e720193cae6e3351d6f13806a78e2af0f1dec8301616705604e95fdb0959e3d712666292e264a1ff4bad0fcbfc4e62babbc0b78cce3a0adf91b8b449e506e43e827295df9da124000d75752c26abb56433db255c180099cc0ace77b5e9aba179112ba368e750079397a0903425c11c13e7f53f0d1116817d86472b7d1efca1f8996297698db5f2a76365ae482a1bddd3d145a6d8c399b9111a5ff7313b49ad400740077ad855fc90a7cf48a964b6244987e06d494762261ab1ad96befbd65a141858771ee58e04cc4dfea29360b0f7aa685a88fd7b062947341fe9e331c423def51696fdf2ebbeee150f4389cf074b688402e191fa51524a1d595f4b3c261a94aeff6898ff496d19542843451cf823853db3600a18ec85257725d0d125179c2a56e3e933408946661b425222445a9cee59aac37fc502d3102cd282c7bcda292346531c8d01dd41845a72adf974c52dd15dd50c5bde6980e114ea353b11f237014907f6de1799ff10a50fd63132f84bb8c80cb53542f6f2098e1ba16361ee0d098c609a036ca46124e7dc75778448cf4f1d295483f38494a1978cf81b4098872416f6b37a04a298fef8bedb489816d2d90c1b61ab77a0761613c6265241a38773bcb9adf3962fc714935375ea78b584f22ac60391391f1c44b25cd52a8846f43b4c8e120e758e2fe491c30c532684c04276cd4759dc51a855db2891c032771b80addabb9f61bca48e34320b86d9a129064bce5e4f643145a0a7177222254e55d5472526c825f5d3c6b30b88a6a84809dfdda210f88dcba38f6e1f26e6ed245da3a40c4863dabf226cd5f83991c077cb3b4d6e6370ea2a36beb11b127a474298362a66c47cad2c51531afc4951bc249d8bc3c7b77243f994b7308ea4b80a3f9672bb6b6962f504a192f94ea1343e5804e47d29d49d125af6b3adf59fdc0dc92bb9591c4bf1740a3e6872c1b7deec6d841e163f81dd60d58f3d0ca07a1736246f14a2a5077db0e4df08107624fccbbd3cb45ec7918d2f67e5a85190017d9725b78eb71275d4a14bef80ae5a49ff879f087872984486aed02e31c3d4afcfc474c36d753101eced506ca15c9c4782a1ecce0f308500f21b1edcde226d25472df1a526f4183e8162d5b108405fd1bfa3d2dd7b5a7d97d6c1160d5b872547d352ffe14749d456ccbbf623c0a803e0246eb824beb0cdf93353dd11358f5967ab994e0c3b64baf5e77ae114c1d02ee23c8a94c5b3359e9e7b6d793ca089adc68560b613050e64b47f3af6c173048fc6c6f02bfe7ddbe0589400b9c4d5f7bf7654712e3bfc2c306717c29ded4dff1bb9b86f41b1e2fa188604bfaffc2e68a02c51214e0ff64e082bf5526425b2968abc4ccc458e028da3309443a6130ee0abb8bcf22025a972bd6044e6bee82a41642c5b515d802fd7ac371b71a3c467c01f0cac298cc01f15aa39ef75840a975971653740b827ed9e8deed5a415b30833821cc15b828c331eb55879c60a14527cf3a437a59743cd01818fda115fb3e85139982599a66b9aabb14f64df4c26f0847d49ccd0cc7a5fae4570f92065533f1522a371c4a223905b4dba08a6df443441c874fa30ed1344bf059debd9a9d13fb01d6af90b4efdd4ed63bd50a77623cbe6c8db43b2de9602d3eeb82fb2c339b595a90ce7b48d06077795e8e58a423feff7180eba0e1ac312a266a23533c156142e4f1ed380bc742ae1cc8b319b2a4bc3fa76595f7a3fac0ae02a829ebd4406e968442b3cf28a661fa2eaf3fa9ad924554757ca0950f1fdf9034b097a34b8ec58d15ce19f40b6d28d77e2b028f44fdf150f03b73a84b907984c7512f0681f357d55da3735f2431031866b064230299d8bdf28268b5b1b285cd165aeade9d8d61c2026acb839ed0de8349a1fa60d79d1569a75b59ab0e1e412d759810d3b0aa308cfd39e6d780c81f135dc948dd7afb0054b082705d96019b9dd5fc97a04da6ab2dfa89d3204d88c90f47ba59a14a33f24329f29a3e916c10d1ddd6585953ec868da56344dad9c73e2607e725fed1f44420e10d2cf377c078812b2da31d35d378d6ae2a79123bc884aa3866ad7a4b12ffb095e50b0ff9913ab4faa147203ce878ea86bd7a808acb619b4844cb426e2f2c9b3dbb2045179030fd142d6c3575e3f120e95a12690b3add30d953f5b97cda5f0bf1db70e88e32bdbf99083f3f4cdba0efa6e8e76ede27dd6f5e986e076a0653b1530fba7bdddf9b33ce95450c32e6ae179997888e2add51dd386dc51b24c632ddfc6f8cd3ed3d821800c634dff52de5c6837ee5e4e5b4044531370b1c1b155d641e7bf6cf4dacbc740a6500be09eb79e121e3a5ea7a821345ec59a2e1dc046c85b9315cd99a7ef4da8360b2458991464b09259e0d0d2af5b422a40be37a52577a1d3e85e04e7fc172c8e2f1a106d825bc7c95f471fa16a522c9c63d526452293044200e5fce10c79ee52eeb20012676d7d82cfcf26a5947813cd71801cbac9f7b693c9c83262e5319cb88b0404b2a9f5cd597f3f07d17b4fd5ed000e28464648254cc8fb61580867f83dbbc665dc55a9c80143da2a5777fd2f5bb7c2cbeea0a0108a26d16023bbd9ee7a389fed3bfb66b7b4f229793e79123c9009f1134de9c00f950b5fe89ca71d60bd8e3f04989a4ea40b23456f0634ee5a0d592e4ab149012bff980f14a0618f6d8665da5347e47865db3f82f97c06d9738116b8c782b468c8d70db68471fe7e754243db3a5c3cee927db3cbfbdc58c5b94cd076d714570d472ac80da158c116d4956c95c23d137305197d2633327a4a30f6c40570625bf3d1a51bac5ba662d3ac495de0d92362437ab242b417d8825c9b7c4570423943682f5e1784dbb7437ed8b25de6ed2cda10918bd9f993c649657b93cb0deee1935f1247b5694b24e965f9b2bd5351bb3c19ed57daf71c18aa04d77f289574e5d660620355f9b564a58e54b36608ec03fabe746e5eff9bacf22dee1cea38919cf33c3c7cba8892f2fa6d4742ea866def96e0282507082f9e13d8246194577f8381efd764edec6894a06d97064fc34d4d8703c101bfae502fb2611782c65034c4440304fdec4025d1004cccc8c151c1804b2fe4118b63fb299e2fc275b3a6a6da6474c2856d4e5e277588d6767ed14756dadd2b04f6f787df1c38015ab95d2f0401ccad2ed0b4719ae9d17ce4c15348047c80ba7dc28a870f7f936478e8d275e710a582cdfcca1c432ef24adb8148bc0592bd68b406edf7581c83e10f83ddc72260e515c9de6fd58108bfd9fc418c57c36ddabcaec1a508b2c2316f726b2b7ef062f18d7906c1bf76bb8554caea80b5815f6550c01a582e83f58ee7e8b3e363684c967f6fe5bf114478d39e4d8bfa18c7ad1e81f080a96a3e86f3a5302e7510fa4c6a0bbb969d4181bf13f4cefa2694905330141f7a6d190f2c65c4348e33c5d9ef81287e7e7f28a9558d5f5b973fff25d2b6502c5b4090be6e7ea4ba31dbfc493f48e07db256989803e07a8585d879bb69f875fde2797fdec6aaa00d43291a1ac97da3a1a476dec1678a92e68d8dcc4d274ba3c01219b196817df70e6ce56fb44f1490c253ac794ac11bcba14af96fe2451fd9e75fde183c1afa911f2eae793059da325bd911f34ca98c00d181da28e880ee3d87e255e8567b023d5ce5edafb0bc844e14d27c6f1c1e78b03e3ee2809470b15953f47c8f4c520e96e62467cceabc27dd6e6d7ca8e266f95a04028e3f6f958cd62363a9bdeccab44a64684d8c40a65bc966ce4be9ca29df59610cf2cea95ec47e614bc0a90c5db31360a51f62ad348a3fa1e32ef5c9bb1e56d60a8a4e81ae23f0d452fcd1293f76cb8be89b1876c7d07f6b5f4ba80bd235d291b7a0574df324cb63643ace4313baaf97f0dea55204ac7b2f4c4cff286854abc9030720e41c0e3e8afbe86bd4e84875c139521574126d2f54ef5c39685eab2a44efe93cf28eff81fd6449be9764a001a0c680ad804c7f8ad24aef7d102740180670d8b34c29a732a0ab9529efd21c03bf77c6be687bc66b1dad7e0e7a0dbc9a1c722380a57821cbc77798690b0adf5fe624d8f69704cba41e32009ac2b968b782b427d9cb4830fcb0e2a87835be5a62d5521a6503b2ab180746a086ef585881fc6e07bda87d8253ccc0c0ae860fee088dc4042291c1ebfa18710cdf1417de9bde92247291ce6524496f05aa670c445e19056a92ef2e820f99c017804746a457af5ef249fe5a934db024acfac663a3afe97f505941e6d18cef871bb8b2af57d0620ec10670de7d86ab337cd3c9472523d2f15f95c281961357b935fa163829801513a47f6afe8b2bff370a852342963e988ce30a648f04bcb8e4d04fa8d51ad620d2fa08fc3b9e642d0604669c03821fbe15d05bef82dd01abd62fd23f8d4f7f7afccc09029b75739d675ff69a7141d744398a12d6266b89fd9d0a608f63fce175e899a3cd7a490f267b53cad8917bd3577bb26a80e21670f66598ec99bfad4187172f9db1371593c77464b97bfe2938ca7c8e8a17f9a2d4632b76675e970799e4f2f6bcc001abf4dff767bb90641207b17505c14e2af0ab3d81d8680dc4ce2c8423c29ab798cfdf81a313a309f94d5e62fc065c063a290b9756d63b4fd15bc498a9db091917d0077a46550a223ad3d7042208e1315da8c5aef7bed77df463c4e66127c79e31c23ed2a0b199e52c7144310b12caf0b2b3779587e64f38a229d8eb169b41a9ebcc304a32b662ebf72ad60df1e20f2d4ff350b54635013b582acfd06530034e94cc460c298da7e79ace44ccd7f838dc0c7d00fd0de19405191039f2f4e7bf6cecd3e6e98c29889959174c02808a7474787fc8861b6fe5638ae9e5824f614f66d81e5143ddb7b31538841807af7fd0a008daa970f10cad39b169205f7627ec960e3ec82ff9ee50ed37bbae00b9369ab4bd9a8fb6850e6c9d6f61948da7f77fde435840a89fe2f20e214c8504bdae00ef0a842023c27e0b5c94dcbae87b8b625b1bf854c7925ad791641d4d32145e18f5388f1dcf8df42ceb676f8f602906b86ad9b26561d455726c0ea144b03da64271d9cababb83ab82ef8a293a56a9b99111b195c9104bb18d94ec097ee21f345979d335aa0d58aea3b60a456680985c82a029f41c929e7bf95b35c9792e6dd062ec24a844a980e8eb969c1816afdf3b32054194233f4318eaf9449c582cb51dfcaf78691acc316696a1481d349ba04626599122a3473e5eaab975addb1d98f5f5d4248f79a07aa27614efd80fae2f7e73e1fea48579c41ebc063d740398eabe76d2d5c1bd341c9433bf6326b9082487485b78b7f541e081f8c03c11d907900094a7e034996304281683f6c57212a716a334495323239f8f09c246024025bad88e9be44e01d52a2b8b044a0b8b4a3b6acc1846d8d00e4c83683e58eccdb4a1f83e1cca82452a6b060a3c98b794e4fb0dec6a63878bae529438d07d70246f8a410f5547945d27a3cfcb10d9940c7a09874c208a9252a665655c88c9d1e166a68127fc0a5c7513a5a0ae18e648194b60d3d7cbd535e2ee9c503a22646282d4c21c592a81d51333c703d896d836d8d4b2c07146d4b42da4e33dc40376debfe7dd868a3f3786a1bf0ecc9474d8f19a50825ed2e25d35e1cd9e60fb2e474b028383b9ec9e238c0e7e939933dc89be875e9a9c66802627b06d3968a5b2ab17897d28292a02f6eaeba7b567b3bbfff26314284a3c8607b99ee64098ad7fe04c1c066870488ffee2bbdd5b57f5fe0edb131881080342e4d8350412e77fbe0b943f83a4a03e1398f32a3719ba71c446d73b3b85ef4a903ff9bebae5c1a37a9037950e744aaefffd46015531611f27b3a5e8d4c19f22d619e19c7653bb43015b4a8f74d14e97c6370c09ff3d4630f3d704e5fc0f4d52e01685c0be01ce7f142d96fb95f69600b69ef165a860ac7f9a84efe134286ab28cf0b7e5d776df0f763aed3bcceb14a58fa287119a460d6a095c93bdde197e80fe31c15eaa454b8ae034333249e84c311e2d004c67760ef977fd8373663258994f7514e30fdfe4fa30bd20e9135401864c9bf1848d5fb8ec50af9c84d07e46bd0ddea8bf1561a3665ebd604e5f2b9f8f4438299ae848bdb1733359c89e5d46e4e85b346e352a1471483703adc5d98620ab69b9f22650f47e285d2da148205088c933492519a5230a031c82c5ca186d52c499c4c707704582f4ef8f8a348195b4d8bd3d2e12273de052c8ed026fc8597847a2d17dd000859facd29a1fecb984088f8ff808aa04618a97351bde1c17ad06747cf4399118bd18e625c78707caf1f0ca75bb08ee3df9b4474dd8a70ce1b44b2ebb69ace34c8b488c8453419a20e4a8c1938a4be2d095f17b6c9b8216cae9de7057e384af299c12d1cb36b6e4648b24802d808c84736c22f855adac74733849095200a34879accb9c2b008c14d3671235912cf18feee52e0907a8b08af1ac419de55c12b4370ce7b45706d4373ee1b45ba4641870e976f6aa5623b2c16a7d4952dfd4ce8a00d2243c990ce908b085bb385c32400a5528bc41d0b83dc374476dda09df75d895c192467deace4ba4539eb5d91ba4a459ce34d91b9aed0a343c43885a9b68755a5a654c2462d582b2a7553dc0e168a79eaadd3cac15cdb86495015270b862f7dfe6e29d117ae8c95fb33b44d8912b2e5b58007a65dccc65e6674ca6023e7070830523e54875b615627c7461cbc892da27b92c82066a71a7820664e8747b268548320e537e5a0654dad0318d33739397c98dead6dcd61baca4a42a470305fba071c105ce312bbd1a7b444855b3bd2d4686bc208c0e5d6bc69072dc0f916dc86e00289186b2a5a35be2000dc96fb4ff997d4572c2669ed2da57cfd62cf0c11436e1dc327edbfc94809a685bb68160b76975850cbf7aff65b759b0c09b11189e746347162267c53f3875389ca606ce0e4b2b55443eab9792eac69f04cd5f8a0c76546e79099cca4060b9db260885514fd0728d08fdfc101722a70a0ccdc623b3998ea15200538461b10de79f55a5b68f9b71bfd5b92c922d5f3d3db5701f8958e28019acc87fa52ad02521dae03409ed2316bfcd20e4ee7c3b626c67da40064bfe6c92352646e19b805a0240a48cae94290ca8ee33ba2c68bf209a518c4ce4ab63abf7d328289f973c0f448f0d8609a540a01f56ba1d7974ef424fb90d786075fc26171516bb7b7deacfdd6a8d142c6be38770055b1f50cf5434302312fca14d406f2a0e6d6655425ae23a1ed6f055cda21f58469f8cf8217e94a3bd1f8eb7cafe355684a88e30a6a7f37eb8d34a4c54beac103edd65ad1bf41267ed41bce6892785bf90e4eb8833cc3bd72140fc85fcd2acaa60cc9a63e814957f654d8295820a6a68f65145ed7ef6cab7de3f161a2ab3521f8dc361a7263bddb1554c815b2a9cfcc72a3fda69b42d38a38e630e1465b0defdc3ce87ae1125a47836bac37a8def691da09b950f2d9b5d3d583f5af8f89d690673b47a53e45eec2c0da305cb6907c5aaf4d118a77156baae9b1a3dc8171abf83809d3eaad203b09daf0588832bd2630663835393e3debd7014de939006a82247367f8cb0e4a7ce321f1dd2ecc8132dfa02b505a913909110756ef7fe697b6d63708a2029af73e6e806b63c50ad29117324e462ee40046a04ecfa810c6552eb2a589a91cab43fb004a48264c1af7ecf07d65f472d2e3d699cc6934fb930fdce230210350c632e4a4ee421b253c8f6ab0bca09ab1c883d60ee5d6ea1836ea13014f9405429d710566e22cc04dc980485678af53323020a1eb297a45b15d8daeb9621f530ec7ed824d4f4460f5461ea6f536b05f9283f34818d00043895d33cc5a68f9fac54bd32e3a2ae03edbb1f5766ae1e026bc41ac2971e72507ab7a1ea2124282e7fd507a0346c0267b8c30282d542a8264ec169871c46a40ec8b8f8d8fd25772dc968495aac829ed489a225d0bfd3b5f485336b85b75b9e35e66213a7669936cd90062b10fc41b042ceec3db1878f483fc6062f7d2b464a36b2db8612201c5b54483153135846c7314d397050b44ab34a372726b8c0f31221e4aaee3834f1c1f5a6664a8ed62cae034ae94d88cc001f005f2fdba04738b05aefb9d61adf029bd8758c592c29589ba13f2ab1ec74ad6ba79074b965bcd15bca47e3cebc1e79340109080bbb2c3d8bc08a00540bf9324ec40086d283d8e4677fb0b6668da255d7c9d5622f446c693d0dec176cdd3fb4ae133ca48d3e1c78bfedb39803577b83d108b5730b6989efc34120c22e6f5a84a3ec5079eed23cc8b5ad559fb1c6fa3777b82e58b1f32a2458ba2dcc01fd882f984034bc6e79a1023bdf5e11b0f00b8ce98a07fc2da95a6bbfd827dd16aee2cbd89570c0c829e1dd7631df9a20592cb8c22e4f2e17f6e453313b7e720b2242b36ce8e9bb374bf959980d8b96d73b4a2c9d2393db7b482d9ec0947008f428509f95f8f9e31e81297c6a0f80a0331e57d713d981c48500b83fb01e19fd3004a97dfcacda0bf2b4ab1be2be862e4f711112128f5a87cd0047f066eb83be5d8a32a112c79dac5250f3faa4afbcb344e95e36b27de2e04d910a2fc2a9d489edf2eb128271294cc936d09e155d5282ebdf8b35be5cfb2e62b18f29866a228fb8d645bbaba10a874959ab69d198a5ddf8ac221fc8114474472a62e7ff578edce69daf92e530efec787d6140fcbb2d80f78b9765c74286e32876ffed622b9efbed42a41c22ae886a5eeb1e472b759814528cba196c50e0ab408486ceac4ae3162b951d937c1d473e1909521470d396de48701259c3129da773e1e8f1bdf4319a9c9bf1968fd0986420455a5ad391277dac53ab87f132ada97bafecd7fdd504b279fdb8a8ede98afd9f0838aa66005b6884b5c7024fdd2b7ed636c0b65119777356e065a6ad8046e6090c780e3c150f783f1ab6bb8c553eb8c663542950be71728613e038142392c64fe1c2b19a03bad303e8476206d9841d8b243aaeed9b09770b6c54363328d82ac9240624f3a0c6a3135a6abd215626d88d41ceff2b5ce335e2cc4ce39c8d4f3a4af7e870e1e74a9d03da4c17d2ceab8b1246fa554d230ee8dee04844f8b9f0727b41a0b2aba1cb15776bde4540e56841c5309c32f58eaff86f168b90254af72a9161f3cfdaeea2eeac8bc3376d29ffffe84bffc3d5ebbd97642cfca102c5a1070e2060dce131c9f9d945590059b86c302eeac0d7ed33457bbbcc11b4aa4a5092d4563a1f1830da78e79a70980e63a321d5353e2e7b8d7fe36108422a0b822c217da69aec17e30f3d45c4b07454fb508815f9ff9e130a82564522041159c1cdb2588ad74e5118895712362afa02d94e09dfb6ddd7f278ac2b247905f1006ce6983eba52dcb65d442434126f4dcd7ecf31f93af6183e16e385b180106321c0ac918a1417c3b42bc9118b887cc8c2731938a75f2a4fc9c3035922e6787cfb07ace23c42ea7e7eb4b650fb1ae215a5914a802bd0340fe5177e3308f60350ee6a5c6f3053e1d50ae501ed03344e2d6fb5bc03bfa1c1cf3526aa0929233501104ea51041a2b10fc2643e798a3db2e107cd78086d9c0800b7bae122c13edce542df0fbe1adec428b2a24a4b1025e40e70e7cb3bb9015dbd81bebb060e4ffd2cd1dc025a8e9ff9722cd211cbbd0c7559a737ae14247ac31b81c141a62d2e167ab63908cc4c276d72323f7e0efbcfccca22d5214ab2a2bdb3c31a27811823fa8810e0ea61fa46a028715e8ac02688f4d8c77251704699ebbd44f442b4907373923d634b8588924ec009f62a142a66b8677c027b1b3a96c9ff7a8a027ee31155be41d1b6ee3e42a2e9487a9a808d1a2eafb3d00578e2863b0985b0f99d20eacf77d9aba4b8cbe1f5dcf833818596ea244f7bb0dd6ac00a0bb4f3ecabc6b67c42579af72b9c9f42a4ee5f57d903929e7a95a8106e47ae4fda3b72ddd20816ef2fd1defa0615a7274598bb3ecc5f04e0d126243d899cae4d86242dd27021c0201af7198bf499f7b0af32f56b10b8abc12ff72b7f638f25e9178907e96001e835e9887260314c79ee2478a0d2ac3049dd2738d67d97098e196c49e4684ad6ca18c5e15f681addee95507d1ddf3c1d89c3f64f754f428d35cbf8015294419d02c323f8ba06c9d2a5ea2cfb9b54e7ff9101c46bf3c4ef6743eaf6d596c16140ed7e78b75bb9037d6376b262bc5898e84e6c4b429e53798e0aed13eeabf2ab2ef8790809f0bc70eb221a4b26447a1f3ac742c3bca080bba7a56c8d11031bf934ce46a9c7aae55524c6cf722a4af2c40467051a5ffa1234f9c9d8662c99f49150d5f0da6339fa40c9282306b3be2f0afcf13a4e9a324db560dcffbf09aa2359aac43515c2c477b7daa568818c3254b67b3e55882baa4759e393786ff793f07b9dec7cad8ab6f803bb712087c68b8291f59c783d6f4b73b8c7a117ed726ce4e56013307e385da17676a72510f70696bc086251f6bdbaf0b569f46d569eaa50d8b11d0a0babe56dd2d078641401dc8be4d736ea2b1f537f0b86ef89c50a8972254d2469dfc247685ca88c9dbfa7697edbda8eabe6465edd7b3c54913e81eda0c016296f9c17ec7e56da45f541186fe3c92c844566238a394a2fa1d5eb8201ce459ffecc0ea6ec8817a08001edd5a8839b5de9cfd82adeca2b6608ef7237d8cb583c13a1f3d307f9096e6a993ea99679573a452352efae00f7a5249a03388bf942606359cdec7cae78f7890233a74e4abad99c6d39a2a4065c9651d4eb1db7fb3aebc820e187fe2d57304cb6e0b22a486e78329436e3f566da073d984a818abcd97719d2e39485313464be2ba8a6aaecd31b89fa36d4ac1368d5ef811ea3d53e214e03f0cca34845a03f62d70468a55d00dbbcc48831879504e12c259513669b2d7b638ee1bed9236b2c683c014270817430c0b7e3d3045ce1561c9a88eaa18bc99a5f76923ef15e10106559f9770c99401e7c08338111990f83e17b57faec90980f9cbdc87ea84600d8fd319dd56c807644ac8389209a1dee94e7bad55f3d37f6d7a86edc437aff78c4430b2392350636168b7dc14bd7a9e1532aee43d24a38f44998aa2fd9dfe8adb4a0db20f6b11f543f009c7608a40673b73e617cbad7dc8e36890c1671cbd8df5841e144807698ae2e4d3250e0c13bcbcbb080faddfcbf51ede8017027989a3902def2d8a01c8b112416db9898d4c0ad6160f5b4fd7cc2cd503f9cac58952fbb80d3b6f8affd5ac9a63b9896be5ea08eebc521c02886613294d607121b149886b778d77e7b752e2eb9878a2593e10efd41cb48802ddf6b93efcdb98b49333251b166592ec32d4374121937da5cb7aefbdc003ca48e5017f9a518d2683bb50b5f0e785bbd8052374caf5465175fd04f20bc5f1b974ef6e7006cec34b32cbe9041230b4ca4752dfd9785312e54d3a20496e0a46286880c9d87bb519ec9b1c6c466db91f4e41db0c3ff7e7e0dbcc2724dc465974da68f47b14a19798a20ed025b1d54a3abd018423e20be2dc5dcd2029f05c6897d51688b3ff743dfa6479693518007303e10b8d5337ae9bd016300a45e377896c9da20fb6411b6cde8b06383cff380269dcd28b12bb7323897d229baabc07aa71d4767603a053a55f14f7a26aa253b453de2be2d5d4121f92177bfb398db9f56af9a03ada085e9e3f3e69fd9236b2968dff3c230dc1d03de41bcc64a8635882b89b40d864f0cfdea0239a36f6daa4e8ff0d5566c166162d6f6044e08ce1d0083b1368d6a1a0e1e04ba3e167d916307b924330fc76d38ae507d85187acb3c7390cd5de2d15354ff4552382e798e21e276134e4be8b8238f7971755b937547f48469e38fd490072c241aa459a50d60eff00369a56711a7414e2e3ef8cf070e30087e65d9aac78465113146778979682d15b75d513bba31048532d3de2a64003aad419a616d03bff8162d9a7a0e7f878230966871c6a2f40a0b5eec7e7ab94d74aa971318119b7369bb9ae97b3484b65019871818da62fdc0db5f0b4abb0e48911928f1b4b84899b570a22aaac8e159ca3c972ddc1e8bb6ff7890e6da470f7346ae720b991ed924181dc75c19589635092efda0e2fc00e9bb820a4f7fefab66d2ea497d4708b80c76a4dcf643e16ede6bad3ff47e8dfb1d4fa84a7354fdd148c886a77934bbec47ceebb6950079d3db01e2b9d3fccc2fb143a1eb02b14a15c449bbdc1cd42c419da0a6ec4d4d0171f889eb3ba8151a11f5dfa696d6a6231c4fa0df574e68b2385ac5579bf1520be3f487ec5a7e162becab55b6669706b12173f41c999771e2598542a228c00524e1e408d41ff1a62fb7a91706dd0e8e6e8a2b3df3843631b1548480014f69d2cbfd70bcbd68706a4d7785081624f1619f9a8614f058436b21d6e193f40bd9564b6c454b946aa99f6b94a882eca7a7f4adfbbca085082074ff730c76d666d100ca69e0edfeae389c4c784e766ce59d53d645623980c382545b429f4ca978dd9235ec465538ffab97bf07c4d27957681c5b5104a03280f30513b56713a85cc94ba9afaf1a6f0f7ad95ac9385eedb47ef0a54e8082c22d08caeba46d15a48d17eb43d27fd56b009218ac015d993bbdb7452d1ccef147d5bc3f2d4c626c37868264465dce07b13efbefc06b935cf2d93fe494ecc33194448e850af3c82020802c4970e84d5c9f504e8791f3b50869715c6550769627a753eb294e4642414f9153e9edcb449bf9c5a4e946e1064096e2c2945868a9b02c886e382a8043e6267dc0823caa15c9dd24301a723bda2138db9200d0399e35574d24470458176028fb1d58d917eddde487dcf239cf49f94cbbf90b2b62b18873568561da19d68bec7a4f2653399f83f5e3b9124e33c37f569cb76d4915cf517b6eab2791d725a33712c7bab07842737aec8dd41a4639d324f8cf93abd817d2ade8e6273d00bb848550797f085ddbe9c468b11e47d609fc9a5b8f1a3829ae6294236643b6d9adaf35705b4926d643a6920af281017d726981d753805be9b39692a0149d186c0bdd5102a7d402474245966297c03238f8f7a8c048b2d04e8dbce9f1935a11daa52bd886b7a1de75143d41dd901cc93660f074e97909a9f3a46af68b9ab90340f703a20d73436d6a5710c201ac07ca3202403956f306ecad41f03c2587293898ba64d21eb24a39bfbc7e1435f0d7463b808a3df5c9ff1a4d166dbb43f9ad34eabe8bd8b556eac136821dc206c1d171ddba75cc26ee3805ce8a3fab0d17724d26666a711ab30ea885590466f3fbb93ab6100092dd9352f2a18497fde288c7cf4c27927e175686ed880cb06472a8cc68da0389038528c9720c06dfe7b475e097cf82dbc9e9538b25a566891d5c151b87fe7befd25744315b06aaff748cd0ebe29714e04412ce3e91433afdde6c04cfdd2b1f9e62733effc9414c1e4d1980d07a1e9cd3bc80eb042145afe7f9059c1c9c59aacf421c4d1c2090aab6f48a1490456177210368f8097bc84aaefa3fa6959b01f1a4209f68923a3b0687f298a49586ecb5e12989c4eab6fc2cdfc14e578a438fd096de688461e7bd73e6c432480df97a1dcc78a62170028194108f1153647b0f1a52dfc3818d6531327fd569feb8e491d1d347ba0d769c8bafa7c4aa38eaceb19f55b72243f5c9b83d1cb0ddc81be175aef340f7d1a759ffbcbd71d966fc701312fe5ef570aae3091abd636459fe3b37d6879413dfc50ae8ebfe284229b6905299e1e51e100f78636c45c3ecbda41de5e39f5e2f6e12e6218351f48775afb43e59cddae2aa18d789dce0f06be7024bec828366b913496bf53c1847e2715132081b673684a8e1f5fad30fc39f874e0db3312dd1bc21544ea6e4067b34afb963872a5424f858b89039262381fd63a8d65b6ea3ce8f6ccaa196630ce4b813d3f6d20683bca589725bf1f701eaefa7123ee40e34214cb3c3269fed2bdb929954980777d70462c21d29e7d20217c88de08ccc2853dcd803f0829725dd269e554c4aee35ef119b8a7b7c1b3da657a98f5f7eb753980f13e0291e09f4636ecb3c8fc54ef52ff91c1f693ce9fe1d9a313fc7c5442343bc0e3528798d5a614f07ed0c410da5eca107ec4ac69bad719e7627be88ee5ad6493cd4263f11878a77a8d515805512acad27ecc00673bd32c800d33965366ea3c067fd12cb4c3382c574d6c39e534224c9805cc4187c9c48eb2a7b7831edbfba96f380ec90335288925ddb6f3a7d9976613d93a035aa563953ee60a219b6c606aa5ce2175b62698ae99171f7270d59336df10a8fc7a5a52848ba814698979c7f66edea7b77965dfac89f3c86acd53b5ac6bb84b611b4faf662997ad5f7e406c80aa6d01d4c1fcc96c3c7cc94d9d8a22ab966105a80e548894af762ee51e482430a7f65b1a2ed7f50adca1e022015453ba81578da0044dc02a3094de5f37104f066bd4f9e1d5008230310267360b045b984ab80fbccf9be63451c74088a141ed547b831b67fccfc3f140ef58c057e7b9f7299e9100d13b914092effef4c0c6d0f3b55ebd9c86328ce098d5079e12c0d710550b49ffb8a84648ba941c9a30db1ad754b97e4288e9c4863293835e2d2e8cf4181fd2e386a2ecdf7bd25b2bacdffb724d302f48e923c8c06d391152d038e6193a383825e35727352933865d07516c6e7578405c38db9aec97dd1febc8d0c7ac5298b2d859f0cdd48a5d64a929c22de5bf57a3371a62458679b16e8a963f4fcf5cd087acb9bd8a0971b8db86ac4eaca45339991ead3a4b34eb87ba46207dea42f8d8f16484c3dbb9f01853eb037b7c0d4f7e6d3c9394700f3d632ddf348611a5c2c9a434f84cc209080ba0e8fd34387a656e492247de0b8d55db3f0cf6bc11ac14399d6a4b4d104cd9c50fae5d88d88f19c81fdcccff01d6118504ce0da66f89451d96fa59cfe8094e9c5e90c36839af72fa933155fcbd322019219fb52cdc03f33ccccf7b06bc1d021a332c42d3aed3558d36452a331eda4d1a7d4843ea6fca7fc867263dbd0feefaab5e1c10e71c13b349dbcbbe701f4e3f128d289f3d5487b4cf45d5f46a67ee320eb49a55f1b8d713895a720cf4819ec823968c74c500ac9e642ae1d8f16777fbbc193e225109fd0abdbc84f7d1ce93658a39639f8fec8b8f2e9a546c7dc99d3102d45fec4987fa23b3d72d9a45bf828438abbbcee408f3078e612db639484dc2673f37eb91ac16fb0a6cd6b4047eaeb445fb86af90f6032b2dc6eab8af67129a23c3ca8d58e0f14c896b05026fec3aafc3e053da15974fafc7762bfc04a024222bacef42553e60d76b6719cf19d0bbe734c1efa49369b2cca0f523e10a10ce3058753deaccfe0040512744810be6bec707132f1357c9d21d37871391a5824fc13535b55ef40b73b0476af58f06085f81a04cdc20d841d99f09e1156e4b9184b179e18952c564557fb6ef0f2074335495f2678f03be91418574440ec213bae4ad1ceb06be238a034b8984fb43334d2ea52e4f0077e75f623ede84210a82f795826f9a55153875e92040bc5410150e8dabe2077c54c1c472c6dbca97e61ee004b486038abc4a8a5730903a4a1b2a00e38ecb70492c69cd2567a73ca427ef4873c99d13bd47b3d8e437fe9cd06cfddf58a891bd253e5828c20a0485a22154f47bec61783d96404740d4e59bc5893221f67a2eff81ffbb49e4d2caeeee9d49061f08230981083aad812768a2aba61e26785b68728652eb79fe7652b53a3dd451a2f5d3737579ae54fa8cb5420f406969a4a414cb3a90ad59ed7d38274e296bbd2412d2de8baec12d8c0ed2e476a4c54cee5ca7f4f6e25b7cefc31b74e7d544317eb5e6ac745ad4dafbef06dd39299d94523a2deb819c5ad69c0e42b72e561de1444d4815afeca6b42f27aebb74adcae672e2a6bd178df65ef4dbb59e811c530ae4515a799ddac839a32ff42912b85f5e9e4d4d48d6f7b221dc3cf5dcae0b41f837d0b97a206f3708c75a16bb5ae7acf5a7947356d5a4349a01ab2bdf2aa951afbdc1a93635c78610c20379100ec2f9da6ed0bf7505e5c88bd2512d8b5d9d0669e7e3cebf9db58d1c5639446e404e2ba503e39b9b07f22b078f07f2921a264a078eb91d693123b7cef5032baffb39d788e7d38dc203847ac489c883abf307f63ae9ecc1d71d7b593728c7c6605dfb2fb7232d5e72fe920f02be41385cf0257fc0c157e9ab8bb17ea374759211cd26b7a3226600f2cac38670c9ffe0c2b9413758276dc191573584676e61d2c891adab330dba7920af989597cddf201e57679babcd2802cb0f61c72dd299c7570f90305d9d45e0719d7436554760f9f279aec4e811b89f5e2dff75d279c7bb940f7460172ff1ebc9ca18a5fd887f8306f799f8a75bc47327c53f358175be736a0836510b97be45b05cbf5617bd5ac6f30649103e78fa1f80f001bde8f7bb1edfd9f5a8d65b169661164f798364bdfa8aa3e2cff8f46aebabac5f45b0d54569553dd79cabd5cbd3e5d983965d78f175aecce69cab659cab65dc72d56fababb3a909b16efd7bb3eae775aa64b5f9934de95a35897dfaf6e9d35abd13372b8ceddbf72813c7d48498da8f1df6c1ea66a53d29ad5756faec7e667d569d4ad7aa64531ef65ed408dc8e84e89233d721c7226d8e5cc52057def334b1acbbce8b52ac6bc5de742a3d9c880cfc7576ecd881b5999ddfb1e3b1e02827a1cdb487e23ebe25fb37d114f7e9ceefa7f80dca796cb3b3e3dfe31dd7ce8ececeb33b3bbf43e777ecececfc4967e7edb03a0fe4b0330beef34a08e2ed460dec6fdddfabf77ff7a96fffbef5a5c76f73f338ffa65fb2c47fb2a0f3bee33bfb4db223efc0b20ee41d09384a075b0163c1743592f341a6c7f4d1d54660fcafbfbdda8ba3fc6a2e541c55c5fdf415e7c39b882e81fd1d0bfe4f9a901e4adaf12a0d678de02043c58d1948346fc8e006993a281c669c587345911b539831638e54af318317624ac0860d69a84089f6d7cdc58bf75ebec4da6d91529d730f9f0855c07f3d941dd6697c073684adc1eb44a78cadbdd79e7baf619de6da1859beb34eded0500ff949fcceee26d99123967520cbf70eba1de7cf9d7353c6e728ad281d23438bdf0df2f7cde1899ee649fa9fa243f81e7cee7a5f9d834da5d0f11d57a4d191df7391c7ca3a901f26e588ddcfa77be66484cee7a47366b7ee9b7bee1c7ccfb9e7dcbfea5e7baf35035859072e21daf005b5bfe3f7fb8a4ed9d1b976eeb9e6ee8430b57ef9bd97d1618cd5f75774f6f32823fc9613d687d37d38aa099cd9975d12ef36c0a5f010b8e516df0cb2874819a67c1805828da1dc7ed6ec9e72c1ed4f45e02abbaf12ca68ad6c02f3b9d99795091d11617b1d0cb57fefdcdb779dfc41f78e273a6574eff973cf29a9dc2b79d8abd7bdcba204bf3608a110fcf6ddb0a17c262756a43ac953ec3fbd86cd89cbae3b49c3dcfc5f7f5f141ed6ddbacd179aedd288df6e5a5a0496482ac7de25b1acb35be47de61d4791ec4648688e657d72cd2394ecd10cd2d36c7f9227d83cfbc7f8aed65a12eae255e21ebc49fc7adf1785e9e855e2be273bf670be8e5a548a2588af5967ff8cb43372d4c2c56f11b6dc98c48728442804bba1b097c9f9b852aca0c27aaadd08b4d4c54460bfa552f6ea54ea5e70ba03981c01dcb727024bdbd70894115429dbd001f66bcc22eddf22ed8c224d8b22244c0ccb96647a95c06cc9fbd8a7273b3aaa244f8be55b19af764ce0fe8c66b1395fdd208c05b7dc52fea97a6d733f2e25a57c7883e4b78c104a767575a227977f9ab2fbbd8c9d045a7b2de15fab935a64f97e8b9090e5bf8ba492f1e535d2932726b1e7a657692acd82dff7fc3c31893d6c82a01ec9ea690347dec76740cbf563c498d47f5fa25b30fc2546aa9f5faf8c7e932ad7aff4fb1a69683c010499131a1a4f00b1825cab2a537795cc77b1aa3ec6ea63569f56d7a9c60acacbe657d7e9c53fc1d33cc958559713285956527e6c59ba2cbf7ab7246315963555325fb63ca2369e37dd014efe58ecdb6fcf65f2e349be76282f9ba77aaa4e74be96edb702426880b0d896fbf659f9bded6b5ef6b404ee8fd65e46dcb7df9701428e00591b6394263f71393a1450182154061937a4ac31460b11fb7e1920440122d6a3c81163127f0311e3400854b8c7b98900e506d63e761febadcde2c3b7d6ea98ddb7aed3b57faaf64f95fd13b51674022547cb89cbf1ed15632e51213013fb8fc9fcecbd6c37b35064e835a925e08fa04a2581d97abf0e0022e5be5d15789041e30920c8a0f1c49594a359b07d4783c0b6db19d985cf9789fdd7acb76ffdbb4116bde0756a0aadcb899b50b2f5f4ca5efdaceab70faf53a57faa4e91fea929b42e2750f2fdcef05e7bb193b56f412c5b922fd6f1ab2b8b4f6367a1aae30e6a55bffaaa8ef962283f6a2f272ed71a83aa7a65f7ebbb2bebd30572ed06d98b6550f2cdfcb3669d1c2b526557e52a77fb51659733908b1d679df5e14d22bf6259e95f6b3facaf5709cb3ad78736abffbe65b5487d7f5b3199d82989fcf712cb6e4334ea05c34d1b5b4a45dca0f16be214971adcbec90ce545e40c0cd120850a2d3fc8008ed4096d94a102cd0eb8b8b245aadfb4059603e4fed63ffb4d6a026fce7f179322dd403211e4fed640b210b8d0da8f16ca9dd13cff6199cdb43d2c7b5da2ff7a887dfab187e0a73f9b90fbf469136277c0ef87c60c65c928dc7cfd1c47b90db8edd7173af7e3bfa93737160b5ada1a483c723b1aaa92fd35f024cd951babde5aeb1bf15cf1d0d0508fa3fc7d863a595fbf657b9d2c7b83edcd8d5503e9065ba4ec5f425b6badbb415ddfa962453c570dd4404b7dbde64aee2ddadfbefde93e366fdfdaef51edc55307b69ff5c88ff1a050fa9bb7ae22167e6b83a393f34fdc27435dd851271dac88671d9c86c609fe2bb0e0d9bf89fb71297f9d1c1c94983ac864ff12829cc9be050e0e0e8ebd5ab6ac1b7483ddd85c23a06ee80db2f9be48f0df3cce75b2beb3f536d7c9fa96adcd0827eb0890a350a0d749af1901080d7e9f35236b7d3d8201e11bea3b716bd6c8e769af9d8572d418fcee35db0ffaf6a2ed07fdbe5e03a15fafd840e803397acddfb9aa2b6b62dd4e0e383f201d7afc7bb96fbf240a58b3664d96123b21e9889d2086ca3d8ef211c82c5101e8488eef88a98d2783551ce57e7a7c2299815d1ce51af402b96871946b46b00ad402abb80ff750cb359d8133a8256b81507817ff8160fc4b17ce7d4e1b38834445f2335825bb8744708affcc773edcdbe61392fca2fbe8dc73c2092e39b3f03d90fbe87f5f9a1010a0d1157fda78e02b4dc890ec2d60879da98cccbc57654a13816962c2002337316124e56c669a63ce6c6e39e07a6a24a433f5eaa4aff5ad4fa1764da1fead16a9d610e0762465281b20b7a328642a2333cd51ddb1db8bb4f02669021f3e26f1ab8f608081afbbcc0d187e15af26e33ef25d3e99a3315670fcce5fbacb91fbbca2f6c3ff75ee215967c86489a31a48632c42197ed645d9b38622fb6b20fd108b0da41f8ca3badba8911c15af3652836315df86b417d9939cf5c3874d6c8e2fbfc2aba856ac8fdc877fec233060da28f611197f81881a7cd1451d40ac2183942be181053d88910227a2c4e1ff1a698ac1ae91bc240491843f616355baa8622a94e91607153ab23491a3528716276aa22954cae430755ce92cdddda63370d6cabcee328dd4ceb41742e0ac91607e4d4e45f5e3975c19a9e07e2af61ca3a19eb3663afc64fc39a594cfb9e7e0191d3328b1f6d595f43f11aac0fd307663b6bb184146ce198a851b4d78c3d113c484cc44c70fd96d8e55b3468d0d9aa8ad97c02dcc1cfe314dc54ce0376693f8830066d7ce1fc90d18e7aac79473f66c29a594b08272329130cb77103ec532f9136bd265f93213f99a90875836ababdd8821392139653883dc033ae99c73ce39e79c734e42e71c8410bef6e2bf07b3cb4290ddcb52c60be677a65693fb9c90787cf7774c280be59cf7977394c998497cc7b0b5b97dcbef9b04041976fed77ec08662f230530a922a74103e141523295ac2c8a1c555453b177b640f8286a7c7841d4cc98ee4be603993337b14840c392b618ea39c35a376d4c844f8ec1c55b23f3ec292648786725f246f08860c93642168f728f430b52436eaab1e7ffbf6cf83b2b966f3411f671ac057bbcf0379ce3c3f37cfa5ab1bca3e0c0112d8dc39cbc280bcf3bdac867a7f838198ddbc567e2ee4d89c5bb6fd782edffc3690fdfbd927d95f7b1ec8eefe39b7fc49d1c394f39ecf7b5660414692b412c6b332c66d2de80962821c27b0d1091f5e0d3a20b92061a6d042892837d01183377ab860811a628ce040b3050bb64282cba1f00252229a70140b167c81565640690b98c8fef4881450e7013ad20038c4a821c50da429637819daa108267ed862469530de1802f027be7856a240376515558ce55da5099a4515300f69f200113972c2940308398490438a1c3098902a1a4638b4c997d90878818221d8f842055aba2071c2863238209326071b7a00a37a09e0084017b974d44cb23701bff724feef9fc02cb3e0d7fdda68078220412881c3141a7481a20b224e1841c514560891022e9cc8220730f470a5484c94a12f456544a1c11050dc80081fb0781807f8a19d310188057001c68813d8a0288c1a04d0450c0c4148e1a589304d94a121cc1c64ba4cc14206266ed00217dce0431964a8400a2c252cd230430757c690410928d6a0a189217e18420e2a9640a284124c54b16285044d78119a02290d17bca087a234c8c0d2821a22cc7459c20d1b841102325c80e0620626e2a041090114c1c6163278a812071612b43a581003196b90214496218050001c4434b8c2883273ac6961073f9880c88a15615891c40e0d5ad810c3063557c4d1e58914314eb08689a228b2b8c253658b2f886810431b533c38030d185829fa620d294548a298004b0d825001114448e8d0c50d42cc210314a4710510425176b842892e49d8502606a9ccc4041962a6709143982f8e109252861c626a488119613817212a4f1411071a6ea4c006381c85513e396d90a946182ee8b042ca1a62bc51040c53743863088c1631a4a2113c39d89a7a4a086242379c260b17a409f3b98549b32557b98549732588ee7fcf9f732ee7397c0f3e57458e435c6ace473f2781bb3bccdd5b77eedc79bbbbf3302b38663261fcdeb1a3a083cf5d0a7783858e6d036908dd6472cedde53cdc1ed63bf909ccce5d09e6731e2fc0ee4470e2e98e6736dfdb4eb94769ddfabd81339b5f7c0f0b93f3d13fe59482b37723a5ad730ef5a6e3b10f4f491a848ce5d63ec80f0535b7263827c0fedd13c2f7263919c26e32fb8d18216af604c1321bb1162308d0e44725b7c761809c73ae09a4e29a8dd7ddee9b49f73039ce71ec286f3ed651fdeee898ce39f7dc73cfd9cb39f79eabc1cb1572fadf430825665fe75c4f606e9be3a8175d78f909ccddff6200616b0f2184d039079d73cfbdd0c194dcc2c4e12503c92d0c1c6af250e601225242901fc1a970a5e0a8146e72d012709ffe2529f84f0fa57ca8a704ffe954ff3ca17970772725e1232fca05f7dfaf6d6addd7aaa89cb34bb364539a25ec7e8fbf09e1039c07e1db0311711ffbd7b73fc17d6cfa4bbb68775515d5ea4de7ceaba954a1822a7d1176ddc7223c9017f11401e0ebfcea921fc25584fdbc8a44787b1501e0ff2ae2f90f44f8eb2a22fa14001e041ee76a73ee5636822c67be32c8dcca683fe26d3f6800c07526e67673fe5e3930609e8b837552c5052e490109c25ca374414c0892e30dba474e18e310888891086d860dca18214ba552690516924a2f964aa5126a04149ca552a9a48204ca504a4ba52f957a4ae8c1ae36c37dc49737e806db72032564372108eaa7532f7e6dd7e5b9b3c378d0c0eda3c34c18fe1c3fc339a6da9a10179a517ec1b39356939b10175e9819fe93983d47f79d631205648839690ca8a14c0369f9a9516d6270ceb9e75e7369936c4d4adc9abc4eb6d22965bbf29e90c4f653febca46c784a68a4d19133e7a42f29a5f84ff8da1a2b6acd9f5509cb5a525a076eb96d81a54b36390a6247c1973c92f0b0defacbfae93e9635315a84db476abfb5c54c601aa51fab8f71c6fae857dfaed3b595c6d9e49c5fcdaf2a4cb606312b097f5845e4ba32f3deeb7eddddefb9a34cf67ae7c32180ab2cefbb31c258d129e17bfd9aa3a4956f732c4e42e5a340e75502fff5e42c47e2d0139ff59f4e4d0bbefa1e9d12beaaaa5505e3c36f179fa353c6086184efc465f80d3ef70060651da8dc5ac2ba56cd807f06f7a6b5284e2babcbbd62329fa2309f7e8b52da79e9cb8b7e9552ce5ae9b42c5ba9bcacaff3f2dc37e879b4780ed4e4fe9b351ce4eae775badf726d55d68ff33bc7d994d479addcc2e8a08a3c2fcfb7c6921651bc91a7b372d3228a33ac3cdb06cb39bf5617c5b8546bb576d65a71ecbc3ccf39bfe64ccf3657f62da5b4ac652b087f54d89c560a41e4b64f2fc06f6794e99c6bcfe1a1d85ae96b7b4e5eb4a8962e1e8c7d298c0ed0e4362d7b6d452dcbb22495f206952ef97e4b2f4b977c7cb55cc24e5ad6b2f82bb4f86aa58bd28131bda81b84b1e71902cb5bb261d2105d6b2f7e9d3a2d7b2f7eb9854caef22b8672542ce2d9fafeecad8bbf4efbd5b2158e652d7bf3f46f706eacb5f75a6b6faccdc54f6f90acf3dee0cce692fdcaded852a96459cb969e7e0907a7f4a552a9c23221932d6501933320dd1eacd2b296ed06e4b4c7031c62c0598e8e4308a1bb4ef13929a17b4ed68f5f3f5ae9baad93b0eaef5cdd243b7263b556d6dbba734e4a27a58c5fddd7ae3a5c21f26f3c6ecaee4b30fd604676dfc33d51eb79418e707e27c899cd540d46bd1fbae4f7de1818a3c9fe396e8176d2829fbb46026edfae961d19b59faaa1e2c807a429bc8d2fd945d01e6cb0cdd15c6bcd4c8b51ca28e36bad7dc3a6a31ed6d8683fddc4f3d649b933116832440189c31c667294138194db9b5b2b9857ba6421b97e7dffaeeac4f3bcd6b610faafbe6bed87c5b2fbee9dc8fecba4b1173a4f249ee757f38772561f2a1172b1ac7a60f2fbea7d563f5bfbd155a5d89195314756cae4f7f6ebfdeaaa7f2f244272f5b362181092cd7fb7c8b4b3ed67f7ef9369af6cbeabf592df9a10264d84e40ac380905c7d85b950fd933967fb41e7f7673f1bd6515b6e8fbe6bb61f677266e7503e12a24c6e6f56368c3123ca18338672ce371db8fbd776bb6fb8d21ac2c6e362c6cc008aa320c4f05469427e3f216821b24402eef3f2abe2e53d13f26b5e5c396b66e4f7fcbd8cd0f4ef7bdccfcb0226f5bec77330a6fcbca5e01b7919c61b70bb29bc2c605e1630a97653f032495118a5de63f7e3de9160ca39a59b02efc82d8c1b3ef41a6ec0e090da48c3d5e09cdcc2b4f1450bda30eaa932f4723bea418a17a6c2e7d3dc796bfdbad4e63eeeeeeeeed4fa05a7a44fc6ca45d8aab5175a9950ec6624b603e3450f5d88f4a0450d9c3c195b47e120872b6450497119c303520ea923ae10e161cccf2bc3dc8e781022a7817a473cd8903b375283e1021e1dc47054bc64b7830cd9ede005ca479ec98fccf41ea33aa8b536cd910e4970e1851496bbbb37520e6164f7745e529c28e20533480aa38c2a398c11c51a5dcc88218d944b51831a93708642b99f888396547f4f10f7e3a9fe23eea7a9c04806548652fd2ab89fd8bfc2d0502a872ad9fd733f8fca7cb1646c1b4c22566a70438d0f65905144cf0cc0205a028e3526300223e58ffa2326c8fe41b490818e1c93fb414113eaa5dadf902a867c848315d9fd731f2079da6004181cd59004c6910d52dc70c30d654c9122fbd19439b27fd700a3463023861659093660b2e3398e680023fbbf13d91f754414c7510d5c64cc4375df5ffd72004c3dd7dc31ccbd64e4a8ea8bf39104cee015f7f31a00e5c0de5f41e13ecde6acfa922b23f7d38408314968dce8c10d3552fdd518f7430030a6a8a28e2dd6b8f2a5025342321327b63fe04c7ac76fd3bdfbb42882d7627cb089cd45f2a7fb911899ef09f228d984f4dfa0be00cfa48e02453372dee3c839e77a785081c0cd1dc4f24c365dd651f40b2d3290f9377858ea4ef0df7fc64ce01a04ce2c4dc29d1b6e3be7b4eded1b696f5f28d32b7b50ec557dbbeeeb2594734eb9e83e763f17e3c94beec31808311143982d44626ed0831509a082a8872f5c70c50f6ca4fc818edc0bc8f9f07f579aeff10fe2ffa8ea95993a73729381063ae7734a021f06221f8f22c3af5535e7334dbce4e5a29b2529e01b0ce57c40f7f083c0962a7d16242f71377456744e4a8696595118c634a594dadc5c787ac1f31de7ebd757d959595bad20c9ce4a4a1a5855b1b2b3b2b6f2c2021e4752bcd859555955558542f5a7222f5b6ff38544fde5b4e4e6abefc9b005f8622b38aaba9194c2cdd5d5d5472e201ac1cc1354f4d0c5161c709182ef01f773a40a3568145106143f4c49c15f017e0bf05b6b37859bc718949315299b2f61505a0b36566094b229c27909b8cffcfa958ba419be445b1999a9aaea815c75595ab1e028f845d83ece85d7a8c1584f711f9028c93eac0f2de602ccb5624d4e15c59a380afe0aee537dacb0262a6159e23ef05380dfee03dcdb7cbb0f78a5b7c1a0e850a102a354097f93011a18d2507cd97ce9baf9eac4d0220395d766928228a56e43ff34abef243a27fd06e33efed3c6a0d254aa402dfe03bfbbb4177803bf8dfcc753f06745e1b3008f62e892e137a194d20a3bc151f0e6aaf68a30386b22d7cd2dec88a3aa07bcc7dff7012e059bc718145b45cae6fba670f3250c0a02b038324adddc5ca5b7b9f0bf1b54b9471fc88f5447dc875618bd5e4be1aba5b29664c4bf912a07e18d1c6c9045c82d0c0e6234951e3d1c9c3b5b3093fe471f634267b6beb985654d9e64fa1d03391f85c894ca79a299caf92851669829194a6986864c2919a49aa1a154ce4799019592c1d53194caf91982a47230fa56707ff52df31021860b889698b24317299c2933d02229082cd0384a097189d282285bc8a8a101d2fc01055de4308329c2a821d5dfaab7425fb2fd1aed37c8c4ff848466f74d647ec165d76b7236bf7239728c5846b1229cf75b44f4291cec84e4e5f833bf1dbc91fb2795dc62764094bb5fb84026943120737ca1ec1789952336343434e43ea2f0426789359139622f38c7fe06099b264a982b3618734588d78310af872ca2142992c55043a15e9a9600d3ef68ed45f36acdfa7b112102a413a79db6738d9eab94ae3d084d3d4c73da4ade2013da8ff8d5d56abdce5aaf5ab1208e8a2f5b3bab88c7f3c0809c8fe83bae13dc477c9317397e250567cd8888b7856531a109694d8d19b965592b90d72fdaa91745623acb5ad6ad5da246354be48aadbc727e5ea5dfb9a22c817564bb453b0fe477da10b9365fa9ddb93a957315edbce922fa94e9775c5166f8940923fad40e76c4f9007254b474ae238e2a61408e8a44b250dc03d699b40eec72db22065772b5c96d8b18d090e5571c355af2bb463a17ed7cdf1d64f9eee6b685183768776fd0ca36902b76c451f116f17cf3143502aae658d6b23937d65acbb2d6eac84a776a4bedb85aaab473b5d4cd95d95c92f36a594a296b0d52b2f24cce9a0c92b063661031e52062cab14517470d28d2c514cd47cbadf99865e63739ebd7f61be4c4524ae9fdaafa3adbace84b1b249f4aec9f75f7d137d2b2b4d65a17acbf7fbf5e9dedfd79d9971745c2a63d4a87556fcbd65ad7d64aa36583ac9d6dadb5a61e95b5bafaea16514394e1b5d85402f3dc224678e4fad5c65ef9d6beb5d6455dde243c72ade69cb3d1a6b47b565789bbd662f4089ced7c39796ab5fd39eed372e91ae17193f0c8137336d58d8eadaea6947edf206a59cb525cedecf0e86167962e3c8870cf3908e9103303924f45e0b6059a2ad965ec28d8e81c380362dfdfd484bc6ecf5945f5b1f3e152159bb1479e8028674d06cf3dd9c351a61e28d4bfc98471939e2c3fa7479403cbcf724c580f47b9c9019eb29db2150f38b333e5b48c34379cb1218832390b21fb3fe71ca6453a35e0ce5d5d334927a57bdd9d45f75ebff817c8e36c513a29657c192356b55cc10a9cf577407e33853bef24b8c0419068e85dbbc3de171ae0e69e73a20ce4400e87e038012e65422ac0fdad933cef175abbd0b9b11b2970fb4ecade42df7f058500c2073d4e1ef030edd8d1c9c1b9b1c125ebda5ad129db0fd87eb41fed47fb51e41ec8bd612368217727c35dbbf7c7c4752f31a543f598b0c32617dfc70bf6c32be87dc5ee674e0ca138cabf871cd543ce87abd0038bee033c75310f381f5254703f20681ffe3164b7217b99326b3ee0812529c02c396b22a696ea3a63d41ed23edfb30f762cf759cccd73cb5e76d97b88e7f6f11daa87c4770f361ffd1d82ec87976b401acbe4fb748872949b588f7c99679c583bc7b09d5d022a9b90dd9b80721f450f5d0390430620bf4a2f5a9207905a480365855ed23e3d8df2f7d6a8cc0024e401f410200d480b9a84ec190905c8fed908d949683fbc85cf48c8ce424b7243778dda82e0f63ebebef1f57bb7d8317647dbaee4ac94fd16e191638c58d681ec988d1adb5ad73a9290bbc4f98843acfaad7a25eb56dd5d7d9d734e5a5d9dbdf4f40a9a5f5d46da12f7a3013473ce8b2241dd96aceb60ac2c55d2b9bfa0b991550d98041cdfa1709fcca7e4f83173281c4c7cefe23f9d8aef59e2bb16f799d23e9d43a3e2471c5aeb70359546c56f34f84df8f157acda013b97f72cae4507dc9f79961c5fde68c0fdf497d6bea0695fd0c4b7e96ae597aec616535a67beb1d54b39e7aca0503bff549a7fb2e69feeacb24aa96323eb8cb24e1eaece2a9f012cd7742e0f1ed5af112d7d8b781b54d8b021571d9b9f53522a6945652dcdcbe5be46da1c594aecf25c4bf54b8f7375ae743ee773dc4707cb84b2cef75b37482706d0429cafcf96aefa555ae99a9b3de7ece67125fa3a574ece654b41a5b6b1ed866eaec4a816dc5f732cae6a9df46bec1c2b78be7ccb446239f809bcc3ca1b247bde20b9632b7cb0e7bbac4ce808195fecd8317603c0cab3ba7596a4cdf73512a4a64c43b5dc551c15bf34858afd7763df96ac6bf3f46d6e6c4a255a6dec955925f4abaf6e5075b14ca85a7b4b3f2f23eda2bf44caef5b5f76e79293868aa5abb306dce73e1af7a409a11f23ee1c1a48fc7bc5a73372c92d370eed071a2b397e5c22c7af58663a22c342e488a6a7b41f15159cf59729dd84742e599f5debdad89a654ccefc0a6784bb87cb67af9ff99009a794afaa0193803354f6f12aae5c91400fe9f79f4085e54ba6efd3fda0a6cb454218838ff410f82e7b76b86bf6e51aaa3520f45b0392f53f6cc9090ddc980b9fdd1899db35424276d2d6d49161d9fd74c149afc92ebc1033fc27333b5140a658db668050e680293f3165779178ae50b11d0dc99053c0b90136238123272c79a327622847553a60f719ca0607cf7ddebb289757553a3bc2ea630fa19fb52c723bca1a16b9154066970d8a766e2d381f6326122a484f0f0af526a2ec05f57bef5d123a84b05f5ef05b703f3d2736e5337dd4439c4b03f10fd2d38342b96ea23e43e47df4be691176b9f619f7e3a84c79c6f48f42f5f404c9990be292683f6ec2024fe18409e3e7a8b81d1a10ff79b91e1acadfb9f41027d340fc87ecef649c4b132622b27f8f294243a5fdc8c151d1713867c2cb557194bfe74a259c16cae7f9aa0a722fed87ff1816bb0ffc7983a0a9878c0fa59498e3a17df86329e3b6789223c199b692fdfd0b104ea687381e1a88bf1363927045b4005e74cd0eed873b2a38e0ccbb64f7772f9694ee1db6318c0ebce4cc7191fd9d8d4397dfd965c36f42babd43c2ea38f2814b6e473e54c95990232b67f2d1152fc5789d82c0ed06e5a000bf3682bb6b703bbaf246ce82e4173a0ba01ca8f4ccf7543d0a99b2190800000013154000200c0a864402a15030a2cca3ef14000f8b9c466c3e19890321887118841031c61002002000c00080999999b100eb93099ad8df342822813b146085d03e541cf43e0efaaf4e432f6976d233e937da0dfe79a724b0e69c7d7ae8089c52deb7e9a8040a8f8a7b039e91a6f76858a0d4949f9e87a53060722559e244d1d5466cbf21396de51286f75a1fb65dd8807274180b8bc832a387fbc6f4f8d024db5fbd71306dd8ef7cf11cbad1e982a2e35e9274ecaf8483eea33a7d020c65d37debe41d0fe5650b435fa5e1e080bc10c8118a326e9a86f45c646e674f507adf7baede0cd8120efda7eefb4feaf7b96e82ac2fc7dcaababc57bdb8be6a8ea99bf87bbda815466855d15c8891dbf7b38809d5438ee7fb0ba468a52f22181c9de9ffc056f7b081ed8455feccf4e867d5b4ea3ea8f787dc03c79ffb02e69ca96ab0b259cd8568fd96c72102664e4bb7b58fe40c1e059912608c5fa257717bbf58bc08d3a2bd4d3da77dfa5cc4b1f904dd1be361bde9154e94054f4eba5b02a95a16778a3dce899ae6a0c4f4e2a99f92a13b509d50a291cf23dcff6c9a61941354ae711eb72847a6dca1205f5840da39b111f8aacaa4bf1ee8ed0005d05c10665f660fb589c9e738d08b7747562b910cbf32acec895290a213a4284aa4750536a14805b8f487e5d3e1fb49ee74027fe8794cf4d135ba67412d1093ea2c2e7d972a2da011aab951f96792aad42b5162009a8c9b9d00d298d1b60f93284149d67620b547fe765de42ea83b40352ad362eba48a68b3db38191c25b4f595be3a9b13b15b0e3b0398bacd76a8c32e77292896f00011fc5c3695b18fd000b5f95d63de94b44632b6b7fe5f25fc9425e1275d68870172a2b7cd6ce3ef75b1dec8470c9ac31afbf526cfb1defe354f2b6594fc9ffc4cacd4660ee82183a1fb68f37ec351dc8c432c38d60b50531207781c9d6bb079e038318b45defba793e2d5a6f396bd78b7a6e32066e1a6573cc1573f1614fe72b19d0cd2f9a59399ec9143a7d7c1673da643d8a595ae012c2263f99579473d4d2757e78035ce21cee61c97d18b32e934552b90cbc68a3ca3e82cf169cb76a517370c9f5c0a15c9958b9ad98228533abbf7ebd4c30c38e78f76093995407d5df701adcbb1c38c7c7acca25fee2add9f1f9d06f38daea9df37ad11965e14a32cd2ac308da671974d6fc66ee3adb145e02a020a413ae95dc445a8da1c04821d3878ce1837c6ff8617db600056159d8b0081d6678ce9f5c15f5a3c404082bd6ea5a9df3e244987811109a0bf7dfe103380d6343429a8209ac0e1bfa45fd7f29c8f87790e8df8acc4046cdb0e038fd664c823e427da8dea1a826e12bc66ab3743fa6a87f3ba3a6143dd403f4cabb10fde2ee714e0d0506d350a12dd1e55d5aee0b0eb74e129d0153c8c42b76c8a0bac9964e3c9db319e50474d05104259d60bb829cfca89e8eeaedb05ef422035b277d82dcc6e938e294dc4646938a06e01c96aba04e8076324eae1990c3802a2283b33e12b160ede27948fae0642a05c138be68896d92066786301d46941c31d8e6479eb53c5f5d88c171c93d90e25d82998fe3e33c8a3b6938b3b1f089fb0ddebfe9a1cdfb1d6f19e7d821dd0161942546ac237ed1b809775fbbeb2458d0fd8c8e1806f43e5ba254ea460cbcde85ee0611ee0be4869651f24625e98813aa565770640ca869fb5db1e62d52890a7c62014b4616548e1a5fc8f55a31a58d4de4df6799e26b45ecbf3a0a1bdf341bd3fb3ebbe7ba73e4b75314f6925126931eb433d36a4266c7e26c1427243e3a180c91d0217b1a4efcffb480ce6c12568162202fafd66827bb0a93afd116741a9bbd43b78d69ff6a52d5d56e871690fefc0d8941dd91f6bbedf509895870325ed82500ac898c962c3fcfa1beedf44b281c39c4e5a6e977b147e729ecefbad418a9b00c1e9f13d1e297c6b4efb4543f85d792762dd2f66007634eea5fa650d512062de9971dfdf13dd25d6afea87a58945ed893ed02b20e98b4ffecb0a0e0de4c8e9d5342989e95c4b1563c29eba23a97e725773328cae224881b35ad4553f9ae7607b909d5e2b85e60a2b16d4e1c997b69d9b0529ed6bcde50aba2b98663919d3da8d3ec2c24359e4ae71c69842281fbd99073f9ec45871b222c0d1a410aad9d6866d92438c4e31b3b2fef6508c3a4e8ca16c06cd75966ac22fa1c0c3472ee143fee5fab70f472e3d328dc5cb117a1def71253770e1bff9436837939bfd0ae41d681254042b8ca949d062629e98d879cdfdce1452bd62538f4815f3b344a0132b9e1d3666d55f14fb12b077929b0781715bdbdcce9aa82e406efd36f08ced24f63cd40df5a087dd996a02ce00845c2c89f571601bf31496f93ee6b5c2139a6e32a63377b8a19b8f2d0c78a9990bc4c812f9b4cdeebe198632b3eb0f6fb0f62b82a7ccbda4161c3b23e98c710cac99fe00a41d4305bc8437bc8514af12694881ec27deea6559cfa3e029d45ea829d1574067c75abb80ac13cdaee3d35d23a880d3abcfd3aeb402cf244095067304c0ec5f90e9ee32ccbcfd0c0e30fef1a0906402ba0b23f1059345b4ed73446fd0e104c69478c614224c25cb4927ec2bade28fd44c11f633488aed934e5e0971c97497163d075bca181c5b9c0557933238da6e46731b0a2442edf635fc57ca27218d73c8882de0d15b7c0f266da6eeb2f2b250c5235ccd5f60754d26c2883abd99d44b2e78b59afdfb7e54c37a7fb8093d0df0b8aa3a85e058ffab6154dc1d10f15c7c67e6c6de3df32ab848ece303fa6d9d779cec4097ffe35a55fa14d1b9e2565fc53bc6eaac5433b4b8c49c7b9f292da84f69e37ab4165a1f0ee2d625add0eef38f025709a9873e2d32e845bcdf077c51dc4607676175017d45642ed9bb24a053479a7d6204e3f0e16055c1dbfe80e93aa377f3f37c84efa1ab1f47be2e3db69712a0e036e6956f22a9c3e8df50d73199e103f7d77c59a7640c8067905c090da3dc6b949eb7e3bd42755c7bf49caaec59907086136b4afcb620c436d6d433b87d19c7b5ac981ab159ed48f3f6256788a77ce0cf80f0b108d19d396cc74bb1aa4996d6121306996556d814c086e1f112498f47bc2dc8623c4ad9d15accf3383566f42b801d2bc736398f1fcde7bacf13aacc29c34a0a696ed2256363f07641e0b50387dbe95399665f90548c539a63f60514718da1e971bed2f512705d33eb572a609f9bc4aa71e15d9e30158738ed2882abcf2cf032a023d6454bd5186fcc36e341b48f45350fb549a0a14abc05df11afeea4ff82988c272e504a68215773658c3db126459ece0d5be6acbd771f6f59deb4172e2eb21d3f488f4feee303493210cfdc909e1f5f29326783a205f763632ae46fc9fecc7f25bf068eaa0f13773bbb3e232411cb52e43e4810300c34d70ee4762c4d2458d1fc34455b1679c8ef0413ace23a55ec80083e3da3e2122bf1bc8a1b9525355e4a8ca1e5e06d86bf215d8ae2907c6a0226c744c4834be9a4a35d40496648e08fcb1648f0dc7ad9ce1d6e95ec0fd9dcf7fcbb33529a91c0a96b1b009e54e1e271982667bb24b2a8c616484fbb6e61075a183e50e030f62ead5b4b7b9d651826c7ec7f25c5a44615cd5149c10ce2d823c567fd2d85194a57cab2d5138394c29d402fbe835ae3761e53e03ce2d0e18d290d43b3134ab968f54703b6cb439aa488e0c28380805c78cb95c30c5a5c2ee34ac13d5eb28d9342d351a4c210af177952db8d88e271805c882e91fe7af9596ebc7daa9313f284e383561f84a778e852832ca5c4303ed4ebc2a505b067e5c54f9a1a28431a96beb08d6887df17c6821df6f79fd4ddd7db2fd482a768489af1c2081d4498e6c9dce92e60536806e04d6851511801c0f1534ff5d1d9ac0974904dcc06da927ffcdfa7aa4c4dbc376f8560d2b1b36565a8a2f7512f9e397e38015f4325acfe06df0a96f80d7f43e40a75ec2776333ba2329282c9d1a43ec5df2b1140c54f78a739bd360850b5181f99003af269bc82db110bb3cd5721351d50d3400c108f010cb4ba8e1750d2f51365b25a181aa3094db846d7c6828924c43fc9936df476f033170870bf5cee062fb12e60f0db1af42eb1734aef2736331113ca70b23118d6ed95d8955b02a686533d0664272b6ed48eea4893f4b69902e03f2995442512837d8fcb10885285e052470a591b930b4b3b01950f110127c49ba4f11e51312e20c6a90d5c09bc66ae79581f3ad92832dbdd9225c0b161333b2a94f125f0542bc088f24d24c66ad6c4e4f55042ac6d383226861b834c32298becb4d70bea485ee4bcdaf3aa29621924f91fddf17b20b28fc827a223cba9be411e673ec408d9ae21d1afe12e0282376ab32adad2edb0e2f7c84601855cd9b6172a25aabf0125e889fd21b39ea37d423d6e3a8706336ca3d6c32e00baceafff5a6408d884bad10f31372e5cce5525006c4a0a381de44c51948f6c37e1ebbd2f2de73e2ce091ea28ded571d1bc98f3bbf69ca4feab89d46724407a441e4a92b5d6cb8a4f26b5c3ae4b985a6f1e2c42863bdd47ef642a2ccaeefb5cddd14be16079b580b5d1919e1176ba40b3fc188873542bda7e6d4c0935f56cd46c5943360a7785e6e5006057e4e6282ebdff2fda73ef86021934dbd844408777e9b488901cad5f3c96709b8857a7f38cfecd10cdfcde10c937aac6c5ad61a8af5fae06387629222cb7c86e6f171596f12dee59bc8d10b792bd73da55acd46e99eb8ea335d27a54b2b4e714e0f4ae4cbc5ed9a6ae6e808a5aba38ef90e9b6093f4282b23cbe1e9e659e298c1d2946817eceb28878a11063e04a2a7aa6001145183d4d3c02b75843b2c512c26016604a4cf13396eae0a9d41ec89886f563304bae9e3cd90b072d22b2fbfddbea077a190ac571219b70ad31f28e420cef8fd1d44e1eb82cddd820ed9c61d2c7c971df077cce2c39a31e488859f285f1a8eb6ba011ad356332df3365665824bcf14a7ba494362cd88298af387a0fc910d0d9bf83ee45ab249caf6af89bfd583651919083a4838fa6ebcfd0ce4209352556f6d4bbcfd2a44d3672a4ec6ab6b705c91a5c27a846b57f1cea1311f28ff191b672391bb1660857aa1055abc96be140065a3535c90996689c6fda68a30808041f6c880a479c527ed3ed8764902da0f83810c18b26ae5ec5aa463135df02b321fe8a8ea0229e93333908e44fd5e6730fa057285f7ba11ba554874b28029d37132edf87cd8416b8395dd179afd6eebe6342bb4a1a17bbb8b4b614e45a0e926f00fd4a8fac8630caca097ab297188400a65326da19c5ed82c349cd7094c887431310a516c0013362470970faaed667059366ef927eb01e9029c7dfdb88915ee138264abd1773c8e2703bbf2bb769781fd2138cafeb844f3822b5d1a9c1a791ebaa7df323c7b51bd4998d0185ded8629bd26eaf6f64ecb02cd1c2f01327d8c53b01021422168362a8ee1a901c6b11d24f697b57ec3015268a931912300847b6a24c430dc6431dda8d195a8b6103d31d6596bbbb2a2e3541b8f3a314d069061e0193665f2a72b52ee299155ed3c9821ecdef1e85473078700e6986929bc170bc53aa7e0d494898ddbe83aeb041147b56ff4284c7a3c2717e17e2987422e0f7ce4de17e553086f5d4d67200a647e8e39ab996443ab27a962d34fd4fbf835e3d5bb85ac9b350461aab361ae3bada2b8d2532022e210d1ccb417c8b371cf139341f3907bbbee8885d5f8a86689a449bb422b855c496b2d5b609fbc27e72b5726e004bef616259058de2f00faf2ee9f7cedeb8ccad25994423143f29f1f351a72b98416375290913298a9a46b1b9d1fc086e0c36c30b5615f80667e0d13e928cef22bb2e05c2ce374b5d39111885c80e1847dcdc6e46824fed8f7b36211a025b9d53dea31707c64c7c757c6314c22ba50151f714b11dd44cfebca32050d2167f846b416585e736f25f61822411e77985a94056b51eeedca45ff565ba34403ac2ab47aa1cf0e9a4e9470f822833c6a5114dd0742f4f6519590ad2a0d0b3b7f7bf8124262ff3cdcfd6d6128a96ae9183ad976985d927f4aa0fb672ebd4cbe85a30ce4e884ca5b4ac5e32e9467a46054a9e39ae9eae6ee7c2929644e38c4447c091dd7b4916af22036ac4bf0b4aec71041c1d943da9959f1a87a482cb10b1df7fa41af9e24df82d4c2945a8242ecc8df703e3adb0d7914caf542b8133a42a65bf681675302415f4301c476b74b41f652288e8eb0ef6a36586ed4fffd462bb5a64eaf7942125b53fb66b16a4e37315fa3942613dd9d06f48eb8ff094cba2c2c63a518974bccf1e8c6a8d422b8ab857aca53b8a0319dfde4084a3b4aa45c78e6b2f84fc1c570581a3bc568ea9dea2ca73d160662231115bae84a14bcc0752ab445158836abb6bb5f0414583b58743648d622ba1691d25ced2a202c61ce3803f205e7e37fdb018dbc67889011cf5cf1008d512a768428b51b8795b011fdc100b5a87a75fd36b00fcd0a65cffce072429413f8031b36b935a0bf96022e0464866e66b391638d52c9a950625d0140c630c5fd35f0ea5a1b142197c465958a5da2b8c8b50dd439c908fbec2a977080f1ae1207f5299482b49c4df5116551afe65c1aa0e2d786031d5803e271dc528f1b301630256388e612d055e4c164e1180cae074417472a35073befcf317f3b6ab9d5323e0c7093ebfddcdb2ca023b1911235a1f9acd225745a513e128fc069f04ebc29158df96869ce06d3fa87d40388bca49769dfa0ea2b79d044cc8823821becebdd9313b480921172e531efc51123a5cdaae10cdae3c427ac71abe2f33fdb2d8a0c5f88e9ef878f6dbb3a118cfcad5d8e3c0ea460ff55038407c0def9e62897acba1ceb668065a4b9ef3cabf14072fe8bf6caedf463b042018938eff3c40e89093b969d91ce9d2c6e1d295879085d33d33c8c771040ef0370b79b4fd568231d4b3aa3e9fbf1a79b4d6d39435b12226f55675518c8cbb6eade5122f59d6f88cdad8aa24891e6342c02c21f3cfed35b3416ef9a09626ce2da90edce57308aa26be367bd054aa6fedc3fd2923d1fbbd18413f327eab1a8782649020b3ab7c91cd1355d81d2809554bcd4b9458a05c468b7712a62875f1f414ef5f4096bf63cdb2845563034d1064427b3d82611e52e836bb8e98ec32ae893a8eaa7eaad5a30e630062aaefeb376c11356d111b802c7094e5078f27c4c454cac98215eee7d8558c7de7c59f17331b46eedb0f4c964084d72079893d40b5575f8ba7faa89e20aa56b3479ccd03bdbed9b7ccbe81aacb62d02ff7cdd849a9154149624a770816ffd0974e79f8b547bdbd09dfa9d2a1715469900b9e88d5fe050b1972e4c30952080d54c2848b1c2ab59ba649ea0a7e635ed472f9fc4ccc20321cec36721b775282196f30575ce58f8f63109de486cce5091f661843c03a6a195f488bcdea4cf6b8071064d082405c21430139672f30e2c5c8a395412708ecf0631f50ea13572537f564a06ef2eaa7d501bde9f63a0931322f0437db24d7228172f25997a17754c8a3ec503fad603b23c194d06031188a345c4f22967bf9ba018aa0f507c0c222aeb86b3964f612d6175c592df135aba581cef640a4b90ccccb448dc60a228abe2696a8750a3afa55ce92aaae88139b0f5744e09306e68313824071a626b4dba3113f66e10d11787ba58363f5687b0c682224ec2ba78e5430d82c0e1d1da438d9598dabf500d1bca95e274842ec9e3cb59a61fb97609890c872a222c4213221a8c43d40427febcc6e9a9267078b5112b86368c2eab6d9a81f80e5e3a8e6a20dde50159c269fb8673f5634a552438c50e732b522bb732e03b142d2291357e926fcc07712db029dd732f95064cd2661056743605403a3fb4b47851509efcaae3820a176f81992c56040d2283bad59dd532c13ef6443268d8eaf04b332805e22916ce1c36aae275170897d76f1447ff5e86b519e999fc6a7ae991028e7ecc0063a109c9d17b3a1e74265388b89dae0278b754f92437b9f3b7927df13d7c0ac9fd7af125cf8adbf9f1127371e3cce129efe33994236fcc94e38b706c5f129fb23ff5f8223458be59f82f0f862783ed8d1663d6b2603daf0b78f83876806098ee8d081556635423947314980428f0d1a57a9ea8e356ab0d76876b94363b9d5c39176bfff9e7376a8715a9eda69c7000c85d215962d3c09aa18bc6b9187ffee6c38bc81ed709b94d04be9c0f3e19c0f77892bdd6d0a54b9bdd85779cd5688f835fb8366bb74b5bc26f46425f5a61000ce7e863e734baf3b1672cc6d2930860ca31dacfebc4cbc956fdcb541134fc86f1c2946b6fd4ddbbc83b352814153b5c299b8d14f42a5986abe568ca5e44681a22c88729db446ed2ecdea8f583f313036f8dd6db226c98a48124661795d27331de6435e691beaf5a7041aa3fce33f46e7c7209933c1a220c72e3125ba6622699554615ee8684f6b000ed4598268bb510348655cc5f59435b02ff36f944c14570db86da117c575080fe5291d2554658a19f419567076fbe1f3d8e684adab3f96961c7936c46c0404e7bf8489d30f50bef8db241985bc7c217213c755ab3485b4b48113d75ccc2b1147c83459759c051656a88571367b9dbba09bc21a131c6712c633f16134a5f64928e1e1cbff9ef03d90b8ae5357b9ea20fee9224e48a12521820b6262437af28bee581f122b57c68685c88d8c8d9f3d109569e7163f841932c4e276c48d214caba756444d2ba93a64f9dbcba0fd93b0b5a8955bb884b4d1ccd3b55d590ea7b8d98096e76dd15842dd917eb59ed0db4bf8d2cfa7a5d7a986b9c63dfe7ac755d655976b8650f14fbb05112d4227c56a0407a1ce138d3c842a23f0b0a37ecb8ca032b4ac8194419769c37be9844e7eda928d73b4de44682f34656e69adbc73da10463419c0a1bf7e51691e0bb0167137c8bd55440bf78dc7bb9b6426fe0b59f2278381667ea69eace2982bec3b8a03449311f4cd04089d3392d781f0d89880e91635e8c3ce27422459a63ecdb81d14e7c46c51aab4d56c50645dd2add89da99535b53f79fc5038bb938565c51a525c67172032876ae6c09620c3286d1686e002e7ad398a7b5c6bc2dd60e68955e3a975ed677f03830750756d77486b29b8fc7544a8b72e79ea9ec44f852eeab1fc815cc3d73ddd11f178131e3e76b75baa8ec6d12e6de3bf9f2a2bd7b2e86fe3bd0ef900d53863cdb8812b47f59e79fe4679317a87ea4a46196bc2810a0a7a19b3423ca3182d5d021acb28120e287a33fa2b4bbb005f460ce5ddb866f19f71875034e5ffc641034568d4c5c4a021c9defa08f1331207518cb303be2fb12d2b8eb142e5e65bc5003cf353a1545ffaec440ea444b2330814eafff67922cea74ead8359e90e7a346f39be67877bec404745cd609b54fb98aeb0a293d2be81f98f5264ac166c916330a302a0dd67d949dcce00946203d3ef099b9421b9d9b077bc4f05955a2e8d86561afc67956754127072705bb43696f6b18d90cef9c0e46229329ca2338793c8349ee7e347ef2349c51ea7b27a6c9b137c4219459af899142820fb225dd401ec8d06919c37eb7ebffcf46205a3ced7c851f28aeca8e5fc316cca3ab2813ee04e5ed43805271f8e86ab3cc87ae72baec45aeb016bcf9946c2834feb1a667f3f5aa3a6e0097d17376816703d5edfb59ad2b9f1c084c75e7db6a60b1722559061a72cdb9f3c0e91357f6079ffc07da530854ba3fdef9ff1d0ce288bb748af3d25550606609bf0db182524292eb780588d6efde0b17bd3b4fd6175eb2d8ee1b712e4a92197490f855791cd207e7fbc12c4059690f22a63399f42fda7269ec3e5aea75c2e6456601f6ab9027a748b9c9432f54497c2cb15f45da02f46ccf212f34669da9fd2871dc2dc86f7997c694ac0dc9c664c2c5eae213e9c3a637bb3c4e41e35ef1fe682fb3a7779c4017b36768e418a1f27d26deddfa703336c3bb60925d2e67fc4f956a9382cebb28d4de183bfd105ffb3dbc19515ea13f594a767cfc3c9655b0c42fbeda5ff2e20f401bcc94807eb3370764cb0e8a17a61193b50ffb0e4b7b10ea2154bdcd172e1a3f772b642603eb90537f745aecd9519bfc484cc2f0fe1d095e7fd25b8a99abe73d4b2a52b487437f49f16d453a7922ab8ced8502a62a9b190a6bcd32e950c4e9619e737082d05420b5eae88f6732320e973ed642148f4ad9a0942c4f16b4f06a24cec08d2b5d39d1380fd44136f6341dcd101d491e89bcede3519cd06060aee39efec05285b65f9119effac905ab8f5f058c0750eb5032e4d6fce215a579403bba4261b45888adf0e17e3004c5cddf62e282f5e20ffda147ddb62783444a94d67bc9e929ab32720d8bddd46bd3550ed7118db927d5507e4bfd73d35cf0f64b1a1812e3871d0fd716741fcc51d31ceffeadcd6a8e6dec9a7c9644744590dbaf4d7070f406d8f397be12177529fa75cc68b3b375af8c31cc9fa005a2c619e6f6ace3835e6fbff8d220ea0139a7af0886b230560384c4e76b5e0ffc7300cc3cb43dfa4539d8c0ede6bb54b1a1ddbdd1235509b58d9a8181e9f6dac0e2d8130f611eaf66fc04ad1dac6986d957612521375e449ca68e0aa770951e531ead52c11d328fce74862e500c4012870320fd27915bba44cc1e8901c35681b50749df185159e7a5e9faf4069dcf64d2cab19b22f932472efa2cf9fb34e13724718791869fac2ca32e93f7caef89618b673c057ea78374ba39db1b5d5b6f42778406ddbf5edc713a1d86a0444b73afffd12007fae0027068d8ba100576281fe78ce55c54d7b0d66a3e234afc6338e2b718f03f2a12ca00e3941068ca59e1303177cac826675a8d694213f9a7e04eb867c7c1d26243768ab27c7b5325f043dfd455349462086c80541058fda29e3c7362f90b8830dfbedfbb2d382c111f9d2ba6ae30a1dae6fd41e68d8fd2f613225b9442614fea0fdf52e87c2aa67d006c898b35f5802205c3bc64b76b85d0b13f727208e7cf1a3686b4146c614ea0fef85ecd7fd9966eda7d705ef6db63f9af9523505de79abfcae46841f8348277c05dfad726081f6e0184bb7468cf789a8f2e34ecf88c94ab21c9059f47eb083ce40cb643b0d30ca5268f39f17e11ef8c58c2976f805379ff7b849b44c950c37ea9553cf3dbe59775ce10fb59982dd789b3b6f7418f0cde3e6100f7d27085290dd0bf0d42846f2e05205343dd19fe5853f90753d4b14820731481aee7d3de828d6481e5c7e1d8971cb3cdce5444ceb7c119dec96e9f62cfb355028f501730b10b788ba9e4672e6ca55beb3bce7d60902c64e9559bc705174aeaef6e2424d3c8cf9627b40f03f8eb4682e19565dd02f05fbda560dcba9192e880f258ffa623a16988d9ae3e12de72e4a27216a6dd1fe8d915aaa577b09060c0877ce198dc084e4fc218398e27b453be9dd3272710e7398cc22971bc7a67a15fdfde156e56a0026a3cabf6f6926a6f4f147c3acf4f35b7aaef6ae31759b9d4d57ce1eb7d15c32fc7eb5c7797df97d0d2fb112a5b64b22818784b40569b3e344c55efe4e7bbc26c738e207569d542daf27f77d51ce74fef545db85880903ab604e1432f91206fe7415f6697842e9796150e38a2b66c7de76b666e44f0ec4bedfc7213ad9bf8f101c9e04ee7e88889281a1995fe3914546d229c0c0358e01d465942f0e3cb09abe6ff0b6f53f2745053a8711423ca66424aa0040eab50ad75f7901d9a388d924a48ec2d7fafc35286798ab1da9a277fa19bca507ab75b91d4d01c4031a242787b38e3d3966fbaeeb67db09fbe63899ba5cc41860b853b54830cc40c8653dc5ba716a43dca0a7f3f3ffc314e6ee4b8144e49d7d18fba9d58667cc90da1776e85d46c4d462e79e1911858b3dedbecd7c5e0cfca5c607fd6e8c9e1a3ff381eaa6a3a00f04657807e50063493d69569c530ba80325f598f03bc46c6b0fa8d4707dfa2b905302daa151a535df67c03824c461154c93c81393aa41c3b88c8d76c0901d04a91cf273bd5bb6db0b8856fc602c0162ddc28143858d86b178d8ab600c233c639bd775aff866a88f93c330116090aa8abf824a10d777cb47d9d4a7ffd29d30837a19af5185639f817d5c8f323340e1080b102032b84dcb16aeb8d3caa8cebe5c4516fb7b398f769eaa5e3843b1f6c0c8415389e387ea8ccda7736b4cd8f0397645ee2464ebc571da0b474072c9a3591c41b22fc7830f1739f1b0cf04ed6804f9195d9752c9ffeffac1ad5e0893a4970ea9289b95c0d20e204c644b2818c870f22b659386bc815a7cc30e1bf2e6b28193a84996424600405da01274b0bfd23e5a56c3e46f701a9ff4aea411c9092dc4e2298638dab8c914855312ff1a7076b5c40c4c30b965ad0ae62d4e9249758b0c389746f54e3ac970e964373432cb13ca0e34a6a5e6c973474f32e69a6295a9e906d96b8bbed046ae48aa1c9134b87a0c8979e8279dd7d3df479fd2b37c817c4e22b5c848c8a58927aa34ac302376d5483b93aee5257e394588da47d676cea2b8ed40a01ba84252016014e099034dd0ae61cced1184a668f98253656d2558e667f4a1c92cef6eb6ab6878b4a308c6cd6b79ae45c511f63ef275e3f30cfd1c7442723249e8ab9d879c0ac3c2e124560527c0928f7c23af4b32f17048ac73530d7570feba7b13465c511d9cf7036661b235a1fa9293665560b48c73917c0d1893abfbcc46b87b55655b789b5bd4729515e4f62ece9994612af0ccfdb9dd30154e08d31b58cd23044acfa541013c1bf2cb295c026be4ba9b4b1a0cd17723202c941c22b7e16f6482b0c3bd4922c04c7e9fc81033a3a30580875f04932684e2cad9612fd3fce87e2900cc4dbf319523c8b9e7e9ad9a9444d45de0f4fd0b5901433cca14985ba4811031568d8cc0ef1215fb62d4085b7f7d8a3dbea22aff338c98f96ebbfcd7cc65814ebb1bc9f55ce5d3a04fc80fedf52fdd20bd7047b1ecc8a3f354dcfd2f55ef2b38e4d2fca02f8afddbc135714c3a9fb3db3c95512c1f4066ab0aa2e070bd39a0c6cce2bee9103998f7e434b840721f2f0abe6aab0334bdaab01cd2267640b1781128c7ccce833969c1982b81a898af4e1a7a42c9158291d43079ab44ab7adc1da8207a720f139dd0e6920b64937fa9b14f00179840a14f40172d93da1331dbca80cb8baca6539a5d192c62f10d77fa1ef206eefbee219b5a08209eaf45ea011f98e84fdde0a16fe68733de65c0398ca7826e4c041da2ecf1b57820888bd7bf5878f5d0151449c8f0cc454e04a1af0c6f6afa0ebb65665b2fc4664d5d0949f06bfb0589db8846d885ac0281500ad6b3640966a8129c5842e4d6dc87732fc09a260d2061ea7e4fe749991f8896ef35990ddbda0774db097d4e32098155f048a80c384fa907000e9abf6b02c862c7e251cca3fae02169ba8e1636b56be0d587c3d385819b5a71400ee3a3164536332fc5a3c37d7c3f79fc6ba4fd5fe1589d09bd5efa2177852f6acba389f9719436a6a30e187e0ecbd3511e21ab8133edcbfe36d2c4e8ab419260c2979e98846f65ed7fec941354bc198e5332b72a36cd228487958bce9854e492735ee44e7059405d4b998d2c31fb655f40eacc5a08a4810a0a6b1dac79e06ef92f266bd8fb0f14c4a9d3176942c0858fb94f2d9717ef909d906c21d701e259dcb0b61cca3f56812a6ff76e0db1e1c1392bcc52f06db8ff2fbd9762b4ae48bc9f8cf17bfa8260d912db23b9c1ccd734c75e9ca74664c99a3e29339f912aaecb5e476cbdabf23f99366c1f96ab6222e04c16d9cd9c70a6875def44c799726847c59aca766942b7169bb7e3b04ad007bd51897c755544a8aa4103964f0d51e14b4b90ac66e2d7aaf7731343131630842e0c57206c70077059a78384e5d80b25b33aa8600ad6cf1e1477c0bc8caf5082ee22810693d9993c0fdd28e867c754b0d522e8edfd715335e1e455fff1c315f4e2050d72a5a5142e0e3c3e808f15a47f0b706d152092a770b865a0cc0e5512815e0fb2f695de25229845a7fdff2ef49b7a91d5ff97ff3c8f3be126bc2d1d7bc01dc758aa65f93ef8869992174181fce5986a6e4eda376a8e21194072612af55085e60d64b4cb6a97207de0b1829c9e248406e4de710fe624527b6b735843869e3f168bb076ff5bb5e541e2cb86b862de2588cbc9fb268c79638367cb5d7ef38146c0bec2f848fab81596eef79f76d1d77b5b9418f94d5277b00c8196e70f24c81ce622a7c7273b3f8142d09c2702666302dce418fffa0de02003e6e2f1318fa8ac1d4d058aeb12040d0dc01e13d5c290f00b9857c5e43e4df08db63c15ad32e6f3d9dba47f1e3a13bac44288700b385e41dfe47748b8b85148cee13c8f442ae95f1f05c0ee1e77a7f8c1a2f88d33c62d7e773885fcc468331473e0d05ec6f485b3a91c22ca9886ab846347747bdd7265c96bf30280b75f3ba8b852cdf30efc4bf917e74864406255f772a7aacf6bdde76de9822c4cf3e23e592470d87f9ed53c28f1d17a9ddb34ae740bdb33856ba2de90f4b39b88b01c0ee7ac00632caaa5897912d4fd7496b6d77a08c532a57831e0763a359944d159a75c737b0c2095a8720946e1ae5a6670f83ed7c61bca8b385320b00f0bdc116f31c4a626fe9d5c9b9ac14126c80b3260ed9bb3078274a545a564d6ca5ccddb06ef207df272637e65a634194a61d5145079f81dd921565f64a1fe9f870f0e6cc31b184fcc80f410218405a430024761dc55300200d0183549dc8c384e5690b4e3b54384de36c328ae477076797ec9ca3c3b52cfb845ee125e582f5d66456d5ed89b20e4c22cc7186877c42355a059bd1e1a4d2f822cdd8073ea1a7242855580163b9c249e0107e020471d361512256c79a92ab3e68c8dfac87928b4402a2fef282767b4c3d627e7a3c71bc41cf423c04c271a11636abca2f59df13a5733313292bae427d7aef286fa5815b391955e12e39f948ec87d6db47c6cb59bbf9dc1c62425a103b876019bf3b43c65277481d41e1bd1b6ec5797d2c7e12943a934707923862b5cbda6de2f0011165bada5c6b4cb9bc8f8c81df96e9eb48653c5833351aa5e9bf36c12406224507683961e82a13c71767388d7a7b4a9f029e507fa8d3202f27bf03b99bc53081901bd7abc35e9d0c51614017f3282a5e120cd767aa6e469102b21e799487467dabf4398f5c1836e56cb37cee4f966514fef7862012a97b677aabefe1212be0aabfaf4b507652e3779da91255b6b6752f9425f68efa44b18c8e499091c2f294b7362bf59542528f19073c0a37d91ccf78bd3073d3f5a48df566bd6246bb5db9058560475b5f0278035f7ede52c97a257addeb55c272813a8eace93434ef77b9742c0fa55e1d2b1a4497e882f75205a227f5d0f837a14bff7acd5073f548fd82841267226ff59131d48c8112990a1af3626f540f29ac7dfe418ffbe7e81f8fc2872bfba92a5082d3fd42ff858b0e0882947f20bd02995c2e9e682da84a510f9faed69539c011c0bcddf72249dfa9d4ecd6f8462e96a1b84f4427f5dd247b8a8cfd2ec538cebcd2b2a98259038e624c444025df9a8f70d3051cf31d8c3e491d8a17b0388d696a254151b85cff8fb2674bada21ca4b838d58a59dd6e1c5ffb8a8bec90969c2b23a644a228a051bc713132f51cbf54be88e0542b90e11770710dc5d43d8d8fa57d24ddfd72f38c11f7f8849096a0a3543fe55f7603deb9da62fd582324ff636268dfd31f3f1bc9f4b4058903b3ef57d891818942238ef9aba6102bbca6539b3355d2c356d3ee24039fcf9d3f0cffab9c99b3cc965ca8f872681c0e7c7df31ceb4861e191d9674602f161d5ac8fefcedfd0e018acaa8758125777c43fb1a912a802b273d6374ed7c748ec6c2b93bdad52a24e5b477f488c63766ec21a448255bac2b32df5dcd90926ab1d8ea3c3138e442a985b871ccf6f4c1316e7a3e2add18482030ca12ada9f2fc5c93908efd184306ea80d4f1f90268ee7c8c040993ec7f0b923915fee0c2c109623d0fe15ae9c03d68f46668107b3258b576f4638228e76dc5d9816ea4a82bd13293e78e35ee8bc3af64d08ca9bbf3dcb15feeca151db8abe72afa1807e217293c77fa728471eed25476e49fec89c4964e1043c3f3dfa08957da7a1fec35e814bb8caeb6cd08823eaf579a30daa1b2e1fbde22808705770828614abb71a9f6f344003be10cfd6b1e1eff8023a8871e67f99d12cc02d9d5c01d1c8bd8a20baa28064cc8521230be0dd56a6de6fc7f989102698018dce72dfc094540a9b67370de4c03fa99b23aec3723aa543801de1af66d7a9046c0a136c2edc1d9a15ccc3411eb87b699e2c7a58de65867002862eacb756a9c85b8bb7111b0fa8287c6523b73befd39bc984208ffec1c0060086c445f093528d982d4e39c8629fa9bd5f56969c70a2eea675ffc896c94c3edcf6df46091ac455e23d650fcad542531469f9ad1fd048ae3a098b6e2ea95bf14e648fcd001aafdb42d8ba399c60186ee5b363529331e0ec78fdc2e050c13da11a882885780ba684c617403e9769a58a0531e53330e545124478a2335cc41637b2a2141a6e7b7f4927802521833eacac69d9898fe094eccbd9935004ed413516432b45144aa7922801404961642aa83790f0a52e0a1c1385dc3c616162826229801db923e6ef0c387f7e42080fe5dad4298bff1e24035e35836d8d9e8800f32e49634f137583e698284e5144ea9b28eaf332d57891a503e758c44bbd8d3fcc5db20d2bd391cdbd22e999921530586a76b5f18863bade5478cf969c0490d4c2096295fc1cc88cc2937c829443c186116865f20e2657b21f5234e812bca0e5085153cc2973cbf902347a3f00a14c40d5569913e46bb72f348250802284b3205c8515deabc987c426b56b4f2e240de01fbc05206fadcfe8173e4fce62bba4b6855c64861a5881fd02d1956c4204e3607c1acf78c21034fa26297404da0fd66059a68af9a40784d673adc57910183583a9ed843b08227e36a9ddfb58a71fe4d89a66b44e39333b1f33455aa597c712ca0b4724e9897141aa3efc0cf1be1c49120683c371b2de67610b5b33bc6d089ce038c0148c06c954f174a9305037ded836b6a92c4a19e5ee8370f99069c9695711819c28118d3d8352e2332858f0de380f655970b22e9e721f94eb92f1388ca0b75475d1ce901a3ce20183233a1c14829f11e8655710071a03be39008c5fb8128e56c1647a3158671e4058a4ce4d55406282501e84124af4778d7de0290c1e380e87a9308bdeed86390ab81d572e28f03c62575f3ae23fb8966a7de1cc31c678b2d3ad1576acac926cf1e70fed1d219451d4caf0f8aea0491ce9db010f889b77f063860577be79fe19bc570e0e3a5e4a0a09127d27884f783ed1a39fd429c3ee9b8c1bac8049bd73391f975c6b907de123a1e2fd869462e97322b677093855da24c0c44c236a11c89df1ce4025edb5991c81c3ddc72d058eccddef12a58541c06ae1239f3a3200779d2caf9a23010744a1b1d0c37481c2680060e4309a17ea575fcd2897a5e381e4e4e81b154e0bf3daa97c8af6421072e99134638974a4853156e1e635a875a8529cd3940c2123482c590f28c4786ca0629e9ce44ba0fdf51c2f308ee36a1ddba2d6bf675016bb373b3b8ed2464672d2ba6dc85820822e65f615e44f700cbfa3c1f5c8b08d65ea49d27a3f577a4b09ed2d11b7dc636bf83b8409154946e49fb62656fe4d7271e739e643d3f7ade4dfbd8df1c885f6217c658104598f649713fd4b442e75d00ff558dda4a4fb04e0663c208e0ecbe045849cfd2b384be7ebeffc83ccd464529d517890ab87935169cb5cbc0c8ac7354fa5a2a5b8971e59150d94a989f35089c45e69c71c77ed0d64adffcba25272ef8270b77bd227fd203d86a4bb17d00353f83c9791609ae5c6e06e615ceb351541f98ed4bec84bf679801b21c2cfbcd6f916fc70f6f96c86d78b8a8c55b7d38e0a4182f3d25a0995fd584b5238874f0a1c99ceeef902769beb50957a88cb51bed0634865e0660fd8f52cf9ee3e85b98d46badbb1b4eec50dacfa96266036c7d931d96fed39a6ad4b161f9b5531305b072975b265ec8b23843093ae1bb92207d738657d70030436856206cb68428b1da3bce526c4b41a02f8f7c56a22ceca05ecf54befc2c5dbd5ae6ebef75ff31177e71dfd73922a6470060b99424b4a639981086f5036d0e481a8295fc5ccf8c578153743fc09fbed072a301d9b76e77d7c26a226d47ff0d261b889c6d80ccbd0e6b65a83d757b165f02854e561a7f97c042ab81eb29ac4cf910503805dc91dbb4601b3eaf243594503edc1c71abdc6123e5bd077114f1bacbe078731a18fd53afb95471db819f6f7c2eb7fe38b59040c3780ccda54d125f0a269236952dc0fd3b99b912e2de33636bc38d809e3438d4288a8c6cca5d6d8e7da350d01829de3d1cf032ed3ffc76ebfe2c2a877ab1ce67b827668480a3129832e19fd9f05678c75a29a1ec51a223d518d1700144112d294b5a16ade6eb1c5ba7f829393f32706ca6ae733029b1e9ac67096e026ed8d5bf105514865e2752684c5062a7f79dfb0d750a390dc8b6619fa4c977699f4befdcee9375d32ce85e64339d26c0bfb9d32d3fd8a53705c6cfcf8c825fdc2c79e8e62bee12f11834650a35baf05c5bb94863a6f0d8375f621b544b1479b30e5ab5e80be8b9f3cffa464e8594921da5f15c8ff59d9cc010a7e65f75bab95b60f7b5025acfc2ad4c08e4af95edf0ebf5ee2e4608f262046403b8ca951ab4a0b1305f2eb2771f3edbb133b18fd22525243a8d254a9f474ca08a9610b394bbe708e286eed61015e5f1fde776901641c57bf52fef37c2ad08f554c02e84240efcf215e97a18a483764422741a12ce23a924f0e16301e7b87f17e6d95a11ba8d41c441c3ad88f45f92446ea1e20c76a3902f506e8d3cd0cb96d9076b149382ca8b16a8a08041e01a65993a4e9619c215148ba584fe5fb8f16da941558cfcbd7b1e48b924bf3828e072801ef5fab182134a3974862295705314cd43409f3a6c9aa11388bd44e21fe7982952a5d55c52801aae173b498a91765643e7cd0c2ba1ac600310b8ba849323f3a73414d6938604943f2eb8a540dc703cc5395ca591b7be399bfd6b1f718ed4f81ad7762178d5015033efe18f051f9211163942998c1b6127f4f26d826cb1781556fb6df71587da3da3377db15f38f24dc87461659a13ae1026694e47b3a74bac3d41dbb1b653a23845c85d5c093d2474db1c8a4b060f74bed83f8e48985b8eb7aea827356c44fe21b5dde8f876f5d2a70fc93db386524c02040ec8864b74920c5757466deabfbb0dd593f623deb1c1112d9d7b05d0eeee87603fe2892de2883c299dbb0268ef6e87b81ff18cede3889d48776c85d1f6b47df58943db3378620f8e9c4c775692b441a97ba022404ed89f815280efe9997e472d1aea787ba08e5e79b7066d8f02283ad68eb88f7aeba0c3df632a6abca6eaeb4d4c1843dddd3679e3f603c74b4ac4e20f0854434c7f1528f0dc9329d6ff2a4b3d3c0500cb7c0fc420930bfad017c673be4e74ca1cff04400acb139071907eb0de4922adf1329e301c0f0eca05fa2246e3330550e6050d9510c86789fd400e80ed62d2b516890db78c60cef1867c96ec1bd040b2fa6d34f893ebdc833d2715003ff3bb06274948e948e7d5ea040ec28f93171980700045e56a8a0e2e1bba57a00aee9cf8e2e9678b299afd74e3a53e921904562fb6006cd5379b9cda48890f69ef0729a9797225a1eb15f10b89634547df34d8f487a361b09cfeeca0e7e123398c5a4cc2060ff6fc54c320d57bb79c7f43b68dcd3d915973fdf508c70c57925ff0db7ed1e4d509025d13797bd762963954306d1979fbf0851c014ebdb96e0e5526eaec9dc6cd60c3b4484c25958326cf402a7c6cd5887afeab3109ff6c18719d2d88b7831bfada407f2136efc6ebc4f458518fc11dcc6681f70a16206ccba75a01ec3cc808dc9aa6afca59a1ae13844104351ccfb8228adcb4613e4e9a2bd511bc87efed26f5de8a1d3c38633f71e3b58b85b48a6c6c9e2dfb41fca8e731e2db1bdcb85871093914f84a6634256f2f1c20e8fc6739b79d1e57b51f9900c888e1e2e665db2d8c021007ed8a2e77b4b1d56ffd10d835e65bddba89819b1330df306b97ef60cde9d563e2b7b3ec5b88e25815f562a0b12782ed184ec9f2a472fed5bfce18721513b01c0480984686befe92720f79581340bebe0faedf9693a698892291fa9086e95235262c6438362b68c5b72a8065979fc168476c6d7b28ff442ef27d7d2d43c6ee92aee96a646dd588fa435530b5ba2726d17f17ad482192ee6c3e1ab30a677f05d2279e0e20bfea8552b1fe7fd123cfd55d46cf9c519cdad70311beaaeac27c8354a5cf3a6d93270e551582accbdde982ca8c1ebd656476eed9ec21c68f53bec389c4516597144154303d32d0420cc958509490d7b2dbc8713a28f1d268e48df5a17b9ad10c59f957027843b33e9c9b2ec162207235abd4ab87a38d3f51c83d55274d9db08bae98a9769ad76abb330bcdd4f8f14e74c867725f632e3c4b378049ccf308c585394a36f086b5d3012dffd7d38be6aa3c460866a88f26a235497906787b0ef9e4e7f942f6356c59441d659227f9b5e1eed9905d17e1b403f8abfdadb0a7c7295bae93b4189cdeef215e19debf83d514771e65f1464e4b4d7e83ff4f41c00c809cb77113e6d0615a2d5a97c2efbd498dd4269228b56f05562667712490f812d10d0efd576643eea0d765e4b52f53d5e8d2dc6006d351ca5b0bd4dfb523e3143c8702f4f1181a2c13b1a60ce1b085215857354610796b87fd2aa06bcaad3135c9103284fb74af88fb6ce9e67cc45d484f19a1f7c0d037d852f18f594fd196d9226ccd1004db41bd0778e1282ccb9e7f10ae2553daeb022127e674c52a13bc239c45c9a066f5354c245e516f23d1677aabf271bf51bfd9c91aaeac21f3cb259a9e958b519590659368a4a00d40c1f34aae25b33c61a0fdeed612c27f65af381e0401954fa6b6a550058a75c3474c57755cc349339e0ace549b8f4ed6c335bf3c3ff4ac58eef8833bffbc6e42c64789a93e43853215221cebe2caf50c0dcf064edc0641a7fec2cc9ed083eb882489174bed3ce573e63acf2fa5d934f8751174d56eed3ec480590c42ad8ff40924eb42045aa3eaab43712a8dd0459f4ce6a9ba907eef9f75203e58927bc1c01291fc40dab24c5cf8d885df47c1d0a031a0815258a80e8aa6cc2dc0b0f28798e8426bd978512fb6872d10ad94460f7adf029dccceb621d0e6b72401c5c62ec42e331b407f6ba9e2134825cac5bb5ba0db1ce2ace1a7be9c8824a4652e580284536e021ebcc4fb90489ec2106a3ea936f4b93340a1a756c6050bb03e305489f71a8b1a117e7324f40a0e8d7f1936df1abb8f38ce093878dbf52549d1f01c0ebcf98f2827b1ac7124a6df6e8597ccbba85bebdddfd590103a1e3d9b0ee1a8b04e13b84b87593854f03d67ef84aaa5609eafba4726ed0fcec2542edb3dd921c56150d1c8ca035696e34972bf5ffb936ad8316fb8f18bc5c492b619bf2355bbfec5beefcac51759fc7d5b2d607a276982ac7511af773e8e48198feb3fde4dade24a7c52fa5fda46e5991d7056388de8a4c0fdb9b1916ef9898faa7162465739d5695de3904f6eef062cf0dfe3fae0456fe6644b66366dfb969832e009e4bfa7fa1716106b26814496f12270a8d26475d7e722ab9621436a53fab4cf6f1a9ff74ac4c60e46a21e2490cd0d69480d796df372d044c48b76186d69845913184a6dc84fd640ff009211b16d70971199ee07b0b879c11e5590cb5a009139e2d99c0bb2a857e4304f66ab9d3fe7285ec604981e60f07bace26b10cb8cd7a7d186b7ef3e163143b038683755cdfa2fdb76ca7c7617f2154d5896e8ba17b71b97bac56d835928f4b31bc7a4191a31e5193460b8707f72f0a45a5557160a6f9a79c87b24fbe7b32e75e813cf3ce45e878e8a6fead835bfefae3a5ccb2070ee95242bbd810991087eb6c0dadf360142035414c0f0c22bc1ba02c623fdd24c033958ab12629d5653f2c24216188a6147f6efb71ef592f6aa5239539907555429b4e5c66c38ca42c6ebbce830a0df39523c3ea57d2fe3b30686845d0c054295b19158dd42c15b4901c7f8ea1314530fa9100c9207f0bbe9734fe82c8745e0203e2af42efd03022dcc7f408b267cec5e6893697022af864ed7b9e9cbc3d0a983d41e9c0685c2fd15b3fd636f8c97692951309dc08f11d204215db1d53dbe289acc7c4eb8f121ec4e0c915c1a87c0f8337bd5793d165e0551cf156a6915b64492db6cbbf0817222232e016f99e470b305fbe533edb1b43021e72b761913ddb0518bb862d8175f170c21b10eb30280d6505b7fa5f2de3809d3d276a03f3c7eebcd26b3460721cd2e3ed832101458b70cf985406f60b27aa55bc255e61fffc2e3738000a5064c8b12bc1f08142a7081fbc10a591c2734933b1bc7646b507a9450423e44a5ee89e5301b5fb1972f4172cf8b9ea006167f5a225aa34689b8fffbef3e3cc469105608e929e1e84a0e591275a14c09713b1d2735a8bc6ab52c9b08e9e1c87e1a58a0499131e9a33ec70836234cc288ef4bbb091ca2fbc27572fd1a833d856b2f10c4e9286125f5689dc790b010a2156f51b5e713d93acf7010e533a508b5ce0ac645902b2aa0e0611ec838ee2ed5a038f68dfcf8b5d126106cf6f0de5db7f32f72e9031475a4e149118e733e1204154eab21bb2ea9d459fcd1c3f3eeee7fa812c7e98f52cdf4ab202f173e545b0063c5bbcf9e9ccadb51d51f7934ffb8b6ba3c20f8437f79cc3e68c759e394e7a4fdce997e1db5c3eea7f561a895ec3abb222d2cd7f7313b1f624d3b087ddeabdb7d2bc26e577c6eb7137f75dbd3b64a38575a8e6e85437ac8b3c0141409deac355e01d14f1cc326a71349b5e6d3f67cbfde30eaa159d2cb5151a6221954b52cc5517133b5c132a69dcbec894e9d7b4ff671378c9b9ed71911243938f04415eb4e92844a0d750ace421dffe601b710b4bd6d57b83bbf88d3b2adf71560f2d23bf3ee6e8329e3df161b7e4c3aa98aee49de74dfa6bf0b525d2a6720dbcb17c95da0981a35deb2718faed8f08588b7764d893eca37bd706cd159c9e96761582a9ab5723db40197d634062b56e5df0f28c89640a772c37841d3b26293e6019d7eee79185b9e009292a8f97325e37e25c010fd722b89b8141955e935ef17f901d32ccdb9b912a2e5e6b337d37df99c9be7b686fc7bf7db376698ce92cafcba805a539265056385d41782bcd45082920a8d98e10d08891748d55b6491f57d64a6612c52f4cbaf8fd04a534610fbb28563de98a9c047d0de1737dfbf376905b644740c8d81009293f0d8d0f1800300fadddea0c168e67fd950c9e01441a990bf036569b97739217aed6cafdc2dfe1dcf16a6fc0d5285d9b8452ea35db75e802cd4c3cba8d61c7bd38a9521b1cbfcc5bce0216dffe06168656d656dde60604d42c2bcfbfc18ba8d9b92550bce8971c29d785f2031454581b82b35f5d01e45d911c1cf0c060142229b1da8f30adb658969491c48b6a85af64711b0344b35faee3f53674bde01bd634f103899af1ec665628e5cf411dea0a3d9dc489c46c310c2175c747f3b0e88674b4b8809f6dbef46a27121e0b075a7312cc078cc0c914403c2f91b08e42c9b3ccf32512103669b1a8bf35fd5d290c0f045bae7e9bca5d1997f26bc835c9cc1e68af71f2d8caecf50ab142ec1319e3110bf739d27f05adab26e3aa77d99665ae749c764cedf128b81cda22d73c19e72740e839318ee723b448b408d5cb41970629d7fa9abe9570f221783882ec0926bcb4ea360d5d7a7733c792203890c541edc000ec1086b3f0e6e867d102c8505903c710e1b4250eb59d033648a5f8cd1ecbd2ec0f1eb4ef04a1ca28efe2bc7ed87d112728c60fae0a69bb85f89a64c65b3dca37abfebaec755e6441cc3b8ad7efa38697f588ac06df4ba94d39c62f9c1f3a5b88b2ca5448ad2eab3d5cf68703906fa2c248d3c3e34f849bd52a6285ef1360f039daeeed4c9d53a6540feb6a46684e81d12c0f030fb7844edf543a71abe8ccc844fd97ce06b5aebc1def40b388c21b359357e82aac10f54473f4538966ee3f5811c5c0e6d47eb0849ad0e5c39cb422dfd81627fabb1f4d3f1fc7a6ee14c505e85a5c8302392bae7ce82c07046ea97ab18fc18e62ee0f499c87fb5b2e77f55b0595072ff7e00fb861e817f15d2301e8113b4da8f00b3c78872bb215f2709c48cb016deabab2ecda0e15dad715a4760c0b0f0238d47d1bde3a226ad0bdd9a0615042c728bcd57ae176fdaa9f95e9e9da903b9a4fd446a1d6d98d9ff58e961bc00bcc5438ea7971b61d51644b7e937b2b5f6245c665ad5d41900ab264512ef78b8b2d398a1953b8b25e6a4d7891c2137fe3d162776fb65be69f25a3c16c5cb0d8b58722397b7e6d3b8f2803a2ff866ebeb89ad4450f87903624c4c2ca244c3ba9ecf3fa1c422fcfdfda7e37ab8848e454c276af091e2ff8eb3fbbfbf89a1f7f13958c3834034cd49dc4b84ef2b438b6140113fcdf8c664a3ac4a8acf2eaccd330dc9c431eaea082aa3f2a73ac970e20670e0b422983316b9467774b8fe10c85214858ccb19db96344102482ae400a05aba0d55c06986cf397581b2676a3f372a7408d13dca8d4faa5d4887c1c62d3dfd7dba91b334792ae4fd02e65584e693572f8d83f38b4a527bf34abbf530dc449bfffc0283176ffff16e6eaae41fc840dfa21dd87fb3b8ff9e7f5d5d81e62cdedee33d1ebccdb2fd9ff8113f85c07edd949900f064753e3395f26e0e22759288a67affbe29bf9ba6ba1d84ab5d3b8bfbbf1b2d5b3b845a041d727d0dfa727ff55829fc337cac67e4c4a485db216192b50af99181f065f8ec79269d6745c07bc31f16d6d4b438916d3f2bde8d3414bc6f66dc4897d3779068437484daf15d258a5da03d2542d94d432fc45879ada633ab6f35a2c944a2c0261765e01d9fee5c58f33140c544e3127da53480a69e9924cf6098226404fbbf1103ba51cd138fe54a6459ac1d325860b8be367e378a655bbd3c028c491e399bde810274fa065adc234ec9d9e1df1eae259304287f86df73c1e37e5df383082d24804d34769f7cde7fb01dabef3e560b0832e1809293c6957f3b28e8026db06624a2fefdf5a551d964da53aab517d8598422a8b7723ebe94334de2fa9911a2349a51f44b4612fa5a1b208098761243f49792598394171a0e5109a01098de928ce843b0f2bda20688154b0456cafb6b776c4c5c6e01a06d259133f1daed637faa1603e78423b44612341a2f294d76fe088c121769e0b084c30c41a4bd52cad1379e7eca33432bd7fdfa0a71d2c2b3461fabc2a40efd5d771ba61a81818703c05a3995d091843d856057ee006eb9be79afd14feee1cec53de02da863b5799a10d6c03d993f0e53f366c8e5a6c0da58e82a1834ff4a6b8c2e8392a315876751d1f185befea3cfa0e8f7a963fb0e14d9aa8beff07902c7779397c719fe1df39dc0c22cdcb93ac10a223a262eb63349e516f108145a2960bfeca560768e5923a45c4f9e1949af2c7b4c2991688d7fab2ca48aab61f8f3db08183145af9d5d383b8f8e13130c162c4131ff5c1d5e8cdf52f962d7898fef9a8fc5295819a423d265e51dc15f7951ad04e1dd7c22146991e07750195315ac8e0f4d84ff6141cc055034a1ea57da24626592bca418440c3b082e74c629b98a5a3273630bd3fcb60c1956b26556125b4610ce4990c4870e0b5660dc3259f3d1b10089fd2e2fe74de70b46eab7cf849fdc64ab9a096d25898116ec9516af73c961041584a2860687b02a8b51a9b3be392b5d030388d6afd580bc8249d14990767769a598fe76471bd3099ff679762e04d001e77c741aee67326da5901c006d17e30648843bd814569ab9cf5ea9860a0988b20b1429d4cecbf264c9a49bf376d05815edd3e9ac6e2606cc325e92f36082619aaa4b0a9af6a3ea5d07cbf7142e46d3dd9a0a11d209684f8be8c01528f3483a9a66bd00c33278816b348c93ca2072d17040d969f7236093c236a8e59b95ab82598844d8eca145e08fbea14a39b11e875baf0620bf1625bddeb16cf8d210b817b9a84692edb4b3c4a852f771e28818071a06c3b83867aaab735754ebcd716d04885443263aa7d42a73bf92e3e848162b39ee9d3ff69ec9246efea9ac5c8b89f2572397a49366af5d14b404c31ba9e0d80af264ff33984fd118b4ce57ce894d2630f6caf5ff42a547db9629f0158462082ebfb9bce35cd31b1039c639ff3d426eff892edb21be87148d902fb92981caa0d45a9e3e692bda055654e48c3f7c539bcd13a8de00d11033b2c75641c326d94888737afcb820b0a97958c323dea8efdc408dc8ef68c110bb693c814330a0e7ab5eb5d2c2a9fa007afea4e9722ab42e8e7eca345320ecd777bd413f134593eafa013e2086daea732275eec4be066f1d1180dd44674902f0b98490ff696ce979adb388c397db3ad3a0ed2e9c3b6d036d5470217bfa06f1256469beb1b0ea7b3269085c2dfdaebea445c98b13aa975dc4cae8b9901346b7f62e8629bfdfb8e064cc9bbf981227e4c9dea39ed0a67a0427e9f81753fb06402e30419e35d69f258e503e2b56d7dec358a3a4a14bfef27ae61a68eb633b6196befd87dfd56a17ac2cb6b2673c172c1a804391b6f590e2169aa609e3c4b526c54cde3bb9ae4d5c922f7a340df2bbef2d27c5b8766684961654fe02af716df9e69ad8312104a728fa09f3b6eff3c53d1b56e2863464621346c56de7875801866dad8939fc35e27f5f20c466ec1e6a5e9997c5ed400184eba4593fd86a6d34eb1a5f241e313ff9b0136312e25468af1a6223de610e8704ea09da39d0bb2a5592c2a935a05383e15475b0ecac5e3a6a954ce4311b0adb4324941944312196f3d0bf510309de0cbfae99622702ae921ba0d2c970a3e8b40bad30a3544a0a847dbc6baf412c95c1354181b424ad3598b5afa2e6444621e43436c54b4231fd19af433a64ca6ce38c05c7808b28e65cdf97d72e7e008ca7c7b5ea0455abcb57a51c0adf42fb1dab9af5da10caeeb4eee1bee7e4358729baeee518c96bf4099a6b8acaf50d8495564e8b373770c10851826df45dfff4da64c5f8ad6226d9dc61f59bdc42150b15cb71723a748a1c1a0f4208437e2e86cd58aa7ebc6489c6732a9852fd61c6d785c4210df8c0de039cae3370d59b4c29ed47740a8019ecc1b0e6743e2b103c8a592d5f9eb74e67b82348728081445300ed4ce90eab407fdacb799df1b8482b3994ede907612cd727501bb5d1013f859069a3d215d5f10517f619cdc59a1cb8d951688cf4db52cbcfad9a44554a5491b1f636f0209bfffc57fd1c64f9e71c40186c1f8a5807c501fb317f1668d168749b3c614257628e605cfc69f027ed39d3cdd6756fe98546918c853e36108f9c1fecf8375d1cabebab6268ff8797abc6aae1b5e4d3fb6d260442145781806eb1428cfd643dc0ef1ecedb72ef5969396b6bd5fb8a7530bf48c3b371fc2c5ea9df46e0b5a8d0525766de75daa9a55c62dcb3fe84cddfd18d074ffd50199ee6aea315edf6ef987749380ba5e4b4da422cd9f37db100501bd31a15ad1bc104dc268662b7d8b82bb785f4d8b6208f6bb1da477b7f0f2cb666e65a9e0154405d8d39bf2f09b8cb5517b2c0c9fefa82d2143b4545115497ad7fab6bec9cbd2d4d7fbb200ef40355eeb60d4f1beb77d22df0812ae2767805d034c50310a63dbb0bc350c2adeceb36196cd062e3407c1fc01acbc68353c4913291e9574d2593d07e095571463c225f94d464c5abb3ffa5c2013bc83900f889a27999e52d327656c9356bc5a2f78e8bf86a1e463f7cf6e23a61a4db540b12f2d09531d8bab50f243ae5aadc4dd467c754134d387949641cb63ee24bac2ea25ebae26401a7366b18f49ae0823c106c3a0beab3a4ec42bb0899ac482e139328c7a93759e7db61de422d7adff78158cba284ce53767224d336c96169a44eecbb67d9509c5385fb8f821062aca86b56ca1873c26a9c5bf2efc55456b1a501a04a5cd1518c944ed1eb9ed0b1a98c65d27f2b6156535979df5758224ecf2624e5305ccb11a4cf509591844b386cf5034a047b965b405c514d07c95ac0718805d3303aa29d1b03af1128881a29027362b5cd4b46861dd708746b0f550ec010ff676845f385b9b05d02fe0e18f74539c38f93a940c0024934aff25464e562d8aff7a39b08917bef2df796724b29939401560939090b09bafe9d892ad5b79cc9b1019e8f3b1a1d47075e521efee88a42a89932bf19ef8978189e06d275cf3d8c775da7b70e586badb51c67125568882aeec34c997fb10e6fd67498a32b278cae95992d238b881c9caee32d0f82a5f4610504ff5128d771c91d0753b616865c1ff320ce82e9784ba755aa2287ae636bc8b7f1d97dab6bdcc7743c75b1a11c77d517c36af420f7ae6cf9f6b18738e4ae51a376d7c1aa3ffbb9afebe090db8338e83a0e4ee742ad18c6c1d4f7201e64cafa587dfb982ec9be467df999a665d4975f5ffef6210e860a1dd77196fb73c88378ca895cb8585901c17f1da1297258b3431ed6cd963171cb2f911f69dcc657cebad9f3070fcfd32ee429930825894aeaabbe7c393464be1472965a2b0a854209cd5484715da803b1c55131ce940bd48c314561c47f61038774913bfe0aec9d0b31657a18f6fc6c0eb1e72c624fa95d28aaccd79690e9cb39373771c94d4a293175928c94ad65dd8e195f22aac8f770a210e2a0ebc7c1a0971ce2a0d4e40e0725e9b1a7a4df1ca428c8a48f3bdc3649bbf51ccc94c8d3b883611acb2336fd5022b13139b3e96fd807c330124993b490e9e2a1444816d40b3b7496eb60425ee1d484aedaf45f50534d5f8a2ddad39747c416fb2e4f1f457a2f35f2b44b893c7d1e9c85fb8d05ff283ffd2fc2c2954d49a40f1fc663e69f34cbb4daf24b9f14daf2c7963ffab21c11b2e5779f88fcede5375b7ec6c4e6618646ba50eabec4962f77d46fc7bce98470943939f2f08862fb3fbed908b4ef9fdc39e6b79d714e1fe6a67686712828e6839032d246eea029c16a8772f595f4b0b524f8f480ad4c941538d93f44b9a95ca88fc3c16dc553ea0afb821c795833112bd18083f5e3d69250edad9f7d78791072b515a22d21d797710263ac4991e363f7192995734e1e3d3070791185f4821c469e4d27fd162fdbd315d4c5a65f7c07f18751768efce5d8b306520e3511b4230f0ed10e25097870a6b09d83895f8d2cb4b1dd6b72502565667268e2019a1ff104e2614e4d872ef6fc18a2b6f632f20cd1b4f73e9ce241f3354d0ea9216acf8fb1438a4b793f533935face5d4fee23e26100d1ea1ca27d9ddbb67d4cdc9b3e2942febdbd7f8e8dbff071ec2cc7cebe0fb0f6fd70d46d736cf9b2065b02a654a3bc94524ab9a70e83d02d1ca48fc3a61f5e7a844d530588297425aa509f1c7d7a8880042880238830126d8c7e187f221053e407dd217188268129a574ce48338a7a96534a397fcf19044c05fe21c225052e352e3535358e0412355bd01605f72d0807247050e1a0527910c781b7648ee340e604f1202a1a1a235446d0d0b45a4fe8c4275ab1258364147cf041061151a9b559666d66ed902864643e248be9f573ff39a594157b7f536bad9bbbbc1253adb45a4fe83cd172c1c5d9a18dcd4604ca58f726fb91fdb811b3f6e381032572200510c84053011f5e30420945a84108ba206485892226c8b0fdef66daee8e3c4c0cedf0c0a4ca0538bc565b3103ac18a0458b236cd41c171b971a97151321ddb5d65a31f69f3a4a16f5e547b3a54442b2903f3faff11a076b9d2ea30b64ce0e6d5415c5a106071a1c54382021e7c4a10603e19f88a9c0403d38a2604d8aec8fa5cf49ebbe21abe840549157471c1b0ea00838487de881723052da38b8a235f4e90daef1d77ee2af79420e63286b36052e107958339b3e0e9733b4c42726eeaa9390c315da83b3c47ddf3ff2f010da2bf12ff594e9e2934f7978fc5cbd224eaaa90e5138a28accb157a02b3bb4b1b55a4fe8c42764ab05041c50a1171a230b0e5e5e78f034bc3568ad1f1dac2f2bad5a8c7faf76bf7ecd6414248bf8b67ef1ef471f08fb32c8c14aadad7217490eb35f4cdc34faad3af8e951e4f1678738300cc330fb16cfa7fecdc7beeac3f4f7a72fe7c4dc67f56fd2a73cf10459fe8b0b1be4d034df64ea9808c66d7228f82069248d3442aa7c9046489a2dd0ec0057d8d8a411d28566478cf426c1832696f01930e1033b10c6df230aa9e394d346ca503e8e1c8d6902c922be3bd034816421df3f20a6cdb4894ee3d34f522e4c1b20139a447e1d76e0a107ba25917d73560eff1f880747941923ad3146138d1edfc58effc2e30a07274a0fde3c8aa0b5734d74891c9a56acb4c0f1f209e912b76c512472885ac0f6f7c8823c5d6a31309580e4152ec1526c89724a209a510a52206ad5e19d58adb5d61b4298ec2bb7b599e6e1b5af0707e96b3eb290ad83c0e1207d1e3c2561d0f7c18482ac63e2ce9e664f67a4ca66e52cd9d3aa370763381861ecc0923f36ad311ca43b38486374d03bdc1bdebe6fe22c26f4885c3f34edfa03c54c6614c2830434e02c580f3e44800217b0e12cf53ab8c30e0edac76210e5b863788ac2a0bf430c1d7670160e06fba8e3f02dabb0d4e2909babda0e72f8fb51c0152dee637abb5a167278e58eb6036c63203fffcdce8fdf3918ee318e74c69d3dd221dda3c7a42fbf4813f9c54c51c0f432e8f4a10dd3267d7c0a987478777ecac9387dd621e94f23119c1cc69dd20bd227778cdfdaf7fbf4e1cd1f66d2737fb30ef3e6463aa65ec414ab3d7e20395bbe57c4ce36bdd7c8601ca69162f226e950eed37b5fe8fde8f436ebd0c6cea42f346dd24b2ee6318e8649530749a3905483a46d98b6f7dc7b71576e867cef4f1f296eefcba17b7feeb361adb5d65aef4b5f0d7fefb72ff4dfbc2f89349149aff9c8d13e49cfe8de7b1e1608edd3fbe36eb38147b65fc3fff4a1bfe9e73fe9ed9b64f89f7edf3bfa1847a3a71ccc88f4fdce6f69604faa7fbf6ebbce42fa48fa6c7022937e6edb0ca7d97b5f890ceff37b9f1fe7aff43872261de6d8a6277da1dca4d3e72f3ce91c6254217d8c2aa3cfdb9bbed2e72883f4dd934c9bfbec7d5dbc60f665c0b44d2ebd936f3dc9bd00dfcf894228fd1bf5630dfb17fb30cbb22ccbf40d4c63e5f8f186dc56d3ab6fd40fad7c5aff0befbdd2ea1b98e621bf6a4a759c30c040c8c8c80cb1230aaebf3daedb75961a98e37ece3af363b991ba5ac5c6becd8d4ddf7ed3a1bcdffdfcec0bef73397276e4729055ec8b33fc3768a67f20d9d99471f70dfa1ca8717f628aefdfc757dfc8e88f70fdd1573f6e4f66c7a8927558f57c3cf17bb87e1562df9f5f98f7c46662153c78c216c030063294a10a18a50f8184a1b23074e48051d271a6cc796362d80d19c6c47dc3eefad817670ef4b54dfb3047ce0eefdbc891b3e7dfc83e0462ff40b2bb0f67ca9dfa46f621f63fcccdc303a5e7217becef7cecee928e3125c4f48d4ef328a2f43a84d0910386a9542a954aa5d213e10246e98528e93c53e4cfcccca85cc030bd0a84113f7b50a59fbb347b343d7578e7cd44a1f090966ccd540d43cfae430879ddcc2866cfcd4cc91676a3ddcc9b52f79df6213ee44227df6bfa444f2bc494fa9a0bbb7e18767d3dc4aedff3ba5962ded4bce48fb7bce5add6bd37376ee32cb1c65f3ec4852c8ff7ecaa69df8b83f5e7eb8783d9bef9a5cff4da17770c1cc3411b4a4db381daf65f1c8c11826c3f7c79a16388bc0d1fa3888e0edaf09ee360f59c1a6c4947cff196b3c43d6f7cded02087b1c7069c3c830e221fae947c08be367b5656c0121d829ef3251da23a4fb141c794e7784afdeed6a0c34b837e9968fb790d9e343d3d3d28d49d5bd313c7c1fa9a2947cd1b17a87054f76709d3fe85977c899e34d366d6bc6a4987579baf79e3029ca99aaf9ed5aeafbdfdf91a32859c85e4ebcfa149348b649c05f5f5e98cb38c7c7daa721691af3f7b66ca5fe10df3ec893fdbfedce12ca1e7ac9ce57efda99a34b326c7c68f71d1c15789f657984bfa95e76b061d461fcf711d1e678923ad3e26f9b4477ddac847af83f62bbd9df334a7160ab135d3dbd74ca592b53ea3fd922d653f1cb437ecfc4ada93488fb7efc6fa79be3620bb2f9c3c1fde174f511831a3a8b52855d7a035255e009f1e34aca2eded48c272ce39c10dcec7aac8f3bf5b1d7bea29f3de9cc39ce3ca9cd3e95311e90e307d4c5f76c8f98512d871c7a6f7b32fb1f83976fc70d45df54b125ff8819eed2e778027a59ebd67efdacbf9852bf6ccae7d8c3ea50eea9de34a19445dbc47203a14d24546cab3d2c2c5cb8b183e63402e871c3bc6a812e28d9f723139e4d831be6304b37714142afbec31e5918fa52e89895bea12ee6b78fcbe1088153b931a8eb9b5ec0b5776a4588c0eb4055cb36d5f0d1cc341f9f7ea8c69f08c8e1ce69f10cfec2aa5941ad14cc5df34a25d69587f3c686f31b5a1f6b67dfee24b12d205667bd9517f9c65fbd9f5f117c341d3be7bd32f4619c5e4a9d8d56fe1c253dd57cfeb36fbb2e3decb711cc7c92f7c0f046dfc36933936febcb5b50f47dd997e4942b2e0acc63599632df84be99c31f08d46ea9f713aa06947f0e00471bfd4c179e7bfa350234476e4bf2cb0cc590ec2445f4cffee67d77eae6d6c1bd33fd05da5f021c5cdaeba867c7fff152464901016b8787911c34483688cb0e5db02dfc191467f4951804940484e648f1d26fdf048c211855213539e99ce7712dc80070a27fcecdf118a26ec6cdf3c657adb377afa8534942aeeef7d7aef772f8dc8b819dabe5ccc7dfc38723018cac169922d0783cdec5f4c8fee9a70db6655499a1964e32fab42d674980374961ae9cdde86726734f0ceb43402570e2673cf8c902c6a7dab43fae6dbccea536ab919f6adc51c203919b68a2aaa20c30b97f6632603db158687ea6168ef1f0f4d0bb1c10072bf72395c6cdf2f717aef47eed6af9b3a11f1470cd31ba53bbe97601f1fff86611c7f1bd6a18d6dbf38e8df420839ccdb376ac50d7c9c8391cfe5a055018bc17a6331b917cbd86b4f63dbf7318eb9b19096607a46dd17c3a890a5dea8b3dc59de06413bf2d8c0c706acd6fe1d795aab8da79591b2b71219fef67efd58a97d19e903e2767feb2fb1a73f5820cc11f70b771d3aa64bb0c7c05d35382710704469a9f668471e1b0c6dec9bdfaf4f23ad5f09b55f097dec4be8a531aac81cfc25a69f8d2d7faf7daaef839bee5872f50c705b0d3a08ee1da90ecad3c78bc847b473632e1ca42d367541e77b0c6789893bf4f0f1276e941065c729c418638c1ef0288b281a42869f6d6f78b7ccc1dc5a69bda18192fa210a9c6f7549d533c05ddfc4c17943ee7b758ccbe5e0dbfe8f4ccbb46c25b7132039749cea38de446cc9be46fd9b7d37bc5de9cdec0e3cfc2077d53d38e834dd3623dea6dc9c76618e9327327dfa3d3a38a8fd7d5ba2e91960ec01295e22fbe7ec7892e3ca6c0638a28498b5d8cecdf9394cdb1f6db2f4dae9454e586403b2daa63f3d4615c1a3238431e06cfa580cee6f3d7b7bcd89ed35218cc1669b5e2b95de745f0e8108570ed18e47d891270767e36f93273db2b7bbd79b8c2d1144d1df179ade861a6a2841399dbefbd2084a84e451a817f94212540947a3542a8994444ea7d3498484a3717a11fd43ca469d45bb21fa0c2424a41111912b77e9b13fe9914bdf3d7596922ef9816ed3dff0b6e935ed4d3ee3a0fd1147c3f427fd83dca527713994b449bb4a009b8c2df6c40539f49a006cd88e45650fdbd916db2f592672487db6b51f5216a653c4961b5268bfdcf64b1c0dfad874d19fd812b77d1237833ef6a4ff416e920e495f7a1a85b3841a15b2bd7dda833337430e8188d6bebffdf6980c8d355312284e96656dfbdb0990dcd5d0de145b44debe2b115b464e1fea47be1bde1ef9d317a2f48816f9e4e6381aa6d7843086996d7aedb16fa1f65e33c374d2be1f560edad7c21256c104d05e85cb01a76c32b6c898d2e390fba45de5604987a68f31751c27c354b2df0913b4a686af6c1cb45fd2274ce4d06b6656261b67a961fad2dbe74abf71324ca5026c32b6e450c3691cb48f436e579d309183ace28495439fd9d6bee3d8d0fbecedfb8db3d4f05ebefd8d9b21c3931a4fbf32ceda61fa3aa85d7d6fd818f7210d1b3b6decb9989240778b2ddb635815199bc1defb777b3149f90baf8e6dbf7be133ce32dfd2501d31c5fe1128d8f6391d66aac4b64f67a28ad558eff01b076ba67d477daf4f9d05a852a012ec6509a66780bac5ce5b5a6befd5d849fe178436dd530613b21deb59b18382e56cff2da630d654c188dfc25311c64fdab35d0a61ac99922f4ff1bf423bbcd965502a07dae1a53d436c1aa99d86891c831006209aed4f83ec380bfddf2bba9a1a7450d2d57619cc0728023ef4a001650c738f0ec26c1fdeed9b01229f8887111d01b2a74a9e27641e2ab25dad648d83155bc9b771b0aee8bbfd72ec28778d0d0773e3c6146bb1b115210af61bf69483c16a1445bbf280e0571e59e355f24c91c3c843810bd8d0000effb85df7e060ed41c6e0c159ae0ef5ffe50f624afd22ecfa554ab1eb141b2579783a19cc489781995f23ea256c11aed8ef29f566f33b29826ac71851a83be79c73d6772901d4c44bc8c63611772c9209c23553eacb48959c71b04a14c494faae2632905d39691355ea63db0413398cae96cdae2f5d7f6fceb255ffde9c654dc5a40ff562d5559790fd65fd47a92d76fd1d7f00c58f1da2b0adc1207f5b6ee9241ee4d4d7c1c13ac5aeb57a615708c494fa51a5d29f2f71ead719ec2bf6b2a6beb4a9400441f495c4a8cf1303ab52474ca97fc4ae9f055ac8f6e773313585664aa5f4865d754883a6c3934968a65c2553eaa350395f3a9a8fa2922e7304910431d57df546421b76e82afbcd08da9fdc67ed3b372786611886330e6662179b1856391ca06dc3363b1661479e18b4b613aa9d37f6dc6fdc6fdd6fdc63d8db16f79b7d8c7b6c065446e9cba669a8df9a76e272a0f43b4db7d3090c7228b78f7c02835c0387dc35700d2524a8919193c9c4c9002f0d9eec71e2639be17dd8c61f7d4b8ee32ab7d5adbe98bb7e97866dfb7e050a2534d91bfd7829a534973898adee1707e787eed3c3fd165bba9f8fbb4f6e9fe2ab03b6e7385dd295705f7fc4c9d8bed3dc731ca79da586ed71968d9b2125e700ee77c7c9b08f6ddbe34cff7469d8f4c37cc3a68f1fdbd0bdd73d8759bbbdf75dc7d1e07ee37edbde7258b7759cb7e1dfb6ef52eef33da3db980c6f632f9cfa0e3fe0dd3777f79df4c871d799f13b7743ee1320397c79917f7e0cfbf35f62cbe8e72720b690fe8697df1bd9c730ec4933ec08abf1616e06f7d86b9c0cabb7c7f49633b3231676e47162b53100b6e82c255b54911f77c86d2963ee6b63656eb9e9e30d6bd9b6d5ce6fe69da7c30f6cabef47b14a67170ab1af835b9cb4ebb6e7367db5977d5f3b7cb1b1b2f5053229038e2821cd31652628d888e4064f5f5bedef8df306d1e44b3ebca9191440f22e327731676c72486522957116192f8db3d48fa1359ad2ccc854b1aafef8575e77285b386a0b0757ac384853636ce11a103796dbcdb2ccdd3f26ce2f7c096ceaf53ea629902ceedb2ff49f7d378c2fa55403c2a24ec480b5b17fcc7de4d9dbe29d72cef91c07332f307578a5d62f7087d1db5022231f1f453a7dbf47fe85b7c856b4d091a76ee1a08cc867227f45defe749919b3fb917ee562ea8e5185686413f9110e66e4f11cd9fe919331b2517ffa303f3d96db0b27d934dbf425a522df7ccc8978ef32b10587e53f3c87a6a8cc4ca9df85b713f9b8f738ee473893831cf72f7ce4a33894e560a553d39bf9a1cb84f466d777199ff1cafdfcb8a732336532c39374f85903c5941c81f2048a291368d7377131bfb18ffec8877d7e91c7270e46c484fd29b660778b2cf467e9e7933898e98dde1f670ec64d5a867b69e4710ea0efae4b4625de7132e88f7489eb195a0291f40db93d19a4678fa7d48f07c963248fef36439540d87b581e8dbcc7f22863de1442f24d1f4fc1b4d39c00c92195a133a31a1e95892da4af4f87882da5af8f4ba3f73ed22777a6f44b5fdca419b7f19583d5d34ee3e0e4f1386590b3643abcf76a5408663f332a7375081639384429a594fa8ccb48a12532a7b50fa59046451ed991e7c78e1dbaa8590b8cb2b1c9c61b7e8a43fc949b65d497da1cbbaab5b20282ffd965a6c81270f1428777f143b557b4e0284d9990bc024a3e047dc6e496bc0c8996b9becaf5734c1e0016e0b83d82d8838951c583392942a60e6a0e53e9710ac126997cb718b30cfba8695f65fd248da65ded629867d288ecde2cc6cf7ed78a6559ad59fdb20ffbfbd558312570a90c597e75aae3a3802bea108c65d8bd711cc6d6e2b971bb7eadf13d3a1292457c0c8b31c61ae37dfbf273d5acf7daea5acc36beae70507e116ac562c4ac7d49ebe6e455a2269445b2887b6cabc6400e522b335f16f1c8457bfe943259adeeee980ac9227bfaf7b3ba66126d1c670efa821cce705acbcda08f3f863ec69f634b2c0d205954ed4e98a2b5bf1da198c266c6eb333338f658e52c410ed2af30b58aa8e252a68666c6c12672385f56115ba2946165ff97f3060c987edd951e11a27e7b9478c6c81c9b525abf1c9b5a6d00c9624ace3d0b1a4593dd1d9426a0bcee2a24a40b07236b1c33c9a4e45e525cf4c82ef6bc9bdcc13364dbf3f03efee02187204f4a29a5d9d38cd2eca5fcecfbb1b3bf38f4b3bfd9ceb21ff466138de12934860ef4458c2a4bbaefb8b7cf615f8863e32e7beebb0e6636b6ade9acdee855d28a84673fa2e83c824ca97ba4d672a9cee2ee8be129aebd9c9266628c3f266eac4bb6af81bf6e4fb76d237e1bdbbeda7ee18c42e810709ea939e78cb100612cc28e3c60d65a1b630174a881ad590cc3300cc3b0ccffc5a41ad8612644adb55a6badb5d6d28f31250462ce39fd634cc9b656c4080c1d73ce39e79ceeeed80b51b50eff4a29a5f4674440f633887880ece7176301c21c3bcc5ed3fe85eb180b90bdfc7ab796fd7f4160af4308151e4ca107145b3802132e1855881c3c96000231c060053e8640028c39e7d43a300d44d325999e016e94596badb5d627c2058cfa3a82b85fc4080c1d4260d65a6bad7d225cc0b0af2308ad054bd4400528e001116e60047185882e161974f8044951062030f24c91f7de7befbd56eb889e4275640cc3300cc39e081730302d848e1c30aad641e79c73cef944b88031b58e1c5308eb2620d806db504a63a434527979eebd37cb62501cf415bbbed4218e19a34679ac662fcfad148a8a6195ee50282a8f83b2deec4601049d431ca456526c5e01c3e615b039640ec1ead7cf29d5a466855aab4dae3b5e76bcec7849e265f592c4cb8e971d3a684d9595ae1c8c185d559a825aa90dada129a895aee8aa7e5e5b80516406308e31b2602c3d46efa46b1a55a2f42143085699c990e36314b95130e99de472985b7e6cb1a39e4dc01125cc928789a03d3db9637e4f8f6ecac92aab4f7975c0ba423a393b42b1230f0d866cac016539c4417fc9c55c1fd9ceb87648c32cf5c913a1dd549eba403385da99979dd9fe1768a6e490574dc9219ee2ef1bd5f2a5852c35d5f10a7d01fb16e947a9a98e1bd4e00635c03ff14f1c51702bcb9f76c3d913f9e7cf00f7f4cd5a6ced83dae77e1fc5ced77489fce8a0fdca39603e2ed19e93311f830efe20b7a657f030f53c8941c6a812dbcbede5f612b77274d0c6383a8141aeff440e7f63255d49a76780fbf13f76314c3f48238e77f4d83f0a185be4bb2e497180fcad04bffc4d97603d03dcf8b1067f901beb153c7caea9fb3e8941ae4f7fea1dba436ddcb3bfef4f3549affdfb51699f7ef2ed17ce1a079241a78dacf2318c6231554e77bf9b574a2b9dd279e0e822d78f39eabb5d14e0f8ece747213656b3cfbefaf8d6ec4aebbd5fdc58bd39a60d76efc5deda38dfc459b62c1d65533d2b0f7eeca035bbbe54ede5eb5f30afa05cfc0edd7457120d7228653cae8c7c0886df7d88ca52a6b512858ce830f69874187750b9a4c3950bde3bb590833551f0c0c4440315011595a05028140a85222121791212940847830485327992372141a11e85426dd4dc316fa60a5a39acb90212122d67d8f9d9d9d9f911399d4ea7d3e98442a11e853a9d381aa8d389e4514f823a9dfe743a119d888abc603369e60c1850288ddd04b9b9b909326232994c2693e9743afde9643271344e2613ea4f8f3a6993c9e463f2711d41e8059484d3494bdf229f6f8cc9603b30194c06db411a8d46a3d168643299de641a95381aa6d1e8f4a63fc93dd2a3d1286794a303240a9e204e984c1aa8080808a8a89473ce39e7d16834ca248ec62867d38fde34caf973ce7267a7f11a2f82e5372b1fc168a44b9f6fd2cecfcecece4fc7711cc7715ccef973e6461c8dcc71a3cf3fca1cf71cc7bd36f71a32852d7fa668a80a39eb9b2037373741bc6ddbb66ddb388edb324783dbb6fcdc674e6fdbc6e37d726f3c3d3d007209f1418c2abebbcf37ae32754795a93bb42ccbb22ccbb66ddbb22ce37e7b6ed3599665f206472a1144e7876cc1b669a0222020a0227cefbdf7de2ccbb2db7134b27be5bd454552260c2b59235563c8322d7d6b3b3f3b3b3b3f18a594524aefbd7f2fe5381a9752492975c59f28c5d090a025dc9b20d2e50a7954cef366cf207b3eb6b5d65a6ba5943ea575e368d05a6b6d515bb828c0963f85ec081d6025aac8016c2f14fb32b12f937d6d170977e5de9d294488a7aebb747729c8edcfd1a8faba47208b853d1fc320fbbf84a0c8ec49b4a745c29e1f71904370afd850a0102133a546cd5e177907d5f342eccbe572250b99b22f97b88008cabf42668a01f10ab95310c1b5596cb2c5090eb27d613a1462539de5ec78926302522ae10b2c1e3e7cf8f0e1c3870f1f3e7cf860b158ac1e3d7af4e8d1a3478f1e3d7af460b1582c164b2583d5f6a6fbfcdfa2ca8cf357e644c595a9a7c7168fd2cb21a5f700479450026dfad8e7f5278ab67c29ed10594a7da58ca462d3afd145fe4816f4634b11b924876bb7bfe468485d22e3beff762d276a821be547ba7c9105fd93a8427f36adfaa38a0bf2fc2a2329053f47f7af727b34a118f6986395d65a5f5669a910b2b5e73efeca0ab0071f3c35808fb3e563779cabeca9d99a35bacce9922c6add1c50de80561363b462f6661adeb8cecb2312ddd97463d349640445324389090d35d8f09ff61bee748a714033e5866db65cd2c5dbb939bb76cd7263d1a8b41a1d9185b77343f49b08767d6fc7baaccbfe786a05b8fd00be0d67bb7150263bebfe70511d0f00ef7937bc875d2e97cb43790f13117927efe1562ba8e5e9f7b08f8ff7bd8757decaf3fe3daca3e3d9f09e46444444e4d5f01eb6f168784f73b95c2ecfe43d6d68c82b794f6bb55a2d6f86f7341f1f8fe43d6de5799e877a4fd3d1f146decb888888883c91f7341b1beff45ee672b95c9ee9bd6c68c82bbd97b55aad96477a2ff3912caa8f377a2f5bad3ccff3bc4cc7bb2e97cb35e43d06a2cb1dcaefbd069c257bef6dc416dc6ab5bce7c153b73553aa8ff732a2cbf5f156de475f792befae3ceebdf99e8e47e41179449ef7dad5f13c4be479d7c6f3bebb8183f10030146e32ae1b5e903d141791cbe522daf5bf934ee3960f6ee1166ef9ecfaff718f575807aff00aafb0ceae6f830d5b0d44d886888808dbecfa35d0804d349736e4692e4d73759a4b1bdaf569d066d05a9a8fd76ab57c767d13920ca5ad341d4f5b69daaad3563abb7ec9c815c988341b2f23d2322222cd66d79fe1644d992b1bf2329796b95c43bb3e49092365adccc7cb5a592b6b653ebb3e6af4825c7768a3c856994eb6ca56d92ad3f9bc9728cff374d8d5d4b8865c2ed7d0de187ff8b3118c71cba7d56af9ecfaf89bcf89ccbbba3a77755777757576fd39ff9e660036edb37bb6662a4feb922ceae73cbf8db5e16caaedcb33b5d158d78e6a639bb0eb63550e2fd125ba459e12c06f330e664f713c656ff890fe00c0875427001fd220bb7b7ae32ce0774f95882e7608e543da82dd3ddd115b4ebeb32c1655b1680d8bae8a9ce5c3105d6c4fcf1888628bfef19455a982860cb99ce59322ba581c9c25f8c4161b5a9ec25eaf9d57cf4b888eb398c820bad8193b43839cd852c3773f6d3c85f5f4cc1d3d383d3f76f7b3c65968f8eee711d1050b0a9a24d8dd4f9ad85222e4298cc522624d19d61067415921ba603c3c5878c59619a2f014a6f2f909da1dc90fa20b86831384ddbdf3c49691efeaeb95f36a99be7b5f22ba6033ee82ddbddfc41691efde673c557b9cc6a63b9121bad4a0a02a8a624b09c85395c57ab184581d8909d1a5f2f03861772f5db165f4ddcb209eaa2ac9a38aa27bd99235882e1547b2a83836d85dfeeee5ca53f4f59237af9cdd6927d8ddcb1244973a83c353b467a6d4ef290adac2ee1e03d18506c91a0d388bf7dddb882df3958158ddf3e029ca9a29f57988b0bb97115d288f6451ffa553ede02cf8bbd721b6d8efc200ecce73f7dc37f70dd185e2a0c4169a9aafee6574a1339245fdaefb110ea6dbd9a075d9a10068eb0280b6ae1bb475a1e8a15dffa489ecbd65f558d65b9665f5ecfa25dd7d566571aceaadcaaa2cceae4fb2813379d99997c9eb557f54c346434f508f494f4fd0ae9f4b300a63f1b09e67d7f766d04830158683a950980a536138bb7e3792995eaf17f7c266767d4ee49e7a82ba1e530fd713b4eb6f254baa2c9e4e87dbcdae2c166b846d555571509caeaa4e5715ceaeafe5aad1579dd9347dd1177dd5995d3f6b22d31dda28684f504f4f4fd0aeef65b27633bb76332c1e168bc5b3eb4ffbcdc777cec91151150e55511555e1ecfaf6a37f652cd5213744009c8c948d2f1724804dfbb0ed1ff7da52f26ccd1437c4537ca40b0785c882ae7cb52acadcd06c7152882a75faecfa9a038a2a38399c3f32f7e6acfa38a08f0b72b0be3ca57e279339a0f9338166508c6f6e08d1b5b14496c8125d1b92ebd9782b4f09801b12f4fae48a4f06cd7b89664a952eb8485ea2d7257ae122faf9df8f1b324334539baa48ba6c434416f5eb0d0a95e78d2d5b08a24afd10972107dfae3799a8521fe364faa1b79363f676bc1d1b85b3841c908f15e22c1c1017e4a994afcf0de184b8a1016c3382d8fb6723883d07345338660c9505ec43eeb56be62bb84daa6c9bd4210ee0eb663ca53efe3a199999e2803ca5fe26237362831cf24879fbf63b958acb19556a375ffa38585f009f74794a65ed7045ca87f294faf77b076bad2b421c50fde78038a09327b6194fcd95ccb69ad3ea1417c401619ae38076fdcd59a82704c53700041c51f00dc94aa6c838e7ca7ceca37b5b1520ad6a845de7265f31b511a1ec1a57442c7f24900c5ad975743f9c425328b6482ae343285a4357b3c83f938312e6becf0e5d5527109db199430e4e224fa9ae71b65167c122f69bab3ee26c033fb7dc3d3121a94beed3f739a4aa3175633d85426ed7bf01a497a8342df675450dd5cc0c00000000c314000030140a078442b14830a48abaea0314800c8aa0486e4e9a4ac32085718c314429648c218010300002203020330500aa4cc2d4c4ff20fa4f14b45f1ca5da28d899662d62548a76288f915e7e4ad1b4380d4542927107379583247665cd283c11dc10f1a3b572b4e2d9a05c1c2d3c9a98806dc228ca3a8206b1ca4266664c32515c69216f7a560a258994680653c669b8688ed3d3ee703727103cfac4a18ef61050f3b930134f26c9e77f403ecb59432c642533372691a84efa9019bd954669725a1421a40b29054bdc89af2f8aa7713a167678d349a86745c1ab6d66872eeaa81c5abedda3597beeffff853300e15457f531c3d93203d16fa49e17b3503654478904e894763e5d6feb8e36709a6bf813ea5e8a509e120757bbb39a34811b05e78ba2b6176b146b59e4cdc64a53da911e72ae6f2bb37fbec3895ca0b92bf4a550e41349eee614089562f4b7666c1c3b3066546b4040e55dc0bc7a0b984c85ad41d6b2609c8a9562d5260de46e7e4bd0882085dac209f18235cac1143ceae980e57bb751cc21966ddc3623d4324d5c99e55e0e886c86fa35c40aab5c53b1099dd2d08aaccf9042efd86f2e8a1151b07121afc521844a43d3ddec75b100351080b5395acbc59934a13f82831b9108a3e5f2a7485e7390877d067fdad348e9a725daaee9d6e3a129b230fd8de8b9d939a92747ddd354ec2b92ed8e4d3c0aef2ffb86f8814fd2b4d4b56da87fcf9577211e9cb63b24a489a361ec79a320bbc01b669115a649ac445519ea42d633135646276f08d11440022783eec2c94927d6bd92d346b3a6e1ee92491bcc43b9e0cdc067e487b78b39c7ce04c0cf563cbba0f97f2fc9c536c83a167113639289eea409b9d34f699426a745e0ab390161c291b982f37f48cc54e3e52262439528dd99ccb616176c6f69712374490c6e6a11becd0e2826c4ef546c31184ca361a76cb17a4a90ca0fbfe37495088947334ad506e78112abbd0596ac0c46f8032abc16b343e68b216647b255baf689ae40ae5cae504b34952db3478e850afbc9aa4eba043bd883591254b28f7e25dfdfa5ed8d1236ab2d56825c4958f2808a397119e93e02426699976627cc3042fb23cce808352407f2c626d8cbdd510875d3c93cd3a52b6a3a7ce8c59c8801656d2d883a3c7d292c924ac416a85d31dc3f5dba8fb2b9e995c46b5a295145c099fbd7066e32d7122aa92703320c2e7562b0c69022041c25fa5af03e23e9c844468ab116c84e9d71d9afda4ca5018732b4f6b1e0703fac06b48f2c12beaa185c8758d58530f8ae3cebc40f7011c0a98b974690f3d1eef4694fce4c054427607bca075e2d5aefb801b014baa11ae4d82a0f372560863e08bbbc019fd7e1226cf557999886424a64c75686aca49c26f50b100c951f904ed1ebebfd0995c4610605c70378c919b4dfe092e361bee1b01da25bd5a1429341ff0f2b593c4bf25451a1ff375b1204e747709ef60abadfa1c20d7414c31bb1890f0a598d784630362dd1009b40867c83b1053b05517aa4f450d603ec2b3ad709669b31f5089728ac25bd1e490d29537c15f6f2e3fdbd65ff62343742af20fd483d857a44f416ec15a9a750cf88de89bd46e8fe8edde7e87e91de7f9ce816d28fa05fb037528f423d11bd0af644ea59a827a2c7c45e21749f63f747745f9af749907d0ad2be53c47ecbf3f2c66838951df3e6ad4ae93138e5e7ad6a3fb36444be3c358f6a27b00105418e14a88099889d2731e7029c8740b6aabe1dd107ef96465ba6f503558781f29cd109fd8674db0bf408379dff48f66716c2469ee376d02e6522cca2551c2baaae1501a9a6a6324a4d5c19cf5598ed1841f179844da0f61b796ccc75782c6549d2beeff6330d92c30939ad09cbd947cc888c1062ca16cb71143f6efbd24d9fdf4354ae8111bdf1f40b0bfa1bff27db8f2efdf5e01d69ac882c3b783d5858231536cfedffc1b87f85364a4c89e53e8f7fa160b47cf95d7872de1b5ca516454008847c2e69436558780e72259a1aac29d90147dd2352ddfbac69c042ced41a345a840b1ddf5d221c46e29c9e8268165e9636df6f0270b9faac968b7f58998fd3dcff777f684368521aa1c6ed3d59305ab6829426e5aa65cc9c900c79126cfd6416fa0168c44868fcf5e5167ba030daa369b0955e274b894740c1dbc22aeee6ae94dc33b716b6fcfa7ce53b1d66584a26daa07edb6af7ddb0ed902c9cfa9857f02ed86c1c40756ced888ae5332d69fe499292486de148e0acc42072f1d01e8f84b622d708340119cdfed39a18783b47588b00aaded99e7a7acfaab0808217efb93ffa2d7fa085c735b64b8c2829b427d0b500b4eccd4bafdb560f0b300d10bbb7d1fedff5de6f0993e5adc167601f8ed4def4c96ad1d37e310677c32ef5c6c31ad3f16862bc35bd25d7d07f723e6275adf528e00be11fd1b2a6a15f3d9529dd1a81e15ee5dd3404e10d8015be41b08798c2f629fc35a1888a4a7ae111b0dfbb6e19d45766f5c8b46e32ab43a6f59accc151b75cda96d7bc93aa1e32ac974cf59551bd64aaa78cea2703ae6725237f8305042339ff9a78917074193c2763e160364dfd04a031c72602b7d332de3c17d58c93891c55de3ed0b3ac1723c00b5b7aae892073bfcea2738a11c1840381b32902aae29ea3dadebe52c743ff627c1456d8973c53fc70cd3ed2e9f5da7f5e4a89b5d9c2736b85cbb3d14f9ce9d4cd65165d835ab6a28524f79b8b91475f2833850d2c9298c2ca60146c313d13fc33bca9543500bf588e1b5825d3a798bb288b30556909d872658cb39677e9cad956de7e53a92d951d41f73d19610a63dc83dee8076bf03f2f95194c619c9fbc5cec304538ddfdcb3d281c17b0ffa12899c314c6f881c368bd66472b948029d39a6ced014ea5c415ff45a610608ae9f89712f9c114e6fd9335ef6fe9e1ef8745075363cd9b6c4d4517ee0753a9e42fbfd97fa637bf0a3f5d616a14fdc70679c21426fa99fae5bf69f2efe44e13a646b27f16d8b3ef5b8802d263390703c90b11aab9e885a9d1fc9fcac8095398f00fd4467f48c1bf3921cd616a80d158053422624713a65ee99fa8b3fe91de7f7546bac3d428facf6d7283294cf4b3ebf77fa789df999b8e3035929ff31149c014769b0de86bbe28eccaa050d874c25198fa5b6e4318890c6e9db17ba4841589fe1b47d553e74931834b25981a1dd00de8eb926ddaec3d6a5f7acd0ac08129030db83083a9c84a0017a507a6d21c2e75e750442c495e4f3c61d49b77e210a6d2b37335b3a52d89dffa1efd74533acb5ea35f8286d874b09198f77330c5b5e64173a683523e4d75564a32a406c6950c064b8d5924d89a9a439a593e06dd143a7522afd20c17dc208b9b2450a5119452a4e8a682879dcad6a1f07451995567797d3da226705588a906c32ef0871e03f5341f8637f28b630868e586148dcca9e28a61e2d7bc5652889250038320bf87e71b1c1a1923d9e3c45757e4dea27b0bed596b55c68c84c96748656ae92f65310509c30c57e9ab5897110b028b948834abd4cc2098280354d3be5dd9fdbcf665e032728bb5db23fde1b5da1591331f6f91234dc49947e73b1a2a9c5935c2ca62b53220038a05b75c483ce2698a0be5cb01b786584956c11c302ebd82b49d21d1720a8b8cab8657b48afcafd770b5845f095561230e67ea413087bd428cfe7b84ffdfa31ffd267eab1266754076623d5262202e87690061b06a31a40f1e174a2c3b26bf4a782f9b1a022e9fce400dfe2f7d284cdbc0ea9aee367e33c34f9566703b618136bfe2d379cf41eacd718cd3be2c7eb0016ff65d73e4f1c193ba24e80505666af26e2d404b0df61357016ff5367f0200a4c0ee9670e4606e850255089180f2a4a8c7d6ea93a734862892b21fde5da46d8a4db181ffc6b8f15461e285c51582ece490585fc8301479fb8b9181ee30eb5f9af5fce72f2bb0ca32faa374cf2b33f83f8aa140b186ae9b4fb543c7055b8a3ed249f3291d0fbb778685ad612a35eb457c19a6eacac1b685ca2ec9fc456fc71c28a2f74d057ea102184a92dc208d0a9e05feee401e87895bef3925022d9f4b3dcd5fcd8cf10e834886a7c1fe4819953a3453ae0c2800f8841ea1350661a07e13a56fda621045f2e29cce217824e5c111af0ba820039477f4c1ada78cbf7835ed8e6d9f27356cacd9022a9df9091abae0d386ab932ef89802359cdf474e64a6c1fb1e26ab350df7a83e9ae8d6f1b54e93667a630a2bc8f1682205ef3e791845569e4f664ed80cbcd4d65dd2720a6e20e76cb991b83e03a475b97c9e507697f7fbab09b8fbe2da8aff50b87231a7902a5388db273a92666ca7a675be58fb117cc29bf40e8329eac093c66afca4528a4648d9a0b070e7683b15564dda322b999c9610e9c80856fe6d27904c4a9d611d51c101fdc7c3654577c9e799311ac57a1d72fbc8000fa08ac679524b52d0f827497a0c4f4d3a3291ac9c9616e9c8211ac07f6b1a58b19889a39b84eab2754a85d2892ade0641449d47e858e06b48f65903f4bc07c47db89d49856f861849adae7992dab84b432b35196a638d1b8d589bbb1aa456a2f9512a4d37a87c4a4cad5220850b37ba22665ace7a49adcdd5eaa683056f1c4b62d18e88aa830ad2f4190911f2f08fef3e4d6b48a5f28f0d638df561e65cadb8b30f761ec15164ac0a9e0826b2f833d7dcab0558aa2f049c8a42cc1293fa4c747131ebe1c68d8498454f858ec861629e0902ef1cae4f2595db1bbb33d86ba0979849ab7692e07ad19dd207630b2cd506ab3ccbdbb7320eaa413db7ce35c2d7e8958c481eee1f135af8fe3011844944b8c3b044dfe49ec9ef4a5339f8ce6630e8d5247b5b9614cbbc6870199bb437d4122bf1da8e2903dec54b66fd8ea0707072ba88fce5c0af13d88bd038272443aebefeec0ad74a5702fe97b93be88d1921d34d8b40b3018809e49642010c60c66ef7c74eb733b3dab55b07717553148a826abf5cc30fba514c77090d1121c327d16a870c9c42d6ed6413a2e6a9573a82900cc744a75383fbfce1cf391be069357486ac8832c831bd87a2efcff00f826b153adcef14e9ae73da2a9363c91df62126919c56bcbc99dbcd4cb4fa15d3ef6a5987a6079de0a1d25bdfb40f088cab69ed20a32788c4c9fca40392d8325f7192c13636b9e404977ecf2a14443e464b5a0b24d2f20c3fc05e247b42a386de192b323d9572355050436e7942fae7dace428f1f4938e0bfdef990e6cc4757b10a97a7abd3a48818443e2ac088dc4c401463ddc50fcb4e8a4ccd7735ada8f721087c5aa0942f35370706030b2105f449a00a58849c4bf02a6c09d0a247d5093c5bc5cedccbebb3ec3cdbcaa61b94676a9d3cd0d14a8184d7a6894f96096db8ccd8a865f5892bdaa4be856c2364766c0814469e6e3287597033f445464cdab4a2b054f0f87e760e6fe252c616e7ad3feccd87637faf2fcd866f8fe60af6e19b8c1cc4c31d14b6df84460b6e3b4c6d9925273226d25e80814ccd5afef02d9e621ef1404e8577447056ff1eb2fbd346676d7cad49ddaa36609117bee2cd9995cf51f6d4a8417d353f2b80976696096f3fbb9dee2aedd220618fd56b6fa8c796db16cfae62065dbe6759971d109ac1c02eb940fadf1535f993e0ef74cd76a555f0d659632f2909c24112099c33472c2303e861034444fdf5513b0d6c17bd3da8b8b14de3631139381c063acaf15a4d12472d1a402b1a6346d4dce38c35f3b6ea9af320df5f08488748406fa39280cc1b71ae65a4adb5c13d9704ffd644c7a7b03822c45b1723907ad1ad99e7db161ba9677acb43e7466df21e6874d049692308ca724c38ac21670c4dc1570ba4dc6559b42c5ddf2b1dbc60b76532e027e86656346693fd2d7c822934c097a0c46e9ac13dfe1cdf7e2e4484fd2961f5cbf2f118a959059d082ea1967d001d5aff2b152206cf74a2f940bae4fa3645998dac3851e33df4fe8c18c1d8383990cf542fdfa659e0123cab4a61ec3621b665eb84ec75110686dd4c1088c8afc1ea891c9f6bea5f5b7a47d9139986963dbeaeb38a42926197ada1d63904ac8f7e68cb38f49cfbe0351e92852efbb294caa0c2314bd8dd264fa98ccdff227617bbc4f4d89843830ca76a46a0b6f093fc089c1cb50a4e0c92278e6c1d69d05b4647b5cf344f6388ed50f633b39875baa311a9080ab7f745bb806485fd70cd886894a11ecce0344c6269d2d82bc6dd018cd03a39a7fbb98a570a2f759598701c18fa88047b9b577f9fbd6fda5231b712b16fffae7e36333982d2dac344889e6b17c14626b00a6c306e88842f1ae76ff4b95b52b7383b2fce14509a260143d5986743bf4aeac9601286fb1af080525b22c863cebaf0bf20956bbd8759e29415e0599988ef16f86973ca1083f92ed97ce4f8dba087197d510de193bdd16b2a10286f7b2ba3062dbab2bcd000aabb5609ff3cab9693297eb868310c75c72fc08626ade83dddbbdd8f27dc6a6baa2a4e031ea8b93cbd4b55297c0f94d6a4f415b2ff55c0d63d2a1468ca620eb1618d66cdad68d1b1605b521619d51cfd13f8c3fc53200d026c4c071259f8ebe16779e2e44c35f5b296ab4ce04573eb8b3f23e61fe9ca9b5ab82b77a9bd5b3edf0f5b698fdebd0fcc610f700cc96dcb98958a8a269fd0bf61aa97f0db81000d53acced671170c908b7145de6ebb4f24393c1436267a68f6dd2638d7ee395cfca2c71cb16eeee81516a72e9bdc2d288948ae7cc40c3d6aa169b216cdb8d745cc2860ff26c1435ace0e41ea4dffbd26d75cb14e9f02412d2c8e8669c40abf537a65699a9501112b08d4cd425448d168db7c8a01a461c7b7194c534fe143bb494de30366ef5f6c900e8fb0129a9ba0fba1d6a72ac704c22affcaaee9090fc4568ca94bf0a3b2ebbf73fbd8dbe188a075133679d5ba3ad1644020bb56b23f50a318d3ccc95930b20d2f55b90dc94b160b5ed6a04baf34abe0311d629d8a0f29a2a170b11029b995db375c6057d155a7bc820f4e4bf8e1f61ba5c3e24974e4ab8d4a6af481414161e2eb0451569306f1758630ec865b567ba1c5f274f73a880385cf688877e1f1641de656d64c4c9f4e041d51cac0669a1c06ff91ad0aafb07dad0df00380ff9a5dc36d3118bf54fe59d030860a14ba788b1d18ac885467e01e553ebca95700b30f689108477b69658c35acb5ffdef37c0862c79455a09ff4bd4fb33e0a3bfccee495247986ad4037a7374030e2ffe41aa28839fd82a0de951070aaffb3418892ef0f792be3c0e9c21f8234106d1f7454ece9d80cd53fd08c72cab15f5ab6ba85cb179b0ae40351b78c7eee6b29a89c0657397d56d4e651d53ca361c2d56cb4562beaf822e0101afaa660d566b532829b4b5e3df99b3b50352bcd3fc10b234eadd304cd99d15214cbc636665091bfc67644cde5aac2e0951764763e8736b8e0339983e95b96f08a5e0421c6b3ea61ebb6756c66a73b827e5d01202d0fe32de93d3788c6efacfd5c84f272fbbc480f05e1c6ee3c081fc72e34cf97449982889463c4b94eaa4e9ca5b4b9f62960f6479b7d4fb4cfdb8fd0969d549878e2d0cc2b2dbcdbba5896bd4ad1ecc6dadd20775ae2d1e5477888fc5c834d145414775801b8e66c8153f61db6c493a485b8f1d76fe659f0989951cd85c654e5ee8517aa517fc51681425303b32b4cff68b7942bf1fb796c7b70ee42048cf9b2660d356ef6cd6efbdcf5217c83bc39c761122b3a157050ec5a1d74b05592e75c5fdde6e70f2594ee8b18640b762b58f720b4fbdd490bebb03fd6ba72a148d19491420a67c398000f83b4af0f182b1ea8d0428791304e57311fc0232256f1ab657d96ca2975e11add283f03e131113d8bf18a2844e5fe52715bb3db8725c53cfc7ca8258bf76fa103ff3248db168e30568fd092c775f5ca0cf5ebf6687be7e8aaef5d7c0a574f4e891dc453c5f5fb68c2ff9d1d8718b3007f2a2601a7686180c4093a383a6711b48b08e2e1c0b4f1077fc24bd5ce86e75e6a8a228f12c58e0f9eaa82cc7635efe665d34df8b5ee6ccf0302430c5a7a8482061694dd61179bf1b928ce8dabbf9c0527a8fdceab465fca939254b3b6f440626e1f137e857f158798b7fa4afa4d5b8a2e2a1411e211b4a053feb041908b80ac8129832ce85b1aa24213363eacb36c56d36aa08ccb20ae847a5c06e8d262aee349d970df85751a97744faa1e6883a7bb6f791234ce67f467ffe2bcc30aa21ff3120fbc3541135a3fddccdf058aecdc87aeea6d05f91882aad000d6c5d9d97a2c4bf2932c0657b5a4ee6c59282169c43615a7e15795c47e64526ecb26b36be03f403ac946cd6ed65d6ca6c69452ff44ae44a9ea8c4111bdd89eda315d030d0d5a7d2c07f80bca62503f423cb80b0b963390c3526e2db3adb01056506beded03ca8d585d58e4505f2adce2610e544ee3d9198d6a7227fcf16c15c7c1b488b3c7e54b8256c345c3daa8a4d9fe56314e675bc4c1305a670c1174128d908b0f6fc6d6e2c87775dd9fc14a56d66424a63619d6411be2378d91bb3a9043cdf63431adc7e60296958f97793eed1615852d30efe61110c8d9cd5c27e8ebb0b79c5b5aa9d59b255a89824d18259f5665e4af783b3d84e5d3321f63db20a6a4acd19bfe8afe0b387bf27692c8269cafeaf2eb635312ba7c0dafae0bfad48464887b8818a1d597cdf8be92ab324aa80303f628814d4610560cd8df3aea5ec357e8c227bccb072831ef7b4bb75c3d187291ac840550f37248812c73d5e0cfc260fbe8fa8d8c62e4029b9abb5c2fd92acc59c8373222d0aa97c7238173f13271c71ed699bd41d3509b9ddea23a7d8da703c78c60ce2160ddbdecb0329f21e4aa7c4f1083e242555558d2aa7fca7c2ef6b23055ef6d6458e3cba7542ce917cd45654c38e926a7ccbd0246a93c4865074e3125f90b277a8a94766601479929b9a86de5eed68e4f019c834af568e76f5d5350015198e5ef1584d87b5dbd80417cf4b22477329fa036c2aac4a86fa15c97c9f142819c97dd9f682863f664298829414362d787516b28daa772a0e0a84af0710c1b98a85047c33b3beea843705f9ca33d707b6d6210ceb238eaca2d6d3945a2c84c298ab07131cfa22bf97e20af094bdc6ddaac4883c5349572eb0a45e905048c52fb8c9bdb0bffabd7a03a2abbf076fd235ae0b89442f69833ecaba0d00ee4acb21e6be6abaa985110abf415e6bb58f345183c2ce116cea3b678ebccc6210aae422ba2370f17e38f749e71f88f54ce3162dcb15fcfc2632d7424332eb7d7e1c3f20e5688f8e67397c8660747c011b428ef3c2b87e378e4b23fe465a47fe8a4579044bdfcda0c0917e19236bdd45306d437b1ad13ccdd8f0fa60cc45da6892493038c5db298351b1f492fd2ccc4adf62d780a0400ed1a0730deaa8106423cde0e9d001b31850568b8fd140f7be9c466050720a219b4d52730fb2c9603b2e935a0eae6984b49b208d4a3d609f4c5e3fe7326486f87a13b6ecd87b75591096bf3b8d8f411ec71e28f81f7195fc598189b4742f3cc22907f57b7834f7869cfe8859f3d31d1d67c3512333175fea4420321271194ea8b7e19b536951032674a93e4dc1716098375b95bdcf00718a67974be723310267fb05ab7181f4b1a0f1321e91c934013d12898f6473aac4d1d920507e238671a5483be9b1286590182871827d1ad6d0000fc7f610eaad5ca98d3fb8e3b92abb1ffaf6a7840f00334eb2768c7cd18b058298587f1b1d55f2310e79d79b2fdf311acb8030b45ca2d8d0a1b0e7f19311db95ef5fd20f1ac6c34695e6d5e69f488089a4cc8d3f3c2f5ef05da43a08340946016ac18baf9af4c95dca0d4504e2a0e251a6eef7deaa6c8e087cb65885974bb27ca44c5ed8d1991f06b3b88319cfe379946bc406151549a3d605822e7ba7f9c98400a96fd59daa305e325fd991c42979fd06abccc6ed638b3d245dc1443a215dde51458e3d453e6cd1c07cce39de3d41a74eb012c1e79db7e167c64022066d4e5aead247a11e6629737c570031113a648b6418b170bd9a896d6b9dff13d22fe55e98c797ad0f5905f8ca1f20a1b20207d513880556a7dbab31e7f0bef61498f76453c4891acc046f704d02748e79d0e0695b3f972b813d200ebf91d4c3f4d990eaf1fda99e6dab61d1a73d86ef1014acb01e87dd6fb9fa2e8acfd821750da3099da5140488315699f221ec5df1a577610857bd582da9b1500283a60ddb6934545e57a32afc9074d0552fe7be639e42569c0b54e6e98547767ea3d27dfa0980649da086c5447113c47df859c77e0688bd47f35c3bfdee4f28ca554b8d49646090fefd07f0b9a2154bdfee638ee8619d57f2e2a0d5725c6173b0ee4045ae7b67aae5c7273dcb84da980e3b653ff484d3a4f5e4dedd0ab127a9d21209a01e2f53204a9383b6b6d459487fa53f83eaa2c01991da43ca0e00be6d0576978ac81fb209e816f0c314206bf43bc061cbf843a8b2d56322b6f08dc78279baec3d7df211d162446d95e0196e444cf7db80d65820bc80ef4e265148e91f02b9abe815df741efd1ee3a326d0e36b4b2184d5d330ab21ffefd65cda8354bc94e7f5ea990c571d97058474bf8da406e0404210c8ab5f1e312acab67b5a63f47b37d64bae618a6eaa1191dae5bc2a40759c3f20da46d1461e1a4bb12d65546553001056367aa5ce114d11e36fae178b2980c70e51856b433a5c847bc94b8615cf616f3de2ce8f2a92c19ddd35373c898074b8ce930631ed22d51039ddfeb598a807abb4a0cd93128efe8a144880a80834b37b5414ca9fe6cf967496a9ce5ed60adb6bf12b5938f5a552845f6a6167a722a9482c0f0956fae929051314de902785bbedd12817957571b7fb3cbc6c9b93e853c2850c73e2c46cf41b97314f69083f9ac312fb6077967ade358f572f02eb5f9e96911e15a62c813dee74eddcd575618d106bb39d69f129b9ee6c9d8a6cf8a8f58d17226702b9f77b2aec956a1f6d8ee9b3be0c0910baafc4542496588b163f19a684d93ca23cdb1c74215411bfda45f3aca2f33c59c32304aa33b718c714f245ee036260d32160f1c46c67894310643d0a17b28e43f4d23ab20a13dbf969fb9afa13de52594edd3a7f097bf7d3af391ab447b5a545c4e463fd718cb320bce35e9a55854d4df4fa41daedfe3689ee6bfef66077f9d5a6383dc62bb839219920689ba38b7911e0c4b4751941474af1b5ba2758ac1b539c9165da19c9f4aa47169e8bfa16b77967e3bda250120c4956c4da899cef70594d70197978fd385073808b7500264e16007bad9cb7eb50d50eaf65370154095ed28b9c94df3b6fd9c85c0c51413905e54a256ee823da0d8e4ab4d0b3aecb59efbf720922cf25ca3a7339c8c2ab54acfc5c94b806f06bf9b54a912963af890a0bdd0b590a480ff2904c30399ff4412cb88d8f90674a0f4056e3f94dc39feec7970c03abb21f93c92f7c07ca257ca731db009bfa8df5fa42d894376995699662f81e4068a076d854cba92497f5c7970b9972ee819d259640c584f6947e94bf0198f540fddfa87c429ebda2a2fa23a9d4a74a7e5d25e1988b3c0115149feca32190aed94bfd39ce25c838ca4add03d29806b819a858c95cc9d2219c909c3863f1dea47dceba50aa43db32515d1b5ea6ae50db19fc110b909224a6f22de7952a3f2fae75b52189058b039da1fddc60dbfb6f41207c0aaf5ee32e2255014669afa25fa47f7936b60c5903ec8d9da1b917e943a617e821ddb6a60cff22e62af242bc46eabe084c3e338f672309999bb146bccd614fa1249dd4f9c062581ad4c5881e506faacaf2985a591bdf07345f6d2004ed7c5f13a385e0f77d7e17a2ddc5d87e3f570750daed787db75385e1f6ed7305ce9f5849f40ac6d6cb186db35b8bd1e4ed7e1f25ab85d0fd7ebe1743d5caf85db7570bc1eeeaec3f55ab8bb8ee148af97b897fbdb7c30a73a35202915522abfbce941506d391ae59a68b8d507ade135ed6b546ee5388a17164b83bec2b01262984ab355305ca26e86b0b95d93d4d624ee26a17948c3fe18369af1200f49625717dcac4ee28468a7fcbf9b5f951e4baf021eeaa6ca3cde611bd2896cb3ad005341736bfe9807e699ff66743d9bf972f0fcb6933e6c01bbe03f03074ab3b6bafffdfc774838db79d798fcb0a48bf596e8cb68e970e652094c0c229fdda27cace90368eca54c45d276c5b06e4b64bdaa5bef51f3e668ccdea9f5fb0de71c6b549effa1d10905f7e70a57208ad0eeb70af3de577692db89847b1b6bdc59b4c6b2f3396e9d39716789edde46fb4efff1e5aa252d12f2083fe8e50261cf856a5bc3de04e2c00fb16ae6c539d1e5ad3914af115ea94f2074ce630f82516e69a9d2f625b2c1b7a6d2182e9cdaa897a8feb8c0b9465418d5d1a61667d2a392eb0a0e923ee3964202f8ee128e74db927c9347003feeaa1d1a46ee9a63283b0f9dcc07f0b62ab35cf3e9c635aad357da05ce10c02b7f00e0c86228cea58394a04f480369d694350b0c20cd093610d8393af73cd085ae53c72a170a71c8b99b9503403e3eb0523b785e42c0d2b1b039dacbc9595a650c37036f951f7ed094f5fe33de28f62ac808867162c8b81f4b441f179a61af4437ea8e1a6bec1616bcd5295cf86f52f5d288eae2136569af34318f3cfc927aa7814503e39f9b9a5f13cf156fb08c716999f621065dac9cfafee03b1d4f05f1426c476650a6eb4319b858f24765cb1662bcba2539a98530d63c79d19d0e00b150bddf25f2d274e7421851ae6d3c4d2fd1095e4c3f79b9fcc96314aa2e3598c4117fb59a8f7a58cf2ea75fe7c900a3f3aaa910eb85b69c885163bd1303d2b34ae42ed70b42980420f496979552b2370f9a634d2bda5e2bae40d7cb34fb69b9dbf4fca6f641d2a016d215356551f5915163dbe7fbcdfec8f02819c611a295afc76b115b6ec1163e5e3f5184f2cd60b4156c065b23e3eb857a79351bd6c39e411f342da7ba6146b54b678934bf1491a896c75df524f42db0c3802fd87b4833991ec6e133088d55c79dd59169fae16580de480450cbffe34282e5cbcf9ac92e8c40ee0cbe30633c0df9529f8f9c50f1ad895ee9a0ee97f8e34b1de6d7c725626d1cfb1ed9fbe76f7a21554d04069a8856d0edbcb2f0e2a8d4525aca9005e4016baba11d199a6b54ba1cd7c5aee44441a73042e649a5353769c0bd3119ac196ff3551799344bfcab0d62363ba833f07cf4c629d2a0e3971523acab57bab6cd83ddd704f7c99b5784d369f91060b003f80721e15ac911fcd3391bfdc211ebbaabdc5b4caff5b80b7a535b81d9d0b9c815c4d954d8657bcdc047a98ac0ff8fc14c09aef01623ae71114cfa4c6192ed168ed5a9174b1fe93e5ee6fdcc5558c8b13e388ad814f4c7d28397cf55a546551e603f12e0bfd816ef42c2c821e95b943a60aa36e706e0829e08568b4042d16c4682c7c4bbc82d8e7052fa0973bab9c1c29e2af709958a6e350e1a2dad95d59bc698d72149f5f9403b45db3b2cb984227ca425ef3eba87cd0324f12790e08c5b2d2e2e64daee376dc4b879a6a75887f1c34ef8b59abc3cdb647071ee6c0adaa3a42a9b2a2b5f8ff19086aa88855008bc19ff6607f41e31badd0f6a3fc47cf0b25b287eb75fa01ce2ab5bb4812e2d9fd9abbae1822fd593e8d2d4e43a114f622f632cf4638477d0a57c17b9c65c6b9758075bc66fc047f922d87d8418262c349d6dd81e417c619af21dc0427d25e4d460954d8d18bee710410560ac4e80d1261db1b336d936061800c71ab770d4044a7a806cb1c44aae021e1c91512d7e7009a64604911216f8076fd850c2013c077668bf5dcab8afe9be8dc311bbafd4de580d44edc58998dfaef18a7016b87e799704ad02636ce114e0d090624ded06017cb3c132acc88269af8e546be56684f1dec469b3ab3d6cf62b54fc6e322b4489e7a517c493ea7bb37667ca020dbadb3768e766e82107bfeb12a98694c94193d449c51ace02c978df962d4db64aea2d75c7ec91c94e6ed8f19d0b312c22738d32dfa4b33b380db8887176651db26ebe1ae23aa494c7300809897b2f0580aaf6824ceb205e47626ef710e98aa1ca9610cdadef77eaa2266273f4cc78d827ee33593d7f53c3b0826537b4930ab292c9b21793e6c16c6e193318f15c332792f3de5a36db89d7d1e8be3a8d6108441023f0dfc8ecd6636e8e20f0870a3fcd1ecf9512c7bcf044bdb48c028a3c15814f37e6c2cce5a768b2431dd7961d07e00b78c69af025d8a5b107313acd8d7226bc2576753ac8855ade571a293234225ad5af0cc691e00023b50aa311a57f8c25a067413aa8caaabc5dfae888d916b331c8195082faff6467640c07550a6ba03c53c1912d2c99943aaba3710dcb87d46332800951cd80e05baeb3dd027e8bea1b378bf66aeaea19a7709327dcfabb5dabbd48a4c76e17a7d019d6b6c2815e4ff014b30119b6b548dd4639fc332bc5df7fe9f9506b0e2af003222ecea15dd03cd77ee2e897d9cc1f6db14dcf45e46cccaeca43b69712c51eecd8593cc81ea45eae1d558c9614bbfbdcfff803ae3e0271de025ab30aab1fc8d02c50de285da8f9ee167040ea3574d7606246f2c425862e461792afc8c339cd9c7cc4a0b05b3156e4a6c979aa9be50f013da301267146292c565373c52e9358ed2f8f974d999d875a82649f2803360d1c14c92a9bcddd4b9faa805fc25b2d469e77f6438844905e143b20aa42bd9e8eed514848215634e65b007a86deb1c1271fbb224e9e234c4bc0d1ea0f37dbb241bbe76a24daa4b954e28d1295d6941e9f84c0660b478f361622e4e391bd8bc919ea64902e7b40ad9e428dcfb90b90c2f1064e4af970f41d978bbeb359ae5090148d0a10127056fc15cba2da67ca7a7e6cc1ab092a24508b5259475467c0dac42d467bae53efbce94d3a0e332ca627883af57a64f46e651361dd439172717ad74808b1a0a7f0f18386719c509bce8525df375c59a2bfd824b95bc391b5c2fc7d5d017861b7a5a43561d3ea928a34108d8dfc3952a072b8921dd2c014857b9f856d6d23b01b25b30273448b25daf3a1458b667e6496eb9b921038af85054118d051440d9f97566849405aa930ed0a37aae6ea00590d7a6e807b2b6c078a59b44f8a36eb448d85852b2d7e3dc36c2da666c1bc885a641504292404ac55325cc840325b9ba928724ca6a00952935231d624fbeda652dca1e6e3add850462c52b989f53023562f3bb1737418ddb1c547e27d23f8ad07641ba5f6e83b575d9b906f3ff4dd7f48c3e4a0b5f05db52af3fc401b19dbb0ced35dd92e934db6017d5abb49fad46537838e8321e22f0ea12ffd6d9506b44ee76bb6c8d77221421c1bb2ac41fbea1287da456f67c20238e2a8d6f076ae6da1f5f07f150f1d600ed4696b8725da1e23dfe26aa59b8da674e8f94806d3071b1646498bb37ba905500c62821911ba370028ba8093effac43f4c574ffd9b9e0035e7659df4011da1d922457b72ee8927ef9b7a180af364f9fd006785a9193d5d24cd0ca595a44d40fd904c4a8f76a8de23a61a28c147e3c4f011e9db3b13cea66fc778dff9dddebe2485c9348c77f16b67b68673e23d80c85eda4aa1743a0696360479b5aea54dc63950a59d93e3b87581e62713d528abed09f7d8e62269ca8f4839f0e7c66266defec9de6c0b312157280588e649de28d5de7953228a347d11531c741d712d35b5ad1e11bd9b41e2fbc09a44eb4bd763d5bf0d6a33ad12d6fd39b4878d98a440642abb6c3fbbbcf1de2c9016ad9da9b9eafd4360025334b3243612529efb735ad89d4c2d35542ac87a9c716d3b7fdccebf9c4dfd2f768ab24cbc8b6100edb187b30a189379e9fa32221061c9c474b39e92129c77da161be4531ac76ab5bdca38552a407568e7bb7b1aecef1109683821aa25a415056e309ec2a02baf74f29428c6961bdfe13de20f2e66264ff632159f7a7ff8c452cf61db98e8d91fbb5cf6e27d503c758aebf2e95d0c7de1016dd5a063ea90592629fa7b5fafdd423ba63a9df5bcf77234aa05e73d78be77322d5f618b6df1b65ea9074fa21004cd00d1c796de3fc33d04904d3c1883c0541bd0aa01f6e3f1743c4bfd5022272b8da5c5fbd4508d2992b94a4fd7942d801b954fa5d49f984c9d27f1adb6ff964d9b6626bca0539570de280ad4bea4789dc3bfe9c92a3eb75b90198cc8c7ff29e1a015eb01836a60d7a92a2d3dd2e053f48027e942137e634f0ba8aae873a8ec5f74cf54ddf7dfb37cd451e2d9afc9bd8f1b1af0ab1cc537d100e618857a2c92d53ca4e84dd832be10ee6dc1034afdf8ff6e834e212136771cf520498fafbc68ea5595c7b8c766724269756ceb22db3db3f107006e34cef363986ba747b5e92dfea0cad3fa1086eef118179d9df11d03cd83c935637236ad72a012cd4ec892200169ee0ed361557e80631557e9f1aacd4411fde33e1fe631560ce858daf3d9856a1eac23043af98f5dbb54563ddb379e3c808e77354f7425641ef40b4d3fdee4e3ddb4f70cd526b50f68bdff4d44168301e84d22557a948598be36f3b629766f800338520d47698c761e594314a19d4560ba83d5008850cbcad4a52b01cadc2fb4393b1593c40cacc72b640f2c952402644e7537cff7db9239b6487c4fd189b6f16695e164ad69103e03e312f98216640397e13722bb0002d62bd73749a3e3321f84b600707579f8242784c679bcd70b21d6ba2fb91b0263098c3cb390bce8793f576b581e4cfb61153e2fcc8d1deaea977fd11b17964c301e2a302bb4a0e53b1f7090154c07c2ee57a35874389a6ebecae94831ee66f62a2c021369f24d97477916a3675cd16da272722a775e86daac8880fea678100278a734847e925708fc80d41a2ce02e78ebd474f4b5523a13b78b3f0665e9be8484b1dc43120d848aaad60f1482c706967d309ed96c59478398b5eb8c45668a8f799b8b854abf8e144cdc6dd8acef28106ef42078c44ee974df1e60964f8f06cd2ca133faade73ba1344eb23e112a5ecc4b8e4e749cac2575e7c96458a4fe3ed7db9c4cb46b36c1c0cb3d8cc97259e0572dd82a832306aa0564a036d62f5abc3c49112f7ead1d32191ecf9ae2900f09b724e9a6195bf90fd1e5957bfb9ded7f3ac9fd1af46ca1a5b05e7dcc2499ce29c3f234f4698653bdbc26b277ad45262f1cd7f5945f5ed6fbd54d95f8bbd36788bb8c2d1da5c80e00ca6152ff3ad9f758fff0fab3d78609ede343330f785aaa0f231bcfed05d419238136cc9a8f15cf020a5c6def35e330057a25f381d693710b7a17e83695f30081bdf1d9e2a6ac2cdc933545f8f66e4577a5cf56aa36a08bb34ac8c67c0d31123ab68a0347e8c9de3d8b4edce3fdc0165b34259827cb9a94979377fb32d57f559a65870ffd882fd39972ad56ae39f16088272b8f9543a8fa591d9027bcd64ffa847c6229d28dfe075e412206217dbaba4f8eacb0edd4699110213c22e05bf470422472ed9cc485e35db0710479f367bb06be268e77b40cd24cc6da31ad9ec613e2543ff5317a0fec69763be626f501cba834fe09efd8c3c495959650936a993014b9c5ca613c3ad59206db29c61e0eec53b4c16038f005f43a6846360671bcfd647af896935a5e9e4b9d63617cf9c8763fae5c72af497a44d6de499e628dd00ea17fef46d48a55432dcf6f644c4021cd304f8557e9c26a6cb9ea485b8db126d79bb69d4e3593fd55dd3560f1fd830a673d1f1f0b7b0654e125478da3c8629e9d7a6b17a2087da34f6c9bc61bb9e7497ddabfbcc1f2d18b44f34bdff54ffb8a9a5711a34114b1284956797cec4c8b4523189adbb8a2d71182aed56fdf720eca4bd6b9688281820da05b1abfad81c4783c2d2bfcd35fd0565b5e8a884ba3cde99d793f803f97526a5abb9b7c51ab1eaec84310acb69229590ec3c0a5a754063dd3d3c85188aef5bc6709b492416bedd0fe2d101663a51b2b5e4670263798bc065abfc204a96d8d81b8a5d2eb14b6871ceafa15016110142bff098055f94ed2cec5148136d3fc62bca8a86b2ed98477afc61ee9e35c125d03b168919bc82ed9af2a83bf2281b28406ae8facf11219ba402d47964a578d6a0988f0b9c46f9da32f952f06cac743febc54139a6b2cdc45d4b166bd8716108a149f86e86e00cbfbd5402f563acb8e97d21ae06a6ed0a30ab6da26fb895b12f0455be569b7c152c1bac686ba4c35e382ee5b157008361c97216b6aeaed8bcb3ff8954c6407265f28564b860f543fc95b6a16763467e99f86088ac62dad9566fe5e5c376cf7c7e340dc4dfdfbb4ffa68226fa382220a5b40db8e9de900fb4a58a846184c0a289ef1b64c03ca0c539c063439f2c8fc84f1c9d89905dae5ead4d6d4162c43d8394aa194db1375b3d20e0f4be413e0855fd4b274e45fe0b7151468f163e47701331b65c57231bb2960124ecef24ca0881244208720dce39c2b5e20a987c532b6253e50387b06a75bc5973c92056264429a9d08f89bd746083378e0119a3d9d9b3d3c2a596a5674b190b120dfc5e4a87b31d4303ca7fd291ea5bd9e49cbc86cebeca408c194cf305c03b294db433cdae2cba4c97a9b472510eb1be0419a8a144969df5bdb2276d6adb0e9953dd54dd818e0b2f897104e998936d8b327eb07cada9c79fa352326745df951e489f7af21e4faee20da49380bf8a144fb6e20e81ee305119b33399f656968697aeb83d7ef8876b172fdda180c931a489b0a392109695bd7f1a45f241c16a1a8dbce705c5e5f315556023d8fe2f4a9e83655050386a1abcc9b60f93018ca47dca4801243c8f9323a0d074f400321c3c6ffa41b4c60c50ea6fcb5710653611020ee5de57558549d366a0c58fd3dbfddefa80a0318a252386f4028fcabab7ec78c9260894f4ab943445b240845bf2919ae25125ef5a3e1c14f5c189ba93d1994c9232d6a56feb20c868c09c7258b711f2d4c2864d166d218007beda9574fe34d0c3f843023095e81156eaf47bb2a4d072d67224a10763bc8c089cfbc0e0457206a87f886a6e6a641e8595b0e411bf5f5e2376352d045fab3c0dea1e98c984f2803913131740684c1d583151282272a73a44d911e07a1ccd492188eaa409b721a56d4e04e4269b159adb199201aad345298977bb91666f0b711a05f0b982517837d5819527850522f01218792948640af7300136160fec7ebea34d025e027dd49d83529426d39ef4e200c8b83d75cd679c69e9c2a57324abc7f61423184bca43b221184d334e693ff79d227db2759f1b0e56c82404896f15b38f4eae6004260020b43cdca630c98cab961186efd1bd092f2567baf0a3aa25f9a6e30c15601071b6292db6ee8210c3cb83362a19d103b2aaacf17bbed3da2b08b23357b7102d389e0295d1aeff09224da2ce412e4e1015a8b4202410d5c43ad5f58153996db9e8fd082135e0e7fe9bfcc320813b426ef324ea97a1dc3240c87d8a8605424039664e6de0402035f7ae5f300ad5d235acc85266f7337b859b6a8edad2e9eb274fffaaed740bf0ae50df4f395b61ae763624b4b2ad3c27bfd42490d82eed52dfefa97a603ca9a242be32875b71f286c516b937f7d18d2d2b6852045b1f68edff068a0a46fa651a9122d544a06b0b13355a9f414a32fb7adb21bf82b8c596e2b130cfaf72f82f2b3af9facc887d7cd370b8e7445474fe46142180e7c51222a47545810a0c28bf3e0b850503374ac65d5362f77a043ebd3be23e9085759041a45036efaf26c2b24d2a16e304e75092b8625c473f33a68e18271e57687eca2770a2d3fe9c3c1d404e1a1437dcc8802d7558a5a4ddf097514d9d4958639fadc02e2a7a05213f0971fe99ce8871648fe867f675cc1e9b9ed967e20e6b8f2f21b401faf58a1b805e74b225be39747e6f28c05252ed33a31b4b36c83a2218b281261d1df85c36dde09ebcc83f0e8aa6262ef74bdef31080839d16612006e73d6254ffa9cec2edb967105d64af108ad41e5d341c828786728c52d208ce66f873f1ea5418546bf7c79f452bc183eebd91104355fc335fc07c470450fbd1c545bcd3974c845c8a911588f993cf1728c467653662665f465871881fd0c81dd05c6a65ca378469b1a0091e6d8d0c2a22360ca6e7d7ca803b07bd03c1c8908b991a9d6a8cb4ead290ee5ae30514c7a70075ea7bdf85c00ae3431f26dc03500e7672fa8223cc36fdb0048c7a65a22a5d6d8470c7f4a54b3c9fda7f8651f52c737ccd1499b7988dfc8aa22019808a01e44d41b256b402625ebc53c9c747f28e948e1ca851596ba8fde04a0585ea97824aaab03cdb6f0c48edddeb2aced8df794d6d127bc999bd8aad2ec5904ac00f41be4c0b0688995db709ecb7b2b214dbe1184ea770bea047f277e26ee95d5fa9157044ce3e2a4f1358ea8645efec448f923eb3e54eed89f4705c91d2f23b875660ede259c5acab66d86d71362f451f0f066b65d936291d3838275df33cbcfec4b7a263cfecd9bbe7a58b1e5c83d26920478655a42665be990ea6a3a37ee53173cfd20fe932f89dc40f35d28a95f2f025fa54712a5a2c5d2c8a7ea1181de6b877c8262bfbf38474a346e7a6130d3e6acd73a3b5ab50e4c477ddba044c8a42c6c37ad5013e16134154b544e25441067609e1f18b550df7310d12c84ff8807a9404647dfa584e81a9f068416181da56a0d30904d9c3a55ab854bb3d1e346bfeb97143eb5c4f685e1fe9dd4e0e48624592c0f53855184b68a6da948b20c0d55a20e97d65ac2180f965abdf0f9ac530f9cca89440cd34d2a995bbf209ce9904ed53adb0f7ead22b93e078a8f799c795da22fc09586b6a368a988001500441a217628c3b35ec65c5a48d2480cc89d66ab048248949497f31df65215913533daa0bc8fe18acaec25043a748b54d911c96124b3ed495d2325eb092cf7d002388d31a108d3118be298c1d741de160de5630b88a82208ff0e7dcfac07c9dbf5b5242104488d55e977c67fd80f05d64acc9c64b1cbc58e45f1643053e99404d40df0797b3434f5706445ad7c24056431c8b18c381332db456d89d9bf4cbd18bc1c4cae21c26b993c24d7c9770ff1b18788484a390b6ae158e5a103089ff2588f2db8fa9a434bbfd11ad764465a152587b18294dc67613f78478161bd89310c4dfa30859932425c1cbc07e6f30c298b1e929f743d761758d0a39eb0b53bde7cb508b6d7d986bc94e79d288a59e4fd538408d058d795b41634b7c7f886c304d2ae05c2cb2502ab34102379fe042db49bb7afaa60d2c8da2c7daab58870e8334ea2286be5162b3e450174ce07f668335365875df7a1f3b972c018187e0178245123c5a64a7f80295e3e54fdc10fe8affd5d244372cbda70e0e95eabafa60ec75b72a98d777a5a69b06c7cc0cbd5fac2fb5faf92650d08e1314ac55306bd9f3aec437158fb253e1510367edf03f6cb98836cf9c79be1ce2685a49e12182e61abfae8c6f627a93570914b753bcedf367ed4bc9ac11dc5ac2b9dba4f73c3ef3756dd8db15954a4f5f89ef861cde9f0957c6bd289f29554fa7648d8315a7c2ca6195c65233b773e6ef2369a7ac4bebf5b84726c9cd1f40d586b4383a812463687d675d0f646a79645701758be0623a4174157c60a2721ed61c05a65f58ba14c7757a197b5921cfbd718a57e9c45fcbf39b0995e404e33e2f07568d590d7286f2c969c86a7550376e3c6b0d7f9fe9fc9d2c35cdaaafb078d4b0889dd855284e9dfa5e04efe4f40f1a206c0bc9588335f8be7e4656b0c82c08e6ddbc2cc3a57ce484d9c15399feaff074cd421367f5a4724c01b081b7ba899379a8c43d6fa7488165750ec840632bfe020277c3e257d8caeea6a6caad40d21ad554027a0c2829d3716f24a651addc1b9bddb846c5c9dbd06714ea3d6dfb35b905a660fa5ffb3e11bc830d34ce5c910455fbe7619d226b5661a3fae5e8b1c981380bd14db352c4fb0addfb0ee9fc5262f268a105ad9efde20a63d7742d62f2081065f96c9c8498f70d8cf744f60dec1a1a6c0203f8b6c0fe0f55aeb7bd650e33f55852d68aca6d57170b80655aefa424614f70e2c2b4be62c17c8d90a2c1c6668736f6769bc5421753d98132588a309a2c0fe745ac9473005ff9bf5056497840aba983a855016cee30ea245a9bbf6b37f45ba137be5174de4bc430d71e847f4aa2d7b1af0f65e33563f6b4a1230fec6aba7b8b8b8fffd614b3e2129b5c597a7767dc669e405c10ee208d4942420a8ff7a55d474bfbdb39a8179acddb625ffdb6460d1d842e2b7aef32ec742caa558c9a8e8eaaec4ef1741bf6171c8f2c2e91ffef1bc5976e0903d1e8b9c160dd91af996c69ff33221474c808a4ae41c965b039a547ac6ae3db9c2dce395a2e6ba8e91093979608059efbc6c8c395770885c5194a98f47ea2ded5d37ec1b8a82b07f4639eea693b37584e64ad342f644c0e7d3d97e04f04454387b983128132ee4e733c6c44f18e3b878b47e61b670c3ce249e2235a8232793a78d69ef55b796d64d3b980e93ea92734cb5fdfcfb19c05bcded65224f3edde9aa864330e901801742d16d3ddeede70b3914f167f8be78af62b0660d639223feaf867d3dcf7271dffbd65c3ba2f9179a86cec991d3e650b9a32009ff0e0b3e7a70609c6a318a0cc3fda53bd5e72920d489dd5c84842ba6039af8ab3dea7292ea557c8a2af28cbfc35882f93ae74e4593cd3d07e1e01c4e8634a42f28edd617265d0538ef8eba12c17a75ae82ef9c1e098d5c0113b632bef4be1dd57bb8e1b9a1d7be5ec609d4ba611343c31eb59bd57ae7e3f7a7d6c5e1f28b6dca1403c39390a98d62cd4c1992205cd8b0d19f91c8e6f0deabb622c8450aac01252e88a2519e2561386370604c2be9836eef56e0fe6c96e5f1b0281454392a8dc51d25921a8e3ae35d239a0ed96514d97460b254575fa7d3128143f022faa098917193d88a8f5f5b88c8dbf402072e711007369d794a5285c0569cb586c7d8f7dd77f6e471f875ea373205384a2375576a41da9d7661eba9aef88e189e60921927b1549c3c89dcde33c706ad28558d5d70a4bdf603e0b41969ac9414ada9cd0510940e76df40f69e989a980b128710d94aa620a79078c7e9f81e497642aefacbcfde9310afe1d9284b3a67955b4a82509c20ab545750165aedf1e008c99be1158b9c4dde744819c22415e410fbed329244ee0bfa507a331c92240176a217c0b4c6a1add848913dd2e34827c9a3afe57c2d8d1e9c99a89465def68d758a8be050a627177adf383c9d3ffaab33ef3bd2b4b6120c524378f6a75aadf0995a279bbd46d7bfc1c6610b998b6472e215cbbb9e978c180beca944c13bc679e4f26643fb3fc2835a1a2f1286cf379703d5447696caaab312ceb43d28c61030b081fe06cf983dbc705228fc30a58aa7cfd91eb262953cb7110f050860be95129dd47e54ea16de6ee043a30d020b46c12008c85a3111c8cad9f40ab084a8641d470fab4dcdc3900a76c2e95e8cf004c2f24134b80a521f5eb9ac255e8a1e7fbc2821329995c8f508dd41ed943cf5b09c6bdd09cf3444ce674dda20b0a14236c6ee2442810703f0c629dc8efda44d1eb70c9a706b40620317bb3681c5642766c688ada6cb545a1ea2a0f17390e046db9747fbdf89c12fdafab35e86f3adbb20f5ebdf91e760e337785089bc460b241d50b02c9451b12bb25b289eb6130c94baa477df324690769a8fe3e98aafc2d1fe5d8e9b947059e241983d82cd9d15ebd577d0771515032572d5edd835bce4b8a7639a4849dfad3d191af8e6a65486cf0ac7572a927cacc75a22647db76722016a90a3d6c9de8a7d8d14cdeeb3bd47d42ab0b0e4f96233e36f56d8ba0a9d4d7a0ea8c23d3c5fadc3bf102dcfa7a60b2bbcd70c1105c42650d3dda350bb792267ab5c851bcf6d7e6b0b273df0e03dabeddb4cd50d981f8ce6fc0366c7627e194eee2f27271ef4c3119261b6968294e4ebc02a7920c13fcd6b1c1b7d828810e137364ad5d2e69a2e87e800cb833a1a3d107d543724d8ffa1452091ea6c8c627b816f5420940aabb8c118c3d54ab71528238ec23e1700515e9b1112a386de15bc54e97b31efca274e975c97de9f64265152973c742201171a7c817fbd14f5d678e5608013a6bbb54911c63160d9f3b6a4b5e4b909355c60725049745ce7419f09c321e36da0e30f464f5e68d4f326e6538784aa33db9e2a1d0664f2aae9a95966d82c172169016ca06b5ffe6850a7921a379d8e04acc47764c935e8bfb28cdef4f84b3be62b7744ccf4628a2c7836a7f95d3cf017ed467350d2b0717cf395fbc4e1db8c0fd3f97e8265e067377484e51ea0fffe0a20c6f33eb14b28fb4310721597c4e140fc149f28c978fa130ac8fb83f34c64187165247c057a458ff53516838a958b02031da9b6c063df07a9ac2012f8e230cb8d85aa5f2f57fdc92db32d50413503033632176099aac1a75d179ff0463227eb8e9a4ecfa59003c6c96421fe23e734c75cfe4d65043405b242a675a4398f8348a163c34608910687f586a58723a98e857a7e2fd00dd49f4166ee228133deb1035ea93ef8a8410c0541c4ba92e14135f201d2098dfd5d32689c922a7008ac5e06c5e5f89205f5fea6e7a47ddebab93d25b0a294a2a8b551f191f25f1656cef89da04ac4af11266b14f4519762810bcadf005c5a67dd72c607a08e81e49d807133d3478d1caca7c492248aa22d784a0a62f12636790a6a38bdf70611d62a22ecb0b9176920b703aa79135859b5e5c7f37a1f1d3f0b998740294771ac6336e29bf384c4f64ae000fac6be542ff6e5278f98d1e174d050c942145517cc6ef4345e81d421489bf4d426559d81da7839fe0fde731663f232dbb86a0538a60a4947c315398b5a1497320ba17c2c9dbdda77274d2e820ba34ba9ec9a8b5f7f2c7b902382a633cf13e0a24dad92544a00c5497f0b8a29661dd5e215b2e578804839898d1183c6b9ca7b1326933c47201cd93059c54978ec3445008b542634fc213a752f006551f58fc515dabe672b001944ce6a485e000f38a6fc4f9d55a19fb4c113ab4f07473d0d92797cf7a1818b318b010bb5efd989c50df14d1f3f0a4cd1b77150c8392c10a899c5f890ed18e7120d15cf1011d6de1a14006ef0c95eaf8960f8317e442c8d45f013ad76c3c299c26b7cf8f7f9a0fa96fe9fcf0740a2740b47808e244fd39fb8f19a20bddb02e601f9244c09d3ba0db1936186159cbe4c955614213b8fa2bc895d0d5136351f702d2394d54083da1cb9f719d3fe37cfd32e78e696ae2045963cef704ca219fcdf109e8fdc9b339d97a3f49d4474c984132713048d9650b92bc2b6e249c2069518f2d9650a16a06632498bfb35daac27a80f76b0f409491f885d8a4edf09cdfc10a218426cc7842c60bfe34365f8ebf6767815e24cbfa436bbbbc1e7598dfc54e17643f60bb61b07c764364aa1a7cd795b20c6ad9b71ffd17173610f78ae5914aa3b9e5c8e36156e9ec7e58fe7dab4630b9801d95546825c2ca61e0eee4912ed9dacba0aab367490e587a2ced5425cc8202bad72ef8403ea41d91c716eb816d8b67231e33cf55cd8bdfc0e434ae8181e722ae85b26659edd799db22dd9b4eac6efdcc45e362e9bedd717813dff102b02f18c9ce94bafc8b25817a8e92e4d55971cd96b20dff8b32ef6b37be6323e3cc3feeb7655123885eb7b5658dc571d2f33ebca0fcc6cd7f275de887ca877fd1e1fd3d749777d4a173328196a0e3758accf146d88a231df3c3f4d38314ea04ce1418e261a4ce9bfcb75906e4181778dd4bafcca77c1a9fdbfc6c711f3eb5082bd3c10bdb322e2813dfc961b0c988d721eb8a315e460e06194ece15e35f2d155206a81912fa979cdbc84f277178b131fe58cdb62a50d174a20b8d03384bf74d6265cc4c332af65d0751ab63a5771b2dd9ac6b3bf34b0bd53669682c0e35e6376f3438dc53f15ea34454ccbc3d75d6e2e9edafe4e21c4f443b82941169e3315dcb211df84bc405220ee4ab4cf773c02e32c6bc44476ef0a1cdb01a01a89cadebaacad7eb6e525fe0d661164ef21d17f013680a47652d82c03c48e2c4a5a02dfd81c1dac53cea4f1ea1278a1fd356ee6ab59e9211f15b48c64ad4dbf3bc556af5fb8c5c9b9f9ba8b8ff4dd44e9cc99239a4eac3a6c19c05a7b35bece25fc5f2b6dada7d7b6158c8a7cc5650896be191debc8dfebf0d7845bcd3bdee61831b4ef7ee24d253e3d9d2c355a69a32cd9bd63c9435add79cdad62e46cc20d30e5ef83bce3bdb4c00ba9fd723839b75d1ebe7f24a369bb94315a74bbb1b9fff2e61bd05051e05c255b21690d5b29278c03eb2262e2e754d034a2052b0a6c17a6606948d480f097b2d0be74229b448958920a058e7d1a1131395deb3a24a80a50ba0f2e67d62c092fa19232b3b216e15c209808aa95af2e26622add043a63e06e843019ce5f07ec69e6304732bca922d952fb82ab19f785e25708b6ba1c82bcffc0f21d6239a3347f74a68f4c68aab7236603037432a74aea51616759139dd6309525155450612e952456ee54356838118109105524396d1bb4a953bdae8223ba243756446784b1ded6164a875b3f0315fcf1a4c186215123f2aaee4fa1676f4b66d4844fc9139e15d69a921ee1a545ef8b217050d0b24c2ec9575302006103f4eac9400843c3742b05fe031dd6de684af74447a1bfa604f8c08de29300560d0f3a4f71510cf441672b9525202d1c9528ff9815ce63a73c2bb12470de9914c56411ae2c062b7fa83ad83810c50fca0b8f22866477ac122bd99113e9636e2c8bd2f2dfbff716041acf2627e4c9438f9615c69fca9944d66dc71db81eddee03641073126f4fa61a507e447e3cab17a69195366dce7bec3911ba9c806075d228cdeb392fe7920c3878495a47f75939885d2aa2591db9833a77b2c396248af5c24a3088d3f906868bc293111c2721bb0c9bf8c6596f72acaca94c84e2e163b95e52df99a81f38fb4ab69b89ae77e11b5256450561d1638cc6a30c9939ac504192975bf7e73c39234bc8904594e6f9dc55bc3f7994f1d531e0c51b2a83cc77cbbb5ae295b3a6ae01c840516839a1629ab4490b427499000c5a27e724da603e67b168aad68bfc2210cb73ac9497dc216bd309b9b18dfc7439834fbfc5a3e360614ba155eec2330a1c4ca0f9939c44e4c13fb5e62686389c41ebb5f5e6613efc3160392ec0f70e3fc15c04200c6b528cb95efcbcf142716783aa60c8fd57e1b15a66096866d6fe3797d89c52bd909d8c4153d402f4b81fa7e6ff7eab74cf4531b6b3ff3d533c40edc311f2ef1933b9ebebfe8d59f22a5f517255c592fcd77e48ad8605545ad618ff6407f4794f8261776ef98bb23953731af62b15daa745115f7486415c8f42122eaad9d67c54e3b8155076e1fe7be96deda3e00f09dd02d996a8168a35dd5c10b70582da3accefffc4f9e67d72f2bf742b96f033960008e2f61fd417095bfa237c5dd1a30ff41a880105c7d874a4643407de8a764897c57c40d76e2cce6c789d62be029a4edb96713075971292e0ef0cfa699b1d8de730dbd3ba082e2e91ddd4172512a5db3006d5575bc5f85964fd1b28d8d8690c0a830cfc678906de05507add26080c946edd5640ee6686be0ae69db4198280581e74c93d417a987884b1d332af4e3f63e431a5bdfe91bb68c92e6e40ad0578efc0a22f05285a40d877f81db7aa3a58aa983bfe3fd60a1303bd0aa172f54e7375855e73663bf95af10d799b43b36261888aa491502cf89e597d49e475919042eab8709a0b7d3cc626e957cbfdd02e117ecf835f184054e15c54aafdba62b02b2aba8a78e5df0df424b145fe6b6d28ae4abc987e6b3098437c7f3ca7148dc053ba4fc9e066202a78f62a5c96dc32255c4d3ef63916e302cab6081b181a6e9a3ea2b19dcdc10233317e4aac2106b8d18bc84f7ad7251d65a6fa63cc03eb83a50fd9f997fc43757e10bcd800ea4ba780b4b5cec366f14199757079c72178790f9458bddf160a1e8acfbe7542ef55a78730c3340a13d297cd4616ebc8375e653a0f33eb1afa3ae56fb1af566955fa0ffda2aad44094aac9c15107bedaa009c370c1077410a68438f29782d48cdc1397c209e1f8fa58403cca84b8eba4373f11a857416a1fa90b4791ca4c3820ff797df03527ce0e0472cd8834cd8d211b14201a1c900f910c2c4756db458678bf2667b1dd65f4aec31dea345bca26bfc43b199e07d71d6344dab65809e6adb10571b14ea389cf42c8ac6134cdaf583a2b94d5c49d7f3e0588accd8a327f1f569e55b75f01f2122713a5176c9f970827fca918c530768d2241878d6cc7c804644f76f13c86373f90726fc389e254cd14312040ee4b4e2b8a61032cc78dc9643823631f1cb150a0a4d4c2414674472405bfc58a63c4bbfac97e0d9922a5e26f98e26694ddeb8ae0218c8c4e403c81c0258b524c90f7b2526d2d02bd7929cbf8851ad6f124fbb67c76e2e09ba45492aba3a09456f82540abc09991532ce9ee762bdd646580fd2dc84e65458823670286003284db3088ccd822cef846dfdc7a1a170ed77093b34200b9b4659e9e721e1a6cedf718070c0f6573e8945e9e169c26e98f6c6f8deb1e3ab9c7e978d0f04736d422b9087cccf24ddb8b2e31818d96d858ba91f2f3ccc03c5799851d9ebb001fa01d5c4eb231880fca81737cdf0f226a2f9409e3e6ed0aa0355e1d30c30168c4818506eb8e3922264e23a149b3e9b19f032af48ee04e3df9f3c15d30b708f07b165255c8e5f8de4202f0c9bd8ffff39927ccb3fa958dec2c53a6eaa92f4fcc6934cf4447968eeeba2bb322bae410928baea2b8471e503da3fc7b5b1a4287884ffa6b0892b0d1470026a17e0b46e1402103fc930b944020e1ee44c8b63a1875b0bbe89c4409a372f3426ed3c7b8a35e5cb34a807a5ba75e88a4a77330533c367aace2cff37b925ff708bd7e24cc481870db32ac6c6d80257bb08c30fc39add7e9a34568d1510602d4c245b14e2d76c381c9be6163b082ba4f2e204b4268237d57a411150e0108616ce59c31d7c5167e1eac6bb087ff974b99f98ea4600ce8ed66baa1e66e20d38895edceb593a95bba6a124e5a5273265f8e95a82a1a3fe9fab0909c0a0543e3a212915b7a13d56d7fe67c318ddc93163d419e26a1df24aa541c141b7e148b949e1d9729e70254a1d45a1bfabb7ff715cd4ad7d62d42945db64d6e0863ce812d8416ccadc12f3368f48f76d4eb6e99ddf151f561fc8b77a22855fd7b40dc5b7ba5a1c21eae524f6f973e53274de99ae71df3257ed58b8f30208faa141bf2f6d402c0378ffbeace5d20c49266a15d146bb552c9ed1e4a771d91383b44986e7d65273d78b91dd54ced6adcc4cc19536cacf2e2639f3c5459f125843a29a50558605e7ad19001433190d8e5467c71892c8490bb6d4a069ff7cf3006f3430f07175861c085338fc5ae1e44e03e056676813451e61c5c17aeb50743f870b54cceb67b6d0da506745f7de913c380566a91e00d8560d78f0ad47961c53937a99eb923f56263e40edc846988500ad946ffd45737bcfec1cc4bf10f43345951809566bd047fce90b16f8d39eff0188f7270f38c72a94efbb0af39ea7d9361a693e4a7e8a9556bfec0e251d00d0406837a812169614a4942fd0892140a55c4aaba48c8c70ea3c3791044ef0e7e671fb3c1a7a21a881a8aeff9637cb0fd7d222994c5af492456055d2582c49fa35f02802d37b8d3d2c9a11656b3293b689f23044d9b1f3a74289c8f0a437170d4e8c75ad8ba1cc332b2c80e0dc4e5700414f629a6778e9e7dac3ff0798341103da6083a6fb2800f361c70ab9af7b6acc82c17ed0c25139f34a6233d9f9174394b2f00926fd645c9e9dd6c1ca15c3e7fed1cb54414f1669daedc3c87f408c6ebfd0e9609a10ca1f000dab6d370b27af0e927aa336dba8a3628ff83e74729f079eb2f69f35408b6936d8c5cfd1ab185aeae5e45f74b062a3d7f2d0a9dbb3ab1a6f6c8c9eb94fbca42a833b011e29c24070931e4428191feefb9d4bf68be40ecdc6ad17aa5a995a3005861ea71ef18d505f08f41799e7b815840431d1d3a0dba9d2456e9b13bfd3a9b5f9e6c6d097dc1bcdb17be0f232f9777b1295164ffe1f20886f7a6072d1e3776fba4f494ac4973b81758d75cb2617dba1e3e2f603be95f60b04ce4b7a711b31e68f0f166b85f11b0c1aab342645d9dfd39870e20854f738ca7991698f609315d7c92a985b3ee0a615434bce8d2a02a27566019679ed7514d149d3a16de0f8feedd4bd50b223ffa221f9a8c703ce409c02a26a7aa4a4115d2e87531a16e478a5344401015121b60471025b089a26da1cb9559015ed0532d61ef37779d5fdce2a8f2a9782c99c89fdc74f3b1244b10d35ccd71104e6328ac4ef0715b347c1daa5c5250ce25a58907b379355d9637516cc1a2c89a680d327529589592e17884abe09e14c829f9fd7890bfcba593537bef33f83afafaad34d5b4af497247e305c9b350a9daee700b576a11489de93f4ce23c3df93dbc8bfb37eb42812347573dce887a5dc6e7f16c886014cf3b817df8c865be9a4713c52e0d70e0c1593dde9b8a6c7f7b4adc0b797f4f860f7927e23caf6e87f1d0a01b2ab476a8cc640e921e50386b38f650e664b0e86a1009211d4b408dc4f2a6950e83a7ebf9148853fa009e2dcb5669fb366d94c38c206cc68b2dec01bdc0cc0a78a501c226fc7c5648a16f999d39709e1394a5b4a0447e58f114d4422f08be851101580a4637b7befe3f77c4929e01a0dcbadd4d766178da332459a29ffc04f8820463508207a32d20a36ec89be438368368d49e2dffc2ba1590febd35f37760230e64e596bb4bc647e8032797248f693843104871222c9a7adcd2cbc28a3e6e00037491fc0b22be7baa9bbbe85664432416c688030c0eb7c0dbcef815ca76f8790e39b5f9019d3b798b5fb996c35670fe33281c678e684b7197cd05909f47f7c2e002c72a71c6488bb0c3357fead51334c5f04f526ed2674523c0a23605210d6f73f71c092e11ffaed059e7ac6534db75c3e9c87d692e01fb25267f9dcb91feaabd0765bc04793589e364aa6da39147cf98e90c7688a17710c6ed1f4ca2996c96b9cefcc8887a4ffcfe62d6b8795058cf8e63816ec55891e419a76cb91393779da66ecd54a1fb1ac5535d73b3bc1e5e7b2fcbad43d6bff4448e55cbc3b12b036ee0947bccee3422ed508a860b6715ae358cba24a153121577d2d971124efb09ac582a33bfbec33621c0a1a359111b1443e283237161e73b60e6b0dab9a5de22a849759432dfb9edd728fa8e80d7da5368e9bc40fd0ba703765478eb6a0b2ce7b331052188fb0db63d57b6c75e28d79ba03d220fd3e095f0c2dbbebeb3fc04ea3df785ab178a2a81d52f2eaf0120d09504c2e2ed9d7e13b1606712afcf794ac534f53fd1885966eab527f9ec7b02497aa490ab34f248762c2ef1de4d9d36b8e4912b4f2e80dd6693f196459494c6d81f2f1a1628d479a1cdf60b1dd7440aa6ad76f9457cc6da829159648ca1d6af9ec7018a37046318a1231ece3d926723ad3541acab7d21525c09a2a6ca1b4f0e226efae4e5ad939de336a3bf162313a65eda52b48032a05ab45a6d1825b3291e5e2e44ad4539bbfec6b96fd439101e2cc3ccb71593d3fbe2d032310a31bac0658f6c7b722d9bf208d5e3744fb7dc005876feac082b034f65eb4182ce96751ee311271eb065b5321a706a43e787018145c31f132692b9d2319454867734c3f55131ef322512b24f7261d622dd849c065552fa9b0bd3c7558d347b74f9912122dd517f87dcb83e63acf2735a17ee45786273b5f2e57ba9b503bea3ae928c26394fde6f78ed9b27732ade761d52fb4d24a198c0a55eb175f1555a881f1cfff4787f3d2c159023905c83d03a7264bce81bbef605ffb57a6b1e467d8fd618d2466e4bec073dfe8a326cc9126ce9547625eed51fd6e5c863bfe2262ef0680102143835f7590a7bea2455fdac3ecdc2dd094adaff58a9503b31313683315c1b527c8354fd06821dedf5c8fb915c1a54f39358a48eef4706b9103e002932b20b25786059765d202049d021a468a725d4096914d3a94bba618fa011fd6feb86dcb4fb75b70bab41ab258e427d3c7180356a4c3fe7aacf61bf339a877c64cf844029bd171055be8fb67fd2c27256a9ca46a41b736178427ad4b3dc886dd98b5b407d99046089146f6267b6fb9777f07cb06cf06239195ad729665284f7c6124cad90fadca5e311015d3d376e1417f0022070a15cb34bc45ac81e1d51eb6b44cd935560d8c94524a298d77843ef6ecc4b2875f760764cf84f86616e3cbd93dcddd6957bbcfd14857032ac811ea7eac62d72366ad23045e7210f10d86dcbd6fa18fdc8ff36b95bd69488c6fc1223efe8ba74f7c2537df987b0b1cdebc9d050ebf0f87af91379008993d900425c44b9ef761c48c34aadc4f1cd3f1f552678b119bc03025c7b06378dcf92f3c2226471c0a91928be0f0871b6f94b01a24a657f5f77e2d6b7c9b9854d8478ae4c9f5b248bbf406a4a4319d18d1208a422d5de4e249f089cc172b78d2aa5aa5ce4ec453823c226d958fc843a75d7622484d37e9878fd1644a193259305eaf8b0854618031aee25fdceb02240137799ba35cbe387cc9f7218e7c1f5b76b454ae3bdaaa8bdb56196ddbcc33f99181e111f97e7297e43b41a5dc46a60f555447274495efbdf7def89923184e205e4cef487cec71a287a4553102ad8affda65cad8a959c490a8c04729a594526a844a6b7dadb5d64a2965a9b5d65a69adb59ed65a6b7dadb5d65a8ff002a2300ae51e5e2094e97d681cca7caf133b3954e51e2760999eaa688b8cd194258b1859ca4b29e38a5e7bc974769bcc471f734f7a559021711a010683c16030180c0683c16030180c0683c16030180c0683c16030180ca6e9e499727b5bc163fcffa9d44f4e5e527214ea2e5c9c84e42323ffbe77dd39ee9af67b4fe92b0a874a89379a60be6474591cb9d21647ba6c2c8623b7538bb89237c992d6e8825c1a638c54d85863b97f8162d2754fb145544918f4d34661c6aa0b42812cb99e172c91db25f6b8c028cfdf206bd42eb1e7053779de1e4d9bc4493c33ede811100d60805d40ca0f0a48004600e8c3010cf002a0f4408001a4042083870000e06487194360742811122308901c503f4c7cf4e0e162c70b1c6ed0419261e4b0a186111a58e070b5be195abcb05cba1b31c8d00283c79d58565e5069c1051b9ae9ae543558a0b1a98068000316f083021280001f0e608002f44080010880870000608721303a08090224871f3e7af0d881c30d3a720e1b6aa00187ab35c30bcbe5468b0c31c0c0b2f2828a0d175a58a96ab04023c55a6badb56d5de86052aca5f194d34801adfd49c132db1fa02a8c888472408386cf0522b2d6da163a180bde1eb439393014f414d961c2da2540dc3965658f6f6564662a8063f34202e39822383838455444444541984b494743f88764e0ce28358a1489c94008c8078a548a87051b9b9b0fecc09600c1c9494d0cdc79c6502c161ba29194a4e484d74c0c144a4a908ae0e0e0144901020ab2a28fbaa88774d0d9040506d349814f8ca709172e72c099199a2496b8a9b940671843b1586c081715195d11a38454849111a222383838451e8bf5442187827ea4e8dc62c6cd0d4e0878747244d075363294949662146a6864a2143a9f524141423b403222e281a6019d7430f7b2642c2d2a3f3d3856ee056de0ce7489d800062ca0f19b871ffaf486c644560f0a78486712f090be10d05d840fdd9f439165c4011ece22033c9c4705e8d45bd6f4d03278224bda10e0e18c0de0e1f41140b7dce1a1fbb326b2244f001ece1b003c9c4becd0256f1934a463204596148279d84a3a3c9c31421ece239914a47f224b2a0179d841393ceca11ffdf6e91a1f0f1b073db1f52227b2daa6c7c3d6e1f1b0797634c9bb777078d8276899c86a9e1b1e368d8e875d937be4dd41391eca2b2cc5160ba2c86a211b1e4aa31a1e4a241afa72a893707491c86a25d743d9d37a287f66e84b9e592357e64b7b91356d580f258ecb439973a3b9b7f4dc2922cec3f0302ec520034bff01d135834eefbe10b1655a79188d5e781889543e24b2a6d05c4d1b0f630e5c3349aeccaf1ec69e161ee270c146644da519c4476c6d573dac916b7cb9ad8d5c99efa7c456c6b24673752357661fd5ede80bd4009001e00278902e5bf443d05580500284100016215d96c80730ec6cc464d90318a00076a8876971086033001b01d8ec48972dc2031876b63101e00100cf0ef66648509e19118c900e4242c07999245dd9521030ec99c5e66a1e08988354fa21956aa42b1bf251633359194e0f1b1e363b6c76a42b2b82c30ecf64653137f0e8e0c93c41d295dde4089aac4a34573608d5204483509eef24e9aa1547b7d264d559235db5ce1de9aaae566ab5d20cadf452c3025dc01b60cb4e9e35a6dec815a1c9a2443349bae8925c99978127069087055c0143d4f702187e2a423640a5c9a2311be9a24372c568b228ce8d74d1227265de85a9d402a8b402955460d89f91510a78818aa46b2a0101014da5228c31c6183736e960408c530e3e05c4f818632010cb8c8182a692154745433a985448490125d1bd9708e5ffff638c8ff1637430f847393e0afeff1f8682653e4c27053e319e2630065170673066876cccc66ccc0ec948a552a9542af5ff7faaa483792a85ffe383a1cc2930954ac9c032a730a5a1492c416f680dbdc00fca17c1c1c12932e3e4e4e4e4e4e424954a3d953a417530a993933ff5a74e4e7e7272523403cb7c526474058d51422a422a05769611636f6c8c8db131f62646494949494949c9c9c9c94f4e4a607430272525a99f3c755252f2929292580c2c7349ac278aa1a02c034b647bef2f119ab50f71cada76bf7b5fb66dfbddeebdf7de3973fb8adb57dcbee2f615f735b2fa8acbfddeed5c07e36ddbe9de4f1eb86ddced22154db6f7e194b1b68fb2fdb673dca7716007691d90ad83d14cefa156d9eeeeeeeeeeeeb6dd8ebee966dce7dd6ea6d24c2af285d94cf6e240b6cf683ab62210d32ff58940dbe9c46226b1b869159df3de3593a9df7db6e96d7a9bfadafccd7ebbdfee777bd3ee1b77ed8998dc428e3d3b41b9fba542cd060347b117b394b7eb26c5d1aa46eab628abc556ccb4ba62de26ee601ac43167905669276d7a5aa7bd41191d90790f2422f3090c4fef9eea60e6b5edc68deec72ad3249a2fec1c972971ff3450abac7c374f371155ec1b770ae28a7dc5ede1ee70b3a057d0304a6774402428674c2693cd6b2606692299b0c9649a4848136922996474403290de56cdec1eae37619a6ce685a5e6a294e033ddf48e2342f3fc10a7fcee6f441742017d3e31967c49969677300d76ddb9ee2dcb40b4f7f100900884249134cab22ccbb22ccbb22ccbb22164ee9eea766452668272460343d3254d6cb23a47f5a350df275ff2255ff2b5c957679b34e980f433303c81dc37cb79b87ebe49dee226ac612237d37798c897e9b71eea6b0f3b0839c8a48331bd3ba85db48ead08c4f47e18c4c88b9099c5e7b399c9ea9cfb7da7ee24784221aad8b7c0d30971c56249d3777e6078eff7cdae6f9232303a207d6d22754ee74495a489349572e6ca5e87e32189592016149c495ba6936899d832b54ccbb48cc9b4dd7bd2c17420d7fdd86e0ae20383e04049d3a09c91325286084a7f92b2bdf589f7435d65c36793819333a95596d664fb7e8c2095819bd8e60c4fa4e984f984993495e8ab5535adb269958fc99a4b3476bb73ce73734e22fb9739b32be696d9a28399776ebfdfe6ccbaf07e7631bbc1d95ce4a340f1ee204f70c467b6cb8dad08a403e9bdadda48f04da4a8629fa3b33d4df66a1716d792b520db6c86468e31c657fbf82c03913591a28b136f0275824f0461e60119a79c188a48b480c892f187d8ba361235119afb439c72dff41855ecbd0e667b83df449a2cca91d80dccb217cd4c4dafec775e60d93e6451dd647b4a29a538424a25a5f5975294127cf743af3935e715d6acd815a85d7e503dd9d62275279ba941d98235e72b42d5a36ce38fad4bdd96e974df402232736088c299705624e3c97670a6d32afb0c67afa862afe18c0351c5bec35907b29acc0613b97982b15ed9eca657f63e17e81322ca8cb225b2e5d17906b165b33d55a23fb135513367337365351fb962df6f301422259b10a1b9fb10a7dcfd7ef370e068e1308e0a7c5c8fd82a8e22654b8d80503e2cf64d6329a854eec7484bd0b404fd1a59b40471654def56a6c170deb57b316b4164e3b025db1e5411fb18eda9cf7d38edd4b8733a20dc359088ccde8c8fe95fcd419cc0d6e1527c08f1da11924b383d6d44a31334953a5fdc3930dd2f4844e6ed59c7633b87b3bce11dfd8bb3998ce6d52bfb1ff57df533d3c9f69dd3aa0a364cb64e4613552c145ff6df56cd1e416ce7ae838b90b9031b76718e2907466fb23d132e6edf3a5dc38bdb7bda0b50d531b19917100b1c8d8e47834174600f6d600b8128f6b7833890083a9384dac5e44e24ee927c27a85b96d8e783027ab4df6e70268c9aac6ca657f6f77e1fca8657e51095ed8c299bc9f61a8e169c2011fb7b9aefbccd9072442122f6020bac6005322bf03ebdcfa9444d5fca18d0e4f93efd26e3aaafc4b739a0579493f7d52a1a35177cf322b58b89de7647157d43332626460821a87c873326e6135b75d6ae22d3779d9079afd6f78f79afce4a6f64752caee8db27d33fc71c9b9125d8355bace184cd1f2d892f9c4941f48b98455329a4b15c5b69be8cb4a276e18e3c27c4d6e9fbe9740e879fa983d1b44ba11cdd4d3487668c4caf846290c889678d9c7e8b78e64c58af3ad65d8f2934d42e1aa811b54bcf194795c819adb577965d8fd9456dd42e75048c754c93f9822842e6a9348b5096f8c299146be47c7eb8d33e2afaee66b99eeec72a134125ac552972feb48ace9ca8428f812f88f922646e4a3f6562da654603b1c5ddbb0772e04c9235a95554ce4fa556d14f702eb5e00b5b2929d3d3cfa47631093ba6526a1713a99a4bf36702b54b9dac16415cd19fe03691e99dc8f40d45a6efe9a34cc38ea1863aa87fb8a66997d7a9db21339d2da3769ab579fa566a97902e51a9445c7d46096ae49333b48d70c75a45dfe1f6a1b3d2a3157c0d6b97507bce4c416c71a753270f71daa49452bbbfa0bce4a132d23a1355e88fdac504da68556cb2664eafe8e9ccf92a187ea899f38e65da9fa76f4b698caa3f41f920413a08931ff3f5f3f2392a0e82c309be30c67a5429bb3e0ab6a6d102d1c801d98568972f3b49f6cf0a77f6d712aa3933596d93337332238b5a258ddabe264bca000cff7aa9f183ef20d72aec6b8a5791a852bfd5571ba128727d8dd1bc65504b5fad455708c27b80b2e2b341ae0f6f0525cf56838ffef614064be4941c7b601093efed133a3966eedb0837d2fd58e5d38b5a55895a557764af56d5d84777284f6c69afa732882d29224bda40115db6d77b2357eaab8e0f5a07b9de504a43c923643bdde69c9f89fdbcfdc526f6164f221d4a1ecea37026c108a90c0b92872d7ebfdd1624adaa17fc4c328b4db2b3b8cdaecaf72db26b4b50305eb0b09f9724ebf9614f4f85d8d330080f882a9f7eba8bdf56dd5ed9d7df1be99236363837b9723765d7344dfb96791c3e65c9618fc31d87390e6f1c367158e3f0e5b0e570c6e1ca61ca7da0101c6e0ecb0fb4e1c556b9c0d788a097c946c5174f50cf516badd63e54c9d53ebc91ab45e5aa3357b1bedaeca68fd3ee26b3cd5e7fea7a689207e7d6c8b7c69f3a1e33df869616650a8629598894fce50c9fb2bc892aa69f72863d252f67b80bea7286391d2e67789b345bceb0c9c89433acf56839c3b7716eceb05dca84ea4ecd19a639c3330b11554ccfd13e664a5431dde2ce2e388a433a8b9a05805719529a1d1e5299210fe7128c0ef5d96bb20000529db9aa0777003f0444c18071ae5abc7400e35c9164af5c4f04f7212290bd872eae7dd330d5a13bdc4ddd0ead32a1c32936d17e3ad5aecadf5d7c21d52182529dc9d201943cbdaabff76301529d11303c780243553615e1a3371d06778ba0998bb9dedfdfdb7b6b391322e884119179e69cc326b1a3d7f0a5460c55d4c927845c55bdea77ad3666962bdb9e669b5d9c1f2d3bf003269a38d1eeae9d5d7630b27b562c8fba937aa9e9af15caafe8921a882bb425371055e86f9ea0a439c117b664d94614756f5a66da340deb6b615fd842a506a48efc40a67204994a1464fa0c474a29e513afde40a612943424ad9a2a59c1988da05a158156c9f74bcbc1b68a614ac1178f22c5f73a71c80db180d471fa69c80722f13deb78ccff6437f1eeddf351651fa23eec4e64662624f01d89091c71051ddf93a0808e0f4c82c54f1d3844fdfcb4229bb4fb4fccc4c859e023908857d03153a2630454e27b12472441011da7effbbeeffb6e81171ddf8ff8c06faefa743a9d4ea7d32df0a2e304a2e6aafbb2bbbbb64988228a2966e771dbc9e3bab99d4ca77bde4f9d89a34814a855f632df93ac5170ded69d4edde66ddee6715e149ec7759db7799ee76ddec9f3b49fae79a0e76d9af7ede1e95bd77dd338afe3e47dbfde93f4aa576b355593173b4c1bd32a622b1e8514a87af75ebb3f518e3bdd7bbd37f5de71d39be76e764fdee69db85fefded377badae974af7d60a8dd9f32dacd294f1b5769f5a8c9c4d2b174a67b266fc3f4945d90bb5d967d72276ff3b613e76d1cf78df3e69c73ce39e79c73ce397fe266d6791e2737cb75f51ba6777192ed743a9d58b418f93417242d589c463eed74dabc89145bdc74c24c9a4ab486da504a038ff33c0f0c62e3b0cddb6976de65e95ab16583a5f338aef3388ee3382fb6365089d8f232980ea534f03ca4adab516c1de775dee675733b715174278fe34eddb66d5bb7755db76d276debb4eddd49d3368ef3bc6f1cceb2d7c9bac94a03ef9bb7712f60dcfed4c178c17927afc3f41cae19c8737d114bb8f7fbe4fc36659892e5fc94e20bef90bca7ef61b22e2865801e469f6fdfee357d9fd005658472f62a6341997bbf2f4e54e78d46d95e5750873665c2dc1ee77ccd39e79c73ce39e79c73ce39e79c3cf4bc3880e83eb23fb9498c97a00ee3c5e553dac5c5492e6fa35d5a9cc5c8e55fdae5fbe95e77791f4186f0d043b3c0cbffd02e9c9c1d8c9c3e643c7519200ead92731291fa9439393339333996fbe43e69adef2a2f9d710e6ba75846f60e9beee1ee27ecfdc3a71118f8c55118c64b302a85873822660879857b3fe993738267dc049f3c063679098ef10dcb0c629915c8b805a4f8a451b3a44fc77c4a0f5be70fdb05d9fef4ca7efb9df8e6ef43a1fa670b557903c396d91ef60f0643554ee19839f05b0996f9f37372e752a9cfe7e819b883848664e0b9444eafec251071155bd4b68d4bb94f84cc5b0a6b5ceae613dc413806ee21dc44adb247e12e6aa33e6a95bd0bdc48b8935ad54aadeaa5f9e12983e7cca469d5ab66dadcb40aa755f6209e4bf4ca9ec313d6a37f4c2f92b1f95016654b1ff10fadea77bf2ba574935dffb40a28f685b2e828944bc8f55d248de45105fb4e6b4d9a84082fcd42cd95bdb52f295f6e5524b1578b2dcdd5d168f2be6df73413e763b26850afec878ab0cc9be77573b019ccd72c3263ed62ad9d41d9ce9f6c1fc3d993ede76bdaab7e14ead53e1e48391034819b890bea806c3781443a0e4848cea476e92f352ba3a9324db38161b644b6609872936b53f44414aa511f37c18b93fb9bdc94f874a24aa53c9127aed4a77c27d15e96efc5beaea238766523abe6e4fa054497a542daff8080e8b237b0f721b666dcbe00d165aba80208d9be87d832dd5e00d1657f7e7c90ed79882dedf63b44970502e241b61f125bd9ed8544970d0ad241b60f125bdced7f449715b2f7b123e220bbb87db6cf711a6cc8f638628bc5ed677065fb97d86a71fb1bac6cdf125b24b78741866ccf125b309256b2bd4a74d9242517b2fd2abaac923d8de8b24bf638ba6e8c8dd842dd5e155b25b74f892d939fc8ccc8f6a9e8ba32f625d17567e24abd8be8ba34f623d1755f27b195ba3d2ab662dc9ee48bad91db2eba6e8dbd165dd7c6be46d7bd91d1256de24abd3d175bdfed6f6cc5968ce3770763a9a59ff4deef53b968cf77dd63648185c758a3c6636ca185c7e8723d461c381e230d343cc61a6a788c36d8f01873e4788c393f461d3a1ee30d373c461c70d8f11877f0788c3c7a3cc61e8fd1878f1f390009a27ad859c863fcf11873788c401e6390ab2ee42bbc99f08c6bda399cb9c0a77bd8c559600f062631c1253fc1264fa5309671213894363736352f9a19991bb3a494847464544434241404f453c50da84051d1f5a6a9f8244f56e59076254fb56995097722e80d084495b97360edb9da3d7d9c96d59b65afd3c76959f6aad9adb566d5c7569f6a33b52ac5ad367155ab08222b8ba96a50a14039f135916327c8f52cb6dad49b7631c9b2ec99f6aa36f7fb502895e4a9f1b065ba879d44ae9742cdb212a9764c46b7592fa188ad7a2983e8b2347225b656afb79fe56cb5b12ffbd22c0b575df50c69b25a68d24857ad912b130944ca3596268b4d56ecec6563b12c76eff76d9468724270100c04e780c3fbcaf53fb00fdc03875726d7f3c03b300ef806ac03679c03db806bc034e0d00ee57a1cd8855bc035300b38b455d81b644b45ae6f152642ba8043fa44aeb781432a835caf82431a45ae7f0187748a5cbf82436a835ccf82435a45ae870187d48a5c1f030ee90e72bd0c38a43dc8f52d38a43fc8f53770488390eb5d7048afc8f52c1c5223e4fa171c5224e4fa1970489790eb5b38a44ec8f5347048a310d229e47a141c522b84b502b9fe38ac49542572d540aeed8514f869be8c872d3431beb9d64857f6aac9f55503d1657f7e3640135b9b12d16581803230135b3392882e1b1474815c5feb6b0562452257cd0ad1658786aeb0145bd914a2cb1211554129b6b82844972d2a9242526c9d9c105dd6c8080a48b1e56209d1658f8e9a70145b1e12a2cb22212921d7532323d423e47a5a145b2d5e4faf882eab2457aa5211628b2408d165977e105d37a607d1756576105d774628b68262abe4d5e44b43c8314090f1c10c0f723db522ba2e4d15d1755f72c5065344d73d794dbd9ef6c4568cd7d3586cbd388d0e5e39a8c141b6a941aea7f5d489286291d81a71491bb952799e882efb922b7527b6aeabdac8957a2a45a650e4fa8a41aedf62e016fe02c7f8087ef10f8ffce2ef32f0fd86579f8137175cb0614345e585175656585860802186186490a1a5e5c60d171716ebe56586195a3452504030855bf8094e956093a370c96160d449300c0fb3b80becfd845d9cc3a767983361ed3230fd0c6c3a10f616c80517b2d78f0d1b3f402a2a40412fbc1024b4b22234c4c2324404030c444531c4506424830c46472d2d4748376e2025b9b82429b1584b2f7f59caf5376686cf20d39aa14193f24201df92a131934293515ee02ffeeba5cd0c19afaf36d8e69f711b19af6a4367e0e3b0cbf61883387491ed51700a0e53d99e060e71b66fe19046b69f01bfe05025dbb3700843b677c1e18d6c7f03873364fb161cd290ed65c0619c22dbc780c368836c0f030e6315d99e0587d18a6cbf62ff020e630fb2bd0a0ee30fb2bd0d1cba80c37845b6b751c5fec337aad88fbcc05f54b18f8149a28a7d0b181555ec53f824aad89fe047157b139c1255ec4bb02aaad8a3b08da8620f03b3b4bc44157b16184754b1f7708ea862ef02e3e0234854b1cff0101ea28abd09f7e04354b15fe11fa28a8d949aba1f33c336aad3aa9daaa33a0baf97b1d8aaf17a39456c75afa720882c23a807e84bbae6d0ab05b9ce30112f09e6d0cb7eb3a7d45a1536a1379dbe0666019bd05b130e9b70a051aeb388cacca5ec354f288d82f4dab50f11014deb84d073b7fb41cfc91deef55427b6bed75317c4d6e995f270d73e2c73467ffa668ec9c526144449c14784e6212452d67474a46bc7c512995e3b182ab3464472a627903c2eaa50251aca6727afe4d8f3442c6f1f67a995925e4125d4422336b2baa6552b1da88e512533673611590d84b8aa4741313169d1a2b7f8f2c5503ed9cb649e08aaca8aa0b8e0b3af1c5b5cbb483ad42ea7d7d322cd3262aeeabd91a382be9f5cc1f0569bef43a1fe500583a3accab107063d798b1da3a45e48019bc9ca5e73655f73551fe3338e1f270a8d170f6ba0587c2dc5479732b542aea7409335530e569d199bd526fc6880e14d01c38b02861f08861f0643d4c119d5e63327bcb73601983da834ebd92993245468460480001004005316000030100a050342c178168589b4770014000d78a04a56541a0c255a0e63196390418601000001000006040060804a046bf5fedc06be292428f72ccb61d6ce7c033b807ddca82ca8ae0fa80e1d97a2a0ad5fb73c5d57dbfa8feb54ae3be01c6e6d3d5b5b49b3a6b7460516d548361fd223091fd93f86b86a89eab7e64204dd73e6302fd9249e5e70ee2ecad5c622ba890719a3998f81bb9a708f87103fc3c67685141f47feb62fda6f9077f8a164a6b27ac942aa9ace0969e06c138bd8f08369b3792ebdc2b9a52308a8779d8a4f82980c36bd8cea1bf0988914fb4107d93a31f6bec0fd25668fc09ea090101ed20162400f81b72c4cce012bad41da87e920572e625c83c2752cf8bfeb16895a406628468e01a7220c54028e3a0c2224dc48349cc5ca79183f33daec1f034034443a54c44ed5f97f15cfd92be1967f11dd15d547e2c8284615195a37583f7c00a3c48dd6572dd7315ab69fea63d41dd0dc95adbabafdaec2ab2d596721ef228cacc2e98c79aebc933a0ae121c0b8652a2fbfa3d8e50edc55f6d2f9e4518aa2268f405348911df311640a29a2e33ff24dc735751424fe22a8303107b370159d82dfc9926a3a45bc893f3f49785be903301b9fac3bf85e38ed4af19fe5a8a6c554cfb65bc9b19e38dd6dd5493ffb45fe3e78bb2f11b37c89a936777ae2886dd125c7d6876411e1e884e131020fa162df4128e7c5072ad9e42297e6d78156c5a07cce3831d107da62ed2e1c9b703e274f26b30979bb48cd8f07d37487f08a2e3f5476c9f7e2f53438d55d0a953316005e0c281da0a2653cdf4c36e5aca355a1a2810f481a6b1fe7fd017f16ce24b96c3007070bb972ba1cd3915d7c920b8851dd78571f3fd15d9754f05d6a8600bbb3058377431f81ec3a228aefd20502d89dd213bc3b731016a88d176a784a636673313a9df8f283de62f5b95604cb5050f54a5c0245f811ae96b56549ed58e44306c443b48349b1b1086c832eab16a73086b6cdeecd592967b7d355ce40533c1fe5314e59c47e9630ca94a48f40b4b72f5852f8068216b1b60760f8979f3ad15234238cdd7ef7b7a098962a47195e4725491e8d7d4e09d33a0da56a9c55dad54e317408fcf117132dbb0117de032f4487f19fd6205ded4d6dd19fce82b0549595018febf9f4ebab17827deb196065ca1c64748af9f0866ad68e85708252386c36c480a6d434128751101272fe37e1ddb10325857892bb06d7a11c41fd92dbeda1bcf62b17bd1fd237228e4e520aadd4930645c9203f1c8a9ddc4eab9a404a4ef66c196f9c12129f60ccfcb8a8a3b8e2809378284da0d4083f35dbeb8b28d9474a1f32bebd2fad0c284e9c3d34d85a8d95923cc4b045b9e797143f69057a9b60c8a67092c64efb2399e9764265040903b5cefa4f5ac22314590486205982d0f2050ce28f7eb99a991aebf547a41af5d0896ed718086d7c5176c5e2b9042839a8ed4cdca38853359e3b133b3c21772ae95ed9c2fc93ab8bc3461bedc9ef4c6ef3dc6ad03b47714510513e9541960eed59e73ad47587d3c825e382f3f5197cd66dc61134b2af65c2b47e71eeba4ec0f87066edfc11b804c4db9e5cb0e80ebaeff8ac73cf07389097d608ed7d6e0cc34620d0986260a55e65dc62bc7fce210bd5aac1c9830d87770f51c3fbaac9b8358999274f746582032f2330df9b19469097a3a6549de00939aa73a0d8e58e681fd1224cd5501dce91e766da4b9164d5c7e73f8b7291986adb7e6102eb19d31f88379364c2e882eae5ac6aa6f3d0242f6a4920256d68a0c44d5724a613849074ec974834555be287b898309c32ed2b49349c19d5f1dc8623f74681d58afa5650f2f2cbfa9fddb8ac16ddf839b6e2dc66d921dc2e855c49e6fd34a5e3c1f33001249e9166108c31d7ebcdb1a0f62679a24d4ad0bda21d9c400788c85a4e508696b31694a1ec506f72bf6838da43c3059f021cacffaac3bc41b3a3ba18a695fd2e82ce0b3df1bc56a5c34a9b2dd2b723dfee32d7c216bfd85b8e5f32d07a15b01af0d167fdb448c7bea700da933a88e0603e46783aef5f48ce51b0f30fb59020dbe145d72f9c22569f24cff4300641a8c009cc21ae7bc56c94c2b16a3797f944eb4ec88df61aab98c83c99fd1aa1f27450890283db054c9f2e917fc1874d7cbfd363c6c1147be31a21e63e3ac2dcb0ad661d7d8832c2340af0a48c1949cec5ee536a6c988da8a499b526700ec9263342279db96b04437cb3d31b66c957336e49652a41493972052716c296f67c45532a6a73206d2c765cdecdf4926cd955be8369d2323a176330e0050a82c8cd6e45e9f745ee6a667abba35afaf592bb329b9ab63a710faf979a5147318a9173f5ac7c0fe7587a09fbcbd18f2de217be2d737f58401d6ea38042fbcff5c0e76f85e8ba358cd62cd24b57ff7320c705887334b9181704a3b67f1f62934bffef60582323da7e3de0c35f3266d22158d6a2ee9e586485c31a8d91fa2b831b76c960ce7346983854044bfc446233e08bb3dfa31e1c730e27f1851dc4a40c487e0928753ab39730941f443582175a4bac25061c26fb7257999d0bfbea50884dd763df2770e0cabf597df7b9315d6e44a917d6cfd7857ce397e4330e9d55e8b772b35fca4dfc1de9272eff86fd4f1f88dff7820181496c034bb79f5a6c5aa6de7d188abebdb5c91c76a19ff21bd3eefb4c8ba5bebea5341fa0d366f2252817f417e5a7fd2ab0e4815274bd389602dd6b756e4804470ce596ae15be00f1a2dc90d345ed3be1c58029be136e02ccf456dd149a9f926d430d53c05c279c1de189c8de668ffde600eeaf5bdaede0f408eff07b457045ec342b3ab0678baf9fbc0c6ac80a61af35d85c5554ed5cb5c03ab8aab91d1f77abf14b1d6aa2591a07cefd1cfac66f7445a9abd92ed8a14ba23e60a9de82f96bda5f4af874cbf5aa3bdbf626af737bcae3b89e3a431c166abaf2dac4afae907a9cd4474ba7f0f4d9d40f4a8e19824457e381526195e83365b2e5a9e99d4d9bddd986a99cb073efb0ab2aebeceb724b1a320e9d485c0d8003d0694b15d35038742ee151c0fa75b321b47c1fc09cd322520ded0f1e3c2738a73fee035ac139fd60a26b97052c96d9fa41405b6d614b6f9169cddbc5a55c84aff8265ed88dcea1839a9a75bf29c31f3a4f47c645fd6764123e70a41d72ba870460d736f469f9393bcffa2f4c7c6acdda9527fd2e18e7d8cd6384b570ab585c2b7ea66321ac41e8c49d71aa9b66efe9520c210f763316e8fd92508058ca9fb4fd4c218da27f0f86b2fb96a4dabe9a3816dc45bd9cd6fce19db98386439c0aa7c2f438fd31d69db552f681f56f1f06a2932220f9653c461a63a1e478eb09ae97c4023b8350f4253f047a8855914ab8610fe0966dba0346e41968e0cd593a8474873271b98a845405d49573b84f93e0b32ed336db6b1b1fb189cc4b3e9df3b0e5543840d3024ab298e768df8227bcb7003eb709318e4c0af35db5090652cfc8ac95b6ecbc834f6d465d7055ad236d61bf78658a71d787fd4a6dce60a7ece25ef5c8f2ad31e5efbb5efd0c0192c6d497cad7668f4edd0f883e92abd5aedfa512623c1946752b37a1ee64d8cc198e5759a2a248c0d295a6157813ea6a2876db1d100c6d97e9231dac04c3ca4a767a2ed91056dd9c9cc89c1dc5242753bec96bc564aa02400c777d74405fbba0e3bbcc3bba4ef3b377a19153df952584e5eb51151b3f02c6956eda0c31590a8577a2897452b33363a309535d0f8c82c681334e08b8efeeb106113698156c3714b6817688c8ad199a317dba88a95a306e614c722504e9cb009f825c2bc8003bab06e645714b28232eff48bb1b50d142ddb488488ac49bfd5b326c73fc943aa1623673eb413eebda7865b42363000d94b6fe221b9b0ae5bc6c8c922331a62e95eb9e4a094f4c3ed3be01d67dfbab975d005ba6df8bad332462df249a4d875a3fc522ab6236e557c15025dd7957ca588fc279f3e21d94b1ea9856257172804a94151b6a158bf155772928c34f135e52f45ecd76a03120b700182e6ea4916f099d28d80e4c48ba3f4c39202ff3b6a5e8c220c43fece65b52de4349521628560a9d1027ac6fa6ad7e8b829cbb96696d9c71872b51367c7e43a58cdf89964a5dbcb937b17ad93ec65f1b31f370b848f8b1f3a7877b71b93dc3cd949d4d54b322724ecb18a9bfc20ee8dc8ba18d0e2ee1e4147817ed4bd66f07a2bd24f771ea8c31156453167703f83056ead89079d5399f24d90cbd5921d932df223e91b44584d7150bc28a3993c0d0c04bb4633bf7f0b8058a186fae7324f05870d42292f61c250fe25d4256fd9e90cf22e9bf1744548dfceaaa89c2a10d883d5148dc2203fd834c18d4219d39394a72d30580da72529271c1f4070ad91c4d0db37597865f7e994462cb61e855cc85bcee810735cb5fa871c087d2752d137e688c7b0b2b2ee4a9750122060f3946a927e9ff1e2f880b21a28ace848474f7d0f82f04b8bb5258c285c8ac32c33deeeefbf967a6151cad0ba5f75113d013ef879eb4d4ac0006d12096ece114c37376b62c2d5024aab0e052efef64d0daffacc51fdacf319775283f4c5ad10bdb9c722677baa41c9a725a150d001805e91ebb8deaebec5ce69b5ede0aff2b267d95fc83d516744a3b2a2651cf182f9b9ecac5a60ba693acbce7623204b0a0181ad4e40b37647544a2c5863102b2522a321b0a2222218a182229aa10723e4a05315b4a0129ad94fb2167d4f2313154e92141d4e001649d6a32ed00dc452d5cc981f5bd83700cd20b2e2a0470eb9e66db2ca360b4c194ce9100f051b06704d4b73555f50e5180fa809f0e6ed5b35d2c86de052f56aa64be4b40ea5c369cc5221a39fd6fae989268e18066f51efc36301464d7b787d78b337ece5fb0c5bc515c580a9065bb785bcf833690a6d63c7de4daa07d2c7d2425188048233c90133b21f6613aa584b8937897d540da82e108ae844110557fa1238b2c8e9b114f425ee26686e2d0b2fd56222f85d150a399a5a2ae1be1ecc71fc3f43a93181e9d662869f268df026de4667bdca053f12592a9955b44b39e58d7598c53665eae760ea4a7c0702947bf21c04d2e8eb0cedf6c05876b6bfc1a9b37742401ef75943a6147f2f2f2a63beec2d975d7d69fb4371f6275b385a887137ab6f89f01fa45cec843d7aa8ff01e49f07a05111bb0ff21ec6c3bfa8ee5f07a11a0447cb6e2f62733e708dc53a958afa8da404e73e159bfed0e02e43b3681b899265f8c63d76a9f6b374f0e87c315dec96bb817bd8a855eb29b273d50d0eeaf57c05bda9df2042010ab7ea698ce9f4e5a8a20ae5f60055e9280023eee97f00cd42c2e08fa9bc0242cba4f4c277d780306881ba5b6e5423eacb9af7bc099f6ef0b5409e480afea531539a6eaa6abaabe9a7913ab687e704dd47ab7c4420cd631426d43c7bc2199d8348799d001ba7bc293775fdc6fc992dcdee6299f3e70552c70e9b1299d68476e0e28bbcc128acc64a6242f31afdb78489980de901090df0c763738cf8eb9dd507107e4e2d66c275ca1406b87adda0a7e4bc4dfaf8c4c3c20714fdb54ee61d415c48c9503d0bf499785ab3a2e687bd2616dcd9987bffafee918f2fcc1828ce1a6b526241f67da8c4ab385f1cfeb53dba29321dec0d9545a903f96cec657b27798ab17792c57bd4d07d115394186d211c463592f177b37d00153c9009f41c8260549dfd7af8413d62c389b30493d6f0435ed17d5ec42db97dd926b696f96a6b19ebe3f56a20d8dd0cde6f19071dab1bf60471fafcb4320f9bccb4bac088c16700952d180dbd871ba2b3531c7c4a9f41b2873e7854d2f46a7c167d0a420561324318bc09098f26369c951b3257e31f26ce3ecfa2c6b2a872e35719704329d154b397be8c5e8e337877941aa4e686520f1be03421c540bdf847e96189efbb03261b93ee0a7f8cd615c1b7991f6bbaaeb7bf353a03360698db1e9b0ac81d6f4ce318680b3147dc91862926822f70a2fd66c4b6f01c22b24837690a85017862cf3d82ec4758d8cc5b1cf174118c547d1924386916425a978c810d15eaefc5b32c40e41795722d472e3d98b09718c42c5a5683a653651a0a36963b0883952457d98be869071099682b13d99b1376f9dada44d5f5d3969b32dc9e500200a7ac15cb82c7fba6c4b5f4edbba1456ed90f66d2c0b260d6964af6c39382f6b69b0b78f2ab01bbadef1ffd024d2a995ed6677452526ba9dadec4ea0ee45002ea2a03537376771082480d1f8d8cff1aa1d5498c74b869cd9da60fa965b166b9a66c54c5513db5fe3a6c89069e15e0a195b139fba4566af353f00b556ff0419e5697e34cedcba2412917ddd48e1ab412c50f32934600a69a39335ed75b912c4a4921c2fc5396ba8df39b59142de8ffe3ae130f92468e95b59216169e1c2e2e6388bdfbf51925d0b1659a16244a234f45fe04e4c9a2d37742f9ac11302b78619726e28a86bdb6eb20b3f96e2d4b53161c75792585ff37b8b147a57c57cc30fb703759300ab0086d423b6e8bc78e58c2f7b9b718dd1dfa71a428c048b805c49b055f095935e0df41227bea061e6a374a8c072254e268c8edc2208efabc484c9fefbc264bb7b151c602da47c36cec3a5ec4a982e7fc365739c62910e7090e4c86e806aa62fd09648eae238df8d26a89ed87030339d434afb9c12e2a8129262f4d2081fac23c76cc04a6ba56b457b1a6b6e669fbd3f1c9bcd4156c1adbcb048a1f7786554cc63311ea4236ac999b3b0fe4c0c697dd3aa2363c2c05c35c95431c8022d9bc3c66fc70a37615581ef9e9e313ec0a1823aa53c29fd1b7d120a9d15a31e2dbd90117c2879a07e4dbf73fe7fa3be959110971df372e4423054f088a4256c1c1c33695e211bfef8854c3cb1cc4e0dd8bf41406c4f93655f5e88871331dbe14b72f60d0e5d448ab2dde0e85ca0b4e60fcd16a6a359bb715cf612d0b095830aa3c7d9f565f669c68f4d73802cebfea025d40a2b5e01f6aabde8987ff111b98a10fe18e24f029304afdbb7c185ce13fce104f18ee8c05e09b0f384cefb02917db24262f404468bdf53672693d5dab72aa10e026acc3fb5865ffd1d2062ec2178f546edaa81e6848c5943113e0e053d198035541d24de9e5a2aabfd0ab1214d80a9613123e3745f89e66e52935f99cc0513131d2d4af112d0775c6902f22510b4698f8aca3476dff69a207f3ffa1effa606db61ac0959e609334500da79266ab03f51e236157f689ca4771e8b674c1a367a9ffb22b92b6ae489529bf7440d2460b5514b00cb051024704b934d942babfe4688f4bfc94ff3587985a4ada0a1c03af07a6a106f05074281b419b3a0ad25f48dcc8ca528ac4a43878171e1f2e10f3316cbe0beea3331f9e56d38197dcb40352c970bf6cda2812819edc3392c514b3f910f6f48af63a42ad9734b834d3d2b45d754312c2f42df367c597970be4c9128e05be588dd748622ce19aace0d2ead061851d02213d2af164d018a90de9c035a8fefb9e73b7e884e0c4d17f82422e6d2b590288cae99f90c0cc0bbfd168cf5e8ee571ad2bf3520be9e1b3d0f8edff4ea4655d9399ffe790fe1ff5998c8c889610467976d13c231e661ca6518044d9f9cef3c16a367fbe4fbf9be489a7c41c3770ae7a7aa0fb5f50cc399f2ddb915e288b6ea1a4c2e5b0092f8fe30fe95f9ee766504c10c3167be232af96cead9a8bf1faf9b44a63998f38dc1d4faf488d6c71138f5c5850affccf3252fcd10a181e45255f23aa80d6d37dc19d90d5e75c50c3165b7c8338c72cc28b49f15f3d8c8de3beac9fe8b4875a1c0668acc0e4e364225fdd12f9b34203c4a27afe0a9a4a8091d68c65aaa141c4e8d295ca90d47711d952de225513d109de9a0b6831747ea981da48e5c531946083abf1fe52e52e4ef53b5170a150ae653334b07ef0e6e9469db200929732ab4570e6b8ab58a2eaa6f415006803a29400e08da8dbfd519d67d5b5463f0176c51d6b9c2ef2609b54d952148caf4c69628a6a443ec2b74eee03094bb5f395eab6465092bad6687ba406e22e69dadac8460433dcd899619770077972e0bad9006a8fdeb5730be2a18cbcdc73fd00251683a1cf2d009adbb49bbbe392c467d7488487086cabc673e6d5da2f390e69ad38a585305f2d8615e7ecb01354f1f44f23a73bec05d66fd1b00d689c2a777a33a4b1d17c0e2cc287c5dffc626d97218e8653f13480724b8e4cb433f184f0af5c61a5d493ecf5e87539de78c19de42103cdeff1205143c3c3b8b67d0b10509e4936c5dfc083343405cf1239b62b0d14b668eddce605a26bb07a25ecd51582c961febb7839dc1fb10b9f4401cefb59568ababa686bc8757ab024ab1ad8ec1623f5fb89a03c345d561ce08dea89bdc88bb46171d5fb74f6a1c0bd57f7c43984a5fa0f9b3fbe896b83590e5dc4fc8e6e166b64339161fb44b805cd1ece7d50a06e6fd1dd871427945f7767ff51242312dce4afbb0b907bd23fb3569b542e32fe43ea6ddedcef7030f1519b94315d28336966e7934885d292fd1141803e7cafbfa23fdab47a75a962f357a568a69990822917a455f5ac320743c740bc18d75bcc30b18ac99d8e6011ad9c83f2b54cd035abd21dc50a47034e48688c7478e63544b07f5716aeecfb9d089a5af014735ec1aa49d51e6118c5a1599d466d4bccc0ead1fbbdde0dae75facfc20fbfc4140826e4faa0aaf3138424d3d5f5f63e6b23463302b7084d88da674924ab2a2c4d03a248bc9ae1f7d372f2c736561556f9be11cae448c6de9d1c1b92436ae36d358a7a1c7d7838c9116c1e2e9499a05367e530eb2f84c07e7b779a0c8cc4e167db3719fedb92b88f6f2a2cca7c27679190e6dd65036ec156bf616fcbf89d055eee0b7887069c3ca193e5262ab85d3189e19d59bc0c06640b0952da69fae0dc01430d2cd688eec34d7124565cb1d8acde710b94cffa9d241f77c71862620563ee33c0193e7aa8d44ca3d3f88789a883809837358945b6a122e9d852344c9b61cd1a25fd160ebe4b2943dbe6a4e8cffb41f3dd7a73ad70654a302bbadcf9a3f0b10c4045a2a10c59604a127564430af0b36b5b87827c6d38f11be6211d7123b1ad85e73e1500e375e0024dd7f07966baa4f9ea6db39ed9743f2d3116872c9fb693710b783770a70dfd8aaf590ac5a0176f55dbf7d108e5ef9d1adfaed14717d8ee775db90583e4c4550d96f37a253cb3074a9a4eb426277bb53d63c12e764ee8184ee15a5143765f50718e30eb233958137edd57919686c7bf282dd3158a40840be32b755ad2a28d0dd2e110c02e4df9145c401328ae002e2af5a8f13adf68649a0ece3ef0a28b5cf7696b5641586141cf65c4dde37a0ca2d7cb8d5c38499508aea8d169c89a81d459aae638470fe3cd8bb8a7a6fc2c479a430d76684580e033472e0270c34bf2f2264528800760fd4063f1563395683a88da392b5b176ddc7e0e65ecc0cf67b5f581eabc03f6485d04b394ab4645ccd83236a8e90d52b842f32f291c9be299e81fc8f5e1d4f1d72b44bbfe101402aea298570bb650b6415772a86aea579e24e29d1b5500c883b8500f33a70056e3066c5f761ddeaf8a0d676604137fb6a05d52da72639f6c17ba045baeb127543ffb00212bbe446c0913912c496e4a507dfe7bea9fecf15e2775258f27579a27a19d2532f08995e395fbc4bdc4acde109f43aad019fef4c496315c25bdf52a910b3ae2c8d19a557bc5417bb068c14a5fcaba31b185aae32cef17c0919696d7b09bba4c0b2b62885b465f13fc1684ee4a73abf82ad0ce9523a9ea3e1356f420d583a553c01cd0a18d693f292bc944fb61f92ce150d681e31d059fc99192278194c882326ae5b7fa98060ea22f336b7543a2732b545296c1e4abf9216abec19f79848d99a98a0bc54dc73dd7b7993a09b3d2e98ad2904f13879f181c7fd5b3c397bcd26e09c2023c8b09c9902f51b942de84f5f43ebcd3c042c8f103e34a94df687c30fb8038d423bac48a01f4c34e761a2f8208fdfd6124f3823141c24f0d74b10fe82fad5c4af11932bb0a04b97c8b398dc30636e5724dbc26257c503a54c2bdf59f3c3ac3a50cb3a8b16f98c49fa0bf44411a4d9b02ae01320f0da1954b1095494ff449a20c210f03cab389f8c8b575fbdaa61d319f38ffb30c7d32a434c0efdcba1f202f04055c9d504d6a28e77bdb2b59463acbf7d7b0edc2156511d00ff06b294f13dabe82a5366db453dd2759ed080d0c1345dd484149126ae252a7413d435a268cac2248b645112300e78566921ed625aec13be38b4dc86f79f0a26d43520b21775fcdd1d1f4bbe894f8a27fdcde3fe693630a48c3d9597e5d01f25ecbc8e7f7ff1b1572f38c053e48da9aca9e5af6554f2edc1668739a15558b8d9ca491ccbe2b044546fe8a4d448dcb7075cce6f28b77e03277d3ae65047848f28e10416b4422fae6b0a36e7f7b1710ef0ffe4d94f73c77641b8535f66980efe7a7a1767e35d28be923bd8457d405cf8b0dfb09987391c03f2171731b07f924213b974d1d19afb64a2af0aefc08483639e36aea67480a3a84fe48983d92a320e55d7296155ac813a1f0fc36329e9a4f13ce9790ea6d45dc8867d0b615a06ebd159062a62b1301a9153b088d2e173d5a5509ffc1959975d8f584718828ba5eb0fcb45b6059139fb2ed03b73a388590d1e35ab6feb9d3d7d8952e0f7337daa4765a11753b6ca511f8e9c69278a0be94a6fffac51ad740783fbed7eee179890bc0d42637b108fc48fe43474698d3e089d054c80742c7b1889313a31b1d1f898f426c03c2747c2402bb2e4b16e52861c12425f5def23c007785763728b293bef9e32731a4531847affd80766b2169ecb292117f2ae48efd16d7d3371bb317364ba8f109a3a95337691affc8811e003efa821d3f0c908b79fdcfa762f51102628bfd976dc4545b4bb61829dd94de21a88a87cacbaa9cb84229a160c4211c9c415538d5956b5a21f2f3b09ac37f227650f4e3154a68290aa6b0291d8dfd99005f5b1fc20be9dff77d3f9cd0a82eab10a11e148fa38a27ecf047f39ba62e460db9b0a9fdcfa922e434be2851d16b862b46cb0376b300876700eb1934c390e80bc43280dda6d50c496e0f1214b0c08f583c81560add0d9b1dd7a6505cc7b16b11a3a937c5507aa088506f130fd31faaf72b071c2409e7828a40c049acea849dec02a848e1790ce75d414284d19e5a12508a06a0ace2a5a2f108d66591e96f0feb463b0e16c6eeec36b9d836881ae019b2b7a933f8124747bd4c14eb450d8456d6b9e0ef8b2b595ddfb81aca5567ee1f4a381493e0f17c0077f4a963a508f6604e6626d769ced763a7cace67d94899176c10d4c08a496321fde17e19d82a9902e9ce54fc3d291dc9d6245fecb9777c9613d15835fca1d2d3f1eadcdcf8059268a19a2fc347862e2d1790e3b3c56a0dd0649c6615972766e6dfa17dc85242dcc2b519fe6a03c91266b3340f6276f6895a4d51d567b4c6123825ac1bbacbb2ef00ac0fc0487f8b611a6592b68ed3084d1ba9833f05859acb0348367abfc86b1c021ae299842c648fcaf3720ef500a2887849026ee643b9013a36dfa4f7c173b2960448ed14c1eaf5d7bac8a6beb1aecad4ad908732a61079f576a31448df5a3707bf59e6d94b830baf211ccb4b1f12a63398c5aac2b7978c5a875c47c8bb4f8a7be587a0bd00e777230517a21648486bda9d8734cf541d113b9c24c41e75fe646689b0df085e124c1f3455b9b28dc521603490fa46912f3f846e08373231122e0122d5a9f058d2bfd1fd1883fe26ece32db1259fc291ccc58e393db02db57b07bb1b12d106f47fbae053231f451390633819822ba0c45c53548c6c03875e4d8b47181a923b9e3208bc7bd8747600889929ecb4ca44b38b899dd524fa931c2e35325256c338ea1a4bc2c8e30fa516244daa5235c1509727bfaafa7b30b42b7e80007df1cf8293cb4728224e1f8363b7b1823c1d4b73be31b0e2a2eb5af9ad17bc33033229bb42f8407a145374d6164a56a4672e7e39ab29389774cf4662c524f2108cff493068d4be29168e78607a72424d99ab29c2af05a0dd04c79955aa014e0a1841ac666e1c47080fcb46e737fe18caf92d1c73209e957550c88c8e87d1fb65759700b6d65f48435b70b090f5ac93c5513cbe34c2fb4ad954186016afc18409b9d064add2698adc7cf5c4025cd85f5bde25a78050f4b0aa22d0df36ab88873e770e8ba41c73d704e49a2f0892a60cec406198377c9ea8f95dd3818c9a8ce2aefdf2fbf0587361e96f1c37021bdafa14750b5a5542164b79667b01c96d8173a423c6966225471885981c38ff89b6f61f656e30cc3e4c4507ce23d94a85c42b1617b2549b9ba9cadcfe87bce14569d16ef26e44dd9f86138441aa5a4a01b11b1bcd3817cefc42fac7824918bea82293d1722b9988fd9458aebcd56b2fe85dc579ca72fb51395824e7d5a185809ae88086baca0638f332677fca7620134e684f6148b303f9d27ca50c972abcd54bc49be214a7743297edd6842164a91b2fe6e9c8d14f2f5ed0e196ad5d618f71d96eca0314a2038a8ca1815636ee8c470ccf3de02198524e93066943540f49393f36129d7fe8db99c9210372ceffcf8925f06c80d3de221267242e48aafadec4d7db57b731699bb8d2f9afaf7770b542efb075f3dc399ce3aae2840a449baa101a48c6a5c8f072ba6797dad70794d8b817b25e3edc19fb772509afd1ae1ede5d556d6df05954f3226a43126fd3bea0023f0a75a8b0dfa4e1aeb2bf6fef2ea11cd174ed6c63a7a78a17c08ce3488bbd16a5357088707b51058ec6049b8cd0e67106555e663892fe2dfccdf58460ed7043f2eda11539e4f7249896f9919902cf4684850fe63884358b7d0448260afdec28c241ea9f4145a8a610c1a220b494e1222c87375f60c1864eb35addeb78b6bcbb6290ccf24086179a24e339a7e33301a9b64d83172b5baec21970da1e2c229427d39b4f77cf83420fc333d841c176546d70e1bdbed2e73d1ad52e581055b1a12e2ff366f0084362133b4d1db7f99ac2a9546923199c5814f321485cc12945c8ef607dea78192ee6552936c9e7705d947257be0b393b260ae6e873a69a68902429678f8a89aeb799a4159c73b881247b728fbfe8b18e701b30a5fa09869a20df9893db36e41ca44e8e9d50b48fa2f37f2e911855e4c530161787335e4e433140c9271346be01d58d19163f50d7ac290a520e836d1104214d108848846e27ba1e431fd31cef9f377264442c835c6a682069f510db531c175a309e4bb04cca0c6c6626274448d1b090995672fc9de9a72e547bffe4feccf5fe9aa4166d70314f830a67d80188ec734e07221d64fd569415659af4500a261b5247bccbd70269846d988561467f433439b758c68888347d72ff05b727c95558ca0c7021c6cf8152d7e944c06134ec28bc7b8116bee0c71d5c0dc3c8bcf4f8652fdb1828193f3f70cadc7a3a28a277d9b4229a2004b682ac2adfa01a7a1703e8dcfef7104ce84f36a2e7e400de40d1f21444338ffb941701c279cafda3e102b3b42c11dc043e333a08c1c7c883281344cb381f2f4f49105c11b18867bfc4fd2b94f784c268a843f17d0e3c2245cc951b2676988df89df944f66a2a0b0715d71ef47a61404b0ebcc106c00fdd8facca6f051c1629f9c7899598eb18a5870d93454a6253f62621431a2d93bee75305023cd8bd2eb4ea5088678b0bbcd4029d72f5fd6c1ba7e7c8cdc1ac80ed5e03c5137eb63521bbbbea756cb31d8783b15408e68e819053017f7bb11d0594b0aa9c7faef8368b8b55b18481caa7cfba453ee983951a943baf86dbdaa82f106ca6736a3ab2d15d6e13cc734d982fe76cc7406a0d54a1c5d6cf0ae0e91a4fe5fc6a243ceb3250fd68b6ad033183fb85b6e68f0c4c2a4488c2ee3fa67d42eeb4a4712fb1712528b495c20287471bc2934445a627061a7c36298c5ad738dacd3524e96128a66051b8dd8005fc85a166905d53fffbcd350148cd0225d8a13cc40e8a36360e77c519157d990e6452b720689fdf3ec3286a9615b93fcbd03f22639c957788b7d0ba6078b87a34b2b97166b009c7cbe6e8f1e0b323dca26e79f8bff1f7a4a866161ed6d77931f3f2f40f4294e12769a911708f0ebe531dd4025ae6b32c680507aad76f2fc28791dc8c7179fc49f15dfe52a1402dc7c7cd8e4c18663624ffe2b51a7fb05993efb9bee9717bd4682c664edb9fa78b22da1f1c53e3a97b31900e0f388c7ea32f119438eb8674d829419ebbd525bf8d3b539365abe55bc8d452376d841399ab75130d8c19fbb155edf17dd8c940bb818ea1bbc33e32ef18b9ad09c9321daa9eac5e555f7f241461e0ee13afb971b16c8f357749e36387bd82ab5525aee8e227c5f59f6562017bd60f4ac3fc09b1aa48d1677da8e82139ec5a7d23fcd2a153153896cd214021f3b6af57f005d3b45a1bdbb8daa25c485c3e91a11e64b8c297ed192b0520fd7194792c6e50bf8201beb34dc1939cd1dbefa0f406f088d14332e1547dfdd42b87ac199e91a7ab9e00bca95605af4283e189cbbac642aa4fb8098a3e4b3a00d8fab88d0dd3602841f255d906c3bd59805014fe77fdee99f40e26d71740f9a3badeedff6eb7d048ca114bec5f654a5443a3ffc3aa453470b1ca1eb354a7f151bd6904b9bb31b7aa18d363fce30fb7b208b47d26ee8ee29b0969f039e98fb6d6569eb7561fcddf953c31fcb97d307531caf5937de168b26112c690582884be61625886d720556847d7f81f4056cb8194ef16b85472d1e08fc622859650e1c2c9cb0c6937eba28dbaadebb8ad357f95a332b422113e6bc2036d539f8b039f963deade9de4d5d1a9c8945036c778a5e7a381edced855b90cf2d13fc7a2009285a4971f076bf21b474ffd39f85be963e81bb0164199060a027d1eb787665b917b5ee2d949c97a1509a515267b9daeb2573391643f45ebb8a349c2336eb8c87c93c10722f58a06be2e0688b0a5923537b0c7ff2e6fffd069c4870ae2e49142ea51601498a05b6ae27d61fb270d75bddf4e320ec2a0d52e316d0d9c36d96d82eea6042be79ef804eda05356ee106797f421dee8e625630ae60c36dea8942a1a3947435a899e3bff4d1d59b242fe90a8398fdb01af9589e8967c9d29e15111996c5a85f62f2f1df7a7d25c6d477a551c958624b560c681e7b0b520cd771649abc15d917e5f0ceb0c75c916cfb1167d9929bdf117860948e2e1a924cdc7b346a4324f587470b9fc5836a310dd16bc4baf8b12688531a4a6e4d6adeea3a659f5404eb8dd0889efd8b6c83082ee301db9d869f72ac3fcc7ad9d61f17b67338c9fafec9f12ba6bbe870906ac923314eef88594ad05756e4553ea772b09d191dd3c364451a3de068ef6f51342ca8bc47933e145f7cc74319e145c166f720157ce5fc183befb28f196d094c2953da94f7edcdffe1e372ac3f0bb59c1cab6f9e5fec29f62db87d261002b30cc271c1a0273163399634e9c02962e16b88a650146326ecc84f429bfc4fb1253f35281d232d9acb27e8bf86763b3afa533053fe24d225a75fd2f4059128d6b143050ca39f49d2584203eed013187005e0b7b68a04ed2df52978f35661827bd26a32ae575642d2672019c5623367fc4b398cb97412226f6812969d8f8e788a5a9b9e156c843b9d49291e31556dc22e5efc148f68877c77256ef4687f9aa3982b3fa45b57280a050feb44f38a7a60c967ccb330f7c2a743623b291eed143d8553dd33a754c498a85425d9483a497dd689ec5c625d790771804c5af5b24df148fd694895717df854a37bafa45073430e1ad14ae7e6d10f215860bcd5f4dbefa481ab57b1932eeea51555182ab4cfd149b6c7b6f5c89ff02586f8bb2185a7c001ae614bacfc6534ce4aed17b99922205830dcc898b75df3403cd58337851bb54c1047b8d1c03b167c1977a78d290580a894ccb8742142b39d8acd43df53cde20e76a4eb6a76a6f5dec6b4b1bf768a0b4963ed5862b6afb09d0d5b2528f43ab1f643bdfbda34f52d35b48489f1d56647605cab3c828a7611761922ef556cdc1130a5cd8e7a659a8ceb0493cdb29b33a279d79e1737df53d64d2ffecab7ed89ed721794f789ba63acb1e8aedd7313376416a6c7c51e8325bef6b39b568ee21e0e3241f0ed1ab716d11aec119869411abe8eca0b585706f58115052036516a7f9bd02df8098980db647a4a6d4dd7da64cd52e9f47b341ca8a8a02b3d10239278bb732727274f37f8f4e4a76a4f56d30d0b5620248e9cd8518100e011dd48b00af17f9e33b201f2ababee980264fa1c21a222eb8814e893306f9704d87f41c767d8cce6974db075c0a6b28c3d8ea178adab48e157428aa1afd0c0d7c44a5e733dc4358bd0f4dc8aa412e6a84171bc3370cf39ec3bca7015c936d0fa98af53207ac6442128ba493f1e1ded7bff1154c26f94473c621736cb6c0ffafd702916a6452d24be2b22fa267a513e7d51eaf50df92b5b0df41e850c2ffa5f855074f2b4862db18b7a9488bde8ad0a91e4b2c39c0fe46046177bb2751208f5b6621854c1fe0e413b11661af0d4ff1c3a4f1c5d5b6ad406dbc762ed8e2631f60298e1c2a4bbaa071d88c5f6c9960b8c6ef31f0b658f2cfcd6e107dda75dae449ab0255bef86cefa5459efb2ae4a26e7f63c5ddd65fdfea374d910d0efc6b305d52f5646cbbfcebde79362c62a21c8d8bfa06075d4b1c1efa71b6d78c8519d92ed59d18d1973c4703dfd2177cd5b812bb0bb2889d67346bfaadd0fff746aabc5a76b2cf98ce7c415e5d95469713a726559ce545c36922af47a4ca018e3aa7b1bdc9ca0e7033d27defc60cf097a3ebc75829e0ff49e70f3c33d27eafdf0e6843d3fd4ab03badbe0ad137b3ed473c29b1ff69ea8e783b727f6f850ef096f3fec7da2de0fde9cd8eb433d8ffc4d33be9554f258a8c1cea5a9064d9dd06bd77a32f1ef4d6742ad48d18c9cdb9fb485593699cf363961b0b68cf5e94b6b6a8d67d815780a4cccac039f6a927fa9e43828a0256d3e571b7b700b0672678e3ece79faba9350a1eb0cc2e0510b770ef448c62c43544417038302b34c092b5899f384e636664a61c349a82a90f74d4891222ff5cf7dd3d24c159f167104e957a18a7c0a4fb756d4bf56c8c5c337a773018c9998e525e5460d2b55e79348a3e3439561ad2cda8f82ff3a5335d329e73283fb6e8c0d7fe8634c54ae792b3221f618d25f990fbb7fc969c6c0dedff858383d70c23e007c3ca9790384aa84f56b6e7582aa52bdef91119bf89ba73a133f50cab2a8fdee86d2ff60839b315f670f9cdb667bad1f1975a2688ec6c800e68554b2daa69a069a3e690e9e988cc81baf9ccbcbb7cdad5a189479b693d3d94978590e05877385850626bded352cb5b8c9eddb3dec6f59cf023109b47acd3f9474301f1d7edfc3de2df34c2086406bcfbca3128eb383c3b73ddadd729e0562146cf5cd732ce9783e3825e7cbc26239e32d0e7f8f883bb6e5ffd22aa931c72edc30c8649c9b41504b701eb8e186fbe00bd7b87dbfef247ea013089de8819c2054621e708250257ec0898492f8414e2c74220f7282501279c009844af4014eb0991279acb44fe5be4a9a19891ea9d457a9fe4a6ca6441e2beb5fb94f658151288e0a94c200886510ddc60b82315478a5e9f15edb1e49aacce619cb18a5d073e6f3fee3e43b95c12af390fb7f899cac2b7219261566ebcc4ef5b52f9c976af7ed475c2367895d192a69871bb8c3d639fb870937d87e33e23aae2ab1047e30d71e92f46865b013ac3494793d56132b7a64fe2cadb6908b6f699dbacef9a52e1ce6bdad928915eef874dccc6e7cfd69ae1d2eab0b606213b1eff808b9916df0fe6b5e3b242b37e9caa098c13420635dac935768caacb595b68e8bba695d5ba9152301345019fc058b46655c87e5c4cafb071661672eb3e109fa4dc849c4237b408eaf9e2d6e22f6255f1d37b38c6f7fcc3586246514e232587c52acd7676611876515054224e41ee391727824bf2e8358556b804c75594e5cd990f9591aac3a6e70ade1b650a58880a08032e8172c1a90713d96c92b5d1f98051c5ccdf921f584dc2f1e29c102a4e9ec92492bdffc755c817df8fe716e1b3e5b590897c1c42762eb915948c982ee0529e977c3cb878f7a2fe412e291fc7956a867173711fb92af8e93acc7371fe61aa0d3b2106b2bf3ccce693b870d21a73360673e161b04ee47192cd10242f680e463062da006c3145a8e106f1b4e643adf6089c271813cd62162060e307f7cd8598580115f5c6ca818f22c0fc9620f4c8f7801ba89b402ce17381cd17d8fd753d9c3a0cb8cf93c84398c91a2e47ffc216361ee5c19e8d148371a65068572f55863d7517934e8de6339ee619a46c5a7798ff1acc9465cc1418f343670f950cf561b744d727f0d339e7c564c5e147ee3bf811bd1ee0acc08eff178b55a6f0ebaf686f6b703418b53fde8cdbabfc63c92f276e0ab221d39dc8a95743c18804c50f5fbf6e9817e1dd9427b90481fa444adb10d3932ff9aef09fd3e40f305cb2319511d49e36de7d8aea16d17089d90e23d3f99821e35a2f326ace249dc2908218201cd09a1c8b3dd7621fc74faacb70b411418110651610e3db0a31e0a8854e294f9d47dc64e8d80bba2c2a248e905a8d641e9acb0546acf7d237e4e473647db33254a81d5991c3f89485f25066979479daf99f3664634850babd0a2b3fb9a31bc55d3dcf1d7ccdd8891daca60308b3e68857f8afa7da7690354778a11deebb73249ec3909bd150059f46dde7d9ca94f3c91a212fe89f65154e2003323a15601eed0a3043654698834caa96c40f41bb9c91d1e765fa554396c01d6f9db750eb25f76c004bd73f91e3f3e2751bb53e2d963463a6f9b1e5e608266292669a29f69f6414ad0f3a41d281b5ea6d9f387bbd4c2bf7a6fd220599fef9e495ad286467d309f6eb683c4e63ca843096159e84b41827c83e4c481f51186de0b1d8094108ca4dfc9cb338e8cec12bec8fb8ce31ab0fe68dc8a9623f05e627aedd12bef2f233d2e7b0074f05992dbe45fb188428ec1da05bdbeda0ae54bd55b35c5945f1680eb4ec56d60c21e5540bc04b9ae45ee6e55b09cd79cc94f794d703f9211a63ff84fccbbf1017a1fa7c86567ae4335e76e084d27e9e370fd7a568da6982e88005b750376181da2fc8396679efd730943ec5760517070e0c3bb4fb48172018239e3f7ebc31e485987015c553fbcbcabbd901491301de4d24ccdf6ba955c7fd783d7ab9ce7cb582ad5a4a378f89a9f53814daaebf59a734267ab826bc7625e2896f796a0463bf43cffc9d5aad688e711e442fb3ac5b7474bb844ae8db8e1619ad5882906070b4169bff248449a0a7629033779242b79895dc8c0a317e0d38f47eb332c25dc3f24e8ba11192cd1c4e4e79fcc179303944000eab540b3a1926044027bb0c693accd648edbd1b0e246f8f1f3434450f805f7db9b68a7474e60fe9e4869a090961231e043818508209ba6a4239c5b452dccc2a359c693a1c92835052f37d787505c5c7a734bdf450102e5861fa6e9349200b66ef990100d08d3c84924ef842846f884b5598f47bef75de45ebc8db0ceaf9b264438e77b3ea5a15d028309079e633f97b1103b472332a8cfdac87828a0100148d3146984e3aaa809597868ca78622819492556436509a5302e3afd531ff638f3ebf911ba1bfefc396dd29a04c4fad302b51090da66333bb62b4730c846b151c7dfa8e4382525c79c61d902fc23033a2efa6c5b30161aa703f51ed0dd263b6ca40c9040cc2e373384dba4be43ba7965e9b49a1e7446ae7143ce58234479739c4eb9a2d875beadf9711c2540b6b6fff72880fcb5860d43ba640482f1bfec130a6240d1ff2da4eddd6dcbbda54c29a5ab06b306b606395606071234e4ea338661cf3cfc05685a35546065e4700bd863af636bb2c7bec52dcfc15618f60b45c54e547e9c738996289bd9cca4943e320c1d8cc0e5cac1e5f3338da872ff3494067988a6f3aaafe0fe25aff35042d0f9d987d1155d8e5a1f3d6af4c52fbab4f9b594afa334e82f7841d4aa17bca0d2a0fb662ec5c1581fd24840b5ffc142224df7fccea459d991cafc718890668d9e3f128945b66606bf793694eaaecc8863cfecd17c7870979256f5f8d3743ee4525ae58ab1677e3ecdd2b6667b7e8f62be001eb5c2ba8f16a378f7314ab3e650f7f138d2e00602eabf95e34fa6cd25cdd298cce728a5411f91a50cf1d0ca308fcca5a4593cfc5dbea4594cfc08b7a1f4d30bb12fe4f843f2d03ffe34c84722121cd090eb9f9fca1f4621953ffe84510978e45d11898311799a95394d5fb12a7e25cc2de817958772e08f4a9ab597125d2828f4c5519a35d475359c471ff2ab72d83f8e04889934b8a441fe26e2d7a689997d1a0a734777ff6ee0d48daa7d3cfcb3cfbe39d4347be3659eb62da9bcc953dd3ae79cf377c6e747ffe93a26157a658b8e10e7f4d1631cc35c268433d5bba8fc944750f943940656c59f7d9ccb662949a3975d8d1e0d720df2c8f38fd5b78f7d56865b2a6b318c1a72f59906dd5d9b6f33dd7dbad7d0ac140cb3ca90ebe7d0b1a3593b002694c3a8cd2b4d300d72fcdb4757b352a3f759217cc4f6dcf66157ec875be0c79ef999c9d68c7e4e66bee2fceb935763f6e1faa7f24361d2e354ed237941766ebaf8a31cba0fb273d37df4c29d1a9f7d580610aaf61c84aafdf6855d479ef6853baedafd56c7e9beee354feb004ff5ecb793c0de74d9119557c68d414fdd6f2f4783fb91c877b82680104e9c3859c28993259c2c111404c43cf48e06a54043eed9c84d8a2e7c6b256e9376ac8c7c8f5f0d2bd36aa02021ba20d05bb19d7e776b4c540773ef22a3f4cb26af5d2ba324ca505637e72677f2dac5153b01b596ac5c60a9543299be64fa9229fbd2e9e3e9e389077a3a6ded7299de9bcae9c3ae52e5f794266ad689eb64387da9894a5b77e3743a7da6e9459407d5d3d1a7b98e729c5783fb92e7e3c79ca8203010b60528427ca541d39b7e8bc1c56699d8c44556fc4a7777130de087496990c9c5f3baadb0c2b6030d39888356c685a3dd45ac348b05fc47a182808280dc7bdcc787b870d012050108db024769957c2b3c458ac7412be3a294d24ab9096faea88b7851b4359433b9705dc454642a3215998aa8e9a9899a4ca6df2f9e7e3668fa138f19b77bc1f49d4e5ffa4e279f14f5208b3c7d202884f3b61514e4402e0f92a13fa940a62f016dcdde3095fe06aea66fba9c66bbbbf4a52f5c2a314eab2622225aa0adc94e2fdf5f134a87dea10339500bc779354ceff252e9b713c779dc3b68217a89fb9679f782d71d2b63c2bc49a107aae9f348132386c7ab2a71b4f4e10aa50f4d35e4a0d2875ae5d29bbc5d9952e96d28d5d2b73fea64c8bef4dde00a12aa3e3dc44246313a18684f69292a7025ef86594d4f9dc685b4ca954893fb380f3d541ab4d23a584657a1c313fa8ab5a24a97af895646fef6a2db0eb435985f297275bb1c0825651505845265f49703fda0b9e8f4dbacd3c7452d5ebb942ce1208fa160b5d4c4936d41be8dfc66d2d4f4ed6a170f0f6a50bebeea40cd4a959a05b69452b3dab5a355f299879d1234055577ca150e12e272b936171954d599501692210ba172329c3e06319466096d4d77e3f4f15d5cbe9087cbffe07a45e9e577152ba3f4b28585a65dae22da1ad34bea6a178aa882314f5e8cc1b978b25297976fe334ed426d52b68b6c17d92e2eeff221584f9e0335280740032a3f1e271f3f28e7b1e6979acfbd4ccdcfe5f3116be8afcf815a40961893b76365560955dae50ee4342ca455f2798a5c44aafca148504a1ea8cadf54f0e6554192481f2ba9fb6a5819f95cf9b535a3cf05edfbc1f2a7c7754a9c91860fb68571d44712bcda6b0771b1dba7bbbbbbbbbbbbbbbbbbbbbbbbbf00b4ec22557a9602c00a281562b89c5a584cb444eab86da461dee4ba5f9e8517f77cf8bf7cf7384d4f7a24005db798b9bb63ee58e6a8889a93859f01183de76ddf795cb4c1033c35fb97e9f40897f258883a2409c08b20098aa469e68b325182824295af56c99f94a250fdfa2ff4a017707abfa13cae0278f9ae9301f5f1b9ee06ea23ea230ac5420a002b389122ad921fb7263b82f2a273bb93fc5fbc59630735140078dd517ac86b290dca8fe135514f39794dc54a5f296a309cc775f01e779f06ddf39c88fff44b09eaff72af21077124fb20aafcf674384d0d2d5b7ea67510e85783417ea45f2e9965d9b71fd91b59c63db21bc3be10c3b0974631f16a1206cbccd2043228210a6c85fb372f20b054d028b8e05816949381392666c64830a83f7f18b3c2f8933ec4c470516403c0eeeef2dc84adba6fb32b9fcfdfd360f73b9d8e11511d7472737274d21ed22c225387d34ca289f5c0c52aff25558f85d852d1d62c606be29326d589a8fe5996750f426064eda4ca1e2b69d097b0ab41c7a4a04d73e8a8a1591867ef5d0d1fa9516af42df105111a5e818b8787e7032fa16671f57d01315012356426d59368a2861c1485874226aa9e84cb471a3333f3beaa675e0e1debecd1275019b9a04c85ea0e60677256655b18d3477340f75feaefc745ca2f846c7511b632f98d7c66155eb07b44f2c3eb9d96b1bc8915e35d7e9d06f554852fe49e93b70db67ca60fe5adabe8b77157fae8f68528aa7dd95764c3d9154b40aa7c04c9c73fef8f4941c3597f6a4f4a51a84775f7f4f473ff641e5a3121586d1c57f553147d14aa86a0ac36e41368fc362e16a6b18e4ab09ad67d45d14336020cc3dc7d9ea07a6bb14989a9c1ffc718631c2a5aadbcb812b32ccbb29759966559d69ad1ca3289c9968d9c59a2b0b563a8069d56abf5928204ad56bd128780a26bb850ccc032a693999923b018638c31c618638c1851ef90acbcacc85c2557f715c5162d7944085cad5aab566b35b35acdb456ad181822288721e4459899313531337304c3c4c4ccc4ccec4ccc2a266635e31d330336f80df6c7e4801243b3f863626248ae981aec9ae2f3d34c1e1e1e1ea09bfde8adffa26ab0ffff8feabea208e3b7ba3f08638b1a3e900e8db93bf3b71ab469d0f99b27f6dc9ae1dc58f74c831e33a3593634e27b8cdfcbe28f11f377f7e8af287650632b09a624985ca0c5aae5deb2f196dbb466b4fc5b336c30d9b2f16f8521d098dadf1a9a41c3b7d56abd869050824705356cc915bc868c7095e02afe2abecb109f87b7fc0bb16fad1a5c39af5a1cbf18b9c210284ec70fe9aa86a4ca8f2d0db6aa9511e3aafab75f5130b1d2c263686666c57ee6b10f67ea8c66615f63f39b31d35a1d9531dfea3333c2affcad5618029d199a11d6fe9955f5cfccbca238429da98dd55582678b1a8fe007f929ca05fca00fdb06b0eecf4764808c9561efe78e1f03b6c697d856d99137c095533054decaef34cb050a82b0c4063c0c2144921b7ed069568a1e4c71851292980209266ef8293f8a3176225b73a5993de68f696fd32d5b661fd72af9fc7faab235994960f4f3bdab817d4ba37ddce67f8a9c0ae6e38e6cc70173ed65990bb39d3f4e23dacb2fb62aa222ca8536b96dcd3cf9ed8d3ee3fa33ed9469cdbde0b2656fdf7ca1d96f1ef7528e9e9e34f9a30de33e6e4cbed0c9b58a1fe3d94a6094b8a03cb35d77c74c49e46e8ca13c9d5a4e6e42529a42a34a53a0fceeee930a8f524a2c2bcab22ccbb2ac2b9291a86434fbb26cba5399ee1e84b63b23f6d16893524e8e9e744edbc66958740d088e93df4929e37c9e5fc4322a5dd7d9d570f722a4f8b109b747191d0a0d1a5e6c9bf4b42aa587d52d72d29375935b16bd99d5cfa6c5c99136f9b507a2c4341aaf168d2c5e98a61dc9b87d6e6adc08e634397ad239c520699d8f1afed9488baefdd05c6fb37e1b65bf7120f73aea625f84e1f3ce3f1a59bcbc9df7b71f8e23418c18892b95ba1af24bb4ba4d97ba7039aaf1b38142b33696d1c6db67d3aafe5985328b5651aeb201ed668d668d5bc362eaea763a7530a7c9d1182ddd0d1ea7138bc98573e97cd4883f514eb3fdeecfd36664baca089d23cf460d6f991d47da6270313a1f35469f75e08f307fec4bdd0d0a845f9fab7bd3a361a3c1b6a9425992e4b72b13923a15628dcd8a1d8adb6675dca67517044f252812445798b8848a28a2c47c217165a758c20f440461450aa83ce186a540a58a12424882080f0f37c89cd0785e4708351115402f239ef03222c8890c033d10b182094f94c0074fb8d00404427811f9c1073ea81abfd3a95540a38c31c628658c31c618638c31c618638c31c61851508848f718a54b778fd163f4183d4677f7188286d2607837144c07a1dde576b7b7b7777d7d7bd7d7b7777d7d7bd7d7fb429dfe84565a6c23254019031a72553e863df6db450cfbed390d8c57a29568a3c18632d41368c6d62017e3c7d353e3376dba356da469236dfa9c9b94dadf1b15317af4d8add33f351ea9f10b75b8da2325e87e182b8f98e827519a5898700503d3ab9d9951c06a1530d33342443152894da5a934163da5b1682a4d45ca5db9929995b8bc7db87d5c409a3551a8ec81340b7b14a380fcfc206eb75a35b65a85e2956b456755f1a90f7e7032a3c6f71991a352a031c7cad8cb3b5626d6b0040d5b3572f41e1a3840065606c83a5b837d44d1dada1aafd17f9b608c07a811cbc1088c318c6b5605eb728d61d8efd3222001931bfee59f538bcdf405fdaa1262c90f905cb1450ea0dc300f0e6cf0c34b07527471c34ff951fc91bb04fcdf1d3b7a333367e12f238aa32e3f72ede811e401ed18dda3f7a7c4450654872832e8e107278ad8410e5a3481a2440f3e4efc4ce917787b4ba1b71783b25f0a273e03aa8af2a38cc0fd5bb395776bb666bfbf7f8a107c7eca8fcac04a6e171ad0f5800f4418b26264892c7e64c842a8881e1d9c98e08930a63831052ca848810820181141103458228c130c61e29777ff4695fda89d4443a0ebed7dba4137f78faefc28fe9d452d56b8b77f93f2a3f8275f1153b9f72b93b2a04d1373c331d5a6d9c9decc1bea2afe157f8bff41f6a9dceeefd31bb614ffdef42f4c7bd355fb4c7f1fdc5dfd906280262e08e2490cbe20a2c7951415c18424503162094faa2401090f151994c089224338210753080114a684c1cc14b573c518b632a2fd1657abd50afbf85986c5e84428d78839b732d8875ced8a75375a6afc95efea068f9652863f649d5f88fd0dbcb3ed93cb96b05e63c866af751113034aef87c45ebe16bbbf591e23079ad590c35ee0307834fa212bf685d9dfc03b557e26e38f4dbf8dfe550b8a9638be1c21a06d1b0df60072a5071069e30fb48ad2a526e74bcf5699ecff17609cf318778154b71839d0517710e8e15ef63821a768d07efb68986fe358f6a61ac6c46c8d7c7f99a5b1e14accc6b840aaf2ebb132fe272e280e4972463f1f87edb5c7e1bba03824e9c741fbed71983ffa4fb904c2bf0790183950f93368bffd0cf353f28b80f6dbe768bf7d7f39f347d9d772e4adab703c06a7f617e2d4c670aaceca33325ff3d63f1ca107aff0704f0f201d0d889a521a73e434e8ff355ce188e239381ac3e2534a5d20551a6b4869865379f4ebac4e5dd07595f7a775af2ac6d25bdae0cac6c6aa25ab7077e677a72246f6c81c656856af6263e6f8bfcac08180760db9ca5b435ab51e6c41a491078c8886bf03d52ba00d8a120304746b48353ed81ab590dc5675e4451e9e1bcdeb1bccc34c50e466bb1a382821d0477ded0144c70e9fd8514ae6dc4babfcf7aba1c1cc6ba982ead4d03bbcab21b35683ae7dd455feb232fee1cbcbd690aa3f0a55472fc1cde326547a7408e52d722f5bd3ef1f80a5a92ff1bdbbb1578c6ad740eaa921a9a7dad8d082f2038183c3c646edcf66659c0baafde8b7edf8b3fe0cfbd5595523da53a7d1be97fea8d3cc1b7f148e3f0e7f1b7f1b57b0d696d8a8a350feef20e8ab12e7beab1f0df6734398f358481534649fee755695e33e200d321007312f31c2f23dfcb9a7ab1a52a117e20fac2edfc3553cba5fcda02e7437bae77456b51b4279db06d07d51f1aafea6df22a9593950af3ee21186eabe8ec05343765111a5b2cb6954701a976fcaf22dadc28735d6b910bff352a4e73e75a3f43bb5f43ba5fadb748f4e4580e55b7e06969fe1f42edfba8ad359d570033bd5f4fe2cdec97b5731bb90e937d3fbcbede2c82399bc54f7dc9b3ef352dde84b1efd8dbb54045a9ee56968f9d655dab37c34acab4a1eb79d0b1d3fb67d46587e34755695e563d776f209faddddb4493be8864273c1cb518b1bdc918b4eed33e6368d3a5d59e2013c982e333333333373d166a369f8e70a4e8e1d3f9238529997c80a3326574a297796878cf8f9999999ff267a5b351433df30b3abff85add86f894ac94a690a50694aedb7a114880251200a14724fc842bce8e404ada59ead5940edb7d91a47ed9314ff4ee5cfc7be94eb695e110a08e8cacd7ab4bb1b2896ae482c369d1ae46a0a4e0e8e1cad192c078e1c1ccf2bca57eff541ec5bc92d903c8047d01442414618daa02988d4d6e134f24be1cc4f49606fe6a76690dfbfc355d2ebe12a1c1d7424c9c15ebe943f3f474630477ef6050197686fe48753a6a212a87f517ce28eb76701b44b982869b05f0a9a3d8ef5e622a5679f971f9fb9a7f4e198b3c3be9052ee8b1f581baca0a73d0ea769e7c6d14595796e36d491c7e13bb41f72bd007ecd6bb98a9f81b0963dd8967134d8397a307ab6a111c3ca69a804650c1e0d1bea342b57f57bc5bcadfdf1db822e3bcfe6d90eda23fece4df6fe409c06fb52b187abfc776e785ce5dbb75ce5ff4192044992933df64192e48c3efb4dcb99af7d41501e24fb828cbe2be1d4be54fcbda1d897923f4ad190bdf639d88fbe2049b42f08e9490f49a420c4cfcecdded8c071954b2550fe741af46f02e56f6cc7db9db0bb5fe88f7dcf58300b4b6dc0c6fcec6d645fe83fbfd4327ba706bba51095df89b1e0aa16747320a007e61d68c725957fe376a0a1f4a9ac01811c9530355e1ac430c6b86f905dd5abfc56c6f8405d6a08d697d8bdf052d94d5170283c59e9b2e5affc5ab66c19e5b25cb971979d99b9857dfe5e564155fbc2dea91dca4f878b6afcf63de49c88d3706055fc1fa024a89c02ee8078111fd220ff96050d776af310281dda5cacd0eeee96dddddded5dc32e5628ff7ab77777fba8318b16aea431e62d3c8081793919e2e1c45527704d136f84409813e5b8d38b9323f58b1fb0a0862b181d14b1830f448451e545041752d0aeee8b882a1d042aebbe889842c3499119b7c913b53ff6ce5712ae1aa3c6baaf2642a821aa6e2cc21676b77b6d9623686c7e9623e86c7077eac65e6ae31ace59bd1a9fab91f805f1c0cdba8a3f4fc1b0cf753f962368f47cc4aab344954838599090cdb1599a40f93d3a17614182f2bbce12d5d87789ed6340b87b363589613fc81fa23692d2889f91478f31762c45484e4a237e383682b785e83878eda43482723f13d344c031462ebec432f7896519101810becd38a7866155507354838507d4dfb7d1866155e8d6118175357c5b881c865529d261a31a743b743b7437dd5d6e07ca42772af4f8d459e56f4f68fc0eab1ee8aafed547195986acfb2f261a5096116bd4213b9625347ef4a92596e175ff44297f3a7a40b9056d763770f03671cb32b098d9f7e3b0f8c3cda246205096b118a64dd9da949c203b394176168382320ff7f400c2379352d4528938f8c76fce2071882fbfbdf19cc4df36deea49510fb6bea0bf3e50c1104a403902145028b9d9e9c1892a52c0841330c187a29bfe9d4e5786b96317dbd22fe82aa185951af21123479ab5b50a1dea36a9fb2202aa5ba94146e2e2237cc44889c696bfc9df2f6cd5ddb0ee85d16f8f3d1b7901626bb6ef656558b0324950928d6efad93b9f566657b5affdfafcf5ee0be936fa4201d4f0c38542659dd611cabf030809dbc230dbcce061c108d2ac70064f47e3f2fc3662c0f9d1acd1d69dbab18dbcd48dd1939ef4f198bf959f44faa6c76db1c1a5f5f4a42f8c0dd2277de1a99e583c1ea42ffd466a616961f9523758def42fb0e8cca82d5f48fa1bb8b2fc7c13f72c1ef7a4753aea019d11438e66959e4b9e8d66919ef4913ea75924ee7080fcf06270f16c5a9533a332b7952fdc29e10c9f213cdc5324eb625b98c58a406d6cac5a534a49b34b08b568e0e4404d596d509421221931d4cbfb547e700a28a8180cc3301a2306c6ca84fb11f3c2dd97bf286686626363d5621e6c4a1542b5a6eeab0a21e1d4bed31c0d41e783f304033a439d56cd3eae62a44b9d2b139eeafc745ad588a6f9a9bb614643507681014a8612200cc0ba54a6f156b5af9a095806bcbfac01fdba4ff751fbbb3fdd636d96517eb5dfdaff7d30075b8aef8ba214c5ab699ffd688710f958488f3d7541b9273d8de9db0f28347d4dbf75baae0abf72fb85a34ff378c4cf36771901ee494f03f7a46f5d4543f7727556a8064f0dd2277070d8d8e0bc1d75d6c4b630dedb9d31e19202467767bbbb3b7f541efb3adc9c9fd1ec131f1e1e9e0fdcccd8bca420aa3ca3b88f142bfe8a1432a8614b8a10ef50e5c7b29711ae545ea2f2531d2a3f4a4a50e52ccbb26e3fdef75f1daeca38a134336990b7161ff61b2d89026ab4c469b46ff6348b6ba8237daabf37b31350df8adadfa9fb852c7b6af6a4495005eb3e015a42dd22578485aa09ad0cff88bd83c05e51fd43d4164a9f0743f2d4acc67b4143940f711ef91b903f3f57bfc0420d5a196ecf88f6da375ad23e5a32eb880afa351c2da92bb8800044111f40f262e2865f2e719a0a0ca9c1144f3021c4097070c32f8bc823a50c49fffe8c5f8a7fe726e30f4787f8d8efdcc8d7d143fb96ab3a8bf2e3cbd7be2020d60283cc19cedf9beca3f14bf9cf947f291ae4679f133fdbb9e1cf064eab473f907e1d3ba4b7ddf1896d61b6e798798403670a6622b4e1346b3481f8f7580750ed45e4aa1a90ae7b9c1c1c38a5526a86d2f3782c6ffa2439f44b5f2a3dcbe7949ee50b92a43f4829a7f4a6d2474b5efa52edde5fcb062c80132aa0c206206082104ddcecf4f8f092d245151e7e50b061dcc8eb7e7adcf3cbd173ccddbd5c7b614ced38be4dcfd73c8c99f6e82307001daec3ba1a5d8c18d63c3872d7bc757bb16ec731ec54fee4fcd163dbb750e1df03c836fadefe47fcf6b8ca5f0a860eb741eebe54fc9d1ab7f047d5e1aa36da60e86ff4dda6626fe5fc8f0469d07b34e89fea8fa97e4c5a21a4c37f873f0e0ecccbc1c1d1c4bf071018e7da34c4f4c209c3c215345ccd342b722dee99d67614b60de468735cc7c851f277e52f9c409d0dae155be948832524cbcc2ca4db3dee47a07d2ccbe8ec6a9c42409be38aa04bba1a4cea8e806a7f8b143a5a5277045447a3381a798f78b43148e14e55c154fb0b2d50e373b7478945ef0500b7e0dfedca441b1cc084faa39f6ba76020551b6ed4f891f819e3c1c6972557dd66d982faf7a596eb4edda948d841131a20e1ca1741f04c608a14273d37089d4ea8a4cd978439e9149104005000b314000020100a06c482a1502c9ca799560f14800c85a2406a4e184ba45996c3306510210418020001002002303233330c009bc4eb6ae9fad5382041d6f6defa7197281ebbeb31903c6b407ff8db8ee315dadcbd1e341c6a99e46c9070ed48453625718299c80b96ec6fd45b4557098156c968c1b6c5fa16ec16508f681445f4ef8ffe2838bcc16733912eeacc3a9d0e15b072296d36650420f6cf609d81b2f30213ae02862f0e86a7d717d49aaf22744f124e73f942800ca2e45eb0d7f9d3e2c4e1850ffbdaf30d9c85ae69d0308306cef750dc2fa8e22cf89962c885683f3648630294d2c4da02b42f6b15d45f4f8bb303be34b724655187f7bb7ebe9c07001f82e511f139c610783c6da58bc6dd56e2c8864e97218847be6c02f11713081a11f610f25863dd16b38293f90148185ef85b3dd10b4f17e2f6cb1d730ef38aab00227e199c5def0322a96971c1b8655e7e97cd84c4871826c9e4a4ccaf48eedac91b0e3eb12295c3ff007649695b626c066b22131f6e4bb525bac3ec17cd53bb0b391be9c6f32328b11422ae7cb61449ddec315e427b36706122ba4727c2cdf3951d19c13341cf685d76df3e46eafd217285becca5468cba9b4032bd7d0e8ae4422523f3428b735d0d9985bf0be5f4c7a0d368fa1ce743528cf460f87982149b0c85e82208db6d4d7c5be84258c18cdcf2da08f8e683a16492003349dd7dd1adfa7504e608129b64ba6917a71108c17130c84bdb13e897b4e00776ed2ff3264ae3a0748cc748620ae163d2ed6eac50342a63bd49b2e2d341afe31f99021df4a6dc94bdea42bf31e06dee040608723b1321f90dd7dd441390c6a0be0ae87b4c7ec569300007d735dd89fae96f3a7250453662bfbfe2edb43250601f204ad12973a00265395ed89628e48a4488b196cb2b44409204f0f3e6160bbde7de4ee3070e6eb5321082eb4468fe6e50122757294654ff3025496241098e67853b9fa935e6e0e01626b75682ed275c2e9402b0e1d6414f561899d1ccac740660615521e86dfd3933eb85762fe037631c9823bec309381f0f00db7a05322e94023ce9b6c3b2f098f1645c085a33a8454e6b092eb3d3ca5db409004ef83d95d02116d484b1f59b14485373e431c0191e1501159314598dc1a4f5ffe965970e6d04810e3102f75a9c2bf7615110ac8ea6f0970a3968903304755fa382b6a53fa156aa319cfcfd65d560c63428feacf146b60546065917bf28ff28265b25e8f9ae235a1bce6dfe5faf80070d72e38167e1888a1afbd4557699a99772bf4f555992d621a123adeb72f3fa657cbef3b6b6c6725cdec35be0fdf8c8482f1807cc2960e8dfff5b690e0c10c9c354963e0d833f3e8ad193d79519f04927fad56269b537d78df9c6447ad0c13a059b132b0b55a4c0f579420cda7b46c3b0f451aaecb53a7b1d4a37a64cd57c6c1b4b41c545be82b7ae337be78b3b5ecd9519727bc0db4d62764fb24b58aa6173fd9deaf5a700e97a5b6b980b01b317ba59ca53e93e1a201be331d22f6684e7fc29e80a3ef8b538d0a5f73a809c2570838cf2993ac381621cb74c06f985d3fd1d64019628bec737340317d20fbdf119b734eef14a9c780a12a771e9e697ebc0c49803cae5d2bebecc5e5729907ed3c79484341d39cf4e441469b0f1f1e0a03e5a1b5944d48657227ddf312352273fd5b8748fe20652f77ebb984a2201c122a2100dc5edf17214c59ceb87395025e2094f4eedf3d033da85ba6c35249e66d66a5fb4052ec37bc6dae8b0469c95ea8a0beb18224609e376014449a70c036d958edc0e474253a50c374f04287d5c66521d7063a604adccc4ec8432c15c4319cd022a16835b1f7180bb711f6351df602046f622566fe3cee1f4b68428d62afe35eaf05911ae75e185feb2bfd724a6bfb3f871c0b6b551925617a0c6b81a993363400f1fd9e07dfeea9948725f9df4a5a24f748577eb661c3a409062a59049acdda90080157a4a4c671a704fdc2120724c5a3383ad90bad97bbd3242646b7a418df5a12612e4ca553988e43a0450b8adbc34767e3dc46b454f72b6643ecd2a208aa34f0141ccb7ee6bc1b6b70db194c176a77c4920dbe2446d7e54b16171d853db9228c9c5b6611dbb59fda8baaac287adca599fac5e27a6ac74030cbcc701c66a5da301594d95a9298d3ca9c67a5cc10056d4533570ba7d7e76f035ec7747a0e811817c83848e5c0eed4adbe3781ad58919ee4e91263c83f5de8655b0af0b322d0a9ed336a5b405a9d500272c08befeb9e9c7e4af1874bbdd52325ea68fb1ef8922a180a57fb40738bb3faf9d0cec26be3063f0bc0707660ed60da9b7db56642fb10e960979eb3df93ae9203be08c9ce2ef5b374a13905c6ed63063eeadb9b426a2ae48aac4efbbf071ba62cf92660e85c6ec58e3555019427f652696d71a836d3cbc203f3a27d6e49adf7f5c2adc3a4abc0ef6474407dd9cca41003006e1604b111078332ec4b480a1e20e29fd44fa360da71c07c388c6114b4df8dfff9e8a370cb78d7ea4bb86f7b98df11b104446c5867f6261548ce1e72bf6c0b6c0e9c675893307e32676c2fc9dcbf424b618881d320f6d6a4acc58f1477c81691399aae74c309fddea210bb90e4b0baff50d6bcf9a027fccde0d050532fb805f69dedd5f13729b3854f173241c8e906e00148da35a4282803f26a4c88f0e5247533c0f541f7ebbf139d74a25501cd1559f02ef3f2e48e64649e53af5b90f66677dc111183d56720b541c00c673f37daad374c79e689e40cfda381f0a5fa85665b86a1a853b42252283e2b89bf98ac88b7a253af27c22efd54443922fa5afcd7b3c49a2bc3d4dc7e1f32624a4899bbaa32489433ab02bdfd502ed4327ebd33409d4bb3aa0073c60ea6bc57438168521ebad3c42887b7bc1d54e845afc07183ebea4e22b231bb675d9cd268150f640b332ce2240ebd263cb9dc9485013a4fe064e2d80e074a2e8d9fd90c11068822ab2950f44fb662ef1ee0ca988880b48132e098df2cb264097bfa8783cd8c2ab739f0f1f5c3d73212365168d96c93641262891517590ac6a231299805ca862423318a8d13f945cb5caffb71d6b2d3ede839c0605cc937ca24e65631905e6ce9c994333288f74467d5487090fb79fb6193dd42f8b4c9054ac37347dd0d9fe6ea06459293989154abcec00fe941513c7fdce6afe0d22a19dc19e34e19b296b6f9e1b316eba74480ce41e4f806af0695b39f78fb3232850f3922685db646eab1070fdaab07594cbafa65a277dc828c6d6b576591bc7aec6bd098f31a8e125526b2484a3a51c11e17b6d2e47dbc971e4d0e05231d7c98845d0ee84842622ce6e6b7a33b884baed00542c9671747368246168c2f0076a018497f0877cdcb4eed1263473cccca88f0d9f93f6ef892ac36c4b660b8525ba0a2aa26349fa677023e0d6b8c249444c87b4d5d0837ea8a6b6adf6050a0c97d3073616e21a1a973387ae87d6047e140b579130a9b533cba1addb8e60171965ab30578a8fefcdd1e84a1f595bff109549f5963061973da617a06e22847928fc656b8508b4c87ac540afc51f3515c8954e56360d615d4808a0e7ff4ec14500b4bc08138c6d7d97113a7bb4fbea317a037bae6f0322b56f83445c92312934243bb3f639a1d0d4d144ed6a46176b5b19252ae6ef740b1bfb8a8a04dde0721928e22054087011a2f26503eb446a5de39c7c8bde428e3139d6c1f41d6c82753d9627e2b9a1ec5eb079f2302a09d82c56ba59d86e2ad398cfdae1dbed99ce9275b71486ce01861eaf95c1ae5710ab57981492c93fe912c466590b3ad1ea96a4eac9404dcc2e41e9ac2f052347155d2396a6ee95f22d6e7b21650cd1c0aaae8d5c649bf81a7bd8f4e313f5d88cea6b833dc16d94982e58160faf3b419bc61270c757260426ce39ce2a7ddbb5fa7880b12dfac1e231498f39aa1704c7e5edac52f23903cb016337b2bba1b4d8fa554ef890f3048814e147ef9326b31a492fdde10835c41425a348a4484d88c172dae9d4e27180e02750be23c47103af5493575d713910c801704300610d863cd4a81dbc68524f2624b6b21aa6beafcab6182f255e61ca8bed3db25b7c849a61b9b10d8c262225ff23483157020d2d3b1fa70b096bf24260c7c625da8205bac4b714dd2b77085c52f42771a02009ece5d601be58c7830be9d0f94ec8f932e66eb85bcf080464c42cd4da6db3f854c2e8cef4dd2793952f4caab52cac3620b2290eb169b98c63d8b5199b882cb2e3318c24c9b16305f8ce4371aea217b1f7b90a272a391ebd71f75ab304ab32515aa743ec3bf9244e54205131561cc0df90f2ada81d39483d2c24e89e937f554bf70b1da555f72f803e8893c7a4950ae1051a91e0d4b8aa57d48f4f28db7282bd45febd57d5c4ae0a5b62aa2ef0bdf756cdd056d517c4d4389c6136989a3d5860090ed38a29f0db6bc068c867f756df3568fbe9190c1ba97a3583042a26f21797ac04f9a063199f8c871ff228a2280b10d2c410c4a81ea2c713d5344f18f13f5e2a8311cfcb2050677d786adfb61e6cb40dd33fea4bcd4fd50b8db8058a9c3029179c447bfcd67a75bdaa694510fe5e04f81a21e4da7bb602682d758e01f86796acc0e06b2f788f93e84734c57528e3d0094bbc28cd2fb8632cab1620499db91d76f191144d11ded5005c170f8d24c0136a3ea07c28fbde1bdbf4dcfd2795e0bbd2a5ee3f1440abb2d586f12d09fff3ce8c6a47075aecf61f7dc58c606ecc366421c189bcfe1a6b9f77af72c28bfa92ed1b454fd7451786c20e81056c914439b1b75ef5b05f5bfd5a36501ffd6d0ba00443200b951178b660b7def3dbfe2361604d3503550e0a3d5c1030d8d614e4a92b5603ccd1bc3d8ac46ddf02a99ff76241fb12458fec373bac80e6550d0acee1b4a348ecd80f214772eead51e686c611bfd19e2ab67191dbedbafd6af88a30c5a7a4bfc27ae41f1ca21ded92c81dd990e089fcacbd665842d1ee76d9bc1eccc8f28245e28800494538be18c10caeeb59015b2d9b947059896f132f3b811eac3d899c169d4f12c07d5d616f13783687051973767f91ee5115ec94840e3cfcc8db08a3b1191d7dfd2eaee63698523e9198c3939afd7ac331b45aa21e3cdf1300ee3e546997c51c1676e93e4a593e5125f081d3502ca9371e00e2006fe87341ac7dab93c87211c0106f211ba1cb6dece8dac3ba476c8a4341c46ce8be10a9d4f0d7516c67b0477823903a8e65127489f6ca6b326734ddcd6bd8d35f39cb7f9b6869a68cf55c4885b8ad5208cc7b79cd91536a3979de1af01108213b966ea7571f4e87a0070a5e18e7e22d8694decd4dbd2e2bbe14b232f19b0c65a916f8dc850927078ed01cdf5ddca9a7654c540395ee5d9c46474e2d10ea2538243598747a315062e67c30bc2c763a98115073a3b57dd96d9a2a8144695241a6d66383306abcb4ce1c011f5afec7bdcedad2f4476839df4947ab006733c41348e3cc41b1196b26a50f7eb086f2c6d93a6496e20e9f3e6ebe7834b24a4a8271d49fb7df0ccaca5c9bd7015c10c81432e8f0128412faa7640d3b190c2499448b3d5de6e3e22621d51c0e39fea30165097c0de3e6aabe428db25ea3455a3c6112ea739bdbaa7a720bf7ea9128905d214490936f3c434ac808967f6ecbf5d00e311fc731de342de3d4039c7d4229ecec8cfe356c519f23dd42126c7a8e1adea99669294bd757a450d8b57b6402426c0b0dad64cfc18edc3f59c4d538c69ade3208f352af46488c46bdab832ea3d328aa50aafb9a6f5e2febd455b00d47ff071fae2bf147675e1eb0557026a4a9e6cc83fa47ccd770121a6ef20d82e5be0e917d444449e34d2eec636d9d8c84e94d3c82bf84a4f0e030a5aa64cf4fa446503d6f6e722d9f174adcd59d6118d74582b988520155745f9ed5bfe03ce8d5e5478a36bdb8c9ab471f1e0a78d0e38a498a48e3a033caa20509e028901105556515573a04e41b33623183cb0c0463fa3acf2bb18cadbdd0e13d8d8fd6c9845abfa310176f980b3a080e3d5a335011555fdfc7adf4ef1c486b49ddb54f04cc09acc0950f3b9371d5f78b8cb6b9c58abd0de0bca2e37c3e89696a8c4b610df65621dfccfe2a23d9793aedf75d9adbe47ddcaf3e2ac4c8441c0bb82358cfe9cc0cf940221e6c43cbb9766cfa50bbc12b1bbce300c4fe92869551df0297de018f37b1f912c637e514a8f3ced12d9778a502f8c4c3fa88f1d923583b6533da8aa9ba949e6215b28ddd35a0de7040ef682b99d62fe3bcff859fdab68cb572a09631478f572103cb0a93e0af69b9c267354a2e6b5d34f61db0bd8269c2ac339f285f037de5e443dbc61d49043f0c25ae840865e95e1adaf098fda6d7d65315baa3d2480b4ee652fd4831e451307a2fb0f2754bd64c0bb6c0920a53ebfbdaea9e3f8cb23e7ab9c88c058d12549cbbf14ce259555487fd31f58cc53cc146ec520078d6563a2c46cc908ad662d16cad6c02fc4517e70744d42ee84427886fd5a7f74adbabed57d9334291d2f390448b9c6a2d2155d06976b4d3f78e253304ed5da5037ba0ce3571aeb4e06e51070cdabbc027888698e79994ce3b545e3a98f5c320ae8d12aa095496fa6b81f55cfd7391a703765863de434a42365810aff29371f7d79e652fae2e4fcf84fd7dff9303442f1da770b2a5d9fa69bbf6430c7e0bd32f0ecc5ec8956f90d370c04c66097125656213203d5b0160d10f8cbfe03ea5cb47131cd782be8da99a9e814ee4b69b6eed321fadca1f4d29afe398dec9dcb61650005e70fa9497f1d38f59a353bb7b01145b92b71a77636f513246a5850d2df4f55e028ac8e066d5b1e7b62e036767169a631ad742dd083cbb88c6079aa93c289fb60efefc57b91f9d5fc8b002b98bb601d9fbb4204998efb052f28f5e59965f43b55268de8606b4cdbf7cca08716db185d71b0edf5914df33435bf44106d1449dd129483f7bfc48270b211bdc7170a9d3a59f8aea56d53c8790354b62c441bac6c3158086922086d4a07cadb790cec40aa9a3be6656ca311cbc7200de1d6c9866869303728a6edb43a6e93786332645bf1d0bf35ec6fadc586bbe999d141b60d69693afa2c3797c023d4d550318a8c190213e9444c407f442bf6125a16a29f8edf3f7de479f54e778e4b97898e5dd70a8feb70d18db9dcdd854b0861a36cfcabcd8788d3430584d5fd1d8045e23db5e9191f30b917959f4f0dcb00d5f6816e7ca31b6cf01b3cd706ade0ce7baa58d5c9d378aa5eb4351ded4196d89820fb944f82e8cc9c40b2738a9b8ea88d6ef7a4d0595485b328062748a7845d03c63142bc8042c3d6639e03482418169d534229ec7a037a77c5843436f4e8c0fa98d1fa6f6b05d69d5c7fa1a9fac8c9c51823039a3046722d9098dfe7175d8e0b5663a8c4a0cd7048b2103e72d4088178622abf84037c6868b7b25ccdce30018394b60a264ddafeb423cb135256ba33f1036193c4c8ef8098cc70094be6e28bd8d35861dfc51d3de0b33c0381d9700fec2cbac1127e6b089d697cc99c9b7cd0f3574ba229bd063a3c49b08cc0d01877968c6eafe0834959a79b6375caad87b874ffaba5cd4d72a31531a8ba59550529eadf33876e57edd7882030567cd895a7adfb85e7c43a6f09d6bd7c3a910615b7913ef5a6216f40222c03ddddb0b50cc57dfc4397b4dac82339e08c44365bfc0d2b8e5db29a0711535ed71666a5bce8dca5933b2d9c9a016310013ed53a98f4ac7e1806dc55c47fc149c23efb13841b1a58639a4f88a3c7af7f332438b3e4fe1353f0d9a4d198422c887712e3346bc9f4d0e8ed8d0d9a0476a27b274f74f6fb4b58b54a47ad3e036e7ca6f74cad837c0ada4929ef32929c845eb2c8e97c90a4ff77e612089fc9954e59bd04732f6d02b7b82440dc5107e6aa554ab3ddb59839c55e9470ddaf56544b91efac3ada3b40363ff7d604f93d7f486d87dd2bfa80eeb582d1952e2e8c28cc7410fd37a60c0ca8a4f5df5b36644cac9528cf65492c2223a0198f5e20d4dfa1047d1c457fcdb450c0bae11b98eb40e94a069e43ba527955f2ee87309a3d6d42d0fc93539883d9bfdf84689e8a5d18cc4fcbc709188569f5a6b59acdcd4a31a88b88ae8cd567157c6bd52d33237594f7718d6afa63c897b9f2069bf8be02295c9fc039941aa3f45112a3ccf82f805a943446a1d8701eaf53c0be8969dd7059ab8a75d7e07d096e5f31bfc0af1dd8536837e73d97e7296e39250cecf0e71aa637dc8be92c95ff84e7840761f811424f0dee16053f71f45aa188e23002637b7656418f5e8b40e5c6ef228fb46eb0b470e37d60fd3cc417e889a69b36d781891affe29fd62734dc5539ad9699e1aac7256a85ed781a3666ed44a774cad05046802b04fc71292ec99c6638e5eec9a03f54972c4d536901a1a5048cd9486adf5c710d6d54ea2c883322a01be819bc15ac78802926f3d74d58b8116ab058d05cb5a43ceaa661c0e55521e74e9cf7b81af53d8c528f4ac7771bb4d38a1966ca1fecdc143b5c71afe25baf82a6ca9bcbda2fa148096ba27e2280ab945330216e688615630401b3612a26013924529f2300615998b95306adcc678fa3485172443f924433d59c2a7fe8c9b4a0696fadf3a040567801d14cbb7f0bff6609feabf3571fb8dfd7638e41f12aaffd352c840f7d50c176265aa05d98d502f3367a3b6d033385bf4f155407e3effd758b425f76a499b94467b059a6d9ab915894b50943d50eddf691370f3a3f59fbd0d6917c828c2c0ed1c7797e9a40861e1492a51ef3e23fcd2299f7b4db9b979db914d53d68fd35e77c58a49d0de2d5c2a03968bc98d8c1eae23b739983676721f90639f945e095d8e5918feb10c897e815d1a49fccb7f6d494925a0d6932a086f2fe6cd2419a14a1a6af358196ff97bfd4bc03db97a33f67db62a245bad289003dd709166ca7622120e7a2699850665404f604058dc0a2a69ce98ea0e57f68dd95d2b65cdbc22a02f30206c6f58ddbfd2e420883d0ee4443710ee5a98042afed1be360c0a8dfb818a6c79abea1dfb65d794c6ea85454b37a010dddf1c3a56610df5f73073847a315417a91a5f0ccbfd955570d553c2aae2b39151fe7d45126b00d2348d12d291923b99374db3c2690ac3384dc170f351746ae3bc2f6379fe1a145491e432e68579e4d6a918081ce9488c3d9d6a5710fe9775f282b196d75c0d6138d955ca5758445345704441ad4213b40ec3b349a6f11d2a099ec6c96c3315a66727d1a753cab1ec3cd873d263e642b73a252209eb92798d7216d40a510d999839f6d08a396ab1b92b2dfd430abfa170db98168c591314ff3b595e5a8f7ede2213494720a4a206e1ab2546d9bd2ddc7a89dbed48110a362337e8d3a10f9f43a16e392549e3fa5437484cb95b608a14f000d682d80f6d0d0441789aab83ec1aea83f6d29cb17de952813736b96cb02998a93f00b0289977492ec3242926a5b634fac448752f0e8307eb48e43aaf2386f29e0152169841653df4e3104ef9295398dff155d5f9be52db74a300be9a6de954fda61e98c7413d21c85926e7f3ed6ca9fdf79d55c926350c0eaf31f66b073bb7248fc2e33aebaadca6665df32efc30ab6d7874d14b97f42694441a94e1710d55469239c35c384b6b6d568f634582ee86e9115d2f3209a82ddc4cccd6c38108b62d0dfff4b0bcb64c5264bbdb13436161380bc29e058d47ca45f00c2db1a868bd6d649ba3a0181e0610f5b5e044d108c8c4c4ac2e1026f6da01fbee82a0435fdcb6d54b1903f661f05b9b9ca389d97d8882384fca7449403b305888293e0ffbc1ef08a31186fb21d919c994150cbcb1aaeea64d1a365d325ca4562b5cef5a03ef88213bcee7b08e2736732f0d697f1cc94c2409503a462cebbdb6ff04e01f685c9dc2d2d067e08751e5903682153f9b2733212513ef4e77874af088ba7c136ef8901d9a8ec60a75433dbb0bd413ca6ec2e949a3605fa1591267bbb589d71d0013b07fce13f4e52f02db0d8487ec358d265c01aaff05099d12226e563ab8fb988f25ccd1b228c879944e478a992d4b5f1b1cdc25b79ce7c045d9771daba857150fc17d3ea941858341be85d3770d306b1b50278ef32f59495fba382a3a5961241a1da300ddf07e399fa0e51bf4480aeb2858c36acbb85de47e03c0c1e3cf526beb04f59ed4b2fd56a6d761490467786f5f6f955ff4163ec0f0684ffde79c1c8acdbcddc5fd19287b673a7d97104a5095effa4a98e19f25c375c1408eca55bd95117bb49f0b4496612d14d9b0f61be1125a47f5d8b1c30118907cf678335a3f875f6c4b9f59c35a5c5340a30593150687ee454f4b3b9e28abe4fd9231fd968eb1eeea903405300a526fa450ea2c3d87721f42f4b43f96fb8c513c95595ac89a299e697ca1f50872855ee312740b9e43c93a102eb8b40b0573dbcfc28a0c3bc0210ed9f0621055cbeacbb822aafa0e6ec4007b01b433b21628a07087c1672d094b604dee2b750910a80876c3e735968860a7ef1838f93673601476bc5b861cd4999467fbdd5453af76dd18ba33081ebb02ceeb78f3584a9db47ea490a2c200918717b381dd88fb45b83303ad569363531dba8259b8b0ae1ac1bedf1e949f292d7f0a5c17286139543ef48010c8c7fe1af9a386240208dc11b41623f9dabfe62e857b97a35262921cd2d1256e055e479a1bd4b6f7d39ab2d963d883a0ccdbb5b40b9e1b557168502e923361879f2edf97a5da1b79c0ad1774c564ae777d351711287034f637c09e55fa0f9697c29817d9e3105a754fdfeef46f34c4674d693545c430ffe901a0cc66e83c4cbcab7815ba51a03676aa6de205bca957d9370f9e04e5c4bef9fa0af7e1e4ab7966385f0b9a829cdd9ebf0e7bebdd7344014a42f30013903d5de0b754c6bba577c35193e10944472c80b2897c07391f3fac8297c4d8e32bd70b5c3f600f65e1a7d627dfae58ddd5d3366f309e2ff5271476813a7a8a18cbd5c7115fd0174f6b01966af6b77700367eb9bbf803d54f3682f17dd0feccb225f931efb2ea59650463491b84b074d6fe77f9f63aae0c7729def310b5f21bd3c9a4bf20351c61803a819bb5f400338bf764939032cbdb906b680407436a3853edf9c4c4e007c3c14513fd84b877b050dbc049927873a631fdc3926e6df0fed073a0f7c7c64990f937db8bbae1362be2e93edd14991519b02bf9a21eb0a811b1e88ea6a14c749fc0b33bc00fef1d7a8b9dbb5e74ad617fc62459f390884defe145602a498978318e7724082895634cd4049478031d225ed66a87ab89da39cd03a13fbcf2c5dc18223d8831aebb6ef72e1998c59235a410e7b0688fde31c9a12e248307c2ccbf0126d0a489cddfa7a1020427065033fa78fd128e309582bf1473d891592f6d4c4b0399c85aedcc8dbf379be4cb08c9017d45aa6d37409183a70e955964db600ec6e27be8ef8fb9035b38774dbd70bf99480f89464fa5d4f50a89a308d6e2463529f4605a4f770a57429d82f20d6eb499fb5581928041c2d65155baaa19d55916a183e00caef4e1cbdc7adbe515ac6485600c83e83b851f41a6d0e3f64ac670bc7aa3decfe191bc9fdbabfe42087017e2f218236c3653aa2560ad58ee5863657e49a6827330f5ce7ce9471d30619a52113e3b5a5237ec1a350a498e94a3df30e9437b2fac4ef13838d45ef705949a0a93c44a553246b5549fa06da14656a161e0a24eb7546613b335c48aacb664c659a5912d723fdcd2e545a0564da13a78beb4c1b38aa907a8d5ff522d8b54907203e12ce7b6847ca68677d49d0e70b3a28ae343a7e36e7c06ac7ab0f5ee8698e5a04d932cb8a67bc686709a2ddf83269c89cb992d93b0f4bbd7570f5d9aaaeeb23c68bb7b1778d485a14e5ab4ffff8d1ef8f1b13f2ca4a538f1c928cac5f2341b51150fd86a53ff7984ff53a0c4a229d479f1b0529b1687df781cc03c7f10821de24c9544b5e634e2cea9df27d55437e2524feeb306abe970d08b5362e714440ad4b400406b0c44e86a0c607aa7686fc24cc976b09530bd64519bd555c8f0f888e29e87d06b1015df6a174274bf2fdc4f242a1ca9d90f0eb82c4ee1662794506e2a339731a7c34caa98959f8a728e584f1acca6079c3db3da32676d01b7c0b733996e6ba30120d5644c13b23879006f71c2965c7eb986c1053b50535c627ccc85c2cb6ab52e1398747a66cc6789ec012d5c81be535139d3e9a451d750ac1cbc11ab26c442d084f3644c0f00b4cb3d59aa77163e5d0b601cf85d608195783ef198b8f3e000ea8d401d10c6a08cfbb77ffc8bccee3a5aac262eff03d362dd620440b92f2abbdfef0159cd0b6718b1c54a594be7b8f24b846b302aa5faad00d105d13d717fd17f12371c9a57f5e0b76bb19887133295eafa92154bf02f90fedc8385787b5871f8f43fede0dc3142a763aa66e829d427714813d50d4081b356c8cc6d48d81a1844821eb78c3b1299fc0eb1c6b711c8fe006cf1dba4b025a34cd175ec9d282cdedfb46d0c55cfcc6ac1b6dae9ccd999221e8fda70fa363dd93475bb40041f025bc917d41515317af8fff2cb58108a85e4fb0874274c2018d59344ffacd04b9ffe147612f8e138b036c6ba3d4c749fbb6d5418dabbc5b62ffc4abd27b77802b7c8d7f362f6810b9b88e3445d0bd939f2a91c5831a77a251bae4bd64c0bfc904bac366808c33656067cfecc2dc721c2d5eb3f913a7aebd42cd7e13bb46f200ceacb49d5b2d679e9b65a498f68be09dd1e8528c8d4be727823770af8bc8fafa2fb313e794712a4c3cabc198e797fb07a11bbc236a76ecdbb8d1678f00faea00ee5516c36f5bf0d5763350cfa6cb345af9c0913e7f2f78e31c8711d644fdbde49118cb08c83c150e5e29fa37271a095945dfb70bcc55d877e723e03492a77fcdefb9e830da46b7a40f1b83891098aa528bd219161b3048acc0dce294abdea87187c102f4f395c6d044a0e4218d684595bcc250b0c369d37246934c719947a779000f0a5c4ca8492508ac1d46dea47e25c668742b728e6046a6aa3c517f74a86d105b9d9c327e4729d608a6cda3b04d5cae49245ae02c2aa056cfeb65d06dd9525a28ad2748b314f3680a820570efb1182977c9f81eff1aaf2449100390f841cc969c01155dea03e278f8e5116c79d4adfa39ddb39b6417f11e295c25187017c47061516a3160543427e2b14a5869c5076d9782aae4ac89ec5fda880a18cdd0f24e7d8553b6e5a9b5609023747b6cf099629f0decbedc1a494f1c4105f9a4c0630657df3c2d3acc1fd3a5b4e6250a09f24a6f315e7d8836fd5709bb70218be7b8b2d93a66d393ae13d557f864aff7f389a81e1bbd7b3ea15c40243b2ce783a00bdde5a068b8ceb113c3afaf7a06e7944daa93881a09049b6c1a1c4a404f8300a34a98ec9fa884c4c98971992720385fcfe94070498371cbf3e4a555a6d944f3b3e03f725d392dce64ec3d9ff5f7fe28791262d2a46b153fdac3bd5240caaf45052a3c4e35ae9d14349501d3a390a126b805a21b55c0f71a96d7625f14492b7ec922f01dd2472914e85f9e8aeaa979ecd674fcb6307d0f606a64efbff3423059a0581986a1cf2524096c109b88a5bd3bc61f906feb368f64d2f7130e2511ec42634c61329344d89d29c83960b7fa8add6d68e90c28c151b3617a3646538ea1e0063bce063a9035c2467ae1ed6c2f4a8eef98c7da941556ae2b4805d299ca62e6a736966a423112060cdad95dfa8c81a06f3fdc04114a7d940d560f514c39cc4fc13a24bc5596026fc3e9193516221c6b3e96e054633ef24031d7b5dec57dae603f3c9b2f61fe21b4ffd4623b15a542abfb98bf1170cca8208fa4293ec31f884ab6b3dcfa214001ef6c46161c43deb85066475939259631b2e0f20cf522e97c03709ce2bdd8eacb170bec68601f212ee0fa5f726a9541de9e5e98c255a0860a487c7ba1380e76ca08952e54e976d8d9fdd29fa5936c863c2f4199d3481d7ba24af39cf4d2aad693452391e02e840ceb3108681e55308e0ad03085329c4db9f05ed8660f63aa2fe9190cef8e55fae083b53cf1b057b36cc172808c7c6ecf5068bd4bf2fa958e01e9e3102c1d274fb2e9e09fa0541e695ba3dac773df5c8bb54d5ce24de01c72e4234433a980600d48353ba37b990dd5bd02dfb9246b30efa4194bcf050a6ec84d538073536cc89d17d2d550e5629b3e457f45c7e450ccb81683e84bc5fe8f62371c014f2d0311780be223fc1791c8ae94b02337e52d9514d6952a31e41ee3e39e01f3d970678928932ae013f8bd2589110cb803ff3b646af6c6d6dfd841b7fdaaaa534703be106a4f0a30dbcf238b06ec6f476ee630097c670770f20f26ac4caa187c230fcc60c54575ef37557adb9a774d42002fa9ef76066d1552422c70614ea02d2aa510d2276d8977d1166519bc8e3ab1971ca1a7799ca64f88fab903c28332f152645237bd0da97c1a168f358854130a08176ad5c4fab4d2647ba33c492eb99227bd34b069f998dea0c95d288f59912ef6bc35f81f613e6f95a84f4008ae633b16f966545d9eb84bcfd88a644cd42884f3cfbb022ce58a492d318fffb4a60a8469cce8ff8918ee8975e05540dacf95716b2f4a83506f2a3240350dcc12b107dc1461a94995978a5b1db9defa8a269ce6868a4e73b058ced40ae4b2e094166287b6d9ab7fbdedc8a5b78ee1bbd4266227d707e4dd714ea7f886f2edd846d090337028530ea325d5a02fc4bb78b245b3af7fda24eafbd9fed9844a2a56243939a79b2de873d27e186b4ef37ea667d0fee10a10dfed3287552f0328d612569a52e79bb909902303111613bb76e5e512ae18822bf5e6c0a865a46a861b2ccabee8fddd40595acac2224192084a6dce56a39c26886da69cceced26568e658c42a415b714b3ff0d486d10105af6b0499c7af47983b13d7c838d8eda45b7a3e8b5050ec0188a089cafa258c69aa69731f5d039b3d9e8e27acb24088061122edd915c9858030c28846d8c15c35b1c3cd6fd9c05aca26e05ce1f00c94d431cdad78b5dffef228a1b47e80e24ec2e83aedcd6e32075b81b24385dcc5b6038a0a2c62664581b57f2524e7d9c3a0fe2e225313d1196bafe0ae4be5dd938dcc40e8c50873b3f9ebe51657decffe05ba63b51d8f4b44348e8f466fc50a31d2b0d9f0f9b92741191d3bc77ab4cb5309eab8c26bce16c8e89647ebe47fe6ceabc9728a1ff399915627288451c861c0c805fe085176e3bef4522ca1e8f5860236fe25211f11eeecc13bbbe6a8961956b62a7b2f70b077747180b6bf7785ce475b0bde777ce7c108438aaef2f002d6e06b77628a85a62c7bd5ce8e4c84126e1663cd74585453dfbd3854dca7c872e5afccb6bb985373ebf356bb125ece57fce8d960c3717aa43cafa5d818b4e16c7238997a2400a43ce0320ad165939f40480f83e5af8a0d8520a0923306e14834bf5867ed2e020fb5e2d46af67c2358775207099b08a1c49bc9c909dee34ae73b6f84c396a7c67d42ca2ed9aa3de2ad4e78c2d92811f01b6dc65054f35b127f30700e1eb041dcbfe2ca56fa21b9f5bb3b28486c38d4ed50c19218e3801f5dd8b82cfaed537e267ac5ec94068fa51c8346fc8730b6c58c8fb58a24a290e1917fd8d161068793f7dceb125d2502cc8639121cb8cac8d7db50950f3c68b9f2c429ef5e75ba1676d8e9e5db371e1edfc6d829cc60ba0f77c0a35ac24df30e202c11ed77190e0d82e4659cf9e960c4bece6004937ab716df1775f49f739858030ae6b9d719e120a533c9b134a067360fe342e739099a592d6b78726ab87c0962330c2aeeece8ea8e766ae29a85b49dcc1e36143c43a9709ac19598bc2c3c8e6374649a41bc2d6d868e81d34955fe6d9d2bef53c221685cfda37ad520390610a5d7847c8ef37463b97bed4cd0022a2db5aeaa7efa753f69c36740aa8ddaef5c1736875cfb980591843c5b7c77480afd8e079416448263fdc4b36f352048cb53c33051425a57313e42f30ef714ac49d7d0837dba07fed79e61ca935b4dd29bf65eba7e5fc14eeb861cb0dd4c929c953824e4ef5143fba8a8aae5761ea274bbe59b3e0d1c83980c20d5f24f2a4f83b2181351d94f724f85ac21739519dff9bd8e2bb72f5a0a90b5ba55cd20ec6c4a6c9c5969b898938ad285ee48dbae8e757292fc432366ff25cf7cc593c19cc8b75e1be78f2db4660d3a7eb5f79c69b96678430a1a197fdfec5c73d8dc41621647fa652bd120baebfd1d7174a44dce2c86854e43cc0f84b5176b601d1eb7b887c96a252ecd52d55571bfccce8325ed0388c0dd632ff217d8e64915336513683031380c2b14fa4ed583d18759604cd90d8e0b61a22b23027b6eec641f5b8e7b99851f5a1711e6132b9657df464ad44500e7eea3f2ab0cb6a37c54d540b9b5c616d7c707220675f859f59b61c6e7f2f94965e6cd34cdc4834217cd2b387c685f65c0165b02e28d8ea625a53f88311d6df445e1f1ef366bb5f43700dc5875c89bc268b77b179e2812b6bc254d9dc0150d8d537ed9cc85fa3d709eaf0dac1b48ea5206ddfbc55a8a33d9cab8e4276c127601a120f8ee5530a680411e52ecc82113c5e3d4ac5e2d995c2a6a5a23b135f56d8957ffea88e590c8ce8231ba5629305702ea27ab3a7260fde4433148471db4a83c5233c5af319171360a4aa58f92e418136f0c828aff411b05fe9b09dd1377c4b836b43112aef049b187073b47bacb14d4b8505608a656ee2db8af1055679b706de41775c044b46d81086487c89863bce6f79a305813cf6278a112a0e6b2841e33cff7ce2a582f245ad430fdfb11609e01dab8f4bf56f2c540ab1739c6451aad248ebf59edf6d636b715867515fcd4c6d7aa34409e90f9ccc1d4e1445019cc4580ac29eba510f12a3b9c54b1672ce6c7041adb799eebf4a21148b5f91d1128b86de525d8767ae9f17484e18e5ae64db071be3e454d68a1605bcc8de7c890af8e71826329616389592af9446b59a59c19ceec7f741f9b6c4e605c096854c44d1ded735593849a1d71f18efbeef1b85dab44c05b766101018fa5457b1109e7152b6360184e3b62388bf9a8f01ca0d8f60a8c8ec50902dd1be8bdc6e48d630688c84cf050548205bc0759ad744a9b4bd021fd79ae436e9ba5e89c89e5a746fe55f422527b3d9395c444e119c3df183aa8a0a38d75f934ba12ccbcfc37bbec1b167c96223988e2472f5bd1604a45132059b62054eacf69a396690988f750383758a398ad854bf7dc02c83de0c25c347e6bd012c022f2419e2b85153a30a416ff853f605840b6e32c71f77f00fc5363ccce70f9afd24f02e94896386ed058ab64fc8a331e3e743578e25420160098285715d9410dbc9a046ea2b7dfcf150bc909b9129aaa1de32a009a39472a56944c5376921ad42fbbf40a47094d11f2e927fef95a4ee4176b59d14fa05a018cfb1867564e344f2e42cb8b84654229fb6b9161d9c5a58d0c05267ef610915539cebefd86d62c1e07bc3dacf4d4db89867e0231f55749ab2671005578aa2a5d8c3c68fea331e2c6f220d6b9b2e8c1a12c1a7908c46e7292f8235f205c485cd00b87717f0b2d0d2a0c712a4432b446e77849f6406a0872dd7437fa604f3dde3502ed88a3d6d58fc69c95ce4fd54c139dca3b35160164ec7610083af49446dc5610a980828c7c9ff29642fc95798a1e729ebe01de3d533f41c05642a14d799b1e8054674e57a44875824b5a2c5ab7b4d05e9eedba26e39bcd8254c5948f88a4fd79322df9a3f39260739504f92177e9b3f5118789167cb5e38d4a795eb163e7a3599f33be2b3e809b37adbff7600f244056ee9e7e1efa012f8d32189fd1870a0dbbb92df93b93e4cab120f5bd451fe7f1089963924afceba19ec9022bd544622027010995b8b0220be7780a7f8c33ede3fa3391338655ff0d7b84c69c5240ff3ee8ee6be2385d76942571f3de01e3d206b2fb572b6a5256042a3d8f59557677c064e6b4434e9ac4ff0c6dcd2986fa1d307ea4a0c80e05b06c3a612b741b34dee5c794c982f40e6454eed8832b1742623eedbbe4d7d621010a2ac1571b5ccf6c95535e9435f48fab6126e1041188fd3ec6ddbc468800311655a6e45c61373358ba9a846395456864e67f0e1e97ae16eb737da157738e8a5b2d7c5f47f52eaf15b3996a7e31375f8b50ddc47030af40dbe0367c40509c9c3ba17cd4b614d2ad56bdc1db818e997b9fbf699145ce26dbb6eee2859ffa1cc15791ca8ca34c4ed846b5eecd7ee1d0eb03c40aa50cdbd8e076907b5cbb347906243c3df9eec4404d46c7f0a7d7e47983f39d3982e52a124f1441df1c2ec76f8fb7d8ff0132a64aae5185daf91881ab803b3cf3679a606d982d33b30b771f37ed71a7e270bf9b60e7c385dc43cb37ea40bb772230b05436bf8581a333b891e4d7fd2ae9208ae20960beb16728f923523fe0ab7f6ac2b3bfe1d022e610594eb5051eec40cf9c2495298018998933e8641f1e9d9187f8d3c3edb43cbdc28e4eba5030585dd29be1cb14910795deb9306449d78a3b34de60854d2594cf72f98a74c0a892e54020bb5aa1cbc140be98b66b8d073bf2225145ccacd84c4b90b9658ed016a609b931216c787f79644336dc00de33bc184be91b4a9bb3fa8c4df9c80b2bd533f65b73d0cc4b818972284c1c01ff96bc3d500406ea90868a58590157a61a9c67f0f2a0733b0a0716d65e8f283d82108b9587be22c5b9212debda1383647fe2e857ac634f2563240f3bbee3004e02a32b31df77a9d00cfb5b821f58778ae15c7a49e4dbf16f39804d9d0087b158919c9238d3779b917964b64cb5c1ff0c7988847aae77cf034b98bf19a69149ccd4adbf080085f150454049f0182f9a5cb203ed887b7a53e4b137e28893f023d6cf70775171f65d35ebe63d50086434540f61f76f88248b30320b249c915a8810cf8fcb6bbf0fd0df7f051b7ee86d0422084093515a638a2688a683a4134c720cb3422bd8ade235b18de9f8bd3817fc2ee2f1379f05c04488b6c8ebb657cb52ccf8d8cfbc0c5b208612fac15a87f7e3f3420d16cefd9b2a119d2096a8a558a07d0963d0c10cb66299184abe50c48aa0664a3c56b624a03d3ace38ad0fc3d8e7ae431e98cc43999314aad654767ec07d124ab45df9de2d8dff2d61d5b516f9d5b89f398293aa7055c88949151053939911d584c08a8826fc93b2970d9ffd96aaf7dd8d72505b4ed84050d2126031626c28e35a06ba212eab85cb392c00aff233576969777444fab2530f4c60b40ed0b403044069053ce392a565978be970bb97eb0739416abd4587bd57a82cdf9d3f3a61ebf5ab08ec22f1667e28f63840a8cb2d63d16201b37c29a2f104f3ebdb77c9a1c657f38d88cc6f1ed89603507f683143baa12a88da4a8d018f8625b376087cced9797d303e1b64c66d90d6d542bb1941b966e731afb2f8ebeca970720f6cad7ff86eff8950301a14de5ce0f4ea0a97ea16edc5b96457f26dfc8739bb8226fa50ab8863dbab8cee39b62ec20039da7658ae4216647e26827b57607a3b815a5e01525af3c8c4e48637e89eff50dba258180d8ef69952d34c31fad185b3c79a50a441f99bc08c243c9d7799c06b2bf7d400caa9a9c472e21b5e2332815c38a565c8833869c0047dba15116cd4c7adaf40f97e6019e81bc3d4642a7d34c4bb8223b639adf1460dfb12b0f2b76e57389eb24f70ce25a01499f72e9faa577f4fe90eff01982524a456838b41511da30020448a23196955c08a955eab7021b497b74002d7c54bfb0f494bfc5a1a2c068bb163954ce7a62237de750d9d0519306147b048d8ea36d4094f29a7c49b18f47be11f359b3bd5f08d093901f3b723fb6ebcd585bf74fba77a777c414f1c6070a74aad17681a194dfdf12c8349812f46a5ffda64d4c02a276c100739d7824ea852845e9ace6e607655d57d71f1f2427f216051fcf42329f1f070619b6a361208da321b01f6681eacf1931fc7c81911eece9656e26f83f044ca443bfc8bd0f1c69a50bb64929defbaca6d03769f0fde917ddfe895f8b89efaf0f98f5fa201c7a82503c0cd60473ec86c57ce9a98534b9959f618afad309cd9b833e6964348e7771498d07a5e1217e187cb2932ca050c2a24b6051fad0652e4c81678f2273ada1108ce1cdaec77541e02eaa02ecfa713e052bb9d728dadf7ef06d03e6fed7e237615949934de14e142957a7fdfe2cb82f50830c545abb3dbd06f672cecbb51cfb57944fcbe6bd3e07f51ef34e9d77c2d7f48cf59272323892064ae0c8b28051ca802c72844c5e21ae8c14c0576c06e94368b7557e14f868539fbfc879f84da5f1bfb0be3cd144ed5070978413fe8a2c5d39c57084e62ab06e315a579679a9c004ebc3f885eff386a5d3d2bec4873d889eeb04a9de84080e5d7b0e56e1151ab595f97bec3452f5b050e0a19559241f1018278b21880d1829a636001c29ea0c97910a4c4e5c5da7798740dd924f79e69ac321c6fcd4a1d2d1655be4f39544ffc716f10af2a40e684bfd9a7fb36be97d2fdc91e56e6bcd1cc301dee5e78193e53fdfd69679021c81eab9c0ea4b3e2cd8e5b75bde5352dfc45f87f223922584ac419a9cc7327db3ea1b6c18797d29b8f8caa9ecc7ff7da52e8cb0f7bf13087d5874151ec27b4c2e15416f38448778b6f559a880401040bdde1483fb94a4eb5944a4eb44afc212a370d31c5de77e9f308cf6aa1071e135cb3e602a72fb40d70b821e32167a7a29c2f58bc856c0c48315feecab84f557c1f8b05ea0c212f7b7b1514c635f35854a51f8e1ff08b79ca4b5bf1d2c60f9e63d796a08ef40ba2059ff99ae355401f57967569a36082d6d972edff72a6225f50090545712b4a8abbc6c8ff04b69165aab5ab6900ea2be772549a68432f15e8e614a14efeb9eac3db8d88bb77f2e2bbc34863dc02015dd3b38e870c7472de9e25112c43cbda059dee8b1dea19a6e4d27b03d256c3aeaceb3a7c4334addb99e12730de516942a1eeb29e09cc75da60626f9763b4516b0ed7b302fd37e1f298bf0b6c5cb237512d524611c04716afb6c949e04a67b0b60ad1cf0e2b11f2d58af02c5c08e50f0084a10b03dadd2e31fe67cfb54227a1a10aa6f983351caeeef9327e0dcb19984369be984437cf5bf321071ebcf1bb638c8c581d3ec07cc837eb920f735116d0bd06af2ff037e5b8581895b73f7c8c28a8a18f2181e7b99c8e5bb3a38ee86022d4810a3a321a9208435e8fb116e5d7d48e03ace47e1e101db156edd2a33e7126bfa1288970effd47a8120249522c35290ba2cdc2afe006faa3ea0cbe5563db6ba263199371068e0ee826be69dda635808f4b636ebd500ee6e3682c754f3800890660c2d53ab46d91c9e4430e24d2fd7264cf59edb5a71eb15b8f55a683aa5244336852a9dee789fd58b741222916c315d618103b8552c7aeb2251c5c655e826812e7df62f3009642941cb4bf20d7a82a6f2e5cbd30b13e020520635646cd4f31870ce7f2c160a56feb051ff58e5d432f9942737a547514bcab4049692c802e17d5c374a7f1d6f83f489b467ec78361f2de6a4a8b4160a9982b88a2f5572f4bd7183adfa36e532b5f54849acf3ea61c3a19c6f9bde90288824e13086ee6f2f7ee821e533656428e0a626840c48d4fc0d05165207ae5828df56d0451e9de58b7576679cf53201c50777fd9e3b24a7d397fd9e6df815b976d8db5374ce2d440de21dfb977b2191021c78948e5d6243b6ae4ad2239738c34aadb657301cc909e8fde0851d10c63f08c26bfe9a2b48c022f0c1a3e965d9f8396455087f820444958ff5e2aff25e15d97aab6bdeafeaed524c3a05aab010c516b6262469439bc275dbfcaa07d5161c2a9e068c1463904ff9e4dd27424a2ee74a954fffa809cb6baa9d69f0ad8a10b80c7268e174aa59702ac2d902eb7cca97c2ec79a3e12c901b5221cd2319974b73d116b364707db25fc60d51b042b481e060f36395e423e8259fa8e8146439f96f69667e5d82cf60cfd9abd219f601fdf6883078fee1e4f2316f743fd27ffaf689df74d84be2239428eff69feb8e561a513d0c3d2b431ea79fefef7f659702c07ad7a76c8846a4df62b092ad64154b0416dd80068d8bac7d226a07e39e30ccbf482e1e7ac97faa3a082dfa8e3e24172316eaf9e68c8b4b52abf95610eb467b7b76420066ffd6a16e4cd5f8bc559423dff3a5bd8e3b68cc8459bbb3f27739b4a636de1233472edc88044a4b2e9ac690e0f2d4d8121ce2fffbf9809f6a6099c870ede89eb235920ddec87460a96933447fc5089c24a8bbc211b2bfd3531023c50df69805a824483c7601a359049223644e58d0ea1b34e40f34560fc75d6ba54e5be6c2a7daeaa77d0e465aad885a898f74a195d2d2d92e2bb267f8989589ae8439d1285935ecc33a494389589d4a543e7bd3c7d0712368529c6bf787527d313397e362079fc6dfa8025d96b08113c429fc3b40186aaef7f01897319659a65c8452d54f4d0e0a45afa5ff9745f529c82e6e50446f6ab82bf1c6df56e5833158be199e59460a6f8c28707a0e3cf998a5262e437efef81ba29307992c83fe75e1e49e68cc1ccf346c2c807dfe77d7894fbf421009b8393a17ced4471c07b22dd0bc35b1a8c70b36196e9d11bec4ea6e397caed0cf36f5c5abbe1dadefb5fa24519f327a8fa3be207abfbbf952d03326f452523a52f8c2fc813d2d5f526f55cc1ce7f5209456fc282d9b24fc7fda073f4b34df8e940729f18607209ffce3cb3131b35b78f2e90fdcbf329959914f46bf64a0b70ddeaec1e2e21e11c3ed07160721b23e90250512c1edd2bc7b1184bdcfe09063712490e2485dc7980c718e0c85f1734c0a3550d6231bd96fb5ece1491084eb0cc3c0c57718c663ab9483077efe8e0900e4fe95c6331f9d645b1473ad00f078291d412db6589888f02ec1f37a0f00de524eb3d87f006c420825afb69eb58467292f3cd979a33e8069ecc14c14c087086c7ee2db71c9cacfc84311bce8998378496610fbffd8d1c5abf96e3c71d7241550b38cf5568152c4a3649f261f466a538a819155f4929f73f653deec671df2be3677af0d5ab8438c3d0fb243efbee020a35cf78a95b60eee1fb4a46c86fd3723ad7a530e3009745b00ce03baddef8da21022b66e13784145dd59e8a632c98a6be9d7902c85cbf8fe159bc89401c996cc470077a17204363099db2be82121eaf298ac6c7d7e453666e64aad2f75bf4c53a3d9cc8fcae58cfd7b2c3fa1552d76bb7ff160f8633f03306769889d87c1fe286dae59fb8d36a4cacd5a1a9b6fda2b50da2b891d0b7a4c183c9817c8b9f93002a332f4fe7b603ec32cac473870a3d10260ce16e5ba0820117c588ce2d9243f2d1333ee014aad327a632555fb907d694bc334901eab044b24a6647925e91e22987d2609080d750a82c8589ba3be382ecc89cb4b0611063a7582ad215509aa1ae109efbda5a8785de82d35bf3134fb052c004b2bb8af385e8bc33879d2ef2eb5c4d647228ef8c3066cac367aeab196d8a569b68522547adadc7d82774369710d30934e86461fc62cab2034bba101e316e41964d516c50f6780e46e676cacda29d86eda0bcff61e094ede5f8387871187ad01121763f6db2d07128633d2e8d21fa73e2b912b9de101fe530492055a2e96dab26da9169b632276e0f35573c229a31211a150876e49c3c8f63ebc41cb9e2b3243410328679a9c43804b6c9d4946e6745d522d328ad1647017109addea9df26ec464e604ef43d1e850b76c62cbbbb8b8b63772544714fb062b1d62d46c5c10c37b1922732544ead3842c8b9010b7884df090a07875b0a2dee1c53628e427dc079ddc5a624d00ffeda1d92148865f6165d5aca77828383f1ba5ab69af7e84da0d82cc4c46454460bc886048dd14e3d27da207725653efe8e5de9adc005d637678f0efac9817bc8c14c643db8e94d3d4bce3fb4d0ad0536eb2bce6507999023419d21f1a1de5efe0ea924dd4f290852cc2ea4e07b87fcc3eea05e9c5e6ba17047ff709d0443633993e1298e3d687d1f50bd0d8409fd5c97172cfac39be2e91f65a7cb82482c890750c66bb80844d7e33c4bbaf2127789c3bf379ae72fc0c11e8ab51814880e653fd95d0389551e1dd4f2feb03625f573bd60f85226c4040423c07c5b0d6495189834a8fb5c2fb7a9a9b0ebc4d401463ff008e9f2701dc8b90e2baae47405cb822e3da2388c2b3f344560d59bec019fcf132231e92698cede535952d9ad58ad2ca1062a03a21d282a425e9975d7c270246d84dc1d29400eb8bc87cf236f003e10be7c1ef2a576ad3afd6b14fe707c4507ac67a520a48cf54f418322958d179823ee85f9f7f298a2da201432f9b41b9361a5bd8f7b5511f81e102e936bbd4e450b312915460f199b61dc59cad81aa62d0dd9683a022b596978f3ddf7b9061c23211accd9900b29331131386e457add7133bac1a2da28350619ab9952e18e00be3594f15bd245fbc6e67594d24a850d5f08885bc27cdd4522a4ec493b69958a039698cdcb636669dc611ba74ffe9c263d8ec0e0eb11d0a79e62efe35c229e9c58364006bef05cc08d73a7b1c1343ee83f539be7e96298b66cc55b9d023dd5ebde75a41a83b4267a006d60178f0296cbc92c8018584030c0424b889486d46185f8225c1bbe28e500d8b23c0c2554023b34b7ba194d2f04abd5fa08a232a53026e3d631819f6d848ba60b33e67bdd728665aa79881319c94f6467a5e1fe15ec6508f9115b22fd398c18ebd9a0177ecfb0d5b878b98c12f933f6c0a29dee829c4b9ec43c30b30f82f92f4df5870ecd1b63deb39be0748d9b61b1acb332b856aa084873a7b4c7bfd13bc57fa7adf671160e6c497f6ff94a1eec856b778fe5abbad9505889255fb8e3a0bc9a986698fff8d8c2352e6d9ec0ce7a7809cbede01b36d660ec8f38b1f97a2a6b4ad5c543e864f0b3bd5b80617d324ddbe039b2f708ba9f9a9c3fa00b5d9c4f000d6c54e1cc72b70b655d4fe03ce9ebd54c44f27287a49dbf5c2a40230b44e2711208e016b279406215b3bbdb754c7478cec29067d530b3d9045b5c9bb0bb53a293acb2d4274bbc6dfeb0ac18763ab3b88a7d3c0e914989607caec23d99424d599ec972cac798eeaf496527cd54db1a7302c5642b8f894437a56eccc5cc56b29703029513821d3a320aee931594a2807da81655a1cb3c2a65a0aa889848331a66004994467d30c5ac47b317415306549a3c568f2d1627747a587ad82720e0e1c0fe55aeba7a42b2288a8396c2abdb61ca0b786e976a1121b475201dc7b4e8d98dd9aa439f52926798d5e54c76b98d30a90903c837c86d8d0365b36db6de318b0315a534dd0898b46c3f92f7068174f19fb97b29d2d450a44ea4fe5169b63f2ec9f2289124db19c9168b62cc6be5873584746ffac462c5b2c12d6f7a28ed44b7b9b926a69c3b1845e3a4f42b822d8e1a4bb8459249bdba969758502a26065ae76c790ccb94e26b5b678cdf11e045bd6a2695657ac8dda7475698aa56b4b131dd9fa9fb6d6ec62a4f73394d69a38ac76e08750a9d0c69c8a12b261b2ce1118b4399340492153124c8998827d1e5227139988c238519e7d7d026de5734de5b7ac43d37bae5626eb2e9900259c082b1bebc9676b5c1092286e1180e808fcefc08e253a9e1e6d55319e74be668799643a148441ed0247ac20d9bce9809e566d161ed5c7bd560d15756bfa685ee61439821009e67200cd8e3f5e32fa0d4c41174322699d457ed136db4ae9a4300a4066cd29977e7f88b9994d5e07dcbec856dccb91ef6d46170e2d3cc332e21069c30e3c4f5b93c1f2e9a5bf0166ae897e5624280b1ec4bc43ca90e71ff46580d0340ef3a8f6b8815b251bf4ce29f14bcd1c286e997ef91ccb295d7093c5c41869955b165700625ebd9249af73535188397f7c2be00af5bcac7bdc30665849706c5e1a00263c18fd1143a374b3892501a10acc1db21a7ea9deee49e566694fcaca936303d939aa3ddf32f98383677e739773953f4073ff6bc44e9a90123d04d1eb25a88a96db76e599ebdfa9948da16f98242e66b42dcb8d982dad65467b2dc9cd1c632875a7212e99ee85c818c5347b5bd568f4894dd16e6f65e2ea2bc6f8c4edbac4f5294d034757736f5e23b65c85c449b2e58fafdb07ee647d200ba12933fd38fed879562ed06fb419459c0122c63d7863c45b17cc1d4ca886a52673fb203641a463652bd39e75f1c962a8ea915f0a8f49e46c8713e616db33426425d6bd3fe5b9b9c2b3925bfb4a980fe40d6d687b2efc1903ca8213cf00081e2261de0abc2082ace48a09c27c1e7791b883794fde60fedd87a86d3a2d59469d6f96cd396eebc62511caab8cfa9248f2f518559824e53a84f1f3bfc9e42b5e3f2f688403040a32d3a75e308e3a6e0e1501a201bf742f0a171438600928c81ed46ced491af75be02a36dab2c1b7e80934fa6a709e318fa321ada5e23c280014401510866110d9d5c6970ba04612580556f24270f6413fd9f8c79d2f7e6fd18bd9eeee95bda59449caf309bf0aa10ad6d22896dc9fb34ae58e813a0603db4b992be059f7ea83114c9b0a60d392045cefbdeefe1f8cc06d18bb9623ac9c04bcefc5d8becf07f52d8bdb239080f7eab7b79dacd9dfee0eb2a8b556fbbafb937b5c5a90e340b024ddc0beb5d6e62d74fdeed2d8f1efc8b3834d7378666d7165d4191f3495c0c6d75eeefee6beb6e8e963cb0efc455fc482d68bb94f3c85dde79c52b15c380fb6dc972f4b860dda95362a964a54a9685235acd6ed40115b8fcb5f289667d6b53b46a768666446d48812b53e99f44dd77d77b1f5b8fce5a0bbf27341d79c3a419f68f513fcc41bb93cab075ca96d9873f7816f1e1f92d872b56b83c33e687a3b8e8a5bb75c973f503499c41bf874efbd1c0ec1aef3ee2dc103c1eeef87ddc5a04bfcff442d7a97ebf207862f173d09fcfe3ed0cb2c95aa3bdd2b73b92e7f6068e38b41d71d7ade5fd0fb0ef4fe76a0c30fe6cf3b73493b2430cdf7fdf1816f197bbbda4c880a516257dab89c0d246ab46bb20174eb96ebf20776600a4f27f1868c8f82dd06b546072f1136bef495692e815e1f980b5de23f680a3b701eee6d2c076763c77bbaf37a811ff781bfc1cedbd903c150fccaf0f3582a55d661684573df81f3702619b5867dfade89349136b208747dd0c3f49533f7f4953f77203fe8d1ea262fe7b807e06a168333e18c78837bdab36bd6c6b5a14587222aec00bca18b4db2ded14048b12bb82b8da05dcf0e785c2693c96648995223ba24bb62825d23f3d0a46b655ffc19078105082cb0ea5e1ed2d2d3f5fb948164dbd7d68a946d8130615b20b06c6b74c54d775dbbca51b9b4884ad1ae6f8f8020601e74ccf6a7e20a07dd5c89234479e2df803fa63180d4758eb29d1f531107ddfa4190827ffe156f9c1e0cad5c4192432d88bb020ea77d84d227b4c9ce78c9fe00e5e2f70a150c9a059a818460be4b16075d251be37e96b1913009bdf3e311d01a74674c82ab527d5d5849ba9ff688cf3d15e2b07c7f1c964da03af94f9c1af70374460671bdfffde502cb77894ef4c0b4bd1cabd05d59faf0159880852d66576a4ba3a84033a969821d33c664e20f82611882a115719f7f64a6529f2a7d702083c9958ff3cafe696d3b3f2e4f7bb42b10263780600b0ca482c9c47b1f1314abe9834ef912c4ccf4f1c3cb623291f91f3608164c261e073298a76a3f2ec246ce63a2b0fc24b857ecfc17ccce97cbce8f93680cc5e21fcf4274111ad8880974fcf306a17f5e22f4cab0f3eb2099feec55bdd3eedb70ef8a3eafecf4a3b13cf34ca95566156fe8a016b642fd698dc62134fefc2821da43a3ecfc38c8794c9f1f17b94bd0d8957977c815e3503c260236e25a76c6578a76c64ef49fd8069c243f75fcb3336995a84eb65c282c7fb64b4376ce3254d90037b9d21a595836ed9926f47991f2cf6cd1a735aa3bbfb5927fa634d2482cb1737e19b297dd5f2b86c0fd45b2b0ec4a48384c59a17d8b7e5e2406807fdef799ffdc490ce0c8ff01587ed8025dff96f9fdc85ff9cf9d6d2a73121147585e1a096e100c41f2dbf9fee02b747e3d449f347616e167c8116afe1268cff7f945c89f4de59975589e9aba52beed9c91a84e7e57b2b12b7358fe9cb5966599f2029557e6affce30390f3d09dc1ff3e83df4c0f9a868d5d240acbafd2f93d1ef495fdec2c7efe2ba4d6f0cff94d2f92f7c75ff94fe599b788c3b4c5f2caa84efef048cb76fe8b94194093b6f7b9e431b64c784a6badd8de9415ba7e497a0f2ea0ee5c3af7e1e72a0978dfab04acd88aee1eccb9b433266c0b5dadd6e8ca8a5467fc407b6c5999006f3823fb3e2e63a06ece739af36355a8e9b618f8b12da5b5c608f8e9a6af2ebcb1423fa13c78c68389d0d77d4b739e24f6eff7f7ed90756289684ffefbe6fd7ab375490be70965ce23fed45db789a44926bd1ea399210cf9c8be4bf6b52c50d87d7c23b433aa73bfd3a2afa5d662530254e73e475a274276c8da40da249616448442c133e7b14fe8ebfebd7f2d11d5b9af89b85043d13b54e77e57d62cecbee92f92ee4ca5cb2cec3ec6c1064da1fd6d116b6dc795766683c620f4696776e6b1bb0aefd3ee5ba1fb7676df06e121d311faa1a618638c29c5b65e4a5f45df4280f35b4e00933dbc47ad958685550af8ab62fa6f27d0a37a2982bf6ad2ae3f17709eb3d69ffaa7a6499596a70629d0a39c80bf44224d43199b3eaa0a4d3b2d63119a7ea845afbefeabbe5611a1390052d7e951347d30aca26b5feb0eeebdf76a47aeb485d51765a8bfbc5c7940a97c315a8590bbcf4fcd55089f07b8ff9e9a2488fe15b5fd51db9f07c61bf0cdc33ea5f2c508b52d49a944a1c576f202a84dff235721841ef83e7c6a6672150267525104f0bb72b5a3f3bee34a11beefb972954b1ff9b9b0f4a1992c9aebc8fce9f0486a66a1dd56df8fea7bcd8d1c09eca9f4b58cc381a35997519d190ed5f768d32747ab462045aa4ab4870bad8159a0249e511dffda85c630110af3dfd9094000707056ab8da229d027ae79ad0044dbffc3401ccdd6688fc9c670c7d12c100d2c3110479b51429f16cba55da1d0df86a1f666c1d01af7fdad8dc63090b558680f7e77e2896cff20dbcb535f1368162a258d447379e46168459faeb4fdc1ae086fbb929b20c7e15aad614b0faa337ea03db5f418a88ebfdf6e4c0c64bb7ed53b8824776461ce216d7f0c6463972b0185f9bb0a08a886ac83e661fb735290b66327b6bfe56c1646a33afe97e48ed019fe1a05da7a10d1d1be474436f67afd5b7ba431919b43fb549dd4562fe69270b8e468fef257d22b4c83d69b527961caf6af2a7ff01d689faf7d7a900759987fd617d76ae94416e62f13469fa014dbffe4681c6dcb4c01deb41120a5a1b195edfa3b1bf8bdf75e6bafe372c73eb53a6c8c8688a3224ec812450d635ce8908218783012021e888455f4e95e36edf1d50ef0c372e5639edec704cbd50ef0c5177d4c1fb3fe8974230babb446f30f5ac6188496b157fee4cabee97dcc1de087a50ff1c1b7248704b562c4aeef378fdd8881d08d180cf912380ee99785d517c9d40af4f9fe21494d90a4e6f5d35ed99fb2c5099b8a384edbb5f017b562c4f69bbf7ca97af9a2dfbdecda44882c5984545102c315667d116cac0411c0e0440c436a784233ebdbc8517f1442efd8988d5a0f30470efffefbfce3cd10da1fc701ca1c9ef7ee587b99a454c731497b8c34764d2bfb8040eaca61d63e3cafebbaae2cc15fb5cafc3503922205e85cea3e8891cb202088cdca0b479b8a373c17d9f669838a8c6c128d85a645538cecd306cd828aec4ab3493c464d27dbce8068335bc4796a151b767d6bc426d9f52d90c7e84d15da0aaa53dfa9a033ea5331b2ab8c4a911f1c3a798ed8f338aeebb2882384f63eeb2ce2a0f4e53d78bda75427bf77f384cee5e9ef257cff955566bf528fa1161dfe4884b65d27e3a4232b5097368f1f4058f4e0b45d0cd5a91f16a14fbab46b7daf599a8fa8f5cf7a0db0a65856230b734c9e5ae5461f921b9024f88bfe6d8ad20eaab2a22948bbbe8f5a7f767d1b04764b7b840cd4ed95237cefc1077ea407158717f5c3a2ab14767fc4a2c3fb3a39ee3bfc1dc6a53e1990df43e065c916710625e208c41170ffd41f1467d01cc7711c157190aecd71b70605c4116899528c97adbdba35759902b5864b65124bdf6048eacf36f672d51a07c8aeaacb1e54c7be0ee015f9ee94e8fbd47940eaa5876b771f82a077f77a7738b82140bf5fad43e85310ed21c0beaf83f674fb5e1ca6ad83eadc0f9128807e60cb95f8749fde67af40d05fbfd2513ba1ed8b3f8323c4c996f5c51ce46ae6eb9e79912401efd54c798004f8eb4ae03e05eeebb82fc27d5daf8a45031885d6914fd5db9347566067f3a05fbfb3f4a42b9744ed2c073298d607bd82c20c34983f6e121cccec1cd4cf5388142181f9c36221c4ec8250e28528e68f7ba489d995d439f031410f732e7308dd7b791542eede2bb3cef90677cb991e342e599dca76a40f1a2508154fcc1f77e6ce81adb7d61eb47d1b6ecb7007a47de653469290ed1ffa0e8602a464de2aaa932d4c635bc4902e210043c3c5d704559072d7e5285f627061cc17dc851eb9da910b00821e64662ef30c13fadeb05fc91b9c07f5a4c0e6f0dfc7640fd5aeeffd0f073a22c66462dfc7042be991f82fb823ff6a47ce1eb9dae183dab0f9fe0f8ab455bbfe0c131adbafe42d7ba8b6fd4ad27dc9bcb32deb3be72212154511b553eb387e5f513f8ee338a2503fd6afa2c6f151a81f513fce3c6ae6513334e33863c7d3288ee3881a51a811358ee3388ee3ccf8a8efc40f5028d4a350236a44fdf728f14ffda57e44fdcccca3503f33f3333324be911ba87ba64c80bfae8803ff7dbac7711cbf711cbf11358ae3f8e0378ee3387e156f8ce36b8d4291a1bfc6d25f4693347f4999a7e218a26650a03843a3479349447d28d4cfd070292e7f6732d19457e6a550258ff1513f539ee3cf8c8f1a51653ead490cc1cfcb1d57d2b18e323411c484989db4e9a69b7b6cb7f8cb03d2f7f173d596b7b5b15aa4da36539d6e572f04facca70aacdbbeffc565dde2af6a3547f2e05ed53d8fefb9b72eda93df7e0eedf170e61e73b7f4ea1cae149bc89f2be3c680408ad0b75c473b8ebcdf719ce52c0e13fddcfb5f4c7bf27b683b06e0bf6fe566dc594ce22cd155c95fb452778c4d4b40a14db7d2db0a45acd6ae529de16f9f9637b2dfab546b54aae3b5ca766badb5350a73293476c320b6ef2c9a7b4de2d0fbc5dd52859fd670217506c64d10edeeef2b595d9ef9549eba4888fdb03cdd6e2930c6182b5198fd8c77bad01a66db07cb5aa33af6bf2c98babf3e7284ea91b56c935efb7edd02c269dfb22af9abd6eef963d399470290bace8e62a46d9f89a2ad7f1c5f8fafad6ce105e442ee28a4a3fd935513d3417240292dfc656db696d9baead71e1f6f1119a04b9c5462259c1a340f9c1ab47e7d85f80bc85f27708b4d56f4006ffd238f2eedcc0d9a939578c95f5601fac7efc40fc61f7fd4091081d67f5e195ea23d23997f8ce9a030fb5ab5f3cfdca0695e7f55c0f8a9e7c40f523f7e4d7daa74f9cbe2db58b7983d8e5d103d8a2fe8f337dd55d425f6e22fabad26b913a8ce0fd57141efec542dd35af62018fa4591a76fd4632ff8e63cf64792521459f354d46fc3b1920d57967afb998b4e2ab249f03dfec9fd703f608aac91d9bf331ba3660896e76b94658bf758ea183ff527f7c3fd5c0ea943b230fb614d79912c4d79e6fc458f250f7dea4f3d2886a2fd2d377479f6a862767eb02a6dfdfa8790ad7fccb6ce18f8b1c7d7e4696d1bfcf16d38488e37c692f5396c64b63ebdadf5571aa3a6fe2aded09589a6454c68d974ebaf2203f48f0f6ad283ba29d5493d58433d7e8a34e94f912399fd752acf709f3cd04f559abc4143f25ef223f196b376e479cf2bdbe3e57eb6fd1cb6bb8d47d41e1429ac429566823e43d9cccee8e724b492a1bf2c09ce53df522d2a2d7b5c80f6e8784aca70fbf97507b4a2da15232d36ff9c5881508354aa8ae4155b618b50122abd29e811eeb64fa33cb3c7b42739520bb546ada4a8b2d65aeb8180df1f07f6b1e97bf65a204f4f92c0be6eed0c200e102a947eb52de51882a82efa5481aa1ebaab5819a70c51a52255f9bed8c05a6b07b586b5d67daf1d8bb4b5b46708907a68a5beded9d7e8082d8bed613d41ad03199640308416552c4d6187c022ccbefb1281050e400061031320b6f054b083952a0b96ba1d6a67479e0823668531b7232ed82bbc24004a0e5e62f08213a4a86105ee5caa6ae8051d9e2c1989220aeabe840410290a664a0c9200f1825a0c22a8351bf18357d3e758bbe4f06106244c92203f59a4a828b2444634840943dc8a2a743849204815b49f1f213a9cc0004b98b4602483d2134f5c531dff13d01edf388af7e1c18715b4f87005962512502a6ec061c2b0e0852f4ad0ba3861de7befc560f25e72773007b638e10829921003c513d6c52041033d9275e9f204120c487cc028a457b646ea2b099a088e70f192c5051b068917f4e6c08519887260c1881b9e30f283edba585081881c44f0440a6a484fbc804acd882c3d30b1474c81440a343051881c31468a2527e424552a9621424014660610dc9c304f958321c0181f202b78024a0f5d8c88c860de7f555108266e582108a01d98b8edbbf3164327d8b08c60052f68810e6d6d689949299215ba4e6d3090b9f8876c249b12850e45c484b1428a2d208d121153b0c004a0245898d98b74f54a85ab1084cc7d7dff65351117081c80c8aa34e961a9866bfd0b15bc8758b1b4c4ac36e58a0ce6bdf75eaff53a016a0c473e7c8e04687729f52570af6adf9d7d6ffefb34ae126fdfd7f75ff7de7b47ffcafb7ddf579e5eeeeeb554a606edf77a25bdf6da0f686d5fffa2aa99ccb90ccbabdae7ed386bafbfac85e27ce51dee2ba7f1edf4c618637cad8d5bcb54c8b6dbaa90c21427921862cb17211ac5110a5c9a3841c31623b000e2266816ebf52a6a036186285a6c103ae1862d28f562c40fa706dc5e2801111c8c1003c401ac14edd800ad0c5bfa06632e81b643ffb3030d3ff4e082161051f32e46fc10f10408a225aa2c617962011d8a8840ca0f2fb8228942a1658a9a304e7200aaf2821e80b84942051efce0c406179cac20040b9729333e26d8e22643410a6c10c1103d769885d1410829583c51d26244a44684b1220b971f8ea87842ffddb93e38fc70c416472c21a10188c360090e035a403086871110f98901c5c40ed17fae5514b1ed1f207bb6bb1ef63caf3c73e95c79e65b9af64767d9133c0f25c4d82082136cc912843e4104119f2633294c866809c2450bb5b13014a3cff06e55a8bfe83eb530b8620cada8892c0721e6a9b7756217653932f208bd400c182f2dfc5831ed0589d0a7cae5630dfa746d8f5dd379a8d786b86d9d4d8b84c8626321dae70f6d7f978c222c491bcb9697bf0ca7e25633a9495f3b208703a8799f7b77811412a4e005cc120b13c0cda4e6fd338be02f1d392c2c49ff3e9f8a494112102b40412c283161416a4ab42064c99518c0b0a8a2055388c43001c5bcf969a105297468f2c38f69fbd9b4088b987d7e91105bf693b4c7c50650937b6c423599d8072f4929aceea8b2923acc7497bffcfd557382fe4dabdc5064d777bf3168d1329b160911847581072242d460a710822644d0952ff5a48d62504104523a190519120259322d11015710a158e10b320b9508e2099981470065214a1f16a02e04441e14221c10a2acc405bc025257c58516ae0a465c951f166c10a612868520352a494386d8a86899a930cb5a55c38355c283917dee1cf120a4ba40e74d8b78f8c1418f9b16ed70abd9b408ca10e81cc771dcbdb7837befbd9606be1cb7c1e538eebcf7def17a918b736b4b6b039b1639a1c3e6362d7282c9f70328dea0e9d30ea43666df042d59713041cd042b0a412612140099a015daa16682778b2013e4bc800132412eb4a4dbe0c2cd04b3132248443a102199a0c7e466825f68c97a82243713046b0d20b085fe81264296d44008949b099e422757389896ac4d2821726482a717884c50267472d5846949fa83123bd44c5026b46435c10932139c092d5995241999950625904c700c2d596b560899602ab464650285cc046b503084109909aa5cc84c70e595aeae5cd9416682363a644144cd66b5c262aeb0c84c90e595b2ac6c11e2e556443341174e926461b4c2e22c20260b88ccb4544766822fbcd217292b7e4c4b56295194082333c155c5828605529220aae322b4e46a873fc864f541d2ae655d51aa736216767d99799fc60a57aad4cc1fb40a972d376c64d75be299932b2ca6256b0e5f8ab099d588156826f822b4644d12859109de8496c45144a999e07b6d051f1022eb0a4d5821da7162dab20c9d5c2d312da9b1c042c9fc51b7b4406652e7e00cb7357f502a4b36a11f2c20a62da973405d30704a12c6b76e5ec0800103c68ec9c774d2c7f4a93fdc41166eeca77b14deec4a26f7afb53d5420e08d1f9725f8ebbe75772a40ea3c3506de50f3b07e833fe0a3f066f85ff7c5a51786ce93ef83e20719ecec1b38d71d862e82b0b36fc6f9f36e0dcde03e48d2d00cee7fe4983ffb8bfb5c86fee2ca300a18ebfecc55ac6577a5dc7b4b2ac34f7e14decc25138cdf5ab1e37009affc45eb2a454511a16b9982aee3971750316e7264348c1439bab05119cdd4d03ccdb72f71def5f4411c8b31aeb1c1397291acc721570f7638250e8e8a354353238a5263831323c6a364348c940b1bd548e6b43ec6e3903f2c9c2f71721e851d937c9c2bc480c962a6862687c45962b1565b8eb61c09c1207f704a18a3cd622d6168999c9b183847a40b1bd5584363b3586d2cdbd191cd661bc7116944599cdbe1d0460bca6653cdd0dc0e87e088b2363696cd863ab9185330b44cce4d0c7bd4ba49da2b24d78f24ea2debc8e6081bdb4926356a1cd2858daa05b6666a688e8eb07947a7a3a3a3289a7584b2acd588b223cada48f287893dbd8b19aff75244ac2da8a323d50c4d8743d0d3ac1ad651ebc876843ab988719323a361a446bbbaed96928dddd86c472e489b67b16c9946759463dce4c868182914e9c266b3612dbd90d9d8cd11d2d18db57261a31ac972955fd8fe35344f9a2c994191ac9fa929c9676551b16e34ac150ece8fe4e38036eff5bf5abd3fe9c246d5025b353436cfc62663638b62631b6d6cdac666630bda33a8239c6a733343de6c18323937bfd29f8393139224355dab7f12e8cdd58331582cd6d1d1d16ab572e1c285281691c56c0383008424494d5046c8fa927cf14f955230a18e31576fc3b5928dbdcddeb6837fb6b4d8fead9b8dad8e8e8e8e566108829fa741ee380d384c92d47cd6b76e5eb0582bd1c7c61f000482d5dd3de836b76b99a9ce0656b6efe9c475f872f986b44dbf1b47249ddd85582c251bb4e98314487b68fde8cc5974e7865ae07f02d2a7f2a465666aadd6565bed6b3b4a46a3502814cac6549f959a01a4ae3387b6fd412b64dbb408914d1fb320037d3906427972108df68c4f1f1bd9d8ebe93f85f1f4b113e79979fa78c879649e3e16b2b1184f1f27711e9aa78f836cec67f5f4f18cf6b878fa1888f6d83c7d7c84d6a88f4b90b1c832ed8a1a18222ee75d6253a18d44161acb3425288cfe8d4263f9c8c2fc7317fa72faf709e5c94afeb2a99ed63cbd9d31f60f0a6fba3ee787c92987d6107fea0c7ffae2e9bf8bf6e8a70f82d52dc698abf85a8b5f90379f43be78b0cbe5f77d320435113a62040624a31a2dca13d9cf0929a850b3141118ba098bb9d4337fe599d7eb47320788eae418c909ca99e508f197164bb71c19131c742b2173826cff1c207486bf3e87fcb97914b299f32e124865e694301e851d13e773ae1003268bed423070725e646ba9336f9e89119696f1064b8bbf9c65a3346e4d278fdda2f94b8c41fee43c0ad9fcf941e1cdd6a3b063ba3e462be934e3f53fd6abd4bab5c816157400fe2eb26505cdc03f06d902433958f2d7ccc23c2783d93e59b6936dc6ebb358dab1b28c84d89cc7da188de398a2a149a552a9711c6f291c52422da556171677bb5692cd151ba36ccae2e7711c6f291c58e38d1b6f77bc8db7f136de5a49ada4ed401aac116f9844318b386c8c584622908dd1a300491cdafe224d14b2b320d696edcfb2b18e4ed0352f6a4de89175972413f149c85b8665b3c16263749aa1698d2d310e6bddfc75833e45a02531372530ae30db3f1ca2b16c36584c2c1bc8b2792cdb89659b296958b614183ac35f245b62fcd51a2b0af49922128144211ebbf99ab0a686d29e1d957883fbd1a6d60e87fc61b27a14b269423766cc1893c90824e8edfda9a5d4ea425ffe22d068c578b330a52e335e1fa6888e585ac80de43d962c9bbffc4d3ca2a9bee995bcb4b8a048d75010d56962859011189066ec530412813a1148040202daf7a6b524fbf913e88c4f61fb83aad2459be993657341b66c54c7c6e8689f2fd45a6a85a13afe27b2058616341302246b6941b6c4accad68dea38a9e4c5eb198aa6b4c33f6d94b6bfcd910d928dfddb2087f9672140fa6d441d269cc68c1933c6c4791b11c7dd2ec213a9e4c66d8c4620a1c6c6b6cf1ffa009de1ff225f886661415fe46734e4ffbc8ceab4965a624813b6bf8d51add10213c645d9ba7d0a54467eb4c33f7758371b236dec6dcc0239cc7f7614b4fd95aedc18d9942e3217c93420362c46b5274d6856cf50b39f0dea998bd0c5895472f328d245447584a88edfb89ed0a1ed5a425d476892ad8465092324685988ac0c09fd3e5bb7d69285f9e7bc205ff6402f84eabc0a74c60fd9fea788428d173db3b19bf7d74136f6827643498e929c67859694f914a904e84d9c7f4102bd59be8bcc456a8d51a9ce08729e9490bfb20c942755837fa6d9988d915582c6c421f4c8c644200b53729ef1e6afdc85f28c61ce194f43cb343dbb6d7ff1a7d66829d519a2f8b3fd4b3205c5617e2a534443f4d9bad50200bdf9a2964a5ebc3f0ee9527225912e24d2352ad51aae25e88c540d5bb6f3b890a02f7f6f62fb87a392ab8674d918d998eb08850d0972b14061615c42c69bf3b880d05779ceb0f28ab2fdbdf2fc27aa26db9fa63cb56bc9f64f953646b37de62d43b66e644b0cd5f16f29d51a2d2a5a56501d7fb1a574b351a58b46cef4996add5444542787d4451ce60fa6ea0948dbdca0c89b1d836cdd2ccc7f866cc1205f6661fe4f3e9085f9287a3063cb94ada5205a17717f3d4ba28dbcc07917086347cc258c1087a4e68b13a9e4c59724d09b2f1e7cbd78c162b156ab7025ea207fb99eb94075e1648439e4cdbbc8d6e390d4046564b40562d9b466d95836964d8b0dfe992adafe29221b7bf1fea99af3984ca22886e1cc5fba488a88eaf89346f4d9bacdb6ffcb9ce74c116dbf89692d394f7eff9616ce73f6b043fe2922da4335f8bcac41c769f0ad9b17ac950b1b950658032c5e3be395b24cdfe790d47491d4c421a9592ab97992b4441656ff495b53d22a81debcf9903cadd1ae4636589eac5d6fc8cf232bd509c717a4b6b09cd067e51160c1962595e54f6d166f5c8c39aeeb72f66cd89fd0078261286aaa239aa8a594b6e907511d5358c913fd53255532d66a7f51d5156fcc88ee752482b2e9a768682a0d6a1c533435a99a9a9a1135535323a36b6a6a4e3526b1a626043f2f77351c8e61aabfb3ab8f0df4b58d65ce2ec9aea473259c2b71db44467f9fb596033fe32010f27f7fab075ea9bd205962c5e53aee16190579d7714bb4e41c5a6b6fa77372dce725504e5de6eccd4a3a251cb54d58f7239af03a244890d48b2fd749a19de5ecbee56905e430676fbe45b809efc87a411202ecb3afbd996b026710f0777fd6cd592f48bce05af7815e066aedab4475a800957c9e001d3682d8792979e11a761b85572f48a81724a617747d930bbaea705d48ffb543e3bb7bef167a6783393415311131b56062c134d3f54d434c2b9854300931053185c004c404a4eb9b52a831a160536b55623ac1f4a3eb9b4c3081c0f401936c4c0cb6d042cc42d7c7e27505006aad4896aca8820a3161c4293408453003d8b176001a743ddc90bac1b5c18d50a5f5eb3f04527c8962d6e5f73e9a8d8100988194c1124348517c3653335513fc54266af644bc09601fc9b75ba3e59b78ab420000f642d9ac17e344dbeee57ba2e5dbad79b75bbbb5ed8fb21541d21efd8c2c0cc6a62336c233daced067646339a8d167b4fddbf26d719ef34be24b821a61a3a59cb556a9c09d8389d187743fe0b21c7a441d9240ad25e0b8f51e7fe5a67f396ff497ce1d4ba5726df02fe3e55e3eb2fb7b447b38da839f5224a847772cecf5f2c0505cabde0d579f8ec446fe720e5f1217e15a07344e1a353bc3df18f65a31a97298dbaf7e5da4b7a454876ab1b35b3bdb1876bd85c9f00d5e262bffda5080d475cedcb67ff63e99eddecc11f156733943136ff46677e4cde670397343f282b5936dcc5e179b3ea6e1daea828a2635ee987d5bb25495c532d26707ac5d637b0fadd5a0893aac827dc2509b624c56b3e3ae79af1dda2746daee18a904baeada6c86e221aae33ff44501675f1470665190d13d95c3426a60217586e3201b5ebbfa25f9927c421ec333ee3923380817c1426a0dcc0226825798850169cea69390e5be25b7f62de9244668f8852d030cb4062e5267049d846c0c07e193d0761c74827282e23ce78987130f5696047d4b5de91905e12498868de022b5068601cb805fc04177094a562f11eda95705fbac222ee2f9e041a9335c04f3e434d9b68b378eebb89f7d7a573c237f15f9cbdf83526b78513c2954c7fff47cd85e4d89ae7f7a3594cc0ed909377d7a6d47668e621ae81db2ee359c66e07681b3028d53d8a7b7bfd937f36ab3d3cce3b97964a952d8b15df609db1588c66a912254e757d9d26730d9ae8df670d74994997b4731cf66bb419f5e11104286f6e949f1a4983ee0fe942b4d32efc8d3e2d93cafc8798c3ce669f16c9ecd6453e2e26ab344d96f7beeed77e4cb55fee8fa779a4701bddec0f772d6861c89398c2be642f16431d135659065d3bfb62a5bc28736587a484b509defa9f374f466531f19325b58eeaa26555554a2f11089a1e01a898b486c646133aae8fa27a6e11b021dc7e0f5554d6a4c65d3f62b08e3b6a5cb5fd8e9a2eb8b50e8aa7365e000ec4a7b6a056bad55e4a2eb8b4ababe08035d5f7c42d7179dd0351493747dea129b60e2148a4be8fa2292ae4f95d0f5c517e8faa20bc650dc925ad184621235363b2bd1164603a80ac516d8d48848ac42f148d7ef195f84e211babe68442b1459a0eb8b5ac8502ca20c45227042318b2b146dbabe880546481f8c118a43bcf2ded9323458280a018050bc1280500c42462802a1138a5604108a463342b1ca4e2852c920cc606786007464040000b0570c18392e9c92dce9968aa270b26d362d8ac256db9ccb563a42aa2257f7c57befeafe0b7c1fe27b9ce8f3342cecb5b9f7fee3fe2b7d78e5a932fd49039bd43c912bfc22581887cb111c404d1da58f1c16c67de8637ef83e9c58ae76880fbe58ae74e85fedc82fbe09964c2aa0a47b25e05373854b1d3fde873ac2d24735bdffde877b1775740fda48a1b9a7bb4eb1a9941bd2ae44ce735aa10de43ca71db243dc5b27dc5799f350294f7e368731c6bafcd11fbe0db742ce438bbc08b1b9d6e6be9ab2f0b34ff8320f8aa44cbfd6df9536a8fb6a763bc0920ad926c1eefb322513fc61f8b9b4b410aa99bf9ab9726f876c6c553fb4443606becc87a0f5cb941e60b2237c2df31ed00f824fcd4a52e0025c9d715f83b8af32ee2b10f721a9c92a5699bfb8efbdd357998e9f53b9aaa6b0721f7ead4416c63de863822019924243ab0a7ee51e2c2b908571ef830babccc2b85b6aaa735f86eadcffca4ccbce823ed5c11dc01148c8bbbe7f7d1b3a6cccfb579994680f8d8dbfcc2b7460b9b2e5cadaf7f1bd2d77803e44b030fffa2bfaa6157dd3fb983e30057fc7f7e0d3075f16f695187c0bc341340eba4750519dfa3df8960b4b5a7ee46a4799bf925a180d4cdfc2e867b22b772c8cfec91d2701a90b0c2df5f7ea7f5fcd8ff4c82a662a34dd2b1d3ffef56576ddde7f6f6fe8f8f1ca157e1f67dee50ecf86857536fc23b10f6a615f03bef71ee3525b58f795d48235fcb285753f13446baa83df61f86dd27d7ffaee6f4b1ff67df8fb0cd56cd8a766fd1cf7f187e0fed8f17bc0ff962bfa542331a26d71450c4a70c4ec08d347468309b8e4e0a4872949a6cf094360f0a4ca9091103fccb8c1861ba81081030b82ccfa9674b2ba37e15caed0c77ce91104ff29cfe9b3f10df06e27bf07bf2693c99298dd3fe5f9de7bcff36e78aedd7d00962beff3d3fd81ddc7bd47eac816c66131ba87bfb8e7c02ab4ff499336f7d4c55901b9275720d0efdeb775211ec6efed6ccc9115a85e203ffe127c581b033f67ad7776a812fd6e04b05bd2e2ab3fd4c2287e9d55fa553b18632b3a809a3b16861fac46ca5a6467e35a64e3a72ecc39c601638ede5b1f735e8ed674459fe1b6648faf66cb3c3acfb82fbd34768faf66cbb741b8ba0d8f559a85598f51fbe72b664bf04ab3b1bac561f6f3773696cb1d0eb3df9536926805e8b2add9a80e1913f4496fdb5ec0c64687d9fcd6ddfff44a19dbbfd25857dab030fbee24cbdda6b14dec419fb4768e544a10186cfb393c76eda336951244cba626ae432e636ba0b6cffb3dbe9a12a0373bf7c25c1ab374068dd952c7197b0aabffda5566d32a26402fa173ae550cb637588cbff3382f09241d8ec0b67fc993d676acd39dadc50fac2d331295ca350811a0c12a21e9a03195d1b843633b218d690bf3121ce6244ca1e950a96c96cd90730f30b45f3fff59ab65802d593ceae7d1091df61837d6dba9edaaba7cfd15e6e7914bea75dcce96a9419f77741eff543967fa793276e5aeb5df63dc5846ce2173f9c092162d8ec06064081d02e9cb8f911f252c3210c9c18e816d5ad4a505db44822368d00869119d8b4d8bbce8e0440a4850da5d14110d1a444e905d6355855d90084756cea6455d9c246dc18271445d6babb54e29a5d75a3abbf7de7bbdaee3911a3f9b3b30ccb9562948c24a2340eedb99b0c553705c8a47ca765dad3924e1381c816dc98d6f0e20a6638fd12d6b7b8aaa680ce3d2658f5cd9be041e6f90c3264a75ea5f262a8d2762f6b9c1ae5fad68af8b156d372d4a52daa7a62535b1ed17ed9b16252db14feda9a8b671801c09084770beb6ef245d2140120bb44aab362d4a72b2436d8b22b4a94d471152b2509a32a5043ab0fc556d463814514e65a7822f8c42f52a1bded5b0429398977a8522e00a24d8bea3b84e0cc11539a1a5284968af02a36ba8e46cf655490b99221a110000002315002028140a064582b160308b543db20f14000d7a944e7258990a844992c320c818650c3200004200004344668868a300f42ecb87a1b9e974d49cb14ef8cb25854c2b1e57508e47dd4c88e0230ebfcc54b0452e73033b8bbd2f3763a75abc7fd260dc8948d17051c9d37dc0fc4bdba5ef28289662fbd4387ca714ac8397582c3c20dc8a0fb0d1ecc5c78045018f6bee9d4ee3a41e172faa0bf2b1500a2fb93a0e2fc9b4f75b6117d3f0ac954c01248613d7ae28094a51e66e7b5d621e0bdd986bf26a730d2856a6ee1f15ae6b67c002452a94ce7e0e6d349c34f391229fab2ffb22f97e7e726bb52055286c091b93759e6df74a3412bc0c0338bc42177be672763711ba5d08fae5a2323769dd03e9cf42edc4adc84ef22f897bf50a5891510bbf51542660ff7cfddd99b5b259dd6e5aad10e0ed4319dc6c93014e34df39c69c1fe806ae284d9903c358c974d72829ff7a56d4c35a9364da08d02e310482db60812c9edb0eec2133320156535c4c5ff57360cf66aa1362bb26185d4f3275b22747209c872f66b0adeeac9af2988e3864706bcc87bb32598e2199895c6268a5035123af15e0f37dbf4ed7d1c6bda1d1e744d9e569933745ab2d449ed86bf05f20e2166061a81c2dbe0359a4bd5e5db577ff83af49a9ffa7a7ffe6e972f21d40016dc3c5319106c0066a4939057e7060fa75f7d2fc0967cb54b84c36415b4b1fe2f02cf02781c68e146775d73b0ff6c9582ee420d56c6d8922d255b24a7ce52ec5794db65c81534b404d100ab9975848390379b912f05a0433e97f3affb83a8d5bfa18d7bdb40473d11ccde3ec7e269144674c88bacf6b023f757e148adc9a8fbb0e874f6b42cede454568556f2f332d573f0a549fb0a1264acb84cca6aa57cb982ca2696551cf8e17691aae79330cacc9448446c1c8528dcd59df0866d59d9303291c6fa6fe68ef012ac9593ed3c806bb44ad1fc76b5b2065bdfbd38cd7f95c889a0b5209a1d360506c53babf9212cd402d5e7c6ab987429b302db5e87e96b311eba3faad50b9ce12ff77e7bcbe95c05108c99019e0889c28bda09821dc681e1ba01d0a38f609a6710c61be0eaef5ea508887153fb799364032c23b12541665dc355a3c48b73d78023aba8a24ec357977a1977e85be1670ccacceea101e4db316423487bd075e7670fd63a126e56fb16be99109ede5021d0659525970cead93646615ae6f825c0b643a76b055e8745007805224a3d9854349e3a8fb1f51cf4d097a95a85754d665f8752f6ada92d21ff936f56f2a1fe7e09e47994bd2ec81ea31e6aa427aab648b91a0f79cd5438fe7c5b89a35449069b444d3c690c15c5333cb613e57ab77a91c9c553555d3b59f3cc25f8baf643031ead7be9f411b4adf0837efbaceecc00816497f77059338aa192974bcdc4122e0bdd9bbadbd5e649ff2721fa1d743e6de4fc8d440686663cd5916ae6ea27177bdf6545a949fa152f683294c6a8c10ebcd68629139c0ebd785fb0cf619aa5eefd27d6678f1e76fe677949bea46e54c4c8ad9183277cd646c0c51cbe328744a64c045735129211185530f90c87a1091f39efe26ba94549853409a0021918dfb9fb7542b6314bedcf8dd2a461d1d3dad62f5e660758c6db3e94d72a634936de20bda03ebac5d8dc91fd3ec3693339004270e8de11e4ac53356296421c8a7d6b94c7fbcb51138cb35e17630e5a5a503c0133dcad628312644582f240ffb20c07bdb4e9acb23698bc32c803b0dea2c8e102db48d894ce7f9afd28be02bc75b8095dd841d2e2de1aa7f04bc305e55339bfa5da1eb05b3d3d643235487a02992cc08b033464a0a1cf8d1dff9953dd506a0041714f463406564bb74413b4c974ff7ed7cc929e2293c743a5d018cd4604c87ba38e9887e5b01c06cf2a93e3ad038a209572f7779ad4f5935ca7ea0d8f109d1f58fff70ab36dfb6cb5bd247e3212a09581f7b1cd6ae680812e7a69b64f04959668660a11bca4141bb8ea03b445ae63128e72d5c539c82fd87558a00af117b90938ff6244b70d6f45e3892796ea2552f3ddf425ede4a3272a1157389808f31420901e5d569eb4cf7478880dfcffc05d1a032a948a6e8f4df92fe52e89bafb7188ac4678fc748251f70631b521dca5e15fbb77ec9a49f6a45e1f4869cdd7a13e7bbd8faf895a9359a7db259efa415ffc11a0027cbc61167569a7bebfb7e56aa619fecc53679c080e613f0b89f31d9eb4b8960f4f83f81d081d4ec66654f6ac1ee37804cd7e8fa63686d1d099abc22c1d55cabae0263070cd05255467885af2b87117387459986270c1b5900972b938df39fdfd0b0f91a0b934a1e9f2d230947cdb4117b2e933a1b7c30b99ab0231128ca09edc985d1f9cb34eb371adc67cd5022eb862ca0e70038d07fc409aad87376c7312eeb62f4521995cbf3700ed9d2b16bc3d92b412e450ed9eab28759de2cce6b579eece2de6ba5e45d69d32f8c5050644162129f08e7128bc746cc32d52d2e191756891b24c59e16f9ae99bfd8727cb1d30338b88bc336944739e9491d9c0c9476f2b78bd2e136ca5998448973d554e0e7c884210e8862ec1c40da8a288571bff95d8da44fd6bca7d015f277ce8383ebab225b25a785ff417cc6fe2dccd34a938b66b76a663105697184b460ae7bb1b1fb91c3b62c0e8526444563e62ce0826520819cf8b38927151ce6a06727352405ec896947ce23c05f17f07c94e3966f2bcf2e28349f3257766035ef9da53592ec5b4798f9de634961a24eb2ef388d1a6e2e37a9fea2c2538ff1fa3161ca8e92f59d66a067fa75714dc9139dfe97bc1b21ba723c6e76f8070668eed2107aa0c3315537854c84dd6939d8831ada60b9f0e2631c7d7771acb3a92106af0bf8d32bd1c12036dd0df719d5c0407b2dbcdadf5923048bddaaa256d788866fb1360fe43a2ad9fda2d266a24747db3d44a58d15f9bf0857000678e5ef9a83bc96e7c7b3f98c1630c17ddeefed50f72f1cd82f762e797d9d04dfffe73594df84695c3fbfbe4fdd8c6d4534b57e60f31f6e6b80e87cccad3b0037b51daf8740caacaeafbfeb8188d737f97760689c66f1bfdb8ed5d300a946be3203a3971383e8383ff43f70f35d8c08e9f9bb496bf09de3bbc7118bc7c5cbe241f3dc1b8cc0e8919cccd3b8f4c1b209b0e2362bba509839ea76c181d87a6c3c4c8c11fcc1538985b02414499f9215cf8a1ed095b8b41fdafbbffb5c2baadd8bedfef9dfef0959c3497d31c619338d8255b2491e2ec2c953873dcb9a2f786a88a98ca0c30cf43c77e73afec09e0d64b7f28133509b9c134453afcb4fb7b470c3879c98eeca15f8f61811fe3f3b8f23c39fe506b5228f1dbfa8a43dd92b100d833e8b06f7178e14eea936e2435535cc5df35986ae002c2e2a711b6a879eaa77fad177c79233008925a0bde42489d13584bcb5d5c86adf5c28581dcb360fa9298317bc2d9cb38a509a34f5c703175171ec84828ae37a5a81214b10b9cf61581faea70547f2cf2e02d66a1fdcbfeaf84ad7f7c07de76cbfe65bd7d772e26970a52d30e0d17260b14020d35874d5f0973d80da42b1f7c6671dcceb6e83067c35b5b14d99cc3381474f6d3bc14fd8a2a6c54317dacd1c07ec11e38936d9eb34b7a60dad74680bcc27d65a91157b497852380e999990b43c2031cf472ef6dbdb511e1b36bb4f5e8e346723d65f28131b96933e89c5140e2285cad26c66688b4f7ff3c2da71e2824db2f5cc8b97f6697876d4e2ffef7862bc2d7ece05678b97fd61ee178e59bb45e13c49c2fc09dc256f76c4de3dbee4e517c30e2b26ad56b3a687e34ab48cf57a6a2d202448ea117f24e4cb6fdfab0164d9acb3cf407086bbec7d204d68a90a264baee949e22d56f3eec1eeabba389572dd0a36512ef45b95cacfc09d0db1f9f1216667114bfe96fb5722570d0872c977dc4ef75c6b56d991cfcc3e81ca02400ffa475b152f77f73702288457be24fcd2bf65b6d992c5e73c306f6dac8bd651fb79807c796b506726fb751dc4007d817fb9cedb21bec8f8f7f65450f0ffcab366b7e0fe1587697390b1326a1215a9663089b0067f19103e3f0ba40aeec821df9684c5fe8e0acdb0c2baf3cbb0c9a465e3d055a7b404aaae4e4522838e5ad4fea71836ed36c2d52810056b490a45931d3347ae4f639e143a028fd94dca4399a1eda0640227d5b19e05a0d19cbb0df1f909a0212227c12831441ba48a57cce1a8c4c671eff4f68a77221db39f4c6f103ca8c0598829f5ebb47d6a81ed4f37e8b34b1192b6cc137b49e8494e416e1a1695f3845e63a4df96f2b75fe2ea87115f97863a2ff56e7d92b82ec6f3eb9ed08045bc86e240710a99a10981aa509c41d0657dc8bccd5259d04c6bc26f8a4cef2c1dc5b85d9c4a8e341a233519481af168f1a4e01201d317c01543587268ab2be00ce864b3c92c670bd3dc7f8ca87672fb3f6aa5df17404b8f643aa37cd5d3890642dae0d78728bf17a515d94d834bab2f96ea26e8b79121c2c78d4782f573828fdddff4ba255eac28dd49bd84fad0ea891b10aeb47492f7642bbb5648475ad29420e0422447afc1224878ac9af4cb75c93354e827ad9fb3e1c8b9ac3cfe90795a4497c566e5f0d34ebac129c2b8ae2dadc5ae9f866ef9eb1565f63a867e4cccb24ab41da16eea41bc45cf0d9c19da2281f178844782111216dcaf6b7d1c5fe28223ee8152689da00ee1bd0aa3bbf28317dcb72aa1df8f663eafca47ed4e0488b31562d371f367cbaa9f6f4b9e5a6146edd79c1ea38398aeadc3fa66110e63669bd9b334d5ef35acdcd7e5165ca1db226af0e3654ec1d81428540505ab4c65fb18e9678beb427086c33ef1b2aa32df3984942f47383c56e012a710a736f5607d95a8198d89b97d919d478863d3c6126c02ac4d8e864a1169189162801d006634686d459f8d4d6b3b618fac6653a9696d571fc4e75b4422ba5855e46b80d7434ff6cebc6bd11d160c746b8e18791323a7c856880308e0992213e38102a0952203153824d2043613cdf4015c11687613bde5d954f4a826e103590e872880ae9911e1a4c6ca74597d4ccafefd3478d2f6cc5961ed65c27de51a4da47174e9a2fc71e1dbc7a9ab8f60f2364500cfff739e8f4c047ba13513d868f2626ebcad658321b3776d907e99d62349d4c4b117729a6cb9002c30a5024a786c79b6c88b502bb5a259e120c807c3d2154a32e53514282834dac3c6deb8e69dc0768b180ec82a9b5c96064073d0ecb9a3052addf7844de64fefab55be6b122d594eb0cbfd39a6c5a09f78648e5f292de8fc92085f932495ce80249566f0211c0823ecef0d9dcc96582e951d492e7b1f98d789da57fed891707ffe36c61334aa34c6e256cc427e779c5898868ff002d5402e98833e63346c4d332130c9e23f4e4a49daec93ff618bf6f69a544040e94f38c01401312271cc67e7b4e54ad12775ea976266dda58ba286f5b2c45d8ee521ef9f25bf6dda022b29f1383dc5ae4cd41e78b97b4e9becd02b21af02821e11ed75353f2c01d6f24b928aa5081ea80c01bc8d81c4f779150e3a10fdbeb8154ea506e232f9b618b02729de273bb959a40829dbeae9f9cc1fd047854df1864e314c6fcc17309c728afe482fa72b6c8faf98e3bb5f48235413c1a6f10ac0aa0bf1738e4384e27b64790eba21aca6b9b63cf01faea1a6b49492ebb89bce373f08281bdefc6aa05d6ba68ec141e2e54bb149e64c72b1c2da9e0d76f7b965396da4e0702522cb7cc81777fef8aa37b7c5c122936db7a175921b01f103f038c5e87204d2e90d85cc95db21fb17a6a2b49241cf4a4af843f92c579979e2d08fefcd5b09312aaba3a43b162c5b115347dc900a9784506e796b82ff6f78bd122c31a4e24af44c075388274cbe65596bc7d7691d506acdcc14fbc94d7ca045958b031a856054a69a92860db889c6bc0ddbcb143dc977aeb323aca19a389078ae1e4a8b86c8b12f968d3f4ca2b7fd345c47734a106aa8726930511cf78ff1d370be28e24cb6a216230863edcce8f06d2e223642eb11fc97c53a11aedb555c449928adf04d3fa260f0ec72682a2f76aece386d7f912e4d8ed528e1c4e3e35cc9d10178a0bc709c6bdc18bce204cb74e9f921954524f79fb1428393241a92b0373e3284c76d206fa082d9f827d91ca01b78d435298e3f6c49d1115899c897c6b0ecd43c460594519856ca31426814a0cab8f8a119665bf77eb7fabd24e23de8f4c8a85db9483674466fb79eec222a8bea79fff0887434701f514e2efc3e55e4894cd6229d1c89bde7bf04b323486910e59564133911726a1cbce0406f18a3ced5f271c3c60c4261cb03999393b43cea10aebff7788fa8c36bfc76ea5117ec331b0a950d52b0f1eea65cd2a6dbf96881aaf17475a78b25947d7b06435f869935fbbe8475eb1de5f17b59d3d32a08c47628f643a7de3ef6956a35dc72b423ff117458a87fbd9a3d6fdd2b5160d34e2d8f09b418db1a945b198e14f6815a3cb5c92614885bfdbf42c318a040cfec809c5e415885f4fb90a454f7d17606b4500450594f9c0102140154f6ac4bd4b1362d04036cb83e5430d9f550cd73b24154ef37268b66bfaa1e5e3ecd596fd41ddc10c37fa0da587ac2e6323f374203f99ea67336182bb013401e2496edb8432d4023073ca2d6589669585ba3d534cff2e3bd3f3d230c18aed6d47ce688f858984169d28500eb982d2921709743ab2dfc6c8a1f57c4e62c03ca016fae126a4a249425dbc98554615e5b69a0e2d9421f4776ba8f89a248fd0a3145bbef236ca01b414babc83c5b15ff4a8b222d23157e1cc1944b1991d2959db456604909131b32807e5d0fc430d47c817c8edf632ff09870527b34ed0b15c1ce86943945f395453e6d80e4d74afa90b8c47a43e4c6ffe1fe890489f5d15cb712a6ea44b9878d2fa59a029def9441e20ec825ef423e70b6f238fb2cc54300b5a96a0b433cd54ba58bbceb4a1772023b670a9c68782786b9fc23e449f70031aaa5420eefb22c4c1475f1c8863ed8311e0bccb02699f1b1bf9c99766a30602ea012df2815e2826f259c991ec275138821721a197b02b9fe1c350de437b0110ae07afcf5e60859af19ab343236491e2745f6ebe70316a49e40c363a8ba601704d278fb728068a9e104a686e5f084be246b4f1d18108dd3d0b8194f387a5899047f8b12752edaa171d40ad025a0bd2d877589b649c2d0cf3ed7ae2bb0b2f76c01b1367649631b27ac3e24d2f8e0350ac9be85aa43afd1b295492c6b0465cb1a272ce4004b84f71401a09496bc0f4c298339052943eac4cf0a2d2c0e445017f440401d3435d6d2dcf055831b75c8210f3df8e15b610349cb9f70b50dc93bd4c7ead9a9e45169c7fb32080aa71b0124a95a508f53341a078caa6e72f45b0111830508264b26a7438a8a8008a6430394ecea7065f02135d72dccb20a3685fdba9ffa0941cf3a4dd9602ae81b0913de56916b0701f15f6e8a596cbb297a69af46c6a7ede9622b6bde8bea41e16b1ff26b49bf323c93d0833a79b1f80aa6174aca4d062214dabe79b66450ba7501bfd93f419d429743d64b289129511adb26b441368e1d5af71bd9e6e1bc4c36f7ee55ca8b720c1140b5927582d01f885edf2d56ace1b16292dcaee23895074a4e0ca604b85804030547d3d2206bb98c1636d15c539178f444b6ec72a9472a15dbd5d2bd9240103674a9bca03f15fb7d8b91f8971635c325508b7a0d5643228d9384b6eb218f7015a5011d7421d19207ed6b6939f1c2d56140a9ff3e630534c46fae3d5e86905bb1f708d0c3b77df2cb8a241a0ec4897dffec9e985e061a024b74a1c992ec92562ce41d88a1fcc47fd77a03f6957b43e4e3ed271f312c17b332fdea9d9035e33f94373a8957e86121f642e6f2ece31ca5e9bcefb4fda74bc9f155be5be897d0fc8764ae14a25b8e0a85b07e34325dcad4621a9d82102b2f1ca7d9a862954784fc369b01507686953b8e3666fea801efe0f45163852be9839978b7a163e75a1d8262af09aa90b6bee318e1ae7d421bd4762a0a53e3a509dd4b65bb1f8e6fc90c3b2205f03dae16b7596075166de6ea510ab0d81c784556323f95952d3d041e90dab91430504d82bbac5fa96cb933545a9c313e70c346b3c181b49746826bbb11805eecc94c25e957d4ee4e3e55052469e5487638d1ec5ac71de4fb622ad0a6dd8a8e09f1984d21233cd4eac791d68951576e079f6c67f223fd0cafb0eefd96d9409bd925d7901a6a781e6e87ec8332cefd3c68c2dd8d36a4176089fc41d7be836abf3a47c30000fe8088c987f095b0b9e707a51860e2c1d94148357414f4b5463515e28d3b648e58835a0f15a94e027154902b8e022f47cd09a2361106459a6b95a59f77dfb0796139b31c850343ba184f5409ca97a68ec69cb28ed6322251888b1ac6844e443415c9e1cf91ef404d8fab14138a6fe1437f459b5d26be5231b4c1aa41e063a3dad6cf45587707a5d882b579286f0e1d73c984b39248f181160033be3b4099c91e8e449ea926035473d0c4b93728b4b560e86a331d4dad3b7f455708ef5734e9a02ea140dd0bda3351f34bb192c624c7e4a707cb03ac1148a47e6cf15248170514583065ca4d9a40093165dbcc5895ec959e4dfc87861f41acad772ee393a3e61d48e2bf77ddc04ab7cf401241d883fbe7bc8f8d5228e8ed77375ed2984d2ff3f4b3d83df031d045a6c41d36470eeb0e363e2012480d1b18d0e2868d684fde2d1c131e32b86e4812d46fd98637ce40628d3a86024b35304a13e3901dde6943b83850438c3f1a36caa8fffe368c1fd5d3c6d8a3f9626a1fe0858cee37936117c83d7243af4c783988768d770eddee368c7b34cbe07e9cfc9e6aa8b75d87f77884392ef42b140fda01117a0ff2040797561f57e855dc725e47095b5f142bb4f97f56df9f3d0234e667d6e5503f1b8ec7a9fe52ed54c1c1f3f33b65ca2a1d649e9b1fe8b8b3a8403a5293d452c0cb1f9ed7a68ab5a543ff3fc1178f9d6947477f4b14edc994b35a5de02fa516a7ae33deaab8153d1f833d6d4f9f06d0b423386e86e13cbf96f2ed993fea6842e9fb09b546e0b75c79a11af937d49d45cc52fe94ad0b219348329a8bd826f0c1263ff79ac3ddf257d520e311d0a1785c59ffc37001ebdf11e45c2364866919b0efab0d121171b539ceef7f180c59168e216438da94063ea7e8bfe4aba85e9956811509ae4b0094f2fc5da5f865a11c6c7696ac849abe06bd85e77dd80dfe1f3060ea3d3344888ca6b93d67a1b3498ac58392d8ec133459dbcac5535fd7bda1ed3acd133c74f0ca834ba575264760c9d31b2d92439da1cbf9dee68b4f3ca0fcf9c86d0e8025346060bd1e9aa78c575afd1a921eea6a1ea447ffc399e0d1ab34e7def624a8fff28f85497d5c8027bb50e2b2f9a2438a16e2da23bf5278e4416c63f9e45d520d927fb32252bcbe712a1958f6f5e80c08bda11623364b9106e3df607a168f81cd247bc523da940b533403a6223d45ebcb9e0a0324bb43085ff64cba7865161b91c27308855e791352cc6dde4dedb44f915a4ddd996bc079c17f845975333d4386d816f1c8a9738de7df9dafe36d439043b9f19823968f7c76253586222e84fae6f2c94e9599f7f205e48c35b8f425248428721f65693a614e8698c652e4e38e747b5a49d26c8149b6ea4824c01d2b558d67a496bf38d5263cbe6a00c752f08e116276fc8ca555cdf3668a39a2eb488b080c4e4cdc38c9d5d73226a2b87074a20dd29f03423927f5ddba997c335db0525950e26ecca795d35f08543149bedfa8b36dba65adbd31a62f3f7c0c7cee999fc19116433aa4f6648d1c7714bed68bc9c55cc30a800b2e6079f0141eee5ef147612f6d8aef4dccdeb59205cd822446c2de3fc4b039cc0f20be88d566af6ffef9f2431cfc2249a1574006bffb4ae44c6c031f811d016c944e63290d148b05acdd9138de0d0236a49a3674ba29091bff30b49756ce021e2384385e6cb4ac510a17b0ed6bee858da8d22ae31a4a738884ec806522ee03b8015c24940bdddea4cfc1f65f2704f80b33eb5657f2a794d52ecd8385c0af8a0bebd758c7d6a7a65fea3bd799c7954c240616e01763f5eb36ec929a0f2def8aecdbf00a778a5b95997f94a67b63dc8611661ab13e8f8ec0bec3411e7cda53e9852f51c4b5d55169342ab6d2bf441c53510c892b9727622f42115f7f35d491c8bd58b34a4bd5f5b7ad175f3e2e98266f5f2fb60b2bb03c3fe55b47ffdc2174e6309935167f1ec482676ec8ca82309ef9522ce1355f0c890110885b5361b50f535a21d04410118461007bab64aec3871aacc940deb07840ac84943563d5c79b194bf2014fb1397122d7c35c15f2bb95a32bf37b30f90954b22a6ed9aefc2e0ccf08871514cc125931693df6fe94e3258ecf67b650d60bfb205b9b81de9e57e4d357a49709e3cea6647e3612fa627379605f2f171dfafa265a914aa956e9eb1fa33635a3f2cf9d5ab303e955b65dc5921f41d9fa5310f1f4ac1065e8ccf36cfe132220127070754fc983dc0ec9bf043b559d9f838234dfed3e50b122a181182211219460641256ced1a2d50f364efd2515bdf9f3b828ae1fa3b6eabe9ab5fcf2aa56507ff65aa00dd53a17fe03b7e386f6e77ffa567af0c06c83cae2d2edcf68ba74d43fa08fb62d70b711495305f16d6019ce15d39c256fd923bb79b8683e6a1cf02714e90ec535b9dea8221ee6427641c8557b72d137b632c7e85ed8627f121392ecfc9261cb4b5c7f4f95694bcb4cb6d2bc2f2aa01113f15ebbe2aba2e747ca348bac4593be949b75087a90885959d5a4f6e74ebbbf070e5de81e9b23beef76a95555b5f0538be21b4e81e73f8ccb46e2cb619506980a7dbd13cd7d0754d75d6828221785df1cca59fd50f57e9fd4207254d2ea32c92f3adc5d5ec98f4158bef63109b16b215d757efbd07aee6c79c319806d1d4d74a59e6bd0f4c37ad8efa6d37d281033cd783e44a549c4e05c77c9176b04cd051e3c1d69732f7b7850efbe6bbbca44adeeb576710aada370ac4268ac9f12365ac54817b0029e7e13d3f79b963939ef54c98219a0bb2c19ac3596e9c37b08ef6d05795ea51dd49510545dae19747f97d5bfbc04e518a48f5599772162403b7787ab4e4444787c322e411d96da24ebe9fe891b837a9a345233c5bd2b86d8d481fe6ca4d89cf08e87011b2c12eecef7ba703e85f05998b8f5200c95889bc17a1d01de0c1b204de1a3b44f11da17c5e3faf132cfea8070daaa7e28d5d955daa194cc013f3f82fcac53bdc338dc6f950119ff37c90dfa322d7aa4741d8f12f35cf4fa17892a2529c79eacab0cdc282113498f28861713d7f9d03555b59f3aa34d782886476f1310f1695498e8c78c30f0422c6398e06f38502798a9d33c348a5db79628a13331ab41b272cbe030569d38c53b62b32167cd11076bf4ac2324edfd32a27b13e59dc8005926676400dde5f0079a386df8942437cb805e4b6e2e499f07d7b02d0e2d653fbb5008213afb17b0855a31ca036e108f358168149b383dc91b6659cc906d2becec89272ee64f98e2829aaa3b3037f5924ed2c0d14baf4370470c9bfc0f0b77dc2ceeaf3271a2cc8b5a5c66f78f9a34f6d036e5a726a8b57316a3876682e3fb3304f683aca1d57caae6c4a2f5ba5a104681cf1840207ec8f99bfdb8968243bf45f22cc647cea248a642e3c601d6d5167795380421b6094d299e73aa6d794fe3abb93c9ee2b3966874037ccea3bb871f0c205f63381441cfc6fe67af4114c2700833d873b27106f3f8229b953d55a4596062aaadbd3884ebbff2b0b045c6d4d989ffe06f9b5ef6fc932580ed52beb2f6b432cecfbee693dcf777e5ff725b264ccc0dc1b3c67fd4a080e60a5c81bbfff7f32f7ebf31eec90281a855e68e64deef8116bfeb294a13b86a8207fe2ea85985e12fa41c52e5561e65b0996c058fe47bbe94169c445a4f35f71d92021421aebc5d92ea7890e8b9307c7eb86e3ab5929f65c6b675bddde97fc5b15138a69a3d064ca0166970e6dbbcb5733e0b334feadc662bde3ebfaa2b6861735616f9b4185ddacc7907646e883a055732440c6ca21c1473f04b90961c0714f6623084ed74f0885b1cf532a1a35d9d8b9f0220477627ee33bc3ab9af869db2cad4c31cfe0c058cc2753720f0f6f631e3d436e7c4b21deab3a403bc6ed8b1e77f23aae6336df711c076a1f2810b91056223af0d2e5e4edd5e4999fa4f0c1e16a6dcc8f89e7ba1610ca8c21553522aae51802e20a6f52d891d7ab7aa98ec822b5040ce32131f10c9ec540c9c8c42204e5ee0e11b8c00af82de166228c24fffd37506d2d1ed8a35441cb8173a396a8f91abc14d170e1845cffd80ef8ce60f8a1fa4558ab5254086b268e7c3be822fde35f7548f9e7220d5318e70460ee5aef03512626925a8e2427c4cc102e4e53da08082e48d05d2429e0f3c30a3ea971652d473189f3acec89cc554aecc6808f2ddefe88a478f005b9f480899404fc5b937c608c4bd718ea434d3d960423ec1b8b8afbb8f0bf3e1ba18045de1a66a28b78621ea6eaba848c1396d385345653dd2eac0a4152f3a915e2366f4a1bb3680ea823c4d60d38327d421a58b4ed39e5724939faff87176004688012038074c774110e927cf000a6d81ec73afe5a3a23261754a93b3801577e6b658856ca5c2a81d4a35093af7231c4656af68d2928d931fe5017ca541f0c40441c1cc6f70434490b40bf973d9bb9a08f836c5a74784ef162b0c7e8cfd3a07b8fb550a3d1907c64e181b481b4efa007435c17b94aa01a0c4919d259f1873df03988c4fe8b2d1bfeae78efcbe1d4fa215e654b69204cdda5ec651fbb296e752ccdb44428d3898a781baa5a415a371192ea4909969afb0fa45239c37f44e3227f125a5b8303792e8be85e0630e71fa212976dc55efb76d9a59bd64bb3fa5951d6831c9a3f74f754d4765acde01d92d4396514b48ea8a85fb76a49df720351200735002f312c0002234cd505621fa5bc31bad7201ec6135b4ac8e0512420df93173efeeba503f618c8e7113f66a5af5242994b97717e823bf1347716593d5230a71d47b77eb189c76dc7b187087e59e9966d951a71016daa90d2d9ff9d6ccc51aca49b63f0fd06c1e94dd0098b85094791090a26667efa16b1b1a3721676102c8c5aaa756df44c4a87e0626a6a891b68b372c4520337ab254e8974463d9a0554f6883db8614c0847c0baea0efa30622f619eae59381153f2e499f1f4f5a214f57354b969b9c05b3d49c6e3330aea6cc72f20e41c61fa864754459f7480e10901202c935ff37f0dfdf0bbeb71df88190308083aea100ec3b60bb99d0dc3828c8391d77a65db87ad75c4757617ab5cccb28a5dd3aa80f4bfafae5805a0dc63990ca94961c347ae032a81a154204de0c83cc6fbac04217084f507d4cbbf14a6cbac620ce10ffbe456b1cfb5e0bcf67b147a7ccae4ffe3ede4a32545b27db68c97586b6f2b1d11792be9bf0d0e8a65c571d460dd549de588abc25e71bf2f6141efe1fd50236d56d42a41c9fd229291144f74a9fbf24c16cf23c2311d3cfd410a53fd57b742df24e65c01bc72957ab149981e3e0bfacba7bb875cfc3379e63c57d411f2c6e2d7ae61c97a2ce1ebd1d9d041a1621c0b1152def364baae72d2923c6f26ac4c22fd5f7b206b1f58dc195d59183c3c843e537766dd9a62c13b2b44be0fa0053cc95f9759ae797394148d6d87172b4f76556fe6be66ac64069a1d499dc92356a51f4b650726206a57dd00d7e1184064c73214fbe5b4509916259601fad91ea959c167ed20374c5731854ce8cb293618a51f39dab70e8293b4828689b13251b2913a618918956f49c92429df20cd45a59dad62b2c5f1423adf5335b90df970e69c29ad1ffe4276ad69697e242426c2956bb22dee7eae8c5aa2a7fe852429721ded58b6d9f2ddec2346c8f04788e12e4c89e5558de99b9f4d2b5b31bc9e45a3d0f7b0e044a1128bfe5a150e8a49c1f79a5010a29abf48abe13d1bfd8f4629a1db8501f2bf8d351f96fe67146e901fd786529634ee5f4cc712edd20e971111129d7fa8b066a14f813f621abb90d01eb007a1e3de6d6b2f097bc2ec554849009080d0a11711e9a712b5fd361185d8d0ffca08d704207fa1fea7df232300813144edee7e87fa77dfd33f76daf1380ec4dbca043826bb8ef0fcbc80758697179299fb811c77fe0db709617e08e83686ed3db0d1d2ff2d88bc9ed05f55b94db27222cf3987f3ff39d55417a9d397fe75f4e4df4876307d3e47eba009a017923c55fe44665904f194cdafc29f537933cca00f6413b4b8474af78dcc30086a92bbaae17a1105842b10b9535b9e1f170305462999b4d8dd7da9a4d4df4d4ef18ddef8d46a36f10eaddaab53b3be2b1825c05cf05522e6e841684a557b17c89e4466d46a279d2abf6fe7a1df5f3e34e83fdde25382329ded976685d99a974561401a528f9c2df0b66988e73ed1fd8d5ce56122d528105a15078c342ce0d42dc499d7df4978d28210ee86c0ff28288611598bb3aa4989a618201347969f46900190ea853fdd6a42cd49ddc8fa507ccd3c0475f6451a7f2fa639289b84f4b5886e07c3551c9d583003f2a81fdfbdb674132fa5c05145823280f7c2d2122a115f9956ac2d8097870460a333f94936a76edefae89a2889728a55c6f07c62ef20076db231a0fcabf8c46116b0ed5f7a440e353bc3e23f5f6f1c6efdfafd22da2e72a32cfdb1245cb49820e5b79be69c786a0d0605fe9ca082268a6c7a6cbcb55ee1910105be4cebbd23b577fbe031a87ac02d9c5ca2ab046a5a772c275021324bde0bddec254f58644bd06c059f99f65baa93825fc8b26373fcd459c162f2888ebcea1718b1ab3e8788a1b53d4388b8c59e418c58d57dcb8458d59743cc5f598ac08cc27d8553be60ebb3a32be62e315754c91e317335691711539a688638b195fb1f18a3aa6c8f18bb13169913b51067d2eac71fde14abd98829297f11d826a6a7ca37637ba86cbc6604c518f38f35124e203ef0fc95635b0092ef767fb1367efd4680630d9346c57504241a6ca70cc55beae8ab81ffc96bf5eb9a56262931399826650f106dcb968ddd07dc558684bd01fa4360145a25061b3c364a40e30a4e5e93a0f8f407f8f3ab99be1c2e5a3a18704c01a6d2a11b2fab962677e9395db2274e61e79ab4c8624d48e5552dea524846a3c7208a2ec297db21dd1e7b7131c9841d59c556e5bd7a092fc3701165a9b3ec7c9ac89a8d23a019d8a9a4a6d82dbed05d04be3516ac0ed9819bfa7c022899615955fa0edbacdddd7f8000c7617c19254d7d0c1c304b42a262798b4e4d80ffca960796003811be556beda4050ea16952f62297aac401aa446650ed04a54cd790a46105b742d9034df09d175e3be2ecb7ada87e9232a813b55594f3df46fc770d758d2378e47eb279dd8895ab07068dc832dc9ccb78a52534a57118f3fabdd9c62702d153807e84d8fad3969a5bfe1069a2237c2c34129e3e4a455b73c39e6ebc10022b3263aef34d3bf2efe9096620ab7323cdc11875e4458becb72b0f8d2ba019b12a174bfa86eadeb6e47bd2edbe1ed0b31e796a355e93db20db984a78abcc7c2880b6209848ea2e0fae726870d96285cdb6ef06dc7246f50273804f6ba55b525f8014a3ad88fc35b1d088aacb7da4bb658af2882786be26c1ac2d62d659a634c3b5c665125bbf578568d2fa0136810ef572c46ca75430aec9ba7d781e0831690cd344a704d74466cd4120a526497cf20a33bf72162eb7091cce717662606449b119253ac5456433017dd9ef0339af4a38a5f3dd2fbb5bf4567002c5931952246ea3c7180a9e4eabc82906161a5b358e95c04e2a25fefbf95021faeb4501e68aa07e2b467f30c75556a2b3b7b6d63c716ba6cfa4a920464e844cfd8e48b89846816df35119ba4cd51a8335fca0094146423b8f17d423dcd036126ce920ce78e5617a952008dbe05a6bb2ec1626d43025eddf9475d533814f7a7929232f901e58b7db0ba496884676d815ad3c63038f2fd21453837fe106dbec07a25e6622110a76edca8961bcce147d2d6997a34435ef86835514120619a4169762a0a6bac002d65c34d18257933e6d52897fb5688a21fc1b648b4e11d18230829cd16bfa69ea89e52685daa04c813d6e264a2ded3119d2432ab65e3c3b6b34384017e5d6f860cd93cfcdd954bc33b5685d269c0fde8e1382a07976c7be54fe62250a306badde7ce230b5be9fce9ae70df472fdf5539a93c7337793f3f4e365234687a3bfe36f88abb14a7fc5b6144b6b6f11b675a2ceba4c1a63ecdfa65abf36083123858a63c9f98113f8108eee47000203d8d1ef19f3f61acbcdb0347fdba9fb362291ebf0cadba9a13e5893720a018b432472e572a5052a3f606e4db1ee72b05b2c2c5216161f4d87f4ce73826f207a65267a2541275e126d3bb259fff86c64bb3740cdfdeffd2f729a4b91b9b70e082595721f8ffe25a690f52ba395f75d6aae67ce6c2a1632125634ee4fd524a08a7401817fad648692af9c50d963d82268c88683898023131efb34c8c17854c6bdc350d6eb98f538804075bd0ee98b953e65a618052acb813e654594c974e80cf55d23e95428e4a9243b9669a4f798ff13f9562e175a3c84af90b213ecff8160eba1679473d536738763cdcfe3cf53ce8f3df6b7514a6924566a0d2876309bb081e0ae26d077fdeaeb4af428e45995115eeaf274a9d123134a570c503d447cd65588f8aa87d525a063310d7023adc0a48404ac90725799034f1bb9cae6ba562b9597455f85f8ead060ef9636522b959afec2e5bb49468a63abd5fe7a786b61d9294edcfad97b4472d0c91e81086920af6f850e7aad959783cfca847d6234a04c9fbc50f3a038e64f759ed08294a7766cf11a7292310a567a995fea7641299892c464c2118ebf85c8cef3ad76845ac3cc048f06d3b4dca633212969732ab39a9062842184390bb51dc42717ac2e125eadbd0694407dd2cf01c37c10014c8fb78d15224994fc7170c49bee461c5db39cf051594297e7712f41b3febce7bef60c461b004e1e177278b10537471ddd6244b1477a1aa7d6d98fa822508da576f7b29465220a5b8d90f4a9e59aef28ee1ea505d2adc806e62c9384de4002c8992f024727347e48570e96599c4401525c02f8c55da93dbd2fee6f7f54e4feef5f709f600cce393449a98f7da866e3b23bb51f0f0b0625141713c45f13c003545ac7a9cadc6e85ac3e3d18700eafcf97c76851030661f47a8618a74a877ebc854b128f5b6de6b5ebb359f1aac18706701acb61d67f74b25d73fae0ff8f0cdd69c8cc0038b25f4154881a91bc644581321fa8adb1fb6b1e0aa85fd95a0c4a320763798ae9e62e0523c5fb8f506ef4389f7ad79f2ff15ca8d999b40d572fa1464a2127852bf7c1c3d11acf0d9002a8140f3434a5fba963772f22da8f992059b37a8ab8f0ab76bd88fcfcaa892954d23e74274f5c4c3135f3c2b8bb5e30f43f34439b8096af1d1920e75bc031f0de651a779d134eb2d1ace50a24685cfa7be9a3ae914530d361972b4739c67c91a818d4fa6dd05eccf5407a1ce98929fd7356c5266d2d799d9b76589c04ca6657558fd17d4e67f09121a86005a795ddd54afb0ac4790d1e4c7e2d78d80327e7f75ec347a2774beab834093584d703c395ec109fe5c89213a7a98abd679a4284bd2e357dc94c71105290a1cbd9703da114853dd5f9a06ce53e264bddf437895b12c72bcb92c58289b3818a634462d0b60a71fa34e755607c36cdf095791c76ef828913d02bd90a856e88e3de694e2530c28dd049d34908ac371245a0472eec29087edc958b2b62bc6642021a893dbb936ead8ebad202915167877c42939fbfeeb506c10494544d47150ed8cc8d6a2f98a5946d7995446182e45e5ba6cfee642bc1b353fa591d4c9fb52d337473d55bec487854c6db1a0b2a15c607f585ae480cee1e227b18a607cc89814a73ae09bfbd5111ebd026fc82e20810aea60c8c49bc44ff33b3fa374b6d180075219a4981a8cd50aa7159dd4cf1cb86cd3dd4596e22605bf03806e199800a9d9a218d40b376951c7660d5be062fb49420e9f4d8407e2fd02b92507dfafa92b372c8db35f846f70089eb9b84d9305bf67dd7ddf729dc2c373b1c8fc1c9f12ee2e4f1cdc3463c12c9c91951fb104e3b302c2efe3a3915b19bf7e9d5cc1f96cc20102e1e433643889f85725ee8578c261b28eeb00a5408a49692993aad20e557a98129e6822943862bc8ff4c207b9803e8be2aad8a3db4c9b5651cb63e0ed0d70cb5ba9076f290c3c4b5b6834cec5f35804532bc0fcbdea1b049fc369df50c8382d62c729aa65081d26aa861d576a122301af97bc02c852b18708e84f8b22fbf00203804e4e765849e366bf649b0305da80277fa0a36457d8215eb53210e23e6454c2e73085edc433df041460b106cc645a03fe97686d87f37761e784f71b3e0e812525e6580823e7487e0375886f368ae8b62b2085ab353fedb0a99e6d971449fb9a94007d58a794482a8c9469db9e50158383d37bfc1314d68a2d293436f58adefd8e98f43c317105d594928197f31a8186d98e77c4c80aa261a5b814c7f88822a4fcef4a10d20fcaa54779de2ff9d601111bb671b057c422fcec089b2537c5ab5555dd6dc7d02cd3b4a26135449519c0d73e80c4e96fd922073824046027e2446ecb06d582cf4127c178434d498ee08d87e8315257f68f9953d3b6b1755cd011daeda32fa09f5f3f2f3f08ab7a2c4ff023ccfbad54598ba015cd2283822f2da66fdfee73808c3923a42172da90750603033924d1fbc9e0711a59e5f4e9a3cb192dbb390fa28989b6b6fd7e7cfb168860a462d742cd5ed2f24124a7b98ec350f1f7fec708d12f09bf12083f4295834713a34b1c893c7df1601222f9c2ffd96bacf1ea1a2022513e7f5418d96b85ec8a3081921f9b2080070f89f9c2a92651f4f095ea2ae1c5111dbbf46dad61b6ca89277b14e4ac0eac068168e8e0691f4fc702fd8ffe0e3fa2b86bd876adc4ae15182fa069bbc73dc763df8e4027aae8462c1f560a8d6a0e5910224c555e57373fa36956c7a82f09aa777bbf60d35107bcccabc6446460a2908762c2487de332191958621cb2226689c5f41078aa2a603cf189f392786b873022677084c40ca48da4cd3250436fa7e5d24aae2ea8278e201d12b379ba4ac6abb1594b3d039fbaadf4f1b10c08d7cbde89e5aaacd3601eb711961944459482835c90415263b4750c86afe7ac1bed3004bf082cb99478ba0914f2808ea42fa46e27f7b4b9d08f9b930b4801fd57aa2c251902bb273be286536ad028a270e384e36bfe4c8f806c019212caae14f0c195f0a7267cb6b76cb420d775bd21beef6c873eb830ab342c4bcfb4abac108ac4c65e7c2f86fc388cd0f7203bbce450daae73b8354450725d76e74840cf9c61b24799ca8493c969e95fce987c5165bf036f4b9748973a86a948fa8833af699f999eec15d58b6a552828fac0449c8020cf0e521174e423936d1843fe2123f65b999b16601557314ff805e0c8885dbee7a4b57f807f16867a3d3e379a7c6e3422e1adae831868c155c17a5e54bd2ef9fcfd5129a4dc00281e477db15361f28bbb5965fb7163d124b093053d597eb2802669353d03b4dee4001d0f7ece20d22d3820020cfc6c45f2d9add8702e4cbba0681d6ae56d51d70c007207bf490d81182b347e3c6a773ce0b3bd00565762ff5212b0c10ba85297da7b2edfc656baaafbe642bc401079ebf0668c93d7bc99f75ffac638250dfbd84a34e0cbb8f6b7e33627d1ca97a88e3285f36370f73078a669a17e5ea59099e730863db927e643ee9d50da191b37e50adcb89e98d565f8a1bc2ea765df33ab8b688ea8e2670e81b39e334a7c192e8afb13bf1f7abcf34127717a49aaae783c1559aabbbc0eeaf789fa6248a449f97d19477cf15713dbd2002b17122996c7f256c8e5b10e8c390eab5e6317f385df9f8d769862b57fbe86881a04f262991e55dea74f816c4389f8ef24dddee919590e75e44e149d72639270ff1a276150b132c64ed1caad01e01234a3a7b9c58255ff9eab3861576f3ae74717c0260046a64ad9ef4e7494b7422198ff717111633f17ff092c31cf334e0af277d652127de3ad79c0a1b09788479e8f67242cb668c5d307a4a575b4f5ea8e86cbab4aa6fd792e12c8ddb8867e99437c5adb412af042db92a25a5db1fb5582f09d09e9d7adbe9d32549508c7ea34187cced877d09ed633a1395e349d7d8d999c5c36ede274786e0e84bbeddb29517e0c967551b84bcfc124ee345c4864599453f8681559157965b416cb4520c2b7e61cf93d2095386d2ad4356c41ee6348d7e23510c7d1dde8368d934dd2e8bb888b88cc43477399b089a5bd9ee6d6a6ac449d925cd8cdbd3fbbb8b30a70d764d6517b336b6c7ddea2d643c46e996f9cfd0e433b9f9a34fa41c20f30b284b6369abf7ba4722c7b908f62618c98f2052707540c4356181f88c2a2ad02f4c66b163fa42c97e5a1e983561c3985a3828c4dea85428184714c4a8f5aaa1a91f44a2ce314e9553e52075c0a5dc5348a19a1485a46b0af5cfba655a0e7ea27d0cf7d07a66a2db2a89679ff482bbc94592536200002a4d18d31ac667df28e13dd3a9680cd493ea30d77192121029bce89da990d004b8ef81bc61b283dd6371cd38fd3140696ec8256802d0ab284a319cad6967090a960ff2428be912d4c23bf7479c48960f86f8654681034f6ba2694388144ddcdde00ea704f6f3deac6a4362fa00a95a050d0f28348879913a0d48d885651c5c09692a9a43f73c0dca4c6c76b341ffd047007c73348c289cf393701e6526658c2642e0c4b6014ee66262973001eeef831d1edcc1f5c9d1b953cfd9f3195a45b907c1211574b33764eb80396ee212f953b5c90b47bb34d06b4d7ce65950870afdd362d9cc09de8cbedbabd76e370aa23169b2455a692c21bb298c1f79194a62bf514cb841495c7e439a06e18046c621ade218c1d31210c5a8f3af59cc2ed54aeb5b4b563ba66b6e7f6f1d4129b77664d22b1947229d14747ed9d336ba29abea335449259f569a75a554e0fe28532450f913fe68b706372e51a32339d36f72c8629de009ae80dfa9f921c3c8430ab2a774e2fa15ccae230ec0327bc0002bb2f270b0f5ecf9808958b00edd98c4a8bd88216f1514a60a8818d3810dc3db5f0044cacaa9d32c9b08e397fc65f562ce61c466c072aed5d1e5446afaf50284b2f899f8fa035cc8cbf4771d2ab91ef5a84f24986b6630e6e2248eb1fe20cb5e2acda7398b145e8a9e5e15db587fbbdf2c024389d8dfbcc72cd35be6aba2e4780e63c8e9439a0d1b4a499008fb849f336fce82a0488212e7b6b67c3af892354e7a46b3b937aa57990c1864f457136e4c3739b36823f18e1c014bcfb567c175e0f7a26d4940eed313ba741fd6f80233bee5b96f413834638ef4f09e79b8a15e3066793029707a6337ab69506dcb0fe7cdc241841aae8a398bd6f43a4e3eb39c61da1b3be63c2d77d008d2516eebfcd252eae3a3ba2c29ff1728b3dc54a9310c90856cb73bf9a4c92dd0fc2e7d0f9b5ef7acc718692c8ba5ff0cc6fc9660d33ba944bd05a57bb511b5e140302442f002e561ea16b2a169189d6aa188d54c7f1301c37c0731f6074a433025ba67793fd93ba82b82b95fb377d7e30681275045f8201ee343f048808248fbb5bde8c1d7afef0cbc5704d2d43a9e8be008f07b1139537dd0aba3e5da2aed81a9819194a8bc0875504c7d650d54e8b3ebc7acb8ac314aa2cfbb3624a71b651a3d6e9c67957dbc45fd691d35f81d96d5b2b89705fc6b325f12eee25e089e24cf246a8e6225618e05b5d1580f04b01f2e8358ae13d3317da2f5e9b8e8c01d26cadf7aad2503258d55e3b4dd312ae880b0418e425357d3217c88dfd35892e468fe37be1099b8fd7e98ef33726fe2a1bbbf259a0a703a2ec52b88f01391f3eb0da00c97ecc5b83b32a2b8211b41a113057a668a8d828a925502f5bf265ef06704ffaeb28043933e9454dd91e36a93226d997c823bec574211312d2cfac366aa0b1557f8a09d6e1d0ed894d5fda054b6e02b8581da38f9da967554bb1da7ca455bcb109768bf17c38cd4d104dbabd22498ff3e28e9a63e11e9cf165e56b4728a5bed01db25f1e6d467372e3881ba30567553d3d94dafa9271bc087d37441855f816a9679cab94375f703a773786f2344131d725162c84737123568957bf494911c77dcce2c024e550cde2b0cc9e64dc6d452f069cb03912f3ee62855e01a0bcf41bcbdae382a19d4f45a5ed2e32beda719fab0389d0ed7d0399f881933a903944aec24a387891f47038ca7f6d2d9ffcfbc68fa49042034424f64a81dd1b6b6d11468573e669312055938bb259dbe9516bb4391f4ec5842218aaba7af02159dab125849d6081b1664635a26cb858847002a7513e1ae9e111673092834bcbfd1d0fc025a58886e46dd7ef6816994f02de4cba6d8965a0516516f1b7fc84aac7af8f38a6ef5ada27b8c92181ac5014c71c75bbbead6056c5a5b550b70a6fcc87c7732f4126e35c619ab1925165506b3dd677ba7ba34126876b19e8816a79d5c1dada7dc8ecff50d9fc8f1e01710ca81b8f5764532221f9549326a9aec9d865839643cac108338efa853f4f36beb6e5c776ce640b7710e9e862123d023eba5f18bc2b4c7a93731b2df3a5e94a818846cd1f8110be924288bbfc885d0a9d759fb71bed4c1b22b6cddacb23c5417eb55a9017c36c7c5bb40b535ae5a77e12e8e0509bfe7d5f4c1cad6ab3ccdb61f70584a61e3499f2343df66e34dcb747446136a0db262ef39d2ccebccc09520bfebda35beeb0bb0f6b1e48f37ba59053e310a277912587e50b89f7aab7ea780ae97d65cd69f884e49daa9a631c85f82ea2cb6d7c42f01dd2cc713e42f45ed2e5b63c21f96eade4d87884e8fd64c971e50b19bfdf56857210ad8e5f6b03f61f301c9822a2797bcf1196e54aa8d7aa09f4b326af121fab097ca7f5af4670d747b5d3c4bd8a54046abf9536dee8410cb193ad0e03b7d79fee8a48ed2e18649b03bab6ce2dbd6195db119ecf8aed3decfa746c6e1287bbea0bc4ab8537a838af4bf3f9bc6450487578bd8801fbb7192083f28b767b09ab53812f03cb19c9f7b77a128d03abad126b30d0024324ed58f698b8d2be2c052d98e1c75d9088f662b5787773155df7892b923a13a2db6ab821567371fa176f6d0df790bc240cbf5d36d9e1aa49d101d24f5e550527bb929898a807ca29ec16dd87f47bfa9a0d4df48485c1fb95f24540331ab20169349506151e0ec92f25cb92211ab3b6e2b5a7580711d442b2ec9eee4bf6ca3dc6a92616c01ef65d24f1e4b81da207e6f4a4e98f21d7755378d0b2e261f6f502501fecb4c866418a0f6a93404a16453ba537bfe6830576a6898d55d4c0868f5a0c7874086977613e72007a15bdf50770ae1301a27a65bda999f5ed16a8d484903f7677dbf458347e61b672a808c6a319c7dd415e979e6e7c3351de50cffc4aeb9aaad5d0a455214d221f297b8a077138a13b41472b5ad7d9c1b4d2adb76a7de626e5d3c1b712fb62ba29e12ef39ec7786dae7607c7b82201233c85ce50bf722bc81f998a7edff69c4a6cbfd62ca9d03e3f53258a39a3f9900e1abcdc0d2392b4e4142703e265ef72d34ddb16f0dceae0bbc9380e0bcc505efa8cd5f5701e02da7b81454fcd7f2bd6b4b5839a460e66c49db5c73c89df802485a1c6f6008855e216c4b4a00107fcc81631642bd1eca268a011b691bc93779fa9f43f55b03c8952cb0a5bd3e8e8e32dec86570810eb31489355c977e4bc9e53e5f3f3408c0b8b0fe2dd5034aed83eaa51dc665c7a4fc2180b0e01972aa928e0e9927cb1a109cbba9a0211cd32e4390e2dc6f2e10034a951c3e0bb33ba6ba57b9ddf61326bbf4d24eccc6a571052900dbb3422972bee15dc2a44b1b3c45097dc770226661f467190dc9a71c378d82f57c80c35a528b3979bc65cd64ddeefcff48774e2d5651c0badac0524ec1b84ed8eac4aeb9a604516e448baf05745420bccccb273383722993e7b42c00bc017da0550346cdbe0432a827030b5335a1cb442bdc5fc3b5b01fed597e648e3e988b771dee1c774d24f7168b4ff4872bf2764171b16a27237aa7f2bb870d91b7639d2e61af5557775f1065b4700e7a5c79d8ed312bd88b2a23d148b9eb0dd707b8cff67cc9656a635145ef8ef7acc4aa93c5a9ba9ebee48ab1330f310ca637e135f28f2abbebb6800b87694e03f9f63e800dddc78996d06747a931cc4cdce706ec046b54a64009318ee425a0e6b8b71cfb046477e0553ceb52e72f4f936a3ea436b4db0a220f040dee61b7d1d9a33ce2a9654c2f9d1390fda6d8c02f6948bdaeba60e7270bde1a0033920c93d50bbf6c1846651076256dd796950a9b00443c84feaa3acb03a22953134f59f9d552dab1cff2760430371f461ed801553768ed4d843cefd31e8d134d264846673211958af649e6b2b4ce90e28bffc9e9e638430cc302fdc0d75b28773c724a69a0b2da3c1033bfb5b1a05ae58483b198e250ce5b38376cbeba4c5e2babfae18c2fe7ee658429b4363a3c423bc287eb269830294c45c948100e8037e2ba0541f56ffd6eb9281ae71e4ff2533efb4518987556904bc51659c8ae838a4c35b6aa3a929793e5955b68880f510ab2815f44b5856c3a4765e131de5f28091afcf7e2f5b530df58691f58b64e95bf1f126bfc23116758ea6ac3cff8c47ea383a5221c8444a341cc961649f79581e1325cf5621a56376584115a2529caa0b6ce1d8065b47105185ce7a0865f9a592bf2e19d8fe68ee7a237698522690fe60e22a052e6d8d3d8a7e6d197c3ffd345befd237f80bd283d8ec1c0e4eff25b5df7a42833827c397d547958b4631b6dae45751f5e0bdf61cae4e837d5e4285c279fe5cd7a90e67831cd1b370cd1ef2aa9e5630bab20a14ccfd09478f31ffa0a7d9639467f20b3eb43dde55d06666001b9b0dc965a9a5181e43e47f8fd70a9dfa0925a588970ab40098e0e7bb0780a131152298236eef86c1e0bc75c4287d820d10041bb48b4b6ab81d83a184816fccd73241e41dd795e9855d85fc364e73aa624c33d74bfa23c00b8e12bd53eaae38fe73c2f3445780a5e4c4c49e04abf68b728e00e7445ebbb39f9b4b5760f30580adbc571b59ffd2b3e8261563c2d7c361a33842ee631108bcf51b2a0eeb13bab23a47589238e1ca50602442e5a6adfa86b0f9406932ba481743f0144769fa23d3e7b6a2f87e3c53ed89227957e700ab3bcd2f9ebb4768198ac86d5a2bb9e4bfdc51527e0fca9c7617d6899394b9f523b706ed783470b46d78403c2a2a2301615f62ee8127fa5e8612e5b5e8f20456346fd397aec0a2d0698b37a0f5ed66458375cad7051ff286c8bca0e76949af061298c5567421be9f72ec6343027e5fb5d9487304feea495247d6a765614f927decf396ceef6fa65ae14f387ac35b3b76202aeed64d740cbad1432a7c8e09af3642ee74a3f3db715aee3eaeed5a45d32faa0e5ba0190da1a6d010da7582e6bf348ad292bc91446b4d35d4b5a6be5b7961655250ec20c819c04189aa6f6a1484e2772a1544b379ba70447425fcc4f3aed8c9ccad82d2c8c9e5f0e64310cb27641af09948db08d6b896d3afa3f4d696ef240e11d6b5307bc939ee6def516b2039709d34e6a233df09517da7e90f6ce26a7dea7a965aa822a3ae3f617a0cb10e85401604a95c94fb3dcc939ad32b9b337a1e4807aa95cd88da76e4a2a978bac2b8eee4e8149c18438b0c9786af1bb7b845d09678781391b70aa220507e904871ff809c1a1597a05f3d9c461c815409cc914618e4bfa18a1c378f6491848f8b79d1415294e5d6a7b851b1da32db08ca543c6069112b79c3e7397c6a9a2ec06ff42c4c169502aa3d2b20c490cad59609001f737a34519e878160577e37da0090d9285ced4d1931d3bb7d8af3ef2bfc40fe8cacd523b5f5849022975f07ec60cbdf42e7de21d3663af3f804e6be7ef83ae0ca052554f74a0fc2665b4f22c894b56b1387e6a2ef8ebc6efa1dad1aeb603a29a5098983dbd78b7b2124c79121ed47348b485bb3d0a64bfbbf3399aa4705709e65bd6d9fe0385b02c33c7aaeae8b7c2d109ba137271a02b1502d214d7d4f86144c22b128d62558243e50bec24995ed937e61c696a82d85c7e2759a0c596a5c9adfa4aad00014c97ca6583de2739aa273ec2399608bd94c4fdf2f0cebc88d709ca3541284548cd69f8e384f6d550121653757e1029f5f41175f538716504c1a75ce45b842c2b15e87ad098e43a7f8c142c8533824eabd89d3ef4abd8f227336b06313316eeacc7453cae3a8165ddf1e3a7439ed84ea068a87355b379362f254c28d927d8ec39b49ba4315707cd9ef27f75c8dc18c3ac04244f3d9d90544516f46b3b3553e10dbfeaa0b075d88e741da98903719820cc43966b332bb314ab5714f52ca241d1f47aaf1e22a5b3a334f1725366a304ae0ef178052dfadbcc162e0be21c055bc3ae7cee0faca39fa4e89feb8db9ac9eba7ef6d4c04160aaa596c36b3d88bac02cff3012deb659eecba17501deaa9fc85c5db87d797c718f7413b5cc6f8dadc76bc84a96998d955bb2128e8e921ccb6a550fe3cbdbe6cdf7ab292f887bf4a40f34e9851d4a3cce806ea3db1c4af783858b58cc41263573c43979f9e61714091c3d0ed8de090d57ec50ed5674461ff60de5f129ffab062e91ad518e614e0c8b2a9edb3169e26d1afff878ec8d62b6ec8405d844b80dd8703b88b83ec03ef488abe2540d3c0b0631a2fce4c24695a1ce489be00e5f9f4251380565f0fb5a7c0e8ad7c40802c8e072352ee4e905ad3dbce2e0fc66217c82ba1fd4ce016ed43a1788bf9a233f250e3dd66781ec77e0363fd918f163e239b9cb1db449a74aea5757185a74819045b94a8166cf74eb1d9d48c2560a56e3a09a917840e403385d432b22c8f03c9f8f8e771932ae27d44737427f2d81a63676e9170f2f3c1741bc79a71b7fac41015a90c08f138d5d9e7d0ad04195ffa86f7e58f64fe8c42c19ac2efdce29a186d4b541043175c9a8085a7cb8da530bbfddb4c6a1d8cb59012930531ebf5b4e9171740d9c368d8f4d3f8659c93969e9669a5b2076fe4a7652ae5e74dc2995359ecacee554aec7fa5a5df3f79af93e1b89a64a67dbdd48d7c48bcd8416acec0cd1da1c237a1382527c4fec5bce82da5680628f6f91dc22bc7d1d196655dd53e2640c0f6e027430a5ce33ffcee969dfd2ab30d1780cefa2708c7515225e2204c11078e7da71d39b1cd030e1a93b4e80eb4ed2e0c1b95f4f41fa23adfd50b9f802c037b9f228399d787ab78c24366d9cea9e6a20a79a64f7da8c41038beb081b67b1f80c30dc8b34a6d9f52618922a5d1da9208f63307c293f58ac061da59256ee7766b33a992d8b3bbd693740598a34ec8f524ce0af271ecd6607797365c4a2bd8dca7634ebb95bea6b2c7f8398f65fb92dcbf9548c64fd541953a07ccd21429aef7536a5afadb16f54b3834e13cf6bdfda91a7e903d26aec0ffd5b7b18ef483676117a16e7916fc26f41ac26e1eda30d304790897a8bd90d7727e3644d2687ff63b1d38897c20d3558242e2bc5c0d9422631b22e708bfa06e55ffc77031f1fd23ab05e310e8498f4ba4d65aff349f281f4f77b291cb02ab2d46373f5e55772ca83acf0e93efc2d24a77885bb3b76c55a19775762a20cf5cc7147ea0356542fe3b712acc1562bb39fdb7d8aa0bcc711d596efcffe6cab5878cd3ce5e6eab7bfb6600b50e1299d2816df0d34e83e5fa385695a0bca79a319f269c3d29ac9015f7235b4d1095869b4c56af948176ac6d92a84a95d79058c426e60a22dbd48bdf66081f62818b9b476a18428bf4298780f8ba3b51ba37d6d3cdb0329930d1fdd42e131b03139bd4b3720024017034bbf0668265dfa99218893c166d5f923449cac7cc6e10d70c74ad5e94c098ff334d86d9c983fe7b36b1231e6137291a98ebb863bf0e4e5c5617b5804cb4bec92f8d95a01f3a5f5d670189487e330d89a421b77e58d5dbc7706431cb4f57e4c6575807b1911f269086b5af633c3f39999f2ca239bcade012adb935ac1ef66d38c8bed95b230a1893f1b078972dda0a0775e31c15618f7665cd3c82ae892019080779773aa0668d99953c1c1dc065ca35a3fe1d7a9077b37b0dcb4a33867434ebacf0c5486f3a4e36ec1482d0f90e42aa10d15d3f14c9831c62a9a7f52036bac1de0b0cc8b409762c09e2e9b48a83c5ad08c05c9b136f328b995e7155b34275c07636dc3f0031586b9bc433393b2181f2e0a52bccf92f2957dd6328dddc3f843a71936f2c8e4a930fe04128055a49f21e1187ca34ae786e022c712001d2c23f35926361968a9e45986cbf5a1d7255407bafa5484170cb1138096e822287b74b21e4dd900dd2cb1abbb698e7e8521e43e50c9d9c9a60c05eef18133d05c6845a97895d7d69a3c30b1f11429d97734f16762d702c239ac29c71816724435314d1047602912d0c6f04425c64d8558e188e3b8ee0f02e7d7a524586a2f151ca67b28f59970935ac0996b0d79ddf1183991c9ed1a0d52b07aac76c938bb6a9599f9a14a4b34f60be9aa83b956f4d285eafaa3eb4a760ed89b4f591d7e0a1020ee591fca0b73782106255a1bb0a523d130d6ba94ec0c95935c39aca06da71c2f6c28b87294130c4ac49aa7a52caa3ba1ffd93a4ba0f39c55916a61af42ce1100711a987e138b07b52f46c42082046ce64b84ff06ba74270935afe1ad88cedb17e26c536dcdb61a2f7762c0ec14914a2931cfd7753eb5ac3907c12df1b1e166829f587fc4637509cbc2d5f52cdc1476a2c7f6ee632e1d8cd91f1493f45b63636921bf09ec8ba8b852b7a87c5c2d97197345dc01506f883cf1fe2ae3e1b9b6f6736b035d51a1eb6d58e10293597cc04d097d4a9433c4902032a240234174d761a48f15ee1cc628d718245d9e76a14e285f584adb5f8bb0fc932eb19cc2b22f0450387810e5281359717966d91669ee3e0faa3a26640d4d5156e9af507e17dd9b36585550e0462ffcbb06aa3161808f120a8aaadd5ee99c708074bbd1ab04a7ef7d03e2d76a382987692473087d0b3d8f6f169db8fdc41f8379a1a5c8b5bd65d3d71b189c4e29c85d7d16407305bd5e790c74afc9d22c886d328bfde3d4b8e60c8dc5b6b2c1e2cd8c3c252f3d6301a07686dc619a008f7c5b2f98f9ac8919553d0adf8e5997462d5729c2b7d5112530691d162b93b797ac202097875ea6406a8f6351bb56a9993d9ea2a255ec06e0272332f26839342402acda3c34a1319bc2188910b93f0eaa83ceb2b602e57899b1b8cb818ebc1cd132c2a536112520ff8dbd73d3b928e803baab6d889ff15ed752160550f1d197cb4c1bbe0379a7b73864c90fef9698179d7d73be9a5a025124d80d05023d104e1b9b9484e861aec7671ce8a18de2b9c8718f2e1d11e93e5c967c0ce1ea95c894eff555483b84a0fe2592ed705165b478516eeafbac0f3facb69c4001914fc81695681a0639f3ac7a182ad8c1359c2884c60bce890a559f095d7ff82baf3c3f00f49aa92fe0d23d337d4d781bbb379a1263f7cd466e0ff3c9211e655659a004047cbaa800c8b4369bd7635c155ce985e55cf853b9feaf803ce3b0340f6346f3bbae21795348e726dab6a460756bfc0b78417f31c0a75d8bd292727dfd7eee756889fd3f28c8d8f291c8b8063a774ee8f2f585a7e0dea14d5dc2566e473a4552fb60db0446076f404524479e5c07c1dbd2c2476f01ff8de97afa36a1c489e5c61854018a84f6aedbdca50fbabf4d7e95d317111ede5a641834b778d001e7de763841b2cb7b80fd836e1399f84f178b2c125bce3bb200c385c383b8ce0b0649ec8798b2a80e353326c9075b33b34909a3130500d9acaab893225339a03d4c20b3c716c16a975ccff3a64643e755d3784ddbeb79a55579815aae78c393d53f8d2467717f4b932a5bf3082e831dd252cb3bd8fb80c1fe65811ff2a4be333b2597a1b1b8479e6383a66a130e80f5c116c2e9500cac58ed4907f029eba92b86e01ef63b218f19ba86f078d4bf71bfe728dbc60972b65b75e2312a14c84d36f51239c17b331ef8d766f9ef2c872a8d891c16eaf355d8453a9dc602d56deafa4925d323417a020b24c236c82d0634e0e977b684ff340944578d9f2fd906b99e2720100a4f14e42cab53121a66cdda5f4487cdeba7cc92be732357628f1dcde8969d35469cf7a628c136b956bf6a5b1783581a2b82d606a0860101a3c31522a3a6feb41eec7b29305dd284eac612388d6c242e1f4303f735959e8aa9529aaa2617a295225cdbde8b6d763753074cd18e70f39b678d06a52db2f1d43312f7c53b672e4c79361210b5d69f3b4526ba236132978735a2d75f7c834d4cee250a7a6809bde6ae85f89645f3a05d7a5c7a6fb86429fbe2ef44c2164179befd65e9719080d3e0ce523c7f9580ea878f1659e4ccde8196e1b47e3d5f4899d453a4bb99a0f1a47f182441ba66820c740bab769ea8484ff48b83d7612b5f46a8299ae49eec691f206fc0f93d0d391f29f55fa5fd979d2c106e8b7f38c777ef8fccc765be0f0dc2f256e7c01fc886a3d1c3136efa67312b6b49158c65b15f2977d93b4ec1b7f3275280b8ede106961c2b015f058217a256d069fc34737fb45e4ac4cbb05392c9d86411d9679cced593b703d99d21ce627488788d0b3bae3fed60f5d5db825dc58d02228e9fab5c2f7be43d12fe873a138a7c1d13c7150c7bbee86efdc27ea4a98ccbad7ef4119eb6a81906422445213b4d772f55c5e38e2f7104e30a260a4219dc360b535ce644ca976a88a4c8133159b02fe505ae20e9a98293aeea2f740b307c2c55110a2501dffc3a0a5ca3a6061b1fc24be41bac9508f7ad117dd95f3e617b29f0a345800f2a3bc0c9090062922e2817cc83036727fa9ada224da4f8857a3a13932031506d0317ad7ccca22fd5123d934b8f1916dc94e2517d1d3ea65b2c4ac86066e921d78af7365a9270149cfd332188d789bdb91405831e282839b65cebe1d6a8b880993cffb052c58024aa719595b200e4a9336f5165e760f739aabbae6cf6caa6adf80cbfb5b4661c6963655b6853c55dbbe865c049bd0c33b76e7c615803ce10b00040385cacd73ed9cc498a50900c40866c0f9e8e06111a1f7d7037c1488642392b29bd0caeeee1d5f05680559059b2b637b481f3e7a9f19d4a851a3468d0c5e08d9a855de9037e40d7943de90366410d00fffb13be80088240248908db104e986dca93a7bdab183070f1e3c78eca03db6101fbd6f0f6a00e04c00d81b743fe4063f7068e093833d800e80ccf824000e0d33005688156285582156880d801d9a71650cb0e7bd17494a69bf4ab9ebdfc718e37eaba5ba00db00dbc6c058e8017602ba1f485b226057a2ce7e193e6f57eba5fdd67a2b916dc1b1c8e6402eb41dd1a22adae74057d50ad8d9c57d11ee3368cb35ee657448564989a8439a9c6500031ad00007dc273edf6a07743fa4d1280b32e5e37e7b950ed081858e524ac9fba49b8a45bc2f62973fadad798bcfa7573e9db5661264359a692ea933f933e44b199448ca1a63c2b84378c63d5922e62763adb5d6d74b8e8c0d423856824629a594fb077f3c4a68bf8fe262af17a4ddd5c5c652517edef2e9598d0b9c9b16319c9e988c858d149e6cbf6f474a163c3a321639b218be221f670b6f71a7709ee0b4d838516e7c5cd8bc0f7fcb6121b86dadb55e262fb4b62ebfe244f9d95270de409b23c3671f6badb5064929e47a314a29a5ac36514629a594a3cd1bb453126118f53d21e40f753fe44b7bbf69fc0b637364a494d65a6b63ecac86cfcf1b82cf2a8388ce9051b481abfb6446118e2aae97b5502c14577ee939cd701be3d2957f779ce5ac55e63acf5a270fa6040d94862989e6d472ab18033125d1a573ced9e586ef0c5cae39a803751797add4242228294939ab7984aa736ed741b66ba19d6bd72f7606656d268a5e0db96abf763ff0959640b55ecc6597f8f6abf2bdf4ee3c18b7b9c189e5e8ec7c38760d0f0b594f0b173e0f863f4041422fc4dbf56c08460c9148f42ca746dced84540e907070ed5f5bc4d92695f15f9d455fa51515b9a26825b26478fd294452f51ac6788dd1a5bd3aaafea868a857f9559a8da2a24c8d66991acdb0d8082df24a5bcaae9da991f8a2eb2ad4b50deafa6e0b02f517c83b03c85aa6827fbae6c2ae33d8b5ebbb7ef974ad5d74bd5b74ddf574edc9ba86b1e89af3746db3d3358e4e4ecf601211c22b679d0572ba20b973af73625debe074bd73d3f567d3350fef9a856cbb7a5aecae5de8ae7d7ebbc0edd221d7f50f5050ed5ae8850567d7b317954e298a9e0dad24ba9f4159e340af3fc57b6dc554ae5ca9d5de2a1fe7e2bf093f546da9aaba16735b3ecec57f2c3e50793d602ebb5e78cc9c2e7ab573d66a45d76935341369bdb1f0d9c424ed75d5238ab7290b912213232054a4afab4a1b7275d587dc2b7cfc5fc10aaeaeae121021d2e8478af4bf8f6739a47e1fe7753626a0d79f33570de2eaf5b39cd9ffe9f7a97d295e6a7188f554e5e7e9e949aafe93dbadcaadcaedf69a14bb5e99bbaf27d7537ed2a2ba56556e4daaadb6caadc66abdd5504aa216e86baf05e2c53a06632e736368075c741c43975b97dbd3d3d3a793b303a7a2f6e21a7eba4f379a42d4d3d31309367cce695d39e7cb44c52eb7a81fae44dde69c1453e1c732aaa2f0f4f434e6c998dbed76bbddecad72bb4ff68952dac47217d32bdc1817982eb72426c5778cb5b5cb6dc3b8d7e9d76b8c76b97e723fb3ebe5cafc09f6e47541eca71b822eb72eb72e376f074f871818637c2fc642669fe19444b7a86bbcbd2c9e09bc1cbc290f07ef060f8b77c5b3e255f1a878529e0d5e0dde94274f8a17c5a3c183e2457950de13efc9bb7933784e5e09bca69b278347022f06cf890783f782d7c463a2713929cc8153a2d49454fd38b753734e5be974c1d04cb4f65a5b9d7aa872420a951f27a72d4e5b9c9caacd2fedba5843bda05c50d3a575a9ae15c6778b13978bb1fdac53d49c135f7c43d1eac55ea9089a5cb0d0c7c9946d4c9d6a008d131a272828a84f27e7066e3197f3e4a6ac5d6bab53166b0399e3425910fcdc73b6e371771c86a0a35f8ba47f135a4a69df07add25a095a11e87becb5d6daefda7beffd79ad7d8d77be13b3b0e4b55fbe083f42a56998374aaba0222eac00cc83d22da07bad7fd674a75f49ae4d49c3f51b9c35dae9a7358cb50fddf55a78e85c10a9654a1f80d4a3a3a22251fcc73d742e88f4c1bec41840548096b828b784a6b6d707a1d2680d844ae3a64dbe963e4a206638c698f3655881d9c7972254da5c4243cff49ae0f3399044140a20fa7756f8ac515148e96ab4041aaf56e75ebfde0735e242e97f21edd745f27447c122da81b766f70f971195566b52ff2cd23f5aa3e0ec7c89cb9aace17f3da79ffb0be6a6e06251232d8983fe8e0f8963774ea75f2a8943768ec857679708afb38ba4df0b3ba4fd5d98f4fa1dca0df2fc75c6bd400d727a83e3de044e7d703c52c81374a945aba9df7eadd000b94250a35a42e7de8754e77e036a3469b3065e34d468cc130c800a5ab4d7d37f814b535cafe46b53a6ec3d467c3d74c6bdecae9524e2caf06be56303201ee4a7cffdb5da0004027ae0838ab0267cfc3ac7fd77b572162d816e9ce03745f0db748316a94fc323f4eb116982be1a728bd4bf6112fd9a541f49cd0790a2a3ef8b7c00293aaa215dd2b2d2b85ce95bab6f87941f871d90119935fcb38643dbaee5b7d9da127e25b926250d0ec9d672a82409ac869fd6b810fa4868af9c0fcaefb496ae60b54687ced3a5d59aa6975297f628835ddac819fdfcd1bf33fc6823c6cdf01a42c990ee8f3c09ff9112eee35046e4087e2e9c22cb54ace12bf9d317e9f34f9ed11268e4947a95f23a2169aeb001a1a4e23d23a57c2ceeb1143aab7f25ebd06b551126f888b1280d37552d6a64f1d588b196a858e7c436ac44c5ab4ac358f8aad7e740a421a0074d95f614abd2b655af5454475358aad7bd7b3a1df88895b052554ac15b82536f092e65d65a6b0d528b744eadf88b294483a4acb5d66a7f6e8841eeb38fcbc5ab85eed9b28e85c703fbf88e8d8e9434fb3973b9ce726ac589c570726e746c76f807e3f15874b2dda35bbc5cb87cf273200eef8f05aa41544aa129e50b49298dad8053dd8b9fe027f74e1966ad42492a6bda4e493d3c85c89576a59cb2d6e60b14068a43d5b257ea3e72cc1d6939f36423cd9917ce2c418148cb191bf5816b1884d1a26ab8d7659599264a308344126688b8c28c0f5466aa9891c105a01fcca430a1e0fb0aca244d4dc263585847603dc1450ad73c4c1eb80b0bf7c40c209051314fb8e0e5091644c05f5d563d6142961a14762a13595a256431c1b3be7c204697c8b2e22464e923ef51595190c862426d59273849e384ef2eabca64e9c0b50aaaca5cf54ae3b4aacc0f29bcc4190b3f1cf88d151a04c7e9b2aa4cd34482f3745955e684b903cf5768e1b133748b774b54285ee6155ca7cb2a32595cc073baac22f38482e15d9755649a881fdf008807fc7b322bf02b9e75bbddaadcaadc6e4e4e4e5b9cb63839d1fad37228dbd7749da0746528fd180b297abd4dd3774467428a7aa6b5898c42adbdd74a1533dc30c5cc114a4af045e9014d540ac63c494182103040a9a105261031025b8f19253078418d922b5a6af4650b32744a95c8a06067975563b2c6a8e9b5cbaa315b28f0e20507ada568bb17fe31efb9e71ced73af3bcffbce0bbb6bef77ed5052adffa56777612ee7e7b2f4516b08629f748eb6ce3d2b197d3b187d21247a36cdd339aff4fc91ebd85eaa3eafe809a2c47e3f0a3e5fde70da9c77ad52ea8d4343f6244c02f5ad0dc758a8528da33ab45acbd9ac7d706c4ce7a32ca8b540db0a51111c89a88c29b10c91b1b93274c62cda208d4d33a861e3c6ce4f4b7e1b81e1d740db3857f23cda41414242424242412188a3de1febed96e2d96c686868686816823f8ef66bd5b14356ae631ede0976741c889d479dcea1d5a4f542af5fd55aea354d56a7b3e72b72e8c8a1038a354e58311f3ba363878e1d5f341042e02eaba4a0b2312af2983b785c4944ad1417f552305549a1025f93a6afc0655514b9cbaa285250658c8a3972e4c8c1a3874e961e7bc78e1d3b7af8c879e263f7e87ef4e8e19244f47b741d80d6471762b43946c55900301a46c29210044e54c8311a021d8600ecc2258c9857975cc280e9924b18abde259730545d720923d5c74f7209f3d46dbae41286499f21045e39f069b5f8fcfbf66d48e1d35a6bafb5302cd10f4008e102d448f6242d567b77a7811c1d591d8995369736de2fb1d635f0712efd7880153e4a2c231f80f00089436e2a6610a848b7148f7134dd0a3d54a4df97ffe8681f65ee8d745b03f5dc807e5fcc2f39106edd7431615dd65ad7bdf6ba387b5d52ae07aeba25f8daafe81a7161652c8c6593c034dd70ce36601bf4113c735272f2b52535f280d238ede2a28f8afd036ee44505840f8cc46c7c7e6044053ecea53997a458546946ea8cfef741bd04208403627efb4630c6e2a8eb7641f25b7c731704bfc51fd0193592adc8da43c36b1e43d0916bcd397339731cc7e17aabad5fadd7c9a4f5881a1549497ba3cc5969250349f18a76ceff7f234f82b681db2f02c5b0c9543ca2227da9e3818aaa15f200a05e6f0d93d69017153d8b293eaf4cc029e12dbc865be2a47ad5bf9fc86f4adf3ea5df85494948462802c216182059d22a4b8241827dc71ff636444acaf9d896ccbef7b2b6c1fddd13a1ef8547bca75e48ffc81259e37f546715e675ef7df73c4cfa3e16c2c22431e685495f52ce11c7bcffa36f43590160df3d11d891d877df8547723ef60bf0be7b50666d1803711e06debcce23a9cd39b563fbc2a419c53415659b4c3a38373366838d936927ea7b168fa4c6f3b276f3e39c9ab1e7b08fc1beea844933eb79983405897f4e9834635660b815079333e7569f32fc36321cca0aa09f3e119bfc2f19961252d2b0a0e9e6a720d9bc7ead7f3f92fe4deb4d98447548a3987afd91da345394ce579b8d0d4ed68d4e98a4f3fb6dc2a4294836bfc3249d906e8538a19259bb09b758f07ce00e28ebecf297599cff48735ed6724219c619abed7bfa495390f4e77cd214a49dd79f54dfd6a3a6f38549df4f41caf91d267d21b5aab3fa3961129daab3fa3ba19259d3a156b197b5d88f742a16caf0575828c3e19025bcc5d928982948b1dfbff7c31e693f8ca9d73a85b43f274caa4c619d8ac2372067abb3fa36e016deda3f56a61d1e9982041b6bd411582843f23aefbbf7c2a429b221fb0d206b3bb4eaf589e02d119c8921062b25a55ab5b2d11aec3bb0bf0bbd1feb54afff43c5650d0c18abaa430a58882042cc910eec504987321b0691c986d8ac4d3624ab57d877285858b3f48f15cc8e25aa9aad71334c7c692a420a6f59266bf3421992cc72b66e996444666dffaced1f6bd6feee6d380473b5ab867f1ff1d556af8fb1eae3acfaf80a83d93f622a990d2d1515ebdf78e1a38dea5175360546f5fab21fb8acbd6ab236daa818124b3f1aa42ca2a2b4b7d67b7388b99cc9b7f7ee2244295eccb98c5ebb33f262200189457afd9e2d63b1107addfb02bdda3bc2ec48ba693fe082159b6a09ab1a029e1a2609385a98309957348c20ab8824544e9ca1f26443411027046185135c5c6842bb0045ae49e62816a1a132a14053a5d3cf1fd50b68927c2e20e64d163a41eb0dc1e54d27e89244f33735aa21be59124d58d59d38de0e7ee1f66dc781b8af54d7b8d23b25c64f3b0e752701a5d4f3c2c7dd29adb586f0a2fa1c03ceb7adb622a1937ae1708c0b37b68f71f738f4d0f07177cc7de5388ecb780c4147bf8f6f0cef8a798c1ae1ee6bd775dd7347316ad485e3f7fdb5ebba717f7ebdc1d8e6de157e72261fc76af68e1cc771f88236db1f627459b58685ce9f685123a67b4c40b12dbf352bcce8b26a4d967ed365951537d41e26d5a64613f8ba04a6d5945454d39c4ba88d8a73044e8d44a84b26c818e3049430574f78d8a1764313903cf9c0145143b4c0c50b0e351b1aa9b34e8daa531fc512f4515235f5518291a18f528b047d9cb618a6933ecea9164f280185294a122a2cd4c63ff28489530bd24c894a521b8f22b0830a364491e5090f1fa8d5700cc0150a2e1c8126872482a8d1709459552cc061044c5e9c4ad8aa8d53e900546c89010d962b2b4ed47a4ac801889b0d55b840426d9c5215863ebf98b1a14a4b2a882d2dd4c616943044152ec002450c350a284561c115449801c1093416e42035842dcd172437786121cb18274060660a19181da056608416334ad4e68f50690ed8818b07a4d2589961a286840a19189441410bb08288a1367f46551a122b6b9e20c10a1f965451529b54dd07c52cc84390be2ea17ebe389f7f4df47c9d01f9d349971d01729761e6e0f60cfb6167d7b62340ee59124939e7b419099d18d05bd31756d45b6f3cd35bef3ca4779d7abf5e7aeb8d5f5b6f97de5b6f586cef1cbd633b1f0f0b594f0b173eaf73937303e6e0843f4041422fc4d9900e8c18445bbfbabd77f7d2326c66f0edaa79bb6ad1de7bd3a05e145313274d766f57cddb5533d87bef1a366e18d18e34e0fd81608079f3bb790e1dbadbdecbebbad7ddeb6eefbdf56b078f4c33a0824d51595971dbbb367d61453c1beaf9af14ad55cf9abb8ecdb84cfbb78679373639bb036f0b3436a73ad0b5710fcc4a1448bab05339f4f9d4bb4a9556a59194d7c601ee39cca0eea9724b860b9fede2992fa7c421413a9f89a9a9292a6aca8af007e807d797753fb8dce3fa9c5974cb7315fbac9a47d67980c4bec659c3c72cb698f50cd5d9cc3c44df968c19f2715ec0478b73ba9cf3f3c358e0e37c570531d7fdc839087f10a671331505458a940bf650a44c494981322585a5dc281898750d9b2051b43678d06c7663729bd8178bd9fce7aa39c68d76d46d729d3459210b03c606697f396912d554edcb490d2f13adbb2d5c261be5c026a63edff59989eb68e74aab526b2073c79143c7b653efd876bee6b1f908d4a8be5cf33a46f7839b3526376707e63ae3bac7f77dbea83a6c091feb63d7d7105e54dd0faecbce4668e3e6be2def4848a5a529dc772feb9dba54da7ae9f3290cd4150af61d9844040d036f549d5d99ead303af5206af6d0d1fef54951d0e27919a189d036f54ed3a10bbfda18ec1abb44467f45ee16e3826a0db70d6778d02605b4abbf2da70b6f86867080501fdc8208a012304dfc7458b9ea19958e41d914923afc5f81addf05a7c2596968a7b63549456bf94f5de8b6598a968e5eb4729a594e168bbfefa5a6bfdf74887a3febad62f7c5f2ec985f61f5f2c435990fb575a0c0506a8c617151029d85e5441c04e80c1603018cc06b359c190a467ebb0664d155a2a48824b124274c925091dba54975c9268925c9268d25f5d724982850ff4fc49abbd98cbae97de9d07ab55dadcd8dc486d31b0a76ece7983f325cf181563d6daae8319cbc9557cc9d1c9d1b955f1838681ce8ece0eeea1d3daf9763e13784d7c3c1f0fbe72a134123c2c78585421e542992182858c854c4c154e78152a54b1d4f920db7bef2deba10256a5674f3332c06030580b17d9858f0b1f98981d26f75071c4bdda57f8bccf7759a8a0a2e28a8d5111070707e7c19b8d61e5e4e4e48021154cf411e1ded9d9d9097f320f0f0fcf0f904c26930105b9b0ccd80ba1174c383178c2051f1f1f9f17a2982ccec419deea934f9ba56668fffcfcfc0cc1d05a4141414130624081c6c298985f886410c998226b8a144c4d2184b5cab2923143c68c15ba2c39cb8ca219453c4a118d221a576864402383296e5338e9f52753af750a2619d4c8a0c6b46238539a1a366ad8c8532cdd253366cc9861e386569aac821b9b060d1a346e186989c9467bea1f6847b42357111b4bf53995b8b172a4c19106555a45580d7068806303b17997555a376415b4a470e4c011974ca8740c5c183d54330340002000b316000018140a874442912049f24857f2011400105b8240625234178a4391308e82280a822008a2100662200628658c330e31463600cdb6e46a16a0f2a8c8d1c0b8bedae3f41195bebb7f4b69bcf3cd4d88c2a2a2b74891112f8d68098acb88232cc44726e090fb1ccf60db5d44b5c179192604b48ebe0eb926d46c61cfc9c82144592521361d5f9efc0a031c4ab9df70e59ececab1acc20fd146c310b17359bae8d912690027139b41e70e572cf39368b0b4500918fa83ceb9365313410a7786032413c1125d22278b0389f682b45784df94c97cdac2282d2e0949925ba30e7a6383080d195a231f7e0c04010a9fc84854bdf218e63f657f8849b4fb521e50455ec6d381e224845f5003baa322607d229e971cdbd8f33fdde40b1981f303288bad75351a763d1a5a6842cb7ce9c29175cb2ee0a2e2a1a9efbe5e2f924a6a80cc2cf72fbffb63dc4b2b90edfb0b5b2fb8b080ffe7879cf5dc1b0ef7a10dfcff951e0efe4d5338d2fbd803b1bdd6dfff4fbd84f0fbe5a6100b76cf900d48fcd2030f680e832c79e2e09dc1f72291db7108ed054ea7b65225b55289bc33f0be6c40c4d7fea368321ff1e49bd08da57c13b2c96a4571f9e35554b056905696c7976bec0c125b9c362cfa781b1300f416d0afe0af6817810e0175642e42afd12d4a7dc812086443b4cb3c0938ef6398582f21aa5c5b956b21b62ddbde0b554c11ac9b227a78ed149136665efa097f62b5e85de632ee4bff834d20dc54991dba49e56e3020401af4b87925c79442350aae77045522b4fe00f093fc5ef6889513060f7b75e22ea646d088bb2f238e130d47e96fca510dc04556b7344a8df76d094c8edc55237f4f73596a54dea2a7e977a94c9505761f69a0bd6743a068f110235875629450dda6dd643260c1809b95c1fa3025e27372b0cc6e2108aad6b4e0aae0b456dcbdfcd581582d8d76596bd2f3978178b6a484d6c419a7c1014b6658b13d5d85321c8a5189d94b93266ffc42f6b430a7a3151d8251dbb9c3788fcf630bb22322ef1d6f99412e4267e8f8cfd1cbeb86d522fa6b8b68e97d998955cd54a4d24ae7662ff9746a4e3728ec124d445012ae6737b96ca65cc821d947a800a08fafea518360ac288ca13759495383ce778de799d1f2cc0709d935c0037d91912edf238d6e1024f02ae7dfb971eb4c467a48d5c92ff5813cbbd0b3bf3d3bc367a788ab268e4d4b117c186bb119b274d9df1709312995fdb4f1cb0a22b2a74424ec855e1ad4e55d8b4d3c1cbaa2b18159169431c3dd2503e3c1d556d05fdf56aef9b2fa30e7d70b8e7435984c23a95122b0775b99306522800948e54363a225fd23c9ce5fc9a3078aad0b2b5098781cac228636396ebe8f6d397a01701aa7edf76fdab9e9b40263b64bad63a3c7a720fe9bb547e4b93512fa2910faf43452c705622d823bde83c0310b2e165e35139e7137178dedb9c8dd79e3f4fee71acc2b6b262860249c5fe0bdd75d60a635f4d892c152cd64e08fb0b2b32758d43290c46139a6e52d7cb5cb2c34c3d5f0ca241e80beaf6ca2cb6266e7106ea9da1c5c862ecc80c745c71d536ae240c9ea889794290b1c8685619e46b9e195210ff4d57a515909d447ee6ff7bc0fd2241e4a8b81a51b3ce8b507db84b37427479323c18aa8e24e4f4337b5f7bf3782f313e9f7ab7c0809bfec14c14faae5214e03159697ca4bf877b68dde4b769ce893d001f731d66fe67c0aa48a58af1fb790475a52e8e0d7950db36a697f8120e5cbc417ee7d7feb00b33f76ed924097760fc8794f53a68d813d76912267d8f0460a23d46d7cf295c5cf66153f1a0f2d2ef4220b0b895f1b77c97e69020e12a407e590568fd170e477b6440ea08aeedcae14bdff63bbc36c75d4cfddcb42c448c0a6a0bb36ceb20ffa1ace072ef1d352cfe68743dc0be7c9f4b7fafa7d985fc82533ff4024956e15e23ace7502177295990122a7f0c9000e1e43fc07a7094032416464c98503b6e0e98948f2bdd5b74bd64b7b7a3d03ab5c4030424936df81e0ff0cecbe6ed1aca976098d9d4f758e856fa8e39df75342b0002e257cd025651c87af1313a18b46714411bd71c8d051761a6cd2e000b25650fc901d38ec1a25162b306ff3cf5010f75dff06f14f551cb956421c7aba12e8817fa3209c00a1284035464ead9ae6afa05c61f121d3b9ad0c223450b448dded4ca1009bd1dca511ca35478d2ac63d91fa943df2fd0a2431eec58caf5c66ba2576b2f518f50d58f25bea45f019664152e1bb0b5f133988d2b090313a442c2fb646c4c209ac3145fca988a97ec3f57b52ada48da36b8f2f1925aa5116cd96331247ac547d9f76c779160c2ec38e515c4b36d0ddb26c3968b6e1eb6f0ee2077bb41d03ee5cdc02e22e8d6259ed54f4175142a4773d430e3511116fc1ef0cdd492f97f119b83fc839c80cef504121e0f460ef8f37d0db27c40cc9359a3bd77bad531b936609097696bb670bad30b704b3f0d76674830df0737529c46162fd62962a0b089b6a4c4b069c5c2f4b02f919c72b58a31025ee36dddeb2c89b7832b87e6629df668184c4612d2fd48e4d496b6c4d31620f72693094c507b6151ba6aa2a5104c8dee1fe76b998138eabe686fa83b0b1dd5a8b35ebb8f27af30e4c57bcc0f7ddfa310f4afc5150805220bf0b11137e2d6d2622c66a98c05ac4718cf62630bb9f45621a0218643d08ed1161225c44280af9ba1ba5a0767491893c6b809412f18ad25296115040a2ea0e81da3c388dd532371cec43033d1550be8b68be74461874f631f7e132d51264a89cc7dd3fee7201adca61c890d8e82e5c2870da93aaaeadf0fa8084a5fa8bc63233eadba27e13e3c8ce04599698ae0a401efda4122ee56a115eb3d636f5245158a143d1d2bdf226e000a21ade5c4221879bb38b16f6bd3438feff7fca0355f00c0821cca04ca0e173fffff921c67206fa4975dbb2a0848d81891a65526ad80bcd57305e371cfbdb28d631603adada750c885d60d63be3d3094ebb798e0a2b8b34745a5af4425150c430dd3e2f6a6ccafb7d22e5096228842cdfa6a0c88d326440c03e882b182864d597286f4bd336dd0d1325fd171af4f196a8f08c901f929e78d14e51c938dd13ff045dd553d30b124be7f5a24dc31c24d4bb67a8a366dba8b063d8c843c31614b21c352c350dbede8550e5bd83fe65cff1602538e8a307a9e39b126d865d0c5e246a3158095d0fef2824deffde56205c0b556ca2d65bd2178541621e5a9bff26aafa7def06d617c0c1f306c0abdf17c98bc115f6558e87e8ea2ce030f2f569ac70301a9f28d0688521cfb8eb5bf1f3f403a00319e705747204f9fa94482f69e3520c3a99dd21d7fc58c8fd78cca17f5379b22c094772f55a46d172fb4990b8955c8cae3d705061d55bd9b058d173881c456e856e5fe294419fc3c83b3bc76a8bd01da1a11633bea02aebb786ee8098eb0c96424cb838555934f9eb89df265065a1b994564a1606b5a3276d292b3c32064737913ba4cf575f71f5eb5eb3cd31e404d1d81fed0fb4e6eb1a7cc05bdcb1b48db9460ae45f68162de16fca3705f6f6910882a8040b12f13caa46292be8e7e627a9d0767bba9cd543cfb7b621e8bf38a3b2983408aab77b8e86b99e4258cabac79baf850dafd83fafe103bb91b278ba4e26e7375870355f52176cbfd73b5efb1a2d64dc3d2b699ad07624a4e02a789728963278b598005171d65ad8ef7f2ee1de20622cabac8994b62f5750a50de28a76e192eb54b6f9844802a057da5e4e41d53688146d1e05943391ea8656eeb6457f75b9aabb40e0161d0d2d2d1c200079601a17e513d2950a84602543ddf74bcf7a68f873f128b10a6a46438452bdd754b5fc904c3e3bbe8ec578a9c5ee65994f0f20a6da97479701e6d21eab508ac72a4af75825a91f679582900e7e806421e9e9b9b742e776d37e8c7da523a0719024351e0528e23de94c809d8cee00b3a8e43741bf20ee3ee2668003469884c83d221e819d96a5855bc2657d48a01c849925b47f3ba4ed6de060487a4393fb6fe71c5ffa7197f44c3753c16b7ebb4b66a1836511e176b4ed3da400ab8f02166750e3a0768994e2031cbb74d09ed207093920504352deb6b09d770d016ac4969db1215978bd17b6cb9ded2cf7d04dbab5b9bfe271dd37336318e8cc75688132922dee75b963cfd200229d8dd01c0c3b0ab318783769fa57499868d9de83800b5eb91427a777f8969bad656eda3e9149daeec0ea541cb9e04d27a25462d3ad20dafc581a12f80d46991308a7c1d4da4b2dfc7ee9fda22156db11cbe8a35232f3bff5f60a0c7400c10d68e2511e14cc2692808967099acb5b1f3028a9255301c89b71f185082db4c0f2825049ce4518cb0384764400c9abccd6199bee579fbadf485fa44643c121d4b71f6112711bd29a1041cc66be272af1bd601d5334102c0028d3456bc19d078428a24624edf70affea29336a7f1b00ace15050d9558b01ccc82dd4b87f322dddd0b056f3631b9db50e7e4e285961e5c2936b6ecb3b7c57a87426750d85161d189336c82e88e154c5c184ac5d0941f6b41565aacf058dd611984c9d5b7456ec67602cefb6e5d7a93873bc15de04b07c26b12121f7df92fdeb2123d61358833d585e624ff26a7decefce01dcc13f04c01ada2ba746f754cbf2fdedfef3cee8e242c0ce358ca06e8091cc1a8751da6b76f4086824ada3850630a414fbca1d22e41009009f56b81340e57621cc643da4d66a37ad6b0f68ae5784e2d6a3bf8dfd20fd1edda403e0939922b21ce2cdd9e21f619cfaeb19b8b1ead680fefd4539d9688dd6c3eac018450b1148f902d2cc676f25e4a90eb9de092f485212f364b88af313eb910e82ba61c304b48fbf10bc66c1286ab64db2df54d40a18dda49be4f25a68b3103c74b2e958929e631d047a58f0426a982021c62de7329d1c3c13df4eab0d5fe99ffaf06f632216250216cc7496d9814c7e04a100d24611ba16836e62e5a7c5b9434d3a306380fb43c2052c94e9167e40d4403a6bc9a6e5d0406609dcf40f333c77b8d7dca8e214570c16a7026eebab28ac37cda7dd006a198ee68b6202bc6e9082e297460ba26096fe8086510a8bf7d86c5b451a2726cb40240534cb7cdf17eed00da6bede955426056d18eb93d02ed583f3cd3265c8e7aa9d1cde3c67b21be5fbab233a5900f62341e2404c31ecf288ee5645ad991d8e5f5d21804421fd9eb2ef5743b0440b19076bb4b8737f138a6e92316faa21bcd368f509e3059f103db4e96143da5672005a0e8d576d28e915caa4aa28ddf3b97d3c9896145efe9dcf19cab9fda96add5e202451468676ab2781ebcc69a48aa721d53aa461e56e4e3878f26c28cb9438f6310b0f8443c3b8ad89461266355b01e8c52401266a6fa65ab7e8414cb7fbd99948088066ce61a0dd4c5af0ff05653d17d41cd3c48e5a5b3c8cf0c0a686e206f9eb0b1e602dbf12be44de602f94d4b648a9e929a09441109db7f1d224e93ea852742cd18ce3c0fb5a10960556bfd7d1f88e7a9eeff1f5e7e875aad42a483085fe7df067c9da6bcdf0b3a9655e1a3aaec3039f7d2c29155e0dbb3c16adf70fb6c4740811d0fac3e9b309482434f7ec72bf5cb10f79551e99b131dec4bd2b3f11b35e72a0ae0acc4de63586ee8105241e5c6d929dde774c90d9985b0173245bc10f1d35355562ff4daada67c47c967d252ed76e2120a85a3bdf3a8fbf20c0788f04aede4d3bc962edd7c7440515b946daa62d38d3ad4cb3831946b7825930c1c0ac1b089abd657b31177c22c20ec5dfa147ca860b1a6f6653dfa33fbb3aedaad175f5efcb4342462a7eddfe2843e745b8608abfc84b61f64a28d39589fe4e69912df452be9e021c252439ac9ef0d5224aeb05adc6382cbf78620b60c1ee1f7a010161672625396a181d92e1af554f6334ac85ab1e03e0cf8d1617f9102df8f37b0f524d5ccc0d21d11316c776a4409cf4c388a213917efb7723de9d51466b0a88e7f6a85c9bd5134137906abd4de9883d41cc56c6212505df818637558ab261b4de7ad8b7aff07093f593884ecf975b31c475e2a0370cc911d7c47a1ec3c9365b47a62bf4b995146effc19b71ae1e950ad2d674ce1a2f1cfab538e4e75f54872b191b105d7d2a0aa3db25cac99d5ba2912d14a70852531b778b5cadef4fb59f608446085eb00ef854b70975cab5d6323d7df05a1db4ed274c2bb1f088a03295cef0a06cc275eb8e77700539e919d164ff6aa26fb9515569eb7f1e31d635e9cd4087753e5cdfa3e61398d9bc3dca5ae07042bee6e33851e3ec599ae774da2c97adf415feab0e3e3803d070a5b7e5926f743ce5545ae9e1d30e94692c166e805710c8dfe5e9ffa86dfb8648d577795aad30720cc9742ef0ffd17fb457a56623062ad60a06db8f9d7b07f8c6a1d2a9cd302ab8cca81bc22ddde211938cafd956c42821e4e66eff79d081ec55c2dcdc0c1f11680dd45a0bd77df4a2abe50499fa5fe95c0966180d09db4477532f271fc039cb87ef9ec4ba40a3ca0004b27e931cc74ed7eeb375c8117415448cec93cd4644393165d24658e197535283d4a5e6494a08bf79b0e1712ad03f75631ad49c66b2292e802a66ad819a71f13255e1a9afe90d1772427d2b4df783c010fbcfe849127f426f85321e03290140fc58cdb8c54f3b722119d780eb17ecfea2e6c51f309f02f75098268952159d1f54118e20dc939bca6d2cd28800951a3fb85267fa20d4dfa63f8590f9d161c16c30284646b77dcd21cf3e3ecdb1dc9c020e3979d85f978adb279e1173468ac4d6383f8e13dcac8b3e01497346777b32c10ad68bc3601de3c1dafa2948cea2475fd518f544d601f267ffcedc289cbeb2b464e90b70517d8826f392cd8683e6a187cface88dcb207f259254c03582e5475fb09d275939ccd4951c0342dd7419f583a39503d31a82fb283e30ba24a50bf0efef829e8982dda1195c7d4626a9b84c9780211d21ef48af94634cd2ba693592f3593ed30185862a9809363aa759d0b484eebb0b329432a4f8fab672b6b7a578b3590207e29c4748ca4ba45b8f2633e744ec588cb71ce4c5439806d79af27d6bc23a9c4660b80077614be1920a118001cc0b3537923dc8d4d3dc3d3bcd7dc14d73199c4172039f52e97c925ff27a22eb7164063e7948fe59d09e7947cec4aae7f6763306ac6db800ee558a9f677369f1b40670294751ebcd6c8ef54f1bc768ba3179d4339d37cc3426c93ca77367306c7aa094c2d51457460c045efd414b1b11d82e2e51bbd320496617bdb4c5582ce4e4ad65e599cdaab3b253ee332e62801ab919480b5b108217b76708c12444f612fb1952746295a3842284b6c0176bc639b7f1ded209182bf3eac24dcc70d0518beeaa27a1c1bf2a39817d0dd29f14cb7efec5e08cc12634e0ee45070a1ae119349bb9cbe35d31aaa3007c00ee27ee80c419e748a62914ff81a9ba2185df6550863cf62af9cdbbc23e880edfdc83ecc041d233c8db865794b07251922f415e58bee7a1f0a0cc17dc5373bd5649560f60a33c4cb00f99110e2a3d75b62722f0ac8e45b27b612e16b179f168171e95f0709a6e6d0a470e9c5aa356fefbc454aa146f43de53b7f17a83a1560783046012062af4148f4d1f48580723d47cbe58ce08228ae9826054fd7be081be4fed4fd95c4747514dd3b797f605f847ab3a0f1dd80b6fbf1a79f29a0595d74d0671f9591080360462bff75f3cae897a743ea272672e8082f6f26188144dd9a254ff98c22ba82436a8c5c466548f99da78b4748875b7241f409aaeeaee0785251befba217f06c3e9cad5ef405bf99bb6a2d83366da09260062bde6968471bd05a0f05ef7f5c4da2e229512c009166ea1ed0ce99c1c2796497e23c8d7f512b1a685841c522cb6bba36f521befc5704b5b6ae9ce19dfb5490bdb64ddde8ace90fec9516fe83b51543199208b33b86ece64b4f827a6b7ada5f882a02e05df76572c8c638a32aa4da46a8b3c06a4ca4059162abddc944e3ca4d685cc3b8a2c9b9e1cf4b0ab2b87ac6cb2f28bb7ebcd6d1a4a47823a33fbbb47b7098bc45441f6cea986853b90b8f78e447ebb6dc2443b0781c7511c933e3df3b465c46d7c90407686be2467e8a12a0d2750483b233822feed99e5e02aa0c177b81df01de70bb823044ed33e88be47d8d4afc2a41e951e6bbb08e341349dc04634e8ffaec0f1d594e53985e2ba82d767da587af118f7290da6fb3781ead2ec6901001fb5796978596a1ef33213c799d2210282947a3d42a734215d3b12714a29e5e682e41fad2ccd5457ec549a55863f7772f9c05e39fad78b65eef1d81bfd6d5430b6d92382376c0d4da31145024cd11d2b8f43dcc31116d3a6c420ea3c2c1be10b8d4ea1267e8c52d53a24cfd3becad1c0ab47578df5ca72db8d8eb5d97b344453db4088eb707cef9b5b40ef6dd6e2e42cb40d09ed1ca802d4e948f09677d3107393e1618118a3900cc5a070702c5543bf7b79c14f5ffc1d7f65da484a5dcfc5ee4b48070122b5fa54d357ab28871ee2db77391a1ff1ffb456ee8d633e31d8788c3ed2499405c273baf641bfee8d9fe0110ef01b3c48891315400270b4517fa2443ca88c341bad33380d45c1d7dcc069a051c74eb591f8d18df2b9cc28ab40815dda018c05e3bdbeaa86f0aad998aea91ed562b3c9c9eb58bae76eb80ac06c34406cd7a14a55e5c1c3ce3e4945aa25fd6605979bdf2a77b673b10a83a0d4ecbdeb96a3ea9a39e4656c0039b53e450542357590bd8f61b02da52eeda32ab2a15fba66f1e10646e089c28a41b9f19471317e105e378a0619874b3a7a3fa7a555c354b9c926248470117a356bf4c742bc0015f0eb821a0631e0c2ac1f81fb60e71efb346dae1efde165c7d8b5fa6bfd31ae224c6ff6645c6567381b6f2f7f1236f44b13358a44b585e708c5f3a6551afc7810cb51d8012a8be4c819cd0388f97f4b045d820372918856ae7bb4157963175809eb2e512d1af0c8fc3ee00f430c10a89cba1f36ddbf74512e1a75a714e168643f0f40a4da5e323e83e366fbb0df2a6163ca781182f000155ab929d77374df1af412e466afd7525ff89b7780728641fea06cea9c08460cd887602ef770b0642fac52c20d5a91c78670ccc901beefedc0530536398739888571404ce013f3f26228383c1f6a0748022b6e2a0394662eea0a00516777b1f1673612610f8379e65c6c74f3d29e6e944b1fd9c43261998b6fa17e547a6f6536cd20c1a84af19ae4987165ba8a9724b006eb9cc9e35f73359163a8d6bdf6208fdc11a8d2b4f692a0380381ccfb38966ad011f8b550d144afa8097404244a3f915088cb022471761d3efb8b94388a00e7385914b6119929814c805258d38bfea90ee4da7d7ca548f63a025d18a6de2f17eaf55b86409b3190c9a822245a0a2de6e4d7feb22ddb6a043857da47944effeef6235aa9b371cbf5ddb56295d6f3d9518bc8e96bb42043a6f84b01ce33cc9d2e5f42448b3f8bd53285c8e4d1831379e67de8890f3f090b2eb40616864ef8a1b55036de34c1ed8a186eee3b72c7a60ca3a66e474a8921bde47c27c5271658fc5eb683f1e23c1e9efe94774adfe6bf33792998efba276ad1ec5da90c3e1468a872a93b73c4742c264b67cc49cc71168e7ba78b3bcfdfd00217682fc970587ab590a8c27a04e1cba51e7ca0f68513719bc3836b1930940e575340cb49c3e2aff21c408172eeb72ad4ef822f4d8dc628f51b67cf233204eb62f1d32006d205e863f578b3f1c014df5d37109c23bc9937d1f29a8d6683592795ce237f17975c56db4209a35bad278e7e162338914bbc75d9a42e170a7a30cbcd82315c668dd82a09adab1ecbe2473a77c8261b20ea5ce4294d8a644f1725a235a44ed93b938177d3452c8d4682d33ec52a1299ea8f48568665f13b7b464596b0e1f722d89e8ce449804483e27807c6c509f78831371e79d91ca131f97cddcb0c58409470450b232978c80510e2c5dc27f3fc8d25e4e7a6165a0ae54d9c5d0162b715ce5d38495a33c1a17849875a387c5cd601c4f6190511272374462317cbb6e4c50d7d00b9834d3fc7b48701153383e4cf9474c0abef8054686fcfd0a22a80a831e45905b8e66c61b2ae9e62ad7a8e967f42547493775eee3b1a8747f3a622f58d5ec501eb6d17d420a6869bf1c1b6b6918e0a2953977e16a39c344f3913fbb2998002e0d0e8b21158e0598e8b7998b19bc3b9c744d0966ef7c2ff96079cb5922c03f5e048054eaff6f07145af844272af89f946995e81679a8161ee84939672f77e2acbfb4c666b1ce8e50a073f062c9108622f688aeabfa4c51007b096ee1a19ffd014d7a304aa1bff1fa6345259aab1fea8c69396513562b84ac84de3f2fe492c92f6890884febff1e28c243ae39125339e05effb56e92b8285284a71f9d7e5ec9aac69a51c8bf0384dce9a58e70419d1acf6705e6240f3a40a20cb6994870478c62ba73446f15b9dea717025cf05b5a816d0bfbec99223627484bbb7474a73fbd8cc770125d653436fa3c2232ed22b7d325f95f05ee365041340856fa84ba26e8216385dc51dcfd8f6aecb6868adae4a24a70287148e7c20d8dc46f56e7c2eb1c3f09e5bbeddce7fd54dc2dbf0076dfaf94913aa18aef7d8afc12d00be802047e2b4a14f25b7cdfa1d5e9b194419cbe8de2263bd85de384047f12a34fadcaead2d8496cdb2b64df24a17ecfdf3b85c33673c4bca22d08ef2f49fcd4a832c75879e4f19e845571ca14420c53efa80ca93b6562d3d44fe35e048955a5fcaa49085f168e42ee11577302288df6758869b65b54468b1d690abbe01a5a487caa5cf31e47f433c541aca77fe03d950367e1e6c5f124fc8711ec20727d32c390684467f7d07c528cbd518061c32578ff5b0e17c0cd003e05aa9e70d5bfffb3cf2740a3c3a93f21014d198c0167ffbf59d68ded25f1a0c3252619b7c1367474384b9acc26b102e6adc4c36c2be196f3030ea6b29ff3c150f08e143e225f79f9cec7e1fc201306c648b22671a3e521ef001d848531bb5c5996ac727683ae7e6cddfb65bf4b74ddfa370a45a7ffc770c97b55b0634f1ae58521f74c325cd86cdd763da2ffc0fdec0604872a1ab5e9267d25beaaa3ee990ae17b477834aecd814ba6496513ee7b75b747b46fd49148aa11bfedde562a56d4e52e0737324eb700d7718f73edb792b0b320030962a8383382b5dce4a44354a66bcd8193c10837f1c8678c3f510beed59e85e362763a23aa6e0575360b5f6867580ae28cb06c1585c3c387a4361dc9bc460c40ce26ac4a3636ef811a8fdef4bbde5020e72090881b9fbbce9fc4f50b47e579ab9d970dbb75e69c72bd906e95c1d783ae81c3b5acbbfe39cfc8e6cdb6cf85c369ea55ec76ed7af6bdcf7de439d519cdb6806481e68d7c49ae9346c04d7e6111746fa6af5c6c0a88fa9085b643e64679dfc54d87058e844de0a882513ec1f1a80fcfbc91a48e7e04f20d12fa10620c710ffad14dd4b94d7a05ba66e5894b55eeb69958eaae60d6898c085c56fc25f2cf2f3a43b2fcf2a0c836b5d8c6d70adc5d80faeb518fb60b517671f5cfb62ec836a2daeb6e6318804390a806c9aecd31eb20f61761b5dab8b607c55cbd917abbd3cdb62b596b12fa6d632f6456a5fcebe58ede5d816a9b59ced22b596b32d52fb72b645bef69fdfd08984c18a9ce81b21fd5d839ce5625e03dd7fbcead97355dd44c4a641cd6a194e6c8c52404e40a44a595069af4002729efa1949c8688f61d210325451ee9113b0e8e893830e62287ec63fc25d5c92cd51bbad787a4b436ed4220d721535262f63ef35807d66b898d5e0ee83b8559aae9f43ac85cb98744523422bd7b76d3308df048cbdd9a4596612daa69d40d57aa871a2838f910e9cd590373f7030b8dd4432fca47e9c0a31387f22dbc0faef577ac2a1a59b75b699d1412b743cc6a13899206c57b15f41f242383491bbae9851360a7332583d34f01eba32d065d97145206d651cc54a4b135f8f290fc9533445d0c52e64fe69d1091ee5149b5a99dc3bf51d16c96c549df368184924f5f0a5207af0de1957889ae73b93f74b8940374d156930ad053b45bef1c5a5d491b394706d2726a901d10cfa3a245802e4ffc4065c41e02e905e4144badfabbe4a25f89645598e8309c0eec7bb6f68d68fe4f45fbe3885472c91c208a021c7e59661cb13510eba44b410103402960fd30978e5236058bd695c52a35ba3328798185f39d654c371fcf280a14e25c0c27d1b797d415f78dbea7939da246029028445e65e7ea44067be4d946824799b470b45b5492e6b3a25d978c0153e6d28e1ace0f5cf31929c57133d5e87439c45740ff0d994147ae35def88adacd15ea0d3f24a1c2b9b59614a696a071aa2b5f60a4aa5ef3200daf6f2953dfc460e03ebd7ee764b71257b6849ab8eecd66ed25d640f2de99ebae7ad329fc07fc780cb6dafe445b5b19f34a8b66c2ad843c55d8b9ff6f0c52824b4011057d5c4a57b140f4c0a15ae4e74c9070063ec7e4bc9cb12a95e0a8f3efde51cb7f143636c3f853cdfdd773b6b8af515dd67c0945160168f8d1dd37df1262eda42eb7e70cef2ebaddc9749dba0f1a82e2ad5d3bc80d574a4e672d57dd448e5417d5e00984859fbd152cb411e41278836d64ad0848ebc7860a43beff70dc4f8dc91f291fb106a3574540b5a033c183fade836c36a8c8dc559c142650bf58ced39a1f58dd7abf16da03e24fc3a835a5aaa8b364b3107d4e4a82266c57bf64c8ea064b6f918815e87c40f8aeda884285202857625afdbe90b65a6c35b31d1d807dfe8bae12fa31e375a84ed9caf986698afe82200b951175ae1cff646f810b052eeec16b2676510fc95c9a162197ee37c1e7e3892b12071387c365b318372885f3039a4b0d710d93c5ec1f16140b195397721dc819641cda9cd43760149b5ea689e16318af7fab1f4b314dfb74de2fd8e856588f0d36f6f46ca4b77514c4b75bc5e2a5333c9489c4a21dd4bfb4a31a55eb2d9f9bd7179e25186fde712256363cff27a90b93396104e997683a1176b2691727a97e6f5542c20ef80cc8758ec72f30921080b41c879bd8e68823ae72cd62bd3f63927f8daabec197909a60d083ce9c8fcfe1a81b622b197cc2c5568db2fc4b93b4cd42f96d753bc283d7adee5217028907101c64ec6c4059736d69e5514db0521c6fb6cd3f905f0a9e0afab27203274fbc6551b7316f9554c20677c2bda57eae21c725e084d2df33a4f6f496c4d127fe63470d6874cd0276e10df5775510cb800c684d98e8879884801b22cf209066742c677f311c3612b8efa1aea4d27cc91fb150b289dc3edb8eb99b4fb6e5e3d63fa58fc25988d0de9bd8770a4ca159d11cdc38cc5b03db5279cb2474aa25837e58efa7de5849008192512f579f587c4b06318dd8e05ea34a35a27bae2f3b1e2b0fb86c38551d87b3c3cf27b246ce932c5e34cc5fff61e5fdfb4b671e7f5113c745f6c9ee4b1e45e6c55d5eea57cd70f3c6b34b5a28d4a7136831684eb4dad1364dcb1cae225ab8e9ed81d2e24299965dfd177d50e9e6643bb9adebe4cbdcbf79ee41e9e5cd4d163e272b5ec3bf708ed10d382f0bab32e4597557524bb02d2c82e584bc20b92c68219e512b12b66bba5168e2cd5e8b4c72f38bf66f7be0c6dc9c4b930076fbf19ae056cb88338da1f5c0dd5ae6087aabd11b9039b8f1daa4be4de2fa94f0b9704391dab4d34fbbb720102e2c4c512d606673f1506a1d094f1c15fa3d2389aa101d1da1620dba0b330fbb2b88857a0602d7b218c5cde054047016b33d7dc2c2f5609e97502129172053430394475e1b2ae8a0c3e761cc4e227c92226c6c4c5bc0b8e941ef23be2a2b6c16105797031b47ea72c3e0aac47694394768874557643c148c16c6daea217e49e4177a6a95f2da52395611abef1b49a7f5165a53c40fd3600b814bdf3d18307d9ae246a436bae774ff38c232c158040c59fd8abfa78cfd498d942f515cde47aaf82cff858ab53cc031942d4d1c1a1edc0da2a603b64547003a00133d810035560d0de3e04d90707ac91e530a75c1c8a297053e6aa8f863e130c83b572c7473147ebaa7764a027fe05a659b8cdee0b4abf7ffa56ff85856e43e7de25de650ba0906ac3f02044012dca3712362c68ece80daa1d15cffe881e1230e5024b73759393d2c6c4d84acdd0e35b31a521f2bed28ba43e5300162078737cb8ed94446649022e578ee69d1638d6f461479c3f45e33d026d9ced8683d58760dc6318fddad98d5439c040334ef6b39f9213820b29a620a0407677c8b21c29879b917a3ed520dfe5a4e6ffbd64a44d598d19f9172674d91d325777ba945c922e0738b6d71604b6b5ca97080e820915b00ca24a9add4d9bc30b9a0a2158c41748f2b2ad7a916a50af033e65b00309333801bb3a466d5f01534998bc97b3a18ae5d5bfddeac2f20877da23de84f1f5ec35f794fdb7f4a60f28180f563e10cbfedae0ed0f82b004288dfaa657c73c2ad0f2d820a64b182f769abb3d0abf870b5856c9a307de58b9189f497ce121aa3f542a738c1b7080e7718c259b2423b622586a2466e22e82b446a25cf80ce216e4d94912b140c3b9fab21105843dbebe745e8c6e789b8415c1f1c992b70c840e4321ed1309864160e4ceb76d7fae6490f23803e9139507ed094c76971d95d1572e9fd1e30f15cdc9ab20965b6ec028dba51dd39e2017125c9ebeca9578a002c4f6253c0d8e8a8fcc1835bf9e5ad05926cd5997a66bcef676512bac1d7bc76454f9cca5a6a18b58c790a1063f05dbf84fdb4e64c74f0cb779c43817453ca44ae0808f2bb6000478cf26e3c90d7cd5274d28da8a5cbc3742342caebf17ecf99f26231873257b0f7b2453198393ae737a2e5883823b8a594b27a4fe14f77c1cb9733198f43f45e6b643080ed3282b4f626d440deb86af0d1618a1d0a7eec5c77ff08aff8a5d55b381f38fe8dc92600a082dbb60afad37fda428c442a2199a22cc7d9b4edd471c6645a5aae7630677cb6630afbdb8a0c4621a894fa23c716212f1f6c07fd5cc08e1c6bee8c583a7ca84cddc3ed51f8f17b0457ea7b5471493f6daac25da745fc376be4ede98b1a0987ad797538a98b4050ea70ae339615f33d091c201fdd902158b58c2dec84262b401f90651f71720330f9d8521c480b0ff71f78cc9620f112c2636acc0aba87116d3c998a590a2225eda17e0e9acdefd76056639ccbea851bfb82438f32fb61abe49e7f337b2fde12e1021fb8e59ced35e99f520cf81a875dd6e3f47219c9186f03028d69da9713980fe45bff662a17585bc182f39f71bbfa7b2271b46f26d70457fe037cb4760d63dd6771d4ec0ba3e9728fc3f2b04481fea9764fecc09094fb8fd0dd207fbafeb678725975a182b1c3a636256da72b7c82b8b4ea18afcbf02c08b6d97125e1304eb8e4681b2ef259653e86687fb4a55f346fc603df1e73e73bbf6f6d764e61f118b13effd63b12b2c7e61f15045388c951dba5cfac613f3aad76965e310264f2387e442e5cd4c8d45f5701ada4cad84e5b287d9cfa094a784176a8520dac356aa61e50a64f91a55793a0ff9e5c96714d607f27abd31046971352c4dd5b09ec6b5e612b7a5783b5b1d860a06d998ed179187a6f853015f9880c08e2de64a44a0de09fec4a51d0e53d342fc774612a1c53c48e6360b0397294e34cb931d73bf75e20c23576d27e18f2a6c9993300ed576041a5534fda43bddc4835a46b6346d764f92d2d0dee024bc48974da203512e8c092dd22306ccf1c7d272aaec36d9fbaf23882a9ebcc62a0c8c713111fcb7ca7a8eabed33fec00b530b2b755345bb3752ea0d549f6ce592f46c65914272ea030f98f5df33e53a9c9abe37e249b6dced99e158e12c088b642f027bf544af8d62243dc141c968055ad55133e5a0731f39ca5a74432a622465024d6a01b41c97edde7a15d74e8d59e5349e8405549f90346a06c65cda1074d4762686fc7e38955e7741d01e6a88e8f941269924fa9e3b5da11496b168688cca7d7489115779c0d9b8d1a07ef156de173576011100d3c8ebfc78942db7c7a7148c46a550fa99f6801a2dbaee677d4363d0711c3a1a038ba2c091107826b610c3272f8d6a6f7fa939375c80256212e4171577fb6b7005b4de88e62d90f905307f09e62f91fd4bb4df9548e0e997d92b9611163752ddb663f0ee18653ad55e37c4563f50c396725a9ca7f7d934112de9c4b8e5ed532805154585b6e6d27a1357c9fabb5d76479c6f03054e2a9556b97ed59f46f4b7cb11d2547d3ab18f25f37181daea52a59ab5b97bee9e0f14ffd6682ec97d4ca0b8bb555227266485576bd2be1890636d171bd78bf4b721627f7e696682556b23e1e6803edebb3b994292f62484a303d3e83ed1194a860c038d53216dc61d902f3ae4171907958495e495c476175d111658476aa7b7bcb949cdf7f48a2ec896b5d00d9a67b9df0af801a803462f6c027a7923a89e0d5d376a8af9599dbc6e3ac332cf6eccdbbe0869006d7388ae27d733b24d98ca18ab7b8b6e4bbe378956afbdf05e9f10b99214568ea06dedf7880528ef5ddda48c8f03a101f508200c18dcd9694365b4e0454458a2fa04295448e8bd8a45f4f1ebef5023a2a4863fb44e155e7a715e8ce45db78c993536454e6c6cca0242090d26060ed7344d348a590b8cae430aea3a1477d2fd454d1ea4140f33f5bea5994a133d1bcbbc477b072d9c664879a232e8bf9af9970ee89b2a50f892c07e3c308c4c102403921b6ebd944748528acf1cfcaa893cf280e48c5ea993483941b3b060bd497b43e40d6139eaa23f865585c8b3bfbbe3f1f754431029820c3a0969a3402d68a3cadc7ce68fe4a4291b452515d1c4d41a101b95a0761df5f11e7b7108e162452b367362134f11ffabcf7784876a8640b730ea1ab132b7057a0a34ffc514d82ccf6ec18ad110dd8625d7d15348770bedf7be70bfd2708cf557c6d54cc850ff08b5c0064f5d23c3b901cf4da625e1dc4a1c94b7deba34b56f7f4f956c6871367305c7bcfc9e4e413ec574f31d3bb8c693a18c85026e9c05156bc8b8d9152d9f63bdf896b2542227a5fe4f8f378df37aaa116f9f7c577e18c003c3b69e96f818291edc01ffe467e77dfc48ef155924a020f1f48be82d2ef9fddda0a3dd5ce3ff063a5054a0ced1f1fa94084431874f1c38f96ac432cb91de541b9af4a10dae1fb8819e86a47749e15c31ca56e9b5a41e6c776c1a3769f4706827541c6266718c5c940c79a8eaebf4c23955098a2e36a96a5df40914556d46352ed715c1e57a6550d5c61d865a8e13040dba5095a483c4991ff030d4d9b284d9e332547344aea26703a9fdcd9868e39563bfbf65ec73b043d55fd00b70b1861ba69fd7121a274679cef420d4e789044b18ca0c5fe7b9e440d8f91294e8ba76e95afd1ee1479d05bea9b019213ad637881780c2035e4e083203eb03d0cbb55bf49ac2865dc16a42cd70d4246dfd20b4412bceed9f8ec24f2e09a5ef93927cbae7f354fc1c7a577375e0d0658fceab7e536f77013f7f1d413eac2ca12c2c646ec1f635a440af9c612194926c31c0e65f276ea070925f27fc30a7ffd1839df851fa05175035a5243b04427af4d4ed8cc39d191f849db06c258b488b385fe7d573a7ffe53382748abed228666680e7e38522be70111ff434da5c42da32ed659a32a52842ec72cca2c4225d4312da221cb7f4a9d0cb0e29ed6740ed74fb439d565864f729939f1530060b09eabb93502d3e914265a9c8f309c1799434933e67331ba385711c9944d8243d2697072c5d57b59cb9815e31e0db47847745663ce38199b8aa750e10195efb284d48d84f898d85cb5c0722ec90c17df708aabfe8486197e1e5f68ba4bef658214ea167e547c4f071d7ae65b656122d65af178e51e4591b274edab703b7c3403a2271b2c2075630e6b54823e9faa495f2d3e463ad4ab2c3e24414239906f2847d390875898844260f19d4dacd6a39edb2d384d90b9cd696c0eedb51e9a0bfa2b864299c8d0a5c1c7f42b69a4d277e30bb0efb465069e4ff56cb6c5a0a53691a9948d509e768d9332516de50ebf10f48206aa009b656be0ba6114764465d4214801ddc2aa2b9f464b234eecfd285b25f2b7995cb97e64895a3e32779fe08077039f7aeebf576ebca2f004c0313fd78dea752d0f0df5a40abc286b22d00f73496be431ee1a5c4029b1a9529b26b1b360a1012669c40695354739860b40a2872eecc3ee8db7f4a75260933465fea03b394299333170f13de53b2a3dcd03f598bc9b36ecb4cc4ae3a868eb62f6d5f197bebbb57ed5fda5fb9bbd3dd4fc8dd015a5d7b6bd9d68add4bfb57d99e72aa2c593ebdf8d1a20002008727c8918d8d4093c4f181a610a845e307099a19b47c32605b2b996f386df6733abe53a9291da54d9fbf9fdad1d488144416bf5f4cc0b5025ac8e2edfb45d83f815e9f63832800835a9dcc86235348103361cc735b81725cbabeae53a841b41ccf2ed4e5422d924b022f841b5b4d6418f4f7c71e7af5805e5fa27192d8d8d0f976702c4b40b4c326ea628c2f08d3cbc333f47002c15ccc0b180bc3a51dd4a38d146e592de60c9fc6a409494cfa4eb845e1845f4ff1cb4eede09a007fb6b06c60b45577235e41f6d852ea7c3e70ce8e26cc6bfbb533eb78de72cb92955a41bb40e04464580a6be9b1ce4d1d11f2c6f9bb55618fab1227363dbd96e3d6c49890ebbbbec195f9fb1ec6e87ce9b0464333e4d7c40d2dd43c5f7bdf78d63568ebf83ebe6375680f38758227e68487cab843182a74e85f2923dbb74bccbd157058bc10ed58360216a1ede3aedcfb60fd26b8cced3da5cfa69f674b8d8961dc054a70c05a7a05ed01b3421a0593c96b651a12a819040011b181b7450fb86fa5c71846863e436fdacc81623b832f45500fedbdc07e67dca0aeb500c0c875c5809fa7babfeb9262b5fd86795186c3dcbc10029a892d515e405655710ecaa58f381e5edfc99adc3a8b13f0cc6eb0d84b56122bc735a8a65582d7b59bccb56e0bcd7a9132aba57a2641602b19e8b8eb80db47cc5c15cbb2a906e66c7184aedf3cffcdababb5575afeaa45b57decb57bdddda494294919c504030512053f40d9cc6616bb57a7d315e9727e96b35dff2ce764f396cd4ec997ffff0fab2c84601c89b35cfbfc00fd2c71201dbb2ea99aa55ad16b2e781e0ffb1beee63ff63dbec72522e5debdb5d69adaaf3f4ee3f0e3c69718191f57fb4517a0d0f901b72e5f6a7b2d2da3c3a4c0db17c486cf01b696e4c367b94ea51b4f3c5a48454838f8ac26dd80d40349876403120fa41d483927520d54ac4d6d120d3eabeb0c3eab49e6677525c980a4c36735290624229fd51506a9950a0b59e9d16834f256dcb7fd15d9fe9ad8fedafedafedafedafeda4293c96432b1b0fd35b1fdb5fdb5fdb5fdb5fdb5892008822ceedbfe76b6bfb6bfb6bfb6bfb6142850a040a15aadb40e4331c54d91e2dda6186d7f6d7f6d7f6d7f6d2d61188a2952b4b4a850b182c565c1e2ddb218efdbfedafedafeda548cb6bfb6bfb6152b588c238bd51a1dc0b670715db878b72eea78dff6d7c662b48dac7f22feffffffffffffffffffffffffffffffffffffff511445511445511445511445511445d17f144551f41f4551f41f45d17f144587886ab5aeed7691c4b1ad6881884449707777a7edaabddc558772d5f8be8b92f0595dddddeb7653144202bf3b09e7dd3dbfb66bfb17e7c739c475b7ebde6d97b9ce4464e28d4e48271f4ac974baa7d3bb3d9d3c3b4778ce1eda9906012d094ab10efc4a4daf9bed3a45876b959b157a6cd7206ce5aeacbcdb95974e4e111d73e734fff63efff3b707faf45158ac878f184c56c244f6f26cd77e77fc1ed9aefff23ccd47bfa4219fc8b994139548241299bcbcf4999baee3a7f3a4270fad86bef972daebf57abdbc86ded2a0ce344dd3345fafd7ebf55aa1a0a0a0a838a541fef21b879d3cb41a7a9ee7799e30180c06833d6a7a699aa669ce4cd7399d87fbf33ccf130683c160a6699aa6a9877c2a4ca7e5b1345b4361e7799e270c0683c1608fa6288aa241fef21b87792c749ee7799e30180c06833dfae8a38f3e1aa2522850a854ab950ec3771b96605cacb433f3c6799ee779c2ec0983c16030cb43b335f4769ee7799e30180c76617f61ab950e43514c91a245c555a1e2ddaa40296f35bd699aa6e7799e67cc96766675cef33ccf7ba61053b4b4a850b162058bf18ee3bb1d3f172ee63bbf2c6f7a631cb506c194bb7d295883f40bd368218c6f1aba69be29bee9bde9dfb4a565b65daf90ad20b25db398b1f06c18c31d4707b0362471ce76cd325bb7d57ab72dee0485806e5b6d454cda2974f0396d97cf1a3de6d4354cfb381a2e451aa6d14e38eefb4070aca35d8df8568c9ce6ae945d75f79f5f0f0852df9e1688a74104e7123b6a6c6628b144f4815a095409daf676dd5122fd682cb8f7de7befbda42a7c56df7b00168c31fe7bafaef7debff75694ef2b920fd82fde1eeccaef553df7dfa336c84d21b55d8cb56f848949825add257efc70251cf9c103aad65a3fc7791c8fc3df8c433e32596badd5fef938985088e09c4b2213144fe4ddf21b79231955d71c4e461f9767bbce4e726cd7180c4c397ca398873f8f848352329d52508860bbc20f1512cee3781c9e84f3f7de0b969ffd8f65c551cf92c2f1261cdedc55a34632aaae2fde44b5a5be0668241fd9dc55ff3f0ff9e6abc3bd45942e34c06031e52cd79f0f1fe9826cd142a778203bb0ad07446ead576b4dbc7bce3de4367ced9e330e5dee3b37b1a2179de89be35a2e07d168efe56ceebad586277759bc5182701573a11fa2b39c873e5f5cebadd5ef977bd4ef36b745d8fb30b4f3c65bc479dda89a6c9420265b24f2b2787296eb244edf792ffe63933d84a8b6e82083ec85569c2a94b92e74435774213131b2ec8c3b136badbd71ee42897cb072d5f8c2b25f74213531b2ec5fddd4e78d1f444d02aed58fe3aa60830d52c017dbd2c74ed6c9ba59575e51eafef7e2bf18e7323bd76551373a199da0944ca71415a7f1f0a05ef39ab57eba8eeb681d829ee3a69b620a1522b3594bca0f76d949452753d1cdb66b152abab2e3e98e743c5e6c05d7e15b5776a1c71c063355368947059fd5a10caf87947e2964783d2d2c4a5d19943e4b48aa4acbca021012243e3e3f3f28fc06456a34c45ffe4a31a2fcdc6ea9144a05ebf341d1ae448952140b8bd56ad1c245cb22a9d558c616f8e675a5fff8cd1ee1e1c18f8bf8cd6f7ef39bdfb08edf6c0fcbcac8d248650b9a477bf16224c3ebf9ff7fecd5680020952e3c1ad7c321e17cec8e8f7ee21bc8e9dcf0ed05876f5d6867b6e474dc85b9220e434282c4c7e7e70708c422a9cca1b3c2688835cd1700c0b71714b677a54713a5305c3acbe3e6a607ccfaf031e66275044000780230dc64a8000e1f3320128037002f95e21bbed170e1466a34a4060a25008f947e2ff886af47fbe964b52b6b664825894692398c08a82b3d5a577ab4aef4685de9d1ba12254a51fee3e9cda3d1bc1e87e9645d39a32b6d442f322e8e816fe68a703bdc117cc3377cc3374ea793cd7cc4cf3292f1322ca398981d632423c7c02e936b126a10df9e058483f09216561b8b385d195d0e1373fa6008e071319dac2bf1ede6f578b4241e4d4400fb32801021e0c51a871fc7a9a008213f84d800e5870f3e32d90f1f92c87e608caf8f0c63d12b4fb21f1eb8b21c57f6c3881099101e24d97729994c9692c964b0ff4b034e0867837c644b66b3d96c360bc992c87a204b220b2204889024b224b224b224d65a214fb0b6066b6bf871421392b831018925f828c15a2b3b2209a8113624203942ea4e01e5b3f86620c0ef3bc18e1d45a811610845e0e08043acb5d671d698e3586084c738671c20f761e7df2228f7ffffef2d2fc65e8497f7bb0c04ff104409e4feffffbdf631cef98bf8f2be57deff2a101aacf5ffffbff73afeb2340111c27c9c33ce7d7b67387f0369f65d5796652ae4924aa5522d2db596f2c3f9eebbdc2ec779115e86f292d96c369bcd42b3204a2058cfb31a443904670a384194419441945608ffff3844e01cfa1f4188fb1f01471a8244fbac0e02107e70c40742f480e7f4ff252908120f8cec00f1c30e4e14a91b646ffd21d623009af4f8e85fdbfeb4201ffd97eca0edaf137a1b6c72e5693ac4b9b9c9d08b16e4e3b39a0cbd4c767423f6cf7973e35089b35d8f13763eee689709285db5ee9ebffce52f2b0b17a82ccbb2ecb2dbce7c427652ea7ddcf51a890b331167cd62b3edfa63eef2e1305927e7dc724e8cbbf9e83a76be10a2da427a2629fd3ee775def4d1f30b87bc1e9b4ce5b39a5d0fee68b8837567d7c3613c5947cb6747cb6747cb6747cb6747cb67f64aff7c9a1d2c9f1e6d069fd77aefbde0674747f89663dffe71180ce42cd77809900ebc84c7f69a7b641ed947eef1319c96ef5f821ba7a6b25c229ba91429fdbc3d863ce86ad7bec461f28f3fbe498e3ffef8e6bf9871b6e617e952bf23c35eee18f591e482ef5241820449050902eeb018732bdbbf0a637900513f8efbae92d22f45a6defe8dce39ce72257cde0d12e4aed91287e99020f1f1f909ae5aa285a59eb05443452292a92499ca52faacac39ae947eda43530c76032bc54cb0522cafe895b0943a8adb6fc5dc5a4fa52c3b4fa4f64b33d3cdc3ac74d626d8c3689db529e62e169d752975d78ac3acce67ada05f4524b21689e7f8d8d2a9ffa5ec8e64b47c609c7328c4715d27841d1930784c4e91c8f346a3169196d99ad51759b74a1f3218393074aa595f64184464c0307dcc9a343ac0dd30669ff7d5e043d1df4846cb6c016bd1c3c78c3292d122e2630e855a331f73cb6c95a55228841261f4884c1e2a84710406ede4a14218b41e18477ccc30787ccca7534a8a4acb878f59ab8c64b44a1f732b565f64bd0a5134561aaf740e1a1da268687db5ce4173451c57ab441b1a2a8d451c58abc41922df3f0a101f52c0e4dc2afa8e5a78bd8269f6acfcacac7d24c305531982af14b6cab0357b6bbfa29c901bd8a197d45d39584250ebb0d2acc24ab312bea43e66bd3ab3fe4e56e7ce76c5d46357566c0b13043c40a0c3ae846c8c9b183cdc6571f0923ecc4bed5959731cf9ed979a8f19dfe0ab42f038b2c997dacefa25751719e30675179969286eee225f5ab11879c5a45bb1ca4248671d6c725573d921f13f4cd12be1b8c1b0ee1542f2758a5609c90b9cfbc509784a8fbbf28a9488cececfce9e910f1cd9599b68eeba3b6b53cd612e4d2be62e72555bd5dc856a41b545667db1b36ef970d70f29dde5c966eeea88b44c778974d6ad1c77d91e663e25bc710a4d610cb614c670c9566c67fd8531dc4d0a4f5ed29df5a894922558c92c9d3b974e24fe5359304bb487e168b22ef1f894744ab5da2633ad13c95229e2d964dea437db9904b99034959956ba658d923e4ca541097a956ec0d9678d5273573577d63977d6f5d19d517e76ae290d5f6d55da4555582b4b4459c0ee7c535f6411ec552d850a1f898376d628744adff03193abdace1a07e5d7c3dc5416ea76e15959e3b0c6b372c8352a1432950eb3629ae5b8abeeac4da7bbf0ceda74e4459a7afca4c1263dd4091e6c12dca4a9dcd989d8264d3b3b9b787636d17636d576d621eb9996d6dc455634a3ee222b2df7b8eb717616b2492ff7b0c9ecb3f38dcf28422eaccf729d758d87c131602a2e1305516d11990c3959e1759df7ed9356cba7e30be9ac5f93a31e39ced5bd70b13ed1334e0a75c4c044a44721e723a7b97a398f316e6ee4b4a80b533e725ac469944864a24787e95217191b77e1cd691a1cf7b2392e06f50728d876d5e1d0cd699149a739cd7d607309e09176a173baa62f57c2a3e0976079686961620636092672d824c8040e600e4c9c609320c884089450e2c44d0914941c61c3e98621dc408910ae83efdb7547c90d7ea0a405402841c1f3a0040446042da183a09f4d824508320204c1a01e5083291df443900c360906a1a0862012f80cbe13134d3c6193a0107493d5872584d82478c4123b6c5b852566fbacb19901ea518403481315e143870f460cc1061184e0c7043b644b18819022e8e00499771a21091f920041021f3841c30e2b90500412487c8270431325a801450b9620c11235bc7bf7ffff6badb57e40c4b96b055c41e5a69c4c25948f7432f244261d17caf8be5bce5d75056439a9cff251ecda5b6badd56badd55e7c5f22ce5d2c2f22ad807b85acb2537628c495752f374200b7f3ffffffff7f28ac34a653feff176f7d7135ce22c9817ddf1dfbdb9eb39be531178243be10c78d8654ae331179271e7742fa503c93c799bc1b72a18cef6fd18a9742b174dc0d65ad2393c9643299b556f640ac7ff9a5ffbf976009a2941c96fdbd2f2e2e323131177f1dc71b3235323532f5c6d4ccb8d8b8c8c8c81c212333da941cac5b5d1fe0d6fbd4497735f85c93a7cfaea05e1df330ae6dcd2df85f5f3166a66a32a66a19578d99899989f9fa3a66a6d69899fa326a1756bb98917151e3a2c6c4c4c4c408c139135d87988833de8538059f87b4e319346cf4d4b041c3468f0d1004411b346af4d4a06183860d176a646c32605f3aec8de58143869e13d096b12fa01b404032f480600ff811d17382652a94e0736d6d3897904c0dbe585fae6686bd363533eed7ccc0e28c8b5018b35333c3c605d7313133acbef6e29a459402f0ae4674aca0ee64a0ef085b4929c7715c96a991b9ddbd575f2deaeebd1d1792027e81bf5c646abc66866bb2eeb8b6f1f15d24adbeb9668604ee0c775dee5eeec319363bae6dae7bcd0c9fb1e28b0b4f2bb023430670b88b64293ff2eeaf4967d8a42ed89a9dba438314f615ed2b0b899999b1a9b199b1b1b199396b666cf09db191816102a7bb9f3368cdfdabefccf94674dcb06f3dd3d00e3e3e3e0e30ed6a64070d4f885688f85cbb482c7e2212cedbfb811ff89d408c3f10e78c43127c3afdacfe6b028b8e2f3256a6c66a52c65a91742de3a44c8dbbdc5dd7ccc8583d53e3d6cad4d818172d2e367cae49972de3b27117f936fefe1ba181887d65f6cba029b8b9868f302f217d4337a4ef02425a0257c7c858fd2fdaca70dc6bfbfabee5441be3cbcb23b15f43c016c0f5f7ec7fa9e1aeabc9bf30fcfffdffd3be8f957c1603211d038cd732801b555f28e09f7862a522006f8cf5c52bf5c5ebb7db1fac2f5e23007f35b4bc13518413edff1f8b39b678e2f1d16eb76f8a42bafddc8e6948a5da876fca1bac0e690f431412dfa8b6c8470dc034f8e6594ed2d9de834e65019386d84eea41e5483bd87eefc521f144c3b31390af2e61879a0e465830848d46a33759b587dfb36ca875585df5e7f766d308b74bda248c3c91c4a73b4d1cf972870a4ebc769488ed50e19684890090e0088142133b4a72d4a0040f1234e420840e2031aa0a6bedb3a04f9c261d7ceda33777913888084ef681c126732bf630dc0d184c32d36ce7d24722e65e1159e5c8f6aaf431af661b08457472ea68556bc566be1573976bd72ad3c7dc92b9cb5d2452b76b5335f3317fc5a5aae22a2a60007a5a3c2ae0aab642ff051607a5f44ba96832df45d2a4b3b396f1342e8743140dac555a25e2f85074f8bc059569a56cc52cf8da194481620bbec156cc6160b4ca1691964e6bc75dd588077cb48eb4622db355a475de56ac45db59832b945c29775e217197dd810b36e96d72f5a39ac5807a21a54ae94a8343d40b286ecfcadf8e4fa5b1ebab43908366a55521cab54a8720070dd67aaf6aa1ce816200d65abbd6228e18b84863a54311c7d52b11e5bad2ac340e95c622ca57a17e56ce27267c642ba60a2b8d0e556d8b48a8162083dd2b1d1fb32655e6ceaa223b6700a430cead35d99aedac35d6aaf3616658a974f617510c58e9ab5f58e92bce308316ebb356b59df50b77062cba8895c6455245db79853e2bb3d4e02357b5ac57e8c3a06888a48a67677db15689aaf35959a72f4135bbaa390c0a7385feac82b40e77d51fa69092a594c7cedeceab253bebd7cea4cb2657350ddb59dbf7525a0a7217f9522b019da5f4e5a5469a4a55bad22b110716512fac6650e995ae342a55d0c3a068601c5744bd70b5d65a9c81068beca8c60b2a51b51255e8b3f26351cd2b379969fa86bb524e3a6b18dc558ae540d150a9c4124ce7a0094b3acfca382c99a59eff12cdc794b084a484967cdc55b78f8f26a1eb94d0d63c957ca8440b1dad51c886060010000400e317002020100a85c128cb61184653553e140010597e3c545e3e18c722b1502406621406511cc3408821c610638c418a21650e2900729c9fbca5a718649eb11db1cbd19688a9447dfb4b5f80bd3a74159317edba42edd6bb97f805283374c8fbe3a64e6cdf4833e9d1082395459ab58340bc7854b4503aa8d7877abad807899f05e9a3e55c4e6a0f84b2b1838494176784ed67bebc00ab415bfd34018c13354d22e888ac3544d0421c63e65c994ea0a07aa53622378717c12dcbcf0a1d6c21cbd5a1a148c4c359060a61da5165e826410c5613fbdeccb4ffde95a167ed34a223411e31b7d662af08afb9cab08e04ed2a93a1849becb6e9ea31777e0a28c33dd8b5521aee2929e73992dd5d4a89a132ef980b0fe3a38656b0773df475c5059a5855605ca3ecb88936979b3c0e6fe48ca73a81710b3b20b2d5d387b64f9ec5e3e525f116b5e092f8233b684d9ab61e4a24743ed6dcf8bcfdfb6353d2482ff7ab1ba62fb697d08229537ecbf712ed7dd1c4f658fdb259f614477dd9a9e06536a83c6653fe786191462a19e3834bb96c5c158b472b80ef5ef0b3aa70a05cf6a5172b39bc0e2477eee294adaf2e38615cdbc106e26aa4d9737c558f5295d311fb1c9a40dfece30ed0fe5a9b97d8e422368f8b778b0ded31152fe7cbf350192eb79e2a4794fedbbdda1918e35a7d1bb0f95ac2529a6eb9a06388be383144be62d83626651d0110e0a03a4485bc5d91bec2f17a83abcaad89195a777231c1617572a5f3bd21f56f73c57cdbee8f3ae49ef3662849bb310bbe3c4f2f73aea43a073065fd2b608fb53ba6ed0455fbb094d380335bc708fc2a5ca07c600333c87f73158f94a681fae4d1ca884ee9e2f63aa3ccc0ca944665d143f8df34d3fa6b18f559b1794a175ddf001ead64c5b0ab6e560f507289bdd666227afc94620d77b83a2b8ffa851403b5b7be9a10f664cc1cbd23bf57e620d4666946f8a8b66b47416e9181630563d6dc10a9595046e4c392ce355a7da7c52fd8429634fedaa7ab602830ba23c0266779c8291d99581ca5f68654f864d5309f9eb0b648476887eee943fec0f299189dbdaecdf398c8bb7365a801497290d6fcd8ec8c6adec6d8967c543d29cf631683f3f2ba61b1cce6bd690a8f1670a31f8a48f4c953d4611ff37910dd04ed8afd8a3156488acbc0da79cd2e5770f07335e25e856f12c727b3dae11d842e7b6e35428cbc08f400aa26f3b2569f408fe6da869c2c97f60545de86fd08856ada46098a69d63db5401e2b40b9e63032fce0c23d76bc84ad9a51e280c5eb6d028f51e5f8132984c15c6875fe6fc965e7ebc6831a2b6bf950973ff5bfc5e8fb2860cec937afbae180c2004e28c2b4ad1b71cb2d83a28a88293cbb3fdb76ef5acaa2bb634f92ab2c86ebc90a427842b443599d2d52502c9ebf9d90609303102dfbc56eb71a3fe96b8ac5e02cb9390cfe5537e187a30b0462e6270a81796daec5d8308110c99f454918860367cf7cdd49b3520617a2f33f48ea3ff2bf1c78f759d7b1fbdf74fcb552474806477ac8ed20ea55988c7320baa7e43e037fc6d0cd660d285e79f2aa2c5c796e82065e5787e3ca0620994b8eb6c53d10277edbd4ac819f94428a2b29bca1bc114eee3bb512304e24b48fa0117f649cb8b2120d2bccd8b42d0d576a603832bff449e2dede95dd05406790153c9df6b7520c35a1a5ba3d935342b9e8a4544a2a8caaf4184bf9de3402b3694fcecaad2cf65a659024d896e93762f159553783d0c70114a87142f0b0d86f8fa053b13ff5a8177ba253f2458e1fa85259ad7854a811ec97c5df737854bb3e15608a3a476e623982c6b9894d3ece9ffb2ac812d479ac85375f4d04a920d34105e14b7c1077083225e38138def4d6ddc08c52ee5b16212317ccb34abef4d26203567e2884dfacab51abff9066b004e556d1bfd3490d29ba2f0c6b1dc8e1c5ff120e00e91040c2dc9ff8a3c580812d1649f0edbee447805e972a3939318b6231046808ac118d04ff44e5a59589882c03023fa4158d017d20605a60e506968da5c3e158b1fe3d0d8f665d14a2fb07b5bd8ff39fc60f5f791c0c648d18b74927308b8197c9f8abb00eb71b5af17c8019e4d812ab383d309d652aa1d9253e2983eec3749b7b996a726bee55c8385468daee64afdd9b78bfa9b234bb0bdcc8e35a91eb6e6e5232b672210f6b53d58317260bd50da22bc9c3d07c40320af96ae30dd239ffa794e2082dfb6345a3b0fbbd79f25fce4c5e22423865523a5e510c3130b96a0a81ffb8aca928b1e615e292d2038212b5135c595f9e84642e1646a358bbad9ed4382ae6dce6f8ac27cb3b725eb3ec6073c498b5c70808e1cc522145bf4331ca722a19a8ef9812334bd1b2214385791ab80f5fe85c420232b5d9d3c33ef49f405c3a4781fe6fe82d8030b9c6de5cc171b273274d5e9c2f2de71374537f13b78efe6f44b371569c63d0531b3cb88f050cad4250934150666d6702c17c71cd5fb4558881d80c43c486e007580bf6df5c03b358d36bd0c6ea92b0b1a2a68e397c7694821f29f0968306466d6248364febc56fc3bd5b41d3b0760db252aeda1e336c18aa58207d90314e68d7e690306c520f88bf0cb4a800364a605932fc08bd277281b5e6daa1cf480db499dee86f6615638f75693a917ff896616cb50c5cbaaab995c1c2aa91945f280f2b46d97f4f8074e3b53600e896f8547fe639ce34489ada2399acda8ba7ee27e6a83c212b745fdb2407df6d4660756a8b484fb22e310cc98d30966d024ece87b1b05dfa96ba7e2aaf4b01995b0e9c98ce06a6705e23d90f94f9a0037f914e88c4768347ece22450a321efdc69e0be4a9ed47878e0c43f9b1395a284047ac9a00215c7c1a0bd7bc3ea0bedcd7f97063554f3044cc5610e4fc902d7bcd1303ff7dbebbf297246fcc7474b95454e8a59b75e238b7903e90c0ce4662bc70d0f328e5ec4e4517ddb51ae68b1c9807177852a490247303efd18fc5898a7203dc16b0bf072a5c1cd21e9601b4a404265a775eda74040d1c6f3592649a25cd5081625226db8de48359f5b3f287d4cbfecbde35bf802afa1e2713d81231baf66d950ee6b755dee074971d6dacb5a98a269804baa152798349e598e2b1fb0a8c3d8f7e8f5394b0616ecd186e7d3c94250d92b10867eee3eff633a27aa16f985d4b1c8e8123092a783524cc0c3511d255622c2f5af4b314d1a4a9969a575ccb36390a2e138218513f4cc603eae804b7a6992b0d2550b655e123ddd9857052f6f9f2b0029010988f234cf2ed1a467d1ac8899a49ef9b3bdd92bbea31b718aa7ed68b59e731a43cfd56b406548fa6d5d974c3a5325e49250555fc1a0ca680afdf2c2e325f739790d4e1661b8a22cd68c6897c9c99a21664136c05fec4c6116f8b1b42998ec4fb48b08ce108e41b2fa95a9c93e292e9040c1b30f796749c9baf91e52902bd201bbf764b62efc505a732b19f14092031c394551f816bd2bd841ef2d2e6231d3f648aee91a4f3af549bd4a481756747992ccb42be4be3a05442e418232b99fdde67c792bf65c4cfcc59e434f9c9b901f060b20edf25ef1324c7fe0a4834ad45d7b61f7f193d5cd28b3e53f7438fc4e1aa500d0a7fa9eedc1074b0d703059af6531a5bf0c4d90933db7f7336131c2f6147d302c65682046fc5f6cce7e9891695a93caba2515bef72a8dea4142960b6925da7cb70c1ee889af325b76198715ac8987b95165ac530c25975af615a404fb538e069f599716545f1dafc5721ac8471349025d1234f2a4bb3b3ca3fd48d0271fc04553804552259304bf34125e2345fd9732c8be39c673e35b7bfb4af94d290f1129f57ec332b4369d0080ae2ca9bd4eee99c144c48fa795ed5ec98462724e264d0361b51a0e1e262a5851fd1c11238715029440de336fb788fbd27638e2bda3f0b626bea1a2ab2a1c912ba7b8e21031f48ac319739707f879d5b0546c9f60ece8be12bf8295ef714cfe44da635cb4efeba2531fab003a4010adff3ab984d86efcb83e08eaac0a02ee77419c296b262731a8ae09f9bb5a018e3a84ae292693c027ab41aede46e8cbc5c1c3c5b74890d775cd89e8ec7fee8f6c426f228889e4aa546fed0d2c506555d07e47bb47d89425e92f94877adc0154980539436206873f68ed2751a6399d7ad7797f9011e98135cd89446bdbe392214d2762decc96bb7afaa9a256150ecdf5b43cc2b286a3c8b5db856e3c8440d8161c4f1fe585591e97c60c66f67a0ebf01df4d0060af433039a64fd8f60de463030d21096fb18f870b9376420e27ebfe275870426eea555ff3983a4b6c71d82bd8542a151156987114cabc32467e2abb9611e56aea12aa64e0d57cb02783f63fdd29f172296643df6665ca3c221abc6c3fe9f3f81e0d0d06f84c0d66ad9860d8c0da75633c98a3982d4305a8d7f69ee3815425660761b83cd06f80c6ef0076a1ca340d00429b446820c8764b5f6eef9d407f8dbc06ed1e9640a365466780fca5aaeb4b7380078c049ae98afb26a0218a4a7f6ef0cec2e2661aef875e2081df98e076ccb11bc882913b1d38e845dae677878dbbe1d8bf092befc02c07dc1e13063672341b180dbf2fd55f97635ae0400564e20f55b4dbaddf0534ac980f2bd2a5dcf30c0cf97de0ebd34c0ce97827b7b1818c09f4936d27df8d117c510128d45c900e8f751b0d3e5477fcfa814acc3cb79d674b0b283e8390f2476eea4b93614fabc8bc6bb9bff68a8f0be984035db1c36ce30ee1d0150694ba8d048257677a8d1204e78f7fe5879b270951635a97a2e8ce35404231daceb963f71fe10a2835e2ffb4f353ff34725cee9d9bec4b058faf33f89ece163ef7a53f773b52a6eb71679a86606c71e1bb5faf3480b6ffed0141573722571029e9b3d72e3f0eb01734f56ff8daa52a3ba27b922ac40efa7cff942ba9986b58210aba796153a031fa2eae5e152e1087836e5795d72da3d1b52018d7e9f8f5fe009d5e7703804fe663469a88e8526a362e7d05e8b69b9bf322ead56319eeb63707ea2f75c8e08bf0defef47d64c322821f2aeb5711d07e99a2fcc6d200d512ddcba8393cc5295dbf0aad043fcc393583846a7ef27eb5472a0194ec0fc0b95ee29e04f2d8eaccc232b914d45a7152877aaa2f8c586d67a948ae47f2600a701078d77633e1df21a4c71f705475be8b6019ad72da19d2768b3cda72e8caa0bb107add78c50d898b82d2c6d8d193f9e4f9c3d7fabea0cd7eef5960afbea5082e7b0154df27babd5275c0ec9b58e0d5958c5512ad089847005f36de4610da9081380c169f03db08c8894cc22868e9b6e87a26cba160e7a3053c4f642eaa19dcb240f353d26aca3c13c45fd609818fa9fdd7a000d6882100ab3b7d9f0e3bdfa591a8aace5567db9e3f68c7f69ee1e564776e345d0526afa937a0ced5c890c41abe98ac1bf551d209469f8ebfd953330f49085497984dd63afe20f3b1ea3816718d1b167c54d1023d450d33df9958d796c57aef9b5874937620ab02538367798abf042c87ba4a8b2a365e2596dceb4ebd430659a672481c6d89f211ae37b70cd7fec12d8765660a89e1dac4d91a4c7e2868fa608de3fa3c695859481451be755d9a428f109fcaab14d63d4d992a3ef563e57bb79820f804e827c1bebe1c06d293523baa6783c1071a1cc89ab31c493e969d4970832ad17f079b29a23bd35fb48ce01325da58967991eae5d7cc7e23c25fb3a7977fce4c2152ba71692d04f46e24ccf298e6cc1dba33b0252274eb315e5b59fd6c0a82285ff62d1ab4bd37860130960535d762138aeecc7b4b8144778690af375e9369a137fe97241cb66d58861811bedf38a621e8cea6c94e36747467372cffdcafc928508e8d2c1813493b6e0a124d44eb0ab78575cba9dc9860792d9c5fcad8ec83d1978c45091c0c0062ef7823d82379082f5902b3d3e81b263a101bda9daedc1b2b6c2f6f8a19fe9555f6860723a7e676c166c01017820c5e8db1941eb231d7acb216a204d0cc99785e989b0638f2ae26a8495d71c2fa9c1ba5bd0f281d8da0c9aaa488efdcce8e82ef92186dc0d8e49d2de76f36dbbd8e11b3a62bab9a345d59d454d39555cd9aa6ac6ad67465a5264d53167526e48c58c6223748e2d0d04f917d48bdf4a02a4184ee7779e533f33c9404d04321fa0dd5d6811099f173cbe5e80c587f220ef486011c30d60d6bde85f0c24d8d27b6566d6752b72c86cdd0cfecb8765a5057281b54df15ce623734acccbd8cf850781962c134651d52c55f9d4e68babb5ca1561d1af41a0710c3c3ea826a26d683a7776cbe25df7399efa09812d0cd9f56514346e7c747e880f6e24a6125106165c52d636c849256df49011d265d41755e9abd29896602b643d823723eda3334a8cc43594d67c16592a656c9414b333de75a48ddcdea68eeaeea6886cce4166097b1f25bdcfb464cee4a3a3b87a9acd872e8bd78de09b633949a62224721da63eeb171dc75ee4c6e96576aaa26bf16c5d5e40686419a881d3c277c03e504406e94ef4db9553f241f9130649807ae351503a824358f6e582999c8a424f35737de4c75dc54f7747ed633498f1cfb8aa972dfb73b8f99d9df78af295fe1555bf4fc5cd736ef984319bc0beddd26a4e5eb82fdedda9c92d79c11287e9c631f6270f4655c74285d791c130ac2fc86e097c8c078cec8c9df24a32ba2e6becb2ff9237b241b95562dd4690c82d81986c1dabd4cd2bc2e6b4fad3a8310a92effed4a76034171e4700f2a22a669d3c8d4db15da0be009d8b0e1d4137af959cd3bd602056f82ae929038bb308200a5ce7ce3362e14d5c78bb4e3526db13a017b430b4c4c4e60934533162c6fbba684b1a3fae7d803c76c8b428e3b41945e1be9a7fa70825c57fdb9c6d1c741c5c36f108d08df8a0cca2cb546a250608e2c80f511f6391500d41f5e61e266fea2ad1a367d46fa3109bc740473a6277d341156b38eafd7c91e6b44cf8f7d953f96fe88a7570055cafe60389606315f7042f1d34b8e30f33ce41519dcd8ec130c0d282e9f44f37d570e3e3cd39f740b5d73de47b344b81064742559cb744f48231993cfc51e8882dfa82ae09f34e6dd5826a622a1b0980edb06d20c288a8262aafb937b586e9b5fa0105df1f65b3cc69b12168d4b9f18612fb67aa11fdbc268e1eea9b4fdafeaf337fc110fda5ae5115037e43027eb12f637aeaf4eb7a89ecc3e4d0430de7d9297c74b5212f6f2b0cc971a7472d7f2ea3b6eb122c64aa4b991e1e19547fa1e81a3ac2cddbfd4200b3d1fd11903a8b3b21ff8018e974f4ee9bc5e5a50437c493c0e8f9a371d981f30ae8e6b407933571e54747084c877dba5c468ff249d4daba5795c1c40d4964d02d4554dda3e81d4e31257b709402eeb099460ae3af68eaec36789111b8b0b45c61d7ee8666e31818ac90a20b1d0a5265cf472177406cc61ea7db7fd17091ccd84a09df2673b21a5ba641f79dd1e5284f74b197476e77601e738db9429174a28a1392b239611454895b2c4a5f038965000a7f7197cd3163f8af6ab347a95be92ab90b403646c5fc9278f58ff1deb9f09bc19350462b27632827cc4f0437bab591fd3b6398785d1ca18afc2480e2d417ab3d4eca91205ef1feb9301e29096ab80da1bc2defeb14513cddcf7280ac723b69784f56434b8954c33dd68019b9f98e37f96d6ad2a4a296caa9fcdcd541b55522d8d7f9f5e69c5f0c648edb2e90bc370731f63174a803ffde95a8b1e89c1b151c98b07ab57ddcb7b2e0bc05620be1b7f0cc2101682a66c0076c16db0d70b74ed4069548c6e467c2db87b55e355aee6d9945326a64e0b081918ec6792796941d944c07f1a130c18af817c6befae4f6f6c0a3c27477dc2a9cd0ab29ca78de3373c2baca9f173125c0e7bf0e8fd44e5d82fab8c0ae44e0b7b5ef42897c966c99be0089f389d2cc661d78255159e2b42a229c81a640530eb92858d109b191020c03774ecc6ccafc0bcfb8d6fc3e6a80e255f224f8d2c089f0207d6361add5829ecbf58fef70515e94411706f1378bcfd0175b9354d16009b7c1f3506c7b1028ec968de6b9ce0e307fa515c58d7f6bbaba11d84896c1aaa83eaa7bfa4d8aec0ca528eb2d932d90d91207096766b7869009e2be031655f2c75246a60fca9383aec4a324d6314afbaec45c101e86680a08ff12afc70fb63ffe1bd8da5ab6ea1bcae8e51cd49eaa8d4c8db1e3dd2562801532bfc3ebd3a17f141e41a8690af19e47d2d811b9cfccca17013ce36874069120255e93d29aaceb61078a535d85021f9743ba2565f06ff29a3fab0dba0578cee6d15bca43184d919873e974ce00ecdc9ce01a00876bba5dfb3740b5c5368cd957e75e3cfcdfb0ce5c79806cb7d621864aecb01bd647935f3895aef7c44db6ad4285dd83483b8511b1d3dd9a37c36691748a5e664eb9edce38543b5717f328bb44434e8595d3f032346cbf27ff4cefbfde556e77d1d3a8f13b8c29c7d2747568051f3cc151797960178f97144aef996c4045db1332890bbdd25c3cba0641de2ec808703f2fec981c94c9d8b83fe570fe261a8b61ab6e1dd7979de8c7d185cf32143ae00a584b87f771f97bc437fcf5f71ae12a1b71b2ff50c3362c32898b6146deecb806adca684841476528ba56ef46c26056e96900b2ef545616969590925d444721a798e0944da281bf42712dc44933ebf94313cd6d4e6af9ecb45b43eaa571aca4139497ba5ccbefa7f7d43eb7c6b60f5870899d7073c8cf4a22d49cdc8de966eecb5d77365729a0f3e3b02d30dc68b262f626c8ae0b7a93c874f9e556d27f4f558d4c56d42d3f191ba8b94d011c552477312fa8ab1364201ab8efd3e107bb11baf9bbaeb361a32b175ecee0892040336cd7186a2f8a88335c019dcacc6be3b56d463bd684aebb0c2dff4eef39555ac12bbe1fff9f1b15374b8ba4268cac2e25133614f5bad4c2753c6206ca00fa9eef324c2fa218ed5c4f04c0f03f502d91f4e52bd591268aef8edad361e3dbd6ec097096cf4310d72c5445b1b7824020c26b9f6f452773472fbc4dd502e4f6326a0a696bb3c2c69e81a2c442df54047b31936a512f70d703e0883cc80c263f54d052b7f7edbd57aba48db2412fbdeca5f2ae9aee8535756626e8657271ee035134f74cde1832c4b09c3f2f48c7db440a7f6324c8acf8689a259cd41bfd744ae39fea64a58fa46a16d96de8458549d58429d35f6e3a0db46afeb0a9c8a4654bdb3e1129ff4a10e2e8df889e4f86fca5b7d5d1d78a0471518512c1fce37c931a006c1f597cda4657bad0a49b4f6bf4ed9f0456b52fcdfaeff98d6732721293e6e92f81a73854eb136bcced5f87a8e9938d31a7228a63f4233c68b4300cbc1eb4ee26c45a24e6dec00b9abc46805cad6897f7cf92306c7249d11d0860f2e2ab96892dc60dc0b163ef1bde5e921c06975ca52c1c3f1eccdb0d48917b2b9ae1b8ac5101335da2d1841056244a07cc59d053a69e05d3792f94efcf836caec764c358f7f33bf063859093092b2d46d79eb83f1e8b63044694e6bd20b83148d970b2ff938c2fa27b9b53c914198e0a4deb0f2dee2a8f4601d6aa137cce4fcab70e15874a1658a67249de2251916b1d86a1c65782b47e441ff5233c8c403185fe8d763bb72acda664732573a6693c24fa70d5a85a1c847ade03a4ad76fe17478c1ad9ce77c76209c438ecd1b1487b644377669ce9e6366a6c283961d449c833d31523366f6bb03268f3a4b0df5022608ffa7a894d0497e583c22864de78b3952c8b76a140e0844518d5e08e2431fd33847dc841e4367a6ac93caae098aaa0333e2b5b03a214c4b2072275f270a444fd449f7a2a227e13f61c9c012cd5a872a249565bbb4bd752d45c641892459b44122a7242f417c89cd3e3652a0567c42abc4c32d329096ea892f17086c0e1a320c86fd5417fd2343a68da47977906e4ad97da2c809b6b729d198ed5a0a9aa43eb7d551138f5a999c0aa8e2224c66f7bb76d1c2adb242b49bd6921148a03c80c1ab3ad93e0b8595ebf66eeefef2776fae630169b12ab633989bf47b4f29728c621dbc02c4c1c90cc3c5e38923d343ace41c3444954c6a43238ec465ed2849a0775d8bae40261f41a6e5efed96b4f710be9ea4abda24b80e7b13a2de24e098386d9e743207ae0db2e52c1632c4eff376c9a6f54e17a99c44b72f3d23b3f5a9434069750805604c6a6ce3a029ed177ab9080c06a6f1655cf992c570eb2f1d6863c98408cfece71489bd5345c3d78fb13ea45972a0966091de1a7aab1a67bc133d3e1a03a677a324f3705c07d57c58bc82d648a071f4acc12a45aea235eac7302f54a35b996b52dc550307a59e2500f855ca582042b715f2d472e0a88df995037b1b64480c6cc90db7acdc80e70a60337910970275d2104f09763f8362b13cb0699d079a9908fa20866585771df46bff0a730efb72a44abb22454d717ae3f1cbbc71d181082d7cb0dad9730166c8d014b21b8f5a294a227192dd3acc0079416698a8c671d9c73b04456d3cc6b29c29224ec9b8c5fd083729997eb1aaeefa444ea77b6aaa84b012c0807db2d09b932538f35b0058257e48fde95451534c8fd5443abaf787229fd38d63bafd266a42888669feaeb43c5b1d9b45dfcaac601ed10da7dced477f696c6c02fe180e7f5d71e1eaae9e4495574f55eb95e7dfea087ee3caac15996fbce05a8c8fa474bcd4d08f745374c0e9665011a274f112b9b8551c4e0f561e1541132c2de1c77e6eeeca1990046206ed8bce67bb7ccbe7adb799cd19f48f55a011c5ab826fa74ff8d24d95d30381d29a1ed5955af4b3bf624a112cdc56f8c120babe53e52b4202b7d501943e915858e0bf7d2c8b7ee71d46f037075fd8cb801cc9aaa41c34ce5e8689d7e59316e91bff6e2107d33cb598a919911a31eda0de547f71b40d85528516594a567baa516d0b5f0c5a934588cde8ddcf785c72c504e1bab2bc50d61979321a63ba0ec65a8e55924d87563fabc469453d7ec3c7e07c3a32dc93c75a0c6996c1b97a5540147990260635cb805635e6c0a282494f37d984ce7b69f2e8eb61581e27bf39716e1f2f2d0233dc2a12cbd2811bccd65a1bd28c201b8965cd1a9c1225354c4ac3c0b76571bf615aa0c1979d222697853e096b6d58508ebd2202d2029cd4e81182010e1342ca904f90d68fe30516a22b1f5bf4b31f5fdcfc57cddbee63922809a971e04978ae018f1357d87a5727a3cfea1a033cce98a95dd9872765692bd284aee4dd204544f367a2adad37c5ac65420db5c8876be162f7f2b758975541a77c20d7e4fa459668c6a9288d2c1160ded1f86f7e3509584c9b09d9ca435d3e254a8333ea8d0e13e23aab14fdc8375bb0702068292b07e061c35f0554851b05444a3927545a97df9545b1f9a152bc3f9100836db8b64494ac58659418808c5577ba5925e7a49589b495a9956e28165716c475657abd326f07cf1615beba638e2490add0f8778500ca36cf24b3217d669d5bf2608c2387d9f59cada080d1574a73b52809fa2d02c1415abdfb6ab95f3c4b090c2d88c30d04ba585d6d0f4f1a71c484596930d7a2246ec710748c6f6b517b773ecf5694ebd83826ff39d735695ddc71d573dee41a50d2c4c3029ea7d56897c75454f0842337a4b8956d2103da68438906e5c5dba10a027537eeb2bd9b1177f6ee8be3d86139c32be51e6bfd035c30cea54790fc832fc388a2505234005663b1727a1276c5d2e1abd2385b34929746448d0e5a880b44ff933c471eb897321bc5973567b9e4b63b537b5dec2b8001a45bac8110c275c3a1726a4a7eaa8083a6dd9ad11a84814c67bd626654b262c48921938103e472235abc3134e339b00b553252cba8121c982287ef6e28c2ee265fce59cceb5364069b2bcdb131aed4050e04440b9f45a6cdbd2647e3f828acec8f554ff82443aafa8c81e82e124e3712c68018ae55fe9fd8359031b985f8e8c37d54e359291354d4aa49a9fe243464ecc80119c75d19d7817d749106e9827163868b9a4dd81bb0720c09db4dff5675cd2d9f93f08b0c293cd2fc69e6f4d5b4b147aa71d5b5ab191b56c64fc3fdedb25ca1f1861824a299559a1eda89d7c924eb0e1cf154e478440faf8ba5d8c0d33ae522ad9eb2318d1157e9e8845ff2ef24a37b5d6e4c7c69c37f064c2414c0ec7eb43a0a3516f2f1ce0401fcc849ce667653dfc5fe305ea589a8cba15d48e52c910ae3d80249958cb7140ea45a668a7a028f075239de99fa4f2795fc05ec6713e0fa83cd234d9c9e6a2deddc47ceb8ab1cfa6201eb1ac87aaee02c29d89a8649dc7f76b54d59c24db2076c315160e20ddaa846598f39c0b7a3aec8ace49e125a500626a4b303e18d400fd57102b19fef8ba4ecaa3364947190e33a256779b97dcfc6a189f0573ea0c0cf6f027f66cffbc0b9063989e68dd96f8f9c074ad07b95cd876ae32eb496e58425e4a86c636ed4fee1e675f16b1fb6f4f5965c8d9c4a615eb8dcf8599c9e9f53cf0307ee5d89b8a750bbed9fb64926d4c15bb677de32b31168f8bd0b13d5b41a7fdbb62c3b0f66cfe8de4d0caf914deebbe1f62e4c54d372fc2ddb3bbfcc6c042a08fcfdb6173c3e5086bd15886b0ab5dbfef3cbcc66a0e1f73eeca8a675bc6ddbb3f9c1fbb7c85bb765f36f5e96cbde4d14268a69196fcbf6ce5f6e36020d837f7f5b1fc355188c4fe0002fbf8730e95520ae595d76605bd7663390305c5178c115da88e5de2ccfb9656633d030f89da74761c82a4d1ddeee120b5dbd3f01546ddc4e345705e29ad5fd3eb77c54dd95a6ca21ff1a0e82b50e1475ce950fbad38d6b5659318096ab86cf76ce930569fc68779e28c8dca89ac6985ecf8dd598adda9d2715b46ea8c66cd5ce3c51d073633566eb76ebc982ce8dab395bb7334f14646eac461ff8affa9939a2e2b545b4546712fd80f3de9c29faad39a262b555b454d6f655576a8b68a9ce10fdfcdcabf19dbd3a53f45b7345c569ebede64d6715ab2da2a534b3d736bed71c51315eb920d31f56b7415302811135046116ec94e1917358c06fa9ef19e5b92feee60b51e635007aae1436c42550815395b3ac1481a494cb5211bba907a71d36ca88ac70a6e814c2a42524628aa4cba483aaf6aa8517351dfb3638e639f5ad6e9a8538f154e98a3f8bdf11bdfb6afa6f96aec9af6bd57aeff50b226a3b924d01539868c2ac0acb2819a32d36419b4c9a086b3b6493da78a4825f2f0b5dc1f2bc3630f5c38d62e331076cd4c8c24c74c0d29f0594173b783b0f3a479a513aa8d4d640761503aa8e1a48f20c07accb12937462347aaaa231b9e8d07ced6a4a50ff8a3b544aa97bf472dcbd2ca6ddc8b45affb5c0aa426a807747dd8b7c01e15570dc5aa7984546bd3aee5ecbd19a62b41ab35e7cedc2b2d3ce101a2038d39a0387e3f5985b658cb58b69b539686a07af8afb045888a0a8ffacef05abef361dff710874160f6aa308d4c013cbd01c34157e481c0dddbd11572392e9b48f1cd83c08df213f35f94ea323b95f2bf4632dff1956a7d8fa29a020cac0444e6b245de718f2f6f4d723d29b3c4bf555200ced4d6e54b66d3dea4c5545268068223381124e4843eb066e7cc838d1b246db36953a7365567808e676ccc4022c10b1a2bc7d7053082a4bc95f1d8948253f48b2936a3a8675c3fa21a4147e15dcab7882bf4f4879b06c25e37826fd93a9f7a6c6c4fd6733d7c0db77fe5bb56e8609c4e0c2ac2467e87f7f6e710016da16fcab52501c0e090340570e405bd97bb5ced56ed5c84ee15d87b13432228d0e3230e786e13dad2564c7eb86b49f5ee7f061a5557997565f80faab593b2164d0e2e7f535fd2da6836daeb3f4f43c72080ccf1ee3ddb51fdaadd279e0dff72f17cf1bffae5fe9b5fd5693c0fa42671bcf15ac44823d348aa46182d457edb8a5b11e584807a4dae33e84fd7728f894db8f024d6f526ed6a7998c677bf137495b3dac50fd7d5a7d79b190ecc9e34bc977959f43e6084e433d6c7462aa50f50e7d7d05921c5b455fb596d057f3bc79b9ed63d224563b0bb84daebbac4d613f5c97fca2d9f4cba69fdebc7982220ffcbbb2fb81d1e6b5c2bcd63c703b7ee4ab988fbce3ec8bcfd59cc6012b34625d214be34e9fd4ba628dcf3205984c30379862bc63027a37c76a453af57b747a40ab2412a69a236d8f8b3c2b1ef60724cdbbb8cac1d553b1770d6d08360110ba36a067ed6c6160354fc7be3891292400719c20d2263f625f840c497532e3a0ccc605cc380e500dfe831d9774fff9e51618f14fee6acd743701ec94de76184915da7b8465273cbf830315e961c5df22f3d60e7b50a1ca5dd126ce5f4045633ef2309a1388846fbc9a829ec71c789c8e5dbdcb76181820d9acadcd02015bb359929773f58aaf7137da9a2e21a14b4df20e1a540db79230806b7c805455042ef1bde1f3bfe709fc1eddc10cd01aa5245b04a9af3beade512e392c20271e037c06ef2b010c503b29aac5a6bc5d5c57d54eb99b792b0fcfcefd07f47dfb61796a2870d1a37230c9d662ab4e885c3f83b8390d0bf59e6687d1217c27feab29020c17681d35f1e019149881365343f33ac9093331fc698bbd318ee0c4327a2b954b2644b038f08f97aa08381c9445213c4a4166ae5ea15ecd283ed349f99c80b02f32fdf55e7e85a7aef354364ccf30a19ea0e9465061bcf8fa426e435e06e8f9c40da649e0a2c3e4dd24028dd8936c2b3d37eb780079c9c992b20a3caa88a34019f8ac5eae14dc38343715d86ec67e8242edf8ca9b6cf22bddb9b5eb916a521a77b6508cf124cc3b5ccc3b0275e7b63f533b7bb0eb9fa3743500fec72be34be0b7f722e9d3ac3ecc66e163e95191df262a303a8eb0ca31f0bd84919f00cf04fd3ad2e7b83f99c943a0678404dc4e77b06c7b709b8b6982b5925d60328c8924cf9124ca02d30adc587be68a2241ee092c636086eb47a12d85622c3070d663e0e3a8023dde39a140ee4b8da0cc6d0af39dc3fbae2d84d2fb51c698562ae81405d2602bdf1caa3d6adc745388dc498b6cb28e9a3fdd9501c70021f4ff5129c8342cd74d50f37e54d7669e9fb9a01ae97c816264615a90af47f6078a43b0ac7e6d5a8bda912a6335f33dc56493fa3e9f9e5a96f15e2be480bc41a74c9cc26615124cf3efff6a79bed4ab9a9f228ae40814111a27f02c995687facc55ca554b5f08bcb198592005006154387bf847f9edf2bd9ad22780f7ec26d018123f07011ef0ebc4bd80f7f20ba33c78c2c9be21370b8510605b51b6a675c92fc049e8b4783103ab4ceddf9c848a1917fd772b55cdeb5efa6806cc24bf6d10bd623c171f287f0b817b3430d0c648f4d2787261cf77e63389507fc827367644204ba348c742195ab73c64482173460ab3ca3d6cb83b37f4196b65470195d9ab11001e4a5ce24effb34d9c95b8545a4ac833d97dc2743acc9be3e09292aab2a29ebe6cb8c7fb461214f4a2b2307c8a91487ec7fdda5b9f2c17477a8f27edc5c0fd783c832e09363d3d1f6e4c961014191f8669b0882df3920669e244babcd972a0f576d296a7a39eea14126839a7c6cd79ea81ba745e18f3eb3a9a5682549463b91cde8aa1c79513248d36291eadd0c59d898b536d31d1381f2ad282660e1ca90ed1afec83aea8ba8eaa276621dd1664c35afaae224f4ec5d1769bac28b0592ce9c9d429e2b105af10af752503c774e11492c12649a54d75662115630cb0b97219ce5594c05f10a2c712eb0e122b7ce9f0eaa01c201654020a7d33b5de71cbdc072a6d70facee469f5cb9f8434ed7cd57c2a34513ae9b8fa8c98e17408657c5523eab38b16f76a6b7dc0eb319687adc00049cf6d2f69456976bbba4452aca24f8c6a05fc69ca6843920fb7bc98b6895053ce568a155b3d21cf3ed69ba69854e83927025185ddf6e6c6ff886aaf8f9c8594b4de77b7b648de3cf5a3753a3b7cbcdc3e44e8fe998a83829e1bb02515f50462472b103b94fe267491a7fd3c4afb89772871f288f693f342f6d781ef5ad79e8193784e5e62dac4edd3512b5fe638d71385eab5e7e80d4739d682e0020059f0ec8614d2a4c8a6ae7c37667b244dbf41954ae21fa0df94013fc33a7eb13bb2e01065673be0be6318a59ae7424feccca3c499903fca2f9fd1aa98c99e3e27021ca6c07699fa5a2bacc6a5c51733a14daa621d3907dfcbd76287613e7d1b3e8bc7f4a6c82e60ca10f8263161eacec3e6312f0d7eba36a3c032e5167a2f82f2ceb942d4436664b5d89c8a2d6373e8df085a75ca8820a31d7093d6a6ebfc283016987af6b01cc2fa4de109c21b767036d0eb4283d90ebb4bffd0d314a1b2531e5456ab8924e5c1f05cba11a43d18bab9d11c131164da6a222ac3d595509680bd41f0f886634831b8db96bea5a3b13c87c0a56f563ed57f4704b0425bda2d887436cd810f745e3a1b8f28f5b422d3e8f0f9e5c96415d4e2805aa0231335470470f73a4b940f810d170445001b1d1e1c17045a19aba15a2016565107f16b4f6acbba3ccb776318f08f55fbdd42d8e815a61f63b985fc97e57e8bfde810a21d6ecef7606f78ba690178387cf2f3196b4eac3f50c5ba291f6e8fee5bbf1590d88be9bc4ccff8486964ef1222f796522699023e0ad7091a0a634bfda6f6ab55d1e07d905933c32a62a02d77591f53375c9f7ecef1a646be7ef96e3670b347c1fed2c79a29d37df7a6b6f1d1a663ba9fa1addb5fe96b6828310374d58de1bd20c69f4a65fabfb9bba30e74d57d8e8754ace67bca8be98da10ef00c6b68d7a5352c385cd618c1fef3555d20f6fc6977a17f86425e08ce747c39c1517014540e95b3ef8da50dcadedfc472a77b6300dec84010044fd754b2a79f62f82fc06c4cc0a58d75667d4fdf490567887a8b24445b78b4b6d166ab4970698b8a68576444168627142a8786a178fa0e51a3102f9f4ea33d62654e1a1167b633f0e9db9895396b5a209bc459e16865a0688f3849679fd8d68893f44ba245e224fd2b5a202769eafb31b5332ba32b1aeb84c09dcb5be6d0d21ad9c1e6422ff9c089140d52d489efa75bddea666a6af5ee307dfbb75bfede882bae801d89d410b8fb93a9046de556dbd1ce9ba97172be93d184d32740cf8b2c869002053a2042063c7095e48c0b9ec8feaf811a60d18413283182043e200b78730f95a104195e2e55aa77e1c01480642b10030c307aca90e20a256c40c405d010194b786400511af41174d024054db828c2832a1600860cc9109cc8e2095790518493710475a20c23bc2e2690e4d6c51760ec80093d180292132e5e393801111922b0539021848906e5ba28dc2998e0848acb20227b76a7917b484a13a424a1f4fafc3f540d9f80ebd3bfdab5d65a7dde13fd20ed33763f958d6eff6eb6dae5650e1aad7695a71b3a0229a38a263bd31148193c6899ce35a5d44caf421d2c03ec4266186496321d92edacdd3fbb334211209091e7d766d19f370701b30bb8cb33cf707641a6bdb99633958acf2444575be0d29aeec5f7de6b5dfd9f8709b0ae7b844b9390c9643299501508169619344c6314e1eb9eb3e7243267063e540ef77f28a794d64a2badb3ce09258b1cd09cee1eeae0ff28d539fd572b90b55dd7853a97a59a7e7673ce5209fccfa40a75be0f7fdd17ead0ff40100c75bcff4210ffe0d202e5f9e1e9f4a1421d8c51f814e2540a638cb19df9a3e2ccdf1567feea094485423e296e53f290fe994fe10caadcb8c6d11a54465b37be9fce68cbc64ba149efa74534cb939c741f1a7328dea22fba729b1f392b3c7dbfe37a94d8fa3b320dfcad02c1efce7cbf2fec3a9d1934c4feeca9aa54b9ada0d940a356d06c6905c45e0ef10b6a9cc22035a340958fc6b8f0c95ea933dd2347420ac7d134fea0bd3a66499e4036090c6490e77b230e17ac12e2bca898ca3c6c34b655110fdbaa28cfb856fc71b9e1c8e86a46578ef3c281217dc1e428e370116ba0d4e09c0c029737b99b5c949b246775a1f763e888dee4dafdc6f783f642f3c415ad63fce8081c4b47427228503c4a141d41b67ba165b7b2201aa14ef726b13b6317601754be21b27074e537202759495841ac252ca1fb05938fc6429a1bcd8dae7034399a2834526eb428b182584b686e34b791e6661a4b9c17edc1799534b75cbb312bc56ecc54a10ef8aaff74bebfb95be373bc0be2e276fe6ac292f8830347f982ec0558ac0657934b522575ccd08fa21f4e7ed4a440c1284af69b1cbdc9d19b9c0f59f69b241f2f1f301f3e3e8cdcf107cdbbb608b7cf049a44968d3563216101b192b0b630a2b9d1dc6870345068a27838af1b229057b7e057fcf2d10d2986035423263b82e48eb9f662e0b29bd05e4d682f2fa18ee9a9d87df4a1c4995139ec36df1073d28bae724e88096da8c84995087b170d9ac7706284715e383d383e34379a9bb33c2467e19c5573bddae6be7f36f2a323a4d34873c379d191e686f362057d300cab815283b3d71371e9835dbb42a8636f7254acb924feb4143931b23979f431249c170e2ce6a41b39f253a37b7daf28deaae1acae06156949fc69799588f3a22b7f1a3e46b2d7c01107b60497f656e3465b1688aee67b2e9760402a7ad762672ace7ea134f30c4f33a3c469c59f962f893f351eb7a83eabe88a8a4d83e42ba7b911c106e5d27776ac968a2df99301a978235bf147f525d54843c43356fca9f175bc2d7cff3a74e808756890beee57b8c09da5c1d1dc429d9b1c0e97382f9c98b3ca9b5c7656f7a5ee26474596fcb9005271255bf107c797c41f97bf21ba622e195d398ea7e1a202c805cbb56c946df9c813f3cd7315c9482f4515650a28168788f3c291e11cc141a223acc15d351ec73f2739aba32d97f7cf52bc558353e19a8a1e5c53e1a332f2471c87e4051915496e72248e8cb66c28a22b960d3627bd593674d1a4e3883462340d127ae56f4317cda23142936e7316cdcd4931da66c6fbd32c8146096dc3f2fe345068c2689bd4fbd32481e649dbe0f7a7c1d120a188b66cb8d180417384b609df9f0689c6083445a0f9a26d4cef4f736b9b5b340700fb283e60332ed597344ec8fe3439ffa17a7b5d287b6889ec6fc38db68682aa0ab23f4622fba392c8fea923d95f4589eccfb282ecbfc282ec3f63969d9e00080a80a4a063fcad38242b0129420462049023442046ea0cb13be60736e3baf12be20facc675e3555237be8a1bb8d93e1637206e4095edf87363eca6297bc805d93f881957770b650ffd647f204bb40bee79d945042213bd1148ac06475b2c26b8a1ec8f73f23282b148d60b329a5b37b282b0c02599cb1ea2b9d916d1060dc5a878ca56fc71f9ea32da70a3abf26b92c4175e3f72e28f24baf21adc0fdc8fa01f4b7e08fd6022851f50b2ff8f274dfaff18fa81f4472aa3ecffc309d04dee06146f929cf41b293dd99f4608832a7be38f528d7f2e686e261c1f1c203a8b1ee41ffac686a22983f3b201c95b35dedf865b0df1268aebdcf1261704bec9657f1c1c7f1cd88dd00dee8689b7b211ceab0687f3aac1e1bc6a7038af1a1cceab06971de7858361460e67c86ec854a10ca2c98a253c4306d431f33d1189e948910a92983123d4b93fe3bb6d5c82ccc8df986b62e012e3bc66c4584219dc2bd9bf11a3b9594fb4e1366f8ac8f3fd88dc59dca8587a818a9e053f165e5418455b6bd0f0417da24e2e271a62bb3a8b1c8bebb0c58d79496802038156435b252bb3b3b14912d395dde1e4bd3f2917e09224ebdb8b13b254d4275d1150e496476b9b895b724b62ab1dc9f669d448ae660c2aa6e88aa0853127ede392d88a68b95c399369333d68b4151a098f1485486a6112db921b131c2d17c6ca994c9be9419dd29a9c023080023dd4b53ec235145adddd674065fb3bee1466c0c2047bb3f57fa7fed6be35a24261bf2892edfb91b7bc18ac6da6b33a4f88f60449018a523a1499f5685318916d584418eb18fb9d28240548e6e389d631f6bd237839b217a32d10c957f6a1c8a2cc4029403d41d9863e42d9961e784382ed97a658ca5ec0431ddaf45412293180734b1d61f05c732e640fa06c59b2f56aaf84a05ceec82b3c8032944b1fd94e77778f79475032b19d73e68e8e3d7cf4b0511cb1a3ec9e7e4d1d69f715a00fc449a71d437f7bdddd63e9c5d0620e10fa40ba75bae6c4d08d3e9cbaebb0038de6dc80dc62284053ea4edd9d7a0d9ba0565a9d804b646571f23e6de1dc720ae0ac99eb33c0594dd4331b4114720912057144fdc6e53aa9cb138de096ab4bae9452aaa273543959ebcfd04e7aefd947ec64fd8aebab62804b235877e45aab0df241f6c8f101c4c707ce5a42df446b1b5376232d7ca7d63b59748b87d645a65f67bc3216b8849961992c646a9f890239ff25cda59187293652a646b7362abdfb778fabb95294a4fe624e7e3e9f91d993c3f7729206f172152dac637ca79644fbc0c88a64f7bf2629f02713c5473207982c6906471e2616cbcf47264a89db082713c559e1fb2de7acee598cc8d44e33b12c5393919283744f9e8165faf9ccf87c3027658c6c47324832381928cef2f1eb7192fea4f28bb65223cfd093ef05001800609992374630ba1eacf2a91acbcab37cbb56522a63cb0d2a3eb8524fc43553aff21ddeb0327e3596f1a3a5522a371ced79bd60379c0a9813ea007192ce9933c6c05a21f77f2b608eb6547efe97445ba99feeb13c7df2acd5c7c96964a7465b397445695f8eaee6af8c1f2d29cf5f1989b87c2cbfa23c5f45e429a281874657f43febd6d6528ec2cc3e5b67ce2a656a3048682dbbe6ac159065069ea757853aa5b76e23544f6f6d8432fdb03bf1149d441e9a93a91b607ff719e0ad918202fbca8a78315dd550a584b0fb58ce7caf3c9b8c01257793316434b99be490b20d2bdcdddd9d873667ce7726ed3c79869c2cfb492dd327464f6c41bccc439bb9ec9a411b60a8c333e4248d4ce6fe1147eb2737fe46a853bf45c7be93d644cb377f2e2ea18ecc921f9c23d3fd09d1ad9551c6f699e04b41a6ffe9d011eac82c7192be4cedc8088699e918d191790be3dc202c94bd69456a2b9f7aa76599da6d8c2263cd750c10302dc6e8c85552a971c7c8966917b86cd60c4dcbde62794a83018299d1154dbdca370c121206c8490ac457f43b31255a1166e624ad63ce0a94522628d3f7fa4e66fa56dcd9a9396984532e13445b55c6c5856563b60d510c754ae1e7f80c42e694bc019cf1a384d02953a629c8fdfa3df8f64fb8c62c775065ff6ec7b66354d3c10445ec724b6228bed072904030499ce5956896a78e1745b1bd68b029a535da5a197754ee7516177d4591e32cf0f7a22bfacdc209a3c9299a858353b965fa0497e97f386134eb7b3d0ecec7d2d62b8a32b56369816cccc1236da30258fac23ec9f3ed18796e9167cf070000421def03a045b7564615ec452321d312660633a32dd57d3c13caf43f9224572b18a04c7f35eb96b941b756c64f054b91e9f7e241a62fbc050e2ed3ef95bfa6e1e49c0593e9e344f1d64e0d474aa6e50ccb919a8f413abb4389e2ac13692465e63406e95c83e01384581d658eb20c929346646e3236999a2863e4249de9c153e3b1f1d0788ac6307009338399e5196d05d6f6d108cfe82c531ba0d6ca778a67c85b2be38e0d6ca546231620b00d4ce5cb6f6603f3d68e914d0ca42c36b0dea98d4f70e75f82cb1eb64c55446b8361810590466e12db700db2532361b0e34fea776a752cdbc89629dee12c2f08d60297fd4401489cd552e363a7d636331430c3e1d536aadc341a189013430c1883ca5deb510a30cf100fadde3a66be055c14b3580497dd0394110418f203e4da267cfa04a00d1965ea23cfee012d7f3146a65dd403db8c93e1e8157f3c64ae0cd8b4d5b97a06ec16c019ea6021cc04c1a1d631f4bb63260eaf165a0875bc1b99c67f040323e08b1db1a2d61a8655a656b651adb653bb39cbfe69e7e6240dca3b46b62367d9c7ed4071961d776c4ed29da393d83b46a1b883e424ce499a52d9c1a9883bb71ddb4eadd4341e9a006c13f53e283ea1951facdcc106cdf858ce8430e4c8f5563d3ca1304da954bbc23283468dce53d9b8d1e28223878e176f6954e105002b980240ae603e1676c4f09099e9996fa7e6ad1bda8e0d6927477f474ad2135a107a326da3a34c5fb96ca328499906e195691060997e672b0f8d67c8597449a662bc4e3e8174f0f54bdfc856e007dd4e930f30fdf2a59d351f74d69ce324f378044ca7531f323328b3633b19cbf38f643ae5eb172f5f67b9b815ea5e5d4fe9c652ba20c9255856d66c17af935f5d4932d14eb9b6a9a822136d25a963e85b5451a6365323ceb2638bfd462ae5da4695e99358c552a3632c531df94bd034a32d6f3c39f1157d7a7136cd66645a3694dca526997e3923d39f49f21c4f4e32fd2a968a3a86be15c524ec2ef9139f80cb1a493217a0b6994fdf895cd648ca540cea182a04f62f559232fd12c72bd35f71a292b4f25a29aa0184e38523864386e3850396238fb129be7ef9267069632c47a6ca65a4ff52adf7353e82749e45993ac914ec1109f822e51999beaa6d2c98a92ad3197d0b44dfc68e98b434ad083a496fe75dd308d6ead55aa994aeb396890ec784b575093308c290115094d2a66d03da34262a766bab918f76b70f70ad48ba7b0948a6f8ead7f4206b7a7488f1bbf4e851e3ad1d4e82bd838f525a9fdaa794524a29a5b4b6fda29bb681707f695fdec5d7dddddddddd3d9b76dbaff5d7a0ee861dc5906440d97bda0a2b0575d79b5ead45af73dc75154b9028a56d7fbeed1cd8b601929eb91f095ffd7e29bf9bb608b7b4b44d77ee44ec0453fb134a77b78539d9efeeeeee5ab853f0e7dbd79c73be179ba3d84d8220088e3021fa03acbe2724c50b8ae20141f166d73d99bbbbfb5bff2a8242528064a7ae52777777772153ccf39b2956635e16292532b87d53791852f3cfabe586e9b23f5d7684812efb2df4676e910195e9a3f2cf07ec4829a5145756a54e3acb67d0b309eba0f5938f3e917084716ea2170fbac02ab9895e352882c3dc442f209d97f7c537b2cd3d34252997aa25be931778aa545d92d4dfdbddb3bf671f4b0554a1af5fca4acbdd7f0e346d5c4ca0db948941dbcc9116a1c662150aa01a53b9378531ead673e81d8802d11785c1836f4a21755df73e6b1bef3bd477ef4b34ab1669b2fb0e35d2db97aad49778269dc672c78e6ebca9119bc60e77a5f1bb0aeb98ee43295a6e403d7e3cfa801ff55d64bbe1721f4aec21f53e8800f5a9b1e506fca94f8d3eb87a407d0a352a69e95c5f80bbaeebbaaeebba6ec66a826a7262a0810110c8f184ee2f567df7e4ccbc61699b26e2ea1e2512715558dbdc68aea34995567290a8e64b35974aa552a954fabeef134275c4fb886cf0e453a2c364192aff19ffebff96052716d42a64440067aeff53d96909ffbeef9bf9a8285eecd95fe53fe32cff9f74cee4ef9b7eaa6f879a6c1ac1b1228167ee3b962aafb3631dcba76349665701579ef0a5bcc0a5ef69ad6feb7c5b85607ae4abffd1a01bc5d11c4daaaf0aa3af6a59748b26ebd79106d155fd5a7794f475eff530ee542a6b8302bbdbe68d8f34c8b9a041ea0b4cdf3f29c95f0ef398cb7c565454b3dd70b9299b404142b4c6e990810ed05675d1603356539313030dae1c4fc00e1484555f9f9c09f29a0351176a5aaa806acc63e29b7d23019acb09449e37739c3d2de3df4d84e02a7bc8478f1df9c525370b7847b21bcb193be680631d4b159ef59ebec03387f66da410a0add9d32b7f1fdc914e82006db50b3781e8189f49c689640281c4737be4fbf0d72fe9e0bde96fb85f1a7d28fd7dd3e883929dd25fd3fb70df0b1d848554b42f226bbe6a9d29d87c55a34bfca56348d9bf82dd775762825be877ded142dfdab0bfcadd67b4203241945cd62632011dc2cd9573d69722c0104904f081f24dd06bb5dc9900458c9cd54d5020943b7f0ec5592d04f081d22fce84af8fba1bba2dd5cee55fbcf55deae2248bca495a47f0085ff03ffb9e4d9fe3f707fc01ffbb607f9d8976d4c59c3422f6cc9792d2689d9868d67ead8f5a01ade27d2beed0057d4a06b8b4b159699364da7da65ecc88b3ac15eddca103472bf315fd16cf4b65814b3b8b390b89b7beef704e9bbfb07b3a11b022734ea7b4a9171fad2dfbf4288c2ec8279e7345e97f993efd81bdcbbeffb04f5fe536f408acb57608b2dbd910a2218a72131539ca2ce4262a12945dfee5ad9d61021e081db9f7959d4f606f546127edbb7d9620309e8f67e608039189d4732ee0fbcaafc7fa3e89f884e1fb807d816ddadd83585225f0fc1d683b0e66b122af5cee762382d55ec04fb4cb104394605694fb8994b0e51e8738cb264a91832838714bb774812e5ea204babb974cd7f499be12c87007847ac41785225dd77560981482f7de1b9e92a020c6099c61115018854b0003a50841c14141083885532aa00b74c11ea454522a380a951595952f6678856585c5e3820442c80e0514b0cc609951a300a966d0984183ca48e0a49280c94d7a028d1a346a10910008a94659595959a9a12222814c6564e3868d1b24a0e246cb8d162212f4b4b8b4b810f92411f9e0ae8fcda7969dc505870b0e1a914f149912f920f131e203cb3e338e1c38722439a18b1ae559a29043470e1d44207d36590784aa84d7f1a6224c8450908aa8c88b8808a07bc38103078e27f440870e1d3aaa288ae2a8021111b271c6064443e07e8ca45c93245cee2649b6dc5fcadd24c949ee26494c72493649aa410e73374902caf39330fde99c73f6b7cb9ffa9c737a4bbb48ebd803edae5d314845f73001aea2ab04b42b88e9524283373d220a2cc2235c1105114a532881e4b5123a5be9d4919b480827b22a3791102a20c267da074756a0e055e4871d24c1401551bc888a500223a4d0388802099bc48f0d86d00225984802a904020a46788083a2245cb05c264c237030bc8b9ab831598218b1237a14e044104a68d1449129a240a1a04245104932e4822362d0c4163d5fec80c204155c318327385041dda1c1c91f5caa6e671f81fb12442c045c9a6416d6312859db14dd2a648db04f32bd94d6264cb2272659c7d017a3804bd2d4fea8199336d18ea6b55c8cddf2bafb353e4376814b30e399db59957e60642a6a913f9fb4bd9e521de35f73159b075b5891a958ca33d4c14d70d71f4cb55c579cceb7827af73ea596e6647d930f7228a6e2a4745479898e2f6405eb83a28aae6ab56ffaf9f63bf7f84de0fa2a20814b9c2b55b98bb33adab5545abd5aa2b5d2da42c73a2fe8659c2b78a463e6d3563f61a67a99f1018411480211a5baca2ecaf5bd8eda226795e0914cb343cea237c8f5adcd59f4e98fa5d92097d628d71ae4d21e5953ad74c5f7e127707f8d9467bed93ee7382706be7eb1623ae0eb97b29b657b747f850bec3f6349276d0bc5aa22db2f411c64fb19a0add3d8538b1c8e57646b3bc67e4f19fbd231f6a7904fdbbdfd39f309e42cefedcf24d3fe5c5293cb29fba68c9c9f7fb49dd5b1763869bfc4b47a2747e58f5aeaf4e47597651ef195fd3965375c7d05b36fed9333d63496aa1dbeb25f126b7c88394e5a6fece1a4edac7b67ad9db26e7681be5a69155173d2be7e2955af4c3fc7f5ee58995426995658ccdaec919016dd585626b3c62cc4a9c8421cad31eb184affe26eae24546212ca54722b30959c4a92aaa6e0eb9792855aee9e767fadb5d65a9b524a29a50bc8b7bf651aad8caebaef1cc447d876ef9d9c9c6adec2168876f56bad6dee57d34baedfdfd7faffd5d2342b4b4d72676530e8f822b9eb64b4a5f2e9543eb734f25073a9f25971f1242661cfc5930d00b8b6f1ef56108572f70d93eb98cefbd24528775fae40cbdde3f0e95c84da6646eede85d63636778f03d6fde3ba15682b74bf42f72b74bf020bb5ea17e9aba106a763a575d65a6bbb9c8c60a8f3bdabdd87aaa1a6a652cb926bca5bc3209f7ff9a2609834f48c600462c7cc173be69682c0007e370c4296a9dc414a22d90b83605c43e94325c0544bf53fd0411004c1d9f774c320b7637a9a4c27fbddd8a3903925b7c8609a99889ddd103eff0fe5419c3a0d83d03a9b511aa4da5a6b10db596b6dd7755d17c4c35accfe7bcb93c6b2d39c96cbcdd99c612df034809785cc293d9d56db79f75412c9f4c7b2cc35a81b81182f8fdaee186bab779d7b5ef77545b0e9aded6a2a08879ac5e1459fcad44e0ae8399d14f04ae58e5aa98f92e4ac19b093f5f27b0129c0cbaa00814b9819ad62e794f8896538ee608332f8a009144b3fb8a69ac0fe2abfd29253f7d251957178754c8eff576ba8f37df7f1d8786a3c457445c1f7b7624edbcd99437968ceaab59bb3c2aff10c15396b3a7196118f8de7c85975e4297292c7899375f218f1d87868277fb0bee94ba75aadbdb57eb704661cdc7dfa385070643ac769d5f927823e7f2bacfdece9f4d6765d673bdb95c49d232769096907b7530b02835f36cd3fb1dcc10681a38c908f98e5892ed48199750c7d394959e8c9f8890e7b814b98590f2d37b0bccaab8c3eb4f8b3fc8c94caa73e35f6d07243ea577e65f4a1c5c71f1a9ffa954f7dbb5456766c3b3577a182938726b6c8305f2d33cc579ed9f38c29b87e25898055be4b799386f8c1dc05fa33c4a6abd71170d94638dc704072966de1e0562a14a44c656a2a9f0a6f483d8b4c2d9771b8e180e424b63db61aac2be5045c431d5411b894a9d95adb386df118f98ab67868bea2ef0394849e9914599418141852a63249f9494da6e64548991ec960d1ac1d2c648c9ab563d413093629974bd5fcbc5b327d60f5bcc0e527f4097dafeff5f57caf0e66860350db4c5b2b0a0f019732b5594d32b52953938952b780c1b4325546464a77f2199f58ed66d866d84e28afeb6e879291a9c918f92803c3e19f70c2b03838cba202330baf77efb416270c0c33c360e94399ec298419b2483033981bcc0cc609cc91edfad5dec065fad7eb6ee0463070a703ee2910a380accb41f97bd3101cb9a78df5aaedac57b6489335c864c7d10a3c6186f24e0d6646c3203a721d77b0b06cc71d5bcd0725cc10522cd337e19e649ac4c7209d97c008c13081a139ab659ebec8895186b1659823985bf68cd44f9c640a8317af7b635ebc320c108c500a84997daf53d360ce3abd6704aeef9e3b7187eff5f5cc6f02dbd086a0e993eccb64ad1d6192c02c99c120014724607f958b0ab4a38ea453a9d2742465fa4118873a286bbd2f0b8cff33c24938385fd1541059dfd2da66d208325e404aaa250c47183c87197096673a2b40aba7346bc20d327d085080be0ebf83b39a0a27d832fd0e78cb5df4c39a24e4acb2972025531926ce9a55841748ba80945a588249c204230377384967bcf2cd1f0b2a9732359b8b3943e05368a32d95a75934491fecbe9bd56515b1c5a6e34bce11c6a1327d1c1c6dc904b94c100e6ea50638c8f39ebe4c502a485490a8205141a282248c5bbe2894d8aeef4b3981713359080c395235c0253f994cffcd39bf1cf74be9fd3ec72350e42cca42cd71ab9fe3e62cfaf7ab98c314b1115fad73cef9b180a14e57ef9d37b504e31c6ab465ff7e0e36daeafe7e0e37dc1315f2fdaf73b15d28b15d2c56e4d0a46d4a0f00a7012881a927707d162b5062cb7c54cb1c7fece3f739bfd436a59f7f2a6a1bd3f308a2abfb9dc84388ae7ebc5ef28f178f2077e1fe144b1e6376a17cbfe341cbf779dcecc80388aeae114a1e40f9dab0a9dc7099e396e3465bd3950397514fc31bece331071a5ddd47893914d1d5b5610393c0fe2f349d97d312300f584c128f57db847f9fc70f6d53fa98241e321eb3db369eefe730e4acf9f77328a2ad896ff90807c600b358819a65033400d73662be9fa201ae5ff60f66f94e32974d1f3346b37800397979c820264acc12f97e4c04683c64d05f0cf100725604a66854910a45e4ab42ec01b46f8400aa28e504beff99c0b0bdd0f235893972911c68f3c67fb810486a9b1c5ee432c7ed06051d37c8f7bfca839a28fdf285e685a9202c644ec9dfdb578e2d9af542f31cf7bb592f553479bfcc71947314c9f773c0dac6f4396ea28d5ac7dc7fa9c28651be7fff85e62c1b583479ffbe8d1fbe2f73dc6e63e4fb396ef9be9b586a356aa6d1c6eb630961d0711fbc5f6221dfb742f95e1d21734a0e6d7c2b7c514b05e56272e49859c7c4ccdae6f4f763ee1547b45cbea71102620c5731a475cc3de53ae6aef2ad633993ef7d2a5e2759acc01580b5cde77b5494efe740a32d3781230f64c7dc0fb2237fe30fea55aa7a731872f27e8edb1ccea1c8c9fba631079a93f74b6349e6fb5f138e68398c9be73680be7e297304e5fa9f150e7698838a350d1573d69c41df118bc3d636ab5c8b720e6de15bbbfaa5ed95a37c727d1f67b574f5461f733e3168ebdbfe450297a8af2cde42c56e46c5322a868a39cb8dc88ecc9ce52824282054125490b35a667dd41267752fc48496eb07e9a18c2a4239c915e525ca28d7ca4337823982bca1995aa9374ec24dc44451266242289757e5f22f2d34dcefbce32f57e93d881ad77dd875954adf5fd1641233d092807695be87a6b93c70df03a5a7c9f5f5da992d3dd2501a3b5728ff37ee73b2280f9e8778feb934dcf197eb86dd584ed875ddefb6f9b95fd2f73a8796c4a6ab0ee4eebdaeebba0a0cf1fb2bb9c39dfa7acd1cbf63d35545e2eb66d54afdc6bfeceee661e69e7588d7a7fd7538a910336068c1efebc02af2f0de7fa0d8bde2406904dbe581a0288663f70a032919704b0da70f9f01a710bc5fd395c9f57dd46b17480382a2123aa582a292bbe3eed8f142ae3af7dcfd861f088a4a664cee2df13a5b29c5e2eb1725f63f10fc28088aedb2220f32d4262d086ca6cdc3dbff4a538652a6a0d8aed9abee2d3876a9dc6120d34f652ab6d4103ef80c0847f019d0af021116d249a56f5c26e222e2f2ff84cc8b7bc0a7a20a38c0423a290fa1b95bf0de2486209c81265fef6e1a9e4ae3376fd77594deaefb4425d33aa94d7ca212cf7b196a36fde7b39ac60ad8a75fbfb17b350307b22de59b2be0752e7da52fa7e93fb1e7f3bebb05d3cfd000f44d6339bf0fa462bb4ab7338506a053a6d0aae42b95dcdd644f77bcedf3da2e645fd396925a95745f451e3ab18e32d8ec3bd39f013025426a720586d07c9fcc445c25fa25b1a7f4412811529387d016baa6210c446ae75219825c675899ddedf674c70d78f6bc5a3d255e3756161deb1134a028fa551f4b2219df50418afafef62b100a9953daa66bc7f413a1d353f0f58bed7ace80daee3d6bbbb7e0e781b67af3bdd000e094f1af61aa05d8730982f3c67a68eded9e42019494edd3d14304f4d056867abb65e60f51dde9f990eb5fdb0408e7611022f93bd037e0de5504d8a7a101ec785d045f1d67935686fa7af120637f882adb1eaa103a458a0cfeca73e4a1eb189f21dd800ba176fa0d3eaf2db55215dcdd958092dd3d880525f04b63010c7c0552dc9dce1767ad204af6ff32720966f7ce51289410ca3d5486931572132911cbe1f6982507a46aebd3a6c1491b141d9c9cf3c61458e5083ce7e8137622039713e63f6bb98a3ccc7c94694304652a36cd0736f3e2abaa999a29b8549592e072a655df5f0958fd3953ce5cec82597070c428fbbbbccc4c4c6b6906b804b3101fe9a4d764eff198c54505e2213dbc7089af114e02a90403a715e5ccd43ca9c2630b1d69b0df53e454ce711522f08ccd22268cae56b71bbe2125c172ebd5e176e76bc8ede6efdf81ae4eb3e2ebb12faaba9c36daf21903ed81886b5e717e8976dffeceb5f64b640f77bc988e5ee44dbcd1692ee45229022ea78dd6ef99346df30809282a3fc0540529707b917be461f23073b7ca0f70fbb4a940814b1712722660ad6b810b4e8f1a17a1ecff644f0d5ced5242c95a69384fa101a1018957f6df39f2d76c9ae3e8ca63a0ad966eccbd0a16d68793ae9a216b766a7c34cda2c69aa83123b528fbd77a444989f38d817e0b59ac49a9a8ceec549e22579106fb56cacb494fea981a664b748c7fbbda5563a92531d09bcbb2ffc4d3565eb006c5e0ebb12e5b02975765081cbbb1582eab0964ce2a1de63e3115c48c1cc9feb346574ce09a05d953b2ff05c95bf6dfd1a369b367d5e1075cde4bef9867cefb7ecc429be2fbe40a707981d40b84fa17c0fee7be814e0142c620db91dd250620fda272e92415ceaba2647f9717db3d549f846b669c54c2b43f2c2ebe9aa36aa69ca13d7da607663182105220747d478f977eaaeaa7f39df49a8ef1aea8ab95814b0c6a81cb5abb31daaa51da6a5a6b352f52bbb3ec37287b91b3ca5a2bbba2ec8428053dd91d3f716d5ea45b1e4457eeb5255a055e44769cd792c64e46575d0e77ebc612cfb1d6b27b106dd1f6a08c9fc065ad2d11b2419d2c3b023ecfb10e955d51edc6c6c075a808ac9706eac067f5224141115010f5a089e496a491b8b8ec10c17f21677ad4dc76c15fe5075c561528b8f4d994cd19904b18b8646151054501cef4408191ec9f53643b0878ce39a70f1188144cdfc793ef237f0e90189a8e3de88cca125cceccbcca12b854b9dc54d0514e70a4a4becfe9799ee779de9c151cd283bbe0150c022eeb2bf6f578ef307721e62ef8a7a6804b0c66814b87d15aedb19cd861b507b338cc482efbbb8f1b59824bdc19e818ef6ed47fda4a3c6fb75ce2b19cb83c963337730eeb465a1b0397b5a7f6541858634254234c827897fd0aba0bee827f7d02f6dcebf52ac123a152b9d4e604e775012e411b3eb89c2f95ca250a3cbfc9222fa22364ee83e76bc2dc05ff962cb00d1f5caa5c7080558e80cbf9a22f57f24d5707babb7b963bb04cd18e438674a0878e32917a6021326249f6efc09c5dd7755dd7511db0e72b8b1de8c1491f1242e1fe13e9fd2f38732ff8a60bc402836e02efc930674d98cf34022601fb2b9760165be6f72f718b28cafe200bfd20de557f6687cf0f880bfe9d17b8bc59670a40be0aa426a824ad5477452c15a201000000086314000020140e8884a2f1702c4cf4409a3b14800b82a44e7a569a09a42487610a19630821c41002000004006646061b00caa1588870fb323ef000dfb810b78af011a481acc80dcfd1b5d476b6e0b8303f80330e15dcda84759e6db017cb34ce20a4067c2593e0a718033e037986d5c22c3d2450e4e4c5526866fd70407a4e7ee500b02a59cf6fac12d082d1c87389d5ed5931eb3d358d0e21448c0e2c600a543ad4017d9cc09d6cc7341962b2152122c7e9252a62ed6cd1a007d3a78c7d488c52f945f6a87a3b8bdfe19233693fb3067a09e0d871d1c13e3bee62c33e6c376cc83f3d5560a9c75e957be6224356a7179703d3ae6f4a8b4ddaa876bd7cdafecdaf475286ef28ce195a7ecd50ad6db21085102f979622c227c9b39a51e7802119ac260661a89371bc9e4a6ee0a0d65432bade8da0258d522269600007960077260b19cdf388833c02d38d9431b76126139dd8b7562bfea9fe77cdc219de17307ba87748cecbaf7e6e7588781ce825e6c4b112a24a4853316c5737e3cdfe279e75992dbcc4cef03aca3a208e3c7bc6b1952bf15923005e846e9e22452a57bc3b572d65fe30603fde73ea64f5cedd73fdb001caead3dacc0e4316657e24e18d24bcddc6ebb0489bf9f26c539627c4e64382467d301711e1e91861fdf01ce526cf4eeb07105e53eca3a5ea936841d25aa3a0b9c21bf7a057a36988f37285fd8e749a1bb7d6a7178e15f1bbaa9e874e74dd9da24bade750ca98675cd89b35be167bb4b186d47a6f68612fc932dba940c502f25b2a0edce54b0692b1f58f1cee8b75c592333fb6841a3616d3e17a7aa2bac4ef7ce497c69837d6a8f031f6f8425c086ed747488640a0a16d88871d4f36b19a58d917a2fde4b079ce6a895286dd881cdbc2015f6550e4e124b14e84cb6818c00dc9f6c0bf9afd9f3875e97eec836574b799d72e84842c0908a56ce1a13e7b27cada58f5033ca5585e11b6c9e9fdddddef3c3af466c609250a7eaab424bed0ab2246ee411a82645e9a13816230e76d7a48b8d1f0780ef36ed9a5cd66243da2ea785ebaf0b11221985989c7641f14875f627f383adc9073eff373f87100434c33ce0160520f236ba3f446c220055a882c4fc6b8f3ab0393d206ac810191d48d29b69efa73b03791495dc17dfe3f255a913a25f82f91c1fe7192289ae264447835d3bb469abf95631d1898bbbf5e3e8af12f86d248842093f45040481a097b9c30b0dbf416bcd2be32fd0082b9dcf16668ef0b4e5deb0fed2b407ca28b569b7003566a02244bf72e42945348b25f5248877b3f6096bc3ff736069f9ca455ef49de5186162f481be4c87fe8a605ea4449fad77501006bc9ebac1031bfd133f1d7c8beef72fba38a3cee8b8bdfc6da2b7376b21ef01b3f7e9a0f086eef84fb167dabc50eafe31f95c2210d55639daf7cce570f921023070d82106e62ec6314d5aa1bf85a570e5ecd4a65c3c3abd1fcd4cd6a24e8506f6e628de3c11c930b5e13d978ff04eaa2a2e8b8015ff311199462dc8cbfef23b040d988a9a70ba53f8d0826bb97a921dd8111cef8bfb2304a653d3e21c70216743645112ca93494a2521c0f175aa260abae063a58f843bd6f36299a01ef9cc3355ad74323011c22d5e465f002208975cdca85a5e822b211f4640a0bf743731aeb7961834c25aabfcaa6c00a9d1848e2a02bd6c4a893dd894a5c92cf53b356fd4c6e64ce3512244e97c3244da92fddb8490a34201556f6f7a5ac56a7b3e033affa23084fa434823b97a4a6a4d11e143724ccf0346b831fbe79dd48a65ef0837292631be77667eb2b4a5f9f9d4818dee0176a48f8ef6b507ab188f7d9aaa1a41bb433e11fa5360b6dd171f3e1c8bcfb61648c4bacb46efa8bd616e6c77e48a5a31b1a9c2b2cb6ea2cc5b963adb65e5af25863d0e650fbbfe40ba030a28844fb420b07db48230a6b97b6615c8626c2ef8f554da83dec2ea0ce03a6bbbf74b7899c2aa89c42350a6b941d0907c48fb79c3b6de79460062a484c50b94d0f00ca1350a14747991544f9aab5085f9287fa7e652f0a8a6a919d2004c23e746f4a00384ebbef2b0a61309a91287c990c2caaae95a133775e544225e7dc42301a96339f27c1029b6c73f9441749ea39eb892a0ad01886162959baf5d2c9909bf42fa2ef1b36d0424c3e7693e8717a2ade1e7f050610ee206560d008d010329769c457d1874e77d1d2e2be3b35d39d25c0f7b8a19dab51f80e459fec9acd1f539b9c180f8c1c12f565e2def42431a12562fd13283784cd41a43a2bed0fd5ce979e5ed2f43b82e6d603c32ef91385da61b4441a267e1647d81fc8853d1b04525a202ef37d22dc2c51467b330459abaefbfb7267c7461f189c68e98c5594994aba88941d62e21919a871e3e4fa9cd51aad484a261f6bc045d850b73620949f1ca67f4079948ada722fbd82f1aa1c687ee10e9811cb64bab7e4c2ee59d2c3aab7bc16cd0226d9e43a7727db356bb879a57c36155f000a04b689aaa0c13f39e39dc9ecaa34224f4d7db0be6f3bfdae32ffac7bb1061292c3b5a5bcf92833fc9500f1e8adcbb2d68eef909e22856b9830767b845e0f8b733b2b44a3a02fb1b58c3cd1d14fdca5c98b59a2e39e471f549223da8c379557412167a8f4ad0b06a16e54aa80f4199b01cba1cc53f80898f13b4ae896659ecf79eb7d6a36beb7e213112035306b4686509436682afe15f49f4f2300ba3ee18084696c089b7a2a19b2fdbfbca95dbfd35fc4457311d82ad1b21728bd051203533ece9c21e01b8e0c2676520b354c46796467db91a6c53c06dac05add4f652262930137d032b885bd545803365285327fa33946c0d990120a0a761d81e652e0332e8b5df407b6a03827893ae631b75fb1fb8982b4d8fcbfe35d28b903d33024fd4c14b22779007f34424b95b35793013aa4d456a82d15068c51e1a0084c15417d220a8a494bb051d5c88ae3a435ab2ae90ee21872d9295a5ca09274c854cf70843f543b0d2b3bfde70857299b3c5dfd6adf0807d3c153cb6f32db40904527b4eef81dfa80892fc520183e03be7ea3e110fe86feef9eddeaebf8724073686f2e1ac135fd16ccd67a1ec1fc04754dabd2a021972223d31c00f0816564f1b587b153bf0275c303b2e09d824840c6ca842850481e531bca4e827fdd1d81d49546649b7a9c5370843f3049de5fecff43d7d2b4a9f1be9bcb8c50814ad3cbf51b1fbf28a105bf47fe581308fbfc4664cee36b46b611e0ba57602683b190d082fb27a64dfbaab1f78b64ec29d7fec76e51fbb4bd9f3d811846ed59861d69c15b9ea44b5f07a48f5048b22394ee19820b883200e6082248a9ef7a132ba344f8080275a2b223e09fcd03de161a625db68b66233645e61cd42421ff6a3502d5a4cc77fbb9c99944fa6446b4fa09f92791e4d2348749abe145917036ed0512298c69d3692c2ea76188110932858c885d5d6b60f7a38ed1c1043b22e5ed79283ac122b20e972839739b498462a292c882e468234a3f3541118ba358fbe1e70c274a6edc3af0e3474db170d50230d5a9c580d59fafdc3dab006d41de324251c0986a4e66cc2f00aa05d016d50b5d10cc02939f95d7773d79b089bef28a99faec561e1a87139d236255a3140a7b261983f9ed60c0d5a9897a7e9053dbed5f6fad1115758c2f59354b4a799f66e851914fc641f9f3558f2cf093d271149d2b0c5f0f5ab86f292629123998df8c6faf78d2b01fe70f37d3522f0b59bb4326e0c8f87da67e2161369b28836b22ea8c302c9d333792523141ce4497f66bc79229827ceadad66ebabd7fb5d7fca8c9142c7b23dc05fc3cac43b874a048c2e4bd921aa44b89a43719b25f34ce068c5439e2bd96e2b66eddb8bd3dbcde32841c7eab5f66ffc4e445d5a2508d92a6c12284b5a60a0c4bf783cc20bc100e5e3d7a457a0e4bc49db0d23c4fffa10727c4161f6f1c2811382ccb85815ac828a066ea266c9509b7e9fbb41f60101377f73efd98e59456d18a011c18cd9cc00b52d1d7582dcbd1c59ac875276993a51d93c66baecb6b26650e8fd7b654050b22a73cd81ef2ee897d04b1f19da80836ec03d55ca50c2859ff568f101fcfef5ed94d6b0ec0532ce7e937a4378ef221623c5690249a8c4371775b7fe0a6412d9404eed0a617cddada1a3e940662001d3aa8cfdc9dff2c65efa905f33d29a6bbf5ca4f1001834f3e6e94ed58789756781ece95bd2e4035e6828999317bcb9501df64bf9dc0b29f19b637942cea6f5ab80f86bd5ea1ade68cf540f828afe13e44a598827df1d7631e6e561bbee7cbb5a8f3e571bed8ccc6e68f0a4bdb19c8060691147a548cad9d6a29b58899ad3b617c49c28b4aa5046858a3cc137587ddc4bfb7449e85d841affa4f29e0082324323f04e3f33d179a638af8482dd82a92766ede08d2b86e3039d6b9ef7187b9297fac39badde83befbbc82b61f4f80224eda74dfdca6874128d40f0e5692d88f0f93201c29422eee67e48c67eb81c7c8d7b3530e1c66da4e8b7b34b5095c8ea3aa3a08f6a144171ad8a6922ab470b7305b3c1e387b954f77b3641102b039fc84d3292696359477a649e2d2517b0c45ae720139484090244db750ce31dd5b2c77042bf423d3d02db0142ee1cd0c6ba10b6e25c9026e484bc4b39d6b7afcf1aa8002d9fdbcc6802fccbd696ed2635be6c8667c2b2e5b0e30982c3f08042cca47ed9847720c13cbde8016dd0bc1938bdd5391621bc0bdc0dfda2015a8eb112c45651f078ad294bdb3e99d04fff95a09114f6cbf8f1ecdfe4d78079ad9108da4c714af8222da78f32fd93c7f0f265cb09161a15ce96045631c23d1cfd18a511b21a23be996322b8bd014fbadd21355d4b3b00b7b747d6c391b52d49379ccd7174ffb5fcc8f0d2e3c413e8e3f41b71c0056ad397fd004492ce98ef442ad2910933cfac428487fc706f6e06907a66527fff1cd7928e09f4a016047eec0d18725fb64a2d2ba2c851967ff8ce909656412c7ff77e414fa0cd7f5ee68badc741f3b039b40c97a0841a1f15c3b7ae689dfbe51ffead89d4602bb999038fa7f08b827c639d780122786ac1b87e3a3e807e3118a7fdbeb3bed443f0d4e3fd89afd395621de5ba786ebb64d7240255d126a43212cb905920909743ad905178a46987a6ae74556bfcb27a4131dcf5e7711b1fe2596e8974f79ce557237cc358e8ec24a81a1cd8a2ea9585a17af76576dcb34613beabc32e7a030238762c2887c71c78d07694f0788f9d731792b8b5c90a8317e24095f922dd1754e3e4898695c42ea92fa1a82d65b4b5c44119198cb7ec3b87f00580c493c01a11ff8595df7671fd7d3ad64684c92821ebdb22dfc8f0c586710bb5ca00f9e958802dd4a26ce15924b337d6e1bad814e1db0e9ab76eb7859565d5e1600051825ef0cf9957ef36510aaab6927a9d6746b164fc36382d41ff85a3929f449be00b326a8047fa9e630295871f42f6bdbdb888859820a9093fd6f276ff0a207045e9caf930dce1f2f02109d70ffee5718aded0d66718234b83ed8ed21f52008ce478c7cfa36dcfa454a588d8b490ff5539494acac9cb154e74a66f9fc29242db36e11a2833afa991b1a4b7dba1d5c613ab18b83db503f6c855ebe959c3cb35045dcd7fb07b54bb9d19ee95a6b1e633288925b1922148bdb6fc45385608d5539924baa89b88bdf4bd1a76f6b4bb983909fe332878767209115996ac9b41821853c004b6d566ac2b029a82be434bdc357e953bd83ed47b00a0d28005fd042eeb1b4a570eb2133ca8e04e397565c9c05c13a35dc51ba4f01357338e6e73555e13cf4505916adf3297342255c3d6c64259a051725cada1de24eca9f4953ebd0b73c273b60e1e28274347e4659bb7383b32ff1ff55c572c93360fb58c496865c7bd791ee5807e261f6b0c1d3f538ba0734ad031aae52b8acdca2f8bf8ce5f9d75b02b869e51d579635487cf44676e2fd2b05ad6cb831660f4d6421fcb884e1689ecd4fd6120819c2701967d8ec66bbd7f7f910e001cc297379af214d8b4eade3d91c6ace31b53cba5e12f2cf526fdfd98b3c576501ba44cdc48eb89c2493856ee46fa6ad57cb101b7ac1e1b24bc391720418040e3b632d62dbae62f082b2cf81c1c8c5eda4d9715e1af3d1962b366fd77a2abd2d282fedc20ce8c894c4bf3b447c21be65cf9a5deb137c52b6de19cf1c6db96b95152aa52cf85d813c9dbf57a937097503a6882dfd26c6dfeae9cceaf73495dd63995dfa29d559f8fe31afb549e53c8c36d8aa6af215be69ad2a52a55d7df4685d174e29c800aa16b5e494e9526ea543c83f757e455a9f1108c62a2842fdcf8b9f029c28fdf692d5b24fd0a8ae5e369824da8b5be39517d215321a674e42131bb154069006bf7f03f319057464d3a897727d2bf823bf1a85eb1983ff5a97ce0dc976738f6f4cd88f30ea0808d1d50db054cdc70b6526d41cbaf71360628ddaf8d8957ba2013fca28b18cf380ffaa0dce17348df5cb815b8acb8bcebfe045f31919fec8b3b4d181b6fb610a87b1841c448e40035faf5eb4041bfa0d480e96634200afd485becfb74e80408887a4cbfc6f920958b36fa6d1d6cce8b30043fe790eb2abfefc1c101bf4d1d1052104209b757b66155f1e92af1a62d580a15260d2c848e0d7315dbd7f28223b34809f8bb0063077e9bd6f2e9d9fca13d0dd02c64c307fb8abd3d8d9dae6ed7df7968d82c62cd76f10d0e0e16390661c416f435ea6d3fad31c0e5d21fe9b2316d5100558b2cb3965d708d80e519afbe4bfc4a658660e9a78c32339531b0290f5f305c243896062749799f6417a4207f3c761efacadd1e63bdfc7dc2aefd784ec1a2ec19b581acb9211f7453eea6c6e7ab37894081e488f1d6f52119999adf1ba79251653c7197830281ee90b03ee23eb0d60df3416ba5399c4b3eac79d21effbf3bb2468ab35eb704af0b509afa96c3787037d4f52a1d9045b7b53101642b217296e2aba57f54f6ea011e3882ed56283188e421a9bce39ef0875f53a3973b949baa4af7f9d6446a62cd23179d0a74288e0fb94223ba7b0c31556d93c9c3a08c21e01ae3508651b772d5a7bb3a557f03778ef23c1a68736f4a0e795a32192106f06a1692e3725172ec692ec184440b8aea87416d99d93c67d0d19e2be9421ed7cc8c1af902d1bc0483419061f67e54fa06750d983ab3e66d7e47a87a28c7cca141820a9b49cb2e7ac1559e2623dcbeb8e0a208964b563a7b9e3058a1ea01e685f7bf05b4e4215e6ee6021c3fe8e78336a6871b04b9b3b32b0d0bde7f38abb07ea82dccf8ec931378515a57af523c6723b48d1afbc1c6a3834530bea3c7cea9276bbecb262fa3a4eb35069f2fe4931b5e1432434172a0eec4d31df0152ce58964ba1d06a1a496b40b12ae6bba8158ea7f544b5db3225852647c62e4a80cfc597f0dc07c08a80f8b0f33b9bb31060b9ea484c25d513e9974408ea8235e2e952495b28348c9ef5075e8a0ea5d46cb3ab9a536deb0e055bc08839edbbb928d95155972c8a609295fecb97b884b70c4f710f49ac9025a31ec13364a5bdf5b16a3ac687cdf5e6dee361a20d0754d6c13e2c48eac9002817e811e273e36ff48e4e79205396d1eebea8feb51b4fdfbf159226dfb694b70bbbba12df1a7df00bc96ffdbb491cc8178628689536ab1cfbaeba19fe9853fc8c09d67654a92e195c69e67a45a2602340d1a493af414e9a2476cf08c349821c8acf96dc2ac8991283b04caf258706991625b53569800a0f161d403edafa09fe0345d58b9a68cd780552fbad691884c1018c3b63590e36162f2d0340b79f1a3a142084f001632f41965713eec36c45eb314bb031eb9f46af2d1b131293ac7a977aad589e420af844d3f4edf1c2786d2af74cf89281cacf4d74c110c8c80f7306625b296c8aa63a4fa2a35ca748ad18a10e80e1f814878dc754d4c534217e4aa8474402223c7a2304b3441ecac4bc2c809413966eb4b27221598b0f03fbd13534df43c8ad13d1f0be389bafd680312a7b84c412b05de4114ecf37cf1730dd3dd27cc23792302e8902095e455080862a9d67627e66a3470c757fce93bba28d089e64c3faa4a1e9304820f0fd07c3ec4f5b7d25f5326327a86a6c8ddb3d6be2373aef4021275bf11440ded66f04837068304f3364badf7185c8def93c09f0f835cf86dc8b7e873440fac732adfa405bb7faf09c02bcbabab92a26b2a55d1ee418a49b45d4adc69055f6a7918bb4797ea3a519b3b37bd49862073eff268de6d3dab5dd5879e51a9823b12cb6efb6a20963e611e61983213f5f9709cf310939526ce4d0d41191343c913221b92d9d5b4f6b634cf6dd1301a86143eeeaca8470c5d908e55166c99cc0b1093ec892699974d98ac119cf019df53dfafb9e9157f5427ef9e2b600bf19cddc50bf9e3fa13c30aa864485de7cf9c609d34acb67c611c0bc1d66d7bfe83eab091e252b6e8711abdf13cdbf7e810e04da350420d32a410310d891d6a61fe053970a39dd8ac0e575a1e2fd6588f8fc20fc802b867eac5168809e6f4acbcb84f52c541a9c65b0ce3aa781ea916b3bb7f60616d1eda0c6c6ff330b0c88ebba1ba97eeaaf8d31574dc1162bcea3e5eb13c8099810baf54731660ab15cc63e63a537deccd4dbca242561804c80386c7141f737da06de2ecbb6be821f3b06b4702ddf84125ca2120c6ad3b964f01f56107e05bc16a3368ac8f6860511263ca3c48f9ddd53c01ece16f91ca8d0da4e1f900f2df0909e4772547325219ad7c9d6ba7576a0f9c2396d8fb6d6d24b982db1ab8bb3e2b34ecc2367c81888839466c4a68155eca218c2769ca880314730db20308b30a32d4efd33ca539e88a429b47069774a502112115299d025e47fb61f9309e312d4923d22260c5c2be6237812d52535c8dad94887153c7e33458f7de0f0d2cbcea14f286ab12128ec879237e8643ae8bad5cf2187fc79fe33dc45c6c32e8441e7d0f08daa2a05b5f7ffea1f0c78ed714cfb9c4b4fbf0fdddbf05a206a1ebdf8814c0330a4cbac821166882a1244850081acae5ef8ef3b37dc0d43ef2a50f4dcaf562facefe4c2cd2381b6073a75eb4a7acde2132ae518c3cd581d8795f0a8a283ae03e6c50cb3bb2d9694b4150148205cd7ddc574759ae57c8611d04db5200ebc46257214208bc1847cc52256aff1d833a3370592843966eb9c1cccbebad9169054994b849e45577676ddefd2f26426a7c11c42b9db528adcf7de78a2e2116f81a231d224a18061758d7783d5519876649b2eeb1fda4543b89433eb34e3a1258475a7e6783ab99186469ab1d3e32f4caeeb0230204755a766f4ead2d66ad74ae68964abe570cab1371e14ecf35bcaf6fd6b440f349980ea6a8a61a3f00e51c83874bd2b502a9c4a62987b4d2cb5f0508b14ec46a5330cef38976422a33bd2dd4fcd45121fabff4669d3c9f2a1313d33c9afdd8b35455121ee83c042c403d532a1b6abd35a9f41b9c0c841625622636786f3d709a4cb835ce9c65eb503d332286dcb221e13153c25531e9a98c325e94dc60264f10e02dad02213d764a716e9afb8ad5c28a8257cab5e5bf51e81dda98ca09e479cdfbab984edf01b7b3568421a2469f0614b0e6ff8ff6d7453142d4e86fe009cd7e4e80c3ee8eb82bd0987999ed0b4f2fc4e146d7008d0b6a6d9579ba71f0375bcdcc47313262aaebd9ece4ff841a84603646b9d81a010ed98da5069407e690d57fe14b6223c48becb5c71737004bd5ecc2033e0b8ce43cdb00f3d3d8996c8cf9ccf6b7733f64fcaa2a30628f82e11b617c34e07e3b2941ae3677012b4a628c71bd582c073e8fbbe2fdd2bccc6d0cf8c956f4f993d6f58dfbc333b91511618a7040f2767b0fb75834229f6c9c3622fad42fcab0ad29beb9891910a4b1799bf7969bf5a31b105562a5d864a33c288072af54a3c0c1ec6cf8b391f51c47a5e4e3a02e19464a41063627a96ef51f0b118d9fdc46982bdb2ce1f8a05a7c55e7bfe9bbfde31feb8df919751ab4ce121a0edf355225d90412ffce09d33fae23d04b05f8b713eeb81074feeb75efafc96a4db2cae506549e4c364e9cc8c606b0f6deef1f0949f0595914c74a344e9e6cb495609ed6d5998c188a06783df3194963f02a1b2ff3fb380a5e740c14520098565e0a147fd5160f7a252d96d5531f896984b1fc3cfeb1ff7966ddaa1fe934ca583e045002e124b0e2f9165cab4e1423a2e4564a5b6e33eeaeff0acbf8cdb0614ee4a21ff3f64202e8a35e397a75aac32ef440beb302f8559d3ba5cbede4ec13432c9da1f79d07ecff9bdff1dfdf95c83609c2cfa5c1cb11549f387bdedc0c686f2e8d7e6a694857ceb8f5b8b5c4736914c0197c25d1dce374d99d43911649a222ed07b12ba6a640b39258b3f72547f013f3e78323e26ba1ad044a30aa82574cd87ba71f00b332ac2d84c926b7e1c4357d2d2b744df8584bdb571c7c8744a0f241b1a15c4b325729a7eb6d9658bfcf640e2395380906819bd45ee1f82c7dff37b9c7fa50d4ae3d1ffa6bea7add00b3bcdc7d39d336fb59c06c98359dfea566e5c21a94211444f399eedfd81013ef9c662909611962f924adf0b00dcc2f3d7691cd9be3c4ce0298ceb41ee440b82ea1a5c64fc0bea05adb32d170d37087ad5b45b8a19cc4103b064d80099ba6c1e726ac9c9e622ba344112a7dd56737508b69971e4b14162fa6021f5c20d98fa001682eda72bd69a87a10c1c46f9072fbc5c0cb55c5ca857c74829e5c6a4503a58f5a48d668f8b2e20dfe80223461592c8410c696db9f72fbf4245e1c19354c4569395e8660346bf98123ea9582e3a17bf8254a3cea1bc9ffd1ed6eafb68ac7b587d3158df4d30ebdc665f98d0c6b475ec28905088eabd865cbaa60bb8e8e016428e7f235067f87e1cda54f1f3b5e464fe313411f9b7bea82ed39cecb55e0c0bd8fba286eca360931577074226b02ee207627813c7b4358470407b8b8e46ca566777c0a58e4ddedc9224063b1f26b84c00a4a8d673ad402151a215af30ec6055fd9149dc78110946d6c109758a7e68650fcb87a1e123416ed1fc9492a0d7e7a294a170293b2a05590eeaa096c6c2b54bb8d7c428b11747ac5df281c0cbc96d152640cf1043384fcacf53f7c9a5652eba4748118e0bd60a06725738b451df27a00c0dc6662ada018d22895df1f657bbb3e346434e38ab4a158974d6f26ae0f25eda1eeccbd7b3791e6806258e2c2e692007606b4375dd77a026acb2de3ed62d149adf627b55c85ae586a40e4fe502e4ccae878aaff2a81b9ec0b6ea6f03885e373198c29b3902bef8df5eee36454692190152d020065354c17978b8d36f679ad279f4bcaa464f8452ae8b7d52d767d0f5adde11cbc06a683fbe06a66a186d700477670bbc105dfa0e622aaa962e548eb348abc72b110b62c190b96d5db6ac2b3ef2b0381a20b581615b1cb62b03f6fc85155254297b15f3ad0790d8716bd88ec9c16458aa340e80759f265f65c1e87df7f5dd4541281e95b5a323a4cbd60d8d2e2bd5b77ae165100096561247e578f5032b5b458b0ed7818e90520783889ca0cf70c72e4c7fb6dcef987e561b12e5ef981cb76fab25d4c44737bc4cc91dc9f6cf525b40025e04e29fb646f7582db1b2983f7f3757ef2a66f115cf47331b8432e8e4faf0c06f4d640841aad95e2c4a140ceaeaefec3e56018ae84354d8ad512ae4b8f48c57976e277acbee7cda35961034bd817829f29e800e11d531fa2c11ac93bca29c834b6d3d6a5a1c31c627241927b6d4904cb1cb1cb00a5b77e04d9c65a3c0d05e73f043bc6b061f95995b589d137444b774ca74304aeef9ee0366c270a6e3926b2c50d40c6636344f42792d4b6e1e0275f1841cdb7dabb1afe496a6bf49a32cc0525637b4af302e55c1a995cb864f41d7083f063750208a5d6cbcb2d189a41069e3d6a2f0be48ba941268cace90bf99404854a2f90af5d39b603ba9b1951c3e2a0265889ba1048ac084afa2b277ed0b8fd0ddb63cd99add15c5681dfaf97609a5b3399605c2339d5936218b81d8f4e94252e59b7ddb09f5c0cf7c0a4bfc19a1ded5e481984daf8d5b62a51a089b6cf4473b4378c77fac149e0f5f8c79bdf621a606b71f5fbdc0c20e773c02378c758f4efb838ace1834ea2599e701af44a633eecab01f2654e904edcd6d4b4f5008977daaaa502692b79c702d17db2f299310c5ab7c468229b54c3935d7f622fe56082ea36e01be9bba40032b2adf5c6ccc732e37e346e5edd35903f4d12d7069065b5edec8c919dbfeda36396561dbf5b880daeccfda1a87c51dd7be4cdd40a20e9a695ec0faa2ba3233fe9484d611355ae3b3a7153fbfc671a9638523d047fbaeec3fddd06315146502d5ccdcbc6ad9576d80247b18ef2977ec9e853d18317ccd71a7ff20f67901a5f175a26e602982908d7570d01711139c569e38097e25feaac66883f1f3ca98b1896ffa8ae2ad6d848205a75314cd45365842d6c6c32606362a095915aaff1661a1f2b1c5dd49adf331a7ff10170e60971b45b84ab9eeb5d9f3ef814874bbd28441ed3042d58de44495fa01437c8dc97d398b1590e86c8d1523a00699e1b9bb1e2f3065d7fe17bc7ec1abe1617a72ba05b5f0e0defec93aff3268ee5f4c6f7f167f0b262c9ac24b21731aa33bab271fe64e22a4be47646b42e70e41b875850de1bf85f6c828ca13ce00131460e2e5282675a23251105d037f72095e9d585be4d3c102087f56ce7fcbd75412ec5f0a5d8e06c1db6f1beec494d244464adc7b6e22009da224a1c9395b99f1724d97a8484308f1c2e17acef671d8443d5431cea26fad701e35fac50cc712e294c78eb5b7c202f5b489f43fdf5f5e263694f5c0d2c1db6dd9d88d907805f514f8ac2ca7060e46fdb27a473f87301c6d0b558eee8761c366f3aaa9a19b7ab7114e90a1314ed928b2e8d051e5547e1b9ad384cb8d455b6c767eebaad1dfbb155f4da8d2bb8cfa8de05340b16c2a9b4c3534b9d2f9744ea9e0066dbcb5f629ac72566b48943df22dbc88523501d2096b89bc55a8625f24683b8652d81f6831258c162ec8518295121dbbc222b75baa0d3c6ac8cc7b52788f916b5c4f5d12b2f9cc8f7051db8867813db0ecb7a8db2e686c56051c61d3230c77c8b86a7bc62539726eaf879e17b840c9fc406d221625bf06f4b6f4ff233a957bf6895d5482a0e050f30531ac912ed148cc1d92a4a744f668a24caf94fc48439312a210df0386c94c190d48c55463854c5857a7814cc71547a812fc450b70a8b7a895a3b9d950a050156aa93a94d51374783140c49cbbfedb9413e495580b8948b04c60158227eaac3bb22990c58351a40000a13112f80e4c2acd6f4046d719b0b5f1f1607ae2350e283a3b7b8b65bb07df73b7a73e6388c8c581120b006d8793ba34bc981373fbcdbf7faa872176b21e10cf35c06d871578b96023f3a5b47abc16f5ef92d993700f2aa447819c72b2a9800dbd90ee76bcc2cd5281546a0c95a39e0c3d7f7531ecfe139282a3bba3dc199504f84d14bfa94a1221c968590c2fa8908b3c9f93ef8cd97f786bfa048dea4d096cfbf249d8a9801cf95aea4ac5498645b34622fabbcf78e1731687f91f1e748757185c4b5935ac63107fc51eb7089b53aea5a017cb98e903eee0eb636c97fe56c4e760057d2bc0157c98b66d2a876dcf1230d7f3b9ef2383cd1a0d8b60d235dd778b4182326bf6a27bd0131b737faf7d92b50a9fa30ef770f147f590e8167c70ca825379b9ca76502ccc4056ee99046de4f3a6cb4d7a96756efc1161d2684fc69ad94394fd34ff612df4dc96b4b99f8950c91c619baa2893e36e91c13f69a95410ca6d028fe12fcbbe416900039a2534c28cdecdf4c2ae10cfc556442cf062389f8470aca409916fc394dacb99a2826833f7362a204149ec0b02eb0c3983f04167aeeae546ab05f7b05a85d5267b4bd715791f484c9fa07c7bb69cf8a4331a6461b06d42d740cb0906254aab662ff35cceb50ec9cfb69c56270d10f44d468139a0a427e10550c219c0a6bf616a8e8295bc7a5f5478c7c481322a08d1625f005adaca1f1e2002ce5b83b73684457d743520ee4ec95bb151983db00f7b4976b3596dd9fc4d3d13f69b0e24c87ce0def8936969f617d36300124fbf139c9cef37052ff3847c07d88802f7b5cc36182b1cbb932a4066ed379d3959eede0e48cedc7e8b1bf71635f41cc2c7f09847ae9fa3f3e788b9aaf523aec9fcd989b1b3e7ec97ffdd7fb1c76087c822e72c6c818c6ba895367e612d51c093294951abc7c5b48001b83bb4e534ad8cfc5d6ecbe7cf07ef2418cbc70f6d569b5f348fa48a63889e5ee72107d6b21e172b50f67e2b8181186a0de6b4ffba2075f1a426d17f7675d1cbd18fb6021f4bbcc4328d3df43aace037624a5c0e42c2a453ac1194ca90ff5448cc8ba9696ad0f3fb88db6989af359e6ee560fbb5c3e0e1515ab985db769d60dd6f53540bd0398bfa2d205cd1e9491df33b45912e7bf7c5b6c46555e267a8bdc4300b1850f0ea0a73615c41702bd36764c2b3771614e243b347b11fc4e65b76d0e32a2c526e54b5e4b71d8893e6e5b6a0c57d17f7fe4dc0b4ce4c82c1d7b33f523f1bd2bf40a22443fe26186f9a68cbdad22c8f7a1bfadee8c400782b1fea8b138c1780bfb48486ac5b2cba4908a660919dca5987871267cb000829b858456ecaf9793f7605067ed58a83eca66912546db041656ffbf45a7da4eb861c31adddd08ec8ccfc1abcf0ef487156fb784efcbe6575a5decbf7c4ec2d1011f97dc171b2d975cdf30ad0376e74a6576c90c12fee4b612bf748e5c51e7eb3ef566e19d2f4929ff51d2a93ea7a42c21fcc101c96e82a41ee29c7f8c7dc74d9d4d1e624dcc83decfd5103f4dcfdaf1c9520e7d4bf16a80e0959218a1ce43e66a71b9faa453310e5dba750bacceeead8622a6d23c4c1b7ba21a77da1a9a146e4f9fd329a1219102c0b226bcc43513e01032ce7f934ddfb7b8f9fbae354b55702891cff0397dfb65e2968205daeb2f1c6be380f83cddfc3a04b611d101ecbe028a66de4a18ed1bc0a69ef8b1fbb9b023591f06149eeab73da90ff154a612b65d8633968f25d0688d1dcaa8c460d23c472c1966552232fa1f85ef8a66e2e4028a14d048532ee4c6dbe1c2ceebbd72bef8665c8139d6b19cb0e6b95202144463dc0aa39d59000f044a1c0c54d5885e591efe3fda0e35b29fadb84f5eba516e58b17f7c6ca7ae26242af7e30725e98382afcad6f0af5b85ab5ff01eb22980a248192938e9f1de22dc87f182efd308383827cfd3cccf450d3d78bd69986397004675f2ea4d38e206cfdb4a1bbfa94baff9c836583df7c50ce878205d8a0e86e85a81509d4d544365af7fde1579459e48132e548c2c8c33cd0b26efc66b98ddc5a433b397c618a5f3314ceba6dc863b1e99c2238822d1263d90b60a948fb5d2ad0bcf554f11185e08fa21c9c0d5928d34f86401b3e468fe3594a21f7635f836a0f426cf1aa856f63504aad503d0051821fd805dd4753786effefb0fd5af80c5a8fd8fe3b9bad1792b1bd92722af4ed18828827ae45194f045f385c5ff6367f619dd691617136cc04735f6c57f545713e49915c37c5489c09ea0186c585a2ee756f7338f91d98c5064630dad46cf495184a04e032987b8d62383d126ffff6f7ee8e8f6083e9c686ee0e68b2bf32335cd1254b50d75385d5246494fd64ee267a7789b00605125a974239ec723a00d172218b777f4bd39edaa1d6665dd5852d218eb44c82e2ecce545a8748fdd39aa7d4f64e3c7a8799e72905ddcaa9d596ca13bcf738abdfd57740cbb2ce092ee83e6af7e8559aba513532f3cf86f6ed5339c8754468e1607b17ff2ee058ee640d499aecac865b77337eae40780ea2e8d5596c8fbd9d0613b883298b5b8ea187c7d01d33196fc100f7f461d9c4ac75a618c15de0be5fde9ab0a335db7ff68e00cd49aa6be5f9926f5358c8eb24ca38682ba2d7de59430798575151b90ab291f36d8d7e12cafca2cd7cd02e44b1a9987e3da6f6ac3af2c9321e4b44eabfe06484faca52e0c287a487abb48b9d164f45ccc07a56413fd0deba69382a631623f2ff6cf463edabf424b7b8cfecd0d7b170c69cd3da036bb449b9a6c94253dd89e7635afca8e89eaab4d0642f640ca330766481bc58daf251761d4da80d741949e2b227b6a622aacc0f5db3e28e33a8dcf3542811a4e611b03a976ed631a76c20e74ffa8b1ae03c2987c818d8930158288ce85128dd5a9b2d2ef806a72280d2edbf070cf09540bebc95bb719dceb11bc4db31c8fb6c316003bf2428db14d0ef01615e34edbc4661d609447aba2dccb0128e287460f626428ec320851e1900ccfb28a73117fd7d47810358a939ce932e454fff38d2996117c195877cb089cd25fb179763910b13f21c03fec73c981b07b43b69ab46bbca60858cb5c71266ac890b26892a7dbe6794ebeb22ab67c0d897fe36062e15ae566df2237692f6a7bf5d249bb7e7a112a43d594e1c8a4fe834a3489644379d1642fadff89f4c575a6c88a7b39d5c70ebdeb289b909b9c49fc0dee3f8da9882680f259a50c3fac6d60ad58af51a18495c995fc50f9dade0af0c3ed65d958ef4ab07b54714e3a903d30d97027ea17693653bdd5f0db85d576d7e97452d0c3d6904f34aea11b10f0b0fb69f72a875fba32c96c51142d273f143ada87d0c8a723036b8f9d52baf50345e4f60010c1ea235c969ac56c44065cd5d857b45e83b9f522a00d562a684af84814568d1f29fc8f40d5aa929fb0013e38dccf114e4ca35dd645bc97bba343c741457e5e23aead2acf2b3f8d627c6d903c14df20aca377395622ff2ca04c99bf9419d07f1c497ccdfc654d12c4a618ff986e6ebddfacb6c28ff49d4b7af269204058ccbf2df5e8a6b89220fb387915bb12ca4dd1788689a210051a370f9218acbcd81b388a5259bce8e20ec5882e3c440a04dafaf84c42c94c746c2005293259a4d12e04f9f17a2225194058070344451bc1f3310d09cbb25da02f5734e281994909c311e90a6786230bf2e55c697828756877124dbaa86fd8ef307f34e853634834fb6ddef27adcfd414112051074fc8908cc17237073ab387c1cd93f5a76c24ace5f4916666d93912491c5586bf697801101e96d81e1429229298e485cd59fd1a5d26c2fbed2e1bb6cc8848ddeb48b573a7f000d8be62fd90962672cd48fa4e4e7fce1990754a84ab47f3bf8e55fb0540fac7b209e542fe030c4826b0f8ca5c2bf154b3401958fbd7a0ad495aed6daa727dd22644d3184d2a01328d7248cd4beee937dc5a94c317108c5f8999fa520534d2fc2cf231472fa1b875c64dc3f7107f4e1a8772fde72f4337f503a7b3675c0841f711e2d8997de9c6cf58b4ae7cae8153162c8d3d4b828218c8d4917589ae0f2c9dde7766d24c0f566b499068dc820317df7a418f687881eca3360fcaa500c7fa8985c9f0eb286049888ff01a735b9c027ef7d8dd629d207268434c68ab7f71798591b48fb2833122d214886fa461c09179b4220ef5944561b600bac88e46d9e56e69bd20bce42504b9d5a1d26edc98817dfe4115cdd88e84a0a6d582ff16178a28e709ee791fd84a1d6ff3e83f768ed705501fa8141ca3e8022e4b75f83a0a84be683366f371169171661d0e3257a1adbc85b410c60ebfa0523a189d581c00e6c8813844c0eee977b6b06b71924029c8f8f8bb3e113d5263490472b49baa96bf6cdb4f406ffd08c5287fb2f80a9c9b67427d7180a5d91825b4f7c00cc4780a54547358f815a61b854702a227b49490f479250f4649b62649b656dbe17bc78cb5b59a54d1a14c053e508ad1a8001fa6051cb995aa69a62fef270ae7d72bfaa613aadb740e53ac91755ec5312bb9fff10aceb738318bd6b5ef39e669dee9bc7b98c9a5ace6d6f994688021b4e26e181ea1f7feafc36e050cf30ac139e6e7e164b053a7c3604863b6444859fd1a0329243b63b7819b6095de5f792973c5dd141ff31529d50eddecb5f9203733bc542e82c74c5c35fa9172b3687e9605c3d91a24a4038981d61a96c324068e41ae68eb8659787e1e4cbfcea8ea18d2e54bd647a4f8f43650f873f0244e4775d7914bd4f62aede54273231758cf5e2c46fb2dc7a77c962cbd523fcf5c4fb06a9fb46e7ab5130496ccf6ea2fac7ef99590c1e00d8dca80c3414bb075d9b26e22c07aabf0c2f027503e81fb328aeafb6f66a1d6d38d12e02bcaac7fd648f28a2bbe6e418b2f824d7b0e37566c501eecddf337b974ad9a6e8a330b00a0908d22cc2ce4a77f69a0f4d3fa9d02d4b9e76b919a7eb927af8ce858dab0d7882ce83d9dcc672776bccf44826e3b0cd4696899d4c0642339f1bc2d174512b99561dde96ca6d8850b9ca252fa580cd2b70251629751f3b38821b87106e204401e12b1a702039286ca243ae0e1aa445ac31feca4495307c2181034deac90dbb5641f1c513fc2f5a4b9a7aa33f62ae156cd9171ee54ed813e3ca6921d9e221a2fe9547cd1b0716f02141e6504c8d76becff18ca1dd5a16b96384c42597bf2ef406e138de7e7500f18bf96657c68e17036110f11ebd4ac450a6f2f326bc2343981198acf1eea0193116676ea6d4eb05455eadeee6800c8191acf43d23ab08e6340d7d8340fefe3747655557a1850dd911d5c5151f526c4407de2a26c9675ec34af1c210fb5afe095d4b0dafab8e42e955577a6b021e712a3cbbb8c601890951b98461f09b9bbcee23491aa4c3bc3212d20a45392b7061f4bbe7aa441a01fd39d845e93c83e2a0b7f4a2942863460993684bd4bbb69e0eb3f58d39e6b8c2216e016a0451205ed728b4ee887b4c98acb976579cc035ef624a87bf5dcfb020748442887e7287c6034b4726c4802aa8978c72910ac13f6b0b94c36520bebb2d01f1309abf5a197a81596ccda4ba70305c45ad610f1a2a26da880f4c442c83fb80056f0cc022832b3ed860be026c57bd17be5505aa5170061eeb6f20a205d8bc268493e31658fed9b94700bdcdc5575335ee3187bc2a4f0cc64f2b34aa84a96733ce0a2c97b00c0e6e7ba9208350116ce894b1372c90eb22fa85534742e9dcba79be12444e7ee5019270164b3c6c7aa980e210ab192ea0bf839247526750523d5d2eb5d65a1f45ed6a00fcb79174ca999b482b39cfc26d1bb6b6a2f975649ac09d9ac6ca3c70f3c9f031ce5d5275916bb06dd5a4b3a47eb17720050d3b425fede18d1227669e164e5fe244c5e91f3ed590d259fa8f92ab239f6be6c79c6a4d12c3ad8cc869daca64d602c1c8a84fbbba0eeb64c5149dc2bef21530bf871902f74217ed3cd018ea22eee2df188e3747f13210d42d42890650e06487d167af3036b4d0a40be55c6f54cb8d8a0d967c5bdf0eb60b3e7a68fd15c7ff2b733c331e87a17cfaf83f1447e99511fc19ec320e0fb86d50a452bd762537b904bd6e4138df76c1845905bd2027a8b015ae632032d7b1108503617c640bf0fcf06badc7c2e307c65e3133b6072244a36fcd660fc59c1dbf29354de486c8a7c75b632200aab00683528a698e770229a4f2a2c483cdfd9f41d1aabd02246c6b730b5faae820fd3a0853feca9ffa182531e8681c0bf6f9733e15d29a23825d28d61f51ca6b62b8f1db640d6760085a41c60d6ac3353c19376e8724b5483e791325f7612f8d8db5afc2e2732a6d16d72ee645e37ae62f9df6d1f60630d8d2bb42c7b779cf8f45c813f007fd2cc30c9c6b7adf4eccfcd17a5bfdea5dce16388be0b791f61b8eb3e35dd389f4ce7ede23ff3a88bbe2042258791ec7cf632e192c722d2950856e68f4e4a9fc40b2d450b85a98e264119161840c2bd6000cdefb36ba9cae387cf0f1f9176202a0bf833a5e4cd642042e934323e5643cbf1cd8071842dfa012b14bd7e39eb3f12a088ce42637a94bf8d3c425d51ca21959073ad93e8075fcfe604f682e626e7f6dcc60ec0543d2fb4953754c9a78da5dbac19cd877b7890d270078bc9efde4ee8c090a1b25abd579dc4690c24a8868c1e769524b0229d75fbb10779325685ae13d99ab930cc2df3dd97296885d21e2b7e8d4b916c0a40a263345140bf19d7ce7b92a41bb716276add5c6d4b89634da3c9c15646e095b613e024cdd9b83d9173b419504c9e59b606b5caeb76631587197eeaa258f41fc4039ad0022e4623477b11daea70f13bcc1fe69a3e1f259a6c5cf63dd300a331972400bc29fff7e4765e0cead72c934db4dfc51329b8c3b83fbfd62f88807ae340ed41e5173f40a3abfdf359f570fff4a412154904a1f66857916b06f4c2a6714f5db3ec33e2f7d382c4a8751b54bdf67c952bac57c1228bf2de551d0f8fd4978de6019856fde6b30e9f2acd6d9f5bbf5b12161e1f3c6335f0ada710c850ef553a8aa78377e8f55b92a222ec2aebf59aa8fdc1376318070ae208d15eb01ddd5e84d98847cf82ede2f906f5e076b71d08471c8330e6fa85d6b68f1c347d5c01578b0294d6f9bea83904f00f2902ba708634e6db1c7016c40453cc357bc08ceed1fc6491db80fcf3030c273fb305430910b35f3dfb0000a6bf03f526d7fed690b7774b1a21093e83b7e5ed120d5dc2072ccfa57109482c16acbe8e8c2fa3e93adb649c55d14030f9a0c88ebe899c23ef0bc3c5193b800daa91107656b6cb3d399c4b26aff317e2be07ab5b8ca138cd47d2b1f128693384e46b1b7eeeabda81c51e5f6c90440d24702ae381f73d7d4ae187543898153577aa442dda5b703144aa77e720ccf157ef6ca62f14b48cf66adf91cf674cc8e52db3da479451b5746bfbc27e94e86ec58555cfcf44e121de3ad2a9899151afa20c21a147e6fce6764668ca379d614a0cf4ed823b6bd51fce23125e8b7ddc2090799df69fbca0b32e486d466270e7c27d1a5c14731eada44058f02e2af97066ec63c6a42454a091b083624f763e0110ac444b35f810351e3c959b904f42def014728c7902a9e93fa1360a1cf513c1deccbe5913811cf9104d0a97487fb2aa4a60b9d9978ab1b73e6f7754383fdc1b3632cdab385ed8f10f55ea0fa0384f5e4e4491799ebd399d3b1691b879fc115d134ddc4b6641d2fdb0df278513686391f18e368be875d3bfe0b85b312426127dcda4c330022eb7f3bae9030ec98cfc350442a080b5adef18fc61874bc4210b32ca4669bf5a14a64bb7361bb0981cc93b05a3e935db679de2324936484b832986ac014fca2d73d7ab0b5bcd299f9ae617dda7cd3217b7dc16d12e9984f9dab736d9efaf14316ff8b029b3a5537fffc9327dc30a5a09e18d28faef80df67d56b86e4a818c5d54b2afa322d399a6c44ddf8df327b19ed8a6088fd840aadeb75fa9d2354a10a8e6497e8500dbac1120f7ecda994af63da3040eca226f4efba531c674b8a4b96bfb486dcd442b686a2eae629bc424705e2e24b8490975865426a6e0a819abb8108eca2cad46650d6a330f74229aaf1695cdff375a723c86c6fb9b3fb10f81698f0371ff3e62ab8a32b0e36e056897435fc3e5cf7d313a66f71791458484b1db5ee0b48af2e87e5781572b8791a8e2541d4e0b4258291f09b3099587d59ab7af920d4d3652c971548ca25ca491ef073f764019382d026b1ec2d01ec0e06f0ec072188ac19928105f4a72e457c424a82397769ee3b2e9eeffd4d63150575e01c710efc970a5701d8e86388fe5b397b7a0639c1c4a30ec3a204578e5e995120ba467755ff0ca3d03e8dd3de649225ec8ce2a2dba9ca08fda8d876a50ae5ddf79bdd83a44e0e49041645dd13be93bdbbc590a5a9f022d47da530215f3ec1927b1251fee0ca1b00d57e39097746a8d1691f8d7d197949a6fd6be9107c0a7f5978f6df545043c850546d3e5444dac1b96bd5019245c23236c0640b5390fc7a5e3a9ce1b37b964dbce24b412097426d0c376063255597d9b23af36e4907c9e65356e73d12da137d8de31f726f2c5cb116db2dd67a8f11e2da327258ed1a1d8a1a804e20901caf87cfa9afa955efbe3e3cbf74e4320dd03ec6451929cc2610f77527d43dc4b6de0005083c3280ffdc5f6a3d8046ff712cd53ec583428706943241ed4ab337277458cc105efcac390128e7b6ca697cbf4a8df9d2f2247af9245beedc7d8e254e34b14d63e9d45ed34ff4117a082101ce92ff20ab731fa78019b9b14362c9c50ac69148c7d91f559121338fd47d869f7fcca76c39895cc1273517f55b06aede142bbf39628fbb82ca72cb660e335a756c352bb63938efca412488134796cfaae6488bc0484f56977d130907c5172f7a390519cd7084ca26d56232ce050622e400956e8e6c72df5041fe05224223994abb4baa590f0f93440a859bb0d0cac2caf7493810a0bd896bf604699aabc61816b56540d85fd53c7535ac1782a774c62c0b04c332a201e8058971db4630579846f8f1c1076d0314190e20820de76211c807e53bc0e4c53d14a617c6b41f673efd6ea0d20b37e1298c274c5acff1b8315ffdc063cbe6369a92955fd346d8031816d7d010b4797f0b3e2ef93cecf8f947c982c6be13364a86000d4a9a6b037d4f737b39b2148c6a0ff6cbbb10d941664fd2c4c595aedd9450d2b42a4b72e97bd176905b84ddc96aff99a95066e0cdaacf208c1f858011a0354e95f400a3d953306ea2d3c37b123653f35e6963132caa185ae3abce076f6680abced140fceeb5b01ff7ed39b18abf3af86e9ef28ff8d21147ac4616935ce36256f633587d462bc4c3068ac668611917d9b83e7cf728ff74525ad559ae819f73ab2a48fbb3401bed1d0ff51b9aa068f37e028a6a666bddfc60eed03e8a0f2ddc20ac80525333f08ec32472da0fd387ff12814ef22806ddc50217c1153b3b74da0f96300cf8007e5cdb4c2ccb46aeb1b118f99ebd9a36424f1c99fb71dad2a7c065343eedd8ea57a10842c97ab58af2d9647da1060758f9a3c8c9a35b2659d6e41d6c87e796f0f26cc32701c90890f60fc85d8eb734e60b552be4e85931c9fc2eafd162ead9a92a4fd50267f0eb6850e4617126beb9eb91bf01822b7687c896ad9c57e3044dcacf6bc27da3ec694c01296b8265a05addda121d36773fd3c26ef8cb5d392e1c0dacbad99f67c355efdc65a377a8c90c37dc3813886530d6ad3208d2a7a753ba45e3cfa50e7922232c131c755ae7590541382f1a8a2bf0f5a55da93fdf78b80e8b997f1db6648fe1e06104ee3bab3535a672011771df1dcf4f0dbccac97011c48ec192780bb06681ee7ceb805c46b336e6e63cb55331dd443863a6d833d4107e109d68a774df0543f1985973c3b449f2d4f52a7dedc3079d9f33751a99a939a8290f9b89c6c59b8bf4f321a9ed6890a15511635183907012f329c7b8b20f7348b2827774564c000fb05cca4c73a9a06177a6ab2d7ede3fc806b5e8b73a86cb3046b30fc6996061126a4fa044b7522da67c04e039ea25dfb13fc856811b3d6dcade088a3a3b8016818b7430ab25ad0bf478746a3448e2223595c51a5e90b2dbd6b2c547bc51d8b47cf57a82e6e7a3b4d9fe3fd16ae881699a8bcaba4b21e5bbc0fc267f9bada53a5c29d9531f8c8e38c757f11038c3630775d17ed6ca5adf9e8f3f6fdf32bb53484e8ad8e16fbed816a15fc688b5ce4b825568154f806349b0f9ee79691a7e339c41959b468411e4e8ecc6577092133815b3be633a48dbf358bb44b1707edb3609e3ed5597e8c0102bb1d0386e7990590181edda4be1a061c013dcddef367635cfa7cd3b5694dc81a77aa25de23c01132555e0ee02e607b3c129a27a6ba737879a171c2d80e5dfc1123d06acc091245bfc637e6160a625e4e3cab6c1e6a9d36df7281c90f3f69882a76ba8b9acb1c62ad7087871d2d40b9998527265c40912a9e4642bdb32509c3418752152acace78fc26c7186a1aeaa381eee5e791397d021496ff4d1a9819e0cd40c5817735ca402fb4a7e009617b141754a4129c7812d364dec8e493ffa25a6031aeced8494b2b6d478a26301403a77aa7f090d6285a12a7eec4590907808a96017405e37cf8db6bd2361163707c9131ba0e6193607864307f21f96d93d50ef460488bf81c60f0b43f4bb8782d9e6d2b6050d6aa782c8212bc00f20ca8226b814d07bd1a1fc5ae9c29a478f9beaa6a529ee4c749f1a82e94496de9e7c4d1688232ca9e43af132d377a429ead90165a0fb7a57d4014905d9741ba826d53542aea96e3957e202a2ba81fcf11babcc6b1b255c7fb5e98bb205c2d9c2942ca64a11da30d03615cb3c954a49b82cb1c93299c4c8d1174bc34462120fd4af318ac13126efa5abfa2ef7f08a9137a8732ba434882a6f36a8ba8d20083b5e8991dfbf72b27cfc84ae421ac3c57b8dc9ae58d0aed0fa17ae47c816dd098cd6224482a0495fe49dc026e13168f7ce6a0c35973361b66267dbd6ec892a45dff7974d58d261b6134ea15b09f4e85b059379365a56b47043d46b33f148359f4c8ddf7f65c2ef6b016472d3cd71831bc50d385d3a4ef6fc9f7e45fb68a1a598fe71232402ecdec673e8e53836ce4bf15ad0eb4de1e9285b9ac11b3871ae381be668e20cc96e125f6ec34694e62f249a911f4a821851e2d76f7ac90a58c1d9abe8c32162be12a5fe53994aa8f71882117001fd4000d18247c405c9efe5583f46ecf9d2628b32ba15b6cc6dcfaaec4fee68f8b9a338660e9c21ef0040f3597621984a8a8b326691008a597c56e05b88d6b71fe3c34a86adef2e903d875616f6e09f074898bf525d52a1816e52ea0d083b7915fc987023bf38099e62803a7ecfa0a5d7acbb2f9ae9b533cd50b1b521d4586ae9d05513374233cfae836ac0362d6064e60e5790181171e91ba8b440803bc006a0d58b0041895352d70888958c3f19c5c7ddef353be260158e869183851bee63e3d97044dd3034573c7dc199db73ba13c3a1c452eb8cc6c62d30d064abdafee0dc78934d184557d8c35590db5fe50b0c68f331abf42fbfffe2caf6117459b72a601882e611ae0f486f467758cc2680469dcadaeeec89ceda14a2dc6d8371b905a81974df1f998c02a4eb35e99234f5d489dc93ec5025fc90306feb8bf23cdc9c47cbbc7e6076923b41e6c184e252a007e2cdceab91fcb5048f03ed5af5de7abb6732110eb1559057dc159ccba614cbd81976bddac88f0473c402a8937f8b89b3b99b8e7abae9917d0c0211c34ab815b2d94e2903638515e4850294ecf895745d0fb5ef762ae14705815bb40f063d9816b34ed3ae48262e16a60d024343525443e580e072ff2b51c0235da226872944b5b41396fe01886c05cb45be8957042fdfab12e76196410d80d7bdab600ed247c4150d4b329ec22c50a0027e87b90973517d0d17c457ed687abc423b9cb0d00d65fec7ae039422b3fe16ef3e2382d2ffe811c5aa7dccca38c0ac94f8ad5efbc59bba94bccfc5e8d811f6f36177e8a1a7d200437bf8d1062342ab4e0b99b8ee98ced37c43e5ed57f10adabe0d11d6999b8fc694f5fde6ebaf295aed82eee618ca63c8d08104ca60937e52c316d3d4d64edb3f24b18edd464600182c8b4e3a69e95ed417318f2bdeeea185320ed8b94fb0b367bc1f73e5a6b4d45b5270701ae1f796b4b013d0437d826a8271f622978f7e3f27c8c5a70dbf3cdf86bc150e82afcd833e3d5d09714797e4949f6d1116295af7c28b43231fe87baa46ab506054f054604ebcd001dc04bcfac52c2e63426597fc6905c8a5a5c0fcad708436be7bd282268025e7629d9a4c01aec8eff1baea183a73f89c5befc39424903c5cac0e3fc1cc5d472d35e0c35fc28ecf90c1eedf552a6cbbad82250688bcbe2fafec354da55ca01072021b20a4f86755262a4ffbe17721abb55018242d3d2d73184d10ebb8b2618e6428a65a6629102933017c496615b77ada36bacdd6202cb175875d2c771304acca65cee694235954240a823b69a164bf1f1a05b57f2758b612669edf530a1520fe11022690a3c31f4984abffdc8a4adf320a57611fbe7314bc747f9a69fb637f1a36dc92d64eef83899cbe370060611471adda80124c40ceb35387939642dc9d8cd50b3e79e39b8544abd3f7b858cd4294228eedd2b84c42cc5d62109de47639aa31eeeb940306158aa6c2508fe48644cd33684482dc8d671b0a4a620e3a35dc536f2b7e7feab9bbcbf0c69b72477e73626bb831ede568363d602ed999a77bd9ff3c4a77c6da1cc3c05eec32b376ce16187ca13f5e21af7b1c2cb5a4b2296c06520e11ba1bd56e480b10d3cf65d19175631a52eca7c49b01cf4f0b63af003a9f7f534b38589832612015feb94ba101d85e244a13129d492bea2680252587da254114ed3adc26ca3d56180bfe47abccdcd85ca8c6d09a302951a1b477d7d97c0f35b22a248626af64730c4c1c233751ca37971dde55b7740b487a1f2299a6f086e4cb75cc0f50ed7a37fbbfe73cae9dda3ef1447d16ea041700a59dffd10180d8e65505f02e4224d4f36af3bb68c3e07fa03ddfb49d9e47116bb12661c790af4c75628388e3a70745f2c0f471eb56e813680c365dd3567cab05f6934915096ffe2814efc926e30848697d4e8dcc4256902d415b33506290d9c8022f3996509b2b32ac5461e910144d3b3ab29b39a5e2d63395ef00e87bd8f429abc57fe9d55e20ec00b689829eec36c000787f60faa4cc76644a587e4da14094d05c3d571e15b7914df111b65f5290c76041a84d186de0756c622b34348f6d49f953bfa49978af4803e0acaeae997157f4897ab4f4f367751fa6dbc84e3981bb64d797a16774e4e35a3a2b2643e447f8e575a652c905cf8e2c4101910d07a5d45f65431cacd9d479e3cd8e57b8c61cc550087bd945f16e087460d16dbef3d445cc5d16bd7932c3639f5fbf4d362735d3ccb7d3503b7aa4a6f843b320014130c05c8c898c912ff097b178400ecb53c562eb675bc440784670030723e8ae7143f99ca8c701df436aafa15aa6023241ee24e6e7e4a09f3a4506326c605a78900f03980500db2a80ccd0d1d98111d98d2d181d5211d58f7d28175990e6c3c1d187b1342d23729a9f535903f5e907de506c16d3423c7c8186d0ed2e6bd1e502879a287d6914ed6dd011646ed9635612df6c083ee74b18fea51111cad4ba68621bd4479f87e3d67dc91269daab599314c0f03d999c43cfb8d3404c20ab7dd1fa06d49cafd0b08969a0e03f55073d924e6894d9dde17bbb2181028cf889fed901d8da7e4c53c2e40aca64087ca9aaa35e25317e232eab465f0f31821b6b4f6534d80407e179f247a4c261f0aeed066957395686b155664d1decaad566e7f2a13b4e935c93fffe245ed99aaeee693b22387f221023bd3ce333be713e7a74fdb327a371e5c1a91a49786061c8a1ba9ad00e2d339bac0b52d5332e146fb538b381309c04c5841d818a59e3c60c53f05aed2174840a549583c55979348064e421b7d129e42f5c51e1981787c5b0134b1faaa2af53dcac94f1e0084e7ea428be456327a5fdadeb7553feff89fcaded8c17acf398816f7f8c8b9b9c259463f8937d6fa2903edcf5c77db91d20f4298c2fe1b344bee6615a843c2a29e852615490e2679aaed336041a4ac481e09536087b0ed2fac283ff17672b250e3f4b786527f1b90e234350b93f9be01f8c60a37656e39cbc568f6eb53d7f1ae37163060d49e597aa2e5fe0454dbe946fb56d1d25ba878fd9db0e2045d08e3c753204671e2fa974a992fd07e2a813cdfdd03d124a588acbfcbf28c7f6ffdc3b8f73d19b33a42985a48fbc7812074aba2c8bd7635119d5b5bf42fe7395cebd6e71dc2898dd432dc172df94476351b7d7d388e8319184937154ea4ca9446ba4bf09f11c31784739b32701413d1ca967d921e8a10c4bcbbd2d162e2fdc0ec34a70ba166b9ea673d0d93a0682ae674b79cbd31622b9981fc573153398b1d7e5dc7903e4ac8c1e686486e54f0cd80c409a9eec5546f5a4e7946f0d00f21b50a82f8607c2d3011e8952e8921c292404caf2a9ea8f7256742d1fc3ed70a9e9fc71cc4655af18ba4ce416a673e316bb495a559199d20171ef5e6b26c48ec49949822f9c2759a3900f4eeaac0c697cae0255f2b437328af74926f8e5a3d769fd1f080681d2233353ade976c74d14724a175eed9b1afeb27fbf622c918c77d7a34c33204408997175c45ee490e476b67ed89ea4965b951cc62f6f92bc4c6c7b9ca40c6a39f8154ee2faee8d20c5238ee821dbc5d11547fa6831c1e22b0294cd94b7b1d47fde60229cce4b39147ac0b04364205bfb87a75b33d7edeaf578db825470c6a838cb8c5cb909bc2c3b60ea6daa23c0d55cd9da4001ebada81bd16eda78859bded971d0a3958c17287a8ba9c59010baff815228ab9e369ede27b3a198648dd5f4a91df4d792bd94a12854c1a0e3bfced242dfbc86449bbf05192e4ae9ddd65e465cddc148fd2023945da87aab0f415be336c7578cf1acfdfb48cb7f7f13b98f45050d9391fceec299acd417f4bcca242406c160d2a042abf127239617e9595319c07b207be5cfbb02ab39574f74a71192a112ae696defebfdcad5970c2801b2668e1e6031208481560f4292ce2ec28375df457e828f5da93c773ad06ff5fcd08ede2b319502164fd3bcfb0852b118ed0cf22f7a5fc4373e23048206b4ae84b1fa6ae6e1256fca587c7521bbbb3d42d4189df6e1b885333fc3d95bf7a1aa77283329191e89504aad678811547f456e82fa13b23f271a2d71f1f65094b98b6dc39cc5efda71018b2ed888732d213eff8ac7b958196fdd4efc5c197328c2c86f31490a6bd0b47b79842f6bab580415267004108a929c0f52e2b15923b48f7406a61ab4508a15f98c19d5d8355e9073e257d9e76b4dc6741e1f8b8b7af99ab88321e26db544ffcd26d7a90d0a4062018aeb0646b53967ba2c5e6d09c0230b625abd55ae045f0e12b9d15401d93e1c5ff64b563f8396e93d3f2593ac1d763cded13d74ca29bb131013fc4b511d610ea6eed9812870c3c8526bbd61de45527c195117b8ecf659745cff19b1cd1792deaec04979815cc29c226aa3f0bcc62716d050a254bf1035fc95b92c5c3089b65fe6cc7b0655608f5c392c9fc789f9772d2bf44ed4046bc6b61a85940327e05ea5f314db59f4ecdb077165849d355fa325d4c8ea6d7025957a25dbbf2baa171dda648e23343863f5596d2a0a0a161454d5b9cf41617dd0b56422d1858cdb3529e7b1bdb5aac0057d21e81e1749009dc9cbdc13969a109b8c9f624adf194efb0cf3b613492190ec98890ea0acf49dfb279ff06f4594988fd2d381086bfcbffd777cc2d0a3389ad64024a00f1e1549f4d8e477bfde2e64a689ba2365863b780becf004868022b7800d00b868b9abd599ae00b07dc44bc902054125b40b504bba011cd11998915e1b78cd9f54d3b66cb1b608b58797eb7bd8ae97cc76f564ac7dba75c66fd14b35db1f2200a523c6d6e27f2bc884e1d23751af9dc0226924a08dfb0b1a62bbef78b8ec337fccc0a97dd3f5a4217b326720a468485e00603c81717eea82fdc6dc2c3fbdd7ddd403a8cef85d0c652ff13ec07b8fc5c6775bd62be0c23d970fb20855847534a8aede825e2c875fc91e7cf9e1739a96316529fbaa9490fb5c79847c8a56ee70a849ea22e2e58d50d8fc48ca4f878ee834b5bbb1416328ba439dc36bd0a9e402da22abda2cace46332b735088c58bcb084adc4b8ffc71f5ee942ac0ebb9537a6636be2abf9b2fc5cda45d7773bdf91b85fccaf1e48abd9b6d16f6e903718b5a77e02af0b9ef72afc124c34776678b55dc8ee2980d9be70194acad72083544930d16b4a3de39b35b61c8d98490f9320d2e0f395051b814278c275cf0cc9537db83cc9de36c70e52569c45a79f18ad635d36615fd59f20c638e2baa9f57b7bbbd3bf99cbe37bdc9933f3ab3f2cd1c5912c96511aca1025ca54f698bfb5b454b3bfada11db2cc4df6e4edcc86d92e1e35cb29934fc157f6dc809a987ca85c7aeb3335e7cd5ff7fb8d5b44d7c4d8cd3b557e85c791d9ac5576ccbc34ccb12c5996cb35e93fa65e3999b280cde07a3ff2a4b698263e04bb203c2bfbd658fe2f006638ff44dad92fc7465646ca69471d8737105561574b30441b132d0c301a842390da0defe35ca7fcbac9da68ab71ccdeb7b34bc978a5dd39be808a1f68645c8edfd95d0ac463bd42107032bf2042c8f10a007d200486ee1350b31a181a498c1126f91bcfd1cb5d2c646d43552760f00d797f7dd799fdfafdcbfb4f3bc32eaa1d346abf49f9ad70bb92065fa815d5922778932df0b7bd4a82fd0ec7fcf316fe6be4ba790cd57f825e7f4da7b766843396f0909f45d18a37ff7e5ce0ba6f1e980484b04ccf7896d9f0414ce8b6e0ec2cdf9d7a39b5f2522e148c2bd6be5646adb951369aa4cc5334483fa1137bf0669a497001891e4e7398da26214669c97e29dd9f370e7187510f662ec9c44ad4293a143ec959574156c2a4dad8a3494da50b9ee89e4f6467c4eecd6afc23ac53f1ef50701d2c804b98450cca4038d292473e91c24f0462ba1dfa29aba107124c96ee3b42cdba698a2c1211deb36adfd28539541d225d0a98cde0124edd9a18810d15e04ba18b030c85f61c63d5dd5b33c79048d0ec1fc73061e13a9c34709f38c525aca8292a97491f389d5a439f2f60e40985d0be492fbe17dab405a8499382302fcdd1a53c610701184f68380d0d516d0e6da279893aa43d5cfbfe408ca3abee26d9fb5f61d14d2dbfe5a52c9f5b1873613e5237283783333cb2f7228de4f4d8ff1989747b141a2240c07117f59050bfc2f30f6f1d288070748bc7e42fa09b71baf85440647466580e9f8386984f860919efc2458c2bc6a7ffcefc2c1d55484cc7d5be14c1d3f31a9fa7ff9bc66b2951089501c8e495726e22fc6c38661ff05b4e911e755d69049b3668927be651254dd9e763192a41ba1304ccc7a89143b1a1219a33b1496aac43666c5afce6379166e2bf7c3e105dc320a6a55689a8fb4a1f812c171e98996e44317ff9230420d4f15d72ef8e4366fd695ed45c885eba3b2dcf9953d163cfac27e4bef13155b15de310a77c05527f1bca244fcbc67e6bca0a764ddf41c79a75a55b143ef0766956a7449a6bd3fcfcebc075a7e51c0f5d76e35c8e71f8f90aef4c6e55b61331be6ff748700dcc2ffc380635456c557d354bc5aac5e0fc2634b1e7472062bbb2664b465660f9362cb7108e21aa727a4d5d9ccadc6a71aed759a8ac53ae34051727b40a169b110161ff228eb2884e8da5b6fc2015c21acbf8f810cde8c06fdf71037c33a92865b1bd8a77e9885b08540422290ede67e6fc62805e8c3ff1b2a41f8abdffedd431d5eaf0265622612ca60de91198ebe739cbc4ea5de15247525976b3259c7cfeba1ddde7a7335d48179526c25ba41d86949cd70365329955124bae96ad5a8fe198deefb83b9fad533f52f620a6301ae78946d2cc9780cabb9fd25a32813edb1c406dfa2dd811af970f6a43413c1b8ca85152c436c8b663df97b041fc000e164183276ccc9b0f59670885276cfe7f6d3b1270fdde13cbbe2a0f5b28a3ef9fe81afea499ea730436e7a2e3082eedf596460c96adf27a822b9203b03fbaa8c6b5e2829e576c5152a479272e64205413dbd2025faeda7d09daa282f4902ad86c6f5efc1a5053e142e1872d198fb0a9a342262cb024ddb3047027ae4abddf351bfbcec12357ab74a1fd7044b4b2ee645627c5f3b6b35888a9d3abac126ccb8967cc8c1c1db510d7333ef6bcf40b86646294b8bb1450f14712c06bfc46d486b9fea627696c6de7983ea9282b68f83d0d9fcf82f8cd7324d4eb86560f3aed862f72e0905253bea451896f31d58c80ec188ac9d2568c76faf8aa3cf3785bb7113141a69d6f936890169464b8ea42cff007f61286a56dd734009e7d26f9fb46319a189304c9962225c8f68cb228b1e0b27648930370d5cf819aacbae24c7d61b3372598a9c953ac2f9174acfddf39dda9ce6e72ad082c6eaf9133953b681efa33956c92fdcf18874cd5cbb8b8052053b79ef48bba17d0727f7256cd2ce078ae0766d4ff105326fd3a489be4144d4f5ef74452cceac361c86b2a019f0af884dc6fa1705b56b58b0307b871bab8c7c628f1fe94e5e1168ca5d3a7392b30a0b163256c9f3a22eef0f1646c0e6820c2f1e3b811c3143cb2630693afe96bdd813217860d4c964d91d98b125f03d884651962f538faf9e568ffd8a4dd007dbb9ab929b06db964acf623a92dc22d1ec482b3d1100eaf124bf43c410be0ae78793097c50deb2b14f8b7e91a4230c149f184ea9e8396aa67cb3acac0617dcd23f68c2246270514997e8b98ffe89748732e4cd01f12345fff018fc97dbca47897229d95fff5230df3ad9f46317a936b496563dd12899bc13b972b2944eeb2802de8944645869fa95432b45dc89ac4e8eea985b9ecb62cfb9028e72bcae459a825d5e77b70215bbaa77b00baeb83126edb01d38563b1bec7078dce28a02a6b2019d26146401757e60772e44154a65eec9f2a70660e95d828b6062793f19398d22d67efb27437b66e76c21b7d1766c32525ffee4974085a52bea6194cd7527bf307a609980dd5489bb7de804af346caa717d4b1b2f732ccd27b5bce401f238484d88e059196b6da610f0ecec6fccbf4c5ea5a456043ab4afc2541058a98a3af02779dcb0cf3c67e45740a76bf892b428b2277cd0e981514f9cd210f05e748895b1dff6e22bea531efa33e8276efde127ef2355bf3f9e519c772a62d45b919dc7ed3a1f51554bf6de7b6f29659232e90b470c1e0cde75fc6a96cf2f50b326e91339cf513426281b0a4aedbd175a94f750b5f790187d59f3a8db7ba8a2f7ae4f89c2bde71f7595df7bb576ddbc97264fde2be3cb9a4b851903ecf321008c05040c301e1fd14b1cc47b6eaa3261b879fe8b50b7bc17da0bad592f42a623d450bb4ad3114ae82ae918c4198ad6aea3d933a71806add84c484c9749660a6ac27464c589a909d44c866a9934662fb4175a95c151d40cbca6193545613a7aa1bdcca68de7a62894bce7de0b14143543cda6cdd17b61afd8a68d370bd231bb43d42bbf54d1b4f17cb5b244eedbeb7befad96ba8fbe174ab3fa1635ebf604dcf9ed06e516854761954605cd1e017c7beede28f7766f97da7a9bd8e8ad3f1a60546e88386bca99d7b7d7a64daf7c575badb7629d34047d817e7bbb756bc2d16c324289815d5c809afcbc7d359b3d2ebc2e936eb98cda45a5c98b047555433728df235786c3269c94b6d63f6c3d26c8e7dff803f5f1ac67c29972957c59f28425d688c2640917f8b49b8e2a29c409346e67dc88744185277cda4db8769351fb2c59ef4d52acc96834e18070894b13ee7be6d5810184d8832e4e9729b8f33cf7d1dd9e0cf47b566ae9470f3fec4872b147a887d6332476ab6c18765dd83df678d2c38febd65d642e489a54cd3c18f42018b405fa1861147a9c01c4833dd278d0bb1eb6520f70c9fa5eac243b05db15972938c63afd1819bab7630fdbb39c9a803e5f5cc24fa227983cfdf2167d9476512a102539f234ac5293eb6a72272c70e8e2a08b5de944c3d46492cd9e1c0f3a6bf69c1c741e96ece3661f2ed9070c4df688d2ad49f670325ba08330e8e8b4d0424d8d8a75ea51c402decb82f3836564350b74d683ac1670c2dc5f67b11efaa9f31dc25ae9078bb593257f3f4bdd18ba4cc12f3fbdb35dd74c62f4893774baee6103adb5b6874da692333e239367dce62432dec9d4bad2394a0c5c86b9f08d76b1b88c8333be72d0c55825dd417f199a3dab1daba10757f966a8b64067c9373734bfa9c9e49b596d817e33eb675ca660db8d76c44160199f71199ff1f24656c91e5ab74007bf9525e066cde41eb7da025d660cd2c3565ba07742e0764d2937d7dedb8139169207c32a0f8a46444a6fe72a6f642d8037b276953db4ae87d623347b7a86a6e8650f0f1ef49e2ae60baafc03d42dd0c3fc036b56d79576209936a08bdeef7062dedc58e896547a20f3b1c7a04828efbbbb9de3efc2aeab81e3c19a1a274cf20756d3437b528509fa0ee6c8772eb1ef3cacd1173a8aefdce5357b4edfb90cf9ce05f61d9d64989b2dd0bbce9d30c91bd9149ec50269a90b6bb367c575f2326c5286b60fc35b8f0e2f4daf0fbde8c3281f866118b27818fa0e1426203e74bd82f0e187e18974aac99d4efecd1e173f39387b72f849c64f337e52f9e95403c79f7c26cb64553eed40b143a6a305c583ae63f6205873346d82d4e46a0bf41c85eb650fad4609307463da80ee3286b969f32d590f4d0caa890157635b3526db83336e887185d7700ffa8f19f3851a25e64d94fe295a028d076b9800a388d9736ba8fc0c315d356c4c165873232bc9e03d8bf7b04d9b7c8463c0f5c8256068f6883db40906ccc680bb5eeee8a17d0f27d306480ffd3b76ecd8f146bbc231a6f329e543079d478ce8333e7bd8664fd7fdac648c38c62c40e52b7f808ccf8c2c9871195f8d2cd0810d332ee32c5895f8cb3057c99971c80b7af8a81c467d6456238cfaa87ad87a683d6c5e625c93abf1524c1095cfb7a17d643ef42eb3fc4d827d85156a6a48a9efbcbc45325925aa482e53b0f7d35b4a28540b0a060646bcb71343510c493a50c4d08aa168ad15dd47f7b0852717d19ebac0a19fbac03b662619e090c524831db32eef905d2f77c8aeb3b88f0e6f64aaf9e0587aa0cfd265c9837e12ffa6894986b97a1acb4f64b91d8c7719bbcd281773c94db9c5597212953fcbf756cca14387c87222b9b89c5872acac8830a41c9352a55a4aa898f15744d19444e53e9a8505d79a057a13d79066813b90340b743276c876cc7e80fa27d6ae9f98b5568af0adf50f2c77f8116dfe8959203f40e34f4c8aefa173ad690376236bda80a0b5654e101ebc7103bc71c283374876943ce84bd81317d8fa890bfc13131d0c6ba618b65ef6b0896e72530cffc44cf9076604ee175d0cdd70a1cd9e70f650d7cbf5fa016ad78a83fe03fa0fac5da61d33981e4078d0e9247bd8660b1c59dcbac89277cc40f75c8059c0ce59dc66ec6edb81a45ddd9844e5208b83be43d62eeca08b94b4f23d7e3049af750b74b007190fba297fbf43d6e4e703fa8e194b4682cb0906ec4111157aed617b56018e660f8c832f9eaa30e158da1eda83ee52f4654dee41cf71729d311ed41963de80de7d01ba8e1d2876a0982cd0ef4b4ee5d22ed191cb1b281ef42e97376e3ce839727973f4a0bba05a7c967eb48c2e58b34077bd9a057acb112e5daf079de5946330aa5938ccd51ef430671dfc709ecdf25c956db73c37ad648cb2a28ad465ef676affbd2d7533b5d274fbeba5098a0cca708bbfa5bf7e87eafd78709de5fdd7c181bbb1ec9103590f9a64d306bc913de8e0cd1ba0dfc8668fcb837e339b3df741bfc9cd1ed2839e739b3da907c517e8220cf43007769e81d0450f734dd22a6eafd70b081fd0c3a32162ac5df7c149e484add4a13224427c495ae2c89722ecc127605fd67c19e674be14831e2c45d9839f4f29ce1e749218f6b0b58b3ae83d9e80de03f41ea0f7c0b5cb3ae83d8c7ae4dad539e83d40f741ea1105ca973da490f165cd185ff67823085fea7cd9c3f6e0edcb591bf2e0ac01471d2610622dcd8034e61427aba95f20a6eb6b163d8d39deda50d6ac3ed170f97d6d4b55ec6ed7dd1bf35b0212d26a4906064c1fcfbb129024a027f15cbca4af54adb5d6340482144848bb40c0319c8d3136549fcfe927b92c67e059cc9a68424bbebdd3f8f6f284fba6cd58863033853671d694acdc7bee3205c7d0b87c8e176368a8ff79cdc07fa5fc1f3e022e6fcc412f698c4e3ec09d9721ed3d37c9a6873956502843d22e927b1eceda25ba177bb15592c6a8b684a66ba5c664bd2c99ae15ae5f3c7f19aae48a7b34b9f7bc7cb9bdf7527befab2deaa229afd4a864ca57b8f66872a6ee1bcb1d2e4df452ee3ecc3b5cda8b4ecaa9a2d9f3b967c67bb8192dfde86104348e4fb2e23e7c9fc4e42e533002fac5d1479b32ecf3595982db5bac6eaf3827088220d875d6650a0efbba4cc1610974d123ade495946e792b5cb356b866ada484b97c84e6a85d6598a37963c5412a1dc38a118de7616e82b665dd246bb9a19640c950485a826092dd215fd218d91b9b3da17b0e7a1e16315d6150b36273bac22426cbf3f20e09654b6eec3d17c1cc0a936051f9a076b1d8982ccf3d90c688c668da789eb70a73ef799857b869e3d19126c7b0e7600680d1b4f12838962c24de337acf5941d3e6c4c488955b9122ce9a5226f7d55950626099a0d993f375aedc3015d55b8e6472b40a53e779dee73edaf4ac8e0818a792d53be799a15d956ceffc267ae7a6a0d983f35d6675eb7385def90d146812a350a56aac09339849cdea7c0587cb790bd22ecf3bb7c1f3af92edd53d4f55f2367b562dbcf7b9f75ee73efabb610cd2acce947382c630f5fa36882b540aa59219cd1e1d3b83185512077fb97b64e90d740c428fbcf523416e6816fd7bc328b6817166cbfaf7618c636df7bdf79a66cdb226da5b1392661d814b93cc84647a13416acbe6257012cf7125bd314890fcc2a549669275a34906e4f473da94a6d95bd47da19af4daf296232cfe4064ddbeca506bad5ef5eb3eda24fb96dbb4a99ea7e79964a626ec6ac8d4c48ac9ea0a19363c2f5735168e5e86bcac1ab2a38cd1b4a9ee8de537f4d581b06cd3c666551b73d3a6662ae01245eb920c339fc24d9b2a63d9584ea60b3573a1a298acea25ebc95747d1be3a0b47b3c7f35a33a14c47be7a75d4ac5d2624e68a93558d8528d068562cc4b0cda5a06953bd71c556c3203a7be5ded1d23c6956a5b9d1d89a55bdba486363dda2209ac4693a2dc174ce5a6bb5aa66d5344bd5ace935cd9a735a21288f1238a542fdacd652162570ad2c4ae0927427ae0c128b12b5d68aed9cee91d13206ee7afc4052ad354aadd5ebed3acff3beef0341d614c33014c5129016a747b23e58c7a8eaa456fae453fd63da4c0f9522e1b6ded53a96a4301449a58a82541cb6a6f0e779246ca75f4babcd94de9629e092f4b43fd27fb6f6a5b3ab433e02ed303dd03afbbe18c5a12fb4917671259bfa13698c44636d1ba22f74137ad39f1bf97a2509f6597a00f5c1e30f2df0318d36563ba892434efbd4ecb19595df0bd92a0dcc55499d35a12f5428a268f2ed2b46987a5967d456aae1fa4a6e9f39e3f87beb65c2d648fd251167bb28b53ecc40ff82dd8334a873210f660a7a7b3e4b54c8d3ecc37d6fb447d8915475405fd6d633bee401ab195fcea2ef2efa0e18b1ede026441150a0e123e4082586901d4142c4c9129f00102de186125c8c6114039f72de6469fce0073058430a6a64e1f379e14416506880c512317cca99cb020863b4fb10025116468821c3890f9ad0420b1c18f974bf48281211ccfa499445922c685013f12467cd0c3680a6908610675001012344f941195d1821074d4c9f3e443c491d881023092714a14a142d7ca6a726498136a6ccd67042891a6af84c9f73fa37a7cf185884587859d9154fc0d7154c10628199d286114a08e2c84c0b1f3a64088c22d8122868644105922e98c8d14fec8d0b26acd0ba50e34b9d2ea2bcd7b69628a0eedb310db91bbd5545aa598b88b3c60876e66ae9471d7928291428af6e16ad42aae0ed3c1bc59b4694a807503ee627510fdcf8d24fa21e48a9a9119b4f6aa02fb4536755b286f9e409ab8e4fcaf9e457f486fa7c524393f666030e3ba0a0074a9e16cd274cb8f1e594927ba30a1df2d46ded95e7e0c3a75eb0563604a9a1005b2899f28427ae80a30c1f5a842f9ec04185386880238a69d1759db5d6763d905e5f69fd6aed7058f5d47598bcd1c2531c9ed96d6b57d94de850d7babb2b799dbaf5aff4808b6bab879e523c6de6d7b72ec459d34d7afd7431865291c7005f9d024c84beaa70be5653add4b66a085f92ac2d1d60364bec7ce988eb18438315f238d567a88ec3d324ebf57a01917bbd7cbaf67abd45439c35ac6963c179639d25049fd4c0d3c656a75388fda3ec8a269e4ab52b66beadb9385ccfe17a901bc83c9f871f90fcf579ef8cf2f7bebaa657087f5df44ade90c29e7afd7512ebefbd38d779aefb75d625798169e8a07bce82d041167c1e7eb5e5f9e79e7f191cb337529947a58fc8826a6d1a05d1a076557f4972c60b7210060dd098f9b4d1a40924aca802e4041af8b4d75ab5cd399ed4c0d37d740e957af961d697d388bc396f2c5be81a15b66389face91c65ccd973a6d755c64b3d6712bdd304b0f98b5f52d60fa884e4b23b801f7ed4737dc2e1c6faeb64a0f009d961e10249cb5555b9f831f8924c4e7faf4b293dd4ed6644bedf57a0121d4aee983238b2b3b25df606e288d2fbba12125ed6567eb6e6507e5d259e79c0ec4fefcc61f3e2781e30fa097ddebdbfacd0d11479c31555b3437746ba5cd313680b837b2b0da6a1a24de5c256bed2885bde635778f5eb02ea8d6ca4ef6ddd1baa14ed6cd68d03769566f912b17f4a66ba72394b596eb9a850c8781be409fb6c3d0303489923d25e24115da25694291bdf1e5c4b9723c95a76f3c755b5dd4512a3a0494f24164467d52ffa8134d22a15400f84934d4032bd898370ff04c97eb9b3e3b40e19854e6174fec608d2a96e0c4491b4d04fa8226b40e6818af386c0086115c14604da031a12cc1f527911549d06182c80a29a9a9a24c7cc953b2842cf98114bc58e30a268ca6e053e2502bd420b282085fb26e6e88623cf549fdbbf7899a154356d4645240e0181afe7ae94fbf36ab3a4e759eea5e9d559d9485e7ea4df610391d1f35546fe12b4f13b876adf097de59bb4a15cea82730cbb111de1d2156addfce9b93e60c054fa7638ae6f03e1d4512cd9844a2f97bb1043e1d33119854b637d8d9e2dabaf7de96159a49e28b988229fa2cfb6225d1f2a3639fc09f230b8966ff39d2d17fb69068ce65e0e9e244a12caa0554886d9210a62670cd51eb75a928db72693267e94c61d09f3c3ce79cd3e4c4e75d597861d3da927895346bba6cadddf5ee77ef68ad6cd6dda0d99a5ec519ae80a6cf8bc5fec3dff44e5dad29252dd605a7cd376dad2b6160eaa0d756ad75ce39bdd761c2beaed53e096b21ad59e16cf674ea58d1f1a7af639981e93ccea8edd4cbf6ea35372bccb70649d596adb576fd4c049e9eb3b659f7e79889c0dff7709f3aa5a39d3e62da5fdad3318606eaed2575212fe485bcd8dd5dd28fa1614e3a524a9f3443faad1001d35a6badf6fbaa57abc909dcd50a02816b77dd8eb456ef332581a9dbfa35689bc0d431e933dd0053ff9cc0d46729e4c524acb5d65a6bedbdf75e6bedbdf75e0f64119fce9e31cce10293637489a1b1374ae7799d779db79468b0cfb26aa161a1f95600c0acb576ddbdf6be05000b96762c90ba0464f5dd785fb75ae90f6ba7add5566ba79d96659f603569a969d51300585a2716eebdf7eeb0979a4a3fee181e8185b4acb57687a9ae947e60310ee0a4240660ca14dd5badb5d6ea916aad62db1228965a605230ab994c0380dada21e616429f59a9647ed4156c8c6eb72036f0b89428b8e4f13330f5d259f60798171d299b8f478f7753fa516f6cbb7ab26ef7d71b715ca8f55ada7ddd6e3aee8bd65a6bad55001674e2cb51c244f847e591535d50256c636939957e5417acb5b6764ef129094c1d97b00d5fbf269d5aeb4ef58254fa714b256cc3a51f7547f47b7b81415b4f146bdbce24964c2e312f31335ec302e9c2fe6b41a4196b6ec21a7269069f9159a958241c128642dad0377c230f5e4e2390871534ba6c001f53c014e6be94f017389f0b021040f730f07c6f60ea393aa47adfeec4940eb082320cc2548764ed9c765a6bed8efd92a44af8898ed20feb82aba2b08e1c2897161d9258eb2c9124dbae277d3fea182281a9b3947edc938924599f93270c7cbdf4e39a4af80b6c9d8a3c2471a594b2c19c95527bfb26ce9af2bebc4cbb6b65f0ecd0eca19ead5e6e9ffbba821ee152514d10f077eb25e0d44fa22a862812708e9f445530d170544104115ef94954c56b095394c02f638081513f8984b2788150926a0676f949246444154242d43870e94809ac238d9601c641a03dc02c5ab4116ef949b403254fd8c111ea06fe7e12edc0c80c7600832150f10422a870a3b681c19f44541851811bea9ef0618c63a6c0222885841acc1451c84047128c5ea688010e722ce19672820d5c9200d311a50628358e720c418896345e2e52fc00884509462829b620725282ace5c391428a19e00f7f243cc588450a26804c4527298288ac50c961295c7044c9286772a308521bb315358810d5b8953e1c1d14851ffe48180931240491b01844401f4c90895b7c3ea6c442a118783ed698814f10d1f960e35b4288eb438accfb7074304490fdf047c269d83a1c9c0f0e23aa8f23bc6e1bb0f64125c84a2942d50052c308566246cc875150b7e6971f7efc830ada8753f727111530f858c0a2fa60091c6a601db82cf0cc16750aec3f89962c3104af7e122d098209f8450949f0e92711cd0c27b0f793883646d700ebf84944eb0136fd24a229a14cb0fd49449bfda0114d2104a21b183dcb4fa22588bcfd4934c5185fa62e14b2efeb62d75aab4729a59f0cc98f0e431ad6cf3a2b352facd2407dc6d4cd87b2f01eb94780a868490161506dddd97728c35f9261e643d947279d36b71d245d2288f8aed51474dde40612df4ea2d2e44956834846edb2279b911ad0506908adcaf769467ae3740b6515886963a33234bb96b6ea28b313ed3474aa7d5739c9e0f276ec1b92da79d4fb48a725f8b34d9b5bc3d9f405f0d25a3da73df8f07d4f9bcec18e056f9d7a9d676d900cfee0d0b4b9feb581a997f7e5c6df7bba01f1d724abadebf766b29964a62113edef35cdfede11bcc28dff86b87db0ecd9de189a5970c8b32659253d29332ab437aa7cfb109b5704eb69732b0b6e473b5a6dad2819cad6a2b20ee7ec79c1f5244b6212932c8d2f4d44f92ad8d15957bcd9338dc0a3ef8bab2fb869d38ed3c065abd5823559f2f656ac65a415d43ab2f2add7b4e9b2c59ab518d4bdb0ac9222908867df3831480412db48bb8098ae4b64b25e3706df5e8a43be8b58f2ed6127e29ab5ca629466b587592cc255521cea568b414636f1f65dcaa2ac5bed601695883451a8592dce44b135a4596d6d0bd6ac6ebd9ad5ad57ebd5de0bae495a85d88bd1cb1b30af76d96f870152c2e45b8431f2fd82fb7e3952f2e44b9821a52f6160303198a06ff73a1bd4aef2e25aafd6ebe2c4232dc497a4b66f1d887d0b845bc4f762c39a8b9e112f6b9c68781225993d5d7de796ac0d314a29d5d1ce98d30b7146a16d6fe7913127088662adb3ce394925d3caca490853371d4d5c4f2db5bba551281717ead28232b9e470c9912307aa8525478e13ce91238729c74a29478e1c2424a018de7befbdf78634eca31fa51fd75da6e06a3a6a96e7379baa342bd53ff73ae3b5562033ff1253721917e2a323c7543f2d49b9ccf8c3ec428827643e29afd9061dae1a7f986c28e1a3a3e4b32443e521e7dc728a7270394639b99c239d970e4c27a613a423d399e9d07486746a3a369d9b4e910e4ec74827a773b4f3da81edc4768276643bb31ddaced04e6dc7b673db29dac1ed18ede4768e5c2f17cc157305b964ae998be61a72d55c36d7cd55e4c2b98c5c39d711f92261648c0c2265e48ca49143648db49137b288c49146648e3ce281f1c4788278643c331e1acf104f8dc7c653827d3eaa91e7555bbd7ab1493c64189a0832cc5008324c0d0419c6b64386b9e990618aca0c83fb408631ca21c3e43c90618e3a90635e1cc831b00de4989806724c5006728c0c03396686438ea15d20c70c5920c7d42a90636c14c831b709e4982209e4185c04728cd10d392607811c73f480ac7a3920ab60366455ac015915c480ac922d20ab6641b28aa680ac1a4a4056d5109055b61ab2ea7680ac2afac92a1c0d5965344356e58064d5910c59e6f523cbc00c90656205c832413e5946f65966e623cbd07a6499a118b24c8d0059c6064396b9bd90658a7ab20c6e00598627cb9059c695573b79a5935739792580bc7221af70f28a7693573cf2aa565bed3679d5425edd6aab3d0079b523af8c5a79955b1dd5563b0b796606565bb1a031cfacf2109507d18297cfcab348f2551a73a757b89c9beb365d58b96e3cafd9b3fa763fc2656bd6c26cdab48d4c8689c1cc6418586d35ab5bb36f5fad51ae90f0faf632e7c653e5dbbd5c0e00f6cd05127f23fbf697990d70c98376c483d6a5bc53b92a95636c48b9ca5529952a95552a9f25204c3071ef1296287274044e7969ca9972a1114f516d8546332b9954680b6d32a12db43181270f5a2553a92f274abbacbff0a0e5446956cb70fd3c7d7458da2eb066cdac64bca666563229fa2e438eaa4820c6550e962400e33ac6181b74cc32d8f0d1e1427c5439c60695a73c35fe408f5062c4cb47e5427c448c0486a1ad705e055cbfe4a1f114358b4707cfeb22814b548ecacb2fe5475ea6be441dbdcc9873eb56ce2d9573d331ce6e95a9cfa1827180e7973937daaa98fc0a7d768c5ee14eee3be7f6b85b5dc71c79fa5c2060ff32e796836bcf316acfb9e5147191cb8110543b20867126aefe4db2c326afcbf34edbbdc619633031fe24bae2c9ecaded493406914fc1f07d9b6148818322b828a38821a0e14345d557027c59a363a2f972d62fa714177e56a143be52a0217c498dd023bff22545f203233f50c257c7a91f3ce1abfb13275f9d15c60bbe3a4e18667c751e1f507cf519c418faea416c5ffd061cc498f2d573787d751e9a7c751400e109af1b18c1801085d82d8c20244441a8f295de2684585c604338921285299a204114d282c8122e8c28a2895a841bd14aadb5f6fc6230860b66a86e4393d667f6509247044f72fae021889f0dabe3923ba97e955669b50e85be328635cf505bddadeca1ffbca4b8ff3286d55b6d7d5588cfac2dea3144416aebf3eaa41aba8f1e7fc0a9adaf86e30f5e5b9f8b3835f7e9d34e93854f8f31dd8843b33ecfa1b63ebf53f0ad16d5cf6bad7e5e6df5f39a51505b9f87f9a3b0ff9cc28a6a2bc686d0ab8717f7b5d4f9cc9a6fd4e1e6ba1988b386e2306de8f5ee0bf2e5982ec7b42da63f6fffaa7f234fed52e369dad46ffa8894f47d194f1f6aab2d7a044c27aebb5621debed7926e3f18726d7777d357750d0e0c3380f184746351dbb5d65a5b146909578303c30c601c21dd543a7445bb6b3f4a0492b5d6da31c9f49ea3774b8562034f2f554fdd4b82f883ce19c6a8cda8a69cb6a6d4ad0f76f6f3d0368fa0059e4de1590282e9db799a9d37bb6e86395ad43ed43b6fd6d9790cf8390f9d589b817a101b9a0c1d07ea1b68d7ca89cc8726ab0f75f0eb543a383cb4ebbaee53523a408d630a3fbdcbdea4efa93ccc37973e4c3067bf98d558da1745b001f1456d5527c9e9d39a39492ec0d34bbc2283eb7d3eba670002906fac5bf70235ebc69a75bb8e8c0bd4ac5ba4650d5cdea0bfd76f918be473cf63f882644566cffcdbeaf1ba29097cfd7a3ddc7187986e75694988b3c6e79c93d24973fddcf378f00105242805a44cb09d52a811c52101532a540a1698fa135afdda6c7b9c73ce3967177149dd0aaef5489da95757baba2152ff71a2cd39eb68c7ae20ed3e69bf455d6f5e30d1dfcd0b2dda0b58c3745f29df6eebecdbecc9f1ddc5b7cf92f404bd4e5c30a308219ea8011b30274960220d2162800428e4200adf95083d79966802892bc8e00111c680814f896b942e66f0012450a8523baa72831dacf02b3f89b8c0d9202c4d1bea24d2b4f9caee4b1fea57fff011fcde7b31ed8b1305dc9180807ead67ddb35dee407aeb979422cdb2e6e91dbf1afbd7d6d1fb66f17d294acbafa134167836ab44593c6d0eae0b155a4b5b6530bdbdb44443f72cd16913e5f53e34ed5e297b88ddfe3e53500ddcba78ad25d9ef5e7aef0e24da251a5a06ef4740e3a84fa70d654d9b3aa4569f2d807d77fb5a3bead0a826f40ef4a8566c3f123dfa762bec17056b3bfaf756ef6e4d15c3ded136cb5eba124635c9706949f7de0b56eb799e1d9d0a181ccb8f54ce39e9ed27b56b8ed7926a1cb8b46f72029796564bb23ee3442ea925b50b046f57aa41c8db18faf5ef1843c3bd657f8ce7423211b873cfe1ce455a67af9419f86fbcd78594df6722b0f51cb6b58647636e94cd1e1d7f6488ee0a3b84fb721615fdb468e0f202e1ab4f4a299dde4ab982b7b47de8a11bedd0b4a9630fd493c99a7c79cd846a4fb8b8c5a0c8869ad86e45b1d23312f3cc001a628bafb5c71e681af3e39836b569539dd6abe42a69b22576856eed3eb9454d8eee918bbb4a6e935aaf94afd455e28be4caee919b0382386b4a9ad75717a9c95ad3ac4952ce44333131d94c506a505247a628f75583c334ab6da1c497a65a4dca97a6275f4d3713eeab5bdaa9a37695a6541506c8e472f52894d50f6547b84db3db5e4e0bd8090edc5ee2b134d1445a62401aa6d9981b653253e4a8717144660a9929a669565bd559d0c0d5656e954c1dd556f5540acbdc646e5f612db8afd5c725be7ad992c657a7347534caa64deaa89232b4d9aa3ef4aac1bedabefa14d3a67a29939be2ab67d417d3e6a68e9abc2f2fa07605bd2069d7242252f2d5a6e4ab14475f419a1650be7c897dd522e8cb97235f5f642fb317da578ab2b5ab94c97df1a4a281b235ea8bd9337b9ae604f4f4fbe600823046572b7da929f1ed449c35a50deead4f2fca9c9e77aff7bdd8912a48e958da7ff9c9f273a2c4d86292285865b181696234b84a0e39398b5ba7316205b18c5839d61bed5a711f3ed6910d6cf6ccbc5d15bd5d05e1edcac9b3a8b09078369ea68834de3ace2f504c1beb2858255f72405bd6ed8b692c514ab0a082de864f51b097d9b421c2e52a7cd16c315da657b36ab387e43688c9b24ee4ad97a31b6f7dcccd1ed14d66d4664f0955a55daf959ca4e5f369e9bad04db195951cd290d2eb79249729182c6d097c51d22dfba2a459d6f35e66cdb247d3c6ae6eed2a5147ab272d0e36e9185a6a2b1beac856d3ab5da8599b82b026222633324d6dda589a266fddd26cb1aaad6a2b919a51b25e658aa68df51cc3b35c9b36561cc75cf8f2dcbe5e1fe4340641e3f039b98f76c1db494610de5aeb224b9e3e5ecef1a73c7daee75dcf5bd55e682520dd75dd39786f786f7849b70464656b96756f7ca135cbd2d8deb2b897939c509e84e5766379f2843ccd6de5e4ad779e7b25202bdbe7a1c655adb6ac7ba3d39ca4c559cec02b5a254f6e7d3554c916b732b8d9e3cdde7acbcbac922c6e3fb71e440b5e3e27db79893a7acb320e5d582dc1a757d8e04a9d0a12674df9e5beba68a91de9d8b5afdfeb6d38df375975e6688bfaf7619cab7db963b5551d874abaa75234c6a2851441f4856a446f6295fcbc2aa10cbfecd8d73a2589af77a82a61f65c2ca64d185f7a754a279355b28b62b6c219bda95e7a3ee82285cb4ef6dd1ad1d7aee8ab979f135f85f01da22f7465cc1b2c664f37846953bd42c13cc0652783f2df87712ae5acead5e91426b9c3c4c0bca14e98148ee9ba1e8554cbabd104d24fca8514386ca07d3e22d012d39ca20aa83ad031d5ac6e6cabddc28509b8bd2484dbe910a747f5e87db419b4ab77c976f5eb4a5707dbace9795794f20a188a24af5792984c2b243104bbaf7a6c78d54b9d9589edbd21ce9ad2d21f9edb12907eeb627712c23850cfa15d9e53a7b64aae381d674f8a9b5126116afc740ccc172810bd699f1e7300abc367471dac579fefa3db367b3e0fa4229c84668bd4454ce958ef1dbf69535da7bebee2d8db75debd9ded3e4bf250289cc2e1ef23cd54aad4acd5eb122c36097f7f5a8245f13b09e1eba4fa460997502d67e0eb3eaaf515d26909163f13c954fa616dd7755d5723627c3ad56a6dd7755d576d2d77e868324ac459537ab16fcfbd198e02ba05dd823f3c07bf5b716a97564b5699a26f5c6a6405a64d6c5d9bb40bf4267d599bd0aeacd66f2c2ff831d5eddfa7b4da6a12a5d2e415a2e07869f549b39a666b56539cc7b49abab4dae4d23a2f6b93a15600e89676858666cf3c00e8d6c1397ed68b2d416449028316830104ec27182fa00fc04f2771e05e34d90fa522d1ceafb5947aff67c759e100290d4fa2210c3de8feb9f87a39caa1b63eea20a50ebae73935a220e8b4f4c31b273dfd1431aa4188ad259a03100dfac0247962ff19a1476a6e94b3a440641c36d0ac8f02cdfa7cda13a9599f5f9ef2fb523c40fc41075d6ccf61f6d4ff7c877655f7bc2424477dee9fe38cf3abf9af052aeba84044890ce130a91391688b298f52896060ead68e6577cddfea44d2ac1f3ef4ffa8de31751c6fe71e634a1e76f8f6fa22b9012ebb08973de4a78b42c0d46777d3234d71804bcae4a78b43c025a5fdc4b95e904185888c2136d54fa231841ecad04f2228b32fc136c6b8110961f6363f89ca38fa2ebc30d285174046be5de56178efbdf7ee8012c3201a5a3f9b05d4ac3a81aa9121df6e5f47dfd5f6f58975326dc42270d931dc4f9ad5b7ef2e9242058910d08bcf4ff97c1db47771234d86305152c4081328289fdfe2f3597cfec9e7639fff5324e857869ee4404d861c41f244e8419fdff97c5b7b2fe8effc1f22b4af4d2adfee2c46f0125c7e600c11e53fa376950da30294336aa0a26fb746ed2a3b189576953dfb1c7d61c68268959c959c3e4a3e9c2703f2663e969f9199b1fc8a5663f94591194b4f4835965e2d662cbf213063f9c1befd8708ae5df5093fff25ff10c1499142c4a85df58d9f9fca3f448c8850214245d6aeea849faf23ff14912141426b576dc2cfcf917f8ad0848460edaa6efc7c97fc53040604146b57cdfd7c54fe29123362a4d6aedac6cf6fc93f456a4d9abcda5599f0f359f24f91d7902143edaa4bf8f9a7fc536488099359bb2a959f8ff34f919912254582da55a7fc7c53fe291254e4489123b1765525fcfc95fc432466c4c850bb2a1b3fbf947f880c3161726b57357a2237285088ccda55d7f8f960fe213223a2848892218eda5593f0f3bbfc33c4d1105586a8026b5745c2cfb7f987080c08a8d6ae2ae5e77ff98748ad499357bbaa1a3fdfcb3f445e438604b5ab1ee1e787f98748d09123b276d5349e880c09125bbb2aee89d89e3cf921426b5735c213a11111fa59fa2122d4b58993ef235f763092c682bad90489942fbd21dfb72e08df5f67c6b711a474b76492d6a8b6524ef016577c54bebb37bebb2ade819efafcd611d0bf55f233b246956c98c964648d8cbe3b18ed6666befcc228e3db69478155b275305bed55f8e0db4b0d6ba26f582b992531c915bcc6cbae091a2fbb28c6f6cfa8922b8cdd10b3d55e53c4370d12e39cadb25ba24c4109fab28b75b0764d2228b16f0a9bfd682544e0ee3b980c87633977207d3e6b1a936fefa288eccbd4eb2802971dccbae81d4c0c8faa98affff0e0cf6943eb0ef4e887d02a4deb59b354b44a939702a9bc8405f6867840efc12ad91d75abcb0ed6c1603d5332be00973d83f950cf68cebb05385052dc1b0cfd007e767183dbd76c6dad9ded3ac1b1d6197078aceb945fcfafbfb1f4e122e01b93b84007d643e7c199e112e75b5c0397df9c2dfbd9b1acde7db9dce17740bd37e61063ddc6d8110728f8980187c785d9eada8e336dba099c7614d4f61cea0be422f73a7c5671798142d81f7584aae2f232b958f25aab98e9d7fc21e15746d584c30648788925d4511632f0bc786e9634c2c8d05638ab82dc8de524395cf5421854d472c4700eff3ce7d6aeb2e69523c37c30b45b04913484cbd66cd62e5149bb2cad5d422a17d8a7b2cabef8d52fe5242f5e731215955cb360eef3826b564ba1d67d7429b3688d050ea0bca4e0a3a314762a93c9888ba55269e54d4fca2dfcc9454a52651eb3bce3595ce431d4ac76d2c883d62c95cfe41895c2ae1d75e4e2f7a28e72847284da55f2f69ca192ca4b335e5a79a9542a5d6bb95883052210b95552e5365fe362938ea03981e6939a65bc910325a728e7d6ac761cc3b57e1219e731cbe9c29553e36153347b4a7ef3ca3cb769d39ed3454ead5ded28185a8b1f9546924d69ac79b1f062d15ab04ace8c2a8c6b0bf6a2c1d1e03e8c697032fc7959dec84abb0488dc823a6acd2e107f4b17a06f3f6153eee7c18447eddb7d340f5ab37808896ec799ed13f0fccaa3c9370f2673dee0c047074a8c1c5019329f940bf1c9b9b5ab426997a9a85d2b33540b9a05f50165427b40b1a057d021ca036a05ad820ad11dd025740aaa031a05858226a14ed026e81254097a039a044582d680d280ce801641654063408bd021280ca81034080a841016ac20052728010946e03df8600214a8e08716d01775011d425f4061940805a244d01835821aa147d0206a037a84e280ca281314097d82ce680ea8126fe729aa2495c2db797095a4b44a522abc9d27c773e4135403c6be84c9a9d55693343871e5e7f5566eb4c822f099108060071dca0fe4e0810e7060034e779035e0948abc72ba2467c0292d8f4ea7c818702a45a671aa838c835325b9c66914f9024e739057700a45b680d3590680d324b9024e9fc82c38752253c02992cc72da449e80532672cbe91259024e657987532572049ce220ab9cde20dfe0f4480e80d32432049cda20b7e01489fc00a741d9c6690db2039c1e917938a541b6c1a9917ce37406b9014e8dc8384e8bc80c701acb2e3895415e805322b2009cc62007710a94739c16c90a704a24eb381d2227c0292cef3885414680d31764975321720d4e8764d26910f9004e5d90799c02917f9cbef2005c48a6c15b907b9c057906ff21bfe02bc8405c0519064f4196c1519009e027c83fdc0439062f413680fb907b38097201bc87ecc347907ddcf37bcda62fe5166a2bd69a512d320f4eb3c82270ea831c02a74c32089cf620efe0148bac83d32b72e974287fc0290f720e4eadc81e705a45ee8053a1cc0197c92ba73bc81b704a451e9d2ec91a704acb344ea7c819702a45ae71aa838c01a74af20a4ea3c83838cd4106805328f2059cce320b4e93640b387d22b39c3a912be014496e396d2253c029137987d325f2049ccab2caa91259024e719003e0f40639024e8fe4169c26916f706a836ce314890c01a7419987d31ae407383d22df38a5417680532319c7e90cb20d4e8dc82e382d2237c0692c0bc0a90c32039c1291739cc6202fc02950d6715a2407714a24ef381d222bc0292cbb9cc22027c0e90b32e954888c00a743328fd320720d4e5d9007e014887c00a7afdce342f28fb720bfe02cc834f80f19065f419ec1559009e029c8401c0539063f4196c14d907b7809f20ff721fb70126403780ff97d04b900eed9c74b79c7b7809ad5add8d882d1d4be1d1781cb9c5bd982fd4d50dfbcf2cd907c93536ba7a1a9d1d8688a686a210dee5bb682c3250c92f2e6f53cb8083c040e026fcfc95572076fcf39aaa40edeaef3aa64e9ed3ab04a7ec0db756295ccc1db75822ae9016fd79155b203deae33ab2407bc5d8756c90d78bbce502535e0ed3ab54a66c0db756c95c480b7ebdc2a8983b7eb1455f202deae83aba405bc5dc7a89215f0769d5c2529e0ed3a47959c80b7efbc2a29016fdf81553202debe13abe40ddebe1354490878fb8eac920ff0f69d59251de0ed3bb44adae0ed3b43956c80b7efd42ac9006fdfb1557201debe73ab64106fdf29aaa402bc7d0757c90478fb8e512511e0ed3bb94ad6e0ed3b47953c80b7bb5e95fcf17617ac923478bb2b56c919bcdd15544920deee925552066f77cd2af9a39206f076d750250be0edae5a257dbcdd65abe47bbbeb56491fdeee2aaa640f6f77e12a1983b7bb8c2a49006f77e52a0983b7bb8e2af982b793af4af6783b09abe400bc9d8c5592c7dbc9a04a92de4eca2ae9f2767256c91d6f276995d4f17672a89239de4ed62a29006f276d9574c1dbc95b2571bc9d2caae48db793b84af2f076d2a89236de4ee62ad982b79347950c402555257fc1e793bd9d0756c91ddece13ab64cbdb79822ac9f2761e592559f0769e592501e0ed3cb44aaee0ed3c4395acf1769e5a2569bc9dc756c9d1db796e30486066f503a3e4a8744cd4775d2d19a219080000040500b314002028140e088542b15828cd634d103f14800d859e48724e1b8bc324c6619432c6184288218418002002404233890400b4da9ae535aa8c6f48eb256d04edf24b5683046973ff14018e9c1509b8e77cf75454177546c06ab77464d7dd28d08bdcd19337d3e21692abd83fd65acae42be53adcd5781fbbfaa934e4e92d09de665b6c6d656151f5f485b4a7aaf69b909d0386d7ec27005b5ccf6d8d2a3ec0bbab2297c07891a55ed25aa50dde50c49755e58d93380c31e45755fb3dee598b2c93a1d4b030b722e75023305a18a1d70ac080169a760f27d15046c0d716b39739996bd8f4c1f1f7980ba0538af89efa244b1a4db8d7858c1411facee574330be3045f65893eddb2655bbffc02b91d1513e9e08a031a38ac585b30e2ff911dec75c417733644cbbb82eed7615ee343f3ad640e2cfc70c5f53a7d81b757e980725347bf1583a35d3dc799ab4e9dbf6a493e4e017010a8bf80320b125db3c3cc95217957ad527578b2ff28812f56235a2f90f1e8dcf20a82f806042099b2c402c92fa09780d792e06468210c757eccb011219f2f0a437d5f70db4593999beadc4e7833ce7655a56ec54522a80b3599f15f941a13adbefc8d2b1bf4e82c68714ab197e3bb0c981092c1af084e3219b72de1c2f8d4a122ef6637c3cd77459b17b1e4d65a4d7f95cac5a37145c83d6458f492f918f161fbec1c2dca8ee53eff152c390e801190cffeaca7d6778f96bcbcae427d2dc3aa2ee19908c89eab65e70ac9d9e57e13331340e413701015bb13f33d6a5c41ce34f2413be85b65fb3fd9027790a1e0a566f20bd59a1daa695a6025a0b8ed00b1112836f328413aee2d365ad296049284e704064691597fd617dce76bb021709781f4d14ec7636583ca862e1d1f62e1c8d209660b8132fa9a10b149ac3c60aec98b8d21d4ccc326080876daa5b96457ae13257da62700b989a9cd3cbce83935ec32d24499498ba8ebad2e08446e0f1c79f0067c0a56a1aa84030b17539531756cdb3e452263850aa440cc7eb72ec5ca134595a3048feb5c30f60778a0a6fd402ef97383ac01ed6e68a47f8a2851b440fd3c8333b2269b53891010cc660f09988ff1ac030eac549089199d44c1ac5b01a62931cb8d331e105c423350ac869ec8b89f2c50f4d2db5707030e3aecfb68f689180aadcc90976f36a43421625af59197ac33f56b0a04e56ea0d68d52b734536a45ddef5b5424608120657f774b48bd100a875421a0ed16756ddcc0818bbc03ac4e4864b6c190ec0983e2309bacc9ca607c1e43bc5429b534ef371bf3005a6ce6581ae75bfc4a9b4609755ab7b3afca9f953338fe391f13198ffb05d6fb6e2f006bcc445dcecf4b9ad04178e06b8f748ca1b2205bb6d64b009b942db5a0533b989ad590640a39d1a19b61f22b57507a5400e25542a8b59a931855346bd2d2383ae264050ccf9e67241b89ddffeb7257830fb37089bb9a2c90badaf838cc40723439700b6d98f8d281776e18fd537ef4c472b7bd4b6cb6c1671a392b54f05438f9fc3b37fc5f7b28082382fda123027badf058a19ddf6c79fed024e86ef011621354bb766ba09b0c54c0a9d997adf8b03ea6f4cf6b47f5c3c7e2308bea0f1881e7b13bca4edfedb7616b743fbde4ec9487b20d5b564eae043c0246ac94f3b20dee9f501dc0f1493b21afdea840bf4e7703c8ede7929574c03f15a3d2884c031e528e53e76235ae0f61fef7864261f370b289158b8396ffcc5ad2bcc2db0be6c4e2ddace88e4db195808ffd88db9bc4e453479e5ebaeccdf1eb39c6127496750b64b4b69d45cd80ecfb490ea544c533a49c457c9bd957df2a90549f918cde757478aaa3e3b9301eb39e9c6e8ea39a365bae17fb0931c39904e72ca2a9b28bbac7b5e8bebddda51347bec1292ecaf48e4446e33b4ede4666a01b082a9058515f5aaad11398f1ea121ec5cb97557b99503951ab2190db9fdcb960c86ec0c83e6904232263c1e1247609abbf8f91553f96172f1f8fe3054b394d95907669ea25c6c196a3102476127c68d1d4731f7fb99573aceadf347316b23d5151451fb0759186b3c13b679d617a40d7d222d3401639175a7afd38459b1c5744f3972e0f1684c1eaed528951c26a0aebe3200c99f7e624ff9142475b464f771165348226d9c6070f33adba54700e894d0f52924076a05c599c8061191b27be4f9e8a8a91d26185f86e896f01e0e364f797155879d8fd5b2c644a750bf3c02f752681dc39619d228a7e0cfb3210b4c35658df0b9ac05e4b3258e7f345a52a19a9d25c046069a649978c84cf8dd93039450259527a5f0cd07d42bda88156a57a71237d6d2327c536b1334042ee5847bb00525f5f03d850548df45a03c82752668cfd51a9ccab38c0ae4f22755d8293d8ae48e8275235a6cda345bab0ba136317f830498734eaef732bf94056d8de9f165314aea03eb823282a517bf07f8446c909de61c5c7a0541f0b469d3e415a1b095529344c78ef3c051e99ae10f77a1fe7d338363c09223de099b40a8ccfcf82d47a96a767cf32c872d63282b328ae9f2d61ed59100e9f6d37c52a607c7e16aa923dd55cebe6e5c29048d041d12ad851810a4c969cc5c0fdac4ac6675160ada7f2a22773693044aae641700b571ecc289b6668abad2f634c2e06fcb0181a1142109694e5f0209b4e030ae9341b3c473fd430ab7ef1eba95c076b22123ea09c2072a4840eb0d3d4c46158dd2fd09b41881d5c76fe0b40ef5ef8bbac64cfe735922eb9ec30f9840de17a27ba343c9094f0385d9e7c1fa39066920202aca2e5418bf01c85d9e0f3966278363bc8705e7e40d64b7cf65d6d99fb0730a95d9edd62f04eb6668a4d86ec3d7bda8d6b51a7abc8c0192ecc0b23b9926745cf5d7ad421c2b40882a6b28bc0541acec77fc86d904c600d16121f1db11ece5db4daa24b5d96933ea8b26070939e11832ea76d162454807b7bf5d63bfcac3a6ba9c779666e48d34214603356b3a76177d6788c34b43cc71bd61ab144528a8962d365e41a9f5f19c83649840429392d0c7e0c940c6a6086537514bccdd5f04747e5521ff2042be7384a865396375f3678e33af5de8c11255b3d85aefa79979cf9b5d38303e7f898780bb6ddd6df37d76390e72020625757c76f423e0e28a80123ff09b3ab77aadf08c3298b1a916fb5bee2cae65660319c61223697daad3e3828f8aa58eb162b998e76250ae80559edfbda85a7a72ed037c341e35ee1fe136344fd63e4b425421eeba3a5d66470671fe419c1f0d88b200852f4a5e962e494f376a6985a803ee098d2d9d380d42b67ac5dfa5ddc1c10f238b741c83d104600a099e072ad5ff8090231080a5c0a1ff0c17749c51ac1e65830dfae974e82ca896fd4adab911a1f2bc0b1482914dc5a21aedf8f29d098406ef2039334cd4a83a302518abaa59c125e74b2a4c28b914b42e6c32a2acaa2802baf0337881dba738f5e7f71517132e29eb3c28b5b16d84a31f196d5d8478f5062fa81791dd44f547d034a96330c41e68866044f1e1db6ba9d709c8519569449ca4accb933fd91605ef831e6c6382d707dc3e89ae549968420a0a69c2087a671ab8cd24c457a76e2258d21c44649a36ba76eba732b701928d211f1414968d801755521c50ef5679bce0050bfdb484f5c594495f4488d98bae3b24d57539c639bd007af8cfde1d6a00428a9e282840da547a44beefe5f87cd2b52809fb5d054dd7997913cfd5cbfc6a496ed407b89fdb3cbd03b1ad5c960414bdc3d6556e8b26bc65afde667b6a3a886f8ae989b03a5c7d90bce8e0ae464d591c4872810ca5111dc228042a38d2c08d020cdcad2956b439f6b217ef0ee46242a247a2fa58c5ef45c9b4c479d5846e657ed8a4f421c03adc7a9c8720c445814b05324ba6a7a0de126e6682dec2355c371e7d311384f6be97c9b85de7a9a89b01c6faeb2a53af7b71626a2148e0d26bb9f207e8099178aa46646e3402ddb410f0b82dc7780e4fb8f22b02e02158f20fae7f40f0f098d660abe9a1926d92ff7eaa004118a6f416708ff472ef3041537d77c6e33493a2fafc0a39d9409f05b399ae5caf59859292ae817ae356c6be182b0df0582b25ddb8a9c178777f350fe5fbfe01d4c25c458151a41a6f76714f713b0645d781cf54af9ffb33b6c14c7eada325e005f13f23003091f8206a48d96d156daa0204efe110ce177faea6799823137809ad6bed3f1fae74570a4034a2a0432c10479b02660e992564ca961a93399229d68c98ecc94451782d4dbd2111e0ab635ab5d10aeca54c25917a319eee394ef10abfb39d38dadd492364a532074724119eca9b352ebb8006bd1324ba1b834469518eb612e607f24853eb1f7652d27c28accebd6680e41ca6282a784052ed42db1acca73cb607d4de27ef0d587570be7a2b0eb2e5a315d476c63dbecdbbcecb55783890dd09ddba625a69420ce71be10423f2388124317b76d2163a1e9615ff7ee40a32d5777d7c78bde179d9d94435628584a6e2aadca06f5565ed15c5deb7b94d00bfb6b847762dc3af3dec99d0a757ce9762f50ca72d2885a1648464232a86730d620a5f1609480473f561d89540e06e6075b6fa8455a917b98ede88a2d7e2ef75a0d93aefee180b0cf855775efb73def26a43e4b02f7e9bb9e189a5e37790d9d6f8c73fa155aede15c4cf50ccf35bca543da0c035861af2cfeafd6208075e81e9196bebf33733a9abe65d963b95fb69e02d148361169260ebf5b00b0762a014951eca8dfffcd296fc62d707f3ab2379bf6d745494e24dd4f9572c9983480e774019deb2fc98c72f79244fafc55107bdf7ed6932afc9648fe9412d37077a7fb6855caa6a3ca06f4ac4f02ef8a8c1f4b8e426ee3136536863dd344acee0048714b4fa9e96e063c770986f58489648510d51a722c94b23257d9b6d39608615631c8874e4dfa94c8dce619820cd572395ccad879fa84778b91aa4a92c8a02324866a11db4d4bf3047f475321919dcfabee03e02c1b5127e81ee8953220e8bf4cd32ffddc97f4e5cb04f7d255f492667999195efa769754b0cb18ead20f7449f9b94c5c2e5d1f973487cbec6fe965b7246b5be6c8969e5e4b8aaa659469e9236849db59a666966e2b4b3a90651263e901b1247d58660e96be7f25d5bd32f6aef4335752762b13d44a6a33abcee2981152cc0d2b838b44a8baac980956d27095a95ba5dbab92ce5499ec547a502a491d959942a58f4f49254e195b53fa2d2b298795095ca52bac920655999d2abd3e956497cadca3d2f31fa864fafe7cb1dca4003dee077f433cd15abf5728db083343e474704a90f827d3870afa095f128bd1a19ac05feb5f1d47c2a20332b3bee73f281d0084c639946eea18a235cd1be0ea220e40cc06601f2a0558cea0c90d6471298e5aa970feb60666787ff8509aa120cacd145aee4570ea13ba5045052f5f710ff4fa1c449984d9e6413be181dff6495e100903754a8448cc266839a477ac05a30553a4815e431a4284e40daa2c506bd994b4d1074324f3c17b58ea9376fa739f304edc1ce1569d1e9a2735e9d2564b903055f497f36a5bf5599bd9a6ecd151ecab0a4915a9d8a5e28c82edb1e12f5612143d41cf000eda898c5e0ce00ebee6ed0ccb7dab5d37b7d45f141d786eebdeb3d6036db9f1cb00a2e322417d7f3bb936ae085d6b34e1c3b1313a10eef43c7bbc378bc9cd2556e1a9c101100df63c3b3c3f9dcbe94655b2a4c9c1100c147c3bbc3f9ecddb54d63291c0c1720c16083b7cbf9ecfcd65e253e8232a8da02f58baffca2702e5ee6c058a1755ab022c3cb209809e2b845af1e0637b60f56e29aa4081373b80ea23452a083247ec0d8e3fcaa316e8b8b22b107c5b015530e2d486027b442dea80c37d7b01ee2b22219afab6b830ec98b2ab5f154d8bc76ebc2cd5ed4ba09c2d2219626fed0882ff380926425f600260066ea31d108ab2e5b2a6d7db66cad7fbe189b413801e22106f6d3858223a20c3e717ff31bc8ecdf08ebd7bb03b0a3a9b0c95d591950bc12f65c613920633e590b8b8cdaf863046db7b8c52af3769b21d6c08eb767b554c5d3ca533f49ad0987ef25567ee55942e240923101334f40ccf4abe966e9fc59dc96402402af6899858d34339cb22ad5c4aa4a14a00db0f4be7145d1b5fd97f6269de905ea5d4c21ad5da8869caf6e7cb9e8751b60b142202deb3ea42b164bd62f7e7a80c2e04118686a1c35c22a01f0b2654a353e7905e21ce6cde76a911bb905c5583fd150f324f0e7494241b435c94c68584eb135a0201549572594b59383637638e209ef16d2fdf73821abd6756196ff4207db87cf5c74fd03f5d36cee5bfc231e56e47b21a59c956feefdb3aa69e7a81c7ac60e39929c064dddc9192ef74e98e7b99dd6faff577f980d23f765f7543e8b17963bbef776016bd0951a1db218d406509b451184e01dfec9cf49263be3d12326e0a2c2da54cc29634a05d503bd41dfa2f42e0d205c12f5b56f975473a2e32972962cc8ccba359c44dbc8834574568d387d815a6d97a109a7c14477492b2f8f69fe65f945400492b9694c32ac19db8d45d15b60751abcc455f9845c0447ccf7b1eedd012c29e6605087b2857ec263f0a1b30cfc7f3df269374ff5766b162cd38c46f265635ad154e9d915c25462fdde6703f755cd41c24f981f1c3e710c13d39dc99a126c62728587e0b4606929f044c18034c0c1cab3177303f8a1b1b35f1bb24db5a60e73a788f5a07816503790e39c0aef5c9270c9b4c882ed135eb8c4129eb3528ddbef978a69f4489699a5e705255f0e71e7f0f3e8f5514a527890bca2880797882a0d04e5cc6fd2afe3667376383a48b57365364d342301303cdac90b619e8ced40e5b67d6df0de953bceea180d050b7afbdf54620beca0589ec62586b0df9af741474e5ddcbd54417979ecd01583f3ecf5526757c7534f84005a98044eb04f0d2c0ef70abe482f35a4bb407cd146f8edd60a3b14b9588a3fa74cca877ab407daa318ce9c7ad5aab040a283f64da188f7e74ac70b68d87625770c9bfdbe1e21a1191d938137d7ac163f32f22f2c368f315560f0b40a16d34c905858cfae6592f1bb7a9ec28797f1ce2baf02c9524b0fe110601b3f290c23c52a2ecf00f92bca0c0a8d9c3cf863c8d4d57a7cf07a0b72ee00e21b85b040bf6603fb96ba7541b48f0b109cc942f24773ad4d1ea04837eea1df8996014ac939ab6c90f3cf011c3a2604d5e926304a5b2464d1a44e394e843d37d99c9c129f1c8e7c217be60b943980864dc6092843d44e93f77e8e53250d140d5f4340a61159026db200899111533b370c504638ccdbc4485f3b4d205c36e1e445427aa8d88cd9f558bdf73a4d188a2b6fbcfe4816c944b04910b83e9460ca6f11e46e0e04c7f2edc9b72b9822ae6081714be54fae7ee8a158dda15aea6beae1cbefccaae3eb6349119afe72e9ca902fd250e333ffaaec32aefbb7467f1142decbffe0f7bb9fe8b21d37f364de63ffd46601e7b5db7b1d35fe12c89c1b7030eb1fb5198d90cd70ddb52b987f82aaab57ec2a8aff9bfee90dfa527ec891046450ad1d8a1b3af7be114dc959f2fe7f4382b577273ff79080b73ecb2bc5aa93c347640197e9a12e932d3b5e01099b28fe4a3bf6be9703ce714e4e5eaaff590e1c63658d7f6c0a565b4f78882891affa366ae64dffcc613822712f36d781cd55f2742731ab2f3eea5aa3f32eeaf0146a7e242d405c10d83525ab40600a346ff35d1b52025a086b8708c00fa96078337de0b7f33cf2dea69be888f854e4cabd910f247a63e78a729c9b984e4849b0b61e39935b4193a85cb9ff5bc64c1c2c984d4e2d06ba8b80e2f04d0a84a55d272ddf3d23e904eca1981476843e5f9bec7c1086dc0570f3f99cfc102c8ca67d4fcdc695dfeb0f0b6be49da7a42d83764023c474ba16348e2b4f129d0b4a4609cf61fb5bee2a37bd7f241fba6bb3261543a3c525946d5e2c04f295a33884d6818c3af977f6b9fe83af57972cce9520913d285d3a3856275943aa6077d7077c1c9172374e5a630f2683f233c60e7a87401cbe1b152098146414c55ace14268b85c08d036ef684dbf6c1687bd88878245cbfad43c64e874e90f0597740cba47b9361614648932c576ce3e1ebeca1bf13c5277396f4b3017dd0b05a0c7e93a017112fe6596ccb34e38b023d39d4cb4ddd8be51ec48e7876fff7991a937a0166fb5cceea37eaab93ff1d613c86ccee776afe7b9ddf5c6fee61b98c61870dc79ed581998501b9487cd9d78ee5ca38f875774313d6c32dd617460611bf3e311e1f3a9c0c67bb20734b3a9ba672da842db03613d88bf750e0332905aaa28d6a17e5bb2abec2139749b05f762fe314ab5a336569ad9b24e80edde051e30b9ac40a0911846b580558264f3159c5aee8fcaf09dce919555f1fd544719404e271c62d6ef5c458405e7400bc09ac828996956e3a999fa1d723013dd0c5985ebe25a6ff6711d7d5781333499fd7819129af6905217aba5c83945b9a6cbef17800020c054d181958a47be789427c18124ce40691c0754e6fbbd85364c87826c6cce7817918ea75fd60883d856b6afcc070053afeb546d73cec46e75a05104cb6f5db4446b36565a80e28ec153eb4acddab58f156df8484f2653fe09a4ac94ce416c5ffc98ee783498f77c7c03dc0d76071f9f681c46f80449ffe8c2d270f6523bf8df8b3e7617e008576338f920703cfe56d89c4f2ee59aa8fab242ac635b6c2b365b738bdeb8b29fab4fd43a038cdf250b48b72f323f17fc123d14c04370dd6e0193972fdfbba5ba1284cb06925ec0d89a1c61cb0849939773516cb66ed5184a6ebb41f0b1d0f26655a364dca22459f12ae1c9d1b2f6dd430e90730f15effc5d4bbbb6c41d739cc519849efb168e16cde7d1921fe176df89df65210f7d309acf7a5b6bc46548e45203d7fe9957ec854565b05df14f24f72bf3ede44653088bdab28423fc74b107d9bccb10ab065426e704a62b42aaa21413a2e0cc516bb4e3cf260be820163f97c0357f4fb7331afa6854e9b9ac65c98919d91a21a1bc42a30ceb19c1181ad8d4f0b5bd2f16f9f9acee37198c60c80f7dfa59d05966fd67c1994c0c15e649f51d52bc17b020da7f02aff219f52b3f4b51c430e548ab05054407952a5132dbd1d266f82c5c43c99221d082a777d4fb4e0e46fee04dee1e1ab8e5b5ff3bd54fa3fca94d53d8946b1f1e035c36c4b44723db98fc9326616081748dc1eafe05135e48b45b76aef068a3860cce9774b3edfbf52eb88acb4b54a6e298bc273eb8dee79ffcd3a5ec5f6f2529268b8305faefab4d17c2b78e3923cebf0ac5815b7797359fb124ce9fd9391316edb1bd2303f900d8c1ef196dfc27cb0ec4fe16a8247ed57bafbb6f80dd2e2c75ff3709e98d3e9e9466e77f2c56049c32d1757ee3a6a394419f6a6e3cd7cd88157bec7cc3fbdd2690ff370a217da9c9b6bab8ed6703290506326ab5ca08c5e416b30265d611c39c06a4583b1074d851763c3e0bc84a95baf0c278c611630102c54947e0e11828a5f7f8cd5fbb5f8528f919cf7bc7dc2d70ebc0568ad6964c0ad4e5ebb0b88f025928dbed4a300111152f1da31d0b5ea6f910459f19c5c3aa2d33b91d885fc93c4fb6dfbbb5573849392f1f847087c8fea4984af5980051e090d6c8865f0c44e874a98cc35178b4dfeb1ced72d2a486fe020077e106f5a0930758f388df8bd039d88e1738857cbfae3ca5bfe81940dffdbe9ff7204c2b6637bb1071c8f894b2866cc901e4c053f9cc62d7d153e54b25d6cb9634441c3620418ec2eb5974ab2444cc386a8becba7c6b2f14c2753bb91e5f4fc78a7886cb961208867ab94c282dd98579428e6e3c478f9195f55b229a1bddc0e883158b6401ce420c4d8d35726af9209198c17ed2a0229842f816bc849559213fc175ce69cb6d1ac4dd36cd6cf5b82cdbf9dfe93a3bcb59db774e8ffb1f3d4e69791ea189c2352422f45721d7d40dc5f285c0fb8eddca135a3c91c304913c53e09b5c554d76e280c10f6b52127681316a1c03c58bd63cd03a965715f32899956d681989d8085cd50ac9e9dda0779e7cb8924f0c048637083a1f6479f943cfc4b942b90e371134ceb44a5f4f7d613e4caf1d10958286eebe281738cdf1d195eafd8c3ad277176fc6d78b2a738f081654be976c9bca1e6a95c0e5d466ecf313f117b1148b2918ba7a4643356c3d304858f16c4b9e6fd7456151c0b7ad92cb90072e569c53e2e85da466059191163749e928e3bc7ca3293115131756361e6b32d7312b0fd6a841ea97d9290f26d470ba37ec5d736931a48f55d98b660ae09f77677ae582cf25bcfae82f7564810b62c3260feaf9bb15beddf8056ed05b31c3059a4b3e5b01d676bb1e271ee8c704c750120da0954f09958b26b582d0f45edcf9fa2d4962d14c4b53a19f19d9e7770ef7e8bd7124a22361c1d0787458d32fc1d6997e388948ed6659dfa58f40b8972a9fc342403948d33682816516f10e118205f36ab9edaf24e52b627700789440427e48773fc0312998ebe06680632959b678b3c8482222bfc2b758ec6b022b4af6cc53ff2cdf1de0093da3044585677629f1dd1286bd74f58739d30ea6fb54172de5bf4f76df76c33d2a2927927d598a93342e692c438cb532b90f335c686434db29f4ea10bae6cbc5689610ac91a5e945f1dc61713df488055f9656430e8bee3b98c605dd5a8e9dd8c1b956d4db68020e33b27417237b2b4b87e34ad6054cc648182634eb02c3a73500c20738f99907f650d1f7cb7fd246aee694ab823ac801d7928513059402ea1afd520ba3986fd31cc64d1034a8559e7d77b423a8da50fb748522684442839c5136f15da740bd5951e800e706d406eaa4941f4887158ede29067e6d9fa840ac32a71dd04c1d433c679adb8cf83e3a910f2dccd12e33a6f8bf2b7356a1e442b2adcf10b4184d90976597f5a8b2b748f39f2708f0054d65fcc1549776adc75d694450aa3ddd48356e211c2fd00c241a9f75441ab74ae4507688d7275aa173cfb6ac6ebea06dea728b88d432fbcb1044651f85582e63b43aaef762c621988f76115af2c7f93d81a033511554f31d20647a02833695780baca5a4ebf1bb0ad31605838ca1a2ebac5b05bf8e77081c32337d3e999420cbf38d4fc143ffcc6d951c5aa0f3cc9f73dc87ce48f308d8bdcbab52d424fc8d590e72b8753ec74b668a5540f6fe4a2ac1086bf9706eb46f44d7878918f6f2cebd54bd21e171cde851a4f23462d253314acb7e5b524c05099aa634ece8fb012838cd89a834798328a5360004d6c02e089df5399a2118e1415f4442f2ea0b0719b7c9ec3c8fd48a6877226cde9d51249adbdd7a72f8b314795653682d7f6f8ac17b2d326f96476e05d23ebb5a1150237b783e33561b000cf99d831387fe7451eb5dc54e6fe340cbead0278a2628d0ac02a5ade97232ca1218b93244dde52ccb58e8e7120ee707b133a3337e67e83eb434c7eb227fc74d55cbb2054b68c49cda847014867621bdc48af7ee4303e3efaf7dcacf683978764cd412fc2088fdbd5f8496c67a4f3e832e1a80a112b7298dd372a32324170eabec731122a970e8d91315af01cb847a8b7f65bad5066f08471e28bc8efb18707195e820229ac5ae42ad93662536b2e17a832adf5c304485f9f47982f0050cd905cbfd28686a0650779f8263a7fcec9ebbc5c66c18351b58094ad81a23583a026ff735e88d0e854fc5898acf06e81b613ada22d25313fe41a359c845cca9decf52fb57a856e6c577e7b1ae2e5ad4c65045721ca26c49ef040f8764289f06ef5ef55b39057e264d3d45c527b3e1763e7942ea04aa570a5662bcaf16c66eb95fb2bea95062263f28c6ff0404e64d864cf8d981e2114fdcad7396911807e2f26e05983cbf95cf83d21bd107fabaa52c0029d90a0b42500c58fd8a133371248b282d4600c1c260e1ca6381ba95a393e3078eadbb1bf703b804a44fc008223e6405530c0b0a9497d3742613774731f3413973a43200bd3613d9d67caf84fbab78bb6351beb8909401853f27dda7c91b6a0dc7ece190051bcb3a808e83a690a19f1045090e2fa8ed33e55e7d38685aa4f087cf84d3684b60c6fa44fad383f87b2ae1587d9c1abc9545bce5bddb08ff3c7bfaec76206b91ebdf9ad78c46137deadba71aaf4ba0530f9fa89d8784fd606b1a66f7f15d652eb72f20e583eaeccc4c1448c5fb64ecc571e97b98222ca0aa30f1c04b5f1bc28b341bf0d0cb121e106e6d31c49fc2eb678df39e7d046c686a1b6ff089f3fb38166671c53ed8f058bb75281598e0886b3977993d054c31b3dfefffa1ede2c28b6315b584d6f3197b61ca680c9eb056181eaeaa39284ec3cc47f13d5b1aeb2e4afd0857e314cf32e337035a51645b2de16fb9e27193eba81f90adcb38d528ce5fc4d17ede182d7196495052ef73b1ec649c4b11e9264f5e1ed932114b2b80772712e046b39027f2189e540d8759de8cee878cd8c39d3121af7a7d4bfff3a8ca331291db1a008e64c09b13070542a797303a3dccd4705e6250a859fa0879e41e52a1574a54da91bf4718ce557224e7cedf01b535cdaa21b4a98766184b24bac9446ca35c5400c357de876f923e3d421feecf519241b46608bba1e58bfbb568e3fbf495acc1dca7ef866d5e5cbbf9bf0fa66cfe70eb2ce8c98f696a5200f2a14d44390d5423233275796addd90296a7ed3d3c157c38ca6f28c068310a1687b5f8cff9b0538dd35f300559c3fb7da159afecc431480b57d383aa6bedbec86659c812c34bdcb732851b535d482542e881f82bd1a83efc10c419eccd1f699d36e9b30740fca25f81f325992d240518c2c27e06d406802d1e0ea209f4eac62bacb6c143baa82c3faad02409b023533028e206d287e064844b1a0f17920b224e7405e1aaa8818ca09c5f0ae21499ef8f411e00b4fdb465f87c00e497e9d02d7300df7c77266788e155d19e6cf188dab87a05f1f5c32084803bd24428601a290c221568f7246249adceb821dd6034ea17e192b7c4c3909480d6f1077798ca9332b614b5fd08067688fe4ea4bb60ec5a4aebb324d00b07958da3c3ac0646b9f3561bf9ade75c580f60a9a6baa35e060fc632637f81088076e5ab1c3884200d1a0c0b2f3ef7d506f7c67ea83b778c760877e7699209d03e8557000493f9fea0ccab4f41da08a2ef125041d0f49e4e6d67c5d742aa9719ac70ece730c1e6892d9bac01ccd05e72c43e195425cc48fe001c6c4c469670b076e7909e4b0131b28ff46820c54767683a52f164a6e482d34dba1700cd881291c6e8300253cf10ff069c3a43cc74cf7be0db2f9b0c1195c052288baa51fac050d4bc69d253af5fd06cb475b42c14e082c98de1a318480e6b17e2f071af3322d102f6c923de75ebcc92a60fd4e55e4ac8b85d02008cee38b1443bfb58904a081e4145548921315345235dd4f48f4e1005133fc4b5fb5079704348bc902e012a79e741c08050c3fec80450b194e4f04fc5fcde32886061729bb4c796fd8c329327873113c18038205edce69f8d9d3adfc32771e2555dfe21e53dfa11283e7e06aa48e9222b31eb80e4b4f24a9dbbc06b3e1647f87924e6da01cc7be6504efd22e63eef23f0a7e4e8c85b33195ad5164fe750d952c801ebbe4b0c149570591f950306c9ef156cb6518eb1c49605533289abf8a82daa312b28d2503e926da103e99c82fa33e7ac44a72e6290943df4e2200ca3f363cb38f7b2e0749d5ef5fdb1dde03ac732e26d1b323c443914122c7b915c65861155cc593d56a937796abf263206f25fef5b29341c31304d89dfed2db9619bbf9ef2d04efc494ce5a324ab398575924dafd1b2e79ec0c6326604543639d89e4fd89b7f6ecc9e789a0182df15e54ccad3231986692aaa8fa46d052e183c0d85a74948f4b2cc4b1b4e8709289236f45f35f037d0820e743818bdb5a5f3c9c2d84116fa941aedfd8a194b29746c4c41b67d780f8542f005b1603d0e4d19fbe73bc2f2316a0f4be7684668756aad5fd72a8d2e8809d6e449fc25893e0a3f53e09042687c1f03140dd226f8badccb035b1e9f7c54cc3f4cd4620160411af70ba26276d5e4c22ca311e6b55a91d88f57ea6364361dda771be47912038f9c03007702b78be00460b9988ff187df882a2855e10e20501510b2370abed4e2644532acc72322cfad12b9644416076955c1e0a0db3174457b6a1a3dba4496460c85afb9d1d86e1241da26c0a647281013204a5fadbc0a544a746a277174392d4b89c479305367378db5bcbb82f47eed3c0e2f478992cec3a0578a6707cca8129373c24ec923c2fbc91dea8443d651fd2524b80a0e21e69406d1d1e7d751b035489d11a47cfc6c8645943a880fb705416351b30a2720c13b4f1b9bb90cf0d8c228f6c9c1b0b004b3b8941014ac121c12da4662de66b45d15161db0dd939afc1ab0efb6da1de92bfaa6f07b054af286fd8f9bf868ae0fa371defc3de6eba033b2c3b00d41d3338e0f044d265d06b37048dc63d54ffa3f4bd8cee44f30734cb6a83cf9ceeebc78a554cf1869451d35b3ac3193e50d0cbd4d1a32b2bdeb8fd3c6c09451d87d5f4108106ff20d273986e6000ebccd0263c1519544c26af64723650703901633e932eb3bf3ee2e8aebf614ea4d2eb1d21e46f0082d5fe22b415e1b8635bb3792c31d3425450d5ea0f3abe0e41be97bf70caea098bb9ed426a229fd6e69fdc6753b407bb5a1787ac229dddb859caaaf86c9cac4fde959c4a67532dbe0f409dfa480cd1d4f039b3cac909441a0a154a2b04d03ffe1f8c5f6bbaae1a1f896eadb7b9b91b48870ad1563e2a60860c7ce852822e96f68b3223d5e2722a9b32e332bfdf7de9bfa81ef21d320e9dcf415e4bfcf56f41c3b8af4df1d3c50a624d00da1758ec0387b79e3c27e40e737b38405c61f65d9b30c8031cbb796c5d6577d16992dd9e37774568c48e1c7c63bf60ff51a9e0ef7c8b40771030f903da419c9b8000daa056a8fff283cfd802ecfdb202631ba949d0acaf254a3e1eb4cafcb5d8764f462d918f255b19b679ae549ef2c546e01a97c3a23174236abca3961b86f8c51e4341a02738997a24707a5f872bbf5eb0090a7f1e9cacd5b0e3c0a9b9c16a2f74c74e67a842cd6009debe97a0dc4e514e59d85a2cdeddd4fe96238066d16ae273de221776f5f1482d7ebeab4a69acfd1feefead1967fe54bc35376aba2153f948a470ef71039d74b90d6bad011a95f2cbbbbd6826329169e205ee94458bef899a30c1734a6bb3114b19ee36c40602569681b4039a55967fd55b91e31a370fd4a922b5e485f5bdbd4602746e16d6240e3214393bfaf5e0a850a46a2af7cb288bc90f732c7b0fcecf26c11e08e365e638ebb4b840493be9a333b5392367c5f640951b9d2ff960529dc5420dda044b1dd3faeae7dc80a60b98eb84a126bfc0746a24bbf4fffad79144b0d596145681df62078729f23bfe4e5a2188b2bf80ab94d77f4b013b1bee4594111b77993da401b3728212e122cef8445855fb5e8a134550bc68e04de17868a73eb84f6ecca3cd44c99dd2d08a3934f1570aa573a3e7b2304a7aa80f8491b1d919763481cb977548b1ecd8e31977becb499670880090e08169259fbb1b30748e80494e4ee046c301fc3884faa021ec236182a3ecdce88002530c5560d621fc98bf3a794a20009d84912f8c06c98dfa6b85c4aeb0e6cbec58c237c441539ac4f2c3207e928327dd894470f7a7335663a88021703420c963bf1492a2cb9e35fc9d633a81e58c9ddf4b331749c24906643d8cec2f8aef494101610dc03b79be8a3d11f931d74caa258643d37cd4862ef7991564c507068b1bbb5d9159d6d899fc7772ff1335d28bde9e02af760fb00eec2626309a77da3a6ad00d48b78f708a1dd0568d6848965daa38956e4cdaae1b17ec12974371a8a1daf5141d2c5dabe9bd9d66658a81153744200e8517d9b5f29d78d42bb1ffb94668dae373694ac90823ad7d1240b72f8eb23ce1f832c115778ed5f089bc90ed2c1f40f3a86d5ffebfdba73a2495f40b327b3bd58e66fa4343285c85f4d8a0d914343fcd9ab1bb006c465161741b8dcf3fd762629732257ce69bd65889259ab42670d44121417838e7630b315d4c4b168108f49a7cf3e738e463dba617e718b5f39e0dd679c9e5110f3187527c24c9c45178bda2329656b7d19aef64d3493557b0995993e4733e9739b1944a254cc78dfd6a090351a419ae68e2c8b310c491e2d98ae90c3add382e94111047839f8569b4937df5169496047681e47e956540e4db43f725a0f621b6dea1ea7535f6d98c23da2b7f1784e76553674716020badcc87c4f3098573a98504a21f6255b570a0bdc8e9d1578ecace1cfdb205f9e88fd4b540ebd42630600201f3ee035f77952787646c53904ab340254d6c4c9b3e5653b7f7921380a99000a2e88451f2b36107967db80efa276961301a70179301c7a2c3a83e3e74890a7fbd5f8c0f57ea0d26545c24f57991d8f97c31aadf3ace3edc9496681a3af0faa2699ac8236e7f5fb1e6c044416ac535634d2cffc865fa0f39d5f5bcb4aec5da5f6db0664e8b0809741ee0fd4e271afdca4831d625bbdcf8114c46a99e01cbf7a2c50bf82b156673861085baf976e5b1f0c1c20d2404c1243fd12cdef725a732c9d0761c6a93986eba1da5eded9ffc8f563248fb17500f488c2798fd7d61048623696c094dcd142a658bb5952783a13d6940d337df060100874bc75763151c2511394eb14ca104ea2b2a400d86d4f334a032be8e17e17758ec2541189c87f5da606b4c0361ebdf930ab475925bbf67bf8541e98d2b25afa978acd8922e681557bc6b57cd6a356fb83cd03e1162d384fdc4e53b0451c35528c10b148088142130d8d7056f51ce470bf61a134162ccced736549c570364966b044148b142d1076e603853aa48649f496aadfa0b187f351e238e495f9ed04681dd3cc9deaaa99f8ece0b8698c4949e13493adbefc60d0ca0f26975f3d58485cf0999120abb6b47a81374055cc00538258c0db034290ac3ef8ea7bd385672ac15a58b6989a14ddfd69559fc61d8c8ece4461601753d5f57007b6362ab389a4110033e3a7a4a4662ee62f50fc91a97f4b8e447dd5a2468e24eeee655a4e15a60a7252404ec7b30a915f058815c2173712fbf4e864affcc98930843cd49d650b083b3fe5752e0575912339473ffc40a7f1d66410e00befd0b42e07c3bd35635fa275a4563bdef57bd3516e5233e4a380489a1cc03721d44a1e724feb0495bee665502be87c6a9022bd02db19c8c8ad3f4c78277c06e2c5d2a458421f50a6d5df35b1f9856af84747e88a517efb75b436a45f1688111f1a7a5094b99a9bbc2517d63640ae3a79439618ba8354df91b290e7740478a2f91ff0f7ac5ef296f525ce2a775c1c4de3c5a821b762057ec754bd4168ed4ea6a97ce97a973dbdbd46723fbd9dc7141175ed03bed29f54eefd5e0de57528778e41b65797531b8bf41bb083c74eab1085010bb3b41f446e30e4adb1486cbab63c2414caeb84ec76142b095201f5523d8f7125e75ed5eb046e53c6692ff9a97638358d68147b025f34a398b1b61d4f1dd599cd306042ea615bbb53dc8840f156fff3e8c4282f9d48f31ac4cfe97822daad42eae5e00f556ff1d6ce25b13ac9cc40bc3605be19735e81761a573835471bbcd53253e0dc63ec18cedbb351eefc559f440418d79c80f3535db71df2304bb57c0f84f92fff41dbed85e8b78a88be289ced72549ec7d313132f3358d297eb7c6b31bab84fc7443eb50f8e738e969136bcce4876f2698bb4932f6e749f79349b99034520104b6f694078e10ef76c451f8455f221ef837040e2768989ef645d125c1ff73d35fe9f088b5779948d820dd2bf0f6536f731975c7c9bc3582cfc12e0fe3341be813303e27e24a0607f4f76f9bef81820edae99fcb476bfd71808f7ec4b3c1a84e6c08c76e92e8ed96531b75cfa68b9a4aba36ec1da1b65dbd1b18c2cfc71de7dd0913a98f52b25567eff38a120653582d18a069f40e2885d28fbbfd41ba2745cdd009e0e48fbaf79857441352bbec710a27e79500c6dba382957a91fbb71bca5fa2eb05af6d1c4368c936f43a1f9e7a4f2e913950f03dd06942372ee4f592dc80b273c467f549733f9802c8f8f94669e0147a18000771d71fb7729844e99b801df90fc90badf76434e324d3441687337b921dd3d8f4f0722e4a26a03d46b2a74054d3439455088e76c31c699a87783ee30ecc7365826207edda9fe97b3962567b64ac1dac3bb33ce86f831c2bdc7d99165ff2ac450a99bd34ce49d05ab253b6b938e459dac58eeb85caa8f7597beba853d89b0fdb201d173b2bb953b09552333505af9327a6654b9db445c5b38d0ca44ccd0145e76d387b8ab4af5241cf798a2e42e94dd5686da68f699eea7322ca219060b2d1da2a994b607d14f8d92ecb507a1653d1349517c0212d913de9988826da75343e3fe2270b171643cd4d03cb4f64b5794ab40e9af7c6f5ea53fc764e216c1c516b995352f2b1bc8327c7b8142e27c96601a78a5331bba91fab7ad50b8321d094d0dd8536b395e727dd816cb418bebd78c7141ba2077893574392ebe7719808ead7313266572cacd0a199ab3c1a7736bbff90911533c4955369bbb291ef9686c1151fb77a6399e80511957eef6f40efdae1c1c9fb5fbe423da347a93decf358a74668d67eb48e7ccfcce06ba8fe90dabf3f507a96cd141120f771352c2b1c5d43b11b7ace03d1b625f7973e2caa7d48dc86f0eff08c4bbe337a5622db7b9decb1abc60da5d501e86f37e26b0b1cd7610ef503f984731f62201ececa0b88a6af706c51522356921ced5e956ae3c0280036bb9d285ea0516377bf99758755c2c4ba04fa4ecfa56061339359cf092852cb3124f369737202fe2b9757f94d9865c02e1287d654ddb04b875eb9529b75c1a956239a02fb2c3a39158a16bf6546da2d3fa5b232cbb377563137648c8285af88fcd91debb686946024acbbb3af169cc9684608f102807f6dbf616be18300ea00a6042ef4165f36f248facb3cd50e5173194a77800acd61b201d3e6dea3cc1213a8faaa9e4fdb01e5960d00f31f60068736b7b1b1c57036c10d888aa58f458ea41fff53ef5f894ef6fecc32f6dec5d1ed20bfcf6cc71bb551133252f5cd2a4e7a57d59e84e61672992f9b692669b2430e0d0a76e92e9f8680a294b99bd1afb5e6574e9341cdbc2c96d71fe14853d47599b27e9db67a4e5ed712dd22324d542a6c37dded05021f16652397f20a0f92f1dfb311c824b80ed918cb921362a11e4c66adc33b2d2e06b2e2490f21f6e141f7263aff149e7527639975459d9046ab64e53a8e9724723d66d4c8df0f2c9ba32593c76c58a6d6edf215b4490425f1e8c202aba3632edf6b1d24290c453f3f34f930d3e8145bf8d21eb2db4b76c7d95dab06d5a650fefa80d91ccd1e7c499ee745d3da268a35613ee4d27d3a032bf120804ebe99a0b7dded54391ab57363fea65c9a539b333787fdcb52a9f8402fd7c87b4b136e45a37d569920d890e6403454973970d0b56e9c5c370b219f75b7f5278e4910ba7a4df97ec4a9d35116648d5b6955e554c6c639e55c0640562e605189900d9d871ba962614a616d3b1821c18bda07ee2630b775839b3493bc7c1ac139a6baf666a34c59f25d8d05a26da76ee7756df216294da2d978a21bd71afadb67a6997c270e632361942e8eae77fd4b51d071ad1fde0bcede7a6f2cedcec52709f7968d8ef2c6636746cd10d44d0b0192e8411af675399a22428be7fbc2519b8792f69d3df4dcfa24a421d99283e4db6a90f041f4e808e7f37a04db264182553169aacc151907a20549241a98051a5a4db60218256311fbd926a91754f6b54a8ae5a3752eb08b64bd83d682b5f7feb5a323f2975a038bf7b22753231fac952cd8c719196e48d2e1449b06019b51a6f5f9c1dbe68f136487c8988e199dcf79548dfab8fc91cc2844a8c68c9f709db270009a6f9056e91e4e60d36bb52109c622f26c509de240fc004410cc5c66f6bbe0cfa026bf5ae8ba3fa51532ac5275f009caeb1512e7e6f62fcf541c04a56183f582286f1efc004c65576516be8f1b7c21870e1c51c08416326bb80c34af0222d0e40bbc87f218e563f4de06b3675c5210fb4eab4f16062fa399c8c4109f3640559757d0308d5802c154c27d6e5ffd2507303bfe4804d9dca3316d6306b9f5e6596c6c033283b94b70251720744f2bdb132d950579992220df9a3620ffed00a26ca01d69ea089bc02822373b5b88a5b491287108c170d2e4f35cee5940b279543e4e17d3d12503c6454c8f07ad6010dcf60d37c30cdcfdaf5bf934a1921ba08049e8e92c04b4c44357755f024cb0935b930b46c7dff9c90d77b372b45c3689d9814d30292ceb004cc1e4d9b022ff4bb3491921cae4998298333c0c8d45883b2fe400ba0deed2a5971e85d71cc4f17600cfbdd37de551c4f891e5f167e4e00b90803b94cb7c4b673e5355a6c7f911125ef8dd68524fc0d466b4caf55b61b5ddf8da950431d38cec956a7ee7acd7b5ab2ad449a336ca35127781c39fba875d3d6eb3be2f830b096862fb0b47a7645daf2f830b113a1018d544721b1567f8d5db72ee5b7c748cdb2dcc74636ea2ff3c4cf2325851642a828e5c2759d62461d871188b6de395b500abba369806425a7e0c64cbe58b55ce7549aac7e61fe9283d6a32ad754ecbe9b3c595bd8f620e2f88c161bd35dfae0e4c5d63224dfed53fcb09d316db6e2178a73e0f88ca2dc04c6e9773aa3b60090b55288b21d78ec7a180b57e7feca9ba04043a19c9503a7d85c785fa123537f2d771fc1e9c495d37e445b9a8b0cfe3320630bff632dfb71143d9f1e11869993f05dd0dca0898625bd6084565125d9136ec605b9a0b0af941385ce30891c2a1699c42f508231703a08537b5d0ec81d8a221623429c4471e2b9c068a51c86d478769a1146b1e79223ade7b7ca464f52dd7e5cc16b54f8b90f72ce9e5a95a0452965eb2ad9a044bd64067c7dfd239f2c0575d7bc7178f32d98b2c55f45e0385dd2fcd64dfb8abaae1661caf4d52dc479bc2496205f80d04cebdcc55246e92fa13cb93159f35c8f5e5b4d875e8db266c21aa389c5e1f6502c45aea42383e52a371b07dc1e2715d2872732eed190184852cb3a3715cb752506475ac857ad66e87fe1870af34068ca3a367af3f36ee405d34b93928efdfef658ed390dff4c1349d2751e515d9e59c60e7958baf542a9aa227f96bede7da929e6d6f1bdd6a89aa67950fc52eac6da7d62d20b9393f831692320e9047b9a58e0ce27d558abcfa3745f17956262f57d145c0f9c51903f53938170032063e2b8ad50516e0e1710c12187f39ea33dcdb1e690dc770e56e36a8850ed72c9c7a1a99e224130d18886b335146c4b932c722a173f8b3bf60a2ec699f4792b88af02da448e9df718e7b6891ccf0661dcf7b40558c0818b1fa32cc413a11660a6661cb0d3485adb9f8c3e8e2a8260684afc0f462a1e34cbe0aa8e106af9b77de307dbc8bf64a4baea295a7737436a4492332815450622d08e69e020bfe6c778787d253dbe5a5f176cb094eb9969f13dd2024aefbec2737054eb18b07e3e0ccfc6e4c63f6a51bc332e4c42e82b16c7cd219e1bc54f4d58ea9aa682c72f4b9a53422be502773d712e5d88e100457294eaabb34f414610364840095a8c2e74864c9bb1e8e4145db60b9ca3a34e32d3d9d1b06d61686eb313c595eb117ea1e06a7dfa591a040da6afaa6c29f1c4e126703f33c4d72f54f4dc5fc1ae520d9a0f2b5c31d94ca9bc74ab934dab151413b9285ff79f0724f313095f78b883a1e22cf3313ce23bee7718665cea65e67a555eb4e6ed915bbdcc01860bed5d3b90f77f115f0f4f5ce2fb97ddfdc10068e9c65ec1a38f02b77773aab8dc5bf0dadb6a02f8e9138a9cc14354beda95252704edd71a5f25fef38caee266dd9b4f69e3fd7420cce0d05f5ed106e80f9789bb8f4efbc13ae8d8e90bca90f1ff7c80386eb8c4c873d07ee094ea930f684c6c58aa3fae05c0a07e69bd2e0876cf444cd64dcd92f1ce4a2b8e994056ce3bbdf7347a5d00619dcf711588799f0bfc0511ce11bdcb607a5b995d3a6fca90f8423f4030b05a4a0b7580a062b11416e210c5c5622516e44041b07405167888a0b034450b7a8030b05a0a2c74b02260bd9658e0604132160bb4cf9ed2a24a1e8387cd73e2bcf1d8ca036b8793c34229b290038584855272410e15066b5772a18305016b5358b80305175868d07e2bb935081824705c3e2f613cbceec4f3960cb077c848c02e8eabe03d7850b00ad997278520b2901995c8af2c47f2e0c0c928175f598ee0e103132c955060ffcbc2ab2af8cc7c2bc75be75ee14e29b46d437b4d5f680e110cac66f6f5b93088320423cd02b7ed516824fe48b8ba301f57fa431bab1fbc1a10beaa9c17094537cd37605b0c195df3deba4f1de1079b1c41b01eeb6f912360ff21a5360159e971c958375f77aef3c39a77767f28d882c412fe0273e9ea78e97322d35eab4e923b055306d2f20a7f331ee9b294a098a59d3bf9202eafd1f77b813e9e5c6e44b99b1f82df243621ccaf3bb527d65783f814813728a70d7ff8213fbd2a8a039a6d787934c7a0fa7c433cbcb97d34a8ccd6b131c4f7dce9f7b84e763b5fb5005f1a61b8dfadb791a373963b50faf3e40d59a703282f3704340a7b2128d2b91ade11d1c2475c8dddc338b3fded1bd8052edb8940fa31a7794a7cb44612e2eb2ebd0ec2f875b8a590bf4b7fbb7c2e9a9ddc4cc94c27a2a62d2f0b8b21f09292935daf2315e70b1fdb64874aa8ffc3525d4efa48b672e08da347a1692169b39ba3358f19cc418416398ec8fa8b32ffecdbac1e50b96bfe16f4e209841622cd840f54347350e6236c1daba2ba29c62b6d1a18ddb0d281be9e39189eb87261f43dcbd7a79ad72f76641a4c60a9f6c56e5e971c35be68d627a8324b0c6ff74decb23a33282c3d15bef82e7ae641f3544f464efc61c2425afba4526c1dcf4b822c774a20a7063398337adf1b74731545988707e557f7f56691d001b06a3b8187ceb5c421199c3d8b13b6df59c82819b10869c334ca1a4ff686e97734433245deb067117a727be30367d23188f007ccd24e1d91798b82fb6eb3c113083adf27bb74ba5804bb2800d211ed4822a4143c7e85aef10f19b4316fb7d1561b4c55e4f39f993fe5b65debc13058d7f8d158d99536a3b801dcc84fe68b09f6d735a572cfb437074037c64309dac628785743def21b9505602dc2baa9d3120a4893712f90da1cd7677846713ca6b9fa4db94e8e3f7266d7b0730f431b599dd9841063e6ef6769bb7d35edc7bf6566b1948c1a9b30d288ebdd1e4593904a63769719c85ff3db2e09e1cb1acffa8fb96bb7bd54239a99774e7e2cc24bd7d3de891ea2af279beb9d578a1e3f637ed72de02962746010a94542a056954ac852a9217e03427dc7a41dcb781e3862391d392da4bea294ee41392777a5a9be28deb28c6da727c8c54bf5fcf572fda941b0b7ef361c83cd353d613bc8dab28026818031502a0bd17a96b40514ec06011c0407253b4134b6f42f833fe6ea45fcb458d080136a2c3bf1021aaa8422a795db22abfbe888f4aca70ab4352b2eaf52b249877ad8243a76164a36e0d5832575888200ab41f7cd6754446c9f4b45f1e23b1672217afd1932a83a0b5880428d4899a783f6ab018898529d7c0ec05f8e72a4d0acb5a61d8d9a4a6286f8503fc0c7b018967d2c3f1025050611a84819e0e5528736c7a1ad385ffdce9332d576da99fa72822142f85575215b257c5211c0665c642749d16e8949147c370b979c97c49a1a6ebe85622466ef4e22368211b960e4643eb39e4f7273efd28da15c93ce2e6f9e8da48f9ca8a6c80de41b6b19ca0c76064f921126ab1b5e7ca40c41c6816812d80777a5721ed52c6412e8d1bb057389656c3769cec8ab4e64d29382de904164ea3c1631c9db1a298ef30532bd262097598db5a94db6e063d98cce17a1db06bd8db901ab7122ad4ac6a3eca7a42463840f6d3241d679848d3bfdc556740c4af3c3368dff54d5565b12bbc83ad425bf701c9c1b3ab061557457a8298c57abff242f889fe1db97d16eea4b849872cd6920440c396d78878f45637026601157551fc5598de794aae544887c5bb2dbda69b6ef4c0a3f26c930c8dcf004470fb265227877196ce82d0c9672d093626d9c0508146b5589858cfc69e5f7802ff53af9636abd9e873e005973762874e5dab069648068515939182ad93678fe205af4023f7e4d86c81cd68b8b38839333f7be815a5148cbeb40912120463f50949e8cd88bff7b1e23aaf47063a02099d738e9fcc8f19be19d8a05d3cfc2092306a36288a7b6c87fc13fb15a007c7a5723807ed8f3875676c72655ec28e544f085c95c33ab0b4e27f92ccc59c6059f20bce116fc756e88cb07d27f581e366d653e355300a5e5878597e6fbd91295292bf89bcfe670eb7c2768e0d7314db294a0791a460dc338123124813924762e523598e1a056a1b12a78b5116c3824f7b0851cf88b33ebff0415c5667e406d97a30f172b05cc6f09923c75fda1ee54b2cbeee5e816b960ccfc07fef47634ecec55d9ab93621a2290f6b56eb0386c5850dc4a66d8050b955614831dfc225e8275fcde5fc6f2d659047c76c3bca0164ee3c41a59db28c913b63ca6e8857d81a404c4ef92518fc226917ff84b42d1ca924ffdb3e7787db6bf4429b8b6290088b66e67376729f9bd05074cd4a4507021c7825c889e6da3e49c324fdbb0479e5b60303533d6061ac425ad336ec9827c59066e4be0d1cab0996f2c6993824e920445b6d25b6d70bf1f4514799cf59441f1573507a5e14c2d5996ea7cb94373b2e16141a74191d982b568d9d48eeef66b67761addf1deee9b6ffacbd172bb3c09b86318c5b0a3660c7103e64436879025a77938b4caf73ac424f0ec64dcf3985300b75c3aa6326e0efa2402758c10a890472e5e42213e8471fb28f980d5ee904fa5169b81087eddae0ba207bc4281c5d00281b9d2b2c02cb0082f3562f1c3adcd41069b7d1c0f76c36dcf50840ba75fdd1fa92f9813b362c5c377d8d85d4b62db9c0eb27abe95de1a9501961542750b63aaf3aaa91ac8da1fc4b487f8eb8cafe12e72c9f71397b137cc3b8450fb8b9582970e8b4e01002d854bd349306becb4edc2f06df708d4cf18f04f68fbef82752bab7bc8d75e56115554e30f384c98347f90a2984433b7031f1d6e01211e57d3c396ddffa1c99c42baa9a0cf2e6c790ef0d0c951b20d3e0048074270d70fd8cac60fa838e37f46083e603ba04a63b9242489830036d525d42e631b47282ff37d29c2297e094ebab49c95e8db64673a648948276fd2042e8e4a7b4a481f23b8ac45728f361d20f40cd03c7107ec057ef45b8865a1f3a818aac49c96049ba22c50425b31248bf141792fa6e21a42e1a17456a2ec95b9b148bf2da5236b31495ba0ecfcd1a91cb4c8b4b9af81b1305d031257e40dbae8db28ac4bb9a28e3542dd5ed8b0467b9244a786e85c7ebd4483ce4c3e35b60a3cbd8acec89a6bef44b72d539e3209101fcb28ec745a453f146b90733769bf96b9766f2751c3783639d7014977e60d3d2553bcf0276fab24c3277aa4a1d6237520fef0654080e8c40e7918eafc013cf8ad4f767cc278b0ca8c19029d844cccd841ee1bf3fa4e5aeb3f0c157c373bb03c7c3eb30b20efd62ed34c1a55a430685487bed8c631f164e1eb2491c3dd17898bfd3728ae7fe80bf22f9b24fcedc66c808d813ad1cd8b02e9e807ad2126ac4a05c04607763b740996be6ef94c0416300d70343b47b9d30adb4973de430653979821075227010cdbba100e46cfbb9df4932160987c30a8a2589df229bcd99cbd1b47d974c24196f7b2a1241fa358a7d4d201e15e4c3d052e88e6eaa778c4a31c3b7c058a89b3b8abc0b3c1d435ebde843d90ea4b78dee9a6703957e0e09d7a7a04395079094059f6922d56ad39b4a64e7423dcf3674f38c290b1b7d4c9a54015016c37039293fd2d7a721019ca5410f0d205f5f90230c7916ac16b6f7a467fd32ac07cad9bde3c65fc614194ce0bca06c4d16174b8513a7b20c9be20dae55c84b4b93ddfdcf8275939e77d7b353f0044f970120934144256698b865d265d6d3c24ccd7fac60d59559afdab11f3a0ece2a5897852cfe0af36db26f6d19834fba45f4532a8f0824c22e5a99752aeee04003888315899aaab9bc0cc7a742b06c250765f990e4e45aaebf0a4aa8da75854948e3f75c198ad2b927d964f08185e496f58fcd2ed53b4510df3458f80bb480ee038842028dff97b426095640c614f68c62c22953d52d2a16112a333500d0b26f50064ce6325854ca806bf76176e1809105c4c842d46ee2d159c1c16cf3e4ba8c1272f4b0f9bf66a6de99e7d048016fb81f59748868ed7ac9d2998ceee3b95a1a0aecd312d76318eb1beab073a5728e442004da4a08a89932bb73e19d22fabc5a035230868537160b48f31daa60a52848295f5376aef2bfcdb694e4e78d6ea143de79a4e32be80f8c9fb051bf23b6ce012e1b3955efb896c128e5339902f7850a425f5b39c0c47e5eb6777bb201f0e5f70128768ecbecc6c3430fbe950bb3a43e364c14b75309eb9f833d742e147c9f8fb99cd3121fcbf7f63b385751c0b48cf5ba85beea6bc7288f6b1c3d8ea3fbf093632c83cc08248f69677a696d08e16208645e580f56c4f29683e3a8f0636d6be20eadf1c909ab2ff26092b72de2edd60d2b2ffa34128594d6549873abfe7fc5446af924f73341dc7bb6701a344df6e4dfcd08b1cc43b8d4a50b5765aed4271a5e3b394d2b421419c5bd714f16392940e56c6f95840dcf7c57f18447d4322fa67fe3852b766ae6b18296f11cf16a9a2abc6c8df3c5ac3885edb6490076c8140377384d86584f3ddc74c323edee8a5690bf78458c7b3db23afdd2511465679181bac5504a8c8defc120155be93191fbf716c78004a8ccf0f505f3cb083c11ba8cb5bdc70ec951b53c13ef9a9ab9897c7be6cd8deba380593365046503845cdf9dbee18108ce31112ac9076892973fb98bab05db180a4dcf625aa5422814057b9d9886d1dcdc03871778571035c48248442602040c7e129a60ea0decca50b607921813304012f6f03702269eb1760e1c14fe5bb2f96f0abb0812a54c9268108a54d79d5c87c6c5254bf2698d1c2bc599afc1b6b527a38805a78f0e59b855444a1f1f31d16756e49b88f3e89a1baf2dcd2fb952bd5dd832b7ebf4d0ad7b61c79721e08beb8d66b21c0f1487d5abf68a49d140b61e9ee184944c727ceb67fcd0638698064d279333b6541803f52a905953420580c0482bbe8ea7cda262ce40aa223d10e2923e2bb51a6a6eee34b95a414647cb946c68f7388e87d0b55d2f5186e301be67719c2387ac1e18d7db8b85f09e59bd3411c1cb292d77ab8e976c4e2aa2a7e00b82e50e4956ea24a5297d9c8dd503028975b5a675b75f448bc25acbb5f35ad5839b5147ba1fee8267c1226326ee1f690ebd976494c996f84a4a8d171bea2d21f12d99044dad0cc1a18c9a28591033fb427fdfd375fce29bf32342040adb9367308f552c25935e33fea65c568cc2a818006fe1c34c4082c663afa62ffcfcc752f3eb9379c05962f53d605b35e6dce92cdd0ad5b849d50733b171402f25f75101676d6c1212cab899d35d5268f3e5660b177992198d784c2fd32da6fa643073f80fbc36f708c4c1facfa5ca6da45e66ed6d1716625df833b093ef9150468d446eadba73e997ea6bb9c698741212607eaadf046dcc7e69c2324362b16d99c7bf2ecab60d86042c60dd5a4b4f780c6022a6f3ff4677d0e9e9a5df32ab267cc8d6993efc337fae8693722ec05040a6d3cae7b48f4a89460b57836a9c2102150772309886507fd8255511a7c7cd3bd68506a2a71befef96bf06a7082a7e69f97a19063af0541f0744cb9fbd4b30f997f3ced07c494e47c6dc42cc38dc0ba5b34ab3090620dbbfb40cfbbacb45cde7e36bf2ad5ee8e5c33a53910202948acec0eb61a05e54bc11accc638b78a126dd99d2861111348289bfd9ff78599ec6b0d104aca220089154aa31a56fffae66e5a44b4f93af5b66a68ac48c42b7369757393b474a45fec3036d8a0718b26bc6015a248f6943d85a87ccd509bf41c6a18c520611a2a9be1f28b50bad5aaff0a33758e714d7b08cb5b47b8e1e44a938150534c272d530337a674a30152725dabdfefbb6bc462c88e2b8bf14cfa8119945b07bc0e0364900f7b66b0edd0ed61a803253a761db81a1ca0f7f569baa28493bcf3a8600c2892f6078f1825a3c758c7c71fbf05d9b3e71da4d4586bb54db65f4368e1ce8a298674c5c36c73ce69d5a691ceb5349b0d3fef6de03df33c1806eec22e19efea0176e38b1a912dbb2fd91d8a1d9af8fd25d2dae92b279db4c24d352ddac21bc3604eb484ba63c07a9e550f8568b80c49414460470f3488905e06ab680ed750751af431856a3e900296e4f4a29cad410b5cb3ab5f6b7f61660f8e4060b5b2ac977ec9b0d32f1a4401e287b74dea2f355dbdd52a1988a6576d7f1f4e6cb3d17f1c05504d40a8f56d76ccdfb91a87247db9a01aa11404452b4d58900ebc62afeb24271b10d73279590dd2fd0b13993c905fe3d8de43e8600a1ad24cf33cd18e53653c3868d24ae66fbd7648f184f60cae20cdf30519786207d0908f69b9e2a633cc9c80fdb9a55aba35a6fb621b636d5380885e8f6880de3a5708627ec7e2e0dc86b15a08847c1ed14344870a7b78ae67ab0964705691575b59080474fab4d40a0509a7347391215c139f8ae3908752cb99edbf88a3d00ba88b7ff1c2ec02ea16f01c222c84b6b946a7751842287e6410e8832f4b045929f27cbc089fa4cd7cae6cf3541dfcfa2a8d0ddcd34b741283096a466eae22d0fd67d640cdf962ba6f4438bea8b700f81f26d75387ad39f9e342a2c3038d9875c09e08a82a7acad643990f47aab59458698e398555fcd44a110f4eb25abcacac137471e1cd320554e67b99ea87ef67e685631348f76da230cd0db0d2ff31803083fdd8f634683402560260856bef7db15620480ba797d055759b5ae348c682c89b098a2b73c48d63a55643355e189040c879c88ba01e7e82f759a4e0841786820ebca0322abab56ed4932379d537d115a2da3711a4705e55885348194158b0484099e288d4ec8bb4c6a9adf85b88ae2582c657c53c655c94e9e63dd57df60de4ade03731406020c1162d3b07e3c2da2e0b4b6c25ce089be7f2369df3fa4d1d0523b59a0421ea265e5377a79b454bf441c04fd3d8f6ca840fb5921055b2f750bc38343eb4c662b8c9711714b0b702f401bf4796c385c2ed534645876f4974444d5a83cafd853555863e09a1e8d314b5083c275183038515e4feb7ecd44dd31828cc9591e6196240f792c4262e5bfb6e33ebcd136f9cb9c34a2a9118c917af4552706ea1e8c46b256c4f24f83fd9e35483f4c5ea687b321ce8670ca22374a63bdc5c75bfdd55bc3619d06681c2d1fdbcac129b0e89616776054394c29124b73f10f3facd409b46cfdeadef872c051c1061dc59f71c3c739233a35cdcea6611fe28c163e678d85cb16117d5b24ff8721a0f357b86e07032b052f668c997481c487e42547accae00694c1c90d8a25723ca36abce32ac1c80d7706634195b70dfafe4fcbb2b913eadff4c0c695c5f540261b06ce33a89418a391191f6c89ed4434a66e2465e8e1bf5ba596a5e412e8dd2a3a4f4da1cc8ebc48d079ea734c34b9c72ecaf3b1e700d27b71163dd13891ac50accbc68258cda02eccab09bce8d8f75f8496a5daf61ce0beabd8a9b0af4ee901317510f8fdb82743bbbd60a4844033b8bf7add0b5b6b040301180e9b26e2aa536c4c23eeda2fc8d312eb3b511f80206ea4ccc2f51bd5f62f8f7b7d98736b04b4640f02816e677952eebf67a0d9304e865dc805eb6b51596a219aae1d66f9a061ec1ef2d62009b0c05923e4807f3f1232343004c60621a64c4c894f9f3cfff4a798f25399c7e25b34f935e261f7c5fed408100a47872ff0e6f69c60a791dfc322b2792bb6f152a3ea773ad3ebe5e6f75db01f09c80ac86275920e709140061f8808aeb327fd32a9b931ae2d58d974ba739305ac1012e0b3847cb426060d3cc6bb035fcd306178a5ceaa5f6fa8e3e8babacdfc0fdd53a93a3dd3196fd6f96651de4ad40eaf1613952666c2187c0587c84a01453bc2675ec6e57f846a05dd4fcfd8706a9c44125f2de110d30a454417398fdbb97484177e0faeb345ee2bf95e635d39a7a592a489cce1d320279f79ff2a954cccfd5e5bb6d87f54c2ccd6ba1ec10ad159e8bfddf04d884955554860962bb70579cf179d7b9680fa2ea55eac6539be5ed08b83bd80b144312e2b762ac0b4c5ba73497abc46c6da135bf101a2861a9efa3159add399b3d9e5d3e4b33cc3f2108d9612c0981f606ef82c51de59a5d1b8961b8ecde313936080671e0591ef1c5a37e9dd174d670d1b20e2545e79b5781d18adabb987bc415f9d07faae348b9432782dbfa146eac22113385b38fbbbfb8da3045536a0199c073bca5c4d9754c0e46f81a2ac2648bfe53c9019fffa477a03816d358f1c6ca061c02017ed30a0e1ba0f2341c17f8e0171df78f65f39f7d15fa6ea37f6dd19f63135af21b119ab5d9e4328cde6a386374d697e97912bfb36605619f065e91888e36005033373e26311dd1714f569e83ca371d3f421c0ccfc6b0a141f80040200280920240df7e00102882277c79225bc7175c08214d5af9ad867ca706009497586206c8d431d89dda027de81a1f7ccb04489dfda79151a059fd6c68619ed0e4c449b627505979bf49cc8dc4d52a43fd959e35f821330ad0a1f5878385a1e9e16718f46f6c15791d2ccaaa00b40e7c9d12a3a21a799c99994e787d8aa6c6aac0cafced4f67f44f93f9542781b97fe493a52edd5be71cf1c0270fc6a7a7ad8c073ab32f90aa7d16505079cdce77921cf38f63f87d34da61f87bf7d836098dcb712bdded4b41d78583e8a78da82d1db7dc26318debdfa36763c1860ea82d17a795e5a28002362cad398b7934a34f4eb90b16849875b766728aa568f87594726750d65978b10ac6cd2fefc752ccaf25146ac0a48b71ac1182a9bd59eabad692a5acdd289740d5ed9ba661b1dc3b03bc460013162b4d5b1cde8a1926505f3cd9c06524c9af2ac1251c0d006761f61f70b03a36c3d5310ce6d1d678e7483abe82f9d73424b04b760092b20ef9af454e4addda7e0e57214bd960d240c2d1683a4e127041039073d042ec9dda52966105cd14242a3e0b4783bf6b705a2f888b8fd183b7c3cc3a84562494ec6ba640ea731025e2ae92b07b6ee32b0eedc4d3503407b6ee137edaf7fb3851aad025898319c6539fe2da717ddce7c0f4626563b907e32c7ea543d7c2f9125faafcabf8f227d811fe300cc2a41be00cbb68f231aa11fadc5dc1141f125135f230b237d843a02202a161b96d16b3811ed7cb93d11962a39e93e4354969e9ebd7bf5121c9a8ad8bb629a83f73148f5eb33d6d0c3140510dd1b91feb48f58dcb1c5fa1d9159864c3885c414382c345445d34d16be3a4a765f7fb5b4f21cde4d63c641548baed20b7b066200c691ea7b0cf525e31f6be8dea9e308f07289157a0dd0e9839d838a4df452fbd61983ffd5da5f46b95219649e2a33ccd20ce5cd0997b3ba6360cdbfa1327a4924292ecb1b5468470758b158e841c0257f1d589186941a98f41681caa8bf847bd4ab48adaae1da065fe08b53c75f44ac9704020d216c015cbc6be1e3cd53f19e5c2ae87373c73bd0cc39206df8ffb1f270d0aed453ab8c4fbb97742a63e71ebd191e7a163086a9306049145d7620f7db99b0978805065be1dfaee8d28c0e9ca66941bb0657a01d3b24456ce88beaeaf307ce9bb93d0413bbf764e0a0bd5393bdb317e87c42ccae587fb8d2507422f6c4d8ff5748efc258918f457591a12020072f8eee85d25f7a3d2bfba5cf2cdc6438e41a3e2ca009c498b53844e8d3fda4238ed15e498d18bb36ff5bc3019ce8cc5680305d4a9495c360a722de08e3f9b17a643d08f452acfb6e685d195654f2b1eef8f1ce3560117a609c146f615a2fe4c1c8a474c023d5b78aaf61e8984308385ce832cb19127eccca8716bbfb430d547a872fa0b48e8e2c4b73610a1cc17646033217af5d90a0bf90f9e8449900c83fa7816f9d790f543837838cc230cc30d1b3b72a569562ed80998536fa0895b1756fbc4df006326dac7d6e4f9f0cdda0953f6d39204df12cf2cd4e68b823640372282ebea6ae634238dea608bd0b3215ab28855d3580bf1925667e3afc61e9d3d406b9cd6fa8fff164052f7247ccbf4eb478e07ab0b206772547eb00001f4f3035a2167a3592090ba9a0e4a6b8fc3bb00821d8c3722e0fbe229a0a7d2823c1c5dc1ab87032778e72abc0176d86882bbb4b519414496a30a84e93ac732479bdf10cf968f37187bc966863fb56cafebff4dcb6da485b4bdf7de726f29659232a009c109d40aae398d75608cf3b0471611aa5ff1d676af3b199aca57afe502ce5fe61981569e2a66ccf37df82595aeaf91ead4af75aa0d2608543cefe9914e57dda4e7d53d67a33eaf5ff7ac28bfbfdd9c734e94774ee46dd88db2b6bdade7899fd65ec7cd7fecec58bb791eb7ee1d8e73cd3d2edc197f8c9ad7cd6b0ebf47166cfd8a72c61d79b34a1debf7d6b7ab2738e7bccd197fb4abe6fab66ad5a55f3a779468b3edbd0e90dfdd6eaf36bda6e2f9176622ff39a59ba3e09b7719ff055d82d686297c0f8a6d8319c4f30ef394f29edf30abf09ef7d0cf8a5f8fd37a27d61eabcfffacdd66c0357cfab5eb3ae7de0d3f4eab1e78eb1c18e3eafdc2b762addb114fe6e46df696fb2a0f4dd6602c748f937db5d3642dff38d14718032c93c95a80f9f0113ee9444dd6a3f5cfa77b148ccdae0be5cfce27e7b20cc6ac321306599665589069320dc957cfca7038659e674dc6f9fc3eff44134ea8b56e3dd48413b416a436039cda85d3a775ace388b9d5c2b24ccfdeb2c0045725409a53c7af297570248744f5389e352538defd3459bb38d75ae8c06dbf756da85df7089ec1db0e3c6b38bcd5883427ffc1674df6851b185be101fe9d38f688e3db0cbf4e1461725ec112887c07619e8fe333a7471cf7e837fbc3f1f975da0fa8c9b45513ecb9e6d62b8e67311699f8f0a676b5030101010101edd8b1433261f93281fb9cf3ca55eeb34d9d533016ba091384cdad6b400a996e7d03d2d541e59cc63be07ce3bc721cc7e18419c7370e83280f460f28aa721cc7d5ef7395f7b4076e393e37299b518e9cb0fa84f5c78331eca4d6b1ee811e6aca52d38705163af04a548baa515d529d542955a803efe91ada0a5481aa921a245631a7f07d3d5c02f8fb5ca5a42101525265391368d727e6ad84766131c787ccefc037b1870fb8a773c2fad32e25ee615b815641f8ba8ddfd47ae3f6baad59f236ee59037a4dc95b173f89f489287c3e643e7614ea8fcfd4b41f06f4286ede475da57594a6122e9c40134995e5889bc8025019a07655dbe46d1ecb67dc36759b6de242f71ee1083c78545193b973a26b322964ba5bd790c894444950be4ce04206c444b1270cab92204d76b18b15c8c6b32653ca15483bf2b363478df6b3c3a77362c6f195f7509c503e8f50fe4d88593b7484b2cc0cd2649aac6ab230d75f85aa70c87c2c96d0a375136c4a544289a0a8f4d94ec458cc3b33b1c7313ccd3d4a55a0af1caed1f887c3bd1cd47150a7a1741e05693e9750a9e292d6b1cf78f5a979de164e501461f3e9db08f2379fa008558521ed42b9e6d38b7cb5c8f0345e23f39acf79af066eee6d61ed7187eecc803e2795aacdfbb16c3e47763eadfdc19a9999991155309f25e6cd51d81c55addd50b83d941f8846a29191278d3e39d279348dbc29e904fa9d0d3b057d8a2a70946b5e02d137504385934a8f9aefd0d73c6a1dcdbdd5c2da34ea51f31513bce3d3add7294a9f5f669876d2ae3901aac3b481629db586702f991f7041485eeb1f1e3952975b8a82aa0861217ab004220fba94946e1a53bbf23432d27c52d17c6a5f5e73ef7e74b3af5dd734dfc4137ad47a9c3329c4a75d34e552a6664e08f3a4aa6ac4854a53964955da95271052bbf254f29a6b2a5c25ed5abd0a874c683ca5396a02a940fd3e8d78023701ea5d946a9c163cf7a4371d63d9ef790ace0212e4ab25b58c5abc97a597f75c5ecf2b23b74d49e9e5979756b2f8f2de046f8f33d7bfe236efbc5eff8a3906bf7957c5ea517369250ba5cf21bce73604cfe5f9089ed499ee7d9e98593f5b36d80d9c5bef794bd957f62d8113658fd72fd20852087dcf4b681775cfdbc4da9a9b7bce6ad775cf658ea7bde1c99cbc1dbdbd41f1d861bbc198bb7783e2c18ad9a6164bcc23f6dbba31ea567487a445f4e5c3adf70f7df910ed2c5f1dcf58479c511daa636753ca9b1b9f237de9b47cc6255db94e38a58e0f6e4cb27d339c4f8b78b8262382b2b396b50b25a66e7c8a2ab79a751e7e234ed16b9475afc7949b2f311e3ec31a1ea208d36ffc46ac28efa1a8e945ba44b79e6d186fc9b0f16ccfa8b156cc5b32281f3e6a9c87a3aa0af7d843d6fb6156cbc673acf66156cbc6b55b7b941bca51dd3f6c6a6a6a6ac41b1751b871d6ac5fe6b45fb5a951dd8cda86592d9beda34bf3e94c21e7068542b9ca270f478937cef29ea64b3d5a47dd8819255aa75c3c4a83c0791443967b3ceae43159218f1ca7a7aa4d8deac64728a501988cee23fc71d8e81e760367ca3429538f764e8f4acad42e144b0c41ca717a4d28e5a80aa51c2f580291bfb911658f284739eb83da8309ce55690ba6a74c4c4ea4952d666fbfcc9b7923eef43845ba454e5b694b0d554382966390e7a750356e673eed9aa24b29e2175d4ad15161ac46dce91125d22d3d5a2caf0abbb4b28593e64cedca63987665bae4449bda555b9eefcc2ae596d5630f57854c7cb818ce86cce721522e4b237dd51faa4367c48cadaf44eb43a45bda95abac7fe8abd5c2788237620fa73ea90af728e5ad33f1e1b27b316eb5dcc7b1ca86889072e3f35574438ffec665e39b1b94dff8d7aee95edbc5c36f7a3aec7183dba3b5aff1e5c329137d8de20583719c164d106cdc3a8d228518215d3ddcdea7c14fe3b9f5342ee56b933a374ee33d422ac71bb709a50c72e33c70fec6c71c7fe33ec21b9f375e79784fd784b9c66d3ab8c9717f2b5c347dcaa723fd747f2f853df0c0030fb40e3a700f7272341b158f9b9b9b0a4a20e537a20ae6f310f374140a36a2cf4d49bb7ab8f52da85f3edc7a0ebf6112431b1f3a4e3d5af7a083b0653d5aabaa2f8cd548e5411ed51bde7ae6a949de7adea9b2ea4295d9d854994d95d9800df0cfa9396e437bf4f09bb0f67873e3de2e94bf4c0ab13c44d9e34dcd0af351ae82fad35748fd1443cf76268114cab1f7340e1eeeba0963459b7036e58433ccf679bb5062b671540a05d187ccefe136620f1f30ed11522ee1e843a7cae84b47b463481debd63e058d637c8868bcb5b319c4da2f2410ebb9ce6edcdef88ddf78ad9fdf501e22a0bc870f38b794de8a28a07cc8fc94a340675ce49267cbf4d6c67b84f34b8f2dcffdd313028f92288a60df461c7bb437552655aa195f396562d950a69b10c7c3704798e7efe021dad90583a7e338e8d9ceec4c0a99cfd42e1cb76ebfb46bea68bd0e97adc3c3ead3e34f8fb6036737331ceb5546c6f429811b9f5e67ede2e1d6ed9265baf169e33761b511738dd784f277e0cf76d6b29e23cc1f8e30b768c2136c3376f6d657b93e0e87cc4f89ad0fc29da2e9166fdb11252236ac890402b4026205c40a08f0225131c0fb616154c1fb71e1c99c96215127ab4475a62b29cd664c734ef1a756a00fe3d4236d9240a8046afbf448eb8f156d52fbfc3cf5f6f96924edd24aa0febed393335650569155fef64859b75de23067d7be1e208032c8f49e93480e4f3590f1a50c26908c01cb334fa339eb0b9be1f384f2791695f179067dfb2c7d3b0b5288fc124cef122aacd798f2edc6df6e5222cc154d987e189a02cbf889001d91899245173048a101d63ced8373bd2ee08f4bf5f9e9d489be6a119d8ec1702d4162d2012d3262e2ad4d7aeb9ef363c7566942c953bf4288af316b048d826982c0998281737dee0b4c0304deba4c679d319d6608ac1283573354f9e92b24d3596470aed3594e38483afdbc768a799bf4c65befadb5d6da1a14f4d36b501502c2b9de24f84a8159ac2db227e21306df0de6134c4cb78d8a8a8a6812464646950a12927dd29ee60409e9b3c9d9ae242561a256911b51ca73a370578a204fe893791d144e4eb4e6eb25616b0496521c296a57fe903c75fa216957fe649fac5d3f7da9ce744b5f1f50cac8ecfab5d634b0f6ab25dc5e5b02696b451662009354a788c7c990038803ceb7d28a59a8478c8151318629aa6882d11b85438273fd9ae9328d34b42082c92735ac28c1a4df1b21d84d14181238df9fac27720a238a90c1e41530a99208f039da98a4a459c2f9cea65f247d5518a5b5d64a29a54568b705e224b556b356b3b6d65ae79c937bdca239f4b8019e64bce504d671394a29edeeee246ea5f47edd73ce595b522a29a5d4c234b7bea359211b387753f31ada9f09d3441a3c9993eb4f8de3446dfe24d1b10f058a85222d94998f23f9b2409dd8f2f1d94291393e5b28df9e568d5a2d8c9b7c4a396adeee69de9b675592bf4d9c735cc36a137d59200bd40464819aa64b70851813cf2d40619ec8420c609df774e6b2ce919f6e8168f763671b51aa5b76d3296bb5b581249e4f449fbfef3aa990d708f03a15abf4e538e7a4c1a97a295bebcbca1bb3a6b52d509dd3ce7e4a87820da097508499c9d94b28c410f114480aa147463aba601fe9ab0be3c6182c32d86c6201ea8a155200c9fa480644b56cb1a28a0c367d0ad1974c92c960b3dda002d442f4d546d35bd63faba41b96644df4d549494e4c4af4d5b3d94b583735fdf449344b405fd4a809842c518e60d34d80491805a23ab307771bfd04b2b3ba85d7d56a74db366c851356b0f8cdbf760de037f76ddb729ae763d974d9f2395e5a2903c68b2d6af082a5d79756ca28b59555162f15c2a4e1cc15b8dd862b2abaf10a0b96e29c1207b3e79cf36bf90a0b6e1a30d27b686fbeac276800fd3b834c6fc06a1279edae9a22d8bf1248871d4e568fb78b3480f5b2f3a4a6fa7aac3d4ad6eaa595325c6a5e5e31b265ce99adb763b93ac299f5b3e71ca2e8a994b329f5588725a05134512d987a2490a01e6513c94ee50024403d4ae93df73ea0656fc5117aa4def3a9211d37c104a6dad434143ace5bd0b9ea56ceb59a2b4ea013e55b401ec1a415f3cecb59c40de1c99c8c7f08f0cd743e2ce3454254557171b83178b0d0a83868a2e039596fe0e91df77db5d4c9f2625bf25afb6a359a1dac1dbc7a0ffc5029568d9c416e1ee73d6c673e2f38df2f0be66a53e71e7c6fcef980f9f3b99fe25525e17c2dfd2a0ee0bd1bbed77d3354d9f7be6f88056da514047b4a8ef58465f79c7d8e7bafc394cb146b48c8757adf9c29b4aad57e93f7bed771120459f05202914efb3a35fecb049eab25b09c4be634d2658a29ed9a330bcad6a673d24dd3a20ccd6673ce2237340d088d8a396717271e8abbd588e84a491b7561f32333298501ac87e69cb8262e4c8f9a8812929eb926291bd5b03b01fae29aeec549568ed6b5b0b926fae2a48e0d5bb2efa66f173b50a79c54d69eb45619a29a369fd994c2d0b40b5aa5a8f61e21e7d4364aefc5b8d5721f4715151bea6bbb346fd6497fa3f3d32c2a1399f3723fb29cd699b3199e79ab3567d669756a9deb282da2f372e0d51a04b5f403ab0029a55c5039c8906eabdc64adb01a7ef806580aa9a4c0d2430b648bda02b56b4e60e92da577426a7832e7b26e91cbcd64913446d2099f172ebb7b319e413ea4ce9fc6a0712fc6dee395e2791d98dae13a6fce3eafe3ae0a0b28b67ae4c468a15293c928d32193c95e90af7bc539c4ff30759835c8e07d29f3edb27d907c3b9814cfce00461d0f75dc3bc5dc377492ce731b79cff37cfacff34403bcf7c3d86bb53a776e9cb29d9da7818267124819dcfda52f4c25139c42ad66bc98138c9be433929b499d31e48bf31727e71839d1b8efac2ef0f4ec1f0a447d1eaae350774369165551b46701503805c61ac7174f4a9ff40524d8b730ad653f3d22a140c3ae68555360e90dabe10936b7b2b6b22aab0f69fdf5964cf62d2d09e15bf7b42927456da29440aaed69abb5324401c9a5af6f9de8d1b757f7b44faeccc0216051f7c49c1870ce413281bec61e81eebcb06c7d314158fabad3b29139638720a753f8c08a9b0df004ab5bb001f3b515c4e0e745157aec09c27c2a73a89db55a73ced1fb521d25b077c3a8b7f03d9dded9c0f2732b962381708167fbe079b26badd652960b98f39c734df08fd61c1adedad3d87b3aa75d2807fdf3ba9477cb06f4d5aaae5cae1cb0f29eee52989589bcca3dfae108592e41957b54ac19413ef506c8a7620d8da3405da3a9751566fc2b6785793ecb694249fb6359d60cf68a7d1566151e7b0f5585b8471952d7422ab2f65887502bfef85ed64e0a9c3ff8f60f1860019e106a0955b49d109eccc9a9a2edfb2e087ea8540ac4df55a9524b292fa9d9a76630b9fc74d91dd10ea9c342bba44ea9e6d85ccd7c33b576429da705b68944602d262e38c1ae68856c10d5e92d2402d360c03945249752433d36ada1d406f58b6b12729222c2f26d87be2d157b6491ac2ba7869c74cd9dd0bb7227d4d177d16f39ce1d33f8e99f74559f73d2f8fca441f2d3a7cf1d403fab745197f549d3c4cfe93b98264bc993261aeee2148ebba55039be1b360dd6e04209b6853661c0bcd677c34e82e20b2798a7e3bbe1006c6043b6e3bbe107537610826da1847935dfc6c20b826057bc54c7e6bbdfe6cdac6ebe2d2402f33cd01281799d1676414bbebd7190633b53d33c2a09e806492022877483a4103b6512c80a8cd5397fe884baa1d669171a0a8104d27289da212d045288fcac0d92610f58a318f3f09854916106dbc29a22604502b832e790946c17c7755ded681fe139403e95d75a2ebc3e5d52df42222f35ea967a0fada96fbe04671694669e11e8eb6b9e49e9ac736c1d4a7dce397b7adce9970a94eb6cb779e75e9889bc576badd5af57bf0e3ae7447e4efc6d5fe7b3732dcc2c7ce73dd4ebba5bab73e2b853ada5b5d6b1e69d70a49556bfde56fb1d5be92d12f4b5485271e707538a652a88596ef9985ec39aa60a7bd6af0fb48e75cd8609c27cad067d1f08410952d0dc02edfadc3a03fa85dd7eaf290ba15ff3873a7d617102511deb188b9585eb1e0d59f09b0f71807cea7d0e8699887b538441d15fcfd451298ec873e110fb29b1da30837c8e0a7327fde7dbe73d14fcc46fcae84b7ab30be77bbd3d6a200db2f933b2bf150609420d9241a6cb1c8cbcecc0c7088a0c4328312981491baadc9084448733bac0f214aa620333828470420664c8797482242f1871831f6a304a029667d2b3f04445941bac74896209589e4a532416926e21ab14e957ba942dc9f3d277e408d23f207dfa4821f5a509781e05674105e926b48b6af1d27ba48fd2b12c92c96435c8304732990c897439c4dbceadb77c87b7ee79fcf1f6839ea4b7d762915b3e60c532c92fee24c45b1cf607090ecf53c914b2f2760ebd2572f2764ab176569958deb6acf5390b43c3db251d9e27d39719a66561ded2d8fe41a264c95b6f21283a3ef7d05bdb4ede4a796bbd8f7278fbb9abe446c2f2b6b7f46c8db728ebb93bccdb76fa725480573909604cc5d4c4af56abd50ac757ab2f527ef5ad8c58d9f86aa55ab95cad7cd5060e9c8882892ec818b372e2c409105a7a38b2058995ab58afb279d58f313e7ff0aa2d5ec5c5abfc9231e5556508bdca8c23af52f98e19595ee5238031158f8d8d8d8d4b262cdec61b00c66c70588f63f3384f3c0e8e18621e670c2f8f234694c77111c0184e0c8cad6ed458fa1b670018bbb938be26cad7a8bca666e535355e903166062e5e5889620b58cd54238991262d638e5ca106155fe32bd6afb2cdafd238fad56a95c618bf5263e857be0030b672954aa552390c8ca91e8cd588f1e23fffbecf737eb4cbc63fdf614387ff707c45dfe7277c37dff77d5f8d7f1f8feffbbe0fc7bfcfbfeffbbeef63238d7777ef01637e71707070705c01600c87071b509e8727008cf1b835353535358e00207f03e66f3c043076a352a9542a954aa5523908604c65c5db8899e16d5c0818b3b9956eb11273e4577e0030b6e201635f18265f2b94afee393fc240f95a8b4c68d7caab9f2097c2207dad2a254bbe7af93a9db86a8d579f58e696af5cbe963942060b143460e9426691bd01c30c435869830a8cc8cf91197c9106132f2015c1b24462e9500485173253a80cc1b23c92559967d157afe1e26b6a6abc55e32f3056e32a6fa954619c7895bbc0986ab55aad56abd56ab5720380b155ce7f3c35ccd07f7ebf303dfce71f80b1af0060accefc77aca1c6ef700280b11d3a74e8d0a1c37774e8f0305ec7949dff7c0060ecbbdb1a447cf51d30563d0818d3c1d3f2e2e85b2e0030d6ea420a8db76be528cff981f2e2c9a35045a0548e427d2814ca3f70c51723311cf142880825d3e842250c12228ec09205e5afcfac2e923ce8828dff1c0818fb5a2a95b7547e555d44f12aff01c654ee44ea87fcc0ca57bf2e7c755ce5abb77cb4d285ec2b9725be7a00c058e5915a0c71431128b844a961cc8a885f9df1c5144bda68120a0307d88a4b12bf720080b195eb8031548e9993cfe12318cb7159de625567b158bec3f2cbdae1595e98f11f01fe731f60ecf3008c55ef008cb1787064f1383c078ce1b8ac9f79f233339e3333e33bfd9a403299ec086ce68717cc989521660c1b60335a8c82a490624411266019ff8ccb277e466af19965f3f5470e41e7b3ac72460d3bce78f2d55b608a7c750793c5571f85f8ea3b6844f1d57b9a72f8ea3dc05845eaccf3dfe7324ba51c4e44d080c549163328f2f39dff5c7edfe7e43f7723ff79cf91ffc2e880c49536c83879c202f69dd1c27f2e82b16f1682b1191a30c8781a773046e3858ba7a9a7433c75cfa1be43bff0798aa2730ca5fe0115a55f90f1748692a12ba7339ee712a22d9e3a792ac4e789d4aeead42716caf23cb73c551a40114dac70f1a4882d5a60b406a52c57e45006cc124ec032965306a4c90a19182423ac48817951450ba1209af890052c4f23306078965796e38031566d226b05a385afb53a0f3056abf8992f72f819bf0163334af8500324dc001a028827b08c7fb56af22b3396c6a8024b0c5ed4e802b6fa82865fb90d185bed789597325ee535604c753f9799f5df57f3df376be33f2f48ffcdbcf8cf7780b10f3f8a7b94d3a3fcd2570086d8e8a2240a192ce1039b61f128d7e12d304667b80cd063cf01c630992a0f8293060f8220ca413007353c38035622d04d00fd0490822ec11c3c3da8022b13f0c2409f41a0cb3c85884c5922090d969c601ae20d18e845063e7431c6491642b08c1f9481794187a5229834c10496e5112acc0f58e040e9c91169802e68f265c90f42489cfc00baa4af00741163f4f4440d2bba007d4706f1b5d61c54f1d571b49af8cceaf2d946878c98a76d1cf114cb53a70163d4bfeffbfc731618fb7a3c8a4c0f8ff21930868a8112e9534e577cca55602c75c1bcb7bd17c47b30cf47cf777864f05e089e9b7002e879ae8295f776f07c02b54b8987f2a6d07b6480926278328214260bcc2b23c30e425c0145861e60191f49a7f7ac38e9f028946330869264ae50a2063146639079025681f8eab77a11868e07c53ce828300612a15286873596ba7029c20936f43b9230b9e1872f6080a10618fda2ccfb37468afffc03631f18f304f09d4b37bef30e8c75177cce5bedaa3f3ce73efed8e19c478d109e83f226d0d78571cf719c5ffae27152c68c2e4a181515c1b8304ed020071e7c68c18a1d6032cba3e7241213614cf1d56bbb7c7c75ee46f19995431d8b79baa4e5a9df18d7f431bba447ea23649edf7c5a31051e29d4e3ac414ae04a8355a5c18a009f57356855835679b55a2dad5647dae75592cf2bd9f47975e4f30a4989234e5a34518394187a955742df2ba20cb45143194a487c710325b0bc3a32620a19d9186060f102cb2b312a312a9dcf2a27954aa5ca2aa6efdbaec2d2afeaa3daf2edaa2b2a1a3eab2693cfaa1e3eab905860d43484041a4b68b102cb2a1e25cad0d045173184aac0b22aab84be55420c2d51250c27b4e882042cab8cbe55475eb0173c7ec64b780987f9764c0596f219cb373e63233e63a46fc749780be682976040465cb81206c992256019bb8ee84209175dc46872029671c642df3863a36f3c450699f2f49dca29a6ef14354aa5b8a496be3d85a55f34a975a6b7a7aef83ea7728a87cfa99c42caa91982948cc40c214142039653a99c324ac1922a8a986a785a4207584ed11d50740754f81945855054084585504edf8ef2829a427c46fd7c4615a150285446fd7ca3866a28f2451644450f38806594d0378a1e01e911d03f831409f805c94fcf60986f0765a00f199fc1221004c10c0a7d8344626410314fdf4ead333d7f5fbebf353e99c6e76ffa7cfe66f0f9fbbe6ff63181c1431351a87439c30d58fe7ebebffc097d7ff933fafe8eb2c820599ebebd248fe9dbeb24cfe3e261e9572fb5b7e5db3dd91b5e93cf1e119fbdd9670f297b41404368a1618d1cc8b2c0b2973da16f2f7b46dfded1946e4ad7fadc1975469d51d719e9baaeebba6e07196487a76f4e8813e284384e06f533e71354c4711c37fb86e1baf1303c7ddfbef75e1aee0d9f2f189f2f129fefbdb37c7fac88210743376021032260f95ea2efa122486ab860c50917b07c8d6270e1a88a29d45842062cdfa3336490339ebeb7a6ad696bda9cbe7dc3619b417cdea4199fb7213e6fdbb6e5ede77b038a011136a8c187256568f981e54de87bcb9b91511833a254b1a288953260793bba42bb42d39434254d49d384e83e6b9aa669daec897d62bdcfb6c816d9226badad5245667d8ef86cad259a30c820b3270c3fbb96993f95e9a7d6caa52e7d7bc5d2afb924d72ddf5e6557be73f5c9354806317cae483e7c11439227597061052cd79fef0ae4c2d3122764084262062860958886369e7491c61145389002ab62cc0c47302591e4852cb05c8f5240c53c65ca02da44653e414594d219159f2913fd020119c40d99e5a91b969b4b63e957087a8b017e82600019647a9e6e7cf3b43717df9fdba7831ae81b06323b160787b58ec10778a0de8b71ab3537279d42f1f8703c0ef86dad83cb6c5a2d0e8d6667d4f1b0a503ab9a0592887c75de89b3c8a99827131e6e48826a7156349b45334f5480a557aa92341204ebf26f18820fcc529860096e688109249d6042f7943042083c3564418ff7a9bf40baa838a4471528a5b7a7ec0eb5d53a13524ed257373271aad3a49b38be7b797674421dac1458dcdd348b43e725eabbbb69b6e29048473c79d474a8ea148b8a7c7c9eb3a2f6168c8e1cfd0c26120edf425988e03d15592081b43b4d0e8ca1beafedfa54429d04c251a6e3faaa9c6c55cb524a29a594524a0effec26a5b4fb5a4d3aa54dabd534b9c94d6e72939bd4a4ada0bd5ce7e9a03eaf4ecca695521a84d5b6dbdee898bad4a9d425a99c9fac4d34afbbdb5f2adb53b5b0c417a75050e9504d9942c9f7561e0acc81a543d45a6b9dad16c6d28ad95a6ba7b5d65a2b42b5a20b6c10563ea1bda54dbde9cfcf3dc6e8a64e29ed6e9fb52705a2a86eb789192443fa631c00b8c2fc9d1d6dbb07005798cf2386bb9d57b534413483b61a5630f65168e1f19a107d794452a7fd5e8c85fe096b1105911015534a5f10e990405a5f4fe95554156da59cf739211222121aea97e784e80bae44d587af8863a25e6eabb572439748d3aaf57343f5524a2bf5aa795aad5ad5aad68303db52d3b730d0aa38e79c738aa1183090568dc26f276f5a6aa3694deb64611ace2eecd7442daca0f64d3a289aa7699a56692a89263f9ad10c5739e5565154b476bb120ace9accfb917948bc1fefe701ac17c25cd26c5aad5f4dd65aeba4b5d65a899e8be2c955cd0438976f8196c1ba9e7914ec76439f223c304edcfc7a0fbda1165ee7c22ef4297261d77f78609c7bb55a8d7eadab8e03356fd3a8773f09e342cd2f0d57687df74d5002dba320b5c2f65444c16e9ab76073bc614df3c231f0744ba4f6d644db6af77dde6dfe795fe77d1cf7b33201feab82fbf77edff711f51537f7baadca64b21ac66d2e0acf6a3389cc9379324fd65346376fab7793636d323bae89d4421e3f659a97b6295995a410b749542d5e6a3fdd5167d421f5d8de4d61445f5d1252bbbad914d2d581318d26e0e339e71d765ee4c2bc8ea99bb5ab73eac090ae2e07e1342275dabb7026910368ef98e86b67caba1c48d77ca1639a4aa60ddf3ee7cf0e7d7937c824d24bf2edf1f0edf5697a3f14b432197d79b2eac9a6ac5d9eacc7fa06fe3ccf6712f9f2bc7d1af13421362a5e4fa1b4f73aeedecfabe2b58ef347c13abd29289eac53d9e36e25c13ac5b24e8b37e7ff4820d4d62a6dad545aafb536a07ac5f1745299e3a9d8493dda2d56a3b5e5e30e0f1228428ea7a26d0a3384b4642ce34249dbd0156a92401a5731444e3610c9d9281c5fa9bd169800511291937ed1212126fcb58ab422e80fa594524a6d108e9f74db28a5500871160d6eb6bafe48211473692df997718727c757d1ce7ab44bad8407c98ee63396f1305f80807a6c2595822434bd4c333704511c3fc1586dd51c0ce8d182be97f48b2aa14060806a8b53d25ebae3588c53f56ef4b66bca91aa9e4c0d65bdd6fa445a51de76d5b1c7990a82e829ed92acd5b4ed72db7dc207cea98aeffad44e5686333da23aa06d01d3a31ebbbe8133e5388e13c24eee6e42d0b661c342b7cb6d5749887b6abaf3a84eb15615be72de2ea58ee65d398ee39a50716ecfddad49d0769308a1c7991c70e6f9a63f3d3ab50b07e7452eacf38c7fb4248d8baa21511de9d2947ad4c6489d762ed49ee400da3524fad26654a7bdb5a61eb9902e6d0dcdd3c6480ac5373d924fc8d7a6a4f32694e914df4a3ee851c94e370b90379fadc8b76fb23640d32ca44e3fc99453537b31fb3e3a22c19d68b77a6b02fc5a137db5d4b156054f9bdad572b4de5da83dc9d718f972aad32d8fb31baa8ab30b7f2e8c13893c7ac40374039e9ee9d15684c54eb7965609d4d05a2b64b5af9328a594523ac35a654229b5d5bd1d3da8604a2b15eb50b5343564c578322753a0efdb6934cf810fa0aef9d5ee262f9571e1b2b4f46576999f62cf34db49edc2612b05aa4f9ea43c74736a3fe871e6b48b32f97cfa8feb93ebbcce1351e8bc76e28f1d2e0fa92f5ba7d63076c4d323ddf95ae6d059ab76ad6356b8827c7a7a7ae3ababa0fe1551d844d0dc829bf843dce971ce1c7ca36c3102223750a20a2565b4604450935a05182ede68034b1958c86861461211464c68204619546c408d2b4b1871449719d090a34b154e599e00c38a922c537650020d32a6f039a30809a6d308b48c4d92d278428d21a236b0b0d0a5880e59b6d4c0098b1108118416306c20f1e4f3c21420a892440e3a1cd1258619a638a306305811050e5dbea8521421838b37c448a282a549137106155a64b0c14b17522061c486293dfc60858731b04461021ab64c41220a1c94b8300489a7309c4872440c512a12ea061db4300289a21d86461084103d249948d0452558a206295e80ca54114412287650220a9331538049625602ca850444dc600a15a02d455edeb8b20366498a2c080a258848b08217605a50624c0f489ca856522d8011c3125d8a08228911c83370808030a3081fac8011a60a91236180d1428c2e46907e20010696a0d480072c42a041a53ea105b14412d2154cf040c50888467000e95204ed840492098aeee1a7cbe9777a0b8b58111ab428356da14110d5898fc00f3f465cc001104f52f440f1e488238a1083861bc0a6b7ee11027c5fe87c49e335128942bc84abb4e074b7b48ec3833a15bb698ca05925f168649d15787a7777b3b2c0d3bbbbbb93c1bb3160e9de6ca51fd228598624e3bdd47e29e6157628c132092cfdca8f931fd22fadff1489bc0549e8cf177839c3506505966e432def75de07a25278d36cadb46713342d60e921a594524aa978a9cea452632981b6a250db03c2af4e1e17b8bebcf25344c918578cb4f1794c4ac3c347be89b16d5bddaa6b229316abcb1eb5276aad95fa7c265464210631e8ee31530ab1ff06e65e5e3182e4a5905bad94519a52c836bdb6cb2b459aa614527b64c1530aa115906b44513a430c19a038f1054c4a1d29a47b64c1530a993db2607ae59d77bbb7ab762d0a9559f8761b78d4a91878beb4c2c5e83f252cdd7b630c972db6262c545e74c1378b2e30288517587aeae595224a7cbe345ce02b45a6f415de3ca2aa5e5e29326446edd9b56bad52a7bd2211ea51e6b4cbfea0b56bcd914d5508d3dd4d810e55e8714a2729354dd33a05d64b294a287ee4509752cacb72ea529453f0dca9c12bb264ce090393ec9e934a4afb004d577cc2b0baa90c180fe8ca0b495760f051d13e82ca2bbd25951288d604cd12f84e6f8595150596be61819bc02c29300b09e7f17fb4e49dde61093d4aff7e79c5a7c9b38e3095914104be57ccc01b15b505fc5d21f3526578a3010bacc2c18c4e63961143917b6f1b583bfae00abe5786c01b1541e0ef8a0e035f2f530ddc91d157b8cca5c9066d03afa4341bf85ea14b2dc4f7f2ca8f0d57bcdeaad5e8f6f2ca8f0f9f731a8c9784bb5a8de27b6fbb81b5ffa0057cafacf144059d017f2fad3c5d417180ef4b2b4f5edec056603a03bcd1409bc02a1ca8c0f7cab401e63e633138f5940cb6699de9b37b46c02dbf62048dcf6352118f3b8f1fdd16cf45fafab3bf7e5b4d34a2d9a884acf7a44d0d11d98c040002001315002028140c080443c150308b5355ec3d140010789248665e1d89a45914c428658c31c6184200000090191920198940007f6f21895ecbcc46d3cf5b489557de69cbc3c44ad1b182b1cc51440e66d7a51017bb7d4008e6f5bd9baae9779099aa35f75dec4e4e1f88f1129378c1d661e18794e0aa3716674eeb7ce1fbf420c255e390ebec55538dc8c55b5d42c3138767dd2e1b65898525a84df9d8e71f095cc6c92e12396c2179d3172c142c0e2b5a4c952527f29231308e9bcc08cbcd3acee9261487cfd2da56434859f0b7084b43ed82b067bb92e50e80ba1fc25a08db83fa34a443bcdbf84081cdc07908ff89902a9dabdf0f912c11ac1eb4ead06193d2bb9943078056852f230925aaea927d05c1e5cd49abe74fc4bb7661926a188b0fe3a2b2a85d0c66ad9e5f9bc8d235b936a0e0ee4f316afdf9c2c25374393a83220c5e81670b8a852759729dc765b675b31034e26d190bce86944cd438fe9f9df823f536bba2957096cbed4358955bfa494eb666d8260bc8f0003490b9f2e796ced3e71e22cc535b9b6144d67fe1b40cea680e05b6fc4a30df386b02001d86cc1de11d1a9fa33315fe5ffbd0f2c2bf445c75ecedac5aa9d3ff374b1ac1f2a1ebfe156002f2965ee02a0c8be3e6ed68d5af4c169714ba2bacdf9c0e325ae86c14c3168c1f6206f32c9db222a6488a870cb99fceb5938d9cf23875427521f45d171e5ad23e80ea31f928050c7e690736ae7089dbe3ee93f6322e77f63c5a20220308c830542fb46d6e441da7515208935e7b50ef28105505a07d3cd9ccc287aa676070c7055c8f9b2fc2879101872a6e690fd703cd00017ae63cc096c2a7f26fe00d9932296795db71e38efac4cbad590f81d2dfed8a51ec4c4e1d5b2193baaf2601113303fb196c139517c2ca32709b152f447b43235691b2e38110ee432a4771d4061842d81f4339e78c760dcc45b71ede2e632730441abbf0b50fd55ae757ce9c23b29e40d461846b498de0b46acf6ba5a8f27afab7a27a3a34d86c2d5d3b4621fc080474d9c54f3c4df308cf50283ba00f8f4cf585dad841e44ba429ba871d09f906fc5c4fbc79c5647c6981627ca96bbbc7ec250b22adfa6df9ecfcaf09c3dc11984da08c7b8b2ddf4627fd17b4d4d6185f03c93aac012a7feb8ef002bc1673b16183a0e79652df7531c9cb9901ae3d7653a988928d3eb4c28a51a011255803b382132041337be2bab5c52f06b5a63877985715284a76c0001d3e79fcee073f40f3ad01b71ce584ef08271e71b8414951f41db5418c067fc2e16fda60c917963ea8a4e3c065660b556f9bb32b08b25e187271ffef16bdd7befd0e04fb217978097553a77004b0043fcc044652e0debdbfc4f00ff10f8bb8c821b628c0a74a0e094da19e4a5cccb51bede4ae92ace4bc4c5ec793b71f53e5129afded961aa7528fd593d81182b5ee66db7331d14bf3b1a58c94f53728325419020e94c90049671b05c8ab379f88acc53840ce62fa2822a4048a6357d6d81913b072349e876f12589b11645f50f2b324697409ed474229a779bec5550490e3a30fabef7cfedf8642ecbfa46b4c87c5e8afd80204d9c4a974af1aac43f0f73a28e821dbd187a82e34b23f29467030dccf8ae60d7dc1f9a39b1b4927934955886366cbbe19d547c2b3765795ce27be71fd59b4e04a16fce5a1fdebd10fcf40dae713eaaa1205832b2a06134153fa9c26d6e64a37b3d5d4bcd460794cac36430bc80a51a85ac087655e798ec58fcec801ded5efb37fd91a608e969bad9facff42ebc12066c65d362008e54800a0d970f6d8291c1102650b25fbf454fc610e7b4760dde2d0ac4306a626cc8fb2b998b82040f88824488a2f7211f07938c6e20f860bc9d50aa0b9753587ba30975d3770150a7c97ac74bb52a75125244d4795632cc03e4950b59623518e99c1580fc44908e60bcbbb4e54dcf513a4690758295400c0c3fc5f0be2612cbf054e713efe3092167fa5f8ab65e07dc861426359d18d1723a88b447c7849f35483814d0b992ecb78b29d6407d049dbe96bcb1a4551170895cc2888148da33dc313081e084132bb03fb0155ec472a94ba3c52740aff10eab23c14cfcef3843614ec532b3acb79e57a328c41aa1c395b400657492ae3d28a929e90cb589b25ba09dc8bf0ca9e9236117c5f01a71e245fc22c2b704004368c01deaf1eb2f97d2345c3fd2e4d61418d0cf4fe577cc12d43e921cda1f1a3abc5fc6fcf89a40ab11a308a6d53d993a330c0a19c5311d6a845c151deca1690200a6d2c82a833ffd8fc86243f7a7d3f54209a905328c8a42a2ee9f147fd15fc7be772907526c06961e38a360fc2dcfd62c1850c5487db3a56890e5b835452d75bbc717e673700a4a03ec801fc063478ceb014fdd4c9c3cb6c3c42e9ad5b4a5ced7cfb46bf0441ea437ea456dc03021589bebdbc9942f62674fdc842ed4a0071bc2a5da5bc457af6632ad3c6a000a6a7cd38419c855aa6d8d97d5d155a434b5e83bca7ad5055a0bbfdcfa5b3e51c4c22480285caf9bd82881a4c625d78b4a1c3ee03c9fee7d3011552cc25844585ff9065421430804361b2e4bbcff5bad04e1a85a0053bf0a9f226ae26f6222451e744df2d117b960fa517d3a861d7fdf44db5ea4b7e02f27acaeb3a4a97f12103859a0160e1698454e4556aeb6ec102246c36d394ba5e1e1f9d83416bdb1eda6ef0105de8512d71e34b2fc303a162e9bfb0f960bca02707db3ca4d0477af8ddaeded5d3d6dd451736a3fa097ab5c7047f126fdbec93e216968558f222f5e2742d91b3567e71e54e8cb51ef450ec9beb74f40e2e9b7c100795c862c1ce65fb39ac481262ce35f1b074e64510c78f998e05f4277c8ad1e817c03a5d4a04d45071f076b8559eb9a928e68d55ec24cccf3501691b3760d1d779e1830ef3ebd1483195b9e95847621b0d78f6132db6a23c21201e4a664b47c64ef420eaf545cf23fab388a015ab3c0c4383034ff00891cf6431310d2383351241304404b33a357069125338109ceebb1afa9255ba992c8dcaf7ece03e61ea810f181768f9962c17d5bd94dfc832566efbc263b87dc421a029a919fb39feb3e10241a2c6cd427d85a9bc293fd1dbfd5ac62bfe283f333ebdc0eada35c257a779676d0da8e09435e7920b811054d8db02a02dc8d86cc9aabc9f107b48bbb4ba82eb1d68b0dd36a663878e4c1e59a5b261892035b71bbf7247061441f19b622b1b67cf5191e2670b8e25b5a391ac4f709e2a21285dbde21598243bb5dca17fb75925f41b61e935790ad946776e2719aa1f6f4aacd5f233181ffefb4b7501572e03e3c37579a93d18ff35b623dca8e263455c42196473c77415ada3dfa44e67a7ede8bdd028049b443549c8d69213b2121f18169c22c6ed4b4b0175d9198d37cc11fa9d616b17a7ac7cf4801d5b3beafd69a526007622b3dd7f0de3a81f1e19e4e5a6691fa6351ba8ec7eb8a6ae5c45f03761e8eebf440339ff498d502dbbdfa3913a8fa1f371275825a0761d40a9cf47820cdab853bae80e17213172f00181ff7daf8400dada4c18ce001c4c4025f8ba1ddc07257198053214164a12e4498233cd81cbef34503e6d06073d7a3ea6a75a0e806e9f89d17960a5e09654013927d7f88da7517d4bbb1076d1f99935c37c74023cedc73c9cc0460cfdcb7d34cbc3a2407ac46bc1f486238dce96623660e72ba53d5a898fd105bbe40f73cabf52777321adf6a151524a26b1f1926a03ef67404880f8873de5a1925b9b804057f730328d21cac8227d721271e9250da423463ccba439a05ed7fa1439091c67bb745b400d87e374979f2219379dd82a8dbb57fcb864d0d7d5bf15b192e936c781373a2ff33d4dff54c8abf574424be4f4439fc3d621bc94536f4351a1e11c5541b323f50fde39cc2a288dabbb5f4f73a36c017a13fa7e37656f8e0aa56f15d2d51f7d693c3c640aa74267ce33e8cb3c8b64cb2fc6381b46c3241598b98f4f20253502c871a848a878815e6a1f5aaa5408e1b45c47989ae0ccd35e5b4235a9fa2ada449d8597f89d65b65bbe9740b3550ea4980a7b83cd5b7c914e7fb11978b9d81dbed3eadd3764262b0ad76dbca36a0763a36eed0b76bf5dcc8a32f421c78b4a00665bd870a014a87c17c7d07a4ed61b3763389f8f10b59db15e5df5c17106fa97190d3ae6e6e48073b54bf548f642c2cf869764bdce8e40469c71910043b0ff044b5300905f7492736ba46835b8cab4da3a67f50b49dba639c96e740542481246110f96314532b1e1ba7a6d2d3024609d74015c708d73d846c3c49a9514937316a9c9bac6b8101534f7f9f6b6259420dd63f3ea70d7d0949c2ce0d66cf0006c074ee0807c29fe9135ee895fdcaa12006081d9c273e03d5229fabf4ac82558944ba4184ae626f8f8aefa51fba2b44a4538477656de43562e2f0341bb2dbf689ca37af9549eb5c0894a3c107e0cf6f753b882bb21ff3caa33d8d0921610d454ba2620e2bacd28d73f4e59197f29b123990f199565b3c7f43ec8f64ef863dfc59e04987e2b7da70459af68a15cbc20f041475d40586fd771198831651b2c3b2e8dd245f866a7a4477b22f0a1bc87cfe0c3c7c7284e97e54fc1896e146f613a7e405be0b4d39b3e01e50536c3a92b41cfdca5b3609be2ee195c15aefc3b958b479f77c91656e2aea29f09368df17c03dbf50e52cd4a91b1265cb8fa1de934f453f360b8d348a8c5eabd8316d2b39f81b841fc4b49ce1b56a70dad6093ef38b321635e7ff751f0445329441bd3aedfaf8f32c0f1712b6870551ccf02d0b82a70c88ffa399bba5405d5e9029bed2262df63c8d20ca2b4b07b480d3a6ba3ea93953c0bf6207ee49a71de0ea72072f66ffb3725374db68c22ecc80e635e4f20b3b264244b5d9dc55f8104bfcdc3729cb84ef675f3613448b32757b2a9d632459fc9e111ce49c8dc248a9f5f2d39626a848ddff7147508ac7f29a49428891659e325b868cbe8a66f2324e056c75e8677b7fd28b0e79e8298927249fc198f2e695ddf5ced483ef36acbb99209b04553ff71204a4e045d0a7ba2ea972b772bee42f8605ac528c43df51a493f68763f0fc0b4a0204b81413635b3a6c2059cfd3dc06f66c7cbcadc9f433f894559613bfa876cb32f64bc695a6344905b3f1fedf35a8b4d1cf103ab334c44dd91d4ccb477466f06ef7f30f3b8dd64574cbd4818db16f679b83842ed5dc84485cc1e9e75a40abdac24c6df3706643c537dd421d1114db7f4232c725bb908688e1c00d5401892596fd05eeb63890e4b1e2189774b896ca897f4edc2c664fa88a13269c8396957b9260d6759967196cec7563e1b22d84c73bee6df1484d357bad043c86c488291aba6ac76732cc99bb023fcfcff0f78ece8080ab027af79aebe87c6ac3783c0aaee4744876e3f4be1c303f91ccc4eb89678cb24f7d3827cd9b05ca74a9e9a50e047f822fa25c6eee65df609bad0fa0bfa9ae32a46711bec3231fdb74334f443a18097ddad8960fc678a59e43aaf5f52054cbc76ec2b42cdfe48b1581ef6369f72f880ccb76a477bd23d64317a67a612b4dab6dab7575cb77fc46d1652a3bd470265f8fa2407b4576698870ba20382bcb001ce4ec4b4c43710fdb6cece7926ccc0c366366954f091f496cb615556d5a1a137a15cc1a18c937bf0ff23271b64bfc874ec321904e43f961a63bde615e89762c9fea3a4c29ea0f318e59a334cc21b29ccb1a23560c1e19167d0948dbf07c2ef35e4acd5ce1dc0d3a11e5c4fbe195efc1bd895f8bf9128b04c735036d2d544c64a5333551ce4e6681d33f177e9b25da472a00977b1de5e42fb156c31f91ccc5e7f5b1c520555d12055a3efe4e810937bad9ca1263222a8577142a5c7f93ae29aa4841e290991cc7fe3dc0ef4ef8beb4cd03dd6b12118bdcea83d305f3f9ebd3b832549c025d61b649127153f486e7e8b154bb1becd613d4e8860c87a9bf37512da6cd1390afb6dbecebff0938a3040dde53c59b5e1b4f6e9542461c99b5bd8da91108d42940d2a6b5051d59bed6d127b677f4b9973d99f26af34127f2b2116979bb9c5c9e025baa1089eb1188465881925be695ece3ed9658b714076c2295f723bed3a3bfaa71a6e7dd15af68f0644217c705161bfd6780d413dfcdf3dfa92c73e7bcbbacbe08c6772c6de136e2f83513950e63384d837f215277d05847d7263388c5515c253524ece7ee2b6a008347c357d0895a3c73284aa032a33527dd5ac2ab1c1c25a445a83dcf5c19fac120aab02e0e995ac3c25b2653184bff1858a5241692610e81ed6961d1a74dbaed82d25775c9e6b78ddd7b84e6e347ac7b0aac6417276d0fb8cdcd2316ebda64c743bfc234d2e67320ece132b857e0e446b860ce7c4768800e22f49f2ba2ab08f3dd5f4269d91de9c177142819b3b972cf87d1a46f11d4115a13e5c8340724c87bb8b2eb45f3f3f5f352fd4bcfc39790fac86bfe030ed642224d03a10f44f514ddf3f9a137635844e1d75c131e7b6190aacaf3f4ea5e0aaf79445bff2afd9f3e71191ef290dea290b6d1655c7564cbfa572f8d8b4715ebe650818250a2eddcf30b506d93b99fdf6c168b3b6e629498cd28abcc6b6574d4fa5dabf172ae21fd61439d8a58d9447ddd3561fe8ba88a2d163a0e22e2175bc263361de152709aa72c76a01b7f2f5b74814cb47008a72d07b16ce6f68698301328217426c16e629461bbf60472d443ffd6935457b4c8b18af9a0679effc3d3ed87cb391b34201cf052fdea5bba42dc9a2a5044b5032a09d32b6a5038262d9f5a75b98f02e936bc5ec6c2c190bfb2558ccaddff6b56ee62cee54818181430980582123e31dbe975202360acc713ee0dbfe8b08b816c2201a735827c329cc302a3817fbcec0e4505ea8bcbfa8c9e79fbb388c2b9b7e91d3c512a97d8e482ac2dc2bccc3d74a96b220da9449ecd4f796873258e7bde67aa019fe0c104405ab9691aeb12a4c7e6fe257391a6263b5139183f14b190a19bdf4cdceb3c13924d706f35eb1ccd3c12018bc99b1793381629bdd6e5c0287aa77ff077f8df351301b6ae2e2f21e73a81d750fd5b71ecc0aea9ed8a5a46af9825958a534a259cd3fb3e486b5f799eacd25907345aceb21059022b6a840953edf4224b454b7f8fbd6313daa46051ec74ed58300cc0e2201f5fcca2cb9565712859e198059d38ac6af79910cac4b54a2a5b1155ee4e437793a29d65d566d3b9f999da86a5c315f916c175d95c4ae14cf97fbe7fd397abe149fc315d14b8bcf7d68895e5a9bc3bfee4b0b4ff2eab5fbd2d160bdfc3a2d18592a726406d36d401de45a6c5499387300a30214aa19ecac49815e9ebd7a63fa801cdad6d0fb80748a58aa73165e78b774d548766b5d572fa8f549d40aef6fa73752b4f907d7729e3e6bbaae24b92cac5257df5591189568f2b2f6a1e7c1b99bbc309fe1a72e9883d318ab92576b4f8842a02c6397bb278d0d0b596317b67f30f3574259023213628a5718326ee5209b3520c20779145ca955fc2e7857044c521afc2fd5464dda97e6eb41084cb08dcf73347eb6484d4fd05419b845265d1b27a44bad904c86fffdda81114901ef43cf2f6bfab47c2780809f89d4b21aacf4bc4b16a39e34478273a735d8f01f3b71728b6e1b73fc38a3edb951115acf7ea07cb92304b3270c99d7610301f40dbf61a73ed45ff6920b5167ed459d7b0532c04ebd184a01d9293b341c8a96cc1c801f8c1fead721144b541db2020ce9eb3bc5b5401b9947fe36740a282bf29f1c8f8297a83429ac12502707b74358afaa3bc487fb020e533d12c436af04a736559a720b7e1db587ac427bc853d802ceefabbaa302b411e03716d6ed8946daa55605f62ccbb9d7538fc7ead977adb1253f0f797cb9c4d22be7585f028ddb67c653a5d3c858b72756e75dac69aebdaff8eeaeb7b396cf6db14836f094cd1a58f0332ab342bf81af752afb2649eeba049dd486157247d262a4b8b3f0cd0e31ac945fb841ff5acc529c8e2ca5e5a52e463caec935b57c71c55c54e2015c1a4d29b76dee955c10b1378a1742a5d345284d3c125fc7fbb4269de2c0b807f31050819406985408acc28ba99a4efd79082da9b407a400b5e5dd289aaa40c6071b0360077239b62291f645934d674ad12f11ce4209bdd0a03f8c57d6d336aa033276c0130cd22ccff5ed29890101272f08bf41b022f374ecda94d92981242cdc47479a73136c922e652e38a81b96ba6b6d078ae868f4626ed442d61fd8522444959e7019f4a71dadfaed8bfb4e80e1cead015d4ab11ddf82e60a9050e8336717f5087aec804401f531ff105dde440169a6812d43e3236bd3ae34c1c4bff0a5c8f07685729fb2ab97ef0a888e04073233d953dd6d55095bcbfb345c5478381372b2e2a9fb77ad36471af6967f6f7cf3cecefe0b33f70e67081ca6c548056d9a20e9b3daaf91b3c7d21fe3654f6426b12114b173ccd3c2365a2fe09effc4519ea6c51ccc8f711ea6324154b460ae244844770297b5cec22dc177e7dedbf9c338fb3ea936afd74cc5ed3faaf5f5538235a6368494ae03d11e385d81375d2711cb6ae0e6cb268751d115aec2ae8195ada2718f4188adf61291ca99bd31dbed7562af75c24370a32a9f2a2daa2af19a99cae499fb49da2771a8631fbd0651ebdce79cbe0c4e212c50d1f2a9f1f65b6cad7a6181465a3f182a525a36c950f4dbae788be5671b946fd77ae9777101a04f5420960b54097b6222fa58e8c32b14636485943c9bb0a40a417b4a0a95635ec7b5053b7b2a1ecd1c51fe1bb60e9e150582f906f01f578360c7bd406f347a15f59f087903e044ce36d9da2a42679369c1da23fac27f0f5e14a95ca0f004de28d7e519dcf23c9d79bcfda71711601b98f200987c9d9ee6e9654c3b871e5eedd2d50c07a7daaec41abb6d849e067fe1f5cfcb96e52ce813a802d2050f806dfa59d5b7159110211c49b099a07a036c0f3bc2d7d3be823bd1c3fd4bcc16c89d94ab3d00412ffe7583d0baf4766c74f079d74c0d694a4988a45f2f0f4e45ed1c03fd669b802b89b0a1362011932d86174e428bdda65fcf975cc4ff6cd5b04e10a30dcbbbde028d257399be8a5946226c0d75c16437aa3bd6911c63bfd765d9d4b1c3f63e766dd89b3266811d241cc971f420cd02c110f683ca11b010386beee552f814fe8999269f0e1e4bf7be844c687f7dd4860ce6848fd12c7f973ae198b87d60a273e4cb2c436f8cc2e00d0161b4f94e3031388e23b60e1d30ee9ddc3a0cc33dd74fd2d71c075e33ba1f548cddc5be4d48dfb14cc75bf9ab02cad62347b4add62687c182052742486afa0ded65c1ac639f4b63cdd531ced98f53cd06943a7710d170b9f18e7e775f3a8ea5825bb2aa74c2bd26a41ce23a48f6fbee660a1c66080d90bbc948bc820cf6d815a6cc5801214ac09561062f09a78e12f87850323e442dd2cc482f82be061e0f6431575a9a2c9006d45cb0cd017e61f0b769c567af73f1ca35b77512f5afc773a16ef67c52c65e71e03e6e363ee205a2cefeadae257a00ab4c6757aa8c159eb1bc094dc6b43da2698b2a50b43ed745ef97808d71046ac50d5239ff2bf3c47ce02d0d9ee12a237334c04b3bb30cbd2d4865d3ff104baf0f324a66ef59e6ce9702da6b5a6e90befe756940f0c05473e80611577b9ed73050223c2008bc0d4e5f0102662010539fdc66bd6480404b0f3da220dd98a8a4218ca4e31fdf870bc56d71ec32f7b76c4aa5bb1ee7580944115afb0c7aba4379b11b220d6cf3f741bc5ab075accbd2b85d688d5baa8bdac1078fd9b2d06f12a7db36b565891b91497e497446af4607b53a6f4870e34e40a2e241374d73ff1b274d088a45fe88c3ffa9344367b705a8a49d8613b4ea882f07775bb886235a0c186bf8766675a7c0086ca04fd420c6362d4a1b0b52eed9258d14245dd24eb7af4994fb6a9d63d79b26c31169582e89d007a9ca10363d6c9b60016096cd687a7ec51dcc2814ac148a7fa5d3236281bc3e73205f59ea4d83c595bb8df7559671a389cd340e85d26520b869f4dc6aca0f651c97ade62fad446073d86039713072a341287c8c1bd82025038d50fd3a1661cc980c0b0aa1a18c90764762f12b76b26850b331ca98726507c0bddf1d11b7e912c21340a71cca6e1254c815726efce08f9e10d65284f0d69f68534acc9090d27f196db48ba6c3570df76e922e15f44b07a938c5e8b078028ce98b761d3830866bd806e2eb5e7e046fbbb0065310756670889019cb2719d33bc9f4c5f45ab11a94523c958a677f12f426eb99f2c169c6a38c2b545049109adf24c57c7b459be4f4a03d56f863f1bff6a7a2a8cea57c45c38c1b37f84c5b3010025d45cc70b7705bdf865bace14f001e1c8e1af41b0d8bf2ab40d972c125253f93a10ec253442e5d93ac13b4bb15cac6517d028cba72da37e5c51a77e8784539fc0b84c02122536be71745300e6ef98b2b180784000dacec7daef61cda04c26615bac9c1058b70e90a80080143b2449838701e090a34fd80d6ff5f686580a85df1898f24f0f3845d007044be389ce5901f2ef991f93ff95ba38022622544c2630a14f09f5ca903686dde391de793631d0d53cbe6580386a8736240e0e198ef8799d8d98337b2ad15e5c88f3996f1a331cd3c665486f96292abd51ffa86071cc7013fcf6e4e8d77f6395ac7ee1934d21d4bb79ff63e30902a3a57f0ac6b5cf5647acb935ef92faae056787103727b8e806b2c8f6710746c2ae2dfc8da01e67c644174cdb818009d3343340b0416192aed994218ad07369d3c91ea60a3fce0a74f3a0d4c05a101add9f7523dec3758d77acf8ea556a7af695144195f74ebc50abf0da780de94dbeebbf583b8d56b785791d270502bb0b22f7fd6b98f114a76f5ad5aba532bdc7054352439b4ae96377d4798f142b5ef5d87f9fe12d625686dadad628518266a5ddc958f63e0a4a90b71d93a633b45fe9ecadf47114816a94829a9a7181f0a92fc0d1247b2a3d92a7bbacbdeca5d5488f1b3f3bc714388aff9df5f540c104e6b195e990c6434c7e020c16a560b69220fa514a617d38771408fce1e14b0858ed8d1bad49239ec2d0e27b1e1354ca7353dbd1a88decdf74caee281e9c932711a8f050b8320b831a9c2c56d8660f5c2fd9fa471d76410a566cbf23e3f8b0e75c99d68399a3adbaec70968a566dcfff4b0151cb51b928e743058f96024159bebf55b4de6e616818acf817184bd446aa0e5d22ade5909811f175828780e204e39538266c8a3b7b2801ca3210e1e3cfe66ba8bd69acc8eea1d1ba9a1d2534d77d76368bc0b78472f7e3ede57ff288b3f5eb0491fba77638a4683a88dfbfe0c36b3cf27d89409e0188459a24036859fce5a222574aa8f0dfd115b88ca629024517817cf42fe2fb385521910124c06a55c87d78024c913d1ff3dc55415a53dabfaf876239c841674ab961a939b1505b384ce947a1f15088904c717e69d464daf81690126f5ee1bec93cc9eb95806cbaafa0d3f57a4491bd53a44b349ef08d58a534939349beae768f85ba92771c3d9a5ca6b0a765e77709ec848f199056e4bead241428d0dcf6368d85a4ad54662ab48225430f9c4b08a210460343f703c0674258b5dc70b500ddb173c897ef3335b0b905ffae9abf13be4ccaa37d4603ef3352c4d9402af68c982be3ab50e96883a51fadfd03f040704f1ba50a878607f2b371390ee731602682484f64f6011987334cca158344d3680621c30abfd3a88c6a54846edee5cc693309086e02074d7a75714632f5bbceda5dcbbfc0fc3d25395e6af480516a10abc4ce7771eaffb321a71ebc9821a878206af62877a3151b1479796965403f42b539ddaeb264aa7603b256557240cc540792b9c3ff790d6091c8e9061528a7006260011650f7d7f1632177d48d490fc5211f0592dac820f792115377ffea8528e9bc14a11c830a095b36a430f8985363c1a68e317d32f07a92c267d8e956388fc264e4f9a15971ff54fad3791cecb46879431029ef8890cea582458c40273e76618ff0a5e0958077ab474712be83a7b8222d38104a099429a70294a55e462bda0b29440c0a784d76a40912057a7099417ee661ee8c691580085e086d39d7dfb77ab1755df15c01fe5837ba1bde981a13c171330eb5f737959a05d2bed48f86cae68502a75c3032a2949994470f703022a8d97042e4c4151de600a3a15787c1a35cbf3bdba237d2e728f9602bf56637cceab181bb92cd4688bd9d0e951c1de305239e5aa0292517397490d61adb8cab2ebdc29422b61a623db3fc13bbb99f9ca040961709b9b04d04364f62bacc36e9269097f38a049e45b5e3ae2e8f8fee2ef391121204362f102ef0eb429495de6117f6ae1391eac944e9540a6e07afba3890caeca9ddacab74cb85f499bed564936db3f9f451bbd275fe30ae6f75e8d1fcc967c52751cdd6fc9cae806c60b81a0ef6f15a88f45fc662c0040b2aeaea46b05d6c4d67be14ba87bec083b727184fdcd73f7352e52c5aae6f1934ba422a362040b0d921abe65bf55dffb1e2a063e04aa8612ecfcf60d85199cf1d02b55776ad78ee6d3112fe4d3d14a85f771bad7f94674aff37d7a0ca3271c9788d589f262dbc2df89b0762764343fdd44630d32392cdf11878c7424b57340039ae741b253c278fc9f36af6cbb8f525016487622e0f166c69fdf8f3115e67144d2637cd568bf53b2ddf50aba805626c5039cac6e9240185ca31def69d7dba42c8330ed8094754f647fd4d3917c5860a75157602f5f173dd5d76936480cfcc54713f1040fce62dbd27b6cb3c32950f5fa4274c29c88a62e7f0fe0a062d4969448d657b4513698a28d8ec054c0334cd8488cc14f62bb1368fcabceb5c362c12e2e01c827f0ed1258fa3abfa4a80471989c18aaa8dbcdce2d8db5ab33f68514ce67a68376bbc9413b2ff54c8bf7e41ef0b227f76c84157b8e2006121b4e4fe227341e253bccea8d284fbf4b39bc627164b22893101e663e2e2c72017d22f757b4c24e835b0909dc8d20994b910e42bf77ac3fbfb7f0edf985bfbd52f9faed032aa0c2d331a32c68333bb8ea81191842807b99d3135a818230b1484c1fc410544d765576a70b99f1c040438fa064884baa081f26a6fdf151a918fb5e91625570a01530d07ba1aa7d1fbefa6eecb7d729cbd09ff72e49ae73b62b59118c5c4f94f108a17b0399241dba28511d993fb66d9cd0c06894a1b6bd3938eb6bb6dec32a479d0f2b827c39556226d97c547f8f4a774ee034cc7f113102d8bdfa4b980bc136c0a97b7bc8e3e18e300a3472845144eac256acb223a0873a6dfa97d1f8c6d3ce9f73338133dca9da3b069b9c1bbfd3d07b43938cefeb23083d9ad854e53a56a5c2f5c9c602d7ff0b48507406dc1ec3bd38e4c9de04f59a5d0e448094857bdeed766b48a27348ddee614930e1a615e5e902a11a227158453978fda90ea9ea8478cf80bb479f21c0ab1479ed038daaa95d392b62ad1a3f2e30c0253a0f739272631590954580afb727efc59c54990b39322fa6ca9ef3b61a63db1eeccefd97080f726f97540d0f751235d206d13971558af6caa8aff30cf486292e70515463916c61903806206636fa7a9fbccf6c04a046d8c65a2799906d48dcc17539bdf2c6a4626acc9b570218a5b7bdf0abb0be75f4a7d83852b2ea21eb1804c521f7954b25eae932fb3cf7ee12c871db10e23575fae2097865e1c4d7b5fa281ce0e9c92d4cf64bb6e312351c0c11d57181a42d704c6d93f13dc7025f4460b51b0014828061c1863f8fddbc5de684c876a7dccace1122bb39e2984a1374ef2f63ee920f74af2a42b4d6dc7e7f7d833a58de62cf8298efb25331ffa5cd10aaa143735e041e6558f141ee8571206048971f1b66d4856df0da7aba716ca17062f5b8bc4f430213de2ee0b1b664c75f10d29b2a8d0d411d2e499012ef595a1bc78ae36d21f22fd49d1ace9abf9c5de7c79d3d7bc5f79570d7a5bb3c39b25f3cda372b3ada3741eb5a8552fdb38f55116bf7b5424e6506973b710c6e0f55ff3a1df97c2822f760463b074ead5570b064c3614be14d1c54646691183d6e7fa128224c0468353666c5c2fdf78a6054d601a20b0920fd79b8d045e6f24e982d0a11455c682bb7bbacc4397787ee54cc93f0895aa5a12c73f5da07146b262678a5ae19b842b9771407611794af6da30786d169752a208c93eb009d92198edec0059b2aab2fc275f40c0c070d0af74512ca07d5a12bf5a18a5061261cf1e9f25a78f77f440c945eaeb411a1698e6d833671217fc2eca6d8da04043b6dfa45bc7c4985072ff93f257019e7f7390cd7f7bf36304543660a56ba23a46d4bb5b9bc68f4af5581d7444a7252b8b8862ca7cbe8b23d15e5f05aee5142d15da231712aac6806c04b73240fdc605b812e6d344956e4fd37f8cc90785bdc94d07888854c7123a096763ce99e5fddd047eb7099e441c8b0d8c71de9386e1e6f6c32971fbe2a1923d06c01abfc8afd49f94688e69123fa6f828c369fbc4f7a4f962ad1c07d894785f976a6342fa22e3e90ff58ab0f0870350883ed5acd826453ae971e6b0d73d6fee37917698a6f85b6b4174a10583900dafd9511ca06c764b6240d4e07ef01ac0184b3811fede2a6b531f95a4830be05c311d2e468cea3593b8e76381082808f702b0d6818a850bc5f9b8440f262a3ee5fb1cc2a087984642f3a70c805e254996a2e64891e0a58b26913baa5b50f468aa9be48f47bc5a73845f2f5707893de5f7e3c5fbc51ac5bd3ca6f35989e8aaa4c017d60c0bb3cf8742ab1b1e202b81c98bd55a78973a04c35a210a1bb33da312329393b314e4f25c5a83596cb68df090a752a278f977f2a4c330517a7f6414e3cb5c23d8aa87525e023f3903be88c77fd3b2f893c2179e21ccc05d9372190de5656cd1386ab88983cc09e02c0be68521ea1cf2f57b1c0433615df2e40209e024aff287939279faa29488d29ea2e59ae74ceb3fefa65af282027f8e9a0f0227b15573a4281dc07eeda0069271008574d11b21add39eee1ebe78937fa0fff89dc3d72530a84001be39e0814427ffadde7e1c44f5758eec2c91af5a00df720c6246f486a0dd9f8e5be9b80b5df89ae8e27aa407e85200ed8d614ca32be91633309e08e992514cd98b6d1c46ba9ab9603458b3d1d717a7979bf01f1d109eb8eabb5869b232c44974a08060eed5ab7e44d1dbbfa6cbd88089effe1a7b54e968d09c7a62c81305cefbd45822f6e513ccf85435dd208d62382bddb009d21023f3a1880f2013b02c88b8694fdb32ab957faac4989196abd3a735e466296808e1ea066479bf4efc48b32b21b3104b58f6707fcd93bd45252a476ade7e512175d38cf91b06328d9185952789019439e2e7d36af845abb131206f6011119d7ab60e868a930d14bfea041e83eae11a1c2b92de349b55631528e81889f07f9e5ee08b0e1fd22396945410a4eec7644ff76060187bbe6b3fba8db83a1dfe7dabda9a534b2ba266a7a8991bace93d12fea8e02b9e43921161006cad50b532b4212b3be6e8c5c5c9ac46684adb136bf1a04b3e3882ed30b7c90be40ab55dd43bae0f7f1930c299a1167b860a4c6fbe0caf495195b92d22e180a6c01b5188c0da77bc7798cf2d7d41405bef5c1d6a6b19535d8d4cfc26b8e4c57e14ecfbb07a2fd3315384f6d0301099dd54963ef8b9a5d0a015b4e67aa666b6653f19cdf58343949b1e6c6c832e4904c1831d2a0e34c429d88effa68dde2d4142f0abb83693393b1d4ac4954164f94a48156d80f4c7c3d0c1810edfdf9c95d95799cf76b14c629faefc5b9330a6b655b77bd6c58ab335edf2a287a414fd511a5116ca513a9c92636a77ed8576aa647653c6c9286d831c8db2f8f34dd73f961eb32c6b7d40587dc31358dd8e41127eb0d642a86882af769a99d5946cc563b0227af8aba18046df1b06ab4d321679c8e75dc58e029873a39de62b240e4b74694235eaf73b09fc87884f24598ac981980c0cfe4348c788b5a1fffc0e3e7e7631a4e34c8c22a8cd86a120dc88597064d5941ad6ecde5e71612167027c062a0e9d712e74717070f408d7a56b3a0a8c97c6bdf246568183aeb044056e9fa16d338e372aaecfcb8b0de7e0e11f238e0b1c6aa5c743ac6b309a9bcc3813770821722dcf51dee457235156d7bf3d3c0cd32324f07564db64dcb662c1ac46719dad281e235872d1b5a198e2c798c8b3c39d04455822d44ef70bd60635997e7b2252bb36507642b02e6bd9e3be4482aa8d302980a0f83f5a01afc3cdeac08b7069e8737025810647e31dbadd8c05ba5eefc1b2b15044f59dd5a80721570633831229d2129fd97d6deadd44e3be2bea44e44b2b0127a9bfdb9d16da0a051385f1900a36085be1d4397c4107923a9b843538899eaf5d7ccfdb5e444fcfd12e4126d570fadaf65cd4e9f3811725c10da0104b1bbdf2a9f0f49d4980732d30991cb4564d7787e9dd94148d14fd9a84af8a9e1f2aab6dec8f6b18ba8c31f91bfe162643887e549012e5694a428095a6f6f5899e3bb7b9c2b8eeb25e82aeccbd7b697103a9355341ffaaee34b2f017bcd2e052da6a8fa3e1f9f134d6577eb55f201a5701bfd2ffd1d3ac34f35b2c7cc28c2f279fdf26c1d838bb135f7a97c51c521a58a76af85a0499c4f38261387a2c9e3cc254d5d6dd8a45777bbbadaf2cf30fb3765d27afb05e73847777081eb6aa1afb55293c5a05b3efaecd779e98948c843c82eeef074d74d514a1a4c669d679bbe5b0466a5a0e13f25a16c0550f8c50efcc82a77ddd584a98717099f5e2102580a6edcbd12a8d23443932b33aae8a0013a90984fbcde63a1654ddf48d89838e72fa991e840a2c643d1805eb84060dbd0c4265313d22e4c3c82a51d2102dbffc21f5697486aadc63b550816bcc151945e04e66fd7d31d897419c8ad6e70d0f5edab0b671ca999e47f851c251a1e15d2c35d2d460172a7c2422cea981dc84206d6feac7d049a29e74b3384338acc5dc150bb50cd9debcc920769612823513f552691c088a6d0bf24b69581b4fa826f2a00d1c61c85541580861adf7824b2dbeedd0290d711e6a921babe288f8069c1331282fdfa9f7c6dd0f5f0b0159253135420323a23c47c3fbd6945648d83fb1a5ec87914a8134c2cad430e0419df8703018a61602430abb5b0fa73d842cee0e1acc78c26f46a96b3f98a3e7db3531554500a7f6e465feba40912f917f5c5bef59806febc4c767742ccb0d3303e8e54d29ff1681b436561a861c6d00518a89ee18b7a99d7b79964f5da023d7c8422806740e47e508ac0fdc8e6f5ae2ab4c66303be0217c81b2aebbcf80c00d6d6a38e4f0875e7dda471e89ce5e03344f0b3fc4053006bd105804e375cf518d0c389382c79dc7ce133db6b4f98434356a4608c1d82f52c859a50edb18044ca3301e50b2664a061692c22c465b4ec0026c28a2fcb95e8351190569f74a203e654066fa22b8c98edc6c7fbe04084fa9a9054c04ed7e2c2dc8545134b058c959cacd288f016f22309c21a68eeaa1bbac71540462038b51d0f14e903f5c6e6234a6112dc4ce30815763074990d67d74d779eb2366fd9f80e93785ae7cc06a6be763ffdebaa0f1ec6b6b84492b11ca5e2a474330f025b717db4ef18bcb2896c78c8f8a9e661f5b0986ccb2572f3668223ef2fdf4bb79d3a9394d21f6cf118ad5f84a06ddc1f9f9fcd95173969415bb47fcf39cd8db086d05b097f270054d38e501bb3d8dff727ce38cd3a21e9a4eadec211dd984b14bab3c9b8ba43ead392feb5c6c7fcb590583d6dc6ce89398a4ce9809498b7f08d08953fa76d1dd529cbacd382e3412e4bc79e3045d51bd304e92cd425953ab04efcf896c8aa80e92a2dd4f4ccce91037eb2ef7d70eb3f431092afee17cad74e28cc099bfcd80db4b30f01421ee27758cd5a9c872937a78b7ec3c6c84dfcaa81adab8fd550c65f68fcd49f4d012dee8f5a2f0bc3daba3c7f8a0d87a9d97af99e9ac94214d280ee913cd1b6b7f7ce498fd6afe3ace43d7292eacb5d8b5233593e3f451c25b5ea057cd0491681f335356d5891dddc0efb7a4a5efd25062d5502acfcce4a9a8dad83a04b759e6aec266fc266ad3c3a8b2eddacfd9c79a3ca37ea57a1db4ad3885fc511fcea2aa7bbec1ef2c32ce997acf4e249005c14e8ff54a424275f0993cbcccd03ee955a611eead8e0d0fb1211b3acc23b95f4ec92d198e0ddc65c632a3d9f1dabc1b8272d9e9980bae1de6b8fc5f70d1ebb9b7b5f7dbdd0951ce8fdcfe066879de8343d8bc08efc29df08f7450064f8448a5d2c3ca94af02347407443b88325ae908e097db3460db17c9c74f4f836f57a12a391da6be1186d30e743f6c6b35702999a591386081c8c2abc52d914de36bda2608c9f2efb0fe22657af991746e5cf621f5184fdfd329a096962443224bc016fa5e2beb6998298ee62015a6cd45341fc3e744fdf7a728cb1d81ac13e289e9d30109df1e637308a5c0b007d00a7f8b3f8749a25b5aed799181d521b37b637dda4de9bac446a4f13413139ba9d2e745caf12f4683323b092135fe5c9035121b75315c77d38d330717701e0d3141b2f40b313dd4d9c08310ad4b882f8428d29728cd7779b0d5091d964708b85a405dc0da1d3e7c269b12c8cf03b2c0864dac83bc44c15f50321a57d6d10714d481e4c16520e19c60884accbe8449c5ffae5871ba1c73aa525d8d7988e88b64f85bccc63f4bc9c621bb9c47310ab5fb6f65d7821797540aeb52b4cca0dcdfd96c1617f04605439eebb067ebee7284df7065486b62f0d9378edbb5d6941f7e4d67b74a43dc3af52d15ca72f8eb91b84eacafd9377684f67e0a86bbf6f3cbd83e137a8318541319aac81107880cf670e42a7a9620b7c1b1cdf9dac1550b0d18659276618ef73281200fe1f8223329e921ce0cc40287137f9173bee1b5a427288c81c5240a76d3c667fb12960680b15a60852dea0eedacd7093e5c4557102b242bb825ba5148f3a89fa513056de64259dc399f406c3796e1407f0f65de8b99dcadcf9e53d94929e02dddd6f5091ea21d05cb628490c8a067a81fdc91e6ef60bb92cfdc11a9440ee241d8c3237eaa7e20f6519fea7e432231d20112d0ef83f4c6e233cf57305f4866b1facd484826f08cd5035a2daee373f312e1054d40c0a75fa63ef042323d02b26ce4ca70e7afe79980084d99062619495f92d69bd05678376b8592399e5e525b95c46f2d2b14891ed612ea71de94f536f565e713c3198a1580b136ac5bc7f7b90a415c7a2be91ecd5669510ffbac7da309c6ee91470c34c1417cb584ae889e56dbc50e01501492a5d15b607a7a370aef044e698bec0af649ee04b7cec81344a8d9a7f87cdc5b5af7d7aa64ad45cabf92bcec09f5b7ac9f3f0d5d8f3d7956c629115510add214eeb2a39180f4a33d8f01ce270b383fde354161284438507148403e15b75a799e77d21522c7169835e13aed63fdb1538fe16dc069c2d7e886dee8428621b432e1381c1aee36cb6a70a4d81485a0336cd513b811c7c611195f7a20e499c8b6dce3e5599dffd1dbe3d02d475132209dfd83ee90e0dce6f25fab18328091f6681ebaa5df904356ad89e3ac880187fedd0a3cb547911ff7a3b631ee2c69e45033115740dac55d3a5abcd7fdfc3075c3b29eebe705f7fd22d276a8124fae2d8e0f6d55e8f70dc08a122a64cd29a89fbebbe499ae5a6b1548d5d6604265d2db426ad62223997f8f0386c7add7de7ecdc4d44222a15f2a7c8903dc4986fc1c03d084312028cd6f3a69a07a65ce8b2a577026a12b9bbb43e0c264f0a171ccdb2778c84400ce2b660dfb6db5136f8f3864dcb55183a981213cd6fb3aecd70cbe269d8155dca66e6993311257eb4515c6b2680e18cb02fc671239ce75fedc91cc75d42f01ff923320ab004d76d91bf6cab198bc50bcaf72a323e3848b7cd6bb984561f12fe8d42253de7d3b636d5f9814fbc724c650621a2b576ce5d6c186f2d8a875f970f1a1f0ffaf4badf0f70f1531047e4bd17e0638359960c1d7ddae812962b1ecb840447c2bb9d91ff85e37c9e7a160514ed55ea8638ecf90a95c07d9968a03453488ffc3097c09044ba1cb20716c8a5b10834f0cc3e264eaab23109a82554e19ba07b04608882140a96282b1a30b9587ead9dff8b5a393da68e73ac88c666a8d807ab5c93761de8acf8cd13903bab6d3dee5712339a583ba7c1dc7fc454f15bb92a6239416f980e04a0c32f9002b89bb91f7c3f3deecb0b12b959ba828b446111d846c85d53548b1b8a1164c47da7610adb8de75f74054879315cef0a12d477b468f1c95b7664da1e9c771f63d471746b344cba52cbf18e917f9d38c0e1f49215d39e94fafc9654c9ebe4e8db8806898852ab6a561acd28a907b10320e246fe4c7efabce8ccade6b8068c27cd1c1b479a55792d75eb3373920e3d41e24acadadbdbb675b3c2c70d32ab9784dc0a2fb4506ff9944b8520f8f4fd94f268d2fc468e840f24cf83b0189507a500a02113109456016f950f7e5c7ba7db0862fe53e8ddc41265078a1f83b0bb06f308dd86d9b427392d2f378d149a231a72dad3dbfc04df690f0e01b390a354675c9353653a674a1d03197e97553ff3867d8ee45bddaba03ef0188b2b12b1ea0bfe28359a4479ffa7ea51e273208ed1fc995208b847250589d7aa5ff9e8217096ee9fe6487fd014dafcc9316867748ca8c16855af9a947e77dfb1fdc28fea2161767bdb40270837a75ef129e1b8e091f60818633f5783e6eb4307e49cf8efb152eb98b63889feacba0b15768f1a1d03b1e7092db46d6ce84f3f65f77eaedd2e4dfa84d14e43460e02a7263971087b086883cfb23ae2747af3cb2bdc33c6b807190e8c32cf10fdb9a3bf7b9adefa108fdb09d8b35ede8e939fc9f6275292873bb34f8bdcf7e36f0f33b322c9cab9809255bab01589a277ccdc037bea8dae76ac730308b5cd313245af4cd5238cf303351c1361a7933bb412d13bba105a66f2756bdee8b4b0b7d9484d75f2720908a94d72b7cb8ffb8462805a8916cb3edcf595830b8bdc6c1d299db7d34753e1890b2fd6233ed42692eb5a1c9ede7c599441ac2815ad0b9cab3cf98f4811331099391b874c8b381e2b20051b7d400da701ade95fee340a1059bb8c434131b06e0d249fb0878092a296c05177b48f2b997a865331441a6cde7e1213834400e32120aa926b609a8a7ac4bec91edf4a4d5c07549c4b9c6aa7b8aa918ab66d0c3692836b3cd27e382f7a041b3be3cca203aabaf4d933554a82d824bd0e4238afa625cc0e2634884af1f0b919fe904c9859a714fb5b38c31807c496f0e8306509e45f48db0766d0e5c1c6c819d988539484d80947435f515c7355fa646643db2f7d0f96a3c70f731d6efd5a624af083a2f7d509c4d3d618a27442360765498c76a30c099f87ec7d2120fa4c109f76ba67f662d5fcefa5bdec83798b450d7bf6c823ed9535dc3450749c3ac83caa4e6cf83b99ce0ac3ef09657a83d293e204bf8c2f50593d6ea6641ade6a43ead6ed5113b5cfe7513928dc24c35e28dafa177b9db5736d6769d3acec12a23d080c48110009328fc09fca054c3a2646552926bd5000ab9edbc1f8d104c69d85a0cd83c47b19e6286fb0f390ae74544396fb52e0853ac00a31bff11383d0bc619c648a7bf3b230fd2e19bba4c4f0522c47640a9abf54994fa2bc2daa627d127ea332ef8b0ff9dea288f2407e4c81a0256cd871d55f410829ab8615f99802eb605302444d6f41049be8de2ec066dadaa3600b68370387c58cfb8ddc3b0fd6c0625f71f45e024f000898afa01cd72c50de3ed9f4a43483174de84742b319536cef386129b86dbc74858c6405837e0d41097d290e2bcd5a6c076102bf28857f5dd361123219ffa8c38f7d157fe21f3cbd2159c3a54dc35803bbe23c13e3e9ecac09f845097e6c5dcf923daacf00918504ae6efd4a6e7259881e7fa90d8ad8cc169144a4ecfbe4c25f11ae2b7c7a69a28d535d7d01a8940e4e988f91aceb3a880f7ef9ab58a62a00fcea6002dd43f0f6c33408cd9123649fccc2669151d4e2f983547625ad795b18b406b53fb48b172880d4e6525c586e064a73460de5c516694cfbb8fecb5f24a5ac009a07613572cfd59782fc691a078a05ee17b88cb4f8a12d016279ba8e94df0b6a6f7bc5b03e62d3af0251776922bdd6f05e8664a188ce548725002b85aba6ecccbeecd1b8738607ac0c4cba717011d8c4c4124231cffb7c5000444efed47ea09b74e54affbf9a356e18161cc84971462824e59e3a7b077b637541497ca970377f0a2b5c60e3a1cf1b224619a5163707cf190b508bd4b8ca1306d5e1cf38164974c361207bb10b7f8c21590e876fa74a45a015003e77dc14dff53e3e7add51b88b8e248f6d139d5ccc6255b98feacdf3309588a6805f28e208ea513df6623db4f95b43ffe3b3fafce19a98634c9130c246cbb54f6f710c52252356b1018cf0906ec67c84c606d7452ac9ff94406218019d450257e8d0f8db0a67ded8df7aad957e27630453cc51c8f4a9222642bdf704b3b30704a590032a615b95e202538db3435d670df5f99f167b4dac1c763111192151fd4cef948254a5d8027efbc9fb2dbd846aafdb009bf2de9aee5b19e4300dd331d70912313dc2f91aab8b6360ef708b84c86d88220daa21a4a36e319d22bd0ab22a7b7bf2d527f56d8ab423ade49c0a34df061cc6dbf025ad7e3f340df58b159c6a790b2c1f10a827dedd9d6ec3bc818d33121133d5eec9210328a9eadba0e9f661313522990f6e33228183dcd97c8d2a74e2e9bd48075fa58b173314f7c65ae5ce7c67db60463902acce76c84da3a52d217f5d96b392da931919a6be53821c10e4dd047685b68303ac03c2d82b87c0703d8cdb4e2b76e7878b458e44fe6ae1827e8bb440ca6ee0dd0c9952c5382f1f0618427efe3c968a9c6abf06a141106ec884d447108060ba34033d003b0b25714aadf1099288842db2f522809169f360442016c46c24a5418c51b504454ddac904851627c313fbc575b7f68f3027ab680e5340e6516620890eb8f22df46694dfa603bf299a450e1808824a496bc5f606630f0a012ccfee7497923398ee5f1091b8c0631b041f395d1b9bdbc2c42d7e3aad7898695f52b019d97871cb292f5e86282b7ed2c16d4aef3706570ad400a5b8fac88d30e4498344f3547a84c1a4e204bd5de172d245b8e70eebd86b06be32534a22b04b12c7503920f306f2f560624106ed8bc444544234b05906cc00e22a68188a9bfb9ed515db4d232a6c9556deae4c0414e3ce2d1e8d3936d30dfb53b9ea4e69a7c83130c57e667a57062477f24134f5c35e969073f452beac9fe2ccb98b720a937971741b11af950b0d7d92f9f832f6859d9dcc26d94190d89254cadb3eee1c8bf395582be08fbcd0bb40fe435009dce25022cca8de347b7dc0df316927c344132c783a334ecf8e90dabb1dffa6f5717f3c2a9a1a507c88277ff54feed9ca8a6dfa0f60aa6b4ef963fe21ef5653bc58c628a6307e3b79585674192cd3339315ee297f0416141316bd48b60f993760c53f5a05f45bb002854703d9bbb629888c824e9963e1430f392a15776695ce1ea0e8f3d6d12697936255738ec23fa0c28d60b9d98c3b0ffed06f04d4310c570713a6ea1322e3300011e885e950969a616b6f591275a18e96e4bbeccff4ee4840036d61dd88b11e006443394267d3b16a3f4238cba631b143d2a6493166defb1e9a19dc47daa472443b987a2ab0a832c9b44d106d320db701bc04bdd9ab909e3976af38e9902c89fddba45b4a6de5b335e82152bde2c15aa68f48b6018ac2f0ebfe7c37331db31803012ca9e09bb583365159c3c7deccb39c56615171d9b859e61f642caaee9882a439d1f3864388b14735f563c6e78ecdbd615271aa58773a7cfa74d9d5646988708b609d644866a504d17d89c868231fe920670c78507a4ed26db3ed33bd66510a6d61d17b7e99bdf07a8aa2aa13f72c161374b24c151e356f99aca67e58d1d59675e4193a475e40c27296b4164fa3148e701a5bebe3fdf1f6e881ae68f5a0a7d20417ba92646c36e85db329a19b5c09c2ba46de3ab3dd3edd46b43656e77b93a29bc663f3644396b710e616f2627361ff89e25641e173c87ce510dbcfaa6e7015279f659801fa8c1ca2d42b36154ae48d1c05554871b02c31f1556cea0949d99d30b9d3ed14bced86e0f6013366e80db18d404027e3635d486f89f6f420131cf326d162b8f80759862d8524bef4984039351522227f988ba88b571fd23ff528fa12c44d59cabe2c1e6792a55ad21e766744777ab3fef5277023bd6afa55987c3c548213b7a1923200f11d696e24f93379aeb5191c527f5080e1952ba6efc2a019ab17e4721debbdcff1c9a403d192eff709e070b21661d8200380bc07228496103361c8d26034145344170cf4106b889d7037e8d37c0b1d6c5a1234c8216b9368b157df3bd1ed5b496637ac35e5bae43940bde655699868060871e986a26eaf634fbb74580bc76379072e72c2f6955e8ce7ed6eb8d29c95ee6940d0dac83af01e928c5015c2c5156cd2d8f20b6be4f5ddde1f325b639bdaa451a66017742d04fe3a772df5d7acb764c7745d2ce9c923b69d1790ecf2311a391c2013fedccb7b13b87f7fb49a48903050459702ab0010a83a8307f0fa5d8998c82ef0553498b1445e825097165eeba997a3f259304861d27b39f52f40245ff0f3846c48e1d7f9e58bf2089c76769fff71b6610bf1189486bc19621796777a65e7e931016bd2386aeb7aa3d90dcd1ee9e44efac272ad5c9804ed0d3334da4beb1eceecb0a4a567f4bb9008fd92ded3ac8bc685fd839a84162d35693e0bcb48858951a2d714741d3e109d6e39a02a26966769b6a5105c69e4026c93c9c15ff78630b0d03d06776c04771ef50e31afd6501cf2877c5224e16db49baceb844c462cf81764142adc6fba3060895132942f2b32225314d5eade927bc611575e30c8c93dbe4b87be3a55705dbae61159371c6b3f2d6f0dd352a62e3ee7279d42b63864f67ddf7afac3b1a6dc5874ba893bfa4b5042195578ab1665835943aac7419af336b8207f39e8b3b0b5358da2879c9cb6157ac1fb2baeca87f4df2ebd6c8ef1cfaa4a863eaddb1087947509e69ae04cee052087b4ca1b1ec2188339b22390e73e5e508c08bd3f51a477417c45938350b5c2a6e81ad3e286aa006e6a14885b2586915c28015b32a70b9efd42c28ccb4aa71272ed952b70d52586f3e51b5009d7da572604582820cded25405bd063e78d3983b9b75f4744d8569364c94126aa69938faf469a04a0b13283a3bf8409262e85960755ec65411b1e262cd1da5c0fdde02467016235dbb95ae73c8acbea5bce763eb302c660e922e89d2d6b6a068d42b8a1e01ff15f93cf600f3aa350c6412a916906ebe28aea34b474569b0e5bedf9b95539a82824546191f460f4bd552a6c898a9ba989bc29dcd2bccc8645e754cdef6db2b8a598133a5ef2dcbb2074ba053c36d90717dc1bf5305169caa81acd0b0a251465c2be78fd1fc3067f03d5341fea152a6d4a365657dac8eaa1acd0839d22f2da3554fe4278351db692fce3cdecb3d3b90e4b8f17e81298a945c395b6f42a456bd7198f5209d00b9147b216912606d685c91508e80080572b843b3e90ffd51247b1acb4f381ba1ddf43248f900cea7b60f09271a14ebadaa533f5577c9e01870111e128e4ba0e5c05dff37e5dadf8bfda129392c85f80504e3a6a17c7a7e2f8d4ebe5598aa4f84ee3f5bfc5bab6bdedcda5673f886bfd518156a4963ef8dd0fcfcce8e8256d59220a1a75a2deabb6de905a1519381236c85a72b192d772e6363d6d09c7b38c5d23f1622bb989326d3811ab9860dab22fd2bfa460141e3a436ab4ab2e638191dc4de409d696b329cf9bcd83cc2df55a9bf36c5bafcfed4154cd89ed5aef4046ce1f7e2e1307d94111d9af9116a7fbd274b44fd2d46e2d80e4361341dc26e55cef893c1b275e92f72c31d30620b48b8645fab2c12e9653fafdab5871d89e04337aab6908153cf8ae0fda99d333e633ff3b782a125f5775d98fd05222dd2431091f44faafd2830f2cad1e8a1b73f947384506da1f1cdca5ad61a5f30a4a052605bbcead06814e26756b143d1274f7bd050b1c4b017c3819e21f86b047f8f599fc66e16a763aa8484de8e1ec20013f41b8bea204db769104715a8339c44b739f424b67d4bbf7be1ac8ea485aa5a1fe0ad558e66e091d1c20fb5de1a47ae2441a10748260279fee8330d73859f6e1a200c55c4d21c3bca2d2595951bd7105d0289c821f5dc2b1bc7fe82e1e2e3df14e1e9f8fa2ac3cd178fcbfa4ddc5cea18b1e63cb42adef0e968b28c1747ff9efc985732bb4b0b9e57ce4fae2b5a5603e0b4cc5520b8b18d2f331fd387c2c8c9a79ed07cfc95710fa67fba3f5e9663e80390fb0a3bdefb4f76d741fb1fbab86ffbe8a4ff7df7e845b69e40c74099c18a62280d61fef30fe204fbab260da4aad13e714b6e973297c06fd30d94a2d3030a156b5614b83abc40f62ae727fad165ff140a3d51cd0378711ebe2227c6c2cc04f00ac4b575f5b3576d5e68e696c00370562a5b27c59194804f6b3f1b36edb26b0ac273f436bda18b8b14ea0ead880c219283d88af684de335a94d2d3fe51be5a9510850b128bb72604213b2c09f50d247c52a6a0268e739b123e81896909786576cace5852c24fe3c95dd84c27a443a5597952eeb0c33700ec5c300a0896fe2502aba217df125160a8f6bd5dd7183f985cafb77fca0c93b78485c18c75aada5796f3fa44bb5d46f115ee44be2361ba17184d97cc867393c366a17918ac274471271f86d902d4131d463dce356bb20b16f6cb8b75981271c5190125318e1a9d97be20f6f050714d03286954f686622d90f912fea4634392fe7327f59776b02c8cfe4bc1573a56a88e5f26a9fa959005d6439b5e277ddbec33b6d4fb4d22c07e3fa193117dd336802579fb61b599a8f8ffeb483abf6959653959918da72442a6b4771179280399f1c242e173af16a94cd073ed007302bfd59e655f97a0316cf6090d8686ea608d93e4b3fa417a1002cd624040e42b96904b5a303f1e77f6e6b565a3a1eea45b4c6431f60ea2172e2b4ef714834507732c74d05cc5186bd8ac3323f8d2b83734670f4d65ba3020dcfc8d2484e394f7be92279325a707cb910375f90671e377ac5138870eff386046d0d16560ca3c679d511ad792dc26b4d0664c0fa0c736ead7c8f7c50703545dd3074adf326d78ed420b4ee3e8443db3efad0919c2139a746d7524f17355ac75fbce01422b1314b989866656f90209cd47a0a70c49c5e4c1138cc82c8af962aca4a806d1fea5b50aeff1ea7097e81aa0340ab23b91ac4209057df47efb11436956e65c23e970141e948754ce7a170c606c24cbdbc9f790822933d67c8a08ec193683294648a6da37ce7e5522dde96d0f2ab0a4fd28bbc6ade5e5ccca9fa9ff67c4cce67b14577751a181014dbd91daa932e6eef48329a58beb70d606124d23cf490b1ef92f8215e4929db67750648fac893c87ee204460a008a9b92b2ceb6bc46e18b7ed20fefe67b47c514563d310834a3807e80b19ada9c29f90b10bd101ca88ab92b036b6a9f47826df90dfd0a60f2d326a7faaf1906dc2002ad48a6a111a8d18747438d1cca726a4dcb363a02d3d3210b9531c61653e30a00d5ff93221a634fe1aa4a14f10475a96c6fb7891a9bdb4cf665889a36e0c2630b510604178000514d2cec6f980d0558fc618046be1b13b05d51b043ceb03ba09c934cf0451a44ed5399c4678105ad6671ac28c343e08a98d6da6971dee07bc6955fba8776e565a918ef5dbe19be6193f585fd9e3fa5b9d2115a5fddfbf897ee95a16211a12941010fc079c824bae1d7b1bb9b8acd374391d9dfb6e2eb4e58f5fa34ea95ba1090cfa8bf8a3d2ad4a5a71707cfc1cd6a8de11654d60b37c53674f64d8739adf7ae10c9dd532b7145c1f6bc81a7b2345ff5596382a64ef560e9523f94b3a1b15299271231a9530f56d425e718a975f57cff528c9c6bb3a86dd48ea4609efb376be40612f934d46b126ee7cbad6c119845a5d8f0bd02a2e4e483fd1d92401f277e2c468606186bfa1558da9a4967db9d694fce8bf4ae3fc0174f0c19d05c24090acc0f49900866eca90b05b9c436cf889570b5d33d23e67f43ed359229acd7cce4be3b02323771d4054089aa27fd303e41e06a603253de9d1a6136e02eb4d81116e4a7923a9463dc809f51bd8678fb8404ae5a3438001bee957e39a99879745e16cf55e19816b79c38bdd46519b04f8bf4c6ec985fc15fbed50cc40724d247628d7effb75de73c664a62060c1e2cad62bea4741e1f37c92410fb27bfe3dc66f1040f9dac3bf2d875f5714d49cf949151996c85e03b04856e0346d3c1cd9a50c983125b0a51f8cf4225861f3d50da5b8f0a819d4fbb8c8742ab5c4361882925de488c91c2c8f46c773b9c63e79d36488c72e4279c5f7bc95967e29015b2b426c36cd06140c430ce842918c7685293137ad9311a8d441ee9ea7f79e30582e62792daa00bb0c102309164e0921ff9f49028e7a64d176f845db73610e545720f4399ec992f6dfef3c49f9e5f9f339fdc0ac9cde5bb20661c68121900bb2a8d0838e9563a6d004677422890a62fb0550a2e1e7c318758c3a4c4074b22f7e8ac093f3f5903c9d25be949faa5b34fa0bbaf49a903edd515ee9dabec67f3f11838c913f7c1c1300b04323fa1680b869a54ac3a854bcc2572313a25b9482999d5d25bf2f52149ad0a254505da9d88ed1b402dffdf84aea755b2ec24f7da64aa1a2413b8cab7ae23c018545cd4eca3396517bc79423227307921e8623cebf2e3b5f83c3c34206b2674de67447fc1331bd9949a3167ca559b8b2a4118843affb19a1ed07937de861db72a57cb7282b4ee3b5ce66ac961c4d117a9f4ed9258fea59ceccadc29108016a45272ba3cb76982a3c3166bbb26d6b4f3a9362efa04f6d9f2f05fe72357752e680496e9da97ec50172bc271252b86dead575a24d8480672ea62b2e813dd31bac658b8df6de2f79bbed94876486b8ebc0051f213c15214372d61dade93b0738f15a502856419b202fcbd51af4d52642e6973a1cb061c03c83ba4dbd080187e05ceae4f238589a5cfadb6ead6ce239c90d9947810b8151469c247c213fb1929fc31ae0b5a445e7492f47fb5e4649a4ec2a8e5f62c54aa9560c29cc835aa5807ccbd6296ca2fd25a1ccdeb94f3394ff2751820a8426c256bba1d1dac35f55647d4793df239f6835856d6b4dc2e01fdd3bb051c7504ce8c476f4666e369cd84bdd10e08657fb105f32e0f44f3dd6f5004b1ccfe41b4948163c659cebc8511320212ca49db072a475d8d98e9b3f3c0076b4704d9d10de6f1944aad40b8a255a0e10209a76964a03e6882bfd71d9d07fc4feea328982ec9c1591dbbb5c8c70e81f20b364288b56d62fe0e1ea0ba5f29ea54f02c7814b0a5b6a940de2630aa2f90bef860b59f8f5e14f94297a5abf3d19572b1263ee87bb39f6a41bb406c950ef57af18aeaaeb231cbfc8db086c90f6bb698d1b9e042724c7290b40202ce1964d402548491b40e05ba1449532cdf6cfe901d131edd6eb1b9e4eb826763f86428b7e26dfd06ce9d6e65a87d5e283acc7392f0b8eb24140b32510c0cf58d970be241ae19536e9de301231a7e72e2e3e08cd17ff07e4cd85c1e6ff0ce83e6e7fb98cce96cc06dd34c63a2043a282420afcf0418875067a245fd75acc30402727e9dc2fa40f1f4a850a4915ef11e0f844dca7a3679cb2706ad06348c27b0dcaa286d5d70503ed9a2ea8f987448de531d8fba3fd5ea7b8aafde4b5995835b7b421fa96cdd70dfb778f9f60c72a4ed5a085a6945845f7f7cb3f464b6cafd86979c79178f0a1f5447a1a58463ae096e06a1406622600b86a1517099b2871d0294f4ba396a5328ed14c7a3a289d72d85e9609936840771fb98b2f132ee81885de24ed3c27972a936965065fe1f7fb740dbc61b27c6add1b928dbf668463dcb32a45ffce6bb3545a8226c0b78da2bde476e79352d9ad38a0c57ebaaae6dbfcd445f02814f29d272e44b0ce3f98c6d28e55178b9f1b8f273a0a2c75278dde43077c87ea1ccae27b55ec4d765b7c227bf5cc720cd0693c4d2eb9a4d7b881df25102f6b281f09c19c231b07497bcbc3d90f0ee943a97a254ed6ec06dc7c5526ac740e2344b07b5af154bfc19952ea6b5813e8433f37a0bfb2a78c2cbc9b97e0e21a07ff254f09a0a145109e89f2aa15e6ce318ebc7cb861d6ccdff559712d33f73cbba06a6eee298d963e5d3c7ee88401df7afe80e2ee04a39432ab042fd3938c53d9cd1b06c112257771e04380857185d98a8a0f28b2fd04af26cca1939141ed7eca06673153884ba907f627f7c3bdfded82ab07de9b616410717874b8a234aabf53db2d0f7c7a55d6d9538a89b20c52e6c55d37a3701b098327e1c4e16950f51784d28fc01a5c32a7ff177221e0cdf4e7fbaec8ebf869a7a4df52fc295675e5c742db30aba8d37b0bfa3253cbc8ee7c730a11d2f7f4cc1fc85e2ed81173f52ef0eb11e30185479eba66e94bd8e0a9c348a0946c82ceb31d18dbf1910c90048ebe5ee793e849c1ae620cafd80c4482fd5034f038320389b93b87b27e3a89b26b7dbc39d884f2c7b4d90d0693c9d7a2fd68330d5d05cbd2c6e203589da7344c80c24d4009b4e0d538ecb15288f25ad9bbf533f418e479c598a06e3c57cf43ba6b3da8e28a0ee434692f167b91078220364ce46fb91a297812499d0f1b7d6069596dbe74ca10e9afb28883ff86f3c68045a3d2fa35930d2aa4a072a7a5c4566b9ece8b80e53c0974c69fbc188273d35a781af4fa31b067cd55f00ad9a8d3d18268e7ea130f70841300006a8de636ef18aa115563b3bc960854888dc3e7440360e8d404d12b2f7de5bca2da54c29059509e109850a73ce6f4ea7d8743aafcba3f7b55f92b368ccddddcd41acb8bb9f4018a31cd20142c2133541b7ba2d5dbd94524ad95d5787ba3a6ddb789359f66245625ad434d81a6b3b5a5e7a9f05e8d2ac94527a9f908fded1afa7fdc0dccde26ed720076485d5c7a5815e2d428ddc26e8b05bb502fd851c8136eec6f6b88629ec849d2c10b6196c6368758ebadd2e54d14eda1199b3a04dc6d21690f97a0eb4d1bc223dc3ceb44812f55ba4214cd7665b3cb1ed1ae8c3a887643e9642f58ab9758dd947d77c3dddf42241a8dfb69e8f5ef10d2bab41fdb69899f2a257945f0e73605ca25e434b7d2cc2dd1d00aaa8cc8c843f3e9c736592c1fc4ba13ed2b845992ea31e3dcb280540155573ea9a96a5daaf23ab6f1879c5a34a1a2ef8de1ac62007d473e6d8b209d0e51154e48d4c044934c4a552208332679327a5a42253b035f205bb6a9752a8b4cb17f847dbdba5c1fc723944e5105311032a68b4613f143e145e16c0c5bf9917ff3a14fded2bead97b71693975a68edfddbf94a9dbcbb50ed2eee3f197cfee080a9021139d3aa2e0e4fc92b7675eef3b759b631d7c6d6b005045ddfce418a7c3d4db5e716319d6dae2649a89ab99899fd3b293633898b767d44dbeb9464fde42cf9f3c53b74bb375fc1a3bd6b133b782f4095da2e25fdd722df40839c00f55d278e85107f4b513fc3222a02af76727999312d267338878131943c5612966c15488a0d020c926250bcd0347cfd288da72a80636f3a02d4fa95b54821fedb4321a6f3e36b0f741a74e170b1f1bbe3d4abf4637029d5e3efda30f9d7a4e7f8cf351ef6ba78e2dc7427ff751c7983d7a9f8cec291cf4918962627cf48a81641ae31cf63eea31397c313e2f08b1d0cec7c30e855eade02ac637e97da998975eb4c98133ed32e88bf012458f8b40207fa054aa0201f5aa39242aaa57fe31506b3c7f106484509011428b80da3e1d844211d1c140affa884b0fc2d5c31b257026c9a57157a443e95039a504c6e89cf7b136ef5b69dee7917a5fdd8a744d154b83834a051e694fedc28d2bf75a7dc6fa2ccb7c986867da976eb0ac929052476ec494abc041fd76a98a6f57c2bbb44bbbc4de11a7f6e99a86de5783180155f3f8104595bcb6e4355f3ec1e49af74de75ce378a81f3f0ca8a72e35cdc4ccccccccec5b26514fbb6f089dce2764cef5c742360c24c258c16b9e4a087ccde16b1e0ca837c2de874202b3287de61d9147ff65a0a59e96467a064cdca66519a04b233d03189b8039e6d56d20f0a7346215c483081ecc2d565c30644451ea77115d448bc3ca8846b896c888629ebd1d434b2354bf1192867e8424d65f4419d145b46368157455e1e3f24dd3bc2c03423da723cfe5a79863584e7f2d2d2e425418aea13722fd72da5ae78ea85f961d2d4ecc6bd2fbaea1023c5751c37cf63a2515d44f45a4f42aa2efece8ca64e0ff3aa5df7c0cc92c9af3f650dd086480b608a8a88f2a1660962ccf0eb3645913a3b6a8392d3ee172e82a38f4163087bed3352af654ec9fed9f9a2cce5af1d08724c5f40a42cf3a19acf36e2f6614fe4aad4dceceaca00de770b378e80c58c8aad1e2e1cc4e6f635fce01ec97abd0d8520d22bd9c94f409d9841af8849eef69458f31ca295afca32e343abd16070975c6fc257394e63a3687e17c071293a74ecea37a0f6c693aca23d55d3b3a09d3451da8ae5fd8c5fbaac9b46d5987edd2b4ac91b802ea63f66b648393ffae6fbf68fb3c793b5d1c24d14dde8e691f9df3f68cfbe89ab76f99b773a78f8e79bba97e3c2d0e92be4ea6ae3bb834976f5dece4d25c9e75d7d25c8e7573692ea7ddecb0a5e978b084e364e4a36b2d6f5a56cfa985d97499de32fd34ddc46dd791977e71bd3cf3b67adb19890e8b46b0f43b40df2318dae9a1a0269799a329011f0bf071e663f7d1b58c7e73f4e47d372cd66af33eff8fa6326f8174e0af5eb592bfe67e34a985690ee874ba73d26ee7941df57637095c6683f570a76b7bed42deb973e77a09df11278a7c745affa2bede77f9755dbbeb73d7e591d4eff60f6f1db7c8d22133cb206edc8dbbbb31c6dd5d2c9a94de56b5b8ad8792d225f4f95dbebe55548c512a4549e39c54db328de368e550105a81dddddd500ced54b99977bbb7b7b77765bc68dc82ea2e2fa51bad2f66ec0b10288e7d0342e6b4f2515bb6bb216cd8b0e1f2b6084163df165ec2e8ee6e9d8cc8ca3273d00b121948dd5d77f7a58b3a467d11a376d3f66294d73527a5bb59c6190beab760a0d0ab4d12bda250d0c2a89a0ef3b7c3c6b6850c6dfb250ce855e6f6beb8e9c0f5e8d2ac9457bc68f4395fcca85fa574a35252503efa8b192f40c41720e24b187537468e93b2fa4b8c326ab5b6b448cdc565777777a38c715d6cd01a42d8d11b220aa528ae781a382019e1a00347d7100e58ae21765ede664005d00ca8f879c30bcd895c065e10beab001983dace4150b823f478e4a0a611638c8c86b67bc2fa079bb5dd9aeeee2b76941e73777777770ea28c32464ae794f3dae8d7a5236394310ab5317ffdfa8d8b93f9c24dfa9a9c21e79b6bbe3142d6893242de3a2debe2d248c7a4cf4bb24061147679397548bd9dccbe3f9927b317a54f87d2f901127a101418e6d3a337e6ec52ceee9b1e1de3845c8e39e558988e791ff4a94323a4107a716e47bf3821d0a7f4f5282f2923ec2242086137e4dddddd85e1e6c80d1030dccc2093c821289d41320c326f04fad6abc84764be671075fafac76d9fb907cce0c120f317e526811629dc1daaf4f6f560c8883e7a46d88db4f78138a41481f41f4dc5b8cc85bd11bea60bbce6456937e78451c6abe70b0b322d4a2937e811426edb2f46d4f572fec7e4a557972663cdd3b26db9e8d1167621e1e0163d23f2ba28a53e2f6a425d9d0afae5d467a7824d6e9a0557d1af8ececbb5d3363bea57379bd4d6e5266e85f9db81cb2fc738caf1f0e46e96059557e896d8cf15f1b2048d31c698c4964412b569121263da135e51ca085b92e8c846658f0f45651a23ec96665d46e9314614eae506c218a316638cd1bb8991b27e5f96a8ecbc506329e5b60c31048505d4a99af65112c3005ee86c86ec2166434bfb0071930978715e50463aaff851480a452129242485f8a5509cc1862345268d291e1463c61c4ba5584a8a3d42c85ebce609423aaf285733dea578d416d60debf112df7cc4b711f38a12c20cb50f642ab37da00d1fb5cf6c9ff6396a9fa3d57fedb3c2f64c8350d924741ad2a182e9316e281d308c619c691bc76d5a862901b323d26b4a18e3cf4e024390925a08721dfd84512efa83158545bd0c14591a21c018230c17032771524aa25e74ec987e495f0afcf4d8ed743859980edd65f260c61c891ebc38fbe202f39a2a6652d6cc52c7e3061b01c509318242bdb8c48c002516b123e8bc608d2dd1c49d606efa8655fbc0bbacc5e9bfdcb4b438367ff90db4b92e47e9a0725ffed1c75ffec1c8d8c4f0cc05f3b2f91217df3c55a6c12dd21b5e831b9ddf9c8e6a07c6c521a7f992e89b6b1e0f8cbb784ba0c338d6d1a77c42e25499dfc0992bf3764e564e60b02ed79a9b5dbde1b5b9c5aec96e885dd34de834cdae6f782deb668b6f1e8116df3c158d407515f5542e6c0ee33c9bc3784ba6505f728231398cf7b466275f083f75fedd71f1acbb3e739934dbd91c02dbda3c2653a83389bef90bac451460b4603c26d0b9f930ce131dc653650ee3dbe251b9f0e230fec28bc3784ca6f0c0b88b33d9e12ffe828ba31ce53181c969984e85440616faa7efa01c0990fdcc21b02d94c3b86a6787ab20b0ad1daa17601c4375d9e5f3726ce7e705a653cd1d9d6a7a2a1776b80e7f01c6511e1394c3b80e8fc9141e94c338131dbec3b7e5f282d201b34347b72dd4b65c2e1ee89ccf6efed5ddc099cbb7ee32facb4fb5db56edb675dad6723a3b2c3873c9c4c4a85c88be394ff4cd534ddf160f74d5f45a517282b06e5cd8d64f74e85bcfd55c1747bf478bd34b24f8810fab8916eb24e9157f95ae813128e9156f4dd9636057c2be036dea51d5504bd4fe26dc92fe2382145ad29b706bba4b6f494f6bc9141ee9cfd3445112aa9d4b8b28c26849cf691e257086bd9d18e00cfbb6a41b7588b7d32b96d212a6cb3f171a3a9ce1835da7b45e27d016dac0364a2208a4d6120ccb154b2d1af68a2d94c25832cf68d1804aa2053d192c2925b516690b368e5aeb45174a492d3ec11167486975c76aa2a55db30c20908c5addc58ca04543334308571c83da5b7d8b8914956a126444f5a32b944cd7ecb624e1e3db9be188a153a27c40e5c0907a239807e95573a742af52bd62e620bd6a15bc6bfae5952dd5c9a64f4fc9fab7c7bcbb3bb69132842a16e20743ea8d40eff9e67460841e23ed764a991522dca48491f6114d828162dc3ceb3e99cf7c8b98f765fc51bbe2859580cd0957bfa19e6e3615ce3403615e26f349e0e796f0d49330482263c851fd52b173b627375bcd69229c1d21c9e8537a75ce3863242325026eb20d91407b44f6a8f6201503b46d62a060163738f9afe1a0f29bc50d3f5fc3f0677b72c339275346f9a2cc57f521b0c5d39ceb25443e3b7b3d4465c835e7c65870b79f3a9e1db2abcbdb591a4ee2a8c74730f5b1c322846fd7bacda8888d28ad35957238d3303580309008438ccade4bbd6a8a3aa27edc5524dc2b5d237b09361155a8857aa544afa4f4aa877a25843d6108b71b8b23e3b75fb46fffb1510b0de1135c5813a0f717483c3b6457d0bd9da52922c4474645b0f26614639c744ecc352c46dee815310ca35d08cde964db7cf4aa97fc75fde8194ec7874c0aef23c6f883d52b1f2b48c107519cd717bd8ffb8bbd75a99e81ee655ec552bfe8b433d28cc45fad12f2de514058c627f3d13766e620583aec2c7d73e61a139f7220947953c74ab2d65aafeb07f5be94fff5e3ba2e99182a4140e3a5a712f2d25349ef79a99551d97fdc503f5e03e8e335dac97f47560ed41029a3c76ef46a937e8d5e7556a5b27fbc0634f14482a8838e75289a699bcc627aa639cd4b71513dcb328fde7133ac4b3d959b4b1923932aa26e267c3bb34610e30fcee42621aacae43d6ffae2c35dedaa4899ff44dae2452f7ad1ebe5a1537a5dfc7d4defe9a984fce5a92eef1922bd8a5a1b09f40cb4f9f1f9d88d79e8a986d0b7257af3e788b56dd897e4e105f93da7a24e7f6cab94fa7694752938d3ec3915754220562ae517a6c1940fa918de684c7d968a99988dd69827b345452df5e945f6a1b5eb9bced333272afb919b87e1e68db0b731a8476e7e52df1873d9c170f36dde77f39b47cf6838ff7ebcf40fa5e3e5082f0350519b6b8eea6af7ec2d3a9ed94dec9c9f50cfdeb779ccb8ee13c0b7cf2c59b204a18bcf30dcbcf48c44cf63491f94bee96fec11a90dde1aa9c49bc713d42f7ef3c7d3add02fbd763f7ab5791ff315a364864a6db06b3cb4340c39f34f2ed5aee9ae91dc955da1026d4c5e8694212951bfcc4809970020ce35de60f490cce762d835860968d22b3658bd6218a19725f52a43fa2ad2f7e3ab752e19d323d2cccc9848d329b439f99c91fec68f1df68a5f2e2d19d7c9fb92f4925ca2a799e5a10c29c6e8d1bf2523caa1bf7ce4d21615fa279764aa16952f2f4936f9e8655a286d7d2a431e6d2793e459c9cf181faa5f9f6a1e493df59c9e9e10f9975f9e9298e76efb56abd5eac322dd300c764b9344212964c992257ef42e4fa2ea143598335e73d25d41df55fcebcae215af897a8d7aec1acda95316dd15e6b16b78d384c0a78cf9621da9ec4d8d1b0ad5c57c4b68c850a8d4d64d61bfb0eba25714aaafc52ccba8cf0c939c0e866d5ea4d35b8f368855767882b49428c01f2c59320624506b209cf3f2f8a97ea010e43fe681a8efc14a95e71a21f4f58ea0fef23ed60154c9a86e66886f845180324208218c3ea1cf107f3d23d12364c9789fd47aa19c5764a5aa510f271ac4b841a740953fc6b8462ee67428c591d18b73681af5ac63af99f7928fbe1ce567e656d8b86e0ac7cdbbb408b5e95d9f76738b10d5ab36a3b26b0de55082ea1a2b12e899de7ea870ba9c9e0a37554702ab14434da66449d750fe41616b6eca6bf3723c15e854d2ab66d46bddb7607ca914a5b5a652eeab158b75f39c7a0cc6d033ed1816b118552ca858e0372257d009c5d8a8283ceb47ccca870ce6c940381d807994af264ea0675cd4de5873a2ed07ea160981e5657e8b8488c15fdd8dc1cd9b17581ab841e7cde31fad07157a0ea59957597a7797cfee724ec249dc33c88f9e11f68e60689a8af39ee7345fdf9cd6b2932637ae53b1f0999c33bd66720ec8fed6795cb7c2f7bc389dabc8044acfe3b728079fd7b66deba0675d7f732b4ccec89176cea5731e0cedd2374ee7e280c0cf9ce38078b4579ec990243ed1f373163a0cfd669af7657e49cf48e69ccee5996f33ebcf3a8df7bf9ea71867f91a9e3a53cf16a79fa3e7346b1e12ce92f9d2ad468eaf38500fafccafcbb3c5d97038935fce2dcec92f372d4ef5cb4f8bd3e297d7c571f1cb5b16e7c52f77e113a85fde7704f597ef0f95ffba3c0a641b2e8d34c9a5917eba96467a9d4b23bdc5e5c56b599aae9e4cdcd2403775dbd240e7baadcb9606bad6617469a0635d74611320e4cd856110346d3a952e670edcd983f4ab6bc9484e2f7d937432c7a1758fcf4befa9e2a3cb90b39c0e2f8d11197d011f777721094ec2b7939042347dbb0cd5f4eda612be87b37c771f0d35b0a0d30b3d22e12c6f64bd1d762a210bf87619542c2ce0db17f0edc52cafc595a6e903d5e5f24299a0b253ff28cc4a28a184ac3e12565ac11f09273d75e613ba066da967ae719734c9787280f4cc618779d6c58c39ee0130852f85a71e92149eba56396b184d1be89fe19a9727e43ae3729590cb4f0eb83e861f67799ae5b1e9394d9d76a7bfbcd3470fc9e9598a2a4144519e100a6389a0a28d92a3f4d3afab7d2ad5e8462edf5ec1cb67425db3454247cf1ad0b30cf3d6fab4a167e8444a3f79feba817876ee209e7b8c67ffe44f15cffe4d379e3fba045d627184ba2696d1c41432557efcc74156aeac6103b6f21fcbf1d5ab634b990f1d427af6e946d7cca5b93497e612f5a14d28d05ca2411cc4434c85a5c82a58449a67437f519144462f7fbae693506493264d18e8b9891c1ae388cd376f07ceb003a0e889c01976005051b7b5575adbcafcdba41736cf3cd54ee69a6f6bb99dcd53b552ab8bfa35d2538142744d10b4a1545a4aaa7a8a0e394d0a8236db923244a58d9ee9109c61292591340a2286244a402c0e0c4dd4443e3e0f3d959225bbf4c3e24087e1c85ef9a8e4e3f3d153b1cfcf95ef6eafbccf93264e9a003d69275da36228bd12a257ec74e8999d1251233a44a96844ee84b6bb1cfbfa6fd0a6a70624d2b8018d10c051030c5a2e52b28c20c907263892a2b55e531a0b989d398676254da46bd66b15d495b23808f8aeb0026be36383a07c51c3371671d420ec0e18b026ac37b7cd97c2dbb017433e3e3e352491cd4429e0e2bfed77290544df0408cafa68551966f8f8a4189410292281ae593fc00957744b2e0e907d19524b13bd656958c573794f6b7a4f8b1be8db2eeab749db4dea45bf3ad5bca2f47c606340686d25e9d7615bb9f2eb3149aef1bb8dd4ab7528e325e745e5bce8c46836319a615ab67191e360338769d9a6719be9144f27d87cd2b8cdc49d4c753b29514f4afc7a4bed2980f0b78f1cfdd33e72b4936eb27454058ca32a56908c384808160a6221580996c250d67b0d3794760d39961a1241147e3d6e95df538b93161797971729bf8e52e29a93520ccb58a3589669dab671dac67126d3e9545b624b0b6c6e319d6a6d697171796971797941a174e880d91177ec80cd3b503a606076ec48a578700f1e3d625423c4903042091edd61b36f5b772a0e08bf6aeb2e860312b375370207849f84480209b0998411a80e0e0809f1934ac0d01ddcf60af553dbdb6a775feda152b18af66a535b775fd6c42fb395a11e3d7ac41e3d60f7e01eecddf0a35b77ddcd087b4ede1e102eecf6d8434010405cd48da252f92f75f45c8293672fc149d7f489e884e2a2ae2fd77b4a5a01fe1319a141a50a8e4e49272ca7a3135209403188b9f2d29606e0d084df7766590b592bc4b3f755d623e5208e2fb480e38d211c5a7b2444124b6fd8d002164091b31e649d7503add8d51184daae230815fe7aa45a368331fef206400deae955de1c90d363de1dbfe63ebaa10a7d69240152af16bac0738274f77e2c8fd1bbcca8febd82d0dddb9c20df5694029fdfdaa81feb210bcb43ffc18a9ed3399d033d081945c851841b5e54768d3126aaffe7acf60a6d36d77cab9fb3d86fd87d054344fd968be8d2ab1b05695514e5e899a308f15b14c5c9dbfc161501827719faa5a8373b89e474a28c52b6ac5bd0c5114afd3c7e49faa3631ea997b94f24a29bb4f9d4201451cc4f8ac49763614a24f3a987e4ebf9f692f437eca3ac312228a52a96674c0af6146f4895bdb2a75a0914288102a12e2a96a0277f13e4e4517856ed2c9c91996ff7b176b21d16506d6715d99c777b7c28b37e7ac53e35e6640c0bceb0cb6e4a4fb1b62775951efae480405fcf070aeae7238964ffc1bac9599cfe4eea9a34f8846d2c3044d48f7378f61823e6db7d47583fbd638c9e944484c548e9e346ff7c45c4dadd882181d8b6e462a7348fb1db65c55dd7ba9d4ba6f0689ab744a341897a5f4f90f7edcc7cf4daae9531f7062a6688fac524e936c08fed09a55b3d41fddc7df80115c4eac8569dc4a0faa5f0edd05ba8b650b35843a0cd1208022e5a4b687819a3559d061412ad29eced3bd066c9aa21c511472d1a9606406a60d1aade14951036429d3dd5b52a98761ef2c939893c75dfce9b1c7647582ab420c462a1f9fe8d2a33752acde96b1eab0576cde1a99bce49e4cf8d37e639bd9bee47af9827ab5742191b47f440c5192498811a8d0120ec20075780d0c11959b4da8b7041d46f8fbe23ac57f90e0f2bbea9494d8dac1f611029d2ed578c0e6aec9db6d9379230d0350b7f8bc4b0f2cdfaeead66dde82264d64dd77c8b850a5da372991fb18cff3622457686307c7620f0993dc8d45c0daca38d0a9f7ea78727131ee2ec89233333c7ebbafaea589d44040345bac61f46efaba7a581ec4420840578e8d031508448afa0c6060ffc71e3dfa90c37d600420a63097a66edc42b9d602568b356c4218595347cb82288242c053750a9320426cce841c386aa122f711263e12b6254c622935c526e472fd493fa2591d4f94ac758ba39a594ebebb4839ef926910fe92e74ea7152afd8f94aafb0f48afdc8267d49e44f9d4ba33e2f91968e948cb034515212111623a5251f6fb20262dd4829dbb78b3e912c7118bd24f2a1eb90e0c807bf454180c14957d4fda04d7a52bfc552140416bf454134c16ec26f51103fcf46d086af34bb1b9c5484fa2d96a5612beac7523e89d25aa53ca5749762598a852621a58eea5cca49d02727bdff477f931eee129dde88bedb715503209498b8c2054438220143b001043ba840a80c2f98dda14d4f156bf0d004133d80a08918d50c2b673c31820a2144b9c810e3d9233bfb8abda65011d22a83285d480103891e7090412bfad67a09f9f0440f49bffa2d7a42c66b1ad3aee997ebb187ffae1a58430c7860e5d7a3f4ae972e7f9b21fee65ae7824772facdb51ee23518c46bf187d7e4095ebb361d9e72403c19318861585f188661d8ec61fa7a845ef3221f78f8acfbd6331f7c1e5b6ea26e510f4a0f1d73e83dffadc93fccdbe4d2e419e9e5bee99c890b92833934795fcf73deb78e39a679464c5c71921aedb1fe495f8fbdea3ecc8d600eabf85d1f1fe600cca1639af7ad679b75ed18dc40cf43bfd6fb6f7d37f6687c253985280d1cc9804679c16bce1440a00511ac3cc94111117aa8d8a0c61855e67062082c910c54afb8452f1921bb109e502f7a72748577e8418da3567705c8a135c4103964697527c345eb063e60a208adee3609044480030a255add411070d1d2e2063b1e7242488d5677504a1b07980117585adab5c16e490d0fd2e8a14503e743132fc05cd0a2e165081776002028885addad16da9cd22fcf7e97a65309910e5d4a1ab87905d481f82c8e91cdfb3b1cea57bf735239d73a12d44de386515e73d33a8a9954f4b9addb9757a48e97f2e5f6f288ea9f0549cfa448cf80a46750e48e979a896869a404ca805e7e1248fbcd975b2100bf79bb349af7650fa0bfbdc2fc729510ea97d36b5e4912094da569994d4d90cd0f3cfa799ba5df8aa4507ab845404879e82a64583fe640fab1e588fe923e4b13a94ba0a79c8e8a3e76f4d4b5d993e7ce3963357d3dbf5bf743835e50c477b72a219747df8e640dadd8e3912ca0a769e0e61a34e9eb69915b454f863e5e1ea54b239ecb8b54e04cec5efe010ba16817a85bfbe8061e7c20baea9114414598cf0b88cef86f85c50b8cb698314156c0f01686f4893e422c250d010507540849ab1da0823a080721dad036a236b0585de1860d57b451650eec02823f00fdb0c40d33f3e9211fde98402718810922cd512715ed500411d0143bcc6d2802119103aac483941f5a5648643131688dd58f265c8e947c40c1510e598a682b2505f1031604145b702e3ed0070a14336907276660b163843c86aef001698b57a400cb7fab2320c0b872d262c7087900e9d0c446e4850e69e830050c47d81bf37316cf03702349bb3c76cbfa2b08b4092edfddddab188f5f0c0f5845130f896c7848e445154fe0aa07071bac3022c90a0f3cc0d113c50ba0c841b4c609e21842bcf2451cf1e6bf8d8a12704185956d83107aca0b351e42c8b19d5e81810fbd6d1042d885130fb787109230c5d2f7b65100288a2a72ac80063aa0d2faaa0688180216705c99d24406918c8761f4f0b032af4f414609a639341d6dd4184392236ca890d3dead4dcecefc5780ff6e5e034b03c3ce3487608c39def83eb2341dbd22447ad5aef5a0b67f9bc4de0d5da0adcc00d606f38e50cf00ec41ff701eb651e5af1c9533b034d0992bb234d05156d46f8d82404a6b35aadb42af54d2db290267a0bb517782f40a42baa954cb7f94084aa1ad77706976e5633d991ed4f54f8619021a0a313ed666afa04118509e8822c7166cb4da7fac4d4f14315ca006114743f88117ad8ed199a3eeee7a6ad7f74f49dfbc6eba82e5ac33c99cd1a8d083401b269bc39eb167cec39e79f4781676ec9987601d73d416356771e6b79f9a2c8ecdb70fc19294b02e089cc9d141dda77489a8c4ba161a42b8b9704a8a466872ce49b76e3a06b166421d5668a3b99415ce48da2be9f42704d4a18700f3dee96979aae8455fe2f1604b643799f1865f87d4a1f35087de9229d397401eccdb5bd28e794eaba663d3a96febaadd0e853352ca558a2dd0a6703f4d6e5a9d6af5f762f323829b168c37a1ad9885f18ffb85f1afe517c6bf975f6fb8c3f4de1131bcb303b545cecaa4c45aa33d82d8081e7376a04d0fe7e1718d3caee46871d9d2ade08cdc31027453d70edb4738f9e6cba9664eefb83aaebdc9959497af5008c2734a5a2b2ba2adb247f2aaf94e46a7a4d39553529f8ca00dca08658442c98dd7ccd244e7ee66003c13bd3bd37f2b047c06f8e89ab75a49d7a46bd3db81b07d033d7f794ec7c048959ffca7876faec18ef3ee4c9e7537bd8aaee38d0aff5bad16c7f411c663fc05188ff154d2637c5b2fece03cc65fe03cc6e42f9898b49b7c5b9d8b6f5d8bab3a94f7e85e3cd555e7d1e940b98bffbc788b5f54c503abaec37f7e50fee3e29cffbcf84f8b9bba1d9dea72984e75f9c929ab25bea0746cd262a92b38f382c9e4b27b817381732627e7a8b65dbeb3391208b4588b28c2a822bbc9b9e954a557517539abc575aacbdb391d9d8c5627a3934b0f6d171c682ba3829ed1e99abf7079e631f1984ce1c9fcf2ac53ed689aab5e9081857ef6e6666e873a47e79d9fe91743a79d0abae698bf90658e655a9c1dccbab9f448afa24cbc7aba630b26fd18ca274cdfcca1bfa03199c2d3aead431b6ef3e9399c99a82b157a4ca64867e23169d79ca167ce033dd5e59bc3f654d1db5597e751ed72e93c55987b2beb54983797f46a3af592f46abac190a8db16d7a3db96f70adaa8183acf06bdbd253c1c7a2a5ed2c3b7d6e63dadc81dad312986e84aa213895e245691e3d706bf455550f01adcb88e876ba62b9508b4e13c7a911dce5349e7e19d55c50055127c739447188f298ff1639f1d2f1e8b7844de6802833311d378833f31ae7212b8aea7c539047a5a9cca398f711e1a9a2852a2c5a99c848e5b1aeb70942fa792312ac89cce54cd690380a418a393587d3ec6187f4aae4dbae6739fe8f527561f87362dd02add42158c9afec6a7b24795eca1b29b9e881c15890c98679e0ebb8e376a7c1922a723834a7a3b312a9f8eed701dfe03e328d7623a125cd58de03d3ae83c3a2590c8e2cc8f361fbd08b4698f31724e82f3704e0274cea5c7b3f908de92f68d7355b7798f6d699339d50e6ca79aa73a17dfd1b5384c575d4777721404b6f5f3d3e227ffa96ef2d9a9763887c0b6b86de7e727043d3e2efef3d3e23f27e7fca7fa8fc9b7974ea657b12b0267a2731d3cf92c74e9825cba6d11813371e5bd8ab107aa8dcad0db2baa67760bd1f46da7fe02fbf49860ce4e3d265378986cca5db54ebda7a55a4fe5423b3b0fb3536f09e6eca97609b7f7b4b69351aaff0ef421d073a00781aaf524fc2ae93c94a33369a7ce64cae5f14c67674255eba9a4e7423b759e76ea458f877d3a93e9b1200a07b59d258bd026471863bcaef5851242188bfcbec4a0b2c323299df5853142282184106e73eeee428e26ed886b5e1165ead0e87497b6804d9f8ecd0e72c5526c8a2858d644944cbb228ab65d11659b53080730ca31f315514c5c469f302104238c113221f4859017424c0831212425470e60cfcc4c081141eb9aaea1bf28c4195b601558515e58541fab95bca41a55c6fd9a312695fa75240a95d0fd2aed1189f27c3217665c038fc8bc0f99d50aa46841df2085d00d6af65b2405109827450e24581aa9104970865238eae9b7480a1f2aa2507af6d8c21293a2719756a2ff526ca46aa5323f7a65c58984326b90437c284a97143cc03f0192a4ac2186685ae9568158a367d60d0a841c3db3ffd5940d4058f91fae1419e1460e461fc411ad54b24ec6eb46694dc9dfa228a0fc96450f91c30ffe63411ea0d140a8db18bc46d5aa4034ea0e276cc8610a4ba89a7e8b7240011b39fcb0421440a8df221dbcf8f85b44c5e8bf548cc35fe38d1d76a9eebe2d7203cb27e96e4dfbbd7ee36f77432e767767ba009d80aea143d850c6eeeeee6f777775ac51f99aa2ee35c7d0e07add9eec168f2af53b3d04f2c5992d0dc0e1a857b4956281b37cac42abae346e471cd7598eeeaf837c42d0de5300d56cde430d858a6f1f7368118dc84ee419dfcd4d809eb0104152589083ff988836d663fc6cdf368a3850c00e446c71c4c6196544d1fa9668c7d0a10923277898620232be5dfa7e42053078838830a85cc1a1f5f1d033c08a1fb6b0a2861358e6682d2b4d8008043b484304587c40d46a23588ed8a18c2966a00147966d95ff623efb4fe6b3333ef3cc69e6b5c9679e82428ccfa844599dd0bf39c6e96c1d23f3ec454f3cd1bde694d3d1b22c8bb96e90e29be73572628dc71cb331610c2b7ca85f9c0eadd38911e84c5ae33e7f79e474ae38809760bc941b1b8b6ffb269efc78e86c45fd5258f4d17351e2cd6977db2db2c2430f4cd8000ea52b780c3056605a95c7c643ef41b918e38914f3e074226f49452e18c1434f552eba18810edef105134f3c7498bd410e46fc40065676b062040c1540483e3d004d61d48a495fa8e1b2383a388c16e0e0a1a3381d7874f4841343085591050a5ab5268716fc60c41737242dd18243da86837c7c7c7068410821843e88377808218410c2174e074677e1742207008c2e12b062ecb755a62841a708e1db6b8a05407cbbb3e007dfbeaae2db595bb4c4d0162d28e2db5b389dfe228a8c6b6a54628e877e52e22cfe43fdf82f468bff7ca4f0df8fef2e2a12717c7b8ae8db5749b8f1ad44157de303247a40e1db394ea783b0823862be7d43f2e1db5508c2355ab46205503cf48cd38175c537dddc7777771069c42e01a4218d713a1d9d723a91b13c74e853084552acf86ebf389d3e1ae30675251b0f21250011680cc10467f830e4821364d96287263d5c2103285a438804e98e677c77a183ef4b8ccacccc44471c3d84a8aef9f8e8e8c9c223a25022c4b00ab0e07c6f282fc2882bbf453a38f94fabe2d97dfc161941452332ca90e04ca764aa24a24835c9c7da4822b8b336746867d817095298213dcfec3b89c84aaf3a8902593e3a083e3ad27f8d844ac1125d5d27b5955e21bd511d29762ae89208dad016ec0c7b14463178e6193cbbd1d1d0d2a4806ed952dbf013409a8f13285d13a7fea8748df694410b51cd0800000000a314002020100c074522a15038265184c97614000c879640725618ccd32cc9611432c81863082100404406404668360d6453d6119d7208c55de8cff9a5709497f3f2ce8dacc49566e1ca3898b441b196e96bb4156ec84d2a51e027f7e3b619aa5ef4a6fa8a987cec9fbe63e4402a8b25ab68a116e8a0c34126018980b701d3e97293c74a4a04d922064ca4251b8dd1295a44b0709fbf5b30482551d3649e54db45cf998abb4d7641f33fe29d9341caa62bb32a685ed7fbcce8b632fadaaf4d562268139782031962edeba0709ebf3b7e8cb89af13ffbbd26cda4f49c2b15ce248f09ed672f1c964955bc512465193808df56ec366f2524425ff3d89bd3b2ce44037d0d0456dfffb03d7cc5f9c801adfbd87b76bc7428e2ce082d9ab94fb1696d5340a2830a376534e0ce1c94a8dc553b9654027ae67507066874843762fd3f8c2042d58d214a07c41c868561cd61cdd13fc1958d6b97867e6bd49f2d995cc1e9a4ba1742fd270cbbe21247704bc77a298c6430fe23325df9f792727f3d010fbde6f5237f13cac293becc2363d08ee68216e4c24b7a2319b663f1df5b683d706196623673f5ed90d6a5ab3259c6fd17c7e4c7e8603f7b96de88e08d298f96c319c9da8be3e0a0dce1e27187b3ed052f346b243a304b92908d3eba5fbcc09b4ae323e3e15b27000fbf474c83bc1d7701ade1740ae0dadee9eb32b6f3e9188458b45abff2b2c021a89ec67243d2b905ace33888c28b439f31f547640bc412fbb75ae918c8edf19346b708146e4f24f60f1219510212af31c8e52c2c5004287dc44ae3bdd14cdb75035b1a3948a676ee4078740e3e7005d82e79e801804927c65496277e421f067f97a9a6a4f30af1862cc245afd6c458a5fdd68d1190362ae30e204a4502df2fec85ed65370b7d43211b686256910d895acd30969d58138a6d4647b538bc4bd07551a2df1e5038f2d9f21bb508f78d747e156e1ac406f949a3db89580b88ad1a5b3f1d15157191443f8f38057971f6fa300553ec175f9ac7b06660197b4ae27d264e3d28567f08e7bf1ef4de633e17c221c9752158c9d6cffb53adf57957fcbad7cdad7f368ed74cf85972de13d443d49c306a751afc76873670d1bf8308385dd94db9f44c2a6f5828dd6d3fbef01465511a7333ff65d6ac7daeb376191780111e5cc9cdbc8913854fc213480f9848f83d748ff887521c31e9cadc087a8bb98958df69bd1ebb1821e0a7cdfe1ad21edd2adcda248bc670a39a7406aa57bb16930d6e03dbbc9f6c0dfd1907d2dfaea5ca55d3992804b444675047a188b387088f3c1a4b53ca715c5d1b8aa3e030b6b5a3865eb922dbbf4467c972d08940d0f87a33c1d91a249f19c0200110ff9a62257a4bb721284f88543ef92f75f47248062150ead2e049b68b87b5abd61c0da3861704b4819919d290572565afc792e8f054aff2edb9cf6e552c1aa35b9ea1a2ce22362748b20ded05214a27de25626af9d1b221d0427be0b13ba05841cb95f879fb83502ab95db8d98ce51dde8c0958df8c2dfe5e5de28770f05288d0770597f9678806d4a55b432bd22791f928eeb039df41b9316dc0724f053f7b5000a8e4c657b45521afb00ba8fdfdd9068380f7cfbb747e6579b1b9f004c835122765d4274e08305d0581d760c1097c582b7696796f138c7108cb84e4c27d39a6c1e1e87e3c5eb2b844a5f952359c10d938c02d835196c9f91b0b548c95450459d97ae1236f9301baa272e38dee227a932f94ed0d1f0ec5be5ffe7576de2fde377ab598f041cea6cfa1db20dc3253ff1823b622e7f6b4d9619b6e1124392dc06639cda5e9ed761b3539fc0faeca4d927991b19dad9f7d1488751b955be935b4cfde2e0f54351bc75c8371076917dc78581fa6856e1fd98037e43c6d8bea42380e7721b7af53784f7047999db99f9883d1fc6d2eb558bad4b4f8598c142b7ac36ee598d28d8fee449b264475f27800b0db3a9be6800a497a1708d02fea26af5a10d78583581abe8f7f07de37e40e4efc7be171892dee289b831e52cd7ff175973457aa0d7875038aad5057c0a80848dbf985f019b446694011dc9846ff4a620b4ff1a531445cff48c96a79df6a5a168616150fe2debe5ab42dfe720f8bb951b835ae2eb050fb7c58fca7a9e8fc94dbb3941e3a784ab394ca2cd674df5da3138882ecd701b0429d1c61cd7fcf0d665a670bd84318ec89b3060afb87091300018ff030e28528fabca9d42250a687776241ca26585cd5ffcc54f2598b81b60d5ffae8d9470e2b4080fe23f6db768b50d91f9c533a2cae2aa89ec8b8276a454b41a85ad21d1fcc736e6f248baed6720db621dddf328ad9b8c4b7dd3997574b8238552efdad0400d911cbc256dde90c21b65ba910681f1020200de582644b651021b62ce3cfd3fd45a70d9de52623302ad2503bff5ee031bd4edc81f5511fd85c39a63d455f2a970be6b01494cc63e23186c95cdf813d2d717cb30ed576d48906db99b9aabdf50ca06f15c368b4666130b4a79e817f98f0e45e4c6081ed1d3ec500a510d6ff229249197804199c16202929c1e009b99e5c1da23d32399ae089ddb03942a978de2048c0d639d894c1362a9c2921e7d3752d925aca5f84f94e8cf968f38e4f67b75ce26d755a502c14b978d5ca942e3d56ec1f4287fe5821fa20bcb613948d72500cce6830c9a5e115101caa3dcf511a1e7c078edae352827f675ed1fd5c6711386e588703881ed2e2e0d42de37d039f6097df2262331577c02b85ee3b01d20b4ab333fa80bc49cbdea4ef67954c8999a2a246b2e3923a2fa26c403fb3ab5b10b68c755d05e360256cbd012a9a0227d1b80f3dd2078d96a6d8b5f23a12c32bc4415fb69f2b10b54797e350ae08aaa4bc5d68673b5008dc71dc63acf9b0511ad2ea72600118a8ab9e660691d1109210f371cd13cf0a32da17819223e85985785b78385a62d751c8ba83b7bc7c3e74ee4672289c7c6362bd8b29a1fbd9183e9a04d71c377f2009381480bd11f7512655d6b9fde4510e9fe04372079d1aebccd8a976bf54ad56707f1d1a7de8aae6ec9583d101bf6074400b3f1f6e3eebb98f1d52b3d814624830eb869d4a492f660861aa2ab9935dda75f75a552c392ff790213205c6d0abaab7780c1147557564f2ca07c7105749975a49996cab8c2f129951b29a4630b3b0bd1e608958626b9abefb130e02570cb16c9f3ef0677d339990add3e06a2f8d5b602a0a277a12927541fa98ab4dbfa3cdbb33a8b59b356a63c255d5cd1e766a47079abbe22463fcabbe86295546098ae128ca486a32889f187b07e0dd3024da976d870f14800124579249b6c7243a788fb2670b1a82cda588a38ef945935992048d2715068b695ef9804390ff8204cc4712416bee0744fa43b2a4f0b87f395e46cb8ad0cf43a8f9cc94bc1ee8f9a152ea0d56d5959050fbd1a32ecc8943a0a830c4ff930d5a6f2c01a7f51a874bd66a2f463ae7d2ff7ba074cef8e840bbcd333e4e7f8da3112b8d222bede40c125dda970278abfcec406ffeb0fac656e947b49b5f1d49baa1fa550156e2a618eb0d21287b1ea75baa0cadd143ef2d752106d3939672b26f83a586acc3961b0309a690d41c81b0197d727d50570c06828864dcb4de333ad7177237842efb1c5407d01970d166f2dc1a69e20dad4f06a525df01a8efd2df3043134e0e4a7342219073847eeb31a41bd702e559ac34cc5b313a34b42dc64f86da25842f03ce4f6fdc8e42c9b7b8ea3a69f554ff786ba05dbceaf1131784cbe1bbc6aa8803be209cab1c69f4b3e4320082eda7ad0eb098a2c5f7d089b786d3d699353a94d345c2e6a4a4356b5e4967d12775300fa8a8d560fff776197474ceec7a72900ba8c4aad2752a4d605f951f48d22f36f83580e351ce06ed90cab58e63504f5484a8df64b03881ed1f11793294623e45480b84dad6a09234c45b65cced302da350d357f64c6273568aad50cc27381efe04870d383c425c86721ad94be26e1411fa6664f900464a45b13b42cceddb35e431e28899fe63b51d93e13f7ebe38833da5127d19fe4339855396b533c2522defe57c89bfe930c62c9fbdbd474528f371c1d3ba3f385cf71efc131c9bd64be91133d65234a5fafb106aab39538a7a62df2a4e69756e4a514efcab0ef98a72c08693c5290cf17ee7a5fa6d5efc70ff91cc9cb2b0008568b75dda13c609f78334c1513c9ebde14ab29cfeb6466c39676cdeb9cf89241434a2ebde06cc393f23ae519498a05574bfd7e87cafa2fbbd86ee9b88a6c2be9699caced35bd779f26200072f53e4f2de7fc63de500ad436c08f87f2533f6319d455ff0b154ef85c8e884c2a4eb437953025f2d3f8b394086f73c9858418f6fe529c8a721749b940a9ad166ccc44e0330d799bbe3122576d2f02533b55fbb04766c9e8294f122e840d92788fb112b9dd19e9a761156fae39e26d4c41d1efe153cc841268e144a8c1d206eaf6552bafbe1709a976332d3e3679b05332e570c7a8e1eacf3d33bbb858b62c27846fcade99f92dbad35248a307a1d81f422edddef2be51a7ee19cfeaa7c65f1956bc47859b91d3d12795898b28a4500d4dc1ea81beb571408533097f1bd9f1b4f5cdb91c9f6e1a679edc3a85c22b8bb1057524db9cdc3c79079cf7e3a6083100731682cb88542f75c9113a98967ecb012635614cb44179f88c7e93e14cd3e891162cad45d65069f26c4f01c9cbe0448873d07815d4d5e2347f8dc5a75d33fcf887210eb96ba938cee9cde50d1c833e518ed9ee8f7ac28f138a3ea8faf848232703449283309e9dbe2bdba3572ec6d3a78ef929e89337a07dc99c25e6a8ded39c75cad6df80b5a21e9073fbf9628d7dceb792ad8cff2a698c7ce2b439efa55bea53ec312bedcc1a1e795ff33929fb676b0fb353761a9c577db67867c5ee05bb8fcefbff22def1db8aac24deb1f9c5ac69aee122a43b2c1a086d42b73ebe1f2f80f5374a3cf40ed32112065d2ec1d6fffd3920ef400e70de107694b88b77f7aaf058a60a1f9ade2819b7cea6338ec4e4dca99888821d20e70e2515aff579ecc32bf38de0edc00c56b4a87621ff4d31d3ae74c96eca5291cebfedd31cafa29c46a052a7319a6a0a5e600f984c57349bc9461e61dff762c51390211137aba0060c0e31598c24f9a26edbca2025c8e8f51d9ec07e042a9b4ea7632c9e65e8848b6269f46f82ea6df7c54ac237bb71dfd9ea4c2ba610bd57479d05deb2393799f6378515dfa031377f9513223b6fc5756c5ef3facd1db995681826bf467bf1e94302ed2a082669f6e32a99fb45128828760c3de2325c9947672d92aa3e5222454820fc3f1d69c6bd2fcf7709e824d3cd1f85581a55eba51affb0ad386515a2416d8815ad8e1474dbaeb89b6aaa3ed809ff0a426ced04437b6bef5895c317b2a71a620b19f2d5ac834dafd42098500a8e3aa0db1eab403199678b52aab7c1856f9aa5f55a32b5b1c1c15f5a55981ce85dee753bbe981c877d109cc9baf69fdd99c4a6dab154ca7f9ea65b237403d0a37be7b0aa71f37b1053d0cc585907aba1b321267aae345933bc2280e24518a4b13955443a134c64738902ef2142fc91ee940186fa106bb2dddd7d26b1af76a367707c68b7be1d18e6f1efd1a825d8099aca31adaa5042cab6d5998e34821a16675124b512871c387b229e6eaa617d411db895eadc682c84261253d9cc9263da9f687cb1191833dd3a063f5e32a2164facbfa9a4872916e48d6065a18b368c36239fd5eb0a78b4a650e224a36f360b8065119b8d7875e44ef00880836c8147c3e82daa989e2063bdece8e44c0fa90cb3040ae5089b4077990de433f4bee022ccc953043f212910e49b86d37e115565259a68d679e9c763340bd0fab5deaa40534f641a01ebf4c4e68510abeb6b86f19328b1ae655d0062d6a5f73b8c68216c91b0618c2df58bed7680f9b44a1d8ddd6729fa6167908150b3288ecd55e2e34f0a7e2cb594d06900f781ced129765e4309a743532403034f97bab39088af8195548cb3a5d89e3c53f4020d28e0508c808c5f2c596fb19da3173a44baae1a3be7f815d02714201176cab16e3925ce5c58d3e4ee139495484612f5538071998b6081cab2c2ae56a38f34c7c7c42b53746f0be1b995032eee10813683e5011e262dee686f6d21e41511c52e022e9316e5ae591708b2493d27f08276f56687d3ef4b7b5f8b92b0b2170f102b47fb2cc0cc5e64af28caf57ff0ca5a5f04a32ba772d7dce40dd65593fe21740f52630a19e5aa1b71fec2897d84287990e31c2ed79ffcd543d567a25cea6be7be043b16671c732af9fceda3a853702a74af52e7802ba0516f692bac1dcde9dd1ced9dc840fe8b39e21784aed8762b31c6e1196cef7e3147fbb10787f45daf1ac77b459e3a69bb2f7e61a79d536ce3250097d29e27ecaf21beb3ffcbe213c9d0a3b97e89ce13a11810e0ddc156dda5af57615cc2b8b6f6b7d733e4ec39ddb90c79612bc7e5a3896c5fadb1c96b4cd2e6dcc0b37658283acb2e0e1f27a17558ff4ac816efe2b62f86490503bdc5dc747f974dc16634ebe8eb8733d20a4f02e607d7e5ac212f1002ee135a2a452a525bf43d75b089d0f41d7a7e7e3bfb1e5646d2084ecc7e02a51c98cb14ee2b365ad2a6f7e5deb173461abd96756b9f2e2d6eb586b00e7f29887e699db051bb167a1656581a8d64e004f8d2b37ba2f8480a37e703d5c8e12f5e4686b5539ca387a27ce4c95696b208d8a860be99a90c60446737a8febf0553d4c85d638acb1ff2389505d412db491e643e7fca1ba2cf5c723e6030b3a4184537a19af8f148367a25a787587f22c2d4cafce467300403947437850deb904ded80e2a44aa82fc91be3be06884e252cf123e2980c73ac2d34ee299197326c579175d440ad6f94c5297a5a0b060da7340adbac7503f770aab33910c4b71202969883e31fa79c76b6bf8db0ee1f16b29bfe69ca64c4724deecc224c6bc5caa9e87aa5c313688d33f5a238d82dd29f9388510f51ccdb485e33be0ab048acbda4a1ffeb2a92fa5bcc3d435585ba17dad6ac6d2f14d3d9389749843c77b2f29918e7e017202a3ac283395324303a0e8618c483fe41a3954e058cfefb3fd84eb0db121188ebed6e61866885327253a392d8d0f3063a8bfb9d90625d6f91efc2c30b8b3a27ad09a637a1ea1c63fd87a00e56c085f3a2796b2973a7bd6bd8bdf327ef125047c38dd9c486575805d588723311d2a3d214f310512df2d0af7ccf0d455e481bc2cf5998ed4eeb3c27279b449056e8dba78855d8a030c1a6b8feeb09644724fd7c03a699c4978553dbb1c643c1179ca38fd94df704248e7218cca3be3bda7d0081ce8bcad9ddbd7e020ac07b071cb606df90b57fad1ee5f445ee09661cedd1fbdeb63b5bb4e5a7b9a15af81c8e24cae2b225e655b28971ec32382be6f4cc5783ef16cb275a930500979f72a4312c9f73bf7a1156acb80c41d2c9b02e1a5e7b5cf88eddbc8765ccb0fa0c277b88dbd06bf9f44abfa51f589ecba12da6fd22e8d585c3c9cea7ce95f8eb936dfcf10e1de09a1252a64c43cab95e590cd7c35ccf47800991b30819bba3e0cf1bf34bf465e03850d0e630324639e28e0922612e66141fd3268f4310b91bbc8ae0548999f53560fa725dbdf8b3e8c68e26c778b062bd09c205e199022890b60ed1a91d92d468f30b2118a0a4e722bda502f25d8d7816d8dfc8c71cf660722aa3c92ea4aaebcc3696d09e749cc2ba8b54b76a9fadda474cf90448897a2fe0698d30800bcf305989a50fd318adcbaaee120cebbc065540535ca663d378f5d492c204956a678ec156b5e35541b69295f6d7e0835f152de2563bb3de82182cb293363332a1a0bd9453289c70bbf1cc60c0260c5655b125624ff789f52d9064fc2a304a571905c9b547dcc7840cf6a8e20f0efcc8c5164b7219100171fbcb13fbf6cf853e9565c801f9149777335bc6668edd5c31cf0dab5a52b790a0a9dba6ed8db19e23e861e1960752df3095c272abad86b7ba5f7de1e28301b90b36122cf41c7be7410129e1ac1d7b68ae60a66d515ff89cae8d74a015749bae259f081502b03ee85d9f45f4d2a97089a18e19105fdaeaae12e80db07aee0a2e1206abe53aba18f3a7ef3901ef2cda3e203714f3f49fb338f5453eeabe9462f3daedb6285ffcddc84563eec0f66409a5e5139aead45c07ffa1ec41fa91701bb17ddc9f2a480427c504c5adde194cd25b51955df4713cb54d5a15fb0b571b0f68f3b80444c1725744f11150b35e0d82d349decb427a9a181be91709509f6962580929246f457e34099110115dd8d9d507dd64f31dd28ea2619e77fd5e455a076adc0ce33c6523f80911eb48fb11df7dcb00078704dc12fccd2ccc2888025d60e39ba25789743ffae17016a2456c8780950ecf2c2d663dfd91599b4801408c67822ee022cf989df81b90be2602a1db15bd617b7dda01007f5b3da1ecda649ec540c98a4c8a852e2b6e07d630404eed85f4199e30c550249a37ce7c414c40fe0b883991149fa643010629e164f32f3e9191dd6dfbc2524a08e47e739689cb469d228f99bba39c1934b280b61c110e0ee6e8e7ddfee572cb4a97b105ecb8e952d88e4ce82784d0a37572e0e3614a3037266cb0d6a989b7b3a8f4fe6632d48e2c011081920cbc142e09f19ddf2029600d13c56ea59fa891e70f7e1e32afcd6ba39327153c957b072414b59c06485c3d594c0b47ac0873523da6c7b83c07fab4a92d1d6658775355cdebb7bd47c66541486f1a161dc0e6af755b525546c0e70b503312583c01533c1ba1aabcd78a28e357a0175fcd22cc98f7b2a5de05922500a5b2b01a67d4751ef2e8a098c539e13e3230a33f39b16dcd5e2b7a7591ba5a749d8dd84190853fe699837ccd693632e5c8241f20006e0484ae14d839e0de93d3a161b117942fbd7fd14a796ad2edf246bed67dfb535c72162f362147f451e31e24e36789f46762c39c39847db38f28c15f668e12eaf57b850acb209f0de942bf4af5471d0c133ee290ecfee13bc6801b830e74bdd6b9c78644d67201d9311e1c9d5c1c9272628609a749650e73a32848ea1d98f5ef8d22fd2d050233ea2409cf9ff04cb1a7660bf706f766196529bbd04fa7ee98adc207e3772ca0bfa0f1a3656f81cda6895c0cc7a5864ba0443757d8e7322c1f138f04c0060e232eccdd4b8b3d6aec5fe087902e74004c0601118a25c5f42e08f0326234bed0e088a5114bda11184a6da1a1059fd63ff7a6c119c4e31676f8a220759e0fbb1a5260a388e077349883fc563889be3438c7062d474d6839f3b08dea0d0397560052ef954e9d4768e6394b783ba7997a6a79b94d412494f0af42793ad2a15a01f61b3897aa586ff72d9228d734d297f6af0579e4f2a7e228648b0a07d29e31f59664d435d83d43b15fb93cfd3357e0b080d25bc74c1ff29bea80df51a1a02df47c71af30856f166819962101fdc2fba6e2b597bea147ee244f7eafe28024136a9c92be7b319b516040d5e23f25e4003ba0206cc02c8ef7c5898548586bdcdae4150970c60e2895bca1e9942995ce0434bc759bb06f0169cae61d242ebe45e981ad2020bf35dddc5d1f07332141eaac722e2664620e0afde7d922b64e10940c8f00729d52aa0c2f3a341cc918b02c4bc4b7dbbf2b58a3a2ba424c5d48e0cc14cd6813922139706feb3ca73991de3cbc780f80b22f861e0e6d50a90a9afa57eb1e1f87b0d80b77c89ab920e44c4ef4535f09221c074ec170abc43a60e79b1334b672b9748bae28b9de4bcdbe016fd03110609b76ac2eea456e3116db29c96c4394ff1703af8fa6c177e35f9ec4878b6683ee34e602f5383fd0a75c8990b8e6c84e74a1870cffc23c96f4b8ff15e58ba676aad1f8a8393387912e8d3a82d3fe77353789ddab678ee13fb13e87d488e597f1719c6bed560eb9bd33cbdbf4181c74e05f1e6299c1ca4b579f45b25a3c1966c6b8aa61866376d10cd2c935d8238b5d3579d9e7588f9a237cbbe355ad9cc99a1b68498fe34a5437462a1e9ba33747516a863ce265b51d38f30741cca888d7c7e3abe28041be10dc7716789eb5d9ba89f221b70037fdbadccecab83db3b455f3c57fb29948ba9151b2d895b6eb11d5886c3e8a6add8c90e31f9b11e0f57bad879132a47b264c3b0060fa265905087c93eeb28b026af2ad86007cfca3711f2f247138040053abbbe33f40800751b23dd04ff18ec4b123b57fda4ccc10d508b07c5ca69a09730ceb2eaed0579e138943c9a476bd8af9a1fb2bf4262b00d70209b5b5ac521f92f5da5f0723b728ac538a65db3f3ef5fe22465625645e81c5301346b779c97a827b1edcdf8548ef87fbeb4c50fed47dd7a2b1373f18d32046ca202007dd1a5d040b0aec8fb8e269a84b2527d0c320f46a6d2b088e9b1f37dcffa140d1f2d4fcfafcb0c380807f894852de913c94f12bbd2ebcabd02b5dc7ee0d5d9a7c8c97965638ae37055fcbd7b2f40a5f2088e88cfa6b0f34a105e4d8a2414f251bc0ab8de4d753d76e8eccd1b0caba70296138f785802752e31e47f4c0b1b099f67eacbf0a346717e7a0d322689979a3c586aae59a8d7fc33825dc02100939e27c6b0978c12035830905bc853bb61107267ff62f376b69b27bb41e82dc81395b4e1fe50faacb2cedd57b5f6c9e5072d50a8b21706f429dc5d2b21955584834147c15b995c9c2fef8027c7cc751fac18f216f477b5cb03ea0ee3b4701add6111596f9df85c8ac60318b9e830a260fc1e89ab57841a00d17c67fc2a72c115392710aa895bf1ba4fe4b1ea513a4ef3161d66cc79171235f9464409e7e2a48990e02c9d163dbc4c770f8e43283fe064e4c0c0c0c1950d22dfcea2fdc11109406c6ab04bdef6287dd192274ec2f38f6f7f56e2156c7902b0804d8eef44b8add4772039bfb0fa8f60d1da3d6eeae943e75ebb7aee019788bfd99b2a16b28bb97e226caadec1163ce5cfe642d2c5d0cb2e3d4ccc518d9510c2f69856275cd8d677d33d2c4edd615b8006ce9f3e9d76fd6eb308ff206c75365f4f6827b89f4908f2ccddb96e9a97fab277d3b20256d9498eddb61ed6d9a5c62efb01da6f49d376724d692aadeb2cca5fafb663c8c4999dacdeeadff9fba1a1bb83a7befc090dc84c73bbfe32245834d6ffb596a36f06156d10c569938aee7eb0e6571e7154ae3bed6918c5e2ce3e55e7046db632a03de07e8aa445a83267486f0f1ddc55ac34f8cbfa2c0f499449f72f00b0f313da920fc040367446709308274044dd7f971ff955c81d1b88d1bca730058f2b705000621bae6d5c6904bc0bc39feddd982c4474a15060c640d13fe1c35606bb1db8fed70b376caa9a11e471dc5da307acd3ae70874c8c65f373d96811bdd17dcaa0443d0a1e31cc33eb173c6496df708dded12ca32c77de250d5b49a9dca8438918b98052cb7a23e3182e0d4a5ec8e5e9b986cd87a96d5caa23a82af89e3b10b0aa0be239ae88af3735f567e00bc7d7b8c7bf99b55635c3fd9d14474382a5fb678ab53febc88be98aecfa89e19eaa0b297553954a476577d8351c4db5d694996196ef04903b2911d04ace69e8b980827b33c6a08ae6dcc17d2e7df2341912e9599ab6dadf907c5b2086d2c1e7257367896f77458c089f70ac1ab557813b517590a7120c630c7354976a9e124c596996bc42bc87167cfe2db5d9cb58ce1ef68ba6e15275550d408dc86e063c52d4cbf989ea52572cd20e8dcc11e2d8d061f4ec15d23be792f9aa52b297cba7e3d2768422e11950c9bcf69ac0fd197498243481dd4c6938e9d10872a7fd76cfaa3653de7acec1c361c18f1f2143b37696103ad300ac864295ced055613c47bb3f59d3eb4cae3f24578d0ca3fad9eb96d67b04860af789e8fd9321f02ede971463f28901385e8fc02e91beef01ac1f91a83f29e98e0aa5297e06124e2c5b82db23700f3cd359f1391eca018942dfa6543d2a8b866b609d36d7675482da546fed27b442a1ebc8005e33e1be7e4b15b398e28eeabd1e89642f4ad1165a9686141d74fdcb8936edc4b3fe698baf56e241a8e46671094c71379f743f4ef3a3af8bf70179c2653aa59bea62b679df5dca81ea4d48d13d0cc7b81d62837830ad9d5364b50d3a91328398581b6abc2662e42576b0f08d7e1cf7dc5145d122a0c3ba7fcd129c6a695abba7817d1a4bd8e4c361f978569d17f4a7fa5ee66ee0fc290b06e7acc5f8dc6a639341531fb7323eb4a098cc98c92492b57383c975b9b05eb403edae6b0c045e8c15fb3b5e79644d83060d0a153e6cb4aa2b6da8e0cdf4cc1e9bac86459fbfd6567111af0f281c7b37d223321e919ba6f63dce692c11c2d53797e52fd046f6d54fe15a1e33d1d0a9b4c9ea02e04550db18d4af4a794d1436b500c87fbc87e2f3c686a36d4a546a045ac32507476ecbb114200d8fa79ff0e62b78fdd1abea0a98e7f1c05eceec6837577980e78ef3deb6b60d76f075428cece639a0960d1a11a2d570c720d8305056526b9c01ee2aed095e0421a26d4dbdf2153c5bbcb75184d16b7e05df9124927dd9dd7182d35f3b404914c7238e11a5f9b2fe3c4ed64720d2c473bb0bce36d9515545cc7c87438de802f8b755ef2965e5c971007e7758691511d03dbae2c9cc05aa7a6d723e356a69523d43a2bfbb4114c3e893cea7d9735dad7aae11baf478eae444f7af927bb789d60eec4648109b264d4cc89b76b27658257ee11a50013823e1b1e399f4046cd541d2479527337f5ae0e790a324566ee773c521292a07960d20287695887974ce776dbeb0d1457dc595d0dc78d32ac64bc25d973b770ee55d25ae52d1c76ba8d646db277b95f8a6048062acfec9bc368c573820c5fba9c7f8c3f9ad81f2762e3eaa9c1a3bc84f03fb7e98f0746d131d147f997609c86f9b1004afac00072a15ac93435f43d1b458a24de5302a095a9ae8cb3b6448a9f69d7967a1ad56c75bf987ad40a96d7cc866a72e71684ef324296a2b8f6840b932fbdc3ae10c0e9323caf9c369841521a59f4ccecbfdcd53cc6188894f9184e6d9713ecefed60ad1f85bdbf4efb77655faad7530f171e05578c1798a07481d0fbf55241014c32d125d0a16c93e75a5a6e9da6b28ac9508562dc660ca954ab82663131c37268dbe5610fa6f0216fbe2fcd5cf9cd118739b5484c2cc69b5ee4482b802276ac04f195760b09b5b86944e1e3de5656cdcc96491770f6486515c481b0ba4e8cccb2f095427de71a574b1c47dde6c00e0278b9209be9c19529693322d166843adfabdd9833456294cb4aa3a76925368e99f8d752e76e8abb757ed6e38fbe8deb22fc4d9d93a51607d11b68ef4c9f6a2f027839610dfbcbf2cca9fb58ffe0828060586f70c6b964be05c09be9e262a364fe890165a7e6a3758fda404c388f88a4b4c927417dd4a658737915995ee1e2ff8379837107508591cd8e380cc9250acc2a313598a3f3615f9f027a8a1487a85689bed257b5bcabd02e2ffcdd55c21f26511ba5c96259ebf83770fbf6428abb0e703e6a64a57a06de3b8c8adf7e7ff9c29f3b43fe4442fddc35cbcc43164f430c9642c273052ced775ddbae400c3b2aea84f98d8584a73940e70c0bd944c6e5b99a1a89f9d993e6fbc5e05b6923ea8512aa947ff408a2f2d6634a9aa0d1877384c5e6f981620f413e2c2b3a83e93b360598399552293937d1e32f44aa29264ca92fa549d621b12b59f72a9bf1f6640f35295d5203f189fe5ff6a4bca6693a85a7cfda150160000d85c3de28596a2ba1de7c9beeaa9c29e7790e98c509ad2bdc89429a68dc62272e36cf89ce97dc8c36c8d8bf0b7b7a6e29936d1e98a0cb8f19482661688d9bf9973286b7a3a657e38a40bc8e11f4dcd57093d41f65106bef3f155ab63f5bbd5257cbcd2656289d74dfe1711f84a4ba57ddfbd26942735119ed9761ef0c72bf5ad1d6b4a7c388adc8e33056e7e59ab8db8939c08fede6f81901b0d65e72f9c119f3ca1374eb38350f247a42f95ac09f57d32f708464b339d45c2b1a62ae78765d0fb05c7c9234e59c772b2482e3664c4d466b4eb3a3d9bee04123fd02aac971bfdbfb980e9132c78a85befadc61a2a0c6c25050089f8befb69fd22eef553a4213c1cfa01bdfc6e18db43201eaee969b6197c771980beb17053f774eacdf295ddbd1e984e772f831f1ab1abf1167b62023919976057086cbbf9ff9fac57940053bf1a8790dbbd6bc88972bbe70e37e4d1c5845fcc3fe7654499ac99b4d88d9073097d49e3a9b2226943dfd31f1ec67aab6501d61cb8ca44717f93f01338a004c79f5eaf96aca1906f138e64cc435618385b82bfd48bf05a59911be21a8d544e72df50bb898d4cb207a1d162ca9cb6f2b285acff0a9a1df4cf095eb97c19df55fb13fde239933c645e431ee89f5df0b8a0d66c4180cb3533f3948f33438796af23ab9e588a9d6bd0023ab77875c036db146dc91650d7e4c265d56d2d8603bbef9ff8df401e52276d159449fc2a7de0d94ee7da1b36eff5888ed129b0c20c88f4a0b417eb4af17f3bc93bfbfad6190dba47d58bd7e2be2176cab11b1f9fd5fdbb27c8a79daa1f441e579d9e7421d12d4fef984762ec4130eccba607558b8e41e19f3823128dcf54ae29f1cefe28b6c7f5c2148b938ab883029304b5b53762be9ed93225b565b062bace605c3c970f25dc7be2d0b60a7bdf7ee88f918e1de06380f94e5d47f92178873499a4d0edb845efbfb78dca95fe34308771ad69c9a0ca238537082e8e770fb2bbd3f1f6c3aebef7a72ea15b5424ca83b030b599b4a82b6fad70ef735d8d146724174945d9136dd2b048f5bd2d4404afb424ad0b32f6b5d09cf7131b0379433be79de1f7ed87ba6b4a1b2729ed0cffe0ac945e4cf6cbdb113e2808c058a66262a22065655f2e32f196a22e4a230eae7e123784906aa25463380bc4b1995680ac1055bbc6c5b90fb59a98199293fef7ed00c0a788fb5458aac9f65d7b334d9f22985801e4e500a8ba7ecf05b24160319cd854d0a68462124d5b812ed4ae9bf9ead658d5b57f79901bc74d3a0026fa8eadda4862f62842f828ba8e1885e97b6c97a2f8171d5e639c757d4b406a1441a1cd721d52ab12aa47c8b80b330327f03a84cc2968214950114685c951e974ce98bb883d7a4350768bcea7b72c82e5b9f13e3c2953ea03d9abb5acfd227c046f51f2a11613e1d29aabaa07bc1fa18f0097a434d97cc21fc4d80ee0af6928b087d6dda4099a3cf4bdc8ff0461fc53c4a1d11a12b34998b089fd3612bca288f2585e11f712da01b4fe1926b884d48ad62f55641a0ca09f5c496a53d2f1b6bded06cd4b44fcea954f351a426c7038636b81adb503a424be011b8ebc0846f3307f86dcf4a81761a01d981c342aa9250576f669d15ed5f79bd99cb7fdd875538a8fa995c58009ac037ac2c61ed5cd5315fb8d26398c4bb97687d81b2787a1cb735834d809ce557f04dd6d671f694243160a71ec6c20ff314ebfb062cac9562bf120523190de0fe9f9d84acc1fa8510622d69f9c676b28fe67797111261638aed3d0e1fe2b110f6c1cd7452d4182f7114da3577c21e6def40c44906c48af63aba0f4aa42be209ff55a336048537e406826439a1ae020dce1a4a9615fa6a941201029b61ec5c23d0a34ec34fdfb87249a073ed9eb9c0222331e0da1b7a539a353a28727dfe8074482b225cb171851a3ba8ac65ecf67aca87b487368acf63397441d2b06d14741e9b191df665aafd0232000521e8be954f57ef9cb19b09b81719a761c0d5124992509e05d4d02984564cb806034cf1fac12c170da94fb985714ccfeaf23b3cf2dd5027b80721ab258fe936b38803f5014108f8dd3f752bf07e1b7719ae358ae3f39e672b6a7a721223d96baa60f1bc91858d6d19bbf25ee39175db80fc79323e0fe11220938675c5874869670089fef72a5b427065e4ca98b5d51ae77d3e302eb84bcd3c57624650c4348663339b57c6730bead0540ee61bc66217dad0d55d86894a452359a385cdcf21c6c21942b818d59eee1c0c828a25f0a6bb4a685f80712163f8693321b04014a7bf27c24590ebec38c8caa634b1c43efc37d962da6d9c69492b1c544f652e200d4aabb9160ab30b28e24270993f44832a5995a78d721a16a2f7d7c160f65090fbfbf76736f5703b401ed501377ef6c65dde60d2c3abe0dce3146b95d05546ed7ba0f1f554911a55a08192cf04e91a53d8890545567d1686acc35c8a0bf4771fe8fb48e43d7e7f97c18b80ea18becbfe2aac2a117b62003d99fb03f43e3bbf620ac1f72684b6d2419e329bf3cdd8c22351ecdea40b5fde0f3513a4fc5b0683556a6466833a89a1edc6717f7dace6113871e1cb05fc94697c1affa9cbcc4570d80899b4e7f1bbbd413a3da1e0cfc4ecb54f8a36ebb76d59348ef74d19253a0c62369ab362c96424931d127848ba5db4fad09c81867a2f1020b029af3410ceb3f292a37147bb712bbfadd3d7c0b3273686f25d18ed98e0a11236107e8e9c73bdb8d6779b9ddcebc229ac3b9e76a40d125c2e002b6b56ebbe6a07f1a3e6c618fa72798a89be6156a870686dc14a480458b7dbb32899face6d1ca509c3e897ed05b5295be6d6dfd63b63206325b360699adcd42665b0c464d4bf4f951d15261136e9f9d6c421af0b742d0b60806f1e5e9c1aebb2be6c4f91d71b509949a9527963279c6b41c9ef901aa4048706cd0720857465106c5131df299db2f95318a50a19c7a9627e8de03cac5b6101040472745d50a3ebc3276bffb2fbf97fec16184640112c0600015608c48b3bced1b6f51b06ace8d471da5dbe43ff10fbc2e55908e4d0db558c3a1e387118feeac2ae4615f66e3582be3a5179e7e8a1cc9cf9036db8af5afd0c29b3335740eba29a933fb68dd10858c7fed7c82590553f3a2985155e98171ccec033675a5516875deaf13e9506c672bb28b9c74c678309a02ad66515c0b81394709d6585238046fc0e84192eb279d239c0b341e8bb9121f1b4691e690fc75116227bd0b37f03d69548a3a4f907f6dcf09f8cbb93a9e2ffb52e83c079562a61c50b8e93f48e0135bb30ac6c85384c82524cb2ab55fb813e590c975a216054c6e353224feb9a922c4236eeeea086749398262ee248f1c342354f21f376688e7a24335c36552a63c15f88efbc3e66aa88d40a9beef9ab13bad026df42451d5434a67864a7d0e7f938e7112d93a28e823e21496a92654664fd679e152c34d50f088e0e2aaf19371dbfcd8bce2dd34f3789b6ac762c375eadc9193cdffe9103f324b26ff03431112c28d12c33652ea719b55b6644e2d7a04cade2038875a3ad2ec9397da9183de46adf046b0268be67dfca95136d89244344b1cc34a70aa4e17ae11430b1af5f84a2601c834dcf569adbc4429526138632b5f87e6f6d0479792f0715f8abb7dce95aa8182bfaef7337d514c444c9c036b13e4d232098ba5737af6c57c1bec4e31097b925c3a98607ad6a1a9b8994780b3bcbedd925745d21587db26e27f2e1fb420262e790dde4c649a6c220fa750addf527bb6408413bdf9034563abfb90d07fb70e88418e5018c46bc62a65494cd766bc3d44b9dbec275219b0eee23aab3777c94de13d8ad4ee7be1b0d6a05d43a23a362c155aa4005ccce2f957fd5e67d271edb913ad01e17bb5100efa7f1e2663009d2376f22704b2ceb58e542b8dc8e083f403659059894f56a4a5c65a61ee0bae948ab11686e32b37f2bf4fa0ce2451a9f6411c55838a7610cb0d64a3f72dac82b37f9c74b0aa3a648bb2ab92b1493651d73a61ca9ac15487da0d49cb204bd614e4fd4da9fb7821e93956483c2e5226ad078509ff090b5e263d372c50ba68a82038b14a4af24d26146c4a5955352ac97c97d7cc45f7fc9cc64192894bb246e89c5a02950c5f95a010d079781cea5ee5f5ddee76b1acf0ae4cadb781fe172945958945600e14646e615933ab54a791050b1e8f5d4f6c13f23b76eb0dd059fea5e130f3e0ca33a5816f6ce00edee062ec7f31eff6961b74e2c8c8d18ec875613503da103afee8a73652e9b449dd1c880e0720cda8de7463405a33ce7a21102a345e63e6ed24ae52315de21f65cd4064254f2951604b2f6a12261c3b34e8f851546c08e00b89781e8bf2d5f8d3a363c835226067dc5a7caea2caf6ba1b7d63b387ad2237cd560ed4ef73118d48101eafe16aacd87275f8f72341ec4e348e4e45f37c7dafb5c87d0568d31ddb66de5aaf9abf5a517fb80e3f9cfb015ba506417aa1b0e82f45076359cd4872e83f41462893230aacb490699930a80c78c3c5c475ab710d8d12a33406c830973d77068d354e2aa303c7dc0c0abec7622e9899cf42754efb9033377dcbc1cd673bebe41884d9adbd6ad891529a7c2e298c15288710d4043fb473ada31167a094a60a294c21345ff9b8bbda2569e8911efc8edcddf560fda5987754bf1b9f744ddb1b2ced127f606e063bcc6029dc1aa4b52804cb8e6b00da3608867d20b81b73a2b178a501f1d90639945543c2ac740da20fb239e535adac258b998d4c58103a90fd91075636e11c09f1586a9879a42c9cd3c111b942f409a43161326df653f574371be44b699f67d3375b29464fa69514835432078fb6dc3e5fd47169dc155bea8e961db4f7ae20ca653d73beae6cdadde380667daa635d825f1d423e9d997afbb82f11368be4df74778969bef0b33da486afd420ae99f564a44e311aebbb91a2cb126312624a47a11a009f7995f33a7723f53159ebe6a63936c33f20ac57647d90aef4bcc17736ca8588c66dbe97a65dfce71911e8b1afc2d9688a91c4057bdbade38e6f99e5c943edfb6a6a961e92c6c983a7944fd24cf5d1db79a817258ff2fd0515475f7a1637e0c0d32793764bca2c47314276da284e9efecdfdbab391323b5d65c81a5e8207ced5a8d5c75709e18ef055ba13be7fd0f54f458d134ebe2b6f18b4b618a8f4fbbc705eaac280bdf336318bda3e2a6179036fb4447a2ebef05e04499fc9880e28b774e700171643976bc1ac29ea9129b9241636e1f06c5af9eb4ccf6a7d59e37975719f67e22d4f9c910a67294dc8178ecb38348f168d3847fb4e0333c5fc6a29a632516512f2f1cdc4c179068493f8763b7a267a7a3f12d5124e83b2debd3535e8ede0fb68d63fbc01a26d5cc986368378bdae29565f5ad73b16f702c3c077d9b274ba841f85358e95bfb197b6b8c4fb6a91d19f0875bc881a647db237ed50e0d00d44d9082c3010dea9531d82b33bc5f066bfcf592af3834b74e57a07daa5d51de1ab8fbe11259e7092bba1ae1f43fdceacdcb03b3e309f0209fa18fde1df5451b297557e5f60389036d23d4c405ca1ae4e5e65057bda3aa301bbaec8bf910b12365afaa1665840c2cfc21e9cfd853b1c6a0161c607083f40108128929afe52cd43d8a6068805217f52255080876bacc245827add16ab55619a4f30de44d2431be8cd1c466de51a3be901bf5fbd1422f6f51d2b9a0b624907807c181fb9740a39d158aa8a0fec7897a34eb9034d46665e4119243b6c402d695e4692f91a493e122327c14a82910c1a26daae1e55bb9f8d7fc04ea00610a1a67fb624c97ae988c9b54f691eeea70987272ca22c828712b35421b31793e743edefa8ee3a3811a74ad8df745bdcdc0ea16776f7691f11055dc01c242fda068858624c967497462056549b8d9fd89264df5c6d2dc425fe5d229eb16fa1d266e2b3f211e8ce335b8a1f9d87841764bd428195ac4b5c0bb5ee74be14339fa4dd72afdef36acf3571dd0af0cbac15f41c7fa5b177d2bcc67e9fe06d15dbd0b9d08501e671a49ad487294ae7d423dd9f5b8ba3dd178c3e4669877601b0803a6ddb6eb17c92bf0c846e9c486804d2fd9427ebc416da95347eaead7a5c07f333eddaa43601a7065baf4d31cc28789eae3ebb5c6c312f68d7207b42842494b20c08e28c1088d7c910d4ce4858d1c6a503d32885ac69c1f290193a7f9bbfe7c33ff178071db42901fdef070d575ba5607f50867b92494ca5a2767dd3ab3863a0062b102692b438c34d9d070aa7238d25964a9da5bea756c93956c4a69f756dbbabbe9e5fd80654a82c1769e0e62d7e177e95d38f1e660a5a80dee9a443a6f699561654618e1b2edccacae1e00bc4bc3528c442cc409c967f920a2d45761d11523b817a605851cc5e301e6d23d33800ecceb70523719aa9bbd8eaaec031100adb471be4c025af9caca99aad70e0aecb91a7cadf7470de9ad0697d7e44674ad7e974fe55fda7609dee93cea354c8066260198a55a820de1af04cfd7f7d2d5d20dd0addf098eb857b29667b095e50e3567ac19a614a44533c9d339c485946b3df8085f81051eb1b6b76c99ec996568f2e95a565e7945c045c160b7eb3e1fdf140d40a86888044183c4524032334ebeccc5ed850fdeb493a16541b2af28b293d7d3fe8146eeca24ad47fd0c195798b601e95a249633d3e8c0a40759b03584b410fc9cec4e1c779171fb9da3cf96b5ea69f238b53b5c53d28dde0c0af0215827a6f3fa46d9c11238d25257f93d3fa91b8b61852239d58678a21799c3f65d6b5fddd447f8c9b997eb467623e08cbad9681446d4af6882ab5a0c562ae599a854fa044e39ac700dae6d49561ddc301a548a78b07685277f213ed59c7aec486aaeb8b1a49e941ba625e5fed7244f974651adebe00d6dcf15cb2a5742d7950348b0f0d6022c01aa6e9c5bee8b8c222e10bffa0431e5a57fccd7252ccd1ce631b501f5043d593fdeedf080083add2729d452efac7582687e8c4938e74813def79535cf77e2966aef1b184d0930a8aa375a99b6407de0c8085ecbab2280c8b29df9785a73db412c831d382bc5e5ecd44ed8ad2f74b5373112fe1b392622d1cec25331bc4ce403d9a0f3747c39497c941da19ef922ae1379edd5f4e0921762267383e390d14ea0325f378fd07ae50c8d0cc1a5f94f5782a8372a06feec0088e24516cab4fe2ba890cf52285940c113ad38c356da04ead51a4e12f9b18abee7c7d798d4635a1a583497d9fdbed9ae759991de5ef7fbf6be9bed9436448a752c0a0d1c25cca88c20c48955ec38a747aefa7fbc248f746cea579d0692a74e426e3a2c3cc6d973d08249b03b173fccfe2c494539b52cbe4ca53b4c18dd44e9832dc926274ffcfee940985c2d63e53146cc2afd7705830a32199844895abf0b9ab8ba4e40552df377eaac0437efd08e6e4c5d426967c2f815c261e8add11c24777f5803c1ff01c765cbaed4eff20aa055eafd0b7d75d558f9806eaa08d221d7853ed1c66e384f3c1febeb2fdf52050c462bcbc69e6c76bfd1d075e0d39d17cd24f8d075e272d119fb2c530361deb6a6fce52468ab9887468cb9d0fbfd2caa686f3210aecaf0ac1791be96e599089c33119e05649dd04c03bdc56156ec718b9aef1aa27f27fa8efe63e88f152fd2fe96e3212b506344a41c7e84eda9abc0c46a6ab18144ca54777b29e1a5183309452296aaa2c4968d91e9e11ec85dbdbf93bcdf7e88eb2dd3c1509d2eb622a15d8d74b54210dfbe20c64f7fcbeab1951b43650af65892b81cf1c338a976a3b837869d43537eca7f109d0fe08f112931e7d5bd5d4fa106473da9b5788f0b6fd81d3633480cf4345144369eb4255416bbf9770ebe8ca54431e1861463bb740a79fb73f7cefa8232022dfe622df78146d44628ed469c5cda2f58e4e1997b374568eba839edb3ba6a215e2ca20960e76224d6590a847296f27e746a30debc39bcf1c4b5dd7a693dd2ec73bd7a12818d17736f90b6b2c768aec1721db4ca7d008530e4c7d1b6c7342920cdd02fefe2c7eb0b41a3fa8bd3b4b346a3f842ea6706b32d910b36450336073a0ca6dc3e0c4cadc1c0a5df1de906f009c30f30cd536f42e85ded2029dc028cc35bab1f71041fee375910ede67e263af629d37aaa4287612ad8f149b6aa27f88b50e45b5171de0166b1544d95e9b6b1e70a477be99ea7690e8a1ca1bd50197cf09caa700aed69bcf9f6360ce18b476ea44328bb8df0373e908a94452313fd477d2bdef7646b4ee008453b1f83e0f572726fb2592eb2993c5bbeba20f0bb02ee8f4033d4c48d739e7fa009032f7105c8d80810415d42554ee27c27a8238005e4e08a65505a5ce438af8dd46e2e7cb29a126daff1b32c2b67ce73bc5e78b2e10329c7a170abab8fbfa7b47e45d92146d7fd8954094ed709c2c6532eaf532cb6f293d7957597cd6e642641834c355fc3f14b1903d04d0a8a43b799640357d5647ce353d683634c9068cd653f0221530e1900a39bf177d0208a9f829caf4c757b523a19552cb26a1d5d20605ba9e281105ad4880047ff7090a0073d4fd1110bddf8377b283fe7525d0f3cbd0097257f7fd0a91b691f46c873048cd257331874fa2ff8a78d42cdade431d22dffc268d7482a146eff2f1b38343aaa0dae37c88ce6f664cc23055858b90a66c038e63e87d14ca3bf4a3291620a6876cd3b7a4a8ae69ec798d9ea66b4366e1097e63da02c0bf25d3992bd0715fe5deacd33d7c15f4992ec8b3f265162d67afab12e5557a721ddd036b7dd2df17149e1781e236f81b330ae5bedb6c3112a6ccde9fa1807bcd0ded384f0cf563ccb032b45af9f6f56fa65ef8f9aba51fcdbc36007593204a5f1176e4952d3ccd1d5bd0870e90704f71f068b874b8d7295173bc75f38502ddc1ebcdbd0020e8975994d9526c2b4debb2e01ee5db3eabb4c945ab855bcf0f85f550aa22ab5c9c6ca5f94990d07e097724e6543d0332a3f2900a0628427b079e8025afae803983da8303b54be444c7c6367b4c076d61726a05c3bb6d2f10f86081df67e21124f76cc8b7308d66b4f4dc604a6f315a9a256162897389d5739405e4c7fbbc4a4ee6ad656da5f2442ed4aea196ff8f218a70377bf764e477a6fdf18f0eab25a8d73232bf2680ad1f26710e87bd19a2872f3236bd4e109588296e7f113175d7338af3e834a4f247917922cd893800d28e975e890e620a7c15349c48339dc5974be944a6351d96c32c93bfab09d2c04127a41b327756b0350c867fd62783cf973e01d3c4a1c238d2ed7259889848296c82d2bd2dac604e5aed13a799f5c0c45a423c1a4a18a230906eb111983a3f941a3e76cd86e0c19490457dc7dd14a48e01b920b6d8335ce334c9b0f156c970cfd52ca1446e1e69d0f0368daeb17a3d1cde272c3505a2ef7b0d788857f882ad2a92abec9a669b490e42a00b7c8d0bf8387e7126ec81c4951335a4df310f090034c88e33ed767f8d549a6a7a625ea683fb54d1ea085ff13892363d56c42860caa022511456bc779dd49ea4693b0ca9bcd860759e87726dcfde9381d31f0e177b648888a681662345317ccded0bbcca2144d504f1fbbff2ec83bc149ed15f4d7621724893ea11947c0e112f0f1724ae2f2ea609854c9d0292365c9d454b83c61f0d7f02e5a55f09266a581268ccf3b7b6f7fa7d85e8b0b02a18d48f62d6892e18ed4cc7db2996263f6f505048930405dcea0d4208e3dfa3d22d9cd34863234252cdab49592a6c0c7125a5e324cd413a6be2bf65d588656ec03b803fec51cdf8104de0286f7a6da713d6436bc5b17a43842579243ea2be7cd0f8c46ae9f42d2c3984b826011be79502a571b3297d8607dd25e17481c674d5cdd720c9eb2681aa2cabb01a523e4e0c44c7934bb7731d6c7e991e0aa2f60a60db8287aa61d31237753749b3614c5c7a27b28a4c378fceb491f97e0f050fa41b72a7f9ac7d571e423221f839597c17f5b1dfef0555ae206de46636a8334414392669574d63b8744c4d34c2df9b788e6b079f7e1809b0ad006bf9252e56150972b60f65dd36af0b2c722a2944cbf668c19bda6484e1dea459da0e64dc4236354bf4b88abc26438c694f0e878e8317baf37fd8d70c50d309040363ffdba8f6629bad416dabbc8716636bd9c9c55dcf0887149b8e0720f059fc91dab99a76bf13f364d794473e1f22d66912e59abce2e4cfee9446c381d147ec44439298dc07180bee69a1eb68ea199a7cba5336906c39c60298516a9cf8445500c878e8008b167948153e30d8c743b4d681c1aea81d14c4a947a09946a8ece9f1e7dc7b581afc16195de2cb23da423ed5f6e279bbae826a395a30e7ecd0febb4956816685e31adff498b2cda42f83a6ec7dd5c74613a7b832ad15a546354d7c21e2bfa352fa7354b954b53e063fe344d0bdf80bd48c6524ac2fc0f21bd496a27f90b3bad6a65ff4af38a002d27c65c0e1511c71ea2ac25c65ed13a1724129094e390d893b90da677aa700b553269a1cb0a41a62e3a1dedeaab2ac13a4e1e8debdc145d32d47f85ccf31409b9205dd57f350d1add17d63b8b9daab44bc50383c3e4037830ab16718ed7f418129e6506fda0185f5b7e3a68bc205a1f7ac3367d7bbe253ef11d7f79659828543b389ba007e9c33f1928a65a5a8664a8674a8cabf204b180030c677f564bf612b9eb0015e22e3eca93f823e7dadc90b71d7fe9cb3ceaf12adaf02e92937f9bbb4e839893143248ea8c74f8311b5f40869c0982c7a8ce517cbcce7c1a391b4da17fe75e6510fb53c6cc7e4f10ef2500f74bb9492204e328a2ea2dcaea3bc6bd95affaf5074bd32e12e1f2afea15b4e1583841fb77630cdae7456d68a76f05a350109baf4c8fa28bea8b56b6fe58e4bba0c10ad1327222818493b3e9bfd84e14bd3d4d11547730121dd11a8f8952edc5bcbb5428f4c9419c0c877fe3e06133f5f109af80f6f6081825c5d69ac82b9dc5b7ad307f8ae9902f65d92bdc10a2564ae8cff466c84f51e6841f0b43b8ebc9db7e057871950e9ea32295743b360389ed23682d0208fca423c60be7198f859ce99b4247da37d671003e1a1c17082ac68007c050e383615b46ccddc9d531cea062d337bc6807dadc449fde27be03627613ccc456b7a72fce84f4bd9f76bcb7c36686c5c9aca2b03bbb295d673f6ef808f9f694d9721263c061a7db09d1e4df3e5ca209e199a9e1144b50e99b757776589e543c4548dc7c0b0f93888d251ce2b631e29cd2e9b69e875b30095a639532ac1cda7b71b014f044930fab6874d04d74876e77dc18ed18c1d06d6a889b27325cd5f3755933228c81e9e85bf396504e083ba0ad9a2c4c661ec47002bc58ed0ed67ad24f161f57b0d2f28b69f1eb79a07603508363b97e50a86574dc06f260b5537cd5361323ab2d0bdd980516e39e778a845a9c16c9987b09930b1b47806d3b1d78547f16cf966935445088f92b01e3aefd0103b22f88650390fa84bbae4cd87fff89a3c1198703b93b92734855440841c4a1ae3a3878a22e80d3dd00a5dd0117a47276854e8122fff453f3b54f2bc775f13de2fe6edfdb4569bfd80824fcc2fcc45bd1609ccaaaf3a8278def32fb6cb39d17edc03a518cdbfa70a3375f807fd5f49247a50baa3ad52cb2c3d2e71eecb33142f85713b4475d7b36af94f00db2297279123d653ba051e239fed79572833f2889858add68ba7a03feaa7331ba0401bd92e6b8afaac4561b669356a173f25781779496352334579027afd3da35264b23be630c564cc0d6dbf9aee0c8d61efeb96a970bbc5d827cdc8b6eb03f7d117354f1567c31384705f5c6da5bda081b518f4ca93ca116c1b6ab92f60575a2b5dd36e22f97d26b1fdaa35f5af1b21087dd100cba7f54688ff5714f4ecf1946a3f1c20e39c58848ab72ed3b1c057f209df42809b9a63cc55ad8300e5860c639b31ac84e68b418042f02da04076181be714e92f2243f6562a3c10a0cc7f024070fe51c930cfbc336b8acbe4da0f63b157d9265b9b04b6f170bec1591ef312469d1874f9b69783ca7526be60eccd17c4d0763c9ee003a3ed93e52bd2919b8986ef2bc3da06f5587bbf2753ca8ac967ad22d2eea788b9cdcafdac575d6a4936491ab25fc1cee4817c81c13116ec4c293dde6718c254fb9ec5de099366e377757b0a86b9dcf435723359a34f991baa9f129efdddf0cbafa189c94b9af8be8c0816682cc8042d8203853b6c58f3433cec70cee48999115f431f0186520947c05646f66e2637fa3ec67145b844dfcef2d24d8098c43a051200409ddbe85efa483685a1c891969a94c05850149e40f9e73e62f824b84247d2650e0b23171cd9eefd206b2638ab193e96e85caba7bd9022061584e1c65a4d3e5040c3f86e6679731be02ec5e09b3baaaa5548f69d41a1fc2dac6a796524a22022ba382e2bbcc9234cfb53941471d29b68a954e435e165c58b2adee2039a9ce49d1c930318afc997d7e5e6d212ec8382c9b2fd2cf37a5af86727d1d3ac3c34147223743ea0602a09ad21e6fad18a44151e3d3c641ea92acfc02b86f7504676a8257f2d6e04d28a4b3d3b04824338ca84223ab864f3dbdf1c82a47e8f901b6016b048976e5d5d61b205ce6a10af1fe8115c8e60386df94f6884916b16c062e09d446d64e436b172bb0f9691bba581fd5be0979223235893b3e52312cf9b69e223a3bb15fce4db18e041554357c85df6e3dac8a3eef3557c84cda62ce444596af390b637e319d3a2e6a395061b73f9fccdb342b4da38bc86d871a40c6ed524d9e6ab26fee8920c243ecf06644aae0b120a61e82a4ed269784ffef3da4dc1e99aee496e67960821d68de582a1d9309a500eb191f7551567453653b9401799c9fb9308a158481d072228b0e36533c77b4512b03fdb5feef21a70ca735eaf41a688219f0d9d90aa90207ac754a5c0106d52fd1eb738fdb02c48930443d77d5584ee8824e586cc9488c879c46225442d5ca714d15de1a6ea0efd41ec5c31949999861509ec2b65404578d5778601c98b00a797deb857ac3eb7c90e005ddddf9d7c7128548c6d0834f6638eb773c38bfa022f921c042b3777400e28d155251922817fa3237b2bf1d3032988b414fe0030ab18421cfbda609c67f8e5061d65ee57bc0d2affc8eb5e1d6f1bc80a228e946a75f65df83d40cfd0718d7895b258fe6fe4f2a65c7c5b8934929a8ccebbbf1345896966100ec651e4b58cf032750cb71e4d51e89ca9678fc88dd73dd3fecde17c0f8e8d19eef814e4f96644708058422e7c2f11f649000b374cd324f5119bfddf46489e498c9b0f5336b9f0b59f47765f10a4c417ecef674813b0d5f500c857500b0b1beaeac21317ff6c8502e61695f207ef55c9b7e96efcc9a18fba5c281306e8257c007aa9197d18ff6af4e18eb9b385112729e9ba7ae3bfe67956581d4d9d90ddaa60aa8406c7105fb6670c2adc92658cc87c467bb5f6994c0bb6995a82777c47578c19a29c13cfa480a92a2bc6797142c895618501a045ea793f72b1a373b66cec398ac919881c8a92c35910dccbcea9839e257b639434814e5af7f9a30b3bee8a034e0f23d1a52ff9233d313befa8a7b0d3370cad7b1a97b4c4359075a96376e4bd1e6b4c08e0af56f39f07fbc6e363424499ce5f4773f48b16c8661e6a0bb9695f03976988826c21d1cae391cafb1abad3c10b1bfe2afbe5ea81a461df08d1e3e8e24b997df095e49b4bfdddedb5887ae35c39387b5f29eb22210c5fdc45dbeb57e7d3ac005225790f7c164b9b8dd38c804c88a07fd34ed18f8c4844468cae9c4ea405f74a6b374d1467f75df0368ad0e5a261c7b13242e916f738a206bc0f838bb6c783061895f178c40bf0033bcada442cf94984ffa9432b403f68315312f3bc82e08f97390c4c7546d3725659e332d32013c5b6a421a79b0f7a9b62da8c150652e4a04c98d0df2fe1821348b9c98af1c4145abbd240cb98dddbfeac6685cf4c1cfaf024b64a6f8a98e63588b2ce0de069592524b246ca94e4c3dc7e2ec3325d0c7a876748f0f0a07a52a37df1a9a125b5b5c30395df1d223c0cecd8cec6b251884199198aa9025c6392d0f7de928ae473b96dfdd52252ae57ce1b5dadc37e15772618c18d6f60137e050de9d184a7092fb1a2b4dfe558f2c70458c948dacfdcea2865fb0e3f143fca9624995599b1ee736dcf6e271a90028ac3de8132b2e789f84f6f16c7d724055e5dd3ef0eff6b5652956656a6284e60be6457ee54a5047ca8a993eaf8b44da9caec7a8fd91b123417e7c193a6b6c8827188b30065d0548299c7765381219880c9193017577cb2232e28c2cb46772359f2cbc3ff8bf4fe5f06e75203a84157ec0a01b3ba29b405cec0d43c552d758fc5c414f3c5fff738cb691ab62d634e4a4df373ef72c71effb457af3b4937fe4578e6bdc3d1c40b1a18591fd1ec72c890920a25d54605cd1337d52080dbaecfb9bf66d172818046653c9f619af5502cfc1310f9e964b6ea1d797e3cfd38011242d5e3413933b2f5ca6eb787d6375f47ecd3822c45519c6d9541024910902411591960a35c878e31466fbf9940cb2711ca8a4801be07c58e76d913b79588a9f54624cd9357fb05a982fff592121318b3541a5d7b43de4b1f0c754305b9ad2227538b230e495749703be3ba5d3dec2e01663ef473fe792b39fe51e09a384d592de325cbd6196eb17672409874fd0cd81e869754cf07cf1ba527f0ed557153b74cc91445fd986840fa501821198fb9f87e9a9a9a1bde9d7159c940990ad69dff591d2b83046d3f9561b2c27550354c4f97ee002fa6f58e4e1e2f5f64916042aec1be6d84ad2997e138f3a6a2845d223c8237fa439841312815c8fadd9341d64af8c3bdf3b6043c8a3783b0fb5a875ef62993c61676a5729a4eae26ca306606d960de43994ed71aa67a61a8fef90f6651cecd7406a7480fb061e2b7a5f820cf49c4808b591bed4fe2788a2f421fc181d2f3b0eedb7e3ea98e29cfc591fce6de191842a114d31dd8869cf8f111d37f7d03ea27adfc46abcfa8243bd399aee2e8a8a88a63714933d9da5d7746bc8d0d12453401a2aceedce62a0e08e4de4c3e5063811fe43552982728de94218e5048e5ca0a9f91ddd6b25f140e731a957bcba77114a401d305b5b0f5787d7311071acda38edf3fc1420a57a183a1fa5d02b94cabd6ef2e10c4d4545e675f7117850a00dee6ecf10813350bdcf0c6054d6d36684e23ce2fa87f400bf6671dc83062d1db76cf64d9985d4be759dc589eaed94bff49aef4d694955ae570a501a55b093cf6e19b6c2b4ec850c05c5183445e5a1c54fcbbff4ddd39883af50417ea1df340c9fc7041e0627bafd8a45ad5a2140f78a36acbc0b111eeab16ac281ee60969db6c58cb0b50090209015a086d21736b5ce4d40b0aa2e634d8d181d1d812d120c6efdc767f5bdf74e1e6fead270b4dd70d20fff18d71f555963de9778fc18b2f37315723e737eb66ed676631722719888946d1ba457144639d357592b8524f5e58d644246f28747173c511a33ba60d49603639c11b3d62245382ce918c93bf7e10e58d813d812e1464e49e6504bf1c7f21324f4b212f983007478ffc1ad27c6420acfefdda931bf21b08aae735a957620e130b8b47d5cea2db96c40305e80e765db0426ec2b5e1810da1354dd61b461a5fbfa6fab164caf9047c84746b2d19b1f35d093b33312bee29fdf65ae5c6d6add64c9149bd316ccc538d450234d55b480a7e5c632ba93513211274fcd7315b377be4bdb4ac05bbed9a507d817e7d85c56d61c7e80e8cf8866352efdb3c2f1bc506fd88adc344a8ac410d67e994dfbbc95b22baf118f3426774c9950f8b350e1df9e144545108ca044f272339b4ed4f0d4128b207486e69197a332d37c827090541de65995c9f7c035c18b539054d0af015f3ab1e9e488d865d94ce3cb950a8eec2a509ef10ab5715b17dbb79963e811cc408dbf92674b1e3d10dbe56e4d97d178ca9749d5513b993a044e41488173ad5febaf2b6c1c205709b0827e9dc267e3f3bdafdde5b2e90314ee44182cb544b4bd74f186daae015e06924d4904a0a4925ef79c4c7a9f50f35847f0a9990418df7154e81d50b6320d0bfa47d2edcd504622e7df5e200eeec413ffc650b7e03c72b7b37d5404af2750a6c35453400152b05c772c420a0cf6ae94daf00903bab261cacde76780183bf1ac22cda52f74615a30bed061dc8f67bad9c60fe53ab13279d8800b6810a8ba61995d7cf5ba5e60053d302ce54a03d84e09b686618fe9062b2746d209a3d18fe2d4bea34757b9427d00c3ebc29070f5a93a652e6a5eb33ca67fca2faea1cc912a0be6b0977a3371a1bd597199c6cd03d02ea31293277fdbe7387dbc315f2c96e1521647c8558bb491cec0bc2942cf53bd9d38855e28a520828a46bc41bc6a580268d92ce02b5090c25106cd5395756b14318d01b8e36ac07d47d9313e12e6d1cdcdb2aa51ff4eb46a0f1ade77e29698c67c10e0d2415ceef89d162aa2c8204f262be2d0d665d404fb9ac307e85756581fbfc4d46ee76ab7c4b2728976adf064875c7dfc39d5f1374b01b8347d558872f5d57d9c83844b9fd7c022132f733e5cca8114796f4f961bc844c7d0ee1d1a6bc492ba0fc8539ba919c746dd4ed0edb9c57e2260d5cf8e6e2568cb705ef5fe2e9b307fe81260e0a04813f591826ce128a7184cf398422ec0096b33dc50282cd0c72d832b8f5255aa156c798809b56e920ef81a82d692af7ea1d00c4c9d54cbd5e35c866d026c0ee87cba2926e2ca2e14b352e2e535d9d7603d93a4cd8265965e19ced2c99949076ae02f29982ee35c6128138658811ea28a079b017e485362f6228a107a39b89234eac74a590a9d988a20c5a1634fa4da99cc28bcf030de99f8a43057d35d703eacaaa26b93f9fc1d44a4d329b115d9367e9ea76397e1a3b8f6a68f390aff449d0b81c08d60e6c210c46c7d7fddc29655ade11e92f1524c10d967cdc0efc412c989131de9dd6a1ca79e4309a19934887ab75fd4989b690e7baf7144fbe2ec19478558e7bd895660a8c0bc58139d11d5181e7c312a96ac3aed3dc77f604101ebab94986de21e0d1a7e7174380256329c09ac615f73bf29da0c2a26c13114c16be7553d1d63dcdb119f4f6c2e15b4b0004b34adc05bc5bbc844cbd217f27be509ea1aa8f0450abda24865f617bf7e0103e10a70c018e64dd4814c5c8c8a941c2d2eab2fb210b3bddb451a56f1d116a779029291337c8e2e5598389e75151026164d95d98512f124f5253499b58374932b354ec00e70be3bb0f1bd2978273628e257cf795fd055003a3429f5f510a81941378000cea7611db50380eb641061f39f5e37214e8afa0615faac79dc785eb99ae02a5af0f2d68586b7ee62716d778a46d671949651c8653adce5fe9575118d005831b57ce3af1fb1f55027cfaf9c9ccbb3b50838625857cfe16608f72d07992f819b629511f6f54d8276bac6878d797015d406faa910623c844ab2756da89485396d5d4ff682f11e9ea579175c3f01e7c931c1c85dc5a9c3c8b396bfca866d142019d72096f5a561a1d3aab1b8a0df4b4db6e1c1029e74d75f0f7a5e4c9ab7b9336d9c173bd202538baba0af4f5ad6e057f556c6f0856a57c57b7bbd00e297f677addbea583d5ca336b91fb8f6af661af6eb3b4e6481dd251a3ce43bc4e670e07a1d4113d8e31c0943d68cae39ce512a7af5d3188450d8ed2675ff8d71b2227679f679783364f382072603dfd6ea458ff898b2c17676758234c5d0bd4faa1d44ab330eb5dc071ae3b336beefd4605f0158db8f8d9a79acb786403d79985966ab9e6e5aff941931e48f64d35c2f034b007a7336341884d06b0e79788f7957feb09d42185331689db9572864b5fcff6aa2596408d98d6c87f314fa9f922c87aff8dd0fe1982a14654eb855e884f2fdecb2c62b865aa1e4beeebe5c13fc26488b62705c67df959dbeb3459fab50095148812e47050b885a80af1a01385d6778ae470de6e214a1b5da043f23f8a9f465c3fc929fe0f594b502a97eea3734be254756dc9024b43f99706446ce228100edf0fe7882ae66e745c12a1172d022eadd454d09cc13d376b08018c61d74be0d22df1fa3beb664ddcbe615b424aad8316c79eff16ec4f66807b5f77a68d213b21a5f39020db2557f458e9a0927b12107e63c8338c9475807dd6fa8ecd2120e3174028c5aaa56bc3bcb61e8c02a958005ff78c43411b2772d6a7943d0043a35c2904fef97a4b21c4dd9a52bae6591a133092bccba96f4179af86436e778e7d2b3bfbf21616aeec7d12d08477b087f41b0e0b41729dfec923a710edfdd3c67513c0bbfb303383cb80e4cc4be4359e4290a2afd7d137e9ad20908325b3656de08f710a41faa9c33d724887455d04c563b25428b291ae2a16904627cc4fd0c7a825b021a28952128e51da1a83541fcd56028b32525188c5be96b6bec324c4eb7416fb31271083d2d9dec579a3d23fe74545ea9bccf0191e83de23300a0e1f98037d3f8ee1e6b7ec5a4ab77f8f5f2e01995bfe5232b02bd32bca898c5c396de334a8e7a95f479d9f34d30f87f00166c179031bddcd3b59f8341537ec921453a283730aba15b8f31654794529b77c37d766d099379783a20e6c83bc43c837901debd0cbbfaf4c9685806bb412faf1c7427ac802b07948bb24c5a5da854f082364dd4bf8b9569944b97e1850123deb805a85b89ba8a4892be99cc9ba0e0c50a386e08a62b1342121979c214de46682190400c19356144daf6736eed08176e731903d6d3589420f4d6f28e050a7f16d9cb892bdd547683244f6f329119dda9e795740ceef015ac645d1d78929088d185c2c55e0faac630102aa9619ba22efc49548e5109013f6bc07e8b5f092d7592af7ad832b3e0a8e396118f7b1cda97efe91b4d85a4ab04939831721037dd06bebcc1f395139e7c45ea2c90c70bb89107df27514f5deb58182cd6d913469152cb1c37a84d83f7fc080dc8e371e7b58ae9a9daa90944797cf974aae014adc0ecd45ba999e0bf88634885c5b5a2f11cb0fbd21a92d4d11a0111f8abc25c2a092a0664fd0ac6e580af47db1ee292c19df22038b8304c1210f180f0e5f595bf93a365dd56fce94325b851ca362f02023178df7894baa98cdd83b7e5e5d5e87c97133a36b6d2191e07f5e6e95b526e6ee4cd03893469f12239593459668aaeeaa01ea769d65a49b5de635ecd8e27d7253c1c03de67dc97395325e0413905441861cc877559e3e29451aa5244acfc1e7fc7a56b9dbc52da2ce01e092868c82af23634a198a44350dbeb779e93da73bea2d43b19f0e6b5ab387570ce6103cf0f3315b1bc057266985ec46aaca27db6b604507e472666fd650842c45721b0a0f47765015e1822bac9c58c3537450890e832cf258d69fcd2676ab0c6388ccd3dd068db40d25ccfe7aec452a3c64b2dc58c804b66ac7ad33cb6b84753682d83bcb4f2ba7ae331e60d5a929dba0aa5ed0bbe76d1ab38b4690fa071e01188ff637c7d7b23b06686903403ef7a3a9406cf16934fd8af9b812e20c9bc157e109191e0c14a4e219665d8dc878714637cca34b12c6a617a0e8ac11ddca464575f5d051fb067fc215d3d601d41a70f11cd2ee811665801afa184738e640ec867e25c01ee4f742d98ff793d3f38fc156dbe66e2b4d4293dbb6dcf765f10398231306121cc65f709aca9b1e0739051a45839d3c602d035f1c8194cf66ef6850d9349647f99c448c6bbb99d649616743c2f56d35d3ee5c7586411f8118e21a476764bb3904e76b9227ddba18d786d407c6b85142053e6a779f7b5488ef98963eae18a801489d0fe96bda544cae9b93686550d78042a20635de78ccb06cbe5117d7dad4021fcaaab42ba476b6974ca19def483aabdc5954b876d69f2d2d07fc4a337c0618d9d23cb7ab76f8e73002046dd23635f088364aa285d644f2cd0a25b5d18096abc3ff1dc60c228d8403886e7e6bc7ef95306fb73e271a29ec8e667be2e37af734bc3fbcf1465af735d8e5e9e67f20fabf20b3d95794b98233fab093460b0803f2546af8f51d116c0d6384e37ef775d995389745ca43dbfc7bdd2ae47a85879b669b8fbe89fc15d1d13a6074b8795fb51237a528977d792f7eea8200f99d787d80cca99cd42cfe84dfd5dd65f099870e19870d1a7bf9db84782aafd641c64bec364714028364e3b9a9e5a287347decad1a505c2b245a6bc36301adfd86abb3911267871b7417030cda91743eac2f145c25efa65bd863fb13e8f33dd419bfc22e30eb78ab4670ef37ea731bcaa52d3010d06ba3e5f10a6e54f96e687db1f9b52f18d04b03195b3223d6000d146dfd9f5064da90e6227dd1c41021edaf355a067f192ca1bc1e6556f9e9bf99f1b24c5785fe8a59b6979e84e73acd8d4965d83ac349ba435f833dcf2b9ecf15d8cd7698f75658e8b3d375d5f1f2ea089f21d38be56ba13249a9708e789a6366e519040474d7317544711e7c9204c09de4cc2663ecff38ab2aa9dc5681633fc9168c6fe8358111be26479f2b711945aa6d2055c3afa7a4fbc2404b68d53e6b5b545b8f66912a196804d533aa587b77a8b3cb48c3887621b13170040693c735f9003990ee098416ae13f70798a05067ba5082b7faad34980b5a293897f798604267794ad9bdf8929534a8fcc4c49645eeef0be3da79692c14d71d1d3be5f4c313f499ea5a0544cbead4b5d67e4dca09c78300f0ea01aa06a618004914ff7584d68bf0d28f04a8ff4ffb09dff218699204afbb5cd2a3c981e94ae6891f3ca4ff12e10afce18c0792577fde820b6719f4432875f0ee518aaa4f03af6cd04a2cebd0c19845b2c5aad975242c6219d0b262211d65db5d2ba0f8e58cd9833ef9410301507cbc3d385a195005c26900a61de55885d528355ecbcebacf454dda19af73711b8183acffb858da5b81ce5c003db4f6dbec1e5217368460e8832f8c9693ba748b18022d2a85c14acb6bd56b3fe21bea9229e9fd722678e2f668cf1a0616647365eb9d21b823f4080b6e8a9c122f8fdbc7816f9ca1121e0071aa2d577e9748bb09fbc9507e448f6168dd40eadffc2e0c3a5a117ea9bf9884b851f2f6e7a083181d947fed99149b9847fd9f43cd577846e219a72aa787b0a62d6816c1b2f3c9bdfab2f06f61572295f47e524e0456f0a22927baec422bb58e19a2ea1d2647fb382c694683978b802319721d153b917d403b0ff1b6ecd5ca8e74233c67c93396c58a2932ec484cf9c3241deb608004c52c793eff69381fc6e2d7de298b3add988c9987f30bdfdbc584ebc43d91bb36fd50d1442175dc590c09aac8708b6fcd91bde644b3c2254cc91ebc7ff8ae6894f262876bfaa2196f679eb4b74d0e315d56b42322b4d6450713a949f41c98ebb6f6a2a81e915dbfe163dae3287ccdb01f88b22fa6ec97492d57e781ad1a71d0c42b04657016ad8f38eb4c52f5735d03ae7460b08760f0b0c8514f71a327377c8277f998bb2ed050efd8418684777a22781ceee6858a603b5ecbc70dee26bde5748d0f38d3eb08e19347b993f526177492c81c6452e7abc00dcd27c6defeeab40e754e1daaba9f7a1706881fdcb2d66d4d1dce475168c88faad04d7416ad785e5e272233cb4e274119866a9bbde5acbf6d1964c3e5844cd11a742124df34f8ae61a451a0f7afd33ad675ea48d439a61eabb17f2faa5165df78075044dfcb51dcbb48d56937ee5bd2f9709f24900360e13421f0ca9acbcddfeb105ce887e0923d8b7136bd978d1723feb010ba2482dad1f246dc041e0b26438d38dad18df983dc5e2ae1f0eb207a6598b98b09e77925ee080773e5b88c717a59b1913bcbefa2d5e9f7f785b7b632afbe702e5c436930e0fe67b1b87db613f4e10494ddbf82779a0450e6c5d969eeb075fa4ebf969f7e6bdde9e596f00775264b50c63294a10c550689251ce15914e5afc05af9d9f3c7321e097c5ccf8f7363466992a1cfdf3278b15e5787e073773cd409e3259f183244307cd11b2ad62dd156a26b6af660f5473faa9ff6a17d8a046b348166d0ba205348a0a898a34f3c6f74acdc3af072b935194c946a5bc25e08305fca9ae64f48efa21a968264168ae7fb7d16e1479eb272000b90cacbe26a5d67f86129bfd4c7b8d5e6ddebda335f63144606f9ee8b1a26f2b509db1287432427230ba161160ecc8ee60d04ad6de8a54f23f053e1a5290e806c273cb03552c2c2bf1654bc05d257b43affabdeef9764c82d047b1cc632279820f5f105024621e9885964fb51f73a461df88d1b903324de192b381567f83a01b1c2e2744f71e14383c0a3591cb922df3c28271a3cc48312aee4eb33f31135dac8cd0b501c2754a3033ac18a8d592092b29a0e31e0fff5a99eded55fd338ae13f8eb5b645f1b718807c5eb085f36b1f65f0dd76f49ef41a25444f396f500ee160b804010e8d8115938bfe8bc5383239717e76145671f8c41b81dd3500b697befbda59452a62465960862085d09dc56746da5d391a015e5f6721b9d95db8a26a5f35624aea5d33a12289437e43ecab1dbcb6d954e6e2bbab6d2691d09ecfe448cfed1c6d87943fcbd799ad437eddaba694438bdb6723389134ad36850e9a4b352edaea2191a97920105ecdf4779123841f6bf4684e2f492c08f53b25269ff3ee70db9eeb69b49a452536652dfb46beba611e1f4dabaa552776652df345befa61151adaddb4dc2a9adda4c62e667a66a52dfb46beba611e1f4daaacd2454ee9ba6eac2f5cff659ada66db60897123c89dc50a23422beb6dfc0234c30091dd902f330ed701cd7514dc359ebe47793686884969cfb9543777a9e7772213a3a3ad7eb3c8bea9d1ffd924242418208803fb439baec1f9140ad7f5a835e0a5d7be408b78c4902a1ba477910e8ec8f2f8763e9879646118e481f1ffe86c052bad57f3f69d4ad9ed247a408324af4d12f3322f6e86cbd1168765042893dfabd23a0e4bef65ea949a499335cdbba7669e04f94fbfd48304c7bd71e09866defee1ac8a2dbe6eeeeee5a0e77f7eddd5de5abf7d4fbe9dd71bc738e72f7767722bd9e44fca7f7a9afcba1fdc67ddaa7beed579fdc1ebfb60d49a13e8b82fd7d38a0bba5b4dddddddddddddbdddddddd2dbd9ec27c14c8dcadf96fee7f4122b1873f37467ad47684dd789a3f7d1116b3cadbf941fd69e6e31ec727a3fa24ac3fd68e373fd68eb633133d0c9c3e7aedeeeeeeeeeefec51b4ff9d4464971711c8a514491a5bc49e2fe80bbe24a998511596eb2a97fa494c9989154ca92090b2d32f793fbcd1bc27943b6a9612143d6fe7a43b43babd86006b71b8354834cf101b8dcf0c8fe2388155db22071850bb2cfae48cafe383a4830581194fd25ab68620b1eca3e9cd4d8c0f867f75eef878d3c7ffef5625ee439dfb631aba2897a3b1fc88e8a28f2fc4905530c58b5922a9b1b1e4872f8c327961c462d394731d3a76432e5932e221539863c7ffec5ab6fcd5c90e7eb0821b273a5499e5f42912b79be09476c90e7af2085975817a02b42424bf27c394474258da2232b8c8af29c4d61469e5a9a30ae92fb1b633cb7f4e0cd392fc6af8803600506577642ddeffd2ce878a73a6cbe8543a5b7a3f32a4b26c70acfd4e0b0768cd6d2b6e764b7c3fbee59f8f3fef47518778fdfc3ddb33e0993f958b079d6cf7c2c446141c7a3b61dd65a6a69c78ee3c021f72988029f6c53d84016ea37d0cf7aaefb58da83f03e30ef636920eb02f8bbe7c1df134503794e0f02d863f3a7dff13e308ed3386eab31aac2d474e44665b491c31f559874c861945571024b0e23166ed38ee6a3b0748ebca269da434066ed02f8bde7c1ef813d51b6df01f6e80059dafba31eff06f29cbe037b6c4096e68f7a9e7ed6f7b3fef433cffa64be46f538bed4afbe1b343ff33faa97c1b8a6fec6fffcd0fccfcce33fe1c032332a9a1b37be08c3a9d6cfe9bbc7a893d7c1fab64cd2fc1f243830ef8130ac4550c12a4b50881f2417261f0986f987ae6ad77cecaf1f201c983f120cf37ece9ffd4e644793ab2244229028b4d3547374446487e6a70ac70c63d3fc1d22dd3a72725a226251cf5ad57c8e9aefbe1c39defb9a1c389ef5d1636939fec301bd020c20cfe738798feeb54f64a70326a87094149722536cba16a5a4e4af1f3f947e28fdf8b1fd6b393e124a88403c8a58e44924f698dbd3ed2938e4a6c0d272bcbdf138fe87e659a830628ff9f64335a1c4f0504a2833f2fc88528a3d68cdafbe841c6ff3f4eb2cbd1d1d9fe363a1bffb9a8f859acff15447c747c45df36d82fca8f9a2689fe363c1dfbb79f5389e67f538564f411e1ccf027bfa71e0f856cffa707ccde77d8eafd3409ecc9d683efc331ff7aa4fa6cbaaa59d134a89a92906448449a95b734e21db3252d493d79b76d57f7f9d401d6f390e77fa20f5753ae704467759a93bf5e4fd06dcbdd347d8fd70adb5d6d3d77a025994c5aab5d65a6b8dcd10ebeb8eafded7d5d71b5f69be9e6a8e8aa3aaaa160df5c9587d8db389b0f63070fa6adefb582f3d16f53f7d0cfd5e8e5fd5b06c742210ed6bfd5abfd65a6bb55aaddaebd45aeb4bae56fb9c7d0e1cb24deaed0d4961a7469505db1cff73e3572f87504712a8ca58047273add569d0c0ce1381d0afaf81f82a4174d5af3dc041aef5043430eb02356ff325b05ec74b6f67c7e3a21d9f0e1b2a066328ddaa4f41fca45bb556d64e4d4df4e8c963a1dffb9a8f8528f659f03f9d9ec7fff416fcf0af3ed4e3f864fec6977ad5d73dcd37f39bcce3d73ed6cee9311061a7df4084adbe08bbddcffccf8fcc67ab57ff54f1671461b5d68a8d720ca185199fda324744db06b22a96a90f31fe2933f3da733f5f16c929fe42fd2432ea74c0d2aadecad87ceba9c73fb37da9d73ebc6df8b74f6df86752292c2319c0a3bf9b76cd7f7f39a833bf9d12b6adb5ed7d60da2685e4908c49209d08a4022941ec317f3e10f9328174cd9f32398c4b32db96431d4e76a91e7057f0849962551d05c4977441675a50c6284f907ef5cf0fa315b7398599c388b4937afcd363557067dbe4908c1d4520afdc7f8970d18e0cf8f3e33df75c773cf302dba79e67fb14d813856e4f31873abdd73df7d1c34084fd6caf512077cddfb84e1a4d91321943f27c66a366e034e003a3afca92e357a7a408e4f5455704a301b294b0edbe7ee46ac99b0b214922c9341724f9282d1229c618a7f86b4e3c021b38c66fe54931296755c6643905cb8d95a01c0639f28e533ae789ce9936c8ddd1dbe95e48fbcaed57ed6f0622ea09ae5af993ca295132d414d4942c93341fef2e86eb03bb3f3feefcd479234f992735ca3747cf280be99d22beb217ecb9160c8106b8be0585d8a6ebb8cb5ffb847c3d5178ea5bb0c7871654da8055b0e52e7f7f1a0697b0a3433f6ce553161cce13b69dce913b9dc3224176676fb06711f75a241998702e15489c8c220ac50c4d06d30ca289fca1530691bbe27d428720328edc152f95a66d8bff80b71c6736c486849a6ee4385312832b638c3fbda3de63541ba38e4dbf8488a05dfd57856d5652043ec8e8ac74ce590be3196737868a120e8dd04616267bf714822907a8596a2ea8907d4686c32eb77f33c7d2e9b35bd64e195a4add4970d5961dcc6959fd4110abbaeb564f240ed033677a7bcd9daa73fa43f7cefeb8a50fd9a93015d9f1f4963ee4ff0643bd5dcb0478d9c113baecd37e051dd32d9ff45e2bdf3b2a439f6e7977e7d3d8ada965ce5d7af4767b9a609419c3c0671759ad40950a34cf4ec7adb5f54178211d5fdb6b6058ffaa2c88bbb581d57de6facd6e65af95a63033180699a04f7e0a44f4973fc12b25d55cd896c0e1f49ed9b1a2bbfb649fec5e486bdf3e756bc1209186383f8e3f8f1a5345e070660f326fe794fa14eec3f8f4b948e7830d26e0fe002f8165f7f4de6212a1e141274b19ae5654a630f3093a59ce2f73ced9d57afaee546bd7ddaebb9752c9f2de48f7feddfb7bdfdbf6f73ef77575dbbe13baac7dfdc229c4ad34ead6fc227b4918cd1aaa9595b65a7bdf6a1a1806b1945efaaad58db4b652ef4236cd974cf3a5987973af04c355103894319510388c5d7cc01c57c10f041db0c4b982d1b6bac3aa9b6f7e1f750e9646eadb4842fd538588e44f9064e2a4736a0fd55bfb3b70420f92cc454460c21115c0c672d4ade9b15a4bb7e64ba358965f5762f0d21118a60ec4973c72d7944ccfc5949c801c675cc0903919a45df3b5acc26be5de8bf16ad5c2619a63da359fc92a08fb8f875fed3fe592c33e3af2570bb56b4aa676cd47c2396ac9be8b5638b875af0c1f39c8347f1b839fe4f95c942c9116304eb0207549a25fccf289146945fbac94750e05af7ce256f00a71229c86cd328360039e6f739c6d3126c725987efc9bae73e8af7228edd93d26b6e2085bb4115b31876efd6f68d3c0d58f37a1cbba446f080d1b58e64e9ae1b05beaa456ead6120ff832c947dd925878c0da735ae0b6d2044b314c5a4b73e968c660f98aaef8da1c7cf905e6933cbf8b662b758bfb429b375013c324cbb7db0cf3c09d1367a6a01cfae4500569c66099dba91ce3b293b2fccef13cc7748e3718a5ce11e3ed323b869b344dd8feed1ced6bd7c7aaae4fdddca929a5947ea55f51f3f485329f1ef5c5d3e7bd4f768ffbc9759cf6515a2badd7fa0ffc83d6203fe6a4334e6f269cff6c8125c719173139f4e10df168d8c0b13555373694d28cc111a7d2a871ddbd65a5f324eb50444af28c6446b249063735dd26dc249beec5d84129b301fdb9ae7b0095c98e64324a69cc1f6394c980443221b2bbbdef5abdee1ef2ba3b7753f9343360d9b128de26e5774bca93ec38aea35f97ba4565d352a62f9b8086b8da3f4c3a2776500be55aa5103926fc7c7a8fab6078023b06caa66ed19843d9c4819e9782cc2f9bfa2561f43bd6395126f94bd55f74d1775124fa15fcd883fed605ee7a623f40f5e59074e2757fbfee455f722b027f91ebaedf5f334fef87f865becb33bfd8926e5ff0fdc18fe461188ce2795fbf9f3b7943daf3bcf6da7b8fe36aed34289c56eb7b5feffdae7b8e6beefae4ab7dc76d9ee7717fc22a7baf79433c8ed3f276fff4b6d6e7b83f79f57d729ddab7f69cf6427cd34069a4b2e9167d82fb6d6d22ae73a051b93a63a573822d24949b49f3e8eef7aeaa0631f6b7ffb1fce7576fefb22af74f9b150f1e4126d03a2e87ba78d32d592bf8607cacfaf3bb3e954f6469254b5928ade4ea848b37343fc0da6fde12ac5ad9cc493bea0db98ffff4797af8e77bf8bd3f7da14feed41bb9a9e7de27d78a535f44e1cf275394f7d53b7de7442f86b2be7d6e5ebf17bc55e6374de6bb9d80a7b5de1ba4ce695f665b55ab9b396ba532fb43b412a4821084bb975f73b5a9b97e77afb5d65afbfe2779faa2bc2fefbda95e03984825c71917a2cc4528c799164f72d8000e05812894e30fe5f8ad2502692d5d151cae261081c81daf82fd069c3f343be692074a298d5cf522fe13c5dfed3f9dbc3f61954f2fa44f20abfbdbf350f7bae76d9d4fee2aea51ef7da1fcc9a82d766b935df5429facf5e9747a08c47c3ad947fd552177bf7dde873a711fbdce2777df095de6408d08e9a33ec99528d76ed9c6f50a8e3e8d1a9d032399910c95db27fb27b3ed6e69feeae91cacf67602b4a75eec56c4376afe3e40b9fe09abec43dc863e41924bdadcdd883fce1cf771868314d9276b5fa802e79c17e9630a71fa49a3e6127be026a4298248ca710a20b4e4104f0184159a1fe0ae5bf16966c091557572224eb7242cbaab95e3fdee536a6d901fddf2f0477e996d280585742bbeccc3080905f9d774cb80bb6590ec30eef65f4929696b15039e1050ad50905987873636b1876f3360bc3ae2e20dfd39e79cd3dd3dca562b9f784e5be79c3e2794ffd12d2a4abcd0238f024950e5fa73ffed549d96e3ec0649aa0ce2141d9da41d9c1c4185e905313c2a5696d820e689142a62a8a2c5802584f9853ba1cd90a429a00c1e82c869395b633684506c0621b69831a071c307da4a6605e4d811694bd29630b95fc81633726f5923770c95e36c8b0df214395c216d32c0f3ca2d4db856b97901145894701a7035422e11448b417434d4658bd00d5b9224d9e242165cd71012d34be0bbd448d87ee14558260b79650a1fa86cc15b8e332d4ccc60c4137c739c6911c297b0cd71a68548cb100fba2a3cd0a071e1aa2809ba69146d5560a8c112694d2fa8190da5fba509cd3e28b2516899410d24254d445118b1a4e9280a1d6e4843298a201a9a9adc156f164c9ffa81bcc19226404b928851d2d44ae02ec799922559059ec971a6640b07434915320bacca71a68409a15ab57e2c331c7aa030703d208a331ca79a69194f356e547777f7c9eb9adb5abbb65bba8344dc1591c0ae74ba8eb74bd9dddd957ef7ae56ddada239b58ff700d2e054a0194fbae3aeee1fdd8a3de21b99fe2c989f7256047772cb5df169f247bfcccd29dba7fbd670ddbd489e3152804a778c51eeee3fa7d35494f7a4446b91ecd5bc21f735dfdc5e6eab74725bd1b5954eeb486cdcb66979c2715c47afad742261af4bb7f75acff386dcf7fce4f6725ba5333660f9fe37e6cc77f78eabf958cfcd2f94994b6e252eb9959e34141ed6eff8e85d80f53b408ce4aedec1472c58cd5330383aee1a0118317658e2c5121148ba5fc727c4e6234225c7e7535c2689349b0aead60b58e6fe8908a5148100c93d1481e0d794a89e4e2889266bd57dfdd5c7aaf111ba9f49bdf7c97c37f3712e6b9669a38d36b28c0c28853e09249b8881437c24899ac8275c3a27c7dfbdefc7484e9a442010889cccfe1ec6c2f22eef7d32267fc2ce8e8f3a070556a1021adc608a22cec0420a176fc40e48a0c430f4c20b5090b9fe6f2f8dfc53a166ceddbd53a1e6eeeffcc28ec918972624a6232559928c8bec8f5a7eef6ae591822ad0cc3d0762a46e612cddb22fb305f15112fe23aa24440f5c68a103106cc480c9077230424c521959d8f0037dc52c42526458c4e4fea3dcf289a02ca7cc600c9d7e846585ce61ed482269e42f16b070a1c5c8852f4b66c09a044c3451eac1884a1a6360fd92a85f16f5911350967fe32b22a384e633c15dfdaaef88bbfaef0ce32499aed1a2ca95a55c656829cb2a57c064f93c9d233914ce0f9c12381cf784702962c24e09a931b0bffcfb4f6660566445f0dd2591524b388c485149cadf915f82fc6b2532cd2eb813b0fc9bb0933e1074b072e0a09949a13c4e7b0ab2787aecd39bf78105e07d60adf781b9de0706fe0e9b9ad50d950c3e755febfbc042781f1800de072680f8ae0f73815bdf0be05be10007e003c0d7ea826f3e219f8e120e75c00ffc9ac66e0c62f2ff23e22ef9207c3806bce32bc15df2757c45bce0307231c15df259df11ad081c46a59a1c35396c929ac47e2be0f864cc6a81c3d87483e6064db44a7a28b13c2471aa19d54c2a87ce288794cc2781529f14fa02e34f0ea13e49940a83433974f24e9eccdd7786c403528b99dd27dddd45ee320a0387b2284f71977ced93b22e389453f291bb90c4a02fc74811fae598e8724ccb5a26bd481ff2e51839a65f3984dab3fc2eea9c381b6a6aa3ae9934513f692859ca9fde2d13d35ea418d9d4561c029e5d7a91227843e6876005c6b9fba75b32d62df963c62835007c660b2089949528168bcd506369e47e192a148bc56ab82e20c9fd291acb626fc8fd7812c5623126764bf743ee474da1582c36f4e53291fb4f338ced8adcef31f519dc97dcdf25c562b11c7ea0b91026f7739ec4fee4fe8d29168bbd8086b943eed79262b1180d53890d22f7df1c3c879494dc6f5b168bc56c2062b322f757a3582ca68314192fb99fd630bb2fd090c54b92fb5da80bed86dcdf3dc462605040e45e4d67f2ea60fd2a18ace4fe3875ecc0c52a937766b3c46e4bdf2f710b437267b84d32698856894ce5b0111165a4c83bf3b244ad8b8ea81c7e98e3bf14215230bc31c67facc526f688f2afcdf6d176ad937695b405d9fda65f0f68574f1e39d18a033a506587a70407cc18bfd894c0aa04f40040d3c4978ebbfa9d3582ccb43d4aa97339faf997e0ab15c67ebf3cab4dbf74dad5df11482b81439d213e527018b988a08d223e1148ecbaf564527ffa91f6cc255a01b0203aa3082c64e850440849e80006144fc04051c2891f4e4e1cf1f2050d6aa71c676300592e20dc1d463d80e2878a0e7ab0d48415ab26be681954435021a58b51184bf800021e9811450717b25061a589254e513461652e19c0892fc2ec00040d5a5c11c412a429bc3062430a2c804e4ee0e0cd3057dec8d51849722320c7d99296252c3a98ff4d2743c0ba9b495a7a2262993b664fa0738680cddf9982c54341b69161fe4558ad957e484b4295ba4b11b606324129d22745980813d53c8d3a87be3090101b1d0022ea9c3076c14f3a678a1126499b4074cd97ef58667cefad3a92c21cc55b79740be7fa8bc274c4c248a1b686280cd1a45d80c20cd94a29a5ac9dfe067b24cc07e632601d77cd6f4ce4aef93992c41043840329a5f4578338ee9a53a85b524a217f455f252159973dc9914ca29452b69c1fb3a4418eb33064799a20869325ade5534a69900c107e0026ead6fc1b62fc60224a29c5449d23411edd9aafca121990e77338a85b748787c6071c62a0880503758ecc4268624b7169879455b66aad2ad904029a8541b42357aa12ea9cb035d439a14e50e74c2e661840532987d8499e524aa9e32f2c34a403e42e2ee22b2e31edc08399184b106981cd5f21be3e276860a2862a6e40220b6cb6fc8581dc35315004ead6a45f00e5f947e6af30bfc87c13a69321600ec60f725004ebff9f6f8443e5afc0010f4db0306a52031734f11c7097e3acc90f5d609a1c674d689001873165e00006130e5b92582a5600b9190ab85e8e33a5286550cd75e8eab6b44eeb9ce08aceeab62fddb42d65c34a4ab75ddda3a494d289ddabbbbbbb76a3c63581a4f9681c9ce8eaef6d898f93874add7cf2646cf6c0f7331ef85e4573c3bdce93c009527876dcaa8b32c7473c800a88ea553450f99043eb3c12b419504aa99d77be9d749290ba36e7f83cf0554ab5d40952b405544a69ad945a9e68b4895bc5578caf5519f19179f39cf1089e965659e4a7e77804cfd933716eb6b8d1dc6d92145c93e34c69490e71945e88616cc615acf222b1c027a41c7620731db02ac7d90ea074163bc8216807405f30ce71064653ad5aef7067bc682284655024e3451221541145a92f6730391911c35f7420e41519a1be50914337c4d0e90b1433705088bc2f4430d860454add971876d090b8a43270b830238cb626164a939654438d4274ad584289e0629b60328928aa51825c46936020d430284733094913394493bbe2ed810d4570c15f8e331ebc60e100658453a91397084401d91f472076e5fa7264dcf98043140a65248ff0aa757348e5dcc0065e0bdd58315201c028fa428dac52d9804acaa76ac7173000d346ee951a60bc640f83c34e15de7811860b1d4891fdf14a075b64ff07b3446b55461a62289181c30dc428e2882f4640d9819229603ebfc8028b078517ad55b155e460a98772f0c57390050d97485673e0440e5688ba0bf08d1c6739783225074adccb1a4de6bc319838ed92ef65a906ffa1d3c394247097e3cc4b1219f8e638f3c2a58a198880ee9d915b62a643d92afb6b55e1aecb9dcae6739c3969f22ab8ad5bebbe31da18bb76bffc5e7bdd45638c31c6d8dd2d2377ba52384ef64402cf974f811bcbd3de596db7e0f3f3fa71051a9df5230d5b90fdb3fffc6c8e99b360a520922b0129623df0c00a1ebef01a6ac04653161fc03862ee400b1fa0fca65b94c6071c622f42cc6e4c12eb33c41429bc2c01a28b180fd2c8c105a2a0202492c802eb098616655ce97fb1171770504576ef2e9dc39b2e8c00d0c5962e47e00028772afa455760c0d2840887a6ed8a0cb2dc6f99b27d2e4a2277d99fd1c2252645a627ac348cbb466c30a13236ae6c3136ce6043cacc932223590482982e4061b688c25449e0d00ed927554bb764ae606ad72a7bc8666d1855d96090948ec048a456f2173d9a1c11118f1dca2ee42e7f1f60555a929eb36ebe2100642f141d2921dd7a7465cf599b90c061451acaf6ed90bfac91bbec5b3b8528ab96c06155ca76a932758e98ce710974beb2bdd3a8531609347bc5f2d523ad48b345fdba49d6c83e618fac1627b68b95592c16c972b149d9be76bd3659891d0109754e58c1645b9b82ecc7af56b42f02414c478d54b980a9b5a873641bd529b2cea9a06432edd34ffab742b7245889ba655bb6c85df695c06125b25f9bea98d84f2887beb6b56b953448576420aab2a3181556e891310924992c815923ecc848315fa46e59cd0e699f75d2ad01c4aebcb0c4c2e9bdbfdc777f026dcc5df63df0baeb7ef478b8efaad2579bdcb5dd6dd32891934dbb15c90ed5a6aa74bfaf4876c83ab1317f29f1748ebffd123a50c484239d533140611c2887dc65a5e0b03665fbb6a873da4aa94d9de360f7f49b1f17ba72cd5165bc3fbffbf4bbcf23c7d8e382e1093e9647b4b6b26ab5419244d6beb4d239f18a0b5d4289658a1c76760d3072288dd6782287f2896ca5cc2265fb55daa2ce093ba3ce09f194ce0957b2ce097958289d23a358c31665db440eed13d9aa91436b255bfbf4adb5f6c60b1729edcb29a9ac7e6f6bd3aec4949adaf935f6e8d73ef975e8724e307410cb96445c8905e1000607a41b6dc46e48623ac018304cb83091c520a4ec032b58d228ca5c6c018eb33486720839ce9aa6642e72b1eb2f3c21f74735ace4b09970e7d08de24c0d296e149b649669e4d09fc8328da6dc53e22c0da62cbfa5f4133d36c0611b492fca5b2a024161839fc316a2407c196b293da5bd291814e28528730758febcdd1f4374c99f01e9062e30c832943f4a519894688af2674607386ca336ea9c50aee02ff9237fe44f1bf5142697d9a2f8a13b95ec2f8db8cf39a7bc17e3d5eabf1571a2ce9d321b99df94078ebe047c68100509914a36422bd5361c03bc4f0d32a592e76f465a46f71c81785d8cdc16a3d6ddb6d21867d7ddefdd2d638c31c678d2d030ca71e683a02a729ca121cbaacef1550472bfdfe6505543baa44bf68f7f454953765085ce2958e57085582c96555865994f1984cc6d1f7a39851450906de44bdf46d9b187ffecc29bc31b5a107b9639f4c96e05176fc2ebdefddd2dce5fad77178c8e8185c4978f1042637608224b920d67c0e413892f1f1acc7c40c49822807062062c0a176fa408ac115a8ad01f710ef1f4afbf8d0718e710e3f8aac01749c260e1e209248660f257f1a55a2243121548aa3cb1f29452dade5182904429a54999524a29a554524a9f521aa3048188524ac54cc994524a299594524a29a5de9436a59476777737edbe5204cf947e677be0eed4d61a77773141d9ddddddbd4e9f734e67595b6bdcddcfd092dddddddddfd639e79ceeee3edfdd27f5e9ee2effb670ee0c3784ce7042836406184923cb42da7fa60b8edf48d28c224e8a9c3921559a63b89454c95f449a8bf52bc501714c38220e4a17a61ee4900bca92e3010e39e48698c0e4907b92e28cb2e4a4642967cf07c41e7213b389e99ca61a59f6908ba184707ca5ed46f691e3cf295468934911ea1152dec0e4f8344fa214418a4023b35370d15ff3234e7d3d2e069822580b5c118da48908d64290a02396e88951c05a8833d804a3f80e3024c15af0810694177aa4121c9a602de0b88005170bf891c1fc8bb09e58a5890db016dc098cde784f6334118612cc3fce0a587f32b70bdd5dc23089e506636c85fefd4d411266366203a594d26ea794524a2995d16bc06d2fb8525c28e87334ce19c110273ba54e69a4f1dddd3dc4c1691a2d70fcfb1fcda2893ce73d82b35ea40c3836e29cb37be0e29c73c6ef720eba53992ba24c524a29f5f994524aa3534a29a551504a299d94524ae7a494d24ae99c9a125ccc35fef62d058d506b29a53146ea5e3f7efe9552f95d657b05434a7dcbe1116290f1d91bac75778f11888b99c648bb4569b6c0fe5fe4b09b5f7094f67c016423149cddea984d884052c0c9426c8f93c318c6fbb4d073ff6ea006fe20e901d31e6806767172a8caf353e5991ce2504a3f9c60d441a6a010f1e31ad97f033eb4a0d206ac274f23274430612ad3b71514828516621621580463318b100c952918aaf2478f03318b104c823df157eef217d2b9074e98e88109a3a4ab7d1176bfd82c82861f5ef0010ad80f921e30f94033b0f883a461f781180093af7d400c80dd9e283cf27b4a7097bffc9e283c9a06f644e1b92fc19e96bbfc2f7814d148328510637041c4172c6011167d6ec002050f3c50e182c419301d9e8fc5605db8f833b371ebc7783f5aa08246ea6fd9c8bdb5ce5a6758ebec961fbf7e595dcec8a0c27bcb598472dc72d79aca71d64592eeeefe68b4c0b15b40d4e011711087c4af79d48f8645b20a3437b8bd00d3efe2a7aa5b36998b31e21a4072582b186b5434c0fd7246209dc3d07eec56bd018373041971362a292e04b8739c9171c4c59736c7d8ddb2a59473c6e9b2bbbb6577572a63c72a29a89a5bb8faf503237b3576165985826c235b1a2a7e74cb8be022e3d05081439b223864f5b3a2a728181466b6919ea2604ff00a47730596fff9f4029ab0f9fef160d8740751406521a6bbb4c8820b019e39ca6e90220498e628bba15b01f0978c1f731825206331cf025805334f30468fdf391a60cb7794517094d9a025cb588edf07b091f93296c319653680c932bef424206339fac8ae5f5148bf9a553ffe68b605ed43a203b32a98993e8b044994a983610bd9bfedc7cc8361f7630412d66791b0e50aa280ca1414e27ed422e3e4d027fb0bf1f8c958be9ffd3810dd15a7135c1c798e474818cdb8d8e206424732009add2006493535355f03f6c42b557e88c174e4781688e36924962a5c60345ff33eb01def03fbf7815d90c5c362812c9ed50a64f1ac6c7eb5fa15d8b37a15c8e251fd0dd5b3de0706c27f310afcad767cb80aeb6bd57c1fa2a2a8a4ec588a72542a2211000000001316002020100c060422a1401646aaa8a70714800e73a4446a54184c83498ee3288a8120638c210018030040c68019231a1a713775e5adb8ee838bd69b5c12223ec7b0f2b1b33b704e1a02018fc1a47eca94c278246d10259f1cc1697da292bfa925383ba3e1b581140246c2de27c729861f721122d01fd2e8fe331d9787137f6dfdd01af0c6a5ffc550aa69fbb2d1061721fd950407906af3e7bd6ea5c1b64c3460c6d6d62276ef5c66b9046df9d706898d718814e0b127ba928fec284b80d513ac362795e8f43cc9c2ce9622106a9cdab4eecac3cb670dd5a62dbe56c300ab45898808beb4796d0dc3658e28d998de2ab1b9fc0e31d0c947a5437567ca79c6f28c42c987925e113e272be4b1e98322d3e44dde6a528f080999f4863225bc435a28f5da3ca0a34b7cd6745050e13e0fc437569a55f4ad0df8ca75d50dca4ca1b9902bfa988772f4224cf0fd46dced5ef905f47a31130d9d6784cf765d3cbd576d4849d0ca30e97aaa06f1015b3b6218cb2b001d7b63e049193cc026c1fec2f2388296786172aa4c4ce2ba08bbe53424828dc40770e040021aad555ee35ef90caf7e5ca3ea1121a973ce2cece9252a103037a092afdad24d99ead92e343b18d674129073e6b2a7af66bb041695cb33ff31fffdd53139c9ad01d69594823759b4f875c8b3d3afd08d33ea86a5dd94370b3631e13845544e904bba35433bcf27b66781457cf06df2cb86492eee8f46c53efe8517729acf0caeb124674156e9de4e33407a456b7dae972d98f97dbb04b3f959e36d32e7c1c7cf34130508b157ba698827194499dc88b3fe3eaeef871ac3e375d68c600bfc5fe56ce0d253adbfbfcbca32c3e45701f39cd81fff913824c6776c2601ef7dc7c3f76fd1c66d2dd45a9a8c56843ecc4204145f219472747cb4a15c3d8e51c6ce15db1b90d08242d289b566d05dec78af279c80b704cb92bdf1f1f9744520f06f96b808c6ded4da04a33f8212271a0286787f105a12d30911fe9cbf01e91479a23da383ad10cfeb99d6bfd27b5098891c8aa4fe7b06c1a14d4ba5ac9be678c7cd728e26401ec207d6c3ec4c836937d2ecef567d1a8e948ebaeaac895eb70a2fef5bd498de875b95a51aced40b34248c722971c00c92fd69cfab2fdf2974d75c3462b945cd631223578bb1e6f58d69ccbe620c087f05749689686a821d63aca11af8f00df9188c971564e7b016078214219f3447cd7b93b730531b889acc04124c25e3f6173a1787c0cb55ceadd71dd4132a4712377a2c872048ee4dc925944d048e999e1088d753d30723a3b3cf96cc94f9e6d1272922c4945213f981c01c26ad5d814a88a4948d07ec4134638475ada57fbd3cd56a349e0ad2fb2429950ff1e4084c297bb446984833f3d6ade5544478c30e38a5525c1f6f62febcf838947dbc909e57a6c297a478dc878bdf47d2188520ea78e92109138fee5aa121086974a66920eb9c5381835cfd223eac5efe9e6d042a1b0914f5730a5412b7bc1b73244393e2aaa4a6c08fbf6c780bdbd8dc3c3b1a3a2e77253f2c0aa149a41a8244931d5774dcfd46110db07da63bebfd6acc05f8c8227b5dd74e0952d4d9cda3a80665afb5a58b9828011e37511d293bed110581d70568da796e24cd123c8512ac7b8f9c7b5ed1f6315939f4c98ee88feb6c255571ef636444a2619fc81d6e6fb567549f9ec85532cc7df71d116b0b0364d9bfc45a6f7876b5c1e89e6ce34c10c91171c9182b7bd460a760f63450a99a86e951bff7561182a7601ebe4f687dcc11b05c5c4943629cbec4ff265fb6a46e95bbf935c1dcca6c293cebc7adb0e0b662d7d6febd93c4514e2ac982969f6d4b04a1fd532a23e21119ee1e63ed4d1fb76dc93e6f3da719f522afaf99445500400db50a4b69a00c3978f4ef94923f3a3d08b0de2d942abc59c87c8bd4a796970ac80d9c81cbe8a5b199045685b0af5cdc29d0a7829b680b7ae4de88d74cd611303b1b3fcb9cf5649bcfbae03a1edd54704fb23035453a4cda90cf3ab7245f63a365e7d95bf34af7e152ce808e6a129916faa5d6c9b3a9668c442c2d7f6eff45dd53de51c1de4d9c2f5457653a688a2e37766adcbc8733e04c772f5241b363504ac131006da4011195bd06a0a51e8f1653eaa9a11042fd06295b17d65d6acc1d0310643e070edf629d9a537aec51e7ea2ef0541377f79905211df3d5e4ceee3d1faca5ac8b2ea10e628197d711ca63fc8e24970250435e3a7ce1f2b8fc9a037a15a63ba4b25c5627772dc11032bf0be4f7983b75be7038571510a4bb8d1a678096dbfc3d814d63f5f3045208d01010372db557a3330b87dc9e51cd2f0e638254cf112dbb41f8f63a73e936c6fa017203919a3d687f56441528dda327cb82aa3b986db2cf7e05b287d7be361eaa0d96b194367a64b36bc1af4609698c48a8f91cc0b52772febd344f3e5b00c273587aa8c29eb7d87d2998f0bfaff0b0cc3b986c05a32898e20f6b75aeb8d8e088e193040223bcaba8e7efadb3de2501f7a751824bec140b7a08dfe50e0eb3513fecd914558e5670f3438a3206bf860495c9eae5d2f151af1964a13438155fb0324f652aba560e79ebae44416dcfe1ef24d2fdb46b240cfaf142ec9421283f45f397e803603c8b16ccbba9d0b0570e4e249f96c22e54908ab79727558558bf043285326faea4d99873fc8339476e9e7678160078753e2b1c2f48d4ac78c936a038b8324edad329fdf6f20d6f5a6ebd5b687d51f04f64bbc5131248148ef69b339864470a9b31dac8137301c80d2d8bd670acdb2ac5122a370f0da9fd63d9590cf45faabaed68f7a456a0e868561e15aeb0856000795abdac581db022d48cbe56c6715a2143aaa404b2c6906ab966d21cf6b1344ca89eeee3c0d7a02261497968bf8ef8df9f580c7d85e8e460ee23430f04dd2756b5fe06cdeaa69c793aa56e4ff0d7a0b46f8ed1243b85509f64826af1d1662c37b5b286e871e3f34da117c62430fe114b91fdd07df6eb8c84b7e6389f39fb9ee50991ff4f308155e45ccb23bd3564b2e6dd041db9ecedeb392232113e5faec4f665043cb1312d3ccc0f316d63e71e6bf832c2b9db3e895197c71a33b6cad7052c748acd1fb8b96e5381b73dd425782dbcd7c33afd884f6e6c9ff50c1af4bdd8fcdec5f2070bbba24e0d1b551696414cfe344bac276d2945d836040c8795c18c46b0d7cd63f5e8a297aa903ef9c70d6516ee556f30a7b935ba9a0737cb6ca958a074bcbed18b3a0dddee18e30adf5f8c1d3d01c239c59cb406d0756e4455fe6b2e959c1701d06a278ada478180fe48bd6816eca798a18a88ad5f9010e9caa3b6783248cd99453a4f546612be1b757d5bd818dc6d732926ab0685866046123b305956bba81149f2b7e03c0ca84aa0fbc9367b9df309abe8b1c571a5a0b256dd8f82fc403ea575418706782b9c857cf12b7a2514d58b56dd43793a6dfa96e9f8490b7dfccdb052bd53439d129cc2d88235fba2fa342d4e58289a79791eb9da26ee06af192ba1a3f247d78243499fadb3af111688da7b127338b9ed2acdde7d56a15a0981ca505d3d8f1524d7bc944f4b7658a136bdc0d39d4438447081678d4416cc10a594be5f5ee58bcf967360a17866b01b44e70f8325281c42eedc6ca1cbd8007acda6eefb1720fbcf76666c2d16aefb0bd3ff9bcc043c85cd93e266dd2610441ddc33b3d2ae08a11b62be35e5eb953989c8b23c465486b279503ff07d2bb73fd228580b9e7cc83ede80277ba2927a64e882ca34cb21b377ca84e08a1c020a16d50a1bbca48e686d51ccde48b923a57a5936b103787c3518220737942fed2e376d0a909154407135374e89bb934cc1d2a74647f7ff7b16d4953459d07244623985b64ea29917eb89f0b7b61546cc91d8476d58f2b4f1e3b12ea04254bfa45f88472bb92087b8148c9387e0e6bb343a4224f50904ece71484e80ba9130aa8166de743e1e3ff73a182d7541f895cd105be5faf088a41ebca7956b2608749b5e71be27d58b37806f70624627853ff0d85b9d39472826e67e6b4bfdca164c373216f550f74fb0c0f9a468f55952f898755a73b52adac0978dda3b0e65ec28d2b2b96aa66138b43c86379d2b8e69cda1b2108477e934f2556df449cf68e7cad2d147b1bac4f5be34861d7943620dcc3048e665de7ab5eb39a5a9095c0dadd01da0b9354425531997e22900e2da4de2ce910d97a104e6d7b6ffdebebeceb228446c8d0ffb4ae4484d2f9b2127740d1229f8a51b66c7610235194462f562bae1a9a72087e82f2dc8533faeb029bfcb2e5f7a29b515dcc91b549395261d3ff4fe12fc956b7398fcbac56e250fd0634a9f2fc8f5b9839d9a75ed09744c1771ed293d47e78f4df3dcc8fa797a59e60bfd316c4758353316bc105809e82405dc5e673c3a2f1faad54235d66b3620a880288733b87c9995c1c4808e18e9a6e41974fba45a12a6bcc5bb2d8ee2fb716d4f97aa4ac87bfb8941771d00a4130befe3e646ab8b1f7ce94ec9eca7030f3e4f013e264e98da1987c54e383e7dff6603b842e6826963254dbbc45917d8b1f2402469d2e3df1f380b8b94c01895f63bf4b008a4b00c422263a9df1c83daedc3d3ca114260820db83d2cd8c3ecbe8e5415ad202d1ce87c91a7200899da2797746cb2b0f16fdcaf4e751351df23bca609289e0d85838c9f73b4095df5f9fbb080cac3cf6ebb410b13dd6232ffde6a3a61484d32baa01ebfc64bf19555248b159f3a66aa8d242ef3785a40a63de57073d15952610a8c81aa10b2f51c51d8a980d0ae5d638ae6887126983e43d5b84b2a14270e43834fcba018026d8fb1ab6c9529b3631b02bee6c7217ebb2c52100a3431f5dbb86179c8022a0a293559ba0729bac5d43ba4939e13994e606be7decd78b3047685a6b1f8956e59082bde03dfe21d7c644ee295b0dc7e981e678a8c5097c84aa8b4dd3d054ca398e856b1f4cd3d229d190798c8f5c8efac6216bc50ae85bbc686b0f103bca0b3557c94ac6770451de9be12ae976bdf6d1738a21166c4c0809891e63f4e311e66fe193a66eb1404190c78d5a6fed5165cc162af60f1052986709239c30b4679b968871b7dd7f5798841ffef06dad64c08f6eca102f82b7f4280c2c803fe889a11f45ae066fa3942047e175adda48ea7999cbb7f3507049974cdeacef27d5769e15c26c3e06ec2b5f53249080d1db3cbda7797288c1cdb4b39850107cca7d8798e01b348076537ddf48c48b9df3886607366d7365508d9ea96dc3d3a0917ae2b2e824fddb16dee1b97cd927a153a7abdf6a61b3c0d626924c568549dab48791a55532131390e9fe43560aad58f8ff4143304a62303fb27cc2abce995f6f675815a915bf51d4d39ee7275efc7116c383a6db73c7403a0147622305adb131d768ec887560192f584bcc0eb1be404996b6d9f744871651d58a9d9d7ffff7668deeb08e1454dba5953cdaf24c2f7357fd9d128fcc69c7e76f951a051907d0c867fb539560bbbb93810d8ecf5477b6c7179f751421217fdee630650560dc8a2bf40a806639fa831081d10c368dbbf04d4cee731adb5d1c8cd471b6dac9b5f3b78ee5312562b6b0d536c2a53fb53a5036c2f3731368d1bbc747d7d9bb6d30b48b7c7f9ac85ea3254170e15ba9dc8b5d249f92e23984a176053001a8553260745dd121246311aa19613e6f37117eeb3152cd08ca996341f62f640c646640e8438e735298a1e04057da2e09b1f17ff556ef1160941bcc2e2ddc4a581c015beb62f3408b6e2a582daec5d6caff9b0a0cf60ee05dec8d02459eaf09327c70e1de87da024cbc075ef8ad8954fe2ef09393bc1b1f0ca255f8c71eb9663864f2f1f34a48444b621bbd5381a41e61090114ba8b08883dc8623d734f76455be16f5b09dad4d24666b56f7e68ec5141c5c1e1067325c525bad23cf50b1121f90c1754b94419cd974d221b056abe0362d0a28d3c701a3f98118fc370b24f5e9b0413372110b9fd3667cc3ec5686897791880c6e13d41aac2923a3077a71df950ef13d8fc20889864d14dc35bf5cbcd3e211f0924f343868808684972200b972663334dcdb11e81d053f7d61f484b75a7282c66ae1a683bc76f53c15bb872e5712d7b326ea18573fbf19822a1d4b9944fe75722e15e15cd607253af059373495a554f8a45d0826cf52eac753bc3d9bdead2fc171bc7bd218e99bb8e30a7d49af846270b67d0d2f11638449844e4b3ea0424d48b5d82466442a091be2583db8d29ceb22007bb9e0cd622a29522aa46b6d806ecdbfb137608cfda340b59d96241a69a70355f4e7c1461383d1db96796773d872a36c3e83b44ea085f06d13d19e83f45132c77fff9abf7152b07db9d2a1b27d050a15b8eac9496257f0452c2f85034a122afc37aa9944ab41c69259831b715d2047259870e8bdea6880b55dfc82746a4a5cf0aa27fe2d96105c5d762ea42c85df21ada2575a6d88ddf6d4256d251f72553ee569da715fe1109d52712f4e8ce94197d1fb19172d35d59cb89ff79c451e4fba5a3822c2ca9d28a7d25918de3bdf247dc2e89fbef338d4f69805e3b3be00eaa8a5190c96726cb1bf28f750180bb859ef1085f015dae79f810ac97d50a4a1af9b51d30a7fd0bf1108b3ec8efc7ce0fa6bdae87cdcad27bca41290d215040b1fa3aa1fc7056285b7cfbad4d4d266961c87615485d97fca36a9685f5c5a8bfa0c0d041107a369d611e4d9a4b5c5658861218e2bb70ca9b5fc12b74b8315ea044d487f28700ca2423061007d9e43504b32362da4596b866418dd750a0c7a8b6221579443a90b06139912069a583a2db63afa1553b186c41e03f9880e8f0d71a692a3cdf59acf19368d2485c7e3eb9346015a566ff34cdb8e5fcdffc43fcdbc80a41c04d771e5c4f49bce826bbcb87f4f082b8d54061b8c414030567b000c147ca77b8f19048accbce8d726a20f559bb880fccad33ae12906f5d23e039261c3b81cc4a968772c4e2902e57929622c6e602d608cc11e88a62b459c349266482b399fb9b8812e18058ac04604f168dce4e2990e37d5f1523859caa12c661af48428589f1a1226134b32c87b191e1c1ec3d9f41e37aa7f1bdd24dc357fd529d77fe011329207d5a559698b1fcc816a843e6ff0547f4a4eedb79b2b90d237971c5017b12cd0c29d19c7d381db9e181580a5b12204a76a0de818212282346f114a63d1e02193703d7864e2c7278e562f19f0595951d84ed0eddb98f6f047eb0a6b9d96e6dbc048ef1a88ffb1e346ca5723135858fa032fb0764c0f0e72518c6ff7839f02c900b8041ece1f7ab056fe804d82355892767efab74c9bb9e01fd5ef418479a8ca23ccf6a7d0c7826b1e5680f02c8180662fa283b6daa5057532666ae34d214ae9da0e58cd361c78860d276bcac4d55e7bebef26a8fde6e5f06420814900ac0ba90b7b4682be4941616835e453ffa733ebe78ce59a1ad55c4a612989003d2aca07969830b716e04f69efcd5e48b19581d8eebb30ec56dd710296315b2acdb3897c59d59ea7b2aaaa6eadb13ecc96cb12f3260c1bf2573aba3a107bef1f5c2cadc4e6cd79d4f41e256f21ae1973f63dd2ac20a90bf28e14a9d6e41934b191ccf0929e68b7b01008394d6beb0297875ae21c4777af831131da1931e0545a60cac800bc4c39557a18519e2f4010e18eb4da001b3a259f600761afe02d6025d61440eb604278c5895960a69fa4bb3989331f29ffc6cd9c754aafa25d25bd32f6011f8e29a8c1f6602f147a09b26ddb06e4a55f1f847f36965dcea0261401bac0f9dd313baf8dc9b6f8d27c3ec6a96733ac3de512c90a55dc51ffc160e128bca6ecf53d717d29f83a897b527edd15666c6e10fffafcba642ad71410c7c6cd8c2a80372f12ffa0316ea63a470fb10559198c62125c94f5d058f1f4c7c9e83a6447e7479facc818e0f0f58cb87b64488484366fbc0c05a1427860dd2de976f2310dc38c6ee9de18db038434c67b4c2b85baacae318a6f38358d1d04a5edb2d9fa7699e8fe387426f7fe3071ec0d7c15b6707cd6eee6313acd9f5489a7299e1bc54866d2360e27941edb5e876ed6083d2b5a6275600fd7e6ed53931fc9129291f53cc0edc136a63ffdfbb07303e7200937c28dab3d1a2fc05935c7bea02052d5173a65e1ad1f26c9019eac688696539234b0f47c9d1267eb187ae2bf99a336dc0654bb1c5768e380167359e2299f77a5c8cd2f14dd93c0be04fc44c9c19c6e0fe5d55f73e410cc43b3da3d23c92d0205089e62aa656965254133921d4672b77224e133f88a40d77c807c9a8112376a85ed1479c67415108c8e58839eedf1849825b37373127ec361e31c152dcc18237810aab5402e5350287e041fd422c0aca4dbde1ee097aacc5d76fc2cba3c94933b48ee59d30d450ffb088fac6edd778a2bb2956ab61d01d1912ac500ed81eb983eebe26884122b01c3c8e376411d8e06a7045be5c116da2ad34ecce6d938f73cbd6774c4d4bc1542964210316c2a817fbebff1748cba56b38a00dd1a07aec5c47bd4b1ed8f343c9cdaf3a505a83d71be3e38de66e4cf50833fc80e5dc6b44271d94186345b6b53db2231c1d7fae092a72c2c08cb2fe9ea658650112abc5afa9dea72857798051ac3900a3ac7900a6280b5807b84aa26089cb455d5b9f2751aa5980e46271d7ebdfd3944b1600b9b5e8f5f2f4f4a070600f048c73a96e4801a54ba5548f2ee64bc3d7796421824477ad224179fe51179619aa010a6cf90789e9955bbd865f213e3661dc1708b1011578f82be4237addea553fa3f3971353028f673b3e230aebef7dfc51d61867d1e2157741b813be10b575f61d7ff5620c7dd4a0290b64951900ea94f0597711917110776a50c2f1f566035af313b2da190b575b4091cc17711838becd304e0eb805b7bca836f713b4c3f3d9ed03648f2242b2c3b18c34502ca2ed7bdc81f906debd4a8b7ee9e1e29e69f8d3966378ff83ca21afa4d116fa464c820c8994d8af2b33336e10315e0c07f51b59e2ef2c9974cfc5f5706854e6939fa17ffc689444edaa2bc16eeab3a08b45a83f7ab32a6217e0ca6cb0d97b3cfaa4532700f1863ba05d84ec0611c4536083205b0e208c94a2dca1d469d3844f99ce2a40b7f2607b476c7a73c2cfa6da74f12ecab0eea76c10d6847b04da53ca7054370b553348a1e70854cc04dcc3bc88fe7fac1b5653983f3d020e05843248e5b1b88cb2971630dc28acc38650cd9f8872c998759442907b7aae448cacc971b62d4587be2c52e8ba436c7ed0b806345a5753cb6d110aa2eda1acb73f51e25f305ac2a5770f90705c2a6b93ca4533cdd1a44cd8cb47585081c8b988792f46a32c3a2cc5a090b13b4efbca808e7aea15383bfec7481aad69e2b7eba883df79bb870533ca569f23bda30ef0d1ee59c0d6577adbdddd3a713c04158480306e4a6318cd858c6e8d62a7e240ffe9471fbd3a0e0ace43af034b9ef0fdf24c2d90a3487a3b44dd49ff3d990e9a87a1fa26e0d4227f130e6727047bb62eb0b22bb7226b990436f996569bc58ddd195901d7a9ec43c6b08e0ec70ca83c3147f1f10ee73af2b41ddf811239e3e18a03f2f7aa2a3fc54e1e2e0f2fe1cc58601b8f1c9650a7ec283e250fd5215d095717897f6fabc5604c0605fd5db4222b7168e187ac2179eb72148cdb481639fd3d31d81bc743cf5006c1117213332656674c0c6574bffdffff4821fb0d5c9cde36a6c6d6a1627dff1b3023924830b622cb1f2697a36575d88621bcb9a3ff4d30944ad0d2fde779f56198f130940abcec2323b8419bd18c1f0e01d7e7b7d240fe1ec1e3332a3666726e581bb7d2cfa92db6e78dd089935ea7580f32a390950e58a2b94b96f886372fbd1681856cdbca2ecca420a405449b7418e8734bb84101b9f484d00390c4548217f60d9084fbd2861d9bb0981fe16d2fccbcf407c93563e6532d421c3ade8ef2a01cbc32301067a23f737d5e635928df69733701a1797236714a26336766b44b95fb5d03e76c4b5ccafc55971c1938d684659b66ae09d49f2fa4fc1d934d0fb51005e82743364d6910d1f278d65bd6746a6deaba1c07546681f6cb4724a792ff7a7e51acfc71d265c234274041e56013da3a344d25df54c4946fe162faceba592f4e3e49435a46938e57b69159adabc60c1ff30dfda907e02fe70bd337f0328128634dd75a7c65dab00b4a76a26259fbd17c47e1f9956cb4a0207f6be82af6a4535d685dd62790f1acb0f4e0003ca124e00c83683a74b8211b643e87e2e1da77087feb07a151d4b097c9167491d568342779ba30e2bf55bd79e51d6949ee3ea7f1776c3e233d437e2ca9f9c0d10bfa94595a8fa9bed48a71320f3ef531e71994ff6dd10776bf5a1c6af4a41ae82c3a135c95983c900b6b8f067384595fa6039c93b063f45f267c338fab83d32e3d524f432efca3edd49e7edc6be5c34680dc7a3cef32850fc4faabe50e28bbd0cfd44c4df37b67d004aa403d1368b9a54f5bf86386c9953a12773c6e66af81375b390fe605b71b6573b67e7d445b9a010a5011a088bc381bc211e1e3d1c1a9e681b159cb03e4f513c5d73d9efb716371096296e1caf209e9058c0624ad01db62eebd091f4e21e0c100ba3c006a5577cb5560563f16bbf5470219d1336fd76cfceaae276a11cd2114eface2869315e38ee842113980777b552e0d74090dd1bfa668884365727da465ffe705cc672b00c39fee8a6808a0d78b000d5866e32dc8138a03fc57e3b96c93fffc176d53593ce070a90e77b6eab7e7a5716e04af182c9bf905195a8b71ea1a253250c0c7350ceb256080dd4a0d7cbb1a985717f82e619dbc1a320b5f5c7854a5c2017d4fa1392468e5204bb422ad05b84215391d6e2d2c7c67ca33e3d514af992b5dc232cec362890a4b1b43ba099bb88207a9a8e7142edaed497517df257d094af944587afada495a6e2a0daa3ddad00f59fba51b7505b2c934451d305611f7b70322730795f5960e97a6b330886fb3b1ee5264c31fd94a9000ade96f702adb1736beae0d4a1a66c36a4cda1ac08ed0204c0d7335bfccb50b944936114ac7d62c63a2d4869f4538bbb54ba8c71822de9e3d30cd48c16a1319062e2f323fc6aa5df4aab55dbfdd3a429e2c59e204d4a21658c0599602db63c91f288b7af146e705353457c1a8459ded1523bd452d2ad98a5eab0950b481f11c6f90b237646d3d7ce8c3913c9ceba9aa03b22ef176a34328f9ef92b1ff341e6130ad311608069c313bce3ab874e156a14c9a4bbed05a8a75818c54341ec99a6d1b08ce83a290228337e1d8972892cb0d2b5231a3a1ce97b41a0278512bc63b51970da3234fdafbd758b1cb3589df78b3ce6b2c1be7aa3f851625612e6bf8bb438456f4bf9e06554b1c870c51a320627da886018de9b250a1584b007058f47069f997809d908ed0544e97553535fc12d61444796b91cef3ceda301b20bf9c8647d3fa416111de2d679664c492de3e34a8fe784197119f0c9672467dd15cd6f4d3016b66aaa41e2e3276644f7f9735741283ae29627a57cad2ec561e9b0c952298a08e88da267a95f9809658fd2c24be7577ec001ff55ef64f32942df0cedc745432ccc7345dc32894123b07556918a9a57f8b58fc611d80caa76ed725807647a0f2915c0facf64c1329f232a4905b5c444fe2f0ee65cd74b0d68b6981a76567c9877b00f2ea06d5e7c28e844cb3902b38592bfaffb456ce08f9bb821e736f2bf8524655f9e5900d1712b18f991581451fee2af668894da8af9af8dc5659dfe5ad0f6a2bfa385980bd3a6d191fb8330b120ed147fe804201ec5adabbd8b04a56711e8cd46292f783ccaaa0da2c4a2efff7028fd650995541c175baf02c26b758fd29ce250295d91510ae60da475de3660c812a867bc82e8685b06522d33104c0ff2b154cad9545c616e3147dafe30208502d07eefb1c1fc920c30bbf0682744064290db29eff14b07b874c59840779041f29eab4b7b8cfb2bf8b980eea6e6c36fe5cdc087ee9b986c89c4838bdc07420bf6ad83bc8d4180d0a5b572a1aa1c161d555e5463668583a54d9c80d0a4bf72a1ab5c161d7a18a63ecb1dce4c1b283981bd76061eb4a5b1e586a5de0b0d74d64373ad10018ec76d294b1c1c0a27bc946161656dd6b307290b0eb4c937107879dbab775a091a7f79eb861d749443696bccfff52a53ec7886b4b9cced6760cfca8bc3e42130c7959e575c3cdcf02f1196d98609e2c60c0e653cb4a5f4bb46c2499f4ccf342bd91040c4a4b961cb2f72602bbbb6277e5f303b61306ba14821dbb94330ffb1b95bb064d6c1110f765e0b1bdf06d5f1e1ca48bcd5966f168aa87c82e53c0dd80fcd288ddda43cfe2139f95c61e3239376dd482552d58b2aa6512d97cdefd83d71d936e613a2c3c40e1902005b443ff946a499f6706b91312fbe4e923190928219776afcb8ddd03f0e078ac996a0286afa54643c30ec27b793ac0be8ad982b88a9df9d8465665b3703338f2c7d723c0c3e8f067f835e94c565add4067a2a5e8f78c5948a959c302a3e5ac55044f80eb774c9859e86fd5202d1de0fa3e02aef7e15c2a6ba30c37a4665c3976d07db2c942206b3871e2af1a732bb64ff7dbe29f65faba605383f6c7f19fa5fb332cacd38936c12076c4b7bb20fd0a7135f8fb6e3305b46b5fcee82b9fd3c058ebce4398a1e99c6fa073d3af1877f54511a4dd639a5b04485b49279f9faabec2499cbc0d2211bbacc4312ff624b9582493df1424ab8dc7f17748308357c3fc9cb3484f0848f128f1d7690bd38f86db1285df6a2f09455586275e148ff09ebfbddf2e91b1667fc1b01bc59dad6e22872675a825846acfe3679275836c73c1e0d182127c8c997d2588b87b43c8286234ca73f023556f705a0052bc19ee94bf9448d91b02c747debe7cf1f4c2fa973aacb9d05f73249f2bb6c531efb9cd24c5aaff47a3fd96d14122181c98410f1ecb2352fc13042133d1a4b6a728fa065895717f62dc1da01cf22fa7f4c588bc2b1d34310973f2dd22df56a171a8cfb5bbe76dd18fbb8c5b498f26c4f3853fc68757690e3e599fd63783bf75b9f566c05ad0fa204ba8cb56f7db4f0236234cb70a67c433cfa9523496e4ca2c4864146907d8ecaca7ec30d26d6c49bf0a2962bca479fcb2437568a1c57d7a368ed03c161df06d63ad32b6ff643115395849809911df22bf0f0a592125f5dde492805ccbc49d9f9df9089255d6a27be43aefbef09ce0436d8cb614346ae822b172926f5f3311237c8916377838ddd53ca0c13ab22d58fb76acb5c0362b1bd8c92b3a6e6e30de82385b5cc9845336bcea4c62d584f3d921fc24b1e2a404f60f7f80180342f6f23bdbc8c712f76ba7375d31d64f0d26f6a90f7acd15fe93f55668296dbd386475ee38f77f58b60d1abeb7cc050e15de047402f6c23f26ea33ad4738a5472f31d1798b0e5975a1e87e388c883b490a6bec628c9dbc1dc0d35f4a15dc75b0c9f8d2c740c2dcab5ca55a4ef99d7f6eaed50c3e3766b05c65b7c70044a73c5d31a0f6fc7341814af889a228199b2ad45a1013f1259c74e502e4d43fe3736df154b757d4c2dba30e2f450a65e3d17b3b5ec8c196d9fba434ccb85ae6ee2eab3d147ac95dc16430497b7e2b0283a938e045aab91694a70caf39a6976c5cb65bc86fba383651d9bb2ac1394769c0a5f30039120d503a782423888a607dc8caa4f847d0e3b931920d97618431f83b0856a554ab5ac48df1e600c856a58326e2d0815d9ff4058abf8661e4078ab01cd8a56401f845abb9d45d2afc03a86664f8e9c81853e0c4737bd896f705b27eeeff76354814a5a0f0836d89901622d0cfc1744e8cd4c2c903cd169a9989328bb205e5068de76deda56eeaf406780dbce9e0bad220e56df892149ea4a042fb622106c47ca7089639cfae6caaeb2708a62873c61ad60ba4dc6f999dc89adeed9403ab0199567d9b7e799a54b693df1cdc10ca48b1f151ecd2ee9f0dae0a13ba6d4f5cd0144c8e40db398ca1f8f040f5638088b0ac24ee589a64d5a4de4933ed0a08afdcd40c91d091836c6bb966b632623ec6c774f23c1400ff2ec17cfab18214a17721e370f811ce725a2f8735e723690b92d3070bfcd5aba435c7a6367be97d9d83928bab14adea2637d54524f54b95c8362c060cb59d397a6c89baf82dba06725c06a9605c49fbd26ccdc20bff7c1571047ac2f04ce43e97875f7c875374dacf62ffc007d442f592c6cff6c36fbcc8ebda74452740ea790fb657b4bd856d9037bd7cfbec45d88c6582a3f7b96b7dceeefa7d39a2055b826a33a2e8ee4519129fdae48c4b0b080cc47d31bb2f6851b64b52188a645156ccc2f27440ed7d2555f9682981cd957ba79a7ce49a8d0479cd1fb0ab37b11529ac18e88000f719b443d01f9cb2c2f38007eca9f95fbe0a5c37a401562591cc100bada8cd7b5d443fd6daa05e4ad8db4fa52763e4675a45e9e9a31ac8b720c0c18ef8ed0a6c067acc7d9fc3e7b50203eda036f18bf2d63e842945241445f068d73d941b23c9b5098e30b8b981493a15079fd4434c9de8d0bc737c9de96a4f154329870ca06462105b6931e2dbc83e07ed61dba7f2e698ed45a40fda8782009c740725f3374175f47bd98c67e8585b52f680c339552def8b29bfad3440e4534f191c88dfa1bb6e51457161e5c5fefc72b94afe86baae7a2dcc8b6e353e7b2440b15e6d3c9056ec062eb2faa64d18ed9484ec98c0475c74ddf4e37df84b00d21df259af076808b6856681f55eeb26c7116cb15e1d447c778d034d12cb09603e921cd5e8f63d3eb6e6dcc9d330378d01b5265ee2b22bf3d47eec4fc6c43a3858fbc4fed8dfc0b66403330984ea49cd7f3d192daee34788b5dcf4cd8c024cece1c6b83582ae581f1a88b06c896b770df3dcbd312b30083aac98af8386afa60b3add96a3cce4121789d81831cf1c590c7af98edb63d455fa67a1e1ee40975b52462a1d7b22b7c7ac72d502a2853569a8288374ac752ebad443712d7326d8500121c4be5cafc4994c76f0a54517d426442e9670183e9668543820cce05c1cd273109c3040384b4d58910186619021cd3b4c391d63b8fd7046ae3a0fa22f6a477ef6dbae94d35470105fa7f0abc629d43bebc0854b533e87cd461d3ad7d8a1d8c3dce412904b600824650b89bfb581c519b481e55dd64f894efc3b31055c2f32bc27016e3be362a2c31db6833729baf668b64c785dad0bf3011441b94dc86f1146b2a688592128962dafe0ce45054afa43fea12071e2f5e618b6d25fb9ebdbd5df5da355c37b0d117e71074abc66fe8e5c8c27a27d23bae46f7856101102484de3825490384d8545ce3e76e8404908e7a98bd8d59eacd0019a72464dc33387c4bb99d6d067cb52b2ed8ca08cb7d969aab9120559043f4d34ee603f24d31509b3ca86a36d5ddf94d18aed155c80f2ea0e7feab6dde2679b745ee2f51dbdf91ad016cbf7c6a852744e55dacd62993d6e4f059960870c57fb4263d2d7c31eba4b559ddd0562130581c3c73580b422f6863446883923bb2a395fc65e690158f82d5836cf3d367d9f349e5b42e1b911e1812a92af59d5da83c06069d4f9201f70849b400ceb0dd1ef725f0b031f5d84ea49e4e64fc3e37d8cc23569f668b530b15341c60e503d3c7c17ace183ca437df17b349ab8f212ef08f6a3ffaa82c24d7208d6196fe14a1e5d0ac65d08223a20b4ed3e54e7249c06212f1d67d75fbeb04b8f132f45f4cde70cec1c8407ccf9a5d8840c254345341b2b8651bf9e7e905264a08a754e71dfac73e760d45217d64dc461e0c7a90d98b0a1604fa6dc7091159e7210c0ee6fc0da560abb824eaea8a1633c69bc4c74e059c08e808546a1b5278920e40290cd596d00e0f538390b751d1eac270e2864ce3f2db6304992047029d38529414ad9b9c0478ec067cc71bcb63ab9c8f0819a348eee270bf2c8a98c2b4cbc06c4f8919a71d0a0d447cac32ab43463a56dce467daa60b786ab398a78868b781c61e93ec48315c9b6bda4d2197c36ee6d921d34b846d053c47649d7cee3e3a771cf35499b940d66f451952b559ab52910bfdd049e040bd0b965911615e07a48e4333083bb7420b7bf7956264cfbb7b64ad87e05dcc197245415378ff8ab5970876d633ad58fd7c34b1917d1ecd24a709775c85b145f2542da3c39f7034c0b1923688ba4e2f6eac86aeaa2f383e188c084c9a48757249700280dc183296f58c2abe0cbef0b84fc138527845ea2970bab50ed8c37f5d0304b2ba811f0bfb0d94e39b3ecf8b699cd4eef4bb85ba2aafb95e87b5ca3c601e8d189b0f162843a92dc0852e5b1eae9f93f7f91a41b8690d17c6e2a613df87984523412af658a6aa08408a5de93b30de04062eff41e0ca8d7fb11b17970421945c6607294d722624631d640cd78e2284763b329554d872d32584f841ca2cb0a1bcca07a2e3997ccc9a908b418d170c673857489918c67b6532cb6ee47df2c33f606f5a2813ba22fc23b8e2bab43115750f5ee09b897643aab35137db6e9fa279ae387ab40051006e39923a88d7ee3a23bb64b4dd7859b363638d1725bcf7d20aa081bf229c29e24bd8879bdf0d26af0a16cbbd9d4519f18554700c0fd3decf01b00f7112a423c0c1cca4d3e721327888a30c695463e215ef5d01a6dc21ed3524dc2c2749a3f494ddc208f4b401890a851aa4e4242f1b86d3fde781c216146c1a5593c278bf2202cf2ca7603aa5fbd811323dc11e1b81515761fd0c1aab5549a9f738f2ea9b54992889078a8e5242f33f807ae1b33207439cc184eb2bc8648f68f46cfc0714f6815356bd411b3c9213fb7beb674d5d07cbed45a5b33bedc35a194b0c5ecd66e6e3ddf68de77a2699e179c8586a16eb82fce20e2d0e1a134e3028d00ff372a33efd032246176cd6da4fe6dbcf43ca9fb85c7ab3e7883bb56ccd259b6a209443aeb576ee38d3adb2b632689778aa8262ff6fe7c0fdcd90e9d5e276e4871ec92abb1781af73902c34e4c30453c023874cc00e1981c28102e16c28a8e5484d0adad7956d16ed7861e43aa270fed2d5728b35da529a0ba43420396165ed3ac7459ccbdfaf3d80d56fb8a17e318253c0f2c14b0cc54697b78a0f8da9f37e51244202cd62551a1d3037ba688023989b8de1a6db86e636787f5e883122ae39ff40566908db1086dfcfec44da8b1ea24ca2930ffa8cd242a3aaf23af5329f2603cb92d3fc0e3e410d7f32cf59a1ac5fc02ebf68807f2cf81773cf07d290328747d5929e3101e21a4644c51554379f0cc72f1413442905a0c917040770334a458815e9beb9b58b0b2fe200369c93ea80a609babc465545e37053d109892fea5e269420d5547c6b0b4b7aa192aad90e2ab1d40515c7053529985d8691df9b00fa97e2721680229c2e03af9bf30f02988a170ee3b21736641b96fbbab86320141e52ad0163d8deaa9e244702b760499618a14a7bb0d9cb65e263ce5108ac70cef37bfb1ccf8a76ce09bcc2a347c50a2c30cc3417630b7570bbc63e8a3b79ad035603c6645b8894c670495547cf5c9086005bc0a12f27ffe16473d44de248966a1c003cd4661731c6a5a2a8766fd55a6ab2b557ca8075e088de8a6f49afc42603e370009670a70025bdb8910b054042f673f88e3aab760fc9ddaf487f5d35269c58494ce423d54e289403c697c47808d143a0cb93fc548071d95072291b2cd9494b36c83248bdd4216d90cb25800b4d647afa2940fff88fcd1ec3d346aa4a0882ba47371a4bb0b3a5e17fb56b912459b6091110b929d0677cbd227c307b1e4d047601752dcc8eff9ebcec376bc75b8766c8ee0c6641b6fa74c6be2b4d3b2bce4be99fab1f22dc32dff798ba47911be3b0eef24b10e066e8321c9331487f41cc5546dd1b73cea4e3ad59387a26296590f25066f2ea9ecb87bb8922786ca482de9517f1624541cacaf4f3432d58e83f67c30fc97793155e74d9e1db4c23263c721a90d6ec8dc17ccfd0e4c83f3522d4ee2170249e03a616308bb5330ee67d7d7d710695a78cbb3629dcdab246012707d7c72261b5902dbd9412c647e938916190392aeeab92c1c7a93ee24a4a032295c31e9e6eb5506feb844554ab952d82272deb0ab4c2e22b6e2b157a60515e0dc898a327ae10fa2ff3ea658267d51aeea1446dc73b12cb609404f5b3015bc9001c9f99a22966b17ee3b2139daf7b68ced48c2c8466f60a06817f8ede0ea174272ee307711df53b3f961435c33fb6e42ab5efd0eaca1d09d0d6face4a8f82463dd06d3ad33aba36a255232c33c54df7f5b3cf52eadad847d005de9a501c1dbe28c2534837b897f903f57508643d7b49e04eb9457cfefcf0f6013f008610b2c661a7dd8e6732560ac69414d5abda0f7827d114b00e954acdb5f5bf0b4edbff669f333faeb0038a408c74f76067b76958192d987a73510bd1f80f0e41473783ecab7c81a9a2a69717305531f4afdd368c4963e2660925edeaa9cc84e727d8ee6f3e3e98c6b12eb8c586d9a8f3e9390ea7a2636cf8d39010e9b79a01906b86387b84019e3e13e6d93acf592b3f7188a560cdc0f927bc335016dcbf9680472b4ffa383a8663b3f49d96e38b7eed77a22ef57258ce3459ae37f687d57c0822374b3702df0e25c48d12dda477f71081d24e564fe565dd1a18e3b5a4865cdee547567034b62af1504d770b51d0cba46c7e1aeaf1278e70a7a9ca91a03793226faca4196d46776c85ce3de108765b039acdb7bdb1f60646345f511eb718ace56720074db28a21d857e200e71ea9d45a10a02310e42930c7e8fe77674df3b0e37ff5134442a05ceb090ac8b94115860355e4d030523a066f1944380a744a11e44eff575558d29a35b74fcea0a3587e7804118ab715b8381ddabc798faeeaf1b317f71d847e5e1fa510f9d4d8997df6c5ddff8d38da1126da02992076919925fc0f820e4d5819f206a6d80a11cc8e808586d9a6e52b4d98e863660d952ac1003d3d6eb78ff6cfe59adc2d570f3a63a1195da7ef6ba0e5a6015cf10ccf1c09753f0ce49b290ad09d7366ee3ac9c6461bcd0014fc7e337c74b6a3590a18f5c2ceca8fe861e530f04293dd6090cc15ba122dbd20ed9bdbca4b6ab778b097cb44bba10706ff88aba5a6ae01dce54fc97a3924db401a331fea74093951a89e14dbfd339b9f1ec64d88a617492ad584371ac10e0382448a026c63c7044b6b5c2d16918ad7ddc8c3b400e7f6fe371dbb4575a14923eee12709fab5daea7d86fb32e1c0e92267aa6f54bdf69faf5814d22626ba23b7a351fb8437e8d411369ee27a2aff99bba1e3b7877c83438fc469e35312a0caf4d33fe6fb7a88c01bffbb0a289c8daaa808e8b992179dca9274288267ccbadb5646b446990dd0edd1755df12b6afd3d46538dc3dd6d2d18bd3b4aa5c8404f28db9d6658174c5065c076ba295a9f9543f348f6c25b40abd39ac9969cc948a22456b312f8bb5f757350718c1520d3fd6a48e547900a05fe3c71ae06e864975760494c96f2ec7ed6073fe532bbf22eaaba3b4694378c5575b7cd9e47bebedf809a12645198027434231ba05b5f20b3dccbf1f84a94ecb584d934270f48a4892600302e76585d21b885ef59e420f2ea7f4c6d7a06426425541b57091a82c0f6efbc8480ebc20295205163e4b1935aa47525747e9d305472eec0f6ce7c6d8790dba6122693d021bf3f614db6c0db393fc8c20c38cd9a7d075fa9a77340a5232e382b82292863eb29c0e8e83b5484f8258a251431d0bb0b190c03f67c49ee01eee57e398b75ac5a4b9dab1e5b1723a4926fcf3865b75329deac911f5571d32ec2d99405b8971c418f3c5b2d6aa011243ff0355fc0feba0dc129fe86e749fb6489bf8d28210315ae0936cc58291d59ee1e49beb44a0d64391431df4287b17512ea3693c0f1dcd6f0fad1257b40bf697c9849a2c3ad55992ffae2f5905273249296ab518cb8ccc169054bb0ecc22610ff9f20cb2a1da14d768ef260e7ef0884861a1b677d95c72ff0ee62617e56a9c0945c0514154bcdf3761efa0648c2762a2c56a1e779011802e50d08074cac2b19a656c479f8ecb89c59d878adec662bc9c70b054a42c09759d83c0a6cc83c0ef12d6a5d3fdc73fe71307c76dd9646254f736aef9265eda9efa5c2e3b465f5be4276ffe719a77a54647f8b88b086067bddc1c99bf8d6d6a5de737c77a4d83f1c9f929130f7691055f13d520fda64b1d5a7675b2f887a717b4ef20a4bd2706ee1d90d4104aaa60b70e81430a3d0253fdf0d1c32a3536c7cc398da865173905ee6c0e616b845054d075c9208387ab6e64b53af60d756771e6ad2d3513534d8b14970514904c8d586c98423d1ed02d10a7c7d068159b6bcea6890319e075a529ff0871e9997870c032457deb83b1e5923240dd246deb5bdef2d64bdbec55e3b4f0a008eb2a351b0648b6090340595f7321c8ad4e29127a08393cb568623e60b41e7b339fe626fafb5a154248d34b26f649877403e8c7124d280b97e2adf569aefd94bfcc0393ba46e5f01d93844613b6683e976e67ee9a58693a80db216eb012d85267e8795445dbaf1390cf51b7c928b742b0fb872fbb12ef7277c7cb6f0d69eb37fea8c0586fec4f68e2a98e07bcb4089848c1a62eadd93542e0da984173eb0c98fe1e2622e68595ff6c3f44e03e048dccdfa9569d07944564259765a1a32101910bb7e1a51d56c505a5d4a7ed9f9209653b758230fdf64e307e455a556091c539fb78cec6b7a8d6865fadca4134aff2622a1ab27cc38c492de732ddfdcc0d90ea8c3a946a7d671fc21516fa116c74cb4343d9fb67e813817f2b688f1b88af313578558304e7c84d559d454c377049c1875c6f22120c190d46a50b1b8c43c1412a5a663ab252ba06121a31e7266d80d20a89bd5e422235295d833cb193129957c5c27bb84f0c95fb2f3e9c0d6290a997f6e17ce4200fb42ea89ad599029ffe8f9a1932911363884dda9ed77d8dc1769dc9aa994806106825e01c2e67bee81837538b1a910773b55536bb2b85b5319600dda497c2a1986c2548685d9634f0e0d546b2f1a4226f4f0904d99901ff8e176432055f001a6522d4386fff8dd66106de2b3344b651c199e12f83c1374b883daa73d423b9f0fd70b5a1d5d65ffdaff78722e9e5c6238c9d684d3a908120d142e97e9500b454e2f741883e07bed8796dd19e83423b8e74dcba05960a65788882c32d1f928e50d362c19f6299ca54e0f956e98c769d6dfd020b4f6f5cc7dfa95cf52d9c9459a417b4f700402b6d453a244ea2e36f3e25d6143abdd134a70707c7bbb7fdb365f55b3f14e6c0493fceee15e923e496f2a8911a550440b7737cb3c4f61e119f4a5d8f9c15a3a9c235414a88a948b3843ae49ce0b35d386a8218d62f60c3c5de0dc5ecae6ce36ad9a698239d2000d52c3b11e89ef89bc681af057194e4a29531bc8e15fa64fe94a11aa59b8ad2ddaf99b226945afdafb45fea2517a12be729097665a4cbe587b8ce74dea19b55c6408a853933f4ab5aac72200d5935489a8eac9d45590cdc0090535ef9e1694c45a09a5769671ac9889d051cb65d91eb017deda27fb553699753366a7a5eb654ea7ca6336abf14f3e3051bb2c416da27773d96c48efece519482e4008228d1a10e234421305bea0228615e928ff98de4c929ca779d49c350d1018d88749f2e0f9161c56064f20b79a7276e4cd1539743e5033c320dc9ef0c3d5419520488dda7d7bb2c9da81314e01cc3c9bd90eb90c008023da6ec578d89781591ab190ad807a9cd2fc7ce4dd63360a05b06d77ddc462af68fe97182c10addb9da1e50c2789270c428145df86893286c0a9c7a98dac77c78d5253191f4ff3d7ff7364e701474d0fc273d36525861c7fd1ffb8f5420903d3a662c48d9394704e82840c850ad69d9f9a02ddefa682faf4a98736f80fb8ca721c57d62ea8a09fe7b7fe87ad7bf8d65fb9947ed6ea56d608ddd9dec3aece89e0301de9808e56e4fcd3e7a2cf900f9bf414a583a653dd907723939ca62e95869fd60141f2c7b6c5acb8e597358846d80fd722c483d8ba5164c4c0ddec516c0def803946025c23a88e2b4b9249c6c1544c4c829e853681b600a1a7ca1487835c523038e7ee847a7c0db4dad6309e5acf157352a5d58eb830ee90ad34fd8dc41f37c05ab25bfeee3e72abf89863db83ae58ecae63b8f9651dc4f848cb68384eb4692b0946876b63911b807470ff866287bf8da14d0d1ba5f7bd46c2bbbca241b44af51b89ba869570f17f21352a0d6d84302eadc9fe7dcb5032518debcede7463bd4a1e96dbfc66538a0acd7600f834d351ea04bc7593b640130209a50651b2dfa37957958a06ea42c3a330b967a1ee678f7a236f81204e92b1fd6b639f32f822349c457e666f913f6ec1a529232e55142c0fc4f3d0ae0165b891322b737af444b473640e9f48fae32481771b4414b0c9a93d259cc329fc8ac4e6029168b4b97e7a603474ad305bbd8b73d19e6e2f7415fa49950741fadad0d58db35640ea093de94b07eb3dc4f1d0b02fe57ef1263b53fdf5ed5e8844416a038014124c58c25e22588bff34126062ed7ff8c4d1578469b91a4246f48c8fa619cc11938668e0c335385fd36f0906335999e38cc24354d7b61e5db08a3577a077e0beaa07ccc88740a7a2a0458fa9b77b409cf76768c18e62a5dd7172c3cfe69247fc5450128fd1afc61bd4f7f260dae24bd0beb91211198ad5edda17a69d12ca707a0e37100afbf59ceab8a5b3492946c110b4c2517ac15f116a6fb0565aa8b21dc87524e0fa77cc005483a8d5ca7b04668f1b41c5a4c0d8ec31b9d4674c4c82cd5a570428feaa2a854450b17025d765732fd9b75ba163c10f8fedeb3c44bb4746465245b331451807ce305667436f22be0830c6fa98d31206c161281984c0e7bc58de83e8f44bb2a301a9d135a510b141e3ae3f5cf94225e2add6288c3469586e9d45853f3ae4ac49bb536ffcb1d365268e431fd0705c9a6194724beb4b771752a65ce75e2436a47283cd23036c4de85daf57f09af015c9fea49990b56e91b9d5bb4076a07aff0c7f96aace05e810437aab950a71408d806192d288f01f46818c0eb37db9c051d8754acc0323e7ae1f6b0e22a1ee90b163edf68545fc583009a66cd7d31f5a13f5307be2022b33a7c67742b85ad5d944b8544ee821ee947e8c13a229b0b98418d060099beb3dc8f1a7ed02e0849506cec2b942a78da9cfe59e0e760618a95ab18a5480b2b7a81fe58c6c9eebe3793f1424c2d1b4af8f04315699e7d9786ccbc32b04f3adb2ccee77adedb48fcfb237587e7d5007a5c9a57147a43d686932a6023477a23db6f59f8dfc41ba145862b5c6b545d1c211e0258349b6a919183b40dca891aca397ee2455249b801d79f943ff815fd2a23fc0dfff1fb2f13bf3433d75ad9346940323889f20083a5d40d69b83b010835832e7276e8d74826e15de3281c74c33c14a30a755eb836eca84f201f619a66875a03c5ee1df766129a8f47666d4c41b1021b611d19f38824fd1a235dc7d17e471c94afdcf3ebc7f92755a44b753dd48c57e4162aae88e4191908c076ba0fbd7f158420c4a151f499aeab21af06b0477d2bdeccf414d37402f1728369162cf4a1a68b4c20810a8e773a31b12a528f269034272cd619b015266f29dd0d5f5194751509b103c4fe86bfd007817a7e8f2e2eca96cbc2113be75beb10088ea7fa37e67750f58d1f606be96c26b31abd4535dde4c73ee6da0b2413e034c3ca07c88a9630a998f17f67fef22614412e91e5b231c96420f13980008088203dad2169b626a151a572564e4dba19fd401da95b9ea7c30a3fcd7588c29184577331a9ca948d7bda475cef0942aac924a49c40b22c1474550eb13728143815c5606b4c85789cfac1f91cc10d575ff4b409970bc92467e9749cb008bd5f52f4d00bea84090663b5bbed9962de326578ae9b87b3f5af8243ed62295ab293ac2a6758b6b891f075f9c5b3e58b2d23558e675daa106081ba9d5655d9220a4ecb8a591f64e887b43775fe687aa372fcda0afe60ac8c8fe29c22cbf71c95edeea6f3f8fdfc7c4824f5fbeec0c89043ea2e5e44659ee8bce57d1db8891eb1a287f42a504d03e1c26009ad8e9792c5d3f4dc323b7060e75a4b2f85650b649337ed7da48e14c9d7140df45c9ce63dbc158725e3c3d4e6cfe6b746e1327c7eb05265e8c2d6ae9e5f967076c96dad1d82652b1780713b538c81698a271f4b2e4fa935257b45c7c45600481056a6ed2dc426386c581f41229a366f9f0a1651b18dfbf038d7f6f59623bdab25ab845ac98c15819bb743785634e09e5395bff3bd4c38109e3bf6a4097d9f33e38cbad79c8b65cd37fefc6a61be32640e3b24e942ddb7d966fc60fb8deef1b092fe722e3787bf6d486653a0cd04e33dbd9d480d3b725bc541fe23ce5c53ea00dc502af5bd804463f496daa2a93cf74676b369549f9843e4db2625a06b7ede86fb1151378183077aafa482eba8c0ce4735647bd4a6ca3c8ad1102e2b35bbf1776a89302e037ce37d431b477982a6786052a5d819603cea940a97a62fd294b2c466981d4a15ae5644535ee5acfdca492f24006fa04807783b4b1de09fa0e0aa3104cd8484c6e21d467b516075f6a5b5ed4640098df4ef217de03c5d2ddccf4252d83acc304683dcae0f923e24c0ff12bba81f4b99cd05b0bec84262358620c7e1dfca43f6733c1f0508380609a6561066db0e05c0201f8b7454ea4df46d5840a7459918176669f09b8d8859bfd50f9a9f06d7acc7656d7ad9d9dc38ad22e164f47dc17c64c20a3af57d6042c78b548351406322b73d84cc05910927b6499fdb58449017383e2c549020f66231934f195f7888efe837830052ec231b2b3b7cf9f1b157bb9d5333b7320a8be269718311f6fa031ced330069300dc01187bc3529b1e7353c79273f38ed20c46394009c0c77c4ca15062151cf874af74d69775df6d68b424582b43dc61a4bb2390865b90ebe5600f2c31083731e2270a176d93038f5f1ce386b1a7106fe842592b46a54c7c88503730334f8590b1efd4b817fb6410e08bcfb3c50d7834e7c0330be4d88bae799b53e919601cfdd622708fc275e505c4bb7a7a0af8f9ff6437359faf50a3cb0df1c509ffdb6c954782c17c5f4b988b981c68b4dd4fc9594c389df1a28ea660d4e33c0be82479fea34658bd64f455ca00ef7363c7a2110d7bab6f2587b2efa2552d86e19d398fa14cadc218cb83a531ddbef50eb079a50a4a354be8f05c39f44b5ded9e6ce3bec4cfde8c6c69bc5451c7cbcce69a478d904be02565737bd3922c65baa12f1f564722fdbb50b346c34153513a622fb041e48a8d79819bfe779a3d7f0ba04e4ec9f9ddf3950b5f0065781f626b8f14daa04d9b61623952f8eb7bf3043c2056b6bd798e15ef1e3bc3bb3108486a9faabf48930e9bb8c6ad261539b7812c2d600acafdfe3b98c06ace4d1870c1f0381e5f41d44d243d30edb3f3098320f273cb3664efb858a24d275c98c6067f4e6685f10d5729c79d6284ddcdcf37072c8de4ab83dd35d6fc47beeef3143bacc27be3b9e5c6c238f125c90b0e64dcb4b269b20407cb34322f697077dc3af559de06c760ce06a87319b123b36cce42992bc5e87693673b0c262af2efd248689071e5edb45c0af0e6cb0ef907be0415cb039c1b703b8b84f857944b170ef85094090275518056a398dfddcff8b210f6a505c2a41103a21c555ecff481f6ca9ee978705e54c72f50e52cf0379c24501aca2c3df95b1771ee9867ae24e11faba13196d723ae9c24c1629f69d0dfb8d15fe41264632eeb0ef05c6b0433d7463dafa5b68338e4a1464caadf0cbead0cbb7efee0164d36b1475381801c6084a4c1345f3a56f1eccefc40ad219f02e2a263ff35ed5f011f994de8cd5af2e31d2161dff8843cf9954818795da3f161054f7c537728e65fcbca703f4a5dc8b3a8684af7210f1ba31ba91e652411e0a66e7151edc16af02bed577faccc398771ba9e397b998145571c3d0fd94f231dfdbfd9f46a7488767178c7338df3e0bc9629e3be0acfe87217276ce88ae1bf3023ec20ce6edc1604efba6470e2e54eba518e6a9955edad3c1918209ff3903a46cd044484b2b48a8fa36a9cb3f231692db75d795755bc879f073c9bb634f8ea91a6e9062a42706446d0fdc5df4e41d6f6c093114df2f59bf54d4561110d91f41473d069f287902782a01e48e698ad06c27581fbf6ecd5fb96ed9a3db0ff4844b80ff3988959500ec486fd1566ba9945b5c66a8458aea8f5c2614efecf54816498b2c1ea83d3889121e8f5b8cef16a978249c717e1bbb250d6eff6724789a19ec1e89961d98751cec963dba86af60839a587af6b4f84e2c433e509c87423eb941dc3745ad791191ab2a80ab0df2d0d244e20b7b430cf8efbfc2c0667065fa6a8b290702e090411c9beaa7b0184c07f2e8610baa841339b224f6e80525204be402cf66f7a204d22f002c0be4c2cf0a3c09a7f2348ed3f601338d01a9e366402039fbe704208697412e901fc2909e7310aa0c786e1cc27a907a729c2abe9c5039de2cabf75e49742d7850bc61f435f1a29cf57bbd68ded601f34716af6b9f05b6277c0799cdc6fe0e0954e814907eb14c98944c3adcfc4142b14ce5c0a06cd29bf6602a484300638c58afca5882b9267694ce92574b904b8846aea0d97043ba61676ff43224480f579381726fd59b6691439c5b24eab7eb027f0e00e007571e10fb7b89aa4ae460af869a8d563713970748961f240d41d55b8a30f972a2f060b3187c2fd1492b6495f691248dd956333e173eb0147c767e7aea0bef5d146a57a3b0a57626d4b3d590d33ade2ec563df8e775a0bd00dd2d3eb58b438bb32bf755e1c83aa9803212f69348a57cf6a19bdfb13ae790aa0ec9c0b06894491a7e39bc0cc6f227fb91ba49b6965e58915edebd62f5ceda6f0b1ac00b5fc43ba9f112fcdc8712d6fe6b92ab2243cbf4d9d7c6d62e1f3d8011a48adebc620b12072518d03d27f7f100e4560269f8bcd76d51b1ca4e5f2c2041cc2372365fe1f9c3a9ebab2f97b8004bbc084edd97603e4c1ffeaef623205016d8c009111f595204013f9653903bccf59c21afa653a56b250b40d076a06bd58636a737882a89078a856383819e1e0e674c92e11c0c345f5629b322c9bace8de812aa277240163e8035cf777660ed7038e7dd31910b62b5b73d4e9a13aa3362812bb4f6303e1430eb6e34f08710692f9cf7661c46fa82509380994e6a8809468eb74984312aa0397342f2445e59af558642594e79f9242bc062c989f92ade3bbff1f1bc93964a32541b5decce94c06aff36adaaee3e1b8d15d34ace774a59692bb4e5c9fa929891744c1b933f7431f678d1a8d1ef76cbb6383dcd605d52c64d7d416ea18dd34ade365dcc1cac1c04818b14d6d5b5d6a6f86a4565b346a7baa45ed8d89c3e39d7c80d53c0adb3d9082aa86dd5fee826d4a98b284030aafac82cc68ee27da74957d8095b5e1d9bd89d673c625306113b980b38afc0db357922ff7a5d929e9a7f6ffa61749bfad0367a2c55b68f3c43970c0eb93c31cf304dc38948ca6348b5069a9630ac5aaf89ce73a535d73e9f857f21ce9160351f939cbeecd9c2e14c8dcd6bc8176979f4176158332245dbe692b31a2101415af70e6b3160a9f762d485f1d615d0130c923331f1fde731bd2b4e9b72860b24415b2c8af17144a795c233fe623cb530a2580b03d8d2e19a5345e20c1648fbaeddb00bde2f04f4ae7acc1309ddac8e3dd40ddac24f0fae668b0aeba8b650076f68f33205ea0ca43ef839d8dd7d4705802d554e03eb4d4ca30fe247113b01a090d998cfabb453a69b44cbc38842ed78c54e900ee10944ac4c568380700066bbe7922c73aac462d255069884357fc538823df05ca8040ee6224417827e42e75fd9fa63194442c806d84837b3cb98fc4a8fca624245f9ec6ed96d1749a7adfc386d8f8df6035363a9fe1a1226df880ae63286e07b78c7d283954253ab7b90f379eac8aab74abdda146e8552b5bb1317f6563dd6f2434cda1ad4219d21d8ed0b823fb2c29dbab542c80459dc05df77740d23c5548e2d6ddd8dab711abf28cdaf21c596e0f560e13c5c59f1794a4c7c874d634d42abd2d726fb8dab569b8303371b172f5d5faef99e924bfbc9518009a882690287a05afa8f095471355c228316dc00b4a02b4cc7069b8b0556f2154e7f90a75938d767139561c158aa7b04a5bead15102d335f3936a4188429865fa35a6b18a4daa25bc415bd0e4d762e9d497df106b3aa812753cc72d49beecb19c48d052288a4f9dc0adfbbae6f2acf60f49c6c86965e5d5d70f1bdac346e009622394e47596e5954bc76ec8e61ed6843364ab9587f9e378c88328e1a2a1233b2ba4f6eb8d9db8ee72ee88e231cbcebc10b8980cab232ead62f0a36f4ce6b32e23c234b20287fae93af070900c1746913f5a1615661a438a3f0c5e0140014f19c2de28f93dd90f21e7bfad9385da22e2925dedfeeb5e997142ea7553b225c61f90fcf2e0d7c9f6cb212b36b1d71889942e736187607a6d12e1490bd1cc6a1df0c7ffa46004bc5d8f4c4c8a436a0ad3ef97115feb22e6083d9cc605a5af7503389f0371cee42f41730d7f696c43f35a094ad4571edd9a5355b8a94a71d1e135b8c89d673169f987e8988c623d62ce1aac489b35b1de69afa9ee26cf55ff86330ff636d8c43b451ae37a9391dc00c3a6dc8f11e50d9633bac86c5b695696c9a42b066f998149e1e3967f437f0659adb4fed03ba449fbf9937f2050ee9c4e535ffdb151030b27928bfa3f12d0a278430db6e9f74bcf1c6c9d808dcd26eae2901d1d3fd35a790b065af4c80655f6f90944d7937a0377d4fa7bd859b87dfc158298814456b232d1f41ad0dd910db4aaf07805d0390f919e979d349577429957de2b1e78a9e20bcb6002767000baf441a045f208257bf97d07af50aa9f606ed5a2d2217fcc00e41cfccae0dc1ca3db338e5783fe6b540dab97263d122bc453e0c72e6789b31f9517c9c2c507167057cff2c430a0e26f33399997e1d3d82aa5eb3e6cee1e0959ea27dba0fd49590a2c551a3fd39970f156a43f5db106ce60dbc06f521032a0a17a73c56c5980395c8a39fd63d751f212b5caee22f79850cbbf4b3b6f51a6baceb82a5b397b8acbcf161baabc9e4ce8ecf9a4ce033afba29159409ad9241d4dd8a615a51da94bed885d6a3a34dbb0724d5e665a5bb1f1352072aed8b34a0dc0e163333d036b53b274c328778a742301e8c167571ead1d00aeab2ac6fb63131db3feb6b5d6486b641342f6268410b2f7de7b07b008dd08b6089c0ce7dab72e07074f4c46cba1fdbe6ac768aced23204bbc3f98af3448ac3104534a77501baba5c2790357e8a74c436d3240a5f33b0db5b9a1364d5816e757e7d7e71f967bce85ecb55bdbb580e4ab37ad7cf5a66df9c5ac7d66bfe16c7b4b97ebdf598ed96e63794cd4b6ace5daad15613bea370dc33255fbeb0d5ce9fb5c3796968de51b9e6139866740d7682e4b86417f0f71a04fc7c37157e757e7ea5c97bd965d57e7ba2e7b69bf1ae7c21cce75ef75ef75fafbeabad7d584655996655996a5d9adb39734d4a62dcba236990669ec1abea1365db1f577eb36d5652dc906ae501b6ad34f069010b452b8753e8bfe613b8868ea93f52afa2b8e28fa8912716540a3041d0e7450cb3ff784ce92fd661d76db69f73e147279115dd3eeb31d1c6b2d8665389add2e6a79cdbaad2567dfb0c57e9f759988ce3e6140d86b1b16d55f9c453b38dfee359c4515cb3411ad655bcb6f97efb18b49b3b76b2ddff04ccb2b9e0971eeb52e672da0dbd0df593cf7119309e1194720fc8fc7a3691cc769b7af96b3d9bde5b4dfcc5eb39d4ea763adb5d69640d3b45b6fa67599081b30ced138783b8cee45187b6bb16bd9bdf73e266610db71efddae8cf60dcbdbc5b657e62c11f3409c64a69920f7aaa216a54dc3f1a0e1e2173e0290bdc5f2177a07dbae7df33cd3b46395e56e65b9cfef1131daa37ddb9e7599eb2ccb38d80720edd97e7fbf3de3fee932e7eff59eade36adece6dcf3cd7260c88ec97cbb7378efbc59986d38c00d21c9c8118cde14cd3f799a6b56bcf1c4ebb47c3345c73f51c9ea9f7e019ecdaedf28669b8ae19ce345c631d0d63b1a7d7700e753ad6dacc6acf36ed99d5b62c038140a02ccbb22c1b8176d89aa671cd7deb324d6f17e7dbf7d93dd9effd7c70ae3ac3b9f3ed1e0fcef6dc6324d7bd6fddf44e9769b8d66ecfd1344dcb340d67bfdd7679bfe1ccf58d7d351946b85563cf5cd3701c0d0dd747c050c48c60a50bd0af5482255db53b519f26227ace37bb76d5e4039016599f3985297e31bf93268c8942802202d890c9165d9d04539a00fd4a24b0e95ab91619595c92ec6c04905c75e821eca07fde32c3b9ad9caef3adbbf01c12d434e72c574a23a0d2970f2969292526d3f9c5b9c7ed23449dfd7ec276d873b4735edc441af6014867338e38f77174cf79a7cbdadf7dc03e594ec7f9c31e001b7b4ce47cfb04a273cbf98401b1fd6acf5573342cf201486bbff5f7d608205d710662b456afd56baff51ad6fee2a8e24c445f22dade9e93b54f9c534c076cecb6cbf61d2c038b6b31760e9ec15ef10ccb39a4d99c5f0cbf380a7d63f97b4b97677f2eb11fe0398f980c0b9e7114c2a7e7e00cc22f8e3e9f71f4b9405c9c617b80f0dcf2741989b65eb7d7ad93916d1d88ccf92644db1db32d20f23de79b07e70eb465ad1db2ad7b0e116d71a627c9b6f28ca3ed17bf38e230777ac971f7db863349b6b5bd9381c525c9b64ebffdea48b02dd26ceb39ea470457f403ec8b676ac42219f87bf88bf3d5b55482246d43bf1209bce899faea95535f554e97c1d208a274f56a7106d2b7cb44b8d810fd6638577dafdda57b1166bbdf2eea5e84d9b0df4f4c2636e79c5738d7731e133388f900e4613d707086cd7976adebfc76f65b27357bcdfe6ed7dec1db6324a78bbd75d99e7a3c47c76b11e733dbef39dbef373ce308fbc5d8357ce34826768667eae1b3c5a4d915577fbf6d75afdffbc470d01ed4175f7c71a54952c6d33014b32bea8b41e695524e729292ce39e59453ce49279d724e3ae99473d249a79c934e3aa59c723e34e5e794724e396708cbc0e242221dff847c8d7172211f956839a750d9c28a74f2440b264b5a3e2945cb237124dfc37148912612616ce6df9390c8a3714817cd11e978646aa2d44494214d9eb8f2441428022b4f0c51c1138f902a2a50a20226350821a2029b9b2bd8d253ca8542f024daf0dcac1e26aff06c31ab6e49842188d75eabaaa2d5b16714cdb0aa7a55853a0885524a29b59834a94e2b4a2badaaaed1eab24e69762dfbf59a75ef57471d62d6ad4a25d334ed395e6b58743fa351bf55750cbb9d56651866af8982544545998af078e870c03459c0c9132da250a184c9929b39a30586201131a53ef12eb67134a7684ea2897fa0ed238e249672424a29a4d246c00118ac2abd5e51143d453f435d22ca1242923a5f1716517c2128a532230ca5ac57224aa58f38aa37373f2a94c636bc10f14faa2794268ee22d104733c9ad784618f9c7c521f2bb8c40a50a8dece55cfeb25151e7dfcb4d102e1a32a15f2904455e556dbc89a308a588a323f3471cc51a38040691161882444474000482e011470988231c7888a3181a456ec6a49c7046f892dc8ce2e848b4ec18fd8b01c585a797f4529262432ca2190e2b7233c240111441fc03a5584451188eeac4a5b13d5f44125b54469fd1cf53202d3b084f51d2fe61105a495524daa976aa5592c6106efcb990a4f422f909484f14cb078403e2e85df4039d107837d8387a50c9f68425874da57fa0d707b42fbef8e28b1d382f42fb269fbd6edd6badf394e17ebaf537bd723a25385fe23b70f00cee7d76ef611547d95619b6717445d5ad3f1358e95732814dd3e8576a820a5da3ad3ad13dec7b4e27bad8861da6298e463d75b0b5ee35c4b40d8b2a1f71643dc3daa8a7fbecda696c571fc1514fd9bdbff7d671288ea6df0e4271c2c4cda125499cf474b80432a95c3e6b767816ce30c8fd9c7e5fa70075807def2586e3562af088bdd3749758a3c61adaa720f555ebde6b571d6257c470540dde7befbdaf7eafaccba4cebe752f8eac9126817456a70067cc695993f5325954ea542f7779ca70e7a516dd55315ad785b0c010b1463dbded1e86e3aaba1caf61ad15c25334a18ac24ff92ea3a6c7017609e081de061a3762e8cf451252ac318adc1ee6332976164dd33b9c6e2b055c2bab8a840bfb89a8d889a8479df6f48a7a5df4ecf7697aa70935756ac63b93984a4b3c29294145576dfebde0aaf394c13af57923605727aef5eaf634b6eb653b0bff40dbba85b9387a9781c59da82ec76b6a5e94e5833e27378724157a840375b1819a4c2851e4a626054f60be08246a3f83e10c4fb11db6e1a10d45713602485bd76e338a3d0cb33e390175786d3f311c76de4cdad5d49506faca1ce8ebfac364685fb365ea0423c260522a424584624df86e70d2356da48a7eb75e0e9d1058bda6a6c6036fa2e8e5e2084e17f4bca54bf49c93762f731ab941c9080e3a1a31415ffd4a4682482e5e666c1997255fa8f2e2844f0d2a39e13109b6c433c3e8848997a851e895b4fb8c22091353144964948302288cc4e089223da0f2bc68c217a0cca00b49684195284a305921003dbfb0a28209c5142029a1f881270a2ac8c6414a288a9420863ee515ecce391f13473ae673f04075a1389a73ce5751e839e7841f0acd39e79ca12969bc5f290a2cda06f6a6c25bfd4a51248111c6286ea67ea5284a508a22891959acc829a7144fbf12143f284131051445e83491e0be121443d0d0b9c24a45ae34174779f674656112411128f1c1521126464a4556f058504489defa955660838197ce2f4d730302f27de240c348cb4f59c9d3c041ca9858c1a657fe529e060e4df147c924576003d6d810ce342f1f1bd8d9bde09986982a342105095c30411228a5224fbc27566070062bd4c00455ba08451b7387978a1029428df5148bf71e0c7c8b0eee7bef1d3f5f84d2c411cf95fb3adbd0d361bf924d94ce978a3be667e236c5f4a94311a43963cfbf083f495d11f0a21747ddeb13dc7c595e0e229978eb455cb7af9f30979703f6e95cac3173dd108c9743f61e48c47703ec013bfe76ed62f4d565fdae5d03faea6ae81a9b7c21aded604dd70e62d157c780165518b688c2b367d3d841ad2d32b0b82478adcaa48867f08340483c33130f2710335317176268821def11cfbcc7c3535956599a85af8e26d3de8ef88767e25ff53a69a5799e9a99fedafab46d2b6c76d527fc343b7bae300da9e34c8f1fd7c434b2e31f56a78a696cbef094ba269e79a7b48ab7aadb55b02926131b56d56f476997e3e9e7e9df74a58d87b1bce261177f759986d44fcebcbf5ccdb7c8c8e2d2d87ea740c4bfd7164d2c13ff1e82472e2e6c156b90dab21465bb1947f533d7abd7ebd5af212e187fc002cbbaae236268b71c0e8dad2a1289c6d25816589665599665599b6559d687f5f12c089410f4ef519cabeac2f9be0b41a231240a03233524ba08747b96ce764d6be9f13ea265bba63dcbb2ec9f2e737f079da375daa609d15a55ddcb714ea25988bedf32a781be7579d340d7f00ce81c3cd3c275244aa22da21d961651c8b2b08442a150a8d65a8d5c88deb20ce7189e8b738c1a6a8001c3c545246a696161098540a0cfc7e3e1b84e87c3d9b67b352dcb30ccda5aafcbb24020ecf9a77bef06cf33d5d945cfb46f4884f3d4d959ded2bd77030bce53df7feedfd3e1bd19219c67df7783a786e7d9bda77b6f44a2ff9fdfb8baef424cae646d541445a2e6842191682c8df00b5058d67589ea6da7dd1b7279c1ae551adbe96051c544ef882aa943ea90482451a5b1bd5d137dc3332216dbf79a6d9165f9b0843ca0cfc7e3f1783c1cc7715058966559966559965483f30ea77b716433cbdaacb56d376bad7743360db5a2a85a2945294a7d9214fd857365b9846c104d4ff312c48b7cf215542cb7eaad63a1b7dc8ab2733ed7ba8d9b3edf383b3cefbc5455be9d439ddf1a167db08c07bf38e2bca3dd83baccb9a1776ee86a41f4fd8401a17de3702ee7f97d3be764df3a98134410bd9d7343a15f3c137a07cf70bf2f39c3342f1dc22f8eb097e6fe2eb21c565bacadb5d66dabdbc6c2c2c2b26ddbb66d2be874cee9f24b739e753988ce3cf7746fcdc5a53750a8b57b42996b6ddb42f87350e7e93617eed93d77d1707ecfbae9a539dbc6f9d6e597de38dbf642f3f29e04f1c2c48c7452f847fc11a1115400e23c74ced362afe1dc63f61130fae3f101487fb06fdf8efd7ec3ba1747d572381e1f8034961901a4379c81188de18ce3e1705a385c4b87e33a9d4ea7a302ec8d8de1d6b05e3c455911dbf12296e3ba86e8eb154df3e80b67eaaf62a72c8b5568e5a817ceb7ad8a8693d28914d82996b242bfae96b7b0fc9375aebdf3fbdae940bfdd06fae6f9f688edd0dee9fcde7b7f5fb96ebb87eb3a3d703ab9f3774fa7e3b8df4f8e7b06fad479ae9acbb7b9ceb9d74eb779dee9346c046ccf5f6bdf663cb887cc8ba31e38f7fcf5b683d3c11eaecb1d0e0361e7f00c760f9ec9cebdd3d16858cb6ff677d187cb5a583e9f6dbbec66b95f8dfbb5db396dbba15028b4d93a3f29b822d89d6f78c6de7a768ac9d8edf09bddba19dbf1e00ca43dd7baccb576aecb347dbbbb2e20d0e7dc3977e9369cb1bf73ddf44fe7d83ddd11b03b8f1293e9dcc23188defef86222f517133b5d7ced745a47fbedb8733acfb72e73bdbd4a4c26c7f5741193b9e76e077ba5bdd3c5ae1293e1fc6139362e8eb2474ce6e2ec1a9eb118a6e1da62abbb9d4719070d8a395fe3dc41e1d9c94f14fe117d440805059675717ed987b8b7d4eef3db6959764ef364af751efb86e187fdd3e5edef3ed87b1e13319beb317c3f3fcf5ebb49e47986b368c7762cf36099edf58fd65e372cfb27c3a4d8983d8667ec3d78863b29574c8a6d2f977139d4e970389cec35e36435e3542d038140204dd3344d4301b65676f82cb32ccbb2300c887dc470f488adc5c6ce3deb72957df4fd7c709e9d7dbba78b9d8d90d839effcdd6f96eb7a501cceb1ee758783332952cbea3088edc0a64cf60dc7c81b1bbb66316cbd5bfdf0a249108b6227fd0575b0a718a6f431fb9c32f4f5599783d2f4f43a444f38577f10eb60cb1eaa5397a188a05d264df0823368f569fec2958cf5e955974366ca319d9a38d3bcb98213783edc4307b55ca49db37557a6feeee05c3302b6bdb665228b4545746eb55770c6bdbd76dbc96419b6b693b1cfecb317479af6da65fb771f384dfbf6d9426acd6251764e76fb3b93615111f59ccb3c3823ffe8fb076770fe2a8783399c4e267be7b5cb91bd93753029bbd96adc395de668bf9f9fd80eee1a9ee19ee1191acbc134b6b90d671adb2d7f17815a3e20d0e7f3f96cd738dbb5cfc6d1348fc7e3d1344dd3b4136c87bd6dd93b9daa63a4466339db566dafb60d623960cbc86dc319f6f64ceb24262aa2f37b194efb3dd7f590f576325c0eee6a9d2ec7bdb5b13519d9d9375111dbb5cb547006760e7e70460e10092d7f75af9fb484522428623ce4173f94226d5435a0ce106750ff31b1524ad207435dbaa4c0d3d4a909cc9ae3176126a8444d1cc9f31047f213df906f71c2cd504acbc3293555628d2d628d4c03ca29751ca1e2c1bc2a1ecceb0933b1d171c4c983799de14d0d050223e22244d007eef4116ba0e1e55083bb28319932e19239ef0dfda35195e1121dd0a22879206dbbfcb69794ec48b42fea1675b9389a8f4a5c90cdcd70c912497154b285fa5eaa129112c9477c6ace88490a76f6dd403f754b543b6c4d3b4d8f3d05d07fa8706708c70351e1121910e43b50f845981d402099a82f8708b917baa11f00fac168d99c67a2acf8f76e989fba69e39b31e79fb4e19973f6a4a32b468ed11409764465718580acaae7694923e6de0df2be917cd5d957bdf94652d2f4bcb68ab8c78f9e7f188e0004e288cac7bfa0be5852c245c90635a5294f3e4f3e43a0c1421257a670c114514a408710e1022174010c53a2502386181f4fe325fd8b2d6fa89c5415c2a5cff38da6391bc7a4e8f4c5175f7cd1d3346574427d714ef5d65ec7307ae714f4d2e29043c4915585a6d70ac33151d39dd317e644371eb39af595c270544ae7bc756be77cb5d534b5604e3aabd0e9f114758384144e25c849527a6392d39ce67cefbdf7e87bf3c91f9c9a66171fa5a7ae08d8d4a9575da45e5355931138e9374d737296b396ea01a546b812e99defdaa494345249a5947146196394f10834ce18a50c228eaac75ba7fea6c7d36b9a8feaa494524a2752ca28df7c51c6189f7cd311e6a4265a55d50c6550e8a4949a14a526a5739a74ce4f483851a880516e1163947ff14126734e8afadc28a594a2e89c9356749a74ce49e711a6890a8d1242086b053251135228e18432ca9c5397e3f544c591945bcf49c6b67642e8c44e0921847036843680559b8f9f9d11b02710b8c5f888c168630d6cc61821845c7d4f3e18e183efbdf75e7c5008395e3ea574e3f17c4394d218294adf7b2fc770f2de7befe518efbdf7de7bef139cac7802155032101b6bcc470515d1c6576dd59c739aa016fd4a533069f9dbaf340515eda434832afd4a5430294d41844a21d1d7d4d490e8e707b32316fd00f18ca3cb27dc8835353535a428e50738402613937342f82982d82283c98587f108ceaa80f4a09aca484ccbe2f1e2d2c5eed3e4ce471b3f8858e23b40211001f0f3f6076e1a3b198f4467204dee7bd30537ddf52b49c1c5112f32d798e501219e10bf2999c06ac18f0faec43e3db833d469e777fdcb489e06ec349cad07675c3ce208fe306324c55917ea5c422eb1c6f4266532e98ba31ef20bfbb9e24e879dffe9c1859dff32ba2e4f23013874869da11038230329495145ca9214535a4a2804bbf0fc0e8a33104a67bee88bc4a085c5e9b483c910261367890376d3344df44c268603d2898794b5a1908e471cc9bf0923d99e6daf967ad5a6299468967e251958e92a2d3d328bc89b48a429e60183404bb33dc514eb01f6ac2edfa98d6ac7e0332c3bbdc454be344cc9cfc6f04c952da6684f15cf54c72a3c234f1bc31167208deda02df1d543ad70b63d4dafddf629465669abdbe590e5bceaa8df8e83314e37234c55dd635d7d85580fd42b7bb9501cd51f180a813324c53d64cf87840482450c0d75ce3993a7cb2331a7395f7bc88e8919ad2c5b6badd64971e6fa7b58add65ab53e2662d775ea62b7cfda312bc70d6bc9198b17676bc55f14ce0db538414106527a00fd4a32a04206451a36d1af1483205db5272f8a7f758273827382738273ba9941a2a7675dd79ca679526c6a5179f6564121daaf2ccb32ad9bc1fe1aded77a5d9af6646748f40c3c96c5cd9cdf963c6776ae25b655fd5edcc1a4d8d9330793625f38d33e8f75b6f685b355610e0a813328460202b9919a01122f223d2976922a920c49d2451fa05f2989931881fcc0e8b1782c62947a0fd943cd0fe7394dd83b3661efd8846113f68ee11839c5cb6e66ca9e0ea7494e973652367c7dc6fefee8310ceb6464715b646481bd853ec76986a44d384f99d661facbaa1e67b1485101832b3078d255ab339e141b49921640bf1212245b3402fa9590cc4751ef3ca8275b527ffdba49bd3cdbfa7b86981427ca4edbf3f498eb2b182ca3d9624c923dc9aacb17ce6f4a8e0c6446e2f86861526c1967e02719f88962fb436d197116e90e300a32f9db5e6bd5309c022f0ac372609f9f5410c8e4c2efea300adfbe20f5799d07d5d59168ea8a3caecbcfe17b4809e32b6a87c43976d591a270f59a49125213cfc457a70ee4c7454d4d1ddecc6e461e8986543dc583fa8436f0f24c137bae7e5d38c321bf30a4320c9362574c8a4d5d17bea08c98143b831f3c211655b5cacc5f8741a00ef01784f9f3e9190ed1b01cd8219ee949cdfcc120cc417d66e20c2d45c163b54226748a10c24ac220d8af4f1dbce7bed369cf3a7beaf5766dcf2488c16342324992e48c9549aff08278e28ada0e3b6cc322ead3612765ceeab5ee7533c3f94de9c90a8142e08ce9f53cea90cba2535b96655150c8063969700194161c916248d3e85772c1946e818d112daeb4ed187fd213062518d4f40ba2f4a85fe90549baf4022a5d1b9edeeaafab95b7351286c21833ec87ab2186e568b9fcb45e5b363716c31171585808f9a8b43cf4f1bc5321c6e2b48197a4887533da9168e872abcb5dc6ac6351ba60b71e13238cb1437b0c9c63538f89b0cbf3065688a1c433d4b5c71c713e901f48743cb47207bae194a2f374529c6939121dbb2c5b36f60a2fe32cd299147bc8ce70478edde232619685f3bce9e9a4d8d1b22c4b524b524b520b831d2b472a16b5ac4709bb0cfbf37c3df11686118bb44b215840dd338e732064e0e30e1b225087784bc6c4185b3a0dcb11e311cfc4b73cc3760801e3451ba277f8b1066961568c5b2b3e460d3070661d44a22cf54953ad4d548c4d75b1e35b88b41cfbd4c5bb74f6b09bea5bbad7a22edf268e261a12869e05e72a847305c2f97e70be19ce210f8d3707e7516f388feea5aec73b735d27a00ed3845d462b3d45da1a9ec14eddba855595750faf5f2caa4e1d63003c1f3f87643cdf970300439b97aa92712f7e925a9f3e1b3ea3b00c2c6e0e527250b5f70861045571631510468aada8a01c5c8aa2288afe68f9ebb1bb9e4fc9a7c31070064581aab8972a3d79d2b7271dd2463504d4e105ce80178bd84aa761d0c20821d430cdbb01121147f023781ea00eefcdb0309c436d23b49cc4063171238c17ce16767e5b6c61453fdca6bf4d1f1086948450a45f2908454a4118f22983175b4c8143eebc2c39814217008a41116265e7070a375399eb39a5942f076aa226ea73849bdf14c5d9409da228ea2197699a268a464ca287f861021422179af82de1663be7b41756d1e2726f524a871047d384e33385fe32b29d0c2c280a420a4e4ea0d1155521b94ecd508fcf1416c9e0174f7d9eea5e4cacaaaaaaaaaaaa2ccba29145451ffd7bc4707c88305f2a1ba718a117b2b0e901543142132d9a24e91a5f84326bc2d5a126e1d650e78b228129575a0a4c39f1fb2801563f6afc20e166f972788915a850f0e70917fed1a81f29d99e477dd8270a777e7e560f9862c90756faa55fe98a2a5da185148bf84cb148266224f27d9c400426a64c708a2a8ea61a54c1628a0dee2b35b9914d6cea0329b9af844592d7d5919eb7252c9274c470e0db2a4251b5f7e68c93c6ac3f2a941493103f0b6dacb819da34a1a2c4fd93d286761885bab18915273ecf5543100c751586036e8f89b00974126bd4d733814bb6c7439b58a322126d846cb0fc03ba75960e5a01c54fb76de77038af14c3300ca3ef9c7b9671db3bdb6597e3940ddf388a423c98f88b737561af1786c3be669761845b4f8fa73c8458cd99eb0c6d22910f1a6e4c9422791df8e10901ee0a283d710e35176d0c401fb8d9e6780d4570e15f0f1524821b5fc189561dec4a5555655b0ebbaa2084a1072faf40a3d09a1df2143e02367d922b9834fdfb8b282da90e2e280438b8202668cd65c3928239ab299212e929d39454ca2614e7919cd2491cc5432c47d513cb2671140f1272ab2a5545610f9f8ad4aa819680968096643ca81514e43e3c8b78d185142daa50226de4902dac3c7122453ce2c514294baa8036576874bc5450900be183b407a025208448ea7ba9a0256e8c50ca99c9d0a638ffc055b6a01b5cf97923019ccb2b5d11a5330e4f3c4a694563274ae95bc1341d899e37313a41a7cd7482d27933e3675751233db061c28409553dcbd3393cac47eb767e626ae10cb11fae9ef3950714326138a274f9d65d07548f91199c62271e3ce0044aa2ea3c9364ec742fc2d48e907a53e2f429059f0d63841f2c26a510423340ee076ae6c9a9c3341662e046d368a2be9796d5278b9b674c6ade0803abea735aaf15565575247aa28a78715455a7f083334e75d485e43acca4219130ddcf152e50a4075e882207566270a546154498e8c28b3070c1891d2a7ad331463b7ae1ae7da14853106f9085174c810329b26841941648611304193881620b3b641a5650b1a20a1d4b5648e1c11c3244481021438e947aa0a4648515a6132b9e587143c5198a2c81b284c90eae50d90195283b68d2a4a4832567b022c892293b50526794a62f2f2fafa02537bf2e5eba19541ff5d761c3ab9b47780431a5c8f366faf80195a87c5cb3887d7e5d4cf0c81c725d780e99367348ac6169e0d9b8494026ee336ca2ce2311867e2eb963b8714a1c8de8eda7cbf310e2e5f06cc00773ff2c25b6212c7d7dfcc0d700bd8f9743912a89cb44d3cf336ca26986473294e27571d50bbbab5ebf3ef7dec31a1f3fbab8f6d3739472ed90a6f83111c9cb678d12b1867c55dd1b0afd510a8c2cb7586eb1fc8ae1639ae6cd55e7cdbc9949a4949b396faa6bde54d01577dea2b0ba20b4ae0f10ee9bb35ed44b07009d4ee75405c08b96635bf5bab75e27aa920180d955d4bcae0b7e067e2b72c4a55a918aa8c483ab8c2e3e89237a0074110ae5626311193264decc9b214d3f6f620dea365e4e3f95cc25b3c99462563199cc245450135a37f3a6c811970b869e5f17107ee30e6190213e248638d743cb05535691ebc8cd4d1c7de15687f11a2e68038fc41a550b115824880b9c810fd6d447262f5d6cf2813643ae0e06c13132469761c7a8d8471c51eb17dde53e5e0ed0028140a03f0c87cb6362d7cd22f3481cd14f0cfa9055756f603cbf2e6a789e3749dc47acd142b11d2cb73e613fb0dc6a39fd8f9a97c3fb81a5073c02f615136374af6be860745c4bc7d2853a242f0775f97eba0c8964cb755d1441757e52ec74bd6068a76b46891103e0454907443e6328e5e048a98a2ab489520e6e4a381852ba8117a51bd8946ce0056849849d24437db2896c426514584536914d2cd9a441426e9e1da77486542015d015d7e2a022a535e3a115b885a602a9c02ad08abc3231a99f30946cb08594524a29a5945262ef5db592324449c993cefd4a4a78d0f033c6182d565222c59c736299921164769aa629d3b0cacad06c55559576957ce0daebbaaebb4d68d8acb5d66e1c4e173836cbb28cd3c9a4d0b1f7dedbe1e61338cbe170389c677be2b11c8683e3382c47f5b112625b8325f1d58006cd3d7e6ca9062db0f5c2322e0bd5464c65c908bd845c1e0ab9fc2546070f717485864920839085138ca0408b333841870c9e28031186484983169c88e03a59012641e814355981c81523d4a00a5a486149a48207d2c005941d2c71842c0400042b32e80862745452582028d9bc3005a19aee52c9d7244647e8a34fbf520d865451545068ca1f10c9e2c8e70ad4445109882327321a718403455113450121044d51a51fcca0292a08f6c5863e56c0e1d1c0092da35f890655bc22d0392195e3c12db8f082054ad477f8727813c2f76e9811b8f845181ae7112847b43832e5481523f5bd5c25aa539f761e49f7dae519209eea3acae878184f013144e5e61b3762a6c7df98a24b1cc51b1d9f6d0ef1e08088837c14551eccdbe2c184b878302f0a2f1e4c4b2f6a5abe8a188e7b498ba3432301daad91b5df336d18cf5345a9c5e4dd209f271b7a39501dae1caceaef38dc381c126ddc1040022e008e69c07836ae849110e76aeb7cce030f3778b811c383ecc203825d4cd4a669f04817a4d89c1bd1c6e3e166384f1c626403f484e9f9f758de0c7d9ebe1c6af8fc047580f179d1ff79a3e769e050ba53ca1a8ae54f56ea31708ed135c0e87c8033e45d3a07c491bce85d04b01e62b7e020de0df2a14e87166ee8f3445e0e1136b9f1f15c99f3efbd1ad3618db4f172c982eb9fb4d13dfeda43a0d72f9d0e23501ecc6b199d0e235a3c98d7b8d36164ca83795dbbaed361a4ca83791dbb1c6a5047c97f3a4f97abe63a526c8ac6c7c97d4d75381b9ea623438e103952440ac8248e9ac49186e1928f957b5813611048054a89a31b34f20d1a5b70f1605e7b7144091b3ad64ffcc39cc93e31f77a4acdbaf946b8c7f41f644f184990432a500a94d23582d001011e42dcb871c388124686182162a448d5af524bfbbd523bcd378a184990cb1a1008ae0d3da578308f8aaa8aabc3c8e8d5a06e434bb844c2c8df254b96c8253207a38fa8144dd7b4410b55d1080000004315000028100a87c342d160304c3455f30e14800d8ea84864441589b3248761140519a510320610620c8000c8c8c84c1b000f6eff59562f8ebf03b9c4206dd1c7ce10fc0e811883deaf1502b08f5a9794817ecd2e9483e6da6e2903f91add2909e2dadda10ce235baa604e4b576c19432d01b9f40ac489e516fa4bc7435e89a12d0afd98df2205cdb2d25205fa37b4a415c73179441bc56d794807ecd2e9852067a468c5c39d8c52540d7693a30866868172f1f269eca1ce3a9e2c1f3c95443330595994200e86dcd55af29868e848d4952d43404c7e77be91c332e3fe161ffae83e9a968bc4f9bd0570424333c93a2017eab7471380b679d2ad9a3b3b74ee8aac821bc46253f4fa402eff556e77f7c380297972fb15fbf035434c8c86e352a1bb5e4dd7df0a7ca91ce3927c4ee6a445b306662c9abdd3d99c41cc79593e99d09f3fc4c0766c80246b047f31684e0dbacf3191c3e06357de2c61f23c2a649b01c08f42a25181da6f4f8a69731a16857237ce23c2fa0d496a5a40793e9eba0eddbbb12c74324cfb7eb5578022b82ebd05b4771a41529524f2214bd98d639f502399fb7ac5595897600a2ba14807f94874abe5204b7523e8d4f1d54f7b960a0245a963dd4cb6984b6779c6f1015278fd7f008b764f41e2fd40690c31d09e4e6f6f428c0750b53a75e46eac67e63428dc157c04bf0f005df58018290dd226f31c42b427b09c47411bdd5e20d67ef6f7a712d92439f2b1284439f6d7695f1f7d757a32ec3d8c15852863b27065e576ce1702809a1106ee334bd6b45236c41420685600079fd1bde719e0a19f9a11d05fafd9f7b078453c6265ecda2e3aa2a02c0b8aa3e492b30a74625db1a3f2b1fc387e00cc20d28164396264a19596afb891296c57bbcd7609b22da18e145cb9dfd7ec880f6dda1034728b19851b07d2e87730e691b2d08579c8e3fea154f3c7af6832106c1a3f7e152273ae5a500f1e4178ca437fdbe86b8a2f1a392dc2b9cf974809043207c0be4cc0e65ded699341140751a95322f22aae3198ca5bb41039c8e302a19b697ab01b61ecdf6768f83bc41b748529fa28fd09fd005bafcf391f308493503d62611b0bcf8bed02a530ad72b994c3b1c038d5fa89a772465798c8eea596661ea1abcb646d0d5cc485538f9bb5c0bfebb490ca6bb29fe85b955d517f5980ea1c91a620f090a138340745e8530f801862e1b93864e87b4f913121e87da93de646ff4af1a42e3df7aa4ae9ac70f2260b72815945c5913398bedeb7f2d3e894a492fc56acc9e0b7c031d06106c118ee81757ac4a836895dfe15cd1b53a37f761e1e373afc6a6f5d4bc286d113669a38627324dba5578ff8b836020dbac21d2812d80771aa164f530ffabde65dc508da574a90d96c03cf68d86f1137a1083df9a9d9f46859958ab46b23aea65fe98327a6ebb8a40febba401cc4b046d7273fa4ad42509bd6dd9e16f597d82f307d6d0bf11950692663f50b1a2c81166ba2943fe49c14077dd768614abbce9a5997199ef647bc86421c082cb0b58bd4992f0df71deb40d45274d5265eb54b181308b88d982906682c5ba17a648ec9d1f9640cb0f77c8c7bf1e61d15be9b480e6bf53e06db2739b521f9511f2da17dc094538a32c11365d9f1b12eb1085d0d324be009f2cd537f35c5a4f2c689c7cf839b46482ccafe719c1650ecfd91eee2c1eb1df21c5087165e7f2a28a244af4dc22bd16641d55e55ca513e45e56b4f14d2b5db0a5486af471320d0a6ca12e546f5a5e7b5e9dd26f1a9413bfe8a8980963614d454778f7e1880d2a33730180cbab596938e020f3cae4b38ef65925785563debb8628f4a77b4bbac0dd5b74a9e685e5a5511d680c63280f4c7b1145b147fd1428d90827e917e9449232e53ad3b2519259ef9bf3402ceeb530098aaffca4ccb533317ceff3defec8cf47ee6e4e07e4e0ec0b34c154439487bd3b8ab5c93c63c49df3a686c2c78f8a690acf1bdc778f286736c382c5941170a834f2e3a89d35a80d02c4a7d939bbc3748cd65a8697bfb6b28aaa8829f3076a483f0f3df2fbc3f3f32660f0a52ab046239d91fb33b3a41b8409cbb6813046a6ae68d8dc17231ada49c7c8df80dd325aff615702bcd94c187332d9a6e2c4ce87e834baa063425c493d47141c0140bb0858907b3f04b25f7db342f8640562c52d201c5760efa4b65302afe9bd4af587e962840d749b7c5548a7eb361151376e0fe19ed4f118be16dbcf23c492e4fbd01a721858356fabda7ab1acabeb6614318d0fea1a4bcd9dae492b3936e455d1b7330178e74a54c6b2c061f14f21bf3411483fed9cbe49d77700ec8964fd8bebf6713dcdb946683ccfd4c89f7a95db1ee5a173e33c3e2ce7d5c61d1c1b8576518f380d644c55d48e091d878f7cc94ddd169c638f1e67d480b9381511bed0a96376db75b7b57994f13a0d7c137460537b84c9d35a1b48498e33dad43d3aea7273fee9780ca9f55270f0569144abb06205c3ad15ddd3c129f35a383d8c64c3bf53cd287ac4ef49b6b3b6c27238f94bb915f7afa72bad864a98f99ac4c5c3ecbc7d212aa42cd3d278b15c3df5bf348913f72ef71d0fb0b718cfb43c9206ae0a4e2fa012a8894670cbbe4afc146d26115386ed46a142bc570784268957e70be4f2a5b5e59ab619bf4dc13800247aa5296d3a3bb24d5f0e6705991437a14049341606686d2bcb2fca7be857cd3ffc5947dc1682f6f2ea080005227f0706ac8ee14405cd2a7dfafce4c0e69f81bb300d250b64aef46ecc0b6957288283d2661920d2e616962448cc68d42b17a32789b46da66e3db1532730c357313e3d4e055fc878fc2f649da06c196e23e234b3d6ad2f95b3f2555b04ac33eaa8adc09664dd254105b54ceb0772208244394f841107da49386dff4afed038c1722d294e6eed0896912406c47af1dedcf4dd60bb00795e7caf4b61861dfbec3114bd8c40614f7a3ae0cc617f5fa711acc04cc51425a8e99367658d2bcb057beff420d1ea8dfb67e5e8996727fa278674f1b88378acf497e93f2beb9990d85ca8456b0ba529c668e57e8842a9b6b625175bb78cf285041506adcc0e29e64cecd5dcfc5d959cc51e160512352cb60cbefe99fc2adebd0e27e7ecaaf635d65ebe2ba91bc3fc8fec213391c9fb0f8ddd0806aa15f8be2b0e4513ddef4a46f0aa03a21130f3b8229e6d004358ac954d06781f816eab94e70e5719c20600138720e4d53d38acc41b37453f27d077aef8e1b0b44d448bd5c5b02c92a5a259299ec522ac178765b1ac15cd4271561661b938ac8b64a168ca2a15810e057511feaa03dc19ad65b538968b61bd4816c5b3a2288bc5b15e048b45b22a9a2545592d8ee522581777b04845a1ccf0fe2e5c5cf6ea0f2c554a4008ad7f5a24f46c2738993d216d4fe0b0c4f47d818f075709d946e8b684b78deee83ea0eda06d05fc395078e86b2192c30e126f852d64463785710401433e9270a8202577247ec35bfd4154556f650d40668f8623206540a5004b49d634daf6aba1977986f27dcad93eea4e605e75a3b65ae32f826587ec6e3a703b435c9e8aa40a558f3f590283f1944f3808e409757581e0499469344054bb796e870a33ce33183197eb2ee74dfa7df6cf466ca496dbe54be41f819e1074c837ae466dbe858b47a18e9a0ee90dee177b45c263e50960c0ec4f5002fd2e8c7465ccfea0444246d232e75b16181bf59f9b261908e8250233e558284f971a9122d636e8f3584cc80cd5aea6ae0eb5c242aa4b6ad6528db4a8cb102c012261219589e83d7a2e136addb54b0356134db6854b58aeb6af810185ffbf38d336c1e50cf3f455002a1d8e573d77208a8f5a5c926cc299e56d09fe80f001ab0a46bad487bd4c3b197b62b5783cd2b452a03c2b0a403b144f450bcdaef654ae91fab2b0a84f2d1ff54bfe129baab6487e5540e132bf1842bcf2191495947e07fd459f11748e2805912ef588f0487d93c75925b04e65171817249b0c358fb03e587e6c6c19d28c5b6a1fd3a2335088c8ee64516d5978b9633df8c1be1ff6c848f73c53390ed5f5c68d565163c0122aaa38e01706d5a74f5853a147fa7259afd13a7c2e38b7737ec1c69b92c2c3b7eca9ecf79ff254d78c86d6171dcdc3b0d35af82490972e48941f600983c68639df9acfe0561af38055e3ea3bf14ca1848eeef684fdead62b256668c27e98616df7e7f8807ab41a8307329a2e090745e71f6b1e0989f0f9b3b7db7bdbc113d0536607a93381d2b568ab469db240502623cab6cc81238f983dbe2e5050b93e955cc0f29ebad38a380f778d95ff7819f74b5b44788be49a82b1c965641d04d253ac1370926b26264aa90111b25c6ca7e45689a444680c5ee0790166d31ff769d1ececb8a49721bc1affbca7d1db395711a882d8560420447c34a1860ee6ffd9a0c07860e82ec072050fbfa2ca98bdf9f7a2466b977693af8d9fb1e7c613a186839744334ed18c7e26c73a0bc504a077cb1d111c42c822503c94da7c5a9422d901155695939e102d4ea6ec27e048644c7a749db2030c9fa6c03cea93043d3bd9aa351934ac942de6805ac1c39aa4774e1dd107c9d9907c6a2e6df7feb5ebd3ab410057ac1cab8ed02b5af1cadd5e94cd95af53402792460f53dfd7a0fc81eb49a55f9681f4d40a17231e00c7a27c1ff6fc9231c4cad1dbabff65e6137b6e97cea9283d9cd48df529165fe82e8202a4ddf112ba8f6c7269ed16ba2f87e04d8ee29e73765a287a3f63d89f407fc1a5dc023fb8e8ff97390c0dff3d6e0be8d7c58847ffc434c2ade0e177aa937573cc79258021c54bfe9dbb4051896478ff7497b9979f53670867dc2843f9c8aadef6f7ea17698466d79124a1962bd0515bbc04e2c2606251b5b8831dc82c8ab6a5d2245ba5bb4d1eded6100da13619497bde3190606714ad201b855da7241d318adede493f59617c51b474648c037bd77133047875bd3a209089de72517479d2b90aa3680e66095ec7349c87279095b45d6eac46d193b30dbe3fafceb65134bbb0a14b1e1d37ffa594fc59f4cca2e19337c326d33e9e51347207e9848389bfa27d5661ea10afcb287a83136713b2962ec725aace0eafa15cfb7944ce8da2ab95b54b383c6b08f657a123d52e29e407a813259338b4098223b44ed7433790f2e8394e5bf39391b97551fa1efb449fb84c4a56e9785d25f33c021e1fadb7660bad4a31647ad203298e4955985f7490d4c79d4137839538549d2729b12145db78d6a6b8b4fec4cf527f47c08682d97554a88614fd52d327a224143951b35dd85d996d46444443ab31f0990cd391a2f9ad15bddc4081c6fce92d9b3e10609263c92baed43cd475132c4e094bf899665a09e6831ab0817e06ec6f35948a6276455dff3e0322942fa293a29f70c819677f7231f68ca1747e69d0e568046143b5b167d0a299565fe3792fdb12def53237102da3616445733314b844e3cf324521655c59a72e867d9660fa96ef95c2ac43ff8f5734b74f15f49180e1a713ab8a579e9c9fca3e6dec6ee69e98db52212aa0f75bfc7c098e13c3a0a585bf0e8c097725de79ff485451fce3636972b9044034d52b691289648af8d0a0898b13a57b1c46bc05ac0543afa59d834ab627ec461b175271e41b6653d36786a223f82dd4b53a353ac82da4886ac6e4208d1809c17772235df54349b57c150bd3beddcf8f0391f51cd229ef5116ffd0d080081e4481ee6629119a7905b87f3aa24f27cf4b9ddb029f358c447c01cf7229d664a3e4ac5f6936196a5bdfdc84f2e2af126f010ba9843112ffd0e1364bc8c12f1cc63254de0b7ae83184057abf7a9f73d7c279b027283c473db213b8ef7b15595799b87fe8490a6b25ea117a93be517c71bd5bd092300af07fe847884252d48440c8adba63d12cfbdca40ebaad8cf792eb1985999b6d82d7b74067d166a48ae08adc0b20ba81d78442d37d4634556f1da8ec7480e84c55e7ad42c2e985c04cf44a874ce181d23010fc5b2d68c50250d8dc1eb34e62d09345d66856b587c8ede9495201d1845278bd13bc53299cd7aa9a386f7ef5776e40bc66548f664541e047f4e0ff1fbc3ee0345f6e165cd2ecd9c43aa34d8b9f79fe9db5db3b33e3016b1d582c49425f5e24fad164a9e6b9b62833386f231255690d6c16e7b71e206f5e2e7135c9bbcd623eb6c85a22b1ca447cb89d0a69fd67ebabd12e0710123dfdf5ed2d050a9e439f3010b10382814a54b62c15890635b4a33499eda6cc06b26a7f845450a277d427376eb41f3c891e249fac2111492cb4003d96ec3f93b91b4be5dea8235c8ef35dbf74485ff6d9b77b40eec58490c4bc2ce94b831beea244fb66eb25e4d6e0ef04d867ec643962f88bd69111553b3d2446454bbba9e8cbe58ac13d7a17a9156f503475357c06022f8bd07fb991c0ed7d2fb7dea73ced98157fa459ac41076c5b198baa2e4abb22c916d5a46cd55235b85170f6b5f54c36a1a7df6493ef86296f8daf7805905b06e93c786fa7c5f78fc9106ade198921963224e955b26075779c623f732b813194d1e925a707c49ebfdee4d790256119cad5b26033a45afc21b9b6cf29d86d10ba9f7aaac5f165e57bda6a7160d1ef05fbd478aa72f2311ff4411ff3711fe2431ff411f43102c0eeb3af5280af888ff6a228143b93dc9f5e567acb084773e4da58af21a5b4f1315bc575be1d54bcc17f7412c03c31e8a42151704ae94728200e11e4017364e821c5f59ad7a95038196eddb02ae5ca9409eb291b88c04c2984d4888afa8cbd5ebc2408aaecef5a159aa7877582a73d6a584171665c4776da058d94d44f06eb8463bbd6888272e6beaef0b4158d2a53ce4ceb45e7b60fa31a62933a036e422f6cd4e20f05b777520646194a815e2545568f5b208095b06c38ec9d4409b35f6792b319f97739ac8c5cec867fb54f80475943a74122e8361bdcd31d20b87d57bcfb038e34cb3f280bbe78986f3230449fab39c2d6756ed5e29d2020213c5dda388049e45a7e508ae7746cd27aecfe3cc0c5c2f3622523d83989913e9cd8b2047c41ac411f6ec5932f18520e7f2a4091196880cf158cba7b381c06cc8f2480b3ad608b8006dc86eda44129cd2bda7a0dca465a2d7f4bd9e159112b701d33cce24c9d1bee5832d49a6c86482eb42617f43c084123395528174a2ba4a6325abf61f401b4aab39b0edad9ab0d5677b9ed8b62e13038eb68b7e61f8423b6e23a8354e943b7887073bcb3565ff2ff5173ffe36a4ade982ecdf1c1fbda551c81e61a5586d6be5216f354bc188086cb22b4df43326fa68ee12a6e329ffe7c35d89c9628872a8ad994544ed235aecb4e79d84cba2da88e289fa91ca3a4de6601fb93ab9ed48214a46ec05f8986db36c7cc450b65096dd8940d7a100ce7176c74e16039ae192470b49a27789816ea6131d60066888fc96917193b3ce4e8c5a6dba498d43c4cd6a1d5af82ccc05a47df17dbc2eff39d8d0196488ab2333f29b5d5cf24b5702f95f180fe08244245c8dd0438fdf74391420441178380372b141b3065eb3f1910792f1d3e53f102b476cb348372c44d424847b8edd037098f153e1900f31d72e7f6a01742e062487320292d9743cbea81ce8b008a292a405cd0a26213775e987046031bb1d8d7985ac580988f8e09c44f69e642308586d63dd8c4f0c990df2266c754b8b1a0da603322b2c07dc2e312e319a5f12cb242462050a17ad79f08cba646fd38e941aa116bc02a5e0e46350b35d4c8adb0005ba9630df9fd8bea960ae8d5ab8ff3de7c2f34c7f2b28bf014c184d7e024a736891d717a20c911ddc6b32d83f2c0f5ce1d2a322c199d7963b7a46add4e6d31dbc3a5b7ed569a0a20baf10c27cbdc01190de1a63f7531233e8957348ee0b2a41aebae71943e80ae6f02b143a457811f9606d352cd9dc62f8d16576181f5016185fe45f05a9b515f15c872bac2abc81257f026e170e084e93018625dfd4c5df3be4ec4098371c0406ce7165b43a50ad7c1432461a32934d85f8ed5d56704dbf860424133615b85dd7a08ccf039e8094e157add34b05d549d047c08e149c30f53a8ec0763321e00c76ad3a51b003d542fdc8c700116a5f2e8cdfc27ec429b6b09b844e6d9b32f63db5cc6915fe07cd13f44c81696179cc35fd4a585bfc13d66fbb8cc3549d82f4075394b4d273792ac651018fef49029060eeeed9e8f131580fba8b4b82fe9d005edefdb9ac1279e9353383747342dfb3c5545a06ff46c7a9cce307f9a30c08179a1c2d3eaac4d0a54023b6134e408a3a068d0cc8372d55d332b3ce8f20bb23ccee76f0d2999cd8ba625e3cc80fa8277573fa367f9b58e442af9643211c819931113b5db132c82c25b23b9f389e1744a0e25ddd2bed2851a809cb57a431b251a0a40221bffe2afe156fcf70238bc71cf7d64b45769d8b662fb57bbb63096722c77cc718e5c7cf3e601bf3c8a6e2942aa204dd3d5f9cecedf66b669913701e2d7a1b7cd291b6e23a4109a1f9cb5395810289fd401a8c1874f247db8ca4fd76554fe45653b679e908df3c87bbf46b262eae85643af0185d195bbe05d494ba64d963f9ed5f3e0e97f6652b2aaabecf4596733fe3f0329c31ab7fbb2bd13904b88bc0a25bb1c345f2ea3cf9268090fcf9caecf00af3d6f12e9ef4cce94144a66dc8e8faec3268208fc21fa9c1b0bebc18b3c5c1d8fff5476ba28fe5e66fbf68fa05cd6d0ed6f83f6403f1f11b80f80f38b289abe118d7e3c657283f6238e78d3db561c62d7983cb508721a4fb2b62c73d552ba7c09bfc0579987fdab477de859da033011dcf5855db7cac8494a479801927010953968a48a492268b5130645efc4a1969306d1f594f1d05c9b7e9e4f0a88d42400752b0541ebf0402626f9250f4c151b6a52c7aa9fc0401001d8e4914a0b23dfaf01673002d571491764b6d3d0212304407b6a168f82829c1be2409cad59881fa26cefa4120ca3bf3b751219c7aedbef83b76c8094abb6e7dd85887e6a8f9df026c7afe987192f656f81aa49474d4a0fb62d1c4b8683d8119995039011b16e9bb3a22dfa06a3f60a26448f5524ca6bcee92408faa941a01dc9730030b805c95525c0e174e58ccdcf94c73ec49187cc5adecbc293af3042f0a0cb0893818fec437a89a5ca8857d0539f31f9d787456b27e9c948975eef49e0fe2a23aa7769dbde78a1fe537f6b4840fd7fea89aa3bbc953fb5e0c67d62eda6adc4c2223e26005c2ba228df0aa69a22821a08516e0902da3069e58ac43b914f4d1c61adc16e69c167a28db03de296b7c6d03316abfc16fc2f4c7808003cab53ea82738057215cb9db44089867f1c61320f123c4ebaf1eef5462052e7b7e1e8cc633585441196bffedfa91dc61522944748a456e83a896b36fde63392302848b4d740c5d1b600d548e3aac10c6666ab078e75067eed294bec280c51cbd85c53c079eefa310ce74cc9a1bd3465b2a7d8568ded081974a5f1745d52bb7b8f34a4ea2ccffd489711a3e21ea2f43d0c441216e488b0944611399840cf5ffc95c329214b57d82d7ea3f2b8d0d7c348b841968c0fc89214a489e475674b78ae09465094d58447669a760a8324fefc100f3ac11cf65ae432a1d3589540aac26fee63864ea7ff116525fd94426ee8b9a20b827a3dbaacac01f5863fc35c780b55e7104a0bfd127ed28186b0fec705870548cfa27ddf645619abeeac8e461e6e879982ceec7ceabbc149ff4864206a0dbbe57bae4d71892645cf210192a0ad093fb90282630c1c242bc13b46877b9c1214fd49c0dbc1b018f7c101433f7dea91fb337dc126e48ff853737d572285a6796bcece43ea6bd9ddcc1c01b3ecc78feef2d72c3b01a52591664d0d44859a87ace37cec8a2127834a9f10bcdff56f8a5d0f0b4ce77bbc824a024bfe7804d94f420f8c419b2091ee65816f2909edb47e9fb4246e681a2ee54900b15a9f6eed01ad25d9a827de0558d83a0ccf518b42c0af3cbc6c98f319af46ab30d1ccfb8fbb37c54b63512d52ab4c09323decc038b11ad3a7e8d114f959f223a457cf1a837bffc44ea963fef412afe4d5fbf024ea8a1431cc883a0998b406d963d62c9578613c9b4c64835edd7fb54d73ba939a90d9e12c0c8e8c1b5072ecc795c4265571d884b1418455ff38d2354afab2d22b1f30a754b5808f06638fb0fc62d4d8835587a235eb6a12c46ce7e494b262e6587d9fad550a58a69afed6fec50c070cb5c31761236d435b9729e780edc128e5ca213c3a2ffdf64accfdcf24145c407b75623b9264c735fb02529d0c55314f57c5a31d882c5eaf9de6cc272b7390858438a4384fb2991cc22e0df553472305ad677bb63df06adf32dfcdfd612b4bda1423f6a212991e25042da04040e0be5f4f9c3c0ecbf51b41fa0ec93d69b3bd41e212a9de9d9f7475e53bdb48fb1c7e9151085822187b1d35142bc5f69f55fa688c56ee89c90ff5a3f6506dd426354f4c9b800880d29436ad4cfa7f4d56789adc0ca274f9419c6c5aa22f6b39c620a153d97176a66d9681d6d72c9f8921c6f77a400f2fcd11ae10ea55cd69786dbbe905f70bd10954a89d3a6b455d9c932833936161a2dc6c4844b3564cc0eb711a77d6386b3d87dee5c34de5c7082290f1706ecef8ee2addaa73fe101fe50943d98acc266b2e596662657ddc3e030dc03a2c484cde068a8024daa572f69076a295bf18145213a488ca87b7c86f1a1a6dbb1c1d843140be9b9e7b4e9f253d384b5410fdee2c061e613571fcc449d25050aed2de4c1c2495555cfc19d9c6e2a3b4e1193e0302be7be6d501a97a334d12120385a15216833ff939256dee4e08826417c9297f94183a402f6e035a80b5a0a41ff02923b6677b8bbba22ddb91902b97323c9c575933dcaf908c80e1b2ea43dd147dd943cf81a5ce1dbbb5b20fafd14ea2cf8e16f6badbfcf7b5c2180a7f965c57874ea55de0985107ae850c4dc48f42f2d53d0263fca492d22d1f851c59851e498d388bfc302e7cda532b678f48bd774e55c9af520a3a3cbfd36fe9eae4b085de2e50267d0c29b8982a0ad776cc4805d41f70b0d561977d6a03c7aa652636fbc8687267bd4570ac067336be1d2c3a35a5b7fddd3d24d8f14362e25c2d9df9c47e742362d5c3e7942a8dacd4602a247cc5d8d8012972d75277619ba00fd78c2baf6d6576a323b1f2855cae939294435a85274e61dbf4670827e3ec646554c3bae2f3112f05ff0055893ae307da79f3897ac593268d56bb6198b210c68af67214e2bbf1097d82f7b9ce1282f1ecd78eeaeae8075da89c5cfa01816f4d5b8139fa3f957d5aeb9241c32afc0b2469010960325a99ccd7ca9997f1a17b407643fa89b20cd2a8b52912d5caa243260ee8f425db57229f6338823e413b984461b9b993b09e6500f4fcc1da62405a7aea561329e434de45337d8105b1a695d179fce5d75703f2a6f12be744fe2d860aa7920c9644dd019443108a0f451fdef1acb733553da005fcee45b90a76eb5f10da2d29e25bb7ab7b65e3b77561bf92c6e4fdb6f4d62713a98072806d7a9b00d69e6464a6cb6d22fc27e77f6812c7238ea552cc77a732c79b27229d5e686c6820c547cb2fe487d6e8cde65a0dedac81c7b5623dfd80fc50d39bb4908e0a5df8dc87cea7be27b8f52ccbd1b429cb2573b5a30d0d974909847865cb978b641d486c94de96cf49bd077ad35f19287c68be1183b04c92d92a4d9aa36e8b6afccba20e589e847095253ec52e0987e7eb590da5d8f34e40cfae282724de904d7fc659ec3dd5c0eb66a5eda9afd81d53864f21aeb6d9e3674e4c4a240299f558d8c6aeac97e77d1c2d0e5614e83656ebd49b2fc0a28ebd164aac0e148ea2e7b12276d79eb95ac37c62744d5cc8073b7a40365c741ff2876c656c4e113d85d6dc28223db45d6e882ea01bdc0ecbab522cb91c4e8a970a746fc5dd3906796edeab1ceccc6a4c674f68f56240b7ea26f306e407da7d414f8a300469ec8921fdeda1668c87376183b71d067fdb5ac5ecd75797a8c39f18e4330d8e5f2fbb5b1cb8d478434e4be176d507509009322851fd8ec2a62999fad44804e28a978cd908fe65f9509ef245773299dd4bcbc572a2340ccb51b9823c19851fe82c9a286a31e0e052fddb7413ba321ba17f23b3f0cb4357ab539bfb6c2c8d49dd9fe0b71e77e5c0cfcfd5225a415b38678ac378ea3639b03f7775ad98e4023da22e754e86afeaf19edb4c7af9435568d484f4d9108e6ba08c7251f8cab2dc95c170a4a1432ce7dad4a2420f92604800e5089a591ae3cb1907de75cb55735ed29cee7f5b79d06b7e56577de3f4745db8936663e51ff314d7d84152ed74b35b058ad91f4d4725f7041c862a16540deaa39a02dc3e6bc3204db0cc3f82541a4415ae47d1615141334ec2a6b051815f83b066339b6179159ccfd40bd189560a4e57b47874db74663ac8566d2f2ad5d76ecbae0e8bc081d06b37d5f3ea3ee992d5622c82a528577417d012539f7e27c61f4e8737e3838ca538937477e63366daa600ea5cee9be006cdd2d6f8391bdd3a519e45d5850308cbcd9ca7364b25774a3195ddad025fd7c938b4eb9d55083c23e20eb243e31300ce9ee979cbc23852180c1c8ae5ee7035b949cc0b25fea043d45a0d582d0142b00a51c8fef3a62b41085490543e4368eba1b104b04ae284bba3afd9f16ddf3e0a71ee1068b67591d0b2bbe6d4ca891b7776c78395509453ceadce44ded72c9a3a5ec20fbaade4b1d5b87a119b68384c161d367a207eefa07bcef4d7828a3febfab14a886969638b1bd30312bd794524b1a5c91a08a18da35e83353e1083dc17530af253109e8d75b079d6059f25365f33fb3cdacea28c9efd54c9f731ab638f0d829de1d56b473701b5f934fea9443ad40fe4ac5b7988ac99ecb2ddc604563139e22664d9dceb1b4e0e553617abb128b5f967405da49ed1da8a5d3dac170f89fc11a8f6efe31202fe0e229bb493302b6535ebcd2d327fb3a9f48ec0d5b6e4cc0e3b7983b72b48922f793b39d4f109cea2e8040e948d9538a8a033f869a4a695954b89a40c19e4058f860b9fb94365d0c49a428fe2a451d2cf76cfb7d9596a2674b5d22bb0c7cd01ab5281aa9ab255fe3191a16b9738c18830e148eb9878101b2ed9b45784c0569682b4a0c666c1706df0d2acb752ac21acff757de1852bcbeabdfe0a1687c05afa8f1989cacaddd3d5586417ec0342f180ce02c0341208b07338646a91e11ec19c3c5af21922b6b098f6cf0598dd798233a391a251f15d361fec0c5e6c7a431e2f1cf42e8e7114119ded89666a96cb810016b38f0095595ccad1822f62d97b8d9a0703c2646f611c0526c5485dae759948b29c0f53b686a74500d08d9309f0a3fc26ba82bb430aa004675f7a2b7a91baea5f0686241a6c83cbc629d26c90c385bfff8a9f911ef3b3c73ffe4fad35c404407417ff0c79b8d93123f70113784c4b2ba48eee54c472152984b74fcc260c2a6a4bcf6483517522a270e3a702fa78a05a2a67fb74f831d0035943ac15cce78bc77b30e8d1aecca8906e62ccd55b5f4e6a344538567e4401c29a52f5742443b25d7cde55258888bd022300697dec7212eb76656ac8091488800605ea4f65ab4b1ba0252835359e5ed69907758c03104308939ea0ade137d330886e56c4856c3bec75a29b3fa81063df96575831ff105e10839d9de7d9b1f0f6af8452f6d6bfd49261ff2e5f15fb65b3648c2294f20ea74514d3ed85eadb431248b7ecebc2c89f682be272fad096c2a1fb339238e540fb9d687824d48cda6655617d35888eea8753d4579761d5d133a744ff595d20442bb2f018fa7ae21601510b582751a429740c87e7122299eb975f77b5dedd5cf4535e050481127521e32d18bf03e45be8cfe0f6da52d945c8b2a9a953e57f404e6aabb49f3162178ad752a4fecab289d91d3c5eb6c39f9f55035f2ffaf1a8f27dd821f42bd07dd299c85a4e7d2dca9a8ec7f48e8332d555237ca261c6d90ac1c1e70b08c3e9ac5deb945f11156d91d3a85cd03df0fbb81304bd2fce36584bebf0e75f4dc1e02c961c7ffb2675321d64e1b411884867f43f27de6a6fcf649402ea7352f4d71343cef0395db56830aac1fb107f46c5e447583f1a3bd2bfc46722da4253b1809953ce525ba967194e0ab4a31226f978675d5ca701c294865c0ab9a7c45a3623d50d1345e38215ba43ea33ecea5862ab023c1960409d3e800fc87c60834e3ee778e4f9e4762802cb4094702339831d23221a02b46c1b04580b9c5417bd15ccaa34bb24e906ff583619fdbaeef60edf363574fd8624c5d2a7c75c554301c1a464fd8529635183767a57fae35b5f02e8a1987d3a7b6b76894a65f91f531dfa9156cc7011378299a56dae0be8b30ff7bec165742510a193864d97705198d3120d7b21f8678353173165151998562a46b8187b74d6dd19ebb03113ada5980abb4cf6d59f7b438a4957ebd4db77384b930a36c56e5dc5bd7f1145dc60d8c0d42cf1b2b901c62922a48400323b086944c914ddd8fe668dc99a72eeb5e4a4cc84e0898c2e99775367d1416b0bc6584222b6233dce186abc113e787ace60d860d42d3dc50e4d13b3688387336186157b618a6826df4617ac743d37f4e59eb0868a1882df720d3888724aa7b819e1251342c82cedbcbb33fa087356745168503df6c8560d3cb2f938e230e3af59e360420fe9b33c6523d7eaacd064ac8880ac46af59390c22a74e704c3354d79a4a63a7419043160bba48bea8530db1ea53bb6f3d4b8d57a5cd5d6e371634d0930d02fbaa1eaf1cb6a35e8083101bb66057f750bcfa3f8e0ca24eedc0cc0d235fc5f4d2a0ba82f069660ab6190302959c01bd8baa8fac70e4fe983cbafc7e8dcb78fcf58df8538cdee12f70ab236f0772ad9966b47450b299fceb334c2762d7c2e9aa53cf5eb530bd18b6609cb7c849130f5c367189c57bfb4b9ac83996968ccb2080e94d22e8131aba4816dfe88ce40f9ae1a4b0775484b35e5bf31709162da95cd26b070ba6d0a2d1d438d1e4009a9822620a785974113a5d31380a286a88d8daa8e636339a80e180615f28fcd77f6c1775400289f040e87af9d9808a3ea3630e489b2beac919409444218d201f1f281124b51f4e806e53c04f279e25bc7ba10ad930bf0a700243036d9c7b7e4a3e930150065aa7b5f33390b635be313b8e6d528f6fd233e55bd8ab9a77186d8292a557dcf1a38ae55361c435057268303821a391a163a5afc67acddfa677597ef807a7ab80959deba7e258ff4d9e6eb55a717750dde7687262ed12ccb2bf967b7c2337b93873cf63125828256061c5cbb52b16e643ea3e8ed39ea5013a028c74b24b1a7ae94cf4cc90a043d8adb442e233cc75f1f52b84377bc7416354a92225d42e81f42c3497fda5de01664ada2ac29c06db3d003bc7f29400f67699e154a4c88646e1cd4f22fc46775136bf38af5ecacc8f22a74b9c72122ceffe59ce4780aacc8d530520336f9712665752a25e584518c9d5de7a998d0e18a2c2f347500ee00ad9cb4dcfff145e9c03b848f49c4174ae08388b109d6aeac1a569497600217356cf45b4976972e5e0963aec01dd8ceba9fa33b3af9a121d3dddee190e85bbb2136f54d310ff30c4f87544c8dbc93573f41c35a9607e2e60acdbe69ff7bf4f2c770420216eb667590141bce53349153d12862fd59eb2ea7ecfcf7d55298e5f7e6a851b79950a71389287d48e57c79ab19e3229d69e403c3614497aea70f580512ced212cbec9894f4c707af838f09ebba6c3aacccb040e160704ea530580e7cf5706fe86e1a6e35846ec9ddfe1866a2ec5d244f1f88c75f52a04bb6dbceede39c8d2782b6a8eef3e8dc01d44f934d0f1cd87d9597e763d2f628ee4daa792b111eb20dc84c34144ed33606de49f44105e81eff0bd08d122d29bee93256b2869833fbde0f642620d1e9e97c42f653f04a59c74f0caed59bd616ff0574dcd033c084c5998c396138e76309799fd9141e6ad162504fcf37e19a4f5e7f31b30913543c8d742745de9a30edcbe6163017bb933ef97ba56c26032ac8282243397458fca626f6b69c6ca61d29c5c0268bcb4597f9dd5ec5a525883654e8e1eabaa7c1253ee9e106a1fa78a4a849e9d1beacadf13e4cbbc72b2d14cbbeeac9a7a60496ede0d570f4dfce82efbee76b98610734e3da3f7500f3b58726d0da2b05624bbe41acc494d710e4a393322cc17b8bb34b310e52032f9aec3daaeac690cffcd268cc9698f4d406101571a7f1266b6565b0c3e83b902874817eb460486a3586baa33ed32840e925875a53cbc498f0321015e52a77947aa405838457205cfebf03d0d44dd66b22f66ef6d2d900eab71b37e3fb0f8e60991ca1d206352d0adfb9898426ccf26d49829aa9a0f6da87a358ffa386c06418ce4a417bbddd013c445c25aea4f60759d6fd946715af430f90d0a4105db71a2216fc7108a840e287196623ccc8697a9ca2267d43e84d0e04b43a9fa87f5c97ce3d9a7852279e299d436c2353c47707f3f351d27f5d1cc389ab7c7f16fbb18c00b2da42072db67a658c5ba94127aa3a126376b5cb0a42e5dc8a8b2b0fe9ecfd340e55e6822fdb273f8193597d12748a8f9584e27dd492c8ce43240adb11ae0fea478fe830dd6cd8ce974afa90262e1dd59409b545b7bb3e5852d30cb0d2bb9a403360ba865603e300fff32257192e4262071da104a2574beb006dc4cd83bfaef5183ab7e78651249540dd012f01ed7a438eadb3a4d66f5fd096ea8cebfe0abd313c99766a322e725826a11ab1c56572d478c5a34b29dbd77b9cad06edb70f739b62659a0e9717a1daf3351d2d49bd314fbd47d75c0293a25cc524596c1ebb4be29e705feed1bbb9cdde31e880f6b65e58fffe4b44dc30e4a2d382ac8d73f5c5baaa40642384622be2aa12a93cf0b73fe31a9f8d002df1db59ae4f5a8b3488c2256d5f8550c070bc32de2343d8b729047d0d7794f38f2bc0eac3601568c4bf3518c9639b2fa3e71b01bca454f8bdede47864cd258ffd60e9718a22b78b20079d5bed961e9eed5414460c1f50fd41c5f9832ed57daa271b60b1606229e28abcf1e059f4adf0eafdda38f93b417644991219c0df48374f4c6e08e6dc152b1f78d84b343274ace896607d10a18f359c3d1450fbbbdd10fd47c5455774ae183f95a1b1c5c47dea9d1608c50a7cc2819ed2ca6e723199a7c9b953187803ec5264d0a34bbcd141ce28ef4ff9428c33b076836a5502bb4766fca6dd51351cdc3933b4c749e6a8a8a77cfa5f224a9f79f45b225d88dc2cbc5b0a48edc2b71a822846241a892010b297e2edbab9cdecb483565bab70b5b5b0b605ca3832613271b6715cd788049c8c6492767c76f523126b6b29ce5a72d5b9a069baeb975e5e6877d5433cd781c49625ccb0fcbba6f1e9a04928dd67c9e2ebc8031f089665d0792f783d2400d9299a63960dcae8651fb9a1e55a6747e7bad9a9d0a8173cb56fc5b0969992f2fd3fb6f4071582b53daeaacf624d95d1753117cefb2567311d8f6552199c40536315c012d1b7522c35afb91eb38183a5ab9722d16b7464256bb95f04275b2e4d8b140ea2066ebdef9ba074e2599264bf9aa0031086a9dcddac3003cb2742b14a32828a04015e5cdccd8be1d08296d5e9d619db911ca30c1aef231b4b0bc3da110444f89662bd833ab14e9896aaa80c2c60453e52c689dc2674a378fa203ddbacb9de8e6c56fabd5de9e5ade8e63ea4a2256aa2d17b75f360ea9cd9638d7be8a8a0c624a0dbf481b801655b89cd8ffae55eadcaa8bddde9b5fe280b22325885c1b866f1328ce8a8a07ea42fc50ef96f1c92f154ea7600af599393df4260f368d8dcfe253022c830fbf134229e33abfc2f72dfc7f03a5fe5b034b37a44b629c4ba5a8be9df3c2154093b5cc6b60f5407422b87dacc0d6f59fa3f2bd6c4ec969005fe2710170016949023fa05e078c63883f7218cb72e85d47d262b3c8d27429dde01695251bcbb3867afd67a9a1c4e1cbd26f90283d8c1840c3bb8b7598748ee0cae46a163748221ac34e488c7a10911ac2f36686f4c6f3309cedcacaa48163142ed41d8944eeb6a4e6b2514f4f2553f8cfc9e48da71ce0173d2d43057cdeaf8a95f373a2dddabfc6ff4482504f0f8cd3101cc86f41ce2e0000885fb2c59aadcabae486067290b8af3ee9ad5b885d2b04e65002ce489eac40016b5b9e0c6dc426070fc65098dfba97a4517eb0b59ee48dd6cdc771d224e6fb8b350aee4fab61389d848868f10771d930f3ef210f7a050f6e5197ef22debfc1a7aa524d042c496b198034d58e3a834ba8bbc511612cae83c736cb9ac85c1659c12ee111a26a64d9010328b7fb9e8a43a5ceb1422870519e713e4235baa78fc9ddfac59c718d75636289ccdc29f8f205115b85fd34ece391a0034cab385e1fc010742db498ea7fb4e910f9f400d22f395577a57113aa807d6b02235cb1c604a5bcfa63e3e8d0a43a0b888ca836d40ef3aaa9dcebd873101635246d11f69500e43fa9858a6a310ba61526d798d61f06da3cacc78f13d01e08b08081c04eac97a2f2f11468ad849621be524ee23839862f4782658ebc337da7339373cd5a68bbe6c3ac7405a96ef35798f6325c666b6fbfa6b726485c987b16c4f0ad24416157265e899bc6fa92094f06e185e34b6aba161cc0dc5815f2973e24c0f836bbb970b01081ed84b6f28f686228aaf46936c322a21adcbab27c8814640116e3c89f6e8439b3378180595a8af4e26230ac31da6b03541ce3ed09f267c7e04fe753f0006d83dbdb6e0ed296df75f87aa4f14cf2252391772babcb02a37b463302b04407329a75a50d04352877ac427c5286d7a0d1af878435acac6b11dad37b103ef0cf549181c53faa76154a0d4c150c374116a7470c6dbde080a1fb105e97d345e7cd44bc2d7085120d346ba52592aab5ef1202070a53ed86e9bb158823af49725b9be6b031f8caa9f57b53ef7ee5a5e41dbc860d0728898e935f08ad566ef9bdb4e2529105fa0faea6be8bed67288d0271bb03e0b779ca32e16a85ef837e3a5ea77457b8416ac0edb01f70ad50bff36e215d1af23843fefb5f38295bd03d048aa754ea0b5e46b4216834110774c182d231d7304c542d2519224893be8706c603242ae600b1ea0c24f4860420f59a95ff869f7b34059e51c58dca10dc6bd6f2c28b392e86866285b018b462a9fa1ebad4e0a793e57e9f0f4880c8d6b454589710fdf5bdbae0f75988b47f800722ab54e3e24a3ab35c1eb54fd0ba4b755f48111cba6361b760bf236b5cbb97e97b773b5e660c0f29dcb48120c8ccf92f160f8902c7b96284c732c4260cc095cde9eeff44d3380c635c0bc67cb38c9e9c50180c16205b9a89923c129f8ed9273d15f48023f39690702627a8f6c060aa09f3aac25d51bbdee4e5f332f3e565ac36d622bac7fb5af799850d4fb135cf75cb8c1d1cefb3860287eeb8af6d1f849dc2113b576670d534253d1812e17a98362ea176175b3632ea8487304d8f98475f3367fa8f5d25b9ca2a9689015985becdbfa63e243a06ef0289dbe3522fb58640affbea9304af5d9f0760c62cddd688a75c177ea15e3ce8d1609c7caec12e8cd5ad06640e4f3973ec7c4ca5c0430f97d9b6e1c459eca5589f4d531bde3ebabcf385588533c5b56f2382597f19e9dd2ab54811074a624f514273ae51c0c622819a14f521d0015866301c17479d3aa48cd7d7ff1ef87a45c00c11b327a5c49f944f56d54c58d3473696c04da857f6099f8958d63d9f8e37699230dc70119db1e5debe9b775f4d03096342f13422f2743acb50623c56227820bf9e43396b057a5b51510dbbef760ab244f87e835161b47c02bde7830bd7f58be3286bfc00de318a7b5b628519ff2ece13dafa0df4b493741a339450f903b3efc2675386fbc41fd6549a516b3ec8f9ce3a374d4bb28dfd30bc84a83eff4c16aa6b8904d1ff959519cddae58c10e3000e986c162c887f3d27f3546779a1f2e4dd133ad7b518513005777fa3bae5841cf44e61dd906de6a4a29e65e8e5195900859d0c7f7f56dca98142a13e559433847a19a644ad1bf6361e0011a3613bb31b3e356124245ccd64115e80c640b9d2f1ef74214496ff46bd2353ff71278b541748f112af6c92774b7afb297d28d50a40ebb00b6e5b588b41f535294e0cd40e6258ff3f568352137767d1878ebaafeef9a50e49a630a000d01e966e26cf2b2afa2ddeb5a39585790d67a453584d16f291aa99b4f2cc85292ebdf356be8c288491fd2631d16bdf0201054869992235ae782fd667ecd6fe03aeb6f7e3fd990723dcd3b2755105e7b2dcf8b46f87d652ed256c2bc986af329e1ea974364cb0c64b17be798eda297d4bc0c97e2658a70603eb532482526c01ce3e04c9944e91ee10b7a32a2c54a2077380145332c281de59197216c0715c0a8d64d57dce5eab71eb716cc8e807f8c790ce6548a3e3cbc463bfaeed1bf859e79431c729915f6950628f93142a1085033149d95461eeb89ae3ebb81d01f611865277cab58837685b32dceddfb0116e1c30e15838eee5ad2f27832b1fb669a20475bf03e440a8ec7bb5ea11b471916524b2888f7fc5123974407c835c5fceb0818d59e4ba41628fd9f432392197f9c6315fd2def7f1f0d9e0eddf2c89c2d4231c899e065732ab773d6ea136088f7e17df2b396667f3d15a4bcc8866db42078eaf6d19f111bb11dfb6d174f71151c1ef9d00c4a7574b0e2d1246de9be537729c97ee4b8e060f5fe5abd36f8732cecaafb8144b4711f5b8bab4afe3068a7f12c14389e3469827d50e8d9816a7c87e2259edaafb6e0d1b9819408c3e96b3f4c8c7f52e5697d4973bfacbfa5ee083b6d4eb00c5be8ffa7ab1c668ac0d8c4b697c7d5b07c8ea00f742d64d1ea34fac5ac3a08d23dbb0a415c0cf492a4e4a47f8638c920fee8650e57fc93c3b8c2fe98c0b987ace8f5eb0939f661fd4c211181247eecd9f8c1e834b99ed3e4ce208658f24c8180c1adc7223781f72c8ff1da8186ea3be8b2930ebc7648a80e510d7e603bba9968fc38ad865176ba67dd9cabf030d058e77664d92971574ea972af2cb6785bdc181d978ad37e5384799c2c63b655bf30e5802fa26669f9ab4317c3e6a9c469ff352969e8cc8f4ea8e4b9f2f344fff4d4e0576733800f6d9f57a063ee5286339afce9d458eefd2e880d66af3a9eeb1c295d5227a19ec44fa73cbc6bbb0198ca77c00f71f696359fa1d2b8ecc3e6dd7c74929b7aa024b1f2d179fe5e79391d6fd64306bc4f5df62cf6d03e3a6910aea2c45ac1b1f3fe831e814d19ec0500b10b58baa813822c22175be8d13146a5884314328ca8a0970e754e6a3b6df647cd0e8dfe57d9a1cd5fb57735f0a7e2ee6dfea8edb4dd0f35bb34fa5b6d370dffaadfd5c48fba3b37f8a16ec7e6edca76c38050f2c774f91cd65dc7d32ea71520b8a3c7746707e89401e1e3bf8f019a18b2a8938a921c84270a2a72e67fa72d99856d9a7305083e72326e16769f3ced9919622ebbe78d466ab99f784c2e652889ec171baf5920138dc4104b0416817e1694b0157893a8ab0b94a82304ab58233605b6af0ddb1c002f69f8cdb54e7571661e2d2ee2a6a16717a511790a16dfe601db9091e2a278bd2008a7a05248cae1dbba944d490a311e47f47f26a0f142ab2251de407ad5fa07d8e0db3a6e839f702b34542f69694403cd017d30f8b6bb73fb8d309dc2d1580af363ce1c814375bf83b0a5eb9a0445d83d00fcbec0bf18de45402e163a279a673a9339183bcba479c2b78b2e3c6394831441161a5c518573f5703505ce5e714118ae228f895d494fc5d930f68afde1f462a573027013977cb12e7513c4973b951329e3c2b79d4bad15ce2bbfd6653249c670e251f6c660116d54cfa04318d1211263578743e3c7afbc3520735da9dd0861350bd4f4c664e9984873b5948b752adbe554d1dbe62633f54cdb58ca74459c2e76d40e075f5d2d01753659d60e02d05091079d4d21c2bb5ef647b532bc030d966a42e2a93293eb28ec71dcb82178403269e59c03ddc318c48a268da0f801b9c3c23f2339b321fd0c1c741baf322c510467860b50881928e9d74c602254458e2f28ac1ac64321ef3d5fa0a4257bd96f0320b0e336652b6998467b449098c660e648f7651a77e0f25f06cb690c64902058cd75e5eba238f8a300a326618d04ac19d98582a02404f2952eea71d28f058fe16cf62f15fc116414ff176929d929491042ec66a2f5c001cf769296fa9a9766ad7ab161908769a2a0a680da61a8117016a03e79048bd77eb33741aae4215987bccf3d10b537f0a1e0fb6c9a62b3fd175f803a8a81a2935541b041c1332f8ac4bbd57c324ec1f1a0b69ff102f16e5b1d5a6940a874213a8514d03b15069850d955d7f5c5148089d32ee11f07b13921c61af5137426d7d6922dbfd19f25ca1d685bd2699860faef29bf8a97981107103ebe1fc6e201c2ceb20ed027273be4075f51eb7f1ef24a010585896d05b2b52dc40ab775883cac4964fab30cfa55ade20a8fbbfcfde0c8ec38a0b473debc7c877bc571a5d087060be840e2587271424a12abb22086b501c60e274b29f6a3561123538e00089b152dde6b77266815f4f3bacdbd1056a81e3036a6560a6a0134ee47c64b402b1ec840457ee45fde5a6814b0cf097eaf810e3cb912ba6867bc12ac1847c51a584a9a404513842fa7ebcabb1ab19a2326251c88592954ac2f8b1d6bc2abef88eef7a0a01bec6161277d040e188337122dc7d4ee673f7b7efe38442e1125d00dca917ad11ba52d14536bc27ba9dc251ac1c09dc098a932305e5d642394b7bd0c1d6998465ebd9628cc567ab41d5072f71bc40538fa371996921a4961614bb90ff0b4b95598c228408907d9bf43a01d91a1a36e3d44e63f619526621047157d040e1f8ce8923cd218faadf044bd7c427b2f9e316cee17965c53ce29934d8c46e0f2f3c8cf05d02b06ef5fcfaa970101cb051f6ab0e3547c2135606d321b5bbea726e822991107e1f1b074ee13e95148895fdee5f09e6918f0e94783f9ae3f67eb502517df49a014e9dee6fe3bc053c22ed1977d176ecd2adb2813192c0f1d2cdda72510ca9adc4f27249baf26927e1b6e65856e08f5a6d22782f2305c4d10153e84a7ab4bc012b0dd486a1d3ad799b22f9dc8d3ed1e0a9a0e5fe71e050a54858fd18f7c40d56d44d24731c8cd73c4ca545bff318dffc79936cf1f7fc60e8fae672b04ed6f3813416b27f7744980a272d9a5254a52b1e8aea043507e393c7e9007b79608440bbcfe966463f405b17f6be8cc62ba8cb4bd066eb95163c22f24214c34fdf08848ef8818bbb7c1d150f82760e87942c6f2d02dd90289d30f80de6d68d704d241a0fc40bd89c62b0a56e1e00655e88515940e5f253fb6737ec66688653b302435a6a377da45882888df230f7d24b55715970653ade324f2acacb58afd187c04e1702851ca4282024b124e75d9bb4ab0a290854776a4961d09b4bfadaad24840bb519ae41b2c7e1642f086cdf53016c2e975805b54d4c054c363e3c224a0c5cf890be802804004f4d15c3c017d0881c3429852e85818b5d6824702d9bbee7660d2956d21caab23e6d67139e202a195414e6621e8c67ae97b494334750a12180cfdea5e0e6896cb83693a119d31d3a09c20faee6a70ed50ba4f59b61746ce265f279734e800089f33d333ad91911805484d393d46dc10646a8a7a96b9451982a1ee704f1bf6fe9dea508d1e2651a788adc01e12961c74a089a1425ca4af62986a2c5aeef9883092981252e908280dc5c66fc74ba99ac6b9ab3254916e02bb6a43069572cf9d04f3570a77070ce473e0163664219b024821b697dcdf7bfc498dfba14c58c5e9100ac62d6242a7ca69d5abc03a51b25be57da0e471ae17d229bcfc4c3edb4508bd556a4d3374d637fe4d21f3aa38dc88ae8dbc0ccc0eadf510dce675f750f8cbf7fde195965be8138cbc59ef151b7cfbe23cdc0d84deaefc0ff1dab9c26604f7ba68a69750cc0871518177725d7b1bad9b2ecb464c74164c1801672e94f3dc35c257f26b33f6bfdedda8c6800ae460330ff8acb4f629e8eb19aa315e57d1dac4b5debe9e521d5a65e358a04a6261876d381e4d1b005dcec00fbe9c69646521f38c1cdea64e6497c42f2c8fc1145f2c8dfcee3228773ac142b25c80cae13517374cb432abc1d91619c24a62442870a2274f8f987468c3a6921b529b075c6719008a3b01963e2199c1b54cfdf455e6ab5041f5ef7b8573f82f51c7ec8960f833d2b08cf7fc32fc07e4d122711fe203816493868d80291190ee994a3a81342ff4df0a68465a78fd5068273f0123d064514875e05ecff059b95039d1af95bfc50bbd501f2004a172c6c432a3f0236558685b0b4c0ee24699d2b3040845e1bc27daa75418702b4981b343409c1db06627584604a992b6831c5c5b04034850860f57324295de94602863a080ef547af137455eeeffa0ff6fb44d871a54007dd065b7ac01a50efaf0e57fb931b49989cf18b2a21bbce2c406fee5bc063826074b02d82bc3412b259dbf31d73dc50642d015238f8218cdb5a13fe621a550fe0fc57cb25bbeb3126aa65cad69960fee60837bff0f38af4312d9b630aef2e4a0fa763a757bd31ce591e92fd83ff474eec8c688971956d413f9bda4c59fc9f9da11f5dab3e50653771447380a331611592ac5fc3e2e1784bf4b4cb4b70ceb36380f870e68e85f3121a56d91f08f5a84b6fc7d06163ae16949e8a0f2f0c19716676472d40d1fe3eb6179afce70d4a381c60c086bfb2742f9209ed069064d4ae52cd3005abe930cce9dc94109bdb12e775eba475b967ef3bfd627daa89da30d2b46783270b9a2f769da5a32de8f66e21268e0e7aac1190c6e36b3eba0732bf7aefeedb4fec2f39d5a0bce32c5e7cd13b5d1094ef0465d0b03259cffddee269735ba04b0130cc02a3c76a2bf05954741746825716506abcf80aa2734077578aef485ff571cec042691bfaf3b40ffaca586f57af7992e7ede45b5c60d69efbe621d75e731e3768ec5f0cfa573f65c80c8199afd3996d63fadf8a57f0d47f1ec416960fccae9833cd48f0017c8d93dd5283da8112d9468a61f52f760daf6cfd228e75eefd9aec173729d5dcbea4b15dfd7fdfae0a7fe62bf9b3fb30807aacbdd591baaac1742c23210acfa876b8088b4b4a62807db121354293751fd556cdc6c946ad2c21201a11393a0b7fe217b861a5a97029440c8f9bce28d80800eb117196f71479cc446675901d609786bbd21267b01c509901f3e37035528e907ff04496a04d33719f972bc6cfbd798e833fa0bd48de981709e865d57a8b9a0e1ebe20041a8150e9adc00303117ce753e68ab1ac3fb539de43a0f42b60072c272d0441a0f6ceb7a3b0871496694d5380feca5b2078495e6fc05c4d5087b865888bff6a20a484b7f204005823c8042def4692358836aa3900b060d19968f803e3e747f683bf09cc241370634100637c29a1e6beab64ef4c0145af8cdc93eb13a30438829024bed2a900fc86bf3336a8cd2c150cb94116a798dd02e2458f382d99044ab1852bd50bca67b80a6377135226cd15216e53cbaabc261948474a6b7aae1dc96d5ca01e8dc1efb67caa57bb2e61230e6ce8fd5374bfe8281ca232ea4b208fe979efe16be77018bbe577a39ff6b3cf95c39dd4d9ac45a2c75c7fd8f20dd952b1a95a4f15ef6c18625aa0181d6f46b2aae045368400d80f0f74cd7b2229c5f207dbf39482a973c31338d06f4767da301c0b1d811a1453d677a81312d770dbc89dc928d05efbe9fb8a18805a9627ddd3d847f78951695e9fde50d70e0a6128c37fba5f7f4fc2f6699cc6e4837fb6d001d095b9295e4b8321fdda2871a74529c9637ee2d27c120b0b708178d6b3d8267e54ae5408ed6e6065ff492728090649433136b36718ef34898defc5fdd0ada6694899e30e593b097c28837336841570b6e059216b097d60492af05605c8931618047290df266de3d02ddbe58b0d17aa0d8a02432b90e2fccbabd79aa62d8e5eb52ef0e86a87e8a577853840223c8ed53c4be323b8b54fffa734f0dbbc4a63179ea20fc7290d599efa687fa8f4210c668746da1bfcb2077f24ac23a9eecd10d6545d7f7ba7136c82e130503a4909e6b0944a2746dc921db362de8f1d6e18a64f9bc5824b4d089e64f86f8125d8225cb2db4752b311750413823b61603810d9c9c82e94a3b6b34bc53d43ff7f332d4d2b02b1d4bb0154070eea832b2b23c0c9a5ea0b582c1a82442c7b6c075851c6d0f1d55e7c1f7a8b84916648fe180ea2f6bae0e0f90c5530c0365fe83bba0b2906be4d40eb76a53920751273ac088f5edb17678611fb2fe4ca27e2ee787efed70182ba281c3df61abefae3a46938cf332e90c15bfdfa55f1976d50914636b292a70d1a01b12ebeafb7e82efc4cc87877cfd2e9f7975f444cae3b6bc5bcda7fc172038cdfa2e3ff2bfe1c3f55c0a47aa7dfb378095bdbbc2b7a1bc2748ab2cd65459946e3bda3bfcc140f4b34a046d4b34a56d1cc3ec24ea5f444e67ae34d5b13372acb4544a09d7818ebd943c1cccd700286fbea2f7769a4d3035a2e7123da8e6ef2a1adddab209eccda6376c03c56023dd2fb24c23b674c1aaee7a9e0173094a185afe5f75935e0410acff01e3dc88ad6394511a2c57c071888e59054ec50f4e134097db6f3c15c5015bdf0e3c1b5786002e733edef7c8fb9250d7e31ae4ba16101e1deb6e58b87d4f7c29d031509396869ce83b2de4063502d52bf60c4405a9c87383870732d2752cec9c9c84e1f45229bfc6d9eefe25ccf22c5dff49c6d2874237390a63d61a3d796f38ecd9fec34e1b591e5c4e491d16e4d24bf333b09f6af658bf227a2cf13d33a2efa1e296738dab17ae617f151f6908701b9f8a0574bdefaa171122420119cfc5a234af4434f327b4e3afa33675860d90da6dc007c829cf320386ee14cceaf0538fd80ad8556efaa1e6919ee3d53b2f85fae4542fc1c3f9721351cdc08ead805c02bfc4483a0d1d452c92812030dcf5a80936139bca171b1d7be5ad8ea34c727441fdfacf065bf9c4927e96aec1bbc50220b8ba122717d6b029caa2d2f780e48b89b78ca8d842e07e6324b244e953524765897a26a5d73deb94680e0848aafa9b4cf402ec898941e49554eaed0602d1d16289a4b72f0a77cfd844f19164e8ea404da4830c61181c5f4a238a0fa3a427dd497e5d636008937b9826c5c85df6879ab55af5001d7ea4c4ac7e83775c80f3d08316c83b3fcb7e6d1dcdc27c8a350fbcf7aa866b86e515193023ab1e9f98859317acfe138a69fd71f7bc19412468dc73b3299ac926ea815b739402992f42d7ef34e0dc648ac85c937ae9ac82925ca68b12b37acabc75442c34f78d53daf08ed45037aaf5e78a1be5b0ec3608617b44c0675866c99875f707264e5aaa87175587167d731dba146b9390f85ac3d035b46f63c28a38b977d7c4219bd731282a0e25faf0ece95a243e3438e28eb6c22ea18095a2929828d35496b0c503bd5b9419cdf3e1dc81b77b9413e612cfa486c34a5b1f15e072f66e829c36df1ad3cf0eba80c415a9b1884965501e782e8fc2c5d3cd94a74df911fbfa53e9ae2f9d9eae8c4b1122abeedc16c8d6fb5019332f2cd20c367352df3420556f1f363bcb83ab001eaa9be830d4487074b3995a008a9884e73763346be0300b8354a45b363b843c1c8def716d750f476d83595a1ee8c16659cc74723488282aa31ed96cde6e0ac8662e232b7a28b864a4bb144caf05d143bbeca80ed475f0b63dce349cd41c73c96d09735bcdd1c395047c9cda5cb671cec213c0868d531e6f34cbace768657a93c06d12140f2dc500e29228b9194db0c4025005a25903415f5ac62a8d369c3a7014321686303950a0c260461ffc3916bafaee3efc915ed3ccd9c2888b1d717a314a4370402c61ec19a4b99239399250c9cb7359031cbc1ca2248594b0de8cb81ac3974fec23e4047460c05ebe2ec24830208a2eb6cf1c9e58fd772da812a68d37a57909e81383b6134efa026ce06f89402b702cdc6502339e9184a96d52b1ddc5941a6e539fc8dc5d159a2bddda5677a1b1615c6f52b517d55bc8c4be257d829fef47ed5e06953d688bb067e54f0e79c3a2c337cbea045cd6ab554a52f3ff6f9e3798d03c458202e3ac281a2eb36ee1e8b6883542f28b0eacacddf889ef3cb7ea909f106a09074b435e32d8dc3155bb75c280212e24d18a129f1a5b6d3a9f00bdb6f2cbc9012ce7e17ff1872598cef0b43058c6001a497220339e4411692cbf198fb3958b5d4d4a7d4de040cf317a3f02af297bacbff74040fa54177492145aa1b85a6c33536ea91b90e795c7290cd052ca344ab18e6f4215ba2557ebb2fcff0889870c0a8515c0a218e7216b8485f760daee6326b3ae82397382fd19f72c824fefe7ca2b026a12b8644556bef212c32f59f67ae2cbf03b05cd8295e800d065c49c8822fae459e0abdb2004ae39ba702fbf37c28caa3851a72d09a4902c7b695b1af311c71bba73189b8062b9ffb2beaa2331b2c157fac3df3836e60ef6f02cea4882af16d76115ce9a6ef8d3abe59914921a1e287c1191ce99cd115340af621c3fd0aec3a322a384bdf2206d5cd2952bba42baaa04bb19486399dd29443e19408e9f46d717558b00cb3ef64847742634d3fce58f4a683b04e323916dec4c1ee3222b623b1333dc04058a2bfb7f1a07510caa26a1cb66926314282e8d0dadbfc66d484a9352baf2730019755351687cf8d35df38d92dbff6674a32accc68506ea2ebd96d1d9fbcae11d19b613a4fb0cf3c676e45d4e72e720fc3fa20b2bd1ac56905e08d865f3f38f73575156f67f68f9cb779a02b6b98e3e470d64aea4523019867d9bd0c73d38b188db8048558ff05925df0c29d34b3497c19ec8894748a46aa064f38d4a5e19c3edf050b61962240dd6b9724ead64fee7fdf8e3481a6660c832324a98e21372d36476e641e027a15cac334612463679a8848acfdde6c895a05c915c0c3854b15a0eeecd946fbf4d7843c58f4590f59ae7d9ab0cf25ea854ce2017eba9aebdecc35a67cea0bc689d225e3ac785322c90708533e960bf7404cf5c992ba3c00da93b4d197e58343357d6eb1295dd657478e6206e51b514efb45c2c88aa82dd8ab5f772aff0d6651a365102186eb950d28fb98dbd0b78eb1150eed8af18f518b8455485d97701452d1a7423060f05b770e2be03cb18832f9b180790e21da92c48cbd63944ba0aa18c7d417cc37b729da9484e5183b06523f91140da174602b9bf26509b99c818c13450258d54db899a2a32e8014823d655324ac4d4ecb72612de2022d1f62a41c1d2f084c698f54c568e5156212f00de66338b9ca74ec0621981e6870b1e003166be7deb4d7806c35e53362b63247fe53938bcbe8e30db82fb43325b133d1dff9d367ec0f52d51f91a8f7ffdb8dc5d49be023b0cc1409c1e23b83f4b04dc4d6b6eb3c6d44c44e83fe5ccd730f2e55ccfd78d959621809c37165e18045a7640e10b0e620b78896b8ca94c19fd3b0e922dc44fe014ef9f8d6a8635e13ed1d9208819b14493f8a05f7f4a958300dcdb05737930fa8b32798bcab709363b1db5eff7fc040857ff6b60605cfa11e00f0f0be2a06b10fe5dc12c9a8e76a652771b9407b3015783491d37df490eaff2923b3b049c4873f3300f638d501a31e0b284ad42b8fc724a3ece63aa63a504401d10c334e2a7019ab643a14da5e49f5974274d99a4ca2234681279d43335e3454699b934dc94838aaa0447bb8276837510feeeede2c60bea96218c9bed03053972979b79d623026179dfe07b2d3c38fa371ae02995c474c96f6acc60aad7f46c8a4dd3aa7d29df5c5bbe9193ab95283d992eccbe89af29381c2f19a51a8b2ec2b6f96e995e7c84cf5b5ad72ae8caac7f2b30b617bb7724b2a337578be88880f99b4d1c652578750adfaae5ea2c9351e0e1cc2b7a2c91a680a13b3aef4326647b23ac8603d2b3b6bdc17ecae2a9943ca7e6cfe7aca902bff1f749bb3b3bff6cd482357f31f2ffad0b8f18c77291345b0ee126ed10d5950eb478544f3bf1608788eff52aad4dc3d74c473e70c309d3d4d39d6a5c6e9e1ade2caa88966a29b3d95457c25504967e2910bda9aa6913fd92afe3838556acb9aec334cc40a1f280c6eb2e0db6451ab76329f2b1864b32fc60a9c8dda3a3a3e2555ab957614688a99d74493f6013a8c5b5c4c5f5d8bacea846d151408cd09cbacc940020f74c809ddf9d1f9c4a7516de19c543d266a7f67a1449151d84127d0da7ba07ac2192aaec54d8c9bcf8c00d4edd61386865c0929534cdcba0b5bbcd3363aa085d752cd19c11f2b161524e9f8929d0afa3d25c7c2528a4a2fb1e748258351df836ccea976b9d0846443a46e7fd39b9e9cfaeb6c7e7283f8875198508e2e0ad73e0235792e0262aa6da44cb7eb3a2822d40cb35dd593582763b95d6c496da771681e9de32bfe0cd3727d02750574a8be44ea33d29cda5abe7dfe14424299521db2dbdaf831532ab211b33dba24055eac8dfbe53ba3b83c1b8259489ed7202fd2e0dbb4e2cb7c08c4e1caed5e03bc5613b959b2ca56511f4cb04def88fd76c45247cc24a68195e579a4ee765c1e90d55124691b3e0fd0c60c24f66a9dc5384e49d5d46ed3962e174436b3bb7f4fb48abfec5a95e69fbd67e8e8e673fca8c93b445b23c058449684f6f4c0b646335ccefa387591ff7190b1d74e95c67cac9046ed3d7026ca1017a011d355f50cc419b0e29cc6c9777026aca732158c525612e73fb59c837430a68d4942eedfd55d6bcdc6fdd7e9191dd7f122883188490033030fa1100d8a57a027f2b46b66396d38a60ac165f5d28a64c7df63c33113618472b62936d6d6f2965925206470339032d0324549964d2240455d69473e729e7bc5556c6c536b1b22cb6098effb03229541bb2b25b45a328a5b6a775fae5d4d3ea89f5cc16685ef445af5a551fab4daa0c4b4d529b702e025a65ad2aa1a65489ada294ce4927fda4f0a439c67c7d6d234f730f79da419ef68fa71df4b4733ccdf3ca2a8c91d032a5d96ddcaaaf176c5afd6c1e4260d9412d9b49885a6899ad1aea6a7c7c67afbf2e98ce3b7f5a49f4d5364c738c76b6eb37821941e82a0d69b53624a14525d09ad5f8e82b9eac600f95a029315069822dd7399252494aa23f241815231d1f949c68f39146a586b71f695482d0a58f56a9adb452f93f2e497be0108507214328e0e821c9914f091db7261d70fc10853e8eddcc3e61b02979c3c71c02d37f133aa48ca060091eac52c0c107c484950768500207271c48e1d8c91338cb710b98a1880df4d02245871713902822c48b0d48483539c9e27232c56208524c8c0f38ce3a59e2ea9aeb236d8a45c289cc73328425a5490a521529452e182bc0ed732716ad783873277bf77a6109dc7b9ecc317a5e6449198a62f536df7bb30c2edffcf3ddacdbf25a61832c304677534ef7578339e1cc0036773a47804620ce97921773bcef06aedd94167603df29f4d24c59610bec30ce9ebd12b4f966064d9ec934f9e763cc2854efe2230d4ad47b9c748130c39a13b926ff3c37bbae418e9527d860ec0237b7402f773534e00970e67a3060cd31200c0fce39730773196711640a07a86182121c8bb67f9a1fe0cab1ee1b1003c61fa1dbebf08606976d96c1654b310803c629614c982f33bbf1014488c93034bb6c1dc528ae30fe1821cc9d0923bbe8e9608633db2cf3cfd350863733b8987f3e1bb8cb358603d2588e046a61a974ee74512671650fcaec6776658f5e1620c033cbec73a7a300cddecd2dbff0b0e8bb40223199159367dfdf853119bb32f2bba82ba46de48a5dae3953b0675398a6aafa8ac70f2123454735282afa65eeccef232eeaa261330d63e17bb903e172aeaea3808c483788797966579e2e1a1978cf959b8695d9ae040d003d973dce4583665618cbefe5cecbb773d1e8a2f9a2092f2e32637ecd46d64583865d14c62c60250d4aeda7748110f3cfb55cadb004d946dd24b6e8ec511929cd16eca30c7c6cd13ae02e8a15a8d32166100158c6f98a1acc0e5e781bacefb1f0726e83fdde05deeb36075e00745e9200b4be66f79c301606cf5d18a12306a255c728678cb2e90db751204f721b95dd31c61823b63f6e62545272257f72a5efe65152fef4e4522ee54f6e732957f2a7fb24337382a6c6b1ebf0d4353aaabfeb4f5da3a3daafd7c31058e6a60ef0b6a9d1519de2a64647b50d4e8d8eea9beecc624b43c0855c08cfe11bc26f9e8394f9b37cdcda0e2b93dd14fbcd73f0264c1b46e5391ccdbedaecc76c369bcd2617b27c586bed919dcdbc4a27adf3aa7378f9588ef967cc36554dd6e22ef3b85096524a29a59581f302e7a3e3cc9d2e83b9d3b8aba08a19f48978b9f3b2e7811fb4cecc56040514c0e66b18021292b5a11ce802b4210cf63c31a68e071dc2c0c975ca48e94d0b7ce52b39aa16f9144c650f1ff22b4ee4a3721cfc061fe236780dee011772214e8377c0933c88cfe032780c0ec461f0179c036eb3d96aad954e1e3cc993b0cea4346049af590c4ee44cdfcd9ff8133ff2250e84dbdce64a2efb6ece8313b9922bf91367fa6e7ee434a7f913a7f9137fe236b7b9cd59f027fec46d4e84a5bb129615cd1bae2f3f8065a62f7dc0f463f7f377c3fdcec377c3f37a0dcbfcddb0fcef86e3bbd26d0d5acc0d348061a0b31f6de0b60883d10167e24adca8b3a4d3153b9457b06f560a960c2be310d63a33cfbce263ac155fc349611dd67476982bf81567e222f0203c0877c2498a71fc846a3f2a9e646b4ec19944fdfc88c0b138e5e7ec965d61daeb50cf5a34ab50bcb558b8b57cc41633bb938e9569ab53f1318c1d8bfa15d7cc313af8c000d3be807d9cb1d628aaf98a4a421ba66af02dace0ceb2c30c5e193c0b8ccd026b549daa5e6a55eb58cdd7550174bec34ab5039601f80bd6a9a9336b14d1e4a935aa46d17c87392e4fb2303aef813dad4304d63a57b0ccada80e055f15f7e12bf806bc8707b90a9e82a3e03cfc04dfe13a3c87e3f01b6ec381baaf7c2bf854f035f15d7d29f850f031f1597d4b7c4a7c497c5f3e24ba61ef49df09be23beaacf045f093e127c5e3e2306009b9c95f49ada0adad035a35259e57d357c3d09c7f8ba7c52dfd427f54d0d7d5338d67d521f97fc49c924a1855209e47c50df53ce77e59562ca1044af2c59acac69262172e1656eb2f25d09ddddeee44eeee44ecea5bbbbbbdbb9d068811c404429a773d73c547230825bc191866546c322cb5e05d3aed41e0b101a16a138c33e81b39576e74e02125d1ecc3b773a0149b5a4d9a425cd6c91524a2b6db7514a2975efba5ae5132c73535a6bad61ad93522a69a434b67a50a7c1b4522a6fd71aa294d2171aaa35c1327214a6d6ae5b5568e85bada1966c07cf818873ce49651f73cc9cadb4a70311638c31724b7ca9d65ab160e1380e8803e2806cb7cd3eb8118a8f4617a06001d5a07065f1858aefeea6b2f86245e5e2c59969fa93826996b9b34f90d15bb1fa48ab8283209a3bb19f3a2376795bc39b19a14f90914f90518d47942e9fa0d9dbd027c888e881a64f10d17b3e4147d6fa04cd7c82e8f5093a9a46ef1354f43e41443f5d3e414451c62748365ff1a9cb27a8c8278868bee2cf17478315aa182b48f3721c27a3f7ce9d1afa7cfd5c0f019e3966e94b98cb31fc5e65a53e3ed2aa305509e28192843ed2ac305541422d942574da6c95cad99536cd97c4f22557f225bec46d3145b8124f722caec4935cc9af70b1b1b32a357696a5086741b2b3215c930126cb0e992c30c47ca45511f22d22bc58ac666b2d655190722c5ac149e7e4388ee3720de6b2046138d76b40fed8d93ae6b7e5aae5b9041e131d97bab34b5a5c4b23a0d10a03809494b0b1a3c811a1125197147eb0b1846cc9495daab92a9125da92d173dcc75405051610532e19515af245e5e438a18093e30b99c3711cc7e57c4df413a2e7d2e0a4f848a3524585cbc7729af01c0ab679a982e74fe69c53c553596c11e5bb610c00f0f2862f78c994f3f2865984ffdd30f8df0de7ef8657bc54f1f2862db8df0de3dcef866fee77c336df0da7b8df0dfb77c31f0a1b1f70f7b12ed6fc77c334f7bbe113df0dcfdcef8665ee77c3f8e50dc7bcfc6e18e6e50dbb5edef0fd6ed86bbdbc61d6cb1bee5ede30f7f286ed657173ee0517032adbf2d0b197e963f6e6613588c103e0bd793d4bc7e2c3073fbfd7dd0657bc8ab700e76fde73dd066d52f87bf836f8bd277302c704c2d8b9c635a37b79e23648f31ecd6df0c47b35b7c19997c131efa5b80dc2bc67731b74bd77731bbcefe1dc06bdf72cb80db6de53b1e236d820f71e781bb41f6e82eeb21381e9471a140d5032d07a042a062817a82a92ba03e5a2eda71e2c2815bac6d1c10a609070afd569eaebcdd7a7aaafb5733c0da14585167680d1c20d12ac40c3c22385242a2c3ee099c9891e5c4629ae4e49bed6271bbece7cad49bed6eab0eee905d60da71ab83abb56a71c6274e8b483de499d803ca594d223ba9bddf791e664e35118517362aacad244ace749e8f9da45ce52105025341509ac67be6a76116376d391efce5dcf6fafeaba6b2af233d3ce3fd29a5cf8131f694d403c3c6b1b5b6badb57e04b6f6f5f34214243721281c5137d81f1b4a38cce0831039a28ce0c05a5b8fbcb5b60ac71752a3a33a769132deeed6ac4b74263896c10b4000f1458cb17a70730473429c1aa6f315c349c23f34998548e7741de6cc6e931d4e06e94d87b26fcda4fdc18f78115f722547e248dce6465c8b63b11f785a5c93ca48616ce7a2304d28a560f3a84f94a2f0a81a831773625762cf2f584fd761ec1ec31d0241da82630dc43563be9552562fb352cd9d9a876445338b646b36880552c19ab74ccdc31a620d5926d69050f378575367e61c37c8caee0f5b7483d8d91d6291ae115bf3aca0861ea69bb350538789c56219993c1da4814c69203ff3957d64d1d97cc99f24d3c73c6d1f9b69daa6a25cd06ab98e765d4fd945cb75ac183b56ab2574e9bd3de56d79d7156f74c518d88d20cc1018231f73ccd0908f1983b149f431cbc866e8cc4c4f393385e62b66ab2f57565f668e095485743405e9c8569b4920f2870c2281c81f55fa98535e3ee6a69afa52d58098a78b87e1221ec1a494524a39bb29add5d26a2dc7751dab455bad9eb2c5752c56abe579b7e5ddeb72c1c0c44819137325c657cac85c3973234d4d4481e273eade53fa0ca39cb9f284a491608c4a14351d4cac022f736dbe62d64088b705f716a8ee9e41cd9dde1277bab913381c91c74ed9aa0f39153cb0535f11533407dd41000e064ec8cfdcdd1c1007c40175777777dceca0c9d3b3a2f8a233d28f5a901965a4a988623d60cd7755f3704055cf0101c166cdc3b24d9d99a190a66a5e585f585754ac1a073469b7bc224136d06c48345b905a35d2dd353f6bf3e54ded533ee5533e456357468c5629a4bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb0390afa84470d2d756229a01500409d316000018100a8ac301398a8469a688ee0114000a5d8e406640329387e270501818c55010c3500cc0500c82000804410cc551188c69cf460020f507b8ca253bf59991f2e03b1df20effaaa2d60d730a1f70502bc2aa3d7b2f23d09c158c9f356e963da1ad3a1008d37b6aef9fb419f32917109e4dcdea9200b04948b857114521575d4261e93163155d13b9d7c5d2db5245bf3cfcaeb7d8e49881b1ded6893b5d42a1f3fe4f40aef347f2999511ca08e080089b086d50fb79f9ce35d4e45c386e4463cc0908ced846326e1c8eaa11653132376bfa9c71a0295401696fa807b156a4907c38396e0d7921b9b153b77609ab908bb3a04156342f3576151f635380c2ba8b469d27dd0a2011aedc365b0a86d21a091539f07069e566c08e9bbd129c7e322505279de7a7cc30568a79c1578b7aff8981d2ef33595e86c2ff025fe6eb9ad09277b93e016f88130984d00846d26e06a89b0599c9e9e2f632a9a3b356592d58256eb3f886c73518e203b64acd1068b2cc2a52f59fae05d0e4316aa83bb373fa2756a84148a9bd806d7191575927c54214b4d7e3e9f2a4410c05b41a6a007c6b16857ec646ec517a101ae219851ed94fb938bb66159103eacd92a146017d8e8b5ecaa270036d68d7bbe9f14448b6e7641bf965a444e1f8a3c29ba9dbcb13eb5bfa8ef0019c86c15bdeb33140094e06a62bc88b5fbe39cda26d6dae799e20e80697561fb43a511eef5418cbd5e021fcd229e91efa6bb7e6be905d68b6d4e1a5d80b240fac37e549e1fc5cc862aaa9a5eb8b1f6be7e09c6ff3d25be3b42b514a3393857f98c5d3d731b17ebd25bf5fd32d0f06d9cdbf3a57413786f4eea5060388a993faaa6a75ddd0a603c7f52e6de1599e72d59a8fc8322de34be2fc5faf0d36fbd1a2dd559b1bfa72ae39d1777a2b00cb0dd3204b7c2f18b501453b4ade92e6ddc2616a74991407efa201f974b42d5370045a645bf91518baa8e95f66e435d690e2a1a9dd4961bf09f6caa2c2bd08c11f0360e0401c998aa44e3d08922ceed09f9e3e2f881f8cf33b5ae36b0f2dc0d92bdc8bef705aff6c7b0491bd75ab1bdabe5b69ccccafaaea8aec1603335b1b38d717c8800f1b41aa94be4940a4980da4c6e11be1381655122232ed3c271eb580b2fd002da468fdf20c821aa67ec8b5a8e343d4cd54bd6406e28d77c9950872349b8ce39dbce167e544d68addf4d10c9cec2032551cfc2e26ba9e811651ccc09729fe9a745cf0640b3d91a205c719a316528c92ff9b834230575c4383116e2c7ecd74f2c365c0f67bff74d1c197836e7f802ea0e1f9c3e987ccc25a2d2515745aaafc00137f0105ac04231333f63d3ab502066d8a6ac4e8c9628e4aa4452829d66b064ac66468fb2d7b8a097700d55b691a729082372a17ee48346c6f32cada04dca5b2525530ec2ee41198cd23b592017c79072d01c48521bc31e26f2b589e2e1b0f0a4c69a528e7c3507881d1ea39337e8a6a442c4fc20feba9e5dabe942bc1bd8c167c6cf8bcc11045abf768bc045369f0845dbcc8e81f92277cb968ee1270c9216824fef9c6dd0472c25ffff6b2c064f811dcdedd2218fb1294377535bffee310171604522c0d984c0a5022a749cb43efa9565610c6474c0a16a49bd9834b8749149375a29a770e2c95012bc1b08f0b41ac2ad958d272ab31314853eb01b99842586092a7a2e8dba383159cbc8b8904140ab8f56b08e81e2011fea8c4f6048e5122bad8baa545e185af42492d6661180b830543c387754ecaa3ef62719ff5fc4181ed0b73b4ef9faa4442a2ef8c8a9415793f5c036527e88297fadce25776b3ce240ba50c0c0a3e60730815ac0a03d85ccb857b848545b4e51370b49fd28c36ef2e0b57a22a707b0ebb1b9433d29342bc6749d9d0e5cca870591c8c5bbfcec5d4f63a35546083cbefe2d9b58b619a4deefdb43daed7ffa0a667d7d8496aff950f2d8346730bc22371aa6036b2c525ffda4a404c0824ed8499c483a9397720e8d357b668d9ac684235407bf67e58f3002bf60f6cdac0c39db1f32604ed6f260a58327f7e853b1a8786a38fdd015fe026167a1c0ddf74d8fa27c504e5f0fc68d014614d956909c798ebaff9989ec9295544949a21f1f2702e0a315f7628ad839f916c6b0ee05c87aa04cfd5e11b9806a4b072ffcc4f209e9d81ed3818bb93dde2f79002e06967e58d87233042e763a833b6b89de42311fc13b8a7a92e084a2a9b7082a58953eb164983d7eccfd337761b8bad4fc42bec48d250c24e18568cf87d9b0a173c80a236e800f4811385c8e45a00907b1ad5ad5af59ee17ce6351eb95cd62cda1fae887270cef7bbb11ae0f05c2572a0d7fabddb8e903b68a2565f7535640ac78c09d0d9e588cd97603f649512b59b493311af11eda38678450fd871a146b53a13096cba6ad4c84a1fcf8e5201e05804a684f0d102c6d1ed73ab24982e4f09cb03df46907214252414d833b5dcc77b4894d38a41212130c15d0f49c43f6335e4df2ea41a4767b3d9d669a84920737c45be4b312cdd9015e1a1917a57b2b8c0a669a31f593fe2673f4518979d09550e1f6ceb9c9c20e2fb3fe63bbc26ad2716184f676b7f03342934d2ab45ddf28abe1d86e2af5db92db19b0a2c477865424bcb9a11ea486d2afcfdc6f00f93e0fcf499f3e2044c33620855c46442c7021f7d33b21a8949fabba978f78b44a61f334cbdf0a9e79bb868f593110edd33ffaa4981ac13b5508b396590574e12f90bc25d48ccd9dd53ee092045967016c406e618ddccd7d8a4fe8c382c834ce727b2d52a862b4fcb3d98f880c6f205104a7e029c2e40c65d0767b6899202acf725a4797102375795ac5cf5cd86362b386b1ce9b897ff9002abc9d5707a611a56f351e6798617a06bd6418f1e0e88ca17f7c0f4a98b55ab0ddf1c281aea92afe8aefefdfbc216c5ba8eaec16928017cde199e76773bfa251e922393107d2295fda355a202c628095826ca8e81c406df0bc4f2ce5c05b3d43cfe336403d527204e1b534449371df27bca9f2cb3d8e466c01f2360e0fe809fd8081f8411da87bbc01d12ea509dcede385352638c26c8619728f535a6c49a4d8efd79c2ac9a210ab27d159c9fac66a228b70f4fe99deec993e2ec6bb10adc6c437aca53b25da23a4dc2df79c0c176ddc2fa1a54bd5f54ad5b2dc32faa6ebdb94ba8b308d2660dee1491763f30692c9e5dfb47cf0720e78827745568f8d63b6caf8f14be1ac5b23589f7e846c72ae8d5b379ec16535d228f8d1c0c324c93ee2d63d3d1016561342eeb73ea0eb0116a8ce6f430e6fd346afc4ef2517f18df6053d674b746556d80b35f245ef3adf1d96cc23e331a49b5499266f34c9a4d499e4c9b38316902d99d4dc0f53be79b4ff3e96e92edfcfd456a2e5f228649dd469a8fe720f9a678225f315a084064b4d283085195df4413010efe49cc3bf589340a9e90a43c451af96537db15d645954e45502a49182e158ffc1c1e99249b6213f99f4ca7ef6d0d329374fc0d31752a23d21c3c87e42bc513f94a36c294ac62ae666c16b629b87c8918367513693e198ee97b06f9c89bc743d24ce1477ea02d66e79889b00333f0d29302f6823fb886f4ac41ce319120a8f9240aa1c7afbe7dce34c3effbece272e43c53e154bccbc2fb8b257875c992386c5cb9aa4d07b6a0afbb66d6517d1e59b1999f81801d09876391d06eea13892ee956ce277bdfdcf055ab4874d6cc37ecf5e716508afd7f3142ad4e6c320eb529129d589d97a10d875bce005925985d62e409da2fdd3e48fa501163328174dd81000c60ba3aae4fa9580bed46e525a19ca3d98d9a9b7a4143fe818a5bc67da654f7f57c2725fd5caa821385131204c543765292c170ad447ab17fc9fe5e5300ab31647c2307c174decba5a9cedddfe7abef2a74a7e384868eb63a7e5bef256a9fef33e329484a6366bd6031610e9c4ae5f9bee2ff5515ca89880931c5234fb7c6f48727d973f723c2d2bbb2c9d93a308eedd15a1ecff1b561c257ccd90dfe5310ba7ec013113516f8e7a406c12cb07f65f7a2fcdb91abb22c851261aef89bff5e7b2f5b104b2590622a5a325f7a7063208906b79f8243a1fccd2ede61eb4973b60d7d0ba7508b2e50905540013dfaed0b7ec5619feeb3e152278532f3192ce2e807e2abf1ee807896601dc40fbae6bedfa99531acd57cf0e0b420aa61ff72347d2239b84e267117eab906cf2e4b25d71ce3a7c778946ed7497c286346143f5ce6fd190d36255e962d6d31dab5d7f160d828b498208ab18706385ddfd4404b1488aa3a229f2cbaefe36a8a69463112a19a0c38a3513ffbd87bc78244f065587db7ce699fc980f3e1a7c5360929b7a9e20200f1c46922bef31f72acffb2d28ac85f6fd8f0bf98b80742b6eb9c187bf483a1614a2e98c0ce87f50108e3122b890a3c88be1a9c077e90a4d47dd30c9f0fb13e44ca71de08911da9e65e7205fbe82a6c77554c0ad986742269b30a038d45d052bd96c36256f82a584a15e3952bd654d329f952430d30ea61a626e7c72bc3add3eef554e29da1444278478086bff28ae2c9eec153f2a6fc529672ac945947582813f4be2614dab077bc8b5fd2743c799d54e41fb629f327aa81db32707d3837f1df4597d3c2f158ce5ab9c2fb426115d4250aee50fedcf2cd143cce93851769940f7cf1281fca244e10e1de71f51fbf254c987143295ff387783c5df67061f3c017bd06e18efd8dfd4dfb6163ecda20260a993fe7f3b8e5fdd16a106fd8773b63d7c62791c3fc60cfe296f647ab4318ed8c3d1d78459bd62418a843bcb11bed8c3d1d52c58856e88c6a10481b6347474bf1a25ad5647a67ecdb102056734228238b4212da7a13c731e514ff50bd76c0fd59203ac51ffb864ba576358edd1b37bcafae8d38bab963b6441a852f0d2c5b554de9ecc3eb715877850e2b4af5d855c7749e39b247867a04290ca5844a2ce0012a958b1bfbea3d481b78ab8131545cf6b3286ef54e38e97e731a6bff8c25196d3860cb84bba330b2772a4ee5f923681f32728351405a05ad58afeb76ef2ac0f88eb59b9e6584bacebc369c717a5516bea3ae05645e4617a90b1a7da2c60103c2aa444d8737db04d2b627785ef56713527ab69a0e6e03308e6ee60ce98a6940ea9fbd081c2b31028f56680bb9840e1aa4853f2d823771ef709b67e88c70ff68fee9c24d334ba114e4da2490ddf2e6c872b05c4d10e4e2b5b9c1af0e8c74876a28f4092ca1e2173113da254ce39b772c4e2151adb9dac4152c149118857261b49f29f229bce7af09d52393a5d112ea15cb8b917b76785b0cbcc101d4ee99ec11b4a43d06551703f0dd5a07af0fb318578559cf971a84ed9b5044241792125aa3e8d701f6ca1bb5291cf1ce94b9001258cf6911a0c146770618c277001c9a1a57bf39003ee90295456cb529a12669a0955423517cf80ef365257c5e31d565ac32b49a4c304fa6ab7e7da5f0f097d1fae29502b28c52db12f70d2f09c70a93c28e1c984dd510bc4ecb8c91ecdd4a293450fd6f879c4264aff498ab1137c9404d997b3d1206d9e0b329ea73b1d4908a424747e670141a4c5188c93b88a34a2bd1871fdae5ec29c418852fe45a2d49473f3c3e81c7f4a3b9e985a8a351ae49f5dabeec88107877dc3f0f0ad31035c31349606f54de529e4c8c7e8d62b18cf20adeab30b9b59436dec298a0ad816e079fafd29b4d508f0ff3783832d1c8855262236215ceb444a16e3c272caec7d2ca81c54374df7315f936d137582e2729e1e087969caea4c13d8d39666987cf34cfb12f1debc63eb6d496f6d6d5c7bec6093bdd11982c817d07483a48dfaa8fcd7b1573440be25c57debc94b994e1216e8b6e6d0d2af4e3cd6a231e70e8610a917bae51869cac7dcecb5f00a7a17cc7208ef2575a711387ea98240d66d70fd9af7b02041c6924a075446ca8c0b22342d410d5213cc85a26099b801ddc1d93c29cc0b973552d8a9c4f58f18e6468dda8fdcaffaa4fc756aed46297c2426e6fe3b58034abc2a1370df0568daf5618d531400e5ea86d1c1c25d386c8885d7e336b858f1043326a4055e1b00acf81b845e6693ff10e27da6b2afe8a52badd4e515ffcaf8f1e04c970ee6faafa834e1f39c72fdaaf17957db258125bc24f1627d2210b7bfe128e35c2790fb0bdcfd48ac7b505cbe6fd5dc9460fbec13168966b2738b62e77013d28d32f2a96c074e45ca11658d2ecfbb7bd5985c360432de828d820c19ff747b8595ee91fbb903e186805054def485ac4289adac9de65cddd04d2ee87ab455150312244be8725fb4015bc1bfbbd892d547dfc3df68d58661d22c51c4651bebbc5b782dc07096208510a20ea8a70bd26ad2f58446742567ea768a746c62d5c40631d9e5b55220738700fd92ca17ed29b80382a9041a12652e3cb9ed02114185655bc65b99f46bdd4dacefd00354f37a1651c48e4ddf4becb071374758af4d428a5fb1d7ae5a69f4809b962a1705bc6624d4eee8dd82933dbe986dc028dc165a0348b225fa371a6adb53a6e1ee61675058db207434eb92d591c934c54ce8d96d54f0d44eb6179ac4098751666b42c79fe2f4acd7fb3f0007f6cabed12bd491e49a9d0b9833febd64e408391c658ee2207dba8f804b8fbead2e989108e7f7b3e2468c7aff5d778729a2df5df409b23cca6afcdc5165960f1b24a494142bcf07fd6f920347d94224a2bb45b8c76724be3be61f67e6c5cc9503fc5d7facfb433d40ac7891c28a1ee986a13af644fad9942bb699a336b9abff1549fa8dc6720837820bd9273649cd79ac164ebe44cf008b33d26f9e47c41303d2612679a6b8d15f10a7ab57293133af76112d3a2cf0f2759679f9d3330073035b3bb6d52746d8a38fbf0e7b27c52b87c3c8d00f92914e59b9324f862b07557e8c15fc6c456ee8a684e1875bdd21b6cc58370683554bd4e85a5c59a1e910a004f0aa9f4b0366831e12050f688f3dcfd59335aeba21bde0c90d09afa3f4f04acd7042409698ddc7a374f97930605d5cd00dfb382777e400d05a3165c11a6e5bfd0305be9a49053b07e66a9fdc4ec681855bc278f9b579f000fd8e6d49cde8abf5491682f8ff23b5fe69abdda1633caa21c5774d61f8375fa43cd6c763fc22c1cd7d7c60cf449e0eb996157ca15deb57154e57aacbc8adcdf2ccf10050924d9aac73dc613817641fdaca064fa0433d9eddc0a3c796d61bab8c025960be193be8dd2b03aa74f4d4ab7a1f9bf18f4bf60a0229fc13c36f8c79f3405953da2a87508053ac5047448d0ceb627bcb604d1d2ee52fcf74ff00f3e0349ca515c3425c033f9301edca34ea71d91581076f337b1c29f22b1c0470b116ef639c8c502b3ec42d15dc0893dbda633286fa09ea80fa0ffc9b007e00b4400a0699db57786118444a6e8e64243bc5ccc43ad63b0a28dbf990f3f73cf489a19aa81772a0fcd3a0dc38366073a9a46f13c128f9b9e9134065805e76981263405e37e9af34fcbc292a6bb6d44485bbcbd0e1d06980837664e2f1c05cc31273c0defec73fec5a1a4043bf4e6a7843d4d7b9da7a3edac38918fe0e357bc8793abbdad3c038a3bb599e9bb95738092db3d5bac05dbc50f0540d6038331e471f156a407aa0c08a528d7dc09f1b7cacc0c0c1ae463c38d748dc5f5e131b1d470254faffaa319b216cea4a9826951fcf5e1053571684dd16bceafca24336b404ef18e33abe65e425650a99098df89a8c28a108937240cc403f2f51f5170a761a91501b22bd99ea8501ff6ef55f741325587182490981f5d806c04d75116123c44d728f8ab1f1c02cf85991df84745691f67943f2e96bd725d99b8478114cded3cc9ea0ca6510338903ada8cf9d00a0176a63c39aedcc0d15d395714f296824b0b8b49621b522e30959750f312d57eed0a3298e090cb9196b60a4f45cf85349205403c7ea2e08626e69ec5f606c8a215b71f7e672e9a09901139c5b5c9dbe2d36d5a76919a84f8a35e88b4d4ba98c10b36580013208bae1d4b34ce2e037ce790dd108371e03c843fa9cc8ef890dd485e741cc6d61746bad8e8229344c185e7a2309a55c3501e445e00ad02b46be717c27515cc93c5e434c115de8a70f1621014af9df1b9ff13052424579a8f24f84c77a51c13b20d4b4fe1029f4173ee7b6477534c9d02c43dd3580603407e509e53f2cc31a127779f76b4cca110200b4342dc01aafa558046ecd034eec23c3b473cabd6ff00b5a069d1fcf4206439450969a2c256dbc3bc03fb6e7cfcfaf589889bc32d6c4eef4ad30eb6cfa68ba517adcf9c029df059e9cca8a07d64443f927995f2f60fe891ad2bf40c03fb3683c830fd2be9b2bb4e62a41e70cd11ac4c796df83a4b34649e4e4d8b8042cd498f16f71a7664a9d5a9eba76a1132237f1ef33395ed5be2407f0cef05e9c1bf2142ec60d7dff648c0bd39b5098061ebde9e03b8f79d8e47c435275919ac49c28934977e0c61f8a35152ffe94b14c51c1b3e4612fd9e385ec79bba7d86442ae52c1ba91f8d8ea247620c94acd163d31a7a63639f225e53868dba393c55ece92ea4a0f0480210513f0bec9245548ab5a9697a080b4faff34ecf59aee6c8fc635814e93fc01f0dbfb2a310adfccb5dd26cc24cb4312bbd18f907d4454c6ddaea8ada707e44137245bc1b3f562718c5f4c9884bebeeed9ee8418aa295023ceba943c147a62937b5d0cc71647813e804d6c3c65f1f23b4b1205ca29785839314da8b09676194b4625c2f45dbe3180693a42189a9e3440e4ef561f6703f15a592eff21b9a0ec4261f80e6a07141d03ff21b2b34ca0f41baf813b3fffe260df64bd946b2ff2bf34ee292e0c5487ecbcb2f2fc6188007545ea849517c879f5a19e21dca90e124122e1704c484425447310b5dfa708c99bbd8cb9f3913909bf9e97109c20ede2a7e184f2414c8c996e4ed08113315737e10748764a393278b6ddf749aff1793463ac9b407e5fcc71623658138cb0c76b1e7518a8a9e010cfde8e3980de8af3928b580cec6f276eea84042b0e32e8080c9bc613c2d44ffefc2d55b51a2080678eb5b80b30648cafc8bc9f8e58ae508ff5c5b177caa43842bb1a4ae0fd8eac53e25d63ac254043341b2a756de9d3ea8897f35e794fa7234a0806b9202db8ab21eb08241996185a9fce674a8d7a089cb0286789cc3d2c98f5a729362642e982c5d7cb460c31fc9b860aab254b82f79960ad5af6e333ed7f22de088b68ff347612ce17d3cb4b4f7d1120ff10bdb0445431d76ed658be322d62ca7df61502cb438dc888b6bc579c165f85f80332b478dc26e1d8f2b5fc2e0cac4299579d798833ad979152a463bf866e59a10e7a8829beadb6aaabe8e80ea0326ea948b1b832aa8a590b66ef0fa830589cab8533e571e8444208e2f84ce7ec8107a24b740ffa06d65ba984ecd5917ad2dcc30f716f908d77d592c3e5f8dfe5ba1df55612d9dd2ec962c885e9da5673f4eab648b16aec63e0e232e7b9cbd0adcf4f84455651f077ea8dfb786841cbfdbedd89905be04960926712a33655a4f5d4c5f05ce0870e0f5e37ea9f0f1f47b3731bb52e2ca086ef41c79721b7c1b8ac3728bec521c42ce74226905cfc431671bf9077792d7822e70fabe2aeb991f803777721b16a445039a9e1374dbb167790db4b094a8f810b5c08bb0f1a45949835cd738939c4fdd8c970a02469c4c152a2e25e6d8115c9dcbae1b3d8364641c56fe5bd08d661fef538d4b520108a5ad5fc33018430800fd23bc8f51788816f57e11f070e51b765e063af36f0b175da22a9b3254444dffae59a6c77aca07ab8c6b94fd5ce3e2f9b675d1763702910ce0e45d137cd95e0245da6696fb63b44c295e6507682b25f63051fa4ff573de2711254b0d70b3911ed964cb6506c00701b2b606bc00c16e02113d710bfdf5a57722d5b4b7d7ffa08d6f02f6bac4b105ecde412295213264f5f9c5d38660acdd2dea8d3b0229a03f0313a812ac5205f73191c8937c75be610fb82e19ae3ac24125d320913422a59f8656a1115200577dbfb888eb152184e9161e892d9f2b297ed09b92216acc3daee5aa6c1d3ed6df49d7b42b8b7c4caeaa544110be1b505ed94f3b3c3e025f4763a29d0890a3471432ac2fed4a0a48034a3cdf1b410ae84b68d3f27332583e2c6f9be1f0ee019e1df4ff6544e427278e740dfaaea2cc5de67c5677e3aca52aae2185d7737db83d9b27b83116f6d121cd2c1214df89eee4af62bb04471881d50b089214006829d5ede30af3089bc19ba608fe532933de5d0bb5051c09003096ac4ead50d83fdc8c0f2a288786b985f6200f63ba990e8012a1b98ed36b4206c89e02c06db381f164d5d97933889037004cb737b2435a4a25dcd28fa7ca960031ac75f9ea43b715a77dd79581d760ecb70ccb71bb50386048477426e02cb8cb7fe50c10177e6297556016ca5bee5a6f28d7e07df4d8a1387f70e9739eb55edf3d7b9b78dc5d8e730901a3991805ccd4c233767518cbe903a9e04937fedbebb90e662b53d8e1bc52106927cb579105d546593932080a86bcff30d0c9ff54e3e3945b025788e2ed033d1afb6ffbabf1919ab2f926bb0164fcfbce4170e826cd7b5ae3e0b8bfa4b9729b9494b6e4c4cdaf3a2380ff6bbc2eb0665eb1b9af1d3136127ac6e3356c9f50291d23b2e3c483048034b14e054fd366711b32eb41b08144722994e3538f5f0e4b80d379c480c953540a6e026763621057609adb936dbdced470a32c86389867291d2cb3458cec2c10369464a5ab37a302d83125a2b20ec6a69114bc6534aa9b0faee7b1265e978e24db5b087149d09904cc87232fb647251eee591ac3763d51813b32f2ffd66fe96150a85a7de1153b35e8d8bef5db9a755fd9c1e5fbc70131941bab9947aebd566b928d4fb76547d85a6edd6abcce9471bef5d372a0dfa15e675ec501c11a7cc324704303048532e0918341ec9f0ea468288950ddf5f72f6bfd61906094fe16dc26bca160a71f3cf280bc64cc1e6b73cec7b9dc45f35274e0d6c9e07b052555ebadb64ce72377a8cdc76c7bc68d9a16dcac2543daa5b2cd778257b5be96c1c53aae017aefbb5cf885f23e28f5ffe50657df05ae92ef8d23fc6a60390480aaced0364f33dbc5c490de25c9806727864430603085cd23ab284d3f2950f74f22db28677270b76891a86d5900ef2a508cc7f9da42071c309ca06b81b5360f388720358a8fdde13c01993842fa077e73ec359afc279d4e884c6d98744d12980e7e1e3a5d32f9f7130a3b92e85481b59af00bacf4396201518b75b3f9b5a6539b7ebe0e134a751a0af61fb414514095c834e2a28e9673df047f24d15e4ddfcce4979534c660949e2911f3dee8ba35e5e8d5ee65b156c6793dbae8be0715c713061623bb3e30721badb33f41d0b222061a9ad7c2e84f6383ffacd03abddbe4d0a4b3c6062178cfed4d9155f711077090b7db6d64d01b564bdffb121e2095e00d0122f8e417c841b70c1a2b2de68d1d67f15961790f7e87b58c3f9e3030230c3acfb4a5b16530b37ccf518fc447f3fbc8b0f77652fc29db370d257046aae3f92085024408cc4489677d4a63cf60fa49c72e72c6005349cd00cd776c76cf408811725755ef4c4a8c9906d0d551e01104da3e386479b956af54bba73058771dce0be514db7985b769701bf1cb618785fe3cb503ed35061747280019ca7d0efe6e18ffd29bd8d77730f49dbaee65fe348d940f0884abb5e6a44f0f891a7950d8a8a68e17174538e6bf34715e0676acd7ad96891456485096a2f6cde4a61199b8f859bde5f59b8fa346353cdd922a4978b7857d5277642d9db03c18ab1e1367f51597efc0e543699ca33ce4dca26945a3dd441e5300f9b9a240d8e70267f0dc698517a470d22e102b36db976ba8cb6cbbc352a4b6d0206254b1dfb862c82808c71a0112f0c12308cb47d9e026b07e9185b8fe9a6b5d8a844ce73960f0c49a69d0bc6869ed78e020bc76d61ba20768252a674ec496c5f2708505356e6bc09eaa57102c4fd91bfb2589319d33c3e466f4c26100ab8798b90c3515285ee73d7977f4652c803846384eccfe42259b80dc7b2015bdfda76eab07f5cbbfa40710712c97cec518859f716f813716e3a014a3ace698d158b961a98f1e096a66e8576f025edc7367f4f555d309de61a128499f3e40494ca2ef05032f7d4a56365a2ee8c52dec15377ce929035449c3e9d41e2e140304dd41fcd22362727654f8ba5558e68365a923e06ecb1d2e3220e58eb133dcde8d03cf8a177dbca9c9f14d2ff91ce46573ce7f9bb8f09b9a5204ceab3a7986e93f1d0698c82156adb5f33c701eb09def8582d871276deae1148b1a3d5ab30e3832cf1fe3b40e2d1b2ae697088d05a75b796b28c17f731ead6a9a3ba535b8918de834f9d67893717374e45f2ed4fac3ae9c814f8d71b30799ae9cce0e9f27c34a155ca04719577127946c07639c9cf478ee27e4cd8612f54f3182e3858582c65a064379f4e4b8ef66063502e0b8fd57d9ebadac39818298289513741fd9a81b634b11d88a1e3de080376d6dbe97dc970e0bed5ecab0768ad1eca430ec4eb27c04dc383470a3e06b6aa612f9837c33cd2b146b1c72d1355d30a978e6408d8657fa70166336be973b4d4c5c25deb83257b467db5f9950796003566218130165704b920656273f0ddec0e6f67c1409d1a46a2ccc42d3262caddf3f99da2cde3f1d2e453d4129092c99663f23ebc0086185cf157c34835eea643904c917cc97b9926a2b7330971c36a4e26e98c800a94f6e7e743c20363d8bf886b2d76c3c801cc2781f2cebb598f808dacae4f194ecab02b894ba5b9ace7769a1f2ef4c70f3b6affccb9e0ab52372819bb26a20a958c716f4ce3f2277d3c4324924681cd41ad2c8259af393a11ef89318bd623231f5be90a45381032683c96edc2f6affa008c63fb304443a9cfefc35f7deeda87434e1fb8a4f18721a5be0a2f380f9e64ca5fa6b7411cdf64961f192291972f7bdcb4d57af2da5aef0cc9f926b9ddac64b64d0b4dde5c17f69a22c8721603a4180bac0ae88825e7b60c9f106560f0e565707d2f9884e3d488598715a1453bfa605dc2ca126dc2d5ef9166c9d96e791e03d9ad7b1070c6accc201fca1cadf408928a59f261c99bee0967769aec8e3c01f794293922f3438f155f79d112b7645e9e3603dd9364f2966eb9dc340cc8f8ffdd98608d9e11657b33a177507b41770693bcf4e27408d4a846e6e3204d88639340bd5271cb8fc5e97d396e18936f09bb80801a8feb071f5d3ad42f435de137a8b727ecac2d4fcc838581921000c4b4ab9ef11c98042448a6caac4b0bdb29c74a8196e3b1942f4cd1f6a10b5e620553f31edad520166154c9c9357c1042d04bc4e88f96b435d5d40c968fe1728f24653bb6f5a22f833278d5708c97e06d7a03451fb419c878570e8aa127efab03cfc0f8262d13a49e400107c2361372c06d19228208053c28b35b46631520aad6efc2e8c6a6482e8380b689ddd0f11208c089875876c5f1d30703a8df4e7e159b76d621a5d761a877aaee3f8bd20de6cc154df344f593cc3b96601897af7eaf802b9e2b009bceb8a638ee20a3aa14f5936da6863dfa4dd0c5f574f1185c5e4d7c0787af248a9dc442ec90b03b9b6a3021503f89cb62fdff9c3ea284ddfb6cdc7037b47896e772e51660db8a8f0936a8fe55d8b6858518c75759f965e1c24355b06a90bf6dc1297f005a4794b7e9b58814afd7f3a52f7794410e4e3e59c3165b9ba9bc134ff5fd5aa911e0154a028b8becad0e0fa6cfe49c58588ebcacf174eaf7fd11b6b01cc85b97830ccdca7f563ade93ccb06e30434fcd65cc8f6bd6d5ffe4d06248daa230c879b1ec96b07dc64dffbbdf2f5a105f089b9b76191c1686deb47d8003b5ecdbf068c61f0a5ef4b396b4c31bc10f7ce611394aaa4d5579b983411a0b1f2532a121bd1a782d93a3aa7aec8c053d6ef23b9850b6c0010c229e203249693e531ca9aab348c444c7b03fa639a7c5c304cc29a367776bc8e4e7f926353bf8a58b4f18a24c8bab689d62eb1e12e688f56a577953227fa722102f52b40d4178c8ce0a60a70430380717a0e6a0b0b6a24d9da52ad1daecea8f5651b4958c7ee9692dd7ead25228944767777efa8072308bd076f03b2c04e3ff71bf4e66c255b2a2ca5cbe33b6a0fb3ac66d624589c309e1c88501d087fc66018a717a154df33297a9f9b50a7d7561b6472f3353620acccee707e7e8df2bcf8f9dbe6e70cd79c39c333fc38e06cd2f0bf0071ecddac46795a3fdf36a33c379dab67cef0af4019b3831be00738220cfc37609e341cf1cfa6cec69a568b7e7960cf9744ddc6a61b64edf6736cc29709376771ca2b30d83df72ab0e2f7f40e5d5df31d35cc3973ef67116bad95c1841d9d398b80cd968708d9f29b6652a5b18ad24e8f4a4d4c9a6a65d23c86f943fcb74b1ea321abe6c2f9435df3180deff56b1ed6aedff37ea8ebfc7d9f3fce796006afd67f755cca60e63f735665d8697bec5bfcbc8cd87a8c31f64418b165addd1fc866c821eb76c6f7f24bc9966f755c3a27ec77515a6754629524b14acbfb79196df974a7d39aa322102d108a3064b8a3236d66a2a4a64080a22363c0caec57931dcab8af39f9edd3ff8e775f7bfcb88ee7f07ae632af2da95d763079e412a5713c32fecc18f76b5ec68ca139eea334d2b90f797afc182f9047b102ee4305c8fa4c67ef709ce538ee6156c4ef9b1c2725c77196cbfc0549853b4a9ac2658ee33809c65eab01616576288395d9f85f403637ade67ea2e81afddcc7832ab7208e399b3bde563557ef3c304784315f1271dcbf9c70dcdfe01e07f71cc7bd3c1284fbf7f6b9efb9e738e735f5af760dd66ec1c8715c95ce3dc7711f651c273b2e5e4fb420840843fe5cedf43d63d4f06c950b947d665be61d87b26d5dd3d9fdb43167f2b75ccd9ed23a5eebaaef4f7958ffac0fdb5e4ff4539cbfa63ded793c87ad774fbf0d584a8e68a1775f3fa0ab8957f82a8964339e1f4abb31a2ed7d3067697618bdf4fb302b76288fe4119ef7a5bcb1436152ff06e591ddeb042bb37f288f0c3269f75f51eedff800874cba47484aa6bc2f7950ed534e2e8b304058993dff25eb3cd9e7be8e6df2449ffb59d6afebfea63cf5e592fc9844a437c6f824524a29bd31a755758c3fdffeac56cb7f27c28844d65a6b638cb1f542daf2279698a39cf32da5128d8eb2fa05ca171f5ea6bc58f9f2854ad7d4b34aea118a34fbe5fc85cea7d19ce18751308d6ed0ec92e3a75f06b277adc75ff3f76dc07bbf5533e5b1b1618171d2f69db4200cd68e3f0d80e4d78e3990c7956ce738d07c3c39907cdbed10e5fc564a3d0b42af397a8d5f41c0b25fce0157af1c487ee55ea84871e4cabf6110febe1a4b464b3c36b054ea524a9755cea21964c834aadf0c5c3487c80b62c71f8de612beb328f64cd0c6d3cbc36c7bc14029a5197f05b91d222ba85fad0eda2d55cd0da5681acda239c4da691483eebe8fd26772e0e432982037b9f4b40ae472e70f6c4d5a47411271cee80c4ee6eaf5e60ed3baaf61f6642ee95d7046e63187f4ac63a651d32b060c7a64fcb8e6901e76f87d7e955b82af1568ce7bbb5c5b4841f4548b54a36a44eb5111972fa3fd0823e278b1b0e5db488990f7de1b6d8d4f5f525e4a2f29d18adaeca584658441eb4b69cb396ba5dec41fc85aa87f2b953a7b389e05fccda8ff52aa31845e5f44826aaf14df0f31c63888569dc34be9a5e445d99c2a74916292c288290a2941d482f9de3ca7118f34482d9a438ca691085e435e47af21b358639dbe945a29c849abbdab5711b9d4abcd5cca6fa9b0e5ab68478e552109fdb5c3963688d5ecc9d143e89487f6e563c7e80f752a270673362f97443abd82a1cb35ebccf9f3e4717dcc39d3092bb349a03cab707b5fb919cac35f71d553fea0b6c77534c329954424bc5cd8929b9c53bdc5255b1395e1630c72f5bf331d3b09b8b5d37572c42a796651adbd597bda9bb3cbbb8eb33382d53ed6c1a3c75867ad32da9c39fb1aed0e7a04db81eee37f8fd39af74cadb5d661ade739e3ecf70f1cc1f6ef3a6330fc9cef370a3bd4e9f3b9d79931b22a87adaf3e777bcef44cbf0af4e64cff065d93a6b5ce7f79e45e8da2a5b409f51a42af41bdd63a076ca18dda7a9575a93fced791edfdfcfcadba5781e1acd7c29f4e7be0e639641b084db9428aa42ef6ea34ef2b873d5f6733b2e855c3ce1feeeee714879f0377548d65acb2010f22404260a65bfd9303d14cb71ca86932f1eae12a80099c6471ed1ebd97d2bdf7de9792112fa29afd9963c594298a27fddecb5b957b74f2288c8c6096c50a2550a0c2855b92272e364f57d0ac10110c910f04118208094e90624b511726845942082641723e90040c55ba10624b0c4f3bd43c15110b8202524592b8e0812c53483c05a979a2e166462931820918a433533d6080620a284e8003c4007a648282887ed323131477c995c58ecf138148a3ef8a5576ce79ceb6dd58ec189563c6903fad955e5482c20885828615143eb84471919af2053ba1b938a1b984a0b37a64e2a2c4c3cb2d3fcacff25d468c60a588252728f3c448e9070a4840022f508c6c416483069a7696d1f3738317856e21f30a6285eb29b55c84744ab91cf9a194d28f4f9d7edd12a6531a6b59e6c4137d7e96e94029420b1457a641f68a6b9660e6beead09d6d65b573dc63eec3ca3dc727e696d75a02a5245b8c000b2b887431840f0058220922906802298d100c34b00296252845741142a4871e4660610b294a9e54a842852d4d5ab4501ceff65a1968818c0f4b763862294d1155dcd004a587231ad258292f13300f08685202229894f041cc11506c69b2a5080a51b694408b132d4fb420913d66013f3f8828ede6e3e6e3886e7bbcf9a8d24317131810181026e22d8c567abc667860312609245ab238b1b2c3154f1c397d408ba43238e4255e5ae4b87abcf548eab9c75b8f233fe6650204932452383123e6871f646c53768215f528cae1f6e8615743802ce5b853b3757163162a7aa082840a6374306adaf245892b4bfcf0e4c2094ff8042a5ed82b37a213bca5ba42d3ce39ae27818a3b210817104d4ef66eaa27a450738291dd94a633228b57066311776a362eaaada886c0082ecb9ec25baa45385eebf2b1b9f47007d663e31e99d230a133db4c3d9c0dc971fd951264a71a826a4491945e81e09a8a7888b294afa475da6a3b6972f8214b214d92156429d434407a28db37d71e193fb01f697af4d095860b1fb014d038d1553d32a1b142aba8396eef881268904033823e1f8d93de9581a960b3c156c8d9b694e34ecd7633c1e84644c313dd17550d81ca8918245782c080e5cb8d299cb49c89810a24a05ca937134a90a313ace8a2399286481a2196806ca0c3028b1c2ba6ae8e46861a834cd723131a224c56561befcae9c2e98c1734417ac8a6d014f970a1f9d1433655bb18d3718f4c5d40f5b056a5e8289bf563d3365baf3369f1c60fe38debb88ccf60e9d1043d327181149ba07aac3ace7ba7b85a20f5dbe4444ef1a5062f5e645e98707ddce207a930475c61a489316776c8618912910e5870013255c141d1795ca0e8f851be9e7618f9eb69c71fea435d724ae9915aeb9194d65acb67d111fa462ba3e767ce2413b9e7a75625b85a3b10e60448442cc9b204123ed50c0fbd56334bbdaa7a35a2d75a6bad666c5099897297bedc2bae9b4587f1433a5fda7b973a4b6db1466931a4334a2975515a04c36aedb69da53662a75c9d7acef94369b136953982edbd36024188e0c7101d8088c2851a463b7051d285d399277cea4733407afd6a46855eab087aadf50b6ef5c8544688ae7b642aa3349f7869d961ee730ae5b97249deebf43485d2e66b1c9407ff1349a5f8cd883e38286dfa54d006a595706716cc5f7da28f961efefad85650288a07524c0f4810f994c0237f7d211ef7f167cee33eae7f84f224519efa5301d4c986046712912c8a94e681fdfbf66fcc83fa77ce239436bf2625295d317a9534bd67fdeae3774368ffa781ecf739883e35afe306ebeaaf86f549a59a5b736f707e069317acefb5d62ad9f4b12611c7b393d413d40efa9fc6cf7a162fa1e6f1479fef6fc43c60bdcddbf012ae6ebd4dcdb73e7e37eedbfc8d1618abdffa211f4dc11df33d10f25effea3d10daff7df73b74dc587dfe1bddab7e0613aee6c67dd6dbf0c17aec3d7e168fd9c7b9f8058f9476c36dc058e53622953f8f288dd2aa0e1164d7a18383e8839f83e8c37a1d37621e74bffa152f417ff7d107ff8d9807ab12be5f6910bbbdaf6b3e7e37bebfcf0233b863b382e13cd2a38fd5774f41f979a0bffbf9ddf87ef5f4867763f359c463f455ff4369b3036394dbe0b88bcf3038e50ff9f0600dd599a7e83865322a6a95bda06c620da7894a6bad5a0cd1ab164caf1865abb5d6aa850dbd562d9ef46ad36b955e6dde4c367533815eda9934f9d3c6cf894df9760531646ed76eed4c3995439019fd70c7860198adea9169ea480ff7cc532f74db23d314911ece96eaac4d62c5af26a8a5d49ae1be6411a5bf9831e1669185b4457cb1452420890931529a0401536646114d9c8afc80658b1f643a64c898e9bb47263250686264ca420b531930383bda449e9e18ebf2e5440e067cc756051929301928f6143b769eba75c099e4614e5c22c3254746c6a937e970a9be3c943a847acc2fc250a79203d1cf21adf26d8c1684b4dfcbf1507efddb43a50e30b48fb198646e3d745d71ebf35d4b7dce39e58b3044fbe5401958b0e5bd84d8dcc71a9ca561edcb07a29f1f7f33ea9cf8de7b6900d107a27f416b41a0fa9647d2bf56bc3ef0a2f21a22e7116ce8711809dc71083ac6987b2d571cf5dc23d3154bbca52b8c8aae08e243aa0a292d5a7a7a7a3126677b6a1a03f52425a487b231507d003ddce91884718952f9a4699cc977bd6df2d025222222137c6e60404b9fb3a84ae4c3c619318951d2c3d8c464c5540fa39608652b9dc53496883e259599ecf435901a8a5c823973962f8f538523bfe5cb344a4a949229bd44d3c8044826a25ea892beae08019325e765aecf8912f2a3ca8078fdb0bb1e99a27a74332b5c01042a851fd7cf04d023539823c2f8d0c31a8e2136d96c1528428c0c65ca8c4183043fc1028a09099890c0c18721b211d552713dc61743b13a7c3f6c418039d231be4baf20bc1e99c238398194c96e48618629b2822c8c110ab2fae3fa59981e3dac5934608caa407a2d0106cb096096e821abaf2b60a27aed91090c946c8a6dca0e5b9dbaa21c41005d84216ac5f69a425f406c3038f41b975e41d4a42a824069d93a6710fade3974793cdcc7c3cc71dd3d10f7f93b4e41123b3f08367a183f87eb06a9970f543c411941115121e506e7c5bfdee5b5a850d259efbd40858f297c7c39d3e97bad1104d07a16aba646b35ebc085bad16087beb30870b84d60bd68b6771a017af3990f7ac0d862d9ec3d5bfaff15c1ececbe5c2c1c1c169e1b46e6e6e6e5e3e4059813a32c5d40a6c812108bd65b363fb637bdbd4f0f0e65b6f63730386395c9df5deab72166ab95aaddfdf12aa392e57d73cefb80382eb574dc0b84309be966c499ff27007fd201ea31177d49e2356e955c6b7bdc65ac4b74f30f442d7a4d5de31f485c3ea8564879e6a7ed4abda7697abb5356350deda35f7d0db31c6c080b7f98b872d7fa8775b5e3f76e899b1807d3223857bfd3902ee40d3081e9bba945286b56e434a296596d87ecfbc36c7a4927b58521c768e41758e69c218db6c36d96aefe76961306713dc99b419ad8a73adb2956b97dae5e8f33c30f6effbbc15975d9e5636a07e16a8fa09be780ae248a539dbfb6b3cb9a5f43810f7b872b24b1894bbeef3a53cb4a676d9ab2e2b5e2b0e18e9bf0023a55595942e5da45217a82e7bdae4d0e5e9e9a304a40d1f6152ecd0eb5eeb8624e9768394f8258d181594e0c20811262a92294ff45a2b2c8a99ec8620370ce9b5c7db0d4a5168fb51e649beebaccfc9f3ef93fbfc08440b689f3fcbb9e14877e2029bf2ca6d41fafc5a529fbf8341134ccb8c616db416679d75d75c531c39908b4e6e620ed33a73a7adb6da6a1ed6a7cf7d679f03c35cabe540f4bd3b2466b1d962d8a265bb1283171bdb956c2b9d04e8f156c3103540c1b16d5fc2b0cc3c6786dd6e3530c94b49fa9c73ce9d3b57a4fb560392eddab71a9090604eec7067c7864195cdb407b63c12ecfcb1e7b0d581bef7be861ade671ade67eebdf7c0ef3348c3fb8f871e10feeef5043d0f0492aff17f207e0fec3efa1f48df03b98c5dd76a2b6f342005b921cdb8d6d2c06ff3dd3580a86b7ef72d4803dfc740f73108641f5b0b449f2e9d60095b13ac044924914412b6246458c000c15f7e5c5be99c810909c32293dd6668022253a2dabc56ce0c43f450b644b730922573f19a3062a5335204c7c312233278363dde6678e2e51603965b912eb02c141ce5c005982c42a6a43ad08311535861620726323290691901c2b24e183fe1d232f41093a149cbe0021f2373c229e226ca8b195836ccf1ed68c8778b218b261bec4a8699e0c7f5339c1e6f46a2faabc7db0c2db89a56533025ac805d8162f6782bb20509d5951b0c666e30f8b815b961cb046c8822459dd6e3ad880d4562a83e6aa71ce84d05ec9d56ab06821d7af4296f7973d67a6b2f4835f55a2dd9a5ecfbb6a494198cb9e6cfb8f2188d7ab9ac87b65b3ef441240fe5db6b2d6c29ca975256f1019b46f7787b616afe0ed9efbd3b66b7608c31e6d3af6faf7d4a29d20a3717a2fa0c75c29c797381a8cfcf33cbcc60db975f819e5a6e2b8d6a3f1a9588a88e5079cefd6040e4e4707dd659ade84c697c400f33868c524e49e57c39e6484cdaa7efc1e5915a1ee9c376d8944669b01df61f4949494d22892479603f7ce64ba3a884914ff4895110ed608317a91807d1c7872c8a79409f09e5f288d2e6ff8ebc80c8e7005042f065c927fa5c3003912c3f5e50223396affae8a3c1d5ca7b152f41f55e4c96e0fd8a6bddfde625acbe5b7df725d4bcee400dae5ef51dac84a248ae7acffb158f491ea380fed577a0bbffb8d0eabb17aa79fddd4418f963f2df036392efe8c0fb9d5d9b0b09c53de453030a45e9a0e6575c284ac864f5abd5af388f127a288dd6f01aa5d1a7de67be37df530139ac0da1e21418b1a3cff7de7fe0908f070ef9d497e00872030a4a22a110288d3e0e4aa324501afd1d1c441f10288dbe0e0ea28fcafb5012494579441a1d393a223f1a53f51eb87aad2b28f908b2d7e7401d532e511afdf9ede860f52a2e24a47a15974a91d2e873107d7cc829aba5d5471fd5f7d0d5f4f1f1246f4518f9521cab2f2d8f55be41ed320fe1999bc072c8218729838419d961f56aad5ecd73c29ce49a256c86186badb552b05a795b2d1b1ba530275b7eacb5d69a614e60489ae072922df1bc36c61923d094714e3ca64a8a048664562432c66a9136d725d2ce481bc390f6ed12695b18d2ae5d226dda250c09d29e34c09060483b76f9194729e9852dd9f26b8cf16b84516badad964dabee5c2bad159664cba731461bf39cb95c52533969b5b2c29070429df29b284d604ad1e9491426902289302e341d2d5144c91354d0c0c3152d58f9b678000a0b4750a0b05054a394524a29a594524a290e3b74b9384a29e5baefa11a73292bc77d02e8c79efb133aca203bde8ca6babcb540a58739cf18372253ba03eebdf7c6f8e1bdf7de183fbcf7de1b614a36d1cda8c8da18afb5d6569a420b482c2425dd887880c9a63dde884061f57823f242bf3dde88e020ab0e92ff9c4d578e916d65ab15251535251575c60cadd5da7b71f5ecbd18e7cc518a73e6b8aed394725da7b5e77ddaf3be4fa55afd782a2a4b54fafcbdadf439a7d10c325f309a4126d23c9a455a9eb47879d21205e524952414294549429154a6c8a43392e88cf42189cec820b28804da14462b5ace4969ad564e4a6bb5f6567b2fc6397338735cd769ed75daf3be4fa55a7daad56aef9a1a16cba6d5bab979f10247b33c0adae4d8783beacd873a7dcee66cd2979d56ee9ab3495f843ea1e66cfe2dc280b24357bdcd88801a604818007bf264c29ee06b2b7df2c42ea1614d72137c6da513d664cf9f435362238ac88ad872ee6ccd76aaf0c3b3355b6dc7d67485385d215c549604bbc6455765fc0851a2348b412f67bee74c8a1142f3cede7eaa34cb91ec6849c64f10234a8b36d37c1be272a2b45b0a536a8d1caf1dd55430b302918c1e573782a1d7f7eaecc7e6158a5610426bcd355b0a4a2f2bd2a2682aafa2e8ef94d708236ae9f1364449a760a5f3aa62346c287bdd116f42a286aaecc0ad08cb0d481497b3b4f6d830109329b5cd598f0d0324d6467964cca2a84e3b9571b463a79286cb7362c83e3266ac52d37930b7a2307dfeec56e4a58581442b178812147480e2842cff06244b0aad39a33016766c4d9edaa2c17abc01a102444a0f5b6f6464830991f990d2636963c9b6823ab239fb51d4addd33867d97fd8f16c46eb96cc88e4593167b46c168d2620f3306eb51b7168525ddbe37637891c88e59c6135f9ff29ad4ef03ddbf791618de673599d2eb73d8e62ba83f46189e0782a1ad51e9dba11e3fcacdc0d1206b90a39cfe9e993df0be667dfefc69c03df7d9c899f3e320fae4e4803d628f82f4e1e2e77a9bb9d73aa4ef7a2d3dfde21edb8ffb6adcd7d8d360ec3abf06acef5e7f352cf71c8f6da03fbffedc43611f7b0dc6ce7d1efed8f7cc6cdf0502dd7cec1eb8c3f52f3e7e190c85dce37f812eb0467d8e87b7c67ecbbfefa138a00ed969dcb7f91731f00604fa6c7838d4c3cf06ae402015bf5fccbeb59eb6deeb1ddab3afad08b2d3d799d39c27bf0cf2d7b71be4a7e0f5228cfc99573931584bb2678fb72634148a6510bff74cf9e920c1c7092610f518639f40ec31ead0b7129094eb10ea21fdd7f4b2d41943d6dfa18bd66c97f4625d6db6f72bd88d407b48420fa2f69bd1e50eac9dcb5ea5bdce06784f7ff6fa20dcc0e18199d25c55c860501b037fe3031c20cc18354ae113a49cdf9a9ea7b52a56d54c4bcdc31cb2eefdf7e99775dfe34ecaef99f325df687618a7ba2b8b1d5fbed0f1941cab3add75ddcbefa5d274cd99aedfe5a0da6fedb8031ff3f79cc9ccc5a6e53294fb9d57b5fe65330a40b0bbaf79ee7507528e523ae7ac75b5d78033ad5720befdb37d8332c25081f661dd7fdc73df8c8ffbc0da3b8e07cd6ebffb369076d6de812b90aac0d93fb07a2b5082594555981dd670f7d9ad658179d2b8ffbc9f41b57b18e7f0ea51b07b0eacbd7675d67ec1a89a378c6d2288065127605275c2a46a50750aa58ebdf2e8f4bb9720c5174847a73a6494d9beb419d4a7bb891cd6a8a432f75ba7a8d6ce266a94793adb25e587b51b3218163664decbb7f5b056abd56a326f97cbf27036abd56e4cda7c6badedc609764e3ca3a57dca3953ecfcf365b4623087cc8e49a298f43167393fe74cc7cb3c639e1debd769e907c1a6d861ae36dcbbf7c7793aafea0aac6fbf19aa5abf197b55fbe7e98e0bb274ae246d217fad7dc6eea57cd58e16b85e6e9904bdffcb83e806314dad39f2c1d606c3efbb661c9bb0d56f58af6fbdeb2b0ff77ffa05ba3e07d10d627ed58ef302bc015d609cb3bd7ff53db40654fdfe667cdfea57aabfaa0facddc60b5a97b46380eadfaefb9ee97d1294f2a74ba98347d72fc1303e750feb905d771dd73107641dc83ef6915dfe16dbf3244d526b558b1dca64b39973be4a5b429a34696e95b627116c0ae3a7df83c19e39abef8900a381a3d38f3c6a6a63c698130c2910fdfa1361581ad10255b440f6a38e3fb6817cdcf2643527a9a8e31b13339dfbaa7a4d4377cf7a9b690e6d3e4618ddb740d5c78f864a83fb3bb0f53566a86a64301ceafa75f6269743bdaa6cf4903e43bdfb68705f8154cf7d0b0c55dfbd0d18aafe4a40f5dc87435d55b17ef9f543fa35fb29187e7ff35783d6e0bef2f0ab515fab5ecbf96910238ceebdaf06fed6df168f6da07aca51ce7a998d1ed287becddfe0af06fed0fb907bfa322645312220cc7fffe6576f03862c1e0ef520590302a95ef60d027d190cf515bf01552068fb6a60bee3450ba494b2e32d29a9d3af5eb440840f024320f834a8bfbf19311ab576dae34763f75c858828833a649a9e77e8885244443d88d5f5d320afeb1a21f4fc3a1cd06784c17dd0ed3bba0fba3570745087007438a04b080ce9703372fde9e931ea84f529c7f2bbafcb5a0c86cc60761e72c8667e4c52da23bd7e524f2cfdf8d6a794524ab96cfdbd52de37e37e33e80bdc7fc1ef35d8b2519e38b9777da4b19c1801f8f965a079e8923c7ccac359bf3caca0dbd79ad35acf08d39afb971ac681385815232fd02fb99ff7c2261756a92e03c0c30a9e00c0c35913393cfc25623c741de1bafcde1d1de6d8c1df9010fdea991e7e8f41a0d6f3e897d6fe3da68feb540f3fd97a1cfc1f0fab54ff9efbda13cd096c7a599b7cfdb2d6358d543c3d35e1b444d311442cc08680fefd0db9ebfa2b9f721d833dfeef65525e7da45e0004f037ff2f68d0bf354a5e705ff29e796f98f3df8755aae36f69f99703dd6fd197f8c53f0f2be8619412000f0007008ff1c9ef7f727e2c8753fad1c9f77b928ab9bff10bfa372a8fde8ff1b0d6bfcff848e7eced303076eede7b2facf5dd1ad5efe34f83d6eb1e5af33820fe1618fb0bf0060c673d9449369af7b4655b5f7d58410f6ddda663e990697a0894669f55c1ecc377d94d6dc09a175615b3975cb7e739763ad7bdfe30c74e58eb9ae340dde3d79cb6012beb25583b2ba9820a663399f449aea4304a89c9b1d3bf0f73ecf4d5ab3eacf5d5cbafd960fe34f81e68e53dfe6a78fd7b99442d13b426f0f65a9253a8e4618e9dcfe3558cace03eae62e405518aebbaaee3aa1899233fcd92a3fe3dde929c59e2d46b3dde9624f52451dd003dde902875afe73773c361e98683d16d09d40d8723503dd7ecd752e9494af9daa5cbea959ea45217a8557e1a127a924a4f5340de57e5536e7d1ce87b2f77b1613de6e1ecdeb37838fbf7505db25adcab58625c397ef93424d449a5a7a955567a8acaabd56309d5257ff841759907f150f30f3f1e343bee3e64498c3d2ebb8061508d794a4f3987377f7f9557f565971b1ea098a814ae5645b564880a220000007315000020100a07040281502c9246babc7614800b7b9a4866529889434992e33008a2188841c61062002000194494293a15079b64e12d77244ccfc143307634306ce65aff626492a34192449a9c1d2df8c30b51e1f7ef19cd9abc177ef6d43ba5c80f6720f2cfd011006254c82822a8127f024776fc7e08b6f72eb687b4ddecd8c97fbc04eb06eb6048e8d87238011009aac9807cc8aed1ea55ef9ce81afc5718814c6d42e872f67bc78ac985e43fb33a2e0a88671deab36d4684778dd13991d16c72003b2dcaef0618d42d69f90252027a29b0a9f5ec9a47fecedcbc929413d9b7a4de4d62eee357f44a3a03971fa2dc6339e722abf9ee0b5d37c7829013e68e6f7829b49134ec5f9adc2d10c3a7c40dbee80bd06d7ee25f77e0d7bb1edd83824057b8cd109a6afdcbfd3b31e3ad26098f6480c63467622742d06c08c87cade0d2af99d3feb831ad509856643cee9aa1298b03d0163ae199ee02171317a508d36dc91a96fe410c3ea77de9641acfca481fb6f419c0fa3e8714290285bf8c8c4287ec5f74e5e125d5ffe0c6103a3c92c0a45e77a99ac19ee36e62b7fcf7750ed7d1064ab1e0de5723c0a38710514a0335caf56c2f432c515041776fe5954d4057525d75de80217411082e6c910171798a46a92770b7296d2044d12232412330321853439114f478fdca2b7eb824a6ce35750048c8f98aaa771d48e7178e7bee8775868080476a8d50fe0497a7d7b6a6962098449e98aeab7aa3b9c8f01188bb2c62692192f27f7e9461b28fd9c0426291bd008106db8e4dbb103d149dd81d1b6e20708e3c9d2b378caf77234ab60f9f89b41caf56c69a78ceb030bae1027935a5278d8492c6f066e01b8f35246774887210d80a531b0d3b3868a7cf965a8984331e1d05c56f0d284faa488413c2f83b2d6537b6c7f9e4162a6c983191c8f7422b24971dc3214017f630487555f67ca137b7602fb31fe820d3f71f1db4c69f6f9f70b170c18ebbd03c421511c7386a38ee660d1d17a1e97327c9e8fade19a22aab54448966f7dab22f284a48417bcb40e3c9cb4721645cec2a95cce4f4a19c876af56f49c0703fcddd67cb46bf0ad434278970f99dda64042aea2eb9cfa7af8906f15a050d116c69627825448521563f7622441bfa3cb447981c0d3b5577721359e89bf3c1516504f83166490cff87d53cdb288e4328a8e99396e55692bd2ea90f9104f73896a2d445020a083965c7032d4b0f72cbdcacdd52ce2fd7e54b2a262050ac776a869a3e37cb3e819c53b4d3df4cde9896b41ac826fc7122deb99ce5da3a7ed4e8f2e23f9d0d765e221f991b39a31fb9109e1fed1b4096ead7e01adbfa48938bef0d662bffa74ea8133ae422e74bf64840d22867059ebd752b26764461fa9a016b3fa879a0d3fddee5dc08f3d037d5b20eaab368af49371667b7afad62c3621bd81249b2782214e48e610f0ce21e73616513cdafdfac699bdff61877f124e5ac1c0b63c21dee9b44e1fc66682bcc9fe0691d5c18b09c9c1e51daf55d4f931e6872ea44beaae448f09ab168765db574c629ab060c8a09376a8c18748e04bda16261e6ffb81d82bca89545fb4b7a344214d45f2682a33c457c2b2d0122172b4fb3506a62d310fd2331bf2e0dac26373c4124fbb66cf8cc136ef03afbf86e40bfa71d8b25d09995ba31808bf8a966a6495f6bd887960a4c88e3e28d0ef668d591b739e521b190d6b36ec129fa7a5ec7ba780376825b468a2269559fd069080e6e35e998c2c49a082caf9d01d3e0fd0b0f11d56bbe5158681f2beb74b8a468e022d0250525a45fc8a78ccb802ead5296fbe62f41bf66c25bcc423db9e83629e9ac17b1652e85d0ccbae26a38b0824d202ce1bc091e9bb2efec9c6af2d318704f3fdd3124964029fde8f0e690413eb174b336feb28ae6bbea1ec543753753bcef69003e0789a59b6f90289e6473e75d09e823ab89ec52c12e32976e109bd9ed7baecb34ef40e038456e94d2025c1a1454faca82188fd5ca48575e4958b261d0afb3eedf50d8fc3cde5680f5132484f2d608baef4de55c89f051182f44044385c4f6823315fe1ba9100142b95e5dc0bc5e52856bd6f09b0660145785216005f533cc9a395fdb01df4106201529044bfd03dbe6c3738d736001c723c7596c9cf9fcc3d45d42e6aa062038845e01820e5e37fe8704c48e7018dec2e086272f0b2a14b1694bc44c3030725f29066806f407258a2663601bd2f507e145b304ae9526d0dc4d98bf1298ad792ab59b2c397e1f3ca0b5452ec1b93a4ee9405213eed20778d09514970a29de404c957481966009c16763865d5d051ed70c9c5931127dd7b3fc6ee75351293adae966ca1e1fb38ae912f3da92a4a24538a47e1a7474bc8f0f5de818c943ec436037d64d591f76575c84d960ed51d0d87b1126320f4f6bbf51164d4ab918aa48135887b473f2105aaef034ff871d13350065a098696eb56adb5495a6a6954989e687c3b89039233395de206bd21a4a32327a3a4c21639af6bf9e1edda836297a27a9f4797f5eeda29362dd1a90f55e0177963deb87a4d41007222aa34190c831a4a3ab1025e0d547b4a2fe549f6b3801be9da52b9d278d86efdc8ed0e327d51c75deac97602d55911cd93a2cece35b788890b82754328af66de2e2225b8f6d6c0276dde0926bc876fb9cac8e41bab8fe6fb38b6e9e3fcbdc0bccd7d26d3b298ab3cf3e7feff68acfcb367cf7cdb13165b154ddc34f6298dc593390bad176c677ea5c20b89952951cd36fb0aac599071e66fdeb6c29625ad413bc51d18f5b89e28bb40a5c3b960e37ed46a12efff9774e099eb6249d73a612bd71b78d6fc5100e906fcba73a66e00dad0d68732cbd20f744e17602a928c6d8dae4c7ab878b67e526ca84dcb2dc15e31f538cc353af803334afddf6a924f235bcf95af414c6fe9a7935258eae1418d25a0d47ee74ed9f86828dc4607e63f0b02448c3e5bf270ca220d99d5dec4b34b7d375a956e416d0bcfa4889faa4fde75cfbc47247206ca85e295ba42d8bdde9749c6e826bd89a46d84a02e574eb611ed8ef65923ef68492196c3dea13b508b7fdcaebbaed9a938fe751ab4be988b55da5d4bd37afec2fcda042f573f8d3b61bab52199481a4826cb8eb1bf2e8a8d88cf29e8edae13bdb0e7888b709150ac7feecd070f7746d9622d8bfd88fb12f68411fe34b2ccda9fd305cf81cf84028c05658871e2c55500f6a1f4c7667bb535971da6d39a26dcb8078f93d282d4287d782d05fea517a6685d5bf4de4cf259e1b8984e289a1db5669a958c329b9cd97f2d89e4dba14e1d833b2008960a144cd9d344f05470849fab0c3b9f712d30294901a52093907a34359305b978a1482ccca3994c67254867c61c63bccdf3141e82eca84847eaaba09607ec4717b69e73cefd5c88c02cabcfc90a7f4f2b5a3c367794f41e8f2efe9b8c407c07be0074b2cbcba90ee2c07e65784da33bfaceb169b528627230509a53708c51b8b793e89a57987d5bff606970ab0bbed269531fd9797e6682e87d70eb16208143f3c25a790084c6040a55f8852bfeca34e96ead7f1fc4588473574c3dc4b94db044f3cbe7fb2d886d98597a8c8c37e04d795306d5e9c009f8b2c5d47f309bf2f530def97a8b00910575376c80aaee6139c79a8166ca1b37e4bd9eda087e9cb31c2bef79e86180642e0bf44458c24aba2699baf76917f7db9bee2dccaaefafbd42fab4c50158bda24084dcb43c914b246e2e2ae3975d56c2775f00dbb433449bb3f2d91c42111302e8a8c5db3f17181c8a63aa733bc6f2e538e5273bf196f7167e3ed41fef328f6e9ae1cbb28dd402c94a4772c70d6fee06e9b83c65055090229d80335d4c900f302e07545d95b2a93bd92a40b6c896f8506595869956e4eaed454c9cad3a91130a5a412ba41c7b6ebd97ad55551eb810343dfe234093f2e8034cbc85c61a1fcfe25c1c2bcf3b9094568716381ae02e9bce00cc724daa9e2bb1774f3c669d4a4c1f8377120b596bb8a31629a28a3031d111746c4a6b8c3afd2d58c263056b305283dfd77b444a5b4eb3ac100b31d172bd53502e915d8cfe3e54db6aca1eec50ad1d3f726731ef817b0d3491e096ec2aa97a419e9c533ab27e92aaba1e54425610c6937595912d1e1489e2d2502124cc87dee51ed7b2cc1cd62a634154f03028bd3f61d1cbd090db394726ace3e0e082450f1f5c23d2f9cb450e3b62666af2393d8bef111582e4720d35c15aa618d65cc56a75b7cb30d2b689a6911810f792c76ab5bf2d8af02df3aebfc14ad0b31a5aa8dfccfecc5627b4ba5a9d87d9da6bc1f3c117489b64b8a197d8b6f1ab46795e0311a404701852a93935de7f4898512df12b3914c1bca55c5b0980fc592a1d6469bb0a7c51b04b316210c7369c4670cbbfac82a897a26876b5f3931a67d8330d6a953820981cb5b02f538800aa145ccac40b79faf9c03b9dc0e4ec44d2cd534ae9a998eb0bc57556fd17bc4457d65aefc9c70a85fe1e49df303621c1458f1f4a007eff2e7c48b538e06e261854035b8752aea63ce9f648622cdb33812280ac4b7cd3b8dd89aed83ceeb289a0fc8e6c0667e3c0e774d26853eeb8ce8f757891aa263f7c0581b7a81110a75bb9431e0e4cc940c1923ea40ea869b1c54d4383f4cfecb54740844908b80799b800eaf3c2ea10bb3549a831166f1b35e2c3014132e2f9ad2b98b699b9f340efbcc0ba3977e3403427b9978903adaccc292881e6fbabe0d4ac51c7f01a10946904fbc0bd84314665730e52f4b8927367d96620551414af9df324b0906f703ff51fc30297d836a2d3af5626cb286e35784897c049fd9cb0c0813b3e16444f8e1a017d7df61e9b2bf073c4baaa94a9146fce5ab9a0829606537eff577505a95f899a3dd205e99dd0ae64e69d04f0ed157c2e8ab55ad5305ab423d6cb89d513711491e208396bf976583ecde9ea849027067e7f39fb0ec2b45f2370a8f73242c623c196402d6bca2d2abb0710cd937ab38820cb8ff40cda2192307966757073e16fb05ea71a3d98091f180ab53b85249c6921f4d88793c0e8240f28bc274e2c074349a0deb4087656c6171ea35954dece5e57681abcc040504c51226c59dd441bf9e5bdb3a9a1fccd4d92ebbe814a01300ba950aca048ac71923706cf034fd63c99570f7fc6e80999f083199071d6410a24beeb18a198bd74b72113c281ce921baa0a3fecf14672b476c385fc086d0089c33c499f5465d80b6fbf64921adaef35140e041bbdcdde39af89d01d52398cbf580361dbc4ba3eb91564cf0755a51f958a5ded6f3ea65682794b94d99d4df9adbd75f25507c24d39bd141a470b98b6f28d941b93a0cdd539cdc0fb1bce19480fdd14a02b1fcc402712566f5dbd8e56e0a32b19e6e905cb577c89ef0ce44cc0a2bd1020e0db69f2b626598b00f6d1a73c790c6c3652dd883847dd60533da6e4973d68070e84a599dafde5d0531634c2243b434487b366caa8565f59c30aa16dcf754185328bf3243265fdc0110c32617fd75eff45e8ca7ef41032d19ccc3569f8186d9d9df196c0f946c9e6c30a51ee063d2b757860f09f6783ad2e1ae57dbb0b49d346f91a266c4e53b247293fad1a71465854ed5a87a68eed060b46618d19aa0f3b46cf153d6056324001151f8d7c9fc48f9e496d6a8f23ea0ed2032cd9941a332a4f843cf508c30107dbdf84e306ceae9bd0e57765387824202014e1de2143f78a1c15ce99436e7f76addbcb91cdd38c707c6733d1cfc8ef19de3fc85f6dfac44f37acea41a44e74ef15a5938a606098d6d81a39481cd521dfcd1b94616216166c0160441a6894404336160c7f4d42f1d503b1eb38392c182a9b466f7db3ec230ea350819278f4d18fe7192bf46f714e1d7cf3f11108929a940ccad20ddc4cd0f3ed9c12038c2435fe4522f7d2f1fe47e862d6cd80c02317b9175796100cb16c7a054fc092faaf4c19f8679d2a00a6d5898e8d9010713c8c3df007ad9fffd8aff30bfa94ec34dcf80ff37834b1b850ff7a7dc4908ff0d820961c00f7c4dd069c80ea6dc11a352ee6c5e2dd3b3511ac241eec0854f1930fd932cbdbc8514238024e50e1f72ba4a30065b28ab2877106883f703742142b913c62f70fcf8c99d157375c9c91d1f265e97435d4ceec48d7bd147ad242b5f728722e6c095efde55504aeee0affa88ec1de73e954fc92a46933b28ef4e97f7e88f3e98e4b28e7f9806ca9ddc60f9d909bbf076c282e4c208b7e51b2cc13f2e3ae44e1f476c25e40e2a3ea9e81255c9de94bae5de2b5f7fdc9988d98d1f91b31867e7e30e1ab18cd8f9cf888f3b172d6451d76ed34287e6eeba1c3d2aa67af1647e689b89b069a88def662a1373ca22a2e560f2da03f175c03b83c8f6a4e707bec80809c98ac51a779645252246f4835aeb7187e367144f733ef2b8731e471710c786c696c79d91c70a8488fa8475d305e58e03ef6f557f9a221231c609995509c08e3bc3bc345ae4b678f1c6542de3a7801bb1ffa5f609e8b8337d8e4d698d66cf43c8fd2a2bb6db7ddca9ac3e6238dccad16ee337c93eb3cf2870406b2a6b675a29744a07a59e8163953b26b2615a8b8ff81260b79e8a1477c46c77d760c5c9233c9080001177a228eebc0fcd264c9a0e87b84311df0752ca2976249eb893183bee3c929c9bfc504cc21dce947d2b43c670c43e257c6ed1c49d51750aab2e716792c09b2c9abdf1aa8773fa26d27d8e220e426a284c80d29a80b59133d3491f2c85b6e54b6e863606296b18de428640c18978d50c4d04b5d5a36628a2bf5f683b6238e2210380e9966b2632450ca91b5d956c95f824b54889114792b6d1e067af25fba8d7ce0169e76dcd8d6bc0993b24e21b30ffaec55b5e966d4a03cd10a4dac98e7c28e6b618204d5fbbe0d5c8e798b98a9dd36d983dd34aa735e9610b9f6333f4ae11b1b799e95b0c44904ae471780031de2d2161e6eda6f1e48498ad329c40c0b6ab1a16ea39d7f2d45fa078d3476b7648e964504cbd7c1c742a586092a04a60bd5bb99d839166cdef8a1fd171a35da5ad7f8d2a5154cd9ef0227dce26afbd72170058011f71770c22481f967a7bbf30f91ae78caa7d09893821d88f4af1be9dc4aecd335f886d0d04b2896e1e87733d4e85d45b57e616b65735cbd40738472478d91a2a01ce754f56198ef81a58648a2acfe70b82ddacf0a84769ccb83f053787cc632e7cb98196e93fa36729cf0a4f8733c29b4d670482907e3d70c784edd8b1b599131013055aa1d9a369e3f534571a4cd180362fb66ad19936c95a2d33cd0c101c890ec43c2244fd360a4cf86d30e53b7b3f0a51374758428d08976ae67f2201803dd0e7561afae6eb09afa7d8ddd145f621a8157af9644511c123a405a8840267640508c20595f47a257b41c9435997606fb3dcc3ba033837966fe23cae049555f10f31532f8ba2ad47b4ca6fd6b63b31ec59b7bb85d584cab3e59b7e2a91b7093a0d4b167d30dbe47537e81e0aa82f2104ae859c07fce09661f7e06e2a3edb26b3797175f8d70639ec54ce1aa61fa07fad9961778d91b2ec722e6c00a8b6ed9378057c8e57190f3168d0d2002ef2bbb415e0db770f9306cd5d461c9a4586c62ed05c51919c1b0a8c7997afbefef2f1b65f0133bfc2301247d76a4928f542201ce8923d0fb8beef5f83043a1d5db85daff182d28e6215668ee604bf4ca2ee3eda4103603e12d72448f2a1ae01489250be2b2da5f9f736151db694f7d95866d69e151ef4d3cd334cdbfd44b86f388024a61a61c7bc27769f136842ca1f6625131b49e30b4d560ad3464df48c96350628ccd967bdb0f7203389d7c943478e022476fb5b4c6f46144207f860bc1f80bebad0547d9f550833a2bbbf3434e1f5c5e131e09515898d27f0dda53038d65abc1d5000242bfd619658bff15dc7b419cc163b868d22cab5544e778f7bcc1a8fa2ef61dfb0556e6844f306db97f9366bae7346e9d2b80db9c32b68c2514ea2de32b7e2413ebf4493a5362eb2ef6cfd31bcdcf6b8f6af5fa0693f58368344ec973688d8deca64f9a4b2b5387c6e3cfd1168863810125193b15fc58e80eccb06aab3e29fe09bc8430f29b97d86b22c65baea2d7b4b3017072495f27deb679f7f3399e99af3655463bebe7a42645faf7d50ae5d444f813b9fe83e71eff6bfd3ae41a6bdd05cf2f246cf1f5b1bca18f565f205bf0009367ca5627b497de73089e1ffbfdf66476ab8a9c10624fa0bdf7ba58fea324b67db08b889208409d282040ad074fd32fb5de8e70cc2b6a46b010a41cff34031cdd52bd7e5b898d7d28f9b1786168987cc95835fb1d222f60c2527ca9f15d01a9f296ecb25a461e9600f83c6327f942369446dac3c3309bf949cbfe8abed003fda4d0c54607b111847b638de51bbf5c70ad13e3e7add51bcd234c3e1cd7f7fe839b9c6af274d5f85e0fd4152fe44723f0a8b710eed3b85e7521a32dbd070af8cc76c04ecd29043a823994f9dce523deda6e387da0cf76dd73b220e2021690d0a34a7b1e695845a0b1a295303ca1ace9c188762df78edfae17d66e4cc54c7274bd932207772924b2cbcdbdd49e5e1f60e4c2b131bcba94e1645ee0dcfca6c0ae05c9c45c6bc5c8dfe4bb25d05900e99cb05b294dbb6580aa09e6c76b5e5e760a7067ba55efe42a9d643c1314b6a8ca9b534d13d6d29c6602da589128f17b8b2bae0aa1386edd1437637cba9c2b5a379e13c83a56ad356c7547df0ad680ecd16a6a81e867323f7dad7ffc4b9e3fa899310121ade55886451b6dc49941e0a513c4ee4f1f427395d1ad73d42c2a9489d5ad48de580f9155c6fe25eb044c2219b859a10b55b475c4a77e5b9d6fd25be3d04339de8a343870cb99c868cf2c02d7cbf08718187e147b24ae349af6348e6c8e2eecac5f1c66bfbe3bb6bfd1498ef54cf66d458af73aa7e44db961ee058830e3673121dab3cd7ebfcc723ae5187598e0a109654de9b1baf376745f865322e28d79726af327887b39ec61e24a7b9f824cc997285ff1f0e6ca82f9418601f4590272a7e4adf19c840396145b142fd87004a155d567cd7bdb03e1e31b2cc124d075aeffe7a439d9ac5f981226da64b5a95e881cf9290a6db4d0c7ccb495dfbda942f77361de554470e9613fac4bf910857ed3c8dbd714c7b6aafd060b5d9438d383bf3099d6ca1f2a0e9175c983eb5e5cc4a37a795c8edd02fe92278768e80a3049f750ed01e01bff6aa1c8420fce8083bc2ac98138eab1f0174dd13a4b9b60562c5a6e9f28b423563791806aef7cdbf413139195a0bc52d75643feeeddc01b800bdc161d3035782d16d3d96f5e828a4e70852f0ac3290525dbd024f88cdb60539280611b22960a8f82ea2c85e043deb6d13c06dcd31fb1814092a12e98310161a309ffc7dd98d5bbb35c4ed283b821f928edb32860826e358d24f5ba476bb30c185a663605b44a778365305c6de3d4f5bfd21b2102f85fa247f6516cf948801ebd74598efc08c95413c420ee10ead2b6ac01a7a8639ff0258f7631b809d17325769272fdf026e51b4dc039f1a2a316dcbd686553c3b30a6aea448c596454f9ad8c982f130b71ff9c997808dbc427bd01f26d819d854b0216e3226606b7985a3c9cd572b82d273dbadfe2949129ef90dc53b7aee6de6b6f1a8d13836364b8d1f863ef93655d5d4d52876384ff54a65a24c02e00637ca1d84aee595b5cbdc08b1245e8645d86a03ac4fa5d9f9be9c0b410f11808b5aec9c36c14278479b21aa46a786127948b56b1506712df8c1e478918d8cd3f55b19a15b027bd6de6eba94a8cb8ff9d0dfb5223685d249562eac088551701d140dad88dc0b61738deea8ce017f14d518c55e4d80e314097d512c1d10ef79846df27f24057213a51023bde8bc54634008b26d99a52dee4b7005873ba838f1cb55ded4d47f75f2fe26434b71736d656bfa35f4a46af0549e998d70e2bef0161d98ace46c0411ddc0ee2a007c00a839eae22bc966b500ad8857b68327e33e0730e5014335085ddd9bd85e1ddb1254b2717a8c98a1642573d25e1c444f5135e3c4de825279428e5dda8e0c40aefa23d883274144404c244c495cc0d422f015beaa343343f038bf2d7b62bf120ad46d2e84fa3ff54863ea75634b68446bee72ab04b607de9250ceec298ab8dfe08895b0585df2823476ec0c2639895ad63fb84160a206c2720d9480ea92238adf8c4cb59d5f283b90ddb42e4ef80f82e1635878bea5744cacbc92445941974ad243990db7c85a91f4bc3611fbed3419bf35e979fd7d70e385d50432b822ac94ff22c5bfd8b21db05a6ff57384299eabc5bc7192d8243243b971a76603a4f27aeff961a878738f2903991182095841c7063b698ac4e4dbb830d40b97ee684f21c0688365c0b24b25ea1650889ee735810ed61f00a9956fb6764b2654db0d932d097bb967ac4d496b4a0513cb1769b534f12c968e7d0606c415a090a1bac45fbc47d541683ebc84da9b741aefabf14269a74b7760f38c544f3cb3dd213f197153e30550de49a07b9e9b624b16260d6458a88323c512b603bb5661f78eacf8fe9404a37eec37b91271a7a26207364e45009b3abca46614bcdf10cc183f6045cc78df8a95b9b8a66bf8f5a8cbb3554a47d4e5d6b9321c3e13d80eb67d13a2eb32684a992a2f0cee976e3c8f9d517911b30e17a5def7bd8f3892c1d61d48a0a14cc8eb1e02685ffaf86ba366caf4a3f29a6e953339a61e8e34846f1173edd473a5b6417518c262b3bdb466fcbc124d43a2f0ec0da028639d059cde60783b6dd8654cf69bde13c634a74b3481501ae387abc6bfdaa784b78286bbc9757ad9d2a3d7797c345d779d012635193d23957e8161397c893b6268eeffe604b8415d49100b7ef021c6b92e0cc5b388e8410341212849c043504cce1177b0d1a72f0528e2990b2deaa629e18efec6d98019e4247ead9c4d3803061e327f465dada1b3bd955acb9c18de853d75d6c0b491733ea2da031babaf9cfdc3788ea77df3915957955b7cfba71863e10da7bdaae603825805862418b94ae83c9260ec92b37f94b8fd1ab8a5e0a005a6d90fec6e4664d09eaf0a074addd264b38e2c15f3dd647a198380f0c21e269c47b698a0f8504d7a0e377dce5667c4967b10da526cdd6f2dad95fcf67fe2acc82930d140ac400838a66666bf2443d1ee30df4b52a2a7a28498c5e8695ea7ee8d4fd9b1ec22f01d426f0d2a8c6b2eb8eddfe354fe5f634ab33b73f47967b64ca2d3b237e140f964a19310d937073c6c6dfc8c537d75875a50dc0c82697e92bfe6dc4cf4fc243f606572eb87d936b642eadece303465a52fc6df26e97677638aa2e30f3e561047c5edb3bf5945237aec90c61fed283238475c78042caf7351e367e0440694a51989a034bad33c43b75d07d281fd50781f149a2ea24dff889a7267bce651fecfe542638b80eadea4683b13aac07ae5065ace842e88b43c467c4a7c8955f764b838b981389b7158597cee0d2822d7f69793e64d246ed716d62b47bf521beb03bd1a5484eaba28ab43efad003bae8c244cf7b1952ba226f579babc215adf5362d905a3de23eff02145ee91f445afab5da7fb3340fe283d6d2aad415916aa6759c3ceb1571a9c8f35ab16a35fa683de3bb635690d8d089a84b8a5ef2127a223b7ae76452cb3762de98662ca7a8e059edffb9bce0c433ae48db242fb6f7f3b80b3d85772b9091ead76987c81c9d4b55ebcd6c6c91a57c6fa3432e87c0b69e588aaba0735b01338e0796e13e278528c6ed0aded8af1ccfb6de09b7144e8ad68c99cc820480d522100a9290ecc795844512e14ca7a406aed1cd9b900555e6593db78c1cadf7821c457bb36bca20ebfc9e4b14fe2320839556ab9dce6e008bcc2ba728cc1918c085b912d0770046d638ff6d0ad129f721dbaf5d6582906a7de8b4c34e227c946191c379e633583cff08b469664c01b9441c1fa4aa1cf93e8bc768fb80ede58487b83d250bd2787e094ca838756f0594bdfb74eb9357b792f426df18d5808d2d691477be8966a025cd297f10c166661969c68a206e0ff1757be33aec103faf615d8abb8c7489be2190110dad3edb064956b0b05dd450dfa9132febd5eb6ee1bb28c101b4b6f1801b5e35a402abd83cf262783791541f1c8af50e1f78c2c4f983f980fd05d3a05f9f70e1a1b98885e785ecf55512c82e19f5f2f100db82d46f035fc8ccd42b09461059f1d032095006c38ef750fedc4ce25c64922f25239792b38ac75a7147a5a89945459c8160bd00e7ddbb599a76c205b71dbd5dd77c018934b8c1503dc2df2c8ecb92833cd89d69586ce41ebacfe7a8752db1e654a8560d559255fd851174b87642912a0acb3642bbba4cae63823a9007dd894ec729b5c593da6081910b1ae925c6e136baba3a9440053892289827579a463e79caa48c94e28b65f912dbd6917d5531c099d82f6ff36509dc8481ca598c2ca31e4ab13aa44278269b302017bdffaf7e1a5603afba98f69616cdd9aba9fc4e826a1a495e4e5e0f84960f52511511f1a7c8cebd1a050c5246097f536a648c1ffb4b3ca166f3d0665c17c255f5d3d9e76ebc304229ab7abc6dc4a4340fb33c5376cfb0c74a129de13dee02fb332ff581748a23155a5b310a74417df9a71c8e773c382007d9ce8264fac2c1f352485600204bed1c8086670e827706f8dd5a2bace0425d436750c59105e40ed1e07b1cf70e984901a9095622f5dccba99063c13a6133af52f158563ba9836e3512e5ec9616ac300f538972bbcf6f105e71d9d356ffcfced9bd3ff7883add9327a2531f6b9844ef7439966276f573e3ddfb7ed1303cd16c5c993b52b7d5524f17048c75d0921261a4228077a1674fb31771fe59026ddd8e4aee78f9493264ab9e1cdb2239016f3547457b0f8c7534f9c96992efe40116c6df19639469cf01790a4ddbf11e784fa11b128cfe7c920f3bc05c567859bd56e492e910ac920565413b21ed299a3471d00c3f08231067d802abf65715a7c9412dc8be86f2e1bc1cbfd5b7f7ea30461e2aceb275b2c43801a67d39035d63fe0c95f7203dc998cb95c959bc46a25bdb799807398aa50390903f2049ca833d81fd55d7a483ee899260aa65ccc085e91b35c92dea6aa8e7a6c55e39647955c0e41f137cca0d86b203b3e0aa142a910986847d1d0d87eb1f75cdc933cdafcb437818d313ccdb8e3a0b2f799b3e8dd66a3789a3f19831122d646ce1f53598c5e6337c95b66bd540089fafdb41070573e7e49b67e04e63ea13da26f8e64317b45c0ab72387c112d199eb86b28eb364a665c55e365e8af351890f77c6c46c97060740351fa216bf83f24366b898dd3119ff9d6b14985d930170e7c3d831f754dd8ceab13a7cde2ba24ff3b8b64de7b7799ca750353024cc37c1bd4b84c429dbb1850d3745cdc64f7f460e07822b3700a18428803235491c2a5e1cc294b2e315683628c1e7265c61a6704ab8fd73c3a62ecdb2d2b897e3c47be6d3625b76a0889ebf13c82d4cc26148b9899b8c4df23a66139fe6bb62678eb313d54d713b5271d1d9577fd63519552fa0aeee8e329c027a3b18a56c1c5c458dee44178e127d2e3651a35b2724d939e9646f036c577b792c772623f448899ccffe08f05635cb664af09b4fd63409dd08aa708cd9640fd4d489bc3de43b509d1e3d2060fea7b940840638923c43301bad05d7d8b38a024f833441e79d87bf7313643544c1e0fe6dcf83d8ab0bc76e2435996569f9c46c95be9b06409ac573a496e1ca7ac05fd181ca00e1b9892cdd2b19944081dc705f92a65ba8c258c10854ca75792a650010e474cc83db217ec2997cc28b2a7447a435f83900d2066146844a59e90d151ab5cca9a152d7f1a51f6c6316b6b232eca26c3c63a7d44f1a3260e6d16848a5644f9dfaa91d5fb40be85105bb8b477fa0f96ae95864d62eea954af2653bff4a4754219379ae37855dbfdac45c0718094d5356904fcb128a391b9d8ccc987916be6842d72732315e8021686720618eab3193777ed90d5e2a601a9b29b7d4e3c6f60760d10da7e94337608f11678261c54deb36b7e65ac5a6536422ad6a2aa35fe7a169beaf579211d94d07c2ab74eb4a9dc99a5f25b065fb8824a0c2abc418f867a484c226888b96fd25ab52eade28f25befe6beedf7cab829674619007474ee161aa58c1f1c46ecc1012cbc0ee4c0e31d7b6683356230acf49bf6f4a4e9b5f92cdaedc2813733f2634dd7d1256b07082c9f22ebaacbc855000328c3664250c6e9a0b3000d59f36a661084e612fd5e1fd580aadebea724f91d500c4efb41291fd62702f5706a29ec67dfe5174031083f2e09f406bb633d78d4589e998386c16c259298cb289b570968383f87f249a05fd006405484cede4a29b6623d342b0d3ccfd6683c0e2014690b48a1de95aa21bf2b40bad562c343020772613b108279c190a7c23b11ead9bb5cf9c1c6add4dead401a37e74b2394e2c27fdf19d1c1d6fe4ea6564e6ca17164a4a1e09d2acf05818866bd18bb36788ba346b28b3230eea11b74f9a3558c4584ed9c903e1479208872c1e72f903e60211cc6c6aa9b62d8fdcf5cc33184171006a6c08e179d2905e86a8a8528c121eb9884c99c6dbd0b3e1299504cbc3f5d507ce33fe6c845d5125c0fb8e997d40c744826cdc3227fe0b1526f9cec602876e39bffec4950ee40e30d3488ce380e5193c2b222302c403d63d2eed3b38fcae5919ea949dc6a3cb27a07d5f10cba8e6c7dd89814b7d29cbec346d65181143f31c25befa9725a38ac73b7d884f368096e513ca9b80b8fd55ccec86afb68e6719c093d5e7898a443d7e043a44c50de83ca2df99a2b7a5e0ebefa60fe23fa3e0e83abd562d1d47be198b1410726f292d8164f18dc379a4954742873187d34b04463768d806c9c512ca1dbc3cc58478ec318882bd6a4dada5afd7670e5c44a32f7ff1137f3a107d81a286b0aaafe346bdd606467082879525ecba4114eb052e65e07874dc874ee36e2fb7b9ef40e8bbbe3e578cf730e417c594b4d92c4847c16d0a7731cf80cfb1c0a8f2110a8cd77b89b4a9065ff8e74d15c03461629489fe0209c429393eb6f8d4fc1762a7ee8e46177b01c6a196c40e1bb0e0259aca1d3a2eb4e34cdcab3bd6a3cd2e653d0ebde8e9441aec58ef27949cff570096edaf81a29032ca71811eddc22118a6553bc75b8aaaa791858bbace8eacd030958cd59b3728d800565bc81d461e7c29a3ce1b8e8ae745afcdabf862664f4f9debf3085ae354852081cf38e63f90912d764223485f67bd09ba28b846d2c2200aceec5d267b8423df87d59950784d701a40c7647615edf4e55b8910b1140e91b408ca0623762106f23e82910932220dfa2da06ea179ab4fe4537c9cc48540a1d185ab1eb0bfd3d4aca0b56db4dce8d8b8998a63605bcd4f9d1532b4fdfdd1ea2df5760a50d80b9dca01ff0af6eab58ab18d5fc10184fa3e6b2098dc95f3d5e0c22bbe33e223d19d85b8b7e3c39f297467cafc99bc95b0463c7a2e3d86c60f5b23e9a5472b1bc0292c6ee5e41fae43e61e2a29c09165f409ffb6e8c93591fd0da5b914c9fd39b6d7b4e83688af1e37644989295a0a90fe10a889654a89d4aac48fb4668102f64a8ba5a91bd842b23e8a10f2dcc6c2614d9aa9c676fdbd8a71c0e0b9b6bbe7c2bedac3bf0bb491a03c88e7750d7d5a73e9b5acf66b0faaddc6d5bb87249be62524224c2f3f2ec4159fe6a683051a09d79adc2e05b7412b1475bc5252fa4c58c79450cc3cb4f0850999eb8acb20f061be2999433d1ddbff9755b3eb47064c900f16e81285099a80e24e2430d3400d6e0d1ba51fbfe7748f7b30e214c5e437740584424265f7dd36e53796aaeefd75e0fcfa9bd63003c96e8453dd7fba9487cedc3cc201c3e1833200dca743b6de0c6895e10998ea696fff21602aa3e9925e38e35a0c43393082fb728184d1854e14934b7d117b44bb3b755e15d1e5985fd433b0470e2dee3ea32f1316600a4683cd1a9b339e447341a763a97f68f4726e7fe95256cdf0d5175aa86c900d068cb1e078087c0f6eee06f8c7c522040f5d13d8ea4f9a3d584ab5c67aeddc4059031ff33387d48fcd17d9272f96c66227c8d28b23203f9c304092796c716e82f911b14b9cccb9fbd0212fa869cea310ced9f84f4ab7acc72e263d0721c105eab8887058fd1257c6807d3eb4b372312299d0726a6d29c1d8e3f5ede34cab96add36a17c4edde2e0a5818c53668470a8ee4e999620f22241d39c9bd658e89199e01a00c6f8ed5e6db821a76a1ca7095e31d2cffb1163b74b0dea072e92e8ea1178b979e9acffa91edcb3e6bf4b3b752b2ad171a1c1a1b47d565681dc6aa5cf74e34f412196d2fcfeab370c7a0304bb6219a3ee3e74b5829bce4d764ac1564cdc563f9d6e60702d82d74fcad7ebdf0e01797d08806d14fb02a77a50d67a5839671d1a9df0f127373eb5148fdbd6275759055272bb8f2f8bd65cd41f8ae4b1caf78e374e97b9ee75738ad0c426dfd6dfec78a4fd2989337f49cc2c92ea9a87098d1daa659497e066b4780e11aa715a98317495175238ec51d78a7bc9849ac95c96f3a80ebd6d35cb64a4477820359b02c16041bc03db1fcd7a692d78ec79ce806f18325615311893ce252cfbf4e4b61df79f6052d3a45ac2e7ec0efd59ac5949bd31f51e188a68a5cdc2820d58d333ef13d5f95ca1f47200405a32cb7556d8ba31448d51c443d969da1413b784fec1ffa05c768b2504b7d51b69de9a28c93898a1eb18916b531e92e0f4a9a7fc8cd1bf2e82e839cd7dffd1f2a67e09f26ac1125e7c006aa9135d5b61daf02c6dd59c67f2c2a378e8532b7b20577fa140f5ef16e7fcfb5346500541cbed24cfa378bc288514b151a5c12eb0e57c4f0b498ea3bffb32adee64d46007369f2d0e3a572eb5ff2a864a7646bb3ea5fe403ebbea9d45e83ec915e4fe9a6577c0627871d76bb0dd613f5aa295c92d23795ace3c94d081b6c5bc3a0cedd138f521d0eadf4fb7d9e18e998e5e4ed11e6b98b6efa07714df87e8984098bb71a2da50d4b734dd59492e798e60e22fd18bd74b6e2d4c8564e66e97c6c988ee969667efba1200d4402463f9e3978c4b42b73b193d09bfae1d4a0b96aa171232d84a8d605027e1af6934d9a499f48ca1d50ec473b8a512587970806e92509b801969afe61579425902a02d8759b8a5cbfcd24edc6fef0144ff503dd7f620a551d87582f23ddc806c1a95214d9f8553047887f7f3014a37e3b5a492c720be0b6fb3c78f9d9b49d9d8d23d63a8f9b03df531d343b0d69c607750ba8f9f3ada48845c61c6dc6b15ab551c124fd143f117d33c215c76073f6c5549955fb7a35104766a600fffcaf241ced4269978ec709ba0630bbb979c76080ecdb38e35ab672fdb462a65ab5578668e09083118d4bcfa62844f2943ee18854d1a9f0da2705a7e802c8f8257eb8a2df1fa2576bd897b214313de3b61a45cbbff6caf93353eb4dd1b3535327f86d915a78cebe996dcba88f0555f29a2b36c1e5908b359958d1e3ee8e7d6491dcf5e9641c05e699e119f1b5e6b36a016a771426e9a17c0aa3be45aac02011e99b75b466799fc2ccba9e104fb2f951eeb2743853dffdd5b646811c8c9e7bb4edc0a9108609bc7f88a5519e7670748a7a28719ee1167939452b54fc7966b0f2e5f20d15ac6189710449d234388d5d93c7fe7edeccf225168ef594a689797842a0ccbfa728a96a23cf73be886d09dc4187fa7fdeac867e3202636110f7d8ec41e5e289bc184116e42693c224a4e58e63a2425ffab9310ab33464160d452ed66f55de6d4f99e7908a17437573bf7c39e28e43d316b17b3520a461c8636061e9bd6ad6d34879485088b805ad38f85e58877d8e7c03eab7c135a03a6457f2d63ef36873dc343a6ae76b1bb6effbfa6988b952029f36007557412b8d853bb373043e16ee86a731fd85fc3044d301511a169b8ef20837159824182d01a1f0e1be0eeeb62521ad8f70849678f290feb1840030f43d52bf15447d1dc7c90d7622774ca2bc344d91d5fc47de1f1712ae3d21be171ced15c8173a3bf72ec2bac349bf127b0ae15be68c1cd3d3d880e01b7c943e9d96032d38505e06623dace7114a2a6ba074bdf0b32c8eb290babeaef1a1511e2c3c1d2ceef32aec632d266f6f3ae46be5b973743509f5344ab200d631006eca462989c7a1142ed66d6a5abbb08a6cf3f06e15a510ea8273b669b9c143aefa6a1dace5f5f4919aace2a2b88628f97c2f3e63e36d52c3e2a85194290e344c10085eacef1cedf50423c0cd2a1619120d1c9284e17a3a7d0f61fb7dfdfa7bafc2832db7fd470c7286ae050b61a0d3998cfbfdd3de8fe101cfeafd7028b4fac627bf9f073c6bb12f39f52b56e058d36f2cba8cb41a9709d5d2392edc94e9f17e284d78752886d5b3e3a10bbe9caef9f304eca3f173c8a9cb352093e0bee535f07a2f6db765314b1b7588da16d64f3044e46748be0de84cd30593b6e78a79a7d22a73a6014b5d3cd1955283ced7c4d2310f83f4c2bf954b53999faa1ee10a3969947b604fa0decd5adb5094fe69e839df0af51d15525cff0ba27b27b83f244c1a9b99c6a158363151ec194cd282365c49a60914ce69440a8da952225494fe14198d489804f275c9e0e14d5c1746d214a6f412f9134e25e58c1c6afa17f1c9b26beb6b1f0707d5ea770a577d67c03021b42779e1165f7834899ec89e3ce54cca7c80a78c5a7175dd56186ed07f90de870431bb715a88efa6bf886e91e131f24244d7c4796a7645c63875a21310bb360f2ecfb995e7a397a09a30e7ee5fb3757386cbfd7f98617071937db730375eac91d6ca4dff53d1e59f45d51648baf0998e9111e7d5dd4df503a659291a3014db939eff1688da613eba351743e29f62072770e571f1b592a1703cdf01ce1694573c293f1bb501270dedf8b48d4a84a3df4b7bdebc620c461e86bd87c426998b9c0fce0d3524f0e2528595220f79295833979927b0ce89869c91186f40207a6dce9925d24f9714ab422050cc5f0d9087fd62d9e62f6597f893e9cdff893dcec346612a655d25b98cf1dd91e3ca8c2348a227eb66b2b072e5b2b5f6475b2d5468ac04f61872a3407cbf17b9145151838929eb74363731bd08b492b5949f76f9758eca109a050293948a55fe64ec787e8ceb5317cc780608d69b62a4df84afd1dfa64485b74e17cc94f8115816bec7a825ac05864b8c534af0912680768c7183a4fddc3a262045d4029f80226eb3a2dd8abf89f866fa79f577fb02abb18ac150c2b04a967e1753e5e1031a4f45d9ca957b8f2d08043190c106d18654ec099a4f09b8b226b46cc4eed9c6e6ecde7c6c01d2c27c63bf06ac94400b3b6fc3f5e6be0571a1144f7671b128bdc8c0fe259c7f1a59a98d400bde030805236ee42df887538b0021fdaac0a7d5027eb3c93d0bd8fd03b0a39497d43d0b8a7040ef2c4255dfa1bac162fb39e55eef2c86042aa0de59dcbadcf9e041646d82001fbdcdad32d4e46fe9a04ed227d97652ec3fd49a73fafedb5fd7f34fa32c795e11c192dd3b8ba345613988b6164463feb5041201003eff1f53adaa56788e0bd6b8eb7a611409199d9e40ee56689a714f532dfc65dec036a8da609df4eb08bfc4a21e7e4de672dcf33392b1f1325588dbaf99caa8a79f45d852fbb26c1af84eb7e0c420ba50cc856df1412829711bfad72328c069b7eb1292a8c4660e843e31787396f260b24d5c5e5fd45ed6709239c2ece02d136faee3e945fa2d81b93414075ceea0767731b535768e925c3778f0360f4e9c43d92af28958285ed2a74bc7720a9a3db155a701fcfac7df6163feb8762ca6a207b84cfb8ac5b11d26c413c725872045068f2f165f16ef654ba1c466c7b16aa54e46bb6a69ba554bd3afdaa741d835386e9265996d99aac9d9b1a35d8283719fbc9c928ea34830f115abc30354c604eaa999bd5768d58241caf7c2ca0694da2cd0cc846f9566393f624571790966fbe78082201c592fbc04c02c5066d04ef7994eb28d52fb1b1514502259a21825d1d65345554de97beda8a48b8906e771f0564f9e95643f5d1b35fe8b3957072dd20c41045a6fcb9b957925d9f15571429efc0119a352a59667fac7c8037a491cf3bb745afd00a0ed95cb5461424c8b8cde42cdae64de386138a3fa854c86f02c135808f3619921ac25b375431573fa42f68042ecb1021b9a5eefef21093f1e6f20b16fe454d9f23936839f849873c6af3ebc31b108ffc8176e5a739f4bd5daf13d736489a5599605493e8fb9b0679e150b9db1adfbf60850cdd742f41c24b140c4898d84ff3f2781847f04e119e8273eaf51b49d32752c38f0ad8cda2bd52c7a49259aed8ed2c64b99f9290acc9395f40bd9d7470a19980dcd0dd032b2cba8874b5833e3f088d6f96f9d8044d2e44d6f34e9df5bdb8b179ae8cfcce89e79155a9fea2cbb4fffe316d89d3776fd4cbccaa5c268ead0cb46014e3a8a8bca70e61497acc6b8310ce35692bf638be374bb1b365e4e86d28e28f1c32b42f3fc80eda63f5cc9e85f21c7cbb37e268a6bba91c6dca029757d87fed079d08984a0bbcc6a4b489e147df75b136bb502321799ecfd1da335ce33c97e262eba4a06572f9782136069fa006d4c5a33103871968906c3348ed78d3f025b59e13b70440d218fbaa96e8c8bd6d8b1441200b10648ac77305b5a0645cd2036ae8eebf760089de8d480a3c3106baea753d1c6f76039db4ea53b77e3c2ecf85e8766013eb8985d4404006533c0ea8ba0213004ef3518ba5b3861c8240110f46935f67082f9371a1dee67a73002d85f88326a91e5625192f55016c411d4e99882119e600a27c0051b427f27cc1bce45e6a601459def4e4972f252818b1a85574badadf8fed808ce1663ae37f8ee26725fe90c5391314bf3280983d5eb31205906d52ecdc8eeff9a09fc6008e10a254a4a400f3736214606ff2a0aa7ce5a1f0d79834d166fad3c368726db03a8ff1d8ff26b1277957c3e9de5189eecf4914bdbf54595dfa9b512b7aeb15f286d9a46a3a561188bcb05637f16b7eed74cffabe0b2f4c46bed7c6e8cd7dabc15142d71778860424b74a0e9c75376513216c9bac59aac20741f51f63ed2cff097eb5dfd698306287d7ce25dd02d8b8837e2cca3c1db0cc3355bf696fcf301866e812c84631e545d596b8ae35872ed978f9684c13a30d88a497c9775fe1a5d8130fb38e722ecc3809f5418047a103d7e0be4df4d9a00f9af2d0c794c4ea95b5b4ec026402bfcf6cc9906033be7169b2f1d96c3ccde69ccb7a5f34c5fbd7e9a6fbc5a67c19af8f3b63e9081318d1cc148f3c46c0644861bec34df2a7538d2c14b48c7e472f434610799fa546d6567ab09064bd51a9951d0020b7f5c8966463cae044f7911b8661a0716da320ac52a44f5d25e358bd4b15b3c99c0cda78c1544b8e8b0a5e443bab21dc79752ffd8a75205c98c249c040a8378cde75c345db310fcd4262e09403af4c66c9e03068fadb2bb4b20f623803251d11d1925569fab6a8042410be4096484cc1a2248f5ec33142ba426309bd81b5f6775be507e0dd3faf7156139d5088a358110e6bb181abf8ce3bf5ed479814ef07258d669d3384d9bafd2dc29dbdb351830d4bfde1a766297eb8f0e62f195468ad576d6444b5e7cfbaf7fb114d6b99e35cc77b144c7a50cb092230f9052d273094fd9a422beb7c935d00caee75ee0e7b04d32d5b8aa86d32f1ff778d433ee9f650bbed0a8086798f8d6c01c0751bfd252c6921c52d30e6cf1f9f84adac4e474c2b202063eb41b58578c046452381b4f101813945243ba22a333fa1f83fae8ef057b0a55644f88a34edcd400af8be20c12906ceaecbe79e57dd0287997c999a20058843a5d53e624108a393a303de50ad2ff84e24567aa8bb75d4873b55222f0a6582747d440c463cb17c909c4b1ed925b240f926833fea8f45c3f6892cbce53362043e7bec62f6caac42f04ed830feee2367a104f1598e65dc0dd5699fc1d2420aeefbbb1693c031bc2567e2783fae561ad6e0b2eb97b3c6274075979377b0b86e061250b0e1c85238b51e328f738d9d44310268442ef85a073f9fe37977f2440d41b8040b07c8d43e45298a8cd7b5f529bbc6f4a12e12194bc09d8d6d393fd9c74487584750e5042d795c149966ee6097ee29467edb4c59c4033c9c0c15ecae43c48048213b1116ef3880b73c2850801c1338e1901ac09ed5d4e9d19e2e123cd5fbd9b8f4a2cca38748da5d8f3b9f60b5bf4c749453008922086cb4abeb841a53de18217927d03c4b629bce52c09367defadfe9f5e321d933f6092974474dda4a660f6d76de389a379422ffa3e023da8b6a2c629095d1c8968533257f152980f68034f297b96a111838cf39cd53c47f942c292ab626596ce5b68c8a82228dd2ab8fb8ef2a204750f20d1a273bac497b421c9707846c80769fc0035c82acd289ae895895ccef879da8bee92e14b8da03f258222106badc2404fa10a67376ec7b5220f9c3cb362b1c9d4a0f9c9b85101e590f9d7f1924185256785e86105f903e74818a2acdd6dfeac7a71aa06f4e4172a752cd3dbb41e6b0457c22a358dbc347cc580d58230d3cfae6dbab3bfeb47e466fb0a08cc1eaa8f56d4247b285a60d1e83015abbbc6d516bc1add5893e38a2bf696bf1551f08253ed08bfef12fd5a057eeb0d9891daf13047e2f752c3a954a27c6713c366140eee92cb7db29f0b551070ed68466eda856232807aeda6c9576ba0520992ada2bd8ea403694f1bb82e7854f40f8e519412b1aa607c2aed00a1a415445a428da8a87fdc50f8556b45f491326b3eaf7acea7747ac514a7b505ce5c762cbdf8ef44dc0506503b26d42f4fa0eee5703326135ae2d998e8a953da72f75ab91e3ec3bf89de990e98e4af8c59de84a1fc93db35fa9c82c9a2df6d534c06549e5f1a69f6b43502f08d65c44d7485c37f33a6edd7bc0742d82b280a01015a39152a43a55589693bb5864e23b08b4cd58d5b02aac6cf2f1e60b897dc363234504de74144b276279ae7a837aa11dd5314afc76ac781139828da94e474f7200885dc0cb928d57656f83321f6257922b341990ba8ce938184f48dfd625f9be5044061e8b1f68be419fb8d10dab8381472ff840c97bc3b747e7e218e9480a8aa77a0402638ee64b50d1c029b85347d3fc6d8ef76f0cd94872a0cb9ad6b253ea86fcd519199905c6c5f352015bc38a99521e327c8240f8cede8358fce404138d7670f5ec7ccc67d1460021156f919187399585ce01fed32db4fd6c4a199a8de09cce993883fc8be3db193edae7be7deef4c2d85e61acb1f61ee58b2cc34ee4288139c1914b6962651bc22378ec68985e1d55173fc70b1cb61c6d54ee7352aebf93dc3ec69258a93e2f15639557a358b83092b63b3d0c9075d472620c3cd9de98ac538638cfac250d2a832c36e46f79c7ab0a42277029d8407304524bdb145d970d182fbf9bf8df9acf0ffe74f86e9d7667562bddd56dc77685716c709ab7141fff177861cb18ad52e5b8f329749b117247c26fecd9d014ce4004993b419422ac915692c820dcd4012ca69e147c0a1909e9ab0f156892345fe8314439ff85f02e4dacbd6f395806d54d0594484618297f556f5be14c5c6d12cd10c9c87d584bba7394b536e0ac2cfe342a265db7a18f945a708b75a244f9453b7afca969cd7536d852627d63116577a63e5f8f53ad02de048b2bf7070c53ca97ecbed2ca9ad4c4daa505877d2ec0147f77e374c96b3eca1d5663769ad9e71293bae7c2541b6176b557c15372bf9e8e795addb3c3b3bfea44ffb937d3813f2211fac3caf763f614011b7231a3244ef472016b7d6723e26683a7448dd03b96b580d44b03a29743ebff76282873274c5102613081120498dfc44470dff5047154aad08edf077c8fa26250b8513ad00450ab0d84e0ae8f771554e00819bc4fd153684281716f1bfc93cf51fbd27ef8244a43fb45966e9b766611c229eaaec219823c2090d8710f1eb2090a23fc427f7acdc61f415ab86687364a602feb6af6fc8dc47c7989946a02055cb186934f497f04e06360f4fa5294a99412ec86b566cb53149009eb67953fcfa9999edc124d2cc287465da746c43b9effe464cd6f4b51c98f8395c00c92bd3dc9ed99d1416ad57a5a4a47c8d8dc3179105fe23af4429a3e6075c633181c18c07ff4fbe0264df6263e95e518f923fc93e86f2377111fcd4bd80a0dd09a3d985a9fe65cfd12c777cca039c2c3ffba120f9aafac6576c6921ae763795da2fe9d51d4a219285a12bd20bc6652eb8c25c0048b48139bc11b6e2fb65ac0e7d360ebe4609000d3395e61e3e0d8897af8462e596b75a28345a00371c2111312fbe34adaad125e75a49cc620588fde8c2a6c03054916f47ba5d3ffa878a127b4f772dc2fe851ed7041627e3a078039542cb89a2f73c9ed5ad484639b27f887dc235c2561cdcac2c20e99845d7d1ab4761e9c1aed19c6fbeb23d4394ae3bfacc13ed2176a2ba4684106b3153187c773e9dcf2be4a98bf8fdd63b25ecea843f3d9ebcd3e15f961581f4e69850a75551d3883e8993459db64638e3d6444d7986f45fcf18d2b011990f020bf51a78808b812866fff339a5e6ca0d0b3d47f3af89e56df7ec9774f847fa6b8b3c1e15b44690b50d4ca563edae422c350f4889167df019616753fda91bdfc4700f02cdf1249767ea4a3a12c82fcf50681364e69663246be37df4ad1afe6998d24081913434b1742eb3ed4aa34054931d6672cbb1963d16ec929c84f2fcb243d21d4d1241a802db4f5d9df145f9609fe7e7f9588dac1a5419f3d94727727b9c3becbb47989187c0321089acc41134fd183e5dd2cc669e06d036132d086120b3a4d27c2f919da0c044af35e9647a868d9c8b10ee358ca784899419d7e6509a615e921ad28022fd9e75fd278bd68927abfd64aae8f81f0a3a187dedb115edc325d8813040ca9622520933fae4e160541f717462bd34161645c85329e98954766b10fef9e866f4790e031e1eaf90c0b5507b8514dee36d4b68116f095bb7523af69aac48c41e2c7bc1159f1431a6afa984db0f94897f1389ad75469a44a9cbd44104f61f6d7304e77f1dbfce71e35dbb405ae2d9b76582f41485d2d423b5322fdaaf52325109361310fca53aa5108a7c3712cb0e43cbef287bb6691cbf458fbb5a7d6075c13ca79c43ebe1d6b767df198f1627451507e99bb16712f4af79e8a5574d9ed5e97a767d6ac6117626f5660875ac2cbee60d54d8e8f2e37d4102f82dd948629f09443a6fc404e3c6644874d79fbb4e859ee4c06b9caf433d7842ff0a3a2a435b2b4af7b606f3810fd298b9a2d97642770f47980c7e80f5beb59d0b5ca7a07ad21f25674d04c2552072cd034c0635a3df391db53c270908ad59457f718107115c2193572199a777054ef710961d64dadf3f44bfecccc12a8aafe073085098527d93f7032c45203dda1f2f6fa313ac1a0c336900f043ded733c4b54279b68c30809f6537b0c4fa7d9041160967842e7b7a98deaeb8a08e7d28ae3775dec32472f4b82cd1c2ad902a5dc2d6815f7fe024134b7b3c0e4727a214976ad1df75ec1ba749d6c2b4a78d15d423542ea56f1fede80815051b703a29e23bf87f90627f9f320e64aaa5d94adbbce98648303211f1510803e6f95bcd9f17b18e8ac82ab5bcc629ec47e98c0088ab1aa10d28d952f07a045cfb30ce1627e991784fc37bff54c6c95f7922b8ea4eb164f466a6006957684969fa1546662ad8b43d6e70b4f79f55f1689647605e00dba379f37952ca94bee682768962a03ca9a7a552f3cd86d523da4a09f973b3bd98b6dd05e1c6b50616eb1d2d846aaffb7091515c882c3526a7739893907df363cc55c7bc3915b3dd6e0bf8fffd626266052bd63bfb7a1c927aa793ee542ebe60b2eb9104c4d12903953269b539325925e9e516ec5ccef9456d6d0c5ec04d06ea541ebcfdc66a095bb034e934f046bb20c1dd7e1f96b72ea51f9b7e97270ddfce983a519c513f7d13f642083c7f53d346db430b56e05f642a1cac74109d7cd326975dc6f4ea14c41fa8e11fa73b5ad60a631bcf3b71b0403ef68bacb388fad9a50c58225d79909f2505a9ebe372c50d7077730fe93263dd709c8414ed6313514409f6a338e02e85243f0a5a064a913d8458ec35f2ba75a6163540798d4b1fe2b0f851b28ae12fbb022f7095245ebaf70d08e80d6c7f72a12cdf4566375606af479e01ff4402e9c924146a3ccbaf5f19ac2c4c4a58fa753396658c435c8c06239e12d98b4ca370ab78f528d9f1f40965de9d7b0762a774e4e061e3d71188acb5382fc7fbb2585d5a16ee5ad61b2f4ddb221f319492710b44a7641353f0984eae35b79bfb828f29216ad978e605b24cffc86d380a7e9dd3e46351918d3f499b04ae2b43f5b2e47397ff5e0191c954fb02710cef75015a09e348f5bc6dc2f095db172e8a78f737c77551aaefdcb278f8a5e71f8b14f7d57af1597ce26cffbeeece632b838f028fdf7c469dd605ceff52063f28ab4f46026379e5249a270612e5c7b367327eea3ce909bb25f13262736b5f8041064f346372a761dcc6e63af8ae2aa906d7faceec34d139f1b39add12f4d91dc7614e76ffee681b2dd3f9e8b6163a6b450b75d91fc5a3ffa93754541a5feac3fa60bc1b945fac070d24651e4662716845ecdd4cdf0c469f6952cc5e29fbc23543e83049ec307c1bef711fbe9dd52334de40abec1a786d74aa5f6717acc5fd93b6741e915d5ec24a3f64e13498a22cfd0350cb83521fa38fbde3393b544a9f474b5341473bff7288c3440eba4f63b404bbc1d9829fcf75def1de5559892d868db80d5ffcf2dcf05346a9c55524d23b17c30b7cdc4d4021a24186f43d929fa34553c9c5e3957535acb199e9d8cdfdcb6a89c71c9fa4148f90bbb353e68c10ed6f7d293103b056a438bd5dd1f2c9e6d40ed908ec54d693a7a3da2861ff5e00e9484adbbb03fd755c3484a55f5851c3653f3ecc3cc8836a28bc9b5346cb6a8f28103a7904038e55a473dc7fd3354e43adf2b856314769ebb2cbced51dc1a124252fb7a735e3ebe614a1f6798fa9e05b4c76df64778a5d102a794b850fdf74a00637eaeb6987d4be2be86b6d8bc7409754f9c20048deb29298360267d43662a9d293abf4ed72f83ee321cb0168b44d145d107f126b1f0d09ff4bcb91d38f171b8eabbe367f4805eb98c7e1612004f422e81c061e0a253c07b8c976b45d8b9e0ad5dbf185f482ab51b622866d90482cb285bb6df468dd8d4de8f6137d7993e1d30e4263061cd7ba01e5001cc5bb79703d35166a4d61cf0d3f8d71c4a632cd57f9c34f90660ab8e9027fdc800a4570e56904d10a237371fbb544549603811213ed6d5dccef0fef161164e30097e1d219ddfafe9b52cf80f3306331af9a71666e5badfd8f08ef29a4367f446cd222e7971094130726a64a3f3b6f968ea22036f7dd13231b44bcd9219e29e79e08d210c41aefa60885f505a8a837d4c142b7fa83f291d6b754698845936ce377e7ca4e2b780b6ec1f4518723b0f55ba0e08e604ff5fbf3fcbc0d392bab52173c273d07f8cf7ec0b497c13dcccf368927b4f9a43d5b33a9853bb295a3c60523cd7ad526765d1bda09e822aa579943b4f4dfcd0f9e57343bd8e0a046a450716b3ef380117e6612a197b5193fe7311ad01f5980b3a2d2402cebae285a7b26d8eed208017fd395345b2b98ad7425fd9e5702f47b456ceb45ae3d54ea6d2a3a2d9b5d17df110ac66479d870c3ddfe75d852b43e0289427a616aea845a4e1d7cdae88a39633af13e0042a2afe85d83671e8dcb13bfa1b1311e50b45801e28d6d7c929e3e68be580d687fec14ec6539b749a4346e3eabcaf5acaca5bdaff621cc05e604121a753727710d3008b253b3355927ec0b52f51c896e138bc46012d7f1803b0315be7d405156277b42147e0e6419eb85a73ccad2eb4d6bd19b21cabec393ef6630c5bdd418fbaa922de70804dc0ef19d740354eb9432fe9e7cd763e90f069bc03d79e1f625686fdb52a7eaee21575bdce5e79096f95196faa255e59f1dfe37ee82aba39056eddabef0093e0cfe5467e52c1351cd030529973a1e88e29e43b83a6d6413184edf755dce789faac938aaebf09441e74bdd7b040a3f030b9f6f45eae9ae0eaa8b6e9a35ec2192caf7887c580d1981e19d5b2401910ef4ba6dc7beb6aa15bf5f90c235443122b3bc7aac80840bd72ad7c5a73e408e7d276ae8271d6ea298f8f57673d16783b7bbae9c6b1cd1fa72e38beb91a4835a7feb3380858990e46f161005629641ab237f12946593404d161c9f3bcf3c8ce3570142fa4939d7ac18f325e3bbe07a887484bb3170afbae3d918d494550016cf24a114f885927df2e25586043b9e96a5b7bdbcbbabc78803ee24bd7b4568b097f2c09301076cae1505d38f3bd7f01deddf882f9a6df16223f7c0b7939e932636c2f210b141da44585567de680d16d3133793a4904feb424c2016ed8332e4c364d9e6b1fb48621c38178dbb8e30360d0248060288ddd5adb29f1ec5668db92841c9c859537b52c05bfcadddffd45755dff5a30283938ed626c8f0b0994556a56413b03f50c8be2d86c0e3189a90665d7190458930f93c16750a0f64eb8b452bb9410ffb90230dfa9dea4c8a5aeb8f13630c7f3cf96995e8605df4ab527bc2ea03be834f26b680cf28d23d583b117b0a5209af2bdf2aa7dbc27d4d659462003b1c21005c0a334aebf3ca84e560fbf53993b2500942dabb4a5fc45a5314c14a0d2029241111bff1a99b131a05094d990060a4413e882bee5aef456a24469d88b68b89ebe66fdda67f0794b992847498b92aac130673c1e34c675849fd86102d21ea8b9f01468b70b148dbf13e156e8e9404641402fa810d505b30cc4a4a070ff9b1f4eeba4974c10412dd9b42cef4164c2008296c2608b73dac01090b81757591d97b9f0e0b7a8bedd6e0ed6af85741c1248ab613add39c383527568c3cbb926b4fde41f0517a9e9e2f09217b6fb2b79452ca9402cb04a504fa040fda5f7d67302fe5f93d3ce41e3944e6799f9f2f8d8093e7cf97a1e83ba1e879e7feeb2545863c9fc7c9ac4954f56a8eb9bd5edcc91ccbc6058167dbc95c087c42903bcacac1f33edfb12870bb4c5f64bdb4c1b1e6b368c88d95a3e759dfd9fa1669e7e7bb786ddcaf3c3c7876dfcaaf9d106424fa3b12f82639fc00c51451aa30196d2c1c5cdede7a9beb5da1b8ca62fd9d9e505cd9559e2c1b23c8df8babdc8d207758a44fffb2b0b8caf529d244aa3f822c99f2f6148baeafbf05c9df5fa7fcbd6d0295b7ed59eff584f469f8e25921d28bde60b5d5a07f7fd5855c08e670bdcfbbdee7bdcaa20f7b8a641fc9f52ceebb900bedd3975344a2dfffbdc5200cd750caad0771f4bceb7bdef5ae8ff3097b7c42fb1f7d185f438b91be7f9e5fb122f07a1ad3939f4ff87db34268a3184ab9f52680f12b78ef4634e68b1086f47d679e10e97b6f071781395cf807237dd81da024a5040e50aaac072849b1b17dfda649b94709f24a29cfce7b1e36afde5b7dcfc3e61d5b52e6def5f5d881415e7d7b25c85c87574a99c3627dcb7d15cb98ed3bdc55eef1e909891d267754189930b94bc12448ee91081988728f4348652119a2d0cba20cc912cd903b821c3aeafc1dcc21685cf15a842b3b93e5fff84495e5d3ef0b02875cff1c89f7f414cb3d3e313d9d004a9d9fdc23143023942532728f4fb4c83d3e41e341eef109922728e099e3a635f53d51a5e5a4079e18c6225680d126c696d18993fc82e51e9d30e518e091eb2fd286f9bce879f1b880d1b23fbcef95696e56bf86bcce20789dfb47bc3f955c09c50293dcf93d69aeca3bb67c820b96cb9bac136c36c1a7f2095f76137c96777c90fd67cec27167d9fff3305c05e20927aaec493373b28499a1b4cd647aa4c3b72f5a0688322c11ae08c3410cc9f2633fad86f21a03cf7f4a8ed389da509d966c9c8d0d27b59ad239793f005932e49b62890cceba608e94b5c84c25809b0370d531d7c340f58b7045d8ebe554963ff09025d72eba2e9e062eeef1f7f6b129ce967b6caa1a9bc43445f58fb1094a6a6c927ec3db1e23cead6fae0883c57e3ee58434cd60b1ed25651b9b0b8b8db06dc003ae00cfdb97c00385ad695452957b4c32271b20f79864895caba5d473b362c4b9b33afe62b8b9e2d57144015780e7fa236cc00372487e4d32de215e4ba417adafe3ac0a18b835069a0bd45a636c71abaadcb0a16e68950f77a23654a772f727e31c743f0dddc9c948e9dce775b5f67725165f302bfe7450b65814726bed0bf947cd5c91662afe644ae57f6f43fef74a990b452a23dbce7e40465e61eac639a09ba5513cd98641e0b89594527253ceed7db33c2ad4ff78c794565e978e8c499c8c48d4c8a8a26c9abaa155b4aa4ae765dc54dcaefb2973c59f4c4519148b304abfabb99b1ecca7ff490fe4533ae459098630dfd552613eeb5590dfc24ad90b45ca0ac5ee2df7cdb2d1fdca0bdd29774e666eb693148dd73f9e277a58fcc9dec7e450ebebe4bec232f75c0caa2b06e5faab0f1272f1d5c5d79ff17d3ce1f7ae56f871a1e8fd7ceec3a2f7f63d4f28f9c6b35fc67f93d967ecf8a04e1d3ad92bcaa252903c579884a22cdec813237d8fb4713befee7af163854561772fd4fdabe726910b4b2c72138bdfe7f3b966493a06891797fd1d20d85fed10e1bb1972982a49c931b2920e79feaac5648bc5fa2250caf5eb98e983396620964b691919b2487395d288cb665d717777979387274186873142a040a5e9470c5bb030e1834c950b0e16413411f383cb911d52005a2133440e40ee918c12649218c12a0e95b7e7269184656f763dba77bd17f6683aea704fa0ed5ddf4386de3dfda3eea93cfa7ee224ffef59dfc277026d2f5eb973dfe73fa9e9e8c5cbdfbc3ff2f7bcf75fe123d8bb7092eb6158c704da1c27094da0ed77de07efe0241a13687b4f4afa09b4fd0bdc739be1f7ad9045bffb23bafaa4fbf457f868fe87933cc804da1c5f9c54c204ea7052d35137c341244e9a394e62bdc4234ca0ed935adf13887b17423cdf463de59bd10cdb88eb09939a74bc70921bdddf799ed045d8a3e9c8c3ddf7c8c0881d7cb13b4da06dfb0caa5cdc23a949026d54df7e1b75b847fd3612ddc9151ab13ef93e672a48f65ab66c190175d89f801bd5ffd95c4a536e4cc638856123276fb947313ce0e0d197028b1819a498ca20207d607e2f3924fec4ee77bf842e6f9804ffe9383a12baec5f14264e9612e903944c9308afafa8866133234b122899a659ee09054a018d00a314814f7ec0275d1a44a2a868dbc6314a868a4028dc0b8c97303ce455ee31cc540d70c2401581f192eb0b4945e5fa32aae7f2b7218136f27e6f9cd4a40327b991bfc781214c3c8119c2fced8f264e02e246132799c08de4aff0d20a1f18cd07e246f2392a698b46874b4254ee7cd97484939ac010fcfb8ffc1b2735d94fea09846de39f3ea728d43866c83885043c028c12187800f2b381c981851ff0898250acdc23982b609ec62f58c62f53be3ce5d7cd3d7e51b2e4b5f4dc4754a65eeba45d296d4a29ed9e5d69b79cf49372c7e49c03fff629e7d396dd32b7cc3ded5b1ad2ffe89cb427a5e00ad7e8400edc28edae3b66ae5d670d2c25c6f229eed92bf798dc3dc7fcd9c6657777777777b774c2a3df945399be94ae00d19f07e5c1e5ed5ffa9ca1fcb67572b6e3dc662a876aadb3f6dcde821bb802b9faa0ad74caea5e946008c8a7723bc22548ae4fbdaeb376dbecb66d9bddead3979fdb6ddb3ecf1e0eec529283c9d1af769625768f443fb95a25b9ab97489ea421d7bdf8a2944a19d2fcf261b5be2d84b9bceb12959e66b32c82d9b359deb009e32cd3e7d14549168e1967961b6a96297ee11ccc77d6cb3998df5664dad31bcc6f5610d75f7c79f3eb42cfafeea0fbb9fde6e26b39f4cad1f17c5b0802717df27cdbbdc16be69ed70baf7bf5dc59edfe057a67371a8adc831ce881abeec1da59ebd4521c9b97215daab2b322a0f414649645a024c56956633a9965ea348b33cb1d6e7dcec17cd0e93a930b9ef95ad1def9a8248249a0f9bd72cadfd36bb7cbdd7b57b7bbf77a9775bfdb3a6a8918c8222761b8284769d7d1aeebc2ced4eb3617e276df5236b1b4d6dacacaf1bdc5dcc8052ac36ce879a092dbbdd73d92f73db8fdb6d9ef40cb7db70a416f559da3f4abff61ffae06ce9e54f65eec9e7aef350b478729d73d7def914b55f6f02ad3708837e79c9c4b205c66f5674863360b049a44c5d58b76c56d7652c73205a00aa6832ab82ea59c4b8420912b5fd699003a9f86dc1c407f922bf95482a2922295dbc5cb014265bc96225cff1ea54cc9df065ebfec499ecf1931cbf3bf294e1de6df59a9f27c4e2afb2be7259c04c935a22bf71a1772b370d8bc0300b769781adc1d5e278b4ab9bf43ef270359bf2bc3afd5c886ef86610fceb9b5c7847f979a687d4ca5a418833b9f011ec7d91767b9afdc77398e7b6a69bde06ebfd454ed7f100b6aadb5d65aeb07552b67ec0abde0d5f00c82dbc6d1cafd0bd6db3637133c73cf6123ab495738c65d6aaabf5ad5caadaafd5ab9ca6df38707c3d3409b173ec852ca8ebd27839c5caf0f56bcc3f37c133ccfc746a6dc2265f61cf2e75bfac3c440c6384259e9cb2904f6e32365f78b23dc7309f0ea9fe6b87b1df3dca5a68aa9947d1201f363b32bffc9eb1fee76e267f173d7405d6f3083a46c7e8ce98a41797e90908ca2192ea09878353cefdcf93ddebd4d3dd75d6a92f33d9092c8256e5d4f80c7ba4d3d6be9675f84853113dc172c46ff2595f3bbf5979aa64bb982172372bb5bc3f36ac7e36ed3faac1a32dbffac8cb970c52fd7afa1099eeddb7723dbd390bedda5a6f9db5fcf51dd414bdfb15ff36fe1d9bbd4e41201f2873cdf3616042cdd36ce5bb6bc6511afabd62c65cf3116ae7f901cb2380cc544e04e80ebdf6ae66477281e9db7bfed37b299937b64c38600b947364ff947ca62295c31f6230bf22c3f2a43bd2095253662bfd2b047364e4680bc91c5f2a6e0f95d6a6aff6ed56e9965f6daa56c49e9366456b2ee64bcf61fe612a5eca016f703b7b8fe548a9e2bbe5ec39d544ad8cb6d95568074403a2f7ef793e14bcaa663f1cbb2d65a6b1d07ebd86af19469ac745d91e6986f7fb270d0b75894b5561c775a91530452c1cdaddeefe5c31269844449d3e44996628b3837ccc0020d30d815b268355476a626cda866cae9c6d929d57cb1639a2a3e8a04068b4d2d9e1659ab955cd55cc9550bb7bd728f6a8480d1d2bc4075430a56a298612452031237462d64ab06060d6c0a5adc90821caa36725ab8026631844e9a2ab67873fa547e851d10699aa8dc69a0b24f77e7bcd338a519d2d2db8b37e7194c375be994a31a36947280b33ef2fb732098024e13388c71820a22b5ce1b15eabca92255431146fddd01304a45700063c509ca943674684cd49a4061068a0c3c406d5a500519625763be4851f9c85eee11cd152ecac8fbc4f494a04f239a25f9858629bfa4cc5acbb21cf7f91cd1043963457e716ca6a0347853ba5bafee421e353d37cba32611652a72fd0a8b425894b12c16619ec451b8855b069b4f9926912c2a1292c99c26d0c34419848929cfa7715b944190fc7d963b8bfe729689929a1c474d208ff2b13ba03febcc679ee433a3c963cbd6caf759965bb61809048977749d2cff84ed47a671dba88d2a167bcc93c86772b23f15b72c5b4ebe21876e9c91ea1eba71464ccb3afb98c1d36d39b9b3d85af254b324074b9d19b08861349acf4d22252842ac89f2e2830ab240319a4d9edc2c81b3a52a89d17cd82452eac1c816467a8803a70d1546b3891f3268c9e20d0e2a3461a494430a5f842011851c2f3a18cd179a44181c71051152beac90c51aa309a64a881d84e41007093946d388931c105ecb3a35e5540a4669eef10c972cca2410a89e76c62ea594864cffcb22534a613748067526cb19a83b8bfcfc90a1f4a70c38459c334cbe806036334ee48ce1c02f677c38c3243671850a2a539c3863e60c0c5c9c0accc942c48920b6ecf0e5d2e1e836cd94214269862e638a1861a5c9941846336230a85814c952059322a844c1a40e38e6c7cc68060a2cdefe29e104470927374a388591827e53fc2818e6a353ea08129e7e48aeed394515993a63191f8af017351a6a3f34221a14b52c478cb54d480a121574e07282279e3ac045072955fc58d3c3134e744f461a4cad4d0d001f2d035a4b01a569c98a2751c6025a3731c50435c7814eed021a550c35315b6a3e6a31684fbed4d60480c60343ed8605d0c0d43ada0bd65acb516badb549e6d474a865510bd393009acf40eb363ee56f7c684fd41a0b3aad45cd862466d0b85f6129062159ac001243511935a30b678a6081c18d940b8a11d7d26ba4d0bc4b8fbe42cd4ccd4bad0791227a0833829912d56d96a65ad072c3111e82a8cae13e39e22ed8a8e2429228a46e58820509e81c5106cd922e41c4e0664d112a80aa751720da14354ba686009a2c008d4badad90c19146d4d48a6854d45c10608746c651d0522dd4064093b252eb2cbc507102275968b8220552d638611145992d3ebabcc1c289923a53b0e92da238124e55a7875a9176a2a72851bba276e5041fd09c0920352738352b6a4234166a1d270ca255188d6983ca467ed482a8722826876aad4f896c4d9e93326a297d5bab9b20b956cb24d75afbf5fa598588158b96424d06063423446a9ea59170c2a9b80a401880fa164578063e68a993840f383410c900902b3dcc8132c50526168830f282e64b5a8c16430e4053525353e3683e0880e658dccc973e62cc12b45a2f11a5444d01b40e68676a2e1a9b21b2a8c9a9c5a8a86d408341635283ba52bb34233aaa8adad398f0aa20b52ab534496a95e601adaf7029563f2cd1a6891b14cca9d2c6a7c9155a9288728592a7aa2c2e8638d2502815b1c589599337545af0c144448c152a43ea6059811b2bd95a21908034341ad0fa8d3739d268d2ec50dbe2a43644c3c2ab9873c6a3351617c2854a47e1296837338f424e5785f131bd825a990bb4ccb88089eeeeee6eefeeeeee6eef972127650405fdc84f02494ab76dce6dce39e79cdb86c54a6d8541bb2d6533beeeedd3974f8149e4bd2c61f55eb3386edb7cb6615b69d7e35155f69f3ae4d0c44e556be887a1c31567e4f9a247b9780b5e83177b9cd1809d9f8ffdcce027fe296b28f08b62415c31a8d3318942d8cff721ba039e9f7f631201c97e3e0a9328003f01b09235d454f22f3e062f1665d16d70ef57deea63514ed89eae7861fc7c0f4628faccabb32c7a54ac88cbbde85156c7f4eded46c3fb9243df5b1858ac98c796376c3f984f48830225a0902465331e174e3e4a99bf2bf4a9aec5020a6113480800e10813c85f83d0814c20ff9fd099dc090ec30f31b8c08218e8a52a88eaa7bdcc1b720372c8bad0c4126d72e77ecf5a77c7306877f5313ef6a247813fdfa71c8e053fedcbf94ec526cfbf61f1078aecc786b8625090908c22af92988d94cd50f892a46ca937f05f856e8394f9c7f139b1d08170de524a29250f51286f140529738f31b9d24dc8525e251fe9ba5226c9021ee0e2719368a9698b3a923726d10d96d0e73d8d16bdadef3923adb72dcc79486384b00453c993120a0b4819517fcffaf64ae80e6e6e59910574c8a12f06729bb548dbb7bc64eec51bb925bfd68e0b9e1ece0766dff517849c0f16b9cc4919c78385662c733f99dbfe7385226585620b7f58879471ab304608239c443246c4d654390e96d6033ed276999486eceeeea6ddddcdd16d16f1ec6f76d65ab1e4aeb4a9bc2dac75fb9893dbbdd871f2f7f9e37e0bc5fa9a9a42b8cdc6a25c91f319adb05893bb9ac3ad5e7150985244c82cd7e7f224eade06d0099b0c229b28ca48d5f3b8f945d9ca20da796bedc3fe47d63dbd6f77c296401cf7ac2f84853f212781b81f217bf4bf9abdefb04ccab80eff8ac35bdd3057a714df775dfdee0492ddb6fa9810dd0bc9289a715fbe2490f7d2fbaf4a4ac5f367ca3dae81ca0191f3a8f4ac9765352a19b211040000031500002010080544429148349c2b82b47d14800a87983e5a4895074371388ce21808820084611804411004011800421000318e889e07087096b0dd99a91011fb19661021d233b82963716cc38af17c28008e81cec1c8ff4c45eebab3585d7742a609951a49893e877738406461864488be2172356b181122d8cc13c2c9c1c5919d83cb41f18d781aa5b0cc8610c5992f880b07fbe71871cd6c462cc721d6d20cca44447d26583ec23196981967210787205cb3d114f0f3672e4144ac662ac5e638588d38fb2affba11967f4695908e436cc74cb2b8d81854137234e6581e193c7326df690ed1314c0ad1213cc5a8c8d65a73cbeffd617db8774576525b4634cc705b42cbcd1ca900db3a435d641b44bc01da7983301327d173f0d5ba669190971b298ea76da46543eca21979cbc8eb2caf249383c50de63435d23929e58823cd1b8bb49a8113a03b1277976602494433ed7056481cb171a61d9444729c30c5669f261c37beb891ac365271a0aae4a6a13d5c18197994264067ee3456c381b11c6e505c8f2bf3442b6323a10648e3ab1572869cc44ae0626de5f1f8c126c3cb08d14c5844be8d40409f0daf7cdf38b3258de70084f2acc82448edcc9028f44620e3337994c3e69e5d49f66832240ac76ec373106b5e5074142180cfd84900e99ec9aa006b3f9345d01ba3bf212237435de66d246c83e51c503b66060f22a263a62af71ce1822c77129343faa8015ff72ad083731c53217d2e7c829711475a0ef237443840bdd1bf0d3707b3728c9633832c966c406343cd1c02693d2bac080278f6a97438fc6d432cf60cf684d01c6377674a45e91c825cce2456840c32c3070924bbcc880ed55389cd520d92f07585248fb4484cc9896f24b03ef322ffda35f77fa21d23a4439d15456f30f95e70474f3bd35886aba83e949592f6c39969a1712d49c153beb6b34e43857f63eea3dfb36035373af9eee4e672a1381b40521841f92cc5c4269b68a5e1e1f50058592a1cf364c1175780f4e222267589758b1d1172f1ba43c19f17b03398bccee0486b0863b30f649c719244c4231d4012b4b651d7c960d8248d4d0cad917802e34e298440b0b3dcb74347d457d39c11b51ff1ae65d9b2178b3a424ce114e91bb9db089b3b336a09e47c064f3eb82122ea0cbf3c33c788f60c5332e5461d8efc1bd2df68e2b8d850d828fbc69843d4467c98e9a78d55ebbff0a73b4f3c11b1c0334f92dc365c69b4259e839636c4e266aeaa8cc867125f02113c330711c93d5315d5dd10ab339328b1b6018da3b90d4b0e048e96e1185b6ce641c2e518570ef0b7669a2522a9b3b611210e662e297f3d36833011f16fe62cbb1ce1c2318235338c22646a6643c8c0119679c6424424e40c9e8910ceccd54b88e86731e5d139c4ea66ae8c88d066868a681b1ee7106df4cc7988c8e6cca6e4b5e10b8eb170674c29a1cdccc48a057104123d737d4404cc36ad324f9c916bd1b3371147daf4e46823e969dbe4dda532279044b493c3512151238d69912a34793eea05a2a5a6e43b6cd7b408036a21f3e03ba3e697662844846166ba8878436ccdcc17e2651b3f8eaf6f64710c27c790e54c79513a87d89719c11391a059c792d3862b8da6c4e7a0c58658fc4cd5a48c1b440e328e626e407183bf8d2e1cac37707354b281c301fd46f337e8021911370515290373e4d46e5818e42cdab120b11ae0eb1d6eba077cc5685c8366ef336e795b036438e518fb2569fd13d88123d058b1114d10ba40a4c3f26487667293a051d5f193d65f2b8b0ce393b3ee82a4cc68c239f76abfe5a03b786406995dca0cf2a946f38c1acd7c206530b13b53097d479e8c88f3a84c4bdb30657dfbe691b015fb84a150f26aded060aa0e193d923e15c1ebb8b0e7629ae43821cf45b951172e53cc30074cdd8a9e85fe47ac2cbda7e954acd8262a2abee0b20c94cdd9f173442a322d203d1fa0cdc79c3dc83207bd0044219a8d194faf7c58098bd09ad568754b3c505cf3d4c30314ee074eed91fd4bb4c2d192bfdc96dcd6d58bebed043c556bd0ad5e25a096e9a667fdb0f2f2b8fd2c5a80a3cfa1d7266fadfef3c22b70ee1997ffb81730f061d0c19a6c3e943605045f79cdbb2e58303c8a6ae18fb8f4d47d798697c83362a0ea40f0dba7211e1de1cc113afb110969ade12f8b4ef9273858ba011a70594dda0c18129419326c2e7f610831fdbb26aef25f88df87ff11bafc145d705e9a9e46b92f207759fb7f3dc6d98002a0d96c081fd7c748d24a4be0ed7eaeb72a0a4fecd03b82c2bc9cba05fe023347a809916f09e6f5b34255d24423cbaec85f9e9aef30a3462e2b56d133aa3bc75f51aaa6f4a7d7a0172801f663fc25690470ea9efd1ee40d328c4cf616908ca1d37cec7f84d6b699ac7bf701d6091b94351374e1cef6ffb97231f48461f6c0cf901a41ee7765e92161700d84246bc2b105dbc44439b8a99787e1e63ee66339dd0bc47c9ba2d488fbdd5aa7d6460c70cbe12228eac35043c7d5aaacc30f7b0ff1548b75ea90c9df97ef46d92d0d9941c5930493ee94e4e21554d3b21e3acd4e4b57a86b5d29835a79b3fbed14d885859a815d4eeca86bf2f451cda44f21052710ab643a2e4b7590d53e50721d3e7004a0da3589ade8d8c44070da03c4cc3a4141dbe464a7d1b2b1e29e47e4e50cdaafea7e993a259bd35e7946a3f4a2b650879894baa08b61389a5d6a4a3d65c1c45ead7eb52ba5935c522875607292c50a81e1efe042541695810f550d2e578fc1bf5d825a3db4e850dd01d3725b4a6786cd257e84c21cbcea38381d29c8f1474521d579ea21aea764628abc365896860d9a4b8776c0809be1e133777d22ded197d94bd3328c2a21f345179ae1f81b3b0ff6414667faa0f4958b16bbee026b2ba1749b0d2d6a56c8dac85e7661a545ad1a09a3c9a327c4a23d21edc5b4a6bca3e0a92d6407562a2d0ff464e9bd5ce94311702513bdc6ad6d6aefa80c639a206596bf0c2ae25407ca6ab3f1abcc12f98597b7337d79e4cf9a42bd23cd4b995f0122d7218c8cb00f611ad3280d3b32e4ae01182bf285162f48d8b5f6d5e63e4786a334bc19ef46f539491568d014b733570b46cec57eb8c642c5cff8bcaf64bfa30cefcd2f4f496f82c0750d3ec0c9d13a87a77409722e79e0f789f3c066f46961eee7b837b3e51cb44f1847330b43a92f4926eb431bd32e077989b198aa705cb754b5342cfd798fa9ae52332ad8b858cfc25bc7aa44d66669fb80287d7a142cac268312cd46a731599a02788680afbbd74faab939c7ccf4713372ef3f274a79784a56c448b133f9ed92dc4f82c197f1d32ad2feccb94b6e34d407a8af18672452e8b5eab6442205f0dbeed9210a2501137b71550f635868753fcf8331039f561f7d2cf2bcaba9af1342146a4f377be8ebdf67aecc1e6097ad72cf6ad680ffc7185663559e6dde72eb885669a4cb694c96054efe35dc254b653f9187fa25dd729c2c25c7d1851a47b9f39e5fcd335f92be8c913b1aa6378a0b8953534961765834ddad8248dc5ea641b313bf566f3b29fd2998cf1c87c48fed56c43dab953d0978223e19bf505c5d046fb718709bc082f9e15aace00595945356931c187b9675ba296a50f981959a3cb9c11283647e2e1981e0055312ef1c0fac7ae0ac187e883950fb708f38a022e46fe3867d29fc75ce585f8ed16fcf49af3a0753477455474f0061b23269babab615905836ce1125003249e85ac04bd604105b0d7bb84f10080c14e4023cd296fa96d87ec4c224ed8b483916c4edc3d58c5aff682da2676f164dcc70adac854544dadeacc1f60ca0ec64446b565f4ac758533dc59d8db3c0c0851e72464ec6be59d9c758c440ead98d7e087cb34eb37d70d626f746ab9008e5f4e39a4652417f27b769960947c23c6ef9965980b36f7b9ad2c02bf53e96f7f02406706dd3f6576960140cf6e65183df3e44bc7ece2a933aece8390cc59e8072e16e2ce75f0bbab640d7ea59f77e70fb2604cfd8109e9835b149db65e50c0079eae1e2721fa5290eb866a9fea4b7e6cb87c2c0609888e5c10a4f03f49b1a8420e481f9fdf8a789d65e9b4dd3beea03f17371ba8a39905effff78cd9cca332084668c284fa8e847bcf385d6f1c9c0704bcc3e1c6c6ecc61e1cb1d42cfad49c2aba0245ab17c5b7b068557c169e632a54810d24c85fd0ff663070c0f64808357ed3cfdaaa12ea90ee85dc9d940cdc82d07e10320a560a7ae4a9d38ce220b7726c176d5ad42ebe0b3a408b9aad2d65593d44ad4554708d90ff141113551578960269527a40e5e182a1d88df58a69e3254b54aa7f0548ef4c4fdeec3ee88e56fb9490084f83f68ff0da1ae44f2394e917bfef2014c4f4577f4a4a28ae2cdcc9eb6352e1af656eee3353ac9787aeac67ec59cc5f612c48fb148e254256644f581729cfb718c2dab8915b54a1d483f7fd74638d77b340d7117a5ebbd17b88eea113f49cc3d61255a4433d091514a027586ee10ed161a207bc01adfdd89183c4922f16e576dacb410a6615ffc67ee1072ba28e4841ae41404d3a841f5232b32b6eacb13acde303507acc786baa1f55b41445c8c1fc7ba10068815e1d933687544cf47a5d5fc7edfeb0a6d48f20dde6cda453d1a9b53ac593e01962fb27cca61eb1925520018a5668497db2e8423441711069045eb3dc9b9aa7a9525afec0248138a6aca329d848745f534cdd716dd6c2a137a8f2390fcda328f1235597ed31ffd7dbec0278b9cfb7f9d5a2fb24ea061dbe08082894de1c36188889cb85078cb5df5bd1a7c5c89c65caaa72315321f6a80bcef86522ca9f4488e0e5d0991c5bb5b3320dfa2f8c9f81f5a7fa13814ed455ff4153cea38a78a31479de365be88326a263aa67fe3bc0156fa19552c00da1ea1216e976ac33318fc7ad05b45c5ba4aab22d2de3112f0b9eb45056e279e0da1848b247daae6a0887bf15a553aa2c9461117589d14525570e08224d2561af9a1c0561cd8d8cd4614fabad61625f7e5eba89631b3ab9ac2758dfb89312d8e867852388dd878bd366a8eab32b0f2ce4be7a400285ffee0c69739db235dd8b8888d5919690e1774d1a79fae993d959d280a4e2553b490a83e8e86b1a26612c87006112c4fa67fda2bd183eb5a962acae807ae66059cf5d52c8eb5c302880a29b719a5ada1da3689a18b23794b6c438425cb894a0fa2b417157915d576c1c08418c41b82e622eaa4823e2d95bde890ed537b6d0d8f44f2a313cb89b30653a14c0b676f89ae343dbd67a4446fc9e0683379f40ccbccc0926f4b6c78d854aa75a5698d4ae0f31a8fd48d9a3eb82496995c6274dfedbb0e8e899ae04a823106cb315b329401f544a089c26ca2248c2046ba01c47a350cd1e1f5f801a73ff6632f91e7be66d3375e35d971c31d83191cb8539278e1cbfc4978395764c9696dfd0f7468b6bf9df06adbbdca7795472bd119d2be1a667a47fb91d7a08896e33d420139c5063cba28f9c5f57e37eab5541e2fb9a952a284169a3e49ce54c7e06215c20637a7d5b94ea8a95106995096ea83f4c8180445b3fe9e426d8920a23bbb7443abcf0518c57c746189965941b8741492e009a9bbba5e85f75a9c1da497bedd0779cea1f94f59661245872116b0c3240c7f0c28dce80db161330b14038afec436ac2b81545f20d55e9fa1b404269372abd4180c7ca1685adfbf83bcb20295972f1d1352212c393e0ea120d223700fd86873010b647adb2e904067f87e72770531560a8ed977a8e5d06906eccbac9300b232ad7a057802a8cac703dd777a248dfb2b8ed9bca2cc5ea3e82ae4d0dc0d87b4eed6cd545a602563a072a348e5a66b47881cecba5708aceb46413156f2262a7eabd4a4a68f99d5e465160430296486f755ee5971a65fb362d48300b9d0a48333591b58259e6e38d871597f272ba7d63b858292687703914698cbc486ae1e38330185d616722125ef51a7a81eeb27045225b009d9b2eb511c0d94124ef18701185c91c399c449123655cf6ee3b6f1dcb5e2aa3c203846cf7cee1e30baa23dcfc56134ea50e89e567cf2c4e07f4bcfb674940757e26956bfb7a811abf803522b225054c44aaeeec98b5f5de82c377a975d480232f15c0991c6ffd30c3b77f3faa6935fde2488adb106c743f2a133f5c45746519c7502373153c1e18bb428a638d6946e7b544f983320565b2710f57f7b349d8aa7b10c29339df2771e07a81857252ed5198e1e56822d84df5dc6212d02e76a87f0b9b6a5f2f2705c32905e4c8dbb9c3562b1483f55eb3352d1a9af3f1b9b9ebbeb205b809ba8e1712901325d486ab1088a797e595d063a16b598e900cf7220c5aebc48daa667c30bb654900ae8626afd641951b07c6dd4f6411042d39086eae014dcae8952c1cf03c7b5cbd8630da58c2fc0dcc137ef28d8bd943a794c243b36effbd9bae696c1929b6d838da2650738a6897052ff0734e98c2e2211c424eb44ae82354b306aa75e783330c004933e55e79c66f9ff9b4d8eb6adb8bf957f89c8e664890dbae31e6ef7886508ebf3b33fa1c78298db9a5cc59d18547a5c005cba4ebf5b9a31929260988341da39b3f6035d6346e8cafeeb30ebb55a836927f54057095c32739bf1e6fa332eb257977bdd95f42e810b680a2c1ae445ecd5d24591c3086191c207d7c29bb9d57e6fe7f9a5797634c1eb338e9010fd2fceba5c52650316a1d0a995aea3ce871172e1f59557dccba85aed00a70842919b8d9406353625c30d41e8875eab2f1053c9edd107ecb901bc8f849e5439e0c6c0b7fa9e87a5425caa55618dd4f01152a8993cf6da0f669f53db979eca801242d2f874f30454ca3f41c58cfc1eb3ea265df52a3603add21629b6f420567c14bb792a969a4efff0d37d12b2290628d9bf0ef97f5c70bd55c13b2ad472db14f7ae3e893ebe9998d82285d8246fa59958529351bc58ac4f9b55dd95af97ac21b015feef5ef1e3a22c3386bb7e2ea4132d56b2693134572284d3635be66339657fb127d96c90158c22af1dce2e696a02b3a4f812d9ba574e656eeca85ae630e6f15e69a7cbe9e010ab7864965d15534d9a53bdc76cfd38b2e8c816f668806cd773faa13dcd7ea3731cee2e03b484012cc7e941cda2a538ab0c585a926d2f0bab71cf25530e70a631d7860991953888286fb9cb597e587e70d793954c7c13010ab3c9726cf3e2b087e9c619b956d334130c2aef71bd13ee9a806bff0364a8071ab4832455bec3a1027705a15aa4a919b406fc9da0ebfc67a89b6f063f5b282c5e235c8b7403d3a3f3b047b6ac0ace3c9cc8cec42af3e61ef06703de861bff39c56c8d987204977da346fe065bbe0304c1ae6033bbd41a651183fec6ed55f56aa6938694dce86b28f5bb86ecb769e15a5c1fcf9c571d828d8a5b4937fc0a33da9cfb045cbf3306f7ea5d951c1805e152f5ec358bd69b0bf082ae98988781e6d9b1d3596751a56a5440919a7906b1b81e72024660cabb97ccfe670d95b40a28c5f7d9f388a41a8def465d651abc236a18c4cb4949ee703f7cdb15d87ae238bda52fbabcceefa36c006d136ae0af0a48e2fc806006cbc3eb795f342c8d7ab3cbca83735924c44e0b7018b9a05e91712b5662ab2f2b5ccd5635c35c58e6f0307f5536c1677283fa912f845ccf61782b4416ad584211f108a043cde0f8c7b60635261b594d1272cda6e46453f36df86283e6f649806f31e365e193f8374d431721ddc3498fba8187c3b98f52e0444de4e6728a5f269a9b299c99c1ba8e83654268cee2e8ff130f5b066c83667c735d72ec4d15d87b42468a8dbd8ca7f2b90a1f33e917a806ac4a10037ac7f68c52cd05651f791c49941ce3b4b3bfbc9588e3f1e9430968a51614ba8208084b5388ed8e43d5542a923a33736b5bd56ab66ae2dd74975f038a7f06a2103cfe4951d10861668a2e504fa8458c0ec5ee3365188f4369bd7e2f3a7eed3609f8fc1d18bd477228fcf0bf49579444b73522919e55c3935e9bd193344d782d237da1a82c11f708f6160dc9a65c28325899814997f8106e0019c28e3c4009492a8f7c296a2fb14bf3acce3f135f84c29a0d8002fe78543dfc4813932ee0d70bbd271c8f853d98c63d31b34a4da1d08420264d536ec2508ba4bb5723903d49d87ae0f5e75c160a76a66c1d5a6a6a6bda4ca50cf3eefef9d21816e5451da157c323847b4e2cdf2a454e3c65e30301bb115efea5f1e1eb997b230b7d7822b83f19fd03c601373759dfe42e76118d3204f1e2b62f0eab25baa5b4e04049c574cd4a1ac217e24d98ab86c61b0e2725fe06af2f1e6c68482eb99492e2d57c3a7f47c0151480db14aa56ceffcff693b9b585c0ad4251bed21644d4ad98dd335b250d71378298c842453bc92a11c3cbc579e71ab42ff5caae14614e768fb59434b08e1a748dd9695f6850583e0e695c0b720d2c90c4a26b3c60d17e9868f4e28e1e9dda5de672982854331a1cd2e7cd354239381ac75a06bf56bfc0bb0513f3f1ff7f24cb8bd5cb65f9a1d1c3a2eb8f8a3900d02d50d56ea19cb07dede18c7db21b5ee6eb39592edee7f98441b008268dd75d7d1a657e848690f0984d964109e2d0ab246692fe69ad119d566cf0e911f85d4da6b8e1090e07e3408535619b651b6391b41cc262b1fc74446d9c1ddf08379300f7e338c7a6a906084182aa3a1d5047061fc7b93a20457f9907d374c67338d810c1269d13bdabf82e632897c76a986d4e2f5eb72e31309830e10157f332b9e9373c772e6ea533606735c41932d90caaa044fa9e667812ba67caeef801465f1061b41e6873e460702c1f293b0f11e615be6cb56f309c040247ad9720967efe39fe59a3c098c9866f926e5ee28b7dd2d3779b9ce553d859dbeb96611157252ee2a8e5e38af5ead72c913605fbe0e205102c9d1c4b1c34f319c571eb57c91bc5340200ab412ab16144fe7a0c618e940895732fdf587841d20e906a585d96041d75654e809ca63152308eab23f892987b1680b835d6eb67811aba3f23f9dabf7e75572a014282ac7124372e86a07e5355447e9174d7d18da5f62417f66ed9f388cc69d6db6c2c7f941c45e84b8f1f02443b92f6731a1b7284b66a5994fb33087ea167d247ac4e71690531135f6b5632c409349a7cc5f26d8922c895e11a4d431af643acf44b73c13d545ebb585425e48888c1a824abc3d54a023eaee87066c9b911ea873131c29376118a22e11279fa29d39f8c7b292f22b877fdcc41761ee2c3f5f9fbd9dc1f14b8554c9229bfd08532cabf267e3e0d3185c2883ba7bdd22e6c722ef24850f4ee89eac3be9fd6daac7e7f7e39e96aca0a45216af7548af071fed672f1e650444e502aeb18d800fdd6afcd342eeb0c264f752a1c31e793e70991abb851571ce2c7c5a5808897e11f8ff99aa31e5c5c31e62c4f0e442a5e9c7d05209a3aaa562bc7c7ce71e31f06e78a111d5a583b2bd5411980831bbee6cf55a806bb91ef7fb3d7c74358f4f8a39670a1076ab7a92b9644861fa041f66fe1ce261650a611f47711abeba4faab15dfc640c4d1347c81bbf81ba0726fd7f31eb5ea84c8b0e0f06c915ea1a1692e7a6d0d4df8223016c02c71791d8dc452c4d40782059cf7e2b545de311949193079e22347aa1efd3f060f40cbf0ee89e842e831be539d7686a01a8190c9ae32c7421e8102335b465702b97c5b7a950cadb2ac1b8f32fba2161990f66edefa2d8a3e9884a1ec0d8eda1e40739c6666202a681ff45b8926820ffe86a41009645d07530681c88307a2d39a557fe46c77ccde6690b0398c36c851ebc559e84d53d5e33ce93153c2b433e2869c97465a4296afa1b1763c8a3c190461c69fea0ef2b3d8ac2885adb330501058d86c30b8257a7c5f85d8ac25628eca1bf1e0505f2d24e4b4e24ff08757e98764298ded2b536bcf0542622c039bca5d20551b7f63ad7f6307887603d6b8d670c669195842809674be192de2c283b8dee93dea003e7bf2afa499d8655a7c6c472549d7e0a34ab819f39c4afd905dd2679f38667f9dae903bbdffcfeca7b8b9648d50e3fe72f572c13eff4d554e3889d8f415bd055251e1a94525880469287a5b45ddd4d4bed87d3888ffcce940320d17e460c2eae81d1769edd1768825577f7c78e1ce725749d3f9058570d064e7bb6db3853c8b4ce55e9b65aac2a5958086eb9478b89c8dc219f1937cf844de5899b831eb178df72b849bebcfae8d3eea446e200ddb37687ac9afa34483a4a893ee301b59c10a534a56d2563249332a01f95a1a7d34f7c03043c280c74908f365d2178747d49f733b908487909f312f8adf759ca71ef0dd4384fea12dd5860d169735c66d54875333bf466af3684360cc1178184b31f6320195a8610c77296f674c03f26d3365317204499fc5158b81fe24b770368648be9fc5bad27d68f888f68d30b1d9d9ee124ea506ca2de01e328c05f6bf61e5510bf9c50a9d37ad84111830b94e6e0816b7c8604475eaed37c0dc4bae8d6642d6f421b3fdb9fc88732b1fbe44e72523582ea86804b07ec0261fc0439ef1c9e68ca93db3efd3fa9586be0061a8094c3f46c0c2089a00726ab976eeaf1224e230e88b27d1ed50bd1d013394cde03315c6326a36a8a451f2663f3c31a15859cf2793e05f084c1290d97a5e9e0bfbcbe01ebcdd5a31dd4a049d052a285e497c751cab2c0958b89a51a36a050ec76f0eb66a0df18d4a400ed6cc3114b8eada7a178595f0a77e105d8fb3d69da482dc402869ed6dffddf98f0b3af8effe557377409cccacafee28e96c2ca9ce7507d4e2926d96c015d061a25770f049b0145bc1bc02dd6e60131df550d7d8862461526b18e0567707fcc30fe509ef7a2e3329cb48abcc067d4c4360fd325f7ee0f6a8aa72d60d233b70bb315ec9c99b6c1009838d2b7063afee9ebcd6d50ab71388d6637869575de32ac5e60463b44fc408ae279dd6d49be0e7513ba05e5a7f424767be69e5745fe85d73af877733cabd9d502b550d5c4c65223ee397d00fc7ff18c68f418256f193bb655de6661d064079591522db77d0d178d4bd157305e9776440240a5e6c13cc884b96fb97f80531a5dd442f9459da27f65d746f63cf8812dbbdc18231b5622b4ca54a8fd4237808374d7f9aa8623686fd2eb99639dd65f3fab52e2afe10b664c4a7b079b0c92197396d8f2d1f9f5818d8b2db75a2cb4599b9aa5659b0301266b1fd5ad8bc01212803fcebf687f09a56160f40016936c25865646786fc619a95b35cca58531da0044ebd1d2ea0446d1aaa7f624e7086546d6f8d84487bda1fca1785883dc86d7f359dab00a6accd7cb009b240409dd36b120d299676f9b37d91101bc7de1fd0539c059dff5ff0dabe7e880052dea9101e65185bdd616ade81572831531b901aa2363252d9c9f409ff952b2ca23a82c29bf7fac4a3f81681b86c8211f9319aa32e67fdf5cad0e24b1d6908c1ae7aa8d77fcea45c9e211ea0dd6c315aaf5b93adff20b65132df3ad500f367a34fb359062421d9619ea4a254cbcb72f1ccc79f47f6aea2295d43e4353b47b5eb7527205aa93df6696c28c63d8edea6413ba60a4b4952e794b0654a64697c2ebd43609d80cee287b7539e33290c1dca03665c6d3bde36f1dbe3106c154a92cd7726215d1611f3ac6cdafafae7fe0a555800bdce402404efe89a718211ae7a3f3c08386021e6e2b773d90ee48cdb98b338c38d60c517a8b7777da0a2067a75347d82c01782728ab6364c9f02f5f023694794ba0e04189f28bf03a958efe29d30b07bcab030930fbb7d2d69c9ee7a81eab860c086786a8931f308cbd49e84ef6e265c1447b62a62a805aeb3bc354492adac09b898bc87c7dbc0c8f550a4c33b5e24e90a50ef2b0e563a083bfc1ff6e784f67e408b232223958e3dd05cd1a5f2c60f5a442618a504043cc6484b9889f0307ddb6b36ec30a119303ec76a1c1d66deb3e1e7bad923b27c15c8310eb892bb9cf277466bdf81a4b872c1de33d2960698b2a487e064c152b1db5041e8109b02026a336471cdfb7fee15908041c4b289a233f8dc178276d60122ee094abb27169e8f85aaa7c2d1bcb4d12587340733bc181eaaca79cf703d30c212e1c817d2e67cd619c4df763c10c1b04b5e4fbce37671da8f606344fba87ab551e35d1a1692d799a51b61aa8035a9d1c99e7961dcaa0e10cc98531dc469df4a000b84ad912496b71118a7e7dcae00a01bc4c4c3620201cbd80cec4152a81f0bfd864cb8b844dc9c07c6d3d56769693052ed39e8cf165c389e6246ac8ed8cecdd0a34dc600cae71018d010e4048ea05ca7d6ea420a40d0368fc416e27c1a0061bda029aa44e14e6b02039d3e39c0632823caa3bfa116c4183741b2f94754a8d505c6986d7ed28aef7301bed05e751aa80e28d41c31a3a5e89e2be3281c5190775da42133fac3c726fad16b7058ae3fb500e36a43d39632f960cc9bf9856d5d06f9efe23fdb640676b1d1ed07df4315910e10a7ce7ae9ceb12fda92c9c61aa51d118d811f78a22ab062d303ebd1a6b75b13db822916270bcf507394ed0d49111f233603cf9086ed434a3b4122079819d99a1934fa55ccc03cc021daba3fd13a3c9035d9ad064fcf33e45a6d8d68a9f762491bcf9bf9a2caa470269a3821bec432f6d9b23b9c354fa9a6ee46c8a180fdbe6aa5f1c68120681dfe5125eba1e7d356a516b6ed0e354831e7bd98e87656ce4cffc31e603e7292215d1ffec6c7ca5d0a1d98cc03ac9aef4fb8c8647e95faed890259571e938cd3ecfb6fb13b9ae2254e852b3967d07bfeb0dcc7579e5dd62dd05ac000a821401db46959cea0b58f7b1dcaa9a24792a23212141c8b11d4c7932c8be7a395d25a435029d8851a830327b19c4eb62f9d6a1747aba2847b7a6a341c153312d1800d8cdabdb4d0f18ffd1cbd5eb562cfbb28eb479c9b9fd7324b40843dc6b700c671ccc24a597f88939973c750ce32af8961c87aa231bac4a3232ddb7f680fbb7397bf850de52edb66cc652e91636ea8dc498cb2b4741d771beccacb6fd04a77c4278bb8a0919737a72e84cc4409a5337e04c18029d7c2858743f75bd6370b69e3612696c825690b079609ea40e0352e8d60d7c72892fa11341053051164f8395f87cd593e2ffbc753cb4bc7b62918d80a3256486fc58619b4cc7425be6b6cf26c66cdac0afe0c02262d53ef5c133c3595bfb0ea5dd9c5230b13963da25b14dd5d0a8c5048e586117ae9066e370065954cb1397612243279e6752c121da3262a7d869c386f9d34d3b7784654b87c3e760122ff308606376c72d26eaac760029ba561c2658b84a86a4b32df3d4baae870b01930650f65de60652badd08153feb1950c5469e840678e058992bf2a8811769d1304a84a5140a719cc4a61f344492f9499de48888f698b678521e9cd9b43f2e0ef6f416a85cde42bbed5339b1a9aa273efb0045a00c6d053672f312a508a23388f337fdef20b31983038e27d0662099ad177bc2f144620911b74505215008ac66646175912a3bf0ae4a788eacc0c2ea80a85b18117ccd8e4bbde51f5a34170a0989ecb352ff4cba3b54ab825823e4b794f4672b6eabed28ce3edb533ccccda382d03ae26c1d6b2591a374fed14b84334b709820a1ef9ba6ddf65d4fc180f8257f56d486343eb5ccb640e2a1836cdcc75d83ff7fcf6ad5ff8c6706777d132ffeea82154b603808372a3645e367f583982744a225cd159a48f1e34b9260ea66a43efff0ac2cf0eca6c3a0c87890205485455268d095083f228e8d3a9eb46a51abc8910da507f92597aad9adcf7bc411cb2d99c1225357f646b34cbe0291a139d22c8e6d3f6ad88233a53dc4b551019f714dd14ad8921e5194b662679e5cc24ab5c83b43b7843267035193236d2f7cefd081be328cd26fa28df5644c94cc9ff7dc1438f3d5317e6708dd8e6b1cfc0a0d2231728a1b809c74cf2c0cd1b92b076a25ebb86dbda1058cf25a9ddb2a7baf7d7c1ac1f2e47c143a7460d36f9002064c6165c20e2f2854d0631a9c9bc2e216855837adc7a20a2e2767947711dccb28f21e593625cf7e6af63a4a1606235fe62fce5a7c53a531e1de0910e62c9d9c3a92921662934010b54496d6831bd0c08322238a51fbb3313d5f4690152d9c5567feed56dfa27909559262c6a2948fb72a75240e1008a5e9a8763d65e83aa46e259fa4028b196122807e7591007e47b692c9f875c2903a20dc55e9a8a3f311f618239afb1c58fc3afb48b9e2ca1bd22036aaf9f284604bc5040629f50698f69aee27aa9f832bb032628d84fdfec5837b19d624def97008f12d43074f8cdf3cad2a142f9a5aaab36b08ba64cc1a312cad4ac9f343415721522232e23288b81f2c812991d68f1b2d284103281044e2002139880d64f422788900926ac04093941040c0982422df87d860f04635daa1091cd15c1211e1a1a5b45dae5500763a1fe853cdf15b8c2064e1d79fcfb589687a842016baea7aafbb2e19a46918bd2e5603e120a2c5b7f46ef07a214166f9895d457fbe8d643c8cddda06f9ea4613ef482b7b0bd991114f7033150b2398f55ab9e3466099272c4c36aa55d2b2513d7bb3792942f12cfa68b0aa96364f676655cafa54b3bf8b215181a01657a440defb6e824e420cac0c23c98baecc5cfcde4560004cd0989cde3c0536c5e57b84a91f1827239f3e9fa3ce0b8229ff6efed457c36869e9b68415ae6e56c304b6c2d3f70765e1663aaf4757ca649ad54ca46c8b8ce81a60f757c24d5f1ec76cc13ef6c3b1036e0bf8bdb2ed3d4f55097685070991e4f6744fd2234353433fc6b1b3bcf4063391416470e81cb8a8e1d98cce309c805b9960c8e61e0a1883d41d2ca4cd1baec0e53d02b486f47d264aa66f5280de4e78ba132a0574bd1abb88f89f6222bc4063e0a9a6f4b77631f7406bf1ba44e22a6786f948eabb7bf855a8c7acfeb2d6eea729c9d792edbea96a5c451ffa52665538d6c923dbd3f48e041f964d2a5e48a6470bb26e463db66ecbc177dc70d639dfc225771fe7f1f56c0e47f289fa89d3f69c86eff669f6ddf8eecfb8a9fbd8711c59120856944d78c09dbfc9dfc12ff302317885c600d55b0482c5de75f3a544f39dfce22dc9ee702e69af2691c855698841b7d5160ca45339905ae43239a1a11d13c47896885e249dfd82cd0fcb3c9ccfffbe0f08dc4b82f21a12fbbe2e0e9750d6670e4a5e6ae8071e25af0d12680e662270a00aed20d1ffe08405ac6298d62cdaa85571186e964ad591d3bd05cf43bfd4beecfa13d0aa3f274bfbced28fa7a86fe03f28df14721d3c7ba6c72a5216317310f5e7e8790eacb39e0aa62e60df5aaaf4a3f10842d0f4e4d11d228fa2cdd0f55dcc69741607840680ea3b5a551dd6b62b872e9aa31462290dee01ca4b138a0b155bf5d31d6acf52358da40c8b04671e693579d3c862967e46da84398215bbd7e5b2582003cf6ce2683f03c2b77104346816fc44c9c49829179f207051d619b1770456e4b525b25dc867c9e8219486a2c40a58a8602f77f3a1c4a0f8efbd3fb80660fc29ca9e80ee2fed8020d81115c9d034196320654f4b81523c0a2151018638203831dac49c1351173a36c29f39a84ad5a5052309861d58fb406c0d43e5d4c33aadd86aada4bec1bd083a4df754cc259e25ae957da2c9762efe30c8e564c33da3e99b4e9aa9b2417c3fdd9118d888c7620c534a632e5b54fa3ff10e93e8d84cc16fec72124df714e0018a928e9f5c8f7ec3f9f8a04a1a86033d5bc47bdfbb42abc65a9db220598b96d31ba79b52c6307d82b5f07e8c6fb64db1dd3bdf60bd06a5e9f406480b2ccb238ca9eb90c66beaf119eba242becaf45881af0eb5632c2d62b1628032c9dbce3bbd158e05d1d8ddfb205b55d144f631f6a709de24a7c38ab795d2bf7375c676e0cbf0fcb6795f9e9610c3baebc2a11d967fcbd53bbe2be68e453b7bed20be91e154e6743d7eb323d6d37d68a12e80728d490c4cef85ba9bd8ac813227da0c72e5c299350ae4009ead31409081459d0b31bc2c642c9b918c3b4af9245c69d305ef7f9084796ef0b48008efeecbb7639f729a322e8a2f6bbd6e42ce4be95be50ae149e6a5c306a9a7236d3578cff3fa6b1c0d55ebaf90699ce35f488ccc8d95c28baf28d1a28e57dbc3eba823acda217e117158ac15cc286b815ba3704eca21a24e7865d05a2744ecd474075426e335ceaff57f2501da27beed22b35b0b80a690a97fd142f582d735e553ff4187dc1f6a80991498ee572977f8a3b201e57070f39e2e020aea1531620cb37368861d28f1e12c4a3390d5bac8ec29487cca9f7873a05f39cf9c51a393076bab0baf2112ee3e90db4c93adf77517942867b6ec487e6a84f4500af3e0f1362c491850ea65bcd2682883212c766c734a31ac951702f8f70c0635baa33be439db3ad0e305c27f2d5aa8a232e480922fc1107cd32b567cfc2137ee34e480b4dd3239d4f129f07091ce27cf990be96e889e721974f10842319ef118612f73e67f8151c4326c31bc6fb780987a069e14dc13b248706e798a9145ed3170d7c58ca45ec26d70a7c281954339c2396574c2ef2bd21215e434c64e3735480e1da715f766cc0630cb6acd27d6ab9b3092510df30d95645cd266abc034849103dd65b6b59a53307c467df5a0bd896f27f4104a8f0165b74ed81be94bc1d4a78ea1c5238101a1fac7c3eb79fa902dbb33876711c7103c035251341e7953f63d921d594414d6114bf297c12a4495aa88aed8b143d1ce664a3aca4021afcf56d5b300c2d9d0ed5e4301a0e93387650f815380897a21c5f388c072d7c9e3438581485e5b004edec2f6538b22bd085f932d7c1f1a920387ef885c559e8cce65b950217c5bb48f94270bc119b64021b6d94d56d6defbdf7965b4a29a50c51076606010709b8f73c3bcf3aff14bd49ff76c36972f0265f9cc33de8f0832081b3e39c1ccc1973f271d4a0ba7ad0dde460cfe78932dd72399fedb7db2d97aae769d6f1a3e7e31adfaa4baf885b7136ea572d1f77ef3daddcbc7ab066cedb635d3f5510c8d583aedf2e8aa2b7bb7ad0e1fe968f5375c6475f645a7155dea7159ed451d50213520fba7e9fabebdd649295d3ca1d80f827e61e74d8e8b4729e9d56b2cdd5e5d0f83590aebb8ed70c7a06f7c5b08e7f877f279870c5d20e0d6b71fd444f0b84efb5b2653f3f5a4830bad7ed909028e47e9010f941c2bde018bd58d988477e90a85e4c786161f3f383647c5ddaad90490c398487a78b5196222b2368ba15322919f938068d60a082906988b87556d354f7ba6e854c537d8a6975d25d9ad371ce794e3664a6162952a624cef9d619a7a9ee5390e9eb6f537d21515249412e491a793852b15b618a30ae13384ed4308a51c442c4d208618aa410c21266fa772b4491d66bba15a28052648e4ffea88e21e007dafeb318eedbdd07240ac6275f4803fb3c3c7cc7c3b3dbf554fc7df6fda94e492afeb6264cb615219c3a16aa08ebf8de17ba77044642154c6676ac030a580d0dc817f4ac6d94b10e2a90c14f071f540003bb8e81ae5b61092b3d772b2c51a5afbace0ba2907381640558af888bb764b563935a73ea6db1d82929a1c455a2887765865706a63744cb580abb3065bb2c623c32457a46bca4b07664a67a266a24b940216989272469c44e4a0b49c28c48db01b9c23b010aaf8a92dd57b047c4849e0a1fbb1472ec82401d69ea9140210289c40e0c698887b696d6a54a055e14293d2c263b32233082f47e640ded18da9011e30793d111126feb08048f68ccae6d9863851e0d2a419af09ac27a3086386df186f0e8e988fa32a3cb8a5d171225786024420829d38362a177220b4f85191327bb27495820c2b3d1b51b73d5f381238a868b16bc1e462678288c44f44c38d37b52e395d8b253c14aafc8939ed7d8aeec042720bca31ebc2faa1ed8d3aec90b13469ce0cd1861c49b6aeb8510d3c3c18507e28c67228a7049ef8510e98ba7f6a3d743c75509bc361840529c20e2a8b742c487dd11b61d9a17312c4953b4c87a238e601182448b47958f1b5232785a54f05e1425f56a14113591e13d7de9a540db11a91204059e182444c076625cbc30563d22a9dd10275e158bb5104a3b2b218a7850ccf0b0c0ec4cd09296028fac4c88d80e4a919dd719ac22533c2f357828b8c042b4d463413462e7a4859d9930595232ad372325afa410658c498823bc32437827b87a255c8198e22579ea4d352da5d8054120f54e0041c4bb52665705cccec816b62b4c51784098c438b2e332a497c5d5db71a5656a17f6b41b367d48d1f50189b7e50311cf4899dd0a6076c22d5e57c04489c1a4e808ef6c082f8b6b77e5aa7734c563e169d742d3ee4c8a21245e13e110518f4799dd123054b6d4b8a214a505139e942356437a47b8965cedd4a6743c85359148c1b3d286c47bd246d4532a13056617658bd5959e8d283d2e263b8eecb60ce1d1e0eab5b8eac998da89799ad2d443916207a60524aa16887863caf05280f9b0a5d775a557220a8f09139e92233b2f437665b8b4ae785053379e7648d2b1a967948e294a38938474a688c7a505b3b5ddd990459616ac4c89d2573bf666cc90f59bf38f66c27a7e9d73ce6f8621886504f9a4c4285ce264808864b244ec4c862a4993714aca649892c8188d615b22c3a5af3e6797cbc3a34509e5e98da982748e697264f2f4c69028cd52de97b447956e36b425519c82b4376c1076423ffe514949b039255d9e1e1b89221e7d814ef73ff4495f7dd013c668195325fb9ae431615a6b4d965d2855798aa22896268ce098a5711c47d33cc70cb19d676643639bd273f897d9c24e1445515cda25f6c86c543d977d6c35270dca8186a6265fb62536122659efc9da7004e77f721e31bdb6266438d5b9059d7371be75c63f676eb7918c89a4fdd24977694ef784b7429ad4d71403a6b5a2ce13a6bcdba09816fa053f5d2eddf1d8af0d1ba4ba34316a62b0f4f537d6c5b4388969ffecbceb5835b876d66d706dd809105c23eb3cacabaf2356b7c135a8be9ec135186b278264d882659c7abdb2153e9c6066e284185436ca0a604c5fdaa814097689eabc0b154e0cd243f2054b8d9c2ea7dbe574bbdcbdbf01db91c601484155e39fcd3797d3d975977b4eb438ef8d72c86f62723f1005665d6e53344d9483054852939f5f96748b76b8f677ffda9f05deae6ff9af7a57527d8e17e30c1a7c0c6035f074a013d0eff7a0a4abcffd2e435c94744f7856ccf345cbc5d813916eac1ca9aeea7d7db9d17937d2b2dbe097189d47e728d5e936f805442fbb0d0ed9faaacb60463be29df5bdf7ee5f73b9bbc7d3722ae18a288b4d0da438f8875a6bef1da29d05876634740f4a891e131e9e31ad797e7e7a4bc6f147fc81d464565484298c08c4022a1c99e062ebcc12592f8a94273ff9de9b73ce39e76b9be068327542e985f1e40ce0226c855c2f6c0031ba34097d38e2a262478e165caeb68890b802333b5262e48c97942dc3610605a6ab880cad4306930ca95c0cf5b2dd62583125572cc86ef7de8bf1c51817e0b60a459160364cacdbbf68075b64d82ddac1b290c562e9eaf6abcca052060b979542659f50b149b42c1231fb640a153237c8416e8b0a02aa20e0686f7e5b8388d0b048920c2049ffb1d0edab56766cfcbe5c284a42c362a7040e21d820431fba08f86fc72807b98ed5350464dae7b68ac0049a1519a89869dda290cbdb5a82317e45549151e07ed16db76f5107884c63136086d23a6badb3ce59eb9cb3d63aeb9be4b6f6fca3dbc77d750bd4ad2a842f87615a7cafbd6065c7eaf6c76e855533721e7ee12885882971e11a860d41ea900305991c2ab40c4568306314abf49cf38eb07ed3adb0eaa88708e1c38377a4756cd7b35b1e2c947bc6ecded1a54358b67d34991656dd48b3ba7af8f9ed00397f3ca3504755c7752bd4b165c62bd5751aa88ebeb70dea50b2e9809a1512173128b6333bb41a2340f4889122051d445ac7082e52593bb79c1b36d05a6f2734687def9d044dd359a430471034adec56984347bf752bcce164764db164546c8132134c7265484a15232e35a6b20cb9924503fbd6033d722c51c978adf58e0f31ca0d1f2e5000d3840693504815838592985891184b4c94c9dd0aa95e6421790787306bcac945981a4d3a102552ceb0daaad81896422932345076a670ba155285e867b7c229b61c3b399eece4f8d9e121c4614638b56426941adbb1faf9d9a91ac79f32be395741c027e69162ac4b48ad56f5ef50a5ab46c51f812e530b54bee61f02099ac60299aff17f1f7d0ce8bcd7ed571f7db6adf3056414513756f4918b4f7ace39ababb87774f058b14c18e514d5822bdd7ae7f4fd986d6cb33db6afb81e6463687b6c175571e729cde9f603fde63527631f3b359c7664ec34e59c73ce17ef34959956272c014b0845026b67c4b53e8b7bf60e89f4fed833d55fa6c5a6f0894cf83446f884763590a2752c7c32ebf8cfdcbd1300339aa1d66f27ef9397bc97bc22caa124cd3f35493eb73b26d2dbc9df3af6c9b7a5fdddafbd6449962ae941d7ed5b55a754c9f24bdf8e8b74f5e9bb7cfbe7dedb72d2d429cb2fcbbf522e9988d4a78bacefbf5d60c11b76c76e154f3fcf7c5a52455fa328fa399ca17c144539a0e8dfa893bcfd7e1e1f0c7ef06f3ff765b0a10127feddfd3b46a926ffe62b1ff5d90c561f0b4ce065e983c14f49be8849723433b1eca448b97d9edf0558fc7d318947df386a4d9224be3c1c6fddb16db3f8f66af8fd36b09f5ffc15e78c5fd439e76cd5dc0f63b053225dcf1583ce753dfacc3984d049e8249c71d6ad70867006940902fed7bf357973a45628a3abe3bf62de9991beb88362b72bc9db71556a8534829993cf6964a5370123b83db540fa7613a738c30870cfbba716286740c9df28508754c731084b8077cded57e79affe5e63def08b8f3d76810d76890bef627fe4639c8413befa048efa7bcca2ceffb88a4fd6ac0061b3229dabe21f7683246570c2cd32cf3fcf46334a8544ffcd3a2fe1da434aba7cfe84b778ed2956743c68083cbf3c319c8bfa0eb3731ea800dee8933fa00dbf78f1bdff89bfb6a7c13c218f61c5ad7c226b4ae3fd53a0b90a4e3a3407cf1adc31d7de71e3371ce7a6f2ed4af4f247d7add206cf58a39bec665922445c85a48f49d5dab2615df11bc84954c7b8e2fd4cb37c7377de579f3016dbfbd99cf31025abffedbedc5db8b7f5347fc7ba16e3ef9a8affc0df94da14efa3ce8fa28fa84cc8ba5e4f0175eb2fced788aa208c2cd14c5fde7b9c51bc629bdbae2a5be5f04dcaf164d510cbafd3d4bf14b8ccb1b0abcfd798a28872bfa6e3fd698e6799e8f934e6c71e769be8999685e3c71aa89956e02ce172fce5f1587062fdda839754daffeab9e349fd2bcf81ca4a2aa93feb901ffd4d89ca269e2a5f36fb73f73e7e3fc8dcf344d75bd25ced9a86b5aa3ae2389722869d2d4673b0d0d4d1a64f61b4ebabdf8db771fe72b1ffb36f9fadcdb3ccf53bd7f9ab6df3da22608e38b2afa22aaeaf0bfbf7f03feace127e753fcfdd757fe78aaa63e4ff1b192898db09288722835e73edbc7711c552edab11c978baf165043dda75ba18bb1de82a907a05be18ab27ef69bc72893b0c949f8024df8224bf86249f822789e65339c79927ffee59cabab071263f54cff62a3f33cc31948cd81d4f9cdbf80f1c5cf2f7e8e629b277d6668d7e6dae0dbe7f0cde3dcdfa82beeb73febb7e63e5733cef872f15e4cae29388720a44f42bfbe153f3fd148344d1f9f671c9f675d7cf2c95fc94c661225710d49921c4320779f54d7abeae49e678cf15ff24fb31b389b1feb7478e49824b1b5e3887bfcb70bf58b72c0f657a18e3b643555538bc10273183f0ed2aa2fab3e8c026bc6e75f84ea4c607cfe1f8cbc5447521d330aa401dea0ab5e15a7b98ef360fc60547fd49fdc23026ffcc43e201a74556d390a3c6de768879b8e31f6f12151f5a3d232dfb1e4e2d6d9e2f216c26d13b71ac26d2b7b08b74d846e6f5b27410b6dcc55303fbfb5695fef05ea9edfdad15a9db546813b07e5f4715f747b347ddc7f90aab80f6e40a008b41bd82e925fde7befbd570238dac8aa18638c813ce7ac9c73ce1a058a5a6bad817be3167b6f11056a51148199af96ad5f8e8630a240ac7d4f45a2c0dbcd374b511cdf547582baa8ae5d3471b79b416754fffd48d0a1d7c7efd0eb5a05f6c41e06aeaebaac5fdd018b246821139f2186aefeab5a6042aaabdedcdf41d6b0c7314d75f8e6cfbfee21ab8e248fbb87c6c8aafbeb1ebaf7c998a6b53ffcabbe79fb268e4f836580edc1d847c7663080fde1ef2076fde6d53eb107893d3f032c10faf81760816e8f5f011958a0f4f127c002d13c7e200b54f3f81160816c1eff8f05ca3d7e0d190e6081ccc78f81053a1fbf010a6081c4c74f000b943574907d2cd0781560f4601918f96870f3ab2db2809bc738df0d231f0d707e34c04969703e47be8d6f84b4935fe31b41d749f5068e3ae61e1a7b80fbe6ddbbdfac37fde61ca0038b8126456fb87e1f4d733f458be15a0cf7b94f8b9bdff2e3f86eeedbe0518ba9dfd43e0fc4df6f799a5ed4830f447554b5efb6759cce06b66375bce14c02a0d9f303cd8e4ddc6deb16059ad9470216ca18c3c063378559615a647dd53fadab1bc6bcd75eadb3bb66de7b516b6fce32cb22bbf7669cb3c27ace62e68bb3de7aaba5dd7bb7288593e59cb3c8c1baf6de9b8f543f38e77c24853f987e28097f14654c0631df890363dd0ab7befa7abbddc2eaf75e9cad700b4ab8d5229fd95a3484db465a0c78dc32ea586bac6b7df575146a79f55577e11651cfe5dcad706ba8e7f0af89f932f68b5cf6861626a25c312147960f29f012b1a24b982a4131aadb65ba91adce701e62fc32868f15705219bf3e827379c895610a91e211bfa2ee981675f7de7bfb4081468a8a0b314455485e82a809995aa1cac51512434688cc14a4aeb28fb6bbf7de7befbd6fd40d227522cac6571791d291b5175a535ad09ab103c40c1af86944a3299339e7376a10717a114685940d4dcea860448d58d14203ce398e7fc042251cd9f862822badc6194e012e289404c9b80ce9d08073cef9d0eb2d3ec4e0a444511447ed448a13133db2ce0c19c19ab16f54c629698267fce48a8c9f97b92746221968c599a9ab252928271080eae2e408c5092fca5c651f639b7895c45bb8dc0bef0162acfab2f7dee7a8420d1a5986b4c8c810b322782486890c242c1fe3990bccb01ad232f262232221094c8c5a1932445bf099680667a5dce5d2c04f231a394c814e218facf868d2630d6c4b06591515264cb010630bef71445366a7220be2ee41433f8d683d9afaeebb2c53eddc452ae72e28ae64d10846e55832c60576a54badc84c9b9929844a6789ca3c877f3ad549ee881685a56c112f25524e54304382c58829154b5694119224a4c7150bc848e1b4bdd37299c815f317510a3b60cd47991145229248ec88c182151330c686c3dc9828118bc86dec86b64cd47c00b1d1f5348589dda2c2142a20d64ef82ae3430400d82ece6b482c2b84b0c7980e1b4d5f419a52889db8c2ca574a706b586014cd60a18595132a40e263868824606384f82a07177395029d1212311ce211b5a4e2890792158c2b636386ac2d41c3488919fff881143a012285d3122b5f3ebe64806d065ada10d49119f22e5d2e524da8b4653921d302aaf1a4b444a82482c80955a3d2a3042b6233a058005281938e2f2a5e8468cd08318a60a2bc307de9620b23e6553465e3445a093eb8c2a899d91434169552172ca9ac94bb88a2fd9a0ac1c8990828352429361624b63c9d184a333bbab170b1a0baa894bb586d008a97940a5c7424b58d5a828851597104f6e1f7136c35b5abf2179c203fc88890d12487520b2c2d265acabac8149de02dc8a1288ae2a847b4a89baa9f1b51535662b817fd7b0ab652ca6297cbc191213fb6886122c5c282dd104ba1c9922c5a4d3e88d058b028ccc42aca4950ac85184e4eb0985142c38a4a18168f1c17297e35e79c739e53dd9af69ccd9b733beaf4830ca21e552bbc78592143d210233ada8a7864c13a91d639e7699a7e59828c3535301a2e80ac095141491991362b5946565660bf456a970444cd0a1031685d405738b240a5c8d252e16acb4d4b8ee8e2c60632ce14d14ae147530821afaf232e50184bbac2f12566b9586ce5131a56da5995cb46a330162e4e0885601c00860b89303c60b030a34577195710da115cc32ae305052d33a89cf94184224b04170a2b1ad8ea4cc4f2f9890f8715902e8abea8fbe6f505e5b616846e80c04a09cc04e1be8ec08531c6012f965a1faf27205940acb25107b2038863558b6b88f9eedb05d5e574efed5aea32ca39672e36aee1de7b8fa459197972ce395790eb8b2449b234b9a44c2e2733ca7c235e595e535c555e4fdc4bcd6be865e635c58b8948ee2449b519b5344d7529d792906b48b865662b6debcad91ba54cd24fda22da1a22da6a02452459d8a4303462a38c13321f3cf440d125b6c6f62387065c081771ed1d9a676a7b64f1f353801364b0203a132535e4d2e01ab335f6044aecea87c98b7ea27ea2c69f33b71313499d2fe99894772bd4a2ba580d2a6b31691d49b93c3c64d7e767f5c1409815c639d73f676e975546005652332cd5a4d9ad306bd8d71f142c0a79b0097984f0a9d87992f2340c524839d9bf48c5ae9d26e99aee8049c9711cc7714cb96f452acc62ea3add0ab37808b3a0fafadb23fec7fff81f2288534cfdd6de8bc3e38831f0bed6aac5503c2b8e78f9d8cda71e83067b7df4d1a0c1ac81a6c6a863344833d43443fddf571a515ff1f27b6f1e35b94bd1dca568f27344f939a2e4adc491b71267a6278dbe0ff6e563a6270d5a73b3b1f7ea6bedadb9f76deefd9cbe7fa3f5fd7bef102c08161604231bfb72ba4bd7de6befb557df6befb5375f7bf5c559ef9df1dd38ebbdf516f9389e7c24c9d234cdb334cf13bde16e385cc617773b51b4c30d979e38b4434a5343535393f1adc9418136ba0a50e0cd051d1c1d9d8caf4e875c735a9fcd698376b87ddfe0dce0e0647c71b65a817e1274fda278f36d05c18786e11e8c06f10f0de21f0e0bd20c6b86708675d30cd5686874706fad73ce17f89ad2fcb3399d1ce21f560bf275ad926c38270d1aa419e61e1c277238ec438be1eb04c31a3019eeb91f22873063464d2d2dedec4c8a94be92c3a1f661a02d01ad8e5ac56379096778802436432df1edfe4046959163f68732689a65306bb8b1e51efcd8e836b4a1d1f1afe4985b19bc0d6d9c2c06fcb76136b2187619867bae5a06f1af0ce21fc60de10c43b51bdbcd8c05b2a3cd5006fe1de9aa7bceab693ffba0d21537438ba2e9634bef93f7f6b58dfa09c6ba7d32cb02919fc7e74bdb88546f5fbe11e91dcba59e79f4751bbdb8378e5fbc64026dfefdc0fcfb85fabd18e7f304eadf417aa31db45d85fadeba9c4972bfb971c7781c83807b849dbe3f63aceddd2870d42850ab3e8b61a340516702fcc52f22d55144815ba87314a8ad1dc9b22c4d922c3de0eacf4fee21cb6dea74e6077c9f24b9f7ef20fcdbdc5aeb8df556c711055a6b9628feecf380df334d4fd403fee2075ccc68d66f6a6cc79b7e20098066d79f81666feb3a41f7ed03afaa556d8e6807b29ba81dd1ad96b76f7515a16b9c2299260eed20766b31f0b69f4ab9ba9acf47e06debe5afda5a6bad352f9975efbd17a3758c1f638c31f78d2dd072ce9a07b5d69b6d8bab1815c25ba5e393274739e0fd7c73e43f76cedf77fed8cffd18059e6fbea9e61e2fd5b534ea789775acaeb69775ad9a60ac7bd8551d9b972c62e63733076b6676efbdf74280f76c669639608cb1ce28879c33feea7b38d45a8bd7e93aed2d72185f8b448140aceea1218b415775e875ac6a591c987b71c37b2f6e08e6aa2b6e8bfd611c8e4ff739be0ace2bfbabd25a6733ec289f54aacbb11c85715bf03a16e91ee78b2af89c3f1f879e8f433db8a0657b7a8017b4ec0fff0d09fbc35f53f3b683d8b3ce7edd0b6980e3d3d9aace04703ee73fc0f99cdf9fa3a220c7563fc8c97914e81ee78534b8c0e1abd2f26ffed6bcf917b22c507efc17beb2860a6a7ecdfdbc31ba59ca1a721e8fb7b7f9b6a7706f6d069c1b231b75d575fc15f846db735fe7b3765fd5e00c78bd90f61537ecf87137ab0ebd31baa0d52f8c75fca56fbd603626ee299bc15afc3b4a7cfc39bed1f6888fe3834ad71d2f7d5f94c3de776768fa60e42a2ed3f2ac38a7accbd614b7846bc219e15ae01f2e4dd81efc39be7284edc18f6bb2194a22fbc32d70867208ff4c944a658932a9442a8f4a12a59105ba79fce5080b649435ec2111655119c2021159a0f1f19720ca0fe59005da1967c4b4962b3afe72092f00e7f19b69cee3729ea646bdf18d30f61072ce67e31b41d745f5468eba9dd81e26f6879dd81fc6d966f800f8f790aedfa11bdf2ecbf9f6131bdf8652e3db51687c5b4aeadb5370be4de5e6db5534eadb641603fed3b79b580cf84ddf46c1b79d580c7b6c2bd94b2c06261603cef16d277657b13d98ef2a362dcb7b6c0f8d695fafefb1aca12c77b9cb5d728ef1e62a8fa1aab51cea3847e5b0e965e237039952a8842c582731548870000000050317000018100a0944e24812c4301c4dba0314000b68ae3e5c4a28918b44911848410c833108c34008c300060064003148398ad40ca42093a9db75f300474dc53e72c18c0e6e3ad66788aae16a7d26c0cb8fb8c46904711c1f07f012eba95d9dbc1fa1997613f73090513b74dc2fb7a862c8ec0663305b5ca80bdfb9c9a42adad1b7b2b4214131af3df910bccefc5982bc5a231b408a447590d0d89969634481700d2dfd6e427b4c40c3229a6c83a22ac01afa669028ad111a525520d2cc30c3c77423721a3b9077f8c22f9e167891ae8e084fe99856a2cd4b69929ed0333d3a619a54bde833c40e56f622b6a80e5cff052e2cb1953242111695c892c437fc971f5e8a60606369141f8a1848479b10dca9e41b73204c1236fa41d54bf754848dc5ba1c3a5fac8bccece93e067d7e3817f658f18717bd27a55d04655dc17cc0ed1d77161ae78b8cb77bd1a1b1554c7d82bc8dfbd6f701765ea0083d45f458696812ce275ac0876ae06f6b5898d76284141cf3b3f8626dd2629b8eb9e103995e6ea6480378f800f1a53437adf105ca31d90f6270b432950f510843481e77eb1c6768b87a596e7e26f8d772cfdb93831f047cc2097f0164931abf026efe219d12d5e0adafead8fb2eb5a157f194068f91d65ab7b6fa307e6df5543890c6fb8badd992f01e4463ce602121f6c31397251e85fcad3a0e7669bad68dd0fe13f2081d09f40f901644318690d4b0261c6803774d6e3c69ddd2a0674d9b36b0e2c6877c27f27190d004bc04248b5b5606476902c2cb5524722eee349c9bd2def709156def718c2b8aeb2739f357ebf6103fdd60886cd434876b36536af5b0232396f6bac86077a53f74b7f6a1106234f689a9f21a0e01350b07a664af4094b473e68ab9838c1d15c21b9e8238a87d713deb2807d569beae5a32103057bb224577b4813bc45160fd6cf45a8101fbc5d0d489c0969a8601f570460924549dd8a88211ad9438ab29a9a17370bf672a55868ad9b987c4e7a2490936f438c4f9eb0c514f49b3de6fb4fbb11759245dbb192eb4f6e66c60c4664098c79f736693ea5aa34f276d690f3967653d8f63b6603dd01908db722219b0970dc9bab3e783322897b5b4fe0cf927d3dd95df2efc19d34ec7016004ecca5d69d427ba67857c185eeccfcc0bd1fb2d69a8b3a1123835b49d83be4a0ef507ee877a3b175ec9f2103b91c70d919ff02f81529bfdc905cc4ac920b971fb44c556e74d0638c1959a35d4c35b1dd35e55068e9eeea1ec00e8b423d3e88b23987aa34fa62db3a9e7e856d6e92c73aac6119521e6e8870bd423c265f17ce5fbeed492658b984d0c74d182c139742bf34f5e076690d17b98a15eeee9d588680b23873041f30b0e819887bbadf19547dfbc1f5d9e4754c68ec846e2927c05b4a2e02ba045a96621d531493228ac68c78e8558e41863652f3972c35503662de3feae8121e4a2fc2efa2a74f8a83e62ffd535763aec0be2f143a123179604dc7def083375548b6a72e9e3a20fab616c60148e0c1a60be0ee92106692848c0580063fc218043fdc9e8ae576ce3663c01e2b51052100472b4db5a91c6b617ae54ccc6cd3924d0ba38c4243d601598065f01b562add7fac23f734370cda378879a190de5bc83b5844681954be3c487336551013940a3a199032e3cc8515c20061c37fcfeb763a82fcf78e0ae18fb0a181e4662fa44e578e7358bbcb2af8009bf31d44a679aecc3278fd257c001f01f2a1ce1f6b94d1093fee3643f3aca34131642cae8c56f91966920a769301ab21757a2b4c5fcb46d834c24de3b550722fdc5bff031b583b720e9dc57c0cd2ed371034e7d74aa686404e0557b2ae6f6479b7b7075f45cf54e405f89e2ce3afd9e2f6e02571c15b4249c68699b06db9a91008c5d9e844f27edc681da40ee752ab64049120672d5c9d10495f31dae045be7375c1888753792b06370d32b08f7a0478c1edae63f1a28ff36744114af0e69c53a12fd0970402440508adf2f308386d442fb55fea5856ae55b2c6f56fc34cf9e0097811d43de2b6aa8d13115b042852c4c037627a4ff39dd084235fe80e4894fe91d4ea4ba9129111f6808d8fe9ef91f54b2002c88a72f3b8b8d76875a2b810d439ab2c0952828741c445e91066a778770b6939f75beb123c602224c848b553f208fe2599e666626e72b7df84f6e6566c5700f8518d82c500dc6a9ce7799fd87bd9470991f3c477c3a4f1613a0fd85d77cf811dd12b8a3cad334565491590a6abebf4cdf3a280d991aa942d13e8f06fcaed714bc69dc4cea4fea07f9c312dd73074187d312c50a74bb07310d5fbac6b73be14ef597a47846cbf004263fd262569c338da1bbac7334831b2437f018a7249b0710ac554ff6794b728cdbb6f1f92af98b6149f6e5ed1aa47010faeacdb03fcfbad7e2f293f9919d55729587fe949a76496b1aaa408ed5c6d7474873ab48045eca81a22d9271fdc8436f2491c328136ada86848b57a879af8dc0f5cd95af1006670bda69839e2226163eb273e225187c0a867bc3c34a7cf4b702c44b97d2e9866397618474271e3e2d57087df238923b26ec87226654ddaa804586343ca7c0298e89de33dd99cafa5299291fed2df849e490867b7960dfa1c31578bc9ee8dd0d9be806b252ec1f815c570bec20d013336ed30c9867521c34f760c86a012fdb92c23d2be9976198dccd418d86b334236c8af1db0d41f91cfa87b14f5529ac8a02595d6322ebb9f85df215e59986a6f899b59391e88a8ba4fd22f36e12cff222e568f367a7aa0f8b39be4da4f6f1ffdb2e62d35cf0493f2c5cb96c59773d38ceeaf2d5e6d498a2b57bdeb8f7b505919f0f53260392a80d837333033f17295e1b4289230076df365a066b48bed67f25b5c5dd1b23f54bea9329ae774c10b013a13a52360744a6c565b1fb9a8bb3c1f5011d1c0e4ba74227d2e4329d90953ffd89017786b4eaf9d23b4dea48238bcb8a6bbdc234a5687ade056143658b5521b2dfa6c4b76235162bd8775a3b5990ed2bff3004abe081a3e465cc17948370704922d55eb803a23573bd1f9fc17eac911c5c96b0caeb30e0f49c0a9f69d55fc0753cc16a7bc8236a8f04db3d1a41cb8e752f6b1bfdda9997b304d5bca7eb226658927144d9ebb17b781b29ae01712dcf27671b6496abb0ba776d88198c585c8ad6f259aa72f95fe899fe918fbf8b62e5aa1f0b73c95912beaeb193253f88b003dc57a30d2cb5d68b032ca4443d28fdf8206aa8ac74dfe437f204d708b104d09b6091510f422f51aae698ae5a7ea84b54f6c050289900a3e95789d6c21c224367556f040de815029ec0970617bf8aae7b7907a120f61e433932c405b6a70b4bb69b76836a79a1816e1fe45177d673d807ccfa3b0154899b4fcb16f9d2eef4b44d1a9f26a3723d95c8ab70091a85f7b1fa00b74e4b7fa21adb2122eb82b91ec2dbb3a3bbebdf55c998d6773efed5b7ec25263711da0f8128a04bff9893b8828448d5886ff01fc0bd7b071bd84e770715bb30e402b91a91252cee307ae3b37c28d22223b468ed7a56459f11924ac4535584d1c7b919905fa276999eb4c4298f761881a5aea2886775cb6750bd129807de405c8717401db818ef5a39b4e2bf95099d97c9fe248047bebe2c40cb42ecb7c58a0d90e4d6ce6bd8f889747dc92e5ed19c4b1fa98a366c279677302d37299bf8b50e4b084230b5bf157e8caa6d987860d64618deb95e55c9d8ae34037dd746265904eaa17361dffacf2e59ceeee708f10667bfebf677508233dc1d57894dcac5b083cf37817e61cdd0802f97f7253beb2a54c8d5a69692184e82149f9802aa10348a2318aef83bc68f37ebc9dd6f6630412f08f39a18c0a817a3ab8c2a8da615209630bc81cb68d340fb1e746d5def4549f9666a0af879eb1c2d11b8c4a9d3d66d72f55ce958cee7429d4ea6b623374489294202b8f546d00e007ae3121d0b7e89c39a733ca9409d1f078a3e4c41fb9fd8243204fa485ec171d59035c5c399ee38ccc7642f089b3feace63e752ab3e0e4550d3deb8866491998b623f579a9de2eda239424d2ff1eb21da9ba2f53a363a2fe906c388cdaed2c52fc20728f319666d69ed4892041a93ae02ba9d76ec51ad38ae90af0f6f402b7cda0f0dd66fddaf1dfd3a538da2038787be43df2f5ec883f6ce8ce07c8d9d5f83df2291b3774c545c52ffcda49792ec2500989915568581fa04dd4c92b609122395612658990d659ee0c30a5a65aaa690e41d79f6a68d844228f500a4ad8cdfcb182f2ff273e64d8a1722cf50bec38defceaee76b7a77b4f4ca198ba1a81962c1d50f6c33bb93816fa1f3d602f82853a75376b16cf324a43b400de4bf6b2105b11051cfc93b8f57fb312c77feefcfccdc8c516d429d4529bad67dc8c89c816e944b8a9a4a94b9ff6bb4b217bbaf674b2c0c1de62dc9cf96a375356d4500101104bd392722cfa540e13910560c6c41296e497d54286037f6170d2a9eefedb7a995d5f8035c01c7e3072cffab65cd54f547772642d7b71d7ac79fdeacfa7a94681f2371498797ddf5a42c321ac70856d3edb6211b7dda7b12fe05210ca8f6143b8329e09c6a35f9ba418bb4905d1f4f0beb42b5a80adcec3143e151149627ff7ddb29b8f611b9bb418d71d71c4719f3177c09fd638a723b74ac5dbc90f89abf30635921a789dd12d88f398996ef4ea4f24780193557cbfe1e75d32abd6f08a5a7e773e34cd67876a83d9b9317ddc9f7c6cffdff8bab617cf4b8c3a9dc1eb73aba822ce7cbc76b4efbabcaf6145ae6c798165708d4be6d52952acea379f637ab3b8347c5da231e4af180bb76bf925ffea0dd049893ded05bc81017f1759e0b34e3e516c01cd33158300af4fb6b4eeab825984bf183a286ece037fafeb054aeac6118c20f0f4099fbe17dbfed120756747f153d64159d5545d7a8a25753d18528157dfe7da238d2325e3e0f05ab231403f5ecd2382b02c4a188876ddad9be2c02ea2758fa65c5d8130fd85c27eed76a5314b80d9decd09896405c6305309caee58e451ef0ea5839b547ec0e3579cf9c9d22af8bf7a1dde9440d01abeb98aa5006157914358e3e25ed40fad7596b8311057a5fdb38182cfad4464b206214e3f5af10ed68d23156d1e492126d3cd34c73d51016c9ddfbfd9f6259008134047ea484acf38579afb376bd365a0a1cc0c6eebba1ed74b9bce34b86a84e4df3af327b64a0d578acce9b8635271a761752cacfade845807bdc093f5c5c342fdb26a3a09171fc84048e77aa0bdc0552e41d1f2a4aec7db7dc0a0a332d7d81f87fb75c7800f1dbd6376392fb6d7a4b261587b706a9053aecc77b8a5127ee131d09758a843f7dc1df6082e912dae676540e675de057f3a940fa4cb541d5681ec067cd9080b0d2795ee745f7e976a87a9efe0d76316ed6f6cc52cbb1a839155055bb135db6c2e37b6eb9c42536ee7fbbcf3c336bfeb26f88adbd42cf7088154a44ebacc0a2efddf2d2efbbd90cd02f4894b9537f92fa6c9bcb8cc368b5830ec7cfe25303146c51360aa4121a44b0a63dfbdf5aa96a0eca9431d424585db1c385e6a276c9aa5345618738ca8de8781a4f74d7b16651690cbcd89e88ea89d2b0cd9cac71d8d4b860ce49e01180541b76d955f273d241f07f40018a387be0e9196a1aeb537282c77b5c6acf8765cd40a2e7f536e75b18d543894998d12cf2ad79056c15c68c5a113770f206cda4145096c59d1164ff981d97e9e7a74975cee077ae31c29ba4967ef17c8ebd4cb39641fdc2cc7d0cbd4f66ea4a5b60b23495f2b70c0c58edc8f2270a6f8b779408e18291b9c006f069f23440032f5c2b8089dd6cc8119e27b55249c072dbf76469de695654ea1233d068b3a775ee8630bd08626ce36daaa672518bbf0e2510e6c0c9a8d8c898a209e3a4f6eb3b11da9b34968f3acefa0604cd093e2588f0963e9290aa597e94b1083e587e79d67d43e6409197ab711effeac96499b09fec6aa25b22de4ad35c8665db8897c062b62c2d2866a268fa3fea58c212714ba90b90d156d3405ea64103b6db325af6966d3a162232b1fc54b64a362f88481a04206bee1c3924fb3877790ca52b7f239ab69d7c990b27060c016e10b70117c9b3d90dee9ab79b44fc8efef85e338c4247f7246d38d60f7effbdf78a8a395b0ad43b2d2a38df056a9131340ab22f64b1e9f68ed6a66fc2b7d901f4ab8b116f3b43372cde6c261326eb43974ea83de2a35624b6b7e077195a3a23056b05aa67a42d1af3b8751937b656b066b7ee78540c4f53e4ef7d01a8850cc96af02c06a253ffbc5b3dfa5c5cdb1b19356e4d13474605705295b24af56ab09026f282c040447744e08e7e3f93db9d2ff7ba205794d31fbfdc7c4cd4cf2f0952be41a51dda466c7181c631e74bddffcc33dda05398d21f9d8244b7c9ab3aede717cd827e3f45bfe5e06cb13d5a7aba09b86ed5ba3762910ff9f51ee4f3b313d0ac7c7afee32762da4cc327b67d6af705091ed13999d9a9eeaef7cd8d7779c840afff1ab74627615007e4901f8302eb86969542859df50b2c7c5d21b389d8933bac8b7be3aa40bd2ac9983c3866963a2a7f7fbf10c774c01976c5bac03f70a36736b268daae4c3c3f5ee66cfba755ab5ddf383b5227dac557f123aeef6502d47107ae6f6d8e176c917b7ddfb6c84a841872efe155e2fce278636f02b61e17242d8361f853db23d22d2cd862a84de2c6d391174145fd4b7851f99a8f87d34bfda8d995484ad96ec935b00fe8f43277292f88471f565cbb12aeb463a1fcc57a294847db63bdaeb6a6d1af291830e62e83508cd3caa7f054069c71d2c6984c0676a8677237d9dd9d0bba26d0cefd7e4ecd9e651234dd19629aab6799b3c24c95dea818560903946db9364072db8b9af49ec41663401feb52de97b9affcc281f95ff4292651cef14299448db14820c2c31dea2827d1102b74f0586cf8c15b91a189ad8f6963e21cbcb144b9e06d8c21c51772a1e65426ddd58cd70a6f5eec2b730de10eabdec7c588a82b6d0b1c6243e2c5d83710ad591caaa5b80a3e5b6c78a85d5d9171cfdcf4bc1801a104d061334b5fd278e2d0231b47a29335639ab6d16ccacd43eebd37f03a6a0fd0a497b78728c66cb5d8c05015b002dd679d4b6ecc1b1be57484d63a2bbe3330a21c5fe0b753e9ea80eb341f87aed22c8a8cdcc5d8ef1aa2b1a9ccb3533f5a055870dbc1c5a7c5a1ced8a780548b4b04d576009f9dd846c8711ec99c893cff5e0aff94ce19945a633879854b9de3978465664b806f40438f654d66d4906a642d003386ab92c98e400c474e0b9ac84d9b13c102d3c3c66b2b6ec5accb635d2afa3fcfe618f24fc8c953f8f1b0f8a246fd85ad3a00d4aeeb6ac915a89539c8f02c9d8823834fb303604cee3b9a9265cf346243fd9da2039bfd3a58a33225c19152fbc2da08972809bc1958d2c5fd816e995c75df242fa26678b2b05e5bbab589ee9426b874af714f7eb1c16f86d57606ed504dd4b523b2e101aa525c1c516ebe5002f25e96adf9cbbd0ec429684c5cbeb3079ebc893b6a5fe887bcf27509ba63f2949af6632fae6993bccc9f5f3baa976b7862bde340989f7c4616480a05be8122c8d31881a8cac52a5106a7673e34e89fb763e555b09c4144987c8b654669c5c24ed8fae69ee806ef8e140a9c630031b2806cf33f6b88cf722a8ad78963cc022e51f9716333f516d52b6152efd926b8ad1d8ba7a1c28def59e9bab70ae2d4b25d330de77de0c34308d9641f0d9857fbb92b2466960621078154144e6c83a4493015c8cc94996b4e8f397bd6655ee3f496aa3023744c911b861a019fd04b8f95ed04e605abae63c7c16d3e20820f049e8eb6a1b1236c710eb094aa21ebb3c570c86eee385b5490f230719e781ddcd8df6e73088202b96519ee2be7dd5ca73df1ae4b45cee3e059da5e1f9ce7ba325dba2dee3ba68c86721253fac6c594d4f15cc8950d5dd581fa9b00aa8adbc14a7e2878260e21abe8321f4a32dd57c9abb75cf2bc31fb1f32953321bf6dd96bc9ebc6c579024226a4e1e80852909057cd5dc493ea61d70a8430020b900d736b009c3261003c67def0d9843b86a2e4adfae24ca1134264d730ddbc314456067fc2f7c6c86e400d54e9474abeab69c763462d91254fa1f7e9e2cefafa5a933a29277d59d0c302e8b1f4dac23b70a0ea68ec29d8c8b2e03c6cba65c09ef36f734e03e259743fb223b7a9cc7f9f178542b27432b8708229a25c2cfdd3097decb30b9104dfdef068a0f64bb6f40e0f5e2e845aa0f131efe0e8026bcc936762667b121b07e894628b7088d87b90d00958181774c2dd1225d324c69db625801f846d5037ed7f1dd6cba6464a03883e0ed863fd746fa11a91b987dcfa7319ef66b91f0a30cb6a48fb3c61be83876e063dc2fe0a88604077ad5d72722d4362e902ea1d6ca5c446b7337b52bf04d4f619e85a56e45aa24d7c5410becd53437cbc034e61881aab8ff180529920bedfbf9f9bc5ec52f14b63f07e3a401f625908af98e435cc724311e72e8ab8594b840fcb712234de8a763285eed2208ad237f26b90f725a4517442262bd196ece29b3846925c7a3f6f51bec5034fd4842b232e8f8160dbfe7adffee2f20506728f57f1d6fba31bf34074877199512cad23276a992b987088370c779f1f202c6a88fa738c9b995289e1063ad82de5acd674cdfa0de7e168ad991c03d04e242263fd7c6462f1a127366171b1ea65047d839cc6fa4e5c7c577070d2426c82f5a90de92eae3750e5b89f564cca48742cbe822b29f3fe76b7f3f97180cbe96a12777c18f94dc073cc081a3fc34471dc7459b8105a1e766d94115ce21876142225803e2edc10afdf0696e7f7d645d6b07a6e52cb379a836703d291d065d63a735f662746ffaa0b378d61be3ab450cb93373086f222071766f018a03931c24d933e34a5f95d510bc8cbef1aa05473673a750205981c0b4e0bc80d09ca41d4a22ec90ce785c7ec252c53a0afdab88389e06429784a8ff2f1833c10d8f705634c736405a91e0c7541a4db37730425992efe4aa2180df555550950451f7c42ede3a8e8ad1d5c33fcac63b619c0ca080535e0663e1d7274eaefaac624e526621219723a45d1d54258c4fc23dd8178113fa72e29f72edae28d663f8279d36a4ef1fda77bba4fb794e1f4c088f5228cbe13262e0913f0501e88214be809175ae16a23571f9b575158cef2525730c8bd49d12903428711350bc986eb9eb6c2e80f73469d221596f18b9801fa8a75bf1de4afc01d56ded5d9524b330dcc2ad0a22ad90097cb03b8b1131f33471dedd4e7115065b5c2e62d0248b81b3df919432d226d9edb78c43f8539391a9dc39aa04e9de016200f8e7c7162f62b1dc2d019a3226420a5f36dea026949249e814d41f4c75a5e7201ba153c0a68fd36f780220ca700da159e1b7b6061a91f9e87342398d3709a6af3fedf757d1acea52ca378b1af105d78e171e6b1ce28d2f904581ea82ac325dae6521c9acd7589259717d32cdb4f2c7688c635b20cb0fe7f828faa28454308323405aa0060b4b255496665332ca0ffa0e240ea8a0321a0701ace322b1be2a1ef065d852b670ccd7d5703220ffa4b9d69219f704bc29e51a736dc7912d9c355099f3024952627f8f41e67d0278bae2c0cf63f51b6551e11cc512f803472df9306b708a7a4a813ac0463ab7b4ea0581ac8563d39fbfcc7c092fe682202780e60f9a802c329938bce7f1b40fb8b3f21727f6bcd547e9574facb3e6820f73dee7d6b69ff807d1e0d504453b6a9b3c38d8f29a87dd4f48869584c38f30cd5db575d4451aa307f8d83b2a7e5ba5ea35d9fb1193f5e128c0d0442f0a69a3806b33ffed120a95b232da26b2b7537c844094dff1ffd370f6f3452d2860f957a903e9eacb9e9ea29d7a3b026a9f98dab5b07acf2b8564f233a31c5607d0e0e0340c75b263959af551da5fce2de8e0108526828842f8a35bb3b0c37cc016f6e21c4635eb78265dd7dfe09add3cb051316c120384a2cef4c641970bc621e824fd8a4798ce3ef3edb01a1443a202ce49a4c8330fef41f3e375c9e43a434f06eef07adcc0188ab4080a91194f754c2db4e882d6fc629788193ade617a2ddc0697a661ac0b0485fe9ad4a5f899c30b7cc7d9eea4bd53e02a32dc246cb2abb90888d83ceee53cb40a3678556d718d9a285d0eb5f641180e3f9de5b23d9c39a920a5d96fd78bbb1bb32fb65c1ec4c2a6574d819c56c3b4c2765cf3832868b7394612097029190101f9458b32a36df26f5168984eee2732a6a9436f9869a056843f2aa806a9a8b574ffe1184828380e726b953dc95732239a4e40ae2c88374bf9a6fbb019be53cb9aaef78a221d329963cdfa7ca4f4052aff42b820fd4eb0444a82e9910e821af4bbd273f40b79546cdc085fe982c5064c078c38aaf8ded8b54f86dbdaf27d294040493e9d8652910e718827bbc69b5b25dd5f8858b6635bbe7900d488925ec6f1c39f1d38d469f5f990e1370994f701bc23d128fcf96da4d0ec9e6f83c1abc07a5ef0a57479d41d945bd015a4f1443403f7fc9bc0272a343bb5832be24c9188879fafca4a2857b1e7a4e4b92c7cb97e5610c5547d2abeac07b49bed4d8fe95aa83218341b2743bbff33ee8882b3ad3f62940a8405a4b824310b96b77c999096a7646776a541d7523e430686c7b84a995fb45327e04f2b231befd5dea2e95249a9ad3abf46daeebd724ede623adcc488ef0867f29c2c2ab1f8d60461bcc3b96aa0c81dd54cc2689914d98bb1c79008e82899c150664bafe7c85552fac92d50d230d48f611a59de72056029ce4b8371fd6551ddcaf088fee25c2aa3e204f8d13088f4732aeddbced3e220ec49b25f928057924d5da67a61967933528598a779439e0b21a55f7947a06dafa442d4fc5e43fc245dbde919aae61ce3a96108d6b2c70003768f31beb71b0ddf8a6d28f392e5ca0dd1621a8674d57089a0b9cd909030c435256fa0b24e85433787d0ba6a981d1c2814aee5762aa0d811d14b5be549ea241015495ab83894755a97fa3f8b5d9a8d16652558d3b45f4cca96da643f588198fd535683a395e139cc6d9b2bb6557468f2880c23e7ac7c6cc0c893612b55f71eefbc2c837d0c1599bcdbc51238878a5a23bc09e54a20015feb02f35930135b0289837986132759d661478063c69c9c4eb474c3d394c97843415636072865a639c0c5d880f945a6349038988209bda1f1702b3e1b30e02091a35afd34a7977747e8d345d1d360322692e543ff33a32f38b4a9b3a1eaad3b1f08be813d8408491d9e08919e292a078dba6fad369585b43f5165af15ed02d8e86605a03ef5f99b0c7d92394f703fb29bccaf2ca0496b6a35acede4711e00509f863fa9f8c216be7c6643808346eaae81273bc89d10f1cd31692f6e9ab974c1063dfac945a04a626811677044857b3ce1513845163f1a21c57b1b3a1edbfed2dadcf26eb3ba89282e9f56c5b207a34fd35aa0156748289d3768c5f06fd39a53963c84b54880ffada98f2c57e2ede12693d35c7da3569a35869402b000ad955aaef2064e6a21ab8ddaad79193deb1e29b3e11e1deb13e3a44851524f8812433f67bc44fafd16fb1c585e9cbbcd80b75ce0ae31a44e839fd93bf7fdee1065cb63236cf189478018c3ab0f10142c174e0971986357d1c080737708e3bf96eb791758e53cca5ecae497264753ad17c8bf37824cc8b1cbf6cd6f1c89ec570d95228c0eff877ca5cf193d4df5bcfbe4854925d6c9b080b7f954faeee45ff568ef3a7f9c3bc8aee81f96368dc0a15c1d8d75463c1750b0a2b1b5b6a8b68510ffdccc95563e10018d9adde0981fa7e85e5caa0cf2e7257dbf163c74a0a6d0899c96a26d0f4329546e552b33599e7e91988a395d6b488d6a94c58542c0d882b4c4475676c6b09510222fd5ab1b15006ae85a655fb8521f4cd42070aab9dc2862f525bead8190830bb9fbbbaa7e879bf2fe44cd68db110a9c28a11f6e8cd979b51c19f0a66213238855c50a2022d5a72c36ce21c5aace10361f5c4b333890da0d2040df2ea7d934805aa1dbcc453a136f353bf1a909bcdf83eb1eef18b7a6b8f345317b0d86bb99acc2c57a93a8a575b6c515b88aa454f93ff40adff2639a009bc930389ef631d215f304fb901c07d3df3a13714cb4afbde160bbcdf9b9a446b686c67cee4e5cd08e59ece417bfd986331b2c0bc441b1845bb8260a3b91b2b1cbd922eadbdc5982c3a76a3a09946f1dd8624afbe24aaf156a7a5a488a75f03f7892d8df09887402ac70b3198964698360013f4e17adf9e70fada40b0f5b3258177665cb2d0baabedcb06079b5380b5f4228cad250d49669d95b53f66d05621bab7901cbf5f30ea46abfd4d263274d87316ab60f454ab3791cb28636754817b1e54aa328a24c0f537ded1396f01931875410fb62443f8c375f87ca7c9d2cd85b53f56aec63be022ddd24688bd70e4b7bb9883ec1104d8962fe3c87ee314b4bdf8f575e32b5488cc1623d311fe737a3305b28c99005b6b64d870d56c94b6d7d44627516b4cbbf6f1f01f04f4be877dbbd46e99a29e79a01680eeb46de61b059ad22d54d35695fcdee16db50cec2e4e03c3f6ce07c9b4c40651774e41b08bee9932d05e537d4f65646b3a39c57453a6f9df3cf1ededd11dfca0bee136c020887db6089213d07a5f29e79f700042651b7d204cdcdb289b94330bfe9e1daaf37ce820dc45a7f41f01812c950ebe55469e169725b707f0b4f62debd2ec837c206fa5a4d0832013c922d8fd635faff68f38639b9fcedf10b9e7f918bce0b6891fe5e5637fd486198977dc1ebc5baad18e9d56ff80af917f7f90e0b9ed8d28a2bceba9a6b87f9844538d9dcd78386f26fb8cbcfc7a4b09ecab59b0945272c0405ccf71f90364543440a8003fbdc4b93b08ba6b69abac8c7beaeef9f2264e6b9650d82af858c43d94d21367d18b7166d594a0777c4aeb8462e7122284d40c030398d1e1c4ecf7d205aba39ad945eca7a2237c3672afb9ce03d6ca05ce39a15943b3620f84c14ebcf4a0331748265a37a724fb736541b1fdb4ac99df17fe4d3e972afcefd630547cbe411f387803581c7b1553f9d78c58076fa480f726243a54ec12a03a09729ec40aa351fec651968e5a8a8d08cfd01a1a71cf325bc4d6df72e53b75c5964202c9ed168dc0b0a2477ed367015b110ec6e93946fb115a97c0b216a462d703b62a9186b5b1c908d719566f78357e32e2aea3a22eeea9946fa0196ed813af1325f6484808f662a6b4d8e78b52d2ce8f14309bc7dda6e08a8df0ed20d218f845f568ced1036fa6e7055bf48d718d65b9713729dc3f0021b31041bc0622d8f83708d6e5657d62b3a1bb4e187661f91d68baf89f5afec6327bbaf864f904754b7f8700d6b9dd00769813db221594fc1ae81e46eaf586d1b55711025cf26ed0022c5a36a39dbdd448ed297c7a6da98c7965755db6392fb2aaa7cc481e602afd092015eb5a351375cf0b1a71c36c29c4991ede3ba4478d5b226ed567dd0652b68c6eb0735e2e8f9dc8f238c4d366878863d16e21a978d5fb5353f6989924d29f9cdcaed65819cf2025e2db251119e90240fd8579eeb80b6ce3a878c48e2279c9b055c5f50fde2ccbfa2b93345912bb48a55a380e7a591e24b8fb384ad9434489969f0cdbd63c61a6a65ad5ec4faeb52806574865795f273e08874ea1154fbacd62894fbbae7f3450d13e0718da5444cd975528f9bd9b09c24517907fcc52984afad424798f507ea75e849e38328cb7cce6a0642ef47f10688df17ef20cbb84020831913b60aa541f783a0541eac5cc16f6ed75239d6bf6d87b847167d34702b3dab31957b00c0660474c77c62502950192a0a63f201eb03c8e574b4d91a8572e412c95c9618c13a9990ea03a4a59190c4a3ab6a9f301b6a93374010deee37c59993952708b22308a41719716fbdd84ba01c4b98ee568fe0defd72a678b71f1ab4f2a982399d5418fecbedade0c3066064a99bb9d24bcf1b138472fc97d4b8e3170c471daf3e621896f67d49faab0115088948826a5c71bdb9abc815ad840112037795be927803e9e126bf0bef21bc7dde4fd7afa16937cedbdde811b990bfe29727ce22d41dc6b1bedbd81d8d61add25097f1863d9c0d72562f47061f9f72f4e421100e181496f80f9e00eef3c2bb9e3d4de30523d76ca885076cf29c96f91243d061fbdaa148fe7b81be2228ab0ee10eb7536e4dd4f5002e4157e940bd0eda01d5c3b2c75756071ff7b62f6449422b0da3efbd7446975f38696a2599707aae57aeceacaa08a40b976e4605ca2274798c826ff8e20b9755cea7bcb4e887e8b3c0e48a410fd49747d6acea6844f153ba8c04f01e9201dcd875f431e61cf7d15dd9d216c58109ec390ef98d8fd9c95743ac3e182bf34d306f9bdf0d45ad754e61f8ae477478eaa7be04773f94a502197f8f7529169719cd0f98652afbc58e3173f05a38fc46473e472a27ff5867885d723c9fdd0db0b6e5114dc6efb4147414beef73b018b4fd4e91465061207cb3c3a2d21846af5e0f8106b2f93d6065a77d64dcde827927c702420811b48e6cbad737017765d8556b87ec2af55b1e02d90f64fee4e542690c606f1da299c1f737841181e2048d9002c9d35cc39388ec5ea31e903b782bebbda364343ac9331697f444ac8d3e11a0b21f8f0a10c682e2f220a3d70fc063abb9a1cf416c6d4f245fb6dfbab2158e0f02063d71eceafe0b469bef0588caac27e0e5a15eb1938db27bdee18bef5644579890e5c6a0f19724a3045bb971a3ac2bdbe6164c9c41d86586c806b61172348028da363c66ed529c4cd328601706599c2b2b45b54817f4bb160a3805b4245b47c5a4ec82a9a3ec54561181509e9de12e50506869ab98256d74419540832a1a161e9196108e4226425f806b936ca5a7b8add9e091239bb6ff447852223889aa325190e0b65e80efaa7aa8d332e16c8b4844754904a6e18bd688ecad025424496ef0f333aaa98da8610c1f009ff4b74df46cfc2785d8968055ce53ac7bd38228b8f7930cb68fbb8971d6369626a24b455c8d24ae561721cc33159b15d99527ec559290d713146e6c60e1d14371db8a0f245343f5969f92d528417fab78ea0d622c288ad4048be20867ecf2c328bf7d45f02f1bb047a0e7a1a38a9094acf512d9ecaf2ceb1448223d236545a841496bd8b2f5289e5ace8207637e12ccd8ec7bc09e8ed12cfe3691630a706223cf5923ce6369f1177c85a6d37bdc1846a94617c3138011cf002060cf48dfdb3894cb97bfd6b022e4a69c801c9c3198a6727e8e4bdec592daf84391f113901aa20b2350c685bf4a621048b5e030ad2a5e3deb2cdcc55a5586836e76bffbb0f32f369444329be46b50c989de12f346b2e5624fcbbc95b4cc98de217551361914f9b913a841835897d6a23d50af08989e71d39b520d131115738501116d557292d9e767a73425accf917f59716ffdc996391ed97f738680a699478dfd395162f13406036834ad8617d9369ba6db9775a298a44ca292d5ee1feeeaeb33b8bebe430e3358bfcc19a3d40987fafd5a979e9c3fe256f007495c0ae04e8cf567fc1eea64fad210339d51bf118bd79f485e31dbac5379bcd15d31a7f9d1b6c303858bfbac52b90cb7cc2dd8c68c7b273249d90bb23dd0565805e3f077ea8c58fb54e1ec95accac65b1f8cb93b6d65ebac59f519091dec22d91422e3e89d016675ce3c957ec4bf12926c1311073908471abe5a40ba649ce749dc9a7e8ce04bec9cc50d77bf8516f297bcd29da35d14c00fee0e2874d504d3626f1f163d1d5fbc5728f6070a9829a836d0c0d47fa9ef81333ca19c710ff7331fe7e14dae315339106e2afc498b34f3dc4ca9989591c0b50a3c7dd634f0f79c17444b7076b3d3a37c057881ca74b5f554a1eca82abfc468689ac0828196fe5431244b620effe5a2ad11b3609ac9b1a3a160ec5af1beebad47be2bbae2956928ad3b70535d58bc11d303c7a3a4697a201b29d44f8849817c827f49f9b64035fd657aa22d7c097ddbe325e606d54c49c5d78e18167f00aecdca3a16ca5bf52572f76662588ec869d526e233f6637344550c544d0ea0eef46734a44795cbd8d076840be6e3673e319775ca95e4f351d2115c99e73ef451ac3e913f6ddab6a9e638b8addbce145bfa595795d0d2a221dc8c2d403e63e0be85e7b095b26f100d85a9ab5e1d3abafa5532f3e71e0074c74e7a100787eab61a5917a8bd859b49743ce12fd925bcd28e230e95527bc646b69ea4775c6939f66e6f5a2078081bd34a92e15b08bf08ec73b5f31c5c33bbe184d076669d73f31b6ab54cad0c69abddcf60b3ca9aef79509480266576218c4bd4b50185f1d7feb093ff3f8a1481fe312822142ea7b06c190be48bb6020f2016759666bb5981664756fa0d1dd3265d966874571e4915e9d805589b3b6512de8e344b58772685be5119ea43c50b1878e700e86c24c59a081b845f86b4e67c6b9ec02c5b99967b395e9a7025b4876daed71b0cb30d90916208e2ab924786d2e8be5e6db5ca6d34dc2c84e97f159390645dfba4c6f0c931f7df0785bc051e4c0e1456d62604bc515ba2840a8bc5b5e2213be376523f0ab7f7c42ca60977de3955b2ac38de9fcaa4882de54893ad903d04a4b6a424fb86a767147c9f596319a9a667a562b6bf5fdae1cdab680406d9e7390473a074bcdf809119608864a922af4ae4183545dfbb190716922a3a2747709f0c1d009cc7ad4cc6deef1435b0e90232e5f8f5b548bfcc3b496cd36e8e9aa6d740729dd5a47f597df37bd8765092b76ccbe7796d07a3809d3a84a329fe41765b32ae667ef1a561d2edfe4b8ee21d3e6f2f878c5e24185f0ae91a1f185f70b22ee69e4adf6fa35235d0a8eade09bdfb52899e524b30d39879d20b0b2228d15792ddce9b6e03a354ecd8560f3ff1c62091cd76809bd3c2f6221dd181b8094a37a74c66af73c001187d6bea4f729665be251eb49a70f64759ee2045c25e7dc39c8ad576a67cfe76deafe0717423b92832b4ab75601efbfdc35af0b5911ae8328e9c5208c08f9f7cca05fd20a862b4bfa1a84114598391aa64c21161a19d71b09f4f3a5efd5d887975dacd07ee25d5d7462058e2dbc7f90ccee1e967bdd057a44ad1c0d89c7b8d22013f1e9ccffd4cce086d11fe3230a41dbc5d0cfdce68ac6338a283bd758f905417f68be9ea1fc8d089c4ecc6ed8bd48925bf790526e4b69b01746b9ef640e01aeeafbc8e5c9827523e5a485bed843e6ea035af8ce226f75c8736aeb3d9c8f03ea0c4554deabd49d10a73a9a4c38d8fdaa00ea9dc3b7ed9e0146bc858f1f3c3673e3f0e1413b1560006e722b156164f00313b5c45aaae0c9a9b7ec3d92b20961fbfef1b9f5462b85c2db9db6ebf3f1dd4af5b378a62f7a23f8daa8d907fdce4bf1cd0c7871e121afba90781205039f34e0203411d40eb873382a6c2995c777789621c01a15cf798916bc4c81fca241dc82fbb719845ebb732acf938dd450d72ada5ce9b838e0eb37089fe4f814abc9ad2f09e44c2298048eaf6e6f8b954d1416b82f4e0d4db50ba96dce267db46902be740079b9dec5fcd940921edecf3ca5fb3f689cc022cebcbdec8cd940991eeea1551f6d9284778c14dd8967e2244d6ee3c82c34e7c3de02d1b6220ae17f2d9a08ee1ed8786098f930ec7dd88792a804bd17bb99fc2e27ee46298b381309dca7028be9a6bfe663816a687d67e673014df7f1a704a6e0706592cb16de211692d486ec71abba9a06dc6a9a75f75580394bd701b1ed205e0d9a00c06a974dd29b03b133e01ef63a1bf2b9496b2abc85a877e3371b51c0346978a04e6eef50a20cb235c0b413ff2e0a478b2293a921b5b6f967deab062eef48f333cec36e51ca7a67476bcce1454251c1bd0bfcaea4997834f5debe8960b558720a428edbe9c14ccb9135e19ed6335c3f41f8d4f0c4d545c1d59a836f11f95c4a6bbaab9c2e82a422785f930fd8c936dbb5b9c09667c497b2c2d2c218083d439327f8fdddb60a859e9e93e17b462fe04646621f4dfe2ef27e4833e2d98a7dcd07b4493239f86791b88b417f90ba802996d596c9ef7623d1ca3a83f72e305d58bb2075545ddef981acb4a0a2c0fcc77c7bf048ed58231c0119754ad1842397a5291fd189d3ea72b80c6351476cddcd0352cf767ec1119a32e9514a404349bc566127a5e520377245ce1d0aaeb29f9387e6401eb59d2f9202e5be36d46899900fa4926e1f96f30cdf13d47466834079adc3295bc6c7172448f30f1b5580269cc91f4c3840fffa5166a7acc605fab865a0a1f3e5df93bd6185148257560f2ecda3d83182685b9ce0c8c28841fda05f3c8252de5f5255fc5aa2e6d3a140c18ea6a4e67a99ffac94b481e76ef1862466d1e5bd9a678627be9101bf4d7f7bd2f64f575f324547bb173767fd690573c27b511e1c8e330e3250e5ac5b771f421cd063509877a9209b4964b7d69b1eaef2e545da2b64ea8fcc6b973a790e9a8bb87f9667b65bc855d3e8d6275265d10b6595d9910b77555af2d1a8db7cbb4a0095d24f8d61e60e21286734e5826cc9e95cb42d075397bfe8b6e479ebbce4f6edad02f9e1615440a66260d8851d26a3220ceda0258b55877778cd59b9b3c727d777b8072edc59a931664816710931bab7817807ac85838422517640a151eaaff4bb3b3f2db0b63b513d5bddb6cc249de95430a8a6839589755092bb673d8329c14394d2ac20132fe3b95b17b0ee3c2d22de70b7dc661d2a02dc1ec80c2acd1e98f5d3fb00e2f277883520bfac986752a9501785e854ce06ae3b7d2f146054eedd2148071e084526377849ef7980ce24912580cb9b81e4b0bd2909dd0577a69fba12d3cc332f0f8f112064a977ce43d2812f6d11ae918f1d92ae9a145b5fa06f25b6829114f505dede4fd7ac0e29b2e7b1aef6731f3311e06cd0b175ca4b31143cee1f7bb93aa4cfe4c1f0aa625c082482929b01599f0f4c4aadd0d8afbc3d00b963cf74dbf0c3b45788d32c366dbbff7ecc37fa9377aeb18b3e72793299e57d71281fc16c5cd9d71410504dcd3f0e42d87b3ecbf3b7f0cdaf005cb6cf5796c411d637e2f16a411ca06dfcbb15bf4be091b57d17b12b0bdb2c0a4510d199a4f7645058b3c3c9ec494ad064f3a05cc2ea3a49489879a91d7eec431f5b4db536838e20148e7d68391c4ac04e200dfdd887ae48b62850f52f716b8501bf55617ad503ed3a449d285d6e41c2670f36b5fd429dd53d195cf97f88ed0db68085b78ad2329a919f0d486caf5e522705effc913e2fbcf314eec0d25be7b991e4dd9e91fd86f70bde6112c460008e62d936ef543f424259c36580ff9507fa093a85fd09bbab4a7f4566a0c145d38d0f9b4be5dc350ea98ebee3ca0226972f9da5bd8b59e9644ad8de0fc06048b59914566b28049547b24c89a7450bfbf7d746186b794f35f4d8616e2e866c4863d39cc81fcc170fdf4f324a942e9f6c2ce1980292d3fa1e9496034d2a01a75f63fa8547300278044cb08c36c25e773502c58bddb318496b9b7a03e5a4c602f479732997111650cc95ded5213aa7e68dcc129f2eb2d4a62d2b5247f3197ed8a7ac3f434e2f980ab6304062d27772c519e2a8c66336d69461eb955cd67ed4ffd9f0176c35455653178c1e1ed6f45cd92e32d95df3b4992a2f9a29918abbb5a87df84705b6ec330992e98bb57a7171295ab04cb79e7016136953de23e918492aafd52baba2b5f416430411481bc200b266a881b7852b66b777f9478a12fa11d13899c2d70fc02f633909c81b767c661a5deb1637b4a956f1e0f1d21ea38a12f34f52fd4f5c52a596ba451f7e3b99dad0eb13467c4ac2426fbbcf94762d48ea6526378725bd65ccd31814f584e9295e766143798aef9d1735ae20b0734c8316d9dbf8a23bd97c5e8397a75bc9e786cbbd5a02bb06d95608e6dbf2bfb67a23c1a711908806ccfe3ff93dedc9fc893fde5e96efeaf98c581efdf8e44657a79bd051e8701f80d26bb1d1e58da901957d65be80badf088822c0517d01934360ade9f1e0a84800ef9c4331394122d12653cf8d102d39672e448e9347e89780153805c6c9a306bfc94be4dbd32ba70b8a8ebb261bd9906e0fc68cff774b7ee27236580381917209adc4815085fc5ead9654431fbc6f6a32f64f41470f8e636551c40186d04058b254b7ae382402284233c7e9f27cd2390c98a39936be48b3874378a92a837f49e0c4d2e105f5358851a116427e23ae74a6df69a5783161e481b7d3eec05d650273e7cd91ba54272e115e110517f33323f2d4b51c324795e5b47f6fbc4bec04561d04cc792e04d54991604de278f135ae00ead0f44a36d74bec0edc6ec6c3850862f205342115cf3547fb2e72c311dd8908e89975598243d5a7b94f5a433a4ca3b00bf4b60f1b56aa0a3c3ffd49d072bce1d89b835e8eb71ca8176dc4b8cb3abf6662e44dec9231e5d732027a16d74a204b67b88af9b81156cf8c2bf1e146eadd10b29e191a6423473d38dc70a01e8e11f53aa7c09c946a022aad21585e30141a3707a9754076360f0fd5ca4d883532674dbeaa218c67ecdbbd30679203e3333349314040046e1d198419d25e6bd8dc45ff788441300010ef732d7f4c2f9de2bd7c6ee78f83ccb66236f12a80dfd84ddd5ada68c9681329654a520642054b05630520e71d4a032acbb23c6936f679c76d26eff5721f7ff9cb5ffef2d74c00642c25499224cbaeebbaaee3008973722b913ecf4d1b574ba0b22cb9b2237548922449afe23297b9cc652e2bc000669c322dcbb22c398ee3388e244992dcbad43ecfbb4ddbb812a82ccbb224754892244903cc98329dd1d9b66ddbb6d1d2c7cdcbae2cb5d9fdcff38e4626ddad8e4aa0b22ccb92c63380f741c02e974bac15772cd319d148e9ec5257bfedb12eebb2ae91461eed576795a8ab33aeceb63ad3eaecd6d901bc0320000140727f027e90e025a023c127f72be055a3809a1a6f5a63635d93ea18eb7fb5ea587fbbb81fb711bb9a95c776e5ce23d1c650a8a20cb6a73d0f0463626464f2685d3468dc68ad635ec35291d2b23ccb52f4652b8a3260ba715fbead0dccbad9f49bd36bd9bf7a164d09b38c514aab2542824c4963b67a168dfb09aec34e97000d9915486dc0b3cce195c70a8113744860088857cfa2c93aa06508e64fa65ff37c10cc23727f005644274f9f4c93398ef3d1f4b2278f13a8ec91c119963f949474ff8322b12241457ef2e82d589120b0223d140b1458868bdc10212232232223e204952b3009446c4024e8950411490441c4959281109d222144e164ca0a788c8865e1040e7870831e90cc6e966071a2c7921eb60b2c43453e86e0418787123c30266605ee8266c03dc049f024a193c4cd902c2d8c91700d011a32c510211f3a9c74b3c961337948ad1b5b7bdb305e15b1681c4891d7106a51c1a9425af9885cb9bf2cdd4d0dbfa07fb2cdb24fafa496ac85a32c611478b445b9df6699750d51d714754d25b59674303afceddbb8bb0d08b637bd8ab85978fa9d339abb6631de366eb5f219db756b82b59b3bc6d6863633fbdb77b7f94ce8cf61335dfb726c9f15614ce0b81111dd94b99ad6755aa77523ebbeed5e086baadc04ee44ede3bae7badf4459d6be13b5aefb6ef4de9c73ce599435ed29a594d20eca9af6dddded76276bdabbbbd7a1ac695f6bb53f59d3dedaab699df8537e0a2985fc917ecb24714c2177df9f4de949574ad69ea4759ef6f747d6349792b5f105b13c027f51f78eec1a1b0da3c023de4870cb9f593cc775b6394b983b9788bb737ff80c7c8739a3ff12316b9cc764f53bd9ac19f80f2e836983e43e780fce83ef4c1b3bdc1daf715fae83e7e03acec371f01b9c9c364e77c77bdc47ee77d7c9844b291075b94d1b75a4cf53ddd77de59309975220ea729b36ea489f7732e1520a44dd93099768267d236ed3549754b3965baa38ade02c7f6f583767dc4a2073bf6865ff048fac4c8eaec0b83dcfaf05563e83feaa7a9e83e0364170ab9f4db5a975f31955f3bcd23fc17d3d9b556dc09ef4b3c1cd9a1c47b22fd621dd7d27988ac0719a55739af54ef0e838b95a29cdba334a293d41a3bd331b2abbbb7ba874f75aeb48491cd6ce714ad901de604cd8b2fd14b2f69c884306134c9f7e3654dcbc1c33f55bcc91caf655d98a1d6b56156514c18e136a24e7ea2e150afabd31d4b18de73e47d97e73d9bed7bb65fb9482997efe5787b55bad9f8d76810d039bb8f219f75e7bed53da699fffd531b3f56b63ffde12056cf68dd3aead3e2947aa3f2770c52ab61498fa22106530c1de0eda5eede775f7bae06180f4799da6699a0663dfb29a351f0aa59452da1f05bea0a0a1a19f1fda0ec5ddbdd25aabfdb1f6521c9cab8d538a1428b8fe9d5fefdd9e1b53c8f747cf8dc454de3e472a95ca9b78c3d9459aa671edf5d8992acfcff244565aa86b4c1aa9fc42ffbe8b238efa95b6577bb58d1b75de472a61d30905a6542d2b979711871561e68c7d0f61ac183367e80b18311ca867f4db259b15c2545655da5a011a69f4ac89bac896cdeaff216027bad936011366640a2352ea8bcada49efb2ce2c755d21789c312142b208690869086998ddb843e6649733ea2a8d3336c3982f02a917302f4d1a5900e3c565e5a4b10531562daa54258d2e784b1a5f107a9734c240d448e30ab99371c58d44bf26f182c6348cbf54173b452a208c2a6ff7e953d7b4f1f2f4e9accb96a7efb26943f5947bfb5ca8ca9df7914ab8739db8b0df9e62beebd0fe0d617c64ef477c25fb5315bef2e2fbd10494fdbbc5041443faf1c423fbfb8a074ce9abcb898a17fc30ff12da8f0947541017d38f9debc56ff9858d414b8e09c7ceb5ca2ff451a3d89c0147ad3913caf0a2c1841508a96bced07709e96cced05f855dce19fa2da1937386be2a05a2c25338d2713ec91488916231b612a3dfd0b5d717775fe4421beb5cb16983e33a57f6ef5cf48a200c1d25a9413aa7adb106b176fa142e9b33f4450c4c872fd7ebd0c57f955fbc0e5b7290eca4167b24847f2fceff6088ee31fbda8f3606a4d79c712fb570f008fa83b169e37b9b43f58528eec797d9cb9872852fe0f125e5cafe315cd3867d1bbe3cd89a36ecbb2a7be1cc5d69f432cb2f4064ff0d8c8d5a415436c6ace2745366ac2feaab698cac61da5fbaac2eb3b6aba6aedb92e70b9d2adb9a3654f565c4c81124ac9e4553427d514aabf52161d6ab67d1b8cc889059e395111e23384e1a79b511236646805097111e233b312338465e30c242ac0b5b80e1773098274c0921e491456bdcefbefde1c0218fdf7be90cff300a991a34e0d619b35995ce69adb576364d558254d284951b3af0ea4b2a251325a480359dbdc9f46d0c66cd764dd9a70ca767982c7f8fc1ac699c66f9d39f2c2fa21f56fcbd1f46b63ed81d3b6487ec901db24376886c96d758937fcf306b341e93e5ef1ad92cd26b683b3ec37fdb305eadfcb59dec5a5019966c89c7925d53e28104fb5cdf8e37f424fb9f7e9c5c73c6bf43d34ce371ea3901a1ed68a58ef6a3bd34971551b16bc58f7a433e7c3c79a76b3e1ea6674587fc72bc2c1ed190d73011f50c7f5396d98d2dca69653fe9e064ffd325b3975c41d9bf45d3ac59fe3f043c8e76b27f0d4b3b73c67f06cd197f3bda79224cdfc6a00eba3ca06eecdc96954321ecef5f0e568b540c6b26e5fe709cc0f6095e5aad569ea20ad484d4cd28d4da228c09d503994e9ff15c3c17cfc573f15cb8b0c5165bf4773d67755babb5f6de7bb1e0b11bcb6c569658f07782667dba580c6c970b752a4d9424f194c94a7f0577ac6bbe3cbf0a6561e9e6d500bb566b376fe5b55aea13d3f770f8adcd5a79b8ab96a48961ed19fda10b8fe0bdddec9a91a5f4c3e174abd3469d3339b62f07cd756e3318c5f088ff8648952159e8400813010b01e380cb1f6eb83c61a511231317a1010b4304c1891022404a1f1e1f278a0421824f6bf3c1e1e6135a64ed6b091e1853649661e4092b5b7909165d8cb6ab675e564ada1d59ccc1620ef66828e6e049c58e592bdd94a15dbdda6a6db7d76a6dbd4544cdeab166291aed8d6d555baf66eb56b9b106012d09e2c2b10ac5346dabdcc8d6aeebbeebc2b1ee541d9ebad38563eda9aeaef3ea47b2b53454c5ca10d18c2c67193b4eee37dde4d850d0c9544da5bc69caf3bef3429f660df969568f0e6443f3e85dd6f572dd573a812a17981034555637952a567aba064d03a1699f21344034f32951d7e0401659df744eeb34cfac6b38a0ae4149720929445221ab9056f27c5a4e5a529e9e9202297dca21797e07ba06ddace05996f994e440d7dca7f242ab257802d17899554cbb7cc6a8633ea39ff43ccff3bcf923ceaba75e5f9d0997489f775caa042acbb204491d92244994cb4ea3d7ebf56ab56e3a6f71dedabca579ebf65f1a5e0883035356929ee7799e4703661a1a9ace655c89f405266f04f6d5bdbc1695278e291044a15028d27b2892e79d4ea79317d2c0fbbca7efc18ec860477c3cfa1c0c082773581c77646c7aef49a18c2298f4261229fc30c7d1cfc60bf1bbf7d8f3727c3fdad7cbbe62af579e3276b4506f0a4dd3344d0357315cb5d5565b3951dcc21ad06d89d4d31ccb0d8ae38e0cbe4c2ab8103031ae337a4e8c1ffda65f7ea491298df8e3ea0137ac0cd17f82fa01b3c6956c31c471c330c411bf10c7558e11c78711475618fa87ee3f1ed4351e53326b1cca64fd84373b9459a3fa7e8f326b9e982ad5c3c0508dc2509ba7abc29a3de6d455a1678fa9c2ce1e6b5548b34799524c06cc798011cbba010c387d7749309fb51c3e8c3853a977f9969654aa252576d4d33183b858e842a14b69d675f5c0aa1f7d083e2a873de87bef129e865c42d38f4b8873d8a3f42e6129873d307e979094c31e38f5a3c772b7fc965bc43185dc127e7915b6a8c291451d0c332a1cbd4aee3f85a3f7207716b1b1beaacc92b674c57a46e0af2ddfd0fd6f0c46978a9001960e2bfb23d9cabc95c4d308351a8d46a3d1c80698666c227d287164e5162f4de248c421cd9452aad39e43aa81bd8bc459e60d3b76b17db3af96ccbd975e7ae9a5975e8e5ee6f65c4559e3c4d2ce3b81c73b9b4d1bdc3715b73b2be528c566dd94195fb4bfafa5aa1742814be0af7cbfdbb6b7618efbdb9348a21d7764eb821fd9fee8821a642b8e232330cd251b3ccda24fc5d1ce9c795b6e1bc6be5a693fc6c8a32d4d1e164d45dfb661bc5a3d4b02797b3abe2096b71f4758d4511ac590bfd0a4050a345f7165affd8ddec2fb753b4dc9a3af52a60dfaa39f3e18fd285546c9a32da70f525354af2bbcc6079b33fa9f943ee59b22f77f4352e4fe4dfc5e083c8e7646931653727f41aa578c4c4553d10f81c753ccc7d12996fb3fb26b36fb375b0ed659f1d09e6c8164fbe9e41e75d1e8af6c3dfa22eb84bcc081bc099f266053f4e4d1f3acb56293e9232190b008199990885a652615459a5c51042931d8a06412ede881c8141efcdc8045084041f8b96288176868c2477bf9c0020e7082c0c147089e15dca067892a888c18c20e26151c82c0524514509228c9c201f3e70764469758eef7a857ebf66ae5ac57db387b6756dbb8d145915aada8727edc6bdca8f35e1be7514ae9a4b3527a2fc73dd7c2c9fddd4d4eeef7703e9ddc4f229bd5add78fcf909f1750f9b25165dbb53774aa62e534444fe389e8343bc928b9a3c3b343f6b848fa1dfd38ae0c025a12545694102a862a51452822541654116a76d342cdbaa7ddeeb57255a3339c99b6785f6e9f54a6c8f35d4689b821cfd1cfa75b2891e777396d700da3584c1bdbfb0e0522cfa7aef915386215a4858a161e2aa0d495940f30ca8f5feed7bcfee8d2a2e22a48eebf54e47eeb2d3c727f17d2bc8d7e5401e5fe3a4a5df1948fdcdf1b182537edd8ebf57abd5ead56abd56a61d3e9840253da8de1e6ad5c487390dc980acca30444ba42f261bb769982602a308fdc7f4b404dba42f2d1ae1faf9f32a82ccbb22cc9d7cfe9757a9d5ea7d7e9757aa1bc3953296faa6688426df96c5abc7969ee66ae513e1c2f07dd0f3a1fea68f645c9fdde5e0e68b6dd0f3a1f6645adc621cbd7cf4976929d6427d9497692e5fe4ee5c1705d70466c526c91fb395a8e96e47ecc7591fb4b9c11b99f6e5294413129b2a1b22ccbb22449922449ef85f7b2919a1297080ddb2849d294c8fd2e9746bc44a099923bd4f5e3f553966559962fb41b446e21aa4dd90de25aa1a159510b74511c70869a8da8196a869aa166b9411004411004c118dee6c28f7ec51d697215ad0ba0cb6bb8ca57d04faccc3da504e5fe2e86d78202cda34bab1e614597d69c0182e98f2eaddc2e310df8e0018fd8059f6f4108cf2bc61346ec805f07cc0236c28291a0fc9203e21050aa40a10265491e2d9423507e4422442154d0040e142c80d80108c88e218e04a10b29ae80e1489156a42c626a9c0d778009c1e96e19107b4f885084dcbff593269e04951da594d64a2bada10c82742b0cc9bd4299fb27772dbfc9f5bd7eb5a57d4dd3344dd3aca6695dedd56a4ebddac66ddca8db469df78d3aaf7a5ff5bc1a8ef4a686a49b5abf541f7f36b54ea1764da1ee699e0632653233192296952cb9be0ab95b8506caf57d0574085d628286804eaeef3a684e7d5b811b54a7abecd8a132adec708d3bc8dc4fdbbd564bdbbd566b6fb5f76adab671dae546b7f346d7fb3eef924adf2d95bc8bafc9e4dd53ade148535334545e6db1da0dc715aadc1055e586e0d00d471ab97e2ae5dd50b5c22cf77d9aafa68d2bc8f2159dc60858f16fa10e4f96e8273e9ea2a1aa7a586bedd5342734682206822db306041c2886ff8d126ac88017f0dfe044278f13088cc2494e1e414a436373f2431e6964d1096113bac51df9b9baf219df5c6d18133c030da5a3dfb53b6eeafe34f43c3f0cccd2012e6e252e77dddd9345a24994b45c49645d9e73a6bb89e7fce836a9bbde93cc5e265542fa90640756eed17ebabbafa6596b378e1b75def77d258c4d27140a85025329550b6c090c4ab0bcc0c4bc78217d35e842263e9fe41469f2e3eeda16cb72f2b135e1c191ac8c40b059348c31892d41c35812a5980d70ac0716234fa83c614eba4039c102745245ca0914958742a150aa9624ae96262dacaeb878346462c50b9328304c943051e28507030303f30206931f181e0d614c7a80272e422b61188a5486477d0995254cc8f87220531a020060b3682a4f981322146c16852999e1d110a6e4c8003caae487004a4c2d74a1925847dd53cd3ac2149394798cd9666adaa0b97183d3469eb024afcec1861664d0581012e6f039c092f89064074c8315d349744842e6203c5c1a86d5ea57311f83098f2530f4a004cb0d4daeb868a11db1438623aa207a614a8e0e9058c00d7ec0696205f9430f7dbb7aadfe2427d75a6b1540aeb5d65a9b14e11180263f30d45a6badf579e0539eb0263eb2d7b8d184070f19566a10a990217422e799c4106309196024f1c20b1bd41013eb99012646eabc74c1c3058b95575143cb0d1db36c28a46af53586145cf38435b1c19bb490035e4159419ea2d4605292839590a1f4130389490f1d3e2634e4e071814367c5861113397039a0615b32840dda122062b84e88e45a6badb55a772224d75a6bad158a5c6badb556eb4a8ee4bae3805aeb0f0d15a6e4956badb5d6db44965bf2843d9141b679c29accf2481313406c64653ab7206012604bc4d05539824e2aa42d812dd13d7e80c75902017f0df86629ba812101454729a5737eed9a0fa5d46b0f0ca6e3ee5e2dec26288b67838a32d8ac2da4c023be82b3602a3888c7058c573fa3dd6cefec549c3a04d580c305b56ad8b48041c302e722e9c10c168a186a0bc5e03774cc12023aa0e0718504899baa63f5ac9b272c48873cd2c43a20660db0a096a685c582c290f4000a8a4448d3348d1b0115e1386ed451244864db058704c80b8ea407a73d10c7708261485a9019a2722578600c122179942965400264ebe97eaf487490e454243164b059569cb4e04c3071040963e2f5c26af52c26644c6c914779c29898e591466bc16033589256026ae75e57bd3be7746fdb66731ce52cc9fe0070e066d10fc709a811b8384256a13ecd1e8114f7e1d09edbba26c668e4a34ab23ffa720c2057ec218cac8573eb9a171bd6dc440fef66c50a938be866d3494f51d0a66d62d2de1e94837e826e10544406bd7a852101fa110444104f115d18047b4efb9f707777a7fd84d312a6843ea24c097dd04f0113ae5c803c614766b92b75da8bb52ffb16052efbdae2c6be421a00111de9c9dcebc08082565d58a2effd64ef5b7e00ed2cb1b384572291be237d87ff0b471376f90fbbfc8df670e73d89f4f73ba1fb128ce93d7184b1a1b9248e302631073d42c6e238b62096bd9fb905b15c7ad268c22e1ffe12f6fe46079941a8b4adb716a964333300000d5317000020140e88434990c3589c46457714000b5e78465a58369b4aa391589443410a63208e618420800820841064cc54d501011e8afdd1e7a2cb7042620fd9d785530530e926d711d86ce5fa4d7d3000f68df28ac2e5255c7a2d59bc4f802cd7d26c83b6a5dd7363e1ae310e8e18360d62953f691dc0b5417c40c2afaeafe75d2a509b0d4893738c9e4e60827a992a10a3312faa3804435459220c0f45df2c9654356faf0afe857fe815c70713e031c92df60922ab826e6d3f49e0197363a12dea1ef131e8b33597ea186213ac73e7d77fc785f5a4294ca6e95117fbf8fac5a542f2fc881ee3e661f2064c586e0a8fab3fdf39a70497d03baf5f1253a48d6e11b7fcd5e6e2e8d513614715451bd45e7a5e9e9335220f92cbe703f2d1658c18ee4f372a8deace2f1c5035d6201aa32476d9b74c60a3d5b2e4717bba54b62b77eca41d795100c24f466b86dedfcb3b543b417aaa6413affb8910abdaaa1b76a1080941127404a0682068852b3b9b351a8561de616820d993a6366e7968e2b13bb3c0def5a158a72a6270a00add7050e8809b1610f1e725af1146837cd0fa5978b5149a59c04fd99d08313902ddf414efcd480333b55ff10f8ff1424510a947088a177065b3fa3aa77a8262aeff0161818c5ab3674b3984cc1cb719233de85a30699b1cf07ab890f9fc72780eb0ddf539d2408dd0eac812b9bd0785baa4a535cb2f5f01465e5011bd1cf66065dd3bc4226d96e6d79559ec9b807ca2e1906ad8de6003a738fbb670c457c883a5a948c29c756aa7f2d8564b431a884678678c283423e3027a16a41ed0fc75d2525c9e4b8f7a497d44e22b2df93e58ebc5d591cc8c29345b158f5d2410f41ebcf1a7ede63ac2c023b65642ff218e37253ddababcb87aae94eb9318ab45b43abf6668690917cc5f2300e462d71a420e3de21f001daeb864ed749d146df19ddb42ec84f9c44a67b9c283ce55af157e1d95169f1776cb310cd157da80b7c706fb0282f95b3ad032e6bfd9321b432423df15338bd731498b9b0066f989af110d285db485a0687a96937d229ee8c29443a564643ad078df68665876c78263f1e80b32c5bbe90d50ac662bc9c064d706f105c1c048a29a892abdb63507519bb4a362a6820a858a69c3ddbac0ea3d97d4b6eea2af48a3818c57114a17563d931ae0031e984a48d565afb17eec018aa12f86a2acaa5940d2aeef20d6b29883969214f0e19111b081fc12d108dbf24aef1d789166aadb100a825d93ac0a5c7eabdafbe47a9583e4baa7b2b2f5f0aab03b08bd21e6be7fc59230aa0f83364409025831110e52a1f73961b58eca0baf88d920674718f30d87eed494236e371f3b8933a3eefedad4c88f41aebd3d3d9b2459a02dc65e0c3729a91c9ed64a1788cd593bf0f8db4a28c2d8335e0aac67f8a013a658d51e99547e9ff70114e1eb6f2df872f8ee94652e433f6479ce304e71ad0a77f6ded3bf51045e0d2c0f4a544f7a3ce41663b89972c96bfbac9b3ba75dbb8fe39a1f5d35ef368090a716afd27d2756cfe1c72b1bc92c53b43604ebf05a1106277a71a8e0d38d60608655e29ba8fd2b3adfd5c68510cc4b4d72424b9ec7e54239c38da5af3823563a9ba3e34d65ef1210cd4ccd69dfb3432e7de7abf1b926097f66061c68da647f4fa6facc98094974d68a36e9ace387faef923901d305704131bb06025ea1e349206c49cd6a04cdc6383758b0ad2f90724a56840ac6339567d603252bff1a04e7ea61bd59cc856bbc8256e26052cc27e5531928124e3dc0d7969829d37d95112baef911d26946514f3413a5f3ac18cff926b67b8458794ab04c9efbb5004a31653497530f8392c1ce65c877e82b4a0746f7e65e61f0f4604bfabc6aae77ac8f0a6ba9a7a64c23a3846df46d8a99b87c3def4196d2a27084b2f520612256bf0de77850d5879356e83ba2286a06200ac6a94c8bcb3aab951d71ca6b50d2d9e7a1118d8bbad533b8e28e2869d46b680996e413cdc3bb86f65c81548272d3e82e275eac11ea21b336ec876019889117fe5e5b55f85733c558b8566f9a9c4c4ff034827392709dd679820039c13945edc77803b7cb0355feec87314e6170253c9c6a064c914899ed13027e04426e44e40ca2dc4f5b412b72f6ee65aa1ce61e2448100632236881a099ac7f213470984c0f924488342c6fa99e4491fef05408e82cbfe06735865032ca8340c1c77fa9aaf01e75e64ebd393d75d7548493e4a1beeac98cd01253c425a541dda7a3a9e18d2935ad0a53c6250018427d823d7a0352ac899bbc02a8fc603d361133a2e1a2eee2c51a995d30276388554d7e84a9065d6381c551106dbd808509b6f9f2ce78d4a28b80e97455e7511741e40751595462cde5be9af8c232fb4eec3d1898f5bde12b5cd8975edb4a1aee3ca8ce4e7c333576b13a4805d5e40aaf57cab7002123c5b0977a31b01523b6e520f8891135080271e98db58a50d853e4d716eb42a28ba7ccc27a31f5e7dcf8a261bc9d83c81073c767cbe778f4d5bcfbcddf50bd50a94a31a2dbb5809bb88ce2db7d23d587f8297a800d7c8a00bde8b7c883f21c0b4abea1306b2cc2046cb0157db5108cf411f793ccfd6a2090750491b666d1bef1bdd5c94c3cde9f72126d3365d470823b170b3c179d1ff92b28da3774ef9b7b7854243143e3e786aab9c022f9e5644e025cc635a5e34e8f89b570a24266685e68be11821d13193379d2aaadbff1b6ae99b934f923628f23dbbd4332df49b008eb0b7b8ea02760810119635e3126ef9abc92fd3d55d308d15b293d8a6467f27d01c6e9ab5f7e4d0eb3d746e231e12daf1542e7d72f18271a2759a284fceb8d1ba07af45f36c45b1f4a34824911416ee6abe1971b0af8d3cfc1a2dca0c427fd0e14a51e857ce097a3e2519b129ff438768bd8673bef7873c4a5512d0c9778bfc9f54f1b21f72cf251a4f07e78605fc2e51d63a46215cc5d7d0af0c981aa32b062b20cb95cfbc1d0335d31d4f0474d8a7cd4e74011ee51e0a7be8e8b721acaf8cd9f43c5a895221ff5392a821b4af8d5afe3e24f8f129ff2e3488af2f56b6bc8509c5abfe4ba3e3de5107d192692b22da4ce6bd017772e18372da94fc543e4f08084c138cbee402d56aee4ae492aab787616c6e1dfef01cfa56692ad514a5160bac5c5dea1dd3fe521ed6f8d82b2c0d3aff812ff9b3f257dcf1b69d4a2cc5f82d6e5a971f615ef3e02ac10cef12d2e94276847cc31a9101eb2c5b560ae79906a5ca236c3151df29f6261ff2d2ecad685a14274fe99cf58333470158f0253b761fb47771260d87ebffe09edf211ffcb1bdee4c9e60971a6addf4e3f024fac6f8bc63408ca05f72a12e0234c5d697e520b73b6d2d97635d3b15ca8331c1a25cc0e5c2e118c27ccb73e152f62a4b104ada459359d7fd5baa27c1eef20c8c435c34760824343e68f4c149fc70b10c7846a7a0c6ca6003fabb43bfd9898367a6ac39205f244c4655c8d78f2e9a284927b110673538a96e8b0a4454a14a7e95fdd16d095eaaaac8b6ab3f299264742a0fd2a8870f0bfd46538d9ca78a358b6a015c9943fea1378a04369979229d881f4391d094b6e9cb79c09aec4ac77c2730e22fa8b82dff34fcee1b43b8773e14467caf7d9055a0a23e805e878afdffb286891cdf1e32ea5e497bed3cf5112198b8212e4279247ea2368ce97f5cd714c909c3c380685f767238ac8069e603ec2f32351a38a0570c814e96424b36d0b4314ea8b1bce880ccbe0f8cc8bfe22e98177bf60c44ffb02d49c7bf1e70b9c7b1c54415d133956081eec140b5fac82787c0a2b7cd2c2072068a1b1f94a7667208a656839cbd9b4449cd172ee509b96d7eb99091c0f556e144e76d24f4557538791b87d6967be3cb67092af80dde07c50546e14ec988f449be5ced7aecdbd08ba9183262f48ca3c74608f777e9261efebfe88a47432e173362d36cce8a76d23082a65b36692f2699f29f8e6cd673aac9fec79ea2b0a7904b0b26dd0cf585e65272878b678b63091e9c6022d121353482a6fb907bcdb33a8dec65395a0fec5a18f4a43c9f57941f7a0118ce8572a9fa2acb9d15fe0e0fb78523e5aa31e2d4ffb6dc9617ed28bf13b5f376d4bd236ef7bc21fbf69a31cbb1ab053d077ff56460ed1778ebc12bf5a9bcb9feafec330a65785e0ce2bc1f76a93da721c61951d74134b15b3dea213f6470fc985ca04ee42397c3b4303a98dbb9d9dc10d8dae1e3275d3eaf7ad25ee2028425f812ff469bb1ddd45895e6faa8312d993052931361473b7203d5edaa662f85892156ca692dcd50636b4ad506bfed6324d6889f506986586b1a21ad8986d53296964725286fe36e20f3bac64c8d63cc3792f1b8c37003618b79c75265f323e4a6156ff195deadcfa7add390dbdcb35dd6e7a4278711ae4a16ed3731eedc935d7b9fa2b976d1e0a8423361ab8cd1df4bd3a9cd53877d6b8a30ed99b9e840a94383565731ca8e0ad25766bc2bf41623c9aeb6d29b03fdceb1af2e22cde2c5aa1779abfa24a6fd099c02886c43d446036312790091a094d6e5bf793814b33f8d79ab529e9abbdc87c943d94da181d7dfd62603a5b3107cbdefb728f6cc4b590252a13848648aa9f6441f59f9b68b45b085cf87a88cf4fb696dbd0a10191ec366dfe4d7f1ff6b6cd4e30ec7595d8e31ca806361312de772bca523a3bbd549ac2f9c781b8b9e07a943b94988029a58144ea95c96ebc13a124dc88c29c9850b7546ef2b54e6e7321cd24a2805df5356a0197a0dfc0fe866a05273a4e2a1744470e00eda87cce49d6d0b4cf2866350a451bdd50330913123dd65ab01dae38244032623070ac8082f074d59f071a7117731c59954aeb98d7b495ef9a965f41d435c9cc3d6cd3de6f2a8da1a655c5e9dfd5b2574804faf689f5992f449d6971c5203be70ee0b86243f9d4310e58c4f7a8f9b0260145d942612298ecb3ca843c54e3ce2735eadce152e5ab7eb659b96321ed18994468f55d4e1419f90e86901929733c8f75ccf1375d2356dd1bc4c04c0b8802cacd901608d9d75c343686b3169e2658cf8b2bd6a254bdb2b48e9589138b2bc6d4823b2d3e79a14b6c0946b2ba878b2b4ec621f77184c665674bf5ab6232cdc2d6edb78a6a0866a10d8c536184e32f2c4c7529540afae4c1dcdd7d2f1d5ce0b495daf5fad81e13d100b546a16453b8645804a013b448f72d993501309bfb5ea20b1586d2754b560a45b251d1bf4ab4038d0f1fef030557cc4c14f0496c7c096e828f6d0cfa18a5801df274cffc123da137b21db72f43be538d124f8bbebc9158313cd523368f14f5caeb82f38f8106c1f9b11f0b15b530e4d4d0fd4f8954124f06b94aca2e6aa7947e7d7b40b0d83e398272250cff8d8973e93d22031f3b9355ab9226b7278c1c75a5b0f3d1c346b091feacfce36968e8fab317c10734a5388b3b19136056509c5b660c947020370fcbf73267b6b167d79aed6494b81c1ebeef92536507bb96a2ecd828740889721f6ce0ee2bd51d6c144597c9a04128ada21c3cec78b89bc7c3cc2368edf8228e4c95a2a7d7c8adbf5afb1652ecb3e518d71e59dff03ab9aa790a7ac6dab1017662ca846f44274c915d93bdf87e9601efafc685519c57b38fa993f91ecc42afe7e3812227f4b2479a52a2506b5df7dc44518d9a9682e8970521c321561f6cc122023991bc9e87121453e06216ff71730ea0d9d7f97e8b2f9be228dedef8ad7c3683306c73a95da6e6491636a4d121e6f4c593290363f843c74b757c755c7ec63898d245bb4971eabe60a9c7931cc762bf11b9117a23a4f37da42606ad5e63a1001e83c4690cb297470deb2391249f2f0fcb0faeabde1fc039b0e0548c5e123e9f1d35add64f8e7ebf5b60c233694f49d4fc6792f92aa4cf0e06bf8bd3d6f32a610b0db6df2b3c737be26134ae90b79758f9950a10448131cca970c287ac2cbc545cf926345088dbc9682ba001eab64598b5539eabe58eada09e426e433e40011e125ab8a3cba2c54f046c28237f498819d7f54cde7773d3322248e2d1da4d13ecfc648b25ae8712315db971b46e14758c2d54a80ab0df11c0b955d3e8d663f6fa007ca2817fda1751454e58a2fdb5ca3e9856886780b3f52bc26defb533b44c2b8e200f9d50e8a375978c95f6358cd5e602fd5cb9a2c48b92b5286629eb8252f479a4873c8e3f049b9d07949ae2a90b3eab8495c5b7d3d41ee1f6e5ca8750dfdad2c1b6bb82d854012c7c862c3ae85afac748ae3c664d5487f81f9713058df04195444dc5573bb5b75a619f5e94d415e3960c2f61621aa5fea699d041099cd939762d72a7b14147bb329cd83af1274281122d94119f4b7c1e26875df7539fba7ca76369ca45c9a59b1cbb7e933b5a4c70931a835bb07ae21d763459652b42711af3e736d8bbaaaece8049177ca8051317a1d412064716a3662c0c5c8a517530e35c1cf8c81e8eec6183e3f81c9474c2a477db553d013d6000ed72f74777c92dd16573c39766ea5a241d2adac3869a977bd0d0be1120ff27d8fda4d6240a9f338ca59d1c0044deeaede384450ed0040a0c9f1cc54ed00d0713989790e4ed0456e3d832e18a10d7dce1e0da1a3861749bdbd3458cc15446a2c7c3b0e09ff6fed2e749dfde93bd71d9335991258aa888f958934c010e68849cda461c6ed37062cedb925757a684017121d671dbb5377017c9f0bea69218880c1983f92646b15a1955824e1e68c395b890dba5ce6d9788afa0380a0d617bd6b92fbb27b922edf56ac880ac07a119f44f5acf5e540b830e629d706b3e762ac71ac90d4f68c4d9b842ed4587f551e3d314dbab93188b1c5164f395f8f7976568834a5924c1abd78376486f4783e7597260b77157151b7de8af822eb047941c781f0311bdee500746cc2c1974a547201cfe600f0bd35c081f8e9bb13e7a0ea2ef12beec3f697f2a27e896a82165ca85607848d4cf16c499f333cc7c1df82ca62fed482ae3a6a8c77c67dd42ac85e304a597ba1233e55b3dc3c64eaa2c458fbb723d8406a96f5430993495ad6144771f3a660c3a4a6f3c3adcd5a6ca9ebc49a660c76eb6cd03aa5524a9eac310570f238cc67556f5999b24f2fb716a6c0bb7449d40a794ab10a8ec56c441d1b6ce926565e2a2aec40dd34884f7a70922384886f05087baaac0785867d08bda4ca1d1a7d58ccd20592d7c28f6b1ea3ab8ddd2eee4ae964538beb19920bc8caee935e0af84e4608870c02ba6f6b52166f47ed7fa1b45a339dcb4f5b423178a2bc8dc253ed8974824ec6bcb610ee12b8e5f752452f31d6771531625663d541c95845e846e8de8157fddb45a8bcde9d6aad2939b6991dd876a5237818aa365fb78a692454fa80fb49c981eefb4e7fc46d49c105651c55a6a5902bc73c1fd461c3f66ffdb64b06a8d6a00bdcf7ae1337cd1f05edf0fc8e728e1a675fdcee3a208c2c00207cdf682557326a0da53e357ee6e88bf91b31259cf75fc066ccb5a414adbf93ba2192b91b122de055422f04ee7a6f990844f2dc4b0d22fbaabfe5b0c0fd66840dcd4dedf5c0e52254326335e6f29806f296de936a366084a265ab37efdbda95921c1a4ac252bb3c521b147fc9db6bab739f163f64cb480dcaaf28b31f9d7316b4f5ddd96caf50cbfb41107fad09081edc020d769e71ba54871ec088fb9da8b8f117133a4c291ce31cd98b7cd2ccf2a383952ef1eb199520216ef094a087fdef6af7fd5260e94676b0093f8572416db3336d84ac9d4cdadfde5032b1a20b74ba8410cf479abef2a27ddaa180af8b3c4e1e87fe7954d0ab919d3a0d51cca10bdae1f86b2629a052b82eb482c715c7a0c843dbca247764cbabf732c3777169bf9ce21626a20a31bfd30cd1ca2b0d9e634932e99030bf248dd5238b070bc00e40d1925be6bb528f5b49a9f8ce009dfd4537aada92e86a498d64d7367ad4e8aba915368823ac59ca6ca15ae27dc314c299095be9f46f1962a0e9300cad90546def388e0b88ec46149e1f8d4e0f5f403946efb88f4a8fec7a766867a9b3405a78f59fb04030eedf543e6f3a2591067b4c6c651cdab1c1794f55d24f26304628e5046e188cffdd401d31bcd0754d6b22c93ad4f2a34819a277d8ca0d6e949bb5074f612d0355e4ecf683eec35b6a24a6c1f749f030d22c026c588280f4a3effd872505896afae1ad9dc896614ef2b2fe8df0f23050790c06c5b2b4e8159200d908113692f5553b4cfc978cb7e3f83125bbf22b332d431202b0bce700deed00e939c27a280a5325429ed8038542e56997f5506be99f39ae27d9f24017e3326ff69f8f59737e71369329121116a8b7c45af7ffa16e7b128cce9eea0b3a80d17580ebc7a524e533a7d375967ad25b477b8b9bf7f756147cfef28c8ee8d014b4c874137a724e18731612bb50640f2596ad5490006776f4d67a84eda401808f65e5acd549f6c65c230cd4073754d34ac8aef722b2230d6bef31e99c35fe5e4d59a4a5b408e5bbdefa2a7559e4718508a6c07982169dad8eaca07b5cbbfa8d6a04a15b25cee49f75f93ac0631cdd9fff8aad5386b3b20d9fea453bd8e31ea3ec1892f28bd29d9718b60fd1fd1a649cdfb2d61125fcb800ac44acc87720c2cf65d9bdea4495e4900b8dc2e56c4ff0c30cc3b375b747c6d894ab19c459245b06e2d49526a120f1d95c9f454a143a3d485142208e7e4f0e7431b135277c9d6b9f3ed8309ec9c544dd7503a90c39c64e9d90fd8289b5fdefdb321c6e1d114c9c451a87dc223c37882a9592fc4042c961afe8937d18a18a0d9b5f1568b1d43cfc47c927200ccef07227f3d67db5ed0321567df70739c9e16acabadc0ce8a6d989875475bed6b13545e2291d3a7b9633b29b6b93a0683bb17dd76522ba11606ed12913e339ba02ef769809dcb9005584e25e4a69b9cb70fc9904f15e93b804cc7f3b8142d183836dfc78d1ec4c81182c893ba5ef6184f6d46fa3e5d83a0f25fc274a96cbac37d93627f9527eb397d624f59cc032021678e457567a1ba5a1d83a7f6a9dcadc98170ac182bd986610e7a68f040d82c219980e74f0409bc91e4621f173301ba577b305bb4a2799fe0f9064b0a2e4d1346438f61baf21ba188bd2cf75feeeb8b267c7399c6c6d5597ded3d1f2d1347c8c402bd3e1bc2966b6d714afec798cfa5ab9b586bf61230a937e45b04d7282cfe1884b9bf35643c6479beb9210487ba407fd519dc158b91970b201d6cdd97032a0c0796f017d0f7e2402e8bb06a5ef4cc7c0772d1a9830db51c6dd146911b1fe3d5f5ca77f41dc47d712e1278b81753c4fd4104b0294fd8d2124bf9ff9025eb5af357d6afee8ad6212667bfb0877208fb9b364798e1cca417f1f08407f24a9026ba23c0376bde4983314837caa006430e140d87a057cbb938e007ec13989ef56100d79d8a611e3db0f579a538a9a5469368c4cf25843c81e061732bd4e08a9a78779077a191c4bbd489612059e7b6fb12dfa5b1c0a73cfbf601b7bd152584b4255916141c4210b6f3ac3327b68747c8546cc2da79286e444f12e83440d689226dde22c67be897333179d7e97d863550651935258a68d5ea01647f4b2b3317eefb2bea8ab6a9e40ff39f3cc388255806ad9345b4bc1e06951b94f9508e9a9b47271636a52704ba4c934cf7808f76a36a0186092865da37a8f333efc927c2dbf10a1d9419ee129db8646c714318aff81b73fb1cf707610cd07f84417b802fc51ae6844c98f5be482d11e2fda0e4c3f4c4ff131e388795fd77a731e314799438b27da7ae9f91d5de9c86f7e1a12467b83d9014138c63c2ee8612952e60ed4e91f5afe216a1b169f76c367680d07ba0deb49eb094731b3c118fd790768d1672e58f6958fbd227f8ee5fec79d34d22ff02f7147511d377b52b9ee753a50647c82aa244c0441ea9429c6977c62b1ca5e71002a486a68b3d438eb5ff4a697794c3474e0e0005bd4e457ca5ead718203e7c11588e62165cc7262897fbe75ee235597d18771fb64e3986d00218448a33137074062bac336263449679282e5b9296fe07b1745b1d78f2e9928eeee8b0fb334ee055a3c3f4b2c4b459c6f7057f5a2687857e1626dbed395039fbeae72240a08ebd10d50802daa1e3c2e443af46d54e8ec9fa23832dc409fef68738d5e12cad37722bd95242801253071bf658f0d037f626c414597b17f8efc8eaefd219438f6ae4aab8468cc927c0dabcb6c5e1c36d821574bbc6d08d5ed12df451bb52ac92c5c1c4c350e96c9b74d23fa3b635a24075ca93354eacf242d0cb98becbf45c97cac667512b1929959dbefaf108d40bb6be129e6ec93a37efa9a817afd66eb66e12121dcb382f219307378a1c112b1db5828eac91a3337a09303de23b1a1385ca57a068081914605c013b85a3b9bc05ae47500ede31362ec0bc57e03d69342b5bfb00ba98bcbc8d86e0d0dccf40525e5422e95c94c5f885e5694a8e634df6e3135d77bedb00f43ef3c2a27b75b2e0dada4b105895f29b435b39cd2cc79c84548143fe3504d49f49c1ab43e14249ec8a355c1100d41739e02877b03f7f90de24f2229c2b581ed0ad9b74a796a109a1b08171b49599b0bb38e92cecc3a4b5dae95430643bf130c4966c2444d42b75c77d718d7519b58508b969892788a770040cad8b0a1218393c899866aa03662609a78f7dddec43aff5b13bb601c97a591ed9a601a0d636e3e75e8bae71e434b5a8742ef0dfb6e713d613448769c03db44add37eac89f21a42f04b98e22cf1f119bce39a20117cc12459f1e78b731c6d7c2b39c183c70cca9d5c6e9a442eda0562f5b4f41938a823ef3d21842462e6bec3938f3e4110572e1993225980238c77a2bd78c71e1b22e86930a2ee79e6b630740c790f921c8083a4a928d15fd9d92f23c9b9243ffe6d8975805a9ab143b97037954925d651eeafd3935a9d6401ae70688a7e97fb898062abe5eeba7e93bb25e859e153a581f479098b48298651b6b986583e9b17fe76d83c128fe11665587be608e0f11a72c1374c192817d3900aa88d0f97df7217737c9818239ed65051623f58b48ed02dd5d7f39bb7f8663d2abf6d8d545eeec3a33c6adbc27d8a02e46c590588565e3838092772e320075827410f0e8bf53ad07c1533fba136f731fd0c84c3fd52afb34d0df8a967fbd4e26f9e88572e9d4e39abcfc1d93211356c0b77c7f95700e00e938452b07f7d5a9147cf0ba5df2a3c1777a01e948a6934e655e012bfd4ddc5b5011b0b912bfd01ffd53a01b285b595688631fdded16b427290e501d9f7a74f7d7d8f728a4bd7039e779f4a943352bceb94003a157be2fcdf471c1c41d7da221b06e69c86f7441f757682b4107c774f0283ce378f4b5c644885f142c88d06b35046225815c461b07b8568b97916fe1dc641df65acd41f0125ea9775731554facc3a40cfbbad5347897288df7d58c3b0ad3e3d7a2666142516c2f462e9e60923842331c377b6a99904faa92b1356610d10f7b7da8c6f2a413da41682285fbedbfe4d9566054f1605811b791333f863f2add7e427fd3b39b6e110cb50992fa81e74d38ac821633d01cd28bdf50b87f014d852e39b392e74b32ec6bcf73894b00ef6f7347fb068155905a8fa778e55217a7ea138c6ee60c1548205cd849db31447dcd23aa52160ea753e72539bf0cd5cf7eff5923be9802beb0c27a90dbf5e36ef3106a5eb86107a6d2059e1bb81e533cf75c79b34af50400ad28f9195d42067099b8e70f22273b563d56e8a10b6ea0ae98b1a8f0bf6dfe5ca75f534ddd39ea416704d3b21238fe63ec5cbdc472fa150ae1ca57d630542c0430c74be12c12720821c82a54c300e81c32a48eb27a3abc2fa52277044765cf3c025abc60be465e0a4450c3c10bb4a2aad71f68f2e697e57585d3893f0df3d352c11c7b9bd9b72328865873c7a14708c466a1cec8f3a149c300f457a1ee9ae7ae98f830842ed3087c86b302967080889403073fa9803a26a292e26eb7e69686b9438ca418fe1b7cc60f03846eee7e4b7bc93f79a2f82690f7c7c0aa4d223ba7fe91ede2bc67a4b059e41b52d6940ab7d4056732a26558311531575f94e1848666280ff4855e26e566e451ce9e7e7866448aea79f7e3a4687dff5a1e03be47dfba609ddfe251df1ab3f183cfe51d07b96a535dc06edbb751cdea233be548aab7644cd37adfe12f23f879d3ca2619edcde9aa6ed291b87964a0e668a17136d1a277c787e9ae43a8c7d4362e30812f431d58919380ab36b762390162c7daaac6613ce29f06f97a089c1daf0e3bb778aebe35fe3a9bbf414b8d650760450df7d2ba6c9fbfd689fd58921d9abc6f6773b2e9aef83b6ba6d630fe05ffc23c208107fccfab591d3f1010341647396c9665a148275da3192f0a0eb13cd3b95ca0d5697f2f2063fb9a0c5cecc1dc5141f829199245862a2fceada38a72f02f64c77c1d62ca4fe6e39b06904c8628f6cb9350248ad51e25e88b49d22752f5b65fd23fc903c85a606f86ed40a604a1796aa33d628b0816bf1b1202266b8f4c55bfa44d6dc364030a494feee7d4747907532f8336b994a984e7a3e8a8456ad86bbe1425ecb304f5a4a9f944cd000048b4ebebffcf83fc3974b57fc1e3f995c72c82bcd4f85258a25a8212dcb21d30c2727caf15714ed5973f1d9b2b8aaa640484a9c3c3a184524f6d81bd7f250b8766df3b44b17ee0cf6286dde61f59437ce686f67f01a386394a5b32de8df1dbe8a37501c47f376ab9bdac511fd399019c48d00aef0cf43b8583a328d05731a05365ccc313c7117e87b7286be8017a8a6717c8405e7137aa2d6d69e3090d271e47b082a79d91994d1978c3ae5ab8c30fc72cb91ace49aade1e43b922540d76bf0c1b4165231342e53ca77cf1e13cdad70f703a758d7479074790dcb601da7eb34b7b06448b120ece89986cb0e0320b085ccee4a1c29d21025fbd690ed27a00efe3b5e8d935a731f5a83c8249422d3245899c603474e586291a25bd8bbcf66391dcc72151eb0c4308a2fe686f831c0a43baa026718a9849e572295fb2e61089c7169639dde1246133497b3daa6cb468a4174368685db1eda901b2c34943e31fb231c9a9164bd9e1dacbf67536fa862e42661bd7a87459904c062661c646489e8a18fd1097b119c8f9394679fc693ae212cb482e80783f3fd36c62fdfbf5a16e6453816e0ebc08ba76e68685fdefe4ac7621d3af338576ee159252a0de75579cca46ebc40ecc05a8912e9f8fe0193b813b8827c2dd406aee4d2832b7054543d3f88369daeeeae71f50feecaef0ff60de99ba75158006a0a4f6fa0d399b22d72e4c688d64a1f5515471b7d848bfbb7fdf21c6f218f95896988ce315fe5188cb2ae85e0175bcb2db0f788b86bcf37bac74b87ed6cd156f2954d5937e2196f50ac1d2218bf7b1a2603234a804ead775412411e0133e75af035d6c1a0ecd20e9bd00a5ad32aba313450f2f0bafec5cf2541241d904201689b36b425823d8da783b1c2bde25fd325b0458b1f24a6a4fbc5ddc0d64c003305ccf481c5fdba6c7a80abf1e54c77af2fddb79d6ee474ee81ec0e185e491a1495542ad7a021f131fce4bb61094d0b8b7cf96873dcf3c754f1c98da9cedcc3a8a6d3c36e0e4b9215dca8c327f56665fa130b89bdf60ab4041fdd5b1c186d0628d93ce211c5c217f395c2339f3c61e1efe58cb0fa7f3fe4f2971b26189d874ebc6043776c44fbf33831b83b477b1b29f2800c0b319e3c197f134d76f4e36ae1f410c91ff9817a9aaa83f0af3b154a5085c445344f6cd0d717379c4712ee634581a1bbd21f678c0b1ae34c5008aab6727fcbeb1b493f16287fb6a89eec787c313e7a92bbb428fc6e0c4f948336e33e73a24583cac3f1d8a0b699e87f6fcc34be56cbce6d611ea05b8a5872980b046ee86665193684dd8fc28be7c6b11c4f04897f26f9e8b79fd0f3e0aa3ee590ff74e97d3eb60b8d94cdea5a8045915250cc013f0fdc50127f58b01f834e9f3e8fac003dab919126a09555a63b12ae2df032323dd4431a5830bac46bd637f049a0680fdc6b93956ac33f93b600cc6827e8e5da15132d7a93734f6ffec5e70d3f61223b34bb1026957db0f8e0e2ba80e26821a5d897f5d95e0a1c0e38a3438a7582819a8bba62fb61649171251312472651592f145184c3470322eb32c53f7d3fdf898482858131e781d82745d283259376c0542c968880741c7d4f0fce648e86b09f44925d0c0e078c54e30d3066cfb5eb95ca60daea3943cb4a3233783d7703ccbb40d059fcd91724daa2410169cd7370231b3dccca3a20c705de319db616fd187a3e5d5c4885640a7aef68d356ebd1b4033fe1cfbf315dc7108c26bf83c0cd4df0271a67485dea22273efd719cba494201fe623f5bb94b9527fcf14670a9928689a1c21c023f096e17cc456f803549c45d80ab3babda843ea6494899d657e66c58bd197cd97cd8f9144fae604a59535abc4efc5e6393fb69bd152695e9fc0dcd543f1d0fc5c0667ce7a9ea568414ece7fa7c5693119dca6a36c326d8345cad4b0d80b8a4526b610ef1e1d1425c3323e60178c26278c9d10631b78bad8698a0366a36d46860a88da59d1fb010e39b61ec2e971c9c4d374c36f347954afaa8399a8f755591f8ba8d319d96fd188fa1f358bb098822d00f44d93ac72677c37d918887192dc10d35ca369f943a70906567630729d312dec8ff7b23d8ed4aef0edf6002635b138335c1bf0df37cc7b37d71b9f2462928d238ab63e6dcd8f3cc343f7a5cfa480c5c371a81595803504cac0c99ae6ba46a6fdd4ea376e123d34c2ea841e7870b19d55cdf0abdc9bbae06d51a7b746b540e316eb58ea77f670672c3bf13802d5846e8fca4b330e614a574815862d3532e59e581107abce22569c44d2aa30e7f2fbfe6b23deb7a9def828513795af40aca1f1886727e43892a60fb0072a97896b3ea699484cbb94a08200d3664a70576a745e7c34b1d18b900904c7805738fd9f01641a3a5a2e8c69a75ee9382d8e26a749c21e408eeab75c92881f82a0e18aae230bb1edd5e09f8a2c46c2f6b61a34320096669c645760a3b4329b259a7eee6868065da68ae28224d251dc290e86a944bc2bf55ac79c65e318d756f3a0538705924452dc76e81fc73975e95d0a034a966b5952a1ac2592d6f6311e8329b932f129fb5d5a8d2365bfdfbb754abfbb3a0df0f8ecc4dfd52de0db8ac4c0699ab6a93c21e46f9bf81ce7f5f18fb1243642be507e27b9716aff2c3439763511a311be693190a758efa9341b9d07ac6c2a6c12c5d173b155d088b8a3556d29237225d6aa401e5369804bf2787ad2f2e152687bc92aa39e707ecd4fe030cb63ab4961bea2642515a75d5469afe9b0aa83f4d0a26d88e2f28a8eec6fd398b3754315e5c4c3ad98760b6c106d1514da83da83d9826c7500b680a36e3c3e1e8bbdd3e14039a0a356b1d92d68b8df60c1c5008cf2bace0277bc161017381475359ed54fec4b7c528a522429e395645a0bd4f435a356973cd3ff918b71e8f0fca2327677727240a40bc66d5ff00b44738e347da074d038ac588c803543bcb55078d7769ffdc11c2963ae4a1f9d2bcaa40fde0a29d247e31af1e8e36cbfc50cd0718e4db1ab402c4623140f46d4926baa7b02ab66605a1f2399cb17b05655254d125e2d612514dd22500d61495f57c67922624f9e654a31cabd1148541bd44642e799fd4afd57f5f768581e2c7a6a61bd374a299640ddc9fc7d8896110ee81b117bf4cd532b26a1c1f926c87d1c71483ae65811418fadc341f293957abfec1a4f01b6e0e6e614979884be99f12241899af43528f7310b34031b3e85f8c5b62f81276cf6ae7f7b5c38a86fa097290403d1a7c0ef37752525a9dd0750d4464525a670ed2c8f53b0fd954d26aa21eafb9d4bc9be367142d350acdc78f99859c01adcb72a00d734e2bb403fc6ff2349ae538c823d6023ea8b7af8022ca8c11b3f45615f8f04ca712b0b5a3f4bddccbc9e33d08afb9e1bd22e0b1f123fa8edfa01bb8a322e8a27486d72a4898aefa887b0172549bdb703f55f9692ddac3608104e5d3439b2a3affcb4e2deb6763c21c30ae458463181ea3a6b592214a5c86b545384cbdd60822251be329d80e2e6b75b3147404bf061ffbcb89a41495afb9d3fc3f30fc4ecf2822f823097d5d46a01d4eb25cb452616f1de4d574ac890ac822b285e63c52c79349a45d26accf8abed4d9cb11c1d089ff265eaadbebd3fad6b81fa2d619bd734d615e524f62c51f4165b29324b151bc6638a583b88252c5e050aed5308ca74a758d8a682b69930788ad9ff942ce77193d6250870c78f45ccf8e9f8561af9f5fbee5eb26a5765fa4d6f81f0e790c08906aa897c7bec392410ed763ea16e06a7aca999606331976ed02bd02cc5d209ad498b8142461c7a42c7848f19849a7d74fee8092729b58872f43de117b9d23397ce7044715544ecb8f4c47c20899dd2f76a2694c754a278a5b712bd35e95b4dd86e143ac45a936ce2e1843f127e10a87cf4b60e8135c4f5c04dd8d5867be0e5b0cf1aaf8fb89e3b27092e69f010b0fc0f3d8780d8593f66a2cb44e4401f256187f213ee0bc4a693bae8bf1ee7a09fd89cbabc6c17837bcea13a7ef983441c485465f2a60dd144595f65db97229875c83b57838cbb13b39c5c98759c0865ca4c9e91c751f41abe0f817b84495eead0364e643e6305525fd0a938835149ce857db08c489b55baff68945fa6fef427872bccd16b445d210e43aa9171ab68f5f7ede5cf6014825beb0ff63093102340f9b09d7c1ff9963510037089843232489a3b23145cb4434cb36c4b7103b419c50e4a1347b4bb658f02f32a26b50ba6cbb0c489f9ccfb83f41714b9832f5aadf8aec06ca096a88120245506f36cec01fd6e858a203c51c56560afd0ed1b3996cc0132f968d1cf1cd7da2b3e84d911fa58fb93c49f06e0d6c69ab074c747e82112a4bd41f8de0c82a25c5f02b09416c03ba44036e3db9e82498bbb50bdb2e13d78f6d46e9f281323c2dc1a24e7ff9682a32d4c860308681b08a1dcf21f68d42240788de483bad240e5c570a66d5523b93f6896b2a4152bf0b0c9ab64d929374a568a05cb270cceb68425f4e912c4b179d8d67a0b5ebbf8a93d9ca45747a3004e75e5e7abe4d58a931d977215d2461075519f8c1f3d9dc006f7e31046887d902b8410573954807ca18b6685d6dc3c8ade060cfac98277db151681309c29c4d8da814c61b0531886b1390c49482faed31243f7c3fe58f41b5994187674597616f829865b2de3bdfc98dc1243b2ebe0c91677a00aefa3dc753e332dbdd79745a0f57d1423906259524e457611a62c8c7422bacb6191f789dd7ae18d586bb3ce382d92bf024d9af1ec9bfd2b68f40c0830e9f6ba85a6816f0ea1c0f71d908fb41cdb292677cc96390aba17c5ec465558998d252483999a9b72bc0ab20768e44f9d0e005a7a2e03a3138e585e0522024ed4d657562951e5dc840ce63cbd0af5cd49a657d1ab2a39c03046d325afc21730df622364857f8b39c45ad9ab900542c4650c360f89a58f22afc2a4f1862dc6a949d734c6ad6c2d431869f52a4487de936319a00236e9a73fc4c50a8f94b349694bc4565d5d43b09137ddd1fcf52d3010856ccb6899d55e9bc70af14e6785ab43b7403b5c814ee4925e7c7510ab482bb0b652a77d2152388239b362eb48897a9d804f77b1e75bc3b047760b0f9ae2619ea7fd1e084923c1d57cbefa745a18431ced5bcd458039203a93f1399b1b219b68fb3a422251ee91695d58e3ca4de2412f85dcd3405eead43090b032075a5f49357ea1bdf38367ca07472091b30341caccde89b53be2ad6e984de09baa752d7a2a6071b0e9d27a6ee83a01d1a199c97d52891bd5c9d01c7746745092f61354d11c77e23ab7aa951ffaa2cd7ef436013812e5a611b9e1a26a81ac3dacb099c571c3363b5a3f5fe56d912d247d521b5192b2db9f80ba9ae018d44119cc2bc28f721df864c49b23ded11a6ac1d4b7ea04a4061a43a8b624c8ac5aadb7e8a001bf102853fba36a0f7187f79d64c3cf0bbdef25b36a12066bf08ef4c9423473fd466b30ba007cabf3db712935ae73ee7f270b147f60eb4f8d7e282c2f0140a95273cfae469b35efd97b6232447f9e9b470569b348c98f2b28a904a35e86e73d09ca6b4ee3959a9ca0a0fd0135a832549a3aef58ba33f6eae4688ed929a688141c20a681eecec6d161f027cfd77a185ed4f9dd1751ae153854b73a48e7979565c6bd80886c791d15f3c3b6127863dea84ccdc3d48439b46eaffca5ebf55d32124184d1a5a3d195e373ae3b6a61cc916632621812e5dc77e421a0e6f05e2109766307d688aaeae0c6720773849be33e02bbbf2fe8f85c464df940e586e921f08336f2ff868289a88fda9143ab0afd20bac730d03d8446f353e403492e87e0eaddace99ac3a4246651f9917ca16494c4c138b78dc82d6d671e607068b4266f2db7bd33d58c7ed43e5fedfdfb37b6de531b42528a85d0277b8de6ee70c0dca52f3049280cc3cbf6696f51983657331ad8905a63ad63a4044beabb35cd5dd4c708cd0febae3f8063c35539f2104cfd614841431770301f5b06c696def9092fc2b198f902061542326f84f32fdae7c55984b7f805f13b113f2d730d7142ace0195d783bdd3aaba28a328edb3f6ac445684b86c5f5e562f887d60a966c31e854f9c8b29fe4793f1e0b055544ff080cee7b624c0bccc3b4bf275d9e16dd6267b7b6896538de296533b0416d591bc5e5a243cf830bcca03dea144dc16177bc0ba1d1035226369eb4f0e3a1f0ffcdbff472ee1e8999b9afa61958988895219d9d59537b4fd52c3528f3c0679ad1eb88bdfba5f61cf20870aa8b3e45274983064edcfd6a4016b81962271a41af75006faceafca90de0f2525f1c4e1c53c73b56fc85a248309449e0ac85162e441d7044cce8c9088988c88da123020c50e1c4791101db44c223629e87724ed5958385b4bf8b497947dd891cd64ee16404205993fffe4369cea80ba754dcaf04845dde591b1825376da05f31ca93e24486af5dc3ccce8bc735c4ba19ae4ffb4cc239e9cc61d08584f76fd2928a14a91bd6415d2c7056b9fa93080a4bdd6b1cf1274a68ef677762f74d5bd583bcef180c48666d3c95b482b946021feac92360db1e64adc623049a6e4329e1f155b09767adbfa7a375dc6c488a9986095d5030e1ebc0dc21c51010dbd1d70c4453c058208847cb65fa632a1613264753947294cfa2f5717c1260146ed0d7a20e0bb1c7b9719e633212fe7a6e65f6212ef24d1723f6a103c3faa0f5f621ef2fb581d5c0241f80e5eba50ecc6d70eb439712c681373fc84877c2a119907da5324e970c7c20cc1ecca0f268a2c18cde08400f10a1a2f309aee0ee3c0e7f52ee3ce5c7d5e1d425614a4cf18a8044f7f0449587890c28ac4747830fc1d53d4c2a96a224bda297c88754b60c7b58374d3c1f3e51dd344df8b73e5c81f7bf741f32213fbcad9e17dafbeb26648036a6d7caa66af14624e2681ffa819bf4a0f9d3e757749ce233ce9c451e77084b36f8d91fa4f90f1742ed31742cd662a5dff5ba091f90acd90c74495a610110771a3c65df40c694a98f48e94a35a4934cdd32b0ba2c7bb3b251a4af4357c69c28229a2e87acd74bab1a39dc33b369c956b3205d3a25e0fabee9e5c4c40b9b6b793da403c06b41b3a3b5955b0a0dd0a0d7a7917aedd99044c80ad0ab353f36002c73c5511e9ea3f447c40b499c0f91884f44011f24513e0402bec8057c108c701117fa23b6b80b84d012fb57d3385df336e53bc287b22534fa55085116fca5d1ab24f4e0cc6a47863104794395a9d6445f53381b025ff12aa7d1c6d4601a8f21653aea8cb6494b5682c0674d43ccff96b76567317c952d223a54e394c2d1ab516eb99be9bf531534db036ace368d5c4094594d8b012d876c2ed19dc0e920731f54c4363c640655028f68a015b287ea00f3c8f0a9e9821e4f50afdb4a72c77cf1e35e41661c1a6b2f6690afea7c29e8c34fd12fdab8ce55c71f479bc1d3eaf33a734bb3442491c8eeeeee1d16099208ca082f5dbb0b1c0b57da6e4bf5b9b4daf7245b9fbadfae3d95d249b136563776e7c6ae4ee9c017ac0a4f8e2d43e027a35bf9d993c593212704f184d693a2ed841e9a5085295bdbf55505b46f1492448108149a40e10814a06cbc35556bdf8d499a8a15678a50087d20241deec8363cde6c4e8f9f7447d5ca361c541583239d9e0e838ba72e69e3b97061a5c5c3262dd65aed7fc49b53c66a8dd1567d23e68d877668bb1be33ebd5a26f454fac343add5f2389d7670d35727d5dd0bd59a4aa5a22a1555a9a8cac8bec11fc1a6dc7b51b154453a550fd88bbed18e5f543b5085c1f811778cd3bf8d077e0c55abc53bdab3f28efef0e83bbac3a6a7439e0dea9274f568629c6aac1dbf8358ab765e34976fa59bfe82ea4e073c3d55a98a40157dc530daa95a37f4a7e38d477469617971157afb58f16db6d9d4df60ac3eb35e984a1bbdadf4d15e208dee97ba5fb8b7354a4faf7174d397935515d9f4d80d1983231d06a7fdc4bdfd82337199c575f7a958d4256d642f1933efa2bbeb427757bba0a98b456bea52d12d74f7b2e990c642b55321e5f2e3665349cf5ed246667537b7642fbcdaf31d2a9fecdfc668a0f02693ce30eb93bd7696b4418764ccfc2de9ee66ac5999b5e7335ed56f248eae361bed379beee0ae3cb4ad9d0e491b74c88b813d54fc60c4c3a43bbcf6cc3e7b5eb503559a6a47c552ed48554bb5035fa07ae5c72507f845fc6284f70767dea1902823adb53a212bc9af23b5d63a459612c4e4867c9487e42610c102eee08e199531e63e19ce058f4377e4b85de941506fda73d259374b075e76add50596056c8c617866537d577617e784016f5837847207004a4c82d7304201ec3b635f19fb460e66634c8b9cde38d322f7946c8ca594f1614c846db71c98dbf7c68ad17923ce8c750b4eb49c80e284099c4c712285932a3881c209134e84ba962bb2931638910229a574c204d2c914e9440ae9a40ad20914d20913d28990b51662123af1c1300c66d0498f131f9cb4a0d62aa3d65a2b113a60b1c9111dee16f20984d42625a0b7494e0966cb6bb54288bce1801a6badb5d69a84fc52945b5a8e6a52e4e48626474012e80380a145daab6c8d0b822fe4d60411a2861a7ee4fda365cbd7f0e36eecda31076b2ea5b794c61aa91244c86b569e0124c7625beedc7b21be72300f15bf71345e4cbcc6bd17d3bdb06dbc98c880dfbae198773e193873cc4d21e6b09a5b636bf0d530576b30a6618ed6e04cc3dcacc158c39cacc19ad53252ddb48d933538d3362ed6600c5fc493344b2a31266e383619df06497be3708d86b7edca8d4b38c317f3e4b28c69d1f6bba5cc622df68d37062d58987289b46938c3a80c76f01203c68b938b8b16175856545ab030e51269d370865d5be9944fc858800fb2680246184d4151469964431d2786700208278c38f102275a1a0652662591882647a484f0b9e0bd262aa027685282263956dc28a47c103ea2a23d44a4842849966590e8061609d62f80514e395f535e505e4d5e432fa097105e476cb52fd78b6777dcab05bbbbd88b055f394f48a9b55eec89274cb00ccb9e2842e3418633dcc4c88ea7aeee3e110318888e3cc1f304eb8995135a1800c658db9cfc382165672160ed02278ec026a460f336f164081110443600c07e4144419a78d2040a36ecd9ef16b0223321a589204c3c61420b4c4881625b6bed1124ee11221bc5f60008db732244850b72f77ea490878c182a9287880461828809269d740a090a3d8472a8c910133429a5acd602514aa9bd3ea51e6bad1d6a0db1b4212240524e59efbd46f9e50a7909234a9073cbb7906412792c80010627ac65425a81074ca41582300c3dd206490491031208b9c00933644128082351ecc0880b783083c903205eadb8e1000d43cf6d69396a0922ec16a16c0af4cec72823adb56a21c75b6badb5d65a2b949c3d79590228289f203791b39095c8974e19950052e2b5ef7e414a0ced0e459d7041c8dddc4f4e498287dddc37741e04f4a6f9b7e9db2b50772eb6cc1267ce392fb74f3a3a2a750780fd3ab8ad7df6ee5983006cfa20b61ecf17230b491ee61736d45a44c11a1bb5e566e3b2a5e9013abc247e32f1704278e34ccc7e1ad8720035c03564ac617fc7d26e2cc608790d0c1101f055ccc1c00921e57d3290be9acb690f861c38ca2d75dc6f63eefd4c4edb970b9261181120b510f2b806202dfb478b0b1b6eb8e136a7844f4a92d439c3380a4344963abee7dfc23d19886d8cbb774b1f23a078ca786d851889e2fd1ac57b317452257a8c6c258a6ca1214ae4c418ab4dc228892773ce990413a08b25e19344cfc4322c4ba2b563124566122b950c67388aee929eb4600d6bd865c26407311162f2b31f131fec6eca4b2641608cb1b631e981490a484458df10615cc26889d712434b18b1037e7fefbdf79e029e4c029e8c4e0a7e820d7596586da883b510a444151bea30890286042860099fad7200ed85d6b3bb96174bb436931e763700f9049c34c7043410a1238414ecc0881f88de1218f03004932b38014910254848d9f89ddef09e3101f3e156c122a93ad0262610f2a4edf564e237ed2763a3271331cf9361914d20b21c21193b7a343054fef055568ef53c9a8ce577e8d1602efcae1ecd6db9f579343622d9f12e5e8b1e4d75a18f4d50a04703c48e7ff179f468e463cea38171286546fab133ecda4ae7f1bd1829c6ef8e915dc2e05e7035c0ee19d1c11f3a18a585eb62112e709ddca1934d9843a874f3a806f88c803f44894590ba4c8b3adef098b05f72071f76fc2da20af1270a1223f8830e3b9e1ad1840c4f060201036255b0f6fc7b3510f3992ecce7c9ccf88c0565809f0ccd99206f1d1592739626cd71a7cd7b28d343bdbf1c2fa25eca4f665ea3f33204c921871cf0c9601b96618c6119ceb659da66281d6bd7b608c468a592e92593c6d854ba4fe6da63bccd3c433ede34eddb168163095fbca45c7a3ede72e05dd22cf2b12dc7ccaecd4c67612a1deeac5fe97797489ad321dff88057c0df909b10d7b56096a35aea4c28e3017e32ba151883fc8290e8d92fe8882102ec177484919d8d7ee8b211e45639dede90093d1afbec067a03bdb4e61fb67c96d12be09cbaa337ec18e3edf5db91e7c948288479b2d10acfa3995836c2f2afd85dfd6987bdd9dd69c73d764cdf587df58a13381df294b29ec20d47ad9c0e591e6e368f4228c4007090524a0949f002e6182125c8ee34ed8822fb3d664026d035d03d5d432d24a147332fbb8c67cb164325c850769427eac7516eb5a5cb082a3f1bbae8a37c236ab258ac56abcb56f2908adca2e8d1d0cf2160c9c7e7c9c07325c8f25db6da70d215e454a8d004134c30a18f80e21ada8e350e3f63ad0330eb23f2b376cc75264de3349296b1a69d54d29dd647e42e04426f9bb40d97347db31d6f39e7211cfa08973e421fa163654b16a8e9c0888991119e96b545ad56ac6f15b5845a38101111111111111111111111111111111111111111111111111111111111111111111111f9f068257a82ae30147405a0202b4c31addc0517c75c095e83b2b5b33409b2c292255548b2e53515172f6d2d175cb7b5dc458b8ba2d356b47521282a2ada5a5ce4975ce81b966b34d056cb4a6bb3fcdd85162c2b2c545ab460c182050b162693c9a495302a7285222b20d1b49348efee6eb55a3a8956ab55d4e281a2c307bc029772c02b9eaf04f2b2e12b3d19d3e3c9986ed2ed035e41355dd195cd73c0440209249040c24a29a59473ce3927a594d25a6bb5d6de8b44d4484499234746022da499f0f6ccbd37d248654ae74d9d5a41fd621148a4520996b4c66d385e42996de6bc25cee6edd2e9e680b74b74c8de3e5f556e7a0e2dcee2753bcda072d37ba8e81e2df47616b7b7fe462ce5d397b8acdf93d13a0979d39d76981d6fbf219f6a07e372d01c3207ec70e459b05a5b0ed9f22398385b9456e09236c2c808f260912ff9eae2cf4f8cd14a969452d639273532a274421e9e2abb2724a48dc8da880cff301d519e6aaaa36a2a718c960acc721df171a95a73aa8aa876848698b85e40aa1d20cca242d0d68cf354bf396bb594dacf798cfb316777f842ec207ce420e4417d688f8ca148e43512727ca7d292d2810680975799b3ce8a84fcab553db99b09cd58713072dd77f4880ff6e61020eee16a44c81d15ba48f20d768a6d36d4e4f5a42853b130adda49428196dc25444c3a8449553d1091eb214db20489901093a126af38739f14c599abda111a8222c4a4896ae7aa5857b5e3caaa1da33b053f192ddac3863c1b9eaea40dd2a18e585f4d0810dbcce92272475d3a08f9e69e628b6998424d77386fc33ab5bafa86a49a1ae1680f0d821a893333081cdfa45a0893a68ae89f5c5d4682d041c810de1e09fda149e20c509cc9523af0054c3fc168539f38d3d1255b5ebea027146d797a8422d9f2704be9c017f4bc4ead3676d236bb0ed8dfab6f44b5a474e00b4ab459a9a63db5fab66d54525a49af14569803f5a44fad524474522c2a3508a10629a5146a9a464b3e32c69eb4bda3406c6baff2da969e6e4b754a27ce40db522b271f37981764fa2e73e578d9f3e7d1c8db9782281705faae14b4ed25a550bbe45ef6db6cb4d3d7a3a9b7df389822f28bc296bf971c96bdcbaee9726dfb4b5b1b5e3bdc3f8fe6dbfe869c3f4fc61e72578b285bfab1456cfbebdab647e585a35684492291a48dac2795421368b6a77452ab149114eba588a456299d142ba5935aa5745e5c41281da57482e41049b14a472b56694a4a2749e9288ad211cf7ed92e409c72eca3486177f5c7a5a545d9f49673f1f364e85d80367de65672640cc5d93b1720547a9e0c3dcad9f4302bc8f45de96853179e6e65b5e933ae53016285e5a2085a9462a5745e5c5ac44eb0d4e2cca996f2b945da1c42082175812182464a298410c21b3183e921cb77f4674bfa739d9052ca390f79f4b4fc90adad393286dee25b6d552cd58eaaa562a976e454b1543baa966a474a154bde68d3638d24dfd45328aced62bf202a48d9386a3543a9b9284b893356c397519c39ca4fe2cc3c6db2e55744d1eb2879529f4dfff0e9c756284f45f93547dac02e1943dfd59c52cdd9599f5ad875ef4bd845c2ae0dbb2eedf0d0a6c7dc4ad10fcd2e75f792bdecf5f4634f3f9b9e8a363d8c0a32fd8a14363dd6e5d73ef1b0a5aaa5dad13722dd408b91c658b718552c5591a832b2dd7bbfc518b7bb65556a91ba5caa1dd54ed501b6514a6f3afb6929a5df6c9558f64cdbb6edbe4bba37cbe0f611ecbb695a46af695a49cb6ca5bf576ef85ed36e268f33ecea6efb30b58c31c62fc398da7b0c53ac146bc339e3a75612db638c4bf8259b33cea52ec59ab4f42b6db478497734e3d25bb0c8b0cf4a73f5d9587734dc4dc3299d944e4a87b248d146a1c2931d80fd82a8e043859e0d77d82f680a454ac7e6b66d1bedb2d78f20db360aef21d7a9ea96ddbbc0109161746bdff2ed9c73aa8cdc904cb7767bb6cfdb7fc46de271abb763a5e374b4b47ddad393364cabdcaa76e00b2a1105b51cb018adaa15adadd6aa8c44fb1eadb5d6aa8cc41855aca8eac1be68adc5af31c31966553b2a9a15a4b092b25e7252f891426b0a417601f60b92829094f29bfcb6c96f72abf7927b7ba35b0e9c7d67c6b1617b8a88a47ffb6ddbe352ab1411396ffdb66d45e47ab7bbc0106183d939edb3bd497796a4b16f9a86adcdf48fb931ada25d2171b6de7bb2cbef549e5e55e49d6ecbddf8b0e159550b53b5acb5d2b56ba66990180d52b5a3da51ed440c4e2c44614a1498c4d77a652d3ab269ec17545474b40db05f5051927def93775e49eba52956f67a71dcc7c274f9637fd274cf827b32e6ea6db54ba56bcaf5928321225bfd63ee7a798cc31abbc96ef743d24bfb6a2bd51dfc949a458a95c80a4cfdc0a758f558d3eec2590e7574d176db6c48f7edfb974aa5b20dc72d5d85cbb75ce99823c54b132c19619c610a3f45e466fb0836bcf31eb35825a50355f816aa6c5f49b1b69d7a3bee7e4c08e1762cadc5b1e196ec6faa87dd954810a6562922a9229747972ac597aebb146b977e31c4fac676f8f3f7de7b4918474de5506f3160549fb6c7976eedad7d6a1567e2ef5344a0cafe5a6bbb7729d68e27e5cd66e5569756a27de9f1beb412a37de9a4bbdd77251eeeb55f29c592f6b337ccda5b6b37924d11d9f6f8250ee64b8ee5937381945a653b0cd975e8c522331d6e362fdb070f3bec5ab4ab890577c2fe36de4cef7ec00d9ea43b88a396d2812aabb1af3a7c336c3ae4b26f267dc25ebaed4a3cecda6545f7f6254ea3ab0d03f21a7d3b527ab390ad56b5eefc54ed4c1ff28a2b763c851b876a270ae16053a9aaf5decb93897fb4e7c9c46b25b97b79bd3c9a175b8ab4ad976478aa63dd4fc0a44d089b97ec18e3124749184698d564510eb97765423fc8ddcb48f6ca98642fc8a976322084322671464a1bd8e3b31ea0ac88ec073ba278ec4c3dfdbc3a47dd3ee8eac518a31d6fb94c0a57773d9a921945d492cc28de23d4bcda0e584e98ad228ace9e2359cfa6cf5ad969a6bb8c087d35105e9a93655996ad322271a67e3bc530faa2a73971463b3d0d1267ec293e3d251267b05358f3a48df9ec32fb96d52c8b1a87374ec86b84c0c718e27a4b3d28e922e4f9e783e42709d0122126434d5e4f8aa01849399aa2da61b5728c90e7634dac8f3e48e29238830931196a1267306df324ce14512871463ea674a0e5eea1ce625c606473fb05412127b5d22916b44f46fe5e97a0dc597ac456fb68de8bc5a99a9675d96d46035dfd86a4f3274281ea23d4a0adf97a34df2a2d90a531c9dd291376fcd5605c10690a523aa9556aa552495961a148a552a9542a551578b03054375a2b94f1f347e868a094d249e7df8e556ac8a98a6cf8a962c10963bc73d217e13f6380852329ad528a486a15e1869f31c58aa2872874088a32e564b4e531f4c1639e6260b63e6a2ab2c9e747561aa718988d10420c9b1b8e18d65a5be73c9d300e6c0cdb38298e4411c4c658f6eccc361c51eb2be48ebeee865cf70d357d19d59c3833299429b4884aa14791c77dd7838a2c6362958f9c0c1c55df0a196b517a241192170211254d3e37648c977340444953bcf1ea06c41f9d851cdf994c3e32464fc933a24c3e404371261e6e53122671a622f9312d31557b23c6c8bf8733ed6d36d9314de333ded157c67a342fdf0e43a1c0fbc21d46b3e40bcb6170517ed1170ba441e333667c86b661c65f26cb0f1072a9632952f9a955c40285c588454a5e912e49bf21df004963c6230ceee59ae527ce74ef8725499ca94be20c002ef10e2b458f06c66591c927cebc5cde8424cefcf2a69f38c35dde9424cee8cbd50ebbc345f733687cc67bd0f88c19a771750fd4699c86b681c6512fbf1c07e3b5dad2e4c352640160658c180d70d147999ee5e7d1c4cbb300491b345a58eec205177761468dc175383bc6b1d564c4b8105618f173c36840bd31833b451adc29ead30c334ee33d669cc6679cc6b1bf60d8b1c360e7b817519ac3301adc0cae567d23a2a43c0c2e633d19b95d73140a478be89388927fe1e82ba2e46156f464e4697099918c919fc13d19f3e2d866f25142eee8cbe59dc967bbfc491b269f3f79eaf23efd491ba793c9475e69c26434f9c4e05e44c5380caec3d9308e371c30e69cd3e65d5fe04b8c18af5cc7811da3c561702c6eb90eb5b1671b8e16d85f701d6d9db8eea5711d1dd2e202cb0a4b114b110b13d7e53944c9e4c392a4cb1acd268eaba7fc0d07441baf469e8cf68319c1c481893043a0426f7ed35e7a0edb492210225e04da4bb7db493db693f48dd881c8692bb216b91751f7de67d8df16533a1cd8f43764bd52680afc64743384f63c9eef25438c997f67f14d7758e635deb1fcb058b0c6651e638c34320f999579c8463006f598f7403d46e628548da32a07f3cb712c1ad24295772b45ae9517445eac5e047991135133566f932188cc6b1ceb2a725757b77e02a80be0138879004420448f1a0fc04520a34ff20238ea0278aca14f529faa9e410047bd8700f4933111f51ec7186a18975eb94ee37412727d874d383b56ee97eb38508a7a460f10b2cb518f79c7f2e3c25d8c5acef2c39284058865c94a918b4f172b4532f488bfa6186122f7a81f653c461c7146cf8c20e2cc9d7124ce00e02bac3d7f32fdc5399e38c37d5e1f46c6e74a11abae50c7a9893147bd47cc51a8c768dd23008f798cb621e601d03835917be5604c79a5684f969f192e6923e630607472c788c1f15caec30100572f65ad5c29e2ec58ea11515386889a2cefb2d1799eccb497c19da644d43c0c773ae24e1c77328aa819f58f9ecc8ce1b81c1933ab15b9c57ff46872a48d18d42b2b9f040f357f2319336bcef60eb3ae8cd9b65712bc19a39ced737bce7eae93fb45777448e68cf6e489c17574080caea33c2fb82e6f17175c3723883ddfc275790816ae9b43ac70ddb70ad77d884eebb2285c0682887a1e56e064c4f19c8c381ed70f8da47b739671abc1e213d0a3d14c7f2f3effbdf862fcc6f2b3677cd92d3b9f82f6bc5c91eaaaae6aabf6542295558bd41e2a4f35a2697a866bcfcfe89131730340484a0d366fdfdb93d1660335f36ae063b81813857e464f7cf7f26ae578a2a6eb16a5564de56d9a8a1c73948efb2e03db0120f468b4cf18eec998d7965c0fc7a3a3c8ddc968cf9f8c725871467b3d49391d9da6bc08f262f582489c897a6a77ab2186fbaeea6b2167a42708ee08e7c321893355f788a8a955191e4dccc1ae01eeaa399e2733af8b7237399e3d5fb708a38c93548fe77b104e128cd726f06446c5911169fc90bd68ec66f1977787e254b8cc47c6c8ff5ca02cf4b2a12d51fbe5d84e75475d389b116733d6c9998ea786c10dbe9c5fe23a1c1ca5cd66fb3de5ee6d8bfc640f160f631db90e733a09395e3be4ba101c6d78d3713634e5c7fc8ceb38b033a6711d8abadedb705c6ee26c4688b31961c40f5bed6dd145b51232eca80b5e4a892575e5a83b723450d7c5f42a7b6949a2c010d1de6c808ee225797b001a0bb9cb7b2640ca0344959617325035a6ad74ce1c8c5d40c81d76edd8e1a1bcc243b8097e3d893347f8c88ef308c225ec112471461e42b821741dc13e184936c4537b5cf508dc5e3a4e0ddcf4761b4acffac918a8bbdb43db906fd2383550773f26deb8f9cbd543eba28fb2ebfaec887f768c5868c7b9d924211f3be4eec661edfe86cc38ec6a0b797607c31ec02b081c654e5414995208e5d353e4a9b51419be7cc5933c2f9f1da7e654f56906ecd97b60cf30dd037bf64c3b21cfcbbf88286d94bbb7e43220106768883372027146861e17c8c0db284ab91b5173d6b7df9e4675854f36f112bf9f7407a2d6396244284aaf1785c2c8a842616464a180028a0b85c5a0c8a0c8f02f4608add02ffdd22ffdd22fdd04dd04dd044d45a6aff1f2d2080339f2108778a8e5c45feed5c408af71af2667ce209c08f0e1d42e0ee68430a0463ee382ac608dbc1006d4cc3f4dc3413e5bbd06ff72417090cf2ee43558e7c8673ac8ea35f0424e0199231faf7138c819e47bc8c78c5bc19aec18b78235d831174408036ab2af600d3e8e9cf6b9e138cd30af9d02f2508b0007b912c0a9d1b40884e8810f2f82ec91fe0a11c20703763dac810942f6f1aed855dfd40004f13500c17c96211e6ea719e4e1af0cf30f8261822e4c11644c9a07f7124ca3f762d6fec67ecece5ed381518865bf15da9348241e98c418639dcd615f8f518e74a875137756976ad59d3dddda3b7daa9374d2a58c888aa84dd79f6cd51088a8d8c9d89d0c18e33d61afa7f39d8c1d51dba2665604bf88276ac5b39f92121cd9dd2dc16a5f25438cecefa76448908da53d2aced4c31091ab842122d7df3fda3769b42fe688313b9e76c4d7c37dd211773c900de0ecb76fc4faa8e36faaa6476daae511a0b6977ede1951f2345f7fa7dd72c463c76fb3798e7878baa77bd4b69f57a37487da6fbf1b1be027e35e2c659238638176c0fbb6dc74407a77ad87434342793e085f6111d501330861a6734471715f3d6b3dada7403e3890b73938daf6b7489e2a1132b4e9ab8985c974192f7eb6d59d6603ffe90e73418410f21a2170de76c8d752697b1ba682d9b86f48ad45c60012e0801e17a0e10341583df4c43d57e2a6f968d865d1e8e3bdedea23b6ed804a8414ed2d061d374714d45474541da7843fa455694b25392cd94f490e4876575292032b6ef436ec0e4321e408fdecf793c0b5e721094af33440ee86e33435c7d93f6e07dcf04d6c8b417738a7f9fe70e29e105228eb1643fd7b0dfa635a7b79bbc50063e870b6ad11510f6e5a63c2f9dee511c53eec9d7cef519ae9fb9e8cacdce5a6121c886ca9e486293b4654fd89a270f6ec9ea4017ed1bec20091e5df0d8511227773cffb79fa68b0cfdf9bfaec58cd740779d8d778ab7d8587597035d9f2720992fdf6bd941d633f252b26fb07dcda3b6b31ca9d20b47062f8daadd5b20d87b5277bb9937db59abd586212c8dc31dc5b7d821afedec04efe744f57ef40516badbcbd0522fb286d085fa9c035e24c275f23886d6fb7d0c37efb6d81c8ce4e5fa74a4445a87386c770c26fa50d64eefb1f73d317b7a505efb99d42520d4f66d3381f7077367b4675861dbbdaebb2fa99cd799a7f7fa779fb3a8fdad8b3895dd43ccdc3899a356e5b5a58b21fae81e7e7a7eee44ff053ef406d786be1afbce9e069076ac343ed036eaa6fe0a3ae217540b2f57e415a686d5cb27910c8dc3e4a7bfa80d8210e6be1bb7baa87b7a7dca99ea2f63d566bc4197a9a870fb5517b4a5dc309b8468d887a415a586d9afd82a62cd94a5649b6693f252bd7c6517b8fa606f8f764e4e549ca4bfd1ea635e2a0a7303e19ee13fd3bd1a3f67c3d51bd03b5a746edb96b3c9977d78bf73636c2db3c5db3432d310ffaa781bc77b50efb79ab6fea8d8c500b582947fdb16dd107dcf7b461ef1be703c680c98dc7bcd540a0d43bea6d6a4424b09c8264e3df1c3fe086734bbd03858a2898e38465b7efbd6b5703f9d352e780afef8465dc09d33b50fb6ad4aeba4644c11f70e7888478192f23b61fe4b123ca47203b284dedd1c43877805f9cb9918f340b59f051da3ce625f7fe228a0302712884ae275b7e0ac164cb4f2b92d4dbe392a4bfb1d7917707e2b1c5a58efe07d4271df2f858dfe0c7731dd6318f1f8f31f551da1d784fa6c3a73ce2f127100804dec7cd06637f1b8f7aab81401ef44f77f251dfccff805bdfc4ff809bea99c307dc3ee08e3a83d306f3f6c8fcb5c2887cf2c9271feaed40ed7d5d6074907d40793c2fcfcd5738ebc663fe9e6e3aea2fa697f092db311fe34c849b8e980df54dfd7de4baa9a3fe028940e0a63754df1f704f49a76045914d3f7dc019af6931bec3f82077f4f0dddcbaab4181140103031818c0c0a00370c3f8e00384103e8803c68718a38d3e18194959250e181f269d3e50181f6485f121c3db44181f6cc47153b0e5780f85d26678354172e8c981f2b0e2c53135bacdf086bc18edb846f8a6dc6c48df5e904bd75cde6f4429a57c892b69da56b7e54aa41bf142920d5d3d1adabd5cfdb0a687b4d3cc058688a90d6dfba4bd7d06ed2f75d5dbadd1d6a3b11bbebb5cd7b29f4cf69242e5e5e29a73a5b5d29a9a32711d7f45861bbfa34cfcf4acb4545c9994ed9156e102e836a10ab84231bcd2caa4d0253d3d3d3d3dd7b4a3fd7469955714728e565a2f5b6a159793dcadb4b0104f750124f526257675a757783a979556ce596945b1d21272715d1ebd041821a70d3f6a7ac4a3e92d64b8b577dacef4881ed1237a448f5e102f1b62974bdaa043241ed28288335853200a44818032cd6a66b39bb5645a5add65a9578a9ae48e85756ac953794cfeca5b99b1d0974d754787ec995f2c9a85054f3ff8061816c0ecfcec58ffa68f85f5c11a0b532463404f26523d5d3c3343328fb48e1c69b56ec613e35d8092aca48d3af5ac9aea0cc9cb11ca73e4de1fc0b4605a30ad674f778013ce1f9eb2b87a5c43928733477aa9cd8ddbb5e7809fdd6aefb175b407eea8eb9e6a1ff00a58035324d3213af37932714e4d573e994f930cca63dd317ba2a3e48efa644fb01fe38c6cb446f08b33aa685551a40a561255e4cc29ad1598cb027d692a49f2a3b13b424e2f913bfac4e521b7b4b4b4b4d05794021f0c3a3a227214a4091552a828da43fb29f9d92a54ec800a1b50c133e5a4824545900d75f20b9a42ca7e5354210a5b25a2a66832c592a0297830450cee143a53acb64add52771ed845c010beb73d28c59114539062488a25508a24f21203fb08c6529412ea7921122f46e048f0d332820eb0d0d25aa03c8f443ac62fd1acd9bb3da503555977b0a656291d9b5568257dc26b177337ce4879755237e3e69b92b1544a47bb54169c89db78e07d2db4f035a55389a4300264b5176730ac3becda243d3e236d9ba69b8d8a155b5e48acea41d5da14e3724405a456a8044ef4863dead48c8c000000004315002030100a08c442b148940582a4891f14800b8d964e64521ac9d324c75114650c33c0104508010320023233238c1200db9e7305003b0a107ac13c1bfe47ba93678d60bfef8324fac006ad68009b395987c2dd5ee8c50581328c6df62b364a202aa0dfd2fca3b89bba652d788dd0e6267b7620bee5d832fe770d91fca3cb496904568ae0ad9ee96a8ef5f640342c132e3938bc901588ec91adb3b640ccbb9e7fb7d0aa315cca98c5032a15dc98e38351551455893d40d660a037bf5f1e377e307e0c6549994aa45228c0b340d08a2f364e89c2018a8fa1f4f77b5e2ab70fb80fb804c56a344ebd6b2b186d7c6f072f73888cd5b40b799741987b0da129bc8898338896c5486700aa1b181ed103bb1bc8861cd21388055e7a1e5a0296c9165a51303ed8a483053f350b8a3d270b410418b93133bed265da279e97444e46fcaba654b08ddfa526138f9cdf786e86bb2acabfe00663a0c036b0cf4838d37ae66cc153cf49cfc72295dae15a6448e243889c4c4357160bc52ba42082310d354362023b824c8dd8351d50736108988e8c1a0157f4e3d479508d325432936282097faa84ff9f09f5bd85e7981f770561e2c9578f8586cf51090aff7a3685e8612b463b87f8300c9e6c119aea0b074809efb4445d8893bb11ba87a60ad5c760b10c892b3627818b19a22cb094355758b7416539080e0af9b81bcaf1721e909d4edf48786c37acae74781009c19f2ba52442a79a0001ccb045c6dc77008c13eb83114b9359ce3d2065ac3e903cafe0736ce47ec71d1cc04af02568ca4d28137e6a672ddcb339dc5e11884e9145ab6b6b1474ee514be3c2007ccec84d10391f61318fab6563788ee308714d889eeb3dee500057d4478ab9b58fdf0be93829744a56af60acabf4b06ea5112cdf3b970dbf84727ac7aaf832c74fbbc375e607c9482797ead0718375f040692db9737cd23b60a2e0171c55c734b4950d0e9bd8edd5df79d6a67ac160b3d84960cf734127babe854273aba7fa2df2bdac21f4fb39cceabfa4422a2a4bc52c37358cb5641ac8fb36bbdce42fa77f66685a91a2e59ddbf10f504e72a7dfd1bceb67ce3e95f8bfc17c2b8aeb692b9bea06defea225a5fb1559b2672f732559f74aaa7c26735016c6df9d1a509815c5dd28a27b62be82a5a933a5d627de62bf522ca2a748e8e393d053e1700ad5e43a2511b0f346aedf7c838b20fb14c9ccb53a6b3d29dbecaebebb702c3be65aa4dfaf220c035290547eb83512d41d2ddd129421da3e6c12823051e88851eb9cb283070f92c5faa36e78f0045597e770f4e9b2632187cd99c651f8f6af335cb4b4cb2c197507249cc6d3c6cea4a3f17221d72a53538e6c6c7c954da9286a413abe66fd95f665b5c69e69345388c5873bac01e666c2ff2754f0f97674013da91c9eee4609200d3b4ba6594ba8d8767ba0e2238d43f2b42a5144a18ffff765c21b5320a8337cb3e88a8f01fe2316c1f882c81980b0bbb330c819b765ad5b964f3d3d0dedde144b9136a7968f252ffb877d062758f46cf478529dcb444251cf4adef55cff26d901c1022dd9efcc91b20f47d0980ae0bb7201a16ff6436b198c2925fb1ac36cb9bfa60f0e41e70bee87273ed4fd56c4238ea0c24686478683bdfa0396b0a1d54221c5bf488c56f5fce88de8eceb44c78cfcf08067a9aba7340bfc20f513777371320314bf8f2303eac3041ea9f21e269790eba96365fc3e329640e1b9adff52c6bd0276b89b841c34fbbcae5f363fc038ef7312c0014b69126015b99bfb6020ba0f2668e9b8865a4a010c701a0205de9fcd1a68f07dba6d93e44603452d234d8f6288db9dd5193841048e5b5e8d176fb1f4a9ac47a570322bc4d714a655c9d719a2b0509c6fa593a67cf07dbc7e19be7068bd0df5d1bbcfe1e9d8f4576c2ac762d4561931e4b785fd5d10af4732a6ff945ed37e9848fcb8d5a5a6eea2081e0698a7f74bfe247154f05b946b922f15e8045b55ef8f88cdd59ecd10e35e6915ceab84298bb632670022fb70e581adf304cb425853e6c02ed46122417883bb73e73a480b59a60273610b9d3adcf67349caeb0693646252548e9a9fdea17f27f54ed0407cfb7bf7cc8cfdcdfa4f8719640dc30b1102e313da6cf4705de60994422ea5003ea8f60fdff20832a12bd10b8f093a4eec839ab5498518cf47c61f6e407d89e28fad9a40231b44fc8abba1607b4fc971b91af946c9c7c11a9ad8cdcfae517c874856cc2a9bbb32aa0257925a0167a0c9e7f18b91520707c9cc98e15278806d4a1fe63cc79a491dc47d64fa5424af6d11ab52ab8d17ddf6dea4bb80dcd1e1e4565982f1baa827626586120b60c737d8dd5215b344e63f6d14ad9753040dc39374a5045d4e4c0eca4d4d76f91b4e58009c88a7d06b09edbd6e9d5f0fd789352fe10794ec1629dc9c044fdc27a9f6639c26a1cb3499114a31dcdab05351350b1238572db0b3c046742c20b681eb6f162848630885d7483b01f852e818e588f53fa45b32c981ec02172d121ec39e0ce635b8d697c1c82e676378524a4d49a18f2f95993a165a870d2d101246a94b6d7013f6d2e4034eeff059cdf2ef4cfced2cdc445b6fad7c566e597e0a8c455713f1d3dba299f6c3b4610e233bb4300fc4db59d50560560a93e4444950c76ed2db8ca25a202f650a7aadde8128348c2ad7e816c5aa0d84b921591a87a1e6b840d4c1a37c33c5ed85f9a6b8b0c9f940426da35aeb251f53ecc597f08e827580bc036926cfc531b67ad0811e284b8b638a9a31a80848a1969933f2d04de58c1dc847f5c17cf9d9b8aab1e8738b2909b3527bed07db56c2874debf1244e0f749d8fc5a9347c2a428fa4a49f48d107f9a23e5b07ca14ba6dc16c69caffb4a88e6778de406b44f0636c0df507f8b12938c1ebe49803ce9d239c33f06153800685f26b213be4afa448195a1430beafeafc449666558b3274b78ca7a06d94fa2c97726e1b59e81bf689947f7c31b1d3d9a92f1733e67fda2786ef9fe0fa5e9180138e84fd14d118853d9b6f7b2d135a069fc396339255d25ab309a5c8e03b580efe757f70f81b74f6fa00d289c509eb9e5a9fe5388434d38ea608b09485abae4c32b8fd68feca8ecf4565b47a4057ad1cf7cbef6527ec3e6da01f05384dc8b66928119e8a30419747c85038bc10121fe57eb030cccfb05b71e072fa6bbcb597c4f6d80e14f4f00a8e8a2cdbe636f486a7bb5240e4f708e7983d29e4f6bd9b2728bd4809800ca38716d134cd76f26b2295d37a32ed89a7c410ab42e9c9321aa5c96861fe48058e82192a95c880058a04edcfeb7cefbde7e441b5e56d63a9a5a4ee2569ab182292b8346e226d0cd1c076fa4fba6cc02a5f1cafe6d770cdcfe293a76278095a89ac2d069c7935db1fa42a378bbefb1cbf8d8896f6d198d20ba9e478515efca2af86a2b3d853da5e1618080d1d01450482be157ee25f1a9e3264b29d2026e629936d813250a7ac2596b304b6c62d2eb27a87b388f57fbb1bb2416f4c1005670e4fffa3ffd3db6ef4ed8a497a2969d7a64a5a2d2923de6245788bdd20bc5f510d64872c281d867e0b095a9142d3f5bc1377af709923de74c115fa798cabce9d5e35190a57fe6441cb9e1bba9882217f028605e86b6681a97a5dd870fda028a912ea94eee689e42e4b06637a0d50a4b2d4fe4590a49c1f7661114aa863557c16322aa15a81a2b5b919666bedb47073748e3c3a4596a529ffa6bbd46258d6b37d7619eb7ca7a0970bbb8f9e260f0106559b499db55d4c4c36f790395568bcd730b837b189580bf8b9c46d37531e1546c6f16d128c7744a8dd7e15137e40dd86351532149d2a2ec3680e8c349d7f3304bf762042acc2c4e6619ed98826399a6375f9fcda30630f2a8cfa4904bc46800fadf0ae18903f192d205f01f88233977874af31ba8c8039126a89bc2faa86c595234d9d58f465595bd9f4fdade0f748c1968b25bb41bd7a58b291e5a90665bd6feaecb6d320f18eec23071707b78389887f4f4639e6f0cd8fa33f88688572d9e8896d3114bf55a8fad315c4f847f1464d1ffe417de2afd7a9151cbe56d2790a7aae5d109e036598436a33230ce7e91479b9dc3e4c99ea2d2245c38b241d22df43236198a005b11735e962ea25422b3b4bb6796a203a17d3ad16ab1ec37f743c36fdfcc2fc9e6ee206e0acd6c2c0c7412f4ea14102fcc0794acf870bdfee803a53d2695813b245370f87fa180fdad3aa46ec062ac687b8ee8d008016d27d90a8bb3e882bd81b3fa282c0e51c08ac4282bfd39d2229d59988be679e3480d26dd46d2741a74c72ea0a8eefaa1f51376eec2bb4fd562f97700bc5fab008eaac1473aa44dffcca093651d3a20ed2180be3643eb204a8514f9053616dc5318bb17e0acc3fb36965ca642e98d1beda89468b75a4f0f0e52853c4f5ae65b3c4f196c302e80112220d1ebf9b8a496417cb2db6aa3f5a991c266cc800f6abac9eecd791e373dc9b231018adf1078948def581b4055261d88d51b6fadff24a57c9c650253f7a0c90487cc4d9304b6c95960e266f8150fcef4e67807194c13f755c87e7d59b3f854f27ec0be19551d4dce250da0d580e51167e13f7b885bcee2bb92f0afd07e56273c79ae3651eb8e1249e42c8b1bd4e08c913552f9f1028649a3f14e85889973d41755e57b70f4f0938c6cbc6e971a49a8845b2f6f678bd7649459cade59247b5d7d63433e1b5a7265ca682c678ebf0cc89d70187c274a330cf420c7351bf57c8ba0116a1abf69ac6476cb2fbf1cb52246f2fd0c8259eba816f6b41c8cf79a9c03891d874390a93bb9883807beed2c3a468f136e39b4a38584e2a8f6eda251a5ed7553a52126ac737d0ce2f11eba2f146f6deeff8aceb22cca5cbf4d9c616eb66831dc08acc7984b5debfed6d988ef16e901fa8d24d243e4f9ccce6514ce144f27c383bbae8dcf8b89208f4eba3a16e9abc41c059f32b26c009351e7c7b324ab6b693465aa401d3655f5269da5cac62b1820c46695410081785b6e863329398429a19d60ce58597db7d1465a24945cebff3d064a6c701d09d4ff5fee3b3c04c031a4950f0eeb4bd90826de01afc03e9861c96f2a1c92a17c4cadd4767eb441f2ccf7644126ef22f83e2fc6635c5d72841553ebad9cab7e9e9d75ae62318d7604c9a998606345b67c680f0e7815a1e8d7e544010dde76c21ea5c123cfa1e6329f1eed10584fc4a808f6e2d0ab4f1db331387756bf03f071af1175514b7e3612ed9036f28f1affc032fc44c73b79f12c1364febe4269208264858407775e34aa3dae9731928fb7fbfccaa99113856a9d3051c4bf26e066e353254b972afe71513c06903307b481647653e90323a9cc2d702160216ea3c3b97aa93d245bbcfe4ba9cf8c980ead36c9b78b62803ec33fedc0e2619c240ec400b9898ba15794239a1b8bb85549eac0cfe48c2bfd230e0c5fd02f22d2aa3b6244e0ad3e63964826ea8e00590303deefd87457c16d3d42593923811ead551ea7a723200263c1760929d0b9457ae5ac6ec0332b4aa052d2c03027ca5919b3d1ea32582ffcbdcea01a390e9407709704a0f9bf60ca1c1d70d0212007d100a7307ca1ff594cffaa8059157f5a02b542493966f935b30e0ba09f459b3a964efae7fb3e6ef1bae1c8e7fd54eb7caf187abe8840b2023c289152c841da8048e2f58ae0a94ce32811aa9379c17fde878350dfdd98e305e39289f25b05f043d05eba47fa1570df29a0e438a18d9c6e8d47bda475a8ebdcb350b81908ba298523f23c79df768dcb7fe0b566a7f863279226ec44255825f847607995108f7499d817526d4f072845f0e59fd16e7c00bb6348d1668bfac84263ff0156831c507fec00fcd9ac4cb7b9419240dcd243859ef9fb1bf6a58af448bd0ef16aeeecb98970d9bbc47cf16689273f5162d6e557c309bc21adb4f51d5311eabf11030fca7ada6723ade7eecb3e134d8b87747a581441c319d7fbf9c2ddd94902f8f6b5b1eb0cc9cc492036e529d987b82e17ca0a519ba37a01206126d0016b256a2ac4cdb31b40bece7851e096205667f971a40c034e21a6c1e762a8f9577eb0df10217cc1042624cadb45661aa926f5e7021f0fbe97a78c304441cc47780a2534c8d87e3dc7a83aef49b7a3611a2714481488899fdab1b80861af50ed9a00f296e30fbd54807d77082600b907f157267eea39513edf4aea06ce27820d178381e0f6e0d7d5aae29ebadb5a2ad068b444dcb698d586f0aa72af99c942c0096b8d2b736879f1af88a03f69c4e23af5867ed8a41b254428201ffa1a1634f9c1c74cede91445ca9a09bfda7d840352e6f5d0bbd249a7cae22efa8d5f18e5f4e5c8c5ca8460868f12815ca6693cabb380b4334bc5e3ba9649ff2c1d318b00f6c8506b468babe9f2d9a573ae1a279668b082c2ba6d7741181d58f4b515a368fac8efe614fbf0ac8dc2bdc87d5e10cacb2f13f7ec730c82b2eadc5d59b29368711a50b205dc266d65fe30f962bbe9e3d660f5b584861571485ad33451de5f16fcb00e043c21257dfa48ac5cab175bf58d834fc8c53ba86d0a6c8778459ee4f735dabdc3d511236c5ff0473cacf117ff2d9615bcf2b8e3c877aabf67b53db9b56d9c869b2f5515e3bd91a0729486cb533459fdb125a553a69480b87fbdccf79866b27a72ddbb63e969f4a31035165edf8b5df80d16e4427cb0f61c980bdc13aef494888cf61e124994612c4427395111d6739608a79564648bfeed5f54df817d215323ec910ea2306f8094574421636051159938a405d7967a7dc2dda60cba9590574b882f0dd9176d0bd550ee1398626eb4129a4e444f9d9bb45e4443e0e314b52e1f47e51362fef4a3cc02e679bdcd1c8892b09df0a9a904d503f8855b9fa113d59999646aedf1cf915941447bef55e60e4d5bd8f9b7a0ab9449bc229851c73836ec00089ce086661de82a9b11a9690e8a1a1630504872e1d8836ee36c199d45011bb73540d15d6f688a6a25c7472a84f13647befbe0460e4fec3436fd0c71305016d7f89ac52c33b98df5e9e550262176be40a453f06939ffac9e547c0690e8ce25a4dd9e1b42925cb09d38a9332c297ae016fbe9dac10150647f4f9e19e007310868be3b914550b53ffe75e945910e52b37eadd9448478e5e8067f2320d1977a1fd6954d5fc7177c8e804ff3cc5db9164572dc65baa51d88736d7cd8ef5e44c84b3d96a1dff1ea75ee8806d7dcbbacf87d6f441ed6f8df7e410a509d51881f366e161badb27041d477ed1080a2977e41009db9faab5e3d02c03c1f5d7a75bed9b35182f6e68f158a291335cf3efc2b34e44fdabc6d780d3575b010e9c3bbd2c4d3ef0662a11b8cd9d42aa316fcde21b206c5d3522bbdfbf002fab3e9ad59be94999efaf77ea2b9a313500a0bb32ba77c7448ee7ed36d622ba5146c30e447f11f85b29e8c52006e289bb3625b089209b6f5eab53d5b6c32c2d3d6dc05daa934e8cd756931913913e64a455d6f6cb773d157c8135c6bfab290d7a1c3719162774a52a1cddffdbe898257d37b535d054dd9162c85e76255fd5d680a77687bb877dc957d55ae0a9dde0f6645ff645bd36786a77f83dd9957d51af0197da1d6e0fbb655f556bc1a77687dfcb6ec957d55ab0d49cfde39bb210dc3c4915eb85230ed47e1b0b78bc8a3934c026a3492846e0f0824fc2f854ccbcbf066e36308febb194ef33390ee3d581231c1bd0b6ae4a1d0769897303b0eb7f1eb94c82735bb464f82fbea6615b45c2bfedd941761d1fccdea5a261ec26c75959374db340acc162a9c0e8640d8c942851163bcb3e92a84073815818582ddaacdc02cf16b3b653a8b01f8097561a77521c5918d4b49fde3805fc89474c1692471fed9fc60e12e2a05ec22ad891120c34858dab08e0902541680bdd53960e004fb001b69f1ebf30f5d9cbcd449ddfa0cba2b31c09f4084b7f0c81c135b44823922fb395efe8f5c8d0e343caeb848052177bc7f115271054632d9ed40714797fe7366f9d070aab8c7d33fa676f935ba6ebe67381bd0cd8f032f4ae829e28e94b7dbee938976135191c4ecd675e3520699aa0e32f1c870b38a77e8c35c000ff6b0e287b58228706af610dc6444029763855cfa31678d91f623c720cdde83666b9c0a3310b5ccc96c5c7d5e0f3d52554a7124e84a3f6745038bc1a288a00b113162d1f162372401818696f8a9731026b52cc0b6334cb1737a832b9ab01fd8032655de11053f2aad3d8e5aef512ac14f1952140a14a7c6c78eee8be8845afa02d0591609d10387e51febf9b15c0c2f11e0f74541cbe465ed9275d81fd0b63b396615d88c40b7aa5c64f5671756a9aba5bdc49a4ede61ef598ad59f1629785387ed366f52d47225fc84e6b2876373e544acf4ff3938f6832b44ba02df8d5e94ceb91088560adb78ee5ac48f5bc21ba1953e9e4311da20414965df06ca4b81953542d5573d853d75b4a9073ce723ce4bd8d31e8b68df684bac819fcb56896b4a03f9254ffc7b9e4e582c1d80049ad3aee868f373e1c4458dfeb485fe1ceeaad4c89954636a81206f6d7ce22f68643b5aa3dbee171717d348247e5d47506ad3833099718ba79c2d6d3fe7edb07e49dcac46385200eaa54e8e2f61b646068a28b5fe82735e13d75030e9abaab07f6905f20c1b27dd138b9b29967f37ee6b0051dba09c5ce50b37d95ad009faaeef1cc319f9021c303bdc28bea4d6824bba5291c1d2075c3ba699378616996cbf01a96c558e5e592b1a6e50815d1920db9866c6a8b74db7572c620afafc72ee161318a25424a3305d2c78068a9ba90becf01c6d9d69e60c192170e0b6ae516ad1131b88f127d85b28297e347cb9c0adaee5d0bd2f46d98d33265c9f13dfa62a7b5e1849438998ec319e211004e5a0b94ff6e88d8c791418ed5b957b63ca9e8141f446fe75d953a7ce35ddcb614bcba87abf4eb3515e4488d7f31b99b0c84d32bd87742c8a2bc7991ee85ea0082698e64040219426e1bf093ae35bf24d12bd223768fe5905d510fcc3361ab122359a11608ec40adc67e1239b1ec624b6e129a3f60232a6989a120928f418d546ddf4d866775d85f9ac1b4454227a6223465bf4a70dfc0448393cd806ef017eac20abdc4b4667c8f195362d5cdc837296eb7513214be6d9acc1153c19b58965074f23977c576f7272d07ac8e08f763d3899d77d09c23cd8d0af7cdca2d7d943fbedcf984523ad8d1043c2abaf41f22f9c1e70ad6d706cf8ef25a6673cb54265e15fc9c9ece5e9ec75550bd2ef9654a83f2847af9e2cf3bc5d41a1d3cf44489fe0895ca1fe531912e1486395c4a99229ee5d5511ae39382388c6aa118580b783a316da830763d99b839bf8fe065d6e9e6bf2304698240bfa3190d399a11a53724114b47f77f99ed5606e124fbd8440908e75667baff8e6e4924790d047fa2ad0088ff963033f10b488dfde095f2bc4feebdfd65c855fa1010c9ce79197eff8ad4f7fa6c8013e348750a88207ffc6c590b80beb9d9447c192a1df023793092f420864530a835920be1a035d72ce43d2c55cbac17aafb83fe6c15486cb129491b9482688df4311d948d0d0e67b58baa1a47fa0e9e67ddf1a4fc13c87dd4eb2b2dab33491fcffc717c84e7a94bb600ed62c6d5cba72b2ba3a64944f8046e627a64f458e4c2282764d83ca602437f0612197a06b245b56384c92d296476b901abeedb12792829294b208e5c5452c4f80266677a10ab32c829669a7fe13f65db3974f7911fa31efe03719a32727f75707ea9a003ea374241f126466b47438a9f7ad7a4f17286705d603091c956a4d1f44e8ce90e21d214a6a48176874321624f7398b3c3bf4d91da83c1350bc1dd4741613839b0ee401c2419eb76f27a3003cb4dde525d6672d8162effa6c19790d4a7dfe18d7c9562f642a294ae576cf5cee279200ab362be856f68fa7c54747eb7906b3d400cbac44dd11ad9f5c185596bf71ff9a42ab5362ffeacbb4b080a1b6e0f0f154084e57c0e58b08adbc72aef8f6dae74b4873e2f10396eaab963939217fb435545f68aeb5dc6a44011659ad2abaa69bfca0e0c674dc9317e64f558cac29802a0b4d538538e3d34ffd7413debd9effda2d3b8ab0e35fffd2207bcb939869ba2f75ca71e824d5fe2ad40c7966361e7597fdc0160724e941a561a59ebab9e207a82fffc18f06ced6acae456caa8706044936cb4666ab531778d6cf0df57b8929599086b9163234391b4d851ff5dcb0e8ec55cdf81a2f06ea99e10e31ac77c69c271e6e43f1329c5a25fd82430e52a6492f4dbcd76f054b18d4fa9c81b21bc2b36e2561afa1974a44d8e86c712160314513284d8916e73495624eda06b0e1708d82f1e28df2779737c862e0844ef498d4ec6e2cf648934d821df884e318d3ca4b000b0614c8a31c37af78aefcb01fe0bf0b70a1c5874db12165d50a061d80252be30489b4e0a399bdcb4f427b28848070c086357a76fffbf13c37a61a720094415946e955fbba63488eb171a74002a63e4e88b040440a3f2db81d3ade7b5c868f1fd6708c17174e622e8f669581d004548dd470b4344f7af6fe7ace3cc9eaa0be0b687767096dcccdef8aba9e1ac31564970f854ab1ea60e411bc00662748222969f728510d01f56fb96b8864e87ef2930b37d6660e07fde3263a2721b4bb46bef729af0ae2d771ef74aae3745583dd18fcd4f4673a5ebc3fd82a5832f268473fea6643badb3556024158893b73ee80d2bcfa20eab5c8cca90230e0fe9dac4cad9d7fc3e10309a6590809584659375367a06bdb102a9a44311c7138cefaa9d7e31c1e5c234fd60b14d3b2bc9d813ae2ad33440d43379a9c894e10b9485ae365ffb9083945875f2a7175f40a23c753be76180da6a055587cd0bb6db57ac41e433c0da885bf9b881739a477ec0d2648a46195a2634d952db5dc40d963c414023b4c260d9593c64540c9c3882dc6af513068a4446458218901492ca5886d2736bf012737da846216cccf05caa8ce624e0dc3c884744a4a0e47d9312cd3b493f90737e0d3fb08579b65e9ac46afdf71f5ca3c624b6a15e1b38f2909e3739c8620f372b06a5e94285de1b0ae0385de3891a5748ea91189cf35b462514c4856295bcb516f2d1178f3d188ccd2b1bf4468f00b2c84e9d7a55788e50ad995e40629a8cef6342c2c9036839b5061e6c1cc53442834d651fc9e7d1c26f72a16487a044be4ca3085eaf63eb29489be6a3380a671e6d274f3f4a9569c9a717c69c6e1e11352f2e5d06c7e8a712faca2cda693c488f68f10af1711843ef966077dbd9eca9daaad860d34ffdc23d01b7232c8303950533257c2ea119704d3862d90cac4860a7ac3588347db13c1b083ce904b656d96ccd53e5d14ee89c93fc8e3e2f84dad94961445acef135aacf5669de2e4ad5bb5f491d1babab3e0c863904e1bf8c6e0cad5ec867b66ed0ca7eefe090602ac1d2c6657eb111bf079e7e5c39b1672bfd3b6b365d925577a6c1a4008630f0d04c82ed33c547c4e973de699615aab6b4d768e8b750bf13f0a5ded828eb0facf39deee19ce1cd59a787c2336f060c5d4b026420042d392625c472af5e7b97050a35c30d97f9df7b1587011724a4b42e68e9359cad49c700d3202214043265be8e819a28f22a4925be0542e706907d3068b370cc20611e9ba51b31c37c79e0f9c176fb3bb150f7fc947cccc278b517b713484ca49cf9b4b3d3d62df2d19579e98188cd76d46407b24dd6e4de9a64701d861ff6773917f6a5f6420c20553d5e9eb15ec77aafc9e05444ab8964d9be06a903a9ba29bfd9c2b1d5557159fbf9c90d2f60c0f4cfa825cf648f8f9dfcae79818403dce4250f8edaeb189059967103c3b1135e7a164e987f543b3e580d5253e8955e6b2d292f111eabd1edfd2daa8af512631a29d6eb050180b3e090d7cbf291f1b0dd26735cc28fb6dc1e9b2324ff818be6e9702864cb0b687a1686988fb803d13f52ce9fc9604cb0b47f57e6f0a95f1b08ced6905f8b5e150329ddee0d640b2f4e122c0e6ccae4569e1e730c0f109b4c1021c41a1462362673814c868fe9ee171cde6a165e1eed4e775e21251c809d67fbf84b983b7162cb9a31dff9c721723a1729c03d36366aa981392fd1af50e262ee06f9de9c88d5fbb3d2f6a6cb4626fb218ca739bd5a34ed26c7f80411fcb8438b7d3c7247a70c3e31e59f137b52ab98cfc144b8282ed228a5ca15c3b24c8f99e662db14e53cb3d7799aa0d8c86a20c4d38ab5bb502fd668536090586b2c62cd90470c7ca484fb5f52d0f9ec49cfc42dd1d9536a43d43246e7fbc78eb31d863a2f32fb2b4241e2f5a06764a744eb73520d14a872470fda3532401d8e6c14488df9f4efc1f54f200a454a4ee815b3f91d88bcabb85b7a3881ad5b86b4b1a4d22c030375154696451705d2b714a2fea5814242410a0dbf80fe53570f51680a62c1a49e7d9b8fa3c7965f10ae35838003621913e954d337d794a5b62aa11c7ffd2c33fd7caab51dacb8846a9add4aa969899bd376ae0ac9c59646a2636e68f733f929cba23e40dd989d2fbc6300576f290d6efbbe41133de3e93ca81909935c9856259cf62897c6186f743ce72dde3b6a812f1472ae22a002de43dea2ac7a61bd35892a48a336221d1500cf1e87fc0a95c3918c5050c9ef78e119af8b95f12da22aba616765db800e99ad2a22c6e85b08e2250efcb3f56097ecaa1438bc4fe432073423f68179e92856b950225af8f161a6cc457b0908aca8d5474261f791983830794aec7d9ed68bca7ba55ff66a199db492c57fbbd9f64cbb715456497f851ddd29013aff2c933482f459e2ebd45deb9a90d2b86807e9c9889c1d573565f0ead17b67468919c4192454507553306b0cd53244f112d4c4480da590ae80e87625eb166b0548383e6b591c041fd5f722110bb07c6ea80922ea392e400b37a53ce646596149905690d860bb771df76e3d53c06a8ba51accf468807503f34d012588a27c2b1c651e39427e18962677228450e6cacc5d61bd9d0085761f9eac08a95e33bce4c384848bcc7ddbaa4fec82568232b90cf0862bfbac55818e24c14e22ceb2c7b2d535e13cb302b12c92297749878ee625ac824a1e92db37c005ea75e1bab812b0bc95c6e75808ca24cab992e72d433009ed1d05942075e45b6838f29c78a76665f37b0c4f2f19e97dec1420b3c23f0c12ce42a8fa66ea73415c1f1cf60e345424cdd98e8526d9a0406ae3e291942845436322509c1df29e62020598e8f30dd1642f28297c5b98a8fa1a429786992b8b93adf13369b54e9b15aa86c2738f0b9020ae6632be9ef953f248fa5a0bd02293cfbd2fc7e2baffa8ddaf8e1e4053c7568f9d4aafbfe92b08a02ab2cd0938768da11e4acbf2091592dfbbf51b291c1c45fe0c3904d311d11e4f95efcf1ee1ecf5333dcce3ce99b75de9e8f071e88e74c4089630d97be03a4787dec3da684fe113ae21185f4566e688bcb0e465bddf1a82744e0bcadc225c6ad0055cedbc0afcc6155d042464eb65ed08fc2d46b8da2ed83b89a904fa3c983a8334df850b0cf8320af959965bac06d9d7c86e409aa331debaa705fa90399942e8980a5fe18e1ec7d34280e7592555d62920e60e19140235934f7c9e7f0414b2ddda8ef3a3cb279e3942bf0400804375404124744150328fc4f1e82a745b99b43bf7a07ada6b921bd3e1d6a5e0baa2168cef7b013e2c584ca70b8e5a7c05064590c12f507c8e24e42253504b1384c17fa871656218511a75d80e8dbad1c7ac5b0f2fd56f514f85d918897273af029976c5d678f0f7299d993b0e00a7c8d871b51833c893f17cf2bdac1cb8974f95c48b75ff083602f62738021d03c9e5a1962d871bcdc2804d09c2d5a2c0c40e288245122fdb2b5ae67e35832dd91329b5d4e5efaa47bca9b115b2ab16f64275993bf6b5f95d782519a2857347ab3c26f48e8bdd21fe9271ae6fe1b641cc6c90806b5ccd15dd3c30ce143e1d536bc92c15bf7a10d3948a5868ab9914f98af638c42a26914b41f84c687bbb819edd14b44cf420e5951f1aa77b62316a4a609fd42dbe55e6c4a8a1dc60b0c986f09aa552581613e6be6440b455a88f6d115502edfe7239a60e711def024403e6795471c6efe36a06ca2ead6d822bb5423b48273a580f85f62f3582281519d9cbd7df22393d4a09e9092610770b9a45ea188e0e54234589a5d44e78f803013503d054cd8e69c1c57987e97194856ca787f9bd0761387794e4618737910ccc9da06b5ab235a7165c188f62957e0e14bed3107577661ae063525763a7fe7686bf75739a2c2366318340e67986a057b5e3cb44e2c284da229fdf6c38f1db53795e1774908499d5c285d6d366a52b8b8198202a5c2b38f977064e48cc4c40aa2779c04c7242fdc0e0bd8d061527c7ae7d1970d80a0e77d0791fd0275f263dee441ba0b2814e9af3495c0c6ee86800df2625795357cfa65671955ae1e1bbcbe2a6415a3586cc93714a6e0b246edc7b4ade37442bb0f0565ea9e1940cdce0c18ff78330493d2738491c693b618fabfd26796a3f482d91ebfe27603db9de01dd36db1868ffb02a94f69a3c7e0ce468338f5105d91f20a7e0898432282dfa2ee38510af94cb38b007fe81cdcc50823f2889dcb054fd84600a2df408fbdcf255389546677632888c6e9b83b87ed055065c6ea2a5d1cfb115fe129d93468e954eb35c816c08b16bba21bc68bfb36e569c993145fff62feb5aeef809654b99cfe2b07f92d56bb1ab3d480f5dfd7169f3e6097fa7765e242b9a9eda40c191e275bfcfe2249261c23a348116eeaf4aa9f0234756eb0106df31703d2d6f9d6179ca07d8582c17ed5ee25c7f2b4810e8cdf535d6b98aab79906cf960834d2dd162c1e81df796a5e292f64c878cbe754d3d0aa333976151e7e15735b59c256f9ac546becdf8bd95b1b4053f5f3b3a1b9857ae9d100a9d43f9d1ac3e6ede2b26402b997a41ff28a52efd3b4b5ae76f29b6b33314873b8c507524e2ee84a99f952121e20f432e749686717e797afab11a38619bf6950c5759f3e895da3a6b3e99c8fb638b7e64c12f804e2308889e6842a72fddb011766c6e32f1d4cc7ca121d0cba2326dde3778447a895e0a95e932af67bd9c867b31b8e44d0727c287253b1d24b8ca186e7b427f1b8d330d16c6993fea1995c676f1b9f53463c7172fc9b53e0c2aec9b8ae2aea5a9b4142ed3407a82e746deec733e96b6f8396325bb0f462600a7b4efc19746a8f112d04b3ef2dd83b539c3377e4c2fa311c076a2c3d3435d1062d09d3e36f55dc43ff1a71a57dbf73b8fe9395e7f13edc46370d9093b9edc7f10fc63309f23b466c05277bf5ae50c5b4957e90c2cc5159942420b206d2fd330fcc610191e038ea941c31bb0b6c2a3b7bc5ec1717f9334a18d27ab264cfc26c238912c67c1538dde2a93a64c1882a586320f1fca8795c433b0b2fe39830aeac6029edbb0b1fa2598c8041065466241c84c76f8454279004e7981750bd2b96144e3237ea61f46e441cce51beb88a88a44fe94795fa9c932d9ec148b1062e06c1e6485d5fd37f8f72bc83815cbe576cc87867a21fff951e004786108866eb7471fe28c6c110b61ac219ee03e6ee406c7d605b1627f743646097c27d2f97ae82cfdb994c5427efe1903e53d74ac31e39bd822eec6681583c1155503b2705427d6a1084f9f3ff445045bcf2468700538ba7685e18c24bae286e529301dbe69f14975a6f10b818e1e0f5c55aa1507522c0c675f98d3809004a9d8f0863f2184aa1acaeacae025da4011962a75db59a2d329f39352dbfa52fdb895242cb43f5df3c83709f8b193516527010c2cb222955f1e9a878911ccdb9d13f21a168ea45f8f851ad6023815c76ac2922be1f1c905a7d16a50432991e0733de549a09c004044aac35763b19f28c6e3cd8ca7087da5f74403655778f0f6c6fbad0b2529122e58d2a03c735b8cea371aadf128c60e0f7646dd26edaa5c24a6545b0cab02b7abc2b1107676b853562550455fe224b5fe298ad30a50d8d8c17f3f07e7204b422738715f86671f1f1c7f202ade093d42f491119a19d43f8d186f202552372dc6c08a3478815f49d85721defcddcf5dfcda8edbc50d6e339cf757a8977fd773176fc02f3b8f839ddd15a5206971d1bed9676dd45364994366d3bb25411a1458a50151b9b762da0c377a2860fe24be87e58c6f082b1f5716997e8e50c94490f6da952a3dbc44953c2cf53bbfc9ef8ffdd49bc30c175913216aa8481757bb9ca07b418e7103987697790c5c99b473c5ad6b4101215333872716050b13244d11315b0e0f3d99810ef00fd902faacb4e2c8951d549e8a9fda8fc1cd0f6026db0fd42f7f31aa53bf322a51bae70824ece27ef4cdc7a2082fef340734c7dab2b32419b9fbcf8c475acea1492045ce7d961a01e3a3506a0879fceff495adee22b3730d934f290cbeeb10e12c53205cfb7851c439485d4d7f0bb88bfe0f1395a7ca079806d7e7bd81462296c01bf0ffdf33a0e0555dc7b74afe6f788d18daf7838a9e9702c0521ee2baefc73b0d556e8b1e4a7a29a503abf7bae6f2f34bbe4d9d5996ced90097d3b26d90b2a4dd45c5b14f5bf6ca4129e2a259a5223f3891c9c4e8811989f84dd32c401b8cf87bba99235259d6d9a97069cbea99b2e5294112816cd18c6dd9df2745371a6e566422a303a7607c6a1d86b792ccc266b96cf4bc367b32fbedca964d5e2efb39d01c28f103580c5068e112bd5659c16ed884a6b7d7c54ece02320c55169c452af28ea1b76245a18766ac85d4f2f60e79d948d753bc661f5ac0ec688c1366c3b062aa4699b1bd527886cf70049c5484e7a8baaaf7a1010d06652aa7ab68dc72ff7ef64957af2e01e0da48dc8e94940593cf9a71f2b8011b44578b56d3fee99531803f34a2a0dbf535a1b4630294ef72a56629759f08ca1d5ea139254053dae5fa1a30bfaa268a8143b9d304a813a8985c7467ad9c8807cd00f96aa8101e130800c2e677c72af3cfcd4b1008757eb437fa09a49ecee41018e1f498e38a37283cb8cce4ca262999a76a5a195f22b93e1e68464f294285de77350a0355699b1f48269abf9df14e740ec4bcba2d49f568f4d4309b93d28e2489906cabb3ca8e77b437c983bef87f87c86b78dcffc1958a390e9fee473788ba93c10435001f3da5f57207f929c1be644c3b5025bd823b81c985457a0e81d849db89089f6cc06a2daa10d8e7279b286c3d4f97c45f409b534b271fc3298c5bdc3b9cfbabd987d6f011e010a7a39b8bdad3cd6e1ebd01b4f4638f9ff75233d2e56755d2193effb81fb7451ac49841d3ea3e8e1d1a82482b846e74078ed60670e286101a6538e48eb34d9bc1af99c7d3c01e2af2932e94aba33eb51de1c0c41d3b123729848ef534b15151daf575d570df883657d4c4a40db1090229d48685f97534a5b021ff795526c1732dd93a75b942bbe739f159729c27e1466a4626e6bce9f1edd6d8f60469009b37e543b4896dc8ce674e76767be8700de6f81f771e91a1e5ac60f6a54f78a55167d8fdfa178f5b510d3e411f55ba3685835b210edde40dc7a10eb6cf4d724065762c8f326212da7a339e0dc1c9ca43bc14006e4e9b5d979e23cf1ca9d78d31b49dca11eaf9ee7ec44bd465a2edb3360f0b1a2c995fc0444fe8ff196a6288fd2a8aa7807bf78a3953701ab3603b75073cac1224fd8d24a132c96504da294443ecafa8c8a72e3c37eaa5573aa83e971a1f481c7583473af3d381470edcb3f3ffe5aa4e27ffb131825031c61bb1cc5c9a696aed0bedc461625b6c41d786d02eb589fb66579923b0dc48af7b8fc8f7bacd6666959eccd36aa11dfdcb51add02fb0f47ebfd82360d02075f217dac7c0b02667b187cadfab69c2666f316a3c54049a49498480ea76afe0ca6719520b2e84fbdfbcdff6558b59040474220418879793694030a193037002d835d26d9513e012ceab3203d48b1349a8f9ab2071f9434f2c7bc242499566d6141fe9da7964f8172f921d3f1f05501c578572d6c394e2f5838e3b88964b2940fd3b49d13983f97b153205021bd0f6b3c3244a51e7e9e2aae98f2284004c5100cd3fc66948a96e8a2074e757b33004b603a02938f11417cd0a4225066b86f53f233230c4618450781044ee8baf2ac86814a0b5322ac4dff5cffe06529391a05818e1f1c9192f809821460dbd620a62214cc357ecba108d938235e2020a7bc40e6394d99490f271ab7496ae049eaf86cf0fbf1a5f7c6ac8c83ac38496c563ffcd5aa7afc9b7a935fb4290f315fdb2080d99fd157566ffc56ad85243598cc93e5bc0cd441ee56421c91b1c13ca2d39cd4ee2e9892e0f2204e98ae380b1c94f1c560b2b18e736ec29989db86f46a45c021e046341e9d5fbfeb6a86624ffce396fed159c79c10a4c38f881d9930b99919520158260cecc77b9369e38a7100162042dce3ace8484d2f493ed508c4c3a93e6da02e03dc6f0f35bcfe0ca3a4b5c76c5ee93f1bc4134c430037f2d3c267dd9261f96dd6db1ef67d1a7b106aa5268069dc34789b78eed724c22224e8b9ea32423ecd0ad581f18602dab299d85c9493eea60d3820dafe0ef25b4d7aee54891280ab8c29a58b32b7d1ac5808ad6cdec57400ef68cf8b83093710a0e6bc686edc4cc7e61edcfe2584f0f8b4c716f66bf49db0ea718216072f10edf7ab66808cb8e99ce5a02de1ef19f90973f08fb447f6e31b8489a82ed89ed9f9c4be803e9d1e93f4e2794e07202213f237acef1323a274e7871f20c6f97dce1c84bb057002b9e182ce1e963f7e22ea88c0dc4bb05d10edadfa024ce15c3cf4b42020a0224b71b5f1c2319fa1e15ce256edc976c05c306581287e89dcd2e81b667004cbb547f9784390386049ef40ccb0fa3e063cc708ca4ad45ea17c3706841904436809c9dda3f174a6ef07d7ba39bfa76ccae9830109b89e852e70e34513720c3164717862f737924356949054ea617b6429f8db54014c0e1b63cfb7693b71f4f6421c84591abeb16ec35d192c2e4c245400e16f9b5687c7e6045081489da1d7f3207a55b7609afcbb024ffb943e02e389c3011a338e377145cdf6e01aee8c1217597f457f5398d0da196728364b256c421bfcd6f406955a12bc06d066aefc095df3fe8c6a659903b9628cffea40d5175327d0f06c7d8fa635e3930183c0bbd3a40ba172104f223d66bcd018656d31eb5051d59a7870fea514a97074f369874b6a28b7a457c0f9bb0aa9f6021ba621ae5e34726d9b77cfc98824e088cefffe53b33537791a69b2a9c1fdde8efea6dbfddb68eaf9b712eb9a31b73dbfedfced21eed293d84e675d814d7dca1bc40fb10e195c3abe25f82f6c335aed1068f3beb58c6943f2d432cf22b4507677e090f6e6be4057bef09ce76bcc2f0a95ad3f7e3ce21d845da5ef986fb4ca4be925100fedaab4aed7ff841ad7e1d828a9f782faeb4223652a05fed61506b95dd347cf1724058cc16024560ebff17dce3c8f9e18ae44b1c181cf2c6d172bc47778c1fdf1272a8281d7e99a8ad69998c2b6715326b93bc9b7bf1e43969463ded7b43aace019228678443f3535a80428c5f26f9606d5f9046565e12be8a602751f042fd52d20281e64e50216c355ef7cdae0d9c14564216009f83e2fa022e8ca918ba30543faf78554410b7d4ef3fe221d7f3cbe2c5d33c241e735440b718d5f646e41a229c1bade073192da9063a77f5a94902b9a238e0f492e48493578e9d3e1a3b378e0970a5f28e48565783f1f13566c7cbecc1ac778f082619111d8158bc8ae0988e576420d520941377b1d3cb21c6f382987d163a8eb859412f3536c806392cf5aab478f74372877966933525de7ba9199f4903d0f0a7090b49bddcc7344d8bbcbce921a49b54211b18efb9e5366ffac4d9fee1da11c526ad52d95afd39f296f29116c465ba8ed465e405336f555b31ac33413ee008a73c9aed84a08ccdb57e35354163aaa2280e28a0bcfe9afbbfd93ad0383443387451592be0a264e505bc17fec3d7309ce2e263cc4fd55534469e1d64c76d0718fe365e17c6624a4f77daf0944d8295673812bc08f0915817c250fc8de87ca4acbdbc10223b815aefa8a02c9262b97baee0558f386b2d0c3b20c806f9a1d8d930cf6c5953a46fab283983e8caae059f0a27080fbcb3f128370422d0139e84c0d1bd24337924b02c17cb1f97c617f3d1deaa202369f37d547fe0af8fa3e38cf4775f1dd193051f2c84b9a532617a5225562dc7b85121f8163637be6f23162e6ac4f11f1607fc67b3c39b6769f969e08675ce85f04a2c9b4f0f0f6fe5711158e8c2b660a6eb67a2b7664f2a185876a9aef0294205ea146ecc09d130ce6dd97350876e5082b9e35f218018cb90ebe96e6f6018899d1eef4907ddbd252f4e3acc3113acf6217964bde81d6b2d2ff36d796c63d30082385b0f8a8e818710c6855b7f208771f11166fd2cfe237fb21f3f2e5f46c5ef30cd700238793c0dc9702de45d8e25de94361879115dd49162c49cad22d75f8721df500c44b5e8cea9750f7feda1079b4d701112d4323d3661467b9444e21a38d35a0d9fe6e41522dd3338c9d1caaf106998dab225bced60e071b254aa5216352b6f979f132d34be7f05bff9f541cc8448907b680cf1b80e0c06aa5c37844ee5019b8f44ada564a852ea8a4defb26438e99f522c044fa07428e3f5a5175a437e467e4e2a9818f2839393235be5e51e122dae40983da4564be7e93287abd055fd7da7df520740ed3cd3b6659a85a89d8e37898f99a54605cf877c4f4acddaf79e278407ec5ddf3b00cb23a25595f0ce818b1a0323ffde0529badeecbe96ce8ba22c5c93cbbad58cef7afa44833966c39a3abdad41bc875a9fc49d655aa861b1a448f272cb6247a688a9adaeebf6260d5e5eff598ed3513757f3d76526759d0db7329242f3651e58a0cfabeea6119c62301a73c89ee74bcc513871c5bd41ef299e73c068370d39cbed709e2649a4f18b2adb37135fe061c8e62507653c1289db93a19928525dcbdc33ac1fba600ab47a2e64e80aa9e4b14227adab9e18a6d0461b5c61df27b71c150aa537e6f376763b308c1848e68b2f20e1503ed73130968950326957a87fdeb973850d6740d09758fd1bc101711818f03ae5c0b2d2ef41045387882890855c961166a4ccaf0da1479fbe1b717e07f957c68cc280286c8de4b15afabaa7b1513cd2af004d00c5a63e9803f937279f58cf43888b568c5d8142f87fd62dba63de7626ecdebf7150f1ef383291dd5530ef36cbb1d1cbec3d81a2e343e85967fe37230a14f591499628d8f8986b9dfd6c191f869e99db9b8f427f46a17db38e49f73315e928c1a728dfae0c8e15771299fde7337c94f085779074289f6a86ff0573a9296c995ea393f627bf3ccafda1b0efd620fb220984098bd6534d9203d8b7746641fb9900f32e2c687c08022006658e3f88f51ce02f45f30f00b8af1248401242d1c25413bdd8ca1fa87ae195b2af4f7416345f02146b9546bc1834ce41fb26f308a9104fbd91f90bade5a784092edc8dfd0a7261ac21105297bae1e6df4e9616dc3cf199587cee24f84780ced60b6392f729ab27b78016c9841003c0320e313602c8b9e4dd88b47cee08a0ccb891b2cf1b3a7199a34473e35e26f0b6971cce79b327a63860a95c104f1bc499af531f7634f288d5305f25474f835bd35f25b7269b98de6ac842b2d77df0fc4e91073eb9c9a2bef9d0ba0fd097a0e214bcbb1f5e0eb87821441f0cd825ad6d010149510fea5e1a720676eee377582d36a74b7c89ddb0d1596dc55950d92bd62b9000f4fc8235cd102bf92c0e2ad23e11201f729f22fc357be040c0028610280f7b1339081d98db77dd9db8186d5d0dff70fd1a04dd2cffd131ec6454c9638f7047b1b85040d22b973c889c67c83f7b2b1d5c42c4f4d953051baddeb8dc3d545556b576b56dc0fe4602a6b004ed636cbcb056943f787c96d4f62ea3daee3a98a605848b05ead10dce4b92d8c1c841444e12e8d9a27d00a73c31b7eda101220d7ff4dd255332c17f034000f3b156dd958f75f41e1ab0648d706dbaee84e8f554e310f2a1e5dc31bd4bbf74e9ed825190d5977a8488f3cfb537159de1c46d34b8078b8563a465987d1a489b7518b280913770229b106248b346407ea470022ecf8976bcba98897f14678007a9ad4efbb5cdc1680fe8699a0415e4d0ecb5a6b3515ac04ba9ec1b7c88009d66e8daf17e4f6281aa81b9700a15430214bf77cd711677bd8a00355ee58fc221379ebe6ed623a379871dc1663d3fa6f03aa49cb635ebb554702a3f5b4cb65a1374064de165a48ae73e1a244bb9a7ab3e5548aad5acc7dbbd85d2ca4cf133ebb52f912dc7e83564523e838738977b33737966738478bff6c97d666591168ee766929bf7f9f764c3747a5520b1e5527885f13b6d2c74b4f0867ef4684a25ee2bffa99f2112bb2294eb200cb929a2fcd0a67fb4e2888961ec36182e5a5c64b53e19fed99524858c490a22e85884f352805644352c923ce1895a3c2ab18ef01f4b84c5fc875685066db077ad3f5632c28247925d80d51bd303859896b9eed0dfbde9135da0d2a17da01a2ac8c1c43ce73cc2c7b739d48588094eb6e9add1030e2852f3f128cfd75e290165bc6553bb46716e355b6cd5d2b627cf1e2a4b6bd36a2dc263b6f4a2d2f6ec5127049208f445d4a9bddd3e4cc640a25f22849892c7a5537ea845492f994ba797594e55d4a5e4e8bd48a7c775db10c0637b606b200bf8cf79adf02cb84d91c1cc36a8d501be50c21bbea538a999e48482e606f1438a15b7a0d31b7b7c374be7f4eac1f383fad5e694640ba0e7e6400c55f955ebf11a33a2c1a09d2611589d135b1babc8fd92027820642b4b5437a8ac6f34a96171db6da0f789729fe46092d4036beba011745c380fa598f2879be223fb9374cb7d170598c29c354b325ae865b1e9956c0b139d8dbc201c3f9d07b50c68f108a0fe2235bb69b112145abc520d63884daf9a32a0884d8f6f519540cbbdea3b590c68e66ee75435dd5aa3cc178d8b2a32e2e0e0cee3c1ab67c2db6197c214b63e057816fd0798665de6ae7921613d06eba645bee8f278d6eb41a2e86abb994c935daa23cee92245700762890bc2a51b4b4c1236def33da258e82fc424c49614bafdc1a07ca92b37fe0f198bea2a60f49fda58e29e8d627388d75d009717c5fa497b84f3361c280350273b11d9212a134f37caa2a7e3fb17cb48ded46e71eecbb8da06a68f890701d9981dbcec8760396c951984bbe097b598bdc414223600e59345f70e802e6f20ac80b008dc052be5db9a2699abe0f9240e8b821e18f8ea8c9c8bc013dc05fa9a9c2b548b98d2f946108d2ec8f8aa0f64f6e2d5a85affe94846a8f118c1d6ed78d582022d6ec00b0e4fb5084bb45481d1e1f2b7a14740c823921c1b0d78caa70dbd65c379e5420a3047dd3768e192e222cbbd1093789ab8a4b834d6edbb2c8a27b958261b210c8a1530f12eb0d2670b9008d8792105c4489bc7b6ab1b9c10ab29d392acc55dd533ca02c0a71ddbbf7652926bb7ee23b6e85f76d311c48e15a64a46fea0804884cb04a7a431650f6ac4e150c3852e8677f3a7ac2f62d6b4c24d1d4e9be2d2bb07662fd440d30db4adb5880ab2ba7c27bc07700d9cb279720d0505c6634e6e7f82b5fdf6240507ef72d098936e30a731e011eb8b88865f1d9c3d3ec87e6bb05909d255acf88050b537f6b20ffc42506f3bfc08d01572077d18b7a09e766ff80ff39392567dfeade0b682df0a462f4aa6a6d7ae375e50c0913c7d65906715dd146118bdcae2ca25cb2c6dbeededb268bdfdf20eceb396d48dc2479b56a88591bfbf0cfe79c50f3b91572f83cbf62ef85ee04aca48b3b23a7dedd8ed0c80b59d1b4450db29ac14bd192959a9fe4ba24385040b8c0a894c55e1c77bdba6970a23c2652a7499aff52d812ed886e882aafdb37ea7c94c9f1f6e4043f4aad315146cd19ecff1dffc1a833dd40b96a8de03f3e6119a5951b34d0c54188649f60d1499b4b815496f8f60f882c49594a247d02a0f877405d3e17ae1d2fab900af136ebe4354f789f0cfc0a8a80c2e916045e00cc7097b02ba1ac6a7643c17a09d0bb8558482040063bd14a75ed92604963abf13489d649aaace56bac656fb85d5c2f0114e5f75eff9ccc3f3d10089632eb1e8c9695572f2a778b87d0b5c146ea2b2314a081b85955cb38ecdb583057d0b0ca03fbb4f90fbf80c80a4c62d5e0e32cf9401cc91166a43517de18d8910b26961c6abbe1cc6886e07ed034a3e3b27dcc6bb6662ef135e81b6f468e6f59261e59adf2e7b3dd9e52f7678099f2a02edf35949a88e334bf2347966e22d70bf574e10eb0c6d433249050ed9edcf55b3292bd012384ac0fa20f825401d0cf937e2932fa8f33069bc4228d456769982f974ecf47487ad564878d6eb2ea2549749ecbacb81eb9c6714182c9202ff8b0a3460171f82313040c354be2ecdbb98498e80b53ef04f976e637b9d96e2a017fb3b203a7a640773ccec6c2b7cd232e562a3a0949a61622964915b0a8860e1271d9a637980616d3949d8c8023062801a4b38273e9fd385761d56a08541e8294f45d180eaabdbbd040ff3403c85b08d0584a33c484b2aa2d778d0c18041af0e014cb302208ca721513d55010c2ec74525fe5364e4fdbfb66d0877de21d2cbbdfd9cebdfb3623756224110397c8101d09f94b025054da333aa67ec735a4939e65dc09f0118b0401d64301df5d437cda2b2dbadb1b97fbcbfe68411931b3dc38eed03d087f8c01aca14fe5ce5010700d08428c36cae22db81c0544c1c5b2f4f98cd60e89b16ab37c0020ea788deb040e633ac977f5051bc55684b13c774cdb5147bb66be3303ffc27c88056b44d503a8b49430f224360cfc3f4c4a860965a7505a446634a42c36d1e4d210fe28bf5fd004da664fcde5b681fecfad032bf4efb07c14cf12602fd0e004c2267b751627439c93331647613009927fc608817db4bd2c286a96c226001468b2871c8ffef5c650f25a0484a16b29ebc2a7355b5d65f3bb144f2742acf29d5f79e42d2d708918b32043bd105c2abfc8afb30e056d52b62d797bfed574e62d7219a7b51813d6e6972a615d5e7e08f3bf71f3ea7d9147957006fef083ffe227197f13fe5b9e2cafe2ea442708836c76646c7ef30c04901813d8832916c83c2b96a78e8f5012352146826cb534e47ef756af2865b3855d622656161d4a3fdee0f43a25a1523b28430bb41ef5f3e5c63dc8d644baa888d65ee0bb5544373007f230db4474b3d6c3849ca68c0360b6aa255d0a1227df669d56f051bf07d78aa2541e2ed06fca322913be11b2dfe333b1d99df99c12d6484ccf46ba7528090a5895779400895a89433ff9cd835b95e1b2fa5f95f65b05077aaf99b4b9fdac64564d2650d368c915e086213bdd35c89bbec7e451f2ef0227fef6a0e26949d4ee97475579762b634b19031efa03581de0a4b6a27d8ffc7226c1649c7709c09f08d6424c707d01b3244b0173b18c361cb2128f30b2021facc4bd98d8eafd4789115276e5b290306a671203827d2e11caa27183021011dcab7182f37de10bfe8d1df6a473180d9e21c1088e5f17d5f09ecc334c7c380a5e2599b5abc58e687331682741cd86abcfcbefe643918bd3a0d0c1fe86d8e41d1836600e08abd0c6d7763eb0db3801eb53b76392ca704d5f702e99f76e57b510fdc6d78f7f48e5ac47a82e05c77921c44eb174a51918898181fe0e08e1a506596cb79d90d0bb16638aebbc2b9a8329a577758ff1e6debe7fe64717aec5b910a0a3816340d63d0b47ef018ec2a2a4d256c381b9af166393fe83b6c56ab2bde986e7407c5d144df3029c99a691d7075dd6d4204b3c79c0676a99d0576a80dffd4eed32270f9fb74f8c584d8bae557a3d9f3ad6a777d605c47b60f65d0928f5d16095d60e6e9c128475c1aeed34ba024f9f4fa6c096fb0cc473fb69f5806b8c9e34e407a7be78692edb97e645ab42bb7cda57c409fe94a07335a0df863e30343a01feb24ec0d249cbeea5de2ed241ce127db5bb4463fc607f800a01c54743a0b4dfc6bcf24db9306ad3744e35eb475df385bf39b9b3bcae6f06e9f45598a7a10a4c1de5ee52ef020028124d99ea1f3bcffdfe8efb278fd8791ec69d2b49001c3dc920d29d24e95a71b07b14de568dbfa40a3b29077c599664dfa8736db43b100d779488248976e903860bf89cd70d719a21f65bf7d30bbcfddc9a4b0c10942050571c03dae20cbdd0951008ed07fd2db5161262c90593cf992090792eca1d69100e69995dba8229394aa0c083c9451c98ce81b344b206e415b1f378dbf24e0999c9056ab10129ae2b1e6a61c3a34f80c024b5f0f35bee0704edb53da6c02d42798d7ae69d89116a6ee970af0d9ba449c9b5d486625ea274ca027f30c18f13a32579aca3c049a05ca567cb7d353f1ff1fb6d9935743884d64135498ffd48ca8691bc7375ee5544f44cdf551cd28c17f974d74941aa19ac55d2dcdeea41c5028ce36a8a45f563bf369b6728a637adc3f1b5ecc486a4e888dc882e1042ee4482f570435357074515c5fe27118dd744d5d6304ad154890477222a24faca2e15e617c01245d83562f37bb73b465eaaa704f5f022135ab375bcf9e3bc10dce406bb01643d31428d0373f1dd8a2a95e73cd46bd10bb661c087f4064d32f9aba1236668ab4719e97de6d134889341612b67e994840a271bca96c13fde8a61ff427988fa9d114efa08f8f4d65a08c85346dc3733a06be556434c782e590b278147d853558cefb8106382f730ee26d872184155f8e71ca3f052f543f4709f777df7af33befbff3cdbbf9de4ad213f4d8381b58f7964fe4d3233fce45fdc221c47aef663d1475f8d5e2105e3b57fe5e1a9ea2814d484b0fd427241e14172599e0f4eebbdf7be3bdb7beffc67bdebdf5cdefdef3ce9bef7eeb9df7def8fe1bef7837de1e7f6d9c47c6d709fc3a6bb97586911fe1ae21b988a19ca6c9778e9bfda10504c558d4e9f4d98ee04f827af56a53056732c59326d6b49c4ac39f67085c784ee736a267eacb0cb3d279034352acd9194e6e82b3051f2001e4c66a9f1cba6774cb11e77c461f5374c2a98fdc6f23b36559db5cdfe30d0695156ada1fec4adfe9082a98e1d6a0a31b51c3908aa686b7ceaa3e140530e55cf3420a100a838516054b55ccaabb1a72b9eab5704b2ad3073c203318b157166b14bd182a2d84286cdc46ff2bc8b9d06bb75c4518fbe2b3a7117256e5172513fc61265f16ce39a7a0893cc3a88a847bf0dc81d6bcd3cfa26a24eb45e2d33de13bd2a3e7e82381333018f8d00bea99fac0c6ef8296db2185faf09ea405879f54436ec2563abc629979829d77c14624847f8b8f5b86c28373d0c2d06c99030dcbaa8905a577cb935b1ad6f50bd379b33b42e3e9606e705486b3dc156632c2843b0fb2b18518ee03235224e3a4f73ca733a7cadddd416bf31bb093cd0ff2f4c8e3e07348c3ba7b603b6e74c7c0c604400eeb68b9767b6b1c0b41e3e481e35b944b91398192a1007cf17fba728551cc0c743364dfdd69fa0707e2837805d931216eee47d77b50dead461279996857aecc2f2c63911763b522725cb1f70b2d38d72263988de33268a0b075b131a0581e05c444e893f1b6933024d7d2efb905407f90dbfcf34cbe37e7855c4bd1703ad592c9527db26800377efdd7e8e286405af6a02d1c260c8d50dad12bf1ec2c617a0ad7a7e94a08ee0faa441a01212364c47187a8b2595632b28d8541b1893ec8417ba9b5248fb00fab71753561b5bcbd372c5a26b11075a4f6898ddd83ae68760ba3cbedb022e5e2bee3267cb440262fc0be50bf8d674e1be3859182d4e62c84e96edc9a028eb7cfa88158086096979e910a7c313c34cc1d3980f6fb1438a416a4a927c389e63ba4b159ee3efca1f799c5f9bbb43b8c41df4e1268edc49ccba173a0816ddcdcdf16edf9a85e5edfd84a5aeac2b74afd08c1c5c2399c3a96511a12309c9e01834e7e758c7ec8bc9c47e5e6d98167b92498e5b064f5bec9d441e1ac925199ff30f4eb02e66f4aad2b3362b7f7be19509442d057922b30130b3522752004cac7cfabcc6cf225ea094cd9e7b0cdc1b24c37796383decf148c3ba2487945716850453f962edda41d59c8e19f7466bfd32a6ad14a88928f41a0c7528be32d22a89a29ab0a685c830ca7ac000b0d8b44e9953db2dd51a609fad05b5b50ff7caec2d82b32437f5f7fcc7107c1b44b80d197519f320b1303212e3222c8f9487e825d7549e004d0fa337e81ed9062c8ce941f2461b1e279d51b0db58aa5f075d1e6c9f39efd2a0aa715f268c0a26b343962ecd0f56005f58a506fcdbdcbd9ef7474aefe5e27cd4117a62e3b8a802f622b61945c140101a84d89fafa566fa694cb50a79421707508390b6321b8c7bb9553aa6a4ac5dbcc578ade566b90fde50af3a0fe7d8259c3b43dbae640b2051efccbaefac8225a11e0a56ac05c83dc9e8fc6ec0c98217141ddff90b809bb2c741228b0161398855bf3f69600db9df1c6917125099e6d8c2e51dc29916ded49282da8cae64965bac2f602b9a6934b571d828f8d93b79547e72a3ba557a0f3ccf2cf4ee18179592f374a6eb75b62c653b6fb037e44bf11c47667a0549325ba38e065ce34b2118e71a65b188d42af95d69e53b2965b4c2d3735e21c037a8604bac805d9983c92cdde8545e2c9e4b0557454238bcd7c0de141703559cfafe3b9bede0a6fadd5cd6ccd958e229c6b00e5c74dcaa5364a279d60642a3a2386dd2103825ec5f841db1c390a1b5c9acf54d46c0f3c317455a8f314c4e6893a88867dc327b6c75bf2b9227894b31fae8080eb5a0f0246dea59e111a29dee4ae5cc597a0ae0c7455fd6cbcdbd7d4aca3df443dba0465121ec0c0ffaf80a11e586305a95b109b736e91e264058e2467ce9e1fed9882e83221df8933806f894cb4dcd2e48425d2019ce248b52d1199f2a29289a559d461979274c92bc8b0f58716e3b21dd7d16a75000b94e788b3925fa9015fd2cb5db790545a7eceaddcc6677ab3f8745f8ac265e0b35147ad2b25b0d585b01a77dfa3ed649d4cf82a1557abde7c9670e5407c79543e0095c2b9706a8f4cb3887536674954afad762d5d3721c492eaac756b5aa8e03abb20eb635f0985e83a33f97d3068a5f379cb4fd56b8ff3a4c93b558797b02264f889343c84403c5b82ef859fba6df576b2ca0c2912d31fe927bc6517440f1a4ba92792d12d1e6a8d6dad697b675a737f30decac52af5341334f7ba6419aa676095a1075c30bdcea9682ac152234deb77a2bc338bb6f6632e691429bb3b5ac740dbc43edbc974a46947b2d13d0810a3e59a6473a563597097760744099f568f8b30c5b105bce594468cf82b484ad73b38bd9d9ddbb22aa91dc37b0d5b760b37a670c7f9ce565f9bf73eaceb9220d8af565d8b0c30d3d9c1727d32550805126ba3b16017d4d6ef0a8b9102b31a90bbe4168aac82196514b08dff6c878ded886af4a188e6d6fcb5eada08a232004171bc9d3eb238dc5225875c0d2cae1a1ba0ef7dec14a2e0373918670f0f58f8c337b34e8398d13eb9d539c0c7b740ad9f4e7dd098ad3dcb8db6d3290262a87bc8697afc45f5fd64e83447ec1951e68d433f54f08f44adbd52aa303cbe3c33120aec1f263df33b72c95bf323290caf058b28c5992f8c56f8b7262ffccf83435b2c5e930f9be80f0a5c161848282f2f70b50e3767b5b8dcaed49a193ea6368efbc5bd8066f012298ae702b6d682ef466ff046a0c71b5de6ae5c3b08bf820743fa41f1d23ae0d85848b516ace413da9157c9ded888ebbd8e3f3fcfe574844ebfdfb545817aa4e8e7c257d9208226b528df568bf04c59f91a49a88804f8cc49f4c9cd57007a2adbdb8c9cbd11d2ac0b0766a92eaaeafd46587b5952fe234579c6e4148c6bfa24672a103af40d010ddcce6709fcd82ac730910d39c112f09681f35d628a72250a357af5329c8b344df4859649b8ec6aeaf07eb9b74a658eeb44978006609c089962adefd81c257121ba7830b1cb6c5e3dc5ecb29a4090a8348ee6509a4930b3cc01588444d0ba5e0f286b871c70b54718b17cd42f4f6acd740a3ec23773b424d08e39f4a490f43ff13444f4edc4d981a47c55d31aba1ce24bef477a3be71cceec4f2ab66ffe26bfca061367c6fe3be0421243a6fffddfc936c74bd2f4752d1547e0b38ffdca04042f06f560e1180f061ceb813bceb14ddd8a3dbb6727af0d3f90915a220b8328241632459097d68cbf42c56c89202f85e5bdc0f122b0e84efb036ec6dfddd880dd00bb4230ff46749d2f9141926a2e31106ce7c872315f22a0ff0743c93a486e4788e06038ba6ea4067b197c4b3970003ded19ba2b9fc2cc1c4c982e2e544b27415173a7a6814e1bc85d4a35e574250e6880369ac8c5ec7d4f50bc4b6ae3b3104d05cbf8d55393c3ba2ca64b0b42fb338a14d42e695166031ead534b89d16719b3cea2cfda6f83e155983fd7104781e114343940f9bc2b9f294d051a01416a212dea38f05241eff77ca9b6537a0b4442fdedc408fa8a3001e9839a676cafe23397cfc7335ff283ad9fcf0bd64932fafede0ed370f9584191346316909301b503d41cb52df0b49b7cfc7352859395a99bae48275b4f8fb537c6c00fd351fc2ef2b40ac0573809c712ec31e032b95c01f1792f31f958bb0feafa8e3cac4dd5c9e716c3d30a71ff415768a53d099e87ad4bc8e8d0fcf50ec07051fb3b2d588299ded937254d714585431b50e751bf7f9905a73b92612ecb5c45cb6527c4bab07c71ad31ae045bafab5e8d352b30ae32b094cc6516550e70a2b0632533facf49a1a87b512b40b0f247313106b135a89ebda544508a94fc8bd12546bd8cc830837a5f631785323e61fa2e894bd79cf075685d02062a1c5117087f45b1f105cc67922dfbf3120a661584649533fdd2d534c4545817c3228644b28befdb7853ec1b5c99b321777579974cff8b9e54b44755990ed2957cbd78fad556cdf0ec2c0730d5086f938ef3a384dcd991639b7657a95094300eb5be83be504719f48ac476677b518c4af391009dd032e5ce0a1a1786881ef492a258650832020401ea218fa4f95a82cf83924cea01ff843bdef34f98bfef47cd646742da4a046daa4b00ff148958686348c1d89af62aa03bce70c347f6dfa9daa779a2872abbc492842e96982ec3e6a0daa4621d26cda91672324c44802f092eb324165280dae3a1b5a16ace28fc2bdbfe69b587d9c0d53f221645345c9ed95226894ecd8ec898b64222de2e6b6cac0285be08639ae8763dbde14a910911434af20e993c074a25da03d9105262784fd2ef2e755522eecb48c43b4aec5c4a0288c590b3c4a21be1737a5ad8dcb6ce0b026afd3cdcf92ee1b047ce5276135e30dd0469530814cf4c49897482e16e2b865428e97f612035899d9a3d806583f159407fc58cc769d82e5f557a95184e6eea40b1c4cc62a09e2c124df844794a29f046c8a05944f3ee9a2b932f014a0f46dc7322b130b618602e515c396dc07e2950f4de1864164904955b41f3c0c4344a22693f8de0ac6adc95e212b5933089c84fb844e68eb5d72072a8dea978d2bd6c722cade7161d15e3fe8695a93cb063afadfc3c62efa5d768853e8c9047cb455022069bbc48de499c8055e0f66a18040b7183ced8af3dd938f9badcea3073c0a4a692117b643eec8e055e81c55f12551030ce6a3a3fd47050d2c6d38107fecdbdc3a75df81f0a9af4d781854aba5547a35103c09926415b4ab22de5ae95742369774b5b13431e01b12d13c9fd2e8fac65a6763c7e6fc2f55ee24b47ed293ef7ed5bdb3b050515921051118f47baa3f3623eb1d6f142e78b8ff777a55a67cb78bfa55345e789d3dbb6dd27690dd3172da969c6b55cb77638aa665e53d638cb594c3cafe9e28d332eafc67d7833197816783640ac24be02820542cd676333c35a799e6bf081feb99702ab89e7354b66dc078de79ee7cdcc18f9723ef73c6ff529795e8df779de8a06cbe77d5ecd974194e7d17835fe793dc0d54743a383433dd6f7b1b6782ccffb70bc137cde8dcf78ac6ff59e67e5f3bccf06cad7c1e77d34accf0bc1e779349f9782a781e7ad3e1b08ccac6a2cf03250f26160b3f290f03e8fe6f3bc6f157a1f0be7c6c8c7c323b2f166445831f16abe8ff5b3c2f93e6fc70712af05d64f4ed20aea73967f05f0582b1dd6cce7ad7c26088f039e7fde6ab5dc738fe57d1e093c9baf04cffb66be6fe579415e8f67e3f1f8beefa331f28a7c1febf37c5660ce063624783d7e70f00de1cd7c1b782c6fe5f907f5511c8fe59fa5713af37458b9100878eec48b6fe5d178ac1aaf87b7e2f27d36b09527b4f2be8f453f1e373ade8ce7d5f8b07e42f0f13e1c1a9bcff33cafc6f360def7696045e3dd7cac159537e43b3d6fc5e3dde47c9e4d8df739f940f840f83e58f9ca3d1f1ecdf7793d58ad15ebdbe0fb3e8fc663d5bc1b11bc9c99cf9bf12c48e2799ee775f02dd5e4dc7c1ecd8647cde7a5e0d978deeaf3589e92f7c1a7e4f3e0cbf96abe196fe57ddee7c1bc0fbe9caf86e5ad66569e97c45b793ade8dc7c3f3bc251e081fceaac6b361799fe7c13c8f26830f88c7fabc1996a7e4cbf1561f08de6af57dac8fe529f93e8f830fc7bbf16c589fe77930ef830fa766e5b16c589ee725a15e90126c865626cc782befc66305f16e6e6039533a00c123c2f2be8fe6ab79af85814f8e92e77ddee7791e8fd7b8e92bc0e0c1a102099caae0c50d312a08614304522a07100065036ab84c48065cca0b055eaa8ee1515ec0201125043fa5e0c50a1c50d58813262f20c4a1543df051e225488f926a81134936d043842442703c241bf0ec40322b9304127a8783333a40e09931f1bdd430007e519f124ce8f27a238419e51102d5e08777b9a08acf667a70ca9ac17de554a05a22c8eaae638893c3a3876781f7c4fb19a4b87b54ee5d39a972ba1d16cf5b8103dcbdca5b429ed019bcd856f338239582d08c37c490e38ec08c2a33be480114303a267815bca1411850f4166219990543456356f80003242240e145ed0b090bb8722b1004191f63a0704d1c1a505efcc0a0a70632181040ce624c0d53b88059bccfe9032190b03240100c1b8099c0970c70c132c366cc1827100191cd468f0f0c84ec58a541c40d18049117e469f581262a9023034b0c31822b3482510b2b21784e029e3236858627de888108004c801de09e3b0284e784e001eefdf0b883a0a5ca573d9cb83b51f71a31ee1ee61b459a233a3345ee6e7a2b042e74066ffebdabd993b70ee14b085fdc292cff6d63237488ea6d6d76a4e1eb3de1eed85b2098e1364beb29cfdbc3c7aa835516552c1daa584c342550afe60431b40c503533c3a386840cc4c0f2f2c3d28087124ed004a08ac57493018e074166a8ba5181b5c20a849c4dc3c326c946880667b52408ce8c04aa6ca8a8024225869b242b244cc0238daa993255333c38b040158f3d248baa9b20167c354b667a6680b001839c0d8690819543950f213e84ac785c3d36415c65649831c146a86668e5633564a344d5aae9a7870687e689aa550e0d07ac57cecfca63f160bd7092664ca8518186031a1c1a2b3c80f0007213e426831a155676c840c3c1ea8b0c3361aa46b0c22a6938c2072c180f1f342e96b7e25919b1a0786840f3d548a9e9a0c66906030b3c9a9cd50c8bc76ab5fa56352b9bd50d8e07ac550d949a1f3ea0705c353435deaa866584d5c3f26c36587510c34d08334e5459f0440c2e1a5607364732b0d290614848bdcc1d1ec000190a880123cc6993ea610b5251132649f07d83043d455a3e6c6aa6acf0e454468c32c80881071f2e433829228d0b8cf185160d48c0123d2009429c9b079d4f500238cca840195d4801c30b2c505961eac9e984a41040d020033057c0900004bce042f88107f88660411a685c29abcadc9102145099a24106ae0b7ce18503b468c0140ae061871b42165490f2e4b43486185e4c000b2e4a1ac8c0185f74a14516065002071a6628011c17a880165980598096aa1f97905c3de068838d34c0e8e20a2ba268a2071d7e0c59a03245ca12d212d88eabc71862808184113d68f991051496929096781b6c8c214604bcb8c28a2814d0840f3b68a982c2129325b024467e767eb8585ea60d36d08800185e747185150a68c2871e76d0410b07c22a549af48075d0c1f4c487056778b025071ca6a4f80c40071c763a286ecaaceef8ec98a1e35b818d13ac037c4d7c4b7840dfcfcac70373785626ac6806217c1e781dd470b0dac00bc2d2c0cbe0e6821f3f562d960f1e16b47a70c063831c0f705c37353634351f0dcdccccca731a2d382348a0aae6a6e68665810d929a9bd5073c6431380db1d1a1c1b11162f1f0e1b178d084acdcaac7cac5223343115534167c3537ac578f0f841050851385c7c87a5910c367a48319282c8f66e801554c988e5c337c2c1c16d34e0aaa3a2043096262f06660ae109cc4f0b13858f1989e10a219132a504543130294160c7c14d1b03a21861aaa36b891c203080f20589230306d340e0aaa86f6cd09331f5a3537ab1e3338d60d39c460c3b280e603cf47500c1e18c04d0916d06233c710167c39334e5c354a584f7eca17192e98d1c149c22181860aab841a253254e1e504190ec043062d1f2d3d44a60070519573d68c98a107900f2f8a07ab25351b208901a746090d8e8d05ab244b27ac3ec0494241154ecd520f291ba50e9092706e9478488d43555469c07a21c1a1815dd08306270769080b06a8c2b15102818643d5ccaa35e3d1a4408333b384a604a2a29cf3a6888d120d4ecd063d8e6e446039dd6800c4031238c8a0041b139e449110038e0d5813d42328c912540d0f560d0733b015921b1eac22d449cd4d0d0eab67e6094bc88937d3c14ac84c063e3736e24a09d29220363819dc2489c1c829c7888d0e4b0496083407a82ac102d6d18c093320dc88c0f2c0c7cfea0319aac01e6f555bf1b056332d0c61e1872cf04d0002c46cf125010750220030b8a0d3b8da8b3316a8ac3015058a1414130a4a30a1201d12462042595e7451e60d1178a009d1084338d8a0a6cb04c258c200292035817d80018f1c1a2ec0580105134b2841002f5d9080a253a40734a2089954993ae4a0adf00609b408b1cb071e6c8d68094e0d133d6c49728301324d30015382440320393836351e74d08029a8fcf8e484c2521212ccc8cfce0f97053d5849ec70430d3fd43882450210700018a44449822408101605c4c411858809929b1a1a0500c08a050c40881f706841004924c1c39313d192223c3c3a562bf8e660c14149f0b9c1f2c0b7811935bc0c7c17f82c7053011e657c14f8c6f8c07c0a5825e0c3b1ac78227821d87c30e3418f0d3e0d3e0c3c20ae0b667e7c2eafc5b2e0cb99c1f96e6c6cbe9a9a998fe5ad3c8fc6719050792bc817d766b3e7472cda7bfec54e337ab1dde6d3940f065d2dad67c5a776ad53753281070c16ee5e848a4f112a344a44abf84ca99db42cdc7d7b2b831018d13b5713f4019b7238675c8403a3bbd2f171a2bdd564624244eb267ffc1bcfdecaa05531590b7776ec29cf0b8474f720ffa9320567e785a3a3e3027501e785d302a530faa22d504a69972dee14d6c2e06220a585c1094e613814b66b4f528a33db379bcd94eeda9333fd3771d7928910264cdcdda707039b161037dca9b6fba451aaeddfb6bb833c40a6803c717710cc38672413aecd92f5b158bd4fbcab4cee5ec27d32c43b34cfd0dd77bec4527fb193bb93a0f304ac75010ead0bb45ca065270c14dcbf379cdcbf35cc38c343e3233f245fd0922222e03327d8803b1721aadc479113f700d0c5bd48cb7de586bb8fee8ee3bea3b3db66f9a1b660eda40969e2003e94883ae143899ed019c70ac58ece975887da823bfabcb604471ddaa9c3f171e2df44100152b2a513968ec21396a4c2a958136542447774ee9360eda42560e707091d1aa23f3a7488ea9334c1919a40f7ad25383ae981f363a13b1afdd152d991e24db759feded5c371c1dd61f056cbc675064f6db3ad6767fb5df3d63de28f409bacf594e76562f90881105a5c2bd2c861e06875822436d0800f51acd1411343ab0c9411a4011247e44045ccc86a8b1d6c47f4b070548687d7aa005a0861c3c9ea8933784458e15075f484052c4b8c4183072bf3091d8a01da12397680aca078a065041d5e8ee081048fd512235a4ab4f1811e7e763cd68a8a09e18d9601a46879d5b1a2c1c1891dde98c2c9111cc8f185e00a2a26a62594386a89e0134387115930a0c41247436c7c533081010a48515983014298f119c1812e52983144083eb032be18b864b0421c2d08914a238caf160615c38831547405e0e263b2a18e383430c1901807c07c3f0d30430b29d907b210238a2f0314785144260017015079c2aba300463cc0880694e4308212de06d048120016447409d738c2fb228812a2a0b28221ba300008ef893047a4ba082344152639783e00600a007c986244170fd0e2e5a290b1e1657746905c168f8a096e742d44e1028e86ed150da024001145bc914381f48a64c023c1c881a9030846af870f4df665800e3c30e56e022eaa7ca082a22b1f14217332337c61b303074ebc06981c8b2f68bc500e61a060e2c807300271003f6570414711771b04f05484040d8a188264c4cb0a9021a484131fa8babd5c8a871780c4680104544c77a12d8610a305306a3060803b08313451a29b03881b2dee2b287421e8e2099af328e3861b6514a0e5ac32621ce1a48e320ca040033498e2c006ff92a30c11398009e30643d9108608cabc00a60d9bd10717072160a38c68470d529860068f80056694593a8008221061b50f63ca2803b241a5c54509262ca109a30c10229a70c00b312dc0f0041777a860025f4680f23f3f5380b9238d00d8c03187163e30c045710717551c993ff0c08411633c7147137334118e61c376010825eee0c100696021002adaa0828723eed869a8202782b9f3021640dcb182104e34e4d083152440c9e18e266080293333e2001f292d778c50032d9c21b3a08043963b70a490020a260e50a68a8a6dc71b7170608e1fd08040094820eda800019ca84df508338082d10e2b34f00429820bb40268a16247971f700210e38a11c0104266070d5d9c715484833113b082c90e9c963065a44186174d961cd901b500211b1d251c59c00e43761c79c3080e170d4a78a20d237674d00500634c60082d8690e365875f60d320811164807d21421d1dd8220408b0901297270fea90c0035a402069a2234a122075284086a11fbb2a53882185471d4220208ca51e9ce8a4ca32ac3a5a00c11143724448808304eaa8a32271e5091ea030001852c85147d29814a8e8fc4029620611d4f1d2414c08506c81a18e2136ea706511a5873762380bf030830e1494c929a08e2cc098f154061d663861dea1c1174578110177f73bc2a0c3011de0608c15130e90d270bf0172d381bbff99f76bb2d6dc5d049b10dc67c8dcc8414408f540e0aee48712d19c4fb1040ad35589122125499420517244891125414a8094fc28f151a244484828891012a123424684828480847e847c849424114a92240992244792184912940428c94f129f244a900821498204099223488c2009420284e407890f122547848e243982e4c89123468e041d013af273c4e7881223424692184162e488112346828c0019f931e26344499050509220244147828c0405050105fd04f904290112024a028404e8089011a0202020a01f201f20253f423f497e90fc1cf931f213f403f4f3f3e3f3a3c447c827890f129f233e467c827c807c7e7c7c7c743ed6e6a633589eb76797b519236a9870f7216fd900a1e33d718df2d059152441f405346546df766ba67fdbf45afa96a45b9f2585ed6b439d1d6b0ef3d6618973ad3caf76f7296fd530719a2577c6b45af372772a2d1a3141dc753cdc7d6adc7dcbe19ea9b8e17ea9d098e1ee435a3462dc87d0dcdd0377efc0dd3970f72577968bb5dac05d03770cdc2ff08e9879a24503c4dd83788b260885e9f19e98466b98ee1353bc432643d4dd7fb8b78c803f3cfaf7ee88bb93de9af1d965ed33165b331cb86b5bae74b464a5ba96246b2985b12c7fad761679a6a7c5dd57f0166bcb8f58fcd1073c02faf0081dd1b49eda8f8fcf919f4aa301018d497e6a4878b005f5ef9a457097b7b6b6cf3dd896ab6813c482f26d4953d3d9aeb30cbcb56272f71fde6289e04e562a5c7e9ee9b2125b2b9abb6be0ad151bee0ec45b2b31ce44f7e3b5f9f5b53a83232e7bc4a7daa1daead0fb241da24fa32379e29ba63b5f06ee5e7aeb8bc2dd5dde5a0971cf61b2969f0ad3ddb66235aba833283e5598abd90267390ff78c734612aa6d2825ce49ee0ee4ee5d77b7e22daf0ebf3b9d83e37f92958ace72469ad15be9c574b6a363d69cbb270cb6c9537fd48c8e4f9255bc7177eafed1dcdd7acb7bb9bbcee02e6b36eeee798d679cf3d35be9f8379ffbf3be5f3e6996966e5bf3a6b66bf7ae65c6355add9dc6dd67dc9d95837b3bb83bce5b7ee43a833dbb5c33cd923d62d63d344b6e7de61e9a257baecde53af23c699a95c708929b986be5799256b7eed1d7d69b4862bc7bcc73eb33833d64bd78ecd1f935941e77efe12d1fc1dd31f096b7dcc7276dad51fd7b47a3b486e9c57657119364a5bb8ccb2fdd7dc572f70fe78628727c8baaaa98af7074d892f302144ea1f0a8dfe4b43cba840db4c8a9dbe42ce1d467729c95e3d4593936ab2459a0907d9435248b4743c879c1a947bd260700364071a5498c480482b428161437435933437ce53dc9f12bab19d2468b0c317cf4637952e4380c38cf4acd9555ec86c562b1e85773c362ada88d0df5565656de6ac5fab258f1e80df59666282b0bd5b757d486daac6cb2d4d80cd93435389a21b819d6102b30d87c144733e4ca6ae6f3a88d37f325c767acd8d01b4a73727c6648de2c4a3384eaa3349425e44a90188e867a0c67c8952cb11bfa09b91224463364af94bc98cd2a7633c40a8b7a43ae6489d50c1962c573ea23f6d10748800b58065a44c41843440c2d44c61823c6d722a2811691315a569cc48894d1d232468c166e457d8b1891315a2b4a848cd6473d9a440ecd6a87b2680d25424608a5a144d0681111d32242a645adf838d902470cce10a81b6ac5b7c0a1565ccc8c022d2d36d02200d0a29b21e66a6786c819ad1b6ac5e188cd60a065019c0a58a045436f2c60238488192d221568d550221568d1d01a21442ed02272812ddeb76a2287489830887c41e4019f8b30339443bd288787908ff2e0b162d1aad5cd8d1616e571539483c3836648074935940657336489dd4769862cb15bd12601b56702a20b10a6111042eeee4f85cb1fd6d875b4e3ade2c6a4a6ba08c5559bfbfb03133fe87e5002abcc7e0812fac0c64dd79b0f5dc09aab49b39a42354529d11bf301caf5b6176f1f680f26284ffd1906139f0a061bb70e4d1deadde3f2bfad423df5b0a507a61e806c9963dbf2e9d3b66c71eb161b7c8b92fb96d6c9831bee3c6c71eb93a2b699f6230f5c78a0b983630debfef519ee20469f3a749631d46ccc55d476a44d3b74a155ee0e36ed30b3557387241de470777024f1a566fdacc30f3a4cf17ca63bda78ebaeb48adb8eb756f3d4a1055e5b6d399891c3971c56c8c16797f7e773dfa7225f9754247e8dfffbd65c4f1bddf8be6ee229754f6d7198e3ac9d7f5ea1dae210c6dd56a17038dd2d557e4dfffe8eb4b9666c96bfdf56cdc762a56030d9dbaa8943cbf353e1300020c8549f4d5b85226a1a72d2f9c4b49bcdfe0d776325227a2c568abe1e8b9532eb2b0d010541c1fb2ed197d069d6bf6d5dc9c762a5949cc25d253f536133d4d5b2ee7a34d6571aeb13c986f64bfd6759d10d5d6e70e10626f72a54e80bdf107403cbab50a1a3a553a8804d465363aeb99bc347fb7e899b6030590e5f1b30f0da76adedda9bae4a24598d6cd03978df062577b72108580319f72fb1aea14b0d37cf7dad86204bf28f1903408c3bbe31009000301dcc9802d1a7c9001084eec8fb4443981776a2818b8374e7332e75e8eed65de4926435a2c149cde51fcb24dea2c11ddcf8daacd6b20526735a4c771add452ed5b2c4d65d6fbadef4db8c4322a23d0317f719cc199cfc8423896ffaf36d8733fcb09b3ccb50d7f06f44435f5a19514c579be8ebc77be2224d562a9c4db366acc312e71adeffb9264328434b6392ee13d35be97d1d21d11c269f46f7498b818a6b6330f18e012a8616b833fed6a1708054d75c951870fc5cbdedaaaa2a26af5ac1f0c5dcedd3962b05c78bc5d72d18b6c0e024ffaee4d630d8b8839f6b1be34c7734ba5fc75ee002ee646ca9eaed69da9634e3da0b53eee04e7dc1e705bfb674410d7074c186a7d17ea4afd9ecd4daca5c98a2515d5dd0715c4f1638ca7ab37cf1baed68cf2b96a45946122b8d24be6581b2d91b2d4a161d7770bcaf5b50e3474a56bbefe34d73986ce18b3b384bd2d5a6197d2cffb9d682e96ea3a2b1168e1ce4f96c16117dae85b9bf3098cc3c711833611183a58bbb873fd66c334f2cb470bfc6a2e46095199620bbfe18eee0d83d80aca1f98f0b3f6a5c8ad217ebfa392fe144cc345a6dab6452cd5b87a46d95ac8dff9f6bf7b1e05cdba1e04e651a06930de97091ae3a5c84e4e724c92aeaa8a0b23f86baeab8e84c92aca152d5d1dbb6b9dc1c3771575a8e0977b0b45417d996624d5f4f6549ba5fd3dd3fc9e98e96b0530e6af7b8a89c0f88a9ea707770572b62adabde3d8e6227bdfb273098ac867136a9c2b8efd7545d7cf7b830e62d2aaa1ee07902213bf7a9036e35f613eebb855d822603d2ee972516b50dee0e6a2877d048ebe40c6420dcc19d1d699a15bf25737dfab7cd53235f93a4cd699b93aeccb10392b8927f9fc0dff54a18f088b7aed8d0e37405ea0a35ddf0f156938bae39d9486273ea459cb5a526b5780e2cc6737ff17607cf6bf7c5e2d611e9fe62217730639bab0638d6dced028e76ec212f1497a21b8f15476228fab77d7db8fbe3ea2ec3b83b92b74a9d6b4b62fdb9963a3731d7d7ba7407c9129355ee4f23a7dc4132086e8bf1374e37d692e2a21cccb8867359d9c21ddcbabff85e4bc997a2e08ea42f927c7d6b8e7ececa162b4e7664ee2fd5565bbb01f7f17724ad611263cb84351dd4d62a599b9b026cd76abb733a509489669c7473011c497c1bc1c12d7eadf6f471755b1ab59101c97a6d896d5c6ca6bb833625b0360738bb7fcbcd5a35291c9c7dc6e2ec5adb6cb62bfdd2d6707030ef36bee56ab39a90fb58fb1cfc725bd90e7de9e830f7f7ab7077306a244712bf99df7631495fe3d719ddd035376e317201c72864dd78d3bfc9c620f45651632c8abae674dd2213ee600e5ff1fc8c8d88767c7c902439527bd23b5728fa8a7dc6463a43e247d9f7cb6bb32dd1c61d1c6dddb996eec88ba94eac450bf3bb8eb4aa71ac34a5dc5f5a2b1686e7e25babae2d4b4bb5ad38572877f09e36dbb562b571b75d5bc37426061c9f245fbc558ccd4cf76d73254fad6f627daa6dd79a6625716ee35990500d1c7916d11a0ea988855cc0f13ec5b44ab58db5c299575ac3611016c2b0708413798b852755e6f84b77b53c81fe6ddb6cb9abe6136f55e91255e506e64a9e628d55b1719e1e9cae9b7ec625cd98fec5146f2a6a682a4c78a562666ada9bce7f734f5482b83b4856d126796b4a18bf27c65074fcbfc9a6709942abfa9ea3c5542bcc6149d3ac75052e67ce58a4ba48254d5cc6b9154c7717755fdabcc28eb45dab821a0ebe2e32feb5755f2cd28daf0a5f1cdc6d15741a3ba92074632ab4c0adadeecbdf964ea560aacb93556fdddf2fb1a833a5a34fd62927b6bfc9a6884811e3a0686d98ac54574a56fa46de9252e5ee3edea75fab346329534b526c7ef764d5350a13be7f8b366f4deb675cfbac43b5a5b66b71ba9651aa485a256da5aa94e21b45098bddbfa31b5faaad136f4571d076eda5745f8b4d0a858a16942ad7ba9ad6d43d85f2249be3459c4d7ddef6cde18ba33bfb773a23b6f94daaed93558a7ec646549ff86fddb76e7d976462fe625cc6398a6f4b96837e5d49f21cff264a8d1593b88c73a4ddf7d4ba5a662c7e5498fb3b2ee17495e174dd9fb148241baa3ded7be2b26e4c65cdfbb75cd26e5bb25e5b1b97a2461b4a6d11abd4cda59c805566db8e9fc5f075bd89f934a58278d41c6232dedadea2987077b2eab0eaf32946cd1cac328b128a6a6dbb73355350c3c479a442d727c3fd3a852df74ce17686292891189b2950f714727f5b5062c21f4f129b389b218e3c69246969f9a1ccf2a48564cdfdfdbcabe447bdf8e2ad5463250ac390ac3fdaf0c9aa49acc3709f98243fdc3adb1a4ec4645178ed589ffc8c8d461ceacf581cef87175bdbe7d15673bc5ffed63b4d646e5b84d3b5e93336d217db7dd26cde178be1ef4a65b3f9bfabe69756a6cf5db794d1c5f6c55bc95af4a2cd26597719ef3ade5acac85a667c6fba2ac16032184c866b77e9888bb79c6eeeee94de9893d2689eb31fb1089bb59ca81873326b2ed644c6df34eb8d529e8be97d6ad252d64b8bbcd5546489b79844e0ee60c67496b1d18cda448b24d6bc754ff1a6494c61987460eeef786b3ec5ffdc7e1a7d5d3f8b3f7e0e93a4f8a666a2b67c9ad476edd3688933c5f9b1f0dcd613356e4dbcf52488df5663b3c422e5b9f88effa315ed2945b47bdcee9f10fd49d628bb7f52feb63f6251ef1e473bf5132107abcc9eb4de56cdd0ac7f73c35b286ce12870d1d9da6713855b88cbb5fcfc81b750701292a4c5a1e0c3c12a331dee13ff88c570bf7e5d6f50afebcd44daf7a99e4866e2fde2c557e7baeb51dd75dcf7c446b58fd2fbbe156dad76ea9a915ebcd809069311edd01750d0a993b1953a2e39e132ceedbf64dd6fcb7587195f5b86e1b525ae5d9b3f57f378db36176e6b65bc1687c2be35578a533f62a3a7ed6ad397f57e596ff8e439e212d7eed263b13ad4d5f2a9ac6d6b5c86bb86e3b54fdedced10e949da898f48b28af9c7fb3a639b7fdfa552d4edc7897627695d2d8d2039ef5bd38a9fcfbcf55d1a123f4a10d550294ec1604054f78fb67e9b1d37c639fc5db776ca4f2bcfbb4ff3a66bb8efe76a2ae51febdf889086c48fa245abafcd5bf74442e790f851461f20dd8f7729560528882e113aa7b82fc0dd67de4a4ac147d29e3e3f20100fae5dcbf36415f5f8d766b5aeb75da132495651ffd7884a712ae39c3fd4d592ace7162bd18ece50294e213902a474d3f516de74552ac5a9d186b66b77d5143a43f30906dbfa772561b052d47d89c57de2adb138daf0880af75b690d231d117104e5a0d626de47addc5f9a77cd365b1a91f9d2565214f296110d2da3a19d9b314d876eab65e08d197d4f803b923c6b5abf288ebade46f056d12d0a12e3c2c1d9ceeb28fa1a97e84b67f6f9dcf5daaca695daaea5aa37f19eb5735c3223c96a34a395e27d2dbd67cc88bbc7564e9ec0575bfa79163eaeee19b55d8babbbb12af1969329275f932fe439fe7edb7896676975b5acb74df3effad946b56d725b4da83b588a76d712efb3de4a6fb613e7dbbed9ecf837598bc80d77d0ac79df5a6229222edcefc75a443c10c1d870709f988e19d3d7aea225cd73a4755bfaca4ff597ea9a2bebd3e8ae9614dc55260b604285e21ca6bae62a1deb2de6ee27788bc937f484fb498ad76a2c52bd6da92dbdd85e1b03b7a5e3677cf12da74f5d6f434d96b8e1f96dfef3ca922d3bb3529c1aef4be9f3770debe4cf51fd9fe4ee4fde5a22e4a0be89faa475fcadffbcf2f9a52c99f9e22049567b137735b51d2bd5f6d614602db83b146fc1485022c61dbcd83c2b1d6f7d1ade2ffacabf2b49f5e351c916771f6b941228778fe22da1152c212445488abb4b794b88d54af2c5c1f1c7fffb348ab18dee485aa5e16c527d9f2affbef5e6a7c2364ad6f3d6260a8e6f9a3893a4cded489ad51a9bf46f5b9f38bfedd6918eb7d29d7de22fedc69b666cb339d6cfb65be9b5b4eadc936a4bb5bdc9c0f1f3537d6d2dff26a3e0b823f5892dd5679366aaed6dd31d8dbead66bcb5584913fff854f6c5cfafe92eff79858ebfc5377548ad24b3939638d7ea6eac9fc94ab7a52f5eab6fb2243ae0c554e3444c6eaaeb4dc95b48c880e3efcf66fe7ded93b419fddb4ec15b48743b63d33c351e9150f0e29bb639baabb74d7748b2ead09bc3f96fae88b78ec0e160fe4dda9a266dadb58e70d9dd4a33aed9ece7a7c29a3e49abb666f7fdd1d2bbef8945b182e0ad23a63b78adcde6277767e2ad233a75d7119bfa73c622fddba6bf71f999c6c4f89719ef6ab7bdf626da5b8e8eb69ae795cf4dde32a2fbafd15c49f1478a77c637f1569ecf2d23146f8d798c8cd4b482bee05dc3745773145f5aa9b63b92acf9efdbe8eb495abd89f5f33da9aeb920d3835a4eef3f8d3e55bd51bd6b76dcdd5a528c81c2584a5f2da02e0efe7ed22cb1489b8ca6285945cc04a403d201779a8ca6680d533a7eb6fac7f1b5fe6cea7e5bd006be0e1d5f9ff43e95b5d1bfc9801cdcf7357d1ac59bea9bacf54386fefe2c5e2cf25c7c977e8e703abe783f7fed33fd9bacf533d5fab171a789d5d4b486294eac24ad549bf5961f0a1cef6b7a2dddb15dbb4f9ce96ddb1cc523c51b7cd0ead03fb5b65f624d75cdd1cf3cdef211736d997fff489f4637be22a5ba08fd9bccc786f1777eaa6be9d3c61f2d15ce269dcdfe2673f7286ff9f038881371fef2d4178b9424edd6f473a59fffb6e9ebb38a4fa3e3bf289e9a6e7c6f15697e13539c88c97bd2bfc9425d2d898668bb5a1211ede81011916435fad2ee7b46c16044365bbbd888ea4a654343a538f5b6aaf597433a5cb46d6999a484fb66b39f238a9118d3c61f4b710a28e82c7fdbf0bfb6f58f444c769367d3f8518674b86897ab156dedefd340355a20132dd00ce22d100aac32fb7d8aaf7b90e6afe95bf30e9f2abffedce281c3ef9bfad42d9e2dc02a33bd5feb1aee8ccd277f87e36f5b5ab2c563c326cf5afb91e736ded73c42a5a86bbde600abcc7635bbf10d2fb63a3f55f8349b454d3bf53dc31733aec160fb49b242cda6d07f29f756af2c79eb1793bbb6f4c5c12b83d6cbc67d466dd7fe2d4777289321aac364885e6b7b9a0969b83b8db74cc040cb040ab44c70c2dd73bc654297d98cd630dda13a94fe68f5b5545bba2d5db2cb35d79b48aba57b47ab0282e01467ad3ef776e4d85183d6c249c58dec409955d45ffb51a455254249901c311204f4e3b323424b47053a6cb8fbb55bff48e9c697ea2e9e39dcddc5a373f1b04061502968b36659c64975d7a3b16252ebdd3ff9ad2b135ed2381133e9dd3fd9ba77bae9aa24bbe9aaa49b3029759f499364ec49d366d9f8bbda3edb6c3132ea3fe9e8e222a31ac6194a9c9282f2649647e36f5d99969eca6eb1de25bd7565d2f506b5b565dafd1328a33dca0fa53f36eafa4ae295a62be5d1d695c968bfd4688fde92e67fd2d6bd93ce98a4556d8fa49865563aca6127a0202858368ed8086aacafe449269005c955248cb625264f2852e5ee1b937a7cb740c95d4574740e75cf53f359311dbf76edc664fd6cb33af74e2468b7494041e33d697e53d722102868f7b8d9ce0e7dd1978e4e0d9b408d9075acf456f26ff4e2fb26a6b51c6692a2ab4dd869bc274edad8e92e49e51ff353ed699f4f52b94fc258e6849dc687c542f8b2816bc81c209410d79027dcbd52215c4366aec7245c43a82be112a20638ee6a0097902dee4fe5123282349ca94c9364357209e171510bb8bb8c24ab5118829a242bedd43b931c71e9a2477f1b298d2b849ccf3187c91a140a6372cf05821b2e10c2708120c505c209eeeefac0899fd0f501d535044105eede82bb3c50729d41b396491051b38a61ee2f521417063cdcbdd1fdbbfe559a1ea6687c6c8d4607b45d9c7374dfcfd12fb1140535edd437f1d65c44b3c48f15082c398478a2bb47ab81d2bb5b477c51f0665ee8eeb190c2131b984f73ef2400d70646ae25aff5ac700581c39dc25c419800ffd4f526c260e3dfdcd38fd86916a3e243d89af76dd32564c594569e59a495ea1ff10df1be36f464b042df76aef4335efa113b151dbdcd323ade0a83d1ca331b794a90b6d6b49dedb30cb7aee4d79eaac8e776ae0cc2e80c661c45184bae0c82dc9da4d1ec85c146d2de4498bb57c5dda3e2ee2cf7a698200e3536e0c2e0f6f303fef0884f358022eefe85069f0ad5055c4de7ee4fdc05a4c77de3ebeeade0eea9e0ee4db97b52a2b87b50dc3d590a9e1418d7055b67f0c5fb5a7fe809b92e00a23338dec7899516becddb6d43ee4ec57dc77d8abb7ed8e03a83a117e59e8223c0e56ac23dca13b336d9dcbdbacbe57e96b4f16dde341bd448000355ee5e8a535b8754f35971ed2eb95a3eae95d09acfea6af913771fc1bdb817daccdb2d71cf89b7e3ee55dce5a3f503faf06c8cb3f7e4c4cac26b72f794506042e1090a4b4a2724118d6f9a366f0d2b75cd0df57092f4b223f79860d9e97254e7d6f98a896f89b3626fb61554989212058a4c2a2a0528a726a62728289d908474645414eb01795e654c286147a708092388406488903265ca9471afe6e2411d6f739745578e1cee3e2bc39543c5cc95c34395bb6b7c5fae1c3c9bcd6cd79563e4ca31e2fea230261ed203aa08c3a38027c68533e4c2298263e34e8728059f1c6d7831cdb8e6bab962df9712a7dc3d0477ddc41035d622d7cd1077d7d526f0c92a56994999a538b5349b42b359d43fd66a98e7c79a37dd551cf6f1f1f9d1c1f86644c17de2fdb6aa7724799656eb26a329bb455bd6bb1bb1be310aea6d6beecc9bb6db96a75abae42fa619d78e041d39822487b38deaf29442c1d98cce704fb35b2d59cf2b4b14c4afa7fd48f393642df5eb77e5196fcde18b8b82a16048b227270a8a74a62b2677d5ac9f9b99b5a9fe6c469231ea5ab9bb9364a5bf4489bb3e30ee6ed34fae6f0b09c6bfe9d3a45b9f569654d1f5b55c9e19ee603e6b74c992f15d5e025c1e97252479d6a8b6d4bbb93c1fedf2dcf585e27231e393e3adb77bd23059e4f22dbe8496f5f3d6d4e553eebe1257b0f2326470edda325d9ce75ad8094e4b4e513129654c777f5b356b6564ee5aaa8c92b75553c81d6a34194dd11d4defc78956764714eea5a82341e786a5a81b9742b3cc4ae7d31d44ee3a68bcb86869bb77c5bd277574e16ec711ee66fd1b85d9e1811d357504c1615cf458ac94ad42edd7a1944c7c2a182c1cdff5ee71eede91111d117077f2e9cfd7aa76f78abc98103a865c6730bf49fe2d74d2c4c1f1af50706b2bf9f50ad0707a9242c1572b885a41518f0aa070f7883c26cee2c15944b83b0bde9a6301423e3fa00ff8c373b1b612fe985fbf26eb9f9924cf39384841993398b42d7b7a446d4b184c93e4e9b1bc9c0a2081c5fd8a192850230547ee0e8a4e1e75f74270f74070f73ef8115f9bb707fe800e38d82008cbd3c0fb310615364e10c46fdbe6daa34dccfa6247078769969d90beb40e0959e84b67f7b870470bc35daed7d240adf567dbb5344c98d07c8a2c276686c8e1e3be421c6ab8fb8c4f1c42b86f7cf77d29fd4731a9247056771de9bf140567335ac3bac45b9f228d516d8ffeb66dce4f858da63e271b6fad61f19ef8de1c5413149a71ed6b96fcd1dc62adddd750eeae2088c56bb5cdb98a543f55d574bc75ac98ac4fc354d75ccde4e79b36eba5558a3559a9b6a00d7cfa7ac9285929b85fdbdbb654dffa2559f3977f33df9655663f62a3dc3bcda6ccbec452b3aa2da63746c126b466a550f06ddee3cd6feed747e36f6d757ea8d9147c69cdd2faa4c8b3232f1629aea2bd675962916a2c6afde22649d256413a7a3282c14292fc1c0c66ea2955a6d84c92f6c5836d27d5186baa6314145f555791de250aea7d6d15dfd49f737f35140a62b26af31f47bead5599e13056329a4da1af2dbd6ddb7d1eda7ddbdd91e2ad7acc3877cd17c54a6f1def8bfa47ca44b18c1b3b196d8d95621b3bd96c11c6b25dd1f850fa898d2dee2ea4c9efbaa59af6ad544f7ed42c0cf7db661e14ee5e06adf16dafe93d8308d9e5a77a7aede7f1ff7a600d2abc071cd668c1dda570ed2e1dfd275d0103050e94e1ee4264516fab50484f50e08e9ce987c1f489777a47feaea5ddd6f6a41eefd39dddadb46675a894ae3681e3efee533d7dddcf55bc4f14bc553c77f4dbead6609559ede93e93ae36cda6d01d6d47ee9bcd929a6a4bd632dbbf6dfad2e68f14631b8dd1d2bead9a58acaea5ed733b3c175f1dba7525a1a0c8a4dca5110a3bbdad4261a7a88d9dd0b8b983466838b117178586bbbb9d8df5955e6a764618bbb1fef9e715f2a63f279d4184bb8fb03380b8834e660061465518a43b859981731f9728a8e9c52335cbaa7b9a711205bfb49ba4597d5fd34a5f9ffafe7d8d6f22cd275681825a9fbbe66a9a958e389bb48412b4cd55fa4514d418dfe8ecb1d8bf7fdb4b14fc7147abb453d38bcd93cefecc7b46f1b6f46f522838fe6eac1fa5c7bfd8da8c465ba1cadf4bf7b47d51692b69248564f4636d1a8da2488ca1c61f97c6871a3f8fff240d8a4ce9eebeef539161e2eee5799fce32fe9bec021fa8b7fc26ddb7da5ca968a5da8824ab11a8b5ae363551908e4be0f81b43510a8e4fc75c739f292569266dd76a5df7db6a188ff4733bf7d4a1a03e6fcd6fe26cbef68fb45393e48bda96b486a9fe9d586d4feee81aae385db70ecde3676bea9062d88924ed965a62d251bb5b9b3096e1232cb35d7bdbd869bc503676fad2ca6c176729fb7c1a492c75a18cf9a99eb09394d1e228d8eec85c917e57268c651b5359a88d9da0b87f642071a730bce9920d06d35bf797025c82a87ac4ac3d0cdcddc60322e5f4b424337282824238156bc297024e5cbf0567e1c5b3d7a08c72408c12429c0def02ef87bbc7b47e72bf2697c450f06d77e36b5baaf9ac2018238cbb78cfbce96b6b4b8ea1e47519e366b631296534ab619ab1b65476a495fe489e2259452d811b56534c4086b7956ba9ded51c5975597335930405fd58bdd3b8762dcf0496b4c2f0228c29408a37adfd4873ef440bb0450070c060a2cd7fdf666a6df5df3f0127fecd4816befe9acf5af3597924e0c4dd69388203457498782e77f75a4460f070a73b728b9fb38f59b72eed262b89b1d953ea9a136b8d270e34c8eaee55b8bb8d09dc6b687571e4ee25707738de7077121ce1ee23707711b87b08dc1d04eefe017777c3dd3de0ee1db069c3ddd970f735dc9d03eebe017757c3ddd340c3a1dc9fbe58c27bfcb8fbf596177638f9a32dc92aa544620c75b135d26fee7654ec2f7692da18478db91af5507f5eb1f784c17626cefb7e58f3be162643c2b5abb31010e8c3431b79dee6fd830707ffc1b3fd070f15770d7ec088f01fb0eb3f6042fe03e6f21f4a52e03f945cc07f28c9c27f28a9c17f28a9f90f252998e0456812770cdcbf8cd63f286580af312952ddfed346c78b456a6229373860d5fbbe25454a774dbac101f57dd32c2badee3ad28c6bb746c9aa429531e35fa14b729856e98ebe27233d0f38708fc3bd1708ee9e917b344cdcfd0cf70854c1e3ee6490b6d6ecb63a24318803c2384eacbb1e45f984a0bed001474e5fd8e9db58be17dc6dd75e3b2505064e29b67d410131ee1218430c77a698cce96985a5a82725b2ee8b674d509c42a413625252484de151544c0a1494702ad634c309bd95451cee3e81307a7ed728b8c8828bbb87611650ee1a976b7913efd3e83df38977748936d2d526184c4689a8ae965988e0fe17dbb098c361e3dfb4bdb646e90e4b65c2028c27764a716afc5defef2a5e6c4437be3a14e7232cb2c06cd76a6d4b982845c5162c8e6c960603d3054c162c78b83b0f9836dc292c85268af7f83a833c6629ea2e0633030346c7dd41aa6dbaa42ff2efad37f1da26302c77bf620d0d5c01066ffaa2b0178501e1ee5764b9e2e614866f39faba02c9f58f749ff88a0caef0ea2d475f14766d78f36fb38e35dc893a6f59e1fa26fede6d9babd9536211a49db76d6d3d3d306dee7da3bb66932e193fbfcd66f3a6f7cfa7b2fa7eed475aab08e3e33d6b9f095005972ab63b856dddbf287d51d8eea4c1607adfbfd82cb191ed5a0d456770eb9ee7f753d96d4b9b4dddc3607fed4dac65f8bbbecd9b0a379cc27edb1a2abae01b0644418590bb3eafbc266a1aa27b57baa335008d0640a00154f094a22ebfed5a5bddba01413885e1da5d92a23378d3f5764f18ac013e8508dc7d36db6f24c49d8807a9796b0ad9e342b28af83480bb13ee3bb8bb047c90020823e00ff8c343569c2dd5fd0880e13efe3e4b1eb3fe0dc6d3a37b9c05250a58140288e20577a7b011effcb97b9c0e0c1632c0044e77a538aafbbbdded60c0e83d3db4533300c8b954e27deb0d2a0c1720820508b1002d0b204b51c7d3538aba1eb3e74bbba97efc05302de0c8dd297df9f7a3802874067f579ba5aade3be5fece18e1c2a5f27a312162427774a3d5d9b5678245e5a75d7b264a29bd545aa0bad1866f1b3fc489356f7a13772d696c686e689480c164889a10012644f43e19eeda93e148e21915acce6099e1ac236a3cd87aa44c988859d3822060c8dd7fc497c2ee53d83de287f2d4c8d79409130abe6dfc2e3cb87b166f4131bb2ac8968c625031233a4475a38dc15b4f40b1cbfb7e8f59cb9effbc693d9ac4a2b8ef538dfb3e55b8ef53d1ced02c459dd6a11e2d8e028385214ea84ff22c4f312482c1c22f6baee5c7e15cb4db96b41bca51294efdf9670a66294e69fd524fbe949136cbba89e86b28e32492ac46643582c17060b0108ba1fe31bc3f8ef6165ab386a686c16ae46b188c48b424ed8432cd1896c16022505d69cd676ca8e6b312dd7455ba528ed7d69b5179de301c8013707b51a37ae1e2c57430e6c5c74db3cb1c3477d982ee2a49e98d75b9d96c4de35b97200ede335b0184316dd7c60470d3dbd2ec0d67530042eed84900eee0f823167d782b890d24b105bc67a6d8e6b4b5e54a521a266994b466794b220a1c2976fafcb7bb04258970bf0ee363b8c57a1f092ee163b119dff65991b081556663ae39f30cc7fb3ac4234efc9b88cbb5ccbf6b2e34cb7c2b1a5f43b9edd1e6c65b69e1f8fa241aebdf62f80428301859436c0b4722a5b1fe2dacb99a476839027470866fb919ddd15eff353a33ed9ed5307dcdfe6be18cc6b4aea491d69514ff6b2159ff6be17df2bf16beaeb4ff5aa84f2b6335ed26fa4f5afaaf85b9bfba5a1a51151a01b55f1b411dac320bf7eb22e070f7712c22ccbe367caafae4c6a40e8bb8e91a16211416e1c31dd3c270bc98a6ed48e2d186445081ad5022b63811d1c4658e5d2d9fa8de3dce8e5cbedc4a77b418971b18e392fbcb25c8c54543a8e1ae87a062081b6c94217caa4c08322489c59d798a22a64fda5b8ee63069c4449510500e0aa1e360106a5c4ca33bf1da5cee9dbe043123eb79e5c7207c6e0dc2495acd7fc993ea2e011126f70171b04ce046175709b680238d9bae4a44444430d8dbbc4353db7459c37d5f03059d4e24283dca13a0a093e8476c4434247e145cbb4b4661f82316737f433d2e7d7ea5fcb7fd849d48f24caabb8e22b0c03d0c75b5dc55f1c730040a3a91fc9c24c6b45083208c0face0031670438d0f4c39f11da009971b413c70fb9870afbbe29ebc0325f81bb37156848836809865beb17173630d1110600039aca1658d57541c1c78c2cbd7450049b87f481cf1443bb6d1665a4c6748fc28a178a50caf949988bec625dbb5d8b64f1c9a65be8566199ae51902059d365daaa180a7128b1e0a3863272f0d39dcc7fa9f2b0d2adc69d2d07994fba46103eed748ee9f11ee5f11eecef28f087777171a55dccfd8e28c1e1a70a2011132f025032406ba7c42b87f410001c2fdfbc1073239b8c8e0dc45e6dd4566e6ee34b1fa4a35572877e7c21dc92cb3d2925966254c4a9175ac1fe5fe6dd9e57d91c6fa514d1be328a9f08da24650800bcca84093017ca00d3098c0c0d0140c6860b09102c725c5183dd02bb07c378e293ca0610d2a46f04103131142b6f4000a028928a2e03141102182885181268e5e204316002668d0b82c40c5dd25e0aa401811c0c14586072e0a387189c9c16b8a18a38c7f01b8c1fdb3a106291911119111209f9f21a020285b5f6c445f42a71124270d5ac219c6d767889d3e19be18aadc9d4836247e14d704bc78ab0d9db7dab079ab8d29de6a83c85b6d88e0ad3640f0561b38de6223053c685c0ad0c05d0aa871d79738dcf5650d777d8980bbbe60e1ae2f5ddcf58506777dc15f66eefad2e4ae2f4adcf585c75d5f3e70d7171a7725e0042d6ff5e8400320ad2e7c70571732b8ab8bed2d3450e02d34d0f0161a61780b0d2fbc85c614de42030a6fa1b184b7d038c2dd737eb47244e0c05d22e4b88bc81cee220202771149c35d442ee02e2263b88b0818771159c25d44827017112dee22a2dd4564741711990f9b1f3ebc24e12e2f3eb8cbcb0ceef2a2739797ea2e2f327779297297971e7779e1c05d5e78f8d0e007064940b92b0914dc95041377254182bb92e0804683327c78ab0ccf5b63e2f0d6980d786b0c196f8d11c35b63acf0d69825bc3586086f8dc9c15b6376de1a73bd35a6e6ad312a786bcc93b7c624796b4c136f8d31e2ad3125786b0c116f8d01e2ad3135de22e30e6f9151026f91c186b7c820e32d32c4788b0c08fcc0b1e0021b9c1a1c771f373d6c7ea0e2ae1f9adcf503cc5d3f7ce0ae1f56eef2410e77e771817320c50a774971c25d5274709714ed2e2954dc25458abba43c71979498bba480ee9232c45d5282b84bcae7ae282570579435dc15858cbba288e1ae280e70579428dc15c500ee8ae2c55d516e7057949cbba260774519dd1545051f1ccce0f0c8e96141109b1c8f0e30a893f1b9e0eedee42724b92bcc94eb8b39dcdfe67dc51fb10833820412a80f652284eed7b51a9e218104122813223ade9f49e2ac2b5850b06a6019b18a583196112f663b63edba220c34ba98a3842ebab80f57172238065c8811834507b8d06274db56cae79a71ed7573737383736bd16e673be64a318d791740600ad4b6e6a3241470c51404780013ae33788373f178e98d391666d4e0801cdc1da0e4eefae6f07db2451deedb8a96347548ae2dc02ce998ad59b6c586229fea994c2c23493f620b0f3e215a88d1628b535892f690d0c2c83d8bed54eb6a7e4f59e8780f0e58b8804589850ca6e90b576509c06208163614c6003066b83b13ee2e840060a608b9d5750515da96eb1547781659b058fdb90456c8e112f2e3fe9382bbffb87b9fe7ee59e1c40a20ee5598e1aec4b6631524858df775153e54c841615967900a11dc3da21d1df74feb72ee1fd5a9f397b5fb97b56b0a21787062cd32a530364592298248b1e4c97129012290424cc65af74e528071299830cfbbed06ee4a8015526491624a8a97bbfb2480948287bb1c4e6657baf3b67769072e3be8a2e8e20e4314b9286ecee4c5e4c504f6e48a02e68e6b770927957ba7dc3b8de38f632cf74e204eac343b7e595aba9b517d331e5f679328586566b3350aee7465a2e0f83b72df173fef68b6d26bb5a5d2fd3e4bfab499d6330aea9dd76eebec7c717e93beaca897c68b739809635989735294b64c58b6b4b1937e92666d9644fa124b8d6f84343e48415da9ad66140c359218db9ca69fdbdbe65caed7d2bf89543f557e29ea82a2062c509441b05917122073461920f8fc861351e8b78d3f66fc2b7489f95be3ac89652e279c30c1dd89d05d69c6e56b5d5fac40f4b1d873d32abb8f05e7a4f1c7fff15a517fd4d21835fecd67d1f8fbda26526afc5d6dded5fc2828a3d4d69869ebf368fc1c1e2f521373b89a98c0521355b8bb26eb792d7875b509bcd8d27363270a0af98bb73d3155add14a6be46b7c44617f2d494bbc372ea220b6349ffb6dbb5aea13efa4f011a5959a27bd6f62184edb9c4fbca3bb52ac291ef3537d0e2b5170fcf0f329bebe7656bf46fff6f456f185f363b1b4845c426d890a798a425a813ac59464340a4916438a3a81221551991494260ade37f12a024268962c747cca848866c9427774707e2c9f6b14d4983a5170bc2f297bceccdaf4fa9ced72fdd1ead98cea97aed5f08f357f594467b313abe002a575d723fa1aa1e86ba8b43729b336bdad32a194d216280c4629beb3d98c22512234e34d65b7587fa475eb7d625ac37adb7b7a49819727dc1d2c5284c2461bbe74ed33cdb5fe91ed5a5a1def9b3a24246d8be2c5f5ee715dca707707778f3381cec6a53777b2dd3fd93daed6dcdf5978f18ce634dde6e39e8afe486b78f7385d246329f6f66f455be28bc527f38f575361a7dd3f198fc6a5187642620ddbd519a4c160a5a87321a1c4dd88468d8fcbb5fc2892b4b977923aa28b0edc750412473041091d919202719582bb214247b41e42858e4849511b2d423b021f87a9c41abee9aab475b6e78f24d6a1e63faea43811935a8fb7c2340994823773a671edee1d1dfa9aac49149c01059db3998c96f5ce3426f1a558dc395ab3b31ddd8f77e945241bca3869f637fdf9770d6b7beb4dd46fbb4ff5240fd5a2ddda8ad68c0d7d0dd71d990ea5b589ce886443e5df760df3e870110579aea5513054ed5afadae696e83de94b8982b39914ddd9ba1f4b1daa29a89b5e36bce93e4db2ee5c7bb4647474452c5bc2323dfe3b7d599dc437a566506043076e55d33f47ecc4e4f201c98e0f457c00e2438d0fde430a7ae0400f6ae0d0723731dd1941a787ee8c40e96b040a33317d8da0435fb44a0f50f4f00385ede8543a7a7839f87d573e737503135baa70d7becb2101ae2d24349909718fc6c50398a75d203594e161067707c31d2cb001217af738fab35fbf66f96df5d6a619ddd13c2cecf8f0183a08f958c086a11c44e042aea53f399c39380e70b88f17d3a8642a974a8d0a8d0a152a43a84c711b2136204d4e0062d0b2fd525e00ffe1863774063349d6d065c31160beebae5fe3f28c18ae1a7cdb180080709c0b003a3560b87be92e1a9870f7292951a0c8a4be284f0887c0970254115aa8d0b24593f535ad51678c3e8e3467fcc69bd9f7a9468ba318cdf042ee85a919cc19c219a4cc80c20c4b6638e23e92584906387cb64f7316e52e1982f0bf388f565f2cbe926490c960c2b86b8d5e7c5f2fc2b4eec39acf5a8a3a5cbb4ba6bde99acf58ac14a74a71caa8c8fd8b7d4e9ab87f44ee1f936f6889fb0753e2fe09ad5e0042040bb8bbf7020d9e05de38e10255e4baa0c3dd3f9a65824bb0c60f2070f7950a669413150052260e776731318026a02eb8224c1277f79af830e569cb0d488071770f871084b09367869c70f78f09a9491b3814c12105eebec28007312418820b1832dc9da68820e6f0ca80dde1c4dd3f364ed043963a86582389bbb38c98d5107193809534dcdd2b8306d405151dae9cc113824de06c86f73e31deb4ca4c4bcda6503b03a576bdcdc007416bc648b21a3181b3ffa4d969eef36be0d7b4aea43563bb4c6edd69cdd88b170467354cff045cbb4b4639d29eb4bfcd68dde2932436a260fe5db3d9aa0cbcd59619d7f29b7a36d3373f553e357d5c2d6fae4f626ce230d5eb76fedbb6b9dff8d257bd5014b46152bfe83e49f2acfdf819ef6ea5176b2be0e7d98cd6bdf474bc76df3aa346d49ab19acf1858f359b1d62ffea54b50310ad25de99bbb7dbe7624056b3e6320b566a5b3a29906afdd74972b15984441fdb656cd18b5664cca1368cd4ac15dab610a5ab3826feeb609b99a6b18142d493b4d3a3e1253cc488aea280adaaecd5bd399506d9f333adaa78dff60b554747cbd7bdcebfcf74fa0e3bf7661c5b25995390c71ff84a4e013531a71779137dfdd5a5fbb8ccb2f31b9a3ed5d6da214f78fba7f2110200937457e20b0be0f582998cde8786dedf3c0fdebc0fde3c0fddbe0d3e0c3c0fd03e2fe5de0fefd70ff5cee5fcbfdf3f1f570ff78b87f39ee1f8efb77e3fed9b87f35ee1f8dfb37e3feb1dcbf95fbf7b97f9efbe7ee5e1977ef0e77cf0e77af0e778f0e776f05ee9e0adcbd3952e03e135170b375f84d57772a97cdc18aee60cd68ac5f771d475ba1fe932eb6a0c6dbb49634cbcfcd66a3599e345a5f588a825893fadc153bd1d96c4697ec984097d012a809f4bf16ea5026d4b43bdc4f2ed931edd611c92a864c28dd4ff6f450fbdafaccb3d98c8234fada31edd6a158ace6d991b992b6bc67e6d9b78a33b296595f6c4dbb69252b9dcd66345b8df110d3ee6ca986d0dfa759627146d6a7597efb5fa331fa54fee51aeb8063ca0881918a139c9e98e8d3938cc288d02aa30fe30b3a7722b4ca94f1c988e44d78a80a32a826240a23a24b51c7c333bac4224420442d0e8220d544e8db6a4f29ea60b08bcb128b6148db00ed023430f445b3a1da28b428523a83958a0a047d138b9a5efb54544a7caa10573f87ab2fa5f200058d5ec69fcaeeeaa46319ec71cd841cb6a9cee0c562e80a5f08c7f15a5c7e7de6374f291d933a2f1458183a3d2d4945214509914e88453dc9a4c210c60219701c4932c6c21716b4b83bf8e2ad3cf95d2c38b170e4ee3a167a58f8e14e892885218530589531aa7051c5892a48be3885f550b1c0dda76899b27346c23d219935e75c2bd4e11466d69ca378afd0868faf2b94fe4fba50485b934cb366997e5c95bdde8dbbb1be544c05262af018ef6b291720ab8899f41bbd867297702266dadfb4b193fe4f92dad80927e21c66dae7d328859dc65a548bf447edb659223d49b34b1b3b1d91b47aa18c9f34de9782528aba28a02b8a8ebb67904584e29292b9a08e9891b27973b74b51178eb74e1175000244fd00d3f485475794912813a23ec8c0dd6bdc15e5c39dea46cbf35fa3af17a52ffaa2e16f7c53f84261f8b60360ddf534022835707e2ce42533add99b868aa233b8c56a9658440206f1883f6291e7c92a6a1e97531d2e27375c4e6efc109ffc8798e43f4424fe43f471bfa15905009cb99ca8b8fbcd5d4d22f8e26ada4d4e9a6c98c48478337171a7b0f0bfc674730ac3b5cb64c49dc29ed4f1640b779a0385e5c7659c0b6b35fc04cadd29ec890714a6516083c2340a3a77170a471416ba96c868d752170adb355c1aaabb8e757fb9c4722531ee14a644ba2bb1dc3f1feeae82bb4ee0e2ee221671e6f9d2ee137cc0dd364b9d7f7f892f2cdc98dca779adb7c318597862e8ffda5359db04c2085244169e042200461819bef0a28b1f8e44c085bbb320e03d2048001cb085a74516eece6324c66d97863f62232ddb49e9fc4eaea22feed78eb5a8c8c7b5feaf75119bc2155322c685c26a196a4b29acf639a4b0ff5a4ce71416f51415854485081112c45db1a018902b16c4c31cbe7a286cfc1e1dbe6c088395a2cee5440eca84091327147002c629cce5a40627599c48710fc97acb322849ae2676347183c29a68e16aa280260668a26587c274284861422eb66f73ae4578dbf1c352d411bd41c4868bc80c0a13dd1d0c16ee5e773d8aed7a943f3f96f0e22bbea9759b09184c644c8edc1d28280a509425539640c1c2b83bcebfc2c54ee29b523a9943f95006dc8079111e1137873d2eeede105fd6abfb5108772f0820b6bbf783bb4340ffd77cb835f754d6e6eef5b08507edeeed409255f47418ddfd017ae7e0f9adc7e1eee1e0ee05c0ddbbc1861a001084064f8622ee5f1924248f76524242058395b2d156f342a9968c89d6c42ff5236ed2ff49fba57e6327283811ef8cc9aaf353d90b05e9e6b3088a949971ce483a33b65f2a2bbd943e49339f5251bbb3c8a6f45bd421656c7ed451ae4f1a914631b3cc4af7cd27a3dc3b9965561a5f36be1492ac4641543058294e01ad0144c6bd1475375d9576c64d506fcbf566f4e2c54e3e404041b91a352ee97ebc55ebcfe3186b793f61dcfd69614861eefdd490cf261df16d7f4977b40170e0b3c0470d26e758733567966ef45573f95d3d6eac725c3d5bfc0577b77161df2f5b7edd05964105fe803e3c3ce3bb402e20ee896e7cc11cdc71d85d200ff7a8f8a854f18706c21ee69c42ce8c880800000000f3100030402c1c90474452d18cbe6d011480016bbc70944e1b8bd32cc9410a294488314604000040404434480318328d1812587d7ed5910f139feaf04c03fd453ed280880f93f30b5645e6f41e5f33eeebf6264831936ff7ce8516281ab4900432f715f67088022fb8dd30bd3a8c11e1fe44ad83c479357b98c7bee4c69ef32544ed8c03bf7c3ca089f8c830f1b23a08c921ae2ce5b41b79e9462ebba8f77a0c3c48718ffc98ee446f1c44e7cc86afa37e7c8198aacdc4611a18360db9a80d47d41017b028a7ed4af6f2eb946b5b17524f96bcc75616fea5ec8875a2b7b8389cec7207945d3a63703314f35e880547134c0502007598381919304b245aaa5c20861e3fa15406cf538b295ea059d88f827be7eaf9fb05d57e45a99728d5de47db8cfa023f865d8b2b3bfbe4934c5057cabb13a4dbe8af7c3009aee06141ece203955fae46369ffddf5a54d21271e16625361b7c61fd8c0ae82899b022accc7dac0e14c2f89c4b8b0338edd8f8a4bbae1afd1de46c09382cf37b31992447d2579a1cd483521386fc1c21fc93357020291194e5a8651fecdd80b251e0b12b057a8b86e0953ec3f8b808dd103bc09fd6621f438838a1088112efa9d31a835f838636f8a885f63063021595b0c7a0d8c83d95e630fb9cea9f262babe8758290c9613d7e1ce3baec8ce8d956f7aeb5c73c30200e0f0611d7319b521b9f51fffab6c73e4e25e23f809d1194528adfe565a61fd0b0f6c1941ad1963bed39a793b8b3e2165ab07623304e763d979f3fdde3a68b18b3215fbdcb47a27b15805668582bb07eb3176fa762866b0c9b2ee3718c30538bce95722d405f786ddee957e168348b6bff1c9c039df7f1a0f27b13d0434ef474ba9cda56ce93209f801c60c0e581629dcc457bcd599bc5b6fc4e70cf26c968cfe56098147ca7d64b86b943333e93955b471e5007c5febe9f4b33d62f6a38ca3f8ccf4dee45e5a9c30ec62cb7b5ec779779685df4359dfb44eafe4c44eba4597572fccee8a89936ff6f13f071863e15e8689b10a4f0a39603355028d80fe81238db0b90dafdcdade8f7a23d0d0935182e39014ccab0fb801f07ca182940166322057321be16b7a2477b68518f98ec6f53dc1e7a07c6bae794a6d5f64d4ce3c47487f5a4c09e1c8a192f35ee2f7db3979d5c09070b34f272d388b7db9d608cf95a7b5efef30238f661f7cc07ea7fb27659265fee6e0f251f7c25fd0023021cd45e727ee0fc570eddfa93134ffed58877463a38bfb789c47cd648b8e5ff8ae6b806165593cac6765738e58dff8a1e1829061eeae81b66c0ef05b929e2f6073848e8b9455a7e4ccde71819826cab9d2df92c861f50121f748693542e146bd25e3f251f30e4a3c1c7fc32cd3839f40d51fa9ad40bed8bafd5f49eb47ffac498f02b1c0327580e173256fee14ebb7753e2ac9f40c1b2939634967251b0c29bf6fd356ce2db6f87f2af75a7b73a5ca4465848aff1046102c42bede43fbd239d8fd3b8f5d525e214a6d2f6c80687359312296d981a4de593eb94e354bfb431cf48cb03d74e73dc7235242c6b102a62bdea0d5cf1da997e250967eda5147b3915a0ce3696ae95c6088d786e0144efe9ea6f802ccc406ab06e01a4f5cad60e08fdcb69c19888fdcac85b0f48d95e020c7da04af68fafe371129d33fc478d1bc05d7825ed88201d49421c0aafc636081bcf52852d00e2d3013ddb6a41bf970a13c0269aa3a09c06ab5cc94688e1786b1a1fb9b7f8c8fdab90a54ba964bb337c94eeac1fa66888569dcbc76304326f7d58a14b1177ccf274e2c61e94e942b3ff4ea20c88e28eb9fde8c89a2666c31edf8b9e948d315f7d3e3bbf86bda06506616ccefcf6e978494d86372455478deb289f20de51bde409f6f96b701961df493273c80147e00175469c3a74bd366f2ac9c602e79b44ef7758e81f9ffcd25ffa0ad85b75db6d8d78ebbde8f7f3a0b546fa957ca4d55965ffcdbb01e0341d24f8b26de73920effd4d157ea67fbc04f7d01ff863693ce0114fc603cfd50f4bf896dbede5bf91ed3a77dc21da92b5339ebc8e3d47acf799042bf9a8fb6558fbe3ff6523a2addf77b077281b1fa9ec1578ff5471246e541bde0d9f7f50a26e125cf92ee0f9f0a7fc601f1bdcf470c2c031db9de4db9b493fc753a87f1e71e38345ec1f62edc1c6a0fd92fbf36c0624f235f83a9ddd032ceeaa0d183de4ad87dc8689fee8f7a969f6a211cd46e02c1eb27f1ebf5d471adae23225700d8f618970a115ed16878757fec360d0a2e470ce90de7fcfda611dcee425d71a8205845f966e5d7708c9c67670a0354b7ff8ec1f01a8acc9c7043cee56daadc339a4f48f00a318c5ef539460af60ec9f17598ad6355cb1e637bbfcb2e354bca0f707339bb0b8b6bf8dae32c1bf153dae5676c223ec664c3651b52160128719cac70bc5e28a8a1fefb0a3605522e8232162ba07dda2217a33752f7f98b3b7dcdab4d8b379e73a685d564ad2a707a3070f5a41cd2772cbbf700b68ea3d4126d79697871886149b12c700194a3166197ccd2902a0922a0a4d3853190cbd5e7daa3d5acba6f0d5c4ad1f5e865bde7fa1c065df0ddb6fbb69c04b91054847d45c55d3d95ea6464d947ebc1f988f07f5855f980dbcd96c580cf7c695fc3078117cd84d58fe5c4a6782da668b9cf94087fc62298c44d74e800282c792a03056b67365a71b6e6469c5c86ea8c9d3974fd8b788dd69290078783867a50e2d3f38b3ff00298163507efef05cb66eb4029f2da86fea69c6d3193514b5a523de9f850675bf69333d0f340ede61b26e8545e249811d044dca67922b2202edf391866f787f79876215a282db848f0a6f966000fe9f59d4062e39239c1f3e7fb0f5c5434eb8f24c2140d17022ebc198f21c0c9e770157d0b5984193b8c7f7755209791fc10aacb83bda2c1a230eae3aeeb53f06406ddd091b406f224602bd8ec02f597b262172e590ff1ff63b7c189ac37ea0c3d02cf4b78c472ad600f031b884b57cdff97922ae6de9fe1c24dcb4c0763197ba4a4fd046d7fb2bd9d2e37744e392e943c93f5d9ccdc7119ea979c38f60fd43b8c4f4e288dcfe753527e07acf3114a98573736cf5f92be14c2a496e4dd7ddd7eda022f79873968b17de2a0c79c902073990d4fd393eed29c4abe1ff05a780c21062b7ea2a1fe627bedaff0895be3f5e9f6f0f8dd7fdbd40f1eadcb1428cc0395d6d66acb929409785df17721d13b2e533084da35e37fea83d7b5c97c1befcdaefd216f7e0ace087ee93d5332b8961fe9073add42c886d2e3ce7efc53291fac3f3ef65acbd785a2b93f70b6c649e259d6c99b5aa5afa80f508300ababad5d7b32dbfc5dc363a4ded7f5cfd43ccb9b1b5d0c02348b232305ee7b7d161905f2c0d829effea21dc8cbd2e920621d775166efeb097c2fcb495374bb08d0733e79b1b585b3c1b81577c5faa6fa15fd73a218637729363caf93e99e341a7f7dfbc4fb0702ebd992f6d072dbc42ca80f8e63438725a028679e9520f5ef53f5a51ae687807c799856858a9be2e16d707c52b794cf9d4265ae417c5999227daddd3abb7259f72120bde23675fd9fb4c5cd1f244f5dbb2ff05e622814ae77c748643d3f9c5b8fc8c5cba2d333fcab4e39059bd902fa55e9f1ecff27e0fa71bb02a466dd66b6493cac9be46b13ed8df509f6177b80a2bd84c4b1bf7b365c28460f69fac236ae9c9cd92be273b001231439810af37d67e1d82ae205ea122740da4ef872743f4eae865a687c8d2b18f6811afb1007a7cacfa89084b7a252dd26b3ca7d83674d6fd37d79a5b63cbbbb3c04f3a4622291287a647e71d313567899376866de42385af8da22954ea177748832a9ca8484673be8d5dcecbe7c10ec8e72cd913ea0cf0bbf382feb2e20d738720473f053210a8d306cfcf19d23cc474d1cf27d9bb2409df5e91fa6c2f417021f48ad5fd64a1308a60152f73b2bcfe0ed9845dd08f9a867de9694d701be3e7aa2e45176ecc644d1f83ad3cc0306d7cc27e768aa2b3ca5a49df7e81a6125c46de727421b8660583ae698083ece0b2a28ab9c07d474b8124fc408bf139fbe57133315ffed141687b7b0be04b165dfc1f5dc800b9f832a8a3900d96ab86223f56dfaa820515491ae85ef8f715944a90d9d5a022ba0a2650634a1420b8648a7dcb0e61c543f35ce63271540e6a89b0bdccfb7a08473403db4f01230eb969f8f2c089082300e771b615808401b11a0d3dd679bc32dc256bf086abcfb8bc6f051450b5206c0d0aa7e32d17fcd5590d7f37f241499c07e01500b8fe4c57c04a3617ef6a18f32a583f667dab116e4ab3d254e56e42fbdbf3a180bc2259efb103e4348fecd0ea7acda7c316258e51f60ec01cb087cf3f0e3ca95dda71551d204dca61eac6b52a105b7811b4976df0e4f6b4c68615516a37131e1ea7019da74cbb36051cbe8c3071f51dbf753858fa37be3ed2321f2438ed55a0a4b971c5d18912f1820f773042780239cea7006f0c53d1f2cc9ee7c4280bb97676461b8b4da4b93966c03afada44b0d7837b5443ad8bff8bb8bce56ecdc4ca033a0f190807803950342c5e78435cbac019354863146bb0fe8fe529f64175f8f888e9611db6e57f945739f971024493996399ec6a6523364a61d671c5dadde37e82cc9d446d77bf040a02c768117f2626a3b98d985506f9dd6eb91b1ff9654c7a19f450597c04a9cb42d9d10dc25382530ced66b268356d80eb279668ae16ec758398c0c6dff40f0c6414467f14f49d707c4140231c0a7cdf3977d9bb98898657117576788078cd8c103ff55027ba57654d3830c4fb3df19bac1c84657091e61344db6348041b8b943e6a52888501df8f40a1ccfc3934e4654f6224e9db06cb382e8000088386e57ad77d53522ef595b8bb7bc9d4d02b144da5a2638104c44021a76f452052e8e49829970578e8ad211291d7b7c2be9c22fd50036c0e5ca27df8fd9a0185b141201584a2f5b713c9abc049a92ed77934a4a04bf89b325c1c6f4c1230d94d18fcfad81e46d1660ef8c6134836182057176695fc03e321183a1066548b5b8403801574dea7e91edcb4954451cff214bb74a4540f5a6e03cd9ec4429de794ab630479380797efa1558e7560cecc6293436914ea96afbf98b111289be50f9cc557fa9ff36b467de91494f2a0b1f5b074e50a274895b0b0b8f53571e180e7de77e7e9e26e1885198fb045e3191e5452647a4b4b46991c590b9bfc807e9a7ddba1040f18bad3ffd383b8f2c109a75102de9fcc4f1e14f2f9f223dcf7e5f7905c7e9f9d18f63558caddc1e277c7e14c0a1794a0ccb65842b057b411e2e4249ab44ebc82ebec08df6900a146e6ba2a3f12640b1f752b3185c19466bd11efe8a98a099d41cd7620e0a83b8e92f47db9a7b228b626e0f4f6dc74b001773da40cff2b0316683d8807553fc0d79a41490ec376bc3473ae75a7a3492cdbc9424c40b6829745b042bcd763d805e070a878bec0c74c28a25adb2f23514d287a9717145bea193916de2e915097d27d7450f60b98e8d2cdd0a129a83b0994826cb60eba72684a88b38b9bccf0e9c18aef84cc748c091f8f1f2cee60322bba8d7e516ac9b42df2b35a282eeec57dfe126fa255c390efb6d88f53135b2e69808843c67eb2fcbc18bc147ad8d00262d6e6d3d1180cc1e963cfe1f12d2f99c30e39c9294823e6d4cf2d7ceb5426a782409e922abe390ac437ad5ce1241c89d40def9c148ffd6ccf291c2fdc8c688d03acebdec8251bcc27d2ecd60325fa5a4588f27df9be329a1bb0e517000281a295e622f00df1d5c9b49c600d7416c075a6c49681529621e06cb3f01f8a5b5254841ef6bb783a8241563bfd5f0f73fe9ddd8943f487f2770f1faa0292240001a96104212a72a6140a31a9e9e9ef8c50618229d7cdcb42ef51733215b11b1531bd8731b3fa71d9d2fc2dc6c521f66696aba54f3ddc8f78b8b95d85284ac9d08f5fbd79654c5867a6ea45fc18bc67ef2e93d2162eb463cc63ae8482cdbaa84c8935c29decdcc23c14b12cab295cf0ac51ae71f6177f130add161d2c41719a53c9605e862c3100caa7b21b29d9339213e4cb1c94c7412ae6d54a189c97398754313757bb3e91765f5dd5e473bb1552aeb3c44a1a434cb2c429761fca9fcb354018958edace1cd742d9bcb773ad652717683c5dc5dc5fbf931820ac39b833eec181ca687552707af069fa0cd944c18bb22b122068a0d8c9d4423653dfe110da88ddd2a27e64c42cae091875d96bd4e000ae415cbb066b30a0b1e830541b6425c18a96d4c8d0b764c5650e94736b6aeaf5156a0bd4322a61adb855a4e24656c55ed671bd2807d006f562fb5fea3159acfb58b034b2381517fcda07bc368e4ea6b08e47d650ea7b96a884aafc276ca0d655ef7dcc9862f00fd2335a4c30db6d2b0dce60848fb56029c899e0c1bbeb4237663b09d840adead76cbb9b04a045b19bbb9ab1c62f7680f6a9e6098ae1171a86a604eeb6888c53bf00f544e8bac7dd05f16b632847b84bdf0bffa619147104c0885ef11460b1bd00b4ffaf89be9f1a47d3070e7a61eec9b515ed3c33912d7790b02ca741fc1b9abad19dc8eb65db52b13733441fbb68036429e9ab35743839f42620a1ea093d603705a4966d8266fadd3001599ce6e43547d2c4737ff1a35d13243b34d265bbcff58d55757e0cc5c9a86585719f5d7446828518fbac1cb5ac8ded926d4287a72a0d2201b10d3d7a8b359c70e3a6003d4f26ca31cf55c8ee949caaa649e9b89d0b0521eb497d23c6ee2b56ef17c9d27d4156f7f1020245f3c33f9dc81532d93863fa8506309431e383b21dd85c127493d9ec14b95b6f9ad2645c5cfdbdc4603e07a0dbb9551d876b7d614d34aa3c0a92a6be59a1a15b52b23d747efef0b3c8c83f51539e3715457b6063cb3bae6815d234b9e99fd463f43c5e00ef479ef24a2c8482476db06ee287e36bf8cbe459aaf27f6d5384a7dec272fba8c48e73edebddc05b2c452ed3ff070b6ea7a2eaa22cf8abb0eaa4f0676eb2b0f9ce567388cbb721fff5ec0920ca6beacf06a5bf8764650ada51e0d76a76c0a1b32c1867338d6409f60b116e2a595dd857e590db1d20d4cfe5ff2652af48df948857745ff1a404bc2e3b692a9999106d4df5279cba05da07fa6a1e6bc75b3135daf6a694709df5242cead25d78365bfa7f5fc93a2e0d7bdcb49e03fcfd7a19d093e80774f3ec639b9fe1bd362932d316bf3ee1105879d5c9780c9eeb2f2352a7521cf271f66b3de6d19666c54f68cadaa080d41a7679d5aa0d86006301ce35290688c89f071e3e66c77a2b0306d5508b58d5f0911c08badfcdd44c9a29a35e4dc96d0b168ff2c8e44ab91604392134e3565c53e14166ef226ef9ae7bd8f6c7fcd3b47d81bce1b35ce39b36ecfcb255124c803e534129ecb0fe520ae71d6ec0f970b9326e7d9269ec9f49b7115926efbccb9353953376b535cffb95b722b907a60122ed47bc2981f4771eddde77060100d674f06cf85316de55237a2876b2ee42ff875e5c4ac438e3333eae98ee428dfad9f9318d1c7c36bbdff00fa2143af1e48f04e9f3c56ba6856b818687df469cbef16f75b1038fc0fa6f3a08502de4fa10012d005b1907126844ce75da93b1ccf7422eca4d507c966aa523465c2cbfae22a0234a5fbe71e6aa8a0dde467f98b5e9047b4ba763461e6aff2b9fd8d0cc7696cde3cb66b8c79b9cc8f1b09cdc0e5ba468ab36b463ff7ac5a1fbb56de20a7289e261526a3da96b43af24aa17d620b28cd8feda4a53a9419099ffd56b5e0271873c544774288de8e5abf39ccb07a4bc577328aeca239d7a567a26f67aae07eab93763cfeb62fb9adaece9e6da4cf6ac12429ef54e830115d72c4ec43c0b9f13349acf1748036047c3ae76708be97a1fc6bfc55bcabbd3acdb6ac0b76e063af5136416517dc4982009963459c2c68d1fd8d471eecfb6993eb7664fadc4146c99acae96ebff0db53d5d9629e4931da40be8b6ebfcbb512142621c8fcd6070d8882c94f382bcf1ff3d1dc45e3af7e50143b9040e3f133a3d0d8c37fe96967270eea6f2e36a9aaf1d72b34e670fde9d1d93792c2c7c174d3e09ecf3a0f7f9a3f285bd5bffc8b8651deaa4f72614faf7420d47b19c5e1413ccab47d46119020cfe20d1a051267de54c5d53aa580c5ce680b54c4b487780fe29aaefb9526a826b16357612678f9de4e180f33e2d9f9d9dddb0351605e231b18f077ed3538004920d1e66095a722dc1b8a71d3de851faf87b0651c6d2348c01494fa45387554d9bfae076ff53018356924fc07fe0f053d83e8e588ad84bbca8d936e7033ddbff1ffb7694b107dc6c1df4ab15069a76a021b26e229f668968131d6c0036fa5f52a6e64d39b4f41d686eef8b0cd13780ec006c2d51b614db2b9a016d00700d1c1a57324236f42316f302dbc7ed6e9ae5bafd7198ebed49ff1a38cbffce0ad0fe9cd8e11a3d5f2eef9feaa826db9d58de1d492df5f2188da4d41fb3325dfd88a6058d5a0b469b7971d9df8ff3bd811d3cd2247073d7524fd3be6d32173cc841d2f61d0c6371c85c6ba66e66ae79ab1bb43d674d758e6a11e91b3925c36e24beda922f3f446f27c8d1721b96e8bb06009db77f7d8a15c5bdd233cb78e1f2cb7ab2c0be2c7026f34ed9c60848c1146e5667251a28ad598724b80a7f33a1b4d2a4c9d79e4a624d08752ac2a0ffadc41f3e79b93383989489730aafa6163b5939cac80a04a582d71df1d79b2d95900ef99ac212b250aab023038b145f3807907581c113cb21f710c19f3e6c631e9079902e1693dece5756a41137781fdb15f25b377e098a24b44f034c3567b43887e2d8f4f3d0f1e568bdc5f136e9af62848cdd0676dc439a35a37eb0a4900b412d54c6b1600db6669ead4d81cd7e8a7d3aabfbd773f12e0098c5b11c63e41ef33c9dcc364a15e71e73dbb59797265d80b005b7885edd5c8dc2b6c6ba7ce60edea56c6fb8688a37b47f03c201a6e8ee789e16e3d9809880622c7e1128de11c8501e0447de7c5336ac3af5e5487821432c74805731fb81dda238f2b5f3cb7b063c275bccfdda8f729c4d04beecf96b872b6808f4e1f536f24dabd720e6a2570845ee947f68d49085b725e75bb3f02ad6b35868fafd3d4ea52cf9a48eb71de06b7359c04ce73a4ccb0b30a2bf047656d6ed9b49fe2a4ae342b97e9bb3ac86bfe8334f7bd87a3e12ea39617703561eb1dc28a5d3c50e978740c515268472bfbd301034d914e3438af0368963e4d95137aa97ac3e7c6d19f71a116c3753304b17b29fa1d02ae553402919f5007c5ccd6b5f22e73bd5fe66815aa3f87e93ceacd4ae838677f1a7ee30c58be1e6161f0a10fa381969ed0eb7a64f87b10ce89f3581f27266c1d15c57fb3964a6ab6f05b279a1bc6127fa1c86a3aa4cc88dbd6d531cfd6a511c31e43c7afd01e2049834733489f7c06934a0d35011ef107a605e98d807745a180e87a801787b9ccb6ec41d4753238bf498f0a16dd3005d10f30f2e4ad46c803989b10e629d4f845a1fe5a53233e0190f151f68c1649c0b8f32cbc8bf765ca8d46620221e111471001d74d280480241b3ed16394da144e6388597528a96945fc014f406385d45b5a168654562eb5446feb29f1bbb75ba05126904d007921e5703bef5c4b756847338371127c61f67b19c4ce5ac549d237b1903c2f2fbe43de22afcd1e6d02e54406d4206b4a8fc7a6889f23e1b79b940a5896d6aaac5692fbab2c93d2b16ed6c41ccd6fb0a84bf08b35e69a40cb4f07b7c12053f1666a04b0cf5ce880096d453705eec62c474063fa96bbe213d9725e19fd9ebd28b60ac19032b6368593d54a6ae40dd68457429fae18c63e405ce29da3860d9afd1dcdfdf64f46587c6b4090c7631b8c8551eb141d5de4a34e910521998e25707db0b54a501e97562fd9d5100bda7f7032496396cc7943b03686a559a7beb67a3b9311c38fd0f3d13f358938c72708d815c6108c4aa32285697ed1fb0efb1d03ae034e7893f574ebfc74055690815894cd6c54adc50f51a1633b74f741697b052eb2f327f3c30f5e3707ce680d74e95f376511005129c6e4155f6c02666e48dc99fe7d62529d7a5ea68ddf8fd13edf89719132d0d8457fdb6936ed1706ba901e4f262c1bb4926b5fa1b7ac911f2055de2d5286ca749cf5b1213626c8986d002d62f3d1463cb9434309e4e32a30482270c7586aa3c3c893355d06478affe84e9a1ac7625125bb8f6737b29786942867be43edd4cd4081d55604d75a7d55b2d33163f0c7d0d521ca2b2cf8b7d51c0ab51dcf1fe54f8fdb6e2a6115e20cef382c7993f939a43c66482388ce23d1cc208fc7fe2360a64b59b67babf359709f04ca8fee18607cacd256e88f9d77afae3d1d5eb6def3dc32bdf99e672707d80530523cac61c969cfabda263a9dfca878a699785e3404acaa49171ccf0013c5f2c55bd73a58b46398052250644b5c8009bfa6bcaba512b89771611f8429f389e3dbf5370430e8b09c88a51443c787413b07b03d24059db1a6db73378350778b44fd6eef9d50dfdf2f8ee825afaec9d2fddf885eff0b0f10f29164993e13f216eee8effd9cd7a17a9d7525744842c895a1faa8a8b5864e8e60cc766e171b4609a5743bbb844f6429969e1b0f5d5e8cb51116bbd097d25996ca4a3441250f2e3184ce79418df4d3aaeb54d1fcebcd0fc1190350069708bb4911967e9d12295d31485c144f2d739e8234ffd9e244878b093fa87ebe6718fc9ce94d7bdf9e517f3cf43f719a32f56502cc9cd13d5b0978279888fb9bfc3ad79a2ee7d497464a6489f07507b7c4fed4ed17e57fb5327b06ca9a9faa3713fbdb43b48bed16edea940b345cffc849bb6bccd789121f15ae479b27f0b7e059edc35e336f5b375dfa5b2526dec144839f24553eee2ee5f92c07f435a6100371cf50141ab7039c5fdade7bb42ef7fa0de47e1013058b9b88a9a742e2cd0d11d41885441beb935e16bb7f84b27d696504d39e2c225178ee5f11700c88774f8d4beddd11b1113e5927f93b0dab21f0ed5b2779d1974a6f440780d6788a9bd8c6cba1ead60277d0c890263351c6212d3fe951f181fddcc36ccfed33802504f61004eff8e73941d459c6ae1604422edd6cb6759953c95d77f412643fd265685bb7b7c4d6d5fae9aca3141d6b185156fc1186ef65c410085b3503ab1203a8714ec277a177fb52ad253f041264358a1503a4bd73bc1707ff12f893bcd6b4954fe49c125cdebd4722d1950fd4b4b45dc4f047fc0feae3588eca4ae91da6e3c857cc77d8dd4488163bb5c923e479d37e30c22082b34dfb15a5d61576fec970b49e42dcf0e425cc33ed0acdb9811010ea612f6b9d479e8c456b8263ee1f03123aeeb793dd17cc14a81ee6479c2ee5c8f24ca81a0c5eda7e57cc6b863d39aa4ad2f28a1e4001d3fdc5d10eabd0323803a8eadb8efb57727ea573a82fd8cfff82c8dc8f2ff4d949775a1e1701a25e480fb0a4e33db5154e5a197d42a4942b745374820939f7a5ecca721897c45e3f73f8e334b5a1b5a3ea388e5ac03e696fc931bbe0863da9a506f9c710609e26a3200d88fee5688630728e873031d7a2654c5790b52bf01b3ccef39d5683b856362f918b8cc4ec73ba17ddd14a45639c060e6a2558153c646c5dcc5c8d62eb4c35173677780f40e64932a4502ac91edd971bd4256a23ab13c95ac314193b179442c99323c2296dcf44a4696c9da18267bf5605fc94e716df6317b9e3a64087802d61583984486b50ea5e87e4315edcf2d7e95a6db1ebf1f019c3752a1fde153a8a65e1c2e748af6bf56d190188a20b5d9ab1d86140e1394a562f9c0b5014b7041110491dbe0ac594330d763e0ec10a4050d853e0ec6483fa158d24c1074e691d40dce1ad50be9393212c81c908d11630217be8ca1f36d5642d5962a79d6478ce344c42c1f4321837718148705a5c8cc328b081214fd6b77618f10001356ae33fc2f467fcfc1825f9c5023a070b571550d53baef7da9e9feb935d4c06c03819e18fdeab24e82e0d462a34050ffb98808020f5b0351f23ccd3962deb6cb0c7794584a008f28bbc09e8440abe81fc54c6dc1cbac67e51921c55bf5e55a92bf372272c4f34754e9c2eeb3d5714534bc27a466b886bff8d802256a03211498cd6f5807cace33403fa6546b336dfa4197c1110100f2d68f0b4f8196596dfee821ec17c16515ced37b8c0299931c60ef5f27813038769786a794c8db0d2970a9e293d99a6865c534bb18bc360701accfb0c83fd7099ed1f3c74a6eb8c8624c14a629aa2b6926f832170b078a5304debe84edb75a744aa2903579bcb549f6cae842f7d828620b7c8a97caa8a4b3e28d5dc3abde384b993eaff15fbf4e8043f03a9096948786e6c7afe65c24ef4538ace74763cc7c2c0826cfdd9577e7f9042e9891492ecfa972c75081c4fca4708dcdd7e0f1c364f70e5c8f5bbc37b509257c127749f1540aafad67630c8daf27e30eded8fb9e5390e7c79cc4b1d48d8e973ad0574a3749c233a9dfdf992be63b45bfe134768a9f22ddea046f9b07f4628e6c33119dd093f02a39f5ee0e8bd85945ecaf037f9139ae1636722c04a91be43be2933707a3a2c6f006347706532a21cb290f4ebc5bcbe296a9d9cd9df061b8abc911c4a4e822e1f8eb4108189dabf47cdc88af3bcf81e0c848675df06ffcbbadd26b30dbf9cab80fd6dff83d0722b112dc16bcc420cf89a893b3f4f7521a18ec172c0e8a8c748574871b2830f8d24fda77552cb9f88e8ba9660ec266f1d8549081236e0f5edbba6a867c31dc051474625a01d6e5f407742f87255ce3ea78c2a8512bace0b1f4238eb8f38eadd53e712fdffd706d71129fcf15d6ea0a383fe662e4e3b3359f1ca3aafdb4902da0d9331f0df7e797b3ba56b6bc8be41c865bbf9c155a3885b03e9709757ee058a339eb48ba9a888a67372aec0e0b03c14fbd0122c6611af291b1a3235db641d1b20bba5f5c32ba5eb23bba196e61971c341b20a85850e62676062350ff83203235f4ffbb8ccf52dccccb593f7cb74d64bf91eb04dabb73dda5ec7dba5d316ca0f8498bb2ae3269f7b8154f5889116bfdeabbb1607fb3f70f8a422b3669db3d2505c934c3a65ebd002bdc61301843435f16fed5bc54ef3d191df487b500c124074b1d344da6fe3077cbc03c860f7ff6f42008dcfa9f44bff73d01ccdcd4d0a6d83a9883e0aaab6477bf5ad8d2710a6e436ac77e070ba9b61dca6b45e1afa591ad0f136b1a07416e79b59edb33d6300236a6d5cd9ba9668981e0610cc7969286d9f9eb2c87eac183a6e1bf6e33905f78c82a716e67b1d0ec240942432c18282f86fc75675f96d707c117e6f62354e7ef1c7aa53eba1bee0131101b3d7a40e6ae18a32bf09904c55a3e51b34b2a9a5024df658a3fdbd7407067ccad0e83ef69070995b4218585370eb2ce8200af0604d7faef0ef5e665242361dcc082014bc5482cd98bd1aa48e2eccb12701474dc98bdf50926f7d01b0b7907226038b340fc0a969ab1e593d0f8461ab8417a38130ebc319c1805fac6fcb3343506c0207f0a395906eb75271efba53d762490462f5b8c73727e0148ab691aefe5321c1c182ed4148ee95a6a6dc2055d7878258422775f6825658093d6151707bebea2df310f829dfc881d07e785336a0dad8528aecd862eb3e7c4ae12b482ebd0c6424a0d5e929ff172ec90de217c54ef61f5a01dc0c91f0a0faeea1bb87754fe5b9025dfca0b0e9a93d6d48074778be120fd7b8da68311747ceb11c9406f1fc31154a0d246a1cabdfc6ae12d39b1783246c6c914994172660768623f46ea4d65ce0a0bc3a79d974e50d25b945bc9baec61148736ea31e3354fdca815c61800c7834108d3e6cc2bc12bb2808c69366b609374765fe30c75f40abf08f5188d28e3e9e90a515b3ec843af8264ee570a2fd69171eb29c2052525987a9fc338272b749729e42b147e6ef76b7a8cc7975a52264053f6b3ee3ea0b295d269f1ace681f6144f8578407112b9aac62dd76224886cc4e97408c4fdf4c54ad4c998861186d2b3aa110da91f3662354b19a024363316018b58727f02d0a10756719c32446d83d22cb72cf67eb3d412fbb49a30a9755057017a7bcf60d55c60b5493ed5fd0af205fe74b5bf9971b9bd9e0fec257a8378771bc1f5b162acff224f9a3c3e4ec2df767d87d70a45e61b023cd1358b6baf7611a2f5cc662c112f627ae454ea6093a30650a73ced5e0efbce14c6a5c795d6dfa3945c7a60b584c10732899a4510ec103eb4529c22cfc07999323fea7baf4d4c9da6a598c9ef38e8ea5879c6dcc3f9c6af7955c820ba5aec2d12fb8360077a946752ca9da42986d1a6d62f62d1b2b89f479e829d8b99952d18110c532b6b3cf2274a11ac4a46286f01690f9852f0689eb3200d97700e83ed19ebeadfb66cb95c3392547f8097cfbae2cd33b8d028e25e517eaf59d77b11731d6b2edd738f8cf17db86da169cc59d101c138722984c506beb10cdaa957b49c8d319c77de7c4db9c7f919f1ca32f0a39e477cfd471115bd0362ce518fe5da9d9c5506969717b1c1901282721cbd39c16f58855e06a3b27a0ed96ada7f43b96e44828f19dcba012f50293d3d6bc1e0d94102b4360a32a0480c120079cea417236ec960c92c0b5891b1c0c214e892ecb21d70964e3643f718c67079aa3723a5551f96d4181a15607d14dd1123a6ccd07253f422c8cd7e65d5cd822dbb45d759f4414d1a4c31330ccc78c83a8cf9580627c5daebe2291461aaf7b4da15dc17bec28f7ca8db09b1965aa79e45a82273e4a4ae91c1ae01c351a6df030f664daad1c2695abc20648eafca2ef7c1dda744a07b938afaae9e75aa82fd2fc21c01adfa0a3731c805b598b73698ba60dce8ca14fd0546ad3914ad594590b58ddb04b858dbb8110e52a03312254d74aa3bc54a67dce2a7c86a46c30e1626feb383ce2f4059b302fdc23e0f39679e15f60136c6f5ad3640e03dd720ec365df9df3c5eefe776a15facfe7aa9ec7e0ba8da26d5fc2a98edc549b5a08814074b559c015ebf9eac8db8e8e32bccc1c47e3a4fea2b0d543cf89e07df70c33c100b399cf948733620f8f37f6e0d476f60b636c0f340beec8a4172a2b683b89422a3a95c04e0b2b7a67754bc37c6587a970e9078a38345b54b78eadf29976441ba7e037bedab102b8186a86478ec3638d73bd2415c7d32832276d500fa6fbe31a32fa77d3df7e376588969e832edbfac18c41467dacf03e5b7494eaebb587f59ea0f750b26f2e139aabaec8cc061aeaf43f28831feb075d6e4b90e2e2531c1e5106679fe7d87c88f11cdb08adc81d0f83c3222f800995e2890ecdfeb71ebf5589847ea6044b3cc11a84f0474dc9e4879f997d4b540b0079099f752f008956ac1f33fd3eb066de54aea5a0aa84deadf7ff809b4094aa67538a3ee04017449211a6520d349774a1aa2a6ce43480b2ccf1b5193bfca6db3aa3051818f801f54730ae1e3fc499842643f02744dbbeae3a68b2b90e57e82438832286a1294278270f373d49dc36d38609a90161fe0afd865b96f94507160fbdee88ed911ac1032542434c782b3197c80fae3551dd49f012b51b4218348895627aa767aa28fb14ff1e7f6078a9f74cc77337cb1cc7b02b5434caf2a7d42ca8bc9e9e162b37610fec1214babbf255319ef21d3ded6ec431b735687d28885aecfe8ab3707fdff90383be78765d23fea5e3e198f7b6ec2e201d27904e811824710b5b8fb543c3d95dadb75f67383736bbabc533bf10c4ec0ef841baee2fa031eb9ee0ba44e00168cf9c2bab26e0d5f044eb895a7b86057ece3c6ec87160ce9de83e19b0dd6028139e71269ef4bc47ce5c8d954a58e52af03c9444d6a2d630dddcbc8b89ef52c129491aff6d8bfe0b60cfb1c1bd7f1413fcc60e32f9d35e9fa02887d211a68bf69e87419188a79732606e9aedfb4f86b8cb629a05b2256274de2a00447b75cee916c999044c751c4e7ffb32e644cab21d6dd7063cf1cff257128c2b094b6ddd08e4ed6184790d5e009ddfd1d715fcef2c3f06bd13fbc3cd49be21b067673dce397683ed5b3575a3e5eed21e6859f8a1f81102898e57d72815e10fb3ddac771cf67b8c2ab5c9b575487dd742cfa1ba3613e1db97efbad6321a724701f54bf239e3a1dd3b3903e7300f85e783f43035e07d9e2631a5b7d43a1e0297b44c758414c5ec7a4b23c2930c661fbadc9bc9d40bf56df9a6666fd46053f1107cf95a113c0f05a6c6e65f5a72e02cb55f13fff0a8febb6531384c9612af4c701df67727f30fa0543334c031335a179b0db5e19dcad9ca86a490939b99b65905da6540809667e23162127cfbfaf867edec71a71c503adc6e0fce2e81bcdf6ff18179151621e8190313b9c82f22f7b49220195099d30092795c1548bdbf8e6e1d15a77495d6dec05eead2fe58e3f3b16de1c16fc2be42b53ec28b7b77a5ac323a0fccdda3be499a680067970073563f1a28760f65f478266ef40c821943739f5981d700dd1a7499cfdeaf362a0e9a5e91da92ad5d488f83c10e19a6b5713ee5df641cb7f0d8f3881ccc4bfc2c7fe8df38048e83f88c1b44c3308df6d1b81e0e3d78a84338aad012b67c34cbc132fdbe2ae0caeda43ff37e79a7b6c89047bc7cec1c7948e96d26e72a2fe9c8c05c6ea066a935b1e7d076256cfe2baf7b05fc518539ef3bb3f66da0ea7e2b3b6233c037e604107ec3a8d3c008848454ddc664d88dc739783f1bcb6e7e0d30690f43901cf91d9f831aa380097bd400181957f129f336db2d4c7f954214c8cb29afc2eb189e66bf4b5fff03efb080b3c57c17a1fc053a401a584b4add0e33b34c8056591cac4fbfb107187a3b0ed1b8c4f029b594e53ca25c9b82184b1108ea7de521cd51db82fa635336b06412f8758ae6cfa08ad8501c7e516750d30bc3e81db0713159d5c9f931aa06bca99378097a6a481bd03f3e27f93c66014f030df87b390c05754484c0fe9b446ab7e4461e217814199ad666e00d2d631978135584f1634c97b3682979f7d2f9cc785b6e3e0b4ad51c714d10b584b4bfeb7a2423fb8eb839b76001f701107e3dfdfde1acf95a47106e427a6d1ada9e07520ced70f4fdc08f7e292b1bc394e8a3dbf4ccfc6a223c8cf7be4f36abece5d35b8bb033a323c5b0e83d0f7a2bc5ee173c0b4f4f331d4b519157d55359b19a0711ecacebaf84ef05965ed8dc02b09ba67fdbf249908f6b9401dcce05e063458cc9ac44364712323fad3de6b41d5ab31ccd12b025e14280b3ce0741b507764a0cdad3a16296e263b5e448cb63be8bca15cabaa97417a114bd3186190a3c3266ad897b70a6dbd806795b0fcc8d719ef2dec642eb511dc34f8473b2ee0de7da20293ad47c24085422470e5db665084fc461699c8a4a6f85118f300430069cbc37c1731ec217e9d98a96fb2297572638d772bc0431c2cb8e3ced4b8590dc62c61e3ddd968b920d261d7878d169b5669b5c565012c5e1686b6449f5ca0d8f37213a231e84d8a9f37609fcbd4c5a2118cdaa3d90d4873447adef531325f87d02954cd0ae8fa30d37385729d78cb6c82954fb0aa2b02224e76f330d881e79572a11615b9cd6f03a7922246ec72fab04f6e3816d93c2a9977d439ab03a2b6b13e18a888a361bed122f28caf4aeee5ef9da6c2a81528c320f6409e6d2f26de88f4e74151e57d6c3f889813d411b6ba02c278814be1c096ae4f2e1f852d2e41c95f86303a225488b6899c79221550084c0ecdce55572ecaeec0b2f7991c29b5020648b09a005673c9bbb572fd63a16ef9bf07669dabbb509d061b3da2fcc3575e89d68a606167fd62847e7a3a23e0f41d3583def749a78b21b4404226aef2b05b287ef126e2daa4e5f21e7be88e9b83ecc34d4e84e9f81c556bcf97898ee96eaed577103b0051bab1d0e277d6c0d487ddb6b88395d266cf4154e591e07bb3f67b50f18de5464b2f0e257b7ae41b3bcc2a5b6f86c41728191714bd48d6a57dc52fb99d4c9a739297164091baec1365c992619c3957e5c3301a15558960fa3ea01fe523e504150ebe24ec6e38cd4fde5f46e3374bdf21c9841daf71eb93dbccaee1fdceb1651f04f2439f96a43ec3e5720802a975f4bee9a9d6b25cf29d7ad54dd7b75c37742553ab93ac0128ad7ef7c0c651e7deff8b24f106b32bb99e6ca6252f9e4dc1dd37a698a3615e46f1c01db9573549cb8fa5c574d7f1b49f9c275f102920a55032ff04a22fb9df5f0559c9f4cca6adecc3f299fd815838890d703b37f28a107e3239b5537655049566600e4e36d5ad14bee46d978ae22d6b8f6e6ddc4552743e48271042c1e0e642ce649a1827b20c806679a2b9ab0f543e1bd6a3f59dcdf6bf3f7f51e6cc54a11832387f8d18957cc7434c06d3b24ff7b90ac2f70023de0207aa45c083fd0b53f72258cd25fc0d5a91e998f58dd715f95930d1206b7f2c166b7ec9dd5ef07b1085099474dd25e9ea09b954e327efe4d57cd4870addf14c51a52ddf78152e2bcd4d43f6ebae0574282ef72fecfe0a19bbb48627c73780dfd16deb1989721d80aa9bfa92d645be0861fe0515c9c4005d54dcc125af115bebc0f0b4170b7fc5295ca3805e7b9f68e50fb4cc14145c60103fb697400cfb8d6ec80318d027c632adffd850c89937476ee05c0943e6f9c89597e97db6251d4a97a97c4ba11996517edbf2879a9363d05b1b3437fd507ca9a990a1631b5c539d847abf157f07c44300c434193c8fb9d0429a53cdc2df1e9093552ca8e0524686731f775b0edcb37708a76320b5a344f4e13083c7c755a2e169ac5af52180ddcadc8cff5541e5a7da370b0934b0c54de4d41c84e94bfe59f0181bd3cc4654c9db564bc5fe5492094d86006127e3f71312ffa4f80d2e16b37dd3ce52c98f35b60f57662302100fd76b70749883b39030322668655654473ca00f1a5801bf09d0bf26c91712dc5497389a17b2ccd36238d886f0266998856a7a26187557e9fcb9d035f1f2430c02a4d4e0bdab19a94e56d3dbc827cc9d585e5397785f0382bcc2031d9842aee1912f121f4b2058d5153420bfd5769da38b5a7b11857cb73991cfcbc87ec13c5022a773e584ddd1a526dda60e68c3c5a99170503f80554b2f15e7729b2bf5f12dc634ba5905470a283d12cf1a5bd3c1c724caa7ffcb4c83a8ca627d72c76659f07c1e9a468228b5c3996610a6b423d2d7285fc4d6c4586ba2602c5a5357f2e967532d4f46d7862978989b069fe207a59da105f419413237536c3e47d5c31be390465e97ebab39f35f3ce4cf202dc412f9f9b3b2180e597418b36f318a892552a945a31d1a882e7c0cd206003862dc693dd7b37c8cd89955cffcf511262293cfbdae0c5580fd0266c196c0960d2835c23d125a15c89472a56fcc102609c569a8a39ca464b4e58aea630cc10d9b935a6140d5366654f2c01489029e82ecec49b8d0dca0d1ce187b69ac8e119a999fab7cc3cecbceb39ddb50847cfb476763ca41bc090c4d82a54781692c23e13d29e29ce45c67685accd6c360faf6b07257839d6e95bbca006d81bcbf3f9b1a0644a396098401195f0ab3e382c44a7e968f41e447965b3bf3c4268527540b213812d60501c10a0669ba928593d8924c0ba4b00396f56dce06ed9919bf1881e647c80296740e600671d41ee8de3130f61474eaee1ecde15ba9933384d84a3a18da15df533d37241e95838e85046d74d9355d31aa05c51a25ed0540fb9d0eb24db8175f9c34ff5f258d4c084e73b4f3d44aaae180cfa115b06cbd035f929bb680a727b3620284299fcb011a33b95756e9fdc47e6dd711fe516372dc81f9b4525d2ceec644810821d4904f4828090146e1aa54add8c13392db3ef98f9f707f9c02e53fcadcb4128f5500c9bd6a0e584f4c366670e65df0696bb507c5b88f32e5e6225aaff75d1b7963050df6a74bdba4c3ee482802fa86d31104c858147ee0cfe04c7279157ea7ee38d58afb0fffcc6757abe528d201800e3e853f8b14cfb8bf9904a107ad92b2784e72c7de181dcf28f42cd0c2fa3d1c6f5952dbe00f7531965391ad450cdfb5c7846768fa4943dcc9e8d373b3cc2319de128b6a0c8e0c6b8e68eae2b09ab94c6e058fcb89af8fcb6aea03b8c5f011513646cf3f3f9144307466042da53a87436dd1bfd84a5561f39a14cc48cbd8dcdf138344511922b7221a1da61a75c214b087f39e9b84abe0b029d831d7ad6e3569ab2634d2b9c7148c07894b5f2b30e0494b5f4f4fd54374fc0bf2a9d79171a456781ea17e66d8924667cf2c458037e477ea8b1626373660032cfb41437dd3c16426642ab106f50e0653623cac915010f52390a25ed591ac9a0955fcc19d1e525a4053e0120b953a421c5f63b133205eb220312001350c64d0bcb89e2f3145678f39a69072b56b6818c20d8199a701c0237537dfc7cf3e07e889aa2298b18813e7a7b46ebde8b2180c6bc898b77925952e47dfac5ab7f46714f7ee38bec5225b457f8eb86589a32d65f1bcb2ecd665e1d52d04f586a2d72864df38b78646716283870ee81c92810d08c75ddf906862c08e0473b2a5f5d728e51d518d4255ab49ff44494489ad2c042516d6fe1622ab78619cab2f03ae98340d8af81328094160b4c6685bc022fd96b2f128b9791c89088fa3fb0a14bd988c428fc05c8b885510e326685d46ed7176fa4311b19f2e6671d310e10d88bc6900ed5cbe594362cbcba98a8578d0c16fed30c466693428a0e97760ccaab71b0189178390eb9c5a556d1bf46b4eb44fe7dc8d8c112240bf827413d853e7028ed3a3b2d6df0abeb7a3e9c2bf2dd091bd4dc8852c27d5065c4bc9d5c3f554505bfad41b87c699c30f3e47583525fc47572eb3a02123f61350d1a4e854906dc7ad4f3e479d1f94bd6045b7f001e161d7cec5fbbf84ebcc54f7c34f154faab8b22f3644c84d3d70cb8469a713182e60a76d09c45615fd143f1ba57ea613f0d21e0092d4816a57e79951dd443ea8e4c3b1c9769ff08da372e75d11697c055728d82d5c5b143afcbbf9687a4f1dfbff33a0c6411607ac71c3949311fee8f4577dcf1e3bb41aef5a5e67e44b9af1a0751bcef68d4b32f765e8d1c3ad26b103eb2b94c508b042c5b02c18c4dc4522868dc6a799c53c6b51abddf818ba0a89a376c4158fe6844160f82996304ae58d1168f6522f45d52438f23d7a99a73b45a5b0b3ff7dc914567d1f664c32a83f488e820346f849cff560adef1f273f283ccce726ee5dda8faa45a757973c7ec472751853dc562f7ffcb332e8659482da27f1c643522a4643506e9d9ebb8f7c0956e364a4e1345993245e43125f0040f5b3d53e67d7e83b87dbf1399ed428d04a105419f00e88411535d1cb312e473c856dbc502bd381ae4f91bb14231f677bb909155a2bab73c5080ec822309063dcf11b70349bb935ac7b372037e4552476b3b41d13b2d216520cd7a4f00eadca5e32915d4083cef205ddbe10e5c1f87348667e36a6f7b3c16d154244dbd74a8ea3626c025d24285b1fe82780988c23b3e9ade162498653d938f423c004a24b457dc5871aa291648f91097b4b86ffe5b98eeaf0bce2cc4845a846a0a741324b22119259a3a937695150b070edd691597c14b234110a7c5b82eecbbfe27dc3f9fbb1866fc133ae382533f3832c35304c1db1e63f5a1e5fbba5823572ff11a84109dcbd5e97e3c104e175ab258ffee170bb0182848036815a5d51a5fbac2c3c6a41ac1ca5a1885c3c60333f5fcf96ae03e9ffd479dd9fcd631c54ceb9f41aea4361f30fee1e76809ee9faf31fcc55f86e59d72040dc42f6566e2f45fe62eba1691ba86722f2a1692660631f33fc658dcead1a90968ea4f5e974a38986f43a060b401f1d7bd33565fc825eda32857295c8876ce5b48525a71159d28b15952bd6cd46927c028499edc0c71c6fd2bf42acae39ff9f88f45390f3b78ccfec3802200fda30d57c4b5a35bbfd3c44bde0ff91a08a7057f6602ede684e9d386526920d5b8285a4d756756266c683ea2b8c1295fc79572cd14555be0e02ca061b83bc1700d413e11b9638b279f43ee5dba4c9dcb7bc80f2a9f8199f68adf54516201db113fc2c82b86285031d6e7aa0e601292211685077fa1e99d90f0d410a6c3f0d21b6dcc503bd485742cdff40fae189e2d8cecf752d55140180e2bee3eeb9d03d97388a61dd20bd6e85887bcd249aef40c16ff57b34bb060e851c5f2cde8ebb476e05baae1988a7e8193fa667d0425cd904ba3cd0f68efda7af0e56d6d0de85eef4c1eb61b16cad24e0f51d1e5fc7b9ed94e14730df039fe5d2d5f2c9bb9cd226dfa2d55a449a18f959f1f3c5712ea02716bb43b47546cb56f43a93229436bcdf7416d5b33bc457c2b380ab07d3895265156f5e609e0d72e4b745bb8877d552096a36c9edc0b3be568a187ffb83a23354c2b3f065e6e81e5c00cc68c4673de493513fc136fb9dcef48211df39f6c3c16a6f6044f66648ad850f0e0d6f0aa20fb320ceb84eed296e0df36f42ab246fd894a0f717c54c268dd8358c0129746334df233e5802b7dd9f326dd93586c986c92cff2dccd2005cb30d9afd99c22fe7b121f421d172200520aff31b64e94e7af0c9ffb199d74997ffd0b44d65acc49d39852472ec0c99385cc74c1c121c5720956561042ce482573b9e9498c3e7f15920ee8dfc3496460bc5c8631402c093e0db82977eb3c4bfac4940a1fc0c61f222a785d3db02ed5d9866f1488cf04f57d6e9cac5ba0344dfa1b36677ddd30137714c4edfc5a0f55536fd00e763bc2a188533a2d282386836505c618b4dadea28f2cf1fb591e6025c4bf53afc5761bc8fb7863742b91bf13681603278f1fd0f1557d910ff670ccc03c8abef16d505e8ae9ee0a4c690d01824394a66e00395599eec82a79e53e4323a72e762890f022c67802494ba6ed5bd1f0efebb37605fccce9f9e13a13f705856c39af3640f8228fa1e61ec9f2332c1eecf83164d4fe0fe817d359ae7acadf795c0be30924ebff2c37dc1e1a52e566943074531798d41352035892418bd81b48dac687abd9780b2f30b421eecd57ba75d9142c5c95859e731ed0c74a8678fdbab6fb0202f106cab0e85d8bdd16f4013fecf7550c6d5426bd116712be009ee44b815403f559f5721c683b99cadbeffccfbb1032c206681606543e72e704aaf60f6e1ff5eb3113f7366c7f65151e1d555d0261cf7d832e2bcc3a260519a4f12ef46ce36b4aa883094c45b0c38555a0f194ebf8ce4239bbb27c76c1655b4117a80f2c633d48236ee7f76e8c4edbae887dc6e1c34b2c4df45caa1a4e68d25e103dfc6ceeac475bcaeea266d47e13f6a6a6d85fcfa3af9c0d76461ab78b4591b9385a51ef87c86a49a9df1aa17407e2df1b184d23223e9d647fd07509f48d10d175ef2a03d6aa8364eff81d25a1bfa3e1194990ccd4bdb4d9b033d4524a21e5f83e681d67848d258add97e6b9730bd778b2981dfc4ffde80665844c2c46e12a1c3d301808330f34908cacd38a1ae2015bba174b0b5e9c89ae508578cda45ed2710d2f9d3c09687f765621cc4bb1f3255b7f463066aa270b5c23b0e5b40da726763650f4230a5acb696f3d3b787ca41797ac0c3979753ed644243d44ddc82abc311921fc6eea6a6fdf0c25360eb07c8b8d96fdfeaa8c7737ef8fad80f85633d8b9f71aff6b8992f24f9f8ca72ea77a9e1897d5a715f8fdc63808e19717a149fdb19d7281b524c4863a9d1a6f15e6cef0614094590ff17e21d1ebeee1e3c362ddefab7a68934b33f2efc8f33c12938508ebfc0264678dfd5715ab4996e0a5e745075a35a1c49994ddfec15e4b9fe987dcf17c32c4a6ae68105a4cc9d3372db41388c9c5506ca5847cc239f7e88afe9a4e0048e2a30b79d352997fe9e97c70e57c41597141e340183b1ec6fc826f7b364ba6bea2253b10081d54c30803fca6ee031c3890c4abf1418752fdae819fc4b99595a764c4c33f3374a3640571165a9e13120dc1dec0d6f9a2019a438e4629c53b49f72a77c2ec4bb561bf2a13cece5f68cecab0cebcd111ea7866f1b1abf9db8b20273c3ff45a32767d5431a2d45dafb6cc14a882b0e12e4ffa3975c9716638e0b718007d53006611d768a5517116af5f745b0d7de262839a5ec9a073a39cb450e0f53cae67279261179fb388de4a0274e29733de78067cd05beaae7b443200b4bbecafeb23360c49d61ccf46ffef765e58f1a2433b22946287da5187dffc088dc57fe709ce1e1d5a37c2ab925e6f2291a213cfe59ce726cefe2ee963d4f01a1bf8bc3bcac009b8a7cd22f5acaee2a79ee6e4a8cd220e2792acc53045a656abac5f92e15df2ee709372b667dbd08722137f587b9858511b882e387fb510577372edcc6315c4f10ab08ced682eb5ce8fb756e4cb4d7239bf731cbb40e49ff166db1d9550499d01bdc1b88e613123a2234d0614ae3d09bcad3513eb2b10b19bd1edb14595e419427471bf5570647e11122608d748fe0f65ef394331d850f8e2b01444d83c2fcf86b0d98173dc5879864b5755d8fb9d941f0ffa32f11c478e84791ce0d303830f68e65c22d03326762ad3f68f5d12a65c86c6e75737be1f4b25c207d017524e843ed9335b7d4cf4ab29016a5abcbddb8cf61643c44abfe453d5b38c379d02ea16d3ad4de2af64fa9e9809f9ec9d3187e2501663f11a0bf14b05c691f68c5cb848503983989084121addccb11b8da698ae04bc00bfb579117133bbc44b5a011ac3365ebd9e03e3fe3281bf38aac50ff0e1777f37efb3473339d57f73c0d7c2ece95b5212546f19aebedb4488f51e8c4cdde36cc39a5dbb5c7821c5b8e8b801f8bb71232f5c25b3bf47836fdb11f5c61dc050effb54ade56f076b5347b0e0f47abce3894ea19d034fe32c8728f05139dcd9c78fdb1f66b213bc34c369becdf8aadad6320c5b3cb42f729fa86731c911850b3c1e3f988bae585c77ac409f4c4db50aed1a2fe03c0fedf34ffebb973ae0c95da225e6189f580634df0f8ae99af478537db738b5397d284254e3171ae48e01b14123219a2a6f007b3b1ca88a74f524f64088099ecc5f75a637890037b940d5ef8d8e675f4c152ae6d822583d5b610c58364b596ca071d03999fe20343babfed2d6f2427a2fe74a9283b8faa63a7401902f457948ea36e16a59312400424b19304fdf89fbd6799a39e5c313127603ee232624b54a2342a4502824c76e660762e4f9670e0017142ee26ddcf3739c7baa1bf45b72f86fff4f4aee8380ed4c4f40e3c1cdfdd9369002e77638a57cab032503471ef437f59445b98c0aa47627e3db815bea20b7a575ea657e493a79acf12767010f0ea19dd2245f97a4fb90de8664f167f0cddfdff016da7966c7d1cd3abc760b67fb1129ab929d7a10af23f6bfcacbe372231182b8bbe2b27db1316ab86f6e5aaaee4725cd03692bb6cee4c88ed98dd423054a6097f47b6960592511cbaf43cd1ca7d33ca9cff923d125146a11b61cf4e64a6c2457a339a2e301a98cf19de57849213eddbc1fcd2b8ae16ce9ebf613d73fc2e704c4b6dc6dab463fcc595f8cf6b333eb179294580683cb658a6336fca0e3d3a004cc51c9040ad50625a8ee3e8cb8b6c353fb1b5214b3f6b68648a291c065f49363e20557ff838602960dd9014d6ecbee53bb22d5bacbf0daa792867e2c7e10f9e196472240782bd3cfc81e6d2aa744cf4947e3dfd3d63745ae39889140efd06985649ef4eda4070059abffb920a446557c618e9cd540fb356f1cd5da9d6ed274059f2a3931e0e5541a71cc5c8851b3804739fae8693d48351e320bed4e38f1760c1f54a835b7554486f443f474fcbb6bcb23d6ae5ce9bdbeb70e0cf6a70a581bf1ce39db46988df9c4be23d1831cb9ee23c430140d32b1460679094fdaf1e297a03e84ee25a114f5b6a27542155c78229c2540c5f77c6d3e48e79ed2a997ee553152b4d62dc38d74c9a2bba1bd8f4c0a03cc263bf1d3474033eec2f4a7b2c5643530c199c4228a179759f42efa211aa65ecb6ff64cf85ff380c471761e371d04a0bd0c031382201388d3b0b27bb68fcbafe38d631896c9f5e50d88d1f5b809ec141df8c219a9aa14215208725f1ef012d14e7ac7f3968b11b02aa583698f53d8c0b091d7ae3924674008e650d50a8468f2ec3e78206c3ee8904e1c180a8840b89784be3e3193b3366acc1c134cc6bc0fee9a9d24d596a1f4113de6e04a0d29ee0fcadc02f4f4d639ac3bb5a519598c7a7bcb834ef7c9c9fda0ed2f2ebb0711f52271b84e6e5ae8f49fb443a66c2b41d69a096311c623b69896e75169fb91a66ce3e10495e4974566d727fbf152547e9680371cb64d7c2ab8f8ba1a0600540301b310efbf73108edc774edda143579035e29f4b98cbb4a24fdde3b0823f1078632db31e5985a41ba896de3dfc576d04ae9cb25347660bf09fdd3f0b8d444eb7665e9dcb703e0cd0a749380b15872bf61e2aaa91749a0f28226f141b90310abcfe2fd96c1fb8ead7056aafd1d978c3add1750b9bdaef2eb2b0fc894b11d576adaf1dacc0c3514d9dd9d4926ee4dccd75b9ec235ffaa2419d3b8db8928d6c420dfa2138d1b98db499f19e7a5d5e24b6420eafc65ba74dc6eebc2d21e41867c9c61d256af1539cb8619fe74576da5d428b1ed2a2cebe60175a00c9f44da128f01f5b119899fb2143bb9278b6e07a4de1297c18a77920808305365ae324b5cc0ba4b5200d06a0257aef6ce29e6bad82e97558af3d69ffe6f575b34c9dc7742a4e953a6093dc3a76788d3c5d3440eb14bff6595c80ec513cd6256c9b7a7ddc940650439fca782064a737691ef51f72b2631a72773b29fbe9c2ebf52c1b2b8bbef634a50d20722588261644e709036eed163dba9d2ce427a3f68bb20b82efc7bfc7dd19d30216b89693ae85bb435c15a01ca7dd85c7bc68ead41e67337abd92b1aa23e4ac1e2b9bd1109bc7bdb3cc03f3050dc780e3dc7bfd57aa5fb3823019ed2593e8c610314f2ea6dd64cf189782c269e0dfd942a7ace5a9f776c33dd6eb52584cd325c4fb58e5cfc646eb683fada58eee886aab8a702d22873c67830309d6fca7ca2cfc6e057a5ba0ee3e8f6377789ae9c2dfe763abb41750d3012359f5c1d45ca45288f192b8d09c2810dbe9e13e68dce26061c6df012e784374d25eb3733df35d9429e190f3d0f9cb5fbb842ecdad199df87fce50e64302f36fc9eb4e6001a4cf2f2b69893f22fce2855321c2ffe3f44ca81e9a742d37386823884cf82ce83e830916d46552a6287ad4e5c655fb5639453780696d1293be20caa09e0718a80d333218983f7d0066ce2069c51beff485d27d5d2e0582235ce27319560fe2bf4979100d4c46b44b468e8b2ca790e35a2d909eb456311b7572abbf8343b402e4b379b80d7ab9bbb60e9b88bab88625e691c77d085a9084c4f161480da38d469db7feb49ed5cc65898f1d23305ed30a162ea28d0823e7544a843f5322d565f3a89edae3d5159fd31fbbb9e828d46d61b3302f62d31e696dd17991eafd6c649eceeca0fcc282c75f8948f5ec436a42146065359c0250c179857be2275cae697b1486a34028e3e5a082912f187d5331e4224f29dc35ec8cf0c397d72472cc006d00bd160e03c43b52919f57a19b9eab6e1bf17f3fce4ce4c172eb6687f5233a08512aedcfa735cb66967dec0757367dcfc71c1060bade939d24295f8069d5e766d4d64fb3e8f68fa031b56e6c290392ea9424815f3a6fdc26c08392a05ea68f6bf6bab7dc1f9d19070a9807f8ed6349dabcaf791a67f7f9a021f12299178442bb15c3449877a7b1508588f4948622aa0d98d76df81fb9a26d1bfcaca37ed896d409aed197c8f32fa92218523f96dc24bca6419f5598e35308389928f671742d9e67ca71d2e15f4404beb20434862ead87c4166434875d57316730efd63302c0665894d7f49685aaa87ea6457387501c40b856a41247118f3a876470bfac5edc597d19525cbb44aa075deb606601a3637b30d8e0e8543f900c64fe89d30de3c83357d28b5ae8863b0e7bce8c0e31c9e8a061ea4b802ef09a3c6b902a22e9d35d7f348491ab89de2239e1a18073fa681132db2c9b464c126fa9bb7b87c267a930d6a89d2019a0d793898ac20605170a35722c554aae9d69943484a0a7a70f466d45c0ec2c714f2dc922906fd4a68eeb3a4ed1bac8acc6ec2c1cda0b5aaeb0401840d79b26f44fd0768b9a33d43974fad8378645989a4db03607b1b27d47fbd622d4cbb4142bf86a229e38f41be19721cd685c4fc15634113959e00af431e208754d778fb7b5db8f1d1410888daacaa478b0dff29ef610233e74da791f3ebff268fa2767fdbb582c817e79837b70d253e9520a39856faa8fe8fbf7de9ee07fe99ba7e3dcbcb4452f170f041d6b0be9d67c4ebff8b6b261239dff23329d1e09c8352bef25e91f6d4d36ecda8bb0369a3810a0a3d57855a1a33751fdf3f8d5ce1d806fde29f158e7349340dc471e5e5ac6de6550a93b643007b138d778c17c2eea191154f5c6f13b0534b823e921aab9fc902446170585cb5fded702dde50a9149e520bfe34dd2544e21cbba02b92993580e8d3f17774399627198cb9cfd265af605c88993c279eeebd122c00c8d78d488ac9740b522c305fb6f3c53fb30f3ce757b576808ace3126280a59444eaa77ee18cdd62f62d644a579e4e499339743274745f1ce73040ea97bd3b68bdb35283e6b254c18ac27cb3d79507480a99a6d8ea2eb9930623dfb081ba1b9aa02c7b16e9623dac752841154a160d47f19674157251b6a552b71d241134c6aedb260110ab71539652d52046251377a1bbc8048d3b287495702ad7e2483a8cecc7fa6ef881fe60064f3be181b6b948eb59cc38338025e20d0cde8422a3ef89b66880b49a959a615cc302c38df4fa29105dc5eb6d84144d3ce639f436d83b041ffca42c96c31661f3a6bc4068e7a9f219368b66476f4894eca4b69367f523d423598ab088c73dbfb8d99f5bcc1cc02808dd6868f100a7f93be6a38e41da609e86f396051526e4792866d35818379fd52da904bdffbe6c1d2a14163e6f20c055ca7932e15ac356ee9886bb4343af7bdd238498925894f259199a9d85d626d12279698b12bb9845f1cd0ba962a6ca731ced2ff6a924114ba2eb661af588c7ae48c728c3536ea64f30695ad97b5b4fd5333c5854aeab8775da0651fcdb2ea23e72cf53636ea5db154f507b0a44c9ba3051a5175bbe21d142862135358ea3b1f4fa03544e8708bb1158cb91386d4a5621c08e3fe43ff82072461bd0a42ac2f64169d74f4da815d168c51754f224c25157cd4441006384708c0563225f68d54efabd222e0b4a862e2ce068db0c1a5a65c2e1296ac2f4880079c814e555e9a792c5e7a869a7e81027b0c14196123d3df25ffdc26d281061e1e0e097175f9183de51f2a8210f16d74967cfe73001fb81591c3a452db8400b5c2f562e838c820c95b78f440fdc72420568f049881f8eb7670c1e4a57bf8a663f0433dcbd17359589660fb681a5c06bca9d102ef17607a44ce0c7c69632f81b8f47fd03611c61f1c3969cc9d4bc8c7228ee507fc18707c9f559f9804c3a5af6e0b94cc20a09b11496d18a329b17b80d989e8577bda2d78ec011aaab0a487e663e55700728485d0d1cd8e6f0d4315f20b4c538f5b859a34f09ff21647cd4365f406a05fed5ecf5d814a9e7c9c7c66f32f3ad86d2b23b50de8f7a0386e00623f557b40deb76ec0200f5b85d892ac9acec40f2ff2c9d962c77d8657a666165c325635300d51f9a59f826f4877843e7c8b8a33110d3ff6d18d71fd91a9cb59dbffaf7122dac081c9aeaff4bf8cd5f1ce91667d6ff3700f4d2c9c22e8c2c2a64e8919303c4461e1f853c6d3fb80d7fff6ae345f0bcc3f2945187fd404c44bdc381adec03ae621225df03760db5c2e86a7d028370e4fc56cb08145cc688da4aed3da3344dfa05dab5f6d839e188f21a805ff8a6cd95be7f91c3a86517e9482f1aeb4c7d11ca29c61eb6ec0ce6ce3397b2dd7d611dacfe86d9ce33fa8ced947e270d938598ee378e2fc8bdb7bb782d2ca7d36d7b5f7e7ba9aebfe6d90b30be1a4e72448a2d43d3a4b83d0dcc97c114b610d335782926b25b8af39c5fccf09651b908d064a42ccb9d7feb55ad6a55bfdc68dc70cf7789f4afbe97d03135d3ec345df0d44caf3ab42c90e31c441f10e544e3eb04c1537d53aeac441a392a2ce66c8732be5a1c0c3c3232378740b6af61cf90fc35485964183d3b989ad99b562e6cfeca0fa57172d6f906d31f72ef4fe3dccb00849432b0a2c16fbd9c1b99e0db2e0e9eb827b276f03d02ccdece913cb1148b0eee74a294b900741cb8911a238c095d8693c319430729286b4ae2f3bf1cdeb8c8bdf5c9206107ddcb3c2001b03f713ee23ee11e46dc8b36b1856184204964940a48da0467de0453d2d311ca01ec2bcf1ad1bae5900d18b79035f186d4480581900f3a69cedd93409b5ee4e8ca480deb4c7855aaa84c67980b08bf66c96f27811c85cde06189301db748e47e02075858802eabe46f8af10e3c749ed463a96a6065f8d806e01a25a8c9aa356ccfc767036155bfb1c4525672c67a6b6ae4e6138ef1e90de311a3960dbcae5b366516a4866701fdec2f1659dab7e5cb1b5ab9c2c39ad1c23b6f1229c35600c7303b01a5f3dc418a1f195d44dc0e336e198d62cb308bcda50c495e1b828a78abdf83ce88352b5384603ba6e2df66bdf199c9be6b9cc087be14fcd8b70cb81630fd10d307370342b8f619284cb60cb8fdb898227fc6b02e906ecbc09757efadd50a0d1ed17641c27dcf4e289efbe2ddcfb0f1395f68d56b3f18940aad59928255f9154d297d4e9c58741a0de06e9df01897276c11fca2e8abf977c0134f5e04253dc613f9a9b182d850a9aaad36139ec5ae56648e15bbb35d21facd9cea369d8cc9cd8b2f76ce255d4d62c3c5f78df15d83086a0dce96d64b5a1f7c65ab85b965726c46ee3b6b8be2c86e6c2bdcaa4281d0add4a8e6910b59285ac67b262d89bb0c62efae35ada987a104e4180407c0f37bcecc6965c8408464dc99399b89a706ce1d083f3ac75583f1e4d98313481dd2578e58570dc3ac69b13b8fc6052d79f082f12abda8716d1a942cbab552f5f62c19944b1ba57b3081f013ba1da4830e89e5eb71da5e3780babfbbe5179541e87703d9f9ad199a063b2c917798f02424feb55e9152f1fa2bd144cb7ad594e27cc9f6257cc730a07ae9c7804af04e11b4e73481ae617855fceef33c47b53bc63834ae5c3c5f59a210210163ff4f12c108534f6f6e05717adcb786313797e4e6b79be408ff28c6dd9a2bf9cea26132999247447af5cbfb8c798e3767974e709c7bf2418b92b341dd50980faa4c739cf6f89e994bba45f9dfac396600d39ed199f7611f8f59330a525ae393c376fb52824db11011c0523c9ed1e1aec1fc6a20d3c7eb3becb0e4d07240c9d3c84a2d0c14e0a4c24eefbd7ff6ee9e2b5611e2d8bc77cc2d7afd4a933f7a98e4a65ddd81227f747bf913827bb4410db64f97051d32598f969f6565d84654455091a07d24748f4d27934691973e256613296a851357040c52847fa9c3846d3112700b7494358fccfbb757cb20b00f9d21e7192a64535978f3b7906eb88ad261aa61e693532c9c5efb426c3e3380998753c0471601b4ef1b7dff20ceb19cd8143d949ad36a0b0bfb7da2ec066190069995d596385d16e1747005ee1e39be8d61743686c8da3f3a4e0c92cbc40d917327806379f7ebe408b140498ed0f5d6d5decbdb16778d9271106b3ef40de4a7c16879f4f08b218102127f74e8b3e11e65011f2b81e443ed3a79856846641e0030eb5fe44540022a290202a73f432ea95fbed17eb5086fbf976e771d0ec969ff918039e9182668da0415294d7d1e1723f3a311a1222417f48702b9569a2d775101c3d8a7c2b65225b3f6ec9bf11b54d48dab9e04252636dd1addc584247a235b1685ec50083a82c99a697aaeb3898633d3c70e225946dca65155a62ff19fe816ffd3415df9f296fb0c6cd187ecb2ee9170797835551d304ae95617ef456fff5aff54443762974fa40902c0f759be1c8ca343e3cf05ab2e1023483f9afc162577e1b661e0ef92cbc7f873ae387dec1651b082f4dff3d9c16a68f212551fde9b32b82ac9090cd37af15813284eb0551de913a320bfbab92d519d8bcac88d38354eac8f9a0d1f14480113aead8e231b56aa7206e1188099f3b8ccf92fb6aa6d55ad2dd8dece8cf28316ccd78a103ab643d6986ce86438fcbd79c1831814a3067cda4149a677143292c1eb664fe953328f4d2f6a75a4c877bbc5b208383f8b47b4799849a8ad019300ad3d5e6dc35e8a15369fa3c6b7f05c18abb4ec16219baf191c0732238a65d72c2eece8de203d5c480f2cc3072ee3b04fce04d33869618366b8043431c70ec2d8951f96f5cd0f3467bd04d630d6e19fcf4e125f65e302add4d5e25a0d2c6cfce104124921ba08c299e9abb6b5d98f00cde04246d629461d4178661c9fc62d3367415ba7a77e3dbc7c83acb10fc56214a8f27f4d822262c2f3714c93cdb3aea4247f73b2cea746601594f9ff21b69e6ccc0b5ba696c2c086f49b50c64425565dd4696fdd3d71e8de2ef8ea66e15b6d7900456ebac906f07813b741de873c3696ebf51c7fbf7880d3b039cf9bcc22f7c6c94af71e668bda636c041c497a9e71a8cc76854939f00a80d448c82c3d429e89c0d4a5e240d0f36202f6debc8ffb7a92326a6892f20112b7328448e8b5eb279b260476257d702b0d5ab1a7415dea2a1e000a432a2466db9d40a07475176bd25f087510529650416f250eda8d8c0de35e51fc487ab9abf35169ad2240e8dc21139bf17fdb5f88d2b28774760f0041b3e6a2607e492778eb1a96c195c5527eed557a787545164c13e4524958c22da27ff3bc62dbae1fa33fdc2c7e51968a441582ceeeb895b051df03da6b8daf322b0c3cb0799556b8164405cc04eb615dfed2ec452da99b26b9ad8dbc9504aca0ad5b834a2fb7f9a828824c53794ec2eea6afe0816c80c2f1d26e66801d473d568d5b333ed731c00cb3f5159b3a7f1bcf6c246c3c91b1b4f354765fe82851a226b68930196155d8ff1d60c71a2fb08d9c7c3d5a3dac6be63459d743b2471b5c3fc4d4762e678614d241ba95bece12a599eeca3fa3e69277ca8a8018d74f00d3a7734d0a559e6e07a1a705add129af825c02b61e20a047e5001c50c7686fb3a5b4439005a8dbd8611dc99035362aab297904dd6ab1c9a55790684e7deec6f9669ec59e784463b7945f5a5d9c171826a3470e282612dfbc083f1e07fbac920ed7f320a249b0d1b60a9312a79e0bbdc9e13f26a2d1b628164fe1af321426d6d1149d31c493029df8a68232c589aaadf84ac0ca07686c15f3007670ce135c6b4f6b0672d84029f073026260f3a28b953d7196a46735ce2adb1f58834f9492eee5080d8abaf4ac68eb917e65f71df26f25dbc644fb180f0614c3e67e99c7c1aff7fdcb06b03bcde7ecf277572beba459c6f6bb60607d14139405cb3d9416ea4811149d5c383087be42cebf717c585c6df0d74f6b643a16b6215cfd166fd53b33c1c91497eff3bb7d463e429bf024e0b3cefa810cfcfd8fe67609b77998697463a77e9ae29f524e21d033bc84f96463e2675d9c70cd5af52c6987fbfa16720574c80c96639192800360fff4dcff0a680d447cc349a58e78c5809d0e1bdecaeb322349ee71a7f07c4fc622c4b910934da51e6c56175a1a2ee7680b8c26e2cdd458bf4b8e7dafb0d480a89612ea8676d514c476e820c196f03062b18021bd760f8c5e5b2666d1925a9a2031df872e5a229d44022092ff96ed2fa9824162c1c677224a0c6f1604d3e7a26a62e620af8e424bc603c990739d39ab9c22d65d4d755cb4920acda30b662205fdeab138ec639d471bab7e8203a329ac0bc375ffdc3c3fe791d6dca21d4806d38e646a0c101b82e1bd078038cf65b321dc4af1ef5ac85c0a57f17cfe6cb808c87abcafc5cf699af48a41fc64d8780f7a2e74b44e860d2f743d39d8c8b56ea68e337085b66754e869ea1e85849e27990931c3f68fefa84e45960d00d41b06da260cd87d65421776064b621087e6d98fe7b534210c7027be93490408fa0b51b88c8e0326bdedf2672bc0de17e795f4ebbe00db444b7291a35ade60df48f8be8354eecc88b4088885538a8bfd29cde0f81eaf624591dc4627cdfd04a27acc08c30954d76ed1a9504e35d9d5e0da19d9a5e187369a93f60f564f3233dfde4b49e3d6ab148e485f05f0d885f6fe2b6376f9d67ce449d271f896018621788968ee47e4e274264c52b79b444fd9600170b8acaf9d87ffec521ecd446a30baad7e8f758f279608ed8bc39242b9db34f6ffc19498703445a6cbc28bc1f3c9ee66248a6d7e6a93ba6baaf9a79a4e1cc3cb14909656d6f22dbf307c87e3777a2088f4693b59c3fb399aa33cca8ecc6046432dc958022625680cabb678a93c8e221872104ec32de279f30ad637bff7bab23134329c1dbe41d84d3053ea2723ff00c9c04a7584528e25e13a0f20faa48581fbb11f4e8081acce0b8b20c51f9049793766b55f8637ae5b53da3b784158f9958d72da76f92d1f6ac788a7a0430d98849f4c3572f8c210c2183420c796880f4adae42b9412a989ebfb901b181a66eb7033ee16f063b7a2060e1dc64446a80c2c22405626ce8510f663052fef7e44f5d46d4f3378bd2d2860e71073344ef8354e8fcd2fb561222f58b41f977f2bcbd4bfaacf66bcc6b274284fc51f55ab0d80f0c565d347cc0cac9cb331be740cc3041bd87f2b06d1857a61479e6e6151ef1ed4c1330c0e6bf185b528c03c82142ed3a3d6edd5a2660a17b66beae81f3df5914602b32e24f8a1a67b6c41430da36b27d0123c63b140f0ffc9e72d1f3d4ec0d796d74f7f8a3627176ae95f42d45f06636fb8f45d3508eeccb987a53d31bf201d331d7249ac25913290790a32947de6638f9cf01758bf71905cf0eec524fd17aabc2107de89efd46319a6bbee2a2e331964ef82fc967009b8d3e280db38c71797d8b03f7cf95fe4b970ca6ef8443a3f16be22e337a28bc483710f6825dcabfb29893e55c791d55c02d8f2ad10e40b185ff3f6d845fce751f93b0d9976eb174be3f24b8b1a6c9f83fda4f20f03056ff8fac7b4562fbe41e26e0eeccf980dcf8f1a0cdd3d25f78141d7e49e00141068fc63d142708a9b1736556621c6c0ec2693f367f4dbbcecd8deeffc398c202fcffc30ac75f6b327fc2dceb8683fef33482eadc77304adc8749159b7491e1e119e6dfe7ce9353f41a90d3327f92780d81cfa833c666187d07a28d3cdeabe6882e969af7a622cc809101ebb5a69b0c9e454a888678a572972050e41373d3e5f2cc8411d681ea5f18edc332d052fda78bf32158ac66df8e9127b954fd9e06e01a5ac0ee8d1eb3d28e1add3fd35ee9af3742e00f70de2f1dabbfbb02aaffb3f8f31583ad496130a36ae9aff37c5b08274844b61ef534729fde860d45ce2c9cd859f24a3d2b1b69f91f43b8fdbbf25e6aa4b49fb81f8a6635109b692486ff9b9f3ae20a37e2f054151a0c6b24b2d1f1c6312a617fe8cc0ebb089bdcc61f6aa2e3c5bf8ec2eb1ef47135abf75620b4a30c77b4310ed959e6a26294cd6eecaac4fec10920dff8f5ac755e2f2d4a78120f63b5ba919e01e2a5c3e9c89f903f90bb0ea60eaf3b789471454e82988871bffb227ff309d515c4f680fbffafdf61b38ec6cf2e9cb11d114e06edc33af03eef5221bd9f7317f47fe44db378720487aebd04632dfee0cecb5d406bb9e371444a59f39e077cf52b68d07fa2d61a25e0f9f1f3b25e3d659d317fdc85e2817a9713fc806d98cd17321b41765c8773c7f7df74d913349fc0493de8bd5f96b020477f6cff60144c56632ec92b6f560dfac2c818dde4056730deb906be530f7659824ee04fe21c74408ce6518f5a4ddc2dfddedcd48d6190f88f6ef91ffd373956c94d32720be0b0cccbb239c7ce2cd0a325e5c019c47a392be3b40a6eca482c1087641ecbe25c99da1a38c90cc06a5277bed9812d1f6203c6220b02c656f3b8f93c2edb3b1374b433ca5ee487054b5cfc7c56e912d7df504a8a810f2d3fb1f573ca523c7cd22520c6bebfb48addaf2ce762f90796a8f8fd19a52baebee12c95af201f567e62f3e72dd53c9afbdfa0db3fef247a41128d57920404ec95e30bf2f86ec7ac7aa208a7e6f30eedb9f77b8c1517333cef0d2a1efe933b867fe7fd9156d5f82580817becb9cb953f1b286849de139f52a94e9e532c1690a8f285f6b6bd6cf5daeee005a90e973f149d6c64666d95089dce6e60f64a71ab091f09255d3de31b5f7d4de0c3d824079002ad8f71ff73c43b147abe90e61de33b4a1f39351f95f3590146f41c784f58af229e75edd7740325c15c0326bf72df10e34552d7e81fba2b9f8bafda56327877f31c0e9b1129a85aec6e8c1b81c8ceff275557c762eaff5fe2533e77143f202a06ce755b8de3bb854e69d9aa9a7655a9fbb186540bfcff635ddb94dbcf035dfbe3dfb6328509eb810757d77d7f68ff9ee389dbee7d166666f447e3d9b4791e4b9a233e7af586607ef0fd7e9d3af3965cbbff426047f201e1fbf7511de162ce2060fe97430b7d8150512da9874be654e01f1d123d5d3fd43f9946e8ec14bcc2410353c305082bf6c1bbd02e425b1482ab7340f4ff01e1c01a5e7724003b1378695c73def73684c1c3fa8f01822286ad1026911f94578048c3d8e1c0e79e6d4365a6c814af243a08393909cf3e1f88ebba3e640db08fdc382d06398cbf20f06131293808f51d2a3eb893623802110a7f7cf60a7cc751ad08a9c1d1ca73a66700073ce4548b1c84861e70101cbc1145797cd01f4887e1400250561c86930d3f39ba197668b10b1e54f5eb8d05cb1b4bbc4cdb9b2a96720a069ee6a3cc752e90f9f4f86c872d696901fcec783f7e5df38558f0871b22a8adefbfb2f6857e09b90e7e9504dff94a825a5610ee5c4a78f0a067844e901716f8b90b18a54b610e4c483c3da6f6c1eae68968940386a448bb128d00d37671b958afc53f5df4b2ed5de154d73f14e8bf02edb44a66388d440ae1dacb50571b63913f4420de17ddea9d0c91994eb7478b43a8b1143eaeee80f15781b94ccfd868f31b1773ea6a22d6cad2622ec370b91c08b27772191f77df01c5bfd954dfbc0c1196efd023da4652c061b17b04d9a1a276aa87403e125997db41715797414ca16b504faf2a21b718b08fa15aa63d7ca13b19ee6ffdafcecb20244d5221e54991ba6832d900f7b1107030ff0fc04b6cd1935604413e10f73d2aa20cd507a9c4ce0e7bcaef7f3f7a8f6b291dd77493de3d17b0f8fcf1567b443d1f470e280162c99fe346b7b717bbea02c5e85839c0f8e1ac1d727b69f8628cbcb3bf1874f9008db553acc415c3d318f3c89e981118fef8bb47913b3aafdf03d613df4dd2e9e8640c22556f5055357dccbb5e69619313267f75493ec5e125c0a00a137d746f39695840df850f92682ff2d7bc16f49f4ecce747425108fc5b9466826b8897869b19c6d2516f8bff8e97dfb893843de3e1277ecbaa7892458e5eb4e803ae620643134a1048af246d0c62243000304b140f51ed01606925a051803a2fa80bf4800c1d6ddba86dcd356d47c9954bc7b22391ffed9d80c8f4cf07504aaeecdefbb8beeb5406c6863d7559fef2d724011aea10b410d3c5f558cbc6cc7cdd0845cd299edb74c264d139e343ff0a0894e2b920d09f4c15e53a8bf9e884d1c1f24547270c179d10733b6542595408a17c4ea1500224b0c6791810010e9948674ca4132090a3e38007d80fc1c726e080165a0d90408e0a0c50210516162001054c00859580154e60071760c21a939a540a25c0c77210c038c41e8d9368e84c692442b928e7008c040e9d206000c663aaa1d3a731d53f85428c063ed6531fd538a1d0034690400150271080994ca7040c004d754a2299262000eb7f4a80082984c0a13f7342001805001540600e9082c28d02a2f0a400854fa6942bc0c6014f38146fca67014e38f4a250a8a2463ca1d49a5740f500431ac0c61e4e9ec74b501ad0c6102154782cd108151b4b5ec078b9006a81050aa82081084040e7010e68400e03525880025038c18412107000120c80334201083000018810420000b0c9089a10518da0c9152bb04123840a0f24d0a052dd3032041d4e2c14273a70920319bce1c40d1c2108b9210032b8918010508238042788434e5f4f54aaaaba6244960d543f1c1184020a00c2151c20aa9052021c201410c20f707e20658145555d618496aa082da9d3a84b95aaf2d228a7022c070239a527959e545515ab2a5185e30320692891648c8a0caeaa0f3ce1c4182f17c0e9e18b4d6c34c9a4aa6c3001c14692aab2b9a492aab2f14165473692545e1e8b95aab2a1c46612495227530f7850997848383ca880f343a6b289640755553db1e60b48caa82a1b1d54674a2947917c508fc6532192a7d1234d19386972704e5f68e1c40e7aec604265250738e0a3aa6c1e71c4860d925313294b55d9dc00914610f194dbaab2b1410d10418491441641c40689aa3a3d9a51c9d425352a89297da90c4f5d937a12c9a7ca9f4c564a23534d8dd2a8787c26992fb6f429d493a92a1b4512a92a342713969f2a5565b304223f55c084a92a9b380ea92a1b43aaaab2a1811d8508a9acf0d41aaaca4605363390811732a82a9b180c22081e54e0e11348555550f0305d18005255367f3c8f97d05841135d903a794f55d9f8d147559d7c485e2c6924b26273829f9fe188aab2e1638f9f47b3d8cfcf9086836bde9696a8eca8aa6cf4b0c9a3aaf0a85a20c71d76e08c443675d8b0808eaab299438eaab289c3068e7f2c541a9aea29302a781275d38efd92182fa61d92ff15d38e25f998c83c8f4f12c9074b0f95946987a59932e5cc992f3c758d69474c8ff7ac99265318d43f9633a5d1cef38c9ce4633a95c4a44ea61e1e4660509664d2f224eaa69daab2798344f2c1724a95c4d82f89a92a9b25dc68a20d36d650438a14d8a461df7e498c0d1a2320917c764adec54b0ae5cf2545a5aa6ccee031954e5850a7a73cdfe5ebc834e6e7e483f23f85299946a3d288c75279928feac8fac840428dce3c1792d75149543fcca719a57cea4b911a95c4388fa37c66b03981195555fd94a8b09a43fdc253d7e0781538ae810aa5c394292dcd94296ec5636543465599600c11cc78a06263ccd460a64bc553d7b431a85843d7006b7835b81a5a0dac86aab211836bf8d36b61a14742878401c6c934b229c11724b0f1a28b1188800b2bb6b0428baaaa40b0c9a2b2232c42c03270810cb82ba88954c50a2bacb0c28aaa0a4b1a91a92a1b2afe4a55d978600afb34904852d82791a2b83490485448242a556503854d074a3eb7aa6c9ea8aa0a041b272a3bdad24455d930f124d3ce935a1a1c1c08808303149b2558530272121189cafdf8e90823aa9218146b69a64c61696030ddd21694e996b658a0f45c4ea6d2880786d273791edf59e35d9ec74b9e720b831d854e4fed9629534edfe383e23195def2984a27d3e934512894258dc8c06081fa6346674a3e584a3ed76ea925c8d1a54eeee5c79aaaa44ede63b7fc5853151860602d32f6893e3f8fc6411f3b62cda786296cde7e6a745263fd4f5565536955d9b88d19077d589a109947c81442468f1572a65cd3fd930a64ca54a81e54f449d51f831af550418d7afc4c89d4c333428d71218c1a939510ca090d70c49400474c081640bd359570c21c91a552a19a154e9806802101104168a0872f8b5455e52914992faef43d349876703000080e06c2441f2f5a7068e06233a6089c1d3d426b707680a84c55556da0c2e9b283aa429d5c7001a74b195595531aad2939972b3344318397aab21153553661aaca06cc97aab2c1808d97aab2a1a1aa6c76ba5455c580aaa252e16ca94085a3e5920a47cb1a58185045a02a41e268e1a2c2d1824385a3a501158e9627154e96412a9c2c27a870b24451e164e9a1c2c922a6c2c9a2800a074b26154e0b6254382d8ca0c269c10a10b680993fa99118d3cec97a952ed6aba050a751952a4ff214983ff9a47cb0a446259f9c92fb99110a5581112807e54f9d5445a9d388e6784e89e6780eca452b80ce805e851cd4fffd296df1d3fb69bef7de7bcf39e79c73ceb9d65a6badb5d618638c31c61863666666665e6cb1c5165b6cb1c5165b6c3129a594524a29638c31c61863eceeeeeeee861042082184f0bdf7de7bef3de79c73ce39e75a6badb5d65a638c31c618638c99999979adb5d65a6b2d96524a29a59432c618638c31c6eeeeeeee6e082184104208df7befbdf7de73ce39e79c73aeb5d65a6bad35c618638c31c69899999979b18c0d9f6b8cbbf06cb101e7853baaaa3abd0b75747ae156382fd850e1bcb0a5c27901860ae78558e1bcc04285f3424e85f3020915ce0b20543816a8a4aa2a2905b0ff24d38e2599b4a41e85a2a2c644fa2a3fa4120d624aa6d1ac2a1b19aaca668b8d960a65dac962bd8a4d0cd58f7331edfc97d48867c4a5aa6cb0cccae64a55554e6caad858b1a9525595a36c9d6066ca64fa02c6456bfebfa04ea61d2b5ea5c7078d09551a394fe964aa3ed407f54fd5dc91c562bfa4c67b50a7ff71520ec9ad18923f983f79e1f9d4169b182e7085062b3b33f485862f5f666872117385862ea11aa8749932e5537ec67b4ca71e2e696038e361bc847934a630241f6bea1261e0f9d4963326d29746674a1366b1820a4eaaaa7283f4c5f383865028efb199c00a9597463ca353458d2c0fcad59c5e0f5565038294aa1a33032a84c684820186e8e329b7a81e94fdaaaadcb089525557aaca068a8d4d55a1dc0458b327931a14cabd8852ee65cde83e8f0fea892699545595729e93090b95f85060ac5789ef515ec57a95f9a5aa2a3b328d799f1dbc8786ea4f5555e5e0a0cd6196d90226746596d9c285ca962f134c687e111386ca4e962d601c65eb57393886a5aaaea44c24300efa54d5134a2649994860f889504f8f4f9922f93d76424d99424764ecb3a6d080e34218a9118d8c4328292f5455354385e3425555382ecc0001d409840a9dbe0704c281182d406002a78541aa6aca14500f150ea8860a07a45355219e510eea040ad95f33ba1eea41d551ea7944a9d1894a55994e5fe6a78a98d1951295934fad26354f7ac083aa229d4eb39a48242a34fc0000365e54303c89801318544efac8c3491d4eb698400eea04b2fea71f10d1a307453c7287163f88a1010658408c54fb21cd1d8ce0f1802756f8a1ca140c948488011b3f086002282c02c58927362048184514e0c749061be0020c1a6488e1864436c053c80c605451d86ca017b1c01195cf151bb0518026f2033e28c3073ea4b803871596e0e243156a6eca68c00b01f0a14281068e045051011f5cf022c67d22924a7ab0440063d4404962470f7404208c3ae69840ece109109040d347984b7ab0810455b0986004253de814c107163cdc8434b0033421988149e4a20136ae1832040598c0a281226c6af00489175ea0012f7d3cf2a65031030d24a006b3013eb021033c305204141458c8f2030f6634ece101a4e741034a2461268e61e2010b002a00440b6496e061042d32b94988d1f34388b323006a78e8f2e3c5135954008a3b5ef83909808b0b5f68c13f1648c4003fa49a103f5250a8a2070e943859f3821e5e8f0c1938b32604511c710618ab8b35674a306585303d50630dcbc11d0d28801c96a8d9644b0cce0658e0a0e68e291f9803071b28434d1494842bde60115013b209d3022643f4a851a18f344ab8704599343d880105b858c28703a459411c86e8c083b7910689338ce8e08e1d17d2840193420d5ac0b0449a9c2a1b1883cb2681f83862a3492224e011890f1a7d6cb2a30604387c80f0e2438082e78c8f0c2200c4102f6484e073001a0af901b5020ba41011c10c26c70f6a2a8c2c4138e2822ab048f9bc800f31291e4c4851f1d9a1104aee20211502240af000192f38800aa40645c2f8f90205b5c5212870801d293f502410bc01e5142608144c64f971439a3d504f769840f5100ae1b4870c1a78e4120ee34445a905484821091227ba02295b58a10490530b9b9cacc82212303bf86013391070021384ec30077334e0411045766802056c68d2011bd0ec5003142e301512c6ecf0802f20104755c8083d90a04c5638296ed0b3c60a1138c01c6084e92122e7912b571c61a5c74b02c4f8e183eca3e78439dc00e20e1c7e302d728507f6e041801ea6327c983be8e0bc60e2818290c6cd105298260a532680e68a34a6022422850edcf08185d20ca034c0874bdc90521757d8800a4c82f8a1b4830c5f0cc9e4cc074a15002385d6c2c989d24d03cc9023093944e071011a4dbc0af0d1c373451804b401852235e0b92508a30555687884873560cc142b500f2069f2e4014f54a24693ec703788a10e4bea2041f1041b208876b88094031a39ccd1840842902430c70660082f3c343d789247064c76026854a0030d34f9e1060c344788f981199a36d080515385242a8c59681800813838e0c50eb8e8d0c8234e62114c0440873320712df40840d0e1074672b4d87083d2610b1127fcc1031a2774206164822a778c116174481825445a5c096404468e2102d8634a24a3940d4c1044105a6614831a878821c60e19a300c4718687316430430483334560f2060cca88b660001674932b5a44681e8fd6648a0044ef111058c0430a41444e8ef8830c086a0c70468f01a4100909741e39e3811d4e5006070b40e28c4bd204190f900190332cb0e1032351ae70e0528209158ee8108278e5a086e8a08d322cb94ce8f0834542413871c91ca1070a4ec08708d7017f0452891321bcf03a60800aca6c608dbf1a27fc01d892467e882c441440123b70f03b83fcb1130645c29b3086cf20569cb0621579c307874011a025c303365c370e19637f26095fd6196bec95b692ea811c75d802b0f07cb082288b1a8343c6d45025864dea08ce5883c58a33acf63811051a328a88a34ef9e1cb64848b3e6a14f6453bd24817d48f49c08420c921825ae180147ec04805087d3418f90011550928e740040f7e5446382677fce183339c085ec7142b2c38814320de813bde1b17f0618de3804202940726927804e4000402a64ce630c3839786081ba87862e60d079099a24224213063c48e182023246086992f5d8c51228b2f929859000cc8cc3c529083900d0a31040d00429184ce28811148a69c2181d00696108109393c720a69e911e26711376e0819808907f2e20132326088163108b001991f3250821b30d6ac81a347065251c4b460660681642006285774baf410460600a005cf4d228e9303204090896924c027072dae182de460023a72d0e18543b44cb1084f0e6e932e3734f04226872a8f9e17cc80fac1010f4312e008ce971b7098e2072d6d5099410f3838d3620a3eb62c1c2840847380225f74b981121b1c1a4141ce0b37c471850c60e8a80115372cd18295352a1080256e1893c41552b8500111dce000107cb05243264294c1810c68941b5ac0a24c0a0e8042f7a0b3813242a8d162c95a002bd34509124c72c21d349429810b1cd041821617b0219146de188171821e3698808a0b0448e3c41836ac7110e8a29253243658c1c191475a50210e1b0680c9086bb45079350c72870cead0c24da00611fc9148046285366a30ad3192a4aac2821aa437e089eaa1a9014a1734502d0748c8f801c30a93c861c612643ea00901200941238790b178a02250420e8020b3b698440d03e8dc31975ce1860d6a4c79610c0b645859ea906293311d00210259bca000798cb9218617f4186207670c04f4d8e48537c800c444d29387a580012e20a60d1b84f1c79a14f010c3812f901062c6042ec46060063d40c019581a11a380285248428d1d50616a408809254b24c121cc09b68c010129e6f0218c0f554cc085115980c26411299186e4028130386c0020073b7a52005308253e7490332a18125492432363e0400318540b25e4808c0f228081c1044b9880073e0618109410c10a54d8d1f9f2071737f8350659c0972cd01000002bd860c79791034e3c6c98407e712834a1025024767ca91010421e35c441c2400bdc30248c381e0f1890828a13c6b809dc8101336b1019610e313c1898c00d4e5010458c06bc4c7200105402e50af502070d0e10050c010a5e92c804120cec0093901731544060061270e1072f0d982948a488157c808647b858811f30f8c10d34a000053d4830c2071040431064048283019030020d5cb82861802d6ba441030244c0850f2052746027110504e18342ac9060478c4b464b4c2145d8510362239042ec7861a78a127784b1481676470062a4b04ca9228b2e82bcb1820beee0e1842e5c68d2c600242659ba94281d8a3851c9a94ba4c1e60617b064922e36a79111d73bc0a58f05f874d173050a5caa5824030be8411907e0526fb0c82272f4e00a171708d9a204450d9e192cf1a14b2421304366063a2c0c6516e96280199ef0c2897879a104339439e1063a9c90099519741031e208125ac0870c3b4083442aa404830c6cb0918584297c583214e12f4853882670c880011406c0820d5810c88042063600021e539cd8c20823acc51677a0b698418404ce40430b1cb6f470d3050ec2b43ab6604193821d58c1018b2d234052870d7df8c0450b212708841213eef8d1e2c5246be838440bd772cae1924ec00936d0f2425d21923970e8428b14218c90e40a191690e5057cfc3101046c6146162c4a50c30a99110a59443896f4f193a3489656c54f76741102cb267e58e1c8203dd860b9c30b451c80a505576089428d34d288522a014b8809488e00a10c1d2c2bc06083d4620947a6247cc8253510a401130e09d8c00506e004319188c10e8b6c42c49319660c4952c06cdecc5162022ca8f0a403571c5963e527062140e34a1a2d3cb103111928b902c40efab8e9020328aecc908045024904122f570e40c602d6a4b1440c5610a96111331d78a1b212461c3c6776eea8aca471648a18448bca0a95397efa10202a2b22a0992402aeaaaa04e2061d293c515555b858573012435555e14980145cb496348d545555e58916a19c3df6782a0421a2e2f8410544041095e830c7114ec4604315834e75811de0e0e440a950279069f42492aa7ab283aa7a02890e9c50c2831b24e28406380c28408593020f52586401154e0a6e54554522f99472a67ccf4f2a852a5268820329005155d50a395358604185147248214c5555554e89c78764aa39395f1af9d43fa19c87c7b4e64539a533a6d3c907f5251369855b1ab5e00205724ea69c1ddfc94999cea890f3a951697473509f323d7d343f8f66052cbc960f0e2dacb5960f0e2ae4904c674a7e32e3001f7260c1cc143339674af575a0a69c520a3522e5f8c97bb0d03095a0c10a25157e4e7e725125fd2637014021070057e0246004a8132807d50fe9c7493da8d1151c54d59347aaea892337a870f0395d9f528afadcb7953a6b3e27e854550e0b279050e1982089990a0445704c4813df042f55856342ac2a1c13722a1344c031a1e2f1293d4e0992543dce8353c2223825e851556abe8453821a23a82a9c120a8053c212550e4e093da9ea2717559c12bc9871a73ff3a9d208a78407e09490003366724afe249389fef8e9e4674a55f5c49042aa2e4f20e08903dc519dcae0204004ef71e12745832785a0bee48852de93432251993205e70007a8aa079c4888509a040d8872068e018ed0020747013823a061ad002c808f69c129c012380558a2aa2ad49aa5030ca038c27680c70d14b03d4fb0b4a1011efc718017cce41148213c58f1820d2689010e29b060c4024d88710a40232b08010bc000810e487ee822820c2051410f60f8827a8290174e552ce1839a03070b3d2d18623e2b8db03e78521488448b0d57a4b0000547941d5830a38c494ee805bce0840f10b0c08b2bc85ca09484103fe06206053d501e3c11a57e11dd30c007bac0410b01e83005060684403004b4240e401820882f42c605974401011606d043420116071821a40f9b1f72269923cd151a30f2020d3f68629015f27001021640418a2d78a012013d0af9621306e88d15c20e7b4c998233802b700620028e0022499d4c948a179866ca94aa824184722f556ae9074505c573a634aaa51f94ff38e96d498dc9924ca61ae2f1298542d6547a52e8e7940ab1e6234af5bc0d7d6a8df384806a3e76cb94290198c2ca183800c8c4420007004fe00080071c00d85055392f582027678a1933392994f7e43c81c11340fe00618d2a890a07041070a4c0c1536bb0796223e589949b1b9c1b35a8e0dc88706e4cc8712a38510ea9aa0a84f2a13851b8b0acf9e044b9555589a970a28c0022915e0dca7358d89293837a1415fb8f12a546644435e555a038112645f241f1808d49957e544b5478cc7fb1a902a6aa2a0954384f0ec1790245054aa1fecc191f140b2817ede03c095569a61317546850cef3831fa04179aaf422356850cef32753cd61314e05e2f9d4962d2493c90bca678b179e4f6d2179c93442fda4d0a03c0cc964f2f224bbe5ab5f9eaa8a8c7d50679c84c52b6ad4e51f0bea7b7e52a84d7caa6a8448463d1e6220075a2d9c3191cc947c4269d098b1a4d1a9859f4753554ff67892071e653429801a3f315063d06aa1a4c674a222948b32c1418e08e55a323904cc9429acf9c0103a7d0f9a6a22913c65b200191858f3b1c01ae7c14403289493d0b8a4a7aa461530133a9942664e20546ac4d38227775495e996b6542124c0921a2a30422577fce953a3108fe9745da89fa69231aaeaff84a5f4684ca90a750291dc0743542010a88e4a4f4af99fcea0489f660ae9d33c2934a5aaaa1128890125825032475599c999221a819220aad4c92442e5984ca9298f3a9d4022948be078a28237aaca927e64835741996e694b979d1ff75255a61dd4db904344fdb897ff1b42fd788f2463940294b98b0c03991656f82ec3fbefbc3184c1a4ce3bb2a58feba30fc86c30c6672b5dd54a48ef1ff365abefcacabc36c3fb82c9edfe3a7dd632edfa2e987c99c678d743968bad1f53fa3bc8efb8368e96f63197e5becea5b58b29743ee6b34c5607a3749612ca3de69390edba7d976c71493da67d86904167ed1bb5318f4919767bfef65a87178f2923bc6c19575e1d63b7602ed9eebebb46b7fcf51dd331e79cddabeed1d6a01d53c2f55c73955f7c095f1d935fed77515e0ba16b8f05f3b947ef7b77dbb2ee8e8e79977c6ec1f66e731fdb1cb3d2d5da2ff7b0d9357b724c5ba13f76ab17840bf28b6332637551d9ec9f63bc704c76575cb265f3556b5dc1b4b6af7494ed6d0e4615cc6ef7ecb57defa874ffc6b4bc1e8dbd58f3c6fc6e4cebb045daf8b2789fda36a6bbcfac6b4dfe92145a36a68416527b57f5065bf535e63387ccdc2cbd34be1af3be05635b8c6dfdaf2998f61fbbee1442c9f845144c766b6cba1aacd01b8b694ccaaf3e946efd7b7a1b8df995996cfc5e5cef689f319b33f96e2baccd3e0b4f30db6ab5516bfd45fa183463b2babe5eaeeefbf22d63b28d9535f6a0b4ab3a19b3a1b3ef99d96e6bb909e673bcae5a6f0cf68d6f8c593d36575b6cd145c74f8c593b56d6287d2f63ad2e8c2925376d909b5973d7c098eeeaed1b2fab4dfa6a2598ed3278ebd3ead66acfbe98f0a98cccaa5cebb66512cc7edb8cd95d12da87ecc5b44cb6c81a93cf167b179352791fb247a15d2f2e3782c9cc0d3d562b61e5b69c08265d0b5a192d74363e7ab998b7c55eed1abcd6b2df622ee7dedd77e9fb1ae36b31dd37c9ceeddf7bc1cf62c258e1bba69039d9d062315f85f241f7bf98cb664330dfad27d99215727fad57ccb51e6d2c36e9a07d4fad98b6417abf6137b375140413b66be15dd72e086ffdc0f4afd1b98eb6b5fe58c57ccbdd257fb1768d36a7623ec7ac5cf4b54a5d6bee81b9646bef1b7d91f57f9c627675f7fef2f8afb96d29e6dff6fc5bd3774f5f47317bd115e1b59056b60fc56c4a6b8cd6b2e516841d98ce645d0e3677cfd2c127a6b3f69b5db6ad7d76d08919f9b5cad42d63fdff9a988df9417ef6b670b1c7c48cecd6db564266d69e5b62d265ed5af1c15f7631a7c47ca6b43246a3b3cd4696c494b542e78c9b35242695cc2d8417dae6cc717b72c4e4afbf6863f2b943e6f6c488c9a47b7c97ae6776b9d59e70605e77b91f7c8f3dc9ec7d52c4741eb9426b217411cafb8488799b5d0d99ad4bbbb67f32c45c0fdd955d7f45d99c7d22c46cb53ebd0fbe5ceeac3f0962bebfadafc1bb96fbe54f8098b197f4e5523a3777e50f26abeeff68b596366eb9c95c4fe582344a7aad645193f9ea8235be73685db59dc96c525aeaff2cbb31db98ccea5ac7d860accc2a6d76c96476bfadbb9163fb6a66c98c9172a55f6b3b771db24a265db5f9dad5b2da2621f3c174f88ed95a1b73cbf5314ae685cb7e7bee32191d7b6c9219e36bd065b4965eaf8e49321f8c1d2dc7d58bb537d68359a93387b759e8cb31331e4cd6ce51deda6cbbb0de48262ff620b3cd9ea34bfe0e26fd77ef83af46ef0a1f92699d5bd436f38bcdadea60c2af9575632eda2b2dcdc164675dcb7ecf3d2f4a7130a5b7abd15bede7daf34766bf8deeb2badcf165eec8fc1ba585f455e776186f30613b499975b390dd161b996d2badb7b5d3afb1b50da65c145206a98d2b767d3598dd6eac94fdbb6dcf3d46e662ce2474ca68748ddf2213beb367df36b5ffcf29325764b5fa5acf79ff6d894cea2eae651fd77fb73644267b2e5d7eb3da6cb9c687ccf8ae8c8fddf5da6d6b6cc864ce312ee8ccaca596310da6a38db9d8d8abb7c2665cc8bcd7bd85ac35dbeabbcc844cc72e5783ab356d7ee6194c5665a4ccdf4296c1a4b1dd05b9be15dd65e6184c76bb7b59f962f4ba160f329b3326e563da8bb17a05992f725ded2d3b737e3f90d9e4a25052c797594b1f0653be6c5b992ffbcffd01996b316594216c4bdab67f4c589d57db95b5da3cd217ccf7cdbdf51d5d302b6dabad5bb9ee7a47fd98565af71abdef21cbea7d4c5b19ecefdab0296cc9c77cf4c67fdc98465f778ff9d86bcd57c24afd9b1eb3b26efecf638317b23ca6b7b33b7ff2e9a31cf1988b5da5f7d125dfebb760b27a615cb67163dcf68ec92fad94f07964e7cf8e09a3c7a78f56cb5c755dc77cd8f2ad64b8a263c1b48edeeb18bbe5fc1ad23157652da35bb78fc13bc7acafd2675eeb7deda81cf3df6d943a0bfdcae85e1c933dfaf0c6faec8d0fc77c4fdd9b2de756ca154c191d6b17be66198daf82f99e6d9152f8363eb56fccaf52ca4a97af2723746e4c09a5adf5b2babe366f6dcc7557bbf546615cef6c4cfe6a5783acdeffebd81af35628edd7165b5d8eb21af35e767ca3b7a5d6d114cc05995c0d3617a393bd96a8198b4e182e3aa831cd2fb41805935679a17ddd7ec927ef0bc934266c6fdd527fbc648551f229856a68ccfaf4d9fb3f764b8f2e6ae6319dae44a5e229853a83414e4ec08b654bd96cc125e15b0f3e595d6416255bd1197ba2e6af25538844f22abf966828618111d5636a609c9831adadd25b9392ca7f8c3d547a52f34f8fa93ed6099345b27752c65cb7b137a3dfafb9e56531382163daf8345ae68e5178176b5b7a6782d9d631bfb858a491fd6aa2e6d2934290bd77c5c918f32d29595a1759ac6e99899aa10d3dcf8b7afc74e6316331e6fd287bd1c590515fedfa8431e53fb622dbfb2047fb6f04c664b7de6dff6bf66f0859f3e9e119b512cccba05ddd8dc5762b9ff373f245732cb2642d4a17d9f1628cd5e8aebeda167bca1cf409a5786ef7f08c9a0c4e4830d78dccc168ffb2abb12d275e4cb7a2ffeb46e9aab2c9276a7eeca48be9ac7ddc2e1d5348ab2f51f36209ab3819c15cdd96efd3d5ee75ee3651b39a2fb5d38339a5c030f7298512c174ef99abd4c5f7a47cef36865c4c57affd16a3647ddf75173587483e3c8bb798ce5957ff5db4ccf9991a534f88e4c313975bc3da99519508b5989536acedd6271db5bda8a81965b28edf29856ad0491693656de71e7b8de9f7a5a2e6106ac4180bc6a274925fb77b9259942bda670e763f2a9bd2f724eab2779c846036bfcbd7fda53b08eb0d9952f18a09d7bff7edf0baab564a53ea492756ccea9e6b5e575bb79d976d06c1bc4f422beb8231f28bee76813b65423838f9c05c6e5b75cb28ed15edad201089f475c19d32211b9c5431d7a25e63ecca56b46f7def94095d2754c848ddf5dbeee58b9aed28f43d3fa92e5101817e4ade76ca84a6130f4ce6d04af84eb27475b14f31238dbe98e4fbf245bbae1329267bdda86c1c17bdbd6e7512c5bc2f32c7ccba5b504c6b3db65569ebea2c593ae9c083d2b15c8e3574ed227caf25abf2b16bf5c6f5908a9adfe94ba52d629c3c3199bdecc647db5ec7ebb627f5f884594e4c77977d0ea1b3c68c6f8b9a1f18e698e2b9cd024e9a98ad63636d753b269d332ad6bd8040a8d347b8532674c60913f33ea7efdcadcaae470865059c2c316ddfd8eed6651b8becbde744097692c494ababac4e32dbedb1a3a81985c4b4ffff6a8b6dedba943a51f363c1c911b345f8df7af98db7b1f6b6345253f231954291a7383162beafeacdd461b4d59d9e298dd048271c9855d2189f64d23de9d8d71abbe54cc9bf80402010aac7c4bd5326649d14316bbdadc5266f5c8bd91bbd987640a093694b1d95dc0b0864baa55128f2e0848819e58d8d3d8dcc1e6dd8a2661f1d2c5f74220c4e869835ae78692fc88fdb8d923a116242dbf1babbd5b51b6b64414c6f8edac590a5ff7bcec19d32a11c9c00c15f65a495c5d67c5942333fb06f74b1f5be1fd62597990da8f161da479bfb5abd5ed8bca91810c8747a1e4aa61208c4e353823b6542b487c94ef293cdb11d64c76a63c834c0d8623142261b3e07e5634e5ab752ae7eaf9dfdc79aa8999d523d627898fcdccbb9ab6bf973921dbc667e66e55a9decd7587cf8d48a9a59d3b266c218af33b4ff97a37b4cd45c32f1f0f08ceadb90291592eca999fcf459b7cb7ac5e59a1335db928fe914fa7136a499775d291bb39155fa28b7ea6b1e6ef199313af6a8b5d0eda2f0a5a839d5630aa5501f92fc62f3f894b8a4a66cba2aa50f6d7cd4ba755b507359a6decbad7ecaacded37cfc5032adfef03a786d961da637e7e8cbeb9c7396dd66e999cfaf6dced5766e0f56dade4e99d017d3e4081bfce70dbed8d8c9a6a534dd5bab366d97c617193b63e1993036c71a6c0c61fbe86e0a3549f3dbadbd62430be1cbb84826136d5ad0cc466babad695bc6f8a53f1da633bccce037a7f6f9b56e3421e51a99d3e79e2e4b5b134deaebfa6aad57ac972d646f9e992dcab8e47bb0bafb8e5e5173a88520963b5d7354b61b5f84feec36332a3f61abaf5d6dbfb4b5bb98a839643f15b2de23f90276feba563efdc562472699a8d97a4f03d5f92ea474b547e1c3ea2e8b9a19163a2f33166393cc646cd75ed44cf2d399f71ec6d1e74b5b25744e5a26997c56d47c7d68a8c74f6ae2e95332c5739b99f956a32efa8dcf3d6b7f45cd2fc57323109af04608bd59bae08d5ea17c3b65423564603a95ccdaf577a9fd5b9da839b5e64321e82286ea938baa039303bf76b23d081d638fc5d66fb9a3d657bb7eadf5fbbef46375b07cd191ee94eae1c16142ebb6bd4abfdafb18dbb8e6b59c5e8d894b066ef07a9dd7d8d131c8ac75517364ec134af1dc98a58c6cdda25c2db696cbf55a2e3af86f9da36519fbbee5a04fe85127ef71bc63c36cf6cb247bf9feabdd1aa6b733aecfb51b19744745cd8e797c4a8bcc84bd5cb537766b76f565a2e6d4c944fd0163a674cf687d92325ed575bcffa5e1191ffaf6a5786eeb1143996d86ebb573bfeabd2c4318ebd15147217d7a596ba2e6c605cc5afe5675f0add53edac678862ff331d90cc67b7db9af1dad35498e1898ac9dd17ae3b36b21b317355bd3142fd339b6a8736ec106dd36b5d6b4240d53d6e8f85d7cf7a56cd02eb9332d74efd5785bc768a97ba266520fcf2864ffe42254ec2ed3c9185decb822a4d44567ac025c2685f0f273430b9d638f2254c319e683ff9ac2b8e8571a592d7d9a0f99784ca71e66536498cc6f73fca2cbb6d86a276aee319d2caf2d932b5dccc255213ba30d45a654632dd3b1eb6adb3ebfea525a51f3974ca41aaaa394a7508c39cbfc48ed7f437fed16cb266a8e55de4e9910c3321d8471518eae296d703532f3be2669f36f071d5cab8a9a19a2e40c571ee3c5de5a90a193123ed9daa3902d7cacbfba63f93c8c503e5767311f520fcfe8f1f8945a8ae7aeb132dd63c620fb5efddc5a0c048a0f456195b9dab2e4eae8a3927db3a89919c687a26ea74c685199f12d8deedc7d90995d2c6a8e7f325939f9185ac531dc2913ea18267df63dd61eb3effaa57f81e9dee99332b27592dd6ef79a42920b0c53b27f6c2375c8374a0b5f98f09f5bb03ed96f2fa354d41c6a0c21d74fd3b6586036067dd5a65d9db2b55ed42c42f9f4844ea60b994b055c7bf0b9d6da726fc96ec9ee527fcf32b44f634351b31ad3e94c886798322b64f7dabd5ed97bee9ca839644bceac75c264d1a1a26345278c1aff226d90f3c5e6a03bf7dc63cdbe1535879a3bc6e96cbd4d527a7bb9a3b4814020d0833b654219e819a57bd956adf05afbfc899a4f3106389ffc662384f272ad0dada83972bf699b7bbee87b86d0519942b979256cf90c99c76e4eb614d366850cde66edbd5a47e113352ffed4e844864cca8767bd9d322132ccc9b89a64cdd149660c1d37e91252ca8dc62b216417046a3d3cafebd8ccdf5276e7d041a007814e2914962f3aec8d5973b17e774146dd3d336d61b8e8d41f0302d54f030241e7c585496f84ce3abdd239bcf145cd21c630c573dbdb291382201e932944b2a75008002dbc5b485db57c9965b654d4dc9c85c70bd26ecfb5cacb9d45cd3a61b2e8449f5069d4ec94ea697f3255321498afca5adb55f7b8bd74a7639f8f4e181dfa7ca2db2913ea32018eac259411c696cdb57ef03188270d89049a8d3659ab5b0ae3edc7de5708b1c17575c270d1e1a93580402d4ddc29137222451432e68dd663bbd1c9bfd13633c1741cdfc24a23b3d2f5e3316637b62a7c189bf576eb12358b522335eee76768965aa28831e97b4db2eb960efe7d100482d2891051c298ceebb6ad37bef62d99c1980c1b7bebb1eb1c73465909267c8db22be9651e1fb5f68bc97c2f6bd7ecb76b2d3612ccee8fb6be77965eccca56bb177284cc295d74b51744e96256b6f1ddcbd1716bc6d808a66b8cdfb3b1d26f16522782195963cd22954e765b8d713139c2fbdac6974bb2c6758bf92fc6b6125af68ebfc950488bf957d6b7deec79fba5adc7313da26431b935e777cd2e06ab6c8bc5acbd16bffa7a45c65f97b4234a08a63b7dee6fad6d0bdebaae98f732cb3c367fdfef7eb7e858a9238a159335fba674b10541302ba54c1b7b47d9ad8d97a859274c161dd0e9532310e84fa65aa241c70a080402c529a27c6042fbeccb05578ccf455bc584dfee9cf13ba6edfca2e6d49f69b10251a89831ca06eb95b07a7d8fe59b238a076674cf6d7d12327a66847272449962ae552573492d3bf8bf588a69f9b273f1596c74318351ccc81cbdcfb239870ead1335931c04ea1ba24031ab74ce76b95cb15667b703f3c14557af4ae1aacc5c7c62be58bb3ee8f439e6ad4527e6fb2bbfeba2ecdd5bdc2d8e284d4c162f8b5c9975cc7eb9cae088c2c4b4523216257ceb4e2e8e4b4c6b9bbbbd2af428ebb32b311d5c1d9d6bec4acaf03989b9e06aeedeb5e5f8fd8dc4ac72f565d5724b7aed635e41942326d3e63e5229ad75d6fd8b9a2193bc7137de2913a2218a11b3d5f620bf83f7c626e9153508f44ea99e32513830d963b69994edbdd7ad63db47e74f3e2813a9ead0f6d10945f643438c44bd2406040281402012c9ad804020907c234a1173d52a9f7cc8226c0afd89982ea3fd6ff4dddb8da17ccb4d04518698cf3a66adcbafed217f0dfdd0d06227530a0c0a14ea4155d1b1a2a3658240a9350f0239a9228a10535abaae93d26d7bd5d520668390dd4b9dcbc5cfb128404cfb9e5f7cca17564a57ff602efa96f575b449feefb5431bec9d32a113944da6b45c617374f8add2076319289a4cc9cdda6bfb65846e19743093c9a837a3553274542ed658c364725b0e9f377718e5df17f55f81ec03e592c997193aa3543e080402d5f076ca8442502c992f99357f0b769531d25ac95c4f65bb4e1bbc00141fccf5fe3ac2f7daad8b7b899acf9446289fc613668142c98cae2dec8e4e632ffa5ad4fca91f2a533e3da52d8f0a9449e63bd84ded837ca9537b2599df0e5b5ceff65a86eb7b3057848ec5f8d8b30ce3731e4cafcfbf36d61c3b868e4532635d4b7abbdb1ba15ba6526807f3f137f8ec8ab151b7f64232fb999be9e5f7b7bd5e1dccf7f8ad3f53f8a4eb7a73306563f85ecad6a85b1407932dc6b2df5bebfd17bd8f4c5f7d1d5d573e5f12beebc85cd4c5eb586bcb1ef7ba379892462ba9bbaf65db76bf9159d74bfbdae505a33ff936981e9b418f6f357decdfd760ae2a59934fd658db83d432322db35faf6c2edffad8769119e5adece0737f1994cc2a326d65dc9c595d2d996f4d64bac7a06b315ac7a27caf884cc8d22e6aad7dd7b6d5ea21d3176c2be3655a97a5ab1a32d952f8ce9975cdb49fd2605acb545acacf3a7aa5b7906961bded2fad8df01ba384cc774eefabaf42c8fe169dc1bc8edffb828b7a837c5d06d3f66d7d3bae5afbb2ea31988bd5179daddc7c9059697dc85e59bcef7da520b3410923bfc8a06cd2bd0c643a28ab6c923675b021943098fe6e7bca2c7ce7607b1290d9e2a3ac46476d7cca6cfc635adbeebd75c166f9b2e30ba6ec47a9a5ecd1455f6bd105b345e69abd37b2dbb6b2e8c77cb9ba456a2d5dcdceb18fc968b5b6fd3df9b0b96b3ea6738cdfd962fe77bff51eb3637db6aab496d55a5beb31ad7dcdc26a2d4366a1c33c2675e6e88dd16629eb86784c682b5b951d7cb005937d735e5f5bd674bd07ef98ef923a491df4f6dab5cf8e19df8bf59d9f3bedee57c75cd12bb7f6ce2464cf1e0b6664d862cb47f9391ad7a3633629d7ead6de61856fbd392694d0dab7dd9a6385d6c931fb46ee682f7c2e8e297d79836e2de9d046dbe0988dfe33e6f7dee275b4ad60da86cdddfbbe36a3d49b0a26b7dbb0dae56ad3ebb2bd315f6b669645bad6622d3637e6f5c8e45fc7ed565ed8da98dd2a5cad52761bfce81a1bd335638b2dbfcec17796ad31e36de69a844fbbe9ba568d5961dbcb90c19a82099f8d2c614708a933a360c2f89edd5dd649a66cb134e6bbd445b8e4bdd655ae684c0be557c79675de56a567cc4b5b3395fd6cadbb7e82699d844ebeb3d432cba419f3a37f8cd5d24ae1bb8bcb984d76a5f2b51be37b102e5173e949a1fa6924bfd04f6a74f29ec850c898cf95bd65ac1764123a928f71804031c1f4d6ce989b64e7bc7a8c79198d7d3f5ee9ae5bedc598cd7f1973edc5762f531ac6b4b1b2fade2e85dff84ce96d9f298d7eaeb0f8241028604c689fff5bd8aafcf6ab4b309fba64d252eec7ee8a7f4a8598bfe7278c6394131840f9625679996c92978ddc373e09a6db2a1d6c175ab8245be8c56c7efb9bcb7779496f4bd49c064d843380d2c5e478ede55e8ec5cb6cfc11cca68c3eefe8a0adefc916c194f76d8decc1668e0ea1a8390d9ad0f527851c8f99e1b1277b40e16246fa5a946fa54be8fadd2de682aebf3d58e3ad1536abc56c1b65af1623d32c266c97e3bbdf2517b39758ccaf9457bdf1beeaf07d0cc1645af9d76d06d949e6e015d33665d03565d9fadae6ac98d55763f5fdfb7db3ba24c94b271a62337442091410ccc678b5bcec32b6f55afdc084ecb26796ed4aaf7ebd8ad92d367bac95c2e54d97a83964b231072854ccf6587b6bb8a8a37c1bf5c07c964f2eeaaedb179df61413527635babdef9a65bf44cd7fc6fee9791e33419162b65febda1aeb63af25df2826bdd55dc9104a17e3650fc5fcaf4e46b71ef37f318ace8c4ef042e9c0a495d95babac456b69fb272683ddac95ec9a6bf73f27e693ff626dfadce3781d8b9a49fe2954080dc98786e1a273a634920fa5895961bc2ebd2ed6e84b7f26a65bf91e65d7fdd977975d62feb2cc4f3e6fde52325562b25faf2fa494d21bedf32426a38cd9ad0d3224a674d755c9de6d5ddcd88f98eda36dce2383d1395ed288299ffeadcf52367dcb9103932d487935b74a1932eb226637badef57af21b46f68898d1b5dbefb73e6fffdc10b3c656db5d969fabf5c6a2e633a510ff193bfdb958d119a3634567061d2b3a299f2e20d0e9fe97b7a61d100804022d666f4d25f7989f5c014588499b94ce3e675fb4aedd0b2588e9bada58a95f671757bd5080988e5fb6b3913a7776e9fdc1bcde226cc922dd643aed6ff5fa37bbd6aec9f4ebb55fb294f67194994c77cc5ede77ac3ef91a93f9eca5b2fb2b7c561fbc6432a4f65de998b2d60c5a32237b96ed776b3442f92a99905d7fd15277dd51f87c309d74ae5d76dfcafab55132bd4a577f55cbda75b0dd49269514d2c8206397fdda9564ca0ad9df65b09db167b707d359bed1238bb07173ecf260b65b66e5aa1ca9b7ca379259fb71e5f5a4b44ce3ba3b9830c27821b3ede073bc2e24b3d996feb4dd514afb7530e3ffea2863b3fbabd2cfc1648f512e0a9f41c7ae3f0ee68d4c593b96153a76e53f32bdc1f87ec505fd76cb7764c6cb6fd1b820730619fc1bccca2e7bcca5b3e6fadd373229dbe8357aafb5a25b6f83099dbbd8ecbb96bbd65b83493f5afbfcdfe87ab732321d32c9f4febf5c64fe8d55b60ae9ed5a2fb58accff6a9da5163afa2ea33691c97ab9bdd4c5ea6c9b5b44267dcb517aadbf766b95f690d91d5dbbc77ecb3a95d690c9626d7f6fd251ba58b43498cda9c38670415bc87454bedff7f7add6d6b3844ce6b6edc3c5f4dd3f676730db5227ed8a6d9773d7ac0c2695ab5f6bbf8b3577ccc66032a7cfaff446ffb2673bc874dade7db7debfedc52ac8b4d4becbe2add1c57a692033566ff1d15857dbaeb4c2604ae7a8d7d81ca5cc415a0199f6dfde4baf5d8bebf3fac7ac1e19dee78e55e8acac2f98ac5a689d8bbd7cbdc7ea82d9d5e975cad8737cbfab1ff33e28b9caf57edd4561ed63367f5442ca5c75513aac7c4c78dbfdf8225b8cadeaea1e733976a19591f5a5fc5cd563d6f85c5b682d7c94bbd53c66df0b9b335bbbf0989149968bf22f67655bb505b376bfe59a4b68bbc17bc76cee6aedda2af36bffed98962eb9dc467fb7b87d1df3c2286564f43b56d9960593de4a5dbaca9a9f324bc7a48fadcbefedda5db2ce31dd73f23547e97ff457e598f6593e87cf96572b691c93beaf325af72fefaa0dc7fc1a29a5ebdebade656f05b3db6f8514d6fb1a42a782b92c85abbe8f8dbe31a36d6f21f4e8fef032eac65cf0d5d77271bcbf20a36d4cb7ba3e7e6e4cd998d1d266a95d8bb9d95d63d6aeaed5a6d54647d95563b66aeb82ffae73ce3505135e091d649161ad2d5130697477ccfe63d69bfb34a6e3753fd20bfbc696168db9e2720c3e19eb19b3f6bb0f29cbea27980ddb72d937d25e91523763caf7d21d3226eb374b2f6376bdf2d7fb4a9dbb6e27634abbd65bfcebbefaafdd04b397db66594a3bc674f131beef5f42d9558cd96a63bd1c7bc818f70b63726cf19774b4b949d8c0980eff797dcfa4735dac04d3b5f7f6bdc8b5baf75fcc78e37d6e596c906364124c489b25f4f897d696cbbd98ac59638bc1dbd5b576bb98acd9666385f57584f44730b9594709615d4f5ab62298eee3edf637bee8f27231256defaaa3f242e6e41633b6f3a50ddabafcbb6a31ef5df1fd9297ad563d8b699f654ed6c8ccab848ec594eb2d6c2f36296d423099db5a8e659450de25a5cd15d351ea64a54dbecaec8dd2c68a5917b5d61b840c9be5286d4030ed6d6e0beb5dd5d9f7a4cd0766334aeb5bed2bdfd89eb4a9623a95ee9fe4759b75ce491b2a265fb75c658bb2e5df9ab4f1c0a4adfa72ceb107af7d4cda4c319d5e291b6516decb77491b2926b4bfac74b1ba6aad5dd2268ad9be63bdeeb2bf4fba8f36504ce9b435cbe465df8bd268d381c96cf33bd76ebfa8d368f3c4a434327edf1e7b7749a38d1393a1a4cc725dfdcbad479b2666b3aeced96f90ab7c196d9898ef647bb3ec36c88fca68b3c45ced3a6c767631476b8c364accbaae37a5ddb0618b31da2431d9436e46696cefcf31da2031bdb165f9246df5cad5d1e688c9167d0e9943f9abad8e36464c67cfd03ae6e68cd6176d38309d59e72073ee2da6b4459b22e6ea27e3ebb8aadff62cda1031d7b7aecb4577f6cfb26833c494fc6ead8fd67af9498e36424c6f9479bcb43e4b6f73b40962feed0b63ebc7ed41c8d10688e9607b7bef4a7769ac2bfe60567a57b3f01b3607afed4d264b6a2b4b471f4ac86c6b32a38ddf4f5f4a6fedb53399f2497fd47685b5a1ac8dc974faeedfa67e9dacd6fb92f98dfaffa2ef19bbd0db92c96c75b71a6cf532bb6457325d7c9429bcce94798ced834939727db0b95b1785b12999d7d9b22d421ae353177b9279ab8b94995df7df7add924c28255b77b5283b5eeeeec1a4965d65cacf8309efbf6fc62e57273d92e9ec8fa3eb0b1f7c09773025bf93abb2a430ba072199efd1bd5619b3f64fea60f6755f9bec55393af9723065eccaff16b76d973d1c4cd8ea958d2dbe1fb93e3219572b6bfc48bff93932a96dfdef7a4358eb7237988da12ff6cc6fa5be5c23934268af5fb6567683cd06932f63eba5f4d88f3dd760baf5056bafc86daf5ccdc86427bb39bd5edbeb5ebdc8846e311957adf625745791795b8db6457aefadcd2632695c2eaf7baec2bfd02232d9d977ed3d6fac36670f99f65bad8bf15b94ef7543e6f7e57fe676fb18751acc87d5c2e6dabd5adfcb42a6b5dc913e496ff5c6242113d2d8b7297b8fcf1f6730bf3578bbb6d8ba326e194c86355e7b7fd5665f753198ed5a65b23bfe62fa6d9059affcead119f576ac0932177dcc3d731b5d48a9c1e4761fc628f9b9d8dcccc86c945a669f33baac7cbbc8640d32daf8b91599b1a333d7adeb4d64c24b2bb56d1f5c0ddd250a0462d9d230e6420a22f375b3f2ebb76575b98e2050e890c9bd2057daf65e199d7d513373e3c62d0dfb22c5905969fb9254aecbde627c5133c947a70703029d1e0502bd3d3d4a86a4d06042ca96450729745d9f5da2661e7ebc23a59049d77f95911b2e0aa18c64482164b6bdd6ddcbfc4a681db2d642ca0c26abb73de41bddda6b5b930173ebfe9bbc5052d6f17918a1e433434a0c9af4d69a475a237cd68ace169d305c747abc0b08d4e33c2110082586944126ad6bf9bdae55575ddb9269442279e84fa6fb54b22e241215100885c6641281214510c790b9968cc5e8626c2c25bfea1874cdd67fcbf247a9117b7ee226a40432d76b86ce36b6f6e22fab63e5d15413a90a08f4da045260303d2e17fd5977ff366350d4fc4c274c96e6b65326e4640b2980ccf50b5ae6cf19b21b5f133587fed4c3f8530e6590f2c774e96cbbca373a2f7717046a8c5a704879c164f2bdaef636eada4bf92e98fefc2594b055b65c76f563b28ef139f9eef55fccb58fb9246b8ba9859252be4ff998f67dfbc7f69e84ee42b9c794eedcde0a5fd463b6aeec565bb25d8bcd751ef3ab8397322aadf46fadf198d5b5f7926b7dd1f23b6cc1ecb5985d4b9d85aeab75c8d69072c7a4f7bf6d83cdad76dd82764cf891a38d2f6da3b5c53a66abb5be4519bad8b6aec782593d5649dbe3272375efe898ffccdd5b5e2d7a7b3ec77c5c5d64eddca27db7e598bcb8d2787b450add611c93c5a7fc6243db683bb7159d1421058ef9f5be6525bb4cbe57b856305f7bdd2a47e956b5df570553b606a1658ef25f8fd4a5bc31d77acdccd66552aeeb1c7363d6c75abffbb6ff5577ada8f975404a1b93bd5b4ef28bd0c947dd1610480a1bd3a96dc7da5deaea5bcbae3159faa5abab43b6d643a6c6a4f23d77afcb5f20100854472998edbef195bf5cbc1daf0f4fc83909420a0a66337b1fd7efc8ee5b978a9aa90da17c318a4a8c69cc4badb3f07ebc4fdacb64dc29134a494163c2a6f13db7b5ad7fefc633267d77e9e5eb95b1f71845cd3cdf6aa49c604afec520ece5baa31933c27e1546bfbf449d464a1953cab7a474266373f03e1bc6a70b19cfdd73ecddabd439e9504831c17c8b42cb98a57c19b4718d94312695cbb66fffd15152c4e8079d4777a9376bedd252e58a08e55a44281769d1b1a253e50a1352c298b7d2f890e373f89cd206c6acf73d16df99b9551fdf124c1bfb398472c9dabeba1735bf3595765c94f2c5bcb46bb5ed31f37706e597d4981653db3b654254a490607e7bbb545efbce1d7f8b9abd98b0b98f8ed98b9197a4b18b096d7cf7f565b40e657c23985646f7ebb5b3b2bf322782e9fed8aaacdb7334763366500a17135afb5a7469efbb7dbb6e316bb32fb7e86acafecd3dee9d32a125458bf978c5f6b6ea153587a80faa99dde283942ca6b4ebc6c6ccdec7624a27ff5ff6bb96b2583f04d3dad8343ec6eff2a2ec57cc4b3dc65bdd5b2ba67dcddceb0b6d6cce2808e65749d9ad972ee60859fcc08ceeb55edefc70dd455f15335a76e372da9695d1462aa6fd1b7bfdbd4bc6159bf3c05c5fddde28977cfa4ea798cbc9f6be2a371799af26c5e40bbdad6cb557bdcfa3988cfdf76d4d4a68ad8d0cc594fdfe591bddebf8daedc0941046e61ddf3f31bd5bb456c2ea31dab7960d529c98b4b97a9f74b12dd920fb26a67fb3afd9ea647df651cbc4a4f7c64ad932b4ed2bd625e6aff82a7c67f0dfadafc47cd8d7c5b55e5749e5a349ccdaeffe9a6ccf58572466bd0cddda25abeb7ef58819af37a4f07a7cd9371a312f74166f84912bc7efe6c084544648977b5772f785454cf997ca7e777d8b123e11b331d82ecbe8167c27eb10335ec6cb6db4abd528e51362d2c824b35f8eb429a341ccba6a6449df2f270588d96fbfc9ead67bf82e6d3f982c5a16ffc17ab9716c6c93195fbfda587b8f615bafc9bc8cb1c6b7717df78f9cc974d7dd7ed99ef7952e3226f33a1aefa356b64be65f56dbbefb7bed3ab32553feba8d42cb0bd686b792e9eb32eccbba5b321fccbe8cc66eabc56897e345c9b491ef85b035b92a7b5c2799f5f1655e959b3f6cef899a5912f7efb446c7ec62ceb27b30d9b27f592f79edcb482f0fe6b7fdf6fb0fb646d9692493aedb76c9d56bad7b9fef60b68cf0b92574cb95ed2b994e37f4683cf5c38373790dc994ce99d25e16da66b737b4984e982cd79fcb6b3a98d13a06dbbd8ff0b6b79b83f9b841da2a64ed0c196c1ccc5ae9f3ba8f9964dada7b645e0817f3d5a873cd3eca6e1c99bedc63f746e8eddddc60f243ebba995f76ebe52b6a7e616e1ab1ffd62e2b2fb3f6abb35fbd07cccfcf007ace5d726383e8fac1c79a948b5d636b35e37bbbde7ffaacae5af945d5ad80ac8850aec58a0e7ccca4264c952b3f2713cf77d109c3456756f9d1290c28361b376e6a30237f5d4d52a730aef54dd4dca41b4626c30b6b74d6ddaecdbe0b193ea625a413860bb5a11f9d523a61b8e88040ab7571b3c87ccfbdbd0f36c9901b7b378accd8cd6573efe1e2d6cd3789ccc71894ef427ece256411ae2f6e1099d6d575e18bd6dd76e5ab874cf816df58dbbaf0baa4cf90099b859172b3152394f06930efb2ed46d7a2c7e6fed542267496ab6d155ee6dc5f96556e0899cf5e061f6ccfd1cad8a533985e19aceb59dac890fd653023ebf796bd2ea96d861e83d93c3a75d0f66b965e4943ece40437834c16a9a58d51b85875db5290e910f2a5907553781fbb37814c7fad7d5bd6fae5d62ebb81c18cd5bd5cd2c6f7cb41afeb8b8e159d85011d2f5c749ad4c3333a7da9348258dc00329b65f9cb256d8bfd63ff633ae7a28377b19496c5485f30bbbf996db735e982e9dcbdbd18f6d7e5a29373dcf831f9b548657c8e310bb96d1f13b6ab8b3ea5123e2f5bf998d7debae85b90b95ec76483e3668f79dd5fb3afde17a384cfddb8d1634a0a99d9adcf2dc9de2db9c64d1eb3c5589b310b2373ccadd6b1d2180a6ef098b22d87f5db365669848e191a372d986c1b7b7f1ffc7e4c3edfd1b102998c9b3b6665be55b2db4f63edf856388c1b3b66bb776e57577bad831c4b7053c77c52aeb79eb25c94b6942c98af3a7b665dca97ec36fb3a61b8e87c018140a0c521467dcf4fea9d1e8de944821b3a265dd23dc6ccfd655b8dbd39e67fe5089d3dd8dea14b13dcc831af8d5fe9bbfdb7aec5bc8c9b3826fc05ebbaf2c2fb6e5ccd63dcc03199c1c7a8b5efad60d6fa927d477ac370d16123b851c18c52be5dceb67233e37f63bedfe864c7e85df935b73824821b372663dc96d7aff236abdc4ea610b31b6eda98f1216cfecec2e8ec7ee33ff9a04a93710473c3c6b46eddf8be551bebf38e718dc9eea530b62bd97bcaee6ed498cf32c7fdcdbdd83f5b4ff995af25d38e4e182e3aa65b6a56dca460c6061bc21bdb7b5617a36174ace84c9d305c7440a0c5216620b841c19475518ff61f4776eedd34e66295a35ff658dbabeca26653aa8a1b3466adfeece56e0dbe6bdfcf98b79dac705106add36f7882f9de32d9e87b489d294b139221962833a6b3afa5b5ffd86ab4323a1239e678953157abb61b93defeb9cb54d46cba25e9e50b151d2f5c744cb70402a1483d3c239f1b32663774e9fc775d51f7706382f9dcadb5b967ef7609357033c6fcbe8e36ad30d2471b4651f3f78cd4b89f1b31e6758eedcd6165b9ac9a2f3db7296ec29890416f165f7cb69f8c4dd41ca1b801633aafeebe2bebb317ba5f51337ce2a6041f693769ad37ca44cd5f4c28fb69b5bf9ed2d8d68a9a4ba61109263bbbb491f53feae47351f3a74a7ee631276ebc9870c97731b67f7039bd1f4a3dea4f5d4ce9f8c5d56a4bcabd6e654bdc8c6056c75adef5ced6b8f8c5478960ae5a6bab94aecbcb71bc8b2571c3c574b0f9b28dbe6a2b83d12512375b4c47e35bdc98cbaf51728b9ab59891b218e1d386aebadb96c5641e57b5d2551a1b737f2c66959419d76770b97574c5236e4230e183fe625b1d1f7be9251fd315d331bd7e2b6cdba283578a9a7f1e4d0972e0c68ad916f3e66c6bcd4ddfad22104c762cdb73965df7f5dc7244dc7c6036ee67ed3ad72dd6db1eaa8ab97a41d6ebabbc2eca2aa9987ed9ed6e5c9b31b49e428d489f1a89d484527fc60373f9a2d1de0a5f95cec6db86b8996256c92a57e7cf643a4931bf9b6d1bab940fef73296a16a15c14c5e4e824b54bb62763b37f06c57cce3d4697c7d6ac5577a2e6c572a74cc80910371d98b0596b59b2aeebc25f9723eae689e9cb757bf597a5b132af123a313bc2161b7b8bde77ec748da90a08647f8d89b298ba69a2bae6b4df457ae1756fce9db96162f2c3e5acdd4b79b1d54fd4760b08040281408ecdb85962b6ebdad7f76ad155c9a4a87914fad00f0f4e824c3eb6532654c38d1233be8fbebc97a3d0b2f331494a6e9298cc42d6d1d26a59a4b25dd41c27b94162525aebbff5b559d4dc30b9396256a62d32646ecb63854cd4ec40201d2b3aa9d38b6acabb84e1020231db29137292c98d1193418e915dfb9efa3baea2e6c621c7b0de70c0fdba0a9957b7d7565bb3103745cc08639431562a2b6b28a3a8b9197243c4acde0c7e6c143e67ef16352f7eeb275b12f353ade858d1d1b1a263b7e858d1018140201609b919623683aebda68bf2bb6f9ba8d9969ec774baa1c720a7d67c7b9e3237424cd6ed597d6feb5e5976b909625ac8515207e1bf1a9dbaa8b967b801623685afd78a504ad9607ca26e59a2fc607a85d2e9afc79ca899b931e49d32a1196513189993bc1a3bc85a72741c19848ddefa4ed47c4aa14aa3c674c264d1e96245878c4e182e3aadc1d3cb23a26832fbbe686577635f6f75349e72168892c994efb4ef925156e7be2e267345bfee5dcb9c8d0cae7bc9acf4be7e0fbab45e25bf25f3b5afebd8da7fffb5be9209d7b3aeb976a1f5c18c8f2bc7d85e3adf0a2d2513b2fdc5cc5ebcf43db3934ccb1cf5c51cb95a16bf4a32a1b46cc5866fbdbeb7b507d3294bbeccda8bfd24ad3c98dfd7d76a8b55ba5ac61ac9ec5ef59b83f6aef81aac3b988f5d5c30d6e68f50be0ac96c4faebe74c94ba333577530ef62b05fb455be6c96d51ccc185937cb6437cbcd4a8a83595f948eefb77c642ee8b63bb206ed73155247e62f777e9b72d71ad7a33798bfa85bcdeae565ed95dec86c79dd93ef5de5c71add06f3bdd7c6ee5dd7d9ed923598abbbb6c8ce18746c2b2353bef8da72b5e372b77c91c9a2954cda75fde17b322a329f639145d9ecd95dcf6222937d59c991b295ccd71b91e9af1baee8d8fdda2efb9049dd9d17a4cc94d12a0d9915d26829f55b6d9551421acc162d7c7cd97e73950e1632a96df7416ff1427ef61232dd85d79737a42eb6d566305fab5ee97d8eb1678b3d194cb7fc36e9bd38c228d78bc16c57ed5ab0b116dfaadf06994cd7627fd798afebdf0499904afe4a7b59871e6d20f319b3cbdaacfb8590c260baabedb0420bf9b1372013caea5c59fd5b6bdbc7fe98f6befb929f8c8b6933f682495d5e17179556c2b6d705b3bd4568e582f0bdb3eac7a4de9036f7fdaed9d13e6665f53eebff0f57adcdc7ec25adad913df9d539c77bccd7fcf97e5c1c97e3c57acc6fd7ed7f9bd3b6aae7316d744cf282f6d516d95f3c66f36a97ed656d838e6fb760be6a1bbc145eb91a7df4de3165e37bbd295f6bdd5f6bc7ac954a69e57b2ea5bcd4d631d9c178edaaff185f6ece82e9e447c99c7d649636ea744c0b1d5cfdac7ad7b5a2cf311d6366b8bc51c6abad28c7e4d61cacbd5a5c6f7d5d71ccbeef55e71afcd71a850ec784d0e38a8b25bb1aa9952b988bc558e1620c7e758d970a666dab635bc9643fdb54be31ef92eed68dd2d1dbd68b6e4cf7cbf9b7cbd66396d5c5536b782cb4d84e9950294a1bd3b6da32d208ef57faadd998d0b687f47d63cc357ae11a93b9efbaf836ad2c99aa3163d707973306a97d90dd14cc76472333a3b6d5da0ea260321bfb5dadb0f66df5c134a6577859b6adee2edae84363aebef05db85c6d8be97b674cf9ef1633bfc5de37ba134cc9b032e5d6b8bee8cf9931297b5ca3acb7dd870d5b19f35dd977adafbe029315a8d48c8ae54251200e06410c84000c9c975909a001c314003038241a0e0663a1348f74ed071480034e66608e38282a12484381281c0a04811800601886410084411086614888d8299637b7d2027b78e4dedf876b74bb3db4b8235ce4a2572c0ec5c3b5b4544231818af692c732e7d8f19ce2c15bd7d50261928179e1fa6152f184b9b74e29389acb06eca10ea293a1aa23fc626ac6a190dd217e8dde89bcbaaf35981a3aa2950ce98dac0942cfb9547b9611d0f325d9431d598941674b87df12c4b28854aec006c8a9450f556f5a9ce872ac1a624a1f9648feb812c4f6eda0bd1ec650a53384d14212635569291419efa2146129e08201ae220cb8b324277a689b549afff33602681417072165fd52814dd0037ed68297eeb33c081386ca0255de5f8bbdf0e623aa32a4daf6b29122758e55b5a338f835cbdd58e8e452c6cd614ec63d8a51faddd5d4c6c427ae5b7b871a943d11352202e2a7ffc92f9111040fa114ac1dfc95af52fb77b9c248a343a0dd344032f4e616b85161d44af35bade24e88fb295a099e0fa9536003c5f82847e702ce6c034740f844f20086ede7c7a9cacdabbe94dec26e5c884f4c6d2ebd470513d1d21d3ad57e162a33f029ffe98937895c99edc8111337a6ae485db1cb382ed20b5567824093e33dc08c22aea77d1ec622b118123258369e735094af685fa03ea2f64bf4847e183152167a29e8d2282e17fd234ad5d78a23fdefd6c7f8b62e9e8f6a98c696a31572cbc36a907aefe10a21e995768ffae9340b555651ad49b3cc9a452b5a53196091a7c60d914f7ae9df308a58b9300c6f5588cbcac21cd036f9bc7d8ae258138103f04137999b0b253c3b95ef0d0d4bbd75d9e5a2347a43904f6521fb26d4562ba068353d769be9c4c7869810d5bc71cba5e5ebea2c1ea26bda410117ad9aa835c80c35030a5971d06d79c5723552d59950099b85824186b5f2399cccb9df2214cfb3c4b36ae24b20c550830267dbff3cf6ed3a76ee855829c0af75a85e7962add7d4dbc59974ababf690b6f2a45034ec0f48e58895dd1e6d0f8306aac8ffbc9562322a933c2d9fc26a978e12114911cc075183a06408fc4674989a80127f57bc4ed092fadf6f98280b375c0c3233776887c01c0d108ad92d4da41e4cd5b440a35635fdc018a1b3417dda828b70b34a685d3e9f0325c8301ba214448714fbb50544038ef309da1f3bfe0d2c285a4f826c33b40a95e066374a51e4ec02718aecb96080767d481801c408e138f69a59b7e91baf70d6a9dd11f8035f5af79fc5b637e9501560f21530c2f5ba721b875c1e64359789c084883291b43eb50dd64422655240555493f1b87de0cc47befb20ca4ed32c86138c4b07ae5fb840b8fbc20d8ad327ce21dc3c8bc3f13b2a288ad419f865dfda1c2f04754cb049a6bd3265c643be2763f54aa3314b8e53bdcdc5d2a4b7ac799c74835b4827261952938b31d61bc9594a3f1794b80f73fbdd85551c4f834a30b18ad1630923b3bbdf467676be39d3cf281cc44a9534b738355cfa2b0f18a6269d7a8f51c0580a986b814cabfdc063f7e646e1e8e242828e0a1e91ff5bddc7c7b2418d79e04025b1c0a92029b2e682198f814142a120890717a6c80bec39aa52d5fa46339f75199f342e6655632ca16730408459b5b6b2686516425d410402d58de8bfa6c820ba22564d0b3c75d75840c093d7006c914fee577f6c54a8c317b1b65f37cd33131a6ae0458b9636460ebf62af063da5146facf1ab12f0cbe80455dc8b60495fe10b7295837a6f9c687c512074d9f3f97222c9085488beadf1e1e2b63f647c8353832646ac739fca7aa51e883acb47bf2690e8c9a93cf1ec34a61cf42bd536984a57b200fc48ce88337fa20fd5d1980cd7bc03d3eaac6ebbc870099d70991244e9b5dd70b6e3e57ea244a40bd805d14dce094f390153909874746ce5160d5705bde6685bfcecf601c3ccb6980ad688e14dcf708ddcd0f22e054644ec0f76e06254a4a242fb166de4ac1e88fdedaae4d27cd0d5874c8f2ad781f2051d7597376b3ab414cabc40f82afd415b792e6648c046995206b886728b767dacd3783bebc537f44e7ee8709a94369fe33a133a9fc25377b459b69bd12b70528afdc2424db55594318340784c53fc310035e63871e57c1891134157c80e63977aa7e0054986b23082da49a545fbf4319f664728dcbdc89dd7d12f0f77d42320653ea7fb02a8a9863e5f6901c3175ea97600db51c8d80e58def1cb028d8d58d799541dd56000fc40b2c1d9e83ccba98123abee86d12ca77f622a0c6cab006b86553e0222e99dac87ebbe11727a06987dc64c591863f25fbd1074f8ae8e6ca3bee2450b38e33fd52a7d4258280582aca2c40493a7aa40446ac655647da15baa647e92ce6783a28f109a5fb9b6d0486113fc870510c60ad5003efd8c70d90f4abef03ac2a0f036a71b42dd7dd1a67214aa61145ee820e8c1d09828aa1504d52e884ae5076dbf95f653ce8617096d5fbae7905a713d832108b20842cb403eab0e1bc655c30c98ad6bc8251e91dc7924cca71da821ebd3b29f0e9291187366790f6781b109d4e17b51f2d69c6a1f2a1574a2bbfd39ed9fd2a98a7536a0f36334aaec81db682ccfc08b3d17c1a93dda73eaa64e9dc5778821285261c55c9eee559adc2a8b12af3cc941744a5cb95d9f8a23807ca8d6ec035e04508c5e030b12e0d140570b411c0a7cab820d3c282b7f00f81f0e3d4ce25b8822b3b8ad66117f1925ebb361acec09b1e2553d6a1848c9f83f6df1842e91a630fa4f78cc5ea10dedc8cf9dd0870faef2a34c4fa6666486c41d815c45e0f8fc621c92cb138b542f217de1b2e8dbe4d4957259cab92edd447c045137952cdd00922bb23084601036e8452291de25b0797ad1148ab7a29858306f251a59c781e8de026644eec3de34272ecb8310f75c15a43034ba8e781026750064506f18c71c94d03f11ab37b35bebe8cab04c12c1bf99433da3c09e11a2fc1dfe0581a911a2afe05b2cb966a5b5a380989b88b2900e93ca20d9c195c3488565e3c42e39ab63873112755c2933fc64256232a53db9de210e1e95daaf44f083428d89b744ec859c231357220472657539fe8f54594b2123703be2719879e9680edd653c66df2a31808f19aacacc2146f0bf61ecb4f030c4f9a62f684f80684ca1c204eaeb5f5406b385ce1ed4c4e2f0544e8260a00af63423e444c43565e61d08488ee20987064428e08737161af8c405db9ec3a3662f805209636081e14d24208e7e3b3a2ed1b0877dd7069a7aa039896362671ead7bb8d6717345ed5401263c58974b65693b54e6536debe7973cfb45a9c8e507d222a68ff4c412750901a19370ab65fd56b306f6917d578bb928b1f45a1958bc02d10a667e8e812efa16c8637cb54385f13ad41b653723d2fa4d4b023a87d2102863642f49d17a62f055c14d9de2b67a4c51f61c8c9f5d4a4314903e68424c767c9204c0ad7cff4a585842c12a20f89fb28b345ce68ef675c0c56a298bf7981ba2cf3f6b17b3001ac5132ea8094410352968d0b9ba714c7ae176eb0b256e54b67af58b3665ad71c3e4a9d232f6b856292c6a15e991077fc10247f68de442049658fe88e6971d6042e1fba85351d60e7c37b6113d93695689c848bf1ecaf30fc27851099daa217c70d78760b985d84f9a22343e460c07471336b6e9008d08e6713132f747bc1338141946c2d6540e46da54c75fa49258e53d8c380b37110bbf48d5359994eabff96ebc86e886d4638ade6fde5b9db0e763040dc1440acc3c0f5764918ab764c47f4c3e843fb469409b11ed065c13ade64a5e163a6dd689491322b35044a2eba8df236c64af954999b82ab987386abb36e17b7e8c888c1a7537414881305a477aa69e1ee4fb02a704af82ca2065500940065541a880c22051e12710544240bb6aa292104d58891d846f048998225c1294041e62945845d422a488a04415318ab01032896f046bc4884849f822a4115844adc4d888d59fa875428c3b9367ae01df0fe0e32c1bc1b7a0c1109bfc6956bab49aa0b20819f6ccb4ca6090fb1cc724fd11165c81547c1c415ccb51005c6eb3f2027eafd05743a3061b50abaae0bfd4c03c0abbcd0612c6f22c4b0c67ae99a438461d86179966688a899beeedd3eb0c92e824929e47d866894715ed44703a5296de4328e080e56a06bec4a1468c6aba872e4720885704231b7be38722e8cda0636a3493cbfcd34f99ae47b00a125200bd5795be50caeb29cba860dc9a9457cadfe15b879ae0149880f28c02d47af74699f27934f8348c83eba6168752225a7d254b7772c0a1334114b6aa2097858279518eb8ca661723550b28536cb51a529c2725b4164a25a11965159ade3592f9b895130d7373ec9b13389a704bbccb93a443e624f45025c3752cf6c6de1e18665596180aeb91d00ccf0287ca205e32f01bdde80ab30c927889ca7306716793a2d4b1ed56c9a54fc2e4102ef4513a7c1cd2b314551cc08d5a257badf2879af1c00f25ce51beb769f182918db6d75c556450e65a386ba169dcf054d0c85090ff4458ad8db023b9a53c909b8ea5f15b1c24a796a682095ac5911603bd57eae65cea52b1a4832109fbdcb537bf6e13508ecd7468ba3de1975947f0754bb85f9a96966886d028834c043120e428b511846be2b20b61467a1ff997151c9d2e8b9e42de011899dfe1afc380fdb96240ab5c96127c52848726511c49e7b881282480faa10a00a1cae2e6b08fa671a4d0cae058ddd9830d72593f12d34898769a63c0ed0f347683578fa3e0d41b3d8150edf06a835002820ec0198af417199307bc991107f51f3fcca7fb930b8cb20d5f78936727fb19c0c0a82802698a2fefc447c0f1e01ce38a03156440a62c61cc6f3adead54579ea94755564741578b04fbc009a46ebda2e5ba88e838e3f7bba507ece62aa5e5038150a1cadd4388d2a545db3741dc0f1d71726050a992c02807df9a88769dee0019a362d0686215b1165b222f3ac0b2580389a8274663b0684575b01a9b903fba61f9984aa112150f0154a369a48b54cc07a55110daa33aac8f8dc81f5db14ccc767149d70c27299a46ba988a7c501a0361eecd6e2de947d00f819109d5c73ab4479dd81ecb22367109ca41fe135f726a37c9af4e1b778328ce1e992a76d3da5b8982eb2162ff6490b30d8272e9baf85ad17d9c32063b5b043ce44c725b44df9b25a3f4aa28f54051175738040e0ecb1f39dbd4773bab3b438cb7062a0a3e4e6c7cab501572341c023ac083bb7d7e4ae40a670580e69c4df9fbbd98a0838ac7ef4da942948f188103616d7b85a5347a4825b1a24b73794303d00d783adbdf8732476e8bc1078fed6d110fd5b6233e4e02a639b6a9bc617a8de07f1fd464d6ef454619a05be572c8e7ee0c539e0665d055ce0d655c51b98f5f95ec85b00ceab32cac808c2e9d203dc525899ca46c0fd251bbc0d8f2736e4f4f24a4f53efb8e20d9920655966a3f8a75dd5a004333ce237639ddb4ab6447b8b189bd0f4fded19a49d348c33eab9918e2665dd0fa3c30e52f289957373a0695205817b480de59408f16480f5f18dfaa54259b0743bd61e15e5ab8572cecb5057af582eb75651851a747b7400460d7cbb08b3f825ca7ce629b370a0b34fcd331359777c0b3e3bfe67065ed027fc009ca758bddb9b761b4a9f48f8ed6190c2967050c96044f945b3ca29e9c4b7a1e4ffa2b6875249d34292105247b32ab6a582af121690a44ed898eecaf3697ae68f47c76a501b91236144d50249f9a66426ace1304ba694d6f492fbda1e945f7528c1b459160e44614c88eda514eb22093d42a539e473e410191552ba7e2727f910eecb9bcf4afb2b3393dae77c3eeb0c1281ff922d6b7e825d884d546cfe6634b056ba4f9b34e30e53685767f66b81f574220c5a94908c9014573ccc82fcf8c65b63fc92e1c8b9174e657c5bc024fab99835933a1019f76c4944bc28bb98fdfb93287277750c79f891ea1b13fe526ff1047f8699d32473b0a26efc418c07139a9a7ee58479f699e52a33f6a933f45127872a534a9960c482fb5a092a449cad47c4ba4cf97d1518ec62536676a21a6f56792f1a2ca0cfe1a3b396763e928e74234a1669b4bf514cff9cbe9da9eccb37f895d3e8731e1a831a5985acfcde57a0d4ffab374692fcfc33781659b4be3f4ce95cbe75a9c3cb3a5149557c34141b3e1a5fe94ceede569ed51b2b473292ebfc372c25c0b4b0fb5a09bcce3da9d2c67e7525c7e87e584b1164c8f94cba1e535db9cd4b378c95f4e877b425a7b4c59ea9c8bcbef5a39396603d3655e0ee784b8769796d339bbe045c28b5c5f097b6a47a8b4a1d2a422f5948fe213a07370a9bb3a67321da995ca242d29a0bc148300c965a5f62a9fc9e971cd5f49a77b2a2fff8becc09c8b4bef6a399bd3e3da5959d22045ca93a209612f4178e2507d8226408afd517675aec5f1bbb4f200cfb1f7b3fca51f77ef4631389802fd652c660cda4079a9cb2ffd0ec62cd0bcace54b9de55d256320d9e2a8374bd9f6f234dc974aa7c60ec9b6906b15eb38a49c6bfac8fa90599ab4daf7b0d2f0f292c38dbec92111d5d2238be9a24fae9c1f5ca8848bbc44cabcd57b39bc6c34d66d7d27f8e8195df1b9c72851a7465ed82175391b33244db3e402690b35243a4a44f33020b5ab55d89b51f7f9b1f166c156b51ca053eeeeed584b1152112fbc20c4566b5b80817d0ff543a0a1713124178246fc6f47f8080a1fb56ee839364ebab89471d9d5646e2dbc1e28ee7e785c4dfc1a266db8823db55a4dd71a84897f16db8e32b90cc1d4c8b82e87d0e047d24cfb6e091847fa97f3a2ef574cd0077d6ba8b3e17e747533781e5ec914b86acbf00453f7a61b68fe32bff6b9b58076328902525f56479493df6ee0a18d6ff66f688152544c32ca9804185a6eeb1fd074d3257f78958ba4f49ef057eb9f5aefe6b2af493f3028e65ec82d003362d1673e31c451e5e864027ebfbb32c6cbf6f3d988806c6468dd43c3f88b50964e542b8bb9faf1890be2f64fb61155ff508b88e706d6ba6f205a122033991f2cf6c440bcd6f02dc98925ce27466b40a6fbae68fb8c7fb07eb84adb9787ffd6276fd1f51800a1ae778a5a3cf64fa0495a0112537d2014091625293e229fafb4d25533b16987a09a0cd3f7d4fe6e73bc1be8bb80ac00fb76f058d4f68042b9ec553d6be6824fd5ad951374d348634ce5020904f0dd4e92b5c959f04df2db751d5c00c401fd2c2740637309d98ba57ed9487dbcfd428eae91412d2736195c2c73fe01a1113a2aef680456b7a932011d04052db2b004dccc2cfd13ff327339deaf3a7a7f2fd1302500ce4880d0883c67211c690f40c52ccc69ad44761cd0f997295943c2aecc3b1e29b7a114bcaa52a0f7eb451a30d849e85a4fef901021e07f0c8b03c66505746cadd6f046de81a60adf1cf76a752b000364bf2db98968da1a454e788e684cf1f98efea3c02ee017946a26a2951245143946012b68c0d2574c45d171ca69af4eb61bb1855a059213a5e9ca2c8bb4a89f1b983edddd0b3b844cfb2bcb6f918a1f835ac8ef973bec4a07998ee50fb7c7a41b7c19f8812aa516174f7b341e18609e630820ca34558c2a0818856924394ba40943202568be10d6227b8a1c1865a0efeb13e16481db4fc4f5006fb0b94be92884f99a2fb4fe019d22189caed25bc6fb4abf33cf83586fe91f61f6bf115ef293a861a22491324582200949790dec74ff10bf79d5a662fe97350aeb48acb20fe0ba59652b7640bc498aec0c7df5ae9f8d55a23af7ea81ac542f2c6e4464a817e479e9e70398ce4986f50d314e45c135868dda753a1959516c6223b98dde64ce1f4c907e714b0474f1e47cc18005b9c96f9d9681c6a65a643e9fe7115ed0405d44a3b01900d349390f8a22e7e341eb30774a2d599db78ea5d27b3af19ad3a9a2f87a50c9ed7cfa8eec94cca8dfcdd702524ddd55c0363d78422fd528810ba4c71ac91d8a9a876620905d8e8ba9e0f3bb1fa37c6408c08584455ecc87a8fc31b75090a4b6a7e8426c72cf8d55d0f87f1e100974c0eaca43368814f86051b7d6cd9e463f433a071541c15f27290066ef59d84624b7896ad043d6375f92402b0d08813bd5ec460c4004843b0f88119829554452f721de7526cee928e9099b030c581c71cd37a11cb1aa11a71f740a7405db19d2902153603217edc23c0a64244c313f42b652850299c43ea453f4203668ee8ca3c3bc0449b2341aca0f3dd0d196f9e63f426be74289741bd454cee7d025de9a80efce932542606beb7c1ad313a2661c30679b418a5cc4ecccc69fcb884a80be11649aaa0233a608d2b14207b0e73875183b033c05bd450bbfc5aa6c3d7bdf7af91f91725d3d95d50710216591828db5545d85a77246fc38f5b3aeee41eae679a1eec193adacd372fe2443a856ca267ecf9425c66e4382ea0c216a6642e435c9df639eea23aa102c655f1aa93c10ea3c2988117eaa3eaa539420f60670f2df4999ffbcf57f8908ea803940002b66bb6a82ae844e496b1e25a3532d0e4813a14337cc7613b4c54f4e64322a8ca0014b0d8c19dce859380917036048de5f55dbfe7b3e25e394326aa73f39ae97c12d5460a8e265ce5a59be23a3682bad30f858c60a983aa65f14103b3b774dece1646a3d43a8a742fa096e95326db68d60fee719b5e2bc0887e4210aea9f267f9f168935f48a97ba8c35189bc56f1553125136aaa603dd837d925237ce3f3339f04814d41a3a772d8a4fb89eb2e84337d531600f2ba57a6ab13f4e5079e6e470f15827412089738684cb028a04f67b89d12cc2f13186aa06244d88185fe0681f590e20e38e9f848e14b0826563df04206c8852a4ba6e716d1420583e1e1f487e4dfa343e8821ae57f143f1b6075204e7d2e99df31b7c52baed4096c0393afbe67c835f94ae5d5025091e71f810c5ade745f9d1b14d3826d599f2f986c620fc21fa4d161e79441a4ccbdbc39bfb43e722bb6efc91c2b9dbd6487be10e7e10047770d1f3a335d4e05821946353b7c89798f7446779a4ef9925cb235437ebc188e96715d13376eb3297e96781377a7fb517be6b76814701e48c1b7ee2c5dc0a37007907bf5607ed706e7ed2461dcdccf24087dfa933ed195aa5636fbe9595bcdced4b75fb0a237e4e62eefb70e23b6dbe7f0766b93551fc25edc00437c4a65a3979ad398ae5ab4daae40ee5f7a33abb920b74bb6ee449711e8dd9371f13362a9ca3557374f2e867852ea7bab479f996134fcca7351cc34ecad90ed43942f7190cda8bdc10419be39906efe29ec5682fe734cf75fb7d065662e79bb36afcd75300035681b79bc58d171d96f29bac42bc924d9c1ddc04e6dd81dd527ad5439f051ad06335d1e39925f15f8c387d9a5969000f5d6bb08ba65d3db4f27f18f27853cdd07e9dc8f6a0d28341e558928d832d6d7c94cb03d0080625a1673d3462404e2a5ab7a10eccdececdb36c1b1f7146463b2a2390ce8f147d07cac61b7f5e0feaf7f9e219f4ad5f337a3309556761d343c8207fc03a7ad76185721da64703004630fcb3107debc8b5918c4928c539b4b285e7c8700a6f9bbec94cd638af952025f804c92bb38b887afbec6e71a84c57783d8b6b72c4f13ec7edb82fc25fbc451f576ab77ca033c124c7f776f35b2c39191ee1e6c0ad40a4c0b6c08ad9de6e2b33307bc61b302f351b3824f9131df4f3e23839a44af2efe9b2dea7747c08bf95c913ad27537fa63b6f6a40c7a9f8d32ae07891ed931f92f4c47966e2902c4f7775a53a26e9e178a6d242bfb757f4527d11c4d3d4b36daef572af17bfd54167bc11d7ff3db2b31e06dae18f9698985ae5a765cba0759afdeae6466cf5ceb90f3c0bca042004d0aa9272344039ed5a15ef26a5ff2efbcbb2a6b4dc04f93b90155a37658c3578172c569d3f83f74b103351870976532a1e41b542b8a782b5ffaf4d15bd8adb9ab26a387ee9cbbf78790778395965e4701623e5483d3459732ff1c203ae7983886d205d8c814fcc34c839377858c49df8ca58c3a328d5ab73a30b27242c858dde7e186bcfdd646403895f657120eab3be38605039730ad9ab88df329d5cbe8e9cc54035ff454906c0cd1e20bc3c151a10bfeab64f350d5e9222cf6afcd6fca3730b13273ea2bb52dfce016d64a9d5fdbce3a04a26dedea07a34da7b97cde5735603b46fb195733e617bf4fa2d9ec0fbb6d3028c72a38912d84b420fd062770bd508a8d0fd7bb50b150d68db9b84706b2b9f6db882f0e67847d6c9997cbb6e2abd6956d25e1bf9489e9a6588ee9af771224cb447e7673ecfa314179a8d6f17326515684a38231449d827af6e544ed3892e8469d0126bde6fc367e38584997627b774556efab2036064daaf12bf5907d73fcb064e138db2f3a82cad950810bb9a8064ec679dbe414364a9ccf6a8436e1f15d9a020c2203db261c4bb5e665566b5be1910ad48c945a0f75e4c1c3640aa1424a88308806a6e1938a758eb43310bceb5eec048a34ec5f8b3e2a2bb11f4fc60282c467dc41b3183a62a4c3d61001ab63f52087740459e7fdf9e542f2d321519f56b4d551a33706972569732f1e32cdd42d444243929db4f261b3dec54d8f6502ecd420e083391178e8001018b1e9b4f431c32e02dfbe21e2c1a2313cbd43a6d5890ed00d00030cd4af153f8830f231aa4108cd46188b31d0859155f5480dc4dbc54753395b4bb3d60adf40144c126d8948f048d3a7d4069675586158b9d8213e32c63cea7ebe8fbe83ff643278fdf3130a1194a10e42161e63161f043c1d6c602a8799ec0e03a817e7e8801b9b92e642da8ea8dc85ac917c7b37ae6b59a55e302b05a38f09ee83f02d64712aefd100b63c72755dd731e07b941d8803cf66e30fef884b47b60fa054818c030e80d809a0e6e25fcd7245d69a91d3b98df65b3a1d09f495c3a545eba51dad2cd72e9dc36c1dccf40f954ef4dbb63ca5f1a978f51dbb3cede5b40869c43c596af9508535c85ea425ad32b115e17191b5e44a94a80baa62f0111836046a3bfa7eb168d6cef8d74b2f717b1d7ad3a1bf7fd73d89e19bb396e5955196b75015342dcdff75c7665ad98bd0e9eb96b7506da3240be35df538975534d3a8ec8d1cf93b7ca47e5965a2d205a0bb32700645ec691867ade075c1add3fa313746246646daf6d6f7dc01a47727900e851aaf6eb68f745d2ffece927f5b663f9f2817c06014b1bb248189938be115a8c3ef17dcfdf520874feab420df29e700e1ab83e5667fd8418c91cc031d7e0e8bc1bb512e23d559a0f568c328849eec5835ba0f2579643185cb8ef21ffc9f664721dbe0b2edf2e179fb0460a50597826d7034fce66204e8fd79468e697ab2f9720a1a79684f582e62fb3d5c0c5dc7dfe4074b6a458f97bcd1664cc904dc81021c858e2248bd49061a87cdc68fcb9981cba3b03c66ae3b7a0295ba465c8d8f445dc7d242473c1784238abdb1f1fc32893748b08c3a9887839d60514c78aa19b28826b044d813c408623d1dc6e9068f10ec7955682e0ca33844821001b00c5d0ad788269fdfcee2d8549d0966cd3ba19bb673e201ff203d61a56c132717e3fae6c96f9f366188a9cfcabddd49e2b06bac149d9631b049ad3aeea8da359e4c97bdcfcd6935b5b2ad82a0dcd0f5a2b19f1af5f60e0e742b3e0058f17c69f95c1b827386d77f73224b3d48e4e260f4f1a794559fd6c8624a07be0c467cef467377aed776254821535856f91d0d628fdb7d44b98abcbb49ca1ea67565c88bc84598c37e4a513785dc48333a20e4ed21849bb3d3d6edc90d8f6cb05654513a04fcd6384b1e75f330c52aa3e37bc631be3f1367586f7bd675eec9b00a11b7e63394915687e0b9d94d4505ef52430c0458cd69aa7bf04dc036efd11d9de13728218af394e20201f05171bfd72fa3c25067493b9ae581f1d0c5861b8083310df3aec067ec52a99074c69fa35643d65b72ec7e836e849347deb4fc70de6f1e6387d39dc5707798f9fe34184fdf97f893d9d5b19ec5461a60c531ca0293a44510ce9a8ad0fcc5c3076757991579d9464a06a63b29c2608e69564f79777e6b1fbebc93c27bc1f4c50082038a529b0daa860a9932bb87c14f82b6495cc4ad5c31578dc2117350622547f49e396caa59b00301fe9d04a98cd165fe542be27977d4bafdf818df98e93f8151de1a2cb7d2183d27f7390545e9716ff5e3ddbb3ad0bd72e29e61fbc04827d46c61bc9f8716687c177cd20dc8d12265ed0b3f36bc9497778960c3497956376d977dc0ba16927008c7d74d02e8dcb36336722aef55e7a109a152452ffa657960c6bd0449420228ff47a7932cb3a5f4d75f182478aff14cfa5c2a0d0c970995828d568faf2a1ab85fccaad34151ca06b0195bb627faca0806afbc0752849854a48214a1ad033753947b437f1e12fa3bb888271694d59145e62d8b9108ac5c1d64a59e5d781461b7215bfccc5705a96962a8a3281aa930b840ffec3626cc90e6208d882257f2added717c9a874984cf4dffd65b4e70a6c01bd3257963323283c10f3202b164889a31d4adaa269d84f3d9404f55e96c6e922f89e100e5b3b9fcd6ac884b123fc2ec89c23ac4d27a36fab8c4b378a35f95e5a38034fa949c1f332a73dccc1235c6eea0c4a6201516318a5bde845887fae4767b4427d22d971cd5399f7fba2fb8c554e15e85b2458abae95d25f76c056f37381b9295b7f196b01ed1de14518bfacab57b25cfe34d6f09ceb13ab8bfbcb0c954c35d86724ba7dfef277c254dbc55a05bb2b5c7f582be12e95e9571fbd2fab27ba40ee22d2f19d2b530bfb9ded0e9b4ebf27009da96e3b9bdba6d7d6de66793175bbdaea5688d6b3530514bb856f745f335046a85645228ce721afd923acd20bbe0797a4bb31ca37fa48e59a82e38afbed28ce3d81fc9710eaa03d7a7af98e934f623799a8374c2f3e91567398d7e499d66905df03cbda5590e8e53ff9224457fa0313f0739ac6b00ce50bfa4fe205976678773d2c428aba87721647485e0fdcb6538464ff04926bce6f5877294e18d5268eac1e51ace3faea13ac43377388bd8b43f3bf2f33ad62f3d733dac394750b61638b16695261d5fe427d9df4b5afbe4c481b742cee8bc30fc8437416c2d08e92425f9dc60eeb011fb7b585cf5fdabbf3662994f52b2ce0cd100ffd742664344c962a867f4f3d09e128e91d68b04ffbc54cab0fe3b562cac470b6ca9b107f429e86ffbb2333eed41f0460e5fdb512025e310b28930b3881ec575ad975ca6bc0ee9f34f5b7ef46eeb590c9d5a99a331fa9b02cf229a4fe775134f9a2ad0330d1b2ccba0695652fe29a01203e3a20698d87276b93f0771f92838413bd301a9e515f20c0b914951786761beecaf29528aa1d8241a824c47003cd08b9bcd838184745688b08de3b91f81de903b95f4071652b3a42260ce14f816807e1f367ded033d37de60d63ebf283d93a57a80ce95114410a906111ddb4ce2a470004969e82879d49f179b353559637c389869032dd59b6ca8ebcb790144224d5727e116243b3ca730f4ba44704d4d357143dce916f6c6aa559d745f9f8086be3302e93bada21716af83859626173f3b265d6072faeedbb72c14fe6fd1c026adbcfc76138ba9c841f27c636ecab6ca184eeda4991cf38c99b9c1e6eeca04072a71b680b16df19d40a24b4c99815d8aa087a9ae168091e69fb774c28e860d535e77eb6786629da2b28d571d227b9eaf447e079ea74728c0be85eaf6e1217b346b13bfe75e9df81d5d63edf3715d20d5fe4c46f9d3947b0586ddbfca5c3a91d1687f6293c80655e8b47166be3cb94205635d76ba4687fc385c7ed64b8dc93cdc49070c3fbb5679f4c549d1cb9a9bc6fbf2726d90b23fae6625f4e2f16ac82b094a24bb4921d3595bf13f89c877729261ce7d06780c81c8f6ce67affb5ca834b9a03a51787f81e764b92689da13e8ca20e420b1cb70b9398225b86971f1d72a384fccca1d895011366d81fdc713f1096890bf0d837cc730ff908b9729fbe5d3d01dd3abf5a702df58d1c74b7eaa79e9d6cc55141a83d305702a6ddf080703a7b49b6397832c3c23959605146e27a2bf8b0d7085f05cd6fa8cc4b57304355d52d4b21290ebbb6b91e3d668c7425ecca02355b9bfcbc4ba10ef01b767d87b790b8feeda3f2334a9d188e15c7a10df5aada37d9bd4c2e69ff5d0f2679b2405b1e0198518d98af24720b80a6ae00f8ef9f929d177f6b507627b07dc36fef300858d7bbff3bbd9e7ed2375bb81e16028ff0cca56f42ca73637ef885ecaa3c0fca9e99a3736634fa5df0932e2e81cd7a097733ded755da6d5b8a417429ee75efc02d51cf6a0de944f6d3a62da26b27e8fdd2096ef8b45b5d84734be6f7f81d41ebc025af23ef4233be11d61f9743f12abdbef33d585f331597eda2109c7fec4f7fe21ebbfe5533b0e0440efd5033c19a62aefcb7a13ac23d4be3ed04a37af7aa34626a1f7d559e08738ba352484a528df2902f531a2452eea983994defa5b28a434ce375f8823797b2da74e47aa4e342045debab2e7974e3e235c336fb7d97bfbc80e7cff4dad89639b5f73f348f0661037f2c45225298339fda2ede6a80d7c105ec8c7c4847c1e630207222d2d6ef389b3f278c09b91adfe1ca01d23a0c1f8e8dcf97427b905d0c43e999ef3b49925060b943770ec330e2d9c77d15ea0801c71d0901600fb147aac33ac97446ca6f646542ae6f07b8700eeba9652e4efbf3d876e205f2de7d9e8f78dba48044372ea06937027aef78aebe92c26a3a792891fd04f10c771a84efabcfebb418a8a39f341ac840689923adaa6bdf547b6cb5903d27f2000528b694ac3f81cd94b773e79c27d9f083f471cbe815cbf6bb27bf93fd31c0f9d6ae25e4d17c653022a771d3078f6b5bb8b2b8ca725a36537af616af11b06523a4c39e0971dc85e06cf6aa235ad883b6d2825890d8087f01aa53cae166f29805bd071e4c4e762f39e4f1eef280682c5208a75d127d470d2e6fbe8ae33d22ef763a18d85e36be0f42c61b66cd32ac21f06fc06ac495bbcc5939766bf56bbb4c2016d06a4d69f1b77d4534e15af56fbc39cbc017af6d7170850b2f58db8bde322e0226699e359ec180fe2f9390597bdfd54659716fba066d09a827c6b17a8680d6e55c0fd295e846f2e30f78bffa59ca582857a89e6b301e893bfda3b0b757ce6e43053458f89ab1b023c969e5bf469b642fbc72a0c3c9702c1df64cdbd3bb91ba2b243557ac27e7b4b6533a1bcbf489df62c4452bfb66aba0ec242becf4375dfe6cae7faab15bdf52e4e4b5abb96333a9378469e47b0cc30ccb9b94b2e60e73d95438278c373f9f1b43141ce0006bc673f6392a7d3edc131c9c1e3f9718b0cc26a200ae005b4face43402c9365db98fe1378a25b0cb0fa954c962760db87dbb3e91b882b0e84fa719d5fca6d5a732e275f0919e934c41909da58dcff0430c77a18de544d6503cb78b06ec58d6c0a06a2f90f9c371f7bc65ca90e38140d7bc5d0645ce0ee8e6aaadae1cede5f2f5cd1901193987a0dd7933d875d685ba05a3f08df40481e945027dc0bb10baec1ee0726228cbdeb640968d68623488df116ccab198dbbe810cd637fc9df9cd7d97806a8a5196495749651932e1e4809332e402e8ede6ffa45fb752b54be3685b329ed2a0abedf9aaad29fd5b488d837de830a5a314c24de2cb8d5bcab760509cfdcb8beacba20ac3cb45403f8d50eedd1ff1f9a55d68f1fd2c6ef1f9a91bbfe284970bc2771bb5f7700245b42f8fef6f91b366d46e977a40fcf07d0f95f5cde67539c261ed1e609628f3b711e27eb9a80e3e44a094deb37264db34c9043654e6ae7e0bdbb762e74e52f9b6b28cecc3c6e9bcde2a1745b281bc2068d336d0d46d157c63d84db12cd06877e1ba8a2ff717658d4edce6926c6d516b7cff3c600ecaef2a064f44fd2b285c1f4040beea35e6b1b824d74f9da83d181e27acb2bcfde1bd26dbe2f12282cac8e32d5db553e777af177ed78408b3feab63d2a3de824b0a6a801ce309f94c1f8a72ded9a4ef60cc5b428cf84ecf8fc5652c5145bd18b01ff95e876cee2d7bc99107e33fec0395a03c1b285a6af342526d9eb281c183a97a3629728ed8294ce68579ee629f3390ad6f92b7554b3194acf072b6e4f66b39082428e47e10c8f0411fcde9680869e7ac3a2995396a3ab698b63b8a21444cdf2cd8d0abbdd07e10a2fd8559aaebe93bbbd65aa33137809ca9cb9b4824b9a3cb4b51aa24097768aa62b21262d93f5ad03410d2b4f5b126ed5bae4bd52a7da09685a7817201c5eb75b8a9487e02ac526ad9a6de9677bf2d034131676777bd6de7cc16970e918e47249f3d6d8f9ca9cfa457e645fe99e4dedce8d728a0f76aa437a56e03483ad5e943250230736ca6ae06b1f0025183bb80f3fe48da0eac25a13d12b0786eb94324269c5d39c0345f153f298843a090be5e4955f82b4b115fac469cd93438a513de16a7dc345d6a061b09ab9e9c5d430b312d0fa2e0c34d4305347d6c015e531be7eff71fdf5033a3015741c7db7d51aa34ab4e0ed0ef4934b675bd52db0ffc4892260c4964f315e54bbf0d2e5e711edf9d7f501d3f2830d75817e31cfbf46129912130dafb1e68583cb49567177314640760a0f98490b8cf83b6e88d89507f2c6d2ea4c8d2c98b5c023a4a844529315406a70d08ee001e201e8ab6cda96aa2df54ba61b2e0d5f81fc9f4eb22158932c8381ce96f2e319e32060b3ed25c817542ddc59e91d07d3c4437dec450b0233c2d6bad17defd0b233332ca884ab05c15173cdee53251832d86120e4997781164862f79fdcf4771c84e389073836a14b03b92d9c2ebaeabe2fcba31b6f083a97b8c5f60b5d631fce116450afc542aca6b5e762a98299de01a5db0c27d043ae30c19f7429f8993122af94f69d71676700bb4df6c9e4b2a373ce61742a3d4df606d4df3911d8e0614621ecc300d3bbb7726602da866521e72ed354caa9843a0013a3b04c98ab70061ec5718913603d44b33173d6c8155cb251f8a1db3b8eba17c71890c886dcb06f3413b0207a12814759a43fc4d67ebb498463ad2def00968aa0b90082fbe7b8b9b77fec344e859a47216fda3f1bbf3760aa8bb7f78933268801a411dd509dbb0c7f5661617fd37798e3e734d2b35264f870ada57e44bd6973d56d1587dd629e29c68bb9ffd668a5c3477fdb4d301abbce8cb4f27f691adf232394de18467c19d7e4888b91bd90ff2af40d53e7aa3e135990081477426ddfa3f20dbc6b028e3c44f70a3a60b0a6d001303333333333333333333375d46fbdad7db190955292e5e18daf419a1dcd24539229a524c64c7cf845daf01769c39d99b584d09c3c100b120bcf0a2851cb2baf768d900de792313d759b637aafe1ac57b14932f1948c41af868312a5264f1c35d2459f86f329592a5de65eb3708286938a99ed8f331c4ded990ef793a6c3ec0f339cbd04d5a0ceabf32f2ec3416cd275ba6499fbd09041ef7459d10aab6821e2ee4e5e1354ab1cf818c359a4d7da98cc7f92580cc74c4ab41bff1edd2786e17c31fa6ec2f6b254309c46f69cd810226c63f7f185935f9f5df00cfafefc91353b2f1c46654defa7a6798547d674887c74e1709b545e0ab296044d47d6ceee900bc798aff1b6d35b82f2d0f0b185932443099ad7cb6ab4ad8553be7c3319d4eef2b859385a8fc61b954933495e202404081f58384893b382bab022b2095cc7158e25bdd22f263935af38b286036921d25bf89e0f2b9c654b92e992fe4c4989dbb89144aa50bd7a251d16542229a8f167a518e0830ac7395f53a1d71029813b8ea5c0c7144e299458162ade4b581933f02185f3658966cc195b634245021f51380969311e171be386190ae7dc52d320c3f629d11cc116376c980a7c3ce1181783a991b33be170621293709bb4be7235b27687818f269c4acaebb45159926836b2960267c2316c935fd2269afa19818f259c6a9477e909325a85587c28e1702ac57d13b3040b5ac0cefb3e9270d624a709a36269d0ef23e170319fea159f3d25df473897c6d5a4c9af94f28c118ea6a4933d2c2899f4453867bc6eb509a164ee9708072dcb27b5c62a4b490ee11433252546eb26845392e14466464d0f6dedcae0230807f9ae69d5d25bcb3240385e4cd1a92aa6cdb6fdc161e3766c8abac507072d776246bfeda307471593d74eb7aa0525fec1839356fef22a33212bdf1d3e82b58f1d9c9226c984ce1335fa24710b3e747072bbd4b629b5b5db9e83636d9f168d3f52776d1c9c566f4fbe24d359d6c90d4e77faf664b53e366d6c701294523e57974bf825c238f8a8c149d2202c6e7f9e33f8a0c1b12d25290861216492c7e46306e7d294f164f0b56c5f195943816f21b2c58d3404d49941012c66e80b3e64705251b4499bf24eb8e53f627092c418755d2dda76df1f30388999b4063d222bbca55f718a2529a5c426b9e260ca4b90b271f5334e5a71f81a93f469d2a87e29ac38c99ad484122728694c721595182fbba225a9e270bd6a1bd46249e162a93868ca56db6bb25d3a0b15c7bbd3dfb7909fe25c42cf29318fba50d11427259cd053bdd8a45b97e2643a6b72283925fa894871fe8cd31663cca429c9284e4aec4d4a5b10a5945b44710c279c2c3d96a4c84986e2206fcf6773cefc251d284e921c4ad854259bfa4987c7278e494dcc551725c3463670f40d1ade372410e2e189b3b5aea76528717ebe4e1cc346d125e5f6c6f4958807274e6a61cbe4d3325153b989839abe98fa7343ae22366c201cde2a810e88a4c04313c7cb1eb779514d9b5847d6b4701b478b1b3916901cc7054242b4701b2e810e88208f4c9c4fdb9510272ebd241b03332880c5043c30917ccd91971b4dd6bb056ec0e312d77fa9322bb5a4ed222933397c478db4c441fa6f08a5338556897b5462d93ea537d49496886c71232464068d193466d098711812328302397c8703520d1b3a0c8ec28312fe8e98c9c798863a32c70e1ced3189d36f5e8958d1384a2549e29c7d2363e613b46c7a366ca06410b0c5024242424274e4c0231210f080c4f162e97f7793471c47062f4996d5dd927c479c772d7d656f7cb1ad112765d25a10a1c4117135234e526532dd2679cc756511c7fcaa6462c8137f9398220ebb29ead24af4ddb43c12710c27af5d4d696d93a30722ce226342672452b2e0718883f68d292ce79892ea8eac215ec1c310c75d8df937fcf2c5e5377678d205d282a7e05188838feb858e293bed087132c94dd69bca95e4268dacd90de29829ffe6bf4ca1f4565c070f419cc57b839e16656206111d3c0271dedecb5aa566797703e2a04a082d225fd36c4ffe703c4b7dba339ca0ba591c3cfc70ee7a0d25f7ce6fdcb00fa73e498aa3e1a265ee150d1e7c3887daf6bc2497c624ad65227b38a8f28add25af9cdc4de2a18783ce12fc2b7e9ad6b58cacb125c1230fa7ab56bd686da1f7e491351d060f07256ecc7b0ddd65aab4c3191012727687f3b68685b313ce4d4a164aa00322012884871dce7e629416a14a8c66721629d3c1e75187539233a579e934b2668603e14187a3958dde06216c4f0cb31e3ce670fe5d13734aba5c9aa99b83871c4efd23be8205a5aaee8daca1c5c1230ea72d25bbc9184dfcbfcdc8daba8d76c01613583278c0e158954e34bbcb174c6a3368e4c1e30dc73cabd1d6ce0f6fd1cee0e186d3650d32c80d6a5265bd361cdb82d56bbc60412dc98693123436e836c9e53259d670b0bb9284cad57e91ab1a0e4a1235414bc494a92a0d671d796752ede5eb17cd173cd070f212ffd2e4652f789ce1d4a34dae2a67849ca4190ea3b4aeca9f6538088d77d2454edc982adb8207198ea5a46042ccaff4e58b083cc67012b127b67ab38cd5ab010f311ccd55837f499a9135bc814718ce63d9276eb0245d3cd1c85a0d3cc0708a0d37a5bbedc89ac88d3e16787ce1d8e9afb2e2e9223cbc603ac933ffc98b49490200267874e1ec7eb9a361e7c424e722246446160c98111232230b2c668484980b80223cb870b4cf5259841495369a3574d43801cfc882013b6ae8a89181b6e13516202212121212a2809010ef9010118f2d1c7e4dfabe7c5f0be7303133595d4ef352164e276d189915efc336848593caa58c49caf7787e85b38d92bb43df32c6d558e130ba4dd07f8de93d57e124fc55bea87519ea5c2a1c4bd893fe37a54c4a3785c3c5598a5765d249964ae124df896abbbfff2a89c2a93d93a53169e229d10285c3a7263deb1fa16e944f38ec66c98a7ada3259e784b3a5c85462ac1a3d9a70d2d35c9ac4bf623563c239ecd52f5b2d8f259c2e9e58e5889c76df3d947090cf70afe92edebaea803311c313f4c12309c7d07d77e2d60609c760250675b257bcb78f70d61151a74573e7097a18e1242f9b248d12db248dbb08273bf5b5285ab1922811e120533a512f65e34d673c8670b24c299a8989ff1eb287104ec964f5b1248545d423084713844c11a6ff073c80709057a2f58428bfb8491e3f38fa8dcc9b2a5808a53fde1613c0c00466d098111252f6e0e183739897a445a6aa8af5f7e0a0528e90b94ee44e8973e438c68307a7582762b26b714a4346081e3b389b7cf27f5f52b3ad8b0ece95af43334f8e77d1efd8c24f702c0a1e39388a2849eb97bc17a72e143c7070cc99e1a4b314e3eceb1b9cb574ac44897e51f7b5c1412551319724bc5b542b13c12678d4e0984b0ecfa86d6155a58e1de538e04183c3ca9a0a42ec5254563d66702c372bf9bbf615caa480870c4e615555a349f76ee5086ae8d081446e34bbc0230627a9dd72d4c993edcc9a1678c0e098a4ff8c1ab3e8f9a847d66cdcb88143e4462f0b04f08ad3c63a13a5f2dae5762000579cae4e4c826bec52c2e53a1d08a015a7ec2a5d139e51373810002bce9a92e81757e264bd1b5913b9d16a0301ace220da35ce7beed733aa8ac39ad4d49d2659b9d9236b2515a79c6e7253e8f6545171126c749af62f29eaaf91b51c22373a692080539c446b9ec855d1f2232e4c71b63661767b4fcba5386729f935d3f59135529ceb5d2d45bda0d51dc54910269dce6df1cde5e06204357e8b938100447152a2b425795b63a5141a590bc52989e3ab39d498a416b9d1068a837cb52475e691ebdd46820c0602f8c441a998368dcd7a48931a597315ac270e5ae35f8cbe54a29a143492b413873be126a5f7cb2a16ae40009cf87364e74f6e7f930da443c4cd6664c180a2a304a9c68eb221086013e7d0a695e9629228b1a11b04a08983d03cf916a22c83003271becda3b264cc959f2937060160e29825c5d29854b2bc375de224db898e1e216627463a0206995b065e18014debf0bded53253ab2a6233ad048cee045116af0820865cf7425a62397dbe2468d901743d0ffbfca43a5f4af92042f8470125eeeedc492492a684138264128d147652539a302610d2f7e70327d77a755f2173e389fe0f7e29742b69de4c8aa1e5ef4e098b2f9f27a99895de9c20b1e24ed09ea4426a5ab1b5974c38b1d1cf3a9bf12c776445f2c0bc20b1d9cf2cf9c6017932a8db332b0838b1b5d202cca80f0220727eb4bd26b494a3431310478818383882fa9fafef135ea1b9ce3378ead497569a3f4c206c7db92a1c205939478a5458d111d2127a87c5183826d7bc8cfddf4ddd1202be9634fd83cd29b012242c6e6d5ce2675aee0850cb8543249ea47fcdc15c1c218bf88c16164f04d92097f67bebf80c149a84edd3e8d9a529202f28a5388b018b26295ad096601e28a53b0381afa7305405a71d8da5395ded24a885ec4860d2e7e5971ecd4bb1464a9f9b95e57716c3741e6db0abfb07e17441527217e949f7caaded7a21000490567a97f490e61a645020415a62fa5629a1436483febd41320a738d66f64f59b8a27396ebc087702c41465ecf712c4d505734b8e1b9c0029c549e5495b25e88b2646a40610529ce7526ef76dff7e79a50c20a338a66082c9246fd0acc12424242484458c9b00228aa3996e5edf08b539758e0124142751e4d2a8a5b95808f70b20a038e91fe52676c80c2dff27ceb6aa5faaae496e9a3d715256258412ae39abc74e1cee5faf342f49b2e7ca89a3a820d366eb5900d9c43155991215956731df9a386a92f23bff04ada0994c9c6bb49e25b97e4b9e6903e5702d7c04c7298889f29a74ca44efca8cac71a14324a1952d6ed8a01112c2209738c57d0db978525c2f294b9cffa4d0de95372971f29540dc642c0b17d37117397698ad190974408403209438bae59374f6fede78aa05ca91030108e890102b804ce224785cc6346196c44999a89151a77a23ac8d84490c4da2a82dcfec8d2c0df30308248e49dc24757abecc5b37110079c4294e12f4c444f192527464ad04ee3ad201208e387aa92e3bdd6762e78cc50ea4671a00d288937097922cb761d74eeb0510461ca36bdad9369562ecd0228e9fa5ee6f644a17d5375a005144ba32a9142625292a2840390c48228e9b49bef479923893d2580041044aa5df3f4d579dcb0a821ce2a084b1103539fef5e2c81a6615400cd15a12e7d29b63070e198014e26c4912f4ca96e946cdccc882015e2347165868014288fe92a4caae66d384236b498be8406a0db04b800ce2f45f5682d028276b5d4204718c3f7aa4a5e5a54e8b1b395e8b1b3916d0458e2c4242d2042c10722081405d14bb5392b5c680783795ac64b27f405fc5c514993aa32c7ef8aa9259969c6279f47d7864ff79ffc891d18c0fdbcde630bd64b1eedd83deedfb61971e0c72fe17c5648913ee3cf4725244e54d52df5df0d0ec9c7946ef60d0533959af4b4551175d7663c7160e28870369812076388b34794de9a4ed9b53070201a40ec7d426f969cdd05e264e87630655223e4c5e853ee5f01d0ef001c81c0e7227d57c643c7e544e0091c3d9d3fb7db54fefc67138ac9b2489b1f45bca5a82c329c620ffaac413f388fc86c38d58aee0b1b115aa8e2e1c026e38a99432d765650ce7a7361ce3854bb523464c86860d9852766aa98472201c9e03078d19342e80026481bc3a1580aca15441339646b9241796524cd6de27c4a2854b420510359ca4d6acdc573c0d27b30d3288c6c9cb68d17030d9f24d08ab2daf19e40ca712a326bd4c571022fd018819ceea6342f8c6b60ca753ff96acc24959a5428683c9221b83a5565eccc7700c1d1753d5e55326f36238aa8c90565731a524fc6138a9cf7b9149c560385a999d3a498e39b7ec0ba7d39275394a1c377228202404c78d1c0de28593b87fe12246293983cc8e1a5c00e9c2616366126f82f849290cc28573c7ade5f72b212f07b285b38fd0b1154ad04a723572ec28964007440600a285e39c2469499364dd46516980b0a6e4d6144e8fde73a465810264013b14a01cc812e8800816205838a8cb3ec9d4db528ca104b9c2414da892e4096ad6e492158e31faae8929a5aa324b154ef2bd49b8924a2a9c4cd7c72da9532666a67092bfba7563775238fcaaba49625611d2aa289cdc9257ca134cb098432ea070acd324c8f83831266f9e7012e39a38aa311b4fb64e389eae95983f159f0d9b7052520c1b262c67fb52056f00c2847385b3937f92dd7b97967092a694a4c56283a7669570581157da6c4f775b2509c7127621ba049d419a1209876bb98d214479d87c849398752a47894912b6a1114e27c6f71151529db4398e2eb2c8e13870a01c1a0029c2e17ce3f7b66b8a004284639778ed8a7183925fb288810ce130f2d4cc9c24ff6de68570d8703a3553a94bd1618a8e0bb07a8e1be900204138adc6eb568dc164a93010cea56f7bdedabc2c363f3889fccfa0c27d49b9f7c1f12471641ea1b57346ecc171b69420ec4d12544ecb758884847897e5c1496f8af94e0a6f4ac9ba12e880480d901d9c43347f6b529563626e55021d101101880e4e69faec3efb4fae248100240727176196955f936421c6c149923f3b95b5c45ecf6f705236ca525b84a9db24236b667e0103b1c129caa5dc7449a8ae7cd7e0a4c457b5553b716450d2e0943664bacbc9eee96606470f3d7972084da9dc0291c1692e899794f21e2fd546d60c0126f00bb00189c1f95445cd2047a624e3775910181cd574dd92e9ca3849fd78c5392f7aa9dff8f1559d2b0e3a5e554787975ae5225ab4c25d7199b124236baa12e880080a3e58712a7153e388b08b297f68396ee4c8513e5671dad172c16cd6aad457c5f14bb854350bd20415a7e2f8af49bf68afff93222aced65b157f7cd36ed23e4e714cbdf184ea3e416e693e4c910a0d951a1fa540ad49eb980da3bff90f521c64fa3069adb55733f5318a93ce2651762909affd73da62023bf810c547288e2b239f9aae4bdd87cc141d497d80e2e8f69ac2497bf2f9db9f3899b4556a474f5aa6b4274efd6e3f42bb4e9cc5ec4226e1e327a912278e625535d2c41f15ffdcc4c9f4c5afae114acc851f9a388949fe15b959348d4c1b397c64e2a0dd3ba48950a6265416c1c4c9ff0495315cdc2e335de2eca2b7c1948c8f0d62193e2c713625b3267992ae7492578963efd58813111535895cf8a0c4c9dd2e575c34ff98c431e912f308f313fb94f4073e24717c9953a6fdc78491211d5c201c223a6a70488831537c44e2285a2efa7cec913533adc10724be5df3bf2fa91c59eb2d6ea86d31819090da507c3ce2bca677346ef6fa4ec487234e52cc1e97fbc7cec2bbc3c347234e9bccf435d332f4e60b1f8c38c5b90fa54a965c8ce1c85aef8c2c18e0858f451ca4669e9d9b08252551c4d944dd95a87b41c58cd8f09188d38dc6787b6532f535ef0311c71d214ee58fd1c89a8e1b3844762011df71630b3bf47188936492681ba38fda499246d6bac8b1c318e25c234b3ccd64b7818f429caaa47ebdb45a4aba87a346097410e2749e277fa12fa7423a72d4f8b2bd411cefabe26a9251419ccbdc64a934397b26d3858f409c2dc63c4168ee96e630a9f00188f3a672cbd51759d5a31959603103a7f0f1879320735d67cea0a4922d3368cc7015d4b800a2404808143efc70acbc17cf2b5c462bab4364ebf0d18773878985ff1a2f51914817397694e185e0830f07793f6292ead0fea18ac3c71e8e2e9e29c6fe5162263d1cd62f870ceafccd52521e4e7ac23bb4a5df70920c1e4e222227879fa0adeb1d4e6ee27eef42f4f555ec70909669aba3c4f773ad0ee74e13f292ed9c94753a1c2e2b978c4fcd2d253587a3c6db932ebda46897c8e1945b5312b9cd3531a9e42730e38f389c565456aef8acc8f7e170329b9337732c8530e1379cbdc452cf927a49828a1b4ed2988be5698cb572b6e1d807ab385cda26ed730f158d51c53993cc99349e8ad8f8a6e298df21767d7275f38a8a839c8d7abd3c2d97524e710af79139315cbeeb668ae37ccd99b867e948018ac00c1a5d38044674a006a8276094e23c27e742a6119ee12c18a438f7c820b3bf09c6280e26fb5b839ad3cbb768cc280acca031a3263083c68c92c00c1a332a023368cc282c66d09851109841012c66b40186280e62d7347e478966f587e2d45a6ea14c1067b9e44171125759c33fd3d6ebfec46937d4ee9934af1edb13a7b1a00495efce2d21eac439b449aee9da544e9839711ed3d52ec2369b38e88ce6259c096d1a524d1cb5a468410513cdc4a97f6f734b10a7e2164c1c4fa39f59ec1bd728769163c716a7b7a80181193466d098816b87807189534ce2ecb4b5f74e2225b871a3015deca8916ed8f00cb4a7a0c60242424a70e3c6484888150286254e51fddbdab4ff7c4e9538c98cef71bf689278254780418983bb6c989d4ba5c54223c098c42949296595a4d5e62e248953efa9b513cc826fec23714ae24dfb8cbf8ef70a89e35f95da7c5d49b39c1e71907e5a2aa920eeb49e8e38555217d4ff66cc4a9648146034e26c9d7d9b64d1ecf2b5076030e21c632fea2c4c9c24bc058c459c7ced339670ebc85a81a18863e68d954bd1aa165a1b301271aaad932bf3c698850de5cdc88201a5c040c4c9c56b636c7985b1b200e310270b3ad5c42d6d95843bb26688637e56263d7fa92419cc32051885c894d64b6d29c997e0c68d11117fb7d135eee8008310e7952de5a5e264a9243bb256a800631007e52e56928749ab004310c7a07e167ec653db47236bb8c504688ceca8a1011d366c2060068d193368cca031430bdfa1a38b9365251067d1194f0661a374b303c429e5c85319d467be942c028c3f1c67dfd2ccaf697d29f9e124e3595bd4102747d47d38fcac9cbff75a3cc92405187c38b8e50e15b7ea3d9cdc924c1ba3f866d68c1e2ca48000461e8e772ae643feb6c3b57c020c3c9c4caa85eefffd0e075d957636cd4996a46d87d36cced6139692aa2fa9c3f1f49f64eafc4fa8d2d2e11434298bb1c934f3dd399c2a5de61342ad72389da047895063b1b448e390984e7a9bf822389cbae74fa957ad586b79c3d1ab665d355838c12b6e38658e35653ad486f3e811254eadbc462b361cc62c66afa8d7800893a974cec49243425061a8e11913277985af8ca4e1b06f2a85bc269935d175a0e19c7f332a1bf394b8fe194e522ae5ada3e5af6637c32949b778614bbe31612fc349d224fe981853ca24dc6438064b529fc99ab12bd3633897a5f989be0b1abb440cc77193a4b1f2fdbb2a09c3d9dd4c9f4aa50286b3dbf7cfc8f2b6caa44195a4241334d35e38c6311384d69a9f73b10bc74ce94e550e2529d31d1738b8704c9ae63e665316d36de160562a7429d57c25f55a38c9198358673a25df48b37092d791d3a7d5193b2c1c744ff4bdb726d3ae7092be4793582322b3712b1cff4fc6a421b7fd4ca60ae73d935955b7637254385f4953bb5ca94f56740a67eb1d212cb56f45b948e13c3a47447d8c853ba370b0332568ea1235a5100a2715ca246d49de6750e5134e4a496243bbafcde273c2418afba6696f597b309a708c7e79922a93e1a465599424c060c249f690a2eeaeefa43659c2c9dac26810b75bbf91120e2ac5b2e65237a7514ec259bb8452dfa474fb72483809279695d8fc4999fc239ce2fda57c5fc652a289114e41ac89c1f636968f49114e2a4853dd61314b1c11110efaf289b9e23335363b84936449ccd3e9a2104e51cbf63266d6248e1984d3fbc9a5e7d6994a1202e13027a5d22b4b5329e97e70123a645bfc0491b2fbe0f425675b1c35b3650f8e515fff4249a76495180f4e7287506969ff0e5e2da1437da8df6f644d73ecc0815dc0d0c1e1f6ede4aa82d999520e4e55e28ed237d93d49120e0ef2be33abd91b9c4a840c9baff2998c221b9cb46c1aa12ea89794c4d4e07832c5204e49dd6ad1a5c1496c924a6d85111a9722028c199caa4c2931ab9daadc911060c8e01484a9d793a482002306c7fe4de2d3d4ee9a9a2c1460c0e0202aecec99ce7c06fd2b4e494b4d2ea51cca4626bc70c5496bc3c8a4793ebec45b71903b37fbebcef03bdac185160c48c20b5630666a1d6bbd9b5f0552544e18b1a27ad6578517eea4cb348d7d2a761ffd1527ece42c1d15a9c8b768e256f47d8a7b4cdea43589b5dcb429f497d3d6642996b026a53025e9a22f8c50b20991421363562f29a348bbd4446b4eb73a89021d7527dcf8ca55098782937d9428139574507c6286ae34e27fc3e413eadbbdb79adcb2aaf1049be14ca894625ab774e22d31532cd1d46bd59cd8040d6629b7e9e126de6452cff2abc837d1445289c1c4d40ae55e268c493b342ec5542fed4c17353189fb71202dae0c07d20273dce014bcc0c42968cf659c515fe22459895527eb84fd9696389b583e49a534c24d8d65ce850d749538dd86da1cdf8e4df9a6c4c1a45342e5c7daaf6812c7afb46549148b652ae9800be0e0a25d0121212238b8686f2cbc90c4315c98f94c19f3f505a3f02212c73fb792296667266187c44186f2ad3325c49f591e711031296a34ceb64dbb138484983bc139e185230e2a3e97622f7b4de6ed45238e2242591665256d2835238ea7f5b6bb6377a5398d190ee062e402a9460e5e2ce2941743ae28edf36fb28a389d18f38c9b722da8331147fffa2ee525d9e6ed11714a72429546cf93a4920f7192ccd42fcff5ed06a9210e7ac4fdac66d057cf14e220ff9292364a8883e613a52fef8338e8b7144b57de3cbea1208e1ab2b4873c2526995c20cebfdf23366b6238ab00710c97695edb2b32347a80177f38d5fc26b9c28e924c6e3f9c526ba9d0abff9522f7e1947adfdd5e5f167d3e1c7c830a7f53da4d78d76be4c82277bcd8c331e8f82641ec6445553d9c9429ef2b95462f9a46021d10d9e2451e4e41fac966354a9518453c1c4cc5d4cc68aa4d457364ed0e470d938292fd2eab67fa0b3b9cbd84c97422338952621d4ed9a397440ba74ecb4487638c9b53dbed9a17bd9163870eefbdc0cde178726b3c5d7286e9725350e3590ec72ab12a681d2f111dc6e1d459f13b2aea6fb85568bc80c351540813174f8c96692180c6880ed400733890166f38c4e82b41e486d3c9bc4c1553dcc6fa369cf3bff45538bb6c97b47143648d022fd870558ca66b194b9990088be0c51a8ed6a757642c41cba46e642dc78d1dc971e8d8a2c6045ea821ede31b4f0922c459501a0e6db2453d8b419f3ab2868683580aa5257ed49576475e9c0151e26851e1f6e636837eb6195bc94a96132bc371adf2986c8c51c62491e1e05e5256d16dfd93e2184e2aec5750b2bc522c59319c2ae5a48dfb97f284aec2709252fa7559bba44fc8c170deb08d63d2bedc46d3174e4910bb95be37a344d90bc724c97c9b26255f847863c71635ce92012fba702cf13586d314f4e9ef5c38e6bacce5d05b5b71c08b2d1ca4c6189fa7d6f2ff480bc758e59be5c459382657b558b2fb6fcd8985532c29fa99085d528be60a275d921879b15be9c6c40ae7d88a69f1ad2bd7e6fda20a471925e88a2773d38726c70d916cc00b2a1c3e53d093a14774a8176d07175af0025e4ce1b8d1f7dffc3eb4942422396e88a000e528a60f782185638afa6934f78d4d0bb40bbc88c2497e89a95749ee6fedc85a2a2bc00b289c2b573a93bfe79edf99e08484e0d0228de0c5130e63b79b256e2cd444271cdb4a504a764ba3be54e945134e595244acf6eba9e9997050cac44f1347c7edb44b3809b769e45b73a6a431251c637b2853c982c56653128e9779a9e45df0d12b23e1b026decbe8bb536284473868dcdf3a31ef0121217a8290103dc1814186268e7ef2bc84c9d3a73667e2fcb5eb23c435579e970258cc30509081896316cfb8bf8b232c4f645ce26c72dec9be94f2fa5d6c46160ca031838616690329054608199638e94c32596e8fff7d46160cc8e1366c201a33b2c06246a2838c4a1cbfc5c4a5692c132ca7449260594ee511a3e398c00c1a3370dcc8a1800484846016644ce2e46155fabf7a7e2b5c08081992386566879d98effb786544e2b88b1dea7476236b5aa4149895018983b41c97cba47b02ca04198f38096e216ec25376e64409321c711a25574a57b9bf4afe8320a311e712534ae72165469cfb64bf2bcdf6a529b38893ca209454de9792eea588639c8a2a757a4936ce449cbafb2e885bff9efc21e26cf25cca99727d8893989a4e97d2ce13a631c4a94d5eb3e5b1bad3650f6414e29832ce29b3f4a3c5a2c640904188d3ffa824e60a4aeacb92411cc45c5f5383beec8b88031982385ff69b98b435abb21d8853503188fcab09265a8a0c409c5c843241dbc49a129d8c3f9c37e5187d39c4095ab11f0ecada4ef36c9f4971f2818c3e9ccddaff43347d7d669d20830f47f5af92ca4bc54456f6702eed18d5120b42255b0fc724dcfec9603994a4a93c1c4fa8ab643a453c9cb469c92785b81b3dd21dc8b8c349ac989891b75f66f232ec70f04d296c3cb945e8ce7538995465956944c3be47875392f3253d4ddc55d3399c549053259ab81c8eb36a1e5f412e45ae71389a481913b53f49520bafb8371a453f7dc3292cf32641ca9cac3371c329b3c956b2ff2879196dc3312ef5a68ad17b92201b4ea19af57972cd7ce46b385dbd55086d2a6a38c7952064894b11d3571a8e1a67d30911254b4c130d0719533e79b7c4661deb0c27b14c8cb94513eebf34c3f9640837dd16553f746538f8ef85efd9d43e4924c34133c585d29745ce3e869358d61c8d75cac2956238f8c609ab63b1309c8229e137264f8d0a170c27cbcb77625dd2392af685f36e2ae9cd24d7ebcd0b478b5ef13fbd6493af75e1685eea4e46e8baba950bc7b5caab1062bf2e865b3806afb79343673398182d9c33de09ca4a36f94a9fb270b44a429a12fe46a7695838ee9f4cdac4ccae70f0d573bbca2272adb7c241f9de86cd9792acf9aa70fafe0a172534e8659b0a2561edfb43e8770a074bd1f439732605b14ae1b8df3ab7a382bcdd320ac774172625d7ca4d820585d39d0942a65daab4583de1245e9692bba377c229efcafc8bd46c7fb70987dfb2cc58bb98703419f72646b64b3828a1d7246b8db3aeaf120eaab486909fbfce6d9370d271775b2d2d2557868483a7a693c7247dd1368fac2d41c6110ebae74797d831379919e124556b9ccd678651528463ecab9a667655e68b08c7fe9099de372acd6f4338a50dfaa1312cce8e2684b3ae6e0abb319eb2a00cc2d1929f778fbb40385fe8c6f238694f473f389bfa8bf12bde33c9cc0727b9cf4aa8122ebc95d583832e25053dcd190b35f3e060b124b9442d71834c6f07e7cb619250f3a60e8eb14f8c9b22b71c1c665325295c4e6c0fad0c1c1cc4cf5a4d45fbcc08c9b8c131aec96b17831c6d92a80c1b9c54aacc2477f9f92829193538ccc8502ab49c09ca743268703e39329a88d57a4553c60c4e4968c59dbcb9727b284306a72e25e554ca6fe1ef95118393a4192db3e9d905b764c0e024899b3bad73946872fc8a738ad21c9a45c615870b9379f2e816f15d2b8e416d08717e1b9692c98ac3fe8afe9e3529c6e2559c3699b0d63d69f396ab8a9398b8172c8aa57c99a4e224c6aceb464baeb91a2a4e426498ac71d3a54ad2a7388fddabbac664753a531cb35af8d6cb58298e963a33a665436fc7a438ea89b541adeb511c4bb64a3a4c8f7c6c44714ae2b785c9929b42484371bacdf5cb0cd99b4ea0380993924edde4b2dea74f5ce1be35c363f4c451e4a9b968ce3c77ea4e1ceda466691f99132731480b5a3dde4d9cc4c49859ffdd2c8da58993885413611a4a93ee32711283de2466960c264ec24293bd8d387fb92e714c32acf50521d457652c718c5e62261d25fb465f9538cfc97222cb77b4e80b254ee9a2996962124784661267936b4d42ee87660a2571badc5227d76c8e8a4a244eb2093bb14f5394dc1e24ce56d1fb2f993caaf17cc471f308934dcc93bbcf1c714a62de56d079af79b4469c94e89bd79b42582a39469cabc646a511f22b457511871993963fe36a34311571d44c49a6123642880825e264a33b573bb4e92531224ec2fe5655d01ee218d4fc7b43cc581032431ca49cdd09b929edeaa510a73549f34cb2d110278510c7dfba8b2973adb2290de2f85517f5e4bbfc79928238692a4946863510679362e7093aa46ce600713451a4ae9a70fde15c69dffa5b1b3f9cc410f6a11a1bc3ffd587a38b6b7c4b29edc24cf870ae19396d9a24e1b3ec3d9c6450e36137a735e37a38b7cc26d1269cc995bd3c9c2b8911769ad1d2eb858793cc9a9ab33317f7a4dce19843e6c58ba893278c7638a90dd77292d26b0931ea703e31ce46db645ad1e8706b8941e7a8e3060e5c27c498c3c94e570a112b8d11d26d420c399cf2c46b460df6ab5eaaa1e30605e2703eade3dda2844b42d50e18814b408b1a212122367068512324040e073525897c2bd13a5b2c428c379c4451211774e6d448512b21861b4e5284ce8d6918a30d96b491258c1839f71662b0e13cde270993dcc6ebbb2db670400d1c37b2702e4c50630b0c8ceca8a181909020c458c3e952aaa4bd36a96469a486933863961a32a94d299e1962a4e1a046eb9209214f2b4631d0704c32932e19d6ec528644ac9ce19475b56bce94ca3d160a882186194e5b7946ebaa97247f6fa78618653886cc995e362bd37ab4430c329ce40dc2e4eebf5e347f0c079b91a264b6135ba42c86e349c2c8594aa37542993887186138a94971459d244ff0354981f716341070968618603897245ef4c6d2656714e30bc712ea64f19411b24723629a6a6c71218617cea675764bc42de913d22246178ec1b404a5e45c50d2c08c2cb0d8e10cb8e4c24195bebe0da73526497e0ba7101d55155731cbef5a388cd8e512379eb2707893136b7fdb9aa413162eb124cae467bd7756861857b035c98fae8cea68054f96d514547e8fd2ae0ab5898c8ca9ee376aa9400c2a1c6c2e78ac6db838969d425a66c4aeaae9b7434210190931a47050b2c4fe561aa53156a2704cb393d2a2fad92641e130ca2ff5bb49fa2b944f90410c2714463b54deca628bac65319a709e4ddfa1ff330553310731987034993ce5662e654fd3c85adbb8f13588b18493ab5d0cead2c73f88a18463bfc89a559bcae8598c241cc3352d7598a5285947c2d1cc5fcba42f69332759c438c231c8ca7c4ae8eac60e91111d5ce0480dc430c26943f799a749166cb46c254868c7057228403f10a30827d51873fd3b318870526ec1bbfd6a6449328483a951ba1ebea67b5ade253184709035e3727e6a3656384610ce765ea2ea4f5ff8d48170b024e93129fda82695f283738c67eec9b3d9654e1f1c34d8585dcc95d836f6e0642ad5eeb98ecf9b37b26636060f2cc4b888b1030b312788a183d36c8d3a3d95da5d64ceb89841e36c08317270de939424995ceb1934150307e715994a7909ef1962dce068d2d7f6865349b6b6c1e1eb4e5ea68d2747c9d7e01444551825294b96bfa7c131492e2ab8a9f8d7219fc139646626139654bf2e83c349f25b3fd48c10261d230667532794d2a6c22f093b060c8e279349516ea52687c92b8e2d222d659320579c4c091926ba09a5e4caad389ed22c594d8559715e35a52ea55cb7bb078bd4a8942fc6f260241006428140200c0a0588577700b3130000000c1693c542d17048b08cf3031400054a422c503a24221e1e14148a83a1712018080402023118100885c28060201c0e09c77090cc0729e7cd69e0f8f0113eee74023d2d5f93a5e47ddef1385575b7cb5dec920c32981657051a1400b93aa4ad2ee160c8214936fab78152cad097af5a32ef30a8f155bdd83f132052432707353326a83d60b62f7f6acfbcc5dfb8a8b5d46536e42f7f19695105a360171209495ed2bf1da28a82a0f2f2eafa67ff5d0432b7fe8e0aa81e675bc5b4ab2418e046c954480a5af8954ffc3454bc110363e7d638c969504e2647ad421ae58204566bdc265bb693173027532a685f71dde7952a61d679a496e582dd1f4122626893ef1da2939ef7b64f59b8aa59d14db8284fa61648de288cbb6ee6610c11852f398c984159adffb9ce55c01669a1a45653752654128aac70972dd7bf21a677c5b05db81692b88ca59843360fa08d5e1349fd95ff23917bf709f285419ad63dac57da1497c0b548bbb5ff65e2695df0d2b670ffd2853bc6d0ab25e0c51a555649fe8ba37200172a4e116d0714106b07ad2e2ef2f1fa99ac0f11b915f385f2dca4546e3348741f426aa7bdfbc0c7327639dd452fcd395c1c1ce6d4702ded3127888f0cccea71346e66abe822f7a49d0de4fc74f9b1e2b2108bee05f090ebbd63d7a4debfc75718a7d2124ed3d080960ad1cfa39e4ca2883167646aeedf068ec87cca4cb6063d14c1e85568606243fad6507d06a042b5280e5922f6d9415364d342cd2887e4881a96506f51c0b227a33248216914aa83da05b607950375093500750d150dd427511052f084cad2358b281a02d43ad48651975243a05241ad43f143c140f12214d4124135545a281c286850b4056e64723c286fa877a891509f2da83ecf2900d7508f5a14f025aa524e0bea5e285d06b5a14ea0b0a150822888f22b4816055c0a0e0a180a034aaa1a1547bb22676616a5217502b50b150a6ab0410185dcada00a30aaef94351918a18e3e5d3cbd7afa3dbd3e8d789a7a4af4b4fb84c3a2501d37c9289c1fa52315056a1b8a060a2014050a355178de14b08978597e4001335ca02cdb624f2846d54905200a4a8b6c5201d54733983b1186ba1554b6e438ab4e0d55c0f2bb233c9b03a50d7512a120295d86354aa1aca0cea1eea19640e5827a439187c2812205858782870202050525180a1f0a35a0e2984e48472594151410142d140a287929aaaf196cdde268ea419502d6908d915251eb59d342f7b8a116a0b6a126881a2815026a20141c1410347530d844516bbc8ff001884cfb65b1ec806cc304bc4a5071817d35e5f366f70bb872751a959c108bada5d22d8c45f5484087b7df77cbe6c21ca41cb9f0c69dde7c4b2c14d61892e4922104224ee0d7355dd088e61abd701b504fd5ae7d9e194529e04d4520fc51d6dd58d54e5cc58d5fd3e95a859e813cc45f00be4db28d19c80a274a1565de3eb9efa3c61a73805ba683a83b4114ed7042ac503e9e7d2f9687ab445186cfa6896013c6e4595ac844871f0dd50888914ab0abc4a089812fc9de1b3c3d5e0a3a97544d0afe5f88b361eb4a397f947a15a94c8b51ce5b1fadd73b83d0dfe1ba7d49a89c8bafb27033b8e617d1f93fe46072d973be8b66189162dcb411a2c575b8838f201b59ae745036fe71f75226db1279b6b5abf9de50d99c118e5302d7c96183361feb485c8eaa17bd1cb5e72e347b9f128610b0fc877400e6e8c69da0f8f891bb95bd556351d9cb3932d8c894ce887d2a5e93a4f438083aab25657ead900ea0412b4e8c303b6f05ecbcf83c95052c0437fd1854956de60bf8396604a2d81971169a538c7b0cfe0abb80acb61b4113c7f529d1c2974cbb481e003039045d14602021150fa56a2cb4d50700e87ed6f2873dc53fe4a132ca31caccf130fb6378fd788bf8ad8f6276342ee069ae9154ab9d46a6e6ca13a3f98d9094d6d51b89c4c4c2173c188202771ccd34c070982ef1107de7adbffd416b190a885755f4b1bc8a234b99bbac524729c1aedfa8398051fca16e05383259c42039b8d783111c0af3b04847505a99152bda88efe0b67da39110995bcc93385319786c4cff7b252c326cde01ecb28bdb440f12490cb10c8166f893864433a25a1bc1e833e2421c417c486e7e9b568c5244b807d221a93aa49b30032eda9943e246b0a4e032044342e8a31a1ac36085caadab256ca59923f1c40f7718431476f1aea96da17c1e7ce88b89f3d229d232e7e32427329d4f44865965ac0f4cb248964c6cbf4a1b09196194b6f4c65527647875e2b916bc26a020fc515ccfe60295cd22b543b31c201f9c38e7af7495ff5954aebd835142897548443a463e909e54d2b111a1513a3d56efb7770f5adbadad682a81de8b738a8cbc770b5f5a73dd8fb359c0f22aa63e6d1fb2956a5ebdfeadd13ddecf5576643e65d0021ac321649a78d3a57d755c64a0fbac9ff2c3bff8cc6a0f0e21071fbc8f5ae30675067eafbf846c63b89bf8301750224ba5aa9892b34293f1bbc5dba93ba3fbebdd7bdec472efb9b870f77cb61f6a90d0352c7743752602f9db768be7bdd325d6a5d065a50b97bb756f7799fb381d5a2ba95c2875c4ea923f64756bf5652be5aa1ffbece7aa9f443b8019ed78d148e0fdbf96d4688a119a045123d7b010014d61937193f1c23898310de32869ccddbba432238c552763ee267c2d4c8c66327adfaffd0433a1247935a36e3efe002212dd34dea6b57b96273b6477b67de538c13a6c48769eaad644e3ab37998be83f12ccde405144a7fc7c02d25a717993dc83a1f8005d1c44722f7091e0ef6be7c6bd3c6636df0b56fdeffb49c5694e699d521a113d75f0f057c567526cbac2c490a3e82fc863281b397e8f3dab99a693a2e4412475f1ee41eb57547e7865299c30fc5940b8a6ee61f75b1a88ca0ecdcf1f86126c59037c083aacecefbd19ed4f58e44296cded12440f0405e7388c5494fc6be119c8c4b1d361fb2a5e45a84e0c746b75a8d2450b1db4a1e891655b1aaf8d2cea6164709e474794dc1c5e7dcc4ae980b194e82f2a7f8708e6a01b94ff24d369429707a5c8f021f59107f4b38c3954bc9162f5e8be8857ee798bb291a50d712b9cebe61e0b683908cc723d11d5a8bd86f785ee6f44918e053ca5210e2136529887ec40418689656d76dc4dc0570ca6cfc2bfb5887aefab5eaf73fc25f7ac94b2bab7c7cad341a6ee5e9fcafd4808ceb9153fdcf33b66a02309783a28814f35764e576bdaa01b174a83dfe2aa9920ae569482ae684941674cfe75b873fdff08ce4e5cc8f843069231198313821be213570a1f6ebe036af6904c9da403c3644d32b0622311b7b08b755f654460ce2090b2c840519b422afd369e040dd678700933f1e392f997c384a33a0cca83a0466f6de2a553d088b9003da915f397b20f1b33ee793b4464bc1d8153dd7043da9a30eb3011fb1e3ac68468e032d86810c660501fccacacd45f0683e20f9657e67c968ba06580b80f668097a5cd4d5b4e2e60f13d586f04c57ee46e70307ee104c1f97b0e6d182f188263bd52403f488142ff92c68c80553196846088f7549a0180188006002100078019406606b4b45de6b40a30020cb8fba03b817c8077faef3aa9c037008b01905600a3cf20f865528d000252883c286e10041541e504ab0407048311800b50eb4f3184b95ed993387d381b2d14867295e1c3ce90bb106070c6e0cc665fe8c9016d901af4d380bc01960194010687c1e460182d364034f83678f1204910e6296c441e8c8a556f3cbb75561606afc8c103517c3fc9e33d0f4d4d2077ac8e9e50f084ee29803b901705d0bf0621fb604c8d509add22501ab419e06bb0f945f235264c30a605153e5bf4c37fd7e57eeaa445803b832ddc8d8ec6591fe1c109d662d403966210b4a70872001f564d04082670cf2e3e2d8d276692bfecc0a69e2334ce9cca513169e53d2e2482410370a0564a369759efd270dc6afb0e086f765cf25c6a0eb5c7709ebe3b4fb08169038d89868df1b909e62c692122f9f985aec8533af038b548bf9a100829b04ce01de50267a746f1d38488e8a164627db3c08f13023aedb8114eafe8e7f1eb5f27d436c50ceddb6b0e3be67e7c7a5291b287ec33f20cb0a9b1a9abff6a13070c7d6676600827718b6347a74e1583369f49161ba897dbebbb25553adf65f5cbb4302f5f5d274b451c7c61cb9f0835e305dcdaf155a6f29ad87a93ba633c084fb7c474cc3bba611ae06994dc2162047f09b62035788d0361bbb56e00410351bbfae358b6353899ad5c50b151d7de71e9aa40258035e7292844292cbc03e4208812aac049e967ce5a6b08fa0a0c075869afa1ac2eeb8e22443ebb0c965d3e295c424ee36026ccf78ee4fe31198844dc3e80b7e1181ca62d013c363688e05dbf0778ad5092178af6bbc456e0e420421880c8360330a2b3cf987f0aebfe28e3421cc6fd9bf26be88f5681b4e298cfa6c76ec89fce03659a227a8c62daa68f9149adddf498c55b8ebf4f8dcfb52ef5870cf710b519d478315b52e21147048d4665bf4083d3a5febeb949cfa8b0d28f8ba739285545034a332cac1720b53e747908494683a614062800285bda0911f49cc9417aa60272eb5268011569a11a1874ee7434805eea0be9824161f4e9f956a5ca104c32cafaecfb69c2d237a9d207dc110580e7a82d5d1016f01e3f5169bc0bdef57a8d539c35c34f483b844b1b99ccdc1a6ca4c9244530a32197329c4e42bad546b594d311216a8c9a73e78ffedc775a7873080c9574e28e831aafe85e1bf3410392b13c8ab0a695f507ee4a12415383038a5ca6c8a05549ca00e7ff904623876f2e96c12fa2deef4c98f67206c3c90aec4df61389734dc018ed6564fa5439189d070fbd63ef0571c85a54dc35302a5a0fb513c2ec62d9a02f5bb8e036fe278f7b0a4ac8f1831d3ee6bf35472c4983bf5b6bf474f5293c621c16381c47ad436e34650f9094e43572b05d7105da52a4ce2c765bc203fcc4dd14c0a5e12c7436678fdbd9c6cc006f5b1da87d04e1887bfe85d20efde9953f20663e19c14586d51e1e5c2423a36570e822684a10a74edbf1e7f9644986e7202e6310be1b3d3067cd2f2f408615faf2bc428ba52a06e0bb4e1bdd7ba17868850e0fe7d2eba2146390583a05690a450054906c300a9d0ee0c69ec92388f06a7884c9c68f7a269e06fe81c4253b0e3f80e41e338d35340a85738c4cae189bb0565c606d73856f26a7d90db87f0619ff0e956bb871989b20728f576b0108a4449e5ee8508a259cf346c14b20b813a601b9e0218b469793a6ef2a52094a49db06507cb3ec04ccb65464f7c066de444cbd545d78fc142439d0ecbb832c2288c55310cd7659ece369a8f569d2cb613f1436b68f858b0ae5938e1385a6e18b033c153260b5100b2492e628a8bca8d982429131293159cf764334ee47dcb4e0617d9e62f9925259bbcc42b9f049d32cba68d2ae2f9c5c96b288dca6d91a8f64c5fd2ca5a0192e44747a7f45c4a1d18a8bd57f6a7f19376a7d5204d95ef544720a63ab0e9f14e4bdcdbd931016b126d96d48058f54defe4ab50652d21eced65f1c632172873ce1313c2a2d410eb0b973d8f97258d058671994e66645bc9137c9047d19af66d613ca05976c47250130637d4c6ad2b4490b8c725d9d53469da301aa96b21bafe1c8512b4b501b9e3fc4b711e780e3304ec1875b1e422b4617f6c3813c5897330d27c5a635d0378c02db1ad020e25afce008eab4802a9b1f18c6e97f52c2d10f4408b8abc2c66d4966aa37525cd40c5403ad6fb5554d0d3864d7978a62b34189cdecad4df78b6f46b3d780c07cf4d22972f85450135d9e162f9a33f47c1c2f554a463a03ab8eb2d279003a4cbf5fbc4eed4727ca390da80b92188a491d8f20101c6ddad73cd1ad77f243c7362de75961bc3275024e0c6829d1ea809feaf60570152c5059039f0da12b093da1773975002fc8e5f6dfa5321568c358ae4bd111699044171474138de56bae5b8b4410cce48ef87126b5281cae058f46d1a29eb1a57d9c1b7d8aec61ab0405bd57a3741c723eb68049a2d8bfa0f46a20f46712887c3e285dc4cb9632a39f000417c12c62be325ac270af0d99112b6a2056a0597baf27bc91301f5ed393d42f8735208213bc7eaaab2371a9d5dc22f43f2d067ef229aa431a1620267b576890c43ca5483a3332f0326f506cd41eb56113d9559eb1e28121a9c001e1cc6262631f72f26e49c440d5ae21eb4d50371164e4f77d09199e09ccfcf16b47f0108330ca2e9f11db243416ea16565c57b242ec5d9869ed0e8c1baf5daa97edd8950a870b780b28e68fffd3a9f54a3b99804d5b89c4e7dc9c3081bbefe9ebfd8ca810377c099a0bc1f05d024a4d72e930afbcbfaf00e6fe848990c79e2fb23cdd51c2eb6d530293ba19603952eb91b1d933632a094416ef1ba7ef4fb43afb4a7eef472cef3a3f68a1901be51d7a88eb62887567124c162402ecd6dfebd9827d95f062162b98de5ca19dda5f98403d2f6e1384a67b1e5e0491f61701f1dbeb645eebdf1fad1435dbfe859d4d21dfe41ceefa93ec319d23d9312c27d0848064c7b09c088ae6366586ca75a2559036b5bfe70193a91cb69e7ce7a6d1d1e3ee0953a76f17658fc539f9f8d36deb173533b3f952c5be78f4351a6e8a5ee3b9bf4b2cbfd52b1c48dc825c910b3252d160c3eaa198a7b6ce258d4c73a6ffa75c08db6ee6540546b2c7a543a08f1252db80a5257e53776316b04a512eefa50ceb974d1ef5c327ab988c49874e4fdcd7dc881c3b4077c860dcaf45520a22ded2f47c09bc2385c4ebc7e40cb1e9b1ba241f7c542ebdbc5da267fd16639f603fc0de8f8212b3c8ab0e76719bcdcc121b3c726d88b5ddaffe5d3cde001bcb0d0ea528740c520a98d58a9e85c65e4669c7b59609fce565068cb0e73b4477ccf5af0888c959f44a8b1cb6bb216c0c285a815a8382ca0510a69ea851764339f69cd1854f13a1d6c04dfce5367d026d9ddc10610523e0e60800856666d054b03c85808fa04ed77a0789ffcbfd6259547ed7c3d14d5f72bb00ead4172161d5a212744378804a82a83103104fdaacc960c91fdf18b5ec2eaad67fd572d36cfef8834463dc9bbd311da158bd0c027224ae09869633c3224aea1f47502dfb017b2bd6b1188c3de087bdd51b947d34ef34b3985f73c2442185e6c2cb00f267084570ba80308db6da9c857c635a8dae1b4209e810c44644da01dadff717f28d50ee0630515bbf0092f9ff9167c6df0cf3c1cf77be65a800439d9d6703c2839168bd60f4649e2979f5894f4fe84ae680fc3d4274463291dea745949e2b5a03f77c1ccda0eb337768d3d0e352e8c013b6ff6c8f5cd509b4215c0a7d6a4503f648daf9ce402404dac4de3cf173e20a70c51ec43e9d9670ac45a6010adc81d1e8cf243ed08a58cdfd9b615a8293a2946c91ebe1c949a47ff5561f5c26241a927f18260f0b2c94741ac5b5318cbcabef72c09f4bda85d45017a3a2a748182d060ccd9648567518fb2651b76ce714ec96d31b0e2eaa69a2eb9654ff8e506fa71f414cf41ee4e177cc7ad5a66086f7d19c86764251ae75609ae00b37b6a4765ba7005dca4f16302e2175b65ff37bbda7b813919c98da27c57bb901546352fd33c50f6e1d2ac8c182e4c8919f81677c110f128d02afe9bdd52a9c9e274c47f5f11fe586bc1b8952b4e1d14130a67b49ddf66a7fdf7b2c2a0a8169a18be545df81dbf8223821c5c0a6c9a78655cb2116f9ac463faa3676941c069718b5652f8d59b8b0721303c544b36a21a3093463ec014b3d4dc558c0f1c40913d46ca6d6cb265e1ab95ef7ece6952a0070a2bc008ae0688e939df62896fa5346d21578b25e884d9fb1457cc175f03807b1a5c3ea301b3150326a8b9c03186f50a6a5c380fc79e46d199700568929c4960cd7a98efe92ff58a47d7331e7d835c223cb9d58765f1e8db13e67b5bf188f54b46a01648a838403f139c6bb181e813ceccdea0223e3faf30b4cf53d55e5631c8018c4f1972fcab182c0d2eb25920d71708190ac4b94ddb884ea6828bb14b666989f15b5496960c3fc5668ae3e6b5af09e980d915ef8d911f2e42bc65c544dfebc6e420572b4b1164c6270dba54b61c3c6089c0a605bfa75902ec64b166bf75e5f3419e327a54e94fdf2391ec9877d3a345377a20e96cde2090c076ec0afa0ddae35d67016431118fdf433dae573a10ae2fb364e8ec3127912629b2398b6a5a91022cdef2078b37ee1fc98d1d42e954b98faf1b8f455574b0522c00e1551adba281868932148ee8f9cd1d30ccc9598ad81e88e8fc1ea7717e28eada21739d9a832ece0e76a297691f9b6f9b81fbae3acb839b9f041276507d9d73e2130a9acd907550b00dafbd1d981016fe214bde7bea2e8a116be31d8526357eb96cee54c3e82ee5dd5e34a0bba612c14a9048a93fcd26751aca82de6d843b985e073bc7d16f7eb04e64cad38da5c751457833a30234e5f862293814947a245621c45b186438fa70aae124608a15bc6dd5b0402d1209bc0b1ae51292d03daceca0fdb6970a97246a23022d511351232235e8e5890c88cc435da4d8ea7306d3101d44555f87dc3ddbb72805d534d2d1232e0aaa66bb108a3420a85a8b0d0aced40961fbd5c4891d805323a4d60a0ff605227b01955bd4d5e88b0e89187753f5289d28c0e4edba7dac33a3c8adfb8a0b4874a888abe797ca6fb7fb86141403e48852c1295b47a90e4e0ec2db18df7d6328c9f382e1e60889d9257032f108b4fe1fae9268dfb00f10672b8fc2c5c47f25da613492768e6b1a3f317a8258bbbdc8fb5a699e61b39577ab4a288db1e1c53397e16ff1778273669ec16147081df47a1f90d4478c8e127c6a0573589f47f615736e5083c4904ed10d4ffaab2320f6ab9f3cf3534ede14cd91f8118c81d166526e66623a415d4a3d823619936cf694dfe1a65c4cf7abb8978bb6913d487f6090c2783b5cd5e4effb98f682f7453faff6bf3373a8124d79540d14b3148b59343dcafd393dead3a9490d855e88fda2e8bede526c86b96a7fb4d96d9a94d1f1ea4d9edbe553058fb7ea2c73663b4b5553a7688d542349582de0ea5055f37c0a919ec0c0c718494bd38e419e2dd467c28828908691210a1c398e812dd20c4c444243429ae344c02086abea2dc19c62e64b0660c7cec55733c2fd742820e4443ca8615927106ec63b0b97b372df562dc9b69d01702cd8d7e0b1079f0b49fd3aacd5ac841698c1eb69096c9c379c8607d7dc691b479ec8ba2ebdae5c2454eefa3d91a013440b493e4d0f8c8159d00c8e4a7f0753149bee26d9ae8ccdb99c8f4d006d2031bbbc2aaefd6a72a40fc5512a1da29270df5aba9478e29c78b08397fdb2d46f81077c817e4b9489d99339f8255ec13c20f2de1ab44d6998d43830e048b00aa033d028d809f00470f39b1f6a46268ada2e268081c92bd0f0deb10cb70f312ccc8752d682dda0459ee6727a7bd55d9ee7bc856d625417f43a3590dd648423488646ab5cff83aa9a0d918cbc7908b3ed2adb90ba2883d506e3fc20e883bfcce2e6b464aa1fd9d14c57435df633dbd75b91a100b4f72551fa7a47af6a583740758af1c91325156447b626b74365a53b5f937c03f8602c8595e7fe5bd679edeaa43135068eb54661bfb701cf0c5f93bd92847d9980b5c3a534ca16f8e09ec5346d99672a64f9554dda8543e8bf9cbe863c6f42ac4501a17a9d28d9a552d99569a073258d4724a490ac6a5eff1cb3a89c15b1490a567b9ba14f0c17e61505d80cf1fb2f850828a09726fb321c1a1dcb795a165141286c35b6ac0310d891c9591d9d7770062f4732f749e8788fe6dcada9930c4b76b123941869d4bb252365aa478a98bddbcead03c3e29e61121e0f1ed61396c8e0106c02f18cc154a32e2e7ee1fce32eb73916f57868722a000519b3aa550c02bb0610bfb7dcdd18aad8ec5687494c92155ec6a8bfc33fb0979cb7c23fc5cb5d9556284eeaabde1f7ba9c6a6930c4c7df2a288151cea0d95bbd37420f316d4d84bda02ed1dc4ff3b2a8676578f378f9ea14dd89312930e5ca1ec96482b96c968386f4d338b6043e5f6a5fbf4df1153703860361c8c7784ab30c293627c2faa695d63c170d980c2309f17836f1b39cb84f486d593eb037189e23330359fb2ec940ab169a5e02eb6e889210788feff1a9e6f31fff481a39b249563c918eea19d345eaa180a4a2d4da934b91b36824ed1d6c4866e2d97247a711b6283756181189585405385a85a51ba5ca8cc3cc6af989873e85093a525a121e0d244d158e2242a7a85bcf1070019a2958a0a58add3dd53d6ec8d667020ab9d07bfde6796e884d4220e62c9a7b1ffa87b70070212d313cba777ca091dbc985b06d88c27fa8d34bc950a94aa34167b823dc51070b73a083f8a61104ff04c24cec24910e793b1e3399a0e9a792d1fce5101cb4859d54d7713eded17dc98dcb40d521db46c6de15b1debb0ee84dab5281dd6b045c0e38085b7358b7db1abb3b1bc82c41f2f17b22388acccb0fe0a8c82cef10c4c8eaf9575b9600aa717148e17805b17a2643f33841d99f4d5d3e56910c64c0c933a03abc356b065c6aadebf08c2cefa396cb3bc84fab79324b6e9f1f8ce1f9c696bd8694b98b3d7b4994a01cbd6255069d8407344eee029baa31ef59b3c0e610fd2dc33dd428685d5d6e7878d193d8a82befac6ecdf320bd0499db169105acdd0fa4d5e1dbe3c55e23a3ed677067dfc88235e84686168ffcd9017d1d93fb37210469f300220a9b0ca7cf1a20d963678f949895862de81b06f1d3dc45958363194b9b8fcb64a488c164417ba15a2ec4aa010602c0732d68bee394401f20cd86612b579cc6c1481853ff1e9a00f13bff307e75d0ca124cf1ed7c17019dc3f0cb47bc3a0d6ba9dbcab70ddab5d3d90b7fbbac868973cfd89b2c88c36aa77e43d83392caf359e38398861e4a00948a29d8daa71a4b3bff4a65427894d09cd70f82e6310163d2ef43906722d06b60297f50ef427b5af030a1d1ee92c667e485927a89c9b92c3a8f914acd08eaa40c837493abb915786ecaa6cf667fd21121e6e1988dd03cdc4b081e96118684758492108c70248c5038151c6af33d041843bb4807ce2cc794a54349667a5df76af7ee5424df7122eea24f9e677b0b566f8a203a1e90637cf27dc2bb7903509ca4992980b865ab615d73fe72c85b708da54e5ac0cd3e65bb39dd05cd063416a7513acfa0d3283aab70b2bdc49a4e75061f36b1bdf1b426db2f62a92986f8aeec4ddadce98bd5e3b4395f94eda2ecd9924d38c6eac139561659092181b66e5bc0490e6bdd3482ca2f6df8a995e41b21429e49ab3c7511b4c88da7d8788dfca8005950673bcd370b874de8addf80b89af2a51253a9880f149ba7229ac76a5935ba49bdc805e6206f08861ae45eb2981678ee52e307f8097a5cf59bf2145401c01b1a028a922a854ba80109e6e924b2a722bacdec4b8e2d7430a99d02c3780b068919eab9fb980b425fbbd358727bf5a40cbf867ed0abaa2356912390bee28434c5420454a8184ea6999a0833883357f14d753512114ef80a4c2b9f530f2ce8a640090881186f4188d711058cd4ffff3715cb863ea8e14011ff1a74ab7995a30dec5c316ac8446afc206141fc4a7b23bf519f5eb5e9d5f38ca3758c6c5e32878a512d5bb1a74fe86a7769c7a34d70d95995a89ad05413872d0bdd6b2939a8e7b287fc4e014b9f929a51124cc1e788f04c357849f065ca836562a6aca6249661ed0f42998a464970cce5f703f64c82693fe24fd526160a8277421c3fa86146bf87fd16401749aa504c1c4de7e07a30f8a39a8da67c244b0c88e247232428219495470b08747bb10d42c222919bd24bbabe478df7e6e86c1607139db9466ed0b2de98ad1fd9da94a516f3e0af479b30f01014450fc2455454362bc2c0ec6de2b37001cbb8b5819887eb9f4244ea298cefad682ee85cc91145c8b01059a56631a0ae98b58bfe08de85de6e8bd4cfc64561cd55e03b40bd1460fb69334803dca2020afe63a63640b2a4d001ffffffffffffffff7fc1daf6ada61ac4c894a4f4840945a26a76534a49a694b28fe6859d2da7029c23a411d267fbce3d082e0ab70a0c0a9b8911266194a9d5512de15b5a8449507a357478ca7b165284616f4f7c4b121d22741261aa52a97c54c922c260a7bde5e4b152823a0f61f8987fc15a43986488cf65b5fb3929b310264187ebb809da316b2384b976ebfe4eac0661dcf79363ed4df8b8980e4198c4d2751f7425258927e14247204cbeabd5f92e3767eb0e4098b28ce988ac7e0f1d7f304993baf54949aaff543f98424e654f22323deab95de8e8834992d27f3f4e90f7b9b3850e3e98ee2ebf8853622925dddc8e3d98ebab4f0ab57441d534a2a507937e4bd59ede3ac7b6d6131d79304996f2bc5c4cbe946d192b3af060ca761e848c9cec6dc71d0ca3259b506d535db58ee8197630e5db6ad10fab55624645471dccd152b415bf0a293ae860f66c3a96b29b34f512cd82c73b8a8e391877de4b3b54758ef0921574c8e13ae260e5d5faf324a59f6ca0aa4f74c0c1e067a5a4f0299a6372de60ae1f7de91f56d4cc6de870833989e1b1f5b1c289f9db604e6f16ec8387c706637fb59959eb9d94eb1accdf772995643626680b183ad460d4cffda9d29e74f157313ad260d219e22be8e912619655071accf76e3907257bfcda07018e37e30c107c114607bee88005120844123bce60ce0e1a1fbb9228d5d78856411d66084107eed92be5d8ad9738cc28a3830c468f27badec5cfe73d99f1397274c718cc16a4b5a76849aad32d28870e3178e14c5ae7dddf894a18cca7a66a2ceebba9f4c1e09f8eb0504af6787fc16cad65eed7a73c7bdc0ba9865272f8d7d855aea30b26f9bb63c9ef38de1a56fd1887e9d0c10593a0f7dea424d654fb5b30775532edfba816ccfdd6256855077d25990593d2ab607eef2e527e2c182b94f89472aa916ee257306e0513f782e7b8cf8f15cc3eda72bcd0e92a98b25f50a9b29824c252337450c194aa43ee7cfabd0d11193aa660f4d3d1ff1494c6812fc0f8a2c6d0218576c475127d1410eba0f3be89b7a23c50d84ff49895e4eafa04d463dcfd2e4ef8a46e93e7f2496264d804e4f55d59cd042ebb28b18a59f376772ce1fc1b0db57cf2f6564a784fb864fb96325a064931a12309e6be522949d2e3888e65b407b23a90604e274794f6578f6092ea7485cc8f270f1b093a8c608ed17d4298dd6913fa11b53a8313061d4530e6c5d5f370b989a18308e690b39dc73ddf2941fa868e2118ae63774ef276f26793112d3d4d7408c1b4a7fd4bea585797c900a1e013117404c17432cfd25e4a61be8380602cf14decf493fa64ae5b858e1f985267dae6e98a9b5d6a42870fcc9ded82e89febf84c8d06bd30eafa65594b913f8b9b4083172699e17ad66795c64d68ecc2a493e0c9726e87a343c04ca0a10bf3e8549383d858faa05c1853f3a4b030e2cea48d062e4cdd61a34b0efb2dcc6969c54357ba1b93b685c9cd84130fea5d2e8db53005b9ba7f6f528dec244aa0410b7314f9eeb8154abd476fe06454408f406316e67f13ff2fa7912c4ca64b6c88bbb4198d5818f4436e78ce932afc0b0b538a32eae2af1befbea2cf2e32c6fbe4010d57184e6cb93d4b63d9b5d40aa38fc92e9b2709da3cce0a93b070ab3bd135d5b55598565e453b9c7a0f175485e172f3b442cea9308738c1a42494d434c9448579940939a2ab941cb2e414e6349ed6948ac514a60f1f4b49bf7f639f2f8561439cca3f1b614245a430edefc9614cdd44b59c51184b52a792d0beeba92ba23056c5f48ab585c2248fe8a44b49f13fd40c0a635f0cd3b2237a7bea4f98a409fae6c4325e66f484613d9c27d9e9ffba279d30670fcaff65748c2d35270c323b634dc4e2a9a56cc2a05f4faa144b4b3251d684c13ea528ba24b982754e26cc2e9f4a4c344bf92a8f09a3e79c27a860be255b7a09939c2ce327e46409932477b23d0fb312e6f061ccdb3e67cae72961ee6a91f339dc93305576ca29a792306bc936614b9023612e3593b4e2f476d61412462b498ea6dbe26c75fc08c38686126c46d9666e8e308c7e09656129abfd35a22ee5a76f79324698c2e8f29283091f2dc945987487df5933cdd65129c220d5432e96b475edc9449852f98c275951e5a94684d1545e4be73f9a12d621cca1f27353653684b9f48caa696ec95b5f21ccf65a9e657b1bf2530861ac36795d94990e26cb41984adab8303af59d8ea1204c3d5772f4d8268130a96f159d3c9785271310a6170feaa398f707939eb8ce1f25d5e9f1fc60aa9274de5cb33cd6671f4ea2e7a97c30a8746b6a4d0eefc1305af5b5f3d383a9d3479977adf2606e4f2b713c3eb787f0605251353a7fde01a523bf75745b763025cbe964892e23bce33a98db93eda7aaa0c4d1131d8c27a7b5cfff59e304d51c4c226e3fa5bade9d6b7230a8b86c085d495279eb3898c229b94b573a9d2f7d7030874f734bb2f5a8ceea0da611fa3abd93dc9f25c80d864f9f73925c1a27e46a83f9b6530cdd2394b43f618349f6d0273c8c5f8850adc15cc283853f25a906f3e67fb231494beb527ea09106a3558a7a615292795930d04043baa6222fda98badd67704c92e5822513fa4f3683f93dc9e6e2234ef4538d68d128c39b236a3dca43ff6430f5094f3bb12d4f2ccc53a03186e5c47eb5aace99a3d1c00641430ca6fb71533ae9490e8d028d30983be9c9398e99d8f97f3018bff533f489de13687c214908a1272bc9f60e99818617b89492ece9953c2e991c63a5e47212dc353b4bcaba60b094240b4a9cb15026e702da4912b682ed5b3065d7bdd07f37b1dec446190d2d18b3637b4405bd2575b60b34b260eeffa0b3f4535de58c05837ce927a9a5f76b562dd0b8825174ba7a7ff9bd5e1b1034ac60d6fb18f2a7d62509bf88486278a0510563dc75ae3f51b451cb081a5430ca69cd577eda8c34048d299853896f95518286144c6b7931de5252e5f161e00b30cc17607c6101309640230ae6b461266459f2246ed5808dc740126840c1d47af77aabb9f7571d197c6a1288943ed07882d972cefcfd4a97e9222798464b9824f9a60553e588ea075260e3068d261874568ba5f35d12ec438309e611baae32aa74c9f89760fa4f2d0f1e461a4a308cfaa97473311a49301a48307e9fa89ce4c5cab4444444442e30822faaa040e308348c608505348a60b2e049ed8367f9a93c114c3a5c0ef7ea9097f46808c6124ef89764e194d7470826f939a5f3a6e4f31f04530962a4e8126a54740c0493c9e50b93730c955f7e2005366040e30726cf2642ac97e8dcedd2f081e1e754fa7a5637f97a61124d2c4194ef8c0713e585294f3e59ae4b29954fd98529c74ccfe96bc99a5117a6d8b9427ae9248f342f176613c5a4d071e473fc24b83087ea52269c901dc200b7306deced28c14f34a97f5b987c4cd78d9df4935faf85614f8997cde3cd0851222262a3f40861005a985fe3fd439ae8502545850166614aaf544a494a34662c1b9558290c200b637c8df8f825be418618381043066298510608104b14068885e13a590cbd99a16b550211113050f0051826a0c0ff05fccdf817e0e8305e61005818438c0a3f7a55a9332c960703bcc234a264cb922c8647ddd760005798827de815ab2ca5ef7f800d066885b93ab8899d7f56984ebea4a3b4a75661d0f1e2659bbf785f160d065085d1535ab2a4d36980541835b6e4d1974c4f3ce50d320296077334b17f314205551be1c19c9f4aaeef50a94451ef60160b969277653bdd693b984f1253729ed1296e9eb38f3a183d868c3c1db70f3a1844a498aac939367e01c2c71c8c5ed5975ad3a3dfad363022223936081f723029b9173a9d8e22e45c3272dc200355a5f107526063031f7130bdbd78ce6d117ec0c154bd21cee449552384fc06c3094b928c2825c5b9edc30dc650395736fb102faa6e83f154123c89a53d7f2a668329554ce55bf913aa3e35f8588329495290ab5522567efb5083a99320cf44a94d9fd309e3230d268b93cdc35c7bdb0f34983ac9b94dbe6061bfc42b838f339892fcf94e2f986630a8bf2911b1d79b8c31f2a30ca6cfbefbf4e95bd265561f642891187c8ca14460f0210663a7ecfeff498ef0eed147180c3ade7592aee575aafc008329a8ebb4aa612599881f5f48b4f27e4ae6bea32b5a840f2fe047173eb860ba15a1e399ec5a52098d685d60045f1c181f5b48e892f2896b269b5813317c68c194293267abd42815da187d03471967d8880119648ca12602a6c147164c27e5d6cb0ff36ba5c682d1441351b264fc7105d3a5c9bf1e5633a4988c688d314623bc7101fbb082415a124a0a27287d54c164275b584917199ff44105b30942dc96588b9524f5630ac6d39d2b5e3839eacb924344e44a0a1f52a8c7ae82be34eb88368e7c44c1187e1fd4e8fe934f8a65213ea0604efa3a29e1640b15d6673f7c3cc15c39fec9f6217f4b0e6a1c3e9c6050426d849aed174b761e3e9a602af9bf4e559674693e138cae737289fae4d17d4b1f4b3056c8ed85f720bd42c7820f25989572afb636a25583c6513e92607abd51ebaffe41da67442b89f08104935e37113149f824bb5c107c1cc15872d8cfa54fa76ce50bba0c2bd6c087114cb29975ca39fd051818858f22982b8b96515af10aa41b3e8860f2f0f5b1e1630826155392e93fb73a1d8b883c0e32d0d98710cce99fd2c79a240e313a046747f8088249bb969d7025749fbc13101f403008719d72efa71f189428793cdbcb97b6cf870f4ca7847b923acd4e54bb17a6bf573dd3ec99d59917663f312e876917e64bb13ba920530978e8c26052ec0ad282147de9cd85e156c45a7f0aef26453d7061521b5627f6a4bde4f72d4c4a34934b8f96106261a5c2c316a6d1962584164fdfb8bf00e38b303af0854802005878d4c2e06954f44ef2040b045f84d1818267a2f0a085c9049d724e4df474f929ea310b53e99c93e487125e560a030cbf31867ac8c29447bec493f3071374ec110b73e849629fa699245d3fa295b030899e2da785cb7e498ebfc2bcb29f4d87911fb63d5718a45eb8ab987a51d4ff2fc8c00538f005185f64805b61ce1545890f7ad45f80f145181d288188c8611c3c5861ce29af7ded69932c9f5661b85092b4f52699c8e7ab8a2a4c66f1df4cf2d23c52611065bdee1b7a5498ca2b972067654918a15398fff39aa443d54992200944444c61366d1f43a7f830e9e788965b99a5c0a31426b126a2a2090b8b14a6ca5797a44c4bd1a35f1ea330a8b4a42e7774f5a44daae0210ac42595628685fa49d9300b85729234b97584b034081ea0306c297793d26cb6fdd4fa82c7274ca394f0ba31a663e4670b1e9ed8cf47a8a464ffd87aa9c4cc071e9d30c8755c96799277799ec18313e66afb207b46c96a0f1e9b30ba7c3efd57a2ac08b5268ca76a9f522aad15fa66c274aae41c637205134b1413264f51bdb43cccf7c453f0b8843946e6760e4fde37264b183e09f73032f54a9843ac5e6c9c10254ad9f14e279dca491846d6f96913f737c6e22109e37cde9724fec6b5c7ac8cc6718248184c38153afc2f48984dde9224b1baa4bb6c5a2c783cc2bca1c3ad7bedb7e5bc230c7a3def4982c93a7fb5110655a6a4f43621469884ab9c1115d7744aea22cc25b62725469d28153c14616c99d19acbd09fa64e84f942a924f2fc74493537c10311a60ea5fe63895a34213b84516479ae9f4d37d152c510c693916b2dea62f12984e19289dfb72bb94a8e9ac18310e613e7da565a2a8e92833c0661ae4e9ff7fc5dbbf534a265b7678011820e7c11820e5800ace021880493d546784c4bb9dc2b7804a2ecc003101e7f309b96937ac99320aeccf48349124d921f562ce7e6e4c6196886471f4c2aabd2c754fb45c7235a37cc7078f0c16cd9fa7d4bd212f5eb81c71e0c624384d0173ffec9ab871ecc79679f42ad524c8747b4c8f0cd83f1477f1615ab2c85c5ca0b3cf060d4cb5de27429614a850d1e77302529dae4947e34a255061966e4c03578d8c1b417ae9ed54e2749504d0d1e75309874822af9a4242cc8fd821b62ec1b3ce860b89c427dbfbcdab527c1b5c71c3ce4502223f08883c1bf93a0723033554a64c3030e1e6fb0bb2aad4d904b39e584cbc30da6be156136ba010211911b64b4c16462d6ad9b563af1f488561964e0b0001a3cd8605e1371d23fe453a9ebb10693f49674d8a8550de69c448c49ba5aba59a3123cd2603e216fa16efabbe38d06f3e9f777cf6c57caca19cc56e2976a879cfed3ac081e6630e7522fbade64ff90bf0c66fba0b166c2278329492b26e80e7fb2fb670cc651eaca934a9fc3e92e06735e92aa7ab6a38d523d0efc220c0c9471c3230c660bbdd60c133098c49ab413e344bf608e0bdb3eaaa41691534484081e5e30e9dead10b648e2d10503787001011e5bb0f18587166c3cc0230b8907166c5cc10a1e55708007156c30c0630a0af090c2023ca290e3061f83067840c146033c9e60e3011e4ec8d10406783001011e4bb091000f251cc0230909f040820d0f8f23847818e1c3a30805f020420d8f21d808f11082c95a4f7a12b2e46852a4038f2098a4e705d3d5713988fd8607108ca74d5cae8a4bf13f1f5132ccb8a1011a78fcc03c52c7d327dd4620228270a4870fcc734af8af98cf883f9d8e5e18466e87fb9fb99342e78539f55d6a48d7ebdcc6c881830259e8c60d7260043a7661d6fecba3d639268b98820e5d98f3f78c5b124f9ef4940b833ce563c26551554a1e17263923b733e696e5e4b730e7f076b2ab7633efb185491ef527a59c949dd95a0bd3e68aba4bd2c51354d8418b8210f9f9f41acf8d68ed143a667134e89045a23e4b5ef1b2a0d37c33e888459da43f8bbe57d24a28830e589846e909757d7f1e2c7e85b97410ff5713a54bb4ae30086996bf9753fda3d90a83aeb499cb96040f156485e9931062a3e53eeae7566138418d94bf2df79c63aac03aeb3d493756b18e541884fa0e27523f548a860a8328d145f3d55abd730a738776095993c37a25e9308579bd2b55d29e3ac90e8e60042222ff171831438c138cd16f0111911cbde82885d9dc53f44f82520f1da430999c6cdc3f49599416f3d0310a93fcea1039a51485c9a4247d50e1aaf21e33ab1bfc1a133a4261348b22e71b4afa789503c7a71c37100a307580c26cc924d5c934dfe4dc56d2f109837035d3124ab77cbfeb095392f1b11d6d7a2dcf4975c22ca255169eede1c39c305b08e16b9265790cf9a31074e00b11911c39c01011112903f843c7264c6243081d53673fa2f239d0031d9a30e99ca4e7d4a64bd405c7db28a365a0863b326158136d62e9e94b511b699830987cfaf1612978d2df20a38c1c8f432f61f0f4248d49e9f1a292a8250c4a495379a652877974a4a31285bcb414b6939f508e0e4a18632f49b3b7fd6fb28e6889c19330a69e1cab249355cf82235a39ce193910051d9230cf8d8e234d8f5b6726e8888449deaa9343b4081dcec006196640c224b576fcf0493e95e47124f508537fb8ffa4e289122607031d8e309b8ff4183aa9967c6a84496ba99179aae324695878bbf6fcd67fc6602a55f1fe9292a6a76f31984c3f674feaee51f40e83f9d409b7236f3098d2fb8ca5e5efb8327fc12409637ae5c2980a232f9862c83a1da4c9254577bb60ae8e1142b6c75b2571c1e4bdfe295f0af22eb905b3579292a4ec935269542d9864cb2bb2f55d9dd25930082576d6f4bc56a6050b063375bbf93f3a27a52b1847c7e7cf355ac1949456e8576a5530bc5d9864aa51c11c94988a554f313d9e82c93d681345acb943009182793e5a7a5039e51027140593e7f4f87e5279d2412898ffc2525e7d47035c04902718fdce04213f6f37007182b95e94144e928334c1248c300bb794da43da39468a4198600e972f2975d05982714dd6d1b6a54db6de4aa8d24413fb241527c1e01e3eac2a5a4a26854830e91227874dd1114cf2c3e79ef017a552ca08e6120f25fa256162c24911cc31f37d6dcfb23beb67d80d102298046d52b7deba7e978660b6a4f36eae89eff974211894ce30f9fa92f24e6f100cfa4bc8ca878c31690182b94dcd82be24efa9f87e6012a6bde1da83f8c0e021e7c45ead17c61033a6a266c60be39ddc2edd33673a55bb308cd03fd5d176aaf7a40b53e6f8274f594f12940be3db6986ac786279bc71614e62e456a986ca6ea2b73058f6c68ffdbafc96b630281d77846ee911da83b530ac9afa3149bfb3f3460ba388b0aa30a2c62d9d8ca8cec29c26c9739e265998d494cd78bbdc79b13069930fb28359a758725898525ef74e5afac207f71506add559bb3d4e5fef0ae3da57ca8b55d5688549c3c43c196b6a4c8cac30a51c2ae53c44c74f921aab307ca585cdcdd15fb3aac23c2327543249eecb3aa60229a673f4f31f1526b5d649164b5e7226750a7369ef98b0976dbf630a83fcce27e7b694c230ca344d7c2b15b498235a5a17a8410a2e4cffe3a834374f8ec294bf7766a14d8e373aa2304593f34fbcb71b62b4198f23a9120ae37aa7dc97f67fdd6441619e312929c1b3a738ef3e612cb73841ffae930a560d4f98aadf2de7cffe096a74c224cdead3a42931257f6a70c2b0253d4b14d9ebf994d4d8c469a244528d4ca07396a96f2575500313c68b272ea684d2392b4f70d4b844d6b084d1774d292b79b6cd4b39586b54c294cff34fa87ad9b84f9712352671cea34b92d3237a811198246a44c2985b6a7916ae4cbebd06240c761f4a344d5a55a5a850e311e6f393ccd4f25f8df838c2e897e761d34ff887bb11460b4a2935a6a48c30ed8c878ab1e139afba08b3d87fe810a322cc21a4f7294949fffd5f228c5a6dfb22564498d724f1b5e4b5f8b8dc214c6b9f3abeb4aa5a9219c2a4a5754dae871a0b15c258fe223b959cc27eb408618a7731fa6249d94f3c0853ec9c37bf54490d41984635c5244bf741cb1fc97146196cc61965987106086a04c238bf7b79dfc9c3afad0108e325b1fe6dc6624972fc07a3e8b513912608ed9cade107e308134c7cd0a1e4ccd40753ae3d39b7867bbaa7f960b6cb9d6c4daccb4927f760f6ed284a1071e27f146be8c164d2af3c2fe5f150230fa6ee9cf3c3c9192bbd6fd5a1061e8c267fd031babbe5297e871a77309c0c31d915cf945fd80ee6f31b3952fffdb2b53a9873fc93caffe470f724235abc861a7430497174dbdd44a7cdd2885685e161ccc1248cefa7924c3041462a0793955a4fc25efef01aded5888359f5d4b8992eddd58083d1920569e25c8959d1dfd57883e945c929c775bb44e5abe1069397fc501375d406638a6ea5a446a5125a6683313c4c4aa3d3ef46ff35983c3b9d98e8e4e33bf2420d3598b388680daffdf417a7e13dbd1d65e5a4a0c1b4a3820eb26cf694eccf60ba9445597d9520f34433988292e4b89d5b77654888e5bdf86825329832745fb85ca5a724f93118743e4934a99a952ae5c5604e92ac26bbc975188c25c84c5d914b6697dd81c1f8a1ad2c9fd0cc3b551b6a7cc160d2bff5a94c936f7d2f98732fe95d9243ee96ac0be63856f9ebb76235d4e082d1848cb6d87b3d19f7196a6cc11826c5c595ec4b7d590ba6a4829e606e29ec77b250ca25c9e432374b96e5ab8105f39a78d9f5b2bfa6ac47861a5730a8f8741f537fbf6a5bc17479a5e6b3fda3685905e3a9bafa31b1256534b030d4a082d9e4dd855512de94245502337a8c0b8888dc7833cce831d2136a4cc1a02ee3c54ae5d3785f0ae6e46e626b3b59ce698f42a7ef45a5ba1287824157e542cbefe8eca12718df534a2654d79b748f130ca33f76f487c50a5737c1f4ebe2394ac5e24b9809e6f81216daba4b087997600aa74d9e3e69f9a754259844f7c3aa754e8a154d8249feedcd13364582b15cce6455ff39a5cc23983ea628e192340fffa5114c72cf52b789563fa35204737ff0a04bcf44308ed24feda252d8d786606a2bf9a0b673496e5284600abf3dad2caa52888260b0cb26b8291ba5210482b1a28d5e2b4950e1ffc06cf295ba134689dbac860fcc27bf27889272744b82bd3069da28513cc70b6305957f17a61c4fad9c989393587561ee74229bf5be269d960b532cdd494e62165c987cfca3b5c5935b18e6f38285314b2945df1606f9be9cea738afae0a31606333dd9246dba4ed22e2d4c679f25a857b22cfd631606db39f9c35bece0264916a64aa224a53ba59cc6a4b130cb89d3a5df3f2ccc1657be4a99ff0a735759d261d29624e8387fb8c21cf369f7e7cff4848b76e1a315466f11cb29f7092b4c5762d99e430951959509c428a3590c1fab30965c7f69534a235a6080718324068e378107ecce48138c81decbc8b104b8c2872acc2687cad29fdfed4d38a265e3ec2315e6d3baa3fa3e16db3f235f8481011f438c3350819f850dffa0a75398c4e56c41aef7e9ff20539853bf9f32e5d9a475f69ef0510a839acc7a68cba7925c2105fba384970fa382430c1b55da828f51184f3d8cf819a5bd8479440b0c1fa23095ce282588b0f1d1ea88960572f0110a932c73ea39948bc8523f4061505a82998fec75733ba9c2c7274c52cd57c9755017a935e1c313e6ce90190d7957663989a9e2a3139e97289f5192a5d4dd233e38612c41585aef961bcf95c3c2c726cca6a264e7ac75c26e55868b0f4d98fd94523ba993144d4b69848f4c18c34c5fcfa43d7f193161102647c74f5f6773f925cc259bfceac5d612a670a28dce58748c316e80c38c4a18a465d1b6aa33a7ae82e3c718a30b143e2891ec14a35e9754b2923309e3b5bd5404f1210953b83c16a77be5d54f9130da9f8e9734f793feec885652f7010973c9561e4acb4d3af9f8116691134ee73fbbcf159bc287234c1b5ebe255e0aaed553e1a31185111f8b28910f4554216e624eb893b4e1de222262348e302e161f8938251fb177693c6b1bd192011938928888162b3e10e1c9cbbf24a9a9f40f515ed591711ba2bcd4416e7af6a51089124fc7bb6cebc10f42243d679b9e7cbaa3083e06810e42bdd4633f43fd108439c6cec20969b2cfb64098cf94cc18cb4e76150408c3e9b3b43872c29b29f9835a31535bd62a9c2459874977ea6be342c1871fcc1fca4a7a3b9d4e905e1fcc7d33da3d7ed976447c30c89f51d99eb64d7417868f3d18adc2c99cceed430fe60ecac27b7b0e628401f58114d8d841c82d4ceaf7dca49ab19c64ef476a50467ba092625b983d6a5d9ae0ba9b6adb1b426a61b292459f2494561b3dc9a28579ce723095ad47cdae112d1411a980c81f4266610a7f4af98b3a65617e53d9b2a4b8204a9055482c4cf94a2c8d9adc1a426061ae0aea4eb614a542cbf58a2d9cac899924271be20a9328256de55abeb69f642b4c97735049105f92841056184ef57e0a95157659648490559856ad52cea7a454753f4142882a8c16224edb270f4af6ba52610c1196432ba9937fd4235a050e21a830a5c88a25c4ee9818ea0d9218669071e314a6bb4ea3ab124388294c7a6e4a6e543ca2658618fe38105619424a616e532a888f9dc7b2a46d90916e8861e3cfb8f134781c6721a430e9b42cb173fbd500055e06629861690819854907a579254f68955c9510220a836953e23e09534444048961c6cb60c40621a1486aaf8db4b424509845ee5b2bf6c204f33f6152398cd9be78189f8f270c1ed7315466a713e6d58dd16aba93cc4b73c2d827e7123f7729db4e6ec268ff29ffd60535612ad124415d86d225f665c214d5fd42ef72929f649830d656101e6fa54b187ecdfa749493f733b3446aa724217410cd13c7e7b8125209d3d7e6c5cea92476273672942aa33d40029b4008254c6652f427d5d2d0df47542761ea0a71399a509df97b44ab8c1049e029ac49254cbf7846b442502261f6f8d919fa450d8440c26c62dcbdabdc0811d3234c82f4527671438eb0cf24cf49cdc7eb819046983a4efe4995d629df87119bce7711864f1e4adf7618eff028c29c336f17f79599fe26c2207fd49a98719bbd154498f36a86d598f010c6109692a9b8945ec7378429345b94ecb9fb4ded429846cf887117096112f3c9e329395ba9f106614a25d674572f47574a1026a59360d28d055d154e42026158bd202374b460b27e96e0075260430077080184d12f089d4b3ed3bd7fb27308f983a93a7ccb7786129b37c40f66fd90163d7f56d2392c88903e98947fc79bee0abab3a61b62941c8f1005c848373490630c217c3049b20513642f69442bd9aaaaaaaaa47857005e08d98341fe828dc8a8a454a79422440f460d9d517296d7ecc75014217930c8e9da93555b1d45cd89103c984d9294855039acc70e22816222e40e864ffd6582b29ff7940bb1c3973ce5189627b7c812132175403fcfc949591e997a6144081d0ce7962c85559d7f9768089983f1baf4ddc99d24662784089183298975727d3dbbd1f90e217130675513eb66c74d12ad1d42e060d6516bf2bb7f2bf2f406d3295137f973dd60186592243c96f4b0f7cd21a40d06cba5a2ddc929d5796183595c4f3ac984b8793743d660109fd54f84e5a8a70d7341881a0caf6aeb3ed28418ed7f2005365610920653baa8ef615cb48cccd160507d25447da666083983f17432dddea5548710331856e365e7c652ebfe66b40742ca60127e57b9f45a4e525a158490c11c8486689c5092204ace066f230521633085eb28738fab188c97ef66a287c1d8b39e2f76bb6f554e02216030f98a90f539f379f9f305bfea2c4797fa944b8778c118aab2466a977039bc5d305685cb9f55eeec20a48088c87e22840b668f53e99d2a878fd43010b205e397588a7572e9d8fc46d44688164cbde3563a9f73860c6ce00c42b2602cad7dab35d163150eaf1b2158307a8aff96693dc93f7805732c2d71a25a4b4f05252683102b184374ce3dfa28a5727c8c902a1877749ea062373eab09150c5e39dd54b38429dd4fc1f0164a46cd2d947c926c0c42a460166962394a84be5130ea9fe04957f09b99110c42a060aa0f13e32edb04bb31758a11f2048396cac552c1f166dc782718ec334477b0ff8a4fa5902698ed44d99bcf3295a4f94398903eb77825e7c32529214b30278bdbd962bf4bd4625a1ea204a32925cededbf478990483ada528a1bed46949428241e65625a9c352dd3378f4264844c8110c9eebb3ca5d30955337448811ac9c4e652a8414c1a0be6c438e1cf378417f811839ae6c541e428860ba946ad22e88d2592d22225f08198241e752234b09937bcf179fd773e81e5d164282605a114b23d62516428060f4dc2a2ab337ce83e807a65c2b0bca736a4979eb19427c60be18efad7029bd30f65b8774d13103082fcca3a490ffd1ff7e27681746f9ebe02587105fe6d185614bacbb7a13e335d53180e4c2ecf9ad92fc25579b1939ce701b2fb821c61e105c18434e9e2ce9e46c80dcc2601fefe4cef3d3f6a609406c611095217fdd4d7eb58db100520b93fca9eda49b574ffa314e9b154068611a0f5339dd6813543608209ddc13f17902882c0c66e7694c454b712c4cb12788f87776655b16781c645ce002144062e008c1182d8611119101b2c121406061ba132d5b392f496e4a90571874b77b988f67cfc7415c614c533a75ea6cf6275c405a61f4b426bffe4d320f2b082b0c6f97e4ceee55722d02905598e6c4662895c28a18f35f703300518549f989d696f74ab23bc9f022032415067d4a2721ab2f367288711a302387182ff81188542f4050619027bdae8a9e9347791c8cdd2f905398f7649de7e422105398f39c8a7d0b3247ff0909404a619ad53091a17320a4f0cdb39e308e02b71259a74e681193bb358088c2248d5e631c31d019fe38d40cf46588884c012414c9793372eb2f5a308d68bd67523a0001854999f6a58f936f4a5f595f84818130ea4a09209f30990ed1a6db664d8d50d69e274c715775c6ffed8439fd42fbc6ab73a5ce0973d0a233672a6813466d13624e89aca4f6b1268cfa27ce8441df69717d4bb227264c58a6b457d609209730bcc5106192785a3d9896307b529245bda036dbca2e8054c29c7358f98dab5d476b440b475a008412c6ce3a9fc451b2c792a4500032098305fb2cc2430802104918d6b4898e9eff9ba41dd1da178044c22444d6961c4eead0146d00020990479845c8888e95b63d3247183e28c1e4e82f96e30bd208dd928c2b418e52919719234cea434dd0bb25c9d7e58da7c12fc2a0538cee0bdab8d1c8c6005184414ff46c2ede9ed7e28856810148228cee398d5a1c2585de685c00418441abcdc44fe5fdb1191ec27ca99314bbcb452ea9ac0062086386a598a173bcbf7c17c26027c9395e095979da11c27482b00f254a8e1ab90dc2ec39de9d78955fea910119382ea005104198d7d382f212f40409842645b7aab65c5e5e6a6e337e3a6ab6f25a667c8e0208836849fa94e7e89c251405903f18cc2d7aee93a44991cb81f8c19493ac5ee27f4ebcd79800d207f37d7ae750e92e2995ddc2f1390e02207c30f969cdcfbe37d96ddc8339975b4a9fdb4ebe7c7a309cbadb7e92aa630895f200240f0617578d2dbdec652a081e4c424c124aae7f8f27852077309557e8f057b205fd41c50ea6917e27c9afefa4ed4e40ea6050d91931b3e8609274ae24c7de2b07afe760be2472b1928a96b58db22d80c8c1281e6c334e922a8eef7130a75373e9e46e372d4946b4ccb0c1dfb0510aa140a40a2070307749c9dd544a81bcc1f85d82e90a9971eacf1b642c1540dc606e93e4bad7cadd9877643d90ba206d3096a8649dad55a37232a2555f84d1016c02081b8c96e4ad2b86aadc8fa500b206a385351344895592d8a906935029ec84934ec6749804903418afd4766e4bb50926090de630c2ed648f3b1df3cf60d879ad1326577bd2de0c9e24c4a993cce3653099783ab1f3956345880c268ec5a8f451c632511c0c4641108441104322cb05f3120000001018938582c1783826d5057f1480034a36264e323422342616180d46e2a130180e8442e150180c088582288a813894c87890ec04f64e6744f1281f7f4440079df5fa56c4029dcd91f8cec1826433e3e1b17891a4f29c7d76d902aa8c1b8743432e591ade0f0256d4bcc0b03cb557a467c5748d0066e290f9b58ce807cccb5bf0dc38bc206017ea853212228d35782d4d514d2394ced2fe0e90679227e88cf3f3f7503c099b500faf130b09ac4affd61d425c8ab1f3122ac78ce2217c7fafac07726447dca9862ee79b3c78c12a1b718c4bfcd02de0a1d3b5723a9f2397c56d60c3f7f5edd2c6f2db8b276688f22c9167cf3613836af38670345e114b85670ec50f5a92bdbf64196e0bda9e24eeda6f76b3f05b3553be6dd67aa9733baf40129a538c53b412181bdfbc2186fe01713576f63ea8b6c59d17e82972b6bbc0250f3019f79387ee76288892e289d3793677047cda414f4619d8c192a807051ef841266650da3cae93d41664fb190b81809c1e5fd29eaed0589f393f3ab95336680a67a147bc327ad6062e98bb2330b087e12e7013dc78886fe80b5ba882870a0ab679a6810c826704026ada98df4907c4428f6595775acd4e76bfe93878cc3f065101775944e7359c336d397ddaf2da186e065665e4aee8511a3a1577d805bdc5eb45e695c8332d07cbd74847d6bdc267cd784bc2039322e2056411e03ad87d6738bad4be4fb9bb3a452f8bb46014235060e8183e6e43bc92779bb9331fb981fd3042843cde1787bb648640c14e1cc992e803c96c087431e885db63b2468df0b9dda7fc84c604a1f3a4a3f2aece529a908ef9bfb3325460dca9428e19d8e165fdb4c8e439044cc3c90206d18a21e3ed624df0178315d15705311d75113693750d81602b61c4cd135c19e64fbd9a1b6168856852c70e009a52e60fde69bd3c5340c09be31043d74e7332b03a01aef398c0c2304b940dfaac23456620b4713d9588116d5e0d37dc805e3ba255b55ec39ed77e28fac13e2f39d615b9e96124c029bcc1bfb352bba8bfc66db0e2757bd8ad79c189c697f4929d292f05298622029917b5aa3bc5c3b521ddd75f1f8fe9d3cff7de95623a7d53672aed744d887e7991142c76abd3570ed81078f275461762f1856d55548b3fab00e18c2d4881ede46c4021f1c08b3f26b1fbc56ad77663fb31d91cb980039a44e0da1952b88494531d9c9e1e9182cbd7a873af010310dde0245856bd6775bcaa684cad72cd02aa65166819cb0239ae2c5084057ce5601a5fba6938a8d7ebaaa7ce1214014e35aabe6c2a333aeb9bd05bc4ccba0d68115fde854abb027eaf72e92614ad0dae3144bb7b6851831ca55c6484c5370e36156a18159ddd902160edb4ed7e710c56006c46cd84b15c424880ea6e32eb7cb77b89d7b11620ecbfcbf8609423b62ed4ad2aa94a4558fa0947c5b31e54d4187f6b10a9b99cd7164dc7340e81ece15ecd15543874cca05fae6c7609346e17d590a871d01b33cf44fed400aa602d75ba775764d42d77cad02aa55ca9575e64502d736415063f12afb65b1aba80c4db559e2439d6e5e0786ef2d4ff1449ffa2e8a5cf2ea9e3d6d9d106853ec40d5e5f89aec88a11801875f3e0920bd828cb6a271c305eb5c41d4cc08b268834c018d1335d715952b9141a1ee65c2e39f05ac2a29d146acc41cde469bf6d4cc1e9d94745142d0f42702011b8b070744a8b9dac87c085cf7cdb25e4485bf847c33b7817fc821503f9791b8f85cc2387087d8c42d6c0c5bab13e60cc948873863163df74f5540dab050acb0ca8ec0d2f89b889a27480099fb397d9b4c02c5fe100a8c2ebc9c5f7f42728ca841b7c07b22eb748bea3324dd7c56114a1494781342ce25adf41c3702520cf6040c5b9da6b8f57989c74b1d999067c766924b2b03cbcb09c1df27e561d6e34083d06bfa3b360a37b63b8f570dda0713046e378110505b450d0ffc43c09f127303e9a1d69fd46309681e9b848f361877b57c421d58c90edaa78246928b0958a2d58d4bb09e66021ea808556854048489956ad82999c9383474cbce81b2218e11605a76aa350b0f1a4f031d9de5c9a9d90ab3b62b563145c7488b757652cf8ae07870ba36f1e43d714cacf4dc9f966c57fac67ffb3fb9f7c319b736e80ae55131b09865d4a0e22b1fbcd0e13a193fe3639d705f733822b9d8fbeb5553f838a94c8cf28d1bcbcae44495b79f4e7d43868b95ff54558a36323325022fdbb44d2926a86a8990870af0a51f0246574b0cc320972d860e059d98484e8c8aaacde1eac1fd7d8c7cff32a15657bb663ca15b569b43c1a65866f0299fc58789466b036ed0503310e5e56a5490d2cf798930301c8f0b9c11708ce3d156fa16ef1a51739f0c0b7e13c16dfc428569f486b706d8e83105940c8170815946931d8258e14a6938cd7954c6c0509b7d3e3736b7f3e416a3f43fc664d977061c076c365a31861eed46b229cf55f01ef291747e5206bf13244742e66d8c924d0629c9e918b8ff22b149611a9f51a486c3b971ff62bfe0b3592daa8c52d4233b3708ef79a6961ede6345c1420c7d2b155b8746a4c6e8d139781c8acdb8d65008c075f7e592b28fd47b11e2eada0f719ca2379501ba28347943d0d80aff5bcbf3b6bf6cf74363c255ce03f57b5aac090642389b2080b273246db5434bca8d51199d0f932092c97a0f54a8c23907e9f2b51db9d299f3e26410dfb488fb45c0ca235614a57d2b4194829259bd3471d438efc98a14ecad3e8540729650e23ad2d932614917c0949dd55e59ce82703899f7756cc3dcd38783a2a024199960cb1cef4925074e339ea0280d8381b02134ed29c1f57ba06036cb25a688af5bebff927862a948d8977ad84b30a59620c222ca43dae7877e4ec8fa1a8f0023c23dd258c0547180abd4ee31a2be35e8fcdeeed800ac4e1f09a911b6899ed4aa07b653c4ae82786faf2e13da51e201309166237a40b4fcae22e57b8ca0306051897b0a51ecae62d8fb07ce14655ae09c87ebc076dfd3ccaa8137a54c482a8368402a61106689876261286afdda2b0c716a88a238e6c0edd075272d543300bbaf5416b4a9c8a503c33c4dde01c66468726a6d0ae20421bd35c334faefe47019f85d9d2a773549960da2d7dcfede59a9c9626f7a4a886f7fb98d9695c445b6d499e4d68f4c34dd6e99d1024275514411bae86b4681e1b90e02d1f04ea8eed9ae670e3e18445a511016505916f73f768461a3554bf98e383bf08d89eb6c6128385dc751d262428333459ca7e97e80fe989b20744d219f61a06a13a06216e4b9a21761fd72022126d0cc359714af861b004ce2e0d5a2a0d1924425c11f9834f1221081f418d39b7acce4da84cf00eb40c78db62f6f53e13231e03832c984d11182e5dc1c878818ec39626ba6dc66c80421726f3d6596c912e11a86d8adf6f816647802a0f819f765cf80de098f5731098a435d1e269d63e70744091f4eb27927029f48abfb3d9b79e7ede87e61e4f228bd5ce405561d0678a68d03a210387dbbaa6769ee1f9f4e846eaeb165ed59e3ee248afd3143c6c1abc837c3c77fa3bd4921837824c3197b1c7b33e57889ad317811961b2ec7b574066cdd9126cf5d6c9f3127b6d9b79ad2f32415b7eaeb500510c6fd84fef3823c43403b9580b12858af1515e59521c5917ca8110c73b828e25238ce53837179441d65355c8264c5f5b9b0f99524eaba8465d5c67529f82bb31152cd2c84444b2c4bd449280cce479fad3fbca28af42baf7f7521579e9c4ed235e8b3458a0282e46ed5fa816d580b62926563868cdfe8145d1013f5b497ce3d4d9ff602b7102c5083f05b2d8845fdd70bb70e38bed6abbb4c698d11f96b8b413175820bce871629fdefc3f18380af0b97ce15d973b74db6a0ba7229099387bf616741b12a4d210fb1da04463f96ca92aa033306e9eedf8788e08316c3806120242c507caf6cb33d405b77aeb9a4cbbce23234f50a9b8ff5793953b2146e0e380a54254c53bca7a36e126b5d0f2acaeb1b27e1916178ba1172384892355ad8efcca5007275d64d9755164674147a261d46af2fb8e9c7f02c508a42f848c2de70f6a68b108d988c53c8be00f36f051f441c3e36b0c2f7b07e397c12011f90c13976f563e6d23288f1b3c6f4679cf95171d1ec654028093a074240378e40afff6aefb0290ba08b747ceb5b8b6876e1e2270ba05c145572966b7b7035594c04dfe7809dd866c827e66e94aab1b98a3669b9069fe63f93d2b76c0b0966490136b93789281800446ccb1e52c8662545af7fd92cc20ddffda7f0eaa1401c2d2e39acfadc50494f9b7979b001c97b3c6b2dd12520736b8734f249696c8baa08575df0d6163aec9873a42a309f1fc1c9e74f99449ec804914bd6818a5b0d42774876a282351f5502e4393f26957d58755091e95cde9556a0b966a8e957e6ad74c81a816c5f4b5a232bc36761bb537ca304dd586730cad101ac2bafb67ca235819492818c8e1a8add3c49c1a2aca63405704dabcbd39d13992b5fd01711dc62c6d5cc69106c41fe130943c2a8f48b2ae65987099470655958026486e3ec4bf0cebfd9c05a16cf212af4d5838ca8d7e7da89ef85c488358dea661007ca6e9d6bb53bf698495d6394a1fc091942aae0569158727975f3b6941c361cea55ccebb8fa986f5b427a6c77f3c23647db8fb88601dcf1a9df047a2ee2a3b0c0725768130ce25cc45fa3dc13c53d42ab7c271181341b2d4962556d85187624306154d54fb23699af9052484e407009ea042807f058357804ed8caa90e62969feab7626832dff727314fe3d4e2322dff86348992a45ec35c6a679022682ca42038e6bd53543335dc059c09249318e095dbfc006d729fe3ebc20d9ac5c472fb1c7bc146ce9b092a13fefb8f705ac30dbd8233230c23a9aa770dc96c1573455f91379545a8ff5b1af0722c4bb3726b8ecf68040de72765fdde9afd33090555aac71b504204eeab7e7f892de5def96190540695ded4f7864d40adb0eca922a159fdc17ce4f25212169311b9394850497a42c000c137cc2b0db29e8f6e1e15eb2652a27f565b5c436532a0f2b51425fe627d595db22919b960e291ef0bbc3ed1f391ad82e75f621cd796f22be093054b7ca0f0249aafd87ae354728d4194a8763f6e7e9854c595dc4b1fc66c67856e6812f7ebac86e67a56f2232fca7c0e9d836ab1d102810643026c1cfa04d6c5c74ae17a6965a8435e8a2d8a2d3210fa1fc8eea17f866e51166ff226d2ddbdc9c04bd7f9726ecc2e8875d0ea311ecc95641a989554ab790f39fd1acf9b7dc82044bf3d4e9ad72ac547b650931cda7cae046016d4e26b2f653b7c3c7a1d67ec855ca2e8df22b593ecaf576e6f6a799c1a5f163c1c07f7b9a51b2324d5321479aae8da3fa5e87f9e296be64896fe9b28344aee66d8379543913d05cd5188e85089d7fb8b914d85c31a9352d4df54deb75164686742ef2e1c16df4e40cf420e5c4ee78d241eaeca2dc48be2c3fa652b150bcf2c6622859ef79ed05c00ffaeaa18a724dc40430e9a2e35ec4ae882cf6876d1321314262dc9d649501cfe9c43d3f4a9696ef1095020f9062f7e160f5b56f44c76631b8abfd313ec4f4d0661109fc46d378f6c5a15917a3d767edee15b2492470607f8815f68299b8cbc75fc8ae7f8856e9a1b559bea70e0d31c415094a6c851e0bea8133147e2ad676f49b0654b5d1d75fefe4828459d8024533b040e6132d7dfab964485e95294d05e57e26b2e883ad3789c74e9391fe5afb65a3203937ff12f1e1bd9f9d4e6e2b0f31642f6cfc3d2d8f07e9b59f45c0ee84c0405116eb766dad89ad7c1c0462569c09e210316d75c575a3bc14b6a7d545a087c0b46ce4f073832c619c0037bbaed864d34b399bd86ab1b5f8287bea865a6552e99e9f451ed70af122389fe7d4e8ff8d78a16345b691db49614b52e812842b75face39630fb2c983509be5aa22a867d29b0b274918ca4b2fd640bab3487397dccb4608dd08f4a9dc3192e8a84eda38c68eb497496e12cab7879f9462890ed8cf5795bf2a4eeb1d3cb8407afd795f7d17b1320a66e9133e491cdbb86374abfcfdd1909c51216112c8a1fb412b61470aa8cedfac460dfe12e718f1add7e8fad780353e213e5cd673cf0b5e91dbc90d53462df60b6ef37333d8133fe0951e101f4ae4285515cb9db2d3859b0f663b72130cdb14bd5c140766907b4c30ae0fa5153977a6eda730a4f6cd17748618872f00ef906a95fb0927b63d747d8642f76070f5adc8a1120ac1a763b32778158f256487220ccc7964f5cea4509425c03b9e8731b6ab644a42f6f3598e8859b3c33f2107561ac879ba0dcd63933ed2eb669de00d569fdbb28f11b1370beb99f4d7a499fb86592def9f994263dc1a36195037d9a1949e8aa9905e2ddbf14d9adfdb780b645c6805133ca93c69024245674c2896d23beb0c865c4ae571c43c865d0746bfa04eb96192e9da10edd24411aa1a66119be74a2ce84ce3b6bc21a12bbd63a0402532c5f7b37d1b731551388d8a0e08b474fa3f53fa3a671cc6e6a62a0d5706c5535adb58730361654f3e3132b60d145f94d0e138c3b33f3dee3534300edc9189bb1f02a60c640e84c3dd10cc80d8031b4c57112e6167daaba1080a2e50f9c1c66cee04921006241f788e6fd03fc6e92a8ce2a224258dfb3b40be86a9bcc0249008e5b01e2f3cb02168e110b06935aa8ba010346e4fbb5b5e03af9773b3448bb2ea10c57ee7a6bedb6b53d6323345b2ddfe9a20f6e4404e963b0e300b74dd26467c5978df4549ffd1286c0aebb5e2475bbe027330ed27b014a47516b4fe52d71711002455fd6e115b1b073fae2e73ece52f177d5c45ebfbd4db4a641a57a33b9df236b9409048186361339cd35b92fccec2662d1b9c48335cd4fab51848231fa675d6ded31b34042c859fccd3148d8867e9e0fb8beac60519e33e2cd13562009cd68f56d6e73b0a8d9ee95a9b1ce31bd3859fa0955451e217da80dfdd0f8b156450f5949ba15955ab97b689bc1d4c841e1b5e00fbab441645b2d9d2dff15472fa5de4c6494a041e61c18530b781b069f34973d76b8b293dfb38f54d18814c8588021427a85818c2142b59842cea4739586722fc34d9ba37ef909a6507619047c9a65b8ca53e18fa54a66f92b59c109015c159853620d26be3042ac61934b98e5392596c60a8a9bdce9414d4f661f611338bd08724f83041f6595e6e486120cb89dd5a71ff674681796e5ed922a9d321791d97b0adb9419f5cff546cab4450d4ab745812c86e79a7423f15f3648acf9198eaa8878f89509050d30cf0041a179cd8655d39148779e1bbc5d0413f17823d43533755c23b7f7f6a2da47ead5c03aad7678e68d28115284f74a54271bad4d2a3e78511792ce586620ae17a25984118e11ed0e293f867efa55f6d2317d51df77c421aa72939f47785b6e12ab9838c308d27ac20cbc04be0898c70c79845d6d2ad288d270738acf2da92ebb559f1a58266974132a3d8ef71e03b8dc11c4c63dddc243aa4c4416248a4e7745bb9cb23180c7df698d24b9c86c49e4962ce8eccb552e65117850b36153d3baa905c075884125b13ca1301cf7cc0606c7640879164a735212dce8a106a6da8384ec4d9fd18610f408e9e57a0346d435a43bf8c1962acb29401ef1c51350736f4e8961bce8fb38853c8384f32cfe62afbe324dce266cedb4a5d5e9e02b13bdd591205449fc72d1570bfb32ecd6cd71e75fd774fd9cce14d404e8c1336efc572a1329dd32901472da2d7165686ed918571c482ed3bd82257fabd48c1be9f1255e44cb2717626f01f1a273e741cf82e39eb77d108ca3fd6067996a77125b14681661769a27003b4f331aaa5a5a95941b6bd5330002e73937e218008f67fd1b84beaaed73d3caed27f136589c5312bc5e09b4642103e5f7b8f7d9191ea51c757da3198dea3b0c5ec6e695577fa598942bdc67fd00574499e6d103d45e0c6489e1a294aa9de0c87507816b33cc4660f1f4dde6b0fd0d494dd2f5e575f760156d2bdc24e9ef67b43e28bc51a9488a2148bac30c1e0f2fad0909b5913b58b95c89c2bd3a49767fdbe3347cb19b328c4635c334fa438c467e212dcb2faab771e4a1e16c3405762411a4de0371c169bdd0d4573d1efd9f4f4b3d4849580f2630a4d83f3e6b91ef0c592ddb6e42813869e43c141cd35e638a1b8564de494e0e8dbeb8144a966580f606e78972181a1c12d151df8fde93ab51f3204f56449de6be905f174d366fdc71d989dd08361c60a2dcba705fb8389d2a9d5881d12481f7a4a35ce18128a9226e2bae84607eb20ec9a0ac10ff84c0f0c14eccd57dd452b1582a8d5ff4a566ad9b788d7c20a36dfb112cb7c6cf5a193d0998bd184bd555e2ead734a447648c394d8bf8b5010f2f4fd5403542337cd40bcff0f5a39f8cf1459a4d44e5057ae5c76902a5c651203a09a3898ff46716aadefabe742a1b16cc789f6ba8ca312e4ff04f0a1a0dba3756c8c00229ec01dcd689d67983f7889e70cc38985d5d0b05e6eb74ad949202610c824be858a7afc40444991998d14bd8fe927e1dd959fb3bb2a1c16ca7044087af04c01992290408d81f18b61bdac9e636251aa91acf51077353d928c732a615c33d73ea3e49f7dadb4ba25537fe301e74201c2a455b0b8094a59f6cd15e1dd7671c9dba433d9bb110764221bb295ef344c18ed7e52f015d1ed254594accc1d981e29fe6df2008bb5e0d2c39cd13e9edaaaa5f86c1f4f2a9027492580f1a58ec6827ed451afa63f576b419e4048b0a9a29343c80fce85d1ee8ff615ee82b1771e1e69def6ed870beccdbd36e0b800555522cb752c02e556b6ca1a093580f9f7055a627f660ba9c725ecbd575f9935a2eb7727691c744f08781486ef11b4b290508cae811719c07a4dc03d82265a700b0018be902ae082c77a12264e323ae352da9e7daf662126e5227c51ab180a228c27ef0c270cd12982bd6eccaeabd4f9a5a77c2f1ff7a16ebe1aabecd42f871c72f537b9929d1d9b118047f0826bafb88cd6d9f8649649d132158e933476ea47758881d50e2a0d0460cb6e0d82268859b62458de2fde40223352c629c546fd3b47603df2be08b4b5f60247fa866463440d804d997a3dc196d2234ef13c49f591a3756c88651227fd6d4ddcafefc2220a3ee3a64df60683caf972475c8a2d2222e5db8696b6c91d61454594406c4f51806e476011edd00e4a964a9fa58e7d7c098ea4145d61d6f37b3c2e24689a0f6ab28ef947efcad209dc0a50f5dd9f897a0399fb102c978a5af76e166a281730868330214fcf817eeebd00cace6c3679182b7c5e24b01df3562448840ac9dac4435903f8483937e9d08b4dfe78fcff5b1df250fa40fa98c2eeb434aeb10d9bc09942f79234ee2c8dacf36e85a1786758bb52f547d4f0bac0fc34b8b27572f4cddea3576a443a3c5cce755a5e18732b69ebd14a5df1b04d72ad5099f0b42c8f6708030940e75e1d03cdfd8e9874b1a4bf29f963a3c0902b1045cd9b8b281e8b5b9354c270f1c5c739b6c6128f806c8e1323a687ac272284a1126a2e5d4eaceab6993619514a5c9c88bec718a32d264268dca10239b58f4155ed12546b4dc23f3a90b3df2c97656d9f14f9d23e360a002e73c20043ca9c0cb630b8d351a27d454116c2350961238c41e72b98b6300c6fb475d267d92ea70677610189202e8a6802b6048e931616a0086ac89b8090992af4390e2f4f0e8bc964028acfc34051018f7ce79e1afa4dfefb0875103ac6512c8dd2a367b0d2a024343b2fc01f02f9f13689df9a7a5f4503bb2fc5f5aa19a9002d9038838a8a94e9863f419e6e6b357bf4794e4914acd207ca09b6863194d412138add0b963f582d930d345e7f7edd6fb246fb117897e498c68bad335a0f475ff30ae02699e269279743e5c4e19be41ba9ec0c249a5e71f95d7d90b78fd53326df1402bc7c49be220ff099fbf6e773989d71aa85d813585d962661a36dc5099d6dd442685d2a958f581fa10b8d578beecb8449e4256766eb36ff71ebc4e9c03e5aabdad3639c524b798680a0df7760cdcd2af5b7763e20dbd3bd690a8164ee52dde7e86505c84150892f77bbf2568ef207e5551ecb65f0952351e25b6721b670373e6c4f1f4467f3cba3aba1e3ad123ae029ba9218782a0990fbfbc82d68fc89544f58a5b1804146e3623a823a591f089815671ee4f54541a579adb307d6ca8a2a2e88a663ffd5a74a5c08cc101604fcb6e3250aab42df8472f01cff67f5a3671f10b51fb8caeec14e46cbdf5eaa554429b61e7cf57c159126e8c8ea8a1f3c5a9842489934fe1078debddf9c2152bccd70a966878f1a04c7d33d8b02246249350c16d8640e10f222954968afb94ee9a3ec7c6678efa741e359abd57311e1bb4dbf4c4a4f9480aa25efb90bb14309c1c3d4037813bfbdb51f9fabe9f408480350268bfc34e22f4a7009620a83186746bfd99260509b2f1315113c853a2a545c8c03fd3c7ea18eea0fd6119c2476356ebba0ee4c462dcb70c3af3cf279f221e9901a3d605f313f4fa1cd1d7a19a803414b9ff31b7918f4e5c85886c5790d2e1f83cb78d5cf94682b3baa6f94422e0016a7ffb327094b73e8ff20ff6075987b34c510fe139e81456e110809a4a048aeb0508eb3af51c7533785fc33f166c681aaa85d9fe14c0d5b8333e450c842b7a8801338cbda091300dd20c4092a8f36a320e7bd84665ea44a325b5817acf213888d7e4e9f0b486a94eb37ee75166570f4be11dcb25647253671be33daa52e0d534c4adade0929d0d9fe6c12337662a269bbe1d1cc30b5e6105e0c5f3d05509106e40bf024235586194a91f7a47404ab281110d748ab524b5747a947a4d448424036d4672833c285ca3cae9e9a9d9455227206744e70a8bb746724167e02486a41c9c4702bc07114a7e080879666c110449e5f872a93bfa3494ad89395c0a6c53cc175e0f1dabaee65ac2aed7e5388d812410384935bb069bd2d162f695d061830a8c040db563644b859e189491ddc62a997b32c2e54300d531552e68d7bf9461f1f1b098fb29bb42c03e69d122d9413091be04d2930efb625520dfeede4cc93a64929221fc8dba323e7b661b95bc960da50e102ccffdd31d451a11b411435eb07499382248633dabae2192b24961235778dd049e8439ad848f828e6b5b2fc861d0beeda6396af7916d46908d8890a6a36da71243c7fad17a051f266dbe770ae44f457bd5b310eeadf501566d89c217e600d7d3aae9da196d23f234a96f594029d416e45b78370accd7bd165ba2e6b186f3a8285334b506124099b44f6176c9e89161ca6a8ebd5524fe7e939c3b1ed418ef658968d72b99c4501b4a2d1853c081675aebd4d27d94248906a8e4d4f9ebf0ea051e55fedd270e76ca6c805c3a6055ee55cd4d1571fb4101d0f20af820c6277953717c8bb83e54794b3b26e9080f4598cce26687a58e8756e2299610c05b707108cd5e9fdc88a5bf02689b4272ce62e90f15bd48de613812712630e342b18f984b46ce08be96c2995c26067501d493b00056994d99e0f7ae18a3d09a538c57343796e363bb9a8dcc58d5919783b2c290a6005eb0a2f0c6f023af5f2113111d3f3f73fca8d28d9f97cd0585c24f501b17a660aabe68cd546f09f1e841942cbfc5c810226b6202ea7f3d50fc122bf082918cc573e11cda1eaa1e041d016b6741a77503c28ae377b5aceef6c31b1035930e8cf7d60382028942024943506153977f75b84a6fa113b4cc408120e13097eaff016cd36aa0c1aa443b6dfbc8b92e642b560f131f74d942050361f2c313f605aca291e32eb18b49d77366ce2433d55a77eb22c9b785fd52477d8ddaf6560ddc9ab95885032514865237682f7a45444c526bb4f0b65c8612d21d4925d9109fbf26f9fdca4e1a81daf630999bfed9fe3286c0dcf01faf78fddef7a9cbb4f895c8692d254b2bac320f819447ec4ec145ea1d4ab19e8f9af591c35cd6b21496ee488c3720bfbc42a7a813e5be0ba2a14e180372493094203a6994abea0f670639a1158ab69394d9aaadce4a9046eb57fac67be8bcef1947509ef20610ab458cc757525323ec13275fb94c09f2893e70dcd6119a9c25e2427d59536a062f4b36cda4d110e06b1d992a150754b37256c63a9e38d8e67cc5d0425b27b265f2fd1a21d06c382b4c13486f7254d92fff602610db56a678fbee62a7464ebc65079cc1695cdc82cc56cbb0e71be0eb48dd154890140cc01336c7267098a554dd7f89386628d3246900f4af865c2193f44dba82004a87b17ffb58dd0d656d1c1fd1d69ea25e2c4dcb90eeeb4de1293ad25a1962d0cebeb352a7205b8781222d7dc7c10c8922298d80f764de12f17c0cd536869ae01367c3fec0239262bc9a98c5b4a2a2a266add7b4698696da469326abc519db0aaa28d78fac71fd94a2181f3f50e23425b44ef74d0354efee583d36506ceb65fe7c7c1ebcc2ec9aea458a369d02c006046faa22b85e42984b3fc363d8f22378b4111615273e68748ebfc08d3ff9bffc911cac72587ac500cc6317f5f98d7a2ca4ef66e2a7be8926016c3c03eb943393e44b2f6cacb05ac559b2c1b75fd4084c56ed79ae4e75678ed12cbf62ca32611df9a029bcac9956bdc8d4854cca1a73be2af4926eb131054fbe82cf187938039ab105341a72243f03862d37909944ecd7a87d72b9438fced3db66d0ddbf7e602897a64a83a98cfe59662cbcf6aced813d181aa8cc674a904e1872784ef75204fd43110c95e1b9689a580fc34c6e406d60640926431a1394c314bebb9efd0dfe936f65313b8358a1c9fdcc8fc66b5fc3faa8ae07ba12215015effbee97be2a2296936b83f64e33133dc0fbb6e488d477cad39c74503dbf378fdc341d47618f34efc044042cef49841d238540cf34d76d74358a098cd9d5835a8e1e4c443b3c005b01da08b00434a87ae9354b14793afe82f0de94f6e15a3e134b57015be529c7dd377c1af9ca85560735f7f32f08cccb424d80ff5c5e832d458589e3402c023ca338c8e982987679d57fe2962f5c5e43c7b5b2a92dcc95fcf3f87fd68aa2b23a471493305e7b3e759661895ae91eca0a4d40f003a5a36a1e8f24e8ced48a3ee52ac113350c09c30432af361f630faf1e4b8775b0b05efe386944bff1ef3ce8a167670d3e5ca8526e543e42647f6e202192efaefc0d2816d350a0382c08ec6cdda8741a74e36cf7bb5406230806c56a74d247194634a6a6651f16caf6ec120406c6e6d1c07031fd86370e9506c14fff7189d3c26991d53b6faea50dd5dab160f1040dc38bcd9baed85a8d342a37b8e29ae3aa9cd1152b1923c2dd496399d853bdead26eb74051a613dec60eef54e1a6445103cf01fc248d3d926593aa2769e5972252c7deb718c74ee1ca737609892ea9171b774e605a8c34aeace53b6d2f0448a40e11e5a211aaef5c7403178253b766f9988bfc3daadbfc6fbab19ee0d1bb6b80573e042b8f33ea79434466f327e20effda9fc38146060fa8e78402d4fbaadceea47166d1b329de5e05dc35677d3792790952dc7710838f6549a9859cfa415558066ba72ce3f12743318268f2da84910e2f1ae50d2da1ee812e7fa75fb1bdcd42a48792c8a3c92cb6e822edbdb444936fb47d9a415e9ba1d9d8d8df688f2d888f567b35baaeb027876818c992bffe8bbc6c2d99af688b0d0eb0605afefd087c71f0fa242a9fd5dd4db66c9df8a8920f962495ad4bab7663dee34c425bd14a725a24ffae78f5db6b68f37aa2386f7ae7f5eadd8bd0e075bd299c098bb7174faf695e8de7259d7c3dc102cbfe16cc48aff7791d7d9d57507d7a41e145ac575c5eacf7ea4f913e90045ec747d8aa373cf65aec6b6f5278b9ffbe8edc92eb939b7cf561d90963f0d624ffb62a488b96d7bc5eae78f1df2b69af4d2aa954495c5e7bf592ecc538af1cbdf062beae7fa4f33d7aaf3cbcb8ead5c70be9f73a36c98020f2781dc183573da2dd50303daf2f7bcd2f92ff6742244f9d0ae9d6fa3a9a6a23b26bf575dc78b073fb7a608bcf1f6873f00b3f851d4f374ac9d8bf6672b6ce2bd6bc2e7921b85746af6778f5ea65cb8bf9bd327a61caab33afefcdebe8b839939e7a1df76307e3e14d5d61e554bc8065466504987725047b2e1c156a987c23e55ae368a1024330e9d9d766c537daf31765151b8cfc4984f13a96a840ddf82ce30142f519537f36bb2a17525b918b46c18940305ff477345908593d3057b508654b9ece6648548a7b11b1687b93c5abd94efbcc19191373d443394b93013091c81ee64f7d221509c5f878feea45cb53892047d17a150b2af27fb3a06f1a1e4eda0c533a125358e6497952b9e6497b8ee349298b48ec26aa43a89e0255e91c7990452a8a7879acc1feec4767e69858db89056c31aafb55f017c3bdd56e9279ad40c48dc941a0148dc8f5e9e2e28526ef26e94c0ca7104374e9ad1ed6f12148d1b1013d05e1904516db5838d3bfe711291cddf81a1c29542407e1edf063f5b88968b09c26310e8ba307a4fda71eed18ab03d27d1aff34b59ba0759ecc4741d36fea56183763a70f889d63f6e0aa678abf5b0fcc7fc304d80e0131f2f3d833c70093f511db4bd437f75005d0dbcacfa4d2324de76bbc08150c7d3e7d79154e6aaf7a254c87cfd2596c367c978e3a728dc55700c5aa151f381691f44f6ddb262eb94597b074794d23d748e8c4ca2106b75d83260df287267b8c39a78d20afaa2859001c1aff8c3a3a582b913229509e9e9662e568c4ce8ce9b4334c92d72f1561cc884f18614877c32920ca00aeef57e1cb2ecd63f79367b2c31f1cf628a966266d88754ca7d1abd1ddbdac7792d1b3034753a4a764a6a8dc38a126162d0be8dea54e857787a560c46d618ff63a379e726552d7b5900854c941e3c5623e6ecaa3bae07a78dadd99bb2a408372f88b500038328ce8703c1c074d01a941d087d6c641a9d83c0c91d9e775c9ce30f5f3385807d492a7d67c5628f7072eab3d21e4cfd7589b5277cb3c3711d44c3891ce597fd5a9777e69f8e4bc278be201f8590f965aed19abdc9dab2338d5b3a825403e6eb9ccc4a9ff16138fa7b328f430f15b5a47d84a8820f37bf227b59776481ede844e8e39135600a33c2555afc70fc89bbcef8422a7e07bd875b8e9438e618900898a019ab0c084d09f7046361d24545ebe6b795911519a1148388af2663c8c0fef86a786d8085f0b81336f9dabbaa8e336c979d521e2980bd594c7e349b00b5a1cac2b91b6e662213ca9079f183a3cb89ec6a1857c0320b241238d7c18e6b760b52819a8d092f96b5193983040bdbce799ff40f36e3dd8c4edc4012482fc4efaa44b4e10f3eb423e77b4f102ae59c59b0d3760f0140a0730333333333333333333d32c7bbbc3fe17feee44b65c801caa26bc2033333373aaa73303afd8afdf5a6b3bbfe01dbc3394127b0db90dc10d7cba8bad1a5d2089fbb6ab6dc5189773813c1ecd7b7afc6b3d96b640c8eb2496c2c72b997e2d904435e5e7949dbd9fcf02313baa37fff8c73137850542ef67d20b3b2edd952b10af62a6d9fd690572e5cc122fcd39eefe55207725f91f9456a54f1a2a1063bf2b58de13aff4990229e78f9bc3f4a80f6d9402593a65ebd8f13e38cf4781309a47e933e37a43fc8002c155653a5559e7b8793c8110391b7941baf2cc740249ebcbe3ba46f8d8d804a2682cbfd8c9670239f87f9fe5c80e79d212c8975fb72eada2046299e6b2198ba665d64802f9ae4772fb56116bb7156a20813c5dd9724e9bbed22d116a1c819c437bf730e6a189cb8f20d43002693d87de17e93eeb941a452077fd387d2b6f22f896631ed63b1f02b1ba3ffe47353dcc03490824cdb1f92ecf0581182a57fa98f361fd0f0602295aaca2078df90139a36ba7638f8278f73e2065ec4b939b3646adaa07041f8f23961ff180183dcc94a1f4db0131c798728e621d1d10548327b9501e634339207be8144a4b2ce3a58503b26c14d7faab0bd9c3dc806ce723ad1e688f1a3620555e0f795d9e542f59a306848fd12f6b31f578ac6ad08038d7e1ab2f645ef741b320dbdb8885f655efff210b72d8d85d88546241feeee1da46fb8a317360411ea7f614d69dc7f942f30ab2d75d4b45c6d5b0cf15a46e599ff7e453d5d15690378a77764c2b2b88b3bfe1526c69861ebe0a72d8559bdfdce3b0965505d1471f2e594c7277e3231584d759bb1e8f9229112a4859d4b37b4c218d53904a7b26eac7937a6898821c63c5581b3cfe488568948218aefc5c368c597a9b06298857c94731e5d2b61e6e688c82289d3ce5e0ef83acd8838628c8a398eeb0d4d60d2ed20805e97326531ff5f03dbc070d5010a353ee3cd2f08c67368d4f10ceed7a94b345258f320d4f10d3adf457eeef4e3d9d20f5eceac68593062748ffa1f1e381846bfbb809628f7fd831597ab49ac8d2af8768970952bcb8e5595fc74f4f175b343051a6ee6ce7e31265bc6dabb4d4556c6be7dcf6389a8fb2a7695882f49ac14726a6c7ef1d1a9520cbe745a64f7950829cf28fe26d9bc4e6cc684c82b0a98779c3be5e3d5f3424418e7a29b652cab1311909b2c764215ab687449f3ff6c155770a08683c82305e9ee9b734f4dfef08f258ee59ec10f16f3f1a41cad1d49a267b30821833b747e279f3d3348b206565dd983ee426ad2882189b730f23e5335e9a13418895a8f0314404b172fe518ad9e8107d494dd69c479f7b661b557302340c411ee7ed74bc92b14e69214863791c1396e11ded13826879b859f7f120083ff451c8beeabd987a0882e4e371fde7e18687ae8120c798344cbee59b110b0d4090c75d31c86deffad8741a7f20b4dbae85595d960a711268f881b03e5829ffc165d56f68f481984286652bf977e99a061f8851aabf2f69d8fe386534f640ca213efc14b4a3a10752ca6ca676e8e481d83125d1d5a439cd7d34f0404c56e69a9bc79de33134eeb0e7cbd947375984a06107f27bea817ece090ded69d481a03f0c3eb81e590ed16906d0a003b147e2e7dad952e5a58c31f841630e44f3619b8fcec35d5ca12107626eebad54413566e94d75001a712066f37fd7d4a3500234e040487fe9141fa3a51ee60d64ebe4ba6d496a366e2054bfa5e99dbac90ab581783fd8bf5b2b8d4e3e1bd67a17954ffdb5f951dd9cf966fe0334d64052cfd8bc8d1935d04843e50083061ac8234d1fe6c92bbdfc511a041a6728aef5052bbd8d86194811feab65ad29033125ab14f5b1460642767f5a28bd688c818d91d48cfab0a9b3d37cf7dbb3e7d21003a1c62e8a25fdfca3580268848138da9a6c3c5f87580606f220bdc3c36f1ef5a844e30b044fc91c1ed5213e8fa2e105f238a67d8feb525ea142a30ba48fd1de3c3a445e3f5c205f1a8bd64e493577ce5440630be46aef7cd7101baae98b010d2d902dbb564cf7a3b422791608627da2e279c6023977ca1433fbb87b30e71508af3dea6b1d0b93e27b81823e2b90346590eaa1898c7eca5e40a30a64cd638ffdcc95fc3dc7a00239db4b584cb64e8168d7ff63f360953673291053bcd4b710f7f1fb2c17d08802d1c771b37d347930a00105e2597476fa8f213f1fba16d07802315910ed1e5bd6e8bacac2a0e10452a8efb94f6a8e976c02d9b242f438f69536060d26107dd803bd731fbd04628fc6cae569bb1f97128851655f6ee6db473fae53402309a4e821bfd1b17bf369132081987632d8adec6d4c513d018d23102f7bb81ef558534afa19238c2eb65040c30864b71ffd55d8a0a6f2e9b01d348a407499ee8a9363042270a2a0418487e3766b266a75e7c8713bc810230060a03104a246f7bff8e3d4c12e4743088669cada96b2ba85081a41d023ca42bbc3b3c6a3b66253ac8b5ba56ae1d52068008154afb9e37a6bce686a061a3f2068b6a7fca6dafe838b860f085f3ecabdb63ebcedd0e801693b672caf289947f9ff828655b97743788ff72cd0d8c1d1311f5966ee573d7e61cbda72347440c8b8def1a278a4402307e488fda8ba1b7f3cee130744bb4e1f7a627e14b37503820f36a776c7d8d947130d1b70dfe1251a6ba3d6d743098b9cadae2c950b346a403e8f17ae745d54b73b30d0a00141572745bedf638fe3071c0990616ac62c486de1a5c382845298210b42df8ad66c8e8b3c4b2c889e63cca5f76baf6bcf800521f32873eeff0f1eef7e05796813ae797efca31c72853a7da969c08c56905a3d78a81efc335841568ffb1e9ae7337d9bb10a72eb571e778e0566a8825819ad2d6f8c0b1f196f82aa1c39749f3023158433cba6c9f20f437f382a881b533434fda019a720e6e023cf3fd48a96c29b610a72282fd14f9adb828fac19a520a5d0d27bf7a94d3c268319a4204a6e56e906b51eccc522316314e4513bbbba73cb192f470e4fcc10453ea88b1e328e0846185ed485827093e9e3ba707269b6c10c5090d273b6680ecb91e9a38bad8bc18c4f90d33cdc3e347c0f6ebbc10c4f105aab2ae46f7eec98c9667482982aed47cb87496f3b9c2045d7114ff5a3b8ce238560c626c8ef6eab321e2bdbbc5dccd004d13fcbcc044973f8a185f5aacf1f830952d6700f3a9df6c30d5e82ec79dcfad66df33c34c312a4fd610fb6afaa4a102c3ec746c7fd876acea004a1c264875a0fd3b9e71e306312ca9bbadc898c47866457566ff2e18f742273ba982109a2545d2cbb5cc13fe6448254fadb3dd111769b870471c63be35554c3db7f0431d648f448654790edc7a31e7f5ca6bce3a311e4fe909ed96a33821ce5433256cc8b2056a8a097f663cb7d5411840d3dbccbe14490aecb479772caa7a58a08e2a4c7a8f0710cef340f41f0d0a3b0da9fc7717f1882f8f25b2e1e7f60f94210e463ccca342321c81d3da351411b04d9fa2cc694b3208816e671a3ad57e52b10e43c1ef930b65dca1aa70204a9e3d975ecf156beff40f2a1b7f64d4833fc40cab1362d33a5b49a9d3e90f220c3060d5b492c6bca4030830fe494347e1c97310f538a99b107a2dcf720d47f94c447f10c3d903fe6514c5bd987273f74461e4892b7a1fc2653d6bd66e08164d2e39443e7dcf71dcdb883f252d6e5d1e5526933aaf94efbd7871dc86983d7271f6dd6b64d1f31a30ee44c7d5d9bc2faf0c7310008c40c3a9047d3a95356ad2cfe3855cc980349622eb57efc23982107528ebde5e39c72c2e40b63461c4852a7a23115f2eb553d33e0401ea9f7d094b17b3ef733de40ec3beb30df963794c70da4d4b360f2f9e94aac196d204626fff35ce1738e73061b881afb47d6fea1975bd70ccc580329e54e7b0d21ad2be20c3594cd480339f3e3be4ff2d2788606c2c60eb5153b8a86196720a7b3fd70e17c3cb465861988d1d22b8f69c9c7adcb406a8b397cfc87ce20c36a6359f11a69a3a51f43a8c4add514983106f27850d2c33c9a67bffb19622086c91c7fc662f80221d0b1634618885953e231348fe4e76680a1f4977c28b3f1c08c2f10c76f5fe35df70221f330e551dbdd5d48dd542bed6aacdc7d98e1d775f3c69cc105e2e738aa75ed31554f5b2055ba982236fcfca6390733b440103b4bdac914f88fa1a38c1959205e956dca145fa173dec5968e14f8ef2063031708810e15ccc0025bb142459b28e9788709b00c15bc03cc7ba0eccb50c13f74985f41e715c82517adebc7ed6275ec20430caa27c3c9086387e60c2b90ef5ed593890fcc54ad02f1c2c58bae381563ee5081987236ba32c5986f3953205c0c9e87b5bf763ecc4b819c5cf23d956b51206a9a5f8fd933502096f547911ffab8b67b3c81b03a2e9ac7172790fdd267e7e18f2aaafa26907e34fa3efeb730817c1a2e78887509e4f199bf4bfcad04e2fa5ece19bb7d2cee25815815d37e5ad97d351909849eb5e93cf60f97c27904c26cda8c9b53f6ccc3a411883152a3295a5f7634452854dc4d2210354a5abe5afb564943206cbc60df7918c38f3b42209abf5685f2ea81faa82090f3cfbea3e61008e4bbd06b3eaf3e981f46c6f1a28b3174a43160c60f88f9e1ecc79df29d0f13ecf8145091b1238c3170860f083f1e6ef28e8a5f99355de40e32c498d183193c2096e465064ff7d83d7c07a48fa987bb51d9e394e60c1d90d6a27cb86dbd3e0e9919392094bfe5d0ae1b0d15e542ccc0013957a5e07b79bc01314fbb7da7df67d88024f3ab1d46db9d5103728a1f7bbcd93e8306c49c119aef5d9f05592de9f8a03e7eafc74316444f7e7f212e0f3aca1f0b920f2a7cf6b59aaa29bbd85a3206000b42886af759cc3cc24881be82f4bbb3393b85f45ed51578ca9f4da9fca3790f9c05e710b79faf9b0c37f2407c75971f9fae48cf748110e808e3061ec8192bcc85ce146b7503380e37ee400c6f5e1d9db237ec407a6f114faee3bfad951762b88e148ce12c600bdca803d1bab7b5fab73cfb78d081a4f963e71f65fef1d09a03c1360ff3c7e3110bff961cd0d43a8ff35237b374cbefa431a5d0e24050758d6183878fb407df8003795a3cb26cd3e60af171e30d44f9cd2dfb43931ea96e20e7471b4b33ab142cb636907b1cfcae87eb581b6347190de81b6c20aa861fca95e65bedf4c61a14ebe1bd0ff5f2fc316ea8c1b0724d730b35b93b7b6f198b5ef12b46fbd36037d040d254efa69daef47255000e40e0ffe4c831831b67208f879abdf23ed60716aee0b1001c8080172908030c177c114606fe1fc06606a27d86ceea622903317dde1cb422f7543b6420691ebacaf8a0d3a6d9c640a6b8aab8776b6b7bd8feb456a86e5c0ca4f3b0e9c4e2dda55b37c240ba4c4f3e1edc4c64fe71030ca4f67e8b973206effd715f20e88f328385a9aa05cb156e788154296e90b855db7876156e748118ab25ef9962d3e53c178823d3dfa75127b487d942b9fe639a966a37b4408ea125f7a5c3ae7dec4616b03c6e317f7b1cbf8105bda44bd25d5a367c503dcee8b270e30ac4b09f964973361f5e77c30ae41efd70e3e445f5c1843a6e54811456bdb37b2a966c26638c27c32b70830aa4b4f49196f1c24a7fdc9802396ef77e503eb4fe6c6f48c1f3d6cbcd1abf41dc880239ce6eaeb03f28f134df8002d93bc4b847cf669dec1b4f205c6cae8ffe9129debe7302395e7cd439658abe8f6d33dc6802a93f5ace15d6c304a2efda86ad559740c8cb9d1ff22f0f73484a207dea65e817ffbc2a2581a4d203891fed76ef8f6dc20d24102f88c7b021fcbbb3d3831b4720070fbafe5f29c55ceac7f0ffe235c0841b46207b7a78f2f3686df18a40c88a71467b3c28ad6811819cb6e29647db48f1f1b831045232d94efdf79174b26e08819852c5ac9765fd3afeb8110442c6ce3b96073f1e0f422520dc0002616c635854b6ff78e41f90e2ed8f07fb12ea61b71b3e20e6970e9f32e67b40b6ffe1ef858c1f64866ef000352deda8cbb4abe0fe83fdd9cce8d4ded80131fe78d53c7f7959fe8e704307ba67cff960f32607c4aa105121b3be7e7e714068b3caa13fee61fc51f4c60d48a216cb62f0ef710f7436c20d1b90c721937712cd91ae9e1a10c5c7a1f53ecab97d941cc20d1a102e8759e4fbdc8aa4b320e9efa6309d475ee99a3e820d599072d0dcfbd1471f22be58902e78f4e82cd60f6cc082f895bdf93faa45f6fb0aa2575fb296f008d5141a6cb882103f48d13bd58bde4c2b08e9e9c7e17c7c5fd124561052328ee447cb680bdd2ac8e1f61b3b8fe62bc4b2a10ac27dfaf8c7c39f8da4a92057aabdee306d217cb6810a729cafbac87934f7cec62948f7365969d7fa2e37364c41aef0b1b0eddc11efb214844b5b8d939b349655c008630c7f0d3029087b29cd5d570e1af3c02ed60b315c870e1d778110e8c861631424114bd6263fa88c2f4e4ec08628c87d93ee5a3141185f9c8d50903f2ac5f8f6368c0a8002b3b0a92af30cd90a2fef700f99a1094c104605c408e302397298208c2ff24860e3cbcd797c55d31f4f9082d658cedccfe0c34c2758d55ed1e8bae104313f84857f7e59546d13c40f5339a9c7ae0992871e8ae7714ae129a799e0ce2b2643b5233da2c332b6472afbcbd7c404f947ad9ea36bc536dff312e4b04ee15bb35c660a36146c58826c2f22216ffb793c288d60a312e4517a0f3e4347dd543f3e40051b942084e64197875d4aa1c52e6c4c82b09ea1b2343f15d021041b9220f6f83466cffe3ed231777c5b2488d1cfe236c6bccf94b2528344ea29377612f1b1d39ab9b9f53cfad6c5560abcf8a25960e311a47dfd1fb567854cf5700449ca7e64dd99f6429c8d20e5d894792bd3c4271f3eb0c108b267ded7ee7dc6f02e32a0a35c606311640bb7a2eb17df3f5a4590a2f58fdb2beffc4474051b8920c78c1fef8c57f6ed1eda3610414ca9e787d172986f5c8720bc6b2abdcf0c41aa3b8ff61e868f5d3f6c1482f43b9a5a513dc3e76c8310241ff458f2f051ae3cdc0641ce1e6692aaa88aa1231d250862ca1936bd2aedae37660c2f5280170852de9ecd3af27144e4c70e2f03025f380d6c0082b0637b239661175b6f02ac3f10b4530a3d789f0e96930a6cf881fcdac30c2e15a79b0eadc0021880810a4040c968c16bf58150db1fe6f9f2f03f8d08b0c107c226b9d7d23ef7c178f640d6a0691f2cfcfc3dc6861ec85e39259b3efa98f36a230f84fdf1f94a6ad4ab6a6ce081946cc3e957f45f6c8fbe03793ff3879f3fbe876876208c25ed88cd73126cd481e0939da95e953f0cee18fe45035a0936e84088cdcb23f3b8c770816740c71c4879c77b72b3fa47f3c88110b739fb2878d66afa8803295e69e68166af89dfe140480b95f7f34d4f63be8158a3797de203cb958336dc4078fb91bfc694b2b3b636a0ed5e2d2f3365922d61d5a2b2a9dcc3a35d670379d019c7bdefb6b10652f4e7a1584e8f77d364430dc4eb3c7e8f37379726d94803c93d567a1ec76a030d8451698f5e7741828d3390ff572ab3d6b55bb81460c30cc44e31f22d98d4a6efcb05cc11b05106a246bb92c8986228cd6c9081649e95f7b1e279b81e63205518dfd49e8c0c1b622059cc83bc98c6ef7de36120c5b0e983d1a8c140fe921193cd7e81b0215396e9c9fc619b5e20d6fc690e6b3988f6f8228cd305e24eaa5450154dc92a965eb0c105e2f8efa8f72879aa5333b740ce3c3d8efd0bd5c30e6a813c7ef7e07d3a666616881b7ae54b3d9615061b58206f8f2c683cabd91e557c05e246e7ba71f930f161aa60c30a494e654bbfa2651548a9a2dc458fbd20d8a002712e3eabf6775daf933905f238e7f1d18f432c58c4b8226347181908830c30249023870b769031861736b0210582261f4c54f620f9b26379801b60230a84f9b1db5d4e4da51fc70614482e9e4723719fc63c26030c5731d8780279a8993a7fcc3a223a81741d9f3f4ced8fe9c6025e88b180ac1564ade0c860a30904f71ec5fc41f89be5980d261043e6a98e79e0e1ef4d55d8580279984245f591de0f7d90d5c08612489552793eb3525c4cb19104a268997ccb74ca9f920d2414af7afc996cfe873fa80c1b4720879afbf0edc903397268c18611c839bddedfe738912a478e31d40a368a40cc83f471fba83c45b041047248b1cab36cf3f3967701192e20c39e6063087c7c597cd5956af86e647ad3cb5829ca820d219055a35ec5cb294ef84e43b0110472343dfb78335a3ee81ebb60030804d31ee6d3cd16333fdcc60fc8f903ad3c0a5bf7c1751f903c3e6476f3e8012998b8b9be468f2d65367840bc965fdff69178da9c1d10f63d5ab24b345cf0a103721e26cdbb3b8d3fdad9460ec8316abe9a732c6e5c36705057d46cd4adcaf7289d99885e28b5acdd803cd6fd518e6539c50aae0d1b103f57f2abcb1f366ac0c954d5889ca787bd65a4f4445cd4cae162830644afb78b0f6a91974436d49805e1b3c48f92a5f3ab546d0d59904df24393b7cd8962a4604717554b821ab120a51ebf7cfa1fa987fcc16aa8010bd2e51ce723e2aff10a42768c32fe95ade10a4a42cc53a644c45ee4432f6a5faad488a85a41d2e4e3ebdc66d77d790d56907f2b66c6ddec2a48e375c1b30fb3e5f6ad0af2c4489afc69fdc0c2a9206916f350f1f93d980715e4ee142225aa9f7a29354e41f4a8e615224353903b59ce9a7a7a9029a54b411e7ff8981faac7588a3548a15579c95d5c5d5b946b9ae52ecd2d056a8c82d079ad072e139f79dce5a08628881a3d5d6e8f29e38ffb5010e47330fdfc9a3fe7020ab27488df6896aaf109c2e51e5d6dcad7e389ca126a788254271bb23aa56b748278e51b3d19938f7dce1a9c205516b50c659e036a6c8258b92ceb53e8c6e5144d1036a64a3f15fb262cac9109b28d7c0f320f2f334c9052d84f96437dcc2e41fab0993277bc66962044541e7b5efd289762b34ad4e399fb62c68c1284ce0ead8bad15418d4910938796f6518e99efdb4c12e456d5f31eecdd841a9120e5e1bc8f52bc4743823c0eb7a0d152cafdfec550e311f8d0c7e3f881e651c311e4e1e5a43dd278a937741a41ce3d1efbc6876a129d98508311e43cacdc9f347c49a8b108f2d8ddc77f67c33ed5a408724ce907bd49f28286950872cce3cec3fe9135104188bff7778d3dd639adc621c8b7997f74ebd16e79ae610862678cb9d62d6f59b66b1482649747ae977b3c6a1082fc692e7cce103eb8ba0741fce15d18f34c6b088224f7e9b747a31a81208f26acf7524e6df13728811a80208fc7034f1f73ab68f47f2045a5e8396fccd5f003d135fcb8c664cdc3af35fa40f661e8e581eba53c29d5e003692d6ae6610ad526ebe931d4d8839652d2b6c150430fa4d3d60af328e99c7b1ec8175a3aac7db09cdeec420d3c9063646a35b4d557ec8ce1a4851a7720dd677f0f36a5fc6e8b1d08de7b296f878e293d531dc81b2d899ae7ac061d8872797c29552ed8054b8d3910f3567cdc7bdbe3e07e0d3990ae2bf3f87cb4661d2e55a81107a2c71c239d2b343be70107a2450f32ab5c452fca2bd47803295ef0419cc798877a3b156ab881fca943ce2dd666f4f151a8d106d28e6b6c1e44a95fa8c10642f99474ddef5ff8516b200f2f43c5f0c3907ef50935d4405cb33cb458af4903317fa6ebd1d7d8a68f820652dae861fd503635ce40100dcd11d579e0f75a0d339053cef859a3767f1834652025f1618cdd75cfb1c93ad4200329f6fca7d7a46f51cb1a03f1ce65bc4ebe738faa1a62208864d6597526841a612059ce0793d04edef1d5000339c5ac717757430f3e58e30b64a99847ffdad6f002f9f2284da9018658360952fc0be91e8f5436452609f230585d88fd4482547df9a3989722bd870439d487131efcc287318f20a6f44fe9b22f2a174710264cdfc71e2f8f2f6f04d187716ea422834bcd08c2ce061fb5e6cf19ee2288f967ef9f26bed2aa08c2e7b01ae4c207fa0313414c4944d5a5f507222282985391a79a51babe4390f3bf627c9c7d53aaca1004bf934b3d531582b86751eee62db6868a10a4cb4a316ac37996cf2008a399467d328220cc6e8f62064be99d409045fd63da685a3a0b20c8391d6befef3f10936bb25cf1f981947ae4791883db07f2f83b55c3e50379e3af58cc21d77bf5443e4a58f440f00f8fc99c83849e79200f35768f7e3d33aa880782c7e960d57721fbdd8198c34fcb69ecca1c3b90f3388f5a79faf1ca5607527b676bf6cff9c2559c5cea90d99903c1fb7d6cfb192a6588b49003612edee5e7de1fe6b3681107a2547ab9f9caaa1bfe2eb674bc09768471ecca1a0ea42d9f58dfa459af2c262dde401ef8a5b3d7706ae106f2b887c9c7438d1bfef325b30dc438e3e3f0b962bcfad01db46003597374e7c7d1b9e3470960ade07678a1438c31b0b45803318facffc71abe166a20a61caaf1d44b630a3fd24068f96af5bad01653d040728d1e7d7be93390d2f969e6d1545a98813c1e8af4a8f34285b129a0451988239b69da429eacbe263041185f9081e463f71e074fb93110a6479dc962fce0444b2c3190d7233b59da4ffae947175b675eec2003c340f6b5f7d90e69693b060662d2944abfaf3bedd9185f2046e98ef47be95146ec0552cccf12a1167681a03d7ddeba52f93d1068c105b25b8f5266cbb7403ae98e52a5be96473db440fe14522b6db806a988045a64811c3f307f0b1763f2f328f38016587834a2b17eb0b99a9a362daec09cb5ab7d46dc6c988d5eea3e59f5e9fd61b4b002295a73e5971e5f000e40408c1448c0050c18630ccf408e1c39a4a04515c8315d2c9dde78d629c3022da8408ed1de0e6909afb7bbd842dd2990ed3ba85d7eb9c58abad8622990eec7a3b4ed695a14c8a3fbd016755a0b680105d2990f5c42f30fac457e02b134debf6abecccdf12eb6b434a085134879d463b3fad9f93c32bbd8c27b68d104d26c7a893c53f5da942eb6b032a00513c8e1afe246fb71c7983e38a0c51288da9d339a7b8d664e8ea10462dc54a85ef5dcab314920b6b959fa581ffd27ff8016482077c836f5718c1fa0c511083fccd9ad53454620e9271f4d3fd1a208848dd0307d251381f8837c5d0faee9801643206bc81e9e7cf2d1ece74220f5cfb78b8aa5e74c09012d82404cb6911b7d2a108839b77b32b45f9431c66be08b2fbca0408e1c5afce00186172c00638c327608400b1f34a99e9e292a566dae59a5bb1a44756c2aa58b6580163d2047bf2df78acb5fa276b19502e50139e6a1c7f3d135cb1f3ce8bd03b29e8b5cfe8928bf3931a0850ec829e3cf7aacbe6e3532c098801639206c88c5b5a560e947ebd0a166c6f022051886173ac48880163820b8f63063760ade805c5227d6b731d98da5850d889d271d3cec7ece030f4a408b1a90e2b53c48a754f0cbd18206c4ccbcea7799664194fa9c721f25ed20e39005f9a287a4c45470c4829462671f6b282ff5d78b73b0caf8c23d2081073c200563380b72e4305890c22f2a79deffd4fc385e41c8fea91ffa60cc871ebb827749156df16e59efb668bd4df5d988edd18af2771ee70ea63dda9215ad9cd6a9dbcdbde47cb48fbdce2a48b11e7d4226a30a829dc7fc507e31f94d3852410c6e23e1b53f0f70a0821c4c2ce7d8f571f3f3b05310abb23a7cc6d6ed64e13005793574a7d6a51e06cba314a40c7e123ea26e27d3250e529053cad339ceca5ce841cca8011ca320de59d6c7f768bd634441d23cb2f03c08d1ce7b8582bc61d3e2059de82c220e50981ddb5631626ab116bbb69a7367fa031c9f20ce4fa6fc3f0c3dfec508c38c71f5001c9e20a6bf8b1ec5f2f09375db099225cfadefbae9284e10d407193a67a9a6b8dd268872379947e11c630c36000e4d90b463b61adbf874ea23470e1d9c635c26c8e3f8a311fdf17bcee30b26c83df27cdbdae14b10d3f6f02c5e2fbdd468098284bf7dfd48e3357795b046c366b6b552c2dda35ad443741e9f1284b7eac1649e1f5e1e665e84e1014d018e4910b3846b580ea9f55bb100872412f10fd5171b1c91207c7e65c9f48338fd2c24881e69d93efe0f77ab7b04d1838fadf6e2c5fc147304a9ea07fd15dd6d046933bed34df744f7cf08727d7fd2f30a8de531bf8306381641b2f851ce1b51d96b7be8a8c72f0e4510b3a5dd987bec8e32c8f0d5513ec6c37cce00472208e5f2b1c7b29f41730811a4e896d94962b358e5380e41b4241f34e8860d41dad91ef940a6db87d3168274712a4235c45df5303808516c887dbc5cd9d75859774e9b7d3a8a5a0a2f01c72008395f953215f53f353bca70c031107008821832d3558c4932c2f862033972e8282e1c8120de7df661fcfa419bfc3800411ece878639cd6c1a1f8e3ff01e7cb7e647fae3fc80894c657894c7bb6d287bf7b1a76d18471f08f17a5ad64945a3453972e4c89123878ef51d65f8e2e003b136e6a98fc7993de0121f1923db211b595a6ac9b2a3a5bc3f4c0fa4fe64d6831cb78bad1578f13807345b355e00471ec892b956dcc7232501071ec8953ac5783f1fe7202f8e3b902bc98fc7079647de9683c30ec4541b73da7a8b775fe3a80379a4791c3d7ffe30d6331c7420c8c9584a9ad258ff287320e47a92e81832a6efb81cf24a119f5d358c03d1531e9dad6d4a316e0a1c08d2799ff2c7e3b08bdf1bb4f796330dab89edfe1065ee973be5e138dc404c6fb3f17d1caa5e934dc0d106d27e5946a88f827bb21f609411c61a2a171b4873977ae4e371b8e9e6e4c8a1a3ae70ac81d4bb933de89012973b6a20c9696ca8ad283d80230dc489dc98ed473490075a193ddd65a9ce401ef4a847fe66ef425ebad83a61bc8e1d615499811061a9e6c37f07e6c05106f28fd43ef8d042a3db82ef62070e3290a4c7a3a8cc1cede133ed058e31905c43e8d5864f97428f2b307088815029cae4f9b87afc68d6807fb1811c391efe3bbac0110652beb0142ed6c55cf2708081347e165f69f12f64ed165ea211ae35d755f1d63a0e2f9087953e3eb7183bc6fb8cb1c33360f50feb0229f430c60e9baa47fe55185ee0e00269373c5b204ee8599a7069b73869c17a4949a90338b240921ee58fd35dc779293f405820c50e6beb316e8f4e2ec47105d205350f4d8dcd8b3e7058811433f3d8936d3ef9a165f5c05105624c365bd757213cf628f01450250e2a183571a731a6e536f76a9a631ad9395780630aa41f756ca850bb4280430a84ba1ce536aa3fb4f4c1110542c5fa5454b37140815872a9f5c3feb06e185e98e178027918971e1937a694f732021c4e20858af99f87d7b5bfaa0e1c4d20688cce77dd23f76198190713484956fe522a362ab3811d6488816309c4ff0e3eb00d6de936b7830c317028819091fe43950d061e0c0c7000471288217ec93bea42162f10021d15c08104f278fc033f911fab66f77400c711c871f724dab234023946c6d82e15e228021dfac7a92af62602b9bc2a7f3aafa495c63104e20f35f328a5a3fe38c72104f2505cab3f0ffee3e9cf388260f098f9076f3fb48c2f7e8718cb388040b2bfaebc3deee8a183050f86160370fc803cac6c1fc7d0e3bb20c333805d90e162a00bc830c4e10334b32bd66e252e43352d8afb289fed0751990ccf408e1c5d90e1628481a307e4ec69fd3ef6ece371965b0c1c3c20b555caede6ead6f45eec80986b73f6d83ea896993a20c7944ad263793f7a640e08e71fa56e638789ed7040d6782be72db71edf2a44018e1b9037af99b90fef3b010e1b1036c54fce66f58b30c2285fe0a801393275764235ed9406070d889f3963f251786fcc82f4b292a3a9ee2a26fb862c8e329b69f352330ff13abd14158d14bf18db11c60372e448c18e304e8e1c3eb8110ba24f68f7a065f47d24df8005615b34fce8737684a1038c1dbfb5e3c1e057907cb8be6b3e14d1d5cf1524b1943d53856c4564ad206a6a77d6d37079b0176378c135c6175e90514622e0062b88ee9d63cae389ce3b6005375641bafff21f4bcd3bfe5441eada641bef72375241f24f7b3a95ba662a0f549077a7ab2a5849aae614e4ec51fa6ad3e0a9a9320531d8fe28374aa19b649d49c8d6785bf7a0cdc7c163a58b3bda0d521043061f4545e885197f14045fd16e8fd79f21be28c8631f77b556eed1a120aad89f8bea65ca5041410e8dedc1b5d64f90ffdd524aeedf9eedea62d713e4d823e21addd3adb54e9043975e5ecd3fb139dde00429bb5bd38546cff2a36c8214633e6bd4bfc1d0045953fac18f5cededa27e231304eb5099fe7914233776a35a75adcdff918f4b10339f55bea46143f2b70439c614da3c9c0ff305b71245d46ddab7975b77ad540f7df4630dd779a7a604e9f262866bde7302372641181d0d7fd9ef6ad6bf210952ece81836742cad8faba3b22241368f694d4a76eb7f50086e40e276abae756d1771af77abb8abe918ad2fd2479072f861d00f3fdc1144bb0e5a979d9223c7b9e14623883fbe9cb6b0594690d24c93798c1ec6f87c6311e4d1d460e6eedf5004d94222e2338ef7cd8f1b89208519db941e6b6ceeef0622c8977ed429e73c4c9d1e872067a6ecdd1e4755851f86205b871f87ea515b084267ca1d77232404f92ea69dea6c96e73e064150d7f6a1b7e51e550f1704daa2f21e6ed3ad66f6173ae5d7cb3d812074858f4f4376c4af8696700310844a29d463b8876633f10937fe40c850775d7731633287c20d3f90528aefc3eadce957a32bb03e106e2bf8303c6a7c2068c6f656ef3e5d8d970637f640aacd73c993d8d77ef5801b7a208f8f47055f78d145039ab0d0571ea9e5a05d814eb9942b39c9b2a97acd1fffc26b4ad9372b5c39c5cd97b5b762efe0a20a6ab5a4454b96b9aa4b45868ff3a38f373f57e4820ae4e8db90b9b6f2002ea6404c3e4e6935e4fb0779a540bc19ebeb41ee20e0220a64f5af0e691f3767cf81c2b12629d9eeed71b19217abe6e255ccc51308d569791d3dd4cfb9e4c209c470318e87be938b26946df2b5e996eede59719d5b172d9359f041ef5c30c1d49d7edb43ac25e06209e5f80b779e21ba01174a20b96ff07185fc73e4c89143471838e0220924ed1e07bdcb951ee4c80512c89ed3624a0f7b24e23b174720d9f59d56b694fa2fcc8511c89fef4f3ea79c2e2f068d8b4088cde1e1629f7e7ecf02ae015c1081dce15efff3f0a5477a2e86a05ca9d78bcab89de5d77c52cb93192e8440d058fa837dab4fdb7f47183ab8ae2ec0059bc729323c53f8c07030c07031c6d031c69be0f13a8e3f9d27b80082511da3e2699e628851c60f889f5f611d0f30bc386662b88003056800173e20e5dcf88b3e776e5972d103d26bfcc05793e6d83996082e7840f8ff3caef00c173b2057fef140738a9dae6e73a1035246cfdec6fdec71ec6570910382688ca9476e3fbee8c1e7020704adf2d7edbcb9b801f946bbf230dcc5d81f37011736200fbbe57353ce99927e0dc86556e9c7597e704103b2a55999a8d2c890a92d6671f9783c1e8b885afd78fc175bc8a28ab7f5cc2a11ad3bcffccb9da9be9297b7452c48656231a58ff6610f43b0388fc295c792cf4c0c5bbc822c153d743853ed4e5ba7610b5790cc0762be3f4c1d5a652bc8c9c7d1339715802181316cc10a62b67f6cfc4e796f1c0c2f4a0ac23056ab2075fe285f69f5a0b25c0c0e5ba882a8e97fb12296328f3ca9207de8b1f9308ffd3aa76b07c991c377fc16a8206e3e8deb31bf176c710a52c8ad9baecb182f96a620680791fbbbfcd53fac14e4d4f38e596aad9f551b6c410a425a071dfd097b991e5f94f1080361b0c5288857e7ab55d53635b5282a472888299365ccaf99ed20438c2d4041d0f861a818635c53b35c068a608b4f10d5f3c7d7f971223ce80992065faf13c47026e76515718298111ffe2defd2c3cc169b20ff4a4bbb4ec60b992d43055f5e860a086982a097924554e6e4e3ae63b0452648df837993b28cf7f14f5b6082a8e9e73598ba89f9580df42548799ca52e64757a8eef16962027fbfeb99aff3c3cd1b6a80429acfb30c4a728ae67a304b6a004b1c4433f7efe51d4b04c82d096c7e31fc5edb1872d254128fd28715dc12d224190dc743978b0982cc32d204112ab50e5a145206cf108f230e5611addf89939ea168e20d7664a27755537e96dd10882f8561693a9fd71ec2e0c5b3082a49771c5ce53cac3b4590429670ef53edc1fb39c2248666b3daecc3ecc636d8b4490349fdfce97670b4410defc34f538050d339d43103386f5503c74b41cb521c8b943f89f8fdb2d0a41caf959a9e3e5ac94b72d0841ac142f95cff641906a3bc6bc9ec57a34b12008f3a1c37c3c5cb708846a51251a73163ec7eacef7d11680207c9f86f04b3955f20fc4982ea1da83d91c743f90d38b8679e5e1fce47d2059cfe64f75e7d9663e90479bfd2ffa677abc7b20c514d66d22d50329733bfde353ca21cd03e1f2770e9f72070f241f766ed3cf3dbaf3ce1d089d69fadeeae46277ec40da9fa83c2a4f1d4821bc370f2e4786eee940dacc7931bac7c3d079cc81947359fb707c9807992207428d8f45d75b938ff38f03799452e61f5c0d07b2f7607c46f524777d032957920a73bf917eba819847e3be949c5cfcda406ab78e73971f2d78cf06f2e6c568d62333f561bf06d266f30cb359e252bd1ac83e0e1e4d457f186bfa349087b92da1ef3ed88c1e0de4d7313fef5859b97386d3b66f6975cc40d45a59d5d5eb99bf0c44b1d3e8bb7cd5e33cc840683fbbcd31de663ec6404af7d1d33c0e3e4e31622079d4868aedc240d2f9147af439eb540e06c2ff28e5a19c2697ca1788f3df99e287e97cb617c811abb2f539f2c4ee023163aeebc8c505f2c6241aedc739b3b75b20c6907db933a905f2f8c795acbda5939e5920ccebfac057d5653c2c905b3adad786d58cdd15487d793afcc03f5d570f2b907f947c9cda4769a3871e5520b407b7ec331544a607154a59c45e2a8f3305a267d74a55f3a6f99102d13a77f97810bddb9e28a8dfb6e9a1030582e496e69bf8c4f64f20f8c02f5df5a8626e9d40fe1fdd4d7898072e1735f4600239ba0f43329fe9af6509a494cfd53cfa9440de0f9ac7bd5f1f3a4f02692a6e8f6791408cdb3f4ac13336bf7904d2e6d9b0f659c7dd3202b13fc47670ab08a48ad59643b32de5c8108154674143646708a4bc1e5234fc4220ea48fb67fa78a4ef0781e441af3e2d4020c6f879dd3be739f51f106b3d985aca398ce63e2056f264791c2dd8c6bb0784b058152b45b6dae6012986acd11fcdde23ef801c3cae776387a51cd501f936868f6fbf6167cd01516b3e8f43e6c8ff8983d7d2451f1f9f3720c8851fbbe5616c77b16c610382854f2671f153ee61658b1a10243ea84e678c1963650b1a902c7ad01026eec34c9905494e93d7c94ca5b9c882e89aa1eec6df7cf25890ae73ce6d16b9911a16a4ea4e8bfff115e4f89ad28f55e357fc5c41d84c29858ef6a8d1f356e4316b389b4ab1821443c3874b692653e4ab20fb60e2877ea171e957057963b0a031e7910af238e554eb372a88317692492da71e1fa720afa7ab203d2cf5e8610a627a1ee5e17c8fe75c978298d3a27a476fdd3093823cfcc1b7854d9907568e82b4fe63cda52956c75014c48a37cd3e5e28c85a496e5372bbb81e2888ffe36495befb04413de3d39de7615d3c411e64c6764c35e6f14e10ed7bfa637cf1fca839410a1b1f33c46713c45d971f555813a4b2f471dfc9953813c41e8d686ff5402ff79820e6e8d96ed62532f7b80461734af1e36d2c41faf4fff79fa90429ff789c3de7d15ee70b2508f222f5b7d1e42c3e09527af6eca16d5e695d12448f399d79ae2341b6791f7986dd3fad21418a9eb5e41a3a43cc8f20eb8bf82865eb08e2b58591e8f7a8691b41cee1769bd3f25e5746104c35268fdb64f9d54510d536d4674a7b16464510d7a4475749adfac5449073f2fa514dc88820554c71c6f5920fcee343903d6dca1a4732fa756c08d2468fdb3707938c1b17826c17e55b39c486d2981084f4e89cead1fa402c1e04d17f5ec3560c3b5bb120c89efc55a2250e04597b53d8f20cdaeb03827c2978dd6afc9cbeff03c9c7c1ccd673268d3ffc405a911f4d1ac34ffde803f1e5ea637fb0758fe10379a02f9e3ba79bcc9b3d10f3b62c594a0df38d1e88b9935fba596d8c66f340941e7f8a678e88de8b07c29d0589def01d8879a2fc623fa6fe69079245573bcb61db471d48b1de3eb955fca8071d08e599e6f52f5e8f3990722fc7c88fe36a5c0e24531f47adb294c7731c489f477f5821265a453810f3f8c703cbe14cbcc71bc8956254db64d943353790efd3424fe6d175b6da40ec98e39e553fb66103395459f8c1c6b46dd1ae81f47db9625d68aa1e470da44a0d3b1d6fcb2c0d8ff240a3b2557fd8bcf9e30ca40857cfac1b1bb5310329059f294df58cb59481a4f3fd038ffd71ba0a19b2908a8f816891bb566ebf297431903ad60f7a942ff9833c0c641f5f4ed9136b5f59c140ce5176dd077df6b9ea1708aeb2d69b64325e552f10362d7d6431abb7a9da05f2b8ff8c7e568d29a95c20da89a779cc4c994eb740ea49ed7bab540b04890ca139c6b95748b340c82c73295636cbf78105d2e40fe7626327d9942b1073451fa5f2ed71658a158812abf147f7f9d3ea5520a73c8befefe1b2d95420e4e8d94b4474e57a0ae4cd6ef29e950259f2f79266578be98c02d953ddabe9e6b80b428178dbe3f1502a7f1c36e613cca318de62a5d009c4f051bb3949a7f8964d20e730177f95bc1f5dc9045267e58c9dec9346cf12887e29eff129811cf34f53fd7893c7ac63ad692c0f35482049fce02be484f7384720a61fe60f161723906aa335fedb4520fb259b08848cbc92acd4aeb28740ea114b3f8ee619550b8160a571d9d773d29e8340728d3b157fd81a6e0602395c0f4a3ff503d2df8c64e5983e8ad60704ab9adfbd8f7e7d0f483deeacd5a5f280a89747797e7cee803ccc3bbdaf2012400784cb7253499fb21091003920cd854e6ff1f2fb7848001c106f3bbca774c107d321016e60ec81f4d0520f23800d88a2fd3e36f951e7b021016a409e9ab1986a5d735f48001a90b32735e6a1f5d83a84b320fa20a2b7c7e30e7d1f5910ed538633edc482b43eb098ca3ec46d1e16c4d0e9f0bc5163ae98579066bd93c6dd15c44f5154255e33eade0a728ffa52fccdd7d69c15e46c3f27357a29457b15e47198290d92bba5b52ac831661ef43078d8773415a438d3f0d2e371a8540f15e458b22b623eb2a2de2988ad49a4bd93a62077bcc8d8e09b3d3eaf14e4c145767ed9780fcd2305c9c38bdb56ea417f78a32067d7b476387111ed4441d6a0deb9599bdcff50107b2ea7e81bd5f7634041ca64fe1ab6f20952f6db541f16ec87ba27489d3e886cf8485bf44e105f2ffedaad4ee69b13446bcfca435f374194c9b1cc3dda1f79aa0992ea554be5b09e8765268851348f433efaa50c62823c8a95152d638bb678099269b56db4cd2c4116f3f1f87cbc49e36a5609a2feff7824221ee6995182144f3ec307d2098d9aa8542ec5c2d148241409c441712814089e301f931308001838200bc562b160441286791400035a2a1e3436241e24241018141a128984e16018140685c2403018100a0803819040f896083d3fdc3bf8dffb8480378b1dd1d7614c1076c6920f927bb3c798c778e376955f365202c99c28b5524207da1f73814b014b2be95b1a98e594f71186de9e6707db6d5e20d2e2ad5dea4a1117ab962c94c6bfaa98c1b7a4def1bded74c16e72997c43bf5bb47fb83262beb324ee42e28d606d6ee8ddbd1146f9dbd050d847a023c58fa69dd7a645efbcd524a4977f38ee06f1b8618802766c2f9d1bda5adf70784e0bb90dddaaaa4592c1021eca9668ddfe2a914e865f49b39639a675b52efb295137353264cdafccb6cece4e10c6cf659f9f964f6fb6764e0cc534549306cb493f1000e85184ab7456133412dc9b259a61de2af41f69e036706f245c71bb446847cb57b12ab9f0b9c457537d51a29f9dee22bfa77a395f6b5c25382a6fb3a2c87638c0687e9e06994e3ace6d25175951794a97c43fcc84cb33f761160a2e2b1be594bfe76298ad091a7a5f652acdce98abbab4a7a81535b6f26b788dd46425925ae941a6422bf1e195d2f4ac5c7f8a64b210d8db39f373cc2a7caf55b8f2b1de10611bbd0f6327a797cf194fff17d5f3ba9a2446ccf95c71bab83a68264b355d6e1fe44abe94de96fb20f4dc9c8e7e86bc045c93f2008e07bb5bdc491b5957f0180a04ddfff73555d8c669505810791a3f4db52c0e4cfea286ad40751d7f22f8f40e8bb133e9f8a116859f476aa0138217550db93ef53a12138c43f761bfa384eab1b53a74851ee276bc1ebbdfac6f384fd9c592e90ba89042c73e1c162c0cea14c56d63408749602522d39e6d33b8722ccd8eb3808a643eaa64ffa1c5f979dcd4d7ac42a2d941530ef49efd019407a5e8d08ec325f4abfa579ed28546dfe49e7cbd1d530cdca26be0c8a7a7ead10576a0e2fe834ef9c3c56c5537d28f6868394feb8dc7bc78af94fe15088918b866389266f299210359507623ee600ca5dde9f22e31fed866e625bd1ea334867714e5c8e7c257e0f9818d79c4be017d2d157f95a13b335484183103829c61ff8b5ceef86bbfb68cc374f534642245ee2c46dec4184c009d02a6f98d9ef65a8f568e18af8f5dcc7b650d816c21723fe62e27bf44c9dde6f01d60d8283bbfd6267a12b3d75461583c3f4f9b2229c8ee3b45e46518de002e74c63d58731dffb0b679245d834c3ae5ad73f3d520df8df45b56e1d257d6e437905f628c4119e22157358e9b8581d90dd69a8701bb17c6561378b52aaaa90f5b5afe501a2afe475d6dee971dcf3e48270ef26d850b40762ba10759b1fb22dcc6c5bfeda94d38542da0c0e1a86aa5cdb4236822641a86857f15f8b2f47c5388970f14482e343364af7ba4a78e098b61017413cc0d65f8749bbc0a9e4b32f06e9d926ce545821cd43ff7111eb0621e450b88aa95afe493c6bb538efbcc3cabfc5c03141b15acb72a2fc233499d241125f0abcfd9be6f39f7871193fcdea7c15ade95169aa295014413ca59792d8f062f12866cb9fdaecbb07ca4dadc3001939223330c3aaa856ffd5577aaa602944c563ba377a1b8f8376f526446254444c5960867b63c493362d621bfd567e629a833c32bb8e737cbca9d456e932cf2161be2bbe9ede83b81b90e39e1e7fbfaac9b6a53d5843571b61f0a9c896bfcb0731919172b919b5747c5da7bb94709ccaf459edbbe4dee4b5717298b2a08798438acff20e56c7ba74f302fb246931fdf1aac9012337919fa799182e923017334f004555ae73c4a0ed5a57d48aeca5379064efce97d917e86dc4018e2244e85287f464ee4e9f361fbff40309c43b652080b6edcae3ac3b77ca529e6959eb1af8c5e811c235719fb24bfb247e49a3c01bc88c5a732b61fdfda47dfb52df66dc07117a58094b043297c11f7d1c5b16b0061a6842bfe53ae320780a2fba0021aa609a7ec09397d3eec7f12c5847628af095e2b494329d67618aefe41bf569f6c1efd1e05bbf7133065133595210d5252954c18ec859b8bfbf93e3f2feb51bd324edfa4905089852173e8147ba0731ab445320edd8252a64c8b90f0af7133450325a8a9444579705c7cb98fbae06bc41d8deba27b7fccafab27c8056e42ddb7ec07e805bf5ee3a05ea443562447ca543b8019da00880094a7d7e5785e9d67e194ff3ec4258302052ff7695af5ebe385f879801b431255aa7c9167e116019c521aa41c5f185ca5f2360a62bb9f5306c879f7f8ccd6086fce9c672d7971b14fce2b7a146dd8e8d78eb5a4ec56d45121809ba1e470ca1d40d7320aa7c8099223d5504cd7e0982a7f1e55a802c67ffa15bd1b36ded0e683bf12d782b7e33873df84ce31be6e9f9373792a664a155bf4ffc42853ac21511a55a45475f204f03ee2127c562617ef621f093fb3d6442333ff605c8d17fd2daf99092cf23d4e8384492d24f474755c92aecfdf891378fecfdff53eccafdd93723a4f822929611b40b28ed388129386dd821abf478c782aba2972566ba0ce9c22784b88514c3142eaa70060118e700af9dd0653184633425aa0b7f56c98fccc77d015962bfe79a8e4334c755c14a170b540e26e3801692296d69003d1ebeb0a4556a1284fa787c008c795588b70cce9f4f278f6beac0343215472336a84da9d664ff7502835aa1130f2b739b11bb6682b7f9992f0a97dc08d9b6407c22b64d6418ab951182d87e575724b781d96274014fbd61546a2e739caa8391b1c694d9da68b3b14863a487cacbe8112e1cc9cee4ca0e4cd2c48beb3f3b986f69984e6f24e1b7719522e9a951f2c5740b4165b14876bfbc82298ee5775065209285c04d19f31b9069738630b1160bb4e2783ccfcf04c500407dc281e36531dcd308dbc6da69beb5e70d398fb05d8e0060bf2b1e643d2d1f4841339f9c50e05bad1ccbc505edf02b2cbb99360f83b827bc504a4df2c50ba0569667471168ce5599afa65e1591408be4f536656cd6074df5239be32f868e0df1ba61382fabc3c27ae0b8073408b95e37c1c19f4d9c4914821b7dc078a5f94a3db299fc5fbcd086b7a66000558b914560fcf6d3dd45aa66071f70bd58eed43a11daede9fa7eb6474464d77311991877547861101ab4f7ffa299d92ed62ed99a438e29bd29d40cdcec921ddd0e37613b35026b1fa7195f1564697938ea9e1f661744d57308b6eaf44b7bbb3864936ec26511eb56b8f8ff0cb0911f6ee72d12c693a60b2ec570319f027b48874cd78610ad12a34c0e2962d9b2710a6d1bfc19ab8231fe3c169439d030e1edd7e40235d4542c60d6b8e2a4b64837657fb5f6af52fe6d2fa32e87d2a20a13ad2418904021e118a6257f69b5105890759b67b0520b438481a3d8c1784897b49187c8acb8104adc980c3772193a6d109e53c1ff8c20d9131eaadceb6d55dbd06e49df6d47eb354576a42de6e3f84224bfb0ab62ba88d896817909038da8aca5321e475ea3467d4d3920bee6be2e5ba97322046910dbdac3cac0ab1ae779f3d0a79ef04e6d84f29a9783838eac0d241112441cbb1de567ef9385723fa3a08b7a2e2dfad854e401b8dae14628f23b709ed47740c42d7cec87eafc7514396a78e48d2a3dffdcdf7f23c7cae7fc81650aaf5fd0733423a5270c0aa8d8594b089b94b024c66b0491c0db038858503ac1c7778160d2790c4fe5f5a2233ec0dc7f4f5bf31431f668894530efcc60eba97396698b402191d6663f289e0385d2fa864df14277e0154fee9b783d0e5f8e47ad6ad01541a498a14b3b9b1b46065609da28bc581199a068a47198e2be633152da36581a4897558314798d849a150206e88efd5f8c70581f3ec3f9e407aead4072cb79ba4160174cd0f1fa56b041e244da15d81e06fbcf217cbb8027370a0ffb553a18eb3e881ce031c6ff559207363617d67aecb06d802e50bd6cf69efb2b0d1f35d0d37b3a7923458d9fdd8b7b0b16328af456656814be419136c92245179f7f6aa8c951258d4ee2a3e1473314c0d818583f426df39b414c47dd0252d4b333719c2b98b58fd0dd425dd111e1bf495deb7fa53607244ca619a3f353ea31faf4d691343792f9cb46193bbd668e8d631c98b746b4630e0403b0e6dbb83232f29712ab9b7fce7d35885f32d86886eb0207cc84dbe34517cd9121ddc3807c1a8d4eb206acc94d91bab3acc6415c1325ae841190f2e6a7d27637061f736c298cd2ca75181ba75e78fd03db9e1102fe20fec1c6a6159f074cdb198802b7e4326883cf6d34f9f24589a6284aff5927a48b7d344316a9a199da30819c84df622e9e611087e9785372da65ddf9d332210068901d9150a64c33f5f2acb1bbb27122ebe918ee732e3603d4d46cc5a5c30ac04333c6ec0df0e45d24f9a45bd326b19b91e74c7de46a7b0a02be6aae8c78708098e1f60519058c7528796c78a93f224b28ab1400ac2e8e6f65a88e576162433dd2311df7eeebe21c95bfab17edf66f16bb41e2148646e908b2a98a9cb0ac17f27ff7da60b6a58c6ce1a889bad6ec4cd4d57ebcb7d9bfbb4f56018c6ae4c80475292a82c3cc1255ba789adf9c520edbc04031f2a975a7778e8dc03f9ead09d1e4054903bff52af36c6e026a869ef04f5e00b4c00e26de70bec024ba2cab051c378eb345dded8591cc96455cb657c6d357dc90d626789ed778e34228e7af48c1023b591aa822836b136ca958266aef64275c6230047c67bb30ac2b7151a35ff934c72d04ee949216902188cfb455f98d631ff0961ba1a45a1f6dd3cf5777b35e46e13fa571e2cea6b57f5451cb7a0312bc1bcdfc483b5759402c74cbb57799a460c5d916a4f077b32a45d4c6d4c23920ac73c3dba1aa5a5f20a4dbc2d93f6f78b66bf62ec3cad44484f4bf7c167d979f7c73918bb1a0b53cfab51e5105a11e8821e16a438c99b83a996e3e88cacc5fd4bf18b6e4a13399888cbec931f1406c0af3bb4efc6e42d5077df362a11c2a7ec4c164e33e436634a8b19094c2897412f7c8554ff3d74fb5321cf975ff96511e808574b0f1db7948ea899cefd07766b31976d7f1a7b4408ebd2498176a1933177196566933217623602fd704a09b227a0994c6511b97f861c26b24856642c4d1ae32f753ff845994a364849bf47fca87ad893852daa23881ede0b10b8db1b8e3a8b700e90b14c7a1c6a6273cb0053a5052d2cc7884fba579d520db2ce14b7731b9fed7502a37ac7eff6cbe92937e46ef84f9d3e42d422a3174e09901fe4491fd13ef1f8028d9a1fca93ba780aff0578e8f90f4e16e2028d2489bf8ac91d989fb2302c3b7d802a802a85e277d4959a844563e1514eb9dc1d5b8148e7a3b4add4ce72fed429f839969a7ec3a6de36596de3542bd8d319b0048336ebcdc4b96870fe499fb07a6f8ce79aa9df5c223eb1ceed533b5490fcadf949a4eb55b79eb90537e672896115b757f89c0df5ae24e02cb1eac32b2d6f4efdf106ef67d67bb9b1f5ca49257448d5b35429d83e9b71ed6278d2c0104c85c55a1daeac71463fc012d798e3114f9f4fa8bf71c17b281f9c1f63817c9d6da53382142f43625f509b183f449e607529f279b8524df39340759d05c327957fc23ab98129eb2494811f79a61126890c3a7f0d46dd2558678f1861ee5c89f0647eee42c3d3257c4eccc1e03f7ae3c719b1a541d406f0c8235a9d6b46042cae4223c3feae2ca000c2ae2e03aaaf2b6b7da9a9e043e4f1373af8cb72878e4d6019240c22ca6ae9ae42e5120d422ad0aadb6d17b066bf036b0b6ad544da0d3b95c964663cabd29cf0012afcc0c10e2f786c115bfe734734140151ab336dd782fec169854a91dd1eae54e11bd6194599153b73b6be0eca9d1aaf66e484441c804ae7badfc0ee96c0de13553fc000d9c066e63a35636c5122277046670d105dc65136111ddd015658af5790d3786fcf832d81e3a18d74dcc3dfc6b11094d8f4b10fd11cc7674445900035a4fba594abd1406cd79f11839362f18e015da130e1793feeed3e61c3451db05b20d1951ac1072d78a11626d1fa073a74d02b85c831a2efc0b994cdfbad1b5ef4238668b2328472030106f0dd394ed1d4f7ee7e263b17deeeb982018554cdb58d21d54ee3c46eee344b6f474c6c82f2adb5f2253e13038896016b10841bafb5ab164cdc39b5590e36246326636f6675d33b9bbc633e21b5761f53319f90d1ee3b30c0f189eb9a5cb8484afde520a05a4ab604a2a68f7cda3900d43f85670550a211518c4f08d1b2e61d200e63bab03f251a4111b1a4ea4d11264222ee5431ee0030a6ea3e4dbde9e025d5367aafbcae48cf7314d7e0f80fb378dda69cc63322f32790d05e83df64e9cf859e420b6e68004754ed76364b0485b44841e1a0399e0d38788577ab9a806d43096fa54de9ddc6d183d1f8378ac598681484ad4c716dd2896171eedc2e7477ca32f8ee30bcfc01a6af70177e12b218f9cc38ba31aa3fc7f38efb174af72fe0cc9ed3c33b5aa7fefbfad726ce8a5c1e23362b95174081a3ddf74e13c55e1d72fd86e1320a6f87ecbdec29350fdc59ec2a069f2d1ba88f2988557990b8619360e7cf47d729d603aa5b6225c466828c804b63ee8c3bf347407d9ec7e75c972ca44903644dc086235dcdb49b44b4111179a548a0302a4f46b61e65b6675879779c6a3770047b8356354095be3c9ef1678143a8b9ba43fd02ba6cba93d85d2776652e09bf66c7884039c5729e5d716858a8aa3c190a1f5e9d9c75befabb889b4e342024e9caee94828c32370042c7112acca2116d8c3c672ce55618db81c50b2ffaa89fcf422c75d2dd3ff0531f6237e1caff2c8f82418195274d0d4534c5249eab857a809ad263e917788d4018d6176fb94c44ee87002f9d05514fb1549d9275dbbdf16f2404565a1080cf2831e35ba495e555a969b64f7fd1a0448408ed40a4ae135d983c14aa8ab8ee40f3d7a8b20c453f035d11db925262a151f04c57196b75d84448880bb31c755284f5ca3c1fde4d347f80ef8f68042e140936be9da80d6f4758fa4a3d7e732b90a543b0e4eef3e19fb8a295e009079aec589ee43b2232e26793795e8cc3545da9c7d1f8a0dfe26972078c8b98456187173fdda1d8eafd6656df87a2f838d3b875951c8871c33dfedcdbe1c2df8227049a056f5890fe62560dc1444d827d354e23a24c60a369a2824ecb9a5b503b0336685c5c6a99b86d86cc59304f2b3a37e6d5ca8c50c22421cc5e062412fa321c0fdcf8993f9eb4e7d2e8fa80e84b9040522240a4c084d57423c061d20e675e8d8e26fdd64ac18eab85df121da8a7fb2ceb3672a7db2bccbc91440608cc29b04ae5fad5960a5d454e8c83e92a841aa271a8a80f8a09d4d92fa86978a49839ed232a99f15dfcfe969453ce54acf76db9039b2deb4ffb7e8084fd9351012c227ccde2a91715349974d7cf195c153d94104f88a85ea3c8529010db5493c4548238d85186c2cad10fe3662fa9410bc33ce8f86b2b570763701cd04a0b96922b6073928e543511eac0d09f109e2b722073c00fa8db62271db0c4a16d241c334a8c0056d1e750834a2f59fc8194a85f089247bba652335daf4ad0badaa5feb0c3e2cbb4b3d46126468c18e87a486e350f35a454af7c05c087f57ac9a4f5941239f2bfd5df5829f381981305d1f0faff1df7e3d232b694622e1c2dbc8ceceada7d9504bd0adc68cdf186511aeffc8efdc125ee945c94a4916d8947815750523a21abd33f6b4fbbca24cf27f324721012ec3a21cbca2673e96c5e84f025d08fa8f7b782d71bad90a24705de68653232e2e01397537d83bb39df5354aaac6e59a9c32db4e7f2ca525deea9b736adb32028aa57038a6cae72d0fa38fae0096ef58d10d39c995b254362fa7152aa8312138a3703d923c97d8ad64b8b3eaa1315d2c79f4ac0486d07fdb523b8cce88af28a949f9e993988f149b147f8488b80b5e69650de96d4894902b3deaa333a77eca68e24a87d9e86ed5afec9219aa61d65581d61f9e1d35f4e8c98aaa7db16253ea4d2e7d88f86900563f0f40780e7ded512a2bd5cffc2e51740856a0d1ec7a17921ce2d6cf057e36e5d7f45d1735de4f7c15c7900e194ef8ce4279f61511c0ed20d6ed5174570242a3c3114548e1c0a4db227ef4f0473d2c4f5f88a0a5b46cdd3f0968866ebe5d2e2c0d7c276cd248a71521dc4ec7c207b946fdf0353710ca712136d2078847671501668ae6385c9efeb7b39558fc0bab9f5462ea44d55d557eab4bbe87a2e72ad50d4adfd6f44cde8b40dbe24711faae93cfe69381054bae528ae8f073cc54a9f678493770ce83875325d26b4cd11a28dcc6d16581a64e1a9231c913deba892d1297f0ab099520917b2162ab5ce3d29c94ec6c62bd92b6d19c6a89347cf1b22983f011bcf1912b387255122387fba2e6565550d47f82de4ac7c2881d992a99fdbf99a0a6e98721b7282f026d169e237ac23b0273eea2d9e4597d7247a26066de027f419f483fc056a258767d63f76c49dcc879af66007b3b83a3a098dddee189c13646a1027941660e26c7d0495c04ee2e6a7e3a5bba463e8e0bcd3718238276abad9ae8adb614d7d136ae16f4061d971ae213e21c07f2c7a9354c0549df34fe8c403c5325297c2c1e394cb7d83cf3df59ce3feb22b1a884a6f4b564913e818a9f5126072d943a97ef6a38980aa937227f1e81b03c50b0c79c6026ab53c14ae30f0f3af1b0e89ad294db8c712dfc5b01753229ccbd362004f9e6b72320a8b3594a54f511a14c2a3f5bb0c3615baaf57184ac8f2ed8838ee073f6059719cc4a38c1e9949d28d4f2b907a35f1e4d1d98e3222d499078d6b680e3bab244731b4d814cf09c246ba32a56ad98924ee837e2968d23900830e08455099bab9121302aacb7879d531dadbde465dd0bbc9007fc3880bdc492c3679a118c2e55617b6d2e82bdf31ca28db83dd48280e587bd45fe0f1b9406b6d9594cb16ab3f1e185444c649908605b6aadd81ac08daba5134dba13e0a26f92243ea5279f33c97d2e11c30a7a292b88ca2e90a0f7c49871abc43132218ee52442b1e1e4e79c99c35f545b5f57c5532848dc86ca028a5c965ef89fb76687e86f187f7b399e0a9864b66f5531806d19c84eafb0c19f076bd68685c58391e129270977acf7788ad09c26d1eef68bbebab3065d8c80433d0f4d26186dbc0223a9c1d27abcc516324dff97b4052838331f77fd947ee8f1914fa90768cf780a98b1bc330b4de3d39bfcb83ab2c7737734d851cb052ad1d146cf24f41ba832bec69ba89fb3c16f1d049ff06333ab18e04e3de87de58e1f0444af961f9b8f1fc6e7e60cf079265ab5f64624a5f4dee9fad26e6c9de63fcbabffa95dd4117408525372ff8c4027eb78097e598ffa0289829234d4a035730c46ba1b232de52a0e2e41f60bffe91018d5175d6d2e15c1bea8cf286fd58ddc107d11712345341b1917957a235af1fa771f2cb44800d39df859e8545cd620cebde30a37697812d4667732e36b35ad54c71c91dacc3b42a618e30525a27dd2f4789d25092a91bd5fc03f38098ada9ffc76a28e666bfd032bc9c271aa687d821695cc35e43c68dc64c7ac7f075f68167ae76c37b6dc5bb46d1021ae3a4809fe505dd7f2fd78b7a242bf9605ad738bde3dd72f81b2b1b849a6c694d6a6b0e76215af486911d601cc24b3e9a986f8ee1c625470f22297388e3ef4fb8e5d3bbde14f0310af47f527f07486d7207f341b2968dcdf9fee5e433e520afa74033bd854d3d5fedc906e260cc1e5045126192a108afe89cf5799ca490ee2872ca4b599dc7be0a0eb21e1baa66eb4bfe64e92c2f7b92e83bec61446822ba3513cb7e882a90c2c66776d630cfcc538a2a788178be90d6582df6cde091d5b59bd573f03493d9779f7434f77e602c75482cfb3d4653885f6c2c67f2a7df63b5c494b4893c6efd7fdf0675114eed2a4994440f2f62d00749b4f31295ee17e38f23cde8f512a14a618bd6791f743fc542821851391ad20b39bd996006474ce78f7e7bde178fa1dcd937f65ca2b15e211943b7d09f034bf1db5469e8bd4321903ba8ed8fe2581af7fc62c82a8bf8539d39a73082c8e897c12bf2a85a5a096c93c32f039e2190f6e7894aa6bd007b154023a94507fee0309226f8d21a044b666f1121c7de1a0eb4b6327f49f983921c9d038a3a516efe6f3ec8f7e726af4fab1127dd257a52ef6ad7fa840f105f4fb7e6e6b7f1f5acdf3402a4d98fbef584b674f6e9bcd211c7d7cf5ec3dc80312666351fa566ec6549ad6df9151e056ce5df55d8080d371d370e5bc9422c5baa8333de3a810c25173399b3c407634830ee3be2c27fdb751197daeebc445ebe90008a0118b6a40515b5249275da6574fd30005958fcbf783befbff77568b78210e7aa01f50b01f766a52e6604f55ddfbed1b3a0f64051c60152319c45f98b909dc5a961d1c225a4bb24a3d716c85423cf6865f5a45920e992ac5bbf4747a9d35d5ed2a133d1359d8ac0ecf9d1f150e0ab0c357c4f49c4d7c49373d04dda4165a3f6348e519dd47fab0eaa5290a7833bba420aba5c64a95fdc2abf50bfaa89e7541530a5515cfbd8a1819474f7f92b66686258290a409e612c120e725e8c6ed39762ff3e4d0bd4f1487708ec4682fa9a7db08c74e1830ba1efebd7604defcc14e5fd45901f29c267b495893a4618282a81a4c09037e55a15f25018fe8fba50a28752fe57db7a32dcabe08caae315db34f89350f4a149dde6fc9d8ccd52f8e837a1c3ced10f415b6932dfc35001ee8db836bd1caeae6c497abc0285fcd85c43d0dc3b9648256b96cc649e8f44b9c754e9961dd10944dbbdcef24ac0ab2a5e2d79ed1c5eab13bb0176175e217b15e395865795bc5af07ac64b2a2ff9bc6a21afc52756e4959a17ebfc751c8d338034fbd7b1575f7c30c0378bc7fbbe298864c926c401255e82e1ba615df7b36e9c654af30d4401c21a9f6ff9818058112db094fe1ec2bd3006ac737d2fa586666df20beb7c7d04d587e21c9464844af945f5a1789652834a1644e9604bc9ea00f50c145109050ca6a26d551028e083d91b1f23eade04816b2f83a8b2a412836a35a280b897ce7794a7ee9ffa3f850ed5a240d166511f8bff41610fd53d147fa88a0e14edca7cf25b34285aa07282c20eaa2e4501e120406c207c8a662ade278a9fda7cd2f149fb27ef9ffc3f15fa043da889094c4fbd4e828579abdcac65a2425aceefc10f0feecf594bc25d82435f794d1d74f1cac1a902fa8c4381dbe63dcd7bd31034c68c429ec707269743819779eaad6e64c0fdd57a458fc92aa98910b01ffa9d276dcad889e0163a9a4dd594afb849c6050a010606793538b4c56fbcba0d57dea5f18b50504df5e53e7123a307e7bb0074d3024931513f229afa88ca14b69504eb8c9764b389c5da9e27697fe03c7cd3cde704fe4e697030880571b4df925237e31a824285b048af45d1e254a7a570ca803e884f9386a08351eda0c3d05fb83cbf65801accd66d9482ede3e033c0b42bac8c1b989c03814a1d3fb132ebc31e3de2dcb861b9a1c241268dfdeaa2c403dc38548ef9c463bab6ff13de84a08a89966a67aa6810408fcab5997dff264c23ae6c253ff008f5ea418416258aea646cb3efb0f1769e284219da08f92cabb708cbf5848eee795a2c202312bc79520888bbc18307cd25f00f85e7ab1a4c99272036e06e7b638d32d1918e7fc5e759704511e604f938e22a4eac32668830d613673be08451681e7795986b2467ca4b8463192b09494926cf7b0892051ee23103f4ad234ea22ad2c297811f347fa9fbba1df41d5c0897ae699eecbc842268597923bff0841a7d835ec51bab45e7eca69409c5bba0506dd555c19c5db7bb891f0722c211ece968207cf3ac8cabce1e54e373c66a43b04184f0fc7e3ea0a374d0b4d6a9c1c465f0dba2d4dbdbc06b583056c953ba05f0882dd7e319c42616220c3b771efe31407f22fce860926080f2a78d770834346ebd2a5a18acbd99f0829b903b3b45df30504bf3fc0788a59810e80d06d590febaa7993ebb527d2b31d192a28028cbbb5ea07808b126459e4c9c041aec71718924c0630a56e25305474ab3383b51fb5638b85a093de653904e1c468a31140d88578b78a55bd9a322a6be1e7225b33f7acda8a84fd7358a0c91fbae63050396649731d600b59b260f268518ab3102cb551a1822212771156b4ba2822d364849e0cd8294445da897877c353fc51ab50f81fcacc3a0d3548cd6601cf05cf70d59393762401617721ffc41e3f272316d22e46f81d1e35e8d94aa4d851f63643e265070aef06e80ce3b61a0e7cf9ef2371466588311582d6682391cadca362d7060d261a377842188527491291efe9ec1076b8128cada07ee48868363f63b60ae108576c34442efc52a3ea7f99bbb76eb173a02ada3fa16170e6baeb5d102bc5e020e22cbe3a130a42b917b84db6945c4731d8fd9573c3b97ab5284c1e7c0979495c7e1d855810494782637076ffb453d30523d8b262624bee38181286073b4eeb49ad0d58314b4194df07df9c702ec096ca84391ddf50866508741443196e1f52b0a8e27eca4b17128c8b0206e0f753fed16848cf10e1cbdd487be62f15e54878053cd2a294fa7ea23da307ab2804ef88b85ccba95d9461b24b38d037b4be380017bbcc5557bfcb629eca5f6d83604640f6eab91539a60d62c237893f092b124849cf3362dbc5f8225c4f213f1230ef3805c1a5d5d0379e0349a45c4917a73572c15037944c3bc399ee1c8560c8fd503996656716ae780e0914de1584115524fd2b65782ea42332f6b0426bbe3605c5db8dcf3bca85282bbc1de2541cd1c535791361b8c430ca8d738a512603c9ff6f0a26cea0885d9b2ec536e0987db0f0edff20f37f12c78a158581cb680fa32b328597a26306d9a180d42f0d6749d87dfb75131db56a077d5b81243121ee7bc1cfc3c9000a949ba44a1b1a3ae1b42e5e0f5fe47fdb05e3cd703aa4ac18b8c93b91c3d2a60fe47a979b16f246122d52283bc922551bb0cc13b1dcec1a20c3ff665e17030a5af107e7ce1ec00452a30c2135b0ad3904995e448a27956fcdca0376684b4212122ad2d21c40547a2356d9e0f8620e8c67ddf8513999f6182869cb56041978872c7d6898542264ca796053fbb1bac57da9979b636dae81d4d370ead84bb11ac5a2a477b9fe7358fcc1d59171c35b2e5a9271a495fc61696554962004a11cd9bdce69c413f78bf6fc7b0762e42071cb374e616cc79c97986b45e81a95b88e58c39b85eeb920970822710cbe369a77fda7c1cb95f4ce236b9cbafe6ceb18c054e5ef9baf87cc947a964f76d92256cc30b269312c8f627f731d64fd8273d3b1a95a3382c6a856f62d8115263add0b42b1ce3c638391f0915e42b476f39f5cae1e7243bd40bfc23365205a2ce2d29187426f0fb737662be0a7261a69cc7f4ee543b5dad61f2c69dfe29df8477accb13b95567bfd30041485ea98591f55a855c77acf392a1d2ac7683be203af3851fcec7c05d47dd88dd78b0643d10bef40c49d1e40e82534e7a2150ecaab146889214b8cc0ff50f9e0f144ea3e8f41146327e9d11338eef12bf6074d777e33c068b0d821c6b077c8d77084b1418253fe9c5445312147d873a244c32f961a9c7a2448868f98e631579040ef5cc90fb6778c142e12f2a1e85c38c83205a3a2fb3970a4a7c54ae3ade662023e5ecacb0e919a980ba9b260ccb53b08ab60e2ae51bfc1c10129cb8390777fa927a321900c87f1291f6f4ee048be846426e84ffee9bd4c5b6d1f903c6e5d2ae1c193385b69d1594a38d9b2dbebec6179e0289f5393fae88c79fe437d6014d0d26cccff3fd1d7926986a4c247663de0761a12a3f87024143aa41ddf2e93e3bc0a4ebc34fa3b8557c5da2019f8e56c394155a019ffd6fb2a297590e6c2de041ae00dd610e2c295cb9206596849cba59e4ffe31c0bad472c894d7aa2e0d964f8e385b5b120d7a764a6bde9a6af1f37fde9775e401b20814b2d69ae30f907c29ea02529a8306b8dbf1aea6bd79f791325375bfe36374c55f141a1b62478857a8ccb948b407299acaa38b4c41bf3295e1025064b2643f13c8ac2f5a631b328e5fe46a2ead6bb40df6efec5270b78b461b14c8da546a7bacce25be23335a9ab30aaca5eaf11e4939f9dc9926d76aac34be26b9a549c6ab0c8c2cb7754300f8ed39c200917748c440e2e0d5975af23c3e368b7af760b9d325d562d91327fcbe1fa213ccb7d6f738db539fece53b4c3fcb4172db504a8720fb9226fe15225a4f53b7ad8b4e7db936866ce93dc3f023f20371e74c74721a570012a76ca653650ae26e9cfcff033fc0c3fc3cff033b00dc2f7fcf63fef1f3b255936e6761d4a9c9b649229a594349d6cc01ae92a518070699ad96902110632063206e8a8df773663cd7f074a2134cc590c3cde703439d1bd4e2bb496bc871b4ef62749bb977c4db53978b4419bef8fd7fd930dc7decba4d2cb99b6e5d9630d871f0d67de15e3a18683a6b7a45cee9d81471a4ec2780962e3eb5b2f083dd07090d7a92649625f6d726864f038c3d94b96eb11af994f30790e12c48881a346f230c3694b95d89cf1ab84914719703b25e4650a327ba345071e6470e46f6c93de4e76788ce1184c3229eba7a2a99811c3713ef3977597b4f187e1b449e764b92c49b866c1502915ce74693ec964fdc2d9a46adbf4ebda68591a1e5e38f9da9b496ac394a89c47178e1b4e30213faf964db8860717f8cc3196645cb34d533398b85027d7edb185a39fb68a6c13939ad1c22996d2d512d7c4799a85b3de69559714ed259960e120c4767ef5945ce12832ce7c540a266dfe56389e283e325deeab704c4af69331c8f1d32454388dac97d61c279d964ce194154799a04a96fc2e8563bcac105fd393778fc2b1f56ac4f78fa58fa07014978b19cbf29c89fa13ce5f67d2c5d3169662ee84a3578bcac52871a279138ea1a4f813355b6192890907e9a2b4f55c6909c7bf349b371b21464909a7934bd782e9ae5752128e7a2679a620249c548a3471eb949c5b1fe1a004cbe0a22e6d84830c35267dbb568493a04a45c813fafd4c887098d3e12b32e58d500ee134329849169460620be1242b4db60d96959b0bc2d9a26d97a6501d25209c3d4cd8f40a2d2f0dfde0e83abaf144d4e24a3c7c7012c636b3ba3faef25e9c64dad31283e64beef2e2242541254b9b239420ddc54964d2b12e0e5fa6c49015e5e2985d83b4b618aa840e1727d9d2ac28b1424db6cc2dce656bd1d425a91b94d8e2acf3953cec7e2fe9b538f895f8a1ccad448ba3d86997f6ba8fb967714ab57982b26d657192a4b02b57d9c6e29826cae42b65720513581c946a7d97db9265a977495a1cad6bbae224c65fef5392f012bdd28ab36d9828abb12bea841507f9b8af507731bfafe29474f55cbe8b163c551ca368cd1d5a59b4965271ceabf45fbe79948a50710a4b267b6b49903b4f711e5d3569e29b7f766a8a934aad763156f68df9521cfbdc548c0acd1a6f529c6be36f4ccf5e74cd288eb15db284b59c6a9614c5f9c3622e6136ff8c341427cf1793f4a5337934509c2d26656342e3ed55f889837a93434c9c9e38c528fb5633eac449ccefdf94a7e7fc729c38a78595e6f80d16d6dbc449d59728d3f45b539e268e6ea2d564bd9889f3f56acca52b7ea8ea30719273a3f2d4252555c9250e6229fd55e6b168bf254eb14d2c21574f492a5e89d377d5c9341a4a9cd3ae33bf44757f651227b954d42471cc1a774f30db344b2d12076569bde47d8a9e689038ee9cb79dcc3de29464c75458d2923f33479c4daadb93a562b14d1a71de9f8d966f348d1a31e2f8a164122f4f9ed1f0228ea6762a946b65d18d228eee71b1d6e28893c5441c94ace86942dfce34449cb4f4892bf237995e05e310273bb143c45b28434708971dc0304442f7869dedd05acf582b844936e3625c8a0b8fad0c2b1563180d06210e3e3af3953449c59c248c419cbe749c5ca92c99c6de24018620ce1bf6e5629693dbdc610462af9331a97e2be9372c80018872e4c91042ef6a753976e040018c3fa8494bac2aa7b556564aaf926f4568550b0f861fce5b2629214d0cea018c3e1cd305d1fef9101f9651b5b2d4f6ca666e594b4ce2b48eb987735849ed19e787a18783df9d788df6397ad330f270aad821635dfa11769615e0c0c349869755a9d5a9d0228c3b9c7c339512b24dceda0cc30ea72fe182ca345e1d8ee9b4629bf20b1d8c162e6626512db1ce20effdb171eb42b9fd3f8783d41c9d173e4c3c49d20d6e6820468c1bdcc891430ea72c6abbf154ff4b19051871388c189927f496e0704c7b256e4931fd86f3cc99e4a6bd59de24dd70aaf78b69c3b1b4090d3ba1574d746c30261311f1b294abc2abe4e4a5cb5af1f5326b38d589dfa2c44d42e6b960a8e170b359e3db4a30d270ca4c61c3c5ec5fa7250c349c945d9d10f35f991b867186d3c64b4d796242e425d101c30cc75496d74eae71c65a829e86e18051862d97c746cd189b3494d63869b38961fa92030c321ce35e2c67b43171ac1ac369358634d9d69772ff3490f13970d4dd486c78c003cbc6b50bea0f409c820aa2622f579296d38f3f1c2bc923bf72fcc3cf67217cf8e1183b949c58924c7d21f7e124297917d1a5e6c349871c2d4998bf2e710ffadee54dd1b27f7a38ab6a4ad157f904bdec471e0e223a2bbb45ce1e7ce0e118834a6295f4f4ebffe30e6715d1694a2a4b3b615a207cd8e1144a26d5a4be44fb8a7dd4e194c9d3ee67641264d60bc2071d4ed962da132785cdcef4c71c8e5e272fbb3567840f39f071a2a9e9e695bcdab382b6d65e13e4de861f71b0180587d36ba90d8b23fb78c3d1d3d47b7d849d20946e38e9930493fc46491b0e9ba44da222f36c38695026b85826d1fcf51ace224dc5f484b3379151c3299f246a122da9a808b1051f693899f60d42f484f6bb24349cfef2c9af98dfca323ec3316826f1131a2d663848ab8ecd5fede625e8a30ca669ae0a964ad3b4ada48deaca07190e328810df27e68f311c35ac6fccde202dbffc218683d457d3cc76b9330f83c5b804c3d904db1eada27fe124f466c9f687178e6ea6c404eb0a27fba90b073d7b5e61a6529baa3fb8704c31e35a4ac7d7e4928f2d9c62496e4ad84a62503f7f68e10e8b15dce562d0ced8e5e1e0230b27293447beabc9a6ce040bc7efcaa16de76f42eb57389e92644997fe46ab3f2b9c35c5047542ee3546598593bcb07262bbf74185c368123406933e97335bc3c7144e4ad37aceba4ef49748e1746d92a59d3545e1743195ae3cf985c2c933dc06fbdba4d7d28f271c84922449dc985e0c1f4e38c898a4a4aaa81343ef2a7c34e1181773c4985a0cbba50f26e4c712f6071f4a386919bdda96622dbeb3c047124ec9a46f09e2e652aea075e003090793fceae40425bc9f78dfa0310319364266ec08b9c1114cb2c15243c6bbb2a9b55df69758a6ff0c1d5fe058239c35a7b926b9ff4b8ade8c3519f8818f229ce428e174976c2705798268c8d8114203878e321d4c84e3c69790a6458f369d3f86705c17ef754b267e08e17c72c656d355927c72e923082725e9cb70b5bc64823e8080122e854d7d9ea224c2c70f0e9b32496295f651f6f3171f3e3849b3b7aa4b772f8e9a66f4d586b36ee0c18bf3283bed3771a476571ebb0882872e30462e1017874a4a6f52fab25dce78dcc2d024acf5dfa9dfa0331eb6b018b5b018478b93c75f9c8bfeaaab9b199bb33044be32e533ca55b5bbc5503a73c4a9cb431607258edca8788232c1e4c3589c74e5c6bccc26581c64895362ff6cce6432f78a937029ebe6c4902a67523678b8e294643651474fac4b52da8a34633ed1fc79b0e2185b1a2b8c652ef058857ad2c8b62062831eaa4853996546b1d02315c7d12074e6fc85eb3931a838df683b41da788ac3baa8f72c25f4f47da6389698bbba5e64ee4a713cbbb698a2aa4656c991e2d41b2ec79fba68f7f26e14077dd972b9ec668d5772278ad39f98aa67e8192f2d14a75493ae366fdecaffdd81e2649bb12d5a8506b3f13e71106ec265dc147aa554779e3849e23325f1ebbb63fabb4e1ce424ad7e72ae058dff71e26c82a78bf092cb6f43779b386950971637efa18953d093448b964abe5159c9c4292ea3c5093ac4c3c4c162ae92b1fb7497384957c2f867bfffdf7d9638b856b86bd829e9b9c1abc42996c5c9a725d6fbec78943887da8a6abf9a2a29cb794ce29c266ca7fd326cdcb0214347885a5d093c2471b88b1f4a526e2978ad1789534c7a275c839a89f51d240e4a491d3afcccf4db8bf7886f6b941cf51a94e788638ea814175f83759daeb847235095974fc50b31ea63c4d9a41c7a7e6b6ab4c92fc2121db2aed3d3c4f1157112dcb43e84acfc6692127130f5253208a5f716c543c45994f07aef25e610550ca6d172c865caa19943c958e14ade919b214eb25f3eb18fb15349ac10079384c96e505af98207210e17946c2bf2821293707b0c0269328aaf5fefd9050f411c6d4f5968953fd92499409cae3293e68d8e7faa1e8038aeff99f6dad259929cb3e0f187539f9874d60966a6645bfc705e112a06515277bb8face0d187534cf2e8d3795149c5e9c187838ca1524e634c3df6703ad9b812269378e8e12476ca6cc9115b265e6478e4e194fe827f8a2e8d5f490f3c9cc71dce9b4fb45f2d5f34b876388f3a9c64cf897b17378e3e4b03c7070f3a1c5352d1f3820c7bcce194641dd127a27ae37df490c3493dfe84cd0a190f78c4e124a7d7c26748cf0c5f060d64a6c3030ea74b3ad612114d5c260e13164346e41287b9186dc454bc1b53472c71f8ac502a6497384193229538451dfb3069c1ed4d2294884ce22053dbd6871a452461314a1089838a68aa9598311148588c47588c1ca80411471cb4726494dda6110719d3ac9af8907e23150025228c38a6cfedcd6ac6d034892ce230a3ff36c92b1b4afc238ac033cc8565d3168d150b5a1b4eda6e5d791049c43955e3ab4997f2ebed88388cf0cbd8279b5bb658c944e4102779dd67f304552bf61ae214e47987eabf184b2b91429cacc7df35af28a1e28910c70cc22df9eb6d89fb06718a316dc4e56efd4a0be2b0493cb1224ca574b21509c4499624572c650b4a8e13409ca27505132fa3d549d2c81f8e9d229732890c722ffbe13033ca6437e1a4c6fe46a40f67cbe921a39b341f4ea152542a49532589ece17c924ce14c4f87799bf470d228a6e234c8913c9c2e09e5fb3d7aefc7040f2731f14d34c952913b609aadb343b5b22c5c56ed70ca5825ed472f7538062dc14c859acb39a1c33147358a92c5391c4e9850797262440e270bd17dd1d3a3c4a823c6e15c323a33ac058763aca85d9b2925ca2411df70d05c52963fe9c45d5311dd70dc5ccddb4d6a99826d386ca86a8acd777a4e8cb0e124e442eac92a665df22944d6708abf92b4a5927693d40ed570bcb85757e2dbedc64fc3419558ada8ab092177349c6a6c84bae7cfe799ce700c26dac450316d866312d3dd2da7455f539132588c926470f38790ddae203206319c20120630e017225e38896749ccea49bb60342d99cdd4326b19aedd2c7e5e5e4a594f63225c387ea9f5896bca4db20b26912d9ca48b4109d26aa3c7a55a3866dd2c13adeef4c61366e1544ae725a5e726d48d8553579013735ebe4a51bcc229e82df3add60011b1c2318692e315b382e99a316260a40aa7de9326f68a3ed14b898510a1c2512c3545ef5245d58d91291cac42ecbb645e911091c249f7f5a9369d7da6718c44e12409424f29ad29d65e1781c2e992b8ed3379476485651421f28493ffc9d8705192573263c44083224e38c7a9dfb5f355156f310891269c7b556ef36610baefa1469870bc185bb77c336cf64b0a91259ce45a3b49a6d3d223f58b28e1185432b1e26b92144b393442240907b3f46f49457b9369d6420409074d57f2759eec8cb53541e408cc488b79be971911239cfd4a90d39ab1e5e50822454026d9d2b3a462ea678408c6552c77b335a5191c22433826b9bdf4fb6b1b1f82af814660be8808e18b48102e0284f37e48bb0dea2fd6c617f9c149b86c628b78932bc652c407b76c98930f4d954bac5b5eb73f7a7150c2050bb55bb7126378715c51416e58261d77e21e3e767196b7a83f96f75d2d881fba38c9ec33a52f9f204e9df8918be36f2ebb58d9dd60273642d08c94a6820f5c9cf7c49b2fd33ee14c4a7ddc02992d2955fcec69e0a811a2c38ce0c31607a1f74b9b0c26d8ade573e038147cd4e22cfa4a65c92ce1a20cb78164cc483b500d5dc1072d8e17b7b4649fec85533f6671781f8ba1f46978c6211fb2b8e294757b5d95626131ca072cce23329bb8e4b64156828f577cb8023f5aa1770613ed8c62950f569cba33b7ffbf8ab35ccc9c90dd93a7e4aa38be897e2ae6afe46b522a4e92e978493a6afd320815c76ff9926b7f7286864f71eeb5b1b63d298f5c6c8a8365e94bea2449259131a538988dd2215e4b9b4a0d290eba24a9ba2eedbc85cb28ce16e236b687298a936f58e8b812e227ba501cc36d7a5ef6cc2364509ca498f54a189d2bdfd4270e327c5d8a8f2ccfdb3d71d0e3633a279e96a9e6a31347dfff4c0bdf95e4783f38614c566aaee1d5434df674ba5d1f9b38a5e6536be2946dfdc28c3413e793653426a1946dc935260e9a76222ead0453499738baf89b2e3953d6d792071f9638a978a31575468ec7ef361e051f9538881227aae6af786ab7267c50e2182757d23bbbaa82e56312673d2b59ae94f887240ee2465f6f36e5cb4c23713a619e6bf716426dea03121f8f38a879893e31e89d3271c4b1ed94f78fd2d7ad498d38ee58bcb6da3393c266c449760b564264aead4adf224e27444fca7935677aa488d3b9cace2825f5918893dc6341683b2949310621e22093e558cb54f626080f71909d2f57c24f269d9e218ea937a6429c828a2f374a9c10a7375b73eb12eb4cc643f818c4c9f794aaf8a3b913c4f1bd2edf9218a3862a05e254f289320a11c092409904f0ea3c4a4909021e150337863920edd0f1458e020400072d01050440478e4f5ff88d1c381250011d2138900202b005000400000000c000244081056400003a74740c020800ed401ea30001403b90dfc811e30000184003127003870c1a24b443870c190b004000187080c3975882d5c95f688e433871ca617ea3626d219b385fbc2ef9b45fd20e436000a289834aca2e64de352b00c9c479cc4c883275a25c7e1e72031937727c0eca3a709838983079d352de845ce21cda26fa26f1379b128658e26031af63971fe7bd8754e2a05f7776654f438f8a1267178d5df162ea4a00328993a0b4ee775645838e326ed028434924a8be74ce580b991189c39b1c2773ce6a534e67acdda0711ed8c01790389af86c17a13b32678f38f708bd21f4b454b8e68b1a218e388eaa9ebc1d4233d668ccd0216306364270b800a411279f9defd3277dc86d860e1934500a99c10d1a662324460c1046e0a8b1889358a344cd0bd76b2ae274d6e29b24cd24b3a966acb10d42fc8bdc61232411c724b26d945252de782522929517664eeb3bc461af74ba86958b973733d6b6c6d730c431768cde147c76cf52e36b2848213064870d429c10090019c4e955a4da262554dea09463860e1a82389d1cedec0da154e56fc61a6b200e2fba474f0aa3d484cc8c3543e38b1a0888b7c18d1a35bec60140fe80213bfc468d2f64c84800881f708023f50165c84000081f1a25c5a42ee9a533d69c7d7156e373c8b04188cbf090f43874b0edb011823a6c84ecc8b1207bd8f13a6a7c0d0380e8014376d098a103c9909100903c1c93b28ca25577a5064a108207a84102040f684a4d6f8b555163062dff5af1cb972461a3207738e5e93841083fd92284300062877389da77429650d7d6c8005287d3f5a9bc951b42367c1b884609de6f8cc0bcdfb09108428753c62097b2bb994d5c41e6908aa8866acc56592b650a0e10399c54de4c73668bba246b6880c4e16473d9cbd449226a35d681e3868c3210389c4a53b0ffb98a19179037e86e5dc9e233a55c3963447449d5511604e286b3c811956bb60569c3416d4c5946530a990477c61a0d74e80310369c049917b62e49a36432d26c80ace168a6fcbc444bbd248b1a8e2996df2add9a90a1a403d1b0349cc44a9a2fbf60d725050736081a0e16cac752c916f97ecf584b6f030639c3c93c2d99b4564a52da790e128098e124e48e0a3aaec15ffa15a001a40c674d3129952e9dc9797a1bc8d04186d39f4a1d624b775a6d3903640c074d8bdfefea0688188e49ba2caa7e441a021286c3959d24c99d8d392f08738080e174adaaf94f8ad476807ce198c48fff26bddfd831821831cc40bc5040baa0205c308666b08aaa9a29a5b8dd368e71d4481c00d9c2c9fd3537ac47338068e12c2236a9b2586aacccc241acea4cc6909939c3c2d9db339b55953c04902b20881510a40a074285f3c927b65ed53c8552ac2de62da7a6c568991d8048e11894863341a31eb0e1811cbfc3033f831c2f02bc1cbf23e40520513859dc7658e5be94c3af0008144e42a3daecd5a5a5993ce1142f7576359d9f986c271c3e4f2bc72f9e702a37e17872bd64baa076ba3b261ccbe44fcacb6d092741c925eb7e089db1b9196ba70510251c4dc8a815266ac94926130049c2498987d8ff2db16f924090700a9a4c8ca7736d172e1fb223c7e3c801c8110e6ea3b26165fadd82ff1c8811a3868cff04c408c7d896ad7498e4f88447e002193a0029c25947fb57500b9d257950002182dafb23b24af211a61a204328bb9b56fa295100220490202ca66519642ccd459750d9a54e2b4613198000e130a652e3f34f69b6fc0707516729d357ff4365101f1cc44c2beb89b6a05e8af4e2acf35b4163366da62a115e182b5959556ab1768d9a4a6813756ebbc44a12d9c5a7b97354183525c67591a6940f954f7c4f915c1c7575356aa8888bc359ed499964ea16e7b43649a78b2c95e4d41607d54a61ba527c4b76d5e2ac9a4f5027ba49df8268714c79cb5e4f2df99b91599ce3efe4b7d87b268b83924d44cddc26794e38128b76dfc3cac4adf0c1a296b72c3296b9b2585967ce9a553a5d9716465e710a3256f8a6b799aba8191322ae38a6aeb74d82106219cc569c4d5a1295c48f93eec6244458716a8bd992cc264ce3b6c82a8e9535cebea464e965a9e2fc9a4e9b5cb5793536426ae00522a93889a17194ce32296bc4196bfd850eeb40041525a57adb9de264a527294d722999521e8288298e5da19b232765de126e20528ac365d2fdd3b8cd585b0d44487192f6c3d751401019852996d4a6ca1222a28884e240a1914f64c413e71211a797d29c1de944a9f1daaeb1269e56d539fabafdf6196b344029881143c70d229c3856c9ba8b7e258f327f13c756f3912629f90801871ea833d75196a3288ac12808622086d2b5747313502088441c0b0603f238cf75f103134001ca22c17020108c83a180401c8a610cc4301002310cc2200803518851b0836a3dd9adf0a04fc5096d9ee3b92ca713a4ab03cad2658f18bc9f56a00a7b9b08e52d2f40002e5dacc10a3d5b8be140edf780822a76605c439525de350163c0259c5175384c1468453863f464b6973fcb2a464fe4c8baa0184e4f10e86681975b552e0a154eae782dfcd1eaa476926329a78be5a80efc6798b71b401868448348c9565b10cd8c885ea5daf45b059df4d1457c8adfa498d05f60d427e38669a5cb664e12a3efe2342edcfa533e0c54e52e22e91c67755a01de834de37abb108ad4df4e284437f5a2bda27c8ae4816277b638ed4811a844eccfb0e5b82ba58c504c030d07d156d6de20285d92dbf26cbb0ce8a77defbefb94e959100effaa8a486a41795af3aa22159933bc7cf0699451082da286ea666b526c0168ec7b28322319a80e7b4ac8ad62bb957ce02f45139584d023299a5de7ac38bf329c1ca2a4c895cb0dae543e23f94e9623dce88234bce1a7dd938e28513ce3089a9b82a8590893e1f2ec161858b3858e7d300bbfa5970826db00dc56e93072c11d722c32fdddda96154f24c95b720cc1ad2df1d121cbc0ec2a2ec34d156af1dc3ea4f234c52fefc8d4788115310ba1f1980d5d7b2cf03b46256049167b812ac061b98845c771834eaa586b9fb597f828101c322dd9626acb68229f03cd18d1abefddab2b719fe48de722b281cbd3182dc556d7288a48d23ff9730c04a0339b47fb7749ed3f9306760f78119a2016c6927ae4a5f0b3f65cd4d555ea31a445210699c48855bea200e12d54b7d64915ba91810739af10323d348bbdc0d0a2ce11c07fcb6f604b135234cdacdaad20e916ff1abba0223e845530c1b705d11fefe0334c5df6340873eeb2de735801db7f9292438e574e206135a8248f6ad987acae279299f500b449ce537f4334e4ce3e6443fabe9bb40c62ff6ea9ec5120423244ea55800055e90f003860493bedcbcf3550a33a5d08be9a5f8f213c836c72497fac052a218d578b2fa0972097b5ec6408dc846c5d087d17565492ab031d33e359fe90d0cfe990253a8f6e11f0150d229cf1162ca739e814e2289ef09ec35814a028855fc640a18d08f166807e690e6d3ee499d73640668f9627c286bfc37ef8fb601fe8f438324360dd917530e225340beb729f1157fc83ca6891bb1e560353cf76926ed4f21c26f8812057c31d69e6b197450f32ac3e3f0c7fcab37e90860fca061e4ecb3738bd2ca7ea2e8b3a03d0e6919d716185618a7e5d53ddf4fa6bb36bf1b62db23a2918583dacce5b10ae3315c1d8ec4538f42bc1286aef02bf30e86f7db846d11b203dea22f1c6d998ccca4a50125aa89e390b6066b19929d7e8a1824fc3cf3ea6a8aba515bf83babeebd30d423b351d0c7e7e136d1104d4a789b4fbb9ea1e025686ca8d170db7c88a9e2d104fd0205fe76052dffd1adc0456b32869b2116cbcef56e5ac70b899d78b46e07661830df978949ca2ffa21b8f09517c1c4ff3ad9d9067021003527ac9eafbbce05eb2344a7ae3599b60c9424bf55a6ca86791f07f48fe51ae2a16ffc2c46e7f99b8ba90811609aae6eb91fa8d5e35f8dc65613524c95487caf3bc76c602d798ac66469ee8a6e50312e7cd7da07014053507dc481678acad02906015e1c08e4aa2e1f70c9c180a520374df7d11cf9c55a7cebdc9257f7e2222dbf779a920a416296466e238e611fa6709d7b308ff53f31072abff7d25debe6075ca8d8c7958425f189e3d65aa9eae3c0598bd5decc3a6199b0f9baed3962e49c538ceb40d75892e1c01e17c2d1eb5c6826dfc69db31285a73c4f60ae5e5ce48b0aca4c69ff514913364507a218a08506509a783dd30c730e3898162de29de54f003e565728c7dfb6a2bccdb969b50e40a63df1ea432aa4d6b27629c45bbfe7a9a1346f1dc95ef79925488d33b2802059022fa73b6c89f0c66c8d3f3621466bf30817f08e118808cd2bb416e411e81159092ca664d73b6c3cb30b2232c1e0e27160c6938c13376ffae3b176f145b3cef8ecd286ed103b3d69fcff6babdd4e950adbde081ab76cb225123ee132db502c528be0d598d1f06b29bc2a586229e1414cfd16471b58dc4982b3dd06704f039c50e31b65109996812391f6d6a19604e9a9fb5cdad960817504e89172eb185fde1fd2701cb1b65fa516b2ac089bf04e49728fa80db3bf6eea6be249c2ac7eae1eb100d57877694b58c4a60e83cdcc2ac102da7b854797e7ffa99a504ca2d0f4429896907832ac9f5b8ce33818a872a5db8033fa9ee95a5a365ba88b97f7ac924daa667c7f05f4521716b764d0b30901cad65814c71e16f47ace9601bfbe347afdf3cfff3cfca189d2d1d94f2f548b8d6859169e4eb4519a802a76df6424aa35489b85af852339cb9c0a1e3f1eef25384c0f9851ebcb70336cdae72d7fd19cd840c517745803b137a76811408db68cd60a7327738337f688f11e0b6fdd9f43ff93af534e16853aa84944c3025de49184eac7de611ed99894f9cb210990bfc506dc0b4575804bbeaf4e84bc30ca8ecdc2f6f7b561c3aedd6928d835deed93989ef522c59da791653eb1762196f5d0c170beb9b0342703213229bead81dee2af8b9738078c57746c9eee77f34188c7b42e69782b9222730976ce1b4e2b2a1672e4cbb8429a80faf696c43a092835ca6f7da068b604a5caeaef1aed66e0064cd1076cfcd6da7d70b4819570430ec895f0c3150096d2b92351eb5915881c7109ae3ca15230849c4f303ea6cf374093d3042bf175c97d5bb6108069277c71012136e8e110952bc4cb11479f6db03efd664270e5c0d0fd81aabbb92626c0fdef8754c22f23f8c81c4b4ad9f32beafbc6c44e04ee261b06cc233ccac037d317134a9a120d4b66d418cd4202761e2a1d06b69d220b4ab28c506f8b093ed18e142bf15a213f99e97b3a5de0097df185c452dd950920b41d6307966aacf3b81309b7b9889741446970560cc93b2488b4201369d0de54cdaafb2fe4209530aecb7dc694f746e0548c7245f90e4f6d26901aeda0405a3ba4c6631d45e5e30891d7b4950ff53660849b72c8382988702bb8eabb5386f22ccf0e881f6ecc813c57bb484950e8c371705e513a7ea76a83631fe5f8c5042427f18ddd1059b065c8b1cec60232680acfcb362485d0622cc184d617d030a76e20e91b7e29927d42a0b9889a7193720554aa6e95a086e2f213b07b153a366f121c005fa65813ad9103a454f0d6d098ce062a8f531caa09d3741ba6b9eef7be90b513e8b186008fbcffb3e06fe02023a27516b309942b261766dc050ba2fc117845d4597b61f9af9986d88d38dda76739df3dcf071af816c5ea3bbcee3a526baf412a8483c5ec28eaadb0eb0c5f81cbfdc01ccc48218aabca942fa0d846fa40410b621ce57393c726dbc7df1b68d3f02f2e84db0648149a98a3a7009244d128714cc11fa050efdec20d85de634e6aafe50e7da8ea13cee23b5f649f170e771b83c8214372bda04d137a2577ab86ed4703aa1e32ba412a744d4f0d1c734a1a2b2b12a71d33dfdc10d37da8dce8818fc7491522284ca9298cbe4203d2c31a07ab999c29180ca1b43d96819f7febbb11bb2d7007868efbf9156cc90149f9c53b445cae68f464097f879b0a49f958c2c8425a5678a11206bd8cf82b7f1c0760c0f913be6460efb8244d6310335197d25e06addd317e6840b5f0f9c89700a02f9be20eda04b140fc06e6c71c5d587bed34e0007764d6e58507df0cab801090c2f578fbf9e58447ce3d2513038cfa3cfaf4d022acb74339a98a7ee0227ca70382e52bf571913f544a1d65d3b99dc702864fe18bf198e6a6870c86018e83e0786ae0fc060da19687f48196fff14d7dbb5ab405379cd2e33d45bc1adad4ee7e05b0f75c624fc9bb93b8c4c085049edc743b079e6f2c8dcecc9362da0313d03c5d7b09f7ba652ed2152ec47cbaa1b1655d5e278db121a5d476ebc3a2a9bc40fd709a456a92c191f5c654249c7a871a1f9fe2cb86457c8d3d7a9bb2cd88097cddf271df9b0c130014daa081aa448a4313ce171aa08a2e8935aff93d3686c5f849d08c9d6567cf55c87eaafc3c27dbd26012f9812e70706aab5441fc98e300e1994a87e0194c6be02baaabe8ad4d459d42e8908e92bb3c9c066c56ac2e3bc8595a79f8817708c8c7f1750ec30beb4bb8a8bf3dc672de35669aa0068f12a295b6a1ad2a12fbf1a9ac2c540139c3d4e8c248566a26df81281c0a375a50bd3d3fd165fa0ef5330392ea767f012babec33a193a413d35842c93462dadb8a9186381a11c81f7010a0487182e72b16e5f6a31883434063179c3729a1b2b2de6f995f9d52d34fc1a5e12fefb0095643ef7b6afdfe08fbd0a34adbc13666b1326b0a160bd98363b68941af17068b82900a327377fad601548050ffa0eb7e49c504aeff0693b8f42c23be0d5bb42ce60e6dadab5eb6a4bc6a1f2f218c758da431a64efb7e10fecb075f2873d37c715818c58a6312bac9327ecf3ce4413382bb113ece60dbd6959b41b2e60b1e8825451a3618d31eb69819b47fa363782ea65a2d88337380cd0f319841e27cce2dd6d2b6acf1542ce71e31f03e88ed0b60c149efa65dd8abb7a08c5a39ba3e169e1217be28a5c335b0f751b3664b46394b1f0074d62598104929ebaf49296d31b10f2e157ecef2e6bf4c0fdc802c9f566d8e1aee6ae90141e6eba97d6b01022f64aad4dd12c70b056fc715653d341e8895ab25523bdd78ab8c308a921ef85b873abbb9d74d6430069bddd2fbd9a142b16a0c92350d8cfb90fe6f89c10baad417583a1dc9b89965f18da64f5411156a39996b7d8ace5b3aa653643f7429c82cef0eb67a739c7429ad236f0d8f1948f0726700204aa1f1945176ca255d61f42979585dc0708dc686da5c98682e217050a691626e486c115b348a8a83308ebaf5901e2df0e20833c94123bf46c394939f725e37b33d5083f0a0de23f8d64f113b0eee6494a565e80b8eeb1dd421b86f4088b839b3a6a73dfb4a50d92dc69a9fb4f70c5f3fd9ab008f29b27c92d05e957ece98e1fac9b7e741dd74438d4afc91c392d764e83b41d006ad3dbfbf2239b304b0004fd016b6d697e93467793aa50a183e12b6d479da9962bcdbd384a3286d63fbf0e7dedc987ae5ac0ba3bfd6416dd52112c84065cfa69af2af0e2e87764488509064ea447561560cc9941c377612758fd73a5c712b511192ab160cfdaf0e4c6b9a12f3d3001f2a49cc39070b64fa5b054c3b8fe3d5d6c4ae1d00b75337721ff29d473cde5554e236223be6ca0a74a74234b8a295002b1f4696fe5a407455507f0da285cbac2b116dad360840c26a72f90b74b578857edd7f3e5aeca175ccbc75594cb492ad411204a4e3a7402fe43dc7ec8f301b4b01ac4a07a0ee72e39a07129a1c1aac0ce099d09bae58453f1d7985b81c0f26ddb92d53b53040ee42801b1e90ab682ac48b3461ba39c1191aaa13c7d943acd8907ab0c8aa90815a88b7df700fda8d78b3ac0022aee1b1530e9e167c38ba2aa3521749a769bf26cf0600d54c21adcea764261945c3da63ccf8c23095b29e196642419ef35f5267e3859987dc545d36780d7e74e86e72b1546f91b7c7a7453ebf5c5e52ce45d01668d14d0369e16d5bfeed590ff0f7d74106b7a7e9a053f3b4007370867105d493e3c6d013b270361420a33e930a12b0809e67fa767ce8827574b87f0fe685e22c25db8ebdf2e77cbc4302e26bd2f12ce144d43db9533673f1b63fc69a010875518eba17cfab71f97ffefda2a1b735b49546604a69dd4e9433ae043cb192333875b93cdc5510f9b1a37d2db2eb866ea06fa758e40bfeaf131f089a2b939d791da382a83a898e7a1e478cf61cf8b5959237fece6028ed22522f05c01b879d2648220a3361b4d55e6dd614d8488434710d547d29a6906409ee201b81cfaa247dda0e0385a8c51506511a17849f2e3907a8c8a673cf4cbd0238dd0dce7d23e2e6d198e90e296c91ad42770e44680dbc83c6741c5251051a9a327398cb20f026012f16cf0c5c8aab836e2d802a579926d86db8a6be794ea74543cfc066ded5930dd12f54ba08ea03826508bef4fb3bf5de3c9a8ed56d02c5c41be18c5d063c8e2277fc7bfb9a9c7cac131c5f68e87ca9c07f1a8428e7530417929876d28c71d870fa132d8496321f9b64d9af23d4b45d8666e7e7079c29e701c9b3c1fe64bc012d746534f6df17bb7a4417f25301044a6d4a25652edd1448724577fbe0eb86882745a19dce7187faec033538271ed12f3cd38d299afd045576a61e7bc60d5bb4404eb1bd178a7f33f9fbeb28137f657a471e866c9c55217f87df5135dcf388012e20971a1f32a4ec3d2e4a3032a63b6ba1c311226c5821c4f731900cab8a773b3e6fd405b555b1f7380f7472f7899f574349282453e8d5a058c9abe1f7f9f4806bb69cfa162be42cc72776c94a685ffc51b54d5848c68e06bb0c59b22495e10b745520a25bb8285e0345e6f0e2447da03e1c118089a4f42927210d6187c11252a36a7228bb81a2530584e9d3dc5d14e458e2268470c16671f85b55bc7b69c48196d88466122b46f53a79aa6b87fb30822cbc5255ef46e5f33370fa791a155b4b944de26fd2253d830b1ad8d81c21a2e0cc3f42e948f369812d2426389556e6e24066d12e1c570a36cee02d5917320195c05ce4d32c5558aa328e16d761f2a973e5bcd0ed1f6444891d9d9e3cc3d5aa56e7b0f1e745864e672505aeb3eceb07ca70d49bc20990a90dc8481d58e382050b29962b59e63e4687b0cde1d4e27535c6ff9ca35cbc92e36b22f6e103515be5225e4b9503b4d8de333d5bc0745b7833d7fab2f5868965059015fa9fe53a60be6e954e6f6937de30f8a8d191c835d9db40a5ce57d8daa1924bc64e3281f3d8344a0343495b96dddde983d0ad179aa188a5c98c9d6fdf022d659fe839ebdf84c30ffeaf40f359181263b7b5f96f22f4088bb6e3ed69ec1bd01bfca2f831e053e08ec9f8bca05b52d595b013a390b79274f9394d28b3bae67576453b0ccd3e166f44d863f7cc01c5e4cf0a03143df54dd3bc85af2249b6462640765aca4d46d05614017ba9bf0e7f880198048174ab5b1fbd190484b018a4148bc2b2d601d4140742bf55e3d4b2b604c0162eeefdd3c0969d9621ae20b607ab11d71481e33df9bc6491b4e4c52b5ec2dc4733915ce77b28cbd16ef030caf6713731f91fe046001e65426cffee98124d1267a80c10bb7091c846b7687b50311f5074290e0469ddddc5da774a4543a0b0d790b9a1ec84e608aaeffe28d7ea7c24a4f487468a6d08bf8775215150eb021a9a04174d468929e1673dfbf13c75a8efa5cf442f23fa36b5cae02", + "0x3a65787472696e7369635f696e646578": "0x00000000", + "0x3c311d57d4daf52904616cf69648081e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x3c311d57d4daf52904616cf69648081e5e0621c4869aa60c02be9adcc98a0d1d": "0x0802f40601439cb3765ef8e2a0a5770a78fdda8ea3675f0d4262ceac46fe9b8a38b25ca9a71a8570a05814e75eee9eab0757d2c98e91b24c1fa2e3eb75f7b26d4b", + "0x3f1467a096bcd71a5b6a0c8155e208104e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x45323df7cc47150b3930e2666b0aa3134e7b9012096b41c4eb3aaf947f6ea429": "0x0200", + "0x4dcb50595177a3177648411a42aca0f54e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x57f8dc2f5ab09467896f47300f0424384e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x57f8dc2f5ab09467896f47300f0424385e0621c4869aa60c02be9adcc98a0d1d": "0x0802f40601439cb3765ef8e2a0a5770a78fdda8ea3675f0d4262ceac46fe9b8a38b25ca9a71a8570a05814e75eee9eab0757d2c98e91b24c1fa2e3eb75f7b26d4b", + "0x7474449cca95dc5d0c00e71735a6d17d4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", + "0x79e2fe5d327165001f8232643023ed8b4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x7b3237373ffdfeb1cab4222e3b520d6b4e7b9012096b41c4eb3aaf947f6ea429": "0x0300", + "0xb8753e9383841da95f7b8871e5de32694e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xc2261276cc9d1f8598ea4b6a74b15c2f4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", + "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x00000000000000000000000000000000", + "0xcd5c1f6df63bc97f4a8ce37f14a50ca74e7b9012096b41c4eb3aaf947f6ea429": "0x0200", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3274dc1bb854565c3b25ca9a71a8570a05814e75eee9eab0757d2c98e91b24c1fa2e3eb75f7b26d4b": "0xb25ca9a71a8570a05814e75eee9eab0757d2c98e91b24c1fa2e3eb75f7b26d4b", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3d6e4cff6e22a77dc02f40601439cb3765ef8e2a0a5770a78fdda8ea3675f0d4262ceac46fe9b8a38": "0x02f40601439cb3765ef8e2a0a5770a78fdda8ea3675f0d4262ceac46fe9b8a38", + "0xcec5070d609dd3497f72bde07fc96ba04e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195089a0705a664955c36175726180b25ca9a71a8570a05814e75eee9eab0757d2c98e91b24c1fa2e3eb75f7b26d4b": "0xb25ca9a71a8570a05814e75eee9eab0757d2c98e91b24c1fa2e3eb75f7b26d4b", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950d6611bd6b7ff46a3617572618002f40601439cb3765ef8e2a0a5770a78fdda8ea3675f0d4262ceac46fe9b8a38": "0x02f40601439cb3765ef8e2a0a5770a78fdda8ea3675f0d4262ceac46fe9b8a38", + "0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903": "0x0802f40601439cb3765ef8e2a0a5770a78fdda8ea3675f0d4262ceac46fe9b8a38b25ca9a71a8570a05814e75eee9eab0757d2c98e91b24c1fa2e3eb75f7b26d4b", + "0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x0802f40601439cb3765ef8e2a0a5770a78fdda8ea3675f0d4262ceac46fe9b8a3802f40601439cb3765ef8e2a0a5770a78fdda8ea3675f0d4262ceac46fe9b8a38b25ca9a71a8570a05814e75eee9eab0757d2c98e91b24c1fa2e3eb75f7b26d4bb25ca9a71a8570a05814e75eee9eab0757d2c98e91b24c1fa2e3eb75f7b26d4b", + "0xd57bce545fb382c34570e5dfbf338f5e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xd5e1a2fa16732ce6906189438c0a82c64e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xe38f185207498abb5c213d0fb059b3d84e7b9012096b41c4eb3aaf947f6ea429": "0x0100", + "0xe38f185207498abb5c213d0fb059b3d86323ae84c43568be0d1394d5d0d522c4": "0x03000000", + "0xf0c365c3cf59d671eb72da0e7a4113c44e7b9012096b41c4eb3aaf947f6ea429": "0x0000" + }, + "childrenDefault": {} + } + } +} \ No newline at end of file diff --git a/cumulus/parachains/runtimes/coretime/README.md b/cumulus/parachains/runtimes/coretime/README.md new file mode 100644 index 00000000000..3f09e57c7d4 --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/README.md @@ -0,0 +1,4 @@ +# Coretime System Chain + +Also known as the "Broker Chain". Described in +[RFC-0001](https://github.com/polkadot-fellows/RFCs/pull/1). diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml b/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml new file mode 100644 index 00000000000..5f7654fecae --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml @@ -0,0 +1,196 @@ +[package] +name = "coretime-rococo-runtime" +version = "0.1.0" +authors.workspace = true +edition.workspace = true +description = "Rococo's Coretime parachain runtime" +license = "Apache-2.0" + +[lints] +workspace = true + +[build-dependencies] +substrate-wasm-builder = { path = "../../../../../substrate/utils/wasm-builder", optional = true } + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } +hex-literal = "0.4.1" +log = { version = "0.4.20", default-features = false } +scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } +serde = { version = "1.0.171", optional = true, features = ["derive"] } +smallvec = "1.11.0" + +# Substrate +frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking", default-features = false, optional = true } +frame-executive = { path = "../../../../../substrate/frame/executive", default-features = false } +frame-support = { path = "../../../../../substrate/frame/support", default-features = false } +frame-system = { path = "../../../../../substrate/frame/system", default-features = false } +frame-system-benchmarking = { path = "../../../../../substrate/frame/system/benchmarking", default-features = false, optional = true } +frame-system-rpc-runtime-api = { path = "../../../../../substrate/frame/system/rpc/runtime-api", default-features = false } +frame-try-runtime = { path = "../../../../../substrate/frame/try-runtime", default-features = false, optional = true } +pallet-aura = { path = "../../../../../substrate/frame/aura", default-features = false } +pallet-authorship = { path = "../../../../../substrate/frame/authorship", default-features = false } +pallet-balances = { path = "../../../../../substrate/frame/balances", default-features = false } +pallet-message-queue = { path = "../../../../../substrate/frame/message-queue", default-features = false } +pallet-broker = { path = "../../../../../substrate/frame/broker", default-features = false } +pallet-multisig = { path = "../../../../../substrate/frame/multisig", default-features = false } +pallet-session = { path = "../../../../../substrate/frame/session", default-features = false } +pallet-sudo = { path = "../../../../../substrate/frame/sudo", default-features = false } +pallet-timestamp = { path = "../../../../../substrate/frame/timestamp", default-features = false } +pallet-transaction-payment = { path = "../../../../../substrate/frame/transaction-payment", default-features = false } +pallet-transaction-payment-rpc-runtime-api = { path = "../../../../../substrate/frame/transaction-payment/rpc/runtime-api", default-features = false } +pallet-utility = { path = "../../../../../substrate/frame/utility", default-features = false } +sp-api = { path = "../../../../../substrate/primitives/api", default-features = false } +sp-block-builder = { path = "../../../../../substrate/primitives/block-builder", default-features = false } +sp-consensus-aura = { path = "../../../../../substrate/primitives/consensus/aura", default-features = false } +sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } +sp-inherents = { path = "../../../../../substrate/primitives/inherents", default-features = false } +sp-genesis-builder = { path = "../../../../../substrate/primitives/genesis-builder", default-features = false } +sp-offchain = { path = "../../../../../substrate/primitives/offchain", default-features = false } +sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-features = false } +sp-session = { path = "../../../../../substrate/primitives/session", default-features = false } +sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } +sp-storage = { path = "../../../../../substrate/primitives/storage", default-features = false } +sp-transaction-pool = { path = "../../../../../substrate/primitives/transaction-pool", default-features = false } +sp-version = { path = "../../../../../substrate/primitives/version", default-features = false } + +# Polkadot +pallet-xcm = { path = "../../../../../polkadot/xcm/pallet-xcm", default-features = false } +pallet-xcm-benchmarks = { path = "../../../../../polkadot/xcm/pallet-xcm-benchmarks", default-features = false, optional = true } +polkadot-core-primitives = { path = "../../../../../polkadot/core-primitives", default-features = false } +polkadot-parachain-primitives = { path = "../../../../../polkadot/parachain", default-features = false } +polkadot-runtime-common = { path = "../../../../../polkadot/runtime/common", default-features = false } +rococo-runtime-constants = { path = "../../../../../polkadot/runtime/rococo/constants", default-features = false } +xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } +xcm-builder = { package = "staging-xcm-builder", path = "../../../../../polkadot/xcm/xcm-builder", default-features = false } +xcm-executor = { package = "staging-xcm-executor", path = "../../../../../polkadot/xcm/xcm-executor", default-features = false } + +# Cumulus +cumulus-pallet-aura-ext = { path = "../../../../pallets/aura-ext", default-features = false } +cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false, features = ["parameterized-consensus-hook"] } +cumulus-pallet-session-benchmarking = { path = "../../../../pallets/session-benchmarking", default-features = false } +cumulus-pallet-xcm = { path = "../../../../pallets/xcm", default-features = false } +cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-features = false } +cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } +cumulus-primitives-utility = { path = "../../../../primitives/utility", default-features = false } +pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } +parachain-info = { package = "staging-parachain-info", path = "../../../pallets/parachain-info", default-features = false } +parachains-common = { path = "../../../common", default-features = false } + +[features] +default = ["std"] +std = [ + "codec/std", + "cumulus-pallet-aura-ext/std", + "cumulus-pallet-parachain-system/std", + "cumulus-pallet-session-benchmarking/std", + "cumulus-pallet-xcm/std", + "cumulus-pallet-xcmp-queue/std", + "cumulus-primitives-core/std", + "cumulus-primitives-utility/std", + "frame-benchmarking?/std", + "frame-executive/std", + "frame-support/std", + "frame-system-benchmarking?/std", + "frame-system-rpc-runtime-api/std", + "frame-system/std", + "frame-try-runtime?/std", + "log/std", + "pallet-aura/std", + "pallet-authorship/std", + "pallet-balances/std", + "pallet-broker/std", + "pallet-collator-selection/std", + "pallet-message-queue/std", + "pallet-multisig/std", + "pallet-session/std", + "pallet-sudo/std", + "pallet-timestamp/std", + "pallet-transaction-payment-rpc-runtime-api/std", + "pallet-transaction-payment/std", + "pallet-utility/std", + "pallet-xcm-benchmarks?/std", + "pallet-xcm/std", + "parachain-info/std", + "parachains-common/std", + "polkadot-core-primitives/std", + "polkadot-parachain-primitives/std", + "polkadot-runtime-common/std", + "rococo-runtime-constants/std", + "scale-info/std", + "serde", + "sp-api/std", + "sp-block-builder/std", + "sp-consensus-aura/std", + "sp-core/std", + "sp-genesis-builder/std", + "sp-inherents/std", + "sp-offchain/std", + "sp-runtime/std", + "sp-session/std", + "sp-std/std", + "sp-storage/std", + "sp-transaction-pool/std", + "sp-version/std", + "substrate-wasm-builder", + "xcm-builder/std", + "xcm-executor/std", + "xcm/std", +] + +runtime-benchmarks = [ + "cumulus-pallet-parachain-system/runtime-benchmarks", + "cumulus-pallet-session-benchmarking/runtime-benchmarks", + "cumulus-pallet-xcmp-queue/runtime-benchmarks", + "cumulus-primitives-core/runtime-benchmarks", + "cumulus-primitives-utility/runtime-benchmarks", + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system-benchmarking/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "pallet-balances/runtime-benchmarks", + "pallet-broker/runtime-benchmarks", + "pallet-collator-selection/runtime-benchmarks", + "pallet-message-queue/runtime-benchmarks", + "pallet-multisig/runtime-benchmarks", + "pallet-sudo/runtime-benchmarks", + "pallet-timestamp/runtime-benchmarks", + "pallet-utility/runtime-benchmarks", + "pallet-xcm-benchmarks/runtime-benchmarks", + "pallet-xcm/runtime-benchmarks", + "parachains-common/runtime-benchmarks", + "polkadot-parachain-primitives/runtime-benchmarks", + "polkadot-runtime-common/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", + "xcm-builder/runtime-benchmarks", + "xcm-executor/runtime-benchmarks", +] + +try-runtime = [ + "cumulus-pallet-aura-ext/try-runtime", + "cumulus-pallet-parachain-system/try-runtime", + "cumulus-pallet-xcm/try-runtime", + "cumulus-pallet-xcmp-queue/try-runtime", + "frame-executive/try-runtime", + "frame-support/try-runtime", + "frame-system/try-runtime", + "frame-try-runtime/try-runtime", + "pallet-aura/try-runtime", + "pallet-authorship/try-runtime", + "pallet-balances/try-runtime", + "pallet-broker/try-runtime", + "pallet-collator-selection/try-runtime", + "pallet-message-queue/try-runtime", + "pallet-multisig/try-runtime", + "pallet-session/try-runtime", + "pallet-sudo/try-runtime", + "pallet-timestamp/try-runtime", + "pallet-transaction-payment/try-runtime", + "pallet-utility/try-runtime", + "pallet-xcm/try-runtime", + "parachain-info/try-runtime", + "polkadot-runtime-common/try-runtime", + "sp-runtime/try-runtime", +] + +experimental = ["pallet-aura/experimental"] diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/build.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/build.rs new file mode 100644 index 00000000000..60f8a125129 --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/build.rs @@ -0,0 +1,26 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#[cfg(feature = "std")] +fn main() { + substrate_wasm_builder::WasmBuilder::new() + .with_current_project() + .export_heap_base() + .import_memory() + .build() +} + +#[cfg(not(feature = "std"))] +fn main() {} diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/coretime.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/coretime.rs new file mode 100644 index 00000000000..3cdcff33cfb --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/coretime.rs @@ -0,0 +1,238 @@ +// Copyright 2022 Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +use crate::*; +use codec::{Decode, Encode}; +use cumulus_pallet_parachain_system::RelaychainDataProvider; +use frame_support::{ + parameter_types, + traits::{ + fungible::{Balanced, Credit}, + OnUnbalanced, + }, +}; +use pallet_broker::{CoreAssignment, CoreIndex, CoretimeInterface, PartsOf57600, RCBlockNumberOf}; +use parachains_common::{AccountId, Balance, BlockNumber}; +use xcm::latest::prelude::*; + +pub struct CreditToCollatorPot; +impl OnUnbalanced> for CreditToCollatorPot { + fn on_nonzero_unbalanced(credit: Credit) { + let staking_pot = CollatorSelection::account_id(); + let _ = >::resolve(&staking_pot, credit); + } +} + +/// A type containing the encoding of the coretime pallet in the Relay chain runtime. Used to +/// construct any remote calls. The codec index must correspond to the index of `Coretime` in the +/// `construct_runtime` of the Relay chain. +#[derive(Encode, Decode)] +enum RelayRuntimePallets { + #[codec(index = 74)] + Coretime(CoretimeProviderCalls), +} + +/// Call encoding for the calls needed from the relay coretime pallet. +#[derive(Encode, Decode)] +enum CoretimeProviderCalls { + #[codec(index = 1)] + RequestCoreCount(CoreIndex), + #[codec(index = 2)] + RequestRevenueInfoAt(BlockNumber), + #[codec(index = 3)] + CreditAccount(AccountId, Balance), + #[codec(index = 4)] + AssignCore(CoreIndex, BlockNumber, Vec<(CoreAssignment, PartsOf57600)>, Option), +} + +parameter_types! { + pub const BrokerPalletId: PalletId = PalletId(*b"py/broke"); +} + +parameter_types! { + pub storage CoreCount: Option = None; + pub storage CoretimeRevenue: Option<(BlockNumber, Balance)> = None; +} + +/// Type that implements the `CoretimeInterface` for the allocation of Coretime. Meant to operate +/// from the parachain context. That is, the parachain provides a market (broker) for the sale of +/// coretime, but assumes a `CoretimeProvider` (i.e. a Relay Chain) to actually provide cores. +pub struct CoretimeAllocator; +impl CoretimeInterface for CoretimeAllocator { + type AccountId = AccountId; + type Balance = Balance; + type RealyChainBlockNumberProvider = RelaychainDataProvider; + + fn request_core_count(count: CoreIndex) { + use crate::coretime::CoretimeProviderCalls::RequestCoreCount; + let request_core_count_call = RelayRuntimePallets::Coretime(RequestCoreCount(count)); + + let message = Xcm(vec![ + Instruction::UnpaidExecution { + weight_limit: WeightLimit::Unlimited, + check_origin: None, + }, + Instruction::Transact { + origin_kind: OriginKind::Native, + require_weight_at_most: Weight::from_parts(1000000000, 200000), + call: request_core_count_call.encode().into(), + }, + ]); + + match PolkadotXcm::send_xcm(Here, MultiLocation::parent(), message.clone()) { + Ok(_) => log::info!( + target: "runtime::coretime", + "Request to update schedulable cores sent successfully." + ), + Err(e) => log::error!( + target: "runtime::coretime", + "Failed to send request to update schedulable cores: {:?}", + e + ), + } + } + + fn request_revenue_info_at(when: RCBlockNumberOf) { + use crate::coretime::CoretimeProviderCalls::RequestRevenueInfoAt; + let request_revenue_info_at_call = + RelayRuntimePallets::Coretime(RequestRevenueInfoAt(when)); + + let message = Xcm(vec![ + Instruction::UnpaidExecution { + weight_limit: WeightLimit::Unlimited, + check_origin: None, + }, + Instruction::Transact { + origin_kind: OriginKind::Native, + require_weight_at_most: Weight::from_parts(1000000000, 200000), + call: request_revenue_info_at_call.encode().into(), + }, + ]); + + match PolkadotXcm::send_xcm(Here, MultiLocation::parent(), message.clone()) { + Ok(_) => log::info!( + target: "runtime::coretime", + "Request for revenue information sent successfully." + ), + Err(e) => log::error!( + target: "runtime::coretime", + "Request for revenue information failed to send: {:?}", + e + ), + } + } + + fn credit_account(who: Self::AccountId, amount: Self::Balance) { + use crate::coretime::CoretimeProviderCalls::CreditAccount; + let credit_account_call = RelayRuntimePallets::Coretime(CreditAccount(who, amount)); + + let message = Xcm(vec![ + Instruction::UnpaidExecution { + weight_limit: WeightLimit::Unlimited, + check_origin: None, + }, + Instruction::Transact { + origin_kind: OriginKind::Native, + require_weight_at_most: Weight::from_parts(1000000000, 200000), + call: credit_account_call.encode().into(), + }, + ]); + + match PolkadotXcm::send_xcm(Here, MultiLocation::parent(), message.clone()) { + Ok(_) => log::info!( + target: "runtime::coretime", + "Instruction to credit account sent successfully." + ), + Err(e) => log::error!( + target: "runtime::coretime", + "Instruction to credit account failed to send: {:?}", + e + ), + } + } + + fn assign_core( + core: CoreIndex, + begin: RCBlockNumberOf, + assignment: Vec<(CoreAssignment, PartsOf57600)>, + end_hint: Option>, + ) { + use crate::coretime::CoretimeProviderCalls::AssignCore; + let assign_core_call = + RelayRuntimePallets::Coretime(AssignCore(core, begin, assignment, end_hint)); + + let message = Xcm(vec![ + Instruction::UnpaidExecution { + weight_limit: WeightLimit::Unlimited, + check_origin: None, + }, + Instruction::Transact { + origin_kind: OriginKind::Native, + require_weight_at_most: Weight::from_parts(1000000000, 200000), + call: assign_core_call.encode().into(), + }, + ]); + + match PolkadotXcm::send_xcm(Here, MultiLocation::parent(), message.clone()) { + Ok(_) => log::info!( + target: "runtime::coretime", + "Core assignment sent successfully." + ), + Err(e) => log::error!( + target: "runtime::coretime", + "Core assignment failed to send: {:?}", + e + ), + } + } + + fn check_notify_core_count() -> Option { + let count = CoreCount::get(); + CoreCount::set(&None); + count + } + + fn check_notify_revenue_info() -> Option<(RCBlockNumberOf, Self::Balance)> { + let revenue = CoretimeRevenue::get(); + CoretimeRevenue::set(&None); + revenue + } + + #[cfg(feature = "runtime-benchmarks")] + fn ensure_notify_core_count(count: u16) { + CoreCount::set(&Some(count)); + } + + #[cfg(feature = "runtime-benchmarks")] + fn ensure_notify_revenue_info(when: RCBlockNumberOf, revenue: Self::Balance) { + CoretimeRevenue::set(&Some((when, revenue))); + } +} + +impl pallet_broker::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Currency = Balances; + type OnRevenue = CreditToCollatorPot; + type TimeslicePeriod = ConstU32<80>; + type MaxLeasedCores = ConstU32<50>; + type MaxReservedCores = ConstU32<10>; + type Coretime = CoretimeAllocator; + type ConvertBalance = sp_runtime::traits::Identity; + type WeightInfo = weights::pallet_broker::WeightInfo; + type PalletId = BrokerPalletId; + type AdminOrigin = EnsureRoot; + type PriceAdapter = pallet_broker::Linear; +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs new file mode 100644 index 00000000000..ef6eb02b4e2 --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs @@ -0,0 +1,851 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![cfg_attr(not(feature = "std"), no_std)] +// `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. +#![recursion_limit = "256"] + +// Make the WASM binary available. +#[cfg(feature = "std")] +include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); + +mod coretime; +mod weights; +pub mod xcm_config; + +use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; +use cumulus_primitives_core::{AggregateMessageOrigin, ParaId}; +use frame_support::{ + construct_runtime, derive_impl, + dispatch::DispatchClass, + genesis_builder_helper::{build_config, create_default_config}, + parameter_types, + traits::{ConstBool, ConstU32, ConstU64, ConstU8, EitherOfDiverse, TransformOrigin}, + weights::{ConstantMultiplier, Weight}, + PalletId, +}; +use frame_system::{ + limits::{BlockLength, BlockWeights}, + EnsureRoot, +}; +use pallet_xcm::{EnsureXcm, IsVoiceOfBody}; +use parachains_common::{ + impls::DealWithFees, + message_queue::{NarrowOriginToSibling, ParaIdToSibling}, + rococo::{consensus::*, currency::*, fee::WeightToFee}, + AccountId, AuraId, Balance, BlockNumber, Hash, Header, Nonce, Signature, + AVERAGE_ON_INITIALIZE_RATIO, HOURS, MAXIMUM_BLOCK_WEIGHT, NORMAL_DISPATCH_RATIO, SLOT_DURATION, +}; +use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; +use sp_api::impl_runtime_apis; +use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; +#[cfg(any(feature = "std", test))] +pub use sp_runtime::BuildStorage; +use sp_runtime::{ + create_runtime_str, generic, impl_opaque_keys, + traits::Block as BlockT, + transaction_validity::{TransactionSource, TransactionValidity}, + ApplyExtrinsicResult, MultiAddress, Perbill, +}; +use sp_std::prelude::*; +#[cfg(feature = "std")] +use sp_version::NativeVersion; +use sp_version::RuntimeVersion; +use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; +use xcm::latest::prelude::*; +use xcm_config::{ + FellowshipLocation, GovernanceLocation, RocRelayLocation, XcmOriginToTransactDispatchOrigin, +}; + +/// The address format for describing accounts. +pub type Address = MultiAddress; + +/// Block type as expected by this runtime. +pub type Block = generic::Block; + +/// A Block signed with a Justification +pub type SignedBlock = generic::SignedBlock; + +/// BlockId type as expected by this runtime. +pub type BlockId = generic::BlockId; + +/// The SignedExtension to the basic transaction logic. +pub type SignedExtra = ( + frame_system::CheckNonZeroSender, + frame_system::CheckSpecVersion, + frame_system::CheckTxVersion, + frame_system::CheckGenesis, + frame_system::CheckEra, + frame_system::CheckNonce, + frame_system::CheckWeight, + pallet_transaction_payment::ChargeTransactionPayment, +); + +/// Unchecked extrinsic type as expected by this runtime. +pub type UncheckedExtrinsic = + generic::UncheckedExtrinsic; + +/// Migrations to apply on runtime upgrade. +pub type Migrations = (cumulus_pallet_xcmp_queue::migration::v4::MigrationToV4,); + +/// Executive: handles dispatch to the various modules. +pub type Executive = frame_executive::Executive< + Runtime, + Block, + frame_system::ChainContext, + Runtime, + AllPalletsWithSystem, + Migrations, +>; + +impl_opaque_keys! { + pub struct SessionKeys { + pub aura: Aura, + } +} + +#[sp_version::runtime_version] +pub const VERSION: RuntimeVersion = RuntimeVersion { + spec_name: create_runtime_str!("coretime-rococo"), + impl_name: create_runtime_str!("coretime-rococo"), + authoring_version: 1, + spec_version: 1_005_000, + impl_version: 0, + apis: RUNTIME_API_VERSIONS, + transaction_version: 0, + state_version: 1, +}; + +/// The version information used to identify this runtime when compiled natively. +#[cfg(feature = "std")] +pub fn native_version() -> NativeVersion { + NativeVersion { runtime_version: VERSION, can_author_with: Default::default() } +} + +parameter_types! { + pub const Version: RuntimeVersion = VERSION; + pub RuntimeBlockLength: BlockLength = + BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO); + pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder() + .base_block(BlockExecutionWeight::get()) + .for_class(DispatchClass::all(), |weights| { + weights.base_extrinsic = ExtrinsicBaseWeight::get(); + }) + .for_class(DispatchClass::Normal, |weights| { + weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT); + }) + .for_class(DispatchClass::Operational, |weights| { + weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT); + // Operational transactions have some extra reserved space, so that they + // are included even if block reached `MAXIMUM_BLOCK_WEIGHT`. + weights.reserved = Some( + MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT + ); + }) + .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO) + .build_or_panic(); + pub const SS58Prefix: u8 = 42; +} + +// Configure FRAME pallets to include in runtime. +#[derive_impl(frame_system::config_preludes::ParaChainDefaultConfig as frame_system::DefaultConfig)] +impl frame_system::Config for Runtime { + /// The identifier used to distinguish between accounts. + type AccountId = AccountId; + /// The nonce type for storing how many extrinsics an account has signed. + type Nonce = Nonce; + /// The type for hashing blocks and tries. + type Hash = Hash; + /// The block type. + type Block = Block; + /// Maximum number of block number to block hash mappings to keep (oldest pruned first). + type BlockHashCount = BlockHashCount; + /// Runtime version. + type Version = Version; + /// The data to be stored in an account. + type AccountData = pallet_balances::AccountData; + /// The weight of database operations that the runtime can invoke. + type DbWeight = RocksDbWeight; + /// Weight information for the extrinsics of this pallet. + type SystemWeightInfo = weights::frame_system::WeightInfo; + /// Block & extrinsics weights: base values and limits. + type BlockWeights = RuntimeBlockWeights; + /// The maximum length of a block (in bytes). + type BlockLength = RuntimeBlockLength; + type SS58Prefix = SS58Prefix; + /// The action to take on a Runtime Upgrade + type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode; + type MaxConsumers = ConstU32<16>; +} + +impl pallet_timestamp::Config for Runtime { + /// A timestamp: milliseconds since the unix epoch. + type Moment = u64; + type OnTimestampSet = Aura; + type MinimumPeriod = ConstU64<{ SLOT_DURATION / 2 }>; + type WeightInfo = weights::pallet_timestamp::WeightInfo; +} + +impl pallet_authorship::Config for Runtime { + type FindAuthor = pallet_session::FindAccountFromAuthorIndex; + type EventHandler = (CollatorSelection,); +} + +parameter_types! { + pub const ExistentialDeposit: Balance = EXISTENTIAL_DEPOSIT; +} + +impl pallet_balances::Config for Runtime { + type Balance = Balance; + type DustRemoval = (); + type RuntimeEvent = RuntimeEvent; + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type WeightInfo = weights::pallet_balances::WeightInfo; + type MaxLocks = ConstU32<50>; + type MaxReserves = ConstU32<50>; + type ReserveIdentifier = [u8; 8]; + type RuntimeHoldReason = RuntimeHoldReason; + type RuntimeFreezeReason = RuntimeFreezeReason; + type FreezeIdentifier = (); + type MaxHolds = ConstU32<0>; + type MaxFreezes = ConstU32<0>; +} + +parameter_types! { + /// Relay Chain `TransactionByteFee` / 10 + pub const TransactionByteFee: Balance = MILLICENTS; +} + +impl pallet_transaction_payment::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type OnChargeTransaction = + pallet_transaction_payment::CurrencyAdapter>; + type OperationalFeeMultiplier = ConstU8<5>; + type WeightToFee = WeightToFee; + type LengthToFee = ConstantMultiplier; + type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; +} + +parameter_types! { + pub const ReservedXcmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); + pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); + pub const RelayOrigin: AggregateMessageOrigin = AggregateMessageOrigin::Parent; +} + +impl cumulus_pallet_parachain_system::Config for Runtime { + type WeightInfo = weights::cumulus_pallet_parachain_system::WeightInfo; + type RuntimeEvent = RuntimeEvent; + type OnSystemEvent = (); + type SelfParaId = parachain_info::Pallet; + type DmpQueue = frame_support::traits::EnqueueWithOrigin; + type OutboundXcmpMessageSource = XcmpQueue; + type ReservedDmpWeight = ReservedDmpWeight; + type XcmpMessageHandler = XcmpQueue; + type ReservedXcmpWeight = ReservedXcmpWeight; + type CheckAssociatedRelayNumber = RelayNumberStrictlyIncreases; + type ConsensusHook = cumulus_pallet_aura_ext::FixedVelocityConsensusHook< + Runtime, + RELAY_CHAIN_SLOT_DURATION_MILLIS, + BLOCK_PROCESSING_VELOCITY, + UNINCLUDED_SEGMENT_CAPACITY, + >; +} + +parameter_types! { + pub MessageQueueServiceWeight: Weight = Perbill::from_percent(35) * RuntimeBlockWeights::get().max_block; +} + +impl pallet_message_queue::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type WeightInfo = weights::pallet_message_queue::WeightInfo; + #[cfg(feature = "runtime-benchmarks")] + type MessageProcessor = pallet_message_queue::mock_helpers::NoopMessageProcessor< + cumulus_primitives_core::AggregateMessageOrigin, + >; + #[cfg(not(feature = "runtime-benchmarks"))] + type MessageProcessor = xcm_builder::ProcessXcmMessage< + AggregateMessageOrigin, + xcm_executor::XcmExecutor, + RuntimeCall, + >; + type Size = u32; + // The XCMP queue pallet is only ever able to handle the `Sibling(ParaId)` origin: + type QueueChangeHandler = NarrowOriginToSibling; + type QueuePausedQuery = NarrowOriginToSibling; + type HeapSize = sp_core::ConstU32<{ 64 * 1024 }>; + type MaxStale = sp_core::ConstU32<8>; + type ServiceWeight = MessageQueueServiceWeight; +} + +impl parachain_info::Config for Runtime {} + +impl cumulus_pallet_aura_ext::Config for Runtime {} + +parameter_types! { + /// Fellows pluralistic body. + pub const FellowsBodyId: BodyId = BodyId::Technical; +} + +/// Privileged origin that represents Root or Fellows pluralistic body. +pub type RootOrFellows = EitherOfDiverse< + EnsureRoot, + EnsureXcm>, +>; + +parameter_types! { + /// The asset ID for the asset that we use to pay for message delivery fees. + pub FeeAssetId: AssetId = Concrete(RocRelayLocation::get()); + /// The base fee for the message delivery fees. + pub const BaseDeliveryFee: u128 = CENTS.saturating_mul(3); +} + +pub type PriceForSiblingParachainDelivery = polkadot_runtime_common::xcm_sender::ExponentialPrice< + FeeAssetId, + BaseDeliveryFee, + TransactionByteFee, + XcmpQueue, +>; + +impl cumulus_pallet_xcmp_queue::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type ChannelInfo = ParachainSystem; + type VersionWrapper = PolkadotXcm; + type XcmpQueue = TransformOrigin; + type MaxInboundSuspended = sp_core::ConstU32<1_000>; + type ControllerOrigin = RootOrFellows; + type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin; + type WeightInfo = weights::cumulus_pallet_xcmp_queue::WeightInfo; + type PriceForSiblingDelivery = PriceForSiblingParachainDelivery; +} + +pub const PERIOD: u32 = 6 * HOURS; +pub const OFFSET: u32 = 0; + +impl pallet_session::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type ValidatorId = ::AccountId; + // we don't have stash and controller, thus we don't need the convert as well. + type ValidatorIdOf = pallet_collator_selection::IdentityCollator; + type ShouldEndSession = pallet_session::PeriodicSessions, ConstU32>; + type NextSessionRotation = pallet_session::PeriodicSessions, ConstU32>; + type SessionManager = CollatorSelection; + // Essentially just Aura, but let's be pedantic. + type SessionHandler = ::KeyTypeIdProviders; + type Keys = SessionKeys; + type WeightInfo = weights::pallet_session::WeightInfo; +} + +impl pallet_aura::Config for Runtime { + type AuthorityId = AuraId; + type DisabledValidators = (); + type MaxAuthorities = ConstU32<100_000>; + type AllowMultipleBlocksPerSlot = ConstBool; + #[cfg(feature = "experimental")] + type SlotDuration = pallet_aura::MinimumPeriodTimesTwo; +} + +parameter_types! { + pub const PotId: PalletId = PalletId(*b"PotStake"); + pub const SessionLength: BlockNumber = 6 * HOURS; + /// StakingAdmin pluralistic body. + pub const StakingAdminBodyId: BodyId = BodyId::Defense; +} + +/// We allow Root and the `StakingAdmin` to execute privileged collator selection operations. +pub type CollatorSelectionUpdateOrigin = EitherOfDiverse< + EnsureRoot, + EnsureXcm>, +>; + +impl pallet_collator_selection::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Currency = Balances; + type UpdateOrigin = CollatorSelectionUpdateOrigin; + type PotId = PotId; + type MaxCandidates = ConstU32<100>; + type MinEligibleCollators = ConstU32<4>; + type MaxInvulnerables = ConstU32<20>; + // should be a multiple of session or things will get inconsistent + type KickThreshold = ConstU32; + type ValidatorId = ::AccountId; + type ValidatorIdOf = pallet_collator_selection::IdentityCollator; + type ValidatorRegistration = Session; + type WeightInfo = weights::pallet_collator_selection::WeightInfo; +} + +parameter_types! { + /// One storage item; key size is 32; value is size 4+4+16+32 bytes = 56 bytes. + pub const DepositBase: Balance = deposit(1, 88); + /// Additional storage item size of 32 bytes. + pub const DepositFactor: Balance = deposit(0, 32); +} + +impl pallet_multisig::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; + type Currency = Balances; + type DepositBase = DepositBase; + type DepositFactor = DepositFactor; + type MaxSignatories = ConstU32<100>; + type WeightInfo = weights::pallet_multisig::WeightInfo; +} + +impl pallet_utility::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; + type PalletsOrigin = OriginCaller; + type WeightInfo = weights::pallet_utility::WeightInfo; +} + +impl pallet_sudo::Config for Runtime { + type RuntimeCall = RuntimeCall; + type RuntimeEvent = RuntimeEvent; + type WeightInfo = pallet_sudo::weights::SubstrateWeight; +} + +// Create the runtime by composing the FRAME pallets that were previously configured. +construct_runtime!( + pub enum Runtime + { + // System support stuff. + System: frame_system = 0, + ParachainSystem: cumulus_pallet_parachain_system = 1, + Timestamp: pallet_timestamp = 3, + ParachainInfo: parachain_info = 4, + + // Monetary stuff. + Balances: pallet_balances = 10, + TransactionPayment: pallet_transaction_payment = 11, + + // Collator support. The order of these 5 are important and shall not change. + Authorship: pallet_authorship = 20, + CollatorSelection: pallet_collator_selection = 21, + Session: pallet_session = 22, + Aura: pallet_aura = 23, + AuraExt: cumulus_pallet_aura_ext = 24, + + // XCM & related + XcmpQueue: cumulus_pallet_xcmp_queue = 30, + PolkadotXcm: pallet_xcm = 31, + CumulusXcm: cumulus_pallet_xcm = 32, + MessageQueue: pallet_message_queue = 34, + + // Handy utilities. + Utility: pallet_utility = 40, + Multisig: pallet_multisig = 41, + + // The main stage. + Broker: pallet_broker = 50, + + // Sudo + Sudo: pallet_sudo = 100, + } +); + +#[cfg(feature = "runtime-benchmarks")] +mod benches { + frame_benchmarking::define_benchmarks!( + [frame_system, SystemBench::] + [cumulus_pallet_parachain_system, ParachainSystem] + [pallet_timestamp, Timestamp] + [pallet_balances, Balances] + [pallet_broker, Broker] + [pallet_collator_selection, CollatorSelection] + [pallet_session, SessionBench::] + [cumulus_pallet_xcmp_queue, XcmpQueue] + [pallet_xcm, PalletXcmExtrinsicsBenchmark::] + [pallet_message_queue, MessageQueue] + [pallet_multisig, Multisig] + [pallet_utility, Utility] + // NOTE: Make sure you point to the individual modules below. + [pallet_xcm_benchmarks::fungible, XcmBalances] + [pallet_xcm_benchmarks::generic, XcmGeneric] + ); +} + +impl_runtime_apis! { + impl sp_consensus_aura::AuraApi for Runtime { + fn slot_duration() -> sp_consensus_aura::SlotDuration { + sp_consensus_aura::SlotDuration::from_millis(Aura::slot_duration()) + } + + fn authorities() -> Vec { + Aura::authorities().into_inner() + } + } + + impl sp_api::Core for Runtime { + fn version() -> RuntimeVersion { + VERSION + } + + fn execute_block(block: Block) { + Executive::execute_block(block) + } + + fn initialize_block(header: &::Header) { + Executive::initialize_block(header) + } + } + + impl sp_api::Metadata for Runtime { + fn metadata() -> OpaqueMetadata { + OpaqueMetadata::new(Runtime::metadata().into()) + } + + fn metadata_at_version(version: u32) -> Option { + Runtime::metadata_at_version(version) + } + + fn metadata_versions() -> sp_std::vec::Vec { + Runtime::metadata_versions() + } + } + + impl sp_block_builder::BlockBuilder for Runtime { + fn apply_extrinsic(extrinsic: ::Extrinsic) -> ApplyExtrinsicResult { + Executive::apply_extrinsic(extrinsic) + } + + fn finalize_block() -> ::Header { + Executive::finalize_block() + } + + fn inherent_extrinsics(data: sp_inherents::InherentData) -> Vec<::Extrinsic> { + data.create_extrinsics() + } + + fn check_inherents( + block: Block, + data: sp_inherents::InherentData, + ) -> sp_inherents::CheckInherentsResult { + data.check_extrinsics(&block) + } + } + + impl sp_transaction_pool::runtime_api::TaggedTransactionQueue for Runtime { + fn validate_transaction( + source: TransactionSource, + tx: ::Extrinsic, + block_hash: ::Hash, + ) -> TransactionValidity { + Executive::validate_transaction(source, tx, block_hash) + } + } + + impl sp_offchain::OffchainWorkerApi for Runtime { + fn offchain_worker(header: &::Header) { + Executive::offchain_worker(header) + } + } + + impl sp_session::SessionKeys for Runtime { + fn generate_session_keys(seed: Option>) -> Vec { + SessionKeys::generate(seed) + } + + fn decode_session_keys( + encoded: Vec, + ) -> Option, KeyTypeId)>> { + SessionKeys::decode_into_raw_public_keys(&encoded) + } + } + + impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime { + fn account_nonce(account: AccountId) -> Nonce { + System::account_nonce(account) + } + } + + impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi for Runtime { + fn query_info( + uxt: ::Extrinsic, + len: u32, + ) -> pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo { + TransactionPayment::query_info(uxt, len) + } + fn query_fee_details( + uxt: ::Extrinsic, + len: u32, + ) -> pallet_transaction_payment::FeeDetails { + TransactionPayment::query_fee_details(uxt, len) + } + fn query_weight_to_fee(weight: Weight) -> Balance { + TransactionPayment::weight_to_fee(weight) + } + fn query_length_to_fee(length: u32) -> Balance { + TransactionPayment::length_to_fee(length) + } + } + + impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentCallApi + for Runtime + { + fn query_call_info( + call: RuntimeCall, + len: u32, + ) -> pallet_transaction_payment::RuntimeDispatchInfo { + TransactionPayment::query_call_info(call, len) + } + fn query_call_fee_details( + call: RuntimeCall, + len: u32, + ) -> pallet_transaction_payment::FeeDetails { + TransactionPayment::query_call_fee_details(call, len) + } + fn query_weight_to_fee(weight: Weight) -> Balance { + TransactionPayment::weight_to_fee(weight) + } + fn query_length_to_fee(length: u32) -> Balance { + TransactionPayment::length_to_fee(length) + } + } + + impl cumulus_primitives_core::CollectCollationInfo for Runtime { + fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { + ParachainSystem::collect_collation_info(header) + } + } + + #[cfg(feature = "try-runtime")] + impl frame_try_runtime::TryRuntime for Runtime { + fn on_runtime_upgrade(checks: frame_try_runtime::UpgradeCheckSelect) -> (Weight, Weight) { + let weight = Executive::try_runtime_upgrade(checks).unwrap(); + (weight, RuntimeBlockWeights::get().max_block) + } + + fn execute_block( + block: Block, + state_root_check: bool, + signature_check: bool, + select: frame_try_runtime::TryStateSelect, + ) -> Weight { + // NOTE: intentional unwrap: we don't want to propagate the error backwards, and want to + // have a backtrace here. + Executive::try_execute_block(block, state_root_check, signature_check, select).unwrap() + } + } + + #[cfg(feature = "runtime-benchmarks")] + impl frame_benchmarking::Benchmark for Runtime { + fn benchmark_metadata(extra: bool) -> ( + Vec, + Vec, + ) { + use frame_benchmarking::{Benchmarking, BenchmarkList}; + use frame_support::traits::StorageInfoTrait; + use frame_system_benchmarking::Pallet as SystemBench; + use cumulus_pallet_session_benchmarking::Pallet as SessionBench; + use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsicsBenchmark; + + // This is defined once again in dispatch_benchmark, because list_benchmarks! + // and add_benchmarks! are macros exported by define_benchmarks! macros and those types + // are referenced in that call. + type XcmBalances = pallet_xcm_benchmarks::fungible::Pallet::; + type XcmGeneric = pallet_xcm_benchmarks::generic::Pallet::; + + let mut list = Vec::::new(); + list_benchmarks!(list, extra); + + let storage_info = AllPalletsWithSystem::storage_info(); + (list, storage_info) + } + + fn dispatch_benchmark( + config: frame_benchmarking::BenchmarkConfig + ) -> Result, sp_runtime::RuntimeString> { + use frame_benchmarking::{Benchmarking, BenchmarkBatch, BenchmarkError}; + use sp_storage::TrackedStorageKey; + + use frame_system_benchmarking::Pallet as SystemBench; + impl frame_system_benchmarking::Config for Runtime { + fn setup_set_code_requirements(code: &sp_std::vec::Vec) -> Result<(), BenchmarkError> { + ParachainSystem::initialize_for_set_code_benchmark(code.len() as u32); + Ok(()) + } + + fn verify_set_code() { + System::assert_last_event(cumulus_pallet_parachain_system::Event::::ValidationFunctionStored.into()); + } + } + + use cumulus_pallet_session_benchmarking::Pallet as SessionBench; + impl cumulus_pallet_session_benchmarking::Config for Runtime {} + + use xcm::latest::prelude::*; + use xcm_config::RocRelayLocation; + + use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsicsBenchmark; + impl pallet_xcm::benchmarking::Config for Runtime { + fn reachable_dest() -> Option { + Some(Parent.into()) + } + + fn teleportable_asset_and_dest() -> Option<(MultiAsset, MultiLocation)> { + // Relay/native token can be teleported between AH and Relay. + Some(( + MultiAsset { + fun: Fungible(EXISTENTIAL_DEPOSIT), + id: Concrete(Parent.into()) + }, + Parent.into(), + )) + } + + fn reserve_transferable_asset_and_dest() -> Option<(MultiAsset, MultiLocation)> { + // Reserve transfers are disabled + None + } + } + + parameter_types! { + pub ExistentialDepositMultiAsset: Option = Some(( + RocRelayLocation::get(), + ExistentialDeposit::get() + ).into()); + } + + impl pallet_xcm_benchmarks::Config for Runtime { + type XcmConfig = xcm_config::XcmConfig; + type DeliveryHelper = cumulus_primitives_utility::ToParentDeliveryHelper< + xcm_config::XcmConfig, + ExistentialDepositMultiAsset, + xcm_config::PriceForParentDelivery, + >; + type AccountIdConverter = xcm_config::LocationToAccountId; + fn valid_destination() -> Result { + Ok(RocRelayLocation::get()) + } + fn worst_case_holding(_depositable_count: u32) -> MultiAssets { + // just concrete assets according to relay chain. + let assets: Vec = vec![ + MultiAsset { + id: Concrete(RocRelayLocation::get()), + fun: Fungible(1_000_000 * UNITS), + } + ]; + assets.into() + } + } + + parameter_types! { + pub const TrustedTeleporter: Option<(MultiLocation, MultiAsset)> = Some(( + RocRelayLocation::get(), + MultiAsset { fun: Fungible(UNITS), id: Concrete(RocRelayLocation::get()) }, + )); + pub const CheckedAccount: Option<(AccountId, xcm_builder::MintLocation)> = None; + pub const TrustedReserve: Option<(MultiLocation, MultiAsset)> = None; + } + + impl pallet_xcm_benchmarks::fungible::Config for Runtime { + type TransactAsset = Balances; + + type CheckedAccount = CheckedAccount; + type TrustedTeleporter = TrustedTeleporter; + type TrustedReserve = TrustedReserve; + + fn get_multi_asset() -> MultiAsset { + MultiAsset { + id: Concrete(RocRelayLocation::get()), + fun: Fungible(UNITS), + } + } + } + + impl pallet_xcm_benchmarks::generic::Config for Runtime { + type RuntimeCall = RuntimeCall; + type TransactAsset = Balances; + + fn worst_case_response() -> (u64, Response) { + (0u64, Response::Version(Default::default())) + } + + fn worst_case_asset_exchange() -> Result<(MultiAssets, MultiAssets), BenchmarkError> { + Err(BenchmarkError::Skip) + } + + fn universal_alias() -> Result<(MultiLocation, Junction), BenchmarkError> { + Err(BenchmarkError::Skip) + } + + fn transact_origin_and_runtime_call() -> Result<(MultiLocation, RuntimeCall), BenchmarkError> { + Ok((RocRelayLocation::get(), frame_system::Call::remark_with_event { remark: vec![] }.into())) + } + + fn subscribe_origin() -> Result { + Ok(RocRelayLocation::get()) + } + + fn claimable_asset() -> Result<(MultiLocation, MultiLocation, MultiAssets), BenchmarkError> { + let origin = RocRelayLocation::get(); + let assets: MultiAssets = (Concrete(RocRelayLocation::get()), 1_000 * UNITS).into(); + let ticket = MultiLocation { parents: 0, interior: Here }; + Ok((origin, ticket, assets)) + } + + fn unlockable_asset() -> Result<(MultiLocation, MultiLocation, MultiAsset), BenchmarkError> { + Err(BenchmarkError::Skip) + } + + fn export_message_origin_and_destination( + ) -> Result<(MultiLocation, NetworkId, InteriorMultiLocation), BenchmarkError> { + Err(BenchmarkError::Skip) + } + + fn alias_origin() -> Result<(MultiLocation, MultiLocation), BenchmarkError> { + Err(BenchmarkError::Skip) + } + } + + type XcmBalances = pallet_xcm_benchmarks::fungible::Pallet::; + type XcmGeneric = pallet_xcm_benchmarks::generic::Pallet::; + + let whitelist: Vec = vec![ + // Block Number + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac").to_vec().into(), + // Total Issuance + hex_literal::hex!("c2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80").to_vec().into(), + // Execution Phase + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7ff553b5a9862a516939d82b3d3d8661a").to_vec().into(), + // Event Count + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef70a98fdbe9ce6c55837576c60c7af3850").to_vec().into(), + // System Events + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7").to_vec().into(), + ]; + + let mut batches = Vec::::new(); + let params = (&config, &whitelist); + add_benchmarks!(params, batches); + + Ok(batches) + } + } + + impl sp_genesis_builder::GenesisBuilder for Runtime { + fn create_default_config() -> Vec { + create_default_config::() + } + + fn build_config(config: Vec) -> sp_genesis_builder::Result { + build_config::(config) + } + } +} + +cumulus_pallet_parachain_system::register_validate_block! { + Runtime = Runtime, + BlockExecutor = cumulus_pallet_aura_ext::BlockExecutor::, +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/block_weights.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/block_weights.rs new file mode 100644 index 00000000000..b2092d875c8 --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/block_weights.rs @@ -0,0 +1,53 @@ +// This file is part of Substrate. + +// Copyright (C) 2022 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +pub mod constants { + use frame_support::{ + parameter_types, + weights::{constants, Weight}, + }; + + parameter_types! { + /// Importing a block with 0 Extrinsics. + pub const BlockExecutionWeight: Weight = + Weight::from_parts(constants::WEIGHT_REF_TIME_PER_NANOS.saturating_mul(5_000_000), 0); + } + + #[cfg(test)] + mod test_weights { + use frame_support::weights::constants; + + /// Checks that the weight exists and is sane. + // NOTE: If this test fails but you are sure that the generated values are fine, + // you can delete it. + #[test] + fn sane() { + let w = super::constants::BlockExecutionWeight::get(); + + // At least 100 µs. + assert!( + w.ref_time() >= 100u64 * constants::WEIGHT_REF_TIME_PER_MICROS, + "Weight should be at least 100 µs." + ); + // At most 50 ms. + assert!( + w.ref_time() <= 50u64 * constants::WEIGHT_REF_TIME_PER_MILLIS, + "Weight should be at most 50 ms." + ); + } + } +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/cumulus_pallet_parachain_system.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/cumulus_pallet_parachain_system.rs new file mode 100644 index 00000000000..f7a1486ed58 --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/cumulus_pallet_parachain_system.rs @@ -0,0 +1,71 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +//! Autogenerated weights for `cumulus_pallet_parachain_system` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-12-07, STEPS: `2`, REPEAT: `1`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `dagda.local`, CPU: `` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-rococo-dev")`, DB CACHE: 1024 + +// Executed Command: +// target/release/polkadot-parachain +// benchmark +// pallet +// --chain=coretime-rococo-dev +// --wasm-execution=compiled +// --pallet=cumulus_pallet_parachain_system +// --extrinsic=* +// --steps=2 +// --repeat=1 +// --json +// --header=./cumulus/file_header.txt +// --output=./cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/ + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `cumulus_pallet_parachain_system`. +pub struct WeightInfo(PhantomData); +impl cumulus_pallet_parachain_system::WeightInfo for WeightInfo { + /// Storage: `ParachainSystem::LastDmqMqcHead` (r:1 w:1) + /// Proof: `ParachainSystem::LastDmqMqcHead` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `MessageQueue::BookStateFor` (r:1 w:1) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + /// Storage: `MessageQueue::ServiceHead` (r:1 w:1) + /// Proof: `MessageQueue::ServiceHead` (`max_values`: Some(1), `max_size`: Some(5), added: 500, mode: `MaxEncodedLen`) + /// Storage: `ParachainSystem::ProcessedDownwardMessages` (r:0 w:1) + /// Proof: `ParachainSystem::ProcessedDownwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `MessageQueue::Pages` (r:0 w:1000) + /// Proof: `MessageQueue::Pages` (`max_values`: None, `max_size`: Some(65585), added: 68060, mode: `MaxEncodedLen`) + /// The range of component `n` is `[0, 1000]`. + fn enqueue_inbound_downward_messages(_n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `42` + // Estimated: `3517` + // Minimum execution time: 3_000_000 picoseconds. + Weight::from_parts(144_747_000_000, 0) + .saturating_add(Weight::from_parts(0, 3517)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(1004)) + } +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/cumulus_pallet_xcmp_queue.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/cumulus_pallet_xcmp_queue.rs new file mode 100644 index 00000000000..f5683f747a3 --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/cumulus_pallet_xcmp_queue.rs @@ -0,0 +1,152 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +//! Autogenerated weights for `cumulus_pallet_xcmp_queue` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-12-07, STEPS: `2`, REPEAT: `1`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `dagda.local`, CPU: `` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-rococo-dev")`, DB CACHE: 1024 + +// Executed Command: +// target/release/polkadot-parachain +// benchmark +// pallet +// --chain=coretime-rococo-dev +// --wasm-execution=compiled +// --pallet=cumulus_pallet_xcmp_queue +// --extrinsic=* +// --steps=2 +// --repeat=1 +// --json +// --header=./cumulus/file_header.txt +// --output=./cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/ + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `cumulus_pallet_xcmp_queue`. +pub struct WeightInfo(PhantomData); +impl cumulus_pallet_xcmp_queue::WeightInfo for WeightInfo { + /// Storage: `XcmpQueue::QueueConfig` (r:1 w:1) + /// Proof: `XcmpQueue::QueueConfig` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn set_config_with_u32() -> Weight { + // Proof Size summary in bytes: + // Measured: `76` + // Estimated: `1561` + // Minimum execution time: 6_000_000 picoseconds. + Weight::from_parts(6_000_000, 0) + .saturating_add(Weight::from_parts(0, 1561)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `XcmpQueue::QueueConfig` (r:1 w:0) + /// Proof: `XcmpQueue::QueueConfig` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `MessageQueue::BookStateFor` (r:1 w:1) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + /// Storage: `MessageQueue::ServiceHead` (r:1 w:1) + /// Proof: `MessageQueue::ServiceHead` (`max_values`: Some(1), `max_size`: Some(5), added: 500, mode: `MaxEncodedLen`) + /// Storage: `XcmpQueue::InboundXcmpSuspended` (r:1 w:0) + /// Proof: `XcmpQueue::InboundXcmpSuspended` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `MessageQueue::Pages` (r:0 w:1) + /// Proof: `MessageQueue::Pages` (`max_values`: None, `max_size`: Some(65585), added: 68060, mode: `MaxEncodedLen`) + fn enqueue_xcmp_message() -> Weight { + // Proof Size summary in bytes: + // Measured: `82` + // Estimated: `3517` + // Minimum execution time: 13_000_000 picoseconds. + Weight::from_parts(13_000_000, 0) + .saturating_add(Weight::from_parts(0, 3517)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:1) + /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn suspend_channel() -> Weight { + // Proof Size summary in bytes: + // Measured: `76` + // Estimated: `1561` + // Minimum execution time: 3_000_000 picoseconds. + Weight::from_parts(3_000_000, 0) + .saturating_add(Weight::from_parts(0, 1561)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:1) + /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn resume_channel() -> Weight { + // Proof Size summary in bytes: + // Measured: `111` + // Estimated: `1596` + // Minimum execution time: 4_000_000 picoseconds. + Weight::from_parts(4_000_000, 0) + .saturating_add(Weight::from_parts(0, 1596)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + fn take_first_concatenated_xcm() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 42_000_000 picoseconds. + Weight::from_parts(42_000_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + /// Storage: UNKNOWN KEY `0x7b3237373ffdfeb1cab4222e3b520d6b345d8e88afa015075c945637c07e8f20` (r:1 w:1) + /// Proof: UNKNOWN KEY `0x7b3237373ffdfeb1cab4222e3b520d6b345d8e88afa015075c945637c07e8f20` (r:1 w:1) + /// Storage: UNKNOWN KEY `0x7b3237373ffdfeb1cab4222e3b520d6bedc49980ba3aa32b0a189290fd036649` (r:1 w:1) + /// Proof: UNKNOWN KEY `0x7b3237373ffdfeb1cab4222e3b520d6bedc49980ba3aa32b0a189290fd036649` (r:1 w:1) + /// Storage: `MessageQueue::BookStateFor` (r:1 w:1) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + /// Storage: `MessageQueue::ServiceHead` (r:1 w:1) + /// Proof: `MessageQueue::ServiceHead` (`max_values`: Some(1), `max_size`: Some(5), added: 500, mode: `MaxEncodedLen`) + /// Storage: `XcmpQueue::QueueConfig` (r:1 w:0) + /// Proof: `XcmpQueue::QueueConfig` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `XcmpQueue::InboundXcmpSuspended` (r:1 w:0) + /// Proof: `XcmpQueue::InboundXcmpSuspended` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `MessageQueue::Pages` (r:0 w:1) + /// Proof: `MessageQueue::Pages` (`max_values`: None, `max_size`: Some(65585), added: 68060, mode: `MaxEncodedLen`) + fn on_idle_good_msg() -> Weight { + // Proof Size summary in bytes: + // Measured: `65711` + // Estimated: `69176` + // Minimum execution time: 86_000_000 picoseconds. + Weight::from_parts(86_000_000, 0) + .saturating_add(Weight::from_parts(0, 69176)) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(5)) + } + /// Storage: UNKNOWN KEY `0x7b3237373ffdfeb1cab4222e3b520d6b345d8e88afa015075c945637c07e8f20` (r:1 w:1) + /// Proof: UNKNOWN KEY `0x7b3237373ffdfeb1cab4222e3b520d6b345d8e88afa015075c945637c07e8f20` (r:1 w:1) + /// Storage: UNKNOWN KEY `0x7b3237373ffdfeb1cab4222e3b520d6bedc49980ba3aa32b0a189290fd036649` (r:1 w:1) + /// Proof: UNKNOWN KEY `0x7b3237373ffdfeb1cab4222e3b520d6bedc49980ba3aa32b0a189290fd036649` (r:1 w:1) + fn on_idle_large_msg() -> Weight { + // Proof Size summary in bytes: + // Measured: `65710` + // Estimated: `69175` + // Minimum execution time: 79_000_000 picoseconds. + Weight::from_parts(79_000_000, 0) + .saturating_add(Weight::from_parts(0, 69175)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/extrinsic_weights.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/extrinsic_weights.rs new file mode 100644 index 00000000000..332c3b324bb --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/extrinsic_weights.rs @@ -0,0 +1,53 @@ +// This file is part of Substrate. + +// Copyright (C) 2022 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +pub mod constants { + use frame_support::{ + parameter_types, + weights::{constants, Weight}, + }; + + parameter_types! { + /// Executing a NO-OP `System::remarks` Extrinsic. + pub const ExtrinsicBaseWeight: Weight = + Weight::from_parts(constants::WEIGHT_REF_TIME_PER_NANOS.saturating_mul(125_000), 0); + } + + #[cfg(test)] + mod test_weights { + use frame_support::weights::constants; + + /// Checks that the weight exists and is sane. + // NOTE: If this test fails but you are sure that the generated values are fine, + // you can delete it. + #[test] + fn sane() { + let w = super::constants::ExtrinsicBaseWeight::get(); + + // At least 10 µs. + assert!( + w.ref_time() >= 10u64 * constants::WEIGHT_REF_TIME_PER_MICROS, + "Weight should be at least 10 µs." + ); + // At most 1 ms. + assert!( + w.ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, + "Weight should be at most 1 ms." + ); + } + } +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/frame_system.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/frame_system.rs new file mode 100644 index 00000000000..aee05e2b2a9 --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/frame_system.rs @@ -0,0 +1,141 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +//! Autogenerated weights for `frame_system` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-12-07, STEPS: `2`, REPEAT: `1`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `dagda.local`, CPU: `` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-rococo-dev")`, DB CACHE: 1024 + +// Executed Command: +// target/release/polkadot-parachain +// benchmark +// pallet +// --chain=coretime-rococo-dev +// --wasm-execution=compiled +// --pallet=frame_system +// --extrinsic=* +// --steps=2 +// --repeat=1 +// --json +// --header=./cumulus/file_header.txt +// --output=./cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/ + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `frame_system`. +pub struct WeightInfo(PhantomData); +impl frame_system::WeightInfo for WeightInfo { + /// The range of component `b` is `[0, 3932160]`. + fn remark(_b: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 3_000_000 picoseconds. + Weight::from_parts(775_000_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + /// The range of component `b` is `[0, 3932160]`. + fn remark_with_event(_b: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 8_000_000 picoseconds. + Weight::from_parts(4_700_000_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + /// Storage: `System::Digest` (r:1 w:1) + /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: UNKNOWN KEY `0x3a686561707061676573` (r:0 w:1) + /// Proof: UNKNOWN KEY `0x3a686561707061676573` (r:0 w:1) + fn set_heap_pages() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `1485` + // Minimum execution time: 5_000_000 picoseconds. + Weight::from_parts(5_000_000, 0) + .saturating_add(Weight::from_parts(0, 1485)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `ParachainSystem::ValidationData` (r:1 w:0) + /// Proof: `ParachainSystem::ValidationData` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::UpgradeRestrictionSignal` (r:1 w:0) + /// Proof: `ParachainSystem::UpgradeRestrictionSignal` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingValidationCode` (r:1 w:1) + /// Proof: `ParachainSystem::PendingValidationCode` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::NewValidationCode` (r:0 w:1) + /// Proof: `ParachainSystem::NewValidationCode` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::DidSetValidationCode` (r:0 w:1) + /// Proof: `ParachainSystem::DidSetValidationCode` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn set_code() -> Weight { + // Proof Size summary in bytes: + // Measured: `164` + // Estimated: `1649` + // Minimum execution time: 79_510_000_000 picoseconds. + Weight::from_parts(79_510_000_000, 0) + .saturating_add(Weight::from_parts(0, 1649)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: `Skipped::Metadata` (r:0 w:0) + /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// The range of component `i` is `[0, 1000]`. + fn set_storage(_i: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 4_000_000 picoseconds. + Weight::from_parts(816_000_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1000)) + } + /// Storage: `Skipped::Metadata` (r:0 w:0) + /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// The range of component `i` is `[0, 1000]`. + fn kill_storage(_i: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 3_000_000 picoseconds. + Weight::from_parts(598_000_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1000)) + } + /// Storage: `Skipped::Metadata` (r:0 w:0) + /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// The range of component `p` is `[0, 1000]`. + fn kill_prefix(_p: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `55 + p * (69 ±0)` + // Estimated: `69609` + // Minimum execution time: 6_000_000 picoseconds. + Weight::from_parts(1_091_000_000, 0) + .saturating_add(Weight::from_parts(0, 69609)) + .saturating_add(T::DbWeight::get().reads(1000)) + .saturating_add(T::DbWeight::get().writes(1000)) + } +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/mod.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/mod.rs new file mode 100644 index 00000000000..7b17d84ac34 --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/mod.rs @@ -0,0 +1,41 @@ +// This file is part of Substrate. + +// Copyright (C) 2022 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Expose the auto generated weight files. + +pub mod block_weights; +pub mod cumulus_pallet_parachain_system; +pub mod cumulus_pallet_xcmp_queue; +pub mod extrinsic_weights; +pub mod frame_system; +pub mod pallet_balances; +pub mod pallet_broker; +pub mod pallet_collator_selection; +pub mod pallet_message_queue; +pub mod pallet_multisig; +pub mod pallet_session; +pub mod pallet_timestamp; +pub mod pallet_utility; +pub mod pallet_xcm; +pub mod paritydb_weights; +pub mod rocksdb_weights; +pub mod xcm; + +pub use block_weights::constants::BlockExecutionWeight; +pub use extrinsic_weights::constants::ExtrinsicBaseWeight; +pub use paritydb_weights::constants::ParityDbWeight; +pub use rocksdb_weights::constants::RocksDbWeight; diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_balances.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_balances.rs new file mode 100644 index 00000000000..ee12da7c436 --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_balances.rs @@ -0,0 +1,147 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +//! Autogenerated weights for `pallet_balances` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-12-07, STEPS: `2`, REPEAT: `1`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `dagda.local`, CPU: `` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-rococo-dev")`, DB CACHE: 1024 + +// Executed Command: +// target/release/polkadot-parachain +// benchmark +// pallet +// --chain=coretime-rococo-dev +// --wasm-execution=compiled +// --pallet=pallet_balances +// --extrinsic=* +// --steps=2 +// --repeat=1 +// --json +// --header=./cumulus/file_header.txt +// --output=./cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/ + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_balances`. +pub struct WeightInfo(PhantomData); +impl pallet_balances::WeightInfo for WeightInfo { + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + fn transfer_allow_death() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `3593` + // Minimum execution time: 55_000_000 picoseconds. + Weight::from_parts(55_000_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + fn transfer_keep_alive() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `3593` + // Minimum execution time: 42_000_000 picoseconds. + Weight::from_parts(42_000_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + fn force_set_balance_creating() -> Weight { + // Proof Size summary in bytes: + // Measured: `103` + // Estimated: `3593` + // Minimum execution time: 15_000_000 picoseconds. + Weight::from_parts(15_000_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + fn force_set_balance_killing() -> Weight { + // Proof Size summary in bytes: + // Measured: `103` + // Estimated: `3593` + // Minimum execution time: 21_000_000 picoseconds. + Weight::from_parts(21_000_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `System::Account` (r:2 w:2) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + fn force_transfer() -> Weight { + // Proof Size summary in bytes: + // Measured: `103` + // Estimated: `6196` + // Minimum execution time: 66_000_000 picoseconds. + Weight::from_parts(66_000_000, 0) + .saturating_add(Weight::from_parts(0, 6196)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + fn transfer_all() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `3593` + // Minimum execution time: 53_000_000 picoseconds. + Weight::from_parts(53_000_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + fn force_unreserve() -> Weight { + // Proof Size summary in bytes: + // Measured: `103` + // Estimated: `3593` + // Minimum execution time: 22_000_000 picoseconds. + Weight::from_parts(22_000_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `System::Account` (r:1000 w:1000) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// The range of component `u` is `[1, 1000]`. + fn upgrade_accounts(_u: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0 + u * (135 ±0)` + // Estimated: `2603990` + // Minimum execution time: 20_000_000 picoseconds. + Weight::from_parts(14_684_000_000, 0) + .saturating_add(Weight::from_parts(0, 2603990)) + .saturating_add(T::DbWeight::get().reads(1000)) + .saturating_add(T::DbWeight::get().writes(1000)) + } +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_broker.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_broker.rs new file mode 100644 index 00000000000..c33cc422d11 --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_broker.rs @@ -0,0 +1,484 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +//! Autogenerated weights for `pallet_broker` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-12-07, STEPS: `2`, REPEAT: `1`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `dagda.local`, CPU: `` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-rococo-dev")`, DB CACHE: 1024 + +// Executed Command: +// target/release/polkadot-parachain +// benchmark +// pallet +// --chain=coretime-rococo-dev +// --wasm-execution=compiled +// --pallet=pallet_broker +// --extrinsic=* +// --steps=2 +// --repeat=1 +// --json +// --header=./cumulus/file_header.txt +// --output=./cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/ + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_broker`. +pub struct WeightInfo(PhantomData); +impl pallet_broker::WeightInfo for WeightInfo { + /// Storage: `Broker::Configuration` (r:0 w:1) + /// Proof: `Broker::Configuration` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`) + fn configure() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 4_000_000 picoseconds. + Weight::from_parts(4_000_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Broker::Reservations` (r:1 w:1) + /// Proof: `Broker::Reservations` (`max_values`: Some(1), `max_size`: Some(6011), added: 6506, mode: `MaxEncodedLen`) + fn reserve() -> Weight { + // Proof Size summary in bytes: + // Measured: `4878` + // Estimated: `7496` + // Minimum execution time: 31_000_000 picoseconds. + Weight::from_parts(31_000_000, 0) + .saturating_add(Weight::from_parts(0, 7496)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Broker::Reservations` (r:1 w:1) + /// Proof: `Broker::Reservations` (`max_values`: Some(1), `max_size`: Some(6011), added: 6506, mode: `MaxEncodedLen`) + fn unreserve() -> Weight { + // Proof Size summary in bytes: + // Measured: `6080` + // Estimated: `7496` + // Minimum execution time: 24_000_000 picoseconds. + Weight::from_parts(24_000_000, 0) + .saturating_add(Weight::from_parts(0, 7496)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Broker::Leases` (r:1 w:1) + /// Proof: `Broker::Leases` (`max_values`: Some(1), `max_size`: Some(41), added: 536, mode: `MaxEncodedLen`) + fn set_lease() -> Weight { + // Proof Size summary in bytes: + // Measured: `101` + // Estimated: `1526` + // Minimum execution time: 12_000_000 picoseconds. + Weight::from_parts(12_000_000, 0) + .saturating_add(Weight::from_parts(0, 1526)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Broker::Configuration` (r:1 w:0) + /// Proof: `Broker::Configuration` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`) + /// Storage: `Broker::InstaPoolIo` (r:3 w:3) + /// Proof: `Broker::InstaPoolIo` (`max_values`: None, `max_size`: Some(28), added: 2503, mode: `MaxEncodedLen`) + /// Storage: `Broker::Reservations` (r:1 w:0) + /// Proof: `Broker::Reservations` (`max_values`: Some(1), `max_size`: Some(6011), added: 6506, mode: `MaxEncodedLen`) + /// Storage: `Broker::Leases` (r:1 w:1) + /// Proof: `Broker::Leases` (`max_values`: Some(1), `max_size`: Some(41), added: 536, mode: `MaxEncodedLen`) + /// Storage: `Broker::SaleInfo` (r:0 w:1) + /// Proof: `Broker::SaleInfo` (`max_values`: Some(1), `max_size`: Some(57), added: 552, mode: `MaxEncodedLen`) + /// Storage: `Broker::Status` (r:0 w:1) + /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) + /// Storage: `Broker::Workplan` (r:0 w:10) + /// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`) + /// The range of component `n` is `[0, 1000]`. + fn start_sales(_n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `6192` + // Estimated: `8499` + // Minimum execution time: 55_000_000 picoseconds. + Weight::from_parts(57_000_000, 0) + .saturating_add(Weight::from_parts(0, 8499)) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(16)) + } + /// Storage: `Broker::Status` (r:1 w:0) + /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) + /// Storage: `Broker::SaleInfo` (r:1 w:1) + /// Proof: `Broker::SaleInfo` (`max_values`: Some(1), `max_size`: Some(57), added: 552, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:0) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Broker::Regions` (r:0 w:1) + /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) + fn purchase() -> Weight { + // Proof Size summary in bytes: + // Measured: `316` + // Estimated: `3593` + // Minimum execution time: 40_000_000 picoseconds. + Weight::from_parts(40_000_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `Broker::Configuration` (r:1 w:0) + /// Proof: `Broker::Configuration` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`) + /// Storage: `Broker::Status` (r:1 w:0) + /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) + /// Storage: `Broker::SaleInfo` (r:1 w:1) + /// Proof: `Broker::SaleInfo` (`max_values`: Some(1), `max_size`: Some(57), added: 552, mode: `MaxEncodedLen`) + /// Storage: `Broker::AllowedRenewals` (r:1 w:2) + /// Proof: `Broker::AllowedRenewals` (`max_values`: None, `max_size`: Some(1233), added: 3708, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:0) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Broker::Workplan` (r:0 w:1) + /// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`) + fn renew() -> Weight { + // Proof Size summary in bytes: + // Measured: `434` + // Estimated: `4698` + // Minimum execution time: 58_000_000 picoseconds. + Weight::from_parts(58_000_000, 0) + .saturating_add(Weight::from_parts(0, 4698)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(4)) + } + /// Storage: `Broker::Regions` (r:1 w:1) + /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) + fn transfer() -> Weight { + // Proof Size summary in bytes: + // Measured: `357` + // Estimated: `3550` + // Minimum execution time: 19_000_000 picoseconds. + Weight::from_parts(19_000_000, 0) + .saturating_add(Weight::from_parts(0, 3550)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Broker::Regions` (r:1 w:2) + /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) + fn partition() -> Weight { + // Proof Size summary in bytes: + // Measured: `357` + // Estimated: `3550` + // Minimum execution time: 15_000_000 picoseconds. + Weight::from_parts(15_000_000, 0) + .saturating_add(Weight::from_parts(0, 3550)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `Broker::Regions` (r:1 w:2) + /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) + fn interlace() -> Weight { + // Proof Size summary in bytes: + // Measured: `357` + // Estimated: `3550` + // Minimum execution time: 15_000_000 picoseconds. + Weight::from_parts(15_000_000, 0) + .saturating_add(Weight::from_parts(0, 3550)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `Broker::Configuration` (r:1 w:0) + /// Proof: `Broker::Configuration` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`) + /// Storage: `Broker::Status` (r:1 w:0) + /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) + /// Storage: `Broker::Regions` (r:1 w:1) + /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) + /// Storage: `Broker::Workplan` (r:1 w:1) + /// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`) + fn assign() -> Weight { + // Proof Size summary in bytes: + // Measured: `602` + // Estimated: `4681` + // Minimum execution time: 25_000_000 picoseconds. + Weight::from_parts(25_000_000, 0) + .saturating_add(Weight::from_parts(0, 4681)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `Broker::Status` (r:1 w:0) + /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) + /// Storage: `Broker::Regions` (r:1 w:1) + /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) + /// Storage: `Broker::Workplan` (r:1 w:1) + /// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`) + /// Storage: `Broker::InstaPoolIo` (r:2 w:2) + /// Proof: `Broker::InstaPoolIo` (`max_values`: None, `max_size`: Some(28), added: 2503, mode: `MaxEncodedLen`) + /// Storage: `Broker::InstaPoolContribution` (r:0 w:1) + /// Proof: `Broker::InstaPoolContribution` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) + fn pool() -> Weight { + // Proof Size summary in bytes: + // Measured: `637` + // Estimated: `5996` + // Minimum execution time: 38_000_000 picoseconds. + Weight::from_parts(38_000_000, 0) + .saturating_add(Weight::from_parts(0, 5996)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(5)) + } + /// Storage: `Broker::InstaPoolContribution` (r:1 w:1) + /// Proof: `Broker::InstaPoolContribution` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) + /// Storage: `Broker::InstaPoolHistory` (r:3 w:1) + /// Proof: `Broker::InstaPoolHistory` (`max_values`: None, `max_size`: Some(45), added: 2520, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:2 w:2) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// The range of component `m` is `[1, 3]`. + fn claim_revenue(_m: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `721` + // Estimated: `8550` + // Minimum execution time: 65_000_000 picoseconds. + Weight::from_parts(67_000_000, 0) + .saturating_add(Weight::from_parts(0, 8550)) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(5)) + } + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn purchase_credit() -> Weight { + // Proof Size summary in bytes: + // Measured: `284` + // Estimated: `3749` + // Minimum execution time: 64_000_000 picoseconds. + Weight::from_parts(64_000_000, 0) + .saturating_add(Weight::from_parts(0, 3749)) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: `Broker::Status` (r:1 w:0) + /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) + /// Storage: `Broker::Regions` (r:1 w:1) + /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) + fn drop_region() -> Weight { + // Proof Size summary in bytes: + // Measured: `465` + // Estimated: `3550` + // Minimum execution time: 34_000_000 picoseconds. + Weight::from_parts(34_000_000, 0) + .saturating_add(Weight::from_parts(0, 3550)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Broker::Configuration` (r:1 w:0) + /// Proof: `Broker::Configuration` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`) + /// Storage: `Broker::Status` (r:1 w:0) + /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) + /// Storage: `Broker::InstaPoolContribution` (r:1 w:1) + /// Proof: `Broker::InstaPoolContribution` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) + fn drop_contribution() -> Weight { + // Proof Size summary in bytes: + // Measured: `463` + // Estimated: `3533` + // Minimum execution time: 47_000_000 picoseconds. + Weight::from_parts(47_000_000, 0) + .saturating_add(Weight::from_parts(0, 3533)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Broker::Configuration` (r:1 w:0) + /// Proof: `Broker::Configuration` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`) + /// Storage: `Broker::Status` (r:1 w:0) + /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) + /// Storage: `Broker::InstaPoolHistory` (r:1 w:1) + /// Proof: `Broker::InstaPoolHistory` (`max_values`: None, `max_size`: Some(45), added: 2520, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:0) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + fn drop_history() -> Weight { + // Proof Size summary in bytes: + // Measured: `692` + // Estimated: `3593` + // Minimum execution time: 40_000_000 picoseconds. + Weight::from_parts(40_000_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Broker::Status` (r:1 w:0) + /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) + /// Storage: `Broker::AllowedRenewals` (r:1 w:1) + /// Proof: `Broker::AllowedRenewals` (`max_values`: None, `max_size`: Some(1233), added: 3708, mode: `MaxEncodedLen`) + fn drop_renewal() -> Weight { + // Proof Size summary in bytes: + // Measured: `387` + // Estimated: `4698` + // Minimum execution time: 24_000_000 picoseconds. + Weight::from_parts(24_000_000, 0) + .saturating_add(Weight::from_parts(0, 4698)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// The range of component `n` is `[0, 1000]`. + fn request_core_count(_n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `74` + // Estimated: `3539` + // Minimum execution time: 26_000_000 picoseconds. + Weight::from_parts(27_000_000, 0) + .saturating_add(Weight::from_parts(0, 3539)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: UNKNOWN KEY `0x18194fcb5c1fcace44d2d0a004272614` (r:1 w:1) + /// Proof: UNKNOWN KEY `0x18194fcb5c1fcace44d2d0a004272614` (r:1 w:1) + /// The range of component `n` is `[0, 1000]`. + fn process_core_count(_n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `26` + // Estimated: `3491` + // Minimum execution time: 6_000_000 picoseconds. + Weight::from_parts(9_000_000, 0) + .saturating_add(Weight::from_parts(0, 3491)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1) + /// Proof: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1) + /// Storage: `Broker::InstaPoolHistory` (r:1 w:1) + /// Proof: `Broker::InstaPoolHistory` (`max_values`: None, `max_size`: Some(45), added: 2520, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:2 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + fn process_revenue() -> Weight { + // Proof Size summary in bytes: + // Measured: `515` + // Estimated: `6196` + // Minimum execution time: 49_000_000 picoseconds. + Weight::from_parts(49_000_000, 0) + .saturating_add(Weight::from_parts(0, 6196)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: `Broker::InstaPoolIo` (r:3 w:3) + /// Proof: `Broker::InstaPoolIo` (`max_values`: None, `max_size`: Some(28), added: 2503, mode: `MaxEncodedLen`) + /// Storage: `Broker::Reservations` (r:1 w:0) + /// Proof: `Broker::Reservations` (`max_values`: Some(1), `max_size`: Some(6011), added: 6506, mode: `MaxEncodedLen`) + /// Storage: `Broker::Leases` (r:1 w:1) + /// Proof: `Broker::Leases` (`max_values`: Some(1), `max_size`: Some(41), added: 536, mode: `MaxEncodedLen`) + /// Storage: `Broker::SaleInfo` (r:0 w:1) + /// Proof: `Broker::SaleInfo` (`max_values`: Some(1), `max_size`: Some(57), added: 552, mode: `MaxEncodedLen`) + /// Storage: `Broker::Workplan` (r:0 w:10) + /// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`) + /// The range of component `n` is `[0, 1000]`. + fn rotate_sale(_n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `6143` + // Estimated: `8499` + // Minimum execution time: 44_000_000 picoseconds. + Weight::from_parts(47_000_000, 0) + .saturating_add(Weight::from_parts(0, 8499)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(15)) + } + /// Storage: `Broker::InstaPoolIo` (r:1 w:0) + /// Proof: `Broker::InstaPoolIo` (`max_values`: None, `max_size`: Some(28), added: 2503, mode: `MaxEncodedLen`) + /// Storage: `Broker::InstaPoolHistory` (r:0 w:1) + /// Proof: `Broker::InstaPoolHistory` (`max_values`: None, `max_size`: Some(45), added: 2520, mode: `MaxEncodedLen`) + fn process_pool() -> Weight { + // Proof Size summary in bytes: + // Measured: `42` + // Estimated: `3493` + // Minimum execution time: 7_000_000 picoseconds. + Weight::from_parts(7_000_000, 0) + .saturating_add(Weight::from_parts(0, 3493)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Broker::Workplan` (r:1 w:1) + /// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`) + /// Storage: `Broker::Workload` (r:1 w:1) + /// Proof: `Broker::Workload` (`max_values`: None, `max_size`: Some(1212), added: 3687, mode: `MaxEncodedLen`) + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn process_core_schedule() -> Weight { + // Proof Size summary in bytes: + // Measured: `1321` + // Estimated: `4786` + // Minimum execution time: 40_000_000 picoseconds. + Weight::from_parts(40_000_000, 0) + .saturating_add(Weight::from_parts(0, 4786)) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(4)) + } + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn request_revenue_info_at() -> Weight { + // Proof Size summary in bytes: + // Measured: `74` + // Estimated: `3539` + // Minimum execution time: 19_000_000 picoseconds. + Weight::from_parts(19_000_000, 0) + .saturating_add(Weight::from_parts(0, 3539)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `Broker::Status` (r:1 w:1) + /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) + /// Storage: `Broker::Configuration` (r:1 w:0) + /// Proof: `Broker::Configuration` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`) + /// Storage: UNKNOWN KEY `0x18194fcb5c1fcace44d2d0a004272614` (r:1 w:1) + /// Proof: UNKNOWN KEY `0x18194fcb5c1fcace44d2d0a004272614` (r:1 w:1) + /// Storage: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1) + /// Proof: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1) + fn do_tick_base() -> Weight { + // Proof Size summary in bytes: + // Measured: `351` + // Estimated: `3816` + // Minimum execution time: 12_000_000 picoseconds. + Weight::from_parts(12_000_000, 0) + .saturating_add(Weight::from_parts(0, 3816)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(3)) + } +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_collator_selection.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_collator_selection.rs new file mode 100644 index 00000000000..ca740bc3550 --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_collator_selection.rs @@ -0,0 +1,265 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +//! Autogenerated weights for `pallet_collator_selection` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-12-07, STEPS: `2`, REPEAT: `1`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `dagda.local`, CPU: `` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-rococo-dev")`, DB CACHE: 1024 + +// Executed Command: +// target/release/polkadot-parachain +// benchmark +// pallet +// --chain=coretime-rococo-dev +// --wasm-execution=compiled +// --pallet=pallet_collator_selection +// --extrinsic=* +// --steps=2 +// --repeat=1 +// --json +// --header=./cumulus/file_header.txt +// --output=./cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/ + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_collator_selection`. +pub struct WeightInfo(PhantomData); +impl pallet_collator_selection::WeightInfo for WeightInfo { + /// Storage: `Session::NextKeys` (r:20 w:0) + /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `CollatorSelection::Invulnerables` (r:0 w:1) + /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) + /// The range of component `b` is `[1, 20]`. + fn set_invulnerables(_b: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `162 + b * (79 ±0)` + // Estimated: `52242` + // Minimum execution time: 14_000_000 picoseconds. + Weight::from_parts(74_000_000, 0) + .saturating_add(Weight::from_parts(0, 52242)) + .saturating_add(T::DbWeight::get().reads(20)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Session::NextKeys` (r:1 w:0) + /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `CollatorSelection::Invulnerables` (r:1 w:1) + /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) + /// Storage: `CollatorSelection::CandidateList` (r:1 w:1) + /// Proof: `CollatorSelection::CandidateList` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// The range of component `b` is `[1, 19]`. + /// The range of component `c` is `[1, 99]`. + fn add_invulnerable(b: u32, c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `796 + b * (32 ±0) + c * (52 ±0)` + // Estimated: `6287 + b * (32 ±0) + c * (53 ±0)` + // Minimum execution time: 39_000_000 picoseconds. + Weight::from_parts(37_903_628, 0) + .saturating_add(Weight::from_parts(0, 6287)) + // Standard Error: 96_225 + .saturating_add(Weight::from_parts(55_555, 0).saturating_mul(b.into())) + // Standard Error: 17_673 + .saturating_add(Weight::from_parts(40_816, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(3)) + .saturating_add(Weight::from_parts(0, 32).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(0, 53).saturating_mul(c.into())) + } + /// Storage: `CollatorSelection::CandidateList` (r:1 w:0) + /// Proof: `CollatorSelection::CandidateList` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) + /// Storage: `CollatorSelection::Invulnerables` (r:1 w:1) + /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) + /// The range of component `b` is `[5, 20]`. + fn remove_invulnerable(_b: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `82 + b * (32 ±0)` + // Estimated: `6287` + // Minimum execution time: 12_000_000 picoseconds. + Weight::from_parts(12_000_000, 0) + .saturating_add(Weight::from_parts(0, 6287)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `CollatorSelection::DesiredCandidates` (r:0 w:1) + /// Proof: `CollatorSelection::DesiredCandidates` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + fn set_desired_candidates() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 6_000_000 picoseconds. + Weight::from_parts(6_000_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `CollatorSelection::CandidacyBond` (r:1 w:1) + /// Proof: `CollatorSelection::CandidacyBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `CollatorSelection::CandidateList` (r:1 w:1) + /// Proof: `CollatorSelection::CandidateList` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:100 w:100) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `CollatorSelection::LastAuthoredBlock` (r:0 w:100) + /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) + /// The range of component `c` is `[0, 100]`. + /// The range of component `k` is `[0, 100]`. + fn set_candidacy_bond(c: u32, k: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0 + c * (179 ±0) + k * (130 ±0)` + // Estimated: `261290` + // Minimum execution time: 11_000_000 picoseconds. + Weight::from_parts(11_000_000, 0) + .saturating_add(Weight::from_parts(0, 261290)) + // Standard Error: 5_514_936 + .saturating_add(Weight::from_parts(6_438_000, 0).saturating_mul(c.into())) + // Standard Error: 5_514_936 + .saturating_add(Weight::from_parts(6_368_000, 0).saturating_mul(k.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(c.into()))) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(k.into()))) + } + /// Storage: `CollatorSelection::CandidacyBond` (r:1 w:0) + /// Proof: `CollatorSelection::CandidacyBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `CollatorSelection::CandidateList` (r:1 w:1) + /// Proof: `CollatorSelection::CandidateList` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) + /// The range of component `c` is `[4, 100]`. + fn update_bond(_c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `243 + c * (50 ±0)` + // Estimated: `6287` + // Minimum execution time: 26_000_000 picoseconds. + Weight::from_parts(36_000_000, 0) + .saturating_add(Weight::from_parts(0, 6287)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `CollatorSelection::CandidateList` (r:1 w:1) + /// Proof: `CollatorSelection::CandidateList` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) + /// Storage: `CollatorSelection::Invulnerables` (r:1 w:0) + /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) + /// Storage: `Session::NextKeys` (r:1 w:0) + /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `CollatorSelection::CandidacyBond` (r:1 w:0) + /// Proof: `CollatorSelection::CandidacyBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `CollatorSelection::LastAuthoredBlock` (r:0 w:1) + /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) + /// The range of component `c` is `[1, 99]`. + fn register_as_candidate(_c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `441 + c * (54 ±0)` + // Estimated: `9299` + // Minimum execution time: 39_000_000 picoseconds. + Weight::from_parts(40_000_000, 0) + .saturating_add(Weight::from_parts(0, 9299)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `CollatorSelection::Invulnerables` (r:1 w:0) + /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) + /// Storage: `CollatorSelection::CandidacyBond` (r:1 w:0) + /// Proof: `CollatorSelection::CandidacyBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + /// Storage: `Session::NextKeys` (r:1 w:0) + /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `CollatorSelection::CandidateList` (r:1 w:1) + /// Proof: `CollatorSelection::CandidateList` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `CollatorSelection::LastAuthoredBlock` (r:0 w:2) + /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) + /// The range of component `c` is `[4, 100]`. + fn take_candidate_slot(_c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `589 + c * (54 ±0)` + // Estimated: `9521` + // Minimum execution time: 54_000_000 picoseconds. + Weight::from_parts(59_000_000, 0) + .saturating_add(Weight::from_parts(0, 9521)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(4)) + } + /// Storage: `CollatorSelection::CandidateList` (r:1 w:1) + /// Proof: `CollatorSelection::CandidateList` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) + /// Storage: `CollatorSelection::Invulnerables` (r:1 w:0) + /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) + /// Storage: `CollatorSelection::LastAuthoredBlock` (r:0 w:1) + /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) + /// The range of component `c` is `[4, 100]`. + fn leave_intent(_c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `268 + c * (48 ±0)` + // Estimated: `6287` + // Minimum execution time: 31_000_000 picoseconds. + Weight::from_parts(38_000_000, 0) + .saturating_add(Weight::from_parts(0, 6287)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `System::Account` (r:2 w:2) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `System::BlockWeight` (r:1 w:1) + /// Proof: `System::BlockWeight` (`max_values`: Some(1), `max_size`: Some(48), added: 543, mode: `MaxEncodedLen`) + /// Storage: `CollatorSelection::LastAuthoredBlock` (r:0 w:1) + /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) + fn note_author() -> Weight { + // Proof Size summary in bytes: + // Measured: `103` + // Estimated: `6196` + // Minimum execution time: 49_000_000 picoseconds. + Weight::from_parts(49_000_000, 0) + .saturating_add(Weight::from_parts(0, 6196)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(4)) + } + /// Storage: `CollatorSelection::CandidateList` (r:1 w:0) + /// Proof: `CollatorSelection::CandidateList` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) + /// Storage: `CollatorSelection::LastAuthoredBlock` (r:100 w:0) + /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) + /// Storage: `CollatorSelection::Invulnerables` (r:1 w:0) + /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) + /// Storage: `CollatorSelection::DesiredCandidates` (r:1 w:0) + /// Proof: `CollatorSelection::DesiredCandidates` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `System::BlockWeight` (r:1 w:1) + /// Proof: `System::BlockWeight` (`max_values`: Some(1), `max_size`: Some(48), added: 543, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// The range of component `r` is `[1, 100]`. + /// The range of component `c` is `[1, 100]`. + fn new_session(r: u32, c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `340 + c * (97 ±0)` + // Estimated: `6287 + c * (2519 ±0)` + // Minimum execution time: 19_000_000 picoseconds. + Weight::from_parts(11_136_363, 0) + .saturating_add(Weight::from_parts(0, 6287)) + // Standard Error: 323_666 + .saturating_add(Weight::from_parts(35_353, 0).saturating_mul(r.into())) + // Standard Error: 323_666 + .saturating_add(Weight::from_parts(4_328_282, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into()))) + .saturating_add(T::DbWeight::get().writes(4)) + .saturating_add(Weight::from_parts(0, 2519).saturating_mul(c.into())) + } +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_message_queue.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_message_queue.rs new file mode 100644 index 00000000000..e0e8c79ca17 --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_message_queue.rs @@ -0,0 +1,178 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +//! Autogenerated weights for `pallet_message_queue` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-12-07, STEPS: `2`, REPEAT: `1`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `dagda.local`, CPU: `` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-rococo-dev")`, DB CACHE: 1024 + +// Executed Command: +// target/release/polkadot-parachain +// benchmark +// pallet +// --chain=coretime-rococo-dev +// --wasm-execution=compiled +// --pallet=pallet_message_queue +// --extrinsic=* +// --steps=2 +// --repeat=1 +// --json +// --header=./cumulus/file_header.txt +// --output=./cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/ + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_message_queue`. +pub struct WeightInfo(PhantomData); +impl pallet_message_queue::WeightInfo for WeightInfo { + /// Storage: `MessageQueue::ServiceHead` (r:1 w:0) + /// Proof: `MessageQueue::ServiceHead` (`max_values`: Some(1), `max_size`: Some(5), added: 500, mode: `MaxEncodedLen`) + /// Storage: `MessageQueue::BookStateFor` (r:2 w:2) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + fn ready_ring_knit() -> Weight { + // Proof Size summary in bytes: + // Measured: `223` + // Estimated: `6044` + // Minimum execution time: 13_000_000 picoseconds. + Weight::from_parts(13_000_000, 0) + .saturating_add(Weight::from_parts(0, 6044)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `MessageQueue::BookStateFor` (r:2 w:2) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + /// Storage: `MessageQueue::ServiceHead` (r:1 w:1) + /// Proof: `MessageQueue::ServiceHead` (`max_values`: Some(1), `max_size`: Some(5), added: 500, mode: `MaxEncodedLen`) + fn ready_ring_unknit() -> Weight { + // Proof Size summary in bytes: + // Measured: `218` + // Estimated: `6044` + // Minimum execution time: 12_000_000 picoseconds. + Weight::from_parts(12_000_000, 0) + .saturating_add(Weight::from_parts(0, 6044)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: `MessageQueue::BookStateFor` (r:1 w:1) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + fn service_queue_base() -> Weight { + // Proof Size summary in bytes: + // Measured: `6` + // Estimated: `3517` + // Minimum execution time: 4_000_000 picoseconds. + Weight::from_parts(4_000_000, 0) + .saturating_add(Weight::from_parts(0, 3517)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `MessageQueue::Pages` (r:1 w:1) + /// Proof: `MessageQueue::Pages` (`max_values`: None, `max_size`: Some(65585), added: 68060, mode: `MaxEncodedLen`) + fn service_page_base_completion() -> Weight { + // Proof Size summary in bytes: + // Measured: `72` + // Estimated: `69050` + // Minimum execution time: 7_000_000 picoseconds. + Weight::from_parts(7_000_000, 0) + .saturating_add(Weight::from_parts(0, 69050)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `MessageQueue::Pages` (r:1 w:1) + /// Proof: `MessageQueue::Pages` (`max_values`: None, `max_size`: Some(65585), added: 68060, mode: `MaxEncodedLen`) + fn service_page_base_no_completion() -> Weight { + // Proof Size summary in bytes: + // Measured: `72` + // Estimated: `69050` + // Minimum execution time: 7_000_000 picoseconds. + Weight::from_parts(7_000_000, 0) + .saturating_add(Weight::from_parts(0, 69050)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + fn service_page_item() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 65_000_000 picoseconds. + Weight::from_parts(65_000_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + /// Storage: `MessageQueue::ServiceHead` (r:1 w:1) + /// Proof: `MessageQueue::ServiceHead` (`max_values`: Some(1), `max_size`: Some(5), added: 500, mode: `MaxEncodedLen`) + /// Storage: `MessageQueue::BookStateFor` (r:1 w:0) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + fn bump_service_head() -> Weight { + // Proof Size summary in bytes: + // Measured: `171` + // Estimated: `3517` + // Minimum execution time: 8_000_000 picoseconds. + Weight::from_parts(8_000_000, 0) + .saturating_add(Weight::from_parts(0, 3517)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `MessageQueue::BookStateFor` (r:1 w:1) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + /// Storage: `MessageQueue::Pages` (r:1 w:1) + /// Proof: `MessageQueue::Pages` (`max_values`: None, `max_size`: Some(65585), added: 68060, mode: `MaxEncodedLen`) + fn reap_page() -> Weight { + // Proof Size summary in bytes: + // Measured: `65667` + // Estimated: `69050` + // Minimum execution time: 73_000_000 picoseconds. + Weight::from_parts(73_000_000, 0) + .saturating_add(Weight::from_parts(0, 69050)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `MessageQueue::BookStateFor` (r:1 w:1) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + /// Storage: `MessageQueue::Pages` (r:1 w:1) + /// Proof: `MessageQueue::Pages` (`max_values`: None, `max_size`: Some(65585), added: 68060, mode: `MaxEncodedLen`) + fn execute_overweight_page_removed() -> Weight { + // Proof Size summary in bytes: + // Measured: `65667` + // Estimated: `69050` + // Minimum execution time: 74_000_000 picoseconds. + Weight::from_parts(74_000_000, 0) + .saturating_add(Weight::from_parts(0, 69050)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `MessageQueue::BookStateFor` (r:1 w:1) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + /// Storage: `MessageQueue::Pages` (r:1 w:1) + /// Proof: `MessageQueue::Pages` (`max_values`: None, `max_size`: Some(65585), added: 68060, mode: `MaxEncodedLen`) + fn execute_overweight_page_updated() -> Weight { + // Proof Size summary in bytes: + // Measured: `65667` + // Estimated: `69050` + // Minimum execution time: 109_000_000 picoseconds. + Weight::from_parts(109_000_000, 0) + .saturating_add(Weight::from_parts(0, 69050)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_multisig.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_multisig.rs new file mode 100644 index 00000000000..421fc033e7c --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_multisig.rs @@ -0,0 +1,150 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +//! Autogenerated weights for `pallet_multisig` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-12-07, STEPS: `2`, REPEAT: `1`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `dagda.local`, CPU: `` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-rococo-dev")`, DB CACHE: 1024 + +// Executed Command: +// target/release/polkadot-parachain +// benchmark +// pallet +// --chain=coretime-rococo-dev +// --wasm-execution=compiled +// --pallet=pallet_multisig +// --extrinsic=* +// --steps=2 +// --repeat=1 +// --json +// --header=./cumulus/file_header.txt +// --output=./cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/ + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_multisig`. +pub struct WeightInfo(PhantomData); +impl pallet_multisig::WeightInfo for WeightInfo { + /// The range of component `z` is `[0, 10000]`. + fn as_multi_threshold_1(_z: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 13_000_000 picoseconds. + Weight::from_parts(16_000_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + /// Storage: `Multisig::Multisigs` (r:1 w:1) + /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) + /// The range of component `s` is `[2, 100]`. + /// The range of component `z` is `[0, 10000]`. + fn as_multi_create(_s: u32, z: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `172 + s * (3 ±0)` + // Estimated: `6811` + // Minimum execution time: 35_000_000 picoseconds. + Weight::from_parts(36_530_612, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 259 + .saturating_add(Weight::from_parts(1_650, 0).saturating_mul(z.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Multisig::Multisigs` (r:1 w:1) + /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) + /// The range of component `s` is `[3, 100]`. + /// The range of component `z` is `[0, 10000]`. + fn as_multi_approve(s: u32, z: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `282` + // Estimated: `6811` + // Minimum execution time: 21_000_000 picoseconds. + Weight::from_parts(18_422_680, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 8_928 + .saturating_add(Weight::from_parts(25_773, 0).saturating_mul(s.into())) + // Standard Error: 86 + .saturating_add(Weight::from_parts(1_250, 0).saturating_mul(z.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Multisig::Multisigs` (r:1 w:1) + /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// The range of component `s` is `[2, 100]`. + /// The range of component `z` is `[0, 10000]`. + fn as_multi_complete(_s: u32, z: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `315 + s * (34 ±0)` + // Estimated: `6811` + // Minimum execution time: 53_000_000 picoseconds. + Weight::from_parts(56_571_428, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 86 + .saturating_add(Weight::from_parts(150, 0).saturating_mul(z.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `Multisig::Multisigs` (r:1 w:1) + /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) + /// The range of component `s` is `[2, 100]`. + fn approve_as_multi_create(_s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `172 + s * (3 ±0)` + // Estimated: `6811` + // Minimum execution time: 32_000_000 picoseconds. + Weight::from_parts(35_000_000, 0) + .saturating_add(Weight::from_parts(0, 6811)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Multisig::Multisigs` (r:1 w:1) + /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) + /// The range of component `s` is `[2, 100]`. + fn approve_as_multi_approve(_s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `282` + // Estimated: `6811` + // Minimum execution time: 17_000_000 picoseconds. + Weight::from_parts(21_000_000, 0) + .saturating_add(Weight::from_parts(0, 6811)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Multisig::Multisigs` (r:1 w:1) + /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) + /// The range of component `s` is `[2, 100]`. + fn cancel_as_multi(_s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `379 + s * (2 ±0)` + // Estimated: `6811` + // Minimum execution time: 31_000_000 picoseconds. + Weight::from_parts(40_000_000, 0) + .saturating_add(Weight::from_parts(0, 6811)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_session.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_session.rs new file mode 100644 index 00000000000..5151bcaa9e4 --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_session.rs @@ -0,0 +1,78 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +//! Autogenerated weights for `pallet_session` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-12-07, STEPS: `2`, REPEAT: `1`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `dagda.local`, CPU: `` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-rococo-dev")`, DB CACHE: 1024 + +// Executed Command: +// target/release/polkadot-parachain +// benchmark +// pallet +// --chain=coretime-rococo-dev +// --wasm-execution=compiled +// --pallet=pallet_session +// --extrinsic=* +// --steps=2 +// --repeat=1 +// --json +// --header=./cumulus/file_header.txt +// --output=./cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/ + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_session`. +pub struct WeightInfo(PhantomData); +impl pallet_session::WeightInfo for WeightInfo { + /// Storage: `Session::NextKeys` (r:1 w:1) + /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Session::KeyOwner` (r:1 w:1) + /// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn set_keys() -> Weight { + // Proof Size summary in bytes: + // Measured: `270` + // Estimated: `3735` + // Minimum execution time: 19_000_000 picoseconds. + Weight::from_parts(19_000_000, 0) + .saturating_add(Weight::from_parts(0, 3735)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `Session::NextKeys` (r:1 w:1) + /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Session::KeyOwner` (r:0 w:1) + /// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn purge_keys() -> Weight { + // Proof Size summary in bytes: + // Measured: `242` + // Estimated: `3707` + // Minimum execution time: 13_000_000 picoseconds. + Weight::from_parts(13_000_000, 0) + .saturating_add(Weight::from_parts(0, 3707)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(2)) + } +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_timestamp.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_timestamp.rs new file mode 100644 index 00000000000..c2a23bf2a73 --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_timestamp.rs @@ -0,0 +1,72 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +//! Autogenerated weights for `pallet_timestamp` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-12-07, STEPS: `2`, REPEAT: `1`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `dagda.local`, CPU: `` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-rococo-dev")`, DB CACHE: 1024 + +// Executed Command: +// target/release/polkadot-parachain +// benchmark +// pallet +// --chain=coretime-rococo-dev +// --wasm-execution=compiled +// --pallet=pallet_timestamp +// --extrinsic=* +// --steps=2 +// --repeat=1 +// --json +// --header=./cumulus/file_header.txt +// --output=./cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/ + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_timestamp`. +pub struct WeightInfo(PhantomData); +impl pallet_timestamp::WeightInfo for WeightInfo { + /// Storage: `Timestamp::Now` (r:1 w:1) + /// Proof: `Timestamp::Now` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) + /// Storage: `Aura::CurrentSlot` (r:1 w:0) + /// Proof: `Aura::CurrentSlot` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) + fn set() -> Weight { + // Proof Size summary in bytes: + // Measured: `49` + // Estimated: `1493` + // Minimum execution time: 8_000_000 picoseconds. + Weight::from_parts(8_000_000, 0) + .saturating_add(Weight::from_parts(0, 1493)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + fn on_finalize() -> Weight { + // Proof Size summary in bytes: + // Measured: `57` + // Estimated: `0` + // Minimum execution time: 3_000_000 picoseconds. + Weight::from_parts(3_000_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_utility.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_utility.rs new file mode 100644 index 00000000000..cf3cc98b593 --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_utility.rs @@ -0,0 +1,93 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +//! Autogenerated weights for `pallet_utility` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-12-07, STEPS: `2`, REPEAT: `1`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `dagda.local`, CPU: `` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-rococo-dev")`, DB CACHE: 1024 + +// Executed Command: +// target/release/polkadot-parachain +// benchmark +// pallet +// --chain=coretime-rococo-dev +// --wasm-execution=compiled +// --pallet=pallet_utility +// --extrinsic=* +// --steps=2 +// --repeat=1 +// --json +// --header=./cumulus/file_header.txt +// --output=./cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/ + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_utility`. +pub struct WeightInfo(PhantomData); +impl pallet_utility::WeightInfo for WeightInfo { + /// The range of component `c` is `[0, 1000]`. + fn batch(_c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 7_000_000 picoseconds. + Weight::from_parts(4_117_000_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + fn as_derivative() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 7_000_000 picoseconds. + Weight::from_parts(7_000_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + /// The range of component `c` is `[0, 1000]`. + fn batch_all(_c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 6_000_000 picoseconds. + Weight::from_parts(4_519_000_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + fn dispatch_as() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_000_000 picoseconds. + Weight::from_parts(9_000_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + /// The range of component `c` is `[0, 1000]`. + fn force_batch(_c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 6_000_000 picoseconds. + Weight::from_parts(4_114_000_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_xcm.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_xcm.rs new file mode 100644 index 00000000000..538401ef2c5 --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_xcm.rs @@ -0,0 +1,333 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +//! Autogenerated weights for `pallet_xcm` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-12-07, STEPS: `2`, REPEAT: `1`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `dagda.local`, CPU: `` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-rococo-dev")`, DB CACHE: 1024 + +// Executed Command: +// target/release/polkadot-parachain +// benchmark +// pallet +// --chain=coretime-rococo-dev +// --wasm-execution=compiled +// --pallet=pallet_xcm +// --extrinsic=* +// --steps=2 +// --repeat=1 +// --json +// --header=./cumulus/file_header.txt +// --output=./cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/ + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_xcm`. +pub struct WeightInfo(PhantomData); +impl pallet_xcm::WeightInfo for WeightInfo { + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn send() -> Weight { + // Proof Size summary in bytes: + // Measured: `74` + // Estimated: `3539` + // Minimum execution time: 37_000_000 picoseconds. + Weight::from_parts(37_000_000, 0) + .saturating_add(Weight::from_parts(0, 3539)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) + /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn teleport_assets() -> Weight { + // Proof Size summary in bytes: + // Measured: `106` + // Estimated: `3571` + // Minimum execution time: 86_000_000 picoseconds. + Weight::from_parts(86_000_000, 0) + .saturating_add(Weight::from_parts(0, 3571)) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `Benchmark::Override` (r:0 w:0) + /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn reserve_transfer_assets() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. + Weight::from_parts(18_446_744_073_709_551_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + /// Storage: `Benchmark::Override` (r:0 w:0) + /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn transfer_assets() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. + Weight::from_parts(18_446_744_073_709_551_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + /// Storage: `Benchmark::Override` (r:0 w:0) + /// Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn execute() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. + Weight::from_parts(18_446_744_073_709_551_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + /// Storage: `PolkadotXcm::SupportedVersion` (r:0 w:1) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn force_xcm_version() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 13_000_000 picoseconds. + Weight::from_parts(13_000_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:0 w:1) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn force_default_xcm_version() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 4_000_000 picoseconds. + Weight::from_parts(4_000_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `PolkadotXcm::VersionNotifiers` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::QueryCounter` (r:1 w:1) + /// Proof: `PolkadotXcm::QueryCounter` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::Queries` (r:0 w:1) + /// Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn force_subscribe_version_notify() -> Weight { + // Proof Size summary in bytes: + // Measured: `74` + // Estimated: `3539` + // Minimum execution time: 37_000_000 picoseconds. + Weight::from_parts(37_000_000, 0) + .saturating_add(Weight::from_parts(0, 3539)) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(5)) + } + /// Storage: `PolkadotXcm::VersionNotifiers` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::Queries` (r:0 w:1) + /// Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn force_unsubscribe_version_notify() -> Weight { + // Proof Size summary in bytes: + // Measured: `292` + // Estimated: `3757` + // Minimum execution time: 72_000_000 picoseconds. + Weight::from_parts(72_000_000, 0) + .saturating_add(Weight::from_parts(0, 3757)) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(4)) + } + /// Storage: `PolkadotXcm::XcmExecutionSuspended` (r:0 w:1) + /// Proof: `PolkadotXcm::XcmExecutionSuspended` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn force_suspension() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 4_000_000 picoseconds. + Weight::from_parts(4_000_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `PolkadotXcm::SupportedVersion` (r:4 w:2) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn migrate_supported_version() -> Weight { + // Proof Size summary in bytes: + // Measured: `95` + // Estimated: `10985` + // Minimum execution time: 19_000_000 picoseconds. + Weight::from_parts(19_000_000, 0) + .saturating_add(Weight::from_parts(0, 10985)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `PolkadotXcm::VersionNotifiers` (r:4 w:2) + /// Proof: `PolkadotXcm::VersionNotifiers` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn migrate_version_notifiers() -> Weight { + // Proof Size summary in bytes: + // Measured: `99` + // Estimated: `10989` + // Minimum execution time: 19_000_000 picoseconds. + Weight::from_parts(19_000_000, 0) + .saturating_add(Weight::from_parts(0, 10989)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:5 w:0) + /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn already_notified_target() -> Weight { + // Proof Size summary in bytes: + // Measured: `106` + // Estimated: `13471` + // Minimum execution time: 22_000_000 picoseconds. + Weight::from_parts(22_000_000, 0) + .saturating_add(Weight::from_parts(0, 13471)) + .saturating_add(T::DbWeight::get().reads(5)) + } + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:2 w:1) + /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn notify_current_targets() -> Weight { + // Proof Size summary in bytes: + // Measured: `142` + // Estimated: `6082` + // Minimum execution time: 32_000_000 picoseconds. + Weight::from_parts(32_000_000, 0) + .saturating_add(Weight::from_parts(0, 6082)) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:3 w:0) + /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn notify_target_migration_fail() -> Weight { + // Proof Size summary in bytes: + // Measured: `136` + // Estimated: `8551` + // Minimum execution time: 12_000_000 picoseconds. + Weight::from_parts(12_000_000, 0) + .saturating_add(Weight::from_parts(0, 8551)) + .saturating_add(T::DbWeight::get().reads(3)) + } + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:4 w:2) + /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn migrate_version_notify_targets() -> Weight { + // Proof Size summary in bytes: + // Measured: `106` + // Estimated: `10996` + // Minimum execution time: 19_000_000 picoseconds. + Weight::from_parts(19_000_000, 0) + .saturating_add(Weight::from_parts(0, 10996)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `PolkadotXcm::VersionNotifyTargets` (r:4 w:2) + /// Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn migrate_and_notify_old_targets() -> Weight { + // Proof Size summary in bytes: + // Measured: `148` + // Estimated: `11038` + // Minimum execution time: 39_000_000 picoseconds. + Weight::from_parts(39_000_000, 0) + .saturating_add(Weight::from_parts(0, 11038)) + .saturating_add(T::DbWeight::get().reads(9)) + .saturating_add(T::DbWeight::get().writes(4)) + } + /// Storage: `PolkadotXcm::QueryCounter` (r:1 w:1) + /// Proof: `PolkadotXcm::QueryCounter` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::Queries` (r:0 w:1) + /// Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn new_query() -> Weight { + // Proof Size summary in bytes: + // Measured: `32` + // Estimated: `1517` + // Minimum execution time: 5_000_000 picoseconds. + Weight::from_parts(5_000_000, 0) + .saturating_add(Weight::from_parts(0, 1517)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `PolkadotXcm::Queries` (r:1 w:1) + /// Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn take_response() -> Weight { + // Proof Size summary in bytes: + // Measured: `7669` + // Estimated: `11134` + // Minimum execution time: 31_000_000 picoseconds. + Weight::from_parts(31_000_000, 0) + .saturating_add(Weight::from_parts(0, 11134)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/paritydb_weights.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/paritydb_weights.rs new file mode 100644 index 00000000000..4338d928d80 --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/paritydb_weights.rs @@ -0,0 +1,63 @@ +// This file is part of Substrate. + +// Copyright (C) 2022 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +pub mod constants { + use frame_support::{ + parameter_types, + weights::{constants, RuntimeDbWeight}, + }; + + parameter_types! { + /// `ParityDB` can be enabled with a feature flag, but is still experimental. These weights + /// are available for brave runtime engineers who may want to try this out as default. + pub const ParityDbWeight: RuntimeDbWeight = RuntimeDbWeight { + read: 8_000 * constants::WEIGHT_REF_TIME_PER_NANOS, + write: 50_000 * constants::WEIGHT_REF_TIME_PER_NANOS, + }; + } + + #[cfg(test)] + mod test_db_weights { + use super::constants::ParityDbWeight as W; + use frame_support::weights::constants; + + /// Checks that all weights exist and have sane values. + // NOTE: If this test fails but you are sure that the generated values are fine, + // you can delete it. + #[test] + fn sane() { + // At least 1 µs. + assert!( + W::get().reads(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, + "Read weight should be at least 1 µs." + ); + assert!( + W::get().writes(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, + "Write weight should be at least 1 µs." + ); + // At most 1 ms. + assert!( + W::get().reads(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, + "Read weight should be at most 1 ms." + ); + assert!( + W::get().writes(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, + "Write weight should be at most 1 ms." + ); + } + } +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/rocksdb_weights.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/rocksdb_weights.rs new file mode 100644 index 00000000000..1d115d963fa --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/rocksdb_weights.rs @@ -0,0 +1,63 @@ +// This file is part of Substrate. + +// Copyright (C) 2022 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +pub mod constants { + use frame_support::{ + parameter_types, + weights::{constants, RuntimeDbWeight}, + }; + + parameter_types! { + /// By default, Substrate uses `RocksDB`, so this will be the weight used throughout + /// the runtime. + pub const RocksDbWeight: RuntimeDbWeight = RuntimeDbWeight { + read: 25_000 * constants::WEIGHT_REF_TIME_PER_NANOS, + write: 100_000 * constants::WEIGHT_REF_TIME_PER_NANOS, + }; + } + + #[cfg(test)] + mod test_db_weights { + use super::constants::RocksDbWeight as W; + use frame_support::weights::constants; + + /// Checks that all weights exist and have sane values. + // NOTE: If this test fails but you are sure that the generated values are fine, + // you can delete it. + #[test] + fn sane() { + // At least 1 µs. + assert!( + W::get().reads(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, + "Read weight should be at least 1 µs." + ); + assert!( + W::get().writes(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, + "Write weight should be at least 1 µs." + ); + // At most 1 ms. + assert!( + W::get().reads(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, + "Read weight should be at most 1 ms." + ); + assert!( + W::get().writes(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, + "Write weight should be at most 1 ms." + ); + } + } +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/mod.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/mod.rs new file mode 100644 index 00000000000..2319c2e3a5b --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/mod.rs @@ -0,0 +1,244 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +mod pallet_xcm_benchmarks_fungible; +mod pallet_xcm_benchmarks_generic; + +use crate::{xcm_config::MaxAssetsIntoHolding, Runtime}; +use frame_support::weights::Weight; +use pallet_xcm_benchmarks_fungible::WeightInfo as XcmFungibleWeight; +use pallet_xcm_benchmarks_generic::WeightInfo as XcmGeneric; +use sp_std::prelude::*; +use xcm::{latest::prelude::*, DoubleEncoded}; + +trait WeighMultiAssets { + fn weigh_multi_assets(&self, weight: Weight) -> Weight; +} + +const MAX_ASSETS: u64 = 100; + +impl WeighMultiAssets for MultiAssetFilter { + fn weigh_multi_assets(&self, weight: Weight) -> Weight { + match self { + Self::Definite(assets) => weight.saturating_mul(assets.inner().iter().count() as u64), + Self::Wild(asset) => match asset { + All => weight.saturating_mul(MAX_ASSETS), + AllOf { fun, .. } => match fun { + WildFungibility::Fungible => weight, + // Magic number 2 has to do with the fact that we could have up to 2 times + // MaxAssetsIntoHolding in the worst-case scenario. + WildFungibility::NonFungible => + weight.saturating_mul((MaxAssetsIntoHolding::get() * 2) as u64), + }, + AllCounted(count) => weight.saturating_mul(MAX_ASSETS.min(*count as u64)), + AllOfCounted { count, .. } => weight.saturating_mul(MAX_ASSETS.min(*count as u64)), + }, + } + } +} + +impl WeighMultiAssets for MultiAssets { + fn weigh_multi_assets(&self, weight: Weight) -> Weight { + weight.saturating_mul(self.inner().iter().count() as u64) + } +} + +pub struct CoretimeRococoXcmWeight(core::marker::PhantomData); +impl XcmWeightInfo for CoretimeRococoXcmWeight { + fn withdraw_asset(assets: &MultiAssets) -> Weight { + assets.weigh_multi_assets(XcmFungibleWeight::::withdraw_asset()) + } + fn reserve_asset_deposited(assets: &MultiAssets) -> Weight { + assets.weigh_multi_assets(XcmFungibleWeight::::reserve_asset_deposited()) + } + fn receive_teleported_asset(assets: &MultiAssets) -> Weight { + assets.weigh_multi_assets(XcmFungibleWeight::::receive_teleported_asset()) + } + fn query_response( + _query_id: &u64, + _response: &Response, + _max_weight: &Weight, + _querier: &Option, + ) -> Weight { + XcmGeneric::::query_response() + } + fn transfer_asset(assets: &MultiAssets, _dest: &MultiLocation) -> Weight { + assets.weigh_multi_assets(XcmFungibleWeight::::transfer_asset()) + } + fn transfer_reserve_asset( + assets: &MultiAssets, + _dest: &MultiLocation, + _xcm: &Xcm<()>, + ) -> Weight { + assets.weigh_multi_assets(XcmFungibleWeight::::transfer_reserve_asset()) + } + fn transact( + _origin_type: &OriginKind, + _require_weight_at_most: &Weight, + _call: &DoubleEncoded, + ) -> Weight { + XcmGeneric::::transact() + } + fn hrmp_new_channel_open_request( + _sender: &u32, + _max_message_size: &u32, + _max_capacity: &u32, + ) -> Weight { + // XCM Executor does not currently support HRMP channel operations + Weight::MAX + } + fn hrmp_channel_accepted(_recipient: &u32) -> Weight { + // XCM Executor does not currently support HRMP channel operations + Weight::MAX + } + fn hrmp_channel_closing(_initiator: &u32, _sender: &u32, _recipient: &u32) -> Weight { + // XCM Executor does not currently support HRMP channel operations + Weight::MAX + } + fn clear_origin() -> Weight { + XcmGeneric::::clear_origin() + } + fn descend_origin(_who: &InteriorMultiLocation) -> Weight { + XcmGeneric::::descend_origin() + } + fn report_error(_query_response_info: &QueryResponseInfo) -> Weight { + XcmGeneric::::report_error() + } + fn deposit_asset(assets: &MultiAssetFilter, _dest: &MultiLocation) -> Weight { + assets.weigh_multi_assets(XcmFungibleWeight::::deposit_asset()) + } + fn deposit_reserve_asset( + assets: &MultiAssetFilter, + _dest: &MultiLocation, + _xcm: &Xcm<()>, + ) -> Weight { + assets.weigh_multi_assets(XcmFungibleWeight::::deposit_reserve_asset()) + } + fn exchange_asset(_give: &MultiAssetFilter, _receive: &MultiAssets, _maximal: &bool) -> Weight { + Weight::MAX + } + fn initiate_reserve_withdraw( + assets: &MultiAssetFilter, + _reserve: &MultiLocation, + _xcm: &Xcm<()>, + ) -> Weight { + assets.weigh_multi_assets(XcmFungibleWeight::::initiate_reserve_withdraw()) + } + fn initiate_teleport( + assets: &MultiAssetFilter, + _dest: &MultiLocation, + _xcm: &Xcm<()>, + ) -> Weight { + assets.weigh_multi_assets(XcmFungibleWeight::::initiate_teleport()) + } + fn report_holding(_response_info: &QueryResponseInfo, _assets: &MultiAssetFilter) -> Weight { + XcmGeneric::::report_holding() + } + fn buy_execution(_fees: &MultiAsset, _weight_limit: &WeightLimit) -> Weight { + XcmGeneric::::buy_execution() + } + fn refund_surplus() -> Weight { + XcmGeneric::::refund_surplus() + } + fn set_error_handler(_xcm: &Xcm) -> Weight { + XcmGeneric::::set_error_handler() + } + fn set_appendix(_xcm: &Xcm) -> Weight { + XcmGeneric::::set_appendix() + } + fn clear_error() -> Weight { + XcmGeneric::::clear_error() + } + fn claim_asset(_assets: &MultiAssets, _ticket: &MultiLocation) -> Weight { + XcmGeneric::::claim_asset() + } + fn trap(_code: &u64) -> Weight { + XcmGeneric::::trap() + } + fn subscribe_version(_query_id: &QueryId, _max_response_weight: &Weight) -> Weight { + XcmGeneric::::subscribe_version() + } + fn unsubscribe_version() -> Weight { + XcmGeneric::::unsubscribe_version() + } + fn burn_asset(assets: &MultiAssets) -> Weight { + assets.weigh_multi_assets(XcmGeneric::::burn_asset()) + } + fn expect_asset(assets: &MultiAssets) -> Weight { + assets.weigh_multi_assets(XcmGeneric::::expect_asset()) + } + fn expect_origin(_origin: &Option) -> Weight { + XcmGeneric::::expect_origin() + } + fn expect_error(_error: &Option<(u32, XcmError)>) -> Weight { + XcmGeneric::::expect_error() + } + fn expect_transact_status(_transact_status: &MaybeErrorCode) -> Weight { + XcmGeneric::::expect_transact_status() + } + fn query_pallet(_module_name: &Vec, _response_info: &QueryResponseInfo) -> Weight { + XcmGeneric::::query_pallet() + } + fn expect_pallet( + _index: &u32, + _name: &Vec, + _module_name: &Vec, + _crate_major: &u32, + _min_crate_minor: &u32, + ) -> Weight { + XcmGeneric::::expect_pallet() + } + fn report_transact_status(_response_info: &QueryResponseInfo) -> Weight { + XcmGeneric::::report_transact_status() + } + fn clear_transact_status() -> Weight { + XcmGeneric::::clear_transact_status() + } + fn universal_origin(_: &Junction) -> Weight { + XcmGeneric::::universal_origin() + } + fn export_message(_: &NetworkId, _: &Junctions, _: &Xcm<()>) -> Weight { + Weight::MAX + } + fn lock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { + Weight::MAX + } + fn unlock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { + Weight::MAX + } + fn note_unlockable(_: &MultiAsset, _: &MultiLocation) -> Weight { + Weight::MAX + } + fn request_unlock(_: &MultiAsset, _: &MultiLocation) -> Weight { + Weight::MAX + } + fn set_fees_mode(_: &bool) -> Weight { + XcmGeneric::::set_fees_mode() + } + fn set_topic(_topic: &[u8; 32]) -> Weight { + XcmGeneric::::set_topic() + } + fn clear_topic() -> Weight { + XcmGeneric::::clear_topic() + } + fn alias_origin(_: &MultiLocation) -> Weight { + // XCM Executor does not currently support alias origin operations + Weight::MAX + } + fn unpaid_execution(_: &WeightLimit, _: &Option) -> Weight { + XcmGeneric::::unpaid_execution() + } +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs new file mode 100644 index 00000000000..7fab3584250 --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs @@ -0,0 +1,201 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +//! Autogenerated weights for `pallet_xcm_benchmarks::fungible` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-11-15, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `runner-yprdrvc7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-rococo-dev"), DB CACHE: 1024 + +// Executed Command: +// target/production/polkadot-parachain +// benchmark +// pallet +// --steps=50 +// --repeat=20 +// --extrinsic=* +// --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json +// --pallet=pallet_xcm_benchmarks::fungible +// --chain=asset-hub-rococo-dev +// --header=./cumulus/file_header.txt +// --template=./cumulus/templates/xcm-bench-template.hbs +// --output=./cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/xcm/ + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weights for `pallet_xcm_benchmarks::fungible`. +pub struct WeightInfo(PhantomData); +impl WeightInfo { + // Storage: `System::Account` (r:1 w:1) + // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + pub fn withdraw_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `101` + // Estimated: `3593` + // Minimum execution time: 21_643_000 picoseconds. + Weight::from_parts(22_410_000, 3593) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + // Storage: `System::Account` (r:2 w:2) + // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + pub fn transfer_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `101` + // Estimated: `6196` + // Minimum execution time: 43_758_000 picoseconds. + Weight::from_parts(44_654_000, 6196) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + // Storage: `System::Account` (r:3 w:3) + // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + // Storage: `ParachainInfo::ParachainId` (r:1 w:0) + // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) + // Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + pub fn transfer_reserve_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `246` + // Estimated: `8799` + // Minimum execution time: 87_978_000 picoseconds. + Weight::from_parts(88_517_000, 8799) + .saturating_add(T::DbWeight::get().reads(10)) + .saturating_add(T::DbWeight::get().writes(5)) + } + // Storage: `ParachainInfo::ParachainId` (r:1 w:0) + // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + pub fn reserve_asset_deposited() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `1489` + // Minimum execution time: 6_883_000 picoseconds. + Weight::from_parts(6_979_000, 1489) + .saturating_add(T::DbWeight::get().reads(1)) + } + // Storage: `ParachainInfo::ParachainId` (r:1 w:0) + // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) + // Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `System::Account` (r:2 w:2) + // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + pub fn initiate_reserve_withdraw() -> Weight { + // Proof Size summary in bytes: + // Measured: `246` + // Estimated: `6196` + // Minimum execution time: 198_882_000 picoseconds. + Weight::from_parts(199_930_000, 6196) + .saturating_add(T::DbWeight::get().reads(9)) + .saturating_add(T::DbWeight::get().writes(4)) + } + pub fn receive_teleported_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 3_343_000 picoseconds. + Weight::from_parts(3_487_000, 0) + } + // Storage: `System::Account` (r:1 w:1) + // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + pub fn deposit_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `3593` + // Minimum execution time: 19_399_000 picoseconds. + Weight::from_parts(19_659_000, 3593) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + // Storage: `System::Account` (r:2 w:2) + // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + // Storage: `ParachainInfo::ParachainId` (r:1 w:0) + // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) + // Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + pub fn deposit_reserve_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `145` + // Estimated: `6196` + // Minimum execution time: 59_017_000 picoseconds. + Weight::from_parts(60_543_000, 6196) + .saturating_add(T::DbWeight::get().reads(9)) + .saturating_add(T::DbWeight::get().writes(4)) + } + // Storage: `ParachainInfo::ParachainId` (r:1 w:0) + // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) + // Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `System::Account` (r:1 w:1) + // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + pub fn initiate_teleport() -> Weight { + // Proof Size summary in bytes: + // Measured: `145` + // Estimated: `3610` + // Minimum execution time: 45_409_000 picoseconds. + Weight::from_parts(47_041_000, 3610) + .saturating_add(T::DbWeight::get().reads(8)) + .saturating_add(T::DbWeight::get().writes(3)) + } +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs new file mode 100644 index 00000000000..4454494badc --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -0,0 +1,355 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +//! Autogenerated weights for `pallet_xcm_benchmarks::generic` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-11-15, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `runner-yprdrvc7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-rococo-dev"), DB CACHE: 1024 + +// Executed Command: +// target/production/polkadot-parachain +// benchmark +// pallet +// --steps=50 +// --repeat=20 +// --extrinsic=* +// --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json +// --pallet=pallet_xcm_benchmarks::generic +// --chain=asset-hub-rococo-dev +// --header=./cumulus/file_header.txt +// --template=./cumulus/templates/xcm-bench-template.hbs +// --output=./cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/xcm/ + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weights for `pallet_xcm_benchmarks::generic`. +pub struct WeightInfo(PhantomData); +impl WeightInfo { + // Storage: `ParachainInfo::ParachainId` (r:1 w:0) + // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) + // Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `System::Account` (r:2 w:2) + // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + pub fn report_holding() -> Weight { + // Proof Size summary in bytes: + // Measured: `246` + // Estimated: `6196` + // Minimum execution time: 440_298_000 picoseconds. + Weight::from_parts(446_508_000, 6196) + .saturating_add(T::DbWeight::get().reads(9)) + .saturating_add(T::DbWeight::get().writes(4)) + } + pub fn buy_execution() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 3_313_000 picoseconds. + Weight::from_parts(3_422_000, 0) + } + // Storage: `PolkadotXcm::Queries` (r:1 w:0) + // Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) + pub fn query_response() -> Weight { + // Proof Size summary in bytes: + // Measured: `103` + // Estimated: `3568` + // Minimum execution time: 9_691_000 picoseconds. + Weight::from_parts(9_948_000, 3568) + .saturating_add(T::DbWeight::get().reads(1)) + } + pub fn transact() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 10_384_000 picoseconds. + Weight::from_parts(11_085_000, 0) + } + pub fn refund_surplus() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 3_438_000 picoseconds. + Weight::from_parts(3_577_000, 0) + } + pub fn set_error_handler() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_126_000 picoseconds. + Weight::from_parts(2_243_000, 0) + } + pub fn set_appendix() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_126_000 picoseconds. + Weight::from_parts(2_207_000, 0) + } + pub fn clear_error() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_105_000 picoseconds. + Weight::from_parts(2_193_000, 0) + } + pub fn descend_origin() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_999_000 picoseconds. + Weight::from_parts(3_056_000, 0) + } + pub fn clear_origin() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_091_000 picoseconds. + Weight::from_parts(2_176_000, 0) + } + // Storage: `ParachainInfo::ParachainId` (r:1 w:0) + // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) + // Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `System::Account` (r:2 w:2) + // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + pub fn report_error() -> Weight { + // Proof Size summary in bytes: + // Measured: `246` + // Estimated: `6196` + // Minimum execution time: 55_728_000 picoseconds. + Weight::from_parts(56_704_000, 6196) + .saturating_add(T::DbWeight::get().reads(9)) + .saturating_add(T::DbWeight::get().writes(4)) + } + // Storage: `PolkadotXcm::AssetTraps` (r:1 w:1) + // Proof: `PolkadotXcm::AssetTraps` (`max_values`: None, `max_size`: None, mode: `Measured`) + pub fn claim_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `160` + // Estimated: `3625` + // Minimum execution time: 12_839_000 picoseconds. + Weight::from_parts(13_457_000, 3625) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + pub fn trap() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_116_000 picoseconds. + Weight::from_parts(2_219_000, 0) + } + // Storage: `PolkadotXcm::VersionNotifyTargets` (r:1 w:1) + // Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) + // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) + // Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + pub fn subscribe_version() -> Weight { + // Proof Size summary in bytes: + // Measured: `145` + // Estimated: `3610` + // Minimum execution time: 24_891_000 picoseconds. + Weight::from_parts(25_583_000, 3610) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) + } + // Storage: `PolkadotXcm::VersionNotifyTargets` (r:0 w:1) + // Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) + pub fn unsubscribe_version() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 3_968_000 picoseconds. + Weight::from_parts(4_122_000, 0) + .saturating_add(T::DbWeight::get().writes(1)) + } + pub fn burn_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 136_220_000 picoseconds. + Weight::from_parts(137_194_000, 0) + } + pub fn expect_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 12_343_000 picoseconds. + Weight::from_parts(12_635_000, 0) + } + pub fn expect_origin() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_237_000 picoseconds. + Weight::from_parts(2_315_000, 0) + } + pub fn expect_error() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_094_000 picoseconds. + Weight::from_parts(2_231_000, 0) + } + pub fn expect_transact_status() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_379_000 picoseconds. + Weight::from_parts(2_455_000, 0) + } + // Storage: `ParachainInfo::ParachainId` (r:1 w:0) + // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) + // Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `System::Account` (r:2 w:2) + // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + pub fn query_pallet() -> Weight { + // Proof Size summary in bytes: + // Measured: `246` + // Estimated: `6196` + // Minimum execution time: 60_734_000 picoseconds. + Weight::from_parts(61_964_000, 6196) + .saturating_add(T::DbWeight::get().reads(9)) + .saturating_add(T::DbWeight::get().writes(4)) + } + pub fn expect_pallet() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 5_500_000 picoseconds. + Weight::from_parts(5_720_000, 0) + } + // Storage: `ParachainInfo::ParachainId` (r:1 w:0) + // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) + // Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `System::Account` (r:2 w:2) + // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + pub fn report_transact_status() -> Weight { + // Proof Size summary in bytes: + // Measured: `246` + // Estimated: `6196` + // Minimum execution time: 55_767_000 picoseconds. + Weight::from_parts(56_790_000, 6196) + .saturating_add(T::DbWeight::get().reads(9)) + .saturating_add(T::DbWeight::get().writes(4)) + } + pub fn clear_transact_status() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_201_000 picoseconds. + Weight::from_parts(2_291_000, 0) + } + pub fn set_topic() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_164_000 picoseconds. + Weight::from_parts(2_241_000, 0) + } + pub fn clear_topic() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_127_000 picoseconds. + Weight::from_parts(2_236_000, 0) + } + // Storage: `ParachainInfo::ParachainId` (r:1 w:0) + // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + pub fn universal_origin() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `1489` + // Minimum execution time: 4_275_000 picoseconds. + Weight::from_parts(4_381_000, 1489) + .saturating_add(T::DbWeight::get().reads(1)) + } + pub fn set_fees_mode() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_132_000 picoseconds. + Weight::from_parts(2_216_000, 0) + } + pub fn unpaid_execution() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_265_000 picoseconds. + Weight::from_parts(2_332_000, 0) + } +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/xcm_config.rs new file mode 100644 index 00000000000..15ee924ddb5 --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/xcm_config.rs @@ -0,0 +1,289 @@ +// Copyright 2023 Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +use super::{ + AccountId, AllPalletsWithSystem, Balances, BaseDeliveryFee, FeeAssetId, ParachainInfo, + ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, + TransactionByteFee, WeightToFee, XcmpQueue, +}; +use frame_support::{ + match_types, parameter_types, + traits::{ConstU32, Contains, Equals, Everything, Nothing}, +}; +use frame_system::EnsureRoot; +use pallet_xcm::XcmPassthrough; +use parachains_common::{ + impls::ToStakingPot, + xcm_config::{ + AllSiblingSystemParachains, ConcreteNativeAssetFrom, ParentRelayOrSiblingParachains, + RelayOrOtherSystemParachains, + }, + TREASURY_PALLET_ID, +}; +use polkadot_parachain_primitives::primitives::Sibling; +use polkadot_runtime_common::xcm_sender::ExponentialPrice; +use sp_runtime::traits::AccountIdConversion; +use xcm::latest::prelude::*; +#[allow(deprecated)] +use xcm_builder::CurrencyAdapter; +use xcm_builder::{ + AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, + AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, DenyReserveTransferToRelayChain, + DenyThenTry, EnsureXcmOrigin, IsConcrete, ParentAsSuperuser, ParentIsPreset, + RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, + SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, + TrailingSetTopicAsId, UsingComponents, WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, + XcmFeeManagerFromComponents, XcmFeeToAccount, +}; +use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; + +parameter_types! { + pub const RocRelayLocation: MultiLocation = MultiLocation::parent(); + pub const RelayNetwork: Option = Some(NetworkId::Rococo); + pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); + pub UniversalLocation: InteriorMultiLocation = + X2(GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(ParachainInfo::parachain_id().into())); + pub const MaxInstructions: u32 = 100; + pub const MaxAssetsIntoHolding: u32 = 64; + pub const GovernanceLocation: MultiLocation = MultiLocation::parent(); + pub const FellowshipLocation: MultiLocation = MultiLocation::parent(); +} + +/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used +/// when determining ownership of accounts for asset transacting and when attempting to use XCM +/// `Transact` in order to determine the dispatch Origin. +pub type LocationToAccountId = ( + // The parent (Relay-chain) origin converts to the parent `AccountId`. + ParentIsPreset, + // Sibling parachain origins convert to AccountId via the `ParaId::into`. + SiblingParachainConvertsVia, + // Straight up local `AccountId32` origins just alias directly to `AccountId`. + AccountId32Aliases, +); + +/// Means for transacting the native currency on this chain. +#[allow(deprecated)] +pub type CurrencyTransactor = CurrencyAdapter< + // Use this currency: + Balances, + // Use this currency when it is a fungible asset matching the given location or name: + IsConcrete, + // Do a simple punn to convert an `AccountId32` `MultiLocation` into a native chain + // `AccountId`: + LocationToAccountId, + // Our chain's `AccountId` type (we can't get away without mentioning it explicitly): + AccountId, + // We don't track any teleports of `Balances`. + (), +>; + +/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, +/// ready for dispatching a transaction with XCM's `Transact`. There is an `OriginKind` that can +/// bias the kind of local `Origin` it will become. +pub type XcmOriginToTransactDispatchOrigin = ( + // Sovereign account converter; this attempts to derive an `AccountId` from the origin location + // using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for + // foreign chains who want to have a local sovereign account on this chain that they control. + SovereignSignedViaLocation, + // Native converter for Relay-chain (Parent) location; will convert to a `Relay` origin when + // recognized. + RelayChainAsNative, + // Native converter for sibling Parachains; will convert to a `SiblingPara` origin when + // recognized. + SiblingParachainAsNative, + // Superuser converter for the Relay-chain (Parent) location. This will allow it to issue a + // transaction from the Root origin. + ParentAsSuperuser, + // Native signed account converter; this just converts an `AccountId32` origin into a normal + // `RuntimeOrigin::Signed` origin of the same 32-byte value. + SignedAccountId32AsNative, + // XCM origins can be represented natively under the XCM pallet's `Xcm` origin. + XcmPassthrough, +); + +match_types! { + pub type ParentOrParentsPlurality: impl Contains = { + MultiLocation { parents: 1, interior: Here } | + MultiLocation { parents: 1, interior: X1(Plurality { .. }) } + }; +} + +/// A call filter for the XCM Transact instruction. This is a temporary measure until we properly +/// account for proof size weights. +/// +/// Calls that are allowed through this filter must: +/// 1. Have a fixed weight; +/// 2. Cannot lead to another call being made; +/// 3. Have a defined proof size weight, e.g. no unbounded vecs in call parameters. +pub struct SafeCallFilter; +impl Contains for SafeCallFilter { + fn contains(call: &RuntimeCall) -> bool { + #[cfg(feature = "runtime-benchmarks")] + { + if matches!(call, RuntimeCall::System(frame_system::Call::remark_with_event { .. })) { + return true + } + } + + matches!( + call, + RuntimeCall::PolkadotXcm(pallet_xcm::Call::force_xcm_version { .. }) | + RuntimeCall::System( + frame_system::Call::set_heap_pages { .. } | + frame_system::Call::set_code { .. } | + frame_system::Call::set_code_without_checks { .. } | + frame_system::Call::kill_prefix { .. }, + ) | RuntimeCall::ParachainSystem(..) | + RuntimeCall::Timestamp(..) | + RuntimeCall::Balances(..) | + RuntimeCall::CollatorSelection(..) | + RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | + RuntimeCall::XcmpQueue(..) | + RuntimeCall::Broker(..) + ) + } +} + +pub type Barrier = TrailingSetTopicAsId< + DenyThenTry< + DenyReserveTransferToRelayChain, + ( + // Allow local users to buy weight credit. + TakeWeightCredit, + // Expected responses are OK. + AllowKnownQueryResponses, + WithComputedOrigin< + ( + // If the message is one that immediately attemps to pay for execution, then + // allow it. + AllowTopLevelPaidExecutionFrom, + // Parent and its pluralities (i.e. governance bodies) get free execution. + AllowExplicitUnpaidExecutionFrom, + // Subscriptions for version tracking are OK. + AllowSubscriptionsFrom, + ), + UniversalLocation, + ConstU32<8>, + >, + ), + >, +>; + +parameter_types! { + pub TreasuryAccount: AccountId = TREASURY_PALLET_ID.into_account_truncating(); + pub RelayTreasuryLocation: MultiLocation = (Parent, PalletInstance(rococo_runtime_constants::TREASURY_PALLET_ID)).into(); +} + +/// Locations that will not be charged fees in the executor, +/// either execution or delivery. +/// We only waive fees for system functions, which these locations represent. +pub type WaivedLocations = ( + RelayOrOtherSystemParachains, + Equals, +); + +pub struct XcmConfig; +impl xcm_executor::Config for XcmConfig { + type RuntimeCall = RuntimeCall; + type XcmSender = XcmRouter; + type AssetTransactor = CurrencyTransactor; + type OriginConverter = XcmOriginToTransactDispatchOrigin; + // Coretime chain does not recognize a reserve location for any asset. Users must teleport ROC + // where allowed (e.g. with the Relay Chain). + type IsReserve = (); + /// Only allow teleportation of ROC. + type IsTeleporter = ConcreteNativeAssetFrom; + type UniversalLocation = UniversalLocation; + type Barrier = Barrier; + type Weigher = WeightInfoBounds< + crate::weights::xcm::CoretimeRococoXcmWeight, + RuntimeCall, + MaxInstructions, + >; + type Trader = + UsingComponents>; + type ResponseHandler = PolkadotXcm; + type AssetTrap = PolkadotXcm; + type AssetClaims = PolkadotXcm; + type SubscriptionService = PolkadotXcm; + type PalletInstancesInfo = AllPalletsWithSystem; + type MaxAssetsIntoHolding = MaxAssetsIntoHolding; + type AssetLocker = (); + type AssetExchanger = (); + type FeeManager = XcmFeeManagerFromComponents< + WaivedLocations, + XcmFeeToAccount, + >; + type MessageExporter = (); + type UniversalAliases = Nothing; + type CallDispatcher = WithOriginFilter; + type SafeCallFilter = SafeCallFilter; + type Aliasers = Nothing; +} + +/// Converts a local signed origin into an XCM multilocation. Forms the basis for local origins +/// sending/executing XCMs. +pub type LocalOriginToLocation = SignedToAccountId32; + +pub type PriceForParentDelivery = + ExponentialPrice; + +/// The means for routing XCM messages which are not for local execution into the right message +/// queues. +pub type XcmRouter = WithUniqueTopic<( + // Two routers - use UMP to communicate with the relay chain: + cumulus_primitives_utility::ParentAsUmp, + // ..and XCMP to communicate with the sibling chains. + XcmpQueue, +)>; + +impl pallet_xcm::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + // We want to disallow users sending (arbitrary) XCM programs from this chain. + type SendXcmOrigin = EnsureXcmOrigin; + type XcmRouter = XcmRouter; + // We support local origins dispatching XCM executions in principle... + type ExecuteXcmOrigin = EnsureXcmOrigin; + // ... but disallow generic XCM execution. As a result only teleports are allowed. + type XcmExecuteFilter = Nothing; + type XcmExecutor = XcmExecutor; + type XcmTeleportFilter = Everything; + type XcmReserveTransferFilter = Nothing; // This parachain is not meant as a reserve location. + type Weigher = WeightInfoBounds< + crate::weights::xcm::CoretimeRococoXcmWeight, + RuntimeCall, + MaxInstructions, + >; + type UniversalLocation = UniversalLocation; + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100; + type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion; + type Currency = Balances; + type CurrencyMatcher = (); + type TrustedLockers = (); + type SovereignAccountOf = LocationToAccountId; + type MaxLockers = ConstU32<8>; + type WeightInfo = crate::weights::pallet_xcm::WeightInfo; + type AdminOrigin = EnsureRoot; + type MaxRemoteLockConsumers = ConstU32<0>; + type RemoteLockConsumerIdentifier = (); +} + +impl cumulus_pallet_xcm::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type XcmExecutor = XcmExecutor; +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml b/cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml new file mode 100644 index 00000000000..d68a98790f7 --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml @@ -0,0 +1,192 @@ +[package] +name = "coretime-westend-runtime" +version = "0.1.0" +authors.workspace = true +edition.workspace = true +description = "Westend's Coretime parachain runtime" +license = "Apache-2.0" + +[lints] +workspace = true + +[build-dependencies] +substrate-wasm-builder = { path = "../../../../../substrate/utils/wasm-builder", optional = true } + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } +hex-literal = "0.4.1" +log = { version = "0.4.20", default-features = false } +scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } +serde = { version = "1.0.171", optional = true, features = ["derive"] } +smallvec = "1.11.0" + +# Substrate +frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking", default-features = false, optional = true } +frame-executive = { path = "../../../../../substrate/frame/executive", default-features = false } +frame-support = { path = "../../../../../substrate/frame/support", default-features = false } +frame-system = { path = "../../../../../substrate/frame/system", default-features = false } +frame-system-benchmarking = { path = "../../../../../substrate/frame/system/benchmarking", default-features = false, optional = true } +frame-system-rpc-runtime-api = { path = "../../../../../substrate/frame/system/rpc/runtime-api", default-features = false } +frame-try-runtime = { path = "../../../../../substrate/frame/try-runtime", default-features = false, optional = true } +pallet-aura = { path = "../../../../../substrate/frame/aura", default-features = false } +pallet-authorship = { path = "../../../../../substrate/frame/authorship", default-features = false } +pallet-balances = { path = "../../../../../substrate/frame/balances", default-features = false } +pallet-message-queue = { path = "../../../../../substrate/frame/message-queue", default-features = false } +pallet-multisig = { path = "../../../../../substrate/frame/multisig", default-features = false } +pallet-session = { path = "../../../../../substrate/frame/session", default-features = false } +pallet-sudo = { path = "../../../../../substrate/frame/sudo", default-features = false } +pallet-timestamp = { path = "../../../../../substrate/frame/timestamp", default-features = false } +pallet-transaction-payment = { path = "../../../../../substrate/frame/transaction-payment", default-features = false } +pallet-transaction-payment-rpc-runtime-api = { path = "../../../../../substrate/frame/transaction-payment/rpc/runtime-api", default-features = false } +pallet-utility = { path = "../../../../../substrate/frame/utility", default-features = false } +sp-api = { path = "../../../../../substrate/primitives/api", default-features = false } +sp-block-builder = { path = "../../../../../substrate/primitives/block-builder", default-features = false } +sp-consensus-aura = { path = "../../../../../substrate/primitives/consensus/aura", default-features = false } +sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } +sp-inherents = { path = "../../../../../substrate/primitives/inherents", default-features = false } +sp-genesis-builder = { path = "../../../../../substrate/primitives/genesis-builder", default-features = false } +sp-offchain = { path = "../../../../../substrate/primitives/offchain", default-features = false } +sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-features = false } +sp-session = { path = "../../../../../substrate/primitives/session", default-features = false } +sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } +sp-storage = { path = "../../../../../substrate/primitives/storage", default-features = false } +sp-transaction-pool = { path = "../../../../../substrate/primitives/transaction-pool", default-features = false } +sp-version = { path = "../../../../../substrate/primitives/version", default-features = false } + +# Polkadot +pallet-xcm = { path = "../../../../../polkadot/xcm/pallet-xcm", default-features = false } +pallet-xcm-benchmarks = { path = "../../../../../polkadot/xcm/pallet-xcm-benchmarks", default-features = false, optional = true } +polkadot-core-primitives = { path = "../../../../../polkadot/core-primitives", default-features = false } +polkadot-parachain-primitives = { path = "../../../../../polkadot/parachain", default-features = false } +polkadot-runtime-common = { path = "../../../../../polkadot/runtime/common", default-features = false } +westend-runtime-constants = { path = "../../../../../polkadot/runtime/westend/constants", default-features = false } +xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } +xcm-builder = { package = "staging-xcm-builder", path = "../../../../../polkadot/xcm/xcm-builder", default-features = false } +xcm-executor = { package = "staging-xcm-executor", path = "../../../../../polkadot/xcm/xcm-executor", default-features = false } + +# Cumulus +cumulus-pallet-aura-ext = { path = "../../../../pallets/aura-ext", default-features = false } +cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false, features = ["parameterized-consensus-hook"] } +cumulus-pallet-session-benchmarking = { path = "../../../../pallets/session-benchmarking", default-features = false } +cumulus-pallet-xcm = { path = "../../../../pallets/xcm", default-features = false } +cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-features = false } +cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } +cumulus-primitives-utility = { path = "../../../../primitives/utility", default-features = false } +pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } +parachain-info = { package = "staging-parachain-info", path = "../../../pallets/parachain-info", default-features = false } +parachains-common = { path = "../../../common", default-features = false } + +[features] +default = ["std"] +std = [ + "codec/std", + "cumulus-pallet-aura-ext/std", + "cumulus-pallet-parachain-system/std", + "cumulus-pallet-session-benchmarking/std", + "cumulus-pallet-xcm/std", + "cumulus-pallet-xcmp-queue/std", + "cumulus-primitives-core/std", + "cumulus-primitives-utility/std", + "frame-benchmarking?/std", + "frame-executive/std", + "frame-support/std", + "frame-system-benchmarking?/std", + "frame-system-rpc-runtime-api/std", + "frame-system/std", + "frame-try-runtime?/std", + "log/std", + "pallet-aura/std", + "pallet-authorship/std", + "pallet-balances/std", + "pallet-collator-selection/std", + "pallet-message-queue/std", + "pallet-multisig/std", + "pallet-session/std", + "pallet-sudo/std", + "pallet-timestamp/std", + "pallet-transaction-payment-rpc-runtime-api/std", + "pallet-transaction-payment/std", + "pallet-utility/std", + "pallet-xcm-benchmarks?/std", + "pallet-xcm/std", + "parachain-info/std", + "parachains-common/std", + "polkadot-core-primitives/std", + "polkadot-parachain-primitives/std", + "polkadot-runtime-common/std", + "scale-info/std", + "serde", + "sp-api/std", + "sp-block-builder/std", + "sp-consensus-aura/std", + "sp-core/std", + "sp-genesis-builder/std", + "sp-inherents/std", + "sp-offchain/std", + "sp-runtime/std", + "sp-session/std", + "sp-std/std", + "sp-storage/std", + "sp-transaction-pool/std", + "sp-version/std", + "substrate-wasm-builder", + "westend-runtime-constants/std", + "xcm-builder/std", + "xcm-executor/std", + "xcm/std", +] + +runtime-benchmarks = [ + "cumulus-pallet-parachain-system/runtime-benchmarks", + "cumulus-pallet-session-benchmarking/runtime-benchmarks", + "cumulus-pallet-xcmp-queue/runtime-benchmarks", + "cumulus-primitives-core/runtime-benchmarks", + "cumulus-primitives-utility/runtime-benchmarks", + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system-benchmarking/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "pallet-balances/runtime-benchmarks", + "pallet-collator-selection/runtime-benchmarks", + "pallet-message-queue/runtime-benchmarks", + "pallet-multisig/runtime-benchmarks", + "pallet-sudo/runtime-benchmarks", + "pallet-timestamp/runtime-benchmarks", + "pallet-utility/runtime-benchmarks", + "pallet-xcm-benchmarks/runtime-benchmarks", + "pallet-xcm/runtime-benchmarks", + "parachains-common/runtime-benchmarks", + "polkadot-parachain-primitives/runtime-benchmarks", + "polkadot-runtime-common/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", + "xcm-builder/runtime-benchmarks", + "xcm-executor/runtime-benchmarks", +] + +try-runtime = [ + "cumulus-pallet-aura-ext/try-runtime", + "cumulus-pallet-parachain-system/try-runtime", + "cumulus-pallet-xcm/try-runtime", + "cumulus-pallet-xcmp-queue/try-runtime", + "frame-executive/try-runtime", + "frame-support/try-runtime", + "frame-system/try-runtime", + "frame-try-runtime/try-runtime", + "pallet-aura/try-runtime", + "pallet-authorship/try-runtime", + "pallet-balances/try-runtime", + "pallet-collator-selection/try-runtime", + "pallet-message-queue/try-runtime", + "pallet-multisig/try-runtime", + "pallet-session/try-runtime", + "pallet-sudo/try-runtime", + "pallet-timestamp/try-runtime", + "pallet-transaction-payment/try-runtime", + "pallet-utility/try-runtime", + "pallet-xcm/try-runtime", + "parachain-info/try-runtime", + "polkadot-runtime-common/try-runtime", + "sp-runtime/try-runtime", +] + +experimental = ["pallet-aura/experimental"] diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/build.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/build.rs new file mode 100644 index 00000000000..60f8a125129 --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/build.rs @@ -0,0 +1,26 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#[cfg(feature = "std")] +fn main() { + substrate_wasm_builder::WasmBuilder::new() + .with_current_project() + .export_heap_base() + .import_memory() + .build() +} + +#[cfg(not(feature = "std"))] +fn main() {} diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs new file mode 100644 index 00000000000..742b3a29275 --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs @@ -0,0 +1,850 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![cfg_attr(not(feature = "std"), no_std)] +// `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. +#![recursion_limit = "256"] + +// Make the WASM binary available. +#[cfg(feature = "std")] +include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); + +mod weights; +pub mod xcm_config; + +use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; +use cumulus_primitives_core::{AggregateMessageOrigin, ParaId}; +use frame_support::{ + construct_runtime, derive_impl, + dispatch::DispatchClass, + genesis_builder_helper::{build_config, create_default_config}, + parameter_types, + traits::{ConstBool, ConstU32, ConstU64, ConstU8, EitherOfDiverse, TransformOrigin}, + weights::{ConstantMultiplier, Weight}, + PalletId, +}; +use frame_system::{ + limits::{BlockLength, BlockWeights}, + EnsureRoot, +}; +use pallet_xcm::{EnsureXcm, IsVoiceOfBody}; +use parachains_common::{ + impls::DealWithFees, + message_queue::{NarrowOriginToSibling, ParaIdToSibling}, + westend::{consensus::*, currency::*, fee::WeightToFee}, + AccountId, AuraId, Balance, BlockNumber, Hash, Header, Nonce, Signature, + AVERAGE_ON_INITIALIZE_RATIO, HOURS, MAXIMUM_BLOCK_WEIGHT, NORMAL_DISPATCH_RATIO, SLOT_DURATION, +}; +use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; +use sp_api::impl_runtime_apis; +use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; +#[cfg(any(feature = "std", test))] +pub use sp_runtime::BuildStorage; +use sp_runtime::{ + create_runtime_str, generic, impl_opaque_keys, + traits::Block as BlockT, + transaction_validity::{TransactionSource, TransactionValidity}, + ApplyExtrinsicResult, MultiAddress, Perbill, +}; +use sp_std::prelude::*; +#[cfg(feature = "std")] +use sp_version::NativeVersion; +use sp_version::RuntimeVersion; +use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; +use xcm::latest::prelude::*; +use xcm_config::{ + FellowshipLocation, GovernanceLocation, WndRelayLocation, XcmOriginToTransactDispatchOrigin, +}; + +/// The address format for describing accounts. +pub type Address = MultiAddress; + +/// Block type as expected by this runtime. +pub type Block = generic::Block; + +/// A Block signed with a Justification +pub type SignedBlock = generic::SignedBlock; + +/// BlockId type as expected by this runtime. +pub type BlockId = generic::BlockId; + +/// The SignedExtension to the basic transaction logic. +pub type SignedExtra = ( + frame_system::CheckNonZeroSender, + frame_system::CheckSpecVersion, + frame_system::CheckTxVersion, + frame_system::CheckGenesis, + frame_system::CheckEra, + frame_system::CheckNonce, + frame_system::CheckWeight, + pallet_transaction_payment::ChargeTransactionPayment, +); + +/// Unchecked extrinsic type as expected by this runtime. +pub type UncheckedExtrinsic = + generic::UncheckedExtrinsic; + +/// Migrations to apply on runtime upgrade. +pub type Migrations = (); + +/// Executive: handles dispatch to the various modules. +pub type Executive = frame_executive::Executive< + Runtime, + Block, + frame_system::ChainContext, + Runtime, + AllPalletsWithSystem, + Migrations, +>; + +impl_opaque_keys! { + pub struct SessionKeys { + pub aura: Aura, + } +} + +#[sp_version::runtime_version] +pub const VERSION: RuntimeVersion = RuntimeVersion { + spec_name: create_runtime_str!("coretime-westend"), + impl_name: create_runtime_str!("coretime-westend"), + authoring_version: 1, + spec_version: 1_005_000, + impl_version: 0, + apis: RUNTIME_API_VERSIONS, + transaction_version: 0, + state_version: 1, +}; + +/// The version information used to identify this runtime when compiled natively. +#[cfg(feature = "std")] +pub fn native_version() -> NativeVersion { + NativeVersion { runtime_version: VERSION, can_author_with: Default::default() } +} + +parameter_types! { + pub const Version: RuntimeVersion = VERSION; + pub RuntimeBlockLength: BlockLength = + BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO); + pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder() + .base_block(BlockExecutionWeight::get()) + .for_class(DispatchClass::all(), |weights| { + weights.base_extrinsic = ExtrinsicBaseWeight::get(); + }) + .for_class(DispatchClass::Normal, |weights| { + weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT); + }) + .for_class(DispatchClass::Operational, |weights| { + weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT); + // Operational transactions have some extra reserved space, so that they + // are included even if block reached `MAXIMUM_BLOCK_WEIGHT`. + weights.reserved = Some( + MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT + ); + }) + .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO) + .build_or_panic(); + pub const SS58Prefix: u8 = 42; +} + +// Configure FRAME pallets to include in runtime. +#[derive_impl(frame_system::config_preludes::ParaChainDefaultConfig as frame_system::DefaultConfig)] +impl frame_system::Config for Runtime { + /// The identifier used to distinguish between accounts. + type AccountId = AccountId; + /// The nonce type for storing how many extrinsics an account has signed. + type Nonce = Nonce; + /// The type for hashing blocks and tries. + type Hash = Hash; + /// The block type. + type Block = Block; + /// Maximum number of block number to block hash mappings to keep (oldest pruned first). + type BlockHashCount = BlockHashCount; + /// Runtime version. + type Version = Version; + /// The data to be stored in an account. + type AccountData = pallet_balances::AccountData; + /// The weight of database operations that the runtime can invoke. + type DbWeight = RocksDbWeight; + /// Weight information for the extrinsics of this pallet. + type SystemWeightInfo = weights::frame_system::WeightInfo; + /// Block & extrinsics weights: base values and limits. + type BlockWeights = RuntimeBlockWeights; + /// The maximum length of a block (in bytes). + type BlockLength = RuntimeBlockLength; + type SS58Prefix = SS58Prefix; + /// The action to take on a Runtime Upgrade + type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode; + type MaxConsumers = ConstU32<16>; +} + +impl pallet_timestamp::Config for Runtime { + /// A timestamp: milliseconds since the unix epoch. + type Moment = u64; + type OnTimestampSet = Aura; + type MinimumPeriod = ConstU64<{ SLOT_DURATION / 2 }>; + type WeightInfo = weights::pallet_timestamp::WeightInfo; +} + +impl pallet_authorship::Config for Runtime { + type FindAuthor = pallet_session::FindAccountFromAuthorIndex; + type EventHandler = (CollatorSelection,); +} + +parameter_types! { + pub const ExistentialDeposit: Balance = EXISTENTIAL_DEPOSIT; +} + +impl pallet_balances::Config for Runtime { + type Balance = Balance; + type DustRemoval = (); + type RuntimeEvent = RuntimeEvent; + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type WeightInfo = weights::pallet_balances::WeightInfo; + type MaxLocks = ConstU32<50>; + type MaxReserves = ConstU32<50>; + type ReserveIdentifier = [u8; 8]; + type RuntimeHoldReason = RuntimeHoldReason; + type RuntimeFreezeReason = RuntimeFreezeReason; + type FreezeIdentifier = (); + type MaxHolds = ConstU32<0>; + type MaxFreezes = ConstU32<0>; +} + +parameter_types! { + /// Relay Chain `TransactionByteFee` / 10 + pub const TransactionByteFee: Balance = MILLICENTS; +} + +impl pallet_transaction_payment::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type OnChargeTransaction = + pallet_transaction_payment::CurrencyAdapter>; + type OperationalFeeMultiplier = ConstU8<5>; + type WeightToFee = WeightToFee; + type LengthToFee = ConstantMultiplier; + type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; +} + +parameter_types! { + pub const ReservedXcmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); + pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); + pub const RelayOrigin: AggregateMessageOrigin = AggregateMessageOrigin::Parent; +} + +impl cumulus_pallet_parachain_system::Config for Runtime { + type WeightInfo = weights::cumulus_pallet_parachain_system::WeightInfo; + type RuntimeEvent = RuntimeEvent; + type OnSystemEvent = (); + type SelfParaId = parachain_info::Pallet; + type DmpQueue = frame_support::traits::EnqueueWithOrigin; + type OutboundXcmpMessageSource = XcmpQueue; + type ReservedDmpWeight = ReservedDmpWeight; + type XcmpMessageHandler = XcmpQueue; + type ReservedXcmpWeight = ReservedXcmpWeight; + type CheckAssociatedRelayNumber = RelayNumberStrictlyIncreases; + type ConsensusHook = cumulus_pallet_aura_ext::FixedVelocityConsensusHook< + Runtime, + RELAY_CHAIN_SLOT_DURATION_MILLIS, + BLOCK_PROCESSING_VELOCITY, + UNINCLUDED_SEGMENT_CAPACITY, + >; +} + +impl parachain_info::Config for Runtime {} + +parameter_types! { + pub MessageQueueServiceWeight: Weight = Perbill::from_percent(35) * RuntimeBlockWeights::get().max_block; +} + +impl pallet_message_queue::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type WeightInfo = weights::pallet_message_queue::WeightInfo; + #[cfg(feature = "runtime-benchmarks")] + type MessageProcessor = pallet_message_queue::mock_helpers::NoopMessageProcessor< + cumulus_primitives_core::AggregateMessageOrigin, + >; + #[cfg(not(feature = "runtime-benchmarks"))] + type MessageProcessor = xcm_builder::ProcessXcmMessage< + AggregateMessageOrigin, + xcm_executor::XcmExecutor, + RuntimeCall, + >; + type Size = u32; + // The XCMP queue pallet is only ever able to handle the `Sibling(ParaId)` origin: + type QueueChangeHandler = NarrowOriginToSibling; + type QueuePausedQuery = NarrowOriginToSibling; + type HeapSize = sp_core::ConstU32<{ 64 * 1024 }>; + type MaxStale = sp_core::ConstU32<8>; + type ServiceWeight = MessageQueueServiceWeight; +} + +impl cumulus_pallet_aura_ext::Config for Runtime {} + +parameter_types! { + /// Fellows pluralistic body. + pub const FellowsBodyId: BodyId = BodyId::Technical; +} + +/// Privileged origin that represents Root or Fellows pluralistic body. +pub type RootOrFellows = EitherOfDiverse< + EnsureRoot, + EnsureXcm>, +>; + +parameter_types! { + /// The asset ID for the asset that we use to pay for message delivery fees. + pub FeeAssetId: AssetId = Concrete(WndRelayLocation::get()); + /// The base fee for the message delivery fees. + pub const BaseDeliveryFee: u128 = CENTS.saturating_mul(3); +} + +pub type PriceForSiblingParachainDelivery = polkadot_runtime_common::xcm_sender::ExponentialPrice< + FeeAssetId, + BaseDeliveryFee, + TransactionByteFee, + XcmpQueue, +>; + +impl cumulus_pallet_xcmp_queue::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type ChannelInfo = ParachainSystem; + type VersionWrapper = PolkadotXcm; + type XcmpQueue = TransformOrigin; + type MaxInboundSuspended = sp_core::ConstU32<1_000>; + type ControllerOrigin = RootOrFellows; + type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin; + type WeightInfo = weights::cumulus_pallet_xcmp_queue::WeightInfo; + type PriceForSiblingDelivery = PriceForSiblingParachainDelivery; +} + +pub const PERIOD: u32 = 6 * HOURS; +pub const OFFSET: u32 = 0; + +impl pallet_session::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type ValidatorId = ::AccountId; + // we don't have stash and controller, thus we don't need the convert as well. + type ValidatorIdOf = pallet_collator_selection::IdentityCollator; + type ShouldEndSession = pallet_session::PeriodicSessions, ConstU32>; + type NextSessionRotation = pallet_session::PeriodicSessions, ConstU32>; + type SessionManager = CollatorSelection; + // Essentially just Aura, but let's be pedantic. + type SessionHandler = ::KeyTypeIdProviders; + type Keys = SessionKeys; + type WeightInfo = weights::pallet_session::WeightInfo; +} + +impl pallet_aura::Config for Runtime { + type AuthorityId = AuraId; + type DisabledValidators = (); + type MaxAuthorities = ConstU32<100_000>; + type AllowMultipleBlocksPerSlot = ConstBool; + #[cfg(feature = "experimental")] + type SlotDuration = pallet_aura::MinimumPeriodTimesTwo; +} + +parameter_types! { + pub const PotId: PalletId = PalletId(*b"PotStake"); + pub const SessionLength: BlockNumber = 6 * HOURS; + /// StakingAdmin pluralistic body. + pub const StakingAdminBodyId: BodyId = BodyId::Defense; +} + +/// We allow Root and the `StakingAdmin` to execute privileged collator selection operations. +pub type CollatorSelectionUpdateOrigin = EitherOfDiverse< + EnsureRoot, + EnsureXcm>, +>; + +impl pallet_collator_selection::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Currency = Balances; + type UpdateOrigin = CollatorSelectionUpdateOrigin; + type PotId = PotId; + type MaxCandidates = ConstU32<100>; + type MinEligibleCollators = ConstU32<4>; + type MaxInvulnerables = ConstU32<20>; + // should be a multiple of session or things will get inconsistent + type KickThreshold = ConstU32; + type ValidatorId = ::AccountId; + type ValidatorIdOf = pallet_collator_selection::IdentityCollator; + type ValidatorRegistration = Session; + type WeightInfo = weights::pallet_collator_selection::WeightInfo; +} + +parameter_types! { + /// One storage item; key size is 32; value is size 4+4+16+32 bytes = 56 bytes. + pub const DepositBase: Balance = deposit(1, 88); + /// Additional storage item size of 32 bytes. + pub const DepositFactor: Balance = deposit(0, 32); +} + +impl pallet_multisig::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; + type Currency = Balances; + type DepositBase = DepositBase; + type DepositFactor = DepositFactor; + type MaxSignatories = ConstU32<100>; + type WeightInfo = weights::pallet_multisig::WeightInfo; +} + +impl pallet_utility::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; + type PalletsOrigin = OriginCaller; + type WeightInfo = weights::pallet_utility::WeightInfo; +} + +impl pallet_sudo::Config for Runtime { + type RuntimeCall = RuntimeCall; + type RuntimeEvent = RuntimeEvent; + type WeightInfo = pallet_sudo::weights::SubstrateWeight; +} + +// Create the runtime by composing the FRAME pallets that were previously configured. +construct_runtime!( + pub enum Runtime + { + // System support stuff. + System: frame_system = 0, + ParachainSystem: cumulus_pallet_parachain_system = 1, + Timestamp: pallet_timestamp = 3, + ParachainInfo: parachain_info = 4, + + // Monetary stuff. + Balances: pallet_balances = 10, + TransactionPayment: pallet_transaction_payment = 11, + + // Collator support. The order of these 5 are important and shall not change. + Authorship: pallet_authorship = 20, + CollatorSelection: pallet_collator_selection = 21, + Session: pallet_session = 22, + Aura: pallet_aura = 23, + AuraExt: cumulus_pallet_aura_ext = 24, + + // XCM & related + XcmpQueue: cumulus_pallet_xcmp_queue = 30, + PolkadotXcm: pallet_xcm = 31, + CumulusXcm: cumulus_pallet_xcm = 32, + MessageQueue: pallet_message_queue = 34, + + // Handy utilities. + Utility: pallet_utility = 40, + Multisig: pallet_multisig = 41, + + // Sudo + Sudo: pallet_sudo = 100, + } +); + +#[cfg(feature = "runtime-benchmarks")] +#[macro_use] +extern crate frame_benchmarking; + +#[cfg(feature = "runtime-benchmarks")] +mod benches { + define_benchmarks!( + [frame_system, SystemBench::] + [cumulus_pallet_parachain_system, ParachainSystem] + [pallet_timestamp, Timestamp] + [pallet_balances, Balances] + [pallet_collator_selection, CollatorSelection] + [pallet_session, SessionBench::] + [cumulus_pallet_xcmp_queue, XcmpQueue] + [pallet_xcm, PalletXcmExtrinsicsBenchmark::] + [pallet_message_queue, MessageQueue] + [pallet_multisig, Multisig] + [pallet_utility, Utility] + // NOTE: Make sure you point to the individual modules below. + [pallet_xcm_benchmarks::fungible, XcmBalances] + [pallet_xcm_benchmarks::generic, XcmGeneric] + ); +} + +impl_runtime_apis! { + impl sp_consensus_aura::AuraApi for Runtime { + fn slot_duration() -> sp_consensus_aura::SlotDuration { + sp_consensus_aura::SlotDuration::from_millis(Aura::slot_duration()) + } + + fn authorities() -> Vec { + Aura::authorities().into_inner() + } + } + + impl sp_api::Core for Runtime { + fn version() -> RuntimeVersion { + VERSION + } + + fn execute_block(block: Block) { + Executive::execute_block(block) + } + + fn initialize_block(header: &::Header) { + Executive::initialize_block(header) + } + } + + impl sp_api::Metadata for Runtime { + fn metadata() -> OpaqueMetadata { + OpaqueMetadata::new(Runtime::metadata().into()) + } + + fn metadata_at_version(version: u32) -> Option { + Runtime::metadata_at_version(version) + } + + fn metadata_versions() -> sp_std::vec::Vec { + Runtime::metadata_versions() + } + } + + impl sp_block_builder::BlockBuilder for Runtime { + fn apply_extrinsic(extrinsic: ::Extrinsic) -> ApplyExtrinsicResult { + Executive::apply_extrinsic(extrinsic) + } + + fn finalize_block() -> ::Header { + Executive::finalize_block() + } + + fn inherent_extrinsics(data: sp_inherents::InherentData) -> Vec<::Extrinsic> { + data.create_extrinsics() + } + + fn check_inherents( + block: Block, + data: sp_inherents::InherentData, + ) -> sp_inherents::CheckInherentsResult { + data.check_extrinsics(&block) + } + } + + impl sp_transaction_pool::runtime_api::TaggedTransactionQueue for Runtime { + fn validate_transaction( + source: TransactionSource, + tx: ::Extrinsic, + block_hash: ::Hash, + ) -> TransactionValidity { + Executive::validate_transaction(source, tx, block_hash) + } + } + + impl sp_offchain::OffchainWorkerApi for Runtime { + fn offchain_worker(header: &::Header) { + Executive::offchain_worker(header) + } + } + + impl sp_session::SessionKeys for Runtime { + fn generate_session_keys(seed: Option>) -> Vec { + SessionKeys::generate(seed) + } + + fn decode_session_keys( + encoded: Vec, + ) -> Option, KeyTypeId)>> { + SessionKeys::decode_into_raw_public_keys(&encoded) + } + } + + impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime { + fn account_nonce(account: AccountId) -> Nonce { + System::account_nonce(account) + } + } + + impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi for Runtime { + fn query_info( + uxt: ::Extrinsic, + len: u32, + ) -> pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo { + TransactionPayment::query_info(uxt, len) + } + fn query_fee_details( + uxt: ::Extrinsic, + len: u32, + ) -> pallet_transaction_payment::FeeDetails { + TransactionPayment::query_fee_details(uxt, len) + } + fn query_weight_to_fee(weight: Weight) -> Balance { + TransactionPayment::weight_to_fee(weight) + } + fn query_length_to_fee(length: u32) -> Balance { + TransactionPayment::length_to_fee(length) + } + } + + impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentCallApi + for Runtime + { + fn query_call_info( + call: RuntimeCall, + len: u32, + ) -> pallet_transaction_payment::RuntimeDispatchInfo { + TransactionPayment::query_call_info(call, len) + } + fn query_call_fee_details( + call: RuntimeCall, + len: u32, + ) -> pallet_transaction_payment::FeeDetails { + TransactionPayment::query_call_fee_details(call, len) + } + fn query_weight_to_fee(weight: Weight) -> Balance { + TransactionPayment::weight_to_fee(weight) + } + fn query_length_to_fee(length: u32) -> Balance { + TransactionPayment::length_to_fee(length) + } + } + + impl cumulus_primitives_core::CollectCollationInfo for Runtime { + fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { + ParachainSystem::collect_collation_info(header) + } + } + + #[cfg(feature = "try-runtime")] + impl frame_try_runtime::TryRuntime for Runtime { + fn on_runtime_upgrade(checks: frame_try_runtime::UpgradeCheckSelect) -> (Weight, Weight) { + let weight = Executive::try_runtime_upgrade(checks).unwrap(); + (weight, RuntimeBlockWeights::get().max_block) + } + + fn execute_block( + block: Block, + state_root_check: bool, + signature_check: bool, + select: frame_try_runtime::TryStateSelect, + ) -> Weight { + // NOTE: intentional unwrap: we don't want to propagate the error backwards, and want to + // have a backtrace here. + Executive::try_execute_block(block, state_root_check, signature_check, select).unwrap() + } + } + + #[cfg(feature = "runtime-benchmarks")] + impl frame_benchmarking::Benchmark for Runtime { + fn benchmark_metadata(extra: bool) -> ( + Vec, + Vec, + ) { + use frame_benchmarking::{Benchmarking, BenchmarkList}; + use frame_support::traits::StorageInfoTrait; + use frame_system_benchmarking::Pallet as SystemBench; + use cumulus_pallet_session_benchmarking::Pallet as SessionBench; + use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsicsBenchmark; + + // This is defined once again in dispatch_benchmark, because list_benchmarks! + // and add_benchmarks! are macros exported by define_benchmarks! macros and those types + // are referenced in that call. + type XcmBalances = pallet_xcm_benchmarks::fungible::Pallet::; + type XcmGeneric = pallet_xcm_benchmarks::generic::Pallet::; + + let mut list = Vec::::new(); + list_benchmarks!(list, extra); + + let storage_info = AllPalletsWithSystem::storage_info(); + (list, storage_info) + } + + fn dispatch_benchmark( + config: frame_benchmarking::BenchmarkConfig + ) -> Result, sp_runtime::RuntimeString> { + use frame_benchmarking::{Benchmarking, BenchmarkBatch, BenchmarkError}; + use sp_storage::TrackedStorageKey; + + use frame_system_benchmarking::Pallet as SystemBench; + impl frame_system_benchmarking::Config for Runtime { + fn setup_set_code_requirements(code: &sp_std::vec::Vec) -> Result<(), BenchmarkError> { + ParachainSystem::initialize_for_set_code_benchmark(code.len() as u32); + Ok(()) + } + + fn verify_set_code() { + System::assert_last_event(cumulus_pallet_parachain_system::Event::::ValidationFunctionStored.into()); + } + } + + use cumulus_pallet_session_benchmarking::Pallet as SessionBench; + impl cumulus_pallet_session_benchmarking::Config for Runtime {} + + use xcm::latest::prelude::*; + use xcm_config::WndRelayLocation; + + use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsicsBenchmark; + impl pallet_xcm::benchmarking::Config for Runtime { + fn reachable_dest() -> Option { + Some(Parent.into()) + } + + fn teleportable_asset_and_dest() -> Option<(MultiAsset, MultiLocation)> { + // Relay/native token can be teleported between AH and Relay. + Some(( + MultiAsset { + fun: Fungible(EXISTENTIAL_DEPOSIT), + id: Concrete(Parent.into()) + }, + Parent.into(), + )) + } + + fn reserve_transferable_asset_and_dest() -> Option<(MultiAsset, MultiLocation)> { + // Reserve transfers are disabled + None + } + } + + parameter_types! { + pub ExistentialDepositMultiAsset: Option = Some(( + WndRelayLocation::get(), + ExistentialDeposit::get() + ).into()); + } + + impl pallet_xcm_benchmarks::Config for Runtime { + type XcmConfig = xcm_config::XcmConfig; + type DeliveryHelper = cumulus_primitives_utility::ToParentDeliveryHelper< + xcm_config::XcmConfig, + ExistentialDepositMultiAsset, + xcm_config::PriceForParentDelivery, + >; + type AccountIdConverter = xcm_config::LocationToAccountId; + fn valid_destination() -> Result { + Ok(WndRelayLocation::get()) + } + fn worst_case_holding(_depositable_count: u32) -> MultiAssets { + // just concrete assets according to relay chain. + let assets: Vec = vec![ + MultiAsset { + id: Concrete(WndRelayLocation::get()), + fun: Fungible(1_000_000 * UNITS), + } + ]; + assets.into() + } + } + + parameter_types! { + pub const TrustedTeleporter: Option<(MultiLocation, MultiAsset)> = Some(( + WndRelayLocation::get(), + MultiAsset { fun: Fungible(UNITS), id: Concrete(WndRelayLocation::get()) }, + )); + pub const CheckedAccount: Option<(AccountId, xcm_builder::MintLocation)> = None; + pub const TrustedReserve: Option<(MultiLocation, MultiAsset)> = None; + } + + impl pallet_xcm_benchmarks::fungible::Config for Runtime { + type TransactAsset = Balances; + + type CheckedAccount = CheckedAccount; + type TrustedTeleporter = TrustedTeleporter; + type TrustedReserve = TrustedReserve; + + fn get_multi_asset() -> MultiAsset { + MultiAsset { + id: Concrete(WndRelayLocation::get()), + fun: Fungible(UNITS), + } + } + } + + impl pallet_xcm_benchmarks::generic::Config for Runtime { + type RuntimeCall = RuntimeCall; + type TransactAsset = Balances; + + fn worst_case_response() -> (u64, Response) { + (0u64, Response::Version(Default::default())) + } + + fn worst_case_asset_exchange() -> Result<(MultiAssets, MultiAssets), BenchmarkError> { + Err(BenchmarkError::Skip) + } + + fn universal_alias() -> Result<(MultiLocation, Junction), BenchmarkError> { + Err(BenchmarkError::Skip) + } + + fn transact_origin_and_runtime_call() -> Result<(MultiLocation, RuntimeCall), BenchmarkError> { + Ok((WndRelayLocation::get(), frame_system::Call::remark_with_event { remark: vec![] }.into())) + } + + fn subscribe_origin() -> Result { + Ok(WndRelayLocation::get()) + } + + fn claimable_asset() -> Result<(MultiLocation, MultiLocation, MultiAssets), BenchmarkError> { + let origin = WndRelayLocation::get(); + let assets: MultiAssets = (Concrete(WndRelayLocation::get()), 1_000 * UNITS).into(); + let ticket = MultiLocation { parents: 0, interior: Here }; + Ok((origin, ticket, assets)) + } + + fn unlockable_asset() -> Result<(MultiLocation, MultiLocation, MultiAsset), BenchmarkError> { + Err(BenchmarkError::Skip) + } + + fn export_message_origin_and_destination( + ) -> Result<(MultiLocation, NetworkId, InteriorMultiLocation), BenchmarkError> { + Err(BenchmarkError::Skip) + } + + fn alias_origin() -> Result<(MultiLocation, MultiLocation), BenchmarkError> { + Err(BenchmarkError::Skip) + } + } + + type XcmBalances = pallet_xcm_benchmarks::fungible::Pallet::; + type XcmGeneric = pallet_xcm_benchmarks::generic::Pallet::; + + let whitelist: Vec = vec![ + // Block Number + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac").to_vec().into(), + // Total Issuance + hex_literal::hex!("c2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80").to_vec().into(), + // Execution Phase + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7ff553b5a9862a516939d82b3d3d8661a").to_vec().into(), + // Event Count + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef70a98fdbe9ce6c55837576c60c7af3850").to_vec().into(), + // System Events + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7").to_vec().into(), + ]; + + let mut batches = Vec::::new(); + let params = (&config, &whitelist); + add_benchmarks!(params, batches); + + Ok(batches) + } + } + + impl sp_genesis_builder::GenesisBuilder for Runtime { + fn create_default_config() -> Vec { + create_default_config::() + } + + fn build_config(config: Vec) -> sp_genesis_builder::Result { + build_config::(config) + } + } +} + +cumulus_pallet_parachain_system::register_validate_block! { + Runtime = Runtime, + BlockExecutor = cumulus_pallet_aura_ext::BlockExecutor::, +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/block_weights.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/block_weights.rs new file mode 100644 index 00000000000..2bd7975bf98 --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/block_weights.rs @@ -0,0 +1,53 @@ +// This file is part of Substrate. + +// Copyright (C) 2023 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +pub mod constants { + use frame_support::{ + parameter_types, + weights::{constants, Weight}, + }; + + parameter_types! { + /// Importing a block with 0 Extrinsics. + pub const BlockExecutionWeight: Weight = + Weight::from_parts(constants::WEIGHT_REF_TIME_PER_NANOS.saturating_mul(5_000_000), 0); + } + + #[cfg(test)] + mod test_weights { + use frame_support::weights::constants; + + /// Checks that the weight exists and is sane. + // NOTE: If this test fails but you are sure that the generated values are fine, + // you can delete it. + #[test] + fn sane() { + let w = super::constants::BlockExecutionWeight::get(); + + // At least 100 µs. + assert!( + w.ref_time() >= 100u64 * constants::WEIGHT_REF_TIME_PER_MICROS, + "Weight should be at least 100 µs." + ); + // At most 50 ms. + assert!( + w.ref_time() <= 50u64 * constants::WEIGHT_REF_TIME_PER_MILLIS, + "Weight should be at most 50 ms." + ); + } + } +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/cumulus_pallet_parachain_system.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/cumulus_pallet_parachain_system.rs new file mode 100644 index 00000000000..0303151d7f8 --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/cumulus_pallet_parachain_system.rs @@ -0,0 +1,53 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `cumulus_pallet_xcmp_queue`. +pub struct WeightInfo(PhantomData); +impl cumulus_pallet_parachain_system::WeightInfo for WeightInfo { + /// Storage: ParachainSystem LastDmqMqcHead (r:1 w:1) + /// Proof Skipped: ParachainSystem LastDmqMqcHead (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem ReservedDmpWeightOverride (r:1 w:0) + /// Proof Skipped: ParachainSystem ReservedDmpWeightOverride (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: MessageQueue BookStateFor (r:1 w:1) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: MessageQueue ServiceHead (r:1 w:1) + /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(5), added: 500, mode: MaxEncodedLen) + /// Storage: ParachainSystem ProcessedDownwardMessages (r:0 w:1) + /// Proof Skipped: ParachainSystem ProcessedDownwardMessages (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: MessageQueue Pages (r:0 w:16) + /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + /// The range of component `n` is `[0, 1000]`. + fn enqueue_inbound_downward_messages(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `12` + // Estimated: `8013` + // Minimum execution time: 1_645_000 picoseconds. + Weight::from_parts(1_717_000, 0) + .saturating_add(Weight::from_parts(0, 8013)) + // Standard Error: 12_258 + .saturating_add(Weight::from_parts(24_890_934, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(4)) + } +} \ No newline at end of file diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/cumulus_pallet_xcmp_queue.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/cumulus_pallet_xcmp_queue.rs new file mode 100644 index 00000000000..124571118aa --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/cumulus_pallet_xcmp_queue.rs @@ -0,0 +1,151 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +//! Autogenerated weights for `cumulus_pallet_xcmp_queue` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("coretime-westend-dev"), DB CACHE: 1024 + +// Executed Command: +// ./artifacts/westend-parachain +// benchmark +// pallet +// --chain=coretime-westend-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=cumulus_pallet_xcmp_queue +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json +// --header=./file_header.txt +// --output=./cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/cumulus_pallet_xcmp_queue.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `cumulus_pallet_xcmp_queue`. +pub struct WeightInfo(PhantomData); +impl cumulus_pallet_xcmp_queue::WeightInfo for WeightInfo { + /// Storage: XcmpQueue QueueConfig (r:1 w:1) + /// Proof Skipped: XcmpQueue QueueConfig (max_values: Some(1), max_size: None, mode: Measured) + fn set_config_with_u32() -> Weight { + // Proof Size summary in bytes: + // Measured: `76` + // Estimated: `1561` + // Minimum execution time: 5_621_000 picoseconds. + Weight::from_parts(5_845_000, 0) + .saturating_add(Weight::from_parts(0, 1561)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `XcmpQueue::QueueConfig` (r:1 w:0) + /// Proof: `XcmpQueue::QueueConfig` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `MessageQueue::BookStateFor` (r:1 w:1) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + /// Storage: `MessageQueue::ServiceHead` (r:1 w:1) + /// Proof: `MessageQueue::ServiceHead` (`max_values`: Some(1), `max_size`: Some(5), added: 500, mode: `MaxEncodedLen`) + /// Storage: `XcmpQueue::InboundXcmpSuspended` (r:1 w:0) + /// Proof: `XcmpQueue::InboundXcmpSuspended` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `MessageQueue::Pages` (r:0 w:1) + /// Proof: `MessageQueue::Pages` (`max_values`: None, `max_size`: Some(65585), added: 68060, mode: `MaxEncodedLen`) + fn enqueue_xcmp_message() -> Weight { + // Proof Size summary in bytes: + // Measured: `82` + // Estimated: `3517` + // Minimum execution time: 14_000_000 picoseconds. + Weight::from_parts(15_000_000, 0) + .saturating_add(Weight::from_parts(0, 3517)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:1) + /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn suspend_channel() -> Weight { + // Proof Size summary in bytes: + // Measured: `76` + // Estimated: `1561` + // Minimum execution time: 3_000_000 picoseconds. + Weight::from_parts(3_000_000, 0) + .saturating_add(Weight::from_parts(0, 1561)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:1) + /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn resume_channel() -> Weight { + // Proof Size summary in bytes: + // Measured: `111` + // Estimated: `1596` + // Minimum execution time: 4_000_000 picoseconds. + Weight::from_parts(4_000_000, 0) + .saturating_add(Weight::from_parts(0, 1596)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + fn take_first_concatenated_xcm() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 44_000_000 picoseconds. + Weight::from_parts(45_000_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + /// Storage: UNKNOWN KEY `0x7b3237373ffdfeb1cab4222e3b520d6b345d8e88afa015075c945637c07e8f20` (r:1 w:1) + /// Proof: UNKNOWN KEY `0x7b3237373ffdfeb1cab4222e3b520d6b345d8e88afa015075c945637c07e8f20` (r:1 w:1) + /// Storage: `XcmpQueue::InboundXcmpMessages` (r:1 w:1) + /// Proof: `XcmpQueue::InboundXcmpMessages` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `MessageQueue::BookStateFor` (r:1 w:1) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + /// Storage: `MessageQueue::ServiceHead` (r:1 w:1) + /// Proof: `MessageQueue::ServiceHead` (`max_values`: Some(1), `max_size`: Some(5), added: 500, mode: `MaxEncodedLen`) + /// Storage: `XcmpQueue::QueueConfig` (r:1 w:0) + /// Proof: `XcmpQueue::QueueConfig` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `XcmpQueue::InboundXcmpSuspended` (r:1 w:0) + /// Proof: `XcmpQueue::InboundXcmpSuspended` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `MessageQueue::Pages` (r:0 w:1) + /// Proof: `MessageQueue::Pages` (`max_values`: None, `max_size`: Some(65585), added: 68060, mode: `MaxEncodedLen`) + fn on_idle_good_msg() -> Weight { + // Proof Size summary in bytes: + // Measured: `65711` + // Estimated: `69176` + // Minimum execution time: 67_000_000 picoseconds. + Weight::from_parts(73_000_000, 0) + .saturating_add(Weight::from_parts(0, 69176)) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(5)) + } + /// Storage: UNKNOWN KEY `0x7b3237373ffdfeb1cab4222e3b520d6b345d8e88afa015075c945637c07e8f20` (r:1 w:1) + /// Proof: UNKNOWN KEY `0x7b3237373ffdfeb1cab4222e3b520d6b345d8e88afa015075c945637c07e8f20` (r:1 w:1) + fn on_idle_large_msg() -> Weight { + // Proof Size summary in bytes: + // Measured: `65710` + // Estimated: `69175` + // Minimum execution time: 49_000_000 picoseconds. + Weight::from_parts(55_000_000, 0) + .saturating_add(Weight::from_parts(0, 69175)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/extrinsic_weights.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/extrinsic_weights.rs new file mode 100644 index 00000000000..898d72ec5b1 --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/extrinsic_weights.rs @@ -0,0 +1,53 @@ +// This file is part of Substrate. + +// Copyright (C) 2023 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +pub mod constants { + use frame_support::{ + parameter_types, + weights::{constants, Weight}, + }; + + parameter_types! { + /// Executing a NO-OP `System::remarks` Extrinsic. + pub const ExtrinsicBaseWeight: Weight = + Weight::from_parts(constants::WEIGHT_REF_TIME_PER_NANOS.saturating_mul(125_000), 0); + } + + #[cfg(test)] + mod test_weights { + use frame_support::weights::constants; + + /// Checks that the weight exists and is sane. + // NOTE: If this test fails but you are sure that the generated values are fine, + // you can delete it. + #[test] + fn sane() { + let w = super::constants::ExtrinsicBaseWeight::get(); + + // At least 10 µs. + assert!( + w.ref_time() >= 10u64 * constants::WEIGHT_REF_TIME_PER_MICROS, + "Weight should be at least 10 µs." + ); + // At most 1 ms. + assert!( + w.ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, + "Weight should be at most 1 ms." + ); + } + } +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/frame_system.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/frame_system.rs new file mode 100644 index 00000000000..667b99e7849 --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/frame_system.rs @@ -0,0 +1,134 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +//! Autogenerated weights for `frame_system` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("coretime-westend-dev"), DB CACHE: 1024 + +// Executed Command: +// ./artifacts/westend-parachain +// benchmark +// pallet +// --chain=coretime-westend-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=frame_system +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json +// --header=./file_header.txt +// --output=./cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/frame_system.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `frame_system`. +pub struct WeightInfo(PhantomData); +impl frame_system::WeightInfo for WeightInfo { + /// The range of component `b` is `[0, 3932160]`. + fn remark(b: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_432_000 picoseconds. + Weight::from_parts(2_458_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + // Standard Error: 0 + .saturating_add(Weight::from_parts(367, 0).saturating_mul(b.into())) + } + /// The range of component `b` is `[0, 3932160]`. + fn remark_with_event(b: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 7_911_000 picoseconds. + Weight::from_parts(8_031_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + // Standard Error: 0 + .saturating_add(Weight::from_parts(1_405, 0).saturating_mul(b.into())) + } + /// Storage: System Digest (r:1 w:1) + /// Proof Skipped: System Digest (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: unknown `0x3a686561707061676573` (r:0 w:1) + /// Proof Skipped: unknown `0x3a686561707061676573` (r:0 w:1) + fn set_heap_pages() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `1485` + // Minimum execution time: 4_304_000 picoseconds. + Weight::from_parts(4_553_000, 0) + .saturating_add(Weight::from_parts(0, 1485)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(2)) + } + fn set_code() -> Weight { + Weight::from_parts(1_000_000, 0) + } + /// Storage: Skipped Metadata (r:0 w:0) + /// Proof Skipped: Skipped Metadata (max_values: None, max_size: None, mode: Measured) + /// The range of component `i` is `[0, 1000]`. + fn set_storage(i: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_493_000 picoseconds. + Weight::from_parts(2_523_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + // Standard Error: 1_594 + .saturating_add(Weight::from_parts(663_439, 0).saturating_mul(i.into())) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) + } + /// Storage: Skipped Metadata (r:0 w:0) + /// Proof Skipped: Skipped Metadata (max_values: None, max_size: None, mode: Measured) + /// The range of component `i` is `[0, 1000]`. + fn kill_storage(i: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_492_000 picoseconds. + Weight::from_parts(2_526_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + // Standard Error: 784 + .saturating_add(Weight::from_parts(493_844, 0).saturating_mul(i.into())) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) + } + /// Storage: Skipped Metadata (r:0 w:0) + /// Proof Skipped: Skipped Metadata (max_values: None, max_size: None, mode: Measured) + /// The range of component `p` is `[0, 1000]`. + fn kill_prefix(p: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `68 + p * (69 ±0)` + // Estimated: `66 + p * (70 ±0)` + // Minimum execution time: 4_200_000 picoseconds. + Weight::from_parts(4_288_000, 0) + .saturating_add(Weight::from_parts(0, 66)) + // Standard Error: 1_195 + .saturating_add(Weight::from_parts(1_021_563, 0).saturating_mul(p.into())) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(p.into()))) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) + .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) + } +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/mod.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/mod.rs new file mode 100644 index 00000000000..6bc733844e6 --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/mod.rs @@ -0,0 +1,40 @@ +// This file is part of Substrate. + +// Copyright (C) 2023 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Expose the auto generated weight files. + +pub mod block_weights; +pub mod cumulus_pallet_parachain_system; +pub mod cumulus_pallet_xcmp_queue; +pub mod extrinsic_weights; +pub mod frame_system; +pub mod pallet_balances; +pub mod pallet_collator_selection; +pub mod pallet_message_queue; +pub mod pallet_multisig; +pub mod pallet_session; +pub mod pallet_timestamp; +pub mod pallet_utility; +pub mod pallet_xcm; +pub mod paritydb_weights; +pub mod rocksdb_weights; +pub mod xcm; + +pub use block_weights::constants::BlockExecutionWeight; +pub use extrinsic_weights::constants::ExtrinsicBaseWeight; +pub use paritydb_weights::constants::ParityDbWeight; +pub use rocksdb_weights::constants::RocksDbWeight; diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_balances.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_balances.rs new file mode 100644 index 00000000000..65d5a55c72e --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_balances.rs @@ -0,0 +1,151 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +//! Autogenerated weights for `pallet_balances` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("coretime-westend-dev"), DB CACHE: 1024 + +// Executed Command: +// ./artifacts/westend-parachain +// benchmark +// pallet +// --chain=coretime-westend-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_balances +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json +// --header=./file_header.txt +// --output=./cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_balances.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_balances`. +pub struct WeightInfo(PhantomData); +impl pallet_balances::WeightInfo for WeightInfo { + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + fn transfer_allow_death() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `3593` + // Minimum execution time: 59_580_000 picoseconds. + Weight::from_parts(60_317_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + fn transfer_keep_alive() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `3593` + // Minimum execution time: 45_490_000 picoseconds. + Weight::from_parts(45_910_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + fn force_set_balance_creating() -> Weight { + // Proof Size summary in bytes: + // Measured: `174` + // Estimated: `3593` + // Minimum execution time: 17_353_000 picoseconds. + Weight::from_parts(17_676_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + fn force_set_balance_killing() -> Weight { + // Proof Size summary in bytes: + // Measured: `174` + // Estimated: `3593` + // Minimum execution time: 25_017_000 picoseconds. + Weight::from_parts(25_542_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: System Account (r:2 w:2) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + fn force_transfer() -> Weight { + // Proof Size summary in bytes: + // Measured: `103` + // Estimated: `6196` + // Minimum execution time: 61_161_000 picoseconds. + Weight::from_parts(61_665_000, 0) + .saturating_add(Weight::from_parts(0, 6196)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + fn transfer_all() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `3593` + // Minimum execution time: 55_422_000 picoseconds. + Weight::from_parts(55_880_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + fn force_unreserve() -> Weight { + // Proof Size summary in bytes: + // Measured: `174` + // Estimated: `3593` + // Minimum execution time: 20_477_000 picoseconds. + Weight::from_parts(20_871_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: System Account (r:999 w:999) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// The range of component `u` is `[1, 1000]`. + fn upgrade_accounts(u: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0 + u * (136 ±0)` + // Estimated: `990 + u * (2603 ±0)` + // Minimum execution time: 19_501_000 picoseconds. + Weight::from_parts(19_726_000, 0) + .saturating_add(Weight::from_parts(0, 990)) + // Standard Error: 9_495 + .saturating_add(Weight::from_parts(15_658_957, 0).saturating_mul(u.into())) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) + .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) + } +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_collator_selection.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_collator_selection.rs new file mode 100644 index 00000000000..2adddecab26 --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_collator_selection.rs @@ -0,0 +1,243 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +//! Autogenerated weights for `pallet_collator_selection` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("coretime-westend-dev"), DB CACHE: 1024 + +// Executed Command: +// ./artifacts/westend-parachain +// benchmark +// pallet +// --chain=coretime-westend-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_collator_selection +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json +// --header=./file_header.txt +// --output=./cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_collator_selection.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_collator_selection`. +pub struct WeightInfo(PhantomData); +impl pallet_collator_selection::WeightInfo for WeightInfo { + /// Storage: Session NextKeys (r:100 w:0) + /// Proof Skipped: Session NextKeys (max_values: None, max_size: None, mode: Measured) + /// Storage: CollatorSelection Invulnerables (r:0 w:1) + /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) + /// The range of component `b` is `[1, 100]`. + fn set_invulnerables(b: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `214 + b * (78 ±0)` + // Estimated: `1203 + b * (2554 ±0)` + // Minimum execution time: 14_426_000 picoseconds. + Weight::from_parts(14_971_974, 0) + .saturating_add(Weight::from_parts(0, 1203)) + // Standard Error: 2_914 + .saturating_add(Weight::from_parts(2_604_699, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b.into()))) + .saturating_add(T::DbWeight::get().writes(1)) + .saturating_add(Weight::from_parts(0, 2554).saturating_mul(b.into())) + } + /// Storage: CollatorSelection DesiredCandidates (r:0 w:1) + /// Proof: CollatorSelection DesiredCandidates (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + fn set_desired_candidates() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 6_977_000 picoseconds. + Weight::from_parts(7_246_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `CollatorSelection::CandidacyBond` (r:0 w:1) + /// Proof: `CollatorSelection::CandidacyBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + fn set_candidacy_bond(_c: u32, _k: u32) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 7_937_000 picoseconds. + Weight::from_parts(8_161_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: CollatorSelection Candidates (r:1 w:1) + /// Proof: CollatorSelection Candidates (max_values: Some(1), max_size: Some(48002), added: 48497, mode: MaxEncodedLen) + /// Storage: CollatorSelection DesiredCandidates (r:1 w:0) + /// Proof: CollatorSelection DesiredCandidates (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: CollatorSelection Invulnerables (r:1 w:0) + /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) + /// Storage: Session NextKeys (r:1 w:0) + /// Proof Skipped: Session NextKeys (max_values: None, max_size: None, mode: Measured) + /// Storage: CollatorSelection CandidacyBond (r:1 w:0) + /// Proof: CollatorSelection CandidacyBond (max_values: Some(1), max_size: Some(16), added: 511, mode: MaxEncodedLen) + /// Storage: CollatorSelection LastAuthoredBlock (r:0 w:1) + /// Proof: CollatorSelection LastAuthoredBlock (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) + /// The range of component `c` is `[1, 999]`. + fn register_as_candidate(c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `1104 + c * (48 ±0)` + // Estimated: `49487 + c * (49 ±0)` + // Minimum execution time: 42_275_000 picoseconds. + Weight::from_parts(33_742_215, 0) + .saturating_add(Weight::from_parts(0, 49487)) + // Standard Error: 1_291 + .saturating_add(Weight::from_parts(103_381, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(2)) + .saturating_add(Weight::from_parts(0, 49).saturating_mul(c.into())) + } + /// Storage: CollatorSelection Candidates (r:1 w:1) + /// Proof: CollatorSelection Candidates (max_values: Some(1), max_size: Some(48002), added: 48497, mode: MaxEncodedLen) + /// Storage: CollatorSelection LastAuthoredBlock (r:0 w:1) + /// Proof: CollatorSelection LastAuthoredBlock (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) + /// The range of component `c` is `[6, 1000]`. + fn leave_intent(c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `428 + c * (48 ±0)` + // Estimated: `49487` + // Minimum execution time: 33_404_000 picoseconds. + Weight::from_parts(22_612_617, 0) + .saturating_add(Weight::from_parts(0, 49487)) + // Standard Error: 1_341 + .saturating_add(Weight::from_parts(105_669, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(2)) + } + fn update_bond(c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `306 + c * (50 ±0)` + // Estimated: `6287` + // Minimum execution time: 34_814_000 picoseconds. + Weight::from_parts(36_371_520, 0) + .saturating_add(Weight::from_parts(0, 6287)) + // Standard Error: 2_391 + .saturating_add(Weight::from_parts(201_700, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + fn take_candidate_slot(c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `306 + c * (50 ±0)` + // Estimated: `6287` + // Minimum execution time: 34_814_000 picoseconds. + Weight::from_parts(36_371_520, 0) + .saturating_add(Weight::from_parts(0, 6287)) + // Standard Error: 2_391 + .saturating_add(Weight::from_parts(201_700, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: System Account (r:2 w:2) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: System BlockWeight (r:1 w:1) + /// Proof: System BlockWeight (max_values: Some(1), max_size: Some(48), added: 543, mode: MaxEncodedLen) + /// Storage: CollatorSelection LastAuthoredBlock (r:0 w:1) + /// Proof: CollatorSelection LastAuthoredBlock (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) + fn note_author() -> Weight { + // Proof Size summary in bytes: + // Measured: `155` + // Estimated: `6196` + // Minimum execution time: 44_415_000 picoseconds. + Weight::from_parts(44_732_000, 0) + .saturating_add(Weight::from_parts(0, 6196)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(4)) + } + /// Storage: Session NextKeys (r:1 w:0) + /// Proof Skipped: Session NextKeys (max_values: None, max_size: None, mode: Measured) + /// Storage: CollatorSelection Invulnerables (r:1 w:1) + /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(641), added: 1136, mode: MaxEncodedLen) + /// Storage: CollatorSelection Candidates (r:1 w:1) + /// Proof: CollatorSelection Candidates (max_values: Some(1), max_size: Some(4802), added: 5297, mode: MaxEncodedLen) + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// The range of component `b` is `[1, 19]`. + /// The range of component `c` is `[1, 99]`. + fn add_invulnerable(b: u32, c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `757 + b * (32 ±0) + c * (53 ±0)` + // Estimated: `6287 + b * (37 ±0) + c * (53 ±0)` + // Minimum execution time: 52_720_000 picoseconds. + Weight::from_parts(56_102_459, 0) + .saturating_add(Weight::from_parts(0, 6287)) + // Standard Error: 12_957 + .saturating_add(Weight::from_parts(26_422, 0).saturating_mul(b.into())) + // Standard Error: 2_456 + .saturating_add(Weight::from_parts(128_528, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(3)) + .saturating_add(Weight::from_parts(0, 37).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(0, 53).saturating_mul(c.into())) + } + /// Storage: CollatorSelection Invulnerables (r:1 w:1) + /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) + /// The range of component `b` is `[1, 100]`. + fn remove_invulnerable(b: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `119 + b * (32 ±0)` + // Estimated: `4687` + // Minimum execution time: 183_054_000 picoseconds. + Weight::from_parts(197_205_427, 0) + .saturating_add(Weight::from_parts(0, 4687)) + // Standard Error: 13_533 + .saturating_add(Weight::from_parts(376_231, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: CollatorSelection Candidates (r:1 w:0) + /// Proof: CollatorSelection Candidates (max_values: Some(1), max_size: Some(48002), added: 48497, mode: MaxEncodedLen) + /// Storage: CollatorSelection LastAuthoredBlock (r:999 w:0) + /// Proof: CollatorSelection LastAuthoredBlock (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) + /// Storage: CollatorSelection Invulnerables (r:1 w:0) + /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) + /// Storage: System BlockWeight (r:1 w:1) + /// Proof: System BlockWeight (max_values: Some(1), max_size: Some(48), added: 543, mode: MaxEncodedLen) + /// Storage: System Account (r:995 w:995) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// The range of component `r` is `[1, 1000]`. + /// The range of component `c` is `[1, 1000]`. + fn new_session(r: u32, c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `22815 + c * (97 ±0) + r * (116 ±0)` + // Estimated: `49487 + c * (2519 ±0) + r * (2602 ±0)` + // Minimum execution time: 16_765_000 picoseconds. + Weight::from_parts(16_997_000, 0) + .saturating_add(Weight::from_parts(0, 49487)) + // Standard Error: 860_677 + .saturating_add(Weight::from_parts(30_463_094, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into()))) + .saturating_add(T::DbWeight::get().writes(1)) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(c.into()))) + .saturating_add(Weight::from_parts(0, 2519).saturating_mul(c.into())) + .saturating_add(Weight::from_parts(0, 2602).saturating_mul(r.into())) + } +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_message_queue.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_message_queue.rs new file mode 100644 index 00000000000..651f27e10e5 --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_message_queue.rs @@ -0,0 +1,155 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +pub struct WeightInfo(PhantomData); +impl pallet_message_queue::WeightInfo for WeightInfo { + /// Storage: MessageQueue ServiceHead (r:1 w:0) + /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(5), added: 500, mode: MaxEncodedLen) + /// Storage: MessageQueue BookStateFor (r:2 w:2) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + fn ready_ring_knit() -> Weight { + // Proof Size summary in bytes: + // Measured: `189` + // Estimated: `7534` + // Minimum execution time: 11_446_000 picoseconds. + Weight::from_parts(11_446_000, 0) + .saturating_add(Weight::from_parts(0, 7534)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: MessageQueue BookStateFor (r:2 w:2) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: MessageQueue ServiceHead (r:1 w:1) + /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(5), added: 500, mode: MaxEncodedLen) + fn ready_ring_unknit() -> Weight { + // Proof Size summary in bytes: + // Measured: `184` + // Estimated: `7534` + // Minimum execution time: 10_613_000 picoseconds. + Weight::from_parts(10_613_000, 0) + .saturating_add(Weight::from_parts(0, 7534)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: MessageQueue BookStateFor (r:1 w:1) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + fn service_queue_base() -> Weight { + // Proof Size summary in bytes: + // Measured: `6` + // Estimated: `3517` + // Minimum execution time: 4_854_000 picoseconds. + Weight::from_parts(4_854_000, 0) + .saturating_add(Weight::from_parts(0, 3517)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: MessageQueue Pages (r:1 w:1) + /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + fn service_page_base_completion() -> Weight { + // Proof Size summary in bytes: + // Measured: `72` + // Estimated: `69050` + // Minimum execution time: 5_748_000 picoseconds. + Weight::from_parts(5_748_000, 0) + .saturating_add(Weight::from_parts(0, 69050)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: MessageQueue Pages (r:1 w:1) + /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + fn service_page_base_no_completion() -> Weight { + // Proof Size summary in bytes: + // Measured: `72` + // Estimated: `69050` + // Minimum execution time: 6_136_000 picoseconds. + Weight::from_parts(6_136_000, 0) + .saturating_add(Weight::from_parts(0, 69050)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + fn service_page_item() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 59_505_000 picoseconds. + Weight::from_parts(59_505_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + /// Storage: MessageQueue ServiceHead (r:1 w:1) + /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(5), added: 500, mode: MaxEncodedLen) + /// Storage: MessageQueue BookStateFor (r:1 w:0) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + fn bump_service_head() -> Weight { + // Proof Size summary in bytes: + // Measured: `99` + // Estimated: `5007` + // Minimum execution time: 6_506_000 picoseconds. + Weight::from_parts(6_506_000, 0) + .saturating_add(Weight::from_parts(0, 5007)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: MessageQueue BookStateFor (r:1 w:1) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: MessageQueue Pages (r:1 w:1) + /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + fn reap_page() -> Weight { + // Proof Size summary in bytes: + // Measured: `65667` + // Estimated: `72567` + // Minimum execution time: 40_646_000 picoseconds. + Weight::from_parts(40_646_000, 0) + .saturating_add(Weight::from_parts(0, 72567)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: MessageQueue BookStateFor (r:1 w:1) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: MessageQueue Pages (r:1 w:1) + /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + fn execute_overweight_page_removed() -> Weight { + // Proof Size summary in bytes: + // Measured: `65667` + // Estimated: `72567` + // Minimum execution time: 51_424_000 picoseconds. + Weight::from_parts(51_424_000, 0) + .saturating_add(Weight::from_parts(0, 72567)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: MessageQueue BookStateFor (r:1 w:1) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: MessageQueue Pages (r:1 w:1) + /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + fn execute_overweight_page_updated() -> Weight { + // Proof Size summary in bytes: + // Measured: `65667` + // Estimated: `72567` + // Minimum execution time: 81_153_000 picoseconds. + Weight::from_parts(81_153_000, 0) + .saturating_add(Weight::from_parts(0, 72567)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } +} \ No newline at end of file diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_multisig.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_multisig.rs new file mode 100644 index 00000000000..4130e05bf7c --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_multisig.rs @@ -0,0 +1,163 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +//! Autogenerated weights for `pallet_multisig` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("coretime-westend-dev"), DB CACHE: 1024 + +// Executed Command: +// ./artifacts/westend-parachain +// benchmark +// pallet +// --chain=coretime-westend-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_multisig +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json +// --header=./file_header.txt +// --output=./cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_multisig.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_multisig`. +pub struct WeightInfo(PhantomData); +impl pallet_multisig::WeightInfo for WeightInfo { + /// The range of component `z` is `[0, 10000]`. + fn as_multi_threshold_1(z: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 11_337_000 picoseconds. + Weight::from_parts(11_960_522, 0) + .saturating_add(Weight::from_parts(0, 0)) + // Standard Error: 9 + .saturating_add(Weight::from_parts(504, 0).saturating_mul(z.into())) + } + /// Storage: Multisig Multisigs (r:1 w:1) + /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) + /// The range of component `s` is `[2, 100]`. + /// The range of component `z` is `[0, 10000]`. + fn as_multi_create(s: u32, z: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `263 + s * (2 ±0)` + // Estimated: `6811` + // Minimum execution time: 41_128_000 picoseconds. + Weight::from_parts(35_215_592, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 429 + .saturating_add(Weight::from_parts(65_959, 0).saturating_mul(s.into())) + // Standard Error: 4 + .saturating_add(Weight::from_parts(1_230, 0).saturating_mul(z.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Multisig Multisigs (r:1 w:1) + /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) + /// The range of component `s` is `[3, 100]`. + /// The range of component `z` is `[0, 10000]`. + fn as_multi_approve(s: u32, z: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `282` + // Estimated: `6811` + // Minimum execution time: 26_878_000 picoseconds. + Weight::from_parts(21_448_577, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 354 + .saturating_add(Weight::from_parts(60_286, 0).saturating_mul(s.into())) + // Standard Error: 3 + .saturating_add(Weight::from_parts(1_236, 0).saturating_mul(z.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Multisig Multisigs (r:1 w:1) + /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// The range of component `s` is `[2, 100]`. + /// The range of component `z` is `[0, 10000]`. + fn as_multi_complete(s: u32, z: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `388 + s * (33 ±0)` + // Estimated: `6811` + // Minimum execution time: 45_716_000 picoseconds. + Weight::from_parts(38_332_947, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 554 + .saturating_add(Weight::from_parts(81_026, 0).saturating_mul(s.into())) + // Standard Error: 5 + .saturating_add(Weight::from_parts(1_265, 0).saturating_mul(z.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: Multisig Multisigs (r:1 w:1) + /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) + /// The range of component `s` is `[2, 100]`. + fn approve_as_multi_create(s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `263 + s * (2 ±0)` + // Estimated: `6811` + // Minimum execution time: 32_089_000 picoseconds. + Weight::from_parts(33_664_508, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 487 + .saturating_add(Weight::from_parts(67_443, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Multisig Multisigs (r:1 w:1) + /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) + /// The range of component `s` is `[2, 100]`. + fn approve_as_multi_approve(s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `282` + // Estimated: `6811` + // Minimum execution time: 18_631_000 picoseconds. + Weight::from_parts(19_909_964, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 434 + .saturating_add(Weight::from_parts(62_989, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Multisig Multisigs (r:1 w:1) + /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) + /// The range of component `s` is `[2, 100]`. + fn cancel_as_multi(s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `454 + s * (1 ±0)` + // Estimated: `6811` + // Minimum execution time: 32_486_000 picoseconds. + Weight::from_parts(34_303_784, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 585 + .saturating_add(Weight::from_parts(69_979, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_session.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_session.rs new file mode 100644 index 00000000000..d132ef17bbd --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_session.rs @@ -0,0 +1,79 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +//! Autogenerated weights for `pallet_session` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("coretime-westend-dev"), DB CACHE: 1024 + +// Executed Command: +// ./artifacts/westend-parachain +// benchmark +// pallet +// --chain=coretime-westend-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_session +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json +// --header=./file_header.txt +// --output=./cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_session.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_session`. +pub struct WeightInfo(PhantomData); +impl pallet_session::WeightInfo for WeightInfo { + /// Storage: Session NextKeys (r:1 w:1) + /// Proof Skipped: Session NextKeys (max_values: None, max_size: None, mode: Measured) + /// Storage: Session KeyOwner (r:1 w:1) + /// Proof Skipped: Session KeyOwner (max_values: None, max_size: None, mode: Measured) + fn set_keys() -> Weight { + // Proof Size summary in bytes: + // Measured: `297` + // Estimated: `3762` + // Minimum execution time: 17_353_000 picoseconds. + Weight::from_parts(18_005_000, 0) + .saturating_add(Weight::from_parts(0, 3762)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: Session NextKeys (r:1 w:1) + /// Proof Skipped: Session NextKeys (max_values: None, max_size: None, mode: Measured) + /// Storage: Session KeyOwner (r:0 w:1) + /// Proof Skipped: Session KeyOwner (max_values: None, max_size: None, mode: Measured) + fn purge_keys() -> Weight { + // Proof Size summary in bytes: + // Measured: `279` + // Estimated: `3744` + // Minimum execution time: 13_039_000 picoseconds. + Weight::from_parts(13_341_000, 0) + .saturating_add(Weight::from_parts(0, 3744)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(2)) + } +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_timestamp.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_timestamp.rs new file mode 100644 index 00000000000..722858a3a46 --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_timestamp.rs @@ -0,0 +1,73 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +//! Autogenerated weights for `pallet_timestamp` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("coretime-westend-dev"), DB CACHE: 1024 + +// Executed Command: +// ./artifacts/westend-parachain +// benchmark +// pallet +// --chain=coretime-westend-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_timestamp +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json +// --header=./file_header.txt +// --output=./cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_timestamp.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_timestamp`. +pub struct WeightInfo(PhantomData); +impl pallet_timestamp::WeightInfo for WeightInfo { + /// Storage: Timestamp Now (r:1 w:1) + /// Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + /// Storage: Aura CurrentSlot (r:1 w:0) + /// Proof: Aura CurrentSlot (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + fn set() -> Weight { + // Proof Size summary in bytes: + // Measured: `49` + // Estimated: `1493` + // Minimum execution time: 7_986_000 picoseconds. + Weight::from_parts(8_134_000, 0) + .saturating_add(Weight::from_parts(0, 1493)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + fn on_finalize() -> Weight { + // Proof Size summary in bytes: + // Measured: `57` + // Estimated: `0` + // Minimum execution time: 3_257_000 picoseconds. + Weight::from_parts(3_366_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_utility.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_utility.rs new file mode 100644 index 00000000000..dacd469ebb7 --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_utility.rs @@ -0,0 +1,100 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +//! Autogenerated weights for `pallet_utility` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("coretime-westend-dev"), DB CACHE: 1024 + +// Executed Command: +// ./artifacts/westend-parachain +// benchmark +// pallet +// --chain=coretime-westend-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_utility +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json +// --header=./file_header.txt +// --output=./cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_utility.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_utility`. +pub struct WeightInfo(PhantomData); +impl pallet_utility::WeightInfo for WeightInfo { + /// The range of component `c` is `[0, 1000]`. + fn batch(c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 6_697_000 picoseconds. + Weight::from_parts(11_859_145, 0) + .saturating_add(Weight::from_parts(0, 0)) + // Standard Error: 3_146 + .saturating_add(Weight::from_parts(4_300_555, 0).saturating_mul(c.into())) + } + fn as_derivative() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 4_979_000 picoseconds. + Weight::from_parts(5_066_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + /// The range of component `c` is `[0, 1000]`. + fn batch_all(c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 6_741_000 picoseconds. + Weight::from_parts(15_928_547, 0) + .saturating_add(Weight::from_parts(0, 0)) + // Standard Error: 3_310 + .saturating_add(Weight::from_parts(4_527_996, 0).saturating_mul(c.into())) + } + fn dispatch_as() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 8_717_000 picoseconds. + Weight::from_parts(8_909_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + /// The range of component `c` is `[0, 1000]`. + fn force_batch(c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 6_814_000 picoseconds. + Weight::from_parts(13_920_831, 0) + .saturating_add(Weight::from_parts(0, 0)) + // Standard Error: 7_605 + .saturating_add(Weight::from_parts(4_306_193, 0).saturating_mul(c.into())) + } +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_xcm.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_xcm.rs new file mode 100644 index 00000000000..d96ee43463a --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_xcm.rs @@ -0,0 +1,323 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +//! Autogenerated weights for `pallet_xcm` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("coretime-westend-dev"), DB CACHE: 1024 + +// Executed Command: +// ./artifacts/westend-parachain +// benchmark +// pallet +// --chain=coretime-westend-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_xcm +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json +// --header=./file_header.txt +// --output=./cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/pallet_xcm.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_xcm`. +pub struct WeightInfo(PhantomData); +impl pallet_xcm::WeightInfo for WeightInfo { + /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem HostConfiguration (r:1 w:0) + /// Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + fn send() -> Weight { + // Proof Size summary in bytes: + // Measured: `38` + // Estimated: `3503` + // Minimum execution time: 25_783_000 picoseconds. + Weight::from_parts(26_398_000, 0) + .saturating_add(Weight::from_parts(0, 3503)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: ParachainInfo ParachainId (r:1 w:0) + /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + fn teleport_assets() -> Weight { + // Proof Size summary in bytes: + // Measured: `32` + // Estimated: `1489` + // Minimum execution time: 25_511_000 picoseconds. + Weight::from_parts(26_120_000, 0) + .saturating_add(Weight::from_parts(0, 1489)) + .saturating_add(T::DbWeight::get().reads(1)) + } + /// Storage: Benchmark Override (r:0 w:0) + /// Proof Skipped: Benchmark Override (max_values: None, max_size: None, mode: Measured) + fn reserve_transfer_assets() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. + Weight::from_parts(18_446_744_073_709_551_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + fn transfer_assets() -> Weight { + // Proof Size summary in bytes: + // Measured: `496` + // Estimated: `6208` + // Minimum execution time: 146_932_000 picoseconds. + Weight::from_parts(153_200_000, 0) + .saturating_add(Weight::from_parts(0, 6208)) + .saturating_add(T::DbWeight::get().reads(12)) + .saturating_add(T::DbWeight::get().writes(7)) + } + /// Storage: Benchmark Override (r:0 w:0) + /// Proof Skipped: Benchmark Override (max_values: None, max_size: None, mode: Measured) + fn execute() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. + Weight::from_parts(18_446_744_073_709_551_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + /// Storage: PolkadotXcm SupportedVersion (r:0 w:1) + /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + fn force_xcm_version() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_707_000 picoseconds. + Weight::from_parts(9_874_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: PolkadotXcm SafeXcmVersion (r:0 w:1) + /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + fn force_default_xcm_version() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 3_073_000 picoseconds. + Weight::from_parts(3_183_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: PolkadotXcm VersionNotifiers (r:1 w:1) + /// Proof Skipped: PolkadotXcm VersionNotifiers (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm QueryCounter (r:1 w:1) + /// Proof Skipped: PolkadotXcm QueryCounter (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem HostConfiguration (r:1 w:0) + /// Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: PolkadotXcm Queries (r:0 w:1) + /// Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) + fn force_subscribe_version_notify() -> Weight { + // Proof Size summary in bytes: + // Measured: `38` + // Estimated: `3503` + // Minimum execution time: 30_999_000 picoseconds. + Weight::from_parts(31_641_000, 0) + .saturating_add(Weight::from_parts(0, 3503)) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(5)) + } + /// Storage: PolkadotXcm VersionNotifiers (r:1 w:1) + /// Proof Skipped: PolkadotXcm VersionNotifiers (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem HostConfiguration (r:1 w:0) + /// Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: PolkadotXcm Queries (r:0 w:1) + /// Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) + fn force_unsubscribe_version_notify() -> Weight { + // Proof Size summary in bytes: + // Measured: `220` + // Estimated: `3685` + // Minimum execution time: 33_036_000 picoseconds. + Weight::from_parts(33_596_000, 0) + .saturating_add(Weight::from_parts(0, 3685)) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(4)) + } + /// Storage: PolkadotXcm XcmExecutionSuspended (r:0 w:1) + /// Proof Skipped: PolkadotXcm XcmExecutionSuspended (max_values: Some(1), max_size: None, mode: Measured) + fn force_suspension() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 3_035_000 picoseconds. + Weight::from_parts(3_154_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: PolkadotXcm SupportedVersion (r:4 w:2) + /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + fn migrate_supported_version() -> Weight { + // Proof Size summary in bytes: + // Measured: `95` + // Estimated: `10985` + // Minimum execution time: 14_805_000 picoseconds. + Weight::from_parts(15_120_000, 0) + .saturating_add(Weight::from_parts(0, 10985)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: PolkadotXcm VersionNotifiers (r:4 w:2) + /// Proof Skipped: PolkadotXcm VersionNotifiers (max_values: None, max_size: None, mode: Measured) + fn migrate_version_notifiers() -> Weight { + // Proof Size summary in bytes: + // Measured: `99` + // Estimated: `10989` + // Minimum execution time: 14_572_000 picoseconds. + Weight::from_parts(14_909_000, 0) + .saturating_add(Weight::from_parts(0, 10989)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: PolkadotXcm VersionNotifyTargets (r:5 w:0) + /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) + fn already_notified_target() -> Weight { + // Proof Size summary in bytes: + // Measured: `106` + // Estimated: `13471` + // Minimum execution time: 15_341_000 picoseconds. + Weight::from_parts(15_708_000, 0) + .saturating_add(Weight::from_parts(0, 13471)) + .saturating_add(T::DbWeight::get().reads(5)) + } + /// Storage: PolkadotXcm VersionNotifyTargets (r:2 w:1) + /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem HostConfiguration (r:1 w:0) + /// Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + fn notify_current_targets() -> Weight { + // Proof Size summary in bytes: + // Measured: `106` + // Estimated: `6046` + // Minimum execution time: 27_840_000 picoseconds. + Weight::from_parts(28_248_000, 0) + .saturating_add(Weight::from_parts(0, 6046)) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: PolkadotXcm VersionNotifyTargets (r:3 w:0) + /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) + fn notify_target_migration_fail() -> Weight { + // Proof Size summary in bytes: + // Measured: `136` + // Estimated: `8551` + // Minimum execution time: 8_245_000 picoseconds. + Weight::from_parts(8_523_000, 0) + .saturating_add(Weight::from_parts(0, 8551)) + .saturating_add(T::DbWeight::get().reads(3)) + } + /// Storage: PolkadotXcm VersionNotifyTargets (r:4 w:2) + /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) + fn migrate_version_notify_targets() -> Weight { + // Proof Size summary in bytes: + // Measured: `106` + // Estimated: `10996` + // Minimum execution time: 14_780_000 picoseconds. + Weight::from_parts(15_173_000, 0) + .saturating_add(Weight::from_parts(0, 10996)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: PolkadotXcm VersionNotifyTargets (r:4 w:2) + /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem HostConfiguration (r:1 w:0) + /// Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + fn migrate_and_notify_old_targets() -> Weight { + // Proof Size summary in bytes: + // Measured: `112` + // Estimated: `11002` + // Minimum execution time: 33_422_000 picoseconds. + Weight::from_parts(34_076_000, 0) + .saturating_add(Weight::from_parts(0, 11002)) + .saturating_add(T::DbWeight::get().reads(9)) + .saturating_add(T::DbWeight::get().writes(4)) + } + /// Storage: `PolkadotXcm::QueryCounter` (r:1 w:1) + /// Proof: `PolkadotXcm::QueryCounter` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::Queries` (r:0 w:1) + /// Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn new_query() -> Weight { + // Proof Size summary in bytes: + // Measured: `69` + // Estimated: `1554` + // Minimum execution time: 4_512_000 picoseconds. + Weight::from_parts(4_671_000, 0) + .saturating_add(Weight::from_parts(0, 1554)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `PolkadotXcm::Queries` (r:1 w:1) + /// Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn take_response() -> Weight { + // Proof Size summary in bytes: + // Measured: `7706` + // Estimated: `11171` + // Minimum execution time: 26_473_000 picoseconds. + Weight::from_parts(26_960_000, 0) + .saturating_add(Weight::from_parts(0, 11171)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/paritydb_weights.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/paritydb_weights.rs new file mode 100644 index 00000000000..1c6d2ebe568 --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/paritydb_weights.rs @@ -0,0 +1,63 @@ +// This file is part of Substrate. + +// Copyright (C) 2023 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +pub mod constants { + use frame_support::{ + parameter_types, + weights::{constants, RuntimeDbWeight}, + }; + + parameter_types! { + /// `ParityDB` can be enabled with a feature flag, but is still experimental. These weights + /// are available for brave runtime engineers who may want to try this out as default. + pub const ParityDbWeight: RuntimeDbWeight = RuntimeDbWeight { + read: 8_000 * constants::WEIGHT_REF_TIME_PER_NANOS, + write: 50_000 * constants::WEIGHT_REF_TIME_PER_NANOS, + }; + } + + #[cfg(test)] + mod test_db_weights { + use super::constants::ParityDbWeight as W; + use frame_support::weights::constants; + + /// Checks that all weights exist and have sane values. + // NOTE: If this test fails but you are sure that the generated values are fine, + // you can delete it. + #[test] + fn sane() { + // At least 1 µs. + assert!( + W::get().reads(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, + "Read weight should be at least 1 µs." + ); + assert!( + W::get().writes(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, + "Write weight should be at least 1 µs." + ); + // At most 1 ms. + assert!( + W::get().reads(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, + "Read weight should be at most 1 ms." + ); + assert!( + W::get().writes(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, + "Write weight should be at most 1 ms." + ); + } + } +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/rocksdb_weights.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/rocksdb_weights.rs new file mode 100644 index 00000000000..aa0cb2b4bc3 --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/rocksdb_weights.rs @@ -0,0 +1,63 @@ +// This file is part of Substrate. + +// Copyright (C) 2023 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +pub mod constants { + use frame_support::{ + parameter_types, + weights::{constants, RuntimeDbWeight}, + }; + + parameter_types! { + /// By default, Substrate uses `RocksDB`, so this will be the weight used throughout + /// the runtime. + pub const RocksDbWeight: RuntimeDbWeight = RuntimeDbWeight { + read: 25_000 * constants::WEIGHT_REF_TIME_PER_NANOS, + write: 100_000 * constants::WEIGHT_REF_TIME_PER_NANOS, + }; + } + + #[cfg(test)] + mod test_db_weights { + use super::constants::RocksDbWeight as W; + use frame_support::weights::constants; + + /// Checks that all weights exist and have sane values. + // NOTE: If this test fails but you are sure that the generated values are fine, + // you can delete it. + #[test] + fn sane() { + // At least 1 µs. + assert!( + W::get().reads(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, + "Read weight should be at least 1 µs." + ); + assert!( + W::get().writes(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, + "Write weight should be at least 1 µs." + ); + // At most 1 ms. + assert!( + W::get().reads(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, + "Read weight should be at most 1 ms." + ); + assert!( + W::get().writes(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, + "Write weight should be at most 1 ms." + ); + } + } +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/mod.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/mod.rs new file mode 100644 index 00000000000..3dc7b82efc2 --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/mod.rs @@ -0,0 +1,244 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +mod pallet_xcm_benchmarks_fungible; +mod pallet_xcm_benchmarks_generic; + +use crate::{xcm_config::MaxAssetsIntoHolding, Runtime}; +use frame_support::weights::Weight; +use pallet_xcm_benchmarks_fungible::WeightInfo as XcmFungibleWeight; +use pallet_xcm_benchmarks_generic::WeightInfo as XcmGeneric; +use sp_std::prelude::*; +use xcm::{latest::prelude::*, DoubleEncoded}; + +trait WeighMultiAssets { + fn weigh_multi_assets(&self, weight: Weight) -> Weight; +} + +const MAX_ASSETS: u64 = 100; + +impl WeighMultiAssets for MultiAssetFilter { + fn weigh_multi_assets(&self, weight: Weight) -> Weight { + match self { + Self::Definite(assets) => weight.saturating_mul(assets.inner().iter().count() as u64), + Self::Wild(asset) => match asset { + All => weight.saturating_mul(MAX_ASSETS), + AllOf { fun, .. } => match fun { + WildFungibility::Fungible => weight, + // Magic number 2 has to do with the fact that we could have up to 2 times + // MaxAssetsIntoHolding in the worst-case scenario. + WildFungibility::NonFungible => + weight.saturating_mul((MaxAssetsIntoHolding::get() * 2) as u64), + }, + AllCounted(count) => weight.saturating_mul(MAX_ASSETS.min(*count as u64)), + AllOfCounted { count, .. } => weight.saturating_mul(MAX_ASSETS.min(*count as u64)), + }, + } + } +} + +impl WeighMultiAssets for MultiAssets { + fn weigh_multi_assets(&self, weight: Weight) -> Weight { + weight.saturating_mul(self.inner().iter().count() as u64) + } +} + +pub struct CoretimeWestendXcmWeight(core::marker::PhantomData); +impl XcmWeightInfo for CoretimeWestendXcmWeight { + fn withdraw_asset(assets: &MultiAssets) -> Weight { + assets.weigh_multi_assets(XcmFungibleWeight::::withdraw_asset()) + } + fn reserve_asset_deposited(assets: &MultiAssets) -> Weight { + assets.weigh_multi_assets(XcmFungibleWeight::::reserve_asset_deposited()) + } + fn receive_teleported_asset(assets: &MultiAssets) -> Weight { + assets.weigh_multi_assets(XcmFungibleWeight::::receive_teleported_asset()) + } + fn query_response( + _query_id: &u64, + _response: &Response, + _max_weight: &Weight, + _querier: &Option, + ) -> Weight { + XcmGeneric::::query_response() + } + fn transfer_asset(assets: &MultiAssets, _dest: &MultiLocation) -> Weight { + assets.weigh_multi_assets(XcmFungibleWeight::::transfer_asset()) + } + fn transfer_reserve_asset( + assets: &MultiAssets, + _dest: &MultiLocation, + _xcm: &Xcm<()>, + ) -> Weight { + assets.weigh_multi_assets(XcmFungibleWeight::::transfer_reserve_asset()) + } + fn transact( + _origin_type: &OriginKind, + _require_weight_at_most: &Weight, + _call: &DoubleEncoded, + ) -> Weight { + XcmGeneric::::transact() + } + fn hrmp_new_channel_open_request( + _sender: &u32, + _max_message_size: &u32, + _max_capacity: &u32, + ) -> Weight { + // XCM Executor does not currently support HRMP channel operations + Weight::MAX + } + fn hrmp_channel_accepted(_recipient: &u32) -> Weight { + // XCM Executor does not currently support HRMP channel operations + Weight::MAX + } + fn hrmp_channel_closing(_initiator: &u32, _sender: &u32, _recipient: &u32) -> Weight { + // XCM Executor does not currently support HRMP channel operations + Weight::MAX + } + fn clear_origin() -> Weight { + XcmGeneric::::clear_origin() + } + fn descend_origin(_who: &InteriorMultiLocation) -> Weight { + XcmGeneric::::descend_origin() + } + fn report_error(_query_response_info: &QueryResponseInfo) -> Weight { + XcmGeneric::::report_error() + } + + fn deposit_asset(assets: &MultiAssetFilter, _dest: &MultiLocation) -> Weight { + assets.weigh_multi_assets(XcmFungibleWeight::::deposit_asset()) + } + fn deposit_reserve_asset( + assets: &MultiAssetFilter, + _dest: &MultiLocation, + _xcm: &Xcm<()>, + ) -> Weight { + assets.weigh_multi_assets(XcmFungibleWeight::::deposit_reserve_asset()) + } + fn exchange_asset(_give: &MultiAssetFilter, _receive: &MultiAssets, _maximal: &bool) -> Weight { + Weight::MAX + } + fn initiate_reserve_withdraw( + assets: &MultiAssetFilter, + _reserve: &MultiLocation, + _xcm: &Xcm<()>, + ) -> Weight { + assets.weigh_multi_assets(XcmFungibleWeight::::initiate_reserve_withdraw()) + } + fn initiate_teleport( + assets: &MultiAssetFilter, + _dest: &MultiLocation, + _xcm: &Xcm<()>, + ) -> Weight { + assets.weigh_multi_assets(XcmFungibleWeight::::initiate_teleport()) + } + fn report_holding(_response_info: &QueryResponseInfo, _assets: &MultiAssetFilter) -> Weight { + XcmGeneric::::report_holding() + } + fn buy_execution(_fees: &MultiAsset, _weight_limit: &WeightLimit) -> Weight { + XcmGeneric::::buy_execution() + } + fn refund_surplus() -> Weight { + XcmGeneric::::refund_surplus() + } + fn set_error_handler(_xcm: &Xcm) -> Weight { + XcmGeneric::::set_error_handler() + } + fn set_appendix(_xcm: &Xcm) -> Weight { + XcmGeneric::::set_appendix() + } + fn clear_error() -> Weight { + XcmGeneric::::clear_error() + } + fn claim_asset(_assets: &MultiAssets, _ticket: &MultiLocation) -> Weight { + XcmGeneric::::claim_asset() + } + fn trap(_code: &u64) -> Weight { + XcmGeneric::::trap() + } + fn subscribe_version(_query_id: &QueryId, _max_response_weight: &Weight) -> Weight { + XcmGeneric::::subscribe_version() + } + fn unsubscribe_version() -> Weight { + XcmGeneric::::unsubscribe_version() + } + fn burn_asset(assets: &MultiAssets) -> Weight { + assets.weigh_multi_assets(XcmGeneric::::burn_asset()) + } + fn expect_asset(assets: &MultiAssets) -> Weight { + assets.weigh_multi_assets(XcmGeneric::::expect_asset()) + } + fn expect_origin(_origin: &Option) -> Weight { + XcmGeneric::::expect_origin() + } + fn expect_error(_error: &Option<(u32, XcmError)>) -> Weight { + XcmGeneric::::expect_error() + } + fn expect_transact_status(_transact_status: &MaybeErrorCode) -> Weight { + XcmGeneric::::expect_transact_status() + } + fn query_pallet(_module_name: &Vec, _response_info: &QueryResponseInfo) -> Weight { + XcmGeneric::::query_pallet() + } + fn expect_pallet( + _index: &u32, + _name: &Vec, + _module_name: &Vec, + _crate_major: &u32, + _min_crate_minor: &u32, + ) -> Weight { + XcmGeneric::::expect_pallet() + } + fn report_transact_status(_response_info: &QueryResponseInfo) -> Weight { + XcmGeneric::::report_transact_status() + } + fn clear_transact_status() -> Weight { + XcmGeneric::::clear_transact_status() + } + fn universal_origin(_: &Junction) -> Weight { + XcmGeneric::::universal_origin() + } + fn export_message(_: &NetworkId, _: &Junctions, _: &Xcm<()>) -> Weight { + Weight::MAX + } + fn lock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { + Weight::MAX + } + fn unlock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { + Weight::MAX + } + fn note_unlockable(_: &MultiAsset, _: &MultiLocation) -> Weight { + Weight::MAX + } + fn request_unlock(_: &MultiAsset, _: &MultiLocation) -> Weight { + Weight::MAX + } + fn set_fees_mode(_: &bool) -> Weight { + XcmGeneric::::set_fees_mode() + } + fn set_topic(_topic: &[u8; 32]) -> Weight { + XcmGeneric::::set_topic() + } + fn clear_topic() -> Weight { + XcmGeneric::::clear_topic() + } + fn alias_origin(_: &MultiLocation) -> Weight { + // XCM Executor does not currently support alias origin operations + Weight::MAX + } + fn unpaid_execution(_: &WeightLimit, _: &Option) -> Weight { + XcmGeneric::::unpaid_execution() + } +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs new file mode 100644 index 00000000000..eaf07aac52c --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs @@ -0,0 +1,200 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Autogenerated weights for `pallet_xcm_benchmarks::fungible` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-10-26, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `runner-vmdtonbz-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 + +// Executed Command: +// target/production/polkadot-parachain +// benchmark +// pallet +// --steps=50 +// --repeat=20 +// --extrinsic=* +// --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json +// --pallet=pallet_xcm_benchmarks::fungible +// --chain=asset-hub-westend-dev +// --header=./cumulus/file_header.txt +// --template=./cumulus/templates/xcm-bench-template.hbs +// --output=./cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/ + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weights for `pallet_xcm_benchmarks::fungible`. +pub struct WeightInfo(PhantomData); +impl WeightInfo { + // Storage: `System::Account` (r:1 w:1) + // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + pub fn withdraw_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `101` + // Estimated: `3593` + // Minimum execution time: 20_295_000 picoseconds. + Weight::from_parts(21_142_000, 3593) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + // Storage: `System::Account` (r:2 w:2) + // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + pub fn transfer_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `101` + // Estimated: `6196` + // Minimum execution time: 42_356_000 picoseconds. + Weight::from_parts(43_552_000, 6196) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + // Storage: `System::Account` (r:3 w:3) + // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + // Storage: `ParachainInfo::ParachainId` (r:1 w:0) + // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) + // Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + pub fn transfer_reserve_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `246` + // Estimated: `8799` + // Minimum execution time: 85_553_000 picoseconds. + Weight::from_parts(87_177_000, 8799) + .saturating_add(T::DbWeight::get().reads(10)) + .saturating_add(T::DbWeight::get().writes(5)) + } + // Storage: `ParachainInfo::ParachainId` (r:1 w:0) + // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + pub fn reserve_asset_deposited() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `1489` + // Minimum execution time: 6_166_000 picoseconds. + Weight::from_parts(6_352_000, 1489) + .saturating_add(T::DbWeight::get().reads(1)) + } + // Storage: `ParachainInfo::ParachainId` (r:1 w:0) + // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) + // Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `System::Account` (r:2 w:2) + // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + pub fn initiate_reserve_withdraw() -> Weight { + // Proof Size summary in bytes: + // Measured: `246` + // Estimated: `6196` + // Minimum execution time: 184_462_000 picoseconds. + Weight::from_parts(189_593_000, 6196) + .saturating_add(T::DbWeight::get().reads(9)) + .saturating_add(T::DbWeight::get().writes(4)) + } + pub fn receive_teleported_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 3_018_000 picoseconds. + Weight::from_parts(3_098_000, 0) + } + // Storage: `System::Account` (r:1 w:1) + // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + pub fn deposit_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `3593` + // Minimum execution time: 18_583_000 picoseconds. + Weight::from_parts(19_057_000, 3593) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + // Storage: `System::Account` (r:2 w:2) + // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + // Storage: `ParachainInfo::ParachainId` (r:1 w:0) + // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) + // Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + pub fn deposit_reserve_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `145` + // Estimated: `6196` + // Minimum execution time: 56_666_000 picoseconds. + Weight::from_parts(58_152_000, 6196) + .saturating_add(T::DbWeight::get().reads(9)) + .saturating_add(T::DbWeight::get().writes(4)) + } + // Storage: `ParachainInfo::ParachainId` (r:1 w:0) + // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) + // Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `System::Account` (r:1 w:1) + // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + pub fn initiate_teleport() -> Weight { + // Proof Size summary in bytes: + // Measured: `145` + // Estimated: `3610` + // Minimum execution time: 44_197_000 picoseconds. + Weight::from_parts(45_573_000, 3610) + .saturating_add(T::DbWeight::get().reads(8)) + .saturating_add(T::DbWeight::get().writes(3)) + } +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs new file mode 100644 index 00000000000..fc196abea0f --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -0,0 +1,354 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Autogenerated weights for `pallet_xcm_benchmarks::generic` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-10-26, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `runner-vmdtonbz-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-westend-dev"), DB CACHE: 1024 + +// Executed Command: +// target/production/polkadot-parachain +// benchmark +// pallet +// --steps=50 +// --repeat=20 +// --extrinsic=* +// --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json +// --pallet=pallet_xcm_benchmarks::generic +// --chain=asset-hub-westend-dev +// --header=./cumulus/file_header.txt +// --template=./cumulus/templates/xcm-bench-template.hbs +// --output=./cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/ + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weights for `pallet_xcm_benchmarks::generic`. +pub struct WeightInfo(PhantomData); +impl WeightInfo { + // Storage: `ParachainInfo::ParachainId` (r:1 w:0) + // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) + // Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `System::Account` (r:2 w:2) + // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + pub fn report_holding() -> Weight { + // Proof Size summary in bytes: + // Measured: `246` + // Estimated: `6196` + // Minimum execution time: 415_033_000 picoseconds. + Weight::from_parts(429_573_000, 6196) + .saturating_add(T::DbWeight::get().reads(9)) + .saturating_add(T::DbWeight::get().writes(4)) + } + pub fn buy_execution() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 3_193_000 picoseconds. + Weight::from_parts(3_620_000, 0) + } + // Storage: `PolkadotXcm::Queries` (r:1 w:0) + // Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) + pub fn query_response() -> Weight { + // Proof Size summary in bytes: + // Measured: `103` + // Estimated: `3568` + // Minimum execution time: 8_045_000 picoseconds. + Weight::from_parts(8_402_000, 3568) + .saturating_add(T::DbWeight::get().reads(1)) + } + pub fn transact() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_827_000 picoseconds. + Weight::from_parts(10_454_000, 0) + } + pub fn refund_surplus() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 3_330_000 picoseconds. + Weight::from_parts(3_677_000, 0) + } + pub fn set_error_handler() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 1_947_000 picoseconds. + Weight::from_parts(2_083_000, 0) + } + pub fn set_appendix() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 1_915_000 picoseconds. + Weight::from_parts(1_993_000, 0) + } + pub fn clear_error() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 1_918_000 picoseconds. + Weight::from_parts(2_048_000, 0) + } + pub fn descend_origin() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_683_000 picoseconds. + Weight::from_parts(3_064_000, 0) + } + pub fn clear_origin() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 1_893_000 picoseconds. + Weight::from_parts(2_159_000, 0) + } + // Storage: `ParachainInfo::ParachainId` (r:1 w:0) + // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) + // Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `System::Account` (r:2 w:2) + // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + pub fn report_error() -> Weight { + // Proof Size summary in bytes: + // Measured: `246` + // Estimated: `6196` + // Minimum execution time: 53_116_000 picoseconds. + Weight::from_parts(54_154_000, 6196) + .saturating_add(T::DbWeight::get().reads(9)) + .saturating_add(T::DbWeight::get().writes(4)) + } + // Storage: `PolkadotXcm::AssetTraps` (r:1 w:1) + // Proof: `PolkadotXcm::AssetTraps` (`max_values`: None, `max_size`: None, mode: `Measured`) + pub fn claim_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `160` + // Estimated: `3625` + // Minimum execution time: 12_381_000 picoseconds. + Weight::from_parts(12_693_000, 3625) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + pub fn trap() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 1_933_000 picoseconds. + Weight::from_parts(1_983_000, 0) + } + // Storage: `PolkadotXcm::VersionNotifyTargets` (r:1 w:1) + // Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) + // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) + // Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + pub fn subscribe_version() -> Weight { + // Proof Size summary in bytes: + // Measured: `145` + // Estimated: `3610` + // Minimum execution time: 24_251_000 picoseconds. + Weight::from_parts(24_890_000, 3610) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) + } + // Storage: `PolkadotXcm::VersionNotifyTargets` (r:0 w:1) + // Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) + pub fn unsubscribe_version() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 3_850_000 picoseconds. + Weight::from_parts(4_082_000, 0) + .saturating_add(T::DbWeight::get().writes(1)) + } + pub fn burn_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 112_248_000 picoseconds. + Weight::from_parts(124_454_000, 0) + } + pub fn expect_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 11_457_000 picoseconds. + Weight::from_parts(12_060_000, 0) + } + pub fn expect_origin() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 1_959_000 picoseconds. + Weight::from_parts(2_076_000, 0) + } + pub fn expect_error() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 1_920_000 picoseconds. + Weight::from_parts(1_994_000, 0) + } + pub fn expect_transact_status() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_149_000 picoseconds. + Weight::from_parts(2_394_000, 0) + } + // Storage: `ParachainInfo::ParachainId` (r:1 w:0) + // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) + // Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `System::Account` (r:2 w:2) + // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + pub fn query_pallet() -> Weight { + // Proof Size summary in bytes: + // Measured: `246` + // Estimated: `6196` + // Minimum execution time: 58_011_000 picoseconds. + Weight::from_parts(59_306_000, 6196) + .saturating_add(T::DbWeight::get().reads(9)) + .saturating_add(T::DbWeight::get().writes(4)) + } + pub fn expect_pallet() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 5_031_000 picoseconds. + Weight::from_parts(5_243_000, 0) + } + // Storage: `ParachainInfo::ParachainId` (r:1 w:0) + // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) + // Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `System::Account` (r:2 w:2) + // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + pub fn report_transact_status() -> Weight { + // Proof Size summary in bytes: + // Measured: `246` + // Estimated: `6196` + // Minimum execution time: 53_078_000 picoseconds. + Weight::from_parts(54_345_000, 6196) + .saturating_add(T::DbWeight::get().reads(9)) + .saturating_add(T::DbWeight::get().writes(4)) + } + pub fn clear_transact_status() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 1_936_000 picoseconds. + Weight::from_parts(2_002_000, 0) + } + pub fn set_topic() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 1_855_000 picoseconds. + Weight::from_parts(1_950_000, 0) + } + pub fn clear_topic() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 1_882_000 picoseconds. + Weight::from_parts(1_977_000, 0) + } + // Storage: `ParachainInfo::ParachainId` (r:1 w:0) + // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + pub fn universal_origin() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `1489` + // Minimum execution time: 3_912_000 picoseconds. + Weight::from_parts(4_167_000, 1489) + .saturating_add(T::DbWeight::get().reads(1)) + } + pub fn set_fees_mode() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 1_911_000 picoseconds. + Weight::from_parts(1_971_000, 0) + } + pub fn unpaid_execution() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 1_990_000 picoseconds. + Weight::from_parts(2_076_000, 0) + } +} diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/xcm_config.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/xcm_config.rs new file mode 100644 index 00000000000..9de9da4b2d1 --- /dev/null +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/xcm_config.rs @@ -0,0 +1,292 @@ +// Copyright 2023 Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +use super::{ + AccountId, AllPalletsWithSystem, Balances, BaseDeliveryFee, FeeAssetId, ParachainInfo, + ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, + TransactionByteFee, WeightToFee, XcmpQueue, +}; +use frame_support::{ + match_types, parameter_types, + traits::{ConstU32, Contains, Equals, Everything, Nothing}, +}; +use frame_system::EnsureRoot; +use pallet_xcm::XcmPassthrough; +use parachains_common::{ + impls::ToStakingPot, + xcm_config::{ + AllSiblingSystemParachains, ConcreteNativeAssetFrom, ParentRelayOrSiblingParachains, + RelayOrOtherSystemParachains, + }, + TREASURY_PALLET_ID, +}; +use polkadot_parachain_primitives::primitives::Sibling; +use polkadot_runtime_common::xcm_sender::ExponentialPrice; +use sp_runtime::traits::AccountIdConversion; +use xcm::latest::prelude::*; +#[allow(deprecated)] +use xcm_builder::CurrencyAdapter; +use xcm_builder::{ + AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, + AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, DenyReserveTransferToRelayChain, + DenyThenTry, EnsureXcmOrigin, IsConcrete, ParentAsSuperuser, ParentIsPreset, + RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, + SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, + TrailingSetTopicAsId, UsingComponents, WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, + XcmFeeManagerFromComponents, XcmFeeToAccount, +}; +use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; + +parameter_types! { + pub const WndRelayLocation: MultiLocation = MultiLocation::parent(); + pub const RelayNetwork: Option = Some(NetworkId::Westend); + pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); + pub UniversalLocation: InteriorMultiLocation = + X2(GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(ParachainInfo::parachain_id().into())); + pub const MaxInstructions: u32 = 100; + pub const MaxAssetsIntoHolding: u32 = 64; + pub FellowshipLocation: MultiLocation = MultiLocation::new(1, Parachain(1001)); + pub const GovernanceLocation: MultiLocation = MultiLocation::parent(); +} + +/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used +/// when determining ownership of accounts for asset transacting and when attempting to use XCM +/// `Transact` in order to determine the dispatch Origin. +pub type LocationToAccountId = ( + // The parent (Relay-chain) origin converts to the parent `AccountId`. + ParentIsPreset, + // Sibling parachain origins convert to AccountId via the `ParaId::into`. + SiblingParachainConvertsVia, + // Straight up local `AccountId32` origins just alias directly to `AccountId`. + AccountId32Aliases, +); + +/// Means for transacting the native currency on this chain. +#[allow(deprecated)] +pub type CurrencyTransactor = CurrencyAdapter< + // Use this currency: + Balances, + // Use this currency when it is a fungible asset matching the given location or name: + IsConcrete, + // Do a simple punn to convert an `AccountId32` `MultiLocation` into a native chain + // `AccountId`: + LocationToAccountId, + // Our chain's `AccountId` type (we can't get away without mentioning it explicitly): + AccountId, + // We don't track any teleports of `Balances`. + (), +>; + +/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, +/// ready for dispatching a transaction with XCM's `Transact`. There is an `OriginKind` that can +/// bias the kind of local `Origin` it will become. +pub type XcmOriginToTransactDispatchOrigin = ( + // Sovereign account converter; this attempts to derive an `AccountId` from the origin location + // using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for + // foreign chains who want to have a local sovereign account on this chain that they control. + SovereignSignedViaLocation, + // Native converter for Relay-chain (Parent) location; will convert to a `Relay` origin when + // recognized. + RelayChainAsNative, + // Native converter for sibling Parachains; will convert to a `SiblingPara` origin when + // recognized. + SiblingParachainAsNative, + // Superuser converter for the Relay-chain (Parent) location. This will allow it to issue a + // transaction from the Root origin. + ParentAsSuperuser, + // Native signed account converter; this just converts an `AccountId32` origin into a normal + // `RuntimeOrigin::Signed` origin of the same 32-byte value. + SignedAccountId32AsNative, + // XCM origins can be represented natively under the XCM pallet's `Xcm` origin. + XcmPassthrough, +); + +match_types! { + pub type ParentOrParentsPlurality: impl Contains = { + MultiLocation { parents: 1, interior: Here } | + MultiLocation { parents: 1, interior: X1(Plurality { .. }) } + }; + pub type FellowsPlurality: impl Contains = { + MultiLocation { parents: 1, interior: X2(Parachain(1001), Plurality { id: BodyId::Technical, ..}) } + }; +} + +/// A call filter for the XCM Transact instruction. This is a temporary measure until we properly +/// account for proof size weights. +/// +/// Calls that are allowed through this filter must: +/// 1. Have a fixed weight; +/// 2. Cannot lead to another call being made; +/// 3. Have a defined proof size weight, e.g. no unbounded vecs in call parameters. +pub struct SafeCallFilter; +impl Contains for SafeCallFilter { + fn contains(call: &RuntimeCall) -> bool { + #[cfg(feature = "runtime-benchmarks")] + { + if matches!(call, RuntimeCall::System(frame_system::Call::remark_with_event { .. })) { + return true + } + } + + matches!( + call, + RuntimeCall::PolkadotXcm(pallet_xcm::Call::force_xcm_version { .. }) | + RuntimeCall::System( + frame_system::Call::set_heap_pages { .. } | + frame_system::Call::set_code { .. } | + frame_system::Call::set_code_without_checks { .. } | + frame_system::Call::kill_prefix { .. }, + ) | RuntimeCall::ParachainSystem(..) | + RuntimeCall::Timestamp(..) | + RuntimeCall::Balances(..) | + RuntimeCall::CollatorSelection(..) | + RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | + RuntimeCall::XcmpQueue(..) + ) + } +} + +pub type Barrier = TrailingSetTopicAsId< + DenyThenTry< + DenyReserveTransferToRelayChain, + ( + // Allow local users to buy weight credit. + TakeWeightCredit, + // Expected responses are OK. + AllowKnownQueryResponses, + WithComputedOrigin< + ( + // If the message is one that immediately attemps to pay for execution, then + // allow it. + AllowTopLevelPaidExecutionFrom, + // Parent, its pluralities (i.e. governance bodies), and the Fellows plurality + // get free execution. + AllowExplicitUnpaidExecutionFrom<(ParentOrParentsPlurality, FellowsPlurality)>, + // Subscriptions for version tracking are OK. + AllowSubscriptionsFrom, + ), + UniversalLocation, + ConstU32<8>, + >, + ), + >, +>; + +parameter_types! { + pub TreasuryAccount: AccountId = TREASURY_PALLET_ID.into_account_truncating(); + pub RelayTreasuryLocation: MultiLocation = (Parent, PalletInstance(westend_runtime_constants::TREASURY_PALLET_ID)).into(); +} + +/// Locations that will not be charged fees in the executor, +/// either execution or delivery. +/// We only waive fees for system functions, which these locations represent. +pub type WaivedLocations = ( + RelayOrOtherSystemParachains, + Equals, +); + +pub struct XcmConfig; +impl xcm_executor::Config for XcmConfig { + type RuntimeCall = RuntimeCall; + type XcmSender = XcmRouter; + type AssetTransactor = CurrencyTransactor; + type OriginConverter = XcmOriginToTransactDispatchOrigin; + // Coretime chain does not recognize a reserve location for any asset. Users must teleport WND + // where allowed (e.g. with the Relay Chain). + type IsReserve = (); + /// Only allow teleportation of WND. + type IsTeleporter = ConcreteNativeAssetFrom; + type UniversalLocation = UniversalLocation; + type Barrier = Barrier; + type Weigher = WeightInfoBounds< + crate::weights::xcm::CoretimeWestendXcmWeight, + RuntimeCall, + MaxInstructions, + >; + type Trader = + UsingComponents>; + type ResponseHandler = PolkadotXcm; + type AssetTrap = PolkadotXcm; + type AssetClaims = PolkadotXcm; + type SubscriptionService = PolkadotXcm; + type PalletInstancesInfo = AllPalletsWithSystem; + type MaxAssetsIntoHolding = MaxAssetsIntoHolding; + type AssetLocker = (); + type AssetExchanger = (); + type FeeManager = XcmFeeManagerFromComponents< + WaivedLocations, + XcmFeeToAccount, + >; + type MessageExporter = (); + type UniversalAliases = Nothing; + type CallDispatcher = WithOriginFilter; + type SafeCallFilter = SafeCallFilter; + type Aliasers = Nothing; +} + +/// Converts a local signed origin into an XCM multilocation. Forms the basis for local origins +/// sending/executing XCMs. +pub type LocalOriginToLocation = SignedToAccountId32; + +pub type PriceForParentDelivery = + ExponentialPrice; + +/// The means for routing XCM messages which are not for local execution into the right message +/// queues. +pub type XcmRouter = WithUniqueTopic<( + // Two routers - use UMP to communicate with the relay chain: + cumulus_primitives_utility::ParentAsUmp, + // ..and XCMP to communicate with the sibling chains. + XcmpQueue, +)>; + +impl pallet_xcm::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + // We want to disallow users sending (arbitrary) XCM programs from this chain. + type SendXcmOrigin = EnsureXcmOrigin; + type XcmRouter = XcmRouter; + // We support local origins dispatching XCM executions in principle... + type ExecuteXcmOrigin = EnsureXcmOrigin; + // ... but disallow generic XCM execution. As a result only teleports are allowed. + type XcmExecuteFilter = Nothing; + type XcmExecutor = XcmExecutor; + type XcmTeleportFilter = Everything; + type XcmReserveTransferFilter = Nothing; // This parachain is not meant as a reserve location. + type Weigher = WeightInfoBounds< + crate::weights::xcm::CoretimeWestendXcmWeight, + RuntimeCall, + MaxInstructions, + >; + type UniversalLocation = UniversalLocation; + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100; + type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion; + type Currency = Balances; + type CurrencyMatcher = (); + type TrustedLockers = (); + type SovereignAccountOf = LocationToAccountId; + type MaxLockers = ConstU32<8>; + type WeightInfo = crate::weights::pallet_xcm::WeightInfo; + type AdminOrigin = EnsureRoot; + type MaxRemoteLockConsumers = ConstU32<0>; + type RemoteLockConsumerIdentifier = (); +} + +impl cumulus_pallet_xcm::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type XcmExecutor = XcmExecutor; +} diff --git a/cumulus/polkadot-parachain/Cargo.toml b/cumulus/polkadot-parachain/Cargo.toml index 8b7d1c1483c..1c055f6b2dd 100644 --- a/cumulus/polkadot-parachain/Cargo.toml +++ b/cumulus/polkadot-parachain/Cargo.toml @@ -34,6 +34,8 @@ asset-hub-westend-runtime = { path = "../parachains/runtimes/assets/asset-hub-we collectives-westend-runtime = { path = "../parachains/runtimes/collectives/collectives-westend" } contracts-rococo-runtime = { path = "../parachains/runtimes/contracts/contracts-rococo" } bridge-hub-rococo-runtime = { path = "../parachains/runtimes/bridge-hubs/bridge-hub-rococo" } +coretime-rococo-runtime = { path = "../parachains/runtimes/coretime/coretime-rococo" } +coretime-westend-runtime = { path = "../parachains/runtimes/coretime/coretime-westend" } bridge-hub-westend-runtime = { path = "../parachains/runtimes/bridge-hubs/bridge-hub-westend" } penpal-runtime = { path = "../parachains/runtimes/testing/penpal" } jsonrpsee = { version = "0.16.2", features = ["server"] } @@ -124,6 +126,8 @@ runtime-benchmarks = [ "bridge-hub-westend-runtime/runtime-benchmarks", "collectives-westend-runtime/runtime-benchmarks", "contracts-rococo-runtime/runtime-benchmarks", + "coretime-rococo-runtime/runtime-benchmarks", + "coretime-westend-runtime/runtime-benchmarks", "cumulus-primitives-core/runtime-benchmarks", "frame-benchmarking-cli/runtime-benchmarks", "frame-benchmarking/runtime-benchmarks", @@ -145,6 +149,8 @@ try-runtime = [ "bridge-hub-westend-runtime/try-runtime", "collectives-westend-runtime/try-runtime", "contracts-rococo-runtime/try-runtime", + "coretime-rococo-runtime/try-runtime", + "coretime-westend-runtime/try-runtime", "frame-support/try-runtime", "frame-try-runtime/try-runtime", "glutton-westend-runtime/try-runtime", diff --git a/cumulus/polkadot-parachain/src/chain_spec/coretime.rs b/cumulus/polkadot-parachain/src/chain_spec/coretime.rs new file mode 100644 index 00000000000..958336c03b5 --- /dev/null +++ b/cumulus/polkadot-parachain/src/chain_spec/coretime.rs @@ -0,0 +1,282 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +use crate::chain_spec::GenericChainSpec; +use cumulus_primitives_core::ParaId; +use sc_chain_spec::{ChainSpec, ChainType}; +use std::{borrow::Cow, str::FromStr}; + +/// Collects all supported Coretime configurations. +#[derive(Debug, PartialEq, Clone)] +pub enum CoretimeRuntimeType { + // Live + Rococo, + // Local + RococoLocal, + // Benchmarks + RococoDevelopment, + + // Local + WestendLocal, + // Benchmarks + WestendDevelopment, +} + +impl FromStr for CoretimeRuntimeType { + type Err = String; + + fn from_str(value: &str) -> Result { + match value { + rococo::CORETIME_ROCOCO => Ok(CoretimeRuntimeType::Rococo), + rococo::CORETIME_ROCOCO_LOCAL => Ok(CoretimeRuntimeType::RococoLocal), + rococo::CORETIME_ROCOCO_DEVELOPMENT => Ok(CoretimeRuntimeType::RococoDevelopment), + westend::CORETIME_WESTEND_LOCAL => Ok(CoretimeRuntimeType::WestendLocal), + westend::CORETIME_WESTEND_DEVELOPMENT => Ok(CoretimeRuntimeType::WestendDevelopment), + _ => Err(format!("Value '{}' is not configured yet", value)), + } + } +} + +impl From for &str { + fn from(runtime_type: CoretimeRuntimeType) -> Self { + match runtime_type { + CoretimeRuntimeType::Rococo => rococo::CORETIME_ROCOCO, + CoretimeRuntimeType::RococoLocal => rococo::CORETIME_ROCOCO_LOCAL, + CoretimeRuntimeType::RococoDevelopment => rococo::CORETIME_ROCOCO_DEVELOPMENT, + CoretimeRuntimeType::WestendLocal => westend::CORETIME_WESTEND_LOCAL, + CoretimeRuntimeType::WestendDevelopment => westend::CORETIME_WESTEND_DEVELOPMENT, + } + } +} + +impl From for ChainType { + fn from(runtime_type: CoretimeRuntimeType) -> Self { + match runtime_type { + CoretimeRuntimeType::Rococo => ChainType::Live, + CoretimeRuntimeType::RococoLocal | CoretimeRuntimeType::WestendLocal => + ChainType::Local, + CoretimeRuntimeType::RococoDevelopment | CoretimeRuntimeType::WestendDevelopment => + ChainType::Development, + } + } +} + +pub const CORETIME_PARA_ID: ParaId = ParaId::new(1005); + +impl CoretimeRuntimeType { + pub const ID_PREFIX: &'static str = "coretime"; + + pub fn load_config(&self) -> Result, String> { + match self { + CoretimeRuntimeType::Rococo => Ok(Box::new(GenericChainSpec::from_json_bytes( + &include_bytes!("../../../parachains/chain-specs/coretime-rococo.json")[..], + )?)), + CoretimeRuntimeType::RococoLocal => + Ok(Box::new(rococo::local_config(self, "rococo-local"))), + CoretimeRuntimeType::RococoDevelopment => + Ok(Box::new(rococo::local_config(self, "rococo-dev"))), + CoretimeRuntimeType::WestendLocal => + Ok(Box::new(westend::local_config(self, "westend-local"))), + CoretimeRuntimeType::WestendDevelopment => + Ok(Box::new(westend::local_config(self, "westend-dev"))), + } + } +} + +/// Generate the name directly from the ChainType +pub fn chain_type_name(chain_type: &ChainType) -> Cow { + match chain_type { + ChainType::Development => "Development", + ChainType::Local => "Local", + ChainType::Live => "Live", + ChainType::Custom(name) => name, + } + .into() +} + +/// Sub-module for Rococo setup. +pub mod rococo { + use super::{chain_type_name, CoretimeRuntimeType, GenericChainSpec, ParaId}; + use crate::chain_spec::{ + get_account_id_from_seed, get_collator_keys_from_seed, Extensions, SAFE_XCM_VERSION, + }; + use parachains_common::{AccountId, AuraId, Balance}; + use sp_core::sr25519; + + pub(crate) const CORETIME_ROCOCO: &str = "coretime-rococo"; + pub(crate) const CORETIME_ROCOCO_LOCAL: &str = "coretime-rococo-local"; + pub(crate) const CORETIME_ROCOCO_DEVELOPMENT: &str = "coretime-rococo-dev"; + const CORETIME_ROCOCO_ED: Balance = parachains_common::rococo::currency::EXISTENTIAL_DEPOSIT; + + pub fn local_config(runtime_type: &CoretimeRuntimeType, relay_chain: &str) -> GenericChainSpec { + // Rococo defaults + let mut properties = sc_chain_spec::Properties::new(); + properties.insert("ss58Format".into(), 42.into()); + properties.insert("tokenSymbol".into(), "ROC".into()); + properties.insert("tokenDecimals".into(), 12.into()); + + let chain_type = runtime_type.clone().into(); + let chain_name = format!("Coretime Rococo {}", chain_type_name(&chain_type)); + let para_id = super::CORETIME_PARA_ID; + + GenericChainSpec::builder( + coretime_rococo_runtime::WASM_BINARY + .expect("WASM binary was not built, please build it!"), + Extensions { relay_chain: relay_chain.to_string(), para_id: para_id.into() }, + ) + .with_name(&chain_name) + .with_id(runtime_type.clone().into()) + .with_chain_type(chain_type) + .with_genesis_config_patch(genesis( + // initial collators. + vec![( + get_account_id_from_seed::("Alice"), + get_collator_keys_from_seed::("Alice"), + )], + vec![ + get_account_id_from_seed::("Alice"), + get_account_id_from_seed::("Bob"), + get_account_id_from_seed::("Alice//stash"), + get_account_id_from_seed::("Bob//stash"), + ], + para_id, + )) + .with_properties(properties) + .build() + } + + fn genesis( + invulnerables: Vec<(AccountId, AuraId)>, + endowed_accounts: Vec, + id: ParaId, + ) -> serde_json::Value { + serde_json::json!({ + "balances": { + "balances": endowed_accounts.iter().cloned().map(|k| (k, CORETIME_ROCOCO_ED * 4096)).collect::>(), + }, + "parachainInfo": { + "parachainId": id, + }, + "collatorSelection": { + "invulnerables": invulnerables.iter().cloned().map(|(acc, _)| acc).collect::>(), + "candidacyBond": CORETIME_ROCOCO_ED * 16, + }, + "session": { + "keys": invulnerables + .into_iter() + .map(|(acc, aura)| { + ( + acc.clone(), // account id + acc, // validator id + coretime_rococo_runtime::SessionKeys { aura }, // session keys + ) + }) + .collect::>(), + }, + "polkadotXcm": { + "safeXcmVersion": Some(SAFE_XCM_VERSION), + }, + "sudo": { + "key": Some(get_account_id_from_seed::("Alice")), + }, + }) + } +} + +/// Sub-module for Westend setup. +pub mod westend { + use super::{chain_type_name, CoretimeRuntimeType, GenericChainSpec, ParaId}; + use crate::chain_spec::{ + get_account_id_from_seed, get_collator_keys_from_seed, Extensions, SAFE_XCM_VERSION, + }; + use parachains_common::{AccountId, AuraId, Balance}; + use sp_core::sr25519; + + pub(crate) const CORETIME_WESTEND_LOCAL: &str = "coretime-westend-local"; + pub(crate) const CORETIME_WESTEND_DEVELOPMENT: &str = "coretime-westend-dev"; + const CORETIME_WESTEND_ED: Balance = parachains_common::westend::currency::EXISTENTIAL_DEPOSIT; + + pub fn local_config(runtime_type: &CoretimeRuntimeType, relay_chain: &str) -> GenericChainSpec { + // westend defaults + let mut properties = sc_chain_spec::Properties::new(); + properties.insert("ss58Format".into(), 42.into()); + properties.insert("tokenSymbol".into(), "WND".into()); + properties.insert("tokenDecimals".into(), 12.into()); + + let chain_type = runtime_type.clone().into(); + let chain_name = format!("Coretime Westend {}", chain_type_name(&chain_type)); + let para_id = super::CORETIME_PARA_ID; + + GenericChainSpec::builder( + coretime_westend_runtime::WASM_BINARY + .expect("WASM binary was not built, please build it!"), + Extensions { relay_chain: relay_chain.to_string(), para_id: para_id.into() }, + ) + .with_name(&chain_name) + .with_id(runtime_type.clone().into()) + .with_chain_type(chain_type) + .with_genesis_config_patch(genesis( + // initial collators. + vec![( + get_account_id_from_seed::("Alice"), + get_collator_keys_from_seed::("Alice"), + )], + vec![ + get_account_id_from_seed::("Alice"), + get_account_id_from_seed::("Bob"), + get_account_id_from_seed::("Alice//stash"), + get_account_id_from_seed::("Bob//stash"), + ], + para_id, + )) + .with_properties(properties) + .build() + } + + fn genesis( + invulnerables: Vec<(AccountId, AuraId)>, + endowed_accounts: Vec, + id: ParaId, + ) -> serde_json::Value { + serde_json::json!({ + "balances": { + "balances": endowed_accounts.iter().cloned().map(|k| (k, CORETIME_WESTEND_ED * 4096)).collect::>(), + }, + "parachainInfo": { + "parachainId": id, + }, + "collatorSelection": { + "invulnerables": invulnerables.iter().cloned().map(|(acc, _)| acc).collect::>(), + "candidacyBond": CORETIME_WESTEND_ED * 16, + }, + "session": { + "keys": invulnerables + .into_iter() + .map(|(acc, aura)| { + ( + acc.clone(), // account id + acc, // validator id + coretime_westend_runtime::SessionKeys { aura }, // session keys + ) + }) + .collect::>(), + }, + "polkadotXcm": { + "safeXcmVersion": Some(SAFE_XCM_VERSION), + } + }) + } +} diff --git a/cumulus/polkadot-parachain/src/chain_spec/mod.rs b/cumulus/polkadot-parachain/src/chain_spec/mod.rs index e8ed8a74ed7..6c0670d24b8 100644 --- a/cumulus/polkadot-parachain/src/chain_spec/mod.rs +++ b/cumulus/polkadot-parachain/src/chain_spec/mod.rs @@ -24,6 +24,7 @@ pub mod asset_hubs; pub mod bridge_hubs; pub mod collectives; pub mod contracts; +pub mod coretime; pub mod glutton; pub mod penpal; pub mod rococo_parachain; diff --git a/cumulus/polkadot-parachain/src/command.rs b/cumulus/polkadot-parachain/src/command.rs index d1b020cc7c9..5f80b2c001c 100644 --- a/cumulus/polkadot-parachain/src/command.rs +++ b/cumulus/polkadot-parachain/src/command.rs @@ -55,6 +55,7 @@ enum Runtime { Glutton, GluttonWestend, BridgeHub(chain_spec::bridge_hubs::BridgeHubRuntimeType), + Coretime(chain_spec::coretime::CoretimeRuntimeType), } trait RuntimeResolver { @@ -113,6 +114,10 @@ fn runtime(id: &str) -> Runtime { id.parse::() .expect("Invalid value"), ) + } else if id.starts_with(chain_spec::coretime::CoretimeRuntimeType::ID_PREFIX) { + Runtime::Coretime( + id.parse::().expect("Invalid value"), + ) } else if id.starts_with("glutton-westend") { Runtime::GluttonWestend } else if id.starts_with("glutton") { @@ -211,6 +216,15 @@ fn load_spec(id: &str) -> std::result::Result, String> { .expect("invalid value") .load_config()?, + // -- Coretime + coretime_like_id + if coretime_like_id + .starts_with(chain_spec::coretime::CoretimeRuntimeType::ID_PREFIX) => + coretime_like_id + .parse::() + .expect("invalid value") + .load_config()?, + // -- Penpal "penpal-rococo" => Box::new(chain_spec::penpal::get_penpal_chain_spec( para_id.expect("Must specify parachain id"), @@ -378,7 +392,8 @@ macro_rules! construct_partials { Runtime::AssetHubWestend | Runtime::BridgeHub(_) | Runtime::CollectivesPolkadot | - Runtime::CollectivesWestend => { + Runtime::CollectivesWestend | + Runtime::Coretime(_) => { let $partials = new_partial::( &$config, crate::service::aura_build_import_queue::<_, AuraId>, @@ -424,12 +439,13 @@ macro_rules! construct_async_run { { $( $code )* }.map(|v| (v, task_manager)) }) }, - Runtime::AssetHubWestend | - Runtime::AssetHubRococo | Runtime::AssetHubKusama | + Runtime::AssetHubRococo | + Runtime::AssetHubWestend | + Runtime::BridgeHub(_) | Runtime::CollectivesPolkadot | Runtime::CollectivesWestend | - Runtime::BridgeHub(_) => { + Runtime::Coretime(_) => { runner.async_run(|$config| { let $components = new_partial::( &$config, @@ -596,31 +612,31 @@ pub fn run() -> Result<()> { // that both file paths exist, the node will exit, as the user must decide (by // deleting one path) the information that they want to use as their DB. let old_name = match config.chain_spec.id() { - "asset-hub-polkadot" => Some("statemint"), - "asset-hub-kusama" => Some("statemine"), - "asset-hub-westend" => Some("westmint"), - "asset-hub-rococo" => Some("rockmine"), - _ => None, + "asset-hub-polkadot" => Some("statemint"), + "asset-hub-kusama" => Some("statemine"), + "asset-hub-westend" => Some("westmint"), + "asset-hub-rococo" => Some("rockmine"), + _ => None, }; if let Some(old_name) = old_name { - let new_path = config.base_path.config_dir(config.chain_spec.id()); - let old_path = config.base_path.config_dir(old_name); + let new_path = config.base_path.config_dir(config.chain_spec.id()); + let old_path = config.base_path.config_dir(old_name); - if old_path.exists() && new_path.exists() { - return Err(format!( + if old_path.exists() && new_path.exists() { + return Err(format!( "Found legacy {} path {} and new asset-hub path {}. Delete one path such that only one exists.", old_name, old_path.display(), new_path.display() ).into()) - } + } - if old_path.exists() { - std::fs::rename(old_path.clone(), new_path.clone())?; + if old_path.exists() { + std::fs::rename(old_path.clone(), new_path.clone())?; info!( "Statemint renamed to Asset Hub. The filepath with associated data on disk has been renamed from {} to {}.", old_path.display(), new_path.display() ); - } + } } let hwbench = (!cli.no_hardware_benchmarks).then_some( @@ -729,6 +745,7 @@ pub fn run() -> Result<()> { .await .map(|r| r.0) .map_err(Into::into), + Runtime::BridgeHub(bridge_hub_runtime_type) => match bridge_hub_runtime_type { chain_spec::bridge_hubs::BridgeHubRuntimeType::Polkadot => crate::service::start_generic_aura_node::< @@ -764,6 +781,22 @@ pub fn run() -> Result<()> { .map(|r| r.0), } .map_err(Into::into), + + Runtime::Coretime(coretime_runtime_type) => match coretime_runtime_type { + chain_spec::coretime::CoretimeRuntimeType::Rococo | + chain_spec::coretime::CoretimeRuntimeType::RococoLocal | + chain_spec::coretime::CoretimeRuntimeType::RococoDevelopment | + chain_spec::coretime::CoretimeRuntimeType::WestendLocal | + chain_spec::coretime::CoretimeRuntimeType::WestendDevelopment => + crate::service::start_generic_aura_node::< + RuntimeApi, + AuraId, + >(config, polkadot_config, collator_options, id, hwbench) + .await + .map(|r| r.0), + } + .map_err(Into::into), + Runtime::Penpal(_) | Runtime::Default => crate::service::start_rococo_parachain_node( config, diff --git a/cumulus/polkadot-parachain/src/service.rs b/cumulus/polkadot-parachain/src/service.rs index 1eb19a5fb27..dff5881108c 100644 --- a/cumulus/polkadot-parachain/src/service.rs +++ b/cumulus/polkadot-parachain/src/service.rs @@ -141,6 +141,30 @@ impl sc_executor::NativeExecutionDispatch for BridgeHubRococoRuntimeExecutor { } } +/// Native `CoretimeRococo` executor instance. +pub struct CoretimeRococoRuntimeExecutor; +impl sc_executor::NativeExecutionDispatch for CoretimeRococoRuntimeExecutor { + type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; + fn dispatch(method: &str, data: &[u8]) -> Option> { + coretime_rococo_runtime::api::dispatch(method, data) + } + fn native_version() -> sc_executor::NativeVersion { + coretime_rococo_runtime::native_version() + } +} + +/// Native `CoretimeWestend` executor instance. +pub struct CoretimeWestendRuntimeExecutor; +impl sc_executor::NativeExecutionDispatch for CoretimeWestendRuntimeExecutor { + type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; + fn dispatch(method: &str, data: &[u8]) -> Option> { + coretime_westend_runtime::api::dispatch(method, data) + } + fn native_version() -> sc_executor::NativeVersion { + coretime_westend_runtime::native_version() + } +} + /// Native contracts executor instance. pub struct ContractsRococoRuntimeExecutor; diff --git a/cumulus/scripts/create_coretime_rococo_spec.sh b/cumulus/scripts/create_coretime_rococo_spec.sh new file mode 100755 index 00000000000..877e8ee36c7 --- /dev/null +++ b/cumulus/scripts/create_coretime_rococo_spec.sh @@ -0,0 +1,86 @@ +#!/usr/bin/env bash + +usage() { + echo Usage: + echo "$1 " + echo "$2 " + echo "e.g.: ./cumulus/scripts/create_coretime_rococo_spec.sh ./target/release/wbuild/coretime-rococo-runtime/coretime_rococo_runtime.compact.compressed.wasm 1005" + exit 1 +} + +if [ -z "$1" ]; then + usage +fi + +if [ -z "$2" ]; then + usage +fi + +set -e + +rt_path=$1 +para_id=$2 + +echo "Generating chain spec for runtime: $rt_path and para_id: $para_id" + +binary="./target/release/polkadot-parachain" + +# build the chain spec we'll manipulate +$binary build-spec --chain coretime-rococo-dev > chain-spec-plain.json + +# convert runtime to hex +cat $rt_path | od -A n -v -t x1 | tr -d ' \n' > rt-hex.txt + +# replace the runtime in the spec with the given runtime and set some values to production +# Related issue for bootNodes, invulnerables, and session keys: https://github.com/paritytech/devops/issues/2725 +cat chain-spec-plain.json | jq --rawfile code rt-hex.txt '.genesis.runtimeGenesis.code = ("0x" + $code)' \ + | jq '.name = "Rococo Coretime"' \ + | jq '.id = "coretime-rococo"' \ + | jq '.chainType = "Live"' \ + | jq '.bootNodes = [ + "/dns/rococo-coretime-collator-node-0.polkadot.io/tcp/30333/p2p/12D3KooWHBUH9wGBx1Yq1ZePov9VL3AzxRPv5DTR4KadiCU6VKxy", + "/dns/rococo-coretime-collator-node-1.polkadot.io/tcp/30333/p2p/12D3KooWB3SKxdj6kpwTkdMnHJi6YmadojCzmEqFkeFJjxN812XX" + ]' \ + | jq '.relay_chain = "rococo"' \ + | jq --argjson para_id $para_id '.para_id = $para_id' \ + | jq --argjson para_id $para_id '.genesis.runtimeGenesis.patch.parachainInfo.parachainId = $para_id' \ + | jq '.genesis.runtimeGenesis.patch.balances.balances = []' \ + | jq '.genesis.runtimeGenesis.patch.collatorSelection.invulnerables = [ + "5G6Zua7Sowmt6ziddwUyueQs7HXDUVvDLaqqJDXXFyKvQ6Y6", + "5C8aSedh7ShpWEPW8aTNEErbKkMbiibdwP8cRzVRNqLmzAWF" + ]' \ + | jq '.genesis.runtimeGenesis.patch.session.keys = [ + [ + "5G6Zua7Sowmt6ziddwUyueQs7HXDUVvDLaqqJDXXFyKvQ6Y6", + "5G6Zua7Sowmt6ziddwUyueQs7HXDUVvDLaqqJDXXFyKvQ6Y6", + { + "aura": "5G6Zua7Sowmt6ziddwUyueQs7HXDUVvDLaqqJDXXFyKvQ6Y6" + } + ], + [ + "5C8aSedh7ShpWEPW8aTNEErbKkMbiibdwP8cRzVRNqLmzAWF", + "5C8aSedh7ShpWEPW8aTNEErbKkMbiibdwP8cRzVRNqLmzAWF", + { + "aura": "5C8aSedh7ShpWEPW8aTNEErbKkMbiibdwP8cRzVRNqLmzAWF" + } + ] + ]' \ + > edited-chain-spec-plain.json + +# build a raw spec +$binary build-spec --chain edited-chain-spec-plain.json --raw > chain-spec-raw.json +cp edited-chain-spec-plain.json coretime-rococo-spec.json +cp chain-spec-raw.json ./cumulus/parachains/chain-specs/coretime-rococo.json +cp chain-spec-raw.json coretime-rococo-spec-raw.json + +# build genesis data +$binary export-genesis-state --chain chain-spec-raw.json > coretime-rococo-genesis-head-data + +# build genesis wasm +$binary export-genesis-wasm --chain chain-spec-raw.json > coretime-rococo-wasm + +# cleanup +rm -f rt-hex.txt +rm -f chain-spec-plain.json +rm -f chain-spec-raw.json +rm -f edited-chain-spec-plain.json diff --git a/cumulus/scripts/create_coretime_westend_spec.sh b/cumulus/scripts/create_coretime_westend_spec.sh new file mode 100755 index 00000000000..90996f4a74f --- /dev/null +++ b/cumulus/scripts/create_coretime_westend_spec.sh @@ -0,0 +1,108 @@ +#!/usr/bin/env bash + +usage() { + echo Usage: + echo "$1 " + echo "$2 " + echo "e.g.: ./cumulus/scripts/create_coretime_westend_spec.sh ./target/release/wbuild/coretime-westend-runtime/coretime_westend_runtime.compact.compressed.wasm 1005" + exit 1 +} + +if [ -z "$1" ]; then + usage +fi + +if [ -z "$2" ]; then + usage +fi + +set -e + +rt_path=$1 +para_id=$2 + +echo "Generating chain spec for runtime: $rt_path and para_id: $para_id" + +binary="./target/release/polkadot-parachain" + +# build the chain spec we'll manipulate +$binary build-spec --chain coretime-westend-dev > chain-spec-plain.json + +# convert runtime to hex +cat $rt_path | od -A n -v -t x1 | tr -d ' \n' > rt-hex.txt + +# replace the runtime in the spec with the given runtime and set some values to production +# Related issue for bootNodes, invulnerables, and session keys: https://github.com/paritytech/devops/issues/2725 +cat chain-spec-plain.json | jq --rawfile code rt-hex.txt '.genesis.runtimeGenesis.code = ("0x" + $code)' \ + | jq '.name = "Westend Coretime"' \ + | jq '.id = "coretime-westend"' \ + | jq '.chainType = "Live"' \ + | jq '.bootNodes = [ + "/dns/westend-coretime-collator-0.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWP93Dzk8T7GWxyWw9jhLcz8Pksokk3R9vL2eEH337bNkT", + "/dns/westend-coretime-collator-1.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWMh2imeAzsZKGQgm2cv6Uoep3GBYtwGfujt1bs5YfVzkH", + "/dns/westend-coretime-collator-2.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWAys2hVpF7AN8hYGnu1T6XYFRGKeBFqD8q5LUcvWXRLg8", + "/dns/westend-coretime-collator-3.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWSGgmiRryoi7A3qAmeYWgmVeGQkk66PrhDjJ6ZPP555as", + "/dns/westend-coretime-connect-0.polkadot.io/tcp/443/wss/p2p/12D3KooWP93Dzk8T7GWxyWw9jhLcz8Pksokk3R9vL2eEH337bNkT", + "/dns/westend-coretime-connect-1.polkadot.io/tcp/443/wss/p2p/12D3KooWMh2imeAzsZKGQgm2cv6Uoep3GBYtwGfujt1bs5YfVzkH", + "/dns/westend-coretime-connect-2.polkadot.io/tcp/443/wss/p2p/12D3KooWAys2hVpF7AN8hYGnu1T6XYFRGKeBFqD8q5LUcvWXRLg8", + "/dns/westend-coretime-connect-3.polkadot.io/tcp/443/wss/p2p/12D3KooWSGgmiRryoi7A3qAmeYWgmVeGQkk66PrhDjJ6ZPP555as", + ]' \ + | jq '.relay_chain = "westend"' \ + | jq --argjson para_id $para_id '.para_id = $para_id' \ + | jq --argjson para_id $para_id '.genesis.runtimeGenesis.patch.parachainInfo.parachainId = $para_id' \ + | jq '.genesis.runtimeGenesis.patch.balances.balances = []' \ + | jq '.genesis.runtimeGenesis.patch.collatorSelection.invulnerables = [ + "5GKXTtB7RG3mLJ2kT4AkDXoxvKCFDVUdwyRmeMEbX3gBwcGi", + "5DknBCD1h49nc8eqnm6XtHz3bMQm5hfMuGYcLenRfCmpnBJG", + "5D52g9Mt9jQnZn6hwYhv649QYqGwhjygxkpb6rm3FYzYHEs3", + "5Egx2B41PYj8uvuhkNJeucA54h6Xmi7ZH9wqrZLwj3CuvQKA" + ]' \ + | jq '.genesis.runtimeGenesis.patch.session.keys = [ + [ + "5GKXTtB7RG3mLJ2kT4AkDXoxvKCFDVUdwyRmeMEbX3gBwcGi", + "5GKXTtB7RG3mLJ2kT4AkDXoxvKCFDVUdwyRmeMEbX3gBwcGi", + { + "aura": "0xbc3ea120d2991b75447b0b53cd8623970a0f6d98fa2701036c74d94e6b79252c" + } + ], + [ + "5DknBCD1h49nc8eqnm6XtHz3bMQm5hfMuGYcLenRfCmpnBJG", + "5DknBCD1h49nc8eqnm6XtHz3bMQm5hfMuGYcLenRfCmpnBJG", + { + "aura": "0x4acc970c28713ec93bf925352d3023418fdf89933227e1e2fdae8481103dfe28" + } + ], + [ + "5D52g9Mt9jQnZn6hwYhv649QYqGwhjygxkpb6rm3FYzYHEs3", + "5D52g9Mt9jQnZn6hwYhv649QYqGwhjygxkpb6rm3FYzYHEs3", + { + "aura": "0x2c7b95155708c10616b6f1a77a84f3d92c9a0272609ed24dbb7e6bdb81b53e76" + } + ], + [ + "5Egx2B41PYj8uvuhkNJeucA54h6Xmi7ZH9wqrZLwj3CuvQKA", + "5Egx2B41PYj8uvuhkNJeucA54h6Xmi7ZH9wqrZLwj3CuvQKA", + { + "aura": "0x741cfb39ec61bc76824ccec62d61670a80a890e0e21d58817f84040d3ec54474" + } + ] + ]' \ + > edited-chain-spec-plain.json + +# build a raw spec +$binary build-spec --chain edited-chain-spec-plain.json --raw > chain-spec-raw.json +cp edited-chain-spec-plain.json coretime-westend-spec.json +cp chain-spec-raw.json ./cumulus/parachains/chain-specs/coretime-westend.json +cp chain-spec-raw.json coretime-westend-spec-raw.json + +# build genesis data +$binary export-genesis-state --chain chain-spec-raw.json > coretime-westend-genesis-head-data + +# build genesis wasm +$binary export-genesis-wasm --chain chain-spec-raw.json > coretime-westend-wasm + +# cleanup +rm -f rt-hex.txt +rm -f chain-spec-plain.json +rm -f chain-spec-raw.json +rm -f edited-chain-spec-plain.json diff --git a/prdoc/pr_1479.prdoc b/prdoc/pr_1479.prdoc new file mode 100644 index 00000000000..33b798290f8 --- /dev/null +++ b/prdoc/pr_1479.prdoc @@ -0,0 +1,11 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Rococo/Westend Coretime Runtime + +doc: + - audience: Runtime User + description: | + Rococo/Westend runtime for the Coretime Chain (a.k.a. "Broker Chain") described in RFC-1. + +crates: [ ] \ No newline at end of file diff --git a/substrate/bin/node/runtime/src/lib.rs b/substrate/bin/node/runtime/src/lib.rs index 76a5c2bf65f..1002022d61e 100644 --- a/substrate/bin/node/runtime/src/lib.rs +++ b/substrate/bin/node/runtime/src/lib.rs @@ -1992,18 +1992,15 @@ pub struct CoretimeProvider; impl CoretimeInterface for CoretimeProvider { type AccountId = AccountId; type Balance = Balance; - type BlockNumber = BlockNumber; - fn latest() -> Self::BlockNumber { - System::block_number() - } + type RealyChainBlockNumberProvider = System; fn request_core_count(_count: CoreIndex) {} - fn request_revenue_info_at(_when: Self::BlockNumber) {} + fn request_revenue_info_at(_when: u32) {} fn credit_account(_who: Self::AccountId, _amount: Self::Balance) {} fn assign_core( _core: CoreIndex, - _begin: Self::BlockNumber, + _begin: u32, _assignment: Vec<(CoreAssignment, PartsOf57600)>, - _end_hint: Option, + _end_hint: Option, ) { } fn check_notify_core_count() -> Option { @@ -2011,7 +2008,7 @@ impl CoretimeInterface for CoretimeProvider { CoreCount::set(&None); count } - fn check_notify_revenue_info() -> Option<(Self::BlockNumber, Self::Balance)> { + fn check_notify_revenue_info() -> Option<(u32, Self::Balance)> { let revenue = CoretimeRevenue::get(); CoretimeRevenue::set(&None); revenue @@ -2021,7 +2018,7 @@ impl CoretimeInterface for CoretimeProvider { CoreCount::set(&Some(count)); } #[cfg(feature = "runtime-benchmarks")] - fn ensure_notify_revenue_info(when: Self::BlockNumber, revenue: Self::Balance) { + fn ensure_notify_revenue_info(when: u32, revenue: Self::Balance) { CoretimeRevenue::set(&Some((when, revenue))); } } diff --git a/substrate/frame/broker/src/benchmarking.rs b/substrate/frame/broker/src/benchmarking.rs index d22f3936c3e..2cb4826f4ac 100644 --- a/substrate/frame/broker/src/benchmarking.rs +++ b/substrate/frame/broker/src/benchmarking.rs @@ -31,7 +31,7 @@ use frame_support::{ use frame_system::{Pallet as System, RawOrigin}; use sp_arithmetic::{traits::Zero, Perbill}; use sp_core::Get; -use sp_runtime::Saturating; +use sp_runtime::{traits::BlockNumberProvider, Saturating}; use sp_std::{vec, vec::Vec}; const SEED: u32 = 0; @@ -82,6 +82,10 @@ fn setup_leases(n: u32, task: u32, until: u32) { fn advance_to(b: u32) { while System::::block_number() < b.into() { System::::set_block_number(System::::block_number().saturating_add(1u32.into())); + + let block_number: u32 = System::::block_number().try_into().ok().unwrap(); + + RCBlockNumberProviderOf::::set_block_number(block_number.into()); Broker::::on_initialize(System::::block_number()); } } @@ -182,7 +186,8 @@ mod benches { #[benchmark] fn start_sales(n: Linear<0, { MAX_CORE_COUNT.into() }>) -> Result<(), BenchmarkError> { - Configuration::::put(new_config_record::()); + let config = new_config_record::(); + Configuration::::put(config.clone()); // Assume Reservations to be filled for worst case setup_reservations::(T::MaxReservedCores::get()); @@ -190,6 +195,8 @@ mod benches { // Assume Leases to be filled for worst case setup_leases::(T::MaxLeasedCores::get(), 1, 10); + let latest_region_begin = Broker::::latest_timeslice_ready_to_commit(&config); + let initial_price = 10u32.into(); let origin = @@ -205,8 +212,8 @@ mod benches { leadin_length: 1u32.into(), start_price: 20u32.into(), regular_price: 10u32.into(), - region_begin: 4, - region_end: 7, + region_begin: latest_region_begin + config.region_length, + region_end: latest_region_begin + config.region_length * 2, ideal_cores_sold: 0, cores_offered: n .saturating_sub(T::MaxReservedCores::get()) @@ -239,7 +246,11 @@ mod benches { assert_last_event::( Event::Purchased { who: caller, - region_id: RegionId { begin: 4, core, mask: CoreMask::complete() }, + region_id: RegionId { + begin: SaleInfo::::get().unwrap().region_begin, + core, + mask: CoreMask::complete(), + }, price: 10u32.into(), duration: 3u32.into(), } @@ -252,6 +263,7 @@ mod benches { #[benchmark] fn renew() -> Result<(), BenchmarkError> { setup_and_start_sale::()?; + let region_len = Configuration::::get().unwrap().region_length; advance_to::(2); @@ -267,12 +279,12 @@ mod benches { Broker::::do_assign(region, None, 1001, Final) .map_err(|_| BenchmarkError::Weightless)?; - advance_to::(6); + advance_to::((T::TimeslicePeriod::get() * region_len.into()).try_into().ok().unwrap()); #[extrinsic_call] _(RawOrigin::Signed(caller), region.core); - let id = AllowedRenewalId { core: region.core, when: 10 }; + let id = AllowedRenewalId { core: region.core, when: region.begin + region_len * 2 }; assert!(AllowedRenewals::::get(id).is_some()); Ok(()) @@ -331,10 +343,10 @@ mod benches { assert_last_event::( Event::Partitioned { - old_region_id: RegionId { begin: 4, core, mask: CoreMask::complete() }, + old_region_id: RegionId { begin: region.begin, core, mask: CoreMask::complete() }, new_region_ids: ( - RegionId { begin: 4, core, mask: CoreMask::complete() }, - RegionId { begin: 6, core, mask: CoreMask::complete() }, + RegionId { begin: region.begin, core, mask: CoreMask::complete() }, + RegionId { begin: region.begin + 2, core, mask: CoreMask::complete() }, ), } .into(), @@ -363,11 +375,11 @@ mod benches { assert_last_event::( Event::Interlaced { - old_region_id: RegionId { begin: 4, core, mask: CoreMask::complete() }, + old_region_id: RegionId { begin: region.begin, core, mask: CoreMask::complete() }, new_region_ids: ( - RegionId { begin: 4, core, mask: 0x00000_fffff_fffff_00000.into() }, + RegionId { begin: region.begin, core, mask: 0x00000_fffff_fffff_00000.into() }, RegionId { - begin: 4, + begin: region.begin, core, mask: CoreMask::complete() ^ 0x00000_fffff_fffff_00000.into(), }, @@ -404,7 +416,7 @@ mod benches { assert_last_event::( Event::Assigned { - region_id: RegionId { begin: 4, core, mask: CoreMask::complete() }, + region_id: RegionId { begin: region.begin, core, mask: CoreMask::complete() }, task: 1000, duration: 3u32.into(), } @@ -439,7 +451,7 @@ mod benches { assert_last_event::( Event::Pooled { - region_id: RegionId { begin: 4, core, mask: CoreMask::complete() }, + region_id: RegionId { begin: region.begin, core, mask: CoreMask::complete() }, duration: 3u32.into(), } .into(), @@ -494,7 +506,11 @@ mod benches { who: recipient, amount: 200u32.into(), next: if m < new_config_record::().region_length { - Some(RegionId { begin: 4.saturating_add(m), core, mask: CoreMask::complete() }) + Some(RegionId { + begin: region.begin.saturating_add(m), + core, + mask: CoreMask::complete(), + }) } else { None }, @@ -541,6 +557,7 @@ mod benches { #[benchmark] fn drop_region() -> Result<(), BenchmarkError> { let core = setup_and_start_sale::()?; + let region_len = Configuration::::get().unwrap().region_length; advance_to::(2); @@ -553,14 +570,16 @@ mod benches { let region = Broker::::do_purchase(caller.clone(), 10u32.into()) .map_err(|_| BenchmarkError::Weightless)?; - advance_to::(12); + advance_to::( + (T::TimeslicePeriod::get() * (region_len * 4).into()).try_into().ok().unwrap(), + ); #[extrinsic_call] _(RawOrigin::Signed(caller), region); assert_last_event::( Event::RegionDropped { - region_id: RegionId { begin: 4, core, mask: CoreMask::complete() }, + region_id: RegionId { begin: region.begin, core, mask: CoreMask::complete() }, duration: 3u32.into(), } .into(), @@ -572,6 +591,7 @@ mod benches { #[benchmark] fn drop_contribution() -> Result<(), BenchmarkError> { let core = setup_and_start_sale::()?; + let region_len = Configuration::::get().unwrap().region_length; advance_to::(2); @@ -589,14 +609,16 @@ mod benches { Broker::::do_pool(region, None, recipient, Final) .map_err(|_| BenchmarkError::Weightless)?; - advance_to::(26); + advance_to::( + (T::TimeslicePeriod::get() * (region_len * 8).into()).try_into().ok().unwrap(), + ); #[extrinsic_call] _(RawOrigin::Signed(caller), region); assert_last_event::( Event::ContributionDropped { - region_id: RegionId { begin: 4, core, mask: CoreMask::complete() }, + region_id: RegionId { begin: region.begin, core, mask: CoreMask::complete() }, } .into(), ); @@ -609,8 +631,11 @@ mod benches { setup_and_start_sale::()?; let when = 5u32.into(); let revenue = 10u32.into(); + let region_len = Configuration::::get().unwrap().region_length; - advance_to::(25); + advance_to::( + (T::TimeslicePeriod::get() * (region_len * 8).into()).try_into().ok().unwrap(), + ); let caller: T::AccountId = whitelisted_caller(); InstaPoolHistory::::insert( @@ -635,8 +660,11 @@ mod benches { fn drop_renewal() -> Result<(), BenchmarkError> { let core = setup_and_start_sale::()?; let when = 5u32.into(); + let region_len = Configuration::::get().unwrap().region_length; - advance_to::(10); + advance_to::( + (T::TimeslicePeriod::get() * (region_len * 3).into()).try_into().ok().unwrap(), + ); let id = AllowedRenewalId { core, when }; let record = AllowedRenewalRecord { @@ -704,10 +732,16 @@ mod benches { ); T::Currency::set_balance(&Broker::::account_id(), T::Currency::minimum_balance()); - ::ensure_notify_revenue_info(10u32.into(), 10u32.into()); + let timeslice_period: u32 = T::TimeslicePeriod::get().try_into().ok().unwrap(); + let multiplicator = 5; + ::ensure_notify_revenue_info( + (timeslice_period * multiplicator).into(), + 10u32.into(), + ); + let timeslice = multiplicator - 1; InstaPoolHistory::::insert( - 4u32, + timeslice, InstaPoolHistoryRecord { private_contributions: 1u32.into(), system_contributions: 9u32.into(), @@ -722,7 +756,7 @@ mod benches { assert_last_event::( Event::ClaimsReady { - when: 4u32.into(), + when: timeslice.into(), system_payout: 9u32.into(), private_payout: 1u32.into(), } @@ -769,7 +803,7 @@ mod benches { #[block] { - Broker::::rotate_sale(sale, &config, &status); + Broker::::rotate_sale(sale.clone(), &config, &status); } assert!(SaleInfo::::get().is_some()); @@ -779,8 +813,8 @@ mod benches { leadin_length: 1u32.into(), start_price: 20u32.into(), regular_price: 10u32.into(), - region_begin: 4, - region_end: 7, + region_begin: sale.region_begin + config.region_length, + region_end: sale.region_end + config.region_length, ideal_cores_sold: 0, cores_offered: n .saturating_sub(T::MaxReservedCores::get()) diff --git a/substrate/frame/broker/src/coretime_interface.rs b/substrate/frame/broker/src/coretime_interface.rs index fec40b9fdd7..9f23561ce94 100644 --- a/substrate/frame/broker/src/coretime_interface.rs +++ b/substrate/frame/broker/src/coretime_interface.rs @@ -22,7 +22,8 @@ use frame_support::Parameter; use scale_info::TypeInfo; use sp_arithmetic::traits::AtLeast32BitUnsigned; use sp_core::RuntimeDebug; -use sp_std::{fmt::Debug, vec::Vec}; +use sp_runtime::traits::BlockNumberProvider; +use sp_std::vec::Vec; /// Index of a Polkadot Core. pub type CoreIndex = u16; @@ -46,6 +47,12 @@ pub enum CoreAssignment { Task(TaskId), } +/// Relay chain block number of `T` that implements [`CoretimeInterface`]. +pub type RCBlockNumberOf = as BlockNumberProvider>::BlockNumber; + +/// Relay chain block number provider of `T` that implements [`CoretimeInterface`]. +pub type RCBlockNumberProviderOf = ::RealyChainBlockNumberProvider; + /// Type able to accept Coretime scheduling instructions and provide certain usage information. /// Generally implemented by the Relay-chain or some means of communicating with it. /// @@ -57,17 +64,8 @@ pub trait CoretimeInterface { /// A (Relay-chain-side) balance. type Balance: AtLeast32BitUnsigned; - /// A (Relay-chain-side) block number. - type BlockNumber: AtLeast32BitUnsigned - + Copy - + TypeInfo - + Encode - + Decode - + MaxEncodedLen - + Debug; - - /// Return the latest block number on the Relay-chain. - fn latest() -> Self::BlockNumber; + /// A provider for the relay chain block number. + type RealyChainBlockNumberProvider: BlockNumberProvider; /// Requests the Relay-chain to alter the number of schedulable cores to `count`. Under normal /// operation, the Relay-chain SHOULD send a `notify_core_count(count)` message back. @@ -81,7 +79,7 @@ pub trait CoretimeInterface { /// should be understood on a channel outside of this proposal. In the case that the request /// cannot be serviced because `when` is too old a block then a `notify_revenue` message must /// still be returned, but its `revenue` field may be `None`. - fn request_revenue_info_at(when: Self::BlockNumber); + fn request_revenue_info_at(when: RCBlockNumberOf); /// Instructs the Relay-chain to add the `amount` of DOT to the Instantaneous Coretime Market /// Credit account of `who`. @@ -104,9 +102,9 @@ pub trait CoretimeInterface { /// remain unchanged regardless of the `end_hint` value. fn assign_core( core: CoreIndex, - begin: Self::BlockNumber, + begin: RCBlockNumberOf, assignment: Vec<(CoreAssignment, PartsOf57600)>, - end_hint: Option, + end_hint: Option>, ); /// Indicate that from this block onwards, the range of acceptable values of the `core` @@ -123,7 +121,7 @@ pub trait CoretimeInterface { /// This explicitly disregards the possibility of multiple parachains requesting and being /// notified of revenue information. The Relay-chain must be configured to ensure that only a /// single revenue information destination exists. - fn check_notify_revenue_info() -> Option<(Self::BlockNumber, Self::Balance)>; + fn check_notify_revenue_info() -> Option<(RCBlockNumberOf, Self::Balance)>; /// Ensure that core count is updated to the provided value. /// @@ -135,34 +133,32 @@ pub trait CoretimeInterface { /// /// This is only used for benchmarking. #[cfg(feature = "runtime-benchmarks")] - fn ensure_notify_revenue_info(when: Self::BlockNumber, revenue: Self::Balance); + fn ensure_notify_revenue_info(when: RCBlockNumberOf, revenue: Self::Balance); } impl CoretimeInterface for () { type AccountId = (); type Balance = u64; - type BlockNumber = u32; - fn latest() -> Self::BlockNumber { - 0 - } + type RealyChainBlockNumberProvider = (); + fn request_core_count(_count: CoreIndex) {} - fn request_revenue_info_at(_when: Self::BlockNumber) {} + fn request_revenue_info_at(_when: RCBlockNumberOf) {} fn credit_account(_who: Self::AccountId, _amount: Self::Balance) {} fn assign_core( _core: CoreIndex, - _begin: Self::BlockNumber, + _begin: RCBlockNumberOf, _assignment: Vec<(CoreAssignment, PartsOf57600)>, - _end_hint: Option, + _end_hint: Option>, ) { } fn check_notify_core_count() -> Option { None } - fn check_notify_revenue_info() -> Option<(Self::BlockNumber, Self::Balance)> { + fn check_notify_revenue_info() -> Option<(RCBlockNumberOf, Self::Balance)> { None } #[cfg(feature = "runtime-benchmarks")] fn ensure_notify_core_count(_count: u16) {} #[cfg(feature = "runtime-benchmarks")] - fn ensure_notify_revenue_info(_when: Self::BlockNumber, _revenue: Self::Balance) {} + fn ensure_notify_revenue_info(_when: RCBlockNumberOf, _revenue: Self::Balance) {} } diff --git a/substrate/frame/broker/src/mock.rs b/substrate/frame/broker/src/mock.rs index d8bea484909..7444040ec9b 100644 --- a/substrate/frame/broker/src/mock.rs +++ b/substrate/frame/broker/src/mock.rs @@ -30,7 +30,10 @@ use frame_support::{ use frame_system::{EnsureRoot, EnsureSignedBy}; use sp_arithmetic::Perbill; use sp_core::{ConstU32, ConstU64}; -use sp_runtime::{traits::Identity, BuildStorage, Saturating}; +use sp_runtime::{ + traits::{BlockNumberProvider, Identity}, + BuildStorage, Saturating, +}; use sp_std::collections::btree_map::BTreeMap; type Block = frame_system::mocking::MockBlock; @@ -75,18 +78,20 @@ pub struct TestCoretimeProvider; impl CoretimeInterface for TestCoretimeProvider { type AccountId = u64; type Balance = u64; - type BlockNumber = u32; - fn latest() -> Self::BlockNumber { - System::block_number() as u32 - } + type RealyChainBlockNumberProvider = System; fn request_core_count(count: CoreIndex) { NotifyCoreCount::mutate(|s| s.insert(0, count)); } - fn request_revenue_info_at(when: Self::BlockNumber) { - if when > Self::latest() { - panic!("Asking for revenue info in the future {:?} {:?}", when, Self::latest()); + fn request_revenue_info_at(when: RCBlockNumberOf) { + if when > RCBlockNumberProviderOf::::current_block_number() { + panic!( + "Asking for revenue info in the future {:?} {:?}", + when, + RCBlockNumberProviderOf::::current_block_number() + ); } + let when = when as u32; let mut total = 0; CoretimeSpending::mutate(|s| { s.retain(|(n, a)| { @@ -105,27 +110,35 @@ impl CoretimeInterface for TestCoretimeProvider { } fn assign_core( core: CoreIndex, - begin: Self::BlockNumber, + begin: RCBlockNumberOf, assignment: Vec<(CoreAssignment, PartsOf57600)>, - end_hint: Option, + end_hint: Option>, ) { - CoretimeWorkplan::mutate(|p| p.insert((begin, core), assignment.clone())); - let item = (Self::latest(), AssignCore { core, begin, assignment, end_hint }); + CoretimeWorkplan::mutate(|p| p.insert((begin as u32, core), assignment.clone())); + let item = ( + RCBlockNumberProviderOf::::current_block_number() as u32, + AssignCore { + core, + begin: begin as u32, + assignment, + end_hint: end_hint.map(|v| v as u32), + }, + ); CoretimeTrace::mutate(|v| v.push(item)); } fn check_notify_core_count() -> Option { NotifyCoreCount::mutate(|s| s.pop()) } - fn check_notify_revenue_info() -> Option<(Self::BlockNumber, Self::Balance)> { - NotifyRevenueInfo::mutate(|s| s.pop()) + fn check_notify_revenue_info() -> Option<(RCBlockNumberOf, Self::Balance)> { + NotifyRevenueInfo::mutate(|s| s.pop()).map(|v| (v.0 as _, v.1)) } #[cfg(feature = "runtime-benchmarks")] fn ensure_notify_core_count(count: u16) { NotifyCoreCount::mutate(|s| s.insert(0, count)); } #[cfg(feature = "runtime-benchmarks")] - fn ensure_notify_revenue_info(when: Self::BlockNumber, revenue: Self::Balance) { - NotifyRevenueInfo::mutate(|s| s.push((when, revenue))); + fn ensure_notify_revenue_info(when: RCBlockNumberOf, revenue: Self::Balance) { + NotifyRevenueInfo::mutate(|s| s.push((when as u32, revenue))); } } impl TestCoretimeProvider { @@ -134,14 +147,16 @@ impl TestCoretimeProvider { ensure!(CoretimeInPool::get() > 0, ()); c.insert(who, c.get(&who).ok_or(())?.checked_sub(price).ok_or(())?); CoretimeCredit::set(c); - CoretimeSpending::mutate(|v| v.push((Self::latest(), price))); + CoretimeSpending::mutate(|v| { + v.push((RCBlockNumberProviderOf::::current_block_number() as u32, price)) + }); Ok(()) } pub fn bump() { let mut pool_size = CoretimeInPool::get(); let mut workplan = CoretimeWorkplan::get(); let mut usage = CoretimeUsage::get(); - let now = Self::latest(); + let now = RCBlockNumberProviderOf::::current_block_number() as u32; workplan.retain(|(when, core), assignment| { if *when <= now { if let Some(old_assignment) = usage.get(core) { @@ -184,7 +199,7 @@ impl crate::Config for Test { type RuntimeEvent = RuntimeEvent; type Currency = ItemOf, ()>, (), u64>; type OnRevenue = IntoZero; - type TimeslicePeriod = ConstU32<2>; + type TimeslicePeriod = ConstU64<2>; type MaxLeasedCores = ConstU32<5>; type MaxReservedCores = ConstU32<5>; type Coretime = TestCoretimeProvider; @@ -240,7 +255,7 @@ impl TestExt { } pub fn advance_notice(mut self, advance_notice: Timeslice) -> Self { - self.0.advance_notice = advance_notice; + self.0.advance_notice = advance_notice as u64; self } diff --git a/substrate/frame/broker/src/tick_impls.rs b/substrate/frame/broker/src/tick_impls.rs index 7df8bd39d42..5f2be268b22 100644 --- a/substrate/frame/broker/src/tick_impls.rs +++ b/substrate/frame/broker/src/tick_impls.rs @@ -112,10 +112,16 @@ impl Pallet { } // Payout system InstaPool Cores. let total_contrib = r.system_contributions.saturating_add(r.private_contributions); - let system_payout = - revenue.saturating_mul(r.system_contributions.into()) / total_contrib.into(); - let _ = Self::charge(&Self::account_id(), system_payout); - revenue.saturating_reduce(system_payout); + let system_payout = if !total_contrib.is_zero() { + let system_payout = + revenue.saturating_mul(r.system_contributions.into()) / total_contrib.into(); + let _ = Self::charge(&Self::account_id(), system_payout); + revenue.saturating_reduce(system_payout); + + system_payout + } else { + Zero::zero() + }; if !revenue.is_zero() && r.private_contributions > 0 { r.maybe_payout = Some(revenue); diff --git a/substrate/frame/broker/src/types.rs b/substrate/frame/broker/src/types.rs index 89222ca8e95..7e9f351723a 100644 --- a/substrate/frame/broker/src/types.rs +++ b/substrate/frame/broker/src/types.rs @@ -16,7 +16,8 @@ // limitations under the License. use crate::{ - Config, CoreAssignment, CoreIndex, CoreMask, CoretimeInterface, TaskId, CORE_MASK_BITS, + Config, CoreAssignment, CoreIndex, CoreMask, CoretimeInterface, RCBlockNumberOf, TaskId, + CORE_MASK_BITS, }; use codec::{Decode, Encode, MaxEncodedLen}; use frame_support::traits::fungible::Inspect; @@ -28,7 +29,7 @@ use sp_runtime::BoundedVec; pub type BalanceOf = <::Currency as Inspect<::AccountId>>::Balance; pub type RelayBalanceOf = <::Coretime as CoretimeInterface>::Balance; -pub type RelayBlockNumberOf = <::Coretime as CoretimeInterface>::BlockNumber; +pub type RelayBlockNumberOf = RCBlockNumberOf<::Coretime>; pub type RelayAccountIdOf = <::Coretime as CoretimeInterface>::AccountId; /// Relay-chain block number with a fixed divisor of Config::TimeslicePeriod. diff --git a/substrate/frame/broker/src/utility_impls.rs b/substrate/frame/broker/src/utility_impls.rs index 2450198050b..3dba5be5b39 100644 --- a/substrate/frame/broker/src/utility_impls.rs +++ b/substrate/frame/broker/src/utility_impls.rs @@ -29,17 +29,17 @@ use sp_arithmetic::{ traits::{SaturatedConversion, Saturating}, FixedPointNumber, FixedU64, }; -use sp_runtime::traits::AccountIdConversion; +use sp_runtime::traits::{AccountIdConversion, BlockNumberProvider}; impl Pallet { pub fn current_timeslice() -> Timeslice { - let latest = T::Coretime::latest(); + let latest = RCBlockNumberProviderOf::::current_block_number(); let timeslice_period = T::TimeslicePeriod::get(); (latest / timeslice_period).saturated_into() } pub fn latest_timeslice_ready_to_commit(config: &ConfigRecordOf) -> Timeslice { - let latest = T::Coretime::latest(); + let latest = RCBlockNumberProviderOf::::current_block_number(); let advanced = latest.saturating_add(config.advance_notice); let timeslice_period = T::TimeslicePeriod::get(); (advanced / timeslice_period).saturated_into() diff --git a/substrate/primitives/runtime/src/offchain/storage_lock.rs b/substrate/primitives/runtime/src/offchain/storage_lock.rs index 116e1578815..a2da48721e7 100644 --- a/substrate/primitives/runtime/src/offchain/storage_lock.rs +++ b/substrate/primitives/runtime/src/offchain/storage_lock.rs @@ -156,7 +156,7 @@ pub struct BlockAndTimeDeadline { impl Clone for BlockAndTimeDeadline { fn clone(&self) -> Self { - Self { block_number: self.block_number.clone(), timestamp: self.timestamp } + Self { block_number: self.block_number, timestamp: self.timestamp } } } diff --git a/substrate/primitives/runtime/src/traits.rs b/substrate/primitives/runtime/src/traits.rs index ecb751e9bfb..2ac4047a80b 100644 --- a/substrate/primitives/runtime/src/traits.rs +++ b/substrate/primitives/runtime/src/traits.rs @@ -2292,7 +2292,15 @@ pub trait BlockIdTo { /// Get current block number pub trait BlockNumberProvider { /// Type of `BlockNumber` to provide. - type BlockNumber: Codec + Clone + Ord + Eq + AtLeast32BitUnsigned; + type BlockNumber: Codec + + Clone + + Ord + + Eq + + AtLeast32BitUnsigned + + TypeInfo + + Debug + + MaxEncodedLen + + Copy; /// Returns the current block number. /// @@ -2320,6 +2328,13 @@ pub trait BlockNumberProvider { fn set_block_number(_block: Self::BlockNumber) {} } +impl BlockNumberProvider for () { + type BlockNumber = u32; + fn current_block_number() -> Self::BlockNumber { + 0 + } +} + #[cfg(test)] mod tests { use super::*; -- GitLab From d1924013b62cdcddcc1d1720c0c6f6bf27298ca3 Mon Sep 17 00:00:00 2001 From: Juan Girini Date: Tue, 19 Dec 2023 15:28:39 +0100 Subject: [PATCH 059/191] Ref docs: runtime vs contracts (#2609) closes https://github.com/paritytech/polkadot-sdk-docs/issues/41 --- .../runtime_vs_smart_contract.rs | 211 +++++++++++++++++- 1 file changed, 207 insertions(+), 4 deletions(-) diff --git a/docs/sdk/src/reference_docs/runtime_vs_smart_contract.rs b/docs/sdk/src/reference_docs/runtime_vs_smart_contract.rs index 7f96fa1800a..16db44d8be4 100644 --- a/docs/sdk/src/reference_docs/runtime_vs_smart_contract.rs +++ b/docs/sdk/src/reference_docs/runtime_vs_smart_contract.rs @@ -1,6 +1,209 @@ -//! Runtime vs. Smart Contracts +//! # Runtime vs. Smart Contracts //! -//! Notes: +//! *TL;DR*: If you need to create a *Blockchain*, then write a runtime. If you need to create a +//! *DApp*, then write a Smart Contract. //! -//! Why one can be weighed, and one MUST be metered. -//! https://forum.polkadot.network/t/where-contracts-fail-and-runtimes-chains-are-needed/4464/3 +//! This is a comparative analysis of Substrate-based Runtimes and Smart Contracts, highlighting +//! their main differences. Our aim is to equip you with a clear understanding of how these two +//! methods of deploying on-chain logic diverge in their design, usage, and implications. +//! +//! Both Runtimes and Smart Contracts serve distinct purposes. Runtimes offer deep customization for +//! blockchain development, while Smart Contracts provide a more accessible approach for +//! decentralized applications. Understanding their differences is crucial in choosing the right +//! approach for a specific solution. +//! +//! ## Substrate +//! Substrate is a modular framework that enables the creation of purpose-specific blockchains. In +//! the Polkadot ecosystem you can find two distinct approaches for on-chain code execution: +//! [Runtime Development](#runtime-in-substrate) and [Smart Contracts](#smart-contracts). +//! +//! #### Smart Contracts in Substrate +//! Smart Contracts are autonomous, programmable constructs deployed on the blockchain. +//! In [FRAME](frame), Smart Contracts infrastructure is implemented by the +//! [`pallet_contracts`](../../../pallet_contracts/index.html) for WASM-based contracts or the +//! [`pallet_evm`](../../../pallet_evm/index.html) for EVM-compatible contracts. These pallets +//! enable Smart Contract developers to build applications and systems on top of a Substrate-based +//! blockchain. +//! +//! #### Runtime in Substrate +//! The Runtime is the state transition function of a Substrate-based blockchain. It defines the +//! rules for processing transactions and blocks, essentially governing the behavior and +//! capabilities of a blockchain. +//! +//! ## Comparative Table +//! +//! | Aspect | Runtime | Smart Contracts | +//! |-----------------------|-------------------------------------------------------------------------|----------------------------------------------------------------------| +//! | **Design Philosophy** | Core logic of a blockchain, allowing broad and deep customization. | Designed for DApps deployed on the blockchain runtime.| +//! | **Development Complexity** | Requires in-depth knowledge of Rust and Substrate. Suitable for complex blockchain architectures. | Easier to develop with knowledge of Smart Contract languages like Solidity or [ink!](https://use.ink/). | +//! | **Upgradeability and Flexibility** | Offers comprehensive upgradeability with migration logic and on-chain governance, allowing modifications to the entire blockchain logic without hard forks. | Less flexible in upgrade migrations but offers more straightforward deployment and iteration. | +//! | **Performance and Efficiency** | More efficient, optimized for specific needs of the blockchain. | Can be less efficient due to its generic nature (e.g. the overhead of a virtual machine). | +//! | **Security Considerations** | Security flaws can affect the entire blockchain. | Security risks usually localized to the individual contract. | +//! | **Weighing and Metering** | Operations can be weighed, allowing for precise benchmarking. | Execution is metered, allowing for measurement of resource consumption. | +//! +//! We will now explore these differences in more detail. +//! +//! ## Design Philosophy +//! Runtimes and Smart Contracts are designed for different purposes. Runtimes are the core logic +//! of a blockchain, while Smart Contracts are designed for DApps on top of the blockchain. +//! Runtimes can be more complex, but also more flexible and efficient, while Smart Contracts are +//! easier to develop and deploy. +//! +//! #### Runtime Design Philosophy +//! - **Core Blockchain Logic**: Runtimes are essentially the backbone of a blockchain. They define +//! the fundamental rules, operations, and state transitions of the blockchain network. +//! - **Broad and Deep Customization**: Runtimes allow for extensive customization and flexibility. +//! Developers can tailor the most fundamental aspects of the blockchain, like introducing an +//! efficient transaction fee model to eliminating transaction fees completely. This level of +//! control is essential for creating specialized or application-specific blockchains. +//! +//! #### Smart Contract Design Philosophy +//! - **DApps Development**: Smart contracts are designed primarily for developing DApps. They +//! operate on top of the blockchain's infrastructure. +//! - **Modularity and Isolation**: Smart contracts offer a more modular approach. Each contract is +//! an isolated piece of code, executing predefined operations when triggered. This isolation +//! simplifies development and enhances security, as flaws in one contract do not directly +//! compromise the entire network. +//! +//! ## Development Complexity +//! Runtimes and Smart Contracts differ in their development complexity, largely due to their +//! differing purposes and technical requirements. +//! +//! #### Runtime Development Complexity +//! - **In-depth Knowledge Requirements**: Developing a Runtime in Substrate requires a +//! comprehensive understanding of Rust, Substrate's framework, and blockchain principles. +//! - **Complex Blockchain Architectures**: Runtime development is suitable for creating complex +//! blockchain architectures. Developers must consider aspects like security, scalability, and +//! network efficiency. +//! +//! #### Smart Contract Development Complexity +//! - **Accessibility**: Smart Contract development is generally more accessible, especially for +//! those already familiar with programming concepts. Knowledge of smart contract-specific +//! languages like Solidity or ink! is required. +//! - **Focused on Application Logic**: The development here is focused on the application logic +//! only. This includes writing functions that execute when certain conditions are met, managing +//! state within the contract, and ensuring security against common Smart Contract +//! vulnerabilities. +//! +//! ## Upgradeability and Flexibility +//! Runtimes and Smart Contracts differ significantly in how they handle upgrades and flexibility, +//! each with its own advantages and constraints. Runtimes are more flexible, allowing for writing +//! migration logic for upgrades, while Smart Contracts are less flexible but offer easier +//! deployment and iteration. +//! +//! #### Runtime Upgradeability and Flexibility +//! - **Migration Logic**: One of the key strengths of runtime development is the ability to define +//! migration logic. This allows developers to implement changes in the state or structure of the +//! blockchain during an upgrade. Such migrations can adapt the existing state to fit new +//! requirements or features seamlessly. +//! - **On-Chain Governance**: Upgrades in a Runtime environment are typically governed on-chain, +//! involving validators or a governance mechanism. This allows for a democratic and transparent +//! process for making substantial changes to the blockchain. +//! - **Broad Impact of Changes**: Changes made in Runtime affect the entire blockchain. This gives +//! developers the power to introduce significant improvements or changes but also necessitates a +//! high level of responsibility and scrutiny, we will talk further about it in the [Security +//! Considerations](#security-considerations) section. +//! +//! #### Smart Contract Upgradeability and Flexibility +//! - **Deployment and Iteration**: Smart Contracts, by nature, are designed for more +//! straightforward deployment and iteration. Developers can quickly deploy contracts. +//! - **Contract Code Updates**: Once deployed, although typically immutable, Smart Contracts can be +//! upgraded, but lack of migration logic. The [pallet_contracts](../../../pallet_contracts/index.html) +//! allows for contracts to be upgraded by exposing the `set_code` dispatchable. More details on this +//! can be found in [Ink! documentation on upgradeable contracts](https://use.ink/5.x/basics/upgradeable-contracts). +//! - **Isolated Impact**: Upgrades or changes to a smart contract generally impact only that +//! contract and its users, unlike Runtime upgrades that have a network-wide effect. +//! - **Simplicity and Rapid Development**: The development cycle for Smart Contracts is usually +//! faster and less complex than Runtime development, allowing for rapid prototyping and +//! deployment. +//! +//! ## Performance and Efficiency +//! Runtimes and Smart Contracts have distinct characteristics in terms of performance and +//! efficiency due to their inherent design and operational contexts. Runtimes are more efficient +//! and optimized for specific needs, while Smart Contracts are more generic and less efficient. +//! +//! #### Runtime Performance and Efficiency +//! - **Optimized for Specific Needs**: Runtime modules in Substrate are tailored to meet the +//! specific needs of the blockchain. They are integrated directly into the blockchain's core, +//! allowing them to operate with high efficiency and minimal overhead. +//! - **Direct Access to Blockchain State**: Runtime has direct access to the blockchain's state. +//! This direct access enables more efficient data processing and transaction handling, as there +//! is no additional layer between the runtime logic and the blockchain's core. +//! - **Resource Management**: Resource management is integral to runtime development to ensure that +//! the blockchain operates smoothly and efficiently. +//! +//! #### Smart Contract Performance and Efficiency +//! - **Generic Nature and Overhead**: Smart Contracts, particularly those running in virtual +//! machine environments, can be less efficient due to the generic nature of their execution +//! environment. The overhead of the virtual machine can lead to increased computational and +//! resource costs. +//! - **Isolation and Security Constraints**: Smart Contracts operate in an isolated environment to +//! ensure security and prevent unwanted interactions with the blockchain's state. This isolation, +//! while crucial for security, can introduce additional computational overhead. +//! - **Gas Mechanism and Metering**: The gas mechanism in Smart Contracts, used for metering +//! computational resources, ensures that contracts don't consume excessive resources. However, +//! this metering itself requires computational power, adding to the overall cost of contract +//! execution. +//! +//! ## Security Considerations +//! These two methodologies, while serving different purposes, come with their own unique security +//! considerations. +//! +//! #### Runtime Security Aspects +//! Runtimes, being at the core of blockchain functionality, have profound implications for the +//! security of the entire network: +//! +//! - **Broad Impact**: Security flaws in the runtime can compromise the entire blockchain, +//! affecting all network participants. +//! - **Governance and Upgradeability**: Runtime upgrades, while powerful, need rigorous governance +//! and testing to ensure security. Improperly executed upgrades can introduce vulnerabilities or +//! disrupt network operations. +//! - **Complexity and Expertise**: Developing and maintaining runtime requires a higher level of +//! expertise in blockchain architecture and security, as mistakes can be far-reaching. +//! +//! #### Smart Contract Security Aspects +//! Smart contracts, while more isolated, bring their own set of security challenges: +//! +//! - **Isolated Impact**: Security issues in a smart contract typically affect the contract itself +//! and its users, rather than the whole network. +//! - **Contract-specific Risks**: Common issues like reentrancy +//! attacks, improper handling of external calls, and gas limit vulnerabilities are specific to +//! smart contract development. +//! - **Permissionless Deployment**: Since anyone can deploy a smart contract, +//! the ecosystem is more open to potentially malicious or vulnerable code. +//! +//! ## Weighing and Metering +//! Weighing and metering are mechanisms designed to limit the resources used by external actors. +//! However, there are fundamental differences in how these resources are handled in FRAME-based +//! Runtimes and how they are handled in Smart Contracts, while Runtime operations are weighed, +//! Smart Contract executions must be metered. +//! +//! #### Weighing +//! In FRAME-based Runtimes, operations are *weighed*. This means that each operation in the Runtime +//! has a fixed upper cost, known in advance, determined through +//! [benchmarking](crate::reference_docs::frame_benchmarking_weight). Weighing is practical here +//! because: +//! +//! - *Predictability*: Runtime operations are part of the blockchain's core logic, which is static +//! until an upgrade occurs. This predictability allows for precise +//! [benchmarking](crate::reference_docs::frame_benchmarking_weight). +//! - *Prevention of Abuse*: By having a fixed upper cost that corresponds to the worst-case +//! complexity scenario of its execution (and a mechanism to refund unused weight), it becomes +//! infeasible for an attacker to create transactions that could unpredictably consume excessive +//! resources. +//! +//! #### Metering +//! For Smart Contracts resource consumption is metered. This is essential due to: +//! +//! - **Untrusted Nature**: Unlike Runtime operations, Smart Contracts can be deployed by any user, +//! and their behavior isn’t known in advance. Metering dynamically measures resource consumption +//! as the contract executes. +//! - **Safety Against Infinite Loops**: Metering protects the blockchain from poorly designed +//! contracts that might run into infinite loops, consuming an indefinite amount of resources. +//! +//! #### Implications for Developers and Users +//! - **For Runtime Developers**: Understanding the cost of each operation is essential. Misjudging +//! the weight of operations can lead to network congestion or vulnerability exploitation. +//! - **For Smart Contract Developers**: Being mindful of the gas cost associated with contract +//! execution is crucial. Efficiently written contracts save costs and are less likely to hit gas +//! limits, ensuring smoother execution on the blockchain. -- GitLab From 7c79741e4019258cf174c02ca7abcf4d48155c9a Mon Sep 17 00:00:00 2001 From: Juan Girini Date: Tue, 19 Dec 2023 15:42:23 +0100 Subject: [PATCH 060/191] SDK docs ref cli (#2741) Closes https://github.com/paritytech/polkadot-sdk-docs/issues/53 --- docs/sdk/src/reference_docs/cli.rs | 105 +++++++++++++++++++++++++++-- 1 file changed, 101 insertions(+), 4 deletions(-) diff --git a/docs/sdk/src/reference_docs/cli.rs b/docs/sdk/src/reference_docs/cli.rs index 9274e86b04e..5779e0f8d04 100644 --- a/docs/sdk/src/reference_docs/cli.rs +++ b/docs/sdk/src/reference_docs/cli.rs @@ -1,7 +1,104 @@ -//! # Command Line Arguments +//! # Substrate CLI //! +//! Let's see some examples of typical CLI arguments used when setting up and running a +//! Substrate-based blockchain. We use the [`substrate-node-template`](https://github.com/substrate-developer-hub/substrate-node-template) +//! on these examples. //! -//! Notes: +//! #### Checking the available CLI arguments +//! ```bash +//! ./target/debug/node-template --help +//! ``` +//! - `--help`: Displays the available CLI arguments. //! -//! - Command line arguments of a typical substrate based chain, and how to find and learn them. -//! - How to extend them with your custom stuff. +//! #### Starting a Local Substrate Node in Development Mode +//! ```bash +//! ./target/release/node-template \ +//! --dev +//! ``` +//! - `--dev`: Runs the node in development mode, using a pre-defined development chain +//! specification. +//! This mode ensures a fresh state by deleting existing data on restart. +//! +//! #### Generating Custom Chain Specification +//! ```bash +//! ./target/debug/node-template \ +//! build-spec \ +//! --disable-default-bootnode \ +//! --chain local \ +//! > customSpec.json +//! ``` +//! +//! - `build-spec`: A subcommand to generate a chain specification file. +//! - `--disable-default-bootnode`: Disables the default bootnodes in the node template. +//! - `--chain local`: Indicates the chain specification is for a local development chain. +//! - `> customSpec.json`: Redirects the output into a customSpec.json file. +//! +//! #### Converting Chain Specification to Raw Format +//! ```bash +//! ./target/debug/node-template build-spec \ +//! --chain=customSpec.json \ +//! --raw \ +//! --disable-default-bootnode \ +//! > customSpecRaw.json +//! ``` +//! +//! - `--chain=customSpec.json`: Uses the custom chain specification as input. +//! - `--disable-default-bootnode`: Disables the default bootnodes in the node template. +//! - `--raw`: Converts the chain specification into a raw format with encoded storage keys. +//! - `> customSpecRaw.json`: Outputs to customSpecRaw.json. +//! +//! #### Starting the First Node in a Private Network +//! ```bash +//! ./target/debug/node-template \ +//! --base-path /tmp/node01 \ +//! --chain ./customSpecRaw.json \ +//! --port 30333 \ +//! --ws-port 9945 \ +//! --rpc-port 9933 \ +//! --telemetry-url "wss://telemetry.polkadot.io/submit/ 0" \ +//! --validator \ +//! --rpc-methods Unsafe \ +//! --name MyNode01 +//! ``` +//! +//! - `--base-path`: Sets the directory for node data. +//! - `--chain`: Specifies the chain specification file. +//! - `--port`: TCP port for peer-to-peer communication. +//! - `--ws-port`: WebSocket port for RPC. +//! - `--rpc-port`: HTTP port for JSON-RPC. +//! - `--telemetry-url`: Endpoint for sending telemetry data. +//! - `--validator`: Indicates the node’s participation in block production. +//! - `--rpc-methods Unsafe`: Allows potentially unsafe RPC methods. +//! - `--name`: Sets a human-readable name for the node. +//! +//! #### Adding a Second Node to the Network +//! ```bash +//! ./target/release/node-template \ +//! --base-path /tmp/bob \ +//! --chain local \ +//! --bob \ +//! --port 30334 \ +//! --rpc-port 9946 \ +//! --telemetry-url "wss://telemetry.polkadot.io/submit/ 0" \ +//! --validator \ +//! --bootnodes /ip4/127.0.0.1/tcp/30333/p2p/12D3KooWEyoppNCUx8Yx66oV9fJnriXwCcXwDDUA2kj6vnc6iDEp +//! ``` +//! +//! - `--base-path`: Sets the directory for node data. +//! - `--chain`: Specifies the chain specification file. +//! - `--bob`: Initializes the node with the session keys of the "Bob" account. +//! - `--port`: TCP port for peer-to-peer communication. +//! - `--rpc-port`: HTTP port for JSON-RPC. +//! - `--telemetry-url`: Endpoint for sending telemetry data. +//! - `--validator`: Indicates the node’s participation in block production. +//! - `--bootnodes`: Specifies the address of the first node for peer discovery. Nodes should find +//! each other using mDNS. This command needs to be used if they don't find each other. +//! +//! --- +//! +//! > If you are interested in learning how to extend the CLI with your custom arguments, you can +//! > check out the [Customize your Substrate chain CLI](https://www.youtube.com/watch?v=IVifko1fqjw) +//! > seminar. +//! > Please note that the seminar is based on an older version of Substrate, and [Clap](https://docs.rs/clap/latest/clap/) +//! > is now used instead of [StructOpt](https://docs.rs/structopt/latest/structopt/) for parsing +//! > CLI arguments. -- GitLab From 84d6342cd26f1c2427558477fa1586319ce14677 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Tue, 19 Dec 2023 17:17:14 +0100 Subject: [PATCH 061/191] pallet-uniques/nfts: Small optimizations (#2754) Use `contains_key` to not require decoding the actual value. --- substrate/frame/nfts/src/features/transfer.rs | 4 ++-- substrate/frame/uniques/src/lib.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/substrate/frame/nfts/src/features/transfer.rs b/substrate/frame/nfts/src/features/transfer.rs index ac73d283ee0..bba834483e1 100644 --- a/substrate/frame/nfts/src/features/transfer.rs +++ b/substrate/frame/nfts/src/features/transfer.rs @@ -173,8 +173,8 @@ impl, I: 'static> Pallet { who: T::AccountId, maybe_collection: Option, ) -> DispatchResult { - let old = OwnershipAcceptance::::get(&who); - match (old.is_some(), maybe_collection.is_some()) { + let exists = OwnershipAcceptance::::contains_key(&who); + match (exists, maybe_collection.is_some()) { (false, true) => { frame_system::Pallet::::inc_consumers(&who)?; }, diff --git a/substrate/frame/uniques/src/lib.rs b/substrate/frame/uniques/src/lib.rs index 253a318e474..f7cc6b044d7 100644 --- a/substrate/frame/uniques/src/lib.rs +++ b/substrate/frame/uniques/src/lib.rs @@ -1433,8 +1433,8 @@ pub mod pallet { maybe_collection: Option, ) -> DispatchResult { let who = ensure_signed(origin)?; - let old = OwnershipAcceptance::::get(&who); - match (old.is_some(), maybe_collection.is_some()) { + let exists = OwnershipAcceptance::::contains_key(&who); + match (exists, maybe_collection.is_some()) { (false, true) => { frame_system::Pallet::::inc_consumers(&who)?; }, -- GitLab From 5ce04514eb56c5f583c382f66219d0088421b16d Mon Sep 17 00:00:00 2001 From: Muharem Date: Tue, 19 Dec 2023 17:31:18 +0100 Subject: [PATCH 062/191] pallet-asset-conversion: Swap Credit (#1677) Introduces a swap implementation that allows the exchange of a credit (aka Negative Imbalance) of one asset for a credit of another asset. This is particularly useful when a credit swap is required but may not have sufficient value to meet the ED constraint, hence cannot be deposited to temp account before. An example use case is when XCM fees are paid using an asset held in the XCM executor registry and has to be swapped for native currency. Additional Updates: - encapsulates the existing `Swap` trait impl within a transactional context, since partial storage mutation is possible when an error occurs; - supplied `Currency` and `Assets` impls must be implemented over the same `Balance` type, the `AssetBalance` generic type is dropped. This helps to avoid numerous type conversion and overflow cases. If those types are different it should be handled outside of the pallet; - `Box` asset kind on a pallet level, unbox on a runtime level - here [why](https://substrate.stackexchange.com/questions/10039/boxed-argument-of-a-dispatchable/10103#10103); - `path` uses `Vec` now, instead of `BoundedVec` since it is never used in PoV; - removes the `Transfer` event due to it's redundancy with the events emitted by `fungible/s` implementations; - modifies the `SwapExecuted` event type; related issue: - https://github.com/paritytech/polkadot-sdk/issues/105 related PRs: - (required for) https://github.com/paritytech/polkadot-sdk/pull/1845 - (caused) https://github.com/paritytech/polkadot-sdk/pull/1717 // DONE make the pallet work only with `fungibles` trait and make it free from the concept of a `native` asset - https://github.com/paritytech/polkadot-sdk/issues/1842 --------- Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> --- .../assets/asset-hub-rococo/src/tests/swap.rs | 45 +- .../asset-hub-westend/src/tests/swap.rs | 46 +- .../assets/asset-hub-kusama/src/lib.rs | 1480 +++++++++++++++++ .../assets/asset-hub-kusama/src/xcm_config.rs | 640 +++++++ .../assets/asset-hub-rococo/src/lib.rs | 14 +- .../assets/asset-hub-rococo/src/xcm_config.rs | 7 +- .../assets/asset-hub-westend/src/lib.rs | 27 +- .../asset-hub-westend/src/xcm_config.rs | 7 +- .../common/src/local_and_foreign_assets.rs | 45 +- prdoc/pr_1677.prdoc | 22 + substrate/bin/node/runtime/src/lib.rs | 6 +- .../asset-conversion/src/benchmarking.rs | 117 +- substrate/frame/asset-conversion/src/lib.rs | 759 +++++---- substrate/frame/asset-conversion/src/mock.rs | 3 +- substrate/frame/asset-conversion/src/swap.rs | 210 +++ substrate/frame/asset-conversion/src/tests.rs | 973 +++++++++-- substrate/frame/asset-conversion/src/types.rs | 143 +- .../asset-conversion-tx-payment/src/mock.rs | 1 - .../src/payment.rs | 15 +- .../asset-conversion-tx-payment/src/tests.rs | 25 +- 20 files changed, 3935 insertions(+), 650 deletions(-) create mode 100644 cumulus/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs create mode 100644 cumulus/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs create mode 100644 prdoc/pr_1677.prdoc create mode 100644 substrate/frame/asset-conversion/src/swap.rs diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/swap.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/swap.rs index 35a660ed3c4..12306e63346 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/swap.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/swap.rs @@ -14,18 +14,17 @@ // limitations under the License. use crate::*; -use frame_support::BoundedVec; use parachains_common::rococo::currency::EXISTENTIAL_DEPOSIT; use rococo_system_emulated_network::penpal_emulated_chain::LocalTeleportableToAssetHub as PenpalLocalTeleportableToAssetHub; use sp_runtime::ModuleError; #[test] fn swap_locally_on_chain_using_local_assets() { - let asset_native = Box::new(asset_hub_rococo_runtime::xcm_config::TokenLocation::get()); - let asset_one = Box::new(MultiLocation { + let asset_native = asset_hub_rococo_runtime::xcm_config::TokenLocation::get(); + let asset_one = MultiLocation { parents: 0, interior: X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), - }); + }; AssetHubRococo::execute_with(|| { type RuntimeEvent = ::RuntimeEvent; @@ -47,8 +46,8 @@ fn swap_locally_on_chain_using_local_assets() { assert_ok!(::AssetConversion::create_pool( ::RuntimeOrigin::signed(AssetHubRococoSender::get()), - asset_native.clone(), - asset_one.clone(), + Box::new(asset_native), + Box::new(asset_one), )); assert_expected_events!( @@ -60,8 +59,8 @@ fn swap_locally_on_chain_using_local_assets() { assert_ok!(::AssetConversion::add_liquidity( ::RuntimeOrigin::signed(AssetHubRococoSender::get()), - asset_native.clone(), - asset_one.clone(), + Box::new(asset_native), + Box::new(asset_one), 1_000_000_000_000, 2_000_000_000_000, 0, @@ -76,7 +75,7 @@ fn swap_locally_on_chain_using_local_assets() { ] ); - let path = BoundedVec::<_, _>::truncate_from(vec![asset_native.clone(), asset_one.clone()]); + let path = vec![Box::new(asset_native), Box::new(asset_one)]; assert_ok!( ::AssetConversion::swap_exact_tokens_for_tokens( @@ -101,8 +100,8 @@ fn swap_locally_on_chain_using_local_assets() { assert_ok!(::AssetConversion::remove_liquidity( ::RuntimeOrigin::signed(AssetHubRococoSender::get()), - asset_native, - asset_one, + Box::new(asset_native), + Box::new(asset_one), 1414213562273 - EXISTENTIAL_DEPOSIT * 2, // all but the 2 EDs can't be retrieved. 0, 0, @@ -113,7 +112,7 @@ fn swap_locally_on_chain_using_local_assets() { #[test] fn swap_locally_on_chain_using_foreign_assets() { - let asset_native = Box::new(asset_hub_rococo_runtime::xcm_config::TokenLocation::get()); + let asset_native = asset_hub_rococo_runtime::xcm_config::TokenLocation::get(); let ah_as_seen_by_penpal = PenpalA::sibling_location_of(AssetHubRococo::para_id()); let asset_location_on_penpal = PenpalLocalTeleportableToAssetHub::get(); let asset_id_on_penpal = match asset_location_on_penpal.last() { @@ -165,12 +164,11 @@ fn swap_locally_on_chain_using_foreign_assets() { ] ); - let foreign_asset_at_asset_hub_rococo = Box::new(foreign_asset_at_asset_hub_rococo); // 4. Create pool: assert_ok!(::AssetConversion::create_pool( ::RuntimeOrigin::signed(AssetHubRococoSender::get()), - asset_native.clone(), - foreign_asset_at_asset_hub_rococo.clone(), + Box::new(asset_native), + Box::new(foreign_asset_at_asset_hub_rococo), )); assert_expected_events!( @@ -183,8 +181,8 @@ fn swap_locally_on_chain_using_foreign_assets() { // 5. Add liquidity: assert_ok!(::AssetConversion::add_liquidity( ::RuntimeOrigin::signed(sov_penpal_on_ahr.clone()), - asset_native.clone(), - foreign_asset_at_asset_hub_rococo.clone(), + Box::new(asset_native), + Box::new(foreign_asset_at_asset_hub_rococo), 1_000_000_000_000, 2_000_000_000_000, 0, @@ -202,10 +200,7 @@ fn swap_locally_on_chain_using_foreign_assets() { ); // 6. Swap! - let path = BoundedVec::<_, _>::truncate_from(vec![ - asset_native.clone(), - foreign_asset_at_asset_hub_rococo.clone(), - ]); + let path = vec![Box::new(asset_native), Box::new(foreign_asset_at_asset_hub_rococo)]; assert_ok!( ::AssetConversion::swap_exact_tokens_for_tokens( @@ -231,8 +226,8 @@ fn swap_locally_on_chain_using_foreign_assets() { // 7. Remove liquidity assert_ok!(::AssetConversion::remove_liquidity( ::RuntimeOrigin::signed(sov_penpal_on_ahr.clone()), - asset_native, - foreign_asset_at_asset_hub_rococo, + Box::new(asset_native), + Box::new(foreign_asset_at_asset_hub_rococo), 1414213562273 - 2_000_000_000, // all but the 2 EDs can't be retrieved. 0, 0, @@ -243,7 +238,7 @@ fn swap_locally_on_chain_using_foreign_assets() { #[test] fn cannot_create_pool_from_pool_assets() { - let asset_native = Box::new(asset_hub_rococo_runtime::xcm_config::TokenLocation::get()); + let asset_native = asset_hub_rococo_runtime::xcm_config::TokenLocation::get(); let mut asset_one = asset_hub_rococo_runtime::xcm_config::PoolAssetsPalletLocation::get(); asset_one.append_with(GeneralIndex(ASSET_ID.into())).expect("pool assets"); @@ -268,7 +263,7 @@ fn cannot_create_pool_from_pool_assets() { assert_matches::assert_matches!( ::AssetConversion::create_pool( ::RuntimeOrigin::signed(AssetHubRococoSender::get()), - asset_native.clone(), + Box::new(asset_native), Box::new(asset_one), ), Err(DispatchError::Module(ModuleError{index: _, error: _, message})) => assert_eq!(message, Some("UnsupportedAsset")) diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/swap.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/swap.rs index 1fa77bd4565..46a9b4252e1 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/swap.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/swap.rs @@ -18,11 +18,11 @@ use westend_system_emulated_network::penpal_emulated_chain::LocalTeleportableToA #[test] fn swap_locally_on_chain_using_local_assets() { - let asset_native = Box::new(asset_hub_westend_runtime::xcm_config::WestendLocation::get()); - let asset_one = Box::new(MultiLocation { + let asset_native = asset_hub_westend_runtime::xcm_config::WestendLocation::get(); + let asset_one = MultiLocation { parents: 0, interior: X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), - }); + }; AssetHubWestend::execute_with(|| { type RuntimeEvent = ::RuntimeEvent; @@ -44,8 +44,8 @@ fn swap_locally_on_chain_using_local_assets() { assert_ok!(::AssetConversion::create_pool( ::RuntimeOrigin::signed(AssetHubWestendSender::get()), - asset_native.clone(), - asset_one.clone(), + Box::new(asset_native), + Box::new(asset_one), )); assert_expected_events!( @@ -57,8 +57,8 @@ fn swap_locally_on_chain_using_local_assets() { assert_ok!(::AssetConversion::add_liquidity( ::RuntimeOrigin::signed(AssetHubWestendSender::get()), - asset_native.clone(), - asset_one.clone(), + Box::new(asset_native), + Box::new(asset_one), 1_000_000_000_000, 2_000_000_000_000, 0, @@ -73,7 +73,7 @@ fn swap_locally_on_chain_using_local_assets() { ] ); - let path = BoundedVec::<_, _>::truncate_from(vec![asset_native.clone(), asset_one.clone()]); + let path = vec![Box::new(asset_native), Box::new(asset_one)]; assert_ok!(::AssetConversion::swap_exact_tokens_for_tokens( ::RuntimeOrigin::signed(AssetHubWestendSender::get()), @@ -96,8 +96,8 @@ fn swap_locally_on_chain_using_local_assets() { assert_ok!(::AssetConversion::remove_liquidity( ::RuntimeOrigin::signed(AssetHubWestendSender::get()), - asset_native, - asset_one, + Box::new(asset_native), + Box::new(asset_one), 1414213562273 - 2_000_000_000, // all but the 2 EDs can't be retrieved. 0, 0, @@ -108,7 +108,7 @@ fn swap_locally_on_chain_using_local_assets() { #[test] fn swap_locally_on_chain_using_foreign_assets() { - let asset_native = Box::new(asset_hub_westend_runtime::xcm_config::WestendLocation::get()); + let asset_native = asset_hub_westend_runtime::xcm_config::WestendLocation::get(); let ah_as_seen_by_penpal = PenpalB::sibling_location_of(AssetHubWestend::para_id()); let asset_location_on_penpal = PenpalLocalTeleportableToAssetHub::get(); let asset_id_on_penpal = match asset_location_on_penpal.last() { @@ -160,12 +160,11 @@ fn swap_locally_on_chain_using_foreign_assets() { ] ); - let foreign_asset_at_asset_hub_westend = Box::new(foreign_asset_at_asset_hub_westend); // 4. Create pool: assert_ok!(::AssetConversion::create_pool( ::RuntimeOrigin::signed(AssetHubWestendSender::get()), - asset_native.clone(), - foreign_asset_at_asset_hub_westend.clone(), + Box::new(asset_native), + Box::new(foreign_asset_at_asset_hub_westend), )); assert_expected_events!( @@ -178,8 +177,8 @@ fn swap_locally_on_chain_using_foreign_assets() { // 5. Add liquidity: assert_ok!(::AssetConversion::add_liquidity( ::RuntimeOrigin::signed(sov_penpal_on_ahw.clone()), - asset_native.clone(), - foreign_asset_at_asset_hub_westend.clone(), + Box::new(asset_native), + Box::new(foreign_asset_at_asset_hub_westend), 1_000_000_000_000, 2_000_000_000_000, 0, @@ -197,10 +196,7 @@ fn swap_locally_on_chain_using_foreign_assets() { ); // 6. Swap! - let path = BoundedVec::<_, _>::truncate_from(vec![ - asset_native.clone(), - foreign_asset_at_asset_hub_westend.clone(), - ]); + let path = vec![Box::new(asset_native), Box::new(foreign_asset_at_asset_hub_westend)]; assert_ok!(::AssetConversion::swap_exact_tokens_for_tokens( ::RuntimeOrigin::signed(AssetHubWestendSender::get()), @@ -224,19 +220,19 @@ fn swap_locally_on_chain_using_foreign_assets() { // 7. Remove liquidity assert_ok!(::AssetConversion::remove_liquidity( ::RuntimeOrigin::signed(sov_penpal_on_ahw.clone()), - asset_native, - foreign_asset_at_asset_hub_westend, + Box::new(asset_native), + Box::new(foreign_asset_at_asset_hub_westend), 1414213562273 - 2_000_000_000, // all but the 2 EDs can't be retrieved. 0, 0, - sov_penpal_on_ahw.clone().into(), + sov_penpal_on_ahw.into(), )); }); } #[test] fn cannot_create_pool_from_pool_assets() { - let asset_native = Box::new(asset_hub_westend_runtime::xcm_config::WestendLocation::get()); + let asset_native = asset_hub_westend_runtime::xcm_config::WestendLocation::get(); let mut asset_one = asset_hub_westend_runtime::xcm_config::PoolAssetsPalletLocation::get(); asset_one.append_with(GeneralIndex(ASSET_ID.into())).expect("pool assets"); @@ -261,7 +257,7 @@ fn cannot_create_pool_from_pool_assets() { assert_matches::assert_matches!( ::AssetConversion::create_pool( ::RuntimeOrigin::signed(AssetHubWestendSender::get()), - asset_native.clone(), + Box::new(asset_native), Box::new(asset_one), ), Err(DispatchError::Module(ModuleError{index: _, error: _, message})) => assert_eq!(message, Some("UnsupportedAsset")) diff --git a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs new file mode 100644 index 00000000000..a1ee0e4df71 --- /dev/null +++ b/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs @@ -0,0 +1,1480 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! # Asset Hub Kusama Runtime +//! +//! Asset Hub Kusama, formerly known as "Statemine", is the canary network for its Polkadot cousin. + +#![cfg_attr(not(feature = "std"), no_std)] +#![recursion_limit = "256"] + +// Make the WASM binary available. +#[cfg(feature = "std")] +include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); + +mod weights; +pub mod xcm_config; + +use assets_common::{ + foreign_creators::ForeignCreators, + local_and_foreign_assets::{LocalAndForeignAssets, MultiLocationConverter}, + matching::FromSiblingParachain, + AssetIdForTrustBackedAssetsConvert, MultiLocationForAssetId, +}; +use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; +use cumulus_primitives_core::ParaId; +use polkadot_runtime_common::xcm_sender::NoPriceForMessageDelivery; +use sp_api::impl_runtime_apis; +use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; +use sp_runtime::{ + create_runtime_str, generic, impl_opaque_keys, + traits::{AccountIdConversion, AccountIdLookup, BlakeTwo256, Block as BlockT, Verify}, + transaction_validity::{TransactionSource, TransactionValidity}, + ApplyExtrinsicResult, Permill, +}; + +use sp_std::prelude::*; +#[cfg(feature = "std")] +use sp_version::NativeVersion; +use sp_version::RuntimeVersion; + +use codec::{Decode, Encode, MaxEncodedLen}; +use frame_support::{ + construct_runtime, + dispatch::DispatchClass, + genesis_builder_helper::{build_config, create_default_config}, + ord_parameter_types, parameter_types, + traits::{ + AsEnsureOriginWithArg, ConstBool, ConstU128, ConstU32, ConstU64, ConstU8, EitherOfDiverse, + InstanceFilter, + }, + weights::{ConstantMultiplier, Weight}, + BoundedVec, PalletId, +}; +use frame_system::{ + limits::{BlockLength, BlockWeights}, + EnsureRoot, EnsureSigned, EnsureSignedBy, +}; +use pallet_asset_conversion_tx_payment::AssetConversionAdapter; +use pallet_nfts::PalletFeatures; +pub use parachains_common as common; +use parachains_common::{ + impls::DealWithFees, + kusama::{consensus::*, currency::*, fee::WeightToFee}, + AccountId, AssetIdForTrustBackedAssets, AuraId, Balance, BlockNumber, Hash, Header, Nonce, + Signature, AVERAGE_ON_INITIALIZE_RATIO, DAYS, HOURS, MAXIMUM_BLOCK_WEIGHT, + NORMAL_DISPATCH_RATIO, SLOT_DURATION, +}; +use sp_runtime::RuntimeDebug; +use xcm::opaque::v3::MultiLocation; +use xcm_config::{ + FellowshipLocation, ForeignAssetsConvertedConcreteId, GovernanceLocation, KsmLocation, + PoolAssetsConvertedConcreteId, TrustBackedAssetsConvertedConcreteId, XcmConfig, +}; + +#[cfg(any(feature = "std", test))] +pub use sp_runtime::BuildStorage; + +// Polkadot imports +use pallet_xcm::{EnsureXcm, IsVoiceOfBody}; +use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; +use xcm::latest::prelude::*; +use xcm_executor::XcmExecutor; + +use crate::xcm_config::{ + ForeignCreatorsSovereignAccountOf, LocalAndForeignAssetsMultiLocationMatcher, + TrustBackedAssetsPalletLocation, +}; +use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; + +impl_opaque_keys! { + pub struct SessionKeys { + pub aura: Aura, + } +} + +#[cfg(feature = "state-trie-version-1")] +#[sp_version::runtime_version] +pub const VERSION: RuntimeVersion = RuntimeVersion { + // Note: "statemine" is the legacy name for this chain. It has been renamed to + // "asset-hub-kusama". Many wallets/tools depend on the `spec_name`, so it remains "statemine" + // for the time being. Wallets/tools should update to treat "asset-hub-kusama" equally. + spec_name: create_runtime_str!("statemine"), + impl_name: create_runtime_str!("statemine"), + authoring_version: 1, + spec_version: 10000, + impl_version: 0, + apis: RUNTIME_API_VERSIONS, + transaction_version: 13, + state_version: 1, +}; + +#[cfg(not(feature = "state-trie-version-1"))] +#[sp_version::runtime_version] +pub const VERSION: RuntimeVersion = RuntimeVersion { + // Note: "statemine" is the legacy name for this change. It has been renamed to + // "asset-hub-kusama". Many wallets/tools depend on the `spec_name`, so it remains "statemine" + // for the time being. Wallets/tools should update to treat "asset-hub-kusama" equally. + spec_name: create_runtime_str!("statemine"), + impl_name: create_runtime_str!("statemine"), + authoring_version: 1, + spec_version: 10000, + impl_version: 0, + apis: RUNTIME_API_VERSIONS, + transaction_version: 13, + state_version: 0, +}; + +/// The version information used to identify this runtime when compiled natively. +#[cfg(feature = "std")] +pub fn native_version() -> NativeVersion { + NativeVersion { runtime_version: VERSION, can_author_with: Default::default() } +} + +parameter_types! { + pub const Version: RuntimeVersion = VERSION; + pub RuntimeBlockLength: BlockLength = + BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO); + pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder() + .base_block(BlockExecutionWeight::get()) + .for_class(DispatchClass::all(), |weights| { + weights.base_extrinsic = ExtrinsicBaseWeight::get(); + }) + .for_class(DispatchClass::Normal, |weights| { + weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT); + }) + .for_class(DispatchClass::Operational, |weights| { + weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT); + // Operational transactions have some extra reserved space, so that they + // are included even if block reached `MAXIMUM_BLOCK_WEIGHT`. + weights.reserved = Some( + MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT + ); + }) + .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO) + .build_or_panic(); + pub const SS58Prefix: u8 = 2; +} + +// Configure FRAME pallets to include in runtime. +impl frame_system::Config for Runtime { + type BaseCallFilter = frame_support::traits::Everything; + type BlockWeights = RuntimeBlockWeights; + type BlockLength = RuntimeBlockLength; + type AccountId = AccountId; + type RuntimeCall = RuntimeCall; + type Lookup = AccountIdLookup; + type Nonce = Nonce; + type Hash = Hash; + type Hashing = BlakeTwo256; + type Block = Block; + type RuntimeEvent = RuntimeEvent; + type RuntimeOrigin = RuntimeOrigin; + type BlockHashCount = BlockHashCount; + type DbWeight = RocksDbWeight; + type Version = Version; + type PalletInfo = PalletInfo; + type OnNewAccount = (); + type OnKilledAccount = (); + type AccountData = pallet_balances::AccountData; + type SystemWeightInfo = weights::frame_system::WeightInfo; + type SS58Prefix = SS58Prefix; + type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode; + type MaxConsumers = frame_support::traits::ConstU32<16>; +} + +impl pallet_timestamp::Config for Runtime { + /// A timestamp: milliseconds since the unix epoch. + type Moment = u64; + type OnTimestampSet = Aura; + type MinimumPeriod = ConstU64<{ SLOT_DURATION / 2 }>; + type WeightInfo = weights::pallet_timestamp::WeightInfo; +} + +impl pallet_authorship::Config for Runtime { + type FindAuthor = pallet_session::FindAccountFromAuthorIndex; + type EventHandler = (CollatorSelection,); +} + +parameter_types! { + pub const ExistentialDeposit: Balance = EXISTENTIAL_DEPOSIT; +} + +impl pallet_balances::Config for Runtime { + type MaxLocks = ConstU32<50>; + /// The type for recording an account's balance. + type Balance = Balance; + /// The ubiquitous event type. + type RuntimeEvent = RuntimeEvent; + type DustRemoval = (); + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type WeightInfo = weights::pallet_balances::WeightInfo; + type MaxReserves = ConstU32<50>; + type ReserveIdentifier = [u8; 8]; + type RuntimeHoldReason = RuntimeHoldReason; + type RuntimeFreezeReason = RuntimeFreezeReason; + type FreezeIdentifier = (); + // We allow each account to have holds on it from: + // - `NftFractionalization`: 1 + type MaxHolds = ConstU32<1>; + type MaxFreezes = ConstU32<0>; +} + +parameter_types! { + /// Relay Chain `TransactionByteFee` / 10 + pub const TransactionByteFee: Balance = MILLICENTS; +} + +impl pallet_transaction_payment::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type OnChargeTransaction = + pallet_transaction_payment::CurrencyAdapter>; + type WeightToFee = WeightToFee; + type LengthToFee = ConstantMultiplier; + type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; + type OperationalFeeMultiplier = ConstU8<5>; +} + +parameter_types! { + pub const AssetDeposit: Balance = UNITS / 10; // 1 / 10 UNITS deposit to create asset + pub const AssetAccountDeposit: Balance = deposit(1, 16); + pub const ApprovalDeposit: Balance = EXISTENTIAL_DEPOSIT; + pub const AssetsStringLimit: u32 = 50; + /// Key = 32 bytes, Value = 36 bytes (32+1+1+1+1) + // https://github.com/paritytech/substrate/blob/069917b/frame/assets/src/lib.rs#L257L271 + pub const MetadataDepositBase: Balance = deposit(1, 68); + pub const MetadataDepositPerByte: Balance = deposit(0, 1); +} + +/// We allow root to execute privileged asset operations. +pub type AssetsForceOrigin = EnsureRoot; + +// Called "Trust Backed" assets because these are generally registered by some account, and users of +// the asset assume it has some claimed backing. The pallet is called `Assets` in +// `construct_runtime` to avoid breaking changes on storage reads. +pub type TrustBackedAssetsInstance = pallet_assets::Instance1; +type TrustBackedAssetsCall = pallet_assets::Call; +impl pallet_assets::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type AssetId = AssetIdForTrustBackedAssets; + type AssetIdParameter = codec::Compact; + type Currency = Balances; + type CreateOrigin = AsEnsureOriginWithArg>; + type ForceOrigin = AssetsForceOrigin; + type AssetDeposit = AssetDeposit; + type MetadataDepositBase = MetadataDepositBase; + type MetadataDepositPerByte = MetadataDepositPerByte; + type ApprovalDeposit = ApprovalDeposit; + type StringLimit = AssetsStringLimit; + type Freezer = (); + type Extra = (); + type WeightInfo = weights::pallet_assets_local::WeightInfo; + type CallbackHandle = (); + type AssetAccountDeposit = AssetAccountDeposit; + type RemoveItemsLimit = frame_support::traits::ConstU32<1000>; + #[cfg(feature = "runtime-benchmarks")] + type BenchmarkHelper = (); +} + +parameter_types! { + pub const AssetConversionPalletId: PalletId = PalletId(*b"py/ascon"); + pub const AllowMultiAssetPools: bool = false; + // should be non-zero if AllowMultiAssetPools is true, otherwise can be zero + pub const LiquidityWithdrawalFee: Permill = Permill::from_percent(0); +} + +ord_parameter_types! { + pub const AssetConversionOrigin: sp_runtime::AccountId32 = + AccountIdConversion::::into_account_truncating(&AssetConversionPalletId::get()); +} + +pub type PoolAssetsInstance = pallet_assets::Instance3; +impl pallet_assets::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type RemoveItemsLimit = ConstU32<1000>; + type AssetId = u32; + type AssetIdParameter = u32; + type Currency = Balances; + type CreateOrigin = + AsEnsureOriginWithArg>; + type ForceOrigin = AssetsForceOrigin; + // Deposits are zero because creation/admin is limited to Asset Conversion pallet. + type AssetDeposit = ConstU128<0>; + type AssetAccountDeposit = ConstU128<0>; + type MetadataDepositBase = ConstU128<0>; + type MetadataDepositPerByte = ConstU128<0>; + type ApprovalDeposit = ApprovalDeposit; + type StringLimit = ConstU32<50>; + type Freezer = (); + type Extra = (); + type WeightInfo = weights::pallet_assets_pool::WeightInfo; + type CallbackHandle = (); + #[cfg(feature = "runtime-benchmarks")] + type BenchmarkHelper = (); +} + +impl pallet_asset_conversion::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type HigherPrecisionBalance = sp_core::U256; + type Currency = Balances; + type AssetId = MultiLocation; + type Assets = LocalAndForeignAssets< + Assets, + AssetIdForTrustBackedAssetsConvert, + ForeignAssets, + >; + type PoolAssets = PoolAssets; + type PoolAssetId = u32; + type PoolSetupFee = ConstU128<0>; // Asset class deposit fees are sufficient to prevent spam + type PoolSetupFeeReceiver = AssetConversionOrigin; + // should be non-zero if `AllowMultiAssetPools` is true, otherwise can be zero. + type LiquidityWithdrawalFee = LiquidityWithdrawalFee; + type LPFee = ConstU32<3>; + type PalletId = AssetConversionPalletId; + type AllowMultiAssetPools = AllowMultiAssetPools; + type MaxSwapPathLength = ConstU32<4>; + type MultiAssetId = MultiLocation; + type MultiAssetIdConverter = + MultiLocationConverter; + type MintMinLiquidity = ConstU128<100>; + type WeightInfo = weights::pallet_asset_conversion::WeightInfo; + #[cfg(feature = "runtime-benchmarks")] + type BenchmarkHelper = + crate::xcm_config::BenchmarkMultiLocationConverter>; +} + +parameter_types! { + // we just reuse the same deposits + pub const ForeignAssetsAssetDeposit: Balance = AssetDeposit::get(); + pub const ForeignAssetsAssetAccountDeposit: Balance = AssetAccountDeposit::get(); + pub const ForeignAssetsApprovalDeposit: Balance = ApprovalDeposit::get(); + pub const ForeignAssetsAssetsStringLimit: u32 = AssetsStringLimit::get(); + pub const ForeignAssetsMetadataDepositBase: Balance = MetadataDepositBase::get(); + pub const ForeignAssetsMetadataDepositPerByte: Balance = MetadataDepositPerByte::get(); +} + +/// Assets managed by some foreign location. Note: we do not declare a `ForeignAssetsCall` type, as +/// this type is used in proxy definitions. We assume that a foreign location would not want to set +/// an individual, local account as a proxy for the issuance of their assets. This issuance should +/// be managed by the foreign location's governance. +pub type ForeignAssetsInstance = pallet_assets::Instance2; +impl pallet_assets::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type AssetId = MultiLocationForAssetId; + type AssetIdParameter = MultiLocationForAssetId; + type Currency = Balances; + type CreateOrigin = ForeignCreators< + (FromSiblingParachain>,), + ForeignCreatorsSovereignAccountOf, + AccountId, + >; + type ForceOrigin = AssetsForceOrigin; + type AssetDeposit = ForeignAssetsAssetDeposit; + type MetadataDepositBase = ForeignAssetsMetadataDepositBase; + type MetadataDepositPerByte = ForeignAssetsMetadataDepositPerByte; + type ApprovalDeposit = ForeignAssetsApprovalDeposit; + type StringLimit = ForeignAssetsAssetsStringLimit; + type Freezer = (); + type Extra = (); + type WeightInfo = weights::pallet_assets_foreign::WeightInfo; + type CallbackHandle = (); + type AssetAccountDeposit = ForeignAssetsAssetAccountDeposit; + type RemoveItemsLimit = frame_support::traits::ConstU32<1000>; + #[cfg(feature = "runtime-benchmarks")] + type BenchmarkHelper = xcm_config::XcmBenchmarkHelper; +} + +parameter_types! { + // One storage item; key size is 32; value is size 4+4+16+32 bytes = 56 bytes. + pub const DepositBase: Balance = deposit(1, 88); + // Additional storage item size of 32 bytes. + pub const DepositFactor: Balance = deposit(0, 32); + pub const MaxSignatories: u32 = 100; +} + +impl pallet_multisig::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; + type Currency = Balances; + type DepositBase = DepositBase; + type DepositFactor = DepositFactor; + type MaxSignatories = MaxSignatories; + type WeightInfo = weights::pallet_multisig::WeightInfo; +} + +impl pallet_utility::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; + type PalletsOrigin = OriginCaller; + type WeightInfo = weights::pallet_utility::WeightInfo; +} + +parameter_types! { + // One storage item; key size 32, value size 8; . + pub const ProxyDepositBase: Balance = deposit(1, 40); + // Additional storage item size of 33 bytes. + pub const ProxyDepositFactor: Balance = deposit(0, 33); + pub const MaxProxies: u16 = 32; + // One storage item; key size 32, value size 16 + pub const AnnouncementDepositBase: Balance = deposit(1, 48); + pub const AnnouncementDepositFactor: Balance = deposit(0, 66); + pub const MaxPending: u16 = 32; +} + +/// The type used to represent the kinds of proxying allowed. +#[derive( + Copy, + Clone, + Eq, + PartialEq, + Ord, + PartialOrd, + Encode, + Decode, + RuntimeDebug, + MaxEncodedLen, + scale_info::TypeInfo, +)] +pub enum ProxyType { + /// Fully permissioned proxy. Can execute any call on behalf of _proxied_. + Any, + /// Can execute any call that does not transfer funds or assets. + NonTransfer, + /// Proxy with the ability to reject time-delay proxy announcements. + CancelProxy, + /// Assets proxy. Can execute any call from `assets`, **including asset transfers**. + Assets, + /// Owner proxy. Can execute calls related to asset ownership. + AssetOwner, + /// Asset manager. Can execute calls related to asset management. + AssetManager, + /// Collator selection proxy. Can execute calls related to collator selection mechanism. + Collator, +} +impl Default for ProxyType { + fn default() -> Self { + Self::Any + } +} + +impl InstanceFilter for ProxyType { + fn filter(&self, c: &RuntimeCall) -> bool { + match self { + ProxyType::Any => true, + ProxyType::NonTransfer => !matches!( + c, + RuntimeCall::Balances { .. } | + RuntimeCall::Assets { .. } | + RuntimeCall::NftFractionalization { .. } | + RuntimeCall::Nfts { .. } | + RuntimeCall::Uniques { .. } + ), + ProxyType::CancelProxy => matches!( + c, + RuntimeCall::Proxy(pallet_proxy::Call::reject_announcement { .. }) | + RuntimeCall::Utility { .. } | + RuntimeCall::Multisig { .. } + ), + ProxyType::Assets => { + matches!( + c, + RuntimeCall::Assets { .. } | + RuntimeCall::Utility { .. } | + RuntimeCall::Multisig { .. } | + RuntimeCall::NftFractionalization { .. } | + RuntimeCall::Nfts { .. } | RuntimeCall::Uniques { .. } + ) + }, + ProxyType::AssetOwner => matches!( + c, + RuntimeCall::Assets(TrustBackedAssetsCall::create { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::start_destroy { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::destroy_accounts { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::destroy_approvals { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::finish_destroy { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::transfer_ownership { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::set_team { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::set_metadata { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::clear_metadata { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::set_min_balance { .. }) | + RuntimeCall::Nfts(pallet_nfts::Call::create { .. }) | + RuntimeCall::Nfts(pallet_nfts::Call::destroy { .. }) | + RuntimeCall::Nfts(pallet_nfts::Call::redeposit { .. }) | + RuntimeCall::Nfts(pallet_nfts::Call::transfer_ownership { .. }) | + RuntimeCall::Nfts(pallet_nfts::Call::set_team { .. }) | + RuntimeCall::Nfts(pallet_nfts::Call::set_collection_max_supply { .. }) | + RuntimeCall::Nfts(pallet_nfts::Call::lock_collection { .. }) | + RuntimeCall::Uniques(pallet_uniques::Call::create { .. }) | + RuntimeCall::Uniques(pallet_uniques::Call::destroy { .. }) | + RuntimeCall::Uniques(pallet_uniques::Call::transfer_ownership { .. }) | + RuntimeCall::Uniques(pallet_uniques::Call::set_team { .. }) | + RuntimeCall::Uniques(pallet_uniques::Call::set_metadata { .. }) | + RuntimeCall::Uniques(pallet_uniques::Call::set_attribute { .. }) | + RuntimeCall::Uniques(pallet_uniques::Call::set_collection_metadata { .. }) | + RuntimeCall::Uniques(pallet_uniques::Call::clear_metadata { .. }) | + RuntimeCall::Uniques(pallet_uniques::Call::clear_attribute { .. }) | + RuntimeCall::Uniques(pallet_uniques::Call::clear_collection_metadata { .. }) | + RuntimeCall::Uniques(pallet_uniques::Call::set_collection_max_supply { .. }) | + RuntimeCall::Utility { .. } | + RuntimeCall::Multisig { .. } + ), + ProxyType::AssetManager => matches!( + c, + RuntimeCall::Assets(TrustBackedAssetsCall::mint { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::burn { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::freeze { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::block { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::thaw { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::freeze_asset { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::thaw_asset { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::touch_other { .. }) | + RuntimeCall::Assets(TrustBackedAssetsCall::refund_other { .. }) | + RuntimeCall::Nfts(pallet_nfts::Call::force_mint { .. }) | + RuntimeCall::Nfts(pallet_nfts::Call::update_mint_settings { .. }) | + RuntimeCall::Nfts(pallet_nfts::Call::mint_pre_signed { .. }) | + RuntimeCall::Nfts(pallet_nfts::Call::set_attributes_pre_signed { .. }) | + RuntimeCall::Nfts(pallet_nfts::Call::lock_item_transfer { .. }) | + RuntimeCall::Nfts(pallet_nfts::Call::unlock_item_transfer { .. }) | + RuntimeCall::Nfts(pallet_nfts::Call::lock_item_properties { .. }) | + RuntimeCall::Nfts(pallet_nfts::Call::set_metadata { .. }) | + RuntimeCall::Nfts(pallet_nfts::Call::clear_metadata { .. }) | + RuntimeCall::Nfts(pallet_nfts::Call::set_collection_metadata { .. }) | + RuntimeCall::Nfts(pallet_nfts::Call::clear_collection_metadata { .. }) | + RuntimeCall::Uniques(pallet_uniques::Call::mint { .. }) | + RuntimeCall::Uniques(pallet_uniques::Call::burn { .. }) | + RuntimeCall::Uniques(pallet_uniques::Call::freeze { .. }) | + RuntimeCall::Uniques(pallet_uniques::Call::thaw { .. }) | + RuntimeCall::Uniques(pallet_uniques::Call::freeze_collection { .. }) | + RuntimeCall::Uniques(pallet_uniques::Call::thaw_collection { .. }) | + RuntimeCall::Utility { .. } | + RuntimeCall::Multisig { .. } + ), + ProxyType::Collator => matches!( + c, + RuntimeCall::CollatorSelection { .. } | + RuntimeCall::Utility { .. } | + RuntimeCall::Multisig { .. } + ), + } + } + + fn is_superset(&self, o: &Self) -> bool { + match (self, o) { + (x, y) if x == y => true, + (ProxyType::Any, _) => true, + (_, ProxyType::Any) => false, + (ProxyType::Assets, ProxyType::AssetOwner) => true, + (ProxyType::Assets, ProxyType::AssetManager) => true, + (ProxyType::NonTransfer, ProxyType::Collator) => true, + _ => false, + } + } +} + +impl pallet_proxy::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; + type Currency = Balances; + type ProxyType = ProxyType; + type ProxyDepositBase = ProxyDepositBase; + type ProxyDepositFactor = ProxyDepositFactor; + type MaxProxies = MaxProxies; + type WeightInfo = weights::pallet_proxy::WeightInfo; + type MaxPending = MaxPending; + type CallHasher = BlakeTwo256; + type AnnouncementDepositBase = AnnouncementDepositBase; + type AnnouncementDepositFactor = AnnouncementDepositFactor; +} + +parameter_types! { + pub const ReservedXcmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); + pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); +} + +impl cumulus_pallet_parachain_system::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type OnSystemEvent = (); + type SelfParaId = parachain_info::Pallet; + type DmpMessageHandler = DmpQueue; + type ReservedDmpWeight = ReservedDmpWeight; + type OutboundXcmpMessageSource = XcmpQueue; + type XcmpMessageHandler = XcmpQueue; + type ReservedXcmpWeight = ReservedXcmpWeight; + type CheckAssociatedRelayNumber = RelayNumberStrictlyIncreases; + type ConsensusHook = cumulus_pallet_aura_ext::FixedVelocityConsensusHook< + Runtime, + RELAY_CHAIN_SLOT_DURATION_MILLIS, + BLOCK_PROCESSING_VELOCITY, + UNINCLUDED_SEGMENT_CAPACITY, + >; +} + +impl parachain_info::Config for Runtime {} + +impl cumulus_pallet_aura_ext::Config for Runtime {} + +parameter_types! { + // Fellows pluralistic body. + pub const FellowsBodyId: BodyId = BodyId::Technical; +} + +impl cumulus_pallet_xcmp_queue::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type XcmExecutor = XcmExecutor; + type ChannelInfo = ParachainSystem; + type VersionWrapper = PolkadotXcm; + type ExecuteOverweightOrigin = EnsureRoot; + type ControllerOrigin = EitherOfDiverse< + EnsureRoot, + EnsureXcm>, + >; + type ControllerOriginConverter = xcm_config::XcmOriginToTransactDispatchOrigin; + type WeightInfo = weights::cumulus_pallet_xcmp_queue::WeightInfo; + type PriceForSiblingDelivery = NoPriceForMessageDelivery; +} + +impl cumulus_pallet_dmp_queue::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type XcmExecutor = XcmExecutor; + type ExecuteOverweightOrigin = EnsureRoot; +} + +parameter_types! { + pub const Period: u32 = 6 * HOURS; + pub const Offset: u32 = 0; +} + +impl pallet_session::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type ValidatorId = ::AccountId; + // we don't have stash and controller, thus we don't need the convert as well. + type ValidatorIdOf = pallet_collator_selection::IdentityCollator; + type ShouldEndSession = pallet_session::PeriodicSessions; + type NextSessionRotation = pallet_session::PeriodicSessions; + type SessionManager = CollatorSelection; + // Essentially just Aura, but let's be pedantic. + type SessionHandler = ::KeyTypeIdProviders; + type Keys = SessionKeys; + type WeightInfo = weights::pallet_session::WeightInfo; +} + +impl pallet_aura::Config for Runtime { + type AuthorityId = AuraId; + type DisabledValidators = (); + type MaxAuthorities = ConstU32<100_000>; + type AllowMultipleBlocksPerSlot = ConstBool; + #[cfg(feature = "experimental")] + type SlotDuration = pallet_aura::MinimumPeriodTimesTwo; +} + +parameter_types! { + pub const PotId: PalletId = PalletId(*b"PotStake"); + pub const SessionLength: BlockNumber = 6 * HOURS; + // StakingAdmin pluralistic body. + pub const StakingAdminBodyId: BodyId = BodyId::Defense; +} + +/// We allow root and the `StakingAdmin` to execute privileged collator selection operations. +pub type CollatorSelectionUpdateOrigin = EitherOfDiverse< + EnsureRoot, + EnsureXcm>, +>; + +impl pallet_collator_selection::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Currency = Balances; + type UpdateOrigin = CollatorSelectionUpdateOrigin; + type PotId = PotId; + type MaxCandidates = ConstU32<100>; + type MinEligibleCollators = ConstU32<4>; + type MaxInvulnerables = ConstU32<20>; + // should be a multiple of session or things will get inconsistent + type KickThreshold = Period; + type ValidatorId = ::AccountId; + type ValidatorIdOf = pallet_collator_selection::IdentityCollator; + type ValidatorRegistration = Session; + type WeightInfo = weights::pallet_collator_selection::WeightInfo; +} + +impl pallet_asset_conversion_tx_payment::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Fungibles = LocalAndForeignAssets< + Assets, + AssetIdForTrustBackedAssetsConvert, + ForeignAssets, + >; + type OnChargeAssetTransaction = AssetConversionAdapter; +} + +parameter_types! { + pub const UniquesCollectionDeposit: Balance = UNITS / 10; // 1 / 10 UNIT deposit to create a collection + pub const UniquesItemDeposit: Balance = UNITS / 1_000; // 1 / 1000 UNIT deposit to mint an item + pub const UniquesMetadataDepositBase: Balance = deposit(1, 129); + pub const UniquesAttributeDepositBase: Balance = deposit(1, 0); + pub const UniquesDepositPerByte: Balance = deposit(0, 1); +} + +impl pallet_uniques::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type CollectionId = u32; + type ItemId = u32; + type Currency = Balances; + type ForceOrigin = AssetsForceOrigin; + type CollectionDeposit = UniquesCollectionDeposit; + type ItemDeposit = UniquesItemDeposit; + type MetadataDepositBase = UniquesMetadataDepositBase; + type AttributeDepositBase = UniquesAttributeDepositBase; + type DepositPerByte = UniquesDepositPerByte; + type StringLimit = ConstU32<128>; + type KeyLimit = ConstU32<32>; + type ValueLimit = ConstU32<64>; + type WeightInfo = weights::pallet_uniques::WeightInfo; + #[cfg(feature = "runtime-benchmarks")] + type Helper = (); + type CreateOrigin = AsEnsureOriginWithArg>; + type Locker = (); +} + +parameter_types! { + pub const NftFractionalizationPalletId: PalletId = PalletId(*b"fraction"); + pub NewAssetSymbol: BoundedVec = (*b"FRAC").to_vec().try_into().unwrap(); + pub NewAssetName: BoundedVec = (*b"Frac").to_vec().try_into().unwrap(); +} + +impl pallet_nft_fractionalization::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Deposit = AssetDeposit; + type Currency = Balances; + type NewAssetSymbol = NewAssetSymbol; + type NewAssetName = NewAssetName; + type StringLimit = AssetsStringLimit; + type NftCollectionId = ::CollectionId; + type NftId = ::ItemId; + type AssetBalance = ::Balance; + type AssetId = >::AssetId; + type Assets = Assets; + type Nfts = Nfts; + type PalletId = NftFractionalizationPalletId; + type WeightInfo = pallet_nft_fractionalization::weights::SubstrateWeight; + type RuntimeHoldReason = RuntimeHoldReason; + #[cfg(feature = "runtime-benchmarks")] + type BenchmarkHelper = (); +} + +parameter_types! { + pub NftsPalletFeatures: PalletFeatures = PalletFeatures::all_enabled(); + pub const NftsMaxDeadlineDuration: BlockNumber = 12 * 30 * DAYS; + // re-use the Uniques deposits + pub const NftsCollectionDeposit: Balance = UniquesCollectionDeposit::get(); + pub const NftsItemDeposit: Balance = UniquesItemDeposit::get(); + pub const NftsMetadataDepositBase: Balance = UniquesMetadataDepositBase::get(); + pub const NftsAttributeDepositBase: Balance = UniquesAttributeDepositBase::get(); + pub const NftsDepositPerByte: Balance = UniquesDepositPerByte::get(); +} + +impl pallet_nfts::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type CollectionId = u32; + type ItemId = u32; + type Currency = Balances; + type CreateOrigin = AsEnsureOriginWithArg>; + type ForceOrigin = AssetsForceOrigin; + type Locker = (); + type CollectionDeposit = NftsCollectionDeposit; + type ItemDeposit = NftsItemDeposit; + type MetadataDepositBase = NftsMetadataDepositBase; + type AttributeDepositBase = NftsAttributeDepositBase; + type DepositPerByte = NftsDepositPerByte; + type StringLimit = ConstU32<256>; + type KeyLimit = ConstU32<64>; + type ValueLimit = ConstU32<256>; + type ApprovalsLimit = ConstU32<20>; + type ItemAttributesApprovalsLimit = ConstU32<30>; + type MaxTips = ConstU32<10>; + type MaxDeadlineDuration = NftsMaxDeadlineDuration; + type MaxAttributesPerCall = ConstU32<10>; + type Features = NftsPalletFeatures; + type OffchainSignature = Signature; + type OffchainPublic = ::Signer; + type WeightInfo = weights::pallet_nfts::WeightInfo; + #[cfg(feature = "runtime-benchmarks")] + type Helper = (); +} + +// Create the runtime by composing the FRAME pallets that were previously configured. +construct_runtime!( + pub enum Runtime + { + // System support stuff. + System: frame_system::{Pallet, Call, Config, Storage, Event} = 0, + ParachainSystem: cumulus_pallet_parachain_system::{ + Pallet, Call, Config, Storage, Inherent, Event, ValidateUnsigned, + } = 1, + // RandomnessCollectiveFlip = 2 removed + Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent} = 3, + ParachainInfo: parachain_info::{Pallet, Storage, Config} = 4, + + // Monetary stuff. + Balances: pallet_balances::{Pallet, Call, Storage, Config, Event} = 10, + TransactionPayment: pallet_transaction_payment::{Pallet, Storage, Event} = 11, + AssetTxPayment: pallet_asset_conversion_tx_payment::{Pallet, Event} = 13, + + // Collator support. the order of these 5 are important and shall not change. + Authorship: pallet_authorship::{Pallet, Storage} = 20, + CollatorSelection: pallet_collator_selection::{Pallet, Call, Storage, Event, Config} = 21, + Session: pallet_session::{Pallet, Call, Storage, Event, Config} = 22, + Aura: pallet_aura::{Pallet, Storage, Config} = 23, + AuraExt: cumulus_pallet_aura_ext::{Pallet, Storage, Config} = 24, + + // XCM helpers. + XcmpQueue: cumulus_pallet_xcmp_queue::{Pallet, Call, Storage, Event} = 30, + PolkadotXcm: pallet_xcm::{Pallet, Call, Storage, Event, Origin, Config} = 31, + CumulusXcm: cumulus_pallet_xcm::{Pallet, Event, Origin} = 32, + DmpQueue: cumulus_pallet_dmp_queue::{Pallet, Call, Storage, Event} = 33, + + // Handy utilities. + Utility: pallet_utility::{Pallet, Call, Event} = 40, + Multisig: pallet_multisig::{Pallet, Call, Storage, Event} = 41, + Proxy: pallet_proxy::{Pallet, Call, Storage, Event} = 42, + + // The main stage. + Assets: pallet_assets::::{Pallet, Call, Storage, Event} = 50, + Uniques: pallet_uniques::{Pallet, Call, Storage, Event} = 51, + Nfts: pallet_nfts::{Pallet, Call, Storage, Event} = 52, + ForeignAssets: pallet_assets::::{Pallet, Call, Storage, Event} = 53, + NftFractionalization: pallet_nft_fractionalization::{Pallet, Call, Storage, Event, HoldReason} = 54, + + PoolAssets: pallet_assets::::{Pallet, Call, Storage, Event} = 55, + AssetConversion: pallet_asset_conversion::{Pallet, Call, Storage, Event} = 56, + + #[cfg(feature = "state-trie-version-1")] + StateTrieMigration: pallet_state_trie_migration = 70, + } +); + +/// The address format for describing accounts. +pub type Address = sp_runtime::MultiAddress; +/// Block type as expected by this runtime. +pub type Block = generic::Block; +/// A Block signed with a Justification +pub type SignedBlock = generic::SignedBlock; +/// BlockId type as expected by this runtime. +pub type BlockId = generic::BlockId; +/// The SignedExtension to the basic transaction logic. +pub type SignedExtra = ( + frame_system::CheckNonZeroSender, + frame_system::CheckSpecVersion, + frame_system::CheckTxVersion, + frame_system::CheckGenesis, + frame_system::CheckEra, + frame_system::CheckNonce, + frame_system::CheckWeight, + pallet_asset_conversion_tx_payment::ChargeAssetTxPayment, +); +/// Unchecked extrinsic type as expected by this runtime. +pub type UncheckedExtrinsic = + generic::UncheckedExtrinsic; +/// Migrations to apply on runtime upgrade. +pub type Migrations = (pallet_collator_selection::migration::v1::MigrateToV1,); + +/// Executive: handles dispatch to the various modules. +pub type Executive = frame_executive::Executive< + Runtime, + Block, + frame_system::ChainContext, + Runtime, + AllPalletsWithSystem, + Migrations, +>; + +#[cfg(feature = "runtime-benchmarks")] +#[macro_use] +extern crate frame_benchmarking; + +#[cfg(feature = "runtime-benchmarks")] +mod benches { + define_benchmarks!( + [frame_system, SystemBench::] + [pallet_assets, Local] + [pallet_assets, Foreign] + [pallet_assets, Pool] + [pallet_asset_conversion, AssetConversion] + [pallet_balances, Balances] + [pallet_multisig, Multisig] + [pallet_nft_fractionalization, NftFractionalization] + [pallet_nfts, Nfts] + [pallet_proxy, Proxy] + [pallet_session, SessionBench::] + [pallet_uniques, Uniques] + [pallet_utility, Utility] + [pallet_timestamp, Timestamp] + [pallet_collator_selection, CollatorSelection] + [cumulus_pallet_xcmp_queue, XcmpQueue] + // XCM + [pallet_xcm, PolkadotXcm] + // NOTE: Make sure you point to the individual modules below. + [pallet_xcm_benchmarks::fungible, XcmBalances] + [pallet_xcm_benchmarks::generic, XcmGeneric] + ); +} + +impl_runtime_apis! { + impl sp_consensus_aura::AuraApi for Runtime { + fn slot_duration() -> sp_consensus_aura::SlotDuration { + sp_consensus_aura::SlotDuration::from_millis(Aura::slot_duration()) + } + + fn authorities() -> Vec { + Aura::authorities().into_inner() + } + } + + impl sp_api::Core for Runtime { + fn version() -> RuntimeVersion { + VERSION + } + + fn execute_block(block: Block) { + Executive::execute_block(block) + } + + fn initialize_block(header: &::Header) { + Executive::initialize_block(header) + } + } + + impl sp_api::Metadata for Runtime { + fn metadata() -> OpaqueMetadata { + OpaqueMetadata::new(Runtime::metadata().into()) + } + + fn metadata_at_version(version: u32) -> Option { + Runtime::metadata_at_version(version) + } + + fn metadata_versions() -> sp_std::vec::Vec { + Runtime::metadata_versions() + } + } + + impl sp_block_builder::BlockBuilder for Runtime { + fn apply_extrinsic(extrinsic: ::Extrinsic) -> ApplyExtrinsicResult { + Executive::apply_extrinsic(extrinsic) + } + + fn finalize_block() -> ::Header { + Executive::finalize_block() + } + + fn inherent_extrinsics(data: sp_inherents::InherentData) -> Vec<::Extrinsic> { + data.create_extrinsics() + } + + fn check_inherents( + block: Block, + data: sp_inherents::InherentData, + ) -> sp_inherents::CheckInherentsResult { + data.check_extrinsics(&block) + } + } + + impl sp_transaction_pool::runtime_api::TaggedTransactionQueue for Runtime { + fn validate_transaction( + source: TransactionSource, + tx: ::Extrinsic, + block_hash: ::Hash, + ) -> TransactionValidity { + Executive::validate_transaction(source, tx, block_hash) + } + } + + impl sp_offchain::OffchainWorkerApi for Runtime { + fn offchain_worker(header: &::Header) { + Executive::offchain_worker(header) + } + } + + impl sp_session::SessionKeys for Runtime { + fn generate_session_keys(seed: Option>) -> Vec { + SessionKeys::generate(seed) + } + + fn decode_session_keys( + encoded: Vec, + ) -> Option, KeyTypeId)>> { + SessionKeys::decode_into_raw_public_keys(&encoded) + } + } + + impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime { + fn account_nonce(account: AccountId) -> Nonce { + System::account_nonce(account) + } + } + + impl pallet_asset_conversion::AssetConversionApi< + Block, + Balance, + MultiLocation, + > for Runtime + { + fn quote_price_exact_tokens_for_tokens(asset1: MultiLocation, asset2: MultiLocation, amount: Balance, include_fee: bool) -> Option { + AssetConversion::quote_price_exact_tokens_for_tokens(asset1, asset2, amount, include_fee) + } + fn quote_price_tokens_for_exact_tokens(asset1: MultiLocation, asset2: MultiLocation, amount: Balance, include_fee: bool) -> Option { + AssetConversion::quote_price_tokens_for_exact_tokens(asset1, asset2, amount, include_fee) + } + fn get_reserves(asset1: MultiLocation, asset2: MultiLocation) -> Option<(Balance, Balance)> { + AssetConversion::get_reserves(&asset1, &asset2).ok() + } + } + + impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi for Runtime { + fn query_info( + uxt: ::Extrinsic, + len: u32, + ) -> pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo { + TransactionPayment::query_info(uxt, len) + } + fn query_fee_details( + uxt: ::Extrinsic, + len: u32, + ) -> pallet_transaction_payment::FeeDetails { + TransactionPayment::query_fee_details(uxt, len) + } + fn query_weight_to_fee(weight: Weight) -> Balance { + TransactionPayment::weight_to_fee(weight) + } + fn query_length_to_fee(length: u32) -> Balance { + TransactionPayment::length_to_fee(length) + } + } + + impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentCallApi + for Runtime + { + fn query_call_info( + call: RuntimeCall, + len: u32, + ) -> pallet_transaction_payment::RuntimeDispatchInfo { + TransactionPayment::query_call_info(call, len) + } + fn query_call_fee_details( + call: RuntimeCall, + len: u32, + ) -> pallet_transaction_payment::FeeDetails { + TransactionPayment::query_call_fee_details(call, len) + } + fn query_weight_to_fee(weight: Weight) -> Balance { + TransactionPayment::weight_to_fee(weight) + } + fn query_length_to_fee(length: u32) -> Balance { + TransactionPayment::length_to_fee(length) + } + } + + impl assets_common::runtime_api::FungiblesApi< + Block, + AccountId, + > for Runtime + { + fn query_account_balances(account: AccountId) -> Result { + use assets_common::fungible_conversion::{convert, convert_balance}; + Ok([ + // collect pallet_balance + { + let balance = Balances::free_balance(account.clone()); + if balance > 0 { + vec![convert_balance::(balance)?] + } else { + vec![] + } + }, + // collect pallet_assets (TrustBackedAssets) + convert::<_, _, _, _, TrustBackedAssetsConvertedConcreteId>( + Assets::account_balances(account.clone()) + .iter() + .filter(|(_, balance)| balance > &0) + )?, + // collect pallet_assets (ForeignAssets) + convert::<_, _, _, _, ForeignAssetsConvertedConcreteId>( + ForeignAssets::account_balances(account.clone()) + .iter() + .filter(|(_, balance)| balance > &0) + )?, + // collect pallet_assets (PoolAssets) + convert::<_, _, _, _, PoolAssetsConvertedConcreteId>( + PoolAssets::account_balances(account) + .iter() + .filter(|(_, balance)| balance > &0) + )?, + // collect ... e.g. other tokens + ].concat().into()) + } + } + + impl cumulus_primitives_core::CollectCollationInfo for Runtime { + fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { + ParachainSystem::collect_collation_info(header) + } + } + + #[cfg(feature = "try-runtime")] + impl frame_try_runtime::TryRuntime for Runtime { + fn on_runtime_upgrade(checks: frame_try_runtime::UpgradeCheckSelect) -> (Weight, Weight) { + let weight = Executive::try_runtime_upgrade(checks).unwrap(); + (weight, RuntimeBlockWeights::get().max_block) + } + + fn execute_block( + block: Block, + state_root_check: bool, + signature_check: bool, + select: frame_try_runtime::TryStateSelect, + ) -> Weight { + // NOTE: intentional unwrap: we don't want to propagate the error backwards, and want to + // have a backtrace here. + Executive::try_execute_block(block, state_root_check, signature_check, select).unwrap() + } + } + + #[cfg(feature = "runtime-benchmarks")] + impl frame_benchmarking::Benchmark for Runtime { + fn benchmark_metadata(extra: bool) -> ( + Vec, + Vec, + ) { + use frame_benchmarking::{Benchmarking, BenchmarkList}; + use frame_support::traits::StorageInfoTrait; + use frame_system_benchmarking::Pallet as SystemBench; + use cumulus_pallet_session_benchmarking::Pallet as SessionBench; + + // This is defined once again in dispatch_benchmark, because list_benchmarks! + // and add_benchmarks! are macros exported by define_benchmarks! macros and those types + // are referenced in that call. + type XcmBalances = pallet_xcm_benchmarks::fungible::Pallet::; + type XcmGeneric = pallet_xcm_benchmarks::generic::Pallet::; + + // Benchmark files generated for `Assets/ForeignAssets` instances are by default + // `pallet_assets_assets.rs / pallet_assets_foreign_assets`, which is not really nice, + // so with this redefinition we can change names to nicer: + // `pallet_assets_local.rs / pallet_assets_foreign.rs`. + type Local = pallet_assets::Pallet::; + type Foreign = pallet_assets::Pallet::; + type Pool = pallet_assets::Pallet::; + + let mut list = Vec::::new(); + list_benchmarks!(list, extra); + + let storage_info = AllPalletsWithSystem::storage_info(); + (list, storage_info) + } + + fn dispatch_benchmark( + config: frame_benchmarking::BenchmarkConfig + ) -> Result, sp_runtime::RuntimeString> { + use frame_benchmarking::{Benchmarking, BenchmarkBatch, BenchmarkError}; + use sp_storage::TrackedStorageKey; + + use frame_system_benchmarking::Pallet as SystemBench; + impl frame_system_benchmarking::Config for Runtime { + fn setup_set_code_requirements(code: &sp_std::vec::Vec) -> Result<(), BenchmarkError> { + ParachainSystem::initialize_for_set_code_benchmark(code.len() as u32); + Ok(()) + } + + fn verify_set_code() { + System::assert_last_event(cumulus_pallet_parachain_system::Event::::ValidationFunctionStored.into()); + } + } + + use cumulus_pallet_session_benchmarking::Pallet as SessionBench; + impl cumulus_pallet_session_benchmarking::Config for Runtime {} + + use xcm::latest::prelude::*; + use xcm_config::{KsmLocation, MaxAssetsIntoHolding}; + use pallet_xcm_benchmarks::asset_instance_from; + + parameter_types! { + pub ExistentialDepositMultiAsset: Option = Some(( + KsmLocation::get(), + ExistentialDeposit::get() + ).into()); + } + + impl pallet_xcm_benchmarks::Config for Runtime { + type XcmConfig = xcm_config::XcmConfig; + type AccountIdConverter = xcm_config::LocationToAccountId; + type DeliveryHelper = cumulus_primitives_utility::ToParentDeliveryHelper< + XcmConfig, + ExistentialDepositMultiAsset, + xcm_config::PriceForParentDelivery, + >; + fn valid_destination() -> Result { + Ok(KsmLocation::get()) + } + fn worst_case_holding(depositable_count: u32) -> MultiAssets { + // A mix of fungible, non-fungible, and concrete assets. + let holding_non_fungibles = MaxAssetsIntoHolding::get() / 2 - depositable_count; + let holding_fungibles = holding_non_fungibles.saturating_sub(1); + let fungibles_amount: u128 = 100; + let mut assets = (0..holding_fungibles) + .map(|i| { + MultiAsset { + id: Concrete(GeneralIndex(i as u128).into()), + fun: Fungible(fungibles_amount * i as u128), + } + }) + .chain(core::iter::once(MultiAsset { id: Concrete(Here.into()), fun: Fungible(u128::MAX) })) + .chain((0..holding_non_fungibles).map(|i| MultiAsset { + id: Concrete(GeneralIndex(i as u128).into()), + fun: NonFungible(asset_instance_from(i)), + })) + .collect::>(); + + assets.push(MultiAsset { + id: Concrete(KsmLocation::get()), + fun: Fungible(1_000_000 * UNITS), + }); + assets.into() + } + } + + parameter_types! { + pub const TrustedTeleporter: Option<(MultiLocation, MultiAsset)> = Some(( + KsmLocation::get(), + MultiAsset { fun: Fungible(UNITS), id: Concrete(KsmLocation::get()) }, + )); + pub const CheckedAccount: Option<(AccountId, xcm_builder::MintLocation)> = None; + pub const TrustedReserve: Option<(MultiLocation, MultiAsset)> = None; + } + + impl pallet_xcm_benchmarks::fungible::Config for Runtime { + type TransactAsset = Balances; + + type CheckedAccount = CheckedAccount; + type TrustedTeleporter = TrustedTeleporter; + type TrustedReserve = TrustedReserve; + + fn get_multi_asset() -> MultiAsset { + MultiAsset { + id: Concrete(KsmLocation::get()), + fun: Fungible(UNITS), + } + } + } + + impl pallet_xcm_benchmarks::generic::Config for Runtime { + type TransactAsset = Balances; + type RuntimeCall = RuntimeCall; + + fn worst_case_response() -> (u64, Response) { + (0u64, Response::Version(Default::default())) + } + + fn worst_case_asset_exchange() -> Result<(MultiAssets, MultiAssets), BenchmarkError> { + Err(BenchmarkError::Skip) + } + + fn universal_alias() -> Result<(MultiLocation, Junction), BenchmarkError> { + Err(BenchmarkError::Skip) + } + + fn transact_origin_and_runtime_call() -> Result<(MultiLocation, RuntimeCall), BenchmarkError> { + Ok((KsmLocation::get(), frame_system::Call::remark_with_event { remark: vec![] }.into())) + } + + fn subscribe_origin() -> Result { + Ok(KsmLocation::get()) + } + + fn claimable_asset() -> Result<(MultiLocation, MultiLocation, MultiAssets), BenchmarkError> { + let origin = KsmLocation::get(); + let assets: MultiAssets = (Concrete(KsmLocation::get()), 1_000 * UNITS).into(); + let ticket = MultiLocation { parents: 0, interior: Here }; + Ok((origin, ticket, assets)) + } + + fn unlockable_asset() -> Result<(MultiLocation, MultiLocation, MultiAsset), BenchmarkError> { + Err(BenchmarkError::Skip) + } + + fn export_message_origin_and_destination( + ) -> Result<(MultiLocation, NetworkId, InteriorMultiLocation), BenchmarkError> { + Err(BenchmarkError::Skip) + } + + fn alias_origin() -> Result<(MultiLocation, MultiLocation), BenchmarkError> { + Err(BenchmarkError::Skip) + } + } + + type XcmBalances = pallet_xcm_benchmarks::fungible::Pallet::; + type XcmGeneric = pallet_xcm_benchmarks::generic::Pallet::; + + type Local = pallet_assets::Pallet::; + type Foreign = pallet_assets::Pallet::; + type Pool = pallet_assets::Pallet::; + + let whitelist: Vec = vec![ + // Block Number + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac").to_vec().into(), + // Total Issuance + hex_literal::hex!("c2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80").to_vec().into(), + // Execution Phase + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7ff553b5a9862a516939d82b3d3d8661a").to_vec().into(), + // Event Count + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef70a98fdbe9ce6c55837576c60c7af3850").to_vec().into(), + // System Events + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7").to_vec().into(), + //TODO: use from relay_well_known_keys::ACTIVE_CONFIG + hex_literal::hex!("06de3d8a54d27e44a9d5ce189618f22db4b49d95320d9021994c850f25b8e385").to_vec().into(), + ]; + + let mut batches = Vec::::new(); + let params = (&config, &whitelist); + add_benchmarks!(params, batches); + + Ok(batches) + } + } + + impl sp_genesis_builder::GenesisBuilder for Runtime { + fn create_default_config() -> Vec { + create_default_config::() + } + + fn build_config(config: Vec) -> sp_genesis_builder::Result { + build_config::(config) + } + } +} + +cumulus_pallet_parachain_system::register_validate_block! { + Runtime = Runtime, + BlockExecutor = cumulus_pallet_aura_ext::BlockExecutor::, +} + +#[cfg(feature = "state-trie-version-1")] +parameter_types! { + // The deposit configuration for the singed migration. Specially if you want to allow any signed account to do the migration (see `SignedFilter`, these deposits should be high) + pub const MigrationSignedDepositPerItem: Balance = CENTS; + pub const MigrationSignedDepositBase: Balance = 2_000 * CENTS; + pub const MigrationMaxKeyLen: u32 = 512; +} + +#[cfg(feature = "state-trie-version-1")] +impl pallet_state_trie_migration::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Currency = Balances; + type SignedDepositPerItem = MigrationSignedDepositPerItem; + type SignedDepositBase = MigrationSignedDepositBase; + // An origin that can control the whole pallet: should be Root, or a part of your council. + type ControlOrigin = frame_system::EnsureSignedBy; + // specific account for the migration, can trigger the signed migrations. + type SignedFilter = frame_system::EnsureSignedBy; + + // Replace this with weight based on your runtime. + type WeightInfo = pallet_state_trie_migration::weights::SubstrateWeight; + + type MaxKeyLen = MigrationMaxKeyLen; +} + +#[cfg(feature = "state-trie-version-1")] +frame_support::ord_parameter_types! { + pub const MigController: AccountId = AccountId::from(hex_literal::hex!("8458ed39dc4b6f6c7255f7bc42be50c2967db126357c999d44e12ca7ac80dc52")); + pub const RootMigController: AccountId = AccountId::from(hex_literal::hex!("8458ed39dc4b6f6c7255f7bc42be50c2967db126357c999d44e12ca7ac80dc52")); +} + +#[cfg(feature = "state-trie-version-1")] +#[test] +fn ensure_key_ss58() { + use frame_support::traits::SortedMembers; + use sp_core::crypto::Ss58Codec; + let acc = + AccountId::from_ss58check("5F4EbSkZz18X36xhbsjvDNs6NuZ82HyYtq5UiJ1h9SBHJXZD").unwrap(); + //panic!("{:x?}", acc); + assert_eq!(acc, MigController::sorted_members()[0]); + let acc = + AccountId::from_ss58check("5F4EbSkZz18X36xhbsjvDNs6NuZ82HyYtq5UiJ1h9SBHJXZD").unwrap(); + assert_eq!(acc, RootMigController::sorted_members()[0]); + //panic!("{:x?}", acc); +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{CENTS, MILLICENTS}; + use parachains_common::kusama::fee; + use sp_runtime::traits::Zero; + use sp_weights::WeightToFee; + + /// We can fit at least 1000 transfers in a block. + #[test] + fn sane_block_weight() { + use pallet_balances::WeightInfo; + let block = RuntimeBlockWeights::get().max_block; + let base = RuntimeBlockWeights::get().get(DispatchClass::Normal).base_extrinsic; + let transfer = + base + weights::pallet_balances::WeightInfo::::transfer_allow_death(); + + let fit = block.checked_div_per_component(&transfer).unwrap_or_default(); + assert!(fit >= 1000, "{} should be at least 1000", fit); + } + + /// The fee for one transfer is at most 1 CENT. + #[test] + fn sane_transfer_fee() { + use pallet_balances::WeightInfo; + let base = RuntimeBlockWeights::get().get(DispatchClass::Normal).base_extrinsic; + let transfer = + base + weights::pallet_balances::WeightInfo::::transfer_allow_death(); + + let fee: Balance = fee::WeightToFee::weight_to_fee(&transfer); + assert!(fee <= CENTS, "{} MILLICENTS should be at most 1000", fee / MILLICENTS); + } + + /// Weight is being charged for both dimensions. + #[test] + fn weight_charged_for_both_components() { + let fee: Balance = fee::WeightToFee::weight_to_fee(&Weight::from_parts(10_000, 0)); + assert!(!fee.is_zero(), "Charges for ref time"); + + let fee: Balance = fee::WeightToFee::weight_to_fee(&Weight::from_parts(0, 10_000)); + assert_eq!(fee, CENTS, "10kb maps to CENT"); + } + + /// Filling up a block by proof size is at most 30 times more expensive than ref time. + /// + /// This is just a sanity check. + #[test] + fn full_block_fee_ratio() { + let block = RuntimeBlockWeights::get().max_block; + let time_fee: Balance = + fee::WeightToFee::weight_to_fee(&Weight::from_parts(block.ref_time(), 0)); + let proof_fee: Balance = + fee::WeightToFee::weight_to_fee(&Weight::from_parts(0, block.proof_size())); + + let proof_o_time = proof_fee.checked_div(time_fee).unwrap_or_default(); + assert!(proof_o_time <= 30, "{} should be at most 30", proof_o_time); + let time_o_proof = time_fee.checked_div(proof_fee).unwrap_or_default(); + assert!(time_o_proof <= 30, "{} should be at most 30", time_o_proof); + } +} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs b/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs new file mode 100644 index 00000000000..13da81fe591 --- /dev/null +++ b/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs @@ -0,0 +1,640 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use super::{ + AccountId, AllPalletsWithSystem, Assets, Authorship, Balance, Balances, ParachainInfo, + ParachainSystem, PolkadotXcm, PoolAssets, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, + TransactionByteFee, TrustBackedAssetsInstance, WeightToFee, XcmpQueue, +}; +use crate::{ForeignAssets, CENTS}; +use assets_common::{ + local_and_foreign_assets::MatchesLocalAndForeignAssetsMultiLocation, + matching::{FromSiblingParachain, IsForeignConcreteAsset}, +}; +use frame_support::{ + match_types, parameter_types, + traits::{ConstU32, Contains, Everything, Nothing, PalletInfoAccess}, +}; +use frame_system::EnsureRoot; +use pallet_xcm::XcmPassthrough; +use parachains_common::{ + impls::ToStakingPot, + xcm_config::{AssetFeeAsExistentialDepositMultiplier, ConcreteAssetFromSystem}, +}; +use polkadot_parachain_primitives::primitives::Sibling; +use polkadot_runtime_common::xcm_sender::ExponentialPrice; +use sp_runtime::traits::ConvertInto; +use xcm::latest::prelude::*; +use xcm_builder::{ + AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, + AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, + DenyReserveTransferToRelayChain, DenyThenTry, DescribeAllTerminal, DescribeFamily, + EnsureXcmOrigin, FungiblesAdapter, HashedDescription, IsConcrete, LocalMint, NoChecking, + ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, + SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, + SovereignSignedViaLocation, StartsWith, StartsWithExplicitGlobalConsensus, TakeWeightCredit, + TrailingSetTopicAsId, UsingComponents, WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, +}; +use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; + +#[cfg(feature = "runtime-benchmarks")] +use {cumulus_primitives_core::ParaId, sp_core::Get}; + +parameter_types! { + pub const KsmLocation: MultiLocation = MultiLocation::parent(); + pub const RelayNetwork: Option = Some(NetworkId::Kusama); + pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); + pub UniversalLocation: InteriorMultiLocation = + X2(GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(ParachainInfo::parachain_id().into())); + pub UniversalLocationNetworkId: NetworkId = UniversalLocation::get().global_consensus().unwrap(); + pub TrustBackedAssetsPalletLocation: MultiLocation = + PalletInstance(::index() as u8).into(); + pub ForeignAssetsPalletLocation: MultiLocation = + PalletInstance(::index() as u8).into(); + pub PoolAssetsPalletLocation: MultiLocation = + PalletInstance(::index() as u8).into(); + pub CheckingAccount: AccountId = PolkadotXcm::check_account(); + pub const GovernanceLocation: MultiLocation = MultiLocation::parent(); + pub const FellowshipLocation: MultiLocation = MultiLocation::parent(); +} + +/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used +/// when determining ownership of accounts for asset transacting and when attempting to use XCM +/// `Transact` in order to determine the dispatch Origin. +pub type LocationToAccountId = ( + // The parent (Relay-chain) origin converts to the parent `AccountId`. + ParentIsPreset, + // Sibling parachain origins convert to AccountId via the `ParaId::into`. + SiblingParachainConvertsVia, + // Straight up local `AccountId32` origins just alias directly to `AccountId`. + AccountId32Aliases, + // Foreign locations alias into accounts according to a hash of their standard description. + HashedDescription>, +); + +/// Means for transacting the native currency on this chain. +pub type CurrencyTransactor = CurrencyAdapter< + // Use this currency: + Balances, + // Use this currency when it is a fungible asset matching the given location or name: + IsConcrete, + // Convert an XCM MultiLocation into a local account id: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // We don't track any teleports of `Balances`. + (), +>; + +/// `AssetId`/`Balance` converter for `PoolAssets`. +pub type TrustBackedAssetsConvertedConcreteId = + assets_common::TrustBackedAssetsConvertedConcreteId; + +/// Means for transacting assets besides the native currency on this chain. +pub type FungiblesTransactor = FungiblesAdapter< + // Use this fungibles implementation: + Assets, + // Use this currency when it is a fungible asset matching the given location or name: + TrustBackedAssetsConvertedConcreteId, + // Convert an XCM MultiLocation into a local account id: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // We only want to allow teleports of known assets. We use non-zero issuance as an indication + // that this asset is known. + LocalMint>, + // The account to use for tracking teleports. + CheckingAccount, +>; + +/// `AssetId/Balance` converter for `TrustBackedAssets` +pub type ForeignAssetsConvertedConcreteId = assets_common::ForeignAssetsConvertedConcreteId< + ( + // Ignore `TrustBackedAssets` explicitly + StartsWith, + // Ignore assets that start explicitly with our `GlobalConsensus(NetworkId)`, means: + // - foreign assets from our consensus should be: `MultiLocation {parents: 1, + // X*(Parachain(xyz), ..)}` + // - foreign assets outside our consensus with the same `GlobalConsensus(NetworkId)` won't + // be accepted here + StartsWithExplicitGlobalConsensus, + ), + Balance, +>; + +/// Means for transacting foreign assets from different global consensus. +pub type ForeignFungiblesTransactor = FungiblesAdapter< + // Use this fungibles implementation: + ForeignAssets, + // Use this currency when it is a fungible asset matching the given location or name: + ForeignAssetsConvertedConcreteId, + // Convert an XCM MultiLocation into a local account id: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // We dont need to check teleports here. + NoChecking, + // The account to use for tracking teleports. + CheckingAccount, +>; + +/// `AssetId`/`Balance` converter for `PoolAssets`. +pub type PoolAssetsConvertedConcreteId = + assets_common::PoolAssetsConvertedConcreteId; + +/// Means for transacting asset conversion pool assets on this chain. +pub type PoolFungiblesTransactor = FungiblesAdapter< + // Use this fungibles implementation: + PoolAssets, + // Use this currency when it is a fungible asset matching the given location or name: + PoolAssetsConvertedConcreteId, + // Convert an XCM MultiLocation into a local account id: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // We only want to allow teleports of known assets. We use non-zero issuance as an indication + // that this asset is known. + LocalMint>, + // The account to use for tracking teleports. + CheckingAccount, +>; + +/// Means for transacting assets on this chain. +pub type AssetTransactors = + (CurrencyTransactor, FungiblesTransactor, ForeignFungiblesTransactor, PoolFungiblesTransactor); + +/// Simple `MultiLocation` matcher for Local and Foreign asset `MultiLocation`. +pub struct LocalAndForeignAssetsMultiLocationMatcher; +impl MatchesLocalAndForeignAssetsMultiLocation for LocalAndForeignAssetsMultiLocationMatcher { + fn is_local(location: &MultiLocation) -> bool { + use assets_common::fungible_conversion::MatchesMultiLocation; + TrustBackedAssetsConvertedConcreteId::contains(location) + } + fn is_foreign(location: &MultiLocation) -> bool { + use assets_common::fungible_conversion::MatchesMultiLocation; + ForeignAssetsConvertedConcreteId::contains(location) + } +} +impl Contains for LocalAndForeignAssetsMultiLocationMatcher { + fn contains(location: &MultiLocation) -> bool { + Self::is_local(location) || Self::is_foreign(location) + } +} + +/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, +/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can +/// biases the kind of local `Origin` it will become. +pub type XcmOriginToTransactDispatchOrigin = ( + // Sovereign account converter; this attempts to derive an `AccountId` from the origin location + // using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for + // foreign chains who want to have a local sovereign account on this chain which they control. + SovereignSignedViaLocation, + // Native converter for Relay-chain (Parent) location; will convert to a `Relay` origin when + // recognised. + RelayChainAsNative, + // Native converter for sibling Parachains; will convert to a `SiblingPara` origin when + // recognised. + SiblingParachainAsNative, + // Superuser converter for the Relay-chain (Parent) location. This will allow it to issue a + // transaction from the Root origin. + ParentAsSuperuser, + // Native signed account converter; this just converts an `AccountId32` origin into a normal + // `RuntimeOrigin::Signed` origin of the same 32-byte value. + SignedAccountId32AsNative, + // Xcm origins can be represented natively under the Xcm pallet's Xcm origin. + XcmPassthrough, +); + +parameter_types! { + pub const MaxInstructions: u32 = 100; + pub const MaxAssetsIntoHolding: u32 = 64; + pub XcmAssetFeesReceiver: Option = Authorship::author(); +} + +match_types! { + pub type ParentOrParentsPlurality: impl Contains = { + MultiLocation { parents: 1, interior: Here } | + MultiLocation { parents: 1, interior: X1(Plurality { .. }) } + }; + pub type ParentOrSiblings: impl Contains = { + MultiLocation { parents: 1, interior: Here } | + MultiLocation { parents: 1, interior: X1(_) } + }; +} + +/// A call filter for the XCM Transact instruction. This is a temporary measure until we properly +/// account for proof size weights. +/// +/// Calls that are allowed through this filter must: +/// 1. Have a fixed weight; +/// 2. Cannot lead to another call being made; +/// 3. Have a defined proof size weight, e.g. no unbounded vecs in call parameters. +pub struct SafeCallFilter; +impl Contains for SafeCallFilter { + fn contains(call: &RuntimeCall) -> bool { + #[cfg(feature = "runtime-benchmarks")] + { + if matches!(call, RuntimeCall::System(frame_system::Call::remark_with_event { .. })) { + return true + } + } + + matches!( + call, + RuntimeCall::PolkadotXcm(pallet_xcm::Call::force_xcm_version { .. }) | + RuntimeCall::System( + frame_system::Call::set_heap_pages { .. } | + frame_system::Call::set_code { .. } | + frame_system::Call::set_code_without_checks { .. } | + frame_system::Call::kill_prefix { .. }, + ) | RuntimeCall::ParachainSystem(..) | + RuntimeCall::Timestamp(..) | + RuntimeCall::Balances(..) | + RuntimeCall::CollatorSelection( + pallet_collator_selection::Call::set_desired_candidates { .. } | + pallet_collator_selection::Call::set_candidacy_bond { .. } | + pallet_collator_selection::Call::register_as_candidate { .. } | + pallet_collator_selection::Call::leave_intent { .. } | + pallet_collator_selection::Call::set_invulnerables { .. } | + pallet_collator_selection::Call::add_invulnerable { .. } | + pallet_collator_selection::Call::remove_invulnerable { .. }, + ) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | + RuntimeCall::XcmpQueue(..) | + RuntimeCall::DmpQueue(..) | + RuntimeCall::Assets( + pallet_assets::Call::create { .. } | + pallet_assets::Call::force_create { .. } | + pallet_assets::Call::start_destroy { .. } | + pallet_assets::Call::destroy_accounts { .. } | + pallet_assets::Call::destroy_approvals { .. } | + pallet_assets::Call::finish_destroy { .. } | + pallet_assets::Call::block { .. } | + pallet_assets::Call::mint { .. } | + pallet_assets::Call::burn { .. } | + pallet_assets::Call::transfer { .. } | + pallet_assets::Call::transfer_keep_alive { .. } | + pallet_assets::Call::force_transfer { .. } | + pallet_assets::Call::freeze { .. } | + pallet_assets::Call::thaw { .. } | + pallet_assets::Call::freeze_asset { .. } | + pallet_assets::Call::thaw_asset { .. } | + pallet_assets::Call::transfer_ownership { .. } | + pallet_assets::Call::set_team { .. } | + pallet_assets::Call::set_metadata { .. } | + pallet_assets::Call::clear_metadata { .. } | + pallet_assets::Call::force_set_metadata { .. } | + pallet_assets::Call::force_clear_metadata { .. } | + pallet_assets::Call::force_asset_status { .. } | + pallet_assets::Call::approve_transfer { .. } | + pallet_assets::Call::cancel_approval { .. } | + pallet_assets::Call::force_cancel_approval { .. } | + pallet_assets::Call::transfer_approved { .. } | + pallet_assets::Call::touch { .. } | + pallet_assets::Call::touch_other { .. } | + pallet_assets::Call::refund { .. } | + pallet_assets::Call::refund_other { .. }, + ) | RuntimeCall::ForeignAssets( + pallet_assets::Call::create { .. } | + pallet_assets::Call::force_create { .. } | + pallet_assets::Call::start_destroy { .. } | + pallet_assets::Call::destroy_accounts { .. } | + pallet_assets::Call::destroy_approvals { .. } | + pallet_assets::Call::finish_destroy { .. } | + pallet_assets::Call::block { .. } | + pallet_assets::Call::mint { .. } | + pallet_assets::Call::burn { .. } | + pallet_assets::Call::transfer { .. } | + pallet_assets::Call::transfer_keep_alive { .. } | + pallet_assets::Call::force_transfer { .. } | + pallet_assets::Call::freeze { .. } | + pallet_assets::Call::thaw { .. } | + pallet_assets::Call::freeze_asset { .. } | + pallet_assets::Call::thaw_asset { .. } | + pallet_assets::Call::transfer_ownership { .. } | + pallet_assets::Call::set_team { .. } | + pallet_assets::Call::set_metadata { .. } | + pallet_assets::Call::clear_metadata { .. } | + pallet_assets::Call::force_set_metadata { .. } | + pallet_assets::Call::force_clear_metadata { .. } | + pallet_assets::Call::force_asset_status { .. } | + pallet_assets::Call::approve_transfer { .. } | + pallet_assets::Call::cancel_approval { .. } | + pallet_assets::Call::force_cancel_approval { .. } | + pallet_assets::Call::transfer_approved { .. } | + pallet_assets::Call::touch { .. } | + pallet_assets::Call::touch_other { .. } | + pallet_assets::Call::refund { .. } | + pallet_assets::Call::refund_other { .. }, + ) | RuntimeCall::PoolAssets( + pallet_assets::Call::force_create { .. } | + pallet_assets::Call::block { .. } | + pallet_assets::Call::burn { .. } | + pallet_assets::Call::transfer { .. } | + pallet_assets::Call::transfer_keep_alive { .. } | + pallet_assets::Call::force_transfer { .. } | + pallet_assets::Call::freeze { .. } | + pallet_assets::Call::thaw { .. } | + pallet_assets::Call::freeze_asset { .. } | + pallet_assets::Call::thaw_asset { .. } | + pallet_assets::Call::transfer_ownership { .. } | + pallet_assets::Call::set_team { .. } | + pallet_assets::Call::set_metadata { .. } | + pallet_assets::Call::clear_metadata { .. } | + pallet_assets::Call::force_set_metadata { .. } | + pallet_assets::Call::force_clear_metadata { .. } | + pallet_assets::Call::force_asset_status { .. } | + pallet_assets::Call::approve_transfer { .. } | + pallet_assets::Call::cancel_approval { .. } | + pallet_assets::Call::force_cancel_approval { .. } | + pallet_assets::Call::transfer_approved { .. } | + pallet_assets::Call::touch { .. } | + pallet_assets::Call::touch_other { .. } | + pallet_assets::Call::refund { .. } | + pallet_assets::Call::refund_other { .. }, + ) | RuntimeCall::AssetConversion( + pallet_asset_conversion::Call::create_pool { .. } | + pallet_asset_conversion::Call::add_liquidity { .. } | + pallet_asset_conversion::Call::remove_liquidity { .. } | + pallet_asset_conversion::Call::swap_tokens_for_exact_tokens { .. } | + pallet_asset_conversion::Call::swap_exact_tokens_for_tokens { .. }, + ) | RuntimeCall::NftFractionalization( + pallet_nft_fractionalization::Call::fractionalize { .. } | + pallet_nft_fractionalization::Call::unify { .. }, + ) | RuntimeCall::Nfts( + pallet_nfts::Call::create { .. } | + pallet_nfts::Call::force_create { .. } | + pallet_nfts::Call::destroy { .. } | + pallet_nfts::Call::mint { .. } | + pallet_nfts::Call::force_mint { .. } | + pallet_nfts::Call::burn { .. } | + pallet_nfts::Call::transfer { .. } | + pallet_nfts::Call::lock_item_transfer { .. } | + pallet_nfts::Call::unlock_item_transfer { .. } | + pallet_nfts::Call::lock_collection { .. } | + pallet_nfts::Call::transfer_ownership { .. } | + pallet_nfts::Call::set_team { .. } | + pallet_nfts::Call::force_collection_owner { .. } | + pallet_nfts::Call::force_collection_config { .. } | + pallet_nfts::Call::approve_transfer { .. } | + pallet_nfts::Call::cancel_approval { .. } | + pallet_nfts::Call::clear_all_transfer_approvals { .. } | + pallet_nfts::Call::lock_item_properties { .. } | + pallet_nfts::Call::set_attribute { .. } | + pallet_nfts::Call::force_set_attribute { .. } | + pallet_nfts::Call::clear_attribute { .. } | + pallet_nfts::Call::approve_item_attributes { .. } | + pallet_nfts::Call::cancel_item_attributes_approval { .. } | + pallet_nfts::Call::set_metadata { .. } | + pallet_nfts::Call::clear_metadata { .. } | + pallet_nfts::Call::set_collection_metadata { .. } | + pallet_nfts::Call::clear_collection_metadata { .. } | + pallet_nfts::Call::set_accept_ownership { .. } | + pallet_nfts::Call::set_collection_max_supply { .. } | + pallet_nfts::Call::update_mint_settings { .. } | + pallet_nfts::Call::set_price { .. } | + pallet_nfts::Call::buy_item { .. } | + pallet_nfts::Call::pay_tips { .. } | + pallet_nfts::Call::create_swap { .. } | + pallet_nfts::Call::cancel_swap { .. } | + pallet_nfts::Call::claim_swap { .. }, + ) | RuntimeCall::Uniques( + pallet_uniques::Call::create { .. } | + pallet_uniques::Call::force_create { .. } | + pallet_uniques::Call::destroy { .. } | + pallet_uniques::Call::mint { .. } | + pallet_uniques::Call::burn { .. } | + pallet_uniques::Call::transfer { .. } | + pallet_uniques::Call::freeze { .. } | + pallet_uniques::Call::thaw { .. } | + pallet_uniques::Call::freeze_collection { .. } | + pallet_uniques::Call::thaw_collection { .. } | + pallet_uniques::Call::transfer_ownership { .. } | + pallet_uniques::Call::set_team { .. } | + pallet_uniques::Call::approve_transfer { .. } | + pallet_uniques::Call::cancel_approval { .. } | + pallet_uniques::Call::force_item_status { .. } | + pallet_uniques::Call::set_attribute { .. } | + pallet_uniques::Call::clear_attribute { .. } | + pallet_uniques::Call::set_metadata { .. } | + pallet_uniques::Call::clear_metadata { .. } | + pallet_uniques::Call::set_collection_metadata { .. } | + pallet_uniques::Call::clear_collection_metadata { .. } | + pallet_uniques::Call::set_accept_ownership { .. } | + pallet_uniques::Call::set_collection_max_supply { .. } | + pallet_uniques::Call::set_price { .. } | + pallet_uniques::Call::buy_item { .. } + ) + ) + } +} + +pub type Barrier = TrailingSetTopicAsId< + DenyThenTry< + DenyReserveTransferToRelayChain, + ( + TakeWeightCredit, + // Expected responses are OK. + AllowKnownQueryResponses, + // Allow XCMs with some computed origins to pass through. + WithComputedOrigin< + ( + // If the message is one that immediately attempts to pay for execution, then + // allow it. + AllowTopLevelPaidExecutionFrom, + // Parent and its pluralities (i.e. governance bodies) get free execution. + AllowExplicitUnpaidExecutionFrom, + // Subscriptions for version tracking are OK. + AllowSubscriptionsFrom, + ), + UniversalLocation, + ConstU32<8>, + >, + ), + >, +>; + +pub type AssetFeeAsExistentialDepositMultiplierFeeCharger = AssetFeeAsExistentialDepositMultiplier< + Runtime, + WeightToFee, + pallet_assets::BalanceToAssetBalance, + TrustBackedAssetsInstance, +>; + +/// Cases where a remote origin is accepted as trusted Teleporter for a given asset: +/// +/// - KSM with the parent Relay Chain and sibling system parachains; and +/// - Sibling parachains' assets from where they originate (as `ForeignCreators`). +pub type TrustedTeleporters = ( + ConcreteAssetFromSystem, + IsForeignConcreteAsset>>, +); + +pub struct XcmConfig; +impl xcm_executor::Config for XcmConfig { + type RuntimeCall = RuntimeCall; + type XcmSender = XcmRouter; + type AssetTransactor = AssetTransactors; + type OriginConverter = XcmOriginToTransactDispatchOrigin; + // Asset Hub Kusama does not recognize a reserve location for any asset. This does not prevent + // Asset Hub acting _as_ a reserve location for KSM and assets created under `pallet-assets`. + // For KSM, users must use teleport where allowed (e.g. with the Relay Chain). + type IsReserve = (); + type IsTeleporter = TrustedTeleporters; + type UniversalLocation = UniversalLocation; + type Barrier = Barrier; + type Weigher = WeightInfoBounds< + crate::weights::xcm::AssetHubKusamaXcmWeight, + RuntimeCall, + MaxInstructions, + >; + type Trader = ( + UsingComponents>, + cumulus_primitives_utility::TakeFirstAssetTrader< + AccountId, + AssetFeeAsExistentialDepositMultiplierFeeCharger, + TrustBackedAssetsConvertedConcreteId, + Assets, + cumulus_primitives_utility::XcmFeesTo32ByteAccount< + FungiblesTransactor, + AccountId, + XcmAssetFeesReceiver, + >, + >, + ); + type ResponseHandler = PolkadotXcm; + type AssetTrap = PolkadotXcm; + type AssetClaims = PolkadotXcm; + type SubscriptionService = PolkadotXcm; + type PalletInstancesInfo = AllPalletsWithSystem; + type MaxAssetsIntoHolding = MaxAssetsIntoHolding; + type AssetLocker = (); + type AssetExchanger = (); + type FeeManager = (); + type MessageExporter = (); + type UniversalAliases = Nothing; + type CallDispatcher = WithOriginFilter; + type SafeCallFilter = SafeCallFilter; + type Aliasers = Nothing; +} + +/// Converts a local signed origin into an XCM multilocation. +/// Forms the basis for local origins sending/executing XCMs. +pub type LocalOriginToLocation = SignedToAccountId32; + +parameter_types! { + /// The asset ID for the asset that we use to pay for message delivery fees. + pub FeeAssetId: AssetId = Concrete(KsmLocation::get()); + /// The base fee for the message delivery fees. + pub const BaseDeliveryFee: u128 = CENTS.saturating_mul(3); +} + +pub type PriceForParentDelivery = + ExponentialPrice; + +/// The means for routing XCM messages which are not for local execution into the right message +/// queues. +pub type XcmRouter = WithUniqueTopic<( + // Two routers - use UMP to communicate with the relay chain: + cumulus_primitives_utility::ParentAsUmp, + // ..and XCMP to communicate with the sibling chains. + XcmpQueue, +)>; + +#[cfg(feature = "runtime-benchmarks")] +parameter_types! { + pub ReachableDest: Option = Some(Parent.into()); +} + +impl pallet_xcm::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + // We want to disallow users sending (arbitrary) XCMs from this chain. + type SendXcmOrigin = EnsureXcmOrigin; + type XcmRouter = XcmRouter; + // We support local origins dispatching XCM executions in principle... + type ExecuteXcmOrigin = EnsureXcmOrigin; + // ... but disallow generic XCM execution. As a result only teleports and reserve transfers are + // allowed. + type XcmExecuteFilter = Nothing; + type XcmExecutor = XcmExecutor; + type XcmTeleportFilter = Everything; + type XcmReserveTransferFilter = Everything; + type Weigher = WeightInfoBounds< + crate::weights::xcm::AssetHubKusamaXcmWeight, + RuntimeCall, + MaxInstructions, + >; + type UniversalLocation = UniversalLocation; + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100; + type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion; + type Currency = Balances; + type CurrencyMatcher = (); + type TrustedLockers = (); + type SovereignAccountOf = LocationToAccountId; + type MaxLockers = ConstU32<8>; + type WeightInfo = crate::weights::pallet_xcm::WeightInfo; + #[cfg(feature = "runtime-benchmarks")] + type ReachableDest = ReachableDest; + type AdminOrigin = EnsureRoot; + type MaxRemoteLockConsumers = ConstU32<0>; + type RemoteLockConsumerIdentifier = (); +} + +impl cumulus_pallet_xcm::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type XcmExecutor = XcmExecutor; +} + +pub type ForeignCreatorsSovereignAccountOf = ( + SiblingParachainConvertsVia, + AccountId32Aliases, + ParentIsPreset, +); + +/// Simple conversion of `u32` into an `AssetId` for use in benchmarking. +pub struct XcmBenchmarkHelper; +#[cfg(feature = "runtime-benchmarks")] +impl pallet_assets::BenchmarkHelper for XcmBenchmarkHelper { + fn create_asset_id_parameter(id: u32) -> MultiLocation { + MultiLocation { parents: 1, interior: X1(Parachain(id)) } + } +} + +#[cfg(feature = "runtime-benchmarks")] +pub struct BenchmarkMultiLocationConverter { + _phantom: sp_std::marker::PhantomData, +} + +#[cfg(feature = "runtime-benchmarks")] +impl pallet_asset_conversion::BenchmarkHelper + for BenchmarkMultiLocationConverter +where + SelfParaId: Get, +{ + fn asset_id(asset_id: u32) -> MultiLocation { + MultiLocation { + parents: 1, + interior: X3( + Parachain(SelfParaId::get().into()), + PalletInstance(::index() as u8), + GeneralIndex(asset_id.into()), + ), + } + } + fn multiasset_id(asset_id: u32) -> MultiLocation { + Self::asset_id(asset_id) + } +} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs index e00327a3ef6..408f489505d 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs @@ -320,7 +320,6 @@ impl pallet_asset_conversion::Config for Runtime { type Balance = Balance; type HigherPrecisionBalance = sp_core::U256; type Currency = Balances; - type AssetBalance = Balance; type AssetId = MultiLocation; type Assets = LocalAndForeignAssets< Assets, @@ -337,7 +336,7 @@ impl pallet_asset_conversion::Config for Runtime { type PalletId = AssetConversionPalletId; type AllowMultiAssetPools = AllowMultiAssetPools; type MaxSwapPathLength = ConstU32<4>; - type MultiAssetId = Box; + type MultiAssetId = MultiLocation; type MultiAssetIdConverter = MultiLocationConverter; type MintMinLiquidity = ConstU128<100>; @@ -1143,17 +1142,18 @@ impl_runtime_apis! { impl pallet_asset_conversion::AssetConversionApi< Block, Balance, - u128, - Box, + MultiLocation, > for Runtime { - fn quote_price_exact_tokens_for_tokens(asset1: Box, asset2: Box, amount: u128, include_fee: bool) -> Option { + fn quote_price_exact_tokens_for_tokens(asset1: MultiLocation, asset2: MultiLocation, amount: Balance, include_fee: bool) -> Option { AssetConversion::quote_price_exact_tokens_for_tokens(asset1, asset2, amount, include_fee) } - fn quote_price_tokens_for_exact_tokens(asset1: Box, asset2: Box, amount: u128, include_fee: bool) -> Option { + + fn quote_price_tokens_for_exact_tokens(asset1: MultiLocation, asset2: MultiLocation, amount: Balance, include_fee: bool) -> Option { AssetConversion::quote_price_tokens_for_exact_tokens(asset1, asset2, amount, include_fee) } - fn get_reserves(asset1: Box, asset2: Box) -> Option<(Balance, Balance)> { + + fn get_reserves(asset1: MultiLocation, asset2: MultiLocation) -> Option<(Balance, Balance)> { AssetConversion::get_reserves(&asset1, &asset2).ok() } } diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs index 003b71093e0..76acced1148 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs @@ -678,8 +678,7 @@ pub struct BenchmarkMultiLocationConverter { } #[cfg(feature = "runtime-benchmarks")] -impl - pallet_asset_conversion::BenchmarkHelper> +impl pallet_asset_conversion::BenchmarkHelper for BenchmarkMultiLocationConverter where SelfParaId: frame_support::traits::Get, @@ -694,8 +693,8 @@ where ), } } - fn multiasset_id(asset_id: u32) -> sp_std::boxed::Box { - sp_std::boxed::Box::new(Self::asset_id(asset_id)) + fn multiasset_id(asset_id: u32) -> MultiLocation { + Self::asset_id(asset_id) } } diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs index ceb02187350..e6a074df9e6 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs @@ -302,7 +302,6 @@ impl pallet_asset_conversion::Config for Runtime { type Balance = Balance; type HigherPrecisionBalance = sp_core::U256; type Currency = Balances; - type AssetBalance = Balance; type AssetId = MultiLocation; type Assets = LocalAndForeignAssets< Assets, @@ -318,7 +317,7 @@ impl pallet_asset_conversion::Config for Runtime { type PalletId = AssetConversionPalletId; type AllowMultiAssetPools = AllowMultiAssetPools; type MaxSwapPathLength = ConstU32<4>; - type MultiAssetId = Box; + type MultiAssetId = MultiLocation; type MultiAssetIdConverter = MultiLocationConverter; type MintMinLiquidity = ConstU128<100>; @@ -1218,19 +1217,18 @@ impl_runtime_apis! { impl pallet_asset_conversion::AssetConversionApi< Block, Balance, - u128, - Box, + MultiLocation, > for Runtime { - fn quote_price_exact_tokens_for_tokens(asset1: Box, asset2: Box, amount: u128, include_fee: bool) -> Option { + fn quote_price_exact_tokens_for_tokens(asset1: MultiLocation, asset2: MultiLocation, amount: Balance, include_fee: bool) -> Option { AssetConversion::quote_price_exact_tokens_for_tokens(asset1, asset2, amount, include_fee) } - fn quote_price_tokens_for_exact_tokens(asset1: Box, asset2: Box, amount: u128, include_fee: bool) -> Option { + fn quote_price_tokens_for_exact_tokens(asset1: MultiLocation, asset2: MultiLocation, amount: Balance, include_fee: bool) -> Option { AssetConversion::quote_price_tokens_for_exact_tokens(asset1, asset2, amount, include_fee) } - fn get_reserves(asset1: Box, asset2: Box) -> Option<(Balance, Balance)> { + fn get_reserves(asset1: MultiLocation, asset2: MultiLocation) -> Option<(Balance, Balance)> { AssetConversion::get_reserves(&asset1, &asset2).ok() } } @@ -1710,10 +1708,7 @@ pub mod migrations { /// `MultiLocation { parents: 1, interior: Here }` pub struct NativeAssetParents0ToParents1Migration(sp_std::marker::PhantomData); impl< - T: pallet_asset_conversion::Config< - MultiAssetId = Box, - AssetId = MultiLocation, - >, + T: pallet_asset_conversion::Config, > OnRuntimeUpgrade for NativeAssetParents0ToParents1Migration where ::PoolAssetId: Into, @@ -1739,15 +1734,15 @@ pub mod migrations { pallet_asset_conversion::Pallet::::get_pool_account(&old_pool_id); reads.saturating_accrue(1); let pool_asset_id = pool_info.lp_token.clone(); - if old_pool_id.0.as_ref() != &invalid_native_asset { + if old_pool_id.0 != invalid_native_asset { // skip, if ok continue } // fix new account let new_pool_id = pallet_asset_conversion::Pallet::::get_pool_id( - Box::new(valid_native_asset), - old_pool_id.1.clone(), + valid_native_asset, + old_pool_id.1, ); let new_pool_account = pallet_asset_conversion::Pallet::::get_pool_account(&new_pool_id); @@ -1786,10 +1781,10 @@ pub mod migrations { // move LocalOrForeignAssets let _ = T::Assets::transfer( - *old_pool_id.1.as_ref(), + old_pool_id.1, &old_pool_account, &new_pool_account, - T::Assets::balance(*old_pool_id.1.as_ref(), &old_pool_account), + T::Assets::balance(old_pool_id.1, &old_pool_account), Preservation::Expendable, ); reads.saturating_accrue(1); diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs index 4bcc2bad5f6..2b5edb02b4a 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs @@ -700,8 +700,7 @@ pub struct BenchmarkMultiLocationConverter { } #[cfg(feature = "runtime-benchmarks")] -impl - pallet_asset_conversion::BenchmarkHelper> +impl pallet_asset_conversion::BenchmarkHelper for BenchmarkMultiLocationConverter where SelfParaId: Get, @@ -717,8 +716,8 @@ where } } - fn multiasset_id(asset_id: u32) -> sp_std::boxed::Box { - sp_std::boxed::Box::new(Self::asset_id(asset_id)) + fn multiasset_id(asset_id: u32) -> MultiLocation { + Self::asset_id(asset_id) } } diff --git a/cumulus/parachains/runtimes/assets/common/src/local_and_foreign_assets.rs b/cumulus/parachains/runtimes/assets/common/src/local_and_foreign_assets.rs index ed588798556..8aedd04e1cd 100644 --- a/cumulus/parachains/runtimes/assets/common/src/local_and_foreign_assets.rs +++ b/cumulus/parachains/runtimes/assets/common/src/local_and_foreign_assets.rs @@ -23,39 +23,38 @@ use frame_support::traits::{ use pallet_asset_conversion::{MultiAssetIdConversionResult, MultiAssetIdConverter}; use parachains_common::AccountId; use sp_runtime::{traits::MaybeEquivalence, DispatchError, DispatchResult}; -use sp_std::{boxed::Box, marker::PhantomData}; +use sp_std::marker::PhantomData; use xcm::latest::MultiLocation; pub struct MultiLocationConverter, MultiLocationMatcher> { _phantom: PhantomData<(NativeAssetLocation, MultiLocationMatcher)>, } -impl - MultiAssetIdConverter, MultiLocation> +impl MultiAssetIdConverter for MultiLocationConverter where NativeAssetLocation: Get, MultiLocationMatcher: Contains, { - fn get_native() -> Box { - Box::new(NativeAssetLocation::get()) + fn get_native() -> MultiLocation { + NativeAssetLocation::get() } - fn is_native(asset_id: &Box) -> bool { + fn is_native(asset_id: &MultiLocation) -> bool { *asset_id == Self::get_native() } fn try_convert( - asset_id: &Box, - ) -> MultiAssetIdConversionResult, MultiLocation> { - if Self::is_native(&asset_id) { + asset_id: &MultiLocation, + ) -> MultiAssetIdConversionResult { + if Self::is_native(asset_id) { return MultiAssetIdConversionResult::Native } - if MultiLocationMatcher::contains(&asset_id) { - MultiAssetIdConversionResult::Converted(*asset_id.clone()) + if MultiLocationMatcher::contains(asset_id) { + MultiAssetIdConversionResult::Converted(*asset_id) } else { - MultiAssetIdConversionResult::Unsupported(asset_id.clone()) + MultiAssetIdConversionResult::Unsupported(*asset_id) } } } @@ -451,27 +450,27 @@ mod tests { interior: X2(GlobalConsensus(ByGenesis([1; 32])), Parachain(2222)), }; - assert!(C::is_native(&Box::new(native_asset))); - assert!(!C::is_native(&Box::new(local_asset))); - assert!(!C::is_native(&Box::new(pool_asset))); - assert!(!C::is_native(&Box::new(foreign_asset1))); - assert!(!C::is_native(&Box::new(foreign_asset2))); + assert!(C::is_native(&native_asset)); + assert!(!C::is_native(&local_asset)); + assert!(!C::is_native(&pool_asset)); + assert!(!C::is_native(&foreign_asset1)); + assert!(!C::is_native(&foreign_asset2)); - assert_eq!(C::try_convert(&Box::new(native_asset)), MultiAssetIdConversionResult::Native); + assert_eq!(C::try_convert(&native_asset), MultiAssetIdConversionResult::Native); assert_eq!( - C::try_convert(&Box::new(local_asset)), + C::try_convert(&local_asset), MultiAssetIdConversionResult::Converted(local_asset) ); assert_eq!( - C::try_convert(&Box::new(pool_asset)), - MultiAssetIdConversionResult::Unsupported(Box::new(pool_asset)) + C::try_convert(&pool_asset), + MultiAssetIdConversionResult::Unsupported(pool_asset) ); assert_eq!( - C::try_convert(&Box::new(foreign_asset1)), + C::try_convert(&foreign_asset1), MultiAssetIdConversionResult::Converted(foreign_asset1) ); assert_eq!( - C::try_convert(&Box::new(foreign_asset2)), + C::try_convert(&foreign_asset2), MultiAssetIdConversionResult::Converted(foreign_asset2) ); } diff --git a/prdoc/pr_1677.prdoc b/prdoc/pr_1677.prdoc new file mode 100644 index 00000000000..9c5bee386ae --- /dev/null +++ b/prdoc/pr_1677.prdoc @@ -0,0 +1,22 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "pallet-asset-conversion: Swap Credit" + +doc: + - audience: Runtime Dev + description: | + Introduces a swap implementation that allows the exchange of a credit (aka Negative Imbalance) of one asset for a credit of another asset. + + This is particularly useful when a credit swap is required but may not have sufficient value to meet the ED constraint, hence cannot be deposited to temp account before. An example use case is when XCM fees are paid using an asset held in the XCM executor registry and has to be swapped for native currency. + + Additional Updates: + - encapsulates the existing `Swap` trait impl within a transactional context, since partial storage mutation is possible when an error occurs; + - supplied `Currency` and `Assets` impls must be implemented over the same `Balance` type, the `AssetBalance` generic type is dropped. This helps to avoid numerous type conversion and overflow cases. If those types are different it should be handled outside of the pallet; + - `Box` asset kind on a pallet level, unbox on a runtime level - here [why](https://substrate.stackexchange.com/questions/10039/boxed-argument-of-a-dispatchable/10103#10103); + - `path` uses `Vec` now, instead of `BoundedVec` since it is never used in PoV; + - removes the `Transfer` event due to it's redundancy with the events emitted by `fungible/s` implementations; + - modifies the `SwapExecuted` event type; + +crates: [ ] + diff --git a/substrate/bin/node/runtime/src/lib.rs b/substrate/bin/node/runtime/src/lib.rs index 1002022d61e..7c763960490 100644 --- a/substrate/bin/node/runtime/src/lib.rs +++ b/substrate/bin/node/runtime/src/lib.rs @@ -1653,7 +1653,6 @@ parameter_types! { impl pallet_asset_conversion::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Currency = Balances; - type AssetBalance = ::Balance; type HigherPrecisionBalance = sp_core::U256; type Assets = Assets; type Balance = u128; @@ -2580,15 +2579,14 @@ impl_runtime_apis! { impl pallet_asset_conversion::AssetConversionApi< Block, Balance, - u128, NativeOrAssetId > for Runtime { - fn quote_price_exact_tokens_for_tokens(asset1: NativeOrAssetId, asset2: NativeOrAssetId, amount: u128, include_fee: bool) -> Option { + fn quote_price_exact_tokens_for_tokens(asset1: NativeOrAssetId, asset2: NativeOrAssetId, amount: Balance, include_fee: bool) -> Option { AssetConversion::quote_price_exact_tokens_for_tokens(asset1, asset2, amount, include_fee) } - fn quote_price_tokens_for_exact_tokens(asset1: NativeOrAssetId, asset2: NativeOrAssetId, amount: u128, include_fee: bool) -> Option { + fn quote_price_tokens_for_exact_tokens(asset1: NativeOrAssetId, asset2: NativeOrAssetId, amount: Balance, include_fee: bool) -> Option { AssetConversion::quote_price_tokens_for_exact_tokens(asset1, asset2, amount, include_fee) } diff --git a/substrate/frame/asset-conversion/src/benchmarking.rs b/substrate/frame/asset-conversion/src/benchmarking.rs index 87b541cd474..628953d0558 100644 --- a/substrate/frame/asset-conversion/src/benchmarking.rs +++ b/substrate/frame/asset-conversion/src/benchmarking.rs @@ -21,7 +21,6 @@ use super::*; use frame_benchmarking::{benchmarks, whitelisted_caller}; use frame_support::{ assert_ok, - storage::bounded_vec::BoundedVec, traits::{ fungible::{Inspect as InspectFungible, Mutate as MutateFungible, Unbalanced}, fungibles::{Create, Inspect, Mutate}, @@ -49,7 +48,7 @@ where fn create_asset(asset: &T::MultiAssetId) -> (T::AccountId, AccountIdLookupOf) where - T::AssetBalance: From, + T::Balance: From, T::Currency: Unbalanced, T::Assets: Create + Mutate, { @@ -70,7 +69,7 @@ fn create_asset_and_pool( asset2: &T::MultiAssetId, ) -> (T::PoolAssetId, T::AccountId, AccountIdLookupOf) where - T::AssetBalance: From, + T::Balance: From, T::Currency: Unbalanced, T::Assets: Create + Mutate, T::PoolAssetId: Into, @@ -80,8 +79,8 @@ where assert_ok!(AssetConversion::::create_pool( SystemOrigin::Signed(caller.clone()).into(), - asset1.clone(), - asset2.clone() + Box::new(asset1.clone()), + Box::new(asset2.clone()) )); let lp_token = get_lp_token_id::(); @@ -99,7 +98,6 @@ fn assert_last_event(generic_event: ::RuntimeEvent) { benchmarks! { where_clause { where - T::AssetBalance: From + Into, T::Currency: Unbalanced, T::Balance: From + Into, T::Assets: Create + Mutate, @@ -110,7 +108,7 @@ benchmarks! { let asset1 = T::MultiAssetIdConverter::get_native(); let asset2 = T::BenchmarkHelper::multiasset_id(0); let (caller, _) = create_asset::(&asset2); - }: _(SystemOrigin::Signed(caller.clone()), asset1.clone(), asset2.clone()) + }: _(SystemOrigin::Signed(caller.clone()), Box::new(asset1.clone()), Box::new(asset2.clone())) verify { let lp_token = get_lp_token_id::(); let pool_id = (asset1.clone(), asset2.clone()); @@ -128,7 +126,7 @@ benchmarks! { let (lp_token, caller, _) = create_asset_and_pool::(&asset1, &asset2); let ed: u128 = T::Currency::minimum_balance().into(); let add_amount = 1000 + ed; - }: _(SystemOrigin::Signed(caller.clone()), asset1.clone(), asset2.clone(), add_amount.into(), 1000.into(), 0.into(), 0.into(), caller.clone()) + }: _(SystemOrigin::Signed(caller.clone()), Box::new(asset1.clone()), Box::new(asset2.clone()), add_amount.into(), 1000.into(), 0.into(), 0.into(), caller.clone()) verify { let pool_id = (asset1.clone(), asset2.clone()); let lp_minted = AssetConversion::::calc_lp_amount_for_zero_supply(&add_amount.into(), &1000.into()).unwrap().into(); @@ -157,8 +155,8 @@ benchmarks! { AssetConversion::::add_liquidity( SystemOrigin::Signed(caller.clone()).into(), - asset1.clone(), - asset2.clone(), + Box::new(asset1.clone()), + Box::new(asset2.clone()), add_amount.into(), 1000.into(), 0.into(), @@ -166,7 +164,7 @@ benchmarks! { caller.clone(), )?; let total_supply = >::total_issuance(lp_token.clone()); - }: _(SystemOrigin::Signed(caller.clone()), asset1, asset2, remove_lp_amount.into(), 0.into(), 0.into(), caller.clone()) + }: _(SystemOrigin::Signed(caller.clone()), Box::new(asset1), Box::new(asset2), remove_lp_amount.into(), 0.into(), 0.into(), caller.clone()) verify { let new_total_supply = >::total_issuance(lp_token.clone()); assert_eq!( @@ -185,8 +183,8 @@ benchmarks! { AssetConversion::::add_liquidity( SystemOrigin::Signed(caller.clone()).into(), - native.clone(), - asset1.clone(), + Box::new(native.clone()), + Box::new(asset1.clone()), (100 * ed).into(), 200.into(), 0.into(), @@ -199,29 +197,45 @@ benchmarks! { // if we only allow the native-asset pools, then the worst case scenario would be to swap // asset1-native-asset2 if !T::AllowMultiAssetPools::get() { - AssetConversion::::create_pool(SystemOrigin::Signed(caller.clone()).into(), native.clone(), asset2.clone())?; + AssetConversion::::create_pool( + SystemOrigin::Signed(caller.clone()).into(), + Box::new(native.clone()), + Box::new(asset2.clone()) + )?; AssetConversion::::add_liquidity( SystemOrigin::Signed(caller.clone()).into(), - native.clone(), - asset2.clone(), + Box::new(native.clone()), + Box::new(asset2.clone()), (500 * ed).into(), 1000.into(), 0.into(), 0.into(), caller.clone(), )?; - path = vec![asset1.clone(), native.clone(), asset2.clone()]; + path = vec![ + Box::new(asset1.clone()), + Box::new(native.clone()), + Box::new(asset2.clone()) + ]; swap_amount = 100.into(); } else { let asset3 = T::BenchmarkHelper::multiasset_id(3); - AssetConversion::::create_pool(SystemOrigin::Signed(caller.clone()).into(), asset1.clone(), asset2.clone())?; + AssetConversion::::create_pool( + SystemOrigin::Signed(caller.clone()).into(), + Box::new(asset1.clone()), + Box::new(asset2.clone()) + )?; let (_, _) = create_asset::(&asset3); - AssetConversion::::create_pool(SystemOrigin::Signed(caller.clone()).into(), asset2.clone(), asset3.clone())?; + AssetConversion::::create_pool( + SystemOrigin::Signed(caller.clone()).into(), + Box::new(asset2.clone()), + Box::new(asset3.clone()) + )?; AssetConversion::::add_liquidity( SystemOrigin::Signed(caller.clone()).into(), - asset1.clone(), - asset2.clone(), + Box::new(asset1.clone()), + Box::new(asset2.clone()), 200.into(), 2000.into(), 0.into(), @@ -230,19 +244,22 @@ benchmarks! { )?; AssetConversion::::add_liquidity( SystemOrigin::Signed(caller.clone()).into(), - asset2.clone(), - asset3.clone(), + Box::new(asset2.clone()), + Box::new(asset3.clone()), 2000.into(), 2000.into(), 0.into(), 0.into(), caller.clone(), )?; - path = vec![native.clone(), asset1.clone(), asset2.clone(), asset3.clone()]; + path = vec![ + Box::new(native.clone()), + Box::new(asset1.clone()), + Box::new(asset2.clone()), + Box::new(asset3.clone()) + ]; swap_amount = ed.into(); } - - let path: BoundedVec<_, T::MaxSwapPathLength> = BoundedVec::try_from(path).unwrap(); let native_balance = T::Currency::balance(&caller); let asset1_balance = T::Assets::balance(T::BenchmarkHelper::asset_id(1), &caller); }: _(SystemOrigin::Signed(caller.clone()), path, swap_amount, 1.into(), caller.clone(), false) @@ -266,8 +283,8 @@ benchmarks! { AssetConversion::::add_liquidity( SystemOrigin::Signed(caller.clone()).into(), - native.clone(), - asset1.clone(), + Box::new(native.clone()), + Box::new(asset1.clone()), (1000 * ed).into(), 500.into(), 0.into(), @@ -279,28 +296,44 @@ benchmarks! { // if we only allow the native-asset pools, then the worst case scenario would be to swap // asset1-native-asset2 if !T::AllowMultiAssetPools::get() { - AssetConversion::::create_pool(SystemOrigin::Signed(caller.clone()).into(), native.clone(), asset2.clone())?; + AssetConversion::::create_pool( + SystemOrigin::Signed(caller.clone()).into(), + Box::new(native.clone()), + Box::new(asset2.clone()) + )?; AssetConversion::::add_liquidity( SystemOrigin::Signed(caller.clone()).into(), - native.clone(), - asset2.clone(), + Box::new(native.clone()), + Box::new(asset2.clone()), (500 * ed).into(), 1000.into(), 0.into(), 0.into(), caller.clone(), )?; - path = vec![asset1.clone(), native.clone(), asset2.clone()]; + path = vec![ + Box::new(asset1.clone()), + Box::new(native.clone()), + Box::new(asset2.clone()) + ]; } else { - AssetConversion::::create_pool(SystemOrigin::Signed(caller.clone()).into(), asset1.clone(), asset2.clone())?; + AssetConversion::::create_pool( + SystemOrigin::Signed(caller.clone()).into(), + Box::new(asset1.clone()), + Box::new(asset2.clone()) + )?; let asset3 = T::BenchmarkHelper::multiasset_id(3); let (_, _) = create_asset::(&asset3); - AssetConversion::::create_pool(SystemOrigin::Signed(caller.clone()).into(), asset2.clone(), asset3.clone())?; + AssetConversion::::create_pool( + SystemOrigin::Signed(caller.clone()).into(), + Box::new(asset2.clone()), + Box::new(asset3.clone()) + )?; AssetConversion::::add_liquidity( SystemOrigin::Signed(caller.clone()).into(), - asset1.clone(), - asset2.clone(), + Box::new(asset1.clone()), + Box::new(asset2.clone()), 2000.into(), 2000.into(), 0.into(), @@ -309,18 +342,22 @@ benchmarks! { )?; AssetConversion::::add_liquidity( SystemOrigin::Signed(caller.clone()).into(), - asset2.clone(), - asset3.clone(), + Box::new(asset2.clone()), + Box::new(asset3.clone()), 2000.into(), 2000.into(), 0.into(), 0.into(), caller.clone(), )?; - path = vec![native.clone(), asset1.clone(), asset2.clone(), asset3.clone()]; + path = vec![ + Box::new(native.clone()), + Box::new(asset1.clone()), + Box::new(asset2.clone()), + Box::new(asset3.clone()) + ]; } - let path: BoundedVec<_, T::MaxSwapPathLength> = BoundedVec::try_from(path).unwrap(); let asset2_balance = T::Assets::balance(T::BenchmarkHelper::asset_id(2), &caller); let asset3_balance = T::Assets::balance(T::BenchmarkHelper::asset_id(3), &caller); }: _(SystemOrigin::Signed(caller.clone()), path.clone(), 100.into(), (1000 * ed).into(), caller.clone(), false) diff --git a/substrate/frame/asset-conversion/src/lib.rs b/substrate/frame/asset-conversion/src/lib.rs index 5cbc2821ce6..b9ff5e95508 100644 --- a/substrate/frame/asset-conversion/src/lib.rs +++ b/substrate/frame/asset-conversion/src/lib.rs @@ -53,63 +53,57 @@ //! (This can be run against the kitchen sync node in the `node` folder of this repo.) #![deny(missing_docs)] #![cfg_attr(not(feature = "std"), no_std)] -use frame_support::traits::{DefensiveOption, Incrementable}; #[cfg(feature = "runtime-benchmarks")] mod benchmarking; - -mod types; -pub mod weights; - +#[cfg(test)] +mod mock; +mod swap; #[cfg(test)] mod tests; +mod types; +pub mod weights; -#[cfg(test)] -mod mock; +pub use pallet::*; +pub use swap::*; +pub use types::*; +pub use weights::WeightInfo; use codec::Codec; use frame_support::{ - ensure, - traits::tokens::{AssetId, Balance}, -}; -use frame_system::{ - ensure_signed, - pallet_prelude::{BlockNumberFor, OriginFor}, + storage::{with_storage_layer, with_transaction}, + traits::{ + fungible::{ + Balanced as BalancedFungible, Credit as CreditFungible, Inspect as InspectFungible, + Mutate as MutateFungible, + }, + fungibles::{Balanced, Create, Credit as CreditFungibles, Inspect, Mutate}, + tokens::{ + AssetId, Balance, + Fortitude::Polite, + Precision::Exact, + Preservation::{Expendable, Preserve}, + }, + AccountTouch, ContainsPair, Imbalance, Incrementable, + }, + PalletId, }; -pub use pallet::*; -use sp_arithmetic::traits::Unsigned; +use sp_core::Get; use sp_runtime::{ traits::{ - CheckedAdd, CheckedDiv, CheckedMul, CheckedSub, Ensure, MaybeDisplay, TrailingZeroInput, + CheckedAdd, CheckedDiv, CheckedMul, CheckedSub, Ensure, IntegerSquareRoot, MaybeDisplay, + One, TrailingZeroInput, Zero, }, - DispatchError, + DispatchError, RuntimeDebug, Saturating, TokenError, TransactionOutcome, }; -use sp_std::prelude::*; -pub use types::*; -pub use weights::WeightInfo; +use sp_std::{boxed::Box, collections::btree_set::BTreeSet, vec::Vec}; #[frame_support::pallet] pub mod pallet { use super::*; - use frame_support::{ - pallet_prelude::*, - traits::{ - fungible::{Inspect as InspectFungible, Mutate as MutateFungible}, - fungibles::{Create, Inspect, Mutate}, - tokens::{ - Fortitude::Polite, - Precision::Exact, - Preservation::{Expendable, Preserve}, - }, - AccountTouch, ContainsPair, - }, - BoundedBTreeSet, PalletId, - }; - use sp_arithmetic::Permill; - use sp_runtime::{ - traits::{IntegerSquareRoot, One, Zero}, - Saturating, - }; + use frame_support::pallet_prelude::*; + use frame_system::pallet_prelude::*; + use sp_arithmetic::{traits::Unsigned, Permill}; #[pallet::pallet] pub struct Pallet(_); @@ -121,23 +115,19 @@ pub mod pallet { /// Currency type that this works on. type Currency: InspectFungible - + MutateFungible; + + MutateFungible + + BalancedFungible; - /// The `Currency::Balance` type of the native currency. + /// The type in which the assets for swapping are measured. type Balance: Balance; - /// The type used to describe the amount of fractions converted into assets. - type AssetBalance: Balance; - - /// A type used for conversions between `Balance` and `AssetBalance`. + /// A type used for calculations concerning the `Balance` type to avoid possible overflows. type HigherPrecisionBalance: IntegerSquareRoot + One + Ensure + Unsigned + From - + From + From - + TryInto + TryInto; /// Identifier for the class of non-native asset. @@ -159,14 +149,15 @@ pub mod pallet { type PoolAssetId: AssetId + PartialOrd + Incrementable + From; /// Registry for the assets. - type Assets: Inspect + type Assets: Inspect + Mutate + AccountTouch - + ContainsPair; + + ContainsPair + + Balanced; /// Registry for the lp tokens. Ideally only this pallet should have create permissions on /// the assets. - type PoolAssets: Inspect + type PoolAssets: Inspect + Create + Mutate + AccountTouch; @@ -188,7 +179,7 @@ pub mod pallet { /// The minimum LP token amount that could be minted. Ameliorates rounding errors. #[pallet::constant] - type MintMinLiquidity: Get; + type MintMinLiquidity: Get; /// The max number of hops in a swap. #[pallet::constant] @@ -248,13 +239,13 @@ pub mod pallet { /// The pool id of the pool that the liquidity was added to. pool_id: PoolIdOf, /// The amount of the first asset that was added to the pool. - amount1_provided: T::AssetBalance, + amount1_provided: T::Balance, /// The amount of the second asset that was added to the pool. - amount2_provided: T::AssetBalance, + amount2_provided: T::Balance, /// The id of the lp token that was minted. lp_token: T::PoolAssetId, /// The amount of lp tokens that were minted of that id. - lp_token_minted: T::AssetBalance, + lp_token_minted: T::Balance, }, /// A successful call of the `RemoveLiquidity` extrinsic will create this event. @@ -266,13 +257,13 @@ pub mod pallet { /// The pool id that the liquidity was removed from. pool_id: PoolIdOf, /// The amount of the first asset that was removed from the pool. - amount1: T::AssetBalance, + amount1: T::Balance, /// The amount of the second asset that was removed from the pool. - amount2: T::AssetBalance, + amount2: T::Balance, /// The id of the lp token that was burned. lp_token: T::PoolAssetId, /// The amount of lp tokens that were burned of that id. - lp_token_burned: T::AssetBalance, + lp_token_burned: T::Balance, /// Liquidity withdrawal fee (%). withdrawal_fee: Permill, }, @@ -283,24 +274,23 @@ pub mod pallet { who: T::AccountId, /// The account that the assets were transferred to. send_to: T::AccountId, - /// The route of asset ids that the swap went through. - /// E.g. A -> Dot -> B - path: BoundedVec, /// The amount of the first asset that was swapped. - amount_in: T::AssetBalance, + amount_in: T::Balance, /// The amount of the second asset that was received. - amount_out: T::AssetBalance, + amount_out: T::Balance, + /// The route of asset IDs with amounts that the swap went through. + /// E.g. (A, amount_in) -> (Dot, amount_out) -> (B, amount_out) + path: BalancePath, }, - /// An amount has been transferred from one account to another. - Transfer { - /// The account that the assets were transferred from. - from: T::AccountId, - /// The account that the assets were transferred to. - to: T::AccountId, - /// The asset that was transferred. - asset: T::MultiAssetId, - /// The amount of the asset that was transferred. - amount: T::AssetBalance, + /// Assets have been converted from one to another. + SwapCreditExecuted { + /// The amount of the first asset that was swapped. + amount_in: T::Balance, + /// The amount of the second asset that was received. + amount_out: T::Balance, + /// The route of asset IDs with amounts that the swap went through. + /// E.g. (A, amount_in) -> (Dot, amount_out) -> (B, amount_out) + path: BalancePath, }, } @@ -361,10 +351,8 @@ pub mod pallet { NonUniquePath, /// It was not possible to get or increment the Id of the pool. IncorrectPoolAssetId, - /// Unable to find an element in an array/vec that should have one-to-one correspondence - /// with another. For example, an array of assets constituting a `path` should have a - /// corresponding array of `amounts` along the path. - CorrespondenceError, + /// The destination account cannot exist with the swapped funds. + BelowMinimum, } #[pallet::hooks] @@ -388,14 +376,14 @@ pub mod pallet { #[pallet::weight(T::WeightInfo::create_pool())] pub fn create_pool( origin: OriginFor, - asset1: T::MultiAssetId, - asset2: T::MultiAssetId, + asset1: Box, + asset2: Box, ) -> DispatchResult { let sender = ensure_signed(origin)?; ensure!(asset1 != asset2, Error::::EqualAssets); // prepare pool_id - let pool_id = Self::get_pool_id(asset1, asset2); + let pool_id = Self::get_pool_id(*asset1, *asset2); ensure!(!Pools::::contains_key(&pool_id), Error::::PoolExists); let (asset1, asset2) = &pool_id; if !T::AllowMultiAssetPools::get() && !T::MultiAssetIdConverter::is_native(asset1) { @@ -466,20 +454,20 @@ pub mod pallet { #[pallet::weight(T::WeightInfo::add_liquidity())] pub fn add_liquidity( origin: OriginFor, - asset1: T::MultiAssetId, - asset2: T::MultiAssetId, - amount1_desired: T::AssetBalance, - amount2_desired: T::AssetBalance, - amount1_min: T::AssetBalance, - amount2_min: T::AssetBalance, + asset1: Box, + asset2: Box, + amount1_desired: T::Balance, + amount2_desired: T::Balance, + amount1_min: T::Balance, + amount2_min: T::Balance, mint_to: T::AccountId, ) -> DispatchResult { let sender = ensure_signed(origin)?; - let pool_id = Self::get_pool_id(asset1.clone(), asset2.clone()); + let pool_id = Self::get_pool_id(*asset1.clone(), *asset2); // swap params if needed let (amount1_desired, amount2_desired, amount1_min, amount2_min) = - if pool_id.0 == asset1 { + if pool_id.0 == *asset1 { (amount1_desired, amount2_desired, amount1_min, amount2_min) } else { (amount2_desired, amount1_desired, amount2_min, amount1_min) @@ -497,8 +485,8 @@ pub mod pallet { let reserve1 = Self::get_balance(&pool_account, asset1)?; let reserve2 = Self::get_balance(&pool_account, asset2)?; - let amount1: T::AssetBalance; - let amount2: T::AssetBalance; + let amount1: T::Balance; + let amount2: T::Balance; if reserve1.is_zero() || reserve2.is_zero() { amount1 = amount1_desired; amount2 = amount2_desired; @@ -537,7 +525,7 @@ pub mod pallet { let total_supply = T::PoolAssets::total_issuance(pool.lp_token.clone()); - let lp_token_amount: T::AssetBalance; + let lp_token_amount: T::Balance; if total_supply.is_zero() { lp_token_amount = Self::calc_lp_amount_for_zero_supply(&amount1, &amount2)?; T::PoolAssets::mint_into( @@ -578,18 +566,18 @@ pub mod pallet { #[pallet::weight(T::WeightInfo::remove_liquidity())] pub fn remove_liquidity( origin: OriginFor, - asset1: T::MultiAssetId, - asset2: T::MultiAssetId, - lp_token_burn: T::AssetBalance, - amount1_min_receive: T::AssetBalance, - amount2_min_receive: T::AssetBalance, + asset1: Box, + asset2: Box, + lp_token_burn: T::Balance, + amount1_min_receive: T::Balance, + amount2_min_receive: T::Balance, withdraw_to: T::AccountId, ) -> DispatchResult { let sender = ensure_signed(origin)?; - let pool_id = Self::get_pool_id(asset1.clone(), asset2.clone()); + let pool_id = Self::get_pool_id(*asset1.clone(), *asset2); // swap params if needed - let (amount1_min_receive, amount2_min_receive) = if pool_id.0 == asset1 { + let (amount1_min_receive, amount2_min_receive) = if pool_id.0 == *asset1 { (amount1_min_receive, amount2_min_receive) } else { (amount2_min_receive, amount1_min_receive) @@ -657,16 +645,16 @@ pub mod pallet { #[pallet::weight(T::WeightInfo::swap_exact_tokens_for_tokens())] pub fn swap_exact_tokens_for_tokens( origin: OriginFor, - path: BoundedVec, - amount_in: T::AssetBalance, - amount_out_min: T::AssetBalance, + path: Vec>, + amount_in: T::Balance, + amount_out_min: T::Balance, send_to: T::AccountId, keep_alive: bool, ) -> DispatchResult { let sender = ensure_signed(origin)?; Self::do_swap_exact_tokens_for_tokens( sender, - path, + path.into_iter().map(|a| *a).collect(), amount_in, Some(amount_out_min), send_to, @@ -685,16 +673,16 @@ pub mod pallet { #[pallet::weight(T::WeightInfo::swap_tokens_for_exact_tokens())] pub fn swap_tokens_for_exact_tokens( origin: OriginFor, - path: BoundedVec, - amount_out: T::AssetBalance, - amount_in_max: T::AssetBalance, + path: Vec>, + amount_out: T::Balance, + amount_in_max: T::Balance, send_to: T::AccountId, keep_alive: bool, ) -> DispatchResult { let sender = ensure_signed(origin)?; Self::do_swap_tokens_for_exact_tokens( sender, - path, + path.into_iter().map(|a| *a).collect(), amount_out, Some(amount_in_max), send_to, @@ -713,25 +701,27 @@ pub mod pallet { /// respecting `keep_alive`. /// /// If successful, returns the amount of `path[1]` acquired for the `amount_in`. - pub fn do_swap_exact_tokens_for_tokens( + /// + /// WARNING: This may return an error after a partial storage mutation. It should be used + /// only inside a transactional storage context and an Err result must imply a storage + /// rollback. + pub(crate) fn do_swap_exact_tokens_for_tokens( sender: T::AccountId, - path: BoundedVec, - amount_in: T::AssetBalance, - amount_out_min: Option, + path: Vec, + amount_in: T::Balance, + amount_out_min: Option, send_to: T::AccountId, keep_alive: bool, - ) -> Result { + ) -> Result { ensure!(amount_in > Zero::zero(), Error::::ZeroAmount); if let Some(amount_out_min) = amount_out_min { ensure!(amount_out_min > Zero::zero(), Error::::ZeroAmount); } Self::validate_swap_path(&path)?; + let path = Self::balance_path_from_amount_in(amount_in, path)?; - let amounts = Self::get_amounts_out(&amount_in, &path)?; - let amount_out = - *amounts.last().defensive_ok_or("get_amounts_out() returned an empty result")?; - + let amount_out = path.last().map(|(_, a)| *a).ok_or(Error::::InvalidPath)?; if let Some(amount_out_min) = amount_out_min { ensure!( amount_out >= amount_out_min, @@ -739,7 +729,15 @@ pub mod pallet { ); } - Self::do_swap(sender, &amounts, path, send_to, keep_alive)?; + Self::swap(&sender, &path, &send_to, keep_alive)?; + + Self::deposit_event(Event::SwapExecuted { + who: sender, + send_to, + amount_in, + amount_out, + path, + }); Ok(amount_out) } @@ -751,25 +749,27 @@ pub mod pallet { /// respecting `keep_alive`. /// /// If successful returns the amount of the `path[0]` taken to provide `path[1]`. - pub fn do_swap_tokens_for_exact_tokens( + /// + /// WARNING: This may return an error after a partial storage mutation. It should be used + /// only inside a transactional storage context and an Err result must imply a storage + /// rollback. + pub(crate) fn do_swap_tokens_for_exact_tokens( sender: T::AccountId, - path: BoundedVec, - amount_out: T::AssetBalance, - amount_in_max: Option, + path: Vec, + amount_out: T::Balance, + amount_in_max: Option, send_to: T::AccountId, keep_alive: bool, - ) -> Result { + ) -> Result { ensure!(amount_out > Zero::zero(), Error::::ZeroAmount); if let Some(amount_in_max) = amount_in_max { ensure!(amount_in_max > Zero::zero(), Error::::ZeroAmount); } Self::validate_swap_path(&path)?; + let path = Self::balance_path_from_amount_out(amount_out, path)?; - let amounts = Self::get_amounts_in(&amount_out, &path)?; - let amount_in = - *amounts.first().defensive_ok_or("get_amounts_in() returned an empty result")?; - + let amount_in = path.first().map(|(_, a)| *a).ok_or(Error::::InvalidPath)?; if let Some(amount_in_max) = amount_in_max { ensure!( amount_in <= amount_in_max, @@ -777,131 +777,251 @@ pub mod pallet { ); } - Self::do_swap(sender, &amounts, path, send_to, keep_alive)?; + Self::swap(&sender, &path, &send_to, keep_alive)?; + + Self::deposit_event(Event::SwapExecuted { + who: sender, + send_to, + amount_in, + amount_out, + path, + }); + Ok(amount_in) } + /// Swap exactly `credit_in` of asset `path[0]` for asset `path[last]`. If `amount_out_min` + /// is provided and the swap can't achieve at least this amount, an error is returned. + /// + /// On a successful swap, the function returns the `credit_out` of `path[last]` obtained + /// from the `credit_in`. On failure, it returns an `Err` containing the original + /// `credit_in` and the associated error code. + /// + /// WARNING: This may return an error after a partial storage mutation. It should be used + /// only inside a transactional storage context and an Err result must imply a storage + /// rollback. + pub(crate) fn do_swap_exact_credit_tokens_for_tokens( + path: Vec, + credit_in: Credit, + amount_out_min: Option, + ) -> Result, (Credit, DispatchError)> { + let amount_in = credit_in.peek(); + let inspect_path = |credit_asset| { + ensure!(path.get(0).map_or(false, |a| *a == credit_asset), Error::::InvalidPath); + ensure!(!amount_in.is_zero(), Error::::ZeroAmount); + ensure!(amount_out_min.map_or(true, |a| !a.is_zero()), Error::::ZeroAmount); + + Self::validate_swap_path(&path)?; + let path = Self::balance_path_from_amount_in(amount_in, path)?; + + let amount_out = path.last().map(|(_, a)| *a).ok_or(Error::::InvalidPath)?; + ensure!( + amount_out_min.map_or(true, |a| amount_out >= a), + Error::::ProvidedMinimumNotSufficientForSwap + ); + Ok((path, amount_out)) + }; + let (path, amount_out) = match inspect_path(credit_in.asset()) { + Ok((p, a)) => (p, a), + Err(e) => return Err((credit_in, e)), + }; + + let credit_out = Self::credit_swap(credit_in, &path)?; + + Self::deposit_event(Event::SwapCreditExecuted { amount_in, amount_out, path }); + + Ok(credit_out) + } + + /// Swaps a portion of `credit_in` of `path[0]` asset to obtain the desired `amount_out` of + /// the `path[last]` asset. The provided `credit_in` must be adequate to achieve the target + /// `amount_out`, or an error will occur. + /// + /// On success, the function returns a (`credit_out`, `credit_change`) tuple, where + /// `credit_out` represents the acquired amount of the `path[last]` asset, and + /// `credit_change` is the remaining portion from the `credit_in`. On failure, an `Err` with + /// the initial `credit_in` and error code is returned. + /// + /// WARNING: This may return an error after a partial storage mutation. It should be used + /// only inside a transactional storage context and an Err result must imply a storage + /// rollback. + pub(crate) fn do_swap_credit_tokens_for_exact_tokens( + path: Vec, + credit_in: Credit, + amount_out: T::Balance, + ) -> Result<(Credit, Credit), (Credit, DispatchError)> { + let amount_in_max = credit_in.peek(); + let inspect_path = |credit_asset| { + ensure!(path.get(0).map_or(false, |a| a == &credit_asset), Error::::InvalidPath); + ensure!(amount_in_max > Zero::zero(), Error::::ZeroAmount); + ensure!(amount_out > Zero::zero(), Error::::ZeroAmount); + + Self::validate_swap_path(&path)?; + let path = Self::balance_path_from_amount_out(amount_out, path)?; + + let amount_in = path.first().map(|(_, a)| *a).ok_or(Error::::InvalidPath)?; + ensure!( + amount_in <= amount_in_max, + Error::::ProvidedMaximumNotSufficientForSwap + ); + + Ok((path, amount_in)) + }; + let (path, amount_in) = match inspect_path(credit_in.asset()) { + Ok((p, a)) => (p, a), + Err(e) => return Err((credit_in, e)), + }; + + let (credit_in, credit_change) = credit_in.split(amount_in); + let credit_out = Self::credit_swap(credit_in, &path)?; + + Self::deposit_event(Event::SwapCreditExecuted { amount_in, amount_out, path }); + + Ok((credit_out, credit_change)) + } + /// Transfer an `amount` of `asset_id`, respecting the `keep_alive` requirements. fn transfer( asset_id: &T::MultiAssetId, from: &T::AccountId, to: &T::AccountId, - amount: T::AssetBalance, + amount: T::Balance, keep_alive: bool, - ) -> Result { - let result = match T::MultiAssetIdConverter::try_convert(asset_id) { + ) -> Result { + let preservation = match keep_alive { + true => Preserve, + false => Expendable, + }; + match T::MultiAssetIdConverter::try_convert(asset_id) { MultiAssetIdConversionResult::Converted(asset_id) => - T::Assets::transfer(asset_id, from, to, amount, Expendable), - MultiAssetIdConversionResult::Native => { - let preservation = match keep_alive { - true => Preserve, - false => Expendable, - }; - let amount = Self::convert_asset_balance_to_native_balance(amount)?; - Ok(Self::convert_native_balance_to_asset_balance(T::Currency::transfer( - from, - to, - amount, - preservation, - )?)?) - }, + T::Assets::transfer(asset_id, from, to, amount, preservation), + MultiAssetIdConversionResult::Native => + Ok(T::Currency::transfer(from, to, amount, preservation)?), MultiAssetIdConversionResult::Unsupported(_) => Err(Error::::UnsupportedAsset.into()), - }; - - if result.is_ok() { - Self::deposit_event(Event::Transfer { - from: from.clone(), - to: to.clone(), - asset: (*asset_id).clone(), - amount, - }); } - result } - /// Convert a `Balance` type to an `AssetBalance`. - pub(crate) fn convert_native_balance_to_asset_balance( - amount: T::Balance, - ) -> Result> { - T::HigherPrecisionBalance::from(amount) - .try_into() - .map_err(|_| Error::::Overflow) - } - - /// Convert an `AssetBalance` type to a `Balance`. - pub(crate) fn convert_asset_balance_to_native_balance( - amount: T::AssetBalance, - ) -> Result> { - T::HigherPrecisionBalance::from(amount) - .try_into() - .map_err(|_| Error::::Overflow) + /// The balance of `who` is increased in order to counter `credit`. If the whole of `credit` + /// cannot be countered, then nothing is changed and the original `credit` is returned in an + /// `Err`. + fn resolve(who: &T::AccountId, credit: Credit) -> Result<(), Credit> { + match credit { + Credit::Native(c) => T::Currency::resolve(who, c).map_err(|c| c.into()), + Credit::Asset(c) => T::Assets::resolve(who, c).map_err(|c| c.into()), + } } - /// Convert a `HigherPrecisionBalance` type to an `AssetBalance`. - pub(crate) fn convert_hpb_to_asset_balance( - amount: T::HigherPrecisionBalance, - ) -> Result> { - amount.try_into().map_err(|_| Error::::Overflow) + /// Removes `value` balance of `asset` from `who` account if possible. + fn withdraw( + asset: &T::MultiAssetId, + who: &T::AccountId, + value: T::Balance, + keep_alive: bool, + ) -> Result, DispatchError> { + let preservation = match keep_alive { + true => Preserve, + false => Expendable, + }; + match T::MultiAssetIdConverter::try_convert(asset) { + MultiAssetIdConversionResult::Converted(asset) => { + if preservation == Preserve { + // TODO drop the ensure! when this issue addressed + // https://github.com/paritytech/polkadot-sdk/issues/1698 + let free = + T::Assets::reducible_balance(asset.clone(), who, preservation, Polite); + ensure!(free >= value, TokenError::NotExpendable); + } + T::Assets::withdraw(asset, who, value, Exact, preservation, Polite) + .map(|c| c.into()) + }, + MultiAssetIdConversionResult::Native => { + if preservation == Preserve { + // TODO drop the ensure! when this issue addressed + // https://github.com/paritytech/polkadot-sdk/issues/1698 + let free = T::Currency::reducible_balance(who, preservation, Polite); + ensure!(free >= value, TokenError::NotExpendable); + } + T::Currency::withdraw(who, value, Exact, preservation, Polite).map(|c| c.into()) + }, + MultiAssetIdConversionResult::Unsupported(_) => + Err(Error::::UnsupportedAsset.into()), + } } - /// Swap assets along a `path`, depositing in `send_to`. - pub(crate) fn do_swap( - sender: T::AccountId, - amounts: &Vec, - path: BoundedVec, - send_to: T::AccountId, + /// Swap assets along the `path`, withdrawing from `sender` and depositing in `send_to`. + /// + /// Note: It's assumed that the provided `path` is valid. + /// + /// WARNING: This may return an error after a partial storage mutation. It should be used + /// only inside a transactional storage context and an Err result must imply a storage + /// rollback. + fn swap( + sender: &T::AccountId, + path: &BalancePath, + send_to: &T::AccountId, keep_alive: bool, ) -> Result<(), DispatchError> { - ensure!(amounts.len() > 1, Error::::CorrespondenceError); - if let Some([asset1, asset2]) = &path.get(0..2) { - let pool_id = Self::get_pool_id(asset1.clone(), asset2.clone()); - let pool_account = Self::get_pool_account(&pool_id); - // amounts should always contain a corresponding element to path. - let first_amount = amounts.first().ok_or(Error::::CorrespondenceError)?; - - Self::transfer(asset1, &sender, &pool_account, *first_amount, keep_alive)?; - - let mut i = 0; - let path_len = path.len() as u32; - for assets_pair in path.windows(2) { - if let [asset1, asset2] = assets_pair { - let pool_id = Self::get_pool_id(asset1.clone(), asset2.clone()); - let pool_account = Self::get_pool_account(&pool_id); - - let amount_out = - amounts.get((i + 1) as usize).ok_or(Error::::CorrespondenceError)?; - - let to = if i < path_len - 2 { - let asset3 = path.get((i + 2) as usize).ok_or(Error::::PathError)?; - Self::get_pool_account(&Self::get_pool_id( + let (asset_in, amount_in) = path.first().ok_or(Error::::InvalidPath)?; + let credit_in = Self::withdraw(asset_in, sender, *amount_in, keep_alive)?; + + let credit_out = Self::credit_swap(credit_in, path).map_err(|(_, e)| e)?; + Self::resolve(send_to, credit_out).map_err(|_| Error::::BelowMinimum)?; + + Ok(()) + } + + /// Swap assets along the specified `path`, consuming `credit_in` and producing + /// `credit_out`. + /// + /// If an error occurs, `credit_in` is returned back. + /// + /// Note: It's assumed that the provided `path` is valid and `credit_in` corresponds to the + /// first asset in the `path`. + /// + /// WARNING: This may return an error after a partial storage mutation. It should be used + /// only inside a transactional storage context and an Err result must imply a storage + /// rollback. + fn credit_swap( + credit_in: Credit, + path: &BalancePath, + ) -> Result, (Credit, DispatchError)> { + let resolve_path = || -> Result, DispatchError> { + for pos in 0..=path.len() { + if let Some([(asset1, _), (asset2, amount_out)]) = path.get(pos..=pos + 1) { + let pool_from = Self::get_pool_account(&Self::get_pool_id( + asset1.clone(), + asset2.clone(), + )); + if let Some((asset3, _)) = path.get(pos + 2) { + let pool_to = Self::get_pool_account(&Self::get_pool_id( asset2.clone(), asset3.clone(), - )) + )); + Self::transfer(asset2, &pool_from, &pool_to, *amount_out, true)?; } else { - send_to.clone() - }; - - let reserve = Self::get_balance(&pool_account, asset2)?; - let reserve_left = reserve.saturating_sub(*amount_out); - Self::validate_minimal_amount(reserve_left, asset2) - .map_err(|_| Error::::ReserveLeftLessThanMinimal)?; - - Self::transfer(asset2, &pool_account, &to, *amount_out, true)?; + let credit_out = Self::withdraw(asset2, &pool_from, *amount_out, true)?; + return Ok(credit_out) + } } - i.saturating_inc(); } - Self::deposit_event(Event::SwapExecuted { - who: sender, - send_to, - path, - amount_in: *first_amount, - amount_out: *amounts.last().expect("Always has more than 1 element"), - }); - } else { return Err(Error::::InvalidPath.into()) - } - Ok(()) + }; + + let credit_out = match resolve_path() { + Ok(c) => c, + Err(e) => return Err((credit_in, e)), + }; + + let pool_to = if let Some([(asset1, _), (asset2, _)]) = path.get(0..2) { + Self::get_pool_account(&Self::get_pool_id(asset1.clone(), asset2.clone())) + } else { + return Err((credit_in, Error::::InvalidPath.into())) + }; + + Self::resolve(&pool_to, credit_in).map_err(|c| (c, Error::::BelowMinimum.into()))?; + + Ok(credit_out) } /// The account ID of the pool. @@ -916,19 +1036,17 @@ pub mod pallet { } /// Get the `owner`'s balance of `asset`, which could be the chain's native asset or another - /// fungible. Returns a value in the form of an `AssetBalance`. + /// fungible. Returns a value in the form of an `Balance`. fn get_balance( owner: &T::AccountId, asset: &T::MultiAssetId, - ) -> Result> { + ) -> Result> { match T::MultiAssetIdConverter::try_convert(asset) { MultiAssetIdConversionResult::Converted(asset_id) => Ok( <::Assets>::reducible_balance(asset_id, owner, Expendable, Polite), ), MultiAssetIdConversionResult::Native => - Self::convert_native_balance_to_asset_balance( - <::Currency>::reducible_balance(owner, Expendable, Polite), - ), + Ok(<::Currency>::reducible_balance(owner, Expendable, Polite)), MultiAssetIdConversionResult::Unsupported(_) => Err(Error::::UnsupportedAsset.into()), } @@ -963,7 +1081,7 @@ pub mod pallet { pub fn get_reserves( asset1: &T::MultiAssetId, asset2: &T::MultiAssetId, - ) -> Result<(T::AssetBalance, T::AssetBalance), Error> { + ) -> Result<(T::Balance, T::Balance), Error> { let pool_id = Self::get_pool_id(asset1.clone(), asset2.clone()); let pool_account = Self::get_pool_account(&pool_id); @@ -978,51 +1096,62 @@ pub mod pallet { } /// Leading to an amount at the end of a `path`, get the required amounts in. - pub(crate) fn get_amounts_in( - amount_out: &T::AssetBalance, - path: &BoundedVec, - ) -> Result, DispatchError> { - let mut amounts: Vec = vec![*amount_out]; - - for assets_pair in path.windows(2).rev() { - if let [asset1, asset2] = assets_pair { - let (reserve_in, reserve_out) = Self::get_reserves(asset1, asset2)?; - let prev_amount = amounts.last().expect("Always has at least one element"); - let amount_in = Self::get_amount_in(prev_amount, &reserve_in, &reserve_out)?; - amounts.push(amount_in); - } + pub(crate) fn balance_path_from_amount_out( + amount_out: T::Balance, + path: Vec, + ) -> Result, DispatchError> { + let mut balance_path: BalancePath = Vec::with_capacity(path.len()); + let mut amount_in: T::Balance = amount_out; + + let mut iter = path.into_iter().rev().peekable(); + while let Some(asset2) = iter.next() { + let asset1 = match iter.peek() { + Some(a) => a, + None => { + balance_path.push((asset2, amount_in)); + break + }, + }; + let (reserve_in, reserve_out) = Self::get_reserves(asset1, &asset2)?; + balance_path.push((asset2, amount_in)); + amount_in = Self::get_amount_in(&amount_in, &reserve_in, &reserve_out)?; } + balance_path.reverse(); - amounts.reverse(); - Ok(amounts) + Ok(balance_path) } /// Following an amount into a `path`, get the corresponding amounts out. - pub(crate) fn get_amounts_out( - amount_in: &T::AssetBalance, - path: &BoundedVec, - ) -> Result, DispatchError> { - let mut amounts: Vec = vec![*amount_in]; - - for assets_pair in path.windows(2) { - if let [asset1, asset2] = assets_pair { - let (reserve_in, reserve_out) = Self::get_reserves(asset1, asset2)?; - let prev_amount = amounts.last().expect("Always has at least one element"); - let amount_out = Self::get_amount_out(prev_amount, &reserve_in, &reserve_out)?; - amounts.push(amount_out); - } + pub(crate) fn balance_path_from_amount_in( + amount_in: T::Balance, + path: Vec, + ) -> Result, DispatchError> { + let mut balance_path: BalancePath = Vec::with_capacity(path.len()); + let mut amount_out: T::Balance = amount_in; + + let mut iter = path.into_iter().peekable(); + while let Some(asset1) = iter.next() { + let asset2 = match iter.peek() { + Some(a) => a, + None => { + balance_path.push((asset1, amount_out)); + break + }, + }; + let (reserve_in, reserve_out) = Self::get_reserves(&asset1, asset2)?; + balance_path.push((asset1, amount_out)); + amount_out = Self::get_amount_out(&amount_out, &reserve_in, &reserve_out)?; } - - Ok(amounts) + Ok(balance_path) } /// Used by the RPC service to provide current prices. pub fn quote_price_exact_tokens_for_tokens( asset1: T::MultiAssetId, asset2: T::MultiAssetId, - amount: T::AssetBalance, + amount: T::Balance, include_fee: bool, - ) -> Option { + ) -> Option { let pool_id = Self::get_pool_id(asset1.clone(), asset2.clone()); let pool_account = Self::get_pool_account(&pool_id); @@ -1043,9 +1172,9 @@ pub mod pallet { pub fn quote_price_tokens_for_exact_tokens( asset1: T::MultiAssetId, asset2: T::MultiAssetId, - amount: T::AssetBalance, + amount: T::Balance, include_fee: bool, - ) -> Option { + ) -> Option { let pool_id = Self::get_pool_id(asset1.clone(), asset2.clone()); let pool_account = Self::get_pool_account(&pool_id); @@ -1064,18 +1193,18 @@ pub mod pallet { /// Calculates the optimal amount from the reserves. pub fn quote( - amount: &T::AssetBalance, - reserve1: &T::AssetBalance, - reserve2: &T::AssetBalance, - ) -> Result> { - // amount * reserve2 / reserve1 + amount: &T::Balance, + reserve1: &T::Balance, + reserve2: &T::Balance, + ) -> Result> { + // (amount * reserve2) / reserve1 Self::mul_div(amount, reserve2, reserve1) } pub(super) fn calc_lp_amount_for_zero_supply( - amount1: &T::AssetBalance, - amount2: &T::AssetBalance, - ) -> Result> { + amount1: &T::Balance, + amount2: &T::Balance, + ) -> Result> { let amount1 = T::HigherPrecisionBalance::from(*amount1); let amount2 = T::HigherPrecisionBalance::from(*amount2); @@ -1089,11 +1218,7 @@ pub mod pallet { result.try_into().map_err(|_| Error::::Overflow) } - fn mul_div( - a: &T::AssetBalance, - b: &T::AssetBalance, - c: &T::AssetBalance, - ) -> Result> { + fn mul_div(a: &T::Balance, b: &T::Balance, c: &T::Balance) -> Result> { let a = T::HigherPrecisionBalance::from(*a); let b = T::HigherPrecisionBalance::from(*b); let c = T::HigherPrecisionBalance::from(*c); @@ -1112,10 +1237,10 @@ pub mod pallet { /// Given an input amount of an asset and pair reserves, returns the maximum output amount /// of the other asset. pub fn get_amount_out( - amount_in: &T::AssetBalance, - reserve_in: &T::AssetBalance, - reserve_out: &T::AssetBalance, - ) -> Result> { + amount_in: &T::Balance, + reserve_in: &T::Balance, + reserve_out: &T::Balance, + ) -> Result> { let amount_in = T::HigherPrecisionBalance::from(*amount_in); let reserve_in = T::HigherPrecisionBalance::from(*reserve_in); let reserve_out = T::HigherPrecisionBalance::from(*reserve_out); @@ -1147,10 +1272,10 @@ pub mod pallet { /// Given an output amount of an asset and pair reserves, returns a required input amount /// of the other asset. pub fn get_amount_in( - amount_out: &T::AssetBalance, - reserve_in: &T::AssetBalance, - reserve_out: &T::AssetBalance, - ) -> Result> { + amount_out: &T::Balance, + reserve_in: &T::Balance, + reserve_out: &T::Balance, + ) -> Result> { let amount_out = T::HigherPrecisionBalance::from(*amount_out); let reserve_in = T::HigherPrecisionBalance::from(*reserve_in); let reserve_out = T::HigherPrecisionBalance::from(*reserve_out); @@ -1185,10 +1310,7 @@ pub mod pallet { } /// Ensure that a `value` meets the minimum balance requirements of an `asset` class. - fn validate_minimal_amount( - value: T::AssetBalance, - asset: &T::MultiAssetId, - ) -> Result<(), ()> { + fn validate_minimal_amount(value: T::Balance, asset: &T::MultiAssetId) -> Result<(), ()> { if T::MultiAssetIdConverter::is_native(asset) { let ed = T::Currency::minimum_balance(); ensure!( @@ -1208,18 +1330,16 @@ pub mod pallet { } /// Ensure that a path is valid. - fn validate_swap_path( - path: &BoundedVec, - ) -> Result<(), DispatchError> { + fn validate_swap_path(path: &Vec) -> Result<(), DispatchError> { ensure!(path.len() >= 2, Error::::InvalidPath); + ensure!(path.len() as u32 <= T::MaxSwapPathLength::get(), Error::::InvalidPath); // validate all the pools in the path are unique - let mut pools = BoundedBTreeSet::, T::MaxSwapPathLength>::new(); + let mut pools = BTreeSet::>::new(); for assets_pair in path.windows(2) { if let [asset1, asset2] = assets_pair { let pool_id = Self::get_pool_id(asset1.clone(), asset2.clone()); - let new_element = - pools.try_insert(pool_id).map_err(|_| Error::::Overflow)?; + let new_element = pools.insert(pool_id); if !new_element { return Err(Error::::NonUniquePath.into()) } @@ -1238,69 +1358,24 @@ pub mod pallet { } } -impl Swap for Pallet { - fn swap_exact_tokens_for_tokens( - sender: T::AccountId, - path: Vec, - amount_in: T::HigherPrecisionBalance, - amount_out_min: Option, - send_to: T::AccountId, - keep_alive: bool, - ) -> Result { - let path = path.try_into().map_err(|_| Error::::PathError)?; - let amount_out_min = amount_out_min.map(Self::convert_hpb_to_asset_balance).transpose()?; - let amount_out = Self::do_swap_exact_tokens_for_tokens( - sender, - path, - Self::convert_hpb_to_asset_balance(amount_in)?, - amount_out_min, - send_to, - keep_alive, - )?; - Ok(amount_out.into()) - } - - fn swap_tokens_for_exact_tokens( - sender: T::AccountId, - path: Vec, - amount_out: T::HigherPrecisionBalance, - amount_in_max: Option, - send_to: T::AccountId, - keep_alive: bool, - ) -> Result { - let path = path.try_into().map_err(|_| Error::::PathError)?; - let amount_in_max = amount_in_max.map(Self::convert_hpb_to_asset_balance).transpose()?; - let amount_in = Self::do_swap_tokens_for_exact_tokens( - sender, - path, - Self::convert_hpb_to_asset_balance(amount_out)?, - amount_in_max, - send_to, - keep_alive, - )?; - Ok(amount_in.into()) - } -} - sp_api::decl_runtime_apis! { /// This runtime api allows people to query the size of the liquidity pools /// and quote prices for swaps. - pub trait AssetConversionApi where - Balance: Codec + MaybeDisplay, - AssetBalance: frame_support::traits::tokens::Balance, + pub trait AssetConversionApi where + Balance: frame_support::traits::tokens::Balance + MaybeDisplay, AssetId: Codec { /// Provides a quote for [`Pallet::swap_tokens_for_exact_tokens`]. /// /// Note that the price may have changed by the time the transaction is executed. /// (Use `amount_in_max` to control slippage.) - fn quote_price_tokens_for_exact_tokens(asset1: AssetId, asset2: AssetId, amount: AssetBalance, include_fee: bool) -> Option; + fn quote_price_tokens_for_exact_tokens(asset1: AssetId, asset2: AssetId, amount: Balance, include_fee: bool) -> Option; /// Provides a quote for [`Pallet::swap_exact_tokens_for_tokens`]. /// /// Note that the price may have changed by the time the transaction is executed. /// (Use `amount_out_min` to control slippage.) - fn quote_price_exact_tokens_for_tokens(asset1: AssetId, asset2: AssetId, amount: AssetBalance, include_fee: bool) -> Option; + fn quote_price_exact_tokens_for_tokens(asset1: AssetId, asset2: AssetId, amount: Balance, include_fee: bool) -> Option; /// Returns the size of the liquidity pool for the given asset pair. fn get_reserves(asset1: AssetId, asset2: AssetId) -> Option<(Balance, Balance)>; diff --git a/substrate/frame/asset-conversion/src/mock.rs b/substrate/frame/asset-conversion/src/mock.rs index c84263b0796..4850eb1e833 100644 --- a/substrate/frame/asset-conversion/src/mock.rs +++ b/substrate/frame/asset-conversion/src/mock.rs @@ -154,7 +154,6 @@ ord_parameter_types! { impl Config for Test { type RuntimeEvent = RuntimeEvent; type Currency = Balances; - type AssetBalance = ::Balance; type AssetId = u32; type PoolAssetId = u32; type Assets = Assets; @@ -169,7 +168,7 @@ impl Config for Test { type MaxSwapPathLength = ConstU32<4>; type MintMinLiquidity = ConstU128<100>; // 100 is good enough when the main currency has 12 decimals. - type Balance = u128; + type Balance = ::Balance; type HigherPrecisionBalance = sp_core::U256; type MultiAssetId = NativeOrAssetId; diff --git a/substrate/frame/asset-conversion/src/swap.rs b/substrate/frame/asset-conversion/src/swap.rs new file mode 100644 index 00000000000..7f59b8f9b80 --- /dev/null +++ b/substrate/frame/asset-conversion/src/swap.rs @@ -0,0 +1,210 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Traits and implementations for swap between the various asset classes. + +use super::*; + +/// Trait for providing methods to swap between the various asset classes. +pub trait Swap { + /// Measure units of the asset classes for swapping. + type Balance: Balance; + /// Kind of assets that are going to be swapped. + type MultiAssetId; + + /// Returns the upper limit on the length of the swap path. + fn max_path_len() -> u32; + + /// Swap exactly `amount_in` of asset `path[0]` for asset `path[last]`. + /// If an `amount_out_min` is specified, it will return an error if it is unable to acquire + /// the amount desired. + /// + /// Withdraws the `path[0]` asset from `sender`, deposits the `path[last]` asset to `send_to`, + /// respecting `keep_alive`. + /// + /// If successful, returns the amount of `path[last]` acquired for the `amount_in`. + /// + /// This operation is expected to be atomic. + fn swap_exact_tokens_for_tokens( + sender: AccountId, + path: Vec, + amount_in: Self::Balance, + amount_out_min: Option, + send_to: AccountId, + keep_alive: bool, + ) -> Result; + + /// Take the `path[0]` asset and swap some amount for `amount_out` of the `path[last]`. If an + /// `amount_in_max` is specified, it will return an error if acquiring `amount_out` would be + /// too costly. + /// + /// Withdraws `path[0]` asset from `sender`, deposits `path[last]` asset to `send_to`, + /// respecting `keep_alive`. + /// + /// If successful returns the amount of the `path[0]` taken to provide `path[last]`. + /// + /// This operation is expected to be atomic. + fn swap_tokens_for_exact_tokens( + sender: AccountId, + path: Vec, + amount_out: Self::Balance, + amount_in_max: Option, + send_to: AccountId, + keep_alive: bool, + ) -> Result; +} + +/// Trait providing methods to swap between the various asset classes. +pub trait SwapCredit { + /// Measure units of the asset classes for swapping. + type Balance: Balance; + /// Kind of assets that are going to be swapped. + type MultiAssetId; + /// Credit implying a negative imbalance in the system that can be placed into an account or + /// alter the total supply. + type Credit; + + /// Returns the upper limit on the length of the swap path. + fn max_path_len() -> u32; + + /// Swap exactly `credit_in` of asset `path[0]` for asset `path[last]`. If `amount_out_min` is + /// provided and the swap can't achieve at least this amount, an error is returned. + /// + /// On a successful swap, the function returns the `credit_out` of `path[last]` obtained from + /// the `credit_in`. On failure, it returns an `Err` containing the original `credit_in` and the + /// associated error code. + /// + /// This operation is expected to be atomic. + fn swap_exact_tokens_for_tokens( + path: Vec, + credit_in: Self::Credit, + amount_out_min: Option, + ) -> Result; + + /// Swaps a portion of `credit_in` of `path[0]` asset to obtain the desired `amount_out` of + /// the `path[last]` asset. The provided `credit_in` must be adequate to achieve the target + /// `amount_out`, or an error will occur. + /// + /// On success, the function returns a (`credit_out`, `credit_change`) tuple, where `credit_out` + /// represents the acquired amount of the `path[last]` asset, and `credit_change` is the + /// remaining portion from the `credit_in`. On failure, an `Err` with the initial `credit_in` + /// and error code is returned. + /// + /// This operation is expected to be atomic. + fn swap_tokens_for_exact_tokens( + path: Vec, + credit_in: Self::Credit, + amount_out: Self::Balance, + ) -> Result<(Self::Credit, Self::Credit), (Self::Credit, DispatchError)>; +} + +impl Swap for Pallet { + type Balance = T::Balance; + type MultiAssetId = T::MultiAssetId; + + fn max_path_len() -> u32 { + T::MaxSwapPathLength::get() + } + + fn swap_exact_tokens_for_tokens( + sender: T::AccountId, + path: Vec, + amount_in: Self::Balance, + amount_out_min: Option, + send_to: T::AccountId, + keep_alive: bool, + ) -> Result { + let amount_out = with_storage_layer(|| { + Self::do_swap_exact_tokens_for_tokens( + sender, + path, + amount_in, + amount_out_min, + send_to, + keep_alive, + ) + })?; + Ok(amount_out.into()) + } + + fn swap_tokens_for_exact_tokens( + sender: T::AccountId, + path: Vec, + amount_out: Self::Balance, + amount_in_max: Option, + send_to: T::AccountId, + keep_alive: bool, + ) -> Result { + let amount_in = with_storage_layer(|| { + Self::do_swap_tokens_for_exact_tokens( + sender, + path, + amount_out, + amount_in_max, + send_to, + keep_alive, + ) + })?; + Ok(amount_in.into()) + } +} + +impl SwapCredit for Pallet { + type Balance = T::Balance; + type MultiAssetId = T::MultiAssetId; + type Credit = Credit; + + fn max_path_len() -> u32 { + T::MaxSwapPathLength::get() + } + + fn swap_exact_tokens_for_tokens( + path: Vec, + credit_in: Self::Credit, + amount_out_min: Option, + ) -> Result { + with_transaction(|| -> TransactionOutcome> { + let res = Self::do_swap_exact_credit_tokens_for_tokens(path, credit_in, amount_out_min); + match &res { + Ok(_) => TransactionOutcome::Commit(Ok(res)), + // wrapping `res` with `Ok`, since our `Err` doesn't satisfy the + // `From` bound of the `with_transaction` function. + Err(_) => TransactionOutcome::Rollback(Ok(res)), + } + }) + // should never map an error since `with_transaction` above never returns it. + .map_err(|_| (Self::Credit::native_zero(), DispatchError::Corruption))? + } + + fn swap_tokens_for_exact_tokens( + path: Vec, + credit_in: Self::Credit, + amount_out: Self::Balance, + ) -> Result<(Self::Credit, Self::Credit), (Self::Credit, DispatchError)> { + with_transaction(|| -> TransactionOutcome> { + let res = Self::do_swap_credit_tokens_for_exact_tokens(path, credit_in, amount_out); + match &res { + Ok(_) => TransactionOutcome::Commit(Ok(res)), + // wrapping `res` with `Ok`, since our `Err` doesn't satisfy the + // `From` bound of the `with_transaction` function. + Err(_) => TransactionOutcome::Rollback(Ok(res)), + } + }) + // should never map an error since `with_transaction` above never returns it. + .map_err(|_| (Self::Credit::native_zero(), DispatchError::Corruption))? + } +} diff --git a/substrate/frame/asset-conversion/src/tests.rs b/substrate/frame/asset-conversion/src/tests.rs index 1c1267ab87b..db6aca01dec 100644 --- a/substrate/frame/asset-conversion/src/tests.rs +++ b/substrate/frame/asset-conversion/src/tests.rs @@ -17,9 +17,9 @@ use crate::{mock::*, *}; use frame_support::{ - assert_noop, assert_ok, + assert_noop, assert_ok, assert_storage_noop, instances::Instance1, - traits::{fungible::Inspect, fungibles::InspectEnumerable, Get}, + traits::{fungible, fungibles, fungibles::InspectEnumerable, Get}, }; use sp_arithmetic::Permill; use sp_runtime::{DispatchError, TokenError}; @@ -65,13 +65,17 @@ fn pool_assets() -> Vec { } fn create_tokens(owner: u128, tokens: Vec>) { + create_tokens_with_ed(owner, tokens, 1) +} + +fn create_tokens_with_ed(owner: u128, tokens: Vec>, ed: u128) { for token_id in tokens { let MultiAssetIdConversionResult::Converted(asset_id) = NativeOrAssetIdConverter::try_convert(&token_id) else { unreachable!("invalid token") }; - assert_ok!(Assets::force_create(RuntimeOrigin::root(), asset_id, owner, false, 1)); + assert_ok!(Assets::force_create(RuntimeOrigin::root(), asset_id, owner, false, ed)); } } @@ -91,8 +95,8 @@ fn get_ed() -> u128 { } macro_rules! bvec { - ($( $x:tt )*) => { - vec![$( $x )*].try_into().unwrap() + ($( $x:ident ),*) => { + vec![$( Box::new( $x ), )*] } } @@ -145,7 +149,11 @@ fn can_create_pool() { let lp_token = AssetConversion::get_next_pool_asset_id(); assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 1000)); - assert_ok!(AssetConversion::create_pool(RuntimeOrigin::signed(user), token_2, token_1)); + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(user), + Box::new(token_2), + Box::new(token_1) + )); let setup_fee = <::PoolSetupFee as Get<::Balance>>::get(); let pool_account = <::PoolSetupFeeReceiver as Get>::get(); @@ -170,24 +178,40 @@ fn can_create_pool() { assert_eq!(pool_assets(), vec![lp_token]); assert_noop!( - AssetConversion::create_pool(RuntimeOrigin::signed(user), token_1, token_1), + AssetConversion::create_pool( + RuntimeOrigin::signed(user), + Box::new(token_1), + Box::new(token_1) + ), Error::::EqualAssets ); assert_noop!( - AssetConversion::create_pool(RuntimeOrigin::signed(user), token_2, token_2), + AssetConversion::create_pool( + RuntimeOrigin::signed(user), + Box::new(token_2), + Box::new(token_2) + ), Error::::EqualAssets ); // validate we can create Asset(1)/Asset(2) pool let token_1 = NativeOrAssetId::Asset(1); create_tokens(user, vec![token_1]); - assert_ok!(AssetConversion::create_pool(RuntimeOrigin::signed(user), token_1, token_2)); + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(user), + Box::new(token_1), + Box::new(token_2) + )); // validate we can force the first asset to be the Native currency only AllowMultiAssetPools::set(&false); let token_1 = NativeOrAssetId::Asset(3); assert_noop!( - AssetConversion::create_pool(RuntimeOrigin::signed(user), token_1, token_2), + AssetConversion::create_pool( + RuntimeOrigin::signed(user), + Box::new(token_1), + Box::new(token_2) + ), Error::::PoolMustContainNativeCurrency ); }); @@ -203,19 +227,31 @@ fn create_same_pool_twice_should_fail() { create_tokens(user, vec![token_2]); let lp_token = AssetConversion::get_next_pool_asset_id(); - assert_ok!(AssetConversion::create_pool(RuntimeOrigin::signed(user), token_2, token_1)); + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(user), + Box::new(token_2), + Box::new(token_1) + )); let expected_free = lp_token + 1; assert_eq!(expected_free, AssetConversion::get_next_pool_asset_id()); assert_noop!( - AssetConversion::create_pool(RuntimeOrigin::signed(user), token_2, token_1), + AssetConversion::create_pool( + RuntimeOrigin::signed(user), + Box::new(token_2), + Box::new(token_1) + ), Error::::PoolExists ); assert_eq!(expected_free, AssetConversion::get_next_pool_asset_id()); // Try switching the same tokens around: assert_noop!( - AssetConversion::create_pool(RuntimeOrigin::signed(user), token_1, token_2), + AssetConversion::create_pool( + RuntimeOrigin::signed(user), + Box::new(token_1), + Box::new(token_2) + ), Error::::PoolExists ); assert_eq!(expected_free, AssetConversion::get_next_pool_asset_id()); @@ -235,7 +271,11 @@ fn different_pools_should_have_different_lp_tokens() { create_tokens(user, vec![token_2, token_3]); let lp_token2_1 = AssetConversion::get_next_pool_asset_id(); - assert_ok!(AssetConversion::create_pool(RuntimeOrigin::signed(user), token_2, token_1)); + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(user), + Box::new(token_2), + Box::new(token_1) + )); let lp_token3_1 = AssetConversion::get_next_pool_asset_id(); assert_eq!( @@ -248,7 +288,11 @@ fn different_pools_should_have_different_lp_tokens() { }] ); - assert_ok!(AssetConversion::create_pool(RuntimeOrigin::signed(user), token_3, token_1)); + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(user), + Box::new(token_3), + Box::new(token_1) + )); assert_eq!( events(), [Event::::PoolCreated { @@ -273,9 +317,17 @@ fn can_add_liquidity() { create_tokens(user, vec![token_2, token_3]); let lp_token1 = AssetConversion::get_next_pool_asset_id(); - assert_ok!(AssetConversion::create_pool(RuntimeOrigin::signed(user), token_1, token_2)); + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(user), + Box::new(token_1), + Box::new(token_2) + )); let lp_token2 = AssetConversion::get_next_pool_asset_id(); - assert_ok!(AssetConversion::create_pool(RuntimeOrigin::signed(user), token_1, token_3)); + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(user), + Box::new(token_1), + Box::new(token_3) + )); let ed = get_ed(); assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 10000 * 2 + ed)); @@ -284,8 +336,8 @@ fn can_add_liquidity() { assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - token_1, - token_2, + Box::new(token_1), + Box::new(token_2), 10000, 10, 10000, @@ -313,8 +365,8 @@ fn can_add_liquidity() { // try to pass the non-native - native assets, the result should be the same assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - token_3, - token_1, + Box::new(token_3), + Box::new(token_1), 10, 10000, 10, @@ -349,7 +401,11 @@ fn add_tiny_liquidity_leads_to_insufficient_liquidity_minted_error() { let token_2 = NativeOrAssetId::Asset(2); create_tokens(user, vec![token_2]); - assert_ok!(AssetConversion::create_pool(RuntimeOrigin::signed(user), token_1, token_2)); + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(user), + Box::new(token_1), + Box::new(token_2) + )); assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 1000)); assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, user, 1000)); @@ -357,8 +413,8 @@ fn add_tiny_liquidity_leads_to_insufficient_liquidity_minted_error() { assert_noop!( AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - token_1, - token_2, + Box::new(token_1), + Box::new(token_2), 1, 1, 1, @@ -371,8 +427,8 @@ fn add_tiny_liquidity_leads_to_insufficient_liquidity_minted_error() { assert_noop!( AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - token_1, - token_2, + Box::new(token_1), + Box::new(token_2), get_ed(), 1, 1, @@ -393,8 +449,16 @@ fn add_tiny_liquidity_directly_to_pool_address() { let token_3 = NativeOrAssetId::Asset(3); create_tokens(user, vec![token_2, token_3]); - assert_ok!(AssetConversion::create_pool(RuntimeOrigin::signed(user), token_1, token_2)); - assert_ok!(AssetConversion::create_pool(RuntimeOrigin::signed(user), token_1, token_3)); + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(user), + Box::new(token_1), + Box::new(token_2) + )); + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(user), + Box::new(token_1), + Box::new(token_3) + )); let ed = get_ed(); assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 10000 * 2 + ed)); @@ -407,8 +471,8 @@ fn add_tiny_liquidity_directly_to_pool_address() { assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - token_1, - token_2, + Box::new(token_1), + Box::new(token_2), 10000, 10, 10000, @@ -421,8 +485,8 @@ fn add_tiny_liquidity_directly_to_pool_address() { assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, pallet_account, 1)); assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - token_1, - token_3, + Box::new(token_1), + Box::new(token_3), 10000, 10, 10000, @@ -442,15 +506,25 @@ fn can_remove_liquidity() { create_tokens(user, vec![token_2]); let lp_token = AssetConversion::get_next_pool_asset_id(); - assert_ok!(AssetConversion::create_pool(RuntimeOrigin::signed(user), token_1, token_2)); + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(user), + Box::new(token_1), + Box::new(token_2) + )); - assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 10000000000)); - assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, user, 100000)); + let ed_token_1 = >::minimum_balance(); + let ed_token_2 = >::minimum_balance(2); + assert_ok!(Balances::force_set_balance( + RuntimeOrigin::root(), + user, + 10000000000 + ed_token_1 + )); + assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, user, 100000 + ed_token_2)); assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - token_1, - token_2, + Box::new(token_1), + Box::new(token_2), 1000000000, 100000, 1000000000, @@ -463,8 +537,8 @@ fn can_remove_liquidity() { assert_ok!(AssetConversion::remove_liquidity( RuntimeOrigin::signed(user), - token_1, - token_2, + Box::new(token_1), + Box::new(token_2), total_lp_received, 0, 0, @@ -487,8 +561,8 @@ fn can_remove_liquidity() { assert_eq!(balance(pool_account, token_2), 10001); assert_eq!(pool_balance(pool_account, lp_token), 100); - assert_eq!(balance(user, token_1), 10000000000 - 1000000000 + 899991000); - assert_eq!(balance(user, token_2), 89999); + assert_eq!(balance(user, token_1), 10000000000 - 1000000000 + 899991000 + ed_token_1); + assert_eq!(balance(user, token_2), 89999 + ed_token_2); assert_eq!(pool_balance(user, lp_token), 0); }); } @@ -502,15 +576,19 @@ fn can_not_redeem_more_lp_tokens_than_were_minted() { let lp_token = AssetConversion::get_next_pool_asset_id(); create_tokens(user, vec![token_2]); - assert_ok!(AssetConversion::create_pool(RuntimeOrigin::signed(user), token_1, token_2)); + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(user), + Box::new(token_1), + Box::new(token_2) + )); assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 10000 + get_ed())); assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, user, 1000)); assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - token_1, - token_2, + Box::new(token_1), + Box::new(token_2), 10000, 10, 10000, @@ -524,8 +602,8 @@ fn can_not_redeem_more_lp_tokens_than_were_minted() { assert_noop!( AssetConversion::remove_liquidity( RuntimeOrigin::signed(user), - token_1, - token_2, + Box::new(token_1), + Box::new(token_2), 216 + 1, // Try and redeem 10 lp tokens while only 9 minted. 0, 0, @@ -544,15 +622,19 @@ fn can_quote_price() { let token_2 = NativeOrAssetId::Asset(2); create_tokens(user, vec![token_2]); - assert_ok!(AssetConversion::create_pool(RuntimeOrigin::signed(user), token_1, token_2)); + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(user), + Box::new(token_1), + Box::new(token_2) + )); assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 100000)); assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, user, 1000)); assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - token_1, - token_2, + Box::new(token_1), + Box::new(token_2), 10000, 200, 1, @@ -765,15 +847,19 @@ fn quote_price_exact_tokens_for_tokens_matches_execution() { let token_2 = NativeOrAssetId::Asset(2); create_tokens(user, vec![token_2]); - assert_ok!(AssetConversion::create_pool(RuntimeOrigin::signed(user), token_1, token_2)); + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(user), + Box::new(token_1), + Box::new(token_2) + )); assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 100000)); assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, user, 1000)); assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - token_1, - token_2, + Box::new(token_1), + Box::new(token_2), 10000, 200, 1, @@ -813,15 +899,19 @@ fn quote_price_tokens_for_exact_tokens_matches_execution() { let token_2 = NativeOrAssetId::Asset(2); create_tokens(user, vec![token_2]); - assert_ok!(AssetConversion::create_pool(RuntimeOrigin::signed(user), token_1, token_2)); + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(user), + Box::new(token_1), + Box::new(token_2) + )); assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 100000)); assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, user, 1000)); assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - token_1, - token_2, + Box::new(token_1), + Box::new(token_2), 10000, 200, 1, @@ -864,7 +954,11 @@ fn can_swap_with_native() { let pool_id = (token_1, token_2); create_tokens(user, vec![token_2]); - assert_ok!(AssetConversion::create_pool(RuntimeOrigin::signed(user), token_1, token_2)); + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(user), + Box::new(token_1), + Box::new(token_2) + )); let ed = get_ed(); assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 10000 + ed)); @@ -875,8 +969,8 @@ fn can_swap_with_native() { assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - token_1, - token_2, + Box::new(token_1), + Box::new(token_2), liquidity1, liquidity2, 1, @@ -914,7 +1008,11 @@ fn can_swap_with_realistic_values() { let dot = NativeOrAssetId::Native; let usd = NativeOrAssetId::Asset(2); create_tokens(user, vec![usd]); - assert_ok!(AssetConversion::create_pool(RuntimeOrigin::signed(user), dot, usd)); + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(user), + Box::new(dot), + Box::new(usd) + )); const UNIT: u128 = 1_000_000_000; @@ -925,8 +1023,8 @@ fn can_swap_with_realistic_values() { let liquidity_usd = 1_000_000 * UNIT; assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - dot, - usd, + Box::new(dot), + Box::new(usd), liquidity_dot, liquidity_usd, 1, @@ -948,9 +1046,9 @@ fn can_swap_with_realistic_values() { assert!(events().contains(&Event::::SwapExecuted { who: user, send_to: user, - path: bvec![usd, dot], amount_in: 10 * UNIT, // usd amount_out: 1_993_980_120, // About 2 dot after div by UNIT. + path: vec![(usd, 10 * UNIT), (dot, 1_993_980_120)], })); }); } @@ -963,7 +1061,11 @@ fn can_not_swap_in_pool_with_no_liquidity_added_yet() { let token_2 = NativeOrAssetId::Asset(2); create_tokens(user, vec![token_2]); - assert_ok!(AssetConversion::create_pool(RuntimeOrigin::signed(user), token_1, token_2)); + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(user), + Box::new(token_1), + Box::new(token_2) + )); // Check can't swap an empty pool assert_noop!( @@ -990,7 +1092,11 @@ fn check_no_panic_when_try_swap_close_to_empty_pool() { let lp_token = AssetConversion::get_next_pool_asset_id(); create_tokens(user, vec![token_2]); - assert_ok!(AssetConversion::create_pool(RuntimeOrigin::signed(user), token_1, token_2)); + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(user), + Box::new(token_1), + Box::new(token_2) + )); let ed = get_ed(); assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 10000 + ed)); @@ -1001,8 +1107,8 @@ fn check_no_panic_when_try_swap_close_to_empty_pool() { assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - token_1, - token_2, + Box::new(token_1), + Box::new(token_2), liquidity1, liquidity2, 1, @@ -1027,8 +1133,8 @@ fn check_no_panic_when_try_swap_close_to_empty_pool() { assert_ok!(AssetConversion::remove_liquidity( RuntimeOrigin::signed(user), - token_1, - token_2, + Box::new(token_1), + Box::new(token_2), lp_token_minted, 1, 1, @@ -1050,7 +1156,7 @@ fn check_no_panic_when_try_swap_close_to_empty_pool() { user, false, ), - Error::::ReserveLeftLessThanMinimal + TokenError::NotExpendable, ); assert_ok!(AssetConversion::swap_tokens_for_exact_tokens( @@ -1109,7 +1215,11 @@ fn swap_should_not_work_if_too_much_slippage() { let token_2 = NativeOrAssetId::Asset(2); create_tokens(user, vec![token_2]); - assert_ok!(AssetConversion::create_pool(RuntimeOrigin::signed(user), token_1, token_2)); + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(user), + Box::new(token_1), + Box::new(token_2) + )); assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 10000 + get_ed())); assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, user, 1000)); @@ -1119,8 +1229,8 @@ fn swap_should_not_work_if_too_much_slippage() { assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - token_1, - token_2, + Box::new(token_1), + Box::new(token_2), liquidity1, liquidity2, 1, @@ -1153,7 +1263,11 @@ fn can_swap_tokens_for_exact_tokens() { let pool_id = (token_1, token_2); create_tokens(user, vec![token_2]); - assert_ok!(AssetConversion::create_pool(RuntimeOrigin::signed(user), token_1, token_2)); + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(user), + Box::new(token_1), + Box::new(token_2) + )); let ed = get_ed(); assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 20000 + ed)); @@ -1168,8 +1282,8 @@ fn can_swap_tokens_for_exact_tokens() { assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - token_1, - token_2, + Box::new(token_1), + Box::new(token_2), liquidity1, liquidity2, 1, @@ -1215,7 +1329,11 @@ fn can_swap_tokens_for_exact_tokens_when_not_liquidity_provider() { let lp_token = AssetConversion::get_next_pool_asset_id(); create_tokens(user2, vec![token_2]); - assert_ok!(AssetConversion::create_pool(RuntimeOrigin::signed(user2), token_1, token_2)); + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(user2), + Box::new(token_1), + Box::new(token_2) + )); let ed = get_ed(); let base1 = 10000; @@ -1235,8 +1353,8 @@ fn can_swap_tokens_for_exact_tokens_when_not_liquidity_provider() { assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user2), - token_1, - token_2, + Box::new(token_1), + Box::new(token_2), liquidity1, liquidity2, 1, @@ -1283,8 +1401,8 @@ fn can_swap_tokens_for_exact_tokens_when_not_liquidity_provider() { assert_ok!(AssetConversion::remove_liquidity( RuntimeOrigin::signed(user2), - token_1, - token_2, + Box::new(token_1), + Box::new(token_2), lp_token_minted, 0, 0, @@ -1302,17 +1420,22 @@ fn swap_when_existential_deposit_would_cause_reaping_but_keep_alive_set() { let token_2 = NativeOrAssetId::Asset(2); create_tokens(user2, vec![token_2]); - assert_ok!(AssetConversion::create_pool(RuntimeOrigin::signed(user2), token_1, token_2)); + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(user2), + Box::new(token_1), + Box::new(token_2) + )); let ed = get_ed(); assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 101)); assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user2, 10000 + ed)); assert_ok!(Assets::mint(RuntimeOrigin::signed(user2), 2, user2, 1000)); + assert_ok!(Assets::mint(RuntimeOrigin::signed(user2), 2, user, 2)); assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user2), - token_1, - token_2, + Box::new(token_1), + Box::new(token_2), 10000, 200, 1, @@ -1343,6 +1466,197 @@ fn swap_when_existential_deposit_would_cause_reaping_but_keep_alive_set() { ), DispatchError::Token(TokenError::NotExpendable) ); + + assert_noop!( + AssetConversion::swap_tokens_for_exact_tokens( + RuntimeOrigin::signed(user), + bvec![token_2, token_1], + 51, // amount_out + 2, // amount_in_max + user, + true, + ), + DispatchError::Token(TokenError::NotExpendable) + ); + + assert_noop!( + AssetConversion::swap_exact_tokens_for_tokens( + RuntimeOrigin::signed(user), + bvec![token_2, token_1], + 2, // amount_in + 1, // amount_out_min + user, + true, + ), + DispatchError::Token(TokenError::NotExpendable) + ); + }); +} + +#[test] +fn swap_when_existential_deposit_would_cause_reaping_pool_account() { + new_test_ext().execute_with(|| { + let user = 1; + let user2 = 2; + let token_1 = NativeOrAssetId::Native; + let token_2 = NativeOrAssetId::Asset(2); + let token_3 = NativeOrAssetId::Asset(3); + + let ed_assets = 100; + create_tokens_with_ed(user2, vec![token_2, token_3], ed_assets); + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(user2), + Box::new(token_1), + Box::new(token_2) + )); + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(user2), + Box::new(token_1), + Box::new(token_3) + )); + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(user2), + Box::new(token_2), + Box::new(token_3) + )); + + let ed = get_ed(); + assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 20000 + ed)); + assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user2, 20000 + ed)); + assert_ok!(Assets::mint(RuntimeOrigin::signed(user2), 2, user2, 400 + ed_assets)); + assert_ok!(Assets::mint(RuntimeOrigin::signed(user2), 3, user2, 20000 + ed_assets)); + + assert_ok!(Assets::mint(RuntimeOrigin::signed(user2), 2, user, 400 + ed_assets)); + assert_ok!(Assets::mint(RuntimeOrigin::signed(user2), 3, user, 20000 + ed_assets)); + + assert_ok!(AssetConversion::add_liquidity( + RuntimeOrigin::signed(user2), + Box::new(token_1), + Box::new(token_2), + 10000, + 200, + 1, + 1, + user2, + )); + + assert_ok!(AssetConversion::add_liquidity( + RuntimeOrigin::signed(user2), + Box::new(token_1), + Box::new(token_3), + 200, + 10000, + 1, + 1, + user2, + )); + + assert_ok!(AssetConversion::add_liquidity( + RuntimeOrigin::signed(user2), + Box::new(token_2), + Box::new(token_3), + 200, + 10000, + 1, + 1, + user2, + )); + + // causes an account removal for asset token 2 + assert_noop!( + AssetConversion::swap_tokens_for_exact_tokens( + RuntimeOrigin::signed(user), + bvec![token_1, token_2], + 110, // amount_out + 20000, // amount_in_max + user, + true, + ), + DispatchError::Token(TokenError::NotExpendable) + ); + + // causes an account removal for asset token 2 + assert_noop!( + AssetConversion::swap_exact_tokens_for_tokens( + RuntimeOrigin::signed(user), + bvec![token_1, token_2], + 15000, // amount_in + 110, // amount_out_min + user, + true, + ), + DispatchError::Token(TokenError::NotExpendable) + ); + + // causes an account removal for native token 1 + assert_noop!( + AssetConversion::swap_tokens_for_exact_tokens( + RuntimeOrigin::signed(user), + bvec![token_3, token_1], + 110, // amount_out + 20000, // amount_in_max + user, + true, + ), + DispatchError::Token(TokenError::NotExpendable) + ); + + // causes an account removal for native token 1 + assert_noop!( + AssetConversion::swap_exact_tokens_for_tokens( + RuntimeOrigin::signed(user), + bvec![token_3, token_1], + 15000, // amount_in + 110, // amount_out_min + user, + true, + ), + DispatchError::Token(TokenError::NotExpendable) + ); + + // causes an account removal for native token 1 locate in the middle of a swap path + let amount_in = AssetConversion::balance_path_from_amount_out( + 110, + vec![token_3, token_1].try_into().unwrap(), + ) + .unwrap() + .first() + .map(|(_, a)| *a) + .unwrap(); + + assert_noop!( + AssetConversion::swap_exact_tokens_for_tokens( + RuntimeOrigin::signed(user), + bvec![token_3, token_1, token_2], + amount_in, // amount_in + 1, // amount_out_min + user, + true, + ), + DispatchError::Token(TokenError::NotExpendable) + ); + + // causes an account removal for asset token 2 locate in the middle of a swap path + let amount_in = AssetConversion::balance_path_from_amount_out( + 110, + vec![token_1, token_2].try_into().unwrap(), + ) + .unwrap() + .first() + .map(|(_, a)| *a) + .unwrap(); + + assert_noop!( + AssetConversion::swap_exact_tokens_for_tokens( + RuntimeOrigin::signed(user), + bvec![token_1, token_2, token_3], + amount_in, // amount_in + 1, // amount_out_min + user, + true, + ), + DispatchError::Token(TokenError::NotExpendable) + ); }); } @@ -1354,7 +1668,11 @@ fn swap_tokens_for_exact_tokens_should_not_work_if_too_much_slippage() { let token_2 = NativeOrAssetId::Asset(2); create_tokens(user, vec![token_2]); - assert_ok!(AssetConversion::create_pool(RuntimeOrigin::signed(user), token_1, token_2)); + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(user), + Box::new(token_1), + Box::new(token_2) + )); assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 20000 + get_ed())); assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, user, 1000)); @@ -1364,8 +1682,8 @@ fn swap_tokens_for_exact_tokens_should_not_work_if_too_much_slippage() { assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - token_1, - token_2, + Box::new(token_1), + Box::new(token_2), liquidity1, liquidity2, 1, @@ -1398,8 +1716,16 @@ fn swap_exact_tokens_for_tokens_in_multi_hops() { let token_3 = NativeOrAssetId::Asset(3); create_tokens(user, vec![token_2, token_3]); - assert_ok!(AssetConversion::create_pool(RuntimeOrigin::signed(user), token_1, token_2)); - assert_ok!(AssetConversion::create_pool(RuntimeOrigin::signed(user), token_2, token_3)); + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(user), + Box::new(token_1), + Box::new(token_2) + )); + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(user), + Box::new(token_2), + Box::new(token_3) + )); let ed = get_ed(); let base1 = 10000; @@ -1414,8 +1740,8 @@ fn swap_exact_tokens_for_tokens_in_multi_hops() { assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - token_1, - token_2, + Box::new(token_1), + Box::new(token_2), liquidity1, liquidity2, 1, @@ -1424,8 +1750,8 @@ fn swap_exact_tokens_for_tokens_in_multi_hops() { )); assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - token_2, - token_3, + Box::new(token_2), + Box::new(token_3), liquidity2, liquidity3, 1, @@ -1497,8 +1823,16 @@ fn swap_tokens_for_exact_tokens_in_multi_hops() { let token_3 = NativeOrAssetId::Asset(3); create_tokens(user, vec![token_2, token_3]); - assert_ok!(AssetConversion::create_pool(RuntimeOrigin::signed(user), token_1, token_2)); - assert_ok!(AssetConversion::create_pool(RuntimeOrigin::signed(user), token_2, token_3)); + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(user), + Box::new(token_1), + Box::new(token_2) + )); + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(user), + Box::new(token_2), + Box::new(token_3) + )); let ed = get_ed(); let base1 = 10000; @@ -1513,8 +1847,8 @@ fn swap_tokens_for_exact_tokens_in_multi_hops() { assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - token_1, - token_2, + Box::new(token_1), + Box::new(token_2), liquidity1, liquidity2, 1, @@ -1523,8 +1857,8 @@ fn swap_tokens_for_exact_tokens_in_multi_hops() { )); assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - token_2, - token_3, + Box::new(token_2), + Box::new(token_3), liquidity2, liquidity3, 1, @@ -1568,6 +1902,7 @@ fn can_not_swap_same_asset() { new_test_ext().execute_with(|| { let user = 1; let token_1 = NativeOrAssetId::Asset(1); + let token_2 = NativeOrAssetId::Native; create_tokens(user, vec![token_1]); assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 1, user, 1000)); @@ -1577,8 +1912,8 @@ fn can_not_swap_same_asset() { assert_noop!( AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - token_1, - token_1, + Box::new(token_1), + Box::new(token_1), liquidity1, liquidity2, 1, @@ -1604,7 +1939,7 @@ fn can_not_swap_same_asset() { assert_noop!( AssetConversion::swap_exact_tokens_for_tokens( RuntimeOrigin::signed(user), - bvec![NativeOrAssetId::Native, NativeOrAssetId::Native], + bvec![token_2, token_2], exchange_amount, 1, user, @@ -1664,7 +1999,11 @@ fn cannot_block_pool_creation() { // User can still create the pool create_tokens(user, vec![token_2]); - assert_ok!(AssetConversion::create_pool(RuntimeOrigin::signed(user), token_1, token_2)); + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(user), + Box::new(token_1), + Box::new(token_2) + )); // User has to transfer one Asset(2) token to the pool account (otherwise add_liquidity will // fail with `AssetTwoDepositDidNotMeetMinimum`) @@ -1675,8 +2014,8 @@ fn cannot_block_pool_creation() { // add_liquidity shouldn't fail because of the number of consumers assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - token_1, - token_2, + Box::new(token_1), + Box::new(token_2), 10000, 100, 10000, @@ -1685,3 +2024,429 @@ fn cannot_block_pool_creation() { )); }); } + +#[test] +fn swap_transactional() { + new_test_ext().execute_with(|| { + let user = 1; + let user2 = 2; + let token_1 = NativeOrAssetId::Native; + let token_2 = NativeOrAssetId::Asset(2); + let token_3 = NativeOrAssetId::Asset(3); + + let asset_ed = 150; + create_tokens_with_ed(user, vec![token_2, token_3], asset_ed); + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(user), + Box::new(token_1), + Box::new(token_2) + )); + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(user), + Box::new(token_1), + Box::new(token_3) + )); + + let ed = get_ed(); + assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 20000 + ed)); + assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, user, 1000)); + assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 3, user, 1000)); + + assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user2, 20000 + ed)); + assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, user2, 1000)); + assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 3, user2, 1000)); + + let liquidity1 = 10000; + let liquidity2 = 200; + + assert_ok!(AssetConversion::add_liquidity( + RuntimeOrigin::signed(user), + Box::new(token_1), + Box::new(token_2), + liquidity1, + liquidity2, + 1, + 1, + user, + )); + + assert_ok!(AssetConversion::add_liquidity( + RuntimeOrigin::signed(user), + Box::new(token_1), + Box::new(token_3), + liquidity1, + liquidity2, + 1, + 1, + user, + )); + + let pool_1 = AssetConversion::get_pool_account(&(token_1, token_2)); + let pool_2 = AssetConversion::get_pool_account(&(token_1, token_3)); + + assert_eq!(Balances::balance(&pool_1), liquidity1); + assert_eq!(Assets::balance(2, &pool_1), liquidity2); + assert_eq!(Balances::balance(&pool_2), liquidity1); + assert_eq!(Assets::balance(3, &pool_2), liquidity2); + + // the amount that would cause a transfer from the last pool in the path to fail + let expected_out = liquidity2 - asset_ed + 1; + let amount_in = AssetConversion::balance_path_from_amount_out( + expected_out, + vec![token_2, token_1, token_3].try_into().unwrap(), + ) + .unwrap() + .first() + .map(|(_, a)| *a) + .unwrap(); + + // swap credit with `swap_tokens_for_exact_tokens` transactional + let credit_in = Assets::issue(2, amount_in); + let credit_in_err_expected = Assets::issue(2, amount_in); + // avoiding drop of any credit, to assert any storage mutation from an actual call. + let error; + assert_storage_noop!( + error = >::swap_tokens_for_exact_tokens( + vec![token_2, token_1, token_3], + credit_in.into(), + expected_out, + ) + .unwrap_err() + ); + assert_eq!(error, (credit_in_err_expected.into(), TokenError::NotExpendable.into())); + + // swap credit with `swap_exact_tokens_for_tokens` transactional + let credit_in = Assets::issue(2, amount_in); + let credit_in_err_expected = Assets::issue(2, amount_in); + // avoiding drop of any credit, to assert any storage mutation from an actual call. + let error; + assert_storage_noop!( + error = >::swap_exact_tokens_for_tokens( + vec![token_2, token_1, token_3], + credit_in.into(), + Some(expected_out), + ) + .unwrap_err() + ); + assert_eq!(error, (credit_in_err_expected.into(), TokenError::NotExpendable.into())); + + // swap with `swap_exact_tokens_for_tokens` transactional + assert_noop!( + >::swap_exact_tokens_for_tokens( + user2, + vec![token_2, token_1, token_3], + amount_in.into(), + Some(expected_out.into()), + user2, + true, + ), + TokenError::NotExpendable + ); + + // swap with `swap_exact_tokens_for_tokens` transactional + assert_noop!( + >::swap_tokens_for_exact_tokens( + user2, + vec![token_2, token_1, token_3], + expected_out.into(), + Some(amount_in.into()), + user2, + true, + ), + TokenError::NotExpendable + ); + + assert_eq!(Balances::balance(&pool_1), liquidity1); + assert_eq!(Assets::balance(2, &pool_1), liquidity2); + assert_eq!(Balances::balance(&pool_2), liquidity1); + assert_eq!(Assets::balance(3, &pool_2), liquidity2); + }) +} + +#[test] +fn swap_credit_returns_change() { + new_test_ext().execute_with(|| { + let user = 1; + let token_1 = NativeOrAssetId::Native; + let token_2 = NativeOrAssetId::Asset(2); + + create_tokens(user, vec![token_2]); + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(user), + Box::new(token_1), + Box::new(token_2) + )); + + let ed = get_ed(); + assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 20000 + ed)); + assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, user, 1000)); + + let liquidity1 = 10000; + let liquidity2 = 200; + + assert_ok!(AssetConversion::add_liquidity( + RuntimeOrigin::signed(user), + Box::new(token_1), + Box::new(token_2), + liquidity1, + liquidity2, + 1, + 1, + user, + )); + + let expected_change = Balances::issue(100); + let expected_credit_out = Assets::issue(2, 20); + + let amount_in_max = + AssetConversion::get_amount_in(&expected_credit_out.peek(), &liquidity1, &liquidity2) + .unwrap(); + + let credit_in = Balances::issue(amount_in_max + expected_change.peek()); + assert_ok!( + >::swap_tokens_for_exact_tokens( + vec![token_1, token_2], + credit_in.into(), + expected_credit_out.peek(), + ), + (expected_credit_out.into(), expected_change.into()) + ); + }) +} + +#[test] +fn swap_credit_insufficient_amount_bounds() { + new_test_ext().execute_with(|| { + let user = 1; + let user2 = 2; + let token_1 = NativeOrAssetId::Native; + let token_2 = NativeOrAssetId::Asset(2); + + create_tokens(user, vec![token_2]); + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(user), + Box::new(token_1), + Box::new(token_2) + )); + + let ed = get_ed(); + assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 20000 + ed)); + assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, user, 1000)); + + assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user2, 20000 + ed)); + assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, user2, 1000)); + + let liquidity1 = 10000; + let liquidity2 = 200; + + assert_ok!(AssetConversion::add_liquidity( + RuntimeOrigin::signed(user), + Box::new(token_1), + Box::new(token_2), + liquidity1, + liquidity2, + 1, + 1, + user, + )); + + // provided `credit_in` is not sufficient to swap for desired `amount_out_min` + let amount_out_min = 20; + let amount_in = + AssetConversion::get_amount_in(&(amount_out_min - 1), &liquidity2, &liquidity1) + .unwrap(); + let credit_in = Balances::issue(amount_in); + let expected_credit_in = Balances::issue(amount_in); + let error = >::swap_exact_tokens_for_tokens( + vec![token_1, token_2], + credit_in.into(), + Some(amount_out_min), + ) + .unwrap_err(); + assert_eq!( + error, + (expected_credit_in.into(), Error::::ProvidedMinimumNotSufficientForSwap.into()) + ); + + // provided `credit_in` is not sufficient to swap for desired `amount_out` + let amount_out = 20; + let amount_in_max = + AssetConversion::get_amount_in(&(amount_out - 1), &liquidity2, &liquidity1).unwrap(); + let credit_in = Balances::issue(amount_in_max); + let expected_credit_in = Balances::issue(amount_in_max); + let error = >::swap_tokens_for_exact_tokens( + vec![token_1, token_2], + credit_in.into(), + amount_out, + ) + .unwrap_err(); + assert_eq!( + error, + (expected_credit_in.into(), Error::::ProvidedMaximumNotSufficientForSwap.into()) + ); + }) +} + +#[test] +fn swap_credit_zero_amount() { + new_test_ext().execute_with(|| { + let user = 1; + let user2 = 2; + let token_1 = NativeOrAssetId::Native; + let token_2 = NativeOrAssetId::Asset(2); + + create_tokens(user, vec![token_2]); + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(user), + Box::new(token_1), + Box::new(token_2) + )); + + let ed = get_ed(); + assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 20000 + ed)); + assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, user, 1000)); + + assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user2, 20000 + ed)); + assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, user2, 1000)); + + let liquidity1 = 10000; + let liquidity2 = 200; + + assert_ok!(AssetConversion::add_liquidity( + RuntimeOrigin::signed(user), + Box::new(token_1), + Box::new(token_2), + liquidity1, + liquidity2, + 1, + 1, + user, + )); + + // swap with zero credit fails for `swap_exact_tokens_for_tokens` + let credit_in = Credit::native_zero(); + let expected_credit_in = Credit::native_zero(); + let error = >::swap_exact_tokens_for_tokens( + vec![token_1, token_2], + credit_in, + None, + ) + .unwrap_err(); + assert_eq!(error, (expected_credit_in, Error::::ZeroAmount.into())); + + // swap with zero credit fails for `swap_tokens_for_exact_tokens` + let credit_in = Credit::native_zero(); + let expected_credit_in = Credit::native_zero(); + let error = >::swap_tokens_for_exact_tokens( + vec![token_1, token_2], + credit_in, + 10, + ) + .unwrap_err(); + assert_eq!(error, (expected_credit_in, Error::::ZeroAmount.into())); + + // swap with zero amount_out_min fails for `swap_exact_tokens_for_tokens` + let credit_in = Balances::issue(10); + let expected_credit_in = Balances::issue(10); + let error = >::swap_exact_tokens_for_tokens( + vec![token_1, token_2], + credit_in.into(), + Some(0), + ) + .unwrap_err(); + assert_eq!(error, (expected_credit_in.into(), Error::::ZeroAmount.into())); + + // swap with zero amount_out fails with `swap_tokens_for_exact_tokens` fails + let credit_in = Balances::issue(10); + let expected_credit_in = Balances::issue(10); + let error = >::swap_tokens_for_exact_tokens( + vec![token_1, token_2], + credit_in.into(), + 0, + ) + .unwrap_err(); + assert_eq!(error, (expected_credit_in.into(), Error::::ZeroAmount.into())); + }); +} + +#[test] +fn swap_credit_invalid_path() { + new_test_ext().execute_with(|| { + let user = 1; + let user2 = 2; + let token_1 = NativeOrAssetId::Native; + let token_2 = NativeOrAssetId::Asset(2); + + create_tokens(user, vec![token_2]); + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(user), + Box::new(token_1), + Box::new(token_2) + )); + + let ed = get_ed(); + assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 20000 + ed)); + assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, user, 1000)); + + assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user2, 20000 + ed)); + assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, user2, 1000)); + + let liquidity1 = 10000; + let liquidity2 = 200; + + assert_ok!(AssetConversion::add_liquidity( + RuntimeOrigin::signed(user), + Box::new(token_1), + Box::new(token_2), + liquidity1, + liquidity2, + 1, + 1, + user, + )); + + // swap with credit_in.asset different from path[0] asset fails + let credit_in = Balances::issue(10); + let expected_credit_in = Balances::issue(10); + let error = >::swap_exact_tokens_for_tokens( + vec![token_2, token_1], + credit_in.into(), + None, + ) + .unwrap_err(); + assert_eq!(error, (expected_credit_in.into(), Error::::InvalidPath.into())); + + // swap with credit_in.asset different from path[0] asset fails + let credit_in = Assets::issue(2, 10); + let expected_credit_in = Assets::issue(2, 10); + let error = >::swap_tokens_for_exact_tokens( + vec![token_1, token_2], + credit_in.into(), + 10, + ) + .unwrap_err(); + assert_eq!(error, (expected_credit_in.into(), Error::::InvalidPath.into())); + + // swap with path.len < 2 fails + let credit_in = Balances::issue(10); + let expected_credit_in = Balances::issue(10); + let error = >::swap_exact_tokens_for_tokens( + vec![token_2], + credit_in.into(), + None, + ) + .unwrap_err(); + assert_eq!(error, (expected_credit_in.into(), Error::::InvalidPath.into())); + + // swap with path.len < 2 fails + let credit_in = Assets::issue(2, 10); + let expected_credit_in = Assets::issue(2, 10); + let error = >::swap_tokens_for_exact_tokens( + vec![], + credit_in.into(), + 10, + ) + .unwrap_err(); + assert_eq!(error, (expected_credit_in.into(), Error::::InvalidPath.into())); + }); +} diff --git a/substrate/frame/asset-conversion/src/types.rs b/substrate/frame/asset-conversion/src/types.rs index ffdc63ce0ce..d5ad8f59065 100644 --- a/substrate/frame/asset-conversion/src/types.rs +++ b/substrate/frame/asset-conversion/src/types.rs @@ -27,6 +27,16 @@ use sp_std::{cmp::Ordering, marker::PhantomData}; /// migration. pub(super) type PoolIdOf = (::MultiAssetId, ::MultiAssetId); +/// Represents a swap path with associated asset amounts indicating how much of the asset needs to +/// be deposited to get the following asset's amount withdrawn (this is inclusive of fees). +/// +/// Example: +/// Given path [(asset1, amount_in), (asset2, amount_out2), (asset3, amount_out3)], can be resolved: +/// 1. `asset(asset1, amount_in)` take from `user` and move to the pool(asset1, asset2); +/// 2. `asset(asset2, amount_out2)` transfer from pool(asset1, asset2) to pool(asset2, asset3); +/// 3. `asset(asset3, amount_out3)` move from pool(asset2, asset3) to `user`. +pub(super) type BalancePath = Vec<(::MultiAssetId, ::Balance)>; + /// Stores the lp_token asset id a particular pool has been assigned. #[derive(Decode, Encode, Default, PartialEq, Eq, MaxEncodedLen, TypeInfo)] pub struct PoolInfo { @@ -83,43 +93,6 @@ where } } -/// Trait for providing methods to swap between the various asset classes. -pub trait Swap { - /// Swap exactly `amount_in` of asset `path[0]` for asset `path[1]`. - /// If an `amount_out_min` is specified, it will return an error if it is unable to acquire - /// the amount desired. - /// - /// Withdraws the `path[0]` asset from `sender`, deposits the `path[1]` asset to `send_to`, - /// respecting `keep_alive`. - /// - /// If successful, returns the amount of `path[1]` acquired for the `amount_in`. - fn swap_exact_tokens_for_tokens( - sender: AccountId, - path: Vec, - amount_in: Balance, - amount_out_min: Option, - send_to: AccountId, - keep_alive: bool, - ) -> Result; - - /// Take the `path[0]` asset and swap some amount for `amount_out` of the `path[1]`. If an - /// `amount_in_max` is specified, it will return an error if acquiring `amount_out` would be - /// too costly. - /// - /// Withdraws `path[0]` asset from `sender`, deposits `path[1]` asset to `send_to`, - /// respecting `keep_alive`. - /// - /// If successful returns the amount of the `path[0]` taken to provide `path[1]`. - fn swap_tokens_for_exact_tokens( - sender: AccountId, - path: Vec, - amount_out: Balance, - amount_in_max: Option, - send_to: AccountId, - keep_alive: bool, - ) -> Result; -} - /// An implementation of MultiAssetId that can be either Native or an asset. #[derive(Decode, Encode, Default, MaxEncodedLen, TypeInfo, Clone, Copy, Debug)] pub enum NativeOrAssetId @@ -186,3 +159,99 @@ impl MultiAssetIdConverter, Asset } } } + +/// Credit of [Config::Currency]. +/// +/// Implies a negative imbalance in the system that can be placed into an account or alter the total +/// supply. +pub type NativeCredit = + CreditFungible<::AccountId, ::Currency>; + +/// Credit (aka negative imbalance) of [Config::Assets]. +/// +/// Implies a negative imbalance in the system that can be placed into an account or alter the total +/// supply. +pub type AssetCredit = + CreditFungibles<::AccountId, ::Assets>; + +/// Credit that can be either [`NativeCredit`] or [`AssetCredit`]. +/// +/// Implies a negative imbalance in the system that can be placed into an account or alter the total +/// supply. +#[derive(RuntimeDebug, Eq, PartialEq)] +pub enum Credit { + /// Native credit. + Native(NativeCredit), + /// Asset credit. + Asset(AssetCredit), +} + +impl From> for Credit { + fn from(value: NativeCredit) -> Self { + Credit::Native(value) + } +} + +impl From> for Credit { + fn from(value: AssetCredit) -> Self { + Credit::Asset(value) + } +} + +impl TryInto> for Credit { + type Error = (); + fn try_into(self) -> Result, ()> { + match self { + Credit::Native(c) => Ok(c), + _ => Err(()), + } + } +} + +impl TryInto> for Credit { + type Error = (); + fn try_into(self) -> Result, ()> { + match self { + Credit::Asset(c) => Ok(c), + _ => Err(()), + } + } +} + +impl Credit { + /// Create zero native credit. + pub fn native_zero() -> Self { + NativeCredit::::zero().into() + } + + /// Amount of `self`. + pub fn peek(&self) -> T::Balance { + match self { + Credit::Native(c) => c.peek(), + Credit::Asset(c) => c.peek(), + } + } + + /// Asset class of `self`. + pub fn asset(&self) -> T::MultiAssetId { + match self { + Credit::Native(_) => T::MultiAssetIdConverter::get_native(), + Credit::Asset(c) => c.asset().into(), + } + } + + /// Consume `self` and return two independent instances; the first is guaranteed to be at most + /// `amount` and the second will be the remainder. + pub fn split(self, amount: T::Balance) -> (Self, Self) { + match self { + Credit::Native(c) => { + let (left, right) = c.split(amount); + (left.into(), right.into()) + }, + Credit::Asset(c) => { + let (left, right) = c.split(amount); + (left.into(), right.into()) + }, + } + } +} diff --git a/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/mock.rs b/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/mock.rs index 081e8e53db2..3f976638517 100644 --- a/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/mock.rs +++ b/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/mock.rs @@ -238,7 +238,6 @@ ord_parameter_types! { impl pallet_asset_conversion::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Currency = Balances; - type AssetBalance = ::Balance; type AssetId = u32; type PoolAssetId = u32; type Assets = Assets; diff --git a/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/payment.rs b/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/payment.rs index 0d090211d03..ccea9e55bbe 100644 --- a/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/payment.rs +++ b/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/payment.rs @@ -83,8 +83,8 @@ impl OnChargeAssetTransaction for AssetConversionAdapter where T: Config, C: Inspect<::AccountId>, - CON: Swap, - T::HigherPrecisionBalance: From> + TryInto>, + CON: Swap, MultiAssetId = T::MultiAssetId>, + BalanceOf: Into>, T::MultiAssetId: From>, BalanceOf: IsType<::AccountId>>::Balance>, { @@ -117,22 +117,18 @@ where let asset_consumed = CON::swap_tokens_for_exact_tokens( who.clone(), vec![asset_id.into(), T::MultiAssetIdConverter::get_native()], - T::HigherPrecisionBalance::from(native_asset_required), + native_asset_required, None, who.clone(), true, ) .map_err(|_| TransactionValidityError::from(InvalidTransaction::Payment))?; - let asset_consumed = asset_consumed - .try_into() - .map_err(|_| TransactionValidityError::from(InvalidTransaction::Payment))?; - ensure!(asset_consumed > Zero::zero(), InvalidTransaction::Payment); // charge the fee in native currency ::withdraw_fee(who, call, info, fee, tip) - .map(|r| (r, native_asset_required, asset_consumed)) + .map(|r| (r, native_asset_required, asset_consumed.into())) } /// Correct the fee and swap the refund back to asset. @@ -175,8 +171,7 @@ where T::MultiAssetIdConverter::get_native(), // we provide the native asset_id.into(), // we want asset_id back ], - T::HigherPrecisionBalance::from(swap_back), /* amount of the native asset to - * convert to `asset_id` */ + swap_back, // amount of the native asset to convert to `asset_id` None, // no minimum amount back who.clone(), // we will refund to `who` false, // no need to keep alive diff --git a/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/tests.rs b/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/tests.rs index 9e9b74a0ddb..d50a0516423 100644 --- a/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/tests.rs +++ b/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/tests.rs @@ -19,7 +19,10 @@ use frame_support::{ assert_ok, dispatch::{DispatchInfo, PostDispatchInfo}, pallet_prelude::*, - traits::{fungible::Inspect, fungibles::Mutate}, + traits::{ + fungible::Inspect, + fungibles::{Inspect as FungiblesInspect, Mutate}, + }, weights::Weight, }; use frame_system as system; @@ -110,22 +113,32 @@ fn default_post_info() -> PostDispatchInfo { fn setup_lp(asset_id: u32, balance_factor: u64) { let lp_provider = 5; + let ed = Balances::minimum_balance(); + let ed_asset = Assets::minimum_balance(asset_id); assert_ok!(Balances::force_set_balance( RuntimeOrigin::root(), lp_provider, - 10_000 * balance_factor + 10_000 * balance_factor + ed, )); let lp_provider_account = ::Lookup::unlookup(lp_provider); - assert_ok!(Assets::mint_into(asset_id.into(), &lp_provider_account, 10_000 * balance_factor)); + assert_ok!(Assets::mint_into( + asset_id.into(), + &lp_provider_account, + 10_000 * balance_factor + ed_asset + )); let token_1 = NativeOrAssetId::Native; let token_2 = NativeOrAssetId::Asset(asset_id); - assert_ok!(AssetConversion::create_pool(RuntimeOrigin::signed(lp_provider), token_1, token_2)); + assert_ok!(AssetConversion::create_pool( + RuntimeOrigin::signed(lp_provider), + Box::new(token_1), + Box::new(token_2) + )); assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(lp_provider), - token_1, - token_2, + Box::new(token_1), + Box::new(token_2), 1_000 * balance_factor, // 1 desired 10_000 * balance_factor, // 2 desired 1, // 1 min -- GitLab From 8efaabd6c1c0cecc8c0d5ec94ac7877407223845 Mon Sep 17 00:00:00 2001 From: Egor_P Date: Tue, 19 Dec 2023 17:31:44 +0100 Subject: [PATCH 063/191] Add srtool GHA (#2755) This PR introduces the `srtool` GHA which was used in the old `cumulus` repo to build and check runtimes on the weekly basis schedule. The job is triggered: - every Monday at 2AM, automatically - on each tag push or push to the release branch - can be triggered manually as well Addresses #1271 --- .github/scripts/common/lib.sh | 37 ++++++++++ .github/workflows/srtool.yml | 135 ++++++++++++++++++++++++++++++++++ 2 files changed, 172 insertions(+) create mode 100644 .github/workflows/srtool.yml diff --git a/.github/scripts/common/lib.sh b/.github/scripts/common/lib.sh index e499dfabd64..bd12d9c6e6f 100755 --- a/.github/scripts/common/lib.sh +++ b/.github/scripts/common/lib.sh @@ -307,3 +307,40 @@ function increment_rc_tag() { ((suffix++)) echo $suffix } + +function relative_parent() { + echo "$1" | sed -E 's/(.*)\/(.*)\/\.\./\1/g' +} + +# Find all the runtimes, it returns the result as JSON object, compatible to be +# used as Github Workflow Matrix. This call is exposed by the `scan` command and can be used as: +# podman run --rm -it -v /.../fellowship-runtimes:/build docker.io/chevdor/srtool:1.70.0-0.11.1 scan +function find_runtimes() { + libs=($(git grep -I -r --cached --max-depth 20 --files-with-matches 'construct_runtime!' -- '*lib.rs')) + re=".*-runtime$" + JSON=$(jq --null-input '{ "include": [] }') + + # EXCLUDED_RUNTIMES is a space separated list of runtime names (without the -runtime postfix) + # EXCLUDED_RUNTIMES=${EXCLUDED_RUNTIMES:-"substrate-test"} + IFS=' ' read -r -a exclusions <<< "$EXCLUDED_RUNTIMES" + + for lib in "${libs[@]}"; do + crate_dir=$(dirname "$lib") + cargo_toml="$crate_dir/../Cargo.toml" + + name=$(toml get -r $cargo_toml 'package.name') + chain=${name//-runtime/} + + if [[ "$name" =~ $re ]] && ! [[ ${exclusions[@]} =~ $chain ]]; then + lib_dir=$(dirname "$lib") + runtime_dir=$(relative_parent "$lib_dir/..") + ITEM=$(jq --null-input \ + --arg chain "$chain" \ + --arg name "$name" \ + --arg runtime_dir "$runtime_dir" \ + '{ "chain": $chain, "crate": $name, "runtime_dir": $runtime_dir }') + JSON=$(echo $JSON | jq ".include += [$ITEM]") + fi + done + echo $JSON +} diff --git a/.github/workflows/srtool.yml b/.github/workflows/srtool.yml new file mode 100644 index 00000000000..89659399fc6 --- /dev/null +++ b/.github/workflows/srtool.yml @@ -0,0 +1,135 @@ +name: Srtool build + +env: + SUBWASM_VERSION: 0.20.0 + TOML_CLI_VERSION: 0.2.4 + +on: + push: + tags: + - "*" + branches: + - release-v[0-9]+.[0-9]+.[0-9]+* + - release-cumulus-v[0-9]+* + - release-polkadot-v[0-9]+* + + schedule: + - cron: "00 02 * * 1" # 2AM weekly on monday + + workflow_dispatch: + +jobs: + find-runtimes: + name: Scan repo paritytech/polkadot-sdk + outputs: + runtime: ${{ steps.get_runtimes_list.outputs.runtime }} + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + with: + fetch-depth: 0 + + - name: Install tooling + run: | + URL=https://github.com/chevdor/toml-cli/releases/download/v${{ env.TOML_CLI_VERSION }}/toml_linux_amd64_v${{ env.TOML_CLI_VERSION }}.deb + curl -L $URL --output toml.deb + sudo dpkg -i toml.deb + toml --version; jq --version + + - name: Scan runtimes + env: + EXCLUDED_RUNTIMES: "substrate-test" + run: | + . ./.github/scripts/common/lib.sh + + echo "Github workspace: ${{ github.workspace }}" + echo "Current folder: $(pwd)"; ls -al + ls -al + + MATRIX=$(find_runtimes | tee runtimes_list.json) + echo $MATRIX + + - name: Get runtimes list + id: get_runtimes_list + run: | + ls -al + MATRIX=$(cat runtimes_list.json) + echo $MATRIX + echo "runtime=$MATRIX" >> $GITHUB_OUTPUT + + srtool: + runs-on: ubuntu-latest + needs: + - find-runtimes + strategy: + fail-fast: false + matrix: ${{ fromJSON(needs.find-runtimes.outputs.runtime) }} + + steps: + - uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + with: + fetch-depth: 0 + + - name: Srtool build + id: srtool_build + uses: chevdor/srtool-actions@v0.9.1 + with: + chain: ${{ matrix.chain }} + runtime_dir: ${{ matrix.runtime_dir }} + + - name: Summary + run: | + echo '${{ steps.srtool_build.outputs.json }}' | jq > ${{ matrix.chain }}-srtool-digest.json + cat ${{ matrix.chain }}-srtool-digest.json + echo "Compact Runtime: ${{ steps.srtool_build.outputs.wasm }}" + echo "Compressed Runtime: ${{ steps.srtool_build.outputs.wasm_compressed }}" + + # it takes a while to build the runtime, so let's save the artifact as soon as we have it + - name: Archive Artifacts for ${{ matrix.chain }} + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + with: + name: ${{ matrix.chain }}-runtime + path: | + ${{ steps.srtool_build.outputs.wasm }} + ${{ steps.srtool_build.outputs.wasm_compressed }} + ${{ matrix.chain }}-srtool-digest.json + + # We now get extra information thanks to subwasm + - name: Install subwasm + run: | + wget https://github.com/chevdor/subwasm/releases/download/v${{ env.SUBWASM_VERSION }}/subwasm_linux_amd64_v${{ env.SUBWASM_VERSION }}.deb + sudo dpkg -i subwasm_linux_amd64_v${{ env.SUBWASM_VERSION }}.deb + subwasm --version + + - name: Show Runtime information + shell: bash + run: | + subwasm info ${{ steps.srtool_build.outputs.wasm }} + subwasm info ${{ steps.srtool_build.outputs.wasm_compressed }} + subwasm --json info ${{ steps.srtool_build.outputs.wasm }} > ${{ matrix.chain }}-info.json + subwasm --json info ${{ steps.srtool_build.outputs.wasm_compressed }} > ${{ matrix.chain }}-compressed-info.json + + - name: Extract the metadata + shell: bash + run: | + subwasm meta ${{ steps.srtool_build.outputs.wasm }} + subwasm --json meta ${{ steps.srtool_build.outputs.wasm }} > ${{ matrix.chain }}-metadata.json + + - name: Check the metadata diff + shell: bash + # the following subwasm call will error for chains that are not known and/or live, that includes shell for instance + run: | + subwasm diff ${{ steps.srtool_build.outputs.wasm }} --chain-b ${{ matrix.chain }} || \ + echo "Subwasm call failed, check the logs. This is likely because ${{ matrix.chain }} is not known by subwasm" | \ + tee ${{ matrix.chain }}-diff.txt + + - name: Archive Subwasm results + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + with: + name: ${{ matrix.chain }}-runtime + path: | + ${{ matrix.chain }}-info.json + ${{ matrix.chain }}-compressed-info.json + ${{ matrix.chain }}-metadata.json + ${{ matrix.chain }}-diff.txt -- GitLab From 421af26b1f84911f7fa02fc111b992f3301041b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= <123550+andresilva@users.noreply.github.com> Date: Tue, 19 Dec 2023 23:24:02 +0000 Subject: [PATCH 064/191] Update schnorrkel to 0.11.4 (#2524) --- Cargo.lock | 975 ++---------------- polkadot/node/core/approval-voting/Cargo.toml | 9 +- .../approval_db/common/migration_helpers.rs | 5 +- .../node/core/approval-voting/src/criteria.rs | 6 +- .../node/core/approval-voting/src/tests.rs | 4 +- .../network/approval-distribution/Cargo.toml | 4 +- .../approval-distribution/src/tests.rs | 4 +- polkadot/node/primitives/Cargo.toml | 2 +- .../client/authority-discovery/Cargo.toml | 2 +- substrate/client/network-gossip/Cargo.toml | 2 +- substrate/client/network/Cargo.toml | 2 +- substrate/client/network/statement/Cargo.toml | 2 +- substrate/client/network/sync/Cargo.toml | 2 +- substrate/client/network/test/Cargo.toml | 2 +- .../client/network/transactions/Cargo.toml | 2 +- substrate/client/offchain/Cargo.toml | 2 +- substrate/client/telemetry/Cargo.toml | 2 +- substrate/primitives/core/Cargo.toml | 4 +- substrate/primitives/core/src/sr25519.rs | 19 +- substrate/primitives/io/Cargo.toml | 2 +- .../primitives/statement-store/Cargo.toml | 6 +- 21 files changed, 133 insertions(+), 925 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 171f50f2bd8..14b1512eae4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -42,15 +42,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" -[[package]] -name = "aead" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fc95d1bdb8e6666b2b217308eeeb09f2d6728d104be3e31916cc74d15420331" -dependencies = [ - "generic-array 0.14.7", -] - [[package]] name = "aead" version = "0.4.3" @@ -58,7 +49,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b613b8e1e3cf911a086f53f03bf286f52fd7a7258e4fa606f0ef220d39d8877" dependencies = [ "generic-array 0.14.7", - "rand_core 0.6.4", ] [[package]] @@ -71,17 +61,6 @@ dependencies = [ "generic-array 0.14.7", ] -[[package]] -name = "aes" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "884391ef1066acaa41e766ba8f596341b96e93ce34f9a43e7d24bf0a0eaf0561" -dependencies = [ - "aes-soft", - "aesni", - "cipher 0.2.5", -] - [[package]] name = "aes" version = "0.7.5" @@ -133,26 +112,6 @@ dependencies = [ "subtle 2.4.1", ] -[[package]] -name = "aes-soft" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be14c7498ea50828a38d0e24a765ed2effe92a705885b57d029cd67d45744072" -dependencies = [ - "cipher 0.2.5", - "opaque-debug 0.3.0", -] - -[[package]] -name = "aesni" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2e11f5e94c2f7d386164cc2aa1f97823fed6f259e486940a71c174dd01b0ce" -dependencies = [ - "cipher 0.2.5", - "opaque-debug 0.3.0", -] - [[package]] name = "ahash" version = "0.7.6" @@ -310,12 +269,6 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2d098ff73c1ca148721f37baad5ea6a465a13f9573aba8641fbbbae8164a54e" -[[package]] -name = "arc-swap" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" - [[package]] name = "ark-bls12-377" version = "0.4.0" @@ -656,29 +609,13 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" -[[package]] -name = "asn1-rs" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ff05a702273012438132f449575dbc804e27b2f3cbe3069aa237d26c98fa33" -dependencies = [ - "asn1-rs-derive 0.1.0", - "asn1-rs-impl", - "displaydoc", - "nom", - "num-traits", - "rusticata-macros", - "thiserror", - "time 0.3.27", -] - [[package]] name = "asn1-rs" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f6fd5ddaf0351dff5b8da21b2fb4ff8e08ddd02857f0bf69c47639106c0fff0" dependencies = [ - "asn1-rs-derive 0.4.0", + "asn1-rs-derive", "asn1-rs-impl", "displaydoc", "nom", @@ -688,18 +625,6 @@ dependencies = [ "time 0.3.27", ] -[[package]] -name = "asn1-rs-derive" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db8b7511298d5b7784b40b092d9e9dcd3a627a5707e4b5e507931ab0d44eeebf" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", - "synstructure", -] - [[package]] name = "asn1-rs-derive" version = "0.4.0" @@ -1264,12 +1189,6 @@ version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" -[[package]] -name = "base16ct" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" - [[package]] name = "base16ct" version = "0.2.0" @@ -1470,7 +1389,7 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" dependencies = [ - "block-padding 0.1.5", + "block-padding", "byte-tools", "byteorder", "generic-array 0.12.4", @@ -1494,16 +1413,6 @@ dependencies = [ "generic-array 0.14.7", ] -[[package]] -name = "block-modes" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a0e8073e8baa88212fb5823574c02ebccb395136ba9a164ab89379ec6072f0" -dependencies = [ - "block-padding 0.2.1", - "cipher 0.2.5", -] - [[package]] name = "block-padding" version = "0.1.5" @@ -1513,12 +1422,6 @@ dependencies = [ "byte-tools", ] -[[package]] -name = "block-padding" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" - [[package]] name = "blocking" version = "1.3.1" @@ -2319,17 +2222,6 @@ dependencies = [ "libc", ] -[[package]] -name = "ccm" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aca1a8fbc20b50ac9673ff014abfb2b5f4085ee1a850d408f14a159c5853ac7" -dependencies = [ - "aead 0.3.2", - "cipher 0.2.5", - "subtle 2.4.1", -] - [[package]] name = "cexpr" version = "0.6.0" @@ -3233,21 +3125,6 @@ dependencies = [ "wasmtime-types", ] -[[package]] -name = "crc" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe" -dependencies = [ - "crc-catalog", -] - -[[package]] -name = "crc-catalog" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cace84e55f07e7301bae1c519df89cdad8cc3cd868413d3fdbdeca9ff3db484" - [[package]] name = "crc32fast" version = "1.3.2" @@ -3382,18 +3259,6 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" -[[package]] -name = "crypto-bigint" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" -dependencies = [ - "generic-array 0.14.7", - "rand_core 0.6.4", - "subtle 2.4.1", - "zeroize", -] - [[package]] name = "crypto-bigint" version = "0.5.2" @@ -4291,9 +4156,9 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "4.0.0" +version = "4.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f711ade317dd348950a9910f81c5947e3d8907ebd2b83f76203ff1807e6a2bc2" +checksum = "e89b8c6a2e4b1f45971ad09761aafb85514a84744b67a95e32c3cc1352d1f65c" dependencies = [ "cfg-if", "cpufeatures", @@ -4374,41 +4239,6 @@ dependencies = [ "syn 2.0.41", ] -[[package]] -name = "darling" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 1.0.109", -] - -[[package]] -name = "darling_macro" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" -dependencies = [ - "darling_core", - "quote", - "syn 1.0.109", -] - [[package]] name = "dashmap" version = "5.5.1" @@ -4457,17 +4287,6 @@ dependencies = [ "uuid", ] -[[package]] -name = "der" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" -dependencies = [ - "const-oid", - "pem-rfc7468", - "zeroize", -] - [[package]] name = "der" version = "0.7.8" @@ -4478,27 +4297,13 @@ dependencies = [ "zeroize", ] -[[package]] -name = "der-parser" -version = "7.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe398ac75057914d7d07307bf67dc7f3f574a26783b4fc7805a20ffa9f506e82" -dependencies = [ - "asn1-rs 0.3.1", - "displaydoc", - "nom", - "num-bigint", - "num-traits", - "rusticata-macros", -] - [[package]] name = "der-parser" version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dbd676fbbab537128ef0278adb5576cf363cff6aa22a7b24effe97347cfab61e" dependencies = [ - "asn1-rs 0.5.2", + "asn1-rs", "displaydoc", "nom", "num-bigint", @@ -4534,37 +4339,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "derive_builder" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d07adf7be193b71cc36b193d0f5fe60b918a3a9db4dad0449f57bcfd519704a3" -dependencies = [ - "derive_builder_macro", -] - -[[package]] -name = "derive_builder_core" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f91d4cfa921f1c05904dc3c57b4a32c38aed3340cce209f3a6fd1478babafc4" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "derive_builder_macro" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f0314b72bed045f3a68671b3c86328386762c93f82d98c65c3cb5e5f573dd68" -dependencies = [ - "derive_builder_core", - "syn 1.0.109", -] - [[package]] name = "derive_more" version = "0.99.17" @@ -4782,30 +4556,18 @@ version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d" -[[package]] -name = "ecdsa" -version = "0.14.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" -dependencies = [ - "der 0.6.1", - "elliptic-curve 0.12.3", - "rfc6979 0.3.1", - "signature 1.6.4", -] - [[package]] name = "ecdsa" version = "0.16.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" dependencies = [ - "der 0.7.8", + "der", "digest 0.10.7", - "elliptic-curve 0.13.5", - "rfc6979 0.4.0", - "signature 2.1.0", - "spki 0.7.2", + "elliptic-curve", + "rfc6979", + "signature", + "spki", ] [[package]] @@ -4814,8 +4576,8 @@ version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60f6d271ca33075c88028be6f04d502853d63a5ece419d269c15315d4fc1cf1d" dependencies = [ - "pkcs8 0.10.2", - "signature 2.1.0", + "pkcs8", + "signature", ] [[package]] @@ -4824,7 +4586,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f628eaec48bfd21b865dc2950cfa014450c01d2fa2b69a86c2fd5844ec523c0" dependencies = [ - "curve25519-dalek 4.0.0", + "curve25519-dalek 4.1.1", "ed25519", "rand_core 0.6.4", "serde", @@ -4849,11 +4611,11 @@ dependencies = [ [[package]] name = "ed25519-zebra" -version = "4.0.2" +version = "4.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e83e509bcd060ca4b54b72bde5bb306cb2088cb01e14797ebae90a24f70f5f7" +checksum = "7d9ce6874da5d4415896cd45ffbc4d1cfc0c4f9c079427bd870742c30f2f65a9" dependencies = [ - "curve25519-dalek 4.0.0", + "curve25519-dalek 4.1.1", "ed25519", "hashbrown 0.14.0", "hex", @@ -4868,43 +4630,21 @@ version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" -[[package]] -name = "elliptic-curve" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" -dependencies = [ - "base16ct 0.1.1", - "crypto-bigint 0.4.9", - "der 0.6.1", - "digest 0.10.7", - "ff 0.12.1", - "generic-array 0.14.7", - "group 0.12.1", - "hkdf", - "pem-rfc7468", - "pkcs8 0.9.0", - "rand_core 0.6.4", - "sec1 0.3.0", - "subtle 2.4.1", - "zeroize", -] - [[package]] name = "elliptic-curve" version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" dependencies = [ - "base16ct 0.2.0", - "crypto-bigint 0.5.2", + "base16ct", + "crypto-bigint", "digest 0.10.7", - "ff 0.13.0", + "ff", "generic-array 0.14.7", - "group 0.13.0", - "pkcs8 0.10.2", + "group", + "pkcs8", "rand_core 0.6.4", - "sec1 0.7.3", + "sec1", "subtle 2.4.1", "zeroize", ] @@ -5244,16 +4984,6 @@ dependencies = [ "web-sys", ] -[[package]] -name = "ff" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" -dependencies = [ - "rand_core 0.6.4", - "subtle 2.4.1", -] - [[package]] name = "ff" version = "0.13.0" @@ -5279,9 +5009,9 @@ dependencies = [ [[package]] name = "fiat-crypto" -version = "0.1.20" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e825f6987101665dea6ec934c09ec6d721de7bc1bf92248e1d5810c8cd636b77" +checksum = "27573eac26f4dd11e2b1916c3fe1baa56407c83c71a773a8ba17ec0bca03b6b7" [[package]] name = "file-per-thread-logger" @@ -5957,7 +5687,7 @@ checksum = "d2411eed028cdf8c8034eaf21f9915f956b6c3abec4d4c7949ee67f0721127bd" dependencies = [ "futures-io", "rustls 0.20.8", - "webpki 0.22.0", + "webpki", ] [[package]] @@ -6181,24 +5911,13 @@ dependencies = [ "substrate-wasm-builder", ] -[[package]] -name = "group" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" -dependencies = [ - "ff 0.12.1", - "rand_core 0.6.4", - "subtle 2.4.1", -] - [[package]] name = "group" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ - "ff 0.13.0", + "ff", "rand_core 0.6.4", "subtle 2.4.1", ] @@ -6510,12 +6229,6 @@ dependencies = [ "cc", ] -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - [[package]] name = "idna" version = "0.2.3" @@ -6713,25 +6426,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "interceptor" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e8a11ae2da61704edada656798b61c94b35ecac2c58eb955156987d5e6be90b" -dependencies = [ - "async-trait", - "bytes", - "log", - "rand 0.8.5", - "rtcp", - "rtp", - "thiserror", - "tokio", - "waitgroup", - "webrtc-srtp", - "webrtc-util", -] - [[package]] name = "io-lifetimes" version = "1.0.11" @@ -6997,8 +6691,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" dependencies = [ "cfg-if", - "ecdsa 0.16.8", - "elliptic-curve 0.13.5", + "ecdsa", + "elliptic-curve", "once_cell", "sha2 0.10.7", ] @@ -7282,9 +6976,9 @@ checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" [[package]] name = "libp2p" -version = "0.51.3" +version = "0.51.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f210d259724eae82005b5c48078619b7745edb7b76de370b03f8ba59ea103097" +checksum = "f35eae38201a993ece6bdc823292d6abd1bffed1c4d0f4a3517d2bd8e1d917fe" dependencies = [ "bytes", "futures", @@ -7307,7 +7001,6 @@ dependencies = [ "libp2p-swarm", "libp2p-tcp", "libp2p-wasm-ext", - "libp2p-webrtc", "libp2p-websocket", "libp2p-yamux", "multiaddr", @@ -7619,12 +7312,12 @@ dependencies = [ "futures-rustls", "libp2p-core", "libp2p-identity", - "rcgen 0.10.0", + "rcgen", "ring 0.16.20", "rustls 0.20.8", "thiserror", - "webpki 0.22.0", - "x509-parser 0.14.0", + "webpki", + "x509-parser", "yasna", ] @@ -7642,37 +7335,6 @@ dependencies = [ "wasm-bindgen-futures", ] -[[package]] -name = "libp2p-webrtc" -version = "0.4.0-alpha.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dba48592edbc2f60b4bc7c10d65445b0c3964c07df26fdf493b6880d33be36f8" -dependencies = [ - "async-trait", - "asynchronous-codec", - "bytes", - "futures", - "futures-timer", - "hex", - "if-watch", - "libp2p-core", - "libp2p-identity", - "libp2p-noise", - "log", - "multihash 0.17.0", - "quick-protobuf", - "quick-protobuf-codec", - "rand 0.8.5", - "rcgen 0.9.3", - "serde", - "stun", - "thiserror", - "tinytemplate", - "tokio", - "tokio-util", - "webrtc", -] - [[package]] name = "libp2p-websocket" version = "0.41.0" @@ -8028,17 +7690,8 @@ dependencies = [ ] [[package]] -name = "md-5" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6365506850d44bff6e2fbcb5176cf63650e48bd45ef2fe2665ae1570e0f4b9ca" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "memchr" -version = "2.6.4" +name = "memchr" +version = "2.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" @@ -8060,15 +7713,6 @@ dependencies = [ "libc", ] -[[package]] -name = "memoffset" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" -dependencies = [ - "autocfg", -] - [[package]] name = "memoffset" version = "0.7.1" @@ -8235,7 +7879,7 @@ dependencies = [ "bitflags 1.3.2", "blake2 0.10.6", "c2-chacha", - "curve25519-dalek 4.0.0", + "curve25519-dalek 4.1.1", "either", "hashlink", "lioness", @@ -8582,7 +8226,6 @@ dependencies = [ "bitflags 1.3.2", "cfg-if", "libc", - "memoffset 0.6.5", ] [[package]] @@ -8987,22 +8630,13 @@ dependencies = [ "memchr", ] -[[package]] -name = "oid-registry" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38e20717fa0541f39bd146692035c37bedfa532b3e5071b35761082407546b2a" -dependencies = [ - "asn1-rs 0.3.1", -] - [[package]] name = "oid-registry" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9bedf36ffb6ba96c2eb7144ef6270557b52e54b20c0a8e1eb2ff99a6c6959bff" dependencies = [ - "asn1-rs 0.5.2", + "asn1-rs", ] [[package]] @@ -9108,28 +8742,6 @@ version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" -[[package]] -name = "p256" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51f44edd08f51e2ade572f141051021c5af22677e42b7dd28a88155151c33594" -dependencies = [ - "ecdsa 0.14.8", - "elliptic-curve 0.12.3", - "sha2 0.10.7", -] - -[[package]] -name = "p384" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc8c5bf642dde52bb9e87c0ecd8ca5a76faac2eeed98dedb7c717997e1080aa" -dependencies = [ - "ecdsa 0.14.8", - "elliptic-curve 0.12.3", - "sha2 0.10.7", -] - [[package]] name = "pallet-alliance" version = "4.0.0-dev" @@ -11694,15 +11306,6 @@ dependencies = [ "base64 0.13.1", ] -[[package]] -name = "pem-rfc7468" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d159833a9105500e0398934e205e0773f0b27529557134ecfc51c27646adac" -dependencies = [ - "base64ct", -] - [[package]] name = "penpal-emulated-chain" version = "0.0.0" @@ -11878,24 +11481,14 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" -[[package]] -name = "pkcs8" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" -dependencies = [ - "der 0.6.1", - "spki 0.6.0", -] - [[package]] name = "pkcs8" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ - "der 0.7.8", - "spki 0.7.2", + "der", + "spki", ] [[package]] @@ -11981,8 +11574,8 @@ dependencies = [ "polkadot-primitives-test-helpers", "rand 0.8.5", "rand_chacha 0.3.1", - "rand_core 0.5.1", - "schnorrkel 0.9.1", + "rand_core 0.6.4", + "schnorrkel 0.11.4", "sp-authority-discovery", "sp-core", "tracing-gum", @@ -12286,7 +11879,7 @@ dependencies = [ "kvdb", "kvdb-memorydb", "log", - "merlin 2.0.1", + "merlin 3.0.0", "parity-scale-codec", "parking_lot 0.12.1", "polkadot-node-jaeger", @@ -12299,10 +11892,10 @@ dependencies = [ "polkadot-primitives-test-helpers", "rand 0.8.5", "rand_chacha 0.3.1", - "rand_core 0.5.1", + "rand_core 0.6.4", "sc-keystore", "schnellru", - "schnorrkel 0.9.1", + "schnorrkel 0.11.4", "sp-application-crypto", "sp-consensus", "sp-consensus-babe", @@ -12773,7 +12366,7 @@ dependencies = [ "polkadot-erasure-coding", "polkadot-parachain-primitives", "polkadot-primitives", - "schnorrkel 0.9.1", + "schnorrkel 0.11.4", "serde", "sp-application-crypto", "sp-consensus-babe", @@ -14165,7 +13758,7 @@ dependencies = [ "thiserror", "tinyvec", "tracing", - "webpki 0.22.0", + "webpki", ] [[package]] @@ -14301,19 +13894,6 @@ dependencies = [ "num_cpus", ] -[[package]] -name = "rcgen" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6413f3de1edee53342e6138e75b56d32e7bc6e332b3bd62d497b1929d4cfbcdd" -dependencies = [ - "pem", - "ring 0.16.20", - "time 0.3.27", - "x509-parser 0.13.2", - "yasna", -] - [[package]] name = "rcgen" version = "0.10.0" @@ -14523,17 +14103,6 @@ dependencies = [ "quick-error", ] -[[package]] -name = "rfc6979" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" -dependencies = [ - "crypto-bigint 0.4.9", - "hmac 0.12.1", - "zeroize", -] - [[package]] name = "rfc6979" version = "0.4.0" @@ -14833,17 +14402,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "rtcp" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1919efd6d4a6a85d13388f9487549bb8e359f17198cc03ffd72f79b553873691" -dependencies = [ - "bytes", - "thiserror", - "webrtc-util", -] - [[package]] name = "rtnetlink" version = "0.10.1" @@ -14869,20 +14427,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "rtp" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2a095411ff00eed7b12e4c6a118ba984d113e1079582570d56a5ee723f11f80" -dependencies = [ - "async-trait", - "bytes", - "rand 0.8.5", - "serde", - "thiserror", - "webrtc-util", -] - [[package]] name = "rustc-demangle" version = "0.1.23" @@ -14969,19 +14513,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "rustls" -version = "0.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" -dependencies = [ - "base64 0.13.1", - "log", - "ring 0.16.20", - "sct 0.6.1", - "webpki 0.21.4", -] - [[package]] name = "rustls" version = "0.20.8" @@ -14990,8 +14521,8 @@ checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" dependencies = [ "log", "ring 0.16.20", - "sct 0.7.0", - "webpki 0.22.0", + "sct", + "webpki", ] [[package]] @@ -15003,7 +14534,7 @@ dependencies = [ "log", "ring 0.16.20", "rustls-webpki 0.101.4", - "sct 0.7.0", + "sct", ] [[package]] @@ -16664,6 +16195,25 @@ dependencies = [ "zeroize", ] +[[package]] +name = "schnorrkel" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de18f6d8ba0aad7045f5feae07ec29899c1112584a38509a84ad7b04451eaa0" +dependencies = [ + "aead 0.5.2", + "arrayref", + "arrayvec 0.7.4", + "curve25519-dalek 4.1.1", + "getrandom_or_panic", + "merlin 3.0.0", + "rand_core 0.6.4", + "serde_bytes", + "sha2 0.10.7", + "subtle 2.4.1", + "zeroize", +] + [[package]] name = "scopeguard" version = "1.2.0" @@ -16676,16 +16226,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3cf7c11c38cb994f3d40e8a8cde3bbd1f72a435e4c49e85d6553d8312306152" -[[package]] -name = "sct" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" -dependencies = [ - "ring 0.16.20", - "untrusted", -] - [[package]] name = "sct" version = "0.7.0" @@ -16696,42 +16236,16 @@ dependencies = [ "untrusted", ] -[[package]] -name = "sdp" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d22a5ef407871893fd72b4562ee15e4742269b173959db4b8df6f538c414e13" -dependencies = [ - "rand 0.8.5", - "substring", - "thiserror", - "url", -] - -[[package]] -name = "sec1" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" -dependencies = [ - "base16ct 0.1.1", - "der 0.6.1", - "generic-array 0.14.7", - "pkcs8 0.9.0", - "subtle 2.4.1", - "zeroize", -] - [[package]] name = "sec1" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ - "base16ct 0.2.0", - "der 0.7.8", + "base16ct", + "der", "generic-array 0.14.7", - "pkcs8 0.10.2", + "pkcs8", "subtle 2.4.1", "zeroize", ] @@ -16878,6 +16392,15 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde_bytes" +version = "0.11.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab33ec92f677585af6d88c65593ae2375adde54efdbf16d597f2cbc7a6d368ff" +dependencies = [ + "serde", +] + [[package]] name = "serde_derive" version = "1.0.193" @@ -17131,16 +16654,6 @@ dependencies = [ "libc", ] -[[package]] -name = "signature" -version = "1.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" -dependencies = [ - "digest 0.10.7", - "rand_core 0.6.4", -] - [[package]] name = "signature" version = "2.1.0" @@ -17254,7 +16767,7 @@ dependencies = [ "chacha20 0.9.1", "crossbeam-queue", "derive_more", - "ed25519-zebra 4.0.2", + "ed25519-zebra 4.0.3", "either", "event-listener", "fnv", @@ -17343,7 +16856,7 @@ dependencies = [ "aes-gcm 0.9.4", "blake2 0.10.6", "chacha20poly1305", - "curve25519-dalek 4.0.0", + "curve25519-dalek 4.1.1", "rand_core 0.6.4", "ring 0.16.20", "rustc_version 0.4.0", @@ -17699,7 +17212,7 @@ dependencies = [ "lazy_static", "libsecp256k1", "log", - "merlin 2.0.1", + "merlin 3.0.0", "parity-scale-codec", "parking_lot 0.12.1", "paste", @@ -17707,7 +17220,7 @@ dependencies = [ "rand 0.8.5", "regex", "scale-info", - "schnorrkel 0.9.1", + "schnorrkel 0.11.4", "secp256k1", "secrecy", "serde", @@ -18205,7 +17718,7 @@ name = "sp-statement-store" version = "4.0.0-dev" dependencies = [ "aes-gcm 0.10.3", - "curve25519-dalek 4.0.0", + "curve25519-dalek 4.1.1", "ed25519-dalek", "hkdf", "parity-scale-codec", @@ -18445,16 +17958,6 @@ dependencies = [ "strum", ] -[[package]] -name = "spki" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" -dependencies = [ - "base64ct", - "der 0.6.1", -] - [[package]] name = "spki" version = "0.7.2" @@ -18462,7 +17965,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" dependencies = [ "base64ct", - "der 0.7.8", + "der", ] [[package]] @@ -18808,25 +18311,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "stun" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7e94b1ec00bad60e6410e058b52f1c66de3dc5fe4d62d09b3e52bb7d3b73e25" -dependencies = [ - "base64 0.13.1", - "crc", - "lazy_static", - "md-5", - "rand 0.8.5", - "ring 0.16.20", - "subtle 2.4.1", - "thiserror", - "tokio", - "url", - "webrtc-util", -] - [[package]] name = "subkey" version = "3.0.0" @@ -19097,15 +18581,6 @@ dependencies = [ "wasm-opt", ] -[[package]] -name = "substring" -version = "1.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ee6433ecef213b2e72f587ef64a2f5943e7cd16fbd82dbe8bc07486c534c86" -dependencies = [ - "autocfg", -] - [[package]] name = "subtle" version = "1.0.0" @@ -20134,25 +19609,6 @@ dependencies = [ "utf-8", ] -[[package]] -name = "turn" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4712ee30d123ec7ae26d1e1b218395a16c87cdbaf4b3925d170d684af62ea5e8" -dependencies = [ - "async-trait", - "base64 0.13.1", - "futures", - "log", - "md-5", - "rand 0.8.5", - "ring 0.16.20", - "stun", - "thiserror", - "tokio", - "webrtc-util", -] - [[package]] name = "twox-hash" version = "1.6.3" @@ -20294,9 +19750,6 @@ name = "uuid" version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" -dependencies = [ - "getrandom 0.2.10", -] [[package]] name = "valuable" @@ -20391,15 +19844,6 @@ dependencies = [ "libc", ] -[[package]] -name = "waitgroup" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1f50000a783467e6c0200f9d10642f4bc424e39efc1b770203e88b488f79292" -dependencies = [ - "atomic-waker", -] - [[package]] name = "waker-fn" version = "1.1.0" @@ -20869,16 +20313,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "webpki" -version = "0.21.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" -dependencies = [ - "ring 0.16.20", - "untrusted", -] - [[package]] name = "webpki" version = "0.22.0" @@ -20895,7 +20329,7 @@ version = "0.22.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" dependencies = [ - "webpki 0.22.0", + "webpki", ] [[package]] @@ -20913,214 +20347,6 @@ version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14247bb57be4f377dfb94c72830b8ce8fc6beac03cf4bf7b9732eadd414123fc" -[[package]] -name = "webrtc" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d3bc9049bdb2cea52f5fd4f6f728184225bdb867ed0dc2410eab6df5bdd67bb" -dependencies = [ - "arc-swap", - "async-trait", - "bytes", - "hex", - "interceptor", - "lazy_static", - "log", - "rand 0.8.5", - "rcgen 0.9.3", - "regex", - "ring 0.16.20", - "rtcp", - "rtp", - "rustls 0.19.1", - "sdp", - "serde", - "serde_json", - "sha2 0.10.7", - "stun", - "thiserror", - "time 0.3.27", - "tokio", - "turn", - "url", - "waitgroup", - "webrtc-data", - "webrtc-dtls", - "webrtc-ice", - "webrtc-mdns", - "webrtc-media", - "webrtc-sctp", - "webrtc-srtp", - "webrtc-util", -] - -[[package]] -name = "webrtc-data" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef36a4d12baa6e842582fe9ec16a57184ba35e1a09308307b67d43ec8883100" -dependencies = [ - "bytes", - "derive_builder", - "log", - "thiserror", - "tokio", - "webrtc-sctp", - "webrtc-util", -] - -[[package]] -name = "webrtc-dtls" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a00f4242f2db33307347bd5be53263c52a0331c96c14292118c9a6bb48d267" -dependencies = [ - "aes 0.6.0", - "aes-gcm 0.10.3", - "async-trait", - "bincode", - "block-modes", - "byteorder", - "ccm", - "curve25519-dalek 3.2.0", - "der-parser 8.2.0", - "elliptic-curve 0.12.3", - "hkdf", - "hmac 0.12.1", - "log", - "p256", - "p384", - "rand 0.8.5", - "rand_core 0.6.4", - "rcgen 0.10.0", - "ring 0.16.20", - "rustls 0.19.1", - "sec1 0.3.0", - "serde", - "sha1", - "sha2 0.10.7", - "signature 1.6.4", - "subtle 2.4.1", - "thiserror", - "tokio", - "webpki 0.21.4", - "webrtc-util", - "x25519-dalek 2.0.0", - "x509-parser 0.13.2", -] - -[[package]] -name = "webrtc-ice" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "465a03cc11e9a7d7b4f9f99870558fe37a102b65b93f8045392fef7c67b39e80" -dependencies = [ - "arc-swap", - "async-trait", - "crc", - "log", - "rand 0.8.5", - "serde", - "serde_json", - "stun", - "thiserror", - "tokio", - "turn", - "url", - "uuid", - "waitgroup", - "webrtc-mdns", - "webrtc-util", -] - -[[package]] -name = "webrtc-mdns" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f08dfd7a6e3987e255c4dbe710dde5d94d0f0574f8a21afa95d171376c143106" -dependencies = [ - "log", - "socket2 0.4.9", - "thiserror", - "tokio", - "webrtc-util", -] - -[[package]] -name = "webrtc-media" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f72e1650a8ae006017d1a5280efb49e2610c19ccc3c0905b03b648aee9554991" -dependencies = [ - "byteorder", - "bytes", - "rand 0.8.5", - "rtp", - "thiserror", -] - -[[package]] -name = "webrtc-sctp" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d47adcd9427eb3ede33d5a7f3424038f63c965491beafcc20bc650a2f6679c0" -dependencies = [ - "arc-swap", - "async-trait", - "bytes", - "crc", - "log", - "rand 0.8.5", - "thiserror", - "tokio", - "webrtc-util", -] - -[[package]] -name = "webrtc-srtp" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6183edc4c1c6c0175f8812eefdce84dfa0aea9c3ece71c2bf6ddd3c964de3da5" -dependencies = [ - "aead 0.4.3", - "aes 0.7.5", - "aes-gcm 0.9.4", - "async-trait", - "byteorder", - "bytes", - "ctr 0.8.0", - "hmac 0.11.0", - "log", - "rtcp", - "rtp", - "sha-1 0.9.8", - "subtle 2.4.1", - "thiserror", - "tokio", - "webrtc-util", -] - -[[package]] -name = "webrtc-util" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f1db1727772c05cf7a2cfece52c3aca8045ca1e176cd517d323489aa3c6d87" -dependencies = [ - "async-trait", - "bitflags 1.3.2", - "bytes", - "cc", - "ipnet", - "lazy_static", - "libc", - "log", - "nix 0.24.3", - "rand 0.8.5", - "thiserror", - "tokio", - "winapi", -] - [[package]] name = "westend-emulated-chain" version = "0.0.0" @@ -21566,44 +20792,25 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb66477291e7e8d2b0ff1bcb900bf29489a9692816d79874bea351e7a8b6de96" dependencies = [ - "curve25519-dalek 4.0.0", + "curve25519-dalek 4.1.1", "rand_core 0.6.4", "serde", "zeroize", ] -[[package]] -name = "x509-parser" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb9bace5b5589ffead1afb76e43e34cff39cd0f3ce7e170ae0c29e53b88eb1c" -dependencies = [ - "asn1-rs 0.3.1", - "base64 0.13.1", - "data-encoding", - "der-parser 7.0.0", - "lazy_static", - "nom", - "oid-registry 0.4.0", - "ring 0.16.20", - "rusticata-macros", - "thiserror", - "time 0.3.27", -] - [[package]] name = "x509-parser" version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e0ecbeb7b67ce215e40e3cc7f2ff902f94a223acf44995934763467e7b1febc8" dependencies = [ - "asn1-rs 0.5.2", + "asn1-rs", "base64 0.13.1", "data-encoding", - "der-parser 8.2.0", + "der-parser", "lazy_static", "nom", - "oid-registry 0.6.1", + "oid-registry", "rusticata-macros", "thiserror", "time 0.3.27", diff --git a/polkadot/node/core/approval-voting/Cargo.toml b/polkadot/node/core/approval-voting/Cargo.toml index 4e9c88a9078..5fbcec50cd3 100644 --- a/polkadot/node/core/approval-voting/Cargo.toml +++ b/polkadot/node/core/approval-voting/Cargo.toml @@ -16,8 +16,8 @@ parity-scale-codec = { version = "3.6.1", default-features = false, features = [ gum = { package = "tracing-gum", path = "../../gum" } bitvec = { version = "1.0.0", default-features = false, features = ["alloc"] } schnellru = "0.2.1" -merlin = "2.0" -schnorrkel = "0.9.1" +merlin = "3.0" +schnorrkel = "0.11.4" kvdb = "0.13.0" derive_more = "0.99.17" thiserror = "1.0.48" @@ -35,15 +35,14 @@ sp-consensus = { path = "../../../../substrate/primitives/consensus/common", def sp-consensus-slots = { path = "../../../../substrate/primitives/consensus/slots", default-features = false } sp-application-crypto = { path = "../../../../substrate/primitives/application-crypto", default-features = false, features = ["full_crypto"] } sp-runtime = { path = "../../../../substrate/primitives/runtime", default-features = false } -rand_core = "0.5.1" +# should match schnorrkel +rand_core = "0.6.2" rand_chacha = { version = "0.3.1" } rand = "0.8.5" [dev-dependencies] async-trait = "0.1.74" parking_lot = "0.12.0" -# rand_core should match schnorrkel -rand_core = "0.5.1" sp-keyring = { path = "../../../../substrate/primitives/keyring" } sp-keystore = { path = "../../../../substrate/primitives/keystore" } sp-core = { path = "../../../../substrate/primitives/core" } diff --git a/polkadot/node/core/approval-voting/src/approval_db/common/migration_helpers.rs b/polkadot/node/core/approval-voting/src/approval_db/common/migration_helpers.rs index e21c53e4cac..747bbdb2064 100644 --- a/polkadot/node/core/approval-voting/src/approval_db/common/migration_helpers.rs +++ b/polkadot/node/core/approval-voting/src/approval_db/common/migration_helpers.rs @@ -20,6 +20,7 @@ use polkadot_node_primitives::approval::{ v1::{AssignmentCert, AssignmentCertKind, VrfProof, VrfSignature, RELAY_VRF_MODULO_CONTEXT}, v2::VrfPreOutput, }; + pub fn make_bitvec(len: usize) -> BitVec { bitvec::bitvec![u8, BitOrderLsb0; 0; len] } @@ -30,10 +31,10 @@ pub fn dummy_assignment_cert(kind: AssignmentCertKind) -> AssignmentCert { let mut prng = rand_core::OsRng; let keypair = schnorrkel::Keypair::generate_with(&mut prng); let (inout, proof, _) = keypair.vrf_sign(ctx.bytes(msg)); - let out = inout.to_output(); + let preout = inout.to_preout(); AssignmentCert { kind, - vrf: VrfSignature { pre_output: VrfPreOutput(out), proof: VrfProof(proof) }, + vrf: VrfSignature { pre_output: VrfPreOutput(preout), proof: VrfProof(proof) }, } } diff --git a/polkadot/node/core/approval-voting/src/criteria.rs b/polkadot/node/core/approval-voting/src/criteria.rs index b6ad1971ef6..1af61e72d7a 100644 --- a/polkadot/node/core/approval-voting/src/criteria.rs +++ b/polkadot/node/core/approval-voting/src/criteria.rs @@ -463,7 +463,7 @@ fn compute_relay_vrf_modulo_assignments_v1( let cert = AssignmentCert { kind: AssignmentCertKind::RelayVRFModulo { sample: rvm_sample }, vrf: VrfSignature { - pre_output: VrfPreOutput(vrf_in_out.to_output()), + pre_output: VrfPreOutput(vrf_in_out.to_preout()), proof: VrfProof(vrf_proof), }, }; @@ -543,7 +543,7 @@ fn compute_relay_vrf_modulo_assignments_v2( core_bitfield: assignment_bitfield.clone(), }, vrf: VrfSignature { - pre_output: VrfPreOutput(vrf_in_out.to_output()), + pre_output: VrfPreOutput(vrf_in_out.to_preout()), proof: VrfProof(vrf_proof), }, }; @@ -578,7 +578,7 @@ fn compute_relay_vrf_delay_assignments( let cert = AssignmentCertV2 { kind: AssignmentCertKindV2::RelayVRFDelay { core_index: core }, vrf: VrfSignature { - pre_output: VrfPreOutput(vrf_in_out.to_output()), + pre_output: VrfPreOutput(vrf_in_out.to_preout()), proof: VrfProof(vrf_proof), }, }; diff --git a/polkadot/node/core/approval-voting/src/tests.rs b/polkadot/node/core/approval-voting/src/tests.rs index 498cf62bb30..7a0bde6a55e 100644 --- a/polkadot/node/core/approval-voting/src/tests.rs +++ b/polkadot/node/core/approval-voting/src/tests.rs @@ -418,7 +418,7 @@ fn garbage_assignment_cert(kind: AssignmentCertKind) -> AssignmentCert { let mut prng = rand_core::OsRng; let keypair = schnorrkel::Keypair::generate_with(&mut prng); let (inout, proof, _) = keypair.vrf_sign(ctx.bytes(msg)); - let preout = inout.to_output(); + let preout = inout.to_preout(); AssignmentCert { kind, @@ -432,7 +432,7 @@ fn garbage_assignment_cert_v2(kind: AssignmentCertKindV2) -> AssignmentCertV2 { let mut prng = rand_core::OsRng; let keypair = schnorrkel::Keypair::generate_with(&mut prng); let (inout, proof, _) = keypair.vrf_sign(ctx.bytes(msg)); - let preout = inout.to_output(); + let preout = inout.to_preout(); AssignmentCertV2 { kind, diff --git a/polkadot/node/network/approval-distribution/Cargo.toml b/polkadot/node/network/approval-distribution/Cargo.toml index 7291c1309e1..6f261ae7700 100644 --- a/polkadot/node/network/approval-distribution/Cargo.toml +++ b/polkadot/node/network/approval-distribution/Cargo.toml @@ -33,9 +33,9 @@ polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } polkadot-primitives-test-helpers = { path = "../../../primitives/test-helpers" } assert_matches = "1.4.0" -schnorrkel = { version = "0.9.1", default-features = false } +schnorrkel = { version = "0.11.4", default-features = false } # rand_core should match schnorrkel -rand_core = "0.5.1" +rand_core = "0.6.2" rand_chacha = "0.3.1" env_logger = "0.9.0" log = "0.4.17" diff --git a/polkadot/node/network/approval-distribution/src/tests.rs b/polkadot/node/network/approval-distribution/src/tests.rs index ad5d0bb0a9c..7d933e2047f 100644 --- a/polkadot/node/network/approval-distribution/src/tests.rs +++ b/polkadot/node/network/approval-distribution/src/tests.rs @@ -297,7 +297,7 @@ fn fake_assignment_cert(block_hash: Hash, validator: ValidatorIndex) -> Indirect let mut prng = rand_core::OsRng; let keypair = schnorrkel::Keypair::generate_with(&mut prng); let (inout, proof, _) = keypair.vrf_sign(ctx.bytes(msg)); - let preout = inout.to_output(); + let preout = inout.to_preout(); IndirectAssignmentCert { block_hash, @@ -319,7 +319,7 @@ fn fake_assignment_cert_v2( let mut prng = rand_core::OsRng; let keypair = schnorrkel::Keypair::generate_with(&mut prng); let (inout, proof, _) = keypair.vrf_sign(ctx.bytes(msg)); - let preout = inout.to_output(); + let preout = inout.to_preout(); IndirectAssignmentCertV2 { block_hash, diff --git a/polkadot/node/primitives/Cargo.toml b/polkadot/node/primitives/Cargo.toml index 802a830f3ab..09817ed1cf3 100644 --- a/polkadot/node/primitives/Cargo.toml +++ b/polkadot/node/primitives/Cargo.toml @@ -21,7 +21,7 @@ sp-keystore = { path = "../../../substrate/primitives/keystore" } sp-maybe-compressed-blob = { path = "../../../substrate/primitives/maybe-compressed-blob" } sp-runtime = { path = "../../../substrate/primitives/runtime" } polkadot-parachain-primitives = { path = "../../parachain", default-features = false } -schnorrkel = "0.9.1" +schnorrkel = "0.11.4" thiserror = "1.0.48" bitvec = { version = "1.0.0", default-features = false, features = ["alloc"] } serde = { version = "1.0.193", features = ["derive"] } diff --git a/substrate/client/authority-discovery/Cargo.toml b/substrate/client/authority-discovery/Cargo.toml index e8b9b3f7b7b..a8a28a501ea 100644 --- a/substrate/client/authority-discovery/Cargo.toml +++ b/substrate/client/authority-discovery/Cargo.toml @@ -24,7 +24,7 @@ codec = { package = "parity-scale-codec", version = "3.6.1", default-features = futures = "0.3.21" futures-timer = "3.0.1" ip_network = "0.4.1" -libp2p = { version = "0.51.3", features = ["ed25519", "kad"] } +libp2p = { version = "0.51.4", features = ["ed25519", "kad"] } multihash = { version = "0.18.1", default-features = false, features = [ "sha2", "std", diff --git a/substrate/client/network-gossip/Cargo.toml b/substrate/client/network-gossip/Cargo.toml index c34ce0cd538..c53c53fb135 100644 --- a/substrate/client/network-gossip/Cargo.toml +++ b/substrate/client/network-gossip/Cargo.toml @@ -20,7 +20,7 @@ targets = ["x86_64-unknown-linux-gnu"] ahash = "0.8.2" futures = "0.3.21" futures-timer = "3.0.1" -libp2p = "0.51.3" +libp2p = "0.51.4" log = "0.4.17" schnellru = "0.2.1" tracing = "0.1.29" diff --git a/substrate/client/network/Cargo.toml b/substrate/client/network/Cargo.toml index abad2c80917..6fa88457e98 100644 --- a/substrate/client/network/Cargo.toml +++ b/substrate/client/network/Cargo.toml @@ -28,7 +28,7 @@ fnv = "1.0.6" futures = "0.3.21" futures-timer = "3.0.2" ip_network = "0.4.1" -libp2p = { version = "0.51.3", features = ["dns", "identify", "kad", "macros", "mdns", "noise", "ping", "request-response", "tcp", "tokio", "websocket", "yamux"] } +libp2p = { version = "0.51.4", features = ["dns", "identify", "kad", "macros", "mdns", "noise", "ping", "request-response", "tcp", "tokio", "websocket", "yamux"] } linked_hash_set = "0.1.3" log = "0.4.17" mockall = "0.11.3" diff --git a/substrate/client/network/statement/Cargo.toml b/substrate/client/network/statement/Cargo.toml index e07eb939ea3..d3ce2a63ef1 100644 --- a/substrate/client/network/statement/Cargo.toml +++ b/substrate/client/network/statement/Cargo.toml @@ -20,7 +20,7 @@ array-bytes = "6.1" async-channel = "1.8.0" codec = { package = "parity-scale-codec", version = "3.6.1", features = ["derive"] } futures = "0.3.21" -libp2p = "0.51.3" +libp2p = "0.51.4" log = "0.4.17" prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus" } sc-network-common = { path = "../common" } diff --git a/substrate/client/network/sync/Cargo.toml b/substrate/client/network/sync/Cargo.toml index 1cb06e2bd88..cb19e1adbe5 100644 --- a/substrate/client/network/sync/Cargo.toml +++ b/substrate/client/network/sync/Cargo.toml @@ -25,7 +25,7 @@ async-trait = "0.1.74" codec = { package = "parity-scale-codec", version = "3.6.1", features = ["derive"] } futures = "0.3.21" futures-timer = "3.0.2" -libp2p = "0.51.3" +libp2p = "0.51.4" log = "0.4.17" mockall = "0.11.3" prost = "0.11" diff --git a/substrate/client/network/test/Cargo.toml b/substrate/client/network/test/Cargo.toml index b5c5c9e1e3f..dced6ed6730 100644 --- a/substrate/client/network/test/Cargo.toml +++ b/substrate/client/network/test/Cargo.toml @@ -20,7 +20,7 @@ tokio = "1.22.0" async-trait = "0.1.74" futures = "0.3.21" futures-timer = "3.0.1" -libp2p = "0.51.3" +libp2p = "0.51.4" log = "0.4.17" parking_lot = "0.12.1" rand = "0.8.5" diff --git a/substrate/client/network/transactions/Cargo.toml b/substrate/client/network/transactions/Cargo.toml index 8acd4531de8..24b5087af1f 100644 --- a/substrate/client/network/transactions/Cargo.toml +++ b/substrate/client/network/transactions/Cargo.toml @@ -19,7 +19,7 @@ targets = ["x86_64-unknown-linux-gnu"] array-bytes = "6.1" codec = { package = "parity-scale-codec", version = "3.6.1", features = ["derive"] } futures = "0.3.21" -libp2p = "0.51.3" +libp2p = "0.51.4" log = "0.4.17" prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus" } sc-network = { path = ".." } diff --git a/substrate/client/offchain/Cargo.toml b/substrate/client/offchain/Cargo.toml index 9f9731ba8de..b049ba0a3d8 100644 --- a/substrate/client/offchain/Cargo.toml +++ b/substrate/client/offchain/Cargo.toml @@ -24,7 +24,7 @@ futures = "0.3.21" futures-timer = "3.0.2" hyper = { version = "0.14.16", features = ["http2", "stream"] } hyper-rustls = { version = "0.24.0", features = ["http2"] } -libp2p = "0.51.3" +libp2p = "0.51.4" num_cpus = "1.13" once_cell = "1.8" parking_lot = "0.12.1" diff --git a/substrate/client/telemetry/Cargo.toml b/substrate/client/telemetry/Cargo.toml index 0f7f8ab33ee..8e5ea836cbd 100644 --- a/substrate/client/telemetry/Cargo.toml +++ b/substrate/client/telemetry/Cargo.toml @@ -19,7 +19,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] chrono = "0.4.27" futures = "0.3.21" -libp2p = { version = "0.51.3", features = ["dns", "tcp", "tokio", "wasm-ext", "websocket"] } +libp2p = { version = "0.51.4", features = ["dns", "tcp", "tokio", "wasm-ext", "websocket"] } log = "0.4.17" parking_lot = "0.12.1" pin-project = "1.0.12" diff --git a/substrate/primitives/core/Cargo.toml b/substrate/primitives/core/Cargo.toml index cb36d7bb6b4..b4d3c843928 100644 --- a/substrate/primitives/core/Cargo.toml +++ b/substrate/primitives/core/Cargo.toml @@ -50,8 +50,8 @@ array-bytes = { version = "6.1", optional = true } ed25519-zebra = { version = "3.1.0", default-features = false, optional = true } blake2 = { version = "0.10.4", default-features = false, optional = true } libsecp256k1 = { version = "0.7", default-features = false, features = ["static-context"], optional = true } -schnorrkel = { version = "0.9.1", features = ["preaudit_deprecated", "u64_backend"], default-features = false } -merlin = { version = "2.0", default-features = false } +schnorrkel = { version = "0.11.4", features = ["preaudit_deprecated"], default-features = false } +merlin = { version = "3.0", default-features = false } secp256k1 = { version = "0.28.0", default-features = false, features = ["alloc", "recovery"], optional = true } sp-core-hashing = { path = "hashing", default-features = false, optional = true } sp-runtime-interface = { path = "../runtime-interface", default-features = false } diff --git a/substrate/primitives/core/src/sr25519.rs b/substrate/primitives/core/src/sr25519.rs index 71d9c3b3247..b821055e2c5 100644 --- a/substrate/primitives/core/src/sr25519.rs +++ b/substrate/primitives/core/src/sr25519.rs @@ -555,7 +555,7 @@ pub mod vrf { use crate::crypto::{VrfCrypto, VrfPublic}; use schnorrkel::{ errors::MultiSignatureStage, - vrf::{VRF_OUTPUT_LENGTH, VRF_PROOF_LENGTH}, + vrf::{VRF_PREOUT_LENGTH, VRF_PROOF_LENGTH}, SignatureError, }; @@ -636,7 +636,7 @@ pub mod vrf { /// VRF pre-output type suitable for schnorrkel operations. #[derive(Clone, Debug, PartialEq, Eq)] - pub struct VrfPreOutput(pub schnorrkel::vrf::VRFOutput); + pub struct VrfPreOutput(pub schnorrkel::vrf::VRFPreOut); impl Encode for VrfPreOutput { fn encode(&self) -> Vec { @@ -646,19 +646,19 @@ pub mod vrf { impl Decode for VrfPreOutput { fn decode(i: &mut R) -> Result { - let decoded = <[u8; VRF_OUTPUT_LENGTH]>::decode(i)?; - Ok(Self(schnorrkel::vrf::VRFOutput::from_bytes(&decoded).map_err(convert_error)?)) + let decoded = <[u8; VRF_PREOUT_LENGTH]>::decode(i)?; + Ok(Self(schnorrkel::vrf::VRFPreOut::from_bytes(&decoded).map_err(convert_error)?)) } } impl MaxEncodedLen for VrfPreOutput { fn max_encoded_len() -> usize { - <[u8; VRF_OUTPUT_LENGTH]>::max_encoded_len() + <[u8; VRF_PREOUT_LENGTH]>::max_encoded_len() } } impl TypeInfo for VrfPreOutput { - type Identity = [u8; VRF_OUTPUT_LENGTH]; + type Identity = [u8; VRF_PREOUT_LENGTH]; fn type_info() -> scale_info::Type { Self::Identity::type_info() @@ -717,11 +717,11 @@ pub mod vrf { let proof = self.0.dleq_proove(extra, &inout, true).0; - VrfSignature { pre_output: VrfPreOutput(inout.to_output()), proof: VrfProof(proof) } + VrfSignature { pre_output: VrfPreOutput(inout.to_preout()), proof: VrfProof(proof) } } fn vrf_pre_output(&self, input: &Self::VrfInput) -> Self::VrfPreOutput { - let pre_output = self.0.vrf_create_hash(input.0.clone()).to_output(); + let pre_output = self.0.vrf_create_hash(input.0.clone()).to_preout(); VrfPreOutput(pre_output) } } @@ -762,6 +762,7 @@ pub mod vrf { ScalarFormatError => "Signature error: `ScalarFormatError`".into(), NotMarkedSchnorrkel => "Signature error: `NotMarkedSchnorrkel`".into(), BytesLengthError { .. } => "Signature error: `BytesLengthError`".into(), + InvalidKey => "Signature error: `InvalidKey`".into(), MuSigAbsent { musig_stage: Commitment } => "Signature error: `MuSigAbsent` at stage `Commitment`".into(), MuSigAbsent { musig_stage: Reveal } => @@ -1141,7 +1142,7 @@ mod tests { }) .unwrap(); let signature2 = - VrfSignature { pre_output: VrfPreOutput(inout.to_output()), proof: VrfProof(proof) }; + VrfSignature { pre_output: VrfPreOutput(inout.to_preout()), proof: VrfProof(proof) }; assert!(public.vrf_verify(&data, &signature2)); assert_eq!(signature.pre_output, signature2.pre_output); diff --git a/substrate/primitives/io/Cargo.toml b/substrate/primitives/io/Cargo.toml index 9671880069a..47de957e6bf 100644 --- a/substrate/primitives/io/Cargo.toml +++ b/substrate/primitives/io/Cargo.toml @@ -36,7 +36,7 @@ tracing = { version = "0.1.29", default-features = false } tracing-core = { version = "0.1.32", default-features = false } # Required for backwards compatibility reason, but only used for verifying when `UseDalekExt` is set. -ed25519-dalek = { version = "2.0", default-features = false, optional = true } +ed25519-dalek = { version = "2.1", default-features = false, optional = true } [build-dependencies] rustversion = "1.0.6" diff --git a/substrate/primitives/statement-store/Cargo.toml b/substrate/primitives/statement-store/Cargo.toml index f4a80eb0c38..cacfd08f3eb 100644 --- a/substrate/primitives/statement-store/Cargo.toml +++ b/substrate/primitives/statement-store/Cargo.toml @@ -28,9 +28,9 @@ sp-externalities = { path = "../externalities", default-features = false } thiserror = { version = "1.0", optional = true } # ECIES dependencies -ed25519-dalek = { version = "2.0.0", optional = true } -x25519-dalek = { version = "2.0.0", optional = true, features = ["static_secrets"] } -curve25519-dalek = { version = "4.0.0", optional = true } +ed25519-dalek = { version = "2.1", optional = true } +x25519-dalek = { version = "2.0", optional = true, features = ["static_secrets"] } +curve25519-dalek = { version = "4.1.1", optional = true } aes-gcm = { version = "0.10", optional = true } hkdf = { version = "0.12.0", optional = true } sha2 = { version = "0.10.7", optional = true } -- GitLab From c9f9b4b2a84ba2578f64e39bbdb4c9499792bc92 Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Wed, 20 Dec 2023 10:16:52 +0300 Subject: [PATCH 065/191] Fix bridges scripts to test Rococo <> Westend bridge locally (#2752) I think I broke it in https://github.com/paritytech/polkadot-sdk/pull/2139 - fees has increased and amounts that we send are no longer enough to cover fees. Also changed a consts (test + 33%) using latest weights. --------- Co-authored-by: Branislav Kontur --- bridges/primitives/chain-bridge-hub-rococo/src/lib.rs | 6 +++--- bridges/primitives/chain-bridge-hub-westend/src/lib.rs | 6 +++--- cumulus/scripts/bridges_rococo_westend.sh | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/bridges/primitives/chain-bridge-hub-rococo/src/lib.rs b/bridges/primitives/chain-bridge-hub-rococo/src/lib.rs index 1fe44597c3d..f79b8a8afb3 100644 --- a/bridges/primitives/chain-bridge-hub-rococo/src/lib.rs +++ b/bridges/primitives/chain-bridge-hub-rococo/src/lib.rs @@ -86,13 +86,13 @@ frame_support::parameter_types! { /// The XCM fee that is paid for executing XCM program (with `ExportMessage` instruction) at the Rococo /// BridgeHub. /// (initially was calculated by test `BridgeHubRococo::can_calculate_weight_for_paid_export_message_with_reserve_transfer` + `33%`) - pub const BridgeHubRococoBaseXcmFeeInRocs: u128 = 1628875538; + pub const BridgeHubRococoBaseXcmFeeInRocs: u128 = 1_640_102_205; /// Transaction fee that is paid at the Rococo BridgeHub for delivering single inbound message. /// (initially was calculated by test `BridgeHubRococo::can_calculate_fee_for_complex_message_delivery_transaction` + `33%`) - pub const BridgeHubRococoBaseDeliveryFeeInRocs: u128 = 6417262881; + pub const BridgeHubRococoBaseDeliveryFeeInRocs: u128 = 5_651_581_649; /// Transaction fee that is paid at the Rococo BridgeHub for delivering single outbound message confirmation. /// (initially was calculated by test `BridgeHubRococo::can_calculate_fee_for_complex_message_confirmation_transaction` + `33%`) - pub const BridgeHubRococoBaseConfirmationFeeInRocs: u128 = 6159996668; + pub const BridgeHubRococoBaseConfirmationFeeInRocs: u128 = 4_045_736_577; } diff --git a/bridges/primitives/chain-bridge-hub-westend/src/lib.rs b/bridges/primitives/chain-bridge-hub-westend/src/lib.rs index 0124e05bf88..f4524f719f9 100644 --- a/bridges/primitives/chain-bridge-hub-westend/src/lib.rs +++ b/bridges/primitives/chain-bridge-hub-westend/src/lib.rs @@ -78,13 +78,13 @@ frame_support::parameter_types! { /// The XCM fee that is paid for executing XCM program (with `ExportMessage` instruction) at the Westend /// BridgeHub. /// (initially was calculated by test `BridgeHubWestend::can_calculate_weight_for_paid_export_message_with_reserve_transfer` + `33%`) - pub const BridgeHubWestendBaseXcmFeeInWnds: u128 = 488662666666; + pub const BridgeHubWestendBaseXcmFeeInWnds: u128 = 492_077_333_333; /// Transaction fee that is paid at the Westend BridgeHub for delivering single inbound message. /// (initially was calculated by test `BridgeHubWestend::can_calculate_fee_for_complex_message_delivery_transaction` + `33%`) - pub const BridgeHubWestendBaseDeliveryFeeInWnds: u128 = 1925196628010; + pub const BridgeHubWestendBaseDeliveryFeeInWnds: u128 = 1_695_489_961_344; /// Transaction fee that is paid at the Westend BridgeHub for delivering single outbound message confirmation. /// (initially was calculated by test `BridgeHubWestend::can_calculate_fee_for_complex_message_confirmation_transaction` + `33%`) - pub const BridgeHubWestendBaseConfirmationFeeInWnds: u128 = 1848016628010; + pub const BridgeHubWestendBaseConfirmationFeeInWnds: u128 = 1_618_309_961_344; } diff --git a/cumulus/scripts/bridges_rococo_westend.sh b/cumulus/scripts/bridges_rococo_westend.sh index 8bce141d39a..c52b72e51fc 100755 --- a/cumulus/scripts/bridges_rococo_westend.sh +++ b/cumulus/scripts/bridges_rococo_westend.sh @@ -326,7 +326,7 @@ case "$1" in "//Alice" \ "$(jq --null-input '{ "V3": { "parents": 2, "interior": { "X2": [ { "GlobalConsensus": "Westend" }, { "Parachain": 1000 } ] } } }')" \ "$(jq --null-input '{ "V3": { "parents": 0, "interior": { "X1": { "AccountId32": { "id": [212, 53, 147, 199, 21, 253, 211, 28, 97, 20, 26, 189, 4, 169, 159, 214, 130, 44, 133, 88, 133, 76, 205, 227, 154, 86, 132, 231, 165, 109, 162, 125] } } } } }')" \ - "$(jq --null-input '{ "V3": [ { "id": { "Concrete": { "parents": 1, "interior": "Here" } }, "fun": { "Fungible": 200000000000 } } ] }')" \ + "$(jq --null-input '{ "V3": [ { "id": { "Concrete": { "parents": 1, "interior": "Here" } }, "fun": { "Fungible": 5000000000000 } } ] }')" \ 0 \ "Unlimited" ;; @@ -338,7 +338,7 @@ case "$1" in "//Alice" \ "$(jq --null-input '{ "V3": { "parents": 2, "interior": { "X2": [ { "GlobalConsensus": "Westend" }, { "Parachain": 1000 } ] } } }')" \ "$(jq --null-input '{ "V3": { "parents": 0, "interior": { "X1": { "AccountId32": { "id": [212, 53, 147, 199, 21, 253, 211, 28, 97, 20, 26, 189, 4, 169, 159, 214, 130, 44, 133, 88, 133, 76, 205, 227, 154, 86, 132, 231, 165, 109, 162, 125] } } } } }')" \ - "$(jq --null-input '{ "V3": [ { "id": { "Concrete": { "parents": 2, "interior": { "X1": { "GlobalConsensus": "Westend" } } } }, "fun": { "Fungible": 40000000000 } } ] }')" \ + "$(jq --null-input '{ "V3": [ { "id": { "Concrete": { "parents": 2, "interior": { "X1": { "GlobalConsensus": "Westend" } } } }, "fun": { "Fungible": 3000000000000 } } ] }')" \ 0 \ "Unlimited" ;; @@ -350,7 +350,7 @@ case "$1" in "//Alice" \ "$(jq --null-input '{ "V3": { "parents": 2, "interior": { "X2": [ { "GlobalConsensus": "Rococo" }, { "Parachain": 1000 } ] } } }')" \ "$(jq --null-input '{ "V3": { "parents": 0, "interior": { "X1": { "AccountId32": { "id": [212, 53, 147, 199, 21, 253, 211, 28, 97, 20, 26, 189, 4, 169, 159, 214, 130, 44, 133, 88, 133, 76, 205, 227, 154, 86, 132, 231, 165, 109, 162, 125] } } } } }')" \ - "$(jq --null-input '{ "V3": [ { "id": { "Concrete": { "parents": 1, "interior": "Here" } }, "fun": { "Fungible": 150000000000 } } ] }')" \ + "$(jq --null-input '{ "V3": [ { "id": { "Concrete": { "parents": 1, "interior": "Here" } }, "fun": { "Fungible": 5000000000000 } } ] }')" \ 0 \ "Unlimited" ;; @@ -362,7 +362,7 @@ case "$1" in "//Alice" \ "$(jq --null-input '{ "V3": { "parents": 2, "interior": { "X2": [ { "GlobalConsensus": "Rococo" }, { "Parachain": 1000 } ] } } }')" \ "$(jq --null-input '{ "V3": { "parents": 0, "interior": { "X1": { "AccountId32": { "id": [212, 53, 147, 199, 21, 253, 211, 28, 97, 20, 26, 189, 4, 169, 159, 214, 130, 44, 133, 88, 133, 76, 205, 227, 154, 86, 132, 231, 165, 109, 162, 125] } } } } }')" \ - "$(jq --null-input '{ "V3": [ { "id": { "Concrete": { "parents": 2, "interior": { "X1": { "GlobalConsensus": "Rococo" } } } }, "fun": { "Fungible": 100000000000 } } ] }')" \ + "$(jq --null-input '{ "V3": [ { "id": { "Concrete": { "parents": 2, "interior": { "X1": { "GlobalConsensus": "Rococo" } } } }, "fun": { "Fungible": 3000000000000 } } ] }')" \ 0 \ "Unlimited" ;; -- GitLab From d32f66fb8f78a2443eb9969eb6f43c2d1f5775a8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Dec 2023 09:48:26 +0100 Subject: [PATCH 066/191] Bump chrono from 0.4.27 to 0.4.31 (#2761) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [chrono](https://github.com/chronotope/chrono) from 0.4.27 to 0.4.31.
Release notes

Sourced from chrono's releases.

0.4.31

Another maintenance release. It was not a planned effort to improve our support for UNIX timestamps, yet most PRs seem related to this.

Deprecations

  • Deprecate timestamp_nanos in favor of the non-panicking timestamp_nanos_opt (#1275)

Additions

  • Add DateTime::<Utc>::from_timestamp (#1279, thanks @​demurgos)
  • Add TimeZone::timestamp_micros (#1285, thanks @​emikitas)
  • Add DateTime<Tz>::timestamp_nanos_opt and NaiveDateTime::timestamp_nanos_opt (#1275)
  • Add UNIX_EPOCH constants (#1291)

Fixes

  • Format day of month in RFC 2822 without padding (#1272)
  • Don't allow strange leap seconds which are not on a minute boundary initialization methods (#1283) This makes many methods a little more strict:
    • NaiveTime::from_hms_milli
    • NaiveTime::from_hms_milli_opt
    • NaiveTime::from_hms_micro
    • NaiveTime::from_hms_micro_opt
    • NaiveTime::from_hms_nano
    • NaiveTime::from_hms_nano_opt
    • NaiveTime::from_num_seconds_from_midnight
    • NaiveTime::from_num_seconds_from_midnight_opt
    • NaiveDate::and_hms_milli
    • NaiveDate::and_hms_milli_opt
    • NaiveDate::and_hms_micro
    • NaiveDate::and_hms_micro_opt
    • NaiveDate::and_hms_nano
    • NaiveDate::and_hms_nano_opt
    • NaiveDateTime::from_timestamp
    • NaiveDateTime::from_timestamp_opt
    • TimeZone::timestamp
    • TimeZone::timestamp_opt
  • Fix underflow in NaiveDateTime::timestamp_nanos_opt (#1294, thanks @​crepererum)

Documentation

  • Add more documentation about the RFC 2822 obsolete date format (#1267)

Internal

  • Remove internal __doctest feature and doc_comment dependency (#1276)
  • CI: Bump actions/checkout from 3 to 4 (#1280)
  • Optimize NaiveDate::add_days for small values (#1214)
  • Upgrade pure-rust-locales to 0.7.0 (#1288, thanks @​jeremija wo did good improvements on pure-rust-locales)

Thanks to all contributors on behalf of the chrono team, @​djc and @​pitdicker!

0.4.30

In this release, we have decided to swap out the chrono::Duration type (which has been a re-export of time 0.1 Duration type) with our own definition, which exposes a strict superset of the time::Duration API. This helps avoid warnings about the [CVE-2020-26235] and [RUSTSEC-2020-0071] advisories for downstream users and allows us to improve the Duration API going forward.

... (truncated)

Commits
  • e730c6a Bump version to 0.4.31
  • 2afdde8 fix: underflow during datetime->nanos conversion
  • 46ad2c2 Add UNIX_EPOCH constants
  • 1df8db3 Add TimeZone::timestamp_micros
  • 861d4e1 Make TimeZone::timestamp_millis_opt use
  • 3c4846a Upgrade pure-rust-locales to 0.7.0
  • 6665804 Deny leap second if secs != 59 in from_num_seconds_from_midnight_opt
  • 61b7ffb Deny leap second if secs != 59 in from_hms_nano_opt
  • 202af6c Don't generate leap seconds that are not 60 in NaiveTime's Arbitrary impl
  • 60283ab Don't create strange leap seconds in tests
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=chrono&package-manager=cargo&previous-version=0.4.27&new-version=0.4.31)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 30 ++++--------------- substrate/client/cli/Cargo.toml | 2 +- substrate/client/telemetry/Cargo.toml | 2 +- substrate/client/tracing/Cargo.toml | 2 +- .../utils/frame/generate-bags/Cargo.toml | 2 +- 5 files changed, 10 insertions(+), 28 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 14b1512eae4..157439446e2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -622,7 +622,7 @@ dependencies = [ "num-traits", "rusticata-macros", "thiserror", - "time 0.3.27", + "time", ] [[package]] @@ -2300,15 +2300,14 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.27" +version = "0.4.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f56b4c72906975ca04becb8a30e102dfecddd0c06181e3e95ddc444be28881f8" +checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" dependencies = [ "android-tzdata", "iana-time-zone", "js-sys", "num-traits", - "time 0.1.45", "wasm-bindgen", "windows-targets 0.48.5", ] @@ -13902,7 +13901,7 @@ checksum = "ffbe84efe2f38dea12e9bfc1f65377fdf03e53a18cb3b995faedf7934c7e785b" dependencies = [ "pem", "ring 0.16.20", - "time 0.3.27", + "time", "yasna", ] @@ -19032,17 +19031,6 @@ dependencies = [ "tikv-jemalloc-sys", ] -[[package]] -name = "time" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" -dependencies = [ - "libc", - "wasi 0.10.0+wasi-snapshot-preview1", - "winapi", -] - [[package]] name = "time" version = "0.3.27" @@ -19875,12 +19863,6 @@ version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" -[[package]] -name = "wasi" -version = "0.10.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -20813,7 +20795,7 @@ dependencies = [ "oid-registry", "rusticata-macros", "thiserror", - "time 0.3.27", + "time", ] [[package]] @@ -20987,7 +20969,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" dependencies = [ - "time 0.3.27", + "time", ] [[package]] diff --git a/substrate/client/cli/Cargo.toml b/substrate/client/cli/Cargo.toml index 82362e35ea6..80d3815fbc6 100644 --- a/substrate/client/cli/Cargo.toml +++ b/substrate/client/cli/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] array-bytes = "6.1" -chrono = "0.4.27" +chrono = "0.4.31" clap = { version = "4.4.11", features = ["derive", "string", "wrap_help"] } fdlimit = "0.3.0" futures = "0.3.21" diff --git a/substrate/client/telemetry/Cargo.toml b/substrate/client/telemetry/Cargo.toml index 8e5ea836cbd..f4c73dec67e 100644 --- a/substrate/client/telemetry/Cargo.toml +++ b/substrate/client/telemetry/Cargo.toml @@ -17,7 +17,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -chrono = "0.4.27" +chrono = "0.4.31" futures = "0.3.21" libp2p = { version = "0.51.4", features = ["dns", "tcp", "tokio", "wasm-ext", "websocket"] } log = "0.4.17" diff --git a/substrate/client/tracing/Cargo.toml b/substrate/client/tracing/Cargo.toml index 39428c6c6f5..c5d57834604 100644 --- a/substrate/client/tracing/Cargo.toml +++ b/substrate/client/tracing/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] ansi_term = "0.12.1" is-terminal = "0.4.9" -chrono = "0.4.27" +chrono = "0.4.31" codec = { package = "parity-scale-codec", version = "3.6.1" } lazy_static = "1.4.0" libc = "0.2.121" diff --git a/substrate/utils/frame/generate-bags/Cargo.toml b/substrate/utils/frame/generate-bags/Cargo.toml index f075452f4c6..4afb2a80b77 100644 --- a/substrate/utils/frame/generate-bags/Cargo.toml +++ b/substrate/utils/frame/generate-bags/Cargo.toml @@ -20,5 +20,5 @@ pallet-staking = { path = "../../../frame/staking" } sp-staking = { path = "../../../primitives/staking" } # third party -chrono = { version = "0.4.27" } +chrono = { version = "0.4.31" } num-format = "0.4.3" -- GitLab From 4f832ea865e48625c8035ec08b8fb98e9f0e5519 Mon Sep 17 00:00:00 2001 From: Muharem Date: Wed, 20 Dec 2023 13:57:26 +0100 Subject: [PATCH 067/191] pallet-asset-conversion: Decoupling Native Currency Dependancy (#2031) closes https://github.com/paritytech/polkadot-sdk/issues/1842 Decoupling Pallet from the Concept of Native Currency Currently, the pallet is intrinsically linked with the concept of native currency, requiring users to provide implementations of the `fungible::*` and `fungibles::*` traits to interact with native and non native assets. This incapsulates some non-related to the pallet complexity and makes it less adaptable in contexts where the native currency concept is absent. With this PR, the dependence on `fungible::*` for liquidity-supplying assets has been removed. Instead, the native and non-native currencies' handling is now overseen by a single type that implements the `fungibles::*` traits. To simplify this integration, types have been introduced to facilitate the creation of a union between `fungible::*` and `fungibles::*` implementations, producing a unified `fungibles::*` type. One of the reasons driving these changes is the ambition to create a more user-friendly API for the `SwapCredit` implementation. Given that it interacts with two distinct credit types from `fungible` and `fungibles`, a unified type was introduced. Clients now manage potential conversion failures for those credit types. In certain contexts, it's vital to guarantee that operations are fail-safe, like in this impl - [PR](https://github.com/paritytech/polkadot-sdk/pull/1845), place in [code](https://github.com/paritytech/polkadot-sdk/blob/20b85a5fada8f55c98ba831964f5866ffeadf4da/cumulus/primitives/utility/src/lib.rs#L429). Additional Updates: - abstracted the pool ID and its account derivation logic via trait bounds, along with common implementation offerings; - removed `inc_providers` on a pool creation for the pool account; - benchmarks: -- swap complexity is N, not const; -- removed `From + Into` bound from `T::Balance`; -- removed swap/liquidity/.. amount constants, resolve them dynamically based on pallet configuration; -- migrated to v2 API; - `OnUnbalanced` handler for the pool creation fee, replacing direct transfers to a specified account ID; - renamed `MultiAssetId` to `AssetKind` aligning with naming across frame crates; related PRs: - (depends) https://github.com/paritytech/polkadot-sdk/pull/1677 - (caused) https://github.com/paritytech/polkadot-sdk/pull/2033 - (caused) https://github.com/paritytech/polkadot-sdk/pull/1876 --------- Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> Co-authored-by: Liam Aharon --- .../assets/asset-hub-rococo/src/tests/swap.rs | 2 +- .../asset-hub-westend/src/tests/swap.rs | 2 +- .../assets/asset-hub-kusama/src/lib.rs | 1480 ----------------- .../assets/asset-hub-kusama/src/xcm_config.rs | 640 ------- .../assets/asset-hub-rococo/src/lib.rs | 76 +- .../src/weights/pallet_asset_conversion.rs | 96 +- .../assets/asset-hub-rococo/src/xcm_config.rs | 33 +- .../assets/asset-hub-westend/src/lib.rs | 191 +-- .../src/weights/pallet_asset_conversion.rs | 100 +- .../asset-hub-westend/src/xcm_config.rs | 34 +- .../runtimes/assets/common/src/benchmarks.rs | 44 + .../runtimes/assets/common/src/lib.rs | 2 + .../common/src/local_and_foreign_assets.rs | 474 +----- prdoc/pr_2031.prdoc | 29 + substrate/bin/node/runtime/src/lib.rs | 54 +- .../asset-conversion/src/benchmarking.rs | 539 +++--- substrate/frame/asset-conversion/src/lib.rs | 534 +++--- substrate/frame/asset-conversion/src/mock.rs | 40 +- substrate/frame/asset-conversion/src/swap.rs | 36 +- substrate/frame/asset-conversion/src/tests.rs | 1249 +++++++------- substrate/frame/asset-conversion/src/types.rs | 276 +-- .../frame/asset-conversion/src/weights.rs | 232 ++- .../asset-conversion-tx-payment/src/lib.rs | 1 - .../asset-conversion-tx-payment/src/mock.rs | 43 +- .../src/payment.rs | 17 +- .../asset-conversion-tx-payment/src/tests.rs | 43 +- 26 files changed, 1723 insertions(+), 4544 deletions(-) delete mode 100644 cumulus/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs delete mode 100644 cumulus/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs create mode 100644 cumulus/parachains/runtimes/assets/common/src/benchmarks.rs create mode 100644 prdoc/pr_2031.prdoc diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/swap.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/swap.rs index 12306e63346..3dcc51b75cc 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/swap.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/swap.rs @@ -266,7 +266,7 @@ fn cannot_create_pool_from_pool_assets() { Box::new(asset_native), Box::new(asset_one), ), - Err(DispatchError::Module(ModuleError{index: _, error: _, message})) => assert_eq!(message, Some("UnsupportedAsset")) + Err(DispatchError::Module(ModuleError{index: _, error: _, message})) => assert_eq!(message, Some("Unknown")) ); }); } diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/swap.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/swap.rs index 46a9b4252e1..47b6ab01e8f 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/swap.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/swap.rs @@ -260,7 +260,7 @@ fn cannot_create_pool_from_pool_assets() { Box::new(asset_native), Box::new(asset_one), ), - Err(DispatchError::Module(ModuleError{index: _, error: _, message})) => assert_eq!(message, Some("UnsupportedAsset")) + Err(DispatchError::Module(ModuleError{index: _, error: _, message})) => assert_eq!(message, Some("Unknown")) ); }); } diff --git a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs deleted file mode 100644 index a1ee0e4df71..00000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/lib.rs +++ /dev/null @@ -1,1480 +0,0 @@ -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! # Asset Hub Kusama Runtime -//! -//! Asset Hub Kusama, formerly known as "Statemine", is the canary network for its Polkadot cousin. - -#![cfg_attr(not(feature = "std"), no_std)] -#![recursion_limit = "256"] - -// Make the WASM binary available. -#[cfg(feature = "std")] -include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); - -mod weights; -pub mod xcm_config; - -use assets_common::{ - foreign_creators::ForeignCreators, - local_and_foreign_assets::{LocalAndForeignAssets, MultiLocationConverter}, - matching::FromSiblingParachain, - AssetIdForTrustBackedAssetsConvert, MultiLocationForAssetId, -}; -use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; -use cumulus_primitives_core::ParaId; -use polkadot_runtime_common::xcm_sender::NoPriceForMessageDelivery; -use sp_api::impl_runtime_apis; -use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; -use sp_runtime::{ - create_runtime_str, generic, impl_opaque_keys, - traits::{AccountIdConversion, AccountIdLookup, BlakeTwo256, Block as BlockT, Verify}, - transaction_validity::{TransactionSource, TransactionValidity}, - ApplyExtrinsicResult, Permill, -}; - -use sp_std::prelude::*; -#[cfg(feature = "std")] -use sp_version::NativeVersion; -use sp_version::RuntimeVersion; - -use codec::{Decode, Encode, MaxEncodedLen}; -use frame_support::{ - construct_runtime, - dispatch::DispatchClass, - genesis_builder_helper::{build_config, create_default_config}, - ord_parameter_types, parameter_types, - traits::{ - AsEnsureOriginWithArg, ConstBool, ConstU128, ConstU32, ConstU64, ConstU8, EitherOfDiverse, - InstanceFilter, - }, - weights::{ConstantMultiplier, Weight}, - BoundedVec, PalletId, -}; -use frame_system::{ - limits::{BlockLength, BlockWeights}, - EnsureRoot, EnsureSigned, EnsureSignedBy, -}; -use pallet_asset_conversion_tx_payment::AssetConversionAdapter; -use pallet_nfts::PalletFeatures; -pub use parachains_common as common; -use parachains_common::{ - impls::DealWithFees, - kusama::{consensus::*, currency::*, fee::WeightToFee}, - AccountId, AssetIdForTrustBackedAssets, AuraId, Balance, BlockNumber, Hash, Header, Nonce, - Signature, AVERAGE_ON_INITIALIZE_RATIO, DAYS, HOURS, MAXIMUM_BLOCK_WEIGHT, - NORMAL_DISPATCH_RATIO, SLOT_DURATION, -}; -use sp_runtime::RuntimeDebug; -use xcm::opaque::v3::MultiLocation; -use xcm_config::{ - FellowshipLocation, ForeignAssetsConvertedConcreteId, GovernanceLocation, KsmLocation, - PoolAssetsConvertedConcreteId, TrustBackedAssetsConvertedConcreteId, XcmConfig, -}; - -#[cfg(any(feature = "std", test))] -pub use sp_runtime::BuildStorage; - -// Polkadot imports -use pallet_xcm::{EnsureXcm, IsVoiceOfBody}; -use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; -use xcm::latest::prelude::*; -use xcm_executor::XcmExecutor; - -use crate::xcm_config::{ - ForeignCreatorsSovereignAccountOf, LocalAndForeignAssetsMultiLocationMatcher, - TrustBackedAssetsPalletLocation, -}; -use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; - -impl_opaque_keys! { - pub struct SessionKeys { - pub aura: Aura, - } -} - -#[cfg(feature = "state-trie-version-1")] -#[sp_version::runtime_version] -pub const VERSION: RuntimeVersion = RuntimeVersion { - // Note: "statemine" is the legacy name for this chain. It has been renamed to - // "asset-hub-kusama". Many wallets/tools depend on the `spec_name`, so it remains "statemine" - // for the time being. Wallets/tools should update to treat "asset-hub-kusama" equally. - spec_name: create_runtime_str!("statemine"), - impl_name: create_runtime_str!("statemine"), - authoring_version: 1, - spec_version: 10000, - impl_version: 0, - apis: RUNTIME_API_VERSIONS, - transaction_version: 13, - state_version: 1, -}; - -#[cfg(not(feature = "state-trie-version-1"))] -#[sp_version::runtime_version] -pub const VERSION: RuntimeVersion = RuntimeVersion { - // Note: "statemine" is the legacy name for this change. It has been renamed to - // "asset-hub-kusama". Many wallets/tools depend on the `spec_name`, so it remains "statemine" - // for the time being. Wallets/tools should update to treat "asset-hub-kusama" equally. - spec_name: create_runtime_str!("statemine"), - impl_name: create_runtime_str!("statemine"), - authoring_version: 1, - spec_version: 10000, - impl_version: 0, - apis: RUNTIME_API_VERSIONS, - transaction_version: 13, - state_version: 0, -}; - -/// The version information used to identify this runtime when compiled natively. -#[cfg(feature = "std")] -pub fn native_version() -> NativeVersion { - NativeVersion { runtime_version: VERSION, can_author_with: Default::default() } -} - -parameter_types! { - pub const Version: RuntimeVersion = VERSION; - pub RuntimeBlockLength: BlockLength = - BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO); - pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder() - .base_block(BlockExecutionWeight::get()) - .for_class(DispatchClass::all(), |weights| { - weights.base_extrinsic = ExtrinsicBaseWeight::get(); - }) - .for_class(DispatchClass::Normal, |weights| { - weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT); - }) - .for_class(DispatchClass::Operational, |weights| { - weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT); - // Operational transactions have some extra reserved space, so that they - // are included even if block reached `MAXIMUM_BLOCK_WEIGHT`. - weights.reserved = Some( - MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT - ); - }) - .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO) - .build_or_panic(); - pub const SS58Prefix: u8 = 2; -} - -// Configure FRAME pallets to include in runtime. -impl frame_system::Config for Runtime { - type BaseCallFilter = frame_support::traits::Everything; - type BlockWeights = RuntimeBlockWeights; - type BlockLength = RuntimeBlockLength; - type AccountId = AccountId; - type RuntimeCall = RuntimeCall; - type Lookup = AccountIdLookup; - type Nonce = Nonce; - type Hash = Hash; - type Hashing = BlakeTwo256; - type Block = Block; - type RuntimeEvent = RuntimeEvent; - type RuntimeOrigin = RuntimeOrigin; - type BlockHashCount = BlockHashCount; - type DbWeight = RocksDbWeight; - type Version = Version; - type PalletInfo = PalletInfo; - type OnNewAccount = (); - type OnKilledAccount = (); - type AccountData = pallet_balances::AccountData; - type SystemWeightInfo = weights::frame_system::WeightInfo; - type SS58Prefix = SS58Prefix; - type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode; - type MaxConsumers = frame_support::traits::ConstU32<16>; -} - -impl pallet_timestamp::Config for Runtime { - /// A timestamp: milliseconds since the unix epoch. - type Moment = u64; - type OnTimestampSet = Aura; - type MinimumPeriod = ConstU64<{ SLOT_DURATION / 2 }>; - type WeightInfo = weights::pallet_timestamp::WeightInfo; -} - -impl pallet_authorship::Config for Runtime { - type FindAuthor = pallet_session::FindAccountFromAuthorIndex; - type EventHandler = (CollatorSelection,); -} - -parameter_types! { - pub const ExistentialDeposit: Balance = EXISTENTIAL_DEPOSIT; -} - -impl pallet_balances::Config for Runtime { - type MaxLocks = ConstU32<50>; - /// The type for recording an account's balance. - type Balance = Balance; - /// The ubiquitous event type. - type RuntimeEvent = RuntimeEvent; - type DustRemoval = (); - type ExistentialDeposit = ExistentialDeposit; - type AccountStore = System; - type WeightInfo = weights::pallet_balances::WeightInfo; - type MaxReserves = ConstU32<50>; - type ReserveIdentifier = [u8; 8]; - type RuntimeHoldReason = RuntimeHoldReason; - type RuntimeFreezeReason = RuntimeFreezeReason; - type FreezeIdentifier = (); - // We allow each account to have holds on it from: - // - `NftFractionalization`: 1 - type MaxHolds = ConstU32<1>; - type MaxFreezes = ConstU32<0>; -} - -parameter_types! { - /// Relay Chain `TransactionByteFee` / 10 - pub const TransactionByteFee: Balance = MILLICENTS; -} - -impl pallet_transaction_payment::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type OnChargeTransaction = - pallet_transaction_payment::CurrencyAdapter>; - type WeightToFee = WeightToFee; - type LengthToFee = ConstantMultiplier; - type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; - type OperationalFeeMultiplier = ConstU8<5>; -} - -parameter_types! { - pub const AssetDeposit: Balance = UNITS / 10; // 1 / 10 UNITS deposit to create asset - pub const AssetAccountDeposit: Balance = deposit(1, 16); - pub const ApprovalDeposit: Balance = EXISTENTIAL_DEPOSIT; - pub const AssetsStringLimit: u32 = 50; - /// Key = 32 bytes, Value = 36 bytes (32+1+1+1+1) - // https://github.com/paritytech/substrate/blob/069917b/frame/assets/src/lib.rs#L257L271 - pub const MetadataDepositBase: Balance = deposit(1, 68); - pub const MetadataDepositPerByte: Balance = deposit(0, 1); -} - -/// We allow root to execute privileged asset operations. -pub type AssetsForceOrigin = EnsureRoot; - -// Called "Trust Backed" assets because these are generally registered by some account, and users of -// the asset assume it has some claimed backing. The pallet is called `Assets` in -// `construct_runtime` to avoid breaking changes on storage reads. -pub type TrustBackedAssetsInstance = pallet_assets::Instance1; -type TrustBackedAssetsCall = pallet_assets::Call; -impl pallet_assets::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type Balance = Balance; - type AssetId = AssetIdForTrustBackedAssets; - type AssetIdParameter = codec::Compact; - type Currency = Balances; - type CreateOrigin = AsEnsureOriginWithArg>; - type ForceOrigin = AssetsForceOrigin; - type AssetDeposit = AssetDeposit; - type MetadataDepositBase = MetadataDepositBase; - type MetadataDepositPerByte = MetadataDepositPerByte; - type ApprovalDeposit = ApprovalDeposit; - type StringLimit = AssetsStringLimit; - type Freezer = (); - type Extra = (); - type WeightInfo = weights::pallet_assets_local::WeightInfo; - type CallbackHandle = (); - type AssetAccountDeposit = AssetAccountDeposit; - type RemoveItemsLimit = frame_support::traits::ConstU32<1000>; - #[cfg(feature = "runtime-benchmarks")] - type BenchmarkHelper = (); -} - -parameter_types! { - pub const AssetConversionPalletId: PalletId = PalletId(*b"py/ascon"); - pub const AllowMultiAssetPools: bool = false; - // should be non-zero if AllowMultiAssetPools is true, otherwise can be zero - pub const LiquidityWithdrawalFee: Permill = Permill::from_percent(0); -} - -ord_parameter_types! { - pub const AssetConversionOrigin: sp_runtime::AccountId32 = - AccountIdConversion::::into_account_truncating(&AssetConversionPalletId::get()); -} - -pub type PoolAssetsInstance = pallet_assets::Instance3; -impl pallet_assets::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type Balance = Balance; - type RemoveItemsLimit = ConstU32<1000>; - type AssetId = u32; - type AssetIdParameter = u32; - type Currency = Balances; - type CreateOrigin = - AsEnsureOriginWithArg>; - type ForceOrigin = AssetsForceOrigin; - // Deposits are zero because creation/admin is limited to Asset Conversion pallet. - type AssetDeposit = ConstU128<0>; - type AssetAccountDeposit = ConstU128<0>; - type MetadataDepositBase = ConstU128<0>; - type MetadataDepositPerByte = ConstU128<0>; - type ApprovalDeposit = ApprovalDeposit; - type StringLimit = ConstU32<50>; - type Freezer = (); - type Extra = (); - type WeightInfo = weights::pallet_assets_pool::WeightInfo; - type CallbackHandle = (); - #[cfg(feature = "runtime-benchmarks")] - type BenchmarkHelper = (); -} - -impl pallet_asset_conversion::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type Balance = Balance; - type HigherPrecisionBalance = sp_core::U256; - type Currency = Balances; - type AssetId = MultiLocation; - type Assets = LocalAndForeignAssets< - Assets, - AssetIdForTrustBackedAssetsConvert, - ForeignAssets, - >; - type PoolAssets = PoolAssets; - type PoolAssetId = u32; - type PoolSetupFee = ConstU128<0>; // Asset class deposit fees are sufficient to prevent spam - type PoolSetupFeeReceiver = AssetConversionOrigin; - // should be non-zero if `AllowMultiAssetPools` is true, otherwise can be zero. - type LiquidityWithdrawalFee = LiquidityWithdrawalFee; - type LPFee = ConstU32<3>; - type PalletId = AssetConversionPalletId; - type AllowMultiAssetPools = AllowMultiAssetPools; - type MaxSwapPathLength = ConstU32<4>; - type MultiAssetId = MultiLocation; - type MultiAssetIdConverter = - MultiLocationConverter; - type MintMinLiquidity = ConstU128<100>; - type WeightInfo = weights::pallet_asset_conversion::WeightInfo; - #[cfg(feature = "runtime-benchmarks")] - type BenchmarkHelper = - crate::xcm_config::BenchmarkMultiLocationConverter>; -} - -parameter_types! { - // we just reuse the same deposits - pub const ForeignAssetsAssetDeposit: Balance = AssetDeposit::get(); - pub const ForeignAssetsAssetAccountDeposit: Balance = AssetAccountDeposit::get(); - pub const ForeignAssetsApprovalDeposit: Balance = ApprovalDeposit::get(); - pub const ForeignAssetsAssetsStringLimit: u32 = AssetsStringLimit::get(); - pub const ForeignAssetsMetadataDepositBase: Balance = MetadataDepositBase::get(); - pub const ForeignAssetsMetadataDepositPerByte: Balance = MetadataDepositPerByte::get(); -} - -/// Assets managed by some foreign location. Note: we do not declare a `ForeignAssetsCall` type, as -/// this type is used in proxy definitions. We assume that a foreign location would not want to set -/// an individual, local account as a proxy for the issuance of their assets. This issuance should -/// be managed by the foreign location's governance. -pub type ForeignAssetsInstance = pallet_assets::Instance2; -impl pallet_assets::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type Balance = Balance; - type AssetId = MultiLocationForAssetId; - type AssetIdParameter = MultiLocationForAssetId; - type Currency = Balances; - type CreateOrigin = ForeignCreators< - (FromSiblingParachain>,), - ForeignCreatorsSovereignAccountOf, - AccountId, - >; - type ForceOrigin = AssetsForceOrigin; - type AssetDeposit = ForeignAssetsAssetDeposit; - type MetadataDepositBase = ForeignAssetsMetadataDepositBase; - type MetadataDepositPerByte = ForeignAssetsMetadataDepositPerByte; - type ApprovalDeposit = ForeignAssetsApprovalDeposit; - type StringLimit = ForeignAssetsAssetsStringLimit; - type Freezer = (); - type Extra = (); - type WeightInfo = weights::pallet_assets_foreign::WeightInfo; - type CallbackHandle = (); - type AssetAccountDeposit = ForeignAssetsAssetAccountDeposit; - type RemoveItemsLimit = frame_support::traits::ConstU32<1000>; - #[cfg(feature = "runtime-benchmarks")] - type BenchmarkHelper = xcm_config::XcmBenchmarkHelper; -} - -parameter_types! { - // One storage item; key size is 32; value is size 4+4+16+32 bytes = 56 bytes. - pub const DepositBase: Balance = deposit(1, 88); - // Additional storage item size of 32 bytes. - pub const DepositFactor: Balance = deposit(0, 32); - pub const MaxSignatories: u32 = 100; -} - -impl pallet_multisig::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type RuntimeCall = RuntimeCall; - type Currency = Balances; - type DepositBase = DepositBase; - type DepositFactor = DepositFactor; - type MaxSignatories = MaxSignatories; - type WeightInfo = weights::pallet_multisig::WeightInfo; -} - -impl pallet_utility::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type RuntimeCall = RuntimeCall; - type PalletsOrigin = OriginCaller; - type WeightInfo = weights::pallet_utility::WeightInfo; -} - -parameter_types! { - // One storage item; key size 32, value size 8; . - pub const ProxyDepositBase: Balance = deposit(1, 40); - // Additional storage item size of 33 bytes. - pub const ProxyDepositFactor: Balance = deposit(0, 33); - pub const MaxProxies: u16 = 32; - // One storage item; key size 32, value size 16 - pub const AnnouncementDepositBase: Balance = deposit(1, 48); - pub const AnnouncementDepositFactor: Balance = deposit(0, 66); - pub const MaxPending: u16 = 32; -} - -/// The type used to represent the kinds of proxying allowed. -#[derive( - Copy, - Clone, - Eq, - PartialEq, - Ord, - PartialOrd, - Encode, - Decode, - RuntimeDebug, - MaxEncodedLen, - scale_info::TypeInfo, -)] -pub enum ProxyType { - /// Fully permissioned proxy. Can execute any call on behalf of _proxied_. - Any, - /// Can execute any call that does not transfer funds or assets. - NonTransfer, - /// Proxy with the ability to reject time-delay proxy announcements. - CancelProxy, - /// Assets proxy. Can execute any call from `assets`, **including asset transfers**. - Assets, - /// Owner proxy. Can execute calls related to asset ownership. - AssetOwner, - /// Asset manager. Can execute calls related to asset management. - AssetManager, - /// Collator selection proxy. Can execute calls related to collator selection mechanism. - Collator, -} -impl Default for ProxyType { - fn default() -> Self { - Self::Any - } -} - -impl InstanceFilter for ProxyType { - fn filter(&self, c: &RuntimeCall) -> bool { - match self { - ProxyType::Any => true, - ProxyType::NonTransfer => !matches!( - c, - RuntimeCall::Balances { .. } | - RuntimeCall::Assets { .. } | - RuntimeCall::NftFractionalization { .. } | - RuntimeCall::Nfts { .. } | - RuntimeCall::Uniques { .. } - ), - ProxyType::CancelProxy => matches!( - c, - RuntimeCall::Proxy(pallet_proxy::Call::reject_announcement { .. }) | - RuntimeCall::Utility { .. } | - RuntimeCall::Multisig { .. } - ), - ProxyType::Assets => { - matches!( - c, - RuntimeCall::Assets { .. } | - RuntimeCall::Utility { .. } | - RuntimeCall::Multisig { .. } | - RuntimeCall::NftFractionalization { .. } | - RuntimeCall::Nfts { .. } | RuntimeCall::Uniques { .. } - ) - }, - ProxyType::AssetOwner => matches!( - c, - RuntimeCall::Assets(TrustBackedAssetsCall::create { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::start_destroy { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::destroy_accounts { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::destroy_approvals { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::finish_destroy { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::transfer_ownership { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::set_team { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::set_metadata { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::clear_metadata { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::set_min_balance { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::create { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::destroy { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::redeposit { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::transfer_ownership { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::set_team { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::set_collection_max_supply { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::lock_collection { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::create { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::destroy { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::transfer_ownership { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::set_team { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::set_metadata { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::set_attribute { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::set_collection_metadata { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::clear_metadata { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::clear_attribute { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::clear_collection_metadata { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::set_collection_max_supply { .. }) | - RuntimeCall::Utility { .. } | - RuntimeCall::Multisig { .. } - ), - ProxyType::AssetManager => matches!( - c, - RuntimeCall::Assets(TrustBackedAssetsCall::mint { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::burn { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::freeze { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::block { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::thaw { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::freeze_asset { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::thaw_asset { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::touch_other { .. }) | - RuntimeCall::Assets(TrustBackedAssetsCall::refund_other { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::force_mint { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::update_mint_settings { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::mint_pre_signed { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::set_attributes_pre_signed { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::lock_item_transfer { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::unlock_item_transfer { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::lock_item_properties { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::set_metadata { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::clear_metadata { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::set_collection_metadata { .. }) | - RuntimeCall::Nfts(pallet_nfts::Call::clear_collection_metadata { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::mint { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::burn { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::freeze { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::thaw { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::freeze_collection { .. }) | - RuntimeCall::Uniques(pallet_uniques::Call::thaw_collection { .. }) | - RuntimeCall::Utility { .. } | - RuntimeCall::Multisig { .. } - ), - ProxyType::Collator => matches!( - c, - RuntimeCall::CollatorSelection { .. } | - RuntimeCall::Utility { .. } | - RuntimeCall::Multisig { .. } - ), - } - } - - fn is_superset(&self, o: &Self) -> bool { - match (self, o) { - (x, y) if x == y => true, - (ProxyType::Any, _) => true, - (_, ProxyType::Any) => false, - (ProxyType::Assets, ProxyType::AssetOwner) => true, - (ProxyType::Assets, ProxyType::AssetManager) => true, - (ProxyType::NonTransfer, ProxyType::Collator) => true, - _ => false, - } - } -} - -impl pallet_proxy::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type RuntimeCall = RuntimeCall; - type Currency = Balances; - type ProxyType = ProxyType; - type ProxyDepositBase = ProxyDepositBase; - type ProxyDepositFactor = ProxyDepositFactor; - type MaxProxies = MaxProxies; - type WeightInfo = weights::pallet_proxy::WeightInfo; - type MaxPending = MaxPending; - type CallHasher = BlakeTwo256; - type AnnouncementDepositBase = AnnouncementDepositBase; - type AnnouncementDepositFactor = AnnouncementDepositFactor; -} - -parameter_types! { - pub const ReservedXcmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); - pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); -} - -impl cumulus_pallet_parachain_system::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type OnSystemEvent = (); - type SelfParaId = parachain_info::Pallet; - type DmpMessageHandler = DmpQueue; - type ReservedDmpWeight = ReservedDmpWeight; - type OutboundXcmpMessageSource = XcmpQueue; - type XcmpMessageHandler = XcmpQueue; - type ReservedXcmpWeight = ReservedXcmpWeight; - type CheckAssociatedRelayNumber = RelayNumberStrictlyIncreases; - type ConsensusHook = cumulus_pallet_aura_ext::FixedVelocityConsensusHook< - Runtime, - RELAY_CHAIN_SLOT_DURATION_MILLIS, - BLOCK_PROCESSING_VELOCITY, - UNINCLUDED_SEGMENT_CAPACITY, - >; -} - -impl parachain_info::Config for Runtime {} - -impl cumulus_pallet_aura_ext::Config for Runtime {} - -parameter_types! { - // Fellows pluralistic body. - pub const FellowsBodyId: BodyId = BodyId::Technical; -} - -impl cumulus_pallet_xcmp_queue::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = XcmExecutor; - type ChannelInfo = ParachainSystem; - type VersionWrapper = PolkadotXcm; - type ExecuteOverweightOrigin = EnsureRoot; - type ControllerOrigin = EitherOfDiverse< - EnsureRoot, - EnsureXcm>, - >; - type ControllerOriginConverter = xcm_config::XcmOriginToTransactDispatchOrigin; - type WeightInfo = weights::cumulus_pallet_xcmp_queue::WeightInfo; - type PriceForSiblingDelivery = NoPriceForMessageDelivery; -} - -impl cumulus_pallet_dmp_queue::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = XcmExecutor; - type ExecuteOverweightOrigin = EnsureRoot; -} - -parameter_types! { - pub const Period: u32 = 6 * HOURS; - pub const Offset: u32 = 0; -} - -impl pallet_session::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type ValidatorId = ::AccountId; - // we don't have stash and controller, thus we don't need the convert as well. - type ValidatorIdOf = pallet_collator_selection::IdentityCollator; - type ShouldEndSession = pallet_session::PeriodicSessions; - type NextSessionRotation = pallet_session::PeriodicSessions; - type SessionManager = CollatorSelection; - // Essentially just Aura, but let's be pedantic. - type SessionHandler = ::KeyTypeIdProviders; - type Keys = SessionKeys; - type WeightInfo = weights::pallet_session::WeightInfo; -} - -impl pallet_aura::Config for Runtime { - type AuthorityId = AuraId; - type DisabledValidators = (); - type MaxAuthorities = ConstU32<100_000>; - type AllowMultipleBlocksPerSlot = ConstBool; - #[cfg(feature = "experimental")] - type SlotDuration = pallet_aura::MinimumPeriodTimesTwo; -} - -parameter_types! { - pub const PotId: PalletId = PalletId(*b"PotStake"); - pub const SessionLength: BlockNumber = 6 * HOURS; - // StakingAdmin pluralistic body. - pub const StakingAdminBodyId: BodyId = BodyId::Defense; -} - -/// We allow root and the `StakingAdmin` to execute privileged collator selection operations. -pub type CollatorSelectionUpdateOrigin = EitherOfDiverse< - EnsureRoot, - EnsureXcm>, ->; - -impl pallet_collator_selection::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type Currency = Balances; - type UpdateOrigin = CollatorSelectionUpdateOrigin; - type PotId = PotId; - type MaxCandidates = ConstU32<100>; - type MinEligibleCollators = ConstU32<4>; - type MaxInvulnerables = ConstU32<20>; - // should be a multiple of session or things will get inconsistent - type KickThreshold = Period; - type ValidatorId = ::AccountId; - type ValidatorIdOf = pallet_collator_selection::IdentityCollator; - type ValidatorRegistration = Session; - type WeightInfo = weights::pallet_collator_selection::WeightInfo; -} - -impl pallet_asset_conversion_tx_payment::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type Fungibles = LocalAndForeignAssets< - Assets, - AssetIdForTrustBackedAssetsConvert, - ForeignAssets, - >; - type OnChargeAssetTransaction = AssetConversionAdapter; -} - -parameter_types! { - pub const UniquesCollectionDeposit: Balance = UNITS / 10; // 1 / 10 UNIT deposit to create a collection - pub const UniquesItemDeposit: Balance = UNITS / 1_000; // 1 / 1000 UNIT deposit to mint an item - pub const UniquesMetadataDepositBase: Balance = deposit(1, 129); - pub const UniquesAttributeDepositBase: Balance = deposit(1, 0); - pub const UniquesDepositPerByte: Balance = deposit(0, 1); -} - -impl pallet_uniques::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type CollectionId = u32; - type ItemId = u32; - type Currency = Balances; - type ForceOrigin = AssetsForceOrigin; - type CollectionDeposit = UniquesCollectionDeposit; - type ItemDeposit = UniquesItemDeposit; - type MetadataDepositBase = UniquesMetadataDepositBase; - type AttributeDepositBase = UniquesAttributeDepositBase; - type DepositPerByte = UniquesDepositPerByte; - type StringLimit = ConstU32<128>; - type KeyLimit = ConstU32<32>; - type ValueLimit = ConstU32<64>; - type WeightInfo = weights::pallet_uniques::WeightInfo; - #[cfg(feature = "runtime-benchmarks")] - type Helper = (); - type CreateOrigin = AsEnsureOriginWithArg>; - type Locker = (); -} - -parameter_types! { - pub const NftFractionalizationPalletId: PalletId = PalletId(*b"fraction"); - pub NewAssetSymbol: BoundedVec = (*b"FRAC").to_vec().try_into().unwrap(); - pub NewAssetName: BoundedVec = (*b"Frac").to_vec().try_into().unwrap(); -} - -impl pallet_nft_fractionalization::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type Deposit = AssetDeposit; - type Currency = Balances; - type NewAssetSymbol = NewAssetSymbol; - type NewAssetName = NewAssetName; - type StringLimit = AssetsStringLimit; - type NftCollectionId = ::CollectionId; - type NftId = ::ItemId; - type AssetBalance = ::Balance; - type AssetId = >::AssetId; - type Assets = Assets; - type Nfts = Nfts; - type PalletId = NftFractionalizationPalletId; - type WeightInfo = pallet_nft_fractionalization::weights::SubstrateWeight; - type RuntimeHoldReason = RuntimeHoldReason; - #[cfg(feature = "runtime-benchmarks")] - type BenchmarkHelper = (); -} - -parameter_types! { - pub NftsPalletFeatures: PalletFeatures = PalletFeatures::all_enabled(); - pub const NftsMaxDeadlineDuration: BlockNumber = 12 * 30 * DAYS; - // re-use the Uniques deposits - pub const NftsCollectionDeposit: Balance = UniquesCollectionDeposit::get(); - pub const NftsItemDeposit: Balance = UniquesItemDeposit::get(); - pub const NftsMetadataDepositBase: Balance = UniquesMetadataDepositBase::get(); - pub const NftsAttributeDepositBase: Balance = UniquesAttributeDepositBase::get(); - pub const NftsDepositPerByte: Balance = UniquesDepositPerByte::get(); -} - -impl pallet_nfts::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type CollectionId = u32; - type ItemId = u32; - type Currency = Balances; - type CreateOrigin = AsEnsureOriginWithArg>; - type ForceOrigin = AssetsForceOrigin; - type Locker = (); - type CollectionDeposit = NftsCollectionDeposit; - type ItemDeposit = NftsItemDeposit; - type MetadataDepositBase = NftsMetadataDepositBase; - type AttributeDepositBase = NftsAttributeDepositBase; - type DepositPerByte = NftsDepositPerByte; - type StringLimit = ConstU32<256>; - type KeyLimit = ConstU32<64>; - type ValueLimit = ConstU32<256>; - type ApprovalsLimit = ConstU32<20>; - type ItemAttributesApprovalsLimit = ConstU32<30>; - type MaxTips = ConstU32<10>; - type MaxDeadlineDuration = NftsMaxDeadlineDuration; - type MaxAttributesPerCall = ConstU32<10>; - type Features = NftsPalletFeatures; - type OffchainSignature = Signature; - type OffchainPublic = ::Signer; - type WeightInfo = weights::pallet_nfts::WeightInfo; - #[cfg(feature = "runtime-benchmarks")] - type Helper = (); -} - -// Create the runtime by composing the FRAME pallets that were previously configured. -construct_runtime!( - pub enum Runtime - { - // System support stuff. - System: frame_system::{Pallet, Call, Config, Storage, Event} = 0, - ParachainSystem: cumulus_pallet_parachain_system::{ - Pallet, Call, Config, Storage, Inherent, Event, ValidateUnsigned, - } = 1, - // RandomnessCollectiveFlip = 2 removed - Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent} = 3, - ParachainInfo: parachain_info::{Pallet, Storage, Config} = 4, - - // Monetary stuff. - Balances: pallet_balances::{Pallet, Call, Storage, Config, Event} = 10, - TransactionPayment: pallet_transaction_payment::{Pallet, Storage, Event} = 11, - AssetTxPayment: pallet_asset_conversion_tx_payment::{Pallet, Event} = 13, - - // Collator support. the order of these 5 are important and shall not change. - Authorship: pallet_authorship::{Pallet, Storage} = 20, - CollatorSelection: pallet_collator_selection::{Pallet, Call, Storage, Event, Config} = 21, - Session: pallet_session::{Pallet, Call, Storage, Event, Config} = 22, - Aura: pallet_aura::{Pallet, Storage, Config} = 23, - AuraExt: cumulus_pallet_aura_ext::{Pallet, Storage, Config} = 24, - - // XCM helpers. - XcmpQueue: cumulus_pallet_xcmp_queue::{Pallet, Call, Storage, Event} = 30, - PolkadotXcm: pallet_xcm::{Pallet, Call, Storage, Event, Origin, Config} = 31, - CumulusXcm: cumulus_pallet_xcm::{Pallet, Event, Origin} = 32, - DmpQueue: cumulus_pallet_dmp_queue::{Pallet, Call, Storage, Event} = 33, - - // Handy utilities. - Utility: pallet_utility::{Pallet, Call, Event} = 40, - Multisig: pallet_multisig::{Pallet, Call, Storage, Event} = 41, - Proxy: pallet_proxy::{Pallet, Call, Storage, Event} = 42, - - // The main stage. - Assets: pallet_assets::::{Pallet, Call, Storage, Event} = 50, - Uniques: pallet_uniques::{Pallet, Call, Storage, Event} = 51, - Nfts: pallet_nfts::{Pallet, Call, Storage, Event} = 52, - ForeignAssets: pallet_assets::::{Pallet, Call, Storage, Event} = 53, - NftFractionalization: pallet_nft_fractionalization::{Pallet, Call, Storage, Event, HoldReason} = 54, - - PoolAssets: pallet_assets::::{Pallet, Call, Storage, Event} = 55, - AssetConversion: pallet_asset_conversion::{Pallet, Call, Storage, Event} = 56, - - #[cfg(feature = "state-trie-version-1")] - StateTrieMigration: pallet_state_trie_migration = 70, - } -); - -/// The address format for describing accounts. -pub type Address = sp_runtime::MultiAddress; -/// Block type as expected by this runtime. -pub type Block = generic::Block; -/// A Block signed with a Justification -pub type SignedBlock = generic::SignedBlock; -/// BlockId type as expected by this runtime. -pub type BlockId = generic::BlockId; -/// The SignedExtension to the basic transaction logic. -pub type SignedExtra = ( - frame_system::CheckNonZeroSender, - frame_system::CheckSpecVersion, - frame_system::CheckTxVersion, - frame_system::CheckGenesis, - frame_system::CheckEra, - frame_system::CheckNonce, - frame_system::CheckWeight, - pallet_asset_conversion_tx_payment::ChargeAssetTxPayment, -); -/// Unchecked extrinsic type as expected by this runtime. -pub type UncheckedExtrinsic = - generic::UncheckedExtrinsic; -/// Migrations to apply on runtime upgrade. -pub type Migrations = (pallet_collator_selection::migration::v1::MigrateToV1,); - -/// Executive: handles dispatch to the various modules. -pub type Executive = frame_executive::Executive< - Runtime, - Block, - frame_system::ChainContext, - Runtime, - AllPalletsWithSystem, - Migrations, ->; - -#[cfg(feature = "runtime-benchmarks")] -#[macro_use] -extern crate frame_benchmarking; - -#[cfg(feature = "runtime-benchmarks")] -mod benches { - define_benchmarks!( - [frame_system, SystemBench::] - [pallet_assets, Local] - [pallet_assets, Foreign] - [pallet_assets, Pool] - [pallet_asset_conversion, AssetConversion] - [pallet_balances, Balances] - [pallet_multisig, Multisig] - [pallet_nft_fractionalization, NftFractionalization] - [pallet_nfts, Nfts] - [pallet_proxy, Proxy] - [pallet_session, SessionBench::] - [pallet_uniques, Uniques] - [pallet_utility, Utility] - [pallet_timestamp, Timestamp] - [pallet_collator_selection, CollatorSelection] - [cumulus_pallet_xcmp_queue, XcmpQueue] - // XCM - [pallet_xcm, PolkadotXcm] - // NOTE: Make sure you point to the individual modules below. - [pallet_xcm_benchmarks::fungible, XcmBalances] - [pallet_xcm_benchmarks::generic, XcmGeneric] - ); -} - -impl_runtime_apis! { - impl sp_consensus_aura::AuraApi for Runtime { - fn slot_duration() -> sp_consensus_aura::SlotDuration { - sp_consensus_aura::SlotDuration::from_millis(Aura::slot_duration()) - } - - fn authorities() -> Vec { - Aura::authorities().into_inner() - } - } - - impl sp_api::Core for Runtime { - fn version() -> RuntimeVersion { - VERSION - } - - fn execute_block(block: Block) { - Executive::execute_block(block) - } - - fn initialize_block(header: &::Header) { - Executive::initialize_block(header) - } - } - - impl sp_api::Metadata for Runtime { - fn metadata() -> OpaqueMetadata { - OpaqueMetadata::new(Runtime::metadata().into()) - } - - fn metadata_at_version(version: u32) -> Option { - Runtime::metadata_at_version(version) - } - - fn metadata_versions() -> sp_std::vec::Vec { - Runtime::metadata_versions() - } - } - - impl sp_block_builder::BlockBuilder for Runtime { - fn apply_extrinsic(extrinsic: ::Extrinsic) -> ApplyExtrinsicResult { - Executive::apply_extrinsic(extrinsic) - } - - fn finalize_block() -> ::Header { - Executive::finalize_block() - } - - fn inherent_extrinsics(data: sp_inherents::InherentData) -> Vec<::Extrinsic> { - data.create_extrinsics() - } - - fn check_inherents( - block: Block, - data: sp_inherents::InherentData, - ) -> sp_inherents::CheckInherentsResult { - data.check_extrinsics(&block) - } - } - - impl sp_transaction_pool::runtime_api::TaggedTransactionQueue for Runtime { - fn validate_transaction( - source: TransactionSource, - tx: ::Extrinsic, - block_hash: ::Hash, - ) -> TransactionValidity { - Executive::validate_transaction(source, tx, block_hash) - } - } - - impl sp_offchain::OffchainWorkerApi for Runtime { - fn offchain_worker(header: &::Header) { - Executive::offchain_worker(header) - } - } - - impl sp_session::SessionKeys for Runtime { - fn generate_session_keys(seed: Option>) -> Vec { - SessionKeys::generate(seed) - } - - fn decode_session_keys( - encoded: Vec, - ) -> Option, KeyTypeId)>> { - SessionKeys::decode_into_raw_public_keys(&encoded) - } - } - - impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime { - fn account_nonce(account: AccountId) -> Nonce { - System::account_nonce(account) - } - } - - impl pallet_asset_conversion::AssetConversionApi< - Block, - Balance, - MultiLocation, - > for Runtime - { - fn quote_price_exact_tokens_for_tokens(asset1: MultiLocation, asset2: MultiLocation, amount: Balance, include_fee: bool) -> Option { - AssetConversion::quote_price_exact_tokens_for_tokens(asset1, asset2, amount, include_fee) - } - fn quote_price_tokens_for_exact_tokens(asset1: MultiLocation, asset2: MultiLocation, amount: Balance, include_fee: bool) -> Option { - AssetConversion::quote_price_tokens_for_exact_tokens(asset1, asset2, amount, include_fee) - } - fn get_reserves(asset1: MultiLocation, asset2: MultiLocation) -> Option<(Balance, Balance)> { - AssetConversion::get_reserves(&asset1, &asset2).ok() - } - } - - impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi for Runtime { - fn query_info( - uxt: ::Extrinsic, - len: u32, - ) -> pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo { - TransactionPayment::query_info(uxt, len) - } - fn query_fee_details( - uxt: ::Extrinsic, - len: u32, - ) -> pallet_transaction_payment::FeeDetails { - TransactionPayment::query_fee_details(uxt, len) - } - fn query_weight_to_fee(weight: Weight) -> Balance { - TransactionPayment::weight_to_fee(weight) - } - fn query_length_to_fee(length: u32) -> Balance { - TransactionPayment::length_to_fee(length) - } - } - - impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentCallApi - for Runtime - { - fn query_call_info( - call: RuntimeCall, - len: u32, - ) -> pallet_transaction_payment::RuntimeDispatchInfo { - TransactionPayment::query_call_info(call, len) - } - fn query_call_fee_details( - call: RuntimeCall, - len: u32, - ) -> pallet_transaction_payment::FeeDetails { - TransactionPayment::query_call_fee_details(call, len) - } - fn query_weight_to_fee(weight: Weight) -> Balance { - TransactionPayment::weight_to_fee(weight) - } - fn query_length_to_fee(length: u32) -> Balance { - TransactionPayment::length_to_fee(length) - } - } - - impl assets_common::runtime_api::FungiblesApi< - Block, - AccountId, - > for Runtime - { - fn query_account_balances(account: AccountId) -> Result { - use assets_common::fungible_conversion::{convert, convert_balance}; - Ok([ - // collect pallet_balance - { - let balance = Balances::free_balance(account.clone()); - if balance > 0 { - vec![convert_balance::(balance)?] - } else { - vec![] - } - }, - // collect pallet_assets (TrustBackedAssets) - convert::<_, _, _, _, TrustBackedAssetsConvertedConcreteId>( - Assets::account_balances(account.clone()) - .iter() - .filter(|(_, balance)| balance > &0) - )?, - // collect pallet_assets (ForeignAssets) - convert::<_, _, _, _, ForeignAssetsConvertedConcreteId>( - ForeignAssets::account_balances(account.clone()) - .iter() - .filter(|(_, balance)| balance > &0) - )?, - // collect pallet_assets (PoolAssets) - convert::<_, _, _, _, PoolAssetsConvertedConcreteId>( - PoolAssets::account_balances(account) - .iter() - .filter(|(_, balance)| balance > &0) - )?, - // collect ... e.g. other tokens - ].concat().into()) - } - } - - impl cumulus_primitives_core::CollectCollationInfo for Runtime { - fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { - ParachainSystem::collect_collation_info(header) - } - } - - #[cfg(feature = "try-runtime")] - impl frame_try_runtime::TryRuntime for Runtime { - fn on_runtime_upgrade(checks: frame_try_runtime::UpgradeCheckSelect) -> (Weight, Weight) { - let weight = Executive::try_runtime_upgrade(checks).unwrap(); - (weight, RuntimeBlockWeights::get().max_block) - } - - fn execute_block( - block: Block, - state_root_check: bool, - signature_check: bool, - select: frame_try_runtime::TryStateSelect, - ) -> Weight { - // NOTE: intentional unwrap: we don't want to propagate the error backwards, and want to - // have a backtrace here. - Executive::try_execute_block(block, state_root_check, signature_check, select).unwrap() - } - } - - #[cfg(feature = "runtime-benchmarks")] - impl frame_benchmarking::Benchmark for Runtime { - fn benchmark_metadata(extra: bool) -> ( - Vec, - Vec, - ) { - use frame_benchmarking::{Benchmarking, BenchmarkList}; - use frame_support::traits::StorageInfoTrait; - use frame_system_benchmarking::Pallet as SystemBench; - use cumulus_pallet_session_benchmarking::Pallet as SessionBench; - - // This is defined once again in dispatch_benchmark, because list_benchmarks! - // and add_benchmarks! are macros exported by define_benchmarks! macros and those types - // are referenced in that call. - type XcmBalances = pallet_xcm_benchmarks::fungible::Pallet::; - type XcmGeneric = pallet_xcm_benchmarks::generic::Pallet::; - - // Benchmark files generated for `Assets/ForeignAssets` instances are by default - // `pallet_assets_assets.rs / pallet_assets_foreign_assets`, which is not really nice, - // so with this redefinition we can change names to nicer: - // `pallet_assets_local.rs / pallet_assets_foreign.rs`. - type Local = pallet_assets::Pallet::; - type Foreign = pallet_assets::Pallet::; - type Pool = pallet_assets::Pallet::; - - let mut list = Vec::::new(); - list_benchmarks!(list, extra); - - let storage_info = AllPalletsWithSystem::storage_info(); - (list, storage_info) - } - - fn dispatch_benchmark( - config: frame_benchmarking::BenchmarkConfig - ) -> Result, sp_runtime::RuntimeString> { - use frame_benchmarking::{Benchmarking, BenchmarkBatch, BenchmarkError}; - use sp_storage::TrackedStorageKey; - - use frame_system_benchmarking::Pallet as SystemBench; - impl frame_system_benchmarking::Config for Runtime { - fn setup_set_code_requirements(code: &sp_std::vec::Vec) -> Result<(), BenchmarkError> { - ParachainSystem::initialize_for_set_code_benchmark(code.len() as u32); - Ok(()) - } - - fn verify_set_code() { - System::assert_last_event(cumulus_pallet_parachain_system::Event::::ValidationFunctionStored.into()); - } - } - - use cumulus_pallet_session_benchmarking::Pallet as SessionBench; - impl cumulus_pallet_session_benchmarking::Config for Runtime {} - - use xcm::latest::prelude::*; - use xcm_config::{KsmLocation, MaxAssetsIntoHolding}; - use pallet_xcm_benchmarks::asset_instance_from; - - parameter_types! { - pub ExistentialDepositMultiAsset: Option = Some(( - KsmLocation::get(), - ExistentialDeposit::get() - ).into()); - } - - impl pallet_xcm_benchmarks::Config for Runtime { - type XcmConfig = xcm_config::XcmConfig; - type AccountIdConverter = xcm_config::LocationToAccountId; - type DeliveryHelper = cumulus_primitives_utility::ToParentDeliveryHelper< - XcmConfig, - ExistentialDepositMultiAsset, - xcm_config::PriceForParentDelivery, - >; - fn valid_destination() -> Result { - Ok(KsmLocation::get()) - } - fn worst_case_holding(depositable_count: u32) -> MultiAssets { - // A mix of fungible, non-fungible, and concrete assets. - let holding_non_fungibles = MaxAssetsIntoHolding::get() / 2 - depositable_count; - let holding_fungibles = holding_non_fungibles.saturating_sub(1); - let fungibles_amount: u128 = 100; - let mut assets = (0..holding_fungibles) - .map(|i| { - MultiAsset { - id: Concrete(GeneralIndex(i as u128).into()), - fun: Fungible(fungibles_amount * i as u128), - } - }) - .chain(core::iter::once(MultiAsset { id: Concrete(Here.into()), fun: Fungible(u128::MAX) })) - .chain((0..holding_non_fungibles).map(|i| MultiAsset { - id: Concrete(GeneralIndex(i as u128).into()), - fun: NonFungible(asset_instance_from(i)), - })) - .collect::>(); - - assets.push(MultiAsset { - id: Concrete(KsmLocation::get()), - fun: Fungible(1_000_000 * UNITS), - }); - assets.into() - } - } - - parameter_types! { - pub const TrustedTeleporter: Option<(MultiLocation, MultiAsset)> = Some(( - KsmLocation::get(), - MultiAsset { fun: Fungible(UNITS), id: Concrete(KsmLocation::get()) }, - )); - pub const CheckedAccount: Option<(AccountId, xcm_builder::MintLocation)> = None; - pub const TrustedReserve: Option<(MultiLocation, MultiAsset)> = None; - } - - impl pallet_xcm_benchmarks::fungible::Config for Runtime { - type TransactAsset = Balances; - - type CheckedAccount = CheckedAccount; - type TrustedTeleporter = TrustedTeleporter; - type TrustedReserve = TrustedReserve; - - fn get_multi_asset() -> MultiAsset { - MultiAsset { - id: Concrete(KsmLocation::get()), - fun: Fungible(UNITS), - } - } - } - - impl pallet_xcm_benchmarks::generic::Config for Runtime { - type TransactAsset = Balances; - type RuntimeCall = RuntimeCall; - - fn worst_case_response() -> (u64, Response) { - (0u64, Response::Version(Default::default())) - } - - fn worst_case_asset_exchange() -> Result<(MultiAssets, MultiAssets), BenchmarkError> { - Err(BenchmarkError::Skip) - } - - fn universal_alias() -> Result<(MultiLocation, Junction), BenchmarkError> { - Err(BenchmarkError::Skip) - } - - fn transact_origin_and_runtime_call() -> Result<(MultiLocation, RuntimeCall), BenchmarkError> { - Ok((KsmLocation::get(), frame_system::Call::remark_with_event { remark: vec![] }.into())) - } - - fn subscribe_origin() -> Result { - Ok(KsmLocation::get()) - } - - fn claimable_asset() -> Result<(MultiLocation, MultiLocation, MultiAssets), BenchmarkError> { - let origin = KsmLocation::get(); - let assets: MultiAssets = (Concrete(KsmLocation::get()), 1_000 * UNITS).into(); - let ticket = MultiLocation { parents: 0, interior: Here }; - Ok((origin, ticket, assets)) - } - - fn unlockable_asset() -> Result<(MultiLocation, MultiLocation, MultiAsset), BenchmarkError> { - Err(BenchmarkError::Skip) - } - - fn export_message_origin_and_destination( - ) -> Result<(MultiLocation, NetworkId, InteriorMultiLocation), BenchmarkError> { - Err(BenchmarkError::Skip) - } - - fn alias_origin() -> Result<(MultiLocation, MultiLocation), BenchmarkError> { - Err(BenchmarkError::Skip) - } - } - - type XcmBalances = pallet_xcm_benchmarks::fungible::Pallet::; - type XcmGeneric = pallet_xcm_benchmarks::generic::Pallet::; - - type Local = pallet_assets::Pallet::; - type Foreign = pallet_assets::Pallet::; - type Pool = pallet_assets::Pallet::; - - let whitelist: Vec = vec![ - // Block Number - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac").to_vec().into(), - // Total Issuance - hex_literal::hex!("c2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80").to_vec().into(), - // Execution Phase - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7ff553b5a9862a516939d82b3d3d8661a").to_vec().into(), - // Event Count - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef70a98fdbe9ce6c55837576c60c7af3850").to_vec().into(), - // System Events - hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7").to_vec().into(), - //TODO: use from relay_well_known_keys::ACTIVE_CONFIG - hex_literal::hex!("06de3d8a54d27e44a9d5ce189618f22db4b49d95320d9021994c850f25b8e385").to_vec().into(), - ]; - - let mut batches = Vec::::new(); - let params = (&config, &whitelist); - add_benchmarks!(params, batches); - - Ok(batches) - } - } - - impl sp_genesis_builder::GenesisBuilder for Runtime { - fn create_default_config() -> Vec { - create_default_config::() - } - - fn build_config(config: Vec) -> sp_genesis_builder::Result { - build_config::(config) - } - } -} - -cumulus_pallet_parachain_system::register_validate_block! { - Runtime = Runtime, - BlockExecutor = cumulus_pallet_aura_ext::BlockExecutor::, -} - -#[cfg(feature = "state-trie-version-1")] -parameter_types! { - // The deposit configuration for the singed migration. Specially if you want to allow any signed account to do the migration (see `SignedFilter`, these deposits should be high) - pub const MigrationSignedDepositPerItem: Balance = CENTS; - pub const MigrationSignedDepositBase: Balance = 2_000 * CENTS; - pub const MigrationMaxKeyLen: u32 = 512; -} - -#[cfg(feature = "state-trie-version-1")] -impl pallet_state_trie_migration::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type Currency = Balances; - type SignedDepositPerItem = MigrationSignedDepositPerItem; - type SignedDepositBase = MigrationSignedDepositBase; - // An origin that can control the whole pallet: should be Root, or a part of your council. - type ControlOrigin = frame_system::EnsureSignedBy; - // specific account for the migration, can trigger the signed migrations. - type SignedFilter = frame_system::EnsureSignedBy; - - // Replace this with weight based on your runtime. - type WeightInfo = pallet_state_trie_migration::weights::SubstrateWeight; - - type MaxKeyLen = MigrationMaxKeyLen; -} - -#[cfg(feature = "state-trie-version-1")] -frame_support::ord_parameter_types! { - pub const MigController: AccountId = AccountId::from(hex_literal::hex!("8458ed39dc4b6f6c7255f7bc42be50c2967db126357c999d44e12ca7ac80dc52")); - pub const RootMigController: AccountId = AccountId::from(hex_literal::hex!("8458ed39dc4b6f6c7255f7bc42be50c2967db126357c999d44e12ca7ac80dc52")); -} - -#[cfg(feature = "state-trie-version-1")] -#[test] -fn ensure_key_ss58() { - use frame_support::traits::SortedMembers; - use sp_core::crypto::Ss58Codec; - let acc = - AccountId::from_ss58check("5F4EbSkZz18X36xhbsjvDNs6NuZ82HyYtq5UiJ1h9SBHJXZD").unwrap(); - //panic!("{:x?}", acc); - assert_eq!(acc, MigController::sorted_members()[0]); - let acc = - AccountId::from_ss58check("5F4EbSkZz18X36xhbsjvDNs6NuZ82HyYtq5UiJ1h9SBHJXZD").unwrap(); - assert_eq!(acc, RootMigController::sorted_members()[0]); - //panic!("{:x?}", acc); -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::{CENTS, MILLICENTS}; - use parachains_common::kusama::fee; - use sp_runtime::traits::Zero; - use sp_weights::WeightToFee; - - /// We can fit at least 1000 transfers in a block. - #[test] - fn sane_block_weight() { - use pallet_balances::WeightInfo; - let block = RuntimeBlockWeights::get().max_block; - let base = RuntimeBlockWeights::get().get(DispatchClass::Normal).base_extrinsic; - let transfer = - base + weights::pallet_balances::WeightInfo::::transfer_allow_death(); - - let fit = block.checked_div_per_component(&transfer).unwrap_or_default(); - assert!(fit >= 1000, "{} should be at least 1000", fit); - } - - /// The fee for one transfer is at most 1 CENT. - #[test] - fn sane_transfer_fee() { - use pallet_balances::WeightInfo; - let base = RuntimeBlockWeights::get().get(DispatchClass::Normal).base_extrinsic; - let transfer = - base + weights::pallet_balances::WeightInfo::::transfer_allow_death(); - - let fee: Balance = fee::WeightToFee::weight_to_fee(&transfer); - assert!(fee <= CENTS, "{} MILLICENTS should be at most 1000", fee / MILLICENTS); - } - - /// Weight is being charged for both dimensions. - #[test] - fn weight_charged_for_both_components() { - let fee: Balance = fee::WeightToFee::weight_to_fee(&Weight::from_parts(10_000, 0)); - assert!(!fee.is_zero(), "Charges for ref time"); - - let fee: Balance = fee::WeightToFee::weight_to_fee(&Weight::from_parts(0, 10_000)); - assert_eq!(fee, CENTS, "10kb maps to CENT"); - } - - /// Filling up a block by proof size is at most 30 times more expensive than ref time. - /// - /// This is just a sanity check. - #[test] - fn full_block_fee_ratio() { - let block = RuntimeBlockWeights::get().max_block; - let time_fee: Balance = - fee::WeightToFee::weight_to_fee(&Weight::from_parts(block.ref_time(), 0)); - let proof_fee: Balance = - fee::WeightToFee::weight_to_fee(&Weight::from_parts(0, block.proof_size())); - - let proof_o_time = proof_fee.checked_div(time_fee).unwrap_or_default(); - assert!(proof_o_time <= 30, "{} should be at most 30", proof_o_time); - let time_o_proof = time_fee.checked_div(proof_fee).unwrap_or_default(); - assert!(time_o_proof <= 30, "{} should be at most 30", time_o_proof); - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs b/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs deleted file mode 100644 index 13da81fe591..00000000000 --- a/cumulus/parachains/runtimes/assets/asset-hub-kusama/src/xcm_config.rs +++ /dev/null @@ -1,640 +0,0 @@ -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -use super::{ - AccountId, AllPalletsWithSystem, Assets, Authorship, Balance, Balances, ParachainInfo, - ParachainSystem, PolkadotXcm, PoolAssets, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, - TransactionByteFee, TrustBackedAssetsInstance, WeightToFee, XcmpQueue, -}; -use crate::{ForeignAssets, CENTS}; -use assets_common::{ - local_and_foreign_assets::MatchesLocalAndForeignAssetsMultiLocation, - matching::{FromSiblingParachain, IsForeignConcreteAsset}, -}; -use frame_support::{ - match_types, parameter_types, - traits::{ConstU32, Contains, Everything, Nothing, PalletInfoAccess}, -}; -use frame_system::EnsureRoot; -use pallet_xcm::XcmPassthrough; -use parachains_common::{ - impls::ToStakingPot, - xcm_config::{AssetFeeAsExistentialDepositMultiplier, ConcreteAssetFromSystem}, -}; -use polkadot_parachain_primitives::primitives::Sibling; -use polkadot_runtime_common::xcm_sender::ExponentialPrice; -use sp_runtime::traits::ConvertInto; -use xcm::latest::prelude::*; -use xcm_builder::{ - AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, - AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, - DenyReserveTransferToRelayChain, DenyThenTry, DescribeAllTerminal, DescribeFamily, - EnsureXcmOrigin, FungiblesAdapter, HashedDescription, IsConcrete, LocalMint, NoChecking, - ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, - SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, - SovereignSignedViaLocation, StartsWith, StartsWithExplicitGlobalConsensus, TakeWeightCredit, - TrailingSetTopicAsId, UsingComponents, WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, -}; -use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; - -#[cfg(feature = "runtime-benchmarks")] -use {cumulus_primitives_core::ParaId, sp_core::Get}; - -parameter_types! { - pub const KsmLocation: MultiLocation = MultiLocation::parent(); - pub const RelayNetwork: Option = Some(NetworkId::Kusama); - pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); - pub UniversalLocation: InteriorMultiLocation = - X2(GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(ParachainInfo::parachain_id().into())); - pub UniversalLocationNetworkId: NetworkId = UniversalLocation::get().global_consensus().unwrap(); - pub TrustBackedAssetsPalletLocation: MultiLocation = - PalletInstance(::index() as u8).into(); - pub ForeignAssetsPalletLocation: MultiLocation = - PalletInstance(::index() as u8).into(); - pub PoolAssetsPalletLocation: MultiLocation = - PalletInstance(::index() as u8).into(); - pub CheckingAccount: AccountId = PolkadotXcm::check_account(); - pub const GovernanceLocation: MultiLocation = MultiLocation::parent(); - pub const FellowshipLocation: MultiLocation = MultiLocation::parent(); -} - -/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used -/// when determining ownership of accounts for asset transacting and when attempting to use XCM -/// `Transact` in order to determine the dispatch Origin. -pub type LocationToAccountId = ( - // The parent (Relay-chain) origin converts to the parent `AccountId`. - ParentIsPreset, - // Sibling parachain origins convert to AccountId via the `ParaId::into`. - SiblingParachainConvertsVia, - // Straight up local `AccountId32` origins just alias directly to `AccountId`. - AccountId32Aliases, - // Foreign locations alias into accounts according to a hash of their standard description. - HashedDescription>, -); - -/// Means for transacting the native currency on this chain. -pub type CurrencyTransactor = CurrencyAdapter< - // Use this currency: - Balances, - // Use this currency when it is a fungible asset matching the given location or name: - IsConcrete, - // Convert an XCM MultiLocation into a local account id: - LocationToAccountId, - // Our chain's account ID type (we can't get away without mentioning it explicitly): - AccountId, - // We don't track any teleports of `Balances`. - (), ->; - -/// `AssetId`/`Balance` converter for `PoolAssets`. -pub type TrustBackedAssetsConvertedConcreteId = - assets_common::TrustBackedAssetsConvertedConcreteId; - -/// Means for transacting assets besides the native currency on this chain. -pub type FungiblesTransactor = FungiblesAdapter< - // Use this fungibles implementation: - Assets, - // Use this currency when it is a fungible asset matching the given location or name: - TrustBackedAssetsConvertedConcreteId, - // Convert an XCM MultiLocation into a local account id: - LocationToAccountId, - // Our chain's account ID type (we can't get away without mentioning it explicitly): - AccountId, - // We only want to allow teleports of known assets. We use non-zero issuance as an indication - // that this asset is known. - LocalMint>, - // The account to use for tracking teleports. - CheckingAccount, ->; - -/// `AssetId/Balance` converter for `TrustBackedAssets` -pub type ForeignAssetsConvertedConcreteId = assets_common::ForeignAssetsConvertedConcreteId< - ( - // Ignore `TrustBackedAssets` explicitly - StartsWith, - // Ignore assets that start explicitly with our `GlobalConsensus(NetworkId)`, means: - // - foreign assets from our consensus should be: `MultiLocation {parents: 1, - // X*(Parachain(xyz), ..)}` - // - foreign assets outside our consensus with the same `GlobalConsensus(NetworkId)` won't - // be accepted here - StartsWithExplicitGlobalConsensus, - ), - Balance, ->; - -/// Means for transacting foreign assets from different global consensus. -pub type ForeignFungiblesTransactor = FungiblesAdapter< - // Use this fungibles implementation: - ForeignAssets, - // Use this currency when it is a fungible asset matching the given location or name: - ForeignAssetsConvertedConcreteId, - // Convert an XCM MultiLocation into a local account id: - LocationToAccountId, - // Our chain's account ID type (we can't get away without mentioning it explicitly): - AccountId, - // We dont need to check teleports here. - NoChecking, - // The account to use for tracking teleports. - CheckingAccount, ->; - -/// `AssetId`/`Balance` converter for `PoolAssets`. -pub type PoolAssetsConvertedConcreteId = - assets_common::PoolAssetsConvertedConcreteId; - -/// Means for transacting asset conversion pool assets on this chain. -pub type PoolFungiblesTransactor = FungiblesAdapter< - // Use this fungibles implementation: - PoolAssets, - // Use this currency when it is a fungible asset matching the given location or name: - PoolAssetsConvertedConcreteId, - // Convert an XCM MultiLocation into a local account id: - LocationToAccountId, - // Our chain's account ID type (we can't get away without mentioning it explicitly): - AccountId, - // We only want to allow teleports of known assets. We use non-zero issuance as an indication - // that this asset is known. - LocalMint>, - // The account to use for tracking teleports. - CheckingAccount, ->; - -/// Means for transacting assets on this chain. -pub type AssetTransactors = - (CurrencyTransactor, FungiblesTransactor, ForeignFungiblesTransactor, PoolFungiblesTransactor); - -/// Simple `MultiLocation` matcher for Local and Foreign asset `MultiLocation`. -pub struct LocalAndForeignAssetsMultiLocationMatcher; -impl MatchesLocalAndForeignAssetsMultiLocation for LocalAndForeignAssetsMultiLocationMatcher { - fn is_local(location: &MultiLocation) -> bool { - use assets_common::fungible_conversion::MatchesMultiLocation; - TrustBackedAssetsConvertedConcreteId::contains(location) - } - fn is_foreign(location: &MultiLocation) -> bool { - use assets_common::fungible_conversion::MatchesMultiLocation; - ForeignAssetsConvertedConcreteId::contains(location) - } -} -impl Contains for LocalAndForeignAssetsMultiLocationMatcher { - fn contains(location: &MultiLocation) -> bool { - Self::is_local(location) || Self::is_foreign(location) - } -} - -/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, -/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can -/// biases the kind of local `Origin` it will become. -pub type XcmOriginToTransactDispatchOrigin = ( - // Sovereign account converter; this attempts to derive an `AccountId` from the origin location - // using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for - // foreign chains who want to have a local sovereign account on this chain which they control. - SovereignSignedViaLocation, - // Native converter for Relay-chain (Parent) location; will convert to a `Relay` origin when - // recognised. - RelayChainAsNative, - // Native converter for sibling Parachains; will convert to a `SiblingPara` origin when - // recognised. - SiblingParachainAsNative, - // Superuser converter for the Relay-chain (Parent) location. This will allow it to issue a - // transaction from the Root origin. - ParentAsSuperuser, - // Native signed account converter; this just converts an `AccountId32` origin into a normal - // `RuntimeOrigin::Signed` origin of the same 32-byte value. - SignedAccountId32AsNative, - // Xcm origins can be represented natively under the Xcm pallet's Xcm origin. - XcmPassthrough, -); - -parameter_types! { - pub const MaxInstructions: u32 = 100; - pub const MaxAssetsIntoHolding: u32 = 64; - pub XcmAssetFeesReceiver: Option = Authorship::author(); -} - -match_types! { - pub type ParentOrParentsPlurality: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(Plurality { .. }) } - }; - pub type ParentOrSiblings: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(_) } - }; -} - -/// A call filter for the XCM Transact instruction. This is a temporary measure until we properly -/// account for proof size weights. -/// -/// Calls that are allowed through this filter must: -/// 1. Have a fixed weight; -/// 2. Cannot lead to another call being made; -/// 3. Have a defined proof size weight, e.g. no unbounded vecs in call parameters. -pub struct SafeCallFilter; -impl Contains for SafeCallFilter { - fn contains(call: &RuntimeCall) -> bool { - #[cfg(feature = "runtime-benchmarks")] - { - if matches!(call, RuntimeCall::System(frame_system::Call::remark_with_event { .. })) { - return true - } - } - - matches!( - call, - RuntimeCall::PolkadotXcm(pallet_xcm::Call::force_xcm_version { .. }) | - RuntimeCall::System( - frame_system::Call::set_heap_pages { .. } | - frame_system::Call::set_code { .. } | - frame_system::Call::set_code_without_checks { .. } | - frame_system::Call::kill_prefix { .. }, - ) | RuntimeCall::ParachainSystem(..) | - RuntimeCall::Timestamp(..) | - RuntimeCall::Balances(..) | - RuntimeCall::CollatorSelection( - pallet_collator_selection::Call::set_desired_candidates { .. } | - pallet_collator_selection::Call::set_candidacy_bond { .. } | - pallet_collator_selection::Call::register_as_candidate { .. } | - pallet_collator_selection::Call::leave_intent { .. } | - pallet_collator_selection::Call::set_invulnerables { .. } | - pallet_collator_selection::Call::add_invulnerable { .. } | - pallet_collator_selection::Call::remove_invulnerable { .. }, - ) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | - RuntimeCall::XcmpQueue(..) | - RuntimeCall::DmpQueue(..) | - RuntimeCall::Assets( - pallet_assets::Call::create { .. } | - pallet_assets::Call::force_create { .. } | - pallet_assets::Call::start_destroy { .. } | - pallet_assets::Call::destroy_accounts { .. } | - pallet_assets::Call::destroy_approvals { .. } | - pallet_assets::Call::finish_destroy { .. } | - pallet_assets::Call::block { .. } | - pallet_assets::Call::mint { .. } | - pallet_assets::Call::burn { .. } | - pallet_assets::Call::transfer { .. } | - pallet_assets::Call::transfer_keep_alive { .. } | - pallet_assets::Call::force_transfer { .. } | - pallet_assets::Call::freeze { .. } | - pallet_assets::Call::thaw { .. } | - pallet_assets::Call::freeze_asset { .. } | - pallet_assets::Call::thaw_asset { .. } | - pallet_assets::Call::transfer_ownership { .. } | - pallet_assets::Call::set_team { .. } | - pallet_assets::Call::set_metadata { .. } | - pallet_assets::Call::clear_metadata { .. } | - pallet_assets::Call::force_set_metadata { .. } | - pallet_assets::Call::force_clear_metadata { .. } | - pallet_assets::Call::force_asset_status { .. } | - pallet_assets::Call::approve_transfer { .. } | - pallet_assets::Call::cancel_approval { .. } | - pallet_assets::Call::force_cancel_approval { .. } | - pallet_assets::Call::transfer_approved { .. } | - pallet_assets::Call::touch { .. } | - pallet_assets::Call::touch_other { .. } | - pallet_assets::Call::refund { .. } | - pallet_assets::Call::refund_other { .. }, - ) | RuntimeCall::ForeignAssets( - pallet_assets::Call::create { .. } | - pallet_assets::Call::force_create { .. } | - pallet_assets::Call::start_destroy { .. } | - pallet_assets::Call::destroy_accounts { .. } | - pallet_assets::Call::destroy_approvals { .. } | - pallet_assets::Call::finish_destroy { .. } | - pallet_assets::Call::block { .. } | - pallet_assets::Call::mint { .. } | - pallet_assets::Call::burn { .. } | - pallet_assets::Call::transfer { .. } | - pallet_assets::Call::transfer_keep_alive { .. } | - pallet_assets::Call::force_transfer { .. } | - pallet_assets::Call::freeze { .. } | - pallet_assets::Call::thaw { .. } | - pallet_assets::Call::freeze_asset { .. } | - pallet_assets::Call::thaw_asset { .. } | - pallet_assets::Call::transfer_ownership { .. } | - pallet_assets::Call::set_team { .. } | - pallet_assets::Call::set_metadata { .. } | - pallet_assets::Call::clear_metadata { .. } | - pallet_assets::Call::force_set_metadata { .. } | - pallet_assets::Call::force_clear_metadata { .. } | - pallet_assets::Call::force_asset_status { .. } | - pallet_assets::Call::approve_transfer { .. } | - pallet_assets::Call::cancel_approval { .. } | - pallet_assets::Call::force_cancel_approval { .. } | - pallet_assets::Call::transfer_approved { .. } | - pallet_assets::Call::touch { .. } | - pallet_assets::Call::touch_other { .. } | - pallet_assets::Call::refund { .. } | - pallet_assets::Call::refund_other { .. }, - ) | RuntimeCall::PoolAssets( - pallet_assets::Call::force_create { .. } | - pallet_assets::Call::block { .. } | - pallet_assets::Call::burn { .. } | - pallet_assets::Call::transfer { .. } | - pallet_assets::Call::transfer_keep_alive { .. } | - pallet_assets::Call::force_transfer { .. } | - pallet_assets::Call::freeze { .. } | - pallet_assets::Call::thaw { .. } | - pallet_assets::Call::freeze_asset { .. } | - pallet_assets::Call::thaw_asset { .. } | - pallet_assets::Call::transfer_ownership { .. } | - pallet_assets::Call::set_team { .. } | - pallet_assets::Call::set_metadata { .. } | - pallet_assets::Call::clear_metadata { .. } | - pallet_assets::Call::force_set_metadata { .. } | - pallet_assets::Call::force_clear_metadata { .. } | - pallet_assets::Call::force_asset_status { .. } | - pallet_assets::Call::approve_transfer { .. } | - pallet_assets::Call::cancel_approval { .. } | - pallet_assets::Call::force_cancel_approval { .. } | - pallet_assets::Call::transfer_approved { .. } | - pallet_assets::Call::touch { .. } | - pallet_assets::Call::touch_other { .. } | - pallet_assets::Call::refund { .. } | - pallet_assets::Call::refund_other { .. }, - ) | RuntimeCall::AssetConversion( - pallet_asset_conversion::Call::create_pool { .. } | - pallet_asset_conversion::Call::add_liquidity { .. } | - pallet_asset_conversion::Call::remove_liquidity { .. } | - pallet_asset_conversion::Call::swap_tokens_for_exact_tokens { .. } | - pallet_asset_conversion::Call::swap_exact_tokens_for_tokens { .. }, - ) | RuntimeCall::NftFractionalization( - pallet_nft_fractionalization::Call::fractionalize { .. } | - pallet_nft_fractionalization::Call::unify { .. }, - ) | RuntimeCall::Nfts( - pallet_nfts::Call::create { .. } | - pallet_nfts::Call::force_create { .. } | - pallet_nfts::Call::destroy { .. } | - pallet_nfts::Call::mint { .. } | - pallet_nfts::Call::force_mint { .. } | - pallet_nfts::Call::burn { .. } | - pallet_nfts::Call::transfer { .. } | - pallet_nfts::Call::lock_item_transfer { .. } | - pallet_nfts::Call::unlock_item_transfer { .. } | - pallet_nfts::Call::lock_collection { .. } | - pallet_nfts::Call::transfer_ownership { .. } | - pallet_nfts::Call::set_team { .. } | - pallet_nfts::Call::force_collection_owner { .. } | - pallet_nfts::Call::force_collection_config { .. } | - pallet_nfts::Call::approve_transfer { .. } | - pallet_nfts::Call::cancel_approval { .. } | - pallet_nfts::Call::clear_all_transfer_approvals { .. } | - pallet_nfts::Call::lock_item_properties { .. } | - pallet_nfts::Call::set_attribute { .. } | - pallet_nfts::Call::force_set_attribute { .. } | - pallet_nfts::Call::clear_attribute { .. } | - pallet_nfts::Call::approve_item_attributes { .. } | - pallet_nfts::Call::cancel_item_attributes_approval { .. } | - pallet_nfts::Call::set_metadata { .. } | - pallet_nfts::Call::clear_metadata { .. } | - pallet_nfts::Call::set_collection_metadata { .. } | - pallet_nfts::Call::clear_collection_metadata { .. } | - pallet_nfts::Call::set_accept_ownership { .. } | - pallet_nfts::Call::set_collection_max_supply { .. } | - pallet_nfts::Call::update_mint_settings { .. } | - pallet_nfts::Call::set_price { .. } | - pallet_nfts::Call::buy_item { .. } | - pallet_nfts::Call::pay_tips { .. } | - pallet_nfts::Call::create_swap { .. } | - pallet_nfts::Call::cancel_swap { .. } | - pallet_nfts::Call::claim_swap { .. }, - ) | RuntimeCall::Uniques( - pallet_uniques::Call::create { .. } | - pallet_uniques::Call::force_create { .. } | - pallet_uniques::Call::destroy { .. } | - pallet_uniques::Call::mint { .. } | - pallet_uniques::Call::burn { .. } | - pallet_uniques::Call::transfer { .. } | - pallet_uniques::Call::freeze { .. } | - pallet_uniques::Call::thaw { .. } | - pallet_uniques::Call::freeze_collection { .. } | - pallet_uniques::Call::thaw_collection { .. } | - pallet_uniques::Call::transfer_ownership { .. } | - pallet_uniques::Call::set_team { .. } | - pallet_uniques::Call::approve_transfer { .. } | - pallet_uniques::Call::cancel_approval { .. } | - pallet_uniques::Call::force_item_status { .. } | - pallet_uniques::Call::set_attribute { .. } | - pallet_uniques::Call::clear_attribute { .. } | - pallet_uniques::Call::set_metadata { .. } | - pallet_uniques::Call::clear_metadata { .. } | - pallet_uniques::Call::set_collection_metadata { .. } | - pallet_uniques::Call::clear_collection_metadata { .. } | - pallet_uniques::Call::set_accept_ownership { .. } | - pallet_uniques::Call::set_collection_max_supply { .. } | - pallet_uniques::Call::set_price { .. } | - pallet_uniques::Call::buy_item { .. } - ) - ) - } -} - -pub type Barrier = TrailingSetTopicAsId< - DenyThenTry< - DenyReserveTransferToRelayChain, - ( - TakeWeightCredit, - // Expected responses are OK. - AllowKnownQueryResponses, - // Allow XCMs with some computed origins to pass through. - WithComputedOrigin< - ( - // If the message is one that immediately attempts to pay for execution, then - // allow it. - AllowTopLevelPaidExecutionFrom, - // Parent and its pluralities (i.e. governance bodies) get free execution. - AllowExplicitUnpaidExecutionFrom, - // Subscriptions for version tracking are OK. - AllowSubscriptionsFrom, - ), - UniversalLocation, - ConstU32<8>, - >, - ), - >, ->; - -pub type AssetFeeAsExistentialDepositMultiplierFeeCharger = AssetFeeAsExistentialDepositMultiplier< - Runtime, - WeightToFee, - pallet_assets::BalanceToAssetBalance, - TrustBackedAssetsInstance, ->; - -/// Cases where a remote origin is accepted as trusted Teleporter for a given asset: -/// -/// - KSM with the parent Relay Chain and sibling system parachains; and -/// - Sibling parachains' assets from where they originate (as `ForeignCreators`). -pub type TrustedTeleporters = ( - ConcreteAssetFromSystem, - IsForeignConcreteAsset>>, -); - -pub struct XcmConfig; -impl xcm_executor::Config for XcmConfig { - type RuntimeCall = RuntimeCall; - type XcmSender = XcmRouter; - type AssetTransactor = AssetTransactors; - type OriginConverter = XcmOriginToTransactDispatchOrigin; - // Asset Hub Kusama does not recognize a reserve location for any asset. This does not prevent - // Asset Hub acting _as_ a reserve location for KSM and assets created under `pallet-assets`. - // For KSM, users must use teleport where allowed (e.g. with the Relay Chain). - type IsReserve = (); - type IsTeleporter = TrustedTeleporters; - type UniversalLocation = UniversalLocation; - type Barrier = Barrier; - type Weigher = WeightInfoBounds< - crate::weights::xcm::AssetHubKusamaXcmWeight, - RuntimeCall, - MaxInstructions, - >; - type Trader = ( - UsingComponents>, - cumulus_primitives_utility::TakeFirstAssetTrader< - AccountId, - AssetFeeAsExistentialDepositMultiplierFeeCharger, - TrustBackedAssetsConvertedConcreteId, - Assets, - cumulus_primitives_utility::XcmFeesTo32ByteAccount< - FungiblesTransactor, - AccountId, - XcmAssetFeesReceiver, - >, - >, - ); - type ResponseHandler = PolkadotXcm; - type AssetTrap = PolkadotXcm; - type AssetClaims = PolkadotXcm; - type SubscriptionService = PolkadotXcm; - type PalletInstancesInfo = AllPalletsWithSystem; - type MaxAssetsIntoHolding = MaxAssetsIntoHolding; - type AssetLocker = (); - type AssetExchanger = (); - type FeeManager = (); - type MessageExporter = (); - type UniversalAliases = Nothing; - type CallDispatcher = WithOriginFilter; - type SafeCallFilter = SafeCallFilter; - type Aliasers = Nothing; -} - -/// Converts a local signed origin into an XCM multilocation. -/// Forms the basis for local origins sending/executing XCMs. -pub type LocalOriginToLocation = SignedToAccountId32; - -parameter_types! { - /// The asset ID for the asset that we use to pay for message delivery fees. - pub FeeAssetId: AssetId = Concrete(KsmLocation::get()); - /// The base fee for the message delivery fees. - pub const BaseDeliveryFee: u128 = CENTS.saturating_mul(3); -} - -pub type PriceForParentDelivery = - ExponentialPrice; - -/// The means for routing XCM messages which are not for local execution into the right message -/// queues. -pub type XcmRouter = WithUniqueTopic<( - // Two routers - use UMP to communicate with the relay chain: - cumulus_primitives_utility::ParentAsUmp, - // ..and XCMP to communicate with the sibling chains. - XcmpQueue, -)>; - -#[cfg(feature = "runtime-benchmarks")] -parameter_types! { - pub ReachableDest: Option = Some(Parent.into()); -} - -impl pallet_xcm::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - // We want to disallow users sending (arbitrary) XCMs from this chain. - type SendXcmOrigin = EnsureXcmOrigin; - type XcmRouter = XcmRouter; - // We support local origins dispatching XCM executions in principle... - type ExecuteXcmOrigin = EnsureXcmOrigin; - // ... but disallow generic XCM execution. As a result only teleports and reserve transfers are - // allowed. - type XcmExecuteFilter = Nothing; - type XcmExecutor = XcmExecutor; - type XcmTeleportFilter = Everything; - type XcmReserveTransferFilter = Everything; - type Weigher = WeightInfoBounds< - crate::weights::xcm::AssetHubKusamaXcmWeight, - RuntimeCall, - MaxInstructions, - >; - type UniversalLocation = UniversalLocation; - type RuntimeOrigin = RuntimeOrigin; - type RuntimeCall = RuntimeCall; - const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100; - type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion; - type Currency = Balances; - type CurrencyMatcher = (); - type TrustedLockers = (); - type SovereignAccountOf = LocationToAccountId; - type MaxLockers = ConstU32<8>; - type WeightInfo = crate::weights::pallet_xcm::WeightInfo; - #[cfg(feature = "runtime-benchmarks")] - type ReachableDest = ReachableDest; - type AdminOrigin = EnsureRoot; - type MaxRemoteLockConsumers = ConstU32<0>; - type RemoteLockConsumerIdentifier = (); -} - -impl cumulus_pallet_xcm::Config for Runtime { - type RuntimeEvent = RuntimeEvent; - type XcmExecutor = XcmExecutor; -} - -pub type ForeignCreatorsSovereignAccountOf = ( - SiblingParachainConvertsVia, - AccountId32Aliases, - ParentIsPreset, -); - -/// Simple conversion of `u32` into an `AssetId` for use in benchmarking. -pub struct XcmBenchmarkHelper; -#[cfg(feature = "runtime-benchmarks")] -impl pallet_assets::BenchmarkHelper for XcmBenchmarkHelper { - fn create_asset_id_parameter(id: u32) -> MultiLocation { - MultiLocation { parents: 1, interior: X1(Parachain(id)) } - } -} - -#[cfg(feature = "runtime-benchmarks")] -pub struct BenchmarkMultiLocationConverter { - _phantom: sp_std::marker::PhantomData, -} - -#[cfg(feature = "runtime-benchmarks")] -impl pallet_asset_conversion::BenchmarkHelper - for BenchmarkMultiLocationConverter -where - SelfParaId: Get, -{ - fn asset_id(asset_id: u32) -> MultiLocation { - MultiLocation { - parents: 1, - interior: X3( - Parachain(SelfParaId::get().into()), - PalletInstance(::index() as u8), - GeneralIndex(asset_id.into()), - ), - } - } - fn multiasset_id(asset_id: u32) -> MultiLocation { - Self::asset_id(asset_id) - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs index 408f489505d..ca5d5be241b 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs @@ -29,7 +29,7 @@ pub mod xcm_config; use assets_common::{ foreign_creators::ForeignCreators, - local_and_foreign_assets::{LocalAndForeignAssets, MultiLocationConverter}, + local_and_foreign_assets::{LocalFromLeft, TargetFromLeft}, matching::FromSiblingParachain, AssetIdForTrustBackedAssetsConvert, MultiLocationForAssetId, }; @@ -57,8 +57,9 @@ use frame_support::{ genesis_builder_helper::{build_config, create_default_config}, ord_parameter_types, parameter_types, traits::{ - AsEnsureOriginWithArg, ConstBool, ConstU128, ConstU32, ConstU64, ConstU8, EitherOfDiverse, - Equals, InstanceFilter, TransformOrigin, + fungible, fungibles, tokens::imbalance::ResolveAssetTo, AsEnsureOriginWithArg, ConstBool, + ConstU128, ConstU32, ConstU64, ConstU8, EitherOfDiverse, Equals, InstanceFilter, + TransformOrigin, }, weights::{ConstantMultiplier, Weight}, BoundedVec, PalletId, @@ -82,8 +83,9 @@ use parachains_common::{ use sp_runtime::{Perbill, RuntimeDebug}; use xcm::opaque::v3::MultiLocation; use xcm_config::{ - ForeignAssetsConvertedConcreteId, GovernanceLocation, PoolAssetsConvertedConcreteId, - TokenLocation, TrustBackedAssetsConvertedConcreteId, + ForeignAssetsConvertedConcreteId, ForeignCreatorsSovereignAccountOf, GovernanceLocation, + PoolAssetsConvertedConcreteId, TokenLocation, TrustBackedAssetsConvertedConcreteId, + TrustBackedAssetsPalletLocation, }; #[cfg(any(feature = "std", test))] @@ -94,10 +96,6 @@ use pallet_xcm::{EnsureXcm, IsVoiceOfBody}; use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; use xcm::latest::prelude::*; -use crate::xcm_config::{ - ForeignCreatorsSovereignAccountOf, LocalAndForeignAssetsMultiLocationMatcher, - TrustBackedAssetsPalletLocation, -}; use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; impl_opaque_keys! { @@ -279,8 +277,6 @@ impl pallet_assets::Config for Runtime { parameter_types! { pub const AssetConversionPalletId: PalletId = PalletId(*b"py/ascon"); - pub const AllowMultiAssetPools: bool = false; - // should be non-zero if AllowMultiAssetPools is true, otherwise can be zero pub const LiquidityWithdrawalFee: Permill = Permill::from_percent(0); } @@ -315,35 +311,50 @@ impl pallet_assets::Config for Runtime { type BenchmarkHelper = (); } +/// Union fungibles implementation for `Assets`` and `ForeignAssets`. +pub type LocalAndForeignAssets = fungibles::UnionOf< + Assets, + ForeignAssets, + LocalFromLeft< + AssetIdForTrustBackedAssetsConvert, + AssetIdForTrustBackedAssets, + >, + MultiLocation, + AccountId, +>; + impl pallet_asset_conversion::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Balance = Balance; type HigherPrecisionBalance = sp_core::U256; - type Currency = Balances; - type AssetId = MultiLocation; - type Assets = LocalAndForeignAssets< - Assets, - AssetIdForTrustBackedAssetsConvert, - ForeignAssets, + type AssetKind = MultiLocation; + type Assets = fungible::UnionOf< + Balances, + LocalAndForeignAssets, + TargetFromLeft, + Self::AssetKind, + Self::AccountId, >; - type PoolAssets = PoolAssets; + type PoolId = (Self::AssetKind, Self::AssetKind); + type PoolLocator = + pallet_asset_conversion::WithFirstAsset; type PoolAssetId = u32; + type PoolAssets = PoolAssets; type PoolSetupFee = ConstU128<0>; // Asset class deposit fees are sufficient to prevent spam - type PoolSetupFeeReceiver = AssetConversionOrigin; - // should be non-zero if `AllowMultiAssetPools` is true, otherwise can be zero. + type PoolSetupFeeAsset = TokenLocation; + type PoolSetupFeeTarget = ResolveAssetTo; type LiquidityWithdrawalFee = LiquidityWithdrawalFee; type LPFee = ConstU32<3>; type PalletId = AssetConversionPalletId; - type AllowMultiAssetPools = AllowMultiAssetPools; - type MaxSwapPathLength = ConstU32<4>; - type MultiAssetId = MultiLocation; - type MultiAssetIdConverter = - MultiLocationConverter; + type MaxSwapPathLength = ConstU32<3>; type MintMinLiquidity = ConstU128<100>; type WeightInfo = weights::pallet_asset_conversion::WeightInfo; #[cfg(feature = "runtime-benchmarks")] - type BenchmarkHelper = - crate::xcm_config::BenchmarkMultiLocationConverter>; + type BenchmarkHelper = assets_common::benchmarks::AssetPairFactory< + TokenLocation, + parachain_info::Pallet, + xcm_config::AssetsPalletIndex, + >; } parameter_types! { @@ -733,12 +744,9 @@ impl pallet_collator_selection::Config for Runtime { impl pallet_asset_conversion_tx_payment::Config for Runtime { type RuntimeEvent = RuntimeEvent; - type Fungibles = LocalAndForeignAssets< - Assets, - AssetIdForTrustBackedAssetsConvert, - ForeignAssets, - >; - type OnChargeAssetTransaction = AssetConversionAdapter; + type Fungibles = LocalAndForeignAssets; + type OnChargeAssetTransaction = + AssetConversionAdapter; } parameter_types! { @@ -1154,7 +1162,7 @@ impl_runtime_apis! { } fn get_reserves(asset1: MultiLocation, asset2: MultiLocation) -> Option<(Balance, Balance)> { - AssetConversion::get_reserves(&asset1, &asset2).ok() + AssetConversion::get_reserves(asset1, asset2).ok() } } diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/pallet_asset_conversion.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/pallet_asset_conversion.rs index 4514fbfa876..0486932d1d6 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/pallet_asset_conversion.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/pallet_asset_conversion.rs @@ -17,25 +17,23 @@ //! Autogenerated weights for `pallet_asset_conversion` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-26, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-10-30, STEPS: `20`, REPEAT: `2`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-rococo-dev")`, DB CACHE: 1024 +//! HOSTNAME: `cob`, CPU: `` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-rococo-dev")`, DB CACHE: 1024 // Executed Command: -// target/production/polkadot-parachain +// ./target/debug/polkadot-parachain // benchmark // pallet -// --steps=50 -// --repeat=20 +// --chain=asset-hub-rococo-dev +// --steps=20 +// --repeat=2 +// --pallet=pallet-asset-conversion // --extrinsic=* // --wasm-execution=compiled // --heap-pages=4096 -// --json-file=/builds/parity/mirrors/cumulus/.git/.artifacts/bench.json -// --pallet=pallet_asset_conversion -// --chain=asset-hub-rococo-dev -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-rococo/src/weights/ +// --output=./cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/pallet_asset_conversion.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,9 +48,7 @@ pub struct WeightInfo(PhantomData); impl pallet_asset_conversion::WeightInfo for WeightInfo { /// Storage: `AssetConversion::Pools` (r:1 w:1) /// Proof: `AssetConversion::Pools` (`max_values`: None, `max_size`: Some(1224), added: 3699, mode: `MaxEncodedLen`) - /// Storage: UNKNOWN KEY `0x76a2c49709deec21d9c05f96c1f47351` (r:1 w:0) - /// Proof: UNKNOWN KEY `0x76a2c49709deec21d9c05f96c1f47351` (r:1 w:0) - /// Storage: `System::Account` (r:2 w:1) + /// Storage: `System::Account` (r:1 w:1) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// Storage: `ForeignAssets::Account` (r:1 w:1) /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) @@ -66,22 +62,22 @@ impl pallet_asset_conversion::WeightInfo for WeightInfo /// Proof: `PoolAssets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) fn create_pool() -> Weight { // Proof Size summary in bytes: - // Measured: `480` - // Estimated: `6196` - // Minimum execution time: 88_484_000 picoseconds. - Weight::from_parts(92_964_000, 0) - .saturating_add(Weight::from_parts(0, 6196)) - .saturating_add(T::DbWeight::get().reads(9)) + // Measured: `408` + // Estimated: `4689` + // Minimum execution time: 906_000_000 picoseconds. + Weight::from_parts(945_000_000, 0) + .saturating_add(Weight::from_parts(0, 4689)) + .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(7)) } /// Storage: `AssetConversion::Pools` (r:1 w:0) /// Proof: `AssetConversion::Pools` (`max_values`: None, `max_size`: Some(1224), added: 3699, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// Storage: `ForeignAssets::Asset` (r:1 w:1) /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) /// Storage: `ForeignAssets::Account` (r:2 w:2) /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// Storage: `PoolAssets::Asset` (r:1 w:1) /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) /// Storage: `PoolAssets::Account` (r:2 w:2) @@ -90,34 +86,32 @@ impl pallet_asset_conversion::WeightInfo for WeightInfo // Proof Size summary in bytes: // Measured: `1117` // Estimated: `7404` - // Minimum execution time: 153_015_000 picoseconds. - Weight::from_parts(157_018_000, 0) + // Minimum execution time: 1_609_000_000 picoseconds. + Weight::from_parts(1_631_000_000, 0) .saturating_add(Weight::from_parts(0, 7404)) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(7)) } /// Storage: `AssetConversion::Pools` (r:1 w:0) /// Proof: `AssetConversion::Pools` (`max_values`: None, `max_size`: Some(1224), added: 3699, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// Storage: `ForeignAssets::Asset` (r:1 w:1) /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) /// Storage: `ForeignAssets::Account` (r:2 w:2) /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// Storage: `PoolAssets::Asset` (r:1 w:1) /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: UNKNOWN KEY `0x2433d831722b1f4aeb1666953f1c0e77` (r:1 w:0) - /// Proof: UNKNOWN KEY `0x2433d831722b1f4aeb1666953f1c0e77` (r:1 w:0) /// Storage: `PoolAssets::Account` (r:1 w:1) /// Proof: `PoolAssets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) fn remove_liquidity() -> Weight { // Proof Size summary in bytes: // Measured: `1106` // Estimated: `7404` - // Minimum execution time: 141_726_000 picoseconds. - Weight::from_parts(147_865_000, 0) + // Minimum execution time: 1_480_000_000 picoseconds. + Weight::from_parts(1_506_000_000, 0) .saturating_add(Weight::from_parts(0, 7404)) - .saturating_add(T::DbWeight::get().reads(8)) + .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(6)) } /// Storage: `ForeignAssets::Asset` (r:2 w:2) @@ -126,15 +120,19 @@ impl pallet_asset_conversion::WeightInfo for WeightInfo /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) /// Storage: `System::Account` (r:2 w:2) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn swap_exact_tokens_for_tokens() -> Weight { + /// The range of component `n` is `[2, 3]`. + fn swap_exact_tokens_for_tokens(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1148` - // Estimated: `13818` - // Minimum execution time: 168_619_000 picoseconds. - Weight::from_parts(174_283_000, 0) - .saturating_add(Weight::from_parts(0, 13818)) - .saturating_add(T::DbWeight::get().reads(8)) - .saturating_add(T::DbWeight::get().writes(8)) + // Measured: `0 + n * (557 ±0)` + // Estimated: `7404 + n * (393 ±73)` + // Minimum execution time: 933_000_000 picoseconds. + Weight::from_parts(950_000_000, 0) + .saturating_add(Weight::from_parts(0, 7404)) + // Standard Error: 18_792_550 + .saturating_add(Weight::from_parts(46_683_673, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(4)) + .saturating_add(Weight::from_parts(0, 393).saturating_mul(n.into())) } /// Storage: `System::Account` (r:2 w:2) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) @@ -142,14 +140,18 @@ impl pallet_asset_conversion::WeightInfo for WeightInfo /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) /// Storage: `ForeignAssets::Account` (r:4 w:4) /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - fn swap_tokens_for_exact_tokens() -> Weight { + /// The range of component `n` is `[2, 3]`. + fn swap_tokens_for_exact_tokens(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1148` - // Estimated: `13818` - // Minimum execution time: 171_565_000 picoseconds. - Weight::from_parts(173_702_000, 0) - .saturating_add(Weight::from_parts(0, 13818)) - .saturating_add(T::DbWeight::get().reads(8)) - .saturating_add(T::DbWeight::get().writes(8)) + // Measured: `0 + n * (557 ±0)` + // Estimated: `7404 + n * (393 ±180)` + // Minimum execution time: 936_000_000 picoseconds. + Weight::from_parts(954_000_000, 0) + .saturating_add(Weight::from_parts(0, 7404)) + // Standard Error: 15_942_881 + .saturating_add(Weight::from_parts(39_755_102, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(4)) + .saturating_add(Weight::from_parts(0, 393).saturating_mul(n.into())) } } diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs index 76acced1148..e94a14b304b 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs @@ -56,9 +56,6 @@ use xcm_builder::{ }; use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; -#[cfg(feature = "runtime-benchmarks")] -use cumulus_primitives_core::ParaId; - parameter_types! { pub const TokenLocation: MultiLocation = MultiLocation::parent(); pub const RelayNetwork: NetworkId = NetworkId::Rococo; @@ -66,8 +63,8 @@ parameter_types! { pub UniversalLocation: InteriorMultiLocation = X2(GlobalConsensus(RelayNetwork::get()), Parachain(ParachainInfo::parachain_id().into())); pub UniversalLocationNetworkId: NetworkId = UniversalLocation::get().global_consensus().unwrap(); - pub TrustBackedAssetsPalletLocation: MultiLocation = - PalletInstance(::index() as u8).into(); + pub AssetsPalletIndex: u32 = ::index() as u32; + pub TrustBackedAssetsPalletLocation: MultiLocation = PalletInstance(AssetsPalletIndex::get() as u8).into(); pub ForeignAssetsPalletLocation: MultiLocation = PalletInstance(::index() as u8).into(); pub PoolAssetsPalletLocation: MultiLocation = @@ -672,32 +669,6 @@ impl pallet_assets::BenchmarkHelper for XcmBenchmarkHelper { } } -#[cfg(feature = "runtime-benchmarks")] -pub struct BenchmarkMultiLocationConverter { - _phantom: sp_std::marker::PhantomData, -} - -#[cfg(feature = "runtime-benchmarks")] -impl pallet_asset_conversion::BenchmarkHelper - for BenchmarkMultiLocationConverter -where - SelfParaId: frame_support::traits::Get, -{ - fn asset_id(asset_id: u32) -> MultiLocation { - MultiLocation { - parents: 1, - interior: X3( - Parachain(SelfParaId::get().into()), - PalletInstance(::index() as u8), - GeneralIndex(asset_id.into()), - ), - } - } - fn multiasset_id(asset_id: u32) -> MultiLocation { - Self::asset_id(asset_id) - } -} - /// All configuration related to bridging pub mod bridging { use super::*; diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs index e6a074df9e6..e0dff0c4516 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs @@ -27,11 +27,8 @@ include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); mod weights; pub mod xcm_config; -use crate::xcm_config::{ - LocalAndForeignAssetsMultiLocationMatcher, TrustBackedAssetsPalletLocation, -}; use assets_common::{ - local_and_foreign_assets::{LocalAndForeignAssets, MultiLocationConverter}, + local_and_foreign_assets::{LocalFromLeft, TargetFromLeft}, AssetIdForTrustBackedAssetsConvert, }; use codec::{Decode, Encode, MaxEncodedLen}; @@ -43,8 +40,10 @@ use frame_support::{ genesis_builder_helper::{build_config, create_default_config}, ord_parameter_types, parameter_types, traits::{ - tokens::nonfungibles_v2::Inspect, AsEnsureOriginWithArg, ConstBool, ConstU128, ConstU32, - ConstU64, ConstU8, Equals, InstanceFilter, TransformOrigin, + fungible, fungibles, + tokens::{imbalance::ResolveAssetTo, nonfungibles_v2::Inspect}, + AsEnsureOriginWithArg, ConstBool, ConstU128, ConstU32, ConstU64, ConstU8, Equals, + InstanceFilter, TransformOrigin, }, weights::{ConstantMultiplier, Weight}, BoundedVec, PalletId, @@ -80,7 +79,8 @@ use sp_version::RuntimeVersion; use xcm::opaque::v3::MultiLocation; use xcm_config::{ ForeignAssetsConvertedConcreteId, PoolAssetsConvertedConcreteId, - TrustBackedAssetsConvertedConcreteId, WestendLocation, XcmOriginToTransactDispatchOrigin, + TrustBackedAssetsConvertedConcreteId, TrustBackedAssetsPalletLocation, WestendLocation, + XcmOriginToTransactDispatchOrigin, }; #[cfg(any(feature = "std", test))] @@ -262,8 +262,6 @@ impl pallet_assets::Config for Runtime { parameter_types! { pub const AssetConversionPalletId: PalletId = PalletId(*b"py/ascon"); - pub const AllowMultiAssetPools: bool = false; - // should be non-zero if AllowMultiAssetPools is true, otherwise can be zero pub const LiquidityWithdrawalFee: Permill = Permill::from_percent(0); } @@ -297,34 +295,50 @@ impl pallet_assets::Config for Runtime { type BenchmarkHelper = (); } +/// Union fungibles implementation for `Assets`` and `ForeignAssets`. +pub type LocalAndForeignAssets = fungibles::UnionOf< + Assets, + ForeignAssets, + LocalFromLeft< + AssetIdForTrustBackedAssetsConvert, + AssetIdForTrustBackedAssets, + >, + MultiLocation, + AccountId, +>; + impl pallet_asset_conversion::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Balance = Balance; type HigherPrecisionBalance = sp_core::U256; - type Currency = Balances; - type AssetId = MultiLocation; - type Assets = LocalAndForeignAssets< - Assets, - AssetIdForTrustBackedAssetsConvert, - ForeignAssets, + type AssetKind = MultiLocation; + type Assets = fungible::UnionOf< + Balances, + LocalAndForeignAssets, + TargetFromLeft, + Self::AssetKind, + Self::AccountId, >; - type PoolAssets = PoolAssets; + type PoolId = (Self::AssetKind, Self::AssetKind); + type PoolLocator = + pallet_asset_conversion::WithFirstAsset; type PoolAssetId = u32; + type PoolAssets = PoolAssets; type PoolSetupFee = ConstU128<0>; // Asset class deposit fees are sufficient to prevent spam - type PoolSetupFeeReceiver = AssetConversionOrigin; - type LiquidityWithdrawalFee = LiquidityWithdrawalFee; // should be non-zero if AllowMultiAssetPools is true, otherwise can be zero. + type PoolSetupFeeAsset = WestendLocation; + type PoolSetupFeeTarget = ResolveAssetTo; + type LiquidityWithdrawalFee = LiquidityWithdrawalFee; type LPFee = ConstU32<3>; type PalletId = AssetConversionPalletId; - type AllowMultiAssetPools = AllowMultiAssetPools; - type MaxSwapPathLength = ConstU32<4>; - type MultiAssetId = MultiLocation; - type MultiAssetIdConverter = - MultiLocationConverter; + type MaxSwapPathLength = ConstU32<3>; type MintMinLiquidity = ConstU128<100>; type WeightInfo = weights::pallet_asset_conversion::WeightInfo; #[cfg(feature = "runtime-benchmarks")] - type BenchmarkHelper = - crate::xcm_config::BenchmarkMultiLocationConverter>; + type BenchmarkHelper = assets_common::benchmarks::AssetPairFactory< + WestendLocation, + parachain_info::Pallet, + xcm_config::AssetsPalletIndex, + >; } parameter_types! { @@ -709,12 +723,9 @@ impl pallet_collator_selection::Config for Runtime { impl pallet_asset_conversion_tx_payment::Config for Runtime { type RuntimeEvent = RuntimeEvent; - type Fungibles = LocalAndForeignAssets< - Assets, - AssetIdForTrustBackedAssetsConvert, - ForeignAssets, - >; - type OnChargeAssetTransaction = AssetConversionAdapter; + type Fungibles = LocalAndForeignAssets; + type OnChargeAssetTransaction = + AssetConversionAdapter; } parameter_types! { @@ -924,8 +935,6 @@ pub type Migrations = ( // unreleased pallet_collator_selection::migration::v1::MigrateToV1, // unreleased - migrations::NativeAssetParents0ToParents1Migration, - // unreleased pallet_multisig::migrations::v1::MigrateToV1, // unreleased InitStorageVersions, @@ -1229,7 +1238,7 @@ impl_runtime_apis! { } fn get_reserves(asset1: MultiLocation, asset2: MultiLocation) -> Option<(Balance, Balance)> { - AssetConversion::get_reserves(&asset1, &asset2).ok() + AssetConversion::get_reserves(asset1, asset2).ok() } } @@ -1689,117 +1698,3 @@ cumulus_pallet_parachain_system::register_validate_block! { Runtime = Runtime, BlockExecutor = cumulus_pallet_aura_ext::BlockExecutor::, } - -pub mod migrations { - use super::*; - use frame_support::{ - pallet_prelude::Get, - traits::{ - fungibles::{Inspect, Mutate}, - tokens::Preservation, - OnRuntimeUpgrade, OriginTrait, - }, - }; - use parachains_common::impls::AccountIdOf; - use sp_runtime::{traits::StaticLookup, Saturating}; - - /// Temporary migration because of bug with native asset, it can be removed once applied on - /// `AssetHubWestend`. Migrates pools with `MultiLocation { parents: 0, interior: Here }` to - /// `MultiLocation { parents: 1, interior: Here }` - pub struct NativeAssetParents0ToParents1Migration(sp_std::marker::PhantomData); - impl< - T: pallet_asset_conversion::Config, - > OnRuntimeUpgrade for NativeAssetParents0ToParents1Migration - where - ::PoolAssetId: Into, - AccountIdOf: Into<[u8; 32]>, - ::AccountId: - Into<<::RuntimeOrigin as OriginTrait>::AccountId>, - <::Lookup as StaticLookup>::Source: - From<::AccountId>, - sp_runtime::AccountId32: From<::AccountId>, - { - fn on_runtime_upgrade() -> Weight { - let invalid_native_asset = MultiLocation { parents: 0, interior: Here }; - let valid_native_asset = WestendLocation::get(); - - let mut reads: u64 = 1; - let mut writes: u64 = 0; - - // migrate pools with invalid native asset - let pools = pallet_asset_conversion::Pools::::iter().collect::>(); - reads.saturating_accrue(1); - for (old_pool_id, pool_info) in pools { - let old_pool_account = - pallet_asset_conversion::Pallet::::get_pool_account(&old_pool_id); - reads.saturating_accrue(1); - let pool_asset_id = pool_info.lp_token.clone(); - if old_pool_id.0 != invalid_native_asset { - // skip, if ok - continue - } - - // fix new account - let new_pool_id = pallet_asset_conversion::Pallet::::get_pool_id( - valid_native_asset, - old_pool_id.1, - ); - let new_pool_account = - pallet_asset_conversion::Pallet::::get_pool_account(&new_pool_id); - frame_system::Pallet::::inc_providers(&new_pool_account); - reads.saturating_accrue(2); - writes.saturating_accrue(1); - - // move currency - let _ = Balances::transfer_all( - RuntimeOrigin::signed(sp_runtime::AccountId32::from(old_pool_account.clone())), - sp_runtime::AccountId32::from(new_pool_account.clone()).into(), - false, - ); - reads.saturating_accrue(2); - writes.saturating_accrue(2); - - // move LP token - let _ = T::PoolAssets::transfer( - pool_asset_id.clone(), - &old_pool_account, - &new_pool_account, - T::PoolAssets::balance(pool_asset_id.clone(), &old_pool_account), - Preservation::Expendable, - ); - reads.saturating_accrue(1); - writes.saturating_accrue(2); - - // change the ownership of LP token - let _ = pallet_assets::Pallet::::transfer_ownership( - RuntimeOrigin::signed(sp_runtime::AccountId32::from(old_pool_account.clone())), - pool_asset_id.into(), - sp_runtime::AccountId32::from(new_pool_account.clone()).into(), - ); - reads.saturating_accrue(1); - writes.saturating_accrue(2); - - // move LocalOrForeignAssets - let _ = T::Assets::transfer( - old_pool_id.1, - &old_pool_account, - &new_pool_account, - T::Assets::balance(old_pool_id.1, &old_pool_account), - Preservation::Expendable, - ); - reads.saturating_accrue(1); - writes.saturating_accrue(2); - - // dec providers for old account - let _ = frame_system::Pallet::::dec_providers(&old_pool_account); - writes.saturating_accrue(1); - - // change pool key - pallet_asset_conversion::Pools::::insert(new_pool_id, pool_info); - pallet_asset_conversion::Pools::::remove(old_pool_id); - } - - T::DbWeight::get().reads_writes(reads, writes) - } - } -} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_asset_conversion.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_asset_conversion.rs index e48f2e2ef72..7a5aed3d7c6 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_asset_conversion.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_asset_conversion.rs @@ -16,27 +16,23 @@ //! Autogenerated weights for `pallet_asset_conversion` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-10-30, STEPS: `20`, REPEAT: `2`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-ynta1nyy-project-238-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-westend-dev")`, DB CACHE: 1024 +//! HOSTNAME: `cob`, CPU: `` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("asset-hub-westend-dev")`, DB CACHE: 1024 // Executed Command: -// ./target/production/polkadot-parachain +// ./target/debug/polkadot-parachain // benchmark // pallet // --chain=asset-hub-westend-dev -// --wasm-execution=compiled -// --pallet=pallet_asset_conversion -// --no-storage-info -// --no-median-slopes -// --no-min-squares +// --steps=20 +// --repeat=2 +// --pallet=pallet-asset-conversion // --extrinsic=* -// --steps=50 -// --repeat=20 -// --json -// --header=./file_header.txt -// --output=./parachains/runtimes/assets/asset-hub-westend/src/weights/ +// --wasm-execution=compiled +// --heap-pages=4096 +// --output=./cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/pallet_asset_conversion.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -51,9 +47,7 @@ pub struct WeightInfo(PhantomData); impl pallet_asset_conversion::WeightInfo for WeightInfo { /// Storage: `AssetConversion::Pools` (r:1 w:1) /// Proof: `AssetConversion::Pools` (`max_values`: None, `max_size`: Some(1224), added: 3699, mode: `MaxEncodedLen`) - /// Storage: UNKNOWN KEY `0x76a2c49709deec21d9c05f96c1f47351` (r:1 w:0) - /// Proof: UNKNOWN KEY `0x76a2c49709deec21d9c05f96c1f47351` (r:1 w:0) - /// Storage: `System::Account` (r:2 w:1) + /// Storage: `System::Account` (r:1 w:1) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// Storage: `ForeignAssets::Account` (r:1 w:1) /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) @@ -67,22 +61,22 @@ impl pallet_asset_conversion::WeightInfo for WeightInfo /// Proof: `PoolAssets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) fn create_pool() -> Weight { // Proof Size summary in bytes: - // Measured: `480` - // Estimated: `6196` - // Minimum execution time: 90_011_000 picoseconds. - Weight::from_parts(92_372_000, 0) - .saturating_add(Weight::from_parts(0, 6196)) - .saturating_add(T::DbWeight::get().reads(9)) + // Measured: `408` + // Estimated: `4689` + // Minimum execution time: 922_000_000 picoseconds. + Weight::from_parts(1_102_000_000, 0) + .saturating_add(Weight::from_parts(0, 4689)) + .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(7)) } /// Storage: `AssetConversion::Pools` (r:1 w:0) /// Proof: `AssetConversion::Pools` (`max_values`: None, `max_size`: Some(1224), added: 3699, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// Storage: `ForeignAssets::Asset` (r:1 w:1) /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) /// Storage: `ForeignAssets::Account` (r:2 w:2) /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// Storage: `PoolAssets::Asset` (r:1 w:1) /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) /// Storage: `PoolAssets::Account` (r:2 w:2) @@ -91,34 +85,32 @@ impl pallet_asset_conversion::WeightInfo for WeightInfo // Proof Size summary in bytes: // Measured: `1117` // Estimated: `7404` - // Minimum execution time: 153_484_000 picoseconds. - Weight::from_parts(155_465_000, 0) + // Minimum execution time: 1_597_000_000 picoseconds. + Weight::from_parts(1_655_000_000, 0) .saturating_add(Weight::from_parts(0, 7404)) .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(7)) } /// Storage: `AssetConversion::Pools` (r:1 w:0) /// Proof: `AssetConversion::Pools` (`max_values`: None, `max_size`: Some(1224), added: 3699, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// Storage: `ForeignAssets::Asset` (r:1 w:1) /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) /// Storage: `ForeignAssets::Account` (r:2 w:2) /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// Storage: `PoolAssets::Asset` (r:1 w:1) /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: UNKNOWN KEY `0x2433d831722b1f4aeb1666953f1c0e77` (r:1 w:0) - /// Proof: UNKNOWN KEY `0x2433d831722b1f4aeb1666953f1c0e77` (r:1 w:0) /// Storage: `PoolAssets::Account` (r:1 w:1) /// Proof: `PoolAssets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) fn remove_liquidity() -> Weight { // Proof Size summary in bytes: // Measured: `1106` // Estimated: `7404` - // Minimum execution time: 141_326_000 picoseconds. - Weight::from_parts(143_882_000, 0) + // Minimum execution time: 1_500_000_000 picoseconds. + Weight::from_parts(1_633_000_000, 0) .saturating_add(Weight::from_parts(0, 7404)) - .saturating_add(T::DbWeight::get().reads(8)) + .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(6)) } /// Storage: `ForeignAssets::Asset` (r:2 w:2) @@ -127,15 +119,19 @@ impl pallet_asset_conversion::WeightInfo for WeightInfo /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) /// Storage: `System::Account` (r:2 w:2) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn swap_exact_tokens_for_tokens() -> Weight { + /// The range of component `n` is `[2, 3]`. + fn swap_exact_tokens_for_tokens(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1148` - // Estimated: `13818` - // Minimum execution time: 168_556_000 picoseconds. - Weight::from_parts(170_313_000, 0) - .saturating_add(Weight::from_parts(0, 13818)) - .saturating_add(T::DbWeight::get().reads(8)) - .saturating_add(T::DbWeight::get().writes(8)) + // Measured: `0 + n * (557 ±0)` + // Estimated: `7404 + n * (393 ±92)` + // Minimum execution time: 930_000_000 picoseconds. + Weight::from_parts(960_000_000, 0) + .saturating_add(Weight::from_parts(0, 7404)) + // Standard Error: 17_993_720 + .saturating_add(Weight::from_parts(41_959_183, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(4)) + .saturating_add(Weight::from_parts(0, 393).saturating_mul(n.into())) } /// Storage: `System::Account` (r:2 w:2) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) @@ -143,14 +139,18 @@ impl pallet_asset_conversion::WeightInfo for WeightInfo /// Proof: `ForeignAssets::Asset` (`max_values`: None, `max_size`: Some(808), added: 3283, mode: `MaxEncodedLen`) /// Storage: `ForeignAssets::Account` (r:4 w:4) /// Proof: `ForeignAssets::Account` (`max_values`: None, `max_size`: Some(732), added: 3207, mode: `MaxEncodedLen`) - fn swap_tokens_for_exact_tokens() -> Weight { + /// The range of component `n` is `[2, 3]`. + fn swap_tokens_for_exact_tokens(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1148` - // Estimated: `13818` - // Minimum execution time: 167_704_000 picoseconds. - Weight::from_parts(170_034_000, 0) - .saturating_add(Weight::from_parts(0, 13818)) - .saturating_add(T::DbWeight::get().reads(8)) - .saturating_add(T::DbWeight::get().writes(8)) + // Measured: `0 + n * (557 ±0)` + // Estimated: `7404 + n * (393 ±92)` + // Minimum execution time: 940_000_000 picoseconds. + Weight::from_parts(956_000_000, 0) + .saturating_add(Weight::from_parts(0, 7404)) + // Standard Error: 15_746_647 + .saturating_add(Weight::from_parts(39_193_877, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(4)) + .saturating_add(Weight::from_parts(0, 393).saturating_mul(n.into())) } } diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs index 2b5edb02b4a..b257f263d48 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs @@ -56,9 +56,6 @@ use xcm_builder::{ }; use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; -#[cfg(feature = "runtime-benchmarks")] -use {cumulus_primitives_core::ParaId, sp_core::Get}; - parameter_types! { pub const WestendLocation: MultiLocation = MultiLocation::parent(); pub const RelayNetwork: Option = Some(NetworkId::Westend); @@ -66,8 +63,8 @@ parameter_types! { pub UniversalLocation: InteriorMultiLocation = X2(GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(ParachainInfo::parachain_id().into())); pub UniversalLocationNetworkId: NetworkId = UniversalLocation::get().global_consensus().unwrap(); - pub TrustBackedAssetsPalletLocation: MultiLocation = - PalletInstance(::index() as u8).into(); + pub AssetsPalletIndex: u32 = ::index() as u32; + pub TrustBackedAssetsPalletLocation: MultiLocation = PalletInstance(AssetsPalletIndex::get() as u8).into(); pub ForeignAssetsPalletLocation: MultiLocation = PalletInstance(::index() as u8).into(); pub PoolAssetsPalletLocation: MultiLocation = @@ -694,33 +691,6 @@ impl pallet_assets::BenchmarkHelper for XcmBenchmarkHelper { } } -#[cfg(feature = "runtime-benchmarks")] -pub struct BenchmarkMultiLocationConverter { - _phantom: sp_std::marker::PhantomData, -} - -#[cfg(feature = "runtime-benchmarks")] -impl pallet_asset_conversion::BenchmarkHelper - for BenchmarkMultiLocationConverter -where - SelfParaId: Get, -{ - fn asset_id(asset_id: u32) -> MultiLocation { - MultiLocation { - parents: 1, - interior: X3( - Parachain(SelfParaId::get().into()), - PalletInstance(::index() as u8), - GeneralIndex(asset_id.into()), - ), - } - } - - fn multiasset_id(asset_id: u32) -> MultiLocation { - Self::asset_id(asset_id) - } -} - /// All configuration related to bridging pub mod bridging { use super::*; diff --git a/cumulus/parachains/runtimes/assets/common/src/benchmarks.rs b/cumulus/parachains/runtimes/assets/common/src/benchmarks.rs new file mode 100644 index 00000000000..344cb5ca336 --- /dev/null +++ b/cumulus/parachains/runtimes/assets/common/src/benchmarks.rs @@ -0,0 +1,44 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use cumulus_primitives_core::ParaId; +use sp_runtime::traits::Get; +use sp_std::marker::PhantomData; +use xcm::latest::prelude::*; + +/// Creates asset pairs for liquidity pools with `Target` always being the first asset. +pub struct AssetPairFactory( + PhantomData<(Target, SelfParaId, PalletId)>, +); +impl, SelfParaId: Get, PalletId: Get> + pallet_asset_conversion::BenchmarkHelper + for AssetPairFactory +{ + fn create_pair(seed1: u32, seed2: u32) -> (MultiLocation, MultiLocation) { + let with_id = MultiLocation::new( + 1, + X3( + Parachain(SelfParaId::get().into()), + PalletInstance(PalletId::get() as u8), + GeneralIndex(seed2.into()), + ), + ); + if seed1 % 2 == 0 { + (with_id, Target::get()) + } else { + (Target::get(), with_id) + } + } +} diff --git a/cumulus/parachains/runtimes/assets/common/src/lib.rs b/cumulus/parachains/runtimes/assets/common/src/lib.rs index f45c3289aab..15327f51b2a 100644 --- a/cumulus/parachains/runtimes/assets/common/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/common/src/lib.rs @@ -15,6 +15,8 @@ #![cfg_attr(not(feature = "std"), no_std)] +#[cfg(feature = "runtime-benchmarks")] +pub mod benchmarks; pub mod foreign_creators; pub mod fungible_conversion; pub mod local_and_foreign_assets; diff --git a/cumulus/parachains/runtimes/assets/common/src/local_and_foreign_assets.rs b/cumulus/parachains/runtimes/assets/common/src/local_and_foreign_assets.rs index 8aedd04e1cd..7dd497797ea 100644 --- a/cumulus/parachains/runtimes/assets/common/src/local_and_foreign_assets.rs +++ b/cumulus/parachains/runtimes/assets/common/src/local_and_foreign_assets.rs @@ -13,48 +13,42 @@ // See the License for the specific language governing permissions and // limitations under the License. -use frame_support::traits::{ - fungibles::{Balanced, Create, HandleImbalanceDrop, Inspect, Mutate, Unbalanced}, - tokens::{ - DepositConsequence, Fortitude, Precision, Preservation, Provenance, WithdrawConsequence, - }, - AccountTouch, Contains, ContainsPair, Get, PalletInfoAccess, +use frame_support::traits::Get; +use sp_runtime::{ + traits::{Convert, MaybeEquivalence}, + Either, + Either::{Left, Right}, }; -use pallet_asset_conversion::{MultiAssetIdConversionResult, MultiAssetIdConverter}; -use parachains_common::AccountId; -use sp_runtime::{traits::MaybeEquivalence, DispatchError, DispatchResult}; use sp_std::marker::PhantomData; use xcm::latest::MultiLocation; -pub struct MultiLocationConverter, MultiLocationMatcher> { - _phantom: PhantomData<(NativeAssetLocation, MultiLocationMatcher)>, +/// Converts a given [`MultiLocation`] to [`Either::Left`] when equal to `Target`, or +/// [`Either::Right`] otherwise. +/// +/// Suitable for use as a `Criterion` with [`frame_support::traits::tokens::fungible::UnionOf`]. +pub struct TargetFromLeft(PhantomData); +impl> Convert> + for TargetFromLeft +{ + fn convert(l: MultiLocation) -> Either<(), MultiLocation> { + Target::get().eq(&l).then(|| Left(())).map_or(Right(l), |n| n) + } } -impl MultiAssetIdConverter - for MultiLocationConverter +/// Converts a given [`MultiLocation`] to [`Either::Left`] based on the `Equivalence` criteria. +/// Returns [`Either::Right`] if not equivalent. +/// +/// Suitable for use as a `Criterion` with [`frame_support::traits::tokens::fungibles::UnionOf`]. +pub struct LocalFromLeft(PhantomData<(Equivalence, AssetId)>); +impl Convert> + for LocalFromLeft where - NativeAssetLocation: Get, - MultiLocationMatcher: Contains, + Equivalence: MaybeEquivalence, { - fn get_native() -> MultiLocation { - NativeAssetLocation::get() - } - - fn is_native(asset_id: &MultiLocation) -> bool { - *asset_id == Self::get_native() - } - - fn try_convert( - asset_id: &MultiLocation, - ) -> MultiAssetIdConversionResult { - if Self::is_native(asset_id) { - return MultiAssetIdConversionResult::Native - } - - if MultiLocationMatcher::contains(asset_id) { - MultiAssetIdConversionResult::Converted(*asset_id) - } else { - MultiAssetIdConversionResult::Unsupported(*asset_id) + fn convert(l: MultiLocation) -> Either { + match Equivalence::convert(&l) { + Some(id) => Left(id), + None => Right(l), } } } @@ -63,415 +57,3 @@ pub trait MatchesLocalAndForeignAssetsMultiLocation { fn is_local(location: &MultiLocation) -> bool; fn is_foreign(location: &MultiLocation) -> bool; } - -pub struct LocalAndForeignAssets { - _phantom: PhantomData<(Assets, LocalAssetIdConverter, ForeignAssets)>, -} - -impl Unbalanced - for LocalAndForeignAssets -where - Assets: Inspect - + Unbalanced - + Balanced - + PalletInfoAccess, - LocalAssetIdConverter: MaybeEquivalence, - ForeignAssets: Inspect - + Unbalanced - + Balanced, -{ - fn handle_dust(dust: frame_support::traits::fungibles::Dust) { - let credit = dust.into_credit(); - - if let Some(asset) = LocalAssetIdConverter::convert(&credit.asset()) { - Assets::handle_raw_dust(asset, credit.peek()); - } else { - ForeignAssets::handle_raw_dust(credit.asset(), credit.peek()); - } - - // As we have already handled the dust, we must stop credit's drop from happening: - sp_std::mem::forget(credit); - } - - fn write_balance( - asset: >::AssetId, - who: &AccountId, - amount: >::Balance, - ) -> Result>::Balance>, DispatchError> { - if let Some(asset) = LocalAssetIdConverter::convert(&asset) { - Assets::write_balance(asset, who, amount) - } else { - ForeignAssets::write_balance(asset, who, amount) - } - } - - /// Set the total issuance of `asset` to `amount`. - fn set_total_issuance(asset: Self::AssetId, amount: Self::Balance) { - if let Some(asset) = LocalAssetIdConverter::convert(&asset) { - Assets::set_total_issuance(asset, amount) - } else { - ForeignAssets::set_total_issuance(asset, amount) - } - } - - fn decrease_balance( - asset: Self::AssetId, - who: &AccountId, - amount: Self::Balance, - precision: Precision, - preservation: Preservation, - force: Fortitude, - ) -> Result { - if let Some(asset) = LocalAssetIdConverter::convert(&asset) { - Assets::decrease_balance(asset, who, amount, precision, preservation, force) - } else { - ForeignAssets::decrease_balance(asset, who, amount, precision, preservation, force) - } - } - - fn increase_balance( - asset: Self::AssetId, - who: &AccountId, - amount: Self::Balance, - precision: Precision, - ) -> Result { - if let Some(asset) = LocalAssetIdConverter::convert(&asset) { - Assets::increase_balance(asset, who, amount, precision) - } else { - ForeignAssets::increase_balance(asset, who, amount, precision) - } - } -} - -impl Inspect - for LocalAndForeignAssets -where - Assets: Inspect, - LocalAssetIdConverter: MaybeEquivalence, - ForeignAssets: Inspect, -{ - type AssetId = MultiLocation; - type Balance = u128; - - /// The total amount of issuance in the system. - fn total_issuance(asset: Self::AssetId) -> Self::Balance { - if let Some(asset) = LocalAssetIdConverter::convert(&asset) { - Assets::total_issuance(asset) - } else { - ForeignAssets::total_issuance(asset) - } - } - - /// The minimum balance any single account may have. - fn minimum_balance(asset: Self::AssetId) -> Self::Balance { - if let Some(asset) = LocalAssetIdConverter::convert(&asset) { - Assets::minimum_balance(asset) - } else { - ForeignAssets::minimum_balance(asset) - } - } - - fn total_balance( - asset: >::AssetId, - account: &AccountId, - ) -> >::Balance { - if let Some(asset) = LocalAssetIdConverter::convert(&asset) { - Assets::total_balance(asset, account) - } else { - ForeignAssets::total_balance(asset, account) - } - } - - /// Get the `asset` balance of `who`. - fn balance(asset: Self::AssetId, who: &AccountId) -> Self::Balance { - if let Some(asset) = LocalAssetIdConverter::convert(&asset) { - Assets::balance(asset, who) - } else { - ForeignAssets::balance(asset, who) - } - } - - /// Get the maximum amount of `asset` that `who` can withdraw/transfer successfully. - fn reducible_balance( - asset: Self::AssetId, - who: &AccountId, - presevation: Preservation, - fortitude: Fortitude, - ) -> Self::Balance { - if let Some(asset) = LocalAssetIdConverter::convert(&asset) { - Assets::reducible_balance(asset, who, presevation, fortitude) - } else { - ForeignAssets::reducible_balance(asset, who, presevation, fortitude) - } - } - - /// Returns `true` if the `asset` balance of `who` may be increased by `amount`. - /// - /// - `asset`: The asset that should be deposited. - /// - `who`: The account of which the balance should be increased by `amount`. - /// - `amount`: How much should the balance be increased? - /// - `mint`: Will `amount` be minted to deposit it into `account`? - fn can_deposit( - asset: Self::AssetId, - who: &AccountId, - amount: Self::Balance, - mint: Provenance, - ) -> DepositConsequence { - if let Some(asset) = LocalAssetIdConverter::convert(&asset) { - Assets::can_deposit(asset, who, amount, mint) - } else { - ForeignAssets::can_deposit(asset, who, amount, mint) - } - } - - /// Returns `Failed` if the `asset` balance of `who` may not be decreased by `amount`, otherwise - /// the consequence. - fn can_withdraw( - asset: Self::AssetId, - who: &AccountId, - amount: Self::Balance, - ) -> WithdrawConsequence { - if let Some(asset) = LocalAssetIdConverter::convert(&asset) { - Assets::can_withdraw(asset, who, amount) - } else { - ForeignAssets::can_withdraw(asset, who, amount) - } - } - - /// Returns `true` if an `asset` exists. - fn asset_exists(asset: Self::AssetId) -> bool { - if let Some(asset) = LocalAssetIdConverter::convert(&asset) { - Assets::asset_exists(asset) - } else { - ForeignAssets::asset_exists(asset) - } - } -} - -impl Mutate - for LocalAndForeignAssets -where - Assets: Mutate - + Inspect - + Balanced - + PalletInfoAccess, - LocalAssetIdConverter: MaybeEquivalence, - ForeignAssets: Mutate - + Inspect - + Balanced, -{ - /// Transfer funds from one account into another. - fn transfer( - asset: MultiLocation, - source: &AccountId, - dest: &AccountId, - amount: Self::Balance, - keep_alive: Preservation, - ) -> Result { - if let Some(asset_id) = LocalAssetIdConverter::convert(&asset) { - Assets::transfer(asset_id, source, dest, amount, keep_alive) - } else { - ForeignAssets::transfer(asset, source, dest, amount, keep_alive) - } - } -} - -impl Create - for LocalAndForeignAssets -where - Assets: Create + Inspect, - LocalAssetIdConverter: MaybeEquivalence, - ForeignAssets: Create + Inspect, -{ - /// Create a new fungible asset. - fn create( - asset_id: Self::AssetId, - admin: AccountId, - is_sufficient: bool, - min_balance: Self::Balance, - ) -> DispatchResult { - if let Some(asset_id) = LocalAssetIdConverter::convert(&asset_id) { - Assets::create(asset_id, admin, is_sufficient, min_balance) - } else { - ForeignAssets::create(asset_id, admin, is_sufficient, min_balance) - } - } -} - -impl AccountTouch - for LocalAndForeignAssets -where - Assets: AccountTouch, - LocalAssetIdConverter: MaybeEquivalence, - ForeignAssets: AccountTouch, -{ - type Balance = u128; - - fn deposit_required( - asset_id: MultiLocation, - ) -> >::Balance { - if let Some(asset_id) = LocalAssetIdConverter::convert(&asset_id) { - Assets::deposit_required(asset_id) - } else { - ForeignAssets::deposit_required(asset_id) - } - } - - fn should_touch(asset_id: MultiLocation, who: &AccountId) -> bool { - if let Some(asset_id) = LocalAssetIdConverter::convert(&asset_id) { - Assets::should_touch(asset_id, who) - } else { - ForeignAssets::should_touch(asset_id, who) - } - } - - fn touch( - asset_id: MultiLocation, - who: &AccountId, - depositor: &AccountId, - ) -> Result<(), DispatchError> { - if let Some(asset_id) = LocalAssetIdConverter::convert(&asset_id) { - Assets::touch(asset_id, who, depositor) - } else { - ForeignAssets::touch(asset_id, who, depositor) - } - } -} - -/// Implements [`ContainsPair`] trait for a pair of asset and account IDs. -impl ContainsPair - for LocalAndForeignAssets -where - Assets: PalletInfoAccess + ContainsPair, - LocalAssetIdConverter: MaybeEquivalence, - ForeignAssets: ContainsPair, -{ - /// Check if an account with the given asset ID and account address exists. - fn contains(asset_id: &MultiLocation, who: &AccountId) -> bool { - if let Some(asset_id) = LocalAssetIdConverter::convert(asset_id) { - Assets::contains(&asset_id, &who) - } else { - ForeignAssets::contains(&asset_id, &who) - } - } -} - -impl Balanced - for LocalAndForeignAssets -where - Assets: - Balanced + Inspect + PalletInfoAccess, - LocalAssetIdConverter: MaybeEquivalence, - ForeignAssets: - Balanced + Inspect, -{ - type OnDropDebt = DebtDropIndirection; - type OnDropCredit = CreditDropIndirection; -} - -pub struct DebtDropIndirection { - _phantom: PhantomData>, -} - -impl HandleImbalanceDrop - for DebtDropIndirection -where - Assets: Balanced + Inspect, - LocalAssetIdConverter: MaybeEquivalence, - ForeignAssets: - Balanced + Inspect, -{ - fn handle(asset: MultiLocation, amount: u128) { - if let Some(asset_id) = LocalAssetIdConverter::convert(&asset) { - Assets::OnDropDebt::handle(asset_id, amount); - } else { - ForeignAssets::OnDropDebt::handle(asset, amount); - } - } -} - -pub struct CreditDropIndirection { - _phantom: PhantomData>, -} - -impl HandleImbalanceDrop - for CreditDropIndirection -where - Assets: Balanced + Inspect, - LocalAssetIdConverter: MaybeEquivalence, - ForeignAssets: - Balanced + Inspect, -{ - fn handle(asset: MultiLocation, amount: u128) { - if let Some(asset_id) = LocalAssetIdConverter::convert(&asset) { - Assets::OnDropCredit::handle(asset_id, amount); - } else { - ForeignAssets::OnDropCredit::handle(asset, amount); - } - } -} - -#[cfg(test)] -mod tests { - use crate::{ - local_and_foreign_assets::MultiLocationConverter, AssetIdForPoolAssetsConvert, - AssetIdForTrustBackedAssetsConvert, - }; - use frame_support::traits::EverythingBut; - use pallet_asset_conversion::{MultiAssetIdConversionResult, MultiAssetIdConverter}; - use sp_runtime::traits::MaybeEquivalence; - use xcm::latest::prelude::*; - use xcm_builder::StartsWith; - - #[test] - fn test_multi_location_converter_works() { - frame_support::parameter_types! { - pub const WestendLocation: MultiLocation = MultiLocation::parent(); - pub TrustBackedAssetsPalletLocation: MultiLocation = PalletInstance(50_u8).into(); - pub PoolAssetsPalletLocation: MultiLocation = PalletInstance(55_u8).into(); - } - - type C = MultiLocationConverter< - WestendLocation, - EverythingBut>, - >; - - let native_asset = WestendLocation::get(); - let local_asset = - AssetIdForTrustBackedAssetsConvert::::convert_back( - &123, - ) - .unwrap(); - let pool_asset = - AssetIdForPoolAssetsConvert::::convert_back(&456).unwrap(); - let foreign_asset1 = MultiLocation { parents: 1, interior: X1(Parachain(2222)) }; - let foreign_asset2 = MultiLocation { - parents: 2, - interior: X2(GlobalConsensus(ByGenesis([1; 32])), Parachain(2222)), - }; - - assert!(C::is_native(&native_asset)); - assert!(!C::is_native(&local_asset)); - assert!(!C::is_native(&pool_asset)); - assert!(!C::is_native(&foreign_asset1)); - assert!(!C::is_native(&foreign_asset2)); - - assert_eq!(C::try_convert(&native_asset), MultiAssetIdConversionResult::Native); - assert_eq!( - C::try_convert(&local_asset), - MultiAssetIdConversionResult::Converted(local_asset) - ); - assert_eq!( - C::try_convert(&pool_asset), - MultiAssetIdConversionResult::Unsupported(pool_asset) - ); - assert_eq!( - C::try_convert(&foreign_asset1), - MultiAssetIdConversionResult::Converted(foreign_asset1) - ); - assert_eq!( - C::try_convert(&foreign_asset2), - MultiAssetIdConversionResult::Converted(foreign_asset2) - ); - } -} diff --git a/prdoc/pr_2031.prdoc b/prdoc/pr_2031.prdoc new file mode 100644 index 00000000000..fc2695df52e --- /dev/null +++ b/prdoc/pr_2031.prdoc @@ -0,0 +1,29 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "pallet-asset-conversion: Decoupling Native Currency Dependancy" + +doc: + - audience: Runtime Dev + description: | + Decoupling Pallet from the Concept of Native Currency + + Currently, the pallet used to intrinsically linked with the concept of native currency, requiring users to provide implementations of the `fungible::*` and `fungibles::*` traits to interact with native and non native assets. This incapsulates some non-related to the pallet complexity and makes it less adaptable in contexts where the native currency concept is absent. + + With this PR, the dependence on `fungible::*` for liquidity-supplying assets has been removed. Instead, the native and non-native currencies' handling is now overseen by a single type that implements the `fungibles::*` traits. To simplify this integration, types have been introduced to facilitate the creation of a union between `fungible::*` and `fungibles::*` implementations, producing a unified `fungibles::*` type. + + One of the reasons driving these changes is the ambition to create a more user-friendly API for the `SwapCredit` implementation. Given that it interacts with two distinct credit types from `fungible` and `fungibles`, a unified type was introduced. Clients now manage potential conversion failures for those credit types. In certain contexts, it's vital to guarantee that operations are fail-safe, like in this impl - [PR](https://github.com/paritytech/polkadot-sdk/pull/1845), place in [code](https://github.com/paritytech/polkadot-sdk/blob/20b85a5fada8f55c98ba831964f5866ffeadf4da/cumulus/primitives/utility/src/lib.rs#L429). + + Additional Updates: + - abstracted the pool ID and its account derivation logic via trait bounds, along with common implementation offerings; + - removed `inc_providers` on a pool creation for the pool account; + - benchmarks: + -- swap complexity is N, not const; + -- removed `From + Into` bound from `T::Balance`; + -- removed swap/liquidity/.. amount constants, resolve them dynamically based on pallet configuration; + -- migrated to v2 API; + - `OnUnbalanced` handler for the pool creation fee, replacing direct transfers to a specified account ID; + - renamed `MultiAssetId` to `AssetKind` aligning with naming across frame crates; + +crates: + - name: pallet-asset-conversion diff --git a/substrate/bin/node/runtime/src/lib.rs b/substrate/bin/node/runtime/src/lib.rs index 7c763960490..849bc7ca6fb 100644 --- a/substrate/bin/node/runtime/src/lib.rs +++ b/substrate/bin/node/runtime/src/lib.rs @@ -36,8 +36,13 @@ use frame_support::{ pallet_prelude::Get, parameter_types, traits::{ - fungible::{Balanced, Credit, HoldConsideration, ItemOf}, - tokens::{nonfungibles_v2::Inspect, pay::PayAssetFromAccount, GetSalary, PayFromAccount}, + fungible::{ + Balanced, Credit, HoldConsideration, ItemOf, NativeFromLeft, NativeOrWithId, UnionOf, + }, + tokens::{ + imbalance::ResolveAssetTo, nonfungibles_v2::Inspect, pay::PayAssetFromAccount, + GetSalary, PayFromAccount, + }, AsEnsureOriginWithArg, ConstBool, ConstU128, ConstU16, ConstU32, Contains, Currency, EitherOfDiverse, EqualPrivilegeOnly, Imbalance, InsideBoth, InstanceFilter, KeyOwnerProofSystem, LinearStoragePrice, LockIdentifier, Nothing, OnUnbalanced, @@ -57,7 +62,7 @@ use frame_system::{ }; pub use node_primitives::{AccountId, Signature}; use node_primitives::{AccountIndex, Balance, BlockNumber, Hash, Moment, Nonce}; -use pallet_asset_conversion::{NativeOrAssetId, NativeOrAssetIdConverter}; +use pallet_asset_conversion::{Ascending, Chain, WithFirstAsset}; use pallet_broker::{CoreAssignment, CoreIndex, CoretimeInterface, PartsOf57600}; use pallet_election_provider_multi_phase::{GeometricDepositBase, SolutionAccuracyOf}; use pallet_identity::legacy::IdentityInfo; @@ -563,8 +568,11 @@ impl pallet_asset_tx_payment::Config for Runtime { impl pallet_asset_conversion_tx_payment::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Fungibles = Assets; - type OnChargeAssetTransaction = - pallet_asset_conversion_tx_payment::AssetConversionAdapter; + type OnChargeAssetTransaction = pallet_asset_conversion_tx_payment::AssetConversionAdapter< + Balances, + AssetConversion, + Native, + >; } impl pallet_skip_feeless_payment::Config for Runtime { @@ -1644,32 +1652,34 @@ impl pallet_assets::Config for Runtime { parameter_types! { pub const AssetConversionPalletId: PalletId = PalletId(*b"py/ascon"); - pub AllowMultiAssetPools: bool = true; pub const PoolSetupFee: Balance = 1 * DOLLARS; // should be more or equal to the existential deposit pub const MintMinLiquidity: Balance = 100; // 100 is good enough when the main currency has 10-12 decimals. - pub const LiquidityWithdrawalFee: Permill = Permill::from_percent(0); // should be non-zero if AllowMultiAssetPools is true, otherwise can be zero. + pub const LiquidityWithdrawalFee: Permill = Permill::from_percent(0); + pub const Native: NativeOrWithId = NativeOrWithId::Native; } impl pallet_asset_conversion::Config for Runtime { type RuntimeEvent = RuntimeEvent; - type Currency = Balances; - type HigherPrecisionBalance = sp_core::U256; - type Assets = Assets; type Balance = u128; - type PoolAssets = PoolAssets; - type AssetId = >::AssetId; - type MultiAssetId = NativeOrAssetId; + type HigherPrecisionBalance = sp_core::U256; + type AssetKind = NativeOrWithId; + type Assets = UnionOf, AccountId>; + type PoolId = (Self::AssetKind, Self::AssetKind); + type PoolLocator = Chain< + WithFirstAsset>, + Ascending>, + >; type PoolAssetId = >::AssetId; + type PoolAssets = PoolAssets; + type PoolSetupFee = PoolSetupFee; + type PoolSetupFeeAsset = Native; + type PoolSetupFeeTarget = ResolveAssetTo; type PalletId = AssetConversionPalletId; type LPFee = ConstU32<3>; // means 0.3% - type PoolSetupFee = PoolSetupFee; - type PoolSetupFeeReceiver = AssetConversionOrigin; type LiquidityWithdrawalFee = LiquidityWithdrawalFee; type WeightInfo = pallet_asset_conversion::weights::SubstrateWeight; - type AllowMultiAssetPools = AllowMultiAssetPools; type MaxSwapPathLength = ConstU32<4>; type MintMinLiquidity = MintMinLiquidity; - type MultiAssetIdConverter = NativeOrAssetIdConverter; #[cfg(feature = "runtime-benchmarks")] type BenchmarkHelper = (); } @@ -2579,19 +2589,19 @@ impl_runtime_apis! { impl pallet_asset_conversion::AssetConversionApi< Block, Balance, - NativeOrAssetId + NativeOrWithId > for Runtime { - fn quote_price_exact_tokens_for_tokens(asset1: NativeOrAssetId, asset2: NativeOrAssetId, amount: Balance, include_fee: bool) -> Option { + fn quote_price_exact_tokens_for_tokens(asset1: NativeOrWithId, asset2: NativeOrWithId, amount: Balance, include_fee: bool) -> Option { AssetConversion::quote_price_exact_tokens_for_tokens(asset1, asset2, amount, include_fee) } - fn quote_price_tokens_for_exact_tokens(asset1: NativeOrAssetId, asset2: NativeOrAssetId, amount: Balance, include_fee: bool) -> Option { + fn quote_price_tokens_for_exact_tokens(asset1: NativeOrWithId, asset2: NativeOrWithId, amount: Balance, include_fee: bool) -> Option { AssetConversion::quote_price_tokens_for_exact_tokens(asset1, asset2, amount, include_fee) } - fn get_reserves(asset1: NativeOrAssetId, asset2: NativeOrAssetId) -> Option<(Balance, Balance)> { - AssetConversion::get_reserves(&asset1, &asset2).ok() + fn get_reserves(asset1: NativeOrWithId, asset2: NativeOrWithId) -> Option<(Balance, Balance)> { + AssetConversion::get_reserves(asset1, asset2).ok() } } diff --git a/substrate/frame/asset-conversion/src/benchmarking.rs b/substrate/frame/asset-conversion/src/benchmarking.rs index 628953d0558..f0e02c802ad 100644 --- a/substrate/frame/asset-conversion/src/benchmarking.rs +++ b/substrate/frame/asset-conversion/src/benchmarking.rs @@ -18,73 +18,142 @@ //! Asset Conversion pallet benchmarking. use super::*; -use frame_benchmarking::{benchmarks, whitelisted_caller}; +use crate::Pallet as AssetConversion; +use frame_benchmarking::{v2::*, whitelisted_caller}; use frame_support::{ assert_ok, traits::{ - fungible::{Inspect as InspectFungible, Mutate as MutateFungible, Unbalanced}, + fungible::NativeOrWithId, fungibles::{Create, Inspect, Mutate}, }, }; use frame_system::RawOrigin as SystemOrigin; use sp_core::Get; -use sp_runtime::traits::{Bounded, StaticLookup}; -use sp_std::{ops::Div, prelude::*}; +use sp_std::{marker::PhantomData, prelude::*}; -use crate::Pallet as AssetConversion; +/// Benchmark Helper +pub trait BenchmarkHelper { + /// Returns a valid assets pair for the pool creation. + /// + /// When a specific asset, such as the native asset, is required in every pool, it should be + /// returned for each odd-numbered seed. + fn create_pair(seed1: u32, seed2: u32) -> (AssetKind, AssetKind); +} + +impl BenchmarkHelper for () +where + AssetKind: From, +{ + fn create_pair(seed1: u32, seed2: u32) -> (AssetKind, AssetKind) { + (seed1.into(), seed2.into()) + } +} + +/// Factory for creating a valid asset pairs with [`NativeOrWithId::Native`] always leading in the +/// pair. +pub struct NativeOrWithIdFactory(PhantomData); +impl + Ord> BenchmarkHelper> + for NativeOrWithIdFactory +{ + fn create_pair(seed1: u32, seed2: u32) -> (NativeOrWithId, NativeOrWithId) { + if seed1 % 2 == 0 { + (NativeOrWithId::WithId(seed2.into()), NativeOrWithId::Native) + } else { + (NativeOrWithId::Native, NativeOrWithId::WithId(seed2.into())) + } + } +} -const INITIAL_ASSET_BALANCE: u128 = 1_000_000_000_000; -type AccountIdLookupOf = <::Lookup as StaticLookup>::Source; -type BalanceOf = - <::Currency as InspectFungible<::AccountId>>::Balance; +/// Provides a pair of amounts expected to serve as sufficient initial liquidity for a pool. +fn valid_liquidity_amount(ed1: T::Balance, ed2: T::Balance) -> (T::Balance, T::Balance) +where + T::Assets: Inspect, +{ + let l = + ed1.max(ed2) + T::MintMinLiquidity::get() + T::MintMinLiquidity::get() + T::Balance::one(); + (l, l) +} -fn get_lp_token_id() -> T::PoolAssetId +/// Create the `asset` and mint the `amount` for the `caller`. +fn create_asset(caller: &T::AccountId, asset: &T::AssetKind, amount: T::Balance) where - T::PoolAssetId: Into, + T::Assets: Create + Mutate, { - let next_id: u32 = AssetConversion::::get_next_pool_asset_id().into(); - (next_id - 1).into() + if !T::Assets::asset_exists(asset.clone()) { + assert_ok!(T::Assets::create(asset.clone(), caller.clone(), true, T::Balance::one())); + } + assert_ok!(T::Assets::mint_into( + asset.clone(), + &caller, + amount + T::Assets::minimum_balance(asset.clone()) + )); } -fn create_asset(asset: &T::MultiAssetId) -> (T::AccountId, AccountIdLookupOf) +/// Create the designated fee asset for pool creation. +fn create_fee_asset(caller: &T::AccountId) where - T::Balance: From, - T::Currency: Unbalanced, T::Assets: Create + Mutate, { - let caller: T::AccountId = whitelisted_caller(); - let caller_lookup = T::Lookup::unlookup(caller.clone()); - if let MultiAssetIdConversionResult::Converted(asset_id) = - T::MultiAssetIdConverter::try_convert(asset) - { - T::Currency::set_balance(&caller, BalanceOf::::max_value().div(1000u32.into())); - assert_ok!(T::Assets::create(asset_id.clone(), caller.clone(), true, 1.into())); - assert_ok!(T::Assets::mint_into(asset_id, &caller, INITIAL_ASSET_BALANCE.into())); + let fee_asset = T::PoolSetupFeeAsset::get(); + if !T::Assets::asset_exists(fee_asset.clone()) { + assert_ok!(T::Assets::create(fee_asset.clone(), caller.clone(), true, T::Balance::one())); } - (caller, caller_lookup) + assert_ok!(T::Assets::mint_into( + fee_asset.clone(), + &caller, + T::Assets::minimum_balance(fee_asset) + )); } +/// Mint the fee asset for the `caller` sufficient to cover the fee for creating a new pool. +fn mint_setup_fee_asset( + caller: &T::AccountId, + asset1: &T::AssetKind, + asset2: &T::AssetKind, + lp_token: &T::PoolAssetId, +) where + T::Assets: Create + Mutate, +{ + assert_ok!(T::Assets::mint_into( + T::PoolSetupFeeAsset::get(), + &caller, + T::PoolSetupFee::get() + + T::Assets::deposit_required(asset1.clone()) + + T::Assets::deposit_required(asset2.clone()) + + T::PoolAssets::deposit_required(lp_token.clone()) + )); +} + +/// Creates a pool for a given asset pair. +/// +/// This action mints the necessary amounts of the given assets for the `caller` to provide initial +/// liquidity. It returns the LP token ID along with a pair of amounts sufficient for the pool's +/// initial liquidity. fn create_asset_and_pool( - asset1: &T::MultiAssetId, - asset2: &T::MultiAssetId, -) -> (T::PoolAssetId, T::AccountId, AccountIdLookupOf) + caller: &T::AccountId, + asset1: &T::AssetKind, + asset2: &T::AssetKind, +) -> (T::PoolAssetId, T::Balance, T::Balance) where - T::Balance: From, - T::Currency: Unbalanced, T::Assets: Create + Mutate, - T::PoolAssetId: Into, { - let (_, _) = create_asset::(asset1); - let (caller, caller_lookup) = create_asset::(asset2); + let (liquidity1, liquidity2) = valid_liquidity_amount::( + T::Assets::minimum_balance(asset1.clone()), + T::Assets::minimum_balance(asset2.clone()), + ); + create_asset::(caller, asset1, liquidity1); + create_asset::(caller, asset2, liquidity2); + let lp_token = AssetConversion::::get_next_pool_asset_id(); + + mint_setup_fee_asset::(caller, asset1, asset2, &lp_token); assert_ok!(AssetConversion::::create_pool( SystemOrigin::Signed(caller.clone()).into(), Box::new(asset1.clone()), Box::new(asset2.clone()) )); - let lp_token = get_lp_token_id::(); - (lp_token, caller, caller_lookup) + (lp_token, liquidity1, liquidity2) } fn assert_last_event(generic_event: ::RuntimeEvent) { @@ -95,280 +164,198 @@ fn assert_last_event(generic_event: ::RuntimeEvent) { assert_eq!(event, &system_event); } -benchmarks! { - where_clause { - where - T::Currency: Unbalanced, - T::Balance: From + Into, - T::Assets: Create + Mutate, - T::PoolAssetId: Into, - } +#[benchmarks(where T::Assets: Create + Mutate, T::PoolAssetId: Into,)] +mod benchmarks { + use super::*; - create_pool { - let asset1 = T::MultiAssetIdConverter::get_native(); - let asset2 = T::BenchmarkHelper::multiasset_id(0); - let (caller, _) = create_asset::(&asset2); - }: _(SystemOrigin::Signed(caller.clone()), Box::new(asset1.clone()), Box::new(asset2.clone())) - verify { - let lp_token = get_lp_token_id::(); - let pool_id = (asset1.clone(), asset2.clone()); - assert_last_event::(Event::PoolCreated { - creator: caller.clone(), - pool_account: AssetConversion::::get_pool_account(&pool_id), - pool_id, - lp_token, - }.into()); - } + #[benchmark] + fn create_pool() { + let caller: T::AccountId = whitelisted_caller(); + let (asset1, asset2) = T::BenchmarkHelper::create_pair(0, 1); + create_asset::(&caller, &asset1, T::Assets::minimum_balance(asset1.clone())); + create_asset::(&caller, &asset2, T::Assets::minimum_balance(asset2.clone())); - add_liquidity { - let asset1 = T::MultiAssetIdConverter::get_native(); - let asset2 = T::BenchmarkHelper::multiasset_id(0); - let (lp_token, caller, _) = create_asset_and_pool::(&asset1, &asset2); - let ed: u128 = T::Currency::minimum_balance().into(); - let add_amount = 1000 + ed; - }: _(SystemOrigin::Signed(caller.clone()), Box::new(asset1.clone()), Box::new(asset2.clone()), add_amount.into(), 1000.into(), 0.into(), 0.into(), caller.clone()) - verify { - let pool_id = (asset1.clone(), asset2.clone()); - let lp_minted = AssetConversion::::calc_lp_amount_for_zero_supply(&add_amount.into(), &1000.into()).unwrap().into(); - assert_eq!( - T::PoolAssets::balance(lp_token, &caller), - lp_minted.into() - ); - assert_eq!( - T::Currency::balance(&AssetConversion::::get_pool_account(&pool_id)), - add_amount.into() - ); - assert_eq!( - T::Assets::balance(T::BenchmarkHelper::asset_id(0), &AssetConversion::::get_pool_account(&pool_id)), - 1000.into() + let lp_token = AssetConversion::::get_next_pool_asset_id(); + create_fee_asset::(&caller); + mint_setup_fee_asset::(&caller, &asset1, &asset2, &lp_token); + + #[extrinsic_call] + _(SystemOrigin::Signed(caller.clone()), Box::new(asset1.clone()), Box::new(asset2.clone())); + + let pool_id = T::PoolLocator::pool_id(&asset1, &asset2).unwrap(); + let pool_account = T::PoolLocator::address(&pool_id).unwrap(); + assert_last_event::( + Event::PoolCreated { creator: caller, pool_account, pool_id, lp_token }.into(), ); } - remove_liquidity { - let asset1 = T::MultiAssetIdConverter::get_native(); - let asset2 = T::BenchmarkHelper::multiasset_id(0); - let (lp_token, caller, _) = create_asset_and_pool::(&asset1, &asset2); - let ed: u128 = T::Currency::minimum_balance().into(); - let add_amount = 100 * ed; - let lp_minted = AssetConversion::::calc_lp_amount_for_zero_supply(&add_amount.into(), &1000.into()).unwrap().into(); - let remove_lp_amount = lp_minted.checked_div(10).unwrap(); + #[benchmark] + fn add_liquidity() { + let caller: T::AccountId = whitelisted_caller(); + let (asset1, asset2) = T::BenchmarkHelper::create_pair(0, 1); - AssetConversion::::add_liquidity( - SystemOrigin::Signed(caller.clone()).into(), + create_fee_asset::(&caller); + let (lp_token, liquidity1, liquidity2) = + create_asset_and_pool::(&caller, &asset1, &asset2); + + #[extrinsic_call] + _( + SystemOrigin::Signed(caller.clone()), Box::new(asset1.clone()), Box::new(asset2.clone()), - add_amount.into(), - 1000.into(), - 0.into(), - 0.into(), + liquidity1, + liquidity2, + T::Balance::one(), + T::Balance::zero(), caller.clone(), - )?; - let total_supply = >::total_issuance(lp_token.clone()); - }: _(SystemOrigin::Signed(caller.clone()), Box::new(asset1), Box::new(asset2), remove_lp_amount.into(), 0.into(), 0.into(), caller.clone()) - verify { - let new_total_supply = >::total_issuance(lp_token.clone()); - assert_eq!( - new_total_supply, - total_supply - remove_lp_amount.into() ); + + let pool_account = T::PoolLocator::pool_address(&asset1, &asset2).unwrap(); + let lp_minted = + AssetConversion::::calc_lp_amount_for_zero_supply(&liquidity1, &liquidity2).unwrap(); + assert_eq!(T::PoolAssets::balance(lp_token, &caller), lp_minted); + assert_eq!(T::Assets::balance(asset1, &pool_account), liquidity1); + assert_eq!(T::Assets::balance(asset2, &pool_account), liquidity2); } - swap_exact_tokens_for_tokens { - let native = T::MultiAssetIdConverter::get_native(); - let asset1 = T::BenchmarkHelper::multiasset_id(1); - let asset2 = T::BenchmarkHelper::multiasset_id(2); - let (_, caller, _) = create_asset_and_pool::(&native, &asset1); - let (_, _) = create_asset::(&asset2); - let ed: u128 = T::Currency::minimum_balance().into(); + #[benchmark] + fn remove_liquidity() { + let caller: T::AccountId = whitelisted_caller(); + let (asset1, asset2) = T::BenchmarkHelper::create_pair(0, 1); - AssetConversion::::add_liquidity( + create_fee_asset::(&caller); + let (lp_token, liquidity1, liquidity2) = + create_asset_and_pool::(&caller, &asset1, &asset2); + + let remove_lp_amount = T::Balance::one(); + + assert_ok!(AssetConversion::::add_liquidity( SystemOrigin::Signed(caller.clone()).into(), - Box::new(native.clone()), Box::new(asset1.clone()), - (100 * ed).into(), - 200.into(), - 0.into(), - 0.into(), + Box::new(asset2.clone()), + liquidity1, + liquidity2, + T::Balance::one(), + T::Balance::zero(), caller.clone(), - )?; - - let path; - let swap_amount; - // if we only allow the native-asset pools, then the worst case scenario would be to swap - // asset1-native-asset2 - if !T::AllowMultiAssetPools::get() { - AssetConversion::::create_pool( - SystemOrigin::Signed(caller.clone()).into(), - Box::new(native.clone()), - Box::new(asset2.clone()) - )?; - AssetConversion::::add_liquidity( - SystemOrigin::Signed(caller.clone()).into(), - Box::new(native.clone()), - Box::new(asset2.clone()), - (500 * ed).into(), - 1000.into(), - 0.into(), - 0.into(), - caller.clone(), - )?; - path = vec![ - Box::new(asset1.clone()), - Box::new(native.clone()), - Box::new(asset2.clone()) - ]; - swap_amount = 100.into(); - } else { - let asset3 = T::BenchmarkHelper::multiasset_id(3); - AssetConversion::::create_pool( - SystemOrigin::Signed(caller.clone()).into(), - Box::new(asset1.clone()), - Box::new(asset2.clone()) - )?; - let (_, _) = create_asset::(&asset3); - AssetConversion::::create_pool( - SystemOrigin::Signed(caller.clone()).into(), - Box::new(asset2.clone()), - Box::new(asset3.clone()) - )?; + )); + let total_supply = + >::total_issuance(lp_token.clone()); + + #[extrinsic_call] + _( + SystemOrigin::Signed(caller.clone()), + Box::new(asset1), + Box::new(asset2), + remove_lp_amount, + T::Balance::zero(), + T::Balance::zero(), + caller.clone(), + ); + + let new_total_supply = >::total_issuance(lp_token); + assert_eq!(new_total_supply, total_supply - remove_lp_amount); + } + + #[benchmark] + fn swap_exact_tokens_for_tokens(n: Linear<2, { T::MaxSwapPathLength::get() }>) { + let mut swap_amount = T::Balance::one(); + let mut path = vec![]; + + let caller: T::AccountId = whitelisted_caller(); + create_fee_asset::(&caller); + for n in 1..n { + let (asset1, asset2) = T::BenchmarkHelper::create_pair(n - 1, n); + swap_amount = swap_amount + T::Balance::one(); + if path.len() == 0 { + path = vec![Box::new(asset1.clone()), Box::new(asset2.clone())]; + } else { + path.push(Box::new(asset2.clone())); + } - AssetConversion::::add_liquidity( + let (_, liquidity1, liquidity2) = create_asset_and_pool::(&caller, &asset1, &asset2); + + assert_ok!(AssetConversion::::add_liquidity( SystemOrigin::Signed(caller.clone()).into(), Box::new(asset1.clone()), Box::new(asset2.clone()), - 200.into(), - 2000.into(), - 0.into(), - 0.into(), + liquidity1, + liquidity2, + T::Balance::one(), + T::Balance::zero(), caller.clone(), - )?; - AssetConversion::::add_liquidity( - SystemOrigin::Signed(caller.clone()).into(), - Box::new(asset2.clone()), - Box::new(asset3.clone()), - 2000.into(), - 2000.into(), - 0.into(), - 0.into(), - caller.clone(), - )?; - path = vec![ - Box::new(native.clone()), - Box::new(asset1.clone()), - Box::new(asset2.clone()), - Box::new(asset3.clone()) - ]; - swap_amount = ed.into(); + )); } - let native_balance = T::Currency::balance(&caller); - let asset1_balance = T::Assets::balance(T::BenchmarkHelper::asset_id(1), &caller); - }: _(SystemOrigin::Signed(caller.clone()), path, swap_amount, 1.into(), caller.clone(), false) - verify { - if !T::AllowMultiAssetPools::get() { - let new_asset1_balance = T::Assets::balance(T::BenchmarkHelper::asset_id(1), &caller); - assert_eq!(new_asset1_balance, asset1_balance - 100.into()); - } else { - let new_native_balance = T::Currency::balance(&caller); - assert_eq!(new_native_balance, native_balance - ed.into()); - } - } - swap_tokens_for_exact_tokens { - let native = T::MultiAssetIdConverter::get_native(); - let asset1 = T::BenchmarkHelper::multiasset_id(1); - let asset2 = T::BenchmarkHelper::multiasset_id(2); - let (_, caller, _) = create_asset_and_pool::(&native, &asset1); - let (_, _) = create_asset::(&asset2); - let ed: u128 = T::Currency::minimum_balance().into(); + let asset_in = *path.first().unwrap().clone(); + assert_ok!(T::Assets::mint_into( + asset_in.clone(), + &caller, + swap_amount + T::Balance::one() + )); + let init_caller_balance = T::Assets::balance(asset_in.clone(), &caller); - AssetConversion::::add_liquidity( - SystemOrigin::Signed(caller.clone()).into(), - Box::new(native.clone()), - Box::new(asset1.clone()), - (1000 * ed).into(), - 500.into(), - 0.into(), - 0.into(), + #[extrinsic_call] + _( + SystemOrigin::Signed(caller.clone()), + path, + swap_amount, + T::Balance::one(), caller.clone(), - )?; + true, + ); - let path; - // if we only allow the native-asset pools, then the worst case scenario would be to swap - // asset1-native-asset2 - if !T::AllowMultiAssetPools::get() { - AssetConversion::::create_pool( - SystemOrigin::Signed(caller.clone()).into(), - Box::new(native.clone()), - Box::new(asset2.clone()) - )?; - AssetConversion::::add_liquidity( - SystemOrigin::Signed(caller.clone()).into(), - Box::new(native.clone()), - Box::new(asset2.clone()), - (500 * ed).into(), - 1000.into(), - 0.into(), - 0.into(), - caller.clone(), - )?; - path = vec![ - Box::new(asset1.clone()), - Box::new(native.clone()), - Box::new(asset2.clone()) - ]; - } else { - AssetConversion::::create_pool( - SystemOrigin::Signed(caller.clone()).into(), - Box::new(asset1.clone()), - Box::new(asset2.clone()) - )?; - let asset3 = T::BenchmarkHelper::multiasset_id(3); - let (_, _) = create_asset::(&asset3); - AssetConversion::::create_pool( - SystemOrigin::Signed(caller.clone()).into(), - Box::new(asset2.clone()), - Box::new(asset3.clone()) - )?; + let actual_balance = T::Assets::balance(asset_in, &caller); + assert_eq!(actual_balance, init_caller_balance - swap_amount); + } + + #[benchmark] + fn swap_tokens_for_exact_tokens(n: Linear<2, { T::MaxSwapPathLength::get() }>) { + let mut max_swap_amount = T::Balance::one(); + let mut path = vec![]; + + let caller: T::AccountId = whitelisted_caller(); + create_fee_asset::(&caller); + for n in 1..n { + let (asset1, asset2) = T::BenchmarkHelper::create_pair(n - 1, n); + max_swap_amount = max_swap_amount + T::Balance::one() + T::Balance::one(); + if path.len() == 0 { + path = vec![Box::new(asset1.clone()), Box::new(asset2.clone())]; + } else { + path.push(Box::new(asset2.clone())); + } + + let (_, liquidity1, liquidity2) = create_asset_and_pool::(&caller, &asset1, &asset2); - AssetConversion::::add_liquidity( + assert_ok!(AssetConversion::::add_liquidity( SystemOrigin::Signed(caller.clone()).into(), Box::new(asset1.clone()), Box::new(asset2.clone()), - 2000.into(), - 2000.into(), - 0.into(), - 0.into(), + liquidity1, + liquidity2, + T::Balance::one(), + T::Balance::zero(), caller.clone(), - )?; - AssetConversion::::add_liquidity( - SystemOrigin::Signed(caller.clone()).into(), - Box::new(asset2.clone()), - Box::new(asset3.clone()), - 2000.into(), - 2000.into(), - 0.into(), - 0.into(), - caller.clone(), - )?; - path = vec![ - Box::new(native.clone()), - Box::new(asset1.clone()), - Box::new(asset2.clone()), - Box::new(asset3.clone()) - ]; + )); } - let asset2_balance = T::Assets::balance(T::BenchmarkHelper::asset_id(2), &caller); - let asset3_balance = T::Assets::balance(T::BenchmarkHelper::asset_id(3), &caller); - }: _(SystemOrigin::Signed(caller.clone()), path.clone(), 100.into(), (1000 * ed).into(), caller.clone(), false) - verify { - if !T::AllowMultiAssetPools::get() { - let new_asset2_balance = T::Assets::balance(T::BenchmarkHelper::asset_id(2), &caller); - assert_eq!(new_asset2_balance, asset2_balance + 100.into()); - } else { - let new_asset3_balance = T::Assets::balance(T::BenchmarkHelper::asset_id(3), &caller); - assert_eq!(new_asset3_balance, asset3_balance + 100.into()); - } + let asset_in = *path.first().unwrap().clone(); + let asset_out = *path.last().unwrap().clone(); + assert_ok!(T::Assets::mint_into(asset_in, &caller, max_swap_amount)); + let init_caller_balance = T::Assets::balance(asset_out.clone(), &caller); + + #[extrinsic_call] + _( + SystemOrigin::Signed(caller.clone()), + path, + T::Balance::one(), + max_swap_amount, + caller.clone(), + true, + ); + + let actual_balance = T::Assets::balance(asset_out, &caller); + assert_eq!(actual_balance, init_caller_balance + T::Balance::one()); } impl_benchmark_test_suite!(AssetConversion, crate::mock::new_test_ext(), crate::mock::Test); diff --git a/substrate/frame/asset-conversion/src/lib.rs b/substrate/frame/asset-conversion/src/lib.rs index b9ff5e95508..f0695678fbd 100644 --- a/substrate/frame/asset-conversion/src/lib.rs +++ b/substrate/frame/asset-conversion/src/lib.rs @@ -63,7 +63,8 @@ mod swap; mod tests; mod types; pub mod weights; - +#[cfg(feature = "runtime-benchmarks")] +pub use benchmarking::{BenchmarkHelper, NativeOrWithIdFactory}; pub use pallet::*; pub use swap::*; pub use types::*; @@ -73,18 +74,14 @@ use codec::Codec; use frame_support::{ storage::{with_storage_layer, with_transaction}, traits::{ - fungible::{ - Balanced as BalancedFungible, Credit as CreditFungible, Inspect as InspectFungible, - Mutate as MutateFungible, - }, - fungibles::{Balanced, Create, Credit as CreditFungibles, Inspect, Mutate}, + fungibles::{Balanced, Create, Credit, Inspect, Mutate}, tokens::{ AssetId, Balance, Fortitude::Polite, Precision::Exact, Preservation::{Expendable, Preserve}, }, - AccountTouch, ContainsPair, Imbalance, Incrementable, + AccountTouch, Incrementable, OnUnbalanced, }, PalletId, }; @@ -94,7 +91,7 @@ use sp_runtime::{ CheckedAdd, CheckedDiv, CheckedMul, CheckedSub, Ensure, IntegerSquareRoot, MaybeDisplay, One, TrailingZeroInput, Zero, }, - DispatchError, RuntimeDebug, Saturating, TokenError, TransactionOutcome, + DispatchError, Saturating, TokenError, TransactionOutcome, }; use sp_std::{boxed::Box, collections::btree_set::BTreeSet, vec::Vec}; @@ -113,11 +110,6 @@ pub mod pallet { /// Overarching event type. type RuntimeEvent: From> + IsType<::RuntimeEvent>; - /// Currency type that this works on. - type Currency: InspectFungible - + MutateFungible - + BalancedFungible; - /// The type in which the assets for swapping are measured. type Balance: Balance; @@ -130,37 +122,34 @@ pub mod pallet { + From + TryInto; - /// Identifier for the class of non-native asset. - /// Note: A `From` bound here would prevent `MultiLocation` from being used as an - /// `AssetId`. - type AssetId: AssetId; + /// Type of asset class, sourced from [`Config::Assets`], utilized to offer liquidity to a + /// pool. + type AssetKind: Parameter + MaxEncodedLen; - /// Type that identifies either the native currency or a token class from `Assets`. - /// `Ord` is added because of `get_pool_id`. - /// - /// The pool's `AccountId` is derived from this type. Any changes to the type may - /// necessitate a migration. - type MultiAssetId: AssetId + Ord + From; + /// Registry of assets utilized for providing liquidity to pools. + type Assets: Inspect + + Mutate + + AccountTouch + + Balanced; - /// Type to convert an `AssetId` into `MultiAssetId`. - type MultiAssetIdConverter: MultiAssetIdConverter; + /// Liquidity pool identifier. + type PoolId: Parameter + MaxEncodedLen + Ord; - /// `AssetId` to address the lp tokens by. - type PoolAssetId: AssetId + PartialOrd + Incrementable + From; + /// Provides means to resolve the [`Config::PoolId`] and it's `AccountId` from a pair + /// of [`Config::AssetKind`]s. + /// + /// Examples: [`crate::types::WithFirstAsset`], [`crate::types::Ascending`]. + type PoolLocator: PoolLocator; - /// Registry for the assets. - type Assets: Inspect - + Mutate - + AccountTouch - + ContainsPair - + Balanced; + /// Asset class for the lp tokens from [`Self::PoolAssets`]. + type PoolAssetId: AssetId + PartialOrd + Incrementable + From; /// Registry for the lp tokens. Ideally only this pallet should have create permissions on /// the assets. type PoolAssets: Inspect + Create + Mutate - + AccountTouch; + + AccountTouch; /// A % the liquidity providers will take of every swap. Represents 10ths of a percent. #[pallet::constant] @@ -170,8 +159,12 @@ pub mod pallet { #[pallet::constant] type PoolSetupFee: Get; - /// An account that receives the pool setup fee. - type PoolSetupFeeReceiver: Get; + /// Asset class from [`Config::Assets`] used to pay the [`Config::PoolSetupFee`]. + #[pallet::constant] + type PoolSetupFeeAsset: Get; + + /// Handler for the [`Config::PoolSetupFee`]. + type PoolSetupFeeTarget: OnUnbalanced>; /// A fee to withdraw the liquidity. #[pallet::constant] @@ -189,23 +182,19 @@ pub mod pallet { #[pallet::constant] type PalletId: Get; - /// A setting to allow creating pools with both non-native assets. - #[pallet::constant] - type AllowMultiAssetPools: Get; - /// Weight information for extrinsics in this pallet. type WeightInfo: WeightInfo; /// The benchmarks need a way to create asset ids from u32s. #[cfg(feature = "runtime-benchmarks")] - type BenchmarkHelper: BenchmarkHelper; + type BenchmarkHelper: BenchmarkHelper; } /// Map from `PoolAssetId` to `PoolInfo`. This establishes whether a pool has been officially /// created rather than people sending tokens directly to a pool's public account. #[pallet::storage] pub type Pools = - StorageMap<_, Blake2_128Concat, PoolIdOf, PoolInfo, OptionQuery>; + StorageMap<_, Blake2_128Concat, T::PoolId, PoolInfo, OptionQuery>; /// Stores the `PoolAssetId` that is going to be used for the next lp token. /// This gets incremented whenever a new lp pool is created. @@ -222,7 +211,7 @@ pub mod pallet { creator: T::AccountId, /// The pool id associated with the pool. Note that the order of the assets may not be /// the same as the order specified in the create pool extrinsic. - pool_id: PoolIdOf, + pool_id: T::PoolId, /// The account ID of the pool. pool_account: T::AccountId, /// The id of the liquidity tokens that will be minted when assets are added to this @@ -237,7 +226,7 @@ pub mod pallet { /// The account that the liquidity tokens were minted to. mint_to: T::AccountId, /// The pool id of the pool that the liquidity was added to. - pool_id: PoolIdOf, + pool_id: T::PoolId, /// The amount of the first asset that was added to the pool. amount1_provided: T::Balance, /// The amount of the second asset that was added to the pool. @@ -255,7 +244,7 @@ pub mod pallet { /// The account that the assets were transferred to. withdraw_to: T::AccountId, /// The pool id that the liquidity was removed from. - pool_id: PoolIdOf, + pool_id: T::PoolId, /// The amount of the first asset that was removed from the pool. amount1: T::Balance, /// The amount of the second asset that was removed from the pool. @@ -296,10 +285,8 @@ pub mod pallet { #[pallet::error] pub enum Error { - /// Provided assets are equal. - EqualAssets, - /// Provided asset is not supported for pool. - UnsupportedAsset, + /// Provided asset pair is not supported for pool. + InvalidAssetPair, /// Pool already exists. PoolExists, /// Desired amount can't be zero. @@ -335,18 +322,12 @@ pub mod pallet { ZeroLiquidity, /// Amount can't be zero. ZeroAmount, - /// Insufficient liquidity in the pool. - InsufficientLiquidity, /// Calculated amount out is less than provided minimum amount. ProvidedMinimumNotSufficientForSwap, /// Provided maximum amount is not sufficient for swap. ProvidedMaximumNotSufficientForSwap, - /// Only pools with native on one side are valid. - PoolMustContainNativeCurrency, /// The provided path must consists of 2 assets at least. InvalidPath, - /// It was not possible to calculate path data. - PathError, /// The provided path must consists of unique assets. NonUniquePath, /// It was not possible to get or increment the Id of the pool. @@ -376,48 +357,32 @@ pub mod pallet { #[pallet::weight(T::WeightInfo::create_pool())] pub fn create_pool( origin: OriginFor, - asset1: Box, - asset2: Box, + asset1: Box, + asset2: Box, ) -> DispatchResult { let sender = ensure_signed(origin)?; - ensure!(asset1 != asset2, Error::::EqualAssets); + ensure!(asset1 != asset2, Error::::InvalidAssetPair); // prepare pool_id - let pool_id = Self::get_pool_id(*asset1, *asset2); + let pool_id = T::PoolLocator::pool_id(&asset1, &asset2) + .map_err(|_| Error::::InvalidAssetPair)?; ensure!(!Pools::::contains_key(&pool_id), Error::::PoolExists); - let (asset1, asset2) = &pool_id; - if !T::AllowMultiAssetPools::get() && !T::MultiAssetIdConverter::is_native(asset1) { - Err(Error::::PoolMustContainNativeCurrency)?; - } - let pool_account = Self::get_pool_account(&pool_id); - frame_system::Pallet::::inc_providers(&pool_account); + let pool_account = + T::PoolLocator::address(&pool_id).map_err(|_| Error::::InvalidAssetPair)?; // pay the setup fee - T::Currency::transfer( - &sender, - &T::PoolSetupFeeReceiver::get(), - T::PoolSetupFee::get(), - Preserve, - )?; + let fee = + Self::withdraw(T::PoolSetupFeeAsset::get(), &sender, T::PoolSetupFee::get(), true)?; + T::PoolSetupFeeTarget::on_unbalanced(fee); - // try to convert both assets - match T::MultiAssetIdConverter::try_convert(asset1) { - MultiAssetIdConversionResult::Converted(asset) => - if !T::Assets::contains(&asset, &pool_account) { - T::Assets::touch(asset, &pool_account, &sender)? - }, - MultiAssetIdConversionResult::Unsupported(_) => Err(Error::::UnsupportedAsset)?, - MultiAssetIdConversionResult::Native => (), - } - match T::MultiAssetIdConverter::try_convert(asset2) { - MultiAssetIdConversionResult::Converted(asset) => - if !T::Assets::contains(&asset, &pool_account) { - T::Assets::touch(asset, &pool_account, &sender)? - }, - MultiAssetIdConversionResult::Unsupported(_) => Err(Error::::UnsupportedAsset)?, - MultiAssetIdConversionResult::Native => (), - } + if T::Assets::should_touch(*asset1.clone(), &pool_account) { + T::Assets::touch(*asset1, &pool_account, &sender)? + }; + + if T::Assets::should_touch(*asset2.clone(), &pool_account) { + T::Assets::touch(*asset2, &pool_account, &sender)? + }; let lp_token = NextPoolAssetId::::get() .or(T::PoolAssetId::initial_value()) @@ -454,8 +419,8 @@ pub mod pallet { #[pallet::weight(T::WeightInfo::add_liquidity())] pub fn add_liquidity( origin: OriginFor, - asset1: Box, - asset2: Box, + asset1: Box, + asset2: Box, amount1_desired: T::Balance, amount2_desired: T::Balance, amount1_min: T::Balance, @@ -464,26 +429,20 @@ pub mod pallet { ) -> DispatchResult { let sender = ensure_signed(origin)?; - let pool_id = Self::get_pool_id(*asset1.clone(), *asset2); - // swap params if needed - let (amount1_desired, amount2_desired, amount1_min, amount2_min) = - if pool_id.0 == *asset1 { - (amount1_desired, amount2_desired, amount1_min, amount2_min) - } else { - (amount2_desired, amount1_desired, amount2_min, amount1_min) - }; + let pool_id = T::PoolLocator::pool_id(&asset1, &asset2) + .map_err(|_| Error::::InvalidAssetPair)?; + ensure!( amount1_desired > Zero::zero() && amount2_desired > Zero::zero(), Error::::WrongDesiredAmount ); - let maybe_pool = Pools::::get(&pool_id); - let pool = maybe_pool.as_ref().ok_or(Error::::PoolNotFound)?; - let pool_account = Self::get_pool_account(&pool_id); + let pool = Pools::::get(&pool_id).ok_or(Error::::PoolNotFound)?; + let pool_account = + T::PoolLocator::address(&pool_id).map_err(|_| Error::::InvalidAssetPair)?; - let (asset1, asset2) = &pool_id; - let reserve1 = Self::get_balance(&pool_account, asset1)?; - let reserve2 = Self::get_balance(&pool_account, asset2)?; + let reserve1 = Self::get_balance(&pool_account, *asset1.clone()); + let reserve2 = Self::get_balance(&pool_account, *asset2.clone()); let amount1: T::Balance; let amount2: T::Balance; @@ -515,13 +474,17 @@ pub mod pallet { } } - Self::validate_minimal_amount(amount1.saturating_add(reserve1), asset1) - .map_err(|_| Error::::AmountOneLessThanMinimal)?; - Self::validate_minimal_amount(amount2.saturating_add(reserve2), asset2) - .map_err(|_| Error::::AmountTwoLessThanMinimal)?; + ensure!( + amount1.saturating_add(reserve1) >= T::Assets::minimum_balance(*asset1.clone()), + Error::::AmountOneLessThanMinimal + ); + ensure!( + amount2.saturating_add(reserve2) >= T::Assets::minimum_balance(*asset2.clone()), + Error::::AmountTwoLessThanMinimal + ); - Self::transfer(asset1, &sender, &pool_account, amount1, true)?; - Self::transfer(asset2, &sender, &pool_account, amount2, true)?; + T::Assets::transfer(*asset1, &sender, &pool_account, amount1, Preserve)?; + T::Assets::transfer(*asset2, &sender, &pool_account, amount2, Preserve)?; let total_supply = T::PoolAssets::total_issuance(pool.lp_token.clone()); @@ -552,7 +515,7 @@ pub mod pallet { pool_id, amount1_provided: amount1, amount2_provided: amount2, - lp_token: pool.lp_token.clone(), + lp_token: pool.lp_token, lp_token_minted: lp_token_amount, }); @@ -566,8 +529,8 @@ pub mod pallet { #[pallet::weight(T::WeightInfo::remove_liquidity())] pub fn remove_liquidity( origin: OriginFor, - asset1: Box, - asset2: Box, + asset1: Box, + asset2: Box, lp_token_burn: T::Balance, amount1_min_receive: T::Balance, amount2_min_receive: T::Balance, @@ -575,23 +538,17 @@ pub mod pallet { ) -> DispatchResult { let sender = ensure_signed(origin)?; - let pool_id = Self::get_pool_id(*asset1.clone(), *asset2); - // swap params if needed - let (amount1_min_receive, amount2_min_receive) = if pool_id.0 == *asset1 { - (amount1_min_receive, amount2_min_receive) - } else { - (amount2_min_receive, amount1_min_receive) - }; - let (asset1, asset2) = pool_id.clone(); + let pool_id = T::PoolLocator::pool_id(&asset1, &asset2) + .map_err(|_| Error::::InvalidAssetPair)?; ensure!(lp_token_burn > Zero::zero(), Error::::ZeroLiquidity); - let maybe_pool = Pools::::get(&pool_id); - let pool = maybe_pool.as_ref().ok_or(Error::::PoolNotFound)?; + let pool = Pools::::get(&pool_id).ok_or(Error::::PoolNotFound)?; - let pool_account = Self::get_pool_account(&pool_id); - let reserve1 = Self::get_balance(&pool_account, &asset1)?; - let reserve2 = Self::get_balance(&pool_account, &asset2)?; + let pool_account = + T::PoolLocator::address(&pool_id).map_err(|_| Error::::InvalidAssetPair)?; + let reserve1 = Self::get_balance(&pool_account, *asset1.clone()); + let reserve2 = Self::get_balance(&pool_account, *asset2.clone()); let total_supply = T::PoolAssets::total_issuance(pool.lp_token.clone()); let withdrawal_fee_amount = T::LiquidityWithdrawalFee::get() * lp_token_burn; @@ -610,16 +567,20 @@ pub mod pallet { ); let reserve1_left = reserve1.saturating_sub(amount1); let reserve2_left = reserve2.saturating_sub(amount2); - Self::validate_minimal_amount(reserve1_left, &asset1) - .map_err(|_| Error::::ReserveLeftLessThanMinimal)?; - Self::validate_minimal_amount(reserve2_left, &asset2) - .map_err(|_| Error::::ReserveLeftLessThanMinimal)?; + ensure!( + reserve1_left >= T::Assets::minimum_balance(*asset1.clone()), + Error::::ReserveLeftLessThanMinimal + ); + ensure!( + reserve2_left >= T::Assets::minimum_balance(*asset2.clone()), + Error::::ReserveLeftLessThanMinimal + ); // burn the provided lp token amount that includes the fee T::PoolAssets::burn_from(pool.lp_token.clone(), &sender, lp_token_burn, Exact, Polite)?; - Self::transfer(&asset1, &pool_account, &withdraw_to, amount1, false)?; - Self::transfer(&asset2, &pool_account, &withdraw_to, amount2, false)?; + T::Assets::transfer(*asset1, &pool_account, &withdraw_to, amount1, Expendable)?; + T::Assets::transfer(*asset2, &pool_account, &withdraw_to, amount2, Expendable)?; Self::deposit_event(Event::LiquidityRemoved { who: sender, @@ -627,7 +588,7 @@ pub mod pallet { pool_id, amount1, amount2, - lp_token: pool.lp_token.clone(), + lp_token: pool.lp_token, lp_token_burned: lp_token_burn, withdrawal_fee: T::LiquidityWithdrawalFee::get(), }); @@ -642,10 +603,10 @@ pub mod pallet { /// [`AssetConversionApi::quote_price_exact_tokens_for_tokens`] runtime call can be called /// for a quote. #[pallet::call_index(3)] - #[pallet::weight(T::WeightInfo::swap_exact_tokens_for_tokens())] + #[pallet::weight(T::WeightInfo::swap_exact_tokens_for_tokens(path.len() as u32))] pub fn swap_exact_tokens_for_tokens( origin: OriginFor, - path: Vec>, + path: Vec>, amount_in: T::Balance, amount_out_min: T::Balance, send_to: T::AccountId, @@ -670,10 +631,10 @@ pub mod pallet { /// [`AssetConversionApi::quote_price_tokens_for_exact_tokens`] runtime call can be called /// for a quote. #[pallet::call_index(4)] - #[pallet::weight(T::WeightInfo::swap_tokens_for_exact_tokens())] + #[pallet::weight(T::WeightInfo::swap_tokens_for_exact_tokens(path.len() as u32))] pub fn swap_tokens_for_exact_tokens( origin: OriginFor, - path: Vec>, + path: Vec>, amount_out: T::Balance, amount_in_max: T::Balance, send_to: T::AccountId, @@ -707,7 +668,7 @@ pub mod pallet { /// rollback. pub(crate) fn do_swap_exact_tokens_for_tokens( sender: T::AccountId, - path: Vec, + path: Vec, amount_in: T::Balance, amount_out_min: Option, send_to: T::AccountId, @@ -755,7 +716,7 @@ pub mod pallet { /// rollback. pub(crate) fn do_swap_tokens_for_exact_tokens( sender: T::AccountId, - path: Vec, + path: Vec, amount_out: T::Balance, amount_in_max: Option, send_to: T::AccountId, @@ -801,13 +762,16 @@ pub mod pallet { /// only inside a transactional storage context and an Err result must imply a storage /// rollback. pub(crate) fn do_swap_exact_credit_tokens_for_tokens( - path: Vec, - credit_in: Credit, + path: Vec, + credit_in: CreditOf, amount_out_min: Option, - ) -> Result, (Credit, DispatchError)> { + ) -> Result, (CreditOf, DispatchError)> { let amount_in = credit_in.peek(); let inspect_path = |credit_asset| { - ensure!(path.get(0).map_or(false, |a| *a == credit_asset), Error::::InvalidPath); + ensure!( + path.first().map_or(false, |a| *a == credit_asset), + Error::::InvalidPath + ); ensure!(!amount_in.is_zero(), Error::::ZeroAmount); ensure!(amount_out_min.map_or(true, |a| !a.is_zero()), Error::::ZeroAmount); @@ -846,13 +810,16 @@ pub mod pallet { /// only inside a transactional storage context and an Err result must imply a storage /// rollback. pub(crate) fn do_swap_credit_tokens_for_exact_tokens( - path: Vec, - credit_in: Credit, + path: Vec, + credit_in: CreditOf, amount_out: T::Balance, - ) -> Result<(Credit, Credit), (Credit, DispatchError)> { + ) -> Result<(CreditOf, CreditOf), (CreditOf, DispatchError)> { let amount_in_max = credit_in.peek(); let inspect_path = |credit_asset| { - ensure!(path.get(0).map_or(false, |a| a == &credit_asset), Error::::InvalidPath); + ensure!( + path.first().map_or(false, |a| a == &credit_asset), + Error::::InvalidPath + ); ensure!(amount_in_max > Zero::zero(), Error::::ZeroAmount); ensure!(amount_out > Zero::zero(), Error::::ZeroAmount); @@ -880,75 +847,6 @@ pub mod pallet { Ok((credit_out, credit_change)) } - /// Transfer an `amount` of `asset_id`, respecting the `keep_alive` requirements. - fn transfer( - asset_id: &T::MultiAssetId, - from: &T::AccountId, - to: &T::AccountId, - amount: T::Balance, - keep_alive: bool, - ) -> Result { - let preservation = match keep_alive { - true => Preserve, - false => Expendable, - }; - match T::MultiAssetIdConverter::try_convert(asset_id) { - MultiAssetIdConversionResult::Converted(asset_id) => - T::Assets::transfer(asset_id, from, to, amount, preservation), - MultiAssetIdConversionResult::Native => - Ok(T::Currency::transfer(from, to, amount, preservation)?), - MultiAssetIdConversionResult::Unsupported(_) => - Err(Error::::UnsupportedAsset.into()), - } - } - - /// The balance of `who` is increased in order to counter `credit`. If the whole of `credit` - /// cannot be countered, then nothing is changed and the original `credit` is returned in an - /// `Err`. - fn resolve(who: &T::AccountId, credit: Credit) -> Result<(), Credit> { - match credit { - Credit::Native(c) => T::Currency::resolve(who, c).map_err(|c| c.into()), - Credit::Asset(c) => T::Assets::resolve(who, c).map_err(|c| c.into()), - } - } - - /// Removes `value` balance of `asset` from `who` account if possible. - fn withdraw( - asset: &T::MultiAssetId, - who: &T::AccountId, - value: T::Balance, - keep_alive: bool, - ) -> Result, DispatchError> { - let preservation = match keep_alive { - true => Preserve, - false => Expendable, - }; - match T::MultiAssetIdConverter::try_convert(asset) { - MultiAssetIdConversionResult::Converted(asset) => { - if preservation == Preserve { - // TODO drop the ensure! when this issue addressed - // https://github.com/paritytech/polkadot-sdk/issues/1698 - let free = - T::Assets::reducible_balance(asset.clone(), who, preservation, Polite); - ensure!(free >= value, TokenError::NotExpendable); - } - T::Assets::withdraw(asset, who, value, Exact, preservation, Polite) - .map(|c| c.into()) - }, - MultiAssetIdConversionResult::Native => { - if preservation == Preserve { - // TODO drop the ensure! when this issue addressed - // https://github.com/paritytech/polkadot-sdk/issues/1698 - let free = T::Currency::reducible_balance(who, preservation, Polite); - ensure!(free >= value, TokenError::NotExpendable); - } - T::Currency::withdraw(who, value, Exact, preservation, Polite).map(|c| c.into()) - }, - MultiAssetIdConversionResult::Unsupported(_) => - Err(Error::::UnsupportedAsset.into()), - } - } - /// Swap assets along the `path`, withdrawing from `sender` and depositing in `send_to`. /// /// Note: It's assumed that the provided `path` is valid. @@ -963,10 +861,10 @@ pub mod pallet { keep_alive: bool, ) -> Result<(), DispatchError> { let (asset_in, amount_in) = path.first().ok_or(Error::::InvalidPath)?; - let credit_in = Self::withdraw(asset_in, sender, *amount_in, keep_alive)?; + let credit_in = Self::withdraw(asset_in.clone(), sender, *amount_in, keep_alive)?; let credit_out = Self::credit_swap(credit_in, path).map_err(|(_, e)| e)?; - Self::resolve(send_to, credit_out).map_err(|_| Error::::BelowMinimum)?; + T::Assets::resolve(send_to, credit_out).map_err(|_| Error::::BelowMinimum)?; Ok(()) } @@ -983,29 +881,34 @@ pub mod pallet { /// only inside a transactional storage context and an Err result must imply a storage /// rollback. fn credit_swap( - credit_in: Credit, + credit_in: CreditOf, path: &BalancePath, - ) -> Result, (Credit, DispatchError)> { - let resolve_path = || -> Result, DispatchError> { + ) -> Result, (CreditOf, DispatchError)> { + let resolve_path = || -> Result, DispatchError> { for pos in 0..=path.len() { if let Some([(asset1, _), (asset2, amount_out)]) = path.get(pos..=pos + 1) { - let pool_from = Self::get_pool_account(&Self::get_pool_id( - asset1.clone(), - asset2.clone(), - )); + let pool_from = T::PoolLocator::pool_address(asset1, asset2) + .map_err(|_| Error::::InvalidAssetPair)?; + if let Some((asset3, _)) = path.get(pos + 2) { - let pool_to = Self::get_pool_account(&Self::get_pool_id( + let pool_to = T::PoolLocator::pool_address(asset2, asset3) + .map_err(|_| Error::::InvalidAssetPair)?; + + T::Assets::transfer( asset2.clone(), - asset3.clone(), - )); - Self::transfer(asset2, &pool_from, &pool_to, *amount_out, true)?; + &pool_from, + &pool_to, + *amount_out, + Preserve, + )?; } else { - let credit_out = Self::withdraw(asset2, &pool_from, *amount_out, true)?; + let credit_out = + Self::withdraw(asset2.clone(), &pool_from, *amount_out, true)?; return Ok(credit_out) } } } - return Err(Error::::InvalidPath.into()) + Err(Error::::InvalidPath.into()) }; let credit_out = match resolve_path() { @@ -1014,79 +917,57 @@ pub mod pallet { }; let pool_to = if let Some([(asset1, _), (asset2, _)]) = path.get(0..2) { - Self::get_pool_account(&Self::get_pool_id(asset1.clone(), asset2.clone())) + match T::PoolLocator::pool_address(asset1, asset2) { + Ok(address) => address, + Err(_) => return Err((credit_in, Error::::InvalidAssetPair.into())), + } } else { return Err((credit_in, Error::::InvalidPath.into())) }; - Self::resolve(&pool_to, credit_in).map_err(|c| (c, Error::::BelowMinimum.into()))?; + T::Assets::resolve(&pool_to, credit_in) + .map_err(|c| (c, Error::::BelowMinimum.into()))?; Ok(credit_out) } - /// The account ID of the pool. - /// - /// This actually does computation. If you need to keep using it, then make sure you cache - /// the value and only call this once. - pub fn get_pool_account(pool_id: &PoolIdOf) -> T::AccountId { - let encoded_pool_id = sp_io::hashing::blake2_256(&Encode::encode(pool_id)[..]); - - Decode::decode(&mut TrailingZeroInput::new(encoded_pool_id.as_ref())) - .expect("infinite length input; no invalid inputs for type; qed") + /// Removes `value` balance of `asset` from `who` account if possible. + fn withdraw( + asset: T::AssetKind, + who: &T::AccountId, + value: T::Balance, + keep_alive: bool, + ) -> Result, DispatchError> { + let preservation = match keep_alive { + true => Preserve, + false => Expendable, + }; + if preservation == Preserve { + // TODO drop the ensure! when this issue addressed + // https://github.com/paritytech/polkadot-sdk/issues/1698 + let free = T::Assets::reducible_balance(asset.clone(), who, preservation, Polite); + ensure!(free >= value, TokenError::NotExpendable); + } + T::Assets::withdraw(asset, who, value, Exact, preservation, Polite) } /// Get the `owner`'s balance of `asset`, which could be the chain's native asset or another /// fungible. Returns a value in the form of an `Balance`. - fn get_balance( - owner: &T::AccountId, - asset: &T::MultiAssetId, - ) -> Result> { - match T::MultiAssetIdConverter::try_convert(asset) { - MultiAssetIdConversionResult::Converted(asset_id) => Ok( - <::Assets>::reducible_balance(asset_id, owner, Expendable, Polite), - ), - MultiAssetIdConversionResult::Native => - Ok(<::Currency>::reducible_balance(owner, Expendable, Polite)), - MultiAssetIdConversionResult::Unsupported(_) => - Err(Error::::UnsupportedAsset.into()), - } - } - - /// Returns a pool id constructed from 2 assets. - /// 1. Native asset should be lower than the other asset ids. - /// 2. Two native or two non-native assets are compared by their `Ord` implementation. - /// - /// We expect deterministic order, so (asset1, asset2) or (asset2, asset1) returns the same - /// result. - pub fn get_pool_id(asset1: T::MultiAssetId, asset2: T::MultiAssetId) -> PoolIdOf { - match ( - T::MultiAssetIdConverter::is_native(&asset1), - T::MultiAssetIdConverter::is_native(&asset2), - ) { - (true, false) => return (asset1, asset2), - (false, true) => return (asset2, asset1), - _ => { - // else we want to be deterministic based on `Ord` implementation - if asset1 <= asset2 { - (asset1, asset2) - } else { - (asset2, asset1) - } - }, - } + fn get_balance(owner: &T::AccountId, asset: T::AssetKind) -> T::Balance { + T::Assets::reducible_balance(asset, owner, Expendable, Polite) } /// Returns the balance of each asset in the pool. /// The tuple result is in the order requested (not necessarily the same as pool order). pub fn get_reserves( - asset1: &T::MultiAssetId, - asset2: &T::MultiAssetId, + asset1: T::AssetKind, + asset2: T::AssetKind, ) -> Result<(T::Balance, T::Balance), Error> { - let pool_id = Self::get_pool_id(asset1.clone(), asset2.clone()); - let pool_account = Self::get_pool_account(&pool_id); + let pool_account = T::PoolLocator::pool_address(&asset1, &asset2) + .map_err(|_| Error::::InvalidAssetPair)?; - let balance1 = Self::get_balance(&pool_account, asset1)?; - let balance2 = Self::get_balance(&pool_account, asset2)?; + let balance1 = Self::get_balance(&pool_account, asset1); + let balance2 = Self::get_balance(&pool_account, asset2); if balance1.is_zero() || balance2.is_zero() { Err(Error::::PoolNotFound)?; @@ -1098,7 +979,7 @@ pub mod pallet { /// Leading to an amount at the end of a `path`, get the required amounts in. pub(crate) fn balance_path_from_amount_out( amount_out: T::Balance, - path: Vec, + path: Vec, ) -> Result, DispatchError> { let mut balance_path: BalancePath = Vec::with_capacity(path.len()); let mut amount_in: T::Balance = amount_out; @@ -1112,7 +993,7 @@ pub mod pallet { break }, }; - let (reserve_in, reserve_out) = Self::get_reserves(asset1, &asset2)?; + let (reserve_in, reserve_out) = Self::get_reserves(asset1.clone(), asset2.clone())?; balance_path.push((asset2, amount_in)); amount_in = Self::get_amount_in(&amount_in, &reserve_in, &reserve_out)?; } @@ -1124,7 +1005,7 @@ pub mod pallet { /// Following an amount into a `path`, get the corresponding amounts out. pub(crate) fn balance_path_from_amount_in( amount_in: T::Balance, - path: Vec, + path: Vec, ) -> Result, DispatchError> { let mut balance_path: BalancePath = Vec::with_capacity(path.len()); let mut amount_out: T::Balance = amount_in; @@ -1138,7 +1019,7 @@ pub mod pallet { break }, }; - let (reserve_in, reserve_out) = Self::get_reserves(&asset1, asset2)?; + let (reserve_in, reserve_out) = Self::get_reserves(asset1.clone(), asset2.clone())?; balance_path.push((asset1, amount_out)); amount_out = Self::get_amount_out(&amount_out, &reserve_in, &reserve_out)?; } @@ -1147,16 +1028,15 @@ pub mod pallet { /// Used by the RPC service to provide current prices. pub fn quote_price_exact_tokens_for_tokens( - asset1: T::MultiAssetId, - asset2: T::MultiAssetId, + asset1: T::AssetKind, + asset2: T::AssetKind, amount: T::Balance, include_fee: bool, ) -> Option { - let pool_id = Self::get_pool_id(asset1.clone(), asset2.clone()); - let pool_account = Self::get_pool_account(&pool_id); + let pool_account = T::PoolLocator::pool_address(&asset1, &asset2).ok()?; - let balance1 = Self::get_balance(&pool_account, &asset1).ok()?; - let balance2 = Self::get_balance(&pool_account, &asset2).ok()?; + let balance1 = Self::get_balance(&pool_account, asset1); + let balance2 = Self::get_balance(&pool_account, asset2); if !balance1.is_zero() { if include_fee { Self::get_amount_out(&amount, &balance1, &balance2).ok() @@ -1170,16 +1050,15 @@ pub mod pallet { /// Used by the RPC service to provide current prices. pub fn quote_price_tokens_for_exact_tokens( - asset1: T::MultiAssetId, - asset2: T::MultiAssetId, + asset1: T::AssetKind, + asset2: T::AssetKind, amount: T::Balance, include_fee: bool, ) -> Option { - let pool_id = Self::get_pool_id(asset1.clone(), asset2.clone()); - let pool_account = Self::get_pool_account(&pool_id); + let pool_account = T::PoolLocator::pool_address(&asset1, &asset2).ok()?; - let balance1 = Self::get_balance(&pool_account, &asset1).ok()?; - let balance2 = Self::get_balance(&pool_account, &asset2).ok()?; + let balance1 = Self::get_balance(&pool_account, asset1); + let balance2 = Self::get_balance(&pool_account, asset2); if !balance1.is_zero() { if include_fee { Self::get_amount_in(&amount, &balance1, &balance2).ok() @@ -1246,7 +1125,7 @@ pub mod pallet { let reserve_out = T::HigherPrecisionBalance::from(*reserve_out); if reserve_in.is_zero() || reserve_out.is_zero() { - return Err(Error::::ZeroLiquidity.into()) + return Err(Error::::ZeroLiquidity) } let amount_in_with_fee = amount_in @@ -1281,11 +1160,11 @@ pub mod pallet { let reserve_out = T::HigherPrecisionBalance::from(*reserve_out); if reserve_in.is_zero() || reserve_out.is_zero() { - Err(Error::::ZeroLiquidity.into())? + Err(Error::::ZeroLiquidity)? } if amount_out >= reserve_out { - Err(Error::::AmountOutTooHigh.into())? + Err(Error::::AmountOutTooHigh)? } let numerator = reserve_in @@ -1309,36 +1188,18 @@ pub mod pallet { result.try_into().map_err(|_| Error::::Overflow) } - /// Ensure that a `value` meets the minimum balance requirements of an `asset` class. - fn validate_minimal_amount(value: T::Balance, asset: &T::MultiAssetId) -> Result<(), ()> { - if T::MultiAssetIdConverter::is_native(asset) { - let ed = T::Currency::minimum_balance(); - ensure!( - T::HigherPrecisionBalance::from(value) >= T::HigherPrecisionBalance::from(ed), - () - ); - } else { - let MultiAssetIdConversionResult::Converted(asset_id) = - T::MultiAssetIdConverter::try_convert(asset) - else { - return Err(()) - }; - let minimal = T::Assets::minimum_balance(asset_id); - ensure!(value >= minimal, ()); - } - Ok(()) - } - /// Ensure that a path is valid. - fn validate_swap_path(path: &Vec) -> Result<(), DispatchError> { + fn validate_swap_path(path: &Vec) -> Result<(), DispatchError> { ensure!(path.len() >= 2, Error::::InvalidPath); ensure!(path.len() as u32 <= T::MaxSwapPathLength::get(), Error::::InvalidPath); // validate all the pools in the path are unique - let mut pools = BTreeSet::>::new(); + let mut pools = BTreeSet::::new(); for assets_pair in path.windows(2) { if let [asset1, asset2] = assets_pair { - let pool_id = Self::get_pool_id(asset1.clone(), asset2.clone()); + let pool_id = T::PoolLocator::pool_id(asset1, asset2) + .map_err(|_| Error::::InvalidAssetPair)?; + let new_element = pools.insert(pool_id); if !new_element { return Err(Error::::NonUniquePath.into()) @@ -1361,21 +1222,32 @@ pub mod pallet { sp_api::decl_runtime_apis! { /// This runtime api allows people to query the size of the liquidity pools /// and quote prices for swaps. - pub trait AssetConversionApi where + pub trait AssetConversionApi + where Balance: frame_support::traits::tokens::Balance + MaybeDisplay, - AssetId: Codec + AssetId: Codec, { /// Provides a quote for [`Pallet::swap_tokens_for_exact_tokens`]. /// /// Note that the price may have changed by the time the transaction is executed. /// (Use `amount_in_max` to control slippage.) - fn quote_price_tokens_for_exact_tokens(asset1: AssetId, asset2: AssetId, amount: Balance, include_fee: bool) -> Option; + fn quote_price_tokens_for_exact_tokens( + asset1: AssetId, + asset2: AssetId, + amount: Balance, + include_fee: bool, + ) -> Option; /// Provides a quote for [`Pallet::swap_exact_tokens_for_tokens`]. /// /// Note that the price may have changed by the time the transaction is executed. /// (Use `amount_out_min` to control slippage.) - fn quote_price_exact_tokens_for_tokens(asset1: AssetId, asset2: AssetId, amount: Balance, include_fee: bool) -> Option; + fn quote_price_exact_tokens_for_tokens( + asset1: AssetId, + asset2: AssetId, + amount: Balance, + include_fee: bool, + ) -> Option; /// Returns the size of the liquidity pool for the given asset pair. fn get_reserves(asset1: AssetId, asset2: AssetId) -> Option<(Balance, Balance)>; diff --git a/substrate/frame/asset-conversion/src/mock.rs b/substrate/frame/asset-conversion/src/mock.rs index 4850eb1e833..12c8fe2eb42 100644 --- a/substrate/frame/asset-conversion/src/mock.rs +++ b/substrate/frame/asset-conversion/src/mock.rs @@ -19,12 +19,17 @@ use super::*; use crate as pallet_asset_conversion; - use frame_support::{ construct_runtime, derive_impl, instances::{Instance1, Instance2}, ord_parameter_types, parameter_types, - traits::{AsEnsureOriginWithArg, ConstU128, ConstU32, ConstU64}, + traits::{ + tokens::{ + fungible::{NativeFromLeft, NativeOrWithId, UnionOf}, + imbalance::ResolveAssetTo, + }, + AsEnsureOriginWithArg, ConstU128, ConstU32, ConstU64, + }, PalletId, }; use frame_system::{EnsureSigned, EnsureSignedBy}; @@ -34,6 +39,7 @@ use sp_runtime::{ traits::{AccountIdConversion, BlakeTwo256, IdentityLookup}, BuildStorage, }; +use sp_std::default::Default; type Block = frame_system::mocking::MockBlock; @@ -143,37 +149,37 @@ impl pallet_assets::Config for Test { parameter_types! { pub const AssetConversionPalletId: PalletId = PalletId(*b"py/ascon"); - pub storage AllowMultiAssetPools: bool = true; - pub storage LiquidityWithdrawalFee: Permill = Permill::from_percent(0); // should be non-zero if AllowMultiAssetPools is true, otherwise can be zero + pub const Native: NativeOrWithId = NativeOrWithId::Native; + pub storage LiquidityWithdrawalFee: Permill = Permill::from_percent(0); } ord_parameter_types! { pub const AssetConversionOrigin: u128 = AccountIdConversion::::into_account_truncating(&AssetConversionPalletId::get()); } +pub type NativeAndAssets = UnionOf, u128>; +pub type AscendingLocator = Ascending>; +pub type WithFirstAssetLocator = WithFirstAsset>; + impl Config for Test { type RuntimeEvent = RuntimeEvent; - type Currency = Balances; - type AssetId = u32; + type Balance = ::Balance; + type HigherPrecisionBalance = sp_core::U256; + type AssetKind = NativeOrWithId; + type Assets = NativeAndAssets; + type PoolId = (Self::AssetKind, Self::AssetKind); + type PoolLocator = Chain; type PoolAssetId = u32; - type Assets = Assets; type PoolAssets = PoolAssets; + type PoolSetupFee = ConstU128<100>; // should be more or equal to the existential deposit + type PoolSetupFeeAsset = Native; + type PoolSetupFeeTarget = ResolveAssetTo; type PalletId = AssetConversionPalletId; type WeightInfo = (); type LPFee = ConstU32<3>; // means 0.3% - type PoolSetupFee = ConstU128<100>; // should be more or equal to the existential deposit - type PoolSetupFeeReceiver = AssetConversionOrigin; type LiquidityWithdrawalFee = LiquidityWithdrawalFee; - type AllowMultiAssetPools = AllowMultiAssetPools; type MaxSwapPathLength = ConstU32<4>; type MintMinLiquidity = ConstU128<100>; // 100 is good enough when the main currency has 12 decimals. - - type Balance = ::Balance; - type HigherPrecisionBalance = sp_core::U256; - - type MultiAssetId = NativeOrAssetId; - type MultiAssetIdConverter = NativeOrAssetIdConverter; - #[cfg(feature = "runtime-benchmarks")] type BenchmarkHelper = (); } diff --git a/substrate/frame/asset-conversion/src/swap.rs b/substrate/frame/asset-conversion/src/swap.rs index 7f59b8f9b80..a6154e29414 100644 --- a/substrate/frame/asset-conversion/src/swap.rs +++ b/substrate/frame/asset-conversion/src/swap.rs @@ -24,7 +24,7 @@ pub trait Swap { /// Measure units of the asset classes for swapping. type Balance: Balance; /// Kind of assets that are going to be swapped. - type MultiAssetId; + type AssetKind; /// Returns the upper limit on the length of the swap path. fn max_path_len() -> u32; @@ -41,7 +41,7 @@ pub trait Swap { /// This operation is expected to be atomic. fn swap_exact_tokens_for_tokens( sender: AccountId, - path: Vec, + path: Vec, amount_in: Self::Balance, amount_out_min: Option, send_to: AccountId, @@ -60,7 +60,7 @@ pub trait Swap { /// This operation is expected to be atomic. fn swap_tokens_for_exact_tokens( sender: AccountId, - path: Vec, + path: Vec, amount_out: Self::Balance, amount_in_max: Option, send_to: AccountId, @@ -73,7 +73,7 @@ pub trait SwapCredit { /// Measure units of the asset classes for swapping. type Balance: Balance; /// Kind of assets that are going to be swapped. - type MultiAssetId; + type AssetKind; /// Credit implying a negative imbalance in the system that can be placed into an account or /// alter the total supply. type Credit; @@ -90,7 +90,7 @@ pub trait SwapCredit { /// /// This operation is expected to be atomic. fn swap_exact_tokens_for_tokens( - path: Vec, + path: Vec, credit_in: Self::Credit, amount_out_min: Option, ) -> Result; @@ -106,7 +106,7 @@ pub trait SwapCredit { /// /// This operation is expected to be atomic. fn swap_tokens_for_exact_tokens( - path: Vec, + path: Vec, credit_in: Self::Credit, amount_out: Self::Balance, ) -> Result<(Self::Credit, Self::Credit), (Self::Credit, DispatchError)>; @@ -114,7 +114,7 @@ pub trait SwapCredit { impl Swap for Pallet { type Balance = T::Balance; - type MultiAssetId = T::MultiAssetId; + type AssetKind = T::AssetKind; fn max_path_len() -> u32 { T::MaxSwapPathLength::get() @@ -122,7 +122,7 @@ impl Swap for Pallet { fn swap_exact_tokens_for_tokens( sender: T::AccountId, - path: Vec, + path: Vec, amount_in: Self::Balance, amount_out_min: Option, send_to: T::AccountId, @@ -138,12 +138,12 @@ impl Swap for Pallet { keep_alive, ) })?; - Ok(amount_out.into()) + Ok(amount_out) } fn swap_tokens_for_exact_tokens( sender: T::AccountId, - path: Vec, + path: Vec, amount_out: Self::Balance, amount_in_max: Option, send_to: T::AccountId, @@ -159,24 +159,25 @@ impl Swap for Pallet { keep_alive, ) })?; - Ok(amount_in.into()) + Ok(amount_in) } } impl SwapCredit for Pallet { type Balance = T::Balance; - type MultiAssetId = T::MultiAssetId; - type Credit = Credit; + type AssetKind = T::AssetKind; + type Credit = CreditOf; fn max_path_len() -> u32 { T::MaxSwapPathLength::get() } fn swap_exact_tokens_for_tokens( - path: Vec, + path: Vec, credit_in: Self::Credit, amount_out_min: Option, ) -> Result { + let credit_asset = credit_in.asset(); with_transaction(|| -> TransactionOutcome> { let res = Self::do_swap_exact_credit_tokens_for_tokens(path, credit_in, amount_out_min); match &res { @@ -187,14 +188,15 @@ impl SwapCredit for Pallet { } }) // should never map an error since `with_transaction` above never returns it. - .map_err(|_| (Self::Credit::native_zero(), DispatchError::Corruption))? + .map_err(|_| (Self::Credit::zero(credit_asset), DispatchError::Corruption))? } fn swap_tokens_for_exact_tokens( - path: Vec, + path: Vec, credit_in: Self::Credit, amount_out: Self::Balance, ) -> Result<(Self::Credit, Self::Credit), (Self::Credit, DispatchError)> { + let credit_asset = credit_in.asset(); with_transaction(|| -> TransactionOutcome> { let res = Self::do_swap_credit_tokens_for_exact_tokens(path, credit_in, amount_out); match &res { @@ -205,6 +207,6 @@ impl SwapCredit for Pallet { } }) // should never map an error since `with_transaction` above never returns it. - .map_err(|_| (Self::Credit::native_zero(), DispatchError::Corruption))? + .map_err(|_| (Self::Credit::zero(credit_asset), DispatchError::Corruption))? } } diff --git a/substrate/frame/asset-conversion/src/tests.rs b/substrate/frame/asset-conversion/src/tests.rs index db6aca01dec..e69d14fcb3c 100644 --- a/substrate/frame/asset-conversion/src/tests.rs +++ b/substrate/frame/asset-conversion/src/tests.rs @@ -19,7 +19,13 @@ use crate::{mock::*, *}; use frame_support::{ assert_noop, assert_ok, assert_storage_noop, instances::Instance1, - traits::{fungible, fungibles, fungibles::InspectEnumerable, Get}, + traits::{ + fungible, + fungible::{Inspect as FungibleInspect, NativeOrWithId}, + fungibles, + fungibles::{Inspect, InspectEnumerable}, + Get, + }, }; use sp_arithmetic::Permill; use sp_runtime::{DispatchError, TokenError}; @@ -42,18 +48,14 @@ fn events() -> Vec> { result } -fn pools() -> Vec> { +fn pools() -> Vec<::PoolId> { let mut s: Vec<_> = Pools::::iter().map(|x| x.0).collect(); s.sort(); s } -fn assets() -> Vec> { - // if the storage would be public: - // let mut s: Vec<_> = pallet_assets::pallet::Asset::::iter().map(|x| x.0).collect(); - let mut s: Vec<_> = <::Assets>::asset_ids() - .map(|id| NativeOrAssetId::Asset(id)) - .collect(); +fn assets() -> Vec> { + let mut s: Vec<_> = Assets::asset_ids().map(|id| NativeOrWithId::WithId(id)).collect(); s.sort(); s } @@ -64,40 +66,71 @@ fn pool_assets() -> Vec { s } -fn create_tokens(owner: u128, tokens: Vec>) { +fn create_tokens(owner: u128, tokens: Vec>) { create_tokens_with_ed(owner, tokens, 1) } -fn create_tokens_with_ed(owner: u128, tokens: Vec>, ed: u128) { +fn create_tokens_with_ed(owner: u128, tokens: Vec>, ed: u128) { for token_id in tokens { - let MultiAssetIdConversionResult::Converted(asset_id) = - NativeOrAssetIdConverter::try_convert(&token_id) - else { - unreachable!("invalid token") + let asset_id = match token_id { + NativeOrWithId::WithId(id) => id, + _ => unreachable!("invalid token"), }; assert_ok!(Assets::force_create(RuntimeOrigin::root(), asset_id, owner, false, ed)); } } -fn balance(owner: u128, token_id: NativeOrAssetId) -> u128 { - match token_id { - NativeOrAssetId::Native => <::Currency>::free_balance(owner), - NativeOrAssetId::Asset(token_id) => <::Assets>::balance(token_id, owner), - } +fn balance(owner: u128, token_id: NativeOrWithId) -> u128 { + <::Assets>::balance(token_id, &owner) } fn pool_balance(owner: u128, token_id: u32) -> u128 { <::PoolAssets>::balance(token_id, owner) } -fn get_ed() -> u128 { - <::Currency>::minimum_balance() +fn get_native_ed() -> u128 { + <::Assets>::minimum_balance(NativeOrWithId::Native) } macro_rules! bvec { - ($( $x:ident ),*) => { + ($($x:expr),+ $(,)?) => ( vec![$( Box::new( $x ), )*] - } + ) +} + +#[test] +fn validate_with_first_asset_pool_id_locator() { + new_test_ext().execute_with(|| { + use NativeOrWithId::{Native, WithId}; + assert_eq!(WithFirstAssetLocator::pool_id(&Native, &WithId(2)), Ok((Native, WithId(2)))); + assert_eq!(WithFirstAssetLocator::pool_id(&WithId(2), &Native), Ok((Native, WithId(2)))); + assert_noop!(WithFirstAssetLocator::pool_id(&Native, &Native), ()); + assert_noop!(WithFirstAssetLocator::pool_id(&WithId(2), &WithId(1)), ()); + }); +} + +#[test] +fn validate_ascending_pool_id_locator() { + new_test_ext().execute_with(|| { + use NativeOrWithId::{Native, WithId}; + assert_eq!(AscendingLocator::pool_id(&Native, &WithId(2)), Ok((Native, WithId(2)))); + assert_eq!(AscendingLocator::pool_id(&WithId(2), &Native), Ok((Native, WithId(2)))); + assert_eq!(AscendingLocator::pool_id(&WithId(2), &WithId(1)), Ok((WithId(1), WithId(2)))); + assert_eq!(AscendingLocator::pool_id(&Native, &Native), Err(())); + assert_eq!(AscendingLocator::pool_id(&WithId(1), &WithId(1)), Err(())); + }); +} + +#[test] +fn validate_native_or_with_id_sorting() { + new_test_ext().execute_with(|| { + use NativeOrWithId::{Native, WithId}; + assert!(WithId(2) > WithId(1)); + assert!(WithId(1) <= WithId(1)); + assert_eq!(WithId(1), WithId(1)); + assert_eq!(Native::, Native::); + assert!(Native < WithId(1)); + }); } #[test] @@ -106,10 +139,11 @@ fn check_pool_accounts_dont_collide() { let mut map = HashSet::new(); for i in 0..1_000_000u32 { - let account = AssetConversion::get_pool_account(&( - NativeOrAssetId::Native, - NativeOrAssetId::Asset(i), - )); + let account: u128 = ::PoolLocator::address(&( + NativeOrWithId::Native, + NativeOrWithId::WithId(i), + )) + .unwrap(); if map.contains(&account) { panic!("Collision at {}", i); } @@ -141,79 +175,67 @@ fn can_create_pool() { let asset_account_deposit: u128 = >::AssetAccountDeposit::get(); let user = 1; - let token_1 = NativeOrAssetId::Native; - let token_2 = NativeOrAssetId::Asset(2); - let pool_id = (token_1, token_2); + let token_1 = NativeOrWithId::Native; + let token_2 = NativeOrWithId::WithId(2); + let pool_id = (token_1.clone(), token_2.clone()); - create_tokens(user, vec![token_2]); + create_tokens(user, vec![token_2.clone()]); let lp_token = AssetConversion::get_next_pool_asset_id(); assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 1000)); assert_ok!(AssetConversion::create_pool( RuntimeOrigin::signed(user), - Box::new(token_2), - Box::new(token_1) + Box::new(token_2.clone()), + Box::new(token_1.clone()) )); let setup_fee = <::PoolSetupFee as Get<::Balance>>::get(); - let pool_account = <::PoolSetupFeeReceiver as Get>::get(); + let pool_account = AssetConversionOrigin::get(); assert_eq!( - balance(user, NativeOrAssetId::Native), + balance(user, NativeOrWithId::Native), 1000 - (setup_fee + asset_account_deposit) ); - assert_eq!(balance(pool_account, NativeOrAssetId::Native), setup_fee); + assert_eq!(balance(pool_account, NativeOrWithId::Native), setup_fee); assert_eq!(lp_token + 1, AssetConversion::get_next_pool_asset_id()); assert_eq!( events(), [Event::::PoolCreated { creator: user, - pool_id, - pool_account: AssetConversion::get_pool_account(&pool_id), + pool_id: pool_id.clone(), + pool_account: ::PoolLocator::address(&pool_id).unwrap(), lp_token }] ); assert_eq!(pools(), vec![pool_id]); - assert_eq!(assets(), vec![token_2]); + assert_eq!(assets(), vec![token_2.clone()]); assert_eq!(pool_assets(), vec![lp_token]); assert_noop!( AssetConversion::create_pool( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_1) + Box::new(token_1.clone()), + Box::new(token_1.clone()) ), - Error::::EqualAssets + Error::::InvalidAssetPair ); assert_noop!( AssetConversion::create_pool( RuntimeOrigin::signed(user), - Box::new(token_2), - Box::new(token_2) + Box::new(token_2.clone()), + Box::new(token_2.clone()) ), - Error::::EqualAssets + Error::::InvalidAssetPair ); - // validate we can create Asset(1)/Asset(2) pool - let token_1 = NativeOrAssetId::Asset(1); - create_tokens(user, vec![token_1]); + // validate we cannot create WithId(1)/WithId(2) pool + let token_1 = NativeOrWithId::WithId(1); + create_tokens(user, vec![token_1.clone()]); assert_ok!(AssetConversion::create_pool( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2) + Box::new(token_1.clone()), + Box::new(token_2.clone()) )); - - // validate we can force the first asset to be the Native currency only - AllowMultiAssetPools::set(&false); - let token_1 = NativeOrAssetId::Asset(3); - assert_noop!( - AssetConversion::create_pool( - RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2) - ), - Error::::PoolMustContainNativeCurrency - ); }); } @@ -221,16 +243,16 @@ fn can_create_pool() { fn create_same_pool_twice_should_fail() { new_test_ext().execute_with(|| { let user = 1; - let token_1 = NativeOrAssetId::Native; - let token_2 = NativeOrAssetId::Asset(2); + let token_1 = NativeOrWithId::Native; + let token_2 = NativeOrWithId::WithId(2); - create_tokens(user, vec![token_2]); + create_tokens(user, vec![token_2.clone()]); let lp_token = AssetConversion::get_next_pool_asset_id(); assert_ok!(AssetConversion::create_pool( RuntimeOrigin::signed(user), - Box::new(token_2), - Box::new(token_1) + Box::new(token_2.clone()), + Box::new(token_1.clone()) )); let expected_free = lp_token + 1; assert_eq!(expected_free, AssetConversion::get_next_pool_asset_id()); @@ -238,8 +260,8 @@ fn create_same_pool_twice_should_fail() { assert_noop!( AssetConversion::create_pool( RuntimeOrigin::signed(user), - Box::new(token_2), - Box::new(token_1) + Box::new(token_2.clone()), + Box::new(token_1.clone()) ), Error::::PoolExists ); @@ -249,8 +271,8 @@ fn create_same_pool_twice_should_fail() { assert_noop!( AssetConversion::create_pool( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2) + Box::new(token_1.clone()), + Box::new(token_2.clone()) ), Error::::PoolExists ); @@ -262,19 +284,19 @@ fn create_same_pool_twice_should_fail() { fn different_pools_should_have_different_lp_tokens() { new_test_ext().execute_with(|| { let user = 1; - let token_1 = NativeOrAssetId::Native; - let token_2 = NativeOrAssetId::Asset(2); - let token_3 = NativeOrAssetId::Asset(3); - let pool_id_1_2 = (token_1, token_2); - let pool_id_1_3 = (token_1, token_3); + let token_1 = NativeOrWithId::Native; + let token_2 = NativeOrWithId::WithId(2); + let token_3 = NativeOrWithId::WithId(3); + let pool_id_1_2 = (token_1.clone(), token_2.clone()); + let pool_id_1_3 = (token_1.clone(), token_3.clone()); - create_tokens(user, vec![token_2, token_3]); + create_tokens(user, vec![token_2.clone(), token_3.clone()]); let lp_token2_1 = AssetConversion::get_next_pool_asset_id(); assert_ok!(AssetConversion::create_pool( RuntimeOrigin::signed(user), - Box::new(token_2), - Box::new(token_1) + Box::new(token_2.clone()), + Box::new(token_1.clone()) )); let lp_token3_1 = AssetConversion::get_next_pool_asset_id(); @@ -282,23 +304,23 @@ fn different_pools_should_have_different_lp_tokens() { events(), [Event::::PoolCreated { creator: user, - pool_id: pool_id_1_2, - pool_account: AssetConversion::get_pool_account(&pool_id_1_2), + pool_id: pool_id_1_2.clone(), + pool_account: ::PoolLocator::address(&pool_id_1_2).unwrap(), lp_token: lp_token2_1 }] ); assert_ok!(AssetConversion::create_pool( RuntimeOrigin::signed(user), - Box::new(token_3), - Box::new(token_1) + Box::new(token_3.clone()), + Box::new(token_1.clone()) )); assert_eq!( events(), [Event::::PoolCreated { creator: user, - pool_id: pool_id_1_3, - pool_account: AssetConversion::get_pool_account(&pool_id_1_3), + pool_id: pool_id_1_3.clone(), + pool_account: ::PoolLocator::address(&pool_id_1_3).unwrap(), lp_token: lp_token3_1, }] ); @@ -311,33 +333,33 @@ fn different_pools_should_have_different_lp_tokens() { fn can_add_liquidity() { new_test_ext().execute_with(|| { let user = 1; - let token_1 = NativeOrAssetId::Native; - let token_2 = NativeOrAssetId::Asset(2); - let token_3 = NativeOrAssetId::Asset(3); + let token_1 = NativeOrWithId::Native; + let token_2 = NativeOrWithId::WithId(2); + let token_3 = NativeOrWithId::WithId(3); - create_tokens(user, vec![token_2, token_3]); + create_tokens(user, vec![token_2.clone(), token_3.clone()]); let lp_token1 = AssetConversion::get_next_pool_asset_id(); assert_ok!(AssetConversion::create_pool( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2) + Box::new(token_1.clone()), + Box::new(token_2.clone()) )); let lp_token2 = AssetConversion::get_next_pool_asset_id(); assert_ok!(AssetConversion::create_pool( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_3) + Box::new(token_1.clone()), + Box::new(token_3.clone()) )); - let ed = get_ed(); + let ed = get_native_ed(); assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 10000 * 2 + ed)); assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, user, 1000)); assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 3, user, 1000)); assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2), + Box::new(token_1.clone()), + Box::new(token_2.clone()), 10000, 10, 10000, @@ -345,28 +367,28 @@ fn can_add_liquidity() { user, )); - let pool_id = (token_1, token_2); + let pool_id = (token_1.clone(), token_2.clone()); assert!(events().contains(&Event::::LiquidityAdded { who: user, mint_to: user, - pool_id, + pool_id: pool_id.clone(), amount1_provided: 10000, amount2_provided: 10, lp_token: lp_token1, lp_token_minted: 216, })); - let pallet_account = AssetConversion::get_pool_account(&pool_id); - assert_eq!(balance(pallet_account, token_1), 10000); - assert_eq!(balance(pallet_account, token_2), 10); - assert_eq!(balance(user, token_1), 10000 + ed); - assert_eq!(balance(user, token_2), 1000 - 10); + let pallet_account = ::PoolLocator::address(&pool_id).unwrap(); + assert_eq!(balance(pallet_account, token_1.clone()), 10000); + assert_eq!(balance(pallet_account, token_2.clone()), 10); + assert_eq!(balance(user, token_1.clone()), 10000 + ed); + assert_eq!(balance(user, token_2.clone()), 1000 - 10); assert_eq!(pool_balance(user, lp_token1), 216); // try to pass the non-native - native assets, the result should be the same assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - Box::new(token_3), - Box::new(token_1), + Box::new(token_3.clone()), + Box::new(token_1.clone()), 10, 10000, 10, @@ -374,21 +396,21 @@ fn can_add_liquidity() { user, )); - let pool_id = (token_1, token_3); + let pool_id = (token_1.clone(), token_3.clone()); assert!(events().contains(&Event::::LiquidityAdded { who: user, mint_to: user, - pool_id, - amount1_provided: 10000, - amount2_provided: 10, + pool_id: pool_id.clone(), + amount1_provided: 10, + amount2_provided: 10000, lp_token: lp_token2, lp_token_minted: 216, })); - let pallet_account = AssetConversion::get_pool_account(&pool_id); - assert_eq!(balance(pallet_account, token_1), 10000); - assert_eq!(balance(pallet_account, token_3), 10); - assert_eq!(balance(user, token_1), ed); - assert_eq!(balance(user, token_3), 1000 - 10); + let pallet_account = ::PoolLocator::address(&pool_id).unwrap(); + assert_eq!(balance(pallet_account, token_1.clone()), 10000); + assert_eq!(balance(pallet_account, token_3.clone()), 10); + assert_eq!(balance(user, token_1.clone()), ed); + assert_eq!(balance(user, token_3.clone()), 1000 - 10); assert_eq!(pool_balance(user, lp_token2), 216); }); } @@ -397,14 +419,14 @@ fn can_add_liquidity() { fn add_tiny_liquidity_leads_to_insufficient_liquidity_minted_error() { new_test_ext().execute_with(|| { let user = 1; - let token_1 = NativeOrAssetId::Native; - let token_2 = NativeOrAssetId::Asset(2); + let token_1 = NativeOrWithId::Native; + let token_2 = NativeOrWithId::WithId(2); - create_tokens(user, vec![token_2]); + create_tokens(user, vec![token_2.clone()]); assert_ok!(AssetConversion::create_pool( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2) + Box::new(token_1.clone()), + Box::new(token_2.clone()) )); assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 1000)); @@ -413,8 +435,8 @@ fn add_tiny_liquidity_leads_to_insufficient_liquidity_minted_error() { assert_noop!( AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2), + Box::new(token_1.clone()), + Box::new(token_2.clone()), 1, 1, 1, @@ -427,9 +449,9 @@ fn add_tiny_liquidity_leads_to_insufficient_liquidity_minted_error() { assert_noop!( AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2), - get_ed(), + Box::new(token_1.clone()), + Box::new(token_2.clone()), + get_native_ed(), 1, 1, 1, @@ -444,35 +466,37 @@ fn add_tiny_liquidity_leads_to_insufficient_liquidity_minted_error() { fn add_tiny_liquidity_directly_to_pool_address() { new_test_ext().execute_with(|| { let user = 1; - let token_1 = NativeOrAssetId::Native; - let token_2 = NativeOrAssetId::Asset(2); - let token_3 = NativeOrAssetId::Asset(3); + let token_1 = NativeOrWithId::Native; + let token_2 = NativeOrWithId::WithId(2); + let token_3 = NativeOrWithId::WithId(3); - create_tokens(user, vec![token_2, token_3]); + create_tokens(user, vec![token_2.clone(), token_3.clone()]); assert_ok!(AssetConversion::create_pool( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2) + Box::new(token_1.clone()), + Box::new(token_2.clone()) )); assert_ok!(AssetConversion::create_pool( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_3) + Box::new(token_1.clone()), + Box::new(token_3.clone()) )); - let ed = get_ed(); + let ed = get_native_ed(); assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 10000 * 2 + ed)); assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, user, 1000)); assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 3, user, 1000)); - // check we're still able to add the liquidity even when the pool already has some token_1 - let pallet_account = AssetConversion::get_pool_account(&(token_1, token_2)); + // check we're still able to add the liquidity even when the pool already has some + // token_1.clone() + let pallet_account = + ::PoolLocator::address(&(token_1.clone(), token_2.clone())).unwrap(); assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), pallet_account, 1000)); assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2), + Box::new(token_1.clone()), + Box::new(token_2.clone()), 10000, 10, 10000, @@ -480,13 +504,11 @@ fn add_tiny_liquidity_directly_to_pool_address() { user, )); - // check the same but for token_3 (non-native token) - let pallet_account = AssetConversion::get_pool_account(&(token_1, token_3)); - assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, pallet_account, 1)); + // check the same but for token_3.clone() (non-native token) assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_3), + Box::new(token_1.clone()), + Box::new(token_3.clone()), 10000, 10, 10000, @@ -500,16 +522,16 @@ fn add_tiny_liquidity_directly_to_pool_address() { fn can_remove_liquidity() { new_test_ext().execute_with(|| { let user = 1; - let token_1 = NativeOrAssetId::Native; - let token_2 = NativeOrAssetId::Asset(2); - let pool_id = (token_1, token_2); + let token_1 = NativeOrWithId::Native; + let token_2 = NativeOrWithId::WithId(2); + let pool_id = (token_1.clone(), token_2.clone()); - create_tokens(user, vec![token_2]); + create_tokens(user, vec![token_2.clone()]); let lp_token = AssetConversion::get_next_pool_asset_id(); assert_ok!(AssetConversion::create_pool( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2) + Box::new(token_1.clone()), + Box::new(token_2.clone()) )); let ed_token_1 = >::minimum_balance(); @@ -523,8 +545,8 @@ fn can_remove_liquidity() { assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2), + Box::new(token_1.clone()), + Box::new(token_2.clone()), 1000000000, 100000, 1000000000, @@ -537,8 +559,8 @@ fn can_remove_liquidity() { assert_ok!(AssetConversion::remove_liquidity( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2), + Box::new(token_1.clone()), + Box::new(token_2.clone()), total_lp_received, 0, 0, @@ -548,7 +570,7 @@ fn can_remove_liquidity() { assert!(events().contains(&Event::::LiquidityRemoved { who: user, withdraw_to: user, - pool_id, + pool_id: pool_id.clone(), amount1: 899991000, amount2: 89999, lp_token, @@ -556,13 +578,16 @@ fn can_remove_liquidity() { withdrawal_fee: ::LiquidityWithdrawalFee::get() })); - let pool_account = AssetConversion::get_pool_account(&pool_id); - assert_eq!(balance(pool_account, token_1), 100009000); - assert_eq!(balance(pool_account, token_2), 10001); + let pool_account = ::PoolLocator::address(&pool_id).unwrap(); + assert_eq!(balance(pool_account, token_1.clone()), 100009000); + assert_eq!(balance(pool_account, token_2.clone()), 10001); assert_eq!(pool_balance(pool_account, lp_token), 100); - assert_eq!(balance(user, token_1), 10000000000 - 1000000000 + 899991000 + ed_token_1); - assert_eq!(balance(user, token_2), 89999 + ed_token_2); + assert_eq!( + balance(user, token_1.clone()), + 10000000000 - 1000000000 + 899991000 + ed_token_1 + ); + assert_eq!(balance(user, token_2.clone()), 89999 + ed_token_2); assert_eq!(pool_balance(user, lp_token), 0); }); } @@ -571,24 +596,28 @@ fn can_remove_liquidity() { fn can_not_redeem_more_lp_tokens_than_were_minted() { new_test_ext().execute_with(|| { let user = 1; - let token_1 = NativeOrAssetId::Native; - let token_2 = NativeOrAssetId::Asset(2); + let token_1 = NativeOrWithId::Native; + let token_2 = NativeOrWithId::WithId(2); let lp_token = AssetConversion::get_next_pool_asset_id(); - create_tokens(user, vec![token_2]); + create_tokens(user, vec![token_2.clone()]); assert_ok!(AssetConversion::create_pool( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2) + Box::new(token_1.clone()), + Box::new(token_2.clone()) )); - assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 10000 + get_ed())); + assert_ok!(Balances::force_set_balance( + RuntimeOrigin::root(), + user, + 10000 + get_native_ed() + )); assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, user, 1000)); assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2), + Box::new(token_1.clone()), + Box::new(token_2.clone()), 10000, 10, 10000, @@ -602,8 +631,8 @@ fn can_not_redeem_more_lp_tokens_than_were_minted() { assert_noop!( AssetConversion::remove_liquidity( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2), + Box::new(token_1.clone()), + Box::new(token_2.clone()), 216 + 1, // Try and redeem 10 lp tokens while only 9 minted. 0, 0, @@ -618,14 +647,14 @@ fn can_not_redeem_more_lp_tokens_than_were_minted() { fn can_quote_price() { new_test_ext().execute_with(|| { let user = 1; - let token_1 = NativeOrAssetId::Native; - let token_2 = NativeOrAssetId::Asset(2); + let token_1 = NativeOrWithId::Native; + let token_2 = NativeOrWithId::WithId(2); - create_tokens(user, vec![token_2]); + create_tokens(user, vec![token_2.clone()]); assert_ok!(AssetConversion::create_pool( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2) + Box::new(token_1.clone()), + Box::new(token_2.clone()) )); assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 100000)); @@ -633,8 +662,8 @@ fn can_quote_price() { assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2), + Box::new(token_1.clone()), + Box::new(token_2.clone()), 10000, 200, 1, @@ -644,8 +673,8 @@ fn can_quote_price() { assert_eq!( AssetConversion::quote_price_exact_tokens_for_tokens( - NativeOrAssetId::Native, - NativeOrAssetId::Asset(2), + NativeOrWithId::Native, + NativeOrWithId::WithId(2), 3000, false, ), @@ -654,8 +683,8 @@ fn can_quote_price() { // including fee so should get less out... assert_eq!( AssetConversion::quote_price_exact_tokens_for_tokens( - NativeOrAssetId::Native, - NativeOrAssetId::Asset(2), + NativeOrWithId::Native, + NativeOrWithId::WithId(2), 3000, true, ), @@ -665,8 +694,8 @@ fn can_quote_price() { // (if the above accidentally exchanged then it would not give same quote as before) assert_eq!( AssetConversion::quote_price_exact_tokens_for_tokens( - NativeOrAssetId::Native, - NativeOrAssetId::Asset(2), + NativeOrWithId::Native, + NativeOrWithId::WithId(2), 3000, false, ), @@ -675,8 +704,8 @@ fn can_quote_price() { // including fee so should get less out... assert_eq!( AssetConversion::quote_price_exact_tokens_for_tokens( - NativeOrAssetId::Native, - NativeOrAssetId::Asset(2), + NativeOrWithId::Native, + NativeOrWithId::WithId(2), 3000, true, ), @@ -686,8 +715,8 @@ fn can_quote_price() { // Check inverse: assert_eq!( AssetConversion::quote_price_exact_tokens_for_tokens( - NativeOrAssetId::Asset(2), - NativeOrAssetId::Native, + NativeOrWithId::WithId(2), + NativeOrWithId::Native, 60, false, ), @@ -696,8 +725,8 @@ fn can_quote_price() { // including fee so should get less out... assert_eq!( AssetConversion::quote_price_exact_tokens_for_tokens( - NativeOrAssetId::Asset(2), - NativeOrAssetId::Native, + NativeOrWithId::WithId(2), + NativeOrWithId::Native, 60, true, ), @@ -709,8 +738,8 @@ fn can_quote_price() { // assert_eq!( AssetConversion::quote_price_tokens_for_exact_tokens( - NativeOrAssetId::Native, - NativeOrAssetId::Asset(2), + NativeOrWithId::Native, + NativeOrWithId::WithId(2), 60, false, ), @@ -719,8 +748,8 @@ fn can_quote_price() { // including fee so should need to put more in... assert_eq!( AssetConversion::quote_price_tokens_for_exact_tokens( - NativeOrAssetId::Native, - NativeOrAssetId::Asset(2), + NativeOrWithId::Native, + NativeOrWithId::WithId(2), 60, true, ), @@ -730,8 +759,8 @@ fn can_quote_price() { // (if the above accidentally exchanged then it would not give same quote as before) assert_eq!( AssetConversion::quote_price_tokens_for_exact_tokens( - NativeOrAssetId::Native, - NativeOrAssetId::Asset(2), + NativeOrWithId::Native, + NativeOrWithId::WithId(2), 60, false, ), @@ -740,8 +769,8 @@ fn can_quote_price() { // including fee so should need to put more in... assert_eq!( AssetConversion::quote_price_tokens_for_exact_tokens( - NativeOrAssetId::Native, - NativeOrAssetId::Asset(2), + NativeOrWithId::Native, + NativeOrWithId::WithId(2), 60, true, ), @@ -751,8 +780,8 @@ fn can_quote_price() { // Check inverse: assert_eq!( AssetConversion::quote_price_tokens_for_exact_tokens( - NativeOrAssetId::Asset(2), - NativeOrAssetId::Native, + NativeOrWithId::WithId(2), + NativeOrWithId::Native, 3000, false, ), @@ -761,8 +790,8 @@ fn can_quote_price() { // including fee so should need to put more in... assert_eq!( AssetConversion::quote_price_tokens_for_exact_tokens( - NativeOrAssetId::Asset(2), - NativeOrAssetId::Native, + NativeOrWithId::WithId(2), + NativeOrWithId::Native, 3000, true, ), @@ -776,14 +805,14 @@ fn can_quote_price() { assert_eq!( AssetConversion::quote_price_exact_tokens_for_tokens( - NativeOrAssetId::Asset(2), - NativeOrAssetId::Native, + NativeOrWithId::WithId(2), + NativeOrWithId::Native, amount_in, false, ) .and_then(|amount| AssetConversion::quote_price_exact_tokens_for_tokens( - NativeOrAssetId::Native, - NativeOrAssetId::Asset(2), + NativeOrWithId::Native, + NativeOrWithId::WithId(2), amount, false, )), @@ -791,14 +820,14 @@ fn can_quote_price() { ); assert_eq!( AssetConversion::quote_price_exact_tokens_for_tokens( - NativeOrAssetId::Native, - NativeOrAssetId::Asset(2), + NativeOrWithId::Native, + NativeOrWithId::WithId(2), amount_in, false, ) .and_then(|amount| AssetConversion::quote_price_exact_tokens_for_tokens( - NativeOrAssetId::Asset(2), - NativeOrAssetId::Native, + NativeOrWithId::WithId(2), + NativeOrWithId::Native, amount, false, )), @@ -807,14 +836,14 @@ fn can_quote_price() { assert_eq!( AssetConversion::quote_price_tokens_for_exact_tokens( - NativeOrAssetId::Asset(2), - NativeOrAssetId::Native, + NativeOrWithId::WithId(2), + NativeOrWithId::Native, amount_in, false, ) .and_then(|amount| AssetConversion::quote_price_tokens_for_exact_tokens( - NativeOrAssetId::Native, - NativeOrAssetId::Asset(2), + NativeOrWithId::Native, + NativeOrWithId::WithId(2), amount, false, )), @@ -822,14 +851,14 @@ fn can_quote_price() { ); assert_eq!( AssetConversion::quote_price_tokens_for_exact_tokens( - NativeOrAssetId::Native, - NativeOrAssetId::Asset(2), + NativeOrWithId::Native, + NativeOrWithId::WithId(2), amount_in, false, ) .and_then(|amount| AssetConversion::quote_price_tokens_for_exact_tokens( - NativeOrAssetId::Asset(2), - NativeOrAssetId::Native, + NativeOrWithId::WithId(2), + NativeOrWithId::Native, amount, false, )), @@ -843,14 +872,14 @@ fn quote_price_exact_tokens_for_tokens_matches_execution() { new_test_ext().execute_with(|| { let user = 1; let user2 = 2; - let token_1 = NativeOrAssetId::Native; - let token_2 = NativeOrAssetId::Asset(2); + let token_1 = NativeOrWithId::Native; + let token_2 = NativeOrWithId::WithId(2); - create_tokens(user, vec![token_2]); + create_tokens(user, vec![token_2.clone()]); assert_ok!(AssetConversion::create_pool( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2) + Box::new(token_1.clone()), + Box::new(token_2.clone()) )); assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 100000)); @@ -858,8 +887,8 @@ fn quote_price_exact_tokens_for_tokens_matches_execution() { assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2), + Box::new(token_1.clone()), + Box::new(token_2.clone()), 10000, 200, 1, @@ -870,23 +899,28 @@ fn quote_price_exact_tokens_for_tokens_matches_execution() { let amount = 1; let quoted_price = 49; assert_eq!( - AssetConversion::quote_price_exact_tokens_for_tokens(token_2, token_1, amount, true,), + AssetConversion::quote_price_exact_tokens_for_tokens( + token_2.clone(), + token_1.clone(), + amount, + true, + ), Some(quoted_price) ); assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, user2, amount)); let prior_dot_balance = 20000; - assert_eq!(prior_dot_balance, balance(user2, token_1)); + assert_eq!(prior_dot_balance, balance(user2, token_1.clone())); assert_ok!(AssetConversion::swap_exact_tokens_for_tokens( RuntimeOrigin::signed(user2), - bvec![token_2, token_1], + bvec![token_2.clone(), token_1.clone()], amount, 1, user2, false, )); - assert_eq!(prior_dot_balance + quoted_price, balance(user2, token_1)); + assert_eq!(prior_dot_balance + quoted_price, balance(user2, token_1.clone())); }); } @@ -895,14 +929,14 @@ fn quote_price_tokens_for_exact_tokens_matches_execution() { new_test_ext().execute_with(|| { let user = 1; let user2 = 2; - let token_1 = NativeOrAssetId::Native; - let token_2 = NativeOrAssetId::Asset(2); + let token_1 = NativeOrWithId::Native; + let token_2 = NativeOrWithId::WithId(2); - create_tokens(user, vec![token_2]); + create_tokens(user, vec![token_2.clone()]); assert_ok!(AssetConversion::create_pool( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2) + Box::new(token_1.clone()), + Box::new(token_2.clone()) )); assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 100000)); @@ -910,8 +944,8 @@ fn quote_price_tokens_for_exact_tokens_matches_execution() { assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2), + Box::new(token_1.clone()), + Box::new(token_2.clone()), 10000, 200, 1, @@ -922,26 +956,31 @@ fn quote_price_tokens_for_exact_tokens_matches_execution() { let amount = 49; let quoted_price = 1; assert_eq!( - AssetConversion::quote_price_tokens_for_exact_tokens(token_2, token_1, amount, true,), + AssetConversion::quote_price_tokens_for_exact_tokens( + token_2.clone(), + token_1.clone(), + amount, + true, + ), Some(quoted_price) ); assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, user2, amount)); let prior_dot_balance = 20000; - assert_eq!(prior_dot_balance, balance(user2, token_1)); + assert_eq!(prior_dot_balance, balance(user2, token_1.clone())); let prior_asset_balance = 49; - assert_eq!(prior_asset_balance, balance(user2, token_2)); + assert_eq!(prior_asset_balance, balance(user2, token_2.clone())); assert_ok!(AssetConversion::swap_tokens_for_exact_tokens( RuntimeOrigin::signed(user2), - bvec![token_2, token_1], + bvec![token_2.clone(), token_1.clone()], amount, 1, user2, false, )); - assert_eq!(prior_dot_balance + amount, balance(user2, token_1)); - assert_eq!(prior_asset_balance - quoted_price, balance(user2, token_2)); + assert_eq!(prior_dot_balance + amount, balance(user2, token_1.clone())); + assert_eq!(prior_asset_balance - quoted_price, balance(user2, token_2.clone())); }); } @@ -949,18 +988,18 @@ fn quote_price_tokens_for_exact_tokens_matches_execution() { fn can_swap_with_native() { new_test_ext().execute_with(|| { let user = 1; - let token_1 = NativeOrAssetId::Native; - let token_2 = NativeOrAssetId::Asset(2); - let pool_id = (token_1, token_2); + let token_1 = NativeOrWithId::Native; + let token_2 = NativeOrWithId::WithId(2); + let pool_id = (token_1.clone(), token_2.clone()); - create_tokens(user, vec![token_2]); + create_tokens(user, vec![token_2.clone()]); assert_ok!(AssetConversion::create_pool( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2) + Box::new(token_1.clone()), + Box::new(token_2.clone()) )); - let ed = get_ed(); + let ed = get_native_ed(); assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 10000 + ed)); assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, user, 1000)); @@ -969,8 +1008,8 @@ fn can_swap_with_native() { assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2), + Box::new(token_1.clone()), + Box::new(token_2.clone()), liquidity1, liquidity2, 1, @@ -986,18 +1025,18 @@ fn can_swap_with_native() { assert_ok!(AssetConversion::swap_exact_tokens_for_tokens( RuntimeOrigin::signed(user), - bvec![token_2, token_1], + bvec![token_2.clone(), token_1.clone()], input_amount, 1, user, false, )); - let pallet_account = AssetConversion::get_pool_account(&pool_id); - assert_eq!(balance(user, token_1), expect_receive + ed); - assert_eq!(balance(user, token_2), 1000 - liquidity2 - input_amount); - assert_eq!(balance(pallet_account, token_1), liquidity1 - expect_receive); - assert_eq!(balance(pallet_account, token_2), liquidity2 + input_amount); + let pallet_account = ::PoolLocator::address(&pool_id).unwrap(); + assert_eq!(balance(user, token_1.clone()), expect_receive + ed); + assert_eq!(balance(user, token_2.clone()), 1000 - liquidity2 - input_amount); + assert_eq!(balance(pallet_account, token_1.clone()), liquidity1 - expect_receive); + assert_eq!(balance(pallet_account, token_2.clone()), liquidity2 + input_amount); }); } @@ -1005,13 +1044,13 @@ fn can_swap_with_native() { fn can_swap_with_realistic_values() { new_test_ext().execute_with(|| { let user = 1; - let dot = NativeOrAssetId::Native; - let usd = NativeOrAssetId::Asset(2); - create_tokens(user, vec![usd]); + let dot = NativeOrWithId::Native; + let usd = NativeOrWithId::WithId(2); + create_tokens(user, vec![usd.clone()]); assert_ok!(AssetConversion::create_pool( RuntimeOrigin::signed(user), - Box::new(dot), - Box::new(usd) + Box::new(dot.clone()), + Box::new(usd.clone()) )); const UNIT: u128 = 1_000_000_000; @@ -1023,8 +1062,8 @@ fn can_swap_with_realistic_values() { let liquidity_usd = 1_000_000 * UNIT; assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - Box::new(dot), - Box::new(usd), + Box::new(dot.clone()), + Box::new(usd.clone()), liquidity_dot, liquidity_usd, 1, @@ -1036,7 +1075,7 @@ fn can_swap_with_realistic_values() { assert_ok!(AssetConversion::swap_exact_tokens_for_tokens( RuntimeOrigin::signed(user), - bvec![usd, dot], + bvec![usd.clone(), dot.clone()], input_amount, 1, user, @@ -1057,21 +1096,21 @@ fn can_swap_with_realistic_values() { fn can_not_swap_in_pool_with_no_liquidity_added_yet() { new_test_ext().execute_with(|| { let user = 1; - let token_1 = NativeOrAssetId::Native; - let token_2 = NativeOrAssetId::Asset(2); + let token_1 = NativeOrWithId::Native; + let token_2 = NativeOrWithId::WithId(2); - create_tokens(user, vec![token_2]); + create_tokens(user, vec![token_2.clone()]); assert_ok!(AssetConversion::create_pool( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2) + Box::new(token_1.clone()), + Box::new(token_2.clone()) )); // Check can't swap an empty pool assert_noop!( AssetConversion::swap_exact_tokens_for_tokens( RuntimeOrigin::signed(user), - bvec![token_2, token_1], + bvec![token_2.clone(), token_1.clone()], 10, 1, user, @@ -1086,19 +1125,19 @@ fn can_not_swap_in_pool_with_no_liquidity_added_yet() { fn check_no_panic_when_try_swap_close_to_empty_pool() { new_test_ext().execute_with(|| { let user = 1; - let token_1 = NativeOrAssetId::Native; - let token_2 = NativeOrAssetId::Asset(2); - let pool_id = (token_1, token_2); + let token_1 = NativeOrWithId::Native; + let token_2 = NativeOrWithId::WithId(2); + let pool_id = (token_1.clone(), token_2.clone()); let lp_token = AssetConversion::get_next_pool_asset_id(); - create_tokens(user, vec![token_2]); + create_tokens(user, vec![token_2.clone()]); assert_ok!(AssetConversion::create_pool( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2) + Box::new(token_1.clone()), + Box::new(token_2.clone()) )); - let ed = get_ed(); + let ed = get_native_ed(); assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 10000 + ed)); assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, user, 1000)); @@ -1107,8 +1146,8 @@ fn check_no_panic_when_try_swap_close_to_empty_pool() { assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2), + Box::new(token_1.clone()), + Box::new(token_2.clone()), liquidity1, liquidity2, 1, @@ -1120,21 +1159,21 @@ fn check_no_panic_when_try_swap_close_to_empty_pool() { assert!(events().contains(&Event::::LiquidityAdded { who: user, mint_to: user, - pool_id, + pool_id: pool_id.clone(), amount1_provided: liquidity1, amount2_provided: liquidity2, lp_token, lp_token_minted, })); - let pallet_account = AssetConversion::get_pool_account(&pool_id); - assert_eq!(balance(pallet_account, token_1), liquidity1); - assert_eq!(balance(pallet_account, token_2), liquidity2); + let pallet_account = ::PoolLocator::address(&pool_id).unwrap(); + assert_eq!(balance(pallet_account, token_1.clone()), liquidity1); + assert_eq!(balance(pallet_account, token_2.clone()), liquidity2); assert_ok!(AssetConversion::remove_liquidity( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2), + Box::new(token_1.clone()), + Box::new(token_2.clone()), lp_token_minted, 1, 1, @@ -1143,14 +1182,14 @@ fn check_no_panic_when_try_swap_close_to_empty_pool() { // Now, the pool should exist but be almost empty. // Let's try and drain it. - assert_eq!(balance(pallet_account, token_1), 708); - assert_eq!(balance(pallet_account, token_2), 15); + assert_eq!(balance(pallet_account, token_1.clone()), 708); + assert_eq!(balance(pallet_account, token_2.clone()), 15); // validate the reserve should always stay above the ED assert_noop!( AssetConversion::swap_tokens_for_exact_tokens( RuntimeOrigin::signed(user), - bvec![token_2, token_1], + bvec![token_2.clone(), token_1.clone()], 708 - ed + 1, // amount_out 500, // amount_in_max user, @@ -1161,15 +1200,15 @@ fn check_no_panic_when_try_swap_close_to_empty_pool() { assert_ok!(AssetConversion::swap_tokens_for_exact_tokens( RuntimeOrigin::signed(user), - bvec![token_2, token_1], + bvec![token_2.clone(), token_1.clone()], 608, // amount_out 500, // amount_in_max user, false, )); - let token_1_left = balance(pallet_account, token_1); - let token_2_left = balance(pallet_account, token_2); + let token_1_left = balance(pallet_account, token_1.clone()); + let token_2_left = balance(pallet_account, token_2.clone()); assert_eq!(token_1_left, 708 - 608); // The price for the last tokens should be very high @@ -1183,7 +1222,7 @@ fn check_no_panic_when_try_swap_close_to_empty_pool() { assert_noop!( AssetConversion::swap_tokens_for_exact_tokens( RuntimeOrigin::signed(user), - bvec![token_2, token_1], + bvec![token_2.clone(), token_1.clone()], token_1_left - 1, // amount_out 1000, // amount_in_max user, @@ -1196,7 +1235,7 @@ fn check_no_panic_when_try_swap_close_to_empty_pool() { assert_noop!( AssetConversion::swap_tokens_for_exact_tokens( RuntimeOrigin::signed(user), - bvec![token_2, token_1], + bvec![token_2.clone(), token_1.clone()], token_1_left, // amount_out 1000, // amount_in_max user, @@ -1211,17 +1250,21 @@ fn check_no_panic_when_try_swap_close_to_empty_pool() { fn swap_should_not_work_if_too_much_slippage() { new_test_ext().execute_with(|| { let user = 1; - let token_1 = NativeOrAssetId::Native; - let token_2 = NativeOrAssetId::Asset(2); + let token_1 = NativeOrWithId::Native; + let token_2 = NativeOrWithId::WithId(2); - create_tokens(user, vec![token_2]); + create_tokens(user, vec![token_2.clone()]); assert_ok!(AssetConversion::create_pool( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2) + Box::new(token_1.clone()), + Box::new(token_2.clone()) )); - assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 10000 + get_ed())); + assert_ok!(Balances::force_set_balance( + RuntimeOrigin::root(), + user, + 10000 + get_native_ed() + )); assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, user, 1000)); let liquidity1 = 10000; @@ -1229,8 +1272,8 @@ fn swap_should_not_work_if_too_much_slippage() { assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2), + Box::new(token_1.clone()), + Box::new(token_2.clone()), liquidity1, liquidity2, 1, @@ -1243,7 +1286,7 @@ fn swap_should_not_work_if_too_much_slippage() { assert_noop!( AssetConversion::swap_exact_tokens_for_tokens( RuntimeOrigin::signed(user), - bvec![token_2, token_1], + bvec![token_2.clone(), token_1.clone()], exchange_amount, // amount_in 4000, // amount_out_min user, @@ -1258,32 +1301,32 @@ fn swap_should_not_work_if_too_much_slippage() { fn can_swap_tokens_for_exact_tokens() { new_test_ext().execute_with(|| { let user = 1; - let token_1 = NativeOrAssetId::Native; - let token_2 = NativeOrAssetId::Asset(2); - let pool_id = (token_1, token_2); + let token_1 = NativeOrWithId::Native; + let token_2 = NativeOrWithId::WithId(2); + let pool_id = (token_1.clone(), token_2.clone()); - create_tokens(user, vec![token_2]); + create_tokens(user, vec![token_2.clone()]); assert_ok!(AssetConversion::create_pool( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2) + Box::new(token_1.clone()), + Box::new(token_2.clone()) )); - let ed = get_ed(); + let ed = get_native_ed(); assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 20000 + ed)); assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, user, 1000)); - let pallet_account = AssetConversion::get_pool_account(&pool_id); - let before1 = balance(pallet_account, token_1) + balance(user, token_1); - let before2 = balance(pallet_account, token_2) + balance(user, token_2); + let pallet_account = ::PoolLocator::address(&pool_id).unwrap(); + let before1 = balance(pallet_account, token_1.clone()) + balance(user, token_1.clone()); + let before2 = balance(pallet_account, token_2.clone()) + balance(user, token_2.clone()); let liquidity1 = 10000; let liquidity2 = 200; assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2), + Box::new(token_1.clone()), + Box::new(token_2.clone()), liquidity1, liquidity2, 1, @@ -1298,23 +1341,29 @@ fn can_swap_tokens_for_exact_tokens() { assert_ok!(AssetConversion::swap_tokens_for_exact_tokens( RuntimeOrigin::signed(user), - bvec![token_1, token_2], + bvec![token_1.clone(), token_2.clone()], exchange_out, // amount_out 3500, // amount_in_max user, true, )); - assert_eq!(balance(user, token_1), 10000 + ed - expect_in); - assert_eq!(balance(user, token_2), 1000 - liquidity2 + exchange_out); - assert_eq!(balance(pallet_account, token_1), liquidity1 + expect_in); - assert_eq!(balance(pallet_account, token_2), liquidity2 - exchange_out); + assert_eq!(balance(user, token_1.clone()), 10000 + ed - expect_in); + assert_eq!(balance(user, token_2.clone()), 1000 - liquidity2 + exchange_out); + assert_eq!(balance(pallet_account, token_1.clone()), liquidity1 + expect_in); + assert_eq!(balance(pallet_account, token_2.clone()), liquidity2 - exchange_out); // check invariants: // native and asset totals should be preserved. - assert_eq!(before1, balance(pallet_account, token_1) + balance(user, token_1)); - assert_eq!(before2, balance(pallet_account, token_2) + balance(user, token_2)); + assert_eq!( + before1, + balance(pallet_account, token_1.clone()) + balance(user, token_1.clone()) + ); + assert_eq!( + before2, + balance(pallet_account, token_2.clone()) + balance(user, token_2.clone()) + ); }); } @@ -1323,38 +1372,40 @@ fn can_swap_tokens_for_exact_tokens_when_not_liquidity_provider() { new_test_ext().execute_with(|| { let user = 1; let user2 = 2; - let token_1 = NativeOrAssetId::Native; - let token_2 = NativeOrAssetId::Asset(2); - let pool_id = (token_1, token_2); + let token_1 = NativeOrWithId::Native; + let token_2 = NativeOrWithId::WithId(2); + let pool_id = (token_1.clone(), token_2.clone()); let lp_token = AssetConversion::get_next_pool_asset_id(); - create_tokens(user2, vec![token_2]); + create_tokens(user2, vec![token_2.clone()]); assert_ok!(AssetConversion::create_pool( RuntimeOrigin::signed(user2), - Box::new(token_1), - Box::new(token_2) + Box::new(token_1.clone()), + Box::new(token_2.clone()) )); - let ed = get_ed(); + let ed = get_native_ed(); let base1 = 10000; let base2 = 1000; assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, base1 + ed)); assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user2, base1 + ed)); assert_ok!(Assets::mint(RuntimeOrigin::signed(user2), 2, user2, base2)); - let pallet_account = AssetConversion::get_pool_account(&pool_id); - let before1 = - balance(pallet_account, token_1) + balance(user, token_1) + balance(user2, token_1); - let before2 = - balance(pallet_account, token_2) + balance(user, token_2) + balance(user2, token_2); + let pallet_account = ::PoolLocator::address(&pool_id).unwrap(); + let before1 = balance(pallet_account, token_1.clone()) + + balance(user, token_1.clone()) + + balance(user2, token_1.clone()); + let before2 = balance(pallet_account, token_2.clone()) + + balance(user, token_2.clone()) + + balance(user2, token_2.clone()); let liquidity1 = 10000; let liquidity2 = 200; assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user2), - Box::new(token_1), - Box::new(token_2), + Box::new(token_1.clone()), + Box::new(token_2.clone()), liquidity1, liquidity2, 1, @@ -1362,8 +1413,8 @@ fn can_swap_tokens_for_exact_tokens_when_not_liquidity_provider() { user2, )); - assert_eq!(balance(user, token_1), base1 + ed); - assert_eq!(balance(user, token_2), 0); + assert_eq!(balance(user, token_1.clone()), base1 + ed); + assert_eq!(balance(user, token_2.clone()), 0); let exchange_out = 50; let expect_in = AssetConversion::get_amount_in(&exchange_out, &liquidity1, &liquidity2) @@ -1372,28 +1423,32 @@ fn can_swap_tokens_for_exact_tokens_when_not_liquidity_provider() { assert_ok!(AssetConversion::swap_tokens_for_exact_tokens( RuntimeOrigin::signed(user), - bvec![token_1, token_2], + bvec![token_1.clone(), token_2.clone()], exchange_out, // amount_out 3500, // amount_in_max user, true, )); - assert_eq!(balance(user, token_1), base1 + ed - expect_in); - assert_eq!(balance(pallet_account, token_1), liquidity1 + expect_in); - assert_eq!(balance(user, token_2), exchange_out); - assert_eq!(balance(pallet_account, token_2), liquidity2 - exchange_out); + assert_eq!(balance(user, token_1.clone()), base1 + ed - expect_in); + assert_eq!(balance(pallet_account, token_1.clone()), liquidity1 + expect_in); + assert_eq!(balance(user, token_2.clone()), exchange_out); + assert_eq!(balance(pallet_account, token_2.clone()), liquidity2 - exchange_out); // check invariants: // native and asset totals should be preserved. assert_eq!( before1, - balance(pallet_account, token_1) + balance(user, token_1) + balance(user2, token_1) + balance(pallet_account, token_1.clone()) + + balance(user, token_1.clone()) + + balance(user2, token_1.clone()) ); assert_eq!( before2, - balance(pallet_account, token_2) + balance(user, token_2) + balance(user2, token_2) + balance(pallet_account, token_2.clone()) + + balance(user, token_2.clone()) + + balance(user2, token_2.clone()) ); let lp_token_minted = pool_balance(user2, lp_token); @@ -1401,8 +1456,8 @@ fn can_swap_tokens_for_exact_tokens_when_not_liquidity_provider() { assert_ok!(AssetConversion::remove_liquidity( RuntimeOrigin::signed(user2), - Box::new(token_1), - Box::new(token_2), + Box::new(token_1.clone()), + Box::new(token_2.clone()), lp_token_minted, 0, 0, @@ -1416,17 +1471,17 @@ fn swap_when_existential_deposit_would_cause_reaping_but_keep_alive_set() { new_test_ext().execute_with(|| { let user = 1; let user2 = 2; - let token_1 = NativeOrAssetId::Native; - let token_2 = NativeOrAssetId::Asset(2); + let token_1 = NativeOrWithId::Native; + let token_2 = NativeOrWithId::WithId(2); - create_tokens(user2, vec![token_2]); + create_tokens(user2, vec![token_2.clone()]); assert_ok!(AssetConversion::create_pool( RuntimeOrigin::signed(user2), - Box::new(token_1), - Box::new(token_2) + Box::new(token_1.clone()), + Box::new(token_2.clone()) )); - let ed = get_ed(); + let ed = get_native_ed(); assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 101)); assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user2, 10000 + ed)); assert_ok!(Assets::mint(RuntimeOrigin::signed(user2), 2, user2, 1000)); @@ -1434,8 +1489,8 @@ fn swap_when_existential_deposit_would_cause_reaping_but_keep_alive_set() { assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user2), - Box::new(token_1), - Box::new(token_2), + Box::new(token_1.clone()), + Box::new(token_2.clone()), 10000, 200, 1, @@ -1446,7 +1501,7 @@ fn swap_when_existential_deposit_would_cause_reaping_but_keep_alive_set() { assert_noop!( AssetConversion::swap_tokens_for_exact_tokens( RuntimeOrigin::signed(user), - bvec![token_1, token_2], + bvec![token_1.clone(), token_2.clone()], 1, // amount_out 101, // amount_in_max user, @@ -1458,7 +1513,7 @@ fn swap_when_existential_deposit_would_cause_reaping_but_keep_alive_set() { assert_noop!( AssetConversion::swap_exact_tokens_for_tokens( RuntimeOrigin::signed(user), - bvec![token_1, token_2], + bvec![token_1.clone(), token_2.clone()], 51, // amount_in 1, // amount_out_min user, @@ -1470,7 +1525,7 @@ fn swap_when_existential_deposit_would_cause_reaping_but_keep_alive_set() { assert_noop!( AssetConversion::swap_tokens_for_exact_tokens( RuntimeOrigin::signed(user), - bvec![token_2, token_1], + bvec![token_2.clone(), token_1.clone()], 51, // amount_out 2, // amount_in_max user, @@ -1482,7 +1537,7 @@ fn swap_when_existential_deposit_would_cause_reaping_but_keep_alive_set() { assert_noop!( AssetConversion::swap_exact_tokens_for_tokens( RuntimeOrigin::signed(user), - bvec![token_2, token_1], + bvec![token_2.clone(), token_1.clone()], 2, // amount_in 1, // amount_out_min user, @@ -1498,29 +1553,29 @@ fn swap_when_existential_deposit_would_cause_reaping_pool_account() { new_test_ext().execute_with(|| { let user = 1; let user2 = 2; - let token_1 = NativeOrAssetId::Native; - let token_2 = NativeOrAssetId::Asset(2); - let token_3 = NativeOrAssetId::Asset(3); + let token_1 = NativeOrWithId::Native; + let token_2 = NativeOrWithId::WithId(2); + let token_3 = NativeOrWithId::WithId(3); let ed_assets = 100; - create_tokens_with_ed(user2, vec![token_2, token_3], ed_assets); + create_tokens_with_ed(user2, vec![token_2.clone(), token_3.clone()], ed_assets); assert_ok!(AssetConversion::create_pool( RuntimeOrigin::signed(user2), - Box::new(token_1), - Box::new(token_2) + Box::new(token_1.clone()), + Box::new(token_2.clone()) )); assert_ok!(AssetConversion::create_pool( RuntimeOrigin::signed(user2), - Box::new(token_1), - Box::new(token_3) + Box::new(token_1.clone()), + Box::new(token_3.clone()) )); assert_ok!(AssetConversion::create_pool( RuntimeOrigin::signed(user2), - Box::new(token_2), - Box::new(token_3) + Box::new(token_2.clone()), + Box::new(token_3.clone()) )); - let ed = get_ed(); + let ed = get_native_ed(); assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 20000 + ed)); assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user2, 20000 + ed)); assert_ok!(Assets::mint(RuntimeOrigin::signed(user2), 2, user2, 400 + ed_assets)); @@ -1531,8 +1586,8 @@ fn swap_when_existential_deposit_would_cause_reaping_pool_account() { assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user2), - Box::new(token_1), - Box::new(token_2), + Box::new(token_1.clone()), + Box::new(token_2.clone()), 10000, 200, 1, @@ -1542,8 +1597,8 @@ fn swap_when_existential_deposit_would_cause_reaping_pool_account() { assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user2), - Box::new(token_1), - Box::new(token_3), + Box::new(token_1.clone()), + Box::new(token_3.clone()), 200, 10000, 1, @@ -1553,8 +1608,8 @@ fn swap_when_existential_deposit_would_cause_reaping_pool_account() { assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user2), - Box::new(token_2), - Box::new(token_3), + Box::new(token_2.clone()), + Box::new(token_3.clone()), 200, 10000, 1, @@ -1566,7 +1621,7 @@ fn swap_when_existential_deposit_would_cause_reaping_pool_account() { assert_noop!( AssetConversion::swap_tokens_for_exact_tokens( RuntimeOrigin::signed(user), - bvec![token_1, token_2], + bvec![token_1.clone(), token_2.clone()], 110, // amount_out 20000, // amount_in_max user, @@ -1579,7 +1634,7 @@ fn swap_when_existential_deposit_would_cause_reaping_pool_account() { assert_noop!( AssetConversion::swap_exact_tokens_for_tokens( RuntimeOrigin::signed(user), - bvec![token_1, token_2], + bvec![token_1.clone(), token_2.clone()], 15000, // amount_in 110, // amount_out_min user, @@ -1592,7 +1647,7 @@ fn swap_when_existential_deposit_would_cause_reaping_pool_account() { assert_noop!( AssetConversion::swap_tokens_for_exact_tokens( RuntimeOrigin::signed(user), - bvec![token_3, token_1], + bvec![token_3.clone(), token_1.clone()], 110, // amount_out 20000, // amount_in_max user, @@ -1605,7 +1660,7 @@ fn swap_when_existential_deposit_would_cause_reaping_pool_account() { assert_noop!( AssetConversion::swap_exact_tokens_for_tokens( RuntimeOrigin::signed(user), - bvec![token_3, token_1], + bvec![token_3.clone(), token_1.clone()], 15000, // amount_in 110, // amount_out_min user, @@ -1617,7 +1672,7 @@ fn swap_when_existential_deposit_would_cause_reaping_pool_account() { // causes an account removal for native token 1 locate in the middle of a swap path let amount_in = AssetConversion::balance_path_from_amount_out( 110, - vec![token_3, token_1].try_into().unwrap(), + vec![token_3.clone(), token_1.clone()], ) .unwrap() .first() @@ -1627,7 +1682,7 @@ fn swap_when_existential_deposit_would_cause_reaping_pool_account() { assert_noop!( AssetConversion::swap_exact_tokens_for_tokens( RuntimeOrigin::signed(user), - bvec![token_3, token_1, token_2], + bvec![token_3.clone(), token_1.clone(), token_2.clone()], amount_in, // amount_in 1, // amount_out_min user, @@ -1639,7 +1694,7 @@ fn swap_when_existential_deposit_would_cause_reaping_pool_account() { // causes an account removal for asset token 2 locate in the middle of a swap path let amount_in = AssetConversion::balance_path_from_amount_out( 110, - vec![token_1, token_2].try_into().unwrap(), + vec![token_1.clone(), token_2.clone()], ) .unwrap() .first() @@ -1649,7 +1704,7 @@ fn swap_when_existential_deposit_would_cause_reaping_pool_account() { assert_noop!( AssetConversion::swap_exact_tokens_for_tokens( RuntimeOrigin::signed(user), - bvec![token_1, token_2, token_3], + bvec![token_1.clone(), token_2.clone(), token_3.clone()], amount_in, // amount_in 1, // amount_out_min user, @@ -1664,17 +1719,21 @@ fn swap_when_existential_deposit_would_cause_reaping_pool_account() { fn swap_tokens_for_exact_tokens_should_not_work_if_too_much_slippage() { new_test_ext().execute_with(|| { let user = 1; - let token_1 = NativeOrAssetId::Native; - let token_2 = NativeOrAssetId::Asset(2); + let token_1 = NativeOrWithId::Native; + let token_2 = NativeOrWithId::WithId(2); - create_tokens(user, vec![token_2]); + create_tokens(user, vec![token_2.clone()]); assert_ok!(AssetConversion::create_pool( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2) + Box::new(token_1.clone()), + Box::new(token_2.clone()) )); - assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 20000 + get_ed())); + assert_ok!(Balances::force_set_balance( + RuntimeOrigin::root(), + user, + 20000 + get_native_ed() + )); assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, user, 1000)); let liquidity1 = 10000; @@ -1682,8 +1741,8 @@ fn swap_tokens_for_exact_tokens_should_not_work_if_too_much_slippage() { assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2), + Box::new(token_1.clone()), + Box::new(token_2.clone()), liquidity1, liquidity2, 1, @@ -1696,7 +1755,7 @@ fn swap_tokens_for_exact_tokens_should_not_work_if_too_much_slippage() { assert_noop!( AssetConversion::swap_tokens_for_exact_tokens( RuntimeOrigin::signed(user), - bvec![token_1, token_2], + bvec![token_1.clone(), token_2.clone()], exchange_out, // amount_out 50, // amount_in_max just greater than slippage. user, @@ -1711,23 +1770,23 @@ fn swap_tokens_for_exact_tokens_should_not_work_if_too_much_slippage() { fn swap_exact_tokens_for_tokens_in_multi_hops() { new_test_ext().execute_with(|| { let user = 1; - let token_1 = NativeOrAssetId::Native; - let token_2 = NativeOrAssetId::Asset(2); - let token_3 = NativeOrAssetId::Asset(3); + let token_1 = NativeOrWithId::Native; + let token_2 = NativeOrWithId::WithId(2); + let token_3 = NativeOrWithId::WithId(3); - create_tokens(user, vec![token_2, token_3]); + create_tokens(user, vec![token_2.clone(), token_3.clone()]); assert_ok!(AssetConversion::create_pool( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2) + Box::new(token_1.clone()), + Box::new(token_2.clone()) )); assert_ok!(AssetConversion::create_pool( RuntimeOrigin::signed(user), - Box::new(token_2), - Box::new(token_3) + Box::new(token_2.clone()), + Box::new(token_3.clone()) )); - let ed = get_ed(); + let ed = get_native_ed(); let base1 = 10000; let base2 = 10000; assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, base1 * 2 + ed)); @@ -1740,8 +1799,8 @@ fn swap_exact_tokens_for_tokens_in_multi_hops() { assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2), + Box::new(token_1.clone()), + Box::new(token_2.clone()), liquidity1, liquidity2, 1, @@ -1750,8 +1809,8 @@ fn swap_exact_tokens_for_tokens_in_multi_hops() { )); assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - Box::new(token_2), - Box::new(token_3), + Box::new(token_2.clone()), + Box::new(token_3.clone()), liquidity2, liquidity3, 1, @@ -1770,7 +1829,7 @@ fn swap_exact_tokens_for_tokens_in_multi_hops() { assert_noop!( AssetConversion::swap_exact_tokens_for_tokens( RuntimeOrigin::signed(user), - bvec![token_1], + bvec![token_1.clone()], input_amount, 80, user, @@ -1782,7 +1841,7 @@ fn swap_exact_tokens_for_tokens_in_multi_hops() { assert_noop!( AssetConversion::swap_exact_tokens_for_tokens( RuntimeOrigin::signed(user), - bvec![token_1, token_2, token_3, token_2], + bvec![token_1.clone(), token_2.clone(), token_3.clone(), token_2.clone()], input_amount, 80, user, @@ -1793,24 +1852,24 @@ fn swap_exact_tokens_for_tokens_in_multi_hops() { assert_ok!(AssetConversion::swap_exact_tokens_for_tokens( RuntimeOrigin::signed(user), - bvec![token_1, token_2, token_3], + bvec![token_1.clone(), token_2.clone(), token_3.clone()], input_amount, // amount_in 80, // amount_out_min user, true, )); - let pool_id1 = (token_1, token_2); - let pool_id2 = (token_2, token_3); - let pallet_account1 = AssetConversion::get_pool_account(&pool_id1); - let pallet_account2 = AssetConversion::get_pool_account(&pool_id2); + let pool_id1 = (token_1.clone(), token_2.clone()); + let pool_id2 = (token_2.clone(), token_3.clone()); + let pallet_account1 = ::PoolLocator::address(&pool_id1).unwrap(); + let pallet_account2 = ::PoolLocator::address(&pool_id2).unwrap(); - assert_eq!(balance(user, token_1), base1 + ed - input_amount); - assert_eq!(balance(pallet_account1, token_1), liquidity1 + input_amount); - assert_eq!(balance(pallet_account1, token_2), liquidity2 - expect_out2); - assert_eq!(balance(pallet_account2, token_2), liquidity2 + expect_out2); - assert_eq!(balance(pallet_account2, token_3), liquidity3 - expect_out3); - assert_eq!(balance(user, token_3), 10000 - liquidity3 + expect_out3); + assert_eq!(balance(user, token_1.clone()), base1 + ed - input_amount); + assert_eq!(balance(pallet_account1, token_1.clone()), liquidity1 + input_amount); + assert_eq!(balance(pallet_account1, token_2.clone()), liquidity2 - expect_out2); + assert_eq!(balance(pallet_account2, token_2.clone()), liquidity2 + expect_out2); + assert_eq!(balance(pallet_account2, token_3.clone()), liquidity3 - expect_out3); + assert_eq!(balance(user, token_3.clone()), 10000 - liquidity3 + expect_out3); }); } @@ -1818,23 +1877,23 @@ fn swap_exact_tokens_for_tokens_in_multi_hops() { fn swap_tokens_for_exact_tokens_in_multi_hops() { new_test_ext().execute_with(|| { let user = 1; - let token_1 = NativeOrAssetId::Native; - let token_2 = NativeOrAssetId::Asset(2); - let token_3 = NativeOrAssetId::Asset(3); + let token_1 = NativeOrWithId::Native; + let token_2 = NativeOrWithId::WithId(2); + let token_3 = NativeOrWithId::WithId(3); - create_tokens(user, vec![token_2, token_3]); + create_tokens(user, vec![token_2.clone(), token_3.clone()]); assert_ok!(AssetConversion::create_pool( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2) + Box::new(token_1.clone()), + Box::new(token_2.clone()) )); assert_ok!(AssetConversion::create_pool( RuntimeOrigin::signed(user), - Box::new(token_2), - Box::new(token_3) + Box::new(token_2.clone()), + Box::new(token_3.clone()) )); - let ed = get_ed(); + let ed = get_native_ed(); let base1 = 10000; let base2 = 10000; assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, base1 * 2 + ed)); @@ -1847,8 +1906,8 @@ fn swap_tokens_for_exact_tokens_in_multi_hops() { assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2), + Box::new(token_1.clone()), + Box::new(token_2.clone()), liquidity1, liquidity2, 1, @@ -1857,8 +1916,8 @@ fn swap_tokens_for_exact_tokens_in_multi_hops() { )); assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - Box::new(token_2), - Box::new(token_3), + Box::new(token_2.clone()), + Box::new(token_3.clone()), liquidity2, liquidity3, 1, @@ -1876,24 +1935,24 @@ fn swap_tokens_for_exact_tokens_in_multi_hops() { assert_ok!(AssetConversion::swap_tokens_for_exact_tokens( RuntimeOrigin::signed(user), - bvec![token_1, token_2, token_3], + bvec![token_1.clone(), token_2.clone(), token_3.clone()], exchange_out3, // amount_out 1000, // amount_in_max user, true, )); - let pool_id1 = (token_1, token_2); - let pool_id2 = (token_2, token_3); - let pallet_account1 = AssetConversion::get_pool_account(&pool_id1); - let pallet_account2 = AssetConversion::get_pool_account(&pool_id2); + let pool_id1 = (token_1.clone(), token_2.clone()); + let pool_id2 = (token_2.clone(), token_3.clone()); + let pallet_account1 = ::PoolLocator::address(&pool_id1).unwrap(); + let pallet_account2 = ::PoolLocator::address(&pool_id2).unwrap(); - assert_eq!(balance(user, token_1), base1 + ed - expect_in1); - assert_eq!(balance(pallet_account1, token_1), liquidity1 + expect_in1); - assert_eq!(balance(pallet_account1, token_2), liquidity2 - expect_in2); - assert_eq!(balance(pallet_account2, token_2), liquidity2 + expect_in2); - assert_eq!(balance(pallet_account2, token_3), liquidity3 - exchange_out3); - assert_eq!(balance(user, token_3), 10000 - liquidity3 + exchange_out3); + assert_eq!(balance(user, token_1.clone()), base1 + ed - expect_in1); + assert_eq!(balance(pallet_account1, token_1.clone()), liquidity1 + expect_in1); + assert_eq!(balance(pallet_account1, token_2.clone()), liquidity2 - expect_in2); + assert_eq!(balance(pallet_account2, token_2.clone()), liquidity2 + expect_in2); + assert_eq!(balance(pallet_account2, token_3.clone()), liquidity3 - exchange_out3); + assert_eq!(balance(user, token_3.clone()), 10000 - liquidity3 + exchange_out3); }); } @@ -1901,10 +1960,10 @@ fn swap_tokens_for_exact_tokens_in_multi_hops() { fn can_not_swap_same_asset() { new_test_ext().execute_with(|| { let user = 1; - let token_1 = NativeOrAssetId::Asset(1); - let token_2 = NativeOrAssetId::Native; + let token_1 = NativeOrWithId::WithId(1); + let token_2 = NativeOrWithId::Native; - create_tokens(user, vec![token_1]); + create_tokens(user, vec![token_1.clone()]); assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 1, user, 1000)); let liquidity1 = 1000; @@ -1912,60 +1971,44 @@ fn can_not_swap_same_asset() { assert_noop!( AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_1), + Box::new(token_1.clone()), + Box::new(token_1.clone()), liquidity1, liquidity2, 1, 1, user, ), - Error::::PoolNotFound + Error::::InvalidAssetPair ); let exchange_amount = 10; assert_noop!( AssetConversion::swap_exact_tokens_for_tokens( RuntimeOrigin::signed(user), - bvec![token_1, token_1], + bvec![token_1.clone(), token_1.clone()], exchange_amount, 1, user, true, ), - Error::::PoolNotFound + Error::::InvalidAssetPair ); assert_noop!( AssetConversion::swap_exact_tokens_for_tokens( RuntimeOrigin::signed(user), - bvec![token_2, token_2], + bvec![token_2.clone(), token_2.clone()], exchange_amount, 1, user, true, ), - Error::::PoolNotFound + Error::::InvalidAssetPair ); }); } -#[test] -fn validate_pool_id_sorting() { - new_test_ext().execute_with(|| { - use crate::NativeOrAssetId::{Asset, Native}; - assert_eq!(AssetConversion::get_pool_id(Native, Asset(2)), (Native, Asset(2))); - assert_eq!(AssetConversion::get_pool_id(Asset(2), Native), (Native, Asset(2))); - assert_eq!(AssetConversion::get_pool_id(Native, Native), (Native, Native)); - assert_eq!(AssetConversion::get_pool_id(Asset(2), Asset(1)), (Asset(1), Asset(2))); - assert!(Asset(2) > Asset(1)); - assert!(Asset(1) <= Asset(1)); - assert_eq!(Asset(1), Asset(1)); - assert_eq!(Native::, Native::); - assert!(Native < Asset(1)); - }); -} - #[test] fn cannot_block_pool_creation() { new_test_ext().execute_with(|| { @@ -1974,16 +2017,16 @@ fn cannot_block_pool_creation() { // User 2 is the attacker let attacker = 2; - let ed = get_ed(); + let ed = get_native_ed(); assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), attacker, 10000 + ed)); - // The target pool the user wants to create is Native <=> Asset(2) - let token_1 = NativeOrAssetId::Native; - let token_2 = NativeOrAssetId::Asset(2); + // The target pool the user wants to create is Native <=> WithId(2) + let token_1 = NativeOrWithId::Native; + let token_2 = NativeOrWithId::WithId(2); // Attacker computes the still non-existing pool account for the target pair let pool_account = - AssetConversion::get_pool_account(&AssetConversion::get_pool_id(token_2, token_1)); + ::PoolLocator::address(&(token_1.clone(), token_2.clone())).unwrap(); // And transfers the ED to that pool account assert_ok!(Balances::transfer_allow_death( RuntimeOrigin::signed(attacker), @@ -1992,21 +2035,21 @@ fn cannot_block_pool_creation() { )); // Then, the attacker creates 14 tokens and sends one of each to the pool account for i in 10..25 { - create_tokens(attacker, vec![NativeOrAssetId::Asset(i)]); + create_tokens(attacker, vec![NativeOrWithId::WithId(i)]); assert_ok!(Assets::mint(RuntimeOrigin::signed(attacker), i, attacker, 1000)); assert_ok!(Assets::transfer(RuntimeOrigin::signed(attacker), i, pool_account, 1)); } // User can still create the pool - create_tokens(user, vec![token_2]); + create_tokens(user, vec![token_2.clone()]); assert_ok!(AssetConversion::create_pool( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2) + Box::new(token_1.clone()), + Box::new(token_2.clone()) )); - // User has to transfer one Asset(2) token to the pool account (otherwise add_liquidity will - // fail with `AssetTwoDepositDidNotMeetMinimum`) + // User has to transfer one WithId(2) token to the pool account (otherwise add_liquidity + // will fail with `AssetTwoDepositDidNotMeetMinimum`) assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 10000 + ed)); assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, user, 10000)); assert_ok!(Assets::transfer(RuntimeOrigin::signed(user), 2, pool_account, 1)); @@ -2014,8 +2057,8 @@ fn cannot_block_pool_creation() { // add_liquidity shouldn't fail because of the number of consumers assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2), + Box::new(token_1.clone()), + Box::new(token_2.clone()), 10000, 100, 10000, @@ -2030,24 +2073,24 @@ fn swap_transactional() { new_test_ext().execute_with(|| { let user = 1; let user2 = 2; - let token_1 = NativeOrAssetId::Native; - let token_2 = NativeOrAssetId::Asset(2); - let token_3 = NativeOrAssetId::Asset(3); + let token_1 = NativeOrWithId::Native; + let token_2 = NativeOrWithId::WithId(2); + let token_3 = NativeOrWithId::WithId(3); let asset_ed = 150; - create_tokens_with_ed(user, vec![token_2, token_3], asset_ed); + create_tokens_with_ed(user, vec![token_2.clone(), token_3.clone()], asset_ed); assert_ok!(AssetConversion::create_pool( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2) + Box::new(token_1.clone()), + Box::new(token_2.clone()) )); assert_ok!(AssetConversion::create_pool( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_3) + Box::new(token_1.clone()), + Box::new(token_3.clone()) )); - let ed = get_ed(); + let ed = get_native_ed(); assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 20000 + ed)); assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, user, 1000)); assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 3, user, 1000)); @@ -2061,8 +2104,8 @@ fn swap_transactional() { assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2), + Box::new(token_1.clone()), + Box::new(token_2.clone()), liquidity1, liquidity2, 1, @@ -2072,8 +2115,8 @@ fn swap_transactional() { assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_3), + Box::new(token_1.clone()), + Box::new(token_3.clone()), liquidity1, liquidity2, 1, @@ -2081,19 +2124,21 @@ fn swap_transactional() { user, )); - let pool_1 = AssetConversion::get_pool_account(&(token_1, token_2)); - let pool_2 = AssetConversion::get_pool_account(&(token_1, token_3)); + let pool_1 = + ::PoolLocator::address(&(token_1.clone(), token_2.clone())).unwrap(); + let pool_2 = + ::PoolLocator::address(&(token_1.clone(), token_3.clone())).unwrap(); assert_eq!(Balances::balance(&pool_1), liquidity1); - assert_eq!(Assets::balance(2, &pool_1), liquidity2); + assert_eq!(Assets::balance(2, pool_1), liquidity2); assert_eq!(Balances::balance(&pool_2), liquidity1); - assert_eq!(Assets::balance(3, &pool_2), liquidity2); + assert_eq!(Assets::balance(3, pool_2), liquidity2); // the amount that would cause a transfer from the last pool in the path to fail let expected_out = liquidity2 - asset_ed + 1; let amount_in = AssetConversion::balance_path_from_amount_out( expected_out, - vec![token_2, token_1, token_3].try_into().unwrap(), + vec![token_2.clone(), token_1.clone(), token_3.clone()], ) .unwrap() .first() @@ -2101,42 +2146,42 @@ fn swap_transactional() { .unwrap(); // swap credit with `swap_tokens_for_exact_tokens` transactional - let credit_in = Assets::issue(2, amount_in); - let credit_in_err_expected = Assets::issue(2, amount_in); + let credit_in = NativeAndAssets::issue(token_2.clone(), amount_in); + let credit_in_err_expected = NativeAndAssets::issue(token_2.clone(), amount_in); // avoiding drop of any credit, to assert any storage mutation from an actual call. let error; assert_storage_noop!( error = >::swap_tokens_for_exact_tokens( - vec![token_2, token_1, token_3], - credit_in.into(), + vec![token_2.clone(), token_1.clone(), token_3.clone()], + credit_in, expected_out, ) .unwrap_err() ); - assert_eq!(error, (credit_in_err_expected.into(), TokenError::NotExpendable.into())); + assert_eq!(error, (credit_in_err_expected, TokenError::NotExpendable.into())); // swap credit with `swap_exact_tokens_for_tokens` transactional - let credit_in = Assets::issue(2, amount_in); - let credit_in_err_expected = Assets::issue(2, amount_in); + let credit_in = NativeAndAssets::issue(token_2.clone(), amount_in); + let credit_in_err_expected = NativeAndAssets::issue(token_2.clone(), amount_in); // avoiding drop of any credit, to assert any storage mutation from an actual call. let error; assert_storage_noop!( error = >::swap_exact_tokens_for_tokens( - vec![token_2, token_1, token_3], - credit_in.into(), + vec![token_2.clone(), token_1.clone(), token_3.clone()], + credit_in, Some(expected_out), ) .unwrap_err() ); - assert_eq!(error, (credit_in_err_expected.into(), TokenError::NotExpendable.into())); + assert_eq!(error, (credit_in_err_expected, TokenError::NotExpendable.into())); // swap with `swap_exact_tokens_for_tokens` transactional assert_noop!( >::swap_exact_tokens_for_tokens( user2, - vec![token_2, token_1, token_3], - amount_in.into(), - Some(expected_out.into()), + vec![token_2.clone(), token_1.clone(), token_3.clone()], + amount_in, + Some(expected_out), user2, true, ), @@ -2147,9 +2192,9 @@ fn swap_transactional() { assert_noop!( >::swap_tokens_for_exact_tokens( user2, - vec![token_2, token_1, token_3], - expected_out.into(), - Some(amount_in.into()), + vec![token_2.clone(), token_1.clone(), token_3.clone()], + expected_out, + Some(amount_in), user2, true, ), @@ -2157,9 +2202,9 @@ fn swap_transactional() { ); assert_eq!(Balances::balance(&pool_1), liquidity1); - assert_eq!(Assets::balance(2, &pool_1), liquidity2); + assert_eq!(Assets::balance(2, pool_1), liquidity2); assert_eq!(Balances::balance(&pool_2), liquidity1); - assert_eq!(Assets::balance(3, &pool_2), liquidity2); + assert_eq!(Assets::balance(3, pool_2), liquidity2); }) } @@ -2167,17 +2212,17 @@ fn swap_transactional() { fn swap_credit_returns_change() { new_test_ext().execute_with(|| { let user = 1; - let token_1 = NativeOrAssetId::Native; - let token_2 = NativeOrAssetId::Asset(2); + let token_1 = NativeOrWithId::Native; + let token_2 = NativeOrWithId::WithId(2); - create_tokens(user, vec![token_2]); + create_tokens(user, vec![token_2.clone()]); assert_ok!(AssetConversion::create_pool( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2) + Box::new(token_1.clone()), + Box::new(token_2.clone()) )); - let ed = get_ed(); + let ed = get_native_ed(); assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 20000 + ed)); assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, user, 1000)); @@ -2186,8 +2231,8 @@ fn swap_credit_returns_change() { assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2), + Box::new(token_1.clone()), + Box::new(token_2.clone()), liquidity1, liquidity2, 1, @@ -2195,21 +2240,22 @@ fn swap_credit_returns_change() { user, )); - let expected_change = Balances::issue(100); - let expected_credit_out = Assets::issue(2, 20); + let expected_change = NativeAndAssets::issue(token_1.clone(), 100); + let expected_credit_out = NativeAndAssets::issue(token_2.clone(), 20); let amount_in_max = AssetConversion::get_amount_in(&expected_credit_out.peek(), &liquidity1, &liquidity2) .unwrap(); - let credit_in = Balances::issue(amount_in_max + expected_change.peek()); + let credit_in = + NativeAndAssets::issue(token_1.clone(), amount_in_max + expected_change.peek()); assert_ok!( >::swap_tokens_for_exact_tokens( - vec![token_1, token_2], - credit_in.into(), + vec![token_1.clone(), token_2.clone()], + credit_in, expected_credit_out.peek(), ), - (expected_credit_out.into(), expected_change.into()) + (expected_credit_out, expected_change) ); }) } @@ -2219,17 +2265,17 @@ fn swap_credit_insufficient_amount_bounds() { new_test_ext().execute_with(|| { let user = 1; let user2 = 2; - let token_1 = NativeOrAssetId::Native; - let token_2 = NativeOrAssetId::Asset(2); + let token_1 = NativeOrWithId::Native; + let token_2 = NativeOrWithId::WithId(2); - create_tokens(user, vec![token_2]); + create_tokens(user, vec![token_2.clone()]); assert_ok!(AssetConversion::create_pool( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2) + Box::new(token_1.clone()), + Box::new(token_2.clone()) )); - let ed = get_ed(); + let ed = get_native_ed(); assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 20000 + ed)); assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, user, 1000)); @@ -2241,8 +2287,8 @@ fn swap_credit_insufficient_amount_bounds() { assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2), + Box::new(token_1.clone()), + Box::new(token_2.clone()), liquidity1, liquidity2, 1, @@ -2255,34 +2301,34 @@ fn swap_credit_insufficient_amount_bounds() { let amount_in = AssetConversion::get_amount_in(&(amount_out_min - 1), &liquidity2, &liquidity1) .unwrap(); - let credit_in = Balances::issue(amount_in); - let expected_credit_in = Balances::issue(amount_in); + let credit_in = NativeAndAssets::issue(token_1.clone(), amount_in); + let expected_credit_in = NativeAndAssets::issue(token_1.clone(), amount_in); let error = >::swap_exact_tokens_for_tokens( - vec![token_1, token_2], - credit_in.into(), + vec![token_1.clone(), token_2.clone()], + credit_in, Some(amount_out_min), ) .unwrap_err(); assert_eq!( error, - (expected_credit_in.into(), Error::::ProvidedMinimumNotSufficientForSwap.into()) + (expected_credit_in, Error::::ProvidedMinimumNotSufficientForSwap.into()) ); // provided `credit_in` is not sufficient to swap for desired `amount_out` let amount_out = 20; let amount_in_max = AssetConversion::get_amount_in(&(amount_out - 1), &liquidity2, &liquidity1).unwrap(); - let credit_in = Balances::issue(amount_in_max); - let expected_credit_in = Balances::issue(amount_in_max); + let credit_in = NativeAndAssets::issue(token_1.clone(), amount_in_max); + let expected_credit_in = NativeAndAssets::issue(token_1.clone(), amount_in_max); let error = >::swap_tokens_for_exact_tokens( - vec![token_1, token_2], - credit_in.into(), + vec![token_1.clone(), token_2.clone()], + credit_in, amount_out, ) .unwrap_err(); assert_eq!( error, - (expected_credit_in.into(), Error::::ProvidedMaximumNotSufficientForSwap.into()) + (expected_credit_in, Error::::ProvidedMaximumNotSufficientForSwap.into()) ); }) } @@ -2292,17 +2338,17 @@ fn swap_credit_zero_amount() { new_test_ext().execute_with(|| { let user = 1; let user2 = 2; - let token_1 = NativeOrAssetId::Native; - let token_2 = NativeOrAssetId::Asset(2); + let token_1 = NativeOrWithId::Native; + let token_2 = NativeOrWithId::WithId(2); - create_tokens(user, vec![token_2]); + create_tokens(user, vec![token_2.clone()]); assert_ok!(AssetConversion::create_pool( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2) + Box::new(token_1.clone()), + Box::new(token_2.clone()) )); - let ed = get_ed(); + let ed = get_native_ed(); assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 20000 + ed)); assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, user, 1000)); @@ -2314,8 +2360,8 @@ fn swap_credit_zero_amount() { assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2), + Box::new(token_1.clone()), + Box::new(token_2.clone()), liquidity1, liquidity2, 1, @@ -2324,10 +2370,10 @@ fn swap_credit_zero_amount() { )); // swap with zero credit fails for `swap_exact_tokens_for_tokens` - let credit_in = Credit::native_zero(); - let expected_credit_in = Credit::native_zero(); + let credit_in = CreditOf::::zero(token_1.clone()); + let expected_credit_in = CreditOf::::zero(token_1.clone()); let error = >::swap_exact_tokens_for_tokens( - vec![token_1, token_2], + vec![token_1.clone(), token_2.clone()], credit_in, None, ) @@ -2335,10 +2381,10 @@ fn swap_credit_zero_amount() { assert_eq!(error, (expected_credit_in, Error::::ZeroAmount.into())); // swap with zero credit fails for `swap_tokens_for_exact_tokens` - let credit_in = Credit::native_zero(); - let expected_credit_in = Credit::native_zero(); + let credit_in = CreditOf::::zero(token_1.clone()); + let expected_credit_in = CreditOf::::zero(token_1.clone()); let error = >::swap_tokens_for_exact_tokens( - vec![token_1, token_2], + vec![token_1.clone(), token_2.clone()], credit_in, 10, ) @@ -2346,26 +2392,26 @@ fn swap_credit_zero_amount() { assert_eq!(error, (expected_credit_in, Error::::ZeroAmount.into())); // swap with zero amount_out_min fails for `swap_exact_tokens_for_tokens` - let credit_in = Balances::issue(10); - let expected_credit_in = Balances::issue(10); + let credit_in = NativeAndAssets::issue(token_1.clone(), 10); + let expected_credit_in = NativeAndAssets::issue(token_1.clone(), 10); let error = >::swap_exact_tokens_for_tokens( - vec![token_1, token_2], - credit_in.into(), + vec![token_1.clone(), token_2.clone()], + credit_in, Some(0), ) .unwrap_err(); - assert_eq!(error, (expected_credit_in.into(), Error::::ZeroAmount.into())); + assert_eq!(error, (expected_credit_in, Error::::ZeroAmount.into())); // swap with zero amount_out fails with `swap_tokens_for_exact_tokens` fails - let credit_in = Balances::issue(10); - let expected_credit_in = Balances::issue(10); + let credit_in = NativeAndAssets::issue(token_1.clone(), 10); + let expected_credit_in = NativeAndAssets::issue(token_1.clone(), 10); let error = >::swap_tokens_for_exact_tokens( - vec![token_1, token_2], - credit_in.into(), + vec![token_1.clone(), token_2.clone()], + credit_in, 0, ) .unwrap_err(); - assert_eq!(error, (expected_credit_in.into(), Error::::ZeroAmount.into())); + assert_eq!(error, (expected_credit_in, Error::::ZeroAmount.into())); }); } @@ -2374,17 +2420,17 @@ fn swap_credit_invalid_path() { new_test_ext().execute_with(|| { let user = 1; let user2 = 2; - let token_1 = NativeOrAssetId::Native; - let token_2 = NativeOrAssetId::Asset(2); + let token_1 = NativeOrWithId::Native; + let token_2 = NativeOrWithId::WithId(2); - create_tokens(user, vec![token_2]); + create_tokens(user, vec![token_2.clone()]); assert_ok!(AssetConversion::create_pool( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2) + Box::new(token_1.clone()), + Box::new(token_2.clone()) )); - let ed = get_ed(); + let ed = get_native_ed(); assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 20000 + ed)); assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, user, 1000)); @@ -2396,8 +2442,8 @@ fn swap_credit_invalid_path() { assert_ok!(AssetConversion::add_liquidity( RuntimeOrigin::signed(user), - Box::new(token_1), - Box::new(token_2), + Box::new(token_1.clone()), + Box::new(token_2.clone()), liquidity1, liquidity2, 1, @@ -2406,47 +2452,44 @@ fn swap_credit_invalid_path() { )); // swap with credit_in.asset different from path[0] asset fails - let credit_in = Balances::issue(10); - let expected_credit_in = Balances::issue(10); + let credit_in = NativeAndAssets::issue(token_1.clone(), 10); + let expected_credit_in = NativeAndAssets::issue(token_1.clone(), 10); let error = >::swap_exact_tokens_for_tokens( - vec![token_2, token_1], - credit_in.into(), + vec![token_2.clone(), token_1.clone()], + credit_in, None, ) .unwrap_err(); - assert_eq!(error, (expected_credit_in.into(), Error::::InvalidPath.into())); + assert_eq!(error, (expected_credit_in, Error::::InvalidPath.into())); // swap with credit_in.asset different from path[0] asset fails - let credit_in = Assets::issue(2, 10); - let expected_credit_in = Assets::issue(2, 10); + let credit_in = NativeAndAssets::issue(token_2.clone(), 10); + let expected_credit_in = NativeAndAssets::issue(token_2.clone(), 10); let error = >::swap_tokens_for_exact_tokens( - vec![token_1, token_2], - credit_in.into(), + vec![token_1.clone(), token_2.clone()], + credit_in, 10, ) .unwrap_err(); - assert_eq!(error, (expected_credit_in.into(), Error::::InvalidPath.into())); + assert_eq!(error, (expected_credit_in, Error::::InvalidPath.into())); // swap with path.len < 2 fails - let credit_in = Balances::issue(10); - let expected_credit_in = Balances::issue(10); + let credit_in = NativeAndAssets::issue(token_1.clone(), 10); + let expected_credit_in = NativeAndAssets::issue(token_1.clone(), 10); let error = >::swap_exact_tokens_for_tokens( - vec![token_2], - credit_in.into(), + vec![token_2.clone()], + credit_in, None, ) .unwrap_err(); - assert_eq!(error, (expected_credit_in.into(), Error::::InvalidPath.into())); + assert_eq!(error, (expected_credit_in, Error::::InvalidPath.into())); // swap with path.len < 2 fails - let credit_in = Assets::issue(2, 10); - let expected_credit_in = Assets::issue(2, 10); - let error = >::swap_tokens_for_exact_tokens( - vec![], - credit_in.into(), - 10, - ) - .unwrap_err(); - assert_eq!(error, (expected_credit_in.into(), Error::::InvalidPath.into())); + let credit_in = NativeAndAssets::issue(token_2.clone(), 10); + let expected_credit_in = NativeAndAssets::issue(token_2.clone(), 10); + let error = + >::swap_tokens_for_exact_tokens(vec![], credit_in, 10) + .unwrap_err(); + assert_eq!(error, (expected_credit_in, Error::::InvalidPath.into())); }); } diff --git a/substrate/frame/asset-conversion/src/types.rs b/substrate/frame/asset-conversion/src/types.rs index d5ad8f59065..fd6d41a55b6 100644 --- a/substrate/frame/asset-conversion/src/types.rs +++ b/substrate/frame/asset-conversion/src/types.rs @@ -16,16 +16,9 @@ // limitations under the License. use super::*; - use codec::{Decode, Encode, MaxEncodedLen}; use scale_info::TypeInfo; -use sp_std::{cmp::Ordering, marker::PhantomData}; - -/// Pool ID. -/// -/// The pool's `AccountId` is derived from this type. Any changes to the type may necessitate a -/// migration. -pub(super) type PoolIdOf = (::MultiAssetId, ::MultiAssetId); +use sp_std::marker::PhantomData; /// Represents a swap path with associated asset amounts indicating how much of the asset needs to /// be deposited to get the following asset's amount withdrawn (this is inclusive of fees). @@ -35,7 +28,10 @@ pub(super) type PoolIdOf = (::MultiAssetId, ::Multi /// 1. `asset(asset1, amount_in)` take from `user` and move to the pool(asset1, asset2); /// 2. `asset(asset2, amount_out2)` transfer from pool(asset1, asset2) to pool(asset2, asset3); /// 3. `asset(asset3, amount_out3)` move from pool(asset2, asset3) to `user`. -pub(super) type BalancePath = Vec<(::MultiAssetId, ::Balance)>; +pub(super) type BalancePath = Vec<(::AssetKind, ::Balance)>; + +/// Credit of [Config::Assets]. +pub type CreditOf = Credit<::AccountId, ::Assets>; /// Stores the lp_token asset id a particular pool has been assigned. #[derive(Decode, Encode, Default, PartialEq, Eq, MaxEncodedLen, TypeInfo)] @@ -44,214 +40,94 @@ pub struct PoolInfo { pub lp_token: PoolAssetId, } -/// A trait that converts between a MultiAssetId and either the native currency or an AssetId. -pub trait MultiAssetIdConverter { - /// Returns the MultiAssetId representing the native currency of the chain. - fn get_native() -> MultiAssetId; - - /// Returns true if the given MultiAssetId is the native currency. - fn is_native(asset: &MultiAssetId) -> bool; - - /// If it's not native, returns the AssetId for the given MultiAssetId. - fn try_convert(asset: &MultiAssetId) -> MultiAssetIdConversionResult; -} - -/// Result of `MultiAssetIdConverter::try_convert`. -#[cfg_attr(feature = "std", derive(PartialEq, Debug))] -pub enum MultiAssetIdConversionResult { - /// Input asset is successfully converted. Means that converted asset is supported. - Converted(AssetId), - /// Means that input asset is the chain's native asset, if it has one, so no conversion (see - /// `MultiAssetIdConverter::get_native`). - Native, - /// Means input asset is not supported for pool. - Unsupported(MultiAssetId), -} - -/// Benchmark Helper -#[cfg(feature = "runtime-benchmarks")] -pub trait BenchmarkHelper { - /// Returns an `AssetId` from a given integer. - fn asset_id(asset_id: u32) -> AssetId; - - /// Returns a `MultiAssetId` from a given integer. - fn multiasset_id(asset_id: u32) -> MultiAssetId; -} - -#[cfg(feature = "runtime-benchmarks")] -impl BenchmarkHelper for () -where - AssetId: From, - MultiAssetId: From, -{ - fn asset_id(asset_id: u32) -> AssetId { - asset_id.into() - } - - fn multiasset_id(asset_id: u32) -> MultiAssetId { - asset_id.into() +/// Provides means to resolve the `PoolId` and `AccountId` from a pair of assets. +/// +/// Resulting `PoolId` remains consistent whether the asset pair is presented as (asset1, asset2) +/// or (asset2, asset1). The derived `AccountId` may serve as an address for liquidity provider +/// tokens. +pub trait PoolLocator { + /// Retrieves the account address associated with a valid `PoolId`. + fn address(id: &PoolId) -> Result; + /// Identifies the `PoolId` for a given pair of assets. + /// + /// Returns an error if the asset pair isn't supported. + fn pool_id(asset1: &AssetKind, asset2: &AssetKind) -> Result; + /// Retrieves the account address associated with a given asset pair. + /// + /// Returns an error if the asset pair isn't supported. + fn pool_address(asset1: &AssetKind, asset2: &AssetKind) -> Result { + if let Ok(id) = Self::pool_id(asset1, asset2) { + Self::address(&id) + } else { + Err(()) + } } } -/// An implementation of MultiAssetId that can be either Native or an asset. -#[derive(Decode, Encode, Default, MaxEncodedLen, TypeInfo, Clone, Copy, Debug)] -pub enum NativeOrAssetId +/// Pool locator that mandates the inclusion of the specified `FirstAsset` in every asset pair. +/// +/// The `PoolId` is represented as a tuple of `AssetKind`s with `FirstAsset` always positioned as +/// the first element. +pub struct WithFirstAsset( + PhantomData<(FirstAsset, AccountId, AssetKind)>, +); +impl PoolLocator + for WithFirstAsset where - AssetId: Ord, + AssetKind: Eq + Clone + Encode, + AccountId: Decode, + FirstAsset: Get, { - /// Native asset. For example, on the Polkadot Asset Hub this would be DOT. - #[default] - Native, - /// A non-native asset id. - Asset(AssetId), -} - -impl From for NativeOrAssetId { - fn from(asset: AssetId) -> Self { - Self::Asset(asset) - } -} - -impl Ord for NativeOrAssetId { - fn cmp(&self, other: &Self) -> Ordering { - match (self, other) { - (Self::Native, Self::Native) => Ordering::Equal, - (Self::Native, Self::Asset(_)) => Ordering::Less, - (Self::Asset(_), Self::Native) => Ordering::Greater, - (Self::Asset(id1), Self::Asset(id2)) => ::cmp(id1, id2), + fn pool_id(asset1: &AssetKind, asset2: &AssetKind) -> Result<(AssetKind, AssetKind), ()> { + let first = FirstAsset::get(); + match true { + _ if asset1 == asset2 => Err(()), + _ if first == *asset1 => Ok((first, asset2.clone())), + _ if first == *asset2 => Ok((first, asset1.clone())), + _ => Err(()), } } -} -impl PartialOrd for NativeOrAssetId { - fn partial_cmp(&self, other: &Self) -> Option { - Some(::cmp(self, other)) - } -} -impl PartialEq for NativeOrAssetId { - fn eq(&self, other: &Self) -> bool { - self.cmp(other) == Ordering::Equal + fn address(id: &(AssetKind, AssetKind)) -> Result { + let encoded = sp_io::hashing::blake2_256(&Encode::encode(id)[..]); + Decode::decode(&mut TrailingZeroInput::new(encoded.as_ref())).map_err(|_| ()) } } -impl Eq for NativeOrAssetId {} - -/// Converts between a MultiAssetId and an AssetId (or the native currency). -pub struct NativeOrAssetIdConverter { - _phantom: PhantomData, -} -impl MultiAssetIdConverter, AssetId> - for NativeOrAssetIdConverter +/// Pool locator where the `PoolId` is a tuple of `AssetKind`s arranged in ascending order. +pub struct Ascending(PhantomData<(AccountId, AssetKind)>); +impl PoolLocator + for Ascending +where + AssetKind: Ord + Clone + Encode, + AccountId: Decode, { - fn get_native() -> NativeOrAssetId { - NativeOrAssetId::Native - } - - fn is_native(asset: &NativeOrAssetId) -> bool { - *asset == Self::get_native() - } - - fn try_convert( - asset: &NativeOrAssetId, - ) -> MultiAssetIdConversionResult, AssetId> { - match asset { - NativeOrAssetId::Asset(asset) => MultiAssetIdConversionResult::Converted(asset.clone()), - NativeOrAssetId::Native => MultiAssetIdConversionResult::Native, - } - } -} - -/// Credit of [Config::Currency]. -/// -/// Implies a negative imbalance in the system that can be placed into an account or alter the total -/// supply. -pub type NativeCredit = - CreditFungible<::AccountId, ::Currency>; - -/// Credit (aka negative imbalance) of [Config::Assets]. -/// -/// Implies a negative imbalance in the system that can be placed into an account or alter the total -/// supply. -pub type AssetCredit = - CreditFungibles<::AccountId, ::Assets>; - -/// Credit that can be either [`NativeCredit`] or [`AssetCredit`]. -/// -/// Implies a negative imbalance in the system that can be placed into an account or alter the total -/// supply. -#[derive(RuntimeDebug, Eq, PartialEq)] -pub enum Credit { - /// Native credit. - Native(NativeCredit), - /// Asset credit. - Asset(AssetCredit), -} - -impl From> for Credit { - fn from(value: NativeCredit) -> Self { - Credit::Native(value) - } -} - -impl From> for Credit { - fn from(value: AssetCredit) -> Self { - Credit::Asset(value) - } -} - -impl TryInto> for Credit { - type Error = (); - fn try_into(self) -> Result, ()> { - match self { - Credit::Native(c) => Ok(c), + fn pool_id(asset1: &AssetKind, asset2: &AssetKind) -> Result<(AssetKind, AssetKind), ()> { + match true { + _ if asset1 > asset2 => Ok((asset2.clone(), asset1.clone())), + _ if asset1 < asset2 => Ok((asset1.clone(), asset2.clone())), _ => Err(()), } } -} - -impl TryInto> for Credit { - type Error = (); - fn try_into(self) -> Result, ()> { - match self { - Credit::Asset(c) => Ok(c), - _ => Err(()), - } + fn address(id: &(AssetKind, AssetKind)) -> Result { + let encoded = sp_io::hashing::blake2_256(&Encode::encode(id)[..]); + Decode::decode(&mut TrailingZeroInput::new(encoded.as_ref())).map_err(|_| ()) } } -impl Credit { - /// Create zero native credit. - pub fn native_zero() -> Self { - NativeCredit::::zero().into() - } - - /// Amount of `self`. - pub fn peek(&self) -> T::Balance { - match self { - Credit::Native(c) => c.peek(), - Credit::Asset(c) => c.peek(), - } - } - - /// Asset class of `self`. - pub fn asset(&self) -> T::MultiAssetId { - match self { - Credit::Native(_) => T::MultiAssetIdConverter::get_native(), - Credit::Asset(c) => c.asset().into(), - } +/// Pool locator that chains the `First` and `Second` implementations of [`PoolLocator`]. +/// +/// If the `First` implementation fails, it falls back to the `Second`. +pub struct Chain(PhantomData<(First, Second)>); +impl PoolLocator + for Chain +where + First: PoolLocator, + Second: PoolLocator, +{ + fn pool_id(asset1: &AssetKind, asset2: &AssetKind) -> Result<(AssetKind, AssetKind), ()> { + First::pool_id(asset1, asset2).or(Second::pool_id(asset1, asset2)) } - - /// Consume `self` and return two independent instances; the first is guaranteed to be at most - /// `amount` and the second will be the remainder. - pub fn split(self, amount: T::Balance) -> (Self, Self) { - match self { - Credit::Native(c) => { - let (left, right) = c.split(amount); - (left.into(), right.into()) - }, - Credit::Asset(c) => { - let (left, right) = c.split(amount); - (left.into(), right.into()) - }, - } + fn address(id: &(AssetKind, AssetKind)) -> Result { + First::address(id).or(Second::address(id)) } } diff --git a/substrate/frame/asset-conversion/src/weights.rs b/substrate/frame/asset-conversion/src/weights.rs index 550878ba0be..a0e687f7a41 100644 --- a/substrate/frame/asset-conversion/src/weights.rs +++ b/substrate/frame/asset-conversion/src/weights.rs @@ -15,29 +15,27 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for pallet_asset_conversion +//! Autogenerated weights for `pallet_asset_conversion` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-07-18, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-10-30, STEPS: `5`, REPEAT: `2`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-gghbxkbs-project-145-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! EXECUTION: ``, WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` +//! HOSTNAME: `cob`, CPU: `` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: `1024` // Executed Command: -// target/production/substrate +// ./target/debug/substrate-node // benchmark // pallet -// --steps=50 -// --repeat=20 +// --chain=dev +// --steps=5 +// --repeat=2 +// --pallet=pallet-asset-conversion // --extrinsic=* // --wasm-execution=compiled // --heap-pages=4096 -// --json-file=/builds/parity/mirrors/substrate/.git/.artifacts/bench.json -// --pallet=pallet_asset_conversion -// --chain=dev -// --header=./HEADER-APACHE2 -// --output=./frame/asset-conversion/src/weights.rs -// --template=./.maintain/frame-weight-template.hbs +// --output=./substrate/frame/asset-conversion/src/weights.rs +// --template=./substrate/.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -47,25 +45,25 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for pallet_asset_conversion. +/// Weight functions needed for `pallet_asset_conversion`. pub trait WeightInfo { fn create_pool() -> Weight; fn add_liquidity() -> Weight; fn remove_liquidity() -> Weight; - fn swap_exact_tokens_for_tokens() -> Weight; - fn swap_tokens_for_exact_tokens() -> Weight; + fn swap_exact_tokens_for_tokens(n: u32, ) -> Weight; + fn swap_tokens_for_exact_tokens(n: u32, ) -> Weight; } -/// Weights for pallet_asset_conversion using the Substrate node and recommended hardware. +/// Weights for `pallet_asset_conversion` using the Substrate node and recommended hardware. pub struct SubstrateWeight(PhantomData); impl WeightInfo for SubstrateWeight { /// Storage: `AssetConversion::Pools` (r:1 w:1) /// Proof: `AssetConversion::Pools` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) /// Storage: `System::Account` (r:2 w:2) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:1 w:1) + /// Storage: `Assets::Account` (r:2 w:2) /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `Assets::Asset` (r:1 w:1) + /// Storage: `Assets::Asset` (r:2 w:2) /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) /// Storage: `AssetConversion::NextPoolAssetId` (r:1 w:1) /// Proof: `AssetConversion::NextPoolAssetId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) @@ -75,20 +73,18 @@ impl WeightInfo for SubstrateWeight { /// Proof: `PoolAssets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) fn create_pool() -> Weight { // Proof Size summary in bytes: - // Measured: `729` - // Estimated: `6196` - // Minimum execution time: 131_688_000 picoseconds. - Weight::from_parts(134_092_000, 6196) - .saturating_add(T::DbWeight::get().reads(8_u64)) - .saturating_add(T::DbWeight::get().writes(8_u64)) + // Measured: `1081` + // Estimated: `6360` + // Minimum execution time: 1_576_000_000 picoseconds. + Weight::from_parts(1_668_000_000, 6360) + .saturating_add(T::DbWeight::get().reads(10_u64)) + .saturating_add(T::DbWeight::get().writes(10_u64)) } /// Storage: `AssetConversion::Pools` (r:1 w:0) /// Proof: `AssetConversion::Pools` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// Storage: `Assets::Asset` (r:1 w:1) + /// Storage: `Assets::Asset` (r:2 w:2) /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:2 w:2) + /// Storage: `Assets::Account` (r:4 w:4) /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) /// Storage: `PoolAssets::Asset` (r:1 w:1) /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) @@ -96,20 +92,18 @@ impl WeightInfo for SubstrateWeight { /// Proof: `PoolAssets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) fn add_liquidity() -> Weight { // Proof Size summary in bytes: - // Measured: `1382` - // Estimated: `6208` - // Minimum execution time: 157_310_000 picoseconds. - Weight::from_parts(161_547_000, 6208) - .saturating_add(T::DbWeight::get().reads(8_u64)) - .saturating_add(T::DbWeight::get().writes(7_u64)) + // Measured: `1761` + // Estimated: `11426` + // Minimum execution time: 1_636_000_000 picoseconds. + Weight::from_parts(1_894_000_000, 11426) + .saturating_add(T::DbWeight::get().reads(10_u64)) + .saturating_add(T::DbWeight::get().writes(9_u64)) } /// Storage: `AssetConversion::Pools` (r:1 w:0) /// Proof: `AssetConversion::Pools` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// Storage: `Assets::Asset` (r:1 w:1) + /// Storage: `Assets::Asset` (r:2 w:2) /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:2 w:2) + /// Storage: `Assets::Account` (r:4 w:4) /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) /// Storage: `PoolAssets::Asset` (r:1 w:1) /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) @@ -117,42 +111,46 @@ impl WeightInfo for SubstrateWeight { /// Proof: `PoolAssets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) fn remove_liquidity() -> Weight { // Proof Size summary in bytes: - // Measured: `1371` - // Estimated: `6208` - // Minimum execution time: 142_769_000 picoseconds. - Weight::from_parts(145_139_000, 6208) - .saturating_add(T::DbWeight::get().reads(7_u64)) - .saturating_add(T::DbWeight::get().writes(6_u64)) + // Measured: `1750` + // Estimated: `11426` + // Minimum execution time: 1_507_000_000 picoseconds. + Weight::from_parts(1_524_000_000, 11426) + .saturating_add(T::DbWeight::get().reads(9_u64)) + .saturating_add(T::DbWeight::get().writes(8_u64)) } - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// Storage: `Assets::Asset` (r:3 w:3) + /// Storage: `Assets::Asset` (r:4 w:4) /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:6 w:6) + /// Storage: `Assets::Account` (r:8 w:8) /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - fn swap_exact_tokens_for_tokens() -> Weight { + /// The range of component `n` is `[2, 4]`. + fn swap_exact_tokens_for_tokens(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1738` - // Estimated: `16644` - // Minimum execution time: 213_186_000 picoseconds. - Weight::from_parts(217_471_000, 16644) - .saturating_add(T::DbWeight::get().reads(10_u64)) - .saturating_add(T::DbWeight::get().writes(10_u64)) + // Measured: `0 + n * (522 ±0)` + // Estimated: `990 + n * (5218 ±0)` + // Minimum execution time: 937_000_000 picoseconds. + Weight::from_parts(941_000_000, 990) + // Standard Error: 40_863_477 + .saturating_add(Weight::from_parts(205_862_068, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads((3_u64).saturating_mul(n.into()))) + .saturating_add(T::DbWeight::get().writes((3_u64).saturating_mul(n.into()))) + .saturating_add(Weight::from_parts(0, 5218).saturating_mul(n.into())) } - /// Storage: `Assets::Asset` (r:3 w:3) + /// Storage: `Assets::Asset` (r:4 w:4) /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:6 w:6) + /// Storage: `Assets::Account` (r:8 w:8) /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn swap_tokens_for_exact_tokens() -> Weight { + /// The range of component `n` is `[2, 4]`. + fn swap_tokens_for_exact_tokens(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1738` - // Estimated: `16644` - // Minimum execution time: 213_793_000 picoseconds. - Weight::from_parts(218_584_000, 16644) - .saturating_add(T::DbWeight::get().reads(10_u64)) - .saturating_add(T::DbWeight::get().writes(10_u64)) + // Measured: `0 + n * (522 ±0)` + // Estimated: `990 + n * (5218 ±0)` + // Minimum execution time: 935_000_000 picoseconds. + Weight::from_parts(947_000_000, 990) + // Standard Error: 46_904_620 + .saturating_add(Weight::from_parts(218_275_862, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads((3_u64).saturating_mul(n.into()))) + .saturating_add(T::DbWeight::get().writes((3_u64).saturating_mul(n.into()))) + .saturating_add(Weight::from_parts(0, 5218).saturating_mul(n.into())) } } @@ -162,9 +160,9 @@ impl WeightInfo for () { /// Proof: `AssetConversion::Pools` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) /// Storage: `System::Account` (r:2 w:2) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:1 w:1) + /// Storage: `Assets::Account` (r:2 w:2) /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `Assets::Asset` (r:1 w:1) + /// Storage: `Assets::Asset` (r:2 w:2) /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) /// Storage: `AssetConversion::NextPoolAssetId` (r:1 w:1) /// Proof: `AssetConversion::NextPoolAssetId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) @@ -174,20 +172,18 @@ impl WeightInfo for () { /// Proof: `PoolAssets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) fn create_pool() -> Weight { // Proof Size summary in bytes: - // Measured: `729` - // Estimated: `6196` - // Minimum execution time: 131_688_000 picoseconds. - Weight::from_parts(134_092_000, 6196) - .saturating_add(RocksDbWeight::get().reads(8_u64)) - .saturating_add(RocksDbWeight::get().writes(8_u64)) + // Measured: `1081` + // Estimated: `6360` + // Minimum execution time: 1_576_000_000 picoseconds. + Weight::from_parts(1_668_000_000, 6360) + .saturating_add(RocksDbWeight::get().reads(10_u64)) + .saturating_add(RocksDbWeight::get().writes(10_u64)) } /// Storage: `AssetConversion::Pools` (r:1 w:0) /// Proof: `AssetConversion::Pools` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// Storage: `Assets::Asset` (r:1 w:1) + /// Storage: `Assets::Asset` (r:2 w:2) /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:2 w:2) + /// Storage: `Assets::Account` (r:4 w:4) /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) /// Storage: `PoolAssets::Asset` (r:1 w:1) /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) @@ -195,20 +191,18 @@ impl WeightInfo for () { /// Proof: `PoolAssets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) fn add_liquidity() -> Weight { // Proof Size summary in bytes: - // Measured: `1382` - // Estimated: `6208` - // Minimum execution time: 157_310_000 picoseconds. - Weight::from_parts(161_547_000, 6208) - .saturating_add(RocksDbWeight::get().reads(8_u64)) - .saturating_add(RocksDbWeight::get().writes(7_u64)) + // Measured: `1761` + // Estimated: `11426` + // Minimum execution time: 1_636_000_000 picoseconds. + Weight::from_parts(1_894_000_000, 11426) + .saturating_add(RocksDbWeight::get().reads(10_u64)) + .saturating_add(RocksDbWeight::get().writes(9_u64)) } /// Storage: `AssetConversion::Pools` (r:1 w:0) /// Proof: `AssetConversion::Pools` (`max_values`: None, `max_size`: Some(30), added: 2505, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// Storage: `Assets::Asset` (r:1 w:1) + /// Storage: `Assets::Asset` (r:2 w:2) /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:2 w:2) + /// Storage: `Assets::Account` (r:4 w:4) /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) /// Storage: `PoolAssets::Asset` (r:1 w:1) /// Proof: `PoolAssets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) @@ -216,41 +210,45 @@ impl WeightInfo for () { /// Proof: `PoolAssets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) fn remove_liquidity() -> Weight { // Proof Size summary in bytes: - // Measured: `1371` - // Estimated: `6208` - // Minimum execution time: 142_769_000 picoseconds. - Weight::from_parts(145_139_000, 6208) - .saturating_add(RocksDbWeight::get().reads(7_u64)) - .saturating_add(RocksDbWeight::get().writes(6_u64)) + // Measured: `1750` + // Estimated: `11426` + // Minimum execution time: 1_507_000_000 picoseconds. + Weight::from_parts(1_524_000_000, 11426) + .saturating_add(RocksDbWeight::get().reads(9_u64)) + .saturating_add(RocksDbWeight::get().writes(8_u64)) } - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - /// Storage: `Assets::Asset` (r:3 w:3) + /// Storage: `Assets::Asset` (r:4 w:4) /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:6 w:6) + /// Storage: `Assets::Account` (r:8 w:8) /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - fn swap_exact_tokens_for_tokens() -> Weight { + /// The range of component `n` is `[2, 4]`. + fn swap_exact_tokens_for_tokens(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1738` - // Estimated: `16644` - // Minimum execution time: 213_186_000 picoseconds. - Weight::from_parts(217_471_000, 16644) - .saturating_add(RocksDbWeight::get().reads(10_u64)) - .saturating_add(RocksDbWeight::get().writes(10_u64)) + // Measured: `0 + n * (522 ±0)` + // Estimated: `990 + n * (5218 ±0)` + // Minimum execution time: 937_000_000 picoseconds. + Weight::from_parts(941_000_000, 990) + // Standard Error: 40_863_477 + .saturating_add(Weight::from_parts(205_862_068, 0).saturating_mul(n.into())) + .saturating_add(RocksDbWeight::get().reads((3_u64).saturating_mul(n.into()))) + .saturating_add(RocksDbWeight::get().writes((3_u64).saturating_mul(n.into()))) + .saturating_add(Weight::from_parts(0, 5218).saturating_mul(n.into())) } - /// Storage: `Assets::Asset` (r:3 w:3) + /// Storage: `Assets::Asset` (r:4 w:4) /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) - /// Storage: `Assets::Account` (r:6 w:6) + /// Storage: `Assets::Account` (r:8 w:8) /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) - /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) - fn swap_tokens_for_exact_tokens() -> Weight { + /// The range of component `n` is `[2, 4]`. + fn swap_tokens_for_exact_tokens(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1738` - // Estimated: `16644` - // Minimum execution time: 213_793_000 picoseconds. - Weight::from_parts(218_584_000, 16644) - .saturating_add(RocksDbWeight::get().reads(10_u64)) - .saturating_add(RocksDbWeight::get().writes(10_u64)) + // Measured: `0 + n * (522 ±0)` + // Estimated: `990 + n * (5218 ±0)` + // Minimum execution time: 935_000_000 picoseconds. + Weight::from_parts(947_000_000, 990) + // Standard Error: 46_904_620 + .saturating_add(Weight::from_parts(218_275_862, 0).saturating_mul(n.into())) + .saturating_add(RocksDbWeight::get().reads((3_u64).saturating_mul(n.into()))) + .saturating_add(RocksDbWeight::get().writes((3_u64).saturating_mul(n.into()))) + .saturating_add(Weight::from_parts(0, 5218).saturating_mul(n.into())) } } diff --git a/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/lib.rs b/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/lib.rs index 04a71e2ff42..ed0ed56e6e0 100644 --- a/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/lib.rs +++ b/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/lib.rs @@ -69,7 +69,6 @@ mod tests; mod payment; use frame_support::traits::tokens::AssetId; -use pallet_asset_conversion::MultiAssetIdConverter; pub use payment::*; /// Type aliases used for interaction with `OnChargeTransaction`. diff --git a/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/mock.rs b/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/mock.rs index 3f976638517..52ff3eb9905 100644 --- a/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/mock.rs +++ b/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/mock.rs @@ -16,7 +16,6 @@ use super::*; use crate as pallet_asset_conversion_tx_payment; -use codec; use frame_support::{ derive_impl, dispatch::DispatchClass, @@ -24,13 +23,19 @@ use frame_support::{ ord_parameter_types, pallet_prelude::*, parameter_types, - traits::{AsEnsureOriginWithArg, ConstU32, ConstU64, ConstU8, Imbalance, OnUnbalanced}, + traits::{ + tokens::{ + fungible::{NativeFromLeft, NativeOrWithId, UnionOf}, + imbalance::ResolveAssetTo, + }, + AsEnsureOriginWithArg, ConstU32, ConstU64, ConstU8, Imbalance, OnUnbalanced, + }, weights::{Weight, WeightToFee as WeightToFeeT}, PalletId, }; use frame_system as system; use frame_system::{EnsureRoot, EnsureSignedBy}; -use pallet_asset_conversion::{NativeOrAssetId, NativeOrAssetIdConverter}; +use pallet_asset_conversion::{Ascending, Chain, WithFirstAsset}; use pallet_transaction_payment::CurrencyAdapter; use sp_core::H256; use sp_runtime::{ @@ -225,10 +230,9 @@ impl pallet_assets::Config for Runtime { parameter_types! { pub const AssetConversionPalletId: PalletId = PalletId(*b"py/ascon"); - pub storage AllowMultiAssetPools: bool = false; - // should be non-zero if AllowMultiAssetPools is true, otherwise can be zero pub storage LiquidityWithdrawalFee: Permill = Permill::from_percent(0); pub const MaxSwapPathLength: u32 = 4; + pub const Native: NativeOrWithId = NativeOrWithId::Native; } ord_parameter_types! { @@ -237,27 +241,26 @@ ord_parameter_types! { impl pallet_asset_conversion::Config for Runtime { type RuntimeEvent = RuntimeEvent; - type Currency = Balances; - type AssetId = u32; + type Balance = Balance; + type HigherPrecisionBalance = u128; + type AssetKind = NativeOrWithId; + type Assets = UnionOf, AccountId>; + type PoolId = (Self::AssetKind, Self::AssetKind); + type PoolLocator = Chain< + WithFirstAsset>, + Ascending>, + >; type PoolAssetId = u32; - type Assets = Assets; type PoolAssets = PoolAssets; + type PoolSetupFee = ConstU64<100>; // should be more or equal to the existential deposit + type PoolSetupFeeAsset = Native; + type PoolSetupFeeTarget = ResolveAssetTo; type PalletId = AssetConversionPalletId; - type WeightInfo = (); type LPFee = ConstU32<3>; // means 0.3% - type PoolSetupFee = ConstU64<100>; // should be more or equal to the existential deposit - type PoolSetupFeeReceiver = AssetConversionOrigin; type LiquidityWithdrawalFee = LiquidityWithdrawalFee; - type AllowMultiAssetPools = AllowMultiAssetPools; type MaxSwapPathLength = MaxSwapPathLength; type MintMinLiquidity = ConstU64<100>; // 100 is good enough when the main currency has 12 decimals. - - type Balance = u64; - type HigherPrecisionBalance = u128; - - type MultiAssetId = NativeOrAssetId; - type MultiAssetIdConverter = NativeOrAssetIdConverter; - + type WeightInfo = (); pallet_asset_conversion::runtime_benchmarks_enabled! { type BenchmarkHelper = (); } @@ -266,5 +269,5 @@ impl pallet_asset_conversion::Config for Runtime { impl Config for Runtime { type RuntimeEvent = RuntimeEvent; type Fungibles = Assets; - type OnChargeAssetTransaction = AssetConversionAdapter; + type OnChargeAssetTransaction = AssetConversionAdapter; } diff --git a/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/payment.rs b/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/payment.rs index ccea9e55bbe..f2f2c57bb37 100644 --- a/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/payment.rs +++ b/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/payment.rs @@ -24,7 +24,7 @@ use frame_support::{ }; use pallet_asset_conversion::Swap; use sp_runtime::{ - traits::{DispatchInfoOf, PostDispatchInfoOf, Zero}, + traits::{DispatchInfoOf, Get, PostDispatchInfoOf, Zero}, transaction_validity::InvalidTransaction, Saturating, }; @@ -76,16 +76,17 @@ pub trait OnChargeAssetTransaction { /// Implements the asset transaction for a balance to asset converter (implementing [`Swap`]). /// /// The converter is given the complete fee in terms of the asset used for the transaction. -pub struct AssetConversionAdapter(PhantomData<(C, CON)>); +pub struct AssetConversionAdapter(PhantomData<(C, CON, N)>); /// Default implementation for a runtime instantiating this pallet, an asset to native swapper. -impl OnChargeAssetTransaction for AssetConversionAdapter +impl OnChargeAssetTransaction for AssetConversionAdapter where + N: Get, T: Config, C: Inspect<::AccountId>, - CON: Swap, MultiAssetId = T::MultiAssetId>, + CON: Swap, AssetKind = T::AssetKind>, BalanceOf: Into>, - T::MultiAssetId: From>, + T::AssetKind: From>, BalanceOf: IsType<::AccountId>>::Balance>, { type Balance = BalanceOf; @@ -116,7 +117,7 @@ where let asset_consumed = CON::swap_tokens_for_exact_tokens( who.clone(), - vec![asset_id.into(), T::MultiAssetIdConverter::get_native()], + vec![asset_id.into(), N::get()], native_asset_required, None, who.clone(), @@ -168,8 +169,8 @@ where match CON::swap_exact_tokens_for_tokens( who.clone(), // we already deposited the native to `who` vec![ - T::MultiAssetIdConverter::get_native(), // we provide the native - asset_id.into(), // we want asset_id back + N::get(), // we provide the native + asset_id.into(), // we want asset_id back ], swap_back, // amount of the native asset to convert to `asset_id` None, // no minimum amount back diff --git a/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/tests.rs b/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/tests.rs index d50a0516423..62faed269d3 100644 --- a/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/tests.rs +++ b/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/tests.rs @@ -20,14 +20,13 @@ use frame_support::{ dispatch::{DispatchInfo, PostDispatchInfo}, pallet_prelude::*, traits::{ - fungible::Inspect, + fungible::{Inspect, NativeOrWithId}, fungibles::{Inspect as FungiblesInspect, Mutate}, }, weights::Weight, }; use frame_system as system; use mock::{ExtrinsicBaseWeight, *}; -use pallet_asset_conversion::NativeOrAssetId; use pallet_balances::Call as BalancesCall; use sp_runtime::{traits::StaticLookup, BuildStorage}; @@ -127,12 +126,12 @@ fn setup_lp(asset_id: u32, balance_factor: u64) { 10_000 * balance_factor + ed_asset )); - let token_1 = NativeOrAssetId::Native; - let token_2 = NativeOrAssetId::Asset(asset_id); + let token_1 = NativeOrWithId::Native; + let token_2 = NativeOrWithId::WithId(asset_id); assert_ok!(AssetConversion::create_pool( RuntimeOrigin::signed(lp_provider), - Box::new(token_1), - Box::new(token_2) + Box::new(token_1.clone()), + Box::new(token_2.clone()) )); assert_ok!(AssetConversion::add_liquidity( @@ -228,8 +227,8 @@ fn transaction_payment_in_asset_possible() { let fee_in_native = base_weight + tx_weight + len as u64; let input_quote = AssetConversion::quote_price_tokens_for_exact_tokens( - NativeOrAssetId::Asset(asset_id), - NativeOrAssetId::Native, + NativeOrWithId::WithId(asset_id), + NativeOrWithId::Native, fee_in_native, true, ); @@ -337,8 +336,8 @@ fn transaction_payment_without_fee() { let len = 10; let fee_in_native = base_weight + weight + len as u64; let input_quote = AssetConversion::quote_price_tokens_for_exact_tokens( - NativeOrAssetId::Asset(asset_id), - NativeOrAssetId::Native, + NativeOrWithId::WithId(asset_id), + NativeOrWithId::Native, fee_in_native, true, ); @@ -355,8 +354,8 @@ fn transaction_payment_without_fee() { assert_eq!(Assets::balance(asset_id, caller), balance - fee_in_asset); let refund = AssetConversion::quote_price_exact_tokens_for_tokens( - NativeOrAssetId::Native, - NativeOrAssetId::Asset(asset_id), + NativeOrWithId::Native, + NativeOrWithId::WithId(asset_id), fee_in_native, true, ) @@ -412,8 +411,8 @@ fn asset_transaction_payment_with_tip_and_refund() { let len = 10; let fee_in_native = base_weight + weight + len as u64 + tip; let input_quote = AssetConversion::quote_price_tokens_for_exact_tokens( - NativeOrAssetId::Asset(asset_id), - NativeOrAssetId::Native, + NativeOrWithId::WithId(asset_id), + NativeOrWithId::Native, fee_in_native, true, ); @@ -428,8 +427,8 @@ fn asset_transaction_payment_with_tip_and_refund() { let final_weight = 50; let expected_fee = fee_in_native - final_weight - tip; let expected_token_refund = AssetConversion::quote_price_exact_tokens_for_tokens( - NativeOrAssetId::Native, - NativeOrAssetId::Asset(asset_id), + NativeOrWithId::Native, + NativeOrWithId::WithId(asset_id), fee_in_native - expected_fee - tip, true, ) @@ -493,8 +492,8 @@ fn payment_from_account_with_only_assets() { let fee_in_native = base_weight + weight + len as u64; let ed = Balances::minimum_balance(); let fee_in_asset = AssetConversion::quote_price_tokens_for_exact_tokens( - NativeOrAssetId::Asset(asset_id), - NativeOrAssetId::Native, + NativeOrWithId::WithId(asset_id), + NativeOrWithId::Native, fee_in_native + ed, true, ) @@ -509,8 +508,8 @@ fn payment_from_account_with_only_assets() { assert_eq!(Assets::balance(asset_id, caller), balance - fee_in_asset); let refund = AssetConversion::quote_price_exact_tokens_for_tokens( - NativeOrAssetId::Native, - NativeOrAssetId::Asset(asset_id), + NativeOrWithId::Native, + NativeOrWithId::WithId(asset_id), ed, true, ) @@ -585,8 +584,8 @@ fn converted_fee_is_never_zero_if_input_fee_is_not() { // validate even a small fee gets converted to asset. let fee_in_native = base_weight + weight + len as u64; let fee_in_asset = AssetConversion::quote_price_tokens_for_exact_tokens( - NativeOrAssetId::Asset(asset_id), - NativeOrAssetId::Native, + NativeOrWithId::WithId(asset_id), + NativeOrWithId::Native, fee_in_native, true, ) -- GitLab From b51904da5681c479e462ab0b5bdd7464dfecd27a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= <123550+andresilva@users.noreply.github.com> Date: Wed, 20 Dec 2023 14:38:01 +0000 Subject: [PATCH 068/191] use a single source for simple-mermaid dependency (#2760) this breaks cargo vendor which is necessary for building polkadot with nix --- Cargo.lock | 11 +++-------- docs/sdk/Cargo.toml | 2 +- substrate/primitives/runtime/Cargo.toml | 2 +- 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 157439446e2..76124af3d1f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5152,7 +5152,7 @@ dependencies = [ "pallet-examples", "parity-scale-codec", "scale-info", - "simple-mermaid 0.1.0 (git+https://github.com/kianenigma/simple-mermaid.git?rev=e48b187bcfd5cc75111acd9d241f1bd36604344b)", + "simple-mermaid", "sp-api", "sp-arithmetic", "sp-block-builder", @@ -12831,7 +12831,7 @@ dependencies = [ "sc-rpc", "sc-rpc-api", "scale-info", - "simple-mermaid 0.1.0 (git+https://github.com/kianenigma/simple-mermaid.git?branch=main)", + "simple-mermaid", "sp-api", "sp-core", "sp-io", @@ -16676,11 +16676,6 @@ dependencies = [ "wide", ] -[[package]] -name = "simple-mermaid" -version = "0.1.0" -source = "git+https://github.com/kianenigma/simple-mermaid.git?branch=main#e48b187bcfd5cc75111acd9d241f1bd36604344b" - [[package]] name = "simple-mermaid" version = "0.1.0" @@ -17544,7 +17539,7 @@ dependencies = [ "scale-info", "serde", "serde_json", - "simple-mermaid 0.1.0 (git+https://github.com/kianenigma/simple-mermaid.git?branch=main)", + "simple-mermaid", "sp-api", "sp-application-crypto", "sp-arithmetic", diff --git a/docs/sdk/Cargo.toml b/docs/sdk/Cargo.toml index c58c3402f6a..246da2cd68c 100644 --- a/docs/sdk/Cargo.toml +++ b/docs/sdk/Cargo.toml @@ -22,7 +22,7 @@ pallet-examples = { path = "../../substrate/frame/examples" } pallet-default-config-example = { path = "../../substrate/frame/examples/default-config" } # How we build docs in rust-docs -simple-mermaid = { git = "https://github.com/kianenigma/simple-mermaid.git", branch = "main" } +simple-mermaid = { git = "https://github.com/kianenigma/simple-mermaid.git", rev = "e48b187bcfd5cc75111acd9d241f1bd36604344b" } docify = "0.2.6" # Polkadot SDK deps, typically all should only be in scope such that we can link to their doc item. diff --git a/substrate/primitives/runtime/Cargo.toml b/substrate/primitives/runtime/Cargo.toml index 97100b88a11..a95efbd6ddd 100644 --- a/substrate/primitives/runtime/Cargo.toml +++ b/substrate/primitives/runtime/Cargo.toml @@ -34,7 +34,7 @@ sp-std = { path = "../std", default-features = false } sp-weights = { path = "../weights", default-features = false } docify = { version = "0.2.6" } -simple-mermaid = { git = "https://github.com/kianenigma/simple-mermaid.git", branch = "main" } +simple-mermaid = { git = "https://github.com/kianenigma/simple-mermaid.git", rev = "e48b187bcfd5cc75111acd9d241f1bd36604344b" } [dev-dependencies] rand = "0.8.5" -- GitLab From 280aa0b573dcaa9146e1133f219da7a3d56153dc Mon Sep 17 00:00:00 2001 From: joe petrowski <25483142+joepetrowski@users.noreply.github.com> Date: Wed, 20 Dec 2023 16:12:21 +0100 Subject: [PATCH 069/191] Add Authorize Upgrade Pattern to Frame System (#2682) Adds the `authorize_upgrade` -> `enact_authorized_upgrade` pattern to `frame-system`. This will be useful for upgrading bridged chains that are under the governance of Polkadot without passing entire runtime Wasm blobs over a bridge. Notes: - Changed `enact_authorized_upgrade` to `apply_authorized_upgrade`. Personal opinion, "apply" more accurately expresses what it's doing. Can change back if outvoted. - Remove `check_version` in favor of two extrinsics, so as to make _checked_ the default. - Left calls in `parachain-system` and marked as deprecated to prevent breaking the API. They just call into the `frame-system` functions. - Updated `frame-system` benchmarks to v2 syntax. --------- Co-authored-by: command-bot <> --- cumulus/pallets/parachain-system/src/lib.rs | 71 ++----- cumulus/pallets/parachain-system/src/tests.rs | 5 +- .../src/weights/frame_system.rs | 27 +++ .../src/weights/frame_system.rs | 27 +++ .../src/weights/frame_system.rs | 27 +++ .../src/weights/frame_system.rs | 27 +++ .../src/weights/frame_system.rs | 27 +++ .../src/weights/frame_system.rs | 27 +++ .../rococo/src/weights/frame_system.rs | 27 +++ .../westend/src/weights/frame_system.rs | 27 +++ prdoc/pr_2682.prdoc | 21 ++ .../test/tests/pallet_outer_enums_explicit.rs | 2 + .../test/tests/pallet_outer_enums_implicit.rs | 2 + .../frame/system/benchmarking/src/lib.rs | 154 ++++++++++---- substrate/frame/system/src/lib.rs | 192 ++++++++++++++++-- substrate/frame/system/src/tests.rs | 40 ++++ substrate/frame/system/src/weights.rs | 56 +++++ 17 files changed, 650 insertions(+), 109 deletions(-) create mode 100644 prdoc/pr_2682.prdoc diff --git a/cumulus/pallets/parachain-system/src/lib.rs b/cumulus/pallets/parachain-system/src/lib.rs index fc2c83627fb..ba8aff0e369 100644 --- a/cumulus/pallets/parachain-system/src/lib.rs +++ b/cumulus/pallets/parachain-system/src/lib.rs @@ -27,7 +27,7 @@ //! //! Users must ensure that they register this pallet as an inherent provider. -use codec::{Decode, Encode, MaxEncodedLen}; +use codec::{Decode, Encode}; use cumulus_primitives_core::{ relay_chain, AbridgedHostConfiguration, ChannelInfo, ChannelStatus, CollationInfo, GetChannelInfo, InboundDownwardMessage, InboundHrmpMessage, MessageSendError, @@ -50,10 +50,9 @@ use scale_info::TypeInfo; use sp_runtime::{ traits::{Block as BlockT, BlockNumberProvider, Hash}, transaction_validity::{ - InvalidTransaction, TransactionLongevity, TransactionSource, TransactionValidity, - ValidTransaction, + InvalidTransaction, TransactionSource, TransactionValidity, ValidTransaction, }, - BoundedSlice, DispatchError, FixedU128, RuntimeDebug, Saturating, + BoundedSlice, FixedU128, RuntimeDebug, Saturating, }; use sp_std::{cmp, collections::btree_map::BTreeMap, prelude::*}; use xcm::latest::XcmHash; @@ -169,20 +168,6 @@ impl CheckAssociatedRelayNumber for RelayNumberMonotonicallyIncreases { } } -/// Information needed when a new runtime binary is submitted and needs to be authorized before -/// replacing the current runtime. -#[derive(Decode, Encode, Default, PartialEq, Eq, MaxEncodedLen, TypeInfo)] -#[scale_info(skip_type_params(T))] -struct CodeUpgradeAuthorization -where - T: Config, -{ - /// Hash of the new runtime binary. - code_hash: T::Hash, - /// Whether or not to carry out version checks. - check_version: bool, -} - /// The max length of a DMP message. pub type MaxDmpMessageLenOf = <::DmpQueue as HandleMessage>::MaxMessageLen; @@ -204,7 +189,7 @@ pub mod ump_constants { pub mod pallet { use super::*; use frame_support::pallet_prelude::*; - use frame_system::pallet_prelude::*; + use frame_system::{pallet_prelude::*, WeightInfo as SystemWeightInfo}; #[pallet::pallet] #[pallet::storage_version(migration::STORAGE_VERSION)] @@ -677,16 +662,18 @@ pub mod pallet { /// /// This call requires Root origin. #[pallet::call_index(2)] - #[pallet::weight((1_000_000, DispatchClass::Operational))] + #[pallet::weight(::SystemWeightInfo::authorize_upgrade())] + #[allow(deprecated)] + #[deprecated( + note = "To be removed after June 2024. Migrate to `frame_system::authorize_upgrade`." + )] pub fn authorize_upgrade( origin: OriginFor, code_hash: T::Hash, check_version: bool, ) -> DispatchResult { ensure_root(origin)?; - AuthorizedUpgrade::::put(CodeUpgradeAuthorization { code_hash, check_version }); - - Self::deposit_event(Event::UpgradeAuthorized { code_hash }); + frame_system::Pallet::::do_authorize_upgrade(code_hash, check_version); Ok(()) } @@ -700,15 +687,17 @@ pub mod pallet { /// /// All origins are allowed. #[pallet::call_index(3)] - #[pallet::weight({1_000_000})] + #[pallet::weight(::SystemWeightInfo::apply_authorized_upgrade())] + #[allow(deprecated)] + #[deprecated( + note = "To be removed after June 2024. Migrate to `frame_system::apply_authorized_upgrade`." + )] pub fn enact_authorized_upgrade( _: OriginFor, code: Vec, ) -> DispatchResultWithPostInfo { - Self::validate_authorized_upgrade(&code[..])?; - Self::schedule_code_upgrade(code)?; - AuthorizedUpgrade::::kill(); - Ok(Pays::No.into()) + let post = frame_system::Pallet::::do_apply_authorize_upgrade(code)?; + Ok(post) } } @@ -721,8 +710,6 @@ pub mod pallet { ValidationFunctionApplied { relay_chain_block_num: RelayChainBlockNumber }, /// The relay-chain aborted the upgrade process. ValidationFunctionDiscarded, - /// An upgrade has been authorized. - UpgradeAuthorized { code_hash: T::Hash }, /// Some downward messages have been received and will be processed. DownwardMessagesReceived { count: u32 }, /// Downward messages were processed using the given weight. @@ -928,10 +915,6 @@ pub mod pallet { #[pallet::storage] pub(super) type ReservedDmpWeightOverride = StorageValue<_, Weight>; - /// The next authorized upgrade, if there is one. - #[pallet::storage] - pub(super) type AuthorizedUpgrade = StorageValue<_, CodeUpgradeAuthorization>; - /// A custom head data that should be returned as result of `validate_block`. /// /// See `Pallet::set_custom_validation_head_data` for more information. @@ -982,7 +965,8 @@ pub mod pallet { fn validate_unsigned(_source: TransactionSource, call: &Self::Call) -> TransactionValidity { if let Call::enact_authorized_upgrade { ref code } = call { - if let Ok(hash) = Self::validate_authorized_upgrade(code) { + if let Ok(hash) = frame_system::Pallet::::validate_authorized_upgrade(&code[..]) + { return Ok(ValidTransaction { priority: 100, requires: Vec::new(), @@ -1001,21 +985,6 @@ pub mod pallet { } impl Pallet { - fn validate_authorized_upgrade(code: &[u8]) -> Result { - let authorization = AuthorizedUpgrade::::get().ok_or(Error::::NothingAuthorized)?; - - // ensure that the actual hash matches the authorized hash - let actual_hash = T::Hashing::hash(code); - ensure!(actual_hash == authorization.code_hash, Error::::Unauthorized); - - // check versions if required as part of the authorization - if authorization.check_version { - frame_system::Pallet::::can_set_code(code)?; - } - - Ok(actual_hash) - } - /// Get the unincluded segment size after the given hash. /// /// If the unincluded segment doesn't contain the given hash, this returns the @@ -1563,8 +1532,8 @@ impl Pallet { } } +/// Type that implements `SetCode`. pub struct ParachainSetCode(sp_std::marker::PhantomData); - impl frame_system::SetCode for ParachainSetCode { fn set_code(code: Vec) -> DispatchResult { Pallet::::schedule_code_upgrade(code) diff --git a/cumulus/pallets/parachain-system/src/tests.rs b/cumulus/pallets/parachain-system/src/tests.rs index ab1775b40a8..7528d3d9fe8 100755 --- a/cumulus/pallets/parachain-system/src/tests.rs +++ b/cumulus/pallets/parachain-system/src/tests.rs @@ -1127,8 +1127,9 @@ fn upgrade_version_checks_should_work() { let new_code = vec![1, 2, 3, 4]; let new_code_hash = H256(sp_core::blake2_256(&new_code)); - let _authorize = - ParachainSystem::authorize_upgrade(RawOrigin::Root.into(), new_code_hash, true); + #[allow(deprecated)] + let _authorize = ParachainSystem::authorize_upgrade(RawOrigin::Root.into(), new_code_hash, true); + #[allow(deprecated)] let res = ParachainSystem::enact_authorized_upgrade(RawOrigin::None.into(), new_code); assert_eq!(expected.map_err(DispatchErrorWithPostInfo::from), res); diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/frame_system.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/frame_system.rs index 4f993155c19..b257c3825a7 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/frame_system.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/frame_system.rs @@ -152,4 +152,31 @@ impl frame_system::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) } + /// Storage: `System::AuthorizedUpgrade` (r:0 w:1) + /// Proof: `System::AuthorizedUpgrade` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + fn authorize_upgrade() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 33_027_000 picoseconds. + Weight::from_parts(33_027_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `System::AuthorizedUpgrade` (r:1 w:1) + /// Proof: `System::AuthorizedUpgrade` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + /// Storage: `System::Digest` (r:1 w:1) + /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) + /// Proof: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) + fn apply_authorized_upgrade() -> Weight { + // Proof Size summary in bytes: + // Measured: `22` + // Estimated: `1518` + // Minimum execution time: 118_101_992_000 picoseconds. + Weight::from_parts(118_101_992_000, 0) + .saturating_add(Weight::from_parts(0, 1518)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(3)) + } } diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/frame_system.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/frame_system.rs index 6c741af2a13..687b87e4391 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/frame_system.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/frame_system.rs @@ -151,4 +151,31 @@ impl frame_system::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) } + /// Storage: `System::AuthorizedUpgrade` (r:0 w:1) + /// Proof: `System::AuthorizedUpgrade` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + fn authorize_upgrade() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 33_027_000 picoseconds. + Weight::from_parts(33_027_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `System::AuthorizedUpgrade` (r:1 w:1) + /// Proof: `System::AuthorizedUpgrade` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + /// Storage: `System::Digest` (r:1 w:1) + /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) + /// Proof: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) + fn apply_authorized_upgrade() -> Weight { + // Proof Size summary in bytes: + // Measured: `22` + // Estimated: `1518` + // Minimum execution time: 118_101_992_000 picoseconds. + Weight::from_parts(118_101_992_000, 0) + .saturating_add(Weight::from_parts(0, 1518)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(3)) + } } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/frame_system.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/frame_system.rs index b0f7806be8e..df440a68a36 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/frame_system.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/frame_system.rs @@ -151,4 +151,31 @@ impl frame_system::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) } + /// Storage: `System::AuthorizedUpgrade` (r:0 w:1) + /// Proof: `System::AuthorizedUpgrade` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + fn authorize_upgrade() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 33_027_000 picoseconds. + Weight::from_parts(33_027_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `System::AuthorizedUpgrade` (r:1 w:1) + /// Proof: `System::AuthorizedUpgrade` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + /// Storage: `System::Digest` (r:1 w:1) + /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) + /// Proof: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) + fn apply_authorized_upgrade() -> Weight { + // Proof Size summary in bytes: + // Measured: `22` + // Estimated: `1518` + // Minimum execution time: 118_101_992_000 picoseconds. + Weight::from_parts(118_101_992_000, 0) + .saturating_add(Weight::from_parts(0, 1518)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(3)) + } } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/frame_system.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/frame_system.rs index 3dec4cc7f18..7db371d6af9 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/frame_system.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/frame_system.rs @@ -152,4 +152,31 @@ impl frame_system::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) } + /// Storage: `System::AuthorizedUpgrade` (r:0 w:1) + /// Proof: `System::AuthorizedUpgrade` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + fn authorize_upgrade() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 33_027_000 picoseconds. + Weight::from_parts(33_027_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `System::AuthorizedUpgrade` (r:1 w:1) + /// Proof: `System::AuthorizedUpgrade` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + /// Storage: `System::Digest` (r:1 w:1) + /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) + /// Proof: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) + fn apply_authorized_upgrade() -> Weight { + // Proof Size summary in bytes: + // Measured: `22` + // Estimated: `1518` + // Minimum execution time: 118_101_992_000 picoseconds. + Weight::from_parts(118_101_992_000, 0) + .saturating_add(Weight::from_parts(0, 1518)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(3)) + } } diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/frame_system.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/frame_system.rs index b6f1dc8dc08..f43c5e0a40b 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/frame_system.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/weights/frame_system.rs @@ -151,4 +151,31 @@ impl frame_system::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) } + /// Storage: `System::AuthorizedUpgrade` (r:0 w:1) + /// Proof: `System::AuthorizedUpgrade` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + fn authorize_upgrade() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 33_027_000 picoseconds. + Weight::from_parts(33_027_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `System::AuthorizedUpgrade` (r:1 w:1) + /// Proof: `System::AuthorizedUpgrade` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + /// Storage: `System::Digest` (r:1 w:1) + /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) + /// Proof: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) + fn apply_authorized_upgrade() -> Weight { + // Proof Size summary in bytes: + // Measured: `22` + // Estimated: `1518` + // Minimum execution time: 118_101_992_000 picoseconds. + Weight::from_parts(118_101_992_000, 0) + .saturating_add(Weight::from_parts(0, 1518)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(3)) + } } diff --git a/cumulus/parachains/runtimes/glutton/glutton-westend/src/weights/frame_system.rs b/cumulus/parachains/runtimes/glutton/glutton-westend/src/weights/frame_system.rs index 6f8cf4f39df..b68f16c9865 100644 --- a/cumulus/parachains/runtimes/glutton/glutton-westend/src/weights/frame_system.rs +++ b/cumulus/parachains/runtimes/glutton/glutton-westend/src/weights/frame_system.rs @@ -150,4 +150,31 @@ impl frame_system::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) } + /// Storage: `System::AuthorizedUpgrade` (r:0 w:1) + /// Proof: `System::AuthorizedUpgrade` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + fn authorize_upgrade() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 33_027_000 picoseconds. + Weight::from_parts(33_027_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `System::AuthorizedUpgrade` (r:1 w:1) + /// Proof: `System::AuthorizedUpgrade` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + /// Storage: `System::Digest` (r:1 w:1) + /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) + /// Proof: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) + fn apply_authorized_upgrade() -> Weight { + // Proof Size summary in bytes: + // Measured: `22` + // Estimated: `1518` + // Minimum execution time: 118_101_992_000 picoseconds. + Weight::from_parts(118_101_992_000, 0) + .saturating_add(Weight::from_parts(0, 1518)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(3)) + } } diff --git a/polkadot/runtime/rococo/src/weights/frame_system.rs b/polkadot/runtime/rococo/src/weights/frame_system.rs index 7765d669a57..2e49483dcc6 100644 --- a/polkadot/runtime/rococo/src/weights/frame_system.rs +++ b/polkadot/runtime/rococo/src/weights/frame_system.rs @@ -141,4 +141,31 @@ impl frame_system::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) } + /// Storage: `System::AuthorizedUpgrade` (r:0 w:1) + /// Proof: `System::AuthorizedUpgrade` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + fn authorize_upgrade() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 33_027_000 picoseconds. + Weight::from_parts(33_027_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `System::AuthorizedUpgrade` (r:1 w:1) + /// Proof: `System::AuthorizedUpgrade` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + /// Storage: `System::Digest` (r:1 w:1) + /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) + /// Proof: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) + fn apply_authorized_upgrade() -> Weight { + // Proof Size summary in bytes: + // Measured: `22` + // Estimated: `1518` + // Minimum execution time: 118_101_992_000 picoseconds. + Weight::from_parts(118_101_992_000, 0) + .saturating_add(Weight::from_parts(0, 1518)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(3)) + } } diff --git a/polkadot/runtime/westend/src/weights/frame_system.rs b/polkadot/runtime/westend/src/weights/frame_system.rs index deef0959363..f679be51715 100644 --- a/polkadot/runtime/westend/src/weights/frame_system.rs +++ b/polkadot/runtime/westend/src/weights/frame_system.rs @@ -144,4 +144,31 @@ impl frame_system::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) } + /// Storage: `System::AuthorizedUpgrade` (r:0 w:1) + /// Proof: `System::AuthorizedUpgrade` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + fn authorize_upgrade() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 33_027_000 picoseconds. + Weight::from_parts(33_027_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `System::AuthorizedUpgrade` (r:1 w:1) + /// Proof: `System::AuthorizedUpgrade` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + /// Storage: `System::Digest` (r:1 w:1) + /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) + /// Proof: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) + fn apply_authorized_upgrade() -> Weight { + // Proof Size summary in bytes: + // Measured: `22` + // Estimated: `1518` + // Minimum execution time: 118_101_992_000 picoseconds. + Weight::from_parts(118_101_992_000, 0) + .saturating_add(Weight::from_parts(0, 1518)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(3)) + } } diff --git a/prdoc/pr_2682.prdoc b/prdoc/pr_2682.prdoc new file mode 100644 index 00000000000..eaa5f5a4a9a --- /dev/null +++ b/prdoc/pr_2682.prdoc @@ -0,0 +1,21 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "Add Authorize Upgrade Pattern to Frame System" + +doc: + - audience: Runtime User + description: | + Adds the `authorize_upgrade` -> `enact_authorized_upgrade` pattern to `frame-system`. This + will be useful for upgrading bridged chains that are under the governance of Polkadot without + passing entire runtime Wasm blobs over a bridge. + + Notes: + + - Changed `enact_authorized_upgrade` to `apply_authorized_upgrade`. + - Left calls in `parachain-system` and marked as deprecated to prevent breaking the API. They + just call into the `frame-system` functions. + - Deprecated calls will be removed no earlier than June 2024. + - Updated `frame-system` benchmarks to v2 syntax. + +crates: [ ] diff --git a/substrate/frame/support/test/tests/pallet_outer_enums_explicit.rs b/substrate/frame/support/test/tests/pallet_outer_enums_explicit.rs index d2acb798a2e..79e9d678671 100644 --- a/substrate/frame/support/test/tests/pallet_outer_enums_explicit.rs +++ b/substrate/frame/support/test/tests/pallet_outer_enums_explicit.rs @@ -94,6 +94,8 @@ fn module_error_outer_enum_expand_explicit() { frame_system::Error::InvalidTask => (), #[cfg(feature = "experimental")] frame_system::Error::FailedTask => (), + frame_system::Error::NothingAuthorized => (), + frame_system::Error::Unauthorized => (), frame_system::Error::__Ignore(_, _) => (), }, diff --git a/substrate/frame/support/test/tests/pallet_outer_enums_implicit.rs b/substrate/frame/support/test/tests/pallet_outer_enums_implicit.rs index 16a4b378f75..4bd8ee0bb39 100644 --- a/substrate/frame/support/test/tests/pallet_outer_enums_implicit.rs +++ b/substrate/frame/support/test/tests/pallet_outer_enums_implicit.rs @@ -94,6 +94,8 @@ fn module_error_outer_enum_expand_implicit() { frame_system::Error::InvalidTask => (), #[cfg(feature = "experimental")] frame_system::Error::FailedTask => (), + frame_system::Error::NothingAuthorized => (), + frame_system::Error::Unauthorized => (), frame_system::Error::__Ignore(_, _) => (), }, diff --git a/substrate/frame/system/benchmarking/src/lib.rs b/substrate/frame/system/benchmarking/src/lib.rs index d85b631af01..18bfb85f52d 100644 --- a/substrate/frame/system/benchmarking/src/lib.rs +++ b/substrate/frame/system/benchmarking/src/lib.rs @@ -21,10 +21,7 @@ #![cfg(feature = "runtime-benchmarks")] use codec::Encode; -use frame_benchmarking::{ - v1::{benchmarks, whitelisted_caller}, - BenchmarkError, -}; +use frame_benchmarking::{impl_benchmark_test_suite, v2::*}; use frame_support::{dispatch::DispatchClass, storage, traits::Get}; use frame_system::{Call, Pallet as System, RawOrigin}; use sp_core::storage::well_known_keys; @@ -55,69 +52,104 @@ pub trait Config: frame_system::Config { } } -benchmarks! { - remark { - let b in 0 .. *T::BlockLength::get().max.get(DispatchClass::Normal) as u32; +#[benchmarks] +mod benchmarks { + use super::*; + + #[benchmark] + fn remark( + b: Linear<0, { *T::BlockLength::get().max.get(DispatchClass::Normal) as u32 }>, + ) -> Result<(), BenchmarkError> { let remark_message = vec![1; b as usize]; let caller = whitelisted_caller(); - }: _(RawOrigin::Signed(caller), remark_message) - remark_with_event { - let b in 0 .. *T::BlockLength::get().max.get(DispatchClass::Normal) as u32; + #[extrinsic_call] + remark(RawOrigin::Signed(caller), remark_message); + + Ok(()) + } + + #[benchmark] + fn remark_with_event( + b: Linear<0, { *T::BlockLength::get().max.get(DispatchClass::Normal) as u32 }>, + ) -> Result<(), BenchmarkError> { let remark_message = vec![1; b as usize]; - let caller = whitelisted_caller(); - }: _(RawOrigin::Signed(caller), remark_message) + let caller: T::AccountId = whitelisted_caller(); + let hash = T::Hashing::hash(&remark_message[..]); - set_heap_pages { - }: _(RawOrigin::Root, Default::default()) + #[extrinsic_call] + remark_with_event(RawOrigin::Signed(caller.clone()), remark_message); - set_code { + System::::assert_last_event( + frame_system::Event::::Remarked { sender: caller, hash }.into(), + ); + Ok(()) + } + + #[benchmark] + fn set_heap_pages() -> Result<(), BenchmarkError> { + #[extrinsic_call] + set_heap_pages(RawOrigin::Root, Default::default()); + + Ok(()) + } + + #[benchmark] + fn set_code() -> Result<(), BenchmarkError> { let runtime_blob = T::prepare_set_code_data(); T::setup_set_code_requirements(&runtime_blob)?; - }: _(RawOrigin::Root, runtime_blob) - verify { - T::verify_set_code() + + #[extrinsic_call] + set_code(RawOrigin::Root, runtime_blob); + + T::verify_set_code(); + Ok(()) } - #[extra] - set_code_without_checks { + #[benchmark(extra)] + fn set_code_without_checks() -> Result<(), BenchmarkError> { // Assume Wasm ~4MB let code = vec![1; 4_000_000 as usize]; T::setup_set_code_requirements(&code)?; - }: _(RawOrigin::Root, code) - verify { - let current_code = storage::unhashed::get_raw(well_known_keys::CODE).ok_or("Code not stored.")?; + + #[block] + { + System::::set_code_without_checks(RawOrigin::Root.into(), code)?; + } + + let current_code = + storage::unhashed::get_raw(well_known_keys::CODE).ok_or("Code not stored.")?; assert_eq!(current_code.len(), 4_000_000 as usize); + Ok(()) } - #[skip_meta] - set_storage { - let i in 0 .. 1000; - + #[benchmark(skip_meta)] + fn set_storage(i: Linear<0, { 1_000 }>) -> Result<(), BenchmarkError> { // Set up i items to add let mut items = Vec::new(); - for j in 0 .. i { + for j in 0..i { let hash = (i, j).using_encoded(T::Hashing::hash).as_ref().to_vec(); items.push((hash.clone(), hash.clone())); } let items_to_verify = items.clone(); - }: _(RawOrigin::Root, items) - verify { + + #[extrinsic_call] + set_storage(RawOrigin::Root, items); + // Verify that they're actually in the storage. for (item, _) in items_to_verify { let value = storage::unhashed::get_raw(&item).ok_or("No value stored")?; assert_eq!(value, *item); } + Ok(()) } - #[skip_meta] - kill_storage { - let i in 0 .. 1000; - + #[benchmark(skip_meta)] + fn kill_storage(i: Linear<0, { 1_000 }>) -> Result<(), BenchmarkError> { // Add i items to storage let mut items = Vec::with_capacity(i as usize); - for j in 0 .. i { + for j in 0..i { let hash = (i, j).using_encoded(T::Hashing::hash).as_ref().to_vec(); storage::unhashed::put_raw(&hash, &hash); items.push(hash); @@ -130,22 +162,23 @@ benchmarks! { } let items_to_verify = items.clone(); - }: _(RawOrigin::Root, items) - verify { + + #[extrinsic_call] + kill_storage(RawOrigin::Root, items); + // Verify that they're not in the storage anymore. for item in items_to_verify { assert!(storage::unhashed::get_raw(&item).is_none()); } + Ok(()) } - #[skip_meta] - kill_prefix { - let p in 0 .. 1000; - + #[benchmark(skip_meta)] + fn kill_prefix(p: Linear<0, { 1_000 }>) -> Result<(), BenchmarkError> { let prefix = p.using_encoded(T::Hashing::hash).as_ref().to_vec(); let mut items = Vec::with_capacity(p as usize); // add p items that share a prefix - for i in 0 .. p { + for i in 0..p { let hash = (p, i).using_encoded(T::Hashing::hash).as_ref().to_vec(); let key = [&prefix[..], &hash[..]].concat(); storage::unhashed::put_raw(&key, &key); @@ -157,12 +190,45 @@ benchmarks! { let value = storage::unhashed::get_raw(item).ok_or("No value stored")?; assert_eq!(value, *item); } - }: _(RawOrigin::Root, prefix, p) - verify { + + #[extrinsic_call] + kill_prefix(RawOrigin::Root, prefix, p); + // Verify that they're not in the storage anymore. for item in items { assert!(storage::unhashed::get_raw(&item).is_none()); } + Ok(()) + } + + #[benchmark] + fn authorize_upgrade() -> Result<(), BenchmarkError> { + let runtime_blob = T::prepare_set_code_data(); + T::setup_set_code_requirements(&runtime_blob)?; + let hash = T::Hashing::hash(&runtime_blob); + + #[extrinsic_call] + authorize_upgrade(RawOrigin::Root, hash); + + assert!(System::::authorized_upgrade().is_some()); + Ok(()) + } + + #[benchmark] + fn apply_authorized_upgrade() -> Result<(), BenchmarkError> { + let runtime_blob = T::prepare_set_code_data(); + T::setup_set_code_requirements(&runtime_blob)?; + let hash = T::Hashing::hash(&runtime_blob); + // Will be heavier when it needs to do verification (i.e. don't use `...without_checks`). + System::::authorize_upgrade(RawOrigin::Root.into(), hash)?; + + #[extrinsic_call] + apply_authorized_upgrade(RawOrigin::Root, runtime_blob); + + // Can't check for `CodeUpdated` in parachain upgrades. Just check that the authorization is + // gone. + assert!(System::::authorized_upgrade().is_none()); + Ok(()) } impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::Test); diff --git a/substrate/frame/system/src/lib.rs b/substrate/frame/system/src/lib.rs index 20794d58cb6..069217bcee4 100644 --- a/substrate/frame/system/src/lib.rs +++ b/substrate/frame/system/src/lib.rs @@ -17,27 +17,60 @@ //! # System Pallet //! -//! The System pallet provides low-level access to core types and cross-cutting utilities. -//! It acts as the base layer for other pallets to interact with the Substrate framework components. +//! The System pallet provides low-level access to core types and cross-cutting utilities. It acts +//! as the base layer for other pallets to interact with the Substrate framework components. //! //! - [`Config`] //! //! ## Overview //! -//! The System pallet defines the core data types used in a Substrate runtime. -//! It also provides several utility functions (see [`Pallet`]) for other FRAME pallets. +//! The System pallet defines the core data types used in a Substrate runtime. It also provides +//! several utility functions (see [`Pallet`]) for other FRAME pallets. //! -//! In addition, it manages the storage items for extrinsics data, indexes, event records, and -//! digest items, among other things that support the execution of the current block. +//! In addition, it manages the storage items for extrinsic data, indices, event records, and digest +//! items, among other things that support the execution of the current block. //! -//! It also handles low-level tasks like depositing logs, basic set up and take down of -//! temporary storage entries, and access to previous block hashes. +//! It also handles low-level tasks like depositing logs, basic set up and take down of temporary +//! storage entries, and access to previous block hashes. //! //! ## Interface //! //! ### Dispatchable Functions //! -//! The System pallet does not implement any dispatchable functions. +//! The System pallet provides dispatchable functions that, with the exception of `remark`, manage +//! low-level or privileged functionality of a Substrate-based runtime. +//! +//! - `remark`: Make some on-chain remark. +//! - `set_heap_pages`: Set the number of pages in the WebAssembly environment's heap. +//! - `set_code`: Set the new runtime code. +//! - `set_code_without_checks`: Set the new runtime code without any checks. +//! - `set_storage`: Set some items of storage. +//! - `kill_storage`: Kill some items from storage. +//! - `kill_prefix`: Kill all storage items with a key that starts with the given prefix. +//! - `remark_with_event`: Make some on-chain remark and emit an event. +//! - `do_task`: Do some specified task. +//! - `authorize_upgrade`: Authorize new runtime code. +//! - `authorize_upgrade_without_checks`: Authorize new runtime code and an upgrade sans +//! verification. +//! - `apply_authorized_upgrade`: Provide new, already-authorized runtime code. +//! +//! #### A Note on Upgrades +//! +//! The pallet provides two primary means of upgrading the runtime, a single-phase means using +//! `set_code` and a two-phase means using `authorize_upgrade` followed by +//! `apply_authorized_upgrade`. The first will directly attempt to apply the provided `code` +//! (application may have to be scheduled, depending on the context and implementation of the +//! `OnSetCode` trait). +//! +//! The `authorize_upgrade` route allows the authorization of a runtime's code hash. Once +//! authorized, anyone may upload the correct runtime to apply the code. This pattern is useful when +//! providing the runtime ahead of time may be unwieldy, for example when a large preimage (the +//! code) would need to be stored on-chain or sent over a message transport protocol such as a +//! bridge. +//! +//! The `*_without_checks` variants do not perform any version checks, so using them runs the risk +//! of applying a downgrade or entirely other chain specification. They will still validate that the +//! `code` meets the authorized hash. //! //! ### Public Functions //! @@ -59,7 +92,7 @@ //! - [`CheckTxVersion`]: Checks that the transaction version is the same as the one used to sign //! the transaction. //! -//! Lookup the runtime aggregator file (e.g. `node/runtime`) to see the full list of signed +//! Look up the runtime aggregator file (e.g. `node/runtime`) to see the full list of signed //! extensions included in a chain. #![cfg_attr(not(feature = "std"), no_std)] @@ -77,6 +110,10 @@ use sp_runtime::{ Hash, Header, Lookup, LookupError, MaybeDisplay, MaybeSerializeDeserialize, Member, One, Saturating, SimpleBitOps, StaticLookup, Zero, }, + transaction_validity::{ + InvalidTransaction, TransactionLongevity, TransactionSource, TransactionValidity, + ValidTransaction, + }, DispatchError, RuntimeDebug, }; #[cfg(any(feature = "std", test))] @@ -90,9 +127,10 @@ use frame_support::traits::BuildGenesisConfig; use frame_support::{ dispatch::{ extract_actual_pays_fee, extract_actual_weight, DispatchClass, DispatchInfo, - DispatchResult, DispatchResultWithPostInfo, PerDispatchClass, + DispatchResult, DispatchResultWithPostInfo, PerDispatchClass, PostDispatchInfo, }, - impl_ensure_origin_with_arg_ignoring_arg, + ensure, impl_ensure_origin_with_arg_ignoring_arg, + pallet_prelude::Pays, storage::{self, StorageStreamIter}, traits::{ ConstU32, Contains, EnsureOrigin, EnsureOriginWithArg, Get, HandleLifetime, @@ -198,6 +236,20 @@ impl, MaxOverflow: Get> ConsumerLimits for (MaxNormal, } } +/// Information needed when a new runtime binary is submitted and needs to be authorized before +/// replacing the current runtime. +#[derive(Decode, Encode, Default, PartialEq, Eq, MaxEncodedLen, TypeInfo)] +#[scale_info(skip_type_params(T))] +pub struct CodeUpgradeAuthorization +where + T: Config, +{ + /// Hash of the new runtime binary. + code_hash: T::Hash, + /// Whether or not to carry out version checks. + check_version: bool, +} + #[frame_support::pallet] pub mod pallet { use crate::{self as frame_system, pallet_prelude::*, *}; @@ -661,6 +713,56 @@ pub mod pallet { // Return success. Ok(().into()) } + + /// Authorize an upgrade to a given `code_hash` for the runtime. The runtime can be supplied + /// later. + /// + /// This call requires Root origin. + #[pallet::call_index(9)] + #[pallet::weight((T::SystemWeightInfo::authorize_upgrade(), DispatchClass::Operational))] + pub fn authorize_upgrade(origin: OriginFor, code_hash: T::Hash) -> DispatchResult { + ensure_root(origin)?; + Self::do_authorize_upgrade(code_hash, true); + Ok(()) + } + + /// Authorize an upgrade to a given `code_hash` for the runtime. The runtime can be supplied + /// later. + /// + /// WARNING: This authorizes an upgrade that will take place without any safety checks, for + /// example that the spec name remains the same and that the version number increases. Not + /// recommended for normal use. Use `authorize_upgrade` instead. + /// + /// This call requires Root origin. + #[pallet::call_index(10)] + #[pallet::weight((T::SystemWeightInfo::authorize_upgrade(), DispatchClass::Operational))] + pub fn authorize_upgrade_without_checks( + origin: OriginFor, + code_hash: T::Hash, + ) -> DispatchResult { + ensure_root(origin)?; + Self::do_authorize_upgrade(code_hash, false); + Ok(()) + } + + /// Provide the preimage (runtime binary) `code` for an upgrade that has been authorized. + /// + /// If the authorization required a version check, this call will ensure the spec name + /// remains unchanged and that the spec version has increased. + /// + /// Depending on the runtime's `OnSetCode` configuration, this function may directly apply + /// the new `code` in the same block or attempt to schedule the upgrade. + /// + /// All origins are allowed. + #[pallet::call_index(11)] + #[pallet::weight((T::SystemWeightInfo::apply_authorized_upgrade(), DispatchClass::Operational))] + pub fn apply_authorized_upgrade( + _: OriginFor, + code: Vec, + ) -> DispatchResultWithPostInfo { + let post = Self::do_apply_authorize_upgrade(code)?; + Ok(post) + } } /// Event for the System pallet. @@ -687,6 +789,8 @@ pub mod pallet { #[cfg(feature = "experimental")] /// A [`Task`] failed during execution. TaskFailed { task: T::RuntimeTask, err: DispatchError }, + /// An upgrade was authorized. + UpgradeAuthorized { code_hash: T::Hash, check_version: bool }, } /// Error for the System pallet @@ -714,6 +818,10 @@ pub mod pallet { #[cfg(feature = "experimental")] /// The specified [`Task`] failed during execution. FailedTask, + /// No upgrade authorized. + NothingAuthorized, + /// The submitted code is not authorized. + Unauthorized, } /// Exposed trait-generic origin type. @@ -829,6 +937,12 @@ pub mod pallet { #[pallet::whitelist_storage] pub(super) type ExecutionPhase = StorageValue<_, Phase>; + /// `Some` if a code upgrade has been authorized. + #[pallet::storage] + #[pallet::getter(fn authorized_upgrade)] + pub(super) type AuthorizedUpgrade = + StorageValue<_, CodeUpgradeAuthorization, OptionQuery>; + #[derive(frame_support::DefaultNoBound)] #[pallet::genesis_config] pub struct GenesisConfig { @@ -848,6 +962,25 @@ pub mod pallet { sp_io::storage::set(well_known_keys::EXTRINSIC_INDEX, &0u32.encode()); } } + + #[pallet::validate_unsigned] + impl sp_runtime::traits::ValidateUnsigned for Pallet { + type Call = Call; + fn validate_unsigned(_source: TransactionSource, call: &Self::Call) -> TransactionValidity { + if let Call::apply_authorized_upgrade { ref code } = call { + if let Ok(hash) = Self::validate_authorized_upgrade(&code[..]) { + return Ok(ValidTransaction { + priority: 100, + requires: Vec::new(), + provides: vec![hash.as_ref().to_vec()], + longevity: TransactionLongevity::max_value(), + propagate: true, + }) + } + } + Err(InvalidTransaction::Call.into()) + } + } } pub type Key = Vec; @@ -1872,6 +2005,41 @@ impl Pallet { } } } + + /// To be called after any origin/privilege checks. Put the code upgrade authorization into + /// storage and emit an event. Infallible. + pub fn do_authorize_upgrade(code_hash: T::Hash, check_version: bool) { + AuthorizedUpgrade::::put(CodeUpgradeAuthorization { code_hash, check_version }); + Self::deposit_event(Event::UpgradeAuthorized { code_hash, check_version }); + } + + /// Apply an authorized upgrade, performing any validation checks, and remove the authorization. + /// Whether or not the code is set directly depends on the `OnSetCode` configuration of the + /// runtime. + pub fn do_apply_authorize_upgrade(code: Vec) -> Result { + Self::validate_authorized_upgrade(&code[..])?; + T::OnSetCode::set_code(code)?; + AuthorizedUpgrade::::kill(); + let post = PostDispatchInfo { + // consume the rest of the block to prevent further transactions + actual_weight: Some(T::BlockWeights::get().max_block), + // no fee for valid upgrade + pays_fee: Pays::No, + }; + Ok(post) + } + + /// Check that provided `code` can be upgraded to. Namely, check that its hash matches an + /// existing authorization and that it meets the specification requirements of `can_set_code`. + pub fn validate_authorized_upgrade(code: &[u8]) -> Result { + let authorization = AuthorizedUpgrade::::get().ok_or(Error::::NothingAuthorized)?; + let actual_hash = T::Hashing::hash(code); + ensure!(actual_hash == authorization.code_hash, Error::::Unauthorized); + if authorization.check_version { + Self::can_set_code(code)? + } + Ok(actual_hash) + } } /// Returns a 32 byte datum which is guaranteed to be universally unique. `entropy` is provided diff --git a/substrate/frame/system/src/tests.rs b/substrate/frame/system/src/tests.rs index 6fbddaaf229..053cec24f89 100644 --- a/substrate/frame/system/src/tests.rs +++ b/substrate/frame/system/src/tests.rs @@ -675,6 +675,46 @@ fn set_code_with_real_wasm_blob() { }); } +#[test] +fn set_code_via_authorization_works() { + let executor = substrate_test_runtime_client::new_native_or_wasm_executor(); + let mut ext = new_test_ext(); + ext.register_extension(sp_core::traits::ReadRuntimeVersionExt::new(executor)); + ext.execute_with(|| { + System::set_block_number(1); + assert!(System::authorized_upgrade().is_none()); + + let runtime = substrate_test_runtime_client::runtime::wasm_binary_unwrap().to_vec(); + let hash = ::Hashing::hash(&runtime); + + // Can't apply before authorization + assert_noop!( + System::apply_authorized_upgrade(RawOrigin::None.into(), runtime.clone()), + Error::::NothingAuthorized, + ); + + // Can authorize + assert_ok!(System::authorize_upgrade(RawOrigin::Root.into(), hash)); + System::assert_has_event( + SysEvent::UpgradeAuthorized { code_hash: hash, check_version: true }.into(), + ); + assert!(System::authorized_upgrade().is_some()); + + // Can't be sneaky + let mut bad_runtime = substrate_test_runtime_client::runtime::wasm_binary_unwrap().to_vec(); + bad_runtime.extend(b"sneaky"); + assert_noop!( + System::apply_authorized_upgrade(RawOrigin::None.into(), bad_runtime), + Error::::Unauthorized, + ); + + // Can apply correct runtime + assert_ok!(System::apply_authorized_upgrade(RawOrigin::None.into(), runtime)); + System::assert_has_event(SysEvent::CodeUpdated.into()); + assert!(System::authorized_upgrade().is_none()); + }); +} + #[test] fn runtime_upgraded_with_set_storage() { let executor = substrate_test_runtime_client::new_native_or_wasm_executor(); diff --git a/substrate/frame/system/src/weights.rs b/substrate/frame/system/src/weights.rs index b79db3654b9..41807dea1c5 100644 --- a/substrate/frame/system/src/weights.rs +++ b/substrate/frame/system/src/weights.rs @@ -57,6 +57,8 @@ pub trait WeightInfo { fn set_storage(i: u32, ) -> Weight; fn kill_storage(i: u32, ) -> Weight; fn kill_prefix(p: u32, ) -> Weight; + fn authorize_upgrade() -> Weight; + fn apply_authorized_upgrade() -> Weight; } /// Weights for frame_system using the Substrate node and recommended hardware. @@ -149,6 +151,33 @@ impl WeightInfo for SubstrateWeight { .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) } + /// Storage: `System::AuthorizedUpgrade` (r:0 w:1) + /// Proof: `System::AuthorizedUpgrade` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + fn authorize_upgrade() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 33_027_000 picoseconds. + Weight::from_parts(33_027_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `System::AuthorizedUpgrade` (r:1 w:1) + /// Proof: `System::AuthorizedUpgrade` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + /// Storage: `System::Digest` (r:1 w:1) + /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) + /// Proof: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) + fn apply_authorized_upgrade() -> Weight { + // Proof Size summary in bytes: + // Measured: `22` + // Estimated: `1518` + // Minimum execution time: 118_101_992_000 picoseconds. + Weight::from_parts(118_101_992_000, 0) + .saturating_add(Weight::from_parts(0, 1518)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(3)) + } } // For backwards compatibility and tests @@ -240,4 +269,31 @@ impl WeightInfo for () { .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(p.into()))) .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) } + /// Storage: `System::AuthorizedUpgrade` (r:0 w:1) + /// Proof: `System::AuthorizedUpgrade` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + fn authorize_upgrade() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 33_027_000 picoseconds. + Weight::from_parts(33_027_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(RocksDbWeight::get().writes(1)) + } + /// Storage: `System::AuthorizedUpgrade` (r:1 w:1) + /// Proof: `System::AuthorizedUpgrade` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + /// Storage: `System::Digest` (r:1 w:1) + /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) + /// Proof: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) + fn apply_authorized_upgrade() -> Weight { + // Proof Size summary in bytes: + // Measured: `22` + // Estimated: `1518` + // Minimum execution time: 118_101_992_000 picoseconds. + Weight::from_parts(118_101_992_000, 0) + .saturating_add(Weight::from_parts(0, 1518)) + .saturating_add(RocksDbWeight::get().reads(2)) + .saturating_add(RocksDbWeight::get().writes(3)) + } } -- GitLab From d68868f64a0f5c2d72c3443f9435da9a0df628b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=B3nal=20Murray?= Date: Wed, 20 Dec 2023 16:30:10 +0000 Subject: [PATCH 070/191] Fix clippy lints behind feature gates and add new CI step all features (#2569) Many clippy lints usually enforced by `-Dcomplexity` and `-Dcorrectness` are not caught by CI as they are gated by `features`, like `runtime-benchmarks`, while the clippy CI job runs with only the default features for all targets. This PR also adds a CI step to run clippy with `--all-features` to ensure the code quality is maintained behind feature gates from now on. To improve local development, clippy lints are downgraded to warnings, but they still will result in an error at CI due to the `-Dwarnings` rustflag. --------- Co-authored-by: Liam Aharon --- .gitlab/pipeline/check.yml | 1 + Cargo.toml | 11 ++-- bridges/modules/relayers/src/benchmarking.rs | 4 +- .../pallets/xcmp-queue/src/benchmarking.rs | 2 +- .../collective-content/src/benchmarking.rs | 2 +- .../src/paras_inherent/benchmarking.rs | 4 +- .../src/generic/benchmarking.rs | 26 ++++----- .../xcm-simulator/example/src/parachain.rs | 2 +- substrate/frame/alliance/src/benchmarking.rs | 57 ++++++------------- substrate/frame/bounties/src/benchmarking.rs | 2 +- .../frame/contracts/src/benchmarking/mod.rs | 5 +- .../frame/contracts/src/migration/v12.rs | 2 +- substrate/frame/democracy/src/benchmarking.rs | 2 +- .../frame/democracy/src/migrations/v1.rs | 9 +-- .../frame/fast-unstake/src/benchmarking.rs | 2 +- substrate/frame/recovery/src/benchmarking.rs | 8 +-- substrate/frame/sassafras/src/benchmarking.rs | 2 +- substrate/frame/scheduler/src/migration.rs | 6 +- substrate/frame/staking/src/pallet/impls.rs | 2 +- .../frame/state-trie-migration/src/lib.rs | 4 +- substrate/frame/uniques/src/benchmarking.rs | 4 +- .../primitives/core/src/paired_crypto.rs | 2 +- 22 files changed, 68 insertions(+), 91 deletions(-) diff --git a/.gitlab/pipeline/check.yml b/.gitlab/pipeline/check.yml index 25d6ef8c84e..1ed12e68c2c 100644 --- a/.gitlab/pipeline/check.yml +++ b/.gitlab/pipeline/check.yml @@ -8,6 +8,7 @@ cargo-clippy: RUSTFLAGS: "-D warnings" script: - SKIP_WASM_BUILD=1 cargo clippy --all-targets --locked --workspace + - SKIP_WASM_BUILD=1 cargo clippy --all-targets --all-features --locked --workspace check-try-runtime: stage: check diff --git a/Cargo.toml b/Cargo.toml index aa388404fa1..33159f8f74e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -484,20 +484,21 @@ suspicious_double_ref_op = { level = "allow", priority = 2 } [workspace.lints.clippy] all = { level = "allow", priority = 0 } -correctness = { level = "deny", priority = 1 } +correctness = { level = "warn", priority = 1 } +complexity = { level = "warn", priority = 1 } if-same-then-else = { level = "allow", priority = 2 } -complexity = { level = "deny", priority = 1 } zero-prefixed-literal = { level = "allow", priority = 2 } # 00_1000_000 type_complexity = { level = "allow", priority = 2 } # raison d'etre nonminimal-bool = { level = "allow", priority = 2 } # maybe borrowed-box = { level = "allow", priority = 2 } # Reasonable to fix this one too-many-arguments = { level = "allow", priority = 2 } # (Turning this on would lead to) +needless-lifetimes = { level = "allow", priority = 2 } # generated code unnecessary_cast = { level = "allow", priority = 2 } # Types may change identity-op = { level = "allow", priority = 2 } # One case where we do 0 + useless_conversion = { level = "allow", priority = 2 } # Types may change -unit_arg = { level = "allow", priority = 2 } # styalistic. -option-map-unit-fn = { level = "allow", priority = 2 } # styalistic -bind_instead_of_map = { level = "allow", priority = 2 } # styalistic +unit_arg = { level = "allow", priority = 2 } # stylistic +option-map-unit-fn = { level = "allow", priority = 2 } # stylistic +bind_instead_of_map = { level = "allow", priority = 2 } # stylistic erasing_op = { level = "allow", priority = 2 } # E.g. 0 * DOLLARS eq_op = { level = "allow", priority = 2 } # In tests we test equality. while_immutable_condition = { level = "allow", priority = 2 } # false positives diff --git a/bridges/modules/relayers/src/benchmarking.rs b/bridges/modules/relayers/src/benchmarking.rs index 2d74ab38f9d..00c3814a4c3 100644 --- a/bridges/modules/relayers/src/benchmarking.rs +++ b/bridges/modules/relayers/src/benchmarking.rs @@ -104,7 +104,7 @@ benchmarks! { // create slash destination account let lane = LaneId([0, 0, 0, 0]); let slash_destination = RewardsAccountParams::new(lane, *b"test", RewardsAccountOwner::ThisChain); - T::prepare_rewards_account(slash_destination.clone(), Zero::zero()); + T::prepare_rewards_account(slash_destination, Zero::zero()); }: { crate::Pallet::::slash_and_deregister(&relayer, slash_destination) } @@ -121,7 +121,7 @@ benchmarks! { let account_params = RewardsAccountParams::new(lane, *b"test", RewardsAccountOwner::ThisChain); }: { - crate::Pallet::::register_relayer_reward(account_params.clone(), &relayer, One::one()); + crate::Pallet::::register_relayer_reward(account_params, &relayer, One::one()); } verify { assert_eq!(RelayerRewards::::get(relayer, &account_params), Some(One::one())); diff --git a/cumulus/pallets/xcmp-queue/src/benchmarking.rs b/cumulus/pallets/xcmp-queue/src/benchmarking.rs index 81dfbc2bb71..49e2cc83673 100644 --- a/cumulus/pallets/xcmp-queue/src/benchmarking.rs +++ b/cumulus/pallets/xcmp-queue/src/benchmarking.rs @@ -85,7 +85,7 @@ mod benchmarks { } assert!( - OutboundXcmpStatus::::get().iter().find(|p| p.recipient == para).is_none(), + OutboundXcmpStatus::::get().iter().all(|p| p.recipient != para), "No messages in the channel; therefore removed." ); } diff --git a/cumulus/parachains/pallets/collective-content/src/benchmarking.rs b/cumulus/parachains/pallets/collective-content/src/benchmarking.rs index 1f145f725b1..943386a8427 100644 --- a/cumulus/parachains/pallets/collective-content/src/benchmarking.rs +++ b/cumulus/parachains/pallets/collective-content/src/benchmarking.rs @@ -56,7 +56,7 @@ mod benchmarks { .map_err(|_| BenchmarkError::Weightless)?; #[extrinsic_call] - _(origin as T::RuntimeOrigin, cid.clone(), Some(expire_at.clone())); + _(origin as T::RuntimeOrigin, cid.clone(), Some(expire_at)); assert_eq!(>::count(), 1); assert_last_event::( diff --git a/polkadot/runtime/parachains/src/paras_inherent/benchmarking.rs b/polkadot/runtime/parachains/src/paras_inherent/benchmarking.rs index 3043127c317..4509c5c3cc7 100644 --- a/polkadot/runtime/parachains/src/paras_inherent/benchmarking.rs +++ b/polkadot/runtime/parachains/src/paras_inherent/benchmarking.rs @@ -132,7 +132,7 @@ benchmarks! { // Ensure that the votes are for the correct session assert_eq!(vote.session, scenario._session); // Ensure that there are an expected number of candidates - let header = BenchBuilder::::header(scenario._block_number.clone()); + let header = BenchBuilder::::header(scenario._block_number); // Traverse candidates and assert descriptors are as expected for (para_id, backing_validators) in vote.backing_validators_per_candidate.iter().enumerate() { let descriptor = backing_validators.0.descriptor(); @@ -189,7 +189,7 @@ benchmarks! { // Ensure that the votes are for the correct session assert_eq!(vote.session, scenario._session); // Ensure that there are an expected number of candidates - let header = BenchBuilder::::header(scenario._block_number.clone()); + let header = BenchBuilder::::header(scenario._block_number); // Traverse candidates and assert descriptors are as expected for (para_id, backing_validators) in vote.backing_validators_per_candidate.iter().enumerate() { diff --git a/polkadot/xcm/pallet-xcm-benchmarks/src/generic/benchmarking.rs b/polkadot/xcm/pallet-xcm-benchmarks/src/generic/benchmarking.rs index f1c48ba9b83..50a7fe45e23 100644 --- a/polkadot/xcm/pallet-xcm-benchmarks/src/generic/benchmarking.rs +++ b/polkadot/xcm/pallet-xcm-benchmarks/src/generic/benchmarking.rs @@ -175,7 +175,7 @@ benchmarks! { descend_origin { let mut executor = new_executor::(Default::default()); let who = X2(OnlyChild, OnlyChild); - let instruction = Instruction::DescendOrigin(who.clone()); + let instruction = Instruction::DescendOrigin(who); let xcm = Xcm(vec![instruction]); } : { executor.bench_process(xcm)?; @@ -242,7 +242,7 @@ benchmarks! { &origin, assets.clone().into(), &XcmContext { - origin: Some(origin.clone()), + origin: Some(origin), message_id: [0; 32], topic: None, }, @@ -279,7 +279,7 @@ benchmarks! { let origin = T::subscribe_origin()?; let query_id = Default::default(); let max_response_weight = Default::default(); - let mut executor = new_executor::(origin.clone()); + let mut executor = new_executor::(origin); let instruction = Instruction::SubscribeVersion { query_id, max_response_weight }; let xcm = Xcm(vec![instruction]); } : { @@ -299,14 +299,14 @@ benchmarks! { query_id, max_response_weight, &XcmContext { - origin: Some(origin.clone()), + origin: Some(origin), message_id: [0; 32], topic: None, }, ).map_err(|_| "Could not start subscription")?; assert!(::SubscriptionService::is_subscribed(&origin)); - let mut executor = new_executor::(origin.clone()); + let mut executor = new_executor::(origin); let instruction = Instruction::UnsubscribeVersion; let xcm = Xcm(vec![instruction]); } : { @@ -538,7 +538,7 @@ benchmarks! { let mut executor = new_executor::(origin); - let instruction = Instruction::UniversalOrigin(alias.clone()); + let instruction = Instruction::UniversalOrigin(alias); let xcm = Xcm(vec![instruction]); }: { executor.bench_process(xcm)?; @@ -632,13 +632,13 @@ benchmarks! { let (unlocker, owner, asset) = T::unlockable_asset()?; - let mut executor = new_executor::(unlocker.clone()); + let mut executor = new_executor::(unlocker); // We first place the asset in lock first... ::AssetLocker::prepare_lock( unlocker, asset.clone(), - owner.clone(), + owner, ) .map_err(|_| BenchmarkError::Skip)? .enact() @@ -658,13 +658,13 @@ benchmarks! { let (unlocker, owner, asset) = T::unlockable_asset()?; - let mut executor = new_executor::(unlocker.clone()); + let mut executor = new_executor::(unlocker); // We first place the asset in lock first... ::AssetLocker::prepare_lock( unlocker, asset.clone(), - owner.clone(), + owner, ) .map_err(|_| BenchmarkError::Skip)? .enact() @@ -686,9 +686,9 @@ benchmarks! { // We first place the asset in lock first... ::AssetLocker::prepare_lock( - locker.clone(), + locker, asset.clone(), - owner.clone(), + owner, ) .map_err(|_| BenchmarkError::Skip)? .enact() @@ -739,7 +739,7 @@ benchmarks! { let mut executor = new_executor::(origin); - let instruction = Instruction::AliasOrigin(target.clone()); + let instruction = Instruction::AliasOrigin(target); let xcm = Xcm(vec![instruction]); }: { executor.bench_process(xcm)?; diff --git a/polkadot/xcm/xcm-simulator/example/src/parachain.rs b/polkadot/xcm/xcm-simulator/example/src/parachain.rs index 34828a4d2c0..69db81deff4 100644 --- a/polkadot/xcm/xcm-simulator/example/src/parachain.rs +++ b/polkadot/xcm/xcm-simulator/example/src/parachain.rs @@ -164,7 +164,7 @@ impl EnsureOriginWithArg for ForeignCreators { #[cfg(feature = "runtime-benchmarks")] fn try_successful_origin(a: &MultiLocation) -> Result { - Ok(pallet_xcm::Origin::Xcm(a.clone()).into()) + Ok(pallet_xcm::Origin::Xcm(*a).into()) } } diff --git a/substrate/frame/alliance/src/benchmarking.rs b/substrate/frame/alliance/src/benchmarking.rs index 37cc3314037..cb2a04f17c5 100644 --- a/substrate/frame/alliance/src/benchmarking.rs +++ b/substrate/frame/alliance/src/benchmarking.rs @@ -183,7 +183,7 @@ mod benchmarks { let voter = &members[j as usize]; Alliance::::vote( SystemOrigin::Signed(voter.clone()).into(), - last_hash.clone(), + last_hash, index, true, )?; @@ -191,12 +191,7 @@ mod benchmarks { let voter = members[m as usize - 3].clone(); // Voter votes aye without resolving the vote. - Alliance::::vote( - SystemOrigin::Signed(voter.clone()).into(), - last_hash.clone(), - index, - true, - )?; + Alliance::::vote(SystemOrigin::Signed(voter.clone()).into(), last_hash, index, true)?; // Voter switches vote to nay, but does not kill the vote, just updates + inserts let approve = false; @@ -206,7 +201,7 @@ mod benchmarks { frame_benchmarking::benchmarking::add_to_whitelist(voter_key.into()); #[extrinsic_call] - _(SystemOrigin::Signed(voter), last_hash.clone(), index, approve); + _(SystemOrigin::Signed(voter), last_hash, index, approve); //nothing to verify Ok(()) @@ -255,24 +250,19 @@ mod benchmarks { let voter = &members[j as usize]; Alliance::::vote( SystemOrigin::Signed(voter.clone()).into(), - last_hash.clone(), + last_hash, index, true, )?; } // Voter votes aye without resolving the vote. - Alliance::::vote( - SystemOrigin::Signed(voter.clone()).into(), - last_hash.clone(), - index, - true, - )?; + Alliance::::vote(SystemOrigin::Signed(voter.clone()).into(), last_hash, index, true)?; // Voter switches vote to nay, which kills the vote Alliance::::vote( SystemOrigin::Signed(voter.clone()).into(), - last_hash.clone(), + last_hash, index, false, )?; @@ -282,7 +272,7 @@ mod benchmarks { frame_benchmarking::benchmarking::add_to_whitelist(voter_key.into()); #[extrinsic_call] - close(SystemOrigin::Signed(voter), last_hash.clone(), index, Weight::MAX, bytes_in_storage); + close(SystemOrigin::Signed(voter), last_hash, index, Weight::MAX, bytes_in_storage); assert_eq!(T::ProposalProvider::proposal_of(last_hash), None); Ok(()) @@ -330,7 +320,7 @@ mod benchmarks { // approval vote Alliance::::vote( SystemOrigin::Signed(proposer.clone()).into(), - last_hash.clone(), + last_hash, index, false, )?; @@ -340,7 +330,7 @@ mod benchmarks { let voter = &members[j as usize]; Alliance::::vote( SystemOrigin::Signed(voter.clone()).into(), - last_hash.clone(), + last_hash, index, false, )?; @@ -349,22 +339,17 @@ mod benchmarks { // Member zero is the first aye Alliance::::vote( SystemOrigin::Signed(members[0].clone()).into(), - last_hash.clone(), + last_hash, index, true, )?; let voter = members[1].clone(); // Caller switches vote to aye, which passes the vote - Alliance::::vote( - SystemOrigin::Signed(voter.clone()).into(), - last_hash.clone(), - index, - true, - )?; + Alliance::::vote(SystemOrigin::Signed(voter.clone()).into(), last_hash, index, true)?; #[extrinsic_call] - close(SystemOrigin::Signed(voter), last_hash.clone(), index, Weight::MAX, bytes_in_storage); + close(SystemOrigin::Signed(voter), last_hash, index, Weight::MAX, bytes_in_storage); assert_eq!(T::ProposalProvider::proposal_of(last_hash), None); Ok(()) @@ -414,7 +399,7 @@ mod benchmarks { let voter = &members[j as usize]; Alliance::::vote( SystemOrigin::Signed(voter.clone()).into(), - last_hash.clone(), + last_hash, index, true, )?; @@ -422,7 +407,7 @@ mod benchmarks { Alliance::::vote( SystemOrigin::Signed(voter.clone()).into(), - last_hash.clone(), + last_hash, index, false, )?; @@ -430,7 +415,7 @@ mod benchmarks { System::::set_block_number(BlockNumberFor::::max_value()); #[extrinsic_call] - close(SystemOrigin::Signed(voter), last_hash.clone(), index, Weight::MAX, bytes_in_storage); + close(SystemOrigin::Signed(voter), last_hash, index, Weight::MAX, bytes_in_storage); // The last proposal is removed. assert_eq!(T::ProposalProvider::proposal_of(last_hash), None); @@ -477,7 +462,7 @@ mod benchmarks { // The prime member votes aye, so abstentions default to aye. Alliance::::vote( SystemOrigin::Signed(proposer.clone()).into(), - last_hash.clone(), + last_hash, p - 1, true, // Vote aye. )?; @@ -489,7 +474,7 @@ mod benchmarks { let voter = &members[j as usize]; Alliance::::vote( SystemOrigin::Signed(voter.clone()).into(), - last_hash.clone(), + last_hash, index, false, )?; @@ -499,13 +484,7 @@ mod benchmarks { System::::set_block_number(BlockNumberFor::::max_value()); #[extrinsic_call] - close( - SystemOrigin::Signed(proposer), - last_hash.clone(), - index, - Weight::MAX, - bytes_in_storage, - ); + close(SystemOrigin::Signed(proposer), last_hash, index, Weight::MAX, bytes_in_storage); assert_eq!(T::ProposalProvider::proposal_of(last_hash), None); Ok(()) diff --git a/substrate/frame/bounties/src/benchmarking.rs b/substrate/frame/bounties/src/benchmarking.rs index 6fff337cba4..3558847c8fe 100644 --- a/substrate/frame/bounties/src/benchmarking.rs +++ b/substrate/frame/bounties/src/benchmarking.rs @@ -222,7 +222,7 @@ benchmarks_instance_pallet! { ); } verify { - ensure!(missed_any == false, "Missed some"); + ensure!(!missed_any, "Missed some"); if b > 0 { ensure!(budget_remaining < BalanceOf::::max_value(), "Budget not used"); assert_last_event::(Event::BountyBecameActive { index: b - 1 }.into()) diff --git a/substrate/frame/contracts/src/benchmarking/mod.rs b/substrate/frame/contracts/src/benchmarking/mod.rs index c532b354ab6..3ab76d6112a 100644 --- a/substrate/frame/contracts/src/benchmarking/mod.rs +++ b/substrate/frame/contracts/src/benchmarking/mod.rs @@ -1749,7 +1749,7 @@ benchmarks! { .collect::>>(); let deposits_bytes: Vec = deposits.iter().flat_map(|i| i.encode()).collect(); let deposits_len = deposits_bytes.len() as u32; - let deposit_len = value_len.clone(); + let deposit_len = value_len; let callee_offset = value_len + deposits_len; let code = WasmModule::::from(ModuleDefinition { memory: Some(ImportedMemory::max::()), @@ -2246,13 +2246,12 @@ benchmarks! { let message_len = message.len() as i32; let key_type = sp_core::crypto::KeyTypeId(*b"code"); let sig_params = (0..r) - .map(|i| { + .flat_map(|i| { let pub_key = sp_io::crypto::sr25519_generate(key_type, None); let sig = sp_io::crypto::sr25519_sign(key_type, &pub_key, &message).expect("Generates signature"); let data: [u8; 96] = [AsRef::<[u8]>::as_ref(&sig), AsRef::<[u8]>::as_ref(&pub_key)].concat().try_into().unwrap(); data }) - .flatten() .collect::>(); let sig_params_len = sig_params.len() as i32; diff --git a/substrate/frame/contracts/src/migration/v12.rs b/substrate/frame/contracts/src/migration/v12.rs index 4ddc57584b3..7dee3150310 100644 --- a/substrate/frame/contracts/src/migration/v12.rs +++ b/substrate/frame/contracts/src/migration/v12.rs @@ -317,7 +317,7 @@ where let (_, old_deposit, storage_module) = state; // CodeInfoOf::max_encoded_len == OwnerInfoOf::max_encoded_len + 1 // I.e. code info adds up 1 byte per record. - let info_bytes_added = items.clone(); + let info_bytes_added = items; // We removed 1 PrefabWasmModule, and added 1 byte of determinism flag, per contract code. let storage_removed = storage_module.saturating_sub(info_bytes_added); // module+code+info - bytes diff --git a/substrate/frame/democracy/src/benchmarking.rs b/substrate/frame/democracy/src/benchmarking.rs index b4aa17726b8..aa66137ad88 100644 --- a/substrate/frame/democracy/src/benchmarking.rs +++ b/substrate/frame/democracy/src/benchmarking.rs @@ -65,7 +65,7 @@ fn add_referendum(n: u32) -> (ReferendumIndex, T::Hash, T::Hash) { 0u32.into(), ); let preimage_hash = note_preimage::(); - MetadataOf::::insert(crate::MetadataOwner::Referendum(index), preimage_hash.clone()); + MetadataOf::::insert(crate::MetadataOwner::Referendum(index), preimage_hash); (index, hash, preimage_hash) } diff --git a/substrate/frame/democracy/src/migrations/v1.rs b/substrate/frame/democracy/src/migrations/v1.rs index c27f437901b..64baea8f3af 100644 --- a/substrate/frame/democracy/src/migrations/v1.rs +++ b/substrate/frame/democracy/src/migrations/v1.rs @@ -172,7 +172,7 @@ mod test { let hash = H256::repeat_byte(1); let status = ReferendumStatus { end: 1u32.into(), - proposal: hash.clone(), + proposal: hash, threshold: VoteThreshold::SuperMajorityApprove, delay: 1u32.into(), tally: Tally { ayes: 1u32.into(), nays: 1u32.into(), turnout: 1u32.into() }, @@ -187,13 +187,10 @@ mod test { // Case 3: Public proposals let hash2 = H256::repeat_byte(2); - v0::PublicProps::::put(vec![ - (3u32, hash.clone(), 123u64), - (4u32, hash2.clone(), 123u64), - ]); + v0::PublicProps::::put(vec![(3u32, hash, 123u64), (4u32, hash2, 123u64)]); // Case 4: Next external - v0::NextExternal::::put((hash.clone(), VoteThreshold::SuperMajorityApprove)); + v0::NextExternal::::put((hash, VoteThreshold::SuperMajorityApprove)); // Migrate. let state = v1::Migration::::pre_upgrade().unwrap(); diff --git a/substrate/frame/fast-unstake/src/benchmarking.rs b/substrate/frame/fast-unstake/src/benchmarking.rs index 851483e3697..4828dcb9b42 100644 --- a/substrate/frame/fast-unstake/src/benchmarking.rs +++ b/substrate/frame/fast-unstake/src/benchmarking.rs @@ -162,7 +162,7 @@ benchmarks! { fast_unstake_events::().last(), Some(Event::BatchChecked { .. }) )); - assert!(stashes.iter().all(|(s, _)| request.stashes.iter().find(|(ss, _)| ss == s).is_some())); + assert!(stashes.iter().all(|(s, _)| request.stashes.iter().any(|(ss, _)| ss == s))); } register_fast_unstake { diff --git a/substrate/frame/recovery/src/benchmarking.rs b/substrate/frame/recovery/src/benchmarking.rs index 2deb55bb69f..72f77336212 100644 --- a/substrate/frame/recovery/src/benchmarking.rs +++ b/substrate/frame/recovery/src/benchmarking.rs @@ -190,7 +190,7 @@ benchmarks! { let recovery_config = RecoveryConfig { delay_period: DEFAULT_DELAY.into(), - deposit: total_deposit.clone(), + deposit: total_deposit, friends: bounded_friends.clone(), threshold: n as u16, }; @@ -243,7 +243,7 @@ benchmarks! { let recovery_config = RecoveryConfig { delay_period: 0u32.into(), - deposit: total_deposit.clone(), + deposit: total_deposit, friends: bounded_friends.clone(), threshold: n as u16, }; @@ -294,7 +294,7 @@ benchmarks! { let recovery_config = RecoveryConfig { delay_period: DEFAULT_DELAY.into(), - deposit: total_deposit.clone(), + deposit: total_deposit, friends: bounded_friends.clone(), threshold: n as u16, }; @@ -342,7 +342,7 @@ benchmarks! { let recovery_config = RecoveryConfig { delay_period: DEFAULT_DELAY.into(), - deposit: total_deposit.clone(), + deposit: total_deposit, friends: bounded_friends.clone(), threshold: n as u16, }; diff --git a/substrate/frame/sassafras/src/benchmarking.rs b/substrate/frame/sassafras/src/benchmarking.rs index 95a2b4bbce4..921f2f0793d 100644 --- a/substrate/frame/sassafras/src/benchmarking.rs +++ b/substrate/frame/sassafras/src/benchmarking.rs @@ -260,7 +260,7 @@ mod benchmarks { // Update metadata let mut meta = TicketsMeta::::get(); meta.unsorted_tickets_count = tickets_count; - TicketsMeta::::set(meta.clone()); + TicketsMeta::::set(meta); log::debug!(target: LOG_TARGET, "Before sort: {:?}", meta); #[block] diff --git a/substrate/frame/scheduler/src/migration.rs b/substrate/frame/scheduler/src/migration.rs index 9c8b0da03fc..76e2e04b49c 100644 --- a/substrate/frame/scheduler/src/migration.rs +++ b/substrate/frame/scheduler/src/migration.rs @@ -105,7 +105,7 @@ pub mod v3 { // Check that no agenda overflows `MaxScheduledPerBlock`. let max_scheduled_per_block = T::MaxScheduledPerBlock::get() as usize; for (block_number, agenda) in Agenda::::iter() { - if agenda.iter().cloned().filter_map(|s| s).count() > max_scheduled_per_block { + if agenda.iter().cloned().flatten().count() > max_scheduled_per_block { log::error!( target: TARGET, "Would truncate agenda of block {:?} from {} items to {} items.", @@ -119,7 +119,7 @@ pub mod v3 { // Check that bounding the calls will not overflow `MAX_LENGTH`. let max_length = T::Preimages::MAX_LENGTH as usize; for (block_number, agenda) in Agenda::::iter() { - for schedule in agenda.iter().cloned().filter_map(|s| s) { + for schedule in agenda.iter().cloned().flatten() { match schedule.call { frame_support::traits::schedule::MaybeHashed::Value(call) => { let l = call.using_encoded(|c| c.len()); @@ -362,7 +362,7 @@ mod test { Some(ScheduledV3Of:: { maybe_id: Some(vec![i as u8; 320]), priority: 123, - call: MaybeHashed::Hash(undecodable_hash.clone()), + call: MaybeHashed::Hash(undecodable_hash), maybe_periodic: Some((4u64, 20)), origin: root(), _phantom: PhantomData::::default(), diff --git a/substrate/frame/staking/src/pallet/impls.rs b/substrate/frame/staking/src/pallet/impls.rs index d294686751c..093cdfdb9cb 100644 --- a/substrate/frame/staking/src/pallet/impls.rs +++ b/substrate/frame/staking/src/pallet/impls.rs @@ -1801,7 +1801,7 @@ impl StakingInterface for Pallet { ) { let others = exposures .iter() - .map(|(who, value)| IndividualExposure { who: who.clone(), value: value.clone() }) + .map(|(who, value)| IndividualExposure { who: who.clone(), value: *value }) .collect::>(); let exposure = Exposure { total: Default::default(), own: Default::default(), others }; EraInfo::::set_exposure(*current_era, stash, exposure); diff --git a/substrate/frame/state-trie-migration/src/lib.rs b/substrate/frame/state-trie-migration/src/lib.rs index 5330634ca07..8652e8e9561 100644 --- a/substrate/frame/state-trie-migration/src/lib.rs +++ b/substrate/frame/state-trie-migration/src/lib.rs @@ -1637,7 +1637,7 @@ pub(crate) mod remote_tests { weight_sum += StateTrieMigration::::on_initialize(System::::block_number()); - root = System::::finalize().state_root().clone(); + root = *System::::finalize().state_root(); System::::on_finalize(System::::block_number()); } (root, weight_sum) @@ -1687,7 +1687,7 @@ pub(crate) mod remote_tests { ); loop { - let last_state_root = ext.backend.root().clone(); + let last_state_root = *ext.backend.root(); let ((finished, weight), proof) = ext.execute_and_prove(|| { let weight = run_to_block::(now + One::one()).1; if StateTrieMigration::::migration_process().finished() { diff --git a/substrate/frame/uniques/src/benchmarking.rs b/substrate/frame/uniques/src/benchmarking.rs index 821ca1794b8..80d02f13621 100644 --- a/substrate/frame/uniques/src/benchmarking.rs +++ b/substrate/frame/uniques/src/benchmarking.rs @@ -431,9 +431,9 @@ benchmarks_instance_pallet! { let buyer_lookup = T::Lookup::unlookup(buyer.clone()); let price = ItemPrice::::from(0u32); let origin = SystemOrigin::Signed(seller.clone()).into(); - Uniques::::set_price(origin, collection.clone(), item, Some(price.clone()), Some(buyer_lookup))?; + Uniques::::set_price(origin, collection.clone(), item, Some(price), Some(buyer_lookup))?; T::Currency::make_free_balance_be(&buyer, DepositBalanceOf::::max_value()); - }: _(SystemOrigin::Signed(buyer.clone()), collection.clone(), item, price.clone()) + }: _(SystemOrigin::Signed(buyer.clone()), collection.clone(), item, price) verify { assert_last_event::(Event::ItemBought { collection: collection.clone(), diff --git a/substrate/primitives/core/src/paired_crypto.rs b/substrate/primitives/core/src/paired_crypto.rs index edf6156f268..960b8469249 100644 --- a/substrate/primitives/core/src/paired_crypto.rs +++ b/substrate/primitives/core/src/paired_crypto.rs @@ -128,7 +128,7 @@ pub mod ecdsa_bls377 { let Ok(right_sig) = sig.0[ecdsa::SIGNATURE_SERIALIZED_SIZE..].try_into() else { return false }; - bls377::Pair::verify(&right_sig, message.as_ref(), &right_pub) + bls377::Pair::verify(&right_sig, message, &right_pub) } } } -- GitLab From d84e135bbfc366a17bb6b72d0fc9d09ee781ab8d Mon Sep 17 00:00:00 2001 From: joe petrowski <25483142+joepetrowski@users.noreply.github.com> Date: Wed, 20 Dec 2023 18:34:24 +0100 Subject: [PATCH 071/191] Fix Coretime Master (#2765) Should have merged master into #2682 before merging. --- .../src/weights/frame_system.rs | 27 +++++++++++++++++++ .../src/weights/frame_system.rs | 27 +++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/frame_system.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/frame_system.rs index aee05e2b2a9..7c41112152f 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/frame_system.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/frame_system.rs @@ -138,4 +138,31 @@ impl frame_system::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().reads(1000)) .saturating_add(T::DbWeight::get().writes(1000)) } + /// Storage: `System::AuthorizedUpgrade` (r:0 w:1) + /// Proof: `System::AuthorizedUpgrade` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + fn authorize_upgrade() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 33_027_000 picoseconds. + Weight::from_parts(33_027_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `System::AuthorizedUpgrade` (r:1 w:1) + /// Proof: `System::AuthorizedUpgrade` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + /// Storage: `System::Digest` (r:1 w:1) + /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) + /// Proof: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) + fn apply_authorized_upgrade() -> Weight { + // Proof Size summary in bytes: + // Measured: `22` + // Estimated: `1518` + // Minimum execution time: 118_101_992_000 picoseconds. + Weight::from_parts(118_101_992_000, 0) + .saturating_add(Weight::from_parts(0, 1518)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(3)) + } } diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/frame_system.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/frame_system.rs index 667b99e7849..46f8113939e 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/frame_system.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/frame_system.rs @@ -131,4 +131,31 @@ impl frame_system::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) } + /// Storage: `System::AuthorizedUpgrade` (r:0 w:1) + /// Proof: `System::AuthorizedUpgrade` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + fn authorize_upgrade() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 33_027_000 picoseconds. + Weight::from_parts(33_027_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `System::AuthorizedUpgrade` (r:1 w:1) + /// Proof: `System::AuthorizedUpgrade` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + /// Storage: `System::Digest` (r:1 w:1) + /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) + /// Proof: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) + fn apply_authorized_upgrade() -> Weight { + // Proof Size summary in bytes: + // Measured: `22` + // Estimated: `1518` + // Minimum execution time: 118_101_992_000 picoseconds. + Weight::from_parts(118_101_992_000, 0) + .saturating_add(Weight::from_parts(0, 1518)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(3)) + } } -- GitLab From 9f5221cc2f7f10adfd22b293ceed060617468936 Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Thu, 21 Dec 2023 10:37:24 +0300 Subject: [PATCH 072/191] Cleanup bridges tests: with-grandpa-chain case (#2763) related to https://github.com/paritytech/parity-bridges-common/issues/2739 Co-authored-by: Branislav Kontur --- bridges/primitives/runtime/src/chain.rs | 2 +- .../bridge-hub-rococo/tests/tests.rs | 55 +-- .../src/test_cases/from_grandpa_chain.rs | 379 +++++++++--------- .../src/test_cases/from_parachain.rs | 14 +- .../test-utils/src/test_cases/helpers.rs | 27 +- .../test-utils/src/test_cases/mod.rs | 1 - .../parachains/runtimes/test-utils/src/lib.rs | 1 + 7 files changed, 225 insertions(+), 254 deletions(-) diff --git a/bridges/primitives/runtime/src/chain.rs b/bridges/primitives/runtime/src/chain.rs index 469c839ba15..81a2070bece 100644 --- a/bridges/primitives/runtime/src/chain.rs +++ b/bridges/primitives/runtime/src/chain.rs @@ -199,7 +199,7 @@ pub trait Chain: Send + Sync + 'static { } /// A trait that provides the type of the underlying chain. -pub trait UnderlyingChainProvider { +pub trait UnderlyingChainProvider: Send + Sync + 'static { /// Underlying chain type. type Chain: Chain; } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs index 0ba5fb37aef..390ac449f8c 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs @@ -373,6 +373,7 @@ mod bridge_hub_westend_tests { mod bridge_hub_bulletin_tests { use super::*; use bridge_common_config::BridgeGrandpaRococoBulletinInstance; + use bridge_hub_test_utils::test_cases::from_grandpa_chain; use bridge_to_bulletin_config::{ RococoBulletinChainId, RococoBulletinGlobalConsensusNetwork, RococoBulletinGlobalConsensusNetworkLocation, WithRococoBulletinMessageBridge, @@ -382,6 +383,15 @@ mod bridge_hub_bulletin_tests { // Para id of sibling chain used in tests. pub const SIBLING_PARACHAIN_ID: u32 = rococo_runtime_constants::system_parachain::PEOPLE_ID; + // Runtime from tests PoV + type RuntimeTestsAdapter = from_grandpa_chain::WithRemoteGrandpaChainHelperAdapter< + Runtime, + AllPalletsWithoutSystem, + BridgeGrandpaRococoBulletinInstance, + WithRococoBulletinMessagesInstance, + WithRococoBulletinMessageBridge, + >; + #[test] fn initialize_bridge_by_governance_works() { // for Bulletin finality @@ -474,14 +484,7 @@ mod bridge_hub_bulletin_tests { #[test] fn relayed_incoming_message_works() { // from Bulletin - bridge_hub_test_utils::test_cases::from_grandpa_chain::relayed_incoming_message_works::< - Runtime, - AllPalletsWithoutSystem, - ParachainSystem, - BridgeGrandpaRococoBulletinInstance, - WithRococoBulletinMessagesInstance, - WithRococoBulletinMessageBridge, - >( + from_grandpa_chain::relayed_incoming_message_works::( collator_session_keys(), bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, RococoBulletinChainId::get(), @@ -496,15 +499,7 @@ mod bridge_hub_bulletin_tests { #[test] pub fn complex_relay_extrinsic_works() { // for Bulletin - bridge_hub_test_utils::test_cases::from_grandpa_chain::complex_relay_extrinsic_works::< - Runtime, - AllPalletsWithoutSystem, - XcmConfig, - ParachainSystem, - BridgeGrandpaRococoBulletinInstance, - WithRococoBulletinMessagesInstance, - WithRococoBulletinMessageBridge, - >( + from_grandpa_chain::complex_relay_extrinsic_works::( collator_session_keys(), bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, SIBLING_PARACHAIN_ID, @@ -536,15 +531,10 @@ mod bridge_hub_bulletin_tests { #[test] pub fn can_calculate_fee_for_complex_message_delivery_transaction() { - let estimated = bridge_hub_test_utils::test_cases::from_grandpa_chain::can_calculate_fee_for_complex_message_delivery_transaction::< - Runtime, - BridgeGrandpaRococoBulletinInstance, - WithRococoBulletinMessagesInstance, - WithRococoBulletinMessageBridge, - >( - collator_session_keys(), - construct_and_estimate_extrinsic_fee - ); + let estimated = + from_grandpa_chain::can_calculate_fee_for_complex_message_delivery_transaction::< + RuntimeTestsAdapter, + >(collator_session_keys(), construct_and_estimate_extrinsic_fee); // check if estimated value is sane let max_expected = bp_bridge_hub_rococo::BridgeHubRococoBaseDeliveryFeeInRocs::get(); @@ -558,15 +548,10 @@ mod bridge_hub_bulletin_tests { #[test] pub fn can_calculate_fee_for_complex_message_confirmation_transaction() { - let estimated = bridge_hub_test_utils::test_cases::from_grandpa_chain::can_calculate_fee_for_complex_message_confirmation_transaction::< - Runtime, - BridgeGrandpaRococoBulletinInstance, - WithRococoBulletinMessagesInstance, - WithRococoBulletinMessageBridge, - >( - collator_session_keys(), - construct_and_estimate_extrinsic_fee - ); + let estimated = + from_grandpa_chain::can_calculate_fee_for_complex_message_confirmation_transaction::< + RuntimeTestsAdapter, + >(collator_session_keys(), construct_and_estimate_extrinsic_fee); // check if estimated value is sane let max_expected = bp_bridge_hub_rococo::BridgeHubRococoBaseConfirmationFeeInRocs::get(); diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs index 3a0bbf8f571..e6407e60989 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs @@ -36,27 +36,79 @@ use bridge_runtime_common::{ }, messages_xcm_extension::XcmAsPlainPayload, }; -use frame_support::traits::{Get, OnFinalize, OnInitialize, OriginTrait}; +use frame_support::traits::{Get, OnFinalize, OnInitialize}; use frame_system::pallet_prelude::BlockNumberFor; +use pallet_bridge_grandpa::{Call as BridgeGrandpaCall, Config as BridgeGrandpaConfig}; +use pallet_bridge_messages::{Call as BridgeMessagesCall, Config as BridgeMessagesConfig}; use parachains_runtimes_test_utils::{ - AccountIdOf, BasicParachainRuntime, CollatorSessionKeys, ValidatorIdOf, + AccountIdOf, BasicParachainRuntime, CollatorSessionKeys, RuntimeCallOf, }; use sp_keyring::AccountKeyring::*; use sp_runtime::{traits::Header as HeaderT, AccountId32}; use xcm::latest::prelude::*; +/// Helper trait to test bridges with remote GRANDPA chain. +/// +/// This is only used to decrease amount of lines, dedicated to bounds +pub trait WithRemoteGrandpaChainHelper { + /// This chaiin runtime. + type Runtime: BasicParachainRuntime + + cumulus_pallet_xcmp_queue::Config + + BridgeGrandpaConfig< + Self::GPI, + BridgedChain = UnderlyingChainOf>, + > + BridgeMessagesConfig< + Self::MPI, + InboundPayload = XcmAsPlainPayload, + InboundRelayer = bp_runtime::AccountIdOf>, + OutboundPayload = XcmAsPlainPayload, + > + pallet_bridge_relayers::Config; + /// All pallets of this chain, excluding system pallet. + type AllPalletsWithoutSystem: OnInitialize> + + OnFinalize>; + /// Instance of the `pallet-bridge-grandpa`, used to bridge with remote GRANDPA chain. + type GPI: 'static; + /// Instance of the `pallet-bridge-messages`, used to bridge with remote GRANDPA chain. + type MPI: 'static; + /// Messages bridge definition. + type MB: MessageBridge; +} + +/// Adapter struct that implements `WithRemoteGrandpaChainHelper` +pub struct WithRemoteGrandpaChainHelperAdapter( + sp_std::marker::PhantomData<(Runtime, AllPalletsWithoutSystem, GPI, MPI, MB)>, +); + +impl WithRemoteGrandpaChainHelper + for WithRemoteGrandpaChainHelperAdapter +where + Runtime: BasicParachainRuntime + + cumulus_pallet_xcmp_queue::Config + + BridgeGrandpaConfig>> + + BridgeMessagesConfig< + MPI, + InboundPayload = XcmAsPlainPayload, + InboundRelayer = bp_runtime::AccountIdOf>, + OutboundPayload = XcmAsPlainPayload, + > + pallet_bridge_relayers::Config, + AllPalletsWithoutSystem: + OnInitialize> + OnFinalize>, + GPI: 'static, + MPI: 'static, + MB: MessageBridge, +{ + type Runtime = Runtime; + type AllPalletsWithoutSystem = AllPalletsWithoutSystem; + type GPI = GPI; + type MPI = MPI; + type MB = MB; +} + /// Test-case makes sure that Runtime can dispatch XCM messages submitted by relayer, /// with proofs (finality, message) independently submitted. /// Also verifies relayer transaction signed extensions work as intended. -pub fn relayed_incoming_message_works< - Runtime, - AllPalletsWithoutSystem, - HrmpChannelOpener, - GPI, - MPI, - MB, ->( - collator_session_key: CollatorSessionKeys, +pub fn relayed_incoming_message_works( + collator_session_key: CollatorSessionKeys, runtime_para_id: u32, bridged_chain_id: bp_runtime::ChainId, sibling_parachain_id: u32, @@ -65,44 +117,25 @@ pub fn relayed_incoming_message_works< prepare_configuration: impl Fn(), construct_and_apply_extrinsic: fn( sp_keyring::AccountKeyring, - ::RuntimeCall, + RuntimeCallOf, ) -> sp_runtime::DispatchOutcome, ) where - Runtime: BasicParachainRuntime - + cumulus_pallet_xcmp_queue::Config - + pallet_bridge_grandpa::Config< - GPI, - BridgedChain = UnderlyingChainOf>, - > + pallet_bridge_messages::Config - + pallet_bridge_relayers::Config, - AllPalletsWithoutSystem: - OnInitialize> + OnFinalize>, - GPI: 'static, - MPI: 'static, - MB: MessageBridge, - ::BridgedChain: Send + Sync + 'static, - ::ThisChain: Send + Sync + 'static, - UnderlyingChainOf>: ChainWithGrandpa, - HrmpChannelOpener: frame_support::inherent::ProvideInherent< - Call = cumulus_pallet_parachain_system::Call, - >, - ValidatorIdOf: From>, - >::SourceHeaderChain: SourceHeaderChain< - MessagesProof = FromBridgedChainMessagesProof>>, - >, - ::AccountId: - Into<<::RuntimeOrigin as OriginTrait>::AccountId>, - ::AccountId: From, - AccountIdOf: From, - >::InboundRelayer: From, - ::RuntimeCall: From> - + From>, + RuntimeHelper: WithRemoteGrandpaChainHelper, + AccountIdOf: From, + RuntimeCallOf: From> + + From>, + UnderlyingChainOf>: ChainWithGrandpa, + >::SourceHeaderChain: + SourceHeaderChain< + MessagesProof = FromBridgedChainMessagesProof< + HashOf>, + >, + >, { helpers::relayed_incoming_message_works::< - Runtime, - AllPalletsWithoutSystem, - HrmpChannelOpener, - MPI, + RuntimeHelper::Runtime, + RuntimeHelper::AllPalletsWithoutSystem, + RuntimeHelper::MPI, >( collator_session_key, runtime_para_id, @@ -119,40 +152,42 @@ pub fn relayed_incoming_message_works< prepare_configuration(); // start with bridged relay chain block#0 - helpers::initialize_bridge_grandpa_pallet::( - test_data::initialization_data::(0), + helpers::initialize_bridge_grandpa_pallet::( + test_data::initialization_data::(0), ); // generate bridged relay chain finality, parachain heads and message proofs, // to be submitted by relayer to this chain. let (relay_chain_header, grandpa_justification, message_proof) = - test_data::from_grandpa_chain::make_complex_relayer_delivery_proofs::( - lane_id, - xcm.into(), - message_nonce, - message_destination, - relay_header_number, - ); + test_data::from_grandpa_chain::make_complex_relayer_delivery_proofs::< + RuntimeHelper::MB, + (), + >(lane_id, xcm.into(), message_nonce, message_destination, relay_header_number); let relay_chain_header_hash = relay_chain_header.hash(); vec![ ( - pallet_bridge_grandpa::Call::::submit_finality_proof { + BridgeGrandpaCall::::submit_finality_proof { finality_target: Box::new(relay_chain_header), justification: grandpa_justification, }.into(), - helpers::VerifySubmitGrandpaFinalityProofOutcome::::expect_best_header_hash(relay_chain_header_hash), + helpers::VerifySubmitGrandpaFinalityProofOutcome::::expect_best_header_hash( + relay_chain_header_hash, + ), ), ( - pallet_bridge_messages::Call::::receive_messages_proof { + BridgeMessagesCall::::receive_messages_proof { relayer_id_at_bridged_chain, proof: message_proof, messages_count: 1, dispatch_weight: Weight::from_parts(1000000000, 0), }.into(), Box::new(( - helpers::VerifySubmitMessagesProofOutcome::::expect_last_delivered_nonce(lane_id, 1), - helpers::VerifyRelayerRewarded::::expect_relayer_reward( + helpers::VerifySubmitMessagesProofOutcome::::expect_last_delivered_nonce( + lane_id, + 1, + ), + helpers::VerifyRelayerRewarded::::expect_relayer_reward( relayer_id_at_this_chain, RewardsAccountParams::new( lane_id, @@ -170,16 +205,8 @@ pub fn relayed_incoming_message_works< /// Test-case makes sure that Runtime can dispatch XCM messages submitted by relayer, /// with proofs (finality, message) batched together in signed extrinsic. /// Also verifies relayer transaction signed extensions work as intended. -pub fn complex_relay_extrinsic_works< - Runtime, - AllPalletsWithoutSystem, - XcmConfig, - HrmpChannelOpener, - GPI, - MPI, - MB, ->( - collator_session_key: CollatorSessionKeys, +pub fn complex_relay_extrinsic_works( + collator_session_key: CollatorSessionKeys, runtime_para_id: u32, sibling_parachain_id: u32, bridged_chain_id: bp_runtime::ChainId, @@ -188,46 +215,28 @@ pub fn complex_relay_extrinsic_works< prepare_configuration: impl Fn(), construct_and_apply_extrinsic: fn( sp_keyring::AccountKeyring, - ::RuntimeCall, + RuntimeCallOf, ) -> sp_runtime::DispatchOutcome, ) where - Runtime: BasicParachainRuntime - + cumulus_pallet_xcmp_queue::Config - + pallet_bridge_grandpa::Config< - GPI, - BridgedChain = UnderlyingChainOf>, - > + pallet_bridge_messages::Config - + pallet_bridge_relayers::Config - + pallet_utility::Config, - AllPalletsWithoutSystem: - OnInitialize> + OnFinalize>, - GPI: 'static, - MPI: 'static, - MB: MessageBridge, - ::BridgedChain: Send + Sync + 'static, - ::ThisChain: Send + Sync + 'static, - UnderlyingChainOf>: ChainWithGrandpa, - HrmpChannelOpener: frame_support::inherent::ProvideInherent< - Call = cumulus_pallet_parachain_system::Call, - >, - ValidatorIdOf: From>, - >::SourceHeaderChain: SourceHeaderChain< - MessagesProof = FromBridgedChainMessagesProof>>, - >, - ::AccountId: - Into<<::RuntimeOrigin as OriginTrait>::AccountId>, - ::AccountId: From, - AccountIdOf: From, - >::InboundRelayer: From, - ::RuntimeCall: From> - + From>, - ::RuntimeCall: From>, + RuntimeHelper: WithRemoteGrandpaChainHelper, + RuntimeHelper::Runtime: + pallet_utility::Config>, + AccountIdOf: From, + RuntimeCallOf: From> + + From> + + From>, + UnderlyingChainOf>: ChainWithGrandpa, + >::SourceHeaderChain: + SourceHeaderChain< + MessagesProof = FromBridgedChainMessagesProof< + HashOf>, + >, + >, { helpers::relayed_incoming_message_works::< - Runtime, - AllPalletsWithoutSystem, - HrmpChannelOpener, - MPI, + RuntimeHelper::Runtime, + RuntimeHelper::AllPalletsWithoutSystem, + RuntimeHelper::MPI, >( collator_session_key, runtime_para_id, @@ -244,41 +253,45 @@ pub fn complex_relay_extrinsic_works< prepare_configuration(); // start with bridged relay chain block#0 - helpers::initialize_bridge_grandpa_pallet::( - test_data::initialization_data::(0), + helpers::initialize_bridge_grandpa_pallet::( + test_data::initialization_data::(0), ); // generate bridged relay chain finality, parachain heads and message proofs, // to be submitted by relayer to this chain. let (relay_chain_header, grandpa_justification, message_proof) = - test_data::from_grandpa_chain::make_complex_relayer_delivery_proofs::( - lane_id, - xcm.into(), - message_nonce, - message_destination, - relay_header_number, - ); + test_data::from_grandpa_chain::make_complex_relayer_delivery_proofs::< + RuntimeHelper::MB, + (), + >(lane_id, xcm.into(), message_nonce, message_destination, relay_header_number); let relay_chain_header_hash = relay_chain_header.hash(); vec![( - pallet_utility::Call::::batch_all { + pallet_utility::Call::::batch_all { calls: vec![ - pallet_bridge_grandpa::Call::::submit_finality_proof { + BridgeGrandpaCall::::submit_finality_proof { finality_target: Box::new(relay_chain_header), justification: grandpa_justification, }.into(), - pallet_bridge_messages::Call::::receive_messages_proof { + BridgeMessagesCall::::receive_messages_proof { relayer_id_at_bridged_chain, proof: message_proof, messages_count: 1, dispatch_weight: Weight::from_parts(1000000000, 0), }.into(), ], - }.into(), + } + .into(), Box::new(( - helpers::VerifySubmitGrandpaFinalityProofOutcome::::expect_best_header_hash(relay_chain_header_hash), - helpers::VerifySubmitMessagesProofOutcome::::expect_last_delivered_nonce(lane_id, 1), - helpers::VerifyRelayerRewarded::::expect_relayer_reward( + helpers::VerifySubmitGrandpaFinalityProofOutcome::< + RuntimeHelper::Runtime, + RuntimeHelper::GPI, + >::expect_best_header_hash(relay_chain_header_hash), + helpers::VerifySubmitMessagesProofOutcome::< + RuntimeHelper::Runtime, + RuntimeHelper::MPI, + >::expect_last_delivered_nonce(lane_id, 1), + helpers::VerifyRelayerRewarded::::expect_relayer_reward( relayer_id_at_this_chain, RewardsAccountParams::new( lane_id, @@ -294,35 +307,25 @@ pub fn complex_relay_extrinsic_works< /// Estimates transaction fee for default message delivery transaction (batched with required /// proofs) from bridged GRANDPA chain. -pub fn can_calculate_fee_for_complex_message_delivery_transaction( - collator_session_key: CollatorSessionKeys, - compute_extrinsic_fee: fn(pallet_utility::Call) -> u128, +pub fn can_calculate_fee_for_complex_message_delivery_transaction( + collator_session_key: CollatorSessionKeys, + compute_extrinsic_fee: fn(pallet_utility::Call) -> u128, ) -> u128 where - Runtime: BasicParachainRuntime - + pallet_bridge_grandpa::Config< - GPI, - BridgedChain = UnderlyingChainOf>, - > + pallet_bridge_messages::Config< - MPI, - InboundPayload = XcmAsPlainPayload, - InboundRelayer = bp_runtime::AccountIdOf>, - > + pallet_utility::Config, - GPI: 'static, - MPI: 'static, - MB: MessageBridge, - ::BridgedChain: Send + Sync + 'static, - ::ThisChain: Send + Sync + 'static, - UnderlyingChainOf>: bp_runtime::Chain + ChainWithGrandpa, - ValidatorIdOf: From>, - >::SourceHeaderChain: SourceHeaderChain< - MessagesProof = FromBridgedChainMessagesProof>>, - >, - bp_runtime::AccountIdOf>: From, - ::RuntimeCall: From> - + From>, + RuntimeHelper: WithRemoteGrandpaChainHelper, + RuntimeHelper::Runtime: + pallet_utility::Config>, + RuntimeCallOf: From> + + From>, + UnderlyingChainOf>: ChainWithGrandpa, + >::SourceHeaderChain: + SourceHeaderChain< + MessagesProof = FromBridgedChainMessagesProof< + HashOf>, + >, + >, { - run_test::(collator_session_key, 1000, vec![], || { + run_test::(collator_session_key, 1000, vec![], || { // generate bridged relay chain finality, parachain heads and message proofs, // to be submitted by relayer to this chain. // @@ -330,7 +333,10 @@ where // do not need to have a large message here, because we're charging for every byte of // the message additionally let (relay_chain_header, grandpa_justification, message_proof) = - test_data::from_grandpa_chain::make_complex_relayer_delivery_proofs::( + test_data::from_grandpa_chain::make_complex_relayer_delivery_proofs::< + RuntimeHelper::MB, + (), + >( LaneId::default(), vec![xcm::v3::Instruction::<()>::ClearOrigin; 1_024].into(), 1, @@ -341,14 +347,14 @@ where // generate batch call that provides finality for bridged relay and parachains + message // proof let batch = test_data::from_grandpa_chain::make_complex_relayer_delivery_batch::< - Runtime, - GPI, - MPI, + RuntimeHelper::Runtime, + RuntimeHelper::GPI, + RuntimeHelper::MPI, >( relay_chain_header, grandpa_justification, message_proof, - Dave.public().into(), + helpers::relayer_id_at_bridged_chain::(), ); let estimated_fee = compute_extrinsic_fee(batch); @@ -356,7 +362,7 @@ where target: "bridges::estimate", "Estimate fee: {:?} for single message delivery for runtime: {:?}", estimated_fee, - Runtime::Version::get(), + ::Version::get(), ); estimated_fee @@ -365,42 +371,30 @@ where /// Estimates transaction fee for default message confirmation transaction (batched with required /// proofs) from bridged GRANDPA chain. -pub fn can_calculate_fee_for_complex_message_confirmation_transaction( - collator_session_key: CollatorSessionKeys, - compute_extrinsic_fee: fn(pallet_utility::Call) -> u128, +pub fn can_calculate_fee_for_complex_message_confirmation_transaction( + collator_session_key: CollatorSessionKeys, + compute_extrinsic_fee: fn(pallet_utility::Call) -> u128, ) -> u128 where - Runtime: BasicParachainRuntime - + pallet_bridge_grandpa::Config< - GPI, - BridgedChain = UnderlyingChainOf>, - > + pallet_bridge_messages::Config - + pallet_utility::Config, - GPI: 'static, - MPI: 'static, - MB: MessageBridge, - ::BridgedChain: Send + Sync + 'static, - ::ThisChain: Send + Sync + 'static, - <::ThisChain as bp_runtime::Chain>::AccountId: From, - UnderlyingChainOf>: ChainWithGrandpa, - ValidatorIdOf: From>, - ::AccountId: - Into<<::RuntimeOrigin as OriginTrait>::AccountId>, - ::AccountId: From, - AccountIdOf: From, - >::InboundRelayer: From, - >::TargetHeaderChain: TargetHeaderChain< - XcmAsPlainPayload, - Runtime::AccountId, - MessagesDeliveryProof = FromBridgedChainMessagesDeliveryProof< - HashOf>>, + RuntimeHelper: WithRemoteGrandpaChainHelper, + AccountIdOf: From, + RuntimeHelper::Runtime: + pallet_utility::Config>, + MessageThisChain: + bp_runtime::Chain>, + RuntimeCallOf: From> + + From>, + UnderlyingChainOf>: ChainWithGrandpa, + >::TargetHeaderChain: + TargetHeaderChain< + XcmAsPlainPayload, + AccountIdOf, + MessagesDeliveryProof = FromBridgedChainMessagesDeliveryProof< + HashOf>>, + >, >, - >, - ::RuntimeCall: From> - + From>, - bp_runtime::AccountIdOf>: From, { - run_test::(collator_session_key, 1000, vec![], || { + run_test::(collator_session_key, 1000, vec![], || { // generate bridged relay chain finality, parachain heads and message proofs, // to be submitted by relayer to this chain. let unrewarded_relayers = UnrewardedRelayersState { @@ -409,19 +403,22 @@ where ..Default::default() }; let (relay_chain_header, grandpa_justification, message_delivery_proof) = - test_data::from_grandpa_chain::make_complex_relayer_confirmation_proofs::( + test_data::from_grandpa_chain::make_complex_relayer_confirmation_proofs::< + RuntimeHelper::MB, + (), + >( LaneId::default(), 1u32.into(), - Alice.public().into(), + AccountId32::from(Alice.public()).into(), unrewarded_relayers.clone(), ); // generate batch call that provides finality for bridged relay and parachains + message // proof let batch = test_data::from_grandpa_chain::make_complex_relayer_confirmation_batch::< - Runtime, - GPI, - MPI, + RuntimeHelper::Runtime, + RuntimeHelper::GPI, + RuntimeHelper::MPI, >( relay_chain_header, grandpa_justification, @@ -434,7 +431,7 @@ where target: "bridges::estimate", "Estimate fee: {:?} for single message confirmation for runtime: {:?}", estimated_fee, - Runtime::Version::get(), + ::Version::get(), ); estimated_fee diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs index 7e4ff8f874d..dff71d23df8 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs @@ -107,12 +107,7 @@ pub fn relayed_incoming_message_works< + From> + From>, { - helpers::relayed_incoming_message_works::< - Runtime, - AllPalletsWithoutSystem, - HrmpChannelOpener, - MPI, - >( + helpers::relayed_incoming_message_works::( collator_session_key, runtime_para_id, sibling_parachain_id, @@ -263,12 +258,7 @@ pub fn complex_relay_extrinsic_works< + From>, ::RuntimeCall: From>, { - helpers::relayed_incoming_message_works::< - Runtime, - AllPalletsWithoutSystem, - HrmpChannelOpener, - MPI, - >( + helpers::relayed_incoming_message_works::( collator_session_key, runtime_para_id, sibling_parachain_id, diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs index 192aa017fff..4f824129bf7 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs @@ -22,6 +22,7 @@ use asset_test_utils::BasicParachainRuntime; use bp_messages::{LaneId, MessageNonce}; use bp_polkadot_core::parachains::{ParaHash, ParaId}; use bp_relayers::RewardsAccountParams; +use codec::Decode; use frame_support::{ assert_ok, traits::{OnFinalize, OnInitialize, PalletInfoAccess}, @@ -29,12 +30,10 @@ use frame_support::{ use frame_system::pallet_prelude::BlockNumberFor; use pallet_bridge_grandpa::{BridgedBlockHash, BridgedHeader}; use parachains_common::AccountId; -use parachains_runtimes_test_utils::{ - mock_open_hrmp_channel, AccountIdOf, CollatorSessionKeys, ValidatorIdOf, -}; +use parachains_runtimes_test_utils::{mock_open_hrmp_channel, AccountIdOf, CollatorSessionKeys}; use sp_core::Get; use sp_keyring::AccountKeyring::*; -use sp_runtime::AccountId32; +use sp_runtime::{traits::TrailingZeroInput, AccountId32}; use sp_std::marker::PhantomData; use xcm::latest::prelude::*; @@ -208,9 +207,15 @@ pub(crate) fn initialize_bridge_grandpa_pallet( pub type CallsAndVerifiers = Vec<(::RuntimeCall, Box)>; +/// Returns relayer id at the bridged chain. +pub fn relayer_id_at_bridged_chain, MPI>( +) -> Runtime::InboundRelayer { + Runtime::InboundRelayer::decode(&mut TrailingZeroInput::zeroes()).unwrap() +} + /// Test-case makes sure that Runtime can dispatch XCM messages submitted by relayer, /// with proofs (finality, message) independently submitted. -pub fn relayed_incoming_message_works( +pub fn relayed_incoming_message_works( collator_session_key: CollatorSessionKeys, runtime_para_id: u32, sibling_parachain_id: u32, @@ -232,18 +237,12 @@ pub fn relayed_incoming_message_works, AllPalletsWithoutSystem: OnInitialize> + OnFinalize>, - HrmpChannelOpener: frame_support::inherent::ProvideInherent< - Call = cumulus_pallet_parachain_system::Call, - >, MPI: 'static, - ValidatorIdOf: From>, - AccountIdOf: From + From, - >::InboundRelayer: From, + AccountIdOf: From, { let relayer_at_target = Bob; let relayer_id_on_target: AccountId32 = relayer_at_target.public().into(); - let relayer_at_source = Dave; - let relayer_id_on_source: AccountId32 = relayer_at_source.public().into(); + let relayer_id_on_source = relayer_id_at_bridged_chain::(); assert_ne!(runtime_para_id, sibling_parachain_id); @@ -262,7 +261,7 @@ pub fn relayed_incoming_message_works( + mock_open_hrmp_channel::>( runtime_para_id.into(), sibling_parachain_id.into(), included_head, diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/mod.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/mod.rs index c12a12548c7..11210841bd3 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/mod.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/mod.rs @@ -72,7 +72,6 @@ pub fn run_test( ) -> T where Runtime: BasicParachainRuntime, - ValidatorIdOf: From>, { ExtBuilder::::default() .with_collators(collator_session_key.collators()) diff --git a/cumulus/parachains/runtimes/test-utils/src/lib.rs b/cumulus/parachains/runtimes/test-utils/src/lib.rs index ca1e1633d4f..6d43875a886 100644 --- a/cumulus/parachains/runtimes/test-utils/src/lib.rs +++ b/cumulus/parachains/runtimes/test-utils/src/lib.rs @@ -47,6 +47,7 @@ pub mod test_cases; pub type BalanceOf = ::Balance; pub type AccountIdOf = ::AccountId; +pub type RuntimeCallOf = ::RuntimeCall; pub type ValidatorIdOf = ::ValidatorId; pub type SessionKeysOf = ::Keys; -- GitLab From 18d53dbf91e90c48d535c3e1f59a3383b569bdb3 Mon Sep 17 00:00:00 2001 From: Clara van Staden Date: Thu, 21 Dec 2023 18:06:36 +0200 Subject: [PATCH 073/191] Adds Snowbridge to Rococo runtime (#2522) # Description Adds Snowbridge to the Rococo bridge hub runtime. Includes config changes required in Rococo asset hub. --------- Co-authored-by: Alistair Singh Co-authored-by: ron Co-authored-by: Vincent Geddes Co-authored-by: claravanstaden --- Cargo.lock | 956 ++++++++++++- Cargo.toml | 14 + bridges/snowbridge/LICENSE | 201 +++ bridges/snowbridge/README.md | 127 ++ bridges/snowbridge/parachain/LICENSE | 201 +++ bridges/snowbridge/parachain/README.md | 155 +++ .../pallets/ethereum-beacon-client/Cargo.toml | 95 ++ .../ethereum-beacon-client/benchmark.md | 88 ++ .../src/benchmarking/fixtures.rs | 1215 +++++++++++++++++ .../src/benchmarking/mod.rs | 156 +++ .../src/benchmarking/util.rs | 44 + .../src/config/mainnet.rs | 10 + .../src/config/minimal.rs | 10 + .../ethereum-beacon-client/src/config/mod.rs | 56 + .../ethereum-beacon-client/src/functions.rs | 31 + .../ethereum-beacon-client/src/impls.rs | 93 ++ .../pallets/ethereum-beacon-client/src/lib.rs | 841 ++++++++++++ .../ethereum-beacon-client/src/mock.rs | 275 ++++ .../ethereum-beacon-client/src/tests.rs | 1032 ++++++++++++++ .../ethereum-beacon-client/src/types.rs | 38 + .../ethereum-beacon-client/src/weights.rs | 68 + .../execution-header-update.minimal.json | 43 + .../finalized-header-update.minimal.json | 38 + .../fixtures/initial-checkpoint.minimal.json | 62 + .../next-finalized-header-update.minimal.json | 38 + .../next-sync-committee-update.minimal.json | 83 ++ .../sync-committee-update.minimal.json | 83 ++ .../pallets/inbound-queue/Cargo.toml | 93 ++ .../src/benchmarking/fixtures.rs | 40 + .../inbound-queue/src/benchmarking/mod.rs | 55 + .../pallets/inbound-queue/src/envelope.rs | 50 + .../pallets/inbound-queue/src/lib.rs | 342 +++++ .../pallets/inbound-queue/src/mock.rs | 311 +++++ .../pallets/inbound-queue/src/test.rs | 211 +++ .../pallets/inbound-queue/src/weights.rs | 31 + .../pallets/outbound-queue/Cargo.toml | 78 ++ .../outbound-queue/merkle-tree/Cargo.toml | 33 + .../outbound-queue/merkle-tree/src/lib.rs | 464 +++++++ .../outbound-queue/runtime-api/Cargo.toml | 34 + .../outbound-queue/runtime-api/src/lib.rs | 20 + .../pallets/outbound-queue/src/api.rs | 30 + .../outbound-queue/src/benchmarking.rs | 85 ++ .../pallets/outbound-queue/src/lib.rs | 413 ++++++ .../pallets/outbound-queue/src/mock.rs | 189 +++ .../src/process_message_impl.rs | 23 + .../outbound-queue/src/send_message_impl.rs | 98 ++ .../pallets/outbound-queue/src/test.rs | 268 ++++ .../pallets/outbound-queue/src/types.rs | 99 ++ .../pallets/outbound-queue/src/weights.rs | 81 ++ .../parachain/pallets/system/Cargo.toml | 83 ++ .../parachain/pallets/system/README.md | 1 + .../pallets/system/runtime-api/Cargo.toml | 32 + .../pallets/system/runtime-api/src/lib.rs | 13 + .../parachain/pallets/system/src/api.rs | 16 + .../pallets/system/src/benchmarking.rs | 167 +++ .../parachain/pallets/system/src/lib.rs | 681 +++++++++ .../parachain/pallets/system/src/migration.rs | 74 + .../parachain/pallets/system/src/mock.rs | 270 ++++ .../parachain/pallets/system/src/tests.rs | 664 +++++++++ .../parachain/pallets/system/src/weights.rs | 249 ++++ .../parachain/primitives/beacon/Cargo.toml | 52 + .../parachain/primitives/beacon/src/bits.rs | 19 + .../parachain/primitives/beacon/src/bls.rs | 87 ++ .../parachain/primitives/beacon/src/config.rs | 10 + .../parachain/primitives/beacon/src/lib.rs | 31 + .../primitives/beacon/src/merkle_proof.rs | 58 + .../primitives/beacon/src/receipt.rs | 96 ++ .../primitives/beacon/src/serde_utils.rs | 130 ++ .../parachain/primitives/beacon/src/ssz.rs | 194 +++ .../parachain/primitives/beacon/src/types.rs | 512 +++++++ .../primitives/beacon/src/updates.rs | 110 ++ .../parachain/primitives/core/Cargo.toml | 60 + .../parachain/primitives/core/src/inbound.rs | 74 + .../parachain/primitives/core/src/lib.rs | 174 +++ .../primitives/core/src/operating_mode.rs | 25 + .../parachain/primitives/core/src/outbound.rs | 413 ++++++ .../parachain/primitives/core/src/pricing.rs | 67 + .../primitives/core/src/ringbuffer.rs | 76 ++ .../parachain/primitives/core/src/tests.rs | 13 + .../core/tests/fixtures/packet.scale | Bin 0 -> 386 bytes .../parachain/primitives/core/tests/mod.rs | 14 + .../primitives/ethereum/.cargo/config.toml | 2 + .../parachain/primitives/ethereum/Cargo.toml | 51 + .../primitives/ethereum/src/header.rs | 414 ++++++ .../parachain/primitives/ethereum/src/lib.rs | 36 + .../parachain/primitives/ethereum/src/log.rs | 75 + .../parachain/primitives/ethereum/src/mpt.rs | 142 ++ .../primitives/ethereum/src/receipt.rs | 139 ++ .../parachain/primitives/router/Cargo.toml | 61 + .../primitives/router/src/inbound/mod.rs | 320 +++++ .../primitives/router/src/inbound/tests.rs | 41 + .../parachain/primitives/router/src/lib.rs | 6 + .../primitives/router/src/outbound/mod.rs | 282 ++++ .../primitives/router/src/outbound/tests.rs | 1063 ++++++++++++++ .../runtime/rococo-common/Cargo.toml | 26 + .../runtime/rococo-common/src/lib.rs | 16 + .../runtime/runtime-common/Cargo.toml | 41 + .../runtime/runtime-common/src/lib.rs | 129 ++ .../parachain/runtime/tests/Cargo.toml | 244 ++++ .../parachain/runtime/tests/src/lib.rs | 94 ++ .../parachain/runtime/tests/src/test_cases.rs | 293 ++++ .../snowbridge/parachain/scripts/benchmark.sh | 15 + .../parachain/scripts/hexliteral.sh | 5 + bridges/snowbridge/parachain/scripts/init.sh | 12 + .../parachain/scripts/make-build-config.sh | 5 + .../parachain/scripts/verify-pallets-build.sh | 113 ++ .../assets/asset-hub-rococo/src/lib.rs | 1 + .../assets/asset-hub-westend/src/lib.rs | 1 + .../bridges/bridge-hub-rococo/Cargo.toml | 8 + .../bridges/bridge-hub-rococo/src/genesis.rs | 6 + .../bridges/bridge-hub-rococo/src/lib.rs | 4 + .../bridges/bridge-hub-westend/Cargo.toml | 1 + .../bridges/bridge-hub-westend/src/lib.rs | 1 + .../collectives-westend/src/lib.rs | 1 + .../parachains/testing/penpal/src/lib.rs | 4 + .../networks/rococo-westend-system/Cargo.toml | 1 + .../networks/rococo-westend-system/src/lib.rs | 6 +- .../bridges/bridge-hub-rococo/Cargo.toml | 15 + .../bridges/bridge-hub-rococo/src/lib.rs | 10 +- .../bridge-hub-rococo/src/tests/mod.rs | 1 + .../bridge-hub-rococo/src/tests/snowbridge.rs | 505 +++++++ .../assets/asset-hub-rococo/Cargo.toml | 6 + .../assets/asset-hub-rococo/src/lib.rs | 9 +- .../assets/asset-hub-rococo/src/xcm_config.rs | 92 +- .../assets/asset-hub-rococo/tests/tests.rs | 52 + .../runtimes/assets/common/src/matching.rs | 120 ++ .../bridge-hubs/bridge-hub-rococo/Cargo.toml | 45 + .../src/bridge_to_ethereum_config.rs | 30 + .../bridge-hubs/bridge-hub-rococo/src/lib.rs | 242 +++- .../bridge-hub-rococo/src/weights/mod.rs | 4 + .../snowbridge_ethereum_beacon_client.rs | 151 ++ .../src/weights/snowbridge_inbound_queue.rs | 69 + .../src/weights/snowbridge_outbound_queue.rs | 87 ++ .../src/weights/snowbridge_system.rs | 256 ++++ .../bridge-hub-rococo/src/xcm_config.rs | 85 +- .../bridge-hub-rococo/tests/tests.rs | 22 +- .../bridge-hubs/bridge-hub-westend/Cargo.toml | 3 + .../bridge-hubs/bridge-hub-westend/src/lib.rs | 12 +- .../runtimes/bridge-hubs/common/Cargo.toml | 42 + .../bridge-hubs/common/src/digest_item.rs | 34 + .../runtimes/bridge-hubs/common/src/lib.rs | 21 + .../bridge-hubs/common/src/message_queue.rs | 146 ++ .../runtimes/testing/penpal/Cargo.toml | 6 + .../runtimes/testing/penpal/src/lib.rs | 37 + .../runtimes/testing/penpal/src/xcm_config.rs | 71 +- cumulus/polkadot-parachain/Cargo.toml | 8 +- .../src/chain_spec/bridge_hubs.rs | 4 + cumulus/polkadot-parachain/src/command.rs | 6 +- cumulus/xcm/xcm-emulator/src/lib.rs | 36 +- prdoc/pr_2522.prdoc | 12 + scripts/snowbridge_update_subtree.sh | 66 + 151 files changed, 19380 insertions(+), 150 deletions(-) create mode 100644 bridges/snowbridge/LICENSE create mode 100644 bridges/snowbridge/README.md create mode 100644 bridges/snowbridge/parachain/LICENSE create mode 100644 bridges/snowbridge/parachain/README.md create mode 100644 bridges/snowbridge/parachain/pallets/ethereum-beacon-client/Cargo.toml create mode 100644 bridges/snowbridge/parachain/pallets/ethereum-beacon-client/benchmark.md create mode 100644 bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/benchmarking/fixtures.rs create mode 100644 bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/benchmarking/mod.rs create mode 100644 bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/benchmarking/util.rs create mode 100644 bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/config/mainnet.rs create mode 100644 bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/config/minimal.rs create mode 100644 bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/config/mod.rs create mode 100644 bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/functions.rs create mode 100644 bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/impls.rs create mode 100644 bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/lib.rs create mode 100644 bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/mock.rs create mode 100644 bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/tests.rs create mode 100644 bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/types.rs create mode 100644 bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/weights.rs create mode 100644 bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/execution-header-update.minimal.json create mode 100644 bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/finalized-header-update.minimal.json create mode 100644 bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/initial-checkpoint.minimal.json create mode 100755 bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/next-finalized-header-update.minimal.json create mode 100755 bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/next-sync-committee-update.minimal.json create mode 100644 bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/sync-committee-update.minimal.json create mode 100644 bridges/snowbridge/parachain/pallets/inbound-queue/Cargo.toml create mode 100644 bridges/snowbridge/parachain/pallets/inbound-queue/src/benchmarking/fixtures.rs create mode 100644 bridges/snowbridge/parachain/pallets/inbound-queue/src/benchmarking/mod.rs create mode 100644 bridges/snowbridge/parachain/pallets/inbound-queue/src/envelope.rs create mode 100644 bridges/snowbridge/parachain/pallets/inbound-queue/src/lib.rs create mode 100644 bridges/snowbridge/parachain/pallets/inbound-queue/src/mock.rs create mode 100644 bridges/snowbridge/parachain/pallets/inbound-queue/src/test.rs create mode 100644 bridges/snowbridge/parachain/pallets/inbound-queue/src/weights.rs create mode 100644 bridges/snowbridge/parachain/pallets/outbound-queue/Cargo.toml create mode 100644 bridges/snowbridge/parachain/pallets/outbound-queue/merkle-tree/Cargo.toml create mode 100644 bridges/snowbridge/parachain/pallets/outbound-queue/merkle-tree/src/lib.rs create mode 100644 bridges/snowbridge/parachain/pallets/outbound-queue/runtime-api/Cargo.toml create mode 100644 bridges/snowbridge/parachain/pallets/outbound-queue/runtime-api/src/lib.rs create mode 100644 bridges/snowbridge/parachain/pallets/outbound-queue/src/api.rs create mode 100644 bridges/snowbridge/parachain/pallets/outbound-queue/src/benchmarking.rs create mode 100644 bridges/snowbridge/parachain/pallets/outbound-queue/src/lib.rs create mode 100644 bridges/snowbridge/parachain/pallets/outbound-queue/src/mock.rs create mode 100644 bridges/snowbridge/parachain/pallets/outbound-queue/src/process_message_impl.rs create mode 100644 bridges/snowbridge/parachain/pallets/outbound-queue/src/send_message_impl.rs create mode 100644 bridges/snowbridge/parachain/pallets/outbound-queue/src/test.rs create mode 100644 bridges/snowbridge/parachain/pallets/outbound-queue/src/types.rs create mode 100644 bridges/snowbridge/parachain/pallets/outbound-queue/src/weights.rs create mode 100644 bridges/snowbridge/parachain/pallets/system/Cargo.toml create mode 100644 bridges/snowbridge/parachain/pallets/system/README.md create mode 100644 bridges/snowbridge/parachain/pallets/system/runtime-api/Cargo.toml create mode 100644 bridges/snowbridge/parachain/pallets/system/runtime-api/src/lib.rs create mode 100644 bridges/snowbridge/parachain/pallets/system/src/api.rs create mode 100644 bridges/snowbridge/parachain/pallets/system/src/benchmarking.rs create mode 100644 bridges/snowbridge/parachain/pallets/system/src/lib.rs create mode 100644 bridges/snowbridge/parachain/pallets/system/src/migration.rs create mode 100644 bridges/snowbridge/parachain/pallets/system/src/mock.rs create mode 100644 bridges/snowbridge/parachain/pallets/system/src/tests.rs create mode 100644 bridges/snowbridge/parachain/pallets/system/src/weights.rs create mode 100644 bridges/snowbridge/parachain/primitives/beacon/Cargo.toml create mode 100644 bridges/snowbridge/parachain/primitives/beacon/src/bits.rs create mode 100644 bridges/snowbridge/parachain/primitives/beacon/src/bls.rs create mode 100644 bridges/snowbridge/parachain/primitives/beacon/src/config.rs create mode 100644 bridges/snowbridge/parachain/primitives/beacon/src/lib.rs create mode 100644 bridges/snowbridge/parachain/primitives/beacon/src/merkle_proof.rs create mode 100644 bridges/snowbridge/parachain/primitives/beacon/src/receipt.rs create mode 100644 bridges/snowbridge/parachain/primitives/beacon/src/serde_utils.rs create mode 100644 bridges/snowbridge/parachain/primitives/beacon/src/ssz.rs create mode 100644 bridges/snowbridge/parachain/primitives/beacon/src/types.rs create mode 100644 bridges/snowbridge/parachain/primitives/beacon/src/updates.rs create mode 100644 bridges/snowbridge/parachain/primitives/core/Cargo.toml create mode 100644 bridges/snowbridge/parachain/primitives/core/src/inbound.rs create mode 100644 bridges/snowbridge/parachain/primitives/core/src/lib.rs create mode 100644 bridges/snowbridge/parachain/primitives/core/src/operating_mode.rs create mode 100644 bridges/snowbridge/parachain/primitives/core/src/outbound.rs create mode 100644 bridges/snowbridge/parachain/primitives/core/src/pricing.rs create mode 100644 bridges/snowbridge/parachain/primitives/core/src/ringbuffer.rs create mode 100644 bridges/snowbridge/parachain/primitives/core/src/tests.rs create mode 100644 bridges/snowbridge/parachain/primitives/core/tests/fixtures/packet.scale create mode 100644 bridges/snowbridge/parachain/primitives/core/tests/mod.rs create mode 100644 bridges/snowbridge/parachain/primitives/ethereum/.cargo/config.toml create mode 100644 bridges/snowbridge/parachain/primitives/ethereum/Cargo.toml create mode 100644 bridges/snowbridge/parachain/primitives/ethereum/src/header.rs create mode 100644 bridges/snowbridge/parachain/primitives/ethereum/src/lib.rs create mode 100644 bridges/snowbridge/parachain/primitives/ethereum/src/log.rs create mode 100644 bridges/snowbridge/parachain/primitives/ethereum/src/mpt.rs create mode 100644 bridges/snowbridge/parachain/primitives/ethereum/src/receipt.rs create mode 100644 bridges/snowbridge/parachain/primitives/router/Cargo.toml create mode 100644 bridges/snowbridge/parachain/primitives/router/src/inbound/mod.rs create mode 100644 bridges/snowbridge/parachain/primitives/router/src/inbound/tests.rs create mode 100644 bridges/snowbridge/parachain/primitives/router/src/lib.rs create mode 100644 bridges/snowbridge/parachain/primitives/router/src/outbound/mod.rs create mode 100644 bridges/snowbridge/parachain/primitives/router/src/outbound/tests.rs create mode 100644 bridges/snowbridge/parachain/runtime/rococo-common/Cargo.toml create mode 100644 bridges/snowbridge/parachain/runtime/rococo-common/src/lib.rs create mode 100644 bridges/snowbridge/parachain/runtime/runtime-common/Cargo.toml create mode 100644 bridges/snowbridge/parachain/runtime/runtime-common/src/lib.rs create mode 100644 bridges/snowbridge/parachain/runtime/tests/Cargo.toml create mode 100644 bridges/snowbridge/parachain/runtime/tests/src/lib.rs create mode 100644 bridges/snowbridge/parachain/runtime/tests/src/test_cases.rs create mode 100755 bridges/snowbridge/parachain/scripts/benchmark.sh create mode 100755 bridges/snowbridge/parachain/scripts/hexliteral.sh create mode 100755 bridges/snowbridge/parachain/scripts/init.sh create mode 100755 bridges/snowbridge/parachain/scripts/make-build-config.sh create mode 100755 bridges/snowbridge/parachain/scripts/verify-pallets-build.sh create mode 100644 cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs create mode 100644 cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_ethereum_config.rs create mode 100644 cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_ethereum_beacon_client.rs create mode 100644 cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_inbound_queue.rs create mode 100644 cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_outbound_queue.rs create mode 100644 cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_system.rs create mode 100644 cumulus/parachains/runtimes/bridge-hubs/common/Cargo.toml create mode 100644 cumulus/parachains/runtimes/bridge-hubs/common/src/digest_item.rs create mode 100644 cumulus/parachains/runtimes/bridge-hubs/common/src/lib.rs create mode 100644 cumulus/parachains/runtimes/bridge-hubs/common/src/message_queue.rs create mode 100644 prdoc/pr_2522.prdoc create mode 100755 scripts/snowbridge_update_subtree.sh diff --git a/Cargo.lock b/Cargo.lock index 76124af3d1f..4fcae91e5ba 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -150,12 +150,93 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +[[package]] +name = "alloy-primitives" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0628ec0ba5b98b3370bb6be17b12f23bfce8ee4ad83823325a20546d9b03b78" +dependencies = [ + "alloy-rlp", + "bytes", + "cfg-if", + "const-hex", + "derive_more", + "hex-literal", + "itoa", + "proptest", + "rand 0.8.5", + "ruint", + "serde", + "tiny-keccak", +] + +[[package]] +name = "alloy-rlp" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc0fac0fc16baf1f63f78b47c3d24718f3619b0714076f6a02957d808d52cbef" +dependencies = [ + "alloy-rlp-derive", + "arrayvec 0.7.4", + "bytes", + "smol_str", +] + +[[package]] +name = "alloy-rlp-derive" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0391754c09fab4eae3404d19d0d297aa1c670c1775ab51d8a5312afeca23157" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + +[[package]] +name = "alloy-sol-macro" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a98ad1696a2e17f010ae8e43e9f2a1e930ed176a8e3ff77acfeff6dfb07b42c" +dependencies = [ + "const-hex", + "dunce", + "heck", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.41", + "syn-solidity", + "tiny-keccak", +] + +[[package]] +name = "alloy-sol-types" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98d7107bed88e8f09f0ddcc3335622d87bfb6821f3e0c7473329fb1cfad5e015" +dependencies = [ + "alloy-primitives", + "alloy-sol-macro", + "const-hex", + "serde", +] + [[package]] name = "always-assert" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4436e0292ab1bb631b42973c61205e704475fe8126af845c8d923c0996328127" +[[package]] +name = "amcl" +version = "0.3.0" +source = "git+https://github.com/snowfork/milagro_bls?rev=a6d66e4eb89015e352fb1c9f7b661ecdbb5b2176#a6d66e4eb89015e352fb1c9f7b661ecdbb5b2176" +dependencies = [ + "parity-scale-codec", + "scale-info", +] + [[package]] name = "android-tzdata" version = "0.1.1" @@ -276,8 +357,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb00293ba84f51ce3bd026bd0de55899c4e68f0a39a5728cebae3a73ffdc0a4f" dependencies = [ "ark-ec", - "ark-ff", - "ark-std", + "ark-ff 0.4.2", + "ark-std 0.4.0", ] [[package]] @@ -289,7 +370,7 @@ dependencies = [ "ark-bls12-377", "ark-ec", "ark-models-ext", - "ark-std", + "ark-std 0.4.0", ] [[package]] @@ -299,9 +380,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c775f0d12169cba7aae4caeb547bb6a50781c7449a8aa53793827c9ec4abf488" dependencies = [ "ark-ec", - "ark-ff", - "ark-serialize", - "ark-std", + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", ] [[package]] @@ -312,10 +393,10 @@ checksum = "b1dc4b3d08f19e8ec06e949712f95b8361e43f1391d94f65e4234df03480631c" dependencies = [ "ark-bls12-381", "ark-ec", - "ark-ff", + "ark-ff 0.4.2", "ark-models-ext", - "ark-serialize", - "ark-std", + "ark-serialize 0.4.2", + "ark-std 0.4.0", ] [[package]] @@ -326,8 +407,8 @@ checksum = "2e0605daf0cc5aa2034b78d008aaf159f56901d92a52ee4f6ecdfdac4f426700" dependencies = [ "ark-bls12-377", "ark-ec", - "ark-ff", - "ark-std", + "ark-ff 0.4.2", + "ark-std 0.4.0", ] [[package]] @@ -338,9 +419,9 @@ checksum = "ccee5fba47266f460067588ee1bf070a9c760bf2050c1c509982c5719aadb4f2" dependencies = [ "ark-bw6-761", "ark-ec", - "ark-ff", + "ark-ff 0.4.2", "ark-models-ext", - "ark-std", + "ark-std 0.4.0", ] [[package]] @@ -349,10 +430,10 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" dependencies = [ - "ark-ff", + "ark-ff 0.4.2", "ark-poly", - "ark-serialize", - "ark-std", + "ark-serialize 0.4.2", + "ark-std 0.4.0", "derivative", "hashbrown 0.13.2", "itertools 0.10.5", @@ -369,8 +450,8 @@ checksum = "b10d901b9ac4b38f9c32beacedfadcdd64e46f8d7f8e88c1ae1060022cf6f6c6" dependencies = [ "ark-bls12-377", "ark-ec", - "ark-ff", - "ark-std", + "ark-ff 0.4.2", + "ark-std 0.4.0", ] [[package]] @@ -381,9 +462,9 @@ checksum = "524a4fb7540df2e1a8c2e67a83ba1d1e6c3947f4f9342cc2359fc2e789ad731d" dependencies = [ "ark-ec", "ark-ed-on-bls12-377", - "ark-ff", + "ark-ff 0.4.2", "ark-models-ext", - "ark-std", + "ark-std 0.4.0", ] [[package]] @@ -394,8 +475,8 @@ checksum = "f9cde0f2aa063a2a5c28d39b47761aa102bda7c13c84fc118a61b87c7b2f785c" dependencies = [ "ark-bls12-381", "ark-ec", - "ark-ff", - "ark-std", + "ark-ff 0.4.2", + "ark-std 0.4.0", ] [[package]] @@ -406,9 +487,27 @@ checksum = "d15185f1acb49a07ff8cbe5f11a1adc5a93b19e211e325d826ae98e98e124346" dependencies = [ "ark-ec", "ark-ed-on-bls12-381-bandersnatch", - "ark-ff", + "ark-ff 0.4.2", "ark-models-ext", - "ark-std", + "ark-std 0.4.0", +] + +[[package]] +name = "ark-ff" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" +dependencies = [ + "ark-ff-asm 0.3.0", + "ark-ff-macros 0.3.0", + "ark-serialize 0.3.0", + "ark-std 0.3.0", + "derivative", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.3.3", + "zeroize", ] [[package]] @@ -417,10 +516,10 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" dependencies = [ - "ark-ff-asm", - "ark-ff-macros", - "ark-serialize", - "ark-std", + "ark-ff-asm 0.4.2", + "ark-ff-macros 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", "derivative", "digest 0.10.7", "itertools 0.10.5", @@ -431,6 +530,16 @@ dependencies = [ "zeroize", ] +[[package]] +name = "ark-ff-asm" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" +dependencies = [ + "quote", + "syn 1.0.109", +] + [[package]] name = "ark-ff-asm" version = "0.4.2" @@ -441,6 +550,18 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "ark-ff-macros" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" +dependencies = [ + "num-bigint", + "num-traits", + "quote", + "syn 1.0.109", +] + [[package]] name = "ark-ff-macros" version = "0.4.2" @@ -461,9 +582,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e9eab5d4b5ff2f228b763d38442adc9b084b0a465409b059fac5c2308835ec2" dependencies = [ "ark-ec", - "ark-ff", - "ark-serialize", - "ark-std", + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", "derivative", ] @@ -473,9 +594,9 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" dependencies = [ - "ark-ff", - "ark-serialize", - "ark-std", + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", "derivative", "hashbrown 0.13.2", ] @@ -487,9 +608,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51bd73bb6ddb72630987d37fa963e99196896c0d0ea81b7c894567e74a2f83af" dependencies = [ "ark-ec", - "ark-ff", - "ark-serialize", - "ark-std", + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", "parity-scale-codec", "scale-info", ] @@ -501,9 +622,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f69c00b3b529be29528a6f2fd5fa7b1790f8bed81b9cdca17e326538545a179" dependencies = [ "ark-ec", - "ark-ff", - "ark-serialize", - "ark-std", + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", "parity-scale-codec", "scale-info", ] @@ -514,15 +635,25 @@ version = "0.0.2" source = "git+https://github.com/w3f/ring-vrf?rev=e9782f9#e9782f938629c90f3adb3fff2358bc8d1386af3e" dependencies = [ "ark-ec", - "ark-ff", - "ark-serialize", - "ark-std", + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", "ark-transcript", "digest 0.10.7", "getrandom_or_panic", "zeroize", ] +[[package]] +name = "ark-serialize" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" +dependencies = [ + "ark-std 0.3.0", + "digest 0.9.0", +] + [[package]] name = "ark-serialize" version = "0.4.2" @@ -530,7 +661,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" dependencies = [ "ark-serialize-derive", - "ark-std", + "ark-std 0.4.0", "digest 0.10.7", "num-bigint", ] @@ -546,6 +677,16 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "ark-std" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + [[package]] name = "ark-std" version = "0.4.0" @@ -562,9 +703,9 @@ name = "ark-transcript" version = "0.0.2" source = "git+https://github.com/w3f/ring-vrf?rev=e9782f9#e9782f938629c90f3adb3fff2358bc8d1386af3e" dependencies = [ - "ark-ff", - "ark-serialize", - "ark-std", + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", "digest 0.10.7", "rand_core 0.6.4", "sha3", @@ -765,6 +906,8 @@ dependencies = [ "rococo-runtime-constants", "scale-info", "smallvec", + "snowbridge-rococo-common", + "snowbridge-router-primitives", "sp-api", "sp-block-builder", "sp-consensus-aura", @@ -1139,6 +1282,18 @@ dependencies = [ "winapi", ] +[[package]] +name = "auto_impl" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fee3da8ef1276b0bee5dd1c7258010d8fffd31801447323115a25560e1327b89" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "autocfg" version = "1.1.0" @@ -1168,9 +1323,9 @@ dependencies = [ "ark-bls12-381", "ark-ec", "ark-ed-on-bls12-381-bandersnatch", - "ark-ff", - "ark-serialize", - "ark-std", + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", "dleq_vrf", "fflonk", "merlin 3.0.0", @@ -1286,6 +1441,21 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + [[package]] name = "bitcoin_hashes" version = "0.11.0" @@ -1753,16 +1923,38 @@ dependencies = [ "sp-runtime", ] +[[package]] +name = "bridge-hub-common" +version = "0.1.0" +dependencies = [ + "cumulus-primitives-core", + "frame-support", + "pallet-message-queue", + "parity-scale-codec", + "scale-info", + "snowbridge-core", + "sp-core", + "sp-runtime", + "sp-std 8.0.0", + "staging-xcm", +] + [[package]] name = "bridge-hub-rococo-emulated-chain" version = "0.0.0" dependencies = [ + "bridge-hub-common", "bridge-hub-rococo-runtime", "cumulus-primitives-core", "emulated-integration-tests-common", "frame-support", "parachains-common", "serde_json", + "snowbridge-core", + "snowbridge-inbound-queue", + "snowbridge-outbound-queue", + "snowbridge-router-primitives", + "snowbridge-system", "sp-core", "sp-runtime", ] @@ -1771,6 +1963,7 @@ dependencies = [ name = "bridge-hub-rococo-integration-tests" version = "1.0.0" dependencies = [ + "asset-hub-rococo-runtime", "asset-test-utils", "bp-messages", "bridge-hub-rococo-runtime", @@ -1778,6 +1971,8 @@ dependencies = [ "cumulus-pallet-xcmp-queue", "emulated-integration-tests-common", "frame-support", + "hex", + "hex-literal", "pallet-assets", "pallet-balances", "pallet-bridge-messages", @@ -1785,7 +1980,17 @@ dependencies = [ "pallet-xcm", "parachains-common", "parity-scale-codec", + "penpal-runtime", + "rococo-system-emulated-network", "rococo-westend-system-emulated-network", + "scale-info", + "snowbridge-core", + "snowbridge-inbound-queue", + "snowbridge-outbound-queue", + "snowbridge-rococo-common", + "snowbridge-router-primitives", + "snowbridge-system", + "sp-core", "sp-runtime", "staging-xcm", "staging-xcm-executor", @@ -1809,6 +2014,7 @@ dependencies = [ "bp-rococo", "bp-runtime", "bp-westend", + "bridge-hub-common", "bridge-hub-test-utils", "bridge-runtime-common", "cumulus-pallet-aura-ext", @@ -1854,6 +2060,17 @@ dependencies = [ "scale-info", "serde", "smallvec", + "snowbridge-beacon-primitives", + "snowbridge-core", + "snowbridge-ethereum-beacon-client", + "snowbridge-inbound-queue", + "snowbridge-outbound-queue", + "snowbridge-outbound-queue-runtime-api", + "snowbridge-rococo-common", + "snowbridge-router-primitives", + "snowbridge-runtime-common", + "snowbridge-system", + "snowbridge-system-runtime-api", "sp-api", "sp-block-builder", "sp-consensus-aura", @@ -1927,6 +2144,7 @@ dependencies = [ name = "bridge-hub-westend-emulated-chain" version = "0.0.0" dependencies = [ + "bridge-hub-common", "bridge-hub-westend-runtime", "cumulus-primitives-core", "emulated-integration-tests-common", @@ -1977,6 +2195,7 @@ dependencies = [ "bp-rococo", "bp-runtime", "bp-westend", + "bridge-hub-common", "bridge-hub-test-utils", "bridge-runtime-common", "cumulus-pallet-aura-ext", @@ -2677,10 +2896,10 @@ version = "0.1.0" source = "git+https://github.com/w3f/ring-proof#b273d33f9981e2bb3375ab45faeb537f7ee35224" dependencies = [ "ark-ec", - "ark-ff", + "ark-ff 0.4.2", "ark-poly", - "ark-serialize", - "ark-std", + "ark-serialize 0.4.2", + "ark-std 0.4.0", "fflonk", "getrandom_or_panic", "merlin 3.0.0", @@ -2715,6 +2934,29 @@ dependencies = [ "windows-sys 0.45.0", ] +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "const-hex" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5104de16b218eddf8e34ffe2f86f74bfa4e61e95a1b89732fccf6325efd0557" +dependencies = [ + "cfg-if", + "cpufeatures", + "hex", + "proptest", + "serde", +] + [[package]] name = "const-oid" version = "0.9.5" @@ -4458,11 +4700,11 @@ version = "0.0.2" source = "git+https://github.com/w3f/ring-vrf?rev=e9782f9#e9782f938629c90f3adb3fff2358bc8d1386af3e" dependencies = [ "ark-ec", - "ark-ff", + "ark-ff 0.4.2", "ark-scale 0.0.12", "ark-secret-scalar", - "ark-serialize", - "ark-std", + "ark-serialize 0.4.2", + "ark-std 0.4.0", "ark-transcript", "arrayvec 0.7.4", "zeroize", @@ -4528,6 +4770,12 @@ version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" +[[package]] +name = "dunce" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" + [[package]] name = "dyn-clonable" version = "0.9.0" @@ -4828,6 +5076,15 @@ dependencies = [ "libc", ] +[[package]] +name = "ethabi-decode" +version = "1.4.0" +source = "git+https://github.com/snowfork/ethabi-decode.git?branch=master#7d215837b626650bd9a076821e57ad488101301f" +dependencies = [ + "ethereum-types", + "tiny-keccak", +] + [[package]] name = "ethbloom" version = "0.13.0" @@ -4836,8 +5093,10 @@ checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" dependencies = [ "crunchy", "fixed-hash", + "impl-codec", "impl-rlp", "impl-serde", + "scale-info", "tiny-keccak", ] @@ -4849,9 +5108,11 @@ checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" dependencies = [ "ethbloom", "fixed-hash", + "impl-codec", "impl-rlp", "impl-serde", "primitive-types", + "scale-info", "uint", ] @@ -4932,6 +5193,17 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" +[[package]] +name = "fastrlp" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" +dependencies = [ + "arrayvec 0.7.4", + "auto_impl", + "bytes", +] + [[package]] name = "fatality" version = "0.0.6" @@ -4999,10 +5271,10 @@ version = "0.1.0" source = "git+https://github.com/w3f/fflonk#1e854f35e9a65d08b11a86291405cdc95baa0a35" dependencies = [ "ark-ec", - "ark-ff", + "ark-ff 0.4.2", "ark-poly", - "ark-serialize", - "ark-std", + "ark-serialize 0.4.2", + "ark-std 0.4.0", "merlin 3.0.0", ] @@ -7783,6 +8055,20 @@ dependencies = [ "thrift", ] +[[package]] +name = "milagro_bls" +version = "1.5.0" +source = "git+https://github.com/snowfork/milagro_bls?rev=a6d66e4eb89015e352fb1c9f7b661ecdbb5b2176#a6d66e4eb89015e352fb1c9f7b661ecdbb5b2176" +dependencies = [ + "amcl", + "hex", + "lazy_static", + "parity-scale-codec", + "rand 0.8.5", + "scale-info", + "zeroize", +] + [[package]] name = "mime" version = "0.3.17" @@ -11118,6 +11404,12 @@ dependencies = [ "substrate-wasm-builder", ] +[[package]] +name = "parity-bytes" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b56e3a2420138bdb970f84dfb9c774aea80fa0e7371549eedec0d80c209c67" + [[package]] name = "parity-db" version = "0.4.12" @@ -11325,6 +11617,7 @@ dependencies = [ name = "penpal-runtime" version = "0.9.27" dependencies = [ + "assets-common", "cumulus-pallet-aura-ext", "cumulus-pallet-dmp-queue", "cumulus-pallet-parachain-system", @@ -11362,6 +11655,7 @@ dependencies = [ "polkadot-runtime-common", "scale-info", "smallvec", + "snowbridge-rococo-common", "sp-api", "sp-block-builder", "sp-consensus-aura", @@ -13599,6 +13893,26 @@ dependencies = [ "regex", ] +[[package]] +name = "proptest" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" +dependencies = [ + "bit-set", + "bit-vec", + "bitflags 2.4.0", + "lazy_static", + "num-traits", + "rand 0.8.5", + "rand_chacha 0.3.1", + "rand_xorshift", + "regex-syntax 0.8.2", + "rusty-fork", + "tempfile", + "unarray", +] + [[package]] name = "prost" version = "0.11.9" @@ -13865,6 +14179,15 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core 0.6.4", +] + [[package]] name = "rawpointer" version = "0.2.1" @@ -14118,10 +14441,10 @@ version = "0.1.0" source = "git+https://github.com/w3f/ring-proof#b273d33f9981e2bb3375ab45faeb537f7ee35224" dependencies = [ "ark-ec", - "ark-ff", + "ark-ff 0.4.2", "ark-poly", - "ark-serialize", - "ark-std", + "ark-serialize 0.4.2", + "ark-std 0.4.0", "blake2 0.10.6", "common", "fflonk", @@ -14386,6 +14709,7 @@ dependencies = [ "bridge-hub-rococo-emulated-chain", "bridge-hub-westend-emulated-chain", "emulated-integration-tests-common", + "penpal-emulated-chain", "rococo-emulated-chain", "westend-emulated-chain", ] @@ -14426,6 +14750,36 @@ dependencies = [ "winapi", ] +[[package]] +name = "ruint" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608a5726529f2f0ef81b8fde9873c4bb829d6b5b5ca6be4d97345ddf0749c825" +dependencies = [ + "alloy-rlp", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "bytes", + "fastrlp", + "num-bigint", + "num-traits", + "parity-scale-codec", + "primitive-types", + "proptest", + "rand 0.8.5", + "rlp", + "ruint-macro", + "serde", + "valuable", + "zeroize", +] + +[[package]] +name = "ruint-macro" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e666a5496a0b2186dbcd0ff6106e29e093c15591bde62c20d3842007c6978a09" + [[package]] name = "rustc-demangle" version = "0.1.23" @@ -14453,6 +14807,15 @@ dependencies = [ "semver 0.9.0", ] +[[package]] +name = "rustc_version" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +dependencies = [ + "semver 0.11.0", +] + [[package]] name = "rustc_version" version = "0.4.0" @@ -16213,6 +16576,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + [[package]] name = "scopeguard" version = "1.2.0" @@ -16349,7 +16718,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a3186ec9e65071a2095434b1f5bb24838d4e8e130f584c790f6033c79943537" dependencies = [ - "semver-parser", + "semver-parser 0.7.0", ] [[package]] @@ -16358,12 +16727,21 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" dependencies = [ - "semver-parser", + "semver-parser 0.7.0", ] [[package]] name = "semver" -version = "1.0.18" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser 0.10.2", +] + +[[package]] +name = "semver" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" dependencies = [ @@ -16376,6 +16754,15 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" +[[package]] +name = "semver-parser" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" +dependencies = [ + "pest", +] + [[package]] name = "separator" version = "0.4.1" @@ -16391,6 +16778,15 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-big-array" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd31f59f6fe2b0c055371bb2f16d7f0aa7d8881676c04a55b1596d1a17cd10a4" +dependencies = [ + "serde", +] + [[package]] name = "serde_bytes" version = "0.11.12" @@ -16745,6 +17141,15 @@ dependencies = [ "futures-lite", ] +[[package]] +name = "smol_str" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74212e6bbe9a4352329b2f68ba3130c15a3f26fe88ff22dbdc6cdd58fa85e99c" +dependencies = [ + "serde", +] + [[package]] name = "smoldot" version = "0.11.0" @@ -16858,6 +17263,358 @@ dependencies = [ "subtle 2.4.1", ] +[[package]] +name = "snowbridge-beacon-primitives" +version = "0.0.1" +dependencies = [ + "byte-slice-cast", + "frame-support", + "frame-system", + "hex", + "hex-literal", + "milagro_bls", + "parity-scale-codec", + "rlp", + "scale-info", + "serde", + "snowbridge-ethereum", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 8.0.0", + "ssz_rs", + "ssz_rs_derive", + "static_assertions", +] + +[[package]] +name = "snowbridge-core" +version = "0.1.1" +dependencies = [ + "ethabi-decode", + "frame-support", + "frame-system", + "hex", + "hex-literal", + "parity-scale-codec", + "polkadot-parachain-primitives", + "scale-info", + "serde", + "snowbridge-beacon-primitives", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 8.0.0", + "staging-xcm", + "staging-xcm-builder", +] + +[[package]] +name = "snowbridge-ethereum" +version = "0.1.0" +dependencies = [ + "ethabi-decode", + "ethbloom", + "ethereum-types", + "hex-literal", + "parity-bytes", + "parity-scale-codec", + "rand 0.8.5", + "rlp", + "rustc-hex", + "scale-info", + "serde", + "serde-big-array", + "serde_json", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 8.0.0", + "wasm-bindgen-test", +] + +[[package]] +name = "snowbridge-ethereum-beacon-client" +version = "0.0.1" +dependencies = [ + "bp-runtime", + "byte-slice-cast", + "frame-benchmarking", + "frame-support", + "frame-system", + "hex-literal", + "log", + "pallet-timestamp", + "parity-scale-codec", + "rand 0.8.5", + "rlp", + "scale-info", + "serde", + "serde_json", + "snowbridge-beacon-primitives", + "snowbridge-core", + "snowbridge-ethereum", + "sp-core", + "sp-io", + "sp-keyring", + "sp-runtime", + "sp-std 8.0.0", + "ssz_rs", + "ssz_rs_derive", + "static_assertions", +] + +[[package]] +name = "snowbridge-inbound-queue" +version = "0.1.1" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "alloy-sol-types", + "frame-benchmarking", + "frame-support", + "frame-system", + "hex-literal", + "log", + "num-traits", + "pallet-balances", + "parity-scale-codec", + "scale-info", + "serde", + "snowbridge-beacon-primitives", + "snowbridge-core", + "snowbridge-ethereum", + "snowbridge-ethereum-beacon-client", + "snowbridge-router-primitives", + "sp-core", + "sp-io", + "sp-keyring", + "sp-runtime", + "sp-std 8.0.0", + "staging-xcm", + "staging-xcm-builder", +] + +[[package]] +name = "snowbridge-outbound-queue" +version = "0.1.1" +dependencies = [ + "bridge-hub-common", + "ethabi-decode", + "frame-benchmarking", + "frame-support", + "frame-system", + "hex-literal", + "pallet-message-queue", + "parity-scale-codec", + "scale-info", + "serde", + "snowbridge-core", + "snowbridge-outbound-queue-merkle-tree", + "sp-arithmetic", + "sp-core", + "sp-io", + "sp-keyring", + "sp-runtime", + "sp-std 8.0.0", + "staging-xcm", +] + +[[package]] +name = "snowbridge-outbound-queue-merkle-tree" +version = "0.1.1" +dependencies = [ + "array-bytes 4.2.0", + "env_logger 0.9.3", + "hex", + "hex-literal", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-runtime", +] + +[[package]] +name = "snowbridge-outbound-queue-runtime-api" +version = "0.1.0" +dependencies = [ + "frame-support", + "parity-scale-codec", + "snowbridge-core", + "snowbridge-outbound-queue-merkle-tree", + "sp-api", + "sp-core", + "sp-std 8.0.0", + "staging-xcm", +] + +[[package]] +name = "snowbridge-rococo-common" +version = "0.0.1" +dependencies = [ + "frame-support", + "log", + "staging-xcm", +] + +[[package]] +name = "snowbridge-router-primitives" +version = "0.1.1" +dependencies = [ + "ethabi-decode", + "frame-support", + "frame-system", + "hex-literal", + "log", + "parity-scale-codec", + "rustc-hex", + "scale-info", + "serde", + "snowbridge-core", + "sp-core", + "sp-io", + "sp-runtime", + "sp-std 8.0.0", + "staging-xcm", + "staging-xcm-builder", + "staging-xcm-executor", +] + +[[package]] +name = "snowbridge-runtime-common" +version = "0.1.1" +dependencies = [ + "frame-support", + "frame-system", + "log", + "snowbridge-core", + "sp-arithmetic", + "staging-xcm", + "staging-xcm-builder", + "staging-xcm-executor", +] + +[[package]] +name = "snowbridge-runtime-tests" +version = "0.1.0" +dependencies = [ + "asset-hub-rococo-runtime", + "assets-common", + "bridge-hub-rococo-runtime", + "bridge-hub-test-utils", + "bridge-runtime-common", + "cumulus-pallet-aura-ext", + "cumulus-pallet-dmp-queue", + "cumulus-pallet-parachain-system", + "cumulus-pallet-session-benchmarking", + "cumulus-pallet-xcm", + "cumulus-pallet-xcmp-queue", + "cumulus-primitives-core", + "cumulus-primitives-utility", + "frame-benchmarking", + "frame-executive", + "frame-support", + "frame-system", + "frame-system-benchmarking", + "frame-system-rpc-runtime-api", + "frame-try-runtime", + "hex-literal", + "log", + "pallet-aura", + "pallet-authorship", + "pallet-balances", + "pallet-collator-selection", + "pallet-message-queue", + "pallet-multisig", + "pallet-session", + "pallet-timestamp", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", + "pallet-utility", + "pallet-xcm", + "pallet-xcm-benchmarks", + "parachains-common", + "parachains-runtimes-test-utils", + "parity-scale-codec", + "polkadot-core-primitives", + "polkadot-parachain-primitives", + "polkadot-runtime-common", + "rococo-runtime-constants", + "scale-info", + "serde", + "smallvec", + "snowbridge-beacon-primitives", + "snowbridge-core", + "snowbridge-ethereum-beacon-client", + "snowbridge-inbound-queue", + "snowbridge-outbound-queue", + "snowbridge-outbound-queue-runtime-api", + "snowbridge-router-primitives", + "snowbridge-system", + "snowbridge-system-runtime-api", + "sp-api", + "sp-block-builder", + "sp-consensus-aura", + "sp-core", + "sp-genesis-builder", + "sp-inherents", + "sp-io", + "sp-keyring", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-std 8.0.0", + "sp-storage 13.0.0", + "sp-transaction-pool", + "sp-version", + "staging-parachain-info", + "staging-xcm", + "staging-xcm-builder", + "staging-xcm-executor", + "static_assertions", +] + +[[package]] +name = "snowbridge-system" +version = "0.1.1" +dependencies = [ + "ethabi-decode", + "frame-benchmarking", + "frame-support", + "frame-system", + "hex", + "hex-literal", + "log", + "pallet-balances", + "pallet-message-queue", + "parity-scale-codec", + "polkadot-primitives", + "scale-info", + "snowbridge-core", + "snowbridge-outbound-queue", + "sp-core", + "sp-io", + "sp-keyring", + "sp-runtime", + "sp-std 8.0.0", + "staging-xcm", + "staging-xcm-builder", + "staging-xcm-executor", +] + +[[package]] +name = "snowbridge-system-runtime-api" +version = "0.1.0" +dependencies = [ + "parity-scale-codec", + "snowbridge-core", + "sp-api", + "sp-core", + "sp-std 8.0.0", + "staging-xcm", +] + [[package]] name = "socket2" version = "0.4.9" @@ -17977,6 +18734,29 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "ssz_rs" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "057291e5631f280978fa9c8009390663ca4613359fc1318e36a8c24c392f6d1f" +dependencies = [ + "bitvec", + "num-bigint", + "sha2 0.9.9", + "ssz_rs_derive", +] + +[[package]] +name = "ssz_rs_derive" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f07d54c4d01a1713eb363b55ba51595da15f6f1211435b71466460da022aa140" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -18706,6 +19486,18 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn-solidity" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b837ef12ab88835251726eb12237655e61ec8dc8a280085d1961cdc3dfd047" +dependencies = [ + "paste", + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "synstructure" version = "0.12.6" @@ -19628,6 +20420,12 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + [[package]] name = "unicode-bidi" version = "0.3.13" @@ -19803,8 +20601,8 @@ dependencies = [ "ark-bls12-377", "ark-bls12-381", "ark-ec", - "ark-ff", - "ark-serialize", + "ark-ff 0.4.2", + "ark-serialize 0.4.2", "ark-serialize-derive", "arrayref", "constcat", @@ -19932,6 +20730,30 @@ version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +[[package]] +name = "wasm-bindgen-test" +version = "0.3.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e6e302a7ea94f83a6d09e78e7dc7d9ca7b186bc2829c24a22d0753efd680671" +dependencies = [ + "console_error_panic_hook", + "js-sys", + "scoped-tls", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-bindgen-test-macro", +] + +[[package]] +name = "wasm-bindgen-test-macro" +version = "0.3.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecb993dd8c836930ed130e020e77d9b2e65dd0fbab1b67c790b0f5d80b11a575" +dependencies = [ + "proc-macro2", + "quote", +] + [[package]] name = "wasm-encoder" version = "0.31.1" diff --git a/Cargo.toml b/Cargo.toml index 33159f8f74e..983b3bdf205 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,6 +36,20 @@ members = [ "bridges/primitives/test-utils", "bridges/primitives/xcm-bridge-hub", "bridges/primitives/xcm-bridge-hub-router", + "bridges/snowbridge/parachain/pallets/ethereum-beacon-client", + "bridges/snowbridge/parachain/pallets/inbound-queue", + "bridges/snowbridge/parachain/pallets/outbound-queue", + "bridges/snowbridge/parachain/pallets/outbound-queue/merkle-tree", + "bridges/snowbridge/parachain/pallets/outbound-queue/runtime-api", + "bridges/snowbridge/parachain/pallets/system", + "bridges/snowbridge/parachain/pallets/system/runtime-api", + "bridges/snowbridge/parachain/primitives/beacon", + "bridges/snowbridge/parachain/primitives/core", + "bridges/snowbridge/parachain/primitives/ethereum", + "bridges/snowbridge/parachain/primitives/router", + "bridges/snowbridge/parachain/runtime/rococo-common", + "bridges/snowbridge/parachain/runtime/runtime-common", + "bridges/snowbridge/parachain/runtime/tests", "cumulus/client/cli", "cumulus/client/collator", "cumulus/client/consensus/aura", diff --git a/bridges/snowbridge/LICENSE b/bridges/snowbridge/LICENSE new file mode 100644 index 00000000000..261eeb9e9f8 --- /dev/null +++ b/bridges/snowbridge/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/bridges/snowbridge/README.md b/bridges/snowbridge/README.md new file mode 100644 index 00000000000..a38910da316 --- /dev/null +++ b/bridges/snowbridge/README.md @@ -0,0 +1,127 @@ +# Snowbridge · +[![codecov](https://codecov.io/gh/Snowfork/snowbridge/branch/main/graph/badge.svg?token=9hvgSws4rN)] +(https://codecov.io/gh/Snowfork/snowbridge) +![GitHub](https://img.shields.io/github/license/Snowfork/snowbridge) + +Snowbridge is a trustless bridge between Polkadot and Ethereum. For documentation, visit https://docs.snowbridge.network. + +## Components + +### Parachain + +Polkadot parachain and our pallets. See [parachain/README.md](https://github.com/Snowfork/snowbridge/blob/main/parachain/README.md). + +### Contracts + +Ethereum contracts and unit tests. See [contracts/README.md](https://github.com/Snowfork/snowbridge/blob/main/contracts/README.md) + +### Relayer + +Off-chain relayer services for relaying messages between Polkadot and Ethereum. See +[relayer/README.md](https://github.com/Snowfork/snowbridge/blob/main/relayer/README.md) + +### Local Testnet + +Scripts to provision a local testnet, running the above services to bridge between local deployments of Polkadot and +Ethereum. See [web/packages/test/README.md](https://github.com/Snowfork/snowbridge/blob/main/web/packages/test/README.md). + +### Smoke Tests + +Integration tests for our local testnet. See [smoketest/README.md](https://github.com/Snowfork/snowbridge/blob/main/smoketest/README.md). + +## Development + +We use the Nix package manager to provide a reproducible and maintainable developer environment. + +After [installing nix](https://nixos.org/download.html) Nix, enable [flakes](https://nixos.wiki/wiki/Flakes): + +```sh +mkdir -p ~/.config/nix +echo 'experimental-features = nix-command flakes' >> ~/.config/nix/nix.conf +``` + +Then activate a developer shell in the root of our repo, where +[`flake.nix`](https://github.com/Snowfork/snowbridge/blob/main/flake.nix) is located: + +```sh +nix develop +``` + +Also make sure to run this initialization script once: +```sh +scripts/init.sh +``` + +### Support for code editors + +To ensure your code editor (such as VS Code) can execute tools in the nix shell, startup your editor within the +interactive shell. + +Example for VS Code: + +```sh +nix develop +code . +``` + +### Custom shells + +The developer shell is bash by default. To preserve your existing shell: + +```sh +nix develop --command $SHELL +``` + +### Automatic developer shells + +To automatically enter the developer shell whenever you open the project, install +[`direnv`](https://direnv.net/docs/installation.html) and use the template `.envrc`: + +```sh +cp .envrc.example .envrc +direnv allow +``` + +### Upgrading the Rust toolchain + +Sometimes we would like to upgrade rust toolchain. First update `parachain/rust-toolchain.toml` as required and then +update `flake.lock` running +```sh +nix flake lock --update-input rust-overlay +``` + +## Troubleshooting + +Check the contents of all `.envrc` files. + +Remove untracked files: +```sh +git clean -idx +``` + +Ensure that the current Rust toolchain is the one selected in `scripts/init.sh`. + +Ensure submodules are up-to-date: +```sh +git submodule update +``` + +Check untracked files & directories: +```sh +git clean -ndx | awk '{print $3}' +``` +After removing `node_modules` directories (eg. with `git clean above`), clear the pnpm cache: +```sh +pnpm store prune +``` + +Check Nix config in `~/.config/nix/nix.conf`. + +Run a pure developer shell (note that this removes access to your local tools): +```sh +nix develop -i --pure-eval +``` + +## Security + +The security policy and procedures can be found in SECURITY.md. diff --git a/bridges/snowbridge/parachain/LICENSE b/bridges/snowbridge/parachain/LICENSE new file mode 100644 index 00000000000..261eeb9e9f8 --- /dev/null +++ b/bridges/snowbridge/parachain/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/bridges/snowbridge/parachain/README.md b/bridges/snowbridge/parachain/README.md new file mode 100644 index 00000000000..ddcbedab0c6 --- /dev/null +++ b/bridges/snowbridge/parachain/README.md @@ -0,0 +1,155 @@ +# Parachain modules + +## Configuration + +Note: This section is not necessary for local development, as there are scripts to auto-configure the parachain in the +[test directory](https://github.com/Snowfork/snowbridge/blob/main/web/packages/test). + +For a fully operational chain, further configuration of the initial chain spec is required. The specific configuration will +depend heavily on your environment, so this guide will remain high-level. + +After completing a release build of the parachain, build an initial spec for the snowbase runtime: + +```bash +target/release/snowbridge build-spec --chain snowbase --disable-default-bootnode > spec.json +``` + +Now edit the spec and configure the following: +1. Recently finalized ethereum header and difficulty for the ethereum light client +2. Contract addresses for the Ether, Erc20, and Dot apps. +3. Authorized principal for the basic channel + +For an example configuration, consult the [setup script](https://github.com/Snowfork/snowbridge/blob/main/web/packages/test/scripts/start-services.sh) +for our local development stack. Specifically the `start_polkadot_launch` bash function. + +## Tests + +To run the parachain tests locally, use `cargo test --workspace`. For the full suite of tests, use +`cargo test --workspace --features runtime-benchmarks`. + +Optionally exclude the top-level and runtime crates: + +```bash +cargo test --workspace \ + --features runtime-benchmarks \ + --exclude snowbridge \ + --exclude snowbridge-runtime \ + --exclude snowblink-runtime \ + --exclude snowbase-runtime +``` + +### Updating test data for inbound channel unit tests + +To regenerate the test data, use a test with multiple `submit` calls in `ethereum/test/test_basic_outbound_channel.js`, eg. +"should increment nonces correctly". + +Add the following preamble: + +```javascript +const rlp = require("rlp"); +const contract = BasicOutboundChannel; +const signature = 'Message(address,address,uint64,uint64,bytes)'; +``` + +For each encoded log you want to create, find a transaction object `tx` returned from a `submit` call and run this: + +```javascript +const rawLog = tx.receipt.rawLogs[0]; +const encodedLog = rlp.encode([rawLog.address, rawLog.topics, rawLog.data]).toString("hex"); +console.log(`encodedLog: ${encodedLog}`); +const iface = new ethers.utils.Interface(contract.abi); +const decodedEventLog = iface.decodeEventLog( + signature, + rawLog.data, + rawLog.topics, +); +console.log(`decoded rawLog.data: ${JSON.stringify(decodedEventLog)}`); +``` + +Place the `encodedLog` string in the `message.data` field in the test data. Use the `decoded rawLog.data` field to +update the comments with the decoded log data. + +## Generating pallet weights from benchmarks + +Build the parachain with the runtime benchmark flags for the chosen runtime: + +```bash +runtime=snowbase +cargo build \ + --release \ + --no-default-features \ + --features "$runtime-native,rococo-native,runtime-benchmarks,$runtime-runtime-benchmarks" \ + --bin snowbridge +``` + +List available pallets and their benchmarks: + +```bash +./target/release/snowbridge benchmark pallet --chain $runtime --list +``` + +Run a benchmark for a pallet, generating weights: + +```bash +target/release/snowbridge benchmark pallet \ + --chain=$runtime \ + --execution=wasm \ + --wasm-execution=compiled \ + --pallet=basic_channel_inbound \ + --extra \ + --extrinsic=* \ + --repeat=20 \ + --steps=50 \ + --output=pallets/basic-channel/src/inbound/weights.rs \ + --template=templates/module-weight-template.hbs +``` + +## Generating beacon test fixtures and benchmarking data + +### Minimal Spec + +To generate `minimal` test data and benchmarking data, make sure to start the local E2E setup to spin up a local beacon +node instance to connect to: + +```bash +cd web/packages/test +./scripts/start-services.sh +``` + +Wait for output `Testnet has been initialized`. + +In a separate terminal, from the `snowbridge` directory, run: + +```bash +mage -d relayer build && relayer/build/snowbridge-relay generate-beacon-data --spec "minimal" && cd parachain && +cargo +nightly fmt -- --config-path rustfmt.toml && cd - +``` + +### Mainnet Spec + +We only use the mainnet spec for generating fixtures for pallet weight benchmarks. + +To generate the data we can connect to the Lodestar Goerli public node. The script already connects to the Lodestar node, +so no need to start up additional services. In the event of the Lodestar node not being available, you can start up your +own stack with these commands: + +```bash +cd web/packages/test +./scripts/start-goerli.sh +``` + +From the `snowbridge` directory, run: + +```bash +mage -d relayer build && relayer/build/snowbridge-relay generate-beacon-data --spec "mainnet" && cd parachain && +cargo +nightly fmt -- --config-path rustfmt.toml && cd - +``` + +### Benchmarking tests + +To run the benchmark tests + +```bash +cd parachain/pallets/ethereum-beacon-client +cargo test --release --features runtime-benchmarks +``` diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/Cargo.toml b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/Cargo.toml new file mode 100644 index 00000000000..5c4acda13d8 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/Cargo.toml @@ -0,0 +1,95 @@ +[package] +name = "snowbridge-ethereum-beacon-client" +description = "Snowbridge Beacon Client Pallet" +version = "0.0.1" +edition = "2021" +authors = ["Snowfork "] +repository = "https://github.com/Snowfork/snowbridge" +license = "Apache-2.0" + +[package.metadata.docs.rs] +targets = ["x86_64-unknown-linux-gnu"] + +[dependencies] +serde = { version = "1.0.188", optional = true } +serde_json = { version = "1.0.96", optional = true } +codec = { version = "3.6.1", package = "parity-scale-codec", default-features = false, features = ["derive"] } +scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } +ssz_rs = { version = "0.9.0", default-features = false } +ssz_rs_derive = { version = "0.9.0", default-features = false } +byte-slice-cast = { version = "1.2.1", default-features = false } +rlp = { version = "0.5.2", default-features = false } +hex-literal = { version = "0.4.1", optional = true } +log = { version = "0.4.20", default-features = false } + +frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking", default-features = false, optional = true } +frame-support = { path = "../../../../../substrate/frame/support", default-features = false } +frame-system = { path = "../../../../../substrate/frame/system", default-features = false } +sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } +sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } +sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-features = false } +sp-io = { path = "../../../../../substrate/primitives/io", default-features = false, optional = true } + +snowbridge-core = { path = "../../primitives/core", default-features = false } +snowbridge-ethereum = { path = "../../primitives/ethereum", default-features = false } +primitives = { package = "snowbridge-beacon-primitives", path = "../../primitives/beacon", default-features = false } +static_assertions = { version = "1.1.0", default-features = false } +bp-runtime = { path = "../../../../../bridges/primitives/runtime", default-features = false } +pallet-timestamp = { path = "../../../../../substrate/frame/timestamp", default-features = false, optional = true } + +[dev-dependencies] +rand = "0.8.5" +sp-keyring = { path = "../../../../../substrate/primitives/keyring" } +serde_json = "1.0.96" +hex-literal = "0.4.1" +pallet-timestamp = { path = "../../../../../substrate/frame/timestamp" } +sp-io = { path = "../../../../../substrate/primitives/io" } +serde = "1.0.188" + +[features] +default = ["std"] +fuzzing = [ + "hex-literal", + "pallet-timestamp", + "serde", + "serde_json", + "sp-io", +] +std = [ + "bp-runtime/std", + "byte-slice-cast/std", + "codec/std", + "frame-support/std", + "frame-system/std", + "log/std", + "pallet-timestamp/std", + "primitives/std", + "rlp/std", + "scale-info/std", + "serde", + "snowbridge-core/std", + "snowbridge-ethereum/std", + "sp-core/std", + "sp-io/std", + "sp-runtime/std", + "sp-std/std", + "ssz_rs/std", + 'frame-benchmarking/std', +] +runtime-benchmarks = [ + "beacon-spec-mainnet", + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "hex-literal", + "pallet-timestamp?/runtime-benchmarks", + "snowbridge-core/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", +] +try-runtime = [ + "frame-support/try-runtime", + "frame-system/try-runtime", + "pallet-timestamp?/try-runtime", + "sp-runtime/try-runtime", +] +beacon-spec-mainnet = [] diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/benchmark.md b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/benchmark.md new file mode 100644 index 00000000000..de976e12149 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/benchmark.md @@ -0,0 +1,88 @@ +# Motivation +Demonstrate that +[FastAggregateVerify](https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-bls-signature-04#section-3.3.4) is the most +expensive call in ethereum beacon light client, though in [#13031](https://github.com/paritytech/substrate/pull/13031) +Parity team has wrapped some low level host functions for `bls-12381` but adding a high level host function specific +for it is super helpful. + +# Benchmark +We add several benchmarks +[here](https://github.com/Snowfork/snowbridge/blob/8891ca3cdcf2e04d8118c206588c956541ae4710/parachain/pallets/ethereum-beacon-client/src/benchmarking/mod.rs#L98-L124) +as following to demonstrate +[bls_fast_aggregate_verify](https://github.com/Snowfork/snowbridge/blob/8891ca3cdcf2e04d8118c206588c956541ae4710/parachain/pallets/ethereum-beacon-client/src/lib.rs#L764) +is the main bottleneck. Test data +[here](https://github.com/Snowfork/snowbridge/blob/8891ca3cdcf2e04d8118c206588c956541ae4710/parachain/pallets/ethereum-beacon-client/src/benchmarking/data_mainnet.rs#L553-L1120) +is real from goerli network which contains 512 public keys from sync committee. + +## sync_committee_period_update +Base line benchmark for extrinsic [sync_committee_period_update](https://github.com/Snowfork/snowbridge/blob/8891ca3cdcf2e04d8118c206588c956541ae4710/parachain/pallets/ethereum-beacon-client/src/lib.rs#L233) + +## bls_fast_aggregate_verify +Subfunction of extrinsic `sync_committee_period_update` which does what +[FastAggregateVerify](https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-bls-signature-04#section-3.3.4) requires. + +## bls_aggregate_pubkey +Subfunction of `bls_fast_aggregate_verify` which decompress and instantiate G1 pubkeys only. + +## bls_verify_message +Subfunction of `bls_fast_aggregate_verify` which verify the prepared signature only. + + +# Result + +## hardware spec +Run benchmark in a EC2 instance +``` +cargo run --release --bin polkadot-parachain --features runtime-benchmarks -- benchmark machine --base-path /mnt/scratch/benchmark + ++----------+----------------+-------------+-------------+-------------------+ +| Category | Function | Score | Minimum | Result | ++===========================================================================+ +| CPU | BLAKE2-256 | 1.08 GiBs | 1.00 GiBs | ✅ Pass (107.5 %) | +|----------+----------------+-------------+-------------+-------------------| +| CPU | SR25519-Verify | 568.87 KiBs | 666.00 KiBs | ❌ Fail ( 85.4 %) | +|----------+----------------+-------------+-------------+-------------------| +| Memory | Copy | 13.67 GiBs | 14.32 GiBs | ✅ Pass ( 95.4 %) | +|----------+----------------+-------------+-------------+-------------------| +| Disk | Seq Write | 334.35 MiBs | 450.00 MiBs | ❌ Fail ( 74.3 %) | +|----------+----------------+-------------+-------------+-------------------| +| Disk | Rnd Write | 143.59 MiBs | 200.00 MiBs | ❌ Fail ( 71.8 %) | ++----------+----------------+-------------+-------------+-------------------+ +``` + +## benchmark + +``` +cargo run --release --bin polkadot-parachain \ +--features runtime-benchmarks \ +-- \ +benchmark pallet \ +--base-path /mnt/scratch/benchmark \ +--chain=bridge-hub-rococo-dev \ +--pallet=snowbridge_ethereum_beacon_client \ +--extrinsic="*" \ +--execution=wasm --wasm-execution=compiled \ +--steps 50 --repeat 20 \ +--output ./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_ethereum_beacon_client.rs +``` + +### [Weights](https://github.com/Snowfork/cumulus/blob/ron/benchmark-beacon-bridge/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_ethereum_beacon_client.rs) + +|extrinsic | minimum execution time benchmarked(us) | +| --------------------------------------- |----------------------------------------| +|sync_committee_period_update | 123_126 | +|bls_fast_aggregate_verify| 121_083 | +|bls_aggregate_pubkey | 90_306 | +|bls_verify_message | 28_000 | + +- [bls_fast_aggregate_verify](#bls_fast_aggregate_verify) consumes 98% execution time of [sync_committee_period_update](#sync_committee_period_update) + +- [bls_aggregate_pubkey](#bls_aggregate_pubkey) consumes 75% execution time of [bls_fast_aggregate_verify](#bls_fast_aggregate_verify) + +- [bls_verify_message](#bls_verify_message) consumes 23% execution time of [bls_fast_aggregate_verify](#bls_fast_aggregate_verify) + +# Conclusion + +A high level host function specific for +[bls_fast_aggregate_verify](https://github.com/Snowfork/snowbridge/blob/8891ca3cdcf2e04d8118c206588c956541ae4710/parachain/pallets/ethereum-beacon-client/src/lib.rs#L764) +is super helpful. diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/benchmarking/fixtures.rs b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/benchmarking/fixtures.rs new file mode 100644 index 00000000000..b50be81360a --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/benchmarking/fixtures.rs @@ -0,0 +1,1215 @@ +// Generated, do not edit! +// See README.md for instructions to generate +use crate::{CheckpointUpdate, ExecutionHeaderUpdate, Update}; +use hex_literal::hex; +use primitives::{ + updates::AncestryProof, BeaconHeader, ExecutionPayloadHeader, NextSyncCommitteeUpdate, + SyncAggregate, SyncCommittee, +}; +use sp_core::U256; +use sp_std::{boxed::Box, vec}; + +pub fn make_checkpoint() -> Box { + Box::new(CheckpointUpdate { + header: BeaconHeader { + slot: 5809344, + proposer_index: 101696, + parent_root: hex!("ea7ce4ad810829cf37a2235b1126c82aecfc5955a1647ec83640cf3f7db91bd2").into(), + state_root: hex!("56f6363d3604e61a907c774edf0bddf6477a8d410f026414bc420f751de1f092").into(), + body_root: hex!("8c799aeef815cbc4499e0b46723623105afb177a5c522ecda3415ad9fb259e6c").into(), + }, + current_sync_committee: SyncCommittee { + pubkeys: [ + hex!("adf5a4907639db7bdcbecbc295b57d8950b0abe34ab17798686643427023c4f3983550d1496f81a27e52b070e4f4e6ee").into(), + hex!("91b036b30405531cacebf5d4f7e939b44438bb9942123ee55b44453e32febfbf2c846e0e4fb08190b01a000d072dcaa7").into(), + hex!("a86e70f00161ec6c4b780b4fc631c8dbae979f1e6c9ed037dd0745833ed6e3e18831478eb4753861f339293c0508f4d4").into(), + hex!("84196b1f39fba1fb7570074e7dd2768ed5c28db7f91a6374e413c8fc82f97738af771f90496526088bfa1ee2c01ee299").into(), + hex!("b9a230fc12d85281cbfcc7f5e6b13ab17b3dcbf0adf256d031c01acb30734d061683d40fd62175da73a621440bb04367").into(), + hex!("80b8be5a3d6f39aa7362c5feee9f89b75d1e5c2b485ea9a776c60fd60dba611e9bf5ca8b2528f42651b3dad212acfe77").into(), + hex!("ac8fcfc40028d04bdbea87b4b335781e35e10f881bfeb07b94c538eb37a43b18b1a04aad3dbe80bbff6e128017251f2e").into(), + hex!("b0b2136cc729b7de8868c02de6247ff2a68694296c78f088ce967219f08cfb7be9e1830e2630b10ca650c715d85d89f3").into(), + hex!("a70627c99777970eb9bf3268bac06bdc41c2ead41b1b76d30e7fd2aefe83319461d03aaf7ab93150343be9fbd2e48e7d").into(), + hex!("9599aae109d31ddc9028c428a148ea9ebffdb5ab6a684895dbd3772c1baf947c8a255e4c7ebaedae2a9e046219d80d76").into(), + hex!("8652e099adb88b2a25ab64fb01314e24cf26dbc4ae110d7fd73d74a0e0a4fea2ce2ce87cb1ddb7c0b9fb50cc6afa2153").into(), + hex!("83ba74c6e31073865eaed3c38a8e885ee715f03cfd6e36929655b6aa790d8f676c4ac4ae27f963e311d00923357eb087").into(), + hex!("86b05425d880027fbde9be3ea526283c5b958ccb31eff997d9d7b5e3b70e2d011ed95f891248082e870d55704a471deb").into(), + hex!("a4eeb958121bc5be5b1a68b73faa83b19272ef2f2cb627431be08e9844ef9d4548b4208670754d0954e5b012e3933859").into(), + hex!("87b0119e4c54aa2b4f8260f9ace7722788578bc6d822361d011e751caf13be5ca94b7d5842df5c16e52bfb4d658a405a").into(), + hex!("b696ec7f5dc82655cf027f5827fff3ce39195c1ee4ea9fba1808880cdea16d6086fb583edfbf66608e4f33211ddf9f27").into(), + hex!("a69bafcb3af59786acf009cc31e245009156a7e4fd2af98cdf2b7e63c39aff2baba08a338cdac93e94f6132b2cfe7a7c").into(), + hex!("8aa0aebb24b8c62168b255b6041474e8abf0d589a7467bc4712d910a9c2d470432d251e336a80dded27c0e9eea43aebd").into(), + hex!("a08d6976d3579411080957dfa2ca9487b1c4d8dbcdf640c1fea0a46f2c0228c2ddadf0553781c3e0dc5c7503b1bf29a0").into(), + hex!("a4abccfcfce6754e4d6c5c8bbad6668a55dc555ba99189936385e4dafa0435b323b813ce69f76e24299b5842c244139a").into(), + hex!("b89e4fd2dfb46c2af6df73f7185693ac535b67ab31f2805b1c24f400e0068cb32aff164b53668512f5895883189f7c02").into(), + hex!("b7c221a5884d10048bf9dd8611fb5231ce444fb756e59dd60d18a2332e889c014b27d739ed6012ff86056c04f36a87f1").into(), + hex!("a82875d66a4da52d6eac9dcd9ba9c728332253ad4b83acf1601a34efdd0c398eaad4acd1a948203d1bbd4a17d01a7b56").into(), + hex!("8c0a8ec162b3d48ee6a0f39620432cd67a1eb33a6d6f7bf1aada4f24c7498cf2e2b2476898f14c875f5efcf439aa0bce").into(), + hex!("a4b5d6451ae5baba3984bfbd5eef59543bf7c923662ea182cec6bb29aded9afd4c89e618ff756b5290506e0bf5a7e690").into(), + hex!("80664b43e3bd2f6e8eeb81a46cdca4f571499f3f0c77eb007ceb33c5b3dc18348a68cedc19d9967117f21a6c1ea29060").into(), + hex!("9174e46939c6915c757e793c9a02e46ed49d869216b720d0924b9697d94098182cad2cc6d4caf4cf140445377f1b4c80").into(), + hex!("b6e25cc134e089d306c648228d84aeee9516c8a276a2d37b54b458314b8f8980d49614550e821aac31000a5e7d518fca").into(), + hex!("ab1ab623a70f1e33cdbee356530a6f8fd9d00b2f9d8f94c0854816e5dd2bb8b258b5fb7a89ebc0725d8ebb74395847b6").into(), + hex!("8e75ea6f0678abfe1a7a9201c9fde992451327d61290fd803b3a1cdf2f7537fd7c23e0e06af5bb886a28928d0baba1c5").into(), + hex!("b41f4d4421de7b94eb9bc61602d08d77dc3f5f5d025e04f44c1426f14e8f707031b9e1d3a6e92c200f54166b2040f0a0").into(), + hex!("a8fa0c61435b851f9bda4da8dae0d544984ba5c0fef338eb6896b9c08306c3e2aec0a6c2028da319f210387320df4f73").into(), + hex!("a884af449df4cbd39e161de10f9d1f645eedfae0d259ddd84347733836fded047ca079916d365ef3d93fb354c8c795a6").into(), + hex!("936970bdeffc92f32915d141ccd8334df7966a3cafecb6d33fab9f477c389179f612cd6e368b615a98112d71756756aa").into(), + hex!("88dfe631c1e16ec3634e06a83a857ce9c909cb5b05d40490e6d02e553dd3bf213f0e178d31b4d913a4796b7226ab3ba2").into(), + hex!("a0c8357b4fb9c4431bc88e6336c2218590a7cb351ef4405a80aa6d352912f0b3110f3a09eef337bfe98da6b0841c6214").into(), + hex!("a7def54e08e2cea7def767d1108bc5c24d64e2dbdea9d07f0c8c63e60eec2db4e095b4a84bf6a4822103560b0497d1e7").into(), + hex!("80991c4f933985d9662d2e047187f244dcbb79606410aeb66ab250b2fdb9bd9daa392339e9b16d0d07648e847b02f942").into(), + hex!("b63fe559e2b4580238a0b0ce52ab8258838c2b64c1922c56b64cd65be2f88c140cb4e6ce96932e92f1ae06b20ee9e613").into(), + hex!("926ece3480c5c1f24f03d8289dcac7d3b202fcda277dd4453294dffc2953d91c842653a9e272b76fe2cebe1de3aba63d").into(), + hex!("930d29990821d26a748018bb6998488d5de811c8ed506c213c0ba346c8011e2d7c2235aa427a320129c1d016948eabf1").into(), + hex!("ae4e3fcd6c99a8f320dd4d160704db6baaae9aaa885f5d792212ea03cf06a459eb4a2730da9161ddd72a5e6544744e81").into(), + hex!("a01ae9d4f0008efdc5203abfdd0807ee7cc58c49cc5946d0b991ea2e069a224f0d99ea714b4d5cc464deb57372790660").into(), + hex!("ab17902ab255c575a133ed47fbafd62f898748ef6fc33455a2adcb2d4ea72c31255a9cd0c545d2ad8007a5a694f13371").into(), + hex!("86e2384e0469ab8ea9c5628d619d10336b3c0f334969dbc3335dfd72ed9899639fccfb5d1d9d6667a0dba20651584100").into(), + hex!("88ededd6ef3502be7c3c1b018cd814d4a8f98a7cf9521fe9cce6faaa6056315e22828397435b57d15e996fd15d7d700a").into(), + hex!("affa898a30a0dd2ccbe8d46c5a69dc1a8696b311094ac00e8ef6d398f6f132edb2d823004bc7895ac53bc09b6fb1059c").into(), + hex!("ac9f5bc3e2045a1eb356d88f2a62781fdb5775349c9bbdd9417b7bb7a9132a1cd42bf4986fcdc706eabbce45ab9f1cc9").into(), + hex!("986e3813ade7b9533ccfdcd76ea17490bc3dc62c8a596c8d07b246c28d7dea465c4dadda05111d2793d72d317c7c2833").into(), + hex!("ad4fbc51581cd520bcd0b88379ec0482c94b2ac344ce48a5facc1cf3e026edb088ce5cba5113f2c31f630a1fb37c5214").into(), + hex!("b499bfe19a22900c46bc0af1925887bfdd62455a3b85144e44b9a0a3756548c72b4f5c61f21c15f5e70b627d9f53a9c4").into(), + hex!("a5f40fcbe99b494c6acdd65ec3516d5a4a784ffc501e686764bf655c1f2f4bf784bac6b85e961d6a5ae513555a638323").into(), + hex!("a44c695e5490bca1cdc6b69fa80d6540239e42ae1765bff39285d1798696574c409e27c288b3b57196cf7c1753366969").into(), + hex!("a1ec5d9b8e55803477fbdc454d9c5cc605ead24147e5b04a03f80558a14f1e08bd6557f3fd11dab06a2816d32138cd43").into(), + hex!("98957c2e0a82210e2329b60dac05dd8b219ca00b18206227b725d011bb2f8b0dc1a79149a7d49a9a5505301b1b3847c5").into(), + hex!("ac8df8b1b596039c24c185108c89ef4da384e92c957c84bdefdab923e4be7c0e9480d837e1ff2e6269828b86b0b9f6c2").into(), + hex!("9358e3a48d4938b189059c3696169d31339851a1f4205dfe4de423ad4b96e7015c0dccb8bcebb64c1c357b65d5da6914").into(), + hex!("af1ab721df52d8b106449aaed05761b637c38f4c5513062afa55a09b94c8b088fe98cf430be4633b4f2f818da545b37e").into(), + hex!("8b8c063568a13f6522fc66285ab116a06d5e226a72f5a00fb321dd9b7d0bdb53a6b46ac17a1c9faf468c19b128c84488").into(), + hex!("b537f79bf008cd16711390c188c52d8dcf23cc41990c82005de2b0ff1fa09de85d3c34328ad9124e108ec252ec667f70").into(), + hex!("b9e8cf06d584197093d4b4b1e1f745786bb1f9772c0a771b321ae2dccac167ea79632138d60d8ed6dbbba2accd0a3c11").into(), + hex!("a674106b2c965c708b98a9f28a3f511f5dd8dfe7b2b9ca64a29152c7fd8de428316638d5091412e22e50406c372d9950").into(), + hex!("900a4953af5a28ca5b6f789a0dab9a03e3e5b9a0e866465d371b871fc59ecba31b524b0fc414eb7467d4384ca1e4ab5c").into(), + hex!("8b12a6114f8e0947995d72fee19e9204a4b552a85743d5320c1942bd2294d52a2d6d346f5e930ed788fc929069733297").into(), + hex!("a118f4b631a0bfc00df74a94930d69075b83be0bfec2affdf5e1ca4762d40592132108a7d2088891e7fe078c84ea9d9c").into(), + hex!("b074d18f84787d245018a2dabe2f0a51bf2f3786a802317122982a598f7f953339468e0392665c3f3a6b8fb17cd8f72c").into(), + hex!("8e6230b8186009b765ae6b176eb7dbcf503139472c0c2c5574e3d608a49932f0b852e744d2e215c58512ed2b4e8178da").into(), + hex!("98cd13f8400ecc9db458cb81840ed6467795f54f25680931881808909cc661230716fcf8b3fc2b18f4c12d30c32d9e20").into(), + hex!("b861f89275776bd640bc7d0d347df31e784292fa14ec468a6b0e8d64a9b077b6bdae1bdbc56385bf8f5676ba62002606").into(), + hex!("80ac9088ce82fd7a90c91b24e5e91636ed76844303a3b1105bc284b4e9a860acca3207d1804200a55eeb3ef45ba97558").into(), + hex!("940bc07a53373f075128b6c12f59120bc7368289d5a960c55d52abb68e8444f6f830b07850d31a9ed137f5357b38406c").into(), + hex!("b8c5919657811270976eb45b9f3f09be798fbcf6b34ce7443fb36207816b6a84d2b945a6e6522480c2feed12ca980df9").into(), + hex!("8294e6ce7d7d3b77bf48252eb97cca47a5b9dff1b8c97f8b7af8034b938864f38bad932bfe44a9bf4df81e394aee7ef2").into(), + hex!("8d9075a2c42c1cf51e082ab1a57a66670f0e81af2a651aacac5aaaf3876711aabbc0c96e44d883e6ad8a91a81be22940").into(), + hex!("882aea71e4512d5c41b5fd6509ede0fa35a49fff9648d277b531364613342711b2c7520a5f8d58ff31b7fc9407f968fc").into(), + hex!("8a34a824cbac06cd99fc68f36ae09c6adf2d472fcbd378cda61b838c29ca9750a7f7d63d9b61d1f30deda1ce048ffd42").into(), + hex!("a4f027b5466de4fd633cba98d2c8c78db10f91c8bee76c32ca5a80c5e87ffaf19df84e675f31bb6c14ee733ac3d4a33b").into(), + hex!("b990db2d743b389132d4d8281701b348bfc52f707e6553f309e4f59706871142e6b8e3d081057a5c43243911148318bc").into(), + hex!("a4500c88a58971460c33a404a65260a9e21c4a345601d1686ecc352ab088b2bd93d30930383901fd2d042dd037286761").into(), + hex!("a4de9078286cde237b4ff2da52a0fc1b8fe7b931ac35b3033dca0b87b5c86e58bec951a66a7308fc951ebb70fd0d0bfd").into(), + hex!("a9adb6dbff69b115be1cb37d5ee3a95d8c9f466f059128b6ab197d4119f6c0f87d1cf4d14d4beb2a43f7913700c1d909").into(), + hex!("a8a33f167e473eb2ace3bedc1cac2281bc9f522a0fdf6a9eb365859b9116067e07b7c380e8ea4dd33a4fbe23e2412be5").into(), + hex!("88c3785f853a192c50c38040ed52c413084dd069729cb14d806223f8a51aef40c21648d1e03bbbca031ce811e1b708ce").into(), + hex!("a7db446f88ef0d018675c0e7be0e9655d098529ce4b4c92ad809ed9f588c3f6c6dd98267ae0efb1659dc16a29e1feac0").into(), + hex!("916fb4b864ef46a2f8f570364cdf02c93d8432d8155e7ad1a15777d7f5d5fab94797257d0943aed5f16033528a4290b9").into(), + hex!("b9b7ae2ec02b0694d7828a69bbd1fd6e9070cc217319dc4e8fc854e48f5ce6e133fb0d5492e2f87e7cb8d3d557f17037").into(), + hex!("8cc36ade2b8039ffd41459272091d9cc4c46a49a187e18e9e3b283136831724313ee6eb5954c34acf9ecf7d79c30dcfe").into(), + hex!("b89a28db91eb06f191731a927445ca64cb685a206f4d77f335f510eab3a4973eb1d199525aa12df17f97cb4e079bc35a").into(), + hex!("87fb2881b92d5d9a2555080afe033512fd93306bd25f4a841d034c0fd9685ae09ecd29d27523e8f18664cdf2127ae6bc").into(), + hex!("aaf63cd83256de5b8558bdfd7f5fa44b3b3cd767983484ee482241286f82c6f51c1de99e2c03c8c99e6d4a27b7379cc1").into(), + hex!("89b52eb17e1c2868a3da6727e6f122046739c99cbb6aa7e30f65d7e649d09540b7ba77ea3efad77be597e48f7abe7643").into(), + hex!("88d097674b763a770872f17266f38200a4034347756c5ece6f11fb841e82447a75f6f3279ba8ab54e668b2072c6596ef").into(), + hex!("8de58933f07ac60ae919adb4be0becfb5e6f7330708a39cbc4c988c79033f0ffb365ae2a6308c234c218f0e45ec1ce6b").into(), + hex!("a4ec080db7716a0eae593b0ca91a16273abf534b8d153232e4b7d613c9fd21081bc8442d6e57a6e8e026c66c93bf0289").into(), + hex!("b680857b566466d1fb92d78a09b75d93753c275249dd05a17702e48560e4df5c7f9ca68370847250fd001433972c8b0e").into(), + hex!("84ec67623fc58128f4504b071b53e3c0fc60ed07318febc8d450035567691e2e58468b6799e5f3d93536100bb4b5f3f0").into(), + hex!("b22ce364b11e164d3df52050d59085c29c398556617277349637290b193727e3942064693ba1d7bda313905908a071d5").into(), + hex!("876198b5734f1ab5f7ec0231110e9cbe59d116ccc410678d5e0108fae42bab5dcc7cd15df200bc71f471ecbeb0e80d68").into(), + hex!("b081fc87056c34a8a78cc34f308502c5b6509adb0b344e83227b997aade90d6f0f1b8e5302601ca3217ecf9dcfa24ddb").into(), + hex!("8fe71e517db52831a0c4adb83fc6524817b9a358fc6bf58c03c91d4125482921936391e54c767ad2f13071e0e5ea266d").into(), + hex!("91212d83807ca11b030e5ab72ec85a8d13d468c714fc97c20b5d0569c382ee270d2ca486c88354994ee54f02dacbea50").into(), + hex!("b022bf24d2ea893125f3a89186f444aa5f301333f0667eb5862586a5eea8233c90202064eaf9363f7b367a6dda15d45b").into(), + hex!("b1f45fa596a32d3fe267c830eb042432eec6b79efcd5c84ea835d7108bd4290fb64749ebdf7e7e51e6138fedb3cd2eb8").into(), + hex!("8567d2366c584d975bea34d4f9e2ce62a62765125326c5e56b5cda08fd2f2e7f769db47eb514d2d9324b645879c82a66").into(), + hex!("b4816fa77c76e1f75e6fa903a4c0c031ac7a5f5ccb5f553b4eed83bb34067480804c0f6f308f8d0fd723dbe2198b0608").into(), + hex!("a9ceeea8878d799fbb6d52dc4112ae712429b9213f72b284698d68ea6827432f34e51daae1727b5402916a836567f611").into(), + hex!("984c8ca226df18ec574e0fabd6dc9ab3a2e1b319c4b6ab5b19872239833dcf447ee5d720305b2385d65facd297704809").into(), + hex!("b02fc16b3530532a2373776e2512421d6d2e42f3fd3c3e71393706d74ef9324571c8c1ba7b9caf65dedfff2bad946d71").into(), + hex!("849faa2060a75d08850b54e06376f252d9cb4add3e740225ee37d23e29f80cb9f98188a7eaf6a381af4b4bcc9874b792").into(), + hex!("b5331ab6646a8be3bc37c5fec56a597b914683402828dd4098b189f245c638e063c933a542c0122f063f98a9468687b7").into(), + hex!("868d8214f26e14e71ae0bd514275ae9442760af72269790228e733005293019984d3d463c2bb82936193dfae8c267fa3").into(), + hex!("a88c6c4af4b9d285997c9b5cca7e22ab9b8e5873ff36455bab6a6dd4518e966079524f8c35391811f16eca421f588694").into(), + hex!("a6f508524a938fb49a7da70251fc8300192882a3fe784f0bc51027ef2193d90c75d0d0720f2f5be634d81f38f3d85b8b").into(), + hex!("80a923acf2aa0349b4852f47edec37cd47bd74447f2f91c110ed092d015887a6625d5f1fd1f5d00c994edbff1435956c").into(), + hex!("84ed9f1ee0db4c9ae55492fd07fdd44851a6d0209da5b521435229b1b45d57c3b835af627122756ad0e63e915c15909c").into(), + hex!("b4c4c1e6fdc418bd29cbe8082fd774f678dc28a51896a51349c888ec98124b7a522baf70b820ae0729696624f3695af0").into(), + hex!("a8cdde029503aa3e23776a67952b2bc954fc0dc06f07a78bc94e6408edf381bdadc29efe4e5340a9b7efe99a3f3b3687").into(), + hex!("ab02a92f5ee21035e6e3e40a026d8d5680f98afdbf82dc037dfa30a87a1c101387a0085da8474989b24196ff494aa618").into(), + hex!("986c88a5d0bc6ff4127e34e0a5fefc1290936ec88d1765e776e199601f9660a8425c1fc6defff07fb81576461d0ed7bc").into(), + hex!("abe2259e880aa8b587ac9a31f794895bb18ff1bbed378a70fa09388e5a6a7343c072401c856bdd92fc2f60ca11056aea").into(), + hex!("8c04c98815c0c1f281c8783ff8098b0d806039a39fb2f4642a08f821c02506bc7c80ba7a1f4b225ecda9971ee3a22121").into(), + hex!("87b7bb0cce6244aa1a540941f0ff5ae4126fd4c62bd98d34993380a35e1c9a9f43b561506e5eafc1ddb8aef131403590").into(), + hex!("93cdf5f956e8b40ca0e31cf559937b997897c137a411930ca28075899abb6c08dd6aad5b2bfd5c09f07613a6854b3be5").into(), + hex!("83ebb284e03b4414694522caedabb391062ba9ec373e94427feff071644df91635ef498dcd9351ae259c5b15d6edbb38").into(), + hex!("80747223ba06d6465e26a354b79c42ec0624d33cdf015da7bcfb31f7009d92aaf6321f4a921f6b38e0a394a412edcefa").into(), + hex!("967b4b10a341abc5c01ffd413103c6468e3efa32c8ddc7e8622fd3ab2a765a420e0be3c81e1da05679becc5bd03e59f6").into(), + hex!("8a01b90d551f26c265b9987c67b641d15bd3b8e5af5c25472037645da05d9d54c0e59bab32578eeb3c1c5889f4fd9aa1").into(), + hex!("b6b38e40e3fbb31b257ecc18dcfff2fd850a41c2cfa5a642b0c383cc1a86b2b9adbcb22130665f544f1d9fdf87e92dd2").into(), + hex!("b490529e0da56e7e4d4cb2f79b704576c8b6569e9960dafef059dac0144b29ec337f4beb515465a57414d8965268a3dd").into(), + hex!("8a3b14616bb721543bfe007f1a042e76ef068a6e4f8964d68dbb7a733ea92dfe4e51f4008aabaa01a8a3566b00d083ae").into(), + hex!("8b82dbd0d0592d45d6309c795beb42274b74d844cfc393b34cb6992e3b25ea8f62f777124584eedf482949bb999ca5c3").into(), + hex!("918226266d7f02b2081edba64ca4b70339b7a63ef9194cd77a214620bc25618495cb4335c0c3621c75f821e685af3f1e").into(), + hex!("a61f56310689b9f383b45e8c8c647bd7150fc6dc3be96afb464b0c67c6f8c73ac9941bc8a5b0e2093255c204646c94af").into(), + hex!("abe204f55b8dd101bbd554561c1a7b50c01b31c967f6cea18dc898a10021eadca3c314f6b7afcc2251682717540d2100").into(), + hex!("a0cc3fbc4a05e3b5f93f4df85b92c1bed221f21700d8faaf84e99954cf6994d0052c8ba8ab894503b5515bdd1460ac5b").into(), + hex!("a5e5e175726b31163e13447e360f835ca64c3883901fb1fdc275b487106b39fdf43b83ee8f3985dc85157b94aaf8c389").into(), + hex!("b34106e71862b290f7bb47e5492417b07b541fdba23ed474f29d666cfb50bb5a3ea137ab717a41ff769af53ab385a3d6").into(), + hex!("aab726a0317c365aa15ef9527e5101b1a90cdd60888b733cdbd61dffac3374f995206abd154d099b2dfa03dbe666d503").into(), + hex!("b3fe9956454604b2aa1d51480ae96182ad1a8af64e80adbba1034619090c23d0d7ddb4163f400399d5946babada2f5a1").into(), + hex!("831a0d4008865576d9d0200dbe80eeafa7e6e6d442a46ebf949f39e32ad311995535a261795a7e27f2b23a6d506b7a33").into(), + hex!("8d7fe284c9ea1a2dce6ac70e3f225994f65ba9791520fecf5359b80f7c32c1e45e75b8b787ccf24b83c79301e046bb4d").into(), + hex!("b00df7ea640dcdaec66317924090f49380edc5c669ef1249ec8a24a3436b4bb41be0edd4cb0d04bc6ffd540ac8efad18").into(), + hex!("aa55d72470c024627edff24f9a19ae958d6b382bab6a24581183f762d736ac10f189ec3f34a7a41516f81696352f16c8").into(), + hex!("99e172cdb14a23161b5e8aa80121d98e69506ae0ab956912eb2ed959b73ee901852f263cb65798554ec0ee35089b4c03").into(), + hex!("84ce8ec6a7debf3cb2e53afff7d1f68bf75b7b209938192c7675286b17489d7996ecd9514c5233af0a17390b9982d805").into(), + hex!("943cddf3f5a6dc04f425aaca25be44438aabc7a661476761de596fcef5746f9d83c361da3fe1f21227ee5b9bf9a3ac76").into(), + hex!("aa81e66cb01e77c5db882792e9d896c83aa418b12c3b5201e1937ba5b74bf5fda974c82f6f40e3ca48bae72ed93437db").into(), + hex!("83bee12657fb462a5988ee26e2d0ef8b11e5fcec108724f6135e95913d7f4ec338031b697b24fd7a650cbeb088b26733").into(), + hex!("ac0070705c447e635b8df509de9ae03ea9b0314fc58b3befe14c316cb7b70ceaed081aad115a2126ecaef630c6bbab0f").into(), + hex!("a1c9c3b6f28c14ba91cf063153c50253d82440b81dd8ef938e181ef4116ede0b0ec62844e1d7e8b387668ddb8644852c").into(), + hex!("b41811ee8e385836fd709081a9a65a33ae1571bf943937615e97d49aeec3289624882915a5f5b6ee98601e752bac1212").into(), + hex!("a59cfa6d60f5c3b62197d3058a9b42c66bb841ee5d67ae34ad452dc70974de0a56a770c4ee5905c0d214c3d81a5269fd").into(), + hex!("ac47ff714d42056df3962cb4494019c977fb6200cdeabfa3ba85ec7d7d70c7d3ff4aa05e26aeae6ec6a3afa460244ea7").into(), + hex!("83c0ff348f1d018485c18417037016ec592c249830fa649b27754dfa70b94a549a42eada20ab1c4de2a5a513d742186c").into(), + hex!("ac5ddeddc94d18cbbad0e1889a2b64e91b3f927d3eb666ba018807f1e4e1451a43498ebacf12fd370b62c5386e36fedc").into(), + hex!("91606f0315fadbc42b1b27ff35b5601196a7a8beec3d5c76643e38ef28f0aef0aba9123bac7ceff0b297ca53727edbd5").into(), + hex!("af9cd077736f17c89ab4fd21fa2cee63b16f67277e9c5d54663f6d5a7abc3141f3045558899da70419b1e92ce88eba86").into(), + hex!("ab0757213aa3fcdc326925e0dadc2206f43c53f7abaf34a077f1cb29427261b4bd9981dbd1e33fedbd77fe00bbdaf8bd").into(), + hex!("8c97d256f9d4e0f309522f3899c5f74fd7e8c4dab6adf4886e7b058b323e294229fafce28871fd39e5c43f28c670b8a0").into(), + hex!("86eb85ad6fb7a3d5cd9aa5b22fd648fe9db688fe663c835abec75a6bfb67af0df0421d24203083aeb8ccda06dfb230c9").into(), + hex!("afa2dd3712eb94c9097135a69573c1f373ee0d7916f4ccec5a62445726aa4c1548bca45038e1a44ab7c8b7e3ea22dd6a").into(), + hex!("91e82407c442937af665ff8952d8b7ce3d68ebf807166aaf0fd710b76c65b39283e511b3314297ab0f2a9c8a2d76ffbe").into(), + hex!("a52cdd05f6e254c6da7a00c9210e33a49658f035b78bc7f15b527fce20c3893d3f7dc27a616eb3e107da060df251b082").into(), + hex!("81e6ddbaad6a18404832d2923697ea8df8dc3b39e53390269f197b976b5edbad074639e1e7bb25ae87b00681973fa021").into(), + hex!("a776979b38184661cc36ae9bf99b98cfb64babe37b16ed7e16e33e2187af71d9f62af4fab2bf0671baf3172727741d79").into(), + hex!("9395a004323f4ae604518224292a1fdb359fe9d4ec2a2262f13fb33d90a9dc50040d03fa6315a5ab2db043e7e16fb971").into(), + hex!("81bfad9e94c00fc810c4e63042fed6dc54c7c48637064376d5a4df8c8d6be3c2eed335640bf45bb8df99327a7e070d06").into(), + hex!("b6b38236ea973f91eff175206c4328cb97335bc8e498d9c9a2040468885f7d8464a8a1168929cdcc4c59513885e1589c").into(), + hex!("aa14a7baeb7b6d0048bdb8c772de512001174f764b37396c6481bff5aad30abd6143e4654a3d80406f8d08948ff8145f").into(), + hex!("a7297d6c09873e481c04f2e9e9a07567d78da504d2929c8b9d8ecae1c4d919611e061caa632776a8716b20e031cfd203").into(), + hex!("a0942935f58ef26a111d77b1c4598207eb6e3414c106b286f1c4dd344b3e70d3a46595ebb657e43f0e71dfff3b532382").into(), + hex!("95dca5de041e96f8c64f945817ab1ad62414b3002073b18331e288878c7a889774468d3c24f04e0714958ebd79ebe71c").into(), + hex!("b64f58f4eea309ea03c60f6ee66107fbe45c5ba81b8ea397a515435a179ee86bd098cb9acab4f374d29c8a388152fc6b").into(), + hex!("a70fe2ce7cfbdc22183a1a81c779c6071199768ad9b39ad0727ced4fcea5fc79e9833279ce93e1ef16cfc6dc0ef4f15a").into(), + hex!("8169d05ef0406b661022af53dde8ccd7315b3e35065c568673bfe5e59828480312a8ad418ad431beee12e7882d11142e").into(), + hex!("8148070a20eba3b61bd168e00ae8262d698263a8f22ee01ed6d46d154a08708a85533f54935bf92ee6ab0c04569eb3ac").into(), + hex!("b5e4f8b8a011c9cde6a9338d7c751ce2828fcf41b40e140ecf543150a5b4859f87836461d0ea2ed7cd0e6bfb8febdfc7").into(), + hex!("aab7b0022a1791339fbf567e771c43e9a2a46fcfed394b7216b556aacdebc259e5fc599eca66b12c23467b2443fa9c76").into(), + hex!("a843e5929fa14bbdb5f370d28547a7b585443f4d2fdf8e7237fcbb93a5220d62c8033665996f36288127a2bb4822f357").into(), + hex!("92a5abe1a8d508193c88827f93156e84199b14731a68b0b434663e5b9ce8e6e3005ccefb3ad8330c56fc0898eb9334d2").into(), + hex!("948c5a4bce25157f5f779fcdd89bfb4747a6178d464d15148742920aa2ab7fc63d6989b586152e1e79eced93f8686206").into(), + hex!("8702f3fccf470a294946970f8ecfed499f5ab3df799601f872d7be3d9227ff78a764550fd1a97ab25b7be96d366c82e5").into(), + hex!("85c5f99e913f1cb67a30807386b5292c841b51e959a13912fef2e0f4ba84ab3b1c483dd5fd33e80774de19695b622888").into(), + hex!("8a903e39b9b46dcaaca4fc968b298430b982ed3916f8ad533ceef5131dd507f1188fbe856c80bedc7bf34799743fa86c").into(), + hex!("a91ecd938c2a399b97576c43c5d1621fe748732090e360fa1e3ddd145438f9569d39a7be9d032b435a5d14ca4c905d15").into(), + hex!("aba9def4db5bbf2ba185c134f7734feeef976573e20d76aee476bfaa2af389ba5576a1476aae2d42d5470a46ca3f58ba").into(), + hex!("91d3529480d066817c0111bbd92714a40472ed6c877df358de98f0258f79fb8ccd54a4fa8bab3b9cc15bfabeb620c196").into(), + hex!("8cbce4e674d90185c47225c587dac654428427cef8a563cb89aee6fdc2ae6f12a8b11be46c779ed9afe38ea97d7d71ec").into(), + hex!("ac684cedfa58b2adbb6a13a94aa8398ef4a14970f5a43a344986cab68fff7fd48f7bcdc0506026eb0a2867efe86f283b").into(), + hex!("a21a2f8df2b811550d6e115c095d4d6781a84ba25b7f4017adb318776ba7452f48ed8b83a6a94aa68d83f2226a4c0549").into(), + hex!("a0d96e01d937144627c695aa4256f1d1a16c708894ce854f5ac656585e6852a43c39080909e7029b6611ef519d9983b2").into(), + hex!("a2f32ffa61e370d087058cd3ffc534da6a917f75ed5de568938885cf5220d474c930ba9bfdce91e031aab3b3167ad362").into(), + hex!("aa6a7c0162520c6706ab0f6188b718c1909a4aa12e71afc1c2d40e51fe44f667db0e7f1f0cdd81594447e267720f2dae").into(), + hex!("b4f16474ec3f37765e8750729f3245167b82472ec454329c9183a5d5ec939041d85b83523d11f2b895e2d15586f81422").into(), + hex!("917af7d2995b6466baaea2b3eaee5f76508d0c117d0452bca6a07ecb87c0cf595161abd5bd31a904e05684e55475a4ce").into(), + hex!("93dc25ff6a8ed93fa40d198a97955d40a5f29e50fc6fa6dbad34582478d3d1bbac0ec5789f11a92a738e533939c281ba").into(), + hex!("a41c824ff14ff5ee486a6130dc6cb01043e59f71e234390d464c95ac49ceda8b5400079ed4edecbb59be2083d8f06da7").into(), + hex!("850da042d678ac0aa31dfe0eca861ce17cc306188f260195fd10f940c67d42c9431cb68a64d27232e989c9c23a6e3d1a").into(), + hex!("a3e223f30d9782fa1fae634497c64fc58bc8289e48a67c8517621918e2b921cba1e90b2b01f838ea36071ed89bf64ed3").into(), + hex!("809001b01c33bf49a97ab6fbdf708fb224879c71679a2b335cfbb3cb4aba3201a32113de289878606c9feca057d9faea").into(), + hex!("a10ee1706f4c49a9cb2fee4ec6a0dbdc883fe40d4e1cd7a0388f49edf1f5f23a38e6075fa5fb54fd8e77ac3742266a6c").into(), + hex!("8c96e17529d7051f09f93faca150f5313e4d7f32235a4af6d12270780d6c14418749489a2674c728095a56585e0ed924").into(), + hex!("a9a7bf56eb25c9bda003a70128117adca9c33c6bb24bb4c381ac405e014d9c75aed0d704d801b9feacdf81c3b7f0040f").into(), + hex!("ad53d11d31bb9ea53bd23d673fb26211ee39ff4442e9efa1259bddae866e97bf07b0f9ca44e166b3b85d19b5865b1612").into(), + hex!("95e86d1427c8abd87e7f966c2ff9468d0bc3f76175bda677acea5113b5bd0d7631972c4172220e3a72e0dad1496bc14a").into(), + hex!("b8894228542dfbbc6eb65c9adf6549eb4ade838701356e7d672c095b1f997be5bbf3ff19474ee99e81320efeb04cd529").into(), + hex!("88bc36d6d90424e86374499e330ce5afeb63164fe81fcb4d56c5c997e07093a37df33437389879895c8b2cccac28ed0e").into(), + hex!("8ec1d43488aebb9544ae0a12ac7311bf873bee05caafca5176e26d681b881ef6b5e3ae5d9853b33577cc21d3acfa1e82").into(), + hex!("aec567db9a542eacf68cf4b7b9682ffe0b385dfd192296f8d8cd9e1db9d7da0b4a4a0d0ec2419825177413faad458cfa").into(), + hex!("ae242e9e2c7ff2c0898f92e7e9742ee5e19376ab97195c4eea0487490068199d0fd7ea08b832c43e208336b5c77d1947").into(), + hex!("93447c215479b68442636384d29fd5b4815cff904668e909c67fdcef1cf5d594219371f62edf189d6e54f04872705947").into(), + hex!("87f993a564e69e132c6cc4874fefd83bb5032b98bda5eaa8fe9e1713baaf08486aea21eac3231028715e846e33a3fa23").into(), + hex!("a9c4eade07d3d51bf733d8357005e08a5f86cb44c3dc6b66dccbdbb67cb5727bb456d6092418275f34b59063b3fd64eb").into(), + hex!("8939e3cc9c1dd203d8079aa4ac0d40d2e1b85bd876616bc6b589b0bd187701fcc36c52d79ec7f14b5e54fff459c99028").into(), + hex!("978122dfec6fabe4f737a3c9326f2f721cc212455001ca7e09b65b70ec1ada1ae26d451632f31f648cbc65a3337250c2").into(), + hex!("8d1eeed7fb1902deaf7d6dec7c86807c4aa8ea1d7130d6caf01d65e36f6a30e3442a97ad6918e67d2e17fff4ebe7a97c").into(), + hex!("a16203ba484b5b02a1b210d487a54c3da41b3815c307a30fdbcda0c3f5f2205e16bc7232e1b8d57d5f58718ed4941ec1").into(), + hex!("89b4e7bdd90323c53aa502a9839f57133ab0cbae1cb133fd0beb54f4d7785988eab89eb0bcdf61bf62a29b341befb883").into(), + hex!("b75550a71a4144a4f23ee27d86c10c44e8e57c118ff4f9a2685762a98a3770a6c2d1fd9229f9792dd4e784e8b2eb675c").into(), + hex!("9171ea1599ae47b04ffc307dfe5e49da0f48835cda926355606ddff47b18ce3c224828ddb942e63dd8153c273105125a").into(), + hex!("8e0e78d069f4d51b9b0c370100a9d10e395b8f88d009e33ed7fc4959bf140176cc316843c76d2a741a3471d56ced5db4").into(), + hex!("aad6b97330e76b22781e78ebb2fb2e92148d74546cddc7348e7a7f0563b986a7553907c8946258cc343a15a8918f7491").into(), + hex!("a9e8e436356d44c945d8248d249e20f5c50bd147de94418d4f04e1f67be2319e4d2a7291981378a1e457874dc91a9948").into(), + hex!("800b092bbe1f56e78d766c510dfe42f0d6670335f5931b3f821c77689fc11a502d7c82d2d887ab21caf312f8e5a037f7").into(), + hex!("aa8b05f90da0056b7659c26171df70c748d7a8fb52bfda42b7d129df386de331c1fef9d5ad1b19f0452cafbb813c3ec6").into(), + hex!("a6bb8153637b097a905342895ec1c927faa92ef8d59af86e43864ffeb6b8caa3f5b025079ccfa83214332aa4f6b71a9d").into(), + hex!("8244cab3e6f39492c8fda490a363dcbd8af265dd3a158c2af0e66182b48fc2b49f473b402bbf0951b42da5bb669504e8").into(), + hex!("8696508e20c144ef2cd954fe420c60f8432529b97a865a52de5292215c448984dd591170d88c286d7bf5a1cf8b94ae53").into(), + hex!("abb5b057c6b91d51df313b4690b15a218dfac6a30a05041c5cf451f515062eb02c54ee6cf6ff2df7640d15ddc7a95dc9").into(), + hex!("ada583911773366a4ca0b5d407520a590e4f3c6628c6d050f2641655d1654809b886807c1efeee9e9ca187b79b7676c8").into(), + hex!("9730edb86b7161715296bd5267bba55d3bd956dc9f4c640df92cc8aaeed8ab2dc1ff74988ec2122f6c3ea57b6e30dd91").into(), + hex!("8da42bb48c6f17c0e96b5edb71ed5e937c9aa65af142234e3ce61403df7f6ef05a4309e92469eaf68d83afc5bd800373").into(), + hex!("b3cb17866a99dfd048c4ad6024823841eb6602c7e4728340f1167b8af3c810926f0eb3e1a0f51ed6fba4a80743660db0").into(), + hex!("af121178dfa05ac08a2acd56f895f444e56968b703ec6b6cfae1e836d78afe6f51021d4a415aed89913df49bffe27ec6").into(), + hex!("958d5dad1aabe840881f29617dcd2f759f220974515507b0a63b3487b4cbfec69be7d22f4f7f45d693101177ab205303").into(), + hex!("ae6160e53c2c9ce5495bd0f0476703684d854048f2a8bdfeb6cd1e93fda36e44d879531f213feb1dce706d35f9fbb04d").into(), + hex!("8dca41a5808d3c75f41919cbe65a226355df9ebc7c1a2d2263d654bc66d1f5786ffba84a1670a7369258bc92d6bd68e6").into(), + hex!("81585a607df11d0a5dd778adfa1eca440a49e37b21677fe88709142243f5ffb2205e703366de53fbdbe3d7ded093e834").into(), + hex!("a80b1f358d284d3d8b18ef9f101d4f0d84c2ff99342e7150a55bb2f54ee231e333ffa930487a86e97f460696348e897b").into(), + hex!("a4a1f79af8ca4a5c5b44b05828449002c92c313c8bdc33465c099ce8f74c3d575ffcf0ac1ec5d29e80ff96b07f08636d").into(), + hex!("8797e455d44ad2721ce7de2fb8125af1bc4c0757d9c2fae25394e44b8952dc5fa597e0cf5d2b1c2ce996e380597a1db6").into(), + hex!("acd840fe9ed7f38ceb48d65c9f9f02fba4df0fd871efb58b35547c9b526e6e2416195d2c131a04408df7298db50a76aa").into(), + hex!("a9ae67c2d2bfe04d64bd4def66509c108f9ce85394da48d97407535c1aec05df39e3f7c66203f72bc65fa72c18bfa77d").into(), + hex!("abb785c66a7aa06200bec1960c572d61a9cf2c283404601259ba720a506b3831391e998346ee73392a3f7f12915b6f6b").into(), + hex!("8a453eb657c2a85bf93193d47ec26102c4d3adb666a7e1f05f1991782319bbfe104cea57ae1f4379cd115ff711be67fc").into(), + hex!("96c7151e34ed488a06946059722dd9d1b5a2ad2fec96b545ed662a3d0fc23bce6973d93dd2932128d95b0686f9208fc5").into(), + hex!("b5f39ed29d3f85e56e21ec2bce47b04ba16d72a9fad492815b485a93065f2a83dd46f92d74274f815c84792278a67cf0").into(), + hex!("ac9449a216a875c2f288e34443a94a521f8e9de28f70b729f393a483359ffd3ef8537b8a798b8c9a259ca390f9fa9751").into(), + hex!("b15584e841de0e25a301bc3378e89baee55989d9610c513b79748e7c51c484f7bb1d9adb33f3b63d52d36918514aed2a").into(), + hex!("b4dcbabb43cf694b024d36734baf824830304257d959f6300ce17f892a23000e036c4d3d59d7d1198bf4f6ad5ff07e57").into(), + hex!("b8a1f0a8ae246442517606f34ca4029deb727cab005c9952ee9858dd99497ba8a0e3311bd43aeee35275db74c7bbc52d").into(), + hex!("b1c443db1b5a00a87a399880ccbff4481f5742423c47d38b175527e84b32fd66110791c117fdb70782d75c476683f9fd").into(), + hex!("8e018c4b2b4cf1f1a417d00b13fc51ccebcd09a502bb14795b8274585d2e30d71c2c7a9b9f56a717f0676e685e65e907").into(), + hex!("871ea4444c7080995472fc8bc08f9091f9f706e9cfc49eeea5357867badd837649f059163835a7ad7263cf03fd13b198").into(), + hex!("88b67b5819119372e0fd7f97ba1eef877cc32d4be465001c35096adfa18e1811bec1620849a608de8420126fee9c37e5").into(), + hex!("9060dc7f55fdfc237799a2814a6bfe2d2f539ab76c38a9b1206890323bb4eb7b1ce011ea4fa552b412bbf6c67a95f025").into(), + hex!("8bd156a3a54bffe373fea65ecb2ffb12c96f04e07eee582200a0ade24d543bd6523ae5eb8a710c1de1912b2b4712fa0e").into(), + hex!("a8c3fb552f1a8c6cc2714b97d0cb8b2b6028bc3aa4571a7e3e33f46eb4c150771556c7884d575ce8fb7b62a5770ed2aa").into(), + hex!("a808f5a34beb7d62d23405a64d27ee5d7bf83cd880caf7bd4a615b84f22e1dbf11eab129d9cc9ad90d4e1dcd68613f0a").into(), + hex!("ae56febedf59fe99e79e87d7fe7aea5989493833a52f2e6012fd3400c69a6dde951fba50e0c280779d530d74452d63f3").into(), + hex!("8ed5f6de4a3ba85c6c857068bad6432e96c6054ea38ef07391b914c052c2262856d19403a590e8df63c6dec99da35b68").into(), + hex!("89c01fd1f37d826b9ef3b73e2b1aa5f4b4f86a263b2822cff0153fd2b945bbcf16eb3868ce66910073bf86b222becfc1").into(), + hex!("97b3ef6e0bfd3c399ec959d22d29fa9a79fe8746eec49e1675afbf7a955d02db2e89190ebf43118b65a7dc2db0c4d72d").into(), + hex!("a95700745f0ecbb1e794f4db9788af60df4772b5ffc8f5f693f213ce6230810df31716382dccd5a832ced7f34945d144").into(), + hex!("87d0a6a8cdc36fbd788bf744a443b632369fa0cd983d2b60e20856533ed6451d8476b9b3cff39ed0f75de94ad5c7aa48").into(), + hex!("a14c6f6463aadc8d1d2985b601bae8e74de54954ee7e3aa918837064a98efa5ab736628446582ccd13bd458ec2d50b1b").into(), + hex!("8b68ec274484c910f1a73a8cf8a8a149ff2942ac9de6e73641619fdd9e778e9c0fe6198745f049fa9fed9e56287da0b6").into(), + hex!("b77e981a03493852e7ebd6efecaa647c69ce6d46b2190bb2d08f0eede4addda776fda92e9d943ba57331bc985cc8e112").into(), + hex!("9870ea49ed03991dc1a4f47fc978618d549b4f0ddea01d91e7c409db775c91cb2a58c0c0c57eb73e7b6d3418f850b0e6").into(), + hex!("a518fea50400ae263ab9cea0180079d0d353bdb7cd440cb4d2156b9628e487b704630d931bcab742e0f3d7230821ae91").into(), + hex!("861ba1b761d0ce92972f28b7a65cbf6026bdf7427774fe78ff1f45c67f9083fe94fd2c42f47082b6fba722abb648c61c").into(), + hex!("83d257a40e8418407c80851e2f14d0bc47c3b9ce9e2de53b5c6cd99f31dd25dc200fa90c822060d47c4225d61560706e").into(), + hex!("881f7f674959e4176731ecaf6e2c9b490e70c07abceef15707dba8c9aa3cfa2293a96bc9d5455f769642c9717a4fe949").into(), + hex!("835116735f8e21064c497fb0dcfc929004ae5eea1f3e6863ad0b227c820d36255230090812da0800e03af9fde4354a13").into(), + hex!("98d9c12ede55af8067af5b62b89002c66e3b6556ee201ecbaf585fe5026f997fda75105068d62fe5d2403c6c64c314d8").into(), + hex!("ab359e8e0ef4cbaa9830e2aab892db7cd7ddaaea54cf455c2ca24f10ca337f989641ea33fdb1772ed90a988083405cb6").into(), + hex!("ae9ded9c9fc4e812dcab3d8a1c74ea264eab2df0715c7107ec1ec336c0bb5f3761ac9580ca18109278be5cff837f754e").into(), + hex!("b373013674404122f39dd6fc29abef1b2634e2bf650b42c15d5a2f7d762eed98166be26372e8dc6bddeaff84cc2aaf4b").into(), + hex!("b34adf4c3acadd7e11a9d61f7df20cb2520cdbf2d16c217f39e3afbdf2180abe59d37115910b77a504b81a6000b982c4").into(), + hex!("8161d446296d39d0c27a3db1bcbf0619e0c49739c655af49f49ea8403374afa4f98aaf530413848b7d4b53eabc16864a").into(), + hex!("8256cd8e3c9354ffbb59818f0b24db969a7765d64c2fcedf591ce65f619237d6eabd110293bff42b388c9965ff6d51a5").into(), + hex!("a1c562787d2ba1cb64dba278080fccb1c6538ccb00b94db34b62ed1cd863792f8acc4df78d181badc38dd9bda544e395").into(), + hex!("94ad66b4066f53ff299dc4bde2bdc23a891959903174e8ec08dd79f163c6f4661b3eb3458a786bd8f3fa153c806e793a").into(), + hex!("ad1a50bcfaa5641422c6f10d31316035eaf061ad1fc0a36c8835e078d3fa6efbe6dde4bdb28158d9b7aa74fd9241523d").into(), + hex!("a5952780f78fd6afd9c31226a23d307be72aefe0bd99c32a139c3909b1ff1769e2441dd2c03f33cf98df25c76178e492").into(), + hex!("954100f83b800dfb89721ac06728c3d5e8a8edb7e1b56513a63c2b49dd44b9930edd897fecd262984301cb6df23a338d").into(), + hex!("85de42b8de3cc88181a50e9aae696d92e66cabcc7b86425f846dfac138d26eda7cbc420cfd10f5d2681b63bcf411afcc").into(), + hex!("abeda3b142d621f94f829ed4174d042461e95d978be206fd31f8661263bb7a87c648aeff8bf640ec173a77ab0970a93c").into(), + hex!("af99434f06a13d9c5ee7195ce58beea07940949b686b4ce06727bbbdfa1621c608c891227e2f026bcb58c60a6e925533").into(), + hex!("96e97ce1ed97b8afbbf282bfbdbdb4f863a6931cc781e9d7938617310ded35dcf043c2320507e91e94f470f0cbb98621").into(), + hex!("8693fe1860981505e4540b79ee7a7ef33b26535cde6e9aa019bd1e0d26f359a2d26f0341b7c1634eff1f5859ed3a8625").into(), + hex!("a94e940bc2d8f826c23bcce8fc4e49e29c5f918180f566a67395d33cd573e6dfb149490de1ae75068feaedfe6cce0e40").into(), + hex!("9697d6be370d808a49563e062c2b3a0b347281e00839dc3dc0ed888c623f346a42094fbe2489d0487049f2fe47887cb5").into(), + hex!("b06d4cc8e83acc4121bd278784061f6fd391b3ac378fc6ef46ca2158207f5c0d33a51d3dcc4a499aa48e5b27539c4a16").into(), + hex!("972aa57628ce57381aef9710ebb7cb7a8db28b1b64d7db8be38936479f39772c60d766b0c5dcb79676e9330d0406761e").into(), + hex!("ad2164467404544aabb70605a56e9b0f7887491a1691302b2bedf271b50cb6f1bea1b9637214aa3624f5d8f854359607").into(), + hex!("a9da2595107e9db07c56a59d2af529b036c50033ff43c282e2da551bed8faa96eca744881e600b6406569675643046cf").into(), + hex!("8680660eb867978df2474b25e225fd7536b88e9e73f0188c0dbe835677de701fd402916d8e3d17fe652c7ac6d2fa0330").into(), + hex!("b721e239f50bbc7af5578b75c8befa439474bc4e6ea8d35d1006ed54c6d81c718fa675901df591a69b4cc30899974362").into(), + hex!("a8af30765f1b00ad51a32d856a2b2f97831843878a1668a43e66b65b8d0bd4a2e2826fef5ca5bf140050dd81eaa6174d").into(), + hex!("82baad156e89d7b3da9ded4516603ec9aec36e3a0a9bdd0ded604e4fcc0ba10179f9517fc8372d3743cce5e676c8cd17").into(), + hex!("b3392745016dfafca36a7af4be273c5fb4170b71938d6b93691d7a3bc8791bda537ef001d19ffcf7b393a89c898b8b14").into(), + hex!("92f83c901eccb742618313ee2f5ca571406bbfb1d077ebffb92d52ca962403d34a24f9d333c3a155bb9a72a0fc2eda34").into(), + hex!("9792598e2f303896010e35bf670dc2f3799cbe6f0c66379030b0ea01b44ebf24b9257841ab80d2d6a401fc56bb722e68").into(), + hex!("ad1a3c9c5d699ebe4f1b2727dc94b290c84f44c9ffb38d5498b14fcfc5914f4ef4d1d57853e036ca11e42396808556cb").into(), + hex!("90729c7ec4250613062a4ffbcba5829743ba7fd03a4e3407c2ae00b4513c21f3ebd68d10759ac4dfda5544e77b2ac306").into(), + hex!("840add692580be7aea866045826baa4a07804f8e3f56593a2af6fe317046d7d0fae181632f4009ae0d64dfacd4600c4a").into(), + hex!("b1be58941fe077aa8721b020f34d3ad94d1d5083244c276b7f3e6f4c918517f8c5c8d5c1376178bf27cb35ed76699e6f").into(), + hex!("97ba3e3be55d17113fb63abdc808d89fe205d75fc1ac808ebb78ea1b7570f7a014fae099cbc4b2a4b2ec884977405f80").into(), + hex!("a2c57bf9373db5382465ce924bf7dc4e62f406c187a39ab456a7387ed9231ce059d197f8701af9ce2d6cc772367ecfde").into(), + hex!("a62ba8b81b9f8d40fad7fa1d7e8e49ee547f170889b5d6a2be9e2ad2ab0b265b4197fbbfd3b17803a6e727d41cba83a1").into(), + hex!("a94559a51d438b194fea96975a4571a118105479fbb7a37abc7d676fc8b8d2ca30c66b25b7727dcd297384773ddca074").into(), + hex!("957f9be0f15d8eecf621eb0978267c3fc85607f31c501179d9c83864ed9a9e5d526aae278af3767632bf56a20eca62d1").into(), + hex!("b89928c19d1101486d4299c493db5bb72f56f8bc24b71bb54eedf84284452250427b179dddd7fcfc0f521fbba09d0c5e").into(), + hex!("97dda9cbf61015b296307e510295be258045a1de9de52117f0aa28de48e27ffd24ff711f9187936293babe89da226fa1").into(), + hex!("a66b4064c5b1ee95a35a93209c89206b352e0666abd1b5c95eed3c382210334fedad7d531b9939cdb2fc649c4369236c").into(), + hex!("89d85e413030dc45194b2676a1f2a76801920535ccd909277af1ac87fd9b0d16d94d8c62a421c9d95e7a053cc4c3e0bb").into(), + hex!("b8f0350e1ff988bf23846f2d64e40b35a370d1c5d1f9dca4021508205611f788fe5485e966ff2bb6fe8acc1540a2e751").into(), + hex!("aef9ed7229aaadb1ac4344e5b4d0eaf9b89b20d50d8ae8dae24294ec3c0f2f68dee3186dce35d46020d8d1b2626a29e3").into(), + hex!("b9362f34ead1b0cef1fa9b35b76b644a323ff71c48f375c27e22c6878cdf778b1a3125445cc8cffb6c8b9a3ed046c3d5").into(), + hex!("b69c578e2223f3727b7b5e99f3926eb7424869b356541feecda54a0882e4a009b182c358052d788c2a7e776768ce2b7f").into(), + hex!("a9ab536cca003598d88f76cd0d666b1738802c7452201f5d99ba4fd82b6d7da3c9ad8c4707445d6cb4b2c43de7ba06b8").into(), + hex!("a02648e465634db73fd49bbcdb23cb6feed9688eaf4c5678799734d49f2d4cec9cdddf598114896de961ebdc07436884").into(), + hex!("8253283df9690e171af958f2a3cc37e0b2cd67768f2362bd604ba5c5db8d3500c0d7d6cdee982165eaece63bd016f2c5").into(), + hex!("a06d8256d22ef3891a751716449f97d374e27bedbb9dbd0f1c9528307787e4d9ab9450002bead2922c31fd4ccab9abc9").into(), + hex!("a3bcf7d7c1f1c5a2bdde1e0f4cd3cc6dfa061156534aacd6318d8192c27218b6e34e734a118a282b0d5fdf639e704c21").into(), + hex!("b5577e876cb3de8196b485ae828362419c2f7f8ca9c8f38b1254059873fbe53b57110be543c864bbcf8b485f63925169").into(), + hex!("8410e1b1ab99cf1868fa4494dc75129f42a5e633448e64321cb379175cf6eb704ad6863e3a6475f9cd3cd3f1fcd4b49e").into(), + hex!("b6b21b346d709d4897da4c535556d599486878f5c574bca2823ff9d382fea2f45e8d03aa0fc5a5d623098f1b67c77a60").into(), + hex!("92951386b734171accd57b66afad7ddd0ffdebbd9da835e273b11f96639aefa6259a1387fe3947f9f7eacdcfcbb54b65").into(), + hex!("837cca28b3bb00034d619a3b667b06b66d7cd351ee2c161014b4c33692c705e0fca1352c1e5a7fe8ee00515f4b9c9658").into(), + hex!("95589319552ee815c1e1b053cc4452f9ba600142c37bd700feb3c27468c769e45e6307d7c0a3f366440cdb4d3b997d1c").into(), + hex!("87ed23d8d5fd6aa0922565367ab405e666996e7b918795da299c204cb6d1e51a9c6ff1760dc3fde555b0900e677a9b9a").into(), + hex!("88564f50eb215320ad93b979c617cafcda9122ea02f113029702df1f39116e00b35e0beb0c70bb7d7f2d9b4bf68a1419").into(), + hex!("adce6ad54e5d24a2da5a04751151034245184bd7e61998ddfed673fddbe4e3d069b580e833b3bd4509c30a2e6a81f528").into(), + hex!("80800ca4fa6d0f3ea555ac7d37e54e7776f640f76fe89cd7f172c74723cdb3324da01314c6f66c4fc404c393aa8c7841").into(), + hex!("a16f473cbc9070881b9dd63be9f99670ca571822a67520cba885b2636137731b440561f83e199713ecdd51d4dd542997").into(), + hex!("a08c0625cbaaaba847a63ab4a96206bbcc7bfeb659505d0b6b0e58d22f00aadec41f8cd62ceb116258b78063f26796ea").into(), + hex!("a358200c83ff15fe3fef7a1610bfacdf86d55452258e7f4701082f993c8bd5d234b4d86f96d444e96c01367503663886").into(), + hex!("97278525e5e590ab6cc4fa4a1bac4ed7164a65887b29e658bdb2146008b02907488565dcea09e761f6922118d9933ed3").into(), + hex!("b4e76e4cf2c711a7f3be5b404f076b9d2272e15ea7c61fa4b7a14c5608c352a92fe6674a25dc493a6bc9e864ff4b4a85").into(), + hex!("a4612d268cffd31d092892268e6b4f9f564f0036bfee4f200d270a61a8e5e239996d288d28d6f281d8446a88da56cb55").into(), + hex!("81a70c88fd7d99165b41ee12883ae529458758650fd13001c86f8fc6ce5f8f9b69ce3a133e310619692faa1580dd5d67").into(), + hex!("a87124cbaafc8ee5418639ff27795003a43ac18d07a60fb8a1c155c5fece0f8b25525166ba697e07a5f2d47af6cf0bec").into(), + hex!("90807f573a322aac9d1cd546100e49cb8c771f3d32c89da1890c1c819d90b1dc668c2374249a093c0863d5988c358d4d").into(), + hex!("90cb26b40d10f193da22975b0507f04de6cd9d002e33226852cb40d948d1814009a39332c75f1067e8192b0c9230ce63").into(), + hex!("aefbe25ad8bef226d434b970bda8a47bce8269ad69cf91e02e04208a74055ea79a3a7dbc988981b79bcb9298af467e62").into(), + hex!("b4932ab425f4abad270b32b6f66066cd01fd6f18cf8c84dde99d21c9c2676d58be4f9ea5ebbc454c9d9f921c0333cff5").into(), + hex!("ad19368c70cd241b1a90e5b46f34c44351d298e2fc9ee5906596b20f5aa9e592e878afe8924aea112be60c07648fef8c").into(), + hex!("8b2d2953b4603b73bfb1edda8313cf07f6d9d16b0272d90bc46816677b602b4a7e6fcb36c4f69335918f1ba4ec95dec3").into(), + hex!("ac64d362f730c790ee3f9311990d9ffa3b99d4952ea74f63d141360d2edb7fd0b70d94e5865504af3caa94b63e34ff4f").into(), + hex!("b71ad17d1cdf6be4b7f0bf7d3fca689d5a69a7426dbedfc137bb162142d26e079f49c99797316e2a577225d881e31a04").into(), + hex!("8dd692a01ecd819981ea31f39a5950bac2af0deafb35323358736bc59f8fc69f58c865ed9cfe239ee34d6f80bceb562b").into(), + hex!("b2ae1f2d871d48b6157aa9d74c24e3fa3f09d6c40f421de9c545de5ecdc44d44d6c4a7caff315694d8173974b92c6119").into(), + hex!("8c934a58d5d2c06221c10c14f08f17265e918c6f7f158f6989acca4b1bdf3db58952e5500f930af02ac3e6e44133669e").into(), + hex!("9466e7c328d12ad5439ac01c994825a94665091aa00e212a75c4ffd39f4473a62c160d63e568b534dd7d5577ad266544").into(), + hex!("8e35a84ca6f167c75f98728000b5df8d9c5611080d2dda8c49f8d4afd2196da349cda481fdad8a0e7dad1cebf4b82446").into(), + hex!("8ec436a9690744a1c6a31fa796bfc8f054ea5efb1c8d6a70e9094dbdc32bc199a7c1b29216d706616029525883a9e342").into(), + hex!("87cadc50459a643648f5995ff7ac751c24454040f788e218c4894854ac658fc64c2ea0a8cae4973056ea11f7bb0e5a26").into(), + hex!("aa5a2d8278dffefc43d598186f1119bf1a6d2343143f4874aee24d3869fd4b58401e8bb220f2a228416c89c1f5344af4").into(), + hex!("a36f48c232cba1daae013418421fac6278bca09ee3816eb46cc4059254f1e7672dcecd6eebc9bc0896e96cfa0d8b485b").into(), + hex!("937f8e28abdb3859575cff574517975b96ad41dddd4efb23af86429b01ecbfea553be6cce336d170116752118368e05b").into(), + hex!("aaeb4e5c7f67ee23b1976b2e86f2897ced033e79012532599d130cdbe29d8cd551d9451794741d2ede8564af9070f07c").into(), + hex!("884d9608b7556dbddd0ed13bbe04a5bd9f2bda0bd090d47550f7362bd769a3b3dfa890191c64e44378792d97ee4df5f3").into(), + hex!("a8276ce24aabe42cab32ba7d77c2ef2ca84b3a3e3d750f8d0385f9027f0e009365c78196638dadde186bf44b780fff53").into(), + hex!("9148c5c797b4a6438360072c463008df8b17978335f36d4972b4f826861e8a175265a9eb00c56f47d3892783dcbd080d").into(), + hex!("a7e5100f51c611f010b2601d340ad7aa65bab89c8aeecb181e76185f3a739892f8b172e5cd2c108d5aed8f5cc91cb6e7").into(), + hex!("87c46e67d6643c07e0e318dcb22032753c624e646e4871be4098005100b306f3cfb25b6d81c718e83b42b92841c577d3").into(), + hex!("8bf429c735133cb05edd9b8943b5d4040e83191553452e69b3a1fd06edf2a9eefe8e280cdda811795e1da33e41e58345").into(), + hex!("800ce4d6c257a365e5d8e1bcde67a38c04ff723e38b0926af8b9fc352545317beb40621497aaac8d0e5da291c0208630").into(), + hex!("a5c795afa0ce78cbc11de13c8f58d0bd9ca5b8665d5d8d28513a0d8666f9336b0dc3295557801ba253983fc99f45ce3c").into(), + hex!("99e3e4a8e16ed2ea44aae56b537ca9b159d57e987b0511b6d34767744b04700ff287d431dcc6c67d7cba5748b3580899").into(), + hex!("ac88e78183973e9730ff0c88dd62eb23e2794067ac2574a1c8deed85a4aa6229ee620668dd16084c8f168b2555f04cb9").into(), + hex!("a9c4fa68984527577c6da60dfff110163f35ab7393b852c053d73485155fa1536d9701f660a08b160bf49a647ce3cf92").into(), + hex!("902c3138ff660230158ff69c33911cbe958d29178a54cbd13480addd948b19b0b97f6b235df2beeadb7f7e1803b8cbad").into(), + hex!("a6169eabbed09e08a0d290f9075c62ca4b14e1f7adc53545abae49858b3d5d7fd6cf8d8ba2ee1bf13f36f79ee4092935").into(), + hex!("85a0d7387b1db5635f17899bbadddc0fe6b11976385e12ea4272a8f61d81004406604c8f04f10ce928fb6b547d3bc654").into(), + hex!("a39e5f2112944a7ee31fdccaca927e4f4bbefed1274a134e8a038307820c1d14a6260e25ca5a3af0589f8faa8f516c5c").into(), + hex!("b5c86d0482a417bc94b42f8478de06918b36c5f45d0695275da2a3e773088268cc127ac1380f912307b6455dd0b16d07").into(), + hex!("b8b5e32afc4cf0fb92251b422ef9b757130455150c49ce51f6d6d95d895dafa25649363660608bbe7507d787db9d643c").into(), + hex!("b11f3856f691d84d49fdbeb4f33c45c37dd401a2bb71bbf946f3ddc53a57ce5c4da583f76cf4467d43034a61e1dc88fe").into(), + hex!("a56d1de276b2d0a4482e17cd358455aa19a47bd25c7fc97af8457ebc37781358cbf8a7eec9427881550a8db1bbf51771").into(), + hex!("9508c85488f15d2772522dd1e991f41da1f3af7e3527e098d5408ea96f11f4150415ac68ba0a3031e95528664b261de3").into(), + hex!("a28e129c656bc44d0b6892103b7d7c0d15ef1f1ce583e90e2c644c3016ab348ae26a662652c953a3c447272e52b007a5").into(), + hex!("a68dcb67d0cb585cf22f753602c46c7ccffff246b106db9c56248ecc5e94a036009bde23864879af62a4ede81d040c56").into(), + hex!("b9725383c63b2a522f4d976ad6be14a35b9e80145e058baa622238500f1a2ffd6869cde87fdb984654b2e57615bde3ee").into(), + hex!("90248e4cf47ec8b00ee874ac98227759a3f7ce4819e44176dd9b1acaa6270d144d3d707a35e0cbdd7ae23b15537a20e2").into(), + hex!("81327abb95401fc2fe0b1c2d27d7d9972811a63e12be0173fe8311678ff1fb097d73fa32cb85f13935e1a4b7fc59113a").into(), + hex!("a31bd2dfc9ddfa9ac748968b532a41a26007b23cda258fdacb3b0abb751cd7ce2eccecab2d5e3781fedfe0d8da027481").into(), + hex!("809b28c11c1abbf53f2dc005d30403937d9826960b24f4de857a9470067add08d49345586d7e58bb1107d232b3b47bbf").into(), + hex!("b0597958b75e64fe5c6e56ef803284b3b7420fd537e5625c75af3aef814a87a5ff01951261c2c7b27e374466658711d8").into(), + hex!("ad8fdb91216db4fa779774324162fd5bd7ff9a999030c42d9f90248bc328221aae315ef8617c9ba623091adaa0556074").into(), + hex!("8668991c8bffca4cbfc06f3429961c595d85803a262105907361758d677920796be70d2cf820f0b1caaef708d924e676").into(), + hex!("ab22ff4c2ec9e683d2d1ecf57f7af9b3aab1cd289e22b1b66f37dc3779e83e35211f7d4919dc3ef0babf876d491e0bff").into(), + hex!("b8696c811af5d3360951d7bcc9ba4e82e17a125501e91ff74b915de28a8cc217c6fb05d90985fea7ee431e519e494d9e").into(), + hex!("845c0bc4769c428fb30e63c8e4631f22e69f934b0e6089431ddda2c232172a4980cdb6f650563992667a0790f1a3870d").into(), + hex!("b4113cfe79b6b198b517ab5d14900a7189ba78b7ef85d04551e18fe1ce6a69564377fb86a0e11627cb794d1f416fbeb1").into(), + hex!("aa6848837b26df24b04198b0b09b77d7b59d26dd3b20f7843352f2436c046e9975af2985e64fbd6267d897e728a9e721").into(), + hex!("861456839cb76a9490dbe055559e3dfe3bcdc41646aa656d8aaabeb4c0e39a1b370a4f0107b78f900614e3fa09b46bb5").into(), + hex!("ad6a8ca9a21b7874f8b115024a7f079f5a1dac3b165267b33a59d1c8de2065bce4552369c930e9a949d0b07110a71452").into(), + hex!("aa83179de1682892257c57774844b040299789430a262c8b44dcbd81f8062deaa731ff4bebab1a815d3148ec719f4cb0").into(), + hex!("895549691861582abd102fc19a4ed269b335010aeef45ae9ae6b0d9c6d26f26c31371086ddeda626e76f7f07dc622fc6").into(), + hex!("a94e590989e81d269b5246f22a9c97b604af58352c70100f8a20454fecf36d19e601dc1201342841ab231dcefc461f2a").into(), + hex!("82541b5b7a392456d1936373396012b086c370e6dde41f6d4409d35373d1586d3c7119f6f0d1e38bce9cae67c97fcdd8").into(), + hex!("8b89fecfe83adce613e75a52e785ffc90847c09ed779ebef4d29048bbac04b58e27311461c25d4e68cc0e6778228b037").into(), + hex!("b3eeb09bc9ace8a62b71747711bbfa308b746c86ca87297cf2a8e768765a86ed1add2e1acd2925cf05537dffd4dbec50").into(), + hex!("a5364dc8221a37d73250f8498d9b6e163babfcb01e1fdef8ae570538e128b562a0ed8b353235159c3781ada8506ada33").into(), + hex!("ad0d54f0f67d0231ca0ab54ae881386b055c169fd7415c12e511e5ddc5d4b1beba0e1a157211996c7ab61f6e94cacd64").into(), + hex!("b4b978f7f9b084c089923e73a593a24d5aa22600c879eb03645a19ffe8b36cb8ae040378a378ebcb4a5b73331a2064e5").into(), + hex!("b3d79038de0c62c667ab4213524679934b33de22111626c258bf8fd8e16134425549dc7e3dee15239c32bcf122f5bbcc").into(), + hex!("af7a243eb665d9b2c37033363b252c42bc2c202c266ee125b5676b6f9f94ee5d46d3e2ca217f107719051de511625dfd").into(), + hex!("9726a0d607674fbde3fa5c346806c4083e092921c303ec86bf5a16e4b760d031a24585ab407b9b1b0692d12276912961").into(), + hex!("85a8eb7ff82937e2ccddf2f049af9d871c653de4d71ab36b198bbc7bfef2e32eb3f22462dd01affbce13813332193262").into(), + hex!("a8889fa7291017a3363a5e14cee8cb24c273be4aeb74c4b0e1e375f70060dbc9ba296b291e154eaa56703b8e3f7e85a3").into(), + hex!("a789cbc52c5468bf404fc1b19651ef6a805d96ab8a8991407e149a68d10d1f67d1d4b380c08f8be1faea8d1b32bb8c1a").into(), + hex!("9535392a86b73ac66ff8ac1ee0549d266a9e25e1db542b077d136d26710282529f34c43dd94ee77aa97c647e0e05356a").into(), + hex!("a1ae9d5fd0ca16021e0a33fa116eb5b94991aae02efc6f116e073def47253fe2d1f2438275f09f204cec0610ad523ff3").into(), + hex!("b5c6c5b37943e99bed4e63c9215bea95fc365a576a9f8f0b9da8d5ceb5f9da881a273f5692b0913a3bb922772923c07e").into(), + hex!("b3b0144fb027e0c7f1a0c4c703cc5e1c09422be38de4e10010c28bfac358a6c834df6794e5007ecc4c8d866ffb9a8725").into(), + hex!("aaea409068fd2cb94a7c6fe031ed47c7c5b366a33905d12a107799aea57a052b9bfbb1c4f88b1b3775d5bef7d6204b73").into(), + hex!("a10cea5af8405d807b66ad492a1aab8618324ec3d9d01181ce29512e38f03bfaf556251dc490b3d1e80576bbecb27dbb").into(), + hex!("b700d4046b0be98b3cdfb8a2eeee52df68bcc1c5550d1c17205664b0d896028bddaf5dd38482645e76f643ad9d2ea9ae").into(), + hex!("ac9163d5f57a2d1def901e74c1b07f4d14b1e9a5c362d3b082c45389ae8add929a1dfb0baf14f64790f86cddbdcaa32d").into(), + hex!("8e3b79b19d49d77844e3401c01984af7211268bdf6609919c9867a83cbbea21870ff108143795a85fbdb2c15a2d127f1").into(), + hex!("b9db73eeeafbeee4edc52c1fcac7de6d8acd22a8d3d1c4cf760a81dfb6cc91ee454385044301fb2253588f23f3a24079").into(), + hex!("b268631698668059d8eb44d50d532c9d8c49953ea2029d6a2d0eaf69713afc85c42d989cdd3bc0a479ad77cbad24fc0a").into(), + hex!("95f74950a24d82ba9a9df5d839d17d7ff830a5dff38663630efad5abe9c58724802d5bef891ca2b3b81923b55a94c6f4").into(), + hex!("969297c612c35347019f5bc80d2887a3c95c8ffbb011f5cefac63a1f51e48dc84d961aed56afc353791589a45c871cfe").into(), + hex!("98743e9521e5fb6a643c086a00423fea51b8ad2e55bbeadf791ede16eae64f9fa45c41101c6cbe4a8e96c692fc57c030").into(), + hex!("9374001ac3a8673e337b078da1b72090bf2450a5f53f6a600f4cd43ea4b5fe86a73d14bd0103b110f23e417dcb4c2e47").into(), + hex!("a91bd42a87f28a6fed7fac68b5306e5382a93fde2bc9aa5c48b747ab774f9c557343cafb46dcd4e93df5aa95ed832410").into(), + hex!("8fcdec0a825737ee2c61401014287079e729a8b8e49337e99b34c25dd9da570a1fefc532a0cf6ce1bec80be2d9ff46e8").into(), + hex!("8197cd84016cb41e4287d29b3a0fe8d221868e5993aef8c15c1578e038f9c43e93bc26dfc67fbef919322178223d0b9e").into(), + hex!("a4607e2b6ff802a4e497c53b206972d35520c78f14f7d4d78514333e90b2a8852603bf223f1c9eee3793008f87cd8fc3").into(), + hex!("a72b6185e451b3be2c140fb3f48225927e7c052805682e3de9b2c826997419084bf1e2034aef0c5d364b0004b3b7807c").into(), + hex!("aa99a2cd46884d2ecae4257c1db8fe1ef6b0cc1a0c25dcefb53540ae91ea7bc8955b8acfc6d96ef47fc3a5733f2f28e0").into(), + hex!("878ea42dbda59fb6f839f0b65eec295f2d543541f4fd576a60d104b94b49b1a1ac6e9a15ed3274e6305de3f35ce1e3a1").into(), + hex!("ab2f77f6036200b4ffd3192b8d06dfdae4eaed4e1105b27e64ae2e120c909095e59f4dbbc44e818afdffc7f9ea1f42be").into(), + hex!("a37e3fd9b1337734cdaf34111762403db11b1aa0324937a17e053242a9099b3db0d396b485ca996f91117c64623915bd").into(), + hex!("97c65c28a6a81690d4d6ff17d5cd3be0e15ab9cafe66e6f7b8da66ead8beec561c3abbc79af52a8986d576363f14cd27").into(), + hex!("ae138b3020373ca238d5dd780862fa28a2c3e05903366cdc0fd7a142db3d18eda63b8d049abed37f1fcb25f6cdedbd67").into(), + hex!("a800bf90b4e7aa7b5b00fbe6b5f45067e0d7ef2b1ed9a626211e07b66b12ddaf90ed05d369f8da13ecfd8cb499f192a1").into(), + hex!("96565fc4ef721f754b6f53db97d32ef5e5c3cc0f55928eba3eb341f4962b815381178763ef05c21c1247124d592b4449").into(), + hex!("b4896f9e2f88c990fab764a4e006f3f39ba6bdd0e1c75fc8dab2973544e052ce63f8c61a6ab213c85f6799d988a6fd61").into(), + hex!("87aa22b60a13edcede78e629d54714436a8d7d1e6e232d4df6047213b4a91e61e5feb38216e0ebb209f1dd8d7e4f5f9d").into(), + hex!("ac4d5e8bb39a2564f3bff053e2058f261209cf14e65f7dc540070d40dad7ec4f5fa81efe6274aeab8691b85a774307c5").into(), + hex!("8b13673c306988222f09ad896a75a6232ef3bfd2f6c37c2d751668466d45511542fe982ca5720c6518891830674e2cfd").into(), + hex!("afeaafa07eaf14f248d2a34e4f86064c5bccd92d3a6c0ace1ae827dd59111e9b3cf2722a270234eb5aa633c12e140354").into(), + hex!("aa31119422a52a7a5ba90f4e0b5676434b4f05289ea3143e8a2162e32b1e19b582a586da796ad9876d0991274f3363a8").into(), + hex!("82c78ac9f2018540eea744c003a76cd7bc8984103e941c680a4a833a7c81defdd28165256890d534aaca2991dfd856b7").into(), + hex!("b4a99846af0ffe14d0f820a574d42571e0186cd078840ebdf0684c806c08eac1d6afb2f7f9f9dbfee19c2ea12af5307a").into(), + hex!("93cd10366714618a7e8d4edf3c93a9bd30a280f765cb93071a279eb5bc4fe8dcff8d91a1efe8fe697d1cb5e760a07fd0").into(), + hex!("b17dd2a8817471efd91b60ee31bb5f7c2848bb40251dafc0e2250cdeec3202cbfc7a8af6d7f5c3300a53a73bb4a11b54").into(), + hex!("b396d11ed53f287ecab591707ec5ecd0c5d34a67854783dbf263fe2614c707a2226231fd8dbd6bb1ca0760f06f2fe7d9").into(), + hex!("9982a0fbdde6ad91f35e64de34183e4e7f7df6cf422912f3dde0cd16394f0f172dc32c4f68f2a09647fed32894471fb6").into(), + hex!("ac5889086fbfd2f2570191b5d92659fd17283509477f442dae81a8491b8641a5f63e275659e6592ebd0e62a8c7a9bdb2").into(), + hex!("8fd6151866cc75461b69b4685ac4efb5a21c10d5b3291617bee4ff300d90fa2290319967faa2b7189c090d3b60994fbf").into(), + hex!("adb4459e4e6410606a74742d6e48f7b84f30ecc8e849b6af9b4b617236dedf1707ec388a97523f18ec7e047743fa7151").into(), + hex!("a9fd9329ea3b6fb77dc577e2c891eb66c61a575ab75a66dcd897f1127e8bd9ad8d3eb9059c7f6a8b08199913b83e5ba7").into(), + hex!("b94cfafbd3ef7673023ea37996084acb3109ffbccd210184aaf8ce8d29bf36390bdbbf2870b0970e66831d28e90b248b").into(), + hex!("922404dd76801113ba23df87ba689e5cb609c94930370576d0d16e99a489de0fb079fb273159b8b07fc58bfe4f787c70").into(), + hex!("8c6005451c02b18458c3f069a521aafb44fab40f4260a60da6b9bb5f920e91990a868aafa4b6b071a899d3bc51fac72e").into(), + hex!("b0cf68badbb39413649b3171281ebfbabbcda1123549a4c6c09dbd4dc0427b51d555056c79f38840c52cf920dfa2c8d5").into(), + hex!("a08a09c8dac1f7bbbff2b7ea96899b64fed53e971569171224e675399467daea6870e48fddcf47179d3c7eab4cfde3ad").into(), + hex!("881c89cfce577898ad367abc2cf5989c647bf8904be5e061e632256b3750b0aedaf4d30c17f994358aecd069b62cff09").into(), + hex!("81674253d6664d414f667b10f6e8edc32af0a67b2b99d3e4657991f8a8b1dbf260447871c1c680d92f99abdf3da2d035").into(), + hex!("92e34adb15141ea58b2b481f9dd69e2584f512531bab13779fe99e18d48b6ab039bb28d9f444d517298e11464ebde4da").into(), + hex!("81ee1554da84a0a487e52c57528b69cd79f1b6530418354095ab976207e368379ae2fe0a4a340d209f13ac9783cd6d5f").into(), + hex!("839c0316ca07242ab52b76f55049f2da3e83f021591b0bba295677d80d4b407f88b0d207f3ecbe7eb85f19eba5d152c2").into(), + hex!("88b0ad748a61db5eb96016d9bf16bb05ffc4cf5ef56569397e9395f454fc1f731b48dcd8b3368163c36a3fb41577286f").into(), + hex!("b94fac438903b1e6cd11135b8fd35b91b61a0354addf8ead5cae4fc853ebb5be68bfb9901d8b4d3bdf58224675b6d675").into(), + hex!("a015eb1a7e1b814625b13c1b1bca7f738e80be5972f3a3a27cd9b21b033f16e4b5934bab69e38a6edb8d03e84e8725ef").into(), + hex!("83ef4eb739353f7679b27d3679551b2a0eb1bd4d372def5c0e8e5922a9ce7138dae4b62d5c147e6439a551d3ebb1e1cd").into(), + hex!("95907a3b288f3d4199434590340293881b94322e82f7fe9c186da3fdad7881b9a92cdcc5fc29d4124b1d05886bc9ec2c").into(), + hex!("868078f74e35b72a894d72f93d45333e423b1aec6d7e3cd7550254ed6a156957d4c5919489a84986f6134be8334bdf4e").into(), + hex!("8f089ffa10d8ff27470b8f6fcff49a69bd06ef3f88faee54a6bc8ea0dca6bb799199bdcd9a9e7686c43302cbadb584a0").into(), + hex!("980f4614de867eed7571cb3100f9566542b90d2b4110806dbad64249944cf3e4e484d03543107fdff0e91634d5193530").into(), + hex!("abab8578ecc6096bf063da248b376bd9e76a8b9364000a98c85813ada835017ffe693f908aa789cf09ca3020f3bbb9b8").into(), + hex!("a2beaf5eb12232e44bd251aaef3e007989794ad1df7a5f41ce1e6d862ff0607db47cacd4b04d684dc22d3640f6b8aa16").into(), + hex!("8f57e3d8d68264b5a07c9fc2399db0dfdd079abac46e1023373c22377612d3b005053e0df490d2435110c9fc2791b8ec").into(), + hex!("af7d2c45de945cb09adeaa1898fe0b026b5a5c5de2ac21f3b2c298d82fe4ae253d859c47f71def164a77b542905bfc73").into(), + hex!("93b026c1b083d82b3bd52d0004985f374acc81f754f7dd4e563a9ca5b20780f7872925a03e48d2154c526723b6d3fa88").into(), + hex!("b8a11c00250f9e148086818aad4dda9d69480b378ef5ca9e2fe85dfbb709d2a919067d9abd2eafdb5202cd334081b5a2").into(), + hex!("a7026b1a57d9d64f2526bc42c771cacf43a718725c2d0dd889b1af12481e3112bb5357e6434b3e83754b067bd5d533f8").into(), + hex!("84771640879d9628fea0ae1106a45bb8a383ca0a9a110093355395968b4d5af9e4a34201024a187d3a31b78a839af6ea").into(), + hex!("b99e5eda7144057e439ae752c2d879345ebba19e83c35785743d6fc1646069b0258ebb1ef62fdd43493498ed08a8de15").into(), + hex!("b2a17e5253f695a61697469df96f3182a62faf0b5d10c150f833543e7b3f5979506a068ddaebf310fe86efaf3adf13e5").into(), + hex!("8ce51f0a8ffbcfdddead1a94f45a42ec4f9e8770c0ca33b58207b8db06f3004c05e88f5b31896e1b7d3c79ff571426b7").into(), + hex!("a775ae2c3c59968d0add4c446c5f20e92f92eebb704016ea45a47c5496945b7d0935b4d8ea315990e6f58ec33d00aa9c").into(), + hex!("93bac2d2038c87f111c8000e721e4637b04ff8c3b7b1e8a9f02cae40e465a1b2928aa226af73ed643a4c21f3fec436f2").into(), + hex!("ae050b3f4784f2c12c902fd1881f6bb940806c0a9d7cceeeafd194dcd49cfa48acb10a09c55ea47b508d5d16702800db").into(), + hex!("a8c6680208271473433781cafde59a4aca2496d58c85f48ebaf447a0c175e784c4a1351d94b5d1a64c78bcf8c84f8f2e").into(), + hex!("8f9f71c20844682e17bfc30d745ee2848bd8782b05572ea64f9b9bdb2c24b3d1953bae317d79e267982c42f3f3aa60f9").into(), + hex!("abc4ec57e1625bcf3c10754a07a2047d359e503b05e2524175b48d5844756ea21f626a65a08f4f7b32cfb0646cc68fc8").into(), + hex!("abaccbb39d4fc4c252997503604764731889f5bd66382c90477df2f2d413f86892f7efdbee0e3a908b3cd69321d3db78").into(), + hex!("906a87855cc2b3765774d3e8c7daa62630fa7ba761ee2a0bfc5594380dc1d9b62740d1190fb882ffaf17c0d869356261").into(), + hex!("afd0ed291ba237f8b626698e3c54b8a84341628a524b897e53aad5231aa01977990c55215a677e9adf4319a98e81bef2").into(), + hex!("89512dacd42d13f5618f1979d9afd93c06247de2e1e9ab6625b5bc9efe24439189a564ea220c4ce2795f059064f5f5d5").into(), + hex!("90238fe2ab6b623ecc990ef8d2849d26229db5f3c8587cf06501e459c7742d81653c7dee45da82f5946e041f129a8df3").into(), + hex!("a420b197f4863782fbd676bdf1808ff1c6f49a506d525952c575c10a32cf63afef22f977d4b7d6258334c498f36e7f95").into(), + hex!("b7d8fe926876d1d01529eb6e30a78db47b6693af3171b2014bd18180066609cca9036e35953ebad7355362fa671d903d").into(), + hex!("a4b7dc0ae7e7d8c8eb65081427f5d41a122bcad56456dbcf4a4e83e188af1e3d80dc7f450766b8e87ed8b28ca6c5c479").into(), + hex!("8d3e1060196b4e8e827052c2ed782aa554540f21690b67d39db46fcf088d10f67f2b6e0d98689e7497e8029bc8f355bc").into(), + hex!("861657c4e2a48891939b49706791a03f63d092643cb491adfefb3cfa7d86ecacccaf86e4a1382444e466a61e29a12bf4").into(), + hex!("92f1c5b122943341854ab7d5c4603e083019344e2252da5664c676ffdd564345d7e28e2a5692dcaadc4371a95ea2a142").into(), + hex!("86100ccc2ee10dedee28a3ffa0bbaccc1ecb19d36a99e6deef1f2373c1c1c3dcb8b8fbec5809304d883c5d60f617d875").into(), + hex!("97c06ca658fe3ec45a6573bde07b3a95d80cff213c9f4eb8933c8dbaf147262291a5ebd55b0e58a4686c4971cdc45671").into(), + hex!("b13e9055709868f723014736b1fde59c05899bbf2aa6d4591d724c35c15ebe6d215e37fcb1e7b8585abab0b2ba309c00").into(), + hex!("8ce0532b968d8d770eb611131978a253e7940ceb627b7364b3a4dd517f26c31bee51c134a5b1297362f6f9b6d714ef33").into(), + hex!("92edce89bea01fdb25da5d0f903de2fee626681cec3db418a9161286a2e95bbb90ef2ccd8dad434b51776f85d982700a").into(), + hex!("aefc7dea295547984ab42a64f2f59ba2ae8220712778a71530623351a44372ddd1018cd8d4951934ae0fa39653ad6aae").into(), + hex!("ab297f28266bd5ed104c1b55088f114592e80aa098a0865e5543e12c6392b0f94b5cd4e0b6f375d1a0d0809d80c1fca0").into(), + ], + aggregate_pubkey: hex!("81a5778df2e724c98b4ef79ff33b9c5fa3ea265de81d49de5c4ab3be2165d32fe15c59c982f758c3b9c522ca5e659fce").into(), + }, + current_sync_committee_branch: vec![ + hex!("1da42c54eb912009030c084b700d2e0031c0a0e5759b0cc593601b99764a725c").into(), + hex!("0c960bd59f4a61104153da676eb38ebae603e9cbb55b0f6677cc1df0d535d60e").into(), + hex!("1682c67e0936255e351f8be6ccbdf048db06a80749aa900bd4265af1c366bd52").into(), + hex!("d95bb6af7d6be07e5d7d27337ab9b54d5bf725ac37671b9483434d22d724bb92").into(), + hex!("3abb1af4e9c3acb052119a42c2d4222d99e8b5b958c520a03526a8177b921cf5").into(), + ], + validators_root: hex!("043db0d9a83813551ee2f33450d23797757d430911a9320530ad8a0eabc43efb").into(), + block_roots_root: hex!("ed6ca045637c1c7dd54fbef547b8b1aa3f5b9fa8f0bfa5df26142a0c4237e617").into(), + block_roots_branch: vec![ + hex!("620abd1a8757614facfd9d2fa43795281bccd4055bc9b12e5cb3742a16a9f9cb").into(), + hex!("14c793be544d5fe1993a1b25d39f4b69e832e914c3d470745276a25d982df4f5").into(), + hex!("46aea5f0a7d66cffbd55e676b915be97cbf3dc6281146cdf4952047214ff74bd").into(), + hex!("0ccefa47e43d03e26def9fa07bacd91a5a2a20c6c5dec2ea090f71f91ac99282").into(), + hex!("f03f3d7a52241ab959560beb9b748a8ab93e2b7221c8070561a12a5fba8d4434").into(), + ], + }) +} + +pub fn make_sync_committee_update() -> Box { + Box::new(Update { + attested_header: BeaconHeader { + slot: 5808573, + proposer_index: 430716, + parent_root: hex!("0be3932fbc9ebdf3220e2195d87653f283d9f999946e53f6a9f6172b6f532779").into(), + state_root: hex!("cdfacee5c92a351843fdc4591ccf16c4f040d0276add8421f08dbd5c71035a1f").into(), + body_root: hex!("3d248ca71ec98250b8dcdeab1207806406f1434c11874655af56925da6bd88da").into(), + }, + sync_aggregate: SyncAggregate{ + sync_committee_bits: hex!("ffabbff6fcdefbebaefffff9e37dfffebff57f7bffe3efbdfef1f7f987751dd176f3b3ff7bfa3fedff5fdf7f7afff7ff777bef5f9f7fe75f97fffe7dfdfffbdf"), + sync_committee_signature: hex!("b405701a0227b7c40805504a66069fb5ef99cdd84f1e295c9b4a4eccbe4d93718740efa9f8eca62f563dbc73021c00e914a69b00a9ebaa906e78f26c1cb8088af916096801c787f18f493b1479fd43f1f5b28d15af827a1e580713fa82bfa1d7").into(), + }, + signature_slot: 5808575, + next_sync_committee_update: Some(NextSyncCommitteeUpdate { + next_sync_committee: SyncCommittee { + pubkeys: [ + hex!("8e9fbd36b3cbaaefc176cf46336592e2b59a51e3035d095da9e1df9d2fb5aac5e47ad05d27784ca675442abb875a6559").into(), + hex!("b4c6164c5ea19f3da5a76a2435db598bb012ea34cc8fb6d749f1588463e5c39d29cb3d45ceae0543372246549b17deaa").into(), + hex!("a89c780da1a713e86b149d63312aa840e865dd926565f0ee9d9627d363eadadf5a4bd5f79d8039f2e2927ed7fa60209f").into(), + hex!("aeff2bd9faa0201abd7dd681ff97888c0ae71d84e71590f424facb2e37b5759f07d338dcbb695ad6ffd08d903c0f92ec").into(), + hex!("b89cfb61a59cdcb61e9f3ed76cb5cf13c907bdf6b2622e16d140743c5021d45cb6d91ee94331130b876efd984575948e").into(), + hex!("a2c889cc5195532bcb5c83d035cd6881b889ffb9d0536843d3fb6f7b1c093a927162add5ab6ca5f06e7c3ec4ca4522e5").into(), + hex!("b5966a6d047ef679a9613114149530facbfc7b4bee6ab23a60853f45de034435b624ad0126ac6c7d6a12b1be93177e0d").into(), + hex!("99249360fc064fc2778b37b107d834eecd5eae29e8f10a45d946f11fe358db065242482935224226e83f518fa6916962").into(), + hex!("8c3548aa879d974c5542e59ea43bb34db91f92c7d21eca5e3e4fb9d01364c21e8e2341eeaba1d22da67f1f455644afe6").into(), + hex!("828b95590a46cdc4756fc1a7b7d7c4031637494938521b74a3740a970ff532b88ffcb5333197088f6700925dcab5c42a").into(), + hex!("ae2e6ae80c16831c02170dd273ff6808e4379a8baf00e707d497eec6cb50b5a1f132eddf053f243765a54695ca35c443").into(), + hex!("a7bfac686f7b307d794fb1740a05cb1a6ef14b06150e64353a0b6544e7b0c5e3a7c8985d257c5bd74e411c0cc8424479").into(), + hex!("b3671a59e2d425ef0ed109932402ff7dfeec72cee39c1840cade48a13f3ff36bd0f9b3931d0651fddd214a2dcaf7bf89").into(), + hex!("b56c962ab20fae058c256e37ba4091d7a9e5d3c602e3eaa2d90df65fd5a11ab68f245a5a6e53262335c6dd4f3e0e51f6").into(), + hex!("a8be83de4b06ebd8c14bce332a1175a4c651fdddd4a58ec85bf4c68cbce83a50dfff8c26070d104556883af678693076").into(), + hex!("b4b33b7013c6af21797478b14b1dc81fb7c5661fa2471d8cb4eeaa62a62f795aa9be2cfb65ff6b957cb7f89487a587af").into(), + hex!("991a42351791da02bf6c1a9ca8248901657d6f2a95225e4827ac3171b5247cd31f9465c9ab1c2b78e268c82b61db1f36").into(), + hex!("88a38e70998cbed82ae7f9c192e06df8abdd35278efb25a1112246d46a3d3f0bddee41f5c492949f15e651ed7fdd6a15").into(), + hex!("87dcb7f13c6af7f7d102c643db0406ac7fb06fbe1fc647f436ea839e75561b27beabdd6133da332383bf22ed4f83fb9f").into(), + hex!("a441e2c51448b6b2ddb38dab213d9ae3d1fe70e91e1feb0f98590b5fb6f3c18ec0adccc221fc44ba027511c52e5fa626").into(), + hex!("ae5f4dc4266016943cbe1db6538619c430639a1179d246cb820adf8edcbe55e9f79471134d06365b0d459b280aa2282c").into(), + hex!("8165bbc59ef3b15f29379a7ef90d8b3610590c662207ea7c49267f36b5b62af3d48008d182ec3384ca7c1063bd25b284").into(), + hex!("8cdc4e6a238afc55406920620fa90f696403afc1797562b424c26e679096950e7f42b8d8327ab0d7573608056364fa4c").into(), + hex!("a1f4c958f7bd1182cd4ef88561eb534c9ea3563d149a276fc256645be0b2e86a3d642ac17261696ada39a04a866973fc").into(), + hex!("b19e5ca1ef1d4fbac5633cd29e9510116bafb3229749e0e4444caf9819fabf9c4c805b5966c02446c1eb0029b3c1293a").into(), + hex!("a4682af7e19328a145a1a5c43ad3e14648b90f664c6139eabe1a13da9b763ef23947dc3ea2054af7d0b7018f7498df51").into(), + hex!("999ae1a8f2e0cad6a0378e7e0a67c8a6ef4a824043b34e67074d05ceee93cb7b49d3c3acc961f1aab69b45f89d12180f").into(), + hex!("94a9f1686e91ec733799b569e3b0313db64f3a219b48482e2a56c21016e800d4373c2f8b876a923e0753a464e5fe4684").into(), + hex!("b4936942d807ad09cbaead9f56ca124617fd1fda2ff5cd94fffbbdf5ff2b295867acd1e41599928ae455d597ea45cfb0").into(), + hex!("a74166db86410c9722e657cdd0f4d1da86a4f83168e2bd9ac71850bbfd9471e1ed88a6476b75ae5ddb42afc62a9ac121").into(), + hex!("a97909c10241e046dc707ff9d822c385dd68be297d6b54c84fbdc18f5a1dbb3350e93496698d6304ad1d6bfd34b4a041").into(), + hex!("b6d9b775129b048a6c577656ac2de15135c2bf1a3c7c8140ce20a990274e42d7b602ebe932855c1d03373797ea0bec63").into(), + hex!("b59f975937cfc8eb510c1da0a7fff1960c46b9235550cd6decb514805439f08b8f18d88ae0373bbf50b028a08612d552").into(), + hex!("8af01facbaefb24cc4c11e13c64445600b1d716be66908964ef79e12c0eded04e1d23295444818f024e55df2aa911034").into(), + hex!("b79607bbe31f159b208a0d1b2f95cc5373631908292126b8b75fc44b22a8bcc9550de7b51ada33e5596d0f17d5f4e48a").into(), + hex!("a1a474a66940bbf6e601b6c6e63103de2d5eb76d7ad3d39dbd74149658a14e31143a9723327a73bf72eaa75dea42c3c8").into(), + hex!("ada18b62cf80098f36921cb0c2f85200fa362721c4673546f8554e2f5fc8639f2ffb2cac68e888af7ead8c660b0db13a").into(), + hex!("9198582e8aebc174dd168c6cf20836a21cbb6baeffacf9f933850d8e0fe0619ac1ebb99fa6fe902c75927531c108ee5f").into(), + hex!("b8a44b23d29cc5ae1f00d5384fd06f31b73ef1a7ffe334b59db668c924aef2cdf60c3070a44a12b52a14ba185198035f").into(), + hex!("a688064e0b3fb3baca87d711b29419a02c06e6a1dd764af31574dd84fe870c8ef614d4c2d42fc9508711dc05fe373776").into(), + hex!("b86c167a1c6738bfef1feb7eef8f553898f69a933876acf675596fc2e39f0a8c83ac37df69dffb669fcba4e3f1caab92").into(), + hex!("a32d52f3e9acea45dfe9ce6c577dea8200e68d6ca39eab5d6fd24c508d2028f533b8b04f1a4fca7965315ee5dc5e2809").into(), + hex!("8ec96bf235d5e9bf36382d79b4bd1be8a8e2b23a9f7f9e02ab6d708e96a1c12fa81eb236f02b0180a0cb9f3c1bc28cc4").into(), + hex!("a0261a76664fe2fcebe1501e18eac7bce32b947db7bccb7b746757ba51cabbc8bb385600a99b248887edeb84f82a6f49").into(), + hex!("a44313f945a1d462376e03fafe6d7a9659dd81046460f45ff8914732ed268b2430ff632aa0d368828c2076144bdc8595").into(), + hex!("a55fbee79559e1fa7b85718306185e3769a92052cceb600283d0236accc6ba2343799c1856609faeb7c685dd504384e5").into(), + hex!("8a3d4ea2eea81742fcbde7a1bea5ffda55c58b5e4618ace17773057932b7216b96ad4a117d9054de18f71b3345a0076d").into(), + hex!("aeaa0984232b1fd5607a1a67051d42df3ffe71363639e5130de243cea84c87554e6597f3f07952b7d40d19b6e18957ad").into(), + hex!("986c868f8f25db957f44a39bc209f1ff8e98e9bff52236b2473b8ba977d0b7e90d146ec86a518a581c5de796290d505d").into(), + hex!("b1cb0755c54e0619c8306636e926930605f15901c01e36822131dde1538b063d0dc485a97534ef1e12f2f0febd1092c5").into(), + hex!("93cf415d4d7ea309b85bfba7ebefc0d1ea91b8e93fa351262d9eb34b728c7a516ef0904cb2b3549db2b3b3f788b147af").into(), + hex!("97359ca81e9fa330f4c0a3b4de96ff45391c2f83247d1f73a6884bd123d34edc66a4d3f29718f5543350204488ee51f3").into(), + hex!("8348c9b229787630ce26a41e7c016adeef5dd3ec1f124081baf9db4ebc1a3f3a37b40d94183ea9eedf9a458a2e65fb41").into(), + hex!("a4c6b13c7dd27497917bc9a4c4a91b953b88c819e147087b125c93657ad082971152d384e8c512f48cfe07a69f54fd95").into(), + hex!("88008b395718646492ab944a9139b95251214c42e90720c703b19b99afc971824bb87c2a4d40202cfbb62bd2ee30c15c").into(), + hex!("946969ae721cdb08dab293a638387dca6045e230cd7c7b7237c75e123355db9b8e444089633d0977dbb6e42a729ab4ea").into(), + hex!("83435817ddeeb242c37d31877a55194f208f4cab406b10a4a0605a54a19745f3517a880dcab8a5a4422c0e19e2ea8a2f").into(), + hex!("94fd0a0f870a6ed2e6a4f53f5dff5b5adc1a6943203da6a34c73694702733c991e146f8c7108ff35d563fb67f55a106b").into(), + hex!("89bc609d5223c73afbca46a8c3cc271990a8bac5191f1ef6a2c88d7984adff00d67bcfcdb3958c259e17d5cba62beb28").into(), + hex!("b39077093900919b51e68f647d11e0f78359be69c405fde5735ce6839f739081437b899f33c6c9e6c86d4bcfed059186").into(), + hex!("a0a6f9f588e336c14b91a9c0c56085830611df85ce6e99d759c72a4dbae500b47dbe736287f6b2d65b448a2a0e6ca237").into(), + hex!("8222a17ad961ad325b819bd0625e079a471e597adb89f2170cb490c40f6b8b1a08b2e23a1abec02011452d589b183702").into(), + hex!("8b77ca7fa195450ab3399f88341a9d323e8b9b7b9b2ca30985d97ebb287e1f9b7e0279f22ab3a2dad682d7906f6c8d59").into(), + hex!("b6b8389382d3336bc5ffdc752bc699a6bb0057dda7879901c7633787a2b412fb7852fc896ce95cd09a9b98c76bef1b1b").into(), + hex!("970a20613047ad84b61ede90efc41a91ef7259a5fa79ba23964ea907fba1fd88d2710b69fe5bcb0d75ed9fb68d02e557").into(), + hex!("8843dcb71117b6044b1c7eccb5010d0a2f93775a98909bf23c1773ac9eb1c0f43aba26dad08ea7823da593c38a30598a").into(), + hex!("b5b147bf651ef9696ed3ebcfc3ce226b2748a4c4e7cbfbf12b3ff5f1f0b2ee1372477e1d7d8aef8d9ce3ec602a63d01d").into(), + hex!("95433edd328aa9223f521daf6d78ab272fb83150bac78ef6639cbc032de8834049d4992af0828946eca69f359987584d").into(), + hex!("b2f4d2154ac750245e966f62b92022a136ed0313964ddf534ff3e9b4456cf58bfe429ac83b718bb38db5a4fbafab23ab").into(), + hex!("b6b1f2a3a99496dab156c6159b8c98990501894b5b0cf200c792bc462263cb0aaac570f5a785aecf367a0531ac2a87e2").into(), + hex!("9985e3ae265653082f068b8ac4c09d10b2543f920a19911cddf18ac53a7f921da86f11836f51f2adfb26c7bf4ad51efe").into(), + hex!("90c31f4985c7481e5939766dd080f6ee01ac7a4fedb9954b9d1fa8fa1cb0e6e7185a1e31d8503542f1d409ed2f550e88").into(), + hex!("830736923cdcbf7de3ae650768482845ed9b45c4dc9928d66481c76ead9b27427a96989389c8583a153851ab957d67a9").into(), + hex!("82312631f5b301fd3ecd8b0a6e83b130b6e997a5a1e6255e883c590efa00b0ac3bee45c15308efe824aa665c8d7a365b").into(), + hex!("b8ed7b3c092f7bb05aca8cc4c2041161426908e8db349cdd2064e95044f9e7649cd569039e0ef0a94e006094113d0e22").into(), + hex!("b1d6e5344b74a67699cda807ad4883369a77d79335cb8eded6e0ad9b64c8661b7ddb47ce4308ff69f947fc173f496ac0").into(), + hex!("922f0a2f84e476e6fc00c196eb913ebfaa6b205fa8ce8c8453330a58956872eb2e4ec0087b398eb51819ea2d0aae6b21").into(), + hex!("8c729483a3d2ea34337d9c6260944da7e2ea8646de66d39617924681189c79672b0ccdb63525cb4635e3cce1d8f72f13").into(), + hex!("a00af936fe87caf17f5b365f59d019f8438a62b8f174510d863da59097986011a9e76319d4125ceb64f1d83defd822c4").into(), + hex!("96d33c3832bf0af5900a20c067bd45dbf3f0ecdc086eb065afea6c44f117eaf9ae8841848578d2915452e61bad014803").into(), + hex!("8a16c15a161a1e898bf06a23f62a9ec042c5b9e875cbd54d62e11be181647cf09e6a0bc65fd62017ae150525c16ee746").into(), + hex!("b4a0443c452085bb77b5790be42005178dec8f9085e2f1b963d55de6978cb608b7ebb42e4a84f24350c768c2e78d22c4").into(), + hex!("9168aa07b4e29c67723f4b87a025fbe6876f13c69505520b4dd6b387f16530a886bfae5e5304539564debabc059589fc").into(), + hex!("9504db9c5ece4ac0b703ccf751503665746bd580f11106df3c8a903ae7a5c9b0520dd16c89671967e2aa12775af4f67a").into(), + hex!("a776127d4e2e46c7dee8559ac56b266e7eaaa26eb8db0a7f4df0c66fa1564a349f414c9091d1e4c3e7ba96938916c769").into(), + hex!("a85785ed5832dfa8c9a5dd9d20523591f04536712c19a38c2c1496ce9c8787cf37964d739f83d9979db5574ed524d557").into(), + hex!("a4ba9a3312c2c253394891714719d2cb369eea993353b07f9a6efe3ecbd245f08d69f3e1302d6ee312e743c05ae85cf0").into(), + hex!("8329604134885c08173b14b7c68b74ceceb3694a0a3f7997f566ba94bb3fb2ad3f78ab3d02c496858bfc95655f072e7f").into(), + hex!("8e3f5485c98cc317653375ceb44636054a3202045bea6e9f6faac128e115de7a658a49a6432858db7b4b14fccbb93f7c").into(), + hex!("a706c82514d19152bc4097f8602f792a4917f5cb409c42dd42a5e4f2ebd1bec8318019934ed6d19cb43123293bf4ec98").into(), + hex!("ae14d5f32cb99bf3eb0d844157f12b836963be0d6f91b776f973a66701924c1ad9c3496540db4292580e6be871486486").into(), + hex!("a45ee325452d4bb2c60ef5be60b7d601158ca1cfeef0734727562b94ef8f72190005567e2007e8940f8cc538838f1147").into(), + hex!("b8f1fcdabf33ba011c86487a082b19fb146de932a469b19518cda2ac046c319059382cb8ab3715f8025573ab53c5cdd6").into(), + hex!("a613f3dd6c8361893be08f816c640cdea4d57d3207704774eeea8818edf102cba7ff7b06c4c5d0fcf0873b09f72d1ef4").into(), + hex!("aaeab877b1d16a4db6e47a8a864e073c4742e0a84e46ae8dea1a0eed0d2cc9f23adce9e0c8d88464ec0c059df99a9583").into(), + hex!("8fed26ca2cc519a44ae38398d856c3f75d1ea6cd02dd36dab004188f3ef2167cd67d279580f37176dd70c1a0ab08d72c").into(), + hex!("ae18905c02f96e110f40d3bd99ab26bf28e0af939c6945966fd5e3ff440e54bcee56d667a0a21d8326f88e5c22e42506").into(), + hex!("97d803614adb6571f4ea11833d0d9ca8221e7fc99a960c637d4990a72727ed2713da874bf156dbaa70bd4c2f668681fa").into(), + hex!("aa86c3bf79ebf46e1cee54f517b7bdced4c7a96d3ab27405e7d68dba92ee6fc7fc91a107f3cca85096f0d2581cb4039e").into(), + hex!("b75cdcde1702b5bd6be180dc8ea26e5534da77b1c7bf711c8447a565a63d073474f0270d78dcec78ecf5baaea1f75d1b").into(), + hex!("a36e810e50d283e8ef625cf684c1fd333a0373e5b0a9d81ba40cabb76299af93c536285c5d7239e86ec56905245ed2b8").into(), + hex!("a16b6b41e5c31901f3c0fc2a7dd8c084fb508947314c4bf4b6fb338d95ff2cf49fdc5de1d6b9acddb1b096b835df6ad0").into(), + hex!("8b580da99256b1d0d7a90dc46a98ce5132fb3928d416f2df5ed1769544692482ec8f2ad5f57871041d8c78d00c949a0f").into(), + hex!("945dc91cffe575f06b4b01fdcd580da57403469a21db6ffaa77ae06d31b8a2aa9957e26db1bf89554611f51f10c8f73e").into(), + hex!("8c55c4000195fd1155ea608f586a327cccd1221036ffd29eb9903f8f28009083203f18480b35cf82e0390a5ffef4bfb9").into(), + hex!("87cec982094c85f6c1e402b74b52f7c0495ab4a2d3f2309734aa0bd2bfdbc88b8bdd9556664015c7d9fe2f138dd7c807").into(), + hex!("8fc576e4f9057d82e2fd2270a787c596bce5fedbdb9f6d612c2caeb1a778450d8c1f6e86dd011a45f3fe7f201e520438").into(), + hex!("a43eb1acf0de695d478a661a71128ce9c58923e3adfb62728a2e9f185c9f46877db645398546a300b75f2c849f5ab14c").into(), + hex!("b57be020fd23d3fcd6057997099fdd648dae32cb750e8d058b62a5e902ee5ca27771d762020cba2985884ffcfded3500").into(), + hex!("ad3ad1089c8232280e9fa2f6c314ae57758cfbc3a0663ad9517e35b74b19e49345e03d1d33d0d7b69d736501ec5b3f4e").into(), + hex!("aed7faac2e65c10b52d7b3009eef010a624c7f57a5c76c55afd310345707bc8959ad619101b9c1ee4bde44152697c537").into(), + hex!("a6b177c7f945cde42c5389f7258689aefe1b6ee0b243f9901c6e60ef1bebbea9bc297689cda0c93aac9b28c7d70d0022").into(), + hex!("b079f925c29da333461adc949ff4daf19d0500f516d95e3a4c3dc2e2f5ce26ba0f08b2473c03b6974146b239532deade").into(), + hex!("8c573c73d603c8ed73ac3eedacd8ffef4c18425699e30d46be2dbbeb3590380b0fb713daf3ff3cf7544da502dcf35cfe").into(), + hex!("a39331c8acd40377f020611ac9f3a758832e0a644a5cca318c01e654696fc607e299b744c0cc2ecee2bca755c9aa3581").into(), + hex!("8e71e261664d5a6094ee912fa7e3e866ebb5c4c610062fb5fd733359d0e5a5d806a3370155ec3b04e83cf7a2d7c4a0d0").into(), + hex!("ab048af1200dfb67b4fb6bc8bbcd8344547e57942f7397c06988c9c42cce53784a0282fc13bc878635a3317b8f306a81").into(), + hex!("b32fc2da89d3a3541a61338e6b0c5a7f477a23bbb9a7c63b1087f36c49b6d9a42d4720708af496d82c56e1e6836f5cb4").into(), + hex!("97d0e8f961033e4aaf96a75f585d16eca691dd05f4a5477e8d3a0fd97d02555d67b29d314b5d150dc0de3b72810338fa").into(), + hex!("8223bb67c99eda58237a765c8fb426871a1a9e02e6e91d956b16e57b8dbc30c0edeb76abb30ecb2f4139a19922a4c62a").into(), + hex!("8d9ec5c0575500e433a4bc66d196d404b8619ea38b0dcaa036e1c1453eb23c6949509243531ce59318c22db6e33ee1ef").into(), + hex!("933ac0e3e6acc7a238fb5495835a591db77c39e27f4034dfaea20bce7c072ff6bb6f59a9823a07a76a431905afa2dbbc").into(), + hex!("99f3cab4e8005fdb6bb44900a4f166ef0c2c48dad85c0a127c4d854bca4ad32a2954a586734ee0e57f3317e5b81923cc").into(), + hex!("8f01dc4011ea394a9f7a73b7f246bb00472632fe715314525f1db2cc6158b22dad22d1371e7d0b2d5e72cc408f07cb25").into(), + hex!("96e702adba7420e819338f6f8740946289bca6f24a5f14a5bdc727d1cd66bb7d2a573cdec8ef1333ca39685c33f6e7b0").into(), + hex!("890ab24865a2652a8fb96ced381530192d072cad275c19539cd74e03c001321216a0999ba83c8f3a162bed003dcbaae1").into(), + hex!("96e2f1ed5f78c0b018cb388447bb85b33da331a5a306ce4e216d1070beb7c3900f979ef128e85180c56958c0d729ecdc").into(), + hex!("8ef642d5a1fa4b32fd69f7f57886d1d9447ddd9a8425a03f15633cd688e41054d5243ad6f352a5a3fea2be2f3cb7bede").into(), + hex!("84a3177be656623fe280f91e2acddba52c068cf8a37bd79b9b4186ef199bad65f52cf3e47b581f1964c9987f088fabd2").into(), + hex!("8b913725eb48feaaed46b2e3ddc0cc414aeb433dfa584155e2eaf29020f6f1fa0e801b85bee4bd28831b5cc66944f411").into(), + hex!("88d802c75d422a713c19a600cfc9cd843ca41e35722e21a0614c3195ea84752337ee30991d860fa75a57ce3f614e0a50").into(), + hex!("b43cf4b09d02b20073903bf152f569a43864095622a472656d8a96efebfe3a20dca86871268ffc528a194bd951662d71").into(), + hex!("ac1c65ef79ad0e56184bcdf0680dde5547bd01b95d7e9c3c71671c71683709cdf7fb988440c3bfcb847c26f198b94f81").into(), + hex!("abebe453b3f2430a9287d0d5fc043f7ee434b33feac6b7dab58d5deed7568e0730d59f94b1883e3d43f3c2934d3f40c8").into(), + hex!("84e0acddddd0c202eaabfca7cbf88774ae374e841899942a2353064f132c6205ee378277b2703744a8bea9bc16449537").into(), + hex!("a69865f8a3f66ff4e548ce29a212041bcacdc85410b8467f0515842062b3204fb1b7616e45fb5f46a5619808fb390dbb").into(), + hex!("a55b426b402e9b27fadf87b27cabe5375c6941b22597dea75586eb9dcb699d925db77250b1d755512aefbd4eab0a2e4d").into(), + hex!("8047da13f072c9e848d33a0f397ecf3e783e7dd507ded7a4de25327fe89c183c8dd1da3d419b48f53d93537bc2c1a8e3").into(), + hex!("94a9345e464b9b28798c608115438f1eaaa60a56abad028729dddea3c856f7f871031b4f100626f8bb7a06d88f7cc6c8").into(), + hex!("aac8cc93a4bf5b383080738021fc56cf732988622fe0d493540545b19a6a54cdfe9f8cd2d2dcbd572bdde0d1f8cbb101").into(), + hex!("80f24fae3c8d202e8072092342f8b046dc9edfa1234c86e9f06cdd7fd2a1dc0f81ad69886a8c219f53a94b9a75cf6b78").into(), + hex!("88ac9c1d5c036f14566203d8e18421cdd21b2305cbd20f9857e4edd09e002ba0bb5c89b039cba417b353c6f2f63c50de").into(), + hex!("a45c8ac231d0ddca06f1bf03eeed331e9b524ecafa74642e4c4591cead603d4228cbb0701af58770100964fc880ff85f").into(), + hex!("88767dcda5fc82e5ee515639992868790ad56d2a4fdf1bd1ba1c5be51b381c149fc9db23b93488b54adc89fd4c48dcf9").into(), + hex!("b23e34136c22ac73157c7c5cc8a9491b0b5bc968c95a9c104b402cad9de598e323ada4cc527555157cbecadf48faf87e").into(), + hex!("99910638bfe8b9974a1bb7efed279de750deb046bc21a9655da4ea81a1aa807f2b76aa2a64d773b1b23af283ba3878f0").into(), + hex!("a05869387ea3b4c8f7403d85ec788499a993482538e0e2078d016f00d67571d1342187ae088c788dea518bdf295da88d").into(), + hex!("a7dd1735f178d53908e29db85ba6166640da8c8bc6f717e0da9bf74c547bb98a512266cf737937201cbf6d14bd9420ca").into(), + hex!("87f5b096a1263b51df28417fb423604879b18c4d0a8a48630f70e0f95226bd51a252d8be362df801680344330857fb5c").into(), + hex!("b1a5a549e27b8256c388465be3017dd123a7d257fdb49b2bb409c6430b6056cb8125bf88b5f196bc9e02567a6728c7e8").into(), + hex!("b70862d190351d6bec9c618057e407b43864a0dcf860b31ab6617f75e1ea02de49ff338a45af53783cbf10400c878a32").into(), + hex!("b27a654ece8541b9bf9c6ae0047969ebb69c4687a43030b1c412991dfaf349e2d3caeb6b7ae3d72ff0e2d758a04510fc").into(), + hex!("81368aaa4489c992a6ef3b55df26ece993958df2e40f04a95ca514fda56c2fb98f11d61faedd31860b89e89eab965f0d").into(), + hex!("94e14e03de977732b7c7faa60ec8180e77233a43d513a37c443be4fa0bac64308d6a1929de075b5d51efaa9bbd6855f7").into(), + hex!("b2e26d7b979f93e8dd55eea5a0f4985bb254128963a939ca07fbc33bf83ad7796e9426660b2f35088d7aa5fa0cda2ec2").into(), + hex!("850aee846e93c5204c1906a2782da71c0ff9e2d1962a778dac77561846e6f9290ab10daf72f189df0a57c1548bd4e6cb").into(), + hex!("aabcd7f870c299cabe4dad1857b3b6cc3b9fde2b525e9d8ec0fc1f497cd199108971173e61cdd5937c45758cbf7b9403").into(), + hex!("ac069d7ff2633fc73bb0b7607d9c27305a4e15c189c8da396d6685798c12ef179bb44cffeeb7435667fb03a799eee5cc").into(), + hex!("99e3eb82b955b2411d1b81d946e5ef6b9c6957ae0e368f4a9c279a0541c3a46e289fbff526a1f9db4aa21b92d13bc9e9").into(), + hex!("b5bc3dd1e05a66a1d775ae0ad159df19c7188f2c73a8553525855ab34617c7f080e217732003e09b29a5b36b12ba564e").into(), + hex!("aa631a69aa4a9c14de2c49fde83453633d17bb258a2b7ada723bc8e71ef22c617ebdf8ba64c72675440b35d419d0f836").into(), + hex!("8f42bb48587cafbb3936adc495e82981d7fd81d8c0233a4e4d44f9df72f8439a9a0228d6cf9d156ea608caffab8d9eaa").into(), + hex!("94e079215b8d187d546f33d5384673215ee65c70d3bd0778f67c11665af5fb025b4302518a0db6266996c136ee90d4e8").into(), + hex!("b3dcb504b50dc58ee7f2e2f78ca884d5fc081b570d1177b884c92bd34272ececf2a9319cb1cfb9df011d4db3ad266e42").into(), + hex!("a5e5b55940e379e6c0fe7c6ac9ab86f3836f261942e3933087f1e1deecd280af9afd95d1bfb384976d5947d5069531e9").into(), + hex!("b1a36c3a0a79836817a2890ac53c6768ed3965bf5d1663e2df69b1bba60910e84dcd4f917991812b305367786edfa288").into(), + hex!("a8d07cbfbbf31d113b80d3a1f82ec7c29c4d78007efb66b5592255acebbd8e1b0c8b927a866c79211d5d4994648153ca").into(), + hex!("acad1228fd1ffbc118ada45a27f33ea02a09455d0c295510da693d741ca3b5725af41b99967ea6d429f604736a4fac81").into(), + hex!("b201ad414928e315aa00dc60b89c7a15464d5e97c30b551a462d02c35e327d2ef3244a98a402f9e055a2f9af6e970733").into(), + hex!("861689f35fb72780dc0be92c140dec07857290495baf3137bd2e83ace2f268f205ffc58edfb0e09f323ea5f14d0ce10d").into(), + hex!("89138730c80c30dea01abfebbed79bbe6016b4924193d9c2e8bfaeef30616bcd92f0eb24d5345bfb005bcfea989fd8d3").into(), + hex!("b78092afc3f16397d2eaeb5bdd7fc6c01ef516a71102124febc0cb443f4446c18037ae75c7c1d0c8177454b092922ace").into(), + hex!("a739cb664cdefe7a2f38333fff13bacaca129d718a043fae1a1b7c4251a77319b44589429dcb9ad113f24e11d3b75024").into(), + hex!("879996d4bed3d3235c0f73ac8f3f612eecb6aef6756896920e0229f5deb1d91feff95734e6b4143ba89badb5cc1f0cf2").into(), + hex!("a213d854a0496d74526b3c37a48d6f610452b44202424a419acf206df1cf76f7357ff5c0899e45adb565535bb09c29c1").into(), + hex!("8afa04d66a3e8a2759ff088395cd98597883b3ca6d8811703f5fc74b822ce4e56e1dddeea2c099fb3e0f6648f990f1e9").into(), + hex!("8a2e7ca192972af2b77660b07aa612811fff94c951532e3fb6829e8031355363f4aeed0f9e02b845f00cc9ad4b744c4c").into(), + hex!("8f0757fa7ab1eabf429802c3811caad65833e763029c3aaaa43ce921abeb277d7dfd06e0e58d36e494871ab9bb090668").into(), + hex!("91c0c0b0564fd95db51c73637fad622e6769206bfa03e41474a4e68369d10de7da5d1bd2b5d226f0564cc1ee8c3e9074").into(), + hex!("82b35466d835a6f13080628ce407cfe495cbeee26a5168de9e595a122ae3757f2eb0a64a71ff1ef6ef26c8cc97ec1f52").into(), + hex!("80d11c7a711fd2dbfedc76fe018fca09295d5a3146df92496ba01063e5e098198cd9c52d3802e6cd033f64b3c651b67e").into(), + hex!("8607de2cda6838c70f262dadb21409649900c27a5bf3505ce2166ef6f616f4b7119aa3e3f3c62c1a508662d7d68e8f0e").into(), + hex!("a1c14cbb653115b6225f53e3e6ef8e25f87cf47315b25dea5e658493121ca22733d3fd2781920dfa3a04271d58970749").into(), + hex!("aa876cfb3d572bc1f84a5579dfe8df82a9177b441492382e8ef6528e28e46ce59fce9a82d42c1c2000b28cff06596d18").into(), + hex!("8742ee128452ee98f21360f903c0a57e600d622d4ac793f32d6732f5fc315f757bac89b0f39a4ddcf4b8668cd02f3e78").into(), + hex!("a2e04418db55c0d9163a1bc242e6d43230a943ead121bf8a5f50c109e4ecf0fd99e5b126a4fe2ae9b0a248e613b54f7e").into(), + hex!("841b7c0ab57c2cfb1a180a9b0a2875a7675624f0e5c779f01f3f92a1ea547cd1164485f54bc433d71c7b054a6fdfff15").into(), + hex!("9855f3506dabfea5a133ad49557c3c9e1c7b6965215cd940bce4bfa90e98d9c62999feb29da0af8768b99f5f82c64489").into(), + hex!("a65939fb29f1d913e36be1f877c8b9a3549ec17313c4354b1834cf7ca9ae220af26a72cdfdbc59567bcd7e4152d90930").into(), + hex!("b64edc36e0bcd48cb350350fce955609ae51f5bd197cb7d42b04a2ec7f8dbf236b2a3b23a6e0778d57796433f0e6e9df").into(), + hex!("9379a72a722c1a5c8399acf72ebadb7ab1c5a2e18137cd3850b211dfef907850399b6151ae7bdb590a6eb04387ce0c31").into(), + hex!("b621023f0d3c731f49a48378c3709a0c051fa1e3f8788d27169a76dc35d46cd6095b32d7e91794c35f4af8d75f950411").into(), + hex!("a82421a53687a444a065ff1e11c439cb7342a3edf496f2ccc04f56fc6630bcd79ccce1437479a6e7d6dce918d3d45181").into(), + hex!("857fb59242e6687e940fc114df3c06af5a89d85c762140b1e4b0f8cbcae9d604f435377d7a2d153a65e0dec099e3e8f3").into(), + hex!("95e6a571cbd7c7a58c1c599cb4c837c9f31757a6ee4ed6740e9d55c350baa847ce6d081023b43b397a3798c6843baf13").into(), + hex!("adc1e1f8523fc6e3d683dc0ca15ebdbf471de635f25fa7be6fde9907bd3fad130baafd7d21b43fa04738d4c19448d788").into(), + hex!("85f8ff5b661f9e529421f7e5f831db1919ba3170a59673546db695c3af8a82cb1ca352e07e6c801ef9fe6f501d5896ad").into(), + hex!("937b374871e35266c2815e4d0ad72dc2b6c756e840ec36fdb90a71ecdd4afe13f6064ef36b9d1590a39a7be2156fd728").into(), + hex!("ad4aa9b451187905652222dedfe6135111ce4eeebcca74ecc74f3464a07831754eb0072abfb96adc23d0c5c33a1d9f16").into(), + hex!("815bc7c9c7c84396bd0de5c71b78f2be5fddbbca3f600f341a21533ae6dcfef8bb94f4340ec2a90f40ab091efe4cc6e7").into(), + hex!("90bef1fc273005610cd79161686b25d88ed2ff2abe18f16a4054fa05dbcbaa339825616c117f55ab26d12bdf2e414f70").into(), + hex!("b96e51c2d2bd0fd78c4d3b9873d217eb76642c329a9ef293010fcadb45ef2f9ee3a9c34b0365e344d33c464c08a0f51c").into(), + hex!("94c4048c3fe7dfe736458ee16566027290f93b1f052c3cfaf28f5c33c32af6b9cc960d86181d54361dcc10aca9f81a58").into(), + hex!("aeaad402961126722aa5033c6bc7735d4cddf35ededaa08073ab1a8412e5d1d06e95c58c7a95409edf1566ae904d795d").into(), + hex!("93d019b814d00d5eb6e7545e6480da089fa48ba34f0a961c704db12e34a144818c306cdc4f31320e542c75eb0f1ca96a").into(), + hex!("a3c21f7864512c38a58f02c0c83993ce6294329b074b801404e4f941d21e4e7e5eaeccd41da8ac423c967b7230b2a505").into(), + hex!("80c26a2aff26da9d8d739496b5a63da6d8d35544c71b7b05b41ce4cbda89e6d32e85fb1e38a215aa01dc64cb43e089e0").into(), + hex!("8c5e66d7668ab7e0de06ebab4a4ffd13f24e4458610e64a972a1e1f15356f6e745cf36b8cde658d03817f2749616fe84").into(), + hex!("a1260c9a6727d6d4a4c147e0c7ba91c5e2a47b5a08a07a3ba0eaf9b50360b6919495b4aca5f85e8fb2e4ef1c307286c2").into(), + hex!("9150fbf49242afc6ab7f865d4a92e7013eabab432b341710232e0fd971eb2b214a3da5b82617a8b7defacbe060538ea6").into(), + hex!("ab44ddafebcba5a0fc1002f3bedf595f3245ae07c9184d640154968e4993d85087efa8a173a670d07eba1c00d3ed1c5f").into(), + hex!("91580bd78343a09b62e31bdef63dfa9e0c874d7b39eb8a4300388ab053f262e118f790392f73d4fcf7714b521690d94a").into(), + hex!("ad4b8eb477ff8e573a911a1a4c1ba027088828cde7907e193ccc4b853aea74c66d19ea99c3779f6ce4d505ad83f2174e").into(), + hex!("a5791ba6dd8534607100f405b2f104c987336d5c47a544ed571d0babc6dd88a634296773faacfc3fdc13a5f7ab0f0cc6").into(), + hex!("ada0d1c948bd8f66442cb4b9cdc3a5368ab6c585cd8be766b468864a8fbd60535e454943731d4121ca134743d05221d8").into(), + hex!("a83556f376d8cc4a26b53223b11426da96bdad5351c2fd451ea053346b334eafef9773e3486928b9d407d3e13d5dcdd0").into(), + hex!("83be01b65302a31c5ba09c8329f683904943cc8017cc8975272d7d284b6a15a3313e27887e4de9110f64445581747ec9").into(), + hex!("8acd831b27588a99743c5d4f61e6f0610faa530d6259f187aeade29f1c9d5956f1c01a5faed8be8924fe1e8d9de03571").into(), + hex!("b17e88d1fc760f3d6633f5b48411b7237e276e2fca621d3db4619da62993bdeb3c12cfe7d130a92e4d3a14693d1b87eb").into(), + hex!("b769850bf9b77a1958d5eb932f99807cb695eedafd476d99131e3d7340cb845a33cb2cc7b640a0f3b14901b506802ff8").into(), + hex!("89e7eb7cc852326b6e18cf5c720c4e44c474d254de9e912d22510aa4cc1952b5e5c40b46a4907be375b89bd57d9f1152").into(), + hex!("af7ec9a4b836709701fb497f69dbcd0d94bf986fb6894f48c67014bc8b0ca947da71722d87de0371923f5bf2ec82ec64").into(), + hex!("8d3ff45719a7fc5254e91c710d956a16b8e8435fc4c8f68d1a47672335246bba9627d7058510d25417b7eed5ece5c110").into(), + hex!("a99a7b987f7050c230ab1adfa50a30b4f3782cd31467ff9c2a749182a1974a36a6a375ed5b0909d1e627b32ce0245ef5").into(), + hex!("a0bea35f339b54d82e345204fd4b75d41af3bd08d33b223211e496ef7fcdd8e327dc5a9ecb6fcb7de134b3eaa43d30f5").into(), + hex!("9419df6b2bd022fb6c79566f932c37828ca7a5a1a9efb64f470d7ec06e0d6b0b0147cba88814581a0773c80cf3d21033").into(), + hex!("948b0cd553cafa57de03279b83fa4f28cdbd0ec4e2219e25fad53c9d3d28c619ede568ad6e095a155d117caadfa87551").into(), + hex!("b21383b264f67c8c66011a79e20a4d739d1f8fc258562e6351eb1e1c5b83e42090f1525886ff4b65875868ae17a8faa1").into(), + hex!("aca93939c30eeac8fc83c82ff6ba3549ff38121115a60b7fc94b7d64e1f36f65e932bd8f3bbf2bcba986c9309861fcfa").into(), + hex!("a728507043b7e86c0bf19cbd81a45e1ac98d2edcea4c7faa3381df13f6352232b711b03829e3eddb7770213866dde7ff").into(), + hex!("ae0bafa42eece82975171e94b14e7063a09bbcd44cea6b7da4b820cd5d984be4c00a2e9e5137b0d34603e1ac914f889b").into(), + hex!("b63cf4b55c4a62c50c356cc2721ae5a89244ba9aef2c9f5c93762837fb14197479435f593947c8943ac77e6a2ade0208").into(), + hex!("acb5cdbe2cc7c44ad3980f9ba74b0a97f36add3fbb4e9b513c62157c14812aa73fac68be8c30170c39d1aee626f5a1b8").into(), + hex!("b14ddfe1c42321feb8ffd76ac041814f3d690fc16ff47b23ffcc247e8722d50ae001b6df4e1af6cd7c67c8799c8a1907").into(), + hex!("abe60d6024a9d6874df7e59b4bbd7e1e55da22adba1d16320fbfa2b68e8db995997ce6f81f8809e96c40f548ba005787").into(), + hex!("a23307e2ee6d96561452294a9265cf0eb1d6f86b30c7ec48066cbbe889eb7f0d64819225293496db709a1fd60dde7e5f").into(), + hex!("8bbd00e149a9fd5eaca24581821c3dca114e008c3e92a36db536944f6b5e5e983628f155c2319cba9a8a2a26d3885add").into(), + hex!("954fcbe0655b82bfc15679237d98c3759a49ffd0eb7f5da1827711814b92e0a4be2c0b7a96fc16ee3e31099c993ce6ef").into(), + hex!("a9bb0a14061ab4de136605e94899a41c3585ed190b2a97f529e911f02ff389652049616b408aaaea81d38f08a8f6c533").into(), + hex!("b58fa12cd0b69ac2e5c50b543bb15abcc3a0c96cc9cebfff34c4f7dc83bb5ece69d881348860385456eb6198ecc640ad").into(), + hex!("b73597c5ffd3a812e8a553bd3ad2216282fe7c1203120624b86cacb8a7421ea6807e29fac3383cfd61d632db8e3af5d8").into(), + hex!("ad153b873be0eaa71ad3b0191067874e085164f8428b89c7d2e01af0802169a9afa1775ca0f9491350db9e6c7c6581e9").into(), + hex!("8a7fcbfc564fd1af76df52ac5802a7342aff25d745307d2b9cf29c4470273686d9877b4588754af0e1bbbbe0310c3fdb").into(), + hex!("84553c8b77c7e5c81bfb1413cfcda7f8fd95c78c011c19189784be6a5e7352248b3b30cf5c80d9262de6c35ae6d4f1a5").into(), + hex!("8866da76cc8ca6522c3d41c950ea7fd67d448e1d567ecfd0cb916912d597b754807f7489f5e3bea7b4110cc8088ded24").into(), + hex!("84adaf9a79d5c3bc8dc7e669ccc5d4964254d0fc32bc535e54c5e4a4f45aa3c409c11eadd4fb21f4c831329087adef06").into(), + hex!("a77ce1ee4f8feed6ffa0c5cb8fb7fe0f95a03117e746b56b5e8178d27a1582804e84a86aac1cbab53aadffd9f84c0bd4").into(), + hex!("863321bf40995482cff032854ad5017bd885baaa6ec4ef47ab6bc713640b1e258eb40797ba049fe677937e3ff7a2ba2b").into(), + hex!("a46fb6fad471bb923cc38748253f887b53153ccad475240bf7244c1f9f568ade931b0522911348d64460021639bd831a").into(), + hex!("86604e383195be9c40ab728db426af87698d0e34157edaecc357544037d66d40e558cbfef7b005f8db3c9faf541f2c6d").into(), + hex!("abb7d323687c1d0ecfe89d411d9a81d05d009b84e652af437cee40e89bd2657641cbacf28120fe93deb0a1d3b410fbd4").into(), + hex!("a8d2488d99e04b79057739e6e0522b38a0f68a21bc190696c38d96f0e58a9395e3b9011e54d2cf7e8fd0b380e753f2ea").into(), + hex!("a36fd6a64f64f40ece0babcca8926dfc005cb1d90e4adcaa9c01ff3bff8d73cc0f95bdcb4f09d7e3b5d761ad5c3c065a").into(), + hex!("9699c0c5b1695416470c302f3097e93b94004f42369be26afdf04aad49bed67851d50f14c44efc0a90e311ecb27b3387").into(), + hex!("929e6ba1338579c1cbe76f1b075c0fd9725adfa97ab8b821aeee75133a874426414fbfb5cde7f7f8b74fbd8b27bbf7db").into(), + hex!("ae874a087a61c3ba4bdc2a582cdeace6d321f81683636440943dd860c783344d4133196197a108f6f473bb1e75c597ae").into(), + hex!("95bb2da076a9fc25e96affc7e4adf71496dd5802d7443cb5a77e3d52ef544aaf939c0884169df547000b3afc55cc208d").into(), + hex!("b0b63d1993f601c8aa96448183ff560f291903e649192e2e34e796bb66a31f9d0edd0f03ba4f1d299fcfb1e931abbf39").into(), + hex!("84cc92f8897d0bc0efee72d62ec3a8c07b7c72e00913860623982bba412307c2c42069ed90dd996bc56ffd0573b607f4").into(), + hex!("8ae9804b99addebafd3672785d4402a583c97821087589b7a129961b6131fb18c2fa60d606cef4f636b6cbe46b5d6415").into(), + hex!("8f4c85506e99d383b103217077c70571ad8b9046d039174df6d9f1902f8b85143754969bcec37519a1340c79046f1c32").into(), + hex!("81a5a0214a381d72657e1142a781fa8db0d849e1e012babe4c912a1edebc5dbfc265bc7fbfdf8b6ccbefb55eb0fcbf86").into(), + hex!("82c0e11c9016d95501a97e551b8b926fa317f02fb6764cdf0981796e6e23cbf13e48d46bacc875681900fe8c1741cd27").into(), + hex!("a00912f7bf9abb33f1624dbeb5a960ed32addb4d6bbf9770b6d82d514eabdc339f751e41c8f4461e560141b53f086f8c").into(), + hex!("8d905bcf245556e52587f92957459a41b9974b5d8b8d2baf2d8a98edcac2a77fc8b1eb70024e1e28d5c7a190d9f2a77c").into(), + hex!("b8e19d883289d97b0174cebb92d12a8c6ab16e4a8f0db9d7b67ccb9bdf97f070352e6b24c2decd89e7894099445d8b96").into(), + hex!("89cee93ceec6e742aff71ff60085f04e9550ef5568012b4ef0aceec9928c677f9711ea553499db812bf80eb5df021396").into(), + hex!("89d58564c0215295070329974e51e528ee4d9cb197b089755a86451098bc2f347be8be5b0cc06240315f75222ba2e9a7").into(), + hex!("a312cf33dd49ba6488ee13200193f06a5801407a15fc79956f977586a27a4b2d4cebf0da22f6c1100ce2a0d08730a383").into(), + hex!("acb541c487eb8fb4034ca6208f542c5adec863f1346dfd50fcc0ba1c6866e43f0071c8cbdd62ce6a2498e16e80855fff").into(), + hex!("98022eb774377f49b90f41439cc6703fa152d1d38c0e0c78eed49cbc54670369cb2b7acbbc37dac6617e57e527e41b83").into(), + hex!("8f00d44e73473d7b96a686d1d3b0848095d0514b70128c22ccc4141219dc3f5d2ddc3345cc506ce0e747ba358289bcc6").into(), + hex!("911e37896367a3e8603eaf995480bbb62229a3758a608c4822410e46de45a1048ee6f67c2039aba9fc95281ba5476623").into(), + hex!("80a349a605d2968fbe362e40672b33eface969c975ef75a8fe82ee7ace1d0b5034b7af8667650e813876a8a7484414c8").into(), + hex!("8b00779d873c6976d8b01afc94734fcf943c1819ab1c46e512e0c43469cd08b93158caea1cde84d13a48f27407048748").into(), + hex!("99030a66c4afac7e3753abb669cdf576cf96e21b1d698135148ba133e2d8fe97b4875d770e6246597461958224f653c7").into(), + hex!("8766f592d757c09f617090eb8f226016073a992990e16fd64a705c0c3104b202d36de18ccadcdb3dac5d68afc2495b4c").into(), + hex!("961cce69a7a39c20500c96332d2ce4cdeb3d844082edd527fd1694cf499b30bd33f06da66047d3849b49f4c2ccc8bcf3").into(), + hex!("8bd5dee639c3ef32712931295cc5bd0a8820192aafd35d1f1f9a24130bf208b7cc3f2ae99d6fce02dcac4c8225564d5f").into(), + hex!("a89ba310a62330e7396ae361da7a74a596e4a8be02496c8f4b3c860ac5c3cacdfcf4790d00b2ffa75fa900db2bdb15fe").into(), + hex!("89bebf6f59151404989f282a567c378f2f5a04d85225e23e22e0963da27673f3c7e8990dfb526a1133a988811cd03f45").into(), + hex!("81e9ec6ed189c12ca8d4fe32e21c60834d7938f739545c7dd76303ce347b69beba9eb14ab780c00cfe3804c5756417ba").into(), + hex!("8bbbd7b584948e34852a26d18b9dbb46f2974fb68bc8317ba5a168094a74bbe2304e1dc438777ccf92117831f7986c84").into(), + hex!("8ffbf94991bddefde2bf0ccb115b00d7b19a6a448f093816b9db0c65a43a27519a52ac7b88e6e37a7f33d384d42b05e7").into(), + hex!("b62267be83a54451ace1b8e2b54994990d2e1d619e040c2075cf1906c25089dcbc08ed8c2f2f8f62953b822f163324fd").into(), + hex!("af6d55c342e0e7f0bc3ec547ebb4688a884b59410aca90ad6d8730b4fd3543952fe2476e2db871618d12901fbbd2b91b").into(), + hex!("9027b69f6e5d550acb459f8b4b9e3f05cf291c104594cd244b224eeb8cac419800ebfd5255d87e0dde31bba662e20134").into(), + hex!("8bd160918bfd8049878826f443fa416fe32bd018262b1b4802e015ffb0049197c34d730c5ecba951a93986cca1e23825").into(), + hex!("b82f2bf2bea66697c4b5ed6d340ba74bbe0dce84b2d23904270f3500507318ccca0dbc967a69c4379bd12766708dcbd8").into(), + hex!("b4d00a38be54fe5ba5984af648c9092b133f21b22e56ea106442421c03c26d282b81d31ef8d22ebf92c0c26f86d27512").into(), + hex!("857d95d8aab25f91e7cbe0ea70a3159723566192c1d6dc0e68c2b19565a865a0daeceb4b1c733f75b0dc9cbfe246d870").into(), + hex!("b222a1f3f2d05912987902a861796f43cde8124f7dc398170beb76b6434e7095a8e2d5de54b2692490cb0c325cef8956").into(), + hex!("b016f69dc65c3e72e77d43334863db2c364f3697c552d4bc0730f45cc32fab5f60a5dc0f9f2f6df409fe3e2ba3f2f3a2").into(), + hex!("931b966d70e048570c463bfe7ce7decaea3ad80d0540ca079ddb10958398ea27df85de2fb2b7c238d0763d6293d34b4c").into(), + hex!("aaa3cacaf65a90a6a8e8fcbb98b673160e5f410b28b08a8733444cd71de9e807e00b146ae35fff05160a786eba6793c7").into(), + hex!("8effa24ae2c3cc12aef32e737faf7985c03e2ccd984cdf740f31aac7a93ac295be7fafa3a4d47812d9e0fa5bc2b3472c").into(), + hex!("ae8f1044330885e22c376ba50926ca10177799628b1c3f6b731113126ace5faa7756ca80fda0c535ddc77d051632266e").into(), + hex!("8a6613706dce5417736438d9bc779e29646a0b12fb1c5b5e118aeffbe72d37ce71ef78d3da4f2cc8c1f3bb47f8721cd8").into(), + hex!("8a435b4d265a01f7de575ee8893105de8be608a370c2f1870b7b097bf3635abbdfaf164ac1c704a6c9b31d7baf48028a").into(), + hex!("ab842c0851dc81e247a42806ff83a2e23b86147d884cfc828cbd1f3abc7fee929657bb49a2910975be746f97d0bb7c7b").into(), + hex!("81966af3ed4bba12f6895bcc1e2d4af8a0b313f45446f4f2e966494460f77015d2c9e65eaf396653f8f55e50413e7986").into(), + hex!("b61357419b1d65649e79ccef51d68d1e7c746d77c7f32692b6ff315d9dacefdee2a527816ac3118e5c80e00212725c87").into(), + hex!("b3a0c1e36006ab666e4d4e98c78df5630abcc76e86b3c13c342efbb64c2f669d12a98e797429871c12a7171f7a751422").into(), + hex!("93601527015bc30178505d37cea121f19145e366be178e42c9ea7380ae34053c45938a3b4d8ef852ff8701764bf74a52").into(), + hex!("998a446e7b4dbd7a7a2055f437859dd3ddb44c52d3dad9250f085d797c821ed91a17dd13d00f532c5f0f2321c5b3eb9e").into(), + hex!("af35c5f4bb11a87ee3f626007cacfee4ca892851459cb9cb2e127e92c9c274f9082c905165758976f9c7bbaeb984acf6").into(), + hex!("a0df73b065667fa0f6a4894aba39b3e4aac620fb1a8a3be96c94423231917c3a7d75f04383b40cd802909d9cf018b0d1").into(), + hex!("85c9c5a5302b706af5af436c07d1a1a952ee1cf4a0cccf002f514473fcf85d05bc4c23b5da2d6d0b5d0aa503f7e41a65").into(), + hex!("abd1ffa853de61d8b26e6eb6c7eba5636967c155233a6d73fdddd361379ec51a74c242715b6ad0033a6343157aee7ebb").into(), + hex!("ae45b130af61f3e76012da75b19d46a786e0c21ca7c6b5bde193b2203d6d8b7b8afad25a198e8c920c69954d3d6bdc14").into(), + hex!("93729120899ef573f6f276a1ba861a400a35efff7a2074400bb6b5df818e3fc1f353cd5a8e4ce122a2bbd8f5b30126dc").into(), + hex!("b34615b2cf8912c51c02264008e0cd78b79c87b87d56db810d899490bc438d446f734ca958c7c291aff68e3211ec8c5c").into(), + hex!("a1ca372d158fd7eee15091582c6c1b9ac9854959677ee25e5786a94cf8c1d15b64f0019aef20331d9675e1f1ce41fd6c").into(), + hex!("a4bd66cf90f38233b579b8698f5655f077bdb1d626e1d36ceebc67cf7ab8ee8e129cbdc307895bf0fb6e34a4aeeffc68").into(), + hex!("ae06f6db3a3ea3a21193f6c6231db42d18fa3aa06a8295741bab35589dcb1d51256838dca01356d580e8c423c45ddbe9").into(), + hex!("b70b5f0cf21cb98c70996a9eb6e4b3562732505299149bbebef821477ff406dba3979a2526b9969213b9ba75e35de3f8").into(), + hex!("95cf5980f21a58f4604ffb99c8651752f724faacaa216f8c7cbe400774deda53f26aaa15fc6415e936f52ce13cec6ecb").into(), + hex!("933c0e5bbb358f5f83cf9e60c67ea8fdcc0b7a203fe5b07131e3bd69295c507880a1e542ab2a6a8d182866f7c6b14a8e").into(), + hex!("a8baa60ce583afcf85e4756dbb0a4871b330ee70f7872c3e36ac4d43f2587fbbdfa2a13162ceb7efdf897bb96fd2d97f").into(), + hex!("a127b3828c422ff51a067d482fb67074d45fd0a86bea5066c7f6dfa83f4b82b4584646518e898ff725cf5de055c6b236").into(), + hex!("871ef5a7f50e5ae528eb16bc30ceb64b97d111896d34fb4a65c93c8d0498eb7032033eb663f7b169a8af4b96e7acbe21").into(), + hex!("80d0bb10037029f0d8f8c9b9b46f0d0ff32b2198af44a4f84c8c0ace60f2b39f8f8d284308769c6075e9425d6229905b").into(), + hex!("b882ecbb78c758c951fe53b434af25b594e602dd783787f09ed077b79f7dd7851fed769a1593f5a5b938ea2171987d3c").into(), + hex!("ad41cb47b16077f73cbbc157527a17c936efa78a59d1f36e3c0dad67cd19fdc60cb772556018029611aa46643084f024").into(), + hex!("82ad3ad7a706ec19b39b0c8cf75d061ea3a1966dab04643f5b9d711e6651b45f0cd22ce5048cb51e4e118b305bdf231b").into(), + hex!("8286a4970b8db361abd04e5d197849dd335b7074f9c3fb91dfd19b7f43d2a3ae9e114b0cb6342463986d32d262c34d79").into(), + hex!("a844f14ffc4c99989a6c666dcdcc135c2fda96914220b1c565215d5c2c3102f5413b7edf9b25882a02a19aa78c2bc545").into(), + hex!("8e758f3b03fab7f5d0993e78674efe3f9cc211e268c12d23911fc01ae7a4c8f879a393e3fcde0c05c10106a59b59ab72").into(), + hex!("a973caa021aca6f0470460b84df9324ed894a441435a53c4f0c48fed4359242ee71fb3a0e4cf438839ed838f37e5c02e").into(), + hex!("ae17c713f10747282798487f02d25d2d8e7459ed436d90a895617afb9299ee81994ed68ef87ecdc0660b7565c323f0e8").into(), + hex!("978e68aa5f44daf9cfb9220147ff509ffde89d121d08d982a0fabae9f07cb3145c2312ad200f2f0dc051820fc54d07c0").into(), + hex!("844e58a9e35ce1005fd5785f56fdc9b3f7e8e073f48fa40da19a5e9e84aca00b8743c5407920cb554e926873092015c8").into(), + hex!("b296da231b6ca9d5535432c81f7d0c20a71cbd32d357740d1543e1e3910ea5d32b005938f9273af96e401637180f4606").into(), + hex!("8aee25d881e7ba99fa6aa2fc65ebd44aa498d31ecffc595ac8cab010f6cfdaca308f56e616ae51d7e2c2e15864eda0bc").into(), + hex!("a04298e32052d7f91096285c73d67cfb3f3f5463abb3d7caf3108d8d77aedf9896c359986ae598bf9602dc90e6eb3178").into(), + hex!("8c336e463dd98ecccefc55fa366ac70a2fcaf60acba2f2171490642a6f616a1c6b72601bfc3533a5f49ba02dd1e39fa1").into(), + hex!("b00b383ef5d68f0939c0538c7564614401283c6923dab4db4c72a05a88e05bb576ac374eda61c024345227bf45161e05").into(), + hex!("9273a1a6c9cbbc8d5a46498b7658f6125e955cbf19f0461d1372ea9de200688e4f7376b23b132b41cfd672fb42ec48b1").into(), + hex!("a7f04c0377207a6bb5d96e2e6cb9f7696d5dba2acc3dcd6021ecdb3d121a558999b2b3d92497f72f28f39a551b2fbfcb").into(), + hex!("8d530cf98af85dbd0bb7b1f2fdc24d499b19a941ef431bc7f37ca9328a4f6ceb0660eb87edbb1a5d868d3141fe6c51f5").into(), + hex!("ae88acd7fddf35c72c3ad1c507f8dc185546d8acdd92d70f00991f50afd67809167ad3171c7e45976456fca033f0a95b").into(), + hex!("8df71ffbc265a4bf475ac7ebdd5eba137f4c3b585075ea8957757661b3f11e7a92888094e85c8863ed53d91df45e37a7").into(), + hex!("917737cb24287f30c899dd88853ee3b9be54ea707ef38f1545ef9e436865be1399fd2de4d2c04e3fa5b4a3205f4305ac").into(), + hex!("837e57594b1b71fd9f25f27967b721df500e3d7c72f22e90f4315e10fabbef027ec1db0dd9863b817071fe3c9413a5af").into(), + hex!("94b9c2155509b2189883d2237cd37c9ed19c3a22203e9e2b045184aed072e406e93eb7b5c3fbfb85eeca4c5e630e4ed7").into(), + hex!("b022c75923080450ffe5ecb8e01972785628ec2027b6bf3dc2b09c92ba8ba55222965767c21a240705ed5af6e9d92695").into(), + hex!("b993e15339e28a472b3c98bec723ddeb7728822571ef1fb1c2a1607a4023f37d663b615c7855426170d9ad8f6a971617").into(), + hex!("b34db4df6a97056021b088c53cfa7cedc8e585f907a67d1ee8412a50d84e5e3d347011fb99d5d71b111c88f5efd44610").into(), + hex!("b582bbdd7e0d2ccabe94e6d193d1b8dcad1932d1e96ae8e1a295cc05b381646f682f1f66cb90ddcfcd7735b335ea0242").into(), + hex!("b289c068f7c988a69173d347361047211c302abfafbac1d87259388b5197274f5ee90d56228093a42eec32039e490868").into(), + hex!("88e84114e8e536051ef5197ad181f96ce13fcd5627f18964bf4bb2f461c6638033ba363800326e494e43aeee94c62125").into(), + hex!("80d16c3e8717274533ff3b764984479b3bc709f11ef5129644dfcbb5d8bdedc7a8cb2e539a4524bb0fd4d977ffd25fb0").into(), + hex!("9405d059e30017152eca6d6d86366a7a5570501d78c3869d638a2b8a0bdc8c5bce9f0b46764e78680e2fd41697af9d52").into(), + hex!("ae23483a1d25f8b9a5adea9527560cce5552994b3964ffde2fdda0ce7b6156e1d76e698d7314b0820976776baee37b63").into(), + hex!("8d8395fa4ff7ad0ae3be3d3c446cab058890cf7a07d0a2825e22396cc938cf2d7a986745be5e3c1758c5ca0dc29c0ea3").into(), + hex!("8c5899cfb437a72d99085d8abf54eeb345d7da59ef93978b0cd9207853dc491451939f4b1a7bf317c87504ce949713b2").into(), + hex!("816ca0740bce43365bb20e41c3d0c88cad587e4c743b2c0cac9dc966aa8de220da347d65392a9b750a2001499027e3c5").into(), + hex!("b3d23c55cec1d18bedd276d1454f93ad28c72d921dd6600d8102710770f52b79ee8cf445f6781c2ca095c9a25d41489f").into(), + hex!("95d541d6196c1221dfa5ff213dc3e658649a3cd4afc8e738631fc7b6914bf0dca74f41cf382fab364dcb0d2d6ed489ae").into(), + hex!("a1ab2fd361b973027f6ee6a9f8f2c081cb5d7199d69e36c280c7f9c3e99b1cfc994ad7f68ac0cd78c61bb419251fa14e").into(), + hex!("ad36ebc0cf82369457b665dfb2f8444fd2add0b49658cef2c800ab0297bade2c0249bb124f3d321536933128c1149c92").into(), + hex!("8f917e000d7688a0f508777b8db7c0ace39677c4458d7e50d8c9dc59d32faba4abdedfce3af26cf3d04c020e526ab597").into(), + hex!("aa994238e432c51896efdfa240f75fe40f1b1a7b624ff0aba66a35f827b9bf1197de3cdc0bbd9d0147304061ced0325f").into(), + hex!("943da065ec673dd41351270747e40c1f5a8dbd7ba259c501349ed754ffb91c56747a78c392cb4b78a796d748044798d7").into(), + hex!("b0c45ed1457710daa48edf2e61ba59988a8257ddf902318c6bb00be7a4ad8235b46180f7353d9f0c0f747a4cf219d1fc").into(), + hex!("81b56da0943d2940fc8041a51c74dd03f6dcd8a705ef2ec3b685395e313224861f29de31205d45e944e437179f19398d").into(), + hex!("aadd5eb1be98f3fc7e93925e46062353576ef2ee81421fe3f6850701728b8f74637d66cbcd344364565b0893d8bdcc9f").into(), + hex!("a5dd3dc1e172c899f4ed17fbdb842bea7d7f3f0d6b284af9749e25acbfbb2f9c1afb1848490bb22da9ddfeef30232323").into(), + hex!("84ba149e940db1663271eb16e920442bfeb035fc601a7389f85c78ce7bf27b13b5c1a5625d8b45dbbf199caf2d753bf9").into(), + hex!("b5634eb31a68f45a2aa17e8eae7752d8a58673fcc9efad34118b0f3db7415edfdc27166e6d809406da0bd26a0ae1371c").into(), + hex!("a2ad4aa94a40f1c159c7588ebdd77b80edbcfd95e867ec6991f711d39b4dc911cfb6da6075db23bc090218976e9ffa38").into(), + hex!("8de6002f3e789b014254b32161b5595257eb01ace67a8cd9657235e2d04f7ffce6ae0d059488bd9dc070c32b5b7b3fb3").into(), + hex!("a5f659b41f35fe6a9f43d1f72c803da876ee4aa5b879fbe5d5e93be38dcd5f10716122d83afd003b79b8120d83358884").into(), + hex!("a64e6b71dc6ab9eeb17d50e1d2516c5ae63680b50a6077fd870780aebffca70a8b7f8627e23731b79b3866813a20af0d").into(), + hex!("b0003260e70f86eeba286d3d9f6d73bf15f084e7240d9aeee38a1173ea5c47fd9a9637384204001873732e6a407edadf").into(), + hex!("8d4df6703cc9f1d0760c67ae6b20928ffeb6b13d67bc406b8a534ecb07d6ef415a106ed992b50267677f7d114f9d69c3").into(), + hex!("8cb982f382ac327918387c16c73de1ec5ff979923f1110b9660836ddc2f5f742aaf970700f7b27fb2fdacb126d341353").into(), + hex!("b6988aa5e4043e278c01c83a9774175b1188bc2d78b96817a7fb406f86aa4395b7eb666267e819a5a0615803f840171c").into(), + hex!("b69c70007de643e3fbaf7b557bcaaacb67288ef6ff616c9c89dee0cedd33a76396a90cb44207225568870c7c5601438c").into(), + hex!("971102768c0dba73925cfff2053b1cd8fa88f5c21aeba2cf3a78ac853818bb4a85cff714134879e5c7d7c7994cff20a7").into(), + hex!("b00b8d49b1f1fc0e792e257b0c3c33ab554fe231aaa6366f5aac11ff35051ae23cd2a5c6b9eecb3ad00e840c78d6a587").into(), + hex!("a34bf3b6d9659f1a89e40e3b35afe741a670a3a9305278a52d479535f4b5973b23b10ccdfa194cb2937f150beca3535f").into(), + hex!("a84c4fd757d86613a4bfe72cc9d7864c2c236b9463e365441360686e19f7f772ebb6c07a24c680462ffb1f3939c870d9").into(), + hex!("b3c34a2470e32395bd9c8789905166ba77b7b7d27cb504b8647dfb4fa6d65884afb2f120d83afd876b4a00cb104347a5").into(), + hex!("b9d18f57a669686eb8ec08555972e54505b7d487dfea7105afc76333138d5f934b9b5f9a3a7896481782fad5328bdbda").into(), + hex!("a23f65babfef6a2442833441200291028ebf56031d7154a4d7d0fa18acd4b7bd78dc34b85924c3073eb5be7733ac10f5").into(), + hex!("80948f3e12ffccd88605cd4d67abb83014c35d8d1a3254f6c546aa7197f810cdd06eb49b99f424187df218c8e8d7254e").into(), + hex!("b24ac23a86e23a16f4f04ed683ebaa51ccc6d2d038674e36d00a14fb71d46c433373a8a0bb75a0afd3c2f9605dd4867f").into(), + hex!("b002aef96f1702f4e3c92b00aa2976b57b77ed97a4d64619c6db676b286c6e633eca63fb232cec0d533a803660c20147").into(), + hex!("9867492f550c1f12276a201717bb4c420bffe904d55008655f929368b664e0293c1dabe9b5a5a71ad884a12686c1d9de").into(), + hex!("96b702733a7ef38b23e45999a04bacebe414a01bb41792cd9aff566fc23610d02e069c85c6fd4173846a40657a958e78").into(), + hex!("8e588db21f84245d034d7427055996f109133b9b3aa095472b879bd180052657da20a48513c1f625c339be90a64878e8").into(), + hex!("b6821bb1a130460ed1936d34cc189980d8fae8c5debc5149d47e90aad69ed3b143a3a00de5959e21ada73a06b3e8c9d1").into(), + hex!("a751ae06c6d699b5593f5928910e1ef3634dedd460ccd3f23d74f5f61a3950392aa66149ae366c048c6c7ece968c2d9c").into(), + hex!("86835cbe686b81fe7e096af5ac8c24f7cfffe2ce2b993626a606e42f6356c0d7c3d4ea19d110aa1a7b7f7ec5e68808f1").into(), + hex!("93719cea4911ce7e436f7b3ea77b9cfb83a1db903cb38f1de3b04d0a69a0f06bbc4f9acd3b313d46113009a917dd5996").into(), + hex!("b0d240c09c137a742d77edf11a7257030ef8b1a785b810de104fb24b22535cf0d62bc54f544b027d532f16b43a2df7e9").into(), + hex!("9376f46ab931f5c58b1be49c529ace24fade089af1af43b339721321a273169c5bb668250b2c2b0aa16aa522e6675bdd").into(), + hex!("82636e68d0d59d20dafd7486176b62ca2d5dd0275c8fff552fbb974565ef2406ff56cff5c43a5b9e383e0b09737de446").into(), + hex!("8f300fd7f29640aeb759d09735f9ac36d1035248c35ff38a165d2d931058268a055971b4fd4dd9d467960180cd255dba").into(), + hex!("a7d5f4e2b01dccd9cd7cbf566b5ab604efdaf9b682bb4ecae1b7801c2f93425350620e91ec807b0a110971c316e68cc1").into(), + hex!("8952700221cb45e3ab933ec20978d9c9c7b873784299b86d0c2d9998bb6b1d1efc1ee3bcd00c5148b2fd9473838ce067").into(), + hex!("b787e77d194e4dfb89968f4e289e97195c2674adba0a3e7d5582cefacdedf93a0e5f27d9d144aab68aaba878fd640414").into(), + hex!("8466c67bed3fbc30e46639de92c422f06bc80df658340a47299ad7798cae412c976fa6ae6bc0a32ce655b93b08cbeaf5").into(), + hex!("ab5d78cf76e16fcfc0491886fc1c95a492ccc67fd31060eb183b89bf59ed6e2d349324f9734c504e74c360272a22f369").into(), + hex!("a4f9f8539f9f89dc5a2c8296af591277c2d308275234729dee23e35e3d541919d1aa9a260780899615e2a895ad8fe703").into(), + hex!("94ed2cf23c5d28497b506515597ab71120f4ca42f7ebc5a4e87b798353eb70590923eaaf163bc550bf312bd6bb2c0b05").into(), + hex!("a78f064aa69402af33f1c9c1bcf04634384ad8528aaf8d28ce1d1a04804bdf93a8b49baddd6870eedf642e566d091af7").into(), + hex!("86796909d2dd3010e8d46c3d99a3c0efcbd4e986e581ef5be4c7810ed8b92268bbdac1dbf1b24d6805df6642f53f0b58").into(), + hex!("a6b555b50ec3b60e9768f407b84c5fd8a055150c17f78f2d5a3b0daa13f2c692e5041184bfc8919280c230c57adc9ddd").into(), + hex!("b4f9b0a0242ded4dc0a4903f16d270f21f2e15668b3abd45f79e1b465bf50074d232f905c6de6f2727a0a9ef039f7681").into(), + hex!("930b7dd8666a35358c6a0a42c600dbe8ad5d9682dfc641474fbd8fba90ddaac7d3ed5f5395f297dd571051ac2d603333").into(), + hex!("abba3bdcee368688a8e53d56627b915148fcab59717174fe8136c85bc24e8d15046da09b31c0c7c9a5bac1016bbfafb5").into(), + hex!("ac199e71110e15ebfb3e58b8ac14f1de8ebd3e0894f273f84783ef3fa4fd16ce6bfa5d41421e884e258fe8e2dce68075").into(), + hex!("a53eaed94fe550c07375ff5ed9706d69563bdba724a4022cf7c639737c97683f036400dcb87268184a9877eb116bd479").into(), + hex!("86e8269c1b368228438de5aa4065ab9d2888de7599b00d5382ebba8fb0600cf357de27e20edaa50127e213c7f6be1f6f").into(), + hex!("8f8d9b9b03b178d370a9e918dd54264f83c4ed20824be79427cbc973a9acf3d74637e5c35080192bb67e64390299c19a").into(), + hex!("a230cbc17aa669c2a9b02e736d20519d93a6fa1b6ed452e065fa78a0fb4b3a0f55fcbc5e719db6417353ef0798f70b43").into(), + hex!("b4e28c30e57cd33fdeb257cee66389365f4a1b9847f94e8b0552c65adff5719e51d50ec8bba36a71ec24641ce4fc6338").into(), + hex!("91799f066e16f9a07a419d3e425c959052f8ad1aee0e2f613d3b023829fb1946c81b16e8b733ed03ca924d03481bafcb").into(), + hex!("8ad935420f026b166233ad387c58857eafdd2fcd4efe55ce1bce9ffd668b8997555927fcec88b04de795129a10263d1e").into(), + hex!("a098f20bf1ae2510f1955c586c7115a29c64bd22a086a2f2a7ff5e08349bf24086504a1e5e1fa82b3aa73a097bcd948f").into(), + hex!("909a3d2e7bb5538bd89c446aa53f1f05a1ec17c88d793a310866cdda6e5d836d53fbb80afbf8baa8aa49db3836c912e8").into(), + hex!("89e64879667f34f1127cfacbd9a3337fa28c0227bac5c5ac907d6ad9c3a853472f4f7cf093e3b735968229398bc7c94b").into(), + hex!("b6ea32c4d640f9b7de841575a00003c1b25d0a845eb54b065129c271790bf602cc39761316c4e9dfc1644ae3ff4b05e1").into(), + hex!("80ef23a1cf6f50f96d5b4645bc79ed4c958f1394da9e5cda0cdaca3815ac8435a8d3a690ed19665b7cd1bef8bf7b0366").into(), + hex!("8b7346d1f30de7e50e3d3b32b441ba5681335d25ae6025623e1469466addc5515415a29ecfed987e07bd6a85ec1eabbc").into(), + hex!("99277ae52f7f2f193549739a704aa2f756c2ddff68b9848040ccacc675fa12d62c9fc1318daecba514089537a4e7b83a").into(), + hex!("94d392e29a3a1b8ce63c52288fdcd3f95f80bdd2a600626e2ce3517162e69b9c0eb36bae6786701ba12e23a33b8f90b4").into(), + hex!("8f270be40047911a4cd5997668bd6d62c90780882451c544ea4bdebe061a9e61bafa1d8bb8af62e0ce4fd73611a7f34d").into(), + hex!("a841f7229fd0490a853523edbd12a5dc6772bd607afd0516c582a813a10fd74d19f480d02b3e7b7b6256896620905976").into(), + hex!("aaf65a2e4e6a3d903ccb51a063d64688590a3ae54c7df3c5e8820d88533a6f10b81b130ab476c9f16c660a81f66dd3bf").into(), + hex!("b3683ebb70696339844ccac03925ec85c8dc06959608527a1744c23a67a805e71b5a91610fc6fbe0f667d054b4087e37").into(), + hex!("b042a5614245184e5a4620cd3a67c51811fcc0a0dff63ac06dc8030f01d8343ff0bd39ab3cdc3c09e4f3c1503ed35e62").into(), + hex!("8a343ff96dfae2c2e62558db3cc424b3c055e2cf84b53f63bf49c95d98ad0b372517df7afdb189007b7db725a3fbd567").into(), + hex!("a3a81a2b37160a371ceee3d07194a70e58041a3e6f75f47c4d8e2c619cae3f44b2de5703e3b80fbae9778e284927170a").into(), + hex!("b9554f94b7c611c2b3f63df5ac0f920d1eaff7b424bc8e857b94c354aa1d3c02a4348510099750e0af3e16dcd0f9a245").into(), + hex!("8678aae32f5bfb9dc249a39eb5d0638bd45d48d2b5b7be32b5e1c2be7b8d29d7198a15e2c24fa7813f060309f2493843").into(), + hex!("85f020a228f8952986c979028dbf2c2e8e59191970ea5e4cff6e6bb46251138d9edd90a211ccd53fd395db8addfb6d71").into(), + hex!("8b0801e8ea30467063d68caa5d3315809b3f21c7429f256fc2a10f7e173f0e1d1bbcf59e025b9e44238a53ef1b8318d9").into(), + hex!("a4d3fbad305853d8057c09bb10fdea9234ff90d51ad0c21342248895d77ead5a8c104c554e6008677e396b55d4efdea5").into(), + hex!("a7f12f870c5a3e2332f10cc2db7dc26ce58a94ff60ebc28f3ae06e820e6514d80c5133563225011213e53f51f748413e").into(), + hex!("a94ed25fba32b4302fff40e2c55e06b6fa4b9820635beb0b43df61010ab5cdaf944199bc73c4827214ae1f57bd75e70a").into(), + hex!("8607e973bc67d217ea67104eb538fcaabdcefcaa7da981ae0322916f7a74229b47f18820458823e7ef160f69f5363dbe").into(), + hex!("a83206fcc995ca57583c5952bef2027503308472bd712c536050217a391bf0fa9617d956ff6c913c2566cbc515cb291a").into(), + hex!("b9110bd697c294a0905503490d17d5536ac1782514bcbdd6f67e8fbb75c0922b39cb7f742d28cbf5356e4f1885b060c2").into(), + hex!("96e1d2b723a458f6b8cd4a8b2a83f33fc7931901cac1fe2169ffbf7c1ac8b4d8547165af3dc61c2b37ab88d3e81f940b").into(), + hex!("92cddef13af28962b7e281d5c0552ee5135b7a401944c9ab31d617b072cf00365e24dd87f86f6618b202d51c25f63fd6").into(), + hex!("a751e27a646ac1f3c828cb88585aeae6899d0940252973329b0589b05714bdc1cd271bf745d482f670f4ccbcd9a60d98").into(), + hex!("861fc00a2edf468353c6012a89ab7cddeaf964ee387e5eac48037eddc536df3d097c69a689f09bdad189384719d50e0e").into(), + hex!("a7dda298ac153aaa6a59785ed7b6900362b1220588a29b44764cc45834859bba0f5b9f8f17bba97fb49fa2c7ed4eb65f").into(), + hex!("a6b679d47e1ea1469e5dc14e1eba97ba2a0f2cec0a9a0983ca086f917298c93af45de60765aa2cb3759ed62c9eb5e4dc").into(), + hex!("b95b1f4472f8f69ee010d36db46c268c59cbd13864c63ce9e6a4755ad00c2db04c951e312b88060e8411018cf655e76a").into(), + hex!("935883b9eca730ef868329a67fe99ed5363b0384e7e6f97147d4c80a76d9b2d8ae6783e80d103149a8a3fbfd51f9f6be").into(), + hex!("ace980d1e3c76dcf78bbb87f3ca9bd0bba7897fcf9e24b27e00fa22855b1b4ac224137361ef6817c94fcc81fc3d3a3de").into(), + hex!("a614b6f113d74d4dd6dea66125b11195212031fd7d3da825b24739e5107cae653fb89c34527b399c43340064a9744a6e").into(), + hex!("83c27783856f9af7491ec9fd34be730600afa59484cae9d3981685cadb869dbd05555a07b93db7d0f361c9ae8e0bfe73").into(), + hex!("850f1389e21bec1c8785d17316a09af9355d32b75d02d9ad72791cfc5a411595a367ba9eb641c5b7acd6be1ee21579ea").into(), + hex!("b810405c7415c49bce0f7893aecde90da33b71684668877c5d6cdbe82161f9cd7eaa2d68597140e39fff8b9cd67424e5").into(), + hex!("a5923930d34526d70e083f4633de4766f04df901ca3adba4a462d03423b609d9813b78a2fcaa2d770a5abc27c260c39e").into(), + hex!("a6ec439bff50a4bef8d0cd47c52e92cf00846ca3fe97cf88e5b6d7800ea22d0ebcac49d9ecd123d4c156642f8bb4389f").into(), + hex!("97b7d3fbd11886976291a24e9e7d6f4974345e06024121eaf57097057c103b6f548d1f523416cd6b465e8109aa0be911").into(), + hex!("b45f04e0d4c17df2815a6fea2b04fd7cc2cbb8e6789084e224db3c1d00db1c6f1d325a63df25ee4a9a992553dab420b2").into(), + hex!("a91dc563b48b4cc210119ff55bec2957e8be50aa25928147d0434a9ea4088e98ba1f17c2050e713d2891a3c741ea6c6c").into(), + hex!("a12256c39f3b17c0540d2d3442b732b2485ae9da240a1ef47782549dc7e84f7a9c9240ff59a73fad228a3c01fe953169").into(), + hex!("aebc98b50533d844fe3149735750c10eab861e765aa7820e3d54fb66089ce15409206bb58d3aae5ef22a29ac5207c702").into(), + hex!("b023d0e4fc2eba4c60cedae9d2ffa79cdcd5c79279fa41baa94f536c17d746a6aa76e8fe203fb1678da126c4343eed8b").into(), + hex!("a673262367bde5d1775961c7d9aa26d9859c59600536130f9adc8f99f81f0106d2eab2c5ac3912476affcab3821fecdd").into(), + hex!("8008298954370c0c3026fd71fb48fc619caa394c9ea17273284a903b07de1d385336fad69c8ab6fe6692774d5fabcfc1").into(), + hex!("a98a824454bc0fba41a6543ba11ec6879c979e97c87e3f7f3a228ba995e33bcae9378740f925800b81d3627f2af36c51").into(), + hex!("a29c667540db41eb7ce06d74ad91c7ddeb3e1f019a028b8ed4ee705d8d079d6f7d36f1b64fd4b9b807f0dc1ab3d65d2d").into(), + hex!("86c32be8a7155f26696c1e541096ab43b3836315490a4bdad867b973ebfa8ac414e4074819b9639348a048bd6fc4bdee").into(), + hex!("a0de748319bb0c53c03f172c9aebc4f7538dfce6ffdd362d24ffdd111448277a8a705832e94f65c61aa635a5f40b6f0b").into(), + hex!("970de7621ef90cb3921f747ce1cf9d389f322cebc286c339395714a6d40167fe26e04e1fc3116d3b7bea1c99bfedf0fb").into(), + hex!("841ae6b0bdd22718fd917ca4a871d39cf6811b9a460b99422fb324235b2c51b460e48159d7e1bc1778de3513b7ab1f29").into(), + hex!("86764a78587892407b311892c4c4e70890bd757d3f72a832257f411646e9298eb4f042ec1c929cc6ffcf539dda90fe7e").into(), + hex!("b33008c5025d35243e91b6749e7d7934bd8334e5f58e88db907715435a28f02d018b09127fb0302d1ee68d7f97391040").into(), + hex!("b5ea29ebc8107525894d9872ac88b4c9662fd18d87316565a8b013529b478f17f6c1c0ddf6482db6ede54d27c0e80782").into(), + hex!("9576def9e5dd8673d3dec2090536672d44368b78b2c2f70dd9e36a9d0e5889cd9e2a47b77ebda94388ac75679257b829").into(), + hex!("823dd44b4635bf095786e47f836c4af02d4dea848bc1cd823876266341d56496e09bec8612413c302fb34c3383a55e0e").into(), + hex!("b6a32b13f8b1339b0591b9db343696aab77a0c2ff181d2069ff39581da8904499d619c26e6e44209b7791c3aa2fb7aa2").into(), + hex!("b9b3262a97049e236e29afc4a7c6d2e2253f437e013b90bd0882d35d46d7a67e1344b3dc822fcae27717a9887d842a81").into(), + hex!("8a94e08cda133175049eb2cddae936b16c477db54a749b8d3378233034f56fdea99520755ec8eb355b738af61138d9a2").into(), + hex!("a55933f63c4cce4d99d8df4fe6dc9d9a3054379ed2560bb2a9147f9e456925ab29f7b1f14321ab2501d67dd759f5ef36").into(), + hex!("8b5a713fb50a2aa0671f1405876b0a829a5c1f7c9915906bcad26de7e2011f8eb2e2b7a1cbf94c19685edf8b364f242d").into(), + hex!("97cd2419d4aaabe457b1efa6d2e557a0c4d8725e57e33018626fb31395ed78555b79cf90da49975360a497049004b20c").into(), + hex!("90d640d0c949a73543b476e0b634d442c0bbe0f4d3f1f4f99d19fd8d37d3b99c4bb3c5c08ee77c24f0af6dc7c29ce658").into(), + hex!("8f65263c9ac0026d9a536360c8b01b40243cc27a7896fada367372ba82ffcf2c758bba9f92c96fdd66956b25d7162903").into(), + hex!("ac50c7c4b3201f2c98e812e83452ded2e2dfbeb4c1910b873978c4b5b443b34dde042b13cb4943759cefe1a546bd8197").into(), + hex!("a07a157ebb964282729ab09205f5a2df132b5a0103233dca67dd55215b84e66423c576c6e0b055bf85c6a27025fe1aba").into(), + hex!("b89462ff76b35af9a1f23bbeb7f3b6e2f72f4d96aaa30fcce820573654895c76d813f27dea9251c96ea9e3f1726da99e").into(), + hex!("a81866a83434f91d464a93a50c4906224f3108777f731a1d363d16f769795be8ffd23c25f0e051d8c43a55b665c15bda").into(), + hex!("a974e15a6315d56d612f5e8d70171b01baba976ae1602265cdb74e1f5cf3a48c94e8b90bf1d343f3f56f8f9ece604ecb").into(), + hex!("97ad199e4ba05c97c5aa90cc6e63ed86f78fbea35b9f56f5107df643efe40647d1ac7e50cf6e1de8b4ede8e2225e090c").into(), + hex!("a67c3822c0e5902355fe053c3c41765146018dd90de0df89c6ae230826056e91cad2a28f06859b8ea899486ddbdbe6fa").into(), + hex!("a5dd8329edde8fdb8f82fb71637c7a4d1e13c51ab2b24cc98b80952575e821fe31c3e7de5a566f8a98e0243cebc6d1d5").into(), + hex!("b7070e8349dbd4359414c0d909de10a472c4a7fc4827804b3e1980b1cd8f468d21d4c6163c234c05f05534e423f6199b").into(), + hex!("a1acc31ccbb89ba6ba5be3ffc26ef83a28c3b0f76be71f87ef618f9f8171c8afdbc5f05c521c67171ea9fde1bad7a9dc").into(), + hex!("a86d620245d119b34f55c6145a65937e5ed5281803675e120d8c2de05eabc08f85eb8d8c877aebf535663518c4fe2f88").into(), + hex!("885317798c5b49430d50d5c5eb527540b0b704794d88d510b2511e9fea2de299d8f2cf2ae2e96196a9c0925ab1f30da1").into(), + hex!("8a5c37ad34f1867fc9fdd3303ffb86fb0d98ce27fd6739078949c070b44081349368302d7c910fd3d886165b5fbd3304").into(), + hex!("a1935e801664a3f51c22e616d25fbecb3f3be76b936e4d2dc28a4bbe79d002ddf01b94cdf9e18d07f2e2c4bccdfd76a9").into(), + hex!("b3d13a611ada38fb6c802e6f7e09d03703e9e7bf82424ded2774d6493dc0c7d8965e7839ff4d3f9fe00a1e8fb20bf13c").into(), + hex!("84f6edb320cf92e147ba3ba8b2470c57dd107b80ea8083219d3c91b77fba7b20b6774ae7ace26924c02c9a2247842bcc").into(), + hex!("86546f16627c3b875790b604aeb19c925f6d32db27c2ebf405df0324095fab1f8b748fd94b6c2b5a2dfeaf748a565b3f").into(), + hex!("b95563cebc351d8237e5f9b8ab984976e84ebf7e16c62102629cbda06c86b013c6a973d007d72a870883408b8343fd1f").into(), + hex!("8d5eff4d3238446be0f805b8f387fd57f298dfcadba88a0d87234bbede46d0ef833beb0f2ede7a51fa84a808393757b4").into(), + hex!("862179dd50e7a0fa7906248c0f3671d8d3b25504e30276da74a36edfebc8c92a04abc9dc3cba8c1b34005beb06cceca3").into(), + hex!("b12bf5775e3f9ae29da6b127ffe2892d5dec12f9c1bc21426c225220cb0d5fca5c6376afb5bf5f112f79c6563694007d").into(), + hex!("957cd40aa0864b86bc64420a184988be4489c0f0a3363f39571e71a7443ac6815a1b8ce4862c736be8441108dd78101b").into(), + hex!("8f31cdb655b66e1f8ad877639f71524aa78c09acc24aa493bd6f6be383c295f51a6e70f2573081cf87cd41ef55f5428d").into(), + hex!("a8f304c1f2faa78683d409dbb0c11e26583fdfe845f2557e378c56acc9baaa88cce25442733edcdd0da70f3e5557e53b").into(), + ], + aggregate_pubkey: hex!("870e9dfe2c909b7116a9a4180da4fb6ac4865f9304adc4c36dde6f82338c43352b58dfb494e6095bfade1dbf86e7f939").into(), + }, + next_sync_committee_branch: vec![ + hex!("d138fae7ec85d4d5ebd8d7375b3f39f4bf0d05439e6920a44bcc977e62ee0dfa").into(), + hex!("a6baa91932e6f9d9fec678e9fd75a140c8e74bd87f11d37093839826b95ceeec").into(), + hex!("926c0348ccc4c44119ca84e50911ac22078ab704b0784ebc593155da5c5adb53").into(), + hex!("c4a04575645ebf0cf5b3317a092e595adf49dd93669424c2a5efef700ed082a1").into(), + hex!("81a062566009887529ffc6350f713cd2aa30460c13173fe9ffcdbde71fd69f8b").into(), + ], + }), + finalized_header: BeaconHeader{ + slot: 5808479, + proposer_index: 218610, + parent_root: hex!("ac0c3b35e7e21d11d0563f98fb16bbfb0460aef2ee5fe39ea209aed66694601e").into(), + state_root: hex!("c66e3a4f1718ce82f35c898e8df8080c540aca493a535a2f6170a13b550faef3").into(), + body_root: hex!("207806f82ac8c5bdb6793dc61f31ce91dd06a7fe3a143d29b6579975c64d1d9c").into(), + }, + finality_branch: vec![ + hex!("0bc5020000000000000000000000000000000000000000000000000000000000").into(), + hex!("8c04962a994aadff4d3042da73e167e666323757db5b0234a497c7ddba058ded").into(), + hex!("95901d6dae3edaab0f29f2c6155edbc4eb3980b6816339a464fb51b91fafdb7a").into(), + hex!("926c0348ccc4c44119ca84e50911ac22078ab704b0784ebc593155da5c5adb53").into(), + hex!("c4a04575645ebf0cf5b3317a092e595adf49dd93669424c2a5efef700ed082a1").into(), + hex!("81a062566009887529ffc6350f713cd2aa30460c13173fe9ffcdbde71fd69f8b").into(), + ], + block_roots_root: hex!("93a5736680a9dfe23df1f8a6098c0671c583dae469847e25da3532b3649ae11b").into(), + block_roots_branch: vec![ + hex!("31a647639bd26edd8e3976b4475933d18d7d238210881f57570b7b4030133da0").into(), + hex!("0a3392c5febec2f099f93c5465c68f4f1630927d0326ad84c8d0b318364dcd82").into(), + hex!("986071ec073d43597d67a6595f7f6fc807ef1042c6821fda41ff80aa2717536f").into(), + hex!("732f545955de627e65c46201f053569dceab609948147690136bc64e060f38b4").into(), + hex!("2e7c74db495877af1e95da27113e89757ea475e8d672d319e655810ec64d4ba2").into(), + ], + }) +} + +pub fn make_finalized_header_update() -> Box { + Box::new(Update { + attested_header: BeaconHeader { + slot: 5809441, + proposer_index: 169069, + parent_root: hex!("a4d2fbf3ee62f32589738f386559a1e2358f4f54aff5f7eaea61144d3d9c00d1").into(), + state_root: hex!("4aad4183bc21fc96c90f8e043049f8c1d5ed205c6880c89cd99f2e080ef85138").into(), + body_root: hex!("406c96c6adad01df901df3625cbd622f1d541249b05c768ccc4db5643d973141").into(), + }, + sync_aggregate: SyncAggregate{ + sync_committee_bits: hex!("7fabbff6fcdefbebaefffff9e37dfffebff57f7bf3e3efbcfef1f7f987551dd176f3b3ff7bfa3fedff5fdf7f7afff5ff777bef5f9f7fe65f97fffe7dfdfffbdd"), + sync_committee_signature: hex!("84dc756c452ec9a3ba01cc98d03cf5471b871e9f3f77ddfe72ddf6d5d318ec3de9e5c1508e47ed362300cd45a144655a076d50073c24a67591b0454d2a4632bc01e97eab80f937a8288131a31ab76f400ba9c26a19df176c7e67b724f70407c3").into(), + }, + signature_slot: 5809445, + next_sync_committee_update: None, + finalized_header: BeaconHeader { + slot: 5809375, + proposer_index: 170923, + parent_root: hex!("87fed31787712fa6e802b9f296c1eb0b0ac5bc77f6945d4478c4d25bd7160d1a").into(), + state_root: hex!("246ac89e1854bada03be1da64081954e008238de219088609ddf45efc8000346").into(), + body_root: hex!("ffe0fdbdc2bf57bebdd084fce3820a13801095d236a2fb8f3a64c9d7cf94f8b9").into(), + }, + finality_branch: vec![ + hex!("27c5020000000000000000000000000000000000000000000000000000000000").into(), + hex!("8c04962a994aadff4d3042da73e167e666323757db5b0234a497c7ddba058ded").into(), + hex!("95901d6dae3edaab0f29f2c6155edbc4eb3980b6816339a464fb51b91fafdb7a").into(), + hex!("34e68ed57efdf18c5d2f455e77fa8b2a5be95bb827bdf7f7f6648103688d84b7").into(), + hex!("fc1d45f882aa66020a92c55da663ab9758581a020eb7336173fe84ef861bbdf9").into(), + hex!("7d1745c42ec44d4b2493a55dafdb770f6d38eb4a7ad68ae0264949cb7432e4a7").into(), + ], + block_roots_root: hex!("9e5aeee5467301f3a44d1ab664cebd198519423e73e2118ad046d9bae217f497").into(), + block_roots_branch: vec![ + hex!("ef671e41918c36e23a3673407050b420366022886dcce1b707622de97a695121").into(), + hex!("707cb79caeaf310c10ce1c177312e48b2331164c8327d2635203148c4d974f09").into(), + hex!("1fd802c27384482fdaacfa7406072f6f96ff5428f003af748068d1965cc36981").into(), + hex!("8a31cc13bddabda4f79d948e5e3d70806f638b61d89c87b40aa7131af43c18a8").into(), + hex!("70eb43218a3a6f619f1d0dc7f173fc9c3323fa7e3824ae6cd79af2f7d19634ad").into(), + ] + }) +} + +pub fn make_execution_header_update() -> Box { + Box::new(ExecutionHeaderUpdate { + header: BeaconHeader { + slot: 5809374, + proposer_index: 130336, + parent_root: hex!("2bb54c61560a80d1cfb0528e8ea207dfb9d55ab49238523e21609a9ee3b8a9b5").into(), + state_root: hex!("0116ea76f5c36373dfc8e039811eba86c8e8e16cfe9f0614376559b6585741a7").into(), + body_root: hex!("9a10b47e30bc11fc2ee1e21943a8382d727444f646f09664192236458b555ffe").into(), + }, + ancestry_proof: Some(AncestryProof { + header_branch: vec![ + hex!("eca009f3262f75b055e6c919e2c0a2c017f017e581a825a2618a2a76926a264e").into(), + hex!("a647371a5590630186dd47b9b8571f27e39a77b4aac1f763fabefe104bf94985").into(), + hex!("9a414690540e4c87ff5171b619b3ab6ff1115c21f247196989f5a0a9085b59a1").into(), + hex!("1bf7ae16fcde0833c6e97a83b72aef31a0b5ca055b87f86602b9b4aa193f557c").into(), + hex!("588d993d05b59bf3352f0f5ebb4cd3ec97ca3e41800da675996741e8fca374c0").into(), + hex!("fdfc6280944bb0a18c9cd0afa9f4a255719a4650233f19de478399276f198c92").into(), + hex!("1d96235b47c604f029b9ab7eb913b13b3c0c2df7f79e3301341b1ec38ea44e4c").into(), + hex!("3ee3af17ce8f5a4946d30b6bce7d6e7580b3981cd2af92246401e2326224f6d1").into(), + hex!("b53b5450e070adf02f4bb9d7c65dd131d07ae2218340eec95ac8aa5e5cdd82aa").into(), + hex!("4d7c09715a1f25574afa1dc3dd7bb44e4c1a723b9360c893b8510f675f85227a").into(), + hex!("38c159fc38dedc1e4f399a3f773ab4376fc40b126634b40d172d5daa6602cf94").into(), + hex!("9faac6fa44ed19fcf530f77b7090dd50dd17aeedabe763931ab7567276025a75").into(), + hex!("c6549c1b0f0027ac373164437e7010b955fbae1a0e78485408ec33ca906beb2d").into(), + ], + finalized_block_root: hex!("f6e721e4e65d9565091a557705285ec6db0a3a3072317317719ec8ad563859a3").into(), + }), + execution_header: ExecutionPayloadHeader { + parent_hash: hex!("6d51d7c94763813ffefa234097a51c6fd7009424d2991695f7bd6203157c86f9").into(), + fee_recipient: hex!("000095e79eac4d76aab57cb2c1f091d553b36ca0").into(), + state_root: hex!("fe9f753520a7b5c0263bbf4fdba728f69e9cf861ce1883aa13de5da30ff75d74").into(), + receipts_root: hex!("cf6ab47d8fc336155b18abfa2d965aae57d9d35a2fcf5cfc992b8dcd136958cb").into(), + logs_bloom: hex!("8427414fce71480d7e70cdbac68dd6f77608c05cf349c34c87ad3256e8dde9e3f9c52131945876c03b6e83ea5970536428283a180eb40efcc5fd834ce424f0dbf622dbba6cfda7945cc1f93a1b6e7ae448c598b4f45f7cfa933fe9808d835cb86e8a38261a031448e262f8e4f2dc4c3254c460e5faae4b518438c1330012154a1ba33ab7d85c8acaa9c47dc582fd003a771c9b09aa16c34d4f0c01fbb3f8c0a28e11d2eafb4e73b75a18e182eac7c021706832a9a785836d31f651efacf88a329334e5b3def3bf1871573dc3553f415f298a9457f7837a31302937a4178be1339cdbb83af329ae7e88d8ab6cba62f018be139896ecbc7ac11ef24b0b4ae343e9").into(), + prev_randao: hex!("5a76eff974d26bf74dc3003fac473ab4abc541be26bd61f124a1818a70ea0b3e").into(), + block_number: 9143323, + gas_limit: 30000000, + gas_used: 28165724, + timestamp: 1686220488, + extra_data: hex!("").into(), + base_fee_per_gas: U256::from(2267_u64), + block_hash: hex!("e4a67cdb1512f29ad9b331e7a37cf8e376222eafa58e72cee7771ad582cc0610").into(), + transactions_root: hex!("bd7eaeb676c14c37bbf0b6f3db2ce021a04a41dbf002f6c7df3bb61639ac7287").into(), + withdrawals_root: hex!("8647d3ecaaf62e1d087c5ab54a23f1d64f477b7ddd16fff458847181d89fc432").into(), + }, + execution_branch: vec![ + hex!("795608ac1294bcc663127b8428513ba4a5ffe952ff72f8322dca23628f13d716").into(), + hex!("336488033fe5f3ef4ccc12af07b9370b92e553e35ecb4a337a1b1c0e4afe1e0e").into(), + hex!("db56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71").into(), + hex!("2a8f5c65655edeb2800f248f2e14044fc651061d0c00c8e8b627cb21ba421fb4").into(), + ], + }) +} diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/benchmarking/mod.rs b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/benchmarking/mod.rs new file mode 100644 index 00000000000..cba22fc86c9 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/benchmarking/mod.rs @@ -0,0 +1,156 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +use super::*; + +mod fixtures; +mod util; + +use crate::Pallet as EthereumBeaconClient; +use frame_benchmarking::v2::*; +use frame_system::RawOrigin; + +use fixtures::{ + make_checkpoint, make_execution_header_update, make_finalized_header_update, + make_sync_committee_update, +}; + +use primitives::{ + fast_aggregate_verify, prepare_aggregate_pubkey, prepare_aggregate_signature, + verify_merkle_branch, +}; +use util::*; + +#[benchmarks] +mod benchmarks { + use super::*; + + #[benchmark] + fn force_checkpoint() -> Result<(), BenchmarkError> { + let checkpoint_update = make_checkpoint(); + let block_root: H256 = checkpoint_update.header.hash_tree_root().unwrap(); + + #[extrinsic_call] + _(RawOrigin::Root, Box::new(*checkpoint_update)); + + assert!(>::get() == block_root); + assert!(>::get(block_root).is_some()); + + Ok(()) + } + + #[benchmark] + fn submit() -> Result<(), BenchmarkError> { + let caller: T::AccountId = whitelisted_caller(); + let checkpoint_update = make_checkpoint(); + let finalized_header_update = make_finalized_header_update(); + let block_root: H256 = finalized_header_update.finalized_header.hash_tree_root().unwrap(); + EthereumBeaconClient::::process_checkpoint_update(&checkpoint_update)?; + + #[extrinsic_call] + submit(RawOrigin::Signed(caller.clone()), Box::new(*finalized_header_update)); + + assert!(>::get() == block_root); + assert!(>::get(block_root).is_some()); + + Ok(()) + } + + #[benchmark] + fn submit_with_sync_committee() -> Result<(), BenchmarkError> { + let caller: T::AccountId = whitelisted_caller(); + let checkpoint_update = make_checkpoint(); + let sync_committee_update = make_sync_committee_update(); + EthereumBeaconClient::::process_checkpoint_update(&checkpoint_update)?; + + #[extrinsic_call] + submit(RawOrigin::Signed(caller.clone()), Box::new(*sync_committee_update)); + + assert!(>::exists()); + + Ok(()) + } + + #[benchmark] + fn submit_execution_header() -> Result<(), BenchmarkError> { + let caller: T::AccountId = whitelisted_caller(); + let checkpoint_update = make_checkpoint(); + let finalized_header_update = make_finalized_header_update(); + let execution_header_update = make_execution_header_update(); + let execution_header_hash = execution_header_update.execution_header.block_hash; + EthereumBeaconClient::::process_checkpoint_update(&checkpoint_update)?; + EthereumBeaconClient::::process_update(&finalized_header_update)?; + + #[extrinsic_call] + _(RawOrigin::Signed(caller.clone()), Box::new(*execution_header_update)); + + assert!(>::contains_key(execution_header_hash)); + + Ok(()) + } + + #[benchmark(extra)] + fn bls_fast_aggregate_verify_pre_aggregated() -> Result<(), BenchmarkError> { + EthereumBeaconClient::::process_checkpoint_update(&make_checkpoint())?; + let update = make_sync_committee_update(); + let participant_pubkeys = participant_pubkeys::(&update)?; + let signing_root = signing_root::(&update)?; + let agg_sig = + prepare_aggregate_signature(&update.sync_aggregate.sync_committee_signature).unwrap(); + let agg_pub_key = prepare_aggregate_pubkey(&participant_pubkeys).unwrap(); + + #[block] + { + agg_sig.fast_aggregate_verify_pre_aggregated(signing_root.as_bytes(), &agg_pub_key); + } + + Ok(()) + } + + #[benchmark(extra)] + fn bls_fast_aggregate_verify() -> Result<(), BenchmarkError> { + EthereumBeaconClient::::process_checkpoint_update(&make_checkpoint())?; + let update = make_sync_committee_update(); + let current_sync_committee = >::get(); + let absent_pubkeys = absent_pubkeys::(&update)?; + let signing_root = signing_root::(&update)?; + + #[block] + { + fast_aggregate_verify( + ¤t_sync_committee.aggregate_pubkey, + &absent_pubkeys, + signing_root, + &update.sync_aggregate.sync_committee_signature, + ) + .unwrap(); + } + + Ok(()) + } + + #[benchmark(extra)] + fn verify_merkle_proof() -> Result<(), BenchmarkError> { + EthereumBeaconClient::::process_checkpoint_update(&make_checkpoint())?; + let update = make_sync_committee_update(); + let block_root: H256 = update.finalized_header.hash_tree_root().unwrap(); + + #[block] + { + verify_merkle_branch( + block_root, + &update.finality_branch, + config::FINALIZED_ROOT_SUBTREE_INDEX, + config::FINALIZED_ROOT_DEPTH, + update.attested_header.state_root, + ); + } + + Ok(()) + } + + impl_benchmark_test_suite!( + EthereumBeaconClient, + crate::mock::mainnet::new_tester(), + crate::mock::mainnet::Test + ); +} diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/benchmarking/util.rs b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/benchmarking/util.rs new file mode 100644 index 00000000000..7e5ded6e1f0 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/benchmarking/util.rs @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +use crate::{ + decompress_sync_committee_bits, Config, CurrentSyncCommittee, Pallet as EthereumBeaconClient, + Update, ValidatorsRoot, Vec, +}; +use primitives::PublicKeyPrepared; +use sp_core::H256; + +pub fn participant_pubkeys( + update: &Update, +) -> Result, &'static str> { + let sync_committee_bits = + decompress_sync_committee_bits(update.sync_aggregate.sync_committee_bits); + let current_sync_committee = >::get(); + let pubkeys = EthereumBeaconClient::::find_pubkeys( + &sync_committee_bits, + (*current_sync_committee.pubkeys).as_ref(), + true, + ); + Ok(pubkeys) +} + +pub fn absent_pubkeys(update: &Update) -> Result, &'static str> { + let sync_committee_bits = + decompress_sync_committee_bits(update.sync_aggregate.sync_committee_bits); + let current_sync_committee = >::get(); + let pubkeys = EthereumBeaconClient::::find_pubkeys( + &sync_committee_bits, + (*current_sync_committee.pubkeys).as_ref(), + false, + ); + Ok(pubkeys) +} + +pub fn signing_root(update: &Update) -> Result { + let validators_root = >::get(); + let signing_root = EthereumBeaconClient::::signing_root( + &update.attested_header, + validators_root, + update.signature_slot, + )?; + Ok(signing_root) +} diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/config/mainnet.rs b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/config/mainnet.rs new file mode 100644 index 00000000000..3d22ad82cec --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/config/mainnet.rs @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +pub const SLOTS_PER_EPOCH: usize = 32; +pub const SECONDS_PER_SLOT: usize = 12; +pub const EPOCHS_PER_SYNC_COMMITTEE_PERIOD: usize = 256; +pub const SYNC_COMMITTEE_SIZE: usize = 512; +pub const SYNC_COMMITTEE_BITS_SIZE: usize = SYNC_COMMITTEE_SIZE / 8; +pub const SLOTS_PER_HISTORICAL_ROOT: usize = 8192; +pub const IS_MINIMAL: bool = false; +pub const BLOCK_ROOT_AT_INDEX_DEPTH: usize = 13; diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/config/minimal.rs b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/config/minimal.rs new file mode 100644 index 00000000000..affa86db976 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/config/minimal.rs @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +pub const SLOTS_PER_EPOCH: usize = 8; +pub const SECONDS_PER_SLOT: usize = 6; +pub const EPOCHS_PER_SYNC_COMMITTEE_PERIOD: usize = 8; +pub const SYNC_COMMITTEE_SIZE: usize = 32; +pub const SYNC_COMMITTEE_BITS_SIZE: usize = SYNC_COMMITTEE_SIZE / 8; +pub const SLOTS_PER_HISTORICAL_ROOT: usize = 64; +pub const IS_MINIMAL: bool = true; +pub const BLOCK_ROOT_AT_INDEX_DEPTH: usize = 6; diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/config/mod.rs b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/config/mod.rs new file mode 100644 index 00000000000..6b959ebfec9 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/config/mod.rs @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +use primitives::merkle_proof::{generalized_index_length, subtree_index}; +use static_assertions::const_assert; + +pub mod mainnet; +pub mod minimal; + +#[cfg(not(feature = "beacon-spec-mainnet"))] +pub use minimal::*; + +#[cfg(feature = "beacon-spec-mainnet")] +pub use mainnet::*; + +// Generalized Indices + +// get_generalized_index(BeaconState, 'block_roots') +pub const BLOCK_ROOTS_INDEX: usize = 37; +pub const BLOCK_ROOTS_SUBTREE_INDEX: usize = subtree_index(BLOCK_ROOTS_INDEX); +pub const BLOCK_ROOTS_DEPTH: usize = generalized_index_length(BLOCK_ROOTS_INDEX); + +// get_generalized_index(BeaconState, 'finalized_checkpoint', 'root') +pub const FINALIZED_ROOT_INDEX: usize = 105; +pub const FINALIZED_ROOT_SUBTREE_INDEX: usize = subtree_index(FINALIZED_ROOT_INDEX); +pub const FINALIZED_ROOT_DEPTH: usize = generalized_index_length(FINALIZED_ROOT_INDEX); + +// get_generalized_index(BeaconState, 'current_sync_committee') +pub const CURRENT_SYNC_COMMITTEE_INDEX: usize = 54; +pub const CURRENT_SYNC_COMMITTEE_SUBTREE_INDEX: usize = subtree_index(CURRENT_SYNC_COMMITTEE_INDEX); +pub const CURRENT_SYNC_COMMITTEE_DEPTH: usize = + generalized_index_length(CURRENT_SYNC_COMMITTEE_INDEX); + +// get_generalized_index(BeaconState, 'next_sync_committee') +pub const NEXT_SYNC_COMMITTEE_INDEX: usize = 55; +pub const NEXT_SYNC_COMMITTEE_SUBTREE_INDEX: usize = subtree_index(NEXT_SYNC_COMMITTEE_INDEX); +pub const NEXT_SYNC_COMMITTEE_DEPTH: usize = generalized_index_length(NEXT_SYNC_COMMITTEE_INDEX); + +// get_generalized_index(BeaconBlockBody, 'execution_payload') +pub const EXECUTION_HEADER_INDEX: usize = 25; +pub const EXECUTION_HEADER_SUBTREE_INDEX: usize = subtree_index(EXECUTION_HEADER_INDEX); +pub const EXECUTION_HEADER_DEPTH: usize = generalized_index_length(EXECUTION_HEADER_INDEX); + +pub const MAX_EXTRA_DATA_BYTES: usize = 32; +pub const MAX_LOGS_BLOOM_SIZE: usize = 256; +pub const MAX_FEE_RECIPIENT_SIZE: usize = 20; + +pub const MAX_BRANCH_PROOF_SIZE: usize = 20; + +/// DomainType('0x07000000') +/// +pub const DOMAIN_SYNC_COMMITTEE: [u8; 4] = [7, 0, 0, 0]; + +pub const PUBKEY_SIZE: usize = 48; +pub const SIGNATURE_SIZE: usize = 96; + +const_assert!(SYNC_COMMITTEE_BITS_SIZE == SYNC_COMMITTEE_SIZE / 8); diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/functions.rs b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/functions.rs new file mode 100644 index 00000000000..751e63c7f86 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/functions.rs @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +use crate::config::{ + EPOCHS_PER_SYNC_COMMITTEE_PERIOD, SLOTS_PER_EPOCH, SYNC_COMMITTEE_BITS_SIZE, + SYNC_COMMITTEE_SIZE, +}; + +/// Decompress packed bitvector into byte vector according to SSZ deserialization rules. Each byte +/// in the decompressed vector is either 0 or 1. +pub fn decompress_sync_committee_bits( + input: [u8; SYNC_COMMITTEE_BITS_SIZE], +) -> [u8; SYNC_COMMITTEE_SIZE] { + primitives::decompress_sync_committee_bits::( + input, + ) +} + +/// Compute the sync committee period in which a slot is contained. +pub fn compute_period(slot: u64) -> u64 { + slot / SLOTS_PER_EPOCH as u64 / EPOCHS_PER_SYNC_COMMITTEE_PERIOD as u64 +} + +/// Compute epoch in which a slot is contained. +pub fn compute_epoch(slot: u64, slots_per_epoch: u64) -> u64 { + slot / slots_per_epoch +} + +/// Sums the bit vector of sync committee participation. +pub fn sync_committee_sum(sync_committee_bits: &[u8]) -> u32 { + sync_committee_bits.iter().fold(0, |acc: u32, x| acc + *x as u32) +} diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/impls.rs b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/impls.rs new file mode 100644 index 00000000000..7e72b12631c --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/impls.rs @@ -0,0 +1,93 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +use super::*; + +use snowbridge_core::inbound::{ + VerificationError::{self, *}, + *, +}; +use snowbridge_ethereum::Receipt; + +impl Verifier for Pallet { + /// Verify a message by verifying the existence of the corresponding + /// Ethereum log in a block. Returns the log if successful. The execution header containing + /// the log should be in the beacon client storage, meaning it has been verified and is an + /// ancestor of a finalized beacon block. + fn verify(event_log: &Log, proof: &Proof) -> Result<(), VerificationError> { + log::info!( + target: "ethereum-beacon-client", + "💫 Verifying message with block hash {}", + proof.block_hash, + ); + + let header = >::get(proof.block_hash).ok_or(HeaderNotFound)?; + + let receipt = match Self::verify_receipt_inclusion(header.receipts_root, proof) { + Ok(receipt) => receipt, + Err(err) => { + log::error!( + target: "ethereum-beacon-client", + "💫 Verification of receipt inclusion failed for block {}: {:?}", + proof.block_hash, + err + ); + return Err(err) + }, + }; + + log::trace!( + target: "ethereum-beacon-client", + "💫 Verified receipt inclusion for transaction at index {} in block {}", + proof.tx_index, proof.block_hash, + ); + + event_log.validate().map_err(|_| InvalidLog)?; + + // Convert snowbridge_core::inbound::Log to snowbridge_ethereum::Log. + let event_log = snowbridge_ethereum::Log { + address: event_log.address, + topics: event_log.topics.clone(), + data: event_log.data.clone(), + }; + + if !receipt.contains_log(&event_log) { + log::error!( + target: "ethereum-beacon-client", + "💫 Event log not found in receipt for transaction at index {} in block {}", + proof.tx_index, proof.block_hash, + ); + return Err(LogNotFound) + } + + log::info!( + target: "ethereum-beacon-client", + "💫 Receipt verification successful for {}", + proof.block_hash, + ); + + Ok(()) + } +} + +impl Pallet { + /// Verifies that the receipt encoded in `proof.data` is included in the block given by + /// `proof.block_hash`. + pub fn verify_receipt_inclusion( + receipts_root: H256, + proof: &Proof, + ) -> Result { + let result = verify_receipt_proof(receipts_root, &proof.data.1).ok_or(InvalidProof)?; + + match result { + Ok(receipt) => Ok(receipt), + Err(err) => { + log::trace!( + target: "ethereum-beacon-client", + "💫 Failed to decode transaction receipt: {}", + err + ); + Err(InvalidProof) + }, + } + } +} diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/lib.rs b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/lib.rs new file mode 100644 index 00000000000..fdda200251a --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/lib.rs @@ -0,0 +1,841 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +//! Ethereum Beacon Client +//! +//! A light client that verifies consensus updates signed by the sync committee of the beacon chain. +//! +//! # Extrinsics +//! +//! ## Governance +//! +//! * [`Call::force_checkpoint`]: Set the initial trusted consensus checkpoint. +//! * [`Call::set_operating_mode`]: Set the operating mode of the pallet. Can be used to disable +//! processing of conensus updates. +//! +//! ## Consensus Updates +//! +//! * [`Call::submit`]: Submit a finalized beacon header with an optional sync committee update +//! * [`Call::submit_execution_header`]: Submit an execution header together with an ancestry proof +//! that can be verified against an already imported finalized beacon header. +#![cfg_attr(not(feature = "std"), no_std)] + +pub mod config; +pub mod functions; +pub mod impls; +pub mod types; +pub mod weights; + +#[cfg(any(test, feature = "fuzzing"))] +pub mod mock; + +#[cfg(all(test, not(feature = "beacon-spec-mainnet")))] +mod tests; + +#[cfg(feature = "runtime-benchmarks")] +mod benchmarking; + +use frame_support::{ + dispatch::DispatchResult, pallet_prelude::OptionQuery, traits::Get, transactional, +}; +use frame_system::ensure_signed; +use primitives::{ + fast_aggregate_verify, verify_merkle_branch, verify_receipt_proof, BeaconHeader, BlsError, + CompactBeaconState, CompactExecutionHeader, ExecutionHeaderState, ForkData, ForkVersion, + ForkVersions, PublicKeyPrepared, SigningData, +}; +use snowbridge_core::{BasicOperatingMode, RingBufferMap}; +use sp_core::H256; +use sp_std::prelude::*; +pub use weights::WeightInfo; + +use functions::{ + compute_epoch, compute_period, decompress_sync_committee_bits, sync_committee_sum, +}; +pub use types::ExecutionHeaderBuffer; +use types::{ + CheckpointUpdate, ExecutionHeaderUpdate, FinalizedBeaconStateBuffer, SyncCommitteePrepared, + Update, +}; + +pub use pallet::*; + +pub use config::SLOTS_PER_HISTORICAL_ROOT; + +pub const LOG_TARGET: &str = "ethereum-beacon-client"; + +#[frame_support::pallet] +pub mod pallet { + use super::*; + + use frame_support::pallet_prelude::*; + use frame_system::pallet_prelude::*; + + #[derive(scale_info::TypeInfo, codec::Encode, codec::Decode, codec::MaxEncodedLen)] + #[codec(mel_bound(T: Config))] + #[scale_info(skip_type_params(T))] + pub struct MaxFinalizedHeadersToKeep(PhantomData); + impl Get for MaxFinalizedHeadersToKeep { + fn get() -> u32 { + // Consider max latency allowed between LatestFinalizedState and LatestExecutionState is + // the total slots in one sync_committee_period so 1 should be fine we keep 2 periods + // here for redundancy. + const MAX_REDUNDANCY: u32 = 2; + config::EPOCHS_PER_SYNC_COMMITTEE_PERIOD as u32 * MAX_REDUNDANCY + } + } + + #[pallet::pallet] + pub struct Pallet(_); + + #[pallet::config] + pub trait Config: frame_system::Config { + type RuntimeEvent: From> + IsType<::RuntimeEvent>; + #[pallet::constant] + type ForkVersions: Get; + /// Maximum number of execution headers to keep + #[pallet::constant] + type MaxExecutionHeadersToKeep: Get; + type WeightInfo: WeightInfo; + } + + #[pallet::event] + #[pallet::generate_deposit(pub(super) fn deposit_event)] + pub enum Event { + BeaconHeaderImported { + block_hash: H256, + slot: u64, + }, + ExecutionHeaderImported { + block_hash: H256, + block_number: u64, + }, + SyncCommitteeUpdated { + period: u64, + }, + /// Set OperatingMode + OperatingModeChanged { + mode: BasicOperatingMode, + }, + } + + #[pallet::error] + pub enum Error { + SkippedSyncCommitteePeriod, + /// Attested header is older than latest finalized header. + IrrelevantUpdate, + NotBootstrapped, + SyncCommitteeParticipantsNotSupermajority, + InvalidHeaderMerkleProof, + InvalidSyncCommitteeMerkleProof, + InvalidExecutionHeaderProof, + InvalidAncestryMerkleProof, + InvalidBlockRootsRootMerkleProof, + HeaderNotFinalized, + BlockBodyHashTreeRootFailed, + HeaderHashTreeRootFailed, + SyncCommitteeHashTreeRootFailed, + SigningRootHashTreeRootFailed, + ForkDataHashTreeRootFailed, + ExpectedFinalizedHeaderNotStored, + BLSPreparePublicKeysFailed, + BLSVerificationFailed(BlsError), + InvalidUpdateSlot, + /// The given update is not in the expected period, or the given next sync committee does + /// not match the next sync committee in storage. + InvalidSyncCommitteeUpdate, + ExecutionHeaderTooFarBehind, + ExecutionHeaderSkippedBlock, + Halted, + } + + /// Latest imported checkpoint root + #[pallet::storage] + #[pallet::getter(fn initial_checkpoint_root)] + pub(super) type InitialCheckpointRoot = StorageValue<_, H256, ValueQuery>; + + /// Latest imported finalized block root + #[pallet::storage] + #[pallet::getter(fn latest_finalized_block_root)] + pub(super) type LatestFinalizedBlockRoot = StorageValue<_, H256, ValueQuery>; + + /// Beacon state by finalized block root + #[pallet::storage] + #[pallet::getter(fn finalized_beacon_state)] + pub(super) type FinalizedBeaconState = + StorageMap<_, Identity, H256, CompactBeaconState, OptionQuery>; + + /// Finalized Headers: Current position in ring buffer + #[pallet::storage] + pub(crate) type FinalizedBeaconStateIndex = StorageValue<_, u32, ValueQuery>; + + /// Finalized Headers: Mapping of ring buffer index to a pruning candidate + #[pallet::storage] + pub(crate) type FinalizedBeaconStateMapping = + StorageMap<_, Identity, u32, H256, ValueQuery>; + + #[pallet::storage] + #[pallet::getter(fn validators_root)] + pub(super) type ValidatorsRoot = StorageValue<_, H256, ValueQuery>; + + /// Sync committee for current period + #[pallet::storage] + pub(super) type CurrentSyncCommittee = + StorageValue<_, SyncCommitteePrepared, ValueQuery>; + + /// Sync committee for next period + #[pallet::storage] + pub(super) type NextSyncCommittee = + StorageValue<_, SyncCommitteePrepared, ValueQuery>; + + /// Latest imported execution header + #[pallet::storage] + #[pallet::getter(fn latest_execution_state)] + pub(super) type LatestExecutionState = + StorageValue<_, ExecutionHeaderState, ValueQuery>; + + /// Execution Headers + #[pallet::storage] + pub type ExecutionHeaders = + StorageMap<_, Identity, H256, CompactExecutionHeader, OptionQuery>; + + /// Execution Headers: Current position in ring buffer + #[pallet::storage] + pub type ExecutionHeaderIndex = StorageValue<_, u32, ValueQuery>; + + /// Execution Headers: Mapping of ring buffer index to a pruning candidate + #[pallet::storage] + pub type ExecutionHeaderMapping = StorageMap<_, Identity, u32, H256, ValueQuery>; + + /// The current operating mode of the pallet. + #[pallet::storage] + #[pallet::getter(fn operating_mode)] + pub type OperatingMode = StorageValue<_, BasicOperatingMode, ValueQuery>; + + #[pallet::call] + impl Pallet { + #[pallet::call_index(0)] + #[pallet::weight(T::WeightInfo::force_checkpoint())] + #[transactional] + /// Used for pallet initialization and light client resetting. Needs to be called by + /// the root origin. + pub fn force_checkpoint( + origin: OriginFor, + update: Box, + ) -> DispatchResult { + ensure_root(origin)?; + Self::process_checkpoint_update(&update)?; + Ok(()) + } + + #[pallet::call_index(1)] + #[pallet::weight({ + match update.next_sync_committee_update { + None => T::WeightInfo::submit(), + Some(_) => T::WeightInfo::submit_with_sync_committee(), + } + })] + #[transactional] + /// Submits a new finalized beacon header update. The update may contain the next + /// sync committee. + pub fn submit(origin: OriginFor, update: Box) -> DispatchResult { + ensure_signed(origin)?; + ensure!(!Self::operating_mode().is_halted(), Error::::Halted); + Self::process_update(&update)?; + Ok(()) + } + + #[pallet::call_index(2)] + #[pallet::weight(T::WeightInfo::submit_execution_header())] + #[transactional] + /// Submits a new execution header update. The relevant related beacon header + /// is also included to prove the execution header, as well as ancestry proof data. + pub fn submit_execution_header( + origin: OriginFor, + update: Box, + ) -> DispatchResult { + ensure_signed(origin)?; + ensure!(!Self::operating_mode().is_halted(), Error::::Halted); + Self::process_execution_header_update(&update)?; + Ok(()) + } + + /// Halt or resume all pallet operations. May only be called by root. + #[pallet::call_index(3)] + #[pallet::weight((T::DbWeight::get().reads_writes(1, 1), DispatchClass::Operational))] + pub fn set_operating_mode( + origin: OriginFor, + mode: BasicOperatingMode, + ) -> DispatchResult { + ensure_root(origin)?; + OperatingMode::::set(mode); + Self::deposit_event(Event::OperatingModeChanged { mode }); + Ok(()) + } + } + + impl Pallet { + /// Forces a finalized beacon header checkpoint update. The current sync committee, + /// with a header attesting to the current sync committee, should be provided. + /// An `block_roots` proof should also be provided. This is used for ancestry proofs + /// for execution header updates. + pub(crate) fn process_checkpoint_update(update: &CheckpointUpdate) -> DispatchResult { + let sync_committee_root = update + .current_sync_committee + .hash_tree_root() + .map_err(|_| Error::::SyncCommitteeHashTreeRootFailed)?; + + // Verifies the sync committee in the Beacon state. + ensure!( + verify_merkle_branch( + sync_committee_root, + &update.current_sync_committee_branch, + config::CURRENT_SYNC_COMMITTEE_SUBTREE_INDEX, + config::CURRENT_SYNC_COMMITTEE_DEPTH, + update.header.state_root + ), + Error::::InvalidSyncCommitteeMerkleProof + ); + + let header_root: H256 = update + .header + .hash_tree_root() + .map_err(|_| Error::::HeaderHashTreeRootFailed)?; + + // This is used for ancestry proofs in ExecutionHeader updates. This verifies the + // BeaconState: the beacon state root is the tree root; the `block_roots` hash is the + // tree leaf. + ensure!( + verify_merkle_branch( + update.block_roots_root, + &update.block_roots_branch, + config::BLOCK_ROOTS_SUBTREE_INDEX, + config::BLOCK_ROOTS_DEPTH, + update.header.state_root + ), + Error::::InvalidBlockRootsRootMerkleProof + ); + + let sync_committee_prepared: SyncCommitteePrepared = (&update.current_sync_committee) + .try_into() + .map_err(|_| >::BLSPreparePublicKeysFailed)?; + >::set(sync_committee_prepared); + >::kill(); + InitialCheckpointRoot::::set(header_root); + >::kill(); + + Self::store_validators_root(update.validators_root); + Self::store_finalized_header(header_root, update.header, update.block_roots_root)?; + + Ok(()) + } + + pub(crate) fn process_update(update: &Update) -> DispatchResult { + Self::cross_check_execution_state()?; + Self::verify_update(update)?; + Self::apply_update(update)?; + Ok(()) + } + + /// Cross check to make sure that execution header import does not fall too far behind + /// finalised beacon header import. If that happens just return an error and pause + /// processing until execution header processing has caught up. + pub(crate) fn cross_check_execution_state() -> DispatchResult { + let latest_finalized_state = + FinalizedBeaconState::::get(LatestFinalizedBlockRoot::::get()) + .ok_or(Error::::NotBootstrapped)?; + let latest_execution_state = Self::latest_execution_state(); + // The execution header import should be at least within the slot range of a sync + // committee period. + let max_latency = config::EPOCHS_PER_SYNC_COMMITTEE_PERIOD * config::SLOTS_PER_EPOCH; + ensure!( + latest_execution_state.beacon_slot == 0 || + latest_finalized_state.slot < + latest_execution_state.beacon_slot + max_latency as u64, + Error::::ExecutionHeaderTooFarBehind + ); + Ok(()) + } + + /// References and strictly follows + /// Verifies that provided next sync committee is valid through a series of checks + /// (including checking that a sync committee period isn't skipped and that the header is + /// signed by the current sync committee. + fn verify_update(update: &Update) -> DispatchResult { + // Verify sync committee has sufficient participants. + let participation = + decompress_sync_committee_bits(update.sync_aggregate.sync_committee_bits); + Self::sync_committee_participation_is_supermajority(&participation)?; + + // Verify update does not skip a sync committee period. + ensure!( + update.signature_slot > update.attested_header.slot && + update.attested_header.slot >= update.finalized_header.slot, + Error::::InvalidUpdateSlot + ); + // Retrieve latest finalized state. + let latest_finalized_state = + FinalizedBeaconState::::get(LatestFinalizedBlockRoot::::get()) + .ok_or(Error::::NotBootstrapped)?; + let store_period = compute_period(latest_finalized_state.slot); + let signature_period = compute_period(update.signature_slot); + if >::exists() { + ensure!( + (store_period..=store_period + 1).contains(&signature_period), + Error::::SkippedSyncCommitteePeriod + ) + } else { + ensure!(signature_period == store_period, Error::::SkippedSyncCommitteePeriod) + } + + // Verify update is relevant. + let update_attested_period = compute_period(update.attested_header.slot); + let update_has_next_sync_committee = !>::exists() && + (update.next_sync_committee_update.is_some() && + update_attested_period == store_period); + ensure!( + update.attested_header.slot > latest_finalized_state.slot || + update_has_next_sync_committee, + Error::::IrrelevantUpdate + ); + + // Verify that the `finality_branch`, if present, confirms `finalized_header` to match + // the finalized checkpoint root saved in the state of `attested_header`. + let finalized_block_root: H256 = update + .finalized_header + .hash_tree_root() + .map_err(|_| Error::::HeaderHashTreeRootFailed)?; + ensure!( + verify_merkle_branch( + finalized_block_root, + &update.finality_branch, + config::FINALIZED_ROOT_SUBTREE_INDEX, + config::FINALIZED_ROOT_DEPTH, + update.attested_header.state_root + ), + Error::::InvalidHeaderMerkleProof + ); + + // Though following check does not belong to ALC spec we verify block_roots_root to + // match the finalized checkpoint root saved in the state of `finalized_header` so to + // cache it for later use in `verify_ancestry_proof`. + ensure!( + verify_merkle_branch( + update.block_roots_root, + &update.block_roots_branch, + config::BLOCK_ROOTS_SUBTREE_INDEX, + config::BLOCK_ROOTS_DEPTH, + update.finalized_header.state_root + ), + Error::::InvalidBlockRootsRootMerkleProof + ); + + // Verify that the `next_sync_committee`, if present, actually is the next sync + // committee saved in the state of the `attested_header`. + if let Some(next_sync_committee_update) = &update.next_sync_committee_update { + let sync_committee_root = next_sync_committee_update + .next_sync_committee + .hash_tree_root() + .map_err(|_| Error::::SyncCommitteeHashTreeRootFailed)?; + if update_attested_period == store_period && >::exists() { + let next_committee_root = >::get().root; + ensure!( + sync_committee_root == next_committee_root, + Error::::InvalidSyncCommitteeUpdate + ); + } + ensure!( + verify_merkle_branch( + sync_committee_root, + &next_sync_committee_update.next_sync_committee_branch, + config::NEXT_SYNC_COMMITTEE_SUBTREE_INDEX, + config::NEXT_SYNC_COMMITTEE_DEPTH, + update.attested_header.state_root + ), + Error::::InvalidSyncCommitteeMerkleProof + ); + } + + // Verify sync committee aggregate signature. + let sync_committee = if signature_period == store_period { + >::get() + } else { + >::get() + }; + let absent_pubkeys = + Self::find_pubkeys(&participation, (*sync_committee.pubkeys).as_ref(), false); + let signing_root = Self::signing_root( + &update.attested_header, + Self::validators_root(), + update.signature_slot, + )?; + // Improvement here per + // suggested start from the full set aggregate_pubkey then subtracting the absolute + // minority that did not participate. + fast_aggregate_verify( + &sync_committee.aggregate_pubkey, + &absent_pubkeys, + signing_root, + &update.sync_aggregate.sync_committee_signature, + ) + .map_err(|e| Error::::BLSVerificationFailed(e))?; + + Ok(()) + } + + /// Reference and strictly follows DispatchResult { + let latest_finalized_state = + FinalizedBeaconState::::get(LatestFinalizedBlockRoot::::get()) + .ok_or(Error::::NotBootstrapped)?; + if let Some(next_sync_committee_update) = &update.next_sync_committee_update { + let store_period = compute_period(latest_finalized_state.slot); + let update_finalized_period = compute_period(update.finalized_header.slot); + let sync_committee_prepared: SyncCommitteePrepared = (&next_sync_committee_update + .next_sync_committee) + .try_into() + .map_err(|_| >::BLSPreparePublicKeysFailed)?; + + if !>::exists() { + ensure!( + update_finalized_period == store_period, + >::InvalidSyncCommitteeUpdate + ); + >::set(sync_committee_prepared); + } else if update_finalized_period == store_period + 1 { + >::set(>::get()); + >::set(sync_committee_prepared); + } + log::info!( + target: LOG_TARGET, + "💫 SyncCommitteeUpdated at period {}.", + update_finalized_period + ); + Self::deposit_event(Event::SyncCommitteeUpdated { + period: update_finalized_period, + }); + }; + + if update.finalized_header.slot > latest_finalized_state.slot { + let finalized_block_root: H256 = update + .finalized_header + .hash_tree_root() + .map_err(|_| Error::::HeaderHashTreeRootFailed)?; + Self::store_finalized_header( + finalized_block_root, + update.finalized_header, + update.block_roots_root, + )?; + } + + Ok(()) + } + + /// Validates an execution header for import. The beacon header containing the execution + /// header is sent, plus the execution header, along with a proof that the execution header + /// is rooted in the beacon header body. + pub(crate) fn process_execution_header_update( + update: &ExecutionHeaderUpdate, + ) -> DispatchResult { + let latest_finalized_state = + FinalizedBeaconState::::get(LatestFinalizedBlockRoot::::get()) + .ok_or(Error::::NotBootstrapped)?; + // Checks that the header is an ancestor of a finalized header, using slot number. + ensure!( + update.header.slot <= latest_finalized_state.slot, + Error::::HeaderNotFinalized + ); + + // Checks that we don't skip execution headers, they need to be imported sequentially. + let latest_execution_state: ExecutionHeaderState = Self::latest_execution_state(); + ensure!( + latest_execution_state.block_number == 0 || + update.execution_header.block_number == + latest_execution_state.block_number + 1, + Error::::ExecutionHeaderSkippedBlock + ); + + // Gets the hash tree root of the execution header, in preparation for the execution + // header proof (used to check that the execution header is rooted in the beacon + // header body. + let execution_header_root: H256 = update + .execution_header + .hash_tree_root() + .map_err(|_| Error::::BlockBodyHashTreeRootFailed)?; + + ensure!( + verify_merkle_branch( + execution_header_root, + &update.execution_branch, + config::EXECUTION_HEADER_SUBTREE_INDEX, + config::EXECUTION_HEADER_DEPTH, + update.header.body_root + ), + Error::::InvalidExecutionHeaderProof + ); + + let block_root: H256 = update + .header + .hash_tree_root() + .map_err(|_| Error::::HeaderHashTreeRootFailed)?; + + match &update.ancestry_proof { + Some(proof) => { + Self::verify_ancestry_proof( + block_root, + update.header.slot, + &proof.header_branch, + proof.finalized_block_root, + )?; + }, + None => { + // If the ancestry proof is not provided, we expect this header to be a + // finalized header. We need to check that the header hash matches the finalized + // header root at the expected slot. + let state = >::get(block_root) + .ok_or(Error::::ExpectedFinalizedHeaderNotStored)?; + if update.header.slot != state.slot { + return Err(Error::::ExpectedFinalizedHeaderNotStored.into()) + } + }, + } + + Self::store_execution_header( + update.execution_header.block_hash, + update.execution_header.clone().into(), + update.header.slot, + block_root, + ); + + Ok(()) + } + + /// Verify that `block_root` is an ancestor of `finalized_block_root` Used to prove that + /// an execution header is an ancestor of a finalized header (i.e. the blocks are + /// on the same chain). + fn verify_ancestry_proof( + block_root: H256, + block_slot: u64, + block_root_proof: &[H256], + finalized_block_root: H256, + ) -> DispatchResult { + let state = >::get(finalized_block_root) + .ok_or(Error::::ExpectedFinalizedHeaderNotStored)?; + + ensure!(block_slot < state.slot, Error::::HeaderNotFinalized); + + let index_in_array = block_slot % (SLOTS_PER_HISTORICAL_ROOT as u64); + let leaf_index = (SLOTS_PER_HISTORICAL_ROOT as u64) + index_in_array; + + ensure!( + verify_merkle_branch( + block_root, + block_root_proof, + leaf_index as usize, + config::BLOCK_ROOT_AT_INDEX_DEPTH, + state.block_roots_root + ), + Error::::InvalidAncestryMerkleProof + ); + + Ok(()) + } + + /// Computes the signing root for a given beacon header and domain. The hash tree root + /// of the beacon header is computed, and then the combination of the beacon header hash + /// and the domain makes up the signing root. + pub(super) fn compute_signing_root( + beacon_header: &BeaconHeader, + domain: H256, + ) -> Result { + let beacon_header_root = beacon_header + .hash_tree_root() + .map_err(|_| Error::::HeaderHashTreeRootFailed)?; + + let hash_root = SigningData { object_root: beacon_header_root, domain } + .hash_tree_root() + .map_err(|_| Error::::SigningRootHashTreeRootFailed)?; + + Ok(hash_root) + } + + /// Stores a compacted (slot and block roots root (hash of the `block_roots` beacon state + /// field, used for ancestry proof)) beacon state in a ring buffer map, with the header root + /// as map key. + fn store_finalized_header( + header_root: H256, + header: BeaconHeader, + block_roots_root: H256, + ) -> DispatchResult { + let slot = header.slot; + + >::insert( + header_root, + CompactBeaconState { slot: header.slot, block_roots_root }, + ); + >::set(header_root); + + log::info!( + target: LOG_TARGET, + "💫 Updated latest finalized block root {} at slot {}.", + header_root, + slot + ); + + Self::deposit_event(Event::BeaconHeaderImported { block_hash: header_root, slot }); + + Ok(()) + } + + /// Stores the provided execution header in pallet storage. The header is stored + /// in a ring buffer map, with the block hash as map key. The last imported execution + /// header is also kept in storage, for the relayer to check import progress. + pub(crate) fn store_execution_header( + block_hash: H256, + header: CompactExecutionHeader, + beacon_slot: u64, + beacon_block_root: H256, + ) { + let block_number = header.block_number; + + >::insert(block_hash, header); + + log::trace!( + target: LOG_TARGET, + "💫 Updated latest execution block at {} to number {}.", + block_hash, + block_number + ); + + LatestExecutionState::::mutate(|s| { + s.beacon_block_root = beacon_block_root; + s.beacon_slot = beacon_slot; + s.block_hash = block_hash; + s.block_number = block_number; + }); + + Self::deposit_event(Event::ExecutionHeaderImported { block_hash, block_number }); + } + + /// Stores the validators root in storage. Validators root is the hash tree root of all the + /// validators at genesis and is used to used to identify the chain that we are on + /// (used in conjunction with the fork version). + /// + fn store_validators_root(validators_root: H256) { + >::set(validators_root); + } + + /// Returns the domain for the domain_type and fork_version. The domain is used to + /// distinguish between the different players in the chain (see DomainTypes + /// ) and to ensure we are + /// addressing the correct chain. + /// + pub(super) fn compute_domain( + domain_type: Vec, + fork_version: ForkVersion, + genesis_validators_root: H256, + ) -> Result { + let fork_data_root = + Self::compute_fork_data_root(fork_version, genesis_validators_root)?; + + let mut domain = [0u8; 32]; + domain[0..4].copy_from_slice(&(domain_type)); + domain[4..32].copy_from_slice(&(fork_data_root.0[..28])); + + Ok(domain.into()) + } + + /// Computes the fork data root. The fork data root is a merkleization of the current + /// fork version and the genesis validators root. + fn compute_fork_data_root( + current_version: ForkVersion, + genesis_validators_root: H256, + ) -> Result { + let hash_root = ForkData { + current_version, + genesis_validators_root: genesis_validators_root.into(), + } + .hash_tree_root() + .map_err(|_| Error::::ForkDataHashTreeRootFailed)?; + + Ok(hash_root) + } + + /// Checks that the sync committee bits (the votes of the sync committee members, + /// represented by bits 0 and 1) is more than a supermajority (2/3 of the votes are + /// positive). + pub(super) fn sync_committee_participation_is_supermajority( + sync_committee_bits: &[u8], + ) -> DispatchResult { + let sync_committee_sum = sync_committee_sum(sync_committee_bits); + ensure!( + ((sync_committee_sum * 3) as usize) >= sync_committee_bits.len() * 2, + Error::::SyncCommitteeParticipantsNotSupermajority + ); + + Ok(()) + } + + /// Returns the fork version based on the current epoch. The hard fork versions + /// are defined in pallet config. + pub(super) fn compute_fork_version(epoch: u64) -> ForkVersion { + Self::select_fork_version(&T::ForkVersions::get(), epoch) + } + + /// Returns the fork version based on the current epoch. + pub(super) fn select_fork_version(fork_versions: &ForkVersions, epoch: u64) -> ForkVersion { + if epoch >= fork_versions.capella.epoch { + return fork_versions.capella.version + } + if epoch >= fork_versions.bellatrix.epoch { + return fork_versions.bellatrix.version + } + if epoch >= fork_versions.altair.epoch { + return fork_versions.altair.version + } + + fork_versions.genesis.version + } + + /// Returns a vector of public keys that participated in the sync committee block signage. + /// Sync committee bits is an array of 0s and 1s, 0 meaning the corresponding sync committee + /// member did not participate in the vote, 1 meaning they participated. + /// This method can find the absent or participating members, based on the participant + /// parameter. participant = false will return absent participants, participant = true will + /// return participating members. + pub fn find_pubkeys( + sync_committee_bits: &[u8], + sync_committee_pubkeys: &[PublicKeyPrepared], + participant: bool, + ) -> Vec { + let mut pubkeys: Vec = Vec::new(); + for (bit, pubkey) in sync_committee_bits.iter().zip(sync_committee_pubkeys.iter()) { + if *bit == u8::from(participant) { + pubkeys.push(*pubkey); + } + } + pubkeys + } + + /// Calculates signing root for BeaconHeader. The signing root is used for the message + /// value in BLS signature verification. + pub fn signing_root( + header: &BeaconHeader, + validators_root: H256, + signature_slot: u64, + ) -> Result { + let fork_version = Self::compute_fork_version(compute_epoch( + signature_slot, + config::SLOTS_PER_EPOCH as u64, + )); + let domain_type = config::DOMAIN_SYNC_COMMITTEE.to_vec(); + // Domains are used for for seeds, for signatures, and for selecting aggregators. + let domain = Self::compute_domain(domain_type, fork_version, validators_root)?; + // Hash tree root of SigningData - object root + domain + let signing_root = Self::compute_signing_root(header, domain)?; + Ok(signing_root) + } + } +} diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/mock.rs b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/mock.rs new file mode 100644 index 00000000000..4d1d14a1015 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/mock.rs @@ -0,0 +1,275 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +use crate as ethereum_beacon_client; +use frame_support::parameter_types; +use pallet_timestamp; +use primitives::{Fork, ForkVersions}; +use sp_core::H256; +use sp_runtime::traits::{BlakeTwo256, IdentityLookup}; + +#[cfg(not(feature = "beacon-spec-mainnet"))] +pub mod minimal { + use super::*; + + use crate::config; + use hex_literal::hex; + use primitives::CompactExecutionHeader; + use snowbridge_core::inbound::{Log, Proof}; + use sp_runtime::BuildStorage; + use std::{fs::File, path::PathBuf}; + + type Block = frame_system::mocking::MockBlock; + + frame_support::construct_runtime!( + pub enum Test { + System: frame_system::{Pallet, Call, Storage, Event}, + Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent}, + EthereumBeaconClient: ethereum_beacon_client::{Pallet, Call, Storage, Event}, + } + ); + + parameter_types! { + pub const BlockHashCount: u64 = 250; + pub const SS58Prefix: u8 = 42; + } + + impl frame_system::Config for Test { + type BaseCallFilter = frame_support::traits::Everything; + type OnSetCode = (); + type BlockWeights = (); + type BlockLength = (); + type DbWeight = (); + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + type RuntimeTask = RuntimeTask; + type Hash = H256; + type Hashing = BlakeTwo256; + type AccountId = u64; + type Lookup = IdentityLookup; + type RuntimeEvent = RuntimeEvent; + type BlockHashCount = BlockHashCount; + type Version = (); + type PalletInfo = PalletInfo; + type AccountData = (); + type OnNewAccount = (); + type OnKilledAccount = (); + type SystemWeightInfo = (); + type SS58Prefix = SS58Prefix; + type MaxConsumers = frame_support::traits::ConstU32<16>; + type Nonce = u64; + type Block = Block; + } + + impl pallet_timestamp::Config for Test { + type Moment = u64; + type OnTimestampSet = (); + type MinimumPeriod = (); + type WeightInfo = (); + } + + parameter_types! { + pub const ExecutionHeadersPruneThreshold: u32 = 10; + pub const ChainForkVersions: ForkVersions = ForkVersions{ + genesis: Fork { + version: [0, 0, 0, 1], // 0x00000001 + epoch: 0, + }, + altair: Fork { + version: [1, 0, 0, 1], // 0x01000001 + epoch: 0, + }, + bellatrix: Fork { + version: [2, 0, 0, 1], // 0x02000001 + epoch: 0, + }, + capella: Fork { + version: [3, 0, 0, 1], // 0x03000001 + epoch: 0, + }, + }; + } + + impl ethereum_beacon_client::Config for Test { + type RuntimeEvent = RuntimeEvent; + type ForkVersions = ChainForkVersions; + type MaxExecutionHeadersToKeep = ExecutionHeadersPruneThreshold; + type WeightInfo = (); + } + + // Build genesis storage according to the mock runtime. + pub fn new_tester() -> sp_io::TestExternalities { + let t = frame_system::GenesisConfig::::default().build_storage().unwrap(); + let mut ext = sp_io::TestExternalities::new(t); + let _ = ext.execute_with(|| Timestamp::set(RuntimeOrigin::signed(1), 30_000)); + ext + } + + fn load_fixture(basename: &str) -> Result + where + T: for<'de> serde::Deserialize<'de>, + { + let filepath: PathBuf = + [env!("CARGO_MANIFEST_DIR"), "tests", "fixtures", basename].iter().collect(); + serde_json::from_reader(File::open(filepath).unwrap()) + } + + pub fn load_execution_header_update_fixture() -> primitives::ExecutionHeaderUpdate { + load_fixture("execution-header-update.minimal.json").unwrap() + } + + pub fn load_checkpoint_update_fixture( + ) -> primitives::CheckpointUpdate<{ config::SYNC_COMMITTEE_SIZE }> { + load_fixture("initial-checkpoint.minimal.json").unwrap() + } + + pub fn load_sync_committee_update_fixture( + ) -> primitives::Update<{ config::SYNC_COMMITTEE_SIZE }, { config::SYNC_COMMITTEE_BITS_SIZE }> { + load_fixture("sync-committee-update.minimal.json").unwrap() + } + + pub fn load_finalized_header_update_fixture( + ) -> primitives::Update<{ config::SYNC_COMMITTEE_SIZE }, { config::SYNC_COMMITTEE_BITS_SIZE }> { + load_fixture("finalized-header-update.minimal.json").unwrap() + } + + pub fn load_next_sync_committee_update_fixture( + ) -> primitives::Update<{ config::SYNC_COMMITTEE_SIZE }, { config::SYNC_COMMITTEE_BITS_SIZE }> { + load_fixture("next-sync-committee-update.minimal.json").unwrap() + } + + pub fn load_next_finalized_header_update_fixture( + ) -> primitives::Update<{ config::SYNC_COMMITTEE_SIZE }, { config::SYNC_COMMITTEE_BITS_SIZE }> { + load_fixture("next-finalized-header-update.minimal.json").unwrap() + } + + pub fn get_message_verification_payload() -> (Log, Proof) { + ( + Log { + address: hex!("ee9170abfbf9421ad6dd07f6bdec9d89f2b581e0").into(), + topics: vec![ + hex!("1b11dcf133cc240f682dab2d3a8e4cd35c5da8c9cf99adac4336f8512584c5ad").into(), + hex!("00000000000000000000000000000000000000000000000000000000000003e8").into(), + hex!("0000000000000000000000000000000000000000000000000000000000000001").into(), + ], + data: hex!("0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004b000f000000000000000100d184c103f7acc340847eee82a0b909e3358bc28d440edffa1352b13227e8ee646f3ea37456dec701345772617070656420457468657210574554481235003511000000000000000000000000000000000000000000").into(), + }, + Proof { + block_hash: hex!("05aaa60b0f27cce9e71909508527264b77ee14da7b5bf915fcc4e32715333213").into(), + tx_index: 0, + data: (vec![ + hex!("cf0d1c1ba57d1e0edfb59786c7e30c2b7e12bd54612b00cd21c4eaeecedf44fb").to_vec(), + hex!("d21fc4f68ab05bc4dcb23c67008e92c4d466437cdd6ed7aad0c008944c185510").to_vec(), + hex!("b9890f91ca0d77aa2a4adfaf9b9e40c94cac9e638b6d9797923865872944b646").to_vec(), + ], vec![ + hex!("f90131a0b601337b3aa10a671caa724eba641e759399979856141d3aea6b6b4ac59b889ba00c7d5dd48be9060221a02fb8fa213860b4c50d47046c8fa65ffaba5737d569e0a094601b62a1086cd9c9cb71a7ebff9e718f3217fd6e837efe4246733c0a196f63a06a4b0dd0aefc37b3c77828c8f07d1b7a2455ceb5dbfd3c77d7d6aeeddc2f7e8ca0d6e8e23142cdd8ec219e1f5d8b56aa18e456702b195deeaa210327284d42ade4a08a313d4c87023005d1ab631bbfe3f5de1e405d0e66d0bef3e033f1e5711b5521a0bf09a5d9a48b10ade82b8d6a5362a15921c8b5228a3487479b467db97411d82fa0f95cccae2a7c572ef3c566503e30bac2b2feb2d2f26eebf6d870dcf7f8cf59cea0d21fc4f68ab05bc4dcb23c67008e92c4d466437cdd6ed7aad0c008944c1855108080808080808080").to_vec(), + hex!("f851a0b9890f91ca0d77aa2a4adfaf9b9e40c94cac9e638b6d9797923865872944b646a060a634b9280e3a23fb63375e7bbdd9ab07fd379ab6a67e2312bbc112195fa358808080808080808080808080808080").to_vec(), + hex!("f9030820b9030402f90300018301d6e2b9010000000000000800000000000020040008000000000000000000000000400000008000000000000000000000000000000000000000000000000000000000042010000000001000000000000000000000000000000000040000000000000000000000000000000000000000000000008000000000000000002000000000000000000000000200000000000000200000000000100000000040000001000200008000000000000200000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000f901f5f87a942ffa5ecdbe006d30397c7636d3e015eee251369ff842a0c965575a00553e094ca7c5d14f02e107c258dda06867cbf9e0e69f80e71bbcc1a000000000000000000000000000000000000000000000000000000000000003e8a000000000000000000000000000000000000000000000000000000000000003e8f9011c94ee9170abfbf9421ad6dd07f6bdec9d89f2b581e0f863a01b11dcf133cc240f682dab2d3a8e4cd35c5da8c9cf99adac4336f8512584c5ada000000000000000000000000000000000000000000000000000000000000003e8a00000000000000000000000000000000000000000000000000000000000000001b8a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004b000f000000000000000100d184c103f7acc340847eee82a0b909e3358bc28d440edffa1352b13227e8ee646f3ea37456dec701345772617070656420457468657210574554481235003511000000000000000000000000000000000000000000f858948cf6147918a5cbb672703f879f385036f8793a24e1a01449abf21e49fd025f33495e77f7b1461caefdd3d4bb646424a3f445c4576a5ba0000000000000000000000000440edffa1352b13227e8ee646f3ea37456dec701").to_vec(), + ]), + } + ) + } + + pub fn get_message_verification_header() -> CompactExecutionHeader { + CompactExecutionHeader { + parent_hash: hex!("04a7f6ab8282203562c62f38b0ab41d32aaebe2c7ea687702b463148a6429e04") + .into(), + block_number: 55, + state_root: hex!("894d968712976d613519f973a317cb0781c7b039c89f27ea2b7ca193f7befdb3") + .into(), + receipts_root: hex!("cf0d1c1ba57d1e0edfb59786c7e30c2b7e12bd54612b00cd21c4eaeecedf44fb") + .into(), + } + } +} + +#[cfg(feature = "beacon-spec-mainnet")] +pub mod mainnet { + use super::*; + + type Block = frame_system::mocking::MockBlock; + use sp_runtime::BuildStorage; + + frame_support::construct_runtime!( + pub enum Test { + System: frame_system::{Pallet, Call, Storage, Event}, + Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent}, + EthereumBeaconClient: ethereum_beacon_client::{Pallet, Call, Storage, Event}, + } + ); + + parameter_types! { + pub const BlockHashCount: u64 = 250; + pub const SS58Prefix: u8 = 42; + } + + impl frame_system::Config for Test { + type BaseCallFilter = frame_support::traits::Everything; + type OnSetCode = (); + type BlockWeights = (); + type BlockLength = (); + type DbWeight = (); + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + type RuntimeTask = RuntimeTask; + type Hash = H256; + type Hashing = BlakeTwo256; + type AccountId = u64; + type Lookup = IdentityLookup; + type RuntimeEvent = RuntimeEvent; + type BlockHashCount = BlockHashCount; + type Version = (); + type PalletInfo = PalletInfo; + type AccountData = (); + type OnNewAccount = (); + type OnKilledAccount = (); + type SystemWeightInfo = (); + type SS58Prefix = SS58Prefix; + type MaxConsumers = frame_support::traits::ConstU32<16>; + type Nonce = u64; + type Block = Block; + } + + impl pallet_timestamp::Config for Test { + type Moment = u64; + type OnTimestampSet = (); + type MinimumPeriod = (); + type WeightInfo = (); + } + + parameter_types! { + pub const ChainForkVersions: ForkVersions = ForkVersions{ + genesis: Fork { + version: [0, 0, 16, 32], // 0x00001020 + epoch: 0, + }, + altair: Fork { + version: [1, 0, 16, 32], // 0x01001020 + epoch: 36660, + }, + bellatrix: Fork { + version: [2, 0, 16, 32], // 0x02001020 + epoch: 112260, + }, + capella: Fork { + version: [3, 0, 16, 32], // 0x03001020 + epoch: 162304, + }, + }; + pub const ExecutionHeadersPruneThreshold: u32 = 10; + } + + impl ethereum_beacon_client::Config for Test { + type RuntimeEvent = RuntimeEvent; + type ForkVersions = ChainForkVersions; + type MaxExecutionHeadersToKeep = ExecutionHeadersPruneThreshold; + type WeightInfo = (); + } + + // Build genesis storage according to the mock runtime. + pub fn new_tester() -> sp_io::TestExternalities { + let t = frame_system::GenesisConfig::::default().build_storage().unwrap(); + let mut ext = sp_io::TestExternalities::new(t); + let _ = ext.execute_with(|| Timestamp::set(RuntimeOrigin::signed(1), 30_000)); + ext + } +} diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/tests.rs b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/tests.rs new file mode 100644 index 00000000000..92a93720ae9 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/tests.rs @@ -0,0 +1,1032 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +use crate::{ + config::{EPOCHS_PER_SYNC_COMMITTEE_PERIOD, SLOTS_PER_EPOCH}, + functions::compute_period, + mock::minimal::*, + pallet::ExecutionHeaders, + sync_committee_sum, verify_merkle_branch, BeaconHeader, CompactBeaconState, Error, + ExecutionHeaderBuffer, FinalizedBeaconState, LatestExecutionState, LatestFinalizedBlockRoot, + NextSyncCommittee, SyncCommitteePrepared, +}; + +use frame_support::{assert_err, assert_noop, assert_ok}; +use hex_literal::hex; +use primitives::{ + CompactExecutionHeader, ExecutionHeaderState, Fork, ForkVersions, NextSyncCommitteeUpdate, +}; +use rand::{thread_rng, Rng}; +use snowbridge_core::{ + inbound::{VerificationError, Verifier}, + RingBufferMap, +}; +use sp_core::H256; +use sp_runtime::DispatchError; + +/// Arbitrary hash used for tests and invalid hashes. +const TEST_HASH: [u8; 32] = + hex!["5f6f02af29218292d21a69b64a794a7c0873b3e0f54611972863706e8cbdf371"]; + +/* UNIT TESTS */ + +#[test] +pub fn sum_sync_committee_participation() { + new_tester().execute_with(|| { + assert_eq!(sync_committee_sum(&[0, 1, 0, 1, 1, 0, 1, 0, 1]), 5); + }); +} + +#[test] +pub fn compute_domain() { + new_tester().execute_with(|| { + let domain = EthereumBeaconClient::compute_domain( + hex!("07000000").into(), + hex!("00000001"), + hex!("5dec7ae03261fde20d5b024dfabce8bac3276c9a4908e23d50ba8c9b50b0adff").into(), + ); + + assert_ok!(&domain); + assert_eq!( + domain.unwrap(), + hex!("0700000046324489ceb6ada6d118eacdbe94f49b1fcb49d5481a685979670c7c").into() + ); + }); +} + +#[test] +pub fn compute_signing_root_bls() { + new_tester().execute_with(|| { + let signing_root = EthereumBeaconClient::compute_signing_root( + &BeaconHeader { + slot: 3529537, + proposer_index: 192549, + parent_root: hex!( + "1f8dc05ea427f78e84e2e2666e13c3befb7106fd1d40ef8a3f67cf615f3f2a4c" + ) + .into(), + state_root: hex!( + "0dfb492a83da711996d2d76b64604f9bca9dc08b6c13cf63b3be91742afe724b" + ) + .into(), + body_root: hex!("66fba38f7c8c2526f7ddfe09c1a54dd12ff93bdd4d0df6a0950e88e802228bfa") + .into(), + }, + hex!("07000000afcaaba0efab1ca832a15152469bb09bb84641c405171dfa2d3fb45f").into(), + ); + + assert_ok!(&signing_root); + assert_eq!( + signing_root.unwrap(), + hex!("3ff6e9807da70b2f65cdd58ea1b25ed441a1d589025d2c4091182026d7af08fb").into() + ); + }); +} + +#[test] +pub fn compute_signing_root() { + new_tester().execute_with(|| { + let signing_root = EthereumBeaconClient::compute_signing_root( + &BeaconHeader { + slot: 222472, + proposer_index: 10726, + parent_root: hex!( + "5d481a9721f0ecce9610eab51d400d223683d599b7fcebca7e4c4d10cdef6ebb" + ) + .into(), + state_root: hex!( + "14eb4575895f996a84528b789ff2e4d5148242e2983f03068353b2c37015507a" + ) + .into(), + body_root: hex!("7bb669c75b12e0781d6fa85d7fc2f32d64eafba89f39678815b084c156e46cac") + .into(), + }, + hex!("07000000e7acb21061790987fa1c1e745cccfb358370b33e8af2b2c18938e6c2").into(), + ); + + assert_ok!(&signing_root); + assert_eq!( + signing_root.unwrap(), + hex!("da12b6a6d3516bc891e8a49f82fc1925cec40b9327e06457f695035303f55cd8").into() + ); + }); +} + +#[test] +pub fn compute_domain_bls() { + new_tester().execute_with(|| { + let domain = EthereumBeaconClient::compute_domain( + hex!("07000000").into(), + hex!("01000000"), + hex!("4b363db94e286120d76eb905340fdd4e54bfe9f06bf33ff6cf5ad27f511bfe95").into(), + ); + + assert_ok!(&domain); + assert_eq!( + domain.unwrap(), + hex!("07000000afcaaba0efab1ca832a15152469bb09bb84641c405171dfa2d3fb45f").into() + ); + }); +} + +#[test] +pub fn verify_merkle_branch_for_finalized_root() { + new_tester().execute_with(|| { + assert!(verify_merkle_branch( + hex!("0000000000000000000000000000000000000000000000000000000000000000").into(), + &[ + hex!("0000000000000000000000000000000000000000000000000000000000000000").into(), + hex!("5f6f02af29218292d21a69b64a794a7c0873b3e0f54611972863706e8cbdf371").into(), + hex!("e7125ff9ab5a840c44bedb4731f440a405b44e15f2d1a89e27341b432fabe13d").into(), + hex!("002c1fe5bc0bd62db6f299a582f2a80a6d5748ccc82e7ed843eaf0ae0739f74a").into(), + hex!("d2dc4ba9fd4edff6716984136831e70a6b2e74fca27b8097a820cbbaa5a6e3c3").into(), + hex!("91f77a19d8afa4a08e81164bb2e570ecd10477b3b65c305566a6d2be88510584").into(), + ], + crate::config::FINALIZED_ROOT_INDEX, + crate::config::FINALIZED_ROOT_DEPTH, + hex!("e46559327592741956f6beaa0f52e49625eb85dce037a0bd2eff333c743b287f").into() + )); + }); +} + +#[test] +pub fn verify_merkle_branch_fails_if_depth_and_branch_dont_match() { + new_tester().execute_with(|| { + assert!(!verify_merkle_branch( + hex!("0000000000000000000000000000000000000000000000000000000000000000").into(), + &[ + hex!("0000000000000000000000000000000000000000000000000000000000000000").into(), + hex!("5f6f02af29218292d21a69b64a794a7c0873b3e0f54611972863706e8cbdf371").into(), + hex!("e7125ff9ab5a840c44bedb4731f440a405b44e15f2d1a89e27341b432fabe13d").into(), + ], + crate::config::FINALIZED_ROOT_INDEX, + crate::config::FINALIZED_ROOT_DEPTH, + hex!("e46559327592741956f6beaa0f52e49625eb85dce037a0bd2eff333c743b287f").into() + )); + }); +} + +#[test] +pub fn sync_committee_participation_is_supermajority() { + let bits = + hex!("bffffffff7f1ffdfcfeffeffbfdffffbfffffdffffefefffdffff7f7ffff77fffdf7bff77ffdf7fffafffffff77fefffeff7effffffff5f7fedfffdfb6ddff7b" + ); + let participation = primitives::decompress_sync_committee_bits::<512, 64>(bits); + assert_ok!(EthereumBeaconClient::sync_committee_participation_is_supermajority(&participation)); +} + +#[test] +pub fn sync_committee_participation_is_supermajority_errors_when_not_supermajority() { + new_tester().execute_with(|| { + let participation: [u8; 512] = [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, + 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, + 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + ]; + + assert_err!( + EthereumBeaconClient::sync_committee_participation_is_supermajority(&participation), + Error::::SyncCommitteeParticipantsNotSupermajority + ); + }); +} + +#[test] +pub fn execution_header_pruning() { + new_tester().execute_with(|| { + let execution_header_prune_threshold = ExecutionHeadersPruneThreshold::get(); + let to_be_deleted = execution_header_prune_threshold / 2; + + let mut stored_hashes = vec![]; + + for i in 0..execution_header_prune_threshold { + let mut hash = H256::default(); + thread_rng().try_fill(&mut hash.0[..]).unwrap(); + EthereumBeaconClient::store_execution_header( + hash, + CompactExecutionHeader::default(), + i as u64, + hash, + ); + stored_hashes.push(hash); + } + + // We should have stored everything until now + assert_eq!({ ExecutionHeaders::::iter().count() }, stored_hashes.len()); + + // Let's push extra entries so that some of the previous entries are deleted. + for i in 0..to_be_deleted { + let mut hash = H256::default(); + thread_rng().try_fill(&mut hash.0[..]).unwrap(); + EthereumBeaconClient::store_execution_header( + hash, + CompactExecutionHeader::default(), + (i + execution_header_prune_threshold) as u64, + hash, + ); + + stored_hashes.push(hash); + } + + // We should have only stored upto `execution_header_prune_threshold` + assert_eq!( + ExecutionHeaders::::iter().count() as u32, + execution_header_prune_threshold + ); + + // First `to_be_deleted` items must be deleted + for i in 0..to_be_deleted { + assert!(!ExecutionHeaders::::contains_key(stored_hashes[i as usize])); + } + + // Other entries should be part of data + for i in to_be_deleted..(to_be_deleted + execution_header_prune_threshold) { + assert!(ExecutionHeaders::::contains_key(stored_hashes[i as usize])); + } + }); +} + +#[test] +fn compute_fork_version() { + let mock_fork_versions = ForkVersions { + genesis: Fork { version: [0, 0, 0, 0], epoch: 0 }, + altair: Fork { version: [0, 0, 0, 1], epoch: 10 }, + bellatrix: Fork { version: [0, 0, 0, 2], epoch: 20 }, + capella: Fork { version: [0, 0, 0, 3], epoch: 30 }, + }; + new_tester().execute_with(|| { + assert_eq!(EthereumBeaconClient::select_fork_version(&mock_fork_versions, 0), [0, 0, 0, 0]); + assert_eq!(EthereumBeaconClient::select_fork_version(&mock_fork_versions, 1), [0, 0, 0, 0]); + assert_eq!( + EthereumBeaconClient::select_fork_version(&mock_fork_versions, 10), + [0, 0, 0, 1] + ); + assert_eq!( + EthereumBeaconClient::select_fork_version(&mock_fork_versions, 21), + [0, 0, 0, 2] + ); + assert_eq!( + EthereumBeaconClient::select_fork_version(&mock_fork_versions, 20), + [0, 0, 0, 2] + ); + assert_eq!( + EthereumBeaconClient::select_fork_version(&mock_fork_versions, 32), + [0, 0, 0, 3] + ); + }); +} + +#[test] +fn find_absent_keys() { + let participation: [u8; 32] = [ + 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, + ]; + let update = load_sync_committee_update_fixture(); + let sync_committee_prepared: SyncCommitteePrepared = + (&update.next_sync_committee_update.unwrap().next_sync_committee) + .try_into() + .unwrap(); + + new_tester().execute_with(|| { + let pubkeys = EthereumBeaconClient::find_pubkeys( + &participation, + (*sync_committee_prepared.pubkeys).as_ref(), + false, + ); + assert_eq!(pubkeys.len(), 2); + assert_eq!(pubkeys[0], sync_committee_prepared.pubkeys[0]); + assert_eq!(pubkeys[1], sync_committee_prepared.pubkeys[7]); + }); +} + +#[test] +fn find_present_keys() { + let participation: [u8; 32] = [ + 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 1, 0, + ]; + let update = load_sync_committee_update_fixture(); + let sync_committee_prepared: SyncCommitteePrepared = + (&update.next_sync_committee_update.unwrap().next_sync_committee) + .try_into() + .unwrap(); + + new_tester().execute_with(|| { + let pubkeys = EthereumBeaconClient::find_pubkeys( + &participation, + (*sync_committee_prepared.pubkeys).as_ref(), + true, + ); + assert_eq!(pubkeys.len(), 4); + assert_eq!(pubkeys[0], sync_committee_prepared.pubkeys[1]); + assert_eq!(pubkeys[1], sync_committee_prepared.pubkeys[8]); + assert_eq!(pubkeys[2], sync_committee_prepared.pubkeys[26]); + assert_eq!(pubkeys[3], sync_committee_prepared.pubkeys[30]); + }); +} + +#[test] +fn cross_check_execution_state() { + new_tester().execute_with(|| { + let header_root: H256 = TEST_HASH.into(); + >::insert( + header_root, + CompactBeaconState { + // set slot to period 5 + slot: ((EPOCHS_PER_SYNC_COMMITTEE_PERIOD * SLOTS_PER_EPOCH) * 5) as u64, + block_roots_root: Default::default(), + }, + ); + LatestFinalizedBlockRoot::::set(header_root); + >::set(ExecutionHeaderState { + beacon_block_root: Default::default(), + // set slot to period 2 + beacon_slot: ((EPOCHS_PER_SYNC_COMMITTEE_PERIOD * SLOTS_PER_EPOCH) * 2) as u64, + block_hash: Default::default(), + block_number: 0, + }); + + assert_err!( + EthereumBeaconClient::cross_check_execution_state(), + Error::::ExecutionHeaderTooFarBehind + ); + }); +} + +/* SYNC PROCESS TESTS */ + +#[test] +fn process_initial_checkpoint() { + let checkpoint = load_checkpoint_update_fixture(); + + new_tester().execute_with(|| { + assert_ok!(EthereumBeaconClient::force_checkpoint( + RuntimeOrigin::root(), + Box::new(checkpoint.clone()) + )); + let block_root: H256 = checkpoint.header.hash_tree_root().unwrap(); + assert!(>::contains_key(block_root)); + }); +} + +#[test] +fn process_initial_checkpoint_with_invalid_sync_committee_proof() { + let mut checkpoint = load_checkpoint_update_fixture(); + checkpoint.current_sync_committee_branch[0] = TEST_HASH.into(); + + new_tester().execute_with(|| { + assert_err!( + EthereumBeaconClient::force_checkpoint(RuntimeOrigin::root(), Box::new(checkpoint)), + Error::::InvalidSyncCommitteeMerkleProof + ); + }); +} + +#[test] +fn process_initial_checkpoint_with_invalid_blocks_root_proof() { + let mut checkpoint = load_checkpoint_update_fixture(); + checkpoint.block_roots_branch[0] = TEST_HASH.into(); + + new_tester().execute_with(|| { + assert_err!( + EthereumBeaconClient::force_checkpoint(RuntimeOrigin::root(), Box::new(checkpoint)), + Error::::InvalidBlockRootsRootMerkleProof + ); + }); +} + +#[test] +fn submit_update_in_current_period() { + let checkpoint = load_checkpoint_update_fixture(); + let update = load_finalized_header_update_fixture(); + let initial_period = compute_period(checkpoint.header.slot); + let update_period = compute_period(update.finalized_header.slot); + assert_eq!(initial_period, update_period); + + new_tester().execute_with(|| { + assert_ok!(EthereumBeaconClient::process_checkpoint_update(&checkpoint)); + assert_ok!(EthereumBeaconClient::submit( + RuntimeOrigin::signed(1), + Box::new(update.clone()) + )); + let block_root: H256 = update.finalized_header.hash_tree_root().unwrap(); + assert!(>::contains_key(block_root)); + }); +} + +#[test] +fn submit_update_with_sync_committee_in_current_period() { + let checkpoint = load_checkpoint_update_fixture(); + let update = load_sync_committee_update_fixture(); + let init_period = compute_period(checkpoint.header.slot); + let update_period = compute_period(update.finalized_header.slot); + assert_eq!(init_period, update_period); + + new_tester().execute_with(|| { + assert_ok!(EthereumBeaconClient::process_checkpoint_update(&checkpoint)); + assert!(!>::exists()); + assert_ok!(EthereumBeaconClient::submit(RuntimeOrigin::signed(1), Box::new(update))); + assert!(>::exists()); + }); +} + +#[test] +fn submit_update_in_next_period() { + let checkpoint = load_checkpoint_update_fixture(); + let sync_committee_update = load_sync_committee_update_fixture(); + let update = load_next_finalized_header_update_fixture(); + let sync_committee_period = compute_period(sync_committee_update.finalized_header.slot); + let next_sync_committee_period = compute_period(update.finalized_header.slot); + assert_eq!(sync_committee_period + 1, next_sync_committee_period); + + new_tester().execute_with(|| { + assert_ok!(EthereumBeaconClient::process_checkpoint_update(&checkpoint)); + assert_ok!(EthereumBeaconClient::submit( + RuntimeOrigin::signed(1), + Box::new(sync_committee_update.clone()) + )); + assert_ok!(EthereumBeaconClient::submit( + RuntimeOrigin::signed(1), + Box::new(update.clone()) + )); + let block_root: H256 = update.finalized_header.clone().hash_tree_root().unwrap(); + assert!(>::contains_key(block_root)); + }); +} + +#[test] +fn submit_update_with_invalid_header_proof() { + let checkpoint = load_checkpoint_update_fixture(); + let mut update = load_sync_committee_update_fixture(); + let init_period = compute_period(checkpoint.header.slot); + let update_period = compute_period(update.finalized_header.slot); + assert_eq!(init_period, update_period); + update.finality_branch[0] = TEST_HASH.into(); + + new_tester().execute_with(|| { + assert_ok!(EthereumBeaconClient::process_checkpoint_update(&checkpoint)); + assert!(!>::exists()); + assert_err!( + EthereumBeaconClient::submit(RuntimeOrigin::signed(1), Box::new(update)), + Error::::InvalidHeaderMerkleProof + ); + }); +} + +#[test] +fn submit_update_with_invalid_block_roots_proof() { + let checkpoint = load_checkpoint_update_fixture(); + let mut update = load_sync_committee_update_fixture(); + let init_period = compute_period(checkpoint.header.slot); + let update_period = compute_period(update.finalized_header.slot); + assert_eq!(init_period, update_period); + update.block_roots_branch[0] = TEST_HASH.into(); + + new_tester().execute_with(|| { + assert_ok!(EthereumBeaconClient::process_checkpoint_update(&checkpoint)); + assert!(!>::exists()); + assert_err!( + EthereumBeaconClient::submit(RuntimeOrigin::signed(1), Box::new(update)), + Error::::InvalidBlockRootsRootMerkleProof + ); + }); +} + +#[test] +fn submit_update_with_invalid_next_sync_committee_proof() { + let checkpoint = load_checkpoint_update_fixture(); + let mut update = load_sync_committee_update_fixture(); + let init_period = compute_period(checkpoint.header.slot); + let update_period = compute_period(update.finalized_header.slot); + assert_eq!(init_period, update_period); + if let Some(ref mut next_sync_committee_update) = update.next_sync_committee_update { + next_sync_committee_update.next_sync_committee_branch[0] = TEST_HASH.into(); + } + + new_tester().execute_with(|| { + assert_ok!(EthereumBeaconClient::process_checkpoint_update(&checkpoint)); + assert!(!>::exists()); + assert_err!( + EthereumBeaconClient::submit(RuntimeOrigin::signed(1), Box::new(update)), + Error::::InvalidSyncCommitteeMerkleProof + ); + }); +} + +#[test] +fn submit_update_with_skipped_period() { + let checkpoint = load_checkpoint_update_fixture(); + let sync_committee_update = load_sync_committee_update_fixture(); + let mut update = load_next_finalized_header_update_fixture(); + update.signature_slot += (EPOCHS_PER_SYNC_COMMITTEE_PERIOD * SLOTS_PER_EPOCH) as u64; + update.attested_header.slot = update.signature_slot - 1; + + new_tester().execute_with(|| { + assert_ok!(EthereumBeaconClient::process_checkpoint_update(&checkpoint)); + assert_ok!(EthereumBeaconClient::submit( + RuntimeOrigin::signed(1), + Box::new(sync_committee_update.clone()) + )); + assert_err!( + EthereumBeaconClient::submit(RuntimeOrigin::signed(1), Box::new(update)), + Error::::SkippedSyncCommitteePeriod + ); + }); +} + +#[test] +fn submit_update_with_sync_committee_in_next_period() { + let checkpoint = load_checkpoint_update_fixture(); + let update = load_sync_committee_update_fixture(); + let next_update = load_next_sync_committee_update_fixture(); + let update_period = compute_period(update.finalized_header.slot); + let next_update_period = compute_period(next_update.finalized_header.slot); + assert_eq!(update_period + 1, next_update_period); + + new_tester().execute_with(|| { + assert_ok!(EthereumBeaconClient::process_checkpoint_update(&checkpoint)); + assert!(!>::exists()); + assert_ok!(EthereumBeaconClient::submit( + RuntimeOrigin::signed(1), + Box::new(update.clone()) + )); + assert!(>::exists()); + assert_ok!(EthereumBeaconClient::submit( + RuntimeOrigin::signed(1), + Box::new(next_update.clone()) + )); + let last_finalized_state = + FinalizedBeaconState::::get(LatestFinalizedBlockRoot::::get()).unwrap(); + let last_synced_period = compute_period(last_finalized_state.slot); + assert_eq!(last_synced_period, next_update_period); + }); +} + +#[test] +fn submit_update_with_sync_committee_invalid_signature_slot() { + let checkpoint = load_checkpoint_update_fixture(); + let mut update = load_sync_committee_update_fixture(); + + new_tester().execute_with(|| { + assert_ok!(EthereumBeaconClient::process_checkpoint_update(&checkpoint)); + + // makes a invalid update with signature_slot should be more than attested_slot + update.signature_slot = update.attested_header.slot; + + assert_err!( + EthereumBeaconClient::submit(RuntimeOrigin::signed(1), Box::new(update)), + Error::::InvalidUpdateSlot + ); + }); +} + +#[test] +fn submit_update_with_skipped_sync_committee_period() { + let checkpoint = load_checkpoint_update_fixture(); + let finalized_update = load_next_finalized_header_update_fixture(); + let checkpoint_period = compute_period(checkpoint.header.slot); + let next_sync_committee_period = compute_period(finalized_update.finalized_header.slot); + assert_eq!(checkpoint_period + 1, next_sync_committee_period); + + new_tester().execute_with(|| { + assert_ok!(EthereumBeaconClient::process_checkpoint_update(&checkpoint)); + assert_err!( + EthereumBeaconClient::submit(RuntimeOrigin::signed(1), Box::new(finalized_update)), + Error::::SkippedSyncCommitteePeriod + ); + }); +} + +#[test] +fn submit_update_execution_headers_too_far_behind() { + let checkpoint = load_checkpoint_update_fixture(); + let finalized_header_update = load_finalized_header_update_fixture(); + let execution_header_update = load_execution_header_update_fixture(); + let next_update = load_next_sync_committee_update_fixture(); + + new_tester().execute_with(|| { + let far_ahead_finalized_header_slot = finalized_header_update.finalized_header.slot + + (EPOCHS_PER_SYNC_COMMITTEE_PERIOD * SLOTS_PER_EPOCH * 2) as u64; + assert_ok!(EthereumBeaconClient::process_checkpoint_update(&checkpoint)); + assert_ok!(EthereumBeaconClient::submit( + RuntimeOrigin::signed(1), + Box::new(finalized_header_update) + )); + assert_ok!(EthereumBeaconClient::submit_execution_header( + RuntimeOrigin::signed(1), + Box::new(execution_header_update) + )); + + let header_root: H256 = TEST_HASH.into(); + >::insert( + header_root, + CompactBeaconState { + slot: far_ahead_finalized_header_slot, + block_roots_root: Default::default(), + }, + ); + LatestFinalizedBlockRoot::::set(header_root); + + assert_err!( + EthereumBeaconClient::submit(RuntimeOrigin::signed(1), Box::new(next_update)), + Error::::ExecutionHeaderTooFarBehind + ); + }); +} + +#[test] +fn submit_irrelevant_update() { + let checkpoint = load_checkpoint_update_fixture(); + let mut update = load_next_finalized_header_update_fixture(); + + new_tester().execute_with(|| { + assert_ok!(EthereumBeaconClient::process_checkpoint_update(&checkpoint)); + + // makes an invalid update where the attested_header slot value should be greater than the + // checkpoint slot value + update.finalized_header.slot = checkpoint.header.slot; + update.attested_header.slot = checkpoint.header.slot; + update.signature_slot = checkpoint.header.slot + 1; + + assert_err!( + EthereumBeaconClient::submit(RuntimeOrigin::signed(1), Box::new(update)), + Error::::IrrelevantUpdate + ); + }); +} + +#[test] +fn submit_update_with_missing_bootstrap() { + let update = load_next_finalized_header_update_fixture(); + + new_tester().execute_with(|| { + assert_err!( + EthereumBeaconClient::submit(RuntimeOrigin::signed(1), Box::new(update)), + Error::::NotBootstrapped + ); + }); +} + +#[test] +fn submit_update_with_invalid_sync_committee_update() { + let checkpoint = load_checkpoint_update_fixture(); + let update = load_sync_committee_update_fixture(); + let mut next_update = load_next_sync_committee_update_fixture(); + + new_tester().execute_with(|| { + assert_ok!(EthereumBeaconClient::process_checkpoint_update(&checkpoint)); + + assert_ok!(EthereumBeaconClient::submit(RuntimeOrigin::signed(1), Box::new(update))); + + // makes update with invalid next_sync_committee + >::mutate(>::get(), |x| { + let prev = x.unwrap(); + *x = Some(CompactBeaconState { slot: next_update.attested_header.slot, ..prev }); + }); + next_update.attested_header.slot += 1; + next_update.signature_slot = next_update.attested_header.slot + 1; + let next_sync_committee = NextSyncCommitteeUpdate::default(); + next_update.next_sync_committee_update = Some(next_sync_committee); + + assert_err!( + EthereumBeaconClient::submit(RuntimeOrigin::signed(1), Box::new(next_update)), + Error::::InvalidSyncCommitteeUpdate + ); + }); +} + +#[test] +fn submit_execution_header_update() { + let checkpoint = load_checkpoint_update_fixture(); + let finalized_header_update = load_finalized_header_update_fixture(); + let execution_header_update = load_execution_header_update_fixture(); + + new_tester().execute_with(|| { + assert_ok!(EthereumBeaconClient::process_checkpoint_update(&checkpoint)); + assert_ok!(EthereumBeaconClient::submit( + RuntimeOrigin::signed(1), + Box::new(finalized_header_update) + )); + assert_ok!(EthereumBeaconClient::submit_execution_header( + RuntimeOrigin::signed(1), + Box::new(execution_header_update.clone()) + )); + assert!(>::contains_key( + execution_header_update.execution_header.block_hash + )); + }); +} + +#[test] +fn submit_execution_header_update_invalid_ancestry_proof() { + let checkpoint = load_checkpoint_update_fixture(); + let finalized_header_update = load_finalized_header_update_fixture(); + let mut execution_header_update = load_execution_header_update_fixture(); + if let Some(ref mut ancestry_proof) = execution_header_update.ancestry_proof { + ancestry_proof.header_branch[0] = TEST_HASH.into() + } + + new_tester().execute_with(|| { + assert_ok!(EthereumBeaconClient::process_checkpoint_update(&checkpoint)); + assert_ok!(EthereumBeaconClient::submit( + RuntimeOrigin::signed(1), + Box::new(finalized_header_update) + )); + assert_err!( + EthereumBeaconClient::submit_execution_header( + RuntimeOrigin::signed(1), + Box::new(execution_header_update) + ), + Error::::InvalidAncestryMerkleProof + ); + }); +} + +#[test] +fn submit_execution_header_update_invalid_execution_header_proof() { + let checkpoint = load_checkpoint_update_fixture(); + let finalized_header_update = load_finalized_header_update_fixture(); + let mut execution_header_update = load_execution_header_update_fixture(); + execution_header_update.execution_branch[0] = TEST_HASH.into(); + + new_tester().execute_with(|| { + assert_ok!(EthereumBeaconClient::process_checkpoint_update(&checkpoint)); + assert_ok!(EthereumBeaconClient::submit( + RuntimeOrigin::signed(1), + Box::new(finalized_header_update) + )); + assert_err!( + EthereumBeaconClient::submit_execution_header( + RuntimeOrigin::signed(1), + Box::new(execution_header_update) + ), + Error::::InvalidExecutionHeaderProof + ); + }); +} + +#[test] +fn submit_execution_header_update_that_skips_block() { + let checkpoint = load_checkpoint_update_fixture(); + let finalized_header_update = load_finalized_header_update_fixture(); + let execution_header_update = load_execution_header_update_fixture(); + let mut skipped_block_execution_header_update = load_execution_header_update_fixture(); + skipped_block_execution_header_update.execution_header.block_number = + execution_header_update.execution_header.block_number + 2; + + new_tester().execute_with(|| { + assert_ok!(EthereumBeaconClient::process_checkpoint_update(&checkpoint)); + assert_ok!(EthereumBeaconClient::submit( + RuntimeOrigin::signed(1), + Box::new(finalized_header_update) + )); + assert_ok!(EthereumBeaconClient::submit_execution_header( + RuntimeOrigin::signed(1), + Box::new(execution_header_update.clone()) + )); + assert!(>::contains_key( + execution_header_update.execution_header.block_hash + )); + assert_err!( + EthereumBeaconClient::submit_execution_header( + RuntimeOrigin::signed(1), + Box::new(skipped_block_execution_header_update) + ), + Error::::ExecutionHeaderSkippedBlock + ); + }); +} + +#[test] +fn submit_execution_header_update_that_is_also_finalized_header_which_is_not_stored() { + let checkpoint = load_checkpoint_update_fixture(); + let finalized_header_update = load_finalized_header_update_fixture(); + let mut execution_header_update = load_execution_header_update_fixture(); + execution_header_update.ancestry_proof = None; + + new_tester().execute_with(|| { + assert_ok!(EthereumBeaconClient::process_checkpoint_update(&checkpoint)); + assert_ok!(EthereumBeaconClient::submit( + RuntimeOrigin::signed(1), + Box::new(finalized_header_update) + )); + assert_err!( + EthereumBeaconClient::submit_execution_header( + RuntimeOrigin::signed(1), + Box::new(execution_header_update) + ), + Error::::ExpectedFinalizedHeaderNotStored + ); + }); +} + +#[test] +fn submit_execution_header_update_that_is_also_finalized_header_which_is_stored_but_slots_dont_match( +) { + let checkpoint = load_checkpoint_update_fixture(); + let finalized_header_update = load_finalized_header_update_fixture(); + let mut execution_header_update = load_execution_header_update_fixture(); + execution_header_update.ancestry_proof = None; + + new_tester().execute_with(|| { + assert_ok!(EthereumBeaconClient::process_checkpoint_update(&checkpoint)); + assert_ok!(EthereumBeaconClient::submit( + RuntimeOrigin::signed(1), + Box::new(finalized_header_update) + )); + + let block_root: H256 = execution_header_update.header.hash_tree_root().unwrap(); + + >::insert( + block_root, + CompactBeaconState { + slot: execution_header_update.header.slot + 1, + block_roots_root: Default::default(), + }, + ); + LatestFinalizedBlockRoot::::set(block_root); + + assert_err!( + EthereumBeaconClient::submit_execution_header( + RuntimeOrigin::signed(1), + Box::new(execution_header_update) + ), + Error::::ExpectedFinalizedHeaderNotStored + ); + }); +} + +#[test] +fn submit_execution_header_not_finalized() { + let checkpoint = load_checkpoint_update_fixture(); + let finalized_header_update = load_finalized_header_update_fixture(); + let update = load_execution_header_update_fixture(); + + new_tester().execute_with(|| { + assert_ok!(EthereumBeaconClient::process_checkpoint_update(&checkpoint)); + assert_ok!(EthereumBeaconClient::submit( + RuntimeOrigin::signed(1), + Box::new(finalized_header_update) + )); + + >::mutate(>::get(), |x| { + let prev = x.unwrap(); + *x = Some(CompactBeaconState { slot: update.header.slot - 1, ..prev }); + }); + + assert_err!( + EthereumBeaconClient::submit_execution_header( + RuntimeOrigin::signed(1), + Box::new(update) + ), + Error::::HeaderNotFinalized + ); + }); +} + +/* IMPLS */ + +#[test] +fn verify_message() { + let header = get_message_verification_header(); + let (event_log, proof) = get_message_verification_payload(); + let block_hash = proof.block_hash; + + new_tester().execute_with(|| { + >::insert(block_hash, header); + assert_ok!(EthereumBeaconClient::verify(&event_log, &proof)); + }); +} + +#[test] +fn verify_message_missing_header() { + let (event_log, proof) = get_message_verification_payload(); + + new_tester().execute_with(|| { + assert_err!( + EthereumBeaconClient::verify(&event_log, &proof), + VerificationError::HeaderNotFound + ); + }); +} + +#[test] +fn verify_message_invalid_proof() { + let header = get_message_verification_header(); + let (event_log, mut proof) = get_message_verification_payload(); + proof.data.1[0] = TEST_HASH.into(); + let block_hash = proof.block_hash; + + new_tester().execute_with(|| { + >::insert(block_hash, header); + assert_err!( + EthereumBeaconClient::verify(&event_log, &proof), + VerificationError::InvalidProof + ); + }); +} + +#[test] +fn verify_message_invalid_receipts_root() { + let mut header = get_message_verification_header(); + let (event_log, proof) = get_message_verification_payload(); + let block_hash = proof.block_hash; + header.receipts_root = TEST_HASH.into(); + + new_tester().execute_with(|| { + >::insert(block_hash, header); + assert_err!( + EthereumBeaconClient::verify(&event_log, &proof), + VerificationError::InvalidProof + ); + }); +} + +#[test] +fn verify_message_invalid_log() { + let header = get_message_verification_header(); + let (mut event_log, proof) = get_message_verification_payload(); + let block_hash = proof.block_hash; + event_log.topics = vec![H256::zero(); 10]; + + new_tester().execute_with(|| { + >::insert(block_hash, header); + assert_err!( + EthereumBeaconClient::verify(&event_log, &proof), + VerificationError::InvalidLog + ); + }); +} + +#[test] +fn verify_message_receipt_does_not_contain_log() { + let header = get_message_verification_header(); + let (mut event_log, proof) = get_message_verification_payload(); + let block_hash = proof.block_hash; + event_log.data = hex!("f9013c94ee9170abfbf9421ad6dd07f6bdec9d89f2b581e0f863a01b11dcf133cc240f682dab2d3a8e4cd35c5da8c9cf99adac4336f8512584c5ada000000000000000000000000000000000000000000000000000000000000003e8a00000000000000000000000000000000000000000000000000000000000000002b8c000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000068000f000000000000000101d184c103f7acc340847eee82a0b909e3358bc28d440edffa1352b13227e8ee646f3ea37456dec70100000101001cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c0000e8890423c78a0000000000000000000000000000000000000000000000000000000000000000").to_vec(); + + new_tester().execute_with(|| { + >::insert(block_hash, header); + assert_err!( + EthereumBeaconClient::verify(&event_log, &proof), + VerificationError::LogNotFound + ); + }); +} + +#[test] +fn set_operating_mode() { + let checkpoint = load_checkpoint_update_fixture(); + let update = load_finalized_header_update_fixture(); + let execution_header_update = load_execution_header_update_fixture(); + + new_tester().execute_with(|| { + assert_ok!(EthereumBeaconClient::process_checkpoint_update(&checkpoint)); + + assert_ok!(EthereumBeaconClient::set_operating_mode( + RuntimeOrigin::root(), + snowbridge_core::BasicOperatingMode::Halted + )); + + assert_noop!( + EthereumBeaconClient::submit(RuntimeOrigin::signed(1), Box::new(update)), + Error::::Halted + ); + + assert_noop!( + EthereumBeaconClient::submit_execution_header( + RuntimeOrigin::signed(1), + Box::new(execution_header_update) + ), + Error::::Halted + ); + }); +} + +#[test] +fn set_operating_mode_root_only() { + new_tester().execute_with(|| { + assert_noop!( + EthereumBeaconClient::set_operating_mode( + RuntimeOrigin::signed(1), + snowbridge_core::BasicOperatingMode::Halted + ), + DispatchError::BadOrigin + ); + }); +} diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/types.rs b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/types.rs new file mode 100644 index 00000000000..5dcefea9f80 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/types.rs @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +pub use crate::config::{ + SLOTS_PER_HISTORICAL_ROOT, SYNC_COMMITTEE_BITS_SIZE as SC_BITS_SIZE, + SYNC_COMMITTEE_SIZE as SC_SIZE, +}; +use frame_support::storage::types::OptionQuery; +use snowbridge_core::RingBufferMapImpl; + +// Specialize types based on configured sync committee size +pub type SyncCommittee = primitives::SyncCommittee; +pub type SyncCommitteePrepared = primitives::SyncCommitteePrepared; +pub type SyncAggregate = primitives::SyncAggregate; +pub type CheckpointUpdate = primitives::CheckpointUpdate; +pub type Update = primitives::Update; +pub type NextSyncCommitteeUpdate = primitives::NextSyncCommitteeUpdate; + +pub use primitives::ExecutionHeaderUpdate; + +/// ExecutionHeader ring buffer implementation +pub type ExecutionHeaderBuffer = RingBufferMapImpl< + u32, + ::MaxExecutionHeadersToKeep, + crate::ExecutionHeaderIndex, + crate::ExecutionHeaderMapping, + crate::ExecutionHeaders, + OptionQuery, +>; + +/// FinalizedState ring buffer implementation +pub(crate) type FinalizedBeaconStateBuffer = RingBufferMapImpl< + u32, + crate::MaxFinalizedHeadersToKeep, + crate::FinalizedBeaconStateIndex, + crate::FinalizedBeaconStateMapping, + crate::FinalizedBeaconState, + OptionQuery, +>; diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/weights.rs b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/weights.rs new file mode 100644 index 00000000000..69d3e809986 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/weights.rs @@ -0,0 +1,68 @@ +//! Autogenerated weights for ethereum_beacon_client +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2022-09-27, STEPS: `10`, REPEAT: 10, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("/tmp/snowbridge/spec.json"), DB CACHE: 1024 + +// Executed Command: +// ./target/release/snowbridge +// benchmark +// pallet +// --chain +// /tmp/snowbridge/spec.json +// --execution=wasm +// --pallet +// ethereum_beacon_client +// --extrinsic +// * +// --steps +// 10 +// --repeat +// 10 +// --output +// pallets/ethereum-beacon-client/src/weights.rs +// --template +// templates/module-weight-template.hbs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; +use sp_std::marker::PhantomData; + +/// Weight functions needed for ethereum_beacon_client. +pub trait WeightInfo { + fn force_checkpoint() -> Weight; + fn submit() -> Weight; + fn submit_with_sync_committee() -> Weight; + fn submit_execution_header() -> Weight; +} + +// For backwards compatibility and tests +impl WeightInfo for () { + fn force_checkpoint() -> Weight { + Weight::from_parts(97_263_571_000_u64, 0) + .saturating_add(Weight::from_parts(0, 3501)) + .saturating_add(RocksDbWeight::get().reads(2)) + .saturating_add(RocksDbWeight::get().writes(9)) + } + fn submit() -> Weight { + Weight::from_parts(26_051_019_000_u64, 0) + .saturating_add(Weight::from_parts(0, 93857)) + .saturating_add(RocksDbWeight::get().reads(8)) + .saturating_add(RocksDbWeight::get().writes(4)) + } + fn submit_with_sync_committee() -> Weight { + Weight::from_parts(122_461_312_000_u64, 0) + .saturating_add(Weight::from_parts(0, 93857)) + .saturating_add(RocksDbWeight::get().reads(6)) + .saturating_add(RocksDbWeight::get().writes(1)) + } + fn submit_execution_header() -> Weight { + Weight::from_parts(113_158_000_u64, 0) + .saturating_add(Weight::from_parts(0, 3537)) + .saturating_add(RocksDbWeight::get().reads(5)) + .saturating_add(RocksDbWeight::get().writes(4)) + } +} diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/execution-header-update.minimal.json b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/execution-header-update.minimal.json new file mode 100644 index 00000000000..3e17c14f4ad --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/execution-header-update.minimal.json @@ -0,0 +1,43 @@ +{ + "header": { + "slot": 3622, + "proposer_index": 7, + "parent_root": "0x254c9215f6cce83e21b9776afb482181639602d3cb58cf99452a6a4a4f603930", + "state_root": "0xea98df6d30817d63f3e54ea118e2b1ba8675753c72dec1661c503d4eb43f9bdd", + "body_root": "0x765a0616a31d38e0ca2d10f6e8b234dd3d07e16aa929bcbc4de775c93f1972fd" + }, + "ancestry_proof": { + "header_branch": [ + "0x7690506882ac8c5f01d00f3ade06439259a3a0261ef5d61ec44920678b4104e6", + "0xf01aa0fdd7c9ef7b1affb7854fe8cbcc5c70643ee5b83e032faa702a0675a8cb", + "0x273a7b300b75ffa2c765af50680aa836299264f2107f38010278822313181801", + "0x30fe73a3bae6a31af32656ab759a4b67d27a213e01012b96cc4fedd0f2e77c75", + "0x7246cb3a35f13a1f0bbf907887985bb5382c45f2aa1699dbca48a0a82d5330af", + "0x5e7270e88a22dd4a905b2e76da2c8c358baeddd34de6c64a71bb1c80070ab717" + ], + "finalized_block_root": "0xa6fdc5df11c1759d11c9f0353a666715e5677e9ffd7d414e44cff0970553f1c9" + }, + "execution_header": { + "parent_hash": "0x6c9657f1267ad6040ea017ff6d02b55c4ba25cb092b8326d321dd98d01d1ee64", + "fee_recipient": "0x0000000000000000000000000000000000000000", + "state_root": "0x01f975f7cdff9b0a8844304aa59062fe18af0fef4636539312dfe20d238600ba", + "receipts_root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logs_bloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prev_randao": "0xcdfcab74bc26b3f4311afdc72d2d21d33a4b045187a01fa208a9d687a6d1d25c", + "block_number": 3622, + "gas_limit": 30000000, + "gas_used": 0, + "timestamp": 1685722543, + "extra_data": "0xd983010b02846765746888676f312e31392e358664617277696e", + "base_fee_per_gas": 7, + "block_hash": "0x38c80e0e26cb80730df627d32f50266bd0fe32fb12b7606300ad81aa2b4033db", + "transactions_root": "0x7ffe241ea60187fdb0187bfa22de35d1f9bed7ab061d9401fd47e34a54fbede1", + "withdrawals_root": "0x28ba1834a3a7b657460ce79fa3a1d909ab8828fd557659d4d0554a9bdbc0ec30" + }, + "execution_branch": [ + "0x005b8d55b34b4323bfd4773c28b09eb53bc87959e65411ccd23728c7e42d5ff2", + "0x336488033fe5f3ef4ccc12af07b9370b92e553e35ecb4a337a1b1c0e4afe1e0e", + "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71", + "0x7061330dada1ba1c602ba98f647a441885460ed0db00483fea1282385dfab84b" + ] +} \ No newline at end of file diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/finalized-header-update.minimal.json b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/finalized-header-update.minimal.json new file mode 100644 index 00000000000..c6473529b10 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/finalized-header-update.minimal.json @@ -0,0 +1,38 @@ +{ + "attested_header": { + "slot": 3640, + "proposer_index": 5, + "parent_root": "0xf062fcec9c3379a08e6add37a834b1e39af395fc343973e44957ecebbf2ecddd", + "state_root": "0xb1581cb62fe376e305e02f26463153f5dfb804d8df97ef40fc315c1bc30731ba", + "body_root": "0x98461abcc6d130b7bcb9430292c8a269ea9f01082685347e2968d892f716067c" + }, + "sync_aggregate": { + "sync_committee_bits": "0xffffffff", + "sync_committee_signature": "0x925c6e4b67890a7e28a7ca19853f88247e92014b9d233ac9058efd4f3827f0055db308debe17596e635b93727b5a851e1366ca801f30b03fdec722f45011504702a27646488b5ab5e3428fe7b4d4a50132f374612f66e45d68db27c568f96f08" + }, + "signature_slot": 3641, + "next_sync_committee_update": null, + "finalized_header": { + "slot": 3624, + "proposer_index": 7, + "parent_root": "0x7690506882ac8c5f01d00f3ade06439259a3a0261ef5d61ec44920678b4104e6", + "state_root": "0x3726ebb8d9973977a71a8389caf5fc5830eeb8cd4fdfbbc7b0c4e6ca3e6a4090", + "body_root": "0x0f9a3f0fa5a4ffaf7c10504c86f23e7d554366ffd069fe958a160b253c3fd409" + }, + "finality_branch": [ + "0xc501000000000000000000000000000000000000000000000000000000000000", + "0x10c726fac935bf9657cc7476d3cfa7bedec5983dcfb59e8a7df6d0a619e108d7", + "0x83c3d5360d254f4a44be712c1f433e88e810b6d1e0e789e90bada9e36126b857", + "0x97245fa01a89a6d7b4542cd731fef699f58b2bbaabdd6f641334c9e9eeae3a20", + "0xc3d19c773f66ab94bc2106d5e75a3205398dd6e94b6f8a5716f347741eb9fc5a", + "0x9e5040e56d765c1add56779a716be7497be27cba37f866cd8d34418d55e48715" + ], + "block_roots_root": "0x29a54625749fa25f9e36df14a3baa335c58246bba2f8c7eb8b1ec2e4908e2fd0", + "block_roots_branch": [ + "0x53616f9298818a8423c98adc47c92aaf82f0c5c911dc4ee5f88ba6d3022341c1", + "0x5d2f1c4bce6f63f26cbe3fbf480281c04a6b14bea74350a88ee945354ecbd79d", + "0x8333eefc7eaa4d10091e2014b3aae2bf6bd2d10c22c67100e189f8ab6caab261", + "0x3edfa69130bc193dec47c27a5903f03d5262b75899b69c0e95ac1816a664a3e7", + "0x5e046000f85aede8d4c28140b27778488d4ad21b1e16e345055d07ee53f2711b" + ] +} \ No newline at end of file diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/initial-checkpoint.minimal.json b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/initial-checkpoint.minimal.json new file mode 100644 index 00000000000..a7e48f45901 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/initial-checkpoint.minimal.json @@ -0,0 +1,62 @@ +{ + "header": { + "slot": 3616, + "proposer_index": 7, + "parent_root": "0x6c5e8c7b32b7bfbb250fa8fd7bc348d7325fb2bfc869e4c506af6802fcad87f4", + "state_root": "0x3e467e3429a1ae36572fe3fe1c953381242e950254cf97c7527a8cea8aa6c9de", + "body_root": "0x7da749680d2b0b4f779047fcfe7d0c13d247f6d23478817fe9c6fbe07993adb2" + }, + "current_sync_committee": { + "pubkeys": [ + "0xab0bdda0f85f842f431beaccf1250bf1fd7ba51b4100fd64364b6401fda85bb0069b3e715b58819684e7fc0b10a72a34", + "0x81283b7a20e1ca460ebd9bbd77005d557370cabb1f9a44f530c4c4c66230f675f8df8b4c2818851aa7d77a80ca5a4a5e", + "0x9977f1c8b731a8d5558146bfb86caea26434f3c5878b589bf280a42c9159e700e9df0e4086296c20b011d2e78c27d373", + "0xa3a32b0f8b4ddb83f1a0a853d81dd725dfe577d4f4c3db8ece52ce2b026eca84815c1a7e8e92a4de3d755733bf7e4a9b", + "0xb89bebc699769726a318c8e9971bd3171297c61aea4a6578a7a4f94b547dcba5bac16a89108b6b6a1fe3695d1a874a0b", + "0xa8d4c7c27795a725961317ef5953a7032ed6d83739db8b0e8a72353d1b8b4439427f7efa2c89caa03cc9f28f8cbab8ac", + "0x88c141df77cd9d8d7a71a75c826c41a9c9f03c6ee1b180f3e7852f6a280099ded351b58d66e653af8e42816a4d8f532e", + "0xa99a76ed7796f7be22d5b7e85deeb7c5677e88e511e0b337618f8c4eb61349b4bf2d153f649f7b53359fe8b94a38e44c", + "0xab0bdda0f85f842f431beaccf1250bf1fd7ba51b4100fd64364b6401fda85bb0069b3e715b58819684e7fc0b10a72a34", + "0x81283b7a20e1ca460ebd9bbd77005d557370cabb1f9a44f530c4c4c66230f675f8df8b4c2818851aa7d77a80ca5a4a5e", + "0x9977f1c8b731a8d5558146bfb86caea26434f3c5878b589bf280a42c9159e700e9df0e4086296c20b011d2e78c27d373", + "0xa3a32b0f8b4ddb83f1a0a853d81dd725dfe577d4f4c3db8ece52ce2b026eca84815c1a7e8e92a4de3d755733bf7e4a9b", + "0xb89bebc699769726a318c8e9971bd3171297c61aea4a6578a7a4f94b547dcba5bac16a89108b6b6a1fe3695d1a874a0b", + "0xa8d4c7c27795a725961317ef5953a7032ed6d83739db8b0e8a72353d1b8b4439427f7efa2c89caa03cc9f28f8cbab8ac", + "0x88c141df77cd9d8d7a71a75c826c41a9c9f03c6ee1b180f3e7852f6a280099ded351b58d66e653af8e42816a4d8f532e", + "0xa99a76ed7796f7be22d5b7e85deeb7c5677e88e511e0b337618f8c4eb61349b4bf2d153f649f7b53359fe8b94a38e44c", + "0xab0bdda0f85f842f431beaccf1250bf1fd7ba51b4100fd64364b6401fda85bb0069b3e715b58819684e7fc0b10a72a34", + "0x81283b7a20e1ca460ebd9bbd77005d557370cabb1f9a44f530c4c4c66230f675f8df8b4c2818851aa7d77a80ca5a4a5e", + "0x9977f1c8b731a8d5558146bfb86caea26434f3c5878b589bf280a42c9159e700e9df0e4086296c20b011d2e78c27d373", + "0xa3a32b0f8b4ddb83f1a0a853d81dd725dfe577d4f4c3db8ece52ce2b026eca84815c1a7e8e92a4de3d755733bf7e4a9b", + "0xb89bebc699769726a318c8e9971bd3171297c61aea4a6578a7a4f94b547dcba5bac16a89108b6b6a1fe3695d1a874a0b", + "0xa8d4c7c27795a725961317ef5953a7032ed6d83739db8b0e8a72353d1b8b4439427f7efa2c89caa03cc9f28f8cbab8ac", + "0x88c141df77cd9d8d7a71a75c826c41a9c9f03c6ee1b180f3e7852f6a280099ded351b58d66e653af8e42816a4d8f532e", + "0xa99a76ed7796f7be22d5b7e85deeb7c5677e88e511e0b337618f8c4eb61349b4bf2d153f649f7b53359fe8b94a38e44c", + "0xab0bdda0f85f842f431beaccf1250bf1fd7ba51b4100fd64364b6401fda85bb0069b3e715b58819684e7fc0b10a72a34", + "0x81283b7a20e1ca460ebd9bbd77005d557370cabb1f9a44f530c4c4c66230f675f8df8b4c2818851aa7d77a80ca5a4a5e", + "0x9977f1c8b731a8d5558146bfb86caea26434f3c5878b589bf280a42c9159e700e9df0e4086296c20b011d2e78c27d373", + "0xa3a32b0f8b4ddb83f1a0a853d81dd725dfe577d4f4c3db8ece52ce2b026eca84815c1a7e8e92a4de3d755733bf7e4a9b", + "0xb89bebc699769726a318c8e9971bd3171297c61aea4a6578a7a4f94b547dcba5bac16a89108b6b6a1fe3695d1a874a0b", + "0xa8d4c7c27795a725961317ef5953a7032ed6d83739db8b0e8a72353d1b8b4439427f7efa2c89caa03cc9f28f8cbab8ac", + "0x88c141df77cd9d8d7a71a75c826c41a9c9f03c6ee1b180f3e7852f6a280099ded351b58d66e653af8e42816a4d8f532e", + "0xa99a76ed7796f7be22d5b7e85deeb7c5677e88e511e0b337618f8c4eb61349b4bf2d153f649f7b53359fe8b94a38e44c" + ], + "aggregate_pubkey": "0x8fe11476a05750c52618deb79918e2e674f56dfbf12dbce55ae4386d108e8a1e83c6326f5957e2ef19137582ce270dc6" + }, + "current_sync_committee_branch": [ + "0x46af3f54acbea439b63aa5bb699c8f25ff584b23912366788f7c8e95011ce324", + "0x41dcb71ec3b3940399118d28e09fdc58a8e33b818b8c5cbb933c59929504ca08", + "0xfa53febb29348e3493a50c0e7c6d35796bf69c54dfc6f42f7600612789d0ed6d", + "0x5e7ea1693066b604fc60d4657b43e7a4aafd3f4f54d9a740d2abe765e92d8385", + "0x16c9bca64a82e80c23817bfec345d088e0adc3865e392965c1244f97979f816a" + ], + "validators_root": "0x270d43e74ce340de4bca2b1936beca0f4f5408d9e78aec4850920baf659d5b69", + "block_roots_root": "0x00f6bbdeac1e1a922a9bf0e78720c0bffe558d8195e8ede8cb72bbd295f242f2", + "block_roots_branch": [ + "0x7a61086fb9e53ab4dd87243d6288c51793696168a73773277630da5b20bf6091", + "0x60733905cdc5dd65d05161bb3138eecc47d6d6057ab36b0d36cf5a3200484143", + "0x86d7de634ae45de5b3cbbc562dd976de7d06a3d96f83147413536e6b108c7a39", + "0x0ada571c9e0da6fce8dd13e6d9ce173768521ac32e0af456634556176789fa6e", + "0x2341538fd0aafbc1ff0f513545e5dcd4b8905dc9e00d6173480c18a4e8086ebc" + ] +} \ No newline at end of file diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/next-finalized-header-update.minimal.json b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/next-finalized-header-update.minimal.json new file mode 100755 index 00000000000..8f1ddc827c1 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/next-finalized-header-update.minimal.json @@ -0,0 +1,38 @@ +{ + "attested_header": { + "slot": 3696, + "proposer_index": 1, + "parent_root": "0x04a63c5dfb726c31a32a72c1c426ff89e21363223d7096486b629f1d58abe5d8", + "state_root": "0xbe20e69420cbf9400224ec5edeb0843776a2ccf945e9a3ba9311ae812cad1e30", + "body_root": "0x1d2acd1748f1c58096d1edc8badd3a1d7e1dc3c33bcb9229e4c03f3a84efeadb" + }, + "sync_aggregate": { + "sync_committee_bits": "0xffffffff", + "sync_committee_signature": "0xafa79bc0f3c731ab1eb6aeafc582a7dd1c100ea471df3af6ff485b58661b3ef8077264dea0b60df9aec2d3ca8ddab6770fc9d061462e5a6dc718146085425f863d00921c42413805cb5b4c5175f36f2087cfed740bb7d57e8d5b48352643cd5b" + }, + "signature_slot": 3697, + "next_sync_committee_update": null, + "finalized_header": { + "slot": 3680, + "proposer_index": 7, + "parent_root": "0x4d8f4fc47ad3eb045bd20cae13af6df02f96a3f8d7c8a285190ba10cfe2b84cf", + "state_root": "0xd498766d77277fe16a6a4609ab3ac3a6e9887d162d8dfffdfc9cc4ae833e4127", + "body_root": "0x9ba73bc9a4907cac0b887550e2b01a63dcc70473753ffcc243d33394cc64b4c0" + }, + "finality_branch": [ + "0xcc01000000000000000000000000000000000000000000000000000000000000", + "0x10c726fac935bf9657cc7476d3cfa7bedec5983dcfb59e8a7df6d0a619e108d7", + "0x142061c4bc3673bf774cb8c7b6085057bd0ca85672b43afa2d9581b0b6a44e54", + "0x48b8cd8ca9d9563e30c1cca2a854cd7f75eb4cb013d10809b3138a72d94ea0c5", + "0x9b39523d05013ac7cbb9f43e5d6f9dc033b12aa1d6d6edd994ddc4f5efe7be9d", + "0x066c9aa26107bc8cb28bc73e518da6cc865ec1d67516b6ca24663b6b7ae3cb21" + ], + "block_roots_root": "0xb15aa2483811d8c5616cb93710f4fcb809d97443caac9de163f943a30f385db6", + "block_roots_branch": [ + "0xf7a43ad317417daa4c2a1e93c54895895a824ef1e43320eb44eab16673da5a61", + "0xe4b8d640660f765c2ef4dc886025dc8e54c6e70b66192582f42837ed5e9d8d41", + "0x841f113dc81e76419b6cdec8b0cf2fc20f9381492ed3c79e9b49179b4d3eacbc", + "0xeb5fdc4d8b5282b653ecbc9caa93bcfe482f6d6a32cbb0d9eb011bef947579bb", + "0x1f328cc5640efb191ae6aa86223b1aa9d083b26ac3e1fa3c071327bb09dc5727" + ] +} \ No newline at end of file diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/next-sync-committee-update.minimal.json b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/next-sync-committee-update.minimal.json new file mode 100755 index 00000000000..8f1c8b9ce21 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/next-sync-committee-update.minimal.json @@ -0,0 +1,83 @@ +{ + "attested_header": { + "slot": 3664, + "proposer_index": 4, + "parent_root": "0x15ac23a0c16bfa81e8595621118040c3e6cbddd4b09bae6fb39ba5fefd0258e8", + "state_root": "0x6fb81aa3827e7d580bb05b4df2686c9a49508bde2f8342fd75be609a23dd8362", + "body_root": "0x9906a1ae8065d268f8acb7f1b3119408d2f7f8e6e0764370c16ea3d15134981f" + }, + "sync_aggregate": { + "sync_committee_bits": "0xffffffff", + "sync_committee_signature": "0xa9b5584ec9290a4ac6c5616639d031f9ab1064d63b4889f1da52f6f4d66b645fca48bbe2fe8484adb0c05c647edd694d0340cf684b8ccf8e34c6d8cf447cfcfdcb856f5abdcfd85ada5a4a04d4c8f6f40c6e99308893c3941485a436d6c8e5f7" + }, + "signature_slot": 3665, + "next_sync_committee_update": { + "next_sync_committee": { + "pubkeys": [ + "0xb89bebc699769726a318c8e9971bd3171297c61aea4a6578a7a4f94b547dcba5bac16a89108b6b6a1fe3695d1a874a0b", + "0x81283b7a20e1ca460ebd9bbd77005d557370cabb1f9a44f530c4c4c66230f675f8df8b4c2818851aa7d77a80ca5a4a5e", + "0xa99a76ed7796f7be22d5b7e85deeb7c5677e88e511e0b337618f8c4eb61349b4bf2d153f649f7b53359fe8b94a38e44c", + "0xa3a32b0f8b4ddb83f1a0a853d81dd725dfe577d4f4c3db8ece52ce2b026eca84815c1a7e8e92a4de3d755733bf7e4a9b", + "0xa8d4c7c27795a725961317ef5953a7032ed6d83739db8b0e8a72353d1b8b4439427f7efa2c89caa03cc9f28f8cbab8ac", + "0x88c141df77cd9d8d7a71a75c826c41a9c9f03c6ee1b180f3e7852f6a280099ded351b58d66e653af8e42816a4d8f532e", + "0xab0bdda0f85f842f431beaccf1250bf1fd7ba51b4100fd64364b6401fda85bb0069b3e715b58819684e7fc0b10a72a34", + "0x9977f1c8b731a8d5558146bfb86caea26434f3c5878b589bf280a42c9159e700e9df0e4086296c20b011d2e78c27d373", + "0xb89bebc699769726a318c8e9971bd3171297c61aea4a6578a7a4f94b547dcba5bac16a89108b6b6a1fe3695d1a874a0b", + "0x81283b7a20e1ca460ebd9bbd77005d557370cabb1f9a44f530c4c4c66230f675f8df8b4c2818851aa7d77a80ca5a4a5e", + "0xa99a76ed7796f7be22d5b7e85deeb7c5677e88e511e0b337618f8c4eb61349b4bf2d153f649f7b53359fe8b94a38e44c", + "0xa3a32b0f8b4ddb83f1a0a853d81dd725dfe577d4f4c3db8ece52ce2b026eca84815c1a7e8e92a4de3d755733bf7e4a9b", + "0xa8d4c7c27795a725961317ef5953a7032ed6d83739db8b0e8a72353d1b8b4439427f7efa2c89caa03cc9f28f8cbab8ac", + "0x88c141df77cd9d8d7a71a75c826c41a9c9f03c6ee1b180f3e7852f6a280099ded351b58d66e653af8e42816a4d8f532e", + "0xab0bdda0f85f842f431beaccf1250bf1fd7ba51b4100fd64364b6401fda85bb0069b3e715b58819684e7fc0b10a72a34", + "0x9977f1c8b731a8d5558146bfb86caea26434f3c5878b589bf280a42c9159e700e9df0e4086296c20b011d2e78c27d373", + "0xb89bebc699769726a318c8e9971bd3171297c61aea4a6578a7a4f94b547dcba5bac16a89108b6b6a1fe3695d1a874a0b", + "0x81283b7a20e1ca460ebd9bbd77005d557370cabb1f9a44f530c4c4c66230f675f8df8b4c2818851aa7d77a80ca5a4a5e", + "0xa99a76ed7796f7be22d5b7e85deeb7c5677e88e511e0b337618f8c4eb61349b4bf2d153f649f7b53359fe8b94a38e44c", + "0xa3a32b0f8b4ddb83f1a0a853d81dd725dfe577d4f4c3db8ece52ce2b026eca84815c1a7e8e92a4de3d755733bf7e4a9b", + "0xa8d4c7c27795a725961317ef5953a7032ed6d83739db8b0e8a72353d1b8b4439427f7efa2c89caa03cc9f28f8cbab8ac", + "0x88c141df77cd9d8d7a71a75c826c41a9c9f03c6ee1b180f3e7852f6a280099ded351b58d66e653af8e42816a4d8f532e", + "0xab0bdda0f85f842f431beaccf1250bf1fd7ba51b4100fd64364b6401fda85bb0069b3e715b58819684e7fc0b10a72a34", + "0x9977f1c8b731a8d5558146bfb86caea26434f3c5878b589bf280a42c9159e700e9df0e4086296c20b011d2e78c27d373", + "0xb89bebc699769726a318c8e9971bd3171297c61aea4a6578a7a4f94b547dcba5bac16a89108b6b6a1fe3695d1a874a0b", + "0x81283b7a20e1ca460ebd9bbd77005d557370cabb1f9a44f530c4c4c66230f675f8df8b4c2818851aa7d77a80ca5a4a5e", + "0xa99a76ed7796f7be22d5b7e85deeb7c5677e88e511e0b337618f8c4eb61349b4bf2d153f649f7b53359fe8b94a38e44c", + "0xa3a32b0f8b4ddb83f1a0a853d81dd725dfe577d4f4c3db8ece52ce2b026eca84815c1a7e8e92a4de3d755733bf7e4a9b", + "0xa8d4c7c27795a725961317ef5953a7032ed6d83739db8b0e8a72353d1b8b4439427f7efa2c89caa03cc9f28f8cbab8ac", + "0x88c141df77cd9d8d7a71a75c826c41a9c9f03c6ee1b180f3e7852f6a280099ded351b58d66e653af8e42816a4d8f532e", + "0xab0bdda0f85f842f431beaccf1250bf1fd7ba51b4100fd64364b6401fda85bb0069b3e715b58819684e7fc0b10a72a34", + "0x9977f1c8b731a8d5558146bfb86caea26434f3c5878b589bf280a42c9159e700e9df0e4086296c20b011d2e78c27d373" + ], + "aggregate_pubkey": "0x8fe11476a05750c52618deb79918e2e674f56dfbf12dbce55ae4386d108e8a1e83c6326f5957e2ef19137582ce270dc6" + }, + "next_sync_committee_branch": [ + "0x46af3f54acbea439b63aa5bb699c8f25ff584b23912366788f7c8e95011ce324", + "0x5b118fe110ee4a1b0cf9823bc189fb38eb55a7b49adbdafcf466ec7cd4b7fd68", + "0xc2f12fb91a61abedb47f62a98258960edca21f31494cdf59b47a1c721e3e98f8", + "0x16fdfd5e6b591b3140a76efa4593a9c4d105b9e5c62d6f44edbd24790657be50", + "0xc8175ab66690cc94c0a24452754addd62a06948de5db9814e813437a130de452" + ] + }, + "finalized_header": { + "slot": 3648, + "proposer_index": 1, + "parent_root": "0x991ee98a70e8f90bdd61d0f5554e53d37473e75e16af171f6d88f27d20223dae", + "state_root": "0x59b04d660ac772005a13a7dc1d5f99bb0d0292f3c422f04f7365198d70dd30de", + "body_root": "0x5151f035e146258e7327ad9cf1df13f8ddec7a7842c19993cf739358717b5565" + }, + "finality_branch": [ + "0xc801000000000000000000000000000000000000000000000000000000000000", + "0x10c726fac935bf9657cc7476d3cfa7bedec5983dcfb59e8a7df6d0a619e108d7", + "0x142061c4bc3673bf774cb8c7b6085057bd0ca85672b43afa2d9581b0b6a44e54", + "0xc2f12fb91a61abedb47f62a98258960edca21f31494cdf59b47a1c721e3e98f8", + "0x16fdfd5e6b591b3140a76efa4593a9c4d105b9e5c62d6f44edbd24790657be50", + "0xc8175ab66690cc94c0a24452754addd62a06948de5db9814e813437a130de452" + ], + "block_roots_root": "0xe6e2adaaad45363d7112945ef670e21c66bcb3276dc450962ade1e8950230380", + "block_roots_branch": [ + "0x386ede102258966d4c23031c5a02de2af8180d475c4c1716b07fb5b9f142a817", + "0x35e6c89bc38d993a1957f8a9fb1fbeab7420688091ba2cd7ee7b19b7e187f7d6", + "0x99249309825cafef7e694c09c4fdf95eb4b1e8743d3b23f6959d9980ad2d69b0", + "0x5e028d1d905db6430f0ce4aafbc78f442047ec3a132b4e69557fdf804a4cfbf3", + "0xd34afeab37851937920243683a1c926c41c626aacb145718fce755782d4996dd" + ] +} \ No newline at end of file diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/sync-committee-update.minimal.json b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/sync-committee-update.minimal.json new file mode 100644 index 00000000000..a962a0c87c4 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/sync-committee-update.minimal.json @@ -0,0 +1,83 @@ +{ + "attested_header": { + "slot": 3600, + "proposer_index": 7, + "parent_root": "0xdf60c2d58beccd89678b9267c689e9ba1cf1d58ce5114ad5c16e8341459cfd75", + "state_root": "0x023f14c7a38ef4d6ec19b522edfb427c6b70c6ffbd8610ca802dd1491c92c852", + "body_root": "0x0f78a1c45e42711efc5fb7b7f6238be1bee9273f7c44ff6892d815858bb77e25" + }, + "sync_aggregate": { + "sync_committee_bits": "0xffffffff", + "sync_committee_signature": "0xa4dd8f0991de88ca6f81476f72f48cdb67b9414ad7bf6bba37f627c5ec84dd2c2ebc12cddd5d2e7c927276cee2d3d144158b4c067db3e9911fe52fe1875b14c93f90e4eb57bf5e8f0e6e6effe22f9ba076f30207e0ec683354961ae8e9779556" + }, + "signature_slot": 3601, + "next_sync_committee_update": { + "next_sync_committee": { + "pubkeys": [ + "0xab0bdda0f85f842f431beaccf1250bf1fd7ba51b4100fd64364b6401fda85bb0069b3e715b58819684e7fc0b10a72a34", + "0xa8d4c7c27795a725961317ef5953a7032ed6d83739db8b0e8a72353d1b8b4439427f7efa2c89caa03cc9f28f8cbab8ac", + "0xa3a32b0f8b4ddb83f1a0a853d81dd725dfe577d4f4c3db8ece52ce2b026eca84815c1a7e8e92a4de3d755733bf7e4a9b", + "0xb89bebc699769726a318c8e9971bd3171297c61aea4a6578a7a4f94b547dcba5bac16a89108b6b6a1fe3695d1a874a0b", + "0x88c141df77cd9d8d7a71a75c826c41a9c9f03c6ee1b180f3e7852f6a280099ded351b58d66e653af8e42816a4d8f532e", + "0x81283b7a20e1ca460ebd9bbd77005d557370cabb1f9a44f530c4c4c66230f675f8df8b4c2818851aa7d77a80ca5a4a5e", + "0x9977f1c8b731a8d5558146bfb86caea26434f3c5878b589bf280a42c9159e700e9df0e4086296c20b011d2e78c27d373", + "0xa99a76ed7796f7be22d5b7e85deeb7c5677e88e511e0b337618f8c4eb61349b4bf2d153f649f7b53359fe8b94a38e44c", + "0xab0bdda0f85f842f431beaccf1250bf1fd7ba51b4100fd64364b6401fda85bb0069b3e715b58819684e7fc0b10a72a34", + "0xa8d4c7c27795a725961317ef5953a7032ed6d83739db8b0e8a72353d1b8b4439427f7efa2c89caa03cc9f28f8cbab8ac", + "0xa3a32b0f8b4ddb83f1a0a853d81dd725dfe577d4f4c3db8ece52ce2b026eca84815c1a7e8e92a4de3d755733bf7e4a9b", + "0xb89bebc699769726a318c8e9971bd3171297c61aea4a6578a7a4f94b547dcba5bac16a89108b6b6a1fe3695d1a874a0b", + "0x88c141df77cd9d8d7a71a75c826c41a9c9f03c6ee1b180f3e7852f6a280099ded351b58d66e653af8e42816a4d8f532e", + "0x81283b7a20e1ca460ebd9bbd77005d557370cabb1f9a44f530c4c4c66230f675f8df8b4c2818851aa7d77a80ca5a4a5e", + "0x9977f1c8b731a8d5558146bfb86caea26434f3c5878b589bf280a42c9159e700e9df0e4086296c20b011d2e78c27d373", + "0xa99a76ed7796f7be22d5b7e85deeb7c5677e88e511e0b337618f8c4eb61349b4bf2d153f649f7b53359fe8b94a38e44c", + "0xab0bdda0f85f842f431beaccf1250bf1fd7ba51b4100fd64364b6401fda85bb0069b3e715b58819684e7fc0b10a72a34", + "0xa8d4c7c27795a725961317ef5953a7032ed6d83739db8b0e8a72353d1b8b4439427f7efa2c89caa03cc9f28f8cbab8ac", + "0xa3a32b0f8b4ddb83f1a0a853d81dd725dfe577d4f4c3db8ece52ce2b026eca84815c1a7e8e92a4de3d755733bf7e4a9b", + "0xb89bebc699769726a318c8e9971bd3171297c61aea4a6578a7a4f94b547dcba5bac16a89108b6b6a1fe3695d1a874a0b", + "0x88c141df77cd9d8d7a71a75c826c41a9c9f03c6ee1b180f3e7852f6a280099ded351b58d66e653af8e42816a4d8f532e", + "0x81283b7a20e1ca460ebd9bbd77005d557370cabb1f9a44f530c4c4c66230f675f8df8b4c2818851aa7d77a80ca5a4a5e", + "0x9977f1c8b731a8d5558146bfb86caea26434f3c5878b589bf280a42c9159e700e9df0e4086296c20b011d2e78c27d373", + "0xa99a76ed7796f7be22d5b7e85deeb7c5677e88e511e0b337618f8c4eb61349b4bf2d153f649f7b53359fe8b94a38e44c", + "0xab0bdda0f85f842f431beaccf1250bf1fd7ba51b4100fd64364b6401fda85bb0069b3e715b58819684e7fc0b10a72a34", + "0xa8d4c7c27795a725961317ef5953a7032ed6d83739db8b0e8a72353d1b8b4439427f7efa2c89caa03cc9f28f8cbab8ac", + "0xa3a32b0f8b4ddb83f1a0a853d81dd725dfe577d4f4c3db8ece52ce2b026eca84815c1a7e8e92a4de3d755733bf7e4a9b", + "0xb89bebc699769726a318c8e9971bd3171297c61aea4a6578a7a4f94b547dcba5bac16a89108b6b6a1fe3695d1a874a0b", + "0x88c141df77cd9d8d7a71a75c826c41a9c9f03c6ee1b180f3e7852f6a280099ded351b58d66e653af8e42816a4d8f532e", + "0x81283b7a20e1ca460ebd9bbd77005d557370cabb1f9a44f530c4c4c66230f675f8df8b4c2818851aa7d77a80ca5a4a5e", + "0x9977f1c8b731a8d5558146bfb86caea26434f3c5878b589bf280a42c9159e700e9df0e4086296c20b011d2e78c27d373", + "0xa99a76ed7796f7be22d5b7e85deeb7c5677e88e511e0b337618f8c4eb61349b4bf2d153f649f7b53359fe8b94a38e44c" + ], + "aggregate_pubkey": "0x8fe11476a05750c52618deb79918e2e674f56dfbf12dbce55ae4386d108e8a1e83c6326f5957e2ef19137582ce270dc6" + }, + "next_sync_committee_branch": [ + "0x1446606d0129c324a4ea374bd29a625175e0659512cd8650097e0a9c38ce6379", + "0xd92466c7e9a53b7b55f4fdb151746a3058931d7559b7e84e7b15384ddc903ca0", + "0x9fd10c3f68b75cfd3ebd2af0d4e2cbbfbe120e0b5423dde89ff0f743c7a4f937", + "0x1ed6aac0ab29a883de2bb2e3579ad4d6807ddcf3db8afcaf0ae25a076ac9a5f4", + "0xf17a840df410a15f0e4e48abf521c29ad0d296d3fb4e8b847ea37f2cc8236f1f" + ] + }, + "finalized_header": { + "slot": 3584, + "proposer_index": 1, + "parent_root": "0x91c285af2ec25d485310391afe667108b787ec570cdbb0e3fd87b1e0e2c47bd7", + "state_root": "0xccc4baf90024e035f1252520d2f2ef1e50f840ff0ecc8e6e365721e083871a32", + "body_root": "0x91df5e0077434aad609aaa7e030005cee77cca83868ffc2724e5befe9a3f6a02" + }, + "finality_branch": [ + "0xc001000000000000000000000000000000000000000000000000000000000000", + "0x10c726fac935bf9657cc7476d3cfa7bedec5983dcfb59e8a7df6d0a619e108d7", + "0x83c3d5360d254f4a44be712c1f433e88e810b6d1e0e789e90bada9e36126b857", + "0x9fd10c3f68b75cfd3ebd2af0d4e2cbbfbe120e0b5423dde89ff0f743c7a4f937", + "0x1ed6aac0ab29a883de2bb2e3579ad4d6807ddcf3db8afcaf0ae25a076ac9a5f4", + "0xf17a840df410a15f0e4e48abf521c29ad0d296d3fb4e8b847ea37f2cc8236f1f" + ], + "block_roots_root": "0x9eab8a05c396a29c32f4f8ac9654fc0fb7cd97ec659236392ede48951a794505", + "block_roots_branch": [ + "0x5c175efdbafacdfdab21c93a318b0e8e2291a5a86c40b1fc564f91ad33c106d4", + "0x5c1e0b76176ab033858b2835f90d5e25d708b563f77efd7d9938f0faa1c20878", + "0x7aea32464adee801e2a05c3af227f24231d3c088e3b7265a5fada9ac850549fe", + "0x9d9fca29e23c5d4ae433adf17e7fd9a0e4d1b09b68f5c45e7ca1b13ebe4a9e98", + "0x6b35238f188021c859d6b317457ebb6fe4cf362cab35c988010cb1343eabbfc5" + ] +} \ No newline at end of file diff --git a/bridges/snowbridge/parachain/pallets/inbound-queue/Cargo.toml b/bridges/snowbridge/parachain/pallets/inbound-queue/Cargo.toml new file mode 100644 index 00000000000..f9e4d20be0f --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/inbound-queue/Cargo.toml @@ -0,0 +1,93 @@ +[package] +name = "snowbridge-inbound-queue" +description = "Snowbridge Inbound Queue" +version = "0.1.1" +edition = "2021" +authors = ["Snowfork "] +repository = "https://github.com/Snowfork/snowbridge" +license = "Apache-2.0" + +[package.metadata.docs.rs] +targets = ["x86_64-unknown-linux-gnu"] + +[dependencies] +serde = { version = "1.0.188", optional = true } +codec = { version = "3.6.1", package = "parity-scale-codec", default-features = false, features = ["derive"] } +scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } +hex-literal = { version = "0.4.1", optional = true } +log = { version = "0.4.20", default-features = false } +alloy-primitives = { version = "0.4.2", default-features = false, features = ["rlp"] } +alloy-sol-types = { version = "0.4.2", default-features = false } +alloy-rlp = { version = "0.3.3", default-features = false, features = ["derive"] } +num-traits = { version = "0.2.16", default-features = false } + +frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking", default-features = false, optional = true } +frame-support = { path = "../../../../../substrate/frame/support", default-features = false } +frame-system = { path = "../../../../../substrate/frame/system", default-features = false } +pallet-balances = { path = "../../../../../substrate/frame/balances", default-features = false } +sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } +sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } +sp-io = { path = "../../../../../substrate/primitives/io", default-features = false } +sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-features = false } + +xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } +xcm-builder = { package = "staging-xcm-builder", path = "../../../../../polkadot/xcm/xcm-builder", default-features = false } + +snowbridge-core = { path = "../../primitives/core", default-features = false } +snowbridge-ethereum = { path = "../../primitives/ethereum", default-features = false } +snowbridge-router-primitives = { path = "../../primitives/router", default-features = false } +snowbridge-beacon-primitives = { path = "../../primitives/beacon", default-features = false, optional = true } + +[dev-dependencies] +frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking" } +sp-keyring = { path = "../../../../../substrate/primitives/keyring" } +snowbridge-beacon-primitives = { path = "../../primitives/beacon" } +snowbridge-ethereum-beacon-client = { path = "../../pallets/ethereum-beacon-client" } +hex-literal = { version = "0.4.1" } + +[features] +default = ["std"] +std = [ + "alloy-primitives/std", + "alloy-rlp/std", + "alloy-sol-types/std", + "codec/std", + "frame-benchmarking/std", + "frame-support/std", + "frame-system/std", + "log/std", + "num-traits/std", + "pallet-balances/std", + "scale-info/std", + "serde", + "snowbridge-core/std", + "snowbridge-ethereum/std", + "snowbridge-router-primitives/std", + "sp-core/std", + "sp-io/std", + "sp-runtime/std", + "sp-std/std", + "xcm-builder/std", + "xcm/std", +] +runtime-benchmarks = [ + "frame-benchmarking", + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "hex-literal", + "pallet-balances/runtime-benchmarks", + "snowbridge-beacon-primitives", + "snowbridge-core/runtime-benchmarks", + "snowbridge-ethereum-beacon-client/runtime-benchmarks", + "snowbridge-router-primitives/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", + "xcm-builder/runtime-benchmarks", +] +try-runtime = [ + "frame-support/try-runtime", + "frame-system/try-runtime", + "pallet-balances/try-runtime", + "snowbridge-ethereum-beacon-client/try-runtime", + "sp-runtime/try-runtime", +] diff --git a/bridges/snowbridge/parachain/pallets/inbound-queue/src/benchmarking/fixtures.rs b/bridges/snowbridge/parachain/pallets/inbound-queue/src/benchmarking/fixtures.rs new file mode 100644 index 00000000000..4f2382d072a --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/inbound-queue/src/benchmarking/fixtures.rs @@ -0,0 +1,40 @@ +use hex_literal::hex; +use snowbridge_beacon_primitives::CompactExecutionHeader; +use snowbridge_core::inbound::{Log, Message, Proof}; +use sp_std::vec; + +pub struct InboundQueueTest { + pub execution_header: CompactExecutionHeader, + pub message: Message, +} + +pub fn make_create_message() -> InboundQueueTest { + InboundQueueTest{ + execution_header: CompactExecutionHeader{ + parent_hash: hex!("b5608f0af7c3b6fe5c593772fc25436b8d6549eb236adb0855c6ad33e0004e04").into(), + block_number: 115, + state_root: hex!("47ed174789836c622499d9659a4ac32c3b91a7b15642d39b0a11b82ff23995c1").into(), + receipts_root: hex!("42c08b5303fcdf9e49c833fe5f1182cdbc8206bf8aec581125fc34aba11e1f1a").into(), + }, + message: Message { + event_log: Log { + address: hex!("eda338e4dc46038493b885327842fd3e301cab39").into(), + topics: vec![ + hex!("7153f9357c8ea496bba60bf82e67143e27b64462b49041f8e689e1b05728f84f").into(), + hex!("c173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539").into(), + hex!("5f7060e971b0dc81e63f0aa41831091847d97c1a4693ac450cc128c7214e65e0").into(), + ], + data: hex!("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002e00a736aa00000000000087d1f7fdfee7f651fabc8bfcb6e086c278b77a7d00e40b54020000000000000000000000000000000000000000000000000000000000").into(), + }, + proof: Proof { + block_hash: hex!("add15f439c8a57fe375d0a679870b1359921d70cb0e3e44f0dd3e272849f4097").into(), + tx_index: 0, + data: (vec![ + hex!("42c08b5303fcdf9e49c833fe5f1182cdbc8206bf8aec581125fc34aba11e1f1a").to_vec(), + ], vec![ + hex!("f9028e822080b9028802f90284018301ed20b9010000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000080000000000000000000000000000004000000000080000000000000000000000000000000000010100000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000040004000000000000002000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000200000000000010f90179f85894eda338e4dc46038493b885327842fd3e301cab39e1a0f78bb28d4b1d7da699e5c0bc2be29c2b04b5aab6aacf6298fe5304f9db9c6d7ea000000000000000000000000087d1f7fdfee7f651fabc8bfcb6e086c278b77a7df9011c94eda338e4dc46038493b885327842fd3e301cab39f863a07153f9357c8ea496bba60bf82e67143e27b64462b49041f8e689e1b05728f84fa0c173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539a05f7060e971b0dc81e63f0aa41831091847d97c1a4693ac450cc128c7214e65e0b8a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002e00a736aa00000000000087d1f7fdfee7f651fabc8bfcb6e086c278b77a7d00e40b54020000000000000000000000000000000000000000000000000000000000").to_vec(), + ]), + }, + }, + } +} diff --git a/bridges/snowbridge/parachain/pallets/inbound-queue/src/benchmarking/mod.rs b/bridges/snowbridge/parachain/pallets/inbound-queue/src/benchmarking/mod.rs new file mode 100644 index 00000000000..c10de9dff2f --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/inbound-queue/src/benchmarking/mod.rs @@ -0,0 +1,55 @@ +mod fixtures; + +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +use super::*; + +use crate::Pallet as InboundQueue; +use frame_benchmarking::v2::*; +use frame_support::assert_ok; +use frame_system::RawOrigin; + +#[benchmarks] +mod benchmarks { + use super::*; + use crate::benchmarking::fixtures::make_create_message; + + #[benchmark] + fn submit() -> Result<(), BenchmarkError> { + let caller: T::AccountId = whitelisted_caller(); + + let create_message = make_create_message(); + + T::Helper::initialize_storage( + create_message.message.proof.block_hash, + create_message.execution_header, + ); + + let sovereign_account = sibling_sovereign_account::(1000u32.into()); + + let minimum_balance = T::Token::minimum_balance(); + + // So that the receiving account exists + assert_ok!(T::Token::mint_into(&caller, minimum_balance)); + // Fund the sovereign account (parachain sovereign account) so it can transfer a reward + // fee to the caller account + assert_ok!(T::Token::mint_into( + &sovereign_account, + 3_000_000_000_000u128 + .try_into() + .unwrap_or_else(|_| panic!("unable to cast sovereign account balance")), + )); + + #[block] + { + assert_ok!(InboundQueue::::submit( + RawOrigin::Signed(caller.clone()).into(), + create_message.message, + )); + } + + Ok(()) + } + + impl_benchmark_test_suite!(InboundQueue, crate::mock::new_tester(), crate::mock::Test); +} diff --git a/bridges/snowbridge/parachain/pallets/inbound-queue/src/envelope.rs b/bridges/snowbridge/parachain/pallets/inbound-queue/src/envelope.rs new file mode 100644 index 00000000000..826d535c2cb --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/inbound-queue/src/envelope.rs @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +use snowbridge_core::{inbound::Log, ChannelId}; + +use sp_core::{RuntimeDebug, H160, H256}; +use sp_std::{convert::TryFrom, prelude::*}; + +use alloy_primitives::B256; +use alloy_sol_types::{sol, SolEvent}; + +sol! { + event OutboundMessageAccepted(bytes32 indexed channel_id, uint64 nonce, bytes32 indexed message_id, bytes payload); +} + +/// An inbound message that has had its outer envelope decoded. +#[derive(Clone, RuntimeDebug)] +pub struct Envelope { + /// The address of the outbound queue on Ethereum that emitted this message as an event log + pub gateway: H160, + /// The message Channel + pub channel_id: ChannelId, + /// A nonce for enforcing replay protection and ordering. + pub nonce: u64, + /// An id for tracing the message on its route (has no role in bridge consensus) + pub message_id: H256, + /// The inner payload generated from the source application. + pub payload: Vec, +} + +#[derive(Copy, Clone, RuntimeDebug)] +pub struct EnvelopeDecodeError; + +impl TryFrom<&Log> for Envelope { + type Error = EnvelopeDecodeError; + + fn try_from(log: &Log) -> Result { + let topics: Vec = log.topics.iter().map(|x| B256::from_slice(x.as_ref())).collect(); + + let event = OutboundMessageAccepted::decode_log(topics, &log.data, true) + .map_err(|_| EnvelopeDecodeError)?; + + Ok(Self { + gateway: log.address, + channel_id: ChannelId::from(event.channel_id.as_ref()), + nonce: event.nonce, + message_id: H256::from(event.message_id.as_ref()), + payload: event.payload, + }) + } +} diff --git a/bridges/snowbridge/parachain/pallets/inbound-queue/src/lib.rs b/bridges/snowbridge/parachain/pallets/inbound-queue/src/lib.rs new file mode 100644 index 00000000000..834e805fbef --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/inbound-queue/src/lib.rs @@ -0,0 +1,342 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +//! Inbound Queue +//! +//! # Overview +//! +//! Receives messages emitted by the Gateway contract on Ethereum, whereupon they are verified, +//! translated to XCM, and finally sent to their final destination parachain. +//! +//! The message relayers are rewarded using native currency from the sovereign account of the +//! destination parachain. +//! +//! # Extrinsics +//! +//! ## Governance +//! +//! * [`Call::set_operating_mode`]: Set the operating mode of the pallet. Can be used to disable +//! processing of inbound messages. +//! +//! ## Message Submission +//! +//! * [`Call::submit`]: Submit a message for verification and dispatch the final destination +//! parachain. +#![cfg_attr(not(feature = "std"), no_std)] + +mod envelope; + +#[cfg(feature = "runtime-benchmarks")] +mod benchmarking; + +#[cfg(feature = "runtime-benchmarks")] +use snowbridge_beacon_primitives::CompactExecutionHeader; + +pub mod weights; + +#[cfg(test)] +mod mock; + +#[cfg(test)] +mod test; + +use codec::{Decode, DecodeAll, Encode}; +use envelope::Envelope; +use frame_support::{ + traits::{ + fungible::{Inspect, Mutate}, + tokens::{Fortitude, Precision, Preservation}, + }, + weights::WeightToFee, + PalletError, +}; +use frame_system::ensure_signed; +use scale_info::TypeInfo; +use sp_core::{H160, H256}; +use sp_std::{convert::TryFrom, vec}; +use xcm::prelude::{ + send_xcm, Instruction::SetTopic, Junction::*, Junctions::*, MultiLocation, + SendError as XcmpSendError, SendXcm, Xcm, XcmHash, +}; + +use snowbridge_core::{ + inbound::{Message, VerificationError, Verifier}, + sibling_sovereign_account, BasicOperatingMode, Channel, ChannelId, ParaId, StaticLookup, +}; +use snowbridge_router_primitives::{ + inbound, + inbound::{ConvertMessage, ConvertMessageError}, +}; +use sp_runtime::traits::Saturating; + +pub use weights::WeightInfo; + +type BalanceOf = + <::Token as Inspect<::AccountId>>::Balance; + +pub use pallet::*; + +pub const LOG_TARGET: &str = "snowbridge-inbound-queue"; + +#[frame_support::pallet] +pub mod pallet { + use super::*; + + use frame_support::pallet_prelude::*; + use frame_system::pallet_prelude::*; + use snowbridge_core::PricingParameters; + + #[pallet::pallet] + pub struct Pallet(_); + + #[cfg(feature = "runtime-benchmarks")] + pub trait BenchmarkHelper { + fn initialize_storage(block_hash: H256, header: CompactExecutionHeader); + } + + #[pallet::config] + pub trait Config: frame_system::Config { + type RuntimeEvent: From> + IsType<::RuntimeEvent>; + + /// The verifier for inbound messages from Ethereum + type Verifier: Verifier; + + /// Message relayers are rewarded with this asset + type Token: Mutate + Inspect; + + /// XCM message sender + type XcmSender: SendXcm; + + // Address of the Gateway contract + #[pallet::constant] + type GatewayAddress: Get; + + /// Convert inbound message to XCM + type MessageConverter: ConvertMessage< + AccountId = Self::AccountId, + Balance = BalanceOf, + >; + + /// Lookup a channel descriptor + type ChannelLookup: StaticLookup; + + /// Lookup pricing parameters + type PricingParameters: Get>>; + + type WeightInfo: WeightInfo; + + #[cfg(feature = "runtime-benchmarks")] + type Helper: BenchmarkHelper; + + /// Convert a weight value into deductible balance type. + type WeightToFee: WeightToFee>; + + /// Convert a length value into deductible balance type + type LengthToFee: WeightToFee>; + + /// The upper limit here only used to estimate delivery cost + type MaxMessageSize: Get; + } + + #[pallet::hooks] + impl Hooks> for Pallet {} + + #[pallet::event] + #[pallet::generate_deposit(pub(super) fn deposit_event)] + pub enum Event { + /// A message was received from Ethereum + MessageReceived { + /// The message channel + channel_id: ChannelId, + /// The message nonce + nonce: u64, + /// ID of the XCM message which was forwarded to the final destination parachain + message_id: [u8; 32], + }, + /// Set OperatingMode + OperatingModeChanged { mode: BasicOperatingMode }, + } + + #[pallet::error] + pub enum Error { + /// Message came from an invalid outbound channel on the Ethereum side. + InvalidGateway, + /// Message has an invalid envelope. + InvalidEnvelope, + /// Message has an unexpected nonce. + InvalidNonce, + /// Message has an invalid payload. + InvalidPayload, + /// Message channel is invalid + InvalidChannel, + /// The max nonce for the type has been reached + MaxNonceReached, + /// Cannot convert location + InvalidAccountConversion, + /// Pallet is halted + Halted, + /// Message verification error, + Verification(VerificationError), + /// XCMP send failure + Send(SendError), + /// Message conversion error + ConvertMessage(ConvertMessageError), + } + + #[derive(Clone, Encode, Decode, Eq, PartialEq, Debug, TypeInfo, PalletError)] + pub enum SendError { + NotApplicable, + NotRoutable, + Transport, + DestinationUnsupported, + ExceedsMaxMessageSize, + MissingArgument, + Fees, + } + + impl From for Error { + fn from(e: XcmpSendError) -> Self { + match e { + XcmpSendError::NotApplicable => Error::::Send(SendError::NotApplicable), + XcmpSendError::Unroutable => Error::::Send(SendError::NotRoutable), + XcmpSendError::Transport(_) => Error::::Send(SendError::Transport), + XcmpSendError::DestinationUnsupported => + Error::::Send(SendError::DestinationUnsupported), + XcmpSendError::ExceedsMaxMessageSize => + Error::::Send(SendError::ExceedsMaxMessageSize), + XcmpSendError::MissingArgument => Error::::Send(SendError::MissingArgument), + XcmpSendError::Fees => Error::::Send(SendError::Fees), + } + } + } + + /// The current nonce for each channel + #[pallet::storage] + pub type Nonce = StorageMap<_, Twox64Concat, ChannelId, u64, ValueQuery>; + + /// The current operating mode of the pallet. + #[pallet::storage] + #[pallet::getter(fn operating_mode)] + pub type OperatingMode = StorageValue<_, BasicOperatingMode, ValueQuery>; + + #[pallet::call] + impl Pallet { + /// Submit an inbound message originating from the Gateway contract on Ethereum + #[pallet::call_index(0)] + #[pallet::weight(T::WeightInfo::submit())] + pub fn submit(origin: OriginFor, message: Message) -> DispatchResult { + let who = ensure_signed(origin)?; + ensure!(!Self::operating_mode().is_halted(), Error::::Halted); + + // submit message to verifier for verification + T::Verifier::verify(&message.event_log, &message.proof) + .map_err(|e| Error::::Verification(e))?; + + // Decode event log into an Envelope + let envelope = + Envelope::try_from(&message.event_log).map_err(|_| Error::::InvalidEnvelope)?; + + // Verify that the message was submitted from the known Gateway contract + ensure!(T::GatewayAddress::get() == envelope.gateway, Error::::InvalidGateway); + + // Retrieve the registered channel for this message + let channel = + T::ChannelLookup::lookup(envelope.channel_id).ok_or(Error::::InvalidChannel)?; + + // Verify message nonce + >::try_mutate(envelope.channel_id, |nonce| -> DispatchResult { + if *nonce == u64::MAX { + return Err(Error::::MaxNonceReached.into()) + } + if envelope.nonce != nonce.saturating_add(1) { + Err(Error::::InvalidNonce.into()) + } else { + *nonce = nonce.saturating_add(1); + Ok(()) + } + })?; + + // Reward relayer from the sovereign account of the destination parachain + // Expected to fail if sovereign account has no funds + let sovereign_account = sibling_sovereign_account::(channel.para_id); + let delivery_cost = Self::calculate_delivery_cost(message.encode().len() as u32); + T::Token::transfer(&sovereign_account, &who, delivery_cost, Preservation::Preserve)?; + + // Decode message into XCM + let (xcm, fee) = + match inbound::VersionedMessage::decode_all(&mut envelope.payload.as_ref()) { + Ok(message) => Self::do_convert(envelope.message_id, message)?, + Err(_) => return Err(Error::::InvalidPayload.into()), + }; + + // We embed fees for xcm execution inside the xcm program using teleports + // so we must burn the amount of the fee embedded into the XCM script. + T::Token::burn_from(&sovereign_account, fee, Precision::Exact, Fortitude::Polite)?; + + log::info!( + target: LOG_TARGET, + "💫 xcm {:?} sent with fee {:?}", + xcm, + fee + ); + + // Attempt to send XCM to a dest parachain + let message_id = Self::send_xcm(xcm, channel.para_id)?; + + Self::deposit_event(Event::MessageReceived { + channel_id: envelope.channel_id, + nonce: envelope.nonce, + message_id, + }); + + Ok(()) + } + + /// Halt or resume all pallet operations. May only be called by root. + #[pallet::call_index(1)] + #[pallet::weight((T::DbWeight::get().reads_writes(1, 1), DispatchClass::Operational))] + pub fn set_operating_mode( + origin: OriginFor, + mode: BasicOperatingMode, + ) -> DispatchResult { + ensure_root(origin)?; + OperatingMode::::set(mode); + Self::deposit_event(Event::OperatingModeChanged { mode }); + Ok(()) + } + } + + impl Pallet { + pub fn do_convert( + message_id: H256, + message: inbound::VersionedMessage, + ) -> Result<(Xcm<()>, BalanceOf), Error> { + let (mut xcm, fee) = + T::MessageConverter::convert(message).map_err(|e| Error::::ConvertMessage(e))?; + // Append the message id as an XCM topic + xcm.inner_mut().extend(vec![SetTopic(message_id.into())]); + Ok((xcm, fee)) + } + + pub fn send_xcm(xcm: Xcm<()>, dest: ParaId) -> Result> { + let dest = MultiLocation { parents: 1, interior: X1(Parachain(dest.into())) }; + let (xcm_hash, _) = send_xcm::(dest, xcm).map_err(Error::::from)?; + Ok(xcm_hash) + } + + pub fn calculate_delivery_cost(length: u32) -> BalanceOf { + let weight_fee = T::WeightToFee::weight_to_fee(&T::WeightInfo::submit()); + let len_fee = T::LengthToFee::weight_to_fee(&Weight::from_parts(length as u64, 0)); + weight_fee + .saturating_add(len_fee) + .saturating_add(T::PricingParameters::get().rewards.local) + } + } + + /// API for accessing the delivery cost of a message + impl Get> for Pallet { + fn get() -> BalanceOf { + // Cost here based on MaxMessagePayloadSize(the worst case) + Self::calculate_delivery_cost(T::MaxMessageSize::get()) + } + } +} diff --git a/bridges/snowbridge/parachain/pallets/inbound-queue/src/mock.rs b/bridges/snowbridge/parachain/pallets/inbound-queue/src/mock.rs new file mode 100644 index 00000000000..6b79a55e3c9 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/inbound-queue/src/mock.rs @@ -0,0 +1,311 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +use super::*; + +use frame_support::{ + parameter_types, + traits::{ConstU128, ConstU32, Everything}, + weights::IdentityFee, +}; +use hex_literal::hex; +use snowbridge_beacon_primitives::{Fork, ForkVersions}; +use snowbridge_core::{ + gwei, + inbound::{Log, Proof, VerificationError}, + meth, Channel, ChannelId, PricingParameters, Rewards, StaticLookup, +}; +use snowbridge_router_primitives::inbound::MessageToXcm; +use sp_core::{H160, H256}; +use sp_runtime::{ + traits::{BlakeTwo256, IdentifyAccount, IdentityLookup, Verify}, + BuildStorage, FixedU128, MultiSignature, +}; +use sp_std::convert::From; +use xcm::v3::{prelude::*, MultiAssets, SendXcm}; + +use crate::{self as inbound_queue}; + +type Block = frame_system::mocking::MockBlock; + +frame_support::construct_runtime!( + pub enum Test + { + System: frame_system::{Pallet, Call, Storage, Event}, + Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, + EthereumBeaconClient: snowbridge_ethereum_beacon_client::{Pallet, Call, Storage, Event}, + InboundQueue: inbound_queue::{Pallet, Call, Storage, Event}, + } +); + +pub type Signature = MultiSignature; +pub type AccountId = <::Signer as IdentifyAccount>::AccountId; + +parameter_types! { + pub const BlockHashCount: u64 = 250; +} + +type Balance = u128; + +impl frame_system::Config for Test { + type BaseCallFilter = Everything; + type BlockWeights = (); + type BlockLength = (); + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + type RuntimeTask = RuntimeTask; + type Hash = H256; + type Hashing = BlakeTwo256; + type AccountId = AccountId; + type Lookup = IdentityLookup; + type RuntimeEvent = RuntimeEvent; + type BlockHashCount = BlockHashCount; + type DbWeight = (); + type Version = (); + type PalletInfo = PalletInfo; + type AccountData = pallet_balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type SystemWeightInfo = (); + type SS58Prefix = (); + type OnSetCode = (); + type MaxConsumers = frame_support::traits::ConstU32<16>; + type Nonce = u64; + type Block = Block; +} + +impl pallet_balances::Config for Test { + type MaxLocks = (); + type MaxReserves = (); + type ReserveIdentifier = [u8; 8]; + type Balance = Balance; + type RuntimeEvent = RuntimeEvent; + type DustRemoval = (); + type ExistentialDeposit = ConstU128<1>; + type AccountStore = System; + type WeightInfo = (); + type FreezeIdentifier = (); + type MaxFreezes = (); + type RuntimeHoldReason = (); + type RuntimeFreezeReason = (); + type MaxHolds = (); +} + +parameter_types! { + pub const ExecutionHeadersPruneThreshold: u32 = 10; + pub const ChainForkVersions: ForkVersions = ForkVersions{ + genesis: Fork { + version: [0, 0, 0, 1], // 0x00000001 + epoch: 0, + }, + altair: Fork { + version: [1, 0, 0, 1], // 0x01000001 + epoch: 0, + }, + bellatrix: Fork { + version: [2, 0, 0, 1], // 0x02000001 + epoch: 0, + }, + capella: Fork { + version: [3, 0, 0, 1], // 0x03000001 + epoch: 0, + }, + }; +} + +impl snowbridge_ethereum_beacon_client::Config for Test { + type RuntimeEvent = RuntimeEvent; + type ForkVersions = ChainForkVersions; + type MaxExecutionHeadersToKeep = ExecutionHeadersPruneThreshold; + type WeightInfo = (); +} + +// Mock verifier +pub struct MockVerifier; + +impl Verifier for MockVerifier { + fn verify(_: &Log, _: &Proof) -> Result<(), VerificationError> { + Ok(()) + } +} + +const GATEWAY_ADDRESS: [u8; 20] = hex!["eda338e4dc46038493b885327842fd3e301cab39"]; + +parameter_types! { + pub const EthereumNetwork: xcm::v3::NetworkId = xcm::v3::NetworkId::Ethereum { chain_id: 11155111 }; + pub const GatewayAddress: H160 = H160(GATEWAY_ADDRESS); + pub const CreateAssetCall: [u8;2] = [53, 0]; + pub const CreateAssetExecutionFee: u128 = 2_000_000_000; + pub const CreateAssetDeposit: u128 = 100_000_000_000; + pub const SendTokenExecutionFee: u128 = 1_000_000_000; + pub const InitialFund: u128 = 1_000_000_000_000; + pub const InboundQueuePalletInstance: u8 = 80; +} + +#[cfg(feature = "runtime-benchmarks")] +impl BenchmarkHelper for Test { + // not implemented since the MockVerifier is used for tests + fn initialize_storage(_: H256, _: CompactExecutionHeader) {} +} + +// Mock XCM sender that always succeeds +pub struct MockXcmSender; + +impl SendXcm for MockXcmSender { + type Ticket = Xcm<()>; + + fn validate( + dest: &mut Option, + xcm: &mut Option>, + ) -> SendResult { + match dest { + Some(MultiLocation { interior, .. }) => { + if let X1(Parachain(1001)) = interior { + return Err(XcmpSendError::NotApplicable) + } + Ok((xcm.clone().unwrap(), MultiAssets::default())) + }, + _ => Ok((xcm.clone().unwrap(), MultiAssets::default())), + } + } + + fn deliver(xcm: Self::Ticket) -> core::result::Result { + let hash = xcm.using_encoded(sp_io::hashing::blake2_256); + Ok(hash) + } +} + +parameter_types! { + pub const OwnParaId: ParaId = ParaId::new(1013); + pub Parameters: PricingParameters = PricingParameters { + exchange_rate: FixedU128::from_rational(1, 400), + fee_per_gas: gwei(20), + rewards: Rewards { local: DOT, remote: meth(1) } + }; +} + +pub const DOT: u128 = 10_000_000_000; + +pub struct MockChannelLookup; +impl StaticLookup for MockChannelLookup { + type Source = ChannelId; + type Target = Channel; + + fn lookup(channel_id: Self::Source) -> Option { + if channel_id != + hex!("c173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539").into() + { + return None + } + Some(Channel { agent_id: H256::zero(), para_id: ASSET_HUB_PARAID.into() }) + } +} + +impl inbound_queue::Config for Test { + type RuntimeEvent = RuntimeEvent; + type Verifier = MockVerifier; + type Token = Balances; + type XcmSender = MockXcmSender; + type WeightInfo = (); + type GatewayAddress = GatewayAddress; + type MessageConverter = MessageToXcm< + CreateAssetCall, + CreateAssetDeposit, + InboundQueuePalletInstance, + AccountId, + Balance, + >; + type PricingParameters = Parameters; + type ChannelLookup = MockChannelLookup; + #[cfg(feature = "runtime-benchmarks")] + type Helper = Test; + type WeightToFee = IdentityFee; + type LengthToFee = IdentityFee; + type MaxMessageSize = ConstU32<1024>; +} + +pub fn last_events(n: usize) -> Vec { + frame_system::Pallet::::events() + .into_iter() + .rev() + .take(n) + .rev() + .map(|e| e.event) + .collect() +} + +pub fn expect_events(e: Vec) { + assert_eq!(last_events(e.len()), e); +} + +pub fn setup() { + System::set_block_number(1); + Balances::mint_into( + &sibling_sovereign_account::(ASSET_HUB_PARAID.into()), + InitialFund::get(), + ) + .unwrap(); + Balances::mint_into( + &sibling_sovereign_account::(TEMPLATE_PARAID.into()), + InitialFund::get(), + ) + .unwrap(); +} + +pub fn new_tester() -> sp_io::TestExternalities { + let storage = frame_system::GenesisConfig::::default().build_storage().unwrap(); + let mut ext: sp_io::TestExternalities = storage.into(); + ext.execute_with(setup); + ext +} + +// Generated from smoketests: +// cd smoketests +// ./make-bindings +// cargo test --test register_token -- --nocapture +pub fn mock_event_log() -> Log { + Log { + // gateway address + address: hex!("eda338e4dc46038493b885327842fd3e301cab39").into(), + topics: vec![ + hex!("7153f9357c8ea496bba60bf82e67143e27b64462b49041f8e689e1b05728f84f").into(), + // channel id + hex!("c173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539").into(), + // message id + hex!("5f7060e971b0dc81e63f0aa41831091847d97c1a4693ac450cc128c7214e65e0").into(), + ], + // Nonce + Payload + data: hex!("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002e000f000000000000000087d1f7fdfee7f651fabc8bfcb6e086c278b77a7d00e40b54020000000000000000000000000000000000000000000000000000000000").into(), + } +} + +pub fn mock_event_log_invalid_channel() -> Log { + Log { + address: hex!("eda338e4dc46038493b885327842fd3e301cab39").into(), + topics: vec![ + hex!("7153f9357c8ea496bba60bf82e67143e27b64462b49041f8e689e1b05728f84f").into(), + // invalid channel id + hex!("0000000000000000000000000000000000000000000000000000000000000000").into(), + hex!("5f7060e971b0dc81e63f0aa41831091847d97c1a4693ac450cc128c7214e65e0").into(), + ], + data: hex!("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001e000f000000000000000087d1f7fdfee7f651fabc8bfcb6e086c278b77a7d0000").into(), + } +} + +pub fn mock_event_log_invalid_gateway() -> Log { + Log { + // gateway address + address: H160::zero(), + topics: vec![ + hex!("7153f9357c8ea496bba60bf82e67143e27b64462b49041f8e689e1b05728f84f").into(), + // channel id + hex!("c173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539").into(), + // message id + hex!("5f7060e971b0dc81e63f0aa41831091847d97c1a4693ac450cc128c7214e65e0").into(), + ], + // Nonce + Payload + data: hex!("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001e000f000000000000000087d1f7fdfee7f651fabc8bfcb6e086c278b77a7d0000").into(), + } +} + +pub const ASSET_HUB_PARAID: u32 = 1000u32; +pub const TEMPLATE_PARAID: u32 = 1001u32; diff --git a/bridges/snowbridge/parachain/pallets/inbound-queue/src/test.rs b/bridges/snowbridge/parachain/pallets/inbound-queue/src/test.rs new file mode 100644 index 00000000000..6dc3ac45374 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/inbound-queue/src/test.rs @@ -0,0 +1,211 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +use super::*; + +use frame_support::{assert_noop, assert_ok}; +use hex_literal::hex; +use snowbridge_core::{inbound::Proof, ChannelId}; +use sp_keyring::AccountKeyring as Keyring; +use sp_runtime::{DispatchError, TokenError}; +use sp_std::convert::From; + +use crate::{Error, Event as InboundQueueEvent}; + +use crate::mock::*; + +#[test] +fn test_submit_happy_path() { + new_tester().execute_with(|| { + let relayer: AccountId = Keyring::Bob.into(); + let channel_sovereign = sibling_sovereign_account::(ASSET_HUB_PARAID.into()); + + let origin = RuntimeOrigin::signed(relayer.clone()); + + // Submit message + let message = Message { + event_log: mock_event_log(), + proof: Proof { + block_hash: Default::default(), + tx_index: Default::default(), + data: Default::default(), + }, + }; + + let initial_fund = InitialFund::get(); + assert_eq!(Balances::balance(&relayer), 0); + assert_eq!(Balances::balance(&channel_sovereign), initial_fund); + + assert_ok!(InboundQueue::submit(origin.clone(), message.clone())); + expect_events(vec![InboundQueueEvent::MessageReceived { + channel_id: hex!("c173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539") + .into(), + nonce: 1, + message_id: [ + 27, 217, 88, 127, 46, 143, 199, 70, 236, 66, 212, 244, 85, 221, 153, 104, 175, 37, + 224, 20, 140, 95, 140, 7, 27, 74, 182, 199, 77, 12, 194, 236, + ], + } + .into()]); + + let delivery_cost = InboundQueue::calculate_delivery_cost(message.encode().len() as u32); + assert!( + Parameters::get().rewards.local < delivery_cost, + "delivery cost exceeds pure reward" + ); + + assert_eq!(Balances::balance(&relayer), delivery_cost, "relayer was rewarded"); + assert!( + Balances::balance(&channel_sovereign) <= initial_fund - delivery_cost, + "sovereign account paid reward" + ); + }); +} + +#[test] +fn test_submit_xcm_invalid_channel() { + new_tester().execute_with(|| { + let relayer: AccountId = Keyring::Bob.into(); + let origin = RuntimeOrigin::signed(relayer); + + // Deposit funds into sovereign account of parachain 1001 + let sovereign_account = sibling_sovereign_account::(TEMPLATE_PARAID.into()); + println!("account: {}", sovereign_account); + let _ = Balances::mint_into(&sovereign_account, 10000); + + // Submit message + let message = Message { + event_log: mock_event_log_invalid_channel(), + proof: Proof { + block_hash: Default::default(), + tx_index: Default::default(), + data: Default::default(), + }, + }; + assert_noop!( + InboundQueue::submit(origin.clone(), message.clone()), + Error::::InvalidChannel, + ); + }); +} + +#[test] +fn test_submit_with_invalid_gateway() { + new_tester().execute_with(|| { + let relayer: AccountId = Keyring::Bob.into(); + let origin = RuntimeOrigin::signed(relayer); + + // Deposit funds into sovereign account of Asset Hub (Statemint) + let sovereign_account = sibling_sovereign_account::(ASSET_HUB_PARAID.into()); + let _ = Balances::mint_into(&sovereign_account, 10000); + + // Submit message + let message = Message { + event_log: mock_event_log_invalid_gateway(), + proof: Proof { + block_hash: Default::default(), + tx_index: Default::default(), + data: Default::default(), + }, + }; + assert_noop!( + InboundQueue::submit(origin.clone(), message.clone()), + Error::::InvalidGateway + ); + }); +} + +#[test] +fn test_submit_with_invalid_nonce() { + new_tester().execute_with(|| { + let relayer: AccountId = Keyring::Bob.into(); + let origin = RuntimeOrigin::signed(relayer); + + // Deposit funds into sovereign account of Asset Hub (Statemint) + let sovereign_account = sibling_sovereign_account::(ASSET_HUB_PARAID.into()); + let _ = Balances::mint_into(&sovereign_account, 10000); + + // Submit message + let message = Message { + event_log: mock_event_log(), + proof: Proof { + block_hash: Default::default(), + tx_index: Default::default(), + data: Default::default(), + }, + }; + assert_ok!(InboundQueue::submit(origin.clone(), message.clone())); + + let nonce: u64 = >::get(ChannelId::from(hex!( + "c173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539" + ))); + assert_eq!(nonce, 1); + + // Submit the same again + assert_noop!( + InboundQueue::submit(origin.clone(), message.clone()), + Error::::InvalidNonce + ); + }); +} + +#[test] +fn test_submit_no_funds_to_reward_relayers() { + new_tester().execute_with(|| { + let relayer: AccountId = Keyring::Bob.into(); + let origin = RuntimeOrigin::signed(relayer); + + // Reset balance of sovereign_account to zero so to trigger the FundsUnavailable error + let sovereign_account = sibling_sovereign_account::(ASSET_HUB_PARAID.into()); + Balances::set_balance(&sovereign_account, 0); + + // Submit message + let message = Message { + event_log: mock_event_log(), + proof: Proof { + block_hash: Default::default(), + tx_index: Default::default(), + data: Default::default(), + }, + }; + assert_noop!( + InboundQueue::submit(origin.clone(), message.clone()), + TokenError::FundsUnavailable + ); + }); +} + +#[test] +fn test_set_operating_mode() { + new_tester().execute_with(|| { + let relayer: AccountId = Keyring::Bob.into(); + let origin = RuntimeOrigin::signed(relayer); + let message = Message { + event_log: mock_event_log(), + proof: Proof { + block_hash: Default::default(), + tx_index: Default::default(), + data: Default::default(), + }, + }; + + assert_ok!(InboundQueue::set_operating_mode( + RuntimeOrigin::root(), + snowbridge_core::BasicOperatingMode::Halted + )); + + assert_noop!(InboundQueue::submit(origin, message), Error::::Halted); + }); +} + +#[test] +fn test_set_operating_mode_root_only() { + new_tester().execute_with(|| { + assert_noop!( + InboundQueue::set_operating_mode( + RuntimeOrigin::signed(Keyring::Bob.into()), + snowbridge_core::BasicOperatingMode::Halted + ), + DispatchError::BadOrigin + ); + }); +} diff --git a/bridges/snowbridge/parachain/pallets/inbound-queue/src/weights.rs b/bridges/snowbridge/parachain/pallets/inbound-queue/src/weights.rs new file mode 100644 index 00000000000..c2c665f40d9 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/inbound-queue/src/weights.rs @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +//! Autogenerated weights for `snowbridge_inbound_queue` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-07-14, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `macbook pro 14 m2`, CPU: `m2-arm64` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; +use sp_std::marker::PhantomData; + +/// Weight functions needed for ethereum_beacon_client. +pub trait WeightInfo { + fn submit() -> Weight; +} + +// For backwards compatibility and tests +impl WeightInfo for () { + fn submit() -> Weight { + Weight::from_parts(70_000_000, 0) + .saturating_add(Weight::from_parts(0, 3601)) + .saturating_add(RocksDbWeight::get().reads(2)) + .saturating_add(RocksDbWeight::get().writes(2)) + } +} diff --git a/bridges/snowbridge/parachain/pallets/outbound-queue/Cargo.toml b/bridges/snowbridge/parachain/pallets/outbound-queue/Cargo.toml new file mode 100644 index 00000000000..66dd1d838e7 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/outbound-queue/Cargo.toml @@ -0,0 +1,78 @@ +[package] +name = "snowbridge-outbound-queue" +description = "Snowbridge Outbound Queue" +version = "0.1.1" +edition = "2021" +authors = ["Snowfork "] +repository = "https://github.com/Snowfork/snowbridge" +license = "Apache-2.0" + +[package.metadata.docs.rs] +targets = ["x86_64-unknown-linux-gnu"] + +[dependencies] +serde = { version = "1.0.188", features = ["alloc", "derive"], default-features = false } +codec = { version = "3.6.1", package = "parity-scale-codec", default-features = false, features = ["derive"] } +scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } +hex-literal = { version = "0.4.1", optional = true } + +frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking", default-features = false, optional = true } +frame-support = { path = "../../../../../substrate/frame/support", default-features = false } +frame-system = { path = "../../../../../substrate/frame/system", default-features = false } +sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } +sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } +sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-features = false } +sp-io = { path = "../../../../../substrate/primitives/io", default-features = false } +sp-arithmetic = { path = "../../../../../substrate/primitives/arithmetic", default-features = false } + +bridge-hub-common = { path = "../../../../../cumulus/parachains/runtimes/bridge-hubs/common", default-features = false } + +snowbridge-core = { path = "../../primitives/core", features = ["serde"], default-features = false } +snowbridge-outbound-queue-merkle-tree = { path = "merkle-tree", default-features = false } +ethabi = { git = "https://github.com/snowfork/ethabi-decode.git", package = "ethabi-decode", branch = "master", default-features = false } + +xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } + +[dev-dependencies] +pallet-message-queue = { path = "../../../../../substrate/frame/message-queue", default-features = false } +sp-keyring = { path = "../../../../../substrate/primitives/keyring" } +hex-literal = { version = "0.4.1" } + +[features] +default = ["std"] +std = [ + "bridge-hub-common/std", + "codec/std", + "ethabi/std", + "frame-benchmarking/std", + "frame-support/std", + "frame-system/std", + "pallet-message-queue/std", + "scale-info/std", + "serde/std", + "snowbridge-core/std", + "snowbridge-outbound-queue-merkle-tree/std", + "sp-arithmetic/std", + "sp-core/std", + "sp-io/std", + "sp-runtime/std", + "sp-std/std", + "xcm/std", +] +runtime-benchmarks = [ + "bridge-hub-common/runtime-benchmarks", + "frame-benchmarking", + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "hex-literal", + "pallet-message-queue/runtime-benchmarks", + "snowbridge-core/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", +] +try-runtime = [ + "frame-support/try-runtime", + "frame-system/try-runtime", + "pallet-message-queue/try-runtime", + "sp-runtime/try-runtime", +] diff --git a/bridges/snowbridge/parachain/pallets/outbound-queue/merkle-tree/Cargo.toml b/bridges/snowbridge/parachain/pallets/outbound-queue/merkle-tree/Cargo.toml new file mode 100644 index 00000000000..a3432163622 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/outbound-queue/merkle-tree/Cargo.toml @@ -0,0 +1,33 @@ +[package] +name = "snowbridge-outbound-queue-merkle-tree" +description = "Snowbridge Outbound Queue Merkle Tree" +version = "0.1.1" +edition = "2021" +authors = ["Snowfork "] +repository = "https://github.com/Snowfork/snowbridge" +license = "Apache-2.0" + +[package.metadata.docs.rs] +targets = ["x86_64-unknown-linux-gnu"] + +[dependencies] +codec = { version = "3.1.5", package = "parity-scale-codec", default-features = false, features = ["derive"] } +scale-info = { version = "2.7.0", default-features = false, features = ["derive"] } + +sp-core = { path = "../../../../../../substrate/primitives/core", default-features = false } +sp-runtime = { path = "../../../../../../substrate/primitives/runtime", default-features = false } + +[dev-dependencies] +hex-literal = { version = "0.4.1" } +env_logger = "0.9" +hex = "0.4" +array-bytes = "4.1" + +[features] +default = ["std"] +std = [ + "codec/std", + "scale-info/std", + "sp-core/std", + "sp-runtime/std", +] diff --git a/bridges/snowbridge/parachain/pallets/outbound-queue/merkle-tree/src/lib.rs b/bridges/snowbridge/parachain/pallets/outbound-queue/merkle-tree/src/lib.rs new file mode 100644 index 00000000000..d03eb578ef4 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/outbound-queue/merkle-tree/src/lib.rs @@ -0,0 +1,464 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +// SPDX-FileCopyrightText: 2021-2022 Parity Technologies (UK) Ltd. +#![cfg_attr(not(feature = "std"), no_std)] +#![warn(missing_docs)] + +//! This crate implements a simple binary Merkle Tree utilities required for inter-op with Ethereum +//! bridge & Solidity contract. +//! +//! The implementation is optimised for usage within Substrate Runtime and supports no-std +//! compilation targets. +//! +//! Merkle Tree is constructed from arbitrary-length leaves, that are initially hashed using the +//! same `\[`Hasher`\]` as the inner nodes. +//! Inner nodes are created by concatenating child hashes and hashing again. The implementation +//! does not perform any sorting of the input data (leaves) nor when inner nodes are created. +//! +//! If the number of leaves is not even, last leaf (hash of) is promoted to the upper layer. + +#[cfg(not(feature = "std"))] +extern crate alloc; +#[cfg(not(feature = "std"))] +use alloc::vec; +#[cfg(not(feature = "std"))] +use alloc::vec::Vec; + +use codec::{Decode, Encode}; +use scale_info::TypeInfo; +use sp_core::{RuntimeDebug, H256}; +use sp_runtime::traits::Hash; + +/// Construct a root hash of a Binary Merkle Tree created from given leaves. +/// +/// See crate-level docs for details about Merkle Tree construction. +/// +/// In case an empty list of leaves is passed the function returns a 0-filled hash. +pub fn merkle_root(leaves: I) -> H256 +where + H: Hash, + I: Iterator, +{ + merkelize::(leaves, &mut ()) +} + +fn merkelize(leaves: I, visitor: &mut V) -> H256 +where + H: Hash, + V: Visitor, + I: Iterator, +{ + let upper = Vec::with_capacity(leaves.size_hint().0); + let mut next = match merkelize_row::(leaves, upper, visitor) { + Ok(root) => return root, + Err(next) if next.is_empty() => return H256::default(), + Err(next) => next, + }; + + let mut upper = Vec::with_capacity((next.len() + 1) / 2); + loop { + visitor.move_up(); + + match merkelize_row::(next.drain(..), upper, visitor) { + Ok(root) => return root, + Err(t) => { + // swap collections to avoid allocations + upper = next; + next = t; + }, + }; + } +} + +/// A generated merkle proof. +/// +/// The structure contains all necessary data to later on verify the proof and the leaf itself. +#[derive(Encode, Decode, RuntimeDebug, PartialEq, Eq, TypeInfo)] +pub struct MerkleProof { + /// Root hash of generated merkle tree. + pub root: H256, + /// Proof items (does not contain the leaf hash, nor the root obviously). + /// + /// This vec contains all inner node hashes necessary to reconstruct the root hash given the + /// leaf hash. + pub proof: Vec, + /// Number of leaves in the original tree. + /// + /// This is needed to detect a case where we have an odd number of leaves that "get promoted" + /// to upper layers. + pub number_of_leaves: u64, + /// Index of the leaf the proof is for (0-based). + pub leaf_index: u64, + /// Leaf content (hashed). + pub leaf: H256, +} + +/// A trait of object inspecting merkle root creation. +/// +/// It can be passed to [`merkelize_row`] or [`merkelize`] functions and will be notified +/// about tree traversal. +trait Visitor { + /// We are moving one level up in the tree. + fn move_up(&mut self); + + /// We are creating an inner node from given `left` and `right` nodes. + /// + /// Note that in case of last odd node in the row `right` might be empty. + /// The method will also visit the `root` hash (level 0). + /// + /// The `index` is an index of `left` item. + fn visit(&mut self, index: u64, left: &Option, right: &Option); +} + +/// No-op implementation of the visitor. +impl Visitor for () { + fn move_up(&mut self) {} + fn visit(&mut self, _index: u64, _left: &Option, _right: &Option) {} +} + +/// Construct a Merkle Proof for leaves given by indices. +/// +/// The function constructs a (partial) Merkle Tree first and stores all elements required +/// to prove the requested item (leaf) given the root hash. +/// +/// Both the Proof and the Root Hash are returned. +/// +/// # Panic +/// +/// The function will panic if given `leaf_index` is greater than the number of leaves. +pub fn merkle_proof(leaves: I, leaf_index: u64) -> MerkleProof +where + H: Hash, + I: Iterator, +{ + let mut leaf = None; + let mut hashes = vec![]; + let mut number_of_leaves = 0; + for (idx, l) in (0u64..).zip(leaves) { + // count the leaves + number_of_leaves = idx + 1; + hashes.push(l); + // find the leaf for the proof + if idx == leaf_index { + leaf = Some(l); + } + } + + /// The struct collects a proof for single leaf. + struct ProofCollection { + proof: Vec, + position: u64, + } + + impl ProofCollection { + fn new(position: u64) -> Self { + ProofCollection { proof: Default::default(), position } + } + } + + impl Visitor for ProofCollection { + fn move_up(&mut self) { + self.position /= 2; + } + + fn visit(&mut self, index: u64, left: &Option, right: &Option) { + // we are at left branch - right goes to the proof. + if self.position == index { + if let Some(right) = right { + self.proof.push(*right); + } + } + // we are at right branch - left goes to the proof. + if self.position == index + 1 { + if let Some(left) = left { + self.proof.push(*left); + } + } + } + } + + let mut collect_proof = ProofCollection::new(leaf_index); + + let root = merkelize::(hashes.into_iter(), &mut collect_proof); + let leaf = leaf.expect("Requested `leaf_index` is greater than number of leaves."); + + #[cfg(feature = "debug")] + log::debug!( + "[merkle_proof] Proof: {:?}", + collect_proof.proof.iter().map(hex::encode).collect::>() + ); + + MerkleProof { root, proof: collect_proof.proof, number_of_leaves, leaf_index, leaf } +} + +/// Leaf node for proof verification. +/// +/// Can be either a value that needs to be hashed first, +/// or the hash itself. +#[derive(Debug, PartialEq, Eq)] +pub enum Leaf<'a> { + /// Leaf content. + Value(&'a [u8]), + /// Hash of the leaf content. + Hash(H256), +} + +impl<'a, T: AsRef<[u8]>> From<&'a T> for Leaf<'a> { + fn from(v: &'a T) -> Self { + Leaf::Value(v.as_ref()) + } +} + +impl<'a> From for Leaf<'a> { + fn from(v: H256) -> Self { + Leaf::Hash(v) + } +} + +/// Verify Merkle Proof correctness versus given root hash. +/// +/// The proof is NOT expected to contain leaf hash as the first +/// element, but only all adjacent nodes required to eventually by process of +/// concatenating and hashing end up with given root hash. +/// +/// The proof must not contain the root hash. +pub fn verify_proof<'a, H, P, L>( + root: &'a H256, + proof: P, + number_of_leaves: u64, + leaf_index: u64, + leaf: L, +) -> bool +where + H: Hash, + P: IntoIterator, + L: Into>, +{ + if leaf_index >= number_of_leaves { + return false + } + + let leaf_hash = match leaf.into() { + Leaf::Value(content) => ::hash(content), + Leaf::Hash(hash) => hash, + }; + + let hash_len = ::LENGTH; + let mut combined = [0_u8; 64]; + let computed = proof.into_iter().fold(leaf_hash, |a, b| { + if a < b { + combined[..hash_len].copy_from_slice(a.as_ref()); + combined[hash_len..].copy_from_slice(b.as_ref()); + } else { + combined[..hash_len].copy_from_slice(b.as_ref()); + combined[hash_len..].copy_from_slice(a.as_ref()); + } + ::hash(&combined) + }); + + root == &computed +} + +/// Processes a single row (layer) of a tree by taking pairs of elements, +/// concatenating them, hashing and placing into resulting vector. +/// +/// In case only one element is provided it is returned via `Ok` result, in any other case (also an +/// empty iterator) an `Err` with the inner nodes of upper layer is returned. +fn merkelize_row( + mut iter: I, + mut next: Vec, + visitor: &mut V, +) -> Result> +where + H: Hash, + V: Visitor, + I: Iterator, +{ + #[cfg(feature = "debug")] + log::debug!("[merkelize_row]"); + next.clear(); + + let hash_len = ::LENGTH; + let mut index = 0; + let mut combined = vec![0_u8; hash_len * 2]; + loop { + let a = iter.next(); + let b = iter.next(); + visitor.visit(index, &a, &b); + + #[cfg(feature = "debug")] + log::debug!(" {:?}\n {:?}", a.as_ref().map(hex::encode), b.as_ref().map(hex::encode)); + + index += 2; + match (a, b) { + (Some(a), Some(b)) => { + if a < b { + combined[..hash_len].copy_from_slice(a.as_ref()); + combined[hash_len..].copy_from_slice(b.as_ref()); + } else { + combined[..hash_len].copy_from_slice(b.as_ref()); + combined[hash_len..].copy_from_slice(a.as_ref()); + } + + next.push(::hash(&combined)); + }, + // Odd number of items. Promote the item to the upper layer. + (Some(a), None) if !next.is_empty() => { + next.push(a); + }, + // Last item = root. + (Some(a), None) => return Ok(a), + // Finish up, no more items. + _ => { + #[cfg(feature = "debug")] + log::debug!( + "[merkelize_row] Next: {:?}", + next.iter().map(hex::encode).collect::>() + ); + return Err(next) + }, + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use hex_literal::hex; + use sp_core::keccak_256; + use sp_runtime::traits::Keccak256; + + fn make_leaves(count: u64) -> Vec { + (0..count).map(|i| keccak_256(&i.to_le_bytes()).into()).collect() + } + + #[test] + fn should_generate_empty_root() { + // given + let _ = env_logger::try_init(); + let data = vec![]; + + // when + let out = merkle_root::(data.into_iter()); + + // then + assert_eq!( + hex::encode(out), + "0000000000000000000000000000000000000000000000000000000000000000" + ); + } + + #[test] + fn should_generate_single_root() { + // given + let _ = env_logger::try_init(); + let data = make_leaves(1); + + // when + let out = merkle_root::(data.into_iter()); + + // then + assert_eq!( + hex::encode(out), + "011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce" + ); + } + + #[test] + fn should_generate_root_pow_2() { + // given + let _ = env_logger::try_init(); + let data = make_leaves(2); + + // when + let out = merkle_root::(data.into_iter()); + + // then + assert_eq!( + hex::encode(out), + "e497bd1c13b13a60af56fa0d2703517c232fde213ad20d2c3dd60735c6604512" + ); + } + + #[test] + fn should_generate_root_complex() { + let _ = env_logger::try_init(); + let test = |root, data: Vec| { + assert_eq!( + array_bytes::bytes2hex("", merkle_root::(data.into_iter()).as_ref()), + root + ); + }; + + test("816cc37bd8d39f7b0851838ebc875faf2afe58a03e95aca3b1333b3693f39dd3", make_leaves(3)); + + test("7501ea976cb92f305cca65ab11254589ea28bb8b59d3161506350adaa237d22f", make_leaves(4)); + + test("d26ba4eb398747bdd39255b1fadb99b803ce39696021b3b0bff7301ac146ee4e", make_leaves(10)); + } + + #[test] + #[ignore] + fn should_generate_and_verify_proof() { + // given + let _ = env_logger::try_init(); + let data: Vec = make_leaves(3); + + // when + let proof0 = merkle_proof::(data.clone().into_iter(), 0); + assert!(verify_proof::( + &proof0.root, + proof0.proof.clone(), + data.len() as u64, + proof0.leaf_index, + &data[0], + )); + + let proof1 = merkle_proof::(data.clone().into_iter(), 1); + assert!(verify_proof::( + &proof1.root, + proof1.proof, + data.len() as u64, + proof1.leaf_index, + &proof1.leaf, + )); + + let proof2 = merkle_proof::(data.clone().into_iter(), 2); + assert!(verify_proof::( + &proof2.root, + proof2.proof, + data.len() as u64, + proof2.leaf_index, + &proof2.leaf + )); + + // then + assert_eq!(hex::encode(proof0.root), hex::encode(proof1.root)); + assert_eq!(hex::encode(proof2.root), hex::encode(proof1.root)); + + assert!(!verify_proof::( + &H256::from_slice(&hex!( + "fb3b3be94be9e983ba5e094c9c51a7d96a4fa2e5d8e891df00ca89ba05bb1239" + )), + proof0.proof, + data.len() as u64, + proof0.leaf_index, + &proof0.leaf + )); + + assert!(!verify_proof::( + &proof0.root, + vec![], + data.len() as u64, + proof0.leaf_index, + &proof0.leaf + )); + } + + #[test] + #[should_panic] + fn should_panic_on_invalid_leaf_index() { + let _ = env_logger::try_init(); + merkle_proof::(make_leaves(1).into_iter(), 5); + } +} diff --git a/bridges/snowbridge/parachain/pallets/outbound-queue/runtime-api/Cargo.toml b/bridges/snowbridge/parachain/pallets/outbound-queue/runtime-api/Cargo.toml new file mode 100644 index 00000000000..c92e725c60d --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/outbound-queue/runtime-api/Cargo.toml @@ -0,0 +1,34 @@ +[package] +name = "snowbridge-outbound-queue-runtime-api" +description = "Snowbridge Outbound Queue Runtime API" +version = "0.1.0" +edition = "2021" +authors = ["Snowfork "] +repository = "https://github.com/Snowfork/snowbridge" +license = "Apache-2.0" + +[package.metadata.docs.rs] +targets = ["x86_64-unknown-linux-gnu"] + +[dependencies] +codec = { version = "3.1.5", package = "parity-scale-codec", features = ["derive"], default-features = false } +sp-core = { path = "../../../../../../substrate/primitives/core", default-features = false } +sp-std = { path = "../../../../../../substrate/primitives/std", default-features = false } +sp-api = { path = "../../../../../../substrate/primitives/api", default-features = false } +frame-support = { path = "../../../../../../substrate/frame/support", default-features = false } +xcm = { package = "staging-xcm", path = "../../../../../../polkadot/xcm", default-features = false } +snowbridge-outbound-queue-merkle-tree = { path = "../merkle-tree", default-features = false } +snowbridge-core = { path = "../../../primitives/core", default-features = false } + +[features] +default = ["std"] +std = [ + "codec/std", + "frame-support/std", + "snowbridge-core/std", + "snowbridge-outbound-queue-merkle-tree/std", + "sp-api/std", + "sp-core/std", + "sp-std/std", + "xcm/std", +] diff --git a/bridges/snowbridge/parachain/pallets/outbound-queue/runtime-api/src/lib.rs b/bridges/snowbridge/parachain/pallets/outbound-queue/runtime-api/src/lib.rs new file mode 100644 index 00000000000..51f46a7b49c --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/outbound-queue/runtime-api/src/lib.rs @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +#![cfg_attr(not(feature = "std"), no_std)] + +use frame_support::traits::tokens::Balance as BalanceT; +use snowbridge_core::outbound::Message; +use snowbridge_outbound_queue_merkle_tree::MerkleProof; + +sp_api::decl_runtime_apis! { + pub trait OutboundQueueApi where Balance: BalanceT + { + /// Generate a merkle proof for a committed message identified by `leaf_index`. + /// The merkle root is stored in the block header as a + /// `\[`sp_runtime::generic::DigestItem::Other`\]` + fn prove_message(leaf_index: u64) -> Option; + + /// Calculate the delivery fee for `message` + fn calculate_fee(message: Message) -> Option; + } +} diff --git a/bridges/snowbridge/parachain/pallets/outbound-queue/src/api.rs b/bridges/snowbridge/parachain/pallets/outbound-queue/src/api.rs new file mode 100644 index 00000000000..44d63f1e2d2 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/outbound-queue/src/api.rs @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +//! Helpers for implementing runtime api + +use crate::{Config, MessageLeaves}; +use frame_support::storage::StorageStreamIter; +use snowbridge_core::outbound::{Message, SendMessage}; +use snowbridge_outbound_queue_merkle_tree::{merkle_proof, MerkleProof}; + +pub fn prove_message(leaf_index: u64) -> Option +where + T: Config, +{ + if !MessageLeaves::::exists() { + return None + } + let proof = + merkle_proof::<::Hashing, _>(MessageLeaves::::stream_iter(), leaf_index); + Some(proof) +} + +pub fn calculate_fee(message: Message) -> Option +where + T: Config, +{ + match crate::Pallet::::validate(&message) { + Ok((_, fees)) => Some(fees.total()), + _ => None, + } +} diff --git a/bridges/snowbridge/parachain/pallets/outbound-queue/src/benchmarking.rs b/bridges/snowbridge/parachain/pallets/outbound-queue/src/benchmarking.rs new file mode 100644 index 00000000000..ee5754e8696 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/outbound-queue/src/benchmarking.rs @@ -0,0 +1,85 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +use super::*; + +use bridge_hub_common::AggregateMessageOrigin; +use codec::Encode; +use frame_benchmarking::v2::*; +use snowbridge_core::{ + outbound::{Command, Initializer}, + ChannelId, +}; +use sp_core::{H160, H256}; + +#[allow(unused_imports)] +use crate::Pallet as OutboundQueue; + +#[benchmarks( + where + ::MaxMessagePayloadSize: Get, +)] +mod benchmarks { + use super::*; + + /// Benchmark for processing a message. + #[benchmark] + fn do_process_message() -> Result<(), BenchmarkError> { + let enqueued_message = QueuedMessage { + id: H256::zero(), + channel_id: ChannelId::from([1; 32]), + command: Command::Upgrade { + impl_address: H160::zero(), + impl_code_hash: H256::zero(), + initializer: Some(Initializer { + params: [7u8; 256].into_iter().collect(), + maximum_required_gas: 200_000, + }), + }, + }; + let origin = AggregateMessageOrigin::Snowbridge([1; 32].into()); + let encoded_enqueued_message = enqueued_message.encode(); + + #[block] + { + let _ = OutboundQueue::::do_process_message(origin, &encoded_enqueued_message); + } + + assert_eq!(MessageLeaves::::decode_len().unwrap(), 1); + + Ok(()) + } + + /// Benchmark for producing final messages commitment + #[benchmark] + fn commit() -> Result<(), BenchmarkError> { + // Assume worst case, where `MaxMessagesPerBlock` messages need to be committed. + for i in 0..T::MaxMessagesPerBlock::get() { + let leaf_data: [u8; 1] = [i as u8]; + let leaf = ::Hashing::hash(&leaf_data); + MessageLeaves::::append(leaf); + } + + #[block] + { + OutboundQueue::::commit(); + } + + Ok(()) + } + + /// Benchmark for producing commitment for a single message + #[benchmark] + fn commit_single() -> Result<(), BenchmarkError> { + let leaf = ::Hashing::hash(&[100; 1]); + MessageLeaves::::append(leaf); + + #[block] + { + OutboundQueue::::commit(); + } + + Ok(()) + } + + impl_benchmark_test_suite!(OutboundQueue, crate::mock::new_tester(), crate::mock::Test,); +} diff --git a/bridges/snowbridge/parachain/pallets/outbound-queue/src/lib.rs b/bridges/snowbridge/parachain/pallets/outbound-queue/src/lib.rs new file mode 100644 index 00000000000..201e524fb91 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/outbound-queue/src/lib.rs @@ -0,0 +1,413 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +//! Pallet for committing outbound messages for delivery to Ethereum +//! +//! # Overview +//! +//! Messages come either from sibling parachains via XCM, or BridgeHub itself +//! via the `snowbridge-system` pallet: +//! +//! 1. `snowbridge_router_primitives::outbound::EthereumBlobExporter::deliver` +//! 2. `snowbridge_system::Pallet::send` +//! +//! The message submission pipeline works like this: +//! 1. The message is first validated via the implementation for +//! [`snowbridge_core::outbound::SendMessage::validate`] +//! 2. The message is then enqueued for later processing via the implementation for +//! [`snowbridge_core::outbound::SendMessage::deliver`] +//! 3. The underlying message queue is implemented by [`Config::MessageQueue`] +//! 4. The message queue delivers messages back to this pallet via the implementation for +//! [`frame_support::traits::ProcessMessage::process_message`] +//! 5. The message is processed in `Pallet::do_process_message`: a. Assigned a nonce b. ABI-encoded, +//! hashed, and stored in the `MessageLeaves` vector +//! 6. At the end of the block, a merkle root is constructed from all the leaves in `MessageLeaves`. +//! 7. This merkle root is inserted into the parachain header as a digest item +//! 8. Offchain relayers are able to relay the message to Ethereum after: a. Generating a merkle +//! proof for the committed message using the `prove_message` runtime API b. Reading the actual +//! message content from the `Messages` vector in storage +//! +//! On the Ethereum side, the message root is ultimately the thing being +//! verified by the Polkadot light client. +//! +//! # Message Priorities +//! +//! The processing of governance commands can never be halted. This effectively +//! allows us to pause processing of normal user messages while still allowing +//! governance commands to be sent to Ethereum. +//! +//! # Fees +//! +//! An upfront fee must be paid for delivering a message. This fee covers several +//! components: +//! 1. The weight of processing the message locally +//! 2. The gas refund paid out to relayers for message submission +//! 3. An additional reward paid out to relayers for message submission +//! +//! Messages are weighed to determine the maximum amount of gas they could +//! consume on Ethereum. Using this upper bound, a final fee can be calculated. +//! +//! The fee calculation also requires the following parameters: +//! * ETH/DOT exchange rate +//! * Ether fee per unit of gas +//! +//! By design, it is expected that governance should manually update these +//! parameters every few weeks using the `set_pricing_parameters` extrinsic in the +//! system pallet. +//! +//! ## Fee Computation Function +//! +//! ```text +//! LocalFee(Message) = WeightToFee(ProcessMessageWeight(Message)) +//! RemoteFee(Message) = MaxGasRequired(Message) * FeePerGas + Reward +//! Fee(Message) = LocalFee(Message) + (RemoteFee(Message) / Ratio("ETH/DOT")) +//! ``` +//! +//! By design, the computed fee is always going to conservative, to cover worst-case +//! costs of dispatch on Ethereum. In future iterations of the design, we will optimize +//! this, or provide a mechanism to asynchronously refund a portion of collected fees. +//! +//! # Extrinsics +//! +//! * [`Call::set_operating_mode`]: Set the operating mode +//! +//! # Runtime API +//! +//! * `prove_message`: Generate a merkle proof for a committed message +//! * `calculate_fee`: Calculate the delivery fee for a message +#![cfg_attr(not(feature = "std"), no_std)] +pub mod api; +pub mod process_message_impl; +pub mod send_message_impl; +pub mod types; +pub mod weights; + +#[cfg(feature = "runtime-benchmarks")] +mod benchmarking; + +#[cfg(test)] +mod mock; + +#[cfg(test)] +mod test; + +use bridge_hub_common::{AggregateMessageOrigin, CustomDigestItem}; +use codec::Decode; +use frame_support::{ + storage::StorageStreamIter, + traits::{tokens::Balance, Contains, Defensive, EnqueueMessage, Get, ProcessMessageError}, + weights::{Weight, WeightToFee}, +}; +use snowbridge_core::{ + outbound::{Fee, GasMeter, QueuedMessage, VersionedQueuedMessage, ETHER_DECIMALS}, + BasicOperatingMode, ChannelId, +}; +use snowbridge_outbound_queue_merkle_tree::merkle_root; +pub use snowbridge_outbound_queue_merkle_tree::MerkleProof; +use sp_core::{H256, U256}; +use sp_runtime::{ + traits::{CheckedDiv, Hash}, + DigestItem, +}; +use sp_std::prelude::*; +pub use types::{CommittedMessage, FeeConfigRecord, ProcessMessageOriginOf}; +pub use weights::WeightInfo; + +pub use pallet::*; + +#[frame_support::pallet] +pub mod pallet { + use super::*; + use frame_support::pallet_prelude::*; + use frame_system::pallet_prelude::*; + use snowbridge_core::PricingParameters; + use sp_arithmetic::FixedU128; + + #[pallet::pallet] + pub struct Pallet(_); + + #[pallet::config] + pub trait Config: frame_system::Config { + type RuntimeEvent: From> + IsType<::RuntimeEvent>; + + type Hashing: Hash; + + type MessageQueue: EnqueueMessage; + + /// Measures the maximum gas used to execute a command on Ethereum + type GasMeter: GasMeter; + + type Balance: Balance + From; + + /// Number of decimal places in native currency + #[pallet::constant] + type Decimals: Get; + + /// Max bytes in a message payload + #[pallet::constant] + type MaxMessagePayloadSize: Get; + + /// Max number of messages processed per block + #[pallet::constant] + type MaxMessagesPerBlock: Get; + + /// Check whether a channel exists + type Channels: Contains; + + type PricingParameters: Get>; + + /// Convert a weight value into a deductible fee based. + type WeightToFee: WeightToFee; + + /// Weight information for extrinsics in this pallet + type WeightInfo: WeightInfo; + } + + #[pallet::event] + #[pallet::generate_deposit(pub(super) fn deposit_event)] + pub enum Event { + /// Message has been queued and will be processed in the future + MessageQueued { + /// ID of the message. Usually the XCM message hash or a SetTopic. + id: H256, + }, + /// Message will be committed at the end of current block. From now on, to track the + /// progress the message, use the `nonce` of `id`. + MessageAccepted { + /// ID of the message + id: H256, + /// The nonce assigned to this message + nonce: u64, + }, + /// Some messages have been committed + MessagesCommitted { + /// Merkle root of the committed messages + root: H256, + /// number of committed messages + count: u64, + }, + /// Set OperatingMode + OperatingModeChanged { + mode: BasicOperatingMode, + }, + FeeConfigChanged { + fee_config: FeeConfigRecord, + }, + } + + #[pallet::error] + pub enum Error { + /// The message is too large + MessageTooLarge, + /// The pallet is halted + Halted, + // Invalid fee config + InvalidFeeConfig, + /// Invalid Channel + InvalidChannel, + } + + /// Messages to be committed in the current block. This storage value is killed in + /// `on_initialize`, so should never go into block PoV. + /// + /// Is never read in the runtime, only by offchain message relayers. + /// + /// Inspired by the `frame_system::Pallet::Events` storage value + #[pallet::storage] + #[pallet::unbounded] + pub(super) type Messages = StorageValue<_, Vec, ValueQuery>; + + /// Hashes of the ABI-encoded messages in the [`Messages`] storage value. Used to generate a + /// merkle root during `on_finalize`. This storage value is killed in + /// `on_initialize`, so should never go into block PoV. + #[pallet::storage] + #[pallet::unbounded] + #[pallet::getter(fn message_leaves)] + pub(super) type MessageLeaves = StorageValue<_, Vec, ValueQuery>; + + /// The current nonce for each message origin + #[pallet::storage] + pub type Nonce = StorageMap<_, Twox64Concat, ChannelId, u64, ValueQuery>; + + /// The current operating mode of the pallet. + #[pallet::storage] + #[pallet::getter(fn operating_mode)] + pub type OperatingMode = StorageValue<_, BasicOperatingMode, ValueQuery>; + + #[pallet::hooks] + impl Hooks> for Pallet + where + T::AccountId: AsRef<[u8]>, + { + fn on_initialize(_: BlockNumberFor) -> Weight { + // Remove storage from previous block + Messages::::kill(); + MessageLeaves::::kill(); + // Reserve some weight for the `on_finalize` handler + T::WeightInfo::commit() + } + + fn on_finalize(_: BlockNumberFor) { + Self::commit(); + } + + fn integrity_test() { + let decimals = T::Decimals::get(); + assert!(decimals == 10 || decimals == 12, "Decimals should be 10 or 12"); + } + } + + #[pallet::call] + impl Pallet { + /// Halt or resume all pallet operations. May only be called by root. + #[pallet::call_index(0)] + #[pallet::weight((T::DbWeight::get().reads_writes(1, 1), DispatchClass::Operational))] + pub fn set_operating_mode( + origin: OriginFor, + mode: BasicOperatingMode, + ) -> DispatchResult { + ensure_root(origin)?; + OperatingMode::::put(mode); + Self::deposit_event(Event::OperatingModeChanged { mode }); + Ok(()) + } + } + + impl Pallet { + /// Generate a messages commitment and insert it into the header digest + pub(crate) fn commit() { + let count = MessageLeaves::::decode_len().unwrap_or_default() as u64; + if count == 0 { + return + } + + // Create merkle root of messages + let root = merkle_root::<::Hashing, _>(MessageLeaves::::stream_iter()); + + let digest_item: DigestItem = CustomDigestItem::Snowbridge(root).into(); + + // Insert merkle root into the header digest + >::deposit_log(digest_item); + + Self::deposit_event(Event::MessagesCommitted { root, count }); + } + + /// Process a message delivered by the MessageQueue pallet + pub(crate) fn do_process_message( + _: ProcessMessageOriginOf, + mut message: &[u8], + ) -> Result { + use ProcessMessageError::*; + + // Yield if the maximum number of messages has been processed this block. + // This ensures that the weight of `on_finalize` has a known maximum bound. + ensure!( + MessageLeaves::::decode_len().unwrap_or(0) < + T::MaxMessagesPerBlock::get() as usize, + Yield + ); + + // Decode bytes into versioned message + let versioned_queued_message: VersionedQueuedMessage = + VersionedQueuedMessage::decode(&mut message).map_err(|_| Corrupt)?; + + // Convert versioned message into latest supported message version + let queued_message: QueuedMessage = + versioned_queued_message.try_into().map_err(|_| Unsupported)?; + + // Obtain next nonce + let nonce = >::try_mutate( + queued_message.channel_id, + |nonce| -> Result { + *nonce = nonce.checked_add(1).ok_or(Unsupported)?; + Ok(*nonce) + }, + )?; + + let pricing_params = T::PricingParameters::get(); + let command = queued_message.command.index(); + let params = queued_message.command.abi_encode(); + let max_dispatch_gas = + T::GasMeter::maximum_dispatch_gas_used_at_most(&queued_message.command); + let reward = pricing_params.rewards.remote; + + // Construct the final committed message + let message = CommittedMessage { + channel_id: queued_message.channel_id, + nonce, + command, + params, + max_dispatch_gas, + max_fee_per_gas: pricing_params + .fee_per_gas + .try_into() + .defensive_unwrap_or(u128::MAX), + reward: reward.try_into().defensive_unwrap_or(u128::MAX), + id: queued_message.id, + }; + + // ABI-encode and hash the prepared message + let message_abi_encoded = ethabi::encode(&[message.clone().into()]); + let message_abi_encoded_hash = ::Hashing::hash(&message_abi_encoded); + + Messages::::append(Box::new(message)); + MessageLeaves::::append(message_abi_encoded_hash); + + Self::deposit_event(Event::MessageAccepted { id: queued_message.id, nonce }); + + Ok(true) + } + + /// Calculate total fee in native currency to cover all costs of delivering a message to the + /// remote destination. See module-level documentation for more details. + pub(crate) fn calculate_fee( + gas_used_at_most: u64, + params: PricingParameters, + ) -> Fee { + // Remote fee in ether + let fee = Self::calculate_remote_fee( + gas_used_at_most, + params.fee_per_gas, + params.rewards.remote, + ); + + // downcast to u128 + let fee: u128 = fee.try_into().defensive_unwrap_or(u128::MAX); + + // convert to local currency + let fee = FixedU128::from_inner(fee) + .checked_div(¶ms.exchange_rate) + .expect("exchange rate is not zero; qed") + .into_inner(); + + // adjust fixed point to match local currency + let fee = Self::convert_from_ether_decimals(fee); + + Fee::from((Self::calculate_local_fee(), fee)) + } + + /// Calculate fee in remote currency for dispatching a message on Ethereum + pub(crate) fn calculate_remote_fee( + gas_used_at_most: u64, + fee_per_gas: U256, + reward: U256, + ) -> U256 { + fee_per_gas.saturating_mul(gas_used_at_most.into()).saturating_add(reward) + } + + /// The local component of the message processing fees in native currency + pub(crate) fn calculate_local_fee() -> T::Balance { + T::WeightToFee::weight_to_fee( + &T::WeightInfo::do_process_message().saturating_add(T::WeightInfo::commit_single()), + ) + } + + // 1 DOT has 10 digits of precision + // 1 KSM has 12 digits of precision + // 1 ETH has 18 digits of precision + pub(crate) fn convert_from_ether_decimals(value: u128) -> T::Balance { + let decimals = ETHER_DECIMALS.saturating_sub(T::Decimals::get()) as u32; + let denom = 10u128.saturating_pow(decimals); + value.checked_div(denom).expect("divisor is non-zero; qed").into() + } + } +} diff --git a/bridges/snowbridge/parachain/pallets/outbound-queue/src/mock.rs b/bridges/snowbridge/parachain/pallets/outbound-queue/src/mock.rs new file mode 100644 index 00000000000..dd8fee4e2ed --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/outbound-queue/src/mock.rs @@ -0,0 +1,189 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +use super::*; + +use frame_support::{ + parameter_types, + traits::{Everything, Hooks}, + weights::IdentityFee, +}; + +use snowbridge_core::{ + gwei, meth, + outbound::*, + pricing::{PricingParameters, Rewards}, + ParaId, PRIMARY_GOVERNANCE_CHANNEL, +}; +use sp_core::{ConstU32, ConstU8, H160, H256}; +use sp_runtime::{ + traits::{BlakeTwo256, IdentityLookup, Keccak256}, + AccountId32, BuildStorage, FixedU128, +}; +use sp_std::marker::PhantomData; + +type Block = frame_system::mocking::MockBlock; +type AccountId = AccountId32; + +frame_support::construct_runtime!( + pub enum Test + { + System: frame_system::{Pallet, Call, Storage, Event}, + MessageQueue: pallet_message_queue::{Pallet, Call, Storage, Event}, + OutboundQueue: crate::{Pallet, Storage, Event}, + } +); + +parameter_types! { + pub const BlockHashCount: u64 = 250; +} + +impl frame_system::Config for Test { + type BaseCallFilter = Everything; + type BlockWeights = (); + type BlockLength = (); + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + type RuntimeTask = RuntimeTask; + type Hash = H256; + type Hashing = BlakeTwo256; + type AccountId = AccountId; + type Lookup = IdentityLookup; + type RuntimeEvent = RuntimeEvent; + type BlockHashCount = BlockHashCount; + type DbWeight = (); + type Version = (); + type PalletInfo = PalletInfo; + type AccountData = (); + type OnNewAccount = (); + type OnKilledAccount = (); + type SystemWeightInfo = (); + type SS58Prefix = (); + type OnSetCode = (); + type MaxConsumers = frame_support::traits::ConstU32<16>; + type Nonce = u64; + type Block = Block; +} + +parameter_types! { + pub const HeapSize: u32 = 32 * 1024; + pub const MaxStale: u32 = 32; + pub static ServiceWeight: Option = Some(Weight::from_parts(100, 100)); +} + +impl pallet_message_queue::Config for Test { + type RuntimeEvent = RuntimeEvent; + type WeightInfo = (); + type MessageProcessor = OutboundQueue; + type Size = u32; + type QueueChangeHandler = (); + type HeapSize = HeapSize; + type MaxStale = MaxStale; + type ServiceWeight = ServiceWeight; + type QueuePausedQuery = (); +} + +parameter_types! { + pub const OwnParaId: ParaId = ParaId::new(1013); + pub Parameters: PricingParameters = PricingParameters { + exchange_rate: FixedU128::from_rational(1, 400), + fee_per_gas: gwei(20), + rewards: Rewards { local: DOT, remote: meth(1) } + }; +} + +pub const DOT: u128 = 10_000_000_000; + +impl crate::Config for Test { + type RuntimeEvent = RuntimeEvent; + type Hashing = Keccak256; + type MessageQueue = MessageQueue; + type Decimals = ConstU8<12>; + type MaxMessagePayloadSize = ConstU32<1024>; + type MaxMessagesPerBlock = ConstU32<20>; + type GasMeter = ConstantGasMeter; + type Balance = u128; + type PricingParameters = Parameters; + type Channels = Everything; + type WeightToFee = IdentityFee; + type WeightInfo = (); +} + +fn setup() { + System::set_block_number(1); +} + +pub fn new_tester() -> sp_io::TestExternalities { + let storage = frame_system::GenesisConfig::::default().build_storage().unwrap(); + let mut ext: sp_io::TestExternalities = storage.into(); + ext.execute_with(setup); + ext +} + +pub fn run_to_end_of_next_block() { + // finish current block + MessageQueue::on_finalize(System::block_number()); + OutboundQueue::on_finalize(System::block_number()); + System::on_finalize(System::block_number()); + // start next block + System::set_block_number(System::block_number() + 1); + System::on_initialize(System::block_number()); + OutboundQueue::on_initialize(System::block_number()); + MessageQueue::on_initialize(System::block_number()); + // finish next block + MessageQueue::on_finalize(System::block_number()); + OutboundQueue::on_finalize(System::block_number()); + System::on_finalize(System::block_number()); +} + +pub fn mock_governance_message() -> Message +where + T: Config, +{ + let _marker = PhantomData::; // for clippy + + Message { + id: None, + channel_id: PRIMARY_GOVERNANCE_CHANNEL, + command: Command::Upgrade { + impl_address: H160::zero(), + impl_code_hash: H256::zero(), + initializer: None, + }, + } +} + +// Message should fail validation as it is too large +pub fn mock_invalid_governance_message() -> Message +where + T: Config, +{ + let _marker = PhantomData::; // for clippy + + Message { + id: None, + channel_id: PRIMARY_GOVERNANCE_CHANNEL, + command: Command::Upgrade { + impl_address: H160::zero(), + impl_code_hash: H256::zero(), + initializer: Some(Initializer { + params: (0..1000).map(|_| 1u8).collect::>(), + maximum_required_gas: 0, + }), + }, + } +} + +pub fn mock_message(sibling_para_id: u32) -> Message { + Message { + id: None, + channel_id: ParaId::from(sibling_para_id).into(), + command: Command::AgentExecute { + agent_id: Default::default(), + command: AgentExecuteCommand::TransferToken { + token: Default::default(), + recipient: Default::default(), + amount: 0, + }, + }, + } +} diff --git a/bridges/snowbridge/parachain/pallets/outbound-queue/src/process_message_impl.rs b/bridges/snowbridge/parachain/pallets/outbound-queue/src/process_message_impl.rs new file mode 100644 index 00000000000..575ed9e0e7c --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/outbound-queue/src/process_message_impl.rs @@ -0,0 +1,23 @@ +//! Implementation for [`frame_support::traits::ProcessMessage`] +use super::*; +use crate::weights::WeightInfo; +use frame_support::{ + traits::{ProcessMessage, ProcessMessageError}, + weights::WeightMeter, +}; + +impl ProcessMessage for Pallet { + type Origin = AggregateMessageOrigin; + fn process_message( + message: &[u8], + origin: Self::Origin, + meter: &mut WeightMeter, + _: &mut [u8; 32], + ) -> Result { + let weight = T::WeightInfo::do_process_message(); + if meter.try_consume(weight).is_err() { + return Err(ProcessMessageError::Overweight(weight)) + } + Self::do_process_message(origin, message) + } +} diff --git a/bridges/snowbridge/parachain/pallets/outbound-queue/src/send_message_impl.rs b/bridges/snowbridge/parachain/pallets/outbound-queue/src/send_message_impl.rs new file mode 100644 index 00000000000..a84e2c520e5 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/outbound-queue/src/send_message_impl.rs @@ -0,0 +1,98 @@ +//! Implementation for [`snowbridge_core::outbound::SendMessage`] +use super::*; +use bridge_hub_common::AggregateMessageOrigin; +use codec::Encode; +use frame_support::{ + ensure, + traits::{EnqueueMessage, Get}, + CloneNoBound, PartialEqNoBound, RuntimeDebugNoBound, +}; +use frame_system::unique; +use snowbridge_core::{ + outbound::{ + Fee, Message, QueuedMessage, SendError, SendMessage, SendMessageFeeProvider, + VersionedQueuedMessage, + }, + ChannelId, PRIMARY_GOVERNANCE_CHANNEL, +}; +use sp_core::H256; +use sp_runtime::BoundedVec; + +/// The maximal length of an enqueued message, as determined by the MessageQueue pallet +pub type MaxEnqueuedMessageSizeOf = + <::MessageQueue as EnqueueMessage>::MaxMessageLen; + +#[derive(Encode, Decode, CloneNoBound, PartialEqNoBound, RuntimeDebugNoBound)] +pub struct Ticket +where + T: Config, +{ + pub message_id: H256, + pub channel_id: ChannelId, + pub message: BoundedVec>, +} + +impl SendMessage for Pallet +where + T: Config, +{ + type Ticket = Ticket; + + fn validate( + message: &Message, + ) -> Result<(Self::Ticket, Fee<::Balance>), SendError> { + // The inner payload should not be too large + let payload = message.command.abi_encode(); + ensure!( + payload.len() < T::MaxMessagePayloadSize::get() as usize, + SendError::MessageTooLarge + ); + + // Ensure there is a registered channel we can transmit this message on + ensure!(T::Channels::contains(&message.channel_id), SendError::InvalidChannel); + + // Generate a unique message id unless one is provided + let message_id: H256 = message + .id + .unwrap_or_else(|| unique((message.channel_id, &message.command)).into()); + + let gas_used_at_most = T::GasMeter::maximum_gas_used_at_most(&message.command); + let fee = Self::calculate_fee(gas_used_at_most, T::PricingParameters::get()); + + let queued_message: VersionedQueuedMessage = QueuedMessage { + id: message_id, + channel_id: message.channel_id, + command: message.command.clone(), + } + .into(); + // The whole message should not be too large + let encoded = queued_message.encode().try_into().map_err(|_| SendError::MessageTooLarge)?; + + let ticket = Ticket { message_id, channel_id: message.channel_id, message: encoded }; + + Ok((ticket, fee)) + } + + fn deliver(ticket: Self::Ticket) -> Result { + let origin = AggregateMessageOrigin::Snowbridge(ticket.channel_id); + + if ticket.channel_id != PRIMARY_GOVERNANCE_CHANNEL { + ensure!(!Self::operating_mode().is_halted(), SendError::Halted); + } + + let message = ticket.message.as_bounded_slice(); + + T::MessageQueue::enqueue_message(message, origin); + Self::deposit_event(Event::MessageQueued { id: ticket.message_id }); + Ok(ticket.message_id) + } +} + +impl SendMessageFeeProvider for Pallet { + type Balance = T::Balance; + + /// The local component of the message processing fees in native currency + fn local_fee() -> Self::Balance { + Self::calculate_local_fee() + } +} diff --git a/bridges/snowbridge/parachain/pallets/outbound-queue/src/test.rs b/bridges/snowbridge/parachain/pallets/outbound-queue/src/test.rs new file mode 100644 index 00000000000..0028d75e7b7 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/outbound-queue/src/test.rs @@ -0,0 +1,268 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +use crate::{mock::*, *}; + +use frame_support::{ + assert_err, assert_noop, assert_ok, + traits::{Hooks, ProcessMessage, ProcessMessageError}, + weights::WeightMeter, +}; + +use codec::Encode; +use snowbridge_core::{ + outbound::{Command, SendError, SendMessage}, + ParaId, +}; +use sp_arithmetic::FixedU128; +use sp_core::H256; +use sp_runtime::FixedPointNumber; + +#[test] +fn submit_messages_and_commit() { + new_tester().execute_with(|| { + for para_id in 1000..1004 { + let message = mock_message(para_id); + let (ticket, _) = OutboundQueue::validate(&message).unwrap(); + assert_ok!(OutboundQueue::deliver(ticket)); + } + + ServiceWeight::set(Some(Weight::MAX)); + run_to_end_of_next_block(); + + for para_id in 1000..1004 { + let origin: ParaId = (para_id as u32).into(); + let channel_id: ChannelId = origin.into(); + assert_eq!(Nonce::::get(channel_id), 1); + } + + let digest = System::digest(); + let digest_items = digest.logs(); + assert!(digest_items.len() == 1 && digest_items[0].as_other().is_some()); + assert_eq!(Messages::::decode_len(), Some(4)); + }); +} + +#[test] +fn submit_message_fail_too_large() { + new_tester().execute_with(|| { + let message = mock_invalid_governance_message::(); + assert_err!(OutboundQueue::validate(&message), SendError::MessageTooLarge); + }); +} + +#[test] +fn convert_from_ether_decimals() { + assert_eq!( + OutboundQueue::convert_from_ether_decimals(1_000_000_000_000_000_000), + 1_000_000_000_000 + ); +} + +#[test] +fn commit_exits_early_if_no_processed_messages() { + new_tester().execute_with(|| { + // on_finalize should do nothing, nor should it panic + OutboundQueue::on_finalize(System::block_number()); + + let digest = System::digest(); + let digest_items = digest.logs(); + assert_eq!(digest_items.len(), 0); + }); +} + +#[test] +fn process_message_yields_on_max_messages_per_block() { + new_tester().execute_with(|| { + for _ in 0..::MaxMessagesPerBlock::get() { + MessageLeaves::::append(H256::zero()) + } + + let channel_id: ChannelId = ParaId::from(1000).into(); + let origin = AggregateMessageOrigin::Snowbridge(channel_id); + let message = QueuedMessage { + id: Default::default(), + channel_id, + command: Command::Upgrade { + impl_address: Default::default(), + impl_code_hash: Default::default(), + initializer: None, + }, + } + .encode(); + + let mut meter = WeightMeter::new(); + + assert_noop!( + OutboundQueue::process_message(message.as_slice(), origin, &mut meter, &mut [0u8; 32]), + ProcessMessageError::Yield + ); + }) +} + +#[test] +fn process_message_fails_on_max_nonce_reached() { + new_tester().execute_with(|| { + let sibling_id = 1000; + let channel_id: ChannelId = ParaId::from(sibling_id).into(); + let origin = AggregateMessageOrigin::Snowbridge(channel_id); + let message: QueuedMessage = QueuedMessage { + id: H256::zero(), + channel_id, + command: mock_message(sibling_id).command, + }; + let versioned_queued_message: VersionedQueuedMessage = message.try_into().unwrap(); + let encoded = versioned_queued_message.encode(); + let mut meter = WeightMeter::with_limit(Weight::MAX); + + Nonce::::set(channel_id, u64::MAX); + + assert_noop!( + OutboundQueue::process_message(encoded.as_slice(), origin, &mut meter, &mut [0u8; 32]), + ProcessMessageError::Unsupported + ); + }) +} + +#[test] +fn process_message_fails_on_overweight_message() { + new_tester().execute_with(|| { + let sibling_id = 1000; + let channel_id: ChannelId = ParaId::from(sibling_id).into(); + let origin = AggregateMessageOrigin::Snowbridge(channel_id); + let message: QueuedMessage = QueuedMessage { + id: H256::zero(), + channel_id, + command: mock_message(sibling_id).command, + }; + let versioned_queued_message: VersionedQueuedMessage = message.try_into().unwrap(); + let encoded = versioned_queued_message.encode(); + let mut meter = WeightMeter::with_limit(Weight::from_parts(1, 1)); + assert_noop!( + OutboundQueue::process_message(encoded.as_slice(), origin, &mut meter, &mut [0u8; 32]), + ProcessMessageError::Overweight(::WeightInfo::do_process_message()) + ); + }) +} + +// Governance messages should be able to bypass a halted operating mode +// Other message sends should fail when halted +#[test] +fn submit_upgrade_message_success_when_queue_halted() { + new_tester().execute_with(|| { + // halt the outbound queue + OutboundQueue::set_operating_mode(RuntimeOrigin::root(), BasicOperatingMode::Halted) + .unwrap(); + + // submit a high priority message from bridge_hub should success + let message = mock_governance_message::(); + let (ticket, _) = OutboundQueue::validate(&message).unwrap(); + assert_ok!(OutboundQueue::deliver(ticket)); + + // submit a low priority message from asset_hub will fail as pallet is halted + let message = mock_message(1000); + let (ticket, _) = OutboundQueue::validate(&message).unwrap(); + assert_noop!(OutboundQueue::deliver(ticket), SendError::Halted); + }); +} + +#[test] +fn governance_message_does_not_get_the_chance_to_processed_in_same_block_when_congest_of_low_priority_sibling_messages( +) { + use snowbridge_core::PRIMARY_GOVERNANCE_CHANNEL; + use AggregateMessageOrigin::*; + + let sibling_id: u32 = 1000; + let sibling_channel_id: ChannelId = ParaId::from(sibling_id).into(); + + new_tester().execute_with(|| { + // submit a lot of low priority messages from asset_hub which will need multiple blocks to + // execute(20 messages for each block so 40 required at least 2 blocks) + let max_messages = 40; + for _ in 0..max_messages { + // submit low priority message + let message = mock_message(sibling_id); + let (ticket, _) = OutboundQueue::validate(&message).unwrap(); + OutboundQueue::deliver(ticket).unwrap(); + } + + let footprint = MessageQueue::footprint(Snowbridge(sibling_channel_id)); + assert_eq!(footprint.storage.count, (max_messages) as u64); + + let message = mock_governance_message::(); + let (ticket, _) = OutboundQueue::validate(&message).unwrap(); + OutboundQueue::deliver(ticket).unwrap(); + + // move to next block + ServiceWeight::set(Some(Weight::MAX)); + run_to_end_of_next_block(); + + // first process 20 messages from sibling channel + let footprint = MessageQueue::footprint(Snowbridge(sibling_channel_id)); + assert_eq!(footprint.storage.count, 40 - 20); + + // and governance message does not have the chance to execute in same block + let footprint = MessageQueue::footprint(Snowbridge(PRIMARY_GOVERNANCE_CHANNEL)); + assert_eq!(footprint.storage.count, 1); + + // move to next block + ServiceWeight::set(Some(Weight::MAX)); + run_to_end_of_next_block(); + + // now governance message get executed in this block + let footprint = MessageQueue::footprint(Snowbridge(PRIMARY_GOVERNANCE_CHANNEL)); + assert_eq!(footprint.storage.count, 0); + + // and this time process 19 messages from sibling channel so we have 1 message left + let footprint = MessageQueue::footprint(Snowbridge(sibling_channel_id)); + assert_eq!(footprint.storage.count, 1); + + // move to the next block, the last 1 message from sibling channel get executed + ServiceWeight::set(Some(Weight::MAX)); + run_to_end_of_next_block(); + let footprint = MessageQueue::footprint(Snowbridge(sibling_channel_id)); + assert_eq!(footprint.storage.count, 0); + }); +} + +#[test] +fn convert_local_currency() { + new_tester().execute_with(|| { + let fee: u128 = 1_000_000; + let fee1 = FixedU128::from_inner(fee).into_inner(); + let fee2 = FixedU128::from(fee) + .into_inner() + .checked_div(FixedU128::accuracy()) + .expect("accuracy is not zero; qed"); + assert_eq!(fee, fee1); + assert_eq!(fee, fee2); + }); +} + +#[test] +fn encode_digest_item_with_correct_index() { + new_tester().execute_with(|| { + let digest_item: DigestItem = CustomDigestItem::Snowbridge(H256::default()).into(); + let enum_prefix = match digest_item { + DigestItem::Other(data) => data[0], + _ => u8::MAX, + }; + assert_eq!(enum_prefix, 0); + }); +} + +#[test] +fn encode_digest_item() { + new_tester().execute_with(|| { + let digest_item: DigestItem = CustomDigestItem::Snowbridge([5u8; 32].into()).into(); + let digest_item_raw = digest_item.encode(); + assert_eq!(digest_item_raw[0], 0); // DigestItem::Other + assert_eq!(digest_item_raw[2], 0); // CustomDigestItem::Snowbridge + assert_eq!( + digest_item_raw, + [ + 0, 132, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5 + ] + ); + }); +} diff --git a/bridges/snowbridge/parachain/pallets/outbound-queue/src/types.rs b/bridges/snowbridge/parachain/pallets/outbound-queue/src/types.rs new file mode 100644 index 00000000000..07803ed9b73 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/outbound-queue/src/types.rs @@ -0,0 +1,99 @@ +use codec::{Decode, Encode, MaxEncodedLen}; +use ethabi::Token; +use frame_support::traits::ProcessMessage; +use scale_info::TypeInfo; +use serde::{Deserialize, Serialize}; +use sp_arithmetic::FixedU128; +use sp_core::H256; +use sp_runtime::{traits::Zero, RuntimeDebug}; +use sp_std::prelude::*; + +use super::Pallet; + +use snowbridge_core::ChannelId; +pub use snowbridge_outbound_queue_merkle_tree::MerkleProof; + +pub type ProcessMessageOriginOf = as ProcessMessage>::Origin; + +pub const LOG_TARGET: &str = "snowbridge-outbound-queue"; + +/// Message which has been assigned a nonce and will be committed at the end of a block +#[derive(Encode, Decode, Clone, PartialEq, RuntimeDebug, TypeInfo)] +pub struct CommittedMessage { + /// Message channel + pub channel_id: ChannelId, + /// Unique nonce to prevent replaying messages + #[codec(compact)] + pub nonce: u64, + /// Command to execute in the Gateway contract + pub command: u8, + /// Params for the command + pub params: Vec, + /// Maximum gas allowed for message dispatch + #[codec(compact)] + pub max_dispatch_gas: u64, + /// Maximum fee per gas + #[codec(compact)] + pub max_fee_per_gas: u128, + /// Reward in ether for delivering this message, in addition to the gas refund + #[codec(compact)] + pub reward: u128, + /// Message ID (Used for tracing messages across route, has no role in consensus) + pub id: H256, +} + +/// Convert message into an ABI-encoded form for delivery to the InboundQueue contract on Ethereum +impl From for Token { + fn from(x: CommittedMessage) -> Token { + Token::Tuple(vec![ + Token::FixedBytes(Vec::from(x.channel_id.as_ref())), + Token::Uint(x.nonce.into()), + Token::Uint(x.command.into()), + Token::Bytes(x.params.to_vec()), + Token::Uint(x.max_dispatch_gas.into()), + Token::Uint(x.max_fee_per_gas.into()), + Token::Uint(x.reward.into()), + Token::FixedBytes(Vec::from(x.id.as_ref())), + ]) + } +} + +/// Configuration for fee calculations +#[derive( + Encode, + Decode, + Copy, + Clone, + PartialEq, + RuntimeDebug, + MaxEncodedLen, + TypeInfo, + Serialize, + Deserialize, +)] +pub struct FeeConfigRecord { + /// ETH/DOT exchange rate + pub exchange_rate: FixedU128, + /// Ether fee per unit of gas + pub fee_per_gas: u128, + /// Ether reward for delivering message + pub reward: u128, +} + +#[derive(RuntimeDebug)] +pub struct InvalidFeeConfig; + +impl FeeConfigRecord { + pub fn validate(&self) -> Result<(), InvalidFeeConfig> { + if self.exchange_rate == FixedU128::zero() { + return Err(InvalidFeeConfig) + } + if self.fee_per_gas == 0 { + return Err(InvalidFeeConfig) + } + if self.reward == 0 { + return Err(InvalidFeeConfig) + } + Ok(()) + } +} diff --git a/bridges/snowbridge/parachain/pallets/outbound-queue/src/weights.rs b/bridges/snowbridge/parachain/pallets/outbound-queue/src/weights.rs new file mode 100644 index 00000000000..e4b6f8439b0 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/outbound-queue/src/weights.rs @@ -0,0 +1,81 @@ + +//! Autogenerated weights for `snowbridge_outbound_queue` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-10-19, STEPS: `2`, REPEAT: `1`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `192.168.1.7`, CPU: `` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-rococo-dev")`, DB CACHE: `1024` + +// Executed Command: +// target/release/polkadot-parachain +// benchmark +// pallet +// --chain=bridge-hub-rococo-dev +// --pallet=snowbridge_outbound_queue +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --template +// ../parachain/templates/module-weight-template.hbs +// --output +// ../parachain/pallets/outbound-queue/src/weights.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; +use core::marker::PhantomData; + +/// Weight functions needed for `snowbridge_outbound_queue`. +pub trait WeightInfo { + fn do_process_message() -> Weight; + fn commit() -> Weight; + fn commit_single() -> Weight; +} + +// For backwards compatibility and tests. +impl WeightInfo for () { + /// Storage: EthereumOutboundQueue MessageLeaves (r:1 w:1) + /// Proof Skipped: EthereumOutboundQueue MessageLeaves (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: EthereumOutboundQueue PendingHighPriorityMessageCount (r:1 w:1) + /// Proof: EthereumOutboundQueue PendingHighPriorityMessageCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: EthereumOutboundQueue Nonce (r:1 w:1) + /// Proof: EthereumOutboundQueue Nonce (max_values: None, max_size: Some(20), added: 2495, mode: MaxEncodedLen) + /// Storage: EthereumOutboundQueue Messages (r:1 w:1) + /// Proof Skipped: EthereumOutboundQueue Messages (max_values: Some(1), max_size: None, mode: Measured) + fn do_process_message() -> Weight { + // Proof Size summary in bytes: + // Measured: `42` + // Estimated: `3485` + // Minimum execution time: 39_000_000 picoseconds. + Weight::from_parts(39_000_000, 3485) + .saturating_add(RocksDbWeight::get().reads(4_u64)) + .saturating_add(RocksDbWeight::get().writes(4_u64)) + } + /// Storage: EthereumOutboundQueue MessageLeaves (r:1 w:0) + /// Proof Skipped: EthereumOutboundQueue MessageLeaves (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: System Digest (r:1 w:1) + /// Proof Skipped: System Digest (max_values: Some(1), max_size: None, mode: Measured) + fn commit() -> Weight { + // Proof Size summary in bytes: + // Measured: `1094` + // Estimated: `2579` + // Minimum execution time: 28_000_000 picoseconds. + Weight::from_parts(28_000_000, 2579) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } + + fn commit_single() -> Weight { + // Proof Size summary in bytes: + // Measured: `1094` + // Estimated: `2579` + // Minimum execution time: 9_000_000 picoseconds. + Weight::from_parts(9_000_000, 1586) + .saturating_add(RocksDbWeight::get().reads(2_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } +} diff --git a/bridges/snowbridge/parachain/pallets/system/Cargo.toml b/bridges/snowbridge/parachain/pallets/system/Cargo.toml new file mode 100644 index 00000000000..4356bf57220 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/system/Cargo.toml @@ -0,0 +1,83 @@ +[package] +name = "snowbridge-system" +description = "Snowbridge System" +version = "0.1.1" +authors = ["Snowfork "] +edition = "2021" +repository = "https://github.com/Snowfork/snowbridge" +license = "Apache-2.0" + +[package.metadata.docs.rs] +targets = ["x86_64-unknown-linux-gnu"] + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = [ + "derive", +] } +scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } +frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking", default-features = false, optional = true } +frame-support = { path = "../../../../../substrate/frame/support", default-features = false } +frame-system = { path = "../../../../../substrate/frame/system", default-features = false } +log = { version = "0.4.20", default-features = false } + +sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } +sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } +sp-io = { path = "../../../../../substrate/primitives/io", default-features = false } +sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-features = false } + +xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } +xcm-builder = { package = "staging-xcm-builder", path = "../../../../../polkadot/xcm/xcm-builder", default-features = false } +xcm-executor = { package = "staging-xcm-executor", path = "../../../../../polkadot/xcm/xcm-executor", default-features = false } + +ethabi = { git = "https://github.com/Snowfork/ethabi-decode.git", package = "ethabi-decode", branch = "master", default-features = false } +snowbridge-core = { path = "../../primitives/core", default-features = false } + +[dev-dependencies] +hex = "0.4.1" +hex-literal = { version = "0.4.1" } +pallet-balances = { path = "../../../../../substrate/frame/balances" } +sp-keyring = { path = "../../../../../substrate/primitives/keyring" } +polkadot-primitives = { path = "../../../../../polkadot/primitives" } +pallet-message-queue = { path = "../../../../../substrate/frame/message-queue" } +snowbridge-outbound-queue = { path = "../outbound-queue" } + +[features] +default = ["std"] +std = [ + "codec/std", + "ethabi/std", + "frame-benchmarking?/std", + "frame-support/std", + "frame-system/std", + "log/std", + "scale-info/std", + "snowbridge-core/std", + "sp-core/std", + "sp-io/std", + "sp-runtime/std", + "sp-std/std", + "xcm-builder/std", + "xcm-executor/std", + "xcm/std", +] +runtime-benchmarks = [ + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "pallet-balances/runtime-benchmarks", + "pallet-message-queue/runtime-benchmarks", + "polkadot-primitives/runtime-benchmarks", + "snowbridge-core/runtime-benchmarks", + "snowbridge-outbound-queue/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", + "xcm-builder/runtime-benchmarks", + "xcm-executor/runtime-benchmarks", +] +try-runtime = [ + "frame-support/try-runtime", + "frame-system/try-runtime", + "pallet-balances/try-runtime", + "pallet-message-queue/try-runtime", + "snowbridge-outbound-queue/try-runtime", + "sp-runtime/try-runtime", +] diff --git a/bridges/snowbridge/parachain/pallets/system/README.md b/bridges/snowbridge/parachain/pallets/system/README.md new file mode 100644 index 00000000000..9e4dc55267d --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/system/README.md @@ -0,0 +1 @@ +License: MIT-0 diff --git a/bridges/snowbridge/parachain/pallets/system/runtime-api/Cargo.toml b/bridges/snowbridge/parachain/pallets/system/runtime-api/Cargo.toml new file mode 100644 index 00000000000..97d0735bf63 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/system/runtime-api/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "snowbridge-system-runtime-api" +description = "Snowbridge System Runtime API" +version = "0.1.0" +edition = "2021" +authors = ["Snowfork "] +repository = "https://github.com/Snowfork/snowbridge" +license = "Apache-2.0" + +[package.metadata.docs.rs] +targets = ["x86_64-unknown-linux-gnu"] + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = [ + "derive", +] } +sp-core = { path = "../../../../../../substrate/primitives/core", default-features = false } +sp-std = { path = "../../../../../../substrate/primitives/std", default-features = false } +sp-api = { path = "../../../../../../substrate/primitives/api", default-features = false } +xcm = { package = "staging-xcm", path = "../../../../../../polkadot/xcm", default-features = false } +snowbridge-core = { path = "../../../primitives/core", default-features = false } + +[features] +default = ["std"] +std = [ + "codec/std", + "snowbridge-core/std", + "sp-api/std", + "sp-core/std", + "sp-std/std", + "xcm/std", +] diff --git a/bridges/snowbridge/parachain/pallets/system/runtime-api/src/lib.rs b/bridges/snowbridge/parachain/pallets/system/runtime-api/src/lib.rs new file mode 100644 index 00000000000..d99b456c848 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/system/runtime-api/src/lib.rs @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +#![cfg_attr(not(feature = "std"), no_std)] + +use snowbridge_core::AgentId; +use xcm::VersionedMultiLocation; + +sp_api::decl_runtime_apis! { + pub trait ControlApi + { + fn agent_id(location: VersionedMultiLocation) -> Option; + } +} diff --git a/bridges/snowbridge/parachain/pallets/system/src/api.rs b/bridges/snowbridge/parachain/pallets/system/src/api.rs new file mode 100644 index 00000000000..245e6eea1c1 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/system/src/api.rs @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +//! Helpers for implementing runtime api + +use snowbridge_core::AgentId; +use xcm::{prelude::*, VersionedMultiLocation}; + +use crate::{agent_id_of, Config}; + +pub fn agent_id(location: VersionedMultiLocation) -> Option +where + Runtime: Config, +{ + let location: MultiLocation = location.try_into().ok()?; + agent_id_of::(&location).ok() +} diff --git a/bridges/snowbridge/parachain/pallets/system/src/benchmarking.rs b/bridges/snowbridge/parachain/pallets/system/src/benchmarking.rs new file mode 100644 index 00000000000..8d26408b38e --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/system/src/benchmarking.rs @@ -0,0 +1,167 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +//! Benchmarking setup for pallet-template +use super::*; + +#[allow(unused)] +use crate::Pallet as SnowbridgeControl; +use frame_benchmarking::v2::*; +use frame_system::RawOrigin; +use snowbridge_core::{eth, outbound::OperatingMode}; +use sp_runtime::SaturatedConversion; +use xcm::prelude::*; + +#[allow(clippy::result_large_err)] +fn fund_sovereign_account(para_id: ParaId) -> Result<(), BenchmarkError> { + let amount: BalanceOf = (10_000_000_000_000_u64).saturated_into::().saturated_into(); + let sovereign_account = sibling_sovereign_account::(para_id); + T::Token::mint_into(&sovereign_account, amount)?; + Ok(()) +} + +#[benchmarks] +mod benchmarks { + use super::*; + + #[benchmark] + fn upgrade() -> Result<(), BenchmarkError> { + let impl_address = H160::repeat_byte(1); + let impl_code_hash = H256::repeat_byte(1); + + // Assume 256 bytes passed to initializer + let params: Vec = (0..256).map(|_| 1u8).collect(); + + #[extrinsic_call] + _( + RawOrigin::Root, + impl_address, + impl_code_hash, + Some(Initializer { params, maximum_required_gas: 100000 }), + ); + + Ok(()) + } + + #[benchmark] + fn set_operating_mode() -> Result<(), BenchmarkError> { + #[extrinsic_call] + _(RawOrigin::Root, OperatingMode::RejectingOutboundMessages); + + Ok(()) + } + + #[benchmark] + fn set_pricing_parameters() -> Result<(), BenchmarkError> { + let params = T::DefaultPricingParameters::get(); + + #[extrinsic_call] + _(RawOrigin::Root, params); + + Ok(()) + } + + #[benchmark] + fn create_agent() -> Result<(), BenchmarkError> { + let origin_para_id = 2000; + let origin_location = MultiLocation { parents: 1, interior: X1(Parachain(origin_para_id)) }; + let origin = T::Helper::make_xcm_origin(origin_location); + fund_sovereign_account::(origin_para_id.into())?; + + #[extrinsic_call] + _(origin as T::RuntimeOrigin); + + Ok(()) + } + + #[benchmark] + fn create_channel() -> Result<(), BenchmarkError> { + let origin_para_id = 2000; + let origin_location = MultiLocation { parents: 1, interior: X1(Parachain(origin_para_id)) }; + let origin = T::Helper::make_xcm_origin(origin_location); + fund_sovereign_account::(origin_para_id.into())?; + + SnowbridgeControl::::create_agent(origin.clone())?; + + #[extrinsic_call] + _(origin as T::RuntimeOrigin, OperatingMode::Normal); + + Ok(()) + } + + #[benchmark] + fn update_channel() -> Result<(), BenchmarkError> { + let origin_para_id = 2000; + let origin_location = MultiLocation { parents: 1, interior: X1(Parachain(origin_para_id)) }; + let origin = T::Helper::make_xcm_origin(origin_location); + fund_sovereign_account::(origin_para_id.into())?; + SnowbridgeControl::::create_agent(origin.clone())?; + SnowbridgeControl::::create_channel(origin.clone(), OperatingMode::Normal)?; + + #[extrinsic_call] + _(origin as T::RuntimeOrigin, OperatingMode::RejectingOutboundMessages); + + Ok(()) + } + + #[benchmark] + fn force_update_channel() -> Result<(), BenchmarkError> { + let origin_para_id = 2000; + let origin_location = MultiLocation { parents: 1, interior: X1(Parachain(origin_para_id)) }; + let origin = T::Helper::make_xcm_origin(origin_location); + let channel_id: ChannelId = ParaId::from(origin_para_id).into(); + + fund_sovereign_account::(origin_para_id.into())?; + SnowbridgeControl::::create_agent(origin.clone())?; + SnowbridgeControl::::create_channel(origin.clone(), OperatingMode::Normal)?; + + #[extrinsic_call] + _(RawOrigin::Root, channel_id, OperatingMode::RejectingOutboundMessages); + + Ok(()) + } + + #[benchmark] + fn transfer_native_from_agent() -> Result<(), BenchmarkError> { + let origin_para_id = 2000; + let origin_location = MultiLocation { parents: 1, interior: X1(Parachain(origin_para_id)) }; + let origin = T::Helper::make_xcm_origin(origin_location); + fund_sovereign_account::(origin_para_id.into())?; + SnowbridgeControl::::create_agent(origin.clone())?; + SnowbridgeControl::::create_channel(origin.clone(), OperatingMode::Normal)?; + + #[extrinsic_call] + _(origin as T::RuntimeOrigin, H160::default(), 1); + + Ok(()) + } + + #[benchmark] + fn force_transfer_native_from_agent() -> Result<(), BenchmarkError> { + let origin_para_id = 2000; + let origin_location = MultiLocation { parents: 1, interior: X1(Parachain(origin_para_id)) }; + let origin = T::Helper::make_xcm_origin(origin_location); + fund_sovereign_account::(origin_para_id.into())?; + SnowbridgeControl::::create_agent(origin.clone())?; + + let versioned_location: VersionedMultiLocation = origin_location.into(); + + #[extrinsic_call] + _(RawOrigin::Root, Box::new(versioned_location), H160::default(), 1); + + Ok(()) + } + + #[benchmark] + fn set_token_transfer_fees() -> Result<(), BenchmarkError> { + #[extrinsic_call] + _(RawOrigin::Root, 1, 1, eth(1)); + + Ok(()) + } + + impl_benchmark_test_suite!( + SnowbridgeControl, + crate::mock::new_test_ext(true), + crate::mock::Test + ); +} diff --git a/bridges/snowbridge/parachain/pallets/system/src/lib.rs b/bridges/snowbridge/parachain/pallets/system/src/lib.rs new file mode 100644 index 00000000000..0042093ee66 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/system/src/lib.rs @@ -0,0 +1,681 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +//! Governance API for controlling the Ethereum side of the bridge +//! +//! # Extrinsics +//! +//! ## Agents +//! +//! Agents are smart contracts on Ethereum that act as proxies for consensus systems on Polkadot +//! networks. +//! +//! * [`Call::create_agent`]: Create agent for a sibling parachain +//! * [`Call::transfer_native_from_agent`]: Withdraw ether from an agent +//! +//! The `create_agent` extrinsic should be called via an XCM `Transact` instruction from the sibling +//! parachain. +//! +//! ## Channels +//! +//! Each sibling parachain has its own dedicated messaging channel for sending and receiving +//! messages. As a prerequisite to creating a channel, the sibling should have already created +//! an agent using the `create_agent` extrinsic. +//! +//! * [`Call::create_channel`]: Create channel for a sibling +//! * [`Call::update_channel`]: Update a channel for a sibling +//! +//! ## Governance +//! +//! Only Polkadot governance itself can call these extrinsics. Delivery fees are waived. +//! +//! * [`Call::upgrade`]`: Upgrade the gateway contract +//! * [`Call::set_operating_mode`]: Update the operating mode of the gateway contract +//! * [`Call::force_update_channel`]: Allow root to update a channel for a sibling +//! * [`Call::force_transfer_native_from_agent`]: Allow root to withdraw ether from an agent +//! +//! Typically, Polkadot governance will use the `force_transfer_native_from_agent` and +//! `force_update_channel` and extrinsics to manage agents and channels for system parachains. +#![cfg_attr(not(feature = "std"), no_std)] + +pub use pallet::*; + +#[cfg(test)] +mod mock; + +#[cfg(test)] +mod tests; + +#[cfg(feature = "runtime-benchmarks")] +mod benchmarking; +pub mod migration; + +pub mod api; +pub mod weights; +pub use weights::*; + +use frame_support::{ + pallet_prelude::*, + traits::{ + fungible::{Inspect, Mutate}, + tokens::Preservation, + Contains, EnsureOrigin, + }, +}; +use frame_system::pallet_prelude::*; +use snowbridge_core::{ + meth, + outbound::{Command, Initializer, Message, OperatingMode, SendError, SendMessage}, + sibling_sovereign_account, AgentId, Channel, ChannelId, ParaId, + PricingParameters as PricingParametersRecord, PRIMARY_GOVERNANCE_CHANNEL, + SECONDARY_GOVERNANCE_CHANNEL, +}; +use sp_core::{RuntimeDebug, H160, H256}; +use sp_io::hashing::blake2_256; +use sp_runtime::{traits::BadOrigin, DispatchError, SaturatedConversion}; +use sp_std::prelude::*; +use xcm::prelude::*; +use xcm_executor::traits::ConvertLocation; + +#[cfg(feature = "runtime-benchmarks")] +use frame_support::traits::OriginTrait; + +pub use pallet::*; + +pub type BalanceOf = + <::Token as Inspect<::AccountId>>::Balance; +pub type AccountIdOf = ::AccountId; +pub type PricingParametersOf = PricingParametersRecord>; + +/// Ensure origin location is a sibling +fn ensure_sibling(location: &MultiLocation) -> Result<(ParaId, H256), DispatchError> +where + T: Config, +{ + match location { + MultiLocation { parents: 1, interior: X1(Parachain(para_id)) } => { + let agent_id = agent_id_of::(location)?; + Ok(((*para_id).into(), agent_id)) + }, + _ => Err(BadOrigin.into()), + } +} + +/// Hash the location to produce an agent id +fn agent_id_of(location: &MultiLocation) -> Result { + T::AgentIdOf::convert_location(location).ok_or(Error::::LocationConversionFailed.into()) +} + +#[cfg(feature = "runtime-benchmarks")] +pub trait BenchmarkHelper +where + O: OriginTrait, +{ + fn make_xcm_origin(location: MultiLocation) -> O; +} + +/// Whether a fee should be withdrawn to an account for sending an outbound message +#[derive(Clone, PartialEq, RuntimeDebug)] +pub enum PaysFee +where + T: Config, +{ + /// Fully charge includes (local + remote fee) + Yes(AccountIdOf), + /// Partially charge includes local fee only + Partial(AccountIdOf), + /// No charge + No, +} + +#[frame_support::pallet] +pub mod pallet { + use snowbridge_core::StaticLookup; + use sp_core::U256; + + use super::*; + + #[pallet::pallet] + pub struct Pallet(_); + + #[pallet::config] + pub trait Config: frame_system::Config { + type RuntimeEvent: From> + IsType<::RuntimeEvent>; + + /// Send messages to Ethereum + type OutboundQueue: SendMessage>; + + /// Origin check for XCM locations that can create agents + type SiblingOrigin: EnsureOrigin; + + /// Converts MultiLocation to AgentId + type AgentIdOf: ConvertLocation; + + /// Token reserved for control operations + type Token: Mutate; + + /// TreasuryAccount to collect fees + #[pallet::constant] + type TreasuryAccount: Get; + + /// Number of decimal places of local currency + type DefaultPricingParameters: Get>; + + /// Cost of delivering a message from Ethereum + type InboundDeliveryCost: Get>; + + type WeightInfo: WeightInfo; + + #[cfg(feature = "runtime-benchmarks")] + type Helper: BenchmarkHelper; + } + + #[pallet::event] + #[pallet::generate_deposit(pub(super) fn deposit_event)] + pub enum Event { + /// An Upgrade message was sent to the Gateway + Upgrade { + impl_address: H160, + impl_code_hash: H256, + initializer_params_hash: Option, + }, + /// An CreateAgent message was sent to the Gateway + CreateAgent { + location: Box, + agent_id: AgentId, + }, + /// An CreateChannel message was sent to the Gateway + CreateChannel { + channel_id: ChannelId, + agent_id: AgentId, + }, + /// An UpdateChannel message was sent to the Gateway + UpdateChannel { + channel_id: ChannelId, + mode: OperatingMode, + }, + /// An SetOperatingMode message was sent to the Gateway + SetOperatingMode { + mode: OperatingMode, + }, + /// An TransferNativeFromAgent message was sent to the Gateway + TransferNativeFromAgent { + agent_id: AgentId, + recipient: H160, + amount: u128, + }, + /// A SetTokenTransferFees message was sent to the Gateway + SetTokenTransferFees { + create_asset_xcm: u128, + transfer_asset_xcm: u128, + register_token: U256, + }, + PricingParametersChanged { + params: PricingParametersOf, + }, + } + + #[pallet::error] + pub enum Error { + LocationConversionFailed, + AgentAlreadyCreated, + NoAgent, + ChannelAlreadyCreated, + NoChannel, + UnsupportedLocationVersion, + InvalidLocation, + Send(SendError), + InvalidTokenTransferFees, + InvalidPricingParameters, + } + + /// The set of registered agents + #[pallet::storage] + #[pallet::getter(fn agents)] + pub type Agents = StorageMap<_, Twox64Concat, AgentId, (), OptionQuery>; + + /// The set of registered channels + #[pallet::storage] + #[pallet::getter(fn channels)] + pub type Channels = StorageMap<_, Twox64Concat, ChannelId, Channel, OptionQuery>; + + #[pallet::storage] + #[pallet::getter(fn parameters)] + pub type PricingParameters = + StorageValue<_, PricingParametersOf, ValueQuery, T::DefaultPricingParameters>; + + #[pallet::genesis_config] + #[derive(frame_support::DefaultNoBound)] + pub struct GenesisConfig { + // Own parachain id + pub para_id: ParaId, + // AssetHub's parachain id + pub asset_hub_para_id: ParaId, + #[serde(skip)] + pub _config: PhantomData, + } + + #[pallet::genesis_build] + impl BuildGenesisConfig for GenesisConfig { + fn build(&self) { + Pallet::::initialize(self.para_id, self.asset_hub_para_id).expect("infallible; qed"); + } + } + + #[pallet::call] + impl Pallet { + /// Sends command to the Gateway contract to upgrade itself with a new implementation + /// contract + /// + /// Fee required: No + /// + /// - `origin`: Must be `Root`. + /// - `impl_address`: The address of the implementation contract. + /// - `impl_code_hash`: The codehash of the implementation contract. + /// - `initializer`: Optionally call an initializer on the implementation contract. + #[pallet::call_index(0)] + #[pallet::weight((T::WeightInfo::upgrade(), DispatchClass::Operational))] + pub fn upgrade( + origin: OriginFor, + impl_address: H160, + impl_code_hash: H256, + initializer: Option, + ) -> DispatchResult { + ensure_root(origin)?; + + let initializer_params_hash: Option = + initializer.as_ref().map(|i| H256::from(blake2_256(i.params.as_ref()))); + let command = Command::Upgrade { impl_address, impl_code_hash, initializer }; + Self::send(PRIMARY_GOVERNANCE_CHANNEL, command, PaysFee::::No)?; + + Self::deposit_event(Event::::Upgrade { + impl_address, + impl_code_hash, + initializer_params_hash, + }); + Ok(()) + } + + /// Sends a message to the Gateway contract to change its operating mode + /// + /// Fee required: No + /// + /// - `origin`: Must be `MultiLocation` + #[pallet::call_index(1)] + #[pallet::weight((T::WeightInfo::set_operating_mode(), DispatchClass::Operational))] + pub fn set_operating_mode(origin: OriginFor, mode: OperatingMode) -> DispatchResult { + ensure_root(origin)?; + + let command = Command::SetOperatingMode { mode }; + Self::send(PRIMARY_GOVERNANCE_CHANNEL, command, PaysFee::::No)?; + + Self::deposit_event(Event::::SetOperatingMode { mode }); + Ok(()) + } + + /// Set pricing parameters on both sides of the bridge + /// + /// Fee required: No + /// + /// - `origin`: Must be root + #[pallet::call_index(2)] + #[pallet::weight((T::WeightInfo::set_pricing_parameters(), DispatchClass::Operational))] + pub fn set_pricing_parameters( + origin: OriginFor, + params: PricingParametersOf, + ) -> DispatchResult { + ensure_root(origin)?; + params.validate().map_err(|_| Error::::InvalidPricingParameters)?; + PricingParameters::::put(params.clone()); + + let command = Command::SetPricingParameters { + exchange_rate: params.exchange_rate.into(), + delivery_cost: T::InboundDeliveryCost::get().saturated_into::(), + }; + Self::send(PRIMARY_GOVERNANCE_CHANNEL, command, PaysFee::::No)?; + + Self::deposit_event(Event::PricingParametersChanged { params }); + Ok(()) + } + + /// Sends a command to the Gateway contract to instantiate a new agent contract representing + /// `origin`. + /// + /// Fee required: Yes + /// + /// - `origin`: Must be `MultiLocation` of a sibling parachain + #[pallet::call_index(3)] + #[pallet::weight(T::WeightInfo::create_agent())] + pub fn create_agent(origin: OriginFor) -> DispatchResult { + let origin_location: MultiLocation = T::SiblingOrigin::ensure_origin(origin)?; + + // Ensure that origin location is some consensus system on a sibling parachain + let (para_id, agent_id) = ensure_sibling::(&origin_location)?; + + // Record the agent id or fail if it has already been created + ensure!(!Agents::::contains_key(agent_id), Error::::AgentAlreadyCreated); + Agents::::insert(agent_id, ()); + + let command = Command::CreateAgent { agent_id }; + let pays_fee = PaysFee::::Yes(sibling_sovereign_account::(para_id)); + Self::send(SECONDARY_GOVERNANCE_CHANNEL, command, pays_fee)?; + + Self::deposit_event(Event::::CreateAgent { + location: Box::new(origin_location), + agent_id, + }); + Ok(()) + } + + /// Sends a message to the Gateway contract to create a new channel representing `origin` + /// + /// Fee required: Yes + /// + /// This extrinsic is permissionless, so a fee is charged to prevent spamming and pay + /// for execution costs on the remote side. + /// + /// The message is sent over the bridge on BridgeHub's own channel to the Gateway. + /// + /// - `origin`: Must be `MultiLocation` + /// - `mode`: Initial operating mode of the channel + #[pallet::call_index(4)] + #[pallet::weight(T::WeightInfo::create_channel())] + pub fn create_channel(origin: OriginFor, mode: OperatingMode) -> DispatchResult { + let origin_location: MultiLocation = T::SiblingOrigin::ensure_origin(origin)?; + + // Ensure that origin location is a sibling parachain + let (para_id, agent_id) = ensure_sibling::(&origin_location)?; + + let channel_id: ChannelId = para_id.into(); + + ensure!(Agents::::contains_key(agent_id), Error::::NoAgent); + ensure!(!Channels::::contains_key(channel_id), Error::::ChannelAlreadyCreated); + + let channel = Channel { agent_id, para_id }; + Channels::::insert(channel_id, channel); + + let command = Command::CreateChannel { channel_id, agent_id, mode }; + let pays_fee = PaysFee::::Yes(sibling_sovereign_account::(para_id)); + Self::send(SECONDARY_GOVERNANCE_CHANNEL, command, pays_fee)?; + + Self::deposit_event(Event::::CreateChannel { channel_id, agent_id }); + Ok(()) + } + + /// Sends a message to the Gateway contract to update a channel configuration + /// + /// The origin must already have a channel initialized, as this message is sent over it. + /// + /// A partial fee will be charged for local processing only. + /// + /// - `origin`: Must be `MultiLocation` + /// - `mode`: Initial operating mode of the channel + #[pallet::call_index(5)] + #[pallet::weight(T::WeightInfo::update_channel())] + pub fn update_channel(origin: OriginFor, mode: OperatingMode) -> DispatchResult { + let origin_location: MultiLocation = T::SiblingOrigin::ensure_origin(origin)?; + + // Ensure that origin location is a sibling parachain + let (para_id, _) = ensure_sibling::(&origin_location)?; + + let channel_id: ChannelId = para_id.into(); + + ensure!(Channels::::contains_key(channel_id), Error::::NoChannel); + + let command = Command::UpdateChannel { channel_id, mode }; + let pays_fee = PaysFee::::Partial(sibling_sovereign_account::(para_id)); + + // Parachains send the update message on their own channel + Self::send(channel_id, command, pays_fee)?; + + Self::deposit_event(Event::::UpdateChannel { channel_id, mode }); + Ok(()) + } + + /// Sends a message to the Gateway contract to update an arbitrary channel + /// + /// Fee required: No + /// + /// - `origin`: Must be root + /// - `channel_id`: ID of channel + /// - `mode`: Initial operating mode of the channel + /// - `outbound_fee`: Fee charged to users for sending outbound messages to Polkadot + #[pallet::call_index(6)] + #[pallet::weight(T::WeightInfo::force_update_channel())] + pub fn force_update_channel( + origin: OriginFor, + channel_id: ChannelId, + mode: OperatingMode, + ) -> DispatchResult { + ensure_root(origin)?; + + ensure!(Channels::::contains_key(channel_id), Error::::NoChannel); + + let command = Command::UpdateChannel { channel_id, mode }; + Self::send(PRIMARY_GOVERNANCE_CHANNEL, command, PaysFee::::No)?; + + Self::deposit_event(Event::::UpdateChannel { channel_id, mode }); + Ok(()) + } + + /// Sends a message to the Gateway contract to transfer ether from an agent to `recipient`. + /// + /// A partial fee will be charged for local processing only. + /// + /// - `origin`: Must be `MultiLocation` + #[pallet::call_index(7)] + #[pallet::weight(T::WeightInfo::transfer_native_from_agent())] + pub fn transfer_native_from_agent( + origin: OriginFor, + recipient: H160, + amount: u128, + ) -> DispatchResult { + let origin_location: MultiLocation = T::SiblingOrigin::ensure_origin(origin)?; + + // Ensure that origin location is some consensus system on a sibling parachain + let (para_id, agent_id) = ensure_sibling::(&origin_location)?; + + // Since the origin is also the owner of the channel, they only need to pay + // the local processing fee. + let pays_fee = PaysFee::::Partial(sibling_sovereign_account::(para_id)); + + Self::do_transfer_native_from_agent( + agent_id, + para_id.into(), + recipient, + amount, + pays_fee, + ) + } + + /// Sends a message to the Gateway contract to transfer ether from an agent to `recipient`. + /// + /// Privileged. Can only be called by root. + /// + /// Fee required: No + /// + /// - `origin`: Must be root + /// - `location`: Location used to resolve the agent + /// - `recipient`: Recipient of funds + /// - `amount`: Amount to transfer + #[pallet::call_index(8)] + #[pallet::weight(T::WeightInfo::force_transfer_native_from_agent())] + pub fn force_transfer_native_from_agent( + origin: OriginFor, + location: Box, + recipient: H160, + amount: u128, + ) -> DispatchResult { + ensure_root(origin)?; + + // Ensure that location is some consensus system on a sibling parachain + let location: MultiLocation = + (*location).try_into().map_err(|_| Error::::UnsupportedLocationVersion)?; + let (_, agent_id) = + ensure_sibling::(&location).map_err(|_| Error::::InvalidLocation)?; + + let pays_fee = PaysFee::::No; + + Self::do_transfer_native_from_agent( + agent_id, + PRIMARY_GOVERNANCE_CHANNEL, + recipient, + amount, + pays_fee, + ) + } + + /// Sends a message to the Gateway contract to update fee related parameters for + /// token transfers. + /// + /// Privileged. Can only be called by root. + /// + /// Fee required: No + /// + /// - `origin`: Must be root + /// - `create_asset_xcm`: The XCM execution cost for creating a new asset class on AssetHub, + /// in DOT + /// - `transfer_asset_xcm`: The XCM execution cost for performing a reserve transfer on + /// AssetHub, in DOT + /// - `register_token`: The Ether fee for registering a new token, to discourage spamming + #[pallet::call_index(9)] + #[pallet::weight((T::WeightInfo::set_token_transfer_fees(), DispatchClass::Operational))] + pub fn set_token_transfer_fees( + origin: OriginFor, + create_asset_xcm: u128, + transfer_asset_xcm: u128, + register_token: U256, + ) -> DispatchResult { + ensure_root(origin)?; + + // Basic validation of new costs. Particularly for token registration, we want to ensure + // its relatively expensive to discourage spamming. Like at least 100 USD. + ensure!( + create_asset_xcm > 0 && transfer_asset_xcm > 0 && register_token > meth(100), + Error::::InvalidTokenTransferFees + ); + + let command = Command::SetTokenTransferFees { + create_asset_xcm, + transfer_asset_xcm, + register_token, + }; + Self::send(PRIMARY_GOVERNANCE_CHANNEL, command, PaysFee::::No)?; + + Self::deposit_event(Event::::SetTokenTransferFees { + create_asset_xcm, + transfer_asset_xcm, + register_token, + }); + Ok(()) + } + } + + impl Pallet { + /// Send `command` to the Gateway on the Channel identified by `channel_id` + fn send(channel_id: ChannelId, command: Command, pays_fee: PaysFee) -> DispatchResult { + let message = Message { id: None, channel_id, command }; + let (ticket, fee) = + T::OutboundQueue::validate(&message).map_err(|err| Error::::Send(err))?; + + let payment = match pays_fee { + PaysFee::Yes(account) => Some((account, fee.total())), + PaysFee::Partial(account) => Some((account, fee.local)), + PaysFee::No => None, + }; + + if let Some((payer, fee)) = payment { + T::Token::transfer( + &payer, + &T::TreasuryAccount::get(), + fee, + Preservation::Preserve, + )?; + } + + T::OutboundQueue::deliver(ticket).map_err(|err| Error::::Send(err))?; + Ok(()) + } + + /// Issue a `Command::TransferNativeFromAgent` command. The command will be sent on the + /// channel `channel_id` + pub fn do_transfer_native_from_agent( + agent_id: H256, + channel_id: ChannelId, + recipient: H160, + amount: u128, + pays_fee: PaysFee, + ) -> DispatchResult { + ensure!(Agents::::contains_key(agent_id), Error::::NoAgent); + + let command = Command::TransferNativeFromAgent { agent_id, recipient, amount }; + Self::send(channel_id, command, pays_fee)?; + + Self::deposit_event(Event::::TransferNativeFromAgent { + agent_id, + recipient, + amount, + }); + Ok(()) + } + + /// Initializes agents and channels. + pub fn initialize(para_id: ParaId, asset_hub_para_id: ParaId) -> Result<(), DispatchError> { + // Asset Hub + let asset_hub_location: MultiLocation = + ParentThen(X1(Parachain(asset_hub_para_id.into()))).into(); + let asset_hub_agent_id = agent_id_of::(&asset_hub_location)?; + let asset_hub_channel_id: ChannelId = asset_hub_para_id.into(); + Agents::::insert(asset_hub_agent_id, ()); + Channels::::insert( + asset_hub_channel_id, + Channel { agent_id: asset_hub_agent_id, para_id: asset_hub_para_id }, + ); + + // Governance channels + let bridge_hub_agent_id = agent_id_of::(&MultiLocation::here())?; + // Agent for BridgeHub + Agents::::insert(bridge_hub_agent_id, ()); + + // Primary governance channel + Channels::::insert( + PRIMARY_GOVERNANCE_CHANNEL, + Channel { agent_id: bridge_hub_agent_id, para_id }, + ); + + // Secondary governance channel + Channels::::insert( + SECONDARY_GOVERNANCE_CHANNEL, + Channel { agent_id: bridge_hub_agent_id, para_id }, + ); + + Ok(()) + } + + /// Checks if the pallet has been initialized. + pub(crate) fn is_initialized() -> bool { + let primary_exists = Channels::::contains_key(PRIMARY_GOVERNANCE_CHANNEL); + let secondary_exists = Channels::::contains_key(SECONDARY_GOVERNANCE_CHANNEL); + primary_exists && secondary_exists + } + } + + impl StaticLookup for Pallet { + type Source = ChannelId; + type Target = Channel; + fn lookup(channel_id: Self::Source) -> Option { + Channels::::get(channel_id) + } + } + + impl Contains for Pallet { + fn contains(channel_id: &ChannelId) -> bool { + Channels::::get(channel_id).is_some() + } + } + + impl Get> for Pallet { + fn get() -> PricingParametersOf { + PricingParameters::::get() + } + } +} diff --git a/bridges/snowbridge/parachain/pallets/system/src/migration.rs b/bridges/snowbridge/parachain/pallets/system/src/migration.rs new file mode 100644 index 00000000000..ee94fc091bd --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/system/src/migration.rs @@ -0,0 +1,74 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +//! Governance API for controlling the Ethereum side of the bridge +use super::*; +use frame_support::traits::OnRuntimeUpgrade; +use log; + +#[cfg(feature = "try-runtime")] +use sp_runtime::TryRuntimeError; + +pub mod v0 { + use frame_support::{pallet_prelude::*, weights::Weight}; + + use super::*; + + const LOG_TARGET: &str = "ethereum_system::migration"; + + pub struct InitializeOnUpgrade( + sp_std::marker::PhantomData<(T, BridgeHubParaId, AssetHubParaId)>, + ); + impl OnRuntimeUpgrade + for InitializeOnUpgrade + where + T: Config, + BridgeHubParaId: Get, + AssetHubParaId: Get, + { + fn on_runtime_upgrade() -> Weight { + if !Pallet::::is_initialized() { + Pallet::::initialize( + BridgeHubParaId::get().into(), + AssetHubParaId::get().into(), + ) + .expect("infallible; qed"); + log::info!( + target: LOG_TARGET, + "Ethereum system initialized." + ); + T::DbWeight::get().reads_writes(2, 5) + } else { + log::info!( + target: LOG_TARGET, + "Ethereum system already initialized. Skipping." + ); + T::DbWeight::get().reads(2) + } + } + + #[cfg(feature = "try-runtime")] + fn pre_upgrade() -> Result, TryRuntimeError> { + if !Pallet::::is_initialized() { + log::info!( + target: LOG_TARGET, + "Agents and channels not initialized. Initialization will run." + ); + } else { + log::info!( + target: LOG_TARGET, + "Agents and channels are initialized. Initialization will not run." + ); + } + Ok(vec![]) + } + + #[cfg(feature = "try-runtime")] + fn post_upgrade(_: Vec) -> Result<(), TryRuntimeError> { + frame_support::ensure!( + Pallet::::is_initialized(), + "Agents and channels were not initialized." + ); + Ok(()) + } + } +} diff --git a/bridges/snowbridge/parachain/pallets/system/src/mock.rs b/bridges/snowbridge/parachain/pallets/system/src/mock.rs new file mode 100644 index 00000000000..7a4f6118930 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/system/src/mock.rs @@ -0,0 +1,270 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +use crate as snowbridge_system; +use frame_support::{ + parameter_types, + traits::{tokens::fungible::Mutate, ConstU128, ConstU16, ConstU64, ConstU8}, + weights::IdentityFee, + PalletId, +}; +use sp_core::H256; +use xcm_executor::traits::ConvertLocation; + +use snowbridge_core::{ + gwei, meth, outbound::ConstantGasMeter, sibling_sovereign_account, AgentId, AllowSiblingsOnly, + ParaId, PricingParameters, Rewards, +}; +use sp_runtime::{ + traits::{AccountIdConversion, BlakeTwo256, IdentityLookup, Keccak256}, + AccountId32, BuildStorage, FixedU128, +}; +use xcm::prelude::*; + +#[cfg(feature = "runtime-benchmarks")] +use crate::BenchmarkHelper; + +type Block = frame_system::mocking::MockBlock; +type Balance = u128; + +pub type AccountId = AccountId32; + +// A stripped-down version of pallet-xcm that only inserts an XCM origin into the runtime +#[allow(dead_code)] +#[frame_support::pallet] +mod pallet_xcm_origin { + use frame_support::{ + pallet_prelude::*, + traits::{Contains, OriginTrait}, + }; + use xcm::latest::prelude::*; + + #[pallet::pallet] + pub struct Pallet(_); + + #[pallet::config] + pub trait Config: frame_system::Config { + type RuntimeOrigin: From + From<::RuntimeOrigin>; + } + + // Insert this custom Origin into the aggregate RuntimeOrigin + #[pallet::origin] + #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo, MaxEncodedLen)] + pub struct Origin(pub MultiLocation); + + impl From for Origin { + fn from(location: MultiLocation) -> Origin { + Origin(location) + } + } + + /// `EnsureOrigin` implementation succeeding with a `MultiLocation` value to recognize and + /// filter the contained location + pub struct EnsureXcm(PhantomData); + impl, F: Contains> EnsureOrigin for EnsureXcm + where + O::PalletsOrigin: From + TryInto, + { + type Success = MultiLocation; + + fn try_origin(outer: O) -> Result { + outer.try_with_caller(|caller| { + caller.try_into().and_then(|o| match o { + Origin(location) if F::contains(&location) => Ok(location), + o => Err(o.into()), + }) + }) + } + + #[cfg(feature = "runtime-benchmarks")] + fn try_successful_origin() -> Result { + Ok(O::from(Origin(MultiLocation { parents: 1, interior: X1(Parachain(2000)) }))) + } + } +} + +// Configure a mock runtime to test the pallet. +frame_support::construct_runtime!( + pub enum Test + { + System: frame_system, + Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, + XcmOrigin: pallet_xcm_origin::{Pallet, Origin}, + OutboundQueue: snowbridge_outbound_queue::{Pallet, Call, Storage, Event}, + EthereumSystem: snowbridge_system, + MessageQueue: pallet_message_queue::{Pallet, Call, Storage, Event} + } +); + +impl frame_system::Config for Test { + type BaseCallFilter = frame_support::traits::Everything; + type BlockWeights = (); + type BlockLength = (); + type DbWeight = (); + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + type RuntimeTask = RuntimeTask; + type Hash = H256; + type Hashing = BlakeTwo256; + type AccountId = AccountId; + type Lookup = IdentityLookup; + type RuntimeEvent = RuntimeEvent; + type BlockHashCount = ConstU64<250>; + type Version = (); + type PalletInfo = PalletInfo; + type AccountData = pallet_balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type SystemWeightInfo = (); + type SS58Prefix = ConstU16<42>; + type OnSetCode = (); + type MaxConsumers = frame_support::traits::ConstU32<16>; + type Nonce = u64; + type Block = Block; +} + +impl pallet_balances::Config for Test { + type MaxLocks = (); + type MaxReserves = (); + type ReserveIdentifier = [u8; 8]; + type Balance = Balance; + type RuntimeEvent = RuntimeEvent; + type DustRemoval = (); + type ExistentialDeposit = ConstU128<1>; + type AccountStore = System; + type WeightInfo = (); + type FreezeIdentifier = (); + type MaxFreezes = (); + type RuntimeHoldReason = (); + type RuntimeFreezeReason = (); + type MaxHolds = (); +} + +impl pallet_xcm_origin::Config for Test { + type RuntimeOrigin = RuntimeOrigin; +} + +parameter_types! { + pub const HeapSize: u32 = 32 * 1024; + pub const MaxStale: u32 = 32; + pub static ServiceWeight: Option = Some(Weight::from_parts(100, 100)); +} + +impl pallet_message_queue::Config for Test { + type RuntimeEvent = RuntimeEvent; + type WeightInfo = (); + type MessageProcessor = OutboundQueue; + type Size = u32; + type QueueChangeHandler = (); + type HeapSize = HeapSize; + type MaxStale = MaxStale; + type ServiceWeight = ServiceWeight; + type QueuePausedQuery = (); +} + +parameter_types! { + pub const MaxMessagePayloadSize: u32 = 1024; + pub const MaxMessagesPerBlock: u32 = 20; + pub const OwnParaId: ParaId = ParaId::new(1013); +} + +impl snowbridge_outbound_queue::Config for Test { + type RuntimeEvent = RuntimeEvent; + type Hashing = Keccak256; + type MessageQueue = MessageQueue; + type Decimals = ConstU8<10>; + type MaxMessagePayloadSize = MaxMessagePayloadSize; + type MaxMessagesPerBlock = MaxMessagesPerBlock; + type GasMeter = ConstantGasMeter; + type Balance = u128; + type PricingParameters = EthereumSystem; + type Channels = EthereumSystem; + type WeightToFee = IdentityFee; + type WeightInfo = (); +} + +parameter_types! { + pub const SS58Prefix: u8 = 42; + pub const AnyNetwork: Option = None; + pub const RelayNetwork: Option = Some(NetworkId::Kusama); + pub const RelayLocation: MultiLocation = MultiLocation::parent(); + pub UniversalLocation: InteriorMultiLocation = + X2(GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(1013)); +} + +pub const DOT: u128 = 10_000_000_000; + +parameter_types! { + pub TreasuryAccount: AccountId = PalletId(*b"py/trsry").into_account_truncating(); + pub Fee: u64 = 1000; + pub const RococoNetwork: NetworkId = NetworkId::Rococo; + pub const InitialFunding: u128 = 1_000_000_000_000; + pub AssetHubParaId: ParaId = ParaId::new(1000); + pub TestParaId: u32 = 2000; + pub Parameters: PricingParameters = PricingParameters { + exchange_rate: FixedU128::from_rational(1, 400), + fee_per_gas: gwei(20), + rewards: Rewards { local: DOT, remote: meth(1) } + }; + pub const InboundDeliveryCost: u128 = 1_000_000_000; + +} + +#[cfg(feature = "runtime-benchmarks")] +impl BenchmarkHelper for () { + fn make_xcm_origin(location: MultiLocation) -> RuntimeOrigin { + RuntimeOrigin::from(pallet_xcm_origin::Origin(location)) + } +} + +impl crate::Config for Test { + type RuntimeEvent = RuntimeEvent; + type OutboundQueue = OutboundQueue; + type SiblingOrigin = pallet_xcm_origin::EnsureXcm; + type AgentIdOf = snowbridge_core::AgentIdOf; + type TreasuryAccount = TreasuryAccount; + type Token = Balances; + type DefaultPricingParameters = Parameters; + type WeightInfo = (); + type InboundDeliveryCost = InboundDeliveryCost; + #[cfg(feature = "runtime-benchmarks")] + type Helper = (); +} + +// Build genesis storage according to the mock runtime. +pub fn new_test_ext(genesis_build: bool) -> sp_io::TestExternalities { + let mut storage = frame_system::GenesisConfig::::default().build_storage().unwrap(); + + if genesis_build { + crate::GenesisConfig:: { + para_id: OwnParaId::get(), + asset_hub_para_id: AssetHubParaId::get(), + _config: Default::default(), + } + .assimilate_storage(&mut storage) + .unwrap(); + } + + let mut ext: sp_io::TestExternalities = storage.into(); + let initial_amount = InitialFunding::get(); + let test_para_id = TestParaId::get(); + let sovereign_account = sibling_sovereign_account::(test_para_id.into()); + let treasury_account = TreasuryAccount::get(); + ext.execute_with(|| { + System::set_block_number(1); + Balances::mint_into(&AccountId32::from([0; 32]), initial_amount).unwrap(); + Balances::mint_into(&sovereign_account, initial_amount).unwrap(); + Balances::mint_into(&treasury_account, initial_amount).unwrap(); + }); + ext +} + +// Test helpers + +pub fn make_xcm_origin(location: MultiLocation) -> RuntimeOrigin { + pallet_xcm_origin::Origin(location).into() +} + +pub fn make_agent_id(location: MultiLocation) -> AgentId { + ::AgentIdOf::convert_location(&location) + .expect("convert location") +} diff --git a/bridges/snowbridge/parachain/pallets/system/src/tests.rs b/bridges/snowbridge/parachain/pallets/system/src/tests.rs new file mode 100644 index 00000000000..e07481c1e33 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/system/src/tests.rs @@ -0,0 +1,664 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +use crate::{mock::*, *}; +use frame_support::{assert_noop, assert_ok}; +use hex_literal::hex; +use snowbridge_core::{eth, sibling_sovereign_account_raw}; +use sp_core::H256; +use sp_runtime::{AccountId32, DispatchError::BadOrigin, TokenError}; + +#[test] +fn create_agent() { + new_test_ext(true).execute_with(|| { + let origin_para_id = 2000; + let origin_location = MultiLocation { parents: 1, interior: X1(Parachain(origin_para_id)) }; + let agent_id = make_agent_id(origin_location); + let sovereign_account = sibling_sovereign_account::(origin_para_id.into()); + + // fund sovereign account of origin + let _ = Balances::mint_into(&sovereign_account, 10000); + + assert!(!Agents::::contains_key(agent_id)); + + let origin = make_xcm_origin(origin_location); + assert_ok!(EthereumSystem::create_agent(origin)); + + assert!(Agents::::contains_key(agent_id)); + }); +} + +#[test] +fn test_agent_for_here() { + new_test_ext(true).execute_with(|| { + let origin_location = MultiLocation::here(); + let agent_id = make_agent_id(origin_location); + assert_eq!( + agent_id, + hex!("03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314").into(), + ) + }); +} + +#[test] +fn create_agent_fails_on_funds_unavailable() { + new_test_ext(true).execute_with(|| { + let origin_location = MultiLocation { parents: 1, interior: X1(Parachain(2000)) }; + let origin = make_xcm_origin(origin_location); + // Reset balance of sovereign_account to zero so to trigger the FundsUnavailable error + let sovereign_account = sibling_sovereign_account::(2000.into()); + Balances::set_balance(&sovereign_account, 0); + assert_noop!(EthereumSystem::create_agent(origin), TokenError::FundsUnavailable); + }); +} + +#[test] +fn create_agent_bad_origin() { + new_test_ext(true).execute_with(|| { + // relay chain location not allowed + assert_noop!( + EthereumSystem::create_agent(make_xcm_origin(MultiLocation { + parents: 1, + interior: Here, + })), + BadOrigin, + ); + + // local account location not allowed + assert_noop!( + EthereumSystem::create_agent(make_xcm_origin(MultiLocation { + parents: 0, + interior: X1(Junction::AccountId32 { network: None, id: [67u8; 32] }), + })), + BadOrigin, + ); + + // Signed origin not allowed + assert_noop!( + EthereumSystem::create_agent(RuntimeOrigin::signed([14; 32].into())), + BadOrigin + ); + + // None origin not allowed + assert_noop!(EthereumSystem::create_agent(RuntimeOrigin::none()), BadOrigin); + }); +} + +#[test] +fn upgrade_as_root() { + new_test_ext(true).execute_with(|| { + let origin = RuntimeOrigin::root(); + let address: H160 = Default::default(); + let code_hash: H256 = Default::default(); + + assert_ok!(EthereumSystem::upgrade(origin, address, code_hash, None)); + + System::assert_last_event(RuntimeEvent::EthereumSystem(crate::Event::Upgrade { + impl_address: address, + impl_code_hash: code_hash, + initializer_params_hash: None, + })); + }); +} + +#[test] +fn upgrade_as_signed_fails() { + new_test_ext(true).execute_with(|| { + let origin = RuntimeOrigin::signed(AccountId32::new([0; 32])); + let address: H160 = Default::default(); + let code_hash: H256 = Default::default(); + + assert_noop!(EthereumSystem::upgrade(origin, address, code_hash, None), BadOrigin); + }); +} + +#[test] +fn upgrade_with_params() { + new_test_ext(true).execute_with(|| { + let origin = RuntimeOrigin::root(); + let address: H160 = Default::default(); + let code_hash: H256 = Default::default(); + let initializer: Option = + Some(Initializer { params: [0; 256].into(), maximum_required_gas: 10000 }); + assert_ok!(EthereumSystem::upgrade(origin, address, code_hash, initializer)); + }); +} + +#[test] +fn set_operating_mode() { + new_test_ext(true).execute_with(|| { + let origin = RuntimeOrigin::root(); + let mode = OperatingMode::RejectingOutboundMessages; + + assert_ok!(EthereumSystem::set_operating_mode(origin, mode)); + + System::assert_last_event(RuntimeEvent::EthereumSystem(crate::Event::SetOperatingMode { + mode, + })); + }); +} + +#[test] +fn set_operating_mode_as_signed_fails() { + new_test_ext(true).execute_with(|| { + let origin = RuntimeOrigin::signed([14; 32].into()); + let mode = OperatingMode::RejectingOutboundMessages; + + assert_noop!(EthereumSystem::set_operating_mode(origin, mode), BadOrigin); + }); +} + +#[test] +fn set_pricing_parameters() { + new_test_ext(true).execute_with(|| { + let origin = RuntimeOrigin::root(); + let mut params = Parameters::get(); + params.rewards.local = 7; + + assert_ok!(EthereumSystem::set_pricing_parameters(origin, params)); + + assert_eq!(PricingParameters::::get().rewards.local, 7); + }); +} + +#[test] +fn set_pricing_parameters_as_signed_fails() { + new_test_ext(true).execute_with(|| { + let origin = RuntimeOrigin::signed([14; 32].into()); + let params = Parameters::get(); + + assert_noop!(EthereumSystem::set_pricing_parameters(origin, params), BadOrigin); + }); +} + +#[test] +fn set_pricing_parameters_invalid() { + new_test_ext(true).execute_with(|| { + let origin = RuntimeOrigin::root(); + let mut params = Parameters::get(); + params.rewards.local = 0; + + assert_noop!( + EthereumSystem::set_pricing_parameters(origin.clone(), params), + Error::::InvalidPricingParameters + ); + + let mut params = Parameters::get(); + params.exchange_rate = 0u128.into(); + assert_noop!( + EthereumSystem::set_pricing_parameters(origin.clone(), params), + Error::::InvalidPricingParameters + ); + params = Parameters::get(); + params.fee_per_gas = sp_core::U256::zero(); + assert_noop!( + EthereumSystem::set_pricing_parameters(origin.clone(), params), + Error::::InvalidPricingParameters + ); + params = Parameters::get(); + params.rewards.local = 0; + assert_noop!( + EthereumSystem::set_pricing_parameters(origin.clone(), params), + Error::::InvalidPricingParameters + ); + params = Parameters::get(); + params.rewards.remote = sp_core::U256::zero(); + assert_noop!( + EthereumSystem::set_pricing_parameters(origin, params), + Error::::InvalidPricingParameters + ); + }); +} + +#[test] +fn set_token_transfer_fees() { + new_test_ext(true).execute_with(|| { + let origin = RuntimeOrigin::root(); + + assert_ok!(EthereumSystem::set_token_transfer_fees(origin, 1, 1, eth(1))); + }); +} + +#[test] +fn set_token_transfer_fees_root_only() { + new_test_ext(true).execute_with(|| { + let origin = RuntimeOrigin::signed([14; 32].into()); + + assert_noop!(EthereumSystem::set_token_transfer_fees(origin, 1, 1, 1.into()), BadOrigin); + }); +} + +#[test] +fn set_token_transfer_fees_invalid() { + new_test_ext(true).execute_with(|| { + let origin = RuntimeOrigin::root(); + + assert_noop!( + EthereumSystem::set_token_transfer_fees(origin, 0, 0, 0.into()), + Error::::InvalidTokenTransferFees + ); + }); +} + +#[test] +fn create_channel() { + new_test_ext(true).execute_with(|| { + let origin_para_id = 2000; + let origin_location = MultiLocation { parents: 1, interior: X1(Parachain(origin_para_id)) }; + let sovereign_account = sibling_sovereign_account::(origin_para_id.into()); + let origin = make_xcm_origin(origin_location); + + // fund sovereign account of origin + let _ = Balances::mint_into(&sovereign_account, 10000); + + assert_ok!(EthereumSystem::create_agent(origin.clone())); + assert_ok!(EthereumSystem::create_channel(origin, OperatingMode::Normal)); + }); +} + +#[test] +fn create_channel_fail_already_exists() { + new_test_ext(true).execute_with(|| { + let origin_para_id = 2000; + let origin_location = MultiLocation { parents: 1, interior: X1(Parachain(origin_para_id)) }; + let sovereign_account = sibling_sovereign_account::(origin_para_id.into()); + let origin = make_xcm_origin(origin_location); + + // fund sovereign account of origin + let _ = Balances::mint_into(&sovereign_account, 10000); + + assert_ok!(EthereumSystem::create_agent(origin.clone())); + assert_ok!(EthereumSystem::create_channel(origin.clone(), OperatingMode::Normal)); + + assert_noop!( + EthereumSystem::create_channel(origin, OperatingMode::Normal), + Error::::ChannelAlreadyCreated + ); + }); +} + +#[test] +fn create_channel_bad_origin() { + new_test_ext(true).execute_with(|| { + // relay chain location not allowed + assert_noop!( + EthereumSystem::create_channel( + make_xcm_origin(MultiLocation { parents: 1, interior: Here }), + OperatingMode::Normal, + ), + BadOrigin, + ); + + // child of sibling location not allowed + assert_noop!( + EthereumSystem::create_channel( + make_xcm_origin(MultiLocation { + parents: 1, + interior: X2( + Parachain(2000), + Junction::AccountId32 { network: None, id: [67u8; 32] } + ), + }), + OperatingMode::Normal, + ), + BadOrigin, + ); + + // local account location not allowed + assert_noop!( + EthereumSystem::create_channel( + make_xcm_origin(MultiLocation { + parents: 0, + interior: X1(Junction::AccountId32 { network: None, id: [67u8; 32] }), + }), + OperatingMode::Normal, + ), + BadOrigin, + ); + + // Signed origin not allowed + assert_noop!( + EthereumSystem::create_channel( + RuntimeOrigin::signed([14; 32].into()), + OperatingMode::Normal, + ), + BadOrigin + ); + + // None origin not allowed + assert_noop!(EthereumSystem::create_agent(RuntimeOrigin::none()), BadOrigin); + }); +} + +#[test] +fn update_channel() { + new_test_ext(true).execute_with(|| { + let origin_para_id = 2000; + let origin_location = MultiLocation { parents: 1, interior: X1(Parachain(origin_para_id)) }; + let sovereign_account = sibling_sovereign_account::(origin_para_id.into()); + let origin = make_xcm_origin(origin_location); + + // First create the channel + let _ = Balances::mint_into(&sovereign_account, 10000); + assert_ok!(EthereumSystem::create_agent(origin.clone())); + assert_ok!(EthereumSystem::create_channel(origin.clone(), OperatingMode::Normal)); + + // Now try to update it + assert_ok!(EthereumSystem::update_channel(origin, OperatingMode::Normal)); + + System::assert_last_event(RuntimeEvent::EthereumSystem(crate::Event::UpdateChannel { + channel_id: ParaId::from(2000).into(), + mode: OperatingMode::Normal, + })); + }); +} + +#[test] +fn update_channel_bad_origin() { + new_test_ext(true).execute_with(|| { + let mode = OperatingMode::Normal; + + // relay chain location not allowed + assert_noop!( + EthereumSystem::update_channel( + make_xcm_origin(MultiLocation { parents: 1, interior: Here }), + mode, + ), + BadOrigin, + ); + + // child of sibling location not allowed + assert_noop!( + EthereumSystem::update_channel( + make_xcm_origin(MultiLocation { + parents: 1, + interior: X2( + Parachain(2000), + Junction::AccountId32 { network: None, id: [67u8; 32] } + ), + }), + mode, + ), + BadOrigin, + ); + + // local account location not allowed + assert_noop!( + EthereumSystem::update_channel( + make_xcm_origin(MultiLocation { + parents: 0, + interior: X1(Junction::AccountId32 { network: None, id: [67u8; 32] }), + }), + mode, + ), + BadOrigin, + ); + + // Signed origin not allowed + assert_noop!( + EthereumSystem::update_channel(RuntimeOrigin::signed([14; 32].into()), mode), + BadOrigin + ); + + // None origin not allowed + assert_noop!(EthereumSystem::update_channel(RuntimeOrigin::none(), mode), BadOrigin); + }); +} + +#[test] +fn update_channel_fails_not_exist() { + new_test_ext(true).execute_with(|| { + let origin_location = MultiLocation { parents: 1, interior: X1(Parachain(2000)) }; + let origin = make_xcm_origin(origin_location); + + // Now try to update it + assert_noop!( + EthereumSystem::update_channel(origin, OperatingMode::Normal), + Error::::NoChannel + ); + }); +} + +#[test] +fn force_update_channel() { + new_test_ext(true).execute_with(|| { + let origin_para_id = 2000; + let origin_location = MultiLocation { parents: 1, interior: X1(Parachain(origin_para_id)) }; + let sovereign_account = sibling_sovereign_account::(origin_para_id.into()); + let origin = make_xcm_origin(origin_location); + + let channel_id: ChannelId = ParaId::from(origin_para_id).into(); + + // First create the channel + let _ = Balances::mint_into(&sovereign_account, 10000); + assert_ok!(EthereumSystem::create_agent(origin.clone())); + assert_ok!(EthereumSystem::create_channel(origin.clone(), OperatingMode::Normal)); + + // Now try to force update it + let force_origin = RuntimeOrigin::root(); + assert_ok!(EthereumSystem::force_update_channel( + force_origin, + channel_id, + OperatingMode::Normal, + )); + + System::assert_last_event(RuntimeEvent::EthereumSystem(crate::Event::UpdateChannel { + channel_id: ParaId::from(2000).into(), + mode: OperatingMode::Normal, + })); + }); +} + +#[test] +fn force_update_channel_bad_origin() { + new_test_ext(true).execute_with(|| { + let mode = OperatingMode::Normal; + + // signed origin not allowed + assert_noop!( + EthereumSystem::force_update_channel( + RuntimeOrigin::signed([14; 32].into()), + ParaId::from(1000).into(), + mode, + ), + BadOrigin, + ); + }); +} + +#[test] +fn transfer_native_from_agent() { + new_test_ext(true).execute_with(|| { + let origin_location = MultiLocation { parents: 1, interior: X1(Parachain(2000)) }; + let origin = make_xcm_origin(origin_location); + let recipient: H160 = [27u8; 20].into(); + let amount = 103435; + + // First create the agent and channel + assert_ok!(EthereumSystem::create_agent(origin.clone())); + assert_ok!(EthereumSystem::create_channel(origin, OperatingMode::Normal)); + + let origin = make_xcm_origin(origin_location); + assert_ok!(EthereumSystem::transfer_native_from_agent(origin, recipient, amount),); + + System::assert_last_event(RuntimeEvent::EthereumSystem( + crate::Event::TransferNativeFromAgent { + agent_id: make_agent_id(origin_location), + recipient, + amount, + }, + )); + }); +} + +#[test] +fn force_transfer_native_from_agent() { + new_test_ext(true).execute_with(|| { + let origin = RuntimeOrigin::root(); + let location = MultiLocation { parents: 1, interior: X1(Parachain(2000)) }; + let versioned_location: Box = Box::new(location.into()); + let recipient: H160 = [27u8; 20].into(); + let amount = 103435; + + // First create the agent + Agents::::insert(make_agent_id(location), ()); + + assert_ok!(EthereumSystem::force_transfer_native_from_agent( + origin, + versioned_location, + recipient, + amount + ),); + + System::assert_last_event(RuntimeEvent::EthereumSystem( + crate::Event::TransferNativeFromAgent { + agent_id: make_agent_id(location), + recipient, + amount, + }, + )); + }); +} + +#[test] +fn force_transfer_native_from_agent_bad_origin() { + new_test_ext(true).execute_with(|| { + let recipient: H160 = [27u8; 20].into(); + let amount = 103435; + + // signed origin not allowed + assert_noop!( + EthereumSystem::force_transfer_native_from_agent( + RuntimeOrigin::signed([14; 32].into()), + Box::new( + MultiLocation { + parents: 1, + interior: X2( + Parachain(2000), + Junction::AccountId32 { network: None, id: [67u8; 32] } + ), + } + .into() + ), + recipient, + amount, + ), + BadOrigin, + ); + }); +} + +// NOTE: The following tests are not actually tests and are more about obtaining location +// conversions for devops purposes. They need to be removed here and incorporated into a command +// line utility. + +#[ignore] +#[test] +fn check_sibling_sovereign_account() { + new_test_ext(true).execute_with(|| { + let para_id = 1001; + let sovereign_account = sibling_sovereign_account::(para_id.into()); + let sovereign_account_raw = sibling_sovereign_account_raw(para_id.into()); + println!( + "Sovereign account for parachain {}: {:#?}", + para_id, + hex::encode(sovereign_account.clone()) + ); + assert_eq!(sovereign_account, sovereign_account_raw.into()); + }); +} + +#[test] +fn charge_fee_for_create_agent() { + new_test_ext(true).execute_with(|| { + let para_id: u32 = TestParaId::get(); + let origin_location = MultiLocation { parents: 1, interior: X1(Parachain(para_id)) }; + let origin = make_xcm_origin(origin_location); + let sovereign_account = sibling_sovereign_account::(para_id.into()); + let (_, agent_id) = ensure_sibling::(&origin_location).unwrap(); + + let initial_sovereign_balance = Balances::balance(&sovereign_account); + assert_ok!(EthereumSystem::create_agent(origin.clone())); + let fee_charged = initial_sovereign_balance - Balances::balance(&sovereign_account); + + assert_ok!(EthereumSystem::create_channel(origin, OperatingMode::Normal)); + + // assert sovereign_balance decreased by (fee.base_fee + fee.delivery_fee) + let message = Message { + id: None, + channel_id: ParaId::from(para_id).into(), + command: Command::CreateAgent { agent_id }, + }; + let (_, fee) = OutboundQueue::validate(&message).unwrap(); + assert_eq!(fee.local + fee.remote, fee_charged); + + // and treasury_balance increased + let treasury_balance = Balances::balance(&TreasuryAccount::get()); + assert!(treasury_balance > InitialFunding::get()); + + let final_sovereign_balance = Balances::balance(&sovereign_account); + // (sovereign_balance + treasury_balance) keeps the same + assert_eq!(final_sovereign_balance + treasury_balance, { InitialFunding::get() * 2 }); + }); +} + +#[test] +fn charge_fee_for_transfer_native_from_agent() { + new_test_ext(true).execute_with(|| { + let para_id: u32 = TestParaId::get(); + let origin_location = MultiLocation { parents: 1, interior: X1(Parachain(para_id)) }; + let recipient: H160 = [27u8; 20].into(); + let amount = 103435; + let origin = make_xcm_origin(origin_location); + let (_, agent_id) = ensure_sibling::(&origin_location).unwrap(); + + let sovereign_account = sibling_sovereign_account::(para_id.into()); + + // create_agent & create_channel first + assert_ok!(EthereumSystem::create_agent(origin.clone())); + assert_ok!(EthereumSystem::create_channel(origin.clone(), OperatingMode::Normal)); + + // assert sovereign_balance decreased by only the base_fee + let sovereign_balance_before = Balances::balance(&sovereign_account); + assert_ok!(EthereumSystem::transfer_native_from_agent(origin.clone(), recipient, amount)); + let message = Message { + id: None, + channel_id: ParaId::from(para_id).into(), + command: Command::TransferNativeFromAgent { agent_id, recipient, amount }, + }; + let (_, fee) = OutboundQueue::validate(&message).unwrap(); + let sovereign_balance_after = Balances::balance(&sovereign_account); + assert_eq!(sovereign_balance_after + fee.local, sovereign_balance_before); + }); +} + +#[test] +fn charge_fee_for_upgrade() { + new_test_ext(true).execute_with(|| { + let para_id: u32 = TestParaId::get(); + let origin = RuntimeOrigin::root(); + let address: H160 = Default::default(); + let code_hash: H256 = Default::default(); + let initializer: Option = + Some(Initializer { params: [0; 256].into(), maximum_required_gas: 10000 }); + assert_ok!(EthereumSystem::upgrade(origin, address, code_hash, initializer.clone())); + + // assert sovereign_balance does not change as we do not charge for sudo operations + let sovereign_account = sibling_sovereign_account::(para_id.into()); + let sovereign_balance = Balances::balance(&sovereign_account); + assert_eq!(sovereign_balance, InitialFunding::get()); + }); +} + +#[test] +fn genesis_build_initializes_correctly() { + new_test_ext(true).execute_with(|| { + assert!(EthereumSystem::is_initialized(), "Ethereum uninitialized."); + }); +} + +#[test] +fn no_genesis_build_is_uninitialized() { + new_test_ext(false).execute_with(|| { + assert!(!EthereumSystem::is_initialized(), "Ethereum initialized."); + }); +} diff --git a/bridges/snowbridge/parachain/pallets/system/src/weights.rs b/bridges/snowbridge/parachain/pallets/system/src/weights.rs new file mode 100644 index 00000000000..6e532a0d8a8 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/system/src/weights.rs @@ -0,0 +1,249 @@ + +//! Autogenerated weights for `snowbridge_system` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-10-09, STEPS: `2`, REPEAT: `1`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `crake.local`, CPU: `` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("bridge-hub-rococo-dev")`, DB CACHE: `1024` + +// Executed Command: +// target/release/polkadot-parachain +// benchmark +// pallet +// --chain +// bridge-hub-rococo-dev +// --pallet=snowbridge_system +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --template +// ../parachain/templates/module-weight-template.hbs +// --output +// ../parachain/pallets/control/src/weights.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; +use core::marker::PhantomData; + +/// Weight functions needed for `snowbridge_system`. +pub trait WeightInfo { + fn upgrade() -> Weight; + fn create_agent() -> Weight; + fn create_channel() -> Weight; + fn update_channel() -> Weight; + fn force_update_channel() -> Weight; + fn set_operating_mode() -> Weight; + fn transfer_native_from_agent() -> Weight; + fn force_transfer_native_from_agent() -> Weight; + fn set_token_transfer_fees() -> Weight; + fn set_pricing_parameters() -> Weight; +} + +// For backwards compatibility and tests. +impl WeightInfo for () { + /// Storage: ParachainInfo ParachainId (r:1 w:0) + /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: EthereumOutboundQueue PalletOperatingMode (r:1 w:0) + /// Proof: EthereumOutboundQueue PalletOperatingMode (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + /// Storage: MessageQueue BookStateFor (r:1 w:1) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: MessageQueue ServiceHead (r:1 w:1) + /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(5), added: 500, mode: MaxEncodedLen) + /// Storage: MessageQueue Pages (r:0 w:1) + /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + fn upgrade() -> Weight { + // Proof Size summary in bytes: + // Measured: `80` + // Estimated: `3517` + // Minimum execution time: 44_000_000 picoseconds. + Weight::from_parts(44_000_000, 3517) + .saturating_add(RocksDbWeight::get().reads(4_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) + } + /// Storage: EthereumSystem Agents (r:1 w:1) + /// Proof: EthereumSystem Agents (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) + /// Storage: System Account (r:2 w:2) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: ParachainInfo ParachainId (r:1 w:0) + /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: EthereumOutboundQueue PalletOperatingMode (r:1 w:0) + /// Proof: EthereumOutboundQueue PalletOperatingMode (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + /// Storage: MessageQueue BookStateFor (r:1 w:1) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: MessageQueue ServiceHead (r:1 w:1) + /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(5), added: 500, mode: MaxEncodedLen) + /// Storage: MessageQueue Pages (r:0 w:1) + /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + fn create_agent() -> Weight { + // Proof Size summary in bytes: + // Measured: `187` + // Estimated: `6196` + // Minimum execution time: 85_000_000 picoseconds. + Weight::from_parts(85_000_000, 6196) + .saturating_add(RocksDbWeight::get().reads(7_u64)) + .saturating_add(RocksDbWeight::get().writes(6_u64)) + } + /// Storage: System Account (r:2 w:2) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: EthereumSystem Agents (r:1 w:0) + /// Proof: EthereumSystem Agents (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) + /// Storage: EthereumSystem Channels (r:1 w:1) + /// Proof: EthereumSystem Channels (max_values: None, max_size: Some(12), added: 2487, mode: MaxEncodedLen) + /// Storage: ParachainInfo ParachainId (r:1 w:0) + /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: EthereumOutboundQueue PalletOperatingMode (r:1 w:0) + /// Proof: EthereumOutboundQueue PalletOperatingMode (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + /// Storage: MessageQueue BookStateFor (r:1 w:1) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: MessageQueue Pages (r:1 w:1) + /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + fn create_channel() -> Weight { + // Proof Size summary in bytes: + // Measured: `602` + // Estimated: `69050` + // Minimum execution time: 83_000_000 picoseconds. + Weight::from_parts(83_000_000, 69050) + .saturating_add(RocksDbWeight::get().reads(8_u64)) + .saturating_add(RocksDbWeight::get().writes(5_u64)) + } + /// Storage: EthereumSystem Channels (r:1 w:0) + /// Proof: EthereumSystem Channels (max_values: None, max_size: Some(12), added: 2487, mode: MaxEncodedLen) + /// Storage: EthereumOutboundQueue PalletOperatingMode (r:1 w:0) + /// Proof: EthereumOutboundQueue PalletOperatingMode (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + /// Storage: MessageQueue BookStateFor (r:2 w:2) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: MessageQueue ServiceHead (r:1 w:0) + /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(5), added: 500, mode: MaxEncodedLen) + /// Storage: MessageQueue Pages (r:0 w:1) + /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + fn update_channel() -> Weight { + // Proof Size summary in bytes: + // Measured: `256` + // Estimated: `6044` + // Minimum execution time: 40_000_000 picoseconds. + Weight::from_parts(40_000_000, 6044) + .saturating_add(RocksDbWeight::get().reads(5_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) + } + /// Storage: EthereumSystem Channels (r:1 w:0) + /// Proof: EthereumSystem Channels (max_values: None, max_size: Some(12), added: 2487, mode: MaxEncodedLen) + /// Storage: EthereumOutboundQueue PalletOperatingMode (r:1 w:0) + /// Proof: EthereumOutboundQueue PalletOperatingMode (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + /// Storage: MessageQueue BookStateFor (r:2 w:2) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: MessageQueue ServiceHead (r:1 w:0) + /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(5), added: 500, mode: MaxEncodedLen) + /// Storage: MessageQueue Pages (r:0 w:1) + /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + fn force_update_channel() -> Weight { + // Proof Size summary in bytes: + // Measured: `256` + // Estimated: `6044` + // Minimum execution time: 41_000_000 picoseconds. + Weight::from_parts(41_000_000, 6044) + .saturating_add(RocksDbWeight::get().reads(5_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) + } + /// Storage: ParachainInfo ParachainId (r:1 w:0) + /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: EthereumOutboundQueue PalletOperatingMode (r:1 w:0) + /// Proof: EthereumOutboundQueue PalletOperatingMode (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + /// Storage: MessageQueue BookStateFor (r:1 w:1) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: MessageQueue ServiceHead (r:1 w:1) + /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(5), added: 500, mode: MaxEncodedLen) + /// Storage: MessageQueue Pages (r:0 w:1) + /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + fn set_operating_mode() -> Weight { + // Proof Size summary in bytes: + // Measured: `80` + // Estimated: `3517` + // Minimum execution time: 31_000_000 picoseconds. + Weight::from_parts(31_000_000, 3517) + .saturating_add(RocksDbWeight::get().reads(4_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) + } + /// Storage: EthereumSystem Agents (r:1 w:0) + /// Proof: EthereumSystem Agents (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) + /// Storage: EthereumOutboundQueue PalletOperatingMode (r:1 w:0) + /// Proof: EthereumOutboundQueue PalletOperatingMode (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + /// Storage: MessageQueue BookStateFor (r:2 w:2) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: MessageQueue ServiceHead (r:1 w:0) + /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(5), added: 500, mode: MaxEncodedLen) + /// Storage: MessageQueue Pages (r:0 w:1) + /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + fn transfer_native_from_agent() -> Weight { + // Proof Size summary in bytes: + // Measured: `252` + // Estimated: `6044` + // Minimum execution time: 45_000_000 picoseconds. + Weight::from_parts(45_000_000, 6044) + .saturating_add(RocksDbWeight::get().reads(5_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) + } + /// Storage: EthereumSystem Agents (r:1 w:0) + /// Proof: EthereumSystem Agents (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) + /// Storage: EthereumOutboundQueue PalletOperatingMode (r:1 w:0) + /// Proof: EthereumOutboundQueue PalletOperatingMode (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + /// Storage: MessageQueue BookStateFor (r:2 w:2) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: MessageQueue ServiceHead (r:1 w:0) + /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(5), added: 500, mode: MaxEncodedLen) + /// Storage: MessageQueue Pages (r:0 w:1) + /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + fn force_transfer_native_from_agent() -> Weight { + // Proof Size summary in bytes: + // Measured: `252` + // Estimated: `6044` + // Minimum execution time: 42_000_000 picoseconds. + Weight::from_parts(42_000_000, 6044) + .saturating_add(RocksDbWeight::get().reads(5_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) + } + + /// Storage: ParachainInfo ParachainId (r:1 w:0) + /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: EthereumOutboundQueue PalletOperatingMode (r:1 w:0) + /// Proof: EthereumOutboundQueue PalletOperatingMode (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + /// Storage: MessageQueue BookStateFor (r:1 w:1) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: MessageQueue ServiceHead (r:1 w:1) + /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(5), added: 500, mode: MaxEncodedLen) + /// Storage: MessageQueue Pages (r:0 w:1) + /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + fn set_token_transfer_fees() -> Weight { + // Proof Size summary in bytes: + // Measured: `80` + // Estimated: `3517` + // Minimum execution time: 31_000_000 picoseconds. + Weight::from_parts(42_000_000, 3517) + .saturating_add(RocksDbWeight::get().reads(4_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) + } + + /// Storage: ParachainInfo ParachainId (r:1 w:0) + /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: EthereumOutboundQueue PalletOperatingMode (r:1 w:0) + /// Proof: EthereumOutboundQueue PalletOperatingMode (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + /// Storage: MessageQueue BookStateFor (r:1 w:1) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: MessageQueue ServiceHead (r:1 w:1) + /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(5), added: 500, mode: MaxEncodedLen) + /// Storage: MessageQueue Pages (r:0 w:1) + /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + fn set_pricing_parameters() -> Weight { + // Proof Size summary in bytes: + // Measured: `80` + // Estimated: `3517` + // Minimum execution time: 31_000_000 picoseconds. + Weight::from_parts(42_000_000, 3517) + .saturating_add(RocksDbWeight::get().reads(4_u64)) + .saturating_add(RocksDbWeight::get().writes(3_u64)) + } +} diff --git a/bridges/snowbridge/parachain/primitives/beacon/Cargo.toml b/bridges/snowbridge/parachain/primitives/beacon/Cargo.toml new file mode 100644 index 00000000000..e81e0208ba1 --- /dev/null +++ b/bridges/snowbridge/parachain/primitives/beacon/Cargo.toml @@ -0,0 +1,52 @@ +[package] +name = "snowbridge-beacon-primitives" +description = "Snowbridge Beacon Primitives" +version = "0.0.1" +authors = ["Snowfork "] +edition = "2021" +license = "Apache-2.0" + +[dependencies] +serde = { version = "1.0.188", optional = true, features = ["derive"] } +hex = { version = "0.4", default-features = false } +codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } +scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } +rlp = { version = "0.5", default-features = false } + +frame-support = { path = "../../../../../substrate/frame/support", default-features = false } +frame-system = { path = "../../../../../substrate/frame/system", default-features = false } +sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-features = false } +sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } +sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } +sp-io = { path = "../../../../../substrate/primitives/io", default-features = false } + +ssz_rs = { version = "0.9.0", default-features = false } +ssz_rs_derive = { version = "0.9.0", default-features = false } +byte-slice-cast = { version = "1.2.1", default-features = false } + +snowbridge-ethereum = { path = "../../primitives/ethereum", default-features = false } +static_assertions = { version = "1.1.0" } +milagro_bls = { git = "https://github.com/snowfork/milagro_bls", default-features = false, rev = "a6d66e4eb89015e352fb1c9f7b661ecdbb5b2176" } + +[dev-dependencies] +hex-literal = { version = "0.4.1" } + +[features] +default = ["std"] +std = [ + "byte-slice-cast/std", + "codec/std", + "frame-support/std", + "frame-system/std", + "hex/std", + "milagro_bls/std", + "rlp/std", + "scale-info/std", + "serde", + "snowbridge-ethereum/std", + "sp-core/std", + "sp-io/std", + "sp-runtime/std", + "sp-std/std", + "ssz_rs/std", +] diff --git a/bridges/snowbridge/parachain/primitives/beacon/src/bits.rs b/bridges/snowbridge/parachain/primitives/beacon/src/bits.rs new file mode 100644 index 00000000000..72b7135ee29 --- /dev/null +++ b/bridges/snowbridge/parachain/primitives/beacon/src/bits.rs @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +use sp_std::{convert::TryInto, prelude::*}; +use ssz_rs::{Bitvector, Deserialize}; + +pub fn decompress_sync_committee_bits< + const SYNC_COMMITTEE_SIZE: usize, + const SYNC_COMMITTEE_BITS_SIZE: usize, +>( + input: [u8; SYNC_COMMITTEE_BITS_SIZE], +) -> [u8; SYNC_COMMITTEE_SIZE] { + Bitvector::<{ SYNC_COMMITTEE_SIZE }>::deserialize(&input) + .expect("checked statically; qed") + .iter() + .map(|bit| u8::from(bit == true)) + .collect::>() + .try_into() + .expect("checked statically; qed") +} diff --git a/bridges/snowbridge/parachain/primitives/beacon/src/bls.rs b/bridges/snowbridge/parachain/primitives/beacon/src/bls.rs new file mode 100644 index 00000000000..589b72e6734 --- /dev/null +++ b/bridges/snowbridge/parachain/primitives/beacon/src/bls.rs @@ -0,0 +1,87 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +use crate::{PublicKey, Signature}; +use codec::{Decode, Encode}; +use frame_support::{ensure, PalletError}; +pub use milagro_bls::{ + AggregatePublicKey, AggregateSignature, PublicKey as PublicKeyPrepared, + Signature as SignaturePrepared, +}; +use scale_info::TypeInfo; +use sp_core::H256; +use sp_runtime::RuntimeDebug; +use sp_std::prelude::*; + +#[derive(Copy, Clone, Encode, Decode, Eq, PartialEq, TypeInfo, RuntimeDebug, PalletError)] +pub enum BlsError { + InvalidSignature, + InvalidPublicKey, + InvalidAggregatePublicKeys, + SignatureVerificationFailed, +} + +/// fast_aggregate_verify optimized with aggregate key subtracting absent ones. +pub fn fast_aggregate_verify( + aggregate_pubkey: &PublicKeyPrepared, + absent_pubkeys: &Vec, + message: H256, + signature: &Signature, +) -> Result<(), BlsError> { + let agg_sig = prepare_aggregate_signature(signature)?; + let agg_key = prepare_aggregate_pubkey_from_absent(aggregate_pubkey, absent_pubkeys)?; + fast_aggregate_verify_pre_aggregated(agg_sig, agg_key, message) +} + +/// Decompress one public key into a point in G1. +pub fn prepare_milagro_pubkey(pubkey: &PublicKey) -> Result { + PublicKeyPrepared::from_bytes_unchecked(&pubkey.0).map_err(|_| BlsError::InvalidPublicKey) +} + +/// Prepare for G1 public keys. +pub fn prepare_g1_pubkeys(pubkeys: &[PublicKey]) -> Result, BlsError> { + pubkeys + .iter() + // Deserialize one public key from compressed bytes + .map(prepare_milagro_pubkey) + .collect::, BlsError>>() +} + +/// Prepare for G1 AggregatePublicKey. +pub fn prepare_aggregate_pubkey( + pubkeys: &[PublicKeyPrepared], +) -> Result { + AggregatePublicKey::into_aggregate(pubkeys).map_err(|_| BlsError::InvalidPublicKey) +} + +/// Prepare for G1 AggregatePublicKey. +pub fn prepare_aggregate_pubkey_from_absent( + aggregate_key: &PublicKeyPrepared, + absent_pubkeys: &Vec, +) -> Result { + let mut aggregate_pubkey = AggregatePublicKey::from_public_key(aggregate_key); + if !absent_pubkeys.is_empty() { + let absent_aggregate_key = prepare_aggregate_pubkey(absent_pubkeys)?; + aggregate_pubkey.point.sub(&absent_aggregate_key.point); + } + Ok(AggregatePublicKey { point: aggregate_pubkey.point }) +} + +/// Prepare for G2 AggregateSignature, normally more expensive than G1 operation. +pub fn prepare_aggregate_signature(signature: &Signature) -> Result { + Ok(AggregateSignature::from_signature( + &SignaturePrepared::from_bytes(&signature.0).map_err(|_| BlsError::InvalidSignature)?, + )) +} + +/// fast_aggregate_verify_pre_aggregated which is the most expensive call in beacon light client. +pub fn fast_aggregate_verify_pre_aggregated( + agg_sig: AggregateSignature, + aggregate_key: AggregatePublicKey, + message: H256, +) -> Result<(), BlsError> { + ensure!( + agg_sig.fast_aggregate_verify_pre_aggregated(&message[..], &aggregate_key), + BlsError::SignatureVerificationFailed + ); + Ok(()) +} diff --git a/bridges/snowbridge/parachain/primitives/beacon/src/config.rs b/bridges/snowbridge/parachain/primitives/beacon/src/config.rs new file mode 100644 index 00000000000..aa5fda706f9 --- /dev/null +++ b/bridges/snowbridge/parachain/primitives/beacon/src/config.rs @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +pub const MAX_PROOF_SIZE: u32 = 20; + +pub const FEE_RECIPIENT_SIZE: usize = 20; +pub const EXTRA_DATA_SIZE: usize = 32; +pub const LOGS_BLOOM_SIZE: usize = 256; + +pub const PUBKEY_SIZE: usize = 48; +pub const SIGNATURE_SIZE: usize = 96; diff --git a/bridges/snowbridge/parachain/primitives/beacon/src/lib.rs b/bridges/snowbridge/parachain/primitives/beacon/src/lib.rs new file mode 100644 index 00000000000..3527e1ff0d1 --- /dev/null +++ b/bridges/snowbridge/parachain/primitives/beacon/src/lib.rs @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +#![cfg_attr(not(feature = "std"), no_std)] + +pub mod bits; +pub mod bls; +pub mod config; +pub mod merkle_proof; +pub mod receipt; +pub mod ssz; +pub mod types; +pub mod updates; + +#[cfg(feature = "std")] +mod serde_utils; + +pub use types::{ + BeaconHeader, CompactBeaconState, CompactExecutionHeader, ExecutionHeaderState, + ExecutionPayloadHeader, FinalizedHeaderState, Fork, ForkData, ForkVersion, ForkVersions, Mode, + PublicKey, Signature, SigningData, SyncAggregate, SyncCommittee, SyncCommitteePrepared, +}; +pub use updates::{CheckpointUpdate, ExecutionHeaderUpdate, NextSyncCommitteeUpdate, Update}; + +pub use bits::decompress_sync_committee_bits; +pub use bls::{ + fast_aggregate_verify, prepare_aggregate_pubkey, prepare_aggregate_pubkey_from_absent, + prepare_aggregate_signature, prepare_g1_pubkeys, AggregatePublicKey, AggregateSignature, + BlsError, PublicKeyPrepared, SignaturePrepared, +}; +pub use merkle_proof::verify_merkle_branch; +pub use receipt::verify_receipt_proof; diff --git a/bridges/snowbridge/parachain/primitives/beacon/src/merkle_proof.rs b/bridges/snowbridge/parachain/primitives/beacon/src/merkle_proof.rs new file mode 100644 index 00000000000..a6ee6e9452c --- /dev/null +++ b/bridges/snowbridge/parachain/primitives/beacon/src/merkle_proof.rs @@ -0,0 +1,58 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +use sp_core::H256; +use sp_io::hashing::sha2_256; + +/// Specified by +/// with improvements from +pub fn verify_merkle_branch( + leaf: H256, + branch: &[H256], + index: usize, + depth: usize, + root: H256, +) -> bool { + // verify the proof length + if branch.len() != depth { + return false + } + // verify the computed merkle root + root == compute_merkle_root(leaf, branch, index) +} + +fn compute_merkle_root(leaf: H256, proof: &[H256], index: usize) -> H256 { + let mut value: [u8; 32] = leaf.into(); + for (i, node) in proof.iter().enumerate() { + let mut data = [0u8; 64]; + if generalized_index_bit(index, i) { + // right node + data[0..32].copy_from_slice(node.as_bytes()); + data[32..64].copy_from_slice(&value); + value = sha2_256(&data); + } else { + // left node + data[0..32].copy_from_slice(&value); + data[32..64].copy_from_slice(node.as_bytes()); + value = sha2_256(&data); + } + } + value.into() +} + +/// Spec: +fn generalized_index_bit(index: usize, position: usize) -> bool { + index & (1 << position) > 0 +} + +/// Spec: +pub const fn subtree_index(generalized_index: usize) -> usize { + generalized_index % (1 << generalized_index_length(generalized_index)) +} + +/// Spec: +pub const fn generalized_index_length(generalized_index: usize) -> usize { + match generalized_index.checked_ilog2() { + Some(v) => v as usize, + None => panic!("checked statically; qed"), + } +} diff --git a/bridges/snowbridge/parachain/primitives/beacon/src/receipt.rs b/bridges/snowbridge/parachain/primitives/beacon/src/receipt.rs new file mode 100644 index 00000000000..0588f3f73f7 --- /dev/null +++ b/bridges/snowbridge/parachain/primitives/beacon/src/receipt.rs @@ -0,0 +1,96 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +use sp_core::H256; +use sp_io::hashing::keccak_256; +use sp_std::prelude::*; + +use snowbridge_ethereum::{mpt, Receipt}; + +pub fn verify_receipt_proof( + receipts_root: H256, + proof: &[Vec], +) -> Option> { + match apply_merkle_proof(proof) { + Some((root, data)) if root == receipts_root => Some(rlp::decode(&data)), + Some((_, _)) => None, + None => None, + } +} + +fn apply_merkle_proof(proof: &[Vec]) -> Option<(H256, Vec)> { + let mut iter = proof.iter().rev(); + let first_bytes = match iter.next() { + Some(b) => b, + None => return None, + }; + let item_to_prove: mpt::ShortNode = rlp::decode(first_bytes).ok()?; + + let final_hash: Option<[u8; 32]> = iter.try_fold(keccak_256(first_bytes), |acc, x| { + let node: Box = x.as_slice().try_into().ok()?; + if (*node).contains_hash(acc.into()) { + return Some(keccak_256(x)) + } + None + }); + + final_hash.map(|hash| (hash.into(), item_to_prove.value)) +} + +#[cfg(test)] +mod tests { + use super::*; + use hex_literal::hex; + + #[test] + fn test_verify_receipt_proof() { + let root: H256 = + hex!("fd5e397a84884641f53c496804f24b5276cbb8c5c9cfc2342246be8e3ce5ad02").into(); + + // Valid proof + let proof_receipt5 = vec!( + hex!("f90131a0b5ba404eb5a6a88e56579f4d37ef9813b5ad7f86f0823ff3b407ac5a6bb465eca0398ead2655e78e03c127ce22c5830e90f18b1601ec055f938336c084feb915a9a026d322c26e46c50942c1aabde50e36df5cde572aed650ce73ea3182c6e90a02ca00600a356135f4db1db0d9842264cdff2652676f881669e91e316c0b6dd783011a0837f1deb4075336da320388c1edfffc56c448a43f4a5ba031300d32a7b509fc5a01c3ac82fd65b4aba7f9afaf604d9c82ec7e2deb573a091ae235751bc5c0c288da05d454159d9071b0f68b6e0503d290f23ac7602c1db0c569dee4605d8f5298f09a00bbed10350ec954448df795f6fd46e3faefc800ede061b3840eedc6e2b07a74da0acb02d26a3650f2064c14a435fdf1f668d8655daf455ebdf671713a7c089b3898080808080808080").to_vec(), + hex!("f901f180a00046a08d4f0bdbdc6b31903086ce323182bce6725e7d9415f7ff91ee8f4820bda0e7cd26ad5f3d2771e4b5ab788e268a14a10209f94ee918eb6c829d21d3d11c1da00d4a56d9e9a6751874fd86c7e3cb1c6ad5a848da62751325f478978a00ea966ea064b81920c8f04a8a1e21f53a8280e739fbb7b00b2ab92493ca3f610b70e8ac85a0b1040ed4c55a73178b76abb16f946ce5bebd6b93ab873c83327df54047d12c27a0de6485e9ac58dc6e2b04b4bb38f562684f0b1a2ee586cc11079e7d9a9dc40b32a0d394f4d3532c3124a65fa36e69147e04fd20453a72ee9c50660f17e13ce9df48a066501003fc3e3478efd2803cd0eded6bbe9243ca01ba754d6327071ddbcbc649a0b2684e518f325fee39fc8ea81b68f3f5c785be00d087f3bed8857ae2ee8da26ea071060a5c52042e8d7ce21092f8ecf06053beb9a0b773a6f91a30c4220aa276b2a0fc22436632574ccf6043d0986dede27ea94c9ca9a3bb5ec03ce776a4ddef24a9a05a8a1d6698c4e7d8cc3a2506cb9b12ea9a079c9c7099bc919dc804033cc556e4a0170c468b0716fd36d161f0bf05875f15756a2976de92f9efe7716320509d79c9a0182f909a90cab169f3efb62387f9cccdd61440acc4deec42f68a4f7ca58075c7a055cf0e9202ac75689b76318f1171f3a44465eddc06aae0713bfb6b34fdd27b7980").to_vec(), + hex!("f904de20b904daf904d701830652f0b9010004200000000000000000000080020000000000010000000000010000000000000000000000000000000000000000000002000000080000000000000000200000000000000000000000000008000000220000000000400010000000000000000000000000000000000000000000000000000000000000040000000010000100000000000800000000004000000000000000000000000000080000004000000000020000000000020000000000000000000000000000000000000000000004000000000002000000000100000000000000000000000000001000000002000020000010200000000000010000000000000000000000000000000000000010000000f903ccf89b9421130f34829b4c343142047a28ce96ec07814b15f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000007d843005c7433c16b27ff939cb37471541561ebda0000000000000000000000000e9c1281aae66801fa35ec404d5f2aea393ff6988a000000000000000000000000000000000000000000000000000000005d09b7380f89b9421130f34829b4c343142047a28ce96ec07814b15f863a08c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a00000000000000000000000007d843005c7433c16b27ff939cb37471541561ebda00000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488da0ffffffffffffffffffffffffffffffffffffffffffffffffffffffcc840c6920f89b94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000e9c1281aae66801fa35ec404d5f2aea393ff6988a00000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488da000000000000000000000000000000000000000000000000003e973b5a5d1078ef87994e9c1281aae66801fa35ec404d5f2aea393ff6988e1a01c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1b840000000000000000000000000000000000000000000000000000001f1420ad1d40000000000000000000000000000000000000000000000014ad400879d159a38f8fc94e9c1281aae66801fa35ec404d5f2aea393ff6988f863a0d78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822a00000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488da00000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488db88000000000000000000000000000000000000000000000000000000005d415f3320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e973b5a5d1078ef87a94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f842a07fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65a00000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488da000000000000000000000000000000000000000000000000003e973b5a5d1078e").to_vec(), + ); + assert!(verify_receipt_proof(root, &proof_receipt5).is_some()); + + // Various invalid proofs + let proof_empty: Vec> = vec![]; + let proof_missing_full_node = vec![proof_receipt5[0].clone(), proof_receipt5[2].clone()]; + let proof_missing_short_node1 = vec![proof_receipt5[0].clone(), proof_receipt5[1].clone()]; + let proof_missing_short_node2 = vec![proof_receipt5[0].clone()]; + let proof_invalid_encoding = vec![proof_receipt5[2][2..].to_vec()]; + let proof_no_full_node = vec![proof_receipt5[2].clone(), proof_receipt5[2].clone()]; + assert!(verify_receipt_proof(root, &proof_empty).is_none()); + assert!(verify_receipt_proof(root, &proof_missing_full_node).is_none()); + + assert_eq!( + verify_receipt_proof(root, &proof_missing_short_node1), + Some(Err(rlp::DecoderError::Custom("Unsupported receipt type"))) + ); + + assert_eq!( + verify_receipt_proof(root, &proof_missing_short_node2), + Some(Err(rlp::DecoderError::Custom("Unsupported receipt type"))) + ); + + assert!(verify_receipt_proof(root, &proof_invalid_encoding).is_none()); + assert!(verify_receipt_proof(root, &proof_no_full_node).is_none()); + } + + #[test] + fn test_verify_receipt_proof_with_intermediate_short_node() { + let root: H256 = + hex!("d128e3a57142d2bf15bc0cbcac7ad54f40750d571b5c3097e425882c10c9ba66").into(); + + let proof_receipt263 = vec![ + hex!("f90131a00d3cb8d3f57ac1c0e12918a2ebe0cafed8c273577b9dd73e7ed1079b403ef494a0678b9835b834f8a287c0dd33a8fca9146e456ca688555ed4ec1361a2180b778da0fe42da181a46677a043b3d9d4b8bb05a6a17b7b5c010c17e7c1d31cfb7c4f911a0c89f0e2c53241cdb578e1f2b4caf6ba36e00500bdc57fecd66b84a6a58394c19a086c3c1fae5a0575940b5d38e111c469d07883106c26856f3ef608469a2081f13a06c5992ff00aab6226a70a032fd2f571ba22f797321f45e2daa73020d638d21b0a050861e9503ef68728f6c90a44f7fe1bceb2a9bdab6957bbe7136166bd849561ea006aa6eaca8a07e57176e9aa41e6a09edfb7678d1a112404e0ec779d7e567e82ea0bb0b430d303ba21b0af11c487b8a218bd75db54c98940b3f11bad8ff47cad3ef8080808080808080").to_vec(), + hex!("f871a0246de222036ee6a03329b0105da0a6b3f916fc95a9ed5a403a581a0c4d74242ca0ac108a49a88b57a05ac34a108b39f1e45f6f167f2b9fbc8d52fb58e2e5a6af1ea0fcfe07ac2ccd3c28b6eab68d1bce112f6f6dbd9023e4ec3c05b96615aa803d798080808080808080808080808080").to_vec(), + hex!("e4820001a04fff54398cad4d05ea6abfd8b0f3b4fe14c04d7ff5f5211c5b927d9cf72ac1d8").to_vec(), + hex!("f851a096d010643ca2d47412ca66898286b5f2412963b9ec051b33e570d575914c9c5ca028cd24c652989542fe89479ec6388eac4592432242af5ba97563b3ac7c71c019808080808080808080808080808080").to_vec(), + hex!("f90211a0bb35a84c5b1dcb78ec9d32614912c696e62df77bebf9ab326ee55b5d3acdde46a01084b30dac8df0accfcd0fd6330b7f6fc72a4651246d0694be9162151686a620a03eed50afdce7909d784c6157c445a444c806b5f23d31f3b63786f600c84a95b2a0af5232f1df6c6d41879804d081abe867002abe26ba3e5f8e0254a83a54769831a0607915fb13dd5da594256389a45007a67a7f7a86e95d38d8462792b6c98a722ea00e1260fda1730f2738c650ce2bfba83857bc10f8fb119ebc4fb39acba24e6fbaa0d11de17e417327457812675ca3b84ae8e1b64827abfe01420953697c8313d5b1a05fcaf2f7a88f76336a0c32ffc78acb87ae2005454bd25d658035331be3173b46a03f94f4952ab9e650f83cfd0e7f367b1bcc493aacf39a06f16c4a2e1b5605da48a0bdb4ec79785ca8ae22d60f1bbd42d707b4d7ec4aff231a3ebab755e315b35053a043a67c3f2bcef37c8f47a673adcb7061007a553696d1092408601c11b2e6846aa0c519d5af48cae87c7f4538845417c9735813bee892a6fe2dda79f5c414e8576aa0f7058256e09589501d7c231d739e61c84a850e139690989d24fda6058b432e98a081a52faab520978cb19ce14400dba0cd5bcdc4e5a3c0740678aa8f97ee0e5c56a0bcecc61cadeae52518e3b68a48af4b11603dfd9d99d99d7985efa6d2de44f904a02cba4accfc6f39bc5adb6d4440eb6358b4a5103ef93298e4e694f1f940f8b48280").to_vec(), + hex!("f901ae20b901aaf901a70183bb444eb9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000001000000000000000000000000000100000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000010000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000080000000000000000000000000000000000000000000000002000000000000000000081000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000f89df89b94dac17f958d2ee523a2206206994597c13d831ec7f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000002e514404ff6823f1b46a8318a709251db414e5e1a000000000000000000000000055021c55847c00d764357a352e5803237d328954a0000000000000000000000000000000000000000000000000000000000201c370").to_vec(), + ]; + assert!(verify_receipt_proof(root, &proof_receipt263).is_some()); + } +} diff --git a/bridges/snowbridge/parachain/primitives/beacon/src/serde_utils.rs b/bridges/snowbridge/parachain/primitives/beacon/src/serde_utils.rs new file mode 100644 index 00000000000..07f5cbe724e --- /dev/null +++ b/bridges/snowbridge/parachain/primitives/beacon/src/serde_utils.rs @@ -0,0 +1,130 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +use sp_core::U256; + +use core::fmt::Formatter; +use serde::{Deserialize, Deserializer}; + +// helper to deserialize arbitrary arrays like [T; N] +pub mod arrays { + use std::{convert::TryInto, marker::PhantomData}; + + use serde::{ + de::{SeqAccess, Visitor}, + ser::SerializeTuple, + Deserialize, Deserializer, Serialize, Serializer, + }; + + pub fn serialize( + data: &[T; N], + ser: S, + ) -> Result { + let mut s = ser.serialize_tuple(N)?; + for item in data { + s.serialize_element(item)?; + } + s.end() + } + + struct ArrayVisitor(PhantomData); + + impl<'de, T, const N: usize> Visitor<'de> for ArrayVisitor + where + T: Deserialize<'de>, + { + type Value = [T; N]; + + fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { + formatter.write_str(&format!("an array of length {}", N)) + } + + #[inline] + fn visit_seq(self, mut seq: A) -> Result + where + A: SeqAccess<'de>, + { + // can be optimized using MaybeUninit + let mut data = Vec::with_capacity(N); + for _ in 0..N { + match (seq.next_element())? { + Some(val) => data.push(val), + None => return Err(serde::de::Error::invalid_length(N, &self)), + } + } + match data.try_into() { + Ok(arr) => Ok(arr), + Err(_) => unreachable!(), + } + } + } + + pub fn deserialize<'de, D, T, const N: usize>(deserializer: D) -> Result<[T; N], D::Error> + where + D: Deserializer<'de>, + T: Deserialize<'de>, + { + deserializer.deserialize_tuple(N, ArrayVisitor::(PhantomData)) + } +} + +pub(crate) fn from_hex_to_bytes<'de, D>(deserializer: D) -> Result, D::Error> +where + D: Deserializer<'de>, +{ + let s = String::deserialize(deserializer)?; + + let str_without_0x = match s.strip_prefix("0x") { + Some(val) => val, + None => &s, + }; + + let hex_bytes = match hex::decode(str_without_0x) { + Ok(bytes) => bytes, + Err(e) => return Err(serde::de::Error::custom(e.to_string())), + }; + + Ok(hex_bytes) +} + +pub(crate) fn from_int_to_u256<'de, D>(deserializer: D) -> Result +where + D: Deserializer<'de>, +{ + let number = u128::deserialize(deserializer)?; + + Ok(U256::from(number)) +} + +pub struct HexVisitor(); + +impl<'de, const LENGTH: usize> serde::de::Visitor<'de> for HexVisitor { + type Value = [u8; LENGTH]; + + fn expecting(&self, formatter: &mut Formatter) -> sp_std::fmt::Result { + formatter.write_str("a hex string with an '0x' prefix") + } + + fn visit_str(self, v: &str) -> Result + where + E: serde::de::Error, + { + let stripped = match v.strip_prefix("0x") { + Some(stripped) => stripped, + None => v, + }; + + let decoded = match hex::decode(stripped) { + Ok(decoded) => decoded, + Err(e) => return Err(serde::de::Error::custom(e.to_string())), + }; + if decoded.len() != LENGTH { + return Err(serde::de::Error::custom("publickey expected to be 48 characters")) + } + + let data: Self::Value = decoded + .try_into() + .map_err(|_e| serde::de::Error::custom("hex data has unexpected length"))?; + + Ok(data) + } +} diff --git a/bridges/snowbridge/parachain/primitives/beacon/src/ssz.rs b/bridges/snowbridge/parachain/primitives/beacon/src/ssz.rs new file mode 100644 index 00000000000..4f8b19ca889 --- /dev/null +++ b/bridges/snowbridge/parachain/primitives/beacon/src/ssz.rs @@ -0,0 +1,194 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +use crate::{ + config::{EXTRA_DATA_SIZE, FEE_RECIPIENT_SIZE, LOGS_BLOOM_SIZE, PUBKEY_SIZE, SIGNATURE_SIZE}, + types::{ + BeaconHeader, ExecutionPayloadHeader, ForkData, SigningData, SyncAggregate, SyncCommittee, + }, +}; +use byte_slice_cast::AsByteSlice; +use sp_core::H256; +use sp_std::{vec, vec::Vec}; +use ssz_rs::{ + prelude::{List, Vector}, + Bitvector, Deserialize, DeserializeError, SimpleSerialize, SimpleSerializeError, Sized, U256, +}; +use ssz_rs_derive::SimpleSerialize as SimpleSerializeDerive; + +#[derive(Default, SimpleSerializeDerive, Clone, Debug)] +pub struct SSZBeaconBlockHeader { + pub slot: u64, + pub proposer_index: u64, + pub parent_root: [u8; 32], + pub state_root: [u8; 32], + pub body_root: [u8; 32], +} + +impl From for SSZBeaconBlockHeader { + fn from(beacon_header: BeaconHeader) -> Self { + SSZBeaconBlockHeader { + slot: beacon_header.slot, + proposer_index: beacon_header.proposer_index, + parent_root: beacon_header.parent_root.to_fixed_bytes(), + state_root: beacon_header.state_root.to_fixed_bytes(), + body_root: beacon_header.body_root.to_fixed_bytes(), + } + } +} + +#[derive(Default, SimpleSerializeDerive, Clone)] +pub struct SSZSyncCommittee { + pub pubkeys: Vector, COMMITTEE_SIZE>, + pub aggregate_pubkey: Vector, +} + +impl From> + for SSZSyncCommittee +{ + fn from(sync_committee: SyncCommittee) -> Self { + let mut pubkeys_vec = Vec::new(); + + for pubkey in sync_committee.pubkeys.iter() { + // The only thing that can go wrong in the conversion from vec to Vector (ssz type) is + // that the Vector size is 0, or that the given data to create the Vector from does not + // match the expected size N. Because these sizes are statically checked (i.e. + // PublicKey's size is 48, and const PUBKEY_SIZE is 48, it is impossible for "try_from" + // to return an error condition. + let conv_pubkey = Vector::::try_from(pubkey.0.to_vec()) + .expect("checked statically; qed"); + + pubkeys_vec.push(conv_pubkey); + } + + let pubkeys = Vector::, { COMMITTEE_SIZE }>::try_from(pubkeys_vec) + .expect("checked statically; qed"); + + let aggregate_pubkey = + Vector::::try_from(sync_committee.aggregate_pubkey.0.to_vec()) + .expect("checked statically; qed"); + + SSZSyncCommittee { pubkeys, aggregate_pubkey } + } +} + +#[derive(Default, Debug, SimpleSerializeDerive, Clone)] +pub struct SSZSyncAggregate { + pub sync_committee_bits: Bitvector, + pub sync_committee_signature: Vector, +} + +impl + From> for SSZSyncAggregate +{ + fn from(sync_aggregate: SyncAggregate) -> Self { + SSZSyncAggregate { + sync_committee_bits: Bitvector::::deserialize( + &sync_aggregate.sync_committee_bits, + ) + .expect("checked statically; qed"), + sync_committee_signature: Vector::::try_from( + sync_aggregate.sync_committee_signature.0.to_vec(), + ) + .expect("checked statically; qed"), + } + } +} + +#[derive(Default, SimpleSerializeDerive, Clone)] +pub struct SSZForkData { + pub current_version: [u8; 4], + pub genesis_validators_root: [u8; 32], +} + +impl From for SSZForkData { + fn from(fork_data: ForkData) -> Self { + SSZForkData { + current_version: fork_data.current_version, + genesis_validators_root: fork_data.genesis_validators_root, + } + } +} + +#[derive(Default, SimpleSerializeDerive, Clone)] +pub struct SSZSigningData { + pub object_root: [u8; 32], + pub domain: [u8; 32], +} + +impl From for SSZSigningData { + fn from(signing_data: SigningData) -> Self { + SSZSigningData { + object_root: signing_data.object_root.into(), + domain: signing_data.domain.into(), + } + } +} + +#[derive(Default, SimpleSerializeDerive, Clone, Debug)] +pub struct SSZExecutionPayloadHeader { + pub parent_hash: [u8; 32], + pub fee_recipient: Vector, + pub state_root: [u8; 32], + pub receipts_root: [u8; 32], + pub logs_bloom: Vector, + pub prev_randao: [u8; 32], + pub block_number: u64, + pub gas_limit: u64, + pub gas_used: u64, + pub timestamp: u64, + pub extra_data: List, + pub base_fee_per_gas: U256, + pub block_hash: [u8; 32], + pub transactions_root: [u8; 32], + pub withdrawals_root: [u8; 32], +} + +impl TryFrom for SSZExecutionPayloadHeader { + type Error = SimpleSerializeError; + + fn try_from(payload: ExecutionPayloadHeader) -> Result { + Ok(SSZExecutionPayloadHeader { + parent_hash: payload.parent_hash.to_fixed_bytes(), + fee_recipient: Vector::::try_from( + payload.fee_recipient.to_fixed_bytes().to_vec(), + ) + .expect("checked statically; qed"), + state_root: payload.state_root.to_fixed_bytes(), + receipts_root: payload.receipts_root.to_fixed_bytes(), + // Logs bloom bytes size is not constrained, so here we do need to check the try_from + // error + logs_bloom: Vector::::try_from(payload.logs_bloom) + .map_err(|(_, err)| err)?, + prev_randao: payload.prev_randao.to_fixed_bytes(), + block_number: payload.block_number, + gas_limit: payload.gas_limit, + gas_used: payload.gas_used, + timestamp: payload.timestamp, + // Extra data bytes size is not constrained, so here we do need to check the try_from + // error + extra_data: List::::try_from(payload.extra_data) + .map_err(|(_, err)| err)?, + base_fee_per_gas: U256::from_bytes_le( + payload + .base_fee_per_gas + .as_byte_slice() + .try_into() + .expect("checked in prep; qed"), + ), + block_hash: payload.block_hash.to_fixed_bytes(), + transactions_root: payload.transactions_root.to_fixed_bytes(), + withdrawals_root: payload.withdrawals_root.to_fixed_bytes(), + }) + } +} + +pub fn hash_tree_root(mut object: T) -> Result { + match object.hash_tree_root() { + Ok(node) => { + let fixed_bytes: [u8; 32] = + node.as_ref().try_into().expect("Node is a newtype over [u8; 32]; qed"); + Ok(fixed_bytes.into()) + }, + Err(err) => Err(err.into()), + } +} diff --git a/bridges/snowbridge/parachain/primitives/beacon/src/types.rs b/bridges/snowbridge/parachain/primitives/beacon/src/types.rs new file mode 100644 index 00000000000..f893551d9d1 --- /dev/null +++ b/bridges/snowbridge/parachain/primitives/beacon/src/types.rs @@ -0,0 +1,512 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +use codec::{Decode, Encode, MaxEncodedLen}; +use frame_support::{CloneNoBound, PartialEqNoBound, RuntimeDebugNoBound}; +use scale_info::TypeInfo; +use sp_core::{H160, H256, U256}; +use sp_runtime::RuntimeDebug; +use sp_std::{boxed::Box, prelude::*}; + +use crate::config::{PUBKEY_SIZE, SIGNATURE_SIZE}; + +#[cfg(feature = "std")] +use serde::{Deserialize, Deserializer, Serialize, Serializer}; + +#[cfg(feature = "std")] +use crate::serde_utils::HexVisitor; + +use crate::ssz::{ + hash_tree_root, SSZBeaconBlockHeader, SSZExecutionPayloadHeader, SSZForkData, SSZSigningData, + SSZSyncAggregate, SSZSyncCommittee, +}; +use ssz_rs::SimpleSerializeError; + +pub use crate::bits::decompress_sync_committee_bits; + +use crate::bls::{prepare_g1_pubkeys, prepare_milagro_pubkey, BlsError}; +use milagro_bls::PublicKey as PublicKeyPrepared; + +pub type ValidatorIndex = u64; +pub type ForkVersion = [u8; 4]; + +#[derive(Clone, Encode, Decode, PartialEq, RuntimeDebug, TypeInfo)] +pub struct ForkVersions { + pub genesis: Fork, + pub altair: Fork, + pub bellatrix: Fork, + pub capella: Fork, +} + +#[derive(Clone, Encode, Decode, PartialEq, RuntimeDebug, TypeInfo)] +pub struct Fork { + pub version: [u8; 4], + pub epoch: u64, +} + +#[derive(Copy, Clone, Encode, Decode, PartialEq, RuntimeDebug, TypeInfo)] +pub struct PublicKey(pub [u8; PUBKEY_SIZE]); + +impl Default for PublicKey { + fn default() -> Self { + PublicKey([0u8; PUBKEY_SIZE]) + } +} + +impl From<[u8; PUBKEY_SIZE]> for PublicKey { + fn from(v: [u8; PUBKEY_SIZE]) -> Self { + Self(v) + } +} + +impl MaxEncodedLen for PublicKey { + fn max_encoded_len() -> usize { + PUBKEY_SIZE + } +} + +#[cfg(feature = "std")] +impl<'de> Deserialize<'de> for PublicKey { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + deserializer.deserialize_str(HexVisitor::()).map(|v| v.into()) + } +} + +#[cfg(feature = "std")] +impl Serialize for PublicKey { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + serializer.serialize_bytes(&self.0) + } +} + +#[derive(Copy, Clone, Encode, Decode, PartialEq, RuntimeDebug, TypeInfo)] +pub struct Signature(pub [u8; SIGNATURE_SIZE]); + +impl Default for Signature { + fn default() -> Self { + Signature([0u8; SIGNATURE_SIZE]) + } +} + +impl From<[u8; SIGNATURE_SIZE]> for Signature { + fn from(v: [u8; SIGNATURE_SIZE]) -> Self { + Self(v) + } +} + +#[cfg(feature = "std")] +impl<'de> Deserialize<'de> for Signature { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + deserializer.deserialize_str(HexVisitor::()).map(|v| v.into()) + } +} + +#[derive(Copy, Clone, Default, Encode, Decode, TypeInfo, MaxEncodedLen)] +pub struct ExecutionHeaderState { + pub beacon_block_root: H256, + pub beacon_slot: u64, + pub block_hash: H256, + pub block_number: u64, +} + +#[derive(Copy, Clone, Default, Encode, Decode, TypeInfo, MaxEncodedLen)] +pub struct FinalizedHeaderState { + pub beacon_block_root: H256, + pub beacon_slot: u64, +} + +#[derive(Clone, Default, Encode, Decode, PartialEq, RuntimeDebug)] +pub struct ForkData { + // 1 or 0 bit, indicates whether a sync committee participated in a vote + pub current_version: [u8; 4], + pub genesis_validators_root: [u8; 32], +} + +impl ForkData { + pub fn hash_tree_root(&self) -> Result { + hash_tree_root::(self.clone().into()) + } +} + +#[derive(Clone, Default, Encode, Decode, PartialEq, RuntimeDebug)] +pub struct SigningData { + pub object_root: H256, + pub domain: H256, +} + +impl SigningData { + pub fn hash_tree_root(&self) -> Result { + hash_tree_root::(self.clone().into()) + } +} + +/// Sync committee as it is stored in the runtime storage. +#[derive( + Encode, Decode, PartialEqNoBound, CloneNoBound, RuntimeDebugNoBound, TypeInfo, MaxEncodedLen, +)] +#[cfg_attr( + feature = "std", + derive(Serialize, Deserialize), + serde(deny_unknown_fields, bound(serialize = ""), bound(deserialize = "")) +)] +#[codec(mel_bound())] +pub struct SyncCommittee { + #[cfg_attr(feature = "std", serde(with = "crate::serde_utils::arrays"))] + pub pubkeys: [PublicKey; COMMITTEE_SIZE], + pub aggregate_pubkey: PublicKey, +} + +impl Default for SyncCommittee { + fn default() -> Self { + SyncCommittee { + pubkeys: [Default::default(); COMMITTEE_SIZE], + aggregate_pubkey: Default::default(), + } + } +} + +impl SyncCommittee { + pub fn hash_tree_root(&self) -> Result { + hash_tree_root::>(self.clone().into()) + } +} + +/// Prepared G1 public key of sync committee as it is stored in the runtime storage. +#[derive(Clone, PartialEq, Eq, Encode, Decode, TypeInfo, MaxEncodedLen)] +pub struct SyncCommitteePrepared { + pub root: H256, + pub pubkeys: Box<[PublicKeyPrepared; COMMITTEE_SIZE]>, + pub aggregate_pubkey: PublicKeyPrepared, +} + +impl Default for SyncCommitteePrepared { + fn default() -> Self { + SyncCommitteePrepared { + root: H256::default(), + pubkeys: Box::new([PublicKeyPrepared::default(); COMMITTEE_SIZE]), + aggregate_pubkey: PublicKeyPrepared::default(), + } + } +} + +impl TryFrom<&SyncCommittee> + for SyncCommitteePrepared +{ + type Error = BlsError; + + fn try_from(sync_committee: &SyncCommittee) -> Result { + let g1_pubkeys = prepare_g1_pubkeys(&sync_committee.pubkeys)?; + let sync_committee_root = sync_committee.hash_tree_root().expect("checked statically; qed"); + + Ok(SyncCommitteePrepared:: { + pubkeys: g1_pubkeys.try_into().expect("checked statically; qed"), + aggregate_pubkey: prepare_milagro_pubkey(&sync_committee.aggregate_pubkey)?, + root: sync_committee_root, + }) + } +} + +/// Beacon block header as it is stored in the runtime storage. The block root is the +/// Merkleization of a BeaconHeader. +#[derive( + Copy, Clone, Default, Encode, Decode, PartialEq, RuntimeDebug, TypeInfo, MaxEncodedLen, +)] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +pub struct BeaconHeader { + // The slot for which this block is created. Must be greater than the slot of the block defined + // by parent root. + pub slot: u64, + // The index of the validator that proposed the block. + pub proposer_index: ValidatorIndex, + // The block root of the parent block, forming a block chain. + pub parent_root: H256, + // The hash root of the post state of running the state transition through this block. + pub state_root: H256, + // The hash root of the beacon block body + pub body_root: H256, +} + +impl BeaconHeader { + pub fn hash_tree_root(&self) -> Result { + hash_tree_root::((*self).into()) + } +} + +#[derive(Encode, Decode, CloneNoBound, PartialEqNoBound, RuntimeDebugNoBound, TypeInfo)] +#[cfg_attr( + feature = "std", + derive(Deserialize), + serde( + try_from = "IntermediateSyncAggregate", + deny_unknown_fields, + bound(serialize = ""), + bound(deserialize = "") + ) +)] +#[codec(mel_bound())] +pub struct SyncAggregate { + pub sync_committee_bits: [u8; COMMITTEE_BITS_SIZE], + pub sync_committee_signature: Signature, +} + +impl Default + for SyncAggregate +{ + fn default() -> Self { + SyncAggregate { + sync_committee_bits: [0; COMMITTEE_BITS_SIZE], + sync_committee_signature: Default::default(), + } + } +} + +impl + SyncAggregate +{ + pub fn hash_tree_root(&self) -> Result { + hash_tree_root::>(self.clone().into()) + } +} + +/// Serde deserialization helper for SyncAggregate +#[cfg(feature = "std")] +#[derive(Deserialize)] +struct IntermediateSyncAggregate { + #[cfg_attr(feature = "std", serde(deserialize_with = "crate::serde_utils::from_hex_to_bytes"))] + pub sync_committee_bits: Vec, + pub sync_committee_signature: Signature, +} + +#[cfg(feature = "std")] +impl + TryFrom for SyncAggregate +{ + type Error = String; + + fn try_from(other: IntermediateSyncAggregate) -> Result { + Ok(Self { + sync_committee_bits: other + .sync_committee_bits + .try_into() + .map_err(|_| "unexpected length".to_owned())?, + sync_committee_signature: other.sync_committee_signature, + }) + } +} + +/// ExecutionPayloadHeader +/// +#[derive( + Default, Encode, Decode, CloneNoBound, PartialEqNoBound, RuntimeDebugNoBound, TypeInfo, +)] +#[cfg_attr( + feature = "std", + derive(Deserialize), + serde(deny_unknown_fields, bound(serialize = ""), bound(deserialize = "")) +)] +#[codec(mel_bound())] +pub struct ExecutionPayloadHeader { + pub parent_hash: H256, + pub fee_recipient: H160, + pub state_root: H256, + pub receipts_root: H256, + #[cfg_attr(feature = "std", serde(deserialize_with = "crate::serde_utils::from_hex_to_bytes"))] + pub logs_bloom: Vec, + pub prev_randao: H256, + pub block_number: u64, + pub gas_limit: u64, + pub gas_used: u64, + pub timestamp: u64, + #[cfg_attr(feature = "std", serde(deserialize_with = "crate::serde_utils::from_hex_to_bytes"))] + pub extra_data: Vec, + #[cfg_attr(feature = "std", serde(deserialize_with = "crate::serde_utils::from_int_to_u256"))] + pub base_fee_per_gas: U256, + pub block_hash: H256, + pub transactions_root: H256, + pub withdrawals_root: H256, +} + +impl ExecutionPayloadHeader { + pub fn hash_tree_root(&self) -> Result { + hash_tree_root::(self.clone().try_into()?) + } +} + +#[derive( + Default, + Encode, + Decode, + CloneNoBound, + PartialEqNoBound, + RuntimeDebugNoBound, + TypeInfo, + MaxEncodedLen, +)] +pub struct CompactExecutionHeader { + pub parent_hash: H256, + #[codec(compact)] + pub block_number: u64, + pub state_root: H256, + pub receipts_root: H256, +} + +impl From for CompactExecutionHeader { + fn from(execution_payload: ExecutionPayloadHeader) -> Self { + Self { + parent_hash: execution_payload.parent_hash, + block_number: execution_payload.block_number, + state_root: execution_payload.state_root, + receipts_root: execution_payload.receipts_root, + } + } +} + +#[derive( + Default, + Encode, + Decode, + Copy, + Clone, + PartialEqNoBound, + RuntimeDebugNoBound, + TypeInfo, + MaxEncodedLen, +)] +pub struct CompactBeaconState { + #[codec(compact)] + pub slot: u64, + pub block_roots_root: H256, +} + +#[cfg(test)] +mod tests { + use super::*; + use hex_literal::hex; + + #[test] + pub fn test_hash_beacon_header1() { + let hash_root = BeaconHeader { + slot: 3, + proposer_index: 2, + parent_root: hex!("796ea53efb534eab7777809cc5ee2d84e7f25024b9d0c4d7e5bcaab657e4bdbd") + .into(), + state_root: hex!("ba3ff080912be5c9c158b2e962c1b39a91bc0615762ba6fa2ecacafa94e9ae0a") + .into(), + body_root: hex!("a18d7fcefbb74a177c959160e0ee89c23546482154e6831237710414465dcae5") + .into(), + } + .hash_tree_root(); + + assert!(hash_root.is_ok()); + assert_eq!( + hash_root.unwrap(), + hex!("7d42595818709e805dd2fa710a2d2c1f62576ef1ab7273941ac9130fb94b91f7").into() + ); + } + + #[test] + pub fn test_hash_beacon_header2() { + let hash_root = BeaconHeader { + slot: 3476424, + proposer_index: 314905, + parent_root: hex!("c069d7b49cffd2b815b0fb8007eb9ca91202ea548df6f3db60000f29b2489f28") + .into(), + state_root: hex!("444d293e4533501ee508ad608783a7d677c3c566f001313e8a02ce08adf590a3") + .into(), + body_root: hex!("6508a0241047f21ba88f05d05b15534156ab6a6f8e029a9a5423da429834e04a") + .into(), + } + .hash_tree_root(); + + assert!(hash_root.is_ok()); + assert_eq!( + hash_root.unwrap(), + hex!("0aa41166ff01e58e111ac8c42309a738ab453cf8d7285ed8477b1c484acb123e").into() + ); + } + + #[test] + pub fn test_hash_fork_data() { + let hash_root = ForkData { + current_version: hex!("83f38a34"), + genesis_validators_root: hex!( + "22370bbbb358800f5711a10ea9845284272d8493bed0348cab87b8ab1e127930" + ), + } + .hash_tree_root(); + + assert!(hash_root.is_ok()); + assert_eq!( + hash_root.unwrap(), + hex!("57c12c4246bc7152b174b51920506bf943eff9c7ffa50b9533708e9cc1f680fc").into() + ); + } + + #[test] + pub fn test_hash_signing_data() { + let hash_root = SigningData { + object_root: hex!("63654cbe64fc07853f1198c165dd3d49c54fc53bc417989bbcc66da15f850c54") + .into(), + domain: hex!("037da907d1c3a03c0091b2254e1480d9b1783476e228ab29adaaa8f133e08f7a").into(), + } + .hash_tree_root(); + + assert!(hash_root.is_ok()); + assert_eq!( + hash_root.unwrap(), + hex!("b9eb2caf2d691b183c2d57f322afe505c078cd08101324f61c3641714789a54e").into() + ); + } + + #[test] + pub fn test_hash_sync_aggregate() { + let hash_root = SyncAggregate::<512, 64>{ + sync_committee_bits: hex!("cefffffefffffff767fffbedffffeffffeeffdffffdebffffff7f7dbdf7fffdffffbffcfffdff79dfffbbfefff2ffffff7ddeff7ffffc98ff7fbfffffffffff7"), + sync_committee_signature: hex!("8af1a8577bba419fe054ee49b16ed28e081dda6d3ba41651634685e890992a0b675e20f8d9f2ec137fe9eb50e838aa6117f9f5410e2e1024c4b4f0e098e55144843ce90b7acde52fe7b94f2a1037342c951dc59f501c92acf7ed944cb6d2b5f7").into(), + }.hash_tree_root(); + + assert!(hash_root.is_ok()); + assert_eq!( + hash_root.unwrap(), + hex!("e6dcad4f60ce9ff8a587b110facbaf94721f06cd810b6d8bf6cffa641272808d").into() + ); + } + + #[test] + pub fn test_hash_execution_payload() { + let hash_root = + ExecutionPayloadHeader{ + parent_hash: hex!("eadee5ab098dde64e9fd02ae5858064bad67064070679625b09f8d82dec183f7").into(), + fee_recipient: hex!("f97e180c050e5ab072211ad2c213eb5aee4df134").into(), + state_root: hex!("564fa064c2a324c2b5978d7fdfc5d4224d4f421a45388af1ed405a399c845dff").into(), + receipts_root: hex!("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421").into(), + logs_bloom: hex!("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").to_vec(), + prev_randao: hex!("6bf538bdfbdf1c96ff528726a40658a91d0bda0f1351448c4c4f3604db2a0ccf").into(), + block_number: 477434, + gas_limit: 8154925, + gas_used: 0, + timestamp: 1652816940, + extra_data: vec![], + base_fee_per_gas: U256::from(7_i16), + block_hash: hex!("cd8df91b4503adb8f2f1c7a4f60e07a1f1a2cbdfa2a95bceba581f3ff65c1968").into(), + transactions_root: hex!("7ffe241ea60187fdb0187bfa22de35d1f9bed7ab061d9401fd47e34a54fbede1").into(), + withdrawals_root: hex!("28ba1834a3a7b657460ce79fa3a1d909ab8828fd557659d4d0554a9bdbc0ec30").into(), + }.hash_tree_root(); + assert!(hash_root.is_ok()); + } +} + +/// Operating modes for beacon client +#[derive(Encode, Decode, Copy, Clone, PartialEq, RuntimeDebug, TypeInfo)] +pub enum Mode { + Active, + Blocked, +} diff --git a/bridges/snowbridge/parachain/primitives/beacon/src/updates.rs b/bridges/snowbridge/parachain/primitives/beacon/src/updates.rs new file mode 100644 index 00000000000..9a78b4f1e2d --- /dev/null +++ b/bridges/snowbridge/parachain/primitives/beacon/src/updates.rs @@ -0,0 +1,110 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +use codec::{Decode, Encode}; +use frame_support::{CloneNoBound, PartialEqNoBound, RuntimeDebugNoBound}; +use scale_info::TypeInfo; +use sp_core::H256; +use sp_std::prelude::*; + +use crate::types::{BeaconHeader, ExecutionPayloadHeader, SyncAggregate, SyncCommittee}; + +#[derive(Encode, Decode, CloneNoBound, PartialEqNoBound, RuntimeDebugNoBound, TypeInfo)] +#[cfg_attr( + feature = "std", + derive(serde::Serialize, serde::Deserialize), + serde(deny_unknown_fields, bound(serialize = ""), bound(deserialize = "")) +)] +pub struct CheckpointUpdate { + pub header: BeaconHeader, + pub current_sync_committee: SyncCommittee, + pub current_sync_committee_branch: Vec, + pub validators_root: H256, + pub block_roots_root: H256, + pub block_roots_branch: Vec, +} + +impl Default for CheckpointUpdate { + fn default() -> Self { + CheckpointUpdate { + header: Default::default(), + current_sync_committee: Default::default(), + current_sync_committee_branch: Default::default(), + validators_root: Default::default(), + block_roots_root: Default::default(), + block_roots_branch: Default::default(), + } + } +} + +#[derive( + Default, Encode, Decode, CloneNoBound, PartialEqNoBound, RuntimeDebugNoBound, TypeInfo, +)] +#[cfg_attr( + feature = "std", + derive(serde::Deserialize), + serde(deny_unknown_fields, bound(serialize = ""), bound(deserialize = "")) +)] +pub struct Update { + /// A recent header attesting to the finalized header, using its `state_root`. + pub attested_header: BeaconHeader, + /// The signing data that the sync committee produced for this attested header, including + /// who participated in the vote and the resulting signature. + pub sync_aggregate: SyncAggregate, + /// The slot at which the sync aggregate can be found, typically attested_header.slot + 1, if + /// the next slot block was not missed. + pub signature_slot: u64, + /// The next sync committee for the next sync committee period, if present. + pub next_sync_committee_update: Option>, + /// The latest finalized header. + pub finalized_header: BeaconHeader, + /// The merkle proof testifying to the finalized header, using the `attested_header.state_root` + /// as tree root. + pub finality_branch: Vec, + /// The finalized_header's `block_roots` root in the beacon state, used for ancestry proofs. + pub block_roots_root: H256, + /// The merkle path to prove the `block_roots_root` value. + pub block_roots_branch: Vec, +} + +#[derive( + Default, Encode, Decode, CloneNoBound, PartialEqNoBound, RuntimeDebugNoBound, TypeInfo, +)] +#[cfg_attr( + feature = "std", + derive(serde::Deserialize), + serde(deny_unknown_fields, bound(serialize = ""), bound(deserialize = "")) +)] +pub struct NextSyncCommitteeUpdate { + pub next_sync_committee: SyncCommittee, + pub next_sync_committee_branch: Vec, +} + +#[derive(Encode, Decode, CloneNoBound, PartialEqNoBound, RuntimeDebugNoBound, TypeInfo)] +#[cfg_attr( + feature = "std", + derive(serde::Deserialize), + serde(deny_unknown_fields, bound(serialize = ""), bound(deserialize = "")) +)] +pub struct ExecutionHeaderUpdate { + /// Header for the beacon block containing the execution payload + pub header: BeaconHeader, + /// Proof that `header` is an ancestor of a finalized header + pub ancestry_proof: Option, + /// Execution header to be imported + pub execution_header: ExecutionPayloadHeader, + /// Merkle proof that execution payload is contained within `header` + pub execution_branch: Vec, +} + +#[derive(Encode, Decode, CloneNoBound, PartialEqNoBound, RuntimeDebugNoBound, TypeInfo)] +#[cfg_attr( + feature = "std", + derive(serde::Deserialize), + serde(deny_unknown_fields, bound(serialize = ""), bound(deserialize = "")) +)] +pub struct AncestryProof { + /// Merkle proof that `header` is an ancestor of `finalized_header` + pub header_branch: Vec, + /// Root of a finalized block that has already been imported into the light client + pub finalized_block_root: H256, +} diff --git a/bridges/snowbridge/parachain/primitives/core/Cargo.toml b/bridges/snowbridge/parachain/primitives/core/Cargo.toml new file mode 100644 index 00000000000..262fc60b0cb --- /dev/null +++ b/bridges/snowbridge/parachain/primitives/core/Cargo.toml @@ -0,0 +1,60 @@ +[package] +name = "snowbridge-core" +description = "Snowbridge Core" +version = "0.1.1" +authors = ["Snowfork "] +edition = "2021" +license = "Apache-2.0" + +[dependencies] +serde = { version = "1.0.188", optional = true, features = ["alloc", "derive"], default-features = false } +codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } +scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } +hex-literal = { version = "0.4.1" } + +polkadot-parachain-primitives = { path = "../../../../../polkadot/parachain", default-features = false } +xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } +xcm-builder = { package = "staging-xcm-builder", path = "../../../../../polkadot/xcm/xcm-builder", default-features = false } + +frame-support = { path = "../../../../../substrate/frame/support", default-features = false } +frame-system = { path = "../../../../../substrate/frame/system", default-features = false } +sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-features = false } +sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } +sp-io = { path = "../../../../../substrate/primitives/io", default-features = false } +sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } +sp-arithmetic = { path = "../../../../../substrate/primitives/arithmetic", default-features = false } + +snowbridge-beacon-primitives = { path = "../../primitives/beacon", default-features = false } + +ethabi = { git = "https://github.com/Snowfork/ethabi-decode.git", package = "ethabi-decode", branch = "master", default-features = false } + +[dev-dependencies] +hex = { version = "0.4.3" } + +[features] +default = ["std"] +std = [ + "codec/std", + "ethabi/std", + "frame-support/std", + "frame-system/std", + "polkadot-parachain-primitives/std", + "scale-info/std", + "serde/std", + "snowbridge-beacon-primitives/std", + "sp-arithmetic/std", + "sp-core/std", + "sp-io/std", + "sp-runtime/std", + "sp-std/std", + "xcm-builder/std", + "xcm/std", +] +serde = ["dep:serde", "scale-info/serde"] +runtime-benchmarks = [ + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "polkadot-parachain-primitives/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", + "xcm-builder/runtime-benchmarks", +] diff --git a/bridges/snowbridge/parachain/primitives/core/src/inbound.rs b/bridges/snowbridge/parachain/primitives/core/src/inbound.rs new file mode 100644 index 00000000000..4b04470ad02 --- /dev/null +++ b/bridges/snowbridge/parachain/primitives/core/src/inbound.rs @@ -0,0 +1,74 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +//! Types for representing inbound messages + +use codec::{Decode, Encode}; +use frame_support::PalletError; +use scale_info::TypeInfo; +use sp_core::{H160, H256}; +use sp_runtime::RuntimeDebug; +use sp_std::vec::Vec; + +/// A trait for verifying inbound messages from Ethereum. +pub trait Verifier { + fn verify(event: &Log, proof: &Proof) -> Result<(), VerificationError>; +} + +#[derive(Clone, Encode, Decode, RuntimeDebug, PalletError, TypeInfo)] +#[cfg_attr(feature = "std", derive(PartialEq))] +pub enum VerificationError { + /// Execution header is missing + HeaderNotFound, + /// Event log was not found in the verified transaction receipt + LogNotFound, + /// Event log has an invalid format + InvalidLog, + /// Unable to verify the transaction receipt with the provided proof + InvalidProof, +} + +pub type MessageNonce = u64; + +/// A bridge message from the Gateway contract on Ethereum +#[derive(Clone, Encode, Decode, PartialEq, RuntimeDebug, TypeInfo)] +pub struct Message { + /// Event log emitted by Gateway contract + pub event_log: Log, + /// Inclusion proof for a transaction receipt containing the event log + pub proof: Proof, +} + +const MAX_TOPICS: usize = 4; + +#[derive(Clone, RuntimeDebug)] +pub enum LogValidationError { + TooManyTopics, +} + +/// Event log +#[derive(Clone, Encode, Decode, PartialEq, RuntimeDebug, TypeInfo)] +pub struct Log { + pub address: H160, + pub topics: Vec, + pub data: Vec, +} + +impl Log { + pub fn validate(&self) -> Result<(), LogValidationError> { + if self.topics.len() > MAX_TOPICS { + return Err(LogValidationError::TooManyTopics) + } + Ok(()) + } +} + +/// Inclusion proof for a transaction receipt +#[derive(Clone, Encode, Decode, PartialEq, RuntimeDebug, TypeInfo)] +pub struct Proof { + // The block hash of the block in which the receipt was included. + pub block_hash: H256, + // The index of the transaction (and receipt) within the block. + pub tx_index: u32, + // Proof keys and values (receipts tree) + pub data: (Vec>, Vec>), +} diff --git a/bridges/snowbridge/parachain/primitives/core/src/lib.rs b/bridges/snowbridge/parachain/primitives/core/src/lib.rs new file mode 100644 index 00000000000..ecbc3bb365f --- /dev/null +++ b/bridges/snowbridge/parachain/primitives/core/src/lib.rs @@ -0,0 +1,174 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +//! # Core +//! +//! Common traits and types +#![cfg_attr(not(feature = "std"), no_std)] + +#[cfg(test)] +mod tests; + +pub mod inbound; +pub mod operating_mode; +pub mod outbound; +pub mod pricing; +pub mod ringbuffer; + +pub use polkadot_parachain_primitives::primitives::{ + Id as ParaId, IsSystem, Sibling as SiblingParaId, +}; +pub use ringbuffer::{RingBufferMap, RingBufferMapImpl}; +pub use sp_core::U256; + +use codec::{Decode, Encode, MaxEncodedLen}; +use frame_support::traits::Contains; +use hex_literal::hex; +use scale_info::TypeInfo; +use sp_core::H256; +use sp_io::hashing::keccak_256; +use sp_runtime::{traits::AccountIdConversion, RuntimeDebug}; +use sp_std::prelude::*; +use xcm::prelude::{ + Junction::Parachain, + Junctions::{Here, X1}, + MultiLocation, +}; +use xcm_builder::{DescribeAllTerminal, DescribeFamily, DescribeLocation, HashedDescription}; + +/// The ID of an agent contract +pub type AgentId = H256; +pub use operating_mode::BasicOperatingMode; + +pub use pricing::{PricingParameters, Rewards}; + +pub fn sibling_sovereign_account(para_id: ParaId) -> T::AccountId +where + T: frame_system::Config, +{ + SiblingParaId::from(para_id).into_account_truncating() +} + +pub fn sibling_sovereign_account_raw(para_id: ParaId) -> [u8; 32] { + SiblingParaId::from(para_id).into_account_truncating() +} + +pub struct AllowSiblingsOnly; +impl Contains for AllowSiblingsOnly { + fn contains(location: &MultiLocation) -> bool { + matches!(location, MultiLocation { parents: 1, interior: X1(Parachain(_)) }) + } +} + +pub fn gwei(x: u128) -> U256 { + U256::from(1_000_000_000u128).saturating_mul(x.into()) +} + +pub fn meth(x: u128) -> U256 { + U256::from(1_000_000_000_000_000u128).saturating_mul(x.into()) +} + +pub fn eth(x: u128) -> U256 { + U256::from(1_000_000_000_000_000_000u128).saturating_mul(x.into()) +} + +pub const ROC: u128 = 1_000_000_000_000; + +/// Identifier for a message channel +#[derive( + Clone, Copy, Encode, Decode, PartialEq, Eq, Default, RuntimeDebug, MaxEncodedLen, TypeInfo, +)] +pub struct ChannelId([u8; 32]); + +/// Deterministically derive a ChannelId for a sibling parachain +/// Generator: keccak256("para" + big_endian_bytes(para_id)) +/// +/// The equivalent generator on the Solidity side is in +/// contracts/src/Types.sol:into(). +fn derive_channel_id_for_sibling(para_id: ParaId) -> ChannelId { + let para_id: u32 = para_id.into(); + let para_id_bytes: [u8; 4] = para_id.to_be_bytes(); + let prefix: [u8; 4] = *b"para"; + let preimage: Vec = prefix.into_iter().chain(para_id_bytes).collect(); + keccak_256(&preimage).into() +} + +impl ChannelId { + pub const fn new(id: [u8; 32]) -> Self { + ChannelId(id) + } +} + +impl From for ChannelId { + fn from(value: ParaId) -> Self { + derive_channel_id_for_sibling(value) + } +} + +impl From<[u8; 32]> for ChannelId { + fn from(value: [u8; 32]) -> Self { + ChannelId(value) + } +} + +impl From for [u8; 32] { + fn from(value: ChannelId) -> Self { + value.0 + } +} + +impl<'a> From<&'a [u8; 32]> for ChannelId { + fn from(value: &'a [u8; 32]) -> Self { + ChannelId(*value) + } +} + +impl From for ChannelId { + fn from(value: H256) -> Self { + ChannelId(value.into()) + } +} + +impl AsRef<[u8]> for ChannelId { + fn as_ref(&self) -> &[u8] { + &self.0 + } +} + +#[derive(Clone, Encode, Decode, RuntimeDebug, MaxEncodedLen, TypeInfo)] +pub struct Channel { + /// ID of the agent contract deployed on Ethereum + pub agent_id: AgentId, + /// ID of the parachain who will receive or send messages using this channel + pub para_id: ParaId, +} + +pub trait StaticLookup { + /// Type to lookup from. + type Source; + /// Type to lookup into. + type Target; + /// Attempt a lookup. + fn lookup(s: Self::Source) -> Option; +} + +/// Channel for high-priority governance commands +pub const PRIMARY_GOVERNANCE_CHANNEL: ChannelId = + ChannelId::new(hex!("0000000000000000000000000000000000000000000000000000000000000001")); + +/// Channel for lower-priority governance commands +pub const SECONDARY_GOVERNANCE_CHANNEL: ChannelId = + ChannelId::new(hex!("0000000000000000000000000000000000000000000000000000000000000002")); + +pub struct DescribeHere; +impl DescribeLocation for DescribeHere { + fn describe_location(l: &MultiLocation) -> Option> { + match (l.parents, l.interior) { + (0, Here) => Some(Vec::::new().encode()), + _ => None, + } + } +} + +/// Creates an AgentId from a MultiLocation. An AgentId is a unique mapping to a Agent contract on +/// Ethereum which acts as the sovereign account for the MultiLocation. +pub type AgentIdOf = HashedDescription)>; diff --git a/bridges/snowbridge/parachain/primitives/core/src/operating_mode.rs b/bridges/snowbridge/parachain/primitives/core/src/operating_mode.rs new file mode 100644 index 00000000000..9894e587ef5 --- /dev/null +++ b/bridges/snowbridge/parachain/primitives/core/src/operating_mode.rs @@ -0,0 +1,25 @@ +use codec::{Decode, Encode, MaxEncodedLen}; +use scale_info::TypeInfo; +use sp_runtime::RuntimeDebug; + +/// Basic operating modes for a bridges module (Normal/Halted). +#[derive(Encode, Decode, Clone, Copy, PartialEq, Eq, RuntimeDebug, TypeInfo, MaxEncodedLen)] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +pub enum BasicOperatingMode { + /// Normal mode, when all operations are allowed. + Normal, + /// The pallet is halted. All non-governance operations are disabled. + Halted, +} + +impl Default for BasicOperatingMode { + fn default() -> Self { + Self::Normal + } +} + +impl BasicOperatingMode { + pub fn is_halted(&self) -> bool { + *self == BasicOperatingMode::Halted + } +} diff --git a/bridges/snowbridge/parachain/primitives/core/src/outbound.rs b/bridges/snowbridge/parachain/primitives/core/src/outbound.rs new file mode 100644 index 00000000000..bce123878d3 --- /dev/null +++ b/bridges/snowbridge/parachain/primitives/core/src/outbound.rs @@ -0,0 +1,413 @@ +use codec::{Decode, Encode}; +use frame_support::PalletError; +use scale_info::TypeInfo; +use sp_arithmetic::traits::{BaseArithmetic, Unsigned}; +use sp_core::{RuntimeDebug, H256}; +pub use v1::{AgentExecuteCommand, Command, Initializer, Message, OperatingMode, QueuedMessage}; + +/// Enqueued outbound messages need to be versioned to prevent data corruption +/// or loss after forkless runtime upgrades +#[derive(Encode, Decode, TypeInfo, Clone, RuntimeDebug)] +#[cfg_attr(feature = "std", derive(PartialEq))] +pub enum VersionedQueuedMessage { + V1(QueuedMessage), +} + +impl TryFrom for QueuedMessage { + type Error = (); + fn try_from(x: VersionedQueuedMessage) -> Result { + use VersionedQueuedMessage::*; + match x { + V1(x) => Ok(x), + } + } +} + +impl> From for VersionedQueuedMessage { + fn from(x: T) -> Self { + VersionedQueuedMessage::V1(x.into()) + } +} + +mod v1 { + use crate::{pricing::UD60x18, ChannelId}; + use codec::{Decode, Encode}; + use ethabi::Token; + use scale_info::TypeInfo; + use sp_core::{RuntimeDebug, H160, H256, U256}; + use sp_std::{borrow::ToOwned, vec, vec::Vec}; + + /// A message which can be accepted by implementations of `/[`SendMessage`\]` + #[derive(Encode, Decode, TypeInfo, Clone, RuntimeDebug)] + #[cfg_attr(feature = "std", derive(PartialEq))] + pub struct Message { + /// ID for this message. One will be automatically generated if not provided. + /// + /// When this message is created from an XCM message, the ID should be extracted + /// from the `SetTopic` instruction. + /// + /// The ID plays no role in bridge consensus, and is purely meant for message tracing. + pub id: Option, + /// The message channel ID + pub channel_id: ChannelId, + /// The stable ID for a receiving gateway contract + pub command: Command, + } + + /// The operating mode of Channels and Gateway contract on Ethereum. + #[derive(Copy, Clone, Encode, Decode, PartialEq, Eq, RuntimeDebug, TypeInfo)] + pub enum OperatingMode { + /// Normal operations. Allow sending and receiving messages. + Normal, + /// Reject outbound messages. This allows receiving governance messages but does now allow + /// enqueuing of new messages from the Ethereum side. This can be used to close off an + /// deprecated channel or pause the bridge for upgrade operations. + RejectingOutboundMessages, + } + + /// A command which is executable by the Gateway contract on Ethereum + #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo)] + #[cfg_attr(feature = "std", derive(PartialEq))] + pub enum Command { + /// Execute a sub-command within an agent for a consensus system in Polkadot + AgentExecute { + /// The ID of the agent + agent_id: H256, + /// The sub-command to be executed + command: AgentExecuteCommand, + }, + /// Upgrade the Gateway contract + Upgrade { + /// Address of the new implementation contract + impl_address: H160, + /// Codehash of the implementation contract + impl_code_hash: H256, + /// Optionally invoke an initializer in the implementation contract + initializer: Option, + }, + /// Create an agent representing a consensus system on Polkadot + CreateAgent { + /// The ID of the agent, derived from the `MultiLocation` of the consensus system on + /// Polkadot + agent_id: H256, + }, + /// Create bidirectional messaging channel to a parachain + CreateChannel { + /// The ID of the channel + channel_id: ChannelId, + /// The agent ID of the parachain + agent_id: H256, + /// Initial operating mode + mode: OperatingMode, + }, + /// Update the configuration of a channel + UpdateChannel { + /// The ID of the channel + channel_id: ChannelId, + /// The new operating mode + mode: OperatingMode, + }, + /// Set the global operating mode of the Gateway contract + SetOperatingMode { + /// The new operating mode + mode: OperatingMode, + }, + /// Transfer ether from an agent contract to a recipient account + TransferNativeFromAgent { + /// The agent ID + agent_id: H256, + /// The recipient of the ether + recipient: H160, + /// The amount to transfer + amount: u128, + }, + /// Set token fees of the Gateway contract + SetTokenTransferFees { + /// The fee(DOT) for the cost of creating asset on AssetHub + create_asset_xcm: u128, + /// The fee(DOT) for the cost of sending asset on AssetHub + transfer_asset_xcm: u128, + /// The fee(Ether) for register token to discourage spamming + register_token: U256, + }, + /// Set pricing parameters + SetPricingParameters { + // ETH/DOT exchange rate + exchange_rate: UD60x18, + // Cost of delivering a message from Ethereum to BridgeHub, in ROC/KSM/DOT + delivery_cost: u128, + }, + } + + impl Command { + /// Compute the enum variant index + pub fn index(&self) -> u8 { + match self { + Command::AgentExecute { .. } => 0, + Command::Upgrade { .. } => 1, + Command::CreateAgent { .. } => 2, + Command::CreateChannel { .. } => 3, + Command::UpdateChannel { .. } => 4, + Command::SetOperatingMode { .. } => 5, + Command::TransferNativeFromAgent { .. } => 6, + Command::SetTokenTransferFees { .. } => 7, + Command::SetPricingParameters { .. } => 8, + } + } + + /// ABI-encode the Command. + pub fn abi_encode(&self) -> Vec { + match self { + Command::AgentExecute { agent_id, command } => + ethabi::encode(&[Token::Tuple(vec![ + Token::FixedBytes(agent_id.as_bytes().to_owned()), + Token::Bytes(command.abi_encode()), + ])]), + Command::Upgrade { impl_address, impl_code_hash, initializer, .. } => + ethabi::encode(&[Token::Tuple(vec![ + Token::Address(*impl_address), + Token::FixedBytes(impl_code_hash.as_bytes().to_owned()), + initializer + .clone() + .map_or(Token::Bytes(vec![]), |i| Token::Bytes(i.params)), + ])]), + Command::CreateAgent { agent_id } => + ethabi::encode(&[Token::Tuple(vec![Token::FixedBytes( + agent_id.as_bytes().to_owned(), + )])]), + Command::CreateChannel { channel_id, agent_id, mode } => + ethabi::encode(&[Token::Tuple(vec![ + Token::FixedBytes(channel_id.as_ref().to_owned()), + Token::FixedBytes(agent_id.as_bytes().to_owned()), + Token::Uint(U256::from((*mode) as u64)), + ])]), + Command::UpdateChannel { channel_id, mode } => + ethabi::encode(&[Token::Tuple(vec![ + Token::FixedBytes(channel_id.as_ref().to_owned()), + Token::Uint(U256::from((*mode) as u64)), + ])]), + Command::SetOperatingMode { mode } => + ethabi::encode(&[Token::Tuple(vec![Token::Uint(U256::from((*mode) as u64))])]), + Command::TransferNativeFromAgent { agent_id, recipient, amount } => + ethabi::encode(&[Token::Tuple(vec![ + Token::FixedBytes(agent_id.as_bytes().to_owned()), + Token::Address(*recipient), + Token::Uint(U256::from(*amount)), + ])]), + Command::SetTokenTransferFees { + create_asset_xcm, + transfer_asset_xcm, + register_token, + } => ethabi::encode(&[Token::Tuple(vec![ + Token::Uint(U256::from(*create_asset_xcm)), + Token::Uint(U256::from(*transfer_asset_xcm)), + Token::Uint(*register_token), + ])]), + Command::SetPricingParameters { exchange_rate, delivery_cost } => + ethabi::encode(&[Token::Tuple(vec![ + Token::Uint(exchange_rate.clone().into_inner()), + Token::Uint(U256::from(*delivery_cost)), + ])]), + } + } + } + + /// Representation of a call to the initializer of an implementation contract. + /// The initializer has the following ABI signature: `initialize(bytes)`. + #[derive(Clone, Encode, Decode, PartialEq, RuntimeDebug, TypeInfo)] + pub struct Initializer { + /// ABI-encoded params of type `bytes` to pass to the initializer + pub params: Vec, + /// The initializer is allowed to consume this much gas at most. + pub maximum_required_gas: u64, + } + + /// A Sub-command executable within an agent + #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo)] + #[cfg_attr(feature = "std", derive(PartialEq))] + pub enum AgentExecuteCommand { + /// Transfer ERC20 tokens + TransferToken { + /// Address of the ERC20 token + token: H160, + /// The recipient of the tokens + recipient: H160, + /// The amount of tokens to transfer + amount: u128, + }, + } + + impl AgentExecuteCommand { + fn index(&self) -> u8 { + match self { + AgentExecuteCommand::TransferToken { .. } => 0, + } + } + + /// ABI-encode the sub-command + pub fn abi_encode(&self) -> Vec { + match self { + AgentExecuteCommand::TransferToken { token, recipient, amount } => + ethabi::encode(&[ + Token::Uint(self.index().into()), + Token::Bytes(ethabi::encode(&[ + Token::Address(*token), + Token::Address(*recipient), + Token::Uint(U256::from(*amount)), + ])), + ]), + } + } + } + + /// Message which is awaiting processing in the MessageQueue pallet + #[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo)] + #[cfg_attr(feature = "std", derive(PartialEq))] + pub struct QueuedMessage { + /// Message ID + pub id: H256, + /// Channel ID + pub channel_id: ChannelId, + /// Command to execute in the Gateway contract + pub command: Command, + } +} + +#[cfg_attr(feature = "std", derive(PartialEq, Debug))] +/// Fee for delivering message +pub struct Fee +where + Balance: BaseArithmetic + Unsigned + Copy, +{ + /// Fee to cover cost of processing the message locally + pub local: Balance, + /// Fee to cover cost processing the message remotely + pub remote: Balance, +} + +impl Fee +where + Balance: BaseArithmetic + Unsigned + Copy, +{ + pub fn total(&self) -> Balance { + self.local.saturating_add(self.remote) + } +} + +impl From<(Balance, Balance)> for Fee +where + Balance: BaseArithmetic + Unsigned + Copy, +{ + fn from((local, remote): (Balance, Balance)) -> Self { + Self { local, remote } + } +} + +/// A trait for sending messages to Ethereum +pub trait SendMessage: SendMessageFeeProvider { + type Ticket: Clone + Encode + Decode; + + /// Validate an outbound message and return a tuple: + /// 1. Ticket for submitting the message + /// 2. Delivery fee + fn validate( + message: &Message, + ) -> Result<(Self::Ticket, Fee<::Balance>), SendError>; + + /// Submit the message ticket for eventual delivery to Ethereum + fn deliver(ticket: Self::Ticket) -> Result; +} + +pub trait Ticket: Encode + Decode + Clone { + fn message_id(&self) -> H256; +} + +/// A trait for getting the local costs associated with sending a message. +pub trait SendMessageFeeProvider { + type Balance: BaseArithmetic + Unsigned + Copy; + + /// The local component of the message processing fees in native currency + fn local_fee() -> Self::Balance; +} + +/// Reasons why sending to Ethereum could not be initiated +#[derive(Copy, Clone, Encode, Decode, PartialEq, Eq, RuntimeDebug, PalletError, TypeInfo)] +pub enum SendError { + /// Message is too large to be safely executed on Ethereum + MessageTooLarge, + /// The bridge has been halted for maintenance + Halted, + /// Invalid Channel + InvalidChannel, +} + +pub trait GasMeter { + /// All the gas used for submitting a message to Ethereum, minus the cost of dispatching + /// the command within the message + const MAXIMUM_BASE_GAS: u64; + + fn maximum_gas_used_at_most(command: &Command) -> u64 { + Self::MAXIMUM_BASE_GAS + Self::maximum_dispatch_gas_used_at_most(command) + } + + /// Measures the maximum amount of gas a command payload will require to dispatch, AFTER + /// validation & verification. + fn maximum_dispatch_gas_used_at_most(command: &Command) -> u64; +} + +/// A meter that assigns a constant amount of gas for the execution of a command +/// +/// The gas figures are extracted from this report: +/// > forge test --match-path test/Gateway.t.sol --gas-report +/// +/// A healthy buffer is added on top of these figures to account for: +/// * The EIP-150 63/64 rule +/// * Future EVM upgrades that may increase gas cost +pub struct ConstantGasMeter; + +impl GasMeter for ConstantGasMeter { + // The base transaction cost, which includes: + // 21_000 transaction cost, roughly worst case 64_000 for calldata, and 100_000 + // for message verification + const MAXIMUM_BASE_GAS: u64 = 185_000; + + fn maximum_dispatch_gas_used_at_most(command: &Command) -> u64 { + match command { + Command::CreateAgent { .. } => 275_000, + Command::CreateChannel { .. } => 100_000, + Command::UpdateChannel { .. } => 50_000, + Command::TransferNativeFromAgent { .. } => 60_000, + Command::SetOperatingMode { .. } => 40_000, + Command::AgentExecute { command, .. } => match command { + // Execute IERC20.transferFrom + // + // Worst-case assumptions are important: + // * No gas refund for clearing storage slot of source account in ERC20 contract + // * Assume dest account in ERC20 contract does not yet have a storage slot + // * ERC20.transferFrom possibly does other business logic besides updating balances + AgentExecuteCommand::TransferToken { .. } => 100_000, + }, + Command::Upgrade { initializer, .. } => { + let initializer_max_gas = match *initializer { + Some(Initializer { maximum_required_gas, .. }) => maximum_required_gas, + None => 0, + }; + // total maximum gas must also include the gas used for updating the proxy before + // the the initializer is called. + 50_000 + initializer_max_gas + }, + Command::SetTokenTransferFees { .. } => 60_000, + Command::SetPricingParameters { .. } => 60_000, + } + } +} + +impl GasMeter for () { + const MAXIMUM_BASE_GAS: u64 = 1; + + fn maximum_dispatch_gas_used_at_most(_: &Command) -> u64 { + 1 + } +} + +pub const ETHER_DECIMALS: u8 = 18; diff --git a/bridges/snowbridge/parachain/primitives/core/src/pricing.rs b/bridges/snowbridge/parachain/primitives/core/src/pricing.rs new file mode 100644 index 00000000000..33aeda6d15c --- /dev/null +++ b/bridges/snowbridge/parachain/primitives/core/src/pricing.rs @@ -0,0 +1,67 @@ +use codec::{Decode, Encode, MaxEncodedLen}; +use scale_info::TypeInfo; +use sp_arithmetic::traits::{BaseArithmetic, Unsigned, Zero}; +use sp_core::U256; +use sp_runtime::{FixedU128, RuntimeDebug}; +use sp_std::prelude::*; + +#[derive(Clone, Encode, Decode, PartialEq, RuntimeDebug, MaxEncodedLen, TypeInfo)] +pub struct PricingParameters { + /// ETH/DOT exchange rate + pub exchange_rate: FixedU128, + /// Relayer rewards + pub rewards: Rewards, + /// Ether (wei) fee per gas unit + pub fee_per_gas: U256, +} + +#[derive(Clone, Encode, Decode, PartialEq, RuntimeDebug, MaxEncodedLen, TypeInfo)] +pub struct Rewards { + /// Local reward in DOT + pub local: Balance, + /// Remote reward in ETH (wei) + pub remote: U256, +} + +#[derive(RuntimeDebug)] +pub struct InvalidPricingParameters; + +impl PricingParameters +where + Balance: BaseArithmetic + Unsigned + Copy, +{ + pub fn validate(&self) -> Result<(), InvalidPricingParameters> { + if self.exchange_rate == FixedU128::zero() { + return Err(InvalidPricingParameters) + } + if self.fee_per_gas == U256::zero() { + return Err(InvalidPricingParameters) + } + if self.rewards.local.is_zero() { + return Err(InvalidPricingParameters) + } + if self.rewards.remote.is_zero() { + return Err(InvalidPricingParameters) + } + Ok(()) + } +} + +/// Holder for fixed point number implemented in +#[derive(Clone, Encode, Decode, RuntimeDebug, TypeInfo)] +#[cfg_attr(feature = "std", derive(PartialEq))] +pub struct UD60x18(U256); + +impl From for UD60x18 { + fn from(value: FixedU128) -> Self { + // Both FixedU128 and UD60x18 have 18 decimal places + let inner: u128 = value.into_inner(); + UD60x18(inner.into()) + } +} + +impl UD60x18 { + pub fn into_inner(self) -> U256 { + self.0 + } +} diff --git a/bridges/snowbridge/parachain/primitives/core/src/ringbuffer.rs b/bridges/snowbridge/parachain/primitives/core/src/ringbuffer.rs new file mode 100644 index 00000000000..dcee20359a7 --- /dev/null +++ b/bridges/snowbridge/parachain/primitives/core/src/ringbuffer.rs @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +use codec::FullCodec; +use core::{cmp::Ord, marker::PhantomData, ops::Add}; +use frame_support::storage::{types::QueryKindTrait, StorageMap, StorageValue}; +use sp_core::{Get, GetDefault}; +use sp_runtime::traits::{One, Zero}; + +/// Trait object presenting the ringbuffer interface. +pub trait RingBufferMap +where + Key: FullCodec, + Value: FullCodec, + QueryKind: QueryKindTrait, +{ + /// Insert a map entry. + fn insert(k: Key, v: Value); + + /// Check if map contains a key + fn contains_key(k: Key) -> bool; + + /// Get the value of the key + fn get(k: Key) -> QueryKind::Query; +} + +pub struct RingBufferMapImpl( + PhantomData<(Index, B, CurrentIndex, Intermediate, M, QueryKind)>, +); + +/// Ringbuffer implementation based on `RingBufferTransient` +impl + RingBufferMap + for RingBufferMapImpl +where + Key: FullCodec + Clone, + Value: FullCodec, + Index: Ord + One + Zero + Add + Copy + FullCodec + Eq, + B: Get, + CurrentIndex: StorageValue, + Intermediate: StorageMap, + M: StorageMap, + QueryKind: QueryKindTrait, +{ + /// Insert a map entry. + fn insert(k: Key, v: Value) { + let bound = B::get(); + let mut current_index = CurrentIndex::get(); + + // Adding one here as bound denotes number of items but our index starts with zero. + if (current_index + Index::one()) >= bound { + current_index = Index::zero(); + } else { + current_index = current_index + Index::one(); + } + + // Deleting earlier entry if it exists + if Intermediate::contains_key(current_index) { + let older_key = Intermediate::get(current_index); + M::remove(older_key); + } + + Intermediate::insert(current_index, k.clone()); + CurrentIndex::set(current_index); + M::insert(k, v); + } + + /// Check if map contains a key + fn contains_key(k: Key) -> bool { + M::contains_key(k) + } + + /// Get the value associated with key + fn get(k: Key) -> M::Query { + M::get(k) + } +} diff --git a/bridges/snowbridge/parachain/primitives/core/src/tests.rs b/bridges/snowbridge/parachain/primitives/core/src/tests.rs new file mode 100644 index 00000000000..725fff1a9c9 --- /dev/null +++ b/bridges/snowbridge/parachain/primitives/core/src/tests.rs @@ -0,0 +1,13 @@ +use crate::{ChannelId, ParaId}; +use hex_literal::hex; + +const EXPECT_CHANNEL_ID: [u8; 32] = + hex!("c173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539"); + +// The Solidity equivalent code is tested in Gateway.t.sol:testDeriveChannelID +#[test] +fn generate_channel_id() { + let para_id: ParaId = 1000.into(); + let channel_id: ChannelId = para_id.into(); + assert_eq!(channel_id, EXPECT_CHANNEL_ID.into()); +} diff --git a/bridges/snowbridge/parachain/primitives/core/tests/fixtures/packet.scale b/bridges/snowbridge/parachain/primitives/core/tests/fixtures/packet.scale new file mode 100644 index 0000000000000000000000000000000000000000..d5f6696ea69fffd243e7b5b8eb5cef9a7943802c GIT binary patch literal 386 zcmey$@{`eO3a|PGwn>f$OiR<|zm;Bl`pg~PD;FOw$X>r+c>lSjPtL_$Twtw|kh$jl zS?;w<-}_0i&Ng4rqdapbBLjuNfq?!6$nxj^t@@rJ)2R`gdVXI+cf(Vr%+%t(^(>-d z?ZwGzC;u(1Q~eXvo@h4tq|k&po77ghPx+MPfvlelHWvXs+^mce@x_gJwk~)F6RXwch5{*^j}NN-C3"] +edition = "2021" +license = "Apache-2.0" + +[dependencies] +serde = { version = "1.0.188", optional = true, features = ["derive"] } +serde-big-array = { version = "0.3.2", optional = true, features = ["const-generics"] } +codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } +scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } +ethbloom = { version = "0.13.0", default-features = false } +ethereum-types = { version = "0.14.1", default-features = false, features = ["codec", "rlp", "serialize"] } +hex = { package = "rustc-hex", version = "2.1.0", default-features = false } +hex-literal = { version = "0.4.1", default-features = false } +parity-bytes = { version = "0.1.2", default-features = false } +rlp = { version = "0.5.2", default-features = false } + +sp-io = { path = "../../../../../substrate/primitives/io", default-features = false } +sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } +sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } +sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-features = false } + +ethabi = { git = "https://github.com/snowfork/ethabi-decode.git", package = "ethabi-decode", branch = "master", default-features = false } + +[dev-dependencies] +wasm-bindgen-test = "0.3.19" +rand = "0.8.5" +serde_json = "1.0.96" + +[features] +default = ["std"] +expensive_tests = [] +std = [ + "codec/std", + "ethabi/std", + "ethbloom/std", + "ethereum-types/std", + "hex/std", + "parity-bytes/std", + "rlp/std", + "scale-info/std", + "serde", + "serde-big-array", + "sp-core/std", + "sp-io/std", + "sp-runtime/std", + "sp-std/std", +] diff --git a/bridges/snowbridge/parachain/primitives/ethereum/src/header.rs b/bridges/snowbridge/parachain/primitives/ethereum/src/header.rs new file mode 100644 index 00000000000..f0b51f8c79d --- /dev/null +++ b/bridges/snowbridge/parachain/primitives/ethereum/src/header.rs @@ -0,0 +1,414 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +use codec::{Decode, Encode}; +use ethbloom::Bloom as EthBloom; +use hex_literal::hex; +use parity_bytes::Bytes; +use rlp::RlpStream; +use scale_info::TypeInfo; +use sp_io::hashing::keccak_256; +use sp_runtime::RuntimeDebug; +use sp_std::{convert::TryInto, prelude::*}; + +#[cfg(feature = "std")] +use serde::{Deserialize, Serialize}; + +#[cfg(feature = "std")] +use serde_big_array::BigArray; + +use ethereum_types::{Address, H256, H64, U256}; + +use crate::{mpt, receipt}; + +/// Complete block header id. +#[derive(Clone, Copy, Default, Encode, Decode, PartialEq, RuntimeDebug, TypeInfo)] +pub struct HeaderId { + /// Header number. + pub number: u64, + /// Header hash. + pub hash: H256, +} + +const EMPTY_OMMERS_HASH: [u8; 32] = + hex!("1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"); + +/// An Ethereum block header. +#[derive(Clone, Default, Encode, Decode, PartialEq, RuntimeDebug, TypeInfo)] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +pub struct Header { + /// Parent block hash. + pub parent_hash: H256, + /// Block timestamp. + pub timestamp: u64, + /// Block number. + pub number: u64, + /// Block author. + pub author: Address, + + /// Transactions root. + pub transactions_root: H256, + /// Block ommers hash. + pub ommers_hash: H256, + /// Block extra data. + pub extra_data: Bytes, + + /// State root. + pub state_root: H256, + /// Block receipts root. + pub receipts_root: H256, + /// Block bloom. + pub logs_bloom: Bloom, + /// Gas used for contracts execution. + pub gas_used: U256, + /// Block gas limit. + pub gas_limit: U256, + + /// Block difficulty. + pub difficulty: U256, + /// Vector of post-RLP-encoded fields. + pub seal: Vec, + + // Base fee per gas (EIP-1559), only in headers from the London hardfork onwards. + pub base_fee: Option, +} + +impl Header { + /// Compute hash of this header (keccak of the RLP with seal). + pub fn compute_hash(&self) -> H256 { + keccak_256(&self.rlp(true)).into() + } + + /// Compute hash of the truncated header i.e. excluding seal. + pub fn compute_partial_hash(&self) -> H256 { + keccak_256(&self.rlp(false)).into() + } + + pub fn check_receipt_proof( + &self, + proof: &[Vec], + ) -> Option> { + match self.apply_merkle_proof(proof) { + Some((root, data)) if root == self.receipts_root => Some(rlp::decode(&data)), + Some((_, _)) => None, + None => None, + } + } + + pub fn apply_merkle_proof(&self, proof: &[Vec]) -> Option<(H256, Vec)> { + let mut iter = proof.iter().rev(); + let first_bytes = match iter.next() { + Some(b) => b, + None => return None, + }; + let item_to_prove: mpt::ShortNode = rlp::decode(first_bytes).ok()?; + + let final_hash: Option<[u8; 32]> = iter.try_fold(keccak_256(first_bytes), |acc, x| { + let node: Box = x.as_slice().try_into().ok()?; + if (*node).contains_hash(acc.into()) { + return Some(keccak_256(x)) + } + None + }); + + final_hash.map(|hash| (hash.into(), item_to_prove.value)) + } + + pub fn mix_hash(&self) -> Option { + let bytes: Bytes = self.decoded_seal_field(0, 32)?; + let size = bytes.len(); + let mut mix_hash = [0u8; 32]; + for i in 0..size { + mix_hash[31 - i] = bytes[size - 1 - i]; + } + Some(mix_hash.into()) + } + + pub fn nonce(&self) -> Option { + let bytes: Bytes = self.decoded_seal_field(1, 8)?; + let size = bytes.len(); + let mut nonce = [0u8; 8]; + for i in 0..size { + nonce[7 - i] = bytes[size - 1 - i]; + } + Some(nonce.into()) + } + + pub fn has_ommers(&self) -> bool { + self.ommers_hash != EMPTY_OMMERS_HASH.into() + } + + fn decoded_seal_field(&self, index: usize, max_len: usize) -> Option { + let bytes: Bytes = rlp::decode(self.seal.get(index)?).ok()?; + if bytes.len() > max_len { + return None + } + Some(bytes) + } + + /// Returns header RLP with or without seals. + /// For EIP-1559 baseFee addition refer to: + /// + fn rlp(&self, with_seal: bool) -> Bytes { + let mut s = RlpStream::new(); + + let stream_length_without_seal = if self.base_fee.is_some() { 14 } else { 13 }; + + if with_seal { + s.begin_list(stream_length_without_seal + self.seal.len()); + } else { + s.begin_list(stream_length_without_seal); + } + + s.append(&self.parent_hash); + s.append(&self.ommers_hash); + s.append(&self.author); + s.append(&self.state_root); + s.append(&self.transactions_root); + s.append(&self.receipts_root); + s.append(&EthBloom::from(self.logs_bloom.0)); + s.append(&self.difficulty); + s.append(&self.number); + s.append(&self.gas_limit); + s.append(&self.gas_used); + s.append(&self.timestamp); + s.append(&self.extra_data); + + if with_seal { + for b in &self.seal { + s.append_raw(b, 1); + } + } + + if let Some(base_fee) = self.base_fee { + s.append(&base_fee); + } + + s.out().to_vec() + } +} + +/// Logs bloom. +#[derive(Clone, Debug, Encode, Decode, TypeInfo)] +#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +pub struct Bloom(#[cfg_attr(feature = "std", serde(with = "BigArray"))] [u8; 256]); + +impl<'a> From<&'a [u8; 256]> for Bloom { + fn from(buffer: &'a [u8; 256]) -> Bloom { + Bloom(*buffer) + } +} + +impl PartialEq for Bloom { + fn eq(&self, other: &Bloom) -> bool { + self.0.iter().zip(other.0.iter()).all(|(l, r)| l == r) + } +} + +impl Default for Bloom { + fn default() -> Self { + Bloom([0; 256]) + } +} + +impl rlp::Decodable for Bloom { + fn decode(rlp: &rlp::Rlp) -> Result { + let v: Vec = rlp.as_val()?; + match v.len() { + 256 => { + let mut bytes = [0u8; 256]; + bytes.copy_from_slice(&v); + Ok(Self(bytes)) + }, + _ => Err(rlp::DecoderError::Custom("Expected 256 bytes")), + } + } +} + +#[cfg(test)] +mod tests { + + use super::*; + + #[test] + fn bloom_decode_rlp() { + let raw_bloom = hex!( + " + b901000420000000000000000000008002000000000001000000000001000000000000000000 + 0000000000000000000000000002000000080000000000000000200000000000000000000000 + 0000080000002200000000004000100000000000000000000000000000000000000000000000 + 0000000000000004000000001000010000000000080000000000400000000000000000000000 + 0000080000004000000000020000000000020000000000000000000000000000000000000000 + 0000040000000000020000000001000000000000000000000000000010000000020000200000 + 10200000000000010000000000000000000000000000000000000010000000 + " + ); + let expected_bytes = &raw_bloom[3..]; + let bloom: Bloom = rlp::decode(&raw_bloom).unwrap(); + assert_eq!(bloom.0, expected_bytes); + } + + #[test] + fn header_compute_hash_poa() { + // PoA header + let header = Header { + parent_hash: Default::default(), + timestamp: 0, + number: 0, + author: Default::default(), + transactions_root: hex!( + "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421" + ) + .into(), + ommers_hash: hex!("1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347") + .into(), + extra_data: vec![], + state_root: hex!("eccf6b74c2bcbe115c71116a23fe963c54406010c244d9650526028ad3e32cce") + .into(), + receipts_root: hex!("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421") + .into(), + logs_bloom: Default::default(), + gas_used: Default::default(), + gas_limit: 0x222222.into(), + difficulty: 0x20000.into(), + seal: vec![vec![0x80], { + let mut vec = vec![0xb8, 0x41]; + vec.resize(67, 0); + vec + }], + base_fee: None, + }; + assert_eq!( + header.compute_hash().as_bytes(), + hex!("9ff57c7fa155853586382022f0982b71c51fa313a0942f8c456300896643e890"), + ); + } + + #[test] + fn header_compute_hash_pow() { + // + let nonce = hex!("6935bbe7b63c4f8e").to_vec(); + let mix_hash = + hex!("be3adfb0087be62b28b716e2cdf3c79329df5caa04c9eee035d35b5d52102815").to_vec(); + let header = Header { + parent_hash: hex!("bede0bddd6f32c895fc505ffe0c39d9bde58e9a5272f31a3dee448b796edcbe3") + .into(), + timestamp: 1603160977, + number: 11090290, + author: hex!("ea674fdde714fd979de3edf0f56aa9716b898ec8").into(), + transactions_root: hex!( + "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421" + ) + .into(), + ommers_hash: hex!("1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347") + .into(), + extra_data: hex!("65746865726d696e652d61736961312d33").to_vec(), + state_root: hex!("7dcb8aca872b712bad81df34a89d4efedc293566ffc3eeeb5cbcafcc703e42c9") + .into(), + receipts_root: hex!("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421") + .into(), + logs_bloom: Default::default(), + gas_used: 0.into(), + gas_limit: 0xbe8c19.into(), + difficulty: 0xbc140caa61087i64.into(), + seal: vec![rlp::encode(&mix_hash).to_vec(), rlp::encode(&nonce).to_vec()], + base_fee: None, + }; + assert_eq!( + header.compute_hash().as_bytes(), + hex!("0f9bdc91c2e0140acb873330742bda8c8181fa3add91fe7ae046251679cedef7"), + ); + } + + #[test] + fn header_pow_seal_fields_extracted_correctly() { + let nonce: H64 = hex!("6935bbe7b63c4f8e").into(); + let mix_hash: H256 = + hex!("be3adfb0087be62b28b716e2cdf3c79329df5caa04c9eee035d35b5d52102815").into(); + let header = Header { + seal: vec![ + rlp::encode(&mix_hash.0.to_vec()).to_vec(), + rlp::encode(&nonce.0.to_vec()).to_vec(), + ], + ..Default::default() + }; + + assert_eq!(header.nonce().unwrap(), nonce); + assert_eq!(header.mix_hash().unwrap(), mix_hash); + } + + #[test] + fn header_pow_seal_fields_return_none_for_invalid_values() { + let nonce = hex!("696935bbe7b63c4f8e").to_vec(); + let mix_hash = + hex!("bebe3adfb0087be62b28b716e2cdf3c79329df5caa04c9eee035d35b5d52102815").to_vec(); + let mut header = Header { + seal: vec![rlp::encode(&mix_hash).to_vec(), rlp::encode(&nonce).to_vec()], + ..Default::default() + }; + assert_eq!(header.nonce(), None); + assert_eq!(header.mix_hash(), None); + + header.seal = Vec::new(); + assert_eq!(header.nonce(), None); + assert_eq!(header.mix_hash(), None); + } + + #[test] + fn header_check_receipt_proof() { + let header = Header { + receipts_root: hex!("fd5e397a84884641f53c496804f24b5276cbb8c5c9cfc2342246be8e3ce5ad02") + .into(), + ..Default::default() + }; + + // Valid proof + let proof_receipt5 = vec!( + hex!("f90131a0b5ba404eb5a6a88e56579f4d37ef9813b5ad7f86f0823ff3b407ac5a6bb465eca0398ead2655e78e03c127ce22c5830e90f18b1601ec055f938336c084feb915a9a026d322c26e46c50942c1aabde50e36df5cde572aed650ce73ea3182c6e90a02ca00600a356135f4db1db0d9842264cdff2652676f881669e91e316c0b6dd783011a0837f1deb4075336da320388c1edfffc56c448a43f4a5ba031300d32a7b509fc5a01c3ac82fd65b4aba7f9afaf604d9c82ec7e2deb573a091ae235751bc5c0c288da05d454159d9071b0f68b6e0503d290f23ac7602c1db0c569dee4605d8f5298f09a00bbed10350ec954448df795f6fd46e3faefc800ede061b3840eedc6e2b07a74da0acb02d26a3650f2064c14a435fdf1f668d8655daf455ebdf671713a7c089b3898080808080808080").to_vec(), + hex!("f901f180a00046a08d4f0bdbdc6b31903086ce323182bce6725e7d9415f7ff91ee8f4820bda0e7cd26ad5f3d2771e4b5ab788e268a14a10209f94ee918eb6c829d21d3d11c1da00d4a56d9e9a6751874fd86c7e3cb1c6ad5a848da62751325f478978a00ea966ea064b81920c8f04a8a1e21f53a8280e739fbb7b00b2ab92493ca3f610b70e8ac85a0b1040ed4c55a73178b76abb16f946ce5bebd6b93ab873c83327df54047d12c27a0de6485e9ac58dc6e2b04b4bb38f562684f0b1a2ee586cc11079e7d9a9dc40b32a0d394f4d3532c3124a65fa36e69147e04fd20453a72ee9c50660f17e13ce9df48a066501003fc3e3478efd2803cd0eded6bbe9243ca01ba754d6327071ddbcbc649a0b2684e518f325fee39fc8ea81b68f3f5c785be00d087f3bed8857ae2ee8da26ea071060a5c52042e8d7ce21092f8ecf06053beb9a0b773a6f91a30c4220aa276b2a0fc22436632574ccf6043d0986dede27ea94c9ca9a3bb5ec03ce776a4ddef24a9a05a8a1d6698c4e7d8cc3a2506cb9b12ea9a079c9c7099bc919dc804033cc556e4a0170c468b0716fd36d161f0bf05875f15756a2976de92f9efe7716320509d79c9a0182f909a90cab169f3efb62387f9cccdd61440acc4deec42f68a4f7ca58075c7a055cf0e9202ac75689b76318f1171f3a44465eddc06aae0713bfb6b34fdd27b7980").to_vec(), + hex!("f904de20b904daf904d701830652f0b9010004200000000000000000000080020000000000010000000000010000000000000000000000000000000000000000000002000000080000000000000000200000000000000000000000000008000000220000000000400010000000000000000000000000000000000000000000000000000000000000040000000010000100000000000800000000004000000000000000000000000000080000004000000000020000000000020000000000000000000000000000000000000000000004000000000002000000000100000000000000000000000000001000000002000020000010200000000000010000000000000000000000000000000000000010000000f903ccf89b9421130f34829b4c343142047a28ce96ec07814b15f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000007d843005c7433c16b27ff939cb37471541561ebda0000000000000000000000000e9c1281aae66801fa35ec404d5f2aea393ff6988a000000000000000000000000000000000000000000000000000000005d09b7380f89b9421130f34829b4c343142047a28ce96ec07814b15f863a08c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a00000000000000000000000007d843005c7433c16b27ff939cb37471541561ebda00000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488da0ffffffffffffffffffffffffffffffffffffffffffffffffffffffcc840c6920f89b94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000e9c1281aae66801fa35ec404d5f2aea393ff6988a00000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488da000000000000000000000000000000000000000000000000003e973b5a5d1078ef87994e9c1281aae66801fa35ec404d5f2aea393ff6988e1a01c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1b840000000000000000000000000000000000000000000000000000001f1420ad1d40000000000000000000000000000000000000000000000014ad400879d159a38f8fc94e9c1281aae66801fa35ec404d5f2aea393ff6988f863a0d78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822a00000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488da00000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488db88000000000000000000000000000000000000000000000000000000005d415f3320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e973b5a5d1078ef87a94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f842a07fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65a00000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488da000000000000000000000000000000000000000000000000003e973b5a5d1078e").to_vec(), + ); + assert!(header.check_receipt_proof(&proof_receipt5).is_some()); + + // Various invalid proofs + let proof_empty: Vec> = vec![]; + let proof_missing_full_node = vec![proof_receipt5[0].clone(), proof_receipt5[2].clone()]; + let proof_missing_short_node1 = vec![proof_receipt5[0].clone(), proof_receipt5[1].clone()]; + let proof_missing_short_node2 = vec![proof_receipt5[0].clone()]; + let proof_invalid_encoding = vec![proof_receipt5[2][2..].to_vec()]; + let proof_no_full_node = vec![proof_receipt5[2].clone(), proof_receipt5[2].clone()]; + assert!(header.check_receipt_proof(&proof_empty).is_none()); + assert!(header.check_receipt_proof(&proof_missing_full_node).is_none()); + + assert_eq!( + header.check_receipt_proof(&proof_missing_short_node1), + Some(Err(rlp::DecoderError::Custom("Unsupported receipt type"))) + ); + + assert_eq!( + header.check_receipt_proof(&proof_missing_short_node2), + Some(Err(rlp::DecoderError::Custom("Unsupported receipt type"))) + ); + + assert!(header.check_receipt_proof(&proof_invalid_encoding).is_none()); + assert!(header.check_receipt_proof(&proof_no_full_node).is_none()); + } + + #[test] + fn header_check_receipt_proof_with_intermediate_short_node() { + let header = Header { + receipts_root: hex!("d128e3a57142d2bf15bc0cbcac7ad54f40750d571b5c3097e425882c10c9ba66") + .into(), + ..Default::default() + }; + + let proof_receipt263 = vec![ + hex!("f90131a00d3cb8d3f57ac1c0e12918a2ebe0cafed8c273577b9dd73e7ed1079b403ef494a0678b9835b834f8a287c0dd33a8fca9146e456ca688555ed4ec1361a2180b778da0fe42da181a46677a043b3d9d4b8bb05a6a17b7b5c010c17e7c1d31cfb7c4f911a0c89f0e2c53241cdb578e1f2b4caf6ba36e00500bdc57fecd66b84a6a58394c19a086c3c1fae5a0575940b5d38e111c469d07883106c26856f3ef608469a2081f13a06c5992ff00aab6226a70a032fd2f571ba22f797321f45e2daa73020d638d21b0a050861e9503ef68728f6c90a44f7fe1bceb2a9bdab6957bbe7136166bd849561ea006aa6eaca8a07e57176e9aa41e6a09edfb7678d1a112404e0ec779d7e567e82ea0bb0b430d303ba21b0af11c487b8a218bd75db54c98940b3f11bad8ff47cad3ef8080808080808080").to_vec(), + hex!("f871a0246de222036ee6a03329b0105da0a6b3f916fc95a9ed5a403a581a0c4d74242ca0ac108a49a88b57a05ac34a108b39f1e45f6f167f2b9fbc8d52fb58e2e5a6af1ea0fcfe07ac2ccd3c28b6eab68d1bce112f6f6dbd9023e4ec3c05b96615aa803d798080808080808080808080808080").to_vec(), + hex!("e4820001a04fff54398cad4d05ea6abfd8b0f3b4fe14c04d7ff5f5211c5b927d9cf72ac1d8").to_vec(), + hex!("f851a096d010643ca2d47412ca66898286b5f2412963b9ec051b33e570d575914c9c5ca028cd24c652989542fe89479ec6388eac4592432242af5ba97563b3ac7c71c019808080808080808080808080808080").to_vec(), + hex!("f90211a0bb35a84c5b1dcb78ec9d32614912c696e62df77bebf9ab326ee55b5d3acdde46a01084b30dac8df0accfcd0fd6330b7f6fc72a4651246d0694be9162151686a620a03eed50afdce7909d784c6157c445a444c806b5f23d31f3b63786f600c84a95b2a0af5232f1df6c6d41879804d081abe867002abe26ba3e5f8e0254a83a54769831a0607915fb13dd5da594256389a45007a67a7f7a86e95d38d8462792b6c98a722ea00e1260fda1730f2738c650ce2bfba83857bc10f8fb119ebc4fb39acba24e6fbaa0d11de17e417327457812675ca3b84ae8e1b64827abfe01420953697c8313d5b1a05fcaf2f7a88f76336a0c32ffc78acb87ae2005454bd25d658035331be3173b46a03f94f4952ab9e650f83cfd0e7f367b1bcc493aacf39a06f16c4a2e1b5605da48a0bdb4ec79785ca8ae22d60f1bbd42d707b4d7ec4aff231a3ebab755e315b35053a043a67c3f2bcef37c8f47a673adcb7061007a553696d1092408601c11b2e6846aa0c519d5af48cae87c7f4538845417c9735813bee892a6fe2dda79f5c414e8576aa0f7058256e09589501d7c231d739e61c84a850e139690989d24fda6058b432e98a081a52faab520978cb19ce14400dba0cd5bcdc4e5a3c0740678aa8f97ee0e5c56a0bcecc61cadeae52518e3b68a48af4b11603dfd9d99d99d7985efa6d2de44f904a02cba4accfc6f39bc5adb6d4440eb6358b4a5103ef93298e4e694f1f940f8b48280").to_vec(), + hex!("f901ae20b901aaf901a70183bb444eb9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000001000000000000000000000000000100000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000010000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000080000000000000000000000000000000000000000000000002000000000000000000081000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000f89df89b94dac17f958d2ee523a2206206994597c13d831ec7f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000002e514404ff6823f1b46a8318a709251db414e5e1a000000000000000000000000055021c55847c00d764357a352e5803237d328954a0000000000000000000000000000000000000000000000000000000000201c370").to_vec(), + ]; + assert!(header.check_receipt_proof(&proof_receipt263).is_some()); + } +} diff --git a/bridges/snowbridge/parachain/primitives/ethereum/src/lib.rs b/bridges/snowbridge/parachain/primitives/ethereum/src/lib.rs new file mode 100644 index 00000000000..1a10ea9abb7 --- /dev/null +++ b/bridges/snowbridge/parachain/primitives/ethereum/src/lib.rs @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +#![cfg_attr(not(feature = "std"), no_std)] + +pub mod header; +pub mod log; +pub mod mpt; +pub mod receipt; + +pub use ethereum_types::{Address, H160, H256, H64, U256}; + +pub use header::{Bloom, Header, HeaderId}; +pub use log::Log; +pub use receipt::Receipt; + +#[derive(Debug)] +pub enum DecodeError { + // Unexpected RLP data + InvalidRLP(rlp::DecoderError), + // Data does not match expected ABI + InvalidABI(ethabi::Error), + // Invalid message payload + InvalidPayload, +} + +impl From for DecodeError { + fn from(err: rlp::DecoderError) -> Self { + DecodeError::InvalidRLP(err) + } +} + +impl From for DecodeError { + fn from(err: ethabi::Error) -> Self { + DecodeError::InvalidABI(err) + } +} diff --git a/bridges/snowbridge/parachain/primitives/ethereum/src/log.rs b/bridges/snowbridge/parachain/primitives/ethereum/src/log.rs new file mode 100644 index 00000000000..7b8e35bb113 --- /dev/null +++ b/bridges/snowbridge/parachain/primitives/ethereum/src/log.rs @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +use codec::{Decode, Encode}; +use ethereum_types::{H160, H256}; +use sp_std::prelude::*; + +#[derive(Clone, Debug, Encode, Decode, PartialEq, Eq)] +pub struct Log { + pub address: H160, + pub topics: Vec, + pub data: Vec, +} + +impl rlp::Decodable for Log { + /// We need to implement rlp::Decodable manually as the derive macro RlpDecodable + /// didn't seem to generate the correct code for parsing our logs. + fn decode(rlp: &rlp::Rlp) -> Result { + let mut iter = rlp.iter(); + + let address: H160 = match iter.next() { + Some(data) => data.as_val()?, + None => return Err(rlp::DecoderError::Custom("Expected log address")), + }; + + let topics: Vec = match iter.next() { + Some(data) => data.as_list()?, + None => return Err(rlp::DecoderError::Custom("Expected log topics")), + }; + + let data: Vec = match iter.next() { + Some(data) => data.data()?.to_vec(), + None => return Err(rlp::DecoderError::Custom("Expected log data")), + }; + + Ok(Self { address, topics, data }) + } +} + +#[cfg(test)] +mod tests { + + use super::Log; + use hex_literal::hex; + + const RAW_LOG: [u8; 605] = hex!( + " + f9025a941cfd66659d44cfe2e627c5742ba7477a3284cffae1a0266413be5700ce8dd5ac6b9a7dfb + abe99b3e45cae9a68ac2757858710b401a38b9022000000000000000000000000000000000000000 + 00000000000000000000000060000000000000000000000000000000000000000000000000000000 + 00000000c00000000000000000000000000000000000000000000000000000000000000100000000 + 00000000000000000000000000000000000000000000000000000000283163466436363635394434 + 34636665324536323763353734324261373437376133323834634666410000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000000000000000000000000 + 000000000773656e6445544800000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000001000000000000000000000000 + 00cffeaaf7681c89285d65cfbe808b80e50269657300000000000000000000000000000000000000 + 000000000000000000000000a0000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000000000000a000000 + 00000000000000000000000000000000000000000000000000000000020000000000000000000000 + 00000000000000000000000000000000000000002f3146524d4d3850456957585961783772705336 + 5834585a5831614141785357783143724b5479725659685632346667000000000000000000000000 + 0000000000 + " + ); + + #[test] + fn decode_log() { + let log: Log = rlp::decode(&RAW_LOG).unwrap(); + assert_eq!(log.address.as_bytes(), hex!["1cfd66659d44cfe2e627c5742ba7477a3284cffa"]); + assert_eq!( + log.topics[0].as_bytes(), + hex!["266413be5700ce8dd5ac6b9a7dfbabe99b3e45cae9a68ac2757858710b401a38"] + ); + } +} diff --git a/bridges/snowbridge/parachain/primitives/ethereum/src/mpt.rs b/bridges/snowbridge/parachain/primitives/ethereum/src/mpt.rs new file mode 100644 index 00000000000..9a2dae486dc --- /dev/null +++ b/bridges/snowbridge/parachain/primitives/ethereum/src/mpt.rs @@ -0,0 +1,142 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +//! Helper types to work with Ethereum's Merkle Patricia Trie nodes + +use ethereum_types::H256; +use sp_std::{convert::TryFrom, prelude::*}; + +pub trait Node { + fn contains_hash(&self, hash: H256) -> bool; +} + +impl TryFrom<&[u8]> for Box { + type Error = rlp::DecoderError; + + fn try_from(bytes: &[u8]) -> Result, Self::Error> { + let rlp = rlp::Rlp::new(bytes); + match rlp.item_count()? { + 2 => { + let node: ShortNode = rlp.as_val()?; + Ok(Box::new(node)) + }, + 17 => { + let node: FullNode = rlp.as_val()?; + Ok(Box::new(node)) + }, + _ => Err(rlp::DecoderError::Custom("Invalid number of list elements")), + } + } +} + +/// Intermediate trie node with children (refers to node with same name in Geth). +/// This struct only handles the proof representation, i.e. a child is either empty +/// or a 32-byte hash of its subtree. +pub struct FullNode { + pub children: Vec>, +} + +impl rlp::Decodable for FullNode { + fn decode(rlp: &rlp::Rlp) -> Result { + let children: Vec> = rlp + .iter() + .map(|item| { + let v: Vec = item.as_val()?; + match v.len() { + 0 => Ok(None), + 32 => { + let mut bytes = [0u8; 32]; + bytes.copy_from_slice(&v); + Ok(Some(bytes.into())) + }, + _ => Err(rlp::DecoderError::Custom("Expected 32-byte hash or empty child")), + } + }) + .collect::>()?; + + Ok(Self { children }) + } +} + +impl Node for FullNode { + fn contains_hash(&self, hash: H256) -> bool { + self.children.iter().any(|h| Some(hash) == *h) + } +} + +/// Trie node where `value` is either the RLP-encoded item we're +/// proving or an intermediate hash (refers to node with same name in Geth) +/// Proof verification should return `value`. `key` is an implementation +/// detail of the trie. +pub struct ShortNode { + pub key: Vec, + pub value: Vec, +} + +impl rlp::Decodable for ShortNode { + fn decode(rlp: &rlp::Rlp) -> Result { + let mut iter = rlp.iter(); + + let key: Vec = match iter.next() { + Some(data) => data.as_val()?, + None => return Err(rlp::DecoderError::Custom("Expected key bytes")), + }; + + let value: Vec = match iter.next() { + Some(data) => data.as_val()?, + None => return Err(rlp::DecoderError::Custom("Expected value bytes")), + }; + + Ok(Self { key, value }) + } +} + +impl Node for ShortNode { + fn contains_hash(&self, hash: H256) -> bool { + self.value == hash.0 + } +} + +#[cfg(test)] +mod tests { + + use super::*; + use hex_literal::hex; + + const RAW_PROOF: [&[u8]; 3] = [ + &hex!("f90131a0b5ba404eb5a6a88e56579f4d37ef9813b5ad7f86f0823ff3b407ac5a6bb465eca0398ead2655e78e03c127ce22c5830e90f18b1601ec055f938336c084feb915a9a026d322c26e46c50942c1aabde50e36df5cde572aed650ce73ea3182c6e90a02ca00600a356135f4db1db0d9842264cdff2652676f881669e91e316c0b6dd783011a0837f1deb4075336da320388c1edfffc56c448a43f4a5ba031300d32a7b509fc5a01c3ac82fd65b4aba7f9afaf604d9c82ec7e2deb573a091ae235751bc5c0c288da05d454159d9071b0f68b6e0503d290f23ac7602c1db0c569dee4605d8f5298f09a00bbed10350ec954448df795f6fd46e3faefc800ede061b3840eedc6e2b07a74da0acb02d26a3650f2064c14a435fdf1f668d8655daf455ebdf671713a7c089b3898080808080808080"), + &hex!("f901f180a00046a08d4f0bdbdc6b31903086ce323182bce6725e7d9415f7ff91ee8f4820bda0e7cd26ad5f3d2771e4b5ab788e268a14a10209f94ee918eb6c829d21d3d11c1da00d4a56d9e9a6751874fd86c7e3cb1c6ad5a848da62751325f478978a00ea966ea064b81920c8f04a8a1e21f53a8280e739fbb7b00b2ab92493ca3f610b70e8ac85a0b1040ed4c55a73178b76abb16f946ce5bebd6b93ab873c83327df54047d12c27a0de6485e9ac58dc6e2b04b4bb38f562684f0b1a2ee586cc11079e7d9a9dc40b32a0d394f4d3532c3124a65fa36e69147e04fd20453a72ee9c50660f17e13ce9df48a066501003fc3e3478efd2803cd0eded6bbe9243ca01ba754d6327071ddbcbc649a0b2684e518f325fee39fc8ea81b68f3f5c785be00d087f3bed8857ae2ee8da26ea071060a5c52042e8d7ce21092f8ecf06053beb9a0b773a6f91a30c4220aa276b2a0fc22436632574ccf6043d0986dede27ea94c9ca9a3bb5ec03ce776a4ddef24a9a05a8a1d6698c4e7d8cc3a2506cb9b12ea9a079c9c7099bc919dc804033cc556e4a0170c468b0716fd36d161f0bf05875f15756a2976de92f9efe7716320509d79c9a0182f909a90cab169f3efb62387f9cccdd61440acc4deec42f68a4f7ca58075c7a055cf0e9202ac75689b76318f1171f3a44465eddc06aae0713bfb6b34fdd27b7980"), + &hex!("f904de20b904daf904d701830652f0b9010004200000000000000000000080020000000000010000000000010000000000000000000000000000000000000000000002000000080000000000000000200000000000000000000000000008000000220000000000400010000000000000000000000000000000000000000000000000000000000000040000000010000100000000000800000000004000000000000000000000000000080000004000000000020000000000020000000000000000000000000000000000000000000004000000000002000000000100000000000000000000000000001000000002000020000010200000000000010000000000000000000000000000000000000010000000f903ccf89b9421130f34829b4c343142047a28ce96ec07814b15f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000007d843005c7433c16b27ff939cb37471541561ebda0000000000000000000000000e9c1281aae66801fa35ec404d5f2aea393ff6988a000000000000000000000000000000000000000000000000000000005d09b7380f89b9421130f34829b4c343142047a28ce96ec07814b15f863a08c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a00000000000000000000000007d843005c7433c16b27ff939cb37471541561ebda00000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488da0ffffffffffffffffffffffffffffffffffffffffffffffffffffffcc840c6920f89b94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000e9c1281aae66801fa35ec404d5f2aea393ff6988a00000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488da000000000000000000000000000000000000000000000000003e973b5a5d1078ef87994e9c1281aae66801fa35ec404d5f2aea393ff6988e1a01c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1b840000000000000000000000000000000000000000000000000000001f1420ad1d40000000000000000000000000000000000000000000000014ad400879d159a38f8fc94e9c1281aae66801fa35ec404d5f2aea393ff6988f863a0d78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822a00000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488da00000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488db88000000000000000000000000000000000000000000000000000000005d415f3320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e973b5a5d1078ef87a94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f842a07fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65a00000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488da000000000000000000000000000000000000000000000000003e973b5a5d1078e"), + ]; + + #[test] + fn decode_full_node() { + let node1: FullNode = rlp::decode(RAW_PROOF[0]).unwrap(); + let node2: FullNode = rlp::decode(RAW_PROOF[1]).unwrap(); + assert_eq!(node1.children.len(), 17); + assert_eq!(node2.children.len(), 17); + assert_eq!(node1.children.iter().filter(|c| c.is_none()).count(), 8); + assert_eq!(node2.children.iter().filter(|c| c.is_none()).count(), 2); + + let result: Result = rlp::decode(RAW_PROOF[2]); + assert!(result.is_err()); + } + + #[test] + fn decode_short_node() { + // key + item value + let node: ShortNode = rlp::decode(RAW_PROOF[2]).unwrap(); + assert_eq!(node.key, vec![32]); + assert!(!node.value.is_empty()); + + // key + item hash + let node: ShortNode = rlp::decode(&hex!( + "e4820001a04fff54398cad4d05ea6abfd8b0f3b4fe14c04d7ff5f5211c5b927d9cf72ac1d8" + )) + .unwrap(); + assert_eq!(node.key, vec![0, 1]); + assert_eq!( + node.value, + hex!("4fff54398cad4d05ea6abfd8b0f3b4fe14c04d7ff5f5211c5b927d9cf72ac1d8").to_vec() + ); + } +} diff --git a/bridges/snowbridge/parachain/primitives/ethereum/src/receipt.rs b/bridges/snowbridge/parachain/primitives/ethereum/src/receipt.rs new file mode 100644 index 00000000000..665a93dbb1e --- /dev/null +++ b/bridges/snowbridge/parachain/primitives/ethereum/src/receipt.rs @@ -0,0 +1,139 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +use crate::{Bloom, Log}; +use codec::{Decode, Encode}; +use sp_runtime::RuntimeDebug; +use sp_std::prelude::*; + +#[derive(Clone, Default, Encode, Decode, PartialEq, RuntimeDebug)] +pub struct Receipt { + pub post_state_or_status: Vec, + pub cumulative_gas_used: u64, + pub bloom: Bloom, + pub logs: Vec, +} + +impl Receipt { + pub fn contains_log(&self, log: &Log) -> bool { + self.logs.iter().any(|l| l == log) + } + + fn decode_list(rlp: &rlp::Rlp) -> Result { + let mut iter = rlp.iter(); + + let post_state_or_status: Vec = match iter.next() { + Some(data) => data.as_val()?, + None => return Err(rlp::DecoderError::Custom("Expected receipt post state or status")), + }; + + let cumulative_gas_used: u64 = match iter.next() { + Some(data) => data.as_val()?, + None => return Err(rlp::DecoderError::Custom("Expected receipt cumulative gas used")), + }; + + let bloom: Bloom = match iter.next() { + Some(data) => data.as_val()?, + None => return Err(rlp::DecoderError::Custom("Expected receipt bloom")), + }; + + let logs: Vec = match iter.next() { + Some(data) => data.as_list()?, + None => return Err(rlp::DecoderError::Custom("Expected receipt logs")), + }; + + Ok(Self { post_state_or_status, cumulative_gas_used, bloom, logs }) + } +} + +impl rlp::Decodable for Receipt { + fn decode(rlp: &rlp::Rlp) -> Result { + if rlp.is_data() { + // Typed receipt + let data = rlp.as_raw(); + match data[0] { + // 1 = EIP-2930, 2 = EIP-1559 + 1 | 2 => { + let receipt_rlp = &rlp::Rlp::new(&data[1..]); + if !receipt_rlp.is_list() { + return Err(rlp::DecoderError::RlpExpectedToBeList) + } + Self::decode_list(&rlp::Rlp::new(&data[1..])) + }, + _ => Err(rlp::DecoderError::Custom("Unsupported receipt type")), + } + } else if rlp.is_list() { + // Legacy receipt + Self::decode_list(rlp) + } else { + Err(rlp::DecoderError::RlpExpectedToBeList) + } + } +} + +#[cfg(test)] +mod tests { + + use super::Receipt; + use hex_literal::hex; + + const RAW_RECEIPT: [u8; 1242] = hex!( + " + f904d701830652f0b901000420000000000000000000008002000000000001000000000001000000 + 00000000000000000000000000000000000000020000000800000000000000002000000000000000 + 00000000000008000000220000000000400010000000000000000000000000000000000000000000 + 00000000000000000004000000001000010000000000080000000000400000000000000000000000 + 00000800000040000000000200000000000200000000000000000000000000000000000000000000 + 04000000000002000000000100000000000000000000000000001000000002000020000010200000 + 000000010000000000000000000000000000000000000010000000f903ccf89b9421130f34829b4c + 343142047a28ce96ec07814b15f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a116 + 28f55a4df523b3efa00000000000000000000000007d843005c7433c16b27ff939cb37471541561e + bda0000000000000000000000000e9c1281aae66801fa35ec404d5f2aea393ff6988a00000000000 + 0000000000000000000000000000000000000000000005d09b7380f89b9421130f34829b4c343142 + 047a28ce96ec07814b15f863a08c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200a + c8c7c3b925a00000000000000000000000007d843005c7433c16b27ff939cb37471541561ebda000 + 00000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488da0ffffffffffffffff + ffffffffffffffffffffffffffffffffffffffcc840c6920f89b94c02aaa39b223fe8d0a0e5c4f27 + ead9083c756cc2f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523 + b3efa0000000000000000000000000e9c1281aae66801fa35ec404d5f2aea393ff6988a000000000 + 00000000000000007a250d5630b4cf539739df2c5dacb4c659f2488da00000000000000000000000 + 0000000000000000000000000003e973b5a5d1078ef87994e9c1281aae66801fa35ec404d5f2aea3 + 93ff6988e1a01c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1b840 + 000000000000000000000000000000000000000000000000000001f1420ad1d40000000000000000 + 000000000000000000000000000000014ad400879d159a38f8fc94e9c1281aae66801fa35ec404d5 + f2aea393ff6988f863a0d78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159 + d822a00000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488da000000000 + 00000000000000007a250d5630b4cf539739df2c5dacb4c659f2488db88000000000000000000000 + 000000000000000000000000000000000005d415f332000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000003e973b5a5d1078ef87a + 94c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2f842a07fcf532c15f0a6db0bd6d0e038bea71d + 30d808c7d98cb3bf7268a95bf5081b65a00000000000000000000000007a250d5630b4cf539739df + 2c5dacb4c659f2488da000000000000000000000000000000000000000000000000003e973b5a5d1 + 078e + " + ); + + #[test] + fn decode_legacy_receipt() { + let receipt: Receipt = rlp::decode(&RAW_RECEIPT).unwrap(); + assert_eq!(receipt.post_state_or_status, vec!(1)); + assert_eq!(receipt.cumulative_gas_used, 414448); + assert_eq!( + receipt.bloom, + (&hex!( + " + 042000000000000000000000800200000000000100000000000100000000000000000000 + 000000000000000000000000020000000800000000000000002000000000000000000000 + 000000080000002200000000004000100000000000000000000000000000000000000000 + 000000000000000000000400000000100001000000000008000000000040000000000000 + 000000000000000800000040000000000200000000000200000000000000000000000000 + 000000000000000000040000000000020000000001000000000000000000000000000010 + 000000020000200000102000000000000100000000000000000000000000000000000000 + 10000000 + " + )) + .into(), + ); + assert_eq!(receipt.logs.len(), 6); + } +} diff --git a/bridges/snowbridge/parachain/primitives/router/Cargo.toml b/bridges/snowbridge/parachain/primitives/router/Cargo.toml new file mode 100644 index 00000000000..7badfebb606 --- /dev/null +++ b/bridges/snowbridge/parachain/primitives/router/Cargo.toml @@ -0,0 +1,61 @@ +[package] +name = "snowbridge-router-primitives" +description = "Snowbridge Router Primitives" +version = "0.1.1" +authors = ["Snowfork "] +edition = "2021" +license = "Apache-2.0" + +[dependencies] +serde = { version = "1.0.188", optional = true, features = ["derive"] } +codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } +scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } +log = { version = "0.4.20", default-features = false } + +frame-support = { path = "../../../../../substrate/frame/support", default-features = false } +frame-system = { path = "../../../../../substrate/frame/system", default-features = false } +sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } +sp-io = { path = "../../../../../substrate/primitives/io", default-features = false } +sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-features = false } +sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } + +xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } +xcm-builder = { package = "staging-xcm-builder", path = "../../../../../polkadot/xcm/xcm-builder", default-features = false } +xcm-executor = { package = "staging-xcm-executor", path = "../../../../../polkadot/xcm/xcm-executor", default-features = false } + +snowbridge-core = { path = "../../primitives/core", default-features = false } + +ethabi = { git = "https://github.com/Snowfork/ethabi-decode.git", package = "ethabi-decode", branch = "master", default-features = false } + +hex-literal = { version = "0.4.1" } + +[dev-dependencies] +hex = { package = "rustc-hex", version = "2.1.0" } + +[features] +default = ["std"] +std = [ + "codec/std", + "ethabi/std", + "frame-support/std", + "frame-system/std", + "log/std", + "scale-info/std", + "serde", + "snowbridge-core/std", + "sp-core/std", + "sp-io/std", + "sp-runtime/std", + "sp-std/std", + "xcm-builder/std", + "xcm-executor/std", + "xcm/std", +] +runtime-benchmarks = [ + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "snowbridge-core/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", + "xcm-builder/runtime-benchmarks", + "xcm-executor/runtime-benchmarks", +] diff --git a/bridges/snowbridge/parachain/primitives/router/src/inbound/mod.rs b/bridges/snowbridge/parachain/primitives/router/src/inbound/mod.rs new file mode 100644 index 00000000000..a07e0eae5d7 --- /dev/null +++ b/bridges/snowbridge/parachain/primitives/router/src/inbound/mod.rs @@ -0,0 +1,320 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +//! Converts messages from Ethereum to XCM messages + +#[cfg(test)] +mod tests; + +use codec::{Decode, Encode}; +use core::marker::PhantomData; +use frame_support::{traits::tokens::Balance as BalanceT, weights::Weight, PalletError}; +use scale_info::TypeInfo; +use sp_core::{Get, RuntimeDebug, H160}; +use sp_io::hashing::blake2_256; +use sp_runtime::MultiAddress; +use sp_std::prelude::*; +use xcm::prelude::{Junction::AccountKey20, *}; +use xcm_executor::traits::ConvertLocation; + +const MINIMUM_DEPOSIT: u128 = 1; + +/// Messages from Ethereum are versioned. This is because in future, +/// we may want to evolve the protocol so that the ethereum side sends XCM messages directly. +/// Instead having BridgeHub transcode the messages into XCM. +#[derive(Clone, Encode, Decode, RuntimeDebug)] +pub enum VersionedMessage { + V1(MessageV1), +} + +/// For V1, the ethereum side sends messages which are transcoded into XCM. These messages are +/// self-contained, in that they can be transcoded using only information in the message. +#[derive(Clone, Encode, Decode, RuntimeDebug)] +pub struct MessageV1 { + /// EIP-155 chain id of the origin Ethereum network + pub chain_id: u64, + /// The command originating from the Gateway contract + pub command: Command, +} + +#[derive(Clone, Encode, Decode, RuntimeDebug)] +pub enum Command { + /// Register a wrapped token on the AssetHub `ForeignAssets` pallet + RegisterToken { + /// The address of the ERC20 token to be bridged over to AssetHub + token: H160, + /// XCM execution fee on AssetHub + fee: u128, + }, + /// Send a token to AssetHub or another parachain + SendToken { + /// The address of the ERC20 token to be bridged over to AssetHub + token: H160, + /// The destination for the transfer + destination: Destination, + /// Amount to transfer + amount: u128, + /// XCM execution fee on AssetHub + fee: u128, + }, +} + +/// Destination for bridged tokens +#[derive(Clone, Encode, Decode, RuntimeDebug)] +pub enum Destination { + /// The funds will be deposited into account `id` on AssetHub + AccountId32 { id: [u8; 32] }, + /// The funds will deposited into the sovereign account of destination parachain `para_id` on + /// AssetHub, Account `id` on the destination parachain will receive the funds via a + /// reserve-backed transfer. See + ForeignAccountId32 { + para_id: u32, + id: [u8; 32], + /// XCM execution fee on final destination + fee: u128, + }, + /// The funds will deposited into the sovereign account of destination parachain `para_id` on + /// AssetHub, Account `id` on the destination parachain will receive the funds via a + /// reserve-backed transfer. See + ForeignAccountId20 { + para_id: u32, + id: [u8; 20], + /// XCM execution fee on final destination + fee: u128, + }, +} + +pub struct MessageToXcm< + CreateAssetCall, + CreateAssetDeposit, + InboundQueuePalletInstance, + AccountId, + Balance, +> where + CreateAssetCall: Get, + CreateAssetDeposit: Get, + Balance: BalanceT, +{ + _phantom: PhantomData<( + CreateAssetCall, + CreateAssetDeposit, + InboundQueuePalletInstance, + AccountId, + Balance, + )>, +} + +/// Reason why a message conversion failed. +#[derive(Copy, Clone, TypeInfo, PalletError, Encode, Decode, RuntimeDebug)] +pub enum ConvertMessageError { + /// The message version is not supported for conversion. + UnsupportedVersion, +} + +/// convert the inbound message to xcm which will be forwarded to the destination chain +pub trait ConvertMessage { + type Balance: BalanceT + From; + type AccountId; + /// Converts a versioned message into an XCM message and an optional topicID + fn convert(message: VersionedMessage) -> Result<(Xcm<()>, Self::Balance), ConvertMessageError>; +} + +pub type CallIndex = [u8; 2]; + +impl + ConvertMessage + for MessageToXcm< + CreateAssetCall, + CreateAssetDeposit, + InboundQueuePalletInstance, + AccountId, + Balance, + > where + CreateAssetCall: Get, + CreateAssetDeposit: Get, + InboundQueuePalletInstance: Get, + Balance: BalanceT + From, + AccountId: Into<[u8; 32]>, +{ + type Balance = Balance; + type AccountId = AccountId; + + fn convert(message: VersionedMessage) -> Result<(Xcm<()>, Self::Balance), ConvertMessageError> { + use Command::*; + use VersionedMessage::*; + match message { + V1(MessageV1 { chain_id, command: RegisterToken { token, fee } }) => + Ok(Self::convert_register_token(chain_id, token, fee)), + V1(MessageV1 { chain_id, command: SendToken { token, destination, amount, fee } }) => + Ok(Self::convert_send_token(chain_id, token, destination, amount, fee)), + } + } +} + +impl + MessageToXcm +where + CreateAssetCall: Get, + CreateAssetDeposit: Get, + InboundQueuePalletInstance: Get, + Balance: BalanceT + From, + AccountId: Into<[u8; 32]>, +{ + fn convert_register_token(chain_id: u64, token: H160, fee: u128) -> (Xcm<()>, Balance) { + let network = Ethereum { chain_id }; + let xcm_fee: MultiAsset = (MultiLocation::parent(), fee).into(); + let deposit: MultiAsset = (MultiLocation::parent(), CreateAssetDeposit::get()).into(); + + let total_amount = fee + CreateAssetDeposit::get(); + let total: MultiAsset = (MultiLocation::parent(), total_amount).into(); + + let bridge_location: MultiLocation = (Parent, Parent, GlobalConsensus(network)).into(); + + let owner = GlobalConsensusEthereumConvertsFor::<[u8; 32]>::from_chain_id(&chain_id); + let asset_id = Self::convert_token_address(network, token); + let create_call_index: [u8; 2] = CreateAssetCall::get(); + let inbound_queue_pallet_index = InboundQueuePalletInstance::get(); + + let xcm: Xcm<()> = vec![ + // Teleport required fees. + ReceiveTeleportedAsset(total.into()), + // Pay for execution. + BuyExecution { fees: xcm_fee, weight_limit: Unlimited }, + // Fund the snowbridge sovereign with the required deposit for creation. + DepositAsset { assets: Definite(deposit.into()), beneficiary: bridge_location }, + // Only our inbound-queue pallet is allowed to invoke `UniversalOrigin` + DescendOrigin(X1(PalletInstance(inbound_queue_pallet_index))), + // Change origin to the bridge. + UniversalOrigin(GlobalConsensus(network)), + // Call create_asset on foreign assets pallet. + Transact { + origin_kind: OriginKind::Xcm, + require_weight_at_most: Weight::from_parts(400_000_000, 8_000), + call: ( + create_call_index, + asset_id, + MultiAddress::<[u8; 32], ()>::Id(owner), + MINIMUM_DEPOSIT, + ) + .encode() + .into(), + }, + RefundSurplus, + // Clear the origin so that remaining assets in holding + // are claimable by the physical origin (BridgeHub) + ClearOrigin, + ] + .into(); + + (xcm, total_amount.into()) + } + + fn convert_send_token( + chain_id: u64, + token: H160, + destination: Destination, + amount: u128, + asset_hub_fee: u128, + ) -> (Xcm<()>, Balance) { + let network = Ethereum { chain_id }; + let asset_hub_fee_asset: MultiAsset = (MultiLocation::parent(), asset_hub_fee).into(); + let asset: MultiAsset = (Self::convert_token_address(network, token), amount).into(); + + let (dest_para_id, beneficiary, dest_para_fee) = match destination { + // Final destination is a 32-byte account on AssetHub + Destination::AccountId32 { id } => ( + None, + MultiLocation { parents: 0, interior: X1(AccountId32 { network: None, id }) }, + 0, + ), + // Final destination is a 32-byte account on a sibling of AssetHub + Destination::ForeignAccountId32 { para_id, id, fee } => ( + Some(para_id), + MultiLocation { parents: 0, interior: X1(AccountId32 { network: None, id }) }, + // Total fee needs to cover execution on AssetHub and Sibling + fee, + ), + // Final destination is a 20-byte account on a sibling of AssetHub + Destination::ForeignAccountId20 { para_id, id, fee } => ( + Some(para_id), + MultiLocation { parents: 0, interior: X1(AccountKey20 { network: None, key: id }) }, + // Total fee needs to cover execution on AssetHub and Sibling + fee, + ), + }; + + let total_fees = asset_hub_fee.saturating_add(dest_para_fee); + let total_fee_asset: MultiAsset = (MultiLocation::parent(), total_fees).into(); + let inbound_queue_pallet_index = InboundQueuePalletInstance::get(); + + let mut instructions = vec![ + ReceiveTeleportedAsset(total_fee_asset.into()), + BuyExecution { fees: asset_hub_fee_asset, weight_limit: Unlimited }, + DescendOrigin(X1(PalletInstance(inbound_queue_pallet_index))), + UniversalOrigin(GlobalConsensus(network)), + ReserveAssetDeposited(asset.clone().into()), + ClearOrigin, + ]; + + match dest_para_id { + Some(dest_para_id) => { + let dest_para_fee_asset: MultiAsset = + (MultiLocation::parent(), dest_para_fee).into(); + + instructions.extend(vec![ + // Perform a deposit reserve to send to destination chain. + DepositReserveAsset { + assets: Definite(vec![dest_para_fee_asset.clone(), asset.clone()].into()), + dest: MultiLocation { parents: 1, interior: X1(Parachain(dest_para_id)) }, + xcm: vec![ + // Buy execution on target. + BuyExecution { fees: dest_para_fee_asset, weight_limit: Unlimited }, + // Deposit asset to beneficiary. + DepositAsset { assets: Definite(asset.into()), beneficiary }, + ] + .into(), + }, + ]); + }, + None => { + instructions.extend(vec![ + // Deposit asset to beneficiary. + DepositAsset { assets: Definite(asset.into()), beneficiary }, + ]); + }, + } + + (instructions.into(), total_fees.into()) + } + + // Convert ERC20 token address to a Multilocation that can be understood by Assets Hub. + fn convert_token_address(network: NetworkId, token: H160) -> MultiLocation { + MultiLocation { + parents: 2, + interior: X2( + GlobalConsensus(network), + AccountKey20 { network: None, key: token.into() }, + ), + } + } +} + +pub struct GlobalConsensusEthereumConvertsFor(PhantomData); +impl ConvertLocation for GlobalConsensusEthereumConvertsFor +where + AccountId: From<[u8; 32]> + Clone, +{ + fn convert_location(location: &MultiLocation) -> Option { + if let MultiLocation { interior: X1(GlobalConsensus(Ethereum { chain_id })), .. } = location + { + Some(Self::from_chain_id(chain_id).into()) + } else { + None + } + } +} + +impl GlobalConsensusEthereumConvertsFor { + pub fn from_chain_id(chain_id: &u64) -> [u8; 32] { + (b"ethereum-chain", chain_id).using_encoded(blake2_256) + } +} diff --git a/bridges/snowbridge/parachain/primitives/router/src/inbound/tests.rs b/bridges/snowbridge/parachain/primitives/router/src/inbound/tests.rs new file mode 100644 index 00000000000..8c96c13cf22 --- /dev/null +++ b/bridges/snowbridge/parachain/primitives/router/src/inbound/tests.rs @@ -0,0 +1,41 @@ +use super::GlobalConsensusEthereumConvertsFor; +use crate::inbound::CallIndex; +use frame_support::parameter_types; +use hex_literal::hex; +use xcm::v3::prelude::*; +use xcm_executor::traits::ConvertLocation; + +const NETWORK: NetworkId = Ethereum { chain_id: 11155111 }; + +parameter_types! { + pub EthereumNetwork: NetworkId = NETWORK; + + pub const CreateAssetCall: CallIndex = [1, 1]; + pub const CreateAssetExecutionFee: u128 = 123; + pub const CreateAssetDeposit: u128 = 891; + pub const SendTokenExecutionFee: u128 = 592; +} + +#[test] +fn test_contract_location_with_network_converts_successfully() { + let expected_account: [u8; 32] = + hex!("ce796ae65569a670d0c1cc1ac12515a3ce21b5fbf729d63d7b289baad070139d"); + let contract_location = MultiLocation { parents: 2, interior: X1(GlobalConsensus(NETWORK)) }; + + let account = + GlobalConsensusEthereumConvertsFor::<[u8; 32]>::convert_location(&contract_location) + .unwrap(); + + assert_eq!(account, expected_account); +} + +#[test] +fn test_contract_location_with_incorrect_location_fails_convert() { + let contract_location = + MultiLocation { parents: 2, interior: X2(GlobalConsensus(Polkadot), Parachain(1000)) }; + + assert_eq!( + GlobalConsensusEthereumConvertsFor::<[u8; 32]>::convert_location(&contract_location), + None, + ); +} diff --git a/bridges/snowbridge/parachain/primitives/router/src/lib.rs b/bridges/snowbridge/parachain/primitives/router/src/lib.rs new file mode 100644 index 00000000000..d9031c69b22 --- /dev/null +++ b/bridges/snowbridge/parachain/primitives/router/src/lib.rs @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +#![cfg_attr(not(feature = "std"), no_std)] + +pub mod inbound; +pub mod outbound; diff --git a/bridges/snowbridge/parachain/primitives/router/src/outbound/mod.rs b/bridges/snowbridge/parachain/primitives/router/src/outbound/mod.rs new file mode 100644 index 00000000000..c7f2f440834 --- /dev/null +++ b/bridges/snowbridge/parachain/primitives/router/src/outbound/mod.rs @@ -0,0 +1,282 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +//! Converts XCM messages into simpler commands that can be processed by the Gateway contract + +#[cfg(test)] +mod tests; + +use core::slice::Iter; + +use codec::{Decode, Encode}; + +use frame_support::{ensure, traits::Get}; +use snowbridge_core::{ + outbound::{AgentExecuteCommand, Command, Message, SendMessage}, + ChannelId, ParaId, +}; +use sp_core::{H160, H256}; +use sp_std::{iter::Peekable, marker::PhantomData, prelude::*}; +use xcm::v3::prelude::*; +use xcm_executor::traits::{ConvertLocation, ExportXcm}; + +pub struct EthereumBlobExporter< + UniversalLocation, + EthereumNetwork, + OutboundQueue, + AgentHashedDescription, +>(PhantomData<(UniversalLocation, EthereumNetwork, OutboundQueue, AgentHashedDescription)>); + +impl ExportXcm + for EthereumBlobExporter +where + UniversalLocation: Get, + EthereumNetwork: Get, + OutboundQueue: SendMessage, + AgentHashedDescription: ConvertLocation, +{ + type Ticket = (Vec, XcmHash); + + fn validate( + network: NetworkId, + _channel: u32, + universal_source: &mut Option, + destination: &mut Option, + message: &mut Option>, + ) -> SendResult { + let expected_network = EthereumNetwork::get(); + let universal_location = UniversalLocation::get(); + + if network != expected_network { + log::trace!(target: "xcm::ethereum_blob_exporter", "skipped due to unmatched bridge network {network:?}."); + return Err(SendError::NotApplicable) + } + + let dest = destination.take().ok_or(SendError::MissingArgument)?; + if dest != Here { + log::trace!(target: "xcm::ethereum_blob_exporter", "skipped due to unmatched remote destination {dest:?}."); + return Err(SendError::NotApplicable) + } + + let (local_net, local_sub) = universal_source + .take() + .ok_or_else(|| { + log::error!(target: "xcm::ethereum_blob_exporter", "universal source not provided."); + SendError::MissingArgument + })? + .split_global() + .map_err(|()| { + log::error!(target: "xcm::ethereum_blob_exporter", "could not get global consensus from universal source '{universal_source:?}'."); + SendError::Unroutable + })?; + + if Ok(local_net) != universal_location.global_consensus() { + log::trace!(target: "xcm::ethereum_blob_exporter", "skipped due to unmatched relay network {local_net:?}."); + return Err(SendError::NotApplicable) + } + + let para_id = match local_sub { + X1(Parachain(para_id)) => para_id, + _ => { + log::error!(target: "xcm::ethereum_blob_exporter", "could not get parachain id from universal source '{local_sub:?}'."); + return Err(SendError::MissingArgument) + }, + }; + + let message = message.take().ok_or_else(|| { + log::error!(target: "xcm::ethereum_blob_exporter", "xcm message not provided."); + SendError::MissingArgument + })?; + + let mut converter = XcmConverter::new(&message, &expected_network); + let (agent_execute_command, message_id) = converter.convert().map_err(|err|{ + log::error!(target: "xcm::ethereum_blob_exporter", "unroutable due to pattern matching error '{err:?}'."); + SendError::Unroutable + })?; + + let source_location: MultiLocation = MultiLocation { parents: 1, interior: local_sub }; + let agent_id = match AgentHashedDescription::convert_location(&source_location) { + Some(id) => id, + None => { + log::error!(target: "xcm::ethereum_blob_exporter", "unroutable due to not being able to create agent id. '{source_location:?}'"); + return Err(SendError::Unroutable) + }, + }; + + let channel_id: ChannelId = ParaId::from(para_id).into(); + + let outbound_message = Message { + id: Some(message_id.into()), + channel_id, + command: Command::AgentExecute { agent_id, command: agent_execute_command }, + }; + + // validate the message + let (ticket, fee) = OutboundQueue::validate(&outbound_message).map_err(|err| { + log::error!(target: "xcm::ethereum_blob_exporter", "OutboundQueue validation of message failed. {err:?}"); + SendError::Unroutable + })?; + + // convert fee to MultiAsset + let fee = MultiAsset::from((MultiLocation::parent(), fee.total())).into(); + + Ok(((ticket.encode(), message_id), fee)) + } + + fn deliver(blob: (Vec, XcmHash)) -> Result { + let ticket: OutboundQueue::Ticket = OutboundQueue::Ticket::decode(&mut blob.0.as_ref()) + .map_err(|_| { + log::trace!(target: "xcm::ethereum_blob_exporter", "undeliverable due to decoding error"); + SendError::NotApplicable + })?; + + let message_id = OutboundQueue::deliver(ticket).map_err(|_| { + log::error!(target: "xcm::ethereum_blob_exporter", "OutboundQueue submit of message failed"); + SendError::Transport("other transport error") + })?; + + log::info!(target: "xcm::ethereum_blob_exporter", "message delivered {message_id:#?}."); + Ok(message_id.into()) + } +} + +/// Errors that can be thrown to the pattern matching step. +#[derive(PartialEq, Debug)] +enum XcmConverterError { + UnexpectedEndOfXcm, + EndOfXcmMessageExpected, + WithdrawAssetExpected, + DepositAssetExpected, + NoReserveAssets, + FilterDoesNotConsumeAllAssets, + TooManyAssets, + ZeroAssetTransfer, + BeneficiaryResolutionFailed, + AssetResolutionFailed, + InvalidFeeAsset, + SetTopicExpected, +} + +macro_rules! match_expression { + ($expression:expr, $(|)? $( $pattern:pat_param )|+ $( if $guard: expr )?, $value:expr $(,)?) => { + match $expression { + $( $pattern )|+ $( if $guard )? => Some($value), + _ => None, + } + }; +} + +struct XcmConverter<'a, Call> { + iter: Peekable>>, + ethereum_network: &'a NetworkId, +} +impl<'a, Call> XcmConverter<'a, Call> { + fn new(message: &'a Xcm, ethereum_network: &'a NetworkId) -> Self { + Self { iter: message.inner().iter().peekable(), ethereum_network } + } + + fn convert(&mut self) -> Result<(AgentExecuteCommand, [u8; 32]), XcmConverterError> { + // Get withdraw/deposit and make native tokens create message. + let result = self.native_tokens_unlock_message()?; + + // All xcm instructions must be consumed before exit. + if self.next().is_ok() { + return Err(XcmConverterError::EndOfXcmMessageExpected) + } + + Ok(result) + } + + fn native_tokens_unlock_message( + &mut self, + ) -> Result<(AgentExecuteCommand, [u8; 32]), XcmConverterError> { + use XcmConverterError::*; + + // Get the reserve assets from WithdrawAsset. + let reserve_assets = + match_expression!(self.next()?, WithdrawAsset(reserve_assets), reserve_assets) + .ok_or(WithdrawAssetExpected)?; + + // Check if clear origin exists and skip over it. + if match_expression!(self.peek(), Ok(ClearOrigin), ()).is_some() { + let _ = self.next(); + } + + // Get the fee asset item from BuyExecution or continue parsing. + let fee_asset = match_expression!(self.peek(), Ok(BuyExecution { fees, .. }), fees); + if fee_asset.is_some() { + let _ = self.next(); + } + + let (deposit_assets, beneficiary) = match_expression!( + self.next()?, + DepositAsset { assets, beneficiary }, + (assets, beneficiary) + ) + .ok_or(DepositAssetExpected)?; + + // assert that the beneficiary is AccountKey20. + let recipient = match_expression!( + beneficiary, + MultiLocation { parents: 0, interior: X1(AccountKey20 { network, key }) } + if self.network_matches(network), + H160(*key) + ) + .ok_or(BeneficiaryResolutionFailed)?; + + // Make sure there are reserved assets. + if reserve_assets.len() == 0 { + return Err(NoReserveAssets) + } + + // Check the the deposit asset filter matches what was reserved. + if reserve_assets.inner().iter().any(|asset| !deposit_assets.matches(asset)) { + return Err(FilterDoesNotConsumeAllAssets) + } + + // We only support a single asset at a time. + ensure!(reserve_assets.len() == 1, TooManyAssets); + let reserve_asset = reserve_assets.get(0).ok_or(AssetResolutionFailed)?; + + // If there was a fee specified verify it. + if let Some(fee_asset) = fee_asset { + // The fee asset must be the same as the reserve asset. + if fee_asset.id != reserve_asset.id || fee_asset.fun > reserve_asset.fun { + return Err(InvalidFeeAsset) + } + } + + let (token, amount) = match_expression!( + reserve_asset, + MultiAsset { + id: Concrete(MultiLocation { parents: 0, interior: X1(AccountKey20 { network , key })}), + fun: Fungible(amount) + } if self.network_matches(network), + (H160(*key), *amount) + ) + .ok_or(AssetResolutionFailed)?; + + // transfer amount must be greater than 0. + ensure!(amount > 0, ZeroAssetTransfer); + + // Check if there is a SetTopic and skip over it if found. + let topic_id = match_expression!(self.next()?, SetTopic(id), id).ok_or(SetTopicExpected)?; + + Ok((AgentExecuteCommand::TransferToken { token, recipient, amount }, *topic_id)) + } + + fn next(&mut self) -> Result<&'a Instruction, XcmConverterError> { + self.iter.next().ok_or(XcmConverterError::UnexpectedEndOfXcm) + } + + fn peek(&mut self) -> Result<&&'a Instruction, XcmConverterError> { + self.iter.peek().ok_or(XcmConverterError::UnexpectedEndOfXcm) + } + + fn network_matches(&self, network: &Option) -> bool { + if let Some(network) = network { + network == self.ethereum_network + } else { + true + } + } +} diff --git a/bridges/snowbridge/parachain/primitives/router/src/outbound/tests.rs b/bridges/snowbridge/parachain/primitives/router/src/outbound/tests.rs new file mode 100644 index 00000000000..153d934c390 --- /dev/null +++ b/bridges/snowbridge/parachain/primitives/router/src/outbound/tests.rs @@ -0,0 +1,1063 @@ +use frame_support::parameter_types; +use hex_literal::hex; +use snowbridge_core::{ + outbound::{Fee, SendError, SendMessageFeeProvider}, + AgentIdOf, +}; +use xcm::v3::prelude::SendError as XcmSendError; + +use super::*; + +parameter_types! { + const MaxMessageSize: u32 = u32::MAX; + const RelayNetwork: NetworkId = Polkadot; + const UniversalLocation: InteriorMultiLocation = X2(GlobalConsensus(RelayNetwork::get()), Parachain(1013)); + const BridgedNetwork: NetworkId = Ethereum{ chain_id: 1 }; + const NonBridgedNetwork: NetworkId = Ethereum{ chain_id: 2 }; +} + +struct MockOkOutboundQueue; +impl SendMessage for MockOkOutboundQueue { + type Ticket = (); + + fn validate(_: &Message) -> Result<(Self::Ticket, Fee), SendError> { + Ok(((), Fee { local: 1, remote: 1 })) + } + + fn deliver(_: Self::Ticket) -> Result { + Ok(H256::zero()) + } +} + +impl SendMessageFeeProvider for MockOkOutboundQueue { + type Balance = u128; + + fn local_fee() -> Self::Balance { + 1 + } +} +struct MockErrOutboundQueue; +impl SendMessage for MockErrOutboundQueue { + type Ticket = (); + + fn validate(_: &Message) -> Result<(Self::Ticket, Fee), SendError> { + Err(SendError::MessageTooLarge) + } + + fn deliver(_: Self::Ticket) -> Result { + Err(SendError::MessageTooLarge) + } +} + +impl SendMessageFeeProvider for MockErrOutboundQueue { + type Balance = u128; + + fn local_fee() -> Self::Balance { + 1 + } +} + +#[test] +fn exporter_validate_with_unknown_network_yields_not_applicable() { + let network = Ethereum { chain_id: 1337 }; + let channel: u32 = 0; + let mut universal_source: Option = None; + let mut destination: Option = None; + let mut message: Option> = None; + + let result = EthereumBlobExporter::< + UniversalLocation, + BridgedNetwork, + MockOkOutboundQueue, + AgentIdOf, + >::validate( + network, channel, &mut universal_source, &mut destination, &mut message + ); + assert_eq!(result, Err(XcmSendError::NotApplicable)); +} + +#[test] +fn exporter_validate_with_invalid_destination_yields_missing_argument() { + let network = BridgedNetwork::get(); + let channel: u32 = 0; + let mut universal_source: Option = None; + let mut destination: Option = None; + let mut message: Option> = None; + + let result = EthereumBlobExporter::< + UniversalLocation, + BridgedNetwork, + MockOkOutboundQueue, + AgentIdOf, + >::validate( + network, channel, &mut universal_source, &mut destination, &mut message + ); + assert_eq!(result, Err(XcmSendError::MissingArgument)); +} + +#[test] +fn exporter_validate_with_x8_destination_yields_not_applicable() { + let network = BridgedNetwork::get(); + let channel: u32 = 0; + let mut universal_source: Option = None; + let mut destination: Option = Some(X8( + OnlyChild, OnlyChild, OnlyChild, OnlyChild, OnlyChild, OnlyChild, OnlyChild, OnlyChild, + )); + let mut message: Option> = None; + + let result = EthereumBlobExporter::< + UniversalLocation, + BridgedNetwork, + MockOkOutboundQueue, + AgentIdOf, + >::validate( + network, channel, &mut universal_source, &mut destination, &mut message + ); + assert_eq!(result, Err(XcmSendError::NotApplicable)); +} + +#[test] +fn exporter_validate_without_universal_source_yields_missing_argument() { + let network = BridgedNetwork::get(); + let channel: u32 = 0; + let mut universal_source: Option = None; + let mut destination: Option = Here.into(); + let mut message: Option> = None; + + let result = EthereumBlobExporter::< + UniversalLocation, + BridgedNetwork, + MockOkOutboundQueue, + AgentIdOf, + >::validate( + network, channel, &mut universal_source, &mut destination, &mut message + ); + assert_eq!(result, Err(XcmSendError::MissingArgument)); +} + +#[test] +fn exporter_validate_without_global_universal_location_yields_unroutable() { + let network = BridgedNetwork::get(); + let channel: u32 = 0; + let mut universal_source: Option = Here.into(); + let mut destination: Option = Here.into(); + let mut message: Option> = None; + + let result = EthereumBlobExporter::< + UniversalLocation, + BridgedNetwork, + MockOkOutboundQueue, + AgentIdOf, + >::validate( + network, channel, &mut universal_source, &mut destination, &mut message + ); + assert_eq!(result, Err(XcmSendError::Unroutable)); +} + +#[test] +fn exporter_validate_without_global_bridge_location_yields_not_applicable() { + let network = NonBridgedNetwork::get(); + let channel: u32 = 0; + let mut universal_source: Option = Here.into(); + let mut destination: Option = Here.into(); + let mut message: Option> = None; + + let result = EthereumBlobExporter::< + UniversalLocation, + BridgedNetwork, + MockOkOutboundQueue, + AgentIdOf, + >::validate( + network, channel, &mut universal_source, &mut destination, &mut message + ); + assert_eq!(result, Err(XcmSendError::NotApplicable)); +} + +#[test] +fn exporter_validate_with_remote_universal_source_yields_not_applicable() { + let network = BridgedNetwork::get(); + let channel: u32 = 0; + let mut universal_source: Option = + Some(X2(GlobalConsensus(Kusama), Parachain(1000))); + let mut destination: Option = Here.into(); + let mut message: Option> = None; + + let result = EthereumBlobExporter::< + UniversalLocation, + BridgedNetwork, + MockOkOutboundQueue, + AgentIdOf, + >::validate( + network, channel, &mut universal_source, &mut destination, &mut message + ); + assert_eq!(result, Err(XcmSendError::NotApplicable)); +} + +#[test] +fn exporter_validate_without_para_id_in_source_yields_missing_argument() { + let network = BridgedNetwork::get(); + let channel: u32 = 0; + let mut universal_source: Option = Some(X1(GlobalConsensus(Polkadot))); + let mut destination: Option = Here.into(); + let mut message: Option> = None; + + let result = EthereumBlobExporter::< + UniversalLocation, + BridgedNetwork, + MockOkOutboundQueue, + AgentIdOf, + >::validate( + network, channel, &mut universal_source, &mut destination, &mut message + ); + assert_eq!(result, Err(XcmSendError::MissingArgument)); +} + +#[test] +fn exporter_validate_complex_para_id_in_source_yields_missing_argument() { + let network = BridgedNetwork::get(); + let channel: u32 = 0; + let mut universal_source: Option = + Some(X3(GlobalConsensus(Polkadot), Parachain(1000), PalletInstance(12))); + let mut destination: Option = Here.into(); + let mut message: Option> = None; + + let result = EthereumBlobExporter::< + UniversalLocation, + BridgedNetwork, + MockOkOutboundQueue, + AgentIdOf, + >::validate( + network, channel, &mut universal_source, &mut destination, &mut message + ); + assert_eq!(result, Err(XcmSendError::MissingArgument)); +} + +#[test] +fn exporter_validate_without_xcm_message_yields_missing_argument() { + let network = BridgedNetwork::get(); + let channel: u32 = 0; + let mut universal_source: Option = + Some(X2(GlobalConsensus(Polkadot), Parachain(1000))); + let mut destination: Option = Here.into(); + let mut message: Option> = None; + + let result = EthereumBlobExporter::< + UniversalLocation, + BridgedNetwork, + MockOkOutboundQueue, + AgentIdOf, + >::validate( + network, channel, &mut universal_source, &mut destination, &mut message + ); + assert_eq!(result, Err(XcmSendError::MissingArgument)); +} + +#[test] +fn exporter_validate_with_max_target_fee_yields_unroutable() { + let network = BridgedNetwork::get(); + let mut destination: Option = Here.into(); + + let mut universal_source: Option = + Some(X2(GlobalConsensus(Polkadot), Parachain(1000))); + + let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); + let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); + + let channel: u32 = 0; + let fee = MultiAsset { id: Concrete(Here.into()), fun: Fungible(1000) }; + let fees: MultiAssets = vec![fee.clone()].into(); + let assets: MultiAssets = vec![MultiAsset { + id: Concrete(X1(AccountKey20 { network: None, key: token_address }).into()), + fun: Fungible(1000), + }] + .into(); + let filter: MultiAssetFilter = assets.clone().into(); + + let mut message: Option> = Some( + vec![ + WithdrawAsset(fees), + BuyExecution { fees: fee, weight_limit: Unlimited }, + WithdrawAsset(assets), + DepositAsset { + assets: filter, + beneficiary: X1(AccountKey20 { network: Some(network), key: beneficiary_address }) + .into(), + }, + SetTopic([0; 32]), + ] + .into(), + ); + + let result = EthereumBlobExporter::< + UniversalLocation, + BridgedNetwork, + MockOkOutboundQueue, + AgentIdOf, + >::validate( + network, channel, &mut universal_source, &mut destination, &mut message + ); + + assert_eq!(result, Err(XcmSendError::Unroutable)); +} + +#[test] +fn exporter_validate_with_unparsable_xcm_yields_unroutable() { + let network = BridgedNetwork::get(); + let mut destination: Option = Here.into(); + + let mut universal_source: Option = + Some(X2(GlobalConsensus(Polkadot), Parachain(1000))); + + let channel: u32 = 0; + let fee = MultiAsset { id: Concrete(Here.into()), fun: Fungible(1000) }; + let fees: MultiAssets = vec![fee.clone()].into(); + + let mut message: Option> = + Some(vec![WithdrawAsset(fees), BuyExecution { fees: fee, weight_limit: Unlimited }].into()); + + let result = EthereumBlobExporter::< + UniversalLocation, + BridgedNetwork, + MockOkOutboundQueue, + AgentIdOf, + >::validate( + network, channel, &mut universal_source, &mut destination, &mut message + ); + + assert_eq!(result, Err(XcmSendError::Unroutable)); +} + +#[test] +fn exporter_validate_xcm_success_case_1() { + let network = BridgedNetwork::get(); + let mut destination: Option = Here.into(); + + let mut universal_source: Option = + Some(X2(GlobalConsensus(Polkadot), Parachain(1000))); + + let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); + let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); + + let channel: u32 = 0; + let assets: MultiAssets = vec![MultiAsset { + id: Concrete(X1(AccountKey20 { network: None, key: token_address }).into()), + fun: Fungible(1000), + }] + .into(); + let fee = assets.clone().get(0).unwrap().clone(); + let filter: MultiAssetFilter = assets.clone().into(); + + let mut message: Option> = Some( + vec![ + WithdrawAsset(assets.clone()), + ClearOrigin, + BuyExecution { fees: fee, weight_limit: Unlimited }, + DepositAsset { + assets: filter, + beneficiary: X1(AccountKey20 { network: None, key: beneficiary_address }).into(), + }, + SetTopic([0; 32]), + ] + .into(), + ); + + let result = EthereumBlobExporter::< + UniversalLocation, + BridgedNetwork, + MockOkOutboundQueue, + AgentIdOf, + >::validate( + network, channel, &mut universal_source, &mut destination, &mut message + ); + + assert!(result.is_ok()); +} + +#[test] +fn exporter_deliver_with_submit_failure_yields_unroutable() { + let result = EthereumBlobExporter::< + UniversalLocation, + BridgedNetwork, + MockErrOutboundQueue, + AgentIdOf, + >::deliver((hex!("deadbeef").to_vec(), XcmHash::default())); + assert_eq!(result, Err(XcmSendError::Transport("other transport error"))) +} + +#[test] +fn xcm_converter_convert_success() { + let network = BridgedNetwork::get(); + + let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); + let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); + + let assets: MultiAssets = vec![MultiAsset { + id: Concrete(X1(AccountKey20 { network: None, key: token_address }).into()), + fun: Fungible(1000), + }] + .into(); + let filter: MultiAssetFilter = assets.clone().into(); + + let message: Xcm<()> = vec![ + WithdrawAsset(assets.clone()), + ClearOrigin, + BuyExecution { fees: assets.get(0).unwrap().clone(), weight_limit: Unlimited }, + DepositAsset { + assets: filter, + beneficiary: X1(AccountKey20 { network: None, key: beneficiary_address }).into(), + }, + SetTopic([0; 32]), + ] + .into(); + let mut converter = XcmConverter::new(&message, &network); + let expected_payload = AgentExecuteCommand::TransferToken { + token: token_address.into(), + recipient: beneficiary_address.into(), + amount: 1000, + }; + let result = converter.convert(); + assert_eq!(result, Ok((expected_payload, [0; 32]))); +} + +#[test] +fn xcm_converter_convert_without_buy_execution_yields_success() { + let network = BridgedNetwork::get(); + + let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); + let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); + + let assets: MultiAssets = vec![MultiAsset { + id: Concrete(X1(AccountKey20 { network: None, key: token_address }).into()), + fun: Fungible(1000), + }] + .into(); + let filter: MultiAssetFilter = assets.clone().into(); + + let message: Xcm<()> = vec![ + WithdrawAsset(assets.clone()), + DepositAsset { + assets: filter, + beneficiary: X1(AccountKey20 { network: None, key: beneficiary_address }).into(), + }, + SetTopic([0; 32]), + ] + .into(); + let mut converter = XcmConverter::new(&message, &network); + let expected_payload = AgentExecuteCommand::TransferToken { + token: token_address.into(), + recipient: beneficiary_address.into(), + amount: 1000, + }; + let result = converter.convert(); + assert_eq!(result, Ok((expected_payload, [0; 32]))); +} + +#[test] +fn xcm_converter_convert_with_wildcard_all_asset_filter_succeeds() { + let network = BridgedNetwork::get(); + + let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); + let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); + + let assets: MultiAssets = vec![MultiAsset { + id: Concrete(X1(AccountKey20 { network: None, key: token_address }).into()), + fun: Fungible(1000), + }] + .into(); + let filter: MultiAssetFilter = Wild(All); + + let message: Xcm<()> = vec![ + WithdrawAsset(assets.clone()), + ClearOrigin, + BuyExecution { fees: assets.get(0).unwrap().clone(), weight_limit: Unlimited }, + DepositAsset { + assets: filter, + beneficiary: X1(AccountKey20 { network: None, key: beneficiary_address }).into(), + }, + SetTopic([0; 32]), + ] + .into(); + let mut converter = XcmConverter::new(&message, &network); + let expected_payload = AgentExecuteCommand::TransferToken { + token: token_address.into(), + recipient: beneficiary_address.into(), + amount: 1000, + }; + let result = converter.convert(); + assert_eq!(result, Ok((expected_payload, [0; 32]))); +} + +#[test] +fn xcm_converter_convert_with_fees_less_than_reserve_yields_success() { + let network = BridgedNetwork::get(); + + let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); + let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); + + let asset_location = X1(AccountKey20 { network: None, key: token_address }).into(); + let fee_asset = MultiAsset { id: Concrete(asset_location), fun: Fungible(500) }; + + let assets: MultiAssets = + vec![MultiAsset { id: Concrete(asset_location), fun: Fungible(1000) }].into(); + + let filter: MultiAssetFilter = assets.clone().into(); + + let message: Xcm<()> = vec![ + WithdrawAsset(assets.clone()), + ClearOrigin, + BuyExecution { fees: fee_asset, weight_limit: Unlimited }, + DepositAsset { + assets: filter, + beneficiary: X1(AccountKey20 { network: None, key: beneficiary_address }).into(), + }, + SetTopic([0; 32]), + ] + .into(); + let mut converter = XcmConverter::new(&message, &network); + let expected_payload = AgentExecuteCommand::TransferToken { + token: token_address.into(), + recipient: beneficiary_address.into(), + amount: 1000, + }; + let result = converter.convert(); + assert_eq!(result, Ok((expected_payload, [0; 32]))); +} + +#[test] +fn xcm_converter_convert_without_set_topic_yields_set_topic_expected() { + let network = BridgedNetwork::get(); + + let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); + let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); + + let assets: MultiAssets = vec![MultiAsset { + id: Concrete(X1(AccountKey20 { network: None, key: token_address }).into()), + fun: Fungible(1000), + }] + .into(); + let filter: MultiAssetFilter = assets.clone().into(); + + let message: Xcm<()> = vec![ + WithdrawAsset(assets.clone()), + BuyExecution { fees: assets.get(0).unwrap().clone(), weight_limit: Unlimited }, + DepositAsset { + assets: filter, + beneficiary: X1(AccountKey20 { network: None, key: beneficiary_address }).into(), + }, + ClearTopic, + ] + .into(); + let mut converter = XcmConverter::new(&message, &network); + let result = converter.convert(); + assert_eq!(result.err(), Some(XcmConverterError::SetTopicExpected)); +} + +#[test] +fn xcm_converter_convert_with_partial_message_yields_unexpected_end_of_xcm() { + let network = BridgedNetwork::get(); + + let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); + let assets: MultiAssets = vec![MultiAsset { + id: Concrete(X1(AccountKey20 { network: None, key: token_address }).into()), + fun: Fungible(1000), + }] + .into(); + let message: Xcm<()> = vec![WithdrawAsset(assets)].into(); + + let mut converter = XcmConverter::new(&message, &network); + let result = converter.convert(); + assert_eq!(result.err(), Some(XcmConverterError::UnexpectedEndOfXcm)); +} + +#[test] +fn xcm_converter_with_different_fee_asset_fails() { + let network = BridgedNetwork::get(); + + let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); + let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); + + let asset_location = X1(AccountKey20 { network: None, key: token_address }).into(); + let fee_asset = MultiAsset { + id: Concrete(MultiLocation { parents: 0, interior: Here }), + fun: Fungible(1000), + }; + + let assets: MultiAssets = + vec![MultiAsset { id: Concrete(asset_location), fun: Fungible(1000) }].into(); + + let filter: MultiAssetFilter = assets.clone().into(); + + let message: Xcm<()> = vec![ + WithdrawAsset(assets.clone()), + ClearOrigin, + BuyExecution { fees: fee_asset, weight_limit: Unlimited }, + DepositAsset { + assets: filter, + beneficiary: X1(AccountKey20 { network: None, key: beneficiary_address }).into(), + }, + SetTopic([0; 32]), + ] + .into(); + let mut converter = XcmConverter::new(&message, &network); + let result = converter.convert(); + assert_eq!(result.err(), Some(XcmConverterError::InvalidFeeAsset)); +} + +#[test] +fn xcm_converter_with_fees_greater_than_reserve_fails() { + let network = BridgedNetwork::get(); + + let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); + let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); + + let asset_location = X1(AccountKey20 { network: None, key: token_address }).into(); + let fee_asset = MultiAsset { id: Concrete(asset_location), fun: Fungible(1001) }; + + let assets: MultiAssets = + vec![MultiAsset { id: Concrete(asset_location), fun: Fungible(1000) }].into(); + + let filter: MultiAssetFilter = assets.clone().into(); + + let message: Xcm<()> = vec![ + WithdrawAsset(assets.clone()), + ClearOrigin, + BuyExecution { fees: fee_asset, weight_limit: Unlimited }, + DepositAsset { + assets: filter, + beneficiary: X1(AccountKey20 { network: None, key: beneficiary_address }).into(), + }, + SetTopic([0; 32]), + ] + .into(); + let mut converter = XcmConverter::new(&message, &network); + let result = converter.convert(); + assert_eq!(result.err(), Some(XcmConverterError::InvalidFeeAsset)); +} + +#[test] +fn xcm_converter_convert_with_empty_xcm_yields_unexpected_end_of_xcm() { + let network = BridgedNetwork::get(); + + let message: Xcm<()> = vec![].into(); + + let mut converter = XcmConverter::new(&message, &network); + + let result = converter.convert(); + assert_eq!(result.err(), Some(XcmConverterError::UnexpectedEndOfXcm)); +} + +#[test] +fn xcm_converter_convert_with_extra_instructions_yields_end_of_xcm_message_expected() { + let network = BridgedNetwork::get(); + + let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); + let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); + + let assets: MultiAssets = vec![MultiAsset { + id: Concrete(X1(AccountKey20 { network: None, key: token_address }).into()), + fun: Fungible(1000), + }] + .into(); + let filter: MultiAssetFilter = assets.clone().into(); + + let message: Xcm<()> = vec![ + WithdrawAsset(assets.clone()), + ClearOrigin, + BuyExecution { fees: assets.get(0).unwrap().clone(), weight_limit: Unlimited }, + DepositAsset { + assets: filter, + beneficiary: X1(AccountKey20 { network: None, key: beneficiary_address }).into(), + }, + SetTopic([0; 32]), + ClearError, + ] + .into(); + let mut converter = XcmConverter::new(&message, &network); + + let result = converter.convert(); + assert_eq!(result.err(), Some(XcmConverterError::EndOfXcmMessageExpected)); +} + +#[test] +fn xcm_converter_convert_without_withdraw_asset_yields_withdraw_expected() { + let network = BridgedNetwork::get(); + + let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); + let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); + + let assets: MultiAssets = vec![MultiAsset { + id: Concrete(X1(AccountKey20 { network: None, key: token_address }).into()), + fun: Fungible(1000), + }] + .into(); + let filter: MultiAssetFilter = assets.clone().into(); + + let message: Xcm<()> = vec![ + ClearOrigin, + BuyExecution { fees: assets.get(0).unwrap().clone(), weight_limit: Unlimited }, + DepositAsset { + assets: filter, + beneficiary: X1(AccountKey20 { network: None, key: beneficiary_address }).into(), + }, + SetTopic([0; 32]), + ] + .into(); + let mut converter = XcmConverter::new(&message, &network); + + let result = converter.convert(); + assert_eq!(result.err(), Some(XcmConverterError::WithdrawAssetExpected)); +} + +#[test] +fn xcm_converter_convert_without_withdraw_asset_yields_deposit_expected() { + let network = BridgedNetwork::get(); + + let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); + + let assets: MultiAssets = vec![MultiAsset { + id: Concrete(X1(AccountKey20 { network: None, key: token_address }).into()), + fun: Fungible(1000), + }] + .into(); + + let message: Xcm<()> = vec![ + WithdrawAsset(assets.clone()), + ClearOrigin, + BuyExecution { fees: assets.get(0).unwrap().clone(), weight_limit: Unlimited }, + SetTopic([0; 32]), + ] + .into(); + let mut converter = XcmConverter::new(&message, &network); + + let result = converter.convert(); + assert_eq!(result.err(), Some(XcmConverterError::DepositAssetExpected)); +} + +#[test] +fn xcm_converter_convert_without_assets_yields_no_reserve_assets() { + let network = BridgedNetwork::get(); + + let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); + + let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); + + let assets: MultiAssets = vec![].into(); + let filter: MultiAssetFilter = assets.clone().into(); + + let fee = MultiAsset { + id: Concrete(X1(AccountKey20 { network: None, key: token_address }).into()), + fun: Fungible(1000), + }; + + let message: Xcm<()> = vec![ + WithdrawAsset(assets.clone()), + ClearOrigin, + BuyExecution { fees: fee, weight_limit: Unlimited }, + DepositAsset { + assets: filter, + beneficiary: X1(AccountKey20 { network: None, key: beneficiary_address }).into(), + }, + SetTopic([0; 32]), + ] + .into(); + let mut converter = XcmConverter::new(&message, &network); + + let result = converter.convert(); + assert_eq!(result.err(), Some(XcmConverterError::NoReserveAssets)); +} + +#[test] +fn xcm_converter_convert_with_two_assets_yields_too_many_assets() { + let network = BridgedNetwork::get(); + + let token_address_1: [u8; 20] = hex!("1000000000000000000000000000000000000000"); + let token_address_2: [u8; 20] = hex!("1100000000000000000000000000000000000000"); + let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); + + let assets: MultiAssets = vec![ + MultiAsset { + id: Concrete(X1(AccountKey20 { network: None, key: token_address_1 }).into()), + fun: Fungible(1000), + }, + MultiAsset { + id: Concrete(X1(AccountKey20 { network: None, key: token_address_2 }).into()), + fun: Fungible(500), + }, + ] + .into(); + let filter: MultiAssetFilter = assets.clone().into(); + + let message: Xcm<()> = vec![ + WithdrawAsset(assets.clone()), + ClearOrigin, + BuyExecution { fees: assets.get(0).unwrap().clone(), weight_limit: Unlimited }, + DepositAsset { + assets: filter, + beneficiary: X1(AccountKey20 { network: None, key: beneficiary_address }).into(), + }, + SetTopic([0; 32]), + ] + .into(); + let mut converter = XcmConverter::new(&message, &network); + + let result = converter.convert(); + assert_eq!(result.err(), Some(XcmConverterError::TooManyAssets)); +} + +#[test] +fn xcm_converter_convert_without_consuming_filter_yields_filter_does_not_consume_all_assets() { + let network = BridgedNetwork::get(); + + let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); + let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); + + let assets: MultiAssets = vec![MultiAsset { + id: Concrete(X1(AccountKey20 { network: None, key: token_address }).into()), + fun: Fungible(1000), + }] + .into(); + let filter: MultiAssetFilter = Wild(WildMultiAsset::AllCounted(0)); + + let message: Xcm<()> = vec![ + WithdrawAsset(assets.clone()), + ClearOrigin, + BuyExecution { fees: assets.get(0).unwrap().clone(), weight_limit: Unlimited }, + DepositAsset { + assets: filter, + beneficiary: X1(AccountKey20 { network: None, key: beneficiary_address }).into(), + }, + SetTopic([0; 32]), + ] + .into(); + let mut converter = XcmConverter::new(&message, &network); + + let result = converter.convert(); + assert_eq!(result.err(), Some(XcmConverterError::FilterDoesNotConsumeAllAssets)); +} + +#[test] +fn xcm_converter_convert_with_zero_amount_asset_yields_zero_asset_transfer() { + let network = BridgedNetwork::get(); + + let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); + let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); + + let assets: MultiAssets = vec![MultiAsset { + id: Concrete(X1(AccountKey20 { network: None, key: token_address }).into()), + fun: Fungible(0), + }] + .into(); + let filter: MultiAssetFilter = Wild(WildMultiAsset::AllCounted(1)); + + let message: Xcm<()> = vec![ + WithdrawAsset(assets.clone()), + ClearOrigin, + BuyExecution { fees: assets.get(0).unwrap().clone(), weight_limit: Unlimited }, + DepositAsset { + assets: filter, + beneficiary: X1(AccountKey20 { network: None, key: beneficiary_address }).into(), + }, + SetTopic([0; 32]), + ] + .into(); + let mut converter = XcmConverter::new(&message, &network); + + let result = converter.convert(); + assert_eq!(result.err(), Some(XcmConverterError::ZeroAssetTransfer)); +} + +#[test] +fn xcm_converter_convert_non_ethereum_asset_yields_asset_resolution_failed() { + let network = BridgedNetwork::get(); + + let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); + + let assets: MultiAssets = vec![MultiAsset { + id: Concrete(X3(GlobalConsensus(Polkadot), Parachain(1000), GeneralIndex(0)).into()), + fun: Fungible(1000), + }] + .into(); + let filter: MultiAssetFilter = Wild(WildMultiAsset::AllCounted(1)); + + let message: Xcm<()> = vec![ + WithdrawAsset(assets.clone()), + ClearOrigin, + BuyExecution { fees: assets.get(0).unwrap().clone(), weight_limit: Unlimited }, + DepositAsset { + assets: filter, + beneficiary: X1(AccountKey20 { network: None, key: beneficiary_address }).into(), + }, + SetTopic([0; 32]), + ] + .into(); + let mut converter = XcmConverter::new(&message, &network); + + let result = converter.convert(); + assert_eq!(result.err(), Some(XcmConverterError::AssetResolutionFailed)); +} + +#[test] +fn xcm_converter_convert_non_ethereum_chain_asset_yields_asset_resolution_failed() { + let network = BridgedNetwork::get(); + + let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); + let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); + + let assets: MultiAssets = vec![MultiAsset { + id: Concrete( + X1(AccountKey20 { network: Some(Ethereum { chain_id: 2 }), key: token_address }).into(), + ), + fun: Fungible(1000), + }] + .into(); + let filter: MultiAssetFilter = Wild(WildMultiAsset::AllCounted(1)); + + let message: Xcm<()> = vec![ + WithdrawAsset(assets.clone()), + ClearOrigin, + BuyExecution { fees: assets.get(0).unwrap().clone(), weight_limit: Unlimited }, + DepositAsset { + assets: filter, + beneficiary: X1(AccountKey20 { network: None, key: beneficiary_address }).into(), + }, + SetTopic([0; 32]), + ] + .into(); + let mut converter = XcmConverter::new(&message, &network); + + let result = converter.convert(); + assert_eq!(result.err(), Some(XcmConverterError::AssetResolutionFailed)); +} + +#[test] +fn xcm_converter_convert_non_ethereum_chain_yields_asset_resolution_failed() { + let network = BridgedNetwork::get(); + + let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); + let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); + + let assets: MultiAssets = vec![MultiAsset { + id: Concrete( + X1(AccountKey20 { network: Some(NonBridgedNetwork::get()), key: token_address }).into(), + ), + fun: Fungible(1000), + }] + .into(); + let filter: MultiAssetFilter = Wild(WildMultiAsset::AllCounted(1)); + + let message: Xcm<()> = vec![ + WithdrawAsset(assets.clone()), + ClearOrigin, + BuyExecution { fees: assets.get(0).unwrap().clone(), weight_limit: Unlimited }, + DepositAsset { + assets: filter, + beneficiary: X1(AccountKey20 { network: None, key: beneficiary_address }).into(), + }, + SetTopic([0; 32]), + ] + .into(); + let mut converter = XcmConverter::new(&message, &network); + + let result = converter.convert(); + assert_eq!(result.err(), Some(XcmConverterError::AssetResolutionFailed)); +} + +#[test] +fn xcm_converter_convert_with_non_ethereum_beneficiary_yields_beneficiary_resolution_failed() { + let network = BridgedNetwork::get(); + + let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); + + let beneficiary_address: [u8; 32] = + hex!("2000000000000000000000000000000000000000000000000000000000000000"); + + let assets: MultiAssets = vec![MultiAsset { + id: Concrete(X1(AccountKey20 { network: None, key: token_address }).into()), + fun: Fungible(1000), + }] + .into(); + let filter: MultiAssetFilter = Wild(WildMultiAsset::AllCounted(1)); + let message: Xcm<()> = vec![ + WithdrawAsset(assets.clone()), + ClearOrigin, + BuyExecution { fees: assets.get(0).unwrap().clone(), weight_limit: Unlimited }, + DepositAsset { + assets: filter, + beneficiary: X3( + GlobalConsensus(Polkadot), + Parachain(1000), + AccountId32 { network: Some(Polkadot), id: beneficiary_address }, + ) + .into(), + }, + SetTopic([0; 32]), + ] + .into(); + let mut converter = XcmConverter::new(&message, &network); + + let result = converter.convert(); + assert_eq!(result.err(), Some(XcmConverterError::BeneficiaryResolutionFailed)); +} + +#[test] +fn xcm_converter_convert_with_non_ethereum_chain_beneficiary_yields_beneficiary_resolution_failed() +{ + let network = BridgedNetwork::get(); + + let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); + let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); + + let assets: MultiAssets = vec![MultiAsset { + id: Concrete(X1(AccountKey20 { network: None, key: token_address }).into()), + fun: Fungible(1000), + }] + .into(); + let filter: MultiAssetFilter = Wild(WildMultiAsset::AllCounted(1)); + + let message: Xcm<()> = vec![ + WithdrawAsset(assets.clone()), + ClearOrigin, + BuyExecution { fees: assets.get(0).unwrap().clone(), weight_limit: Unlimited }, + DepositAsset { + assets: filter, + beneficiary: X1(AccountKey20 { + network: Some(Ethereum { chain_id: 2 }), + key: beneficiary_address, + }) + .into(), + }, + SetTopic([0; 32]), + ] + .into(); + let mut converter = XcmConverter::new(&message, &network); + + let result = converter.convert(); + assert_eq!(result.err(), Some(XcmConverterError::BeneficiaryResolutionFailed)); +} + +#[test] +fn test_describe_asset_hub() { + let legacy_location: MultiLocation = + MultiLocation { parents: 0, interior: X1(Parachain(1000)) }; + let legacy_agent_id = AgentIdOf::convert_location(&legacy_location).unwrap(); + assert_eq!( + legacy_agent_id, + hex!("72456f48efed08af20e5b317abf8648ac66e86bb90a411d9b0b713f7364b75b4").into() + ); + let location: MultiLocation = MultiLocation { parents: 1, interior: X1(Parachain(1000)) }; + let agent_id = AgentIdOf::convert_location(&location).unwrap(); + assert_eq!( + agent_id, + hex!("81c5ab2571199e3188135178f3c2c8e2d268be1313d029b30f534fa579b69b79").into() + ) +} + +#[test] +fn test_describe_here() { + let location: MultiLocation = MultiLocation { parents: 0, interior: Here }; + let agent_id = AgentIdOf::convert_location(&location).unwrap(); + assert_eq!( + agent_id, + hex!("03170a2e7597b7b7e3d84c05391d139a62b157e78786d8c082f29dcf4c111314").into() + ) +} diff --git a/bridges/snowbridge/parachain/runtime/rococo-common/Cargo.toml b/bridges/snowbridge/parachain/runtime/rococo-common/Cargo.toml new file mode 100644 index 00000000000..656ed6de26e --- /dev/null +++ b/bridges/snowbridge/parachain/runtime/rococo-common/Cargo.toml @@ -0,0 +1,26 @@ +[package] +name = "snowbridge-rococo-common" +description = "Snowbridge Rococo Common" +version = "0.0.1" +authors = ["Snowfork "] +edition = "2021" +license = "Apache-2.0" + +[dependencies] +log = { version = "0.4.20", default-features = false } + +frame-support = { path = "../../../../../substrate/frame/support", default-features = false } +xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } + +[dev-dependencies] + +[features] +default = ["std"] +std = [ + "frame-support/std", + "log/std", + "xcm/std", +] +runtime-benchmarks = [ + "frame-support/runtime-benchmarks", +] diff --git a/bridges/snowbridge/parachain/runtime/rococo-common/src/lib.rs b/bridges/snowbridge/parachain/runtime/rococo-common/src/lib.rs new file mode 100644 index 00000000000..97f0332fe66 --- /dev/null +++ b/bridges/snowbridge/parachain/runtime/rococo-common/src/lib.rs @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +//! # Rococo Common +//! +//! Config used for the Rococo asset hub and bridge hub runtimes. +#![cfg_attr(not(feature = "std"), no_std)] + +use frame_support::parameter_types; +use xcm::opaque::lts::NetworkId; + +pub const INBOUND_QUEUE_MESSAGES_PALLET_INDEX: u8 = 80; + +parameter_types! { + // Network and location for the Ethereum chain. + pub EthereumNetwork: NetworkId = NetworkId::Ethereum { chain_id: 11155111 }; +} diff --git a/bridges/snowbridge/parachain/runtime/runtime-common/Cargo.toml b/bridges/snowbridge/parachain/runtime/runtime-common/Cargo.toml new file mode 100644 index 00000000000..b835152cac0 --- /dev/null +++ b/bridges/snowbridge/parachain/runtime/runtime-common/Cargo.toml @@ -0,0 +1,41 @@ +[package] +name = "snowbridge-runtime-common" +description = "Snowbridge Runtime Common" +version = "0.1.1" +authors = ["Snowfork "] +edition = "2021" +license = "Apache-2.0" + +[dependencies] +log = { version = "0.4.20", default-features = false } + +frame-support = { path = "../../../../../substrate/frame/support", default-features = false } +frame-system = { path = "../../../../../substrate/frame/system", default-features = false } +sp-arithmetic = { path = "../../../../../substrate/primitives/arithmetic", default-features = false } +xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } +xcm-builder = { package = "staging-xcm-builder", path = "../../../../../polkadot/xcm/xcm-builder", default-features = false } +xcm-executor = { package = "staging-xcm-executor", path = "../../../../../polkadot/xcm/xcm-executor", default-features = false } + +snowbridge-core = { path = "../../primitives/core", default-features = false } + +[dev-dependencies] + +[features] +default = ["std"] +std = [ + "frame-support/std", + "frame-system/std", + "log/std", + "snowbridge-core/std", + "sp-arithmetic/std", + "xcm-builder/std", + "xcm-executor/std", + "xcm/std", +] +runtime-benchmarks = [ + "frame-support/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "snowbridge-core/runtime-benchmarks", + "xcm-builder/runtime-benchmarks", + "xcm-executor/runtime-benchmarks", +] diff --git a/bridges/snowbridge/parachain/runtime/runtime-common/src/lib.rs b/bridges/snowbridge/parachain/runtime/runtime-common/src/lib.rs new file mode 100644 index 00000000000..b7f54d262bb --- /dev/null +++ b/bridges/snowbridge/parachain/runtime/runtime-common/src/lib.rs @@ -0,0 +1,129 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork +//! # Runtime Common +//! +//! Common traits and types shared by runtimes. +#![cfg_attr(not(feature = "std"), no_std)] + +use core::marker::PhantomData; +use frame_support::traits::Get; +use snowbridge_core::{outbound::SendMessageFeeProvider, sibling_sovereign_account_raw}; +use sp_arithmetic::traits::{BaseArithmetic, Unsigned}; +use xcm::prelude::*; +use xcm_builder::{deposit_or_burn_fee, HandleFee}; +use xcm_executor::traits::{FeeReason, TransactAsset}; + +/// A `HandleFee` implementation that takes fees from `ExportMessage` XCM instructions +/// to Snowbridge and splits off the remote fee and deposits it to the origin +/// parachain sovereign account. The local fee is then returned back to be handled by +/// the next fee handler in the chain. Most likely the treasury account. +pub struct XcmExportFeeToSibling< + Balance, + AccountId, + FeeAssetLocation, + EthereumNetwork, + AssetTransactor, + FeeProvider, +>( + PhantomData<( + Balance, + AccountId, + FeeAssetLocation, + EthereumNetwork, + AssetTransactor, + FeeProvider, + )>, +); + +impl HandleFee + for XcmExportFeeToSibling< + Balance, + AccountId, + FeeAssetLocation, + EthereumNetwork, + AssetTransactor, + FeeProvider, + > where + Balance: BaseArithmetic + Unsigned + Copy + From + Into, + AccountId: Clone + Into<[u8; 32]> + From<[u8; 32]>, + FeeAssetLocation: Get, + EthereumNetwork: Get, + AssetTransactor: TransactAsset, + FeeProvider: SendMessageFeeProvider, +{ + fn handle_fee( + fees: MultiAssets, + context: Option<&XcmContext>, + reason: FeeReason, + ) -> MultiAssets { + let token_location = FeeAssetLocation::get(); + + // Check the reason to see if this export is for snowbridge. + if !matches!( + reason, + FeeReason::Export { network: bridged_network, destination } + if bridged_network == EthereumNetwork::get() && destination == Here + ) { + return fees + } + + // Get the parachain sovereign from the `context`. + let para_sovereign = if let Some(XcmContext { + origin: Some(MultiLocation { parents: 1, interior }), + .. + }) = context + { + if let Some(Parachain(sibling_para_id)) = interior.first() { + let account: AccountId = + sibling_sovereign_account_raw((*sibling_para_id).into()).into(); + account + } else { + return fees + } + } else { + return fees + }; + + // Get the total fee offered by export message. + let maybe_total_supplied_fee: Option<(usize, Balance)> = fees + .inner() + .iter() + .enumerate() + .filter_map(|(index, asset)| { + if let MultiAsset { id: Concrete(location), fun: Fungible(amount) } = asset { + if *location == token_location { + return Some((index, (*amount).into())) + } + } + None + }) + .next(); + + if let Some((fee_index, total_fee)) = maybe_total_supplied_fee { + let remote_fee = total_fee.saturating_sub(FeeProvider::local_fee()); + if remote_fee > (0u128).into() { + // Refund remote component of fee to physical origin + deposit_or_burn_fee::( + MultiAsset { id: Concrete(token_location), fun: Fungible(remote_fee.into()) } + .into(), + context, + para_sovereign, + ); + // Return remaining fee to the next fee handler in the chain. + let mut modified_fees = fees.inner().clone(); + modified_fees.remove(fee_index); + modified_fees.push(MultiAsset { + id: Concrete(token_location), + fun: Fungible((total_fee - remote_fee).into()), + }); + return modified_fees.into() + } + } + + log::info!( + target: "xcm::fees", + "XcmExportFeeToSibling skipped: {fees:?}, context: {context:?}, reason: {reason:?}", + ); + fees + } +} diff --git a/bridges/snowbridge/parachain/runtime/tests/Cargo.toml b/bridges/snowbridge/parachain/runtime/tests/Cargo.toml new file mode 100644 index 00000000000..da1fe878d93 --- /dev/null +++ b/bridges/snowbridge/parachain/runtime/tests/Cargo.toml @@ -0,0 +1,244 @@ +[package] +name = "snowbridge-runtime-tests" +description = "Snowbridge Runtime Tests" +version = "0.1.0" +authors = ["Snowfork "] +edition = "2021" +license = "Apache-2.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } +hex-literal = { version = "0.4.1" } +log = { version = "0.4.20", default-features = false } +scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +serde = { version = "1.0.188", optional = true, features = ["derive"] } +smallvec = "1.11.0" + +# Substrate +frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking", default-features = false, optional = true } +frame-executive = { path = "../../../../../substrate/frame/executive", default-features = false } +frame-support = { path = "../../../../../substrate/frame/support", default-features = false } +frame-system = { path = "../../../../../substrate/frame/system", default-features = false } +frame-system-benchmarking = { path = "../../../../../substrate/frame/system/benchmarking", default-features = false, optional = true } +frame-system-rpc-runtime-api = { path = "../../../../../substrate/frame/system/rpc/runtime-api", default-features = false } +frame-try-runtime = { path = "../../../../../substrate/frame/try-runtime", default-features = false, optional = true } +pallet-aura = { path = "../../../../../substrate/frame/aura", default-features = false } +pallet-authorship = { path = "../../../../../substrate/frame/authorship", default-features = false } +pallet-balances = { path = "../../../../../substrate/frame/balances", default-features = false } +pallet-session = { path = "../../../../../substrate/frame/session", default-features = false } +pallet-multisig = { path = "../../../../../substrate/frame/multisig", default-features = false } +pallet-message-queue = { path = "../../../../../substrate/frame/message-queue", default-features = false } +pallet-timestamp = { path = "../../../../../substrate/frame/timestamp", default-features = false } +pallet-transaction-payment = { path = "../../../../../substrate/frame/transaction-payment", default-features = false } +pallet-transaction-payment-rpc-runtime-api = { path = "../../../../../substrate/frame/transaction-payment/rpc/runtime-api", default-features = false } +pallet-utility = { path = "../../../../../substrate/frame/utility", default-features = false } +sp-api = { path = "../../../../../substrate/primitives/api", default-features = false } +sp-block-builder = { path = "../../../../../substrate/primitives/block-builder", default-features = false } +sp-consensus-aura = { path = "../../../../../substrate/primitives/consensus/aura", default-features = false } +sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } +sp-genesis-builder = { path = "../../../../../substrate/primitives/genesis-builder", default-features = false } +sp-inherents = { path = "../../../../../substrate/primitives/inherents", default-features = false } +sp-io = { path = "../../../../../substrate/primitives/io", default-features = false } +sp-offchain = { path = "../../../../../substrate/primitives/offchain", default-features = false } +sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-features = false } +sp-session = { path = "../../../../../substrate/primitives/session", default-features = false } +sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } +sp-storage = { path = "../../../../../substrate/primitives/storage", default-features = false } +sp-transaction-pool = { path = "../../../../../substrate/primitives/transaction-pool", default-features = false } +sp-version = { path = "../../../../../substrate/primitives/version", default-features = false } + +# Polkadot +rococo-runtime-constants = { path = "../../../../../polkadot/runtime/rococo/constants", default-features = false } +pallet-xcm = { path = "../../../../../polkadot/xcm/pallet-xcm", default-features = false } +pallet-xcm-benchmarks = { path = "../../../../../polkadot/xcm/pallet-xcm-benchmarks", default-features = false, optional = true } +polkadot-core-primitives = { path = "../../../../../polkadot/core-primitives", default-features = false } +polkadot-parachain-primitives = { path = "../../../../../polkadot/parachain", default-features = false } +polkadot-runtime-common = { path = "../../../../../polkadot/runtime/common", default-features = false } +xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } +xcm-builder = { package = "staging-xcm-builder", path = "../../../../../polkadot/xcm/xcm-builder", default-features = false } +xcm-executor = { package = "staging-xcm-executor", path = "../../../../../polkadot/xcm/xcm-executor", default-features = false } + +# Cumulus +cumulus-pallet-aura-ext = { path = "../../../../../cumulus/pallets/aura-ext", default-features = false } +cumulus-pallet-dmp-queue = { path = "../../../../../cumulus/pallets/dmp-queue", default-features = false } +cumulus-pallet-parachain-system = { path = "../../../../../cumulus/pallets/parachain-system", default-features = false, features = ["parameterized-consensus-hook"] } +cumulus-pallet-session-benchmarking = { path = "../../../../../cumulus/pallets/session-benchmarking", default-features = false } +cumulus-pallet-xcm = { path = "../../../../../cumulus/pallets/xcm", default-features = false } +cumulus-pallet-xcmp-queue = { path = "../../../../../cumulus/pallets/xcmp-queue", default-features = false, features = ["bridging"] } +cumulus-primitives-core = { path = "../../../../../cumulus/primitives/core", default-features = false } +cumulus-primitives-utility = { path = "../../../../../cumulus/primitives/utility", default-features = false } +pallet-collator-selection = { path = "../../../../../cumulus/pallets/collator-selection", default-features = false } +parachain-info = { package = "staging-parachain-info", path = "../../../../../cumulus/parachains/pallets/parachain-info", default-features = false } +parachains-common = { path = "../../../../../cumulus/parachains/common", default-features = false } +parachains-runtimes-test-utils = { path = "../../../../../cumulus/parachains/runtimes/test-utils", default-features = false } +bridge-hub-rococo-runtime = { path = "../../../../../cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo", default-features = false } +asset-hub-rococo-runtime = { path = "../../../../../cumulus/parachains/runtimes/assets/asset-hub-rococo", default-features = false } +assets-common = { path = "../../../../../cumulus/parachains/runtimes/assets/common", default-features = false } + +# Ethereum Bridge (Snowbridge) +snowbridge-core = { path = "../../primitives/core", default-features = false } +snowbridge-beacon-primitives = { path = "../../primitives/beacon", default-features = false } +snowbridge-router-primitives = { path = "../../primitives/router", default-features = false } +snowbridge-ethereum-beacon-client = { path = "../../pallets/ethereum-beacon-client", default-features = false } +snowbridge-inbound-queue = { path = "../../pallets/inbound-queue", default-features = false } +snowbridge-outbound-queue = { path = "../../pallets/outbound-queue", default-features = false } +snowbridge-outbound-queue-runtime-api = { path = "../../pallets/outbound-queue/runtime-api", default-features = false } +snowbridge-system = { path = "../../pallets/system", default-features = false } +snowbridge-system-runtime-api = { path = "../../pallets/system/runtime-api", default-features = false } + +[dev-dependencies] +static_assertions = "1.1" +bridge-hub-test-utils = { path = "../../../../../cumulus/parachains/runtimes/bridge-hubs/test-utils" } +bridge-runtime-common = { path = "../../../../../bridges/bin/runtime-common", features = ["integrity-test"] } +sp-keyring = { path = "../../../../../substrate/primitives/keyring" } + +[features] +default = ["std"] +std = [ + "asset-hub-rococo-runtime/std", + "assets-common/std", + "bridge-hub-rococo-runtime/std", + "codec/std", + "cumulus-pallet-aura-ext/std", + "cumulus-pallet-dmp-queue/std", + "cumulus-pallet-parachain-system/std", + "cumulus-pallet-session-benchmarking/std", + "cumulus-pallet-xcm/std", + "cumulus-pallet-xcmp-queue/std", + "cumulus-primitives-core/std", + "cumulus-primitives-utility/std", + "frame-benchmarking/std", + "frame-executive/std", + "frame-support/std", + "frame-system-benchmarking?/std", + "frame-system-rpc-runtime-api/std", + "frame-system/std", + "frame-try-runtime?/std", + "log/std", + "pallet-aura/std", + "pallet-authorship/std", + "pallet-balances/std", + "pallet-collator-selection/std", + "pallet-message-queue/std", + "pallet-multisig/std", + "pallet-session/std", + "pallet-timestamp/std", + "pallet-transaction-payment-rpc-runtime-api/std", + "pallet-transaction-payment/std", + "pallet-utility/std", + "pallet-xcm-benchmarks?/std", + "pallet-xcm/std", + "parachain-info/std", + "parachains-common/std", + "parachains-runtimes-test-utils/std", + "polkadot-core-primitives/std", + "polkadot-parachain-primitives/std", + "polkadot-runtime-common/std", + "rococo-runtime-constants/std", + "scale-info/std", + "serde", + "snowbridge-beacon-primitives/std", + "snowbridge-core/std", + "snowbridge-ethereum-beacon-client/std", + "snowbridge-inbound-queue/std", + "snowbridge-outbound-queue-runtime-api/std", + "snowbridge-outbound-queue/std", + "snowbridge-router-primitives/std", + "snowbridge-system-runtime-api/std", + "snowbridge-system/std", + "sp-api/std", + "sp-block-builder/std", + "sp-consensus-aura/std", + "sp-core/std", + "sp-genesis-builder/std", + "sp-inherents/std", + "sp-io/std", + "sp-offchain/std", + "sp-runtime/std", + "sp-session/std", + "sp-std/std", + "sp-storage/std", + "sp-transaction-pool/std", + "sp-version/std", + "xcm-builder/std", + "xcm-executor/std", + "xcm/std", +] + +runtime-benchmarks = [ + "asset-hub-rococo-runtime/runtime-benchmarks", + "assets-common/runtime-benchmarks", + "bridge-hub-rococo-runtime/runtime-benchmarks", + "bridge-runtime-common/runtime-benchmarks", + "cumulus-pallet-dmp-queue/runtime-benchmarks", + "cumulus-pallet-parachain-system/runtime-benchmarks", + "cumulus-pallet-session-benchmarking/runtime-benchmarks", + "cumulus-pallet-xcmp-queue/runtime-benchmarks", + "cumulus-primitives-core/runtime-benchmarks", + "cumulus-primitives-utility/runtime-benchmarks", + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system-benchmarking/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "pallet-balances/runtime-benchmarks", + "pallet-collator-selection/runtime-benchmarks", + "pallet-message-queue/runtime-benchmarks", + "pallet-multisig/runtime-benchmarks", + "pallet-timestamp/runtime-benchmarks", + "pallet-utility/runtime-benchmarks", + "pallet-xcm-benchmarks/runtime-benchmarks", + "pallet-xcm/runtime-benchmarks", + "parachains-common/runtime-benchmarks", + "polkadot-parachain-primitives/runtime-benchmarks", + "polkadot-runtime-common/runtime-benchmarks", + "snowbridge-core/runtime-benchmarks", + "snowbridge-ethereum-beacon-client/runtime-benchmarks", + "snowbridge-inbound-queue/runtime-benchmarks", + "snowbridge-outbound-queue/runtime-benchmarks", + "snowbridge-router-primitives/runtime-benchmarks", + "snowbridge-system/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", + "xcm-builder/runtime-benchmarks", + "xcm-executor/runtime-benchmarks", +] + +try-runtime = [ + "asset-hub-rococo-runtime/try-runtime", + "bridge-hub-rococo-runtime/try-runtime", + "cumulus-pallet-aura-ext/try-runtime", + "cumulus-pallet-dmp-queue/try-runtime", + "cumulus-pallet-parachain-system/try-runtime", + "cumulus-pallet-xcm/try-runtime", + "cumulus-pallet-xcmp-queue/try-runtime", + "frame-executive/try-runtime", + "frame-support/try-runtime", + "frame-system/try-runtime", + "frame-try-runtime/try-runtime", + "pallet-aura/try-runtime", + "pallet-authorship/try-runtime", + "pallet-balances/try-runtime", + "pallet-collator-selection/try-runtime", + "pallet-message-queue/try-runtime", + "pallet-multisig/try-runtime", + "pallet-session/try-runtime", + "pallet-timestamp/try-runtime", + "pallet-transaction-payment/try-runtime", + "pallet-utility/try-runtime", + "pallet-xcm/try-runtime", + "parachain-info/try-runtime", + "polkadot-runtime-common/try-runtime", + "snowbridge-ethereum-beacon-client/try-runtime", + "snowbridge-inbound-queue/try-runtime", + "snowbridge-outbound-queue/try-runtime", + "snowbridge-system/try-runtime", + "sp-runtime/try-runtime", +] +beacon-spec-mainnet = [ + "snowbridge-ethereum-beacon-client/beacon-spec-mainnet", +] +experimental = ["pallet-aura/experimental"] + +# A feature that should be enabled when the runtime should be built for on-chain +# deployment. This will disable stuff that shouldn't be part of the on-chain wasm +# to make it smaller like logging for example. +on-chain-release-build = ["sp-api/disable-logging"] diff --git a/bridges/snowbridge/parachain/runtime/tests/src/lib.rs b/bridges/snowbridge/parachain/runtime/tests/src/lib.rs new file mode 100644 index 00000000000..9a5d12e2892 --- /dev/null +++ b/bridges/snowbridge/parachain/runtime/tests/src/lib.rs @@ -0,0 +1,94 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork + +#![cfg(test)] + +mod test_cases; + +use asset_hub_rococo_runtime::xcm_config::bridging::to_ethereum::DefaultBridgeHubEthereumBaseFee; +use bridge_hub_rococo_runtime::{ + xcm_config::XcmConfig, MessageQueueServiceWeight, Runtime, RuntimeEvent, SessionKeys, +}; +use codec::Decode; +use cumulus_primitives_core::XcmError::{FailedToTransactAsset, NotHoldingFees}; +use parachains_common::{AccountId, AuraId}; +use snowbridge_ethereum_beacon_client::WeightInfo; +use sp_core::H160; +use sp_keyring::AccountKeyring::Alice; + +pub fn collator_session_keys() -> bridge_hub_test_utils::CollatorSessionKeys { + bridge_hub_test_utils::CollatorSessionKeys::new( + AccountId::from(Alice), + AccountId::from(Alice), + SessionKeys { aura: AuraId::from(Alice.public()) }, + ) +} + +#[test] +pub fn transfer_token_to_ethereum_works() { + test_cases::send_transfer_token_message_success::( + collator_session_keys(), + 1013, + 1000, + H160::random(), + H160::random(), + DefaultBridgeHubEthereumBaseFee::get(), + Box::new(|runtime_event_encoded: Vec| { + match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) { + Ok(RuntimeEvent::EthereumOutboundQueue(event)) => Some(event), + _ => None, + } + }), + ) +} + +#[test] +pub fn unpaid_transfer_token_to_ethereum_fails_with_barrier() { + test_cases::send_unpaid_transfer_token_message::( + collator_session_keys(), + 1013, + 1000, + H160::random(), + H160::random(), + ) +} + +#[test] +pub fn transfer_token_to_ethereum_fee_not_enough() { + test_cases::send_transfer_token_message_failure::( + collator_session_keys(), + 1013, + 1000, + DefaultBridgeHubEthereumBaseFee::get() + 1_000_000_000, + H160::random(), + H160::random(), + // fee not enough + 1_000_000_000, + NotHoldingFees, + ) +} + +#[test] +pub fn transfer_token_to_ethereum_insufficient_fund() { + test_cases::send_transfer_token_message_failure::( + collator_session_keys(), + 1013, + 1000, + 1_000_000_000, + H160::random(), + H160::random(), + DefaultBridgeHubEthereumBaseFee::get(), + FailedToTransactAsset("InsufficientBalance"), + ) +} + +#[test] +fn max_message_queue_service_weight_is_more_than_beacon_extrinsic_weights() { + let max_message_queue_weight = MessageQueueServiceWeight::get(); + let force_checkpoint = + ::WeightInfo::force_checkpoint(); + let submit_checkpoint = + ::WeightInfo::submit(); + max_message_queue_weight.all_gt(force_checkpoint); + max_message_queue_weight.all_gt(submit_checkpoint); +} diff --git a/bridges/snowbridge/parachain/runtime/tests/src/test_cases.rs b/bridges/snowbridge/parachain/runtime/tests/src/test_cases.rs new file mode 100644 index 00000000000..19e45f7a15a --- /dev/null +++ b/bridges/snowbridge/parachain/runtime/tests/src/test_cases.rs @@ -0,0 +1,293 @@ +// SPDX-License-Identifier: Apache-2.0 +// SPDX-FileCopyrightText: 2023 Snowfork + +//! Module contains predefined test-case scenarios for `Runtime` with bridging capabilities. + +use asset_hub_rococo_runtime::xcm_config::bridging::to_ethereum::DefaultBridgeHubEthereumBaseFee; +use bridge_hub_rococo_runtime::EthereumSystem; +use codec::Encode; +use frame_support::{assert_err, assert_ok, traits::fungible::Mutate}; +use parachains_runtimes_test_utils::{ + AccountIdOf, BalanceOf, CollatorSessionKeys, ExtBuilder, ValidatorIdOf, XcmReceivedFrom, +}; +use sp_core::H160; +use sp_runtime::SaturatedConversion; +use xcm::latest::prelude::*; +use xcm_executor::XcmExecutor; +// Re-export test_case from `parachains-runtimes-test-utils` +pub use parachains_runtimes_test_utils::test_cases::change_storage_constant_by_governance_works; +use xcm::v3::Error::{self, Barrier}; + +type RuntimeHelper = + parachains_runtimes_test_utils::RuntimeHelper; + +pub fn initial_fund(assethub_parachain_id: u32, initial_amount: u128) +where + Runtime: frame_system::Config + pallet_balances::Config, +{ + // fund asset hub sovereign account enough so it can pay fees + let asset_hub_sovereign_account = + snowbridge_core::sibling_sovereign_account::(assethub_parachain_id.into()); + >::mint_into( + &asset_hub_sovereign_account, + initial_amount.saturated_into::>(), + ) + .unwrap(); +} + +pub fn send_transfer_token_message( + assethub_parachain_id: u32, + weth_contract_address: H160, + destination_address: H160, + fee_amount: u128, +) -> Outcome +where + Runtime: frame_system::Config + + pallet_balances::Config + + pallet_session::Config + + pallet_xcm::Config + + parachain_info::Config + + pallet_collator_selection::Config + + cumulus_pallet_parachain_system::Config + + snowbridge_outbound_queue::Config, + XcmConfig: xcm_executor::Config, +{ + let assethub_parachain_location = MultiLocation::new(1, Parachain(assethub_parachain_id)); + let asset = MultiAsset { + id: Concrete(MultiLocation { + parents: 0, + interior: X1(AccountKey20 { network: None, key: weth_contract_address.into() }), + }), + fun: Fungible(1000000000), + }; + let assets = vec![asset.clone()]; + + let inner_xcm = Xcm(vec![ + WithdrawAsset(MultiAssets::from(assets.clone())), + ClearOrigin, + BuyExecution { fees: asset, weight_limit: Unlimited }, + DepositAsset { + assets: Wild(All), + beneficiary: MultiLocation { + parents: 0, + interior: X1(AccountKey20 { network: None, key: destination_address.into() }), + }, + }, + SetTopic([0; 32]), + ]); + + let fee = MultiAsset { + id: Concrete(MultiLocation { parents: 1, interior: Here }), + fun: Fungible(fee_amount), + }; + + // prepare transfer token message + let xcm = Xcm(vec![ + WithdrawAsset(MultiAssets::from(vec![fee.clone()])), + BuyExecution { fees: fee, weight_limit: Unlimited }, + ExportMessage { + network: Ethereum { chain_id: 11155111 }, + destination: Here, + xcm: inner_xcm, + }, + ]); + + // execute XCM + let hash = xcm.using_encoded(sp_io::hashing::blake2_256); + XcmExecutor::::execute_xcm( + assethub_parachain_location, + xcm, + hash, + RuntimeHelper::::xcm_max_weight(XcmReceivedFrom::Sibling), + ) +} + +pub fn send_transfer_token_message_success( + collator_session_key: CollatorSessionKeys, + runtime_para_id: u32, + assethub_parachain_id: u32, + weth_contract_address: H160, + destination_address: H160, + fee_amount: u128, + snowbridge_outbound_queue: Box< + dyn Fn(Vec) -> Option>, + >, +) where + Runtime: frame_system::Config + + pallet_balances::Config + + pallet_session::Config + + pallet_xcm::Config + + parachain_info::Config + + pallet_collator_selection::Config + + cumulus_pallet_parachain_system::Config + + snowbridge_outbound_queue::Config + + snowbridge_system::Config, + XcmConfig: xcm_executor::Config, + ValidatorIdOf: From>, +{ + ExtBuilder::::default() + .with_collators(collator_session_key.collators()) + .with_session_keys(collator_session_key.session_keys()) + .with_para_id(runtime_para_id.into()) + .with_tracing() + .build() + .execute_with(|| { + EthereumSystem::initialize(runtime_para_id.into(), assethub_parachain_id.into()) + .unwrap(); + + // fund asset hub sovereign account enough so it can pay fees + initial_fund::( + assethub_parachain_id, + DefaultBridgeHubEthereumBaseFee::get() + 1_000_000_000, + ); + + let outcome = send_transfer_token_message::( + assethub_parachain_id, + weth_contract_address, + destination_address, + fee_amount, + ); + + assert_ok!(outcome.ensure_complete()); + + // check events + let mut events = >::events() + .into_iter() + .filter_map(|e| snowbridge_outbound_queue(e.event.encode())); + assert!( + events.any(|e| matches!(e, snowbridge_outbound_queue::Event::MessageQueued { .. })) + ); + }); +} + +pub fn send_unpaid_transfer_token_message( + collator_session_key: CollatorSessionKeys, + runtime_para_id: u32, + assethub_parachain_id: u32, + weth_contract_address: H160, + destination_contract: H160, +) where + Runtime: frame_system::Config + + pallet_balances::Config + + pallet_session::Config + + pallet_xcm::Config + + parachain_info::Config + + pallet_collator_selection::Config + + cumulus_pallet_parachain_system::Config + + snowbridge_outbound_queue::Config, + XcmConfig: xcm_executor::Config, + ValidatorIdOf: From>, +{ + let assethub_parachain_location = MultiLocation::new(1, Parachain(assethub_parachain_id)); + + ExtBuilder::::default() + .with_collators(collator_session_key.collators()) + .with_session_keys(collator_session_key.session_keys()) + .with_para_id(runtime_para_id.into()) + .with_tracing() + .build() + .execute_with(|| { + let asset_hub_sovereign_account = + snowbridge_core::sibling_sovereign_account::(assethub_parachain_id.into()); + + >::mint_into( + &asset_hub_sovereign_account, + 4000000000u32.into(), + ) + .unwrap(); + + let asset = MultiAsset { + id: Concrete(MultiLocation { + parents: 0, + interior: X1(AccountKey20 { network: None, key: weth_contract_address.into() }), + }), + fun: Fungible(1000000000), + }; + let assets = vec![asset.clone()]; + + let inner_xcm = Xcm(vec![ + WithdrawAsset(MultiAssets::from(assets.clone())), + ClearOrigin, + BuyExecution { fees: asset, weight_limit: Unlimited }, + DepositAsset { + assets: Wild(AllCounted(1)), + beneficiary: MultiLocation { + parents: 0, + interior: X1(AccountKey20 { + network: None, + key: destination_contract.into(), + }), + }, + }, + SetTopic([0; 32]), + ]); + + // prepare transfer token message + let xcm = Xcm(vec![ + UnpaidExecution { weight_limit: Unlimited, check_origin: None }, + ExportMessage { + network: Ethereum { chain_id: 11155111 }, + destination: Here, + xcm: inner_xcm, + }, + ]); + + // execute XCM + let hash = xcm.using_encoded(sp_io::hashing::blake2_256); + let outcome = XcmExecutor::::execute_xcm( + assethub_parachain_location, + xcm, + hash, + RuntimeHelper::::xcm_max_weight(XcmReceivedFrom::Sibling), + ); + // check error is barrier + assert_err!(outcome.ensure_complete(), Barrier); + }); +} + +#[allow(clippy::too_many_arguments)] +pub fn send_transfer_token_message_failure( + collator_session_key: CollatorSessionKeys, + runtime_para_id: u32, + assethub_parachain_id: u32, + initial_amount: u128, + weth_contract_address: H160, + destination_address: H160, + fee_amount: u128, + expected_error: Error, +) where + Runtime: frame_system::Config + + pallet_balances::Config + + pallet_session::Config + + pallet_xcm::Config + + parachain_info::Config + + pallet_collator_selection::Config + + cumulus_pallet_parachain_system::Config + + snowbridge_outbound_queue::Config + + snowbridge_system::Config, + XcmConfig: xcm_executor::Config, + ValidatorIdOf: From>, +{ + ExtBuilder::::default() + .with_collators(collator_session_key.collators()) + .with_session_keys(collator_session_key.session_keys()) + .with_para_id(runtime_para_id.into()) + .with_tracing() + .build() + .execute_with(|| { + EthereumSystem::initialize(runtime_para_id.into(), assethub_parachain_id.into()) + .unwrap(); + + // fund asset hub sovereign account enough so it can pay fees + initial_fund::(assethub_parachain_id, initial_amount); + + let outcome = send_transfer_token_message::( + assethub_parachain_id, + weth_contract_address, + destination_address, + fee_amount, + ); + // check err is NotHoldingFees + assert_err!(outcome.ensure_complete(), expected_error); + }); +} diff --git a/bridges/snowbridge/parachain/scripts/benchmark.sh b/bridges/snowbridge/parachain/scripts/benchmark.sh new file mode 100755 index 00000000000..c47649b2eeb --- /dev/null +++ b/bridges/snowbridge/parachain/scripts/benchmark.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +# Example command for updating pallet benchmarking +pushd ../cumulus +cargo run --release --bin polkadot-parachain \ +--features runtime-benchmarks \ +-- \ +benchmark pallet \ +--chain=bridge-hub-rococo-dev \ +--pallet=snowbridge_ethereum_beacon_client \ +--extrinsic="*" \ +--execution=wasm --wasm-execution=compiled \ +--steps 50 --repeat 20 \ +--output ./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_ethereum_beacon_client.rs +popd diff --git a/bridges/snowbridge/parachain/scripts/hexliteral.sh b/bridges/snowbridge/parachain/scripts/hexliteral.sh new file mode 100755 index 00000000000..e34a2b9b515 --- /dev/null +++ b/bridges/snowbridge/parachain/scripts/hexliteral.sh @@ -0,0 +1,5 @@ +#!/bin/bash +# Creates a string constant from STDIN +echo "const DATA: &'static str = concat!(" +cat - | fold | sed 's/^.*/\t"&",/' +echo ");" \ No newline at end of file diff --git a/bridges/snowbridge/parachain/scripts/init.sh b/bridges/snowbridge/parachain/scripts/init.sh new file mode 100755 index 00000000000..1405a41ef33 --- /dev/null +++ b/bridges/snowbridge/parachain/scripts/init.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +set -e + +echo "*** Initializing WASM build environment" + +if [ -z $CI_PROJECT_NAME ] ; then + rustup update nightly + rustup update stable +fi + +rustup target add wasm32-unknown-unknown --toolchain nightly diff --git a/bridges/snowbridge/parachain/scripts/make-build-config.sh b/bridges/snowbridge/parachain/scripts/make-build-config.sh new file mode 100755 index 00000000000..a1b116a5dd0 --- /dev/null +++ b/bridges/snowbridge/parachain/scripts/make-build-config.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +cd ../ethereum + +truffle exec scripts/dumpParachainConfig.js | sed '/^Using/d;/^$/d' diff --git a/bridges/snowbridge/parachain/scripts/verify-pallets-build.sh b/bridges/snowbridge/parachain/scripts/verify-pallets-build.sh new file mode 100755 index 00000000000..f060cf958b7 --- /dev/null +++ b/bridges/snowbridge/parachain/scripts/verify-pallets-build.sh @@ -0,0 +1,113 @@ +#!/bin/bash + +# A script to remove everything from snowbridge repository/subtree, except: +# +# - parachain +# - readme +# - license + +set -eu + +# show CLI help +function show_help() { + set +x + echo " " + echo Error: $1 + echo "Usage:" + echo " ./scripts/verify-pallets-build.sh Exit with code 0 if pallets code is well decoupled from the other code in the repo" + echo "Options:" + echo " --no-revert Leaves only runtime code on exit" + echo " --ignore-git-state Ignores git actual state" + exit 1 +} + +# parse CLI args +NO_REVERT= +IGNORE_GIT_STATE= +for i in "$@" +do + case $i in + --no-revert) + NO_REVERT=true + shift + ;; + --ignore-git-state) + IGNORE_GIT_STATE=true + shift + ;; + *) + show_help "Unknown option: $i" + ;; + esac +done + +# the script is able to work only on clean git copy, unless we want to ignore this check +[[ ! -z "${IGNORE_GIT_STATE}" ]] || [[ -z "$(git status --porcelain)" ]] || { echo >&2 "The git copy must be clean"; exit 1; } + +# let's avoid any restrictions on where this script can be called for - snowbridge repo may be +# plugged into any other repo folder. So the script (and other stuff that needs to be removed) +# may be located either in call dir, or one of it subdirs. +SNOWBRIDGE_FOLDER="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )/../.." + +# remove everything we think is not required for our needs +rm -rf $SNOWBRIDGE_FOLDER/.cargo +rm -rf $SNOWBRIDGE_FOLDER/.github +rm -rf $SNOWBRIDGE_FOLDER/contracts +rm -rf $SNOWBRIDGE_FOLDER/codecov.yml +rm -rf $SNOWBRIDGE_FOLDER/docs +rm -rf $SNOWBRIDGE_FOLDER/hooks +rm -rf $SNOWBRIDGE_FOLDER/relayer +rm -rf $SNOWBRIDGE_FOLDER/smoketest +rm -rf $SNOWBRIDGE_FOLDER/web +rm -rf $SNOWBRIDGE_FOLDER/.envrc-example +rm -rf $SNOWBRIDGE_FOLDER/.gitbook.yaml +rm -rf $SNOWBRIDGE_FOLDER/.gitignore +rm -rf $SNOWBRIDGE_FOLDER/.gitmodules +rm -rf $SNOWBRIDGE_FOLDER/_typos.toml +rm -rf $SNOWBRIDGE_FOLDER/_codecov.yml +rm -rf $SNOWBRIDGE_FOLDER/flake.lock +rm -rf $SNOWBRIDGE_FOLDER/flake.nix +rm -rf $SNOWBRIDGE_FOLDER/go.work +rm -rf $SNOWBRIDGE_FOLDER/go.work.sum +rm -rf $SNOWBRIDGE_FOLDER/polkadot-sdk +rm -rf $SNOWBRIDGE_FOLDER/rust-toolchain.toml +rm -rf $SNOWBRIDGE_FOLDER/parachain/rustfmt.toml +rm -rf $SNOWBRIDGE_FOLDER/parachain/.gitignore +rm -rf $SNOWBRIDGE_FOLDER/parachain/templates +rm -rf $SNOWBRIDGE_FOLDER/parachain/.config +rm -rf $SNOWBRIDGE_FOLDER/parachain/pallets/ethereum-beacon-client/fuzz + +cd bridges/snowbridge/parachain + +# fix polkadot-sdk paths in Cargo.toml files +find "." -name 'Cargo.toml' | while read -r file; do + replace=$(printf '../../' ) + if [[ "$(uname)" = "Darwin" ]] || [[ "$(uname)" = *BSD ]]; then + sed -i '' "s|polkadot-sdk/|$replace|g" "$file" + else + sed -i "s|polkadot-sdk/|$replace|g" "$file" + fi +done + +# let's test if everything we need compiles +cargo check -p snowbridge-ethereum-beacon-client +cargo check -p snowbridge-ethereum-beacon-client --features runtime-benchmarks +cargo check -p snowbridge-ethereum-beacon-client --features try-runtime +cargo check -p snowbridge-inbound-queue +cargo check -p snowbridge-inbound-queue --features runtime-benchmarks +cargo check -p snowbridge-inbound-queue --features try-runtime +cargo check -p snowbridge-outbound-queue +cargo check -p snowbridge-outbound-queue --features runtime-benchmarks +cargo check -p snowbridge-outbound-queue --features try-runtime +cargo check -p snowbridge-system +cargo check -p snowbridge-system --features runtime-benchmarks +cargo check -p snowbridge-system --features try-runtime + +cd - + +# we're removing lock file after all checks are done. Otherwise we may use different +# Substrate/Polkadot/Cumulus commits and our checks will fail +rm -f $SNOWBRIDGE_FOLDER/parachain/Cargo.toml +rm -f $SNOWBRIDGE_FOLDER/parachain/Cargo.lock + +echo "OK" diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/src/lib.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/src/lib.rs index 05454a2e573..00f41256420 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/src/lib.rs @@ -38,6 +38,7 @@ decl_test_parachains! { XcmpMessageHandler: asset_hub_rococo_runtime::XcmpQueue, LocationToAccountId: asset_hub_rococo_runtime::xcm_config::LocationToAccountId, ParachainInfo: asset_hub_rococo_runtime::ParachainInfo, + MessageOrigin: cumulus_primitives_core::AggregateMessageOrigin, }, pallets = { PolkadotXcm: asset_hub_rococo_runtime::PolkadotXcm, diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/src/lib.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/src/lib.rs index 56382fad564..25d7c1079b4 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/src/lib.rs @@ -38,6 +38,7 @@ decl_test_parachains! { XcmpMessageHandler: asset_hub_westend_runtime::XcmpQueue, LocationToAccountId: asset_hub_westend_runtime::xcm_config::LocationToAccountId, ParachainInfo: asset_hub_westend_runtime::ParachainInfo, + MessageOrigin: cumulus_primitives_core::AggregateMessageOrigin, }, pallets = { PolkadotXcm: asset_hub_westend_runtime::PolkadotXcm, diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/Cargo.toml index 8a56bb7b27f..d0c498b54b4 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/Cargo.toml @@ -25,3 +25,11 @@ parachains-common = { path = "../../../../../../../parachains/common" } cumulus-primitives-core = { path = "../../../../../../../primitives/core", default-features = false } emulated-integration-tests-common = { path = "../../../../common", default-features = false } bridge-hub-rococo-runtime = { path = "../../../../../../runtimes/bridge-hubs/bridge-hub-rococo" } +bridge-hub-common = { path = "../../../../../../runtimes/bridge-hubs/common", default-features = false } + +# Snowbridge +snowbridge-core = { path = "../../../../../../../../bridges/snowbridge/parachain/primitives/core", default-features = false } +snowbridge-router-primitives = { path = "../../../../../../../../bridges/snowbridge/parachain/primitives/router", default-features = false } +snowbridge-system = { path = "../../../../../../../../bridges/snowbridge/parachain/pallets/system", default-features = false } +snowbridge-inbound-queue = { path = "../../../../../../../../bridges/snowbridge/parachain/pallets/inbound-queue", default-features = false } +snowbridge-outbound-queue = { path = "../../../../../../../../bridges/snowbridge/parachain/pallets/outbound-queue", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/src/genesis.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/src/genesis.rs index fa9a287adf8..3dd0cb10ab6 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/src/genesis.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/src/genesis.rs @@ -22,6 +22,7 @@ use emulated_integration_tests_common::{ }; use parachains_common::Balance; +pub const ASSETHUB_PARA_ID: u32 = 1000; pub const PARA_ID: u32 = 1013; pub const ED: Balance = parachains_common::rococo::currency::EXISTENTIAL_DEPOSIT; @@ -64,6 +65,11 @@ pub fn genesis() -> Storage { owner: Some(get_account_id_from_seed::(accounts::BOB)), ..Default::default() }, + ethereum_system: bridge_hub_rococo_runtime::EthereumSystemConfig { + para_id: PARA_ID.into(), + asset_hub_para_id: ASSETHUB_PARA_ID.into(), + ..Default::default() + }, ..Default::default() }; diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/src/lib.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/src/lib.rs index 8162823dfce..8c18d112bc1 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/src/lib.rs @@ -36,10 +36,14 @@ decl_test_parachains! { XcmpMessageHandler: bridge_hub_rococo_runtime::XcmpQueue, LocationToAccountId: bridge_hub_rococo_runtime::xcm_config::LocationToAccountId, ParachainInfo: bridge_hub_rococo_runtime::ParachainInfo, + MessageOrigin: bridge_hub_common::AggregateMessageOrigin, }, pallets = { PolkadotXcm: bridge_hub_rococo_runtime::PolkadotXcm, Balances: bridge_hub_rococo_runtime::Balances, + EthereumSystem: bridge_hub_rococo_runtime::EthereumSystem, + EthereumInboundQueue: bridge_hub_rococo_runtime::EthereumInboundQueue, + EthereumOutboundQueue: bridge_hub_rococo_runtime::EthereumOutboundQueue, } }, } diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/Cargo.toml index a2268f3b17a..3d5a7e1071d 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/Cargo.toml @@ -25,3 +25,4 @@ parachains-common = { path = "../../../../../../../parachains/common" } cumulus-primitives-core = { path = "../../../../../../../primitives/core", default-features = false } emulated-integration-tests-common = { path = "../../../../common", default-features = false } bridge-hub-westend-runtime = { path = "../../../../../../runtimes/bridge-hubs/bridge-hub-westend" } +bridge-hub-common = { path = "../../../../../../runtimes/bridge-hubs/common", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/src/lib.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/src/lib.rs index c996b8045e7..b0dddc9dbf9 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/src/lib.rs @@ -36,6 +36,7 @@ decl_test_parachains! { XcmpMessageHandler: bridge_hub_westend_runtime::XcmpQueue, LocationToAccountId: bridge_hub_westend_runtime::xcm_config::LocationToAccountId, ParachainInfo: bridge_hub_westend_runtime::ParachainInfo, + MessageOrigin: bridge_hub_common::AggregateMessageOrigin, }, pallets = { PolkadotXcm: bridge_hub_westend_runtime::PolkadotXcm, diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/collectives/collectives-westend/src/lib.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/collectives/collectives-westend/src/lib.rs index 5d553b6f103..a32e865dd9c 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/collectives/collectives-westend/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/collectives/collectives-westend/src/lib.rs @@ -36,6 +36,7 @@ decl_test_parachains! { XcmpMessageHandler: collectives_westend_runtime::XcmpQueue, LocationToAccountId: collectives_westend_runtime::xcm_config::LocationToAccountId, ParachainInfo: collectives_westend_runtime::ParachainInfo, + MessageOrigin: cumulus_primitives_core::AggregateMessageOrigin, }, pallets = { PolkadotXcm: collectives_westend_runtime::PolkadotXcm, diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/src/lib.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/src/lib.rs index 62bafb5cb30..244a846bbc2 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/src/lib.rs @@ -40,10 +40,12 @@ decl_test_parachains! { XcmpMessageHandler: penpal_runtime::XcmpQueue, LocationToAccountId: penpal_runtime::xcm_config::LocationToAccountId, ParachainInfo: penpal_runtime::ParachainInfo, + MessageOrigin: cumulus_primitives_core::AggregateMessageOrigin, }, pallets = { PolkadotXcm: penpal_runtime::PolkadotXcm, Assets: penpal_runtime::Assets, + ForeignAssets: penpal_runtime::ForeignAssets, Balances: penpal_runtime::Balances, } }, @@ -57,10 +59,12 @@ decl_test_parachains! { XcmpMessageHandler: penpal_runtime::XcmpQueue, LocationToAccountId: penpal_runtime::xcm_config::LocationToAccountId, ParachainInfo: penpal_runtime::ParachainInfo, + MessageOrigin: cumulus_primitives_core::AggregateMessageOrigin, }, pallets = { PolkadotXcm: penpal_runtime::PolkadotXcm, Assets: penpal_runtime::Assets, + ForeignAssets: penpal_runtime::ForeignAssets, Balances: penpal_runtime::Balances, } }, diff --git a/cumulus/parachains/integration-tests/emulated/networks/rococo-westend-system/Cargo.toml b/cumulus/parachains/integration-tests/emulated/networks/rococo-westend-system/Cargo.toml index 2a538b8e28c..744cbe4f8c1 100644 --- a/cumulus/parachains/integration-tests/emulated/networks/rococo-westend-system/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/networks/rococo-westend-system/Cargo.toml @@ -19,3 +19,4 @@ asset-hub-rococo-emulated-chain = { path = "../../chains/parachains/assets/asset asset-hub-westend-emulated-chain = { path = "../../chains/parachains/assets/asset-hub-westend" } bridge-hub-rococo-emulated-chain = { path = "../../chains/parachains/bridges/bridge-hub-rococo" } bridge-hub-westend-emulated-chain = { path = "../../chains/parachains/bridges/bridge-hub-westend" } +penpal-emulated-chain = { path = "../../chains/parachains/testing/penpal" } diff --git a/cumulus/parachains/integration-tests/emulated/networks/rococo-westend-system/src/lib.rs b/cumulus/parachains/integration-tests/emulated/networks/rococo-westend-system/src/lib.rs index b03ff692b95..ee8b038a364 100644 --- a/cumulus/parachains/integration-tests/emulated/networks/rococo-westend-system/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/networks/rococo-westend-system/src/lib.rs @@ -17,6 +17,7 @@ pub use asset_hub_rococo_emulated_chain; pub use asset_hub_westend_emulated_chain; pub use bridge_hub_rococo_emulated_chain; pub use bridge_hub_westend_emulated_chain; +pub use penpal_emulated_chain; pub use rococo_emulated_chain; pub use westend_emulated_chain; @@ -24,6 +25,7 @@ use asset_hub_rococo_emulated_chain::AssetHubRococo; use asset_hub_westend_emulated_chain::AssetHubWestend; use bridge_hub_rococo_emulated_chain::BridgeHubRococo; use bridge_hub_westend_emulated_chain::BridgeHubWestend; +use penpal_emulated_chain::PenpalA; use rococo_emulated_chain::Rococo; use westend_emulated_chain::Westend; @@ -43,6 +45,7 @@ decl_test_networks! { parachains = vec![ AssetHubRococo, BridgeHubRococo, + PenpalA, ], bridge = RococoWestendMockBridge @@ -92,5 +95,6 @@ decl_test_sender_receiver_accounts_parameter_types! { BridgeHubRococoPara { sender: ALICE, receiver: BOB }, WestendRelay { sender: ALICE, receiver: BOB }, AssetHubWestendPara { sender: ALICE, receiver: BOB }, - BridgeHubWestendPara { sender: ALICE, receiver: BOB } + BridgeHubWestendPara { sender: ALICE, receiver: BOB }, + PenpalAPara { sender: ALICE, receiver: BOB } } diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/Cargo.toml index ce6b8c24a44..e75187bea95 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/Cargo.toml @@ -12,8 +12,12 @@ workspace = true [dependencies] codec = { package = "parity-scale-codec", version = "3.4.0", default-features = false } +scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +hex = "0.4.3" +hex-literal = "0.4.1" # Substrate +sp-core = { path = "../../../../../../../substrate/primitives/core", default-features = false } frame-support = { path = "../../../../../../../substrate/frame/support", default-features = false } pallet-assets = { path = "../../../../../../../substrate/frame/assets", default-features = false } pallet-balances = { path = "../../../../../../../substrate/frame/balances", default-features = false } @@ -37,3 +41,14 @@ cumulus-pallet-dmp-queue = { path = "../../../../../../pallets/dmp-queue", defau bridge-hub-rococo-runtime = { path = "../../../../../../parachains/runtimes/bridge-hubs/bridge-hub-rococo", default-features = false } emulated-integration-tests-common = { path = "../../../common", default-features = false } rococo-westend-system-emulated-network = { path = "../../../networks/rococo-westend-system" } +penpal-runtime = { path = "../../../../../runtimes/testing/penpal", default-features = false } +rococo-system-emulated-network = { path = "../../../networks/rococo-system" } +asset-hub-rococo-runtime = { path = "../../../../../runtimes/assets/asset-hub-rococo", default-features = false } + +# Snowbridge +snowbridge-core = { path = "../../../../../../../bridges/snowbridge/parachain/primitives/core", default-features = false } +snowbridge-router-primitives = { path = "../../../../../../../bridges/snowbridge/parachain/primitives/router", default-features = false } +snowbridge-system = { path = "../../../../../../../bridges/snowbridge/parachain/pallets/system", default-features = false } +snowbridge-inbound-queue = { path = "../../../../../../../bridges/snowbridge/parachain/pallets/inbound-queue", default-features = false } +snowbridge-outbound-queue = { path = "../../../../../../../bridges/snowbridge/parachain/pallets/outbound-queue", default-features = false } +snowbridge-rococo-common = { path = "../../../../../../../bridges/snowbridge/parachain/runtime/rococo-common", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/lib.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/lib.rs index 4ae2c6cc902..5127bd759dc 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/lib.rs @@ -43,6 +43,11 @@ pub use emulated_integration_tests_common::{ PROOF_SIZE_THRESHOLD, REF_TIME_THRESHOLD, XCM_V3, }; pub use parachains_common::{AccountId, Balance}; +pub use rococo_system_emulated_network::{ + penpal_emulated_chain::PenpalAParaPallet as PenpalAPallet, + BridgeHubRococoParaReceiver as BridgeHubRococoReceiver, PenpalAPara as PenpalA, + PenpalAParaReceiver as PenpalAReceiver, PenpalAParaSender as PenpalASender, +}; pub use rococo_westend_system_emulated_network::{ asset_hub_rococo_emulated_chain::{ genesis::ED as ASSET_HUB_ROCOCO_ED, AssetHubRococoParaPallet as AssetHubRococoPallet, @@ -53,12 +58,13 @@ pub use rococo_westend_system_emulated_network::{ bridge_hub_rococo_emulated_chain::{ genesis::ED as BRIDGE_HUB_ROCOCO_ED, BridgeHubRococoParaPallet as BridgeHubRococoPallet, }, - rococo_emulated_chain::RococoRelayPallet as RococoPallet, + rococo_emulated_chain::{genesis::ED as ROCOCO_ED, RococoRelayPallet as RococoPallet}, AssetHubRococoPara as AssetHubRococo, AssetHubRococoParaReceiver as AssetHubRococoReceiver, AssetHubRococoParaSender as AssetHubRococoSender, AssetHubWestendPara as AssetHubWestend, AssetHubWestendParaReceiver as AssetHubWestendReceiver, BridgeHubRococoPara as BridgeHubRococo, BridgeHubRococoParaSender as BridgeHubRococoSender, BridgeHubWestendPara as BridgeHubWestend, - RococoRelay as Rococo, + RococoRelay as Rococo, RococoRelayReceiver as RococoReceiver, + RococoRelaySender as RococoSender, }; pub const ASSET_ID: u32 = 1; diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/mod.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/mod.rs index d102dd2e5d6..e71a022af4c 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/mod.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/mod.rs @@ -17,6 +17,7 @@ use crate::*; mod asset_transfers; mod send_xcm; +mod snowbridge; mod teleport; pub(crate) fn asset_hub_westend_location() -> MultiLocation { diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs new file mode 100644 index 00000000000..e62a73caff5 --- /dev/null +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs @@ -0,0 +1,505 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +use crate::*; +use codec::{Decode, Encode}; +use emulated_integration_tests_common::xcm_emulator::ConvertLocation; +use frame_support::pallet_prelude::TypeInfo; +use hex_literal::hex; +use snowbridge_core::outbound::OperatingMode; +use snowbridge_rococo_common::EthereumNetwork; +use snowbridge_router_primitives::inbound::{ + Command, Destination, GlobalConsensusEthereumConvertsFor, MessageV1, VersionedMessage, +}; +use snowbridge_system; +use sp_core::H256; + +const INITIAL_FUND: u128 = 5_000_000_000 * ROCOCO_ED; +const CHAIN_ID: u64 = 11155111; +const TREASURY_ACCOUNT: [u8; 32] = + hex!("6d6f646c70792f74727372790000000000000000000000000000000000000000"); +const WETH: [u8; 20] = hex!("87d1f7fdfEe7f651FaBc8bFCB6E086C278b77A7d"); +const ETHEREUM_DESTINATION_ADDRESS: [u8; 20] = hex!("44a57ee2f2FCcb85FDa2B0B18EBD0D8D2333700e"); +const XCM_FEE: u128 = 4_000_000_000; + +#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)] +pub enum ControlCall { + #[codec(index = 3)] + CreateAgent, + #[codec(index = 4)] + CreateChannel { mode: OperatingMode }, +} + +#[allow(clippy::large_enum_variant)] +#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)] +pub enum SnowbridgeControl { + #[codec(index = 83)] + Control(ControlCall), +} + +#[test] +fn create_agent() { + let origin_para: u32 = 1001; + + BridgeHubRococo::fund_para_sovereign(origin_para.into(), INITIAL_FUND); + + let sudo_origin = ::RuntimeOrigin::root(); + let destination = Rococo::child_location_of(BridgeHubRococo::para_id()).into(); + + let create_agent_call = SnowbridgeControl::Control(ControlCall::CreateAgent {}); + + let remote_xcm = VersionedXcm::from(Xcm(vec![ + UnpaidExecution { weight_limit: Unlimited, check_origin: None }, + DescendOrigin(X1(Parachain(origin_para))), + Transact { + require_weight_at_most: 3000000000.into(), + origin_kind: OriginKind::Xcm, + call: create_agent_call.encode().into(), + }, + ])); + + //Rococo Global Consensus + // Send XCM message from Relay Chain to Bridge Hub source Parachain + Rococo::execute_with(|| { + assert_ok!(::XcmPallet::send( + sudo_origin, + bx!(destination), + bx!(remote_xcm), + )); + + type RuntimeEvent = ::RuntimeEvent; + + assert_expected_events!( + Rococo, + vec![ + RuntimeEvent::XcmPallet(pallet_xcm::Event::Sent { .. }) => {}, + ] + ); + }); + + BridgeHubRococo::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + + assert_expected_events!( + BridgeHubRococo, + vec![ + RuntimeEvent::EthereumSystem(snowbridge_system::Event::CreateAgent { + .. + }) => {}, + ] + ); + }); +} + +#[test] +fn create_channel() { + let origin_para: u32 = 1001; + + BridgeHubRococo::fund_para_sovereign(origin_para.into(), INITIAL_FUND); + + let sudo_origin = ::RuntimeOrigin::root(); + let destination: VersionedMultiLocation = + Rococo::child_location_of(BridgeHubRococo::para_id()).into(); + + let create_agent_call = SnowbridgeControl::Control(ControlCall::CreateAgent {}); + + let create_agent_xcm = VersionedXcm::from(Xcm(vec![ + UnpaidExecution { weight_limit: Unlimited, check_origin: None }, + DescendOrigin(X1(Parachain(origin_para))), + Transact { + require_weight_at_most: 3000000000.into(), + origin_kind: OriginKind::Xcm, + call: create_agent_call.encode().into(), + }, + ])); + + let create_channel_call = + SnowbridgeControl::Control(ControlCall::CreateChannel { mode: OperatingMode::Normal }); + + let create_channel_xcm = VersionedXcm::from(Xcm(vec![ + UnpaidExecution { weight_limit: Unlimited, check_origin: None }, + DescendOrigin(X1(Parachain(origin_para))), + Transact { + require_weight_at_most: 3000000000.into(), + origin_kind: OriginKind::Xcm, + call: create_channel_call.encode().into(), + }, + ])); + + //Rococo Global Consensus + // Send XCM message from Relay Chain to Bridge Hub source Parachain + Rococo::execute_with(|| { + assert_ok!(::XcmPallet::send( + sudo_origin.clone(), + bx!(destination.clone()), + bx!(create_agent_xcm), + )); + + assert_ok!(::XcmPallet::send( + sudo_origin, + bx!(destination), + bx!(create_channel_xcm), + )); + + type RuntimeEvent = ::RuntimeEvent; + + assert_expected_events!( + Rococo, + vec![ + RuntimeEvent::XcmPallet(pallet_xcm::Event::Sent { .. }) => {}, + ] + ); + }); + + BridgeHubRococo::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + + assert_expected_events!( + BridgeHubRococo, + vec![ + RuntimeEvent::EthereumSystem(snowbridge_system::Event::CreateChannel { + .. + }) => {}, + ] + ); + }); +} + +#[test] +fn register_weth_token_from_ethereum_to_asset_hub() { + BridgeHubRococo::fund_para_sovereign(AssetHubRococo::para_id().into(), INITIAL_FUND); + + let message_id_: H256 = [1; 32].into(); + + BridgeHubRococo::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + type EthereumInboundQueue = + ::EthereumInboundQueue; + let message = VersionedMessage::V1(MessageV1 { + chain_id: CHAIN_ID, + command: Command::RegisterToken { token: WETH.into(), fee: XCM_FEE }, + }); + let (xcm, _) = EthereumInboundQueue::do_convert(message_id_, message).unwrap(); + let _ = EthereumInboundQueue::send_xcm(xcm, AssetHubRococo::para_id().into()).unwrap(); + + assert_expected_events!( + BridgeHubRococo, + vec![ + RuntimeEvent::XcmpQueue(cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. }) => {}, + ] + ); + }); + + AssetHubRococo::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + + assert_expected_events!( + AssetHubRococo, + vec![ + RuntimeEvent::ForeignAssets(pallet_assets::Event::Created { .. }) => {}, + ] + ); + }); +} + +#[test] +fn send_token_from_ethereum_to_penpal() { + let asset_hub_sovereign = BridgeHubRococo::sovereign_account_id_of(MultiLocation { + parents: 1, + interior: X1(Parachain(AssetHubRococo::para_id().into())), + }); + BridgeHubRococo::fund_accounts(vec![(asset_hub_sovereign.clone(), INITIAL_FUND)]); + + PenpalA::fund_accounts(vec![ + (PenpalAReceiver::get(), INITIAL_FUND), + (PenpalASender::get(), INITIAL_FUND), + ]); + + let weth_asset_location: MultiLocation = + (Parent, Parent, EthereumNetwork::get(), AccountKey20 { network: None, key: WETH }).into(); + let weth_asset_id = weth_asset_location.into(); + + let origin_location = (Parent, Parent, EthereumNetwork::get()).into(); + + // Fund ethereum sovereign in asset hub + let ethereum_sovereign: AccountId = + GlobalConsensusEthereumConvertsFor::::convert_location(&origin_location) + .unwrap(); + AssetHubRococo::fund_accounts(vec![(ethereum_sovereign.clone(), INITIAL_FUND)]); + + // Create asset on assethub. + AssetHubRococo::execute_with(|| { + assert_ok!(::ForeignAssets::create( + pallet_xcm::Origin::Xcm(origin_location).into(), + weth_asset_id, + asset_hub_sovereign.clone().into(), + 1000, + )); + + assert!(::ForeignAssets::asset_exists( + weth_asset_id + )); + }); + + // Create asset on penpal. + PenpalA::execute_with(|| { + assert_ok!(::ForeignAssets::create( + ::RuntimeOrigin::signed(PenpalASender::get()), + weth_asset_id, + asset_hub_sovereign.into(), + 1000, + )); + + assert!(::ForeignAssets::asset_exists(weth_asset_id)); + }); + + let message_id_: H256 = [1; 32].into(); + + BridgeHubRococo::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + type EthereumInboundQueue = + ::EthereumInboundQueue; + let message = VersionedMessage::V1(MessageV1 { + chain_id: CHAIN_ID, + command: Command::SendToken { + token: WETH.into(), + destination: Destination::ForeignAccountId32 { + para_id: 2000, + id: PenpalAReceiver::get().into(), + fee: XCM_FEE, + }, + amount: 1_000_000_000, + fee: XCM_FEE, + }, + }); + let (xcm, _) = EthereumInboundQueue::do_convert(message_id_, message).unwrap(); + let _ = EthereumInboundQueue::send_xcm(xcm, AssetHubRococo::para_id().into()).unwrap(); + + assert_expected_events!( + BridgeHubRococo, + vec![ + RuntimeEvent::XcmpQueue(cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. }) => {}, + ] + ); + }); + + AssetHubRococo::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + + assert_expected_events!( + AssetHubRococo, + vec![ + RuntimeEvent::ForeignAssets(pallet_assets::Event::Issued { .. }) => {}, + RuntimeEvent::XcmpQueue(cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. }) => {}, + ] + ); + }); + + PenpalA::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + + assert_expected_events!( + PenpalA, + vec![ + RuntimeEvent::ForeignAssets(pallet_assets::Event::Issued { .. }) => {}, + ] + ); + }); +} + +#[test] +fn send_token_from_ethereum_to_asset_hub() { + BridgeHubRococo::fund_para_sovereign(AssetHubRococo::para_id().into(), INITIAL_FUND); + + // Fund ethereum sovereign in asset hub + AssetHubRococo::fund_accounts(vec![(AssetHubRococoReceiver::get(), INITIAL_FUND)]); + + let message_id_: H256 = [1; 32].into(); + + BridgeHubRococo::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + type EthereumInboundQueue = + ::EthereumInboundQueue; + let message = VersionedMessage::V1(MessageV1 { + chain_id: CHAIN_ID, + command: Command::RegisterToken { token: WETH.into(), fee: XCM_FEE }, + }); + let (xcm, _) = EthereumInboundQueue::do_convert(message_id_, message).unwrap(); + let _ = EthereumInboundQueue::send_xcm(xcm, AssetHubRococo::para_id().into()).unwrap(); + let message = VersionedMessage::V1(MessageV1 { + chain_id: CHAIN_ID, + command: Command::SendToken { + token: WETH.into(), + destination: Destination::AccountId32 { id: AssetHubRococoReceiver::get().into() }, + amount: 1_000_000_000, + fee: XCM_FEE, + }, + }); + let (xcm, _) = EthereumInboundQueue::do_convert(message_id_, message).unwrap(); + let _ = EthereumInboundQueue::send_xcm(xcm, AssetHubRococo::para_id().into()).unwrap(); + + assert_expected_events!( + BridgeHubRococo, + vec![ + RuntimeEvent::XcmpQueue(cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. }) => {}, + ] + ); + }); + + AssetHubRococo::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + + assert_expected_events!( + AssetHubRococo, + vec![ + RuntimeEvent::ForeignAssets(pallet_assets::Event::Issued { .. }) => {}, + ] + ); + }); +} + +#[test] +fn send_weth_asset_from_asset_hub_to_ethereum() { + use asset_hub_rococo_runtime::xcm_config::bridging::to_ethereum::DefaultBridgeHubEthereumBaseFee; + let assethub_sovereign = BridgeHubRococo::sovereign_account_id_of(MultiLocation { + parents: 1, + interior: X1(Parachain(AssetHubRococo::para_id().into())), + }); + + AssetHubRococo::force_default_xcm_version(Some(XCM_VERSION)); + BridgeHubRococo::force_default_xcm_version(Some(XCM_VERSION)); + AssetHubRococo::force_xcm_version( + MultiLocation { + parents: 2, + interior: X1(GlobalConsensus(Ethereum { chain_id: CHAIN_ID })), + }, + XCM_VERSION, + ); + + BridgeHubRococo::fund_accounts(vec![(assethub_sovereign.clone(), INITIAL_FUND)]); + AssetHubRococo::fund_accounts(vec![(AssetHubRococoReceiver::get(), INITIAL_FUND)]); + + const WETH_AMOUNT: u128 = 1_000_000_000; + let message_id_: H256 = [1; 32].into(); + + BridgeHubRococo::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + type EthereumInboundQueue = + ::EthereumInboundQueue; + + let message = VersionedMessage::V1(MessageV1 { + chain_id: CHAIN_ID, + command: Command::RegisterToken { token: WETH.into(), fee: XCM_FEE }, + }); + let (xcm, _) = EthereumInboundQueue::do_convert(message_id_, message).unwrap(); + let _ = EthereumInboundQueue::send_xcm(xcm, AssetHubRococo::para_id().into()).unwrap(); + let message = VersionedMessage::V1(MessageV1 { + chain_id: CHAIN_ID, + command: Command::SendToken { + token: WETH.into(), + destination: Destination::AccountId32 { id: AssetHubRococoReceiver::get().into() }, + amount: WETH_AMOUNT, + fee: XCM_FEE, + }, + }); + let (xcm, _) = EthereumInboundQueue::do_convert(message_id_, message).unwrap(); + let _ = EthereumInboundQueue::send_xcm(xcm, AssetHubRococo::para_id().into()).unwrap(); + + assert_expected_events!( + BridgeHubRococo, + vec![ + RuntimeEvent::XcmpQueue(cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. }) => {}, + ] + ); + }); + + AssetHubRococo::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + type RuntimeOrigin = ::RuntimeOrigin; + + assert_expected_events!( + AssetHubRococo, + vec![ + RuntimeEvent::ForeignAssets(pallet_assets::Event::Issued { .. }) => {}, + ] + ); + let assets = vec![MultiAsset { + id: Concrete(MultiLocation { + parents: 2, + interior: X2( + GlobalConsensus(Ethereum { chain_id: CHAIN_ID }), + AccountKey20 { network: None, key: WETH }, + ), + }), + fun: Fungible(WETH_AMOUNT), + }]; + let multi_assets = VersionedMultiAssets::V3(MultiAssets::from(assets)); + + let destination = VersionedMultiLocation::V3(MultiLocation { + parents: 2, + interior: X1(GlobalConsensus(Ethereum { chain_id: CHAIN_ID })), + }); + + let beneficiary = VersionedMultiLocation::V3(MultiLocation { + parents: 0, + interior: X1(AccountKey20 { network: None, key: ETHEREUM_DESTINATION_ADDRESS.into() }), + }); + + let free_balance_before = ::Balances::free_balance( + AssetHubRococoReceiver::get(), + ); + ::PolkadotXcm::reserve_transfer_assets( + RuntimeOrigin::signed(AssetHubRococoReceiver::get()), + Box::new(destination), + Box::new(beneficiary), + Box::new(multi_assets), + 0, + ) + .unwrap(); + let free_balance_after = ::Balances::free_balance( + AssetHubRococoReceiver::get(), + ); + // assert at least DefaultBridgeHubEthereumBaseFee charged from the sender + let free_balance_diff = free_balance_before - free_balance_after; + assert!(free_balance_diff > DefaultBridgeHubEthereumBaseFee::get()); + }); + + BridgeHubRococo::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + + assert_expected_events!( + BridgeHubRococo, + vec![ + RuntimeEvent::EthereumOutboundQueue(snowbridge_outbound_queue::Event::MessageQueued {..}) => {}, + ] + ); + let events = BridgeHubRococo::events(); + assert!( + events.iter().any(|event| matches!( + event, + RuntimeEvent::Balances(pallet_balances::Event::Deposit{ who, amount }) + if *who == TREASURY_ACCOUNT.into() && *amount == 16903333 + )), + "Snowbridge sovereign takes local fee." + ); + assert!( + events.iter().any(|event| matches!( + event, + RuntimeEvent::Balances(pallet_balances::Event::Deposit{ who, amount }) + if *who == assethub_sovereign && *amount == 2680000000000, + )), + "AssetHub sovereign takes remote fee." + ); + }); +} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml b/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml index 47af627d6b2..43579cfe5bb 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml @@ -90,6 +90,8 @@ bp-asset-hub-rococo = { path = "../../../../../bridges/primitives/chain-asset-hu bp-asset-hub-westend = { path = "../../../../../bridges/primitives/chain-asset-hub-westend", default-features = false } bp-bridge-hub-rococo = { path = "../../../../../bridges/primitives/chain-bridge-hub-rococo", default-features = false } bp-bridge-hub-westend = { path = "../../../../../bridges/primitives/chain-bridge-hub-westend", default-features = false } +snowbridge-router-primitives = { path = "../../../../../bridges/snowbridge/parachain/primitives/router", default-features = false } +snowbridge-rococo-common = { path = "../../../../../bridges/snowbridge/parachain/runtime/rococo-common", default-features = false } [dev-dependencies] asset-test-utils = { path = "../test-utils" } @@ -137,6 +139,8 @@ runtime-benchmarks = [ "parachains-common/runtime-benchmarks", "polkadot-parachain-primitives/runtime-benchmarks", "polkadot-runtime-common/runtime-benchmarks", + "snowbridge-rococo-common/runtime-benchmarks", + "snowbridge-router-primitives/runtime-benchmarks", "sp-runtime/runtime-benchmarks", "xcm-builder/runtime-benchmarks", "xcm-executor/runtime-benchmarks", @@ -227,6 +231,8 @@ std = [ "primitive-types/std", "rococo-runtime-constants/std", "scale-info/std", + "snowbridge-rococo-common/std", + "snowbridge-router-primitives/std", "sp-api/std", "sp-block-builder/std", "sp-consensus-aura/std", diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs index ca5d5be241b..ae21b872976 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs @@ -30,11 +30,12 @@ pub mod xcm_config; use assets_common::{ foreign_creators::ForeignCreators, local_and_foreign_assets::{LocalFromLeft, TargetFromLeft}, - matching::FromSiblingParachain, + matching::{FromNetwork, FromSiblingParachain}, AssetIdForTrustBackedAssetsConvert, MultiLocationForAssetId, }; use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; use cumulus_primitives_core::AggregateMessageOrigin; +use snowbridge_rococo_common::EthereumNetwork; use sp_api::impl_runtime_apis; use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; use sp_runtime::{ @@ -379,7 +380,10 @@ impl pallet_assets::Config for Runtime { type AssetIdParameter = MultiLocationForAssetId; type Currency = Balances; type CreateOrigin = ForeignCreators< - (FromSiblingParachain>,), + ( + FromSiblingParachain>, + FromNetwork, + ), ForeignCreatorsSovereignAccountOf, AccountId, >; @@ -913,7 +917,6 @@ construct_runtime!( // Bridge utilities. ToWestendXcmRouter: pallet_xcm_bridge_hub_router::::{Pallet, Storage, Call} = 45, - // The main stage. Assets: pallet_assets::::{Pallet, Call, Storage, Event} = 50, Uniques: pallet_uniques::{Pallet, Call, Storage, Event} = 51, diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs index e94a14b304b..ca581929c99 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs @@ -21,7 +21,7 @@ use super::{ }; use assets_common::{ local_and_foreign_assets::MatchesLocalAndForeignAssetsMultiLocation, - matching::{FromSiblingParachain, IsForeignConcreteAsset}, + matching::{FromNetwork, FromSiblingParachain, IsForeignConcreteAsset}, }; use frame_support::{ match_types, parameter_types, @@ -39,6 +39,8 @@ use parachains_common::{ }; use polkadot_parachain_primitives::primitives::Sibling; use polkadot_runtime_common::xcm_sender::ExponentialPrice; +use snowbridge_rococo_common::EthereumNetwork; +use snowbridge_router_primitives::inbound::GlobalConsensusEthereumConvertsFor; use sp_runtime::traits::{AccountIdConversion, ConvertInto}; use xcm::latest::prelude::*; #[allow(deprecated)] @@ -50,9 +52,10 @@ use xcm_builder::{ GlobalConsensusParachainConvertsFor, HashedDescription, IsConcrete, LocalMint, NetworkExportTableItem, NoChecking, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, SignedAccountId32AsNative, - SignedToAccountId32, SovereignSignedViaLocation, StartsWith, StartsWithExplicitGlobalConsensus, - TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, WeightInfoBounds, WithComputedOrigin, - WithUniqueTopic, XcmFeeManagerFromComponents, XcmFeeToAccount, + SignedToAccountId32, SovereignPaidRemoteExporter, SovereignSignedViaLocation, StartsWith, + StartsWithExplicitGlobalConsensus, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, + WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, XcmFeeManagerFromComponents, + XcmFeeToAccount, }; use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; @@ -90,6 +93,9 @@ pub type LocationToAccountId = ( // Different global consensus parachain sovereign account. // (Used for over-bridge transfers and reserve processing) GlobalConsensusParachainConvertsFor, + // Ethereum contract sovereign account. + // (Used to get convert ethereum contract locations to sovereign account) + GlobalConsensusEthereumConvertsFor, ); /// Means for transacting the native currency on this chain. @@ -259,10 +265,11 @@ impl Contains for SafeCallFilter { // Allow to change dedicated storage items (called by governance-like) match call { RuntimeCall::System(frame_system::Call::set_storage { items }) - if items.iter().all(|(k, _)| k.eq(&bridging::XcmBridgeHubRouterByteFee::key())) || - items - .iter() - .all(|(k, _)| k.eq(&bridging::XcmBridgeHubRouterBaseFee::key())) => + if items.iter().all(|(k, _)| { + k.eq(&bridging::XcmBridgeHubRouterByteFee::key()) | + k.eq(&bridging::XcmBridgeHubRouterBaseFee::key()) | + k.eq(&bridging::to_ethereum::BridgeHubEthereumBaseFee::key()) + }) => return true, _ => (), }; @@ -534,7 +541,10 @@ impl xcm_executor::Config for XcmConfig { // as reserve locations (we trust the Bridge Hub to relay the message that a reserve is being // held). Asset Hub may _act_ as a reserve location for ROC and assets created // under `pallet-assets`. Users must use teleport where allowed (e.g. ROC with the Relay Chain). - type IsReserve = (bridging::to_westend::IsTrustedBridgedReserveLocationForConcreteAsset,); + type IsReserve = ( + bridging::to_westend::IsTrustedBridgedReserveLocationForConcreteAsset, + bridging::to_ethereum::IsTrustedBridgedReserveLocationForForeignAsset, + ); type IsTeleporter = TrustedTeleporters; type UniversalLocation = UniversalLocation; type Barrier = Barrier; @@ -585,7 +595,8 @@ impl xcm_executor::Config for XcmConfig { XcmFeeToAccount, >; type MessageExporter = (); - type UniversalAliases = (bridging::to_westend::UniversalAliases,); + type UniversalAliases = + (bridging::to_westend::UniversalAliases, bridging::to_ethereum::UniversalAliases); type CallDispatcher = WithOriginFilter; type SafeCallFilter = SafeCallFilter; type Aliasers = Nothing; @@ -613,6 +624,9 @@ pub type XcmRouter = WithUniqueTopic<( // Router which wraps and sends xcm to BridgeHub to be delivered to the Westend // GlobalConsensus ToWestendXcmRouter, + // Router which wraps and sends xcm to BridgeHub to be delivered to the Ethereum + // GlobalConsensus + SovereignPaidRemoteExporter, )>; impl pallet_xcm::Config for Runtime { @@ -658,6 +672,7 @@ pub type ForeignCreatorsSovereignAccountOf = ( SiblingParachainConvertsVia, AccountId32Aliases, ParentIsPreset, + GlobalConsensusEthereumConvertsFor, ); /// Simple conversion of `u32` into an `AssetId` for use in benchmarking. @@ -706,10 +721,17 @@ pub mod bridging { sp_std::vec::Vec::new().into_iter() .chain(to_westend::BridgeTable::get()) .collect(); + + pub EthereumBridgeTable: sp_std::vec::Vec = + sp_std::vec::Vec::new().into_iter() + .chain(to_ethereum::BridgeTable::get()) + .collect(); } pub type NetworkExportTable = xcm_builder::NetworkExportTable; + pub type EthereumNetworkExportTable = xcm_builder::NetworkExportTable; + pub mod to_westend { use super::*; @@ -786,6 +808,56 @@ pub mod bridging { } } + pub mod to_ethereum { + use super::*; + + parameter_types! { + /// User fee for ERC20 token transfer back to Ethereum. + /// (initially was calculated by test `OutboundQueue::calculate_fees` - ETH/ROC 1/400 and fee_per_gas 20 GWEI = 2200698000000 + *25%) + /// Needs to be more than fee calculated from DefaultFeeConfig FeeConfigRecord in snowbridge:parachain/pallets/outbound-queue/src/lib.rs + /// Polkadot uses 10 decimals, Kusama and Rococo 12 decimals. + pub const DefaultBridgeHubEthereumBaseFee: Balance = 2_750_872_500_000; + pub storage BridgeHubEthereumBaseFee: Balance = DefaultBridgeHubEthereumBaseFee::get(); + pub SiblingBridgeHubWithEthereumInboundQueueInstance: MultiLocation = MultiLocation::new( + 1, + X2( + Parachain(SiblingBridgeHubParaId::get()), + PalletInstance(snowbridge_rococo_common::INBOUND_QUEUE_MESSAGES_PALLET_INDEX) + ) + ); + + /// Set up exporters configuration. + /// `Option` represents static "base fee" which is used for total delivery fee calculation. + pub BridgeTable: sp_std::vec::Vec = sp_std::vec![ + NetworkExportTableItem::new( + EthereumNetwork::get(), + Some(sp_std::vec![Junctions::Here]), + SiblingBridgeHub::get(), + Some(( + XcmBridgeHubRouterFeeAssetId::get(), + BridgeHubEthereumBaseFee::get(), + ).into()) + ), + ]; + + /// Universal aliases + pub UniversalAliases: BTreeSet<(MultiLocation, Junction)> = BTreeSet::from_iter( + sp_std::vec![ + (SiblingBridgeHubWithEthereumInboundQueueInstance::get(), GlobalConsensus(EthereumNetwork::get())), + ] + ); + } + + pub type IsTrustedBridgedReserveLocationForForeignAsset = + matching::IsForeignConcreteAsset>; + + impl Contains<(MultiLocation, Junction)> for UniversalAliases { + fn contains(alias: &(MultiLocation, Junction)) -> bool { + UniversalAliases::get().contains(alias) + } + } + } + /// Benchmarks helper for bridging configuration. #[cfg(feature = "runtime-benchmarks")] pub struct BridgingBenchmarksHelper; diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/tests/tests.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/tests/tests.rs index 030a3723319..42c91cc8ea6 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/tests/tests.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/tests/tests.rs @@ -865,3 +865,55 @@ fn change_xcm_bridge_hub_router_byte_fee_by_governance_works() { }, ) } + +#[test] +fn change_xcm_bridge_hub_router_base_fee_by_governance_works() { + asset_test_utils::test_cases::change_storage_constant_by_governance_works::< + Runtime, + bridging::XcmBridgeHubRouterBaseFee, + Balance, + >( + collator_session_keys(), + 1000, + Box::new(|call| RuntimeCall::System(call).encode()), + || { + ( + bridging::XcmBridgeHubRouterBaseFee::key().to_vec(), + bridging::XcmBridgeHubRouterBaseFee::get(), + ) + }, + |old_value| { + if let Some(new_value) = old_value.checked_add(1) { + new_value + } else { + old_value.checked_sub(1).unwrap() + } + }, + ) +} + +#[test] +fn change_xcm_bridge_hub_ethereum_base_fee_by_governance_works() { + asset_test_utils::test_cases::change_storage_constant_by_governance_works::< + Runtime, + bridging::to_ethereum::BridgeHubEthereumBaseFee, + Balance, + >( + collator_session_keys(), + 1000, + Box::new(|call| RuntimeCall::System(call).encode()), + || { + ( + bridging::to_ethereum::BridgeHubEthereumBaseFee::key().to_vec(), + bridging::to_ethereum::BridgeHubEthereumBaseFee::get(), + ) + }, + |old_value| { + if let Some(new_value) = old_value.checked_add(1) { + new_value + } else { + old_value.checked_sub(1).unwrap() + } + }, + ) +} diff --git a/cumulus/parachains/runtimes/assets/common/src/matching.rs b/cumulus/parachains/runtimes/assets/common/src/matching.rs index 91497281252..d6ecc3ec99f 100644 --- a/cumulus/parachains/runtimes/assets/common/src/matching.rs +++ b/cumulus/parachains/runtimes/assets/common/src/matching.rs @@ -58,6 +58,37 @@ impl> ContainsPair } } +/// Checks if `a` is from the expected global consensus network. Checks that `MultiLocation-a` +/// starts with `MultiLocation-b`, and that network is a foreign consensus system. +pub struct FromNetwork( + sp_std::marker::PhantomData<(UniversalLocation, ExpectedNetworkId)>, +); +impl, ExpectedNetworkId: Get> + ContainsPair for FromNetwork +{ + fn contains(&a: &MultiLocation, b: &MultiLocation) -> bool { + // `a` needs to be from `b` at least + if !a.starts_with(b) { + return false + } + + let universal_source = UniversalLocation::get(); + + // ensure that `a`` is remote and from the expected network + match ensure_is_remote(universal_source, a) { + Ok((network_id, _)) => network_id == ExpectedNetworkId::get(), + Err(e) => { + log::trace!( + target: "xcm::contains", + "FromNetwork origin: {:?} is not remote to the universal_source: {:?} {:?}", + a, universal_source, e + ); + false + }, + } + } +} + /// Adapter verifies if it is allowed to receive `MultiAsset` from `MultiLocation`. /// /// Note: `MultiLocation` has to be from a different global consensus. @@ -95,3 +126,92 @@ impl< Reserves::contains(asset, origin) } } + +#[cfg(test)] +mod tests { + use super::*; + use frame_support::parameter_types; + + parameter_types! { + pub UniversalLocation: InteriorMultiLocation = X2(GlobalConsensus(Rococo), Parachain(1000)); + pub ExpectedNetworkId: NetworkId = Wococo; + } + + #[test] + fn from_network_contains_works() { + // asset and origin from foreign consensus works + let asset: MultiLocation = ( + Parent, + Parent, + GlobalConsensus(Wococo), + Parachain(1000), + PalletInstance(1), + GeneralIndex(1), + ) + .into(); + let origin: MultiLocation = + (Parent, Parent, GlobalConsensus(Wococo), Parachain(1000)).into(); + assert!(FromNetwork::::contains(&asset, &origin)); + + // asset and origin from local consensus fails + let asset: MultiLocation = ( + Parent, + Parent, + GlobalConsensus(Rococo), + Parachain(1000), + PalletInstance(1), + GeneralIndex(1), + ) + .into(); + let origin: MultiLocation = + (Parent, Parent, GlobalConsensus(Rococo), Parachain(1000)).into(); + assert!(!FromNetwork::::contains(&asset, &origin)); + + // asset and origin from here fails + let asset: MultiLocation = (PalletInstance(1), GeneralIndex(1)).into(); + let origin: MultiLocation = Here.into(); + assert!(!FromNetwork::::contains(&asset, &origin)); + + // asset from different consensus fails + let asset: MultiLocation = ( + Parent, + Parent, + GlobalConsensus(Polkadot), + Parachain(1000), + PalletInstance(1), + GeneralIndex(1), + ) + .into(); + let origin: MultiLocation = + (Parent, Parent, GlobalConsensus(Wococo), Parachain(1000)).into(); + assert!(!FromNetwork::::contains(&asset, &origin)); + + // origin from different consensus fails + let asset: MultiLocation = ( + Parent, + Parent, + GlobalConsensus(Wococo), + Parachain(1000), + PalletInstance(1), + GeneralIndex(1), + ) + .into(); + let origin: MultiLocation = + (Parent, Parent, GlobalConsensus(Polkadot), Parachain(1000)).into(); + assert!(!FromNetwork::::contains(&asset, &origin)); + + // asset and origin from unexpected consensus fails + let asset: MultiLocation = ( + Parent, + Parent, + GlobalConsensus(Polkadot), + Parachain(1000), + PalletInstance(1), + GeneralIndex(1), + ) + .into(); + let origin: MultiLocation = + (Parent, Parent, GlobalConsensus(Polkadot), Parachain(1000)).into(); + assert!(!FromNetwork::::contains(&asset, &origin)); + } +} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml index f8b279e3e3d..9cf4a07b6d2 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml @@ -106,6 +106,21 @@ pallet-bridge-relayers = { path = "../../../../../bridges/modules/relayers", def pallet-xcm-bridge-hub = { path = "../../../../../bridges/modules/xcm-bridge-hub", default-features = false } bridge-runtime-common = { path = "../../../../../bridges/bin/runtime-common", default-features = false } +# Ethereum Bridge (Snowbridge) +snowbridge-beacon-primitives = { path = "../../../../../bridges/snowbridge/parachain/primitives/beacon", default-features = false } +snowbridge-system = { path = "../../../../../bridges/snowbridge/parachain/pallets/system", default-features = false } +snowbridge-system-runtime-api = { path = "../../../../../bridges/snowbridge/parachain/pallets/system/runtime-api", default-features = false } +snowbridge-core = { path = "../../../../../bridges/snowbridge/parachain/primitives/core", default-features = false } +snowbridge-ethereum-beacon-client = { path = "../../../../../bridges/snowbridge/parachain/pallets/ethereum-beacon-client", default-features = false } +snowbridge-inbound-queue = { path = "../../../../../bridges/snowbridge/parachain/pallets/inbound-queue", default-features = false } +snowbridge-outbound-queue = { path = "../../../../../bridges/snowbridge/parachain/pallets/outbound-queue", default-features = false } +snowbridge-outbound-queue-runtime-api = { path = "../../../../../bridges/snowbridge/parachain/pallets/outbound-queue/runtime-api", default-features = false } +snowbridge-router-primitives = { path = "../../../../../bridges/snowbridge/parachain/primitives/router", default-features = false } +snowbridge-runtime-common = { path = "../../../../../bridges/snowbridge/parachain/runtime/runtime-common", default-features = false } +snowbridge-rococo-common = { path = "../../../../../bridges/snowbridge/parachain/runtime/rococo-common", default-features = false } + +bridge-hub-common = { path = "../common", default-features = false } + [dev-dependencies] static_assertions = "1.1" bridge-hub-test-utils = { path = "../test-utils" } @@ -131,6 +146,7 @@ std = [ "bp-rococo/std", "bp-runtime/std", "bp-westend/std", + "bridge-hub-common/std", "bridge-runtime-common/std", "codec/std", "cumulus-pallet-aura-ext/std", @@ -174,6 +190,17 @@ std = [ "rococo-runtime-constants/std", "scale-info/std", "serde", + "snowbridge-beacon-primitives/std", + "snowbridge-core/std", + "snowbridge-ethereum-beacon-client/std", + "snowbridge-inbound-queue/std", + "snowbridge-outbound-queue-runtime-api/std", + "snowbridge-outbound-queue/std", + "snowbridge-rococo-common/std", + "snowbridge-router-primitives/std", + "snowbridge-runtime-common/std", + "snowbridge-system-runtime-api/std", + "snowbridge-system/std", "sp-api/std", "sp-block-builder/std", "sp-consensus-aura/std", @@ -189,12 +216,15 @@ std = [ "sp-transaction-pool/std", "sp-version/std", "substrate-wasm-builder", + "substrate-wasm-builder", "xcm-builder/std", "xcm-executor/std", "xcm/std", ] runtime-benchmarks = [ + "beacon-spec-mainnet", + "bridge-hub-common/runtime-benchmarks", "bridge-runtime-common/runtime-benchmarks", "cumulus-pallet-parachain-system/runtime-benchmarks", "cumulus-pallet-session-benchmarking/runtime-benchmarks", @@ -221,6 +251,14 @@ runtime-benchmarks = [ "parachains-common/runtime-benchmarks", "polkadot-parachain-primitives/runtime-benchmarks", "polkadot-runtime-common/runtime-benchmarks", + "snowbridge-core/runtime-benchmarks", + "snowbridge-ethereum-beacon-client/runtime-benchmarks", + "snowbridge-inbound-queue/runtime-benchmarks", + "snowbridge-outbound-queue/runtime-benchmarks", + "snowbridge-rococo-common/runtime-benchmarks", + "snowbridge-router-primitives/runtime-benchmarks", + "snowbridge-runtime-common/runtime-benchmarks", + "snowbridge-system/runtime-benchmarks", "sp-runtime/runtime-benchmarks", "xcm-builder/runtime-benchmarks", "xcm-executor/runtime-benchmarks", @@ -253,10 +291,17 @@ try-runtime = [ "pallet-xcm/try-runtime", "parachain-info/try-runtime", "polkadot-runtime-common/try-runtime", + "snowbridge-ethereum-beacon-client/try-runtime", + "snowbridge-inbound-queue/try-runtime", + "snowbridge-outbound-queue/try-runtime", + "snowbridge-system/try-runtime", "sp-runtime/try-runtime", ] experimental = ["pallet-aura/experimental"] +beacon-spec-mainnet = [ + "snowbridge-ethereum-beacon-client/beacon-spec-mainnet", +] # A feature that should be enabled when the runtime should be built for on-chain # deployment. This will disable stuff that shouldn't be part of the on-chain wasm diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_ethereum_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_ethereum_config.rs new file mode 100644 index 00000000000..b0526148fa3 --- /dev/null +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_ethereum_config.rs @@ -0,0 +1,30 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +use crate::{ + xcm_config::{AgentIdOf, UniversalLocation}, + Runtime, +}; +use snowbridge_rococo_common::EthereumNetwork; +use snowbridge_router_primitives::outbound::EthereumBlobExporter; + +/// Exports message to the Ethereum Gateway contract. +pub type SnowbridgeExporter = EthereumBlobExporter< + UniversalLocation, + EthereumNetwork, + snowbridge_outbound_queue::Pallet, + AgentIdOf, +>; diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs index 75af5a8ef7b..4746e873bfa 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs @@ -30,18 +30,24 @@ include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); pub mod bridge_common_config; pub mod bridge_to_bulletin_config; +pub mod bridge_to_ethereum_config; pub mod bridge_to_westend_config; mod weights; pub mod xcm_config; use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; +use snowbridge_beacon_primitives::{Fork, ForkVersions}; +use snowbridge_core::{ + gwei, meth, outbound::Message, AgentId, AllowSiblingsOnly, PricingParameters, Rewards, +}; +use snowbridge_router_primitives::inbound::MessageToXcm; use sp_api::impl_runtime_apis; -use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; +use sp_core::{crypto::KeyTypeId, OpaqueMetadata, H160}; use sp_runtime::{ create_runtime_str, generic, impl_opaque_keys, - traits::Block as BlockT, + traits::{Block as BlockT, Keccak256}, transaction_validity::{TransactionSource, TransactionValidity}, - ApplyExtrinsicResult, + ApplyExtrinsicResult, FixedU128, }; use sp_std::prelude::*; @@ -49,7 +55,7 @@ use sp_std::prelude::*; use sp_version::NativeVersion; use sp_version::RuntimeVersion; -use cumulus_primitives_core::{AggregateMessageOrigin, ParaId}; +use cumulus_primitives_core::ParaId; use frame_support::{ construct_runtime, derive_impl, dispatch::DispatchClass, @@ -63,17 +69,25 @@ use frame_system::{ limits::{BlockLength, BlockWeights}, EnsureRoot, }; -use parachains_common::message_queue::{NarrowOriginToSibling, ParaIdToSibling}; -pub use sp_consensus_aura::sr25519::AuthorityId as AuraId; -pub use sp_runtime::{MultiAddress, Perbill, Permill}; -use xcm_config::{XcmOriginToTransactDispatchOrigin, XcmRouter}; use bp_runtime::HeaderId; +#[cfg(not(feature = "runtime-benchmarks"))] +use bridge_hub_common::BridgeHubMessageRouter; +use bridge_hub_common::{ + message_queue::{NarrowOriginToSibling, ParaIdToSibling}, + AggregateMessageOrigin, +}; +use pallet_xcm::EnsureXcm; +pub use sp_consensus_aura::sr25519::AuthorityId as AuraId; +pub use sp_runtime::{MultiAddress, Perbill, Permill}; +use xcm::VersionedMultiLocation; +use xcm_config::{TreasuryAccount, XcmOriginToTransactDispatchOrigin, XcmRouter}; #[cfg(any(feature = "std", test))] pub use sp_runtime::BuildStorage; use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; +use rococo_runtime_constants::system_parachain::{ASSET_HUB_ID, BRIDGE_HUB_ID}; use xcm::latest::prelude::*; use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; @@ -85,6 +99,19 @@ use parachains_common::{ HOURS, MAXIMUM_BLOCK_WEIGHT, NORMAL_DISPATCH_RATIO, SLOT_DURATION, }; +#[cfg(feature = "runtime-benchmarks")] +use crate::xcm_config::benchmark_helpers::DoNothingRouter; +#[cfg(feature = "runtime-benchmarks")] +use snowbridge_beacon_primitives::CompactExecutionHeader; +#[cfg(feature = "runtime-benchmarks")] +use snowbridge_core::RingBufferMap; +#[cfg(feature = "runtime-benchmarks")] +pub use snowbridge_ethereum_beacon_client::ExecutionHeaderBuffer; +#[cfg(feature = "runtime-benchmarks")] +use snowbridge_inbound_queue::BenchmarkHelper; +#[cfg(feature = "runtime-benchmarks")] +use sp_core::H256; + /// The address format for describing accounts. pub type Address = MultiAddress; @@ -124,6 +151,12 @@ pub type Migrations = ( pallet_multisig::migrations::v1::MigrateToV1, InitStorageVersions, cumulus_pallet_xcmp_queue::migration::v4::MigrationToV4, + // unreleased + snowbridge_system::migration::v0::InitializeOnUpgrade< + Runtime, + ConstU32, + ConstU32, + >, ); /// Migration to initialize storage versions for pallets added after genesis. @@ -325,21 +358,27 @@ impl cumulus_pallet_parachain_system::Config for Runtime { impl parachain_info::Config for Runtime {} parameter_types! { - pub MessageQueueServiceWeight: Weight = Perbill::from_percent(35) * RuntimeBlockWeights::get().max_block; + /// Amount of weight that can be spent per block to service messages. This was increased + /// from 35% to 60% of the max block weight to accommodate the Ethereum beacon light client + /// extrinsics. The force_checkpoint and submit extrinsics (for submit, optionally) includes + /// the sync committee's pubkeys (512 x 48 bytes) + pub MessageQueueServiceWeight: Weight = Perbill::from_percent(60) * RuntimeBlockWeights::get().max_block; } impl pallet_message_queue::Config for Runtime { type RuntimeEvent = RuntimeEvent; type WeightInfo = weights::pallet_message_queue::WeightInfo; #[cfg(feature = "runtime-benchmarks")] - type MessageProcessor = pallet_message_queue::mock_helpers::NoopMessageProcessor< - cumulus_primitives_core::AggregateMessageOrigin, - >; + type MessageProcessor = + pallet_message_queue::mock_helpers::NoopMessageProcessor; #[cfg(not(feature = "runtime-benchmarks"))] - type MessageProcessor = xcm_builder::ProcessXcmMessage< - AggregateMessageOrigin, - xcm_executor::XcmExecutor, - RuntimeCall, + type MessageProcessor = BridgeHubMessageRouter< + xcm_builder::ProcessXcmMessage< + AggregateMessageOrigin, + xcm_executor::XcmExecutor, + RuntimeCall, + >, + EthereumOutboundQueue, >; type Size = u32; // The XCMP queue pallet is only ever able to handle the `Sibling(ParaId)` origin: @@ -456,6 +495,151 @@ impl pallet_utility::Config for Runtime { type WeightInfo = weights::pallet_utility::WeightInfo; } +// Ethereum Bridge + +#[cfg(not(feature = "runtime-benchmarks"))] +parameter_types! { + pub storage EthereumGatewayAddress: H160 = H160::zero(); +} + +#[cfg(feature = "runtime-benchmarks")] +parameter_types! { + pub storage EthereumGatewayAddress: H160 = H160(hex_literal::hex!("EDa338E4dC46038493b885327842fD3E301CaB39")); +} + +parameter_types! { + pub const CreateAssetCall: [u8;2] = [53, 0]; + pub const CreateAssetDeposit: u128 = (UNITS / 10) + EXISTENTIAL_DEPOSIT; + pub const InboundQueuePalletInstance: u8 = snowbridge_rococo_common::INBOUND_QUEUE_MESSAGES_PALLET_INDEX; + pub Parameters: PricingParameters = PricingParameters { + exchange_rate: FixedU128::from_rational(1, 400), + fee_per_gas: gwei(20), + rewards: Rewards { local: 1 * UNITS, remote: meth(1) } + }; +} + +#[cfg(feature = "runtime-benchmarks")] +impl BenchmarkHelper for Runtime { + fn initialize_storage(block_hash: H256, header: CompactExecutionHeader) { + >::insert(block_hash, header); + } +} + +impl snowbridge_inbound_queue::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Verifier = snowbridge_ethereum_beacon_client::Pallet; + type Token = Balances; + #[cfg(not(feature = "runtime-benchmarks"))] + type XcmSender = XcmRouter; + #[cfg(feature = "runtime-benchmarks")] + type XcmSender = DoNothingRouter; + type ChannelLookup = EthereumSystem; + type GatewayAddress = EthereumGatewayAddress; + #[cfg(feature = "runtime-benchmarks")] + type Helper = Runtime; + type MessageConverter = MessageToXcm< + CreateAssetCall, + CreateAssetDeposit, + InboundQueuePalletInstance, + AccountId, + Balance, + >; + type WeightToFee = WeightToFee; + type LengthToFee = ConstantMultiplier; + type MaxMessageSize = ConstU32<2048>; + type WeightInfo = weights::snowbridge_inbound_queue::WeightInfo; + type PricingParameters = EthereumSystem; +} + +impl snowbridge_outbound_queue::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Hashing = Keccak256; + type MessageQueue = MessageQueue; + type Decimals = ConstU8<12>; + type MaxMessagePayloadSize = ConstU32<2048>; + type MaxMessagesPerBlock = ConstU32<32>; + type GasMeter = snowbridge_core::outbound::ConstantGasMeter; + type Balance = Balance; + type WeightToFee = WeightToFee; + type WeightInfo = weights::snowbridge_outbound_queue::WeightInfo; + type PricingParameters = EthereumSystem; + type Channels = EthereumSystem; +} + +#[cfg(not(feature = "beacon-spec-mainnet"))] +parameter_types! { + pub const ChainForkVersions: ForkVersions = ForkVersions { + genesis: Fork { + version: [0, 0, 0, 1], // 0x00000001 + epoch: 0, + }, + altair: Fork { + version: [1, 0, 0, 1], // 0x01000001 + epoch: 0, + }, + bellatrix: Fork { + version: [2, 0, 0, 1], // 0x02000001 + epoch: 0, + }, + capella: Fork { + version: [3, 0, 0, 1], // 0x03000001 + epoch: 0, + }, + }; + pub const MaxExecutionHeadersToKeep:u32 = 1000; +} + +#[cfg(feature = "beacon-spec-mainnet")] +parameter_types! { + pub const ChainForkVersions: ForkVersions = ForkVersions { + genesis: Fork { + version: [0, 0, 16, 32], // 0x00001020 + epoch: 0, + }, + altair: Fork { + version: [1, 0, 16, 32], // 0x01001020 + epoch: 36660, + }, + bellatrix: Fork { + version: [2, 0, 16, 32], // 0x02001020 + epoch: 112260, + }, + capella: Fork { + version: [3, 0, 16, 32], // 0x03001020 + epoch: 162304, + }, + }; + pub const MaxExecutionHeadersToKeep:u32 = 8192 * 2; +} + +impl snowbridge_ethereum_beacon_client::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type ForkVersions = ChainForkVersions; + type MaxExecutionHeadersToKeep = MaxExecutionHeadersToKeep; + type WeightInfo = weights::snowbridge_ethereum_beacon_client::WeightInfo; +} + +#[cfg(feature = "runtime-benchmarks")] +impl snowbridge_system::BenchmarkHelper for () { + fn make_xcm_origin(location: xcm::latest::MultiLocation) -> RuntimeOrigin { + RuntimeOrigin::from(pallet_xcm::Origin::Xcm(location)) + } +} + +impl snowbridge_system::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type OutboundQueue = EthereumOutboundQueue; + type SiblingOrigin = EnsureXcm; + type AgentIdOf = xcm_config::AgentIdOf; + type TreasuryAccount = TreasuryAccount; + type Token = Balances; + type WeightInfo = weights::snowbridge_system::WeightInfo; + #[cfg(feature = "runtime-benchmarks")] + type Helper = (); + type DefaultPricingParameters = Parameters; + type InboundDeliveryCost = EthereumInboundQueue; +} + // Create the runtime by composing the FRAME pallets that were previously configured. construct_runtime!( pub enum Runtime @@ -515,6 +699,11 @@ construct_runtime!( // With-Rococo Bulletin bridge hub pallet. XcmOverPolkadotBulletin: pallet_xcm_bridge_hub::::{Pallet} = 62, + EthereumInboundQueue: snowbridge_inbound_queue::{Pallet, Call, Storage, Event} = 80, + EthereumOutboundQueue: snowbridge_outbound_queue::{Pallet, Call, Storage, Event} = 81, + EthereumBeaconClient: snowbridge_ethereum_beacon_client::{Pallet, Call, Storage, Event} = 82, + EthereumSystem: snowbridge_system::{Pallet, Call, Storage, Config, Event} = 83, + // Message Queue. Importantly, is registered last so that messages are processed after // the `on_initialize` hooks of bridging pallets. MessageQueue: pallet_message_queue::{Pallet, Call, Storage, Event} = 250, @@ -564,6 +753,11 @@ mod benches { [pallet_bridge_messages, RococoToWestend] [pallet_bridge_messages, RococoToRococoBulletin] [pallet_bridge_relayers, BridgeRelayersBench::] + // Ethereum Bridge + [snowbridge_inbound_queue, EthereumInboundQueue] + [snowbridge_outbound_queue, EthereumOutboundQueue] + [snowbridge_system, EthereumSystem] + [snowbridge_ethereum_beacon_client, EthereumBeaconClient] ); } @@ -792,6 +986,22 @@ impl_runtime_apis! { } } + impl snowbridge_outbound_queue_runtime_api::OutboundQueueApi for Runtime { + fn prove_message(leaf_index: u64) -> Option { + snowbridge_outbound_queue::api::prove_message::(leaf_index) + } + + fn calculate_fee(message: Message) -> Option { + snowbridge_outbound_queue::api::calculate_fee::(message) + } + } + + impl snowbridge_system_runtime_api::ControlApi for Runtime { + fn agent_id(location: VersionedMultiLocation) -> Option { + snowbridge_system::api::agent_id::(location) + } + } + #[cfg(feature = "try-runtime")] impl frame_try_runtime::TryRuntime for Runtime { fn on_runtime_upgrade(checks: frame_try_runtime::UpgradeCheckSelect) -> (Weight, Weight) { diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/mod.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/mod.rs index 41e7ac54163..b134bb41ed1 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/mod.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/mod.rs @@ -40,6 +40,10 @@ pub mod pallet_utility; pub mod pallet_xcm; pub mod paritydb_weights; pub mod rocksdb_weights; +pub mod snowbridge_ethereum_beacon_client; +pub mod snowbridge_inbound_queue; +pub mod snowbridge_outbound_queue; +pub mod snowbridge_system; pub mod xcm; pub use block_weights::constants::BlockExecutionWeight; diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_ethereum_beacon_client.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_ethereum_beacon_client.rs new file mode 100644 index 00000000000..cd960597b44 --- /dev/null +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_ethereum_beacon_client.rs @@ -0,0 +1,151 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Autogenerated weights for `snowbridge_ethereum_beacon_client` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-06-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `ip-172-31-8-124`, CPU: `Intel(R) Xeon(R) Platinum 8375C CPU @ 2.90GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 + +// Executed Command: +// target/release/polkadot-parachain +// benchmark +// pallet +// --base-path +// /mnt/scratch/benchmark +// --chain=bridge-hub-rococo-dev +// --pallet=snowbridge_ethereum_beacon_client +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --steps +// 50 +// --repeat +// 20 +// --output +// ./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_ethereum_beacon_client.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `snowbridge_ethereum_beacon_client`. +pub struct WeightInfo(PhantomData); +impl snowbridge_ethereum_beacon_client::WeightInfo for WeightInfo { + /// Storage: EthereumBeaconClient FinalizedBeaconStateIndex (r:1 w:1) + /// Proof: EthereumBeaconClient FinalizedBeaconStateIndex (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: EthereumBeaconClient FinalizedBeaconStateMapping (r:1 w:1) + /// Proof: EthereumBeaconClient FinalizedBeaconStateMapping (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + /// Storage: EthereumBeaconClient NextSyncCommittee (r:0 w:1) + /// Proof: EthereumBeaconClient NextSyncCommittee (max_values: Some(1), max_size: Some(92372), added: 92867, mode: MaxEncodedLen) + /// Storage: EthereumBeaconClient InitialCheckpointRoot (r:0 w:1) + /// Proof: EthereumBeaconClient InitialCheckpointRoot (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) + /// Storage: EthereumBeaconClient ValidatorsRoot (r:0 w:1) + /// Proof: EthereumBeaconClient ValidatorsRoot (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) + /// Storage: EthereumBeaconClient LatestFinalizedBlockRoot (r:0 w:1) + /// Proof: EthereumBeaconClient LatestFinalizedBlockRoot (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) + /// Storage: EthereumBeaconClient CurrentSyncCommittee (r:0 w:1) + /// Proof: EthereumBeaconClient CurrentSyncCommittee (max_values: Some(1), max_size: Some(92372), added: 92867, mode: MaxEncodedLen) + /// Storage: EthereumBeaconClient LatestExecutionState (r:0 w:1) + /// Proof: EthereumBeaconClient LatestExecutionState (max_values: Some(1), max_size: Some(80), added: 575, mode: MaxEncodedLen) + /// Storage: EthereumBeaconClient FinalizedBeaconState (r:0 w:1) + /// Proof: EthereumBeaconClient FinalizedBeaconState (max_values: None, max_size: Some(72), added: 2547, mode: MaxEncodedLen) + fn force_checkpoint() -> Weight { + // Proof Size summary in bytes: + // Measured: `42` + // Estimated: `3501` + // Minimum execution time: 97_185_781_000 picoseconds. + Weight::from_parts(97_263_571_000, 0) + .saturating_add(Weight::from_parts(0, 3501)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(9)) + } + /// Storage: EthereumBeaconClient LatestFinalizedBlockRoot (r:1 w:1) + /// Proof: EthereumBeaconClient LatestFinalizedBlockRoot (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) + /// Storage: EthereumBeaconClient FinalizedBeaconState (r:1 w:1) + /// Proof: EthereumBeaconClient FinalizedBeaconState (max_values: None, max_size: Some(72), added: 2547, mode: MaxEncodedLen) + /// Storage: EthereumBeaconClient LatestExecutionState (r:1 w:0) + /// Proof: EthereumBeaconClient LatestExecutionState (max_values: Some(1), max_size: Some(80), added: 575, mode: MaxEncodedLen) + /// Storage: EthereumBeaconClient NextSyncCommittee (r:1 w:0) + /// Proof: EthereumBeaconClient NextSyncCommittee (max_values: Some(1), max_size: Some(92372), added: 92867, mode: MaxEncodedLen) + /// Storage: EthereumBeaconClient CurrentSyncCommittee (r:1 w:0) + /// Proof: EthereumBeaconClient CurrentSyncCommittee (max_values: Some(1), max_size: Some(92372), added: 92867, mode: MaxEncodedLen) + /// Storage: EthereumBeaconClient ValidatorsRoot (r:1 w:0) + /// Proof: EthereumBeaconClient ValidatorsRoot (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) + /// Storage: EthereumBeaconClient FinalizedBeaconStateIndex (r:1 w:1) + /// Proof: EthereumBeaconClient FinalizedBeaconStateIndex (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: EthereumBeaconClient FinalizedBeaconStateMapping (r:1 w:1) + /// Proof: EthereumBeaconClient FinalizedBeaconStateMapping (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + fn submit() -> Weight { + // Proof Size summary in bytes: + // Measured: `92753` + // Estimated: `93857` + // Minimum execution time: 25_999_968_000 picoseconds. + Weight::from_parts(26_051_019_000, 0) + .saturating_add(Weight::from_parts(0, 93857)) + .saturating_add(T::DbWeight::get().reads(8)) + .saturating_add(T::DbWeight::get().writes(4)) + } + /// Storage: EthereumBeaconClient LatestFinalizedBlockRoot (r:1 w:0) + /// Proof: EthereumBeaconClient LatestFinalizedBlockRoot (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) + /// Storage: EthereumBeaconClient FinalizedBeaconState (r:1 w:0) + /// Proof: EthereumBeaconClient FinalizedBeaconState (max_values: None, max_size: Some(72), added: 2547, mode: MaxEncodedLen) + /// Storage: EthereumBeaconClient LatestExecutionState (r:1 w:0) + /// Proof: EthereumBeaconClient LatestExecutionState (max_values: Some(1), max_size: Some(80), added: 575, mode: MaxEncodedLen) + /// Storage: EthereumBeaconClient NextSyncCommittee (r:1 w:1) + /// Proof: EthereumBeaconClient NextSyncCommittee (max_values: Some(1), max_size: Some(92372), added: 92867, mode: MaxEncodedLen) + /// Storage: EthereumBeaconClient CurrentSyncCommittee (r:1 w:0) + /// Proof: EthereumBeaconClient CurrentSyncCommittee (max_values: Some(1), max_size: Some(92372), added: 92867, mode: MaxEncodedLen) + /// Storage: EthereumBeaconClient ValidatorsRoot (r:1 w:0) + /// Proof: EthereumBeaconClient ValidatorsRoot (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) + fn submit_with_sync_committee() -> Weight { + // Proof Size summary in bytes: + // Measured: `92717` + // Estimated: `93857` + // Minimum execution time: 122_354_917_000 picoseconds. + Weight::from_parts(122_461_312_000, 0) + .saturating_add(Weight::from_parts(0, 93857)) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: EthereumBeaconClient LatestFinalizedBlockRoot (r:1 w:0) + /// Proof: EthereumBeaconClient LatestFinalizedBlockRoot (max_values: Some(1), max_size: Some(32), added: 527, mode: MaxEncodedLen) + /// Storage: EthereumBeaconClient FinalizedBeaconState (r:1 w:0) + /// Proof: EthereumBeaconClient FinalizedBeaconState (max_values: None, max_size: Some(72), added: 2547, mode: MaxEncodedLen) + /// Storage: EthereumBeaconClient LatestExecutionState (r:1 w:1) + /// Proof: EthereumBeaconClient LatestExecutionState (max_values: Some(1), max_size: Some(80), added: 575, mode: MaxEncodedLen) + /// Storage: EthereumBeaconClient ExecutionHeaderIndex (r:1 w:1) + /// Proof: EthereumBeaconClient ExecutionHeaderIndex (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: EthereumBeaconClient ExecutionHeaderMapping (r:1 w:1) + /// Proof: EthereumBeaconClient ExecutionHeaderMapping (max_values: None, max_size: Some(36), added: 2511, mode: MaxEncodedLen) + /// Storage: EthereumBeaconClient ExecutionHeaders (r:0 w:1) + /// Proof: EthereumBeaconClient ExecutionHeaders (max_values: None, max_size: Some(136), added: 2611, mode: MaxEncodedLen) + fn submit_execution_header() -> Weight { + // Proof Size summary in bytes: + // Measured: `386` + // Estimated: `3537` + // Minimum execution time: 108_761_000 picoseconds. + Weight::from_parts(113_158_000, 0) + .saturating_add(Weight::from_parts(0, 3537)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(4)) + } +} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_inbound_queue.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_inbound_queue.rs new file mode 100644 index 00000000000..f734227a411 --- /dev/null +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_inbound_queue.rs @@ -0,0 +1,69 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Autogenerated weights for `snowbridge_inbound_queue` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-09-06, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `macbook pro 14 m2`, CPU: `m2-arm64` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 + +// Executed Command: +// target/release/polkadot-parachain +// benchmark +// pallet +// --chain=bridge-hub-rococo-dev +// --pallet=snowbridge_inbound_queue +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --steps +// 50 +// --repeat +// 20 +// --output +// ./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_inbound_queue.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `snowbridge_inbound_queue`. +pub struct WeightInfo(PhantomData); +impl snowbridge_inbound_queue::WeightInfo for WeightInfo { + /// Storage: EthereumInboundQueue PalletOperatingMode (r:1 w:0) + /// Proof: EthereumInboundQueue PalletOperatingMode (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + /// Storage: EthereumBeaconClient ExecutionHeaders (r:1 w:0) + /// Proof: EthereumBeaconClient ExecutionHeaders (max_values: None, max_size: Some(136), added: 2611, mode: MaxEncodedLen) + /// Storage: EthereumInboundQueue Nonce (r:1 w:1) + /// Proof: EthereumInboundQueue Nonce (max_values: None, max_size: Some(20), added: 2495, mode: MaxEncodedLen) + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + fn submit() -> Weight { + // Proof Size summary in bytes: + // Measured: `457` + // Estimated: `3601` + // Minimum execution time: 69_000_000 picoseconds. + Weight::from_parts(70_000_000, 0) + .saturating_add(Weight::from_parts(0, 3601)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(2)) + } +} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_outbound_queue.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_outbound_queue.rs new file mode 100644 index 00000000000..6cffbc5344a --- /dev/null +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_outbound_queue.rs @@ -0,0 +1,87 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Autogenerated weights for `snowbridge_outbound_queue` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-10-20, STEPS: `2`, REPEAT: `1`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `192.168.1.13`, CPU: `` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 + +// Executed Command: +// ../target/release/polkadot-parachain +// benchmark +// pallet +// --chain=bridge-hub-rococo-dev +// --pallet=snowbridge_outbound_queue +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --output +// ../parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_outbound_queue.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `snowbridge_outbound_queue`. +pub struct WeightInfo(PhantomData); +impl snowbridge_outbound_queue::WeightInfo for WeightInfo { + /// Storage: EthereumOutboundQueue MessageLeaves (r:1 w:1) + /// Proof Skipped: EthereumOutboundQueue MessageLeaves (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: EthereumOutboundQueue PendingHighPriorityMessageCount (r:1 w:1) + /// Proof: EthereumOutboundQueue PendingHighPriorityMessageCount (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: EthereumOutboundQueue Nonce (r:1 w:1) + /// Proof: EthereumOutboundQueue Nonce (max_values: None, max_size: Some(20), added: 2495, mode: MaxEncodedLen) + /// Storage: EthereumOutboundQueue Messages (r:1 w:1) + /// Proof Skipped: EthereumOutboundQueue Messages (max_values: Some(1), max_size: None, mode: Measured) + fn do_process_message() -> Weight { + // Proof Size summary in bytes: + // Measured: `42` + // Estimated: `3485` + // Minimum execution time: 39_000_000 picoseconds. + Weight::from_parts(39_000_000, 3485) + .saturating_add(T::DbWeight::get().reads(4_u64)) + .saturating_add(T::DbWeight::get().writes(4_u64)) + } + /// Storage: EthereumOutboundQueue MessageLeaves (r:1 w:0) + /// Proof Skipped: EthereumOutboundQueue MessageLeaves (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: System Digest (r:1 w:1) + /// Proof Skipped: System Digest (max_values: Some(1), max_size: None, mode: Measured) + fn commit() -> Weight { + // Proof Size summary in bytes: + // Measured: `1094` + // Estimated: `2579` + // Minimum execution time: 28_000_000 picoseconds. + Weight::from_parts(28_000_000, 2579) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } + + fn commit_single() -> Weight { + // Proof Size summary in bytes: + // Measured: `1094` + // Estimated: `2579` + // Minimum execution time: 9_000_000 picoseconds. + Weight::from_parts(9_000_000, 1586) + .saturating_add(T::DbWeight::get().reads(2_u64)) + .saturating_add(T::DbWeight::get().writes(1_u64)) + } +} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_system.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_system.rs new file mode 100644 index 00000000000..88c6c669c88 --- /dev/null +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_system.rs @@ -0,0 +1,256 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Autogenerated weights for `snowbridge_system` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-10-09, STEPS: `2`, REPEAT: `1`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `crake.local`, CPU: `` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("bridge-hub-rococo-dev"), DB CACHE: 1024 + +// Executed Command: +// target/release/polkadot-parachain +// benchmark +// pallet +// --chain +// bridge-hub-rococo-dev +// --pallet=snowbridge_system +// --extrinsic=* +// --execution=wasm +// --wasm-execution=compiled +// --output +// parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_system.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `snowbridge_system`. +pub struct WeightInfo(PhantomData); +impl snowbridge_system::WeightInfo for WeightInfo { + /// Storage: ParachainInfo ParachainId (r:1 w:0) + /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: EthereumOutboundQueue PalletOperatingMode (r:1 w:0) + /// Proof: EthereumOutboundQueue PalletOperatingMode (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + /// Storage: MessageQueue BookStateFor (r:1 w:1) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: MessageQueue ServiceHead (r:1 w:1) + /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(5), added: 500, mode: MaxEncodedLen) + /// Storage: MessageQueue Pages (r:0 w:1) + /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + fn upgrade() -> Weight { + // Proof Size summary in bytes: + // Measured: `80` + // Estimated: `3517` + // Minimum execution time: 47_000_000 picoseconds. + Weight::from_parts(47_000_000, 0) + .saturating_add(Weight::from_parts(0, 3517)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: EthereumSystem Agents (r:1 w:1) + /// Proof: EthereumSystem Agents (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) + /// Storage: System Account (r:2 w:2) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: ParachainInfo ParachainId (r:1 w:0) + /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: EthereumOutboundQueue PalletOperatingMode (r:1 w:0) + /// Proof: EthereumOutboundQueue PalletOperatingMode (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + /// Storage: MessageQueue BookStateFor (r:1 w:1) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: MessageQueue ServiceHead (r:1 w:1) + /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(5), added: 500, mode: MaxEncodedLen) + /// Storage: MessageQueue Pages (r:0 w:1) + /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + fn create_agent() -> Weight { + // Proof Size summary in bytes: + // Measured: `187` + // Estimated: `6196` + // Minimum execution time: 87_000_000 picoseconds. + Weight::from_parts(87_000_000, 0) + .saturating_add(Weight::from_parts(0, 6196)) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(6)) + } + /// Storage: System Account (r:2 w:2) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: EthereumSystem Agents (r:1 w:0) + /// Proof: EthereumSystem Agents (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) + /// Storage: EthereumSystem Channels (r:1 w:1) + /// Proof: EthereumSystem Channels (max_values: None, max_size: Some(12), added: 2487, mode: MaxEncodedLen) + /// Storage: ParachainInfo ParachainId (r:1 w:0) + /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: EthereumOutboundQueue PalletOperatingMode (r:1 w:0) + /// Proof: EthereumOutboundQueue PalletOperatingMode (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + /// Storage: MessageQueue BookStateFor (r:1 w:1) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: MessageQueue Pages (r:1 w:1) + /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + fn create_channel() -> Weight { + // Proof Size summary in bytes: + // Measured: `602` + // Estimated: `69050` + // Minimum execution time: 84_000_000 picoseconds. + Weight::from_parts(84_000_000, 0) + .saturating_add(Weight::from_parts(0, 69050)) + .saturating_add(T::DbWeight::get().reads(8)) + .saturating_add(T::DbWeight::get().writes(5)) + } + /// Storage: EthereumSystem Channels (r:1 w:0) + /// Proof: EthereumSystem Channels (max_values: None, max_size: Some(12), added: 2487, mode: MaxEncodedLen) + /// Storage: EthereumOutboundQueue PalletOperatingMode (r:1 w:0) + /// Proof: EthereumOutboundQueue PalletOperatingMode (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + /// Storage: MessageQueue BookStateFor (r:2 w:2) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: MessageQueue ServiceHead (r:1 w:0) + /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(5), added: 500, mode: MaxEncodedLen) + /// Storage: MessageQueue Pages (r:0 w:1) + /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + fn update_channel() -> Weight { + // Proof Size summary in bytes: + // Measured: `256` + // Estimated: `6044` + // Minimum execution time: 41_000_000 picoseconds. + Weight::from_parts(41_000_000, 0) + .saturating_add(Weight::from_parts(0, 6044)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: EthereumSystem Channels (r:1 w:0) + /// Proof: EthereumSystem Channels (max_values: None, max_size: Some(12), added: 2487, mode: MaxEncodedLen) + /// Storage: EthereumOutboundQueue PalletOperatingMode (r:1 w:0) + /// Proof: EthereumOutboundQueue PalletOperatingMode (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + /// Storage: MessageQueue BookStateFor (r:2 w:2) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: MessageQueue ServiceHead (r:1 w:0) + /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(5), added: 500, mode: MaxEncodedLen) + /// Storage: MessageQueue Pages (r:0 w:1) + /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + fn force_update_channel() -> Weight { + // Proof Size summary in bytes: + // Measured: `256` + // Estimated: `6044` + // Minimum execution time: 41_000_000 picoseconds. + Weight::from_parts(41_000_000, 0) + .saturating_add(Weight::from_parts(0, 6044)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: ParachainInfo ParachainId (r:1 w:0) + /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: EthereumOutboundQueue PalletOperatingMode (r:1 w:0) + /// Proof: EthereumOutboundQueue PalletOperatingMode (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + /// Storage: MessageQueue BookStateFor (r:1 w:1) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: MessageQueue ServiceHead (r:1 w:1) + /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(5), added: 500, mode: MaxEncodedLen) + /// Storage: MessageQueue Pages (r:0 w:1) + /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + fn set_operating_mode() -> Weight { + // Proof Size summary in bytes: + // Measured: `80` + // Estimated: `3517` + // Minimum execution time: 30_000_000 picoseconds. + Weight::from_parts(30_000_000, 0) + .saturating_add(Weight::from_parts(0, 3517)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: EthereumSystem Agents (r:1 w:0) + /// Proof: EthereumSystem Agents (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) + /// Storage: EthereumOutboundQueue PalletOperatingMode (r:1 w:0) + /// Proof: EthereumOutboundQueue PalletOperatingMode (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + /// Storage: MessageQueue BookStateFor (r:2 w:2) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: MessageQueue ServiceHead (r:1 w:0) + /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(5), added: 500, mode: MaxEncodedLen) + /// Storage: MessageQueue Pages (r:0 w:1) + /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + fn transfer_native_from_agent() -> Weight { + // Proof Size summary in bytes: + // Measured: `252` + // Estimated: `6044` + // Minimum execution time: 43_000_000 picoseconds. + Weight::from_parts(43_000_000, 0) + .saturating_add(Weight::from_parts(0, 6044)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: EthereumSystem Agents (r:1 w:0) + /// Proof: EthereumSystem Agents (max_values: None, max_size: Some(40), added: 2515, mode: MaxEncodedLen) + /// Storage: EthereumOutboundQueue PalletOperatingMode (r:1 w:0) + /// Proof: EthereumOutboundQueue PalletOperatingMode (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + /// Storage: MessageQueue BookStateFor (r:2 w:2) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: MessageQueue ServiceHead (r:1 w:0) + /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(5), added: 500, mode: MaxEncodedLen) + /// Storage: MessageQueue Pages (r:0 w:1) + /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + fn force_transfer_native_from_agent() -> Weight { + // Proof Size summary in bytes: + // Measured: `252` + // Estimated: `6044` + // Minimum execution time: 42_000_000 picoseconds. + Weight::from_parts(42_000_000, 0) + .saturating_add(Weight::from_parts(0, 6044)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(3)) + } + + /// Storage: ParachainInfo ParachainId (r:1 w:0) + /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: EthereumOutboundQueue PalletOperatingMode (r:1 w:0) + /// Proof: EthereumOutboundQueue PalletOperatingMode (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + /// Storage: MessageQueue BookStateFor (r:1 w:1) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: MessageQueue ServiceHead (r:1 w:1) + /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(5), added: 500, mode: MaxEncodedLen) + /// Storage: MessageQueue Pages (r:0 w:1) + /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + fn set_token_transfer_fees() -> Weight { + // Proof Size summary in bytes: + // Measured: `80` + // Estimated: `3517` + // Minimum execution time: 31_000_000 picoseconds. + Weight::from_parts(42_000_000, 3517) + .saturating_add(T::DbWeight::get().reads(4_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) + } + + /// Storage: ParachainInfo ParachainId (r:1 w:0) + /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: EthereumOutboundQueue PalletOperatingMode (r:1 w:0) + /// Proof: EthereumOutboundQueue PalletOperatingMode (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) + /// Storage: MessageQueue BookStateFor (r:1 w:1) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: MessageQueue ServiceHead (r:1 w:1) + /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(5), added: 500, mode: MaxEncodedLen) + /// Storage: MessageQueue Pages (r:0 w:1) + /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + fn set_pricing_parameters() -> Weight { + // Proof Size summary in bytes: + // Measured: `80` + // Estimated: `3517` + // Minimum execution time: 31_000_000 picoseconds. + Weight::from_parts(42_000_000, 3517) + .saturating_add(T::DbWeight::get().reads(4_u64)) + .saturating_add(T::DbWeight::get().writes(3_u64)) + } +} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs index f89e7b39db8..47828f13688 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs @@ -26,6 +26,7 @@ use crate::{ }, bridge_to_bulletin_config::WithRococoBulletinMessagesInstance, bridge_to_westend_config::WithBridgeHubWestendMessagesInstance, + EthereumGatewayAddress, }; use bp_messages::LaneId; use bp_relayers::{PayRewardFromAccount, RewardsAccountOwner, RewardsAccountParams}; @@ -46,24 +47,26 @@ use parachains_common::{ }; use polkadot_parachain_primitives::primitives::Sibling; use polkadot_runtime_common::xcm_sender::ExponentialPrice; -use sp_core::Get; +use snowbridge_core::DescribeHere; +use snowbridge_rococo_common::EthereumNetwork; +use snowbridge_runtime_common::XcmExportFeeToSibling; +use sp_core::{Get, H256}; use sp_runtime::traits::AccountIdConversion; use sp_std::marker::PhantomData; use xcm::latest::prelude::*; #[allow(deprecated)] -use xcm_builder::CurrencyAdapter; use xcm_builder::{ deposit_or_burn_fee, AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, - DenyReserveTransferToRelayChain, DenyThenTry, EnsureXcmOrigin, HandleFee, IsConcrete, - ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, - SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, - SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, - WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, XcmFeeManagerFromComponents, + CurrencyAdapter, DenyReserveTransferToRelayChain, DenyThenTry, DescribeAllTerminal, + DescribeFamily, EnsureXcmOrigin, HandleFee, HashedDescription, IsConcrete, ParentAsSuperuser, + ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, + SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, + TrailingSetTopicAsId, UsingComponents, WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, XcmFeeToAccount, }; use xcm_executor::{ - traits::{FeeReason, TransactAsset, WithOriginFilter}, + traits::{FeeManager, FeeReason, FeeReason::Export, TransactAsset, WithOriginFilter}, XcmExecutor, }; @@ -160,7 +163,8 @@ impl Contains for SafeCallFilter { RuntimeCall::System(frame_system::Call::set_storage { items }) if items.iter().all(|(k, _)| { k.eq(&DeliveryRewardInBalance::key()) | - k.eq(&RequiredStakeForStakeAndSlash::key()) + k.eq(&RequiredStakeForStakeAndSlash::key()) | + k.eq(&EthereumGatewayAddress::key()) }) => return true, _ => (), @@ -217,7 +221,15 @@ impl Contains for SafeCallFilter { RuntimeCall::BridgePolkadotBulletinMessages(pallet_bridge_messages::Call::< Runtime, WithRococoBulletinMessagesInstance, - >::set_operating_mode { .. }) + >::set_operating_mode { .. }) | + RuntimeCall::EthereumBeaconClient( + snowbridge_ethereum_beacon_client::Call::force_checkpoint { .. } | + snowbridge_ethereum_beacon_client::Call::set_operating_mode { .. }, + ) | RuntimeCall::EthereumInboundQueue( + snowbridge_inbound_queue::Call::set_operating_mode { .. }, + ) | RuntimeCall::EthereumOutboundQueue( + snowbridge_outbound_queue::Call::set_operating_mode { .. }, + ) | RuntimeCall::EthereumSystem(..) ) } } @@ -291,7 +303,7 @@ impl xcm_executor::Config for XcmConfig { type SubscriptionService = PolkadotXcm; type PalletInstancesInfo = AllPalletsWithSystem; type MaxAssetsIntoHolding = MaxAssetsIntoHolding; - type FeeManager = XcmFeeManagerFromComponents< + type FeeManager = XcmFeeManagerFromComponentsBridgeHub< WaivedLocations, ( XcmExportFeeToRelayerRewardAccounts< @@ -301,12 +313,21 @@ impl xcm_executor::Config for XcmConfig { crate::bridge_to_westend_config::BridgeHubWestendChainId, crate::bridge_to_westend_config::AssetHubRococoToAssetHubWestendMessagesLane, >, + XcmExportFeeToSibling< + bp_rococo::Balance, + AccountId, + TokenLocation, + EthereumNetwork, + Self::AssetTransactor, + crate::EthereumOutboundQueue, + >, XcmFeeToAccount, ), >; type MessageExporter = ( crate::bridge_to_westend_config::ToBridgeHubWestendHaulBlobExporter, crate::bridge_to_bulletin_config::ToRococoBulletinHaulBlobExporter, + crate::bridge_to_ethereum_config::SnowbridgeExporter, ); type UniversalAliases = Nothing; type CallDispatcher = WithOriginFilter; @@ -367,6 +388,10 @@ impl cumulus_pallet_xcm::Config for Runtime { type XcmExecutor = XcmExecutor; } +/// Creates an AgentId from a MultiLocation. An AgentId is a unique mapping to a Agent contract on +/// Ethereum which acts as the sovereign account for the MultiLocation. +pub type AgentIdOf = HashedDescription)>; + /// A `HandleFee` implementation that simply deposits the fees for `ExportMessage` XCM instructions /// into the accounts that are used for paying the relayer rewards. /// Burns the fees in case of a failure. @@ -459,3 +484,41 @@ impl< fee } } + +pub struct XcmFeeManagerFromComponentsBridgeHub( + PhantomData<(WaivedLocations, HandleFee)>, +); +impl, FeeHandler: HandleFee> FeeManager + for XcmFeeManagerFromComponentsBridgeHub +{ + fn is_waived(origin: Option<&MultiLocation>, fee_reason: FeeReason) -> bool { + let Some(loc) = origin else { return false }; + if let Export { network, destination: Here } = fee_reason { + return !(network == EthereumNetwork::get()) + } + WaivedLocations::contains(loc) + } + + fn handle_fee(fee: MultiAssets, context: Option<&XcmContext>, reason: FeeReason) { + FeeHandler::handle_fee(fee, context, reason); + } +} + +#[cfg(feature = "runtime-benchmarks")] +pub mod benchmark_helpers { + use crate::{MultiAssets, MultiLocation, SendError, SendResult, SendXcm, Xcm, XcmHash}; + + pub struct DoNothingRouter; + impl SendXcm for DoNothingRouter { + type Ticket = (); + fn validate( + _dest: &mut Option, + _msg: &mut Option>, + ) -> SendResult<()> { + Ok(((), MultiAssets::new())) + } + fn deliver(_: ()) -> Result { + Ok([0; 32]) + } + } +} diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs index 390ac449f8c..0d96d66b31d 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs @@ -20,13 +20,14 @@ use bp_polkadot_core::Signature; use bridge_hub_rococo_runtime::{ bridge_common_config, bridge_to_bulletin_config, bridge_to_westend_config, xcm_config::{RelayNetwork, TokenLocation, XcmConfig}, - AllPalletsWithoutSystem, BridgeRejectObsoleteHeadersAndMessages, Executive, ExistentialDeposit, - ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, SessionKeys, - SignedExtra, TransactionPayment, UncheckedExtrinsic, + AllPalletsWithoutSystem, BridgeRejectObsoleteHeadersAndMessages, EthereumGatewayAddress, + Executive, ExistentialDeposit, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, + RuntimeEvent, RuntimeOrigin, SessionKeys, SignedExtra, TransactionPayment, UncheckedExtrinsic, }; use codec::{Decode, Encode}; use frame_support::{dispatch::GetDispatchInfo, parameter_types, traits::ConstU8}; use parachains_common::{rococo::fee::WeightToFee, AccountId, AuraId, Balance}; +use sp_core::H160; use sp_keyring::AccountKeyring::Alice; use sp_runtime::{ generic::{Era, SignedPayload}, @@ -182,6 +183,21 @@ mod bridge_hub_westend_tests { >(collator_session_keys(), bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID) } + #[test] + fn change_ethereum_gateway_by_governance_works() { + bridge_hub_test_utils::test_cases::change_storage_constant_by_governance_works::< + Runtime, + EthereumGatewayAddress, + H160, + >( + collator_session_keys(), + bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, + Box::new(|call| RuntimeCall::System(call).encode()), + || (EthereumGatewayAddress::key().to_vec(), EthereumGatewayAddress::get()), + |_| [1; 20].into(), + ) + } + #[test] fn change_delivery_reward_by_governance_works() { bridge_hub_test_utils::test_cases::change_storage_constant_by_governance_works::< diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml index 07c1a328285..94e29fb90ac 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml @@ -95,6 +95,7 @@ pallet-bridge-parachains = { path = "../../../../../bridges/modules/parachains", pallet-bridge-relayers = { path = "../../../../../bridges/modules/relayers", default-features = false } pallet-xcm-bridge-hub = { path = "../../../../../bridges/modules/xcm-bridge-hub", default-features = false } bridge-runtime-common = { path = "../../../../../bridges/bin/runtime-common", default-features = false } +bridge-hub-common = { path = "../../bridge-hubs/common", default-features = false } [dev-dependencies] static_assertions = "1.1" @@ -117,6 +118,7 @@ std = [ "bp-rococo/std", "bp-runtime/std", "bp-westend/std", + "bridge-hub-common/std", "bridge-runtime-common/std", "codec/std", "cumulus-pallet-aura-ext/std", @@ -181,6 +183,7 @@ std = [ ] runtime-benchmarks = [ + "bridge-hub-common/runtime-benchmarks", "bridge-runtime-common/runtime-benchmarks", "cumulus-pallet-parachain-system/runtime-benchmarks", "cumulus-pallet-session-benchmarking/runtime-benchmarks", diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs index a052cd929b7..717cde6280d 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs @@ -33,8 +33,7 @@ mod weights; pub mod xcm_config; use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; -use cumulus_primitives_core::{AggregateMessageOrigin, ParaId}; -use parachains_common::message_queue::{NarrowOriginToSibling, ParaIdToSibling}; +use cumulus_primitives_core::ParaId; use sp_api::impl_runtime_apis; use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; use sp_runtime::{ @@ -49,6 +48,10 @@ use sp_std::prelude::*; use sp_version::NativeVersion; use sp_version::RuntimeVersion; +use bridge_hub_common::{ + message_queue::{NarrowOriginToSibling, ParaIdToSibling}, + AggregateMessageOrigin, +}; use frame_support::{ construct_runtime, derive_impl, dispatch::DispatchClass, @@ -328,9 +331,8 @@ impl pallet_message_queue::Config for Runtime { type RuntimeEvent = RuntimeEvent; type WeightInfo = weights::pallet_message_queue::WeightInfo; #[cfg(feature = "runtime-benchmarks")] - type MessageProcessor = pallet_message_queue::mock_helpers::NoopMessageProcessor< - cumulus_primitives_core::AggregateMessageOrigin, - >; + type MessageProcessor = + pallet_message_queue::mock_helpers::NoopMessageProcessor; #[cfg(not(feature = "runtime-benchmarks"))] type MessageProcessor = xcm_builder::ProcessXcmMessage< AggregateMessageOrigin, diff --git a/cumulus/parachains/runtimes/bridge-hubs/common/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/common/Cargo.toml new file mode 100644 index 00000000000..0d75bb2213f --- /dev/null +++ b/cumulus/parachains/runtimes/bridge-hubs/common/Cargo.toml @@ -0,0 +1,42 @@ +[package] +name = "bridge-hub-common" +version = "0.1.0" +authors.workspace = true +edition.workspace = true +description = "Bridge hub common utilities" +license = "Apache-2.0" + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } +scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } +frame-support = { path = "../../../../../substrate/frame/support", default-features = false } +sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } +sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } +sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-features = false } +cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } +xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } +pallet-message-queue = { path = "../../../../../substrate/frame/message-queue", default-features = false } +snowbridge-core = { path = "../../../../../bridges/snowbridge/parachain/primitives/core", default-features = false } + +[features] +default = ["std"] +std = [ + "codec/std", + "cumulus-primitives-core/std", + "frame-support/std", + "pallet-message-queue/std", + "scale-info/std", + "snowbridge-core/std", + "sp-core/std", + "sp-runtime/std", + "sp-std/std", + "xcm/std", +] + +runtime-benchmarks = [ + "cumulus-primitives-core/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "pallet-message-queue/runtime-benchmarks", + "snowbridge-core/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", +] diff --git a/cumulus/parachains/runtimes/bridge-hubs/common/src/digest_item.rs b/cumulus/parachains/runtimes/bridge-hubs/common/src/digest_item.rs new file mode 100644 index 00000000000..bdfcaedbe82 --- /dev/null +++ b/cumulus/parachains/runtimes/bridge-hubs/common/src/digest_item.rs @@ -0,0 +1,34 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//! Custom digest items + +use codec::{Decode, Encode}; +use sp_core::{RuntimeDebug, H256}; +use sp_runtime::generic::DigestItem; + +/// Custom header digest items, inserted as DigestItem::Other +#[derive(Encode, Decode, Copy, Clone, Eq, PartialEq, RuntimeDebug)] +pub enum CustomDigestItem { + #[codec(index = 0)] + /// Merkle root of outbound Snowbridge messages. + Snowbridge(H256), +} + +/// Convert custom application digest item into a concrete digest item +impl From for DigestItem { + fn from(val: CustomDigestItem) -> Self { + DigestItem::Other(val.encode()) + } +} diff --git a/cumulus/parachains/runtimes/bridge-hubs/common/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/common/src/lib.rs new file mode 100644 index 00000000000..aac6eb03652 --- /dev/null +++ b/cumulus/parachains/runtimes/bridge-hubs/common/src/lib.rs @@ -0,0 +1,21 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#![cfg_attr(not(feature = "std"), no_std)] + +pub mod digest_item; +pub mod message_queue; + +pub use digest_item::CustomDigestItem; +pub use message_queue::{AggregateMessageOrigin, BridgeHubMessageRouter}; diff --git a/cumulus/parachains/runtimes/bridge-hubs/common/src/message_queue.rs b/cumulus/parachains/runtimes/bridge-hubs/common/src/message_queue.rs new file mode 100644 index 00000000000..651537ff8b7 --- /dev/null +++ b/cumulus/parachains/runtimes/bridge-hubs/common/src/message_queue.rs @@ -0,0 +1,146 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//! Runtime configuration for MessageQueue pallet +use codec::{Decode, Encode, MaxEncodedLen}; +use cumulus_primitives_core::{AggregateMessageOrigin as CumulusAggregateMessageOrigin, ParaId}; +use frame_support::{ + traits::{ProcessMessage, ProcessMessageError, QueueFootprint, QueuePausedQuery}, + weights::WeightMeter, +}; +use pallet_message_queue::OnQueueChanged; +use scale_info::TypeInfo; +use snowbridge_core::ChannelId; +use sp_std::{marker::PhantomData, prelude::*}; +use xcm::v3::{Junction, MultiLocation}; + +/// The aggregate origin of an inbound message. +/// This is specialized for BridgeHub, as the snowbridge-outbound-queue pallet is also using +/// the shared MessageQueue pallet. +#[derive(Encode, Decode, Copy, MaxEncodedLen, Clone, Eq, PartialEq, TypeInfo, Debug)] +pub enum AggregateMessageOrigin { + /// The message came from the para-chain itself. + Here, + /// The message came from the relay-chain. + /// + /// This is used by the DMP queue. + Parent, + /// The message came from a sibling para-chain. + /// + /// This is used by the HRMP queue. + Sibling(ParaId), + /// The message came from a snowbridge channel. + /// + /// This is used by Snowbridge inbound queue. + Snowbridge(ChannelId), +} + +impl From for MultiLocation { + fn from(origin: AggregateMessageOrigin) -> Self { + use AggregateMessageOrigin::*; + match origin { + Here => MultiLocation::here(), + Parent => MultiLocation::parent(), + Sibling(id) => MultiLocation::new(1, Junction::Parachain(id.into())), + // NOTE: We don't need this conversion for Snowbridge. However we have to + // implement it anyway as xcm_builder::ProcessXcmMessage requires it. + Snowbridge(_) => MultiLocation::default(), + } + } +} + +impl From for AggregateMessageOrigin { + fn from(origin: CumulusAggregateMessageOrigin) -> Self { + match origin { + CumulusAggregateMessageOrigin::Here => Self::Here, + CumulusAggregateMessageOrigin::Parent => Self::Parent, + CumulusAggregateMessageOrigin::Sibling(id) => Self::Sibling(id), + } + } +} + +#[cfg(feature = "runtime-benchmarks")] +impl From for AggregateMessageOrigin { + fn from(x: u32) -> Self { + match x { + 0 => Self::Here, + 1 => Self::Parent, + p => Self::Sibling(ParaId::from(p)), + } + } +} + +/// Routes messages to either the XCMP or Snowbridge processor. +pub struct BridgeHubMessageRouter( + PhantomData<(XcmpProcessor, SnowbridgeProcessor)>, +) +where + XcmpProcessor: ProcessMessage, + SnowbridgeProcessor: ProcessMessage; + +impl ProcessMessage + for BridgeHubMessageRouter +where + XcmpProcessor: ProcessMessage, + SnowbridgeProcessor: ProcessMessage, +{ + type Origin = AggregateMessageOrigin; + + fn process_message( + message: &[u8], + origin: Self::Origin, + meter: &mut WeightMeter, + id: &mut [u8; 32], + ) -> Result { + use AggregateMessageOrigin::*; + match origin { + Here | Parent | Sibling(_) => + XcmpProcessor::process_message(message, origin, meter, id), + Snowbridge(_) => SnowbridgeProcessor::process_message(message, origin, meter, id), + } + } +} + +/// Narrow the scope of the `Inner` query from `AggregateMessageOrigin` to `ParaId`. +/// +/// All non-`Sibling` variants will be ignored. +pub struct NarrowOriginToSibling(PhantomData); +impl> QueuePausedQuery + for NarrowOriginToSibling +{ + fn is_paused(origin: &AggregateMessageOrigin) -> bool { + match origin { + AggregateMessageOrigin::Sibling(id) => Inner::is_paused(id), + _ => false, + } + } +} + +impl> OnQueueChanged + for NarrowOriginToSibling +{ + fn on_queue_changed(origin: AggregateMessageOrigin, fp: QueueFootprint) { + if let AggregateMessageOrigin::Sibling(id) = origin { + Inner::on_queue_changed(id, fp) + } + } +} + +/// Convert a sibling `ParaId` to an `AggregateMessageOrigin`. +pub struct ParaIdToSibling; +impl sp_runtime::traits::Convert for ParaIdToSibling { + fn convert(para_id: ParaId) -> AggregateMessageOrigin { + AggregateMessageOrigin::Sibling(para_id) + } +} diff --git a/cumulus/parachains/runtimes/testing/penpal/Cargo.toml b/cumulus/parachains/runtimes/testing/penpal/Cargo.toml index 4e2d145feb4..a21023a9331 100644 --- a/cumulus/parachains/runtimes/testing/penpal/Cargo.toml +++ b/cumulus/parachains/runtimes/testing/penpal/Cargo.toml @@ -78,10 +78,13 @@ cumulus-primitives-utility = { path = "../../../../primitives/utility", default- pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } parachain-info = { package = "staging-parachain-info", path = "../../../pallets/parachain-info", default-features = false } parachains-common = { path = "../../../common", default-features = false } +assets-common = { path = "../../assets/common", default-features = false } +snowbridge-rococo-common = { path = "../../../../../bridges/snowbridge/parachain/runtime/rococo-common", default-features = false } [features] default = ["std"] std = [ + "assets-common/std", "codec/std", "cumulus-pallet-aura-ext/std", "cumulus-pallet-dmp-queue/std", @@ -118,6 +121,7 @@ std = [ "polkadot-primitives/std", "polkadot-runtime-common/std", "scale-info/std", + "snowbridge-rococo-common/std", "sp-api/std", "sp-block-builder/std", "sp-consensus-aura/std", @@ -138,6 +142,7 @@ std = [ ] runtime-benchmarks = [ + "assets-common/runtime-benchmarks", "cumulus-pallet-dmp-queue/runtime-benchmarks", "cumulus-pallet-parachain-system/runtime-benchmarks", "cumulus-pallet-session-benchmarking/runtime-benchmarks", @@ -161,6 +166,7 @@ runtime-benchmarks = [ "polkadot-parachain-primitives/runtime-benchmarks", "polkadot-primitives/runtime-benchmarks", "polkadot-runtime-common/runtime-benchmarks", + "snowbridge-rococo-common/runtime-benchmarks", "sp-runtime/runtime-benchmarks", "xcm-builder/runtime-benchmarks", "xcm-executor/runtime-benchmarks", diff --git a/cumulus/parachains/runtimes/testing/penpal/src/lib.rs b/cumulus/parachains/runtimes/testing/penpal/src/lib.rs index 9387c454715..541bcd05644 100644 --- a/cumulus/parachains/runtimes/testing/penpal/src/lib.rs +++ b/cumulus/parachains/runtimes/testing/penpal/src/lib.rs @@ -32,6 +32,7 @@ include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); mod weights; pub mod xcm_config; +use assets_common::MultiLocationForAssetId; use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; use cumulus_primitives_core::{AggregateMessageOrigin, ParaId}; use frame_support::{ @@ -458,6 +459,41 @@ impl pallet_assets::Config for Runtime { type BenchmarkHelper = (); } +parameter_types! { + // we just reuse the same deposits + pub const ForeignAssetsAssetDeposit: Balance = AssetDeposit::get(); + pub const ForeignAssetsAssetAccountDeposit: Balance = AssetAccountDeposit::get(); + pub const ForeignAssetsApprovalDeposit: Balance = ApprovalDeposit::get(); + pub const ForeignAssetsAssetsStringLimit: u32 = AssetsStringLimit::get(); + pub const ForeignAssetsMetadataDepositBase: Balance = MetadataDepositBase::get(); + pub const ForeignAssetsMetadataDepositPerByte: Balance = MetadataDepositPerByte::get(); +} + +/// Another pallet assets instance to store foreign assets from bridgehub. +pub type ForeignAssetsInstance = pallet_assets::Instance2; +impl pallet_assets::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Balance = Balance; + type AssetId = MultiLocationForAssetId; + type AssetIdParameter = MultiLocationForAssetId; + type Currency = Balances; + type CreateOrigin = AsEnsureOriginWithArg>; + type ForceOrigin = EnsureRoot; + type AssetDeposit = ForeignAssetsAssetDeposit; + type MetadataDepositBase = ForeignAssetsMetadataDepositBase; + type MetadataDepositPerByte = ForeignAssetsMetadataDepositPerByte; + type ApprovalDeposit = ForeignAssetsApprovalDeposit; + type StringLimit = ForeignAssetsAssetsStringLimit; + type Freezer = (); + type Extra = (); + type WeightInfo = pallet_assets::weights::SubstrateWeight; + type CallbackHandle = (); + type AssetAccountDeposit = ForeignAssetsAssetAccountDeposit; + type RemoveItemsLimit = frame_support::traits::ConstU32<1000>; + #[cfg(feature = "runtime-benchmarks")] + type BenchmarkHelper = xcm_config::XcmBenchmarkHelper; +} + parameter_types! { pub const ReservedXcmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); @@ -626,6 +662,7 @@ construct_runtime!( // The main stage. Assets: pallet_assets::::{Pallet, Call, Storage, Event} = 50, + ForeignAssets: pallet_assets::::{Pallet, Call, Storage, Event} = 51, Sudo: pallet_sudo::{Pallet, Call, Storage, Event, Config} = 255, } diff --git a/cumulus/parachains/runtimes/testing/penpal/src/xcm_config.rs b/cumulus/parachains/runtimes/testing/penpal/src/xcm_config.rs index e4f0afc854b..ed405aeddb3 100644 --- a/cumulus/parachains/runtimes/testing/penpal/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/testing/penpal/src/xcm_config.rs @@ -24,8 +24,8 @@ //! soon. use super::{ AccountId, AllPalletsWithSystem, AssetId as AssetIdPalletAssets, Assets, Balance, Balances, - ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, - WeightToFee, XcmpQueue, + ForeignAssets, ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, + RuntimeOrigin, WeightToFee, XcmpQueue, }; use core::marker::PhantomData; use frame_support::{ @@ -42,18 +42,19 @@ use pallet_assets::Instance1; use pallet_xcm::XcmPassthrough; use polkadot_parachain_primitives::primitives::Sibling; use polkadot_runtime_common::impls::ToAuthor; +use snowbridge_rococo_common::EthereumNetwork; use sp_runtime::traits::Zero; use xcm::latest::prelude::*; #[allow(deprecated)] -use xcm_builder::CurrencyAdapter; use xcm_builder::{ AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, AsPrefixedGeneralIndex, - ConvertedConcreteId, DenyReserveTransferToRelayChain, DenyThenTry, EnsureXcmOrigin, - FixedWeightBounds, FungiblesAdapter, IsConcrete, LocalMint, NativeAsset, ParentAsSuperuser, - ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, - SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, - TrailingSetTopicAsId, UsingComponents, WithComputedOrigin, WithUniqueTopic, + ConvertedConcreteId, CurrencyAdapter, DenyReserveTransferToRelayChain, DenyThenTry, + EnsureXcmOrigin, FixedWeightBounds, FungiblesAdapter, IsConcrete, LocalMint, NativeAsset, + NoChecking, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, + SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, + SovereignSignedViaLocation, StartsWith, TakeWeightCredit, TrailingSetTopicAsId, + UsingComponents, WithComputedOrigin, WithUniqueTopic, }; use xcm_executor::{traits::JustTry, XcmExecutor}; @@ -125,8 +126,28 @@ pub type FungiblesTransactor = FungiblesAdapter< CheckingAccount, >; +/// `AssetId/Balance` converter for `TrustBackedAssets` +pub type ForeignAssetsConvertedConcreteId = + assets_common::ForeignAssetsConvertedConcreteId, Balance>; + +/// Means for transacting foreign assets from different global consensus. +pub type ForeignFungiblesTransactor = FungiblesAdapter< + // Use this fungibles implementation: + ForeignAssets, + // Use this currency when it is a fungible asset matching the given location or name: + ForeignAssetsConvertedConcreteId, + // Convert an XCM MultiLocation into a local account id: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // We dont need to check teleports here. + NoChecking, + // The account to use for tracking teleports. + CheckingAccount, +>; + /// Means for transacting assets on this chain. -pub type AssetTransactors = (CurrencyTransactor, FungiblesTransactor); +pub type AssetTransactors = (CurrencyTransactor, ForeignFungiblesTransactor, FungiblesTransactor); /// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, /// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can @@ -202,16 +223,22 @@ pub type Barrier = TrailingSetTopicAsId< pub type AccountIdOf = ::AccountId; /// Asset filter that allows all assets from a certain location matching asset id. -pub struct AssetsFrom(PhantomData); -impl> ContainsPair for AssetsFrom { +pub struct AssetPrefixFrom(PhantomData<(Prefix, Origin)>); +impl ContainsPair for AssetPrefixFrom +where + Prefix: Get, + Origin: Get, +{ fn contains(asset: &MultiAsset, origin: &MultiLocation) -> bool { - let loc = T::get(); + let loc = Origin::get(); &loc == origin && matches!(asset, MultiAsset { id: AssetId::Concrete(asset_loc), fun: Fungible(_a) } - if asset_loc.starts_with(&loc)) + if asset_loc.starts_with(&Prefix::get())) } } +type AssetsFrom = AssetPrefixFrom; + /// Asset filter that allows native/relay asset if coming from a certain location. pub struct NativeAssetFrom(PhantomData); impl> ContainsPair for NativeAssetFrom { @@ -267,6 +294,7 @@ parameter_types! { 0, X2(PalletInstance(50), GeneralIndex(TELEPORTABLE_ASSET_ID.into())) ); + pub EthereumLocation: MultiLocation = MultiLocation::new(2, X1(GlobalConsensus(EthereumNetwork::get()))); } /// Accepts asset with ID `AssetLocation` and is coming from `Origin` chain. @@ -280,8 +308,12 @@ impl, Origin: Get> } } -pub type Reserves = - (NativeAsset, AssetsFrom, NativeAssetFrom); +pub type Reserves = ( + NativeAsset, + AssetsFrom, + NativeAssetFrom, + AssetPrefixFrom, +); pub type TrustedTeleporters = (AssetFromChain,); @@ -362,3 +394,12 @@ impl cumulus_pallet_xcm::Config for Runtime { type RuntimeEvent = RuntimeEvent; type XcmExecutor = XcmExecutor; } + +/// Simple conversion of `u32` into an `AssetId` for use in benchmarking. +pub struct XcmBenchmarkHelper; +#[cfg(feature = "runtime-benchmarks")] +impl pallet_assets::BenchmarkHelper for XcmBenchmarkHelper { + fn create_asset_id_parameter(id: u32) -> MultiLocation { + MultiLocation { parents: 1, interior: X1(Parachain(id)) } + } +} diff --git a/cumulus/polkadot-parachain/Cargo.toml b/cumulus/polkadot-parachain/Cargo.toml index 1c055f6b2dd..dd17ccebaf1 100644 --- a/cumulus/polkadot-parachain/Cargo.toml +++ b/cumulus/polkadot-parachain/Cargo.toml @@ -118,10 +118,13 @@ tokio = { version = "1.32.0", features = ["macros", "parking_lot", "time"] } wait-timeout = "0.2" [features] -default = [] +default = [ + "beacon-spec-mainnet", +] runtime-benchmarks = [ "asset-hub-rococo-runtime/runtime-benchmarks", "asset-hub-westend-runtime/runtime-benchmarks", + "beacon-spec-mainnet", "bridge-hub-rococo-runtime/runtime-benchmarks", "bridge-hub-westend-runtime/runtime-benchmarks", "collectives-westend-runtime/runtime-benchmarks", @@ -161,3 +164,6 @@ try-runtime = [ "shell-runtime/try-runtime", "sp-runtime/try-runtime", ] +beacon-spec-mainnet = [ + "bridge-hub-rococo-runtime/beacon-spec-mainnet", +] diff --git a/cumulus/polkadot-parachain/src/chain_spec/bridge_hubs.rs b/cumulus/polkadot-parachain/src/chain_spec/bridge_hubs.rs index 8dab692c1cd..1f43edf2243 100644 --- a/cumulus/polkadot-parachain/src/chain_spec/bridge_hubs.rs +++ b/cumulus/polkadot-parachain/src/chain_spec/bridge_hubs.rs @@ -231,6 +231,10 @@ pub mod rococo { "bridgeWestendMessages": { "owner": bridges_pallet_owner.clone(), }, + "ethereumSystem": { + "paraId": id, + "assetHubParaId": 1000 + } }) } } diff --git a/cumulus/polkadot-parachain/src/command.rs b/cumulus/polkadot-parachain/src/command.rs index 5f80b2c001c..ea56e277112 100644 --- a/cumulus/polkadot-parachain/src/command.rs +++ b/cumulus/polkadot-parachain/src/command.rs @@ -262,6 +262,7 @@ fn load_spec(id: &str) -> std::result::Result, String> { /// (H/T to Phala for the idea) /// E.g. "penpal-kusama-2004" yields ("penpal-kusama", Some(2004)) fn extract_parachain_id(id: &str) -> (&str, &str, Option) { + const ROCOCO_TEST_PARA_PREFIX: &str = "penpal-rococo-"; const KUSAMA_TEST_PARA_PREFIX: &str = "penpal-kusama-"; const POLKADOT_TEST_PARA_PREFIX: &str = "penpal-polkadot-"; @@ -273,7 +274,10 @@ fn extract_parachain_id(id: &str) -> (&str, &str, Option) { const GLUTTON_WESTEND_PARA_LOCAL_PREFIX: &str = "glutton-westend-local-"; const GLUTTON_WESTEND_PARA_GENESIS_PREFIX: &str = "glutton-westend-genesis-"; - let (norm_id, orig_id, para) = if let Some(suffix) = id.strip_prefix(KUSAMA_TEST_PARA_PREFIX) { + let (norm_id, orig_id, para) = if let Some(suffix) = id.strip_prefix(ROCOCO_TEST_PARA_PREFIX) { + let para_id: u32 = suffix.parse().expect("Invalid parachain-id suffix"); + (&id[..ROCOCO_TEST_PARA_PREFIX.len() - 1], id, Some(para_id)) + } else if let Some(suffix) = id.strip_prefix(KUSAMA_TEST_PARA_PREFIX) { let para_id: u32 = suffix.parse().expect("Invalid parachain-id suffix"); (&id[..KUSAMA_TEST_PARA_PREFIX.len() - 1], id, Some(para_id)) } else if let Some(suffix) = id.strip_prefix(POLKADOT_TEST_PARA_PREFIX) { diff --git a/cumulus/xcm/xcm-emulator/src/lib.rs b/cumulus/xcm/xcm-emulator/src/lib.rs index f2e4ff397c4..f5c6b88adce 100644 --- a/cumulus/xcm/xcm-emulator/src/lib.rs +++ b/cumulus/xcm/xcm-emulator/src/lib.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -pub use codec::{Decode, Encode, EncodeLike}; +pub use codec::{Decode, Encode, EncodeLike, MaxEncodedLen}; pub use lazy_static::lazy_static; pub use log; pub use paste; @@ -245,7 +245,7 @@ pub trait Parachain: Chain { type LocationToAccountId: ConvertLocation>; type ParachainInfo: Get; type ParachainSystem; - type MessageProcessor: ProcessMessage + ServiceQueues; + type MessageProcessor: ProcessMessage + ServiceQueues; fn init(); @@ -576,7 +576,7 @@ macro_rules! decl_test_parachains { XcmpMessageHandler: $xcmp_message_handler:path, LocationToAccountId: $location_to_account:path, ParachainInfo: $parachain_info:path, - // MessageProcessor: $message_processor:path, + MessageOrigin: $message_origin:path, }, pallets = { $($pallet_name:ident: $pallet_path:path,)* @@ -615,7 +615,7 @@ macro_rules! decl_test_parachains { type LocationToAccountId = $location_to_account; type ParachainSystem = $crate::ParachainSystemPallet<::Runtime>; type ParachainInfo = $parachain_info; - type MessageProcessor = $crate::DefaultParaMessageProcessor<$name>; + type MessageProcessor = $crate::DefaultParaMessageProcessor<$name, $message_origin>; // We run an empty block during initialisation to open HRMP channels // and have them ready for the next block @@ -1007,7 +1007,7 @@ macro_rules! decl_test_networks { <$parachain>::ext_wrapper(|| { let _ = <$parachain as Parachain>::MessageProcessor::process_message( &msg[..], - $crate::CumulusAggregateMessageOrigin::Parent, + $crate::CumulusAggregateMessageOrigin::Parent.into(), &mut weight_meter, &mut msg.using_encoded($crate::blake2_256), ); @@ -1313,17 +1313,23 @@ macro_rules! decl_test_sender_receiver_accounts_parameter_types { }; } -pub struct DefaultParaMessageProcessor(PhantomData); +pub struct DefaultParaMessageProcessor(PhantomData<(T, M)>); // Process HRMP messages from sibling paraids -impl ProcessMessage for DefaultParaMessageProcessor +impl ProcessMessage for DefaultParaMessageProcessor where + M: codec::FullCodec + + MaxEncodedLen + + Clone + + Eq + + PartialEq + + frame_support::pallet_prelude::TypeInfo + + Debug, T: Parachain, T::Runtime: MessageQueueConfig, - <::MessageProcessor as ProcessMessage>::Origin: - PartialEq, - MessageQueuePallet: EnqueueMessage + ServiceQueues, + <::MessageProcessor as ProcessMessage>::Origin: PartialEq, + MessageQueuePallet: EnqueueMessage + ServiceQueues, { - type Origin = CumulusAggregateMessageOrigin; + type Origin = M; fn process_message( msg: &[u8], @@ -1340,13 +1346,13 @@ where Ok(true) } } -impl ServiceQueues for DefaultParaMessageProcessor +impl ServiceQueues for DefaultParaMessageProcessor where + M: MaxEncodedLen, T: Parachain, T::Runtime: MessageQueueConfig, - <::MessageProcessor as ProcessMessage>::Origin: - PartialEq, - MessageQueuePallet: EnqueueMessage + ServiceQueues, + <::MessageProcessor as ProcessMessage>::Origin: PartialEq, + MessageQueuePallet: EnqueueMessage + ServiceQueues, { type OverweightMessageAddress = (); diff --git a/prdoc/pr_2522.prdoc b/prdoc/pr_2522.prdoc new file mode 100644 index 00000000000..9a98f984bac --- /dev/null +++ b/prdoc/pr_2522.prdoc @@ -0,0 +1,12 @@ +title: "Adds Snowbridge to Rococo runtime" + +doc: + - audience: Runtime Dev + description: | + Adds the snowbridge pallets as a git subtree under the bridges directory. Adds Snowbridge + to the Rococo Asset Hub and Bridge Hub runtimes. + + +crates: + - name: asset-hub-rococo-runtime + - name: bridge-hub-rococo-runtime diff --git a/scripts/snowbridge_update_subtree.sh b/scripts/snowbridge_update_subtree.sh new file mode 100755 index 00000000000..2276bb35469 --- /dev/null +++ b/scripts/snowbridge_update_subtree.sh @@ -0,0 +1,66 @@ +#!/bin/bash + +# A script to udpate bridges repo as subtree to Cumulus +# Usage: +# ./scripts/update_subtree_snowbridge.sh fetch +# ./scripts/update_subtree_snowbridge.sh patch + +set -e + +SNOWBRIDGE_BRANCH="${SNOWBRIDGE_BRANCH:-main}" +POLKADOT_SDK_BRANCH="${POLKADOT_SDK_BRANCH:-master}" +SNOWBRIDGE_TARGET_DIR="${TARGET_DIR:-bridges/snowbridge}" + +function fetch() { + # the script is able to work only on clean git copy + [[ -z "$(git status --porcelain)" ]] || { + echo >&2 "The git copy must be clean (stash all your changes):"; + git status --porcelain + exit 1; + } + + local snowbridge_remote=$(git remote -v | grep "snowbridge.git (fetch)" | head -n1 | awk '{print $1;}') + if [ -z "$snowbridge_remote" ]; then + echo "Adding new remote: 'snowbridge' repo..." + git remote add -f snowbridge https://github.com/Snowfork/snowbridge.git + snowbridge_remote="snowbridge" + else + echo "Fetching remote: '${snowbridge_remote}' repo..." + git fetch https://github.com/Snowfork/snowbridge.git --prune + fi + + echo "Syncing/updating subtree with remote branch '${snowbridge_remote}/$SNOWBRIDGE_BRANCH' to target directory: '$SNOWBRIDGE_TARGET_DIR'" + git subtree pull --prefix=$SNOWBRIDGE_TARGET_DIR ${snowbridge_remote} $SNOWBRIDGE_BRANCH --squash +} + +function clean() { + echo "Patching/removing unneeded stuff from subtree in target directory: '$SNOWBRIDGE_TARGET_DIR'" + chmod +x $SNOWBRIDGE_TARGET_DIR/parachain/scripts/verify-pallets-build.sh + $SNOWBRIDGE_TARGET_DIR/parachain/scripts/verify-pallets-build.sh --ignore-git-state --no-revert +} + +function create_patch() { + [[ -z "$(git status --porcelain)" ]] || { + echo >&2 "The git copy must be clean (stash all your changes):"; + git status --porcelain + exit 1; + } + echo "Creating diff patch file to apply to snowbridge. No Cargo.toml files will be included in the patch." + git diff snowbridge/$SNOWBRIDGE_BRANCH $POLKADOT_SDK_BRANCH:bridges/snowbridge --diff-filter=ACM -- . ':(exclude)*/Cargo.toml' > snowbridge.patch +} + +case "$1" in + fetch) + fetch + ;; + clean) + clean + ;; + create_patch) + create_patch + ;; + update) + fetch + clean + ;; +esac -- GitLab From 69434d9a32af6103d7cbde9798cf594027fb620e Mon Sep 17 00:00:00 2001 From: eskimor Date: Thu, 21 Dec 2023 19:06:58 +0100 Subject: [PATCH 074/191] Coretime Feature branch (relay chain) (#1694) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also fixes: https://github.com/paritytech/polkadot-sdk/issues/1417 - [x] CoreIndex -> AssignmentProvider mapping will be able to change any time. - [x] Implement - [x] Provide Migrations - [x] Add and fix tests - [x] Implement bulk assigner logic - [x] bulk assigner tests - [x] Port over current assigner to use bulk designer (+ share on-demand with bulk): top-level assigner has core ranges: legacy, bulk - [x] Adjust migrations to reflect new assigner structure - [x] Move migration code to Assignment code directly and make it recursive (make it possible to skip releases) -> follow up ticket. - [x] Test migrations - [x] Add migration PR to runtimes repo -> follow up ticket. - [x] Wire up with actual UMP messages - [x] Write PR docs --------- Co-authored-by: eskimor Co-authored-by: Bradley Olson <34992650+BradleyOlson64@users.noreply.github.com> Co-authored-by: BradleyOlson64 Co-authored-by: Anton Vilhelm Ásgeirsson Co-authored-by: antonva Co-authored-by: Bastian Köcher Co-authored-by: Marcin S. Co-authored-by: Bastian Köcher Co-authored-by: command-bot <> --- Cargo.lock | 3 + .../coretime/coretime-rococo/src/coretime.rs | 11 - .../coretime/coretime-rococo/src/lib.rs | 2 +- .../src/weights/pallet_broker.rs | 3 + .../core/prospective-parachains/src/tests.rs | 5 +- .../src/runtime/scheduler.md | 1 + polkadot/runtime/common/Cargo.toml | 4 + .../runtime/common/src/assigned_slots/mod.rs | 1 + .../runtime/common/src/integration_tests.rs | 1 + .../runtime/common/src/paras_registrar/mod.rs | 1 + .../runtime/common/src/paras_sudo_wrapper.rs | 11 +- polkadot/runtime/common/src/slots/mod.rs | 20 +- polkadot/runtime/parachains/Cargo.toml | 6 + polkadot/runtime/parachains/src/assigner.rs | 112 --- .../src/assigner_coretime/mock_helpers.rs | 87 ++ .../parachains/src/assigner_coretime/mod.rs | 496 ++++++++++ .../parachains/src/assigner_coretime/tests.rs | 817 +++++++++++++++++ .../src/assigner_on_demand/benchmarking.rs | 12 +- .../src/assigner_on_demand/mock_helpers.rs | 4 +- .../parachains/src/assigner_on_demand/mod.rs | 118 +-- .../src/assigner_on_demand/tests.rs | 253 ++++-- .../parachains/src/assigner_parachains.rs | 35 +- .../src/assigner_parachains/mock_helpers.rs | 83 ++ .../src/assigner_parachains/tests.rs | 112 +++ polkadot/runtime/parachains/src/builder.rs | 50 +- .../runtime/parachains/src/configuration.rs | 28 +- .../src/configuration/migration/v11.rs | 6 +- .../parachains/src/configuration/tests.rs | 4 +- .../parachains/src/coretime/benchmarking.rs | 73 ++ .../parachains/src/coretime/migration.rs | 285 ++++++ .../runtime/parachains/src/coretime/mod.rs | 251 +++++ .../runtime/parachains/src/inclusion/tests.rs | 4 +- .../runtime/parachains/src/initializer.rs | 15 + polkadot/runtime/parachains/src/lib.rs | 3 +- polkadot/runtime/parachains/src/mock.rs | 159 +++- polkadot/runtime/parachains/src/paras/mod.rs | 24 + .../src/paras_inherent/benchmarking.rs | 21 +- .../parachains/src/paras_inherent/mod.rs | 4 +- .../parachains/src/paras_inherent/tests.rs | 41 +- .../parachains/src/runtime_api_impl/v7.rs | 2 +- polkadot/runtime/parachains/src/scheduler.rs | 206 ++--- .../parachains/src/scheduler/common.rs | 86 +- .../parachains/src/scheduler/migration.rs | 310 +++++-- .../runtime/parachains/src/scheduler/tests.rs | 858 ++++++------------ .../parachains/src/session_info/tests.rs | 2 +- polkadot/runtime/rococo/constants/src/lib.rs | 2 + polkadot/runtime/rococo/src/lib.rs | 70 +- polkadot/runtime/rococo/src/weights/mod.rs | 1 + .../weights/runtime_parachains_coretime.rs | 73 ++ polkadot/runtime/rococo/src/xcm_config.rs | 3 + polkadot/runtime/test-runtime/src/lib.rs | 12 +- polkadot/runtime/westend/constants/src/lib.rs | 2 + polkadot/runtime/westend/src/lib.rs | 16 +- polkadot/runtime/westend/src/weights/mod.rs | 2 + .../runtime_parachains_assigner_on_demand.rs | 91 ++ .../weights/runtime_parachains_coretime.rs | 73 ++ ...005-parachains-disputes-past-session.zndsl | 4 + .../smoke/0004-configure-broker.js | 66 ++ .../smoke/0004-configure-relay.js | 43 + .../smoke/0004-coretime-smoke-test.toml | 58 ++ .../smoke/0004-coretime-smoke-test.zndsl | 19 + prdoc/pr_1694.prdoc | 24 + substrate/bin/node/runtime/src/lib.rs | 10 - substrate/client/chain-spec/src/chain_spec.rs | 4 +- substrate/frame/broker/src/benchmarking.rs | 2 +- .../frame/broker/src/coretime_interface.rs | 16 - .../frame/broker/src/dispatchable_impls.rs | 5 + substrate/frame/broker/src/lib.rs | 12 + substrate/frame/broker/src/mock.rs | 10 +- substrate/frame/broker/src/tick_impls.rs | 2 +- substrate/frame/broker/src/weights.rs | 8 + 71 files changed, 4052 insertions(+), 1206 deletions(-) delete mode 100644 polkadot/runtime/parachains/src/assigner.rs create mode 100644 polkadot/runtime/parachains/src/assigner_coretime/mock_helpers.rs create mode 100644 polkadot/runtime/parachains/src/assigner_coretime/mod.rs create mode 100644 polkadot/runtime/parachains/src/assigner_coretime/tests.rs create mode 100644 polkadot/runtime/parachains/src/assigner_parachains/mock_helpers.rs create mode 100644 polkadot/runtime/parachains/src/assigner_parachains/tests.rs create mode 100644 polkadot/runtime/parachains/src/coretime/benchmarking.rs create mode 100644 polkadot/runtime/parachains/src/coretime/migration.rs create mode 100644 polkadot/runtime/parachains/src/coretime/mod.rs create mode 100644 polkadot/runtime/rococo/src/weights/runtime_parachains_coretime.rs create mode 100644 polkadot/runtime/westend/src/weights/runtime_parachains_assigner_on_demand.rs create mode 100644 polkadot/runtime/westend/src/weights/runtime_parachains_coretime.rs create mode 100644 polkadot/zombienet_tests/smoke/0004-configure-broker.js create mode 100644 polkadot/zombienet_tests/smoke/0004-configure-relay.js create mode 100644 polkadot/zombienet_tests/smoke/0004-coretime-smoke-test.toml create mode 100644 polkadot/zombienet_tests/smoke/0004-coretime-smoke-test.zndsl create mode 100644 prdoc/pr_1694.prdoc diff --git a/Cargo.lock b/Cargo.lock index 4fcae91e5ba..ba30e05b5ba 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12993,6 +12993,7 @@ dependencies = [ "pallet-authorship", "pallet-babe", "pallet-balances", + "pallet-broker", "pallet-election-provider-multi-phase", "pallet-fast-unstake", "pallet-identity", @@ -13063,6 +13064,7 @@ dependencies = [ "pallet-authorship", "pallet-babe", "pallet-balances", + "pallet-broker", "pallet-message-queue", "pallet-session", "pallet-staking", @@ -13083,6 +13085,7 @@ dependencies = [ "serde_json", "sp-api", "sp-application-crypto", + "sp-arithmetic", "sp-core", "sp-inherents", "sp-io", diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/coretime.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/coretime.rs index 3cdcff33cfb..a85d67f7b4c 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/coretime.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/coretime.rs @@ -199,23 +199,12 @@ impl CoretimeInterface for CoretimeAllocator { } } - fn check_notify_core_count() -> Option { - let count = CoreCount::get(); - CoreCount::set(&None); - count - } - fn check_notify_revenue_info() -> Option<(RCBlockNumberOf, Self::Balance)> { let revenue = CoretimeRevenue::get(); CoretimeRevenue::set(&None); revenue } - #[cfg(feature = "runtime-benchmarks")] - fn ensure_notify_core_count(count: u16) { - CoreCount::set(&Some(count)); - } - #[cfg(feature = "runtime-benchmarks")] fn ensure_notify_revenue_info(when: RCBlockNumberOf, revenue: Self::Balance) { CoretimeRevenue::set(&Some((when, revenue))); diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs index ef6eb02b4e2..e87611a523e 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs @@ -121,7 +121,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("coretime-rococo"), impl_name: create_runtime_str!("coretime-rococo"), authoring_version: 1, - spec_version: 1_005_000, + spec_version: 1_005_001, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 0, diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_broker.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_broker.rs index c33cc422d11..3cc51a247f7 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_broker.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_broker.rs @@ -463,6 +463,9 @@ impl pallet_broker::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } + fn notify_core_count() -> Weight { + T::DbWeight::get().reads_writes(1, 1) + } /// Storage: `Broker::Status` (r:1 w:1) /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) /// Storage: `Broker::Configuration` (r:1 w:0) diff --git a/polkadot/node/core/prospective-parachains/src/tests.rs b/polkadot/node/core/prospective-parachains/src/tests.rs index 51a5ef622c0..7e369245c0e 100644 --- a/polkadot/node/core/prospective-parachains/src/tests.rs +++ b/polkadot/node/core/prospective-parachains/src/tests.rs @@ -101,9 +101,8 @@ fn test_harness>( let mut view = View::new(); let subsystem = async move { - match run_iteration(&mut context, &mut view, &Metrics(None)).await { - Ok(()) => {}, - Err(e) => panic!("{:?}", e), + if let Err(e) = run_iteration(&mut context, &mut view, &Metrics(None)).await { + panic!("{:?}", e); } view diff --git a/polkadot/roadmap/implementers-guide/src/runtime/scheduler.md b/polkadot/roadmap/implementers-guide/src/runtime/scheduler.md index 26058c446cb..32a7fe652db 100644 --- a/polkadot/roadmap/implementers-guide/src/runtime/scheduler.md +++ b/polkadot/roadmap/implementers-guide/src/runtime/scheduler.md @@ -182,6 +182,7 @@ struct CoreAssignment { core: CoreIndex, para_id: ParaId, kind: AssignmentKind, + group_idx: GroupIndex, } // reasons a core might be freed. enum FreedReason { diff --git a/polkadot/runtime/common/Cargo.toml b/polkadot/runtime/common/Cargo.toml index 1af29be0ae8..c841c0847c0 100644 --- a/polkadot/runtime/common/Cargo.toml +++ b/polkadot/runtime/common/Cargo.toml @@ -32,6 +32,7 @@ sp-npos-elections = { path = "../../../substrate/primitives/npos-elections", def pallet-authorship = { path = "../../../substrate/frame/authorship", default-features = false } pallet-balances = { path = "../../../substrate/frame/balances", default-features = false } +pallet-broker = { path = "../../../substrate/frame/broker", default-features = false } pallet-fast-unstake = { path = "../../../substrate/frame/fast-unstake", default-features = false } pallet-identity = { path = "../../../substrate/frame/identity", default-features = false } pallet-session = { path = "../../../substrate/frame/session", default-features = false } @@ -87,6 +88,7 @@ std = [ "pallet-asset-rate?/std", "pallet-authorship/std", "pallet-balances/std", + "pallet-broker/std", "pallet-election-provider-multi-phase/std", "pallet-fast-unstake/std", "pallet-identity/std", @@ -127,6 +129,7 @@ runtime-benchmarks = [ "pallet-asset-rate/runtime-benchmarks", "pallet-babe/runtime-benchmarks", "pallet-balances/runtime-benchmarks", + "pallet-broker/runtime-benchmarks", "pallet-election-provider-multi-phase/runtime-benchmarks", "pallet-fast-unstake/runtime-benchmarks", "pallet-identity/runtime-benchmarks", @@ -151,6 +154,7 @@ try-runtime = [ "pallet-authorship/try-runtime", "pallet-babe?/try-runtime", "pallet-balances/try-runtime", + "pallet-broker/try-runtime", "pallet-election-provider-multi-phase/try-runtime", "pallet-fast-unstake/try-runtime", "pallet-identity/try-runtime", diff --git a/polkadot/runtime/common/src/assigned_slots/mod.rs b/polkadot/runtime/common/src/assigned_slots/mod.rs index f5e3aaef632..cb56cb8a118 100644 --- a/polkadot/runtime/common/src/assigned_slots/mod.rs +++ b/polkadot/runtime/common/src/assigned_slots/mod.rs @@ -743,6 +743,7 @@ mod tests { type QueueFootprinter = (); type NextSessionRotation = crate::mock::TestNextSessionRotation; type OnNewHead = (); + type AssignCoretime = (); } impl parachains_shared::Config for Test {} diff --git a/polkadot/runtime/common/src/integration_tests.rs b/polkadot/runtime/common/src/integration_tests.rs index b0d277a702d..4870432d22f 100644 --- a/polkadot/runtime/common/src/integration_tests.rs +++ b/polkadot/runtime/common/src/integration_tests.rs @@ -212,6 +212,7 @@ impl paras::Config for Test { type QueueFootprinter = (); type NextSessionRotation = crate::mock::TestNextSessionRotation; type OnNewHead = (); + type AssignCoretime = (); } parameter_types! { diff --git a/polkadot/runtime/common/src/paras_registrar/mod.rs b/polkadot/runtime/common/src/paras_registrar/mod.rs index 12376ae6f1f..9719f02677d 100644 --- a/polkadot/runtime/common/src/paras_registrar/mod.rs +++ b/polkadot/runtime/common/src/paras_registrar/mod.rs @@ -814,6 +814,7 @@ mod tests { type QueueFootprinter = (); type NextSessionRotation = crate::mock::TestNextSessionRotation; type OnNewHead = (); + type AssignCoretime = (); } impl configuration::Config for Test { diff --git a/polkadot/runtime/common/src/paras_sudo_wrapper.rs b/polkadot/runtime/common/src/paras_sudo_wrapper.rs index 0fc2644b2a0..4735c176329 100644 --- a/polkadot/runtime/common/src/paras_sudo_wrapper.rs +++ b/polkadot/runtime/common/src/paras_sudo_wrapper.rs @@ -23,7 +23,7 @@ use parity_scale_codec::Encode; use primitives::Id as ParaId; use runtime_parachains::{ configuration, dmp, hrmp, - paras::{self, ParaGenesisArgs}, + paras::{self, AssignCoretime, ParaGenesisArgs}, ParaLifecycle, }; use sp_std::boxed::Box; @@ -58,6 +58,8 @@ pub mod pallet { CannotUpgrade, /// Cannot downgrade lease holding parachain to on-demand. CannotDowngrade, + /// There are more cores than supported by the runtime. + TooManyCores, } #[pallet::hooks] @@ -66,6 +68,10 @@ pub mod pallet { #[pallet::call] impl Pallet { /// Schedule a para to be initialized at the start of the next session. + /// + /// This should only be used for TESTING and not on PRODUCTION chains. It automatically + /// assigns Coretime to the chain and increases the number of cores. Thus, there is no + /// running coretime chain required. #[pallet::call_index(0)] #[pallet::weight((1_000, DispatchClass::Operational))] pub fn sudo_schedule_para_initialize( @@ -76,6 +82,9 @@ pub mod pallet { ensure_root(origin)?; runtime_parachains::schedule_para_initialize::(id, genesis) .map_err(|_| Error::::ParaAlreadyExists)?; + + T::AssignCoretime::assign_coretime(id)?; + Ok(()) } diff --git a/polkadot/runtime/common/src/slots/mod.rs b/polkadot/runtime/common/src/slots/mod.rs index c3aaf8b51b8..6a8cddd8d91 100644 --- a/polkadot/runtime/common/src/slots/mod.rs +++ b/polkadot/runtime/common/src/slots/mod.rs @@ -326,6 +326,18 @@ impl Pallet { tracker.into_iter().collect() } + + /// Current lease index and how many blocks we are already in. + pub fn lease_period_index_plus_progress( + b: BlockNumberFor, + ) -> Option<(>>::LeasePeriod, BlockNumberFor)> { + // Note that blocks before `LeaseOffset` do not count as any lease period. + let offset_block_now = b.checked_sub(&T::LeaseOffset::get())?; + let lease_period = offset_block_now / T::LeasePeriod::get(); + let in_lease = offset_block_now % T::LeasePeriod::get(); + + Some((lease_period, in_lease)) + } } impl crate::traits::OnSwap for Pallet { @@ -449,12 +461,8 @@ impl Leaser> for Pallet { } fn lease_period_index(b: BlockNumberFor) -> Option<(Self::LeasePeriod, bool)> { - // Note that blocks before `LeaseOffset` do not count as any lease period. - let offset_block_now = b.checked_sub(&T::LeaseOffset::get())?; - let lease_period = offset_block_now / T::LeasePeriod::get(); - let first_block = (offset_block_now % T::LeasePeriod::get()).is_zero(); - - Some((lease_period, first_block)) + Self::lease_period_index_plus_progress(b) + .map(|(period, progress)| (period, progress.is_zero())) } fn already_leased( diff --git a/polkadot/runtime/parachains/Cargo.toml b/polkadot/runtime/parachains/Cargo.toml index 0bcf5c04c34..1f381400cf5 100644 --- a/polkadot/runtime/parachains/Cargo.toml +++ b/polkadot/runtime/parachains/Cargo.toml @@ -31,11 +31,13 @@ sp-core = { path = "../../../substrate/primitives/core", default-features = fals sp-keystore = { path = "../../../substrate/primitives/keystore", optional = true } sp-application-crypto = { path = "../../../substrate/primitives/application-crypto", default-features = false, optional = true } sp-tracing = { path = "../../../substrate/primitives/tracing", default-features = false, optional = true } +sp-arithmetic = { path = "../../../substrate/primitives/arithmetic", default-features = false } pallet-authority-discovery = { path = "../../../substrate/frame/authority-discovery", default-features = false } pallet-authorship = { path = "../../../substrate/frame/authorship", default-features = false } pallet-balances = { path = "../../../substrate/frame/balances", default-features = false } pallet-babe = { path = "../../../substrate/frame/babe", default-features = false } +pallet-broker = { path = "../../../substrate/frame/broker", default-features = false } pallet-message-queue = { path = "../../../substrate/frame/message-queue", default-features = false } pallet-session = { path = "../../../substrate/frame/session", default-features = false } pallet-staking = { path = "../../../substrate/frame/staking", default-features = false } @@ -82,6 +84,7 @@ std = [ "pallet-authorship/std", "pallet-babe/std", "pallet-balances/std", + "pallet-broker/std", "pallet-message-queue/std", "pallet-session/std", "pallet-staking/std", @@ -99,6 +102,7 @@ std = [ "serde/std", "sp-api/std", "sp-application-crypto?/std", + "sp-arithmetic/std", "sp-core/std", "sp-io/std", "sp-keystore", @@ -115,6 +119,7 @@ runtime-benchmarks = [ "frame-system/runtime-benchmarks", "pallet-babe/runtime-benchmarks", "pallet-balances/runtime-benchmarks", + "pallet-broker/runtime-benchmarks", "pallet-message-queue/runtime-benchmarks", "pallet-staking/runtime-benchmarks", "pallet-timestamp/runtime-benchmarks", @@ -135,6 +140,7 @@ try-runtime = [ "pallet-authorship/try-runtime", "pallet-babe/try-runtime", "pallet-balances/try-runtime", + "pallet-broker/try-runtime", "pallet-message-queue/try-runtime", "pallet-session/try-runtime", "pallet-staking/try-runtime", diff --git a/polkadot/runtime/parachains/src/assigner.rs b/polkadot/runtime/parachains/src/assigner.rs deleted file mode 100644 index 9e408df61dc..00000000000 --- a/polkadot/runtime/parachains/src/assigner.rs +++ /dev/null @@ -1,112 +0,0 @@ -// Copyright (C) Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// Polkadot is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . - -//! The Polkadot multiplexing assignment provider. -//! Provides blockspace assignments for both bulk and on demand parachains. -use frame_system::pallet_prelude::BlockNumberFor; -use primitives::{CoreIndex, Id as ParaId}; - -use crate::{ - configuration, paras, - scheduler::common::{Assignment, AssignmentProvider, AssignmentProviderConfig}, -}; - -pub use pallet::*; - -#[frame_support::pallet] -pub mod pallet { - use super::*; - - #[pallet::pallet] - #[pallet::without_storage_info] - pub struct Pallet(_); - - #[pallet::config] - pub trait Config: frame_system::Config + configuration::Config + paras::Config { - type ParachainsAssignmentProvider: AssignmentProvider>; - type OnDemandAssignmentProvider: AssignmentProvider>; - } -} - -// Aliases to make the impl more readable. -type ParachainAssigner = ::ParachainsAssignmentProvider; -type OnDemandAssigner = ::OnDemandAssignmentProvider; - -impl Pallet { - // Helper fn for the AssignmentProvider implementation. - // Assumes that the first allocation of cores is to bulk parachains. - // This function will return false if there are no cores assigned to the bulk parachain - // assigner. - fn is_bulk_core(core_idx: &CoreIndex) -> bool { - let parachain_cores = - as AssignmentProvider>>::session_core_count(); - - core_idx.0 < parachain_cores - } -} - -impl AssignmentProvider> for Pallet { - fn session_core_count() -> u32 { - let parachain_cores = - as AssignmentProvider>>::session_core_count(); - let on_demand_cores = - as AssignmentProvider>>::session_core_count(); - - parachain_cores.saturating_add(on_demand_cores) - } - - /// Pops an `Assignment` from a specified `CoreIndex` - fn pop_assignment_for_core( - core_idx: CoreIndex, - concluded_para: Option, - ) -> Option { - if Pallet::::is_bulk_core(&core_idx) { - as AssignmentProvider>>::pop_assignment_for_core( - core_idx, - concluded_para, - ) - } else { - as AssignmentProvider>>::pop_assignment_for_core( - core_idx, - concluded_para, - ) - } - } - - fn push_assignment_for_core(core_idx: CoreIndex, assignment: Assignment) { - if Pallet::::is_bulk_core(&core_idx) { - as AssignmentProvider>>::push_assignment_for_core( - core_idx, assignment, - ) - } else { - as AssignmentProvider>>::push_assignment_for_core( - core_idx, assignment, - ) - } - } - - fn get_provider_config(core_idx: CoreIndex) -> AssignmentProviderConfig> { - if Pallet::::is_bulk_core(&core_idx) { - as AssignmentProvider>>::get_provider_config( - core_idx, - ) - } else { - as AssignmentProvider>>::get_provider_config( - core_idx, - ) - } - } -} diff --git a/polkadot/runtime/parachains/src/assigner_coretime/mock_helpers.rs b/polkadot/runtime/parachains/src/assigner_coretime/mock_helpers.rs new file mode 100644 index 00000000000..71c3f1fa39f --- /dev/null +++ b/polkadot/runtime/parachains/src/assigner_coretime/mock_helpers.rs @@ -0,0 +1,87 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Helper functions for tests, also used in runtime-benchmarks. + +#![cfg(test)] + +use super::*; + +use crate::{ + mock::MockGenesisConfig, + paras::{ParaGenesisArgs, ParaKind}, +}; +use sp_runtime::Perbill; + +use primitives::{Balance, HeadData, ValidationCode}; + +fn default_genesis_config() -> MockGenesisConfig { + MockGenesisConfig { + configuration: crate::configuration::GenesisConfig { + config: crate::configuration::HostConfiguration { ..Default::default() }, + }, + ..Default::default() + } +} + +#[derive(Debug)] +pub struct GenesisConfigBuilder { + pub on_demand_cores: u32, + pub on_demand_base_fee: Balance, + pub on_demand_fee_variability: Perbill, + pub on_demand_max_queue_size: u32, + pub on_demand_target_queue_utilization: Perbill, + pub onboarded_on_demand_chains: Vec, +} + +impl Default for GenesisConfigBuilder { + fn default() -> Self { + Self { + on_demand_cores: 10, + on_demand_base_fee: 10_000, + on_demand_fee_variability: Perbill::from_percent(1), + on_demand_max_queue_size: 100, + on_demand_target_queue_utilization: Perbill::from_percent(25), + onboarded_on_demand_chains: vec![], + } + } +} + +impl GenesisConfigBuilder { + pub(super) fn build(self) -> MockGenesisConfig { + let mut genesis = default_genesis_config(); + let config = &mut genesis.configuration.config; + config.coretime_cores = self.on_demand_cores; + config.on_demand_base_fee = self.on_demand_base_fee; + config.on_demand_fee_variability = self.on_demand_fee_variability; + config.on_demand_queue_max_size = self.on_demand_max_queue_size; + config.on_demand_target_queue_utilization = self.on_demand_target_queue_utilization; + + let paras = &mut genesis.paras.paras; + for para_id in self.onboarded_on_demand_chains { + paras.push(( + para_id, + ParaGenesisArgs { + genesis_head: HeadData::from(vec![0u8]), + validation_code: ValidationCode::from(vec![0u8]), + para_kind: ParaKind::Parathread, + }, + )) + } + + genesis + } +} diff --git a/polkadot/runtime/parachains/src/assigner_coretime/mod.rs b/polkadot/runtime/parachains/src/assigner_coretime/mod.rs new file mode 100644 index 00000000000..9da81dc816c --- /dev/null +++ b/polkadot/runtime/parachains/src/assigner_coretime/mod.rs @@ -0,0 +1,496 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! The parachain coretime assignment module. +//! +//! Handles scheduling of assignments coming from the coretime/broker chain. For on-demand +//! assignments it relies on the separate on-demand assignment provider, where it forwards requests +//! to. +//! +//! `CoreDescriptor` contains pointers to the begin and the end of a list of schedules, together +//! with the currently active assignments. + +mod mock_helpers; +#[cfg(test)] +mod tests; + +use crate::{ + assigner_on_demand, configuration, + paras::AssignCoretime, + scheduler::common::{Assignment, AssignmentProvider, AssignmentProviderConfig}, + ParaId, +}; + +use frame_support::{defensive, pallet_prelude::*}; +use frame_system::pallet_prelude::*; +use pallet_broker::CoreAssignment; +use primitives::CoreIndex; +use sp_runtime::traits::{One, Saturating}; + +use sp_std::prelude::*; + +pub use pallet::*; + +/// Fraction expressed as a nominator with an assumed denominator of 57,600. +#[derive(RuntimeDebug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Encode, Decode, TypeInfo)] +pub struct PartsOf57600(u16); + +impl PartsOf57600 { + pub const ZERO: Self = Self(0); + pub const FULL: Self = Self(57600); + + pub fn new_saturating(v: u16) -> Self { + Self::ZERO.saturating_add(Self(v)) + } + + pub fn is_full(&self) -> bool { + *self == Self::FULL + } + + pub fn saturating_add(self, rhs: Self) -> Self { + let inner = self.0.saturating_add(rhs.0); + if inner > 57600 { + Self(57600) + } else { + Self(inner) + } + } + + pub fn saturating_sub(self, rhs: Self) -> Self { + Self(self.0.saturating_sub(rhs.0)) + } + + pub fn checked_add(self, rhs: Self) -> Option { + let inner = self.0.saturating_add(rhs.0); + if inner > 57600 { + None + } else { + Some(Self(inner)) + } + } +} + +/// Assignments as they are scheduled by block number +/// +/// for a particular core. +#[derive(Encode, Decode, TypeInfo)] +#[cfg_attr(test, derive(PartialEq, RuntimeDebug))] +struct Schedule { + // Original assignments + assignments: Vec<(CoreAssignment, PartsOf57600)>, + /// When do our assignments become invalid, if at all? + /// + /// If this is `Some`, then this `CoreState` will be dropped at that block number. If this is + /// `None`, then we will keep serving our core assignments in a circle until a new set of + /// assignments is scheduled. + end_hint: Option, + + /// The next queued schedule for this core. + /// + /// Schedules are forming a queue. + next_schedule: Option, +} + +/// Descriptor for a core. +/// +/// Contains pointers to first and last schedule into `CoreSchedules` for that core and keeps track +/// of the currently active work as well. +#[derive(Encode, Decode, TypeInfo, Default)] +#[cfg_attr(test, derive(PartialEq, RuntimeDebug, Clone))] +struct CoreDescriptor { + /// Meta data about the queued schedules for this core. + queue: Option>, + /// Currently performed work. + current_work: Option>, +} + +/// Pointers into `CoreSchedules` for a particular core. +/// +/// Schedules in `CoreSchedules` form a queue. `Schedule::next_schedule` always pointing to the next +/// item. +#[derive(Encode, Decode, TypeInfo, Copy, Clone)] +#[cfg_attr(test, derive(PartialEq, RuntimeDebug))] +struct QueueDescriptor { + /// First scheduled item, that is not yet active. + first: N, + /// Last scheduled item. + last: N, +} + +#[derive(Encode, Decode, TypeInfo)] +#[cfg_attr(test, derive(PartialEq, RuntimeDebug, Clone))] +struct WorkState { + /// Assignments with current state. + /// + /// Assignments and book keeping on how much has been served already. We keep track of serviced + /// assignments in order to adhere to the specified ratios. + assignments: Vec<(CoreAssignment, AssignmentState)>, + /// When do our assignments become invalid if at all? + /// + /// If this is `Some`, then this `CoreState` will be dropped at that block number. If this is + /// `None`, then we will keep serving our core assignments in a circle until a new set of + /// assignments is scheduled. + end_hint: Option, + /// Position in the assignments we are currently in. + /// + /// Aka which core assignment will be popped next on + /// `AssignmentProvider::pop_assignment_for_core`. + pos: u16, + /// Step width + /// + /// How much we subtract from `AssignmentState::remaining` for a core served. + step: PartsOf57600, +} + +#[derive(Encode, Decode, TypeInfo)] +#[cfg_attr(test, derive(PartialEq, RuntimeDebug, Clone, Copy))] +struct AssignmentState { + /// Ratio of the core this assignment has. + /// + /// As initially received via `assign_core`. + ratio: PartsOf57600, + /// How many parts are remaining in this round? + /// + /// At the end of each round (in preparation for the next), ratio will be added to remaining. + /// Then every time we get scheduled we subtract a core worth of points. Once we reach 0 or a + /// number lower than what a core is worth (`CoreState::step` size), we move on to the next + /// item in the `Vec`. + /// + /// The first round starts with remaining = ratio. + remaining: PartsOf57600, +} + +impl From> for WorkState { + fn from(schedule: Schedule) -> Self { + let Schedule { assignments, end_hint, next_schedule: _ } = schedule; + let step = + if let Some(min_step_assignment) = assignments.iter().min_by(|a, b| a.1.cmp(&b.1)) { + min_step_assignment.1 + } else { + // Assignments empty, should not exist. In any case step size does not matter here: + log::debug!("assignments of a `Schedule` should never be empty."); + PartsOf57600(1) + }; + let assignments = assignments + .into_iter() + .map(|(a, ratio)| (a, AssignmentState { ratio, remaining: ratio })) + .collect(); + + Self { assignments, end_hint, pos: 0, step } + } +} + +#[frame_support::pallet] +pub mod pallet { + use super::*; + + #[pallet::pallet] + #[pallet::without_storage_info] + pub struct Pallet(_); + + #[pallet::config] + pub trait Config: + frame_system::Config + configuration::Config + assigner_on_demand::Config + { + } + + /// Scheduled assignment sets. + /// + /// Assignments as of the given block number. They will go into state once the block number is + /// reached (and replace whatever was in there before). + #[pallet::storage] + pub(super) type CoreSchedules = StorageMap< + _, + Twox256, + (BlockNumberFor, CoreIndex), + Schedule>, + OptionQuery, + >; + + /// Assignments which are currently active. + /// + /// They will be picked from `PendingAssignments` once we reach the scheduled block number in + /// `PendingAssignments`. + #[pallet::storage] + pub(super) type CoreDescriptors = StorageMap< + _, + Twox256, + CoreIndex, + CoreDescriptor>, + ValueQuery, + GetDefault, + >; + + #[pallet::hooks] + impl Hooks> for Pallet {} + + #[pallet::error] + pub enum Error { + AssignmentsEmpty, + /// Assignments together exceeded 57600. + OverScheduled, + /// Assignments together less than 57600 + UnderScheduled, + /// assign_core is only allowed to append new assignments at the end of already existing + /// ones. + DisallowedInsert, + /// Tried to insert a schedule for the same core and block number as an existing schedule + DuplicateInsert, + /// Tried to add an unsorted set of assignments + AssignmentsNotSorted, + } +} + +impl AssignmentProvider> for Pallet { + fn pop_assignment_for_core(core_idx: CoreIndex) -> Option { + let now = >::block_number(); + + CoreDescriptors::::mutate(core_idx, |core_state| { + Self::ensure_workload(now, core_idx, core_state); + + let work_state = core_state.current_work.as_mut()?; + + // Wrap around: + work_state.pos = work_state.pos % work_state.assignments.len() as u16; + let (a_type, a_state) = &mut work_state + .assignments + .get_mut(work_state.pos as usize) + .expect("We limited pos to the size of the vec one line above. qed"); + + // advance for next pop: + a_state.remaining = a_state.remaining.saturating_sub(work_state.step); + if a_state.remaining < work_state.step { + // Assignment exhausted, need to move to the next and credit remaining for + // next round. + work_state.pos += 1; + // Reset to ratio + still remaining "credits": + a_state.remaining = a_state.remaining.saturating_add(a_state.ratio); + } + + match a_type { + CoreAssignment::Idle => None, + CoreAssignment::Pool => + assigner_on_demand::Pallet::::pop_assignment_for_core(core_idx), + CoreAssignment::Task(para_id) => Some(Assignment::Bulk((*para_id).into())), + } + }) + } + + fn report_processed(assignment: Assignment) { + match assignment { + Assignment::Pool { para_id, core_index } => + assigner_on_demand::Pallet::::report_processed(para_id, core_index), + Assignment::Bulk(_) => {}, + } + } + + /// Push an assignment back to the front of the queue. + /// + /// The assignment has not been processed yet. Typically used on session boundaries. + /// Parameters: + /// - `assignment`: The on demand assignment. + fn push_back_assignment(assignment: Assignment) { + match assignment { + Assignment::Pool { para_id, core_index } => + assigner_on_demand::Pallet::::push_back_assignment(para_id, core_index), + Assignment::Bulk(_) => { + // Session changes are rough. We just drop assignments that did not make it on a + // session boundary. This seems sensible as bulk is region based. Meaning, even if + // we made the effort catching up on those dropped assignments, this would very + // likely lead to other assignments not getting served at the "end" (when our + // assignment set gets replaced). + }, + } + } + + fn get_provider_config(_core_idx: CoreIndex) -> AssignmentProviderConfig> { + let config = >::config(); + AssignmentProviderConfig { + max_availability_timeouts: config.on_demand_retries, + ttl: config.on_demand_ttl, + } + } + + #[cfg(any(feature = "runtime-benchmarks", test))] + fn get_mock_assignment(_: CoreIndex, para_id: primitives::Id) -> Assignment { + // Given that we are not tracking anything in `Bulk` assignments, it is safe to always + // return a bulk assignment. + Assignment::Bulk(para_id) + } + + fn session_core_count() -> u32 { + let config = >::config(); + config.coretime_cores + } +} + +impl Pallet { + /// Ensure given workload for core is up to date. + fn ensure_workload( + now: BlockNumberFor, + core_idx: CoreIndex, + descriptor: &mut CoreDescriptor>, + ) { + // Workload expired? + if descriptor + .current_work + .as_ref() + .and_then(|w| w.end_hint) + .map_or(false, |e| e <= now) + { + descriptor.current_work = None; + } + + let Some(queue) = descriptor.queue else { + // No queue. + return + }; + + let mut next_scheduled = queue.first; + + if next_scheduled > now { + // Not yet ready. + return + } + + // Update is needed: + let update = loop { + let Some(update) = CoreSchedules::::take((next_scheduled, core_idx)) else { + break None + }; + // Still good? + if update.end_hint.map_or(true, |e| e > now) { + break Some(update) + } + // Move on if possible: + if let Some(n) = update.next_schedule { + next_scheduled = n; + } else { + break None + } + }; + + let new_first = update.as_ref().and_then(|u| u.next_schedule); + descriptor.current_work = update.map(Into::into); + + descriptor.queue = new_first.map(|new_first| { + QueueDescriptor { + first: new_first, + // `last` stays unaffected, if not empty: + last: queue.last, + } + }); + } + + /// Append another assignment for a core. + /// + /// Important only appending is allowed. Meaning, all already existing assignments must have a + /// begin smaller than the one passed here. This restriction exists, because it makes the + /// insertion O(1) and the author could not think of a reason, why this restriction should be + /// causing any problems. Inserting arbitrarily causes a `DispatchError::DisallowedInsert` + /// error. This restriction could easily be lifted if need be and in fact an implementation is + /// available + /// [here](https://github.com/paritytech/polkadot-sdk/pull/1694/commits/c0c23b01fd2830910cde92c11960dad12cdff398#diff-0c85a46e448de79a5452395829986ee8747e17a857c27ab624304987d2dde8baR386). + /// The problem is that insertion complexity then depends on the size of the existing queue, + /// which makes determining weights hard and could lead to issues like overweight blocks (at + /// least in theory). + pub fn assign_core( + core_idx: CoreIndex, + begin: BlockNumberFor, + assignments: Vec<(CoreAssignment, PartsOf57600)>, + end_hint: Option>, + ) -> Result<(), DispatchError> { + // There should be at least one assignment. + ensure!(!assignments.is_empty(), Error::::AssignmentsEmpty); + + // Checking for sort and unique manually, since we don't have access to iterator tools. + // This way of checking uniqueness only works since we also check sortedness. + assignments.iter().map(|x| &x.0).try_fold(None, |prev, cur| { + if prev.map_or(false, |p| p >= cur) { + Err(Error::::AssignmentsNotSorted) + } else { + Ok(Some(cur)) + } + })?; + + // Check that the total parts between all assignments are equal to 57600 + let parts_sum = assignments + .iter() + .map(|assignment| assignment.1) + .try_fold(PartsOf57600::ZERO, |sum, parts| { + sum.checked_add(parts).ok_or(Error::::OverScheduled) + })?; + ensure!(parts_sum.is_full(), Error::::UnderScheduled); + + CoreDescriptors::::mutate(core_idx, |core_descriptor| { + let new_queue = match core_descriptor.queue { + Some(queue) => { + ensure!(begin > queue.last, Error::::DisallowedInsert); + + CoreSchedules::::try_mutate((queue.last, core_idx), |schedule| { + if let Some(schedule) = schedule.as_mut() { + debug_assert!(schedule.next_schedule.is_none(), "queue.end was supposed to be the end, so the next item must be `None`!"); + schedule.next_schedule = Some(begin); + } else { + defensive!("Queue end entry does not exist?"); + } + CoreSchedules::::try_mutate((begin, core_idx), |schedule| { + // It should already be impossible to overwrite an existing schedule due + // to strictly increasing block number. But we check here for safety and + // in case the design changes. + ensure!(schedule.is_none(), Error::::DuplicateInsert); + *schedule = + Some(Schedule { assignments, end_hint, next_schedule: None }); + Ok::<(), DispatchError>(()) + })?; + Ok::<(), DispatchError>(()) + })?; + + QueueDescriptor { first: queue.first, last: begin } + }, + None => { + // Queue empty, just insert: + CoreSchedules::::insert( + (begin, core_idx), + Schedule { assignments, end_hint, next_schedule: None }, + ); + QueueDescriptor { first: begin, last: begin } + }, + }; + core_descriptor.queue = Some(new_queue); + Ok(()) + }) + } +} + +impl AssignCoretime for Pallet { + fn assign_coretime(id: ParaId) -> DispatchResult { + let current_block = frame_system::Pallet::::block_number(); + + // Add a new core and assign the para to it. + let mut config = >::config(); + let core = config.coretime_cores; + config.coretime_cores.saturating_inc(); + + // `assign_coretime` is only called at genesis or by root, so setting the active + // config here is fine. + configuration::Pallet::::force_set_active_config(config); + + let begin = current_block + One::one(); + let assignment = vec![(pallet_broker::CoreAssignment::Task(id.into()), PartsOf57600::FULL)]; + Pallet::::assign_core(CoreIndex(core), begin, assignment, None) + } +} diff --git a/polkadot/runtime/parachains/src/assigner_coretime/tests.rs b/polkadot/runtime/parachains/src/assigner_coretime/tests.rs new file mode 100644 index 00000000000..998e39670f9 --- /dev/null +++ b/polkadot/runtime/parachains/src/assigner_coretime/tests.rs @@ -0,0 +1,817 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +use super::*; + +use crate::{ + assigner_coretime::{mock_helpers::GenesisConfigBuilder, pallet::Error, Schedule}, + initializer::SessionChangeNotification, + mock::{ + new_test_ext, Balances, CoretimeAssigner, OnDemandAssigner, Paras, ParasShared, + RuntimeOrigin, Scheduler, System, Test, + }, + paras::{ParaGenesisArgs, ParaKind}, + scheduler::common::Assignment, +}; +use frame_support::{assert_noop, assert_ok, pallet_prelude::*, traits::Currency}; +use pallet_broker::TaskId; +use primitives::{BlockNumber, Id as ParaId, SessionIndex, ValidationCode}; +use sp_std::collections::btree_map::BTreeMap; + +fn schedule_blank_para(id: ParaId, parakind: ParaKind) { + let validation_code: ValidationCode = vec![1, 2, 3].into(); + assert_ok!(Paras::schedule_para_initialize( + id, + ParaGenesisArgs { + genesis_head: Vec::new().into(), + validation_code: validation_code.clone(), + para_kind: parakind, + } + )); + + assert_ok!(Paras::add_trusted_validation_code(RuntimeOrigin::root(), validation_code)); +} + +fn run_to_block( + to: BlockNumber, + new_session: impl Fn(BlockNumber) -> Option>, +) { + while System::block_number() < to { + let b = System::block_number(); + + Scheduler::initializer_finalize(); + Paras::initializer_finalize(b); + + if let Some(notification) = new_session(b + 1) { + let mut notification_with_session_index = notification; + // We will make every session change trigger an action queue. Normally this may require + // 2 or more session changes. + if notification_with_session_index.session_index == SessionIndex::default() { + notification_with_session_index.session_index = ParasShared::scheduled_session(); + } + Paras::initializer_on_new_session(¬ification_with_session_index); + Scheduler::initializer_on_new_session(¬ification_with_session_index); + } + + System::on_finalize(b); + + System::on_initialize(b + 1); + System::set_block_number(b + 1); + + Paras::initializer_initialize(b + 1); + Scheduler::initializer_initialize(b + 1); + + // In the real runtime this is expected to be called by the `InclusionInherent` pallet. + Scheduler::free_cores_and_fill_claimqueue(BTreeMap::new(), b + 1); + } +} + +fn default_test_assignments() -> Vec<(CoreAssignment, PartsOf57600)> { + vec![(CoreAssignment::Idle, PartsOf57600::FULL)] +} + +fn default_test_schedule() -> Schedule> { + Schedule { assignments: default_test_assignments(), end_hint: None, next_schedule: None } +} + +#[test] +// Should create new QueueDescriptor and add new schedule to CoreSchedules +fn assign_core_works_with_no_prior_schedule() { + let core_idx = CoreIndex(0); + + new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { + run_to_block(1, |n| if n == 1 { Some(Default::default()) } else { None }); + + // Call assign_core + assert_ok!(CoretimeAssigner::assign_core( + core_idx, + BlockNumberFor::::from(11u32), + default_test_assignments(), + None, + )); + + // Check CoreSchedules + assert_eq!( + CoreSchedules::::get((BlockNumberFor::::from(11u32), core_idx)), + Some(default_test_schedule()) + ); + + // Check QueueDescriptor + assert_eq!( + CoreDescriptors::::get(core_idx) + .queue + .as_ref() + .and_then(|q| Some(q.first)), + Some(BlockNumberFor::::from(11u32)) + ); + assert_eq!( + CoreDescriptors::::get(core_idx).queue.as_ref().and_then(|q| Some(q.last)), + Some(BlockNumberFor::::from(11u32)) + ); + }); +} + +#[test] +fn end_hint_is_properly_honored() { + let core_idx = CoreIndex(0); + + new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { + run_to_block(1, |n| if n == 1 { Some(Default::default()) } else { None }); + + assert_ok!(CoretimeAssigner::assign_core( + core_idx, + BlockNumberFor::::from(11u32), + vec![(CoreAssignment::Task(1), PartsOf57600::FULL)], + Some(15u32), + )); + + assert!( + CoretimeAssigner::pop_assignment_for_core(core_idx).is_none(), + "No assignment yet in effect" + ); + + run_to_block(11, |_| None); + + assert_eq!( + CoretimeAssigner::pop_assignment_for_core(core_idx), + Some(Assignment::Bulk(1.into())), + "Assignment should now be present" + ); + + assert_eq!( + CoretimeAssigner::pop_assignment_for_core(core_idx), + Some(Assignment::Bulk(1.into())), + "Nothing changed, assignment should still be present" + ); + + run_to_block(15, |_| None); + + assert_eq!( + CoretimeAssigner::pop_assignment_for_core(core_idx), + None, + "Assignment should now be gone" + ); + + // Insert assignment that is already dead: + assert_ok!(CoretimeAssigner::assign_core( + core_idx, + BlockNumberFor::::from(11u32), + vec![(CoreAssignment::Task(1), PartsOf57600::FULL)], + Some(15u32), + )); + + // Core should still be empty: + assert_eq!( + CoretimeAssigner::pop_assignment_for_core(core_idx), + None, + "Assignment should now be gone" + ); + }); +} + +#[test] +// Should update last in QueueDescriptor and add new schedule to CoreSchedules +fn assign_core_works_with_prior_schedule() { + let core_idx = CoreIndex(0); + + new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { + run_to_block(1, |n| if n == 1 { Some(Default::default()) } else { None }); + let default_with_next_schedule = + Schedule { next_schedule: Some(15u32), ..default_test_schedule() }; + + // Call assign_core twice + assert_ok!(CoretimeAssigner::assign_core( + core_idx, + BlockNumberFor::::from(11u32), + default_test_assignments(), + None, + )); + + assert_ok!(CoretimeAssigner::assign_core( + core_idx, + BlockNumberFor::::from(15u32), + default_test_assignments(), + None, + )); + + // Check CoreSchedules for two entries + assert_eq!( + CoreSchedules::::get((BlockNumberFor::::from(11u32), core_idx)), + Some(default_with_next_schedule) + ); + assert_eq!( + CoreSchedules::::get((BlockNumberFor::::from(15u32), core_idx)), + Some(default_test_schedule()) + ); + + // Check QueueDescriptor + assert_eq!( + CoreDescriptors::::get(core_idx) + .queue + .as_ref() + .and_then(|q| Some(q.first)), + Some(BlockNumberFor::::from(11u32)) + ); + assert_eq!( + CoreDescriptors::::get(core_idx).queue.as_ref().and_then(|q| Some(q.last)), + Some(BlockNumberFor::::from(15u32)) + ); + }); +} + +#[test] +// Invariants: We assume that CoreSchedules is append only and consumed. In other words new +// schedules inserted for a core must have a higher block number than all of the already existing +// schedules. +fn assign_core_enforces_higher_block_number() { + let core_idx = CoreIndex(0); + + new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { + run_to_block(1, |n| if n == 1 { Some(Default::default()) } else { None }); + + // Call assign core twice to establish some schedules + assert_ok!(CoretimeAssigner::assign_core( + core_idx, + BlockNumberFor::::from(12u32), + default_test_assignments(), + None, + )); + + assert_ok!(CoretimeAssigner::assign_core( + core_idx, + BlockNumberFor::::from(15u32), + default_test_assignments(), + None, + )); + + // Call assign core with block number before QueueDescriptor first, expecting an error + assert_noop!( + CoretimeAssigner::assign_core( + core_idx, + BlockNumberFor::::from(11u32), + default_test_assignments(), + None, + ), + Error::::DisallowedInsert + ); + + // Call assign core with block number between already scheduled assignments, expecting an + // error + assert_noop!( + CoretimeAssigner::assign_core( + core_idx, + BlockNumberFor::::from(13u32), + default_test_assignments(), + None, + ), + Error::::DisallowedInsert + ); + }); +} + +#[test] +fn assign_core_enforces_well_formed_schedule() { + let para_id = ParaId::from(1u32); + let core_idx = CoreIndex(0); + + new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { + run_to_block(1, |n| if n == 1 { Some(Default::default()) } else { None }); + + let empty_assignments: Vec<(CoreAssignment, PartsOf57600)> = vec![]; + let overscheduled = vec![ + (CoreAssignment::Pool, PartsOf57600::FULL), + (CoreAssignment::Task(para_id.into()), PartsOf57600::FULL), + ]; + let underscheduled = vec![(CoreAssignment::Pool, PartsOf57600(30000))]; + let not_unique = vec![ + (CoreAssignment::Pool, PartsOf57600::FULL / 2), + (CoreAssignment::Pool, PartsOf57600::FULL / 2), + ]; + let not_sorted = vec![ + (CoreAssignment::Task(para_id.into()), PartsOf57600(19200)), + (CoreAssignment::Pool, PartsOf57600(19200)), + (CoreAssignment::Idle, PartsOf57600(19200)), + ]; + + // Attempting assign_core with malformed assignments such that all error cases + // are tested + assert_noop!( + CoretimeAssigner::assign_core( + core_idx, + BlockNumberFor::::from(11u32), + empty_assignments, + None, + ), + Error::::AssignmentsEmpty + ); + assert_noop!( + CoretimeAssigner::assign_core( + core_idx, + BlockNumberFor::::from(11u32), + overscheduled, + None, + ), + Error::::OverScheduled + ); + assert_noop!( + CoretimeAssigner::assign_core( + core_idx, + BlockNumberFor::::from(11u32), + underscheduled, + None, + ), + Error::::UnderScheduled + ); + assert_noop!( + CoretimeAssigner::assign_core( + core_idx, + BlockNumberFor::::from(11u32), + not_unique, + None, + ), + Error::::AssignmentsNotSorted + ); + assert_noop!( + CoretimeAssigner::assign_core( + core_idx, + BlockNumberFor::::from(11u32), + not_sorted, + None, + ), + Error::::AssignmentsNotSorted + ); + }); +} + +#[test] +fn next_schedule_always_points_to_next_work_plan_item() { + let core_idx = CoreIndex(0); + + new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { + run_to_block(1, |n| if n == 1 { Some(Default::default()) } else { None }); + let start_1 = 15u32; + let start_2 = 20u32; + let start_3 = 25u32; + let start_4 = 30u32; + let start_5 = 35u32; + + let expected_schedule_3 = + Schedule { next_schedule: Some(start_4), ..default_test_schedule() }; + let expected_schedule_4 = + Schedule { next_schedule: Some(start_5), ..default_test_schedule() }; + let expected_schedule_5 = default_test_schedule(); + + // Call assign_core for each of five schedules + assert_ok!(CoretimeAssigner::assign_core( + core_idx, + BlockNumberFor::::from(start_1), + default_test_assignments(), + None, + )); + + assert_ok!(CoretimeAssigner::assign_core( + core_idx, + BlockNumberFor::::from(start_2), + default_test_assignments(), + None, + )); + + assert_ok!(CoretimeAssigner::assign_core( + core_idx, + BlockNumberFor::::from(start_3), + default_test_assignments(), + None, + )); + + assert_ok!(CoretimeAssigner::assign_core( + core_idx, + BlockNumberFor::::from(start_4), + default_test_assignments(), + None, + )); + + assert_ok!(CoretimeAssigner::assign_core( + core_idx, + BlockNumberFor::::from(start_5), + default_test_assignments(), + None, + )); + + // Rotate through the first two schedules + run_to_block(start_1, |n| if n == start_1 { Some(Default::default()) } else { None }); + CoretimeAssigner::pop_assignment_for_core(core_idx); + run_to_block(start_2, |n| if n == start_2 { Some(Default::default()) } else { None }); + CoretimeAssigner::pop_assignment_for_core(core_idx); + + // Use saved starting block numbers to check that schedules chain + // together correctly + assert_eq!( + CoreSchedules::::get((BlockNumberFor::::from(start_3), core_idx)), + Some(expected_schedule_3) + ); + assert_eq!( + CoreSchedules::::get((BlockNumberFor::::from(start_4), core_idx)), + Some(expected_schedule_4) + ); + assert_eq!( + CoreSchedules::::get((BlockNumberFor::::from(start_5), core_idx)), + Some(expected_schedule_5) + ); + + // Check QueueDescriptor + assert_eq!( + CoreDescriptors::::get(core_idx) + .queue + .as_ref() + .and_then(|q| Some(q.first)), + Some(start_3) + ); + assert_eq!( + CoreDescriptors::::get(core_idx).queue.as_ref().and_then(|q| Some(q.last)), + Some(start_5) + ); + }); +} + +#[test] +fn ensure_workload_works() { + let core_idx = CoreIndex(0); + let test_assignment_state = + AssignmentState { ratio: PartsOf57600::FULL, remaining: PartsOf57600::FULL }; + + let empty_descriptor: CoreDescriptor> = + CoreDescriptor { queue: None, current_work: None }; + let assignments_queued_descriptor = CoreDescriptor { + queue: Some(QueueDescriptor { + first: BlockNumberFor::::from(11u32), + last: BlockNumberFor::::from(11u32), + }), + current_work: None, + }; + let assignments_active_descriptor = CoreDescriptor { + queue: None, + current_work: Some(WorkState { + assignments: vec![(CoreAssignment::Pool, test_assignment_state)], + end_hint: Some(BlockNumberFor::::from(15u32)), + pos: 0, + step: PartsOf57600::FULL, + }), + }; + + new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { + let mut core_descriptor: CoreDescriptor> = empty_descriptor.clone(); + run_to_block(1, |n| if n == 1 { Some(Default::default()) } else { None }); + + // Case 1: No new schedule in CoreSchedules for core + CoretimeAssigner::ensure_workload(10u32, core_idx, &mut core_descriptor); + assert_eq!(core_descriptor, empty_descriptor); + + // Case 2: New schedule exists in CoreSchedules for core, but new + // schedule start is not yet reached. + assert_ok!(CoretimeAssigner::assign_core( + core_idx, + BlockNumberFor::::from(11u32), + vec![(CoreAssignment::Pool, PartsOf57600::FULL)], + Some(BlockNumberFor::::from(15u32)), + )); + + // Propagate changes from storage to Core_Descriptor handle. Normally + // pop_assignment_for_core would handle this. + core_descriptor = CoreDescriptors::::get(core_idx); + + CoretimeAssigner::ensure_workload(10u32, core_idx, &mut core_descriptor); + assert_eq!(core_descriptor, assignments_queued_descriptor); + + // Case 3: Next schedule exists in CoreSchedules for core. Next starting + // block has been reached. Swaps new WorkState into CoreDescriptors from + // CoreSchedules. + CoretimeAssigner::ensure_workload(11u32, core_idx, &mut core_descriptor); + assert_eq!(core_descriptor, assignments_active_descriptor); + + // Case 4: end_hint reached but new schedule start not yet reached. WorkState in + // CoreDescriptor is cleared + CoretimeAssigner::ensure_workload(15u32, core_idx, &mut core_descriptor); + assert_eq!(core_descriptor, empty_descriptor); + }); +} + +#[test] +fn pop_assignment_for_core_works() { + let para_id = ParaId::from(1); + let core_idx = CoreIndex(0); + let alice = 1u64; + let amt = 10_000_000u128; + + let assignments_pool = vec![(CoreAssignment::Pool, PartsOf57600::FULL)]; + let assignments_task = vec![(CoreAssignment::Task(para_id.into()), PartsOf57600::FULL)]; + + new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { + // Initialize the parathread, wait for it to be ready, then add an + // on demand order to later pop with our Coretime assigner. + schedule_blank_para(para_id, ParaKind::Parathread); + Balances::make_free_balance_be(&alice, amt); + run_to_block(1, |n| if n == 1 { Some(Default::default()) } else { None }); + assert_ok!(OnDemandAssigner::place_order_allow_death( + RuntimeOrigin::signed(alice), + amt, + para_id + )); + + // Case 1: Assignment idle + assert_ok!(CoretimeAssigner::assign_core( + core_idx, + BlockNumberFor::::from(11u32), + default_test_assignments(), // Default is Idle + None, + )); + + run_to_block(11, |n| if n == 11 { Some(Default::default()) } else { None }); + + assert_eq!(CoretimeAssigner::pop_assignment_for_core(core_idx), None); + + // Case 2: Assignment pool + assert_ok!(CoretimeAssigner::assign_core( + core_idx, + BlockNumberFor::::from(21u32), + assignments_pool, + None, + )); + + run_to_block(21, |n| if n == 21 { Some(Default::default()) } else { None }); + + assert_eq!( + CoretimeAssigner::pop_assignment_for_core(core_idx), + Some(Assignment::Pool { para_id, core_index: 0.into() }) + ); + + // Case 3: Assignment task + assert_ok!(CoretimeAssigner::assign_core( + core_idx, + BlockNumberFor::::from(31u32), + assignments_task, + None, + )); + + run_to_block(31, |n| if n == 31 { Some(Default::default()) } else { None }); + + assert_eq!( + CoretimeAssigner::pop_assignment_for_core(core_idx), + Some(Assignment::Bulk(para_id)) + ); + }); +} + +#[test] +fn assignment_proportions_in_core_state_work() { + let core_idx = CoreIndex(0); + let task_1 = TaskId::from(1u32); + let task_2 = TaskId::from(2u32); + + new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { + run_to_block(1, |n| if n == 1 { Some(Default::default()) } else { None }); + + // Task 1 gets 2/3 core usage, while task 2 gets 1/3 + let test_assignments = vec![ + (CoreAssignment::Task(task_1), PartsOf57600::FULL / 3 * 2), + (CoreAssignment::Task(task_2), PartsOf57600::FULL / 3), + ]; + + assert_ok!(CoretimeAssigner::assign_core( + core_idx, + BlockNumberFor::::from(11u32), + test_assignments, + None, + )); + + run_to_block(11, |n| if n == 11 { Some(Default::default()) } else { None }); + + // Case 1: Current assignment remaining >= step after pop + { + assert_eq!( + CoretimeAssigner::pop_assignment_for_core(core_idx), + Some(Assignment::Bulk(task_1.into())) + ); + + assert_eq!( + CoreDescriptors::::get(core_idx) + .current_work + .as_ref() + .and_then(|w| Some(w.pos)), + Some(0u16) + ); + // Consumed step should be 1/3 of core parts, leaving 1/3 remaining + assert_eq!( + CoreDescriptors::::get(core_idx) + .current_work + .as_ref() + .and_then(|w| Some(w.assignments[0].1.remaining)), + Some(PartsOf57600::FULL / 3) + ); + } + + // Case 2: Current assignment remaning < step after pop + { + assert_eq!( + CoretimeAssigner::pop_assignment_for_core(core_idx), + Some(Assignment::Bulk(task_1.into())) + ); + // Pos should have incremented, as assignment had remaining < step + assert_eq!( + CoreDescriptors::::get(core_idx) + .current_work + .as_ref() + .and_then(|w| Some(w.pos)), + Some(1u16) + ); + // Remaining should have started at 1/3 of core work parts. We then subtract + // step (1/3) and add back ratio (2/3), leaving us with 2/3 of core work parts. + assert_eq!( + CoreDescriptors::::get(core_idx) + .current_work + .as_ref() + .and_then(|w| Some(w.assignments[0].1.remaining)), + Some(PartsOf57600::FULL / 3 * 2) + ); + } + + // Final check, task 2's turn to be served + assert_eq!( + CoretimeAssigner::pop_assignment_for_core(core_idx), + Some(Assignment::Bulk(task_2.into())) + ); + }); +} + +#[test] +fn equal_assignments_served_equally() { + let core_idx = CoreIndex(0); + let task_1 = TaskId::from(1u32); + let task_2 = TaskId::from(2u32); + + new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { + run_to_block(1, |n| if n == 1 { Some(Default::default()) } else { None }); + + // Tasks 1 and 2 get equal work parts + let test_assignments = vec![ + (CoreAssignment::Task(task_1), PartsOf57600::FULL / 2), + (CoreAssignment::Task(task_2), PartsOf57600::FULL / 2), + ]; + + assert_ok!(CoretimeAssigner::assign_core( + core_idx, + BlockNumberFor::::from(11u32), + test_assignments, + None, + )); + + run_to_block(11, |n| if n == 11 { Some(Default::default()) } else { None }); + + // Test that popped assignments alternate between tasks 1 and 2 + assert_eq!( + CoretimeAssigner::pop_assignment_for_core(core_idx), + Some(Assignment::Bulk(task_1.into())) + ); + + assert_eq!( + CoretimeAssigner::pop_assignment_for_core(core_idx), + Some(Assignment::Bulk(task_2.into())) + ); + + assert_eq!( + CoretimeAssigner::pop_assignment_for_core(core_idx), + Some(Assignment::Bulk(task_1.into())) + ); + + assert_eq!( + CoretimeAssigner::pop_assignment_for_core(core_idx), + Some(Assignment::Bulk(task_2.into())) + ); + + assert_eq!( + CoretimeAssigner::pop_assignment_for_core(core_idx), + Some(Assignment::Bulk(task_1.into())) + ); + + assert_eq!( + CoretimeAssigner::pop_assignment_for_core(core_idx), + Some(Assignment::Bulk(task_2.into())) + ); + }); +} + +#[test] +// Checks that core is shared fairly, even in case of `ratio` not being +// divisible by `step` (over multiple rounds). +fn assignment_proportions_indivisible_by_step_work() { + let core_idx = CoreIndex(0); + let task_1 = TaskId::from(1u32); + let ratio_1 = PartsOf57600::FULL / 5 * 3; + let ratio_2 = PartsOf57600::FULL / 5 * 2; + let task_2 = TaskId::from(2u32); + + new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { + run_to_block(1, |n| if n == 1 { Some(Default::default()) } else { None }); + + // Task 1 gets 3/5 core usage, while task 2 gets 2/5. That way + // step is set to 2/5 and task 1 is indivisible by step. + let test_assignments = + vec![(CoreAssignment::Task(task_1), ratio_1), (CoreAssignment::Task(task_2), ratio_2)]; + + assert_ok!(CoretimeAssigner::assign_core( + core_idx, + BlockNumberFor::::from(11u32), + test_assignments, + None, + )); + + run_to_block(11, |n| if n == 11 { Some(Default::default()) } else { None }); + + // Pop 5 assignments. Should Result in the the following work ordering: + // 1, 2, 1, 1, 2. The remaining parts for each assignment should be same + // at the end as in the beginning. + assert_eq!( + CoretimeAssigner::pop_assignment_for_core(core_idx), + Some(Assignment::Bulk(task_1.into())) + ); + + assert_eq!( + CoretimeAssigner::pop_assignment_for_core(core_idx), + Some(Assignment::Bulk(task_2.into())) + ); + + assert_eq!( + CoretimeAssigner::pop_assignment_for_core(core_idx), + Some(Assignment::Bulk(task_1.into())) + ); + + assert_eq!( + CoretimeAssigner::pop_assignment_for_core(core_idx), + Some(Assignment::Bulk(task_1.into())) + ); + + assert_eq!( + CoretimeAssigner::pop_assignment_for_core(core_idx), + Some(Assignment::Bulk(task_2.into())) + ); + + // Remaining should equal ratio for both assignments. + assert_eq!( + CoreDescriptors::::get(core_idx) + .current_work + .as_ref() + .and_then(|w| Some(w.assignments[0].1.remaining)), + Some(ratio_1) + ); + assert_eq!( + CoreDescriptors::::get(core_idx) + .current_work + .as_ref() + .and_then(|w| Some(w.assignments[1].1.remaining)), + Some(ratio_2) + ); + }); +} + +#[cfg(test)] +impl std::ops::Div for PartsOf57600 { + type Output = Self; + + fn div(self, rhs: u16) -> Self::Output { + if rhs == 0 { + panic!("Cannot divide by zero!"); + } + + Self(self.0 / rhs) + } +} + +#[cfg(test)] +impl std::ops::Mul for PartsOf57600 { + type Output = Self; + + fn mul(self, rhs: u16) -> Self { + Self(self.0 * rhs) + } +} + +#[test] +fn parts_of_57600_ops() { + assert!(PartsOf57600::new_saturating(57601).is_full()); + assert!(PartsOf57600::FULL.saturating_add(PartsOf57600(1)).is_full()); + assert_eq!(PartsOf57600::ZERO.saturating_sub(PartsOf57600(1)), PartsOf57600::ZERO); + assert_eq!(PartsOf57600::FULL.checked_add(PartsOf57600(0)), Some(PartsOf57600::FULL)); + assert_eq!(PartsOf57600::FULL.checked_add(PartsOf57600(1)), None); +} diff --git a/polkadot/runtime/parachains/src/assigner_on_demand/benchmarking.rs b/polkadot/runtime/parachains/src/assigner_on_demand/benchmarking.rs index 42ca94d5185..5a6060cd2b4 100644 --- a/polkadot/runtime/parachains/src/assigner_on_demand/benchmarking.rs +++ b/polkadot/runtime/parachains/src/assigner_on_demand/benchmarking.rs @@ -43,7 +43,7 @@ where { ParasShared::::set_session_index(SESSION_INDEX); let mut config = HostConfiguration::default(); - config.on_demand_cores = 1; + config.coretime_cores = 1; ConfigurationPallet::::force_set_active_config(config); let mut parachains = ParachainsCache::new(); ParasPallet::::initialize_para_now( @@ -70,11 +70,10 @@ mod benchmarks { let para_id = ParaId::from(111u32); init_parathread::(para_id); T::Currency::make_free_balance_be(&caller, BalanceOf::::max_value()); - let assignment = Assignment::new(para_id); + let order = EnqueuedOrder::new(para_id); for _ in 0..s { - Pallet::::add_on_demand_assignment(assignment.clone(), QueuePushDirection::Back) - .unwrap(); + Pallet::::add_on_demand_order(order.clone(), QueuePushDirection::Back).unwrap(); } #[extrinsic_call] @@ -88,11 +87,10 @@ mod benchmarks { let para_id = ParaId::from(111u32); init_parathread::(para_id); T::Currency::make_free_balance_be(&caller, BalanceOf::::max_value()); - let assignment = Assignment::new(para_id); + let order = EnqueuedOrder::new(para_id); for _ in 0..s { - Pallet::::add_on_demand_assignment(assignment.clone(), QueuePushDirection::Back) - .unwrap(); + Pallet::::add_on_demand_order(order.clone(), QueuePushDirection::Back).unwrap(); } #[extrinsic_call] diff --git a/polkadot/runtime/parachains/src/assigner_on_demand/mock_helpers.rs b/polkadot/runtime/parachains/src/assigner_on_demand/mock_helpers.rs index acfb24cbf19..de30330ac84 100644 --- a/polkadot/runtime/parachains/src/assigner_on_demand/mock_helpers.rs +++ b/polkadot/runtime/parachains/src/assigner_on_demand/mock_helpers.rs @@ -27,7 +27,7 @@ use crate::{ use primitives::{Balance, HeadData, ValidationCode}; -pub fn default_genesis_config() -> MockGenesisConfig { +fn default_genesis_config() -> MockGenesisConfig { MockGenesisConfig { configuration: crate::configuration::GenesisConfig { config: crate::configuration::HostConfiguration { ..Default::default() }, @@ -63,7 +63,7 @@ impl GenesisConfigBuilder { pub(super) fn build(self) -> MockGenesisConfig { let mut genesis = default_genesis_config(); let config = &mut genesis.configuration.config; - config.on_demand_cores = self.on_demand_cores; + config.coretime_cores = self.on_demand_cores; config.on_demand_base_fee = self.on_demand_base_fee; config.on_demand_fee_variability = self.on_demand_fee_variability; config.on_demand_queue_max_size = self.on_demand_max_queue_size; diff --git a/polkadot/runtime/parachains/src/assigner_on_demand/mod.rs b/polkadot/runtime/parachains/src/assigner_on_demand/mod.rs index f4214027a6b..1b746e88694 100644 --- a/polkadot/runtime/parachains/src/assigner_on_demand/mod.rs +++ b/polkadot/runtime/parachains/src/assigner_on_demand/mod.rs @@ -32,10 +32,7 @@ mod mock_helpers; #[cfg(test)] mod tests; -use crate::{ - configuration, paras, - scheduler::common::{Assignment, AssignmentProvider, AssignmentProviderConfig}, -}; +use crate::{configuration, paras, scheduler::common::Assignment}; use frame_support::{ pallet_prelude::*, @@ -79,7 +76,7 @@ impl WeightInfo for TestWeightInfo { /// Keeps track of how many assignments a scheduler currently has at a specific `CoreIndex` for a /// specific `ParaId`. #[derive(Encode, Decode, Default, Clone, Copy, TypeInfo)] -#[cfg_attr(test, derive(PartialEq, Debug))] +#[cfg_attr(test, derive(PartialEq, RuntimeDebug))] pub struct CoreAffinityCount { core_idx: CoreIndex, count: u32, @@ -107,6 +104,18 @@ pub enum SpotTrafficCalculationErr { Division, } +/// Internal representation of an order after it has been enqueued already. +#[derive(Encode, Decode, TypeInfo, Debug, PartialEq, Clone)] +pub(super) struct EnqueuedOrder { + pub para_id: ParaId, +} + +impl EnqueuedOrder { + pub fn new(para_id: ParaId) -> Self { + Self { para_id } + } +} + #[frame_support::pallet] pub mod pallet { @@ -140,7 +149,7 @@ pub mod pallet { /// Creates an empty on demand queue if one isn't present in storage already. #[pallet::type_value] - pub fn OnDemandQueueOnEmpty() -> VecDeque { + pub(super) fn OnDemandQueueOnEmpty() -> VecDeque { VecDeque::new() } @@ -153,8 +162,8 @@ pub mod pallet { /// The order storage entry. Uses a VecDeque to be able to push to the front of the /// queue from the scheduler on session boundaries. #[pallet::storage] - pub type OnDemandQueue = - StorageValue<_, VecDeque, ValueQuery, OnDemandQueueOnEmpty>; + pub(super) type OnDemandQueue = + StorageValue<_, VecDeque, ValueQuery, OnDemandQueueOnEmpty>; /// Maps a `ParaId` to `CoreIndex` and keeps track of how many assignments the scheduler has in /// it's lookahead. Keeping track of this affinity prevents parallel execution of the same @@ -182,9 +191,6 @@ pub mod pallet { /// The current spot price is higher than the max amount specified in the `place_order` /// call, making it invalid. SpotPriceHigherThanMaxAmount, - /// There are no on demand cores available. `place_order` will not add anything to the - /// queue. - NoOnDemandCores, } #[pallet::hooks] @@ -248,7 +254,6 @@ pub mod pallet { /// - `InvalidParaId` /// - `QueueFull` /// - `SpotPriceHigherThanMaxAmount` - /// - `NoOnDemandCores` /// /// Events: /// - `SpotOrderPlaced` @@ -276,7 +281,6 @@ pub mod pallet { /// - `InvalidParaId` /// - `QueueFull` /// - `SpotPriceHigherThanMaxAmount` - /// - `NoOnDemandCores` /// /// Events: /// - `SpotOrderPlaced` @@ -311,7 +315,6 @@ where /// - `InvalidParaId` /// - `QueueFull` /// - `SpotPriceHigherThanMaxAmount` - /// - `NoOnDemandCores` /// /// Events: /// - `SpotOrderPlaced` @@ -323,9 +326,6 @@ where ) -> DispatchResult { let config = >::config(); - // Are there any schedulable cores in this session - ensure!(config.on_demand_cores > 0, Error::::NoOnDemandCores); - // Traffic always falls back to 1.0 let traffic = SpotTraffic::::get(); @@ -344,17 +344,15 @@ where existence_requirement, )?; - let assignment = Assignment::new(para_id); + let order = EnqueuedOrder::new(para_id); - let res = Pallet::::add_on_demand_assignment(assignment, QueuePushDirection::Back); + let res = Pallet::::add_on_demand_order(order, QueuePushDirection::Back); - match res { - Ok(_) => { - Pallet::::deposit_event(Event::::OnDemandOrderPlaced { para_id, spot_price }); - return Ok(()) - }, - Err(err) => return Err(err), + if res.is_ok() { + Pallet::::deposit_event(Event::::OnDemandOrderPlaced { para_id, spot_price }); } + + res } /// The spot price multiplier. This is based on the transaction fee calculations defined in: @@ -428,10 +426,10 @@ where } } - /// Adds an assignment to the on demand queue. + /// Adds an order to the on demand queue. /// /// Paramenters: - /// - `assignment`: The on demand assignment to add to the queue. + /// - `order`: The `EnqueuedOrder` to add to the queue. /// - `location`: Whether to push this entry to the back or the front of the queue. Pushing an /// entry to the front of the queue is only used when the scheduler wants to push back an /// entry it has already popped. @@ -441,12 +439,12 @@ where /// Errors: /// - `InvalidParaId` /// - `QueueFull` - pub fn add_on_demand_assignment( - assignment: Assignment, + fn add_on_demand_order( + order: EnqueuedOrder, location: QueuePushDirection, ) -> Result<(), DispatchError> { // Only parathreads are valid paraids for on the go parachains. - ensure!(>::is_parathread(assignment.para_id), Error::::InvalidParaId); + ensure!(>::is_parathread(order.para_id), Error::::InvalidParaId); let config = >::config(); @@ -454,8 +452,8 @@ where // Abort transaction if queue is too large ensure!(Self::queue_size() < config.on_demand_queue_max_size, Error::::QueueFull); match location { - QueuePushDirection::Back => queue.push_back(assignment), - QueuePushDirection::Front => queue.push_front(assignment), + QueuePushDirection::Back => queue.push_back(order), + QueuePushDirection::Front => queue.push_front(order), }; Ok(()) }) @@ -480,7 +478,8 @@ where } /// Getter for the order queue. - pub fn get_queue() -> VecDeque { + #[cfg(test)] + fn get_queue() -> VecDeque { OnDemandQueue::::get() } @@ -528,12 +527,7 @@ where } } -impl AssignmentProvider> for Pallet { - fn session_core_count() -> u32 { - let config = >::config(); - config.on_demand_cores - } - +impl Pallet { /// Take the next queued entry that is available for a given core index. /// Invalidates and removes orders with a `para_id` that is not `ParaLifecycle::Parathread` /// but only in [0..P] range slice of the order queue, where P is the element that is @@ -541,20 +535,8 @@ impl AssignmentProvider> for Pallet { /// /// Parameters: /// - `core_idx`: The core index - /// - `previous_paraid`: Which paraid was previously processed on the requested core. Is None if - /// nothing was processed on the core. - fn pop_assignment_for_core( - core_idx: CoreIndex, - previous_para: Option, - ) -> Option { - // Only decrease the affinity of the previous para if it exists. - // A nonexistant `ParaId` indicates that the scheduler has not processed any - // `ParaId` this session. - if let Some(previous_para_id) = previous_para { - Pallet::::decrease_affinity(previous_para_id, core_idx) - } - - let mut queue: VecDeque = OnDemandQueue::::get(); + pub fn pop_assignment_for_core(core_idx: CoreIndex) -> Option { + let mut queue: VecDeque = OnDemandQueue::::get(); let mut invalidated_para_id_indexes: Vec = vec![]; @@ -591,28 +573,28 @@ impl AssignmentProvider> for Pallet { // Write changes to storage. OnDemandQueue::::set(queue); - popped + popped.map(|p| Assignment::Pool { para_id: p.para_id, core_index: core_idx }) } - /// Push an assignment back to the queue. - /// Typically used on session boundaries. + /// Report that the `para_id` & `core_index` combination was processed. + pub fn report_processed(para_id: ParaId, core_index: CoreIndex) { + Pallet::::decrease_affinity(para_id, core_index) + } + + /// Push an assignment back to the front of the queue. + /// + /// The assignment has not been processed yet. Typically used on session boundaries. /// Parameters: - /// - `core_idx`: The core index /// - `assignment`: The on demand assignment. - fn push_assignment_for_core(core_idx: CoreIndex, assignment: Assignment) { - Pallet::::decrease_affinity(assignment.para_id, core_idx); + pub fn push_back_assignment(para_id: ParaId, core_index: CoreIndex) { + Pallet::::decrease_affinity(para_id, core_index); // Skip the queue on push backs from scheduler - match Pallet::::add_on_demand_assignment(assignment, QueuePushDirection::Front) { + match Pallet::::add_on_demand_order( + EnqueuedOrder::new(para_id), + QueuePushDirection::Front, + ) { Ok(_) => {}, Err(_) => {}, } } - - fn get_provider_config(_core_idx: CoreIndex) -> AssignmentProviderConfig> { - let config = >::config(); - AssignmentProviderConfig { - max_availability_timeouts: config.on_demand_retries, - ttl: config.on_demand_ttl, - } - } } diff --git a/polkadot/runtime/parachains/src/assigner_on_demand/tests.rs b/polkadot/runtime/parachains/src/assigner_on_demand/tests.rs index d07964b6916..8404700780c 100644 --- a/polkadot/runtime/parachains/src/assigner_on_demand/tests.rs +++ b/polkadot/runtime/parachains/src/assigner_on_demand/tests.rs @@ -24,7 +24,6 @@ use crate::{ System, Test, }, paras::{ParaGenesisArgs, ParaKind}, - scheduler::common::Assignment, }; use frame_support::{assert_noop, assert_ok, error::BadOrigin}; use pallet_balances::Error as BalancesError; @@ -75,7 +74,7 @@ fn run_to_block( Scheduler::initializer_initialize(b + 1); // In the real runtime this is expected to be called by the `InclusionInherent` pallet. - Scheduler::update_claimqueue(BTreeMap::new(), b + 1); + Scheduler::free_cores_and_fill_claimqueue(BTreeMap::new(), b + 1); } } @@ -280,9 +279,9 @@ fn place_order_keep_alive_keeps_alive() { } #[test] -fn add_on_demand_assignment_works() { +fn add_on_demand_order_works() { let para_a = ParaId::from(111); - let assignment = Assignment::new(para_a); + let order = EnqueuedOrder::new(para_a); let mut genesis = GenesisConfigBuilder::default(); genesis.on_demand_max_queue_size = 1; @@ -292,10 +291,7 @@ fn add_on_demand_assignment_works() { // `para_a` is not onboarded as a parathread yet. assert_noop!( - OnDemandAssigner::add_on_demand_assignment( - assignment.clone(), - QueuePushDirection::Back - ), + OnDemandAssigner::add_on_demand_order(order.clone(), QueuePushDirection::Back), Error::::InvalidParaId ); @@ -304,14 +300,11 @@ fn add_on_demand_assignment_works() { assert!(Paras::is_parathread(para_a)); // `para_a` is now onboarded as a valid parathread. - assert_ok!(OnDemandAssigner::add_on_demand_assignment( - assignment.clone(), - QueuePushDirection::Back - )); + assert_ok!(OnDemandAssigner::add_on_demand_order(order.clone(), QueuePushDirection::Back)); // Max queue size is 1, queue should be full. assert_noop!( - OnDemandAssigner::add_on_demand_assignment(assignment, QueuePushDirection::Back), + OnDemandAssigner::add_on_demand_order(order, QueuePushDirection::Back), Error::::QueueFull ); }); @@ -330,29 +323,131 @@ fn spotqueue_push_directions() { run_to_block(11, |n| if n == 11 { Some(Default::default()) } else { None }); - let assignment_a = Assignment { para_id: para_a }; - let assignment_b = Assignment { para_id: para_b }; - let assignment_c = Assignment { para_id: para_c }; + let order_a = EnqueuedOrder::new(para_a); + let order_b = EnqueuedOrder::new(para_b); + let order_c = EnqueuedOrder::new(para_c); - assert_ok!(OnDemandAssigner::add_on_demand_assignment( - assignment_a.clone(), + assert_ok!(OnDemandAssigner::add_on_demand_order( + order_a.clone(), QueuePushDirection::Front )); - assert_ok!(OnDemandAssigner::add_on_demand_assignment( - assignment_b.clone(), + assert_ok!(OnDemandAssigner::add_on_demand_order( + order_b.clone(), QueuePushDirection::Front )); - assert_ok!(OnDemandAssigner::add_on_demand_assignment( - assignment_c.clone(), + assert_ok!(OnDemandAssigner::add_on_demand_order( + order_c.clone(), QueuePushDirection::Back )); assert_eq!(OnDemandAssigner::queue_size(), 3); + assert_eq!(OnDemandAssigner::get_queue(), VecDeque::from(vec![order_b, order_a, order_c])) + }); +} + +#[test] +fn pop_assignment_for_core_works() { + new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { + let para_a = ParaId::from(111); + let para_b = ParaId::from(110); + schedule_blank_para(para_a, ParaKind::Parathread); + schedule_blank_para(para_b, ParaKind::Parathread); + + run_to_block(11, |n| if n == 11 { Some(Default::default()) } else { None }); + + let order_a = EnqueuedOrder::new(para_a); + let order_b = EnqueuedOrder::new(para_b); + let assignment_a = Assignment::Pool { para_id: para_a, core_index: CoreIndex(0) }; + let assignment_b = Assignment::Pool { para_id: para_b, core_index: CoreIndex(1) }; + + // Pop should return none with empty queue + assert_eq!(OnDemandAssigner::pop_assignment_for_core(CoreIndex(0)), None); + + // Add enough assignments to the order queue. + for _ in 0..2 { + OnDemandAssigner::add_on_demand_order(order_a.clone(), QueuePushDirection::Back) + .expect("Invalid paraid or queue full"); + + OnDemandAssigner::add_on_demand_order(order_b.clone(), QueuePushDirection::Back) + .expect("Invalid paraid or queue full"); + } + + // Queue should contain orders a, b, a, b + { + let queue: Vec = OnDemandQueue::::get().into_iter().collect(); + assert_eq!( + queue, + vec![order_a.clone(), order_b.clone(), order_a.clone(), order_b.clone()] + ); + } + + // Popped assignments should be for the correct paras and cores assert_eq!( - OnDemandAssigner::get_queue(), - VecDeque::from(vec![assignment_b, assignment_a, assignment_c]) - ) + OnDemandAssigner::pop_assignment_for_core(CoreIndex(0)), + Some(assignment_a.clone()) + ); + assert_eq!( + OnDemandAssigner::pop_assignment_for_core(CoreIndex(1)), + Some(assignment_b.clone()) + ); + assert_eq!( + OnDemandAssigner::pop_assignment_for_core(CoreIndex(0)), + Some(assignment_a.clone()) + ); + + // Queue should contain one left over order + { + let queue: Vec = OnDemandQueue::::get().into_iter().collect(); + assert_eq!(queue, vec![order_b.clone(),]); + } + }); +} + +#[test] +fn push_back_assignment_works() { + new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { + let para_a = ParaId::from(111); + let para_b = ParaId::from(110); + schedule_blank_para(para_a, ParaKind::Parathread); + schedule_blank_para(para_b, ParaKind::Parathread); + + run_to_block(11, |n| if n == 11 { Some(Default::default()) } else { None }); + + let order_a = EnqueuedOrder::new(para_a); + let order_b = EnqueuedOrder::new(para_b); + + // Add enough assignments to the order queue. + OnDemandAssigner::add_on_demand_order(order_a.clone(), QueuePushDirection::Back) + .expect("Invalid paraid or queue full"); + + OnDemandAssigner::add_on_demand_order(order_b.clone(), QueuePushDirection::Back) + .expect("Invalid paraid or queue full"); + + // Pop order a + OnDemandAssigner::pop_assignment_for_core(CoreIndex(0)); + + // Para a should have affinity for core 0 + assert_eq!(OnDemandAssigner::get_affinity_map(para_a).unwrap().count, 1); + assert_eq!(OnDemandAssigner::get_affinity_map(para_a).unwrap().core_idx, CoreIndex(0)); + + // Queue should still contain order b + { + let queue: Vec = OnDemandQueue::::get().into_iter().collect(); + assert_eq!(queue, vec![order_b.clone()]); + } + + // Push back order a + OnDemandAssigner::push_back_assignment(para_a, CoreIndex(0)); + + // Para a should have no affinity + assert_eq!(OnDemandAssigner::get_affinity_map(para_a).is_none(), true); + + // Queue should contain orders a, b. A in front of b. + { + let queue: Vec = OnDemandQueue::::get().into_iter().collect(); + assert_eq!(queue, vec![order_a.clone(), order_b.clone()]); + } }); } @@ -360,39 +455,38 @@ fn spotqueue_push_directions() { fn affinity_changes_work() { new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { let para_a = ParaId::from(111); + let core_index = CoreIndex(0); schedule_blank_para(para_a, ParaKind::Parathread); + let order_a = EnqueuedOrder::new(para_a); run_to_block(11, |n| if n == 11 { Some(Default::default()) } else { None }); - let assignment_a = Assignment { para_id: para_a }; // There should be no affinity before starting. assert!(OnDemandAssigner::get_affinity_map(para_a).is_none()); // Add enough assignments to the order queue. for _ in 0..10 { - OnDemandAssigner::add_on_demand_assignment( - assignment_a.clone(), - QueuePushDirection::Front, - ) - .expect("Invalid paraid or queue full"); + OnDemandAssigner::add_on_demand_order(order_a.clone(), QueuePushDirection::Front) + .expect("Invalid paraid or queue full"); } // There should be no affinity before the scheduler pops. assert!(OnDemandAssigner::get_affinity_map(para_a).is_none()); - OnDemandAssigner::pop_assignment_for_core(CoreIndex(0), None); + OnDemandAssigner::pop_assignment_for_core(core_index); // Affinity count is 1 after popping. assert_eq!(OnDemandAssigner::get_affinity_map(para_a).unwrap().count, 1); - OnDemandAssigner::pop_assignment_for_core(CoreIndex(0), Some(para_a)); + OnDemandAssigner::report_processed(para_a, 0.into()); + OnDemandAssigner::pop_assignment_for_core(core_index); // Affinity count is 1 after popping with a previous para. assert_eq!(OnDemandAssigner::get_affinity_map(para_a).unwrap().count, 1); assert_eq!(OnDemandAssigner::queue_size(), 8); for _ in 0..3 { - OnDemandAssigner::pop_assignment_for_core(CoreIndex(0), None); + OnDemandAssigner::pop_assignment_for_core(core_index); } // Affinity count is 4 after popping 3 times without a previous para. @@ -400,7 +494,8 @@ fn affinity_changes_work() { assert_eq!(OnDemandAssigner::queue_size(), 5); for _ in 0..5 { - OnDemandAssigner::pop_assignment_for_core(CoreIndex(0), Some(para_a)); + OnDemandAssigner::report_processed(para_a, 0.into()); + OnDemandAssigner::pop_assignment_for_core(core_index); } // Affinity count should still be 4 but queue should be empty. @@ -409,12 +504,14 @@ fn affinity_changes_work() { // Pop 4 times and get to exactly 0 (None) affinity. for _ in 0..4 { - OnDemandAssigner::pop_assignment_for_core(CoreIndex(0), Some(para_a)); + OnDemandAssigner::report_processed(para_a, 0.into()); + OnDemandAssigner::pop_assignment_for_core(core_index); } assert!(OnDemandAssigner::get_affinity_map(para_a).is_none()); // Decreasing affinity beyond 0 should still be None. - OnDemandAssigner::pop_assignment_for_core(CoreIndex(0), Some(para_a)); + OnDemandAssigner::report_processed(para_a, 0.into()); + OnDemandAssigner::pop_assignment_for_core(core_index); assert!(OnDemandAssigner::get_affinity_map(para_a).is_none()); }); } @@ -430,28 +527,28 @@ fn affinity_prohibits_parallel_scheduling() { run_to_block(11, |n| if n == 11 { Some(Default::default()) } else { None }); - let assignment_a = Assignment { para_id: para_a }; - let assignment_b = Assignment { para_id: para_b }; + let order_a = EnqueuedOrder::new(para_a); + let order_b = EnqueuedOrder::new(para_b); // There should be no affinity before starting. assert!(OnDemandAssigner::get_affinity_map(para_a).is_none()); assert!(OnDemandAssigner::get_affinity_map(para_b).is_none()); // Add 2 assignments for para_a for every para_b. - OnDemandAssigner::add_on_demand_assignment(assignment_a.clone(), QueuePushDirection::Back) + OnDemandAssigner::add_on_demand_order(order_a.clone(), QueuePushDirection::Back) .expect("Invalid paraid or queue full"); - OnDemandAssigner::add_on_demand_assignment(assignment_a.clone(), QueuePushDirection::Back) + OnDemandAssigner::add_on_demand_order(order_a.clone(), QueuePushDirection::Back) .expect("Invalid paraid or queue full"); - OnDemandAssigner::add_on_demand_assignment(assignment_b.clone(), QueuePushDirection::Back) + OnDemandAssigner::add_on_demand_order(order_b.clone(), QueuePushDirection::Back) .expect("Invalid paraid or queue full"); assert_eq!(OnDemandAssigner::queue_size(), 3); // Approximate having 1 core. for _ in 0..3 { - OnDemandAssigner::pop_assignment_for_core(CoreIndex(0), None); + OnDemandAssigner::pop_assignment_for_core(CoreIndex(0)); } // Affinity on one core is meaningless. @@ -463,24 +560,25 @@ fn affinity_prohibits_parallel_scheduling() { ); // Clear affinity - OnDemandAssigner::pop_assignment_for_core(CoreIndex(0), Some(para_a)); - OnDemandAssigner::pop_assignment_for_core(CoreIndex(0), Some(para_a)); - OnDemandAssigner::pop_assignment_for_core(CoreIndex(0), Some(para_b)); + OnDemandAssigner::report_processed(para_a, 0.into()); + OnDemandAssigner::report_processed(para_a, 0.into()); + OnDemandAssigner::report_processed(para_b, 0.into()); // Add 2 assignments for para_a for every para_b. - OnDemandAssigner::add_on_demand_assignment(assignment_a.clone(), QueuePushDirection::Back) + OnDemandAssigner::add_on_demand_order(order_a.clone(), QueuePushDirection::Back) .expect("Invalid paraid or queue full"); - OnDemandAssigner::add_on_demand_assignment(assignment_a.clone(), QueuePushDirection::Back) + OnDemandAssigner::add_on_demand_order(order_a.clone(), QueuePushDirection::Back) .expect("Invalid paraid or queue full"); - OnDemandAssigner::add_on_demand_assignment(assignment_b.clone(), QueuePushDirection::Back) + OnDemandAssigner::add_on_demand_order(order_b.clone(), QueuePushDirection::Back) .expect("Invalid paraid or queue full"); - // Approximate having 2 cores. + // Approximate having 3 cores. CoreIndex 2 should be unable to obtain an assignment for _ in 0..3 { - OnDemandAssigner::pop_assignment_for_core(CoreIndex(0), None); - OnDemandAssigner::pop_assignment_for_core(CoreIndex(1), None); + OnDemandAssigner::pop_assignment_for_core(CoreIndex(0)); + OnDemandAssigner::pop_assignment_for_core(CoreIndex(1)); + assert_eq!(None, OnDemandAssigner::pop_assignment_for_core(CoreIndex(2))); } // Affinity should be the same as before, but on different cores. @@ -488,38 +586,23 @@ fn affinity_prohibits_parallel_scheduling() { assert_eq!(OnDemandAssigner::get_affinity_map(para_b).unwrap().count, 1); assert_eq!(OnDemandAssigner::get_affinity_map(para_a).unwrap().core_idx, CoreIndex(0)); assert_eq!(OnDemandAssigner::get_affinity_map(para_b).unwrap().core_idx, CoreIndex(1)); - }); -} - -#[test] -fn cannot_place_order_when_no_on_demand_cores() { - let mut genesis = GenesisConfigBuilder::default(); - genesis.on_demand_cores = 0; - let para_id = ParaId::from(10); - let alice = 1u64; - let amt = 10_000_000u128; - - new_test_ext(genesis.build()).execute_with(|| { - schedule_blank_para(para_id, ParaKind::Parathread); - Balances::make_free_balance_be(&alice, amt); - assert!(!Paras::is_parathread(para_id)); - - run_to_block(10, |n| if n == 10 { Some(Default::default()) } else { None }); - - assert!(Paras::is_parathread(para_id)); + // Clear affinity + OnDemandAssigner::report_processed(para_a, 0.into()); + OnDemandAssigner::report_processed(para_a, 0.into()); + OnDemandAssigner::report_processed(para_b, 1.into()); - assert_noop!( - OnDemandAssigner::place_order_allow_death(RuntimeOrigin::signed(alice), amt, para_id), - Error::::NoOnDemandCores - ); + // There should be no affinity after clearing. + assert!(OnDemandAssigner::get_affinity_map(para_a).is_none()); + assert!(OnDemandAssigner::get_affinity_map(para_b).is_none()); }); } #[test] fn on_demand_orders_cannot_be_popped_if_lifecycle_changes() { let para_id = ParaId::from(10); - let assignment = Assignment { para_id }; + let core_index = CoreIndex(0); + let order = EnqueuedOrder::new(para_id); new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { // Register the para_id as a parathread @@ -530,17 +613,14 @@ fn on_demand_orders_cannot_be_popped_if_lifecycle_changes() { assert!(Paras::is_parathread(para_id)); // Add two assignments for a para_id with a valid lifecycle. - assert_ok!(OnDemandAssigner::add_on_demand_assignment( - assignment.clone(), - QueuePushDirection::Back - )); - assert_ok!(OnDemandAssigner::add_on_demand_assignment( - assignment.clone(), - QueuePushDirection::Back - )); + assert_ok!(OnDemandAssigner::add_on_demand_order(order.clone(), QueuePushDirection::Back)); + assert_ok!(OnDemandAssigner::add_on_demand_order(order.clone(), QueuePushDirection::Back)); // First pop is fine - assert!(OnDemandAssigner::pop_assignment_for_core(CoreIndex(0), None) == Some(assignment)); + assert!( + OnDemandAssigner::pop_assignment_for_core(core_index) == + Some(Assignment::Pool { para_id, core_index }) + ); // Deregister para assert_ok!(Paras::schedule_para_cleanup(para_id)); @@ -551,6 +631,7 @@ fn on_demand_orders_cannot_be_popped_if_lifecycle_changes() { assert!(!Paras::is_parathread(para_id)); // Second pop should be None. - assert!(OnDemandAssigner::pop_assignment_for_core(CoreIndex(0), Some(para_id)) == None); + OnDemandAssigner::report_processed(para_id, core_index); + assert_eq!(OnDemandAssigner::pop_assignment_for_core(core_index), None); }); } diff --git a/polkadot/runtime/parachains/src/assigner_parachains.rs b/polkadot/runtime/parachains/src/assigner_parachains.rs index 866e8290052..34b5d3c1ec5 100644 --- a/polkadot/runtime/parachains/src/assigner_parachains.rs +++ b/polkadot/runtime/parachains/src/assigner_parachains.rs @@ -17,13 +17,20 @@ //! The bulk (parachain slot auction) blockspace assignment provider. //! This provider is tightly coupled with the configuration and paras modules. +#[cfg(test)] +mod mock_helpers; +#[cfg(test)] +mod tests; + +use frame_system::pallet_prelude::BlockNumberFor; +use primitives::CoreIndex; + use crate::{ configuration, paras, scheduler::common::{Assignment, AssignmentProvider, AssignmentProviderConfig}, }; -use frame_system::pallet_prelude::BlockNumberFor; + pub use pallet::*; -use primitives::{CoreIndex, Id as ParaId}; #[frame_support::pallet] pub mod pallet { @@ -38,23 +45,18 @@ pub mod pallet { } impl AssignmentProvider> for Pallet { - fn session_core_count() -> u32 { - paras::Parachains::::decode_len().unwrap_or(0) as u32 - } - - fn pop_assignment_for_core( - core_idx: CoreIndex, - _concluded_para: Option, - ) -> Option { + fn pop_assignment_for_core(core_idx: CoreIndex) -> Option { >::parachains() .get(core_idx.0 as usize) .copied() - .map(|para_id| Assignment::new(para_id)) + .map(Assignment::Bulk) } + fn report_processed(_: Assignment) {} + /// Bulk assignment has no need to push the assignment back on a session change, /// this is a no-op in the case of a bulk assignment slot. - fn push_assignment_for_core(_: CoreIndex, _: Assignment) {} + fn push_back_assignment(_: Assignment) {} fn get_provider_config(_core_idx: CoreIndex) -> AssignmentProviderConfig> { AssignmentProviderConfig { @@ -65,4 +67,13 @@ impl AssignmentProvider> for Pallet { ttl: 10u32.into(), } } + + #[cfg(any(feature = "runtime-benchmarks", test))] + fn get_mock_assignment(_: CoreIndex, para_id: primitives::Id) -> Assignment { + Assignment::Bulk(para_id) + } + + fn session_core_count() -> u32 { + paras::Parachains::::decode_len().unwrap_or(0) as u32 + } } diff --git a/polkadot/runtime/parachains/src/assigner_parachains/mock_helpers.rs b/polkadot/runtime/parachains/src/assigner_parachains/mock_helpers.rs new file mode 100644 index 00000000000..e6e9fb074aa --- /dev/null +++ b/polkadot/runtime/parachains/src/assigner_parachains/mock_helpers.rs @@ -0,0 +1,83 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Helper functions for tests + +use crate::{ + mock::MockGenesisConfig, + paras::{ParaGenesisArgs, ParaKind}, +}; + +use primitives::{Balance, HeadData, ValidationCode}; +use sp_runtime::Perbill; + +fn default_genesis_config() -> MockGenesisConfig { + MockGenesisConfig { + configuration: crate::configuration::GenesisConfig { + config: crate::configuration::HostConfiguration { ..Default::default() }, + }, + ..Default::default() + } +} + +#[derive(Debug)] +pub struct GenesisConfigBuilder { + pub on_demand_cores: u32, + pub on_demand_base_fee: Balance, + pub on_demand_fee_variability: Perbill, + pub on_demand_max_queue_size: u32, + pub on_demand_target_queue_utilization: Perbill, + pub onboarded_on_demand_chains: Vec, +} + +impl Default for GenesisConfigBuilder { + fn default() -> Self { + Self { + on_demand_cores: 10, + on_demand_base_fee: 10_000, + on_demand_fee_variability: Perbill::from_percent(1), + on_demand_max_queue_size: 100, + on_demand_target_queue_utilization: Perbill::from_percent(25), + onboarded_on_demand_chains: vec![], + } + } +} + +impl GenesisConfigBuilder { + pub(super) fn build(self) -> MockGenesisConfig { + let mut genesis = default_genesis_config(); + let config = &mut genesis.configuration.config; + config.coretime_cores = self.on_demand_cores; + config.on_demand_base_fee = self.on_demand_base_fee; + config.on_demand_fee_variability = self.on_demand_fee_variability; + config.on_demand_queue_max_size = self.on_demand_max_queue_size; + config.on_demand_target_queue_utilization = self.on_demand_target_queue_utilization; + + let paras = &mut genesis.paras.paras; + for para_id in self.onboarded_on_demand_chains { + paras.push(( + para_id, + ParaGenesisArgs { + genesis_head: HeadData::from(vec![0u8]), + validation_code: ValidationCode::from(vec![0u8]), + para_kind: ParaKind::Parathread, + }, + )) + } + + genesis + } +} diff --git a/polkadot/runtime/parachains/src/assigner_parachains/tests.rs b/polkadot/runtime/parachains/src/assigner_parachains/tests.rs new file mode 100644 index 00000000000..a110686aaeb --- /dev/null +++ b/polkadot/runtime/parachains/src/assigner_parachains/tests.rs @@ -0,0 +1,112 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +use super::*; +use crate::{ + assigner_parachains::mock_helpers::GenesisConfigBuilder, + initializer::SessionChangeNotification, + mock::{ + new_test_ext, ParachainsAssigner, Paras, ParasShared, RuntimeOrigin, Scheduler, System, + }, + paras::{ParaGenesisArgs, ParaKind}, +}; +use frame_support::{assert_ok, pallet_prelude::*}; +use primitives::{BlockNumber, Id as ParaId, SessionIndex, ValidationCode}; +use sp_std::collections::btree_map::BTreeMap; + +fn schedule_blank_para(id: ParaId, parakind: ParaKind) { + let validation_code: ValidationCode = vec![1, 2, 3].into(); + assert_ok!(Paras::schedule_para_initialize( + id, + ParaGenesisArgs { + genesis_head: Vec::new().into(), + validation_code: validation_code.clone(), + para_kind: parakind, + } + )); + + assert_ok!(Paras::add_trusted_validation_code(RuntimeOrigin::root(), validation_code)); +} + +fn run_to_block( + to: BlockNumber, + new_session: impl Fn(BlockNumber) -> Option>, +) { + while System::block_number() < to { + let b = System::block_number(); + + Scheduler::initializer_finalize(); + Paras::initializer_finalize(b); + + if let Some(notification) = new_session(b + 1) { + let mut notification_with_session_index = notification; + // We will make every session change trigger an action queue. Normally this may require + // 2 or more session changes. + if notification_with_session_index.session_index == SessionIndex::default() { + notification_with_session_index.session_index = ParasShared::scheduled_session(); + } + Paras::initializer_on_new_session(¬ification_with_session_index); + Scheduler::initializer_on_new_session(¬ification_with_session_index); + } + + System::on_finalize(b); + + System::on_initialize(b + 1); + System::set_block_number(b + 1); + + Paras::initializer_initialize(b + 1); + Scheduler::initializer_initialize(b + 1); + + // In the real runtime this is expected to be called by the `InclusionInherent` pallet. + Scheduler::free_cores_and_fill_claimqueue(BTreeMap::new(), b + 1); + } +} + +// This and the scheduler test schedule_schedules_including_just_freed together +// ensure that next_up_on_available and next_up_on_time_out will always be +// filled with scheduler claims for lease holding parachains. (Removes the need +// for two other scheduler tests) +#[test] +fn parachains_assigner_pop_assignment_is_always_some() { + let core_index = CoreIndex(0); + let para_id = ParaId::from(10); + let expected_assignment = Assignment::Bulk(para_id); + + new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { + // Register the para_id as a lease holding parachain + schedule_blank_para(para_id, ParaKind::Parachain); + + assert!(!Paras::is_parachain(para_id)); + run_to_block(10, |n| if n == 10 { Some(Default::default()) } else { None }); + assert!(Paras::is_parachain(para_id)); + + for _ in 0..20 { + assert!( + ParachainsAssigner::pop_assignment_for_core(core_index) == + Some(expected_assignment.clone()) + ); + } + + run_to_block(20, |n| if n == 20 { Some(Default::default()) } else { None }); + + for _ in 0..20 { + assert!( + ParachainsAssigner::pop_assignment_for_core(core_index) == + Some(expected_assignment.clone()) + ); + } + }); +} diff --git a/polkadot/runtime/parachains/src/builder.rs b/polkadot/runtime/parachains/src/builder.rs index 23916bbdc8a..016b3fca589 100644 --- a/polkadot/runtime/parachains/src/builder.rs +++ b/polkadot/runtime/parachains/src/builder.rs @@ -20,7 +20,7 @@ use crate::{ paras_inherent, scheduler::{ self, - common::{Assignment, AssignmentProviderConfig}, + common::{AssignmentProvider, AssignmentProviderConfig}, CoreOccupied, ParasEntry, }, session_info, shared, @@ -96,6 +96,8 @@ pub(crate) struct BenchBuilder { /// Make every candidate include a code upgrade by setting this to `Some` where the interior /// value is the byte length of the new code. code_upgrade: Option, + /// Specifies whether the claimqueue should be filled. + fill_claimqueue: bool, _phantom: sp_std::marker::PhantomData, } @@ -122,6 +124,7 @@ impl BenchBuilder { dispute_sessions: Default::default(), backed_and_concluding_cores: Default::default(), code_upgrade: None, + fill_claimqueue: true, _phantom: sp_std::marker::PhantomData::, } } @@ -225,6 +228,13 @@ impl BenchBuilder { self.max_validators() / self.max_validators_per_core() } + /// Set whether the claim queue should be filled. + #[cfg(not(feature = "runtime-benchmarks"))] + pub(crate) fn set_fill_claimqueue(mut self, f: bool) -> Self { + self.fill_claimqueue = f; + self + } + /// Get the minimum number of validity votes in order for a backed candidate to be included. #[cfg(feature = "runtime-benchmarks")] pub(crate) fn fallback_min_validity_votes() -> u32 { @@ -643,7 +653,7 @@ impl BenchBuilder { }) .collect(); - DisputeStatementSet { candidate_hash: candidate_hash, session, statements } + DisputeStatementSet { candidate_hash, session, statements } }) .collect() } @@ -663,14 +673,18 @@ impl BenchBuilder { inclusion::PendingAvailability::::remove_all(None); // We don't allow a core to have both disputes and be marked fully available at this block. - let cores = self.max_cores(); + let max_cores = self.max_cores(); let used_cores = (self.dispute_sessions.len() + self.backed_and_concluding_cores.len()) as u32; - assert!(used_cores <= cores); + assert!(used_cores <= max_cores); + let fill_claimqueue = self.fill_claimqueue; // NOTE: there is an n+2 session delay for these actions to take effect. // We are currently in Session 0, so these changes will take effect in Session 2. Self::setup_para_ids(used_cores); + configuration::ActiveConfig::::mutate(|c| { + c.coretime_cores = used_cores; + }); let validator_ids = Self::generate_validator_pairs(self.max_validators()); let target_session = SessionIndex::from(self.target_session); @@ -702,13 +716,33 @@ impl BenchBuilder { .map(|i| { let AssignmentProviderConfig { ttl, .. } = scheduler::Pallet::::assignment_provider_config(CoreIndex(i)); - CoreOccupied::Paras(ParasEntry::new( - Assignment::new(ParaId::from(i as u32)), - now + ttl, - )) + // Load an assignment into provider so that one is present to pop + let assignment = ::AssignmentProvider::get_mock_assignment( + CoreIndex(i), + ParaId::from(i), + ); + CoreOccupied::Paras(ParasEntry::new(assignment, now + ttl)) }) .collect(); scheduler::AvailabilityCores::::set(cores); + if fill_claimqueue { + // Add items to claim queue as well: + let cores = (0..used_cores) + .into_iter() + .map(|i| { + let AssignmentProviderConfig { ttl, .. } = + scheduler::Pallet::::assignment_provider_config(CoreIndex(i)); + // Load an assignment into provider so that one is present to pop + let assignment = + ::AssignmentProvider::get_mock_assignment( + CoreIndex(i), + ParaId::from(i), + ); + (CoreIndex(i), [ParasEntry::new(assignment, now + ttl)].into()) + }) + .collect(); + scheduler::ClaimQueue::::set(cores); + } Bench:: { data: ParachainsInherentData { diff --git a/polkadot/runtime/parachains/src/configuration.rs b/polkadot/runtime/parachains/src/configuration.rs index 272c227dfef..4619313590e 100644 --- a/polkadot/runtime/parachains/src/configuration.rs +++ b/polkadot/runtime/parachains/src/configuration.rs @@ -172,8 +172,8 @@ pub struct HostConfiguration { /// How long to keep code on-chain, in blocks. This should be sufficiently long that disputes /// have concluded. pub code_retention_period: BlockNumber, - /// The amount of execution cores to dedicate to on demand execution. - pub on_demand_cores: u32, + /// How many cores are managed by the coretime chain. + pub coretime_cores: u32, /// The number of retries that a on demand author has to submit their block. pub on_demand_retries: u32, /// The maximum queue size of the pay as you go module. @@ -284,7 +284,7 @@ impl> Default for HostConfiguration, new: u32) -> DispatchResult { + pub fn set_coretime_cores(origin: OriginFor, new: u32) -> DispatchResult { ensure_root(origin)?; - Self::schedule_config_update(|config| { - config.on_demand_cores = new; - }) + Self::set_coretime_cores_unchecked(new) } /// Set the number of retries for a particular on demand. @@ -1245,6 +1246,17 @@ pub mod pallet { } } + impl Pallet { + /// Set coretime cores. + /// + /// To be used if authorization is checked otherwise. + pub fn set_coretime_cores_unchecked(new: u32) -> DispatchResult { + Self::schedule_config_update(|config| { + config.coretime_cores = new; + }) + } + } + #[pallet::hooks] impl Hooks> for Pallet { fn integrity_test() { diff --git a/polkadot/runtime/parachains/src/configuration/migration/v11.rs b/polkadot/runtime/parachains/src/configuration/migration/v11.rs index b7dec7070f9..f4db9196b1a 100644 --- a/polkadot/runtime/parachains/src/configuration/migration/v11.rs +++ b/polkadot/runtime/parachains/src/configuration/migration/v11.rs @@ -126,7 +126,7 @@ hrmp_max_parachain_inbound_channels : pre.hrmp_max_parachain_inbound_channe hrmp_max_parachain_outbound_channels : pre.hrmp_max_parachain_outbound_channels, hrmp_channel_max_message_size : pre.hrmp_channel_max_message_size, code_retention_period : pre.code_retention_period, -on_demand_cores : pre.on_demand_cores, +coretime_cores : pre.on_demand_cores, on_demand_retries : pre.on_demand_retries, group_rotation_frequency : pre.group_rotation_frequency, paras_availability_period : pre.paras_availability_period, @@ -222,7 +222,7 @@ mod tests { assert_eq!(v11.n_delay_tranches, 25); assert_eq!(v11.minimum_validation_upgrade_delay, 5); assert_eq!(v11.group_rotation_frequency, 20); - assert_eq!(v11.on_demand_cores, 0); + assert_eq!(v11.coretime_cores, 0); assert_eq!(v11.on_demand_base_fee, 10_000_000); assert_eq!(v11.minimum_backing_votes, LEGACY_MIN_BACKING_VOTES); assert_eq!(v11.approval_voting_params.max_approval_coalesce_count, 1); @@ -286,7 +286,7 @@ mod tests { assert_eq!(v10.hrmp_max_parachain_inbound_channels , v11.hrmp_max_parachain_inbound_channels); assert_eq!(v10.hrmp_channel_max_message_size , v11.hrmp_channel_max_message_size); assert_eq!(v10.code_retention_period , v11.code_retention_period); - assert_eq!(v10.on_demand_cores , v11.on_demand_cores); + assert_eq!(v10.coretime_cores , v11.coretime_cores); assert_eq!(v10.on_demand_retries , v11.on_demand_retries); assert_eq!(v10.group_rotation_frequency , v11.group_rotation_frequency); assert_eq!(v10.paras_availability_period , v11.paras_availability_period); diff --git a/polkadot/runtime/parachains/src/configuration/tests.rs b/polkadot/runtime/parachains/src/configuration/tests.rs index d88572d3b55..c915eb12a0c 100644 --- a/polkadot/runtime/parachains/src/configuration/tests.rs +++ b/polkadot/runtime/parachains/src/configuration/tests.rs @@ -283,7 +283,7 @@ fn setting_pending_config_members() { max_code_size: 100_000, max_pov_size: 1024, max_head_data_size: 1_000, - on_demand_cores: 2, + coretime_cores: 2, on_demand_retries: 5, group_rotation_frequency: 20, paras_availability_period: 10, @@ -342,7 +342,7 @@ fn setting_pending_config_members() { Configuration::set_max_pov_size(RuntimeOrigin::root(), new_config.max_pov_size).unwrap(); Configuration::set_max_head_data_size(RuntimeOrigin::root(), new_config.max_head_data_size) .unwrap(); - Configuration::set_on_demand_cores(RuntimeOrigin::root(), new_config.on_demand_cores) + Configuration::set_coretime_cores(RuntimeOrigin::root(), new_config.coretime_cores) .unwrap(); Configuration::set_on_demand_retries(RuntimeOrigin::root(), new_config.on_demand_retries) .unwrap(); diff --git a/polkadot/runtime/parachains/src/coretime/benchmarking.rs b/polkadot/runtime/parachains/src/coretime/benchmarking.rs new file mode 100644 index 00000000000..d1ac71f580e --- /dev/null +++ b/polkadot/runtime/parachains/src/coretime/benchmarking.rs @@ -0,0 +1,73 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! On demand assigner pallet benchmarking. + +#![cfg(feature = "runtime-benchmarks")] + +use super::*; +use frame_benchmarking::v2::*; +use frame_support::traits::OriginTrait; +use pallet_broker::CoreIndex as BrokerCoreIndex; + +#[benchmarks] +mod benchmarks { + use super::*; + use assigner_coretime::PartsOf57600; + + #[benchmark] + fn request_core_count() { + // Setup + let root_origin = ::RuntimeOrigin::root(); + + #[extrinsic_call] + _( + root_origin as ::RuntimeOrigin, + // random core count + 100, + ) + } + + #[benchmark] + fn assign_core(s: Linear<1, 100>) { + // Setup + let root_origin = ::RuntimeOrigin::root(); + + // Use parameterized assignment count + let mut assignments: Vec<(CoreAssignment, PartsOf57600)> = vec![0u16; s as usize - 1] + .into_iter() + .enumerate() + .map(|(index, parts)| { + (CoreAssignment::Task(index as u32), PartsOf57600::new_saturating(parts)) + }) + .collect(); + // Parts must add up to exactly 57600. Here we add all the parts in one assignment, as + // it won't effect the weight and splitting up the parts into even groupings may not + // work for every value `s`. + assignments.push((CoreAssignment::Task(s as u32), PartsOf57600::FULL)); + + let core_index: BrokerCoreIndex = 0; + + #[extrinsic_call] + _( + root_origin as ::RuntimeOrigin, + core_index, + BlockNumberFor::::from(5u32), + assignments, + Some(BlockNumberFor::::from(20u32)), + ) + } +} diff --git a/polkadot/runtime/parachains/src/coretime/migration.rs b/polkadot/runtime/parachains/src/coretime/migration.rs new file mode 100644 index 00000000000..64c10f73198 --- /dev/null +++ b/polkadot/runtime/parachains/src/coretime/migration.rs @@ -0,0 +1,285 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Migrations for the Coretime pallet. + +pub use v_coretime::{GetLegacyLease, MigrateToCoretime}; + +mod v_coretime { + #[cfg(feature = "try-runtime")] + use crate::scheduler::common::AssignmentProvider; + use crate::{ + assigner_coretime, configuration, + coretime::{mk_coretime_call, Config, PartsOf57600, WeightInfo}, + paras, + }; + #[cfg(feature = "try-runtime")] + use frame_support::ensure; + use frame_support::{ + traits::{OnRuntimeUpgrade, PalletInfoAccess, StorageVersion}, + weights::Weight, + }; + use frame_system::pallet_prelude::BlockNumberFor; + use pallet_broker::{CoreAssignment, CoreMask, ScheduleItem}; + #[cfg(feature = "try-runtime")] + use parity_scale_codec::Decode; + #[cfg(feature = "try-runtime")] + use parity_scale_codec::Encode; + use polkadot_parachain_primitives::primitives::IsSystem; + use primitives::{CoreIndex, Id as ParaId}; + use sp_arithmetic::traits::SaturatedConversion; + use sp_core::Get; + use sp_runtime::BoundedVec; + #[cfg(feature = "try-runtime")] + use sp_std::vec::Vec; + use sp_std::{iter, prelude::*, result}; + use xcm::v3::{ + send_xcm, Instruction, Junction, Junctions, MultiLocation, SendError, WeightLimit, Xcm, + }; + + /// Return information about a legacy lease of a parachain. + pub trait GetLegacyLease { + /// If parachain is a lease holding parachain, return the block at which the lease expires. + fn get_parachain_lease_in_blocks(para: ParaId) -> Option; + } + + /// Migrate a chain to use coretime. + /// + /// This assumes that the `Coretime` and the `AssignerCoretime` pallets are added at the same + /// time to a runtime. + pub struct MigrateToCoretime( + sp_std::marker::PhantomData<(T, SendXcm, LegacyLease)>, + ); + + impl>> + MigrateToCoretime + { + fn already_migrated() -> bool { + // We are using the assigner coretime because the coretime pallet doesn't has any + // storage data. But both pallets are introduced at the same time, so this is fine. + let name_hash = assigner_coretime::Pallet::::name_hash(); + let mut next_key = name_hash.to_vec(); + let storage_version_key = StorageVersion::storage_key::>(); + + loop { + match sp_io::storage::next_key(&next_key) { + // StorageVersion is initialized before, so we need to ingore it. + Some(key) if &key == &storage_version_key => { + next_key = key; + }, + // If there is any other key with the prefix of the pallet, + // we already have executed the migration. + Some(key) if key.starts_with(&name_hash) => { + log::info!("`MigrateToCoretime` already executed!"); + return true + }, + // Any other key/no key means that we did not yet have migrated. + None | Some(_) => return false, + } + } + } + } + + impl< + T: Config + crate::dmp::Config, + SendXcm: xcm::v3::SendXcm, + LegacyLease: GetLegacyLease>, + > OnRuntimeUpgrade for MigrateToCoretime + { + fn on_runtime_upgrade() -> Weight { + if Self::already_migrated() { + return Weight::zero() + } + + log::info!("Migrating existing parachains to coretime."); + migrate_to_coretime::() + } + + #[cfg(feature = "try-runtime")] + fn pre_upgrade() -> Result, sp_runtime::DispatchError> { + if Self::already_migrated() { + return Ok(Vec::new()) + } + + let legacy_paras = paras::Parachains::::get(); + let config = >::config(); + let total_core_count = config.coretime_cores + legacy_paras.len() as u32; + + let dmp_queue_size = + crate::dmp::Pallet::::dmq_contents(T::BrokerId::get().into()).len() as u32; + + let total_core_count = total_core_count as u32; + + Ok((total_core_count, dmp_queue_size).encode()) + } + + #[cfg(feature = "try-runtime")] + fn post_upgrade(state: Vec) -> Result<(), sp_runtime::DispatchError> { + if state.is_empty() { + return Ok(()) + } + + log::trace!("Running post_upgrade()"); + + let (prev_core_count, prev_dmp_queue_size) = + <(u32, u32)>::decode(&mut &state[..]).unwrap(); + + let dmp_queue_size = + crate::dmp::Pallet::::dmq_contents(T::BrokerId::get().into()).len() as u32; + let new_core_count = assigner_coretime::Pallet::::session_core_count(); + ensure!(new_core_count == prev_core_count, "Total number of cores need to not change."); + ensure!( + dmp_queue_size == prev_dmp_queue_size + 1, + "There should have been enqueued one DMP message." + ); + + Ok(()) + } + } + + // Migrate to Coretime. + // + // NOTE: Also migrates coretime_cores config value in configuration::ActiveConfig. + fn migrate_to_coretime< + T: Config, + SendXcm: xcm::v3::SendXcm, + LegacyLease: GetLegacyLease>, + >() -> Weight { + let legacy_paras = paras::Pallet::::parachains(); + let legacy_count = legacy_paras.len() as u32; + let now = >::block_number(); + for (core, para_id) in legacy_paras.into_iter().enumerate() { + let r = assigner_coretime::Pallet::::assign_core( + CoreIndex(core as u32), + now, + vec![(CoreAssignment::Task(para_id.into()), PartsOf57600::FULL)], + None, + ); + if let Err(err) = r { + log::error!( + "Creating assignment for existing para failed: {:?}, error: {:?}", + para_id, + err + ); + } + } + + let config = >::config(); + // coretime_cores was on_demand_cores until now: + for on_demand in 0..config.coretime_cores { + let core = CoreIndex(legacy_count.saturating_add(on_demand as _)); + let r = assigner_coretime::Pallet::::assign_core( + core, + now, + vec![(CoreAssignment::Pool, PartsOf57600::FULL)], + None, + ); + if let Err(err) = r { + log::error!("Creating assignment for existing on-demand core, failed: {:?}", err); + } + } + let total_cores = config.coretime_cores + legacy_count; + configuration::ActiveConfig::::mutate(|c| { + c.coretime_cores = total_cores; + }); + + if let Err(err) = migrate_send_assignments_to_coretime_chain::() { + log::error!("Sending legacy chain data to coretime chain failed: {:?}", err); + } + + let single_weight = ::WeightInfo::assign_core(1); + single_weight + .saturating_mul(u64::from(legacy_count.saturating_add(config.coretime_cores))) + // Second read from sending assignments to the coretime chain. + .saturating_add(T::DbWeight::get().reads_writes(2, 1)) + } + + fn migrate_send_assignments_to_coretime_chain< + T: Config, + SendXcm: xcm::v3::SendXcm, + LegacyLease: GetLegacyLease>, + >() -> result::Result<(), SendError> { + let legacy_paras = paras::Pallet::::parachains(); + let legacy_paras_count = legacy_paras.len(); + let (system_chains, lease_holding): (Vec<_>, Vec<_>) = + legacy_paras.into_iter().partition(IsSystem::is_system); + + let reservations = system_chains.into_iter().map(|p| { + let schedule = BoundedVec::truncate_from(vec![ScheduleItem { + mask: CoreMask::complete(), + assignment: CoreAssignment::Task(p.into()), + }]); + mk_coretime_call(crate::coretime::CoretimeCalls::Reserve(schedule)) + }); + + let leases = lease_holding.into_iter().filter_map(|p| { + log::trace!(target: "coretime-migration", "Preparing sending of lease holding para {:?}", p); + let Some(valid_until) = LegacyLease::get_parachain_lease_in_blocks(p) else { + log::error!("Lease holding chain with no lease information?!"); + return None + }; + let valid_until: u32 = match valid_until.try_into() { + Ok(val) => val, + Err(_) => { + log::error!("Converting block number to u32 failed!"); + return None + }, + }; + // We assume the coretime chain set this parameter to the recommened value in RFC-1: + const TIME_SLICE_PERIOD: u32 = 80; + let round_up = if valid_until % TIME_SLICE_PERIOD > 0 { 1 } else { 0 }; + let time_slice = valid_until / TIME_SLICE_PERIOD + TIME_SLICE_PERIOD * round_up; + log::trace!(target: "coretime-migration", "Sending of lease holding para {:?}, valid_until: {:?}, time_slice: {:?}", p, valid_until, time_slice); + Some(mk_coretime_call(crate::coretime::CoretimeCalls::SetLease(p.into(), time_slice))) + }); + + let core_count: u16 = configuration::Pallet::::config().coretime_cores.saturated_into(); + let set_core_count = iter::once(mk_coretime_call( + crate::coretime::CoretimeCalls::NotifyCoreCount(core_count), + )); + + let pool = (legacy_paras_count..core_count.into()).map(|_| { + let schedule = BoundedVec::truncate_from(vec![ScheduleItem { + mask: CoreMask::complete(), + assignment: CoreAssignment::Pool, + }]); + // Reserved cores will come before lease cores, so cores will change their assignments + // when coretime chain sends us their assign_core calls -> Good test. + mk_coretime_call(crate::coretime::CoretimeCalls::Reserve(schedule)) + }); + + let message_content = iter::once(Instruction::UnpaidExecution { + weight_limit: WeightLimit::Unlimited, + check_origin: None, + }) + .chain(reservations) + .chain(pool) + .chain(leases) + .chain(set_core_count) + .collect(); + + let message = Xcm(message_content); + + send_xcm::( + MultiLocation { + parents: 0, + interior: Junctions::X1(Junction::Parachain(T::BrokerId::get())), + }, + message, + )?; + Ok(()) + } +} diff --git a/polkadot/runtime/parachains/src/coretime/mod.rs b/polkadot/runtime/parachains/src/coretime/mod.rs new file mode 100644 index 00000000000..d5b044c0631 --- /dev/null +++ b/polkadot/runtime/parachains/src/coretime/mod.rs @@ -0,0 +1,251 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Extrinsics implementing the relay chain side of the Coretime interface. +//! +//! + +use sp_std::{prelude::*, result}; + +use frame_support::{pallet_prelude::*, traits::Currency}; +use frame_system::pallet_prelude::*; +pub use pallet::*; +use pallet_broker::{CoreAssignment, CoreIndex as BrokerCoreIndex}; +use primitives::{CoreIndex, Id as ParaId}; +use sp_arithmetic::traits::SaturatedConversion; +use xcm::v3::{ + send_xcm, Instruction, Junction, Junctions, MultiLocation, OriginKind, SendXcm, Xcm, +}; + +use crate::{ + assigner_coretime::{self, PartsOf57600}, + initializer::{OnNewSession, SessionChangeNotification}, + origin::{ensure_parachain, Origin}, +}; + +mod benchmarking; +pub mod migration; + +pub trait WeightInfo { + fn request_core_count() -> Weight; + //fn request_revenue_info_at() -> Weight; + //fn credit_account() -> Weight; + fn assign_core(s: u32) -> Weight; +} + +/// A weight info that is only suitable for testing. +pub struct TestWeightInfo; + +impl WeightInfo for TestWeightInfo { + fn request_core_count() -> Weight { + Weight::MAX + } + // TODO: Add real benchmarking functionality for each of these to + // benchmarking.rs, then uncomment here and in trait definition. + /*fn request_revenue_info_at() -> Weight { + Weight::MAX + } + fn credit_account() -> Weight { + Weight::MAX + }*/ + fn assign_core(_s: u32) -> Weight { + Weight::MAX + } +} + +/// Broker pallet index on the coretime chain. Used to +/// +/// construct remote calls. The codec index must correspond to the index of `Broker` in the +/// `construct_runtime` of the coretime chain. +#[derive(Encode, Decode)] +enum BrokerRuntimePallets { + #[codec(index = 50)] + Broker(CoretimeCalls), +} + +/// Call encoding for the calls needed from the Broker pallet. +#[derive(Encode, Decode)] +enum CoretimeCalls { + #[codec(index = 1)] + Reserve(pallet_broker::Schedule), + #[codec(index = 3)] + SetLease(pallet_broker::TaskId, pallet_broker::Timeslice), + #[codec(index = 19)] + NotifyCoreCount(u16), +} + +#[frame_support::pallet] +pub mod pallet { + use crate::configuration; + + use super::*; + + #[pallet::pallet] + #[pallet::without_storage_info] + pub struct Pallet(_); + + #[pallet::config] + pub trait Config: frame_system::Config + assigner_coretime::Config { + type RuntimeOrigin: From<::RuntimeOrigin> + + Into::RuntimeOrigin>>; + type RuntimeEvent: From> + IsType<::RuntimeEvent>; + /// The runtime's definition of a Currency. + type Currency: Currency; + /// The ParaId of the broker system parachain. + #[pallet::constant] + type BrokerId: Get; + /// Something that provides the weight of this pallet. + type WeightInfo: WeightInfo; + type SendXcm: SendXcm; + } + + #[pallet::event] + #[pallet::generate_deposit(pub(super) fn deposit_event)] + pub enum Event { + /// The broker chain has asked for revenue information for a specific block. + RevenueInfoRequested { when: BlockNumberFor }, + /// A core has received a new assignment from the broker chain. + CoreAssigned { core: CoreIndex }, + } + + #[pallet::error] + pub enum Error { + /// The paraid making the call is not the coretime brokerage system parachain. + NotBroker, + } + + #[pallet::hooks] + impl Hooks> for Pallet {} + + #[pallet::call] + impl Pallet { + #[pallet::weight(::WeightInfo::request_core_count())] + #[pallet::call_index(1)] + pub fn request_core_count(origin: OriginFor, count: u16) -> DispatchResult { + // Ignore requests not coming from the broker parachain or root. + Self::ensure_root_or_para(origin, ::BrokerId::get().into())?; + + configuration::Pallet::::set_coretime_cores_unchecked(u32::from(count)) + } + + //// TODO Impl me! + ////#[pallet::weight(::WeightInfo::request_revenue_info_at())] + //#[pallet::call_index(2)] + //pub fn request_revenue_info_at( + // origin: OriginFor, + // _when: BlockNumberFor, + //) -> DispatchResult { + // // Ignore requests not coming from the broker parachain or root. + // Self::ensure_root_or_para(origin, ::BrokerId::get().into())?; + // Ok(()) + //} + + //// TODO Impl me! + ////#[pallet::weight(::WeightInfo::credit_account())] + //#[pallet::call_index(3)] + //pub fn credit_account( + // origin: OriginFor, + // _who: T::AccountId, + // _amount: BalanceOf, + //) -> DispatchResult { + // // Ignore requests not coming from the broker parachain or root. + // Self::ensure_root_or_para(origin, ::BrokerId::get().into())?; + // Ok(()) + //} + + /// Receive instructions from the `ExternalBrokerOrigin`, detailing how a specific core is + /// to be used. + /// + /// Parameters: + /// -`origin`: The `ExternalBrokerOrigin`, assumed to be the Broker system parachain. + /// -`core`: The core that should be scheduled. + /// -`begin`: The starting blockheight of the instruction. + /// -`assignment`: How the blockspace should be utilised. + /// -`end_hint`: An optional hint as to when this particular set of instructions will end. + // The broker pallet's `CoreIndex` definition is `u16` but on the relay chain it's `struct + // CoreIndex(u32)` + #[pallet::call_index(4)] + #[pallet::weight(::WeightInfo::assign_core(assignment.len() as u32))] + pub fn assign_core( + origin: OriginFor, + core: BrokerCoreIndex, + begin: BlockNumberFor, + assignment: Vec<(CoreAssignment, PartsOf57600)>, + end_hint: Option>, + ) -> DispatchResult { + // Ignore requests not coming from the broker parachain or root. + Self::ensure_root_or_para(origin, T::BrokerId::get().into())?; + + let core = u32::from(core).into(); + + >::assign_core(core, begin, assignment, end_hint)?; + Self::deposit_event(Event::::CoreAssigned { core }); + Ok(()) + } + } +} + +impl Pallet { + /// Ensure the origin is one of Root or the `para` itself. + fn ensure_root_or_para( + origin: ::RuntimeOrigin, + id: ParaId, + ) -> DispatchResult { + if let Ok(caller_id) = ensure_parachain(::RuntimeOrigin::from(origin.clone())) + { + // Check if matching para id... + ensure!(caller_id == id, Error::::NotBroker); + } else { + // Check if root... + ensure_root(origin.clone())?; + } + Ok(()) + } + + pub fn initializer_on_new_session(notification: &SessionChangeNotification>) { + let old_core_count = notification.prev_config.coretime_cores; + let new_core_count = notification.new_config.coretime_cores; + if new_core_count != old_core_count { + let core_count: u16 = new_core_count.saturated_into(); + let message = Xcm(vec![mk_coretime_call( + crate::coretime::CoretimeCalls::NotifyCoreCount(core_count), + )]); + if let Err(err) = send_xcm::( + MultiLocation { + parents: 0, + interior: Junctions::X1(Junction::Parachain(T::BrokerId::get())), + }, + message, + ) { + log::error!("Sending `NotifyCoreCount` to coretime chain failed: {:?}", err); + } + } + } +} + +impl OnNewSession> for Pallet { + fn on_new_session(notification: &SessionChangeNotification>) { + Self::initializer_on_new_session(notification); + } +} + +fn mk_coretime_call(call: crate::coretime::CoretimeCalls) -> Instruction<()> { + Instruction::Transact { + origin_kind: OriginKind::Native, + require_weight_at_most: Weight::from_parts(1000000000, 200000), + call: BrokerRuntimePallets::Broker(call).encode().into(), + } +} diff --git a/polkadot/runtime/parachains/src/inclusion/tests.rs b/polkadot/runtime/parachains/src/inclusion/tests.rs index 6bb731671f6..232e65d78ed 100644 --- a/polkadot/runtime/parachains/src/inclusion/tests.rs +++ b/polkadot/runtime/parachains/src/inclusion/tests.rs @@ -47,7 +47,7 @@ use test_helpers::{dummy_collator, dummy_collator_signature, dummy_validation_co fn default_config() -> HostConfiguration { let mut config = HostConfiguration::default(); - config.on_demand_cores = 1; + config.coretime_cores = 1; config.max_code_size = 0b100000; config.max_head_data_size = 0b100000; config.group_rotation_frequency = u32::MAX; @@ -218,7 +218,7 @@ pub(crate) fn run_to_block( } pub(crate) fn expected_bits() -> usize { - Paras::parachains().len() + Configuration::config().on_demand_cores as usize + Paras::parachains().len() + Configuration::config().coretime_cores as usize } fn default_bitfield() -> AvailabilityBitfield { diff --git a/polkadot/runtime/parachains/src/initializer.rs b/polkadot/runtime/parachains/src/initializer.rs index b4f8721be51..3c8ab7c4726 100644 --- a/polkadot/runtime/parachains/src/initializer.rs +++ b/polkadot/runtime/parachains/src/initializer.rs @@ -60,6 +60,16 @@ pub struct SessionChangeNotification { pub session_index: SessionIndex, } +/// Inform something about a new session. +pub trait OnNewSession { + /// A new session was started. + fn on_new_session(notification: &SessionChangeNotification); +} + +impl OnNewSession for () { + fn on_new_session(_: &SessionChangeNotification) {} +} + /// Number of validators (not only parachain) in a session. pub type ValidatorSetCount = u32; @@ -120,6 +130,10 @@ pub mod pallet { type Randomness: Randomness>; /// An origin which is allowed to force updates to parachains. type ForceOrigin: EnsureOrigin<::RuntimeOrigin>; + /// Temporary hack to call `Coretime::on_new_session` on chains that support `Coretime` or + /// to disable it on the ones that don't support it. Can be removed and replaced by a simple + /// bound to `coretime::Config` once all chains support it. + type CoretimeOnNewSession: OnNewSession>; /// Weight information for extrinsics in this pallet. type WeightInfo: WeightInfo; } @@ -271,6 +285,7 @@ impl Pallet { T::SlashingHandler::initializer_on_new_session(session_index); dmp::Pallet::::initializer_on_new_session(¬ification, &outgoing_paras); hrmp::Pallet::::initializer_on_new_session(¬ification, &outgoing_paras); + T::CoretimeOnNewSession::on_new_session(¬ification); } /// Should be called when a new session occurs. Buffers the session notification to be applied diff --git a/polkadot/runtime/parachains/src/lib.rs b/polkadot/runtime/parachains/src/lib.rs index 2509edbee3c..b0dc27b7286 100644 --- a/polkadot/runtime/parachains/src/lib.rs +++ b/polkadot/runtime/parachains/src/lib.rs @@ -23,10 +23,11 @@ #![cfg_attr(feature = "runtime-benchmarks", recursion_limit = "256")] #![cfg_attr(not(feature = "std"), no_std)] -pub mod assigner; +pub mod assigner_coretime; pub mod assigner_on_demand; pub mod assigner_parachains; pub mod configuration; +pub mod coretime; pub mod disputes; pub mod dmp; pub mod hrmp; diff --git a/polkadot/runtime/parachains/src/mock.rs b/polkadot/runtime/parachains/src/mock.rs index 222942922f9..fbaab1d24aa 100644 --- a/polkadot/runtime/parachains/src/mock.rs +++ b/polkadot/runtime/parachains/src/mock.rs @@ -17,12 +17,17 @@ //! Mocks for all the traits. use crate::{ - assigner, assigner_on_demand, assigner_parachains, configuration, disputes, dmp, hrmp, + assigner_coretime, assigner_on_demand, assigner_parachains, configuration, coretime, disputes, + dmp, hrmp, inclusion::{self, AggregateMessageOrigin, UmpQueueId}, initializer, origin, paras, paras::ParaKind, - paras_inherent, scheduler, session_info, shared, ParaId, + paras_inherent, scheduler, + scheduler::common::{AssignmentProvider, AssignmentProviderConfig}, + session_info, shared, ParaId, }; +use frame_support::pallet_prelude::*; +use primitives::CoreIndex; use frame_support::{ assert_ok, derive_impl, parameter_types, @@ -45,7 +50,9 @@ use sp_runtime::{ transaction_validity::TransactionPriority, BuildStorage, FixedU128, Perbill, Permill, }; +use sp_std::collections::vec_deque::VecDeque; use std::{cell::RefCell, collections::HashMap}; +use xcm::v3::{MultiAssets, MultiLocation, SendError, SendResult, SendXcm, Xcm, XcmHash}; type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; type Block = frame_system::mocking::MockBlockU32; @@ -62,9 +69,11 @@ frame_support::construct_runtime!( ParaInclusion: inclusion, ParaInherent: paras_inherent, Scheduler: scheduler, - Assigner: assigner, - OnDemandAssigner: assigner_on_demand, + MockAssigner: mock_assigner, ParachainsAssigner: assigner_parachains, + OnDemandAssigner: assigner_on_demand, + CoretimeAssigner: assigner_coretime, + Coretime: coretime, Initializer: initializer, Dmp: dmp, Hrmp: hrmp, @@ -178,6 +187,7 @@ impl crate::initializer::Config for Test { type Randomness = TestRandomness; type ForceOrigin = frame_system::EnsureRoot; type WeightInfo = (); + type CoretimeOnNewSession = Coretime; } impl crate::configuration::Config for Test { @@ -217,6 +227,7 @@ impl crate::paras::Config for Test { type QueueFootprinter = ParaInclusion; type NextSessionRotation = TestNextSessionRotation; type OnNewHead = (); + type AssignCoretime = (); } impl crate::dmp::Config for Test {} @@ -288,7 +299,7 @@ impl crate::disputes::SlashingHandler for Test { } impl crate::scheduler::Config for Test { - type AssignmentProvider = Assigner; + type AssignmentProvider = MockAssigner; } pub struct TestMessageQueueWeight; @@ -342,17 +353,12 @@ impl pallet_message_queue::Config for Test { type ServiceWeight = MessageQueueServiceWeight; } -impl assigner::Config for Test { - type ParachainsAssignmentProvider = ParachainsAssigner; - type OnDemandAssignmentProvider = OnDemandAssigner; -} - -impl assigner_parachains::Config for Test {} - parameter_types! { pub const OnDemandTrafficDefaultValue: FixedU128 = FixedU128::from_u32(1); } +impl assigner_parachains::Config for Test {} + impl assigner_on_demand::Config for Test { type RuntimeEvent = RuntimeEvent; type Currency = Balances; @@ -360,6 +366,37 @@ impl assigner_on_demand::Config for Test { type WeightInfo = crate::assigner_on_demand::TestWeightInfo; } +impl assigner_coretime::Config for Test {} + +parameter_types! { + pub const BrokerId: u32 = 10u32; +} + +impl coretime::Config for Test { + type RuntimeOrigin = RuntimeOrigin; + type RuntimeEvent = RuntimeEvent; + type Currency = pallet_balances::Pallet; + type BrokerId = BrokerId; + type WeightInfo = crate::coretime::TestWeightInfo; + type SendXcm = DummyXcmSender; +} + +pub struct DummyXcmSender; +impl SendXcm for DummyXcmSender { + type Ticket = (); + fn validate( + _: &mut Option, + _: &mut Option>, + ) -> SendResult { + Ok(((), MultiAssets::new())) + } + + /// Actually carry out the delivery operation for a previously validated message sending. + fn deliver(_ticket: Self::Ticket) -> Result { + Ok([0u8; 32]) + } +} + impl crate::inclusion::Config for Test { type WeightInfo = (); type RuntimeEvent = RuntimeEvent; @@ -390,6 +427,104 @@ impl ValidatorSetWithIdentification for MockValidatorSet { type IdentificationOf = FoolIdentificationOf; } +/// A mock assigner which acts as the scheduler's `AssignmentProvider` for tests. The mock +/// assigner provides bare minimum functionality to test scheduler internals. Since they +/// have no direct effect on scheduler state, AssignmentProvider functions such as +/// `push_back_assignment` can be left empty. +pub mod mock_assigner { + use crate::scheduler::common::Assignment; + + use super::*; + pub use pallet::*; + + #[frame_support::pallet] + pub mod pallet { + use super::*; + + #[pallet::pallet] + #[pallet::without_storage_info] + pub struct Pallet(_); + + #[pallet::config] + pub trait Config: frame_system::Config + configuration::Config + paras::Config {} + + #[pallet::storage] + pub(super) type MockAssignmentQueue = + StorageValue<_, VecDeque, ValueQuery>; + + #[pallet::storage] + pub(super) type MockProviderConfig = + StorageValue<_, AssignmentProviderConfig, OptionQuery>; + + #[pallet::storage] + pub(super) type MockCoreCount = StorageValue<_, u32, OptionQuery>; + } + + impl Pallet { + /// Adds a claim to the `MockAssignmentQueue` this claim can later be popped by the + /// scheduler when filling the claim queue for tests. + pub fn add_test_assignment(assignment: Assignment) { + MockAssignmentQueue::::mutate(|queue| queue.push_back(assignment)); + } + + // This configuration needs to be customized to service `get_provider_config` in + // scheduler tests. + pub fn set_assignment_provider_config(config: AssignmentProviderConfig) { + MockProviderConfig::::set(Some(config)); + } + + // Allows for customized core count in scheduler tests, rather than a core count + // derived from on-demand config + parachain count. + pub fn set_core_count(count: u32) { + MockCoreCount::::set(Some(count)); + } + } + + impl AssignmentProvider for Pallet { + // With regards to popping_assignments, the scheduler just needs to be tested under + // the following two conditions: + // 1. An assignment is provided + // 2. No assignment is provided + // A simple assignment queue populated to fit each test fulfills these needs. + fn pop_assignment_for_core(_core_idx: CoreIndex) -> Option { + let mut queue: VecDeque = MockAssignmentQueue::::get(); + let front = queue.pop_front(); + // Write changes to storage. + MockAssignmentQueue::::set(queue); + front + } + + // We don't care about core affinity in the test assigner + fn report_processed(_assignment: Assignment) {} + + // The results of this are tested in assigner_on_demand tests. No need to represent it + // in the mock assigner. + fn push_back_assignment(_assignment: Assignment) {} + + // Gets the provider config we set earlier using `set_assignment_provider_config`, falling + // back to the on demand parachain configuration if none was set. + fn get_provider_config(_core_idx: CoreIndex) -> AssignmentProviderConfig { + match MockProviderConfig::::get() { + Some(config) => config, + None => AssignmentProviderConfig { + max_availability_timeouts: 1, + ttl: BlockNumber::from(5u32), + }, + } + } + #[cfg(any(feature = "runtime-benchmarks", test))] + fn get_mock_assignment(_: CoreIndex, para_id: ParaId) -> Assignment { + Assignment::Bulk(para_id) + } + + fn session_core_count() -> u32 { + MockCoreCount::::get().unwrap_or(5) + } + } +} + +impl mock_assigner::pallet::Config for Test {} + pub struct FoolIdentificationOf; impl sp_runtime::traits::Convert> for FoolIdentificationOf { fn convert(_: AccountId) -> Option<()> { diff --git a/polkadot/runtime/parachains/src/paras/mod.rs b/polkadot/runtime/parachains/src/paras/mod.rs index ef9dfedd735..e97df8e4a2b 100644 --- a/polkadot/runtime/parachains/src/paras/mod.rs +++ b/polkadot/runtime/parachains/src/paras/mod.rs @@ -506,6 +506,21 @@ impl OnNewHead for Tuple { } } +/// Assign coretime to some parachain. +/// +/// This assigns coretime to a parachain without using the coretime chain. Thus, this should only be +/// used for testing purposes. +pub trait AssignCoretime { + /// ONLY USE FOR TESTING OR GENESIS. + fn assign_coretime(id: ParaId) -> DispatchResult; +} + +impl AssignCoretime for () { + fn assign_coretime(_: ParaId) -> DispatchResult { + Ok(()) + } +} + pub trait WeightInfo { fn force_set_current_code(c: u32) -> Weight; fn force_set_current_head(s: u32) -> Weight; @@ -605,6 +620,13 @@ pub mod pallet { /// Weight information for extrinsics in this pallet. type WeightInfo: WeightInfo; + + /// Runtime hook for assigning coretime for a given parachain. + /// + /// This is only used at genesis or by root. + /// + /// TODO: Remove once coretime is the standard accross all chains. + type AssignCoretime: AssignCoretime; } #[pallet::event] @@ -838,6 +860,8 @@ pub mod pallet { panic!("empty validation code is not allowed in genesis"); } Pallet::::initialize_para_now(&mut parachains, *id, genesis_args); + T::AssignCoretime::assign_coretime(*id) + .expect("Assigning coretime works at genesis; qed"); } // parachains are flushed on drop } diff --git a/polkadot/runtime/parachains/src/paras_inherent/benchmarking.rs b/polkadot/runtime/parachains/src/paras_inherent/benchmarking.rs index 4509c5c3cc7..0f6b23ae1b3 100644 --- a/polkadot/runtime/parachains/src/paras_inherent/benchmarking.rs +++ b/polkadot/runtime/parachains/src/paras_inherent/benchmarking.rs @@ -18,7 +18,9 @@ use super::*; use crate::{inclusion, ParaId}; use frame_benchmarking::{benchmarks, impl_benchmark_test_suite}; use frame_system::RawOrigin; -use sp_std::collections::btree_map::BTreeMap; +use sp_std::{cmp::min, collections::btree_map::BTreeMap}; + +use primitives::v6::GroupIndex; use crate::builder::BenchBuilder; @@ -116,7 +118,9 @@ benchmarks! { // There is 1 backed, assert_eq!(benchmark.backed_candidates.len(), 1); // with `v` validity votes. - assert_eq!(benchmark.backed_candidates.get(0).unwrap().validity_votes.len(), v as usize); + // let votes = v as usize; + let votes = min(scheduler::Pallet::::group_validators(GroupIndex::from(0)).unwrap().len(), v as usize); + assert_eq!(benchmark.backed_candidates.get(0).unwrap().validity_votes.len(), votes); benchmark.bitfields.clear(); benchmark.disputes.clear(); @@ -138,7 +142,7 @@ benchmarks! { let descriptor = backing_validators.0.descriptor(); assert_eq!(ParaId::from(para_id), descriptor.para_id); assert_eq!(header.hash(), descriptor.relay_parent); - assert_eq!(backing_validators.1.len(), v as usize); + assert_eq!(backing_validators.1.len(), votes); } assert_eq!( @@ -167,11 +171,14 @@ benchmarks! { let mut benchmark = scenario.data.clone(); + // let votes = BenchBuilder::::fallback_min_validity_votes() as usize; + let votes = min(scheduler::Pallet::::group_validators(GroupIndex::from(0)).unwrap().len(), BenchBuilder::::fallback_min_validity_votes() as usize); + // There is 1 backed assert_eq!(benchmark.backed_candidates.len(), 1); assert_eq!( - benchmark.backed_candidates.get(0).unwrap().validity_votes.len() as u32, - BenchBuilder::::fallback_min_validity_votes() + benchmark.backed_candidates.get(0).unwrap().validity_votes.len(), + votes, ); benchmark.bitfields.clear(); @@ -197,8 +204,8 @@ benchmarks! { assert_eq!(ParaId::from(para_id), descriptor.para_id); assert_eq!(header.hash(), descriptor.relay_parent); assert_eq!( - backing_validators.1.len() as u32, - BenchBuilder::::fallback_min_validity_votes() + backing_validators.1.len(), + votes, ); } diff --git a/polkadot/runtime/parachains/src/paras_inherent/mod.rs b/polkadot/runtime/parachains/src/paras_inherent/mod.rs index 8e918d35d5f..8c33199c092 100644 --- a/polkadot/runtime/parachains/src/paras_inherent/mod.rs +++ b/polkadot/runtime/parachains/src/paras_inherent/mod.rs @@ -548,7 +548,7 @@ impl Pallet { let disputed_bitfield = create_disputed_bitfield(expected_bits, freed_disputed.keys()); if !freed_disputed.is_empty() { - >::update_claimqueue(freed_disputed.clone(), now); + >::free_cores_and_fill_claimqueue(freed_disputed.clone(), now); } let bitfields = sanitize_bitfields::( @@ -580,7 +580,7 @@ impl Pallet { let freed = collect_all_freed_cores::(freed_concluded.iter().cloned()); - >::update_claimqueue(freed, now); + >::free_cores_and_fill_claimqueue(freed, now); let scheduled = >::scheduled_paras() .map(|(core_idx, para_id)| (para_id, core_idx)) .collect(); diff --git a/polkadot/runtime/parachains/src/paras_inherent/tests.rs b/polkadot/runtime/parachains/src/paras_inherent/tests.rs index 4fc60792e34..e62d1cb68ff 100644 --- a/polkadot/runtime/parachains/src/paras_inherent/tests.rs +++ b/polkadot/runtime/parachains/src/paras_inherent/tests.rs @@ -25,7 +25,8 @@ mod enter { use super::*; use crate::{ builder::{Bench, BenchBuilder}, - mock::{new_test_ext, BlockLength, BlockWeights, MockGenesisConfig, Test}, + mock::{mock_assigner, new_test_ext, BlockLength, BlockWeights, MockGenesisConfig, Test}, + scheduler::common::Assignment, }; use assert_matches::assert_matches; use frame_support::assert_ok; @@ -39,6 +40,7 @@ mod enter { backed_and_concluding: BTreeMap, num_validators_per_core: u32, code_upgrade: Option, + fill_claimqueue: bool, } fn make_inherent_data( @@ -48,6 +50,7 @@ mod enter { backed_and_concluding, num_validators_per_core, code_upgrade, + fill_claimqueue, }: TestConfig, ) -> Bench { let builder = BenchBuilder::::new() @@ -58,7 +61,15 @@ mod enter { .set_max_validators_per_core(num_validators_per_core) .set_dispute_statements(dispute_statements) .set_backed_and_concluding_cores(backed_and_concluding) - .set_dispute_sessions(&dispute_sessions[..]); + .set_dispute_sessions(&dispute_sessions[..]) + .set_fill_claimqueue(fill_claimqueue); + + // Setup some assignments as needed: + mock_assigner::Pallet::::set_core_count(builder.max_cores()); + for core_index in 0..builder.max_cores() { + // Core index == para_id in this case + mock_assigner::Pallet::::add_test_assignment(Assignment::Bulk(core_index.into())); + } if let Some(code_size) = code_upgrade { builder.set_code_upgrade(code_size).build() @@ -88,6 +99,7 @@ mod enter { backed_and_concluding, num_validators_per_core: 1, code_upgrade: None, + fill_claimqueue: false, }); // We expect the scenario to have cores 0 & 1 with pending availability. The backed @@ -238,6 +250,7 @@ mod enter { backed_and_concluding, num_validators_per_core: 5, code_upgrade: None, + fill_claimqueue: false, }); let expected_para_inherent_data = scenario.data.clone(); @@ -308,6 +321,7 @@ mod enter { backed_and_concluding, num_validators_per_core: 6, code_upgrade: None, + fill_claimqueue: false, }); let expected_para_inherent_data = scenario.data.clone(); @@ -376,6 +390,7 @@ mod enter { backed_and_concluding, num_validators_per_core: 4, code_upgrade: None, + fill_claimqueue: false, }); let expected_para_inherent_data = scenario.data.clone(); @@ -460,6 +475,7 @@ mod enter { backed_and_concluding, num_validators_per_core: 5, code_upgrade: None, + fill_claimqueue: false, }); let expected_para_inherent_data = scenario.data.clone(); @@ -544,6 +560,7 @@ mod enter { backed_and_concluding, num_validators_per_core: 5, code_upgrade: None, + fill_claimqueue: false, }); let expected_para_inherent_data = scenario.data.clone(); @@ -627,6 +644,7 @@ mod enter { backed_and_concluding, num_validators_per_core: 5, code_upgrade: None, + fill_claimqueue: false, }); let expected_para_inherent_data = scenario.data.clone(); @@ -666,15 +684,9 @@ mod enter { // * 3 disputes. assert_eq!(limit_inherent_data.disputes.len(), 2); - assert_ok!(Pallet::::enter( - frame_system::RawOrigin::None.into(), - limit_inherent_data, - )); - - // TODO [now]: this assertion fails with async backing runtime. assert_eq!( - // The length of this vec is equal to the number of candidates, so we know our 2 - // backed candidates did not get filtered out + // The length of this vec is equal to the number of candidates, so we know 1 + // candidate got filtered out Pallet::::on_chain_votes().unwrap().backing_validators_per_candidate.len(), 1 ); @@ -684,6 +696,11 @@ mod enter { Pallet::::on_chain_votes().unwrap().session, 2 ); + + assert_ok!(Pallet::::enter( + frame_system::RawOrigin::None.into(), + limit_inherent_data, + )); }); } @@ -713,6 +730,7 @@ mod enter { backed_and_concluding, num_validators_per_core: 5, code_upgrade: None, + fill_claimqueue: false, }); let expected_para_inherent_data = scenario.data.clone(); @@ -778,6 +796,7 @@ mod enter { backed_and_concluding, num_validators_per_core: 5, code_upgrade: None, + fill_claimqueue: false, }); let expected_para_inherent_data = scenario.data.clone(); @@ -841,6 +860,7 @@ mod enter { backed_and_concluding, num_validators_per_core: 5, code_upgrade: None, + fill_claimqueue: false, }); let expected_para_inherent_data = scenario.data.clone(); @@ -905,6 +925,7 @@ mod enter { backed_and_concluding, num_validators_per_core: 5, code_upgrade: None, + fill_claimqueue: false, }); let expected_para_inherent_data = scenario.data.clone(); diff --git a/polkadot/runtime/parachains/src/runtime_api_impl/v7.rs b/polkadot/runtime/parachains/src/runtime_api_impl/v7.rs index 4d0bbc6a896..b3a060e1cb8 100644 --- a/polkadot/runtime/parachains/src/runtime_api_impl/v7.rs +++ b/polkadot/runtime/parachains/src/runtime_api_impl/v7.rs @@ -62,7 +62,7 @@ pub fn availability_cores() -> Vec>::update_claimqueue(Vec::new(), now); + >::free_cores_and_fill_claimqueue(Vec::new(), now); let time_out_for = >::availability_timeout_predicate(); diff --git a/polkadot/runtime/parachains/src/scheduler.rs b/polkadot/runtime/parachains/src/scheduler.rs index dea84c69f52..08ce656b2b2 100644 --- a/polkadot/runtime/parachains/src/scheduler.rs +++ b/polkadot/runtime/parachains/src/scheduler.rs @@ -65,7 +65,7 @@ pub mod migration; pub mod pallet { use super::*; - const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); + const STORAGE_VERSION: StorageVersion = StorageVersion::new(2); #[pallet::pallet] #[pallet::without_storage_info] @@ -99,15 +99,14 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn availability_cores)] pub(crate) type AvailabilityCores = - StorageValue<_, Vec>>, ValueQuery>; + StorageValue<_, Vec>, ValueQuery>; /// Representation of a core in `AvailabilityCores`. /// /// This is not to be confused with `CoreState` which is an enriched variant of this and exposed /// to the node side. It also provides information about scheduled/upcoming assignments for /// example and is computed on the fly in the `availability_cores` runtime call. - #[derive(Clone, Encode, Decode, TypeInfo, RuntimeDebug)] - #[cfg_attr(feature = "std", derive(PartialEq))] + #[derive(Encode, Decode, TypeInfo, RuntimeDebug, PartialEq)] pub enum CoreOccupied { /// No candidate is waiting availability on this core right now (the core is not occupied). Free, @@ -115,6 +114,9 @@ pub mod pallet { Paras(ParasEntry), } + /// Conveninece type alias for `CoreOccupied`. + pub type CoreOccupiedType = CoreOccupied>; + impl CoreOccupied { /// Is core free? pub fn is_free(&self) -> bool { @@ -149,16 +151,13 @@ pub mod pallet { /// a block. Runtime APIs should be used to determine scheduled cores/ for the upcoming block. #[pallet::storage] #[pallet::getter(fn claimqueue)] - pub(crate) type ClaimQueue = StorageValue< - _, - BTreeMap>>>>, - ValueQuery, - >; + pub(crate) type ClaimQueue = + StorageValue<_, BTreeMap>>, ValueQuery>; /// Assignments as tracked in the claim queue. - #[derive(Clone, Encode, Decode, TypeInfo, PartialEq, RuntimeDebug)] - pub struct ParasEntry { - /// The underlying `Assignment` + #[derive(Encode, Decode, TypeInfo, RuntimeDebug, PartialEq, Clone)] + pub struct ParasEntry { + /// The underlying [`Assignment`]. pub assignment: Assignment, /// The number of times the entry has timed out in availability already. pub availability_timeouts: u32, @@ -169,37 +168,18 @@ pub mod pallet { pub ttl: N, } - impl ParasEntry { - /// Return `Id` from the underlying `Assignment`. - pub fn para_id(&self) -> ParaId { - self.assignment.para_id - } + /// Convenience type declaration for `ParasEntry`. + pub type ParasEntryType = ParasEntry>; + impl ParasEntry { /// Create a new `ParasEntry`. pub fn new(assignment: Assignment, now: N) -> Self { ParasEntry { assignment, availability_timeouts: 0, ttl: now } } - } - /// How a core is mapped to a backing group and a `ParaId` - #[derive(Clone, Encode, Decode, PartialEq, TypeInfo)] - #[cfg_attr(feature = "std", derive(Debug))] - pub struct CoreAssignment { - /// The core that is assigned. - pub core: CoreIndex, - /// The para id and accompanying information needed to collate and back a parablock. - pub paras_entry: ParasEntry, - } - - impl CoreAssignment { - /// Returns the [`ParaId`] of the assignment. + /// Return `Id` from the underlying `Assignment`. pub fn para_id(&self) -> ParaId { - self.paras_entry.para_id() - } - - /// Returns the inner [`ParasEntry`] of the assignment. - pub fn to_paras_entry(self) -> ParasEntry { - self.paras_entry + self.assignment.para_id() } } @@ -219,8 +199,6 @@ pub mod pallet { } type PositionInClaimqueue = u32; -type TimedoutParas = BTreeMap>>; -type ConcludedParas = BTreeMap; impl Pallet { /// Called by the initializer to initialize the scheduler pallet. @@ -253,7 +231,7 @@ impl Pallet { ); AvailabilityCores::::mutate(|cores| { - cores.resize(n_cores as _, CoreOccupied::Free); + cores.resize_with(n_cores as _, || CoreOccupied::Free); }); // shuffle validators into groups. @@ -298,9 +276,8 @@ impl Pallet { /// with the reason for them being freed. Returns a tuple of concluded and timedout paras. fn free_cores( just_freed_cores: impl IntoIterator, - ) -> (ConcludedParas, TimedoutParas) { - let mut timedout_paras: BTreeMap>> = - BTreeMap::new(); + ) -> (BTreeMap, BTreeMap>) { + let mut timedout_paras: BTreeMap> = BTreeMap::new(); let mut concluded_paras = BTreeMap::new(); AvailabilityCores::::mutate(|cores| { @@ -310,21 +287,22 @@ impl Pallet { .into_iter() .filter(|(freed_index, _)| (freed_index.0 as usize) < c_len) .for_each(|(freed_index, freed_reason)| { - match &cores[freed_index.0 as usize] { + match sp_std::mem::replace( + &mut cores[freed_index.0 as usize], + CoreOccupied::Free, + ) { CoreOccupied::Free => {}, CoreOccupied::Paras(entry) => { match freed_reason { FreedReason::Concluded => { - concluded_paras.insert(freed_index, entry.para_id()); + concluded_paras.insert(freed_index, entry.assignment); }, FreedReason::TimedOut => { - timedout_paras.insert(freed_index, entry.clone()); + timedout_paras.insert(freed_index, entry); }, }; }, }; - - cores[freed_index.0 as usize] = CoreOccupied::Free; }) }); @@ -379,30 +357,36 @@ impl Pallet { for (idx, _) in (0u32..).zip(availability_cores) { let core_idx = CoreIndex(idx); if let Some(core_claimqueue) = cq.get_mut(&core_idx) { - let mut dropped_claims: Vec> = vec![]; - core_claimqueue.retain(|maybe_entry| { - if let Some(entry) = maybe_entry { + let mut i = 0; + let mut num_dropped = 0; + while i < core_claimqueue.len() { + let maybe_dropped = if let Some(entry) = core_claimqueue.get(i) { if entry.ttl < now { - dropped_claims.push(Some(entry.para_id())); - return false + core_claimqueue.remove(i) + } else { + None } + } else { + None + }; + + if let Some(dropped) = maybe_dropped { + num_dropped += 1; + T::AssignmentProvider::report_processed(dropped.assignment); + } else { + i += 1; } - true - }); - - // For all claims dropped due to TTL, attempt to pop a new entry to - // the back of the claimqueue. - for drop in dropped_claims { - match T::AssignmentProvider::pop_assignment_for_core(core_idx, drop) { - Some(assignment) => { - let AssignmentProviderConfig { ttl, .. } = - T::AssignmentProvider::get_provider_config(core_idx); - core_claimqueue.push_back(Some(ParasEntry::new( - assignment.clone(), - now + ttl, - ))); - }, - None => (), + } + + for _ in 0..num_dropped { + // For all claims dropped due to TTL, attempt to pop a new entry to + // the back of the claimqueue. + if let Some(assignment) = + T::AssignmentProvider::pop_assignment_for_core(core_idx) + { + let AssignmentProviderConfig { ttl, .. } = + T::AssignmentProvider::get_provider_config(core_idx); + core_claimqueue.push_back(ParasEntry::new(assignment, now + ttl)); } } } @@ -514,14 +498,12 @@ impl Pallet { /// Return the next thing that will be scheduled on this core assuming it is currently /// occupied and the candidate occupying it became available. pub(crate) fn next_up_on_available(core: CoreIndex) -> Option { - ClaimQueue::::get().get(&core).and_then(|a| { - a.iter() - .find_map(|e| e.as_ref()) - .map(|pe| Self::paras_entry_to_scheduled_core(pe)) - }) + ClaimQueue::::get() + .get(&core) + .and_then(|a| a.front().map(|pe| Self::paras_entry_to_scheduled_core(pe))) } - fn paras_entry_to_scheduled_core(pe: &ParasEntry>) -> ScheduledCore { + fn paras_entry_to_scheduled_core(pe: &ParasEntryType) -> ScheduledCore { ScheduledCore { para_id: pe.para_id(), collator: None } } @@ -552,35 +534,33 @@ impl Pallet { /// Pushes occupied cores to the assignment provider. fn push_occupied_cores_to_assignment_provider() { AvailabilityCores::::mutate(|cores| { - for (core_idx, core) in cores.iter_mut().enumerate() { - match core { + for core in cores.iter_mut() { + match sp_std::mem::replace(core, CoreOccupied::Free) { CoreOccupied::Free => continue, CoreOccupied::Paras(entry) => { - let core_idx = CoreIndex::from(core_idx as u32); - Self::maybe_push_assignment(core_idx, entry.clone()); + Self::maybe_push_assignment(entry); }, } - *core = CoreOccupied::Free; } }); } // on new session fn push_claimqueue_items_to_assignment_provider() { - for (core_idx, core_claimqueue) in ClaimQueue::::take() { + for (_, claim_queue) in ClaimQueue::::take() { // Push back in reverse order so that when we pop from the provider again, // the entries in the claimqueue are in the same order as they are right now. - for para_entry in core_claimqueue.into_iter().flatten().rev() { - Self::maybe_push_assignment(core_idx, para_entry); + for para_entry in claim_queue.into_iter().rev() { + Self::maybe_push_assignment(para_entry); } } } /// Push assignments back to the provider on session change unless the paras /// timed out on availability before. - fn maybe_push_assignment(core_idx: CoreIndex, pe: ParasEntry>) { + fn maybe_push_assignment(pe: ParasEntryType) { if pe.availability_timeouts == 0 { - T::AssignmentProvider::push_assignment_for_core(core_idx, pe.assignment); + T::AssignmentProvider::push_back_assignment(pe.assignment); } } @@ -591,31 +571,8 @@ impl Pallet { >::config().scheduling_lookahead } - /// Updates the claimqueue by moving it to the next paras and filling empty spots with new - /// paras. - pub(crate) fn update_claimqueue( - just_freed_cores: impl IntoIterator, - now: BlockNumberFor, - ) { - Self::move_claimqueue_forward(); - Self::free_cores_and_fill_claimqueue(just_freed_cores, now) - } - - /// Moves all elements in the claimqueue forward. - fn move_claimqueue_forward() { - let mut cq = ClaimQueue::::get(); - for core_queue in cq.values_mut() { - // First pop the finished claims from the front. - if let Some(None) = core_queue.front() { - core_queue.pop_front(); - } - } - - ClaimQueue::::set(cq); - } - /// Frees cores and fills the free claimqueue spots by popping from the `AssignmentProvider`. - fn free_cores_and_fill_claimqueue( + pub fn free_cores_and_fill_claimqueue( just_freed_cores: impl IntoIterator, now: BlockNumberFor, ) { @@ -651,19 +608,19 @@ impl Pallet { } else { // Consider timed out assignments for on demand parachains as concluded for // the assignment provider - let ret = concluded_paras.insert(core_idx, entry.para_id()); + let ret = concluded_paras.insert(core_idx, entry.assignment); debug_assert!(ret.is_none()); } } - // We consider occupied cores to be part of the claimqueue + if let Some(concluded_para) = concluded_paras.remove(&core_idx) { + T::AssignmentProvider::report_processed(concluded_para); + } + // We consider occupied cores to be part of the claimqueue let n_lookahead_used = cq.get(&core_idx).map_or(0, |v| v.len() as u32) + if Self::is_core_occupied(core_idx) { 1 } else { 0 }; for _ in n_lookahead_used..n_lookahead { - let concluded_para = concluded_paras.remove(&core_idx); - if let Some(assignment) = - T::AssignmentProvider::pop_assignment_for_core(core_idx, concluded_para) - { + if let Some(assignment) = T::AssignmentProvider::pop_assignment_for_core(core_idx) { Self::add_to_claimqueue(core_idx, ParasEntry::new(assignment, now + ttl)); } } @@ -680,9 +637,9 @@ impl Pallet { } } - fn add_to_claimqueue(core_idx: CoreIndex, pe: ParasEntry>) { + fn add_to_claimqueue(core_idx: CoreIndex, pe: ParasEntryType) { ClaimQueue::::mutate(|la| { - la.entry(core_idx).or_default().push_back(Some(pe)); + la.entry(core_idx).or_default().push_back(pe); }); } @@ -690,19 +647,16 @@ impl Pallet { fn remove_from_claimqueue( core_idx: CoreIndex, para_id: ParaId, - ) -> Result<(PositionInClaimqueue, ParasEntry>), &'static str> { + ) -> Result<(PositionInClaimqueue, ParasEntryType), &'static str> { ClaimQueue::::mutate(|cq| { let core_claims = cq.get_mut(&core_idx).ok_or("core_idx not found in lookahead")?; let pos = core_claims .iter() - .position(|a| a.as_ref().map_or(false, |pe| pe.para_id() == para_id)) + .position(|pe| pe.para_id() == para_id) .ok_or("para id not found at core_idx lookahead")?; - let pe = core_claims - .remove(pos) - .ok_or("remove returned None")? - .ok_or("Element in Claimqueue was None.")?; + let pe = core_claims.remove(pos).ok_or("remove returned None")?; Ok((pos as u32, pe)) }) @@ -710,16 +664,10 @@ impl Pallet { /// Paras scheduled next in the claim queue. pub(crate) fn scheduled_paras() -> impl Iterator { - Self::scheduled_entries().map(|(core_idx, e)| (core_idx, e.assignment.para_id)) - } - - /// Internal access to entries at the top of the claim queue. - fn scheduled_entries() -> impl Iterator>)> { let claimqueue = ClaimQueue::::get(); - claimqueue .into_iter() - .filter_map(|(core_idx, v)| v.front().cloned().flatten().map(|e| (core_idx, e))) + .filter_map(|(core_idx, v)| v.front().map(|e| (core_idx, e.assignment.para_id()))) } #[cfg(any(feature = "runtime-benchmarks", test))] diff --git a/polkadot/runtime/parachains/src/scheduler/common.rs b/polkadot/runtime/parachains/src/scheduler/common.rs index 316e8e3b760..2eb73385803 100644 --- a/polkadot/runtime/parachains/src/scheduler/common.rs +++ b/polkadot/runtime/parachains/src/scheduler/common.rs @@ -16,29 +16,39 @@ //! Common traits and types used by the scheduler and assignment providers. -use frame_support::pallet_prelude::*; -use primitives::{CoreIndex, Id as ParaId}; use scale_info::TypeInfo; -use sp_std::prelude::*; +use sp_runtime::{ + codec::{Decode, Encode}, + RuntimeDebug, +}; -// Only used to link to configuration documentation. -#[allow(unused)] -use crate::configuration::HostConfiguration; +use primitives::{CoreIndex, Id as ParaId}; -/// An assignment for a parachain scheduled to be backed and included in a relay chain block. -#[derive(Clone, Encode, Decode, PartialEq, TypeInfo, RuntimeDebug)] -pub struct Assignment { - /// Assignment's ParaId - pub para_id: ParaId, +/// Assignment (ParaId -> CoreIndex). +#[derive(Encode, Decode, TypeInfo, RuntimeDebug, Clone, PartialEq)] +pub enum Assignment { + /// A pool assignment. + Pool { + /// The assigned para id. + para_id: ParaId, + /// The core index the para got assigned to. + core_index: CoreIndex, + }, + /// A bulk assignment. + Bulk(ParaId), } impl Assignment { - /// Create a new `Assignment`. - pub fn new(para_id: ParaId) -> Self { - Self { para_id } + /// Returns the [`ParaId`] this assignment is associated to. + pub fn para_id(&self) -> ParaId { + match self { + Self::Pool { para_id, .. } => *para_id, + Self::Bulk(para_id) => *para_id, + } } } +#[derive(Encode, Decode, TypeInfo)] /// A set of variables required by the scheduler in order to operate. pub struct AssignmentProviderConfig { /// How many times a collation can time out on availability. @@ -51,22 +61,42 @@ pub struct AssignmentProviderConfig { } pub trait AssignmentProvider { - /// How many cores are allocated to this provider. - fn session_core_count() -> u32; - /// Pops an [`Assignment`] from the provider for a specified [`CoreIndex`]. - /// The `concluded_para` field makes the caller report back to the provider - /// which [`ParaId`] it processed last on the supplied [`CoreIndex`]. - fn pop_assignment_for_core( - core_idx: CoreIndex, - concluded_para: Option, - ) -> Option; - - /// Push back an already popped assignment. Intended for provider implementations - /// that need to be able to keep track of assignments over session boundaries, - /// such as the on demand assignment provider. - fn push_assignment_for_core(core_idx: CoreIndex, assignment: Assignment); + /// + /// This is where assignments come into existance. + fn pop_assignment_for_core(core_idx: CoreIndex) -> Option; + + /// A previously popped `Assignment` has been fully processed. + /// + /// Report back to the assignment provider that an assignment is done and no longer present in + /// the scheduler. + /// + /// This is one way of the life of an assignment coming to an end. + fn report_processed(assignment: Assignment); + + /// Push back a previously popped assignment. + /// + /// If the assignment could not be processed within the current session, it can be pushed back + /// to the assignment provider in order to be poppped again later. + /// + /// This is the second way the life of an assignment can come to an end. + fn push_back_assignment(assignment: Assignment); /// Returns a set of variables needed by the scheduler fn get_provider_config(core_idx: CoreIndex) -> AssignmentProviderConfig; + + /// Push some assignment for mocking/benchmarks purposes. + /// + /// Useful for benchmarks and testing. The returned assignment is "valid" and can if need be + /// passed into `report_processed` for example. + #[cfg(any(feature = "runtime-benchmarks", test))] + fn get_mock_assignment(core_idx: CoreIndex, para_id: ParaId) -> Assignment; + + /// How many cores are allocated to this provider. + /// + /// As the name suggests the core count has to be session buffered: + /// + /// - Core count has to be predetermined for the next session in the current session. + /// - Core count must not change during a session. + fn session_core_count() -> u32; } diff --git a/polkadot/runtime/parachains/src/scheduler/migration.rs b/polkadot/runtime/parachains/src/scheduler/migration.rs index bb9a647e955..4c0a07d7367 100644 --- a/polkadot/runtime/parachains/src/scheduler/migration.rs +++ b/polkadot/runtime/parachains/src/scheduler/migration.rs @@ -22,9 +22,18 @@ use frame_support::{ traits::OnRuntimeUpgrade, weights::Weight, }; +/// Old/legacy assignment representation (v0). +/// +/// `Assignment` used to be a concrete type with the same layout V0Assignment, idential on all +/// assignment providers. This can be removed once storage has been migrated. +#[derive(Encode, Decode, RuntimeDebug, TypeInfo, PartialEq, Clone)] +struct V0Assignment { + pub para_id: ParaId, +} + +/// Old scheduler with explicit parathreads and `Scheduled` storage instead of `ClaimQueue`. mod v0 { use super::*; - use primitives::{CollatorId, Id}; #[storage_alias] @@ -90,29 +99,123 @@ mod v0 { } } -pub mod v1 { +// `ClaimQueue` got introduced. +// +// - Items are `Option` for some weird reason. +// - Assignments only consist of `ParaId`, `Assignment` is a concrete type (Same as V0Assignment). +mod v1 { + use frame_support::{ + pallet_prelude::ValueQuery, storage_alias, traits::OnRuntimeUpgrade, weights::Weight, + }; + use frame_system::pallet_prelude::BlockNumberFor; + use super::*; use crate::scheduler; - #[allow(deprecated)] - pub type MigrateToV1 = VersionedMigration< - 0, - 1, - UncheckedMigrateToV1, + #[storage_alias] + pub(super) type ClaimQueue = StorageValue< Pallet, - ::DbWeight, + BTreeMap>>>>, + ValueQuery, >; - #[deprecated(note = "Use MigrateToV1 instead")] + #[storage_alias] + pub(super) type AvailabilityCores = + StorageValue, Vec>>, ValueQuery>; + + #[derive(Encode, Decode, TypeInfo, RuntimeDebug, PartialEq)] + pub(super) enum CoreOccupied { + /// No candidate is waiting availability on this core right now (the core is not occupied). + Free, + /// A para is currently waiting for availability/inclusion on this core. + Paras(ParasEntry), + } + + #[derive(Encode, Decode, TypeInfo, RuntimeDebug, PartialEq)] + pub(super) struct ParasEntry { + /// The underlying `Assignment` + pub(super) assignment: V0Assignment, + /// The number of times the entry has timed out in availability already. + pub(super) availability_timeouts: u32, + /// The block height until this entry needs to be backed. + /// + /// If missed the entry will be removed from the claim queue without ever having occupied + /// the core. + pub(super) ttl: N, + } + + impl ParasEntry { + /// Create a new `ParasEntry`. + pub(super) fn new(assignment: V0Assignment, now: N) -> Self { + ParasEntry { assignment, availability_timeouts: 0, ttl: now } + } + + /// Return `Id` from the underlying `Assignment`. + pub(super) fn para_id(&self) -> ParaId { + self.assignment.para_id + } + } + + fn add_to_claimqueue(core_idx: CoreIndex, pe: ParasEntry>) { + ClaimQueue::::mutate(|la| { + la.entry(core_idx).or_default().push_back(Some(pe)); + }); + } + + /// Migration to V1 pub struct UncheckedMigrateToV1(sp_std::marker::PhantomData); - #[allow(deprecated)] impl OnRuntimeUpgrade for UncheckedMigrateToV1 { fn on_runtime_upgrade() -> Weight { - let weight_consumed = migrate_to_v1::(); + let mut weight: Weight = Weight::zero(); + + v0::ParathreadQueue::::kill(); + v0::ParathreadClaimIndex::::kill(); + + let now = >::block_number(); + let scheduled = v0::Scheduled::::take(); + let sched_len = scheduled.len() as u64; + for core_assignment in scheduled { + let core_idx = core_assignment.core; + let assignment = V0Assignment { para_id: core_assignment.para_id }; + let pe = v1::ParasEntry::new(assignment, now); + v1::add_to_claimqueue::(core_idx, pe); + } + + let parachains = paras::Pallet::::parachains(); + let availability_cores = v0::AvailabilityCores::::take(); + let mut new_availability_cores = Vec::new(); + + for (core_index, core) in availability_cores.into_iter().enumerate() { + let new_core = if let Some(core) = core { + match core { + v0::CoreOccupied::Parachain => + v1::CoreOccupied::Paras(v1::ParasEntry::new( + V0Assignment { para_id: parachains[core_index] }, + now, + )), + v0::CoreOccupied::Parathread(entry) => v1::CoreOccupied::Paras( + v1::ParasEntry::new(V0Assignment { para_id: entry.claim.0 }, now), + ), + } + } else { + v1::CoreOccupied::Free + }; + + new_availability_cores.push(new_core); + } + + v1::AvailabilityCores::::set(new_availability_cores); - log::info!(target: scheduler::LOG_TARGET, "Migrating para scheduler storage to v1"); + // 2x as once for Scheduled and once for Claimqueue + weight.saturating_accrue(T::DbWeight::get().reads_writes(2 * sched_len, 2 * sched_len)); + // reading parachains + availability_cores, writing AvailabilityCores + weight.saturating_accrue(T::DbWeight::get().reads_writes(2, 1)); + // 2x kill + weight.saturating_accrue(T::DbWeight::get().writes(2)); - weight_consumed + log::info!(target: scheduler::LOG_TARGET, "Migrated para scheduler storage to v1"); + + weight } #[cfg(feature = "try-runtime")] @@ -138,9 +241,9 @@ pub mod v1 { ); let expected_len = u32::decode(&mut &state[..]).unwrap(); - let availability_cores_waiting = super::AvailabilityCores::::get() - .iter() - .filter(|c| !matches!(c, CoreOccupied::Free)) + let availability_cores_waiting = v1::AvailabilityCores::::get() + .into_iter() + .filter(|c| !matches!(c, v1::CoreOccupied::Free)) .count(); ensure!( @@ -154,51 +257,150 @@ pub mod v1 { } } -pub fn migrate_to_v1() -> Weight { - let mut weight: Weight = Weight::zero(); +/// Migrate `V0` to `V1` of the storage format. +pub type MigrateV0ToV1 = VersionedMigration< + 0, + 1, + v1::UncheckedMigrateToV1, + Pallet, + ::DbWeight, +>; - v0::ParathreadQueue::::kill(); - v0::ParathreadClaimIndex::::kill(); +mod v2 { + use super::*; + use crate::scheduler; - let now = >::block_number(); - let scheduled = v0::Scheduled::::take(); - let sched_len = scheduled.len() as u64; - for core_assignment in scheduled { - let core_idx = core_assignment.core; - let assignment = Assignment::new(core_assignment.para_id); - let pe = ParasEntry::new(assignment, now); - Pallet::::add_to_claimqueue(core_idx, pe); + #[derive(Encode, Decode, TypeInfo, RuntimeDebug, PartialEq)] + pub(crate) enum CoreOccupied { + Free, + Paras(ParasEntry), } - let parachains = paras::Pallet::::parachains(); - let availability_cores = v0::AvailabilityCores::::take(); - let mut new_availability_cores = Vec::new(); - - for (core_index, core) in availability_cores.into_iter().enumerate() { - let new_core = if let Some(core) = core { - match core { - v0::CoreOccupied::Parachain => CoreOccupied::Paras(ParasEntry::new( - Assignment::new(parachains[core_index]), - now, - )), - v0::CoreOccupied::Parathread(entry) => - CoreOccupied::Paras(ParasEntry::new(Assignment::new(entry.claim.0), now)), - } - } else { - CoreOccupied::Free - }; + #[derive(Encode, Decode, TypeInfo, RuntimeDebug, PartialEq)] + pub(crate) struct ParasEntry { + pub assignment: Assignment, + pub availability_timeouts: u32, + pub ttl: N, + } - new_availability_cores.push(new_core); + // V2 (no Option wrapper) and new [`Assignment`]. + #[storage_alias] + pub(crate) type ClaimQueue = StorageValue< + Pallet, + BTreeMap>>>, + ValueQuery, + >; + + #[storage_alias] + pub(crate) type AvailabilityCores = + StorageValue, Vec>>, ValueQuery>; + + fn is_bulk(core_index: CoreIndex) -> bool { + core_index.0 < paras::Parachains::::decode_len().unwrap_or(0) as u32 } - super::AvailabilityCores::::set(new_availability_cores); + /// Migration to V2 + pub struct UncheckedMigrateToV2(sp_std::marker::PhantomData); + + impl OnRuntimeUpgrade for UncheckedMigrateToV2 { + fn on_runtime_upgrade() -> Weight { + let mut weight: Weight = Weight::zero(); + + let old = v1::ClaimQueue::::take(); + let new = old + .into_iter() + .map(|(k, v)| { + ( + k, + v.into_iter() + .flatten() + .map(|p| { + let assignment = if is_bulk::(k) { + Assignment::Bulk(p.para_id()) + } else { + Assignment::Pool { para_id: p.para_id(), core_index: k } + }; + + ParasEntry { + assignment, + availability_timeouts: p.availability_timeouts, + ttl: p.ttl, + } + }) + .collect::>(), + ) + }) + .collect::>>>>(); + + ClaimQueue::::put(new); + + let old = v1::AvailabilityCores::::get(); + + let new = old + .into_iter() + .enumerate() + .map(|(k, a)| match a { + v1::CoreOccupied::Free => CoreOccupied::Free, + v1::CoreOccupied::Paras(paras) => { + let assignment = if is_bulk::((k as u32).into()) { + Assignment::Bulk(paras.para_id()) + } else { + Assignment::Pool { + para_id: paras.para_id(), + core_index: (k as u32).into(), + } + }; + + CoreOccupied::Paras(ParasEntry { + assignment, + availability_timeouts: paras.availability_timeouts, + ttl: paras.ttl, + }) + }, + }) + .collect::>(); + AvailabilityCores::::put(new); + + weight.saturating_accrue(T::DbWeight::get().reads_writes(1, 1)); + + log::info!(target: scheduler::LOG_TARGET, "Migrating para scheduler storage to v2"); + + weight + } + + #[cfg(feature = "try-runtime")] + fn pre_upgrade() -> Result, sp_runtime::DispatchError> { + log::trace!( + target: crate::scheduler::LOG_TARGET, + "ClaimQueue before migration: {}", + v1::ClaimQueue::::get().len() + ); + + let bytes = u32::to_be_bytes(v1::ClaimQueue::::get().len() as u32); - // 2x as once for Scheduled and once for Claimqueue - weight = weight.saturating_add(T::DbWeight::get().reads_writes(2 * sched_len, 2 * sched_len)); - // reading parachains + availability_cores, writing AvailabilityCores - weight = weight.saturating_add(T::DbWeight::get().reads_writes(2, 1)); - // 2x kill - weight = weight.saturating_add(T::DbWeight::get().writes(2)); + Ok(bytes.to_vec()) + } - weight + #[cfg(feature = "try-runtime")] + fn post_upgrade(state: Vec) -> Result<(), sp_runtime::DispatchError> { + log::trace!(target: crate::scheduler::LOG_TARGET, "Running post_upgrade()"); + + let old_len = u32::from_be_bytes(state.try_into().unwrap()); + ensure!( + v2::ClaimQueue::::get().len() as u32 == old_len, + "Old ClaimQueue completely moved to new ClaimQueue after migration" + ); + + Ok(()) + } + } } + +/// Migrate `V1` to `V2` of the storage format. +pub type MigrateV1ToV2 = VersionedMigration< + 1, + 2, + v2::UncheckedMigrateToV2, + Pallet, + ::DbWeight, +>; diff --git a/polkadot/runtime/parachains/src/scheduler/tests.rs b/polkadot/runtime/parachains/src/scheduler/tests.rs index 108f365d6b5..9af23ce64bd 100644 --- a/polkadot/runtime/parachains/src/scheduler/tests.rs +++ b/polkadot/runtime/parachains/src/scheduler/tests.rs @@ -22,24 +22,24 @@ use primitives::{BlockNumber, SessionIndex, ValidationCode, ValidatorId}; use sp_std::collections::{btree_map::BTreeMap, btree_set::BTreeSet}; use crate::{ - assigner_on_demand::QueuePushDirection, configuration::HostConfiguration, initializer::SessionChangeNotification, mock::{ - new_test_ext, MockGenesisConfig, OnDemandAssigner, Paras, ParasShared, RuntimeOrigin, + new_test_ext, MockAssigner, MockGenesisConfig, Paras, ParasShared, RuntimeOrigin, Scheduler, System, Test, }, paras::{ParaGenesisArgs, ParaKind}, + scheduler::{common::Assignment, ClaimQueue}, }; -fn schedule_blank_para(id: ParaId, parakind: ParaKind) { +fn schedule_blank_para(id: ParaId) { let validation_code: ValidationCode = vec![1, 2, 3].into(); assert_ok!(Paras::schedule_para_initialize( id, ParaGenesisArgs { genesis_head: Vec::new().into(), validation_code: validation_code.clone(), - para_kind: parakind, + para_kind: ParaKind::Parathread, // This most closely mimics our test assigner } )); @@ -78,7 +78,7 @@ fn run_to_block( Scheduler::initializer_initialize(b + 1); // In the real runtime this is expected to be called by the `InclusionInherent` pallet. - Scheduler::update_claimqueue(BTreeMap::new(), b + 1); + Scheduler::free_cores_and_fill_claimqueue(BTreeMap::new(), b + 1); } } @@ -103,11 +103,10 @@ fn run_to_end_of_block( fn default_config() -> HostConfiguration { HostConfiguration { - on_demand_cores: 3, + coretime_cores: 3, group_rotation_frequency: 10, paras_availability_period: 3, scheduling_lookahead: 2, - on_demand_retries: 1, // This field does not affect anything that scheduler does. However, `HostConfiguration` // is still a subject to consistency test. It requires that // `minimum_validation_upgrade_delay` is greater than `chain_availability_period` and @@ -124,29 +123,16 @@ fn genesis_config(config: &HostConfiguration) -> MockGenesisConfig } } -pub(crate) fn claimqueue_contains_only_none() -> bool { - let mut cq = Scheduler::claimqueue(); - for (_, v) in cq.iter_mut() { - v.retain(|e| e.is_some()); - } - - cq.values().map(|v| v.len()).sum::() == 0 -} - -pub(crate) fn claimqueue_contains_para_ids(pids: Vec) -> bool { +fn claimqueue_contains_para_ids(pids: Vec) -> bool { let set: BTreeSet = ClaimQueue::::get() .into_iter() - .flat_map(|(_, assignments)| { - assignments - .into_iter() - .filter_map(|assignment| assignment.and_then(|pe| Some(pe.para_id()))) - }) + .flat_map(|(_, paras_entries)| paras_entries.into_iter().map(|pe| pe.assignment.para_id())) .collect(); pids.into_iter().all(|pid| set.contains(&pid)) } -pub(crate) fn availability_cores_contains_para_ids(pids: Vec) -> bool { +fn availability_cores_contains_para_ids(pids: Vec) -> bool { let set: BTreeSet = AvailabilityCores::::get() .into_iter() .filter_map(|core| match core { @@ -158,6 +144,14 @@ pub(crate) fn availability_cores_contains_para_ids(pids: Vec) pids.into_iter().all(|pid| set.contains(&pid)) } +/// Internal access to entries at the top of the claim queue. +fn scheduled_entries() -> impl Iterator>)> { + let claimqueue = ClaimQueue::::get(); + claimqueue + .into_iter() + .filter_map(|(core_idx, v)| v.front().map(|e| (core_idx, e.clone()))) +} + #[test] fn claimqueue_ttl_drop_fn_works() { let mut config = default_config(); @@ -169,13 +163,14 @@ fn claimqueue_ttl_drop_fn_works() { let mut now = 10; new_test_ext(genesis_config).execute_with(|| { - assert!(default_config().on_demand_ttl == 5); + let assignment_provider_ttl = MockAssigner::get_provider_config(CoreIndex::from(0)).ttl; + assert!(assignment_provider_ttl == 5); // Register and run to a blockheight where the para is in a valid state. - schedule_blank_para(para_id, ParaKind::Parathread); - run_to_block(10, |n| if n == 10 { Some(Default::default()) } else { None }); + schedule_blank_para(para_id); + run_to_block(now, |n| if n == now { Some(Default::default()) } else { None }); // Add a claim on core 0 with a ttl in the past. - let paras_entry = ParasEntry::new(Assignment::new(para_id), now - 5); + let paras_entry = ParasEntry::new(Assignment::Bulk(para_id), now - 5 as u32); Scheduler::add_to_claimqueue(core_idx, paras_entry.clone()); // Claim is in queue prior to call. @@ -186,7 +181,7 @@ fn claimqueue_ttl_drop_fn_works() { assert!(!claimqueue_contains_para_ids::(vec![para_id])); // Add a claim on core 0 with a ttl in the future (15). - let paras_entry = ParasEntry::new(Assignment::new(para_id), now + 5); + let paras_entry = ParasEntry::new(Assignment::Bulk(para_id), now + 5); Scheduler::add_to_claimqueue(core_idx, paras_entry.clone()); // Claim is in queue post call. @@ -201,7 +196,7 @@ fn claimqueue_ttl_drop_fn_works() { assert!(!claimqueue_contains_para_ids::(vec![para_id])); // Add a claim on core 0 with a ttl == now (16) - let paras_entry = ParasEntry::new(Assignment::new(para_id), now); + let paras_entry = ParasEntry::new(Assignment::Bulk(para_id), now); Scheduler::add_to_claimqueue(core_idx, paras_entry.clone()); // Claim is in queue post call. @@ -215,8 +210,8 @@ fn claimqueue_ttl_drop_fn_works() { Scheduler::drop_expired_claims_from_claimqueue(); // Add a claim on core 0 with a ttl == now (17) - let paras_entry_non_expired = ParasEntry::new(Assignment::new(para_id), now); - let paras_entry_expired = ParasEntry::new(Assignment::new(para_id), now - 2); + let paras_entry_non_expired = ParasEntry::new(Assignment::Bulk(para_id), now); + let paras_entry_expired = ParasEntry::new(Assignment::Bulk(para_id), now - 2); // ttls = [17, 15, 17] Scheduler::add_to_claimqueue(core_idx, paras_entry_non_expired.clone()); Scheduler::add_to_claimqueue(core_idx, paras_entry_expired.clone()); @@ -224,18 +219,10 @@ fn claimqueue_ttl_drop_fn_works() { let cq = Scheduler::claimqueue(); assert!(cq.get(&core_idx).unwrap().len() == 3); - // Add claims to on demand assignment provider. - let assignment = Assignment::new(para_id); + // Add a claim to the test assignment provider. + let assignment = Assignment::Bulk(para_id); - assert_ok!(OnDemandAssigner::add_on_demand_assignment( - assignment.clone(), - QueuePushDirection::Back - )); - - assert_ok!(OnDemandAssigner::add_on_demand_assignment( - assignment, - QueuePushDirection::Back - )); + MockAssigner::add_test_assignment(assignment.clone()); // Drop expired claim. Scheduler::drop_expired_claims_from_claimqueue(); @@ -248,58 +235,25 @@ fn claimqueue_ttl_drop_fn_works() { // The first 2 claims in the queue should have a ttl of 17, // being the ones set up prior in this test as claims 1 and 3. // The third claim is popped from the assignment provider and - // has a new ttl set by the scheduler of now + config.on_demand_ttl. - // ttls = [17, 17, 22] + // has a new ttl set by the scheduler of now + + // assignment_provider_ttl. ttls = [17, 17, 22] assert!(cqc.iter().enumerate().all(|(index, entry)| { match index { - 0 | 1 => return entry.clone().unwrap().ttl == 17, - 2 => return entry.clone().unwrap().ttl == 22, - _ => return false, + 0 | 1 => entry.clone().ttl == 17, + 2 => entry.clone().ttl == 22, + _ => false, } })) }); } -// Pretty useless here. Should be on parathread assigner... if at all -#[test] -fn add_parathread_claim_works() { - let genesis_config = genesis_config(&default_config()); - - let thread_id = ParaId::from(10); - let core_index = CoreIndex::from(0); - let entry_ttl = 10_000; - - new_test_ext(genesis_config).execute_with(|| { - schedule_blank_para(thread_id, ParaKind::Parathread); - - assert!(!Paras::is_parathread(thread_id)); - - run_to_block(10, |n| if n == 10 { Some(Default::default()) } else { None }); - - assert!(Paras::is_parathread(thread_id)); - - let pe = ParasEntry::new(Assignment::new(thread_id), entry_ttl); - Scheduler::add_to_claimqueue(core_index, pe.clone()); - - let cq = Scheduler::claimqueue(); - assert_eq!(Scheduler::claimqueue_len(), 1); - assert_eq!(*(cq.get(&core_index).unwrap().front().unwrap()), Some(pe)); - }) -} - #[test] fn session_change_shuffles_validators() { let genesis_config = genesis_config(&default_config()); - assert_eq!(default_config().on_demand_cores, 3); new_test_ext(genesis_config).execute_with(|| { - let chain_a = ParaId::from(1_u32); - let chain_b = ParaId::from(2_u32); - - // ensure that we have 5 groups by registering 2 parachains. - schedule_blank_para(chain_a, ParaKind::Parachain); - schedule_blank_para(chain_b, ParaKind::Parachain); - + // Need five cores for this test + MockAssigner::set_core_count(5); run_to_block(1, |number| match number { 1 => Some(SessionChangeNotification { new_config: default_config(), @@ -336,7 +290,6 @@ fn session_change_shuffles_validators() { fn session_change_takes_only_max_per_core() { let config = { let mut config = default_config(); - config.on_demand_cores = 0; config.max_validators_per_core = Some(1); config }; @@ -344,14 +297,8 @@ fn session_change_takes_only_max_per_core() { let genesis_config = genesis_config(&config); new_test_ext(genesis_config).execute_with(|| { - let chain_a = ParaId::from(1_u32); - let chain_b = ParaId::from(2_u32); - let chain_c = ParaId::from(3_u32); - - // ensure that we have 5 groups by registering 2 parachains. - schedule_blank_para(chain_a, ParaKind::Parachain); - schedule_blank_para(chain_b, ParaKind::Parachain); - schedule_blank_para(chain_c, ParaKind::Parathread); + // Simulate 2 cores between all usage types + MockAssigner::set_core_count(2); run_to_block(1, |number| match number { 1 => Some(SessionChangeNotification { @@ -374,7 +321,7 @@ fn session_change_takes_only_max_per_core() { let groups = ValidatorGroups::::get(); assert_eq!(groups.len(), 7); - // Every validator gets its own group, even though there are 2 paras. + // Every validator gets its own group, even though there are 2 cores. for i in 0..7 { assert_eq!(groups[i].len(), 1); } @@ -385,31 +332,25 @@ fn session_change_takes_only_max_per_core() { fn fill_claimqueue_fills() { let genesis_config = genesis_config(&default_config()); - let lookahead = genesis_config.configuration.config.scheduling_lookahead as usize; - let chain_a = ParaId::from(1_u32); - let chain_b = ParaId::from(2_u32); - - let thread_a = ParaId::from(3_u32); - let thread_b = ParaId::from(4_u32); - let thread_c = ParaId::from(5_u32); + let para_a = ParaId::from(3_u32); + let para_b = ParaId::from(4_u32); + let para_c = ParaId::from(5_u32); - let assignment_a = Assignment { para_id: thread_a }; - let assignment_b = Assignment { para_id: thread_b }; - let assignment_c = Assignment { para_id: thread_c }; + let assignment_a = Assignment::Bulk(para_a); + let assignment_b = Assignment::Bulk(para_b); + let assignment_c = Assignment::Bulk(para_c); new_test_ext(genesis_config).execute_with(|| { - assert_eq!(default_config().on_demand_cores, 3); + MockAssigner::set_core_count(2); + let AssignmentProviderConfig { ttl: config_ttl, .. } = + MockAssigner::get_provider_config(CoreIndex(0)); - // register 2 lease holding parachains - schedule_blank_para(chain_a, ParaKind::Parachain); - schedule_blank_para(chain_b, ParaKind::Parachain); + // Add 3 paras + schedule_blank_para(para_a); + schedule_blank_para(para_b); + schedule_blank_para(para_c); - // and 3 parathreads (on-demand parachains) - schedule_blank_para(thread_a, ParaKind::Parathread); - schedule_blank_para(thread_b, ParaKind::Parathread); - schedule_blank_para(thread_c, ParaKind::Parathread); - - // start a new session to activate, 5 validators for 5 cores. + // start a new session to activate, 3 validators for 3 cores. run_to_block(1, |number| match number { 1 => Some(SessionChangeNotification { new_config: default_config(), @@ -417,107 +358,47 @@ fn fill_claimqueue_fills() { ValidatorId::from(Sr25519Keyring::Alice.public()), ValidatorId::from(Sr25519Keyring::Bob.public()), ValidatorId::from(Sr25519Keyring::Charlie.public()), - ValidatorId::from(Sr25519Keyring::Dave.public()), - ValidatorId::from(Sr25519Keyring::Eve.public()), ], ..Default::default() }), _ => None, }); - { - assert_eq!(Scheduler::claimqueue_len(), 2 * lookahead); - let scheduled: BTreeMap<_, _> = Scheduler::scheduled_entries().collect(); - - // Cannot assert on indices anymore as they depend on the assignment providers - assert!(claimqueue_contains_para_ids::(vec![chain_a, chain_b])); - - assert_eq!( - scheduled.get(&CoreIndex(0)).unwrap(), - &ParasEntry { - assignment: Assignment { para_id: chain_a }, - availability_timeouts: 0, - ttl: 6 - }, - ); - - assert_eq!( - scheduled.get(&CoreIndex(1)).unwrap(), - &ParasEntry { - assignment: Assignment { para_id: chain_b }, - availability_timeouts: 0, - ttl: 6 - }, - ); - } - - // add a couple of parathread assignments. - assert_ok!(OnDemandAssigner::add_on_demand_assignment( - assignment_a, - QueuePushDirection::Back - )); - assert_ok!(OnDemandAssigner::add_on_demand_assignment( - assignment_b, - QueuePushDirection::Back - )); - assert_ok!(OnDemandAssigner::add_on_demand_assignment( - assignment_c, - QueuePushDirection::Back - )); + // add some para assignments. + MockAssigner::add_test_assignment(assignment_a.clone()); + MockAssigner::add_test_assignment(assignment_b.clone()); + MockAssigner::add_test_assignment(assignment_c.clone()); run_to_block(2, |_| None); - // cores 0 and 1 should be occupied. mark them as such. - Scheduler::occupied( - vec![(CoreIndex(0), chain_a), (CoreIndex(1), chain_b)].into_iter().collect(), - ); - - run_to_block(3, |_| None); { - assert_eq!(Scheduler::claimqueue_len(), 5); - let scheduled: BTreeMap<_, _> = Scheduler::scheduled_entries().collect(); - - assert_eq!( - scheduled.get(&CoreIndex(0)).unwrap(), - &ParasEntry { - assignment: Assignment { para_id: chain_a }, - availability_timeouts: 0, - ttl: 6 - }, - ); - assert_eq!( - scheduled.get(&CoreIndex(1)).unwrap(), - &ParasEntry { - assignment: Assignment { para_id: chain_b }, - availability_timeouts: 0, - ttl: 6 - }, - ); + assert_eq!(Scheduler::claimqueue_len(), 3); + let scheduled: BTreeMap<_, _> = scheduled_entries().collect(); // Was added a block later, note the TTL. assert_eq!( - scheduled.get(&CoreIndex(2)).unwrap(), + scheduled.get(&CoreIndex(0)).unwrap(), &ParasEntry { - assignment: Assignment { para_id: thread_a }, + assignment: assignment_a.clone(), availability_timeouts: 0, - ttl: 7 + ttl: 2 + config_ttl }, ); - // Sits on the same core as `thread_a` + // Sits on the same core as `para_a` assert_eq!( - Scheduler::claimqueue().get(&CoreIndex(2)).unwrap()[1], - Some(ParasEntry { - assignment: Assignment { para_id: thread_b }, + Scheduler::claimqueue().get(&CoreIndex(0)).unwrap()[1], + ParasEntry { + assignment: assignment_b.clone(), availability_timeouts: 0, - ttl: 7 - }) + ttl: 2 + config_ttl + } ); assert_eq!( - scheduled.get(&CoreIndex(3)).unwrap(), + scheduled.get(&CoreIndex(1)).unwrap(), &ParasEntry { - assignment: Assignment { para_id: thread_c }, + assignment: assignment_c.clone(), availability_timeouts: 0, - ttl: 7 + ttl: 2 + config_ttl }, ); } @@ -532,36 +413,29 @@ fn schedule_schedules_including_just_freed() { config.scheduling_lookahead = 1; let genesis_config = genesis_config(&config); - let chain_a = ParaId::from(1_u32); - let chain_b = ParaId::from(2_u32); - - let thread_a = ParaId::from(3_u32); - let thread_b = ParaId::from(4_u32); - let thread_c = ParaId::from(5_u32); - let thread_d = ParaId::from(6_u32); - let thread_e = ParaId::from(7_u32); + let para_a = ParaId::from(3_u32); + let para_b = ParaId::from(4_u32); + let para_c = ParaId::from(5_u32); + let para_d = ParaId::from(6_u32); + let para_e = ParaId::from(7_u32); - let assignment_a = Assignment { para_id: thread_a }; - let assignment_b = Assignment { para_id: thread_b }; - let assignment_c = Assignment { para_id: thread_c }; - let assignment_d = Assignment { para_id: thread_d }; - let assignment_e = Assignment { para_id: thread_e }; + let assignment_a = Assignment::Bulk(para_a); + let assignment_b = Assignment::Bulk(para_b); + let assignment_c = Assignment::Bulk(para_c); + let assignment_d = Assignment::Bulk(para_d); + let assignment_e = Assignment::Bulk(para_e); new_test_ext(genesis_config).execute_with(|| { - assert_eq!(default_config().on_demand_cores, 3); + MockAssigner::set_core_count(3); - // register 2 lease holding parachains - schedule_blank_para(chain_a, ParaKind::Parachain); - schedule_blank_para(chain_b, ParaKind::Parachain); + // add 5 paras + schedule_blank_para(para_a); + schedule_blank_para(para_b); + schedule_blank_para(para_c); + schedule_blank_para(para_d); + schedule_blank_para(para_e); - // and 5 parathreads (on-demand parachains) - schedule_blank_para(thread_a, ParaKind::Parathread); - schedule_blank_para(thread_b, ParaKind::Parathread); - schedule_blank_para(thread_c, ParaKind::Parathread); - schedule_blank_para(thread_d, ParaKind::Parathread); - schedule_blank_para(thread_e, ParaKind::Parathread); - - // start a new session to activate, 5 validators for 5 cores. + // start a new session to activate, 3 validators for 3 cores. run_to_block(1, |number| match number { 1 => Some(SessionChangeNotification { new_config: default_config(), @@ -569,153 +443,113 @@ fn schedule_schedules_including_just_freed() { ValidatorId::from(Sr25519Keyring::Alice.public()), ValidatorId::from(Sr25519Keyring::Bob.public()), ValidatorId::from(Sr25519Keyring::Charlie.public()), - ValidatorId::from(Sr25519Keyring::Dave.public()), - ValidatorId::from(Sr25519Keyring::Eve.public()), ], ..Default::default() }), _ => None, }); - // add a couple of parathread claims now that the parathreads are live. - assert_ok!(OnDemandAssigner::add_on_demand_assignment( - assignment_a, - QueuePushDirection::Back - )); - assert_ok!(OnDemandAssigner::add_on_demand_assignment( - assignment_c, - QueuePushDirection::Back - )); + // add a couple of para claims now that paras are live + MockAssigner::add_test_assignment(assignment_a.clone()); + MockAssigner::add_test_assignment(assignment_c.clone()); let mut now = 2; run_to_block(now, |_| None); - assert_eq!(Scheduler::scheduled_paras().collect::>().len(), 4); + assert_eq!(Scheduler::scheduled_paras().collect::>().len(), 2); - // cores 0, 1, 2, and 3 should be occupied. mark them as such. + // cores 0, 1 should be occupied. mark them as such. let mut occupied_map: BTreeMap = BTreeMap::new(); - occupied_map.insert(CoreIndex(0), chain_a); - occupied_map.insert(CoreIndex(1), chain_b); - occupied_map.insert(CoreIndex(2), thread_a); - occupied_map.insert(CoreIndex(3), thread_c); + occupied_map.insert(CoreIndex(0), para_a); + occupied_map.insert(CoreIndex(1), para_c); Scheduler::occupied(occupied_map); { let cores = AvailabilityCores::::get(); - // cores 0, 1, 2, and 3 are all `CoreOccupied::Paras(ParasEntry...)` + // cores 0, 1 are `CoreOccupied::Paras(ParasEntry...)` assert!(cores[0] != CoreOccupied::Free); assert!(cores[1] != CoreOccupied::Free); - assert!(cores[2] != CoreOccupied::Free); - assert!(cores[3] != CoreOccupied::Free); - // core 4 is free - assert!(cores[4] == CoreOccupied::Free); + // core 2 is free + assert!(cores[2] == CoreOccupied::Free); assert!(Scheduler::scheduled_paras().collect::>().is_empty()); - // All core index entries in the claimqueue should have `None` in them. - Scheduler::claimqueue().iter().for_each(|(_core_idx, core_queue)| { - assert!(core_queue.iter().all(|claim| claim.is_none())) - }) + // All `core_queue`s should be empty + Scheduler::claimqueue() + .iter() + .for_each(|(_core_idx, core_queue)| assert!(core_queue.len() == 0)) } - // add a couple more parathread claims - the claim on `b` will go to the 3rd parathread core - // (4) and the claim on `d` will go back to the 1st parathread core (2). The claim on `e` - // then will go for core `3`. - assert_ok!(OnDemandAssigner::add_on_demand_assignment( - assignment_b, - QueuePushDirection::Back - )); - assert_ok!(OnDemandAssigner::add_on_demand_assignment( - assignment_d, - QueuePushDirection::Back - )); - assert_ok!(OnDemandAssigner::add_on_demand_assignment( - assignment_e.clone(), - QueuePushDirection::Back - )); + // add a couple more para claims - the claim on `b` will go to the 3rd core + // (2) and the claim on `d` will go back to the 1st para core (0). The claim on `e` + // then will go for core `1`. + MockAssigner::add_test_assignment(assignment_b.clone()); + MockAssigner::add_test_assignment(assignment_d.clone()); + MockAssigner::add_test_assignment(assignment_e.clone()); now = 3; run_to_block(now, |_| None); { - let scheduled: BTreeMap<_, _> = Scheduler::scheduled_entries().collect(); + let scheduled: BTreeMap<_, _> = scheduled_entries().collect(); - // cores 0 and 1 are occupied by lease holding parachains. cores 2 and 3 are occupied by - // on-demand parachain claims. core 4 was free. + // cores 0 and 1 are occupied by claims. core 2 was free. assert_eq!(scheduled.len(), 1); assert_eq!( - scheduled.get(&CoreIndex(4)).unwrap(), + scheduled.get(&CoreIndex(2)).unwrap(), &ParasEntry { - assignment: Assignment { para_id: thread_b }, + assignment: Assignment::Bulk(para_b), availability_timeouts: 0, ttl: 8 }, ); } - // now note that cores 0, 2, and 3 were freed. + // now note that cores 0 and 1 were freed. let just_updated: BTreeMap = vec![ (CoreIndex(0), FreedReason::Concluded), - (CoreIndex(2), FreedReason::Concluded), - (CoreIndex(3), FreedReason::TimedOut), // should go back on queue. + (CoreIndex(1), FreedReason::TimedOut), // should go back on queue. ] .into_iter() .collect(); - Scheduler::update_claimqueue(just_updated, now); + Scheduler::free_cores_and_fill_claimqueue(just_updated, now); { - let scheduled: BTreeMap<_, _> = Scheduler::scheduled_entries().collect(); + let scheduled: BTreeMap<_, _> = scheduled_entries().collect(); - // 1 thing scheduled before, + 3 cores freed. - assert_eq!(scheduled.len(), 4); + // 1 thing scheduled before, + 2 cores freed. + assert_eq!(scheduled.len(), 3); assert_eq!( scheduled.get(&CoreIndex(0)).unwrap(), &ParasEntry { - assignment: Assignment { para_id: chain_a }, - availability_timeouts: 0, - ttl: 8 - }, - ); - assert_eq!( - scheduled.get(&CoreIndex(2)).unwrap(), - &ParasEntry { - assignment: Assignment { para_id: thread_d }, + assignment: Assignment::Bulk(para_d), availability_timeouts: 0, ttl: 8 }, ); - // Although C was descheduled, the core `4` was occupied so C goes back to the queue. + // Although C was descheduled, the core `2` was occupied so C goes back to the queue. assert_eq!( - scheduled.get(&CoreIndex(3)).unwrap(), + scheduled.get(&CoreIndex(1)).unwrap(), &ParasEntry { - assignment: Assignment { para_id: thread_c }, + assignment: Assignment::Bulk(para_c), availability_timeouts: 1, ttl: 8 }, ); assert_eq!( - scheduled.get(&CoreIndex(4)).unwrap(), + scheduled.get(&CoreIndex(2)).unwrap(), &ParasEntry { - assignment: Assignment { para_id: thread_b }, + assignment: Assignment::Bulk(para_b), availability_timeouts: 0, ttl: 8 }, ); - // The only assignment yet to be popped on to the claim queue is `thread_e`. - // This is due to `thread_c` timing out. - let order_queue = OnDemandAssigner::get_queue(); - assert!(order_queue.len() == 1); - assert!(order_queue[0] == assignment_e); - - // Chain B's core was not marked concluded or timed out, it should be on an - // availability core - assert!(availability_cores_contains_para_ids::(vec![chain_b])); - // Thread A claim should have been wiped, but thread C claim should remain. - assert!(!claimqueue_contains_para_ids::(vec![thread_a])); - assert!(claimqueue_contains_para_ids::(vec![thread_c])); - assert!(!availability_cores_contains_para_ids::(vec![thread_a, thread_c])); + // Para A claim should have been wiped, but para C claim should remain. + assert!(!claimqueue_contains_para_ids::(vec![para_a])); + assert!(claimqueue_contains_para_ids::(vec![para_c])); + assert!(!availability_cores_contains_para_ids::(vec![para_a, para_c])); } }); } @@ -726,28 +560,35 @@ fn schedule_clears_availability_cores() { config.scheduling_lookahead = 1; let genesis_config = genesis_config(&config); - let chain_a = ParaId::from(1_u32); - let chain_b = ParaId::from(2_u32); - let chain_c = ParaId::from(3_u32); + let para_a = ParaId::from(1_u32); + let para_b = ParaId::from(2_u32); + let para_c = ParaId::from(3_u32); + + let assignment_a = Assignment::Bulk(para_a); + let assignment_b = Assignment::Bulk(para_b); + let assignment_c = Assignment::Bulk(para_c); new_test_ext(genesis_config).execute_with(|| { - assert_eq!(default_config().on_demand_cores, 3); + MockAssigner::set_core_count(3); + + // register 3 paras + schedule_blank_para(para_a); + schedule_blank_para(para_b); + schedule_blank_para(para_c); - // register 3 parachains - schedule_blank_para(chain_a, ParaKind::Parachain); - schedule_blank_para(chain_b, ParaKind::Parachain); - schedule_blank_para(chain_c, ParaKind::Parachain); + // Adding assignments then running block to populate claim queue + MockAssigner::add_test_assignment(assignment_a.clone()); + MockAssigner::add_test_assignment(assignment_b.clone()); + MockAssigner::add_test_assignment(assignment_c.clone()); - // start a new session to activate, 5 validators for 5 cores. + // start a new session to activate, 3 validators for 3 cores. run_to_block(1, |number| match number { 1 => Some(SessionChangeNotification { - new_config: default_config(), + new_config: config.clone(), validators: vec![ ValidatorId::from(Sr25519Keyring::Alice.public()), ValidatorId::from(Sr25519Keyring::Bob.public()), ValidatorId::from(Sr25519Keyring::Charlie.public()), - ValidatorId::from(Sr25519Keyring::Dave.public()), - ValidatorId::from(Sr25519Keyring::Eve.public()), ], ..Default::default() }), @@ -760,7 +601,7 @@ fn schedule_clears_availability_cores() { // cores 0, 1, and 2 should be occupied. mark them as such. Scheduler::occupied( - vec![(CoreIndex(0), chain_a), (CoreIndex(1), chain_b), (CoreIndex(2), chain_c)] + vec![(CoreIndex(0), para_a), (CoreIndex(1), para_b), (CoreIndex(2), para_c)] .into_iter() .collect(), ); @@ -772,9 +613,16 @@ fn schedule_clears_availability_cores() { assert_eq!(cores[1].is_free(), false); assert_eq!(cores[2].is_free(), false); - assert!(claimqueue_contains_only_none()); + // All `core_queue`s should be empty + Scheduler::claimqueue() + .iter() + .for_each(|(_core_idx, core_queue)| assert!(core_queue.len() == 0)) } + // Add more assignments + MockAssigner::add_test_assignment(assignment_a.clone()); + MockAssigner::add_test_assignment(assignment_c.clone()); + run_to_block(3, |_| None); // now note that cores 0 and 2 were freed. @@ -786,20 +634,18 @@ fn schedule_clears_availability_cores() { ); { - let claimqueue = Scheduler::claimqueue(); + let claimqueue = ClaimQueue::::get(); let claimqueue_0 = claimqueue.get(&CoreIndex(0)).unwrap().clone(); let claimqueue_2 = claimqueue.get(&CoreIndex(2)).unwrap().clone(); let entry_ttl = 8; assert_eq!(claimqueue_0.len(), 1); assert_eq!(claimqueue_2.len(), 1); - assert_eq!( - claimqueue_0, - vec![Some(ParasEntry::new(Assignment::new(chain_a), entry_ttl))], - ); - assert_eq!( - claimqueue_2, - vec![Some(ParasEntry::new(Assignment::new(chain_c), entry_ttl))], - ); + let queue_0_expectation: VecDeque> = + vec![ParasEntry::new(assignment_a, entry_ttl as u32)].into_iter().collect(); + let queue_2_expectation: VecDeque> = + vec![ParasEntry::new(assignment_c, entry_ttl as u32)].into_iter().collect(); + assert_eq!(claimqueue_0, queue_0_expectation); + assert_eq!(claimqueue_2, queue_2_expectation); // The freed cores should be `Free` in `AvailabilityCores`. let cores = AvailabilityCores::::get(); @@ -813,32 +659,28 @@ fn schedule_clears_availability_cores() { fn schedule_rotates_groups() { let config = { let mut config = default_config(); - - // make sure on demand requests don't retry-out - config.on_demand_retries = config.group_rotation_frequency * 3; - config.on_demand_cores = 2; config.scheduling_lookahead = 1; config }; let rotation_frequency = config.group_rotation_frequency; - let on_demand_cores = config.on_demand_cores; + let on_demand_cores = 2; let genesis_config = genesis_config(&config); - let thread_a = ParaId::from(1_u32); - let thread_b = ParaId::from(2_u32); + let para_a = ParaId::from(1_u32); + let para_b = ParaId::from(2_u32); - let assignment_a = Assignment { para_id: thread_a }; - let assignment_b = Assignment { para_id: thread_b }; + let assignment_a = Assignment::Bulk(para_a); + let assignment_b = Assignment::Bulk(para_b); new_test_ext(genesis_config).execute_with(|| { - assert_eq!(default_config().on_demand_cores, 3); + MockAssigner::set_core_count(on_demand_cores); - schedule_blank_para(thread_a, ParaKind::Parathread); - schedule_blank_para(thread_b, ParaKind::Parathread); + schedule_blank_para(para_a); + schedule_blank_para(para_b); - // start a new session to activate, 5 validators for 5 cores. + // start a new session to activate, 2 validators for 2 cores. run_to_block(1, |number| match number { 1 => Some(SessionChangeNotification { new_config: config.clone(), @@ -854,14 +696,8 @@ fn schedule_rotates_groups() { let session_start_block = Scheduler::session_start_block(); assert_eq!(session_start_block, 1); - assert_ok!(OnDemandAssigner::add_on_demand_assignment( - assignment_a, - QueuePushDirection::Back - )); - assert_ok!(OnDemandAssigner::add_on_demand_assignment( - assignment_b, - QueuePushDirection::Back - )); + MockAssigner::add_test_assignment(assignment_a.clone()); + MockAssigner::add_test_assignment(assignment_b.clone()); let mut now = 2; run_to_block(now, |_| None); @@ -909,16 +745,20 @@ fn on_demand_claims_are_pruned_after_timing_out() { let max_retries = 20; let mut config = default_config(); config.scheduling_lookahead = 1; - config.on_demand_cores = 2; - config.on_demand_retries = max_retries; let genesis_config = genesis_config(&config); - let thread_a = ParaId::from(1_u32); + let para_a = ParaId::from(1_u32); - let assignment_a = Assignment { para_id: thread_a }; + let assignment_a = Assignment::Bulk(para_a); new_test_ext(genesis_config).execute_with(|| { - schedule_blank_para(thread_a, ParaKind::Parathread); + MockAssigner::set_core_count(2); + // Need more timeouts for this test + MockAssigner::set_assignment_provider_config(AssignmentProviderConfig { + max_availability_timeouts: max_retries, + ttl: BlockNumber::from(5u32), + }); + schedule_blank_para(para_a); // #1 let mut now = 1; @@ -934,23 +774,20 @@ fn on_demand_claims_are_pruned_after_timing_out() { _ => None, }); - assert_ok!(OnDemandAssigner::add_on_demand_assignment( - assignment_a.clone(), - QueuePushDirection::Back - )); + MockAssigner::add_test_assignment(assignment_a.clone()); // #2 now += 1; run_to_block(now, |_| None); assert_eq!(Scheduler::claimqueue().len(), 1); // ParaId a is in the claimqueue. - assert!(claimqueue_contains_para_ids::(vec![thread_a])); + assert!(claimqueue_contains_para_ids::(vec![para_a])); - Scheduler::occupied(vec![(CoreIndex(0), thread_a)].into_iter().collect()); + Scheduler::occupied(vec![(CoreIndex(0), para_a)].into_iter().collect()); // ParaId a is no longer in the claimqueue. - assert!(!claimqueue_contains_para_ids::(vec![thread_a])); + assert!(!claimqueue_contains_para_ids::(vec![para_a])); // It is in availability cores. - assert!(availability_cores_contains_para_ids::(vec![thread_a])); + assert!(availability_cores_contains_para_ids::(vec![para_a])); // #3 now += 1; @@ -966,36 +803,32 @@ fn on_demand_claims_are_pruned_after_timing_out() { ] .into_iter() .collect(); - Scheduler::update_claimqueue(just_updated, now); + Scheduler::free_cores_and_fill_claimqueue(just_updated, now); // ParaId a exists in the claim queue until max_retries is reached. if n < max_retries + now { - assert!(claimqueue_contains_para_ids::(vec![thread_a])); + assert!(claimqueue_contains_para_ids::(vec![para_a])); } else { - assert!(!claimqueue_contains_para_ids::(vec![thread_a])); + assert!(!claimqueue_contains_para_ids::(vec![para_a])); } let core_assignments = Scheduler::scheduled_paras().collect(); - // Occupy the cores based on the result of update_claimqueue. Scheduler::occupied(core_assignments); } // ParaId a does not exist in the claimqueue/availability_cores after // threshold has been reached. - assert!(!claimqueue_contains_para_ids::(vec![thread_a])); - assert!(!availability_cores_contains_para_ids::(vec![thread_a])); + assert!(!claimqueue_contains_para_ids::(vec![para_a])); + assert!(!availability_cores_contains_para_ids::(vec![para_a])); // #25 now += max_retries + 2; // Add assignment back to the mix. - assert_ok!(OnDemandAssigner::add_on_demand_assignment( - assignment_a.clone(), - QueuePushDirection::Back - )); + MockAssigner::add_test_assignment(assignment_a.clone()); run_to_block(now, |_| None); - assert!(claimqueue_contains_para_ids::(vec![thread_a])); + assert!(claimqueue_contains_para_ids::(vec![para_a])); // #26 now += 1; @@ -1017,24 +850,23 @@ fn on_demand_claims_are_pruned_after_timing_out() { } } - Scheduler::update_claimqueue(just_updated, now); + Scheduler::free_cores_and_fill_claimqueue(just_updated, now); // ParaId a exists in the claim queue until groups are rotated. if n < 31 { - assert!(claimqueue_contains_para_ids::(vec![thread_a])); + assert!(claimqueue_contains_para_ids::(vec![para_a])); } else { - assert!(!claimqueue_contains_para_ids::(vec![thread_a])); + assert!(!claimqueue_contains_para_ids::(vec![para_a])); } let core_assignments = Scheduler::scheduled_paras().collect(); - // Occupy the cores based on the result of update_claimqueue. Scheduler::occupied(core_assignments); } // ParaId a does not exist in the claimqueue/availability_cores after // being concluded - assert!(!claimqueue_contains_para_ids::(vec![thread_a])); - assert!(!availability_cores_contains_para_ids::(vec![thread_a])); + assert!(!claimqueue_contains_para_ids::(vec![para_a])); + assert!(!availability_cores_contains_para_ids::(vec![para_a])); }); } @@ -1047,40 +879,7 @@ fn availability_predicate_works() { assert!(paras_availability_period < group_rotation_frequency); - let chain_a = ParaId::from(1_u32); - let thread_a = ParaId::from(2_u32); - new_test_ext(genesis_config).execute_with(|| { - schedule_blank_para(chain_a, ParaKind::Parachain); - schedule_blank_para(thread_a, ParaKind::Parathread); - - // start a new session with our chain registered. - run_to_block(1, |number| match number { - 1 => Some(SessionChangeNotification { - new_config: default_config(), - validators: vec![ - ValidatorId::from(Sr25519Keyring::Alice.public()), - ValidatorId::from(Sr25519Keyring::Bob.public()), - ValidatorId::from(Sr25519Keyring::Charlie.public()), - ValidatorId::from(Sr25519Keyring::Dave.public()), - ValidatorId::from(Sr25519Keyring::Eve.public()), - ], - ..Default::default() - }), - _ => None, - }); - - // assign some availability cores. - { - let entry_ttl = 10_000; - AvailabilityCores::::mutate(|cores| { - cores[0] = - CoreOccupied::Paras(ParasEntry::new(Assignment::new(chain_a), entry_ttl)); - cores[1] = - CoreOccupied::Paras(ParasEntry::new(Assignment::new(thread_a), entry_ttl)); - }); - } - run_to_block(1 + paras_availability_period, |_| None); assert!(!Scheduler::availability_timeout_check_required()); @@ -1103,29 +902,25 @@ fn availability_predicate_works() { // check the threshold is exact. assert!(!pred(would_be_timed_out + 1).timed_out); } - - run_to_block(1 + group_rotation_frequency + paras_availability_period, |_| None); }); } #[test] -fn next_up_on_available_uses_next_scheduled_or_none_for_thread() { - let mut config = default_config(); - config.on_demand_cores = 1; - - let genesis_config = genesis_config(&config); +fn next_up_on_available_uses_next_scheduled_or_none() { + let genesis_config = genesis_config(&default_config()); - let thread_a = ParaId::from(1_u32); - let thread_b = ParaId::from(2_u32); + let para_a = ParaId::from(1_u32); + let para_b = ParaId::from(2_u32); new_test_ext(genesis_config).execute_with(|| { - schedule_blank_para(thread_a, ParaKind::Parathread); - schedule_blank_para(thread_b, ParaKind::Parathread); + MockAssigner::set_core_count(1); + schedule_blank_para(para_a); + schedule_blank_para(para_b); - // start a new session to activate, 5 validators for 5 cores. + // start a new session to activate, 2 validators for 2 cores. run_to_block(1, |number| match number { 1 => Some(SessionChangeNotification { - new_config: config.clone(), + new_config: default_config(), validators: vec![ ValidatorId::from(Sr25519Keyring::Alice.public()), ValidatorId::from(Sr25519Keyring::Eve.public()), @@ -1135,18 +930,18 @@ fn next_up_on_available_uses_next_scheduled_or_none_for_thread() { _ => None, }); - let thread_entry_a = ParasEntry { - assignment: Assignment { para_id: thread_a }, - availability_timeouts: 0, - ttl: 5, + let entry_a = ParasEntry { + assignment: Assignment::Bulk(para_a), + availability_timeouts: 0 as u32, + ttl: 5 as u32, }; - let thread_entry_b = ParasEntry { - assignment: Assignment { para_id: thread_b }, - availability_timeouts: 0, - ttl: 5, + let entry_b = ParasEntry { + assignment: Assignment::Bulk(para_b), + availability_timeouts: 0 as u32, + ttl: 5 as u32, }; - Scheduler::add_to_claimqueue(CoreIndex(0), thread_entry_a.clone()); + Scheduler::add_to_claimqueue(CoreIndex(0), entry_a.clone()); run_to_block(2, |_| None); @@ -1155,22 +950,22 @@ fn next_up_on_available_uses_next_scheduled_or_none_for_thread() { assert_eq!(Scheduler::availability_cores().len(), 1); let mut map = BTreeMap::new(); - map.insert(CoreIndex(0), thread_a); + map.insert(CoreIndex(0), para_a); Scheduler::occupied(map); let cores = Scheduler::availability_cores(); match &cores[0] { - CoreOccupied::Paras(entry) => assert_eq!(entry, &thread_entry_a), - _ => panic!("with no chains, only core should be a thread core"), + CoreOccupied::Paras(entry) => assert_eq!(entry, &entry_a), + _ => panic!("There should only be one test assigner core"), } assert!(Scheduler::next_up_on_available(CoreIndex(0)).is_none()); - Scheduler::add_to_claimqueue(CoreIndex(0), thread_entry_b); + Scheduler::add_to_claimqueue(CoreIndex(0), entry_b); assert_eq!( Scheduler::next_up_on_available(CoreIndex(0)).unwrap(), - ScheduledCore { para_id: thread_b, collator: None } + ScheduledCore { para_id: para_b, collator: None } ); } }); @@ -1178,25 +973,23 @@ fn next_up_on_available_uses_next_scheduled_or_none_for_thread() { #[test] fn next_up_on_time_out_reuses_claim_if_nothing_queued() { - let mut config = default_config(); - config.on_demand_cores = 1; - - let genesis_config = genesis_config(&config); + let genesis_config = genesis_config(&default_config()); - let thread_a = ParaId::from(1_u32); - let thread_b = ParaId::from(2_u32); + let para_a = ParaId::from(1_u32); + let para_b = ParaId::from(2_u32); - let assignment_a = Assignment { para_id: thread_a }; - let assignment_b = Assignment { para_id: thread_b }; + let assignment_a = Assignment::Bulk(para_a); + let assignment_b = Assignment::Bulk(para_b); new_test_ext(genesis_config).execute_with(|| { - schedule_blank_para(thread_a, ParaKind::Parathread); - schedule_blank_para(thread_b, ParaKind::Parathread); + MockAssigner::set_core_count(1); + schedule_blank_para(para_a); + schedule_blank_para(para_b); - // start a new session to activate, 5 validators for 5 cores. + // start a new session to activate, 2 validators for 2 cores. run_to_block(1, |number| match number { 1 => Some(SessionChangeNotification { - new_config: config.clone(), + new_config: default_config(), validators: vec![ ValidatorId::from(Sr25519Keyring::Alice.public()), ValidatorId::from(Sr25519Keyring::Eve.public()), @@ -1206,10 +999,7 @@ fn next_up_on_time_out_reuses_claim_if_nothing_queued() { _ => None, }); - assert_ok!(OnDemandAssigner::add_on_demand_assignment( - assignment_a.clone(), - QueuePushDirection::Back - )); + MockAssigner::add_test_assignment(assignment_a.clone()); run_to_block(2, |_| None); @@ -1218,150 +1008,62 @@ fn next_up_on_time_out_reuses_claim_if_nothing_queued() { assert_eq!(Scheduler::availability_cores().len(), 1); let mut map = BTreeMap::new(); - map.insert(CoreIndex(0), thread_a); + map.insert(CoreIndex(0), para_a); Scheduler::occupied(map); let cores = Scheduler::availability_cores(); match cores.get(0).unwrap() { - CoreOccupied::Paras(entry) => assert_eq!(entry.assignment, assignment_a.clone()), - _ => panic!("with no chains, only core should be a thread core"), + CoreOccupied::Paras(entry) => { + assert_eq!(entry.assignment, assignment_a.clone()); + }, + _ => panic!("There should only be a single test assigner core"), } // There's nothing more to pop for core 0 from the assignment provider. - assert!( - OnDemandAssigner::pop_assignment_for_core(CoreIndex(0), Some(thread_a)).is_none() - ); + assert!(MockAssigner::pop_assignment_for_core(CoreIndex(0)).is_none()); assert_eq!( Scheduler::next_up_on_time_out(CoreIndex(0)).unwrap(), - ScheduledCore { para_id: thread_a, collator: None } + ScheduledCore { para_id: para_a, collator: None } ); - assert_ok!(OnDemandAssigner::add_on_demand_assignment( - assignment_b.clone(), - QueuePushDirection::Back - )); + MockAssigner::add_test_assignment(assignment_b.clone()); // Pop assignment_b into the claimqueue - Scheduler::update_claimqueue(BTreeMap::new(), 2); + Scheduler::free_cores_and_fill_claimqueue(BTreeMap::new(), 2); //// Now that there is an earlier next-up, we use that. assert_eq!( Scheduler::next_up_on_available(CoreIndex(0)).unwrap(), - ScheduledCore { para_id: thread_b, collator: None } + ScheduledCore { para_id: para_b, collator: None } ); } }); } #[test] -fn next_up_on_available_is_parachain_always() { +fn session_change_requires_reschedule_dropping_removed_paras() { let mut config = default_config(); - config.on_demand_cores = 0; + config.scheduling_lookahead = 1; let genesis_config = genesis_config(&config); - let chain_a = ParaId::from(1_u32); - - new_test_ext(genesis_config).execute_with(|| { - schedule_blank_para(chain_a, ParaKind::Parachain); - - // start a new session to activate, 5 validators for 5 cores. - run_to_block(1, |number| match number { - 1 => Some(SessionChangeNotification { - new_config: config.clone(), - validators: vec![ - ValidatorId::from(Sr25519Keyring::Alice.public()), - ValidatorId::from(Sr25519Keyring::Eve.public()), - ], - ..Default::default() - }), - _ => None, - }); - - run_to_block(2, |_| None); - - { - assert_eq!(Scheduler::claimqueue().len(), 1); - assert_eq!(Scheduler::availability_cores().len(), 1); - - Scheduler::occupied(vec![(CoreIndex(0), chain_a)].into_iter().collect()); - - let cores = Scheduler::availability_cores(); - match &cores[0] { - CoreOccupied::Paras(pe) if pe.para_id() == chain_a => {}, - _ => panic!("with no threads, only core should be a chain core"), - } - // Now that there is an earlier next-up, we use that. - assert_eq!( - Scheduler::next_up_on_available(CoreIndex(0)).unwrap(), - ScheduledCore { para_id: chain_a, collator: None } - ); - } - }); -} + let para_a = ParaId::from(1_u32); + let para_b = ParaId::from(2_u32); -#[test] -fn next_up_on_time_out_is_parachain_always() { - let mut config = default_config(); - config.on_demand_cores = 0; - - let genesis_config = genesis_config(&config); - - let chain_a = ParaId::from(1_u32); + let assignment_a = Assignment::Bulk(para_a); + let assignment_b = Assignment::Bulk(para_b); new_test_ext(genesis_config).execute_with(|| { - schedule_blank_para(chain_a, ParaKind::Parachain); - - // start a new session to activate, 5 validators for 5 cores. - run_to_block(1, |number| match number { - 1 => Some(SessionChangeNotification { - new_config: config.clone(), - validators: vec![ - ValidatorId::from(Sr25519Keyring::Alice.public()), - ValidatorId::from(Sr25519Keyring::Eve.public()), - ], - ..Default::default() - }), - _ => None, - }); - - run_to_block(2, |_| None); + // Setting explicit core count + MockAssigner::set_core_count(5); + let assignment_provider_ttl = MockAssigner::get_provider_config(CoreIndex::from(0)).ttl; - { - assert_eq!(Scheduler::claimqueue().len(), 1); - assert_eq!(Scheduler::availability_cores().len(), 1); - - Scheduler::occupied(vec![(CoreIndex(0), chain_a)].into_iter().collect()); - - let cores = Scheduler::availability_cores(); - match &cores[0] { - CoreOccupied::Paras(pe) if pe.para_id() == chain_a => {}, - _ => panic!("Core should be occupied by chain_a ParaId"), - } - - // Now that there is an earlier next-up, we use that. - assert_eq!( - Scheduler::next_up_on_available(CoreIndex(0)).unwrap(), - ScheduledCore { para_id: chain_a, collator: None } - ); - } - }); -} + schedule_blank_para(para_a); + schedule_blank_para(para_b); -#[test] -fn session_change_requires_reschedule_dropping_removed_paras() { - let mut config = default_config(); - config.scheduling_lookahead = 1; - let genesis_config = genesis_config(&config); - - assert_eq!(default_config().on_demand_cores, 3); - new_test_ext(genesis_config).execute_with(|| { - let chain_a = ParaId::from(1_u32); - let chain_b = ParaId::from(2_u32); - - // ensure that we have 5 groups by registering 2 parachains. - schedule_blank_para(chain_a, ParaKind::Parachain); - schedule_blank_para(chain_b, ParaKind::Parachain); + // Add assignments + MockAssigner::add_test_assignment(assignment_a.clone()); + MockAssigner::add_test_assignment(assignment_b.clone()); run_to_block(1, |number| match number { 1 => Some(SessionChangeNotification { @@ -1386,7 +1088,11 @@ fn session_change_requires_reschedule_dropping_removed_paras() { let groups = ValidatorGroups::::get(); assert_eq!(groups.len(), 5); - assert_ok!(Paras::schedule_para_cleanup(chain_b)); + assert_ok!(Paras::schedule_para_cleanup(para_b)); + + // Add assignment + MockAssigner::add_test_assignment(assignment_a.clone()); + run_to_end_of_block(2, |number| match number { 2 => Some(SessionChangeNotification { new_config: default_config(), @@ -1405,17 +1111,17 @@ fn session_change_requires_reschedule_dropping_removed_paras() { _ => None, }); - Scheduler::update_claimqueue(BTreeMap::new(), 3); + Scheduler::free_cores_and_fill_claimqueue(BTreeMap::new(), 3); assert_eq!( Scheduler::claimqueue(), vec![( CoreIndex(0), - vec![Some(ParasEntry::new( - Assignment::new(chain_a), + vec![ParasEntry::new( + Assignment::Bulk(para_a), // At end of block 2 - config.on_demand_ttl + 2 - ))] + assignment_provider_ttl + 2 + )] .into_iter() .collect() )] @@ -1423,8 +1129,12 @@ fn session_change_requires_reschedule_dropping_removed_paras() { .collect() ); - // Add parachain back - schedule_blank_para(chain_b, ParaKind::Parachain); + // Add para back + schedule_blank_para(para_b); + + // Add assignments + MockAssigner::add_test_assignment(assignment_a.clone()); + MockAssigner::add_test_assignment(assignment_b.clone()); run_to_block(3, |number| match number { 3 => Some(SessionChangeNotification { @@ -1449,28 +1159,28 @@ fn session_change_requires_reschedule_dropping_removed_paras() { let groups = ValidatorGroups::::get(); assert_eq!(groups.len(), 5); - Scheduler::update_claimqueue(BTreeMap::new(), 4); + Scheduler::free_cores_and_fill_claimqueue(BTreeMap::new(), 4); assert_eq!( Scheduler::claimqueue(), vec![ ( CoreIndex(0), - vec![Some(ParasEntry::new( - Assignment::new(chain_a), + vec![ParasEntry::new( + Assignment::Bulk(para_a), // At block 3 - config.on_demand_ttl + 3 - ))] + assignment_provider_ttl + 3 + )] .into_iter() .collect() ), ( CoreIndex(1), - vec![Some(ParasEntry::new( - Assignment::new(chain_b), + vec![ParasEntry::new( + Assignment::Bulk(para_b), // At block 3 - config.on_demand_ttl + 3 - ))] + assignment_provider_ttl + 3 + )] .into_iter() .collect() ), diff --git a/polkadot/runtime/parachains/src/session_info/tests.rs b/polkadot/runtime/parachains/src/session_info/tests.rs index 727b7c79fba..92a50575ded 100644 --- a/polkadot/runtime/parachains/src/session_info/tests.rs +++ b/polkadot/runtime/parachains/src/session_info/tests.rs @@ -62,7 +62,7 @@ fn run_to_block( fn default_config() -> HostConfiguration { HostConfiguration { - on_demand_cores: 1, + coretime_cores: 1, dispute_period: 2, needed_approvals: 3, ..Default::default() diff --git a/polkadot/runtime/rococo/constants/src/lib.rs b/polkadot/runtime/rococo/constants/src/lib.rs index 4e728421b67..9209045364c 100644 --- a/polkadot/runtime/rococo/constants/src/lib.rs +++ b/polkadot/runtime/rococo/constants/src/lib.rs @@ -116,6 +116,8 @@ pub mod system_parachain { pub const PEOPLE_ID: u32 = 1004; /// BridgeHub parachain ID. pub const BRIDGE_HUB_ID: u32 = 1013; + /// Brokerage parachain ID. + pub const BROKER_ID: u32 = 1005; /// All system parachains of Rococo. pub type SystemParachains = IsChildSystemParachain; diff --git a/polkadot/runtime/rococo/src/lib.rs b/polkadot/runtime/rococo/src/lib.rs index acc3f723cdd..a15911c21f6 100644 --- a/polkadot/runtime/rococo/src/lib.rs +++ b/polkadot/runtime/rococo/src/lib.rs @@ -31,6 +31,7 @@ use primitives::{ OccupiedCoreAssumption, PersistedValidationData, ScrapedOnChainVotes, SessionInfo, Signature, ValidationCode, ValidationCodeHash, ValidatorId, ValidatorIndex, PARACHAIN_KEY_TYPE_ID, }; +use rococo_runtime_constants::system_parachain::BROKER_ID; use runtime_common::{ assigned_slots, auctions, claims, crowdloan, identity_migrator, impl_runtime_weights, impls::{ @@ -43,9 +44,10 @@ use scale_info::TypeInfo; use sp_std::{cmp::Ordering, collections::btree_map::BTreeMap, prelude::*}; use runtime_parachains::{ - assigner as parachains_assigner, assigner_on_demand as parachains_assigner_on_demand, + assigner_coretime as parachains_assigner_coretime, + assigner_on_demand as parachains_assigner_on_demand, assigner_parachains as parachains_assigner_parachains, - configuration as parachains_configuration, disputes as parachains_disputes, + configuration as parachains_configuration, coretime, disputes as parachains_disputes, disputes::slashing as parachains_slashing, dmp as parachains_dmp, hrmp as parachains_hrmp, inclusion as parachains_inclusion, inclusion::{AggregateMessageOrigin, UmpQueueId}, @@ -150,7 +152,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("rococo"), impl_name: create_runtime_str!("parity-rococo-v2.0"), authoring_version: 0, - spec_version: 1_005_000, + spec_version: 1_005_001, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 24, @@ -935,6 +937,7 @@ impl parachains_paras::Config for Runtime { type QueueFootprinter = ParaInclusion; type NextSessionRotation = Babe; type OnNewHead = Registrar; + type AssignCoretime = CoretimeAssignmentProvider; } parameter_types! { @@ -1001,7 +1004,22 @@ impl parachains_paras_inherent::Config for Runtime { } impl parachains_scheduler::Config for Runtime { - type AssignmentProvider = ParaAssignmentProvider; + // If you change this, make sure the `Assignment` type of the new provider is binary compatible, + // otherwise provide a migration. + type AssignmentProvider = CoretimeAssignmentProvider; +} + +parameter_types! { + pub const BrokerId: u32 = BROKER_ID; +} + +impl coretime::Config for Runtime { + type RuntimeOrigin = RuntimeOrigin; + type RuntimeEvent = RuntimeEvent; + type Currency = Balances; + type BrokerId = BrokerId; + type WeightInfo = weights::runtime_parachains_coretime::WeightInfo; + type SendXcm = crate::xcm_config::XcmRouter; } parameter_types! { @@ -1017,15 +1035,13 @@ impl parachains_assigner_on_demand::Config for Runtime { impl parachains_assigner_parachains::Config for Runtime {} -impl parachains_assigner::Config for Runtime { - type OnDemandAssignmentProvider = OnDemandAssignmentProvider; - type ParachainsAssignmentProvider = ParachainsAssignmentProvider; -} +impl parachains_assigner_coretime::Config for Runtime {} impl parachains_initializer::Config for Runtime { type Randomness = pallet_babe::RandomnessFromOneEpochAgo; type ForceOrigin = EnsureRoot; type WeightInfo = weights::runtime_parachains_initializer::WeightInfo; + type CoretimeOnNewSession = Coretime; } impl parachains_disputes::Config for Runtime { @@ -1405,15 +1421,16 @@ construct_runtime! { ParasDisputes: parachains_disputes::{Pallet, Call, Storage, Event} = 62, ParasSlashing: parachains_slashing::{Pallet, Call, Storage, ValidateUnsigned} = 63, MessageQueue: pallet_message_queue::{Pallet, Call, Storage, Event} = 64, - ParaAssignmentProvider: parachains_assigner::{Pallet, Storage} = 65, OnDemandAssignmentProvider: parachains_assigner_on_demand::{Pallet, Call, Storage, Event} = 66, ParachainsAssignmentProvider: parachains_assigner_parachains::{Pallet} = 67, + CoretimeAssignmentProvider: parachains_assigner_coretime::{Pallet, Storage} = 68, // Parachain Onboarding Pallets. Start indices at 70 to leave room. Registrar: paras_registrar::{Pallet, Call, Storage, Event, Config} = 70, Slots: slots::{Pallet, Call, Storage, Event} = 71, Auctions: auctions::{Pallet, Call, Storage, Event} = 72, Crowdloan: crowdloan::{Pallet, Call, Storage, Event} = 73, + Coretime: coretime::{Pallet, Call, Event} = 74, // Pallet for sending XCM. XcmPallet: pallet_xcm::{Pallet, Call, Storage, Event, Origin, Config} = 99, @@ -1477,9 +1494,39 @@ pub mod migrations { use frame_support::traits::LockIdentifier; use frame_system::pallet_prelude::BlockNumberFor; + use sp_arithmetic::traits::Zero; #[cfg(feature = "try-runtime")] use sp_core::crypto::ByteArray; + pub struct GetLegacyLeaseImpl; + impl coretime::migration::GetLegacyLease for GetLegacyLeaseImpl { + fn get_parachain_lease_in_blocks(para: ParaId) -> Option { + let now = frame_system::Pallet::::block_number(); + let mut leases = slots::Pallet::::lease(para).into_iter(); + let initial_sum = if let Some(Some(_)) = leases.next() { + let (_, progress) = + slots::Pallet::::lease_period_index_plus_progress(now)?; + LeasePeriod::get().saturating_sub(progress) + } else { + // The parachain lease did not yet start + Zero::zero() + }; + log::trace!( + target: "coretime-migration", + "Getting lease info for para {:?}:\n LEASE_PERIOD: {:?}, initial_sum: {:?}, number of leases: {:?}", + para, + LeasePeriod::get(), + initial_sum, + slots::Pallet::::lease(para).len(), + ); + + Some(leases.into_iter().fold(initial_sum, |sum, lease| { + // If the parachain lease did not yet start, we ignore them by multiplying by `0`. + sum + LeasePeriod::get() * lease.map_or(0, |_| 1) + })) + } + } + parameter_types! { pub const DemocracyPalletName: &'static str = "Democracy"; pub const CouncilPalletName: &'static str = "Council"; @@ -1602,7 +1649,7 @@ pub mod migrations { pallet_society::migrations::MigrateToV2, parachains_configuration::migration::v7::MigrateToV7, assigned_slots::migration::v1::MigrateToV1, - parachains_scheduler::migration::v1::MigrateToV1, + parachains_scheduler::migration::MigrateV1ToV2, parachains_configuration::migration::v8::MigrateToV8, parachains_configuration::migration::v9::MigrateToV9, paras_registrar::migration::MigrateToV1, @@ -1633,6 +1680,8 @@ pub mod migrations { // Remove `im-online` pallet on-chain storage frame_support::migrations::RemovePallet::DbWeight>, parachains_configuration::migration::v11::MigrateToV11, + // This needs to come after the `parachains_configuration` above as we are reading the configuration. + coretime::migration::MigrateToCoretime, ); } @@ -1681,6 +1730,7 @@ mod benches { // the that path resolves correctly in the generated file. [runtime_common::assigned_slots, AssignedSlots] [runtime_common::auctions, Auctions] + [runtime_common::coretime, Coretime] [runtime_common::crowdloan, Crowdloan] [runtime_common::claims, Claims] [runtime_common::identity_migrator, IdentityMigrator] diff --git a/polkadot/runtime/rococo/src/weights/mod.rs b/polkadot/runtime/rococo/src/weights/mod.rs index bd2079ce827..3613fb4305b 100644 --- a/polkadot/runtime/rococo/src/weights/mod.rs +++ b/polkadot/runtime/rococo/src/weights/mod.rs @@ -51,6 +51,7 @@ pub mod runtime_common_paras_registrar; pub mod runtime_common_slots; pub mod runtime_parachains_assigner_on_demand; pub mod runtime_parachains_configuration; +pub mod runtime_parachains_coretime; pub mod runtime_parachains_disputes; pub mod runtime_parachains_hrmp; pub mod runtime_parachains_inclusion; diff --git a/polkadot/runtime/rococo/src/weights/runtime_parachains_coretime.rs b/polkadot/runtime/rococo/src/weights/runtime_parachains_coretime.rs new file mode 100644 index 00000000000..d9f2d45207b --- /dev/null +++ b/polkadot/runtime/rococo/src/weights/runtime_parachains_coretime.rs @@ -0,0 +1,73 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Autogenerated weights for `runtime_parachains::coretime` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-12-01, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `runner-r43aesjn-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("rococo-dev")`, DB CACHE: 1024 + +// Executed Command: +// target/production/polkadot +// benchmark +// pallet +// --steps=50 +// --repeat=20 +// --extrinsic=* +// --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json +// --pallet=runtime_common::coretime +// --chain=rococo-dev +// --header=./polkadot/file_header.txt +// --output=./polkadot/runtime/rococo/src/weights/ + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +use runtime_parachains::configuration::{self, WeightInfo as ConfigWeightInfo}; + +/// Weight functions for `runtime_common::coretime`. +pub struct WeightInfo(PhantomData); +impl runtime_parachains::coretime::WeightInfo for WeightInfo { + fn request_core_count() -> Weight { + ::WeightInfo::set_config_with_u32() + } + /// Storage: `CoreTimeAssignmentProvider::CoreDescriptors` (r:1 w:1) + /// Proof: `CoreTimeAssignmentProvider::CoreDescriptors` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `CoreTimeAssignmentProvider::CoreSchedules` (r:0 w:1) + /// Proof: `CoreTimeAssignmentProvider::CoreSchedules` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// The range of component `s` is `[1, 100]`. + fn assign_core(s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `76` + // Estimated: `3541` + // Minimum execution time: 6_275_000 picoseconds. + Weight::from_parts(6_883_543, 0) + .saturating_add(Weight::from_parts(0, 3541)) + // Standard Error: 202 + .saturating_add(Weight::from_parts(15_028, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(2)) + } +} diff --git a/polkadot/runtime/rococo/src/xcm_config.rs b/polkadot/runtime/rococo/src/xcm_config.rs index e5edba2570c..4f9ab0d6611 100644 --- a/polkadot/runtime/rococo/src/xcm_config.rs +++ b/polkadot/runtime/rococo/src/xcm_config.rs @@ -120,6 +120,7 @@ parameter_types! { pub const Contracts: MultiLocation = Parachain(CONTRACTS_ID).into_location(); pub const Encointer: MultiLocation = Parachain(ENCOINTER_ID).into_location(); pub const BridgeHub: MultiLocation = Parachain(BRIDGE_HUB_ID).into_location(); + pub const Broker: MultiLocation = Parachain(BROKER_ID).into_location(); pub const Tick: MultiLocation = Parachain(100).into_location(); pub const Trick: MultiLocation = Parachain(110).into_location(); pub const Track: MultiLocation = Parachain(120).into_location(); @@ -130,6 +131,7 @@ parameter_types! { pub const RocForContracts: (MultiAssetFilter, MultiLocation) = (Roc::get(), Contracts::get()); pub const RocForEncointer: (MultiAssetFilter, MultiLocation) = (Roc::get(), Encointer::get()); pub const RocForBridgeHub: (MultiAssetFilter, MultiLocation) = (Roc::get(), BridgeHub::get()); + pub const RocForBroker: (MultiAssetFilter, MultiLocation) = (Roc::get(), Broker::get()); pub const MaxInstructions: u32 = 100; pub const MaxAssetsIntoHolding: u32 = 64; } @@ -141,6 +143,7 @@ pub type TrustedTeleporters = ( xcm_builder::Case, xcm_builder::Case, xcm_builder::Case, + xcm_builder::Case, ); match_types! { diff --git a/polkadot/runtime/test-runtime/src/lib.rs b/polkadot/runtime/test-runtime/src/lib.rs index cd9590796ae..f472b619ba7 100644 --- a/polkadot/runtime/test-runtime/src/lib.rs +++ b/polkadot/runtime/test-runtime/src/lib.rs @@ -74,7 +74,7 @@ use sp_runtime::{ SaturatedConversion, StaticLookup, Verify, }, transaction_validity::{TransactionPriority, TransactionSource, TransactionValidity}, - ApplyExtrinsicResult, KeyTypeId, Perbill, + ApplyExtrinsicResult, FixedU128, KeyTypeId, Perbill, }; use sp_staking::SessionIndex; #[cfg(any(feature = "std", test))] @@ -520,6 +520,7 @@ impl parachains_initializer::Config for Runtime { type Randomness = pallet_babe::RandomnessFromOneEpochAgo; type ForceOrigin = frame_system::EnsureRoot; type WeightInfo = (); + type CoretimeOnNewSession = (); } impl parachains_session_info::Config for Runtime { @@ -537,6 +538,15 @@ impl parachains_paras::Config for Runtime { type QueueFootprinter = ParaInclusion; type NextSessionRotation = Babe; type OnNewHead = (); + type AssignCoretime = (); +} + +parameter_types! { + pub const BrokerId: u32 = 10u32; +} + +parameter_types! { + pub const OnDemandTrafficDefaultValue: FixedU128 = FixedU128::from_u32(1); } impl parachains_dmp::Config for Runtime {} diff --git a/polkadot/runtime/westend/constants/src/lib.rs b/polkadot/runtime/westend/constants/src/lib.rs index c2bce3a1791..3b44684c203 100644 --- a/polkadot/runtime/westend/constants/src/lib.rs +++ b/polkadot/runtime/westend/constants/src/lib.rs @@ -107,6 +107,8 @@ pub mod system_parachain { pub const COLLECTIVES_ID: u32 = 1001; /// BridgeHub parachain ID. pub const BRIDGE_HUB_ID: u32 = 1002; + /// Brokerage parachain ID. + pub const BROKER_ID: u32 = 1005; /// All system parachains of Westend. pub type SystemParachains = IsChildSystemParachain; diff --git a/polkadot/runtime/westend/src/lib.rs b/polkadot/runtime/westend/src/lib.rs index e958a660e6e..fb54bec509b 100644 --- a/polkadot/runtime/westend/src/lib.rs +++ b/polkadot/runtime/westend/src/lib.rs @@ -115,7 +115,7 @@ use sp_runtime::traits::Get; pub use sp_runtime::BuildStorage; /// Constant values used within the runtime. -use westend_runtime_constants::{currency::*, fee::*, time::*}; +use westend_runtime_constants::{currency::*, fee::*, system_parachain::BROKER_ID, time::*}; mod bag_thresholds; mod weights; @@ -1149,6 +1149,7 @@ impl parachains_paras::Config for Runtime { type QueueFootprinter = ParaInclusion; type NextSessionRotation = Babe; type OnNewHead = (); + type AssignCoretime = (); } parameter_types! { @@ -1215,7 +1216,13 @@ impl parachains_paras_inherent::Config for Runtime { } impl parachains_scheduler::Config for Runtime { - type AssignmentProvider = ParaAssignmentProvider; + // If you change this, make sure the `Assignment` type of the new provider is binary compatible, + // otherwise provide a migration. + type AssignmentProvider = ParachainsAssignmentProvider; +} + +parameter_types! { + pub const BrokerId: u32 = BROKER_ID; } impl parachains_assigner_parachains::Config for Runtime {} @@ -1224,6 +1231,7 @@ impl parachains_initializer::Config for Runtime { type Randomness = pallet_babe::RandomnessFromOneEpochAgo; type ForceOrigin = EnsureRoot; type WeightInfo = weights::runtime_parachains_initializer::WeightInfo; + type CoretimeOnNewSession = (); } impl paras_sudo_wrapper::Config for Runtime {} @@ -1485,7 +1493,7 @@ construct_runtime! { ParaSessionInfo: parachains_session_info::{Pallet, Storage} = 52, ParasDisputes: parachains_disputes::{Pallet, Call, Storage, Event} = 53, ParasSlashing: parachains_slashing::{Pallet, Call, Storage, ValidateUnsigned} = 54, - ParaAssignmentProvider: parachains_assigner_parachains::{Pallet, Storage} = 55, + ParachainsAssignmentProvider: parachains_assigner_parachains::{Pallet} = 55, // Parachain Onboarding Pallets. Start indices at 60 to leave room. Registrar: paras_registrar::{Pallet, Call, Storage, Event, Config} = 60, @@ -1636,7 +1644,7 @@ pub mod migrations { parachains_configuration::migration::v7::MigrateToV7, pallet_staking::migrations::v14::MigrateToV14, assigned_slots::migration::v1::MigrateToV1, - parachains_scheduler::migration::v1::MigrateToV1, + parachains_scheduler::migration::MigrateV1ToV2, parachains_configuration::migration::v8::MigrateToV8, parachains_configuration::migration::v9::MigrateToV9, paras_registrar::migration::MigrateToV1, diff --git a/polkadot/runtime/westend/src/weights/mod.rs b/polkadot/runtime/westend/src/weights/mod.rs index 3841579088a..d8a2ae5d2da 100644 --- a/polkadot/runtime/westend/src/weights/mod.rs +++ b/polkadot/runtime/westend/src/weights/mod.rs @@ -49,7 +49,9 @@ pub mod runtime_common_crowdloan; pub mod runtime_common_identity_migrator; pub mod runtime_common_paras_registrar; pub mod runtime_common_slots; +pub mod runtime_parachains_assigner_on_demand; pub mod runtime_parachains_configuration; +pub mod runtime_parachains_coretime; pub mod runtime_parachains_disputes; pub mod runtime_parachains_disputes_slashing; pub mod runtime_parachains_hrmp; diff --git a/polkadot/runtime/westend/src/weights/runtime_parachains_assigner_on_demand.rs b/polkadot/runtime/westend/src/weights/runtime_parachains_assigner_on_demand.rs new file mode 100644 index 00000000000..ac0f05301b4 --- /dev/null +++ b/polkadot/runtime/westend/src/weights/runtime_parachains_assigner_on_demand.rs @@ -0,0 +1,91 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Autogenerated weights for `runtime_parachains::assigner_on_demand` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-08-11, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `runner-fljshgub-project-163-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("rococo-dev")`, DB CACHE: 1024 + +// Executed Command: +// target/production/polkadot +// benchmark +// pallet +// --steps=50 +// --repeat=20 +// --extrinsic=* +// --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/builds/parity/mirrors/polkadot/.git/.artifacts/bench.json +// --pallet=runtime_parachains::assigner_on_demand +// --chain=rococo-dev +// --header=./file_header.txt +// --output=./runtime/rococo/src/weights/ + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `runtime_parachains::assigner_on_demand`. +pub struct WeightInfo(PhantomData); +impl runtime_parachains::assigner_on_demand::WeightInfo for WeightInfo { + /// Storage: `OnDemandAssignmentProvider::SpotTraffic` (r:1 w:0) + /// Proof: `OnDemandAssignmentProvider::SpotTraffic` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Paras::ParaLifecycles` (r:1 w:0) + /// Proof: `Paras::ParaLifecycles` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `OnDemandAssignmentProvider::OnDemandQueue` (r:1 w:1) + /// Proof: `OnDemandAssignmentProvider::OnDemandQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// The range of component `s` is `[1, 9999]`. + fn place_order_keep_alive(s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `297 + s * (4 ±0)` + // Estimated: `3762 + s * (4 ±0)` + // Minimum execution time: 33_522_000 picoseconds. + Weight::from_parts(35_436_835, 0) + .saturating_add(Weight::from_parts(0, 3762)) + // Standard Error: 129 + .saturating_add(Weight::from_parts(14_041, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(1)) + .saturating_add(Weight::from_parts(0, 4).saturating_mul(s.into())) + } + /// Storage: `OnDemandAssignmentProvider::SpotTraffic` (r:1 w:0) + /// Proof: `OnDemandAssignmentProvider::SpotTraffic` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Paras::ParaLifecycles` (r:1 w:0) + /// Proof: `Paras::ParaLifecycles` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `OnDemandAssignmentProvider::OnDemandQueue` (r:1 w:1) + /// Proof: `OnDemandAssignmentProvider::OnDemandQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// The range of component `s` is `[1, 9999]`. + fn place_order_allow_death(s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `297 + s * (4 ±0)` + // Estimated: `3762 + s * (4 ±0)` + // Minimum execution time: 33_488_000 picoseconds. + Weight::from_parts(34_848_934, 0) + .saturating_add(Weight::from_parts(0, 3762)) + // Standard Error: 143 + .saturating_add(Weight::from_parts(14_215, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(1)) + .saturating_add(Weight::from_parts(0, 4).saturating_mul(s.into())) + } +} diff --git a/polkadot/runtime/westend/src/weights/runtime_parachains_coretime.rs b/polkadot/runtime/westend/src/weights/runtime_parachains_coretime.rs new file mode 100644 index 00000000000..d9f2d45207b --- /dev/null +++ b/polkadot/runtime/westend/src/weights/runtime_parachains_coretime.rs @@ -0,0 +1,73 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Autogenerated weights for `runtime_parachains::coretime` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-12-01, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `runner-r43aesjn-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("rococo-dev")`, DB CACHE: 1024 + +// Executed Command: +// target/production/polkadot +// benchmark +// pallet +// --steps=50 +// --repeat=20 +// --extrinsic=* +// --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json +// --pallet=runtime_common::coretime +// --chain=rococo-dev +// --header=./polkadot/file_header.txt +// --output=./polkadot/runtime/rococo/src/weights/ + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +use runtime_parachains::configuration::{self, WeightInfo as ConfigWeightInfo}; + +/// Weight functions for `runtime_common::coretime`. +pub struct WeightInfo(PhantomData); +impl runtime_parachains::coretime::WeightInfo for WeightInfo { + fn request_core_count() -> Weight { + ::WeightInfo::set_config_with_u32() + } + /// Storage: `CoreTimeAssignmentProvider::CoreDescriptors` (r:1 w:1) + /// Proof: `CoreTimeAssignmentProvider::CoreDescriptors` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `CoreTimeAssignmentProvider::CoreSchedules` (r:0 w:1) + /// Proof: `CoreTimeAssignmentProvider::CoreSchedules` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// The range of component `s` is `[1, 100]`. + fn assign_core(s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `76` + // Estimated: `3541` + // Minimum execution time: 6_275_000 picoseconds. + Weight::from_parts(6_883_543, 0) + .saturating_add(Weight::from_parts(0, 3541)) + // Standard Error: 202 + .saturating_add(Weight::from_parts(15_028, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(2)) + } +} diff --git a/polkadot/zombienet_tests/functional/0005-parachains-disputes-past-session.zndsl b/polkadot/zombienet_tests/functional/0005-parachains-disputes-past-session.zndsl index a3f1f0669ac..d92820391d5 100644 --- a/polkadot/zombienet_tests/functional/0005-parachains-disputes-past-session.zndsl +++ b/polkadot/zombienet_tests/functional/0005-parachains-disputes-past-session.zndsl @@ -32,6 +32,10 @@ honest-flaky-validator-1: reports parachain_candidate_disputes_total is at least honest-flaky-validator-1: pause # Wait for 1 full session to pass after the last unconcluded dispute. +# +# TODO: replace with assertion for "New session detected" in logs. I think that +# would match on previous log lines, so we may need to programmatically wait for +# a specific session, requiring zombienet v2. sleep 110 seconds # Now resume flaky validators diff --git a/polkadot/zombienet_tests/smoke/0004-configure-broker.js b/polkadot/zombienet_tests/smoke/0004-configure-broker.js new file mode 100644 index 00000000000..a4939ffe1cb --- /dev/null +++ b/polkadot/zombienet_tests/smoke/0004-configure-broker.js @@ -0,0 +1,66 @@ +const assert = require("assert"); + +async function run(nodeName, networkInfo, _jsArgs) { + const { wsUri, userDefinedTypes } = networkInfo.nodesByName[nodeName]; + const api = await zombie.connect(wsUri, userDefinedTypes); + + await zombie.util.cryptoWaitReady(); + + // account to submit tx + const keyring = new zombie.Keyring({ type: "sr25519" }); + const alice = keyring.addFromUri("//Alice"); + + const calls = [ + // Default broker configuration + api.tx.broker.configure({ + advanceNotice: 2, + interludeLength: 1, + leadinLength: 1, + regionLength: 3, + idealBulkProportion: 100, + limitCoresOffered: null, + renewalBump: 10, + contributionTimeout: 5, + }), + // Make reservation for ParaId 100 (adder-a) every other block + // and ParaId 101 (adder-b) every other block. + api.tx.broker.reserve([ + { + mask: [255, 0, 255, 0, 255, 0, 255, 0, 255, 0], + assignment: { Task: 100 }, + }, + { + mask: [0, 255, 0, 255, 0, 255, 0, 255, 0, 255], + assignment: { Task: 101 }, + }, + ]), + // Start sale with 1 core starting at 1 planck + api.tx.broker.startSales(1, 1), + ]; + const sudo_batch = api.tx.sudo.sudo(api.tx.utility.batch(calls)); + + await new Promise(async (resolve, reject) => { + const unsub = await sudo_batch.signAndSend(alice, (result) => { + console.log(`Current status is ${result.status}`); + if (result.status.isInBlock) { + console.log( + `Transaction included at blockHash ${result.status.asInBlock}` + ); + } else if (result.status.isFinalized) { + console.log( + `Transaction finalized at blockHash ${result.status.asFinalized}` + ); + unsub(); + return resolve(); + } else if (result.isError) { + console.log(`Transaction Error`); + unsub(); + return reject(); + } + }); + }); + + return 0; +} + +module.exports = { run }; diff --git a/polkadot/zombienet_tests/smoke/0004-configure-relay.js b/polkadot/zombienet_tests/smoke/0004-configure-relay.js new file mode 100644 index 00000000000..9ca23d86a56 --- /dev/null +++ b/polkadot/zombienet_tests/smoke/0004-configure-relay.js @@ -0,0 +1,43 @@ +const assert = require("assert"); + +async function run(nodeName, networkInfo, _jsArgs) { + const { wsUri, userDefinedTypes } = networkInfo.nodesByName[nodeName]; + const api = await zombie.connect(wsUri, userDefinedTypes); + + await zombie.util.cryptoWaitReady(); + + // account to submit tx + const keyring = new zombie.Keyring({ type: "sr25519" }); + const alice = keyring.addFromUri("//Alice"); + + const calls = [ + api.tx.configuration.setCoretimeCores({ new: 1 }), + api.tx.coretime.assignCore(0, 20,[[ { task: 1005 }, 57600 ]], null) + ]; + const sudo_batch = api.tx.sudo.sudo(api.tx.utility.batch(calls)); + + await new Promise(async (resolve, reject) => { + const unsub = await sudo_batch.signAndSend(alice, (result) => { + console.log(`Current status is ${result.status}`); + if (result.status.isInBlock) { + console.log( + `Transaction included at blockHash ${result.status.asInBlock}` + ); + } else if (result.status.isFinalized) { + console.log( + `Transaction finalized at blockHash ${result.status.asFinalized}` + ); + unsub(); + return resolve(); + } else if (result.isError) { + console.log(`Transaction Error`); + unsub(); + return reject(); + } + }); + }); + + return 0; +} + +module.exports = { run }; diff --git a/polkadot/zombienet_tests/smoke/0004-coretime-smoke-test.toml b/polkadot/zombienet_tests/smoke/0004-coretime-smoke-test.toml new file mode 100644 index 00000000000..3bcd0bee3c7 --- /dev/null +++ b/polkadot/zombienet_tests/smoke/0004-coretime-smoke-test.toml @@ -0,0 +1,58 @@ +[settings] +timeout = 1000 + +[relaychain] +default_image = "{{ZOMBIENET_INTEGRATION_TEST_IMAGE}}" +chain = "rococo-local" +command = "polkadot" + + [[relaychain.nodes]] + name = "alice" + args = ["-lruntime=debug,parachain=trace" ] + + [[relaychain.nodes]] + name = "bob" + args = ["-lruntime=debug,parachain=trace" ] + + [[relaychain.nodes]] + name = "charlie" + args = ["-lruntime=debug,parachain=trace" ] + +[[parachains]] +id = 1005 +chain = "coretime-rococo-local" + + [parachains.collator] + name = "coretime-collator" + image = "{{COL_IMAGE}}" + command = "polkadot-parachain" + args = [ "-lruntime=debug,parachain=trace" ] + +[[parachains]] +id = 100 +add_to_genesis = false +register_para = true +onboard_as_parachain = false + + [parachains.collator] + name = "adder-a" + image = "{{COL_IMAGE}}" + command = "adder-collator" + args = [ "-lruntime=debug,parachain=trace" ] + +[[parachains]] +id = 101 +add_to_genesis = false +register_para = true +onboard_as_parachain = false + + [parachains.collator] + name = "adder-b" + image = "{{COL_IMAGE}}" + command = "adder-collator" + args = [ "-lruntime=debug,parachain=trace" ] + +[types.Header] +number = "u64" +parent_hash = "Hash" +post_state = "Hash" diff --git a/polkadot/zombienet_tests/smoke/0004-coretime-smoke-test.zndsl b/polkadot/zombienet_tests/smoke/0004-coretime-smoke-test.zndsl new file mode 100644 index 00000000000..45e000e0bf8 --- /dev/null +++ b/polkadot/zombienet_tests/smoke/0004-coretime-smoke-test.zndsl @@ -0,0 +1,19 @@ +Description: Bulk core assignment Smoke +Network: ./0004-coretime-smoke-test.toml +Creds: config + +alice: is up +coretime-collator: is up + +alice: reports block height is at least 3 within 30 seconds +# configure relay chain +alice: js-script ./0004-configure-relay.js with "" return is 0 within 600 secs + +# Wait 2 sessions. The parachain doesn't start block production immediately. +alice: log line contains "New session detected session_index=2" within 600 seconds + +# configure broker chain +coretime-collator: js-script ./0004-configure-broker.js with "" return is 0 within 600 secs + +# TODO: Fix this +# alice: parachain 100 block height is at least 10 within 600 seconds diff --git a/prdoc/pr_1694.prdoc b/prdoc/pr_1694.prdoc new file mode 100644 index 00000000000..24797630efc --- /dev/null +++ b/prdoc/pr_1694.prdoc @@ -0,0 +1,24 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Agile Coretime Base Relaychain Functionality + +doc: + - audience: Runtime User + description: | + The relay chain is now capable of receiving assignments from the coretime + chain and will schedule parachains and on-demand orders accordingly. + Existing leases and system chains are preserved. They get a reserved + coretime core via a migration. +migrations: + db: [] + runtime: + - reference: polkadot-runtime-parachains + description: | + Claim queue in scheduler now no longer contains Option values and + assignments now contain information necessary to accomodate for coretime + features. Also all existing parachains are converted to coretime + assignments. + +crates: + - name: polkadot-runtime-parachains diff --git a/substrate/bin/node/runtime/src/lib.rs b/substrate/bin/node/runtime/src/lib.rs index 849bc7ca6fb..4d409a791ba 100644 --- a/substrate/bin/node/runtime/src/lib.rs +++ b/substrate/bin/node/runtime/src/lib.rs @@ -1993,7 +1993,6 @@ impl OnUnbalanced> for IntoAuthor { } parameter_types! { - pub storage CoreCount: Option = None; pub storage CoretimeRevenue: Option<(BlockNumber, Balance)> = None; } @@ -2012,21 +2011,12 @@ impl CoretimeInterface for CoretimeProvider { _end_hint: Option, ) { } - fn check_notify_core_count() -> Option { - let count = CoreCount::get(); - CoreCount::set(&None); - count - } fn check_notify_revenue_info() -> Option<(u32, Self::Balance)> { let revenue = CoretimeRevenue::get(); CoretimeRevenue::set(&None); revenue } #[cfg(feature = "runtime-benchmarks")] - fn ensure_notify_core_count(count: u16) { - CoreCount::set(&Some(count)); - } - #[cfg(feature = "runtime-benchmarks")] fn ensure_notify_revenue_info(when: u32, revenue: Self::Balance) { CoretimeRevenue::set(&Some((when, revenue))); } diff --git a/substrate/client/chain-spec/src/chain_spec.rs b/substrate/client/chain-spec/src/chain_spec.rs index 8d97d941022..fe8fcfda216 100644 --- a/substrate/client/chain-spec/src/chain_spec.rs +++ b/substrate/client/chain-spec/src/chain_spec.rs @@ -784,9 +784,7 @@ fn json_eval_value_at_key( path: &mut VecDeque<&str>, fun: &dyn Fn(&json::Value) -> bool, ) -> bool { - let Some(key) = path.pop_front() else { - return false; - }; + let Some(key) = path.pop_front() else { return false }; if path.is_empty() { doc.as_object().map_or(false, |o| o.get(key).map_or(false, |v| fun(v))) diff --git a/substrate/frame/broker/src/benchmarking.rs b/substrate/frame/broker/src/benchmarking.rs index 2cb4826f4ac..c57c4ccb8ce 100644 --- a/substrate/frame/broker/src/benchmarking.rs +++ b/substrate/frame/broker/src/benchmarking.rs @@ -705,7 +705,7 @@ mod benches { let core_count = n.try_into().unwrap(); - ::ensure_notify_core_count(core_count); + CoreCountInbox::::put(core_count); let mut status = Status::::get().ok_or(BenchmarkError::Weightless)?; diff --git a/substrate/frame/broker/src/coretime_interface.rs b/substrate/frame/broker/src/coretime_interface.rs index 9f23561ce94..9e853e8f3fe 100644 --- a/substrate/frame/broker/src/coretime_interface.rs +++ b/substrate/frame/broker/src/coretime_interface.rs @@ -107,11 +107,6 @@ pub trait CoretimeInterface { end_hint: Option>, ); - /// Indicate that from this block onwards, the range of acceptable values of the `core` - /// parameter of `assign_core` message is `[0, count)`. `assign_core` will be a no-op if - /// provided with a value for `core` outside of this range. - fn check_notify_core_count() -> Option; - /// Provide the amount of revenue accumulated from Instantaneous Coretime Sales from Relay-chain /// block number `last_until` to `until`, not including `until` itself. `last_until` is defined /// as being the `until` argument of the last `notify_revenue` message sent, or zero for the @@ -123,12 +118,6 @@ pub trait CoretimeInterface { /// single revenue information destination exists. fn check_notify_revenue_info() -> Option<(RCBlockNumberOf, Self::Balance)>; - /// Ensure that core count is updated to the provided value. - /// - /// This is only used for benchmarking. - #[cfg(feature = "runtime-benchmarks")] - fn ensure_notify_core_count(count: u16); - /// Ensure that revenue information is updated to the provided value. /// /// This is only used for benchmarking. @@ -151,14 +140,9 @@ impl CoretimeInterface for () { _end_hint: Option>, ) { } - fn check_notify_core_count() -> Option { - None - } fn check_notify_revenue_info() -> Option<(RCBlockNumberOf, Self::Balance)> { None } #[cfg(feature = "runtime-benchmarks")] - fn ensure_notify_core_count(_count: u16) {} - #[cfg(feature = "runtime-benchmarks")] fn ensure_notify_revenue_info(_when: RCBlockNumberOf, _revenue: Self::Balance) {} } diff --git a/substrate/frame/broker/src/dispatchable_impls.rs b/substrate/frame/broker/src/dispatchable_impls.rs index 0b08a7b665b..b04e15b169b 100644 --- a/substrate/frame/broker/src/dispatchable_impls.rs +++ b/substrate/frame/broker/src/dispatchable_impls.rs @@ -37,6 +37,11 @@ impl Pallet { Ok(()) } + pub(crate) fn do_notify_core_count(core_count: CoreIndex) -> DispatchResult { + CoreCountInbox::::put(core_count); + Ok(()) + } + pub(crate) fn do_reserve(workload: Schedule) -> DispatchResult { let mut r = Reservations::::get(); let index = r.len() as u32; diff --git a/substrate/frame/broker/src/lib.rs b/substrate/frame/broker/src/lib.rs index ee3501d5607..38a50490054 100644 --- a/substrate/frame/broker/src/lib.rs +++ b/substrate/frame/broker/src/lib.rs @@ -159,6 +159,10 @@ pub mod pallet { pub type InstaPoolHistory = StorageMap<_, Blake2_128Concat, Timeslice, InstaPoolHistoryRecordOf>; + /// Received core count change from the relay chain. + #[pallet::storage] + pub type CoreCountInbox = StorageValue<_, CoreIndex, OptionQuery>; + #[pallet::event] #[pallet::generate_deposit(pub(super) fn deposit_event)] pub enum Event { @@ -774,5 +778,13 @@ pub mod pallet { Self::do_request_core_count(core_count)?; Ok(()) } + + #[pallet::call_index(19)] + #[pallet::weight(T::WeightInfo::notify_core_count())] + pub fn notify_core_count(origin: OriginFor, core_count: CoreIndex) -> DispatchResult { + T::AdminOrigin::ensure_origin_or_root(origin)?; + Self::do_notify_core_count(core_count)?; + Ok(()) + } } } diff --git a/substrate/frame/broker/src/mock.rs b/substrate/frame/broker/src/mock.rs index 7444040ec9b..19c72340353 100644 --- a/substrate/frame/broker/src/mock.rs +++ b/substrate/frame/broker/src/mock.rs @@ -70,7 +70,6 @@ parameter_types! { pub static CoretimeWorkplan: BTreeMap<(u32, CoreIndex), Vec<(CoreAssignment, PartsOf57600)>> = Default::default(); pub static CoretimeUsage: BTreeMap> = Default::default(); pub static CoretimeInPool: CoreMaskBitCount = 0; - pub static NotifyCoreCount: Vec = Default::default(); pub static NotifyRevenueInfo: Vec<(u32, u64)> = Default::default(); } @@ -80,7 +79,7 @@ impl CoretimeInterface for TestCoretimeProvider { type Balance = u64; type RealyChainBlockNumberProvider = System; fn request_core_count(count: CoreIndex) { - NotifyCoreCount::mutate(|s| s.insert(0, count)); + CoreCountInbox::::put(count); } fn request_revenue_info_at(when: RCBlockNumberOf) { if when > RCBlockNumberProviderOf::::current_block_number() { @@ -126,17 +125,10 @@ impl CoretimeInterface for TestCoretimeProvider { ); CoretimeTrace::mutate(|v| v.push(item)); } - fn check_notify_core_count() -> Option { - NotifyCoreCount::mutate(|s| s.pop()) - } fn check_notify_revenue_info() -> Option<(RCBlockNumberOf, Self::Balance)> { NotifyRevenueInfo::mutate(|s| s.pop()).map(|v| (v.0 as _, v.1)) } #[cfg(feature = "runtime-benchmarks")] - fn ensure_notify_core_count(count: u16) { - NotifyCoreCount::mutate(|s| s.insert(0, count)); - } - #[cfg(feature = "runtime-benchmarks")] fn ensure_notify_revenue_info(when: RCBlockNumberOf, revenue: Self::Balance) { NotifyRevenueInfo::mutate(|s| s.push((when as u32, revenue))); } diff --git a/substrate/frame/broker/src/tick_impls.rs b/substrate/frame/broker/src/tick_impls.rs index 5f2be268b22..8b7860c8e3a 100644 --- a/substrate/frame/broker/src/tick_impls.rs +++ b/substrate/frame/broker/src/tick_impls.rs @@ -87,7 +87,7 @@ impl Pallet { } pub(crate) fn process_core_count(status: &mut StatusRecord) -> bool { - if let Some(core_count) = T::Coretime::check_notify_core_count() { + if let Some(core_count) = CoreCountInbox::::take() { status.core_count = core_count; Self::deposit_event(Event::::CoreCountChanged { core_count }); return true diff --git a/substrate/frame/broker/src/weights.rs b/substrate/frame/broker/src/weights.rs index b3a151c6062..a8f50eeee6e 100644 --- a/substrate/frame/broker/src/weights.rs +++ b/substrate/frame/broker/src/weights.rs @@ -74,6 +74,7 @@ pub trait WeightInfo { fn process_pool() -> Weight; fn process_core_schedule() -> Weight; fn request_revenue_info_at() -> Weight; + fn notify_core_count() -> Weight; fn do_tick_base() -> Weight; } @@ -447,6 +448,9 @@ impl WeightInfo for SubstrateWeight { // Minimum execution time: 147_000 picoseconds. Weight::from_parts(184_000, 0) } + fn notify_core_count() -> Weight { + T::DbWeight::get().reads_writes(1, 1) + } /// Storage: `Broker::Status` (r:1 w:1) /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) /// Storage: `Broker::Configuration` (r:1 w:0) @@ -835,6 +839,10 @@ impl WeightInfo for () { // Minimum execution time: 147_000 picoseconds. Weight::from_parts(184_000, 0) } + fn notify_core_count() -> Weight { + RocksDbWeight::get().reads(1) + .saturating_add(RocksDbWeight::get().writes(1)) + } /// Storage: `Broker::Status` (r:1 w:1) /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) /// Storage: `Broker::Configuration` (r:1 w:0) -- GitLab From 94759738f0239068e2e02fa3c37c22daf5f461f5 Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Thu, 21 Dec 2023 21:16:08 +0300 Subject: [PATCH 075/191] Cleanup bridges tests: with-parachain case (#2772) related to https://github.com/paritytech/parity-bridges-common/issues/2739 --- .../bridge-hub-rococo/tests/tests.rs | 59 +-- .../bridge-hub-westend/tests/tests.rs | 58 +-- .../src/test_cases/from_grandpa_chain.rs | 6 +- .../src/test_cases/from_parachain.rs | 449 +++++++++--------- .../src/test_data/from_parachain.rs | 33 +- 5 files changed, 290 insertions(+), 315 deletions(-) diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs index 0d96d66b31d..0fba28c47b4 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs @@ -138,6 +138,7 @@ mod bridge_hub_westend_tests { use bridge_common_config::{ BridgeGrandpaWestendInstance, BridgeParachainWestendInstance, DeliveryRewardInBalance, }; + use bridge_hub_test_utils::test_cases::from_parachain; use bridge_to_westend_config::{ BridgeHubWestendChainId, BridgeHubWestendLocation, WestendGlobalConsensusNetwork, WithBridgeHubWestendMessageBridge, WithBridgeHubWestendMessagesInstance, @@ -147,6 +148,16 @@ mod bridge_hub_westend_tests { // Para id of sibling chain used in tests. pub const SIBLING_PARACHAIN_ID: u32 = 1000; + // Runtime from tests PoV + type RuntimeTestsAdapter = from_parachain::WithRemoteParachainHelperAdapter< + Runtime, + AllPalletsWithoutSystem, + BridgeGrandpaWestendInstance, + BridgeParachainWestendInstance, + WithBridgeHubWestendMessagesInstance, + WithBridgeHubWestendMessageBridge, + >; + #[test] fn initialize_bridge_by_governance_works() { // for RococoBulletin finality @@ -275,15 +286,7 @@ mod bridge_hub_westend_tests { #[test] fn relayed_incoming_message_works() { // from Westend - bridge_hub_test_utils::test_cases::from_parachain::relayed_incoming_message_works::< - Runtime, - AllPalletsWithoutSystem, - ParachainSystem, - BridgeGrandpaWestendInstance, - BridgeParachainWestendInstance, - WithBridgeHubWestendMessagesInstance, - WithBridgeHubWestendMessageBridge, - >( + from_parachain::relayed_incoming_message_works::( collator_session_keys(), bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, bp_bridge_hub_westend::BRIDGE_HUB_WESTEND_PARACHAIN_ID, @@ -299,16 +302,7 @@ mod bridge_hub_westend_tests { #[test] pub fn complex_relay_extrinsic_works() { // for Westend - bridge_hub_test_utils::test_cases::from_parachain::complex_relay_extrinsic_works::< - Runtime, - AllPalletsWithoutSystem, - XcmConfig, - ParachainSystem, - BridgeGrandpaWestendInstance, - BridgeParachainWestendInstance, - WithBridgeHubWestendMessagesInstance, - WithBridgeHubWestendMessageBridge, - >( + from_parachain::complex_relay_extrinsic_works::( collator_session_keys(), bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, bp_bridge_hub_westend::BRIDGE_HUB_WESTEND_PARACHAIN_ID, @@ -341,16 +335,9 @@ mod bridge_hub_westend_tests { #[test] pub fn can_calculate_fee_for_complex_message_delivery_transaction() { - let estimated = bridge_hub_test_utils::test_cases::from_parachain::can_calculate_fee_for_complex_message_delivery_transaction::< - Runtime, - BridgeGrandpaWestendInstance, - BridgeParachainWestendInstance, - WithBridgeHubWestendMessagesInstance, - WithBridgeHubWestendMessageBridge, - >( - collator_session_keys(), - construct_and_estimate_extrinsic_fee - ); + let estimated = from_parachain::can_calculate_fee_for_complex_message_delivery_transaction::< + RuntimeTestsAdapter, + >(collator_session_keys(), construct_and_estimate_extrinsic_fee); // check if estimated value is sane let max_expected = bp_bridge_hub_rococo::BridgeHubRococoBaseDeliveryFeeInRocs::get(); @@ -364,16 +351,10 @@ mod bridge_hub_westend_tests { #[test] pub fn can_calculate_fee_for_complex_message_confirmation_transaction() { - let estimated = bridge_hub_test_utils::test_cases::from_parachain::can_calculate_fee_for_complex_message_confirmation_transaction::< - Runtime, - BridgeGrandpaWestendInstance, - BridgeParachainWestendInstance, - WithBridgeHubWestendMessagesInstance, - WithBridgeHubWestendMessageBridge, - >( - collator_session_keys(), - construct_and_estimate_extrinsic_fee - ); + let estimated = + from_parachain::can_calculate_fee_for_complex_message_confirmation_transaction::< + RuntimeTestsAdapter, + >(collator_session_keys(), construct_and_estimate_extrinsic_fee); // check if estimated value is sane let max_expected = bp_bridge_hub_rococo::BridgeHubRococoBaseConfirmationFeeInRocs::get(); diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/tests/tests.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/tests/tests.rs index 9a7f13f14c3..0e58b7b408e 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/tests/tests.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/tests/tests.rs @@ -18,6 +18,7 @@ use bp_polkadot_core::Signature; use bridge_common_config::{DeliveryRewardInBalance, RequiredStakeForStakeAndSlash}; +use bridge_hub_test_utils::test_cases::from_parachain; use bridge_hub_westend_runtime::{ bridge_common_config, bridge_to_rococo_config, xcm_config::{RelayNetwork, WestendLocation, XcmConfig}, @@ -43,6 +44,16 @@ use xcm::latest::prelude::*; // Para id of sibling chain used in tests. pub const SIBLING_PARACHAIN_ID: u32 = 1000; +// Runtime from tests PoV +type RuntimeTestsAdapter = from_parachain::WithRemoteParachainHelperAdapter< + Runtime, + AllPalletsWithoutSystem, + BridgeGrandpaRococoInstance, + BridgeParachainRococoInstance, + WithBridgeHubRococoMessagesInstance, + WithBridgeHubRococoMessageBridge, +>; + parameter_types! { pub CheckingAccount: AccountId = PolkadotXcm::check_account(); } @@ -239,15 +250,7 @@ fn message_dispatch_routing_works() { #[test] fn relayed_incoming_message_works() { - bridge_hub_test_utils::test_cases::from_parachain::relayed_incoming_message_works::< - Runtime, - AllPalletsWithoutSystem, - ParachainSystem, - BridgeGrandpaRococoInstance, - BridgeParachainRococoInstance, - WithBridgeHubRococoMessagesInstance, - WithBridgeHubRococoMessageBridge, - >( + from_parachain::relayed_incoming_message_works::( collator_session_keys(), bp_bridge_hub_westend::BRIDGE_HUB_WESTEND_PARACHAIN_ID, bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, @@ -262,16 +265,7 @@ fn relayed_incoming_message_works() { #[test] pub fn complex_relay_extrinsic_works() { - bridge_hub_test_utils::test_cases::from_parachain::complex_relay_extrinsic_works::< - Runtime, - AllPalletsWithoutSystem, - XcmConfig, - ParachainSystem, - BridgeGrandpaRococoInstance, - BridgeParachainRococoInstance, - WithBridgeHubRococoMessagesInstance, - WithBridgeHubRococoMessageBridge, - >( + from_parachain::complex_relay_extrinsic_works::( collator_session_keys(), bp_bridge_hub_westend::BRIDGE_HUB_WESTEND_PARACHAIN_ID, bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID, @@ -304,16 +298,9 @@ pub fn can_calculate_weight_for_paid_export_message_with_reserve_transfer() { #[test] pub fn can_calculate_fee_for_complex_message_delivery_transaction() { - let estimated = bridge_hub_test_utils::test_cases::from_parachain::can_calculate_fee_for_complex_message_delivery_transaction::< - Runtime, - BridgeGrandpaRococoInstance, - BridgeParachainRococoInstance, - WithBridgeHubRococoMessagesInstance, - WithBridgeHubRococoMessageBridge, - >( - collator_session_keys(), - construct_and_estimate_extrinsic_fee - ); + let estimated = from_parachain::can_calculate_fee_for_complex_message_delivery_transaction::< + RuntimeTestsAdapter, + >(collator_session_keys(), construct_and_estimate_extrinsic_fee); // check if estimated value is sane let max_expected = bp_bridge_hub_westend::BridgeHubWestendBaseDeliveryFeeInWnds::get(); @@ -327,16 +314,9 @@ pub fn can_calculate_fee_for_complex_message_delivery_transaction() { #[test] pub fn can_calculate_fee_for_complex_message_confirmation_transaction() { - let estimated = bridge_hub_test_utils::test_cases::from_parachain::can_calculate_fee_for_complex_message_confirmation_transaction::< - Runtime, - BridgeGrandpaRococoInstance, - BridgeParachainRococoInstance, - WithBridgeHubRococoMessagesInstance, - WithBridgeHubRococoMessageBridge, - >( - collator_session_keys(), - construct_and_estimate_extrinsic_fee - ); + let estimated = from_parachain::can_calculate_fee_for_complex_message_confirmation_transaction::< + RuntimeTestsAdapter, + >(collator_session_keys(), construct_and_estimate_extrinsic_fee); // check if estimated value is sane let max_expected = bp_bridge_hub_westend::BridgeHubWestendBaseConfirmationFeeInWnds::get(); diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs index e6407e60989..8d4e6a034a7 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs @@ -49,9 +49,9 @@ use xcm::latest::prelude::*; /// Helper trait to test bridges with remote GRANDPA chain. /// -/// This is only used to decrease amount of lines, dedicated to bounds +/// This is only used to decrease amount of lines, dedicated to bounds. pub trait WithRemoteGrandpaChainHelper { - /// This chaiin runtime. + /// This chain runtime. type Runtime: BasicParachainRuntime + cumulus_pallet_xcmp_queue::Config + BridgeGrandpaConfig< @@ -74,7 +74,7 @@ pub trait WithRemoteGrandpaChainHelper { type MB: MessageBridge; } -/// Adapter struct that implements `WithRemoteGrandpaChainHelper` +/// Adapter struct that implements [`WithRemoteGrandpaChainHelper`]. pub struct WithRemoteGrandpaChainHelperAdapter( sp_std::marker::PhantomData<(Runtime, AllPalletsWithoutSystem, GPI, MPI, MB)>, ); diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs index dff71d23df8..fa1049cc6ec 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs @@ -22,43 +22,102 @@ use crate::{ test_data, }; +use bp_header_chain::ChainWithGrandpa; use bp_messages::{ source_chain::TargetHeaderChain, target_chain::SourceHeaderChain, LaneId, UnrewardedRelayersState, }; use bp_polkadot_core::parachains::ParaHash; use bp_relayers::{RewardsAccountOwner, RewardsAccountParams}; -use bp_runtime::{Parachain, UnderlyingChainOf}; +use bp_runtime::{HashOf, Parachain, UnderlyingChainOf}; use bridge_runtime_common::{ messages::{ source::FromBridgedChainMessagesDeliveryProof, target::FromBridgedChainMessagesProof, - BridgedChain as MessageBridgedChain, MessageBridge, + BridgedChain as MessageBridgedChain, MessageBridge, ThisChain as MessageThisChain, }, messages_xcm_extension::XcmAsPlainPayload, }; -use frame_support::traits::{Get, OnFinalize, OnInitialize, OriginTrait}; +use frame_support::traits::{Get, OnFinalize, OnInitialize}; use frame_system::pallet_prelude::BlockNumberFor; -use pallet_bridge_parachains::{RelayBlockHash, RelayBlockNumber}; +use pallet_bridge_grandpa::{Call as BridgeGrandpaCall, Config as BridgeGrandpaConfig}; +use pallet_bridge_messages::{Call as BridgeMessagesCall, Config as BridgeMessagesConfig}; +use pallet_bridge_parachains::{ + Call as BridgeParachainsCall, Config as BridgeParachainsConfig, RelayBlockHash, + RelayBlockNumber, +}; use parachains_runtimes_test_utils::{ - AccountIdOf, BasicParachainRuntime, CollatorSessionKeys, ValidatorIdOf, + AccountIdOf, BasicParachainRuntime, CollatorSessionKeys, RuntimeCallOf, }; use sp_keyring::AccountKeyring::*; use sp_runtime::{traits::Header as HeaderT, AccountId32}; use xcm::latest::prelude::*; +/// Helper trait to test bridges with remote parachain. +/// +/// This is only used to decrease amount of lines, dedicated to bounds. +pub trait WithRemoteParachainHelper { + /// This chain runtime. + type Runtime: BasicParachainRuntime + + cumulus_pallet_xcmp_queue::Config + + BridgeGrandpaConfig + + BridgeParachainsConfig + + BridgeMessagesConfig< + Self::MPI, + InboundPayload = XcmAsPlainPayload, + InboundRelayer = bp_runtime::AccountIdOf>, + OutboundPayload = XcmAsPlainPayload, + > + pallet_bridge_relayers::Config; + /// All pallets of this chain, excluding system pallet. + type AllPalletsWithoutSystem: OnInitialize> + + OnFinalize>; + /// Instance of the `pallet-bridge-grandpa`, used to bridge with remote relay chain. + type GPI: 'static; + /// Instance of the `pallet-bridge-parachains`, used to bridge with remote parachain. + type PPI: 'static; + /// Instance of the `pallet-bridge-messages`, used to bridge with remote parachain. + type MPI: 'static; + /// Messages bridge definition. + type MB: MessageBridge; +} + +/// Adapter struct that implements `WithRemoteParachainHelper`. +pub struct WithRemoteParachainHelperAdapter( + sp_std::marker::PhantomData<(Runtime, AllPalletsWithoutSystem, GPI, PPI, MPI, MB)>, +); + +impl WithRemoteParachainHelper + for WithRemoteParachainHelperAdapter +where + Runtime: BasicParachainRuntime + + cumulus_pallet_xcmp_queue::Config + + BridgeGrandpaConfig + + BridgeParachainsConfig + + BridgeMessagesConfig< + MPI, + InboundPayload = XcmAsPlainPayload, + InboundRelayer = bp_runtime::AccountIdOf>, + OutboundPayload = XcmAsPlainPayload, + > + pallet_bridge_relayers::Config, + AllPalletsWithoutSystem: + OnInitialize> + OnFinalize>, + GPI: 'static, + PPI: 'static, + MPI: 'static, + MB: MessageBridge, +{ + type Runtime = Runtime; + type AllPalletsWithoutSystem = AllPalletsWithoutSystem; + type GPI = GPI; + type PPI = PPI; + type MPI = MPI; + type MB = MB; +} + /// Test-case makes sure that Runtime can dispatch XCM messages submitted by relayer, /// with proofs (finality, para heads, message) independently submitted. /// Also verifies relayer transaction signed extensions work as intended. -pub fn relayed_incoming_message_works< - Runtime, - AllPalletsWithoutSystem, - HrmpChannelOpener, - GPI, - PPI, - MPI, - MB, ->( - collator_session_key: CollatorSessionKeys, +pub fn relayed_incoming_message_works( + collator_session_key: CollatorSessionKeys, runtime_para_id: u32, bridged_para_id: u32, bridged_chain_id: bp_runtime::ChainId, @@ -68,46 +127,30 @@ pub fn relayed_incoming_message_works< prepare_configuration: impl Fn(), construct_and_apply_extrinsic: fn( sp_keyring::AccountKeyring, - ::RuntimeCall, + ::RuntimeCall, ) -> sp_runtime::DispatchOutcome, ) where - Runtime: BasicParachainRuntime - + cumulus_pallet_xcmp_queue::Config - + cumulus_pallet_parachain_system::Config - + pallet_bridge_grandpa::Config - + pallet_bridge_parachains::Config - + pallet_bridge_messages::Config - + pallet_bridge_relayers::Config, - AllPalletsWithoutSystem: - OnInitialize> + OnFinalize>, - GPI: 'static, - PPI: 'static, - MPI: 'static, - MB: MessageBridge, - ::BridgedChain: Send + Sync + 'static, - ::ThisChain: Send + Sync + 'static, - UnderlyingChainOf>: bp_runtime::Chain + Parachain, - HrmpChannelOpener: frame_support::inherent::ProvideInherent< - Call = cumulus_pallet_parachain_system::Call, - >, - ValidatorIdOf: From>, - >::SourceHeaderChain: - SourceHeaderChain>, - >::BridgedChain: - bp_runtime::Chain, - ParaHash: From< - <>::BridgedChain as bp_runtime::Chain>::Hash, - >, - ::AccountId: - Into<<::RuntimeOrigin as OriginTrait>::AccountId>, - ::AccountId: From, - AccountIdOf: From, - >::InboundRelayer: From, - ::RuntimeCall: From> - + From> - + From>, + RuntimeHelper: WithRemoteParachainHelper, + AccountIdOf: From, + RuntimeCallOf: From> + + From> + + From>, + UnderlyingChainOf>: + bp_runtime::Chain + Parachain, + >::BridgedChain: + bp_runtime::Chain + ChainWithGrandpa, + >::SourceHeaderChain: + SourceHeaderChain< + MessagesProof = FromBridgedChainMessagesProof< + HashOf>, + >, + >, { - helpers::relayed_incoming_message_works::( + helpers::relayed_incoming_message_works::< + RuntimeHelper::Runtime, + RuntimeHelper::AllPalletsWithoutSystem, + RuntimeHelper::MPI, + >( collator_session_key, runtime_para_id, sibling_parachain_id, @@ -124,8 +167,8 @@ pub fn relayed_incoming_message_works< prepare_configuration(); // start with bridged relay chain block#0 - helpers::initialize_bridge_grandpa_pallet::( - test_data::initialization_data::(0), + helpers::initialize_bridge_grandpa_pallet::( + test_data::initialization_data::(0), ); // generate bridged relay chain finality, parachain heads and message proofs, @@ -138,8 +181,8 @@ pub fn relayed_incoming_message_works< para_heads_proof, message_proof, ) = test_data::from_parachain::make_complex_relayer_delivery_proofs::< - >::BridgedChain, - MB, + >::BridgedChain, + RuntimeHelper::MB, (), >( lane_id, @@ -156,30 +199,38 @@ pub fn relayed_incoming_message_works< let relay_chain_header_number = *relay_chain_header.number(); vec![ ( - pallet_bridge_grandpa::Call::::submit_finality_proof { + BridgeGrandpaCall::::submit_finality_proof { finality_target: Box::new(relay_chain_header), justification: grandpa_justification, }.into(), - helpers::VerifySubmitGrandpaFinalityProofOutcome::::expect_best_header_hash(relay_chain_header_hash), + helpers::VerifySubmitGrandpaFinalityProofOutcome::::expect_best_header_hash( + relay_chain_header_hash, + ), ), ( - pallet_bridge_parachains::Call::::submit_parachain_heads { + BridgeParachainsCall::::submit_parachain_heads { at_relay_block: (relay_chain_header_number, relay_chain_header_hash), parachains: parachain_heads, parachain_heads_proof: para_heads_proof, }.into(), - helpers::VerifySubmitParachainHeaderProofOutcome::::expect_best_header_hash(bridged_para_id, parachain_head_hash), + helpers::VerifySubmitParachainHeaderProofOutcome::::expect_best_header_hash( + bridged_para_id, + parachain_head_hash, + ), ), ( - pallet_bridge_messages::Call::::receive_messages_proof { + BridgeMessagesCall::::receive_messages_proof { relayer_id_at_bridged_chain, proof: message_proof, messages_count: 1, dispatch_weight: Weight::from_parts(1000000000, 0), }.into(), Box::new(( - helpers::VerifySubmitMessagesProofOutcome::::expect_last_delivered_nonce(lane_id, 1), - helpers::VerifyRelayerRewarded::::expect_relayer_reward( + helpers::VerifySubmitMessagesProofOutcome::::expect_last_delivered_nonce( + lane_id, + 1, + ), + helpers::VerifyRelayerRewarded::::expect_relayer_reward( relayer_id_at_this_chain, RewardsAccountParams::new( lane_id, @@ -197,17 +248,8 @@ pub fn relayed_incoming_message_works< /// Test-case makes sure that Runtime can dispatch XCM messages submitted by relayer, /// with proofs (finality, para heads, message) batched together in signed extrinsic. /// Also verifies relayer transaction signed extensions work as intended. -pub fn complex_relay_extrinsic_works< - Runtime, - AllPalletsWithoutSystem, - XcmConfig, - HrmpChannelOpener, - GPI, - PPI, - MPI, - MB, ->( - collator_session_key: CollatorSessionKeys, +pub fn complex_relay_extrinsic_works( + collator_session_key: CollatorSessionKeys, runtime_para_id: u32, bridged_para_id: u32, sibling_parachain_id: u32, @@ -217,48 +259,33 @@ pub fn complex_relay_extrinsic_works< prepare_configuration: impl Fn(), construct_and_apply_extrinsic: fn( sp_keyring::AccountKeyring, - ::RuntimeCall, + ::RuntimeCall, ) -> sp_runtime::DispatchOutcome, ) where - Runtime: BasicParachainRuntime - + cumulus_pallet_xcmp_queue::Config - + cumulus_pallet_parachain_system::Config - + pallet_bridge_grandpa::Config - + pallet_bridge_parachains::Config - + pallet_bridge_messages::Config - + pallet_bridge_relayers::Config - + pallet_utility::Config, - AllPalletsWithoutSystem: - OnInitialize> + OnFinalize>, - GPI: 'static, - PPI: 'static, - MPI: 'static, - MB: MessageBridge, - ::BridgedChain: Send + Sync + 'static, - ::ThisChain: Send + Sync + 'static, - UnderlyingChainOf>: bp_runtime::Chain + Parachain, - HrmpChannelOpener: frame_support::inherent::ProvideInherent< - Call = cumulus_pallet_parachain_system::Call, - >, - ValidatorIdOf: From>, - >::SourceHeaderChain: - SourceHeaderChain>, - >::BridgedChain: - bp_runtime::Chain, - ParaHash: From< - <>::BridgedChain as bp_runtime::Chain>::Hash, - >, - ::AccountId: - Into<<::RuntimeOrigin as OriginTrait>::AccountId>, - ::AccountId: From, - AccountIdOf: From, - >::InboundRelayer: From, - ::RuntimeCall: From> - + From> - + From>, - ::RuntimeCall: From>, + RuntimeHelper: WithRemoteParachainHelper, + RuntimeHelper::Runtime: + pallet_utility::Config>, + AccountIdOf: From, + RuntimeCallOf: From> + + From> + + From> + + From>, + UnderlyingChainOf>: + bp_runtime::Chain + Parachain, + >::BridgedChain: + bp_runtime::Chain + ChainWithGrandpa, + >::SourceHeaderChain: + SourceHeaderChain< + MessagesProof = FromBridgedChainMessagesProof< + HashOf>, + >, + >, { - helpers::relayed_incoming_message_works::( + helpers::relayed_incoming_message_works::< + RuntimeHelper::Runtime, + RuntimeHelper::AllPalletsWithoutSystem, + RuntimeHelper::MPI, + >( collator_session_key, runtime_para_id, sibling_parachain_id, @@ -275,8 +302,8 @@ pub fn complex_relay_extrinsic_works< prepare_configuration(); // start with bridged relay chain block#0 - helpers::initialize_bridge_grandpa_pallet::( - test_data::initialization_data::(0), + helpers::initialize_bridge_grandpa_pallet::( + test_data::initialization_data::(0), ); // generate bridged relay chain finality, parachain heads and message proofs, @@ -289,8 +316,8 @@ pub fn complex_relay_extrinsic_works< para_heads_proof, message_proof, ) = test_data::from_parachain::make_complex_relayer_delivery_proofs::< - >::BridgedChain, - MB, + >::BridgedChain, + RuntimeHelper::MB, (), >( lane_id, @@ -306,30 +333,40 @@ pub fn complex_relay_extrinsic_works< let relay_chain_header_hash = relay_chain_header.hash(); let relay_chain_header_number = *relay_chain_header.number(); vec![( - pallet_utility::Call::::batch_all { + pallet_utility::Call::::batch_all { calls: vec![ - pallet_bridge_grandpa::Call::::submit_finality_proof { + BridgeGrandpaCall::::submit_finality_proof { finality_target: Box::new(relay_chain_header), justification: grandpa_justification, }.into(), - pallet_bridge_parachains::Call::::submit_parachain_heads { + BridgeParachainsCall::::submit_parachain_heads { at_relay_block: (relay_chain_header_number, relay_chain_header_hash), parachains: parachain_heads, parachain_heads_proof: para_heads_proof, }.into(), - pallet_bridge_messages::Call::::receive_messages_proof { + BridgeMessagesCall::::receive_messages_proof { relayer_id_at_bridged_chain, proof: message_proof, messages_count: 1, dispatch_weight: Weight::from_parts(1000000000, 0), }.into(), ], - }.into(), + } + .into(), Box::new(( - helpers::VerifySubmitGrandpaFinalityProofOutcome::::expect_best_header_hash(relay_chain_header_hash), - helpers::VerifySubmitParachainHeaderProofOutcome::::expect_best_header_hash(bridged_para_id, parachain_head_hash), - helpers::VerifySubmitMessagesProofOutcome::::expect_last_delivered_nonce(lane_id, 1), - helpers::VerifyRelayerRewarded::::expect_relayer_reward( + helpers::VerifySubmitGrandpaFinalityProofOutcome::< + RuntimeHelper::Runtime, + RuntimeHelper::GPI, + >::expect_best_header_hash(relay_chain_header_hash), + helpers::VerifySubmitParachainHeaderProofOutcome::< + RuntimeHelper::Runtime, + RuntimeHelper::PPI, + >::expect_best_header_hash(bridged_para_id, parachain_head_hash), + helpers::VerifySubmitMessagesProofOutcome::< + RuntimeHelper::Runtime, + RuntimeHelper::MPI, + >::expect_last_delivered_nonce(lane_id, 1), + helpers::VerifyRelayerRewarded::::expect_relayer_reward( relayer_id_at_this_chain, RewardsAccountParams::new( lane_id, @@ -345,45 +382,29 @@ pub fn complex_relay_extrinsic_works< /// Estimates transaction fee for default message delivery transaction (batched with required /// proofs) from bridged parachain. -pub fn can_calculate_fee_for_complex_message_delivery_transaction( - collator_session_key: CollatorSessionKeys, - compute_extrinsic_fee: fn(pallet_utility::Call::) -> u128, +pub fn can_calculate_fee_for_complex_message_delivery_transaction( + collator_session_key: CollatorSessionKeys, + compute_extrinsic_fee: fn(pallet_utility::Call) -> u128, ) -> u128 where - Runtime: frame_system::Config - + pallet_balances::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config - + pallet_collator_selection::Config - + cumulus_pallet_parachain_system::Config - + pallet_bridge_grandpa::Config - + pallet_bridge_parachains::Config - + pallet_bridge_messages::Config - + pallet_utility::Config, - GPI: 'static, - PPI: 'static, - MPI: 'static, - MB: MessageBridge, - ::BridgedChain: Send + Sync + 'static, - ::ThisChain: Send + Sync + 'static, - UnderlyingChainOf>: bp_runtime::Chain + Parachain, - ValidatorIdOf: From>, - <>::SourceHeaderChain as SourceHeaderChain>::MessagesProof: - From>, - >::BridgedChain: bp_runtime::Chain, - ParaHash: From<<>::BridgedChain as bp_runtime::Chain>::Hash>, - ::AccountId: - Into<<::RuntimeOrigin as OriginTrait>::AccountId>, - ::AccountId: From, - AccountIdOf: From, - >::InboundRelayer: From, - ::RuntimeCall: - From> - + From> - + From>, + RuntimeHelper: WithRemoteParachainHelper, + RuntimeHelper::Runtime: + pallet_utility::Config>, + RuntimeCallOf: From> + + From> + + From>, + UnderlyingChainOf>: + bp_runtime::Chain + Parachain, + >::BridgedChain: + bp_runtime::Chain + ChainWithGrandpa, + >::SourceHeaderChain: + SourceHeaderChain< + MessagesProof = FromBridgedChainMessagesProof< + HashOf>, + >, + >, { - run_test::(collator_session_key, 1000, vec![], || { + run_test::(collator_session_key, 1000, vec![], || { // generate bridged relay chain finality, parachain heads and message proofs, // to be submitted by relayer to this chain. // @@ -398,8 +419,8 @@ where para_heads_proof, message_proof, ) = test_data::from_parachain::make_complex_relayer_delivery_proofs::< - >::BridgedChain, - MB, + >::BridgedChain, + RuntimeHelper::MB, (), >( LaneId::default(), @@ -414,17 +435,18 @@ where // generate batch call that provides finality for bridged relay and parachains + message // proof let batch = test_data::from_parachain::make_complex_relayer_delivery_batch::< - Runtime, - GPI, - PPI, - MPI, + RuntimeHelper::Runtime, + RuntimeHelper::GPI, + RuntimeHelper::PPI, + RuntimeHelper::MPI, + _, >( relay_chain_header, grandpa_justification, parachain_heads, para_heads_proof, message_proof, - Dave.public().into(), + helpers::relayer_id_at_bridged_chain::(), ); let estimated_fee = compute_extrinsic_fee(batch); @@ -432,7 +454,7 @@ where target: "bridges::estimate", "Estimate fee: {:?} for single message delivery for runtime: {:?}", estimated_fee, - Runtime::Version::get(), + ::Version::get(), ); estimated_fee @@ -441,50 +463,34 @@ where /// Estimates transaction fee for default message confirmation transaction (batched with required /// proofs) from bridged parachain. -pub fn can_calculate_fee_for_complex_message_confirmation_transaction( - collator_session_key: CollatorSessionKeys, - compute_extrinsic_fee: fn(pallet_utility::Call::) -> u128, +pub fn can_calculate_fee_for_complex_message_confirmation_transaction( + collator_session_key: CollatorSessionKeys, + compute_extrinsic_fee: fn(pallet_utility::Call) -> u128, ) -> u128 where - Runtime: frame_system::Config - + pallet_balances::Config - + pallet_session::Config - + pallet_xcm::Config - + parachain_info::Config - + pallet_collator_selection::Config - + cumulus_pallet_parachain_system::Config - + pallet_bridge_grandpa::Config - + pallet_bridge_parachains::Config - + pallet_bridge_messages::Config - + pallet_utility::Config, - GPI: 'static, - PPI: 'static, - MPI: 'static, - MB: MessageBridge, - ::BridgedChain: Send + Sync + 'static, - ::ThisChain: Send + Sync + 'static, - <::ThisChain as bp_runtime::Chain>::AccountId: From, - UnderlyingChainOf>: bp_runtime::Chain + Parachain, - ValidatorIdOf: From>, - <>::SourceHeaderChain as SourceHeaderChain>::MessagesProof: - From>, - >::BridgedChain: bp_runtime::Chain, - ParaHash: From<<>::BridgedChain as bp_runtime::Chain>::Hash>, - ::AccountId: - Into<<::RuntimeOrigin as OriginTrait>::AccountId>, - ::AccountId: From, - AccountIdOf: From, - >::InboundRelayer: From, - <>::TargetHeaderChain as TargetHeaderChain< + RuntimeHelper: WithRemoteParachainHelper, + AccountIdOf: From, + RuntimeHelper::Runtime: + pallet_utility::Config>, + MessageThisChain: + bp_runtime::Chain>, + RuntimeCallOf: From> + + From> + + From>, + UnderlyingChainOf>: + bp_runtime::Chain + Parachain, + >::BridgedChain: + bp_runtime::Chain + ChainWithGrandpa, + >::TargetHeaderChain: + TargetHeaderChain< XcmAsPlainPayload, - Runtime::AccountId, - >>::MessagesDeliveryProof: From>, - ::RuntimeCall: - From> - + From> - + From>, + AccountIdOf, + MessagesDeliveryProof = FromBridgedChainMessagesDeliveryProof< + HashOf>>, + >, + >, { - run_test::(collator_session_key, 1000, vec![], || { + run_test::(collator_session_key, 1000, vec![], || { // generate bridged relay chain finality, parachain heads and message proofs, // to be submitted by relayer to this chain. let unrewarded_relayers = UnrewardedRelayersState { @@ -500,18 +506,25 @@ where para_heads_proof, message_delivery_proof, ) = test_data::from_parachain::make_complex_relayer_confirmation_proofs::< - >::BridgedChain, - MB, + >::BridgedChain, + RuntimeHelper::MB, (), - >(LaneId::default(), 1, 5, 1_000, Alice.public().into(), unrewarded_relayers.clone()); + >( + LaneId::default(), + 1, + 5, + 1_000, + AccountId32::from(Alice.public()).into(), + unrewarded_relayers.clone(), + ); // generate batch call that provides finality for bridged relay and parachains + message // proof let batch = test_data::from_parachain::make_complex_relayer_confirmation_batch::< - Runtime, - GPI, - PPI, - MPI, + RuntimeHelper::Runtime, + RuntimeHelper::GPI, + RuntimeHelper::PPI, + RuntimeHelper::MPI, >( relay_chain_header, grandpa_justification, @@ -526,7 +539,7 @@ where target: "bridges::estimate", "Estimate fee: {:?} for single message confirmation for runtime: {:?}", estimated_fee, - Runtime::Version::get(), + ::Version::get(), ); estimated_fee diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_parachain.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_parachain.rs index 7ac10aa9e73..932ba231239 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_parachain.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_parachain.rs @@ -22,12 +22,14 @@ use bp_messages::{ source_chain::TargetHeaderChain, target_chain::SourceHeaderChain, LaneId, UnrewardedRelayersState, Weight, }; -use bp_runtime::{BlockNumberOf, HeaderOf, Parachain, StorageProofSize, UnderlyingChainOf}; +use bp_runtime::{ + AccountIdOf, BlockNumberOf, HeaderOf, Parachain, StorageProofSize, UnderlyingChainOf, +}; use bp_test_utils::prepare_parachain_heads_proof; use bridge_runtime_common::{ messages::{ source::FromBridgedChainMessagesDeliveryProof, target::FromBridgedChainMessagesProof, - BridgedChain as MessageBridgedChain, MessageBridge, + BridgedChain as MessageBridgedChain, MessageBridge, ThisChain as MessageThisChain, }, messages_generation::{ encode_all_messages, encode_lane_data, prepare_message_delivery_storage_proof, @@ -38,7 +40,7 @@ use bridge_runtime_common::{ use codec::Encode; use pallet_bridge_grandpa::BridgedHeader; use pallet_bridge_parachains::{RelayBlockHash, RelayBlockNumber}; -use sp_runtime::{traits::Header as HeaderT, AccountId32}; +use sp_runtime::traits::Header as HeaderT; use xcm::latest::prelude::*; use bp_header_chain::{justification::GrandpaJustification, ChainWithGrandpa}; @@ -47,17 +49,21 @@ use bp_polkadot_core::parachains::{ParaHash, ParaHead, ParaHeadsProof, ParaId}; use sp_runtime::SaturatedConversion; /// Prepare a batch call with relay finality proof, parachain head proof and message proof. -pub fn make_complex_relayer_delivery_batch( +pub fn make_complex_relayer_delivery_batch( relay_chain_header: BridgedHeader, grandpa_justification: GrandpaJustification>, parachain_heads: Vec<(ParaId, ParaHash)>, para_heads_proof: ParaHeadsProof, message_proof: FromBridgedChainMessagesProof, - relayer_id_at_bridged_chain: AccountId32, + relayer_id_at_bridged_chain: InboundRelayer, ) -> pallet_utility::Call where Runtime:pallet_bridge_grandpa::Config + pallet_bridge_parachains::Config - + pallet_bridge_messages::Config + + pallet_bridge_messages::Config< + MPI, + InboundPayload = XcmAsPlainPayload, + InboundRelayer = InboundRelayer, + > + pallet_utility::Config, GPI: 'static, PPI: 'static, @@ -66,7 +72,6 @@ pub fn make_complex_relayer_delivery_batch( <>::BridgedChain as bp_runtime::Chain>::Hash: From, <>::SourceHeaderChain as SourceHeaderChain>::MessagesProof: From>, - >::InboundRelayer: From, ::RuntimeCall: From> + From> @@ -117,10 +122,11 @@ where MPI: 'static, >::BridgedChain: bp_runtime::Chain + ChainWithGrandpa, - <>::TargetHeaderChain as TargetHeaderChain< + >::TargetHeaderChain: TargetHeaderChain< XcmAsPlainPayload, Runtime::AccountId, - >>::MessagesDeliveryProof: From>, + MessagesDeliveryProof = FromBridgedChainMessagesDeliveryProof, + >, ::RuntimeCall: From> + From> + From>, @@ -141,7 +147,7 @@ where }; let submit_message_delivery_proof = pallet_bridge_messages::Call::::receive_messages_delivery_proof { - proof: message_delivery_proof.into(), + proof: message_delivery_proof, relayers_state, }; pallet_utility::Call::::batch_all { @@ -174,8 +180,6 @@ where BridgedRelayChain: bp_runtime::Chain + ChainWithGrandpa, MB: MessageBridge, - ::BridgedChain: Send + Sync + 'static, - ::ThisChain: Send + Sync + 'static, UnderlyingChainOf>: bp_runtime::Chain + Parachain, { let message_payload = prepare_inbound_xcm(xcm_message, message_destination); @@ -223,7 +227,7 @@ pub fn make_complex_relayer_confirmation_proofs>, relayers_state: UnrewardedRelayersState, ) -> ( HeaderOf, @@ -237,9 +241,6 @@ where BridgedRelayChain: bp_runtime::Chain + ChainWithGrandpa, MB: MessageBridge, - ::BridgedChain: Send + Sync + 'static, - ::ThisChain: Send + Sync + 'static, - <::ThisChain as bp_runtime::Chain>::AccountId: From, UnderlyingChainOf>: bp_runtime::Chain + Parachain, { // prepare para storage proof containing message delivery proof -- GitLab From 32c047af388984f8cae432359d398ed895c758e1 Mon Sep 17 00:00:00 2001 From: Alejandro Martinez Andres <11448715+al3mart@users.noreply.github.com> Date: Thu, 21 Dec 2023 20:23:56 +0100 Subject: [PATCH 076/191] Bump AH and BH runtime versions (#2775) After merging https://github.com/paritytech/polkadot-sdk/pull/2522 asset-hub-rococo and bridge-hub-rococo runtime versions need to be bumped for their deployment. --------- Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> --- cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs | 2 +- .../runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs index ae21b872976..61939a2c80a 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs @@ -111,7 +111,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("statemine"), impl_name: create_runtime_str!("statemine"), authoring_version: 1, - spec_version: 1_005_000, + spec_version: 1_005_001, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 14, diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs index 4746e873bfa..b21cde248e1 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs @@ -209,7 +209,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("bridge-hub-rococo"), impl_name: create_runtime_str!("bridge-hub-rococo"), authoring_version: 1, - spec_version: 1_005_000, + spec_version: 1_005_001, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 4, -- GitLab From 8d459d957872ff2513b4ee352d04638d7702f83a Mon Sep 17 00:00:00 2001 From: Branislav Kontur Date: Fri, 22 Dec 2023 09:44:50 +0100 Subject: [PATCH 077/191] Try to set `beacon-spec-mainnet` as default on runtime and not binary (#2777) --- .../runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml | 2 +- cumulus/polkadot-parachain/Cargo.toml | 8 +------- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml index 9cf4a07b6d2..d362c5f12a6 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml @@ -130,7 +130,7 @@ bridge-runtime-common = { path = "../../../../../bridges/bin/runtime-common", fe sp-keyring = { path = "../../../../../substrate/primitives/keyring" } [features] -default = ["std"] +default = ["beacon-spec-mainnet", "std"] std = [ "bp-asset-hub-rococo/std", "bp-asset-hub-westend/std", diff --git a/cumulus/polkadot-parachain/Cargo.toml b/cumulus/polkadot-parachain/Cargo.toml index dd17ccebaf1..1c055f6b2dd 100644 --- a/cumulus/polkadot-parachain/Cargo.toml +++ b/cumulus/polkadot-parachain/Cargo.toml @@ -118,13 +118,10 @@ tokio = { version = "1.32.0", features = ["macros", "parking_lot", "time"] } wait-timeout = "0.2" [features] -default = [ - "beacon-spec-mainnet", -] +default = [] runtime-benchmarks = [ "asset-hub-rococo-runtime/runtime-benchmarks", "asset-hub-westend-runtime/runtime-benchmarks", - "beacon-spec-mainnet", "bridge-hub-rococo-runtime/runtime-benchmarks", "bridge-hub-westend-runtime/runtime-benchmarks", "collectives-westend-runtime/runtime-benchmarks", @@ -164,6 +161,3 @@ try-runtime = [ "shell-runtime/try-runtime", "sp-runtime/try-runtime", ] -beacon-spec-mainnet = [ - "bridge-hub-rococo-runtime/beacon-spec-mainnet", -] -- GitLab From 46dd4b8f53e8a69fc1ac27606406bb8db63558cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Fri, 22 Dec 2023 09:50:35 +0100 Subject: [PATCH 078/191] frame-support: Print key as hex for corrupted state (#2779) --- substrate/frame/support/src/storage/unhashed.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/substrate/frame/support/src/storage/unhashed.rs b/substrate/frame/support/src/storage/unhashed.rs index aae83034ab7..776c7d0f3c3 100644 --- a/substrate/frame/support/src/storage/unhashed.rs +++ b/substrate/frame/support/src/storage/unhashed.rs @@ -27,8 +27,8 @@ pub fn get(key: &[u8]) -> Option { // TODO #3700: error should be handleable. log::error!( target: "runtime::storage", - "Corrupted state at `{:?}: {:?}`", - key, + "Corrupted state at `{}`: {:?}", + array_bytes::bytes2hex("0x", key), e, ); None -- GitLab From 96bec7a7abd71c0c38e284297d73e3b88f612a8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Fri, 22 Dec 2023 09:58:32 +0100 Subject: [PATCH 079/191] pallet-sudo: Accept `Root` origin as valid sudo (#2783) This changes `pallet-sudo` to also accept `Root` origin for `ensure_sudo`. This can be useful for parachains who allow the relay chain to have superuser rights to setup the sudo pallet for example. --- prdoc/pr_2783.prdoc | 12 ++++++++++++ substrate/frame/sudo/src/lib.rs | 14 +++++++++----- substrate/frame/sudo/src/tests.rs | 12 ++++++++++++ 3 files changed, 33 insertions(+), 5 deletions(-) create mode 100644 prdoc/pr_2783.prdoc diff --git a/prdoc/pr_2783.prdoc b/prdoc/pr_2783.prdoc new file mode 100644 index 00000000000..0e4c9906541 --- /dev/null +++ b/prdoc/pr_2783.prdoc @@ -0,0 +1,12 @@ +title: "Accept Root origin as valid sudo" + +doc: + - audience: Runtime User + description: | + Dispatchables of `pallet-sudo` will now also accept the `Root` origin + as valid `sudo` origin. This enhancement is useful for parachains that + allow the relay chain as a superuser. It enables the relay chain to send + an XCM message to initialize the sudo key. + +crates: + - name: "pallet-sudo" diff --git a/substrate/frame/sudo/src/lib.rs b/substrate/frame/sudo/src/lib.rs index d556c5eb6ae..4f14c32ff76 100644 --- a/substrate/frame/sudo/src/lib.rs +++ b/substrate/frame/sudo/src/lib.rs @@ -349,12 +349,16 @@ pub mod pallet { impl Pallet { /// Ensure that the caller is the sudo key. pub(crate) fn ensure_sudo(origin: OriginFor) -> DispatchResult { - let sender = ensure_signed(origin)?; - - if Self::key().map_or(false, |k| k == sender) { - Ok(()) + let sender = ensure_signed_or_root(origin)?; + + if let Some(sender) = sender { + if Self::key().map_or(false, |k| k == sender) { + Ok(()) + } else { + Err(Error::::RequireSudo.into()) + } } else { - Err(Error::::RequireSudo.into()) + Ok(()) } } } diff --git a/substrate/frame/sudo/src/tests.rs b/substrate/frame/sudo/src/tests.rs index 13dc069ddef..73689415a73 100644 --- a/substrate/frame/sudo/src/tests.rs +++ b/substrate/frame/sudo/src/tests.rs @@ -169,6 +169,18 @@ fn remove_key_works() { }); } +#[test] +fn using_root_origin_works() { + new_test_ext(1).execute_with(|| { + assert_ok!(Sudo::remove_key(RuntimeOrigin::root())); + assert!(Sudo::key().is_none()); + System::assert_has_event(TestEvent::Sudo(Event::KeyRemoved {})); + + assert_ok!(Sudo::set_key(RuntimeOrigin::root(), 1)); + assert_eq!(Some(1), Sudo::key()); + }); +} + #[test] fn sudo_as_basics() { new_test_ext(1).execute_with(|| { -- GitLab From d7ca2cb5f176dbf7e53aee97e728d8f7c30011ee Mon Sep 17 00:00:00 2001 From: joe petrowski <25483142+joepetrowski@users.noreply.github.com> Date: Fri, 22 Dec 2023 10:08:25 +0100 Subject: [PATCH 080/191] Update Safe Call Filters (#2786) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Updates all safe call filters to allow `system::authorize_upgrade`. - Updates Coretime safe call filter to allow `sudo` and `system_set_storage`. - Update Coretime teleports to allow teleportation with other system chains. --------- Co-authored-by: Bastian Köcher --- .../assets/asset-hub-rococo/src/xcm_config.rs | 13 +++------- .../asset-hub-westend/src/xcm_config.rs | 13 +++------- .../bridge-hub-rococo/src/xcm_config.rs | 13 +++------- .../bridge-hub-westend/src/xcm_config.rs | 13 +++------- .../collectives-westend/src/xcm_config.rs | 13 +++------- .../coretime/coretime-rococo/src/lib.rs | 2 +- .../coretime-rococo/src/xcm_config.rs | 24 ++++++++++------- .../coretime-westend/src/xcm_config.rs | 26 +++++++++++-------- 8 files changed, 51 insertions(+), 66 deletions(-) diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs index ca581929c99..2826c18f3f7 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs @@ -283,19 +283,14 @@ impl Contains for SafeCallFilter { frame_system::Call::set_heap_pages { .. } | frame_system::Call::set_code { .. } | frame_system::Call::set_code_without_checks { .. } | + frame_system::Call::authorize_upgrade { .. } | + frame_system::Call::authorize_upgrade_without_checks { .. } | frame_system::Call::kill_prefix { .. }, ) | RuntimeCall::ParachainSystem(..) | RuntimeCall::Timestamp(..) | RuntimeCall::Balances(..) | - RuntimeCall::CollatorSelection( - pallet_collator_selection::Call::set_desired_candidates { .. } | - pallet_collator_selection::Call::set_candidacy_bond { .. } | - pallet_collator_selection::Call::register_as_candidate { .. } | - pallet_collator_selection::Call::leave_intent { .. } | - pallet_collator_selection::Call::set_invulnerables { .. } | - pallet_collator_selection::Call::add_invulnerable { .. } | - pallet_collator_selection::Call::remove_invulnerable { .. }, - ) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | + RuntimeCall::CollatorSelection(..) | + RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | RuntimeCall::XcmpQueue(..) | RuntimeCall::MessageQueue(..) | RuntimeCall::Assets( diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs index b257f263d48..cb2fedeb146 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs @@ -289,19 +289,14 @@ impl Contains for SafeCallFilter { frame_system::Call::set_heap_pages { .. } | frame_system::Call::set_code { .. } | frame_system::Call::set_code_without_checks { .. } | + frame_system::Call::authorize_upgrade { .. } | + frame_system::Call::authorize_upgrade_without_checks { .. } | frame_system::Call::kill_prefix { .. }, ) | RuntimeCall::ParachainSystem(..) | RuntimeCall::Timestamp(..) | RuntimeCall::Balances(..) | - RuntimeCall::CollatorSelection( - pallet_collator_selection::Call::set_desired_candidates { .. } | - pallet_collator_selection::Call::set_candidacy_bond { .. } | - pallet_collator_selection::Call::register_as_candidate { .. } | - pallet_collator_selection::Call::leave_intent { .. } | - pallet_collator_selection::Call::set_invulnerables { .. } | - pallet_collator_selection::Call::add_invulnerable { .. } | - pallet_collator_selection::Call::remove_invulnerable { .. }, - ) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | + RuntimeCall::CollatorSelection(..) | + RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | RuntimeCall::XcmpQueue(..) | RuntimeCall::MessageQueue(..) | RuntimeCall::Assets( diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs index 47828f13688..ac5c4afd52d 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs @@ -179,19 +179,14 @@ impl Contains for SafeCallFilter { frame_system::Call::set_heap_pages { .. } | frame_system::Call::set_code { .. } | frame_system::Call::set_code_without_checks { .. } | + frame_system::Call::authorize_upgrade { .. } | + frame_system::Call::authorize_upgrade_without_checks { .. } | frame_system::Call::kill_prefix { .. }, ) | RuntimeCall::ParachainSystem(..) | RuntimeCall::Timestamp(..) | RuntimeCall::Balances(..) | - RuntimeCall::CollatorSelection( - pallet_collator_selection::Call::set_desired_candidates { .. } | - pallet_collator_selection::Call::set_candidacy_bond { .. } | - pallet_collator_selection::Call::register_as_candidate { .. } | - pallet_collator_selection::Call::leave_intent { .. } | - pallet_collator_selection::Call::set_invulnerables { .. } | - pallet_collator_selection::Call::add_invulnerable { .. } | - pallet_collator_selection::Call::remove_invulnerable { .. }, - ) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | + RuntimeCall::CollatorSelection(..) | + RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | RuntimeCall::XcmpQueue(..) | RuntimeCall::MessageQueue(..) | RuntimeCall::BridgeWestendGrandpa(pallet_bridge_grandpa::Call::< diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/xcm_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/xcm_config.rs index d112328723d..397019190f3 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/xcm_config.rs @@ -158,19 +158,14 @@ impl Contains for SafeCallFilter { frame_system::Call::set_heap_pages { .. } | frame_system::Call::set_code { .. } | frame_system::Call::set_code_without_checks { .. } | + frame_system::Call::authorize_upgrade { .. } | + frame_system::Call::authorize_upgrade_without_checks { .. } | frame_system::Call::kill_prefix { .. }, ) | RuntimeCall::ParachainSystem(..) | RuntimeCall::Timestamp(..) | RuntimeCall::Balances(..) | - RuntimeCall::CollatorSelection( - pallet_collator_selection::Call::set_desired_candidates { .. } | - pallet_collator_selection::Call::set_candidacy_bond { .. } | - pallet_collator_selection::Call::register_as_candidate { .. } | - pallet_collator_selection::Call::leave_intent { .. } | - pallet_collator_selection::Call::set_invulnerables { .. } | - pallet_collator_selection::Call::add_invulnerable { .. } | - pallet_collator_selection::Call::remove_invulnerable { .. }, - ) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | + RuntimeCall::CollatorSelection(..) | + RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | RuntimeCall::XcmpQueue(..) | RuntimeCall::MessageQueue(..) | RuntimeCall::BridgeRococoGrandpa(pallet_bridge_grandpa::Call::< diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/xcm_config.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/xcm_config.rs index 1fde722e42e..2e64127d6a1 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/xcm_config.rs @@ -166,19 +166,14 @@ impl Contains for SafeCallFilter { frame_system::Call::set_heap_pages { .. } | frame_system::Call::set_code { .. } | frame_system::Call::set_code_without_checks { .. } | + frame_system::Call::authorize_upgrade { .. } | + frame_system::Call::authorize_upgrade_without_checks { .. } | frame_system::Call::kill_prefix { .. }, ) | RuntimeCall::ParachainSystem(..) | RuntimeCall::Timestamp(..) | RuntimeCall::Balances(..) | - RuntimeCall::CollatorSelection( - pallet_collator_selection::Call::set_desired_candidates { .. } | - pallet_collator_selection::Call::set_candidacy_bond { .. } | - pallet_collator_selection::Call::register_as_candidate { .. } | - pallet_collator_selection::Call::leave_intent { .. } | - pallet_collator_selection::Call::set_invulnerables { .. } | - pallet_collator_selection::Call::add_invulnerable { .. } | - pallet_collator_selection::Call::remove_invulnerable { .. }, - ) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | + RuntimeCall::CollatorSelection(..) | + RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | RuntimeCall::PolkadotXcm( pallet_xcm::Call::force_xcm_version { .. } | pallet_xcm::Call::force_default_xcm_version { .. } diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs index e87611a523e..2e7889ca012 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs @@ -121,7 +121,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("coretime-rococo"), impl_name: create_runtime_str!("coretime-rococo"), authoring_version: 1, - spec_version: 1_005_001, + spec_version: 1_005_002, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 0, diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/xcm_config.rs index 15ee924ddb5..00bbe5b5037 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/xcm_config.rs @@ -28,7 +28,7 @@ use pallet_xcm::XcmPassthrough; use parachains_common::{ impls::ToStakingPot, xcm_config::{ - AllSiblingSystemParachains, ConcreteNativeAssetFrom, ParentRelayOrSiblingParachains, + AllSiblingSystemParachains, ConcreteAssetFromSystem, ParentRelayOrSiblingParachains, RelayOrOtherSystemParachains, }, TREASURY_PALLET_ID, @@ -140,15 +140,22 @@ impl Contains for SafeCallFilter { matches!( call, - RuntimeCall::PolkadotXcm(pallet_xcm::Call::force_xcm_version { .. }) | - RuntimeCall::System( - frame_system::Call::set_heap_pages { .. } | + RuntimeCall::PolkadotXcm( + pallet_xcm::Call::force_xcm_version { .. } | + pallet_xcm::Call::force_default_xcm_version { .. } + ) | RuntimeCall::System( + frame_system::Call::set_heap_pages { .. } | frame_system::Call::set_code { .. } | frame_system::Call::set_code_without_checks { .. } | - frame_system::Call::kill_prefix { .. }, - ) | RuntimeCall::ParachainSystem(..) | + frame_system::Call::authorize_upgrade { .. } | + frame_system::Call::authorize_upgrade_without_checks { .. } | + frame_system::Call::kill_prefix { .. } | + // Should not be in Polkadot/Kusama. Here in order to speed up testing. + frame_system::Call::set_storage { .. }, + ) | RuntimeCall::ParachainSystem(..) | RuntimeCall::Timestamp(..) | RuntimeCall::Balances(..) | + RuntimeCall::Sudo(..) | RuntimeCall::CollatorSelection(..) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | RuntimeCall::XcmpQueue(..) | @@ -187,8 +194,7 @@ parameter_types! { pub RelayTreasuryLocation: MultiLocation = (Parent, PalletInstance(rococo_runtime_constants::TREASURY_PALLET_ID)).into(); } -/// Locations that will not be charged fees in the executor, -/// either execution or delivery. +/// Locations that will not be charged fees in the executor, neither for execution nor delivery. /// We only waive fees for system functions, which these locations represent. pub type WaivedLocations = ( RelayOrOtherSystemParachains, @@ -205,7 +211,7 @@ impl xcm_executor::Config for XcmConfig { // where allowed (e.g. with the Relay Chain). type IsReserve = (); /// Only allow teleportation of ROC. - type IsTeleporter = ConcreteNativeAssetFrom; + type IsTeleporter = ConcreteAssetFromSystem; type UniversalLocation = UniversalLocation; type Barrier = Barrier; type Weigher = WeightInfoBounds< diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/xcm_config.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/xcm_config.rs index 9de9da4b2d1..59d76d10d90 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/xcm_config.rs @@ -28,7 +28,7 @@ use pallet_xcm::XcmPassthrough; use parachains_common::{ impls::ToStakingPot, xcm_config::{ - AllSiblingSystemParachains, ConcreteNativeAssetFrom, ParentRelayOrSiblingParachains, + AllSiblingSystemParachains, ConcreteAssetFromSystem, ParentRelayOrSiblingParachains, RelayOrOtherSystemParachains, }, TREASURY_PALLET_ID, @@ -143,16 +143,21 @@ impl Contains for SafeCallFilter { matches!( call, - RuntimeCall::PolkadotXcm(pallet_xcm::Call::force_xcm_version { .. }) | - RuntimeCall::System( - frame_system::Call::set_heap_pages { .. } | - frame_system::Call::set_code { .. } | - frame_system::Call::set_code_without_checks { .. } | - frame_system::Call::kill_prefix { .. }, - ) | RuntimeCall::ParachainSystem(..) | + RuntimeCall::PolkadotXcm( + pallet_xcm::Call::force_xcm_version { .. } | + pallet_xcm::Call::force_default_xcm_version { .. } + ) | RuntimeCall::System( + frame_system::Call::set_heap_pages { .. } | + frame_system::Call::set_code { .. } | + frame_system::Call::set_code_without_checks { .. } | + frame_system::Call::authorize_upgrade { .. } | + frame_system::Call::authorize_upgrade_without_checks { .. } | + frame_system::Call::kill_prefix { .. }, + ) | RuntimeCall::ParachainSystem(..) | RuntimeCall::Timestamp(..) | RuntimeCall::Balances(..) | RuntimeCall::CollatorSelection(..) | + RuntimeCall::Sudo(..) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | RuntimeCall::XcmpQueue(..) ) @@ -190,8 +195,7 @@ parameter_types! { pub RelayTreasuryLocation: MultiLocation = (Parent, PalletInstance(westend_runtime_constants::TREASURY_PALLET_ID)).into(); } -/// Locations that will not be charged fees in the executor, -/// either execution or delivery. +/// Locations that will not be charged fees in the executor, neither for execution nor delivery. /// We only waive fees for system functions, which these locations represent. pub type WaivedLocations = ( RelayOrOtherSystemParachains, @@ -208,7 +212,7 @@ impl xcm_executor::Config for XcmConfig { // where allowed (e.g. with the Relay Chain). type IsReserve = (); /// Only allow teleportation of WND. - type IsTeleporter = ConcreteNativeAssetFrom; + type IsTeleporter = ConcreteAssetFromSystem; type UniversalLocation = UniversalLocation; type Barrier = Barrier; type Weigher = WeightInfoBounds< -- GitLab From 0686cf1748fc6e292f5edc217160979f45a4762f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 Dec 2023 10:25:55 +0100 Subject: [PATCH 081/191] Bump unsafe-libyaml from 0.2.9 to 0.2.10 (#2776) Bumps [unsafe-libyaml](https://github.com/dtolnay/unsafe-libyaml) from 0.2.9 to 0.2.10.
Commits
  • 61f3ab8 Release 0.2.10
  • d90d7ab Clean up some redundant casts
  • 7755559 Merge pull request #24 from dtolnay/mallocalign
  • b8a0863 Fix insufficient alignment of malloc's return value on 32-bit
  • 389373f Merge pull request #23 from dtolnay/malloc
  • fd41ef6 Check arithmetic in malloc computations
  • 9e054fb Merge pull request #22 from dtolnay/force
  • 5b40a9e Check more arithmetic operations
  • 97a4332 Delete cast to long followed by size_t
  • e5f4bbd Clean up duplicated casting to size_t
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=unsafe-libyaml&package-manager=cargo&previous-version=0.2.9&new-version=0.2.10)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/paritytech/polkadot-sdk/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ba30e05b5ba..81af9f584ed 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -20484,9 +20484,9 @@ dependencies = [ [[package]] name = "unsafe-libyaml" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28467d3e1d3c6586d8f25fa243f544f5800fec42d97032474e17222c2b75cfa" +checksum = "ab4c90930b95a82d00dc9e9ac071b4991924390d46cbd0dfe566148667605e4b" [[package]] name = "unsigned-varint" -- GitLab From b62df695923c6b64c42c3081692194375b91f7b4 Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Fri, 22 Dec 2023 13:22:50 +0300 Subject: [PATCH 082/191] Final nits for bridge-hub-test-utils (#2788) closes https://github.com/paritytech/parity-bridges-common/issues/2739 --- .../src/test_cases/from_grandpa_chain.rs | 4 +- .../src/test_cases/from_parachain.rs | 8 +- .../test-utils/src/test_cases/helpers.rs | 40 +++-- .../test-utils/src/test_cases/mod.rs | 153 ++++++++---------- 4 files changed, 94 insertions(+), 111 deletions(-) diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs index 8d4e6a034a7..e0e75f093cf 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs @@ -18,7 +18,7 @@ //! with remote GRANDPA chain. use crate::{ - test_cases::{helpers, run_test}, + test_cases::{bridges_prelude::*, helpers, run_test}, test_data, }; @@ -38,8 +38,6 @@ use bridge_runtime_common::{ }; use frame_support::traits::{Get, OnFinalize, OnInitialize}; use frame_system::pallet_prelude::BlockNumberFor; -use pallet_bridge_grandpa::{Call as BridgeGrandpaCall, Config as BridgeGrandpaConfig}; -use pallet_bridge_messages::{Call as BridgeMessagesCall, Config as BridgeMessagesConfig}; use parachains_runtimes_test_utils::{ AccountIdOf, BasicParachainRuntime, CollatorSessionKeys, RuntimeCallOf, }; diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs index fa1049cc6ec..91bebb36b18 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs @@ -18,7 +18,7 @@ //! with remote parachain. use crate::{ - test_cases::{helpers, run_test}, + test_cases::{bridges_prelude::*, helpers, run_test}, test_data, }; @@ -39,12 +39,6 @@ use bridge_runtime_common::{ }; use frame_support::traits::{Get, OnFinalize, OnInitialize}; use frame_system::pallet_prelude::BlockNumberFor; -use pallet_bridge_grandpa::{Call as BridgeGrandpaCall, Config as BridgeGrandpaConfig}; -use pallet_bridge_messages::{Call as BridgeMessagesCall, Config as BridgeMessagesConfig}; -use pallet_bridge_parachains::{ - Call as BridgeParachainsCall, Config as BridgeParachainsConfig, RelayBlockHash, - RelayBlockNumber, -}; use parachains_runtimes_test_utils::{ AccountIdOf, BasicParachainRuntime, CollatorSessionKeys, RuntimeCallOf, }; diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs index 4f824129bf7..69aa61db3cc 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs @@ -16,7 +16,7 @@ //! Module contains tests code, that is shared by all types of bridges -use crate::test_cases::{run_test, RuntimeHelper}; +use crate::test_cases::{bridges_prelude::*, run_test, RuntimeHelper}; use asset_test_utils::BasicParachainRuntime; use bp_messages::{LaneId, MessageNonce}; @@ -30,13 +30,16 @@ use frame_support::{ use frame_system::pallet_prelude::BlockNumberFor; use pallet_bridge_grandpa::{BridgedBlockHash, BridgedHeader}; use parachains_common::AccountId; -use parachains_runtimes_test_utils::{mock_open_hrmp_channel, AccountIdOf, CollatorSessionKeys}; +use parachains_runtimes_test_utils::{ + mock_open_hrmp_channel, AccountIdOf, CollatorSessionKeys, RuntimeCallOf, +}; use sp_core::Get; use sp_keyring::AccountKeyring::*; use sp_runtime::{traits::TrailingZeroInput, AccountId32}; use sp_std::marker::PhantomData; use xcm::latest::prelude::*; +/// Verify that the transaction has succeeded. #[impl_trait_for_tuples::impl_for_tuples(30)] pub trait VerifyTransactionOutcome { fn verify_outcome(&self); @@ -51,7 +54,7 @@ impl VerifyTransactionOutcome for Box { /// Checks that the best finalized header hash in the bridge GRANDPA pallet equals to given one. pub struct VerifySubmitGrandpaFinalityProofOutcome where - Runtime: pallet_bridge_grandpa::Config, + Runtime: BridgeGrandpaConfig, GPI: 'static, { expected_best_hash: BridgedBlockHash, @@ -59,7 +62,7 @@ where impl VerifySubmitGrandpaFinalityProofOutcome where - Runtime: pallet_bridge_grandpa::Config, + Runtime: BridgeGrandpaConfig, GPI: 'static, { /// Expect given header hash to be the best after transaction. @@ -73,7 +76,7 @@ where impl VerifyTransactionOutcome for VerifySubmitGrandpaFinalityProofOutcome where - Runtime: pallet_bridge_grandpa::Config, + Runtime: BridgeGrandpaConfig, GPI: 'static, { fn verify_outcome(&self) { @@ -96,7 +99,7 @@ pub struct VerifySubmitParachainHeaderProofOutcome { impl VerifySubmitParachainHeaderProofOutcome where - Runtime: pallet_bridge_parachains::Config, + Runtime: BridgeParachainsConfig, PPI: 'static, { /// Expect given header hash to be the best after transaction. @@ -111,7 +114,7 @@ where impl VerifyTransactionOutcome for VerifySubmitParachainHeaderProofOutcome where - Runtime: pallet_bridge_parachains::Config, + Runtime: BridgeParachainsConfig, PPI: 'static, { fn verify_outcome(&self) { @@ -132,7 +135,7 @@ pub struct VerifySubmitMessagesProofOutcome { impl VerifySubmitMessagesProofOutcome where - Runtime: pallet_bridge_messages::Config, + Runtime: BridgeMessagesConfig, MPI: 'static, { /// Expect given delivered nonce to be the latest after transaction. @@ -146,7 +149,7 @@ where impl VerifyTransactionOutcome for VerifySubmitMessagesProofOutcome where - Runtime: pallet_bridge_messages::Config, + Runtime: BridgeMessagesConfig, MPI: 'static, { fn verify_outcome(&self) { @@ -194,7 +197,7 @@ where pub(crate) fn initialize_bridge_grandpa_pallet( init_data: bp_header_chain::InitializationData>, ) where - Runtime: pallet_bridge_grandpa::Config, + Runtime: BridgeGrandpaConfig, { pallet_bridge_grandpa::Pallet::::initialize( RuntimeHelper::::root_origin(), @@ -205,7 +208,7 @@ pub(crate) fn initialize_bridge_grandpa_pallet( /// Runtime calls and their verifiers. pub type CallsAndVerifiers = - Vec<(::RuntimeCall, Box)>; + Vec<(RuntimeCallOf, Box)>; /// Returns relayer id at the bridged chain. pub fn relayer_id_at_bridged_chain, MPI>( @@ -222,7 +225,7 @@ pub fn relayed_incoming_message_works( local_relay_chain_id: NetworkId, construct_and_apply_extrinsic: fn( sp_keyring::AccountKeyring, - ::RuntimeCall, + RuntimeCallOf, ) -> sp_runtime::DispatchOutcome, prepare_message_proof_import: impl FnOnce( Runtime::AccountId, @@ -232,9 +235,7 @@ pub fn relayed_incoming_message_works( Xcm<()>, ) -> CallsAndVerifiers, ) where - Runtime: BasicParachainRuntime - + cumulus_pallet_xcmp_queue::Config - + pallet_bridge_messages::Config, + Runtime: BasicParachainRuntime + cumulus_pallet_xcmp_queue::Config + BridgeMessagesConfig, AllPalletsWithoutSystem: OnInitialize> + OnFinalize>, MPI: 'static, @@ -251,7 +252,12 @@ pub fn relayed_incoming_message_works( runtime_para_id, vec![( relayer_id_on_target.clone().into(), - Runtime::ExistentialDeposit::get() * 100000u32.into(), + // this value should be enough to cover all transaction costs, but computing the actual + // value here is tricky - there are several transaction payment pallets and we don't + // want to introduce additional bounds and traits here just for that, so let's just + // select some presumably large value + sp_std::cmp::max::(Runtime::ExistentialDeposit::get(), 1u32.into()) * + 100_000_000u32.into(), )], || { let mut alice = [0u8; 32]; @@ -327,7 +333,7 @@ fn execute_and_verify_calls( submitter: sp_keyring::AccountKeyring, construct_and_apply_extrinsic: fn( sp_keyring::AccountKeyring, - ::RuntimeCall, + RuntimeCallOf, ) -> sp_runtime::DispatchOutcome, calls_and_verifiers: CallsAndVerifiers, ) { diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/mod.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/mod.rs index 11210841bd3..64ec8726599 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/mod.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/mod.rs @@ -24,7 +24,7 @@ pub mod from_parachain; pub(crate) mod helpers; -use crate::test_data; +use crate::{test_cases::bridges_prelude::*, test_data}; use asset_test_utils::BasicParachainRuntime; use bp_messages::{ @@ -38,12 +38,13 @@ use bridge_runtime_common::messages_xcm_extension::{ use codec::Encode; use frame_support::{ assert_ok, + dispatch::GetDispatchInfo, traits::{Get, OnFinalize, OnInitialize, OriginTrait}, }; use frame_system::pallet_prelude::BlockNumberFor; use parachains_common::AccountId; use parachains_runtimes_test_utils::{ - mock_open_hrmp_channel, AccountIdOf, BalanceOf, CollatorSessionKeys, ExtBuilder, ValidatorIdOf, + mock_open_hrmp_channel, AccountIdOf, BalanceOf, CollatorSessionKeys, ExtBuilder, RuntimeCallOf, XcmReceivedFrom, }; use sp_runtime::{traits::Zero, AccountId32}; @@ -54,6 +55,16 @@ use xcm_executor::{ XcmExecutor, }; +/// Common bridges exports. +pub(crate) mod bridges_prelude { + pub use pallet_bridge_grandpa::{Call as BridgeGrandpaCall, Config as BridgeGrandpaConfig}; + pub use pallet_bridge_messages::{Call as BridgeMessagesCall, Config as BridgeMessagesConfig}; + pub use pallet_bridge_parachains::{ + Call as BridgeParachainsCall, Config as BridgeParachainsConfig, RelayBlockHash, + RelayBlockNumber, + }; +} + // Re-export test_case from assets pub use asset_test_utils::include_teleports_for_native_asset_works; @@ -89,11 +100,10 @@ pub fn initialize_bridge_by_governance_works( collator_session_key: CollatorSessionKeys, runtime_para_id: u32, ) where - Runtime: BasicParachainRuntime + pallet_bridge_grandpa::Config, + Runtime: BasicParachainRuntime + BridgeGrandpaConfig, GrandpaPalletInstance: 'static, - ValidatorIdOf: From>, - ::RuntimeCall: - From>, + RuntimeCallOf: + GetDispatchInfo + From>, { run_test::(collator_session_key, runtime_para_id, vec![], || { // check mode before @@ -102,24 +112,18 @@ pub fn initialize_bridge_by_governance_works( Err(()) ); - // encode `initialize` call - let initialize_call = - ::RuntimeCall::from(pallet_bridge_grandpa::Call::< - Runtime, - GrandpaPalletInstance, - >::initialize { - init_data: test_data::initialization_data::(12345), - }) - .encode(); - - // overestimate - check weight for `pallet_bridge_grandpa::Pallet::initialize()` call - let require_weight_at_most = - ::DbWeight::get().reads_writes(7, 7); + // prepare the `initialize` call + let initialize_call = RuntimeCallOf::::from(BridgeGrandpaCall::< + Runtime, + GrandpaPalletInstance, + >::initialize { + init_data: test_data::initialization_data::(12345), + }); // execute XCM with Transacts to `initialize bridge` as governance does assert_ok!(RuntimeHelper::::execute_as_governance( - initialize_call, - require_weight_at_most + initialize_call.encode(), + initialize_call.get_dispatch_info().weight, ) .ensure_complete()); @@ -137,11 +141,10 @@ pub fn change_bridge_grandpa_pallet_mode_by_governance_works, runtime_para_id: u32, ) where - Runtime: BasicParachainRuntime + pallet_bridge_grandpa::Config, + Runtime: BasicParachainRuntime + BridgeGrandpaConfig, GrandpaPalletInstance: 'static, - ValidatorIdOf: From>, - ::RuntimeCall: - From>, + RuntimeCallOf: + GetDispatchInfo + From>, { run_test::(collator_session_key, runtime_para_id, vec![], || { let dispatch_set_operating_mode_call = |old_mode, new_mode| { @@ -151,23 +154,17 @@ pub fn change_bridge_grandpa_pallet_mode_by_governance_works::DbWeight::get().reads_writes(7, 7); - - // encode `set_operating_mode` call + // prepare the `set_operating_mode` call let set_operating_mode_call = ::RuntimeCall::from( pallet_bridge_grandpa::Call::::set_operating_mode { operating_mode: new_mode, }, - ) - .encode(); + ); // execute XCM with Transacts to `initialize bridge` as governance does assert_ok!(RuntimeHelper::::execute_as_governance( - set_operating_mode_call, - require_weight_at_most + set_operating_mode_call.encode(), + set_operating_mode_call.get_dispatch_info().weight, ) .ensure_complete()); @@ -195,11 +192,10 @@ pub fn change_bridge_parachains_pallet_mode_by_governance_works, runtime_para_id: u32, ) where - Runtime: BasicParachainRuntime + pallet_bridge_parachains::Config, + Runtime: BasicParachainRuntime + BridgeParachainsConfig, ParachainsPalletInstance: 'static, - ValidatorIdOf: From>, - ::RuntimeCall: - From>, + RuntimeCallOf: + GetDispatchInfo + From>, { run_test::(collator_session_key, runtime_para_id, vec![], || { let dispatch_set_operating_mode_call = |old_mode, new_mode| { @@ -209,23 +205,19 @@ pub fn change_bridge_parachains_pallet_mode_by_governance_works::DbWeight::get().reads_writes(7, 7); - - // encode `set_operating_mode` call - let set_operating_mode_call = ::RuntimeCall::from(pallet_bridge_parachains::Call::< - Runtime, - ParachainsPalletInstance, - >::set_operating_mode { - operating_mode: new_mode, - }).encode(); + // prepare the `set_operating_mode` call + let set_operating_mode_call = + RuntimeCallOf::::from(pallet_bridge_parachains::Call::< + Runtime, + ParachainsPalletInstance, + >::set_operating_mode { + operating_mode: new_mode, + }); // execute XCM with Transacts to `initialize bridge` as governance does assert_ok!(RuntimeHelper::::execute_as_governance( - set_operating_mode_call, - require_weight_at_most + set_operating_mode_call.encode(), + set_operating_mode_call.get_dispatch_info().weight, ) .ensure_complete()); @@ -253,11 +245,10 @@ pub fn change_bridge_messages_pallet_mode_by_governance_works, runtime_para_id: u32, ) where - Runtime: BasicParachainRuntime + pallet_bridge_messages::Config, + Runtime: BasicParachainRuntime + BridgeMessagesConfig, MessagesPalletInstance: 'static, - ValidatorIdOf: From>, - ::RuntimeCall: - From>, + RuntimeCallOf: + GetDispatchInfo + From>, { run_test::(collator_session_key, runtime_para_id, vec![], || { let dispatch_set_operating_mode_call = |old_mode, new_mode| { @@ -268,23 +259,18 @@ pub fn change_bridge_messages_pallet_mode_by_governance_works::DbWeight::get().reads_writes(7, 7); - // encode `set_operating_mode` call - let set_operating_mode_call = ::RuntimeCall::from(pallet_bridge_messages::Call::< + let set_operating_mode_call = RuntimeCallOf::::from(BridgeMessagesCall::< Runtime, MessagesPalletInstance, >::set_operating_mode { operating_mode: new_mode, - }).encode(); + }); // execute XCM with Transacts to `initialize bridge` as governance does assert_ok!(RuntimeHelper::::execute_as_governance( - set_operating_mode_call, - require_weight_at_most + set_operating_mode_call.encode(), + set_operating_mode_call.get_dispatch_info().weight, ) .ensure_complete()); @@ -337,10 +323,9 @@ pub fn handle_export_message_from_system_parachain_to_outbound_queue_works< maybe_paid_export_message: Option, prepare_configuration: impl Fn(), ) where - Runtime: BasicParachainRuntime + pallet_bridge_messages::Config, + Runtime: BasicParachainRuntime + BridgeMessagesConfig, XcmConfig: xcm_executor::Config, MessagesPalletInstance: 'static, - ValidatorIdOf: From>, { assert_ne!(runtime_para_id, sibling_parachain_id); let sibling_parachain_location = MultiLocation::new(1, Parachain(sibling_parachain_id)); @@ -446,15 +431,13 @@ pub fn message_dispatch_routing_works< ) where Runtime: BasicParachainRuntime + cumulus_pallet_xcmp_queue::Config - + pallet_bridge_messages::Config, + + BridgeMessagesConfig, AllPalletsWithoutSystem: OnInitialize> + OnFinalize>, - ::AccountId: - Into<<::RuntimeOrigin as OriginTrait>::AccountId>, + AccountIdOf: From + + Into<<::RuntimeOrigin as OriginTrait>::AccountId>, XcmConfig: xcm_executor::Config, MessagesPalletInstance: 'static, - ValidatorIdOf: From>, - ::AccountId: From, HrmpChannelOpener: frame_support::inherent::ProvideInherent< Call = cumulus_pallet_parachain_system::Call, >, @@ -488,9 +471,10 @@ pub fn message_dispatch_routing_works< NetworkWithParentCount, AlwaysLatest, >((RuntimeNetwork::get(), Here)); - let result = <>::MessageDispatch>::dispatch( - test_data::dispatch_message(expected_lane_id, 1, bridging_message) - ); + let result = + <>::MessageDispatch>::dispatch( + test_data::dispatch_message(expected_lane_id, 1, bridging_message), + ); assert_eq!( format!("{:?}", result.dispatch_level_result), format!("{:?}", XcmBlobMessageDispatchResult::Dispatched) @@ -515,11 +499,11 @@ pub fn message_dispatch_routing_works< // 2.1. WITHOUT opened hrmp channel -> RoutingError let result = - <>::MessageDispatch>::dispatch( + <>::MessageDispatch>::dispatch( DispatchMessage { key: MessageKey { lane_id: expected_lane_id, nonce: 1 }, data: DispatchMessageData { payload: Ok(bridging_message.clone()) }, - } + }, ); assert_eq!( format!("{:?}", result.dispatch_level_result), @@ -545,12 +529,13 @@ pub fn message_dispatch_routing_works< included_head, &alice, ); - let result = <>::MessageDispatch>::dispatch( - DispatchMessage { - key: MessageKey { lane_id: expected_lane_id, nonce: 1 }, - data: DispatchMessageData { payload: Ok(bridging_message) }, - } - ); + let result = + <>::MessageDispatch>::dispatch( + DispatchMessage { + key: MessageKey { lane_id: expected_lane_id, nonce: 1 }, + data: DispatchMessageData { payload: Ok(bridging_message) }, + }, + ); assert_eq!( format!("{:?}", result.dispatch_level_result), format!("{:?}", XcmBlobMessageDispatchResult::Dispatched) -- GitLab From 0ce506ef1bde225a55b056070e5e5f357a829c91 Mon Sep 17 00:00:00 2001 From: Emanuele Valzano <100088167+0xMenna01@users.noreply.github.com> Date: Fri, 22 Dec 2023 13:08:08 +0100 Subject: [PATCH 083/191] incrementing sufficient accounts references with saturating_add for safety. (#2768) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Even though it is difficult to overflow the sufficients variable, since an attacker that is willing to rapidly increase the number must every time deposit a minimum deposit of a given asset, it is safer to use saturating_add(). --------- Co-authored-by: Bastian Köcher Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> --- substrate/frame/assets/src/functions.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/substrate/frame/assets/src/functions.rs b/substrate/frame/assets/src/functions.rs index c2c1b683906..8791aaa736b 100644 --- a/substrate/frame/assets/src/functions.rs +++ b/substrate/frame/assets/src/functions.rs @@ -77,7 +77,7 @@ impl, I: 'static> Pallet { } } else if d.is_sufficient { frame_system::Pallet::::inc_sufficients(who); - d.sufficients += 1; + d.sufficients.saturating_inc(); ExistenceReason::Sufficient } else { frame_system::Pallet::::inc_consumers(who) -- GitLab From 4c0e0e071355c1048d75fba538c96c35ac743547 Mon Sep 17 00:00:00 2001 From: Sachin Charakhwal <40860699+SCJangra@users.noreply.github.com> Date: Fri, 22 Dec 2023 17:53:43 +0530 Subject: [PATCH 084/191] fix overflow in `balance_to_point` conversion (#2706) Closes #416 As I mentioned in the above issue `balance_to_points` conversion currently overflows the `Balance` types even before computing the actual points for the given tokens. This fixes that, --- substrate/frame/nomination-pools/src/lib.rs | 9 +++++--- substrate/frame/nomination-pools/src/tests.rs | 22 +++++++++++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/substrate/frame/nomination-pools/src/lib.rs b/substrate/frame/nomination-pools/src/lib.rs index 3a23b894ec8..c538f12e20b 100644 --- a/substrate/frame/nomination-pools/src/lib.rs +++ b/substrate/frame/nomination-pools/src/lib.rs @@ -2955,9 +2955,12 @@ impl Pallet { }, (false, false) => { // Equivalent to (current_points / current_balance) * new_funds - balance(u256(current_points).saturating_mul(u256(new_funds))) - // We check for zero above - .div(current_balance) + balance( + u256(current_points) + .saturating_mul(u256(new_funds)) + // We check for zero above + .div(u256(current_balance)), + ) }, } } diff --git a/substrate/frame/nomination-pools/src/tests.rs b/substrate/frame/nomination-pools/src/tests.rs index 7fe1e704bb1..657b50e8594 100644 --- a/substrate/frame/nomination-pools/src/tests.rs +++ b/substrate/frame/nomination-pools/src/tests.rs @@ -292,6 +292,28 @@ mod bonded_pool { assert_ok!(pool.ok_to_join()); }); } + + #[test] + fn points_and_balance_conversions_are_safe() { + ExtBuilder::default().build_and_execute(|| { + let bonded_pool = BondedPool:: { + id: 123123, + inner: BondedPoolInner { + commission: Commission::default(), + member_counter: 1, + points: u128::MAX, + roles: DEFAULT_ROLES, + state: PoolState::Open, + }, + }; + StakingMock::set_bonded_balance(bonded_pool.bonded_account(), u128::MAX); + + // Max out the points and balance of the pool and make sure the conversion works as + // expected and does not overflow. + assert_eq!(bonded_pool.balance_to_point(u128::MAX), u128::MAX); + assert_eq!(bonded_pool.points_to_balance(u128::MAX), u128::MAX); + }) + } } mod reward_pool { -- GitLab From ecbbb5a7365d9ea41cc30d32e6718ca269bf7ae3 Mon Sep 17 00:00:00 2001 From: joe petrowski <25483142+joepetrowski@users.noreply.github.com> Date: Fri, 22 Dec 2023 21:28:09 +0100 Subject: [PATCH 085/191] Rococo & Westend People Chain (#2281) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rococo and Westend runtimes for the "People Chain". This chain contains the Identity pallet with plans to migrate all related data from the Relay Chain. Changes `IdentityInfo` to: - Remove `additional_fields`. - Add `github` and `discord` as first class fields. From scraping chain data, these were the only two additional fields used (for the Fellowship and Ambassador Program, respectively). - Rename `riot` to `matrix`. Note: This will use the script in https://github.com/paritytech/polkadot-sdk/pull/2025 to generate the genesis state. TODO: - [x] https://github.com/paritytech/polkadot-sdk/pull/1814 and integration of the Identity Migrator pallet for migration. - [x] Tests: https://github.com/paritytech/polkadot-sdk/pull/2373 --------- Co-authored-by: Muharem Co-authored-by: Michal Kucharczyk <1728078+michalkucharczyk@users.noreply.github.com> Co-authored-by: Dónal Murray Co-authored-by: Richard Melkonian <35300528+0xmovses@users.noreply.github.com> Co-authored-by: Liam Aharon --- Cargo.lock | 222 +++++ Cargo.toml | 6 + .../parachains/chain-specs/people-rococo.json | 82 ++ .../chain-specs/people-westend.json | 82 ++ cumulus/parachains/common/Cargo.toml | 6 + cumulus/parachains/common/src/impls.rs | 68 +- cumulus/parachains/common/src/polkadot.rs | 12 +- .../people/people-rococo/Cargo.toml | 25 + .../people/people-rococo/src/genesis.rs | 62 ++ .../people/people-rococo/src/lib.rs | 52 ++ .../people/people-westend/Cargo.toml | 25 + .../people/people-westend/src/genesis.rs | 62 ++ .../people/people-westend/src/lib.rs | 52 ++ .../emulated/chains/relays/rococo/src/lib.rs | 2 + .../emulated/chains/relays/westend/src/lib.rs | 2 + .../emulated/common/src/impls.rs | 5 +- .../emulated/common/src/lib.rs | 1 - .../networks/rococo-system/Cargo.toml | 1 + .../networks/rococo-system/src/lib.rs | 6 +- .../networks/westend-system/Cargo.toml | 1 + .../networks/westend-system/src/lib.rs | 4 + .../tests/assets/asset-hub-rococo/src/lib.rs | 37 - .../src/tests/reserve_transfer.rs | 8 +- .../asset-hub-rococo/src/tests/teleport.rs | 16 +- .../tests/assets/asset-hub-westend/src/lib.rs | 37 - .../src/tests/reserve_transfer.rs | 8 +- .../asset-hub-westend/src/tests/teleport.rs | 16 +- .../tests/people/people-rococo/Cargo.toml | 38 + .../tests/people/people-rococo/src/lib.rs | 64 ++ .../people/people-rococo/src/tests/mod.rs | 17 + .../people-rococo/src/tests/reap_identity.rs | 549 ++++++++++++ .../people-rococo/src/tests/teleport.rs | 260 ++++++ .../tests/people/people-westend/Cargo.toml | 38 + .../tests/people/people-westend/src/lib.rs | 64 ++ .../people/people-westend/src/tests/mod.rs | 17 + .../people-westend/src/tests/reap_identity.rs | 551 ++++++++++++ .../people-westend/src/tests/teleport.rs | 260 ++++++ .../collectives-westend/src/ambassador/mod.rs | 8 +- .../collectives-westend/src/fellowship/mod.rs | 19 +- .../collectives-westend/src/impls.rs | 51 +- .../collectives-westend/src/lib.rs | 13 +- cumulus/parachains/runtimes/people/README.md | 5 + .../runtimes/people/people-rococo/Cargo.toml | 195 ++++ .../runtimes/people/people-rococo/build.rs | 26 + .../runtimes/people/people-rococo/src/lib.rs | 845 ++++++++++++++++++ .../people/people-rococo/src/people.rs | 204 +++++ .../src/weights/block_weights.rs | 53 ++ .../cumulus_pallet_parachain_system.rs | 53 ++ .../src/weights/cumulus_pallet_xcmp_queue.rs | 129 +++ .../src/weights/extrinsic_weights.rs | 53 ++ .../people-rococo/src/weights/frame_system.rs | 160 ++++ .../people/people-rococo/src/weights/mod.rs | 40 + .../src/weights/pallet_balances.rs | 150 ++++ .../src/weights/pallet_collator_selection.rs | 242 +++++ .../src/weights/pallet_identity.rs | 315 +++++++ .../src/weights/pallet_message_queue.rs | 156 ++++ .../src/weights/pallet_multisig.rs | 162 ++++ .../src/weights/pallet_session.rs | 78 ++ .../src/weights/pallet_timestamp.rs | 72 ++ .../src/weights/pallet_utility.rs | 99 ++ .../people-rococo/src/weights/pallet_xcm.rs | 342 +++++++ .../src/weights/paritydb_weights.rs | 63 ++ ...lkadot_runtime_common_identity_migrator.rs | 97 ++ .../src/weights/rocksdb_weights.rs | 63 ++ .../people-rococo/src/weights/xcm/mod.rs | 249 ++++++ .../xcm/pallet_xcm_benchmarks_fungible.rs | 157 ++++ .../xcm/pallet_xcm_benchmarks_generic.rs | 347 +++++++ .../people/people-rococo/src/xcm_config.rs | 320 +++++++ .../runtimes/people/people-westend/Cargo.toml | 195 ++++ .../runtimes/people/people-westend/build.rs | 26 + .../runtimes/people/people-westend/src/lib.rs | 845 ++++++++++++++++++ .../people/people-westend/src/people.rs | 204 +++++ .../src/weights/block_weights.rs | 53 ++ .../cumulus_pallet_parachain_system.rs | 53 ++ .../src/weights/cumulus_pallet_xcmp_queue.rs | 129 +++ .../src/weights/extrinsic_weights.rs | 53 ++ .../src/weights/frame_system.rs | 160 ++++ .../people/people-westend/src/weights/mod.rs | 40 + .../src/weights/pallet_balances.rs | 150 ++++ .../src/weights/pallet_collator_selection.rs | 242 +++++ .../src/weights/pallet_identity.rs | 315 +++++++ .../src/weights/pallet_message_queue.rs | 156 ++++ .../src/weights/pallet_multisig.rs | 162 ++++ .../src/weights/pallet_session.rs | 78 ++ .../src/weights/pallet_timestamp.rs | 72 ++ .../src/weights/pallet_utility.rs | 99 ++ .../people-westend/src/weights/pallet_xcm.rs | 342 +++++++ .../src/weights/paritydb_weights.rs | 61 ++ ...lkadot_runtime_common_identity_migrator.rs | 97 ++ .../src/weights/rocksdb_weights.rs | 61 ++ .../people-westend/src/weights/xcm/mod.rs | 252 ++++++ .../xcm/pallet_xcm_benchmarks_fungible.rs | 157 ++++ .../xcm/pallet_xcm_benchmarks_generic.rs | 347 +++++++ .../people/people-westend/src/xcm_config.rs | 324 +++++++ cumulus/polkadot-parachain/Cargo.toml | 6 + .../chain-specs/people-rococo.json | 1 + .../chain-specs/people-westend.json | 1 + .../polkadot-parachain/src/chain_spec/mod.rs | 1 + .../src/chain_spec/people.rs | 320 +++++++ cumulus/polkadot-parachain/src/command.rs | 101 +-- cumulus/polkadot-parachain/src/service.rs | 27 +- cumulus/scripts/create_people_rococo_spec.sh | 105 +++ cumulus/scripts/create_people_westend_spec.sh | 105 +++ cumulus/xcm/xcm-emulator/src/lib.rs | 45 +- .../runtime/common/src/identity_migrator.rs | 3 +- polkadot/runtime/rococo/src/xcm_config.rs | 15 +- polkadot/runtime/westend/constants/src/lib.rs | 2 + polkadot/runtime/westend/src/xcm_config.rs | 15 +- prdoc/pr_2281.prdoc | 12 + substrate/frame/identity/Cargo.toml | 1 + substrate/frame/identity/src/lib.rs | 25 +- 111 files changed, 12727 insertions(+), 255 deletions(-) create mode 100644 cumulus/parachains/chain-specs/people-rococo.json create mode 100644 cumulus/parachains/chain-specs/people-westend.json create mode 100644 cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/Cargo.toml create mode 100644 cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/src/genesis.rs create mode 100644 cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/src/lib.rs create mode 100644 cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/Cargo.toml create mode 100644 cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/src/genesis.rs create mode 100644 cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/src/lib.rs create mode 100644 cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/Cargo.toml create mode 100644 cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/lib.rs create mode 100644 cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/mod.rs create mode 100644 cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/reap_identity.rs create mode 100644 cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/teleport.rs create mode 100644 cumulus/parachains/integration-tests/emulated/tests/people/people-westend/Cargo.toml create mode 100644 cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/lib.rs create mode 100644 cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/mod.rs create mode 100644 cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/reap_identity.rs create mode 100644 cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/teleport.rs create mode 100644 cumulus/parachains/runtimes/people/README.md create mode 100644 cumulus/parachains/runtimes/people/people-rococo/Cargo.toml create mode 100644 cumulus/parachains/runtimes/people/people-rococo/build.rs create mode 100644 cumulus/parachains/runtimes/people/people-rococo/src/lib.rs create mode 100644 cumulus/parachains/runtimes/people/people-rococo/src/people.rs create mode 100644 cumulus/parachains/runtimes/people/people-rococo/src/weights/block_weights.rs create mode 100644 cumulus/parachains/runtimes/people/people-rococo/src/weights/cumulus_pallet_parachain_system.rs create mode 100644 cumulus/parachains/runtimes/people/people-rococo/src/weights/cumulus_pallet_xcmp_queue.rs create mode 100644 cumulus/parachains/runtimes/people/people-rococo/src/weights/extrinsic_weights.rs create mode 100644 cumulus/parachains/runtimes/people/people-rococo/src/weights/frame_system.rs create mode 100644 cumulus/parachains/runtimes/people/people-rococo/src/weights/mod.rs create mode 100644 cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_balances.rs create mode 100644 cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_collator_selection.rs create mode 100644 cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_identity.rs create mode 100644 cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_message_queue.rs create mode 100644 cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_multisig.rs create mode 100644 cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_session.rs create mode 100644 cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_timestamp.rs create mode 100644 cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_utility.rs create mode 100644 cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_xcm.rs create mode 100644 cumulus/parachains/runtimes/people/people-rococo/src/weights/paritydb_weights.rs create mode 100644 cumulus/parachains/runtimes/people/people-rococo/src/weights/polkadot_runtime_common_identity_migrator.rs create mode 100644 cumulus/parachains/runtimes/people/people-rococo/src/weights/rocksdb_weights.rs create mode 100644 cumulus/parachains/runtimes/people/people-rococo/src/weights/xcm/mod.rs create mode 100644 cumulus/parachains/runtimes/people/people-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs create mode 100644 cumulus/parachains/runtimes/people/people-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs create mode 100644 cumulus/parachains/runtimes/people/people-rococo/src/xcm_config.rs create mode 100644 cumulus/parachains/runtimes/people/people-westend/Cargo.toml create mode 100644 cumulus/parachains/runtimes/people/people-westend/build.rs create mode 100644 cumulus/parachains/runtimes/people/people-westend/src/lib.rs create mode 100644 cumulus/parachains/runtimes/people/people-westend/src/people.rs create mode 100644 cumulus/parachains/runtimes/people/people-westend/src/weights/block_weights.rs create mode 100644 cumulus/parachains/runtimes/people/people-westend/src/weights/cumulus_pallet_parachain_system.rs create mode 100644 cumulus/parachains/runtimes/people/people-westend/src/weights/cumulus_pallet_xcmp_queue.rs create mode 100644 cumulus/parachains/runtimes/people/people-westend/src/weights/extrinsic_weights.rs create mode 100644 cumulus/parachains/runtimes/people/people-westend/src/weights/frame_system.rs create mode 100644 cumulus/parachains/runtimes/people/people-westend/src/weights/mod.rs create mode 100644 cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_balances.rs create mode 100644 cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_collator_selection.rs create mode 100644 cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_identity.rs create mode 100644 cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_message_queue.rs create mode 100644 cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_multisig.rs create mode 100644 cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_session.rs create mode 100644 cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_timestamp.rs create mode 100644 cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_utility.rs create mode 100644 cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_xcm.rs create mode 100644 cumulus/parachains/runtimes/people/people-westend/src/weights/paritydb_weights.rs create mode 100644 cumulus/parachains/runtimes/people/people-westend/src/weights/polkadot_runtime_common_identity_migrator.rs create mode 100644 cumulus/parachains/runtimes/people/people-westend/src/weights/rocksdb_weights.rs create mode 100644 cumulus/parachains/runtimes/people/people-westend/src/weights/xcm/mod.rs create mode 100644 cumulus/parachains/runtimes/people/people-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs create mode 100644 cumulus/parachains/runtimes/people/people-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs create mode 100644 cumulus/parachains/runtimes/people/people-westend/src/xcm_config.rs create mode 120000 cumulus/polkadot-parachain/chain-specs/people-rococo.json create mode 120000 cumulus/polkadot-parachain/chain-specs/people-westend.json create mode 100644 cumulus/polkadot-parachain/src/chain_spec/people.rs create mode 100755 cumulus/scripts/create_people_rococo_spec.sh create mode 100755 cumulus/scripts/create_people_westend_spec.sh create mode 100644 prdoc/pr_2281.prdoc diff --git a/Cargo.lock b/Cargo.lock index 81af9f584ed..f56868d72d2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11353,6 +11353,7 @@ dependencies = [ "pallet-balances", "pallet-collator-selection", "pallet-message-queue", + "pallet-xcm", "parity-scale-codec", "polkadot-core-primitives", "polkadot-primitives", @@ -11367,6 +11368,7 @@ dependencies = [ "staging-parachain-info", "staging-xcm", "staging-xcm-builder", + "staging-xcm-executor", "substrate-wasm-builder", "westend-runtime-constants", ] @@ -11676,6 +11678,222 @@ dependencies = [ "substrate-wasm-builder", ] +[[package]] +name = "people-rococo-emulated-chain" +version = "0.1.0" +dependencies = [ + "cumulus-primitives-core", + "emulated-integration-tests-common", + "frame-support", + "parachains-common", + "people-rococo-runtime", + "rococo-emulated-chain", + "serde_json", + "sp-core", + "sp-runtime", +] + +[[package]] +name = "people-rococo-integration-tests" +version = "0.1.0" +dependencies = [ + "assert_matches", + "asset-test-utils", + "emulated-integration-tests-common", + "frame-support", + "pallet-asset-conversion", + "pallet-assets", + "pallet-balances", + "pallet-identity", + "pallet-message-queue", + "pallet-xcm", + "parachains-common", + "parity-scale-codec", + "penpal-runtime", + "people-rococo-runtime", + "polkadot-primitives", + "polkadot-runtime-common", + "rococo-runtime", + "rococo-runtime-constants", + "rococo-system-emulated-network", + "sp-runtime", + "staging-xcm", + "staging-xcm-executor", +] + +[[package]] +name = "people-rococo-runtime" +version = "0.1.0" +dependencies = [ + "cumulus-pallet-aura-ext", + "cumulus-pallet-dmp-queue", + "cumulus-pallet-parachain-system", + "cumulus-pallet-session-benchmarking", + "cumulus-pallet-xcm", + "cumulus-pallet-xcmp-queue", + "cumulus-primitives-core", + "cumulus-primitives-utility", + "enumflags2", + "frame-benchmarking", + "frame-executive", + "frame-support", + "frame-system", + "frame-system-benchmarking", + "frame-system-rpc-runtime-api", + "frame-try-runtime", + "hex-literal", + "log", + "pallet-aura", + "pallet-authorship", + "pallet-balances", + "pallet-collator-selection", + "pallet-identity", + "pallet-message-queue", + "pallet-multisig", + "pallet-session", + "pallet-timestamp", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", + "pallet-utility", + "pallet-xcm", + "pallet-xcm-benchmarks", + "parachains-common", + "parity-scale-codec", + "polkadot-core-primitives", + "polkadot-parachain-primitives", + "polkadot-runtime-common", + "rococo-runtime-constants", + "scale-info", + "serde", + "smallvec", + "sp-api", + "sp-block-builder", + "sp-consensus-aura", + "sp-core", + "sp-genesis-builder", + "sp-inherents", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-std 8.0.0", + "sp-storage 13.0.0", + "sp-transaction-pool", + "sp-version", + "staging-parachain-info", + "staging-xcm", + "staging-xcm-builder", + "staging-xcm-executor", + "substrate-wasm-builder", +] + +[[package]] +name = "people-westend-emulated-chain" +version = "0.1.0" +dependencies = [ + "cumulus-primitives-core", + "emulated-integration-tests-common", + "frame-support", + "parachains-common", + "people-westend-runtime", + "serde_json", + "sp-core", + "sp-runtime", + "westend-emulated-chain", +] + +[[package]] +name = "people-westend-integration-tests" +version = "0.1.0" +dependencies = [ + "assert_matches", + "asset-test-utils", + "emulated-integration-tests-common", + "frame-support", + "pallet-asset-conversion", + "pallet-assets", + "pallet-balances", + "pallet-identity", + "pallet-message-queue", + "pallet-xcm", + "parachains-common", + "parity-scale-codec", + "penpal-runtime", + "people-westend-runtime", + "polkadot-primitives", + "polkadot-runtime-common", + "sp-runtime", + "staging-xcm", + "staging-xcm-executor", + "westend-runtime", + "westend-runtime-constants", + "westend-system-emulated-network", +] + +[[package]] +name = "people-westend-runtime" +version = "0.1.0" +dependencies = [ + "cumulus-pallet-aura-ext", + "cumulus-pallet-dmp-queue", + "cumulus-pallet-parachain-system", + "cumulus-pallet-session-benchmarking", + "cumulus-pallet-xcm", + "cumulus-pallet-xcmp-queue", + "cumulus-primitives-core", + "cumulus-primitives-utility", + "enumflags2", + "frame-benchmarking", + "frame-executive", + "frame-support", + "frame-system", + "frame-system-benchmarking", + "frame-system-rpc-runtime-api", + "frame-try-runtime", + "hex-literal", + "log", + "pallet-aura", + "pallet-authorship", + "pallet-balances", + "pallet-collator-selection", + "pallet-identity", + "pallet-message-queue", + "pallet-multisig", + "pallet-session", + "pallet-timestamp", + "pallet-transaction-payment", + "pallet-transaction-payment-rpc-runtime-api", + "pallet-utility", + "pallet-xcm", + "pallet-xcm-benchmarks", + "parachains-common", + "parity-scale-codec", + "polkadot-core-primitives", + "polkadot-parachain-primitives", + "polkadot-runtime-common", + "scale-info", + "serde", + "smallvec", + "sp-api", + "sp-block-builder", + "sp-consensus-aura", + "sp-core", + "sp-genesis-builder", + "sp-inherents", + "sp-offchain", + "sp-runtime", + "sp-session", + "sp-std 8.0.0", + "sp-storage 13.0.0", + "sp-transaction-pool", + "sp-version", + "staging-parachain-info", + "staging-xcm", + "staging-xcm-builder", + "staging-xcm-executor", + "substrate-wasm-builder", + "westend-runtime-constants", +] + [[package]] name = "percent-encoding" version = "2.3.0" @@ -12841,6 +13059,8 @@ dependencies = [ "parachains-common", "parity-scale-codec", "penpal-runtime", + "people-rococo-runtime", + "people-westend-runtime", "polkadot-cli", "polkadot-primitives", "polkadot-service", @@ -14700,6 +14920,7 @@ dependencies = [ "bridge-hub-rococo-emulated-chain", "emulated-integration-tests-common", "penpal-emulated-chain", + "people-rococo-emulated-chain", "rococo-emulated-chain", ] @@ -21304,6 +21525,7 @@ dependencies = [ "collectives-westend-emulated-chain", "emulated-integration-tests-common", "penpal-emulated-chain", + "people-westend-emulated-chain", "westend-emulated-chain", ] diff --git a/Cargo.toml b/Cargo.toml index 983b3bdf205..55958b0d83e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -81,6 +81,8 @@ members = [ "cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo", "cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend", "cumulus/parachains/integration-tests/emulated/chains/parachains/collectives/collectives-westend", + "cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo", + "cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend", "cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal", "cumulus/parachains/integration-tests/emulated/chains/relays/rococo", "cumulus/parachains/integration-tests/emulated/chains/relays/westend", @@ -92,6 +94,8 @@ members = [ "cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend", "cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo", "cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend", + "cumulus/parachains/integration-tests/emulated/tests/people/people-rococo", + "cumulus/parachains/integration-tests/emulated/tests/people/people-westend", "cumulus/parachains/pallets/collective-content", "cumulus/parachains/pallets/parachain-info", "cumulus/parachains/pallets/ping", @@ -107,6 +111,8 @@ members = [ "cumulus/parachains/runtimes/coretime/coretime-rococo", "cumulus/parachains/runtimes/coretime/coretime-westend", "cumulus/parachains/runtimes/glutton/glutton-westend", + "cumulus/parachains/runtimes/people/people-rococo", + "cumulus/parachains/runtimes/people/people-westend", "cumulus/parachains/runtimes/starters/seedling", "cumulus/parachains/runtimes/starters/shell", "cumulus/parachains/runtimes/test-utils", diff --git a/cumulus/parachains/chain-specs/people-rococo.json b/cumulus/parachains/chain-specs/people-rococo.json new file mode 100644 index 00000000000..b2819157152 --- /dev/null +++ b/cumulus/parachains/chain-specs/people-rococo.json @@ -0,0 +1,82 @@ +{ + "name": "Rococo People", + "id": "people-rococo", + "chainType": "Live", + "bootNodes": [ + "/dns/rococo-people-collator-node-0.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWDZg5jMYhKXTu6RU491V5sxsFnP4oaEmZJEUfcRkYzps5", + "/dns/rococo-people-collator-node-0.parity-testnet.parity.io/tcp/443/wss/p2p/12D3KooWDZg5jMYhKXTu6RU491V5sxsFnP4oaEmZJEUfcRkYzps5", + "/dns/rococo-people-collator-node-1.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWGGR5i6qQqfo7iDNp7vjDRKPWuDk53idGV6nFLwS12X5H", + "/dns/rococo-people-collator-node-1.parity-testnet.parity.io/tcp/443/wss/p2p/12D3KooWGGR5i6qQqfo7iDNp7vjDRKPWuDk53idGV6nFLwS12X5H", + "/dns/rococo-people-collator-node-2.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWBvA9BmBfrsVMcAcqVXGYFCpMTvkSk2igNXpmoareYbeT", + "/dns/rococo-people-collator-node-2.parity-testnet.parity.io/tcp/443/wss/p2p/12D3KooWBvA9BmBfrsVMcAcqVXGYFCpMTvkSk2igNXpmoareYbeT", + "/dns/rococo-people-collator-node-3.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWQ7Q9jLcJTPXy7KEp5hSZ8YMY9pHx9CnQVz3T8TKQ81UG", + "/dns/rococo-people-collator-node-3.parity-testnet.parity.io/tcp/443/wss/p2p/12D3KooWQ7Q9jLcJTPXy7KEp5hSZ8YMY9pHx9CnQVz3T8TKQ81UG" + ], + "telemetryEndpoints": null, + "protocolId": null, + "properties": { + "ss58Format": 42, + "tokenDecimals": 12, + "tokenSymbol": "ROC" + }, + "relay_chain": "rococo", + "para_id": 1004, + "codeSubstitutes": {}, + "genesis": { + "raw": { + "top": { + "0x0d715f2646c8f85767b5d2764bb2782604a74d81251e398fd8a0a4d55023bb3f": "0xec030000", + "0x0d715f2646c8f85767b5d2764bb278264e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x15464cac3378d46f113cd5b7a4d71c84476f594316a7dfe49c1f352d95abdaf1": "0x00000000", + "0x15464cac3378d46f113cd5b7a4d71c844e7b9012096b41c4eb3aaf947f6ea429": "0x0100", + "0x15464cac3378d46f113cd5b7a4d71c845579297f4dfb9609e7e4c2ebab9ce40a": "0x103a072cf16481e51f42c8032f54a90c60d0d1dbe48e0ebcf3bd25756ccaf0c6414a732a441d40f919ff1dfd850e758b55f92b89acfa2baabbb40cb2d287eb554f90cc433f516a1f13141c217a3a52b99701a6f8a7b369a38026f7b7acaef00030d0ffb2cf8fd9b4b160cd02ec808aa1b4607596112ada93f614830be608178d6b", + "0x15464cac3378d46f113cd5b7a4d71c84579f5a43435b04a98d64da0cefe18505": "0x50cd2d03000000000000000000000000", + "0x26aa394eea5630e07c48ae0c9558cef734abf5cb34d6244378cddbf18e849d96": "0x00000000829e74677a0a0600", + "0x26aa394eea5630e07c48ae0c9558cef74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", + "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", + "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", + "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da906d8c927c500fb243f4fa0e582580063d0ffb2cf8fd9b4b160cd02ec808aa1b4607596112ada93f614830be608178d6b": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da94aa395db903df66bca3cae2ae6fc520890cc433f516a1f13141c217a3a52b99701a6f8a7b369a38026f7b7acaef00030": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da985e234ae3ae91b863f593daffa88b7d73a072cf16481e51f42c8032f54a90c60d0d1dbe48e0ebcf3bd25756ccaf0c641": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9db37657b6aa638db66fa3f62d0b342374a732a441d40f919ff1dfd850e758b55f92b89acfa2baabbb40cb2d287eb554f": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x419c3470656f706c652d726f636f636f", + "0x2aeddc77fe58c98d50bd37f1b90840f94e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x3a63": "0x", + "0x3a636f6465": "0x52bc537646db8e0528b52ffd00589c94050e1587ca155110706893746882cf922889735072198891f28771aa672811c53dc6b561ec80209cefd7e1c08c10358c03293a2bbc096774384133ba88b782d67cef477a2f69e3fbfdf8b9b14f5a2364134208d97bcb2d031418d5147b14daa4f0bb892a10ecea3ed537da5546e2ab31869ae8997dff36222f4c6b75f747372bd00bd3f3f2bbfdb03debae0ed86146b731fa3eb43fe42ddaf1f93d8cc25ed5c43ce47962f47fad3f41f3ea3ff84fd85c7401c03f21c57bcd77f8429e276cea09c7e1cd9fe0f1f9fd05799e00f2848edb7c5f03799ea0a9279a8f46b789f9889ee6279a7a8af1719b9f68ae7df427603d5dd7b97ae26ec19f603d5d558af7d3f59cc77cfb9e833c4f64f5949df9d3a69eeaad1ec7e16cdde627be4d3d4979ae9eb2733fd97cfe89f89b7a9a99398e7a82c7ea093b9d3fd1cf7a82f0a779d26538ee5a3d49f9ac9e603ded78760e9efb493b574f52e627799ddff013f71bea6966e639ea29c72deb39f53493f31c568edff093f51bea290783393f613eaa1425997a92798e1c27c9e4c851df23cb9eb323cb6686d11c36343190b318cb68e03573c811951a5f363123bea8c5412eb3724ca9d1d8d05c741423330c8393b372c4681c0da6d9c4587c7136a2320794396ce0854300b8c9233a9f43cc0d190e38c8d84c88e9e8fcc4d7d1c16868ea4bdcf592168000fc943d0001a096357abd8e965d47964a3fd19770285da31cdceb036013f3003c879f689e838ece4ff33a37e83c879f3089030e93bebe2473bcc438e08043007eb21e807ac2018718f81c6eb861c74fda7760afd7c9f98e1e34395ce7279beb944a00f80df5547a8f1baef353f61e3f71d5c76564d8e6f538ecd8f11e3939277d478feff829e63baee3701d7e1a5d870704e739fc347a0ecfc77be4701d7ea2798f9faeeb947070ea71748ef3133dcefb691ee7379048ef91534f3bea69c77b9c9473d24fda49ef27f91b5efa897be90100879face3504f00c0e1b59e00f09c9c977e82af3f61d7a19e021080fba827523d912e23739c7abab939a99e702e2373d24f394eaaa71bd26f7ed26acfeabcfb780e3d341cdf514f37f574f31dd7b4d79fb2d77ac2d1e3f5a75995589d771ccfe1a7ac46599df71cea2900558aa7337f433d65d967ea69e6f386cf9fb04ac4aca76c1ea79eb26bd8b59f68156275de717eca517f589df7523de190e300a8a75a4ff537d0fba8a71e7fada7fd821435941106066648c114136d42145530610d6370c1134d303d41df6353afd579a7f5f47a9abaabf3cea32ed4d9e7ecb0394e3d916a7e534f2820e8000c5dbccca0064b0082c906f58226a680822148410d5eb030d9fc14536b56e7dda69e6aea429d1d6a57eafd6954b9d579d7512fa8b3a7f909562456e79da69e7254299ee98998cfd4d3e832550a20a627e071d4538ce8a37a426d81e50d2c5bb4c14618c860824b05303a90010a5ed0c610d4607a027ef4135783accefba89e4475a18e006a17a4f727ab02599df7add6409dfd896b92d579d7ea6956294aa627aa67f5e4430fb68801076c3c018c0d4c5895e2a627788881861d84310528d60006d3137ceba7ab9656e7ddaaa7aa2ed4f9513b20bd3fc9fad5798f95833afb3d0a0ae9f08f30f3b9a067b8f46ab8f4b87841cf00c5c6d91faf2e971e7d44b6815e986d7ff0b5fdc187f44a77b1b9052dc46d0a8a54ef656f0a8a2abae31d78fe06b7de141459560c333e2e1760f40c97b6462ef177037a615ad26b7ff051aff7af096e534356625f2b449e8fad906dbea46bc5685c5a2e7535fdfe7a535b88d1335c7a8ff4f5d2f85e0a0a296b3033c32d101ec24308a10f888127ac747771c3ded413437ddee1471f9d0e672452aaf4a69c48a3bb51c3e7d09b72424bcfd1fa88bc83ea8e6fe4e7559291d8efb1dfa30c0d0d0d35c72e4ac7c70af4f3bedd59fdfea4bcd1c5940fe17b9f4f83af5e8ce207b4bcd369cd3c1aeb2c0f5cf5d7276e534e70d19b7262a83b1ecd2f406faa89329a379f9ae6d768bc739dcff14e75fe0c6f3e57557d3eedf57c5bf559d1a007e413b9145f84ebea6ffb61bbfa6e3ecba54eeb276b876a795def8117ed6277f141b0adefe623dfc373ee066b776af88b76efeb15ed964b51fa7ab75cea94e8eb5df5e55287445fef81905a15e8d4f015ddbe6887d3f1f36916ddaee8f66e476243498160c347ba5c7a3572e9dd7af0059325a455337dfd6817827e9ffb9845dd08fa41fabe5b11d92f36d36d143f247383b68080db54135d04807bdd95ba092bbac43b7c1d78e75921637f6cf7b0c63b40a0988b03b77f5faccb2e97deddaf8f55c0dc1dee7dbfd85cde79fb7a3f47cb3bdbfceeeaf96e8a58e1b23fb6e7db0dc6c3bfc3cde7d57d314556c0854bdb7c48974bf0356ffcdd625d2ef5307c1b10a8e61e7e6398dbcc7fcc7551ef1599fbf5b1b4e3de352010febdf718be871f846708217c878ff957732519e1c7f3ab914b7bae1d1fd69fbf24ccf5d1dd00dc5c1eb8e5127cdb90284343434c34e41df82e2ef17b18528d4bfc0270dd4cf3dfe3bbabf9b3663e6d8677f835bcf39a8fc33bd007be877b3852283cfa09eaeaf7ab5f2519798f7f8f35e835acf1d5ee317c8f8cb9bd3e3aaef9f3e29deea60716dc7ba73503e1de8fbcffc01a1fe5d4c6daae90f70e7eb9d4bd86df4f4877e0e089c07a4dd61e8dadad10270f4c03590d05c76842ed51d81b944afbd25034d10a71f2861a4801fdcedfed481c7a5b116ea8df35ded9e6ef56e40df57b0f2ff5c1f587ebed81e2c757987337a6c80a525cda5e2eed77f3895cdaf7f0e2f0dc20aebb5a9e9bd2f217ef6c8a89a196d778e7f1aca99b69f9395a1fdd5b7e7927bed37a7ff10efc7e79e77d1f7987bfe778677bbf5b117ef73a7eb722f1fc1e5e1fb2febcb707eabdc7c4be1b709be2c28c7e430d3f47fbf5d1bda1e64f9e06d2dd86e96ecfef814bb721ddfdb19f4f5bfa48c0fdecb7bb37d4dd9ecfbd292e76d0afdf7933f2861ad6ee0df57eee7684eb7848a1c48e15e88569f8a51daaf7bb42ba785291ac63051a35fc9ed140badb30ddedf93d70e936a4bb3ff693b5a58f08dcfbebdd01ecdf06f486df0d886b5871b8f4dec33ddcc33ddcc34b974bfbf5c1f5e70df5f640c1c767ccb704ee7db9b45f6d2e0ff7be5facbef152575c90f5a8a2c7097a90a07ea1aa51c350d1a856a85ca86b542fd42ad033d42f150cf50a950af507954bf5c1bbb8144a854a0545439d82ba51876816fa066d43658286a94d5427a80daa149a06c501bd02cd029d02258362a163d026d02fd40af40bd4049405540bb408d4085405740b140bff429140cba04bb81bb40b4d0265c2dfa04a7819681b34456b40d9a05e502ee816f406340b4a04da05ad42d9405140c1f02c50355c0b148d73b9128e84278156e1659c8bd3e05ebc8ddfe0611c07afc18f7034fc8b93e162bc890ffd8a4b41c5e011e6693813bff228e810fe043d021502e5428340c3f8948fe130a057502de816da03ea026a8502e1583c8b17815ea132a066a060502d740534069f01e5c1c778aa56a13ba825a82438985b515150537021502ff0e082070d785cc1430b1e31e021031e30e0b1021e2fe0e1021e2de03185c7143c4890b3861c30395cc8d9424e1a395f72c4c8c9420e1672b49073851c22e4f82027093967e42021a78c9c540e13728a90a3849c25e468c91942ce183947c8690269083950c87142ce14483020f920870aa420e4fc20270c521b486f90dc20b181e405921aa42ee03481c304ce10290cce133850e0a40007053827c031014e0970a8e09000670a1c2970a6e044414a03a70a1c2a4860207d01a70a690d243590da20a5818406d219486c90cc402a03890c2430a43190a640a2026909a42790a4407202c90ba909a42e2426909440d2423a024907a41d90c0200981c4039217a41b90b6905c407a018904a42948544852dcb8419a7213863474f306a904376d20357193869b366ed0f0b43c233c2e6ed8b831c3cd186ece7053841b23dc08e1268c1b2fb217642dd0b05013660605374f6c6edc9ce0a6043726d8a8d85210d9e09145544314c37685c60b599637868e2b363f8871628425d3c2060a12192428d8443103064f0173a3c6043951d0b1858e2f3aaca023063ad2d0b1051d5ad0c1051d59d0e1051d6a8c9630f2c1283512c24809a33146501899317ac28809a3268c9c30ea321ac2c808a32d233246618c8e30fac188cba88c111146481889316242146634246ac32808a3228c80308ac22809a22388b8888ca043063a66a0430b4e71182c040e026f6120f00fd807ac857bc03ce01d3018ac03ce017fc15918077c03f682bb601b700d2619241434686c2b88619051d0b860fbb29921f304cd15324dd0c060f3b29db1a181a30d38d8a06d414716d90d66664063050d1659173431a8a09811c24d173252e82043c6444c0968d46023036c0bf606d6068d16b034d8a00147193459c89a88990247981c3dc8b1831c3ac8c4b0b9603b017b99a181cd1633586c9ed848300ac30d0e388a9920cc6cd151850d135b165b0930356c5668a6c821635b834c16191cd40cd530217303111264bc90e9828605a319645e6c57d8a280230d3455c8309161d9ac80430d1a17465cd058a17941b6058e36322e36286c54d8a680e30d1928321bc84cc1d6b03db161b1b120e6099215dc0eb82a705c7053e0b07052e068a0bda1b581c301e705f705f704070527858b8273822301370507468c94c8829c34e4b491a3868d0d231d6c6f8c6e6033069b356cc260238691173ab0a0e30a231c7025e0a88cb28cbea85ba85a909192838648859a463d022d830d0968ba90314186035113747421a381cc104d0bb62a6435907102071a685640a3824d0bdb143124b019a299020e1fe478818e35e0d0425386182adb941c2e804ca03101a90ccd0b9a1ada19b42ff0140d8cb6065d8326861931a41548576c5298f9825281630dd742a392f3044a031c6ed033b636d42c3c06345e5030130b93cb34c23cc224639631cf9848985e6612a612463b986b4c30cc2fc8d820a78b8e36c426a61768a8a049c10c1066523adec8a9820e36e800b3a1807406290ada0d667eb059c1c30a1d63a8718294034d063253f0c04243836c06990eb630d90fb22b335bcc316ea86869cc2264596430c8b66440c0a48079e9c97cb0809b35645864312049c9b46432c87a905d91f18084841b36dca861448377041e5bc026c44441e262260b0684191e606cd860407386ad053339d8b48899b2bde0c689cd043466d8a8d0b0417262bb82d405e90bcc0ad819f10b16041b2fc8b06146073152c8b861d306e9079913326198e9415c419cc256850d14380b3651d0cec8b182cd1b36458881a2668d1b29510a38926033864c0e5e051d671079a155d8a8a1553113c68c16121068a8a0a94082a156d0356cd2709383192b345fd8b6b021c216031d6cccb420aba29e40471b5b151931e0c8810e346851d85440c550f3851c346cbe20b1f02b642ac8ac6850a821838d1b3ad4a05de161a852e84803c542e60d19307498613aa1660c332ed0a8b8f982ea808e41871b346b905e2213376bc87c21cf8831410d188ee54d381172b4e05d6e84991d50327c8b98064d15484990d1c165b049814307333ed864a0a30c39ac50187c08320cf522c120bf20d79057c831e3460c7208320c0986d4811c432e412641a6a40fa4126410a416c904c9451a41e64066915fc822c81fc82df2081208b20cd90349042904498614432241ee4076913cb8098394229d904d4826e2192219e21ad10b110c395d885f88698855a8a2885888568868c42bc433a297488258021e2a8855a209620a6215918a888248e5c60b71e8868b084574223e11a5dcd00072016e01a601bb00a5c06306375fb851032ee1260ba3c12b60273013d8083c83e70637819fc045e02d580bc6724304a6024be1c6064c8549c027e029b8043da660336e6af0de786d786a60286ec6b80103578189071e1a5e192f090f09afca3bc133c153c22bc1a3b2c423a3023f16783b58f2ba406204227042c4f3e2f9400243446008041e20c491208c34a0c80f0c50c08fd2ebf2b8e8a033000110200728d61bf3f5be111530864a9e14b101244a14a104092448e683473451820449f6e307cd19473059f2810d9068a2b01d58c281264928092a428913239e2c79a2a48912223e68a06004922438d0a4081326492c20c808254c9824b1801c68cc0042f304264c8a308209932216e00424823ad044099326ac12251c409244109220243ab04409087468baec13264b8a0852720412254a3880030d1336090e34598224044e947c0008c912253aa889120f84a008214eb38455624493249a202902c912255a89114d92704050930f24618411bd83460947246184922378d094b14f42a0e407c99327215062a449124b9e3c5112014a938405c11225da89921f274950e008a541c22251f201251f78c0104728e940078a1822071a32f6c98f114a903082cb3e096aa2c48912249a2c39cd119a2ce10089c6086bc492274d9638098aa20449089828a14411489c283982c9920f987e8c4882890987a608fbe486668c2d02090e0d11d603488a082ae2882282940411433304112c6152c492a0254d96e4a011e303462889a204074d6a9d24b1008d268c7da26449d01227492011f48122646884b04d9258125484930f1c81242809264f902c51a28b70f281ceb145b13f4624c164034894041571c41226454011ed53c26403450435f90007900419a1c4c992239a2c4182c4e6d70dac2f645831a31735373534d40f056d2aab0d561b9e12cf8a3796858375737383036f8c70374a5e399923f3ca95920773642963841132cb18a594124a18638c3a76dfca652919729472f73d2957cac72be59352c68d4f4ade5d694996cc72df4ab97261bc78e3b817dc6569edb2dce5985d90e38541eebae606573200628c71c6382bc81516a3acaeb791d96229e3c6c87059c6dd65f883848f25476ba5f59e9432b3a4dcdd2e165d2ca384f1b2e1c850eeca28e25d867b8e0c198310ce4964c6dd8da944cc577c2b12e910bd2136bba21811d4c16f2bc9bb558cbb722e5f1c39be1899a38c31eeae48324b695910e6cccccccc70dcc65d5e8e897004af27dfbc1662efb29677236bd7324b29e556717d6ce2eee2d8658e92011c63640030f3e5e392f28aa2b516f2087b7001912bc9bc8c2333c5e51899996fb86179e3b338b27c184bb9cb524a8e10c376e305e1b6c16d8390318cf9ba2e78c118e115d9b26294978452621bb63133cfb817c36841e6c8168c178c91637cfbde7bcc1b7919eec2f7f6e2bdae09b71df062182d8e7c45c83133847b71c4a494d7cce8b2208c912164f838760f2f33f6229423692312ed42cb5ac8d62e5b9079322ff3c6da2eb422bc2e78619c73c9c852328b7877151079489900044418a18c9161e427a58c50f2caf836eeca8d79076fd1873871640f0cf92d47b91c772533afc58f594a9642a494707b5262d8688461cc8c31bc2eecba609417c717993196d6942f5e923116b1e831f3e0c8cb5664c81b31de8d2b97374666b97cbd77805853535363ed3ec81784d785718c50fa88cc30322fc496e5c27dfbe432af5cb931323f8ebc1b24eae01819eecadd85fb645c86fb769723c3b8cc9057328c524ab9f0ba2e8617dce60531eeaaaa2ac68b594688415e69c1c8bcbb707763e47d1ce38571ce323327779939c2eb5a299937c68d303e2865b42cf82294303e296364e618218c9121f385491e19a3a4b9ae186394d2ba2cc9a39d1e06a019411a1e7ad0c0f79eb42c6b24a3949694b500920054d267c567bd917549193796922f19df8b52b225e536802bc22b4a68c5287765252384108311c2b8979498484a8e1c9999b96268c9c872772f29b9be51c34099e5103849c2034a3c50653b00255094304112a5080ff000b203e840124c9074a0c9920e742009263631c71145c9114d962069b2a408248ce0000792a83b1ca1c48992239c248164c7000450b2c44950000ac084c9921f2002c0e1474987520e1d72e0904300020024e608264b9030024910930f14c1012547e8f0b0b3234a122008cad93100012e438001202180929f22986c0049079a2c41e24911489c003d74828a70a2a489920e38b9415b022879f2448913253c908411489c28819284114a9c2029e2c91146284132809f1d0310400923943ce1c1e1c092030cc0000620c0114a902411a444089c18d1c34911414f70887962f32540124938b9f931a2880d306192849300948a50e2e426044a7e90044551d2248714a4a40336324f829e2c89a2a40a32a288274d8a701284246889073c904429c712600907943851a2e270528412264690628e68a24409258a40a2a40345384922e8c9db01782067952871c201244e92082ac2882498302982b40350e28125414d3ee0a406e140d007764069a204e2d801206992c492274e9440411245091248829a2c71a20412239e2cf10092a0284a70a03451024bda1678853221212121a10b85121242a1ae15121212da92a01e3612128a1085414eb2423109ea0909b1104c827a42284e22f4504242302659a12ac90aa15070a24ea8984448682659140a4b827a2821144c22f48484504242285495645142282121d41312e2248bca92a0de4bb242425712d45b2121142aa2ac24420ff536c9a22a944c827a9b04f550288649168542a1629245a13809eaa15e9245bd2445a215deee3e0f3c296203679deb3e98e7629dab2369cc33c33ad7650a0b1bddf1d0f2a415f25a1ea3385cba0e55d0c3bf0effa5aff3dfdf769d64912ceb9be2a24a6f8a0b2a7a864bd72bfa1aab385cba2c2af7c77eb7b83ff6f53e9464e8c57c3de7db7c328b6e979f930e4175a73db3bed6f71aedac432ea874dc1fdb10cadfa8758cbee65fd7377a1da3efaadd75519e7f135e136a1765adce4fa82dd5be1b914c7b36a37651fe6e44e6a6617f1b5014294d3031d4401d08d8f046987eb25db8a8628ade3f4135563b6d6a5d949e416cb58bd2f3da56ed721b92f5b3f7c0f5d1ea4f3624fb56a05377b0b39ef5e73abfbb2eec3db08751f34522cc0de2e29f70dc1d909658d2e8aea66510de91e78177725afad0f2dca594df5493d971bb3273e58c0dbe34a7d88831f51f84b8196dfdf2d625df56f5271cec2e485b58a874b75edaaae9e19deefac1ba751f7827678cb6bebcc3a3bb2d63b924dfc33893a965c673425bdc35bcb3a91974e1b77039de81b73ec33bf196758d77f8d6d787557f160cb76157948a5c1242ca134b58e1892e559e388215d2302dd479a29b90032aca50430d6910c3b45087bf1ca37129d652e97d21cfb24ec7f5b937b5851a1db58e938f7c206f8c865a77251f78a0a9d3fad16bad98aa6a5c9255eb4d6d8146c73ac3a5b7a9de1e28f9b88db9a4307033382be4355fdb628de6d7d4008c166b54c1452ec53ce19e1678e534bc91f9c0e01807bda92d593463d19bfa41135dea4df9200745829c00d31d6a4bd5dd07506084de8f1e181c1c426f6a0760fa8dd19b02a38bd6a137a50333de462453c297064ad27b2219982b1a4848d45d5016ac50834577415c6031b3d05d1009b220bb7b22851de4f0832edd3dd1d2a5f7d7d0501c1aea0dd3fbd773f45e564118535a9ed1ef7304f43a7e462a63eddedb8cc073ed86b0a5e390f8d792762892117946c7cb33ba7b82ea7879a00d13260ced50cd728b10da68dab4e519cd9447bf8dc89b1f29941caf06b191371f4e067a6124aca422eff044de610d9a2d86960ee296b5e343790d8f6ada90d2e6a0d97b947c9c8629e40d75b6428464bddfed61df0ef1a315b26ff054ef553d618cb13fe2b7d8db434f1843d81db663edb876420d85bb034e5ebf63331937356d53615869a05143b9aad7c336ecb8bb4a09ee7dbe2d098edf2e81c7789b0f501c1ada2f518b44a34a635f0f4f0d347acf2f7b3dc4a1de4f4b83db9045c3baaeebaaf8bae0bb2e5912bd576688b0ccded41656f40cce5cc87380293c80c289361ce18d364c474829821334b0820c6fd8c0b48f5c7a91dfc355edded5af9531914bb50b82fd8e7d8677a635ad2cab9d651d9ee39decf0d3a2afe7db88ece8c825ec5610ececf3f13e287adb936e977847870ea7dfe17178e7d5aeba3cfc84ef55741ba397028264bf99e628b4bb7aaf953171f3c12578ebe79255f99176af81debea241f06d3e5b65e5b8c4dacc1b8777def03aac10d8d047674fca609707c2addd1b6a18bf144aec7da445b8de43b8df33d8006f68095fc2bd77b1e338feb54515cdd76696f430e424e6f28e3c8d5d6a791f5d74ed4dc9600a19c8608b0cc0402dd2ae3a3f6e41c0738db0fe708f535a6ed422fde1c7cb2d0886cdcd70fd81e777872c65104577382d6ba6a53dcabd5b7c0f2f7cc7b5bcbcf67ad89687f5bd1eb8482c3280defdf10e6f3061fc8ed11c04183130a3f9f02b243bf6b801211f1fb7237cf8488174069fbd0c661acc0eb56bf06f1b921d4efa9e75f0ef950637235c97b85e55503cd3f525a078a6aafa12d5ad13717d898b88ebd6e3832c984399496e7769f897cd9faa4361dd8b2d8bd488039c7cf6eaf1a3c7fcd59857d489ebd52515ca4cf2bb42ac57552833551fad1053b04b499f09a35e0029a03b5467918536c97a5ea345b29ea2c36dc83b0eed1dfd6132af7d3b6bb4c9fcf61e888376a88e791f8dce51edbb01f1eaa87e80eb2e0e0dbd8bdec373f4b62cbe34ed4d5de9420caa681fbda92cc0c4400b9268dbacedd226254d1125cd4d6edb66647b1652bada8c644254d589ab9e50a6ac4261fd992496299656e77b5ad653256f61551592d58951f593d0f5aa4eb9a9fa949bb02a74d52937c90ac51405989e4099e4e5ad8a67fd91004a9e34a310779db828b292e6a5fc7b953465455d6928bf9b10b22ed4b9842abeac30370ab7292a5f9a533348f5f6a5f5c03bcc3b0c471722c2c44d60bbd04ccdf69a1a9b6fd5f69a8d6a9facc5877d3fa3d476f246c4690913690836711658e2e6da97e07ef3b70d7173ad9e44e7249df36d16103dc7477409d1478fa127d163ced193e8dc77b380cc6ddec339e869741ed7e849740dd5f3d9276b92bee668ccb79f4636f5c47de34197389db673af67130ebac4e9a4ad69444fa73fe7317409fa25fe25727e125a02e7389ee3a79a9f687e9a39574fa221448ff96e447097a9279469f41ebea1a7671a55492d20928fa94b708fb9824bdbf4a6aef8d273371feb9236c95adea245b296585069f877851b96b69b056c1e738d6e17d1256c2ebab5594026a69e44cff15d21163869e7f193e838bedb1032dfeac9e69a88ae09075d42bbcc79d025646ef31c748993769b5bb443b5dc88d02e5397d82e73b90d6173d16be869bb4c155a42c7797c7b452d6073515d42fbe8733722b4ea84ccb58faa50668af946853213b72b44d60e48639922ba56853293767e0c1d9da3db333dda1179bf1eb70970f5a47dab5088ee45557f98c85baf1ef35d21b37640da7a56bb773e7c0f3791af9e13328fa9a76722d5256a3dddfc14731ec7e8758d3a21731ed7414f35d7712ccac0c28a9eaf2ac195de2554a94a70a5abcb8e7d8596de26f43b82eb6a6209aa500183051a58ac81851b57a85cb1e24a179a2629e9aa46b0aefe3a6b4b8dde342c35ba3a6ceedd8a6c1a0890928a59f062a8ab5b5df514699292e42f4a92b54857c7faeadd8aec70c610867a2b820029a9ae965045741ef5f44c275a79703f9d470e578570be7d4715c2f1c23af71c4df47b0c9d7253cc4974ca4dda475468f41cbfa942da73c454a1d147df2e434f28934d854254bd005240ff74fb76e83655c550bfcb6f3f530d9d72d3e93a39313a4db94948fb7699eba0279a2aa469cff193108ee7a8536e127da64eb949a60ae1a8536ed22a1431d509059862ae7dab4e8cba4d51d146bf1a14fb1ddb8e6c13fa550f704be84e62c9d24cb64b1f75a52f4dbbe8f10b791e6f6d13107d740ef23831baa84e89a95e544799e2ab2aeb8f55258032716c123d0a71d7e90d0d71513635345449f2a2437193e8d53b25baaa2429fa7b97a421cfa82eb15d7bfcf57a78f5739b008f3026d176ed701b42bba89e44d7449b26a4037531d78314b4d1f059956a99a5408d86cf52e0652e065ed4aa6b8fdb11f8ec71fbe1035cbf4783b8b63e33de863c203d80de2dbbec50fdaecbed48f6eef5cf7b7665fcd765e743b9f90075db11f857e5e6333fabb72c027a61de76ecdbb98b7c986429a53cc49e814a9bf4f5dc8d48769b6f242aac347c46daa898d2f097a65dbbb09b21db26d2dedb311a91725e8423e5ecd85e966ddbb16d7487486e3b8eed108d6448a41d6c06898423924e73d288d3de9be101dbe04122d12d0692b6ebf8f6b9515217bc43bafce4647e6e9e1d48cb6c436e9e5d6e46e0b34f1c1ab3b60367db9c14d172ae712f32fa752d47bbc6d50e68b4d11d1548a8497fb4d334fa1a87447a0fefa0db9a0fe910876e6b2d27e992b4bde6dba3151df27ebd07dad0eef5cdf61b6a6343b76b745069854bf23414b2c125798c6e9476a78ea1dda971d0ee24a2dd09b601db6879698577d88c96876cf00e76f9596919dd9e33aba422f03f8fb7bedb0f5517bcb35d7e6edb76defea8880a2ea8d04205172abc50a1c6ce6cca4dd7feecf5f44c6bb97d4e6ddbdec353b3b08b8e5df46a0bef882e3f45229128cb469ca639299265f3d7b32cfb55bba9d15127adc8e836d7239168fbfb565f175c92ff69166509a1bfbed6a19f524ad7f4ae8cd49b4a85d19335fabca83ea5f6de7b38db8eece6b3a9125c699d7eb5dac22579de82c03aab1d083801a76ff3d12e14a5df4fdfa1b8e9f40b9d6450c51a4326fa21880618aa1832bd4a81e2a6ffaa5d9caf805efffa6e0f3e8a3da3f09376511afb6e41941a7b0f6719859db4a2e5ab2ddc854bf2b2d35abe2c2de5b9cbcb221f182db97f5bfe75f104fc326e43d0ff701be23fd5bfd257a9de1e421045621cc0d0d534dc53d9d2f05123826a2b281ed6ae48777202e57a5583e2ab77b13ba1965d14201e7d7db723923703ac4958a15cd5a2f2bb7f578078c82b5cda540c1a9ee136a464050e560050c50d557c50e931a536fc93421bfe0dbde14f3c1a3e4a4ec307ed687825701a9e09a9e191b869f8236c1a3e494dc3634047c31341d3f043e4687821661a1e089986ff0147c33320a6e17bb886f761d4f041440dcfc3d6f040b486d761367c296b781f58c3ff6a781cabe16baa869f910dcfc586d760c35f43b861251979cd7fcd8f9beaf7855b91f7fb94afe8ca571dac3a3ebcdc53b819294191fdbe9b112c4ca3ac775d29e2a637959ad238417c74a806efe0e0e0e0409c1c9c4fa8e1e0bc87392e2727e7f3691ccdc9396f3e39232a1a511198ec4ac7df7c7fbd1eacd7e589bee3f3045f1afe8676dca4ef0a01d2a3dff4b882231d48778ff41ede153280e6cf4cbbe97105571d4877dcd7b3cd08e91df7f69a3f771b7280defd71a1f815ed86a0baa2a87e94f411ed6ece9fd97684bbfa752255bd2aaa1fbd68f7febe7d04d7b82a49e53900db1c205f69dae623fa886e73747b5e6ec81ddfb163c70eb983c779ecf88e1d3c76ecc0b9e83822d17c5adcd0ee35e930e7a2e7888034ce3bd2f9d536049ef41ae7a21a9b1d22b8c60e914824a23b58544946747cc7757c47c73b6c6e64a668ee9055443b76cc1d3be8d4767c472519a9f97ccde7270e75121be737a4990a8cd1770be275954d9b8f6ef3d1e788cee3d0ab679643f41d4f502db2bcbcde21a2db9bcf34f2ba7a0fe3d0ed778c446fde036fe8b60db5cce0527c0dadb270295e0795546877ea8c76a7ee2a304e4bf3d169ead50697e247f55de152cc419370b03bcb8be5a5e3af366668128ebbabc0a8c0e878cb0cde9154646812ee7527ab747c958577468f9f500dde8989c9b26f4670e84c0ddec91e273373c9ce9b4f761e8377de398ee3be5b0f739f9b010c42ad7b5a3477b8f9707f743b866ebfed884e7395c7e052fcc4b0873d625ffa89eaead11e9e9f8b812cfd63a84a1bcdd39baa924af5ce1414acd1385dace81dbd2914b8d129e0d238bda91474d11387667dee9cda6e57ed4e7dfdd18eeb774aa7dc44b547eb895e28332d1be0ba3ea746e99a1e8dafae877d6a1a86fd20674549efdba82619b95e9dc805d7e8f8f7ead5eed4efa87e9bcfa341dcefd67644677ef4f9519554b8341f3fadcd080e3db74fd6de56e4fdfadb8a547fdb5f55974baf06716bef2e37361fd1e76ea3da09f5e815edaeaefee8469d14d97ebd088e6f5fdeb96ae7a4c8f59817e17e7dab5d751c75b9b47d7927a67640afb75fb55b2e55e74654ab404215dde8b68802bd9ef31bddd6e6fc66a4d4b3928c64c79e55a80697e2b1df74971b1d9f59c13b587d576e2ec055bfc0052ec0bdfeb1be1d6fdd24e17eae6f77700de67293847b8f577d16fd00d7415c5715cb949b4e0cc61525643164128a6a88e18221989608c10965f2f1288098a00062f2e25d52e11db806efbcb6a2b73b08a6994bc773193da01a3d980b27a047f7b4e8f8c745e531ead38213501f7fd3e30aee59e9edeeeaf8c83ba4ea58a6dc44bfa4aa0ec1d1737302e8e31fad793bbc4b7ab33abccbad484cc3c76d887a7ab80d717ade84e85139a8f3fe36216abda0cefb6e42d0ba50e73d8ba81d2c8036de15dec10e6b0f2cb877a5e3f77ac7fe2af647afecf540b89dcda765546a908ab2c7d7be9b4f56b1705c55bfae67d9c5db915267ef19d55e51abaa9e5159abec53fbb53d3ba4d7353adf03aff988ed27dddee4f722dabd206e969f3b577b743b464946e0b1432c03d47af15b3bf9f957b17087547eeea6d5eed45ac6d12937715f4e00574f42a32f1b20fb69d900f0dc9152f77046f78fce6b94cfd1358da817dae7a35bed62bf6bf4caa8dc86547f8734fba4d77b60763dbe076274fba2db4c83b85fcbf3e6235fd12e88e57b58f6b8827b577afb5de9ed21c4288dab296690a5c43b1878d2051838da937a532600834be046ef90d59b2ac197de4dc52ebfd100c7bda91270e93d37d93ad32e5a74ca4d966659f5645d688733863064b2ac6da02b03a59e4f7b57ba206e68048786c772bd8799eee623c368a34b0d4f1dcff4a2536ebab46bca4dd5abdac5045cf5745dc8fab20138bad1f19335a6fb8bae69b723b0f9b102c13061c284e90ed5f0165d3640b7a92ca67410f7157844a7617d5776f3e10a6409314a722586b91a0adecc2d82db14952e5af6a648d0a53766c2af8f6ebb347f423a451bb176a88e87b47b900b03e182f0ce1ee76d819b0f57c33b5da9f91d1020bcc3cd0fc23c1f1a1a1a32f17b98e726fe0fbc03c40a813dc2e1c068fe0cefbc26ed15ba24bddb9045a3f7136a918ba8492ba4566d3e552cadf28179d6440229d59372b987683f5a215b777fc0330bb80e480f0751a3f940d6683e0fbcf35efbd0db45a651c68bf5aa1004d3011c9746f35180dbad01a88eb1bec7001f2c5c0012b865f2a2563b6f40a0fa672b9050ef3bfedbfa84304519bda929ba88530c358cf36d40a07ab9d4c546755527dc7c246b953c8d445e5717ef9086bcae5ed5ed77495faf8f587f38d6623ae0e7d11e59bcb743e65240ebd873c4153eca8a0f4f1ac28787d59ffc0fac7ef10e77a5750ff730eabdc7652e05b8399a028d0804ead58b4bf1f17304049050c77d1deb06e63284109e1f2384112a991a9deba303d2f0b37657bff7febe97c28b0fc7dde13494820b8e0fdee974d08177e2e1cf3b5bc32fef6cdd951af22cebc4182fdef9e15f5c7a7f5fe689ac03bf8fb5bb7a61cc7269dfc55eded99414577a1f79d6b4df8d87f0635cde61204cd112c51a51a4f182f084c03d28dc7301f75e0b381de65b0127ea4d45c1a5df57c445c7573c3bc6d090693fd4f3fb398abc537def44efe7ae10d1e7446917d1dd1f5aed26103791593beef9778d7642adbd16754f847a3e3efbae10eca2fd21aadd3cfc768ceefed86aa71d6e3f0a64850913a60d1dafd10e35e4757c0f4fba9dd19f58a1bcae5e84bb3adc8cc473ed50cddf9e7f146e43aa8b3e29a948bf8d88f6dd1fef3db087350af4c2f47511256d44ac63b57b8d3da3ddebecb3a2ddebeadbe376245e7b0fcfc500b7a928b4747cf5b993b5dd886c9fb58b3d2143b95a74517d5b91d8d5e7dc4d543b548bae5128576b9fb47b3dbf2b44ab9d7626427af7c7fc7c0f9c147ebe9bcf9b223e2220f481953c3289e012ac2ac5127311c532e5a6984fcdfa1c554f98e284357a424d5e8956402b5cc56b59ab343c116f4a7d54b804b3bf4bf94ebb8497d7e1de928f91a36f7fa2cb43da030beeaa41b0378bf6c082db9a550b3ef6567faeba59efb46ac9aeb62257fd8197bd55be0eb723b2617d535c663d3c645eb5d3baaa381af3aa074ea8551ac7d568743b86e2a8ce511cdf6d88465fe3a8ac18ca7da353ebeb1c8dac737dd2b70db17e7dbe7d0c459a4637d28b75de334a676a280e97dea91ea2a2ac40b063845408a236ded4805d72c6187fbaeaf042b1b26a876a2bc64f869648f2851dfb9cda2d0bb3300bb330ec1afdc9accdb2b06bd635ac87b72cbbc56dd7de8dbe61f21dc7cc980dab5d9068636e66ef46d6fc76d1563b6d62585dab7695ec37e24a0a4e40a303d09b724216275ce98782de5413a8f41c5d24feb6f5fd555511ea94657f53aa67f122fad3619717ea8a2e564558855b6256173be6576ced4df176a846cf44a24c24cade0333da3d2bf467fbf6a31decec5c96551f651f55a20a0439da09f5cffbc67df40ec7b9ebf1cb3c33f2b10b82dc67e8b20e57ab981ac48d5de762b82a23aadd135487a30671675574ee31b51b89aaec5368cba5b719999dd50ebbaafc0c9764157a288e2d1b7419aa2acbc9b48b962e55bab8d104e84d75e1c28c3a6df2dbdf948d37c940b037b90d41b5f5d9dd56f8aadaf65bb56dd5b655db7eabba67e527c2aede6755c1eab0ca566f7a64c175dbf7bbc96ddbe4ac9b76f98e45dfaa9faa766f321cbd3a57896a10f691568360cfdaa1325aaf196d638b8b25b0b184327a8e223f889b095d340ebd292630014c17a037c5842d3d77468b8837c55ad890fe009ddafaf672fcb36af776dfbdbafc6af3b17cacefb6af8979579dbbf9ebcb3cdcadc7d0651d6bbbc6a5ec229d4e7e54b7aa55350876f54e9e7fd11e5870b30671579548557f2ac6eaf58bcf56fd79affe5ec9aa716976e42a62a983d18b5ca215f9b998965dd3a29537a5e5107f795cbbb76d446e9e3df20edcaeb2cd8f56b4cd87379ff82450e6dd63de95e6466f5e4393e3328ff99cdb21edb8469d32983d5691c1d185fa2dce7bcc381b7747b6da718f9e533b7eb48b569adf5fed82e2a87bf58dfe986b57a14e420fc2a84577d5837ede859aa1557d83dfea72295ad15d95bde36cafac6759eda295ae1ec4cd994c9641092594fc0765329977fca5baaeecbb3c59b6d5bcbb68de7139a08e1cf1a1659d2b69c7ab6707027992f0b8cdaf835e44fa4c09c78bfcc52ab18ad7031f6ecc563afb0d1d6d4446e7fac3bfb968943d09d4c9797735e9cb3ca4d3fad7f3a8ddc5f03c32b8c1d1b5ecf24020677c1eb5e32f221d905fdd2672b9a1bcc3a24870493e08c78f6315446ef83854fba3d5fc0ddd26d1ee373556e152751e205047dea676574ded2e1db5e3686ac7896a5793a3763533b5bb4cedde386a57ea98da9538ceba36eebdf7acfa733d3b17576055903b56a3b95623be76963daa3fdbad67dacbb22c08eb5aadd7c5715d0dcfae0eff71df6af782645fe72a097b75eb40204fbd7c120975baf572c3bbd777353dde713e7e437d55a08e7c771fd7d5a32edc2fb52ed4e96abadb2f9dbdfa4d8cbd5df48ebfb455a5ecedd5b5ad76af8af5edf27105d947d7acda05c5cebe74f52a35355c6fabd35dbdd52e4876f6eab14a5c41b492d124477049fea2d2aa71056f87eae18821095dfabd29248c51469506d29b4ac2974602189d436f8a4b186cb4d6f0d796256c6903f4a69620a5956046977a534ae8a2959046cf7ea7d2b1b2646e511c9f9af6e51ded5cccafdabd6ed677d16624eb6bdb8888def6bcdefba3c23b9bcf8b3472e9fadc7ce69c938a3ee755b9eb71bec7ebf127bb505fcbd7f574fcc137c5eb21fecdebdd553beeeca3da7133957ebfae1af9ef5db1fef0b35fef6477af76bf68c7f565a14e42b35ba2df67503f2bdd59a73fd785fac5ad086c8d88f9aa7417c440b0bbd7c3713b426341d1bbecb1768f4a5be77f8aeabbac0671cf99e778acd727edb806718f82c89e8e1a5f25e9b855e4fa3b72fd9d08de899f7f535e0fefb37635b72e1a55517cb71eafd8d55428123db86d44aeffc4dabdeb7a87734b469f0ea641b8bf1dba37a5af5b1b11d1e72dfa4e43b5e7a0319fa1dc47d67ba088082ee190a1a4ecf3dba3e3c0f14653bc1eba177927fefdd5095bc36ebdb37ed3230b2e885bab3fd8afcf77dae79b4f86c6aaf1dfdf16048e8beaa3188e4aca6e9df6c0820b82fdde05c116ddbaf69b1e587041dc23ed1c5d2e718fa1914bdc75eb1b5d2e8d6ab768b4f56a23f2fe23aadbe57644ebf76af704d5d7b76b278277b6b5bf295e0fdbdae3e6a351691a2397aa67f4e252758c2e9782705d2c32fbaa6f8ab78355c93c1c3fe00206172db874b1974b0baade14172ac4e00206a9347a3f7b5362a400eb4d892145dc8510c275e2853179b110ee8fc77c1d9a5fb35407de4162efa3f9cba5b9b9470d9b80a8802184105ef0d137c46d8a0b2dacd033a929f40c9760d5622ee12684bb4007e27a2b0e973809624879449000cac45f02fe0958a3508089cf5588df5f01f62bda01c4884377efdc0141c94ba8570b5f7a5dd248bb53c74bf80518d35587760955e23bac210efddd2c8043bf27f0f09860141f2325555f29532ed335e532595fda090dc143a6eb18852288c9221579575ad6aa0a617d7b08ce745555051ab5ac58aeef190de43db02f6ad1853addd592b90acf15914e89a6784887e04c119e54246b5881468d257ecf58a8c3fcb07801844158010318e6ed70058f157307fdfa0d35acdd1b82df85df331e0ce68b82db27b8c7a5b730873d53a0d7385c7a3f3dd46305bc9ebc90c77ac755565da803bf50275aaf0ecf970fc902d8ab0f71ddba2eeb10d8ab7af2421eab873ad0c910d5af7ae2a00e7c3c04d6540375640533d39aac775cc33555744d9176a5a60d04328cc17c1d3b2659c3c773ef27ac5dbcac58aac78dc83696293779010f372358c7da09d11062cdaf6b87ea24d0bb4256c83643e62a7298404f5e63f5e71dbb0ec0e88e9dbcfd211f7435d086d19e659ff271575d1ea3fbb91888d77430466b13931a33bcf6b719d18e7d46ed6d44ac4f8c6a8f9b91ebefafeefe781d57ec93768c41b91a08b661a8f716ed821eaa7afc85b94570f1ca96965f8c711fa5244854ba4677f2bdf7aab7affabe0755bdaf7df08e74b20faa8c20697ec5dfc7755787573bf87ee05f8c552e8d88242f8d963970a3abc30369b95c5ae6804b77405a9684208277ba1a207264778b46cb97607c5b0350614022f0ef7df3819f23e8eaa7259610ba84b0217cb858edf83f57ede0f75d55557589e66f9f7798e15f558dbcf3e571b899541637baa2b239ded9eaf28d36b4a1770bb33aec2bfac2f46e43abc3be872bca434cf43b4330971a73f4edfb991ade99f751e29deab3a2a8cee8f68ba27ace991d5ea3a4ebd8b7353a3e43a3e3b1cfc5407c38e03695654b579f59bae8f8edf3d22a1a3f27ea55b49387c7302ae7d3e47c6b7334ff4332625ddeb2449691cbb244d6bc3eb1ecdb5856875cc78efdc86355fb856958566d47e2b3fa23dfc53f417575b91d89c7b4ff5447e2adda55d72af69d9856d111850cc5ee009e49cae850ec0ea0fa33f5408d6615e8043f1ad1356574bb4301412358fdd91e7d7ac480dbdecd43de8cc4cf57b5db3e2b69defa5649b35ed9adcb3272591756bbeaf3f327fbacddebaebaf62c6574fca49d7612f625617588fcfcacda3cf659777f54a01706fb67edb26b74beabd7d7ebc843e743eff71713bd17010922f450196b52cce59d9d4420f348c92ec50bf889d14d314fd6a086d1fdb20111b723704d3ce572c306a04ed0d711200bc6013d7d1d6e4678d4d6e793a24ea80affd0d3d77923d2a481848a68cda32dde1a80c2a2af21a82b0d94e489449dd095ae7675e8aebf06a0c2a8fe6e5d5a76d5eead69625a46d784d135f156845fd5ac13ea1b50e9eaccd133dc8ec4c3da5d0de172a9aa1ddc8e4420d83ff072dbaa1fa8e9a09aaeeaee0ff8f3fe1e29c9481782e673c5d590176c78a1451719b37f55704b636f9a080a8ededdddddddddfdfa38b9b8c0a123effea8ac57fb6c8558f5b2fe6ed5f7ac9ffc429e35f1b93a92f53e3b326bb63fd8b2e81b6afeee0f66265a560e078ec598af0aee7dce7d3ae022670337fa7d7dcc486bcb371f6f406867faaed11f26c27f7f735f0db84d7541a5b3f35f185c3a6bed7342ed6d44ae63ff99cfb293b6ddce947bb3b4b8fb637479a6a28f68c7efb8217cd1103ef71ec8519211bee87c51a5242359f3b3e67ab33f205b67c8b32678a6a38baced48d6da6f5608bcdc8e90f607bc566fde50ef46e40d6189790f739027a6c251edaeaefec3cfdef11708541859d6c333f2792bc2cf7e44fb037eb43fe050c7fd019b70718889deb0b9d5d1777f60dbe8228c76b0e745f341558b36ea4434d2dec323eda24d3b46bbd7538759b16767babd2b63acca71a9aab5659d11b1f582f9aab0c119ba0a4ef6a66c0066f7c70dcc10c27df5c9ad5d945ea66fe8d5136cdbb6699fdfb66ddbbe3e369632e79c73ce39bf3ee61b188661d7ad631886615f1f181a2ccbb22ccbb2c6407963fa9abfdbfe901797e49ffcd237c4c596f2db0af1e115a2c6c456880f5c213ccc0d0167599f2378082184102e84d5b55488db940dbab47cac2a4aa4b2ce5b8c4623d1b76b9f1f8d46a3111a73ceecd8af5b9f73cee984b9bbbbbb6fd9d2f687f54785b8eab2bbdab2aead10bef56d856c5b676ac1e503995064033d36100785bbe3de65d6664a58d54e5bce848674575339af44d6b336c93aa18ee78ecfe4a1a1656d92f163edb25f59673648b5ecec336a5c7556974b5dec4ac22d835a2665e5b743c5d899f2dba1fa84af62fea66cc04636d55cbb1e6dad18f94df5a66c30d42b46738d5caa2aecb21adea21d13ada5943e117bf204b388f51823b5e22decd879f3a92e28afad48ad4fe6ef8ffd09e27a75acc62b46dac53fecf37aefc55fefbdf72bf2aff7de2fc6f8e28bffb8a27144499129293ed21f7aacbfc9da8b0cf4c23809d2942892a4af6b6fd1eefa8c87587502b46086863a08475f873048ebeb8812197502a480e6fd111f5475865127d9832a23481a3b0f2005f4db1f3162755787f86d887c5523bd2efa34fe7312eb753d8b0d283fe1e7db247d639826fc9ca8be5ec7bf20856c1d72053aed21dd863402c1671d08c7fabcb8747db7219665d5e5d25521ede0a170cd240e31d1dd7520cb0d26c234940bfb89e7cf5bf5a25a775dd57a771de892d20413ed044ad5ef50ac7e826aeb3dd0a2d52fbabdb4abb20af4dce818c41d4f2af2523efc8a3eebd59942e1ebdcf21750079f456fed1ffd79d5a290afdabdefad1781dd3d41f590ed587f60fdd9f3fedd0c7367fa0d7bbf3b5c02f2c65c82e3ad065efa3fe6fbfae8b825b815c26898a322d7af5fd87eb12ff6ecbb34a31c7641797d5daf7e3eadba96bd9ed98134f6f7aecf4cab2a23d7671d617fdba38283af589d17edae63cf6a87eaec1d7b0fe43933ecbafa1da356b53af0655c1d7848ec8751c8ab03bf6b002a8c7eab03bf01a8307a57073e962d465f0a38588463ba6dd11f5d511c2eed453bf9778b925e057a5d559c3186863a87aec298b20a09b81f791cba93dbdb4a568813208d658f5a2efc7db756550a143f4cd5a7c898a8f0ce4cc733697920ddcd74b75b78c09aa4547f53b8ee51d942c79ff61cd43983153dc0a20759be0c0d99aabf590d451b9840064dc42008262950fc30bd4f9131eda540c126eb5312607aafe89404984e5e0cf17e1202eac4bf2e272f86b05ed5530fd489b7eac98b21aabf7a3ad489af2a90853aa9d47bb75d160d519081250c53a801169cd04306dc9a502a282308575c2186971c98c1b4a67d0764880f0d991e15dec1a16315e698c57c53705087660ae98a64f1310a35fcd342c7ae8ab76a93aa76d599c02fc0b4acd53b58ab43ba84137425df0975f70ee599a0ac68abc92ea14acb7722e8caaa4d368d965513044849b5ac5db810c20e670ca176516ac0a5065d3496d35e6814264c182b4c1896a11d25d8a28a2b4e6eb882032e43414a6c1a8d656887338630040501525251867609554cfb4e042d9bd8344c581dda344cfbeed4b276ef7077e836c5451a1df41acb108d15be70c20b4343a6ada7bd50932bb29002136e0c0d99ae3a24a58b7f9d12fb48e1799bc00e67881166023158b0c20cdae0449830a699f662caed22c41044f08eb56874fc7c3e4a3a00e9f89245bbdf8745379e88b743fc105c8a174208c8f3ed8264bbdc082ea6db2f1ddfbd21435187ba2c1124414289286f489a614ac9f1cef5fd578855245e7e4a3ae57723221f2f9f0aaacfc73ba3b69bcfca188e4befd8abdaa15ace5049bb47a1bceea0bc8ef193f72d4791cc7edee1e10cea382b4a2ab269f49ca4b95b114b8d9e75df0e1db7acaeeaf142d1be1de461a44cb48eef611570ef355cdacf7069ab57f5a73afcf636c73b407a8f5120fd6ca67a767d37a0ab71f607c7a5bd45bf3fb66e8d5c3b8d8b6d98f2eba3bbc040c175572ac53bd6e3af317e71e19debf1dd5546c74f2db2f40dbd292da4e809b5909276808bf0d7af31521710f257bdb83c015c29c87355619df878a536c0c95fa9ab0a97e29570b2928af0d050c30b0d0df54fed723494d8a58a917d238c9695893ce9876d795d76505bf17ad88ed7e603cf3da1f644d42cda5d553a5e555e0fdcf157154d74fc65857760c7cf07f9411153121fcb140598b0bf96f4b545497c92fca6a86c21c91a813561df94164cf4a6b418ea22b0e561cb2af48515221f7f75813cf3f19717c8f34cf1d717c8237afca5c6ebe17afcac4e920741190d8224b48892e49f894d9392647dc075289e69fecf24a910da2fda8140095d3df684fc164651876a9210d949d663c3263d603bc9aa426cd5890dd306f6d8dcaf7b18b6469d78a6594955051a85692c537830617762d4061314cf845dca353434945527ac3061c270ef56c4fbc36810de2f30bd3d842a9464eb0af37d3ed47b0698fbd7048c91cabf6749591dde9252ce8ae2bc2c2253211f7d805e988eaf2a4e8cf475647ec27cbf56c8ab5a1ca167b8047fad10f8bdf2e6fee0ba5cbae07b5fc0fd94f0c1c3ebb03aac0e1fe4aae0617508e1250e972abe224aba32a6faab4e8a7fcd4d8a30a82ead8ac3a5aac66b7feceb48d909931f57088fdee30a7915e88561b93f16c5ef3931573eae90ea7bb9421e0f5c92561a08ecb425340d8779b2cbfbb042be3faecbebc03b1c972e2c6eb4d1ebc58ce6617f94b80bd7f14024eaf472174ec208231401d91ffbf9aa856c49d10fe6e42bdcd668851b6d7831038c2cb00aa4b2861a5cc6d082afb88186172d60bc2a6098fce0635ee15e8d6fdf4a20ccc925be82db4f66b831f6abdda94608a168b1ccf5c157401849456403bd30dda9768c8c040e3efac0c30ccf9ae275e898c697ee826cca0544c418df93efc9c7cc4430cb17c5b01713ed5171c17c527628de6d4e438ef1a295aa621a57f076d8cb3fba3556892b783bbcc95636eeaf9557ccf5a1852e294b83a28ae2c0ced8b5f85825566d46b28e722312690d9798711e433920dafa888abe51eb5181d77807fe22e24de1cfcd87ebd5022eabf3d2e6a325734c862eebcce6faac8706579b8f3cc71515b1e788aff77706a7754c3408a57c7c9c022e763b689d0ffd2c23f587a9ac6fe243ffbcf3814014ccf5c13b7cb852e0ba1d9aef83772a8b639dbd6a8c40565f425d593e4eae5b75df0e9615ad0c4bdc4eeb079990eaabe7a8921a37c31673d5667040862e25d0820c30b0d084a9ab691e8318b2a8a089299a08b305137f8fd0ccbcb3958cf0d5ae8607dee17e0fb2a9e6ce08dd05a1c209aa60020ea2e8620d53c735db800c68b8410f9e30832a84316960085c5821055daa904508a6c58296e6c7223463c107cdbf200f2cc30cc268610853f842858937d53ddcc35cdf9481bb7a5358c8b2a58bdd31d11a9ea5b4a4b42af8285fd2f8c348b7e132ff3df927394af9a00fbfefdb7a2eedb330230b6960e1072d6910ec78585595ac58c658174e89f36990f2f9f151aeaece5cddea2a42a6914be7fa38042c5c6901f4a6be80e93922f2782ebaf1b13a22e1ad1775964b95e4a0eef64cb4e677a866c90f8c14c85470af5f10afdf15d8f8a2c5972aaec0451a793d93a3e635a4eb38cdcd8fe8dc45d73e45a3774e4b73b7e1e20a56fa5a1abec60a591a1ec747c3adc8f651ed9868d57684bb48aba4598be0a855f4d1b5986fb4c3f17d034897790fcf4a13d198efe680d724d1636a0f2c3851b50531cf5d44bba016bdda82d03e8a7977b528a69264ced58e7404c763be1dd491646a9118eedb413dbaa8c3f12ae672fbe135e91cedb8cfda030b8eab4cb48ef9e808e931f5877499fa63738e89d6dc47b41355265a93ea72a9e69acdf737b48b4d73b81979e7ce5b119b1ab95453afa32e97681eb944533bd9bdce91e3d973d04ea8b3cfb715195dfbd428ec2c888ebb96a44530be2d886e74ee1aec1cb55ba233ce82189daba2dac907c1cebac825eda3ba5c9aa933979f790f6774a676af334dcbb46797d77ed1a0d75976a682231979cdfd35f751fd999554e48d6a97f5fc972fad436fea0b183d591bd19f79ec93b72259739fc7303a392a7ac7ae30a5b1cf11ed827af4e51d1c97f9320fce473235266647d78e439775b4ed23ecd54514ca6bee712bc2cd1d3b56bb79eea2b71d59eeb97335de867055f4118db9463badb5c3adc8e831b5077294db129d2b32aa1a97b6b7a8feccbf4eab4cb49e15fb726dd1aea6b78798680de515c9d1ef36aca161c62e3c7d50211f9fdc8523e2837a318fcd67f3700302d573be770503bca38076236af1a58b56a27c948f227f9252a28c92694f7b4685c62a31466bfb61fbbd1e18a9f04e95102c0ff79888cb419e788575e4a316ce041ca3e18508e649b24296e7ad0ef7c5a4c450e1a2f00e362feb434073f9282bc40a2e78877f31c149d192e6dd4341cbee5d99ef9e161d7ba96fecd6e60364e43d6b894bdcadcf47b32fef9066cd6af7fa6d3e3458f5c125ee136ada630d8a767f70983614e55485d35ebd632fddb6c155adb2623848a5657dad587c7c480aef78b92ef6c25ed80b7b612f5d30f0c5e6653ca254d5e6433f5f1667b40275ac442e60897b77d18a976a42818bc7ba921abddcf210f1b2bfab5f0f63978606b77fdc7ce889783dcccb5b60856497bfc0ee58973ede5d3c37bce384c87c97c75a1dec32b728dc12f6497777c01e7934f61b7434761fa3c69e319177ccb4cf8c3bf65959578f1b7a5c56ccb22c8bb5c3b0ffcc7a8cbbe02c392aed41990b97e46fa05c06ebc84febaa825541854ab412ad5069f9688577acf3f8b87ccc12b5c454d4228211b7442e62172d2decf14dfa3a5a8956a215f14ac6447b87121b3bd0a8b15ab31de18e5528af1ff31e9ef993c23bd9e5df142a51204f1c823ab2b62104efbcdacd3feef213fba90faaf50dae872b8d532c1aa5605670496af14ab4c23af22c05777dc773b22abc638577722e2f2877d8bcbec175cb658848d06bee3f710a97e4835e4729fb64cb9fde1003b824e74ad13c6fe192bc0fca29d6915c34cd3bf6f2aa3c2a5c92cfe89b3254eb50cbf7401eb47bcd63d6285c92d87fd2711ee534c43bbffc93327a77e9d0f15d1ddfcd07e73d4c69b4225ee1927cdca2401e22a08efcc561f535ee78cebb688509ec5178e7466e476c8ebdbab9fce90dad906df96b3362730ccaebac76da716cf3a0db3994c3a1242a7f436d68c4e2e33a68c7d1d0ee55d1f23968a7cdd0365a5e863ab170d0181af49aab4070499e082845b5e37af3d2f23f401e1f553256bb77a5eeb8beb812975eecc283016086ea73695402f2e87875ed0b79683e6d74d0b73af03431bb3a1dd6908c2a5dba7b5a5256acb0d1d59f15bca38026e3046e6c19a32b6d79672f8e4bf2dc651e2dcadda30ad75525b854dda241d3a26fab43acbf3ff818a112417f58581e0eea54aff1c2c9d0951abafabb2e0b4219ba94833c40a04ef59a9aaa92b10295defe62acdea5cde070691f5dba7ab6d9adbf27a50e333232323215caeb99badb1069a5e17fac8b625c434a4bc47177ba5ab8aa458b96596aa845dbd24b4ded556920dd01e98e898f264189fd0e34eaf7ce1d1ed9fe2a94d7964883b4abc2a50a892378677bf559554c705d4913d1b7854bd581409e97629deaafa9e12a589d4dc06d7fef8b94aefedce09d57f76f8dc706efc457e72e78e709b1bcb3d5d8bdbbf7a5460b8eade8aa7ac7036685a974556d099ed78c2c56c6b85206176b46c3eadab605e1615ad66e3d9ae0aa60456f0a8d2f9d80ae3655852a4cdd5ba3abcf4b8396ecea7aa54657bf361f5831b04f46c85b3ba17e327f5f56c8767596b2bb3bfae3a15fc5000edabdc6f1b75d54bb6262be292a4ca9debd2f5ad0d80226c53bdd7619a30a17dee95e155dbd5202ea54af5e15bc8303c70c97e4398a25c747d4c9ab2ea241afb77a44152520cfb53af0d51b564f027972d4bdaa63e0a242c0575f1f55fde12c23ce61c37cdab9aea6b7e6cb3dcf244a91e5a9813af34d2849a127909eef160b3d2f30ddb2d1d38db5ac47a7d046ef1abda92950e9f9b62b46edd5c825eb536a16ed78f0b92a0f123e962b2b11a948d5d7635fb5136a4bf399df2b6626258536baf3a1e7a50f73679e013fbc06f2c4d579d76aa75d56ed66b8bdeaecc275353dcfa8de59f3fa16ab9fcbdd72f96185c09e078277e0e735ad1a3feb7233bc73bda136cce5b91900f3858c28ba4030cd9f184c5def6a4afd525d600af2bc3458872b987acd5ba3f9184c35c7008d96fdbe301438edddfb82bdb3b1dec590e063cbf705ea6c3edc1788d5ae86fbd2fcbe547f6aac90d7400f4cbcf5ee79a1b1c72fbc639dd5582146b0c7eb96c6250b82f1c1642ab74e4609aaf49241058ceede4c069529b3f73536fd62fa1da7f3d17b6d7976adf6b97ae0e21fc7b73d203fe4e1b891e1151ef6b2709b92821a8dfdd7e71bb269a3af77311dd6ef6f7990803ad7dfdfe7c31e76cb02d2b1797b401a09c8edc31ef677cbc222dc1e122b840aef6c5f7f56962c4f10a873fd7af7aaf4f5ac4891814b5fef560d7d6d1726ac24f488cd07ab1880311a97aecb2090e77a5990be38c81bc33ead77ab465fe723b142605f67c23bf00ba6af1216edd767ae9f77e0afeb4078c7faf50bf268f5fae260f5ea7cf4a5435f5f1f57fd7957aa37e6fef2f26490f2c2a5e70f98460ba8a337e5a504516eca8b1355f58685030c97a80a58944216c3656a4b5f16dca6ced072c60dfa4d4d5bfa56c069bda93362a0cd0cbbac4a46c86f3751c4d28547cdea3c9e9e0b4bf5a8f15183f31a9cfbe8f981015c52c2a80a89420bc6e08428822086a123f0208423aca1095b48c3175500c30b3830d8a00aa9790d4e0de4e981151955c4d8c20426c6d0010ab64b14ac5843ca165174e1054dc0e10b6df43840cf0f9b62004fcd3b831626a42883146f30b185430110c06c69c10f90600230b42fa46282d4d4d4f000e4383517e4f1f143cd4b34bda933a8d474b96020d3cba3adcefb7eb43c40de5e88eb9d0f3a768cde20d9517b40dca6bca045c7f4a6d400a3776303d769fd348e7776acbfd7745605c2a57726413a08971e0f5c9a81c83a108b06b1de3be4d158e7fd5d66cb0db490ea32458a1a260ef224800a2c608218274802196798acd41758d0a3b6525e08425b6dfdbcc3d3d64b90279aac03a91d93205a15b8ed4e6badc43aef92fae0a8b690a78675defb1ab80e483f2041788ae95d639ecbf43ec33c9b7aa61b32706b80de5414cee81ebda92880d15d4d775abffab3298b251932568fcf22b239b072858b2cd0092131fe5b7ca421afdfb95faceab28ee4f8451b3918cac1941c5481587c69e6a45cb7e2eb4e6abdfdb688a5fa9aa2096707c0b768738fe6ef5803704d1b5ce703b30f3d15e370896bb8c49f8155fb4d10b8f522840f0ce09d2e0810cc419adfad9786e7d7401e2259aaacceca9a2babb35cacce76e4212ebdfd1219ba31d4f0176f3e5c06371f19203c8cb80ac8e6c3830f5c82b3b7e6f5b0e35dd57b3d89f56ed91ff09dacb1d91eb2ef492b04fb1e67855cdf07f1e17f8f0af3f8c03af038f0c0fde86e7805c23b9687f3a18a862f4686e60c60800f0cf0a18701b08d1c3a5e1b9515331abd2b6d343c0d0e1cef611f98671980e3f0d38713d59907e1f12e4837009d8e76bccdc69ac7cb1592f3f8eaf5b0e3f117efe090fec7d7ac909bc7da31f1a1e3817029c8157808b2656dac338fdaf1e81c5a647fc0efa00d783bc0e35020b8044fa2427009fe7408d6e99b8a81fd015f437fd81ff02f0c57f3c8a58a1afa523ed0e488d1879d9ac7ef5657bf21c8e3e3d0a6ce2fe4a1e77ff41aba5cd2f1f6418964696375b67b50225f0cadce76a544be98b23adb93524ae48b2aabb3cdb4ab691db4e3a1de2a343c0dcd41bbab672810e6b9825081dbb66470c454959614972e6f0b97525c1ad5a7854bf043dc7bf7b4f044d3fb12e9f3c2251f80f8e08395d5d92babb3fd05175f64d1a1599b8f95dbac5bf547f45867faa1c12538a988c62d5915a8ba1138df97e765b9343c1043f00e067e108288243ef8e043962c59b4644965e1122feb9decfdf6949a7c27e30ab1daa7ba455f6f34029d9a774b5ac532e5708861c0e9d0b1cbeaac97eb0bb7cb43244b69772c9fa843f770093e2d50079ee3b42c172dcbe57a5a20cf9aba7b4c68c8a5e14b35d402799e97abba16eb9d0ede888061fee705f2bc21a8037f55b5e374b4553b1ddd3d2f6dfd3d3cad67f42ddc1fd62f1af7872557c73ac461418eb6beb5f5ee4d69185f9775aa2765884bf00ca83efc26085cf7bc34fc4363280dde5983773a205e78e70bef74ef8a1abcf3c0f04e07bb74f7b4343c10de19823c44bef0b23afb6575b6ab213556677b210f912fc0acce76f7ac441eeac743bd3d84246a0757ced2f19a0bb818e5bdb142b8e179a86e1b455890ea4d69014c775ca5e31f98f8a725f2948e3cd4f1b5d1b17a57f3974a40babbfaf57209b3ac34cae7fadc3eb74afa617b3b91ededa8d668f7d60e699784eba79db3ef06ad4f8a6a48836467d631da311a6dbdabdad534bf80b9e0baa725fe6981520b67f1c25c1f93046f5dca7bf55d216cb22225c173649d08d9aa281497498a14286eda2d4017d3f2500031ed0ea0933180fc4b0317b924dfd530113899802937597559abe89aa076fd319462ae8f6ec1ccacacf9d17bc30e28307e3fb342def739967bdb037f7fc45734d24b63ea2488db1d62bf3a037972ac4e3c0f3c7e747c577343c777dc8e9d59c853823af2dabb6bbee33afbeece6ea9e3d11d8f9658b65f1d5f823c42401df96bd68eebae940901afab4bed7234ec5284368b5e9dd91f90db12fc45b52dc15bf4dab8a52dc12f93215c733373053a6d7579082e4921b82461c0c1f32faeb698cbf3ad80f3c246efa530d45b83b8777f94e65e0a77f39ce0362586351e16eefd034d823009f2a54910687d618422fb075e835a8cd6af73f5782d6281b3be18bd3a32cf65e20b0a14d955fd8997f5e29804ebe50d759bea960b4a0760c090e28a176082f00253c771eff45e882090279a505bac010540988118be68d962da6f077824c40d0d0d3161f282bf5156fefac4ca0fbe6725c2b5ae69d10a9cfc96de4f7c69969455ecddaa4a2ac2b242613e632e57d59728f707bff8601262b42a29adcb8a914bd56e65c828a5752b5ad2925ad462ac62b0c38caa0b36d2a8e8ee0ff8e48b4a90916baaaa9232a311420863acc860c9b1763146b833a62184f292259410f2c65db8bc31c68a12d9ae2c18b904b92e0ddf7b6368f1bdf79e7c516b182b2cb082bb960f1d63ac2a58c52ac60857eec68541600823c752325b34c608258c10c208ab5781b163589694325651c6186524638e163ed227afe33e30eb13b935dee1b8bc4f8ce5624694d656efa27c35baa24e5e5bd62fca6cf47c1aa4576a0a34bae2ca71293e42ab6a5c8a9625659cd15ef5a29ce9a8b14eecb4bec5030c60f39a967ddbae8d3e49b958550b577bd60c6294912debdbe1b494f2599694324629659492cee59dab76f1baa0aca28c31cac805c6a841def68a89bf62ec8df1bdf7208c31c2f736d66e26d2ceaa5db4ac85f1c907237cf0bdf7de8b0f3ee171844771cc1acd67e61899f98dc1cc8f277cfcdee3faea0f277b102bd698082e5d8f57a43db0989fd6e6332577fea3d8b5cf6af3d1a2fcbb2c6d93efe1aa9acf828134a3cb1c11d99e13d2cd4733230bd47893f2da18830497b0f3a53cbfa23db0e0e6b5f954d2da8040b5843c17eb3c8c6a5adc7c64855dd4369ad19b7a02d79b7a42961ee36d4144c8c1dacdcc58d540218dde9419a99aded413acf44cf3767109153766b9b4b046be5eb54690fcd0d05090841042f80ee163e6472805263ec44c1943064c7c3823882377111e1a1a1a0a622f6f0a4c8234bc6010ec2238b420830a2641fa67bc3f7edfe6f707253ec2f86d187d62ac4c7c889932460cfaa1f83d12cce51d6df49e849b0fe4d2e3c750c8ec15f6a8d517951e68093577a896f261cfb0778488223eb8146fe9d0b1864bf117c5e1523c973afe79e1ae775ac773cc7352028a9bde14af00eff1daa9ca1ed80935bffae585dbf868d18b4b40a40c946045196d9031c688ebed66aeeddaf71aef447e35f277b33e5fddc866bc89fd49faa2c0c16dfbd1edf704eec7baecee3dcf3b58369af2d111f6dde6ab4470e9c5b66a0f945544e1e74c0d0eeff046694694ef0f0addcc841acedf13b867c9c3eb00848720bc233aec5e776f8ab743565165a8d1dd7d78195f1ade870ebb65356e3ef147648c97dfa846239764ccba6795acda05b1acdda2b13ee0f63020cca72defc817b5ea917744af6a07e5e6f324adaaaa92af1e379f6a4b0f8c01a82da8942af404c2508f92902984666884410009831440304020140b87042249d3851f14000eaeb64e549fc9c3200862c818438c2106c000000008008c08400280909472ec3dcb0541a351c5e9f1f382433c8cfd52287d14e469b0231421427113060c2e53664d48af2ad3f15df08fb84562fd71a9ea695837f376dd5b9adcb0b9d36143519f1bee42400d232ac2fabe144c076cd273b3d7cff872378ddd8b4676d160b86f163bd3e06e1abc59b372c4bf20a0cc8e34e0bb6769d0c044285319e111b701663bdf923f48cab9c96b6415a8f8f7c41fed1d2c8d4f47d30013eb678ae856302085ae753c009522b3b211b8f6ae2a3f62fe5483806d8d0bdcfa8533c66d6da1171899e8abe5f937751f26d7a992e0ac972a2d02a941a24d3f0ead71b9603033ff775d4953942469ba9d9e41a6e3eb5294c71838800ca3dbc952307b2b5d89a7f3308e8b19c2db6cc4673d91ebd9019e3e86d1d26fa126ac9c25746eb14d7b06239a7be84bdd509d3272fb692369ec6bcef5679981a27f78b4a109e8766474f52eb67cd1908eb84d3aff3b81cecb1b3ee5d644e47bd9c5662ba899ed4faa8a2054ab0d39b951ce7ef5ff64273fcf46cc5ba1ddc0cd3920aac7060527a3affadf7c18d0753347a36a1d6f1d7d5a056a5680e01e537225dcbb3c6341d2d7ac305916587ecbf3ee12aef9ee4c337750b1c5e2d1867f6b0a8c2a7c58d5acf1b2e6aa95403cc5b41f4fabaa3e080418765dc8ba44206bafbebd4d616f39df4fc18f4de9bc9ec0654b2acf24e1c97ee7c2f2634eaeb15aa0b16eb35c3e7e1b02a59fb7b2a8bc227bf2fd3f68765be8722b5bb3e41404dbc9267ed1b32acb712516b32394f0eacf76f4addee3a5c3858e18dcd886b7ffb370a306a488fc5b8ebb418bae1fcc6d2736a904ecdd6b1bb22777eda81047ef954d5b988c00185ada35895fbd5580b1f0b8a0a5eeda3eb1cc38bca304fa740ae8256f29e7116c8e0a8c908fec61c67ad0a2e3be6fa78ad297c58f0dd2f18d42583601a9297d08a15450107b46e449f3e7c57f2d4e98babe3444c93ce3e9aa8e2f2f17f4ec102fa184544ccba244dcba90d7dc514af4281e2494f38ae5dbf2e4a94dc26468a1dda71112927662d9c4bbc7bb001c8946675dfbc07160f15c699ec722b9e71414b3f9d706da490f8fd71883310926dfd6ace1dfd3718b58c953dc35646edec366e34ec2d647a0c0417993a22feaebb01a041f7c1594c84d8f6eb93307f2106172c6a9586095387e74fc0d9b74ea6c68657f8fd379e1b8140a4aaaab7c397f0abf146a128b9e611abcfce2efe680f4b625a2eab5d63d52f0a6a7beb215454606815deac54054646e68ede8833c36bfbbc61179d6c8ce4a150a4da2a9a47b70300bae52bb6a41c420508dcdf84a79a497d6d59d36affcedc07d7c9f1702d0d3e7557929a67f208a2f230e688669621a16a9e347fe0a54f70d08e19c6f7e7f9f364c472e7a2ca943a58f899d39b5f35c3eb1a15f27cc7837562e5ed2aaeb6b83953469a7227a380af515cbde27224d94acdeb0276b37c26f92a1da63deb47138f2705292857d7c7c2f24b4443a15da801744ca998592890973c06e3c25b34603d8f60bb60a06d03aa8845b24c2befc46274c0157c657452d42cfe80debc9bd6fdc2ca095740b856255c3d9dbfe9b8666c4f7d9d56449bffc8eea2234f10cfa0213ac88ce79b55bdcd751f5d1c65ebeccc0bf32e8d97ea6d68cb9d0049d8219c3bd41cce50131c0f2008e99d84b34dc5a9e017d068bc11b0b4900a028346e0a3b1a6ddac101d02033e20496d4dc2ced94b8c078ccb38b1f97b5708edf8109b505538f1983a47e86dd61f5353869d30e07577064d2753178cbce5408ba847831dcca26162fa41632d60366ef9ee4a708790812a08d853ccd41b52661b8bccff02392830f577b74e0c2a2ee3be8b0f0ee1e814246cd4d3105ae048560ed3b841aa93b6374cc96149ebb57b4c55a8ef5359ec2d3640959ab63241272241c8baac40134cf1d716e2e245f2cf7ccc0cf24c041725a2ebcd1c042b006d4a3148a9689f3b159236e7cfce2eac8cbaa39a69772e6d4e8a97f54a9b56ce5a964e8b1d004e69f8d0569264363e1992a2404d0e218ae041995676a4858bd1945a1dbe14e8150f4bb60afaee924f9869045833a85b7528c56b68964dcd15529445c0a0f9495091a063d53a27b44ce98266d9351afda161c13e4920ec76d6ba60a74a95fe73b0b6bb38dcb65fe965725ba1c8d7fd874ab67c746f7e8222e9ec17abb20baf4f89c9754caa5c61d8348345bcd04e10c4888b5c1bcc8b8e40834501cc4bf8398f8a866cadadc6efdb706535954d848e4f330998850b8456fdca15db0fc734c532ad8143cfa565c7b96d4a6e22b9ba929e3dffdaae2eff1c917c7fa4c6865ebb39eb311b6486e6243d06e1b35af773a2cb3d08e549caa243316e12e28357ba1c8c3cf77c0cd668b3ac2590397ba22e1422c8c64f487502b638b0701d519a8dadb4040b4ea29b4b0f775c44b8bbe55a26b60fc4a2c1c69b3f8bff0d80e3536e77fc59d0fdc45ef520e4fafaca1586e23115600b2be3d3b564dfbf7c2d3584f088d5027d55937929e3b55ea62a2f433aebc0186f6e03526da4736acfca27221e22d8c8e0aadbed1be86aaca35b2d6cda4a971ab54747ad843e0a66c211460a8f25ace08a6cc726f33f0099c3ad07334db2169f3d66b1c18966e03686d63c244571f518e1a09415337b661d2810fde2865cd55aea3f65620ea8c329e3434cf1189d143a8ce6b93106d9f353b1b1976bd0dab2961928e8487baacc5af3ba651f45dfe8a1366a7d99f5175d920b6c7c3cf9e8240841e2a005c0f5331a1639b9e8d8e4ef6f1079ba28b23a6a2ecf170807051fb60bc0fd6eb2239a4e036b7bb4cd48b48e93bba09b6283a029b2ae8fa7bb21e30d8a21183e39aeb1716fab7c7aeab3dcaf6de28c025f7dc0f454a8eabaf88c7fb04a49d82e9d8e8b4317533598227a8f3c6e1ead44ad3175bbd13751bfe61f42a52c5636fb0a02fd9593e310a2e86df1caeec95bdf51a900abb66627a907d5d6cb0ba1075cb7c3a41e9a7b75c7686f8677fbffc53bbc93cef61acda432968a51d12ebf776c883528f10b585e08f3cedb54c2f81fb435bb8725beace73cb739345dca4d0562f98055e2e77782b28221be11b302f3939d06d479b9252c9c9715414fe4dcba9493393aa9b1e4c2a35c1949e1ee9c4708f02b1e03cad2c05d44f37319631b41bd592a35b842b994e6aaecad92319a4f4a8bf38bf4f177ccadfc4dcf44f236740de984b39558fb183cbf553cc8c509eb1810bc0f637eb7f74b621797cda3605e983b2dfacf8e81b02574eee443d7b253c505175e8a3302332894a313fb92aa399c0dc7419d06a86e59af44958d35f1252fa73dcf88f6473505244d5b041f96c70f00da24ac3d3fddd0a58417f7941f28221a4189dfe8c94849d844f64626775acc77aadd2e869d4d5718ddd0dbc58d436aa2a972a810f32410269b005d1123c1249deebd46e5fddaaea4a4878759a5bedd238ea6e63b919e2df4ede9d288849aa8a0eee96765f626b2b4e3dfee6fe8e8f9c56bcf3a9bf00c8e75085e08b1bf3a80a8e2ba4cea99debc56127a95bcb50939107009d96c4f705ef37c73686e9ef080f24009326cbbdff51d9838b1ff31cad1642bfce9e4a65129e53bce788147524569be3e7b16c0ad75667eaccd842b8903cb78a9d014f941904685686571d4a896eafbaea6ca657436a40825b000b9c6460887e04231c84ed182b86e04e60bc6f14049b46122268d42849b234e731f668823d74f113f5067f5579f9d51c899b2738a75f7677ecf1194a075bb96bfa356b88fff6c4db399bc18178550584342a550ee07c062ec8907a1422c9dc4826124e57fb816bcdd4c7aa5925194ea7a50e34d4844e174ad4f7f97401d049cfd7fc44d3d6b609025e01376559c3549f6dfa2b9a3c72d36a55b764310605c7e7c740c98daf76463388b921d64701ca08a381fe71d202f5639af9fbb4934babeacb13894b3ecc1ec612abf95107f5eecdf9f2478be33d110baa86b23be90113eab207aef6e932981133d91d2617f5c110c4aecfb794b9b5965910c6e3fad404ebf1f045981e0495e892a030919e0d00d9aeef4120f0b82bfb33afc4e2058f93698c689b73eeecbc6433b77377b2c11e7347b0e4752ae6db674afbab88adbd39c201412030860017dbb6b8d07508d261c791702d5112c9d8edc95720bd9db88e25f2ecaf71f890da92b6be4dfec419a455cd0298350dcf4ef5f42b2a3d749e17667e77f7e8e687140d83f7ac00ea83b7dcc5e47b50b39ad32485fd6deaf9702cbb2210fd63c4a633ba180140c0036643facde3d260c287747236a6deee4556b86e537097a0b864d03b64bbc0024bc146165242d47240ba9860c29a0e2420b52a985ac2e4c3a330f5bfee633846fd91f96147e23dc4b2eb853ca9f823c78d1a77f7e5796660f88016f719a357e91cb080244a89ddcaac5d50cea5c1a98d8324754f01b5e193a3665b6adf93f99993c454003f58aebd8ab158a27f269a9a0042b0814a4bbdd0a7e2f40a87f5080a6e68501512c00062283ec98cf0c0b14a31864fdaf82dbcc4877d9f5dd2673c058f185f860c5af810b2e05c100e4bf3482008a01f0818ded03501ac82b8a0380a46551f0cf22a074428d36e702b71c5a7eef46649443fd0d6500e75a685b009a5955c0ed79a4fdffac95778a80325b6f69c251d6e9050b8e02a9369884249b31b836748c4bea9aaf56cb35b6f5e9c70f92971fc84fa8a5d118cc4d4af0dbacae88d060df185391851a62798bfb72f82e4090266574d1621e70ea80384333b603cff977b924addff4b7e45b7059bed720f9997acc74da83a4d2ea1e049052c16b05b5e27de83d21676000a80d47a6f1b02abc5aea2b858f451c7996fa2f1f198e8c9489d49064b6a960f0517163f5d4906d1e10d79191fbcee8265830d9f19917475dc9cfd3f6f8343cdc830f23fa6bbab11dec5e2267c0f416f9577f4452daaec76b7b9d497ead3b65133c2771f1912dd9c4a2c15055042c761c6d9d388f4a50f84432da7cca7d7d4a03026d5f063ab4162aafdac1236d85c79d405e941c6a254dc746dc9f8c6a7cb56d20138237f491ea380147ea60c8e4eefca365ad0395b2180ea821a9d527fe694b1117381a2b7211227b5c1da64f4b04c317aa1c8de20dcb7364d77d8afe3042643ed96e8aedaa483ea689bf52eb2a19316d021518d8b4b10f30ba925749c6ebaca5b6830e9a32063b8ea1ea8b023ceb23232ed9aef7b7d02884967fd09edc127d291853f2549565035ad10c59620ff46d42c2f7cdbbd9628b4282b071203b217ce39ec36f358c133d254c0ded8dd1458a31cedbade2e48e9d5d18b441434bfa3825149ec4140e9fb9a517703ac675fc2c8ff7c55cfce1efdf4bfd4eddb20b1a95bfa76f6936b34a0ec23734a53d414e46e2f41c695c1200afc4c154d6ac14a6ad6ff57e62ab2a08f7c2572042bf90d224e0a0aa8cef28dbcdc07c11d9e7e1c1815cfa6e5849198025018ab5a0c17c9f7fa846438572ddda798e3011d83503c66d6f4706c0479f2dede0645cfce98641b042d4d8652b18a6781503d16d7ca6300db0247f88e5b62d30d1a9e28b8a0a1778e4cd00bc878e96cb233b32b2c97f2decc2a98b30d1d21bc5a4025d367b92d20d018e94d6e6b1668304e5035555c5866ca18226d43691b808cc4fa46da6a77f29cecf64ac1139a30396336c49e836f56386277d1c714456542a968d72ec2eab6d7aed3a3ede782ccea736669f4d993c1ca287756099b764952c147d0b59ea6031afb4bec678a122b7567c63120a397166f2548a367ea665448e8f69abba9f7bd8efa83a0fcf25cd2e9956434c700ed3d0b624773f319dc39ec4c95537c0dfd2e2c919d4f6fb18b832269cdcbe8e2a0943121a35f8644342e0047926c1358703382f3f90d4391273611f7296da4684e929491ef47d8469028568576251b0092dde62f4025c3c3c18255c2cac8b1b2882f3ccedcc4d61dfed7b353a3513b92ebf8853a4132fa4b76eff1e37f240d842e46b5bc9ad60efa86f0e82f7b9c7f3b1099560d971e33e52a0fe720167fb8e888b77677885742d4fd7c0a9b69b1d6e8b718f3437431259a873cbe57fcb6760e1789997efcc143bd0aa33a8493f80b6839a7495b24663929d2c2c04b3e643471bef21dbb2951629f20fad87761d7248973db0a186716ea443d4ac6d340d79a47c10552e296c308e24b3170498b17503df71d07e31dec7c75279070fc712fdff4a07d293f5dab21281d8c244bae2824822d090bad070dc9a6cd852a8373260d046cd66dd288e8164a2bdae11cf709f9147559e67cd43a0bf794a2fd829d883f7bc2140f30492cae6254a7571d8ab375a764af2cbca745bfc651c679e76d5c6adbd221dfc1cac6e53d9af008ab63893aa9f88051a9516e711a853ee2593f1cdaeebc0133cc3ca29786c5f43fdb248fa7a602b6cd43db61927f8d985e089a91e770278e6d400c645f27277774a80f7bb39c8af7569ac747b0073384ffebf7dc1925f9b9f419d18dcebe70d7f41bd9a56a158ca136cae8a96bfeb71314b15f97ce76c483629988b541e3c04b19f620bb00af8803faa4aeb219aa293825874f8de6a1797d4a106a77f46b47e49f4e5150fa9998ad247ef9365df810b3a91821aa07f52db590560c258d8b1b06dab69cdcfe25ef63876dc02de20e618111772d8b53de6c5ffc7a40f68e5ce4458731eb38c38d075d14828a9386559a2b3d94d520fb588c1d45034071be1a3bc9ac7ec32e98ffa4d60688cc3df0522a99a4f839c0aa69a29497fd8cd429b9ff97f338a1d78b6d671efa2cfc4da8888be7657c5d75fd64b0d615ca0534548f8b653cbc2850800761777b0ccc95ead11e00b55f41721872bbd05ffc03e56e2d4c5577a63649de687258ac5b1e07a3e62c4b12e837761102b4afb4ef8d40a9f1b20f157898290a75ea6a44913850e31fe91ab1bda050aa47c40f2026bc0582c2071a20b5608be5636e0ad66043806e5b04eedb2f70a34d02f4c0f6222be97ab59e2234019dc2600d096e9eb3b9afe714d568c250af584604025122c4642e9744e83a45f6f8a07d98c5579703d851ff570ff2ba2f81afc7fe059cd441ddaaca94a5ef980d2241fa57c9a913101dbf4af304a4783859343440e5e36fca48d01c7d2beb52890e6fe3de68b09de3632a5f7bd5a43246346becb3d378a312e3c7f3285a4b8607118e9267b6ec5569520cd8ec47d701634afb43aa12e869f9d970a34babed2acc3b8031abced39cbd880b9c29ba5f68122253e3cf9a6cd1b67fc447ea40152388c804c9d22fab77d97c7c6008442ce7ed72044e27d2b94ab28728e6ef4629002ce09a28a8a88a8bb505e30c08e981294ff1891195d42ad91cf1e70e1ef4f023ea9b662e373e825214f6801ed6c55a58f7897046b0530c0b4f11f333da8d687f0443585a1b68c0b0017f7dde66a6b1f5aced71effbb656d867da74974d806e9ff4eaafc4713ac797198759b04756211bd68c005166c54361b9e64ba7a98892dcd83c049a48618654253553d2b940d13072fae113dd13023be75c5905683e455ab56838f8f614caad13e308debd8879cc83aadad422b925ed77d74664c2a3956d52c4aaef10345e8f17e86b0759ffb7edc8bdd1ba3a6193007e774f374874a79e8e27b6b7b5e0c7a4df3aea0dc3aeb42b6a77407bb80ec09994faecb90b6efbc62a2101a9923bd868f606b6d3e0f5053b4957bb25e28d5dbc3e82f93bc107cb2faffbb184595acd853e8e5ff2478555aa4fc83d19b9102e0b5a982be5547a3f6254e0ab2cedee911ae08ca28a5b0337a40fb39c684ef3ceb40e3979d2179c97946c47d60afb1ef7322b018f2f94b310fc59617a3a0a1527df2b856eb5cd8171c58b911399b73c01064de891a42f71cfcc702d0d84b61f5f56585a826cabedb946b9136f0722cb22b5ac7ef71e4cc137a7b921a2c6a9c03e398ea8be62d17cc083c75af9b10374ec2c9c3344f76dee141d743362f410a61d529a0ad3fb1d318759d3704d713f3052ca9b57ffe17a60eec40c20659c6a62e4aaa55bdc50fba55bfdb3cc3b425887079c4954b7c50c6b0aa8a73daa0b68985ea8dec97f841f44742b46ef351161b712c73d192ecd3c12f7b5b7fda135b2dfb8544c7974660aa455522b463a6aaa2a448e4d51787d165753723d034aac44e18021f791eb46e5878dcda114397d242e2ec5c2351a6682ad05cc23cb63062daca02d4debd2b3712a8cd85f1e636882864027dca1251eba32b50e5c47d87a59cd5aeedc10852746f334e497369298e49ec9448b33d325261c584f8a0f0a9946888042738b2a8752de175109bec7e80648e70f35d7053e3c5cafb10279741505a716dfefbd0508f4bfda3613d61a92d98f7804c6410d490a42886695568444dea08962cf5ed97b9d6981f419fb9fa80b8470800372e200d0cbd6c7318e089314e03466dfb9882f83548c692cb94743cd5dd9ca0a2034da9770f4b13441abc9e78b93f6748b07a49159d52a2b9311830c8946c075b056aa6f1e93042b60fa5e5b23d76cb8c594432672f17a3e04942132d349ff08685793b942c4dccf8e261e83e8214a851b10f570350febe17874db56463c9adf6cca6c0d91599cc14705b123fac49adfaa631d6945dfbff1fc90498f4bdc5dc876d4537c9bab480d031ba0c77b99bfe2697db7ef99cf8e7b9d3ff8f8a327106a9bd1c9f63e7afe94a8e72b825aa01bd26d3ea5a7dcd0649892aa9e248a2f7720d00a3037e321d8d28ab7e480310a6b325338717a856f0d52098a84851a31d8c14591f97459c4399bf03876a16cee50339ae4cd26269096611ae39e6fd92f37c80277e472ac375c15d705a2c64e6cf4de405edd5d6b0675a0c13045664af9d4439c30c41399d14ea5c55ed6b6653b1337f066997285cf68fccc85e451e077cbb155ea65736f807821ddd856f388c6404c85a843004e57a9f2fc496fd30f290a8a550333b7c58faa1e1b17bf7b0e44bda01440ef3a260e32dff521dde4a7494174e8603406ea7cbae726a6916ac9b78fcecdc1631680b96d1331cf41517a3cb6b0b4a7750050e1dfb6c818e3e8c32128171510a23b8079168a476ec4f88c3a0d467e2c2566cc1b7b2c30da1e7c0f9b10c5d283cebc87ad74d2cb89640d3cb114595303c38b86476a3985bc2085eb1ace313f6169d6eac402cc40267ad5f0207522a7fabcc828959a0f2d778a6625651b16b24a8f5421a5f6e03d4af3ae8a59fa295d91422a71ffc5c963e338d1612e4ab8094c24ceff7bc09aefc4f3cf665e67d4f12301466af275a2b5ac4986f3674b0e6eae33f2de3cc8767ab8e3e35811a51f90f6bd7396b764ba09272fadbc7230009408c61ab656b7fa1917ab8c1aae87a21cb1c65ea82e8d3f818ae9132baf70f557d54961371a173f9352fb62a8fb70238ddd0e2c8af783bcd16ff9f954a7c08d869ff82199dcae1a6567297f171eb1397c23ae25211d3ddb5984938a6de5048c4beb20b29bb4adc43daa84ea0632365972dac30b2ac399a5a5b40a80b754755f3fe82e944d83b96ec20cf0f8a020e3fdd69b93e349e85748d541dad4d7d9ea020ecf30887b3e449abe8868e5a3a5ad9a22fb0756c066a55f1d8847f2b6c1d90cc373d576b13e93fa90a455d4f93962c558d659e249288bf56ae3515fd81184d54b92bf5f2cf1ed4f2b37ce7b83128ffc63aa66f1f49f8861f3c1d098f50e7544f26d98832b713d48787c377d353ff601ffcbed4194843c606007f17c99ab5d87191a63e3f64121484842415b9904c483b771c12b8959fba0576b5aa768e7731a754c55c5fc831a5b1c53d717550cd05531bb2483c0dbeb14bf7a446c34f3fdb02d7a4164322c58d938eb9fb5dbb125292e5f3bfab4719cc374a2c4e43750f56e434d6cc1f29454899f2886c9e591c274d2606f27874fcabe0ae0c10e94cc4e2ddd613b22ceb0ee0ee2784c5e03586148463ea042acf2f6c3292e2e7880ad1c41d871696112170d7608765a45140a61348e886734fa5f3ac0cba678021d5df8abbec1af943787d9d97cb0e7d3d05300c5e2f01f498c734fe276d31cde2fc6f7dd146e30b48fa77eb64bbc424035dac5e88ea0bf1b3fb4e141d34e3e0ea692f5108603814f5c169bc8e3cd80cc13622191635f782e49622a0bc840d08c5dd0dfed08456af4eaaad1c3ccebb686856d21f711ccd05b4393bd55e06274c88771cda4d767ec88010e802610b508f6244000160781e0416cacbef43afa4deb0f463ba8ca488685d513f02a5f6e82b0a90b0aa113595b16d2383f4824697fe4b904c9088b60a53fa6eb633f7664c6e8f0c7364913c1fd5127c34531cd2568effb23a8fc2d970b0219b3b01842306cac3e1f6c02bcff4a81704188786f646ba15c04d12dfb9afc2a202006d43415703fc40ffa4c9081852d1b5f3ddb896fc26a4609b5034e06c17bc541790b5f8b72e8a641ea41079cb919c41ac8ae69224146ef380121925c4f0cd3004e7a72bfdf626ba9ff8fb37f95a9675207e285f8ff555fae0c144b87f629a9f4f0e6f37c55cc6a16b3f5d6887d56775af57f127623eba821616e1eff7d76d2adc34e698aad2b71b0c632e2cfede482b8087582f1a89f50ddf988ca111caefa687e3d93f3c7e0bc7fb42658bc7af7e6158ef054104a1662ff80da11a2a3e1eddab4a11c952cdc17e7a9d9e76e3359d367827e3b531e2def25ee38f74d8f0429ab6d81a7c55168e8bfcbb06d68f5a079bed203bb43eebcab38365e1b0447082a048debbf3a8f7b42034603a00524097e6c678a00e4fab55d359dff0448323601f6bb1d258f4ec7d8adb0a50aac932c7339a184acac203e3d4939a76cef1df993e2a371d4630ce7d0907913a4f4dfd32c50d83fffc3f0b2b433717b53281690325c514ba95e1ab6b4f518ed98ed4495d9ef885d8ab59c903886288d0d618b983d40cde66e83bb3bd3023995c9768e7b4660e44f6c75e2aebb8fb522e1d1f6b604ecda2db8c6123004f72d1c2a4c74411704efb5b7d992c3b7b0a8e74264436a163c8e61d5aa5b3904ee8a7325f8163f19cdbed1d11a04b2ac22748f1856c12d070efaf2a84169a57cd2f53f8ffd20afcf408db01d2f1d5faf311bc628d2dfddd0de40cdcaf73b00ee78fcb0019c4277e366e69f1093a9ef803570467abc4defe741d69cf29498ee15414f12d480adf0f05a519f90567e738256941bfaff05d2d81516d2b9f27b7e031d05df5059481d2c8dbbe88c674a7e5b35d41529444a768e9d26012b0db47b45215003562474d327417944becae649d544746a3dc1312e878caab79ca3d07eee57ee290f7c655c683416f7526ae5e937cb45c708fa6b7eec099498093b6181f276b0d9063e4fd169b6032ac643d8647a22a918af6a582a1daec3cb104357dd15f4f09741a7c7d1f0bd86b0425d8a79fae3ce4ade074dc09e77f4f9717162204769c09cab4dd1faa893a2c9b654b91c507a804f41375d715e730318dc1ed1823a432c41a1aca4528e84fe76bed92b125f430d07eb46b4132fdd2d46ab8e441983e19ab8614bb30925c6c68bd136f4ac1706f6dcec41b003b5cb7a39b060997d7bd6e77c200636a9f4c7d55bc8c7357cff4064d13b28c1c37cd6e6a4c440c14608c1521598b10c2996f5b80482308397677308db105f55fe1719c118d938246752ea3de07894b0bd0c8a92aff98c6c90018b9007168fd2606db7b31c6dc765cd47018d225b708a5c6b0056df20bceaeaec636896bc8f85495f66cc819a6498bc0b40f3892e7ade5bf90c93f3c5881b24854a731d70e06ff53fb66274ba232a5e2bc9031a4796df9b3ab073a7635ee3f092f07b836ffc6cf101825f5950c8b6f986131978d705d15455346fc29aaaf86e9f301f271610b3fefe9775180e5cdfae55bc73dc735e496906e1c4d56c9ac3752d310dab8bc2d4b79235c97eed6721768c0a0dfd161bbd35073dd821fa0f90e01fd74cc45063b2ea32723969f1436bc3d6b93159087a600157b0cfc1f371c7720fc612a9e0a636dd3c80d50d137ca7523c7a1f6ed1d8fd2c8590ea491f8cb39f412cd042f28e377cc6377cc6bca499782a884fc2609ffc5fd21910fe20a32a5a0a896644e6fd39abd2de3d38615bdb82ad94610fefe824758023c364824df2962d838447b0055ae73981533602d208e049cb434b702e882135644736fa7453f42999f772afd6577441162972cd67f82149e709bfbd3c46372e31c3c42e4813cfbe1bea0f7777e517f71ce64aa3d9e5387b3e671407c2a7bc3472a14474fb42fd1f84ff012a02a45c523d3f936d91d916fecfce39d862dbd2b0bb6150f1956527903bc32bd1ae2ae0284be3c6c385dfb00fa1dcbe6c34ed95b9b9142771f636ccddc3155a716fec1605af81b2942708c60c30b236e4eb897d93944a066f9ce45bec0f95dcc7de9563815152bf1638db7104825688d3df7d530357235ebda4d445f965b3d9b516bccd3755b2b0d778108873f2f9dc1a184c3bd6edd26c02d77c355437609f248ba4a4b0caa6b19690e9fb39b4b70658e60d0a9316ea600cfd9fdc8d087c54c35805890fc286f745e7b39708410b8be855ab6207bd8cbe9273d134f4ca63770f9df33430d200a0113db8950bd2d4b6bf2055c7a417b9c5d809f43fae2513eeb67589e17afa847815cfb73108bdf2aee2307b59df6d153783eb45a990de3062b9c4035d00b58af72dbc06ecaab2a447661db9d80132c77897a4a857e3b582a4b508c0799b4357978a9fa2e0f78ea40ecf4e423a0f63dfaac01f2853da5df677ea41b79405696d37f95818ca92b8180721ccd20644412362088c20ab28d4e2a0d2d71b4a9bf38ae34665a274d2b2c81b2d224a6fcd129e0ac007533bbfac3c11d1972e14cbf8fa7a03cea429626ba1b5ea592514b6e853ed64c7218e02ddb3def7928f5ff87aaee123b756c117e22e288c36ec7d983f2ed2c834be6c300d152e50093746fa236f2e03b7811b12aa7d0501102b01909f4c9f4e734276b960c4d14b4a2051f3ebfa459b6239de88eb424e705ce7920ca3e2b69e7be5e1f0a7348d85b4742ad066f04ba90ebea662b13c044803cca68609e0645545221154a9eb6049de2fac749f712e30c50180b23114c9d3cb5b5e734dcb6e62defe19273098fd316ce7e2b9783f0ba6c6aca27e23d820d8b97ab6ff0972f4855dd023971aa1e271c96b9ae3bf3ed347bf944a6bb1a739111f10dcc9786cfe5c6010764219c43d041cf57425af1d89c177abc06ff65fda43120fad9ae1c1b286762ffae128d19496e7ffbc5bce0c6fa05838d17f7d001623c85ecc2003449a06d8744bf55b2e37a95630797ea152d1db7dc58c97a3a133ef105ef7ba05075daa9d52e2fe95b7422c05c3f4ee72c844c9aa70b2b54dff8397535eeb3ec8f203af9d14832483e634d0f068ed28cff42fd12c02da32806720a7976dee300e1c503a8634cfb2e1303a68400f1f5ed9a1ae5bbaae89494d0ab15245ae9290199782327c400393e1bc27659fa9a29a7f2368f482883fc16735c6ddc4c05a7e2dc623027ad3ec7a185057869aa126107807cf63e1902ef7c7d3a0745b2d10ff0323ab88374a20b6e7a90cbe0d342bd5d9e968207acc90c2cb9551750d28b04ba22c3308ebc01f2403d87750e4f067b8c89fa7d740b424fdb3f5c3f213929918d8e7e178b4272ecfd81b9c69e265db26a2c90027ab2572a89331cdba05537ce1d9241ecc41c4bc9c53a6de44381fb09a5482a1e13ebdd908861d4bca2bee3798b39265b9f287f45ba6eb39a12b10208581f264b9f352819773ba389ba0dbe7dd41325fd8bea229b3067412944f483dda4a8e538ed6bf9d46152c8bc2def51e1fc8161af2d747cd0fb9f77e1ff4e7ee1310b6613d6e3dfb512a00929f11b275d91f1cb52e43600bb9d613910ddfa658884679000c8faef6714320f9bb3e3f81397f8cce49a35231c6f03cc64a6e965a3e0a0df838fe27d5be452ef0da4f64d144204454efd8dbaa88ef2cb64760d1e636f4bf0509456d46a1913ba48a018753653c36882f6eb6d489fe2750602234f3a7f6f9eee61e5485c24b4ef76602b2a78a7d3e681c1b980f74f6f13b43cebb57e0a67c404979344cb27beddc993bf2ebe08a692832ea02b20f7f0e51b1c4353e502820c1f7ae7c4356559636d590a6a77b2d7edb3ec8bae85735591d07040718cc8f141a20dbe82c2f7085a49f1ed0658f6f0e43fae1fb601a2d36565d15fc6d73957d6de7b525986e6f28281ebe04b438b7618a60abb440b1e790791a9c48774b4740dfd2bb1015d76c368c20d9db71e3f3ef18b659e062ebb51acd27e19709500dabfe1818ebbd21d3667e9b4cc324dacab49dc0cf707ac8e12626db1bbab600b19ee6007c5bb6e5864538fb1a4e7ab952e6f13206200d45786443bec8d76911c84f1e456a18cf7067d1f85d6d7a63f87681d5d9f324bf7e2a52e6e69dadbae3004c5ff85623445e84ded291229f7e9e41a2bfeafd00f04f21534e0a71728a82841226a1e2ef2298d8dc4b5e8b0bad2c45292e0f8ba022ff5ce63e9cb5310c32bb27bfe6d6e57ff107c77aa80dca329dde3692b434bd781ca585ccf20d738e1ae16ddafe7177b49457b08211fc6216b7becb7056787750d77865141003fad81edd83fa36eb48d0180ba9ab77598fac45d702716c5ea4766b523df339bbb569526784ae6dca30258816eea1500593ee63800a4c815e19d2a4c6e92073cd8c9ee5e01c022a1f6ebdca89974aed0bd5ea3a9d8407a335c1383798f0e63fe4ad9b99873e03a4a4a9aa32eac0541372ec5baf80f384fac00278ffa7d2adbb75f72a11ad0cb1b5e82df1b9d038d7295d68f568f61a5d16beefd9886676881c4d18912c61fe7e4b2851e41919d22e93b337f12ec39d813cab8dc692aef19386c75356e342eb7b8d4437ae867137f261cd0ea8f002c2e3be3512f869092c666e6557dfcb28198bbdccad9b0e9e6ab68001942082e54e569883813248b868db5fb4728c57e9572db43cd73770370b193815b64bf2a625d72f34488b4a5f251a57e609ccaf555b987394765cafa868430c2f9214c6413b01f4f7ccdfa47e90e9e4cdfcceb450d58f48d178630547802a47647f0a2ae21ee32a72bb9a3e50a444e00bafbad5ab298de1e9f164f0239cc60a59e2ace1ab0ec41c52b1b3d57b8b427f9578a81cf618e4f5dff3e80fb581790544588000047097181a388ae2aa2b73dffca918098332405b3137aea006945c048023b9c0e6242604be09fb9b3956438ff0df10ea38e416a7e08b4d08f40a17a8b1fdebbd4122347879abedec11247ebecfc85a577e3d66aca5aca1cfcabaec7fe66ca27ce6e40eb464b53901e6111389cd4cb8f7af535721821dce19a581d4acb3af1abde5d421c8ae05d040ae514f5837b29ac52fda6f3203a8f5ec27689ea5a443d563048b138391fd700b3e214a3ec3a3da2f9fd4b78c9f096f33a0d67e88187d54a3a1186a65a36d023710b64914ee1abafe1ff4bf746489c0b8f2a48e245767cf1a4ac9b960cd628ff509e014d3f81254e5c62bb6b600e319157772727fe85987c36072dad3c87cf4f98882d10558e00cde9c18de4bae532bcc153d8ede372c32106cc4652e9c2bf0527b6a27014ac406251684c67bf6bb212ecfb6a6a5546e289f21f5b0fb1694bd3101c36e2dc391cdd72fc946e462b7379cc94d5125b464aae1ea89d905f76d716a7f0edc1be839803e85563ab33c599400c642d6a0329a8fda4b991a7ca03fdc23514d85e1e6435363386519a8e0414c9d16889502f69c8b4cc05f753a28e9f8c3d4409ceeee497e6db8e38635e7158501cc0a09710817c9854953ebb05f8007141fb16cf4940fb5d6cb2032430f543b9da8e066f5cb1150a1801d4ad60de2b0a8f3a1be37d8a8a64e2642e28312eefc5d1f347c278a4a1db9293a477a6b3e8094813b791cb53f4d357231c324be97365f09e6a3dabbb9867a10e605d52bc72d07a22c9a8eceec855371d9c1f96f7764462f4f3116cca443e9a217622332ac2f99fc00014c4b640e3e680e369168cc31425ecda2fb1d7fb3178c03337078c645dda12fa4a68578d99ae3cc5560f35281bab3dc855f5cc8645c004c95c102b63da7d15b5c9a6a3e2dfb23cfb4caefb6c5affe0bcad0d618019bc1e907604401190d68aded083b5bda7f1863268fdceb5abe28efcf7ddc2820074d84aa91e3896a79d1baa489253ef139a2abec3282d198d3eabb899ed25b18510e4ccca8d66521aa84284ac721e6a4931b52818f302cf8b6d44477b878c800c4b0e70020dfd56c701b53b9e9ef7622e7f3290b35708b1fe0b4d554e3c448520a2a73bce660e9825efe3c769a14c2ec2ec7e736dc7b6fa375136c0b7211cdc08d376f6959751592a898e1a7e036a33aaab519d049dd30a3a0ade0b0a33458dae3e005e9030843813327f824944d29c2244b17db7c9929eb099f7eb159b14c5b5bd9d86cc873ef3e0e6727393b582323f6fef8399ccbf3e078a339761c6035fca8c9f8298d14026bced0f84279cf97d07cbd90a37598583f8759e0be43d5b9310cb1629f66690145e2a7e1aa530d2d20468e8a8a504b7efeb1a0df93c78d97320c43d6cbf780dfcbf09cfd2ee04c8b019f6a12e1222b4b470cbc9c06cffc0df7e2f34094722e50764a380f12a2cd63de84164987dfe9382a46711f0f03a2d3386e8fa0135b7decf1024249c9c042edc29eca6d26be061389800b58c4063f5fa649e0b7e8e4f175074106672bdb02b40411be0edc4260987662348cb26dc83c1851576212d25580cbce1b1f3370785a0393d5e391a09abda1f656388294b1caf87be478547850ab2b81d6abebc71c1f7fd63cf078b9c4cc27c7bb2dd4563ab7d2f0e066ee712085b2d103d80bbdda08560ed23a8fa790b6b99d09947f257ecd3c4674c782e3c93946f6e6c440bac6b9ea17f10f1f3aad0bf29eee51df9de0eea815490f7ce0315e06d288c0fdd5d7931317bdcecfa4b900dc8c118b8fbc856d7141ef86c06f91604cb07018ad3648c46e77d871640cbe252e7072af653ca7284877031893b38400f72307bb6d07742e704c04d1b6c3ba058ff1c16cd70f0ed0d29728c377befbc17b969f986c8a31971ab45c415ee25b7b82eb51c03c59ba41769bfdf59d246d533db428c9d4897eaae6adebac45d7b19e12402168e6c5576933d7b94bfb72b3205e4e875c3f7c3947484ae6721588a86c9d3319da0b2bc7cc9c2e00de69b162e5b9691432e530043c25cea963805a95a06c9100d60fb6a7ca2ff2ce73c4024f76faf0a56f29fe6d1f8ef9ca90280c131a6351cddd9932b953fc8bfb69e015dd9bedc8a440783c4648354fa4c971178a558d77a10b6adf5d9106dc9e9985c6d32647c6ec5e4585110df02d9a2cec2e64facccf65f714c9cc0ab67fe2ea498b49d36335524c7dc5f1dd8df59853c658193449511053badd08dd88912d969490a1641726a1621359b5a6cb2a65370817b41de9dab922a6882b71398fc656852ee38123d9d13dd2447f06b9a12ecd98ef0b211a4c9522375b97c4812758359d9292b2b4222c25059b42626325d8aa867b1ed77d5f29a6ec815d3a018c515f6d8ff688338f6941ec7cdc75c0b65b479e87edc9f08fce634740fb3c72efcaf25394bf8018e18c4c150a076ad3fb560f400009fde9f7d043a6dd0fbf38c0497c6745fba0a4ff48188810101876b5333191bd08c5d32f15353fe2cbb18ccbfeef616dcb4c2f3a67b439224905a819d1a96957e815d5eebe30796d920c40343c4ea44e98985d9e21fe80c7e42946d76daaccee88ad985cf780f204e2858c952b59cd511e98f9e468e88de4f531def884c0a7846679852a8feb1a998552f90abb8056e116c8e7b5992374a1a13d8e3ffcf4331fcbd829e742b42d549572a37fda8d5997275a7eddff68e81fc715c4e50714ff3f04699321afb744b015676e66fbb498cb83467ba62c05b883a188c6b8a7ccba1a166da4cddae4b26939f54aa30adbcaa59c8a56ac734a33c74a6bfbfb0e9b88b728303cd4fae497b1704f6c9cfc4c5c8542062bb5b89b1c35c54049e0e473c4078707b20d5588a722f4af059cb51fc29b3b2b9adfa287a9a6e23d275ab8a40e2d935a468846160f47a46358d70ea34a121e054ce34a63d08f5cff536d4c733e4e52a7e50d58af37e5157218f7fa2f8dc95e70cc15a89f833d3ffade9076c285c4ea75abb1aa8cb973190ce28071751900a9f4dff921623b42286553a309b322d018105416f725f1ba2e7b7e49b09a8485f0f37c3352dbcdb31d406bf877f84a701d3669e2d0d74cd1044f7017e9f8822bdadf58fcdaede45cb0f140efe2c17b1187171181709f54b9e37615bc964d3774950ed3a28d58b4a3404e806a941b8eb9ded541c12a1f131993b3b0b7d3178960e9491371b207e78aa4ae9bd10b21264f8f770f85bf05051ad126951909868ce779d04bfc4e9a80cfc954c139bdf2a3295c208a0e319f0856b818c2e43da10bc81ccc995b320e29f6aad1bab9d2b7ac88b2d19d1ee1a591065a311b73b3672c8123458aeee3349ee800bf15c88af04073910bbfb1c20be817aa88d1112030ba21e8a5a2e2eb2948c6a49a00605c7b5d302e8c4ebc591bde9ffd9d6d9ad135b19f1601dee90e5c7ba1902cc301682a7b88505e1fe2138aa6637013419453b0bc218f6f631601c952e57696b89681704c270695cf688cbcb04341b38b743c51648cfbad86c2d271aefc94e2e5bb9d1d591001b60ec1e3f7ce04603a54c9af857c385411d53f40e978cc0abf12682230a62acfd71f5cc4c91439cd1637258b72261d370a9a678a9c3383e2f86c404f4f2024ece1a7f40b4deaddbe02f58443e0889a14a2cde759bb448432a34587ff2e49ad1a95481a528a66044de8592dd8e814b697dfd69199c93793a2411ad2840487a4feccfb37a350219461e090e98bff7b296bf02c0fec2f2db8847b2511b0b2fecb881a53117f3893d54655cc6325897f5d00ec8307335b11c9af156810ec29f97adeb96f1737432a5c7c7864948c27522f2664006a05fb84f5cb926c45d39e8b833cbb3b01bd156985acb49ae8bcb11e65bdae8878e159ad5727ed5cbe9678294af087324345513801927ba6f81f736ec389f734741b16bac5f07385d76238b83b237d0c820939d20d412beb910f97660bc79a1b4dbae02f9459e93111e3ea62dd6f19e12f0767359ee9aa29b0e10f5213392a34faa17d904c1d84034d1795d6033b73f19e17ef206bdb0134322cdc339f4ff97c8d2569c09b279d9bb7d05553bcdc7abcd94cb99414f7846948a85193b5c7ce5732e8e55b4fd60aceddb93d68003704a5583517732936199a5757f1184fc97a461cca5e95aa8a1cd90413cd5b6031f4477235991f07d6269b987040f8dc30e08a1e05f7c282c4829c88f0e77da31a801f576ed29cfcf830b9116a3e5b62e07845adc88c972138cce1df5aff48aeae702a5140144fa6fc90fb5b4bca3a8c8df08bf686b13efe4090952d6e4d307781fb5adcd03fd75e80dd88eb07d782f77f05a4df3edb9f6d84ed7d7665c92bc0af00d1a909a27021ef09c916c10921ad60dc7d7b5426ab2e8254ea84f2443313af51ee3d73977b1bb9c7a5b997b4ffc1c0eb2f552f399cc4402b40c80e071ecac96ca122dc44e75a0cc79831c02f09cf02b4599dfdc5609608b3b28b3f1b2cb2a6b24fe80eabcfa8da5354f9b384b1b1ed5ca6e80be37f8262a3d0b170f334714cb9c7fb30822e97beee69d723b7a162fa122f14a5a1682038d733c459b69934ab0824bf3f73611faf3b0a4834b8580797d348f12ff996b6758bc5bc1fafa4609820db21d75692ea9aefb222dace686da78d1f887c90e0f8461c8e0361be4d1b2555fb094a37d4d885f9b2d08f5d881d7bf1a1d2847e444a596823569aacc4d4a82ac346412537e4e8a98244e12862e43f55d086910930f47271f0171b2481d75b3dae44d8c8b287b5b8de7b1cb3a96f98fec086098ef11a520cfa4a3b483a2fcb9d5c44994fa035603850f0d0c415857872ff7e9f00b2053ae614e5377914fa84e41bd7815929b34540e5b62cd89ae169228094bb4a987bcc088fb8642aefa211d62c4dbe8dbfdbff505bbe722c4c8e050ce834921e19707f982ae967660578bdba522c06961b8723103e530e6bbcb2782875335e61a4bc687803c4cf782c21affcc24d6562d24837c0fd367efb8b09c9c1a1b09b902c706e370a62b9d80f354ba0fc0e38565f790fb633ebecf2978fe15380fc0e0b86f7f0d28e21551cdff6a760793bd43e1dc90c4c60390b143790b64849daf6563258dee27d3b1c9e954be8500a37c750c46029d9fab814c2272a79dfe19933dc2f7d0700df4e9fb617429443b5f10afa88cad86a67dc5649b3d90f27deb80e625c666538afb36a501932c3f25cf289aab5436c6059650fcb38a6d2fec0ddab506d5065d041de0af635aa1d9c560e171ff3b0a4f8103f3378d5db07edef26e7c450a5a343d60f98b0331804a0a6df1ac526f400f7ea6ca010b0aaa95a9afccc6c6dfa5923c7f9f872b86c2d83513447b2884a80a0c396157240b89857aac3d505e4d6b01d173c10c7a1dbaccae34e50e3da18e88e8251d41c5950be74ef3adb005c5cb5940f6bd22fd42976da55078ec59c8d4dc23b3dc0981ff6b9057404fc3761aabb786b8e46797c412688efcebfbb3856f1e446581f0cb08367711a7a56d8f2fdb511488bfb7a6c8336376e0769b44a3bac6a45444abfa1644e9e2252b88c7444594580b728b75684410ef616590fd63df6d5a2f8861808e3a553add2edd99f401084899255ab91f4aadf65971273ec9f34c606652555523bddfad4b3a546825c82f915acf5430d14104d0eba0c5ae111c7740b113abda1e731f155beea3eb2edaa7a6077ee540e00c10b76ef05ca30c710f3438192b1661d58272b2c90290532cd3ef1d80c082b44bbbb30cc3271ec3b39d78385268939449adb55c82b74042d91d9558c32b4cee1f65a03854ec4dc4427cfc36a1c06ff7cfbcfe15bcaf893f91414e6708a9ce12166a2f47d32e6e79b274276da3afdfef813b75517c67b2781fce34808802a89f20050da0234b353691713e926bebd0cf89d994092e9354b511b781227ac724143a5358baf6eca04930fa9428b7f49be29112562ff446949425920931fdf100ea7517e831ba969ca56d05b692c12ca2ed3715674b1ac1d03c8ac0ab20cd500b338e8119792b4644490faf0b2fc7b0e1a01fb9ac8c3c33a121876399a057813e87df3c8315c726f77062c5d786a92c100d82dad25bf634e313add33e813d71d5385eed0570487834816908a50821015a52ee1b0036d5681753722fbd8e28e03c4b7333eabc1a2f239b71105c76efdb3177f54c51910a1ce1f44dae4e9175315c90c657baa3d714c0ccf8505a292650ec42440ccaa17b3da3d51ff030574e8e9214b8f0ca9e7bab0b04adf3870f013fced4fdae97fe18e2482067c2089e974544ce3fc77202aa1ac3d43198b61b4fe0b164955f812c8806046b9b8f21b29a0552d43e90628dbedf64296303b70761a9cccb8866eea660e3a39c373e154ba3cb88c18a7033c204c695795f148a811d51bb044ae8744b3aa3ae683e6b7e3a07dac928f27f68698f60ea61d7d28090f9f51ad1fceb228b8e3890dc90f7321784259e57a06a148acb6cd098566240a752e8534ee01a162f962b9b5f391f3e66ce96b15dab7389f3e1366a0a951101c7382d3fa6df2584809f8bcd788e82e42c3316a4679124489eeec76e2e55b62c56e2192861131eee29f06232054660f32b8ae87b7c16ae545db615ae4df5443dfa31e8eb83128bfc5d8187738177b76464f65d9a13b871b63b475eb26a45310d4304c95d151a75ad14e501db5e829bc09b45b39f88ea76d2b858ef09b9319d7536b1a83a4508422da2ff4aad5622a81cb03dda86ebae4e29984db40eb3630782f266c14530157121cb6b6969ac7a27902ae26f193ad6c263c7ff0d6cf3ca3a63bb6c50870dac2ba7d2ef0b34c8002804473a0503842a0f9e20ed6c999b0fbf85ef67cb625bd581ce99842d2e8b5c0e2ead4f6ae4a32e3952350086eb859d1c702b49e30c09e9af3cbcf0bcd36e94a1f47f7f274a68734c2d3e488217c3ae968fd35e198856afe670849c9fd3f00b1148103430b9d971f818de86e68ae773e741fe29349547a543a09e1402edf057cab3b99df5a8bd044d8aa366e75d2d82ae52d12ef2349279a3ff2dcfe9f345cc9d124c9e8fb42069236ad5925ce1cdd4d0f08b9fecb900088af01b16c82ad97b456cd6c92ed73f0897dd3a077762d774509a0b36f4ce0b1bc5d48082d6619f455af83070f114600f7d09f66191008bc6826b672bd988fbdf88a2ac10bc212f0d700a26cd7b5e56fcbabb6849ed43dbcad4b8964c7048196eb6de6e0bc537ccb4041ec95721597e21cbdebd26b8e58b737d67ba0f0b4d9a51868b3d4984d7c57517594578aa95ea96d49bbcc171ea0a0f4bdfdfe96894b0507cc649890c4741cd394a0ef46323d3955acbc91aecf0acdeb122a98c3ba00d4da581786893a3a8f1d59fd52b213043df222fdccd472d4fa986f231fd8c03c43d9b1c238df0a1ccf24bd9b77a51547cd5a083982ee1f070eac8cefef33698491d78bd66521dcf2a0d29c4ffdc02b2c67cfa3375edfd62d5fa4327b49a70c7db1cbd3ac0f579cbecec55b183805ae9ba5df84867abe0b138a671596552bee0490ba102a45be42aca447ea5f78c2676b7c6a98969b23f4d3741bdce2a3103dad0f4ab4c83b61d68cb2cbb5339d8b7b20a58a4cbbd136deef667c33eb3f4f99cf520dad6c213c3875a05b9a9b8d30d3013cda0a510a320a46dc23d62fd227202368fb9f9c968c28465fac41d02a7a9c22a8e2765fc58ed952aaab8a08bcdd7b92f005b2cf3e1fd70fc0a05de96271f52f4ddf1a029146633de3e2265c05e4af88185b35d1875f006eb426209d97fd179df4516dd06d94f1fd61f869bb1dc18670eaf84e246ecdcf1b22e3e4cfedaf6a405faaf1efd7b0e82928f39c316b425b0c9e88aedec386a48ef9c14b413e4f08bb15ec8a6bef2a29c4fbff619a8182e1a34a69c55ce4bff16a4412848bc943122fde32c08caa860c51403e2855a840aa1fc70d072203edf4bbc73f1e1eb9804efd0ff09f91aa34a770fcc4d377036762ad0d70f1cb0711bcb728270ab7b8d1120255889b0603a6670b5cc551d71a8269a8f071338d7dccb578aab46b8e97f053eccb7d2666acee55f0d1b72f46fd9c330ab1b97f05862425372ed7ef6ee34a1b3ef7fc0d172d5e63c014406e8b02d002051091be2371655a2d05420194dc096f58903c28c84c534d9c2b03ad0b207b4d8df97c7cc9c3b4e36afcad43d60ebc6c47ee00e06f26b2983988d2b6ceeba7a1d96f09c734b5b6da11de6e4fc243c8e85d7a6064bce1ebba14f84baaf6d7cfd7bdc8273be7ce88aafb0c96d6f73ac4f996bbb1dc2c2e28b2002e1ba2c8b130a837ce6cde514eda6b58533ba971730ab2f913dc3e41c061afe4076fbdd9e3bbb0503f0b1c7bffdb7059250fc4e8847de73112b9c6ac9fe998c113906dc56dadc555e72ce6d06d937e338ca9f188c6a7be286f00bf4c23e4c263e9f72c0f1290d28e9c9655c38a3a3d3f8f2729060654f3b131d54acbafb84a7fb70077d79905c223eb3e93d559df8ebf2425cadb5dc58b3f911fbf9107bd6bad2c4f231d7022e1bc532b729d1ff062a4590110be71a4bc4a79f876f97a5a7f2eb1b41ef0fe66442b882f9300cd292ce071f39ef337af58e3ef0be28dd47df3b1285ef4d688fc0495592c4e0a0a5074bee190e84eff1834126b75d6bb970049099c99f25e00454395058f94e3e55f39d05ce4be3354c005ea48e7f1573e65f3f9cf4e5bbdd46dd1de0a8b49f6daa1bb019552344bc5b6a6689156065a204e70467fac54031b951ae81d0529fdbb53a2860a71150cfb88124981d4c3be2346f4b332b4439ce9ea3d6b3756cc43a746045bf1b1327fb9a1986df82f9af9d34d1c6750c7211f0cddfcc9ea88ecc703bc54b1fdba15b7e2c8984d5f01811bfc1da5e3acbd9c6911b45855313a5ad7e2f0b37ae3758e6527eaae749cd69e5cc4c5b4ac4bb4c4dadf02430d208ed71c99626f0dbb45f0d548f759b84b710eb3469ba7205175091d4da132a75bfbeefa080d0ca988bbb79d7d2855f1fe3265a0681939e0839bd8fad9d209e351771aee05fa7a2514e5d965c13bd689c0c30eb47269826ec5ada2cee33c2cc9dfd99af82a157808acafe87f34d397973156828543e51d23d797ea68c52c5f639d862ff26c97c7da369bbe8c6ae87f824aa4a2160e598f7c7a191e2f194af6d2d54c0ead9de2e04c136783e2896695ccf30d11372cd410020d0ef7bd380b44a90d21ae6a39d4ca20623e57d9b2c16b7bc470073098cc00f3da5814d0a3c5255ae73b9aa81456fcb052220411dd5083a0439e739bddbddfa13e5b367602e221940f90370e8aef3f2b814c7c377db2a043865d8e680049a7425b7d4044f77e87b5bfc0332db5c2cd03e0d226bb010f1825f9c1b7001066ab384b09b700b87fea622a130c30e491472137d06ad2b173d12b84c2169166443307589a1b20f28e3212779382dc6dac99c4b884658a6712caba8f1c0d501068764942bc61fb32adffd023b6b850b0b65e7188008585c136c732587b0b4d8875447298a1cd47a0c2a37cf910b0c6c2dabcca19c45b5168a07ce5273f35a96c4cbaa8851a6c73d941d0272fdb83ad9315031af6f7884985fce215c6706f9bd981902339da2f9072447c7547a4e32267be86d4f4f96686e3cc9bc403ad1e58b286e1933466964ea8d61483498bbab5e525238da0d8a273674f407544bd627dce7d04a29e0379038d138a132b37a0be63bbe7672f9669c8571f1ce8dd68860b2ea1d8f3b03bc6e92a5a23036ca65dadd34e2ec55878e3649ee90aa320ad5b8dd4e8a2d5d570f7fcc4fcac89fa1277d1d9076b077c9c2919482203c57e0aa49b91cb9b932f6484ffe180a858e8233455c9ff6744cd99428898bc043c869dc665713faf42130d5c90fb6278a94cee6e7ac205cde5662e8c6fc3f6312660f1c3c6ed37a706766c86ff0dc5fbe7d27aeb5d87a51f9643205b7930f0218cea402c5851b946047be2e6469f27526413d61e036b6d850c71034e6c0268683419d0d2afeb044c7fcd946dca7073b17664954603c626815e38d4707e173795f2bde9cf119d82c8d222f97eb4e392c1af7fb22b1a8836f8c796f4b5fc6cfa3295fda34fdefac9dbe0d78fdaa9de16e65bbe5bb0b1b76799e4e9379639b62f0fb074e191922cc0e1d744ac084d8dd0008c1424e2285064864bc6ad36911abc6683e1b63e04eebbdc2277ee69964556bca9f59003437a1fa0c7027c46b57c1b082920a724a238f64becc2f8a060e695c3105b04e6790532b7b311001e0b15d38d8f4452013065ab7110d1f8473cda2c0ce9b80b52e3170c102d11cd5e476e7efdfd5f8b5ed6edde3ebd8c8004b87d37674a7b2bfce8e813910fa760c1f62fff217483b219378efd3df7dd329fd3523d99f2d296ed09034ec5a4d03744f9eb490d856b064c8bf52ac3f35828d8cbeec5c89a7031a39dd5a1482a8003531aacef72794cc0ceefd3fe70a1cfd6727513c496125eb4fdb1622d5f8b57aec72e6a5dd340046544aa344dddf1dd8a193961e3841f200144c9ec47f3d6bfcf8fb3505e7cc5a67d218245e29ed7d2369a855bf8fdcf4a3a9dbbe7a1ece919a9c9e947a8ad8eb83b25de20f29848ed8a1f525adcba0200db33812b06f0c0eb246e0c20e898ef00e468e9d7f8cc82e5da9f9314eaddf63e73a3073f7c9a81d32ff5813cd070b92922bcae241769a0cd3b09d837408a4bec8ee098410b2dac310211ecfcbe6bda9389315c419ff82df712a17c851c3950f6e08dc4bd5bf33b99f9b2123ca73c06b861288b1a9a7d7108744f366112b9f7bf3ceb8eed18a4a6537d0d72079a0100842161f7f148022b8a298e3871c370a530f78415cbbe63f5cc0525774f0cce8fb7464b107265367270f574ab159281919d358e45caba1f19b9fcc8f0812b92f3ff4741c51d8571275cfe7ec75490971b3d79681b9a165a415fdcfe6b9fb0fbb98615c841d842a7f3ac89a69efff63ab29b276ccd252f4856b1e1b7231352cd110f573380e80c820ed42357011088923162fc84a021e6124efac3b05426f2e8c0b39e201b7d4aae58d6930a2174ff71f0599cbd87c73542d9db3f4afec310086d88601f4d4eb26ba61fa0a7e258486f88ec827d55acd4aa4b773e6902a6b6d81ac088184b5c2ca6b43411a7654988e59bc7793a53425ab15b4dc387ff58d149354e022b00125d85a8a472a9fc23b6a9c2a318bbf74bd81e8e04f13f1eddab8ab8605dbac3909a55f3c10308b30c50d8f6ca89fc0b16aaf933ab9cd7987c39f633c822cce5c0821bb5e88ed28dbc25745d2289c436b60ea52568c9c24ce14cf2927bc9225b53f7c438ffb9fd615f740131e87311ccd7a00d1dbc82bb19b5fdf4183e4e35587e4aecb5155d96a17426f66f16eb160c2d106f3f2453c0b0fab3ac636ccf5936364fb9bfa0eb50c6b94721f301fcee8ccaadc8bbd66b3f3842f6111a3cef56f5f172887e934d1c4fdb324035c33e1660e78921a49d89016317e4c8088ac0187b06714430662552c6765b0b1f2cce2be2ce42067fb6b153970b5d3e1057f05eafa8de234e9e044b0092012b3b24ffda534eb98b1a4b00bca4d8485dc5cb0f0b0c47c1bb5115051a654dd4caf7ada5a4d45b307a87b82064b1d4e307196a22430297987d373ddbbc15e8acc580bc5278d4aacb977e2058c87239d12ac12e37da31aafd8929d979d1b8c49a552df0c42c63096854217a430522b71411a618b8975497c64a2a54fba235336f5e6453f3af50d39a404f7440be279e0329cb3c203c7ec916e39e450efb75f66961b26342a3690bee685694a67d3ed4504fdc231e95ff4483f7bc0a872892ef6dc3d57a4bf6a9154ac9bbe1a318159204a3d378f5f1bf0bf5d4b9647496128c4369dc673279a051844678b1affe38f6fbce5f4260f8ce5ba4e25a944ba836ff54982913b8af9a507255ecda8ea36d6689f24e8ded54bc6c733f9932fdc0da41c1406e976b7e1c20c06c4bceab9c114303a7fc74a5fdbe2a00987b382ba13d3bc4266a80abfe44cafdaf28cee9ebf7d49617f51a95075b5074b918b29565d49f999cb1bcf3876fb4921d2aa881cbfbb0619d59ce33066ffac21d16009b38556ebd1771c2890749587cdf2b1ec6f9fa9a195bdf074a54dd341f6b3e1abedf58d20c8bee841a1a540f28ef47d7940ff9fa9633d7bba566d7bb33329624c6317e6722dcbe230ca2562024a61f97541f294ec9905a2db72aeb30791f08cd84b2b5849de8c59ab583da920a96ea4336e70a88edac0bd2621dd729c6a0d8320a2189ef0a35d2fa0757c81b8c853cd3f0c13409da79b1770bc3fbeae51de82e01e83f27f019d4a6fe015c35d3ddb8dc0089ee7561c261757cf4d338792363f27b57acca01e58a4007419223bcbeec1f695acb8fc0e49070b5a9b53b4133d7062a45f5a92371963f0cf23bfc2cacf40e0484264fcb412919b2b0d7e036ee1219ac29ed36abec241ad80a4befe552bf911ccea824dca043c3863680b95fcfe664672b5887bd5ff5c908663ccc9af3e36c84e982e3e7a2b34ba82140a6cf53902ef56a7a5039ae5d56c42ab733f1acae26b32e128ae3c22440c60f22c431969dcdf1763de399a559203fe9a0a6a9af7a70669cb8a439b8f13f7002a031e744586a34b3d796e1d48bf7ba4a34ba22591fb3f831eaeceba49355281c224db34c08e25248d62d835352632e51550bbb5c695c575eff5083be4ce66c9e6b682b57679cbdc6329cb183d25803afe3fdb5bc344381e11c8642a6a142b1337d19a5fd064d6eee3db0d842d6f8f52715938c37526265015bb120703292e07c628c73e580db55431a8b97844e81179f17ad2ad4b764c1059bb178c111b95a5880ed93310c89d339eff32bd9c3b9ee2bcf069d3be1c8b92c79b3dd5bbc0bb1b62885bbb549cb488bce8c99fbd90e80c300ae343d5ae75b116c42fe33c081f39936784f6cefcc5ed0750880b4170d35f49571f59bfb33ef6ced194040c47c2f6f5d2c99c4ff25e2b8c8e0a049610cf11261b9dbe1b15c8df946a2530655943900acb949cc6654abe792862039a75352279409751bc8ea20a5fe476cd8be0cca35ba29c3da39e44b85301b41c0beb0b06ce9318a6311fd1ff4ec9b83f0f90f652e87e35cd789c0e4377abe063235c576dc8bb79f39f3cc978c67780ed65a6ba17344980d2fc0504814bc70b7a8e0d810fb342e42f5fbf9bacca588ac7fe5c3d15e915929695ad9f2586af9d1c3dabe6e9e471ca2c8bc5f397688ac75a00c068120b890a9cc7ad08d315f71da0c49db07600128ec260e88de39ae3cb35ff9404cc31e9b502ad9762a7c938438be0f685653c7aaa28c45da9fa0a828396dc3ad3215b6001a098c128be168da5ab10cfc752758b2d94b0c8b7d0f50cf47852b01552037bd3848791383e4fc4c15b74ab8edc90461fe85308134fc5df66a597611153d121fd437863316106c7523a3a982a94d3fb05669534593c232639b530756a40eef87a299b749576e8a94e18facd6472e7e318d4f53dab346173df052cef715d1a90872a9ab64398f9badffe000c05ca6bb21319c0b863c076cfbfc133464df3fabc031afeceec8b9c036a78786058e4bf323358235649c156315d9d045ae6d6517b66649260e59ad06289800872a9d58cf601a380afcacb2970c00effa0b091b669eb2679b3f0a9fe1a08ce02c56acb2ca1a58cf360ebb4e3380659f65102c52d8041424676be0f5346b39ab3425622d06f3950867212d7f8b408e263a01353c4d382d9e5cf7244f6632dbc5e3f426fd11531a8d1c9704b1a9883a44403ed4a8865ceed14e80083ced90d057a1401f43f614482518d251dec905d8941bab203f88f36f19dea2b456c6f1a2a8b0c8d8ca10fe0ac4b4c3a5275972056e1fb6f22c3fa4ccad3f8a9824062e89a3729470ef93cc276162252c51c2300e31eb85b3a96bd41da553fae0e3ee09c238a4c09d688df977edffb3c371fea9a5a20e152349ac71aada3fba3c4b067cb4992740e85488b752bf81f0083850c077ce89dd20d1fd60aadf5f9c7d0f1036cc70079448d8c737d680ef438f20eca5f81058f53a1d704ade43a43b60632861740c0706bb6ea6b06d6d2208eff3797926bb40669fac7a3e291ac25de596de02149745db43d9e1072e5a819a295c449f1f4c5a5a90bc688112e1dd38e052af9340103be299b81a330eb9a85c4ae4e5578c530a7ca7829833ad023a3652caa47b7062b38b6eaa837a46cc6184d15b004096748ce8c9e1c49cb313f2df640226b9c38a0467cae0a9f07899eb45ecd349d85249ff6d0f4f16727db4f106845ac977e72b4957d4bac11f3bb49b3ee05f502d04f85ff723af97055c8003e878ff23bd09b12c40e74ca5e46269cfa02299fea64ee37a2e55651015899a782f573d6e5ebbeca6f19ad3bb0dac2f4be741138398dd286a7e662b1506b04d61afd5d0a4b83e23d5a34a4aac772539fa7f28961adb27f4bcb3d620b595c4264db858474e35af47895601adc75ed414b4a77c46ab89fbf2223de75077dec815ee173f6106b0e91f1dcf9c848990d6d99eeb80b19f729acb1d081d4b7db8842c5606de0a13608ee930989af36b216c845f13450c772083ee52ab7a6eedb3ac5233852606dfbac01750182b0bfcac931f7c1ce2141f0746a59331b91067d05be5dcaea36785266b8fd0f9afdbd7e5bb9c71f96c60ca70538038c4aa026d9e8b7eed86b714963dc4f37c93ff734c3f2aee3629792316e20113da51b1cbdbfc78638f73444354eeca6e2e6ff8ff9cd21675713bcccd37f83fc7f4a3ea2e3e73c28d1ece393d5175f7d99c7cc3afb38426eae2fe3027dff07d9ed31a95b931cc851b7f39e334a3eeeead941762270280d3135577bdcdc947d6448664c8fd940aceb922a6c950df7bdfd5361dd833895f93b9e2f36c34c3250c5dd9efc29de13369e87e7ef48022c65cbf3228daf07f1af7cbc44efe3d49acef90d71a3d42b94b035788f0c809ed4769b477874f9842559410ca1f1ce8be435e6bf4d035c8030c5cc86caa0b1a3138a6a197bca41119962109056c193f0c0d2b3cbcff27b4f9f5740e82e8b5840d306087d93b9fc8684a0171bcc1aac4a7dbef8e97710339b9f66616961b57095b02b6887409f16d8601315c38680afc29435266db75e04193e80d859f765d14f55ef2920e281ae5ed2bfd66c27352b888779f6478df62b9dd46ebdc139dc8cb472cbb220ff8b7b9fc6cf2e8d8e1ccbaadd24c1520de6fa5b2fbda0fe2a5389f5ee71ee9556e371b2c3c52dd7877e3077ae3b1cdd65df54ab7c84ede27fc696715c7f5ff4bf19f3a36a6ad671a15de84e1a3f9710b97877dfdc3653d2ecde0c5855d4a9d6fefe7d20200435300e8b1e39419507e2fcda9e112035e53c62ce281fc20a2767593ff14b9534c849e790300eb5046e761d581f174982e526a831ba22ee9af471e521256f4ef3805cba1350530c48bb36e8f0b82e4342b2b9de17718b5cf3e815833ccd8d5e3ab11c335645c3b342d146cb78b33c303781e158561728e431272caa86578165df501d7fd33d14f0407be543c729cba361b15c7e791d49c63d05092ff13e7e709ab016cad681a82f7da007eb5e637b11c430e7990a91ef760a1355ce175bfc76e594787a62ca0f9fc6a52e296cf13477cc5fa2804979620a79a381417f5acf56c759b4143554698a8616cc7009abf216fc0e53957c1aabfd0970164ad0bf8ddee33f9dd193a8c0724ce393d21d2881db93f34b562253d6793cc7ddca1f3ae3420d838d74fab8869d6c94599076e60c2429d46813e38b1fd62b6dfe30199eeb3e3887a398e1558dafd941c221dade4ce72d3fd8b2c07ea44452ba015333fb1185a5c77606773733aa4cfa5b8058235812230ce5106f6f098c59ac5d4b321ae92c852dacbe3c552dccc6cb46363b2f6137693f8b05b1f6862ac7b6ccc947d7f815df492c3f235dbbd329ed984ce076a7112644b16cd81688aa26cae710363e51b3fc9e6fd6cd6f605f54d8577e37b0921fbbde2b5ac0203ffe82a10d290f37fb829f6d111e2d6f9e236eaa726d356f419dd379d1bacb982d4037ed707083e077fe2a04827ef9f6aa50ff3a2b340d70a3baf22eb063bbe06acdd8d2aa0168b7924bf13b75aac4e4237d94207a0905b85177bf8f0e736ad93f21c76ff2881fa9f6e042a7c4728b3af0bfc352662b3cc5a543dfbdc785b5f77762b291c95ca291eb2a9b2cd19a87c302a6322b1747b753f1d0039fed66477dcc7da0015b2e7c16b3135a2ac2963703c4a19c041d626ca77a9a9788b5d255e1705f725f2078f14cb54bae3a80633625114ffc4b912cf3bff7125966c2d92b6da9ca920473e61292c8ffe12132d127036e09b6c165ef10cf79258c0005837c7a40158c2aa18a3ac5d634d0d5023d493e1f83de3a762890d2871f62555a95ee8a290d50ad1664b022a28b0a659c999147e3b33d9cde66702f38ca35a6b415015464eb58747cc5e168713b64b537068908867abf79233214a0f2b3a0b440ebbe37c461571e112650d21848a10aea3041c5d8a8f5a24b11cbbf2a26511bf5306922f315e31deaabb088923fbf0c85e49e5bea53bd552af289a4a499e34bd4288183bd1676970cc7f95ddff2cbb2a40786485a4068730002824ee94c8aca972838cf65e025936764aa4df7dbd0c22c69babf9ee7e979530f22f2f8e36548ec40f762e0382ea0c8129c5d429c1d35b279aa36389b055bada36409736f353abd2bbfd7ff425f21995ae3a8c7bb60ca6e09c7ad7c9f6d9960c9504b858e3c1a8df0968ddd632f54895b8e269fcd51736773fe9e530fd09b1ed3b4cc39597f662f313f75600d868c8271b02f503c5bfd98851210d118a54bb5a6f1139cdcba36b83079cb212a3f269b277aad8048cb195c26261f45e9d0a23055cf7b34c5197eae2235889cf596381b5b3bb8e440eff765079cc26299ca384efeb69fad84e71682c3f128207085ee55b0bb6bfaa999a27895461d824f87514244918d4a0a22f3368d4c55663b13dce125d4960e6fa3a060a2fca7ea8c6e7039e863aec80675ebcb29739f1456a128ca9f59f3a0459cdf7ab7cd40569c32c40429177fe73ce512ab61cb26de9283ac08e102db1c5fa30fd372ef66415784b29177d64aed2d84a383984b12ad8ee970a4a58406db55e5a52b3fff6e30a246572430307dd0f49ce984f77c33c5b918148667a4201c0a58c6798c233dd98847f3321ff317128688c172ea042eae1fd125ff22969a2400ecab696d65b24d2fbc45b0db609ba5f69bac4c1b68764e8f592817571c8301380fc9c9020f528ba8167ee4117c3e33d07d22165ae266a58703faa4454fe92a89e3a996228e8a5b56f302f2c4536b310582b1336746e10a780225116fb9533b8d303693770334857a0bdbf1358c0003d34aec8d1053830ceaece534d49e55108b1d07870fc98896006ea1563080d3542d93818e00d4de105d1493b6395b90a71e25ee6ecfcb7ff208710a1679aa96c04cd45aa3d1172d439c5ead8d4156bc20a17a993e38aa99e59b01989bd9a439e4960e9a6f897109a8b3ea4f6261f38b272242f3a4ef9297ae402328d1570d7e6008b265585fcf5dd23ce06c4c26128472dc5243cb2583648eb7e1740a3b9e9abac0c065ca75631407c315da21d961ae3d51b5335f9fecbf716e288faf17632cc0612cc67218bdd2b145a03dabb92885720dc15a703e2e9be1ec6c506c7811bdcba9b86cb58fe19830def9bcd9ed5646082f999cafb9a96b4003f22cc0b140504150069c1187c5adc450aa25e3c704f1e90f542e25ecac31cc43c615f50db7bef2df796322599024208980892089bf6b5975d1c83eb98748e4c2281dd1f8ce390e9fe2883459c8ad89905e95b4839ec92c9a9d329b73e25b90fa379b5fa76bdd88c9c9dbf70c547eee37de027a9e7e1970504e5378cc312d0c2e22dee23db22a518a6e2db452c73f6da0b97f88c73cddb9cb68c40cd573c6d1379d3533c916f9103a597f85431aff5ab578f5e9f104c78495851c355f2984bcf40e7d23b0fa97422babbdbb15ddf4b0fcc2ff7f1ec552fa45f5de4893c1591e7e355be70896f90415985e0d39c001117e093a83b25d41b3128eb4d95f181017cf2a4741e667e08c22fe93db02f7e2f3698affb78e9cea76b069596f8b421cc4bdfd24b1f2b51bbc28cdf0129d92467030a8a84f48df3c6c1a8ccdb37eac9efbc21299ea538ebc36641f97efa8531e48cf0e9721efe9dcb4fb6916e5b8923529ebaf49a9564c90f500f01b9d121c283a4c5a4099fa06c29de8f293a77c26ba690de46b6abeb71b9fcc28f8b5d029a27e4b08eda30123ce24b7ed9ed107dbb39c2cdd93be7ae07097eebbcbdfb42ee7121b9e8112548753de4d6799b73b4ebd13c0c8e3ecedba75d45328d5c5d0ff935cf172a111f03fa79e662978094df8da10bd0be23621b61b03df3fac8c6b46f326e5c3945d2a5631e120649f072639a0935ec22df1e7691e6e193113eed4c714c876cf10735faaa04608b551ca14647c203046af490a224ebb06de1f6ec2bd993406ccb4da8e01c2327a99c2446e62f2cc1c7af8a6d4b4c858a611886f11732f1bbed9ab3a739163a16449ba2d491819823fae69873925ad1b0e42b47c63c8846d10c441da59823926af78595fb9a78294e1b0596a28e1f628e1892220df9c3526c168525f894cf0891d70106e30f51c76e8eace3227506438ebe79fc8c83cabe0c7afccb27ed0b91881fae132746947e3af7d2a3fef4faf303a23ff9f9a8f162c2ce19707e594e8838c9f92d458e460c450d17c94be77e0802012396ce430f7ca2cef916e290332f59dd7407336f2f2f7d24bd8f11833186f465496ab189e024c8909325aaf45e9619987ce419a64cbf5d30940b6062e737536c3747e48f5fc89827412f8c3b1b12f498de5f0f153fb8e3e1e32fae999bb16b01b34b800f2c76139b8d945f5c708ee0e7b3a7042391637a12a47fc9c4b30d1fd1630c3da73e7e485c9e04fdb831f36794be4d4e09fecbb76519578a8ee8bf56f249f2105e2e397769248d7ca446a7be65add5e051e3e977448da74b3381a87f44047aff23a2cf53cfb88d3ab8898dd37cebae299a3285dbe99ab797b9e649ed0b63d72d6076017ebb1ed3437e1e0578fa1d5180a7be556e9766a3c62d451ee057e27aeca3d7d7637e92562c7aa8b8f9cb5f7a5cd33bbcc238c6d3313ec32e9f4ebd94bfbef8f3a329fb3eb018abd08229377a297dc4450d31cad5eeeea5c12eec628e5dd4d01fc3463830c7bc048e4830d7755d980c37f145346c81470c92247f0ba5865c6466af3f5102d5b0beac2439e79451881783d7b52392a186a4bf487c0a39183eb15fee25f0f23ae29367430a0c8b118bd7151bc528f710cdb10bfb8ac09c3dc4be17fee894df88524a29a5946619c74ce6c89c335c31d4d07fca12c817b3cc199a08f91c829e90a109198cfcc6cbb14565d0b1fd541bb62dc935c303c0504914905bd4b0fe9c4eaace045319a586fddc4b13dd029b932f7e67a8d1b7724d426e886dbb18862a5d3a558018867ee2f4e28b8d9c5f11d3d9c3f9bdd8f037a4378e210a31305223c71f5006f77228d4658d21e8433a06a09eba2c321069320889427d3a0623cfdd8efda273367250a72f65b06db0b1ea5992a48cccc675be456f761207d88f5f545da1f2b58dd27c1b95e2b1d57a54643db30fc7e8e261257948ba3c3ac9bbdcc5bb68b7234a1c15f781238b4f1c92cdd9639216678f3cb1089f549c6f184572f698c3a819323ca42817cf7c86179bb4899de4459f54a35c3efe5a3c15155f5971ee76acf8363f12acbe73ffd87923df8e870fd148c559bc905bafe2ade23ef48a3762905554be1a7d1a45c49ad869ad5acab771ae753b3891dbc841dd80e83ed91ee36fec3a04f8d8c211739167bf986350c31e7af878ec04f8f4d2bedf3efb1b824ff3930c3280b2d7d10f93975f486a568d98eb01d3a086dcaff34b2810a1b53d30a59c8d47490735fa7aa981d85807cb27ba1f2777c93929a51c0d1b52d4a731f3309a6599f3d8cfdcc7532f7422c2fa33f3a8f3e53e3e5eedb3bb1dfd91c25df2b1c3b065ad36b173ad510ba655c221a1ecfc3183fcce9b5f974e18257ddac4ad4665415950abd56a6543da8d164489f6e3d93b1be253e6ecd4432d05438a4b3e3a5542a2f4abd28784f9481ffe49f2d37d0541db9453a8b17565415a8a94057916b42e9305354afab0897dba3b89546b16f42c7fe49084d2239d3cfbf513ca26231b2da858928f2e7b3eb2588a3a6515eacce153e83a7c0aa5cfb373286f903c8ef4e193ff9081202b25312887c53f4088b41a0aced218591a7e5e159b283a1bd34fec86feca5f0608116e921e708099376f18e45285c1c6b087d8af738c9a38ab6342b139d8d7e3546d0c3be3a0de70a30a432a7d385553e54d1e06d9316f1a61909d6aae8494a42e121e58c527c651f275f679339d4464b41fcf8f74e3d89c5010f98d0214391f4e950ae8bd31af7aa3a68a4dec94d64a22b987e0dbf8512786617eb163dd02dab14f89f893c1975f11d37918b535ec1b4f1997a748d399e1c4b6a5b0037af61c29993ccf1c1b52d479f321a54c1ac9bc64cfaee1d1f3fc42b0bfd06523e978d0975fb31864e71cd430feb09e7f280523e84ffa28eb2e8dbb909ab62fd8bb39da374a20fca5f7764057ceb6a56c4cd2f33b427ea4daa79918e1c1b961280cd44a426407c88ff8137d584672703668a12869bd0c0e27f3267a6c2521b22381c81f3f3e2c239dd338415094b4564438080369f28384f53a31c703547b92510c8649333d30c85f29e2001904d989e66199e6ebdea8254b732dcd3c82854adb6c654030e362272b66d39b3d0cf235a53791b07a6090594f6634d6c57d83cda5738c91c4261e03376f1d975b24bfe63804e4a42ccba4f327836a0f6b7c98d5f85d9474d4f4903429955f7fdb32cfa69f91428d1eca00b10bb62d852b40cf2ef3363c463595e72ab2151c74407145a7038a1b735d5dc3cf6f05280735c0c8d046b5a4f1ebd393dd05e891630c48325a7ed4ad09d5ce0e36aa3f18bea2863dc03cebd0b134fbac1a7926ab51574fa3b049c5872696d5d7605ea54e224d6f6b7afa4c9f2e54966a45f5e15cedfcced5c6b0afb4239b4a3bb2a9da09957ad1a4d019e4d943965f1f915456c70c5297c69b380c72c4a2264413a2ed306adef0545d7ee5509c9b2051c78402062d50adba4861f1d835b18b50293b6d3af1a5f540b2b4a02a2447674651835f9f33581df326e6e0949d464d9c98b2f33c71528ca418e15398828467674f41c2d26c147a80a305615fd68333854c9d99336fa28e3983598319c5c499389fc2923d6049c58e87fc76c9b3344024151fc64ed49a37d39500835f9f50ac8ecc48ccc1aa8e8b2a3aa00bbb7e7c9825e1c97abc0c0983ec9991a8233bb239d8b9099912faf3a9d1c38cc5926a17ac9e7d8bdc854d5f973ba4b021bb9bed20bfcc67a535f30fb62d85292a99dffe890fb35f6da63e9c2a2d634d554a8c21c89cc37e5d720cca5a9fe052fbbc7c7b40f1c026761ec610f2f057047b887f37b30ab62d8522c9c9221f7247acc8963c7b6554d662137b5f81a3fa306bc2376169f659d40467ad15a5b2259992ac952179f60c49d6c3a84cc966adac256a65a1e3aca5894bd3d28a23eff193adcbafe6586290dd478c2ab94f1d3ee2f3bcce62d470933cd71d3b7a04be7d08e75bdc3a91afcf9d46f9d026f69ed52e61fdfad4591accd74369c5afcb565c6d56f85083e2997df5e1f4590151c35f9fa66212378666aeedc650afe1f75b17793493dd4525b5893967f7e1872010c0176f7373faf84081e3ca16cd4f8798d8a4b6c7fe70808ce3336f17944c64def4993f4e386f02b529680e3168fafe661329542f87e7bce91357cf1e4e1f3eb5a3e6cff4993ecf2ebb1ea3efafd43983ecd8657a6fa64d4364649e5df3c99882c1b1657e8b5dfc1c0635a48c22b1899d4764a8a31f45b13432bd53a36f0fa9d1972606c7ef7ab6fd2d112ffd27003e2e4dec8edd1e9b0735fa0e6af41652a3b70e6af4ce418dde38a8d177694aad53a3b714357adfa0726d831abd736af4ae418dde34a8d17b062d2f32b8c67199f1b451a4360da96dea826b19cce076695c7e7da3c175142f5cc70086dba5a981eb1b1bb886410dae5fe05c43e171adfab876810dae5b50e29a0537b80e7203b71b0e5caf00e47669fac431c832df4faa896b15e4c0750a00c035101c5c3f11c3b5133a708d821c5cff90e1fa043b70ebdb0e32397488c101801c4c200e37dc28d9f83caf61430d302f3466905c64b48c5856546a8aa89311edc6c8af190bdaf8a7720cfa1067bca2cb3865f4dd31659c317edc9308b4bbb106db2ecdc0b6c130b854ca392f8c12d9a1ed6c8cb6752352ed68e7fcfaeafcfae2dcecc0913f551b43aa9b0a573b760ea3b2932a832b1d73652feee031b2a308cb901165f0f3174660f52ca3518b0c971617179711cb8a8b8b4a757171497111752e2e2e38685a58df52ba5bca962ddb433016f1d1c9b6a5d42899723bba3bf52bf33b34e54525a783f1500d2ba51cdde9a11a52cad56ec4ce69a8d139302a2da580291d8faa92b2c2ccdddcdc0c6e2c2b2c2a952545d4b1b0b0b05c73864a94cd8b4bd67b092bf9f191f3c2a8a4b439d2bd309ad16c5dd37438c971cd91d336ae134991a8398a96eb36855b4f244444e4d7537684fc7af5422ef2eb2aab15b9b2d21c57184a1094a12028fc03a80749921e244a5aac9b981371e24d54f18f935fef263f508088e061a68799e76191c844e66e29e725afab395e91bba59cf3c2248635474cceebc2304a334d6a5a73d4309a659ab66d5c27bbae3976dac6715d2712a554596b73ac51c4c594142e5615152eaeb0481696e6c8b2c2ed7a21dd96166e65c8e0d6852449a4e64852d956b8c82259b8e88d3a1ef1e9888b5e4bc72372d193d1f1885f5da48b4b7374a1a2179b162a7ab1093df0dc62705d8728366ea21280bb2895388a942586c25c86e620148141afb05872ada24eab07d70a0b70469231140135d67ea1094f682c2bcc9481cb305751094796305758d0b021056d820d20ab0f5c821971cfa89936358886192da333d8ccb7571f8cc01949c6400409ae8f1cd280be3b9c47e6ca0c3308f308d6851e5309479430351d6e2f7e7b840ba8572f5dfe1503466d79e921f8b389bc6c212f3be765df749097fde3a5f310a39ad5a6a0af3d34a2574f9ad55ccfa5d817ca7cd0873548c65f5f0361b0bdaf1076905e71108abca05717d0b5c3015dab3484d7916b057405e13a0243e45a459dd6ceb5e2802ea72d2a0ea34ac91c879a152f35d64bc95b54d9da12fef250b3e2dbb90342e6e75737a6bd4d502312714702e8949f9cd7f519a1b1f60b4d70e225fdede4b7018dd5a2ea2b24f9d8285a3323c30383d1a1e874210428597879610d539a9155fa5231fcf5d25d4ad91ffb7c505a2f5da2a0463af7d2496c44a9f90bb2d92bc990d2f8654131c25fbf2c282ba985120c0f173f25ce62065c705e18cd4e1cf8387e7108f15d5a70fa8243883c2f4da0f3609c08ce23c15c60f346a40c7cfbc888cce32ae55ad2d9eea38b92055ab0911223095190742105173710c30e74d0c045931b4421df0435b42e6527d1df8ee34fdc2ccc6c17cc10852840b0220a8b09353b64a4870a57e0410bc420869a08468d340221394c07829e10841c2b5e9002c24b17524e60324512a6a0420b32745a4051b224a5515a4ca16b54f7cbea42c8c5c5f621a7056bd3a24816805fd6132e9ef82449f9653d696dd7830caa0f4de253b856d860f814e3c6711ee3b6f976dcb665decbb615113df3c87a995fd613d55fce719cf3c09c731fdf4db93f4e10c7a8a1ee04adc93cac33d795c582eca1bc7adac4a78b0983ecf5176b62a75e8fb13bb05f3d7d31e153035d59eca9bb58b0a7bfc09ec04eb0a80b682f6c053bae9fd4cf730c40287f3c4b279e5da658008cc90093e2d97b8c0884a5a2fc168bd1c63fca060a921d78e915a851195dc274753614c863c43a1b99798fb1a8ccd9fb8b1d42ca302cc6cc03426be8b7cd506a740ed2407896a6bde7a695c3ed43a49b1409675abe811a85a5b0548a87c86a14939e9f969367cfa0f80c35e1169692daf60332d0b8b67085966b0b1c90424f17a690841d0cc142004bd01942162a38830d722086912a46926b0b44ea0d442c860a54c4a841ca2f2b0a11b42f6ce1e5a1f4707ac81e5e97947332d7366d26db63da26f68a50a27f4808306ff9ed8490a954fded8488a9540de6d113fd76422caba6fb4601739018292d8cc682ee70e205562c015212031e2c17a99e27b808834815573cd9c2682cbe2b091cac60b5051cb8e0070e1186c03042135320398218617c218c2de49210490c544e6cb1faf1c4c711849a5091832a7462e0f384a9a4bb228c2984c17a0ce33344b141b6048e61ac8658fc45a9f433d7162980f1a589251e2ec7300cc34aec44b21733304ea2fc80f2c587a53058a8e2f051a8def051a8def82854fa28546d7ccf42d5fb28549d856a8d8fbe651c0b551b3efaa6712c546be058a8c23c0bd5978fbe751c0b551a1f7d13712c5467702c54492c545d64acd00f29dd968fbeb1702c54471f7d1b712c54593efad6c2b1505df9e89b0c8e85aaca47df5c3816aaf5a36f248e856aca47df66702c54451f7da3c1b150ed3efaf6c2b150e53efa06c3b150ddb48fbed9c0b150cd3efa568363a1ea1c0b558c63a17a7136b8127783bb81c3010750d47e9a4e5f7a2c424a2925f8fdd10bc8d659ccd4c6ec6a63a4b075186a7466dedde541e3e30ab8daa81fd4d7b7519793cfdac3e1861ba5cfbc6d53ed1cb0353488daf86d72ed7deffd8671edf96f946bafc66fd9a671edd5f030bf715c7b2fbf755c7b347e1371edcdf82d856b8ff45be5da73f94d856b4fc6b73ce69da003a9d4b6b77436f4a337fa6dc4b5c7f25b0bd7deca6f32b8f6547e73e1daabbf91b8f6527e9bc1b527fa8d06d75ef7db0bd71ef71b0cd7def65b0d5c7bda6f3670ed65bfd5e0daa3bf39d71ef69bb77d5c7bf3371b5c7bf2b712d75eff76836b8f7f03b9f6620e2650d45f0de66d8d00e40499f2c9f4cb22c9970c86007f00fe5e4086524ab922e805b44b8f3de30635afecee6ed92690b1a3eceed28e72cad41659f22023d3c3cc0c7797f8d431ceef27738a5a481629637dc9b9bbbbbbbbbb1b45325d19b3d544d74d7dd9f562b7720f3513ada4e535b10bdbddf52236ab95b070edc5bcae954d53e1364eead46ec7fa6a41d4553a74edfcee882e2d7429dcd0ee6e73432a2b2ca396955ecc295d42d0ba564c589731d44cb4929673a89968252db7296ca1466f297ab19118204d1a33f885468461a2f5abe465616c64116577a1019212fef8f1ebd6c6043118f47cf53ccfd5547c38a35b7e7995d2d58758aa25e3b32006af80a5b690c5ad7b55648c49b3f234b2582c5693b29634a2926d649655a716e16b35812e9d098551d98f6bd53ad7aa75ae55eb5cabd6b956ad73ad5a274b5d2b9d6c3599c0a29493524ad9952e89d4bb88b0690767e7d91ba7731875f15c4564111cda0487d552e07a75a47691e6e915837ca5bae7cd4834e3ae32259db53a5365acec86519c90ac75b1b2d6c5ca5a172b6b5dac8bc5e9d455a6e25a4e8c18e4ddeeeedeca204b1f06eb6c72e13861d49c43507ecca1203f7eaf9b20bf57ce75d338134867551fb60ee927501674a414b62d85d7aa8fd4107c062f0edae121465d3f7a05f60a047b0582517e57aa57d373d2b56a283215ccd64f5caa4e7dd8aa4b357d1804a333980c06938181818129952825d52a5ba6c9b6a5ed2315a6837c08d311457d817cd83b171236f14fe578065d3b4b338718953161f2f3e3c409948b857d99eae2b98c5c4598bd77f844845117928b35ba58ffa46617cf2ab40e8c4fabf887510c854dec3ce4a47f4071f2a10ffd32941f431f7a07e156fc18080caed21eb58ece0603c35b8c71376e5cf0617eba967909c4c1a7ae749b9e0d36f2336fc8e6d4db36eff284f086980010347e7e0c00c346a621611ef3789861f0fa64b607e5039b78477f3dc0f8e4b8528a5e340fdc2edc67f27094a9305c15352c3da3604862a892053230ac8659c2bc3019584b13357a585242128c34126af42354c14385118a3082f97ed2456a7422d4e843a8d15708bdaad18300849ea246dfa58111491919b451588eb870fa163129831b8589c02d171b02c46bb6a69bd1219bf7934be6af0f863444f37e429a6193ec21f3f22b3148b967b0e144559bd6732cd5a19bc3dddd25916a0de97afcdcbf6b7c1138e40260e67099302fa840ea051cb41deb9bc5163734d08dadb4cb55920e751bdd5582c17a927ca782ed524a2f42b697d2a3e2956b2ad4e824d40696951a462cdd8ef58519bdecb67034bc98f1924472d9a53143c60b8d96ee9770777761b816aa3538606b264f9bbcc0520357c30615af81533d6e8cac299fc74955fd80fc7a7fa17636382f2ebf2857fab0bbbb6fecde9035ed8e12eeee6e28e966e2289f4297bede1ebd0849e3c6ec7701e0032c8dd5038df5eb39e8bc4f00709d458ddebbbbbb1bd3524a1c5c27a9b1f6f0b0509d1fa350a3cb8f26a8f2a3b350eda74215aafc5d861a9d856a7c16aa7b757bc1851d521d6238870e51861341ebd7db0be7eadbdb0b357a46e4e876ac77941a3da4fb75a42b23eac106aaac519a4ea3b61c72f8ecf08595cf912f88542b9648156bb6a8c5ad615161dc55743a7c87030a24599d0e058a54c8c104b6626738644bb990293acf1448b23220d905d9ba894cb51e9a1b7e473d53d528d22e4947666786a5f5342a881eade78360905d63a231e153a87141e3c2f6cc1e1914449bd829ad954472eff92036a6cf509bb8b157c4d5b63e5c22d0b03e9c5ac2c6c5dddd8ecca7f6fdbadc0bc64b7c0aa610fc50b2542c954aa552c59e565ce2d384c562b1582c954aa592aa96aa1a35dcf3becf868dd20d79e34673bca142c436d9a09892404040aca8024152c4893a7127f2b0582c96647d9265e3b3512addb871c30d388012049b235865e84c65917a1ca88900417712a956daa4029136c8534028c9251026812e0934259094402d814a91fd0621371079761c7670e0a28784043b1e2017bd7016797653c723fe5c6d0e32871c9a630efd4d1d06d953de86149575da1482a46ce67959be4b26f78554fbc25ae91792ae2ff439755eb6c09fad1b2d37887abb7b33dcc07538b4fc7a76a53030a4bd18400d6d94acb1e602325af47c480283e7434a82f1d20b03a8ef0bc1a99acc6ba33467cd03426b9c98a9a10e84d66459a6791d7871c0d664cec4b26a42403d049907e0652ae5fb42c497fd1890f1c5d249d4c11ce3a92512fc49f00fa1be6d37a921155af20c86ce3383b1f3ccdedde5bb3443a887edd8e5854bbcbc1cfbf6baae2292e0971f7516ea3e305d49836df72465b30ef67077bf0824e227c1ece1462f095e977277bdc328632af5ebdb4f4c317d376e6b6e0acca787848d7c0cf3e28273045372d3434288989abe5dedd126fbde9ac96d5e5cd3e593fb2e95bf38b05ddcf45e1ad039e743741fe7436c6e238a7ac40665be4dde478d8f1a967e04f5cdfbb139e7fde07cdba4d9d0a9476cd06fcdee0e1c5d02e1e37b6bb6127cbbf466d723004f7ddb4e947d3ef016e9755ddddce64d413d09fa91d218339e566cdba829e414974b0f89cb6de6f30b11535f5c53068221804c71c4cc1791443f75f07dd464be65de8fcc9d98e288994fa277b818081fcff1670d4b14d14f097e2ca6529894986f93935360b271a8d8368cb8adb1c2d8bea286fea58f356a2ccdfeb53b77701ee8e16030967eaa64302ced931ad6178525f80f0783b1047e80a5b17aa0490f412b6c26ac11d7aa4a2fc90f89f9d23d69c44b7fbb7a8df51caf2ab690524a29998b326564a17acd116b51a3cbcfeac6ac5329b9a59452ba77493977a51c8d5866badb8badb7a8d1574a2925e51929657e7b0bb973ce4ceeee6aff81142d542d2d2d2d2d2d1bca8026f74833aaca12eb63519ab3f6c5953664f3304ac1791865d079185df0220fe313a28f765fe53ed2f6691f187de26a63ce1057d343975f8ab5ac0ef9d4bb00113e46c42e034dfaa9270403865842bd1f7c5804301884eca19b9969fe9650827efb08f6d45f120c720716e8bb9b6a22ec9bd80a6dc966a864ded2c86d94063e142df63aa53332266f462665cc28764dce14ca6834d33c52a5d8356546ea91e1ccafcb84a0f73b43259371d526765a4958f4892b1ce617e2b06a5408d6c4de044f0a580d454f9c41d4b9e2d9b56f8933d418b3a5d938daf2292d94650cedee526c77776977376d537777a6615768147bda28daa6f5662dc668927209b92de3a6adcc71428dde04dadddd536e8c1c8d5846edc5136a777793bcc6136af4eeeecdbe3d3ef542e4eee49cdccb243fb0891dc9b6615ef6f4b1bf7ebee4975e97619768ab1bf66172d3da43eeb3ef0724cffe43f6dba8ccc30aa546baae71ad69a5d1a45c1d1931dab6bfea28e3b80e891ded93042e3629bdbcfe2b0804743be4f78318b5bbbe8b76526ef77cea5adc11114c2fcc209fa0161f61420ae2125850a07c9a41729111a5942d239615959a22eab84dcb28764dd91c67906888d8c3e6e8a3b9c3d9289f68cca0d66f5b0ae5138d76b92636d724bb971e3dd0d9509a691b2712a55415160ef3b68665d4e2e2429a0133e38586a83fb931d2a5c7114cd9ccb1bdd02ba59472e79cf39b73cec92365fb9c2ca5cb19a5942cd8b614a6ac4840c8d917b394715e1eb7b5175f461f12c8dbf0598b0b3a713139e79c72a7cef3d4994218a511d176b49d94d510b6066266e6d5afaf63ebd7fa5c971d2e103750267ab129024342e4963bfd92524a29a39452ca29e592df6c08a99d6c5681c5920b88c6d278346d0a3c8dd25a6deae193e6c3e014f6a48561419ec7b06e07037e6c3c3ccd9da0359b6bad46694d341f3e69415a18f6a4a5a1e5c527d6c4ae79d105bb03bbd6a451326d0ae2534c3198863dc5132cc8ce325a937813a378f6a86201b0cb346adba478f6e88298dab66de354c754a336536743638a4f7417949b0784d66c1e5db0a827b60b9b9796c9cc2a9e8178353c89d498578197de294290d9529cb2da52cf7e9560d6944645e496f3c268a66d5c274aa92a2b2ca316192ea419345e607c74527205f3426306c945860d35607466cb4746cb886565b69e5da586bf304ba7552a3545a4f3ec9d7b34a2ea026256c76d9af7cd882a8c05a46518ebd9e9678314bfa84355364a2e4f7d3e5bf93c3bd601d1f2d90a0d25196f438aba1b83861b2d9fb5a460c695aba5a9e197a3b7cfd4d2486f2108e1fb635fb992aba5b1414a395361d89868b592ca1e3b4a654e02dbf2f269e3a8390c557af4f66c7072fe8b20a18f69b362f86b7e2f36718cbfbef0fa6c70726c7072bec8d9d85d179faecf062787c17d1b9c9b57b10dcecddbe008b92e1b1c1d06f76d707618dc979c0d8e901c46d5b7c1c1e153fc8f3638377cf2f1fbdcedaad8e0a818dc0fab0d0e8e0dce0d838bcd605b1e6a7de9c590f482097313c3482cc9717cdaf99118f4c1f592cabe91443a4d06b9a824cad5e7747e59519c44d9c2ab8256bf2c2f9c4461c2d58429a5d740a8eceede39e79c3d243bb5313b7bca39274b29574a1e2edf73065c04b2344a184562e23fa013999ee98f526e76f2ec8d85ca7fc518a713465d3a6d6ac2a7e93b2b1ed6d5c3ad9ce76b49cb5f4b1a95edb0893ddb59f2d94e4aa751db109bd87fec0459ddf0e43c0b7976222dfeb6a030767e7a327e3914e6ebdce293cbc5844d4bb225cf9e654418d5398d43b9c5275273e456bf36a8922bbad798b5a6c8a6146bcaa705d79bbfa8d1e9259a2ea5fc62f7f9d4dd3db4f3abb5a24b81851acec8c002a05ba874ccf735452e15cd0000004040008315002028140c8904a3d158220cc30f14000c7fa04a5e4a9e4b234912c3288861180621428c310410800c02244684510ab0cd44bcb75494e6a395323f1242c8d26ea29b70a0c2de50d2c2451415b9436ba1c4ff149fc08987f1c758633c93341aeb21c2a3dc5602a2f67bf5c9cc85b071a453bd802191c9eec3e5ab20e1c760bc5d921fba6cd754c0119fadb44bf87f17e0409731985af1f9ca06fc5ea0f7713aecf3f8d1bd8db12002e628381f4636a93e605fdbb45b749efc4f5d487db562ff2745b19e946331e34a2a907b7ac1f29013eeef62dcbf3151f36f912e20aa5e785a016af046d5d7f226dc209b1d7974b61492a1c53c57d56134cad353085de2b1118884fe9839aa32f61c1d76dd12c6464f21a5a7fb4a45f9c96de13e7728e0f11804096954e5d41d3a07f0bfd96e6e946946f188438ddf2e9ecb0c612037bf4a75e207b992277418640fa738130e52645381db1ce285d699f865f8f00e6c43423c41d2e186fca1de0f11a87718075bc90076d0e22e2ad98cba4f0b7d7dfa6a91ce3a06b24eba040b83a8af0aad2d830f77565a044b63c65ce71f82e3e69821acd613497f32be6a1cb5210e2d7e1387060902e915846c32759c16cb06fade99ce7e031edf366f9316338814b9c27ba9f723607fffdb20d7697e806d03ff8281bf6e17667e0e326ebc784471c9162c13af3e7018b69b6855ed0010356c0ef32c606299fc62a456ee31dc6325199eb0a096cc031e4501dc42a8393a9e53019550eb00bff222475e1f7d8a2933ded122d671aabd2af02062be6a23eacc0e35bb67707c42746240d8e69062120a490556fa5d1dc77827b0f3e764b969cc389915f91aa071f30650155f18444642c3e749857c37cab1e3675f50a85de48104258d2c9b0ba97bb00d894f3dd657f4eae283299614ec45fe4e75eecd88bc9f89a22a750f5b4493d8b7a8f9265d7b5494aae87cf04b597f934a9297b2ba075e9f7c22add728e85c6ead5deb7455ba9c50dfdd2703099e3f1ba7c2bc0e68aec0ca1dce2aa5173c9fa41183eb22e0519523743e24e5d9938bcfe920716d28de2ff9b5a82c6df67e5b446cb52b8815614681401a96c769b05f24a809823411f42eea8f2cc5cee05d3e7c9a9d750991e97c8b0d10e0c06f9e0fc35dd602337e102b91d57f639ab8f5db125692b816afc4b6d57b3603fee17e2ca48160ecf4e9a96b6e54e823fa8da293dea0691557ab1e68e3ab0491f8cc45bdedbadd704aeccc82218b145a97b8244a54af3513c8fbb91ee012d60ae8ff51267cedc61d30389f0fcc14f691efce63ea41b19e0ad61583edda3398d6bad30dd635ce744170e2c1503c9201484edc9d07f5ecdd51bfe7c6e4d3934ccdd829e125f5c48a420c743302dd52372b436b1c25b3a300e9febcad736805179dfbcea107b259bffb0a36ddb77acd4cde707d8d6db7afd7296d7f549280201cdb8f31b982bb302d5d2a7cd61678df09e5563849448741e3800c670eff6fcbc50caae9381186f76357448b30aad2babad6ba030e22ad5c375a1c72d2f6934067a32891c352c1009285b5362035beebdc36c5f1dced529a39f318909ecb978926bb0b87e37751543f914671727259cf340ef4b8a1be4c4c5c06911fbd8b850490367cb4f723a04c62500b76630eb1b1bc4624f343bfc985add251f35d35551372aa9e91e43ad82a0ad1764c2a0db68267d6ae1023f0a24ddb35dd3aa8d22760d856284b592b95f98ebc62483ec421e3b45c00d1076f5a1097efa45da4b7fe61e4fcb362672c8ecd664fc2d10600e4933c65520ecc624421ba5f87406805f596844b8810f87a051b44d7741ee51f03b4fa34f1dcbfdfff601778d553997a900b22419296875fdd2734c7464e12002c39c91035ab1f10e8524ea9c6d974b2d1cc875dc579a7d521b009e9470b28e2fa1e3305184522dcf3c70efd24c1b81caba63e81c066fdd00f68bd7ef57d609d2ee85ed2e208689579668a23a2c6c0d62d0d976f11ca350a74d57045e5dbd81b35d90fc10fca92b6ce38b96d71390ffc6e4073fb5ee22f3bac238a8d4ec520c0c570637d5024742acb1562e100fa7ed96b3b9bd8186ba96ed068cbbfc415aa5f5f13405003de21c1e1f2f003e175231877e910982f2166bec802894176834cc3db0d25a388e4c16473603596314c07ab191dc92f2d7dd070d00119b2ebf1b1721bb7f6b04e50d07ebdd53905694181252501cf1e3db22856cc9315e9bbe574fe839dc105ecb9218516b9685c105e0b31e18070d08c6569339e8239c054200334c219a6420599cb300cecde8f46ae123aaafb47a08c752cdceb03c7f2580cea2cb40fd64c2866b46e798bee9399474ee9588fd0a6b826435e90a2d49d0e522c604025a19cca08e63940f61bb424effa8c1152eacb31f3d84ff1094e29e78572f699485b206135a6ce2969537f238451d28708ab1f349eaccff0eb5b5eb5cc674113fc82c8e6db9979fac6ad477e0d3d9c036b56753f40bcc2b3fe8098844e64dd2ed4a28473ae56edad5627450aaa2464f62da83ca8c3f60a73e5391d4f14e06f076feba0ba4262a89daff6b8ef06ba65e71127dce11d281a5d8f92a6ef78dd181e625022ce9e46f65821d623218e3158e0e2af89c101d73b02a9b300ed9a4f507fb57e798e54680f305f8f120a2373857d98c7346a6bb50bdbb839f0aab8c8c8cdbfcf807eb48dc590fc7abc6e1daadee0b0ed64d6659a0fee01a799d2619fce2f64fe0881b8d93c45e2ed8ff4b55e4a200e97c3983b8c76b239620728b162b6936d12625c26555d51715c18accb8fae0cc40fcc96f4022e0bc369c32a0347660a27521418309e3c4429e431854c3cc54f060594191773627918b9665b973982bc93b98cebc2072d742ecbd6af104321d7b676dab9d8b82dcf3f4404b490a44f36ebb487337389425ff42047e1c72bdc227ff005e7c83dc3727676fb1d2a50d1022b0626969e16373af3107311a69ab722cb1981eb11a1320230e961a098dcd83900ac04514973fa515e1c096c31816fb12942ba88c58a968c6ff900628ad64033e64f4effe9c895579a6c99cb4112fabb4bea3b12689bd481c20aa62065dcdfc0d0519f6214a58dc37edd62058bfedd568b56294afa9d7a3c2b865f2bbc1d4acabe8aa100039b374f3f04fd89c1f15d00b2f552dbde0eecba303b3da2006b1eb28e125338e598f14db68a7e9e1008a9dffb1937d32668f718299e1b33ce8606a19a8d8b51580a0f2090c180b9667b7332236fc0fee0f8b4cb6be1ef2e480cf422a2bdadf45aad820e26b37cb97bdb66fa0165cf69338797228e242a2abe26bff7f135bb60585c233674b00ad3a3a0e07167cd107cbe95d1128f3f0f94fb1a8436049d25f6dcc4b7fc325885ded05d3a37e3110d21c2bf14f86bc4e96cee25fb16ec8867872f12f96f575c8a7d3658a0c110ec61a9dd8cb874c534310bafa274ef15ac5bdb614fb59cf5513641475ea3abea30d8b0a14a4381dd51bbae58c766972989a1b09fe14999bc2c4b2a282235d3f83eda30879d7d368b91586d3847491fcc4ec840b8676627dc0675305a1bf53d1bca8f3ce9079e8871277606eda56b281bb6204f672628ce7075314904737773cdf4eb09c6411509f48a6bafd1fcac97c70cb607e343d392a868e293323828e4c826500ef442bbd03ed21fe56854293ec6c776a27cfea44663ec8bb9f2685847cc959e8dea9fc6550cf949e5f3008696c5f60d77b5cf707ac5bd35013932f4eff05838d58748272fdf3fb988699563cebe43fdccd7500fc21124e66cb4203af4e869649c3c41b23d6c7f553b674b3d274c977599f63922c11dcd21a8f5905247674bd6d9dddc2eb879819a27788e0d30a895909d69eaf784d84fded8e932d41853447d1d3320578d01280d4fd8c276b06b1bb9c27f537ecd87c07f0d2736f0c27730c4dee48feeaebb5eab4ef74bd0973557ec39bd5c3c7d69d1916c7cd3959fc5cb370cefdc70ea097173184fae39ddf9020111abcec2280f51ba0879dd782eea52cf6d6d662a81ef76007a8d2a7e1451f84d781755c6932b1066ff2f9f85fb9481ecbcaea3a5bf9f845d192ec676838ac86ffd4e062c361479a7d5ce99aa3bf026e66a5a6299bd5a39e9820c57be41b9d04ed2bd42bf5e139aef88f9d93483086d85dbc9ec2abe45cc8e18f58959193784920cf7ccd3c079844284082e30da0cc8213244dd5f9644d27a88713481f8f533d309c9abcac91371598e4226a99b8e05cfc165af81e140046592536fc61a51bf76090e26341df987e3c68593b5efb05316a69a49d370274a5d29bc93db1112dc106e01a3f032a105a00fa8a3c14a99504577a182ca48efbf48e6c6006545990344864ecac66a95d075523652ab84d649b2512d24944e940d6a95d0745236d061f24d38c1a0635b39dadec8e43b0c52bd29da5c9dbb9550fb1e641df4338afaa65354956c5be61f8aa03f9b4e78c058137343b1269a116cbb313d6a03e037f4cb9a5b795e33afe4929dd961fc7300489a269c514fb7b262ad3e946edb07fabd5e83ace982ea445966cbd5cc48b3c6032455cd6b894df179dbc7c37f3fcacc443278c231b57987ab8702d7dfa3e50457b4694daba4fd310c83423e83b42a6330eaa88808ae4f6bb41ba9be022d5702a96d1b9c694e8d5d0aa0316780fcf8625e202d38acabfe5ba1526802397f48f8d6992ae167ff680dd3c39b6c74ddc1edd033b8df471e2378d88910dc0b1598ef8c2f46d1be2053610f7cbc48939266666a9fee0d7e95bc32d43fb69bebed33c0d73879e603ef8cb6189a268557ddf11eac865d4d2ae5e7f9d895f5ebfec79ec3786b87738760319b33c1f43b7d1ce6c4009edc5d4169d0a798d0d859fa6e6a8f73c1b2a1a78b1e41013b60561302fb56fbe59eb919a539ab1d72081e2df8ae420ce04151ae4b94b416f57400bc136b73fa9fe52d08e8e028777e4dcdc7ccd71d9567dc6efc6eac232d49f31fc6dc280fbdaf6833f76310b87034339fad45334d8bcbb600cf5c4c7d84d19c9ca39aed488648320b5f325ae4d5a8d79dfe59c96bceb8600cf8e5d0581006d8b551656665cf37e6347dd760276846b6ef3818a5ede8d0568c065e1fcf66832f068dfbc1636bda46d3f0dc39be2419a0110f415603b878b3abbd010e8426fdea51c968e6e3314f6d7f4ee237c18d5ce4f27fd9786729d7dabd1d089392de2f0753b2b6d29d63e8d1b9dd362bfd6a5f8709be8c80b086b675874608a2e884de08379e6e3d733f58e2850fe92219444227cca4cfdc9d8f2061e23428cd12ba4a976e292cf4aa18b25053979fdacf464f743fe355905208259a7678497ee2c64613fe2fe7f613bc2aeeca51176b877d10766a895b5d9ea9a86045f3acf462587a242519ec4096606d3b59b62411be7ca3a49d23c207bf871db38fa7c438bd4ba80edfdfa476aedbbbe16f49807f5efef9d2e05dc515826cdaf8bdbc449a71e6e80880d7b3e5fdfbb63e1f1b7a82c6b3b737ce40fb511f1058fb66f71774412a5b93a7c0eb5d766c5f36c94dd63eb929a5daf2a1345d3154da51521efdcaa24157000d7d151ebd4488da1d1de5e6b9987dd7560fb8d8583bd6a4dc31c41a6538c7c69c49ac8d4f4748640e9b7267d3afdc47d6fa204176d8287383f491a2d7a3e563c9b12ed3989c505fbbfac6f1de4d34cd3ff00b75b68e1fd6049cbb5b176511bcac83b7932c018e3198a47c1a5023e17cbc16c77b6ad3b2db1f413c487345619974028a279b2ee7777b8e9472014b4bb0d3a6c0312b1f73ad94843ffbc255690afd768b4be524fce975b77e4b9c3f43ece17bb09ec88665fa17026add080cbeeafe00bdca2532aefb6a7fc7153b1f8c130e0d0fa282669c653bb28807d3eb2f2488e81b37d03ebbf7e09a934f435a8755b1855d7fce954d2fd771b494fac0f29df6041bd79c75629bd7372a6b6c1eb636aea57c2a2fd18e3b091fb31fc168729647b10fe498a64c94c73a3b187d1ff07dc7bafa73176aac832ea409086e458163831067a75761f2df90cbbeb01e7867d0b9f82a3897fa97a0395d3bd07702ec2727c85b542e223cc074ff78c90a85f854e88942efa312ba2576e7e4059a162d35d4c097f183490995ce5d5b0fb25f6d23a63f88f96d81850397fa43c18d9b425d2ff3327a31c0fb42674314f71f2475553306a4659bd88ae7b4d9e8276710481f3e32744fb5be9f9be2f78015800e33063a3218d7be8e6542839e1827ece5237269dfdf1b413acc2b260eaf8542501609c08a5286fb373d09e0d65250ec20ba005e449aa9da5f12596ecd984cf84e8b40e1f307779edaabec7a1d0a1ac7c4961d35295d9bc0f477c0921ebf537ad5bd055e395d15a1e9efd0e46c8114503be58ff9190046104e492c80aaed452c414e3b5d6234954d1ba5d2e58cdbf323570074251cd8877223c9f3dc2ca156e8d8d5727b14afa90442eaee5c563175fbcc6a115d8edbdbd91765c001f76791f91ce6609638d36589cb888c5726cee6dd721d01600272a4700da80472d0f7b82f7a10c7672e22448f087633971a71c99bf83935f019f3caef3ab0abc0cdb58ad6ef7fda7bcef278cf2f0b1f68fe9c427c4ba5d9cb1e14330b2340d85e31d1964a2b09f371a0f2c2616a490db6ea0ff199e84411a5f71fdda7e91148b7269b842427d718a395b628e4fdbdb80bf2f8dbc7c1a90f19464fa916a86816020d369674c1039199c9e0f0569682602b8526f509f01cc12731b8063905cbd6c72a3bc26bf81cd612a61a434a591b37985dde74ad23e1d4829c0f09a1c9af31f50fb7932ef67de184afc6560c7e2751264999845806f4be6423a504860a5cdc85fb9194b0f1f7b817c67dfd3e0ac39eb8ec9168e75298dc583745436a5626a6e7409348d4283cbacc3ae1ca2fbc4dd8041e39377645914931b7dd7c3ef89971240d11e90dd0316b4c5f619ff299e32e3bca52c0d3be354247750c153aaf59277ddbdc6a4bd488957ac1ceaf0877dffde46ee31f5e197acba8064194abc10580636b6e80dd53405c09fae65c5753efe8c82e471c0d41cfe6efaa9cf0e6c9c6217c7b02ba8a98d8581141d34155c56375fdedf96448e45d11d2af377425b80a6e1685016ea06df2524640a108f632c512c902d9947abfde21c48fb8df6c415af640ef343a03eae88422bc54a767180c6185e00d7961f5ad687c8aa963858cde581078fdbaa690ca99febc210d2e2ca6854b993da2d0175349add81dbaf616d582d53da51cc3986dc3e351f6de7d0d633cb07cf1dc0da6d93705026437f1a964b42eab42f838ae36ae4d6f2d114210f00afe79465f5e48fd545cc57a5a54ae9e30eb548d2a3c266c9837a0e03399595cfdf4bcd3b18d9bf5377853be6425410d3fd930806c68f51b0a888c7b6d853d1eb280af7475b24983f26854cd090cf08c816535557794410e57047690bcf287bd553196dbd98daebff0d48cb81c38b7eca0d9d00221fc05353f433a07a04ee2f3f63f48316b0be1b3425202e3f51ddcb38df6e531c3adc1e15e9cdc619bbf19947cbcb736f04863ed88a8d031acd166cb4268506a90f222f071f5131773d542dc70e94c9f128a9cf3c35c27cd04f5b1424fcf1f36f29969c824600f6086a49a71d7fadba4c839484ba66d9f880170602cb185b68dacbc15b81a376f9b6c97ebd75f26452899aade3541ae39597f07ffc3648986a246a21b43d55c12481939f26905f5b12cc1fa610f09198d53d4d5cbf672f1ff013ecdf7388033b83d1f0942cbb8783acc4047f351b70454a32b958e647e8d15f1f984aba722cb2207bd29332e5d785ad52daea982865156a98f9fa31bed63a37b96045ac95d62cf59cc6507bcd8cb5f191a823cb633ae95754892c6578f3fb933ccb1402bc3dccd42be74c8873ffa9dab1b668597da45912cb9eaadaa239bc63af62e10897ed44205ff00a2b2539b59fea018cd6163ffe5c5b88cd00f477121530f5cff7ee560e4b4c0ec13790a675845ca370be000c76a2f9609b106e453cf7a013989bb6dd7228a2f4470779433360c1b201916741a72bb997b985c58c8d7da98cb5ef02bfc2284e8c89d532153e518a2d05f83c5febb0f9efc79043dba514695c2ddaa57c455dc992e18af6b8a147b5508dc2c44812b9e5219bbabfdce85b139ac1a5d62b98d18b6eff5052ed3a11921e5f40a93c984680e2c5cf19913c73bcaa2bf17568214ec1a8d3dce1e31d29276fa19066de4b5ab9b39e0c24d2bd3ac674d925a718992e05c72ec0a028fb5492816c9c4962b456efa79f3f958eca4c9a291950b5af01d44ef04df23d90a4b8a3e557e0488b9c6c887901b4293bfc51d42c985e5924057d9d6f3001f2e23c18ada11bba573ac9dda1fabf1142bdbc5a94f9beadfc97dadca99096e1b2cb04966f329b7f130a0e46424d89d7e64752e1008ad1a0da6f6eea2337daea8587f40c316e63f060ff7bdcdbef7262e3ff80c0ce12733844089fdd39f06c418745e71974c68e2265c737d3858d924190f616731cc79216ccd456a9b879b8f38f9cde109c0ff8066d6025cb88b7e47c0ce53f6ada887687774da510bdcac2977c1cffd372da84ecf48f090bde346c3e546974c0ba97a604efb92d604d2739a55c6273bbd20acc83767ad56a78e73fe50798a6582427928a2717b1a15f60ce99580647575918515017d7cf9726bd8e76c8892ee9661f7a6d3c36a7052dbe0f2e84b72af16605353db6fddd65221541905b0b285eb5650a724463228835d79e20fc0f0ccd5dfa6d975336007e88048320989265d0cf5e4f63ec7864e33d469e3108aea2eea5d8c2af909d8a2db38133af5a58a0e9d4fba9df1e5ab019973d83110e75b950f05965f3882776ee18b4481fc450f7048ed5d8fcd9ae3d3f80eabdcc6e926f8769b6946487f16b6c8c6b7b3e1ee83d7c4738796c3729b2d1d76a09649db661ae365e73cb7139bf6e15700dcd9e8e5b3c443019c8d1dc17cb9acecc4c7cbce3247d3ff9b72a9a2f6002a3f4bb4a09bbf776f175bdb22758cdf05ead861e6fdba3caeb0b52c907f0bccdeecec02322fc65efde44cfb9ff3a1bff16b73a4e8105cd64b05cabdca601828dd37e095727e1ae1a267a923113d91b6d2e856129a0251d4fa4c965d59153351b123a867d5e74b03a42a28d7719c51b95b82ac427ea0c8f6d7411c834514d61d090f0d5ab38dd005ee2c5c21c76e5e2cec7063bb1f177bad2802f9f370521c43891313a9b057e7235868c8f7f046b284722e3b8c9e2bd3a8afa37ba96f45eab1971afab513723d16012b5540ce09a46391cf062f08df205614dd3216a342cc80c41aa9787346ae8dc990af7e69469e476815a40e5da17e2a73da17612f22d8b941b8af1748004839548114cd16c0dc7ce959d3abb9711d03a274f6eb9d9dc09b30663945401cd3804eb302b934953a5b4628e55df737814fd1acc441939bb1e45ac9d66ec0ad3324d69b6c54f631b0a4b05a167b7ec1398aa6c543fed46891e33f407718c8ed2b6701de9a1e7f104d525440020b5b96f9b01b2a09276fe64ba1ef2a75092f59f1bb430a37373a638c6cd696f0fa20a042d3eaa8af373e4154f1189cfdc2979ef853c1ab5fc60b662a66b3ff06cef3986b88aff7f26558ba7e082c519c078b2013152571f007f814db37e58afac6ee6417d38cfe704dc1688d196c2151e906fa9f5c0693c4bedd0a1569fc40a93b3c1acbc94d6c55d8ffffc5ea180848aa90fc0c7384c3e78b5792660a726c8b663b2b14755cc2f8e00e316e9c98ad3999062c11b8dd45d6c54e3e3bb384bf9ec5f218cf019728b453687199ca6611df011500b9924c0367aabdca798136148dbc2962cb89162b5356399cab49437f56f8886328c55b2763d9bcb5eb680a4bc7b818ee17a275d3170bdc55d8f554ff296961449e5b04688e96697fa5c9ee0ae5f2208753cc715daced55ea320e32b528baa4b4d6f4677906e6aad7f5464d4f5b12f901dfc08f5d4eef11230ca5d637193e372006e0c6307f006ff0cec824d652978482a4ae54529f6927549256251aaf9bab89c31aa0d291e59e459b728144bde1d916fe188985fc8babce3a5efd23e6068d0f339440552a4faf3a4d17f259b5d7476d340a1da467d97b96a7b5bcf9c8eea7b5963f0d05f7bec3756109e2690e96067cec899dd0fb022f5434cf1370c5cd66012732911f24f29790e060d2eb05fa336ae315bb57b5101b7d3be0e28a13f98cce9b60c612adb84ead8823a5963e7168fbb33e69980339695fdda00b28a3858b5fd697112805656eee588ce8d8e62d08e72c3f85ad4469d4850a63fecfca2aada58ec46a68bf2b36b3a503894e6404ec52d8eeca51486becab20a3f134369977c9035044cb9d01a5d2f752999fb5797794f7a8b83319b71449c6e5511d1cca2a4da32857af1afba19994c6c23f1d344e595ed59440889cecf1e52865d7e7b66c9e43847ce19a1f182254db3785334ab70346c8852d03c2ec9258cb5d34fbc10b31605e7a261533cabf921974e1e4cc8caf855cd5161fafc85f03086885bd9b8f5785037b557aac379707f36670a39b68d8d27d38938d2364822db7578b81f65957c6dc66f2c1528092e51b7ec4bdd69878bf843e40432e2317d572b9931b75e76d0a7307252fe97f186f2ce597eec19d3d4361055c93549f7738b1825a1438e83c040fd4939139adf18566f2891d75442abe667f701d1e0fdee7765d757e57f827c65ba698cfc4090dba005673117c9da250409b3f56d9384da5ee655539c0c2487137bbac48098ed49d0672b2e73e37c72a5e31e388d8c9841833262c6cfc4c88f0814e2b424d0396bc76ed7683cc3a8461f053086c334b03000db96a39de560e48e6d7fa616a270b666fb60a88e271146025c91380490286557cf7181481561f4bc831d30e87c0581fb6e8a9fbfe4cc998a127e40c02581e6b84d55c4165c82629c4c8452186cac5273ca13527e3713358d1fe4714fac7a35f63132379bd224f6fdc6a133386a19e7614963713c65622d9b5cbac6ad06a460853fca804d3edf7e27e820ac3b50d954fded30856157a552af142855a528ce4b0536e9b8863cfcfb70b97e856842b6370f2851f84d01b8e4484f83a4098d13494f31d8ad02ab276edb0926167fe9647615e1500a879d9b5329f6dc4e00ee37df4207a4d5b80c8ee5080e177d80a4f8a6bbbe504218dc783c9b38b44a093c43ccea7d9a66058a4b9cab4dc884758b0229328515bc349981f4d1513de354e86be48c592c71904e728cc788e342881ec0bc212b1b9b7bfc046c37f9a2ba48ec462be26fee7b482acea415a30217eacdad90171d72b3dfba825b9a2ba7e35209399e00fd78693cd19b93c4437748307b7a574f055ac36599532047b044c4716d91a5681aef9480ba7649a23ba6379d96d4b6ca69067fa749f3797f1c12f34ae5c3362a23d0ba7a31b138a945e68f702d2d90ad1ccc98eceab8db06352737c6cf8a18763c51b1f65636591c8e9a9739c2fe1ed80694a5ca5f50bbca01ecf24b26ddfbc11c5d05a8f8d3fa9519e8cfea2fc85848923f2fef927ec86b601ca03607154a7bcb99bb1d5a21f1baf38064027f2c2e47aed6a040d4957d8496c0902216b118e8534e89a42f3d544e399809f0561cda3451abebcb3102ba6f5370844cb37616472f3b01e8bea9327b6ea2710f35b840174ad6e0a41df5caff335a3169a8470d979befc31d2afcc416f6c0b0228aec02e43532c88840be00c65e2558ab9a2829a378268e2ca0f5d8f0e11389f616084bf10d91a9009e0eb24716c7d934913543fcfdc09750712668b4e51f981a36cc19b2e13b1605e01a16b2f6b8ba81c324efb2cf74c0f4e08bddac58e08090196197448c06c4e769fa2275050006c39d91134eae9c3c9102fface502fd2ec880318f694753272157d736edc02dfcc125d5b2c6d6192096f30926df75a306dadc9e330a908c7e112d41a583d65f356da2e74d4a4d534b23103f0d9405094d6cf134fcfc6ba89a4fed466f60f3e943ce02797adccd3315b364d757cc9a0b2fb1d8a57fb575a67ca5c27311c95a89bd71de6672c18b88897249f55092c451a5a05703da0d70eaaf26e0262c009200ff200665f836be341a08bc6be912806bd087611594d74adfad301cb32c8742a67acaa43f6fe8e748ec8c9680d7ecad67c5a3a617b3b814fbeb800636e74a648d71bd70f6879583824a5bfa70a3b3578c9e6b4a9f0706aef7b8ecfb404bc5003aac670b1daec31b16abdd62061e87e8fc6360a482ca32ea5e1a015539ba29b1545338a0a8be3a728c363ca2840b7036f2a136279331ba9511a240cff0513c5dd3d7129a728ee5287a2d571071568112641276df7eb926dc3ee3e518918b33793e94726ab16fe433a74b642050c7561c6949b9fde6fa21e7dfb81b181af6e10832eaf4dee43c338e607cf9833ebcfb836d43e18d6f0177d8fd6633383d41b6403ee6ce0eccc033785ddbc89714e2991eb3066dcb6b24e87df4eecf2ed4cd09c354939983574ec41d97f218ab8106e64639f21390bdcd9c8eaa831fc7b5293f1ac2d1e37ddd9156844e1b9bde17bf2cd1911c7a4a15d982011eb263522484efe4fbbda14d7a1d0346e04d758557e7661c277c5ffed557f8284efaf8fdbc41087f326b0130c345d0021fc5c94dfe8e53d2de99385893d1953761c410f3a95599e4a593bec9bc60bf81101570a0efabba303de44c6a79d8338e11f150f65ca18cb09e44005e58f33a2c1e7bd4ed94f4ce0ee6e017da0c93b01638ae3895b2c58ec76d81e48e966fd5802f7ef3ca101f327bedff5b05879a1a20ce9cfb7db0a7c6caae100475cc8c2831179111c5fa7a29b310f85cbf80ecd9f2f4162864471122ba5d0741c3aa0d2e29f5d6b2c1efddb2b0452e559337cb53caa9157d229d4e415670b7c2dc7441f23dbacfea41103780a1f0aad3656ac47d26b37dde193a55980bf146da2819566e6e0185a99cba27db3e38e60abc58e78b476827f5b010a1fa83e97763e88214fa9c09de078b647ffe9e8ac244894ac3b75186c5d43e9b7239ce3a3b05015c506c08612b80defe8940c4f181c06eb1d891dc4f43ce23a70ea928c905b7378e63ae534998847f23f6ee8d35069b0dc4ce8fce91b69fbb82c337f96c779c24343cefef16f646668688d2766cccafe0d2958b775c7f9d7d7bd5c2ebd9c467845c7574cb459fe95472c8c56144f2da65622cac2168e775274548bff19bd8d8db375c5e361f6d19d2862a3297028a22ae47ba1577e6cc5e45d8ac681d768f3efe79cba3957be9f501533858858f8d8743760acb8333e77014d8959b809cd1054aa3bc62ccf13aca973ccfe126bd9c10e596be11dbb7ddaee697cb8350341220d1b36e185f8e85c78fedf9d1db18488a4ebefa082a1bf47f9b698dc6a55c061c5c14d8265bf4b547c113da9f321940366f2868406c7a5261d1fc9bb9b3f8ac2c9147ac5dfd328a2bc0f5a5d0470a96776836dd926b1f205b4a9a5a9d5ead0b570b3eff2390c711ae8e3c4fa1ee7e324eb64f1976a045929ef6924b8faca955a818e11a1671fdf2e499c88f974e9957aa9f746fd46c3ccc1c6dd937c75cffa88867006cebd6fd052659c2643353ddf4c0a7ab2e7a584cf2d3ff5f92af337dafbc1fbd9db623a3e5d9025acfaa2bccb649fe26769480006eb35eaf399b1660b8a7308ae01974fc248bf722fdfe16bbd5920b763b350c53a2acd1acdd5eb2ce6c2f0587c20bd66f3eece235609bd48dc5e6806b73b1d8064986730be3b1adefef5ad8dc084ee70fcd6434850bac3f94fda1f54388331e66ce138ab76debea01a45b9b0cfd8c521af3576b09eed505ce3a9ef88e24d11defefb6e479b193f744f478ffe751f725743f91a534e5206afe8d69ff7a6c4a7926d87c0052b126390eab435b3484af490112de74b8e3b34bfa12d97b17948aa3b1cf123c81bd124d3c68afc6b3960c1d14dad7bcc3e405e2a587e9d163a44e71433051b985244fb6a11e6b84b2f598072e8e057cbc5f62523cee0c9b93c6568fad0a1a9237511ecf036ddb1bf9f9cc8b4205dac84cf9391b304f8cd1ebbc94944dfe89fac1bba013d0e9f79e6586e437e0223d676d838484bf1edfb759c6419b35b7e7a25feb8a5542ac7e90342213125cfc1b144be2b31168b20f3b405084226655b63c47ba916de27b2a6fe6b147e1b35fece45ff13a57bd00e80d49584aa751e1947ea2ccf5421b3cf34e095e6e3114917cc5f80ab79cf0869f58349be42e02d4d64f10c6054f28237b4e29c495c5fcd5f3d406999d7f25bc6a733a62588818158c372ff5123f1dcae75183d4f7d071e1774a243765583033da85c4b92d8b0f914205ac7d965d97563d2fe2d3e1f610ace3d8b3541ccd5f7ea194d051a962038fe6d1f3c11853fd098c4aad2c331708133443e2876676ea05bcb7ff4cbd1bbde8c34fadfb8ff7155bd0f45eb2baafb9f64db94f9812b3d6ffcd9b88bf181ef33618f72f25a0bad0fbd27ad12eafe4a86a17fb44b90998d34a19b13e9825d2b9de82421ccec94f0dcb374474f478e50a7cc216f7e905cee8d788889fedd64018ea40114a0d7d0c6e366714ad3ac4f9f4c1dd61a13161ce1c0fd616d880535ed7f931a96ceaa135d9d4a6b38277a4dcb05d835db105105d00eeee78881a59b6e530726cccda1d4975228e01892c045bd430acbc83871d9bbfe2ad29fd09874483a8591922521e42c935355975a83c395c9008b7b235370cdd1873fe6556454aca8033d9eff85dbd96d7368002e18d61a81d12e85a069c9b5c57ea0dcafecb3cbf5972aebbd6270cb67489875bd1730150177ae455ce91e90d071d0f1cc35c165a3dc0a4fe92aeb10cee46bdc4a640f5dbc59362fe32fd905bd6cfe2563d356733682ac5e01ea5f5d60c1cf556003cf07474c1d1bea3a65430452503c08d05a563d89062af1d7402bb774cc5635c1e50583f8e2ce0ea06b1c2643a8c017b68468f5205b23f5eaa60947998fea7aeac0a576999f8bc251674d4b3799350a6fd6b12d2768e7a97824568defe26222afa1facfa515c2419c82d8942e50bd71054259dba631b4a6996872b42d02a60ab7a5a55619cc3b82319ec19d4fcaff1283647d35696282e3344aed218357a6ac84342536038cf3560e1a09874363b9047f8c51d29762378a31cb278ed39cc645e75ceab41e43aaeee786593fcc9685b255b31d535dd0f90d9a6a5ce9f86d94d630b924ea5f6f8851f463cb763b82dbf0ddc03025b9658cbb2955cd4813d388e16afcddb03c689c37740729a1a4ad47c7c64650e14bb69f2145267bdf8506581c3ccedc927c854e77a93397d5157075cca79ca16585623575da93d98d452e6584670f67905ef8ffa000184cea9bb38a820daacf094ae179d1d422346f46005381fc07ae703b39f6786a0299a9c49bb2518af882576d1cef2d331ac250837a0b856fa499e453abac513388b0eaac48ed382aec95556160d706662e2ac24a8220890a4c9fd2e7500fd222cbdbdeb7d9112380679b84f9a427f6a3f5ef54d7f3531edb07c32306a4c9f0b600183e843e910fa72a8cec1d2c059774d255065800fcaba6d2853f3e3980596ee8f37a4c7954cecabf7bc9a654bebbdd3be92d0df06934c155e0c9a12f817d5f9d99409b20c4ddb816237f105340fb5ad01714ddb9eb20a40d494ad838ab182e1e0668641931e7a00fd2c5121fa00ad7f079c2bf5bf4db8c4f0a562d0a1b4205f9a30a75c169de6b14a5a014cf0ea2a0aca1e0e809dc7d65316b06a09a5c3af095d868dcf0bff8b85f6073b7048ac41ff9a7b5cf0b1cfd70fa3154a3cb27716fe61f4f0401a66feb9fdb7a7dd04fe18146b520929965dc3e5cc72509ddffd81c1750288fd231cd9d97167a922fe9d24c56759781076067ed9071921c8e4d00846acbea36e14e09a4c49754583bfc3d01d80cea8d3edac187a6cd55ac7561638ee70490ca42bf807aa9e8305dab5cb90eb23ed2f3d0c4865fcc7d7ca0985def80c20a6eef09d067625d17354d27e37dc8fd29e28b8f445fbd216a981fc179e8f3bc722c604901782b7c339e761b94d0930045894e1eedb25706f0e43b549227085cc9ffafa4b86295bfe1950fb18b8ab9435219a1e6e2f4076b729237e307caf25d8583615e6649efb977e492ea62d00e3ec2e6718559ebd5ecc2b038fbc62fa7af80b4b4ff2a8106d275a0b184737c43e0232800032f01b86c99a5902c6b00a588266063d5889645c1e22ffd2f8911311630660ff5a6df460ab5fd570381436f6f2a1d89948a74024c36dcdad661aedbe961acc894818e4717e08b8280c35dca9aa9cb1a363304e81bb62e4746d82f6de046b812dabb3bbdc8586b5ee5570d461c6c2a11b16e707343df881471d7abc06d826016264aa03f6c22b81d4ff80ed8783efb25f1ffef80fd42ac632311b1218806527324d066259601dcae47f49aceb9077cb71404138faaff352f04b5d34b7487848568c3c2d9175eb2f6c2d4c7a1aa1ba2f17305205fe4bb8053c5c2a98be465e457e7fa2d1fd6681a9a1019af04c6eb9f78c4112690f5e90e2744e0427acdff4b906edb088a41f36e6b00ab651f17b4987b50c4923fbd908f94b0b4484db848b100256bb6400df05416a5dc65a8601e625e5775d8062ae9a2559ad39df1af684d3de9f1f38cab33eb904ff745e5152c5eaae8b5b474395b33fb9fb1b95b7b27c33b08974d709e8a2474c6ec54dcf52c5e0e54da16f2cb5e84280c4cf44c5ece85bb495d68807a113fc92148b4aa71934e63bfb9d11fba96f94459808b13f0eaa5572eb3672591a7a525e5bbf61518c5f12ca2c220b2a754559d527707849986e0f4a4b4e2c496edd03cf3221667b96e6fa79eb7609b7241e7fb3ac34c0346564098c6c2a39ce6ab74b61014e7ae60bb93cf23242541c5488cc882d3e739b5cfede65bfa4a4a908737d64e8bc20e24c122d2961258012a3fd40cf48d095cadff3cea316e9606d7bd34b55c61fe95193b0388b6350e366e83fb1b08f0ed28a32e2980d25737b68b13d984d40ba519284445961e0ef023cd31532870250cf7129e59119c805f64c8e556d49bc858ad8a811b02c39ace0171584597bbc3794d154e336626972b2cab6468cf98dc9fe3b495185bc6acbeeb9ad3b57068f0b21447e0ba766a855ef4369ae78f3fee32cdcd12fcb51c5d14f6746b44d25a380c815386fa7860d366ef8a66184451e00c16ce7e0417997811516afa3b62621f2812c35a44317cb00a7ed69b54384d20830add687f7115b02cfabb065ac6c2b140c10c0d64101d367437e2b0836a0139597ac8678a7c5ac0c7fe5ae4b103f4587d56908e3e706ed05aaa282c8034ddfe185296cb28199691b300139535b7354052f965ce15ce1f5bdbf234da7fbd5f6caa01a2feebe98b05f6f8c78c8cb926e93e62d41b62bfc0900b4211b8bb63016c5c70137868c0d0fc3b92d1853dfacf83dec97113c0e88e5d753b163aeca16ec125d34a2895e84812a669e4b38e348f2d2e6f6788098e1f61f7ada5cd4968bce4b7d7c9cd22194092fd4856a1c3b8700b24758964f34424ff037a7cd391a9af2f99ed12fd82af513e958309075b51184123b9d350437774f844860e3854feaa4104e4ba8f7132ae8728c71d7cdf42105778bbcc3dc998b4a6de50f2d3b58bd5811e7439a582e44a8ac55107d57eea4c1710314e572872ec9d02282ca28a02a70102f110d4c2e8012488142408c9f39cec14a61674817099ae9c82996155ac64def76a16ef5eef292ff4bf65c60b16cbef457fa714d070f2e797dbfcf9b870f455b69bdf19e270e069c0b498d195c614f8bb0312e2a6f4a9aaee5c5393403b8195dbf48582c627c4083050583a8421590b05f09f1e02c8ef63d2bbc60f9e01e1461812c872ce039789e12324bb5737600fc0935665aa846b7561c438ca042d8e2948542060bb67fc0305959810c8a53580ab83564dca85f13516bd8c806e2b34888db28012acd0bb7f3215ba38409835d4016c7fb6d403acd03836b5e21e7a76f8fa691890f8caeb19a70a0491296005813e6018b8e00794541fba17a384b57e1cf9208e09f404d53db31fe36ee0efdfabbe50e2256cf30b186194e4057db4c29e0294317e5e9c2fa94315d4403aae70ea0e1819d8852f543fa914695735fd54eb1e792db5d8fc7bee98a49732fa4ffd283506f0cb1c82d85bd343125f99b0d92791664e406d438ae7013e69403bbe2012d9760b26e4971526996275af0a07d123f3d6dd50d32d84a1f858bd5537ac751771203c55de7a49a43bfa9b591caf477a5b4ab6cd1dee1aa96df908266931af0a9dedec5684c7bdb6e2b10c6272584bb1ce81abbff3a9557ffad083d80e334fef5fb1651ddeffa87152edee7fe5246859da2114f47cfb85904ba4921d4a44cb225fe036ccd86fafb96ad9c4c5764ea295067a87a8c786e9d032a0b95272d3d03074c7d9f41fa0c7127bb9d0365117d23c045b31c64878b98915f44c29f3e83237c607a99b6724ae6b280f4a54ec4ab7a4cce8f2a3656ee6b1b7a60e1f24374f9ff2d7373258434d754a1597d4ae0cb309717fccb2229110df8e5bf1a82ce24369b9549eb23465f6838283c0d4d0e482287454ae9c2430cab0b664d8748885c4704a734e926365f915ecc20cf5dfd413c170c1e810886262e07080c1710fdb850b139a244a77226f47d1ae5484f8b34c357ad152ea0a05101b0ab05aa268bfde8917c508827ecbe5cfa8815e29bd9d806829626b76c5a4d81db1c8845c7fb138f34179a3af810e29084dfbdae0cbb6ca07e14bea2e377ebf6ed508d21b54783669d2f6714f25c5a25a70b6b70481aa94b2b0bc03b574699609033b9c06280e3a62fdcd49e91a34e11076a758a66ffe9851588667a5514073ac3f064eb094cb9ea58b95eaaa5d5d408d6a727b36af2ab644ec76026da64ec49a38ec2737def2e20eeb43db99976891934b90749d8ad5608e11eb70b331a1671f76e63834065421881d9d5f043de19b7f9ce5b3218e61d38a87c2e2acdb96e7319b56b7c35a95d3199554827bb3f825ae984d2caffb80f625deb64c317969c2a2ea0140e7767a4d398ee1004048f54d534b7847801d97a0fa6a885bdd8f6de87b69049db647ea7e715540e8be2e9972207c9e7d8d387daf5f218270f8e91b826fb782493107e12ed60e32aef9db74f0be0566ffc60219f526b9c8d83e4adccd95e9438169dd85339459cca85e7127092aeaba033ebae6ace3c785b9d6f035bbe635c7fcb8dfd97df5a9c46d1a433607985fe622213220245682322c987adbf4bcde89d187ceedd9bf05187398425fd2a638d79e9cbaa603d60935987be9ac13be05e0d87d81dcb957f6840cb874c5f4d369a2200de9f5f5d22d61401a9d2ede69e37ee8dbdec83f8ef6f25bf4f3986b73525f972c70fec773dbd71006108bec2a2a4117985bb6b7a50c285376076f27b921f1089d14f73b4db4ba3dbbfafe47e8b420b6a5f3b96c5a5a47a40e73548a35ee306539e16d3e953b77dc3042e6e92cc0ff3513f7dda56b2a8e3234056875238d413ba4ae686374f8b7c74a4e55fae30e7b1c5da710f74ff14af1506c1a7faca12c84443784db832c8f563ab68ed442fb8e8f63f527fc95304a5d9c76db8d2c84910ca3dac78183c92012506003d4dba6a1c4a9a6fa38c0a65f6a95a16cb6f0edcbf554a9fa50c776fcd30d8b59d24cec127b1a4eeb30e12d9443ddf2221497cbac1c96eeed145f372228506242c322cf5ca4e4b5262197764e88a597d217949b8ee25918b84ba335071e0b4ca0f5ad2c01a50179cce12417936e6ea7e6acffdc4f135d2509c40562c41de00a4f2a300676b0faf8ec3b3147d3c2da536bafa72a3ba5aec7a9707dc7212d1ddfd4db9f2f10f5605a152693127616d63e2b9fac991e6cd01acdcfd7267ad816b90ceb83c9952b5a97eb5f5b569c98781a4e3a75b12df8836d3210d66e61df8ede8cf686f8654cb665ecb51e4aa0f8512a7d6d6597610ebb224ed0e7ca1db31a802dc5f0b73d80e6a4ade1f2d90d5e40fdb10953ddfc1170244846970c74c43d5100da72be3784e05c24da52cf5495b41a61945d18709e442de6645ac2aeb0f42a8997905b9c100648a73056d6109006dcfeb08170f7849595574bb267b8a27db6126f7f81d64ac3d4caec7f20ae3138585a1c1c06228502bc852026c2680ddfad9334a72649ed670dac5b5dd24648b6bda39a9f6ae6999ff12e44ff235470c21c5f693460f791594953fe74a64ddcf66cf1a7529805de4abe906a5d73840c4d03fb219f1a5309cc72d4927acdea1c71c01cc78a43cf26584bdbfee0eb94f5e0b1a1f12adb2ddeebb9a836bc5e96bc0562f3308ae918e22d05ab65366bdb1806bdc32fde328236a9e20291e980a79762d639d72c5fc469264effe97ed6c6e571d2c9d8168764d81c53ef45c1a610fda46983c61d9ff180a0abe19bc5de7ca5185d802d591004af9667624ad2d6065bd32a67eefe661f8282df339ab63005c227b378e1bec73b5590bcc2703148d50f12f61e068af404cf0852008e1198d16e31b312ab659705e80ea9b1394ef133401c4e782a8537605342a1dfa300e049f6129547a4045fb652ccaf8938da8044fb7e36d3336cdf55a6a70e4940e822ef85bc2f6257b0b75b412aad99d694462e4c2201c0c3b6e7b192234d031058d3251983d99d642779048a9b3d44cc5a820e9c4809111e50d6b2bd65e1ad442636148cef609da3cf8b038ea1faa2bc39510246eb5f72625b39a934d6a9dfbebbf408595c85846ae1f35422a03b30b492b3c3cf451f5a30424811abcb360d2c7d0a1b2b4656b71fa0e9c193c0c5d44e1113f5068c11201a4aac8bba9bcd7e31eb74549213bf06b5affef1a1589944cf84e3889a0f430de34215ffcadd39c7a4ba01c3fd70a465db505414b466aa6630182aec4dee43ef640380e9af26fed3a5920c00e6b2e6b6c875a68254be987d2e2b4cb53c58c2df2486b379101be484979d025216c1f1198b3f0c4ade5ffa6bae89df34e3667ea89229516b4221842a85f26e6ffdc931b438050ffd301ae41ffd2f6e18b2ab35e64271eb2f655e0b5c7cb42bf0a2adccbd0e0612d6833ddf7c1fb0677ffe12655d7447203ef72eba54c4f9d46ae16070e14b950c7ae3b7f6adf71659993f80ea52eed23b4edcac2f2b60e7a2138f474c23e9dbb68be4b9a7fa3b60b1adf1da12973883a89c38b12a46bbbbaf422758026b983ea83a74f82854c69295243bd233a88b76e8e06581a72e40e7baba820d6e6b2ea705bb8b9dc587a5887d99c516e7ff56368578a7bdbdfc5dcfa1f1fe6044d4746d89192548cd437ff0d6c2c941773301045afb76d3c137d3d986675ec33ffb05c05db67f8b3ed998b2c11dd0da51d42819e192d8f152ea8eb3acbb11d8af6d2d668a4134ee99196a5130409feff57f65f692ba8046c2e8f54ca841caae60bd6634ea4e478bb9cffa53adbfd5fd55dddfd5fdadde9f6afeaee64fb5fe56eb6f757f57f7f7502bff062082e3b2f6275ebeb6785bcf71e66fd5fea8fe8f6a7faafea7ea7f55ff57f53f55ffa3da3faafba3fa1fba9aec17c861ba09edeff134976cd48567ddf32b9eec1fbef932eef994771b675ad833a5f49007e9e00a2c201f190c4f6497eea288e8ab6fa9abcd7903416360c5e2534e20da7640cdc0b117e9f97da60fc412cb23b07a17ecad55b68e4eb81408b4f78d1789e80ad6b32ee363ee077c88e1610c713b8c1cedf393463120f036c76ac06df4e726cf9268f95b80bad28ba6bd4b37a4297947e49b3268da080bdc32c1e5f44aac8fa1ee130213af42320399fd8818b0b121afb301aa845b0f66ca1adec5c5df676ffbbea9077732710d770d8efa3dc4bfc19ce7758b7551964c327578918471414208d0c33d61a8c26a4af4a195dd0dbfc4674a0ab8ad1106f3b80e0229eb2d8b762b2758e106ab837175acb365a9ec75c7ae10b05d8f311c6b01ee882728093ff4b3fe7b542f63910a8a7e63475ea70409e76049040667ddddd2584028408cac8c881b68fa56383ecb229e3d5b87b55e2a1b72a003d35c997328011155069ac19823f52b831d61bbcd1181e3c52b6122be198e118ba822052f07b6885e48dea888879c929276e24e77b6d43252facd81070bd7de1a8dc7effb346b9fd090eb12662ae060042a4bfe6d6c186587966bceecd523eae18bfa8d88536a4bf8631fc55883849d221ccf8128d68e7b8892ea6aa829090ddbb01a283c1ddcfa27a964e38c7714edbb657e1622a3c66f24e98fc3477eef78c385569f6dcb529456499b836573a2b97051fcb9c1bfc2047204757da22577a2141d35302835205852361211dafd8d871e75683811539fd4443051f95963f8566911b430f8021e5338d71d82aad44db1a6eb02a5c49fd3927e7c4ccc9447deffd8b490e7fdc6850e8088d5e724aa1d8551ee48099db43acbcb6ee5807e03edb1cec198773fba20eedfc67801260c9b4d4ff6e19d5eb911af10088f780034afea438233b9959c9066af92afbbd0d189888cc6dc976f18327e026423eabdbccf0153dca3ba15df497fc65b502ad1e9bf761823224e84d0838e1fcf5125835ef80f189b661786455b5f8c757b0b176be473d31027b80c07461069b10f3417fc79950f940bbf11a594bcf7bace2efa5b635ac9179822c2d7396bfffe32861446b8b5349e3da2bcef04a0ea8af384317c275afacef886026bb72336e41509641c52e62b7c7b996bd2b541ecbd78746fa5981cbf4a18e04ec7b5c85d3b511918c4bc3a27018f19bc8d067e0a90fb0a938174efb0c372c0103ff29320dc4db6d9358613ae6ff315a1d5248da00d32ad9325dc1872870f327083c922a47a042d35b2dc116c62a2dc8fe37c2bb261566832d86a0ce2cf0d3e1f81173f22ec545f95006002ddd24d9bb92bf8da949f12a7eafc829dacff1d2f3eb7b238f2036097a64288b8d888b039363c6fd61af9b2615b035ae9fb4d3ad11b119e0c622d629aeac247f00b9a8e39e9c94b46df4273c4c11b8cbc1f1e3daae0fda5957650a208e46b69e6b74d61b04a93d9806f813aa6245d5d43f9549a8f9cf2364080be466ba3051c8c5ade01ba5997f370d9e1e4d2f64d7cbfd50dfba11c051135b484ff38c8c23b1ffebe4fcd62eeda1b27563e6ec2a2ad2118351cb8e6c863d1f6c6260a3d5163614ce4a1aba804abcee453d182f35659c0e928230edfa408b994d29b53bb0eb9e6066b4144b5de2eeea6f5d07173228253071a1b75f1aeed248e656b7d0cd69cfb13ad4b30a1072e9e1092b0bf094d1dfa090aa017a9d8a06bf90c00e0315c20849acc69732f3180e2351229a635261fe59c9d42c92762dff6e76585b5ff6af50c3947e97f548d45b14cfa1a9cfb44e34138a7dd28ce398feef25f4bb06cda034b82ea82684ddf84b569f99ba2ddebee9e6721cb33bcf6d921798748081e08562d3b70be594b1da023b883eb3b98c6adad261283fa52200cbb87232a5fc3cf707f97e8063cdfa0f2971cabfc12d66de55d181ceca32dde17a71be3a687ca33e3749732d8c8b6facd72528a99e3153cf9ef25b7ad4af558a6a4a181c021c43781322010a3584f2c6f648d411fca23f01f93588f3fce54f257e0889a6eda52190431893a203d3077ba1defae531357263d8234b0389fe0213e2b74305da37963615cbab1a6039e3ed3af0793c1065bef2c6d9186288382c979c62831756cda37d0868e6729a0d98124aa648f36b8afa1a752d2c4be214f803a607b30289745d1cacb0fd070fdd1da021d163badaeba093bc70785a3d8b20964864d3bb792ada4da3e8e65766677436fbe4d20b1f00eaddc1bcc4d697c04c50e0117c1431f6142609802f7b1695ed7284ab397577f3895b8d28681043e4fad235e87ddf7ca5a74a4cb056c2e62bae924e705b6ae96c054da9326d223b68ec5f74e2244185ea3fd182e0f3414650d18300fe90ba11f310e5544af51eafdcd6bda7c3731021d87a1f891b66823f32aa095ba9d7c39c8ff53784f6055e34ef0f278d43ed5e88842710ab3bac7a97b1a81e5f4ec563b81e85002cc396a7afbcf052824d8e842ea49fc6e850effc0e6136c4efeaf3d3a1c89f9968c35c5e13d86ae25b1e3df3c1fcc40d649bb572648303b0835187c624a9148a5467ba198c6f14ae0aee7321fbaf5d4d002d829a45fe6f27d78c5f627883f899dceb552b383ef00cd31a4b6b080dc05dac6349881a3e22ce38787d270bc2427b9af353c00a608b358b6349dc3f50142fecf449a5c220fae201d7ce2daa5ff4429057977630ca1792ab89cfd89068fd502237c74cedbf2413728bcd969cb94eed0411fd6a51edef4dcdecc59b184263fa2fb135cdacbc89c490c74b79d44538fdc366865fff6e84bbacd1bcf4c6d9e2ec00a539102b1815eae4343c8b1a1a0775b8d2cafc9701e6c8bc19d4dc8cd4444d770c40ba1cba2d9894ca16a2523d00b6c18b61b4b7f61837d15d311ecf0aae2b1aa369a45c8104cc704189fc04fa54c0704aa18365b0c0d66aa9611027456302308431a20ce84941e5701916be4efe6f8008d13ee2860a21283023b02f63714625260d10ed5d381af0233dbae8596ad805ebb9d0ec8e240d8e078f26c3edf8bc50e9d34d06c69b3a22988b4eac9c92fed9924eb18960c1f0ee882de9e560fab92fbf2681411740281238dc5fb0a1f16335c98475f892d72f3297a8804b7510d3dd5b3b37ce29461071e9e52d7bea0ccfaa1c010af346b6df3b68401aa515b468611ab154a255e90471e575eab929154ad08d40c5034138071c528a19840bca24c2d97dc5e512c23a39afbfb5a116eb1fc87e1c9ad5a09b2b85f5c3e560058560c33b1104e0c4d5a492a259a0064a1f4f50fa9fa1014ac5bce1f2c49e20a94a20630766691f25bf364167693b95ea62855f8de458e3fce72095b7cdf518acb335294830850cc866ac317c25a75f22f973fb9a978fec33900819b630ff3cd256391bf132554e3aa4856bfaf95d718296b116961683e109d12fd9a20c683a2388952da0d37bd76da18e6e7cd21b28f9c8469a60b511f25f42e84fb79071141e275123a65cc11ea43b0306d1a3b3fea4a60ecc9dabf015fcbb6f54a06e58758d1a30db19a79216ac7856d5ef9d17c9f33d47a06e0089bfcb25fd2dcef03b0178e34140341229f3a615ff488f4c387bae4c81c63ca30d354a8354ab16eaa0556e349af19e2ec76b0904203c52d8c2a4aa8fb4631f0160bcd4582bc7f8c2707a7d49d070130b9d2771ecc4e0787f80648216a48fdd26e288d75647243820373687cb94f9713380b9c5b669e418b21fb928e923070d9dcf70a9599fe035bab7420c0796865a0cbcbb78331f3123694f117983ee1be3cd0f201eec3bddc3e8c92d39eed6d7c865721a166651dca51df5eee406e52e72789d8eddb69ed16056bdaefc09a80a371388e42148f7ebf68f2bf54680bf8417ada9fd70e3d85e528d908cfe9a4cfd10a11be4f5091ea5d0df86984024db481af465527fd56f2a066b5ac22df221956363fe4f56d17c30749546e71341025613d38e06b81990b74b2da1d2eab8d296c97eeca02520d58b6b86b324347d5916cef43327d991ddf232bf44946c120c384e8e5daf68e855ab2e4af373ed805210a20415d20e02514e407785435fedada89680417c54c0cf3d7afbde5000d26f18cf22c951f3d86fbf3d8b0acf6afb38225954a1ae5107a6b2c1eb5270883fbc3196940b359c944a6a3553414253f1d09177fb457ed4596421aa5c0b0f3fd0ae6fb88b8df7dd61643628ba5791ba53220c3129aea212d8f0a921ccd09d2c400573e8c6cf29d6e72ba773841c4b33a60df66212121eb85ee780bc4efe938f463c2a3efc48b8b48db29d3178a3435d231e881b8338c1f9dc0afb77cfa243c1eeb1467b23d95e03f969375a94e6bad1330053bf174da0ccb35b1ab8c268c8809a8c26754a7e708276522636d097a318acd46007d19dd172e8ab367ab4e15ab93b0408397a34e4d4e92a42a96ebdf76dd98a54fcbe16877b0ef434623d6ec3a7f3f8cb09000b82e258910094e3c690956b60a49523124538ea5a76f38093a0995238d6e753276e32ba4afaa8dce2426cfeeb203b452d11451456066dbb985a1db9aca84765a46e86e944ba7402900745bf3fa449283544627f9dace0bbdfa6b4830bf0adef25cab16e02d03cb325dbdd6602c0b6a99a096e4b5b50a6e89e096f7aab53518145b26c42d2b584173c898a8aa32ac4574c346e2b261e6e054633a273b5ff15da692f6e1df790a1da7aa36f1df71ea6ea7ec76eab517dfae531edde54dd9372df03ec6ce11ec1b035a91ea8b59304c69351d0ace94b6454ce207751017007522e0831d055e6810d9aa453917d3a8a8006890a8bd8999c191c7eb0eb72a308c8a270d84a32aa3ed6c32112c1f009ab32bcd4d4251d80b6ac9f746417aa991dd6def2da59452ca7208230824096579c3307cace241cf27cabb4af600d95113f06bfd35bb65d44dd25a5fdea57193aed2e5f118c398cbbcfa289ebefdbae800a32bdea2998fb31374a12b22a3f64cc3c7a2cbcedb18bb4048e957e641bdb82b22670c6e0f3d263babac83985ff10c4ff04c4921f3c9b75928857b34de3c87f7f9475a0eba38332f29d3a0bf5684b628cc9b74452859de9fe49632f5bf8ed110aa74b761cca22882372f999942e2d4f862c7d85aabafb6d7de33f3b4df8bf3d2c55decd8c30ef68bacbdbaf50f587b3d517350ce396b12f291d27a3e41bfd619fff6debbea5c6bd672d362e38c390bb4fbe6ac33c6386789c89e33c6171c4108c9ce2149821fd11d64cf591987b3107c367242fe3c6207411004f3a864ccba5937bc32b4fc6278fd927ab6f7e909385fdea57193ae12eff25c2852a6b7dcdb20678473cd4542c7a807155733d0e3acd27a7afb3447c3f8642fce7ad3b292d2fa3e6bad43145b6bfda64259d12ca4ac28384b4df02f94d67594db8d19a1781c82303795d763681a6edcdd1bc516c4e7333553d3bcd99ad6b4644643bfdda2d06b18e64b86677e2bcbe60704008304cc63ecf9310a84fde8ef8733a5097011cd679e8632cf2846c16828f619d763c75fd9f546516c77b20e7212308c9ae0e26e12fb245e710b77713967d1b5dee1488e26d8f0e276dd68ccebc7440da2e97dd085b276b09a60bfbabe39dbaa832ece3369f50a44d597d3c24ce33856199aba8a109c60be5f5cd6bad65a4d40a6b71ce24154acc77e7178f3e86ca5bc3e8615ec56b0cf150beb539bf44fcad0d3b2b423a6c83f82faac1fa2a8581fa46003c615d8e8d7ef5005b35ae2bd62726ce79c73267a7b822097e63e7b46d3dc6717cfd1ebf5302ccd9cf55c55927e2f19de4a0de2b3cfbc5e11d9655eb3d3623e3b531cd16b34454e47c4c4124521f4818a2a3a69a2f28b677d0c82dc6bf44446437466f3d64802fd27b68332f2f6a2d771448dee78a6b91f5dc58f3504a39f29d18717278a687a827ed2354902fd4559677dfe6388a6ee41d74b4fcd07b353998200714584b3d02f8adcd33c8cf975da595edce8e1ac3ccd3b348ea35b5907231aba114ec34f3ddc284afaf254fe6112000c92302699b3f6de7be72c6d6549dfb066102719f92dfef68da61a4591fb5b46497cd1241ef78526585458375c80c14a0b06991f187186e81ca990a4cd1a2f3420e95186c992c90396460e0f227964a400cb18387ae230a9930686921a8c1680be984e1b6c94f1dacdb0d542bf103a4f8cf07072e546a76124bdaebd86c1f49ac3eb394cf7823e4272c0f1baa1c50b2bb4ccf0a577078dd50b342fe87890c32480afbf17549ec3d7df8ba8edcb36ae83b84510a84317bb59b1ca0dfea621d2705bd71fc28b2bb5a7e16bb4cc32ca34fc5bbd505c11d66fb9757e4be2de0b1ef80513edc5ce050d2ed6c461d203861971918b30a30babb77dfdb990d22fbcb45ead87d64d6bad6ca047140d525370a094bcc8a5364f2daee4f061c5035a65c881d1888bb36648a42e5c643402094e054839d3f5d24f92c74e1a8dc078a32e5c3cc62e788f31c6583385200a858a52dc5f32b9324220a45c6821d5c3befd91967af51aa2a18b9ed1300cf1d6b716bad745173dcd274417d12b96224adead518cb3eebed1cd5eb2f07401f112c390a53e70c22a3a2bc278e1393153450955d391322a447953834a172f3576b6b450f92169f9b53063414f6bd6cefb2c49fc40a4c0e9d291c669a74bcd02d8602383c6942d3384d161379909ec12419e1a53d8bc60e70e972ec51ddd785395c3852c51a0c4d1a54448928442882c0b311986186c357892a5e33e65fefa6be1f4b8886ce1032946de3a73b560b2fbebaf450e1f6ea3b34cddd0c2a2461c366dea16254e37aec0dc1053a66ea161e30ac61738bd15bab4fcca06694b14972e29503a9a74d56b09b904c3baf1911216eed8f8edd0a3238f2e359f450db1c58c700d0178565094f44839a347b7510eb0afcfac8622ad06e8ebb5c64075daac08e341c5c9160860eddcc0f1c1d5274e972d17a8311d571bc0e60069e2c3020c9c0fb080c191f126c60a3cac7e9c9869928e7080d9cad1c2c6951ab8e852f3b5952368968ed059d3b442a77dc96bcd02eab5ed359ad75a67d30c4114cabefe58f030c33ea396d0a7428f424808a82fd6fa8811c64d2f7023f26fc512528cd0c3d7df8a15df018e16993e5f7d56f88720c87d9afb5aa635ab823b8bb8b848035ce04c2dd17872a34a979a3f9599dc68c045b58a8ba63835dc78eab5d179eee2425c1cc65eab3cc61e3ac63827e16a319a9a6f6b95fadb25f9ebe675f3eb6f97e37fbefe76bba46cc39af7de3b46b943b0cd98293467b0c67041d1a5e66f2f71d190153b6b64f871830526baed35e4fabdb746c9a4b27e76a7b10aa595ab687b2d2f0e08eb3190461df07b32f3d9836e51079e6f3042c7dfac95e453dc23cda6aa6f8fd6a721f60cf9fa85c49216123b7a27891d541757ffb6f57b86bff83e760feed19f7e83d804fd9d81edae6680fd6ae11dd288bdbceebdb7fa7dfaeae0d6d573759c127979f56aaddafeb541c62a94eedd5f272dce7a63bdc150cca288af157728c6c618299bd16665cdf673cbb71bbef6f60566270cec4b23e9ddd7cf2ee9af7340bade21c9838ebf6ef22ac8155480afad60574535a5aa87e5ebe12eac067be12ecc85ede02fccc55bd2d1b4c41bf26473d65fbf19eb662d7f1de72c9ce62f7f5d6b5ddccdbe3d659a6f380bc0388e63ec3edda8dbbb55d777b3be7c595a5b5cb8b7bb5abbdd6eb7bb5b5c5d5f6062afd7ebf57abbdd6eb7db5950abd56a02b87d81953b330977977c595a5b5c3e9fcfe7f3f1783c1e8f87b97af7a9d7ebf57a37eaf66e95ef6685d8e7f3f97c3c1e8fc7ebf57abd5ecff79402f8f1d92cab65b7b8ba7c3e9fcfc7e3f1783c1ee6fae202bbbb9b74797709f4f97c3e9f8fc7e3f1783ccc85b93017e6c25c98eb040a0200000210000b2cf0f3c4d79eb6e7854b4f368a049fcfe7f3e13da29072e42de882afbf1e2e78d448f088226b2476705d5cfd9f1f2f99af03e57cc5dd6eb75be139b0b7bbd8130f229f0af1d87d4a24804f43bc4dab2fe33be27baf7b70ff5e34a3297fbefe7624bde51a71357345d8b7dbed56e8206082035744fde5f8faeb95774b39f1a7a3ead3aaa523e93fad5df54bc44d6b9faae72f18ce5aa35b517b065d5c78371ae61a091e3baff7cc58cd1f0eac1f0eaab74e2e40ca942a3f1c433e305a16a260fd786d70007191339732f6f58723c7e3221347d20c1c2b6080c518613ace82afbf1b636e58f99408ec51d9e47220cc78124226478d1aaeaa98324c4b2fcc80470b539850865c43ae0b0566e4596ac1ce1d25ab71c9901950a074ec708185a54eae0b58f5a0e7dc85fcfabb11c58e15126212e316992174e3e985501e613aee468e4f89349f1f2fea67a32ab759c3024d0ba19cd7f0c23e7ffdf1c0b40869e5b4c464ad1c8e61f3ac7e93e962c446d41be0eb4f09ccbc6109afefb5aeb393a21651a098c7440f5d0cd1125efb46ab59c2c4b18b9f687886a1469892d487def4aba115727051d6c12b7093b4f96db49d3f5e3b4beb36dfdb9cecfd6a3c7de9a351f5d8c9db8f9724b0e0675efa964de0e6365bad36a20f38fa99cde636ff39539a577f40071f6d12b0dfc18daeede6b51fbfb9ed4c4b789b6f59046a5e86615abe0d057ac0d1d3bc1cbdf49b088e7e444760c1d350a0999f189de6b3d169349ad7127034f4e6b69466ebe0b733bdf90f7a4190f2864ea083dbd0131d7c444f906e2bcff486a230bf035a435314e693a68d947970ed3634adc034cbd2838b1e5cf420965ef3b1e641146d5ebb8936af791045b174db4dac798972e0e046573c39d46a62ad56f39858136128813e789b976158baf5f2a7d4f5539a5286b671b4590f7f35781fd2cedb9996f0b7db975eaf080f6ed6bc7420134dcb2fbd837b38ebc57540d3f26bfe73d6bcde2220efd0014dc3afa12907bff98f039df50e95684a3aadfaeddccee14c51986f73d266b37988a6a3dbfc9c59d9038e6c36db8f97e7cd6b676a7ecd31cd4f947e735ae9372ffd86d68bab39cd7fd0fb35db88fa40363f51f3d26de805424a2012352fbd86cabc44656efe8886650d518289cd4b53c156cff9e2ce6af38ca9fd4aa54cb34d81bda240246a4553e44761f5e74a147b11c4a5e49b1767bde7642b5a9432257f766598cca38e6df17645dccaa01b76f2cbfcb756111cc8180522813d7b46d32ca5f5a38f9d1983942909766f55634073817d957071e067bf2400ffc4758095b16abdb5d65aa22f71717a6b6f6badc5da8deed6282e3e71d190042d2ea20582602e2754dbe0e2ee19e20e5dff396d674ca87633d45885527ba5bc7bf7ba6ab150823c1bf6618afc28aa16b851123522bad1ad2ea2f572593a5f8c6e1608820e0041edfa13a0870ed6ae998c4c9dc34f6da495a7110e5efb393f9c29631ebc83df6a3feeb633075d1c8803ddc389bb43a07738eb1d1a2d693bebc77044b8e8e6350e7ebd7696a7d1c5814e3b39b838d0676708262e0e74f21c81848a01e81ccef00e8115178d00ddc672b6abcde4cafc61edfc70a61c5df4f2242f8e66d372065a0ba6668a237a8ba6c8ef7f42be733088a6fee09992ffe1cceccca0cc4127c732357f4453e4340c4394f4cb436bad99aca8b5e2ad75081010c8e5422522a575ad9be5ab5eb1704221bef6b45ad0ba32029138217f35f3350ddda2161d8148d8fc163dfa11052241fa383a89a6c88f22f7a41ffd18ca42192a92e31e47df635a7de199dec2d0c1101d613f737071756fd71bbd587fbe19487fc57f6d18f1355395d651e4bed65a8d2a0637ad753982d00a28845ee3c8304f29adeb140408938c0fec26c6b8af4753b2948a752347e4a8d27a88c739bc5e10a819a8a818a421aa0fc42d1ae10ed91c98d7979d12a46eb7088415f1e14c997f652a14ab2f7ad015a11dbbc7629ebfcac4188a82fc500c51bf3822630d51ca3cbf4d43b845d6878744d147d431bd895ead8f173d2dd2c02ed503889e2e400807a24c4388a21645d13f84a932d915456b4551d462884ad9296254d5185e5c288a52b667cf0ad6f6f9e14c096620e590db7451d1f5994371c4d558bba38b32d925e1e2aed7ae97358b46647e8c3c51540c441745cf58a2e8a28f4082e8a2f8949e00beccb58b6eb1ae08998b2e7a4545d25a1445d57a59fef1cc1f1345b18a6ee623d1c66430aa1984a06260fd460bf1445f2b9a81186ba7fd1be66255cadc8ff80a7dccafec83a02a3a694a581acef190fd9913392eb239c6d86d678887acecacb828e74299562cd2f1e821882b224551bb3ee6a163271a1d8f2489a2c87dccb1ec03db102c383e96ad876aac6ca3235c9c754cbbe00cd2f7dbeeeed076d1dc1fd894a48f262e6e848b6b53a655cd6fff10a6ac2078cfebfba2bbbe94ed19c96e021709dda1ed6158a6254aa61fce94237091a5718736b93d5f9569ddfabdddc41541faf61148d86e63be875ccbb33448f484fc57a862705d9fb1f3c399f2662ce5d66d07718baa6e7bee16d550e8b7b9adcf4ac51863ac77d55a8f57e39b73ce59a31e62477e45b1a5d6a05b99446bad75adb53629addf2f35bcb8b366b9cedaf219ab50d70fc037a3f7b8afbf19494f43c757f0f53703ec474cea21f90937dda507c1dfa88e472fefe2c07dc27d8b821fbbf946d399cdd3d06bbef7de687a42c6453f8e655efacf693beb1d2a6b284dcc0fcad013d6f383e809123cc17bfa45f4c475f0a227aceb07f5886a8ba21a4d2fefb7c730c6387c52e7b384cf283e57f3d3123eeb1304e667f484f58c62cf32c0debffe6284bd886eebdbab95c926e0fb5c020f610741db7b6ba9de669086d2e565590760d2554aba34ac069797af0fdc37e9e2b206d112b11876239ca7ca300c0357bb83102a5356ae3b543f44d27587eaa7217866245f322437bcae64cafa5627f447b6f0d0903d02e4c8d2a7662eb2f535c4db1217d5170fc1820243f45576f8fa8b428ada7d4a54a41cefdc28452f1c46d84095e3d79f91329f9ae492306653974fc927a2e55393e45df994347b5c7d6a923ca87c4a9a48aa3e35c9a9269f92a611259f9aa48f239f922690219f9ae48f209f92e6928f4f4d326ac7a7a44983f7a9493acdf8943487bcf8d424831859f129693e857d6a9235f27c4a9a3bea7c6a923ae27c4a9a4a4addf5a949da50f329694a717d6a924c663e254da5ad4f4d52c8974f493387d6a726a982964f497346d6a7269904eb53521f29e2fbd4348b4c798c31c664382524847bc19a66905b0d6ad68ad760ca947cb2bc590daa951560ac06156b856ffbd8ad975bd681d5238a588ce59cd1d43ab62658715b4b44ab88d490af215d175f8c67fa4bb61d881583ad731ec1b06260bd42e92e42ba4bce36ab25f9b301400baa79f89063a25981eb1b1018003c5e59683b700001b60004678d31853a73b608311306899615e89459daa2a2270a8f910f0328838486293742fac0f1f1e28c982e204466e81511d75861e981854c8c2b2e5480cdd290334cbce4e142e496a0ca93242a343d78556c70bd8881d4e3899838438060b00043e7a9491c2342d03a2af866e87205ca0d949315832575264f0b1c2d867c608b4f2be98e6f0f0f214e3713325a6c3df50873c327025eeeecd8c9f0c28b1c2a00a9e052f53082d41bf3436a04284778b04982254def0988006a586012890afbb2e342e38d902d2d780ce17227ce8d204e35199c1041c325c8903a56153c29f1c930e78a85204e688d3dd5c586498e241a6efa54917a41c30f2530a658011224c780c569cf173d4d58be54c044e94e8d3331c2623439d1c8335e98c050b50b83235b13f503c70d73d4c8f00348d9076a0c16a41a2c7e531748b304a4860a3d785f3e6c3f5298d8707af3ab4164ce8c282c4b3698c08061f2a0268992376faef458c1cb404c0e356cbcb0f8c0b2e4e423b418d364e44acd1a2f2174e0c8d384098e28ab1e403ad0a86cb0b96af2e68853f5ed418367cd169e0c493c9ccc232a7dae9c141953458c95057e60be2a5a4f60786147f863810b4a9d1964766bea0c50608e20d9b90a5ba32308870c78dc90a409efc81031111822478c0c1c577cecc90180146c61b16b01c91b3563a0ae683102064e17177e389c82441003122b44a8d850e687062acc50e707866906176ec8ac920b1735204db9d335801bc02cddd0c4890c2a3c20e4d6152266d0b4d922830905a68af8f05a1227860d2dc447992b3d295871f800d9e20425cc1a293a862805b940a8aee92347060c7b7cd810f341932b366b96ba967ed408809593155ad4a1c3c3d33566f7658d95196780d088553b45ba9c6112a535c34707aa254c5376469658990162d0bb5146c91a2fbd23472dbc96909800b182438e8cd9518c1e59a6587871b1726601bb28499870cc30a6480ca71f2c5798c4f07bb3e2eb488dc1cb578e1b5c4c6cda2405c1dacb071d4f5857769878f51410a629c88f3a5decc4b130740c3aa96610d73d7bb4a0c0586dc170a34bcd87eaf2dbc9174d30e04002830d3668745a46eceb0fea4a96b6b9042e7233088a27e409abc585f22109fda0a8b410d23132949107bffea09e3e25ca546315bad9812eea80fba1839eab370751ebae5bf4d48c5d17cf10cc42785fc17cd5b26dbee6b1deb0b0b05c981090baf70d4e5cbf379f2341a6d39c54b1b3e20e0f1d341c45e5b8a212f3244b9d354f5a38fb384d899b8c13548c2ca29154afb60744e2663ce545339eb2fad11fbd457fc4183fe59c97acd55a6bf426611937d657e3fc23341a91b3130e31673e954e171788bcd1c29125a5890b14179f284d75f27cce4e489f679ff97cce19c80c089d4d86cfa67dfd35f530f7d698564ff1d57bfbb6d6ba7e09a214e330c6d8c443f54cb3d6a58e691c96a88fc57cef1d81876ad6fad16571067c7cc474b9da91064e1b1b535d3a9a08e182064896cf9e81c0f039dff039673ee0edebafa9c58f5f7f3fc0eeedd5a9c245dbfa6cd6de5b3789cb5691808b40bfbeb33d1d0978e8e2225097cf127808858dd3279008d9b56b1485d0b3aeea464b9608f15076104d617b0e4f15532258394e5ed8e942cfae2285eda087680adb514801ccfe848bb45fbf51b828fb5d00dee2b2e78dba382bf5d677150f89b08144c8bef1d0bd4f78e87a8e8ababd7bb79c31ac19d8abab3ed2a2de5ed26d4ef32a33a1a2749907f6770d05db1e653e7ad5d56c32dbabd9aab7beadafb63978f00e8c74b0c97c1cc799d59281bd75dbdd89e1d61757570aecb211749bdb50146a0e7ad5c9dc04900836fff11f1485ed36afbad13da89f6ffe53f3db8f9b18cf8a876e2750f69b1fe9467ca6b82e820ad247a7b9082a4a9779cc53986082e6a19b88f9cc3b3062a26662bbcd4b20d91c241db4a140da3de0a15ad46bb44407eb1cd0dded5c7aeb3f2750464b543cc4c377090f59a79d150fa5304104f64d300184aa031d84aab3b9092680448839cd69280aa3c7bcea4037012402cdb76f140599d3bcea6cee81d77cfb58db0e9e251eb25e3b81ae837ea4cb677a9fdeca40a83a249a9589307accafcc84cc698e4d901e436f1206c23e73f2f2de7aec04c268091135f190f510c58127d0454b10e121eb150f1de952b01de51b568df5f6d1bb4ae4614ec63987b8b87aa54893364ee260c132c74bd618ae395632e0910ac2420c32a382b05cce191f0d99e18954140d30726ad42f50766ab8f36535678d2e7b4df3a4d39cfff9bce773ce7c489c900f1a1f66f485b05757d95789d1d2e4a3744bf386f256e2a2103704539dc7347418638cb187d820b7810de5eceb8f49cda725085c487efd316dbdfefa63f2f2292e1fb912a18cd5061b5288694aa284853c79d6a01823c7870e26aa5e179f9ac13c076b8cf59558c407cac807486f0379c2470804d3942fbffe98a46cd8455fbd7600c853d30aefe16d597f6a9151b521d0dbfc8542e8374043e4f6301909515e9009aabca1ac5f82c0059161121224c4d4f45abd8d479c47eb3974111c59f404f6d053ed60b6ae6bcd40f414ffdebf4534b59e7da3a91dcf543bb8d42399687c6af6d0faeb66d65f7cad8be0e8b3c74e13b03e6f640e538a5e27206a1909adddfa09ec213882b20e40081c59198913d84f60c7aecf13d9f32db2baeb5646b4e10809e52f390be572d94b18e632981e524901f56765c585f1079225589cc0d0b3c2488d1a7834e179bd418d2d2845cc3ca97043d6141e4f30280589c18d9618f250098b21cd569bab1f7bf00bad9bbd9280d7008c39495598743992450716304ff68ca1a1c47775e78e0556a2c0274a2ae0da2223ab4c922837626071a2d4c34c0c345155bcc623284a2bc63c6955b1726201de962d2f242150595f4f1cb0f6dedb890e51e7a4a9dc52e088416c6449b24298183147494c98bce1b245851a52db051004411004b5110d4f524fa0e2a831f2a1c70ea7343ef8b4b0cac23faf15e0958d88162e2b5943b69a4050416acb8f06272b5499a307fcad90448e943d556156defc2865d965dde9b274656565cf2953faf29bda040c0fd5f05622a12252dd08a550ed42aa24918ca285687d80d75a6b4d8654334c59ca52e487a5c377246b88138b2b45ace8f021df8ce1d0427da384c50d3735b4a4629021e5c5880c1bc248258dd6ca71195b66c92aecf7be3253f59b431d2cf10901aa4ca2dd6ed78234a3e50ed52f6fc64c69be910382525010860a9c3b4c7d98a01cb54064861aee50e5d871a32a4f19a9806f76488adcb09129015382200882e00d2cadbba1c5e88ab94fd4132a2b186cce845ded00b3f19041840a0e932e4a7868e8a620bdd83060c45ee8b864947bc583078259701c20bf6b15ae2a5dbf3dbf01fb2da5bc6ccabdf7de7bef2fbe302781e1490f297c86fc10a353f3dbf30d4fbf371a2b346f9498e8d1f1a48b72db7c9003f623e70e6641b735854b0c2c7c4d7e3078d1e2454a942d3b84b8a113bad103b280d364a8eb586d375b644a823009433245053757ded07942230f9ea7302f6cf8d2a3abc8dc38444028b876c152e1ce132b378490a9000c293d5076eac81023c7c8ed89cda1e8200882200882e09124adc5d32ac90ac7832008821634c12d1889f3d402950d25703c70e1e98a912e3cb6f470d190cc1172529ab9624d75e34dd71e275188c82841650369075495561f2bb5ab176da81e04c11ae612bc42220604cbb2dc12ed0a9e2892f9c845efc99e3366681861a24bcdff7292af5890b1e0758d1b6a88f3f502520d5eba265ad7e9f25a5fb5e8f15a67a50e3fec84499243f5e59b0a617842e5498b2518bd3959ca15ec955d15d29ad4fa4793447abc9cec8058b9f2a59472c70b972462b8a4acd69056744626b872e7ec1b89903657b8b0c0074e9516973c3abc2ce1e203894ebf413207ce6b277b1dd494f586c75c11d616853aef00a7d49e351aeaac68e1a13a454bb13c58e85daf1aa4b0fbbcfb3a4ef363f28ad828de2719621909bbdb91c818e3a66a97d0702e356a6b0635df1855529f06f9f58cf597b44b3e25b307a5f6329f287db4328dd68a2b3f48812691ff84768c5db3f0f4da8f7ecc24e863ce27096e046c9fcf68903dc0f52ddb48e5fd20ab41fd2bfed58e650ec868793396b1017b370783681a3b81accfbceac69346237d86a23073b2f4aa436174998b10f3124581e63197a1284c8540f398a350f331768e27cd671e02cd676e7d36731205b22ef3239d0ad2692890458128303acd43189de6d6a221c45c86aaa079cc55d47cf423dd91aeca38540c4207b27ea4234f208ba60881f43234a14455a828c9235ded54311542cd69a88aa9d408cd6934a7a129a060448487b063d2d18a8742b4e2b42cd1f22e204c89a02e602aab4ee6a48fb2f348479e47ba0fc8d3ee4897a12a5484000f6127010f6127d18a4d8087b0a700a1ea4ac043d84d00a1ea660e42d5c9484fed8eac5f326b9f2cef69e9e9ce9c3c693e8ef9cc2e9e26dccf4e3bad0f0f61bfb21421d07c86aa5031f3196a7b78083b0d05a1ea9066344cf3aa9b6137c2b46bdde8ea74e469755566d15bc520dc1804ca6eab2ea651a08c7e8092101e81373c62830d4236e442bdc6e64c6a36a5f66d33a9eb5fa0ec479fd1f474afd29ecea504c06334f72a06168bce13e6d0ea3619eb3c3a8fa63326cce0d6197fce196734c5f86a9b4330c4433ae730c4f5e68be60b76c916d3d1746ea6936dd65dba4b77e92edda5bb7497a6a3dde8ae30678b2bdeba86d27ace39e79c73ce39e7dbede796cb3067aceb94d671ad55d71a5e9c99339873ce19db8b31c65a6b4d27e7ec2a1ea31ca694ec4962c31ea0a7ca901e142cbb2f18d63c79117981481f223a28bcdf4e5e1132257ba230c618638c31c618635cb59cb2fe9eec7e4ebe30c6b8568cf1b7d97bef5daba77befbd6bf574efbd77d571cafa73c2f5a38afafa5181695d77ad7b6bbdb5d63ae31de0ce18caee09efb51daa207fa7c45f7f544d20b67dfd5121fdfefaa3e2a164f30d163d814f33884d999aa6ae40d68fdebdca8cd6dbcdebcbcbce97571898bd17e39c35ce59ebbdc14ceabd41300c45300c4531161b311663b1712449d9489232d96c461b41cea660fd759a6fca5f2f4b2d7f6fd5c55dbfbc4be3eae05d1ab769e92699e132a386cb8c57d796ed59294b657b56ca4ea9b2516176176691ec2eccd2b04926b85aee97bf5aaa991117777db4f7629cb3b617e39cb5de59ef0d82612882a128c662e348c6469294c966339a6c46a39565ad66b3fddc6e1c3874e8e0e14c3d15f2e09a2988bfb88bbb19352fee6217c1dfac8a819e32357356cd80c35fd74b35838a00273b767e4dd4f8ae683a0cd060605783815b670c06a6bb8c1a4f985e2d8d07dc3ae3abf19417ef402b687268c230a673a82f185213e58842e49ef60d357ec8500a5b9144979abf42d45e41c9958e3d66b03c29694142449425963918b1c24e83271986687971b6b4aa8199f4b211f61559ba693818c18571b8a464a621cbef45e1a1101711fd9424e59c33511aa225594bb43830329f2be346e8a230e7255b9fb3874bce7c7632e71c864439253b179ac2f21a2ba429b9b3aff7acbf26523f5ad2ce638cf1dd332012faf3e714bf15a61c657b82a921524eca2d62a3dc06535661ce28b741bd5ddc119dc3451cdcdcd494c745310ed2943566a3361aa42688038d1281f0234f6c58b226ac8def499608d0f842f2525524499492a6264c49745848e1998a62a3a6a41820cb901d696c783921396e8aea06c248ab969d042c490ca9262cc2ec69f864888b6e77c8ba14921838accf94f676fb40a7ac1fbefea4781f7efd49257d7a73cc33233466cc91a4281f1f7ecee297509f20842e0e778f70bdd67e33039c9da8544c98ea721222649100000080007316000020100a084422a128c91351fa0114800c739e4856502815c722b11c47411807410cc3300618620c40c618641483263980e2ef2ea7df66b9e000f9c3c74e60db73764a6f0fc6930320041a794a62dc04b89c1af739dc358063a7c4c40986f98a5f95831879f28f09bc53a37b3414457f4c34ba6618e33de9074b8c59524c5f7a204b8a8a31143ba309210e2275bf64bc97220e4232f6c94f5136c514347e478609d57bb78bdf9a40f0bd7c691669b668c40d95a0d3d44c616c73ea7172d18a33bdb5479671d9d7dfe8aa4fb3feba7cf438a7b0087664edf97504ef3b45df2e45ac1b4b139d591a1e48c1e5b0b172e43bfd40a0ae757e0e2b195211e724573f6ebb19098874a84528db011767560c253e898f4d4ba1f2308a6351fc438880beae3aa08a3cbba5687c2caefd005a4b332714651f8676e165dfcc947a29ce12474d853a0900ed317668bbf99f021f8a6f45d96205db7af88db93d1e971fced1a4e427764ebad8054d6c14271633a51f6a26991b268a5691bda1a9351524f4301f3364f95ef584c7e4d6fa2b2584f12ff86b4deabfa2a0a5929037c1114423673fed8cee8d72ef31f45ac538932e7c90999ae80d1d3d6b9b17994e6f47b498619f0a2253292695fe1fe4df3822444c80620e0bb5f0cfb655ad45ee1f7aa50e96b943d9f2f6318fcf78d45fcb681fe02cf309a9fae9481bdb4055527df36c543d8eb4c8fcb6898651fbeac94810aa23d67e71795572ca75c7967521d7ca725a0df0028ac2c6f963509fd0fe1003b6e5c65b95f42990147f1c06443dd3f0e4a83148c5bb291dba812bd82853ed0e31b7fd386ee87d0303b476c9975d7ea7cc04b0dc8c786c7f30f78dafe05ace3f71c1a525b078c345d3718bf21b25f8a872444d378bf822d032ecb2c40bc21f87a891f7266922edaf9cdaf4be51b83249b4df772296a5e662e8e8ddbc1b0aec5c5f8d8d62f0aa2013bd02c618eed49885661d1389c1a521dd56868b146ac612506272252f3289d442f1f962d2b008811be2a4d065138ca6964a12ed467b2f994c1445177badbba11771614d5ccb4b56496aaa80605724b05d5209187f5ff759f148bbc73c746e47c42973bb33e6e2dbc3e7c191294f9ffe6593fb1f743fc74465454e41e4f17e133204c7b3ea40194306d39f630fbb4afb5fee0f3888be9ad2df9a11cb9dd5b59fcbcf3838eed6d34bad2d508613436f756a7706e1d83e769580615fa198d2c9e78293fdb81518e9d080666d2fdfcff409f1a0d0a7a80a72616de0001c7a798460eba49a205f36883f1fc2cc53dc5282a09af3787601e77b7f7c19ab0fb434c530ae4bf116bf7be9210bf50972aca85e7a8ee58ca7cf1c162943ae4a7b7d917c98465cb1893595efa1158fd210d289e1034b371f1f9cde37d3c8e53828557111048f3ea72bd9692823619d4152437b252e8f295cef92b8bea1cc5fc4022ea75bf5361272d58516e93c06c986d36de3a75b0ce925074ad3d97c22ec49c7b6f5341d0389ba0832a8a2e50f2567003399d218e683961a1a36fbc424964acc0b7c404cc92da855688eab3c1b50e5eeb912e47ba23373a18ec3f12615b06bb40fcc419d495788d8cdbe2c459b8d0ed121f909e9d6ac6abc9a43402f16596dcb402e4d91541509ab14f24cc3548873cdf22ed2da821fa08936198feac6d934847afc9e9398021fd94685fac21b77eba0a3e585ab8617e5f568dc41d18170de2030d1eb8994972f06eb1f0a765452a238db31663deab2bebe0df477a78c8d7393a38186056f2087c18fec57f387714e86690bb07c717d1a1ec86972bc4ae743c4b062dc6e2c8bebe0c724962782b23bcf65956fa1f88398adf42e8b873e463093741cda3a00d0aad298881d07e044c01f3331fbe4632d1ebdd65ab228c0fd1b3e651a004974045b6825cee6015b68e35c9b97131729447fbc568f13e961d5c747dc8cb377df45d64527e4589d2e22176c765e187dc99bd1b1eceb8a4f75a667d0670d64195421f9c266e168a907d65d7e9f1eef82b585b7f4e94dfc90479ba39d7da162eb3b8a2535a04636f447f222d11f31ee2395439051f81695b433ac0418b90e1c787da3dea8f3e602b5c56bee05efed45a922be5df0a742120da05c543c505ccdfaf07a8624cef28056413d69fed1a4b9425619518e3d383bd748b3a4900ac48952107ecadb8f44468d38071a845933a7cc5b15662d14210bd90f6c76eaf0a72198ac295be6079c31b249d60bcafe623e8d2ebd8d9e69d2bba29196be84404df8193d6b953c71ea08265e43229688c8598caea0476b353c89280642c74f4691b0c7735bbdfe5e2b344d753fdde5338d04965a738d3fdd0b2fe72100d73a8955361c6fcea797639523fedb6469ce05fbfc0ad61d121d75cecd6c052d3ad26e86eecb61aa485a62b3ce2bc16a6f1b98eff7317f0e7e8c82a552d59f52f9ff5845730aa7d31658c42307e2421e61f97da622ffb9fe148811ccfa86f1c71a8736829010e6bdc8d1f0f9404a7283f742b66815f473a5587a35ca9bcd72b03cb31a743309fa7758cfedb3505e5009eecdc3ab6d5f9e2d2015f913a230c8fab8214ae7bce859656059405279fe970920a795260c82ed2a6aa00f920e1e8e4f967f825412c888443a387d50b5dd47df4d38d9ea1b117aa1b0c1e75f3b18e070522d3018214eaf7e11871d1e92ad4c4ebff69506da7be5ea99702a45bf5c46cb3ad47a457b1599dcc09a28be3129c45e78cdcf36f5c21545218a9e07a158b217c7bce07455b71657080d8f68af02be6fd28fbe52f7e3613aa3280fd182bfacac23975107c13f5461ac1291e5bc1eadf33d8308735b6a5c530401b25da7a117534f99d413fe3ae784c34ee84c6f31101d10980db24a5de758a215957677747a292764dd83d8d3ecca2003c9cd32b73f02f2a7d2ee6b2f5bd412990d8da391f51d0c93bc76a3550dbd919d8fddbe0c1680b1626f106a01f1b44ae97683574685c692ab6cb6dbdebfb1cca31b99daeec44e3ae8d734c4719d8e390d07125b157cacdf59ee372b1920ff95c5c9693cb8de3bd8c3d8017125a597674abfa614072361d9ba3e9f528ab48c69e33188d6fe27c8c1538ac3b51911429f8382fc69c06f7e949001887264c89815e7e3ceb4c60c4345780e071b34052f1f7803493b1ab8ff01de48f58557b74cd40e96a5485ab07ce13040aab10e0175499fc0f58508feafe8de099c10c201f1c2df03294ecf5284931ccf3b39c6986dee8875f18b1fd13a48b3d7020bd44e78a3e0594703540cce0fed4538fb5dca74691f154f75128d6a2f42e2522d4de194684855a75bab6901d0d3642728ce46cfd0a46d013476739c4bb754f42e2a4a9ad1329e4afefd8ed0178b3c05105b0754e3e87567545788cf7d608f5556c1bd342968d9bc99619e4772e13ef85c0fb205acc09a12bbca256f82089c175b5009778d214b532d04b3666444fafe8c4464a6d7f8e4331e8cf7b89df4fdce9604007763bb6930da963a210d83405170a3ccf1e4eafa6162a6a2a1f1652c196a6d3908f7c77d9c361fae066b6c205566826d5b51b0c6c7c4a01faa358a85c13b2014dafc0000497145a1dc86758b25122319e837491dbf9f04ee9e9c2586ebb5b4a29b7ff38852666c957ab4d0c953bd2ed881ac92ef3f4c01a4baf207114bd50e4d810665a37d60dfe0a8aac6b9038e461ad716da68c5277379f8c9b5821bb1fa6a25da6a279387100f002796062117ee6ddd14b15c0f8e27070a91ec1ec992a6f84cd792b02b33168a0f792179e44ee544b01694d7b552b9956b897163cb859e2d4d0a2bbac6881e4050b036ba87b583c2305b8c12599454a54ab3c46fe0411feb350801f09f142aa11819ef7961fd9d6bbb39753535ffad3cb80c38ad554cf62e1f3f075f61addecb47ce78d201e09b91ef8e8f34322b7ec8dcb5a086784415ee5b17cce78bd79da08fa798d795b80ab3738ba6574f9b435d625ea7caef83c8fbecb68bf880d1c8b72f5adb3326e4bd957e2c0d94914483949ecc1f7f993c7c0c88fcb90c035259c0160db0f8919ab6e701be517feea148717913f690f219e26e72fde1cadbe1f403e8c4686b51224580d77c253424996fe53a91e577ecc93c57134fb919cc019ed57717e36561d46fd2964da6ad72b60b545fc81d1c0769ebe08785a671280dd1bb47f175486d989cbd3169d4cff0286b761d4484da557fd1b5b1eca367ea20aae0e9cb2c31013948a206f4bf7c578e885c220be8c740aa295f67b94d939f4be7960516584b0eddeb040a47168fbc339e617b6f2c84480772dd8df07427ae46ff43047afd8ac0e90ca00e45f277a8b167c36e413640ff3c1b4b9ea708536f85ec255cd4e1540f27128f67608c5bbbbaaf7ce71e496912ca0a75ebd05cdece70619c33755532d794c078b9e5a5507d424112f9ed01f95415a446df8140f22c0ba217103b8049d52ca4e3568f1c663073a1ac7a50ea80d5843713f6ac3ed2352d98834d8dd29f3864eab1ac6989199968d30ce37c4e8b630d56ccc4222a33ad0a32aab8d7b8328826f46386709aa1459dc6354336e80c5fb158304374c2c9a814c70e5763cef26a7f91e332b2fd462802068adbbb807a7edb027482d2ed9303dcdc1164c36316dbdd65c8a7278992c9cdfce7bed4da465f8d1181e433825edede6c9236a5a09479918ba51e2c372f9385d8d4649ef0a898069d499af8ed1c00c9cbc2bfd11a16496c31ba5a375c0ac1fae1f1ecc6e242603036186b36d559cda7716953ddb19f1895c9dd590f1bb309ac6189155e7385aa999048fd334f66621d4f6dddedc4cdd27c90edd926d8cfe74ce68258b64536aad7299627b6af429cf828df6e648517bc9209b8d554b5685f9d33b52877d05fb5a1477d6c39035678b5a56555e2c08af91b6540b1bc56b9b0b5a49251b30a7f9b8e22376215ba151f90e3ac556b700aa6a4394e8a0b760e324d4756017d8ad5bcecbf99e04fce1faa36578b334322f907e564e0524e6b1714d45be2bf5fce469129ef5e0b5ef0f74f5dde0d3afc87636dccdb43dd480696332a4e64b12f44ddac7e471de4f0614ba53c27078216d88c97daec94593e1bd3678bba71397cf50ccd518bb5ffa6dead24757c4d97f67220f50fb3f1d2110affaa5c83df442a3b712ad37471fbd593d8df9d2ec05b28c277d1f3aa8e921631b61c0b0b25a6a9ba1843040ceae761739dc03083d74b0b8231bd4ae1310c5c0c8962877e3095cb2523e9a68d04813b7e4560a850a163da32883b83602b139347599cb162de01fd6230ff544470eccb5b9e1d15d706584d1a46524da1813452b064af8a8ade1a11419b2cda5171225812b8487060828f889ddb268fe51c8182d2ca5c2a667c413047d7e5338861d8eef849a4a330b5a49637075386872228fd4cc71643feeb8abfc70b8889aff5450e84fcf376fdb235a7d1ccea9a6ca9edaee990bfbe88d093182024450b553bbb4458600679a2244155c463385f62cdca794ebd438855ded6f8386dcd3bd45094afddc5c48e13b5b86fc1f072f144baf26d921f87857784d2ccdb118454334213a7bfa0b0a42bfc76ce4a26f1d1dd1e2573737ae5ea53084c2345aef627df05f0d8415c721946aa6cc00769098ecfe501b5d16e18ce1fcb93c0eafbed238da830ac6fe6506cce011871f882c9c72dcb4a840f51be3c653725a22a68b2e4319525e5cad5e497417c09d5b8147ed8dccfca79eb261a647b644514f7f6e9c29722bd6d1005eaf64bc166898f63440eb11316e109dfae09cb2933a1ccf30120abd0110974341c3c474519fbcfadf9d824d89b24b86c76a03497f1f981122d9a211079bc2ce792c85369da0815f20ab09071c1ed1da87edfc3359b057eba49ce1186269909e90fe8a06a235b6c9bc67797b9de57f3873a91c1fc9c4267fbc1714d9ab2c63ff823857ad127e8aaf366a480757ee1ea571c6d70cc4304764cf9976d10847bf54babf56137fa67a793751b5967e6291fdca1a83fac687957984a8d950e2faf4d76c7f3d144a7341f727935472022489c5b81ba3ae366a820ccb2e9fe3ea2e8308cf481539b5888c1e8be23785686ebe7598a60c67897790bd332b709491d9769903c4ca2a66c1df6db4aec75ece191f5ca0a48c8bfbe919c53fd2ea12f0e72bb2666e7a64d251a5d4a09027fffa43d125666c05ca0741223fd462fbb8d620e3859326b3e6ceedbd56049c7e17bf088894a7d776f0f8f15486192716fbfe865c0ad2f76b00bf49efb1729a0f1c674311f6438e84156ecc8d9a2da91887deb90966079075af0b814a2d80370d41f656c8dfa5c8fa34ec62d4cc71e9bd132d4917bc448fce2982a7fa4e26fd4117b045733e6411ca3412c35ca4096a102dc2346e297711a594fc601776628272bc2363fc690476e9813f26795be655a31e87c029a0008a1a8d0af8a84f5bccc54671c146b82e1c7a207a5c03de0678e4f5801dfa037a804f150b7a5a0dac2a2fea1bbb761c785828b62194ac88c88eca325025a69ccd049512b446ec11fa75d973ef3c042ae46e1009bf5a5a3083db2e2f7628ac1a56b230d8bbce6351b03dc622b1367212ccd01b77a92db63a3825acc56d4a0e488494abb9169d33d9d137f70457a21bcdde30bac8cec0e97973ed2f2ab3bbd6b77022804ea5f0482e29795370e57d6be30dae88d622cba002bbd3e01a9ac0ad41396a777fd52a080cecf4d84f70930d93a50eefb4cd8fa1844c33794d8216beacb222aeee7d29719ecbbed4ecd2669acd71e3224687d7977dc30130cb06ffba7ba9c9b7d7fb6caa8f7cdd4449e8efb94f7b5f29222ddc787f26a86fba5dc6f141af128acfe319aca566840a142a85a1f4f17a22bdaf2bdb8d7e5956b592dc456f4e5b3705d4b0be7ba5e8a5734cb67e1ba9616ee6265152d68d7cfd2bd962c9cc5ea2a5a20fa92ef035b8b5ad8f476b2f8bebafa954716fd09fa8021621d8a95fb6190e5d86d5dadde2b494e6bd7566f5422c2ed821c086ecec216d0a0647df5e97003c2ed401ba2789c262dce1588957d8c1914a4a3038adc9272d40c4cf69728a4a072771d0722ddc4b1aca0b0f237e34829d2ee621e487768e80eb0be62f46310b58e6295b752817cb90a62ab8b7924cc4d2a64b407594f02e2ae3a455689239fc44c05b9e8a143c63a1125a26900e293943213ab852b2b7feb0a4250dcb8ce0341ae4791c835606d12085db51c627d3ec4cf4a026d457b97897215efaf02296e9caee723e95a842583d75680be5248724e9039888d09296e49fd8fe25731b652a4b5cba0e700c4d74bc4727ad72adeb56487cc46dbea623c906e71e89dc84c8f1052d42ac750c7a62d365a3b28addc35161a4ed756e6461ca2458c045757abb73391dc915cb98e6392dd9038d37b274ffd2938a96c7d4412c9154323dabf544c25cd799899a75c884bfdd891eab0fae61472b814377bfc753699ad46db2704f7211d98e6d84fe8716f3373c096ce19b8e8a7587d01faec481a9b99998619de0ca64377bcc24fe392add762de46c199bd2ecee11de231f60a5cee2324096d0287bf718765dd8b3f8cf7b7d0f136f3c3197acc575d9935438dc0ed10969803e3fedc5dff83e939472c805beff347baecd5c1548ea0bbd670e0d00638dc7db5c2b0a6d94f1cba4346a4450c5ffbc26c0880fa9d9e5805150670b0a7b2f52477ef52a8f4165bc08e40edc7cf629b342bcb80b7df291a45630084fad17521e5c84a868688b1cc01221d8e2508aca724302e06b18b660c2a6870811b96d05ba1fa466b0dfabff42a8340609514905740e6b844e376d46e1ee5818f038bfc31ea391b4e4bd06834115e900958cc51271948b0b3284c3355f47cc4f212b3ff9c08f94517fda806c78615762d042eb4c93650fc9be2843ae16a6a32a11f302110f19a8241455231747f361b762555be84d278b7c237ea19020744aaa167e44d3337e0d3600b939a900085b8bf6fb1afd61abb57c2b633af6d095b8b18e051eac7545e113809eac6b036202588df0e8112d4d689225766e71eb128513da2caa4e401748bf97b8d1717d9a036a7beef059b404f84ce1085f2c74539d90ea629fd02f246c8ccf57d3c513dee7e8de55d9544e0956128a80047f2df293fa7af7d31a41f8e1406ba450056e2161bb6362123a648d9e7347ddbd53e0cdfbab165c7b43eb9e91d65e0b5a162bf92784dacd066fb452fa909ecdd0132250833152b91aec156e9dc0f92dce7565f7f69706ba0063bdc406da1c36a55be43c10219c569fecb29684f95b8ab4a166e69a3a773b8b148cc06fca3bda3fe9670851960bb38b9af0feb8155545e98498193a6ae63bb87d6b7fc338b1be47d4489604c6b3a43520b90fe58f2fe4e81aaa392d6b7ee9a83a4ccea0be264978f340199c8b702a73cae22400878d854323475276e6e22d759770097e9340889ab4420ea9c5112017d0866d9ff01b8432afd8ad71086f38793d44b750023c2138397fe459464d49ff76a168ee2420d1e80e98ed0188a0731bfb4fd65f438d41db803c1723017babac7d05386ff4afa5b96ca7f3658fe6d07c4bab1b9979d203270f70029f2e85dc5c4e1a427e57b84dc7cd23674e35aafe15f9ff2947eaa9a08a185a98ae2d1613599c2f220e0310aac479058b7101d769a8b6f37e2faf6346b3ad0fba620b12dbd238f36c664ec052168ecc63cf7f935c3ad2254a07bebaf87a6f1179e43f0ac825c6470513f4370eeb5df1388aaaddf2bee2207a68a1d102b870e2b970f7a5d6932fe552c09f907796d0d945b155d5002636d3566cba6ade7a2df8280ad5ca9ccc1d53a441d7355cb68d5419cd86704f2b989beb255c69f6013a20f50a5a4cd5fadcd28f1f04aa043eda75887c5997d3662567e44ac69712f68b58936328585094a0f21bce9e3c110f9645b55bc8dd001d553d8320f3dcd5aaf93d9e210f141162711c30805760d8a97bb333eb4d0fee46dbbe06bf282acaac574dc64c37ce8ac17db356e33d6190bd9ef6d2639525926c7cd6e8989cac3333b64851139b99aa4ccfcfd7fad91ff8d584010fa0f9d9e165772da3a535bfad7c3fa6bcb5a4d0dade9683df38e674e9ee8f0884bc0ca91a919ebe62c6808799599e976a355a557e253a826782cfb41ee72def1700aca685869a846a93bf106e031bffd098ba1d1cc0c10998c6ced42b31b4acd513564d3eadb374dd3b0744ed0b432e754cd7385dc5e48eb37f9d32b99d8ab7a38731415db47978180c56fc1e38b823afd72072feb067700c9bddb0bf3c7b3a0079d0c0037e57723d50133494a8ba9cc5fa2349193ce84b6fb79e8790779ec95458b1ff9a15e805f0eb7aa53e0fe86fc5a067e2fb724b298f5d279e9c16267faa39e2c7dc19578f611a8a5a7b48b38e25be7610ddc1d07b031257aa58e18b0fadf94513e3fd66488c6c1c3a6a965807dcc784c6e83e68492dcd301531b7a67a1a42caa462d3b4e4741de99190395196cb87cfaaf1ea6adc1d866ec2125eb82fe9dc0a62a23cb0853cc517b12da51b77594e44b973c3210dc2bdeba5c2d9cafb2f2efa2575f73a1d3a6590cf4bd5af3aff09611e5f50a95f0a501dbe1ab60941528bd022d449ea62c72d62d324f2eec2906814b9254474368ceb8e6ce84407878a50407f2a6d3d0fb9d825da3180111dca6964840dae005ecea185a69cd2ac4056f4f8819b0aba2309abf029b5049fe3ca46e0f0d837facc0cee3975a72b945ecaf1e9a2455040f1a4dcccbba94ce22e93e82ca7c7ff2465b1ba033458a0ad719ff734ff596e8d9ec1252d033071c88b8739a56a34c0addfbe94ea52f1dd267739886c7edfc9766e975e947a2d4eb8bee4be350b01ea56824714c07c1abbb9b92d9a5f4d3bc91265d14a29c656739256a61b07055e7a734b690ccebc7fd8d11e055666b986640022714e675b30900b9f6a939085fba680cf6bfac1538d292e137274296a3db95d82849267936b10c7eb380675f938e4740ab021875b0a907f3c811feaafb438cb90528ed42290f07a1b3aae5365db2810d312163e3cf60e8321fa07d488c17204090dab9de014883a0fd3787d7a367e526e7cf3f290fc5b38a3c573fae7d6065287a4a6d2763df908edec326a7f7e6bbf79e91cad26021f43ec49a342c32d95945558c561416a253d639e06fed36154a0f400c42c01ad8f220ccd69d2a70c9834fe4300808a80c4f5be14247a2d0325211489e7ca5d1e9f0317d229d9110477357512f1276bd8a05f1d0c99184388f2ec2b184f737975dd854917835bef8441940c248a030773d0534b3b6ae7fd7aecac6600010ec04096e75281f6b8c408e40e4a721482b0f355d76e2ff714645b7532a5ade0d8251e60e23280d183b43203d297964ca6d34b7ea76220f934f0ade0f80620d14bcf649e559163030fec94779ba8d0b85b9bc14f8505dfc8394873d2b294fcb445bf73074d7743c0d271deaca6fe8800acfc4a9d231540520a1ad00271dc5f939aa31efc41e8f654e5c18043e958caeb221a14865a8c6f9a651a764459ff3bb5f37b3d3c17416f9b5af5f1f0ca406224d27a656e80e01281f673a096cbe259d25c04e46b399c452193c4e4f173b206be5802a9790efb028538785e24e63043b26441f923c09a4895f25818fdc9b4f2b7589ab91e5aeba47f39aa2ba35ffefc52829e49a476625e515b5de21ee889a900105567543a977eb6ceaf3652a4dcbfdba5a9996d5f70d2b5dab68d2f51172dae4761864cdca440bd357dd441e6e0729c64607ffa883ea688a60c372bd8700fcf7d966d517f4e2fd70c6190a5f9b7f350d5f5f2c0c7d5c4374cd9603f9b3ec2bfe9619cd59a7b5d7cb825ea22305b683da39e905478f39148f420edcbeef776f6425d23712aefa609d6e2d769c99398d69706876884d4b459dd507ab718dce87dc6345e3a212c118a46be2cec927247a2bab2fda70a5973c07669612f442dd76c230b0b79baad4ca31663a505147253946eb550c1892a9e0794f4fa0a703dc4b7f55c628cef31fe4877259af99b2bff2d27adb18905269e04ac042f4eb469bdcece9e53d646a0754178601fcaced80c9dcbe87189d113694ec83d828441d1d04ec3804d44368286636d31b424f9adc3ccc9bab844d5bd77a475edcce7beba7eb06e82ac17a80ebea583ad68b44342c813e2f1089d4eb9fa0a6cd5963bcb65b49e3daa7e2e11b543d056e304d46ffe15ab53293435382aed68c228f6a1dd20b9d126c8d62766b39cdd2ba858e0f9b5e69fc5ac3f40f914c2fad136dec5719a415daf14beb1c2821589f5960ac52ccfd62ec6e74e3c1c4b1e4a9af1a4bb0e4d74bebdcc8540d018abc22d74b886f10483165c5638c280ad76bbf8bc35caec18cf606f66ece44cb2ffc75a558f75c7ed248400a1138eb6f772e54ffeb4fa2ba8255c5e715b669020d8538adbc395760ac0938ffb0b4d56581406b2928842da5ab5d8efaba851bd16bac74ca723f06d9bec4d82a2463a0344b02786b4695d35647308d7fd755f7363303347e8268daea983cec464a75e301777b96b5d54dc8f7f65ca82cc8a621c50ef3c5177c6d75ce7e5579797a4d6431dfafe730d70720ee906d4a5f6d756b40da1455d7f1dd21d0bc38210274eb6eafbbf00093b6ba9dd8406b3fb7a1b4f7e1e91fd091fcb92aa2c14f209f1ffec761dca86e753da0ba411f9f3f346b63a92e08d2f7438c35891cc955af0b095381ff81d3324eddf7bf6a14d1b7e679f25ac19249dd6143e603e7bb2ef4452ea21175ba1fcbe8bafcdf9ed4d92e10754b049cdd9000c0bf66c7ffef532bb02176fcec89a8b55e48c3ef51c6da11f6627b599c8ed40206665aeb436d81644117ea2c9bc25885f042ee1d802266a20671809c1b1c9c767655228da859c825bdcc5b8bc45c6b865b37d75ee763029574f75c363fe6b055382b8f4041dbf1f086bd0504f336e2a55e42c8108db88d80ff1fe1a948d98f403225994431606b87fdc1ea58aaa41e76809576e5159139b33026405b47eebc0af9243416b25aa05ade0a91cf7bbbb5925d6b3e5ca389f58eb6f4d734fe1866cccefdaeb1c34dd8b721ba8c9ee75731a212542ec3da7e3a6fedb85e43c6e1abe4bc418ee11db5350f2c42562caebe2595b7216c718775f015d7544448bdc58f633e4b385ee174ff1d10de268c5d484a7c8726c0188986f1337fda4cb707a901b7d27747bf62c6c678e8d82492127ad680ca1d1caa4ad6f6f4194c381097270f798c1d679e859b114a4f18ea15230605400d1b04a8b765944fb2b3d8a864c93691a9cd406a97221bd7a5731773f9d678ae729b4b3816961e9ddfe4d98c5e3173d9666ce5c22dd940cf433c83e2fe26e737f1aacbd9cc4da33a4af3bf323f9503244601f9fbb121b25e6566971d8b2f5c906a456a88ae3959ab10c3c2a82316def00d597c7e2e68a2e8982f2ccb7ab6c171679dda062ef453018bb0b191f194d0530e29b6665066c60c314f538dec90e8702c3aea463f0f63ff0ada1187b90a20ad10c8c6ae09712602bca45342f03630d08c758fc6ad4bc9cbbbcdfa07f04a8a02d8a1cefcc1245a2d645dbd744d2efd873b8811d3ff4fc5bf124f58351a403bf4a514ae73f3b622284077bc31debf185639cdf72725c92df689ab4c523898f0fd22259c97171f52ed6e25b1cad255681a3ce93697780fcee9bc1ea5fd70da55146be44d413ff9a9658311a1e4224060ccd2cc48c8fded46a926eb8db27f04099cdfe9a803b31434df94411b159a50d45bb3d6d9eab5dc140c04d93bafbeb52ca4819c3cd7f45a9d459c8d0d10bc6ce8169d1d96ba43e29fe2904e29b29a1b42e32f8e56a41cf4ee37f6e22c7177639c25c7669190d797c12efa5668b133aa3ef0819f5e29e5b5cc3839d3ad45dd6fa0574b4626040291163ded43e0d4a873b4cb5d9650fa3778f14b56f175f6e329f4a0c62ca72b8edf48da7f7608a6607215217c353873d131bf32a49f7b66878869bb76a18c2a0ebc029bc072d8a6eaea8a85192b55ef66627762db208581404237a1a6b0204972d58d4d491fb3d308388e45bd96c0528e91f6712479c93391f826e59ff54c9a3da649afc614f9622af260b3c7e09078784d47d9210ff666019a93e797a9de1cedac5b2e6b44d2eeb638d24e46db7db974e7d03a081a2914316625dd5ea5d7334092ac2226b8fc603e053b123a1d223f757ed532f92cbc11e8f77a79acdfab1dcb30f17e8379d3cafc2542859f66df23490353cc23c06d430c49d0571080f27ddf554f57b4eec0f721013fdbb785fedc656885f62eb3e65166b24aee6847499d1d5396ab14b0712425d66fffdccfd7894fe24c9ffd8aa8da15932015d4d7daebf1ac3b7f74a0c076b6cea2fdd956b34e00d14eb8c326150c4c8c89c5f424298b78b359ba76d471f11a3c2d5043c2e6f4af0c454951fde632c22717e9500d3c5ba6d8a5f3207ab28b1bd87cf2c3ffe65b77a2f89c534fd45351d9f77786706ec98cd3809999289d43e405e036f50af94e5601424865575da1aed88d2d52d54378806cf641f997042260007d10c4878178c1ed9876cc4082a9d3743af30ba422360504d237eddff616483a883045c0f12ee6e2a764e339120d1e82c6bb38755bb80c6af44d16a5e85a8a4ccd62eb8456f604af964219afb2b02fb38192c87c3568f912ca308c198f4a183937918ae01d7a5b46dbe5aac2d73a5f4548fd6e5c165673759c2f5ffd33d930993558fd9a46f66cfd41eb574d44437930a1842c42744cc69d8160728813a154102a4da53c90583045364cabe0015437d520c7c12d4965ff8ce53266bccb0c0d8fd5b4f3bbb9c07a144743f35aa40b1f6503c73c99193e5bafcc1586cc319d928a9c599d30553b6c4e130ad236d9f2f0736331dc9d43b65786cb7759c97094ff4da985bb683641e29e4d4d67b236d191807fe01c3366704251aba308411a0809f8a3038e5b4468dfcc7219af76a1a6e1d409fd49200197210fdb2a94024e63db3d16a923461d95d027992ff103b9d069c75b5b44d6701089131656f6df0cad6c7244a3f92e608efb5228c0ea2e2681ebc40d5b8e42883736b60ec6f8cc62d54b302a20130b84b75e7d9441c69763f4f2dfb040f2283bb2e922a27d13806364f9a26a66e022576b90a2c297802ec7d4b17d508b40f216d30dc421e044f9ebe491dc2982d140667afa542f17e603b15f0471d91bd95f3d04c201452f1101fb329728819fb2410fa7e774d527e24675d9443b419e51e142a22d3eec4afa30b2e97be0892571029c4bbf0c318146a8538ff69d53490d31a9c2ffbd7489ee722e1bbac45d3b24eac010b607b758783ed2f9916d264c2ad51bb473c0846c0b8bdc2f2e09598ee380d57b6938dc955a4da9a2a6ef7d102b1d8fedf554087a15504cd1642974f837665f44b84fc36251680e5c9688d579cb90721d747438668bd60156528dd45c251eb765370a3e764deace2d20de0fcab5234523df4e79838f01ac2ab7b79647db9991249c61cebedded09880b6933e243b92113ae01c02cfaf4089fcc740fb0c13d0c1896fb72a307534d2e1438c15cca5f3b9c82a5508a7e41dcde04b7cef94f0f904f1866dd6d64976d82dd232cd39170415031b0bb5fe2fb175cdfaa48c2b761e62e89982ebe63177f8c3491873d7eca634d2a3187d23427bb9d0dd977e0b7fc039d32cc680f9bf70528ba984b91892a5bfc7d83a4cb058eeb4c77df9ba2302bb1615cd8d117de6de2a6d423f8dcd0e7e81a59c26145cd39cc7a869764804d397c93898655ecbb46a3c2d86c87ff516eba878bbdb234219fbe34e90c8ceaf5d0ef7e8ba5d4331ce8f2e41eca678728469cfd7039478e9f0d07a45475ea7881ff287157165f9189a7068a9d2cfe2ef4d6ca61d1d04e51e1f2e6cb12ebbe5577bec50f1ba7a77c94e83ae982eb286aa57d7c2ff02182939af6267dc4ab33b19f3d24572f8d8aa0f5405db39bd6040d74b9e8ac97b98b109418092a8e73432e064d34b1b8a077071c9d83542a424f7a71f6910025132c4e5fe2364c613ad65a59abe765975b2448d60389d2e98e26a477d154f7d9571481454aa751d73a79cf573b54305fb3dc1cb50fe8bb0e04c96d1690414412616737a64f575bd00c6fb23f646893db8659f3c7b037fccb4ae50f57b1f1ace372fe2781a77bcb06c90ad061fd0646aed950a1e9b0cd3453b0197f9c5ade316e44da72b4aa266c8f4bf414aee888682e36a1bf2ef77b967a0973a9f91dd7d0c6c51bebee72e9a9ebdf089edc791b336da0f2384c7ff4ad354352010f3ea871a4bd56713666f09871e64f3c8ef9bdd9093678b14a4afd199a081e53b96638d9fe0fc2962b7b31f39a75148f9f26a2f999a79d98f3519686ed90bda85d9b484d5a0722095a2d2c4759f1db09bc2e9e244a32e713ac57b571e84eae817d8f8445c020b60efc59a37a08c01b76f198276c668ad02a86810a374558fa0164611d99baf159f5f9f4d63e920610440758d4fc93971e94f9b4692697f0db5d72148771ba0a1782944bf5fc8994744f9729fd1de4bdab10d4d3b5cb438fae9d23d4b14d55f551a80ca124c88158334f63e3325230ba542c88d484210669b855b67ea5262cb6650a8d760d6999460c948d982bc2877bfdf8491d2c38e43cd27a03574d8eb053d296fb0e3b8fa53e359fed445398bd8f00e9ca59957a9fb6b25a86c032e9626b81161e9ebd66764b2a0bc32f8f8042b3c23736ccedc18428675f7fed16878b0c2d374c3c7cad94ca3146d498973ba3b176726da11ea5417be3ede071e5d65abfb84d90ce0cbf2a3d26b68d4ddebaaffe26d1cb430690d68bf3b50e9d39973a04f421a54d7355eb5d526a87554c9c0ff1acd62bcbb2390338e239abb0b04a5802396e4a56f7435c1e69bc848126f2a3cf7861bcdaee923d63801f44db3e44de87aaa420af42a0e3880c88cba3567eaef8f88f3f72723abaa1b304129906575126adb9264c91c34bc7246639ebe992de93e0b1582239be92f4bb3e2d65c5c6c4dd514e41363cfb0aaab16a075d1acde05aa0e4cc1b94f07eca7e5e919096c73f0fd32ef659e3900070ad3223dbb31691912f693f00030bc863751bf1dc9f891dc195c11a0f21722057bdf692f22fa80b6aae647d1acbecc4d76c431d81199e0fe3dc77d292091e0b549f22626fb55cb6a73c7b47f259bfefd4a78871f3f345c23b8967015852c44fc2054ee73e050e5c8e34b49ed3a7946f621e4b8b6a209411d5f429054af95bdd125f97dbd433ed15925c37c8841f8e694df50160b8a003926eaeee169c3dbfc04cd5bbc47003083325a838245f669b5535c1a02f771bbe0c1e2589812a485b0d67618e8152670764f0e9dc858f8d0ce9ce644e7225e7962c94a6676a73519a3194a14b73612295b47c891395da891de276bdde90fe9a3a34510bba297397a885c84c4b57089a67325662caa4109086c688e30ac3ffee424bad42849ca8fe980a01923fb2c9cef6929bd48edb87930205803ada1f0e32eb54ec65cc1321cf0d93518432186a326fa26efb45c5d74db36e98e88ddec83ab563187653dfb1a60a03cb55e61a0112a21425515cf2ed61b21a71bc62a78bd58ff7c64c59b1404796bfe92af40a2883d76e24919c9fba30f355044a960f1e858630dcd0414874fae50a2d958d811593f0326c2adb9854f1a7740cb44ab2e2894683f21a93f3a232507b19160fc33d90f05d94e0dc106c962365d1923e14071e00c3140e6a4f90a7ce3c237ba5f758f3fd792268a5d7e02a359154aad12c0250a2ff4d45ca8f8cd8a010954046e19e8c0a0850dc38d9c4064295e9e358f3532d42f9b2558dd12e014ed92d46da876e8b770e3736931c996412c812426db6b666d8ed010c54fcf31fd3ea927426e1f1c92a6c641f21e9b95792375a75dbc88431460150fa9eb3fb105d907aa30411c5db0d04f18f65cb02a3c04221dfc4b15d66e194f398c128a611890af710288daba2c11cf67f3e8a33040519edf9e24d6a3c4e49e425479aa56298dc896e92d5d22f6430624e9e46ff4d4094000d09f3f3846b8804d24ec0d6b9f61a8affc9ac0e1f2359b8f324cb74f10d84b0b7f3a47ab9e8c2e421dec8fe18e968093ade618fe3c86e53674dc82aaef3ae5492edd6334b4307b9d2b54a8828f3917de662c06de4d484b4c563f04426e610d611a8441aab1cfe91e11206d8162655ee7adae65ad4f9ceb5007277c0b3afb7ac15bac024c716d9712a69191e64676a826fc1929c12bd42d831a7d481b0256d1d3d9fc8787611279be72d96acbbe85315e46990b53c6b84885d8a800d7b62d44955773ffc650420ab3f663beb91c45259119d72e8a65f5d71c6794f2604dce9b1725c352f72bdec952773894c11dab841f5211bea825ebfae254969814cb2f34d272cbb51ea6a200a643a7a7c0e4b0946fd0246051106c0931d2d2299e77b21eacc76c80c040b781f301a3103c2e98b229ca6cb1dafa64cf6851815e3f6df388ad53196bb5607a5c6a763e9439ca4837329b9d997cc4ec3e3c147ba55e9bf3d9cb2034973b46844080b846b5cbd129a079ae30f0390b41808a17429a6c2b2fc2534664292a9969456470b6a76f768d4de45eca512b7017dd3aba09e45afbe385768ade35faac8b34d8320f59cd3973dc9618a9b4ce42e01dced8b6092162d2d05b6e611050f09157e0834eb1e748ab861e6f751f3d0a7cce1d69dcd343014d857af71f9730925fc755ef2d6638417e66785fa45c981e76dc2582dd9967409643119912959e4f30c6682483cb483fcbfb231400166cb34b9d3eb68525f873ae3a8a44df87f2ad684d72177bdbbd52834e439c96019b6de97fa9ca92ea1864cb2d229d1da3f3e5b271f93eddddac4c696e3bb1f09c6002c662b3f7a5585e34e4618cbe892aa65addbbff306a5138fa2c8d08020c40f47cc6cd0e8169e10a27c489daf5e08d7b2bdf94d37c5b7b74fd111bd7130a93490d0acb1fedb85528117c928da16c02b66adea6d51d072a363875d3a77982a4bd5484345d2d89c6c5eeadb497f51131fbbac6a72d4ed81a830cc76977ebcc63e5ae933ad55edfded3775b6b2d1af27b4112d819f9ba67cf88beb1e37e76a5c71a0c99907821684b47f4bfb629877e085e9fae2e4e777d02d3b562ed57aadc13e7f3d07c6cc65d96fd606e8cecff0fe79c7f19f09d0f1809cfc5da4313a636a3b4e4865dfc7e937beab82bbc8c772a3e341bce5899f1b4c90b0be656e82f52b17cb4337346950379d1d5aa3d612fe1661ae6b790ba077be253b0328473ab36fc196e2fd7f1333cca83cdd122ef82608503edcedccd4f9e382008bc69ae3ea127e1f1b08288c3df4614b4034c4011ad875fb034023d95f91e25289bddc718b1cc19f2ba93f613650b9d8af0dd8644b6b10a31c79d1f5f33c1b9cc9d867af231645f731f713eb701b75a870aede061918f7128fd45ef054f7c008dde0520578eb9360089fd3eabd29254b27ea21acb45460cc877dd2a6bf81e206691b64b619792d761cd8d0ae3167fc7a9014925bdbbead841cec4673efcf6653a450400ba38821440ade82b52acf712b075e33f29fa1154cc41dbfc7c0e15c5cb2579a202fc3eb2a45c02220dcbe4377c09fe33f8a5bce5913ece14a2f04364a4d280724a86c1630c44d280a6598078d31a95f7f06c2469579b4a6b524c93fc177c72232c3d5d5f66dbbfa161b670c382155eb40146ae1a29e5376696213f2a830c8ea917db9c0378ee49d50826172b9901a31c937f0c472006debe53dc722c1f32b77f3a293ee50e2371d31b0d2fa226c9878f1054d6e6bf380ea38e8c3ea3587a3008585065a0fd8240bf0502a550049c5823917299bca74ee528e93b12c3822b23d388a676f462533bce04a7ad2b5322aee684d5568e4abf7fb8712eb55ca1c5a19e308acac967a9b013d69b7c088ef408bf38dc6e11aae433847ef0c70d0a94f173015b63b6affb530f2722fb3a3590aa6f88b04b261a166264eeb6c240301956a49cf327694f7bc164d584956eb4c46339eaf7df111a60182e1c805cc7117b865e333252c346fe00c4380157bdc57bd1305307105c43bcba029592930c6f98bf7eccc0831bf073b752e734748625293a1740e4c27c547638421eafef3ba1c90fb68dc1f3307a26bd224d390971d1c95a9db320daeab2d5423fc840de4e79483d75e153c0d77231d8d9986afefaa2263816e72167764b9a9cecfd21e293526806fec4e24c07856c4b4013c48895abba6ea1cebf69f760b29f4565c27cb362d6a9afaa13fa4de627304ed90fb81741d8ec1d93757ccfd55721fa6e773f1bc289042f27c0946a1e3e561e4803b03d03450072b883fa7b113bc42a260782864e37c4d682e8c4476791451f65d29f536b739224a05c633f697410495b2b1062205ce5a81b760581417f97005dc3f3af90ae982fd9c1a3b2c5ab6a4f8e4e0d6d84fac3c93bbfd61b74d43019e384e08422c44259c3083ce0a96b9f3039655073017c91c45dc6cad87ab76e8d1210a407ed93908b1f647ea956be3ee1c661148641d0a32d0022c781f952bbe406f005b4305fe900876f24ed8dcbe23dfcc3a4294f05f487b56cc12151b43a04ea23655566ef62d77adda957cdc78bfc1061b0ff36851ce8acffd0b5871b7388c37e7d72537c20fe3905e3904a68c7ddaf9513f3eb7f4a4b7a1d0904d1f464a77e901fd30dd7081839ae61629d28f5182e33ab9914838bd3d128f3ca11861d9c42d73cf87155b39ce8631bfa950a2474afefaff5879b3fe17ea4923308ffe975110bf94b1ffff195a38930ed301e7564094854b6e0e2787f95b7722cec4a941b38b222c26ea31e29609ac887b6b0ec28e7333db62ab117dc51e137f1080881cec0d5209fa954d08ab7d3fa35964960e4b7cd809a8bb43de7b104ab6bf0afbee6c8bad49de40602e9f6616321d6e406c6fe4a670212f0bf34dd508c8379f08120da81013dfb0056f894cdd95a1c22a9fe16af2de9654f7c244abc2bd4d282a5a10219a5d9ceab32f7555c438e267a7a3ef42161e4f61e1abfe28d90fead0e71fbfe7bbba10d043feb1a50667cc398c6e77ba8ebd12d0e2aabeedffa216e3f201721b8ddb00b54d4c41b91562a2f4824fa0742b27dcc92d1ad8b045e2448cff9f5bf4e9849d7182769bff6340a5817cb8a2f09a58a56b9e9e54b82255c257849805e9df0651fc50a4097b027f53181d2e262644497cbaf2112aba4296f4bcd791819eab19922e148b0a57ed0fd5a9835bb1a81f4d7ab01fdf1dc2b67ff3d8404fc93520683949ae7a20f882cc9f63f07237757c6048b7315a05b544eccfb2ca7a209939d96575c51101e921547e0eecf94fc5c325f76f37a9d471c77d6e64ad1e8ba5a91098a222d1d5c8e1132a63ba35060605420a0d28a8863bbe0f09d0af6ce41e4aa0e3bb14bcaae9d2204eb284f4cc83c891ccaa7d5358036e962cf84fa59168440fff090861a9ee3fb7eb97e6e344731506b46ac5c94cd16a79de0d74c0a7bb1ded40ae59123940084e658f34939883c30d41a3e517288ac3f7624dce435f94b2fd1c1714c28c47ded5c936dc32318aa07e9b6a0712334e6114a1be84a2a3a7c0c500c0d6968548765b4ac8a1e8b7e5f9857cec59b7d83ecc89e66232fe708adc13f8074b2c05b430df24a7de6a8398fbf32853d4f5a8a8250f8904acbcd18dee62940bee0bc51ce360de2adb18c10a52d862a04c7441cfef79bd22367a27522e52726a784b2456c1cb6a72bfaa1d1bd6c536573beb6a204d60f7696d0a87dd2a90341c4695f6095e25cc42ac48e83e1655bfdaf106eca983d5d1c8c1aeacb3211bcfce48d982d110816cca21b92d4698bc88c7f9cea36740f0fc34533c3239999ae4a93022ab8e33d3298a0a15802edcfc9787689b29b029de87e2c572bfc4c6f7a14130a873dc4c30e3e14085ff3b354815a50976110e5412c08e3c2e0252e78fe129e47b940b1346eb5620ea18fe1f1b55c9b0caa0f2fb149031e35e82e2830463bd46a564793ca1073acaeebee024295d160f5469db7cac4b00ab8cb07edad841924a64267b4cd524d9e3b20172883155e14388ab923966b1dcbb44eddb09153ae4efae5815cb378974b34c48214300c4f37b18f26f848f195995118b0d9ccece6accb74bb32802cb7b3128a559d26bf24669aa3f9952af20848c3259ad233beefe3b578b42699a8b2e317ef5e50d466b98580fbf6f1e4cc3a51269130f4530dd0a30a825a5ddc58ed50b74c18c12a0e5c754bb6963642a2e1daec1937317a2cd17b0710bc7f056844b974ac7bd0ee82431c2224c8f2de5e4f805f316ee7e230b3e31339b28c65f90b05f5503cacd915904103388ea825744fb7948fad91dc4d2b6898bd32379def9a67f8431ae274be5f8e0ab151a4ffc54b651687c0dc80bdc330581c996938262e6d7de631c2326eea1af322cc2ffa87a595c5aa1155ab809df42c359d16741c0e1f1f6e6a75fcbf6435b871b90247d9f1d58d260a06fa14ed29f940e8729e4c12fd06f9a40711e8e8d2e4e5c4fb7d9b9e0c53ecf41e959e083095c4334308888c14d2801a2d69642747ffd23506d96d8fb3a73088b46a81f4fcf880f19135918381cb5044cbb1922208366e9b18bbc030c9b74a80b72d6dc594f298da86ee1d3b5597aa9ee4cb633213dabf898dfae499279803aeb96adbfcf88bc5f27c69d923c5722a643f047046ad5216b67be29b5055585026f420b31daa4fc123b40e4a41058daec47892530d2826d7932faa377f58f2d44cdf678dcad8f051c27b6fb90d20c529ece6d890b182f6c2951ac01a556143556133a6f5ca0df7ccad95ac879564fc175978d05801105b9a6d7aefc4b7b69691abc5c4ef85761feec920d007aaab7a513d8026891dba86ab82a26c67ff0a902a84e3bba9a5dd3044ebf4eae8d80c917fe70f78fe09704457e74884143ae988880b027f45c8391afd65f35fd48e578b19b234fd06773badf70f7e7fbdf6c934458c210c663e3490f311fa2099f81d2890a3e771d97da2bf8e6fcdc84027318a1c6de06d7788f9814a5f436bc2e66e6e6525b12d1b9cee8287bcd7a67cdfb9c4a223b859beb6488724d61434dd912486894b596cb5432d698c7f3acca966fc93987186b806c1689c7137928281fa887c59daf389f0e35a861af45e45e46fdcde8f9caeea700ab433a00bc95140b8413762e50a294328aa7204e2b6be7bb3a8c0bb2c8c35968a9cb30e5835eaafe50553e98ce9c7c3d0dc2aa3ea682f501ab3d39d5b3795655dd9c6f6f3b266e65446202cfb5332763838caa72131d11ca97cafab6304eb7a51aa3a07fe12745cde8cd74fdbc0abcc1d9654ea74f2e0ab31f95d4650e90ac97f6c29fc9e9a45344c7fca9769ee90370d0548b85fbf31559eae596709bc02d10d4df3f4129423cb03d268a7429832ca75692c42fc5e8fb6e3364dbb469dfea90e145eb0fe4fd10590578c75a358832670572bf83281b70530929bc3cb6a50c983f0a4d98320e58310b065c5bbb8a19ee2bb2fa0cfe8ddb746f26806d6842789b9ac63a82a76e13225c4371a099a86a3b405112fc6c3f80b83fa0db136800782e3fc5115cba43aeb8607d384a61a42b02451952d3bf2e0e6cd97461d439ab8700fb418c127f18a34d737c9b49ffbd2affcd16fc8340c7e211b47f945cf748e13e83f99faa00d04a2d0c76ef3e809f13de473dbbf63064e1d780b882e62ab2f64302f327188805c3fb5354c88e57af91037644ba592392e9acd2488fb42edd5f12c2aa279a7ecfcd8b22e25cd5d3bd473e5860acc34e007ad8ff954e79f978cf06b77c83d6ee46add9b87c3d674886c559387c3b461b971038308f6c93be8475c422879a1d54614d881463335ba238cc0201956aa2a0e2ca824f9df7238cf09b819af5899469bc8007991f95c2cc21c0f9b88f3ec68a0af9175bbe5219570955cbd4ba6a98f38f6efc4382eb631ffb083f4e2e30447bb329d1257f38b61cc55bbdc9b7dd80807b41e0ba9988f2d45466e76d607c81bf89ca20bbdf26a5dd0f5b22be0a35b2b43b840996b3b976c3573ce70bd78de5b9f404d6a1d4812e0d74144bd05788a410fdb0773245cc35c7f26164cc2a1dd24a475a72811e4bc1fc48da345a3e93605a26734ce0aa27d366db44598b673434734fe516380fad9a0044f2acf8ee40645dbda179d962970095d04e253e64ac9789805650fd4603f60318a8c0ff51832aa1ff6860692704a6adcf8ca207f47c019a27f54355408ed0ab030058358e3550042b4dd3d43253c8f312eb8a0c4f0b2ba1832d67cd819a73acf24c9519686680c68b7b0e946c95bcc7d29c0c10256504e0d162e7bccce40cef72e3261bb7adea8816216932a524a59432330446044404233658e800352cefaec4e6c9da87664c919181eb89ae71a05db569e5d1425d27bb93155a6081995e89d357cddbd20767473622c0acc4bcaa7c673c1869775afdc389aa681fef7df0697bd08765e6765c9af9a97b897bb9813399718a0ba333bbf03514821b13e668e5611da47d9618c046bdf7de7bc72ae5180bedbde8e3d0f41dd74694daa42650a5c364733116fd647becb20c0fcc104627b798e65588047b4c305868c6916af40a822345cb5c07c6b3f3773f7986b5f74953d8830cdc95ac2be92367c59760624322a9a3baea75f84e85814b16f4de332d1983bc87a34b3cc18e31e543b0f25190298b14a9fa219146d984724498f14449f50960cc655a32f1d43321f171667964c25dd300782216b86a564b5e15ca6ad743a544fa884a51f55eacefe6b8fc421ab32e81486540d5e80e4f1e8faffbf985d571dcc61c4cf0a9b4a99131fb2869bab291d5269440c51916cc282b6e06ac8b4085bcf71e0a73b420de7b0da1465e865037bf8e11d98e1d63ed672747e1bdf75326bfa7cd7a587b9c49d79a62c85630ab587ca9da052316971562b454d4f125e37929ef65dac787e3eec3eaa9bc2245b836d8c16a3b513374c589e2895ca0ca1fe6ae94b84ea4c82db810232af2019020213f243a44625e43282ea24c26efd76711dfcea8241c6092f1e64942185dc3b8a4bdfbfa94f809f4928c4a70247d28787869d4ecc70a9db6252c56dcd7f45c27ef944c9a14590916354e068a76143346b6d70695db220143b5c169bdf72ec75da9656a737bf0c9f3762dbd9a77fff12cd4ba39e74c9cc735b46d6dc6c78d6cad89829b72245963e2630ccb2c80d6ce050f462a2e271a1c4f185408a49867ce2b110a53075cf5ee73593d6e3be692b57151ea7d389529619d64785d2654581a3f22082bad1773864968890acb7270b034a84e31f6defbd1cd9adb1a0172ce393f61ce32e7fcc867a79c338539daa888121f633df28cc4308f7d90c95b91e63910352cb5967458fa63abdb814c061757bdf7de59a872dc7bef47ce392752122d6b0428a359332584b8d688787c0a52568e3f5713d11c772a73cee5a3110c7452198373ce6b27086b765030eb88a6340f353a31425b201f3e39742634ddcbc555db6c9b025a08ebd8ea40c448c1a7d52e3652c6adda0c06f3a60ea0fecfafd112636ae88d82395af9e5f6deb5928f60a30c8121b1153b1e684e93ec24a6296b84955953f9b3a150353b6b1fa651023926d54b082c131b05aeac9c0d488e1d5ff40e2b83ea153be39c73bec18731c39a61d00d3730a0ffed9bcbed7fec9676fb96edf552499c73ce3987327f3f1e2dbafb5da1d8d34161378375d3d635a580fae82a1a337283ea51231f8ca91f9b00efb32c0ddc131f498a0972a5f7ae410c26044d0934371d298bb8f551985e9a33029f64d21acad1c531e21636826be8ef22b09a11ecebc767426df6de7bd8c83fcd627ac97bef5da33aae0ea0f7df862d2919ddbd03c53c49195c52406e5c50970b4810d6194a0b1b1a4a33446e26a4e60208a66c57684b56cbe9424e854459f653e542e2ee2fc88e0a137674d0a3393822bbea9a3525696dafa86e3a7d3fdcd73863d15132eddda971c5b45160694d971484a570b0a8aeaac87b585afb1d8d5f9c3749ce4e225d9a2fe2c7287808e54ee5f8088e5f98316ddeeb871207257ba472b078d18daf9dac2990485c8814092b64255247c6c4cda5a42ca42917a8ce627c927a5591ae34aca3a219aa0f70cfba9cbbbb7d3d30ac009b2d962731e4549d5249ce570abbe708107cde2866c2de7befd9a8fc662bab63bf16aca27ddcbe470781b014bac1026f5e44632c2c572c545078275040655587fa2cf6dc231a20525289d97bcfbe31af234c78583d2050a81cd1cca4303aa30b61a787d132edbdf729ccd1ca725c25ba7bf5390d923bb236a1f6b86af2dcc29c579d2eb63c9af62be7cb849714fc2504b4bae1b71e34eeb33398929d9db148db310be49c0fa15ca0ec54f43982e356e33ca119c10464c74cc14675c523e100b1b0bcade9944d8c03ea4058e1da967522752315b223982b284be4f525e90227243ed4e84c95c41d01681f083c09d8b420f2f1b593db43338c63c04aca87ca0fdb0a38119c101b819732e3b25c33ab628319626f8792e901d934a6b3450616c7ec7d66e4ee702c70735a3b6178763e06ca429af2ea24e7f9e28a73cea3608e56d6408a96f3c7d8fc795ed1dcb1d938ef8e4157ce399f007632b7f0700e845db0a6a54a1e4d92d55d8f15d99405c42973a702a9002a2eb29059c92ce546d564a80457e96a1f3a19cf4b79da876ac1662e64aceec9d515059272bcbed959dbe2b038dcba9e8daea450353beb7ee48668ea084155773fc3b59a7e06ce4e003cb5a24a3d73573a2e5509319fb2950f487456ba1df8a88c73ceffcc6f99139a2b9c1e11575677753f22696b28863ab80fd960ae5771ce396f6bce72fce46f3e37e7b4cf8b948dedb21b0899d9920e9585ad74ecf2ee1dab7377b1aa65f5093274ede8d60c6f25ca823e463855946d404356459b73722f4d0b721aba7c047bba3b25a0f7de7b6ff4fb87d82cc7cc049d8ce7a55a12c9207e2184924102133e25481dc912c948ba57a466ed4389fbc5c1203c411f0023313d91a7a265c8c30fd09351df09b51d2808de2f042403cebe50d49425b5e15b9a69a3a650ea5ec69a279e5834a8be579eaab8a83569737199fdecfcfdfa1cd8aff7deafd3dfaf772cd71b8527e79cc32c618ed6e5c68b730b29fc35fd7d51eb59b6c0169cb124f9f432d651dcb8df8e6f2837ff5849eb9ac3323d9f3ab81be79c7b29190358b1ddd461e564605e405ed65ac8e8765ce674e2da346af8dea3f2bdf8b7cb1d0da33bb75199f713c09a2e8c1325a6248fcc86cb021a12ddd355ae248c8d864e32fb7176be41a62ca39fe12d15b8c599b2f56b16fb0463816e8e6dc245c00dc2baa65acb17a5b3b2e450194c5a728a4d71612d838a08ce92965111d20770297655ae9e243cab5a50adad0ba5d13efeed267e0b276062255eb8f47eba2ebc4bbab4a720ab1160461a1177756b2f665b57cee8dd6b8628c6d9d9c4f9f0d377a53516d4212e44946a161782a59995d428bd219485916632b9917ab39238f3209324267563f4b494be3319206074664551ce54a35462b060f89ea88acee4a864e0abb12a069e94cd4e1ed513b37465927ef0bacaba5042c3e05bae2dc1a1f89aab7a637e4e136d5814079a4a3cb1869a7b5231a70c0c9e0f3fca6a0bdb13a64dc21cadcc719755722dfad076c5979021c0d618b13eec5c563afccb4b9f099d21d54099f68169a34618fea0e45e43a81e7cba3bd0b9fd60fa23288891b98401a1f23322c70e8408e4c804c7a7d95936e946f72ad7de21d05b0673b432b04c68d560c8ab873479180709b7c9de7beff29151e3c28e89aa1992d5bca3754870b45a54d2beaa2a70223e1488e6cdb3e65825e4a139b5c656a29542041d9184d7250ef973f6bcd0b218da4f015ff9e87722121caddcdd51a9c9122d4b37161538a314745810ea66deb86eea545c65994f2737ecde47888a5016ef1ad4c239e754e38f8afc5193bf9fec7befbdffb8840d2fdde89420bc58805e70a2494d2baa6402c94e69c032f602f5f3e2c47991ee1899a0b0d42425bd2bbd15129a0a6919793b682f8acf9a469ed6c69479ae282f24b8e328f70124db17c29941cfcbb2cd4aa7f4bae309b183c26cb9f2e50677a2946da2e2324ec94c40b05078554cb44d5434cc1c0c75b6544366a8cd64f094a8be611ece198dc6917a2deae568a732b52edb68fb732f477baf6539d830cb9c4b79efbde79cf6f9715b467d01c7b48ff7be7682a74bad360c2fa9cc88c98a28b4b30e12763837407061216f128e829930472b3fe523affcd950a88a999e9345914dc9a81bc3ba4a066145078381de7ba92b0c44dd011aa0014a665f082c2625bb0adca8216d54c25454e0e1dcfd4dd9e940e3515b92a36ad28b6049df9a83e33813b21146e10981c6196e24492953269ab6ac5a5022e8285b420572bec5dc1d8bd2230102e7dce8c284e922bd0e355e8197b393ea8f604fb416aca27da0ba8f9b2dc17215913051a20acb67a44f685458c94d39255f4ebc273cc86289eee19c732fe32c73cef9b1f7de3b16f3d781d5acb171f049830112b419922db58fbb116cc99444392d6590269ccae49c73ce2f049dbc5a4a6705689672a65070017565916c11f1e954c5a958defd2d71397ac69aaccaa51a0aabb3b80f552d5b712af30b8273cea9513feab49e65a9ea52e325a9107c52a1d8f8ce5cf7594b60460dd47befdd28c71de80d35f9ce9ca4512e7a3c137e9a9a4d1f0ad2aafa223b859b1e3a25ae959d1dbca1a1b8ecd104cb4c3c6724e11db18ed07833f0f4561782278a4f8c04316d61427a2752a55525689501bec7cef372b46a4cb9a693f1bc94cc628cb994b15619cbdd7f7ce49cf31ce32c7361079ccf4e136014f5a8670947c433c4031291af122d6126486e3eef879e0b472ed627b41094144a69757a784e48152f79125e119a73da87735e3b05450c7791030a76f1f355b08b1b7612ec388e6dff85712cb43de03fffd8dbc5382616ebdb830bfc77e3d77fd78ea777f1fd28783de2ff82db138bf0edc23f16ba5f588ca3e4e1fb5fd82ec64df7fb331031b8f8ddf277e50fff0e1a60dbc3fff8cb5eaec894afd8dadd32344eadd88edd72b18306b9e862f0630bccde9e40e1bf5ffe6eb2c20ffe16fe59d4c4bf117f6f1725107fef41fcfdf7c0ab00f9bb3f86ba0bf0df150a8b28788b71d32dff084421cdc147f816f2c627da450cf5fff605db825dc176ff1b57b033a81142c0f09fa639c4df4318fb1fdbc5137888a3fe6ff85ffb6fe1ffcfdb15ec60f01a81e85220ba2caed2fff885defe7b9a43843fff9718ff07c01388175f0211c2c78088f187c4e18f50c450138bdf8258dc204620b61e7833f856ae373e86bbc8c1ddfdd7c8f82ecd01bef82ddcc1073047fffd67bc7611c3ef7077ed627d77b8677c0de284dbfd4537c3757fee2f6644653139cd7563d7f63fa8e1a681dfa56d0fe097bff00bbf504368cb195f68138b19c3ff01dc3160f87f63a3aebbfc7d070db7f0173b68b87fbf1eda19d4d41e83d86ee07afc2c846ecbe1fe9ea18878bb3cae5deca0e1967ffd135ad871d42d80ff34fde3a8bb80f6a69bdca4cbf266e86e328eba145c0b7c7b26f7bfdba89e718feae6e06ea37b3277dedc3d80bb8de2a131eff91efe377b27e06ea37dd03bda97bc33dc6d94afed8ef62defe0edfef6a67beffc133dde1eec9d771eb43d8aeffdbe49ff39cd3f0adedb0dda1e9da6e9ff83fd07dfd776eda22ba42900bc5ff75bd01c849ffef17f5dd78d80db3b51f86508f5edc105eefb5fe46be2be32b7c7f0bfe07d8945f7457effb274bab63de63ff42f4afdba1ade2ebef7f06bd8c5f79e8b6fd27e6d7b38ff61eff6848bcf3ffddf8f01e17ddfefd2ddfbe29bbce92f24d23487e1776d0ff70bff4c7b402cbaf74b7f8d0cfafd3487f77bf8e107beaffb87106c8c1f5448bc98890f7833c47f43edfee2060904efd77e5184bf7f4e747f4d0cfe9708fc42ce3d4dd3b6eb7edeb6af0c77405bb876878ddb43fe5dfe16dfe2b734052cec09bfd9de00c3316df70e1d36ee2fcfdf6f78e3b7c386ff2f4afff30f0683bfd311080237306043dddb290438feb4847b56d40c9c9ded71190fa16063555ce4b9e6bc94d6801abc9c583aa142b13c5301cc750985854a125251bd90b3821212af38a48a921fa2a263138a0453d087b5f9e2f474340f465d3d2b9c482ccfb666352061578ba35677f4f4c86e7e229a1edea0c4b33322159267b2a42402abef0aa22dc544a625c2fdda74ef2da44eb9cca48ca54c6658bf455dc8785ecad33e9f2bc5c636e55ae7b1f97519bb905dc92e65d7b28ba78bc96176bcd221f1240d92a9038efaa824ad19b69c3100b10380a001b31800000300140482304d04b5930f1480032db6b89c984820128c47c38040100483014040000c000000402010180483c1006240a3235603c60ea8fc12d4e9f3af33d994c8099dae6215a9f45bf5b954f82bab25c864df6b1c6627021c5d61b971215704759209b98b980b8ac06f989abd1d3dada8c647a7870b989a0d1460cb6043960901f06bf5a74fed05a2a2ede49a5edaefdb506bf3dd6b17c14b5a6daf86f20dda3e7b3b3dc3988bc1acf90bb875feb0e1fd14e2529d0f7836265984a0051ac5b80df304b74d4f79a1ec00e5acd610d81adb5b03876b86b241256e8d347e23ed5d53e8ab6f5ac4eff9b76d472d727ddab574ece5b3adae9e2c59d87dac7b72499bf2d5ee82834fec449e0e1482f69d91998f0057568d9e16931445989d5a26544fb7a3dec2737f8ec21385560442ee69204da4bf674270387d602755c982c3ae80a6c2305df712f864612b2bcaad9fe1a04749c52554cc0e575fa8a8dd37e7ee5616b4676dc5742d1e33bcc24d4d24dc3781e4899fcbea7853bcbd6701a742a1b69a90c3c92fbc5f5b38ab509716b71cbb12e891f28abb23d06155d6adef22dd0ccc725d492b0e0deb1646c6f3da47396f3cb6c7aa8f019a0d0ead45d2cece028e91f54e0ed5b613cd90ce0844a0582872aa60d4e77344114fe12527ea51a5b74c9a247b75313920c447da18dbbd381aee933333357b7b56bb00080670275ed6edfa4dcf3e3837753ffbc9373922aea598d14e2ac33695ae5d68419c791c7d2a2b44802d166500d5190f9df1bc761fbc226b245c449b059b4d3ba2a82b25a83932f90be5ba9c09c01083724419ae3422ccfc0bef2e5d835b9e0d44bede5c6cc0ddd16f0b7886a8b324155dae4852f06dc0ba8791f5bb2f0a8a7b0a1bcf866d5e25abbd262e1724e9b50079b35cb8bb7db174ecac8b03c01acfbbd643bafdb19f1d75c98dadc3a8b33cfafb71f0e64f36030bd9458fd9bf4b077c7c7b2a56d99e438392fbda847970725dd104f0af1d47ba614bedfd06681c3c48518ff9e097e4ba5c1880b6a15adb819485081b1fe10e06dda21f75a6e36cd94d2e980d8c82707d74ed28a68b2a712045695e7f43d6a9e129bc36b1d29c7cec85cdc6e46a08a82310dbdf30d3a24e0fec88f399a2b17a11f46a7a83c061c2a150b637fa34bda248af2e0a45144bc771c39836e5c0838985b4120bf05aa88b8e403fcd55b7a3c052434af2d9ae286f822af23362a15710d66f5f2be43ed072f52596aaf2a98dd3acba45d5eff7939deb5e2c83621a11f74feed5276e2cfebdb92bccb767bfe33fb1a4241c7f881fb95b7b4b9169df22e9eb09c9f56f78012af3e54f57c53930ec76e003d8674d871da2f83b0b4872f090e34ec8d69879a4e402e9e36d1f5e0d5feda090defbc40e2fc413907e7ea9a5474a8c5eac603280dadc059abf4309be3e5dfe7dada60d62fe9e40e57293009dd32dc5ba53d9913691ee7ea5b95c1b429c12ba8b1cc8fc58e0c55956a60f0229d9ab3d0539400a7b0dea3ea8867fd711926d0681af9c333e6b287557bee59c11a59dd10a77bdde564b0a65f88cda4280ed703c6561013f312b9e13ad43e602c47c6bcec5bcc59d0715984a7b09aea38daaaacab91e06c6f5669494c31be20d65ebaca0764c4043d91af1406d341127653d5f91caa8b15a356a285b921b5202bbfc2334095b0227ce120003848d85741661424980b055d1178c4db80ee89da795ca7dbc8e76f1fabc18823824c2cdbec100bcc4782574e4d21d9096246d14198255da3ccd6b402bceb3310b5d2022253fe528bea776d4721349149479456b61e7f049726d129dfaa5b2a0f224f1835df26986f82c4d6dcf0e84ff9a085768379d76aa610d26112e27f465c9d99c3d92e056214a3f5b688737b3aa9d9cf53beb329f254fcfae87e3c895ce823256a650533f0dd84936323cc70641d0d1a557c57fb059233519f7aca4b1110519c12368dcad50e64e8d3f643882b628b0406a5b227d7554c89d7abc68890270d2914caa9a7afcf3b50a64eac57b98868cc410d8bc99562e83620cfd28435e7b7d7d4d8348b4f0d897d76a8894ece4ae9b70c86f6818c3b714a0d65a59b34bf70ef31027bcbfaae54c0234628901183468bad05fe7ed4200799e7519cce87a5036c639d5e8f03a826b20b913640a801c637230c7e26a79c3553546c29da7447666e8e3aeffc4db0c5c447bd5a46b1d216709aaa3adc500ad4cca796d5523605512645e5b4c6bc6c4c8726d59f3c7da3a7e8ab6b736517101510d22d2704ba7c5bf389433724deeef2f74acbca1c4cacf9218722cb5112b4bc1fefe475ff4080cae8de4bdeead4d092dceaaee8698e17fbe8bd8e732c4edaabab0f7476bad78021d9fec89f5e675ad5d6477b2f37991b189576547e79de8403ab72275a0b528e63e1a8d04720c9e8a7c89430d65083da2cd0e7512620d055af3085aabccbecc199d4f8870661bfaaf454f729e21b471747cdea22884b5146890d5abebe153a035608025a9c126c0beb0b12b932d06b476f56f608db7e8e1656c5a30e826f55ff9617303fa85d0aa43e98f405f194d2ecbc9db5f436162d41bf21f428c681e7cdf2481843c23380743ac8d794d63ea9e9179b66b46d8b6f9f4465e5e19efb5e24f2f6b6cfc47732a807c52258871f0ad1a5d2fa3d3ad19ffcf652c1fdfa65f888564d7a19c6e36616d4433ad63b8bd561c72117ad24fc74b9aa4b112f8d9ad0cf8538c4e0dab970f4d782a37a67b3f19d06625b2f14c214ca680cc26f3113421c23d0b8aff8c089676c3744673d35c81917f8b7dcf95c926ca84ce602170fec7d5d290f0073d058e1a7544b44f2e97d036960812572e124d124b50ccff88d8eca0acc193ba5451f333dc40c77d002fc6618a3c1009c4b5710849812310cd75c14d39937ef19c7a648449dd10530d159d2cf9c11be2863bf242db198a3d54d1db158345cbe8667a96d1ecef1d32cd258a9a896991ed0822c388922f049d1cd4611d34b87af7af30c03d6c7aa1026cb5b14f94ca01158efe85a51bb7813eccf7ce318161c6881cb203d0a389a794a1c5ad0b117fbadda72bd86e4ebec478a97a226dc5fee4d9824a2d67db6fee29f3a374fddd5ac71cb8aaac3faafbc4681e9417ac367b8a1e18b15adcf61f755a486c34ecea6ba754a8a2b5d348f5052842b72eaf675437b025b94a11deefc8844878572b8c6b89897e2483b83189396676d52b485c8652e1b8fe33c92dad76f1e9f42b0167a8d6cc2895d782974acddaf543293eace73ee3d76d93b2206501c68834f2431fa9bf676d1c92c0bdcaf48ac535a3eb6ee727ea98241cd193d5618a26f2886884a9cb821a0999215033bf503c3e0a6a413af5fc1da8265b39054bd144dfaa58627cc6b53450d25c2f207229b84ca5d5bda13b9adb6c41791117f7906f0c8e0f7d4b58bb20cadeba25cc63795fb26b15bf3ce3f3d5cf37696addf7ec4364b724b95ec9da2c3e6a7df28d84e43ba02e19cdf7b2729400a2f6062409f59ada4bdf5360d0708450007a08618bebb0ab20455227447b7aea6b13b912596e64cadbf115f3b5454827994157323889604dba96889aeb1ef2a25d6175f2386c80498d3d0aebe06244a481fb51065d7ee825ac1f4d23198ca2fe81d4639582bc338806dc07e05117dffdf340b2a2352a3a97151e38d9eb828782c31d81dd380a6f427da46313089e1c1fde26b48a24a1740a7f87a504e4ed52481cd4fab05a7a9f8118bbd85eecb060869668536bf7e09b08607222026d0ecbebb9136d344fcc8739a757b36c1ce2debde693a13c38ef384039e9515022496e2fc8cc52e7b5d710a15e3e47429808bcebaa975be4fc6563404106a520f1f429c371dbc7cab662fdd7a766253f35e305acbdbb906786dd0aa3d85903fbe52011ab7eed9aa9292fbbafb1a178a3053f6956a3fb8ea22ae61aaa1adaf60525a6229c4b91187d7d45c0c134ad3ac0172ac3eb365f82dfce800c68e5099a878b4d9c04f4d1c62440d00cbd6990f81c2229bf5150a186a00c73e4a1f99022fb555ee01d30fe72b224fed847ebea40ae5b46745f6a6d59b65e0fde6b86d838c92f588abafbb41f25c2f7037a2ec49ed7660b7389897770b769de83e31e08104402d3ca52bfac3448e2208ac9f1e5b73f44f55dcac9cbc7052f169c3b53a2034629c735dd85bc5476b6ea7511da47fe890cd1ac00b69990c6757ed4a2c463ff629758be71422fddfbc6d41532da735b20c4061cb146fa0fe0d88a405cbc25d44ec2cdf808d601b0d3d8fd93361687bbdbe15372d8c77e2722b9c121a4094591a3490681db23621ff7b0d968011b1a65349205f3b2c44bbf98070a72531ba97b0fa7937e119e0b734b8d0e4ebcf5728bcd86e21c51c403f2770aa99ad63716f10c43d4db53288a92e8b391572b8d572379e5dbc6f353345311786791fa0a68a2aec98ca1494037930419ea008d40039a461afddfa08fabadc7700e1ba3fe90ad7ecb8db186b529865a628ec34c70e72601e4b3dca210af9b651b7953d7469144a3efec5426ccffb1920a5c15b56c32cfdd0d3689abe9ee0e20213e6cedb5ecf10b4b513604d24f4e43ea9ca02bfcf1e7e2fb43dc91e6c7c4ee32e96c93613e430f61026f06bc52aa311b58c118becaf937705e8f235789f0842d74a9ed9115ab09793f95a958e034bc60b50065a717d226d50ff18f3769b774ac5ba04019369b6fcc6a5f308d97daf62db3a59530d9868035205aada94ca9b2ac0cb9e84cc05a1453e539596cfdd493ac8d4b9861f37656e6124e9ba31adbdf9e74fccca4b3b7ce93e08641266994375d902cb9234d0c17ba556929b84a0db33b66bc7495e5b042fd6f733e15dcd2a98da24e3f7c41c9dd8747aa59f53b4e4cd3c29ed3d2a3064d0e4bb8f5bbbf876d3f9aef6f6903aa3624924c7bc35e279aed7f9fc2f6a6a5cb22f62388b0b7ffc929bdc58dcc6a53ba345250e399cdb76c087e8110fe24517aaa871e9d38ec232acc71ece7254b579686e6a2c547b780d5714fc29206a241b271fe57e5f86037330887f648792249dc1fb1c211838d10f53d302d5c6930fcbe7c3d45b65db6addf8c6d6e24f8c8241b8fd0b612ad79ae8e44ab41ab5bf91dd26e9d36255d665565fd9b4fe2d829c4285a00294af38ccc07661552697ee70412123fc1761bdd2df15bee708876003dda83c77460474a616f56e8f3189c26d03a62100f1d44a6585d2a1badd52f52fa0c0284089500f8887162c5c5934cfd9040e70e48c9e532e23c26c8946e82cfe5a33767526787aa04291f7e420dc3737e77b1dac4155938aaafdc35de270c5501df23a812c45a19b4b9934b911dc84e6469ad34b3d7b48b419c1951a8a3338f3c4a42cf08771045fd2385e761710e583992552eaf9c581c7731abd35efbd285b59be6b08808f7df111dad01686a0b91f39b8c0cb2c802f3d832d0897e01fb88c37274cb6ff052bd2dea87fd7ea79b642f260363b667d04b776e5ac588515f3c204305c9f68141e6d7a8573daf8053910b5f45e75f49f66e964f36f0aed26cfa2633abbfda3eea35c05890b423babd6301a9e367e038c0d06b9226678f25f7e772ba1d7474896ff161df81c5822bdbcd77a2a984b860911737de916bec0922322d646b8db6a1349f1fa38e084c2d6ac176d24a1463efcf0ace93296619d08dc9ee0beab3652c2e30f8da53bbb083437654115d04ed0eeb6870983182a605cddf90b16d6ba4f55ef709e7dd7716381a6f27c77b6f44dc28bcd8ac7e15a4d82721bcbcec6ef3a1a41cd4a3ae52c65b77a4811b02bafb570d8007594fbacca49e38bebe8b10d041d4a628a3ed7b221f10058430437ac0c62708ff065d146f5fb11ce450f9fd9ae40e6a0f3648d7d4d02d42d9c8528c45e0d553a76cd5d8b7ea9814c2e6331406a81a140af7d99226e39f323024ae27c79c7a1f134769df026a824d4fae9e0f0c6a1185c13263cc1bb990832837ff61ce0afc725fb1b80d67fd18087443ac3638efd68ef517b69464e20548b7063aee10a801cc2792f46f7c13273e0c968adc9e58a4df404cf373c304a99be6d8e1a13de259b1eb85c6e1f5430822b6872c9365f44372b8702e5847b45df3258d7f21cb57ba96bb489c4a79ad469a326f4cb30762a4006b0a09094e4f97371eaf49fe8e86bde1c27c5e1bf31590ca65c2a54503ebc7dc670cb23fed4e8b062a79b875af370c259d8136f2695a18c2c5df0ef689e966c0d69e5e0ec9b0737929c40db012ce1e5e878a8e3c0ddde5068e72fe3f2264451284392044685f87428cab51a666998f2282b837099894fa0724380979fa96f309369f91fc76033b5f9dceea004a61bd99d06641a0ac63d04fa79a76ca623fe10973546ec0b9458bf4b65b7817b3434eb3a14c6c0f6f0c22e52d3b4b67188edf19f38694e4a04ad3b1b8225eb38ba94fa4e1d0ef97d6e2e2bdf2c340a8c7e8dbc61f6c27a18469224f0ea3911c56f1c835e35d34773bdd1aa4c3b78c5703cbaa7a42e0996926ed6d66fe317c2b4943dcd687be6fe83a00d4da18e234934f2401bd08f053376408885c803ee9d9118b75114e3eacc2c284412087989bb0db88e0546a00572a2cc80e92cb85b0db3ee131b3368ee26f3b657c935c240032f144d4336b43165ccd79203f806c908be5cc45c3878be997a925a949e2f72275ca38c756064623206a0a0cb7cb3854d1081feb40ff95a34c9fb55a28ee71024f88dc1030c0d44e5ea7cf18483753d23fa42b265d1c255cf5350a52405ceadcde78e964f64e44572803fa5812cd5b98f9bf5b98be6a8426b43e9ec2b6f1c48ef6381e1252f3181d51c33bb8e41b4020c102281004a7db3321d28a677790d01091304ca112199b0772ecd7ba1da774ae2358494dd7ea71d011cb655f5319deaf409cdeb225893d30888a409a7c79fe3afba4b2b5e19eda3e046969319668964f1b645c6cf3d313ea2baf94eb969ea01ceacb0c44342d6d194af349e32bf107580b7f5dd9f93ecd7d94b81a459f5d12ee51d151b30c055208e9a46f3945cb32a66b8c08e245484a298072623e4a122f5f4e26fc58d6abfda479fb523edc82904546e654898ebc40efb1229b944aee71fb8c9e10fc1b19b7e9ef3594f621d12b1fa998b9a6b3523bb89de6392af258789358734b297bd0216c17ddbfde124a183b5a7122291a0867d61ad6ef4b52c7f2d3b41c8ec2705361a31dd5f45ae1d8799de1c9082e5f71ff128ae1850b4789c18ebb821c604b8b4f2c5333f1d8dd6347b4648a03ccd5a6cbafa5823ed83469c8329198e2735446439d99ee7189ac5cd597d48987245456496b786ab124ceb3a12625f4a2e30939d73ed5e324792c554b1b2f7b86497f73eb5dd9570c9747bb1aac521ae19774cf46e87e7880642e6bdd4be65f782b9338ce1c73999b7357890f68d132c5594ba506ed18098edbb6f3e34d485c0626613e9acf588686fd648ae32eb9eb79168fc8fb0e273620740d621b7304035f43583e71d28c880c829d3982bef9583628779188f3c3e08e0b9c19d9bdca4db20f32009f9894c1e4dd34fb2faff158596636b2c7e53f4b030d6d57195edb194261451e9b2d90c0d8d18b3ac3ae42f28ddf7cb14ff2af60d698ec6534c2d623f13b9e5491e6b55053cbe3d90767cd7f64504395128b753f2bcd4e97634d923b27400b0ea3d2233b667cc24842c83e5c4654bdd04a35ad825514972c9111378d591a29a07a4d0407914604b906faabd05e10bf2c8d88eb4b44c0fc28b1a9b808c2e8d6d698b1a96ed639ae23c5f7fee60c464bfb613e37188ec32ac583f26fe02e8805c4cec9748af287633cf9ff51b12508c9a5dce85712be04a3694f3bb588e4c31e5b179145ef89eede879c4326b2c7aaf39a2f3c578ac65d1b948cc26d84bad64c827063950815062b18a23d57d8d48b91b8bc3ef1a6afd6827875ad510f002fad643c59d837912ea5a30394d8293077d2b47122da9f92c15d681d48358e951f32f867dca5036d10518f5cae24308201b8816e5d4c758c44e9687e48b6cc4284d1e1b43d34b0f22de9f31d88bccc01326e753e7b22e30d8a22cf30ce83dc8f73123170d83e1125b012628c983b3d6062a02789a683569d8bf648c653cb92d4e2be7bc2b6ad9d8798114fc79f18ffb8215585047ced164e4d65d18832786bdf95086b0ebe21f54a508ac01a5a9379c37d6d619f4405a05529ee834b5e85b746a460c370de6c3f877f8624cd4044a58b477d906259af4ec0ba922b26d6a301c6644090e799136759f678cf457ae44f6c719adfaaa84821a743775d49e6d107cd5bd1e488f0bd7568a256977741dd4d579e6544239167e90c1bc2c0164eeb9c72772ab08a7827ab477d8b1c98f90d2bece3d4d1b7e15f249c692df9d91db92c2177e66fd1acd804b8382571967b1b9713a49a1f1648ae6f0a6671711715ad3cd1b1156ee4e6a8b9b25751516627e2812b08746b6e2aaae6a2c3f3901c2af3a2501d945aa6a411e3aa433077875a3bad8e39920f5cf2f6620ec7d2bd90b0e0304a1ea5506d9afdbbac7b390ab68791b87e108da282fb885c1348569047acf07540810dd731bd54eaf6cb490f8d1b385b78598dd2c0323d93a88bc88356caff7ef6c83f97d5caf1f219509a53fbd5bb470eb906ed44d1ebc0f36d364623f6810d04ae66ecf5035ec908ec2ce9b4bc4d2e1e4d2547dd2412b3f6ecafb1db6832039b2b4a74304e8aa8d751321307bb58f78fbd8128f237894104c70733f896d010df702f0008ec7648c3ce99d4898f1d10a3f1311950f40f1d7520227f4b4e2235194aa124eff989b894db20c3105a39bd114f2ce0463cdb1207cae95cb454975823105da9893b5766df0467c6c0fab4a35d20042388e0f4d59a87ad2bca26607102f2084521c8470db5b1aec0aab1c810bd0d9bc0164aaf937c95e7ae43f7bcca7021e465f67e48a6d5c2e722877e18baadecc2749834f974021c9c3ab205d718a6b2d64c72b1edc2786f2fcd4bc3f2b65646721d46ba99005f7151d18a30d521490f225b182345742df5d2b7595349bba9c2954cfb8d4cccfeb3e92d6dee82138044f24301e8a440178ec2af2e4d400b31a6e5c7d06450b446a4ca989626627a8c56bf43a7615c8ce6a5336b1ce9eb1f8342bade53e516ab1614cc203bc5a5172cc8b66650431dcf294d3089fe71ed82b9c55be72957d70dfde2531f1d8e88e407934a319be7f699a12dd3dd9711198c9d329fa524309f9081862c66cfa6886f9829fb16d6f36b6af25af7cb480e8945917ac497c070b2364c68f74f24e9c94c4ebe5df57c1f7c5c280eff202ec202ac170555632dc5858960e63841e7d905d30465dd06fe5a13f45a7b81932d5ffac8003f45fcef7843d1ac7b49855b067a9dd91e4e5c0eae8c128909d4a65a6c274f31b4288e5c5b04889870aa3ecf739f97eccbcb5739ee43a98aef561232cec9a617acc621d33d8e19c75bfd9c3fcaa444c5b108e1bb8e48b387ebe39cdd286267ab1913411fb5204732564d4214e0fb4716cfe3fe1bf17ffa893ec4d8600ab3df947777ad468e008d5bfa2c6d299708144d11e0057902200fa412ba34a093cce0c62395f6eb988732d429904483c28759ff362e6045005cbf2288e7b3f01003db62f64d323b672e8929d8939e8b7d5d730d71eb9903aa7128125cfe8443b5d05e9f80740eac43ad0e0e0c8443ea9430f78286898ece7fb232757c1cba414622272b399d6bf3e649785a91e5c264fc75ed6f3221262969093c0119c397e35df7a69142f8d63541ab0c8f50799a78c83cf9443d9f4e73523b8270f236478da8c558f8b645726ad0beaa8e4e976b5c65308e34eebd2092aa36218f3c3e261026523171899a9441b52110f20cf778d9e231a4d8a7b8341d2bfb275eccc159da6661dd8eac40318799abc28b98e58462de3209ec6427605f3bd990c35f205f7ddcfa3ffeda0b7970af446b90efc5e9280cc7f1a558c2c83bb1644cf7b464dd60eccc6ea0fceb4e5ee287503224dcf54f3302d6f8698188eecda83367fc3c6f646faa2216d7ba7d473c610dab9b5aa08d3b56e3a74a3eed257442c4b438f270b1cb615941c01a0e348c213e09f37e70d9833b2ed8367a667bda1c3aa986a9c2f8c493a3635fcc5c0163b94f5e732c72998c81e5ee05bd5b1120bee581d7b0894113a13ae4b914a1d03906dd60138bf75d78a1a8e3360f09e698f870d48a5ac2138a61c9bc64901183b2d8455c35b3a191044349fc5dc14a6ba39a40557175395dafb63b1176db8c829fc59e584252daabd86400bf04246885188c35454378461b0266263d18e265437592737242fe58e865572fca7dcf0ea8bc7cd4cb37ac5668b7f5825ff90e676b6ba8467a5f783f6c288d9a67067f3c525356c8863cc8429b2d1fc340ab5802d5e30eb61ae8f0080a83188fc1c60edecfb8e077ee38596add0e9cd11c085b337541114bbdc781c859f88e2ae9e8740d157d60f978b968c6f19d31d1dcdf14ca4b0a00032d155c0e7ccfe312c799d6813e0f19f9417c8a2acc2b1211d536840b29fbfde5093c224356871ccd1fb1eda4506de514aea9bd001a030ed99c70c81fb2487e75fe381593785fdc651c4e660dc7c87200c772f3e7e92cffe9a123a5c7243b30178ebeeb23ecfe8232e5872dd0b398b04d0327bec0a8210469af2bf580c7f63ebc8c31f42d4f4afd8edffc3e145b7d6a8e0098b611390c83808c4b94a7c0a76cbc878aa08d7bf424c81124b22c0dc772f02623487523f10ba2b18c7f2af056c9bba09812eadb90272322d90d1796769baae372864083191e05b2fe48b813a08383380d06b4ee536de5c5767dc3c2b8fd0fd7d051767387135d6f3819a8ecb375b22ba6b7889459b060bd0d1639198f21e34259862ea4c687216fd04f842ede65682a45709a7dc7c5d0e6e088827031541475d5a84e67932dcbef42e0a76a5473cc2b9ef1200f0fdeeea106993602d56a7cc5f0f572a77f8c6a1c4282dd3c3830b9705e31011cf6034af3229053305c19a50d9901edf415b0165fca292e9d0b929171c0d74a4019e6c9e6ccfc4f8cfcf9b223e392827937102c008c03cdc0962da928d23f6c5e128087a9211d8f71b9189e1dab7df4ff469a442eadeceede9964ac08b8081909efe296fe7459be5d48bf450bcb7ae9c62ffdd25e7ac81991144095dfd23a66340270dc431de3e5059fa87ff781079674b98cc168b9fd25c660ac906e3318fdd67506a37f741d83d118c6c7911ef1c59ef450d7883d34440fb926fa17f2f590002e7bf1b09b805437a2288410c72bf868d53c15a5f8ea1fb4c2387feda8b4aba355ffa8cd637d8c30baf5ac8a7127b60f4e25c558555524619ceaeb4af390baf4bd52aa24abb1fa5a79c5cd53417c5af94663b1bcdde91f99be55adcad2cef297cbd43b6f166caddb3cffa2ba30df3c16c96a9e1729c54dab8e94e58e2359ebe8ab11fde6910f9ba7799ae7c7bff8ec9e0ca9578038644432de2856d49c73be09999cd32909610f7fd4d3163ef440467e4f25eee119a7af8ae5b349710f7f1d474fa66bcca7dc25635a3607d53fb238eafb3bd82ccf6733322a7bd3d6decc6ae9e4c838039217874208e7cb97e91af0e50ff962f9e916b51efa4fb862e1cb339591a75309299e91139f56fe3d0521fc7e26d335fa67f7c5f2ef2f1999fa7a2b8c43fd4c0b16ecd5e2808f6375d40c7f460494bda118d1cccab438eacf7f9782f77d4dab97cd8c58863fd3313a57f824ff3d35d335e03f7b31ac7886e2998ef19efa198a92319d9bb1463d42ce0695572054a819791223157a97a3bc7eb34c512854c867508e923eeca96dadf5b017a71ab5f6841a55140a35aa5a5aa850a656da5f4d75a59343413a253a4b51f449d7a0be512218ada3a0d8a742197e8cf8dac1ae88d1629c5e91d2a976b2a2287c62a19e3ea15aa3421415caf16babea5791d486b498f7a57697165bdda50da1bca996121e626f620542a1b80fcb7521432814fa247bfd36baf1fd4292fb5426ad4a7e57144afbab776af54ed58a6a47a1d89d0652dda7d1480a855d91fbed8fa2cbd1523bd81599dac9f0258542a1c48a2f37034a8c54c87d5c88fbb80f8562c485096d4b5a8fd089b2dd6f44db4ba3adc767d89b166937bf2fcf5a5876709d1c176a40224ef547e466b2bbb5f8266b9c7e8db7205d237e63414ddf267c79963db99130fdab35afda53482f481ba5f4bd413ffd557dfc4bb69e0c5f7eb4f48471dad3ae8c26465393d89a2adc82b4c03d3ccb8f0d9f5ad49c5cecf094e22b88fea643a801e91aed69bb787818ffe55e4dbf619cf6d55756475c29b97c0b12290f98e2ab2bfdd73ed2df01bbc0145f3dde09d325d56d2d18d0fe6240ad01c9dd9ec5b56fbaa3ef0bab0bb9c8f9564b8c339f7e10daf46d7c5bd948a5a514b72093aa6941faf6f0cb895e56ffac0e06445b10fa156e413a86500bd235ec8d6d3d350b6841588b7e198390510b69535ca815b5295388a4b42c93a94971176a52da14212ed48abc516952faff2282cd8a56d4a8b4294d4a9b4261a229b54969456d4a9be23b2a919026a549694551123529f659735c77d41d95a8496952889a942685a84969539a149f4f6691e68456dfb17764911c27132328874c266691e8eea47a38fa7a63bcc1a26d0db69984aaadc921f3c74e23b695a07dcae59b7a971a6fd8dd947d08bbed53dfafdda7cf24f99af1e2f41f91a1bb1c327fa6116bdf27135da3fd847e499f45f27cc6688a6031ef23c06840d08460344a1f314bdb31637f8ceca1c73cc77dedb7e84010be1ce233e2fbcf1f6fedeae1d72c92e38faec5e1a38e2bcd884b9c2ffeb6c5af6d8af70dc81dc39f463c620aff65be0ba6f3c964c29d38169c0bb0e7cf9f0c3f5a1ca3a77edefe9a56b23fba6a5e7127233904048dc6815a118cc64bf93dafde811a4d036a3e05a36953b098f7cfaa96d55d27134c28b7f9d70e2674413b31ce4f6b5b92ac5c22e2c9c4483e69406d0a46d32e602d84aa3b6934206831ef271376f4f0e9e8eb5f72894cbfba423018f6e50857ed0246c398fd1701d68209e5f8f03d081a0df3c944fc0a4f26f01272c864621671278e0577e24e26131d0336164c9a4ff12718955a2f7fe23900b77e2253f86a6f2ecd5936e24afc099fe1f686865d26eaf2b6359d1c8a7a4fd29ec219fd11b93116ad3550b3e8ea472d9ef0d5ade1ee968653fde829ca1dba33c169ae52541b49e240140b57d235e2c3eafe44865f1f553165fa4751df6d47cb5f32bf07f43b6e976a7c6af18da6c6c5dbd24afb6e239ec4fd09f72732f52ed1a5d5341a225e4eef0253cd9bbf0b6b71b4c7717c756effdedabac0571ff1292ed795f4ad697117505d0634ec4ada93e4e6f2f1e1ed6771ebb778e9bbbcdcabba5cd6461c06be97d60a7625cce35bdd952b19fd05ab87358f300ef5f16bf5a3a75dbd565defb5a3f611775712abfe6740cf018e85dcd7b916b5e6f8b63e64ee4a5c8957f8eae1f0b5a366ea4886df465c89f3276a16e04a4c6d8a62c546131b425aeadbf0194193a9b10d25acc5b10295b021c467d81b4851f6a6e9fcd21d3dbcf329f5103e1f0aa1c3a7cd6a8b433e1f8a7d9e4f8eee3a39fe94be0d1f7f6ae307da3f223b8b0bd9f01902298b2d4116f7962fe1cbb3fd167c2f1b42327c770cad3b74776f6fdfa909bf67dbf8c1f13f2243a714e542367c2e1b43f235a98bfe6c6d43489eef288aa2a88671e0fbe54599a2288aa22e7529e3031a7bcbcfa7ac9fea597369f12f103e84ef42367cba0684350e7de08165e3b2212453bf62591c2b0f310e7cfba3957b351563fcd8025f2616d114e1cf15cae7d7af1a5f6dbd31fc95c99c7ac197a91bfefc0a5f32567b536d3481d762e230f15baed5c461e2b76b397198f83f5830fafc1ab76171ac3cfd79fd6b5ae98e9ee5da5fb92b8e5dc861608cd64e8b894f39b9282739fee8e3a5a8583b8dc6fa6931ef4d8e77f27b8b74ab4854451b4a08c90dd28b88621cd92d49d28612d15e1495fcdefa69342f498b796f325916fbc9ef6d28f184e4fe48946d94d17e7c3e7974d98e278428c37f496c2861bfbe24f17a49f27b17b2a1840d21d9626235b198e4f73694e818b045c8a577a0129d6bc368496eb19606e99d730e5f51bec431be44f7433828dc127b13afb3378d993b5dd2c7eb5fef8b7c162d7670c1c3bbbd31c297d5f832457c0920c3a7d4b91fb91f8d463dbc5d9cfa4764c74aa3d110cdc551e9142fd7838e530f4b727c1e704bf88f0ff1257e581396dda34454b0e0b70ff99150b0da4748fbe922144ac79054485e4d884f2f41a148dc3e57fb44f9734adcacf669342d4287db9029060acae91a155da3bc828c82853367a4b6daf8cc56ca269ea1184531f7a870ef0739054a51320a94a2663a06c550d0610928e8206446866294bb1e9e01923678ef3d1919d1cdc8ccc8880f42f8646664b808df5319052b88972d9ff151468ed1b9f8d1d16aab9f573e75382a6637e4c7792bae226dd5943f6d654e56f966911e02df8f5ba20d7121cd27b71e6aff55da7aa0b44cf12fff49aa56a009b3180a5fd287f52d97590f495f622155ff7e25f67859623b7a3f2309cb27bdab984454611cd24b12c689ffb27c189348b092482412a9f57c89656549cf921a183b467c39ab0569405a90d6b384d482905a90d6b3a4052191685a5a70cb93f06572f9c697f5824bf8922d063e4b0bbe94b5c6b2f2f359a3a1fee1eb4526223e9b1247d599515f3d112cf8923e84da8bfc9cc7bcafb294dfb3a3b76ef5eda3c9d18f6e751d0c011c4652966c3d2dc89092922448484990904824d291242b2bf8da51912049d245ee92b9646488e408922445242449484790242942422291904476243e3b129f1d390294e3b3234fe423f1ea24f95ab9aa24aef4a8b7ef87f725990c61b324493e7c96f71f5d1f7860517847cd23c7978cbd569e7defac1f5d247cc9e468ffaa1a49d7b0300ef5230ae3bc7f79841b89c43d9c7ab891246924cebec36e34a2f0d5ce659cfef9f329ed1a6f88b07cbc2c47f896df189df531b2bc1f3d75444aff2e2b61e931565b30d4b35ce93114f5fe586ee9fb52a3f725165932b9f8ea310d1f2641920489e52432d0f8863821cdc77b2290ecb07f8c7fbd1f91bdfcf833cea7dede595f3226e1bbcc300e6552e2cbe1bc67413c8c03ff65e614f418bb9afae1e5d13daac33f787ef0fce0f9c1f38387edfca079e131ad799cfdcbd5173c6c87f1fc603c3fd80ee3f9c1c3785ed829acf6d78bf683e707cf0f9e1f3c3f7828af6640db63e296b40cb1db6832d8f7551fe24b466e14be3b76ee5da6188751575f6e3f539f7ee3b87f99e21e9e2f87673a469391e1cf5090c9c898613233329ecc8c0cf866d857c732a4b87e8dcbf8927ebd14de3059add20cd5f40af9b91e269423fe217aa88986e821d7443d3484bb2c6f9d8e2ea4eeb3c2b5a151f129424de430f16a22b7b68926be24e927cbc318ca7c466b59621c9fcf5a0ff590b5a31e1aa24a393ed5303b40e02253d78e2e658771a89fcfe8abf3ab4b6465e529be4a39c26b89585fe3cf4a80f42cdf628c5fd328aca30b9fc8cad7388dd55ef8d48dcf6c0448cf62dd154add585d2216553d86fa389f591cf3a9bfb1f72a65ea59aebdb27acc7cea6957964bfa958b4413958c4fc4fa786f98c3744cbfbdd5615cfc0b223b1fd34dd4434f5242d98b152cc92c320b5ac14fa6adbe2b9c15ad0d9e21768ec83939e5437c795176ffec8dce2b7fc9cbcad09421beaa2cbdfc16abe5650c84df7263562e633110fbc003abe2f9d139eb5f8e12e358ef7e5a6ecee88aa2d0ae45518aa21445298a52144588a8a8751465977db2cbd16251848884a2140945291222128a52d47ca20845e918ee8d68318d368b5a8c06cbcd64b2ace6d362a4578bd1e81bd4b45ebffdb6667c231a69f4f6999d1f49f8329946f8e1cbaab0118db566c91bd4c338a729cff9125bd495a4dcac5d3245518aa21445298a5214a58146be52449d7332522787be4cacf1ab459da3d6cccc4cd619f5a34395ef55a1863a3992aaac535f7d15b29594b555f2ad95ef9b955556a62cddbaa90ed5a13a5487a4b0f2bdf71ace15dfbd67efbd9711b6495529a594524a1cfaac92b23e7d42f16815a5efb27aa5227cefd69bac5fbdad6a84ef6d552bdb24956fad7c97d457fcede9c5cc497c4598d90bb71d9918e9e4ec54a14ae5d5a24a5489ea501d22e9e4f84e15aa54488ef45588548b48f4aa44fe63e43f487fb59dd1b5e81b914c995aa63a5487ea501daa43d2c7aa522727be3805e7a21e32cab917e5c7071d25e7b3d151cae893f83d70aa678ee41c7d1249f73a22e3581dd5e8a9e92cb8733912d6258ddc65912cea28be76d4f8234ca154d7568a2f6aca48a1748cd28b5704adc0274805538254f02428054ca8aad65ae1acb5aaba421959fe256366a663d41fe9e4542f5361558d46950556327275ae6281f5dddb3bd3312aa520be269e9999e9180e57abe114dcddf339276cf0458fb13973e6cc2184ed65bccd4bc69c7356f957c55407cecc942a4c426b714e38679c3a3993cda74f269d12e38d9468ce19e79c3fffebc87e8d2d9afbaa1a555565fd28c627d54c5a59c197cb240b4bccaec5146328a54a7279c513b439d8860c9359908f2629489267320b4a0112ade9e4b4ec227c7743274ba793c362ac5470deb3cc5c6ee7fc5d2dca5773f18a11fe55638cf2e3e85b409fdf6244dfba4ae9538b5afa95d25a2b253d6579c797c5e25efa111d8ddc9fe5aedc11be2abcc344725b2935b197eac8279093c118d4c961ef980ceb96e1c5e191d397e5079d8c29233b84b05e273d3b3c33333343db311992dd51219d1c469f383a8552a1f814904bce77208da67786543cfacabf771acdcabb7ceb3287b148a40ab32bf15523dd9974d26ba742a15028140a65a78a912a3bd1c94a94af06ab14650164064595201f45a0a862854e8e6c2fbf0ac9292b95dc1e94af12315789729392b5b05ff9b498f85236f7892fdd48bb5f1e471fadf9124729f125b3fcf9a4cb1cc398892566f5fdabbb835d91e3a478872947ea218e4b0787c257bb9f97ffc8eddfb7af435d43c687113e7c0d758c864bcd88f528454f37ef89442f7488185ba9b5b4d137775921bdf50d5f3d5a8b1ea2879aa827b6eab678667a4a65fbd83ec6a622dba9b596451d4fd207796a53c357b76eadb5d65a8b2deae4386c2ad1ba0bc92e8ad687bf9a487a1365f8317a8c313e6b638cf18ab9fd05737bc768f0d0c35f8cc67ffb6634eeb76fddeed5a39d5e3cfcc8e201206513c926cab1ea088067d102105b6d2d060000ded3431d03beb82f60be875a28b7165ff970ebe3bbf2f792feaff53d5c97e7e18e7e87db124b50f68265d98038f92b51bf3e730f5b7c788aaefd92277aa24ed3fd49ba8ecda341e8b0dd800e151c54ec03fbb5caee6b5f591de6fd8906b5de1fd8af6e00179ba20a46728f96610e3f72e4073a6268c206169881c99005d477db000db00554246411403c821e94b4b732f321c775a2bb29b57e7dcb67545f6be982ffaa7b82b5ea9c772ffbf364eb9f68fd1355ff346bf578e454f079b40cbf5e389a505838f51d8efccb7d64f6aa392be82a364dbc3f82b2c9f12480039bf6cc0ec1a249142770d0248a133e36a3f904ab7e9b405625430ec1d78b53df3d1de5ea6bf5cede545fdf3df57c554eae7ed67bd1bfa8bfe05ffdf5df3dd1137582f34f3d1f8f9c6c9f6debf9aaf5a95c6121b2c58cc1788a5ef0a79352876a28074ad1a7285aca6e0a3224c971564a29bca14a99decb3e3dd95c73b2bdaaa727866f50f9e4f00d2a3783d1fe54e1f68de59a666f677859931f595bfacfe6884ff1357ac7180cfb8cc1a89ede11befaa2ff1e4a9f61ef45ffa23f7fda1bf4fd2b8523f129477cf750c7f6239a62c5949dc9843589ee2d1397eefe8c8aec7dc4856846f89cc94281595e5012d41304032ee4cf2ca84749a6320bea310294030742be60b202a2a8e2065520810321555a90fb59bfec218a14984ce18413596043115292404a932903ffd22405fe8065d974106f8ccd60efb98cc3745c93a047a71b9d3d77b67c463f630d5bee59a73509584c11d2e6e9902f605d84660ce66aefee7f029ce62e688e35c61873de82f7de830fbe1e2e06579dfbabbad65cb46fcfb9e7bc3d79ce590ee3ae9a1d744e0e945dc0fd75f2b71cedfd46d6713d822a20ece18517594ef6f0e753c81e32a8058bbd7cfddeffae1d0c08fdefbdc742e4d97715f3e14b46233f529ff2d2c617fc7e87dfd05d9075b9dcda7ade55cc0007292deb0703c45c1626694121ab552a9556a85092d57236826ab5fc1f4cc9f420bcd5e50731a3f14ca522bc785172981736b09cc3bc7098a603cbe6e8fcdc83899d93ab55ea7e43682699e9617294f921c728a5132c0963e10b46e692a9f0f503698552f87a211a4d09b3984c2b984d36d98c3fe3f5b25f1ca8902139296da1aee10d3faf89f7a275e23995226ca030c2341afbef7f68341595814390d3946fdb54d7002ce6bdc9645940e0c8eeb298f735263f69001d569619c82e88cbdec327617e55aa54912480cc89f4070515322421d4eac473c2217c10bef71eb402ac690f2a4188151159ba844782db1c9e638f56a54a952a24682ca8c2738d0ed7e7eb271119d26ae73499f0f59e92effe51d74d39a59cf2610bcb56a581546bc485571f467600c86e87ecac16462344c9885a2a52ad921046bcafccc9736205c4046030dab3508109c673af7f00b2063ae5e8b2f20563ddd1656d874c96d2089694f6568b8a6f658721e2cd1eb2933b645a6466f6c964879d0ce5ae0766580982734ec9dbeadf7b2f09d67b4850bf0210f8f0e1c3874df594d20b6d9e8db36936d4557addc6c65eeb52966324bfffb27cd88175ca31c2796f659659be1e3e056165f956964fbd6799f98c96391c752d47407b9aaffecb82efdee15310eee1e89e7bd19f0da403d27ce4f796c87a53f2cbac28026ef36aada5f7e413cacf7dbe9d341aea1fee21611a132c9fd66673df9ce4cb14816643e12e3a82a9a938d9a4cc0e481da04387b20917618cf6e6c1e73a78333c0725a331fffd6434a87f2c068594c588475030c286119fe9c01c07237cf13d0823b49c0cec1120d373b202db0474eebd7fefc1f72084f055e15f83d1def83f177d98418634879617fc4a12d81540a652cdce55234e56cb4ec1c96a72a624aedbb973401ef060ec865245cb0a9c7393a2f663cbd6e8e33ba3517d74981aff59973118ef47b7198cf7d57506e3bdbd8ec1785f2f7d4fbd9fef9d7c55b6f340dd814d80d045090d5650461e902158ee99c561c439f7ce888f07e4092c0c3dc80dfae0213fec8056ae7039230099a20c2b0062a445817a4dbc172d125c8a1db22e97db45690aeb41a47db125466407a3e3338e83987240d418f777be44f143a319c254bdda430f13e7ac38b1fa877012e788393290dd4376456e382e2f19b920480c6ec9104887e86efa256df90fca52e941f7d2461b44b437124ac779d8f21cf080964aee6d72cef138223b77ce39e784e59c93ff248e4f5f75ce06e1240b0fa4bdf16f25938bcab2c0441698a84b904c410151f1f2840ca98a1dc2cb112c13edc7199aa00308f35e8eac20e1b927d82a5e9a5082a2296b104208e11391e1bfcfcf45e9e029888798042fafa109779d5b07f80bc261dcaa5439d2f94ba6eee75e77f783ef97c711b9dde5d12517af549aff4a2e4a26170ed39a78efe5fb28dfb38a597460f55f92c1bc9cfc5c2b995cb43b0ea075b91cef3d1c872d29208c11cb26251c88105d4e46314a63d1e85e9058b1c62d1335d9fbd7b407618cb8c7eba14a952a2f3bdca0f05276ee97f46ee62ac660ec28d5b4072d27a565cdecde7d331a9816d3bed48ad02c98d1285f302f435cb2dc507a25592d2fe538000e9a44710ec3c6d04296c82f160756f4b204560616074b9df0dcdbc18ae614224690ac28b750bb81bbfcbd57e3f0dde571447e5df38334df62dabff74204ebbd7791818310f770391250a54a95fc5cc6b11ca65d1642101247464be46b47ddc184a49c451cc6b99c455ec4ac63c077f73dbcd7fcc972c864a26338202080000104082040fc00620788246af8d4f0a9e153a3a706901a36086250b0e74dca18a1b76fed3bfd2eb6074947bd3f95f7c6a56e6d97561707cbd5d7671602ce7d85ab775fd90a9f18c072f53858ae70f5b07af815961f5f275fea6b5abf4e9e778729cb9a162f7b3ab4fd09d0ce0f203b54880a4da06fd0488bb9cc63a0d0278c4219f2b3446e15c8883402060a85420103140295cc0819321ca61f7311f7cc4cc934536afdc492d5927142f73877465422878995c861a273aebda9d1d46fd0612c63e0bfdb31fcdf857ebb6f1dea18aebde3230d5fa64ed2b08462796b75a80fd039b8559dece011974e3f28967f7bf62076127601a827462139f644cc9c14227db1ad605dfd1399bc599f763fd1fb17631d6a4df90ed01226404b98302029b8186b5174f2037424c913404c9858ddf148922780ea50258af1c7c8133f458ed4a12a94dd4eecc957ff004519a38cdf3fedc7f4538780de40dbf70ed5d8ca4dba264d89aa605ded03050b47fe8bb3d2579f4e8929141fe201d933753dd3195dc267440eb322c639f15544ae24add659252b4633504c2c16d4b3935910144f72672aa3c36ad9af3ee3c6cadb3b3f1ca692924e594d3a5fca39e59c73ca6a56557b5e594c49c9bec36850d0c6ee39fbf268dd235b514deafe495fb577c26aabe71a9f73da9bf934d6784fdf461a4d03b5066464fe9482954d8cc6d5f6d6ef61e5743d5bf8990dc18df522e85ad5d2d7386d944a49e9cb18a5a42839e39d9088b2f1ab91146aeb0a0bcd940405ca52579e966a0f3d7c8dcf1beb86e5e957f7a6142f2505ad2abe6d458b81df4eda4397ff2a2f11fcf43650a369278fc61d6456e3744a31a5685b7a666f5828258565adac7c8ddb38b0f81a1f493151525830b320288832eb4c77a8f1da2f591c9e4fd60a2c6ce48166161404841b4e4b355e6a0a567f8bdb79876a79746ef1d4a5dedb45f6a6846b13abb2f579b8507aa97fe3f360d91b96335837661614740396b7eee8296be16ec3e8b65011c3a4cc82825ac0a2f670e3ef7059eccd0a6ea1292cd4871a2f05054b6616d4f32457b7f35c8997d4c2deb0b89d49b789aab0e2f7f0626f7466f1b485194cb7b30f2c2c8fce264a8a153ffe0b1bf18c82d56f79747e71163018f07768793f45e8a9c6eb3b0e03916030e05336585d741272182287817faa81d5f29204872c31a4ed0d9ce953ea564f71b43791871d7efe0e9487cba365fa3b5c7ca278deab67f5f39b8befdc5cd0eaab0ae31a65b43791def67118f8f2b6108781df3e3c227dea43a5ee7cea186b8de278ba9e5b5c965976b92170a5cb320bcb2b4f65cac46854a36adfb217f5b24f54a4399922bd7c7a4fa491ade829479d3f298bc2a720a89f354e59d6d75abf9fc5def030311a2606e3a5329ff1689374c696a3bfec5fd55fd469642b2af66451ed9d4c2c16e4849f7cb90c326473c8d41732f5f576cb267ffe94773ea5145f455cf2a38e899dbbf0055041bebcbcbce07ee2f2ccde10d1725dfee5c539e0028475f54e36c2675cfd24bb17c9febde3c467d0b4cdd53dd9bf9ff80cf75d59deed4de949f4a54b2fd7c5a5c5c5559797967f717171f9538b8b7ba9ee5bfee576e680cf700f23e307170f438033588e7aff7f51bdbf8c0c9f61adbc7fcd027c46e9fd85e880c3ec10c219077c46cb7bcbfbcb77769be325bfe0ab0897af692ef7020ed38289c01c30dd2edd6ee230fe2cb7576e2f69ffd1ed24b7ed6d230ee35f6f17e91f8759c261fce7f537a279ef4c3258fe7e012238d083d1681fd9a7646f2e4e55d1b2fbdca94033f871405ed0066984a706be3359d00c92b8bb577102113628e109d11c6cda0c2dc0c2144750034f155118429c0104d2a8bca0470279811333884b9040867403f1c9dd530c72788317a248d286a1277840224890343861042890b0e9f74177773b10e8d5dfaeddcb9bca60780b1f8b3dcd2c48066c0ef9725d68380a2977f00215c4410c6d008211ea70c591288cbc000e405014f121f84003273d6148031592a0c299e0d164074782b0e00c5e58a284c3ee6e394cf3e7824cd965f6eeb268aa04a4f0f4f898c112883041060d698062862a72108735d80881c8199e010e701200f92a7df69732c8411273c83b0c01ca147e0087330021063697951b178834e94290272ee8b1c266023ec369acf644301a9ddb33e067068b220875c8adbe2cc16a5d9a60b0ae179d84507677078716afc5f07befe1cb7dc4ce95187cd0e51e2f3be765683c4f32109905f150c9d4ab23a28226fa616381c28a9199390c0ca020450c993198ab735b1c5ee3ed6f514199cf2001cc38cc07fa838b527d16e3176d21f4bb35a83882bf8baee1df4f44a371c19a8bd62d9949a18239e4862f8bc9e522af748c7e1734940f6683013e8305ed5c919bb9912024e4e0223a698205b12006f992913b0809a226b96d5c73227cc655ea80cfb856727f07adc127773f077c8613c91d847cd56e6da56b64ea062a4036cfba1b1f7c6059f9b18b9d7ed62fdb87f3f7046539160b4aa227b3a024900022b3a01830c9414938c9979583926032bfe0600c8664272bf581f5f972f50a417032a50748fc8062b3430b86baa003222957a8c08695210a4560e0833ab081ca166c7e08928214b041053a08c30b6cfcdd0bf402f159cde670dfa064c901122c3c703088f60e6381d909e0b0678c31c6986c31ec99cb12168b42063e5124c104481432f0c93e334eb380fbb079f9dd93fbf7360feffce0320dc6bdcd7bb9ed986cdec71dcbe67dc32468994809dec3bb236ddebb9d407bf39705961f969f1ffcc0073e60e9014b0fdce5bdc7d8632cbb7b6560c8f15b6d34c83de0776e36c74b86f82a22c7469f842ecd9db7d66484aecd49cd0986fc9e4acbdeb87bf6fcb5f9ecdf3d4dff933c45ff13f4f75ebb71edbaa7ad3dd7ac24b4b84ba34376aec117d555447638c601763b97ee578bb0b99453ca11cbd2678cbabfb667cd796bcfb9d65c6bcefcdb7b63ce3136535d4564c660b4d9cf0ad709ba0761bb17f5d494b1616bad7db7e69a3721ccbd0b7e840e613c5153b68bfe1eca47bfe516e34e35b0ae920c2c8f40b3994116cb0c3a27b16b381532e6f6d23a3c9b60b5cc82581085cc5ed24973bb130a16fb930b2cffa6727b1a5f84b5ba3090e353e6524af9fa56970e10e083830ff6adfddbdd933797e3f2fcd3941136e7dc35e7dee978d859f7ccb2fadebdfa757bf714f10dea4fb0ffe4fa398fee1ccd1ff3770f708c3596af23bb154159a71496bb6b6fb86f9edd1b6e64f7667114c0df9d1a7336dfef699e24fb533c3de63c72b2bbe533d8c367ed734caba335f7a85f6775b497c98eff491d0dbb864be87482c4c1c89061140d3e83ef82ff209659e7751fa18cd24643ed65011394d4771b662bc06c2c46417d6653e3b4be8dbda616d37ed60684a90da0594b2c1a6b5b1cf0dfd79be3fe08caa6beec27016627501f3e21d6a7b3f6fc2e409e5fe312f3e82ab3de4b080761778dc3367564f9568df0cad663d1f9845a7acade584eb05866366e436d658da6d9b06a3d7b134f2ec2e75c5ff94dc53fcd93c73fc9e85c770e5beb6dc29fde93bf8e0f66439bbdc1c870834591e3bbbd51801cdfd920a8883f3a8b43264bdc3a9e6bd22938d0f904cb7dcb872f3b4bfcd1b50928032e7a120103dcc36f0013811123e821438c43dffd684e61bd170207f5f37750993e6d9b23e6f96d71b0284ee0a089035814277020854c292a4feaad0ef90d52d4430ade1385548e937f9dde499e22a478e4e448c58e0f63b33924d5727cea9b0d82ca540838e5c7bf28c03ac78e01a72da8644d977541e9d08c000000006315000028100a060483e16822483116fd140011849c4a6e4e96c8e328886198420811420c3000400404404666860d02b6065954ed60331946cf4c776ccb64d19ec4c226bafbb0250f0d1692a4e187151be176a2dede5f21312bbc5c58ad4de08954d1c2095c88e0dad015b85508a86d97e07558a90efd92dc9386b48837218a52c3f07e42a722af13640a16e8c4745ee13a0532424953f705205df60b62f48800a69e3bc3b523da58ca5e64eba65f35c0c84afdf2d07305a4daa70b888a737a08f0e51e0d02aa9d22c174eb49e79525829f3de5152f1af063e2835fbfd4d4c7d93692d44c30446a95a360e07d88ca5c1e8a87f6a7b8c9a5cadf81d5c404551a82f2a767c4437e9bc77d5ca8511b1c4afd7119e07653d3696bd547a4b40cec705e242deb994685b78a138c81443198658730f4202152b6142f85fb60a547bdc06539da68f55a4e6ab522f8a19091ba8a690b3ebbc064ae34fa6b02d9a251ab42cbc0779d13656a549918a6d7a3877c43166ec9569491de524aceca6b07f51d57e67eb353bfd55438e2ce0403fd2cdeac16a311f0862e7b36bf7206616aada4c1f721021699fedeb1da01258a0f425955bccdb063336e659974680b250f4f84874322474c7efc93c7a592a284f77a5cd355b10d4e57912990188b838386759490b799950d590ae0c130aaebbe7a042045e31b929c21c489a399126f69d544bc1af79edce7ac311f3b16ba79f1675adb97571b7520e397c0ebe08fac7c4cc915752f3aea59e300318eaea60ae3048dd88c4cf205d1fdbe55f1304b90b1cb2ecdd136757e47ceb9af07a94c8c162b91e78c23b4ffc4cb254e503e256f9e49fb0f452c8aa3c35c1b6a4dc5fc027882dbb7246ac797881c209a6f8735e4a6ce43e551a99b446618d819a1bbc7512aea5e78d8fdcf6ba0b7a5ae9e79f7a68a6fcb8dfba5717c631e5337e33a2b04a18a76bcba6f5d1f827283cc2f2d81324752664749b30852da59b0d25093283cd5f5511fe54525819ef7c0cdc1b9240e1d35a653ca764b7cf29ec6d995a0ebbe97e18454ff9cd0ac028493e6e0234adf14a816eb84159be28708ebc64539ea39938798f01617b9292392a892ffed75ad5f4db0456540847469995397f4aa5635d0afdb68f413126ff794e6a54151e68304c4618d1c9a61e159ea3df35681fca6825b86e868e14448eb4b9f37614218bdb8078159dc98e8f285009d110d827f181d2097a8ad3ca830930368d53e78913e880e0c1b25f5675a606a2b0d6fa7012a8e56725264451a25c261c717cc855ad59a49ea70f0299a23a72469af8df18235801712895a87bcb735e5c298242f67e70960bee2cb5c4f6ae90c291d07c839da2fb844320279ad3027d7576eb9fc41f6d001f396aa360622c07ed7a374682ac10edc7eb66806c2bf2d419f1c245295fa19993653900bf1472cf312f43d760ea91c0a11c304c8d58e2fed285cff195eacfe8a9d8014f8fa7cad32cdc8c87cdfb706c64d31e5e95979b3d0dce10c5f7628630a918073a73625cc0b00e2af13e020b3f332049d691416a4d1ae05511423bb90f6ff2e54525f7d565d126641d4dd63bea5060ce0667acd10cb53a594c07ddc603ad500699f9a6eed2696c7c69a017c42ffcf2b29836466d1c9f6514c558070e75ae202e6c087c0311438a4fd2a11e42e30040ebbbd723b00a1729961c4abaa638e2c8a8e64f34429e1c038d80d509209a1fd6a0c009ece2479dd19aa9781de4a05515feb52386d2d11318868835a2e957a5baa9aa00ce5f54af3ef85812379aa88b1b84ab08bef70de8e31a99a7023a579e2b981dcf742ed9070503a43d95cf34ad017b0941b889c953354fb85da3ac6f6747f74b8275134855a20fee9f35cddfe25ac9763db1e329601177a34659a44b5f51229714fbb90b501c79e80cfc36e231d941fd4646f2d2e22ee4d27c801529ae62d1209c8522844349ad2acc58b2e9c151cc2f2bf892ccaa6a4af44f316e2298925399e0de77489c1372d3973b8643fdf5f28b093cd05ff4b4a7f4e37604e2b9f9738e67eab5fff89e7a5df5c0cfe1913d0323976104031e9750052e495194f2735c10d0c5b767a45bef03e6a04facd611eabe5720f42c6d7e64b523b56f3f70758f417d5457b653a9d2e11bccb91a958af7e64e7206aa64e3972b51028a370c617d1991d8416f0dbd26ba6a02123cdff5a5fc36abd5d78e95d39f55c95aad1570c9ec7dccc8db60eebd90b4cb816abb6342d4317007ae24e59ec3cbd1c27052e30e4f59ae807c5d25162b4b8c32d6dfc8c1eacb0cf497af7d10a36ff803e15a4b33801d96ffff0676f114464caa3ac973dd2bc7fe4045f98d00ff216426fe5761c1894ba362e4f95ce8a6ce9d3e8f1449453e9745a3b6050a7a58bfa13bc479bbdf280db96a9e04cee5ce2457e4845e81e1532d1cb0328ea9b6c0cbdd481b493877c92fad59fc52c44a3d4181f1ff40a25365251a1c8148ca9d26b700bc9038aed116136ccdb89b8c4b1095de4cb0009322d1ab6bd9891efda11206785d50f88e3557f248af21ea9188c204e8d0d7462f4a63f05f4bc0472a8c4cce0aa39ef09392be1e77a564bd47365b8a2f5bec2f8ead50436989c9e1bfc62e8f49f5dfce8c3a41a75eb112331feb77419ff09b1e02a9aa143bd22fcab53d5a6c4f70819ec35e2b90de7215f84915b7ad03e3ffd6e7d30a15e2a53688c673483e54a8950285fb1b63b228f9044af97b84a078145acb25f32804a3d4c83116d11917345958dc546350667bdb4bbbce547313a2e23d9abeddac5e168900ea23a82c0a36b1a9713c0736af2100fe53d3b52d5b2923e3e8056b4fd3f14cf0d8f7c6f00c32a381d346d0d0a9ced5d4888005e1254aa47234bc90f77969f575c5c3c89f80ddef8811bd28d917182bf593f1505e6151270c08f78ce39390ecb1f11b4b2b5d374632c20868432e0161b2526f17568fb444ec77c0c40cb9a89f69c9c4cba68efb8105daf50bc383a8ace97b8b6b4f2e68a91e560cc784332ebf1f6116d710c8a378a21e154c0c1bcb03980d94dc799e8019a16a4e28edfa55fd199aae88ab38b19a4c9edb85d51f885968cb4bf182376f7c064dbaa00831f049a64d07654612940fd4f4aa47109c052c419c066882be7d8a70520676fe98a06593e110ba8602857f910f3ae21d539d0874220dbbe716032df929a315c0081d3c0578366de4fa2cdda1ce1ca08698b3dc85b2a8157ce5a8b0e31826662b0f4a8aa9117c1979d0e9ca251c80617fda484fb7942589691ba0f40b4648186824965b7e1bb1da47caa0dc7dc547528b8800610a9bf924f746faced7a0cd36f22b1be6e6ad2834d4cff72edb9b2214a0c2bcd7129470d1afa325ffc9b8e5fe59c559e68ca056076e10ddc5a75f4411e77fde3305cc7c99a6b698e76c413843cfe584b2712066a4bf05617e70dd33183d44b3ace1bc88314baf0fed4092b225424ea35061ef14bcee7ea80ea95cedf7c4e6cdada52f9b1c07c0f13440b35e8eac8f87812032d6a209ba557cbe707756ffe0e1d74e2125f701b0d85b71aea9f51abb3eb9115e3d9d57a7570b4cc4b28931950e9be4eb8847b46098b8f0179f29046c747fd713ddbd17d1e4ea8fd3687a3d5c55407079f04b0214e33d90bae046be40db9987958a21f3750fb679b24a173550328841a55be2acf2510dc4591307486035402d88683d9558cdc5f2c2eebc15edbb0c1367098bda0090d06cedcb0c81a1f00d560d61aaf24935e9019c55e96c688fff5e8088f0de58381ed2ea3224889f5867823259113047c4fd91e2a1b34bd5b4445102201bf61d03cd3dfe422f25371bf3d0cd724a381b6e6a948be1f0ff7f670ba2f0a71cf0c8a8e39ce1de76ed4ab1ff9e297fc5bfdda3323a85d00c6cc0b058020d30a7af8a0643f265053890a65b48c0fb10af44e6d616d33d25d1d93c64564d9c403b8926cffae40fd6f05bacd554c5b85a5fe5621d4f8949079afea6b9bb7e5a9145eb7a709e3dd12aa7fc7939520c424654638ba54e744be27f07526102c80339927c84d45f1031a52b7b9c3ee409f3509160a59e602699ff6baeb2ae97f7354a307fb2545245b8752a436c0330f69202a450724bd363d7003de5619dcc76b528301f81f6e487985a1885ffdcd6a18ee66131d3b6b645911116c8edebf4575c14558f896da216ed8eb2d2f935a0bc8771d4acb07fc2f62a7fd8fc6fdfe68132b6b1dc37d0b578e8897bd1d525567d4479eb19248051dd40682fd2e119a0d1265979d5b0bff84560023d25c7e584b6b8421301b90ba8bb19d88439555f0850214cc2b9a85efa088ba76528c2d48ee9b65f13b37fa49330200c0910eee58c442d147f18b13097342f227f29a61d1107bda90fe84500e8128e24ead3383397a2a101f6907568810ebca773eba5b733ddc1cecece904d6b97a9eafd0d1ef5a0c2a2a1d9aec6929ff4bbf73821fb4f85cc977abb2e898893bf7e8a03f101bcd121bd368d06d24bc82217fe2079669d800be3de07ab23faf06039628e69253e3fc7b309c9553837dae062cc79fd9a97b4d4b2f23b005d172c60b93d1dda4d33798ba4dbf6cdf15886b50330fb6c12fc173a825092250669c07e79fd848d10447859f74d3383b1973536d98d477cc3431d76876f694973d500cecd9ae52356d2102c2e351e54b3827b499021c0e1bf19a0484893a72f156156d27b271eda8892e45ce65d38d5a4a9696cc6c680d41ef0faf16d4d0ec363217ffcb2cc860955658b2e5bfa7180ffaa5337b9343b1495dcd25c5f035f448b823ca684edad2d682c90af0dee0bf54de567c99674571dada4947b1e3f02ec0d3d6213c806c2ad72f0f8996b3c095041288c38108f355b1260e94197ddef6fd1a87d1d1d86f4a9ff21aa2ab21c951f22e9ef117d3d11c59d008c9e4d3f5224078c98392c6633280f2f4f6e1f9e9ddb621d409ae8249e452caa16b55851f33c9745bdb944b9885c1005aa5808ae1f4d6929792782909c0f91af27107e71e19e0539063d76bc5e8a8109931b73a8d5e23e36fa3e1ca1a6bc759af070c1b791f6dd28b7db9b8583454ef98621ff9f9fae4747ffcc6d0e201554b4c53a11d0a1e808ecaa0f3f2ad6c799be39b70513dc49d4c388a11840a30dc03fa0f92cbec86ff63350d8de79ae61a21f99548bb803ea1a6d3f6c37340c9bc80ae1ff5a2e02d9c8d6ff4ea89a58267d37fa986c72d109000f45ae1fc608aa22870c459e98d4ea331bfca80af57f5a6647b4bb852ab73a6a92c9f2a8418f2059e0177c9fde323c9a231a6e03669ebbf8b7dc64424b787fdbe212feab97553c1d13abcf3af8ca80e21cdcdd709fce41fdb0b69e4ad6d3fb948bf769fcad14dfaf3b4cb3004de2a30f046524a6abb8c936f28ed81bf7b702ee90eee4443a6c15a0296dc8b097330dc1486f08f547482070c38165972ef8126b653ae270c3751645c437712cf9ff1834cdb87aae26f36a1dbff3bfa0ecc76e56621bbc9469a0194651aa99b60470c85dc9a2dcf3eb68e2ba4e5e98ac5efb16dcac8cbef41dc1f9b9e4a4d2e0fc739173de75bdf627a8bad8bdb0134ec134127b53e6e9e665abc654bb8aceb9f7faa82918d64e166012c7acc3025cc64216b90b9cf20c988a4b4057ff8f03c17fbe671e4cbe38106e4e93c6ae9ecbab8d34a2ea87535fd9d84416b2c22e64116766b817004f453e5d13d88cb811e04f07bbb0e8e878a09d5a985eb43509da24eb17f8344a96df5194c277c6a7955a5f8bb14635ea7d5dd9d86fe9d6e3c66772a477082d2fe27cb8a7d5c74d0372e7f15a1379da4dd25cf2cd9050ee8b0c2793181034d2f9997ed11a34368f4b615211fefd5063618b51f801ce766b4fdf0f05a5a9d6d274099493cf8d610dd1a67a0ec64406351aadd5f623594eadafb832eee0cdc01c45da6fb90cd068f4bd4de8f93384940324e38d7dfbeb741e2e50fe51b0a685c51c6cdc64978fd0ca4c10b3c66a5bc8e2b00a936550b9c7ce031a919095987ebc4a6866763989bdca0e46fc561dab494586b8c53b2bfebe4e67c10b0a77612075084771826146b29e35dbaf5baa91e4d9e573224d2931e563f15bbdb24e8c62bb897b540443eb48bc430f43a9481cb8971985d99f58b93a6175d09999ed7084a95e0021f651fc8fdc641d68ba643687e83622057ce497e69fad3eb71e95a50455583843a016a0357c78884253a2d88fcfb7ace404b2865d07a5828cede47991b01f0d899f373250bf10de1f31821db67cacd18eff5c0ef3aca7801ecc62148010051a05ec17bf3f6e0754e676c8a64362a983e89d2598299c5e917513747d057b0d12c673135636a34d24cd88c63a9545e6c70b0f3352204b809e9e577e66d68da81b97740344b7dd0aaf59a83e8441945153be0ad27895cba207c4dff4becee546f95e1ca7a4505e48703aec42e76d45d854618db053037940f772ce20a6eb51f325b9f3cde1ba09fa648f93ab8211a9bd46bb6030456dc6c200e4b13bf35947d08819b29f7fd752a2faa007df9ed9c974785dc24e67d9adcf0b9a34b73ef5ddc0e50bcee01da9828177a745329a0848d812450d7a01bf2046bafa798f784c5782b1edd8760afa8c017177788f5dbf77a055b5ce1d25a01f25e78b1eb4e8b7fe997264b0c590305315a6a0a50420ca562a2df25dc8fcd196f9b3a6c36b1535081939c1cc4cf6e4a6229b52ebb03b50ddf9c81dd42de1c867b7636a084333946395120ea918974b44282e99a473efb515d86c1e11a01adee82cff50c379ce8861cf4d845c1e60d89b141c3ebfc103721baef6867cd20c9272131789d38d8c5ee17d30691dbc341468958705392f1afde692f028686bd65c3486e9a51ad9f9fd04d4f959c83e4b0eb0eceee1a3e8e9d8cd4406f850088954b839c84591a2b198186121f48229c7783c34e33a323bcc0e48388fcfd1ef23a7dbb77be4581c1265b73890525b9a67565d2c177ae932b8b01b48305f185220ba445e9d1c3e816e836ef4dcf56ff07728773a456b64956553fa9be601d3a681f8870955067ed1f6d1c3d96d375480ac9defd723a2108f5df7230d12ea3224c7eccfdcfaa0d256bedc8e91e129a134ea77b22dd1e535c1eed0025424c3522280d965c4d247f4272d4eed01f3140e23b92ccf20901976f2103285badf66fcde67b4d4d7a0488ebc79db646c4723cd4871bb51c275ab478722e16bf931b2f6ad08d8997b08114457c23c5da6e8f2657d0154cdf8d3bb293e7056dcfbcd8083992535a3dc2732f17ad502114efc9f3ea9c4114f34e7295a592a1864ac58c9c7d599459440e5c2503f0c57e13080d6c3e48f8422408d66156bfb2b686b72eccaba094a1eb2c84c6367c28385a34f406e6556463391ce4a4710f0179ebbab3ca9e62973b6f66c2c1a5c68d64a917a4aad1f857748de735ee4309b13e683a6535a9ea60612100446f83f4722910d1b0b974ac03c75a88495d2dea881f4698b19e4488b422740a8277b3f28c5874b6c10266c6812586654c8f42a2ff84e1636114ece025bca5f22000d39af5bcae831b524ce99d88782081765028a32eaee3ecbe17e0044195337f57628845be3c9ff5dbd1052211b2f572742fd3f3a9871c892710559ad30905967054b4db870de95584b6f063e13604f89454a0edd7f7b9d407f589aceea36730462b2c50a37780c1a7ca1409bb6fe6c2749cdab6980a57d2c57c17c0eaba5843fd6d197062e8f48915efea66f6edd742e1b95f99281bc09c9b9196d9e087ada0b7d1372532fc0e77d58b75ba9574644e78c82e4522098f1ad98b6fe115fafe9536a9e50b1196df4a0f270036cc243371cecb18d0c462675cee580f0e7e28a9fb3d42c52eee2084099b98b89d27a7d8b5faade0fd5b01a19328c931b20aa42b6c788eafb2534fff6a4d2ef671e8d15b4e3a230960e45ce30506bedb8c489cf0bd25af23e6f8d4dca348d1092755fc904b59679538ace66b12b20fa4599724f84d2a58c6b94b10afa33f4453b0b352a164575b6a70619855186d08634c969aac5402ac1fc9faee1f0d2ed9f415ef07baf81980e9035b81b5f5ad7baa77f66025b6306fcc8487417bb19d913f77660042c8b1446c2d5fa3b8bfdd5dd6f6714f2e455c5a50c5a9b69f42ba2112a63a42ad209ba05c152838b50c22ab5725db2e7e0e247c7a53f4b64622217050078db09fc5e54cb24e8a9c9d00d1d81cac08083956f8d1e7aa1c5c4d3df84641a9c30275309163f72f7efa86a71c1b15635daf3a699ae8c13143abac85e5b68b6a6d0466c22c16bfa867ec0f5ab92a1f8399156122e99c14fd2eaecda45f8ba415d44ee3f40663f7e6ad6dec98bb224d80493c03c03ef4b484c178f4c4633ea9bb60cefceb30fec95a24aec1baa098c030897436e2f8800b80133a1582fc9d7119b6198eb89619dcdfa4ba731fde0908f0452e2b47015a2428d935af79576eb0bbffa0a70ace145552685c47daf2a9f04e1385721cfc90265ed668160e1b931794c1486a5162ffb0b9c3b2cd04961b6d3c508df601edfedb324c1318e14e350e8bd25bbf268a25756134ab369417be25e2946a9bbc82dffe705288f0c6ddb84d19447885a44149b222f50862f730b36ff21da21825091c6e860fd63761bcd64383968ad5d7a4a85daf554d526fd26e4d50ce6c8a3a45d305104288723663b342717f23902bfe7b17a9204b0c069433764b4bc141f099e8445bcac45cb8bc2cceba50a652ec2901a2a62b31f3e2f1a464e368f185454b2fa67a1fb296c757fb7bc37d6e5c23c4f18042313c5b269b79b08cde7f147e04888c849a33c671e300c669526cc72b9b9efa92648154299a9890195879fc3e2749776b7304fd979a6e2f19611df7dfa329ee1088bfdd347d9f2316f895826e01f31e28e7d14652f9a34afcb2497c6d9aaf3b3aa678b2cc70e959823ea45cf4b3e19115693f9e805e9d5059e491f5908b6124f58ccf28882a25f3779fd89f25ba0f39519613ca74bbffcfd8a8a6483b1c2159203e31cf2ed18467255ceaad3c26f54470f15ecfc4eefa37ff511ef6876db901acf9ac0da76b12dd496b4f915fec4de4711ca5c545e2d4528dc690ad410aa253699a534246729f67ad4e85239f857c11a89c150e3c6ae5147d352a47a5e180a6dbbd8a6b2aced9a8342527ebffb6dcee90a7adb7a17c4a304ceb2da6af2ce52bb7e16265072404df0e54eb2782e3aa68058472e3aade90f220fca547182cdd09c7db54f5e9365005a41d3f69bd3b1fcc3dd08942cddf245d5d76c0994c0abd158996a20553870a851b8a990514fc516c0dc02119027d8235b954b0fdbf31a59044fb8bfd463c894835429a66555b1a2c4f4b30091f689524aaa876d38f21b07be5da2985bb362e4433e1d955aae58ed24edbdd82e0dab1692ac4ea99f678415759ce3ae6fb30ed6766abd547608f94c967c59082f88535eedbfd92aadd12b3acf10c1a43558aa885f26f1e56e100c265f8890e858adcb537e26e4b963ecd100b3f57b40e04279528deafa004d1ca4c89278580b62ae1e0e1043ce3f1a49aea5f202672aa3bf874c21910811d79004358131d021d084cf2a0d22e79b6d0369ed7342687b68b1a02f6570c11e30febe1de5f3aa39f59c731ee47686b3b124f9b812738fa6f47135f6a6d71b039b5cedc5dbc275011b31e0f3d0335c2cdfec446ec07e3f0516eede25b93a78c3dacab1d5d381d8756b3c051a4b9641f267d7b7b8b6b1c6a63fde476e345a7f02426a6f02b8cb30ca318a43c254f37012edb8cc748018eec3e4375b01a0d41cfaddc8e57b1f466c782d22a65de1cbfa0876d9e102a5c61fbad1c5a1cabf6be3c683c67a2b4b4a29e91770e2273536f30c32c4d13c0a9c78a9a35abf1803a43e656dce3ed3f4823975483f47ee840b9ab0d6cc46c222469ec70473565a5f3a6ed2864efe422b951c61c1345837cb8474b5d8fcb8ee86f566ed12cab49f88fc36a4464583e8f9f269498b5d79bf26f6cf6d151ef44b6aaaee96e7162aac23e0e5f45453834ef9faf822d1ae4e057f1bf59f3aad3329b01b0461208e20fa487fc571e0f685d1cab238d3bb65c76fbec8b5f2611afe8339f259a24b1741863577ea62e0d9070b945731d4b968b52f19fcb522df2a8bb5bd2741398e423b31f7f0be01b3d3ee7cfe3c407529771536cf31c94fd249b57c07f9bd9fdfa59351189f90a52aa7fbf06bb89f863bff191b708fec947b8ae6ac28d68280abbbd9e4723eb2020b2293c117bc37355e1e3019a1bca9e89ad38bd35711638d27c97482e91fee7f575a4d2fc100b6f41d6446c549c0f96aafd221aee344c143889dc74f046ebe2cfab7d7d7883fcc66c9c04484d0f388e179768c9453e4320177f97b2cb50313cef765e0a1a65ef0d88b9e0458a545311a1cb030e4c3fa225303ae399e205dc27de6442c75880653b60f39e131fdb019daddc344db03317be01d2aafdc590981368c41c8cc549d454ed4682f9b30c9a9aa695cb036ecc3b8d06d7e62a32d0cfd0233a3fb352a0f1c95c55cf33e80640398383d3d2c52fcbd49c10972012850fb9c607106b454a79c30aea56e7718e573125414230333a5889be3c7d9a29e05d1cda118188b087d70321e8ec2d26a8cbc7c79babd3f6ad94d5cd2c109639f3e54af08c93c7496436e87f97b86d2b05b29d885c26f2b8766b19bd1bf3981eb60488221a830ae04e9d960ca3bcc66cf4715bc19a8cab95d6ba7c74dc4a2f1e85073d10b666e7429da277974cf59279765c2083e23e3052cf4e4a38f80e21f7264a4e665c270a027872bcecface7c568e94c1fb958886f189a817bd0250e329d145f85680b3faf11cf2174583b356c87b7e8c36e35993ce1784e360deb68e0f0df356ceb7188401126e674465466a101fa811a29d3088ced9bdf873b076c68493033b8523ad44676dec8876582a186d64b3a99b5033baed0a275c3d245c3b050a864531eae49c86601df062c3c1452fd030c82744c6f13be39f15c2f2bd0ab8148171db33bb300c414ebd2f903d229d96158eb0f1c62dbc4a739f079ee1d59a0ab7e0f4826799d57aaedb88801ea35220e7ea6c3c2b8f434a50811340c65952db94e42ed918aed95a785c95b8c0ea6fb6184e9082d1650deac0976575ac63dc910d3b33941f4a2b5932075b384aa9068052c2f184afb2ed13c4d088eaa06821a47d4361f89ccfc2a61232c3a64116e1342b77eb57a9f69c6c5ddc32429210fd852e46236e4aeac6c01442e4c5cc44aafeaabcfacb093848996ecb881f0fcdf681c059e2259ed264799b5445399920a3f74984ae50deec42f095fc591094aab66eaa902edd052002fce4117c9253436f3cde1842469eeb513114fa0175d8378538355a4d80603600e7ad62717a4b9e08787c650c03337ecbb340b95b7c27beb49771880d91bddeba69a5a797b2bd825faf283364cb93131aa270805f8ab8dfd4872b9c5bc2c06907292e3c968ce29cfbd334e3b21507f2182a54b986f770844fad98e3556cb61abae00969ac7cd25e4471cf922eade0371fc246b0aed66b02a20a9708f7434f7b736877b749a56e8de1dab303d46a4fdeebeb513a2734b4f9b094ded59c308864ffbaf68b57e635a92dc4442851bd0bdcf014a2bd43442f2111b8d96110fd9c90581de5e99c901db09740afd6e9311438c2c0db650400f800f4308f95c60f7a37c674649ad80556e04011a07111ff403b82ca4c5d55c4b809c6116e6a3e7d96724fd8bdba4087adab4a9d7f4680157381f24e01be8f3d015619f0c4464020054bae7cfc7701ac455200ba7351359972532e7a1fc0c7253e550f70889869b2ad89d1c59e3dafa9317a71fac237f053b4f0756e82c328f99af550fc192d3e36321dc8326835454fd1ce3e381a773a5a75e544e66a29a93b24bbd2e334ca26939d2252c01e78c6850306ee3a1af6c9a9476637ef9b8a737a7a9ae6d709ae1183dc48a50a192dde29dc85363d83814f8392adba40117b5fc5f5b0e078bb939b37fa510ce19a8607fe784d41a8d50f86f386ff980a61b7a02c3230ffd7232d68e1dccf0ff5ae1c2625a575bdb2645dc7fe305c018dad164163a47a983de7799c43ebaaf104395185d53f34bda33d98ac8d45e68e071ae99d7aa024920d89eed4f87302da61fba02e4e017765c77a1738c0e04d4cb4cfa61d3ecbe2b0bff936038648c9b6205673a6df50d4c5d6a3e3875366784bce7a353796661e9979e8ba6f7693108ccd229d5a10ebad447656831c08ac6f7ac903044da917ef2c5916d22ab77336fe3eeecede29385ca09701abcf81e73a67ebc9a518412b3c5200690991809751b651d1d759aaee2c1c4e6368c871b80f5c31efe07a3b63aaefcddd9a71bda1987af8b1817852a032e3698eb72b8c8c1a200cdd5fee626be8a8c085ce537a1031febfc8fb33bf58bae52f9619842b443c59a7645a2d3feb6ef2573754a0ac7265308395c19ada24198e232c7d2858e5753d6df3fe9fc1e210d2c9513f49deef90d76e296ee4aa220c2574fe0cdc5a423ba6e6b646b970ae088be0b7b735c699a522a8dc61d16a50431e94c1cfd48ef1585bbdcee4b6909a480d50a09b2e9d5337e9e6b9b0b4c53c0f87c7d657cba273aa90223da4d24cad83cc5bb226335f5feaeee8f0ce02501a199f922593c2ebe08f1d88ff4220e369bb22d13c5afba48f6afd40a1bb764059c9b29ec294e11b809b8468a6f87ea3ac60201e91c5922c0906e4db917052d67a55850cde2d05c989986234b96c92cfa0d7256edb54c1011b47c3893ad7ad7059f99c546a3616be489fd7274f82188bff009e794641622c7a29020c7739f88881be76ed1cf009358ab2ba12a9cd8defa5124db447167f6f7050ae61007536aea917a1a0eaffc016b74a713edd0a71d79378a1a65eaea838832e9c3094a6fb183aabc8ed883ddb9389ada939e31aa27cca83d9d6870e3d71717eb3180b0120dd7adbba6f62aa803a18b2736b0016ecc9d4f561dd191436112b0ad377ae3467d48a6d83067fccbb1312dbda9cebc6f9df7722d9b0a72d776c741cb51c76039b1322b433466a140a52512c81deffe4eb2526a9a1674d0d85e38472b906aa4558725554529e31c4e862e3988d68cefbae04dced810dbad29e635d558324f0d320c66c84949bdf0d86f71d2611cfcedb75e586f4aa469964643d99f5b1da7eebe436344d5ed1e522747b51edfb750e8954dcb8dba040255f5f2fd948fa8a046397e56b6193584f0de62c2ffb53d057620a7d75e7a96de243bd676fe583e4052be45c0f50f856ea9902f4c0e1f9edcbf55b11eb7eeb76bfeaa1dbfdd0537f885315256e86107123e28b25c4900d7dbe6ade52a60a1a1fa124f071c64df96f58ae12c2d19b9ed0bc40577743e8eac4e95704a97799d82103ada31708e82eb2a4d2ac5fd77ee29651ad6d07ff2bdbb9d04b108e86157777ce5709d112dd76ff3d8d4a627af9a3822a7aca05f07109be82a305665940ea39a7b259bbcb780241892b9904d604a8c082ea1c633a7f94632de7038801500ef41780930e988c3de0eedae22734a7fe9d8377a5ba26ed40df42608b831522df5a1cec55d68bbd4e94adb8741831a990424e95ed85e1e50ed1ae365023e28506f1a38279268f09dc33f4b543c3d102caf3ea96fc3d3883598308b6e4bc3533c3e05c651e3cccc5459e040de93672a8e5f8cbbf8499649a46006bd8b4ef83d32773e03ea73e3e40462ad679a6e765f4c12dbc627ca743cc158a362fc789333b22c395c961a971f60f1c72ebfb6b0b0b38805c7b4d288c59637d54e42828723d2425650abc2d62308864245f3b8542e0a3a3f38d83a79535853044566184c13cfefc72b80bdd664fffcc152c0cafab8b7ae4bb628b10793adc4483238131795497d220131e3513fad1f124f4a42bbecaf4e20e96d9bf35c541763670ecfcabfae33242aaa27ced560d764e106b0c7d4772df239552912cfa91f73faa5db5d780908268570f5094ab937a615cfc4e1b0b5ed5c66e813fc8bea628bc61c578f4a016b2fbb348032a163b982c12ea487ae983dbf2b1d9cef08fc21ced7e345ecd915f8614c6c5b5fbe7b9c01ca4bdce3dac83d810a76eec2a4821e32206a6b040ed3047f7054f96759714364f9f8306d673691835b982b2d815d280c59fb57e493f9b480321e8336daae21ac777a8661d8e1bf4cd9df52f554e8db1ca37d280c594eec47938e1c9508ad687a733051baabec346e2cb11996ea45b55e1d38137e66849e32d521ca158bca1050884fbe95fd754df77ab05e89c2788a169256b717297256d05dec2d67a009facbc0a243620bd79763e1bb53b2989668ec30586eebf414859b1dd3ac677e885305eaab567e0935eaa3d513d7782ef9f5843a2036911504fed567c219a23a5329283d52a77d616ee077abea2989eba177c06c2c40ea07b31179fce2cb7e07e9303e1da5303521f933bfba236f8d97cf59439d4a20eadce904944fdf02cc85b420a97943153bd857ba68150ecdd0b20a5537b6e72ac82c1eedf08284a5bfbf868c6778102876b2f6aa1b229fb0dc26b95bd70591139507e1cb9054f974042fbd8556eb039215e38d01d84ea0a483c6df26ae8e65865e2a0cbe9f23f38358bc1126c99f12832272b97c08b533ae52f84d3079eba763dc36a366a5d0ff14f4337aec6894808b85b9b8b0b17b03b51052700050774491918244a080d5a9c785dbfa6314480fee658509031248d901a84841cd84b61faaf17c6417a06c2ef5de49d197dc267cd0fd9302dde2bd0340e60159da96ca7ed50a08b985ce70022445983f39d4d9d7f0861b422d3f528c51f40c4ca5291d4803d261a252ab2d8f1f34a5d60522c243560373831a4cab4c8f889d8810ec5843985cf33ccb828b9c5bc7443472be0770bb7dd901efecb18eecc22a82f17ed49305c6a5aadb64311b181f43469388a225c8f0843908378ee2c586d1f049c37eaeb7fb0cd77021fe588b8e09ef80d27764c98170792dd6f96588b00b158844474811a36400ebc458bbf9a4a2d7f617069851b2363e1c74f85de74c3c232a58747b5e53cc6b70d2f105f36e770d2bd640632c49c3b7490d25d841b0bb59ab5c66b13dafb0936a4c6f92508836d493c2712b8f8baf9a78324e19e7da6f96644c665b8e76189cbd325910b5f201945ab4c1442c2c5c2e36b8c65ac012373b9805ec29dd883a17e6653e8e52eefdf001619570ead1a0c93fd0146eccce9b2d27a192256ab01a5d5b7282f710b405664c15f949859837dbf220bec83f784e85f2c010ddc8e9a07ecb0cc780f05fc83e1fdc6ae17127651dd3a23a408bb8e472aa9b942d638f99780784d0c6c9f644694cb0005203547677cc8519f6185822c7e9ac52834390849cbf17606610f604aa120416de757e567ad1cde29c174386f070cde15caff5894a19f0c7e4a7914337a36efb1fc228210e419a00da123b0ec98a9d0dfda2417b048ef8e218fd0d11ccbce850378a95cbdc9913318283e4669a50ee87eea4fc9f43b8f34a03cf84d506d7585f902a2e61594bc4240cd9ddc6a5501a5302b60104a315c2d895300cd27a5ebf1e7d59d1102eab9bf92d17289b6c3583c0a11d7ed8a67cb0e03a373179511e2e7ef1ec6ba53c3c4fe3e5d014dd36de4bd28a08e3493c1e11428094f9605fcd2ee3d92d456db453646cc34e3939056e86a56038e8d669c392f108e40f64f38a3d4bd4967af8135e6fc6f57949b314bfe91ba0ce28a8dbdab0ddaa1b32c5f960d9d295a60e77339495c6bb6e5283125e3840ab7e78297bca7728273cc4e6b3525c58f6c518638d5986d12a4b9e4b9efe04cbbaee60d673fd53e31762be8e2c10d2032e722f2d6055195511aa009e850ec61a3f89964ef687ff92a21f6b56f143058787304ccd30ca3cf1cc7010f1e110cbc2cf4ba1e6f11330104fbac81090eae20e21042f544cc929b18aa0126b6636c5d7efbd0050fdcebe73e25f181cb409cf5503b4915ecefa3ec500778051d5cfb44b05db2746d81635083f551cce3a5dd2953be5c206fcbcaa7be21ce1caea4af603e1bec117cd9c70e7d3400509a8f1e2a75bfbae329e92c9fab360d0a135447fc8e70c0a04fd791f1840d14f237f2a116eea6393649d7ae770f032b3eb3f0e1d77d826336227d9806432ca6b1800fb5c8da1bd99a09f828f7edc0930261515aad0d10881987568f7c09399d8d09aae50dc56a0e960ed7f2d8916b6cf702b11be8df566f213fc2846eb2858024e606947085cbfb66e38a0913484aa3b84734a51da1b3d5eb8c84a880fd8d5322acaa845abaa5dd7faf794ceb10a30081010b0e2149c2bf28de9702c1baee8e5e663a0e3fa880c60b0c9b54601817fc5e7109a625777ccf205ed963588a8af7c3ac4d0164bc9429b1017fe55257359065d5bd706277e2e9bc48bdb670f4144a6be6a083dc331db1b3e334266cc6e6c0a83fd28e4c447fc7da51e03a5ebb522462d5388cf3de81eb18c17508ade910659d213a2f2896cf4d37b3090d3ae81beae1ea5421fba506b70bc27ae7d381cfcb23e3c9c8ed444546a7c58924679e2bf47d21b45b7efc6c51b0435c7a61bcaa9bf7143a12c24601caf1bdc196a1a6e742e2169c72fa19be579d1c2a638d76b007c354e0932704abe4ce1113079023cc499759a0320a0ff6991056d22985eb1336e7c1fed96285c3f69c162aee62414fd7fef7f97cf047001feca948f3a7b9f5c1de3449dca03294b004c663f79a2995c8a1a62516b40f9051ac2b14caa3a2d5da14f307fb738b4507c28e186570a39c2055b5dbcff5a920ec0c08a920596962107631d7eb5b358e3c3d49b40743d85471470b7b925126757452a8befcbc36035cebd84ba452accbed39a17b79cbd9d710ee0b01fc2ad1c8fd37d73f3e12b44ffbb30c6becadf540637faeb1ea3626c3d18eda69e10a53b4cfb59de4d86ed2b18f3b56f04c9ce5ecfd8ef691595c426e2be2f1876f471f0005874ac3b4da9858877712931f6d04d638c207f0b0af4286bd1148b571a0f51bf1e0ddc1446054de84b9db21a112682cf72a126e3887db053fbc1d2585c12416c225d67b1de25a2d5f34cec2d98665e0e202b2d6315ced99093561da5f5d58376e3d8fa4b01ebf4d20f3faaf387250f631f0a469f0cb3e3a7e2c341e034718f2d3fd3da8058b2734d89061c6a4ca2733f6caef2c52b6a0b67127fad0e0c83bae84adc67b5f6c7f0c8d1fc67fc07a53c9797726838097ca12e1d18dd334e301790af80af0d3f13c13454c18deb2b27822af7a156cd42bc36fd4f732f2982f3c833d7f2bff4e89b50c0207df45b5a326df5a7c4b534014a057fc1e438e3c2e0086a41bd5885059fe96e4573ca2440798c7e5c6905b751ec6169b4d1376832f3c4159682ea124ea6a48ad05c2f3505f0b4d7cfab25ff2e6664ef440f90c2dbaaf7046cd3e1366491a55e284f16ff153d54af0fd1fb348d39e98aba8e80343e03f3f11e132279388d8c4c2661c627a150feec4eab9132052dcd152f1c063fc4d0b22b3f176a4b1c00798de9018c1e39a4cb7d9e49f428243c6683ea0588ccac9600b21ed3cf7f23f7007e871c3ff8c4b90c309d099306026744d130f0673881955f88484e02863ac722b749a458e9a1d91298f33679901a4656b3ff4c25968ae71a5c1540ba7981fe8401da6bab8d635e2b97987bf1535e14b8abeb128a81357f6d6bdd89dc4bd3e47c8eee97533c4218a04fc87512abacc80dcb06d36027cb955da10fad3cdd487f8acd31b640bdf49a916cbf641968cfed4546787f7dbf53538c3ec1a858c4761577e5f822275283a3b70496407d1bc42c4e2f3f8bd0e45c543de0c0dd4c180d2cec505d1809faec61c1b3eae3c963ec4e07aa5efdaa82b7608adf30fe2a24379c99bf53a300dda1df14b1e2a7a29f40c5ff3f897993347cefb12715a8706800d8aa100ebd903c3ca7a107992261d173ce618b7566443c0a3b90632809122d57ffb2c2d61fb2431a2deb0f616ff6c50c501bd265d6c6666fe2f64c3a38efc60a2061d4d5086395aec77fe0b488457300b5fa36b3a2caeb3e19a574c4466e25171a743557cebcef21a88c865dc26d3ebc408b9742224d0837a14f6a84bd1e5ca3d68ca92e488afa9a1380b5fd781f65c4a74d508d304859dc485e42b373c3849261898695d37999561b31e1fe6b5b70bd63b25c421149e3f4c3b4322088b7ffea391bce729b42d3e94f400467bf89c7966a57e4b0fff0ca9091404763bc6efdc269fa37905e283766a98b0ae320cb24d757b1b364f1f0096de9468b794c8448ae68dfa2cf89a7fcbd8e5f78a64e887a4d336512aa2d7b543a0027746f680da37c2662215c61ed8e890443c3151bd10131c08797ab6b008880d48410bd54642e2303eb17d6e2f691a930d32c2fccdf5146f35f6a95c8709e29ef5f67b776f5c407c2bc3e65948437ee9072a88a5201c9a337af2a7081714bb83028ca90aab0fa72c319010cf919307779336ac23e87b7c692bdcec4e719a8b8f0006528bc416a64fa0ff8779e97616bdb6901e987a09e4a94a6d15a082c0b7d40aed421625f6840c3e317b11173b2d1bebe20650305d90e9d9660732a18a8b1aa935234d8d0b035c23b52dde7e76bbb00c218d5b60dbcaef834a02d0fd1db42554f40499e0ee24886c1499b5497f93d6daa395ec09dcbcfcfc38afbf9b1009f9a66a7cd3c28965be0a7524f64b680f988506421497ef6030f7e9409d4a8f9717a9358e34f1b41324f425b51ad41209ea6360532384fdb2b7fef80abfa984e2827aa1e93aed4eb5378eacca47265731aa18fc91c58a97fa36c0f80979138dd433813e106302b74a4f7efdbdf4d707f8240790e5267efac07185ca0240e35fb50105dac6610224ec8371209149cbe0605b0be4d8e409fbe089d5c8ac1e872fb2710120c9bd8089ce5ea4b8a361e669d34d8e9c893a2ed3711f363018f5e5a680abb9b17e29d9aca8f79906dd86990ca6316f2b83f2ba60c1c5a4a56a2efbd5c81b1b26be304b8cf28726ecf9988b743f85be49353099f42a05305d6ac5c09a54a50f9a1f8a83c3e96379b441148ca54e85e641278d15fef379490c70a81267dc39b1357100411b4720a1c577ba6179d1c6aab8aed1a641f8318db34e0c31d0070a2dffa979e3f4ad04e31e1c7ecb93978dc1bd55ca295659c3fa8dd7e6979cdbe42346be229ce66f3bd3a0686b93927cdbf61b9495dc8bfcb150d9bdbc93873861cb842f40911e1b773958a73f269f582f0e898f88069f449bd311879f8d2f9f88f802892b2ab50912526b09416281107b62baebcaf6d72eabc991f8b266f9539cd9c18c24253ac8869b436b3e127f4b751a8f1e5dc80de6bc24b9dc1ee4e4570eb6b4d475292941271a035f8f248e8024f16206610dcd3499972ca74b126fca781abd55fe0ff700e1e6e2e93b4310ef72a8308da6f9e2e060cf3f0e3956b8672a4b6de74e54b22a9b417e5ddcf1b971400dad2eea65737886cf8bde21a42cf3ba0ebb2932a807f470f10dfce22d5f09b25ffcf62b6be32f6ed447226dfeba34ad53fdc5271e53c64119b441f6b82101d820d3fcb7ca46fda406be2c014c511aacaf5689f91c72e2707704d9f8806dab268d409434955fcde65cedd0f2422d1c87fdcd69caf2095ffc447cf92f18e451665512be96f31b30d530449c208fdada23468a9c4d06d814a207459e6a30c5adf80fa81a90fb6465cfc9d8b832d989f20dad36565f9b684507a1a73ec01d98106bbdae3b47bcad2280978e5394898da30701321764768aab0c4e9dc68920020fb37fe5eea849199866076d35505a97bb232feaf560e4a5879a0befa530ee98b4ba82e70c980ba44124d4991a5d318275fc87799487d2d1a912a651c666c8980bc69c0d7c953b6d2d810a469e4d7debcf040fd07b7c5e6b76e2c103ba90849364ab99cc09c59f84930b856a032dc5e2a8d70d5a3d9b7ec4a63aebe44b47bf29d7e686e3da437f9b7565b854592296c896a8b9b0aa79ef169e3cc17d42137edaa566a99e175c44be797ca32e5c0382e314691875416aede237f55e12199005867195417876266c01f06970809ead01f8cefc7d77477f4d6b53c97e6fe0c6ffa2faf59ef11e4fd724986685d455ba7a9de786641ccad0eb06cf46d7818ad441e23c3a2cdc99b1a72959601559d32c47c088944e35fbcfa7de09d397392c810fea77b647f3a60388e9c66e8bb982a99596f595d6b8976cc9915d953d99767acaab41a80cbdf3473cca7b102c48f17cc3f9979f896d33a046218a022f0d130f3e929c7378714ddc0ee71545a49aa8a0280a867aea5a98ab2244764285626d45e9407abecd2a0af92919829b218e7e7f02fbf9995fc86971432678dbe92b35b47e2bdfcd03809695712f2f18546054129071d5005fb328e0bd4beda86cb5100d7eb085e89b7f516d036746811b28b58236076614004fca5328518b4a8b8d3a569851500bf7c82017f08dee8b78588fd8ee377667112feeb10300827b20934abd5c8aa7c012117df8e58c00329736565f8d7f4fa10768e819951ab48a2e869fa6c5e6d7ceb3aac8ca1652e62db72080670c050a6ff3b82629ccef433e9a04cf9f55dc534f61b1f509be91de84426b8636dcb7a07bf4889db1fde76c670143862cb89f7f910a8b91438f83ec4a72f0d475a36d37485803c9734a1f7dbc8d558d003ded64c1f27f612303b1a6fc8960f5bb0968b711e02c3778ca7b3a726b41e89bec47a0865293a7792dda9d772224fe38d6bdc3bda60e19ed14b320a399133269d2e70db0057c4482e8cae0299938bee9dd63a44999a57b808492eba6f6a14192b90789bc6610a753dabb882e25c7a697de60b18b28c6943f9c1fd3ed558f8bd6710b3a043c2bcd6ab409168086f557924073bcb69ea434049df74badcdd01cf32b6d19d4277da3bde859b62cedc8aedf021c3c0a2564ea55cbd402980f63dc1476c2bb642708f1ec04d4a99d00be87b43f775371fb0918d055154bcfe50c211013a6d8091d4347f4d9557674e47315a0c375770fdcb4c43c9a09f834fd586a42636b4e2045a74643aa9d772966890730ce97edbc2bc00508e0ce9b00c0cd79e7ed7f6f2b02029e37eeff7ce88a450e082c0ab4a93c5268d68034e0ece4796f0e0933ccdd96adc007dfc9e679a311034853f44e3c15bd85be4b16217fb6a2f75cb9cf2d7acf2e17bd455ff40e27305893d13646eebee5125180a21c8d29f4086dbbb89a3da0b32c4f96e3648e43f034c24678af53cc96775221fcf352e350d1cf5fd61403a6d76d0001af337c39ff53233f07f2edc3517215ee03befcbcaa7153eff3dc0fb83b42bb17d194c8b4ef1b1c945dfafcf666b0ed7b1cc1bbbd94b7bdff1c85b8ede861e2f24250b0ead8cf2911deefa2509dc7a0b2594900227dbe5cfc3fb083078ec0549dafcd7fbc4adaa3ca2a64336f7ed7dd476e5f724ecedc54aa77fbf1204f7286c0d909b6cb6282a04ad74063df51c27a3210c5fb508d2412d08f2f6cddfba38a22230b81e876177f236baa29c1859f560ca7e1d7c49c87d0548756efec0352016b1e6a470c9c72fc841984d39911999e2d0fa704034c6951793e33fe2b49653e342dcdf3b614405850fb1de0688a49c826054e9f0c876c2f7e1d3663b2124b6a76de8426baa97297d9bf141ac57c3bd092a0bc8c55760058a6d71c44c80d0cc7aa0150b96daeb7aa77ce00153550115dc2461180365b18ac6f3be37dba7e41d9f810755c5d01f715a9823a4e4b01eb3e05d634d0726ac3d9e27e28dd37e54f350b2831eabe095a0dee0a04e6b1f004083d5ab7a3e8a777655120e3c6c8d6ddafaccd4299db579fc42827c581e5bf599658b0462108b181f00036c7ff6498baf0fc2c15dcc4e9a7cbf9fb02e0580c170403022a777e12a0d5799c359741ce460668cddd875522c5fb9bb70140c95ff564c0fff932a8e4cae9b9c362bad7776e973566bcc5181a47117451eee1dbda71bafd120b22ce7c019a2d997b4583726ddfb6b259aeec99379e1413463081268dc64a4d2d9a81790cab59acedb2a299681624680c318df086e88c32c4ea77b7c50a0a92492f8bb5a3fcf299c6918c50931201c97750adbded1aeeff6facc4d0ca7f86ec46f0310e10e7e506ca976b61b66a73c33f7987eb6cec0f528acca6f29e4ea0b432a9207e1f92e7860ae8f4aab3396220aaa64b8df7a204571b3028eb03ce136bed40c97078ccf070ea2bb42470c840821e07ab195c9869200536d71d423483eb5a0b357a5230f93cdf3883bee0831b9fe205784d765fe00198505aa4e4cd36557b8e320c2c8cc45a393ab7087782978f4e5d346545c64854d546c103ffc4fb675b7e48b47b2c7ccbfe270508b2aaddd1556db008da1fae8012d007fdcb9b5b511bcfbd7b3cccaa0da30ef4acf59a20a40b4fab3643a3bf4cf20756fb609dd4b70606e9959caddaaff2d58622f4d56ed12451c1beda66175b22d12ab9384196bfda37debfdae8eb006b77fe1e7b154fd34550f3d152cf3d3daa0ac6e0bb3619f541efb5a3b0f549654ad53df39891f55970e93f1f1faab4984f3e6ed034aa54b3d3605089be4a60eb5eab950d6bcb94dde9815010bb00434287b57dd8d9c6f86abe26b8c43ed253a77fb9b5ea95910655c27cf0dbeef592953b24d2460bddd0aa32a8599b636903c88d9ff64b04b7e8d94e43ae8ce99fdf816848754b827a5b5b835b9b36cb60e2c6190ea4c89bb93650f102fdf961eeb7825069dca65c7262a5bb4fd4079cc0de5bf4af2e5ad738cd426bc5d9a0d9b8ce5619cd10d96a0454d121a4fac19ed7882402850c369c413a3d4c1f63ca832802527396f99850eb3a6c6f8d2881e34f6daa16e9be511106845a1fb0b7c2226b5bbecc9b89f6e3597b00eb9afc7c184d3d044efded4546022c272f289c746a15238541226ba4012841be4e25421afd200404a8c0e041bc1e0316ff87b788bb0ab8cddfaf4592e7c1807fdb0600a0787fb5e600f94f1234e53e7c1331beb277a52bf14683c054e1d7f6934a1d3d63831dff6268302a4d83ff5e65ea655032c85429c50e5663c92c1260a505bf9729b07bae4de3949f6d911954b9b225765c7c94c3ba7b2eb6fbdca35ee1f8b72f9f4c3d03ccf5b5ef9485051ce665aaf83bb09c282005bfdae6e08888dc13c8644087ca490b2279c526bccba5ce27b70acb757f55e5f27352abdf6271cbdf654c6edb3b28285de610284c67ecd78926f3666c13b26a76ffa10f186a7a06e7f1398bfdb3eff8681ccc68fb9ab5d2b86e69226689d1ea99a95ae17a1b1733103ef7fb2e52eb3010f1d2b9c4dec99ba0acdbba9faef3da9a9b5774a673104ec8ef3004e2242996bf84aee124710c56d52cf95a1c2715b69866a92e4bf64372389194d9ffe0487a4ac57ea16a2c8fee863bc8478585aa674b533649052fab8b22524e641e85f2d3a8958cc7c6591dfe99e5735d174f7b26a64813f6889e9e15d72ce661ff5dddbf55d3158de5f99abbf4073a0d49695ff26ee6ecf51a1694a14c2f8474dba99162afe981783238711323d544036c41d9117bc948fec4997b1827477c6f11d4d153b3cee373b8bd475444ecac3b16ee41bbaf7414a6bb895dbbf6801e50a08562af8edcf230c5d68068803f3398fcd7b9be29b61c38c58e758a6ddcd56e03f3b66c630b18facb9ba79c63c422cfbd9d7a4e56449fc7e48207af1145fe9126a1de97c19780cdc17befbefa47e722bc4b662e73b010065401141f70fdd6ed124ea06ef0e2f77e881a47bd79473cd9271f62ad15b7049b00938b324d4e67d1692906b8dbc1acf48427e920c13f195511b59ed227799ff066b6d0af0cd25b10eb95b0d677240ef78dd699bd4ec5f91b8fd56d695fa7933ebbddce01c09b1f6d1c7ee8f429c867877970039dac5b866efb8cdb4a0093e3dd594cc2ea72316fc1fe6cb12e1d027ee0f2390077343a7ea580769607b8123774cc1309aa85218863dbb8e27ae3ab48c5cae01b3f6721f23cc6d5fe545c1713cefdd592bbaa79ac0c5f535ccfe492f4966a7f2d40711d01e0ccdab661a383ca44d063f404fc0612674c96e90f13b4bd39926d5a9bdc4d9bce2afd76f933995227ba0916e9b599482e875a3f183bb3620ccf968d663aad691b9bccbcc43a96a0816780176451cb042b120f136fee60cef5cc9612b5d1bf04dcd63f10efeb8743abb89ee674abf1d6348ac3114fb078d1253adc1321ab2abb786d7af7b012859cffd5a1144aa29ddbee2ac6b64b3345d22226a6afb02494182c112ae2891ba964fa6dbe118e2d1481e5a6855b3127e9c4d5d6c3e8c1aeb6c6b93415d22b5a840d877ce7c8b2a3df652eefe271b50afeb19fe2d916340b67cccec4027e261854b96163c71c3bc2b9440c097556357004b5d85200e39e26e954ccfb15169a3805cfb205b7480a705d75ffcdaac5711d56ba776afa204cad1e2ce4693064dc1357ef063fecea7dbd5b66b16f145dafd56cd51d7714310e03b40f739e00fa102a6704280d0b3ddf269ce2680d0b7c41eea0fa9a53242a445a17d9b3780fbc6cba744e5eefd02e462534f3b53e8a7409283724e7bee9520c35108eb6f2b62ac18fc0e33621aee8b68fb0a0d4bf1575e6812afba5db2396f9b27b7016d487505a726972c7b3c7d48b981d72c1947110c127dd562ae628ab9198821980d7b06c7ecac75921579741ed89fd0aa5d567b1004ef40d0980c8610e7852c1e69f422814ac4ba995c5c45482fe1728a0d3dccec5a48b27060f4d13b822855e3af1d409f2c0e3894acb6bf467acffeb212be1854dd0495f7f592de8a406b040d24de8f59999db4d413f149053a77b0ca8dd694eea36dee92aaa3b993312a9b75e195e141ca5bda148932a6a6baf51d0b02ee6799a5513c76f9eea22156ff4111de7b270cae2c4c412874c05867d2351bbb0a43ce6c6388d81e3504a7c439fc874069ae9e8b1c86c812f52314a079c47a99e2d8749b7422e0af3e06f6d470f97429a3b11c3fcfa8cc15ca5cea514285fc9530682a1b0896db341556d34008c54f9dfdd8ce550efb117ce636355e700a2024c6371674e7a556bdc0a88c01a2cb1f5dd14a8d91de7e2968aa4c067f6708af54dd1258340712fd66ffef1a6bebe7cc8f6c6e2c2a638b97837ca73722e04b16d3c5620b2b315a51e59bd3bea7cf31ca392c2baddc4f98b5b5218834079f382e750a43e6f742c8db3bbbeec9396bc415e3d11ea19ebb123b04cf74d694bd06f3f71bee25f16cca65717289b65ee8cc46934c2158c51a63b7802d1f2890585401974ab8627b71b5f13ddd91445457691255237ea609bda97e309fd8fdc3cd48d62b45b1dde51d8ef0a6018f5fa2157946b917db96d217e43c33ca47837403b6a14282f46b994e8e68542088508f1f9826883b3bbbe8ab81e41ae2fa5fd9e2c77d659663124eae3f1f4969b2a7d6cd86edca02b6d5c139cd5785c5734958a42bf3bb558d40bcf3ca91af1ebe31dcef497a94ac51e9ffeadf5dfe15c10f9c707f0fc900300f20211cb8e82b76ef4039a0a6c5ff6bd93bea5f0d926a4291cbdab62ebd66c8b411b5036d101567fb6171791c7be0efb13c9621e5b1574ac39642d9e48b018fe3fb276cf4ee668f4bcec4ef9dde347a88f656859df22b0dc8b61d0a2bd80a9661456ebfcdd425f9708ea761d0d1a6fce2a8fee1f5e3190ea05d48ec629ed24ae062376f958a4e25ba6d9c2e881274dbc4489fae3a008afa7012d1231f3dea8e7b9bbb4b38d0d11ea27504d55db7521354a1f336f1e11e44cc8c1c0833ec80a54c7eba7f927df2b638fd7207a716998cfb11aea7d86d1352ee0ae334534cd79244ab4ea85a89d7c7e6ba49ddaf4703520f0da61413a2f72d665307556a7f23cd1e6e59d73df2148ea6c83331b86d067f89114110ef5d3b194156b8da7fe9b453fd99bde919fc3bc41cd242e7a6b9774ee22344f3c1a77a9eb4c65e634e390e96e994b56f25f5b69386e655a2f95d90780c5428e148c9f82cdf740364d63a9c837619068b6384210232f02b208b1c5357a75616da22e41e25cee23e7188c8baa5b846ca592e2ccb9383a11594dca668f3bb2faae163d653e24672636fcb143b2cc69c506990334fe95c08721385667d9782007148a620282d0b34a4408f6d21406e2905b6449839e6423f9181f625ee4a3947f0526cdf5a298105e13df91b92e685f8b07a47935814837091fb4fc22254e0eaf157cb04ed0e5dc1f3d184f0465bb914b48625576061780d9f5cc1afd22d648c0cbefcda862cec70a12af1c1fe488830d1759c89ca3fb35e72088c85db564634a5bfa53ba6ccdb7050106e17f533c35bcf1aba13af435a133c92a9b5141b4774839d6b114732bedc547fcebeec17cf1ae991b40d6d782bf9de4109528cac13d6f5da1a946a96c2c8e21eeddf72bb3f99ca501da20dfcde441576152370f80232651a75240c47e681d96f61e61c07f03a502a5b52eefd449b2cecc1651120dc007a291edbfdf43b65735d3a0e95128653eba885ae335c0ea831a2583f428ec40053727db8666e74946157bd3a9a7916819c256da863edd49c7e752f1ed5fc788a7d08ffe4a6434e4f3b541c3a152dd54b24ab079aa00194e5eb39566a1f8bbba0c5cc356d477d99ff3d561f5d5d090c01a6327ad297ad6903a4ede881633b7e6a4cfa67e72bec310ec3ccef9d43abb46a7beb332a2057a57b7d438dce7d73385f4c826837516b16213209d01aaef993991d097d0d78dcdcac79079f127f2c517d1d9e7b380034ddd256631b6395813dceba4c4c0807a20fae2f6d149edac4ad3b87732addc45f3a2bb2f4f242925f732aca4827f0b1ef5a48b548da9609d2724f123a1f7a0ebdf485d9c8d86833f1383a0aa6ef0dea3b126afe2746d34b8e20f2334b3102003561eda08480c13d8449ff4f8fd1517a7d8b3b2f3338d1a0b93091a3f82ba9850afe9c27a742fc3e850d4bf95bab10815e6e0ae02fea171f6c836ea7fce1e99719bad933518b9bdf215d200f665aa260d737b974d0125bf8190483c4ac31688de5c5b20b22da81a0891e568fbf1cb8043545d2035c6210894d0778e0baefec140be096acffd74fe682f0e79f0bfd76ccbef99c718ffe54d062da97075b3d4661053f06d5350c60b362b502646180ce48c9b3197f11125be88d1e13ecb782ebfd9e500098066bf5c3cf1b3b4554a4d8096e226a53182f355509f533dc60d4ec455e82e40654764af27d9a19a5ebdd58612ab04d88241f5d16315f97bc4e6a7b6c9d2b194ffa4ca885e0217c1a719172ff532c8f21dd8eb6fff9578590ecd6f7a20f0686aeeb75ca384bb9cbed3e8375db4a359ed7be34e1655c395ea4882a04ff1064506d82f33719bd7e8cec70ae6cce7d701d3c6e7b03bba09398d2db2cb4fc1bdda3f76e6dd0dbef9a8dc584332b14bbe6d4fea54e899e6b6fec4ccec1fbe8af8ca6c24fd0f3101f524a0201615c94a7cd4cb97f0779989a29ffca60822b3100398d0fecad0c59640012a58f399388f8f410224575964d60f10322134acb971ec130b22712cb714ba8851072737cf6cceb53938f7f94f9ba0f9567339faae9e2227a1cffe28aa2bab06cfad86ee65459133ac60692b6573284b7a522243726b570927555f60b8cd4f80847940d311678a91f18d68276aedbb6e2d756e7c9c7929b4dd80e95e5834ce96039013ce8ee7536d2c37358f52717928d613f12423c866381f0cdf9de1c4cf003a26f6043939ef32afb6b9e2d98643d5886b45419e12bbcce23051331972c25997f9c4e380c2e87c228cfd70a65c6c92e902f0f8338c0ceb4a6819850efe9a8f591d4a2e72995d2a78a4319e490d7674915cb727bbe4759889a54e0b21569b4b0d6d762c997bc85be0c9f688533bb89309cbba9c758382fee1bdf2a7d02aba7bc94214ac401f7730af7b88371da42479b0214bb25c98901494d28da9a058b325779755e721ca0f82b4eedc4996cefea0a561faf962ed1796ec70bcb39f59f484b7b8172c7d8e8a43983b4bb0b82b192e7d9bfffca0ffc8163587a6bb2a4e2dd8373d5ec66bf23838e6dcfa46b878840b698565250e6e5494c701d487ec2a56589cc11cb05da225841037403217a6ace05b54cc804db032333573f5a018ce91e871a3c682afcf4dbb86ff51805634faaaaadce14fe04bce15d3d6badb84707381859be36d2c950b7c6cdbee3fa48101a799549e9295930d171fe94cfb3cab6a374b6bf6fdd3085874adc1f5bd3613cbecb41bd8cf6b51657cb05fe0d60b3f32c6083c4c2daa58c36fbd193d7f58d9f1392f630fb166b249a6495c22165da2084cc7ad4d42f6d84511a6880439d4af35003100155b5eacf31b222fbd7dc6c4287075a730047060ab75b0905986296c61c3f8228ac83654bfaa7f0e51569e474d499013d537a2cba9a940f3259a55ba50aba30e6e0374c07827ab97a65528c0a2b12448977afd83ecf4a4c4bcf6ff01034be945a725d92135e8c8157ab1ba4e83accc256cd6875553a7339611e5eb198d7ab2680310b439ff8e0e30c38d3ce1616b96093ead99393806da19d3a6355f468736ac882ef90218ea05540ed4ce9b2a3132ae4da9336bc286031e8e47782cedf2d645ff675e09c7ce468df6d8e237807bd6e831de4b1c4fa01d3dc6b9ec9ebb613865b3b0c2da5633afdaa7d02d306034901955b26de448e508b2c165ae69888388c4a99f008f4b50ae80168d4b42af22c870fa811ee346c61684cf93bb2661478b88fa631d7a8cd727621b7a713054bc21581ab559bcebd85bdcc45000e37bf0c32e9b7f440b0b832b93cf9b89023dc6973f894632c3cfeb3f83ca238402ea93fc241b187a550f9c4f77c30687102e3392c432300c518b6505ce79eb2f5831bf3c32f11ab5243acc91c833e75db53c98354e878e0322785d8622f60adb206e4c45a3f477a8b4a0c718cac8c9e9c69bcec13889d505894b5ba0c32926ea5994ae014351e173b7176e59cca9b5e85c94d3153d7bd1789f53e2b975a3001af8c399a85c29f4188f7ed0560d9f1b3d6a1bd2cc19cf1c42857f8c8b05a5d95d93a2ba2c3f0ffcec0e4ca001c92ded910a76037de92db80245eefb83d665005cc34b9cc11b76f0b6245a776134ab6c83e6e52b34121d5a53b22170d9f1ca7bd5ebbd88a354b8834b233a907d730a424c3b8be4b01b7f94eda4f4e0f545181411ada892fbcfe438f764fe56588a42beefc87b3dc8abb949d420cc9b8db7af92bbbd921ec797de301b038a2498e6e05c863695cce7b8d2cf8bdf581b893366bd62c0aca1bc34b35dd6f3bac75922797a869ef66b77cd401a032f8ff6067435c9d097e3579a13a707b28d70599a854e8ea602ed054972a2af99e0d6ee325b9a83cbbeeb101a86095d691e8390af022d1020a9c60bab1a1eb06e69f1dddd0f2478a8d7c5ca7cf5c2e35c48e994d309d2f4836f83a0957e852d50474e448f51b078f87a34cffdc43c51bfd9a95c2aa8e9e445690ecab74b74d076ad9a47105c5d27aba9948bf6a08cc33357a291c7eb4bfc9082fd574154093690da74bc598b4343b343e228e10d3830023d5a390f1e0b6f762e492cba76be6dc9293e9c7e83238b0e0bf9818a2e47759260f81a916b7bfe6bce751c01e9e9158eaa0429cd5f5b1dda6f141bdbfc57d1f1ea8206b35d3a6502dc28d43f8f271eb2115163b15ada9c501f685c7ad1c7a155608131a5d4e23ea739f49ec32ad2aaab3dd9c5579acdf85df2e2dcb252531b7494385651ca62df95364b3ba2d085c8b24c390bda368177e3fe8d18eaf8108a7b205977aa4ab5e7a83b212dd33b3b2133ef2c77489906c6bbacd95cc5b37ea24d91bb2aae676b4483180957f85eaaf71653c7a8ec0b24126f19410978578d8cd05094a8b522336519f2c1d9fbebac509421296886fbf03d541e2da28787c6bb2f57a4268751c9cfd13d6d15e1b8b7941af2e18c9c58079b8206d1986b2a2f028c987f3b3cbd2c6f428b01dcb470071658b45ff804d458d2b4d264a4d4397e8f7427d3e02b0c19ead8b62e56295140ccf8043731d53dd1b5f2e05d9cb8b949522266a5d20d8fcbaa11336df9bb1e259e9f235edd7edf406fddd071a76f3f7f8a19dedeaff2bf8139cf1346250db7efb46e89867426ad42cdc322e9fe67456ad3040cdf058ea267bfe1865b1e2a3395da21c0f02c5976148ed44fb2ae1a1262d0a5a10378ce51aada075e7a3e8294784b3355847ad2fc09ad1d954e02f5908bf0b7cba6903fee1e36486399766c91be3abf33c379cce58a358cedc4e1ca0874ed09570f879d5ed21e96095c9c21ba32c0f6ee70f41e9660e5d1bcbee26fa8cd34cf20f59d9d987cd47484bf8208a662376234217a3139fa84bcbb85bf305badde501a083d186598ac2503126cb4222a6c1894190678f8409e9150575ab07607dc1ba2f82d76c45bc60f6da0a7af3a854deb53c6a16fc7bac4a9a00c97f0c34fbdca5d8f17e030c3a834e4a9c6be0f8f7d4a495623f1a6f8435713dcd242a1fee29ad23070c76102582d2d0e913f9dd63dd23bea8b89d1e1c6b06767c66a9ce4880e6cceaff18818c6688cf34d482c41d81b38bd1220e74aca3ec8c90e1efd4dfd984c7910e85406c5edae7051a5475cbe0305b41b3e0a78a73754e56150392150959d3d0bcac633a7bfcfd33286544ec95a9239787d18a6e3d9008ec9c4b57d91272db9fda74af74f722cc96f44d8df8ef6edccb4c85955f7c1c6c1abf21a8fd3b34d4d2a934d3f8df22aad337a6e7f271c1a4626901032a64a49b0edcff353f4b4a8762828586ef5345fe40f03ff1a84077be271e05f75dab719d533abcbf4de45810853edeb11e2e9446d7b7f9f37059045695a699e0f0f6a0fef58a72e70ed0b06e471f98ee3aa8d10b0152b5f3c3dc1f789ae316eb62a19a1c09d6b6725303d9e07ea2e634357a894f72fec75cf4bae5be11dcda56074daad6401e9b69afc57f4ed2e9e15dfe0f69797be339d1bcb3099160161230bcd1c77e58d1764b68aa10bf068cb4d6363b0dc02166f7565c92afdfb0424326eb364a934ad041bcad6ddedb912fc1080983ffe48e07f618c0d020fa507b1bfeb95db6cc1ff2afc82f5d31a00b895996b5ffced4dac2e00876b98f28477278f1e179f556ac277fc1d446abc49e4ea223bf64da34cbdb5b9ac1a9f5bfa7ee81ce93df1228abe1412cc5bbdb574c778d97d8f4284439b17af728c6f29b166b5c6d55dde13cb64004094912d21e1c47a3a4bb677e416af0854205d800a27f2d52d5e6e6486315b621c4ebcc94aaa31c4e7f90000331a9ef5fcc99b2717c0e46f85c31d18bf7628d571f302af8113aa3a1272207ba6179c2b5b9f1cbd655ef32eb0a75a1296341d49f61c83c0bc21300e25bec5a4c314dd6d5050606b9bc6ee5d5af9ba317b1c178f38a83192ba67b33cc62e0c6fecf6b068fa015262d275a197bc0edd350162ba3dddc9d56792f828d7938fa41ef877b7341b246b7b91df6f8d4bee9e5aafa0484651d2747fecaf9cc2abb26eb78e8beb0a80c24837b2474862bab872b4c6a6662cbfc555cc689d2b04179f0e7482a77e4b909db4f37c8cdbec0c183b5d86e44d546a02ee7e3a607bfab16bb9d4b12fb20539aec69b85e3b49263530d8957e8807b8bcc344afcba5834fadb98bfa47bee3f23a7e4d053dcc8c2ee6a853e20a70fa8292d8b08a874411dcb8faf48cbd2a4a3f0417ae66da310317dcb9e0775d9495352dd3b8df608daae1aa21767920a6acaa0a2d040efb7f4887c0e62938153a9f2adab2d7788c0c58d2509cc48d7fdb4cbb964ffb1bf1b76afd01ac165e02c3469f47ebd8c418c8403a92e518e5959a02f873e9604531bbd2c71ab64ebc4d605dbeafbf6e75880d6f1a42f01ca83094d722696afdd7a3b1eb36d62bf6e397b484483e98259b6770c733b77e4f3a715ac9f1daf339d37c228fe1f39cf5be4934990861a677abcf10b11b2d87d7c57011d84c8536f97b0ae3d834d232cc724cfc3443f50707cbaeba6c61fddf7d69271475f286100daeca0971a8e5ec6b47d566a5315076d3bf70d2373ea9c5531995764bedbb52e306e9f2ab5576e58550ea0469e998a78c803b7622b457b07cb93f7b4fd78c38ac191739998bd3f64d5126027bce500e70efa0107e335768cab91f00a8a2899cae11c96f080a9dba577d3e26799931a228629921191cade3350122dbca29d01da807bda58f2985bacf09f8893f93adbfff0622157623cf51f18f67fed87f771352737d1fd9bb0a091bacd8817fe5e5b4d64dff0325536598999c07b9541b3dccb8797440c7eefa4ac5e3112c72acad9e85cbb9bb35fd141f3f02287fa2978b38d5460307ebf7ae0593b806a5b6a30dcfe5d13fcb90ed3e9b018424a9bb72782f7b131d2ca67658533dd2bcdb98574dcb4fdf196709821d61d40ec4a31e1ce30e3c4c46602e0f6c6c3ad2fe1bd912cc25be9da7b8fcf853913e9256a77851b09548c895891507ec1db4a35bbcd77ac988cb0c11bc6e40ee726af89503d080e0bbe0410c7500393589887c85ff0b20894982aa7f99ed8f45f294bc6a5220fe829de190f9c4979b6a215392f878327d82035c28ddfe45fab84f49e7ac0253ac79b46eabbadccd2500b8ae6cba6cbe8a98450b0efc83af3b7562b148d5a46c3c135131551d8b5ec982c317451823a4e432814b1b4f804a81fb9692c492729c81f024fc83962efdfe2526540a0ee06acac03daf4ea955930d2324a071666d56a4be23367f069047a0cb40e966a1a9408a68444da13ae93e385bbc9e189ac1e95086b8cb1e0ba88e21804514ca3f7cac888339df044e31c17fc1c5ab4b97de80d57d63e698448b2b7947b4b29a59449cab7096c09b6086eb97d3e30b7dcba3232c8d2db8170e311f08f0888a22fc1e4d7af9f9aeb2076a25fedbd2963d3cd1c8556351b4639be3d091043dfbe82121198b20b6fff7521fd57cb3e3e3e39cd71d23b2e95612d956153c62613c6819129633830c6f8c688f1c02be1dd82f4df155ad5df6a44e955fb95f0cab7f38010421b1bd9aa18c76e5b5572ec78eb341b25322e81e426cfb4209909d971c9efeb524c4ae6e44a5ad571dfb9b994cc16a45f26c6775ae7dd80ca90a733e3ed28b4abd02ad3b72759a1555127aeda654e31da7b4e478e0f60be9dc723fa2187ef201813131383b5a765198f6933e5683a38d3b52c8ca7e4268fd15299c3cfbca4a5327f8f75a4b22b4c1eb2ed706f6125f4c430617a60181d39100a65e99848e643b69de6da65a264e8d2af434c48759b2761ccb8e6faa4439698661f8ee558b31e8ee550937087e557a3d1d2accf6897262577efe54e0d564b49e84f892cf280302922744bcd8dfb9ca819b1c0ce10a053cf5c317380d23a396d75aa51c43c6ccc29cdc53791d0a69419a5b9f886ee9c51660e7da333a3f4cd8b6d4491d2aa59654e699d2934a90c91bbf923f32577720baad1e74fab66783f1f1ddeef8161a4db973a75fa488f2e975842ca77d8a93c1c3804e5e8e1b34aff723891a13c1f3e547837ed71ebaccdd9cb35c44647a93c746c8d0c7f9a1392ad7a55f8c8e05f153e5cde7afa1d7e193372078d52d099acae770a6e469cbc78c364f5623b9778d39e3202f3248ee016924849e07ae647aeb7708f5cc7b616de86b3d15b5dbf39b0062ec041113c3459c1c76795136f1a3b4a420c28a2004a62c9f5442c4062083093e71a62a3218c11898a275624c9f4e9efaf4442fdf29b7bc8fe1d348242cd0d49a8854a865b36992879faa551b8230bf5ead5651678c59a19235387904a73f04aab8a821e0e1c01491b690eee905182c94f0fd232056e695507ab7c9720e10ee873a3dd25c1180f847068d23091a97750081a3d38c2d3a2e442b7da92a9055d874251e76ef04a37148243145eb93564ff2bbf240835c200238e15b071c6aa1d7a893a26dcc0050e33c86209273f58b543a376b8a57d234342a3530e393a9c1275a051ffd40a61d0f3f1ee660188a177d0081ab5cefb015097a356c151f4dd4e22900f59bec30fbd40372098f6e91ff8d3510039f926f2e10af4014208dbc8435ba011d4a096e6da4b2ac81d34825ba051abb4bcf932492ae85a20eadc4df60df486f9e814067236542f8c50c28b2eba80a18855977910042fae90e20d1f1c118355b714df5368f0ed40869070a41d85ee6e180b10551f630f427ce4818d8ff119f9f8f83cc132f8aee63b1b28460480e283157cc1c3146e6621da21cbb7c3764ac6cd48a6c30d47195dfa08a68c32da3e41ab524466fb64329dc9cfed5d35b65a0b2dacb5d63a67bdd556af1ea755dd6e757e7d247553f59bdbf34b7b18dd88a488a48a481f9f9f3e37249f86ac99b1c618638c31c61863ac33c638e79cf2c978433d5297edb323c147f954184fa5dafce9e55e54ab689c4c3ed5cee44f4db483145f5dfae72da78a347ef221f45964043f1f3e842fb74ebee9714351d84533ce2939a01ecac18be5a2c314938c50db210a8c115249e9ec71048f3a46716411498102a21da6989a4ef9885400e63b8aef28bc7c076129b7a86144a4cf0b1fbf23c14b8fdb7b9c7c3810498cbe5958420d9736ee85fd392aea94b89266ad1bfbed964378b37e92061f877d92e0afcfd73166d9b6d3fd98963d4ebac903f4e3b5610f47e2adcbeed6b130e98b9de18723e33fcc3e4e3a56f22d9f15814b27eccba1e9daad454e8f1c1e38e7e113720a6c8b4aa78c3c727afcd001085c450768442d72984288272fb051060f44146802c7153100910328b2107a928574d0a09840b0849a8840b078308160f9eb50df3ad8f0fdedb65d879f2c4478088bb258ea5851ee50a81ab7d91942832db8dc80ca900c76d028002282881a8c18a2018af4c100fd440c12e5447367881817e5ddb5286bcf69d5ebc10de976a286ef46c1b76354cde9063284040bc7b74b1d7cbedda21c75f2f2b20bcae872b96f0b6ba172bc2e3cb873ceba7a7e91f48f2c9da68b0c5f3a94d6bef7707082285c4051b4040abce020a70a183420f2790306520835d942880930547489e2c412259230b261064746f8784005473ca4d1061050ca20c38c2a4c4c212a32438c26bca0a009146da8e182a21760f0060f50ce78011235a4814343279e1a3cf8900c584ef004061d60e181248800c20c9868830b1654b152d0022f60e8e1091ce880890d8851c30d6670710326928032048c263b08aac2091d74b0d10206135fd890210b355ec0a4491421342152a34b124058e248ca13a026da88220728b016055c74e0461443c451c61313942dcef8e282a12bcaa0d2c50d5c7ce1a5091f6440c5055918470c514508568091056b011c4d0c0114c30fc248830b0d5d28f1040737c050e21d3131f4831b4560f03044126f085598f889a28a268af8e961129d72d5a13e73a49aec23a49c734e09dbce296384dd65c4187b8bed3876ecd8b1638cdd4ee439b7f7628c2f664a8ecfa53f39ada9f5d32929754937acd788f2348223931839c9047a996402b5012384d121125883cab27196f984e3663f0ea19fd5a16e73bc817e236a08196228245aaeb928b1fc4edaa9f2a975a922f0edcf4f15812f5d00bffdc382c4975a00fed9b46c69654e4a299df9a97d3af4248fb83c1f1d747973c9ad92973f6f32becb5a1e0ee6046b596b3b01d04862ac9ebf6e32bf53dfb495821cbd81e8a3b6820627a318e18cdba9a839181dbe2d316d1c7d0f7d3b2409cd2077d7b4e1e958efe627ea548fae6939be9b3fa5efe6cf0ebebb79e8ddcdc7db8d4d60aee6cf19b923fd7c3be98947127a3e26e98b6f5216dffe9ef5d03b5215df03c3c8e64af6e14039b10af4ca6e2db870329a531ca0812e38e8018734be1c0143076270e50d2e8c88e38a35f27b8e7acfdf7b6edff3f7801bbefc23bae1e777fc23b261cbfbbccd0e10082184163072c4c891cb83dc3d321e9ed02ae8468eb40ef459f9e4f0681db8824e42ab6a6cba1f281d5ce294fb6cba06aa9a954586a80721965d56b516922ca944b2a42d454428db6b12c19fe7b42a00fe9c47ab62fc798f56b93fd5c99f0319d22acd9f9380a9bfa759105e57967b1bbfbfb47e19cc6a102807208ee4411be67900bed341362702f8b57e69d545d08236b75ad0001c6b410470d7826c3c0057d308e002b08937b433c8c53ef64563abd57f181a0f87620f870b02685ee83fec8469a72d72d74e9eda60311be4d2570ea691234673fea511e3c17afce801316c0809453d77800c0d0076d9c2e3a5924824120a297021494a2291489c0e6e5a128944b2c0095b2ccb22919c44cae191b369b04bdf50af188f69fb82c9c015941cd1785135a889a990c48b65656ee3250c72b95806fa38c9dc0658911c97bfeb9a2e372b4b7eeecf25c633ebd63179bba11ece7b733a6d4adfa37452da3d6166846c95bcbac8d123cc97968b7a561631467caf47cdcaa26178b3b939f8fc7b8b413831082d4b27bc306a610be3b9d72dc6133d6ad61619fad5228e39c6186b0abb2c2b25a57262bf1363ed5dedc20263c74c98960e8c076f36dc968addcdd22247edca02cb54540df6a85d5832fc47544396dbf1eba6a3b90ed26fd39c0ef9ca4a369f6a8d9194f9f48c94cd79a9f5e9315ad55a6bc2250c7bb6309e58a555fd9aeea334c60e3f9e9244ad095fc7374563a51473e9554b61976563a53e7d564c7dfa4b1a1373ef858ea277cb7be3290d9e7a63553dd5d48472ce4a539765238473c2e93df1279c52d6ba7521c8200068b8b2e4e8dda95516b7ca63383d1f2df32f00dfde99fe390100f0cf5fd7ed831f0e904cd7d975462d4565acb5ce187b5af854916b718dda8bde516a3df1299dd4efbca0c3bfb022340fb77befad987c380fe28e31d61a6badf1c21b2434a5bd511f7397c30325e4e4a3d7c4076f8fd8e5ba2273b2e8a5b491b08cdc513801f46d35f09e968221478c273e06e4d74f7b1fa119d7154df4444d1cb5153080f92ec10850625b060035d730c20d8c4769adb4d2f8da78f2cdb7bdf148356fdd6afe6ea257adcbf97803bbbbbd1bc6e0bef7f8b4d57b4f47f6835d1e7e156efc9c9b95de556879d8afb32222185c718348bf00832aff886020e5bb0734bda8e65aa8e81f9190d023e01f511530cfb58aceaa6325e04d4438b29b8ee6e196c87573baa16a9ab3990d79fa12f81d44c1d5d65bee6bd5754d117a1f7ffd4a26984bed3d1c4c623c3d7d5d780ce39612e3adc33024d6a5f5ebda2cf4f9eefa34c107b67597c758f4d22febf1b2975b1b51952d2fdd1255f1f2d23186f9a55dc734223efe727bdd4a2c887599929710ec77eb1aeb2e5762b1d659bf1a92243efeda3ce0e32fbf36162ec7896eedc3b1ac43b77406216787dcd9cfde55144de1a50a11dc2519fa2555c9d0f185555821030f2c6d9041c5109629193a8ef2437e4556868aac14f1afc80a957f6eff1559e9e1e9bf222b3e6f2770610eb9ff113191254600c026f95d89e2e83bace40638ec3f2c54cc9003141c8e88ffb0105dff88708812dded53498ff1efd4a85fa971cfc44f0f267c8e50a75e378f376d0425537e6570a3892e3264f103c586a01b140c9d71c30c466489239bc0d6a072a415afa95aa9ff681d11a2003172021352bcf4277fbc945f5e563a5d4acf893ad207a195f41a39247b2544fe9cb1213fec88f44148fa20b47ad891dec2050643abf69d8e3ad1e511f7ba3cdde9e99c734eda2539457fc10bb27ce72fb8f2ed36ad823cf861216281cf2ac68a1cf345b6fc6117b03cc68becf6d2de2a9eb29fdce52a847aa4493ec9296a4156ca3f01b94f2c161c08d5208c1a5eac00a7082c26d801cc0e4270638502141dca90d2c60db414110235547083910d9e008263d5328efbb28d22d3fc238ac18cfa4496c9224b46fd238a6109fa934fff8862f8e1e909b2cc3fa2187e725e30459e2189ee94d2a78cb2b91863cb29d3e26e6dda6a5db83559e975716bf1ab4667dfd62ebed8cc3a2699c258a5be6851d8981619badc6c381c32e91fd112460fbdb3914b14516a69357d63e57b362f21e53b54187baf565518f3d0a716b9b38f4fbdd9ac8214b4cd798bb53976091880bad9d87a5c89188fcd893a960a98ef767c42d96cef57574c89376f7bb0d46edf661d0850398a37efeba5d9b8ccc2c2d77efe23a29285ad6b70af89875087e740b7399ebef8ae46a5040c1f63f0312ab1e5a30b5cf0918a0fa7aa3d22ec2d60e70cbd992730893014f0fdb6c090c12b26f1e4a35b6d04051169e4f0c2184ec8e800280b386c80a58b20564dc57711397ce72072c7715187d21065053da747d4e915f42151e76931740690cf0aba05a20ef5f1f1f189b2828e42ab2c4a1a2131f4d1a545e30759a5100928dc47fb020d602006125dec408a9cef2188ca78c2c5d0115b56ed5cb715e8441a5afebbbb9be3628272c73d4cd2aaee79797205e51be132c14b8f6becf8689d3c2e508b18625cb1e23b1d536690c1941a18e1c411341c518316047d9f7c32a7c3e68df11d8fefee87942e4f444450114d8a28e3dbb9a02182de78986db8a7a3872ddfdbe4f6de76e2d21c746c027345328a3733c8dd2564d45d4246cc2851873a940efda2725569559c55cc27e6120fd5f8eee63b1b25de40a3874efa82b406090dd218bfd3efbd57ebd6820babae94b50965fa2081b9a29bc542b9bf231991b4b4ea39c9e8f9b87f7fb27f47327ae8242e5127491058b81cf500871ee060059de425ea2040064f481107166c407962059d6444da723a3ae33e1b481d5a2dcb8c91bbda90fad3b28ded3625908f523993e00faadb49bec54e393d9cabcf07f48e39b8cf26c3912f173804973714bba6010e618e22bf9e13562f8fd2b015461421c03c375e96b7e575c9f1ddf37284ade80d484d97ee9f9b8b11234700e42972872fa00cff79c3e7d8853cc7cee42d6b017047b4a90fc2369bbe696f1dcf08e6d7c799286102a2217eb0e40087291c00c50f0e617c41c50e6d60da0e18cf69efd1eedced6b8cfb6ccc389a31aea6dbcb5aa155dd334a15991e4415554ff1d3ef75592b51361b91fe412623a68d8b37d37bc4d9e38d4493652fcb5acb8c28f6b28270035a9665954c5ac658b2f58ef1eb575ed85e185f5b70c1f69222655e17bdb0bd30beb8c8c1822d70351ddb8b8c145ad5809f7eeb755d570997a782c8cf3c859dc9e34fa1b9f903a9a48c98fcf29cbf3f641536149a93b92277cfc8c81193067f347845057985a8a3830c26a0c0018c2174e0c56aba08a2ce1029e0b881106854d96186d57414a6ab403a62f2bcb5909a6265f287c12bdad86268550a8af1135a65fdfaf5828b143228be86d850a1b9e9d7e5d81af9c2570acd4d8c3d46cb61e0783843dfc09fe6e60f1715f679fd6e2cccbf0e5397b525696e3a0aadba7cda920ed9c811ac02b10292e4a5ad051928b4185a91dca4657f671c4591d225276926bf7106518490424232849881a76479ca5ecd593aaf0c2008944394d6990ea7b40a89e9900aac321d0e4db79785c2f414a6ab1045cb4f4f625996756d2434374dda8d29c30619fedc085f6f439aab80f4ec10ab403c52f2bcb580a558951c62474c4eda5a68401557865626df893b6dd2485ed2b2cb17a5e53b3d6448abaccbaeb2f6561dfce1f256cfa191007a705f06f2bbb2c6d00fe0df152f465f5313a7050050466239dc6c9adb9058378992b71c52f977eb6c97c429857047578287fee08e8e042c307968bd75e8d5f26b4192e5128e80dd720a47c801556690d2aaaeabb410f59ed23a7045bd7da0de515a055f05530039ea990669783ba8631aace1e1503769100872d4e1517654f6bbb5146f1f3a8a960cab6985a803a9bc1bead696885c9871b6ae7d9375d56aadad16b69e22594f65d65398bdf5d6aa5d9729d5ab39add7e6c0395e7bab7c32588e1cd50bc482340c5b9efb47f444cb5f196c6db5aea5a57086599655af93ac161f6242de1b5f6b49ebbfa4eb248fd1e09f5a25b3754c5ec6a167188f0c2962421e0deec433c6afc424edfaad96bf68a1b516429b48b25c463b9d885c12e4d9e9180d7e09438ca742376175b3aec8d0efb5317e82d89ec6c8d6abe31ef8244752376e06d315641a5ca591c5782a170ffd4e39a16da9651d13222a95145248298404c8de5ed8b5a42c6ac9212604023ae0f2b8f7ef71953403109e419ab063528695dcf292a9442259b7844db0fcf20bc3304672ab09799ae546accdd7e1933408d45ccfe3284983bf42ab303f8a4a9e0fcba977280a530077d0290f697838473a3c759a048a88a76eb72ec31f9e1ec1191ece054686cf077c8a6558095f2b5bbe6b2a867286b85a75196d8c3262515a597eecd0a6b4d65a6b8d14153b3a905601e937c2833b66bc7b667c7c627c7c5d7cf4204f6748bc7923a03cfaeaa92c8fde3de0a3cec71d1f0d50ea48af42bc79235c8fdecf07c9b71f40a0c8d1bb1fbfb301191275e09478137560d1ccd6a1b2ccd6e553918dd93a9b4d5b9751eedc77cfcbf3d2f5989a4bf9ac4f8d87a401c0af96a37fe24d479d9e126f3a142ae79f29d6e60c8b60112c82453d0516c593cf9e127502e028772ea7eb293da64cf908146fda69bcb3187b348a3a01d8fa687bf12647a36cf2a8c52fde8e764b8b60fcb4bf0e85f29f9fd4f65ea462f470bae46814ddc62d2d6a69ae1d85a3b6f3e3f65f5c2daa0635af1c1e3918cae16358119a476d18eb2f0f07623cfde5e1b4df98716e39354ec7f48e9bd66a405996b94c0482272dc600ee688fd1a2968713c6e3dafbe8f2bedcb475a8521fe53e92da15bf78381d8db4c85d7bf9f6f6d2aa2fcf07fc5374d4f3116730c5418aef640ddf0eadd759eb9cf7b22ca594526a6564aa5629b37ba7937cfacc4894562a294de12aebadc1524a69bb38c6b767d1a8abdf45a32eaef1edf307902a3194124229258450424825508e360010b29b33fa74b959efb9493a2594d267c6904f7a7792b24f524a3ae7b39171b0a008eb31ba359dd2b6cd598f16e458803ebd3525f0dbad9d6eed0fead404ede796adfb576badd75a2bfd9dd8f95a6bad77d6042476da39e7dc3245b5aafbf1834edb99dae66884b26559d65a1ff1dfec172c6b6dd441653e643de4ce31aaa655f6daa865eda586142bf79d20bdad40b132e5fda93febed70eb2e7f458a94a0ebbffcc2de341694c0af9656639cd12792c8e3bbf7e5a753d7ac457dd789f091e41dcd479277a48f1e9f8a7accdef5c7ecd1eb8b5b67593e2d1e1e3d6f99888ec710feb9f37c449fae02079e0fe9d3e4598f56a54c5b11ee4d6eda74348779c9a7ffc07c7a49b3cd618e59fb3a1170b4fd2c0bf033968f6df96eb2b9e89df496dd1349bbecdaa594dacc18b9e79cbddd17e18b595b1aa17cc96bab32fe9bfd027c5167a76fa6cfcc87ac87dc61d82aebd5a7c7ba047e77867161e547ca298afeaa92df77358f688aa1efe4e7b4672df5427e184f0e29f9d45c5f2fc85dce237a820af5ee79d4b4fee7359b8e229befcd9bf31a16ded02fe9ef8170bc646189fde94ae8f747874f8b3ce0e7d6f3c28479b9d530ef74aa9d729c3004bbd7e5411a4346ee727eda7873adaa388461c50b3e1e1a4f02ca9dcf7c596915dd5244a6678949ed92d88a3415b720fd51e70046d37b0069d53b6106303f21151a74f8eec7cf4944c3cfecde969f5c22a49386283f29dd5245faa90be9a758099486286fc273ada95f9b6d0efa7baeb914749882db9c734ecfa6e447248596a73eab57db29a1ef63c1211b633c52e8bb077c7b46a1ea934d642973c4bec0c89da40f55efa5f6d1e03e9b0e1e7df4dbd7e9145eeea455623a99bfaec65afe32d6d12a7975f28b40afde5a97f331e7c790232824118113201fa65419cad2a555ed24895bb12297f7d66d4f1dbb4e17cbb9ba10ac278609b3a3a3de7ebdb12225787af92d72d12ddfd64639f3c9e222b09d426eeb6a684c94dcd97cd4b1713d0518f9600f7caac3da7aa00e053c9c08634ba71a8f1c1e6c381dad3ab25a70db07046ec311fa36145fde7aff0bc09bc9a277b44aefa40feb52ea70840e42440721b8438423b20d1c813a67dbb17e22540dbe1ded528b6f476f5d7d6f87f5f77674edd2a6b9b8e94815e5de58f0af3e7b5e0be9b667a10786791696d0b7aec47ecf03de6ef0e14caf5a4780c98300f54a501c8638884d73abfc889ea0d277d6ad6342bb935b8ead0357b4cb9331de89f1508c0426df0dbde1c34721a510d2a2ef48df5810f8da0757fb573ac0b78eb5be7a37473800dc51b54b8cdc3d2dffb86879462a5cf14d240518088d40550ee4dadb21d72de0dbadfd2e01078023ec783bda5f17df3001df16de74f9bb0428e0db3b1d9f8087d3571859852e01df28a4a0854b84181bf7d9dc87a175b3d07a69dd1712eb5609d62d7f34c318beac2ccbb26a31cbab66f9d5aa0563b5f6de0c67d82272b5aa657eadd60f311eb751235fda184fbde28889f755077fb9d55241faefbbf53ab50e9f5a0b33e16e9607cbfe11e190e5add68f5d996b49f54a0d647cccfe5da9818bcfde6e5c73d4fb4b7ee59aa9b556ce708633e9bae5113bfc88edf5eb31d86afdd65a7aadf57bb2f5f697b4cea143ec17aeb56638c324b79c74cd89b7f770ae8de42492db5691787a6098eeb2e2e5bb1df0dd9ae10cc367e5a46290e515832c5dcae7d7a76126a584504208a5ec4661cd510fc7895c1d6e18854189513ae965d93aa594d3319ef824c6cd9d6aad6e411372be3b09e597f35507ae3a8394ca2ba565eb94d775af6b4248e9059d560a9f464980ac0bc1d61981a3b5d6c83ef9a285a151f1bd94ecf8deeb64cad629637c31cae732f6107e3aaab9383d7aa76653d949ecd8b2b5e9bc5cfae5d2259d774e29dfc729b50b4b4d737d7a9863a7654408e1c32988f7a307c4f874aab1d1f1439aa3d1010d1d12ac1ba2e48c42b973dc3f3b24decc7cc95d5e1cd237d187cc906573f13d21e2d0ce90232824c97163684b172f470f4c4eab22153c72a48d683c9d28c4bb89bec61afffae8ca7735353bf1267a8c31ca97ccd5e8b0166565b421faf54ec747bff915e9c4212327a8a004e8a3bf28f41d7e2c5bbe7b5cb04c8971ca1ed1231a1f1f981ed6724b42dfc4215fb2f42ee7e3ebf2afcbb19a169d4713c9bd05558f75f3f708245b9a711f0f0aa9bcb4a4eda102dd6c4f4a29a5b3c785aee6ed906da739e9cf2d0d4873d2af36f2d72dc996c2904c890c91e001a1b4ca87d6e995ce5b495fc147fbd11c8f1f4fe429b71f16e38e0a65ea9da44be4db8a495fdeffa03a7025bd311e2ab1a44a20d53aeab639d297ec54badc13a0cbb89497f192dfc68d0921797bdf27e31b7ad3d6c937f92d69321e7343d649a17b5d62bc4b72fa923f4fe1b475b6fac48a4097718911897199ad2b798c29c686dcbda16ca7a4c107d2aa92e37ab1e67f35ff18ef6c974dfe5ec91be329d56cdaded3d97937d533ae551e7af6fb3070e54fde3938799267cf0f9782903ec6a4a43fc6abccd62579192f69dda9b4c9e64aa6aee4cf653424a52dc9e9b35bef678c56f29d580a42f2b619e55cced71e5f3dd390b467c7b4ae1dcb9ec5dc90ab47af5eaf367276a80357d54b5b1192671f72e3635c0419727524ed31deb59f3cd6ea36c6bf9a4cd524311e5349f397f15b922969257f254d041b72c94b9b6d2ecaec1193d996b51491ec3137e63d1c1919ad2b39e626ad2bf9c92116a4e431be134f5a8c96226272929bb6d7dce9b39d9835d2bb340f585b92d39ffe7506bd922036c34512341d3b92cce7f42c8b24cf5816e6497e6d7c1abb2f78691eb7cefa6442e51f160486797badeb3dd2da96e4f81ee91f40623d7324d6e395573af56bddfab55b8f25dd14732ac9c8ecc49d96d1ba93d619f9e83126ad2bc1472f69ddcec7ccdfcde29d7eaf77d3afcf686d0b4e5e1c615633dee4a7ae9e3059cd6c6feba25f1b260ed80979df537f7ad45e0c22fdf28b2feb499850f968bdc7f24e04bf24c763de451bb71ecb3b3ae336ced0ad07db826498f1272e3c61e23434343496bfa780ae044f7dc61f6604e53b3d4333333333333333333333333383dade53c0cc96e30df46c4586de19793a434343434343434383a2a1a1a1a1a1a1a1416d4f361a7761667bf2de4d9c99999999999999a1d922dd2e7f8fa1bfcbf1db97a4fe92c864004064cb6198efac5fd4841a264c98203cf5c688585b678366bcb120179ed12a891491975f45942a0fdd6a79584510591e2ed940c7e43d509f12c93eb68f8f8f0fdd5245a847a7252c815fb724f5e9b624fedc6407a14c6f4757fabdf9ea5283d63b26541ebaec89de89e091646eb79e17e683b277da2601701de5f77ae04b6dc3fe9e8e0e6e101b91f64fdbd6433d3a1e4010b97d6a1db665de188f1118e0aae42523a7adc9c95b60b23af9a558901e18e6a5e529927b7352488a447292946e21e989de65be247ed0084efede1a396d4d98f8ac9ab4e042182aced80110de184298d5c99f30599db627315ecab69ee8d231754c6342e553d6a35f9ba7ec5684fbea35e8e4319a0bd067280ad08f1313bcb06af2c2acf2f6936375da6438f913179e30f152a954bad34f5c3c7101870a1b1861c50ebe1862cbaae44c8264600221b4a087235e88c1ea743a9d92905b96877edab215b91d7a8e3a32d0ac9eb42003cdea890ba752a9542a954aa59852a9542a954a0e438f55697b42822cacec10451a39f881ca2ac64dfec4852721f05205126dfc8045113f5895dc85d3f624bb13274e7e7aac4efec3ad4eeee407b53af98f5d9ddc891318ecaa09098c8f0f6ad5a4c2e1e3b33ab91318b855931887cfeae430f4589db627258f99218d2bb8f450c50daeacba43e5beb13b58012305693c31860cab864ca438e9c2c91059e0a881d12aeb1817c017f2d0cf7718135101e6a36468420d2412359048f8cc104488cfcfe338e9e555e82489493679731249abd9ba3089e45b90b4ea597b2f6bcea49cfd5e882d8c6b2e6f24cdc606a49cbd66c7624396bf8d4940880d55bc9bf7efddd8bf577665b79966574c0c86e10bcb6e596c31bfd584651963128944220959b6d22b6a8052447da250f53d6ae9cbef552d85af656b7d58c5524468cdf3d4dcb48e6db57ae25b9696ca18bef4b2ac676edd5e24ebd5bab0e4f70f8b2d591e35eb75659eb996659965a985af5b1743f967598ee995b2af5a7b5def2cbffc69290c5fea298bda57adbdac7dd7b5515be9bcb5babdb0075b9665617e69975f0dda2b0be6a96ed5cda9c41193960b798f31c62c648e39e61673ab61af9ab545e9492c300d7e76dda6b9f7186738c3f0bd96c516628c31aae6c2f0f20b0b8277f8f213c31bc622db08c9f1d76f09631a7c8c6ded8a15c9f1f7aaf659d0b220b417c699f61e03f1f3f7df951fe0b83617c3ec3dd3de93302139b02239de6eb174996430cbb22c6b66e65e39ae1a6c7fbedb912388eb00949df1e75987e6c1cef232c734204076ae776f48865a0cffd2fe5b6b7c724e540d0ac3b68afd783810e3f9f170a897d1349fae5febe2edbab47bb71ecd51af0fc62c2887e7d876e20ded211a097d431da5e5a95f5ee421200db3ed063f9e8ff7a0147dcdb2ecdeeb413357b3b6b0dacb70861b6641b1b8148a0d7f33aedac9ad46f219cd49125966a76fc5e2614133bed3982d01f9925f0bcf687075d282661ce5349a13187c85da7e7c35b30d89373493d186942a69db698e02b981957700c23f8c87246373789470d52e2c5080fe96fe61d921068a930f9a71881d7df588fdc3b2430d6077bf99751ff8bb0d698eee0031b9a974ed3d99dc72d3c98431ceb28b3196b117c653afc57ead998b51da5bd1686f45ea9ed1caa4759854adf61ae6ebde1e240ccc77ef8cc725f7d6e52385a91862c307ada2dcedb828c6f33e6a41d85fc578e047edba92bb1d286f473d1f77c237631674e3ea6e167a67ed7c3956d72d5a6801b9d8701355838267e8d051f3917b92479d9c78d31eb72e898e256c381dcd1999544e3a27465d6a3c1177e46c9ac39aa57028deb467da0a6d83b20af42adba0d0e50514906b87501e37211409a1b476c127a010bc13e83b7846cef9944dd8748c615aa9a454d61868c546470a88a1a738c3f07b3e30efe2d531126fe808d9abb5d64b66d865adb5d6a5c127b9a5f158bf3421cf48d459e11d1dbd236bad666d61352665589c3d7e5cd872899900a9a0723ef24b8ccc80dc01a06da8948cd784492c9daa1908000000c314002020100c084422a148342819c6e60314000d8da6486a401909032588611832c8184300010410002200323333b30e0c5666e570c2dfa48ac63ebab7a4ef10384b1181a5cc5dac50dc36e9a8b4c12c1e924a1756f5176266ce496c82e5889725edb7b9c7700aef442bd2d59b163a940808f197b68e6c113dbae8bb1466615d4a90feb2122a263198c5a99471e948af3082862bd08186ca8e95380d90b02f69d6e1233ec95fd05c483628ef46c4c94ec297f49dcd5925459d82852aaa5a56e55a516e616426c8ecc03d938b3453b08fedcc20c2aca27a332189b7bd9c6cea04c60c389e15db93298ddb5256f644a030dcac40bd27a3ca0791f96a8461a669ef032d7ba3c482b7523a9770b2fd1d2e4ca9a161cbd65f0ca58885186d80aaf5f248c714ffec287cdf8c98dc1ec9daf79274aff6ecdb5bc7dd56643fe45306a8ad6a7a140980712cad291f049d4f28d093ff96843df513fb3eb85c9105991a75bb1b79203004781ae3106ff228d13a3637aee8e843fb6800e7408cec9dd2e6e571f3cbb321a8e7159af20c74b3f1a418670fe42e656c41c6842bf94dec4e6531e1a45c82fde8110c4ce024f4a4f1afae2fa60ea15c945ab9cf5a6a5e7cdc9bce85bb4084f681b2780fcd7cec6c98701d13f3a694d3a7ab3826744045176ddaaf02e6cb78d317db0473672840e17e8255929f523d5fa1587aa8c9f62ccfe114a7441df411154f6f4b11053bb3f2f235ae5a0701dc79e734f6c0ea0b82e4432ec71f9df26793298baecb7fa30071cc8e70107c0872ca0cfd3d1dd2ffc16901f1c995be9b53eaa4f945ba4c5afc4a9c9c58ecf3a11bc0f10c9a33009942682fa569494e0f1fbb09c9efee46c4cd4a3dec54d68c7b36c50563f9387fb01c5e8e42c80b2188830dc8441f46d6213f7cafa91404542dfe73cc51731cacc04a85d3c0273edaa477885b2ac5c85662bac33806e8181545d54b5cc3fd6916e374b3057889d5e5008037e51cec8c0c84941f200d3167674d5b59b3de58d952f5e0356235a60ff40e7cbc72d5655d8c9380730825b881365f9734274446a11526fa90ec54cb5ac1f518dc2d33d1669ef512a9b23188e5202fe88e8e633845157e240a69ee3477f369247444db129004cd73a1112dc8a82fe284b983cb1688de19d4c8790c46b4f1a9889420e3e0e19a8101f991dbbec14c76f84f65b8d8fc82ea54d1511167346a4b8960deca5182f5a88530e0a5629bbfc6ba9238f6bf87f023e6c2373d21a169e1f0e8703165504874abbcf74f9d49114681e6180b03208e6325eb1ab54efa5bec99eaa7e18f4491c05c5df942606e75479913d0b3d0981e9dc277d4eef7b7579a583b90fb01270b41a97c25332171aa163038ac4c2f591b73fbe768d4065e231fbf2d32f38213cd40d1100891fd90bc2cf3fc16d46e77f84fa25a78753ede3ed647eef3da6898a7a19cdc0e5c186ac097e5da552838be6f0e736b9955363807a7a102873b3ee7758bdab8b762fee71b516b8715745ff37b55de59f78a66fb23a871dd760feab6230371202f2e0f091a4ac0cb15118a18db4f7f718467d4636fc6af5c8610da42d820f1e94b000369ee2306429e249562d5b048f252584e438a1e13a56b33b7a4229fedf7f93b6293f1a0908fca92236a6589f541500940beb79dcdb23af7490d4663ae31c791ad460a19298659ae3181df76bef060858c1aa7abb8a1161588eeecd28af88224a200c2dcb511fc3eeba4a775f2e33c807d8d23b7f3b34105b33c7bc1347aa231e941b49caaedaadd64e72b53a2420d14fe6c2c8615efca3b5e119eaa115b00bb03eace7a49e69f3b7c2db6350e0e49889316b77444895bcc4ac81a10b52901916bcb793c5abb63a55ddef6ef621ecf9455909b2377f6d99c5fa3cbfc259deee37e13685cd3f7cf259d3406a8e6ae4e9580e548a80dc783fdd7af2bee7d34aa132a0907ba22ea48af8811ea6ba684bab71491400d53011abff47336516f40dc851500fb8e34fa3ab68c7b353936584457deba4d2fb49644e9b88fb7ee7de35fc2b0ab91e2ad34901ff3739afefd721b6eb504bcceab5c607e37793f80fdfe892244eb68424dedf1b68b03454966e534c6f5e9f5b0ae8466c4f3e6bb7d407354385ef51097576e9fceab5b7abbc7feec141405be7af8150a70c5452fc17eae50aa3f3b518dc4d26dc168c30fb7e1023566197bdacb334ef5ea958bedf0183149f4bfbe81eb98b6279cb30d303fa8dbe2e9442e7cd3209fd3640e9a3712d1d3399a723e1d66e41580e91ea57529fa4e9ce6a9845a0bd94d26b79129b2fe1d857d93047a7a6666ae26a4d5725dcdeecdf801f052c30184bfee8bb7c8ff1f67504958407475f43b1bd066d58ea341877c9bb44c0aae46e2a966bfc3518cac4cb54663cd5290ddd21542152e35f1bc8dbe0c642aa3c042ec15f0ba3b8d0e52e982f1b54a8fcb6c524d17bee0304e8dea0e4321f6f845986acb50d253bddbb2f88525fb7111333a05152cdad4b2f5f57f3fcf57268eb627ed0fa685ff822a1497885b43562e61fd96f4a6256e193053d82913c1fb1e0f23f19d43c1628ec8e3376c2f81f98162e6d1f5c14ebccfff9c7ec9f492eae2fd56712307a3d4976c51487fc0fd116fcf27cbc01c4d45d23ceee306e9bb1989ce645f81eb233fd9ff99bd64bd89f7dae6d794103440e25163039b86eec15117e180a191c2215611599c85765edce2d41e211e10d8aff7c0758b701cb1e270cf44761c9371ade55c0a9173d9c5049a075a3df828ea6b8347dfa30232066ab0472f3f61c99997532fb1cb2c6bd441d4f823306f07963f9e6c6e09e677637188b5e237da7b6e51d67731d64a43e36688eaa2d7461b085a1da701b60fee1af6fd714fcecb099b5777177fba854184f3b7e9699709a83aa85e96f8a31f212a3ad8674886ff591f4d3884792539e1a02ffd6699fc9d9d9ea95f79cf29e52308b2d7ab509dc20a426c709bda617cfd35b787fb3319f0cc47f1fb5fd2730cd873947090dc353000ee521e02c23fab260b1e9f7ccddc0f3682189f224a5da3dc895632993c38d5405afc480420f2c079b074725f3f59923fbe205ba54a83ba50da2c7977b935405bb902c30b52e4416c9a17b0ae3da4eb2973ade2d63f382c038d4529eff068eed51879d745d7c8944f286683e88b5470e61bdb63d01eaab4282ca668ac21cb01ad1175e6a5c07d12c5c703e42ded7066e5ba868a0561f86a8412a9ee7f1e8e746ca3ec48aa7dc50b8ebc2a57f08a68c6b3a5b471899ff5674e665c87a375ca4aa3a5fcc515b766f1a661626263e6b02efe04f846c7c50c4a8a5811df5e5f8cf317b4b2a73f0857f7e95e1093bd072ed1752687448347dd5b4110289f36a9c0aca65ee569ea8d063ecd911ae0730f744765a80997a907e702fde821e5d166a3d09cbee980db0a3ff6e1d7a4b780cb4d5e0eb1eeaf6e93a2f95f5384a32884d334ea8701ca89e9adcd2f4699b983763c0696359532deb0f460dfa87a52744857c1464e8a7e7ab21aebed4288a98dbaa4dfb54a0adbb851970dcd70ccbea4e8149612e848d145c0d24a9b863be7299081c1f87b4b8a5e398d3d779e4dfb3e5007b48eb132213bee30fa0b406252f426a018cc3a7d123dfc1bc60ffb792584112f93a2ad3f5f38ba2296b9c637708481a7663688e185903033295a8214cc5706ea87d16bd2a571084e872b7431e81f880936be4ff5b5139d99d249d1e63341bc93b358555db61a80b2e94708aa94e40acf4f4ce14cc8aa279c44f828dbbde5df410822e6995d06e5f22db3d279b4877a7ea8fc0d520a87afa7c46d5ff7f0ddb2c385c7759351ee29a650f88a31b47aac215f83ee352d542ab940674862e5e4bf81d7a41fe11c160b66792d87ff456f969eba1e683fc4b3c190907ea4d0548a1c04424326eada7ebed28fb5d1fb9055031564bdaca00417183a9de2f03ec0831226255e85392a7edae722827d5f63ef00efc46cfc2ef9871d7994d3e624bbd3f7c6b15e03a9ff2650fdbe0aa7f2dc1a812eceeb4e0b31503e32d4c8ca660831e1aaa99bc826dd91961fd47cf00cea109b7efad13a5378df3ea9fd8714d9477ad1c3d28f70a289e1108688ac26492ffd782c9924af19a61f89711b514d7238e8b68d97eafd06fa5f44feefe1311a3c2e92ed678f5cc650fe71298a24c49e1a8f35baa1ff241126d9ea7443dfc894db2fb4678eb63a3f584c312a8b6fa78dd5b1df839c3fd2230fe60c94f693518223a072754c3f5ab4f90d95fc464d18e2b91fd612935acef0dccb078323a9a22023be3d4c11e128324a5e97291595d65d9eb231829c593612c2bc47ef6021909abfebe4088befb56ea06dea13b0aac8d5502442f7cb8baad1c9a0cad542e8ef3ec6860c98ab245743b3a588d3526bcf7b4e712eb51ce4ddaf4cb296075647888f6c381becd6567d9e069deed991d18a49e00659d33f90c593b825ee38ed3c6b0ba42ea14efb9554343ac142795566c8fd8431564020a997ed8a255056f288f1ad22f5b042eb4b5773f7fbc7e1950ea841212a9c95dd60f2a350de4042fbc5b366c4e7a7979b8e20e2fafe6c175f22a4f44f11f27320e08af7653dfd6066b52c6a65f77c9e2862de86a4d2ab1a6ac64cc154a314e10c5a4e7dd0326857a541d046ab71b7559e13118581df67a481c6dd28c964c9d145d56819c4515ead5bd44e8c00191724ccf4e5620676378a23a14e9aa9821dfe44e754f532b3e2d5326584d657eab7dcb7ab2971f128ecc2aa891de42be6037ceac3716a7737ef2d44ad7dfad00b4b2387e49e83c701a9d83488899199cf478790213ff4099a917a82a74861ce318b8d9a54a4feb906a82ed85f35dd223ef22b94e6aec4856a9c61664c69e9e8768b3341440c877bba362dd2bcd0a1d4efeab1e8838d6ebd7ee821310c104701a55ff8182628d84053f082ee1ba0cc164be09a8a94079d7dc7fab909cff9d5f6a4f2d2e8d32fb9de32ea4d287983cf230989479bf0495439c7c0e449ec61f4953dce0de51422fcc7f51d26a2e0c7684c54d91d6c737237b55ac558fbf32a08804312c73109d5e21a4fc99222f21091ab16e3f7f06a0be0598ab5a2522a37d44b79ec2099c50e71d319b881427cc4ccdbe88b5835e0fccd18de40b8320c357737a8ec6d4e59d3d75bd47843d5701c329681cd7a9f90cc8b282cc484158e275585942e207a0b02f4803008afadac67729b1bc2c1882ec781f19092daf008e50bf8197abc60357ef2cc23bdbfe65ecebcc278b86a91928b08362ed8493486a3d539264e830c734a5e1869456969bf2241dd70273b28aba845794a95327a112025107caeda73e4c8bb93a5d18e15eef1696f3d772c8463f5f0e80561c545cbd5b5bbbd1a7fb91e09b24e5b3216cb14ca2c72f6c316a2048ead9f5763d82b48fbfdf145c5446251c37aea91bfa257035d1217dffc5e204949b36443a248f6cb276c28ddc9690b74338d945517625958f4b6014a9e5389b5de87568ae0e7c8fe075c2d326ee3fa11f95e49d8f827bb1d13f23291f9f724a3b980a79e53feb24222bd41d396e5eaffe90d8a80239e4b288d722f3d766f026540cb8871caeaa237cd2fa87be816a5a396e066218442394a71cc69149f7af7c249ce105f2e228e9fe560a3f176d213e5282ac0ec68efb4e8735207f1f797e20fd709f9f64f46415fea3ff7a9b7b6e198938615cbc418457bff62f63e35f3686e420eed6de140d03b2584712721105a3dca85907ee1aaaa089a46854288ec35568e4a09e80277317d7215b4642c12c1903f35f3423a33c73e6381dd07943fbdcae84ee3be7216097804c70230f06bde026ddd24f138005ad5435795edeac0edcb001d754bbad55d7961d97be9918fe169722d08368d08666f2492f0d4d231705dc6e8645820f2fa90a5b6434113cab7f09a589199c14f82e0347471abc719b7aa52e65bcb058fedb092d3687de43c6578afb723afa9797bfa8e3f297fcbc91537c83d37ecc6451e14ccff7cdf151ca9f759c5b22775e06d755c76c4caa1aba646868447836f86ab3cb6232e7c8ca84f30a2f33bd9d2c6d3123ab8fbb063346e60f66d50d2889e4cbfdd4e1dd8712b35f775b97645691761a76eaac07e028d017088a408d70356781322d15d29bb4e5ad80ddda373f853abff36d67a115d94d8f54e161fbce7f8af34b542373e77dca18a83a510222377756c95a1cb6016b860d578ab6202cd9e1a44eea9d5f88e06c8b4f01f4ecabac1a608ed336365e431680c7a893130ee5eae6e1dd000e9e066220a44647c25174c151b0b13b4aa660740a1899c875757144a8b3f94d3a0dbce9a6b07c8a913ac90d275c20dbe3b25a3bc9aaba79600efbff0b35baf421196e6fb1cd6c9c682955e1470c9ebf4498848eca6170ba3837f970ebf9a6bce3a28ec2311956ede925202a89b310ddd44f9cb35dc7bea3ae778edb55d4f6b68ef781dde4b6b58200f8b2b90d539706548d5957e8bb86434a61e96baf5551ddae9efbd0397e90b13697e519921ac64ec4e539b519dae6c6ccd781dadbed14c25add8e88e9ea8b69de4a92a7098a79427c10e0a97064b3b78d09f5f696bfccdd1202456b7d3aa4687290833416bfe917f58f2fad81d296032950ceecbafb23db75039d5d4d6e5dc35c0986ae0674a7c8b404c9f1cf8234ce161597d36325104459940f7b0f5529f6c2ff27600a3a854a7d701659e9504ebf1fe7ac5d10837ce0a8d0d962e637bb906a74a1c355d6d91e7806ccb4f4c7bac94252220272439ddca50050f739fb74c466b0ff1e6874de36ff5dffb719908ba4e2b1ed81dacb35a5e863ce5c5fd317deea8b29f6d4423bcb8ba45e81e59f697bad4ceca77f7d663393833374e4d57601af3f441de77cba5b2b53eadcab056cf4b072f35ab425e6066466c979a8584759b599774a467d0e517647b066bfff2cf247b2b6fd6805a76a218b16a0b131aa6aaabe3d9920eccd858d5b6b72a6a1dbb0d00aa1939f5eb5d3c7652a29c4e7504c115cda07c65b9dee58d97124655a0aa0e5ce5ae0c0ed0adb3eea1afbe6d75d85f0400ab3d8c747318b26e9fe97a412c5c55b85c9f5f66fa657a20da5b5d676dc7115bb9256f097bd508e4ef2ae22106b5c041ad3a991d20fe9e2217049294c46ad2d3b011fc9d0e2e803ecf708c609338cb6a2b8e8a9a6798fdb743c40f4c1f3a062a5830d577fb51665713014b5a5d6067c1f3d772591c6af2d6d56171943124744e2ef39281c6d651c10691492592e323e5e3bf792db929f44dae2c6fe1c238532a7cc60cd15b6ee71c2e487f4c0c0d5351276962edeac154d276a40a8cba7705db28cb61a50c3ec0c2c725446fccd6a41d6dcb64faac1e9a5aee8ed504cb0348464761d564deaf69736a327cbe8aadb275760f700b410954f09c4ed531830e8b807e4f566dc86fda548714c5c9d92a53943b2a42fd8f290633141e717f90eb552c559d923ba38b5bbcfaa4803d34494b181d7c2643a4808699cc31d055bdb74781d48899105fec9cb3c88ebb3644f7505421b645d0082e785b469e134f5e43517985826ca4a1e75d04295572062863a434da19e9dc2a51639060388a6ce66175403ac17083a530b088c83db8b1a29aaf612f92440128de5f39a5bbe0b5918f1811d138781534d84a4b5d55e25714602f29397453fdff3597b1e8d41a33244391b964568bcffd245c69f52e0f00b45c0359e2e22e777296e6dd7ef9086c29a16403a037d87073a45b638da8f32b35e84c97083428b14ec030b16270261a8fd3721c5bf1d36a621377c0879ae1345d5d107cddcbe260bf7d57343b4f7a1260ec245d21a9d08cd06ac9f93f1bb8e0f56b61b4c36e2ebb46b9b9f6db68659ac7195ce1fc22740ce23209dcacb4a8b1a0aee4fa5a2931dd2315c0e854ffd37905f28efff4eb5c9191d1db0e723d515ea480112bc97b6967482693a7c4f8be8e57e54f815d0185d5dbec7bafea52a23f9b6a21e9f82863f5ea52e3ba8ca7e34c4a2686f80b1190e117e317aee55f887729a2fa3e9424be6fb2e360628a5dc4d2cc1b105b1a1a89e7f1f50508a39bbd42549b9a5303a7891f6d3842b61a99ecbe53542f13935d21d81c3df1322fdcd92bf8ba939c0a84c459a3f40cc500df12abf12dbbaaf52c0f90cc885fa55c57cf12df695a30106f40d87d425038ccaaa0878245f44cee84c6908cc99c896982157c8f27f6b6a105f7f1fe75a91282e3c53846aa76f943b17f8aa767e8555bee7ef0123063f9ddd1ca15091a72590a800eddbca6dcd19f6ec75ce28e0eefdbc121bd45a16f3bac9312b14d1c3a059e1aec730887a3b05bac1ba592a48cd3a970facb61b575ab779c0a11552cda76ec991d1d10a74994eff3c100b82814ae38f4fa65a6702d01926b9ef6b6c931261c6cd6009d9a127d3ca86689adb4b4b2372c7c68e53482ccb39f432ffff0fcafea92181cde6eb7c1d011c81bb7e2a25c119603bf9c3255a93672db133f6e1ef49c585572b861e13ca4eea4be3dbdd282130c854c96dfea2122269c0ee129a796dc3760f819f56183aacc6cf10e329cf22c12ae683001efd100e60e51b2caa420fc5190fdfbb9bd1a7226b3ce64752fa07e5a8ee888518542cbb9a900260756130483d3450626d48c0f09fb0dcbb10a25175cc2336f370938b2e960910c23281346d7dab8ce6de0fad2b8d56a78322058845943a5954fa8f0dc3ba9e8bd111aac47cbb2be628514d82b3c53f76600a3f9fad0803c7918bf1597646dfd1eec6424bd1a630060fd5cb85d49f80ea7e0e6e81c8cf5aa51b7ca5ac323b8ce39493e0f97985dc329499176769dd3222c7ef41fce9b36a59aa329124c6a8f36ad82f2ad4a8c573216df0c90bf1896ce6086cd745b7654d07a1cc8b6153b808a28add5e64adea018771274b3405a4905d4d8f8738524b14033ec01f60f0de8644251bf7f97b001132a59a464aa79fd913cbb667d6fc6ea9d7855303f3a5a6d4a740de31e27833e30db4ffa095d67f373115ef2bc05a0df0d7da808cc184ca20a0445d97cbd07e7ba7daaed07390b9d469be9ea28d64dcdf95ba274738a723ab0511f6d76aa9197473b4c592a4d8c407777913ae9f8cad0842df2da313291bb137c0e450f498d0404e3533308578c501bbe60bc529b0bed20a7b164cc89be6e701ca1f1472335e0ba9d0300bc11c79cbc036fbc471961e0fa5e7f1a0fdd245e6b0594bb42fa5c1d66b17cfc02a8cccd81bb81272f762ffdff7b79a481c2a88fbbd027ecde406cb0b1ae9168391bde557ee193fe5c5c7caa8f9fa1d4949c24d39890d2abaff3ebca8be5e64e5ff9955051e4ae105dbee8a996a8d109990701e71cadf878412f50ed49f1af75afcece60a840eda809c6f00825978e625070024332192db7ba75522cd4ba0fe4709e403d9a74319ca7d6186e4ef05bf511536ae8c63a7a63b31532246ab10308bdd6a44784cc98b9ad8ef770e30224e16d8a2897d4858b137a87437e5c3d50dc765bfd2c7766fcbd77e742870af00158b5acf0b523dd590eed5c1249d3a3e2bfc86e767f0ff0ff425e41bcb1f0997290c176bc3a85a292f9bc14c19cf449e331da951b6e6b2e8c26a4387d2a59e33d0cd9371241440015492deab16cf3a4497805b77a158146c2fb9684f5d4d4fb4e7a8e36bcb6ff61249af4879277824f3c337688ee4fe8191899ce34ed48f03c684a7b2a4dafd27ba8b09b679fbf58974786ee81d00d1d26d009615129425a258548f721530c59423102c43ced9d13a79e5f8e48216b00ac21557c72b05282da89c9ca9ccbaef5f3653ff4fc9b0473d58567a0597e1a3afb931fe5b0f6ee7bdbf6c85e870b1da3caae9a751868deb481daa6c731c93eacaf62d6797f02406ae4f5ae585bafaeb265720b646d627a5425e76de7242b275d1255d39c952c52a6043352beb8f6a9963e658fa5c582ae223d3fc2be5eb2d4822699782176582712c5b00cfcec25173493d22335f752a82f584723c1319288f35672eef192a5e0cc11a968273358909551000cdfc3e01b1686200b37952da485ae425df7671450b51f2763439b0914f729642090dd31b85f697140039c98a106bb1cd54fc2b1f19be42685ec96fc95a055c2db8aecaa21feec4fa21a1b9109753d1ae9a4abd1003bbf0c5baed435ff6f766eb40c29964add805759948b5e4e47e2d471ef51ab347515b97822b0a1f11dac3f7173fee354a4640921e6710fb8488fc7e6890df99be68ed63dde778f1c94490d2e9312fd3dd08dcba94e17581d936d310f3115a088b0a86ae22a6664352223ca2b9f4bc9f898415e4314821b4663a2fa90f8db15f1a9f2e1ced666cd6b866c7ee02f447f3390c670c4c32a48a461ceb080faf0f430f8860a66267dc211299013f016ee1b5919b328e43d2bf2427665d8acbc820c89adbc992202b5f8aa8bb37dddabfb37de492087b1d3290e8852cd386d6372cb48622e06e5d61ffb40a8a28d9f4d122c3f55d1646c2133ae7db1c6aa6f4b27425a4bae6b835dd1c2785b9df9fc1c8aae878ebff4837d800bb802a08a03ee5644066540cc17fb6d4b22c1857a1852de1c8c2d215e158c4c12c0665e6911daf707108a374c0e5d0c034aae25d54591769b3df7128664f09cf2a3d41b68a9c2b368825fae7007f5fb7a4eb6dc8ed60b9f9d83eb41a70efea48610167ddd4008358be7a0b4fb440cc46879a7771c84b29b3aa868df3c9acbda356b0961af425e975e11f36078698e5c290af4e437222a7f4229947555f8d1161a70ac1b7e26c34bfe17def7eac68e4fe7c8dbe2f2ea7c63210c534411ed5079ec58b54d505df2b8308978fe7b853431602fcdd703890e65e0315698bbefb52489d1b3c47114a32105c02e7d9e24a7ed81991067c0852783842b5605434f058e9096b8e0e5a1a3aa0aa670a785ba4faa631547b97eb90af7290d13196bfbfe1796d22c6c95874ce9233075009b5e0e525a28b68191bfa531c624f3f778a06f529a951c08085ec827f8d66433b37519fc2d6915ce2148cb4a5af2341dc25b9110f10dc91459cb82c5e8a5cf478c5fe2f6c87c5acc154b6d47112c910e7a282da8f81b78d3b20c42e583559cbcd85d27f902ae4a2127020cb45b5ecb09fe1153715b66bbddf9f78660b5e258499f37ccec2b01495f4a49eb19afa990e912e0130ce4d2f30535bb5d6d4bb1b743bda5759bf1b8d1c99dced6ad6a71da16dea071999ad75d90af16d145dcc70b5b4e9660b39c1acbae26bd6f463a5e7e02386464a1d6cb69d83c6deb5ca93b514130269f3d5e51defe6fc993ed9ae94e32e9b0771bf27321e30b9bb0b56bc471658b54bd2fb2d3a3cf6fec2189e549c588a4e0b60d5080d86cc744383e945b8709d94f172db52fb56383b4ce135c39dbf75ed034e7d0fc686b997bdbf48583bd6fd05220c77882e7016bd88ef42b49c7e2b267ffefb95c4a5b2c9c49462655b5b10f780e393d1fd0d61191d13137d57a458f97587270dc9764a14ea36537ea9af602d0420b76e9bc8f59a3fa18ddb3dd88c0901ec8fa5132fe3eff4b4ef7ac63c0cebe354bf27bf9027e0ae800091bfd65908b74cbb38721d21b343cb9d1a2cb94cf5dabbe41db98d1da050194eb5bec7105fb98d1790b6c7ca1255e93b3c84233cc13bb938f529371bf0b474e330f62b3602c9e979292c83abad83ff3969c703549131f202eff81809b9b815f50e06a5680c9bbc4100b91046b33de2b32cb9211cdb096519085b2322b16a52586071de2da16f322a165842943f40124ffa613762d4a2544bb89219f421391c1b15dfcb06b605b068bf71e955b200d6e4a785c15dc029fc8507963296074b8cd55510450bbea3a8bb1c15ed4df0c0ecc52eda7d4890c03942c1e028211fc5379f389751ea02809d2128deae95f68d90c7ffb21ff6a8bb0b91ab91ab5043c1c177dd82b5ec3dbad7158d0ae46a490f2898c2b8afde38d65441e6b02cb2684227c135ce6ee662ad188dcb23b492501bfa7d62203895463fcb348e752c7bc29e8ec8de5bfbcd166723c326a4d505712dfe21333adc4a6a523ce063371d0d96f6f4df42b3e5c2b9cbc10fb339d5042db2750a4aa04b3a2ea4ce5fa7ba1fd0bb3d5101a55ede355015c90a1436e80d0d892b9abf1b0f00d828ce22bba7abb2b87c8da979e20e710a14a904151d1f699e366b4e703e3a9f0b934ea3e99e3813b828c68838b51bb42052fde84b58abf6aa917ed571522aeb1e3418d7981e8919280125ea3780003d51d2fe742be7e5b85fe7cd29310ab2c32d2eee166ceaa475d5478e39921d5069c9088b402be157769284b5b66ea97f9fad2dc40d6bcf2b4bbcfa2304bf293320daa1d45a44b57a0983c4b6ba51b088efce836128ab893f2e5d243ceb49394f2655947852d4c1f3127e2d66dc1363a196cfc73f53f5940fa2136690ef2ca2ee6234fbabe45533cc8b80e8745f8aa1e9042692d06b86992bd41c8c41f61d61306f610845ca67198e059aeb143cce283e0236f0181df37f6b9f831f1a5716ec0d139b9c0ce253bb113affc643efde93cb68b1c5543002f8df5479ab2f034436fcde89ca1661ead9bf44616e1ea5e9cbc8437d4910767401169d0ebd842f2aa213797ac1c019bad92a378fa725b140e8a97f9dee63b249121121fe6c8b86c12d005c0933996c6a1964678ded36d216fefdc67a9fca049af4d606a1f1ec362cbce5f943d963fa82aab046d8e53eb432c5a5aa7f5bdd0fd5aeac484369aa88cf31a5c301119ecbc0f6eaec3c26a3839fe69ace6f595ddc5790f7bb8c472e74cb73f8b5aa51fd031408b4759a768828f6940f7b638d5270656680981a11f15534b3362aba2addac6a39b76e4858083bfd2384ee412c7f1cc7a67e228e84e1768e99c9f393d07f2a0d32aa1e58738eb6386e0837dc7ad003a24ca37eb2b186bf8f7fcfecff316b5d5e563dcef65c0c626adb6998a7f35d01cb712d15858c98eef3f9a4093291b68a499c8f8f6b006508f1ec8564b4b1ba11e9ee1236864bb0a4f0e1b843977e77908d7a66fc834b29d3e8e4bb3d5ef32393087d586b11bc19648f1ab6411da298e30b1425b922315c3570b38f4bec1b01ff832817ba70ee7bd157d86a4b7934835bcc8c39858fc17adfb9a83a063834492ed2600644c712db1642dacec5b2006808e62c53ff6a04494f4dc078488690eec062837684e386d911a718c551c406f9d3de7e680f6f6bfaf88de291d02183d245abb02fac5bace3c968c4bab0305283cbaca17d586fb0bf4c34b245165daa90d2a8ffedf6026ae89455f60fce8c55ff7ca409013dac21a16a4400678b99223dca0a9d08871865020d5733de69b63ce970037aa3a04d356eca5dfe4dc9d9ccb9442f0e9728bf6cdcfe7ede6308bbae84d6b76ee18dbeb64bf207b3313a0aeffbfdf71e92e1ad2c3f600c4c14c35eefe480f03bc8009d92700bc2265cacb58987d0bd8fb79130e70db3b9ab9801727dbbda2374456a9002f0331d9f0efb4e902b41031a7c4174951a4c912b30c8b227e8d8683c60458bd259289db6202902557d68d9d61da0980cd624346910811e40a07961dc6bb0619b627257e96a23fc4c121a77f9d505d8494c669b5f5c78b507ed83173e5ca544941e7c230e211a04011d50748eac08900eba3b60ec4ca4e63591d645d908180681c3454074d1c82a8952b172c2f0f16e5c48f4a1422d99e42b5415d70dc2307e17068df796d8d8ecd16edb6a3b4c89fd5b034018f741c4999351ca0cf23fbc5361544155e732070c8fbc5670e766ad9e3b95c76ca727630d958ca98de6ef91d96f4fea52088ab0faf2d61d80c163d016b59e9d3a582ba12f1e484372ad4cdba0add11acb42d113f32d204bc9a4cbdd09b4c1bcf80cc9a08affb9b9a8e8f12b28d12574806cabcffe7db5fc58fed63bf39729830a36531d3db670f9832591ccd28cdc3131281042829082af4d06356d58fc1dd25c52d5fb29004762803b0d913431cd492c75f70074ed40253b907f5df2437b73139a0b3154f3dc2349eba99fdcc059c73f36d4a196d854ad8d02b38ff139127afbd0d52f0f0b25690f39e53f778768e255d13ee948b8132b58b82cf9eb8feefcc19d3cc9208841898164b65fa1365ef2420190549c332640dcc38faab8c4cd20fa207f28efbb966f5577128f254fb8964f1a60b4d7966a7b8676b7819f5da5a6934a8fe2d02c702e6296ff1f46e7a7a9c3e8cfcc3e0edfc788549cebf170a499e4beaa578536dc27ed1a03dc5a58bceb2850aa22c474ff614fb857161d3807650da6a412aa2473435eace241cbedda30705089b84e2aa30913fd26395854f21c48e86990b43defa984991e6499d891b0903fccf2bc08d1f7e89e3ac1279e1ef93c0d6f1e96d69bcc63e4f440b124a8413284413903583afcc789e492964b99e3241081329527d7b0e2cc7b78ef9e2e08dce814847ae1a0e11591d8e33b00feb8e40841584821cbdd16c8128c0b5756264923d14b61f2a12832b9347a5493ff0ba1ec2e15f18ad416dbd3ab06e7422a8ed9c3a5640647511d17678a39b4a2aeb862e577130d7a3720c19a0444c91ae0300245467cec7f85e8a56c790fcf1b6463721d7741b834340f8de73fb37fbef468522bd84ef5178120484c85fea622e8310bb9fffbb88d62338290bee4d26bed033d14acc15a580767a50ae527907ee1d14126d49b6f802e7bf2c7a8e7fbf0e0a6eb73de4661d633852c68b2fdfa958521f486ce721dceabc7fd894c1182032c1be742b88838bad0af20590d2420d85ea95d6297f7b3ae912f620ad7696476886d2abe04e15ab0be2f4705391bf93f87da3201bc58cb0a915bf2d6a417cbf17f1c76804f8f027eebe569116196167b88471ad557e3312cef060a03eaedc84586da9a8ac277e3388d4d9224f50c403ef3302c54848d9618a24d1a2829490664215beb282e7d78af6c0431325746324756ef813a3834b56f7a1265c9f6d7efb44f62c360e7f4a1825e9a1f8c1a4473425719b0c615a9362ca0267fc30066a65297d3c3d23b4973925c28c5b36882c62b819f4b52717f4293bdf1de55afe5c7147c85f924a4041add2ae6b6ac130c69eb2d28800befe2790c698a654eb97cab313a8d230a36229d43cfdb803846874829388599f1f8c60f8ea6a3ef1d3d70dc325390412453a15ac0e213370a1a256463d8431aeaa4203a37b6424a969c8fc55a0b166fa084d125b334ce5abbfda4b979531cbb9c794e5cb89c4756dbdef1803e5a6d39f6b5e73bba01d8c02029c67451593a78e2be4203e567df9b958cc987313b7120428341de00397f40109487d259f62f6cfdd4913efcea270dc380687ad235fa1ae2e30e5eaf1ea355fa79cbd3e0baa490deda0152dfc3f99258da2572f51c8ac737c02d1cc2a85564878a4062d7201fd522d9690a17a08f63afde073d5e06c1285dce3e48e9c6681e32cc36b31bdc0e840a6a411816223dc65aa38b435684e4aa1620948b7cb6e18ed7bab4e8cc3e18684ba1759fadbd9b377888a8290016a3b11ec052dfb95a8f6456db1fb40777d1147bbbedba5da9f0e9e24136e436ec20f5f8977cd9b69377141b1a3a9be84bf70ca0be6f80bdf7fc01e885da2dad29f102f82b1c6d7334c58955d7522aa65b0376b5813c4802e65954e578eff6a6b2bdc76e347c5bff11cafb6444f2506f1942dc17f5bd665151e879e251eb6e01b49ad8680f8018035be43d72d7cfc01ee0e4cc3febba10ed3705264f6285c21233804b666c8a2e8191f91c1670112fdcb1fba502e98483cc4848c7d2a71bc469969e0846e05192db4ff40aca1612aa90307c446afac8640b950319a963c5c26bb63b47f2970ebc7061da0de564574b6c35bf082cfcea2ff42faa021f40ef9d99cacdb1a40dd1327b9230eac409863422d80930fb0f5f721a573c6d468480fc65f69e94cbb8ab0a6d6f2a409f2d197a17e754135319f987b028d9410330f18452e78934ed92225c4f842d149d97ed27097d0aa4a527732c12ec199621153771feb70d2103ce9d0e4ad0af21a395dddb6e4cd7507e1d87a12dfb8e7afae5c2226f9b51e8237c8be9e5fe7d5aba193a439359fd61838a0f2e1950b18dd9965654352e4c6bba4e3083d2e52d580939b3cea351189a20d4cfc793780ffdf2a156bc20373d0145270322ea175b420fd4c061845960b34beb682d729fc530724efffb6b591d0290704b931fb60a1a2de3edd4faa867f0b0bd049640502c0eb4a4f9d787bff11b1925f7fa7d30b43972402799f1bf31e3489c0b8fc3fa2d0f5b465b88c946fb3caec234d8562848f41075e50a55cc18d441108d8017ddea6c6aa7aea64061134846c6e39a3670b4573894491de004a1321965a70957a0b71ce3e870c797a803f60e2218bd59489ae09081224ac35f7de06975430265da192925556634129a757d48e7a20ed1ca55ee463e8fdc7b122cea162200d950d829f5f02a6bb1adbb83d0401452cbbd0160a3d888975dbce12481198e73798629b376244b700f98e8375c0dc82205cc4da2ba95c393571d5f708ace8072062c1e3aa03aa2f046d49ab4e95bffbbef690022d0587290bbfb46ee9fadd501303237356618da47e8f2514dc2dfb41fdfc554d27d18a81a89a41424b8eca124e549a0eaf9946c480ffa310e66d18fb0227186728a83a02d0649534d6a513ef45386041375dff39e78d8a12f72cedea40b27cde48c2f38613c4ab92fabe8306956cc3e661a772e5e353739c4bc6ed08baa918503b07d86b98b10b3ece83a928804b0081fc381af54efd1ca17c984424ce287edb69c8c94a7aa1908ac0d879387be0f3b6e95e3099258a1d1a92279f014ccb950634bf16d577bcf700e859b55fd961a67ed9986454809ea6f4a26ba0273633168f046a2798111f6524d8c28ddff5e1b1faa95ac0449c2340e66ab3e186fe568efd3e3c20240dade0867dec8e9d614339f6cafb872a2bdfb444e665e43526651df55e3312690303a2af717fae543fd000a2589778bbbfa8b2a2ec88af679f7b7e60c997d654b6e70cb50f3c6f5cb8f9875a83b343238c642edaedd08efbb67d7e721f1ba2a680ffe0760006079905701a100ee53e298c7e4247bafa5defb90ddf9e0d011d7316351bd4a357286b9561f3b1a9d0f733ff9f23758ddfaeee19c97163234fb6502791e912eeb79cbae41db362e3adacadcc72bb0c7a2e1150116f94586860f6096822fb4c3e52990f7a6d2c160df0fcde19cea0f3c48ad8eba29fe4d41c38804fcaac8f7013178676fca562ad251029553340b5c0dd6f01a6ce2943d9f1f79488a5141af0d79e18b380ffdf95ec36b2eb097a514f1851cc75a91ce26393b11a4ffd199a1e647e646c9a103b0e5e62237e4c45f176c6ba59b458703950a20f334a5cd907f2e8aa0420439fe32335e998771bb3b752bc98d228025aecb2538a2a94fa5dec404af7603213dd33fea05b8408d52a4b8e9fc50758549b4d14cc618386009047a813326519b824d4b6e9f2513ef073c6b64908c2017a80e2817d702296d45764fb5102c15d8873d2700acb834e68b2cda5a3d00dff1bd49e62156412b07075fe1f190f249a6aae8084865e1d7b8a597e47e16e9d40c8d79761439c284a3067dc7e3cd4ca1daffd5afc166c19aa567c23560f2fe125855bf68c91853bb21072442f02f5df15e7172417a99ed872b85ff334997b782926172d32724f2aa797db600de997422a23cb794f0ccc30a001753a8fba09f0ce49ba7c3a08b5aeedf4c1761f4ad44c03faccd8f61b607bdf23fb695ee49a6db31fea0f801b4281a8e5828b59ee92856e51f5dfa1301bc22614e09353394c076abd2074ba0b25d741941767921eca315b86231ddfc9400c9a4e4b6774a1059d8df6a32a1c37dca593046e72bd277a095246c067ed2062b94bb15233b7edc1d301574a216748fb379f689e0c05a91de45a26f3588fc3d8e99d8953c76f0a6403d08240f4e2ad1f08c0189f2d0b7466fd136ca7b749d72e4fea4dfb1a56ae7326d351ee0c8a94d0a063703a886361cdcd186282622b1c66b7d780ff25349541728e12e0a664a0c2c165de0042928dbb807da0f066f729f05491abe93e1d1e204f90d4149a530feac35ac55a7d2faf2e5c810a379675e0aa2bbc4d1fa6da2b415850c8da01455f4d1f63c7a3c27c5920b7fe03b531214533ecff9e05906c6491e25bde93cca75405d4dfb346a56e46427b793574e3b4b314406a59dd8256579f3ec2a460504e0d8d11def2cc468263f14e216d098b562495c89ca50c2921e36411cf8c91dc093f29c8b41501ba1f25f33d851e2c26fc957853c13ca5dc99c4132af98a204c23ea7fb51e8eb8fb8f009d258a0a2f70b93b6b600195ce0b51c4099003ad23c5eda229dd11c928993b01a228961295626410c1ef212c45dd0fbf0522d700adeb601f1a454ee704f059584082aae2f05d78543cec67d6d04582ba1ae149b3705b21f29a4eeab3f6fa707123afd8985f7df2c1e86c7e21ad64c6eccd642d94e4126224b54f12349ed31c0d9d2d686e1374ddcd0cdfc4e81aa9d2c11d2820b4807cfb8333b0c8e31debab6499f773194a0beb3e587955517f969ce9b550b312794ac85fdf64c1268c33e513227109c45500b83c52bea9a156f5c464453f28f4b8c626456a3451bb1e0bf06897de69d2f1aa12b0ac3dfbc76e824e89cab15330d8e6c94bd1a469e0f909a112d3065f96055a241b444ba811f86ef91e52b561b17bb98209c25dad600c9072872f8f44c17a4c6b1aeb7ee7b373e075618695ef53b766c77c77b8418495e65fb86b7e3cfd3f59281516dd8d494d5f4bbb9fd6c3e60d46a8f5b532e0fbde39ab314aa3787792ba428c09962962e05bc7aa94f25f6940259ab09227e56f65806f42713622394c04d6537a36e9d0bf28aac9a298737e3b28d499c36efd68b13f3a1921ad9121311aa93932532ba58da09f2e80250dd54501713709839f8e7ee86120fc7b06738692b260bccc1c4634e36339a4a34b3099d80c8bc6d085687f304562334e569426faad87966313ba44730143dd186a9c89c01194688f67f4672c113c0eb03381a5b9135b519299c3b819c667c91c98088ab0f92578e45f3413a97d66599587c6fcb2f697a42c3e55f250705c2bd9dd648469e419a938b9f890393cd0847328c457075abecf69ad9d25eb67ce55ab22274924c18a1768240e672771e86be186b1e07e44f7bb7bb324cc3b89b825322497ea8bd0e5d34e0f720d8b34fb8201943c779d9582bbf18e3f30f7d126b77727713836024f0ad921aabf9bc1c76b9d6dae4863794482bc5980ce7e7baa6de2b015336572a8ee46de54dd88f2e02355466d729486c5611e95968f68494b445ccef4eba61ed823c7fab2053e4841a2671f32fa5418d1bfe1d10229e69d22563553d7fceabfc2012711a59f813390bb564b5140faad52d1250dc7bcabd8ca33143c05ff16bb631b67d3bf495919c6d09b953db9d1a916921e996084171de1ad19f2d2e01de1318fe4a93f65c03e6c896401f5aa5d31618117b1b6c8688dacd7236537588e07e4b4c2facaef7cbea6b6eb4561423f87a2efe8913c169f13b4dc1f6c3bce367280eb2d35b9605a8110cd27ab22d78b4a731f0256610f66b5d30d4290a83d31745221d0c93c1ca607a725e194f3c79335330bc74f79983ccb73c7b99c6a5c23360f32a7d31c94ab001fa074052ec50cb9df7fdc92760764010fe1c4d292732abb982f5728dd642503c53d18ed876a889b80f71fc8e888380c668d6fcc02543e53a05f8ad72decc47d585583a3e2b1d71b90763b7026452f10fe484448dd4a8c6142370f1a5dd9c8798bd7a5918917840ef22e33cae663129ced63f4a190ea558d0d2a0d2b3abb24ee79f1ba36e2388a928c06cd88bf9f134f72656cf370cd751b6088ad289be96e8d60693e77b710702b93c53c2920ca5f3ce8601542554257c901577bb7ebd1fc7b1ed334221b951820d36947a4633215513ac9a43b2004b6bb11517d4104444e5eae236eed0abfe5f3464385cce9e68a83ae6e01d6d7a0a8cb7df786d53645a731be0451b1497986c53054326452a922200d06062026ab85ef5095c90c4b2a15f5b2a6ba97865cbbc4bc1da92c65c28839144258d2e92a565a3c5550c739e799e774e3f10bdbfa4c2316e7feefd4d48f5e8678f4726ab050d4bde14170c9f0df8dd85f97c8c65c97bed8cfd7da7eaf4c4a0a4f9a033275f99bc53e19f7e873107a072cd35ca3bad9acc9e37785fcabec99a4f0c30e68820fd395bf932dddc1ae900acfbf7bae5a5ba644e2c28945fe7b3f5ba49bd6fb881e3f97ce7a1f7d2dddc02cbdb3919818ed0530ec6623cac25f17f0c28be2628aa8910449016790420aca7aef739f06a78fe4ece42bd76c64090f73433ff5cd2c8884a48cce5e6493e1c4b4101455b1161d887a1b55c105abcbe2a031108568b974010fbb5fc7d569c308f745ed2911c384ebee4faebafd93c0e8548117243280fa0dc4fbfc423b846e402d294aecb4cb4f0ccdb800bbf3b89500352a6555561d30a09c4d490dc356622c26fd04d0261a9d023f941f72b7b397cf587d50717e47d084ac8600d66cd8e70111826e82e8b2f0643b485f45bec4528871e03242d79ffd76ce8f06c86e1863ca3ed80695788294a04b3c9b96ce1a359a240d902b122fc4c5f45804deb2f66c334fff5379c57a76ba4560b15c7fe736a0bded404a08d858409094ef272984b0126098b9eeb928900113bf1a092cc7fcd4b0eedef006c7e551cc88d16ad03182b2fb44903cb9b75ee91084c9ceb77deeebc93b9369e12dfe5e594b152ad9b56947f761ee18037963a4422e290dde267986e8bd287670d81b0422a11c92702aedd020d3d8ef7431288eef50e85b818eb11783e222d663508edc2ec67ad097a92be1647dbc77653a42f69d520726370a865e01944e552f7b8f02f38f04e38652b8448363630e6f7bbd2390d97e5fcf8644b7260b26a44ee4c5dcb6b099414babe6b0ae6c82b06b42109068591dbeda028fb8205bdb5f8dbb5a16dc48b2bb153e61564d1dfaaf561101fb848064fb529fb188975ec27ae851e9a0d095cbd543cc56ed07a705ccde3d587491560f9baa5c4ce152a2f4795e80a5431a4dcb4c1bb56598640b2df6856381e2e82f48d817e1a67c2c346e213ee19af94f91afca6ae3d8b6345a680b0c9f0a0f325c96fb24bd2a102c6e4b64bd3cb874675629164f9222de5121317e24beaa4ab441ac667bf2c8ff5a72be55bf96aaf4f12b87fcd0cc9f4069fcccc4a459195f6536e160d1d75621a75eddfc488ac96b548f204cecc2361025ac3a5a2b0a04c479d0b7748cdb8de61136ab80e83cc85dee25a108aa7541d73123c47e4590a6bc5050ff141044bec60b2a67201e509bd1d931530550b2cb9728fd99f8fa085233bf959b09ff013faa1104155b03bd5b2c7de5977bc4472c927f6be9ede1cf38dfe64b83e1195f180a7fdf8b242c6a4ce311094f8a6063428cee2dbf500bf88e09fd33610cba48e6dbb718c3d82db8f010cc4c08b75ece2ffd8792759c1ada0998e35b4fd3a240997d1fd3483a370c14e6879f9ea84b22b9debc4fa34103b83d37011363897887bbe37adcc177725d210bf30c9eb7eb532d01bfb334a7014fc6e341c15335708084dfc16738dfdacb4f86fa84053630f80887dbbd6fa485df016e742cc7233b07e55827dd6d04473a1c96cfe4514a4d6a0156f064cf7129d336c2f4bb4680b20cbd63d615664cdc9af24ffefd9c418d30b1c06180280d957eb42346ce1f077d97f90bcec9b908944c30cd68b2f10823cc864dca274f67e2a403e474e4247bb570268a3f6b3858c93521df6aa770f8940fe77c29dbaac46cfba9b4d40f578ebd1e41ab7f72401bcf5316e09dbf6073e86cbe5c5084a0589eaec7f08c1e92af7f43364d130fe1cbbda4309a5a78764e425a870d64632f45390f5d0bc4dce921bff462c64e75e2bb452b06804d4156676117c9294f517aca6e16bc792232d2c6a717182ff7b406623bc30b1c97de3dae8e46d03e709bb4898d21d728bbcae6ccdc99e9cd54788b3019596e238a506cc831a4842ceae06d0d84bb784961ca3b9d54283491e25a57c360a6c9cde3986f9cd5e8c01f42b67f2d2fc2bd9fc49fa0ff9c51d31701f9b66fd84bae6b240066c59e4b8cbee00e0e7b4159a42af3df301dc35761a6ca14c9ac62d438612f8fa1cd42544fdeda111f9ab791d3660bb281533603463a740e876abd9690a747e471902e1080023b4e1b20876d616cf9d107223d9ccae364fb0cbb91e4f8bfe3a891820477b437c22447adb0012a34eb1e2d817efde6c51bed6d6a98da2f5d38db6c90ecdd31dbafa892ab9bbde04a57837ffc926d4fad2afae8917d8e560c5bc7ccfe48ac450605ccf8485fd9b1ce1e76c6d08465e58d94d9dbfcddd39c7888ac80a717572641bde958a5a2c99f501b0a9c3ecad7150748e5a51229eac1751671f71d90fce7d98d87ae3abd7b8d11cbc23c75a60053929fa5b6e1f0f4af07227703f31ea0f72e7e4240cab99f0a0d6cec76ea0551a7cfb2f1d75b540a678f8ad9a36e7d097cab474ccc66115d606c5f7f16f6755f4c4158e490efff54e31d1be593b6e67fb705c5171c00af59feff7e87006e629b5f832ebc5979272fa380d20a2c060413f8a179c0a2bed72f77f12a14f1dd9eec94c7a75a442666e7faeecec37b039ee12a2bfba918ab14884c971037280c1a646c08e2b67f82fef4ccdc05633ad8ed5591f3fa3a2b9095100adaa16acf0a57ffbc4a3aa6ebc7ca128ebb0b6811a2853068f07c42746a9814b9cece39150a47b70b73410941fda6c4a9fc62f04768611fcc7b92a4ae63a34c22e3057495c9ff79be43ca897b81d00dcd8db30644529b43e59b1610791485846545db3b3a9be69466db5fc9c70530ad2c8fd50c7dd0bd3e11d03ec2506fd2b15f9cfe5c653c9d33f66e8b8d898310f687c799c79029232d9574e885e12e51595d45215ccc32b753a9aa05d9b6acf373d2c10b1b02b21b17063d4c3222ad2422d9d82d66cb11e1d4ae6c693e035e6f374693acda0e3a2ea18d6c260522c36c4cabdb4474b8d96f7fabb10d4f56758057f8dcb3f3c5c36db15a2c27345e519988b666506dc2b7ea87f3335078ca699716426db8c22702fa68fda40dc1426c5efb383878fd6b2432889a9d180ed60ee0d2a31b4e1a1ca20cab0440f298d1e1bf69b2a8e232a33c56a6c9d7bb6e71e72c1098f741ddd50114417fad011598224975ba6cc1783885a81772e651082e20c31e91861951ba177b4bc9e4d9574454ebc7d54a95217a55f59d2c22ac31a662a0c313d78eb60833d76f0754c9d2b171d64442851f09ef227b76578a1b2a8c3efdfcd825d157410b4c1e607346fcb89e62960ba44880be0b1104a7b48659a5fbbfa6d606e5b05ac9083bd84cbc66bde74c992f96ada2bb11bc3ae642e1f09a15841c30513bad5394484cb6792e021f4b89aac60a24ba6125106738b83ce6cb64754c12c9e4ace58a49b2d1641eb00b7d61d2e719cd8d8483edbe5b16f999e13a3878c90cd4437c041716bcfc1718beb4812d3b8c7fe1182fa571a3013ffe7402f71893eebcc5b5aa6fffc49dc47bc1ae786f51e75baabd7046efc443a98eea84288299cfb460211008b6b473c46f2ee8058a1d2c741254147a0e2eadeba92d1888074484a01e066ebade0f3196eeb405016a2449d60d9b43a862c839bc375552051c57cd64ec08b776cee38e3842338d9d8e7279488b21292ab006ec250b828ea4da842367b4fe33342c5be9b11a0b3361344a3154133984596330331cbd2eb25108c227deb1c2bd62ac2f3e541282ebea756842c114b51195f4fae48316afa20b80a7af0b1e666ad3e50e0aa87d3bb17e8a4cba469f9a1af913accfeb4cd8b0bb5c934b89e4a7260cff9b261dc88956e4b85e10b1dfa1b4d471768b7eeb5c9af05fa5e1541089e7fa00207a4c529576f686aca110408d1065c10caff5434cbe02b4481852370cf034c3ae595861db033d798f70dd1be16b4f0948d3e653b4567caf8424beefaf01be0ba278fe6de2a4c9d1f402e867d6ce667370846d124fe90f5237d6549a83dbbd40bc13782a81336a414ba64f79c92923c2f0d77dda41668a885de4e53683db1786c5d7dec5e03291f99924d70ede3ae319974fc2ca3959b9a16243e43a88e98217f853b74b64b5e599e92f65352457092bb4a6498dfcb2682717cff6ee87811d4e538fb09690fbac35e274e52dae266175f137da9da536a669fd7df49340bc0b1b9e879a90e7250a4aaaf5f13c68329546313448144cd2946173ab46e5d0259e4a073125da0842bc4e50e8dfe47ff167845952c926d18a0034d3755dd9189878fa14bf2e24dadc883f2929bf9e9e9e411b4b28400cc0c4f71f4dfe95a2fa1e30a0eb4184f8a7b211f76e33b585afee9a3b7bbf3d39302ccfae6c75887ff974c6da9a136fb4f0a5162cf113aa85c8062d199197113be47ff16ddf9efbd2b6094537b7e45a0ebf7e350b5b65d2f3fed1985944574be21c44f5eda5d669a61cf1218da8fa2534e591f1ff666e2df10469b62882cfb4d80ff36b32bb0e78c1f37a2b03d5334198d792239460eedc7bdb3c5bb129d4c3892ae58dcc11ab5823b2c8f95bc8abb446045044bc38f79bf67d29657db519b839fba3a73dcaaa28fdb55133086671b10cc8e24a3215af4c6a8b39d15c69cb5e2d5b0c92d6c7199b3c160cb70b9fe454ccddee645c98c4cad5def1d49efe1faf3a5117f6e97e0664a0de4c9e94e43f05748bf7251c8c107c9bca8cc9b96451d6c3f971d229dc33900c96e385b8c80761e953718f2369b3ad74d9ef60f8c83cd63ab001c611f37510a2f4d45e110d1e3fe9f4dd9e2d4a54a4ccb5bcd2944e8e85d917a34164c2d3a78ac4cdefc5d6dcc23a4098b1087b9879434f6ba7d2e2a4a846f1934c79a059bb57c69f2324b70c7dd1f17e101b7aca8e755c342e36fc3076327307faba016e56d4ac32a271186f03cc05fdcaf41ae361e11af9a5c319c0f0014f42fd9d16bd481bfd890353d2bff5991f0bf6e4e342937cf233203951d234479b4d05421d5343c9a4531105e9d3095622f1da216a4a4e34ed0c9689b18b087feeb58a2d388ecafc1ac66f8b4ccd7e0097fc76d7f2e147b4a06d9a0335bbfe3f2d7b68c7f4f8dafb7700d6f22d7505326eacddb190f73a9588d81aadb6aafba7b7921cca06aa309925d2fc75d22222b25760ca227b214954c7427a3b876226610c5a530070375c9e23b984738234fe41646141585c4e054af37ce988368dc18b1f44ac1f44fabb9d36caee9ee3ec03d5bc12f1a4efccd31202b80de2f9717a60c0eaa79c0261d1a03aa4a89457c91be618a8e3438ccb8de2c76ad7deb1c1683b4e97d2737cf6dfa86274d919c4650632580da072d657de43d6da7d5379b783393cd3f2e316707e7e6469af35b66f7ddce213f39d7e32172b2c78a306b4a39498ba47535c60833b16bd5a54c9d901b9a7e8ffe3ca93536aa866e48eea747ca9937f9bf84c592b6b69a02bc1735a2fa48df58e2f9bb41d10ed8e998dbc089c98f7ef4961e2b623f9af2ec0d9e41a58ff91460413b3aa8308f132cd6d7b68d0e79ce256db474716bb30c0277d13c54724bbf7a49af3934932614ed2d8aa8af1ddbca3ee8380e28e90eda168e44442c2d23b26138e4331531be20e2186697ec6a4ef356db248d572484e1c2517c165a08527fc83878b8e9706bfb84eb42e4a72f8fa29d9020fcd5f8f31a3b9974f9d479f6adcf042e4b01a967397f240682254b228ec28b6530a16dd69550aaa64b5dff84638dbb5d67b7aae8574675428a1653f491ab138a410e1df87fa2ce308240a60f8cdd99d13045a42c4ac2148b732119f044b766b15413d99eb4e57178c30e53358a6b29c963adcf1c4cd7eb9712236fa49a78b376a84460d7579da4fa4814648e5cee310fa8a5413469767ef4d0da1c7ec6f528fdf776deb904f291e374a78361a5a156c088d3043b3b13296c295a40435e8a151d188594e29b799b9799f7b2924755a82dcd3f938e1ec256bc3cda1583aa32d6d17a57f0428c9993e55043a6087d7c08ab5e44f218ff8f2155805f0fa51d9ca5a52daaee528f05325e8b113a9002d61a717ee61ef6f85a34b5ed153fccd1f03e22f7bf54b2844d191459307c30e411afebece84eb8abe4413a4b708913aef055de6a073df2231acbe8336b88b974f9e42765dc49a4719c3393689e856d439f339571220ee1c36822a8a7976f0b52ac22185561e2314e6e789fa8a79dcdef2223914551b639ead02286c93e70a8ffb02303bd8ee72691127440636eca8bf8a670cdf88ea509318b2be97020b8b35d250fdfa67bc290538cde7fd5d406f2c74c50511f617eb3032d251d1175c4f02a395a61572eae21aaafc48be858eab353d071f08689d4a73c89460852a1f95793cd37f31ed8e9ee99f1babc102632748f533b89c129256fcf39d695f2096cab31b42578f7066886174626ceb32289bee2fed8e3471cf9eb1275bd959cfa1b7929ea100fd7c8bbfa5c5248db81f37b1460e2c8fe8e7e95df31b94aa03ab5cbb53725b8fc43d793a19fb255b797a93cbab67fb53a01528ea1db7c22b364156e0e9cc7a9f7c65c5d444df75bb9edb1e2081f66400084ed5fb44ecc928b4c9636abcf2b76195c8ad78847be2c52a6207b24358e54d9cadfe5e95f48c2dddf25a2f3822bb8083844adef0de3dd85549995e7376e22aa83379188e38e2649900e155f94e3b0b43f8d61d7cd376b18cb4cbba7461a2bd4f8d49eff8b7bec7e1bf3bc1df6419ba7c10289c62a11f89f7ef7e592a529544376586ee2e568c2e1f0882eb5933b2df8683328aabf936d298096d61556c5e7151df069f311905278cd84d9895b92152c50bc6d8223f2c00f2942de0c1519b94d728fe2d61773e44deb1f62828ac3666cb61b47caa3f63fe83ed68c7b491a3fa4b0a05cc64e18be9f88954f3ac5bf012f3057da8627b39d2ff0227dd013a2e7ca247fa17616d13365d851900f0ff1f85ad995fea3cc428e2911992aff7c20d5802fbb1243e4dfc0ba26180c957dcda125cbe41b7ee95bb3d4c067f78e50e7d70702e782b11c62e8f0799f51d88cb0744923f3be69fb7f9ad44cb4527144fab7f1861643912a8e48a6c067652366d82a3991b76bf83bb14783c227b2710e305f4cd50a2b318aa88192c95ae280564a1b1104a90a97e67ea69d463f5f2145c924015776545998319ebab9220622d231928bb6017f60b31385b19e05880c13f14d276d363eb87b8a8c9a48356ffef9858b99c05ae61cb216579884c0ba63e9c5439c80ebec227ad02f1914eb31d72e14982ca723378b4ba3e1a6674a6198da5a7a969f149358fb9086b0ba15836ee6bdffdcf89c694aea44248a16e2a6d004f0d2b0d07390d6471f0dc0ce7c0dac36cbdbbf80333bcfa6ce40ffcb0714f9955ffa120e5d5e3eb09f625fa4d4e811eaf60631160ec4f61bcd23cbbaeaa6a3ee2e9850750ca74e45160076b59dfd674011d250a0cd4caaa2408d512f08074f9ae182f52330213ba27feab2f07f94ab44d5a195c736e5cff08bafa0b89df8b1e3a62152e13349ee8742578489f5249da7908bd6f96873054cc2f137cb55e821f7befccbc7283e030e34556cb10a84e0958476609ed44c3e718e24bf1a4c10f612a166872f36eab2d9d6df7f99670876e05ee684d142895defb7dd876ea2a230321601015c79a4162100b7f2de159b1c8da62802cd3f122820d871ec3d9105db26d9aef166cd084f8a51234a628e5831d590832a189f4f9ffb49dc7e50ab5b4c12e2287a9acff016cbd6b85c706846295726383a0eba1eb76b069bd1b3f56b0dafd1b24f9156cbdb1dfa9ce18952d94a1644b79f833707fac44be1ff48cc2d25609d4c16250fb530aafe5d9c4948656b0021f328bf5557d0848cb45a6bfd360fa4c8e4ffc0a97d0c1ebc2a08c63f0aff27402ed01a23437dbf08d0a9ece82f79606d1d30170ebfec6bba1def8b7852af355840a363ca158ed62b90eb68f56088ae9dca8bc5144a2d1158360a6631ac9489025f53bbcb43deb0cd8b425228f73d66af8c2726ce52fe0633a60cc200ea914ee93aefd96e21f1a242ae5402a8039912c5bc70ee7e5aaf2e95a27a787e4a2a343112166473eddec26e914ff9db7efbcc8c53b376a17c74b1b4287e8a6cd48402260135923fd2e6bb90404f87f06047ec27512914457068925e4eac13da0de4bb416520b3bd41ee6638ec79034aa40add5828d640b68f0ee3dd2873b9504e1f73613d2ea70a3baab2e1c2419a3e7f08387ae1886c3092aa2b21b266ebf0531eb60fbb74abe215ce627b01183bd85f0b13401c391c2bf57fd3a41eb2fd83a1feb25cc2e124c531ddc80522672254385c656af1db6d43696fbc53e80c26e3b5e041b0f238b959274895326a75dadb05d80059f26bdb51fa6e4560b69560d841525a1c403ba107108cb288c96df9219c7c57d08b38c337e4f0cb5f098b3ac24c3cfa38f3e5554a85ef2c174149d3c3754a98632e63c937c1980d766ea406e10c0c98312a94b1c1fc8e2248437b067772f37f9bd22e6f88098958c243bc4922b93321a212ee64ea8281ca250849e4ed864c9b2c8d0b629fce9f392c65f9c310a1aa14b14c7cf4ca9218c1a675ba5e72637aaf0b2d38aa380ae066560ae21695ab4db4dca7535245929f565b9ec82d1e0172feabcfafc8dec131922ce6693f685df9f8641e8625b4e81470932663b6b013353073719171eae1c20271cf938ec13e20c51699691b86d9f58e0ff1268a79cf42d775722257adf1b0eb50c4057a39a1bc1a88061d83a40e22c15d6f11cb9fec7da03024486034a1b6ba15b30141e3507dd39201b2134a7bf647a272fc68a0ad96f2db0ae1e18a2d042ad19ab5dac72b1c2c868359b971e91edeec0d13d3d876f3603a7a1a1717d2465ca1eb8cfa85e60a769adf6421de8b7ffdbf626a14d921a09d9524a2965d009a509520ad93def943dd71e0882a0d65a6bbded40d3bcfc89d92b90ebd3699abe3e3dcfb967faf9ebe305a540e904f3fa642674f85673ad69dbb681e430b969343976206ff22bee1e6f1a77e632d332bd5141d295966373ec52bf366e207fef0deb0cee83e61989e659cbb4949bb29b667c46e531ddc9bded24cab8163f8a52c1f3d3c9b5b8c3d73a74ed5b287e8e0ac5936f348728803a4e62e832e23eb974d4490c43d76ec3d0bba12019d7e1c9b7fe30f4ed247e283f89de5882f92897eff9f703358e4087e728808e9af9134fa77103f9cf519e87e23e859ecb8c326ed0dec87938fee01c35fee83cf4930824f44620e18c6be9346137138e5bf54d204f20e74de7d0b5a7f3e7a1a753a9544a67d75a6bdf2cd7d2261f34cdfc937fe38fec9a8eecdae7d3bffc239f50a810c887a006b5ae919189f1d041afe1624ece394a3cc1fc93d3cae938b936524e05a7e1888356fad93b79aec5d04111b5554e07e828975c0eeda1e3a02891723a70d413e7d8e789d321e92ac717d255e794d3a1c7cee5f823732390f0b3febd0212cea0b39d2d4875d326626e6934ff813d730d3be6990759813ae9016b9aa73897f11855064157a56a6c4efa4f40f35d7670dca07fdfe78d1018f21de8de68e98ae376ce3908c63c364890cf9e393f819c83e30fceb7f187ca411efba06b6efc5431aa144a2626068542a1322a8761186e3d68710779dd759ed7781f0de73a679db36bcfae47ce6d52b41bc237acaef017f359b1c4a671637d1dbb3878ee0ecec396728d46c6b3ab66fce4f9b77922ca3b517b9ecf0c05c58cc0ff04338ffadcf3bc13b77fd7751d384260c8a3b47bde0e5d3a04643c971c05bccf3b947fee897b85f71ce326d0b9c658eb301c692030e443d7e3e6b95f09863c389a20c687a38c155efbe7de0e3d19477932ee8d3f641c1c7fccb8a7c5fd8d3cf765c66ec6a59f54de0c4dcaaf7be3ce2a552a95ea7ceb52dde77997f2beaedbb66debbaaeebba8d07cfe77bdadb3c70dc431ef450dcfe2bfc8742e971c78001e3c58b9a1a1a9a9919952a959291898941a1c2f07402c1efd3daf3ba8ee372de369349d36464c68dbf9338a8ecc68cd3dc90f114cdb8b1ef5ce533a29438aa7163af3d46a73cc6654429716246d4d54179d78dfbe4df4a8f3b7be8386a284aff44cc4f9e67073d0f7b8e3d6f721018e2799f57edfab5c7f9f6bf2b203d8f55cd7008be65a66dcbdcc7e6d935a52cbdf161e3c3a61621896a4bf98c679a6e03c518f7c42fc43994f12fc63fc738153a075540f9c941f7c46df39ef6b4b7fdf5481333ea408d274fbb8cb8419df2934eedce75e75e8c77aec5ede3b563dc043cfff0d6af350dcabb71d3a87072b0f36fdc34a851c7e973f07dfce7da7154ad53dec58c29d7e38f949fc61fe107c4e653361fba749a1c72db4ccedbb67dbe7ddbf76ddfa752a954dff77ddf97e434ee217f7250dc360f7a276e1fdf7de3f6ffdc7394e8efd5d4c4ec548c28e90a35eed47f28afc6f31acf43d584de390a356efcdeb8b383de899887e20662f3dab39fc0efb3f90ffc3e1b2036d2c8878d8a7a2d1421215484846bfbb66726722a0479eb9a89de5caf9b6e90bf8e597107e1b13c18c9d97620024588c78ea4e8c9d12974199799f11847a938cfa2375d1bbdf6d4d093202f7af2b5a8c957afb1a1716fdcb69186a399f16d860bb205d982040932c3f1d89919dfc61f291ecb637f669474259372e92a544a268c41a1c2300cc3d3e974da76c0b8088a5211942618638ca7e3a2273f8f75909d170ebe1025bdc1186bade98ac74aabf43c5545331746187aead333a5cf7c9b40f5263b493992485289b23621274d2e91132d4c4445e8e0a4ca094990105111231be52a705959d065a970a077f693219142571915b12a18c5b0894364d4049bb4ca2bc9a8ca7c49a13a34a9ee5c23bb0101f1c87eea4de6b2deecfbb3e3fad49b5ae3b124bacab4d05576a2c18f5d12a70280e8881fa3a417c68cf0a44075c75a6cc906bdb1d7cf679efdd49d4c281b027a1590de58d2675aa88e12d5f142756a04e836b7fd5befbd53aa3a1cf47ef5fbd5b1277495391631232d0bd2b420ba839132a16c4966944929924dc988b227d92b3bca903e730d576ca989cba8c787ea6cacca67d85211235f45c79a68a28e9f97d113aa435fd851150c09d5d9f3070ba23ad3312554870a6143445407cbbc479c556481aee6880109a1ab0c07bd31a08d017de6d812f6c5450468ab220f0b42e80aa31836512f23fc60934a2f7269baa6111e16844cd7ec99465ad03428bcb08ebde82ad3b21f4dcc8ed0d5005c474cb92c1574cea960f3ecdd987123ae37d825c763f33cca7a83b1246ca9de98b0c9a45da026464c1ac65ed90fb6842561be89d7b157f6931dc95c58128f1e3e560041906d9c3ff5467583ded8d2679e05511d3a3321b025aa23a6ea4de656f47a93f9b66f1e131f533df63de65ade9853ca1b2b62bf229ef152e2e03983ae329f35c368306cfed09d9ad7045242759a18f1e4b32ce833dff3497d31f99db32650644d84f83d977c96b965edf9fa6cd22c88eaec2c4475b61ea23a3b454475f68c574275a8952a59d014bfb3259f51f99d35791d3faf19a9ba63af539b6cfc9129d94021ad0683b636acb5768ade36260c12a7ba9704cd63e74860c78441de905f25141263f7d52a27c7860db04b0b303521999e989e98a4509d6d8ac2f4323da1e14930571227c7a0b7a989a989c9a89a906c0a2622da5ec90195a34b1c9fd4baee94d5b2c05acc5a8b611886d5ba5959693725cea4f44da03a954e2b6d7767b5964e2b6ba594d25bc52765b35aa5c0e3cbaf889ebce49144124275884cd797ba5aad56abd5e7ac740eda7958b03e2fd8a40d0eba7a92048220427a8c1c1d499aae59c4e70768851df83872513b972475d2416ff9daf1001e394439ab194256499d73cefaee33a02e18acb536e730aca951b5800a012f01286733d2d9a91d1230ca52e8718f5a3d325dd95ab724c261c20372ea8e7b8ea76aac1619d8c8b22c8301b33b26a99152f5041b366ca4f0d4c808cb9be9d20410a434c636b02400f90c7903f3b9e1041bd65aebda0696e2868aafbe0b20b97cf59d8097be64a38a7247038f8d3d94b0e1265c4ba7cb1b5806ba526836509bfa744e3a634529a5f4ce2a6b67dfba58a00587192ba9f1ec42e99c73ca8904ac691a1675fde2e32f7376a43dc14604ea636e820f9bc752aeb0c94da03a266d075d5509d095ddb68b84430d66ac569ef39207d5c97245b5bca1beaa3b3936ea0e0e79433d052c57d4ca155d51973bc8e7b76fa7b5ae4b83136c64d6a4695aae42204f330f0ba20942724c262e366923310b8b9255abb5d6b2b028e50dc5b5ca363d25e7a473ce2971649d6312cce96301caa93bd9f8809ca31e52ce26b3c891d297d9e3f3809c146413fd25034af496475fab6ce2041fd6ab6740de9059d20927e000ba2d2ce140031b367048a0c7076aad15bb76c68a26c9bc86aeac6b063760251c7618a0ac3b0a59014b2a5118b61b17d000e48535bd0861c50705fa52290c4b32d185ea6707e10f9286c72864d6a083a52456d554a4e121c412a1058b8e2e6861a4c4a2a225420b16f672185c77a8cbf90c000214221615b30d58db9452ce793b2a4ad6e649c9858b13412c19a68b93239674fc0288f52208f939a86ea0a51178b003176b6382255d4f05d04fde90bf0022445992963339e88debb44552de8bdd8bdd6badb5b5d6fa025d69a5b2de8bdd8bdd6badb553d7d49cb486e9730b4f1121256ab556ea8371da4ae99c736a9a86691aa6697648ee9bbf2f819037d4dd53292d912e109748ee5c9f31758190f7f574ab3a98ae7a32eb734b2429b1ccf7070312c6946595ea0ec63e976572c98da09564731e95b58d4256c0326ded2606b5de20596f24ce90c4e99138d39176c86cb607f4544aead769b64eedeb2b2aa1b7e9e7a9f7236fcca7de19c91b280b488cb905e628eb8d072483deac95948ea39e8eedb5f6fa549dc925e8777eaa2bd046a9e7b5acb79a73b26049db6b6dc54a48547f9561eaadd5abbb10ebd8cc4197242e960a56e076bc4755bcaf7a33afd2266df645fa2999dce0e825931a9048a4974c6ac8e2ab8fbc518924ceb40065d5a17a73451d9a2c9317305a3c71b1a692cbc59ace4257841247f8b8589312b97ceace64cd1a458a124d5cace913a8eec8974ba8ee50304b7c2850dda14334e8a75317ed015f345471b1a6d31fa5ba435fafa524a43d917efa7c51a5e93348680e81a0eed4a17a337de8a7efa83b0a801204116b7a8f15e850dd91acea53ab0b071da2e3d0cfea332f9dd6894d935896655794d82b429f15e033aa83cfb20cbbb68e9c11614d12531ef5b2c88a2c7e7b5914854ab631d0a0a5db97455620a568e0b04939e7a42798206badf601ad14ac24ba377c41d311491005a22e4ae4cb14a4a3a12542cc9fe9a3e405c82b85d58c973652ab9aa66974caaedb439e8687c7cadcf47b7e926c14820216a63612092d477be9c55edada8b615c154d1d47a522b6bdf4ce77d690a9505b293396849663c65032474563594b851bd7c1a0a9d3d496e5725468e938aabc37094dc78c33ec6693b5f75e2ccb328cb1a699a4dcb64dd3c7ba3d24f390a08978aceb70868da7859eae43738a5269a2b362ccb5b4b15a2c4547b082a7e2083a18683aeebc6d39e78e6b696f6638c3b4abd94ab529730e0c271b95940439eae359637a0eed83362aeb9ce39c27983e8ffc44e1b6ac387fb39c0af8b1c499bedd39ef9d755239e7b45c485759bcb439b69726f065911555685e166d31657a8a7afd8dffda223d670f18e69bac93566f51110475e7e54d752394a27c7527be7a120e89b3445792fef4c8edd34183125dc9fb534780bafe8e29d055c54157b57a38032d3d7c4133d15b123d209b18765dfc61d21c0526ffb075f99a633478dc6192afa5aeb811693bee9c975a0f1be6b38e1986f9dd7457bf7bc84f89239752580c705aba3965596525c68c031cc344038c5a5552f48c996901a354554ca7a05a6bdd7288033b735619516bad5a145b2a496f7cda426ffc523c69d11b534a69aa6bcffd666704682230ffb5975c8efa33dfa037bef5af4dcef2a42b39c502fc86c5df4c798adffd2de72992e03ecfe5aead95e3e8949ac4913e459515bdf1b46e7aedbea659939e5aba9cc233471a1d738e33ff04927fc80ff9cdee213fc53d7f5b1a1ddbbec42f87fc46816420297bb1cf24eef690c7bfc9bc99344efc15cc21956635187ffc69abd8abc5c5a8c0b224329c6f80b1bf580a304b2b96829a61185eb2415a6953f34e3be78c6b0a0c9b13e3ba239d91376be05cfbc494c4d9e2deccb70c5bc11a169a098b698bb2e539f311b9719ca6ab1ae8c95d18ac2692bc9942ee60c7630dbda14e7d53193c6dc1ec625e31b3b8663cc5274cd512de9c613c4d4567190e5ef781368073ce224ed9f4422e261f292bb615c35c5e9772d2ceb230da738be0f1ba7eb474cab2220932bfd755a7ac619d27755d9ebaaea792d321fef50db33e368cb53ee4a5675267a26559318fa92e5a025580b2b2f1d680b2a4787de8354257f787ded02b94aa7f7d240ef5182bb4f47d7de8bcf7de7baf143b59fd3a350129d13c03d229764005713a66e744612ed90d0b52056258d3556f5257ec3535f19a4be82a8b8b6929ac6978d63855e1e2f04bc79ac9a4e1e9a2abfcca389c69a62de7cda4e16c03c6febebdf5eff53a3191fe1ef2d838a7963489d09b544aa7a6e6a3672a55ef356dd9464e01523718d771cb2464117e3760a78600388cb3d65b6aba9056ae256cb962418a81a492a2eedc7befc6753925699eca2912e706aee776704a4bc5903b9a6be374f9aef15b001ac62e5511f4748feb3653a7751dce3aec76b6ab741e80126134c689ad537afaf3f6c81b994f9fd3ed90bc81f9dc9ccad5c552f0d5a5acb4c3e394382cba82c9b5b6b846b5aa40b270d8c206fdd6963425baf24257d42d87c28bc7c60e48e250cf3268e95b53a212e77a95b49bd48e5213290b8b24c81cf31d754753d2344dbc92043cf8a9ac719d27f5d735a5baa3897f3525d55fbf9ad2531f39f055c7f8d5b79b8d53aec05a6ba5d855db29654432ce321e2d67d96af3cde4d84d230f088064d3a44c7ca06926d3096280200f908c310f0f900c2403c92653e8034dd3344dd3348de7f5a9cb9ac642660187523b4fcee982b0ed4f4e856c9c190bd3083d00b3a7fc3413137a2a7cce39e7dfc88d3226e798cfb9cebd6fe48408792fe71ce69953089e4e200882600f54d0c1193976312cc41493580f20a12b0d81b1a66d9ef213e7339f7bfe7ddc09623cea1377f85df77dde851e236ef0db1ce53868b8390eea85de07240c3790d7eef90637d4e6e1f86373d4f883730f480824fccd674e9c2aa74ea79c73ce323232324300f9aff3aeeb68504e0324c4210e3bfc9ceff0c3907362a9102bb351089d4f78207352b90af49487339b77be8928d7a2d7753e8373e88d7b04f64ff0e263dcdb50bea146080cf998f1f3cf396fc579061db5891ce89b73a3ee36c72030e47968578221ff8d268821a4f36d7f1ce8a851c60dd6b9f107e8a8f1c78c778e837e220f4869ba195537ee54189e4ea753b775a7adeb646464643ccff33c8f07dd98b5cea7779da6699a46396e48e79a87528f1b377dce43efc48dbfd3319fa3be5d82ca39e8a74efba773083ee8dc0f1efae0788249afa6719c77e2e75aac9dde3cd4f344fab21bad8ecda78f9ad45808cfe4ac004203e2f61419f1e32b5e15ae8f36836f11baba5785ebd81d3790eb6302a4dfd2815c1f1aaecf0ec098ad729487d93dcf599c91913657c7d2e619d79ce7397b97fd1bbbcf67c4bdb974957359fc543bcfb8e739d370ee8d9b4685cd3f1a6ed4a1fd63e13d979f02a5d79e3795cf7c2affc61f2ae7c61f32ee01d1aa6e9471e9a95026e6840a43d3c94d27d329a04b100487f8008428456c010296268c005d08a28a0c4dbce0aa01f865f9a8f86660f96d0212a8fc9784ff1c272108ff4d09faef8918fefb3ce70926fef314b8d667a3a6a6a6c62512a0f81acfc1b56a62b8dce1c7a8f91831621c81f9184e50f1318e7ef0311c05ae15a3c5b5c01755b4fc0b7f00d77a81639e668ba7f99c8606741a1a251a902411e6a554440e2c1a28aa7c0982cf172286e8a97284a759c0eff0c101fcae79700aa30741700a253c5845c983ee00ae05faf77ddfe72caef53dd7a2c182e5b3e79cdd6606d5a9f1ec39493a7c8ec93d7ce41739e79c693c671839e79c6378ce9e73ce39e79cb4c5bbbbe3e05a1e23468c1831bc015c2b068c241f3c0c6700d7828169686868687c015c8bc671fe4516ffc24fe05a2fbeeffbbeeffbbecf15c0b5be1a2c337c8ddfe05a35d82e81586278d013c0b5401b5c2b5fd981166fdd6de4151fbca559fc962fd0adfb90415ef6337204c9db2b54bc3dd917fc9e465487c6adcf27527eca5b0782c913444764e0c2022f3e7061882855e43045165458d665ddc19018618418ba5851050f5858347104682906299064616d49e4927b0ebda599e2696868687c876bd1f8e7a9cff177e588ff5c876b7d20088220088220e808e05a60fd6d6323e79caae58a92cf8ef3151e3ebb095c2b1f806b5924ff192b5cfc8c1b806bcda8542a95ca73542adff2aa20e47cf60270ad8cadb58ead1522de7a0ed7b25e836ba96ca4a2187dca6970add46bc9775de79ddbcce8a20cf15d8745e73dbadc759d633194041792b002072e9d900e3e35ec004396243a0f5f4701782de1b3e370adfc7d9efa1c7faf28fff90caef53911bc19d2048b5d78ebfac95b4ff9ead5838493b74e00ae65c12ce1440e86be5451d405f4f22050155a78700243109524b04024983ce803e05aa0df70ad4e4609215ec6575c4b06879e0ac330f49cd071a83fdce1c328577c36c0671700d7ca01e05ad601c0b5421b31517c8cdb70ad181cfee98a3fb9539dec27b739f9c973e8cef471b95c31609db4504112c5480b4b5d64609d5cd69d05d8a0840f0e3f50f22588258df027eb845d22c6ef1926bc3de1e6b76c12c50ddeba75aca318e2ada79066f0d61d298ab7be0ae2ade74811e5ade3a092c35b97c1b5ac91cd6797dbc667d9c4c66f79f4b905177c643082961f8c907bf5d9733ebbcc2e5f9f7397cfee307c761c51c4f07905201011610b134e68b08195a388c1671fb9564612b9d609c5049747b9732dd412537cad5cbebadb54cfa9528a7cedaa52fd6a95c2e5eba9522554d0ebc9f73c1244e5ab92af56bcd193baa794af2eab14a1c80727448e2c0962ad82b82107341c51fa210b5997b42083245d9e28ea81354407518ee0021741d4400516d60948c2b8208b1640b82006d69e422278614b9218f07045124cbcf0a1dbd06370ad10dbbc7599f3d65af718bcb5d661702d9bc49fa4e4f0277fc1b54e18054e00e1440e497000c416acad1f04b73ce8b8eefc88028a1e7a40420720acb04029353ce8355c0b9cf9cf6597ff9c866b7d48fc0e3fd77cce7909167c5ee2a50496cf3ec3b5b2eb54a10421fc60032d9c70c2dafabb4ecb778eebce901b9a2062a506480429e1024b0928be7395a7b85645227a6dc5cf6b97e15a3acb93e7384f71ee2b8edb7283e74e1ccdc2790fce7d709573c9590183e73e8e56c16116e7f38773c939e6f4733e30f202115e4cb4e4a0046b4b221c47d8608a1141495831e252c08396233a001551a203e7b2ee10e0092c86c2f8d04509285839bfc32d3fbcb55b9a78eb312926bfc3277ed7dc6401a345089f45ca5747e59cb3670fb95696f15d161ebef313d7ea40aec519bde7f289f7fce35a1ea6228bdf7ea3e2b7cd5733a84ef6cd736cd4e0b713b6cd7d70dbe641aa80f25bd0e6d3c7c8b64da0df1cd79d0b20b900032d8a38e2081eb0362250f9e188072282ba8881b535d1b61555a1c3779d6baed50d5152458a107200650940c8c0da3ae9ad0294889030c413469e308265a36c79eb1ed7b2aae7c03ce71dd7e268866240e4089f20602882b5f5d7af58bef6d004104992a4f8c10c589509225f9de35a3553a1446b0ba2f1a6231768575e735fcdc8d1dc46135cbc76c26b3d68dea3ee6096a6713958e286303cf842850b581a163f74b1030c9410e5c0dafa35975b12bd268d8a78ada8892504f0d635ae65b111bfc3af5f5d8339821335f52d4d2a615ceb5657fd4257d553f87b47cc559764a0ad0da0b5e1a76f30cc53d002815a9e825e9e3ae82202bbf80dd21b7e83200882e0067b9e821b047a0a0661f161f119e0f7b7f42d7d4bdf57e5a97f4fe88e2d628b7cdfeb9b49bfbffded6f7f3d4fbffd013dfdf637f4f4634233a16f7eeba37a335d2fbd9ea2b74ed2f2d4f513ba53abd42a5a7339d25487df7aebadb7ee79aab7067aaab71e7aaa99c81a4cc23cf56a134fcb37f1bc3c758f0b92478ffcf6b6b73da3a7eebd3c29de14afca5397dbeb79ea79de0cb2c60c61beab3f5dfde9ea4fd775dd13ba5385aa50d771c1927f7752fcee7697e577b7bb9ea7ddee809e76bb1b7ada11d516b8da02e7bfb94a84ab44382f4f9de37205476473421cc7719b037aca056d9135b684799abf28d19be93b6b79a5ece5a9672e60b6df79e719e677de39e78cf434e9a9cb9d7b9ee69d819ee69d879e6627b28693304f376ab451a38d1a6ddbb63da13b740a9db24979ea5bcf36a9fcdee614bfb72ebfb7bdf53cddf606f474dbdbd0d38d88fa60a23e9852bf4d4226219390c91483c96432994c263a834667d0647e6b3fda8fb6b5a5a7aeb9a8a6699aa66960640d30619e62eac2d485a90be32378e3f9e437de1863bc71cf53bc31d053bcf1d0536c25b392ed2c294bca92b24c876c673bdb5996653beb799aed0ce869b6b3a1a71911146c42c136f6c25e18754c88a71bc3300cc330a4a73bc81a7387307f836ed00dba774a95a77e9fd09db964894b089788dc57e8de2015c81a60c23cb55fa6cbbaacb5536c95a76e9fd09d6984de4cb72ffcdb6efb73e5f7b6dbf63cb5db023db5db0e3db544219035b68479ea41aa92d212911fa16af4d4ebabd68af4475fb5b4640d30d24998a75f9eba54a253aa3c75fa648a149c3038b2c6f43dc13cf5a99463e5e96f4ae4a9cb4d7f84e8a63d4fa9cfcf2f4fef4f578154c09535a6d33d7b9ecea0a72ee79e43488f59576c417f4f224f7dbaac78ea42e40d4971f541772c4b3eada137b30b98a7d453d473a8a7401d53a736686a0a5be4a7a7a8e893972a3fbd1ed51d0ba463818e7e7a4c11bd2dd04faf5f9cd840c3570c14e4a40619fedeeb6e3323e73ab141d20fe0ab5b2c99d0c1dbd6cd4864287ad79f9f6ea2819ef2d34d32e84d8d7ebac905bda9d04fd7a6e84d7f7eba4a09bda9eba7abbad07b26fd749592def3f5d333147adbe9f909bd67d04f5745a18dfc7415143a48dda94bf8ba4c5d1e84f057a7fa75095ce7e1e3e2ba246795af4bd66585def6535bf49634689510f4b6aa20687a72bd157a2963884f15b490938888868826188a455212ae570859a5a1a1a1fbc5c808c342772ccdae1819596a6384adbc5eb3ba9c55db824dd8cbcf0654b36bdbba585ab21bbfe642774b7a6346cc60e4a56f425467e7225ffd0afdc6b908d5d9d9955d54a7e7024daf3ede1148e849e9b66fad4dc55cd1d86fdfb0689a747d240e0ddb3ee63bfc5df35bbe6c4022bde56b078f2c735d77aa7dc91b2f3ef31b7485a8ce8ccf88b2cfe4fd74ccb034eea02bcc53da619336ab9713a5839e5e7f5b1e1b0ca2b73e69b53515d295b5f38192e48d03bc8076dca4ba93233556ba4b6fadf5d963c73cf2d68fcc1d3de86a8e34d4e5f3a0b6c70ebaca9137d631ce01aa39936b794adede7befcd3c21bab21e445774f6d891c303071a93b387b8637e8f1d3ce69cd485deba4422a7d84215fab9b3a3ded8972f415ff71df4c6bacd9cfe0e87427b40d9683d246f9dda30ec58a089382e9b7569b357afaf2340a1d65ab3ead7bf68f99238d5332b6632f3803c1d6c26c218f27480b1e4ab57183e902fa8c87cc32012c0926a28136b86ecf82249e254cfc68d87bee65819499c0a836854922f3aa177289442923815e8ae8c5646489d304827ec41aeaaefd59317c092bc917925f2c21ebc236110d5f16c203b23ac00b610fa2ac308860096244e75b7425b91fb9138351b3ba399ed017dbd3e5f7d9b7e9e76d751a856c613baaa325ea30c23d4123d7dcb305abdb22d366f93db17bdf113d55aabadc9b625dad4d095f44dd27be7bd956bb9f41a0b48eb823061f296bc256fb15a4a29a5893a1d6344b16d53d64a6bd6554a2a5466abd7618ac66fb54e3be9c579e95d0bf4ce33321dc04bef58a07796b6d23b25e64335d8a86f747a3407ad3447b54040b5e6b0d75a9be362f7de9b03cb7c7c300cc3b08ccb917df5cdcb5db4748cf4d5a7fa50a257529a40bfe5ab95bb606e02d96f9a9cb4da8b65b81b31176cd266cb2c484fdd73e9db17ad25e5fc085078915d5af34d4e4a3b93c9b739e72aa42bec14d750526ba7bdd6e9db7167e0370f18519d3a00eb30b05bd1c7145148beda693731638ed989b7ba85d1da73ec3e5e75e73a761f47750773ec3e9092a8c0a8aa073e8c903734b7a135003eb4bc2d415b57f5c01369a67b3ec724d7b5d3e9d3357943f369721a4295c650bd61804bc633c04543882200fb14370df1e9d063c76820dd914650bdc157368da0a429f486810403a9ee4c168c240c60ee79e530705d8f3e88ea0d764ff461546fb06f56f4561da1a6d05426fdb621e2de8648e28056f4c659a2d183b344c3256f708e9d460bf286e6384b347e6800611f4d7c18d59dc9c22e6b6a4ad2e9a5553df0807e4b28401b489237fcb14f008cb6be2514a0c79eb72ef434390e17a9432388ae308d1e70bce0e0f0d87180e48dcd55471ea0d183144d6804511d0f30919e918c181e6fa30c9f0e106de30a9ed1173db91c2ffeb42471b06fa62b4736448f5ffccda825a8fb209a0aa02de01596e48d1751fc8681b4458c1e3cf6cde234517dc340b24212a756df364419b775a1b7eae8310c27a48e0d118571246f481d9b22b9c2be614c79183178ec307ae40d93c34012552f8983dda64825e5b163b721a23aaa2852d5020c2489c4e5b1c3407aecd414be645ea651e592385bf87aec97430186457aec991bc063d708f077e8b16fcfe8b16f38534e750400295edcd6859e2e89331d4749e2e0178f032471f05e29e100c91b9d63c751c216889f99b2527adc8d2b28491cec6e85e688240eee94b89bc7d8b789e8b1aa07fa478fbc11e3f114a3c7ee83a8ee50c73e49b09238d873ccf86d4ce2394ea57c34a12b1c681f46a30f22bac2ae8d7bf5d8514b34f52da7103d766983c71f320b5246553e6c5c13ae09d7846b426108fd9605cd92c3b1a4b7e733df3b4275e61c2d5da97aa05f1cc91babb79dd15b6b335ddd23df17e9ed4db22d1cd42bf2d631a7ee15a13a3476a34163630a74659d8e38503fa83b2e6fac5b6c77ea37ef67f47cdc334257d64f32d8db167a7b3edecf14bd1fcfe7e5cf97d7257130d7c2d46e20b20afd157a1deb0fb0f33d9f7a63dd7aa3c7a0b7e7f3d6472cf4f67c3c1faa438dfc1cc9211f89174475b05bf7947842544708aa83f9d012a2b739e453df5e93f78cbc279a6fef45b33d299404d828e9ea4e1842573615177a890a039cb8b83929414f97abbcc49852f20c1483526afd7a0c4a299d61012a236daa2ba6f0064a295531d1d329a59472793315d1f23ce24b26bfd1222e84781e8a42f7d4a728abf8cde6294a2a7ebb798a528adfb04aa7b44f5f8e7b0417494b97a2a56f771483b89c0efafb022fc5cf3868e9578cf29b69cb5ce7e90cbbd6563aa764a2c2a2a5d3cc177f9b7356d75ebeacb54a151174366938c3b8db759f3d1db704be33b24bd88cb47d59c4c50c7cb4e90a20e80d4c12cd82dfab17972d7585e71af4f418314a90343c2a8bfafc2474ae60d2a9b4c9398bb0c5a4dcac5c98968c1c34f5296f581939e8296f540bc82b8238da7245064010810a4be23ce50d2a23073de58d2923075db1c4136718538be1db755bc853ffc156fd0a3d5f162141445754062dfd05616c88215baae1c37244476103cd29318396eebd2c5a2afa8ddf88968ebd2c5a0a0213db3cc27e2f8b969464b156ca1bea3f9bcd4ac60ddab74ab10dd5915f5773524a29a5958a41e86ace1d3ec5300cc32890f0a5d3ea7dd155e71a2a65b2d0605b4232e7d442e99b3a5bbea4945256592b3d0092cde2cb4f9793165991c5dc7c8ab06062166951647e734eaf548a3a661042a7badea5f41cf6e59437d227c598ccbc406f927e3a6640924210e28521a31d868a98e201310cf1831794bc72f0c21020389101080b1f2a374cd1c3892310e1dac20b11a6b0a64bd16a485abac6845e495725d12a1e6855107acf983e038623456872e40211481069c0134655bce0830c4c8e58f34b103d54820043e585002c5162440f8838a20a2cace95494005d497ffab2288b1f5e95032d73aa0bc3c1841f6440e4495603adf56019e8ec0846457f3a6022347efd4c49c9f002ec8324ca949438c294748614039db14ca14d576441b002fb01b7803da1412170d1f88515815df9651117383062cb9994c96196bd2ce24207bf6da815db6b6b7d840e53352798600308ad5f167121c2bebcf0105c8e927041c292747e59c4050be6840b182c8bd67ab00c3a3b9265d19f0e50347e6150b466250bd2de67401afbad756ac62a15ea1a1b498423059dd25b68f17bc5031bee369c08a76c18213d467aec33e8714ae9f1bbf0c9f5d80afdf4e902a980ba246b4c97950b18bcd46260e4053d5554a10206ac2e5ea24431c222888929587bfabcf409a4842d2d604184293e7c29026bcfa19b25a4b84204111980e08545c413362021018a151f50d0b3c396243f58a20561587b1e85f93d9196f07b1a2d49302f5dca94b4f1d273ae4cd1c10c5c8860790206560a756705223700e18915234148c1925980900108095c60b8618a8c32042ca8304183234b7461499f44a6eb07268405aa83b9fcf2b28b978e6316e1a56b29e472b968207d26511d2f442e97ab8874c903d30e7f7d35e3af6f13701cfdc5f7fa96528efefa0a4780f25756f99b74b7f412c4df49e46f4f91bf7b1af981f2f7bb414afefa9e420ce9dcd9e4afd17cf23775af4fa42b35fcad3293b4fcddd3cbdf25d7952fa8df9488f54d7b8a1839f2d729900ffe52247f2f55f25788bf4bfe3a25ca21fc4d9bd0f8a6464fa894a3bf4e91baf8db5ddf34896af97be912144607f8cf7570ad0f09463c08822018c341108a250f66900bb0c641f00b9ed9a864eb178b233daa18a31101000002b3150020281c0e87c422c15894a479b0f7011400117c9c426250188ac35196c4308a20448c310400420000c41018a921991a0404043fe76dd4933329d57a75cbbe7a92bc60b4b911826b1aa1dfafed6b34c34301295b18051791d54a7a8f3d8aad94c7c2157758223ef369306911c20625d0f4e6bdf4683f26ca2e8b483ea443e13a22f2274cc00e791cd9503eb20e5508354bee3763c54c142dcdf12e70f7d6087fb8f972eb84db144c7dde92bea4227d740b7a1888098e3a1d0baee376d45b07551d4b8da7a53de273a7e44c5bbc533871201f95068da609b04a3305d4b6d7510be34062afe3f5e0a83b7ada30fc693e6773f8de5cce4566780124f1ef5754d6b328476e5414b22ef5d4157b44faf88922d4cb9f0ce4b9a344086189e0b5ac2b83563c9d06cffe391e01172f7a0c4f10d64a1c243bb807a66725e0227d1a97caaa2b2aa26fb32bb9c62fd63611386bd0560a86f4ede8141067d71ffe415a6476c4f9b2a1a4cd4fc8cb43f22816237052aa39aef3e8b4a65bf410f1617f9c263b6e5d147fea316802f0c811f1e9524e07db51cfc29d27e886d2c736e8e36be648e434f30d38078872c9793c74df549fbaaef13686c7b7e37819be2713b6c48022debf8e9cc314b9f7aef20bed82a2da1dbdb34696ea89c8cd65d40f613b6fd1c0f5d8abeef4e2890305dd04629bf0ee5890a20859ffed25801918409ee700a0254c45319c54f38607c093f9098a2ccef9585c74b9fe8ad3cf91fdbadb85edd32c440e57aa046c9aaef9f76b42cb33576e0512bbbc11ec1deae0a90e7690757d172d5c3b5a437622e421a14b553e93c6b097fd98e4cec9adb6d8c60488f6d7a9923fb16682a1b04a40df66d54b928a7755419a314da22402896916c9c85d5107e567ba69f83fe21f39f552afe87766343afd17eaef153e6dd9cf01445bf8ff19d4fc52c72d161a8d5cdd093be95253245b73dcbbb5373973e33dd94316e4f09b52868777dd7b62c0c793a114fca5054304beafa3185c591181a961b3378fd9dc5a67dbe9c25c50b28435811168c9f33a4760925ce10238c16829afdee41cf1a3b27837da073d0f9f6faba80206521da564464e9e5b6f136ff78e2d42bcf575672d57959c93ea682945008000c432a6069151185296b6f5ffae2bc4f9b5e4292459e9091e26238c0337dc139962e72d31c668c35fedca0b65ed7820c7e2a6fee9f2e87b7405ad49f05aa0a63024d8c639b2ae8d3c23df6f8111ca45a335a15abf07f6b7c0f38a889aa16cab78b155e09c23ff28cd2fdc01a006887b67d309d661f11c35ac83e9fc9c311867330d359122150fb3ccaa082866aeb616f1130de3b02cc04a4ab715632e8959d83450b83d0ed9c1a3d995cf0733f81dcb09fa5c2b5db637ee8f54d0cdcc89568a5894debcbe6c4a70f99295ded74df19f81febf9751dd29f4fe1b5975568af7d734d0a3587e2ba472d63659b15ff7bbf4a8bec958aff26af20a3e39d2973ef50d3d767245be1f2fc27d10dcc074c5d2073e35988f83d5793adb3afbfa52043c21e2e6510c45972be5589865228d82f938cc4d85c1bcdb8b9931b9df0c118735bb01f88f162280ff725819a469acf22c2c212f28a33ee79527384d81b6cc38601d78cfa08e73cc636489b2a464d98ab35f5f82380b22d47f37b4b396a3cd64c6266d2c5d6b1d9453266acee6954c6e21381cc4779e2d0bd0d56a63a17d497a659022fe59a026ef248a5ac5b5801ed63299465234e6b3741939827fa233345d41183634395deb36734e4eb78a0d58ea9f55501e150c0e0502a8e065aacca3449aba643b7793b3febecb4fe504597ea46d154debbb3b0973b7def774fc9279dc43642786d3c5d18d2da246998e7ea8e2f17f559ba8c5e2b7c12d516fd9ec6f9c379cb8b2111b453a6b1ad65279d21d22e673123be3f79efaa82f774601e398da44ae5f6b7a41d2812a2a70736deb6d1954ce7be83630295660c4c56638a3a8f04c9abf19ca174d5486dc8bac13353242805429bad6e96a715d929f5ef509604569b271c66d2c8bf43fde2b31ecd4313137595eab06b0057ee0b592d30ae6bcd61abf37666681e982d2c2e1190d9f2cb727664bb7ed166bed2a14fa32916d041a0a93f8d285d5a2474dfe700778d8e9912ce5580b27e338cb3358d83bdbd21a3d1848fbc01b1890e5760394095f577b86389027349ffd54509af2432b25ea92b8c6293b8ca92bebb7fa1d5a8f5eb0d955d8f51ea8c034aba30e41ef2f4c70556ac9a5af0dcf9613aaaca3b996d44a2d5043b3410bd5693bd7542c4ebee33879836ac31f68ad416899c594c9c0baccc9d67123c9fd01b40be1c4a40c5e5e383f7a920b1621c101c782a1003fbf53ac7029f7b396ad72abccc3133affbaca4b313332e6dc5ba366265ae1961495d8d444be6ac9b97e1a68cb8a1a896866ad2bac6440b8a5c12711ec8d1d4d34144b40e5a0bc46c5eab3566b96fa6f59221ec913ee1048624f57b088f3909d87ad419dbaf689381ba9aa7c965e16225c5280f1e38fc794f4dbaf025f84082bcd40cf9ae47c00acd4f0cac009345f2c8066a70838d9452285ea13536d8d3b89d7fb654c7cae4addd0cd5c142a3b088e425da25076a5dc0763647e25b7731b5a9bcbe4da428f12d092b894a127f3d3598d1b81febeb6c3ba426c10a13d8b1af77f155c9bff3feb94796c6beb58c9edae75dd2065e5e358ec281d4d82954a919f4cccb47a2e01613618e6c932bc729e71442fa3009081ad012931d63a6fcc083f34d6c8196c33231b231e80cf10a8f481bab72eea2b2827d8b51a853d8159c3b3fe203c388c0055c94d428d63996bc94431c2aef2601cc611c3031ac3019871492453e58c6b0170bade606548308bbb438c5d0712a5e35a910f104e18ac474e3264989eeab73ed6cb512c12721ee4cd4a5a5ccee477cfddf3982fb5fb876e1aa09523834e7f99fc1d08650ab8aa0c2ba3f3daf6ad0adb3f2054b4a1b8b764e77298934b1c140f47968c3a71064d2a5156ff38bc1dde67216afa4c240eee104f904a004b2e518d4aff9ead29e395fa4105570e01d6fc4085250280892cf0bd771fff4f5b3e6481702d1cf9577e13282f54e42ab1f9102fb8a7d259cac18b476120d05b7c292963c102c91fbfea6490fd846f04667472db6b4a8003f83c9cfb8538d6cb1d9281ba62d198dddae84c4682bc515c5359c2f8c609b940bf5de6395030df7aef6ad789e1bec08b4e493c70ad1498db711c9a7f747ce931e6f8fe01ac07b1cddb07ec83dddb30437e66195ab3b52a56b1cd057134f6af62133c068b3a64bb72fe0680eb9da695d5ee577e53a9f9d17ff722d3168aec7cba37ea7b5989d494f573814fb5f0a3c022de6f48d0ccdca1356707af9d7a7322a18e745bfb0517f95d6400c598117d616faca5aeb2731a8753fcfb827f39d6a8bcc0a009270f559bf89e7f2869fe232744627012b85df66c7acaa5395729298be0f9164eca377bdd343b048af082fac13dc9c2d35163234ddd6e0f1fdbe97f558195cfa3b5edbb9528a5ca3a904cd18323bc0d19a3cc2205128a2249157ace0382c495f5f8ea4926f805a84598a394c16b7a0fd2a0f0b453d177354708fdc4eeae28b535e80eeaeb8e807392d54323ea0f5495e29b6f831ae41749d5bd482ec31d341a883a78843f01d75494fd7e45ae36571f57f8b9acfca24a6766e19ae8ce4bc8d3415147151f8c7fc992c46b1f964597f65d614a8e08dab651983e3f6347093e8a6a14b8637b91b43c047baf0d018c231c1eb3d2b49aecb08235850b367d7c95b7d8cfa9ed6d20d04269348b8ca301ff27f5c367ac2c7524484ddd39026f02c3ffc27c49e8be9747a3468ec986a8b7abe6b58facce028a1399c681e603fc9ba09470091c3e18c25ff3eb6e3accdcc49eb44d45a25cb67616b17e7f6b8be117a299b588c5b747b5f49e976328204ae12f2af75f607bcc8b0f60be3e3af5fedcd087ba7266cb48040d60f8fd5d8b5d467f350cf11b8f7a71632cc5ec845cd771576cb1ed0a374856d3b277899c4d6e3a43481e5ffad68d05612e313915ec969eb11634a1b31c26fab0a74d388b2a92b32c7d33231667cba425cd8388fae5467f6b8d9667c641edcca238b362a96371a86d553b9b4c1a5f744db93e7b932d61171716ffdcc3691a1c5599d11d9725bc52991125790a04aa46eec777427003bdb87bbcbfb3c7f8c946bce0fc409c87a26ea8f06ba26629320b2b8aa2a1ebeeef9461b32815d074b9dc0c79f0026fc6f1338e957727f52e27a279bea965f20467b9430e29589225131655cbacdb7af462c2890070b49a647e696125ff9eb860e768e8cbdc88a25cede28ccb849729ba0dea27791fb614bb82ada8eacdee5ef110347fd8f35deb4ff92caaf6826fa15f268d59d36760ac32def2a7fb289050802094180255a0d10384de47fd7ed6d8eb81fb7d42a7bcb5c6ee1fdb37fbb8261f8de97174d9b4ae597bc1858d027f28beafda68cd2ec67646e419eb3156676fdb84d8b6e3a9308e02099044fdd4fc99e2e47481c54f78cf34e7501ff6d49b977a6cefcf67a31197f51c4a369f8d47f13f12d05ddc85b0c182ad5ab3340039104301a44195022bf9d5d36bb11be066dc87176f013b7c40f983d1d25a34cfee3d15c20d863acc71740482130e13e39e0689c2100c6753844ed7d8222a1070a8f3d230da225e4ac5ef30137bfe7bec2f2719cec6dadab6ec47fcab2ebcd597c5cf991cdb71178e81e7858ee32f92fa18f1cec1a878cd8467b09584c427290b422602f058c542396a4f2156ab7e2f3441a87f56a2b3b49e4c6aeaea6d0d6735fe65ca19b85ad1c51eb2ef26a8c6d1e8757c81ff5b92b0d3cad40afb252f656584ee30f9946bc672806a2c86268b64e087e440733e70084e9d7ac1decc418c07635bdf0c19230566770d8a3fe7f507ffa908adac62d795a5356ce64685ec4dbb662321303c4c5bd5a17211ce49a3ac9a61b1edb2b0dcf11a3b1ee7e31257480ffb8facff16790da9b1161ccaf70b582b0dfedbf9a202bfdc24b9f421a665435b1f87e4e4f487953671a6c520fc1c2886710aa15c275cdcb1151ccc0ac2c80f124677dc2095392f1cf135cbe39fdc11832bd044298e336911a0345ae56210603506f3c83ae07c12f2c5c057fb85b63780e8e4428ced512b4bc50327d9a8929acc36a63cdb9f714cefd2d4d48675419030c0d7183f3c2e89db50dc48e891c466ba40882f2bc7884500bfc2896fbcc0dea26d58ec085e49d4cdc6e2034a4d6dd3786bed597b52a2c63b6e3b29bc2423ab0811d2227ff862013ebc1077e6acdb702c9aebf59833a36eae241fbe38f4f0534e7c5450c0d60705964f3fe6aaa4124282f97576c896702240fe2b67bc309d2868d886bd73b8942a774e3f73f312f0c41237537f323d0c5e8a80044a389c248e38c975cb1157c2997ca9adfd622756c8ee9314d8d13e62fcfb720389e893ca2022e1a4f98c15f92c2c6105232453a208522a569560110992aac4cbf566d8de4ae3f9f2287546326cf8933c301bfbad1eac9b3110b12f8fa3c691ef3b6e783e3e2a0fb68bf4c5f7be215e5c242b658af4a74094454267b17ab1b10ea111197d1da0aba645b515b6608334055db41d86e4b103199813d3c5dd36c1d1e86b249042d84ffd15c2628d620fe06656d39240e8d4c1ad038af5dcb79779c21f3df0a8deafdd8075acc67270bc77706e75ca36a52381027f69207f0b7a1f7c6eee52fa39003d47e8c35305e8a3e11a4f176e5ccef6db5afb8aef3cdde05d922722d6b076f6695819de4b7cf264d12f2db563bf304646670aba6751c7dc71fc611c5a90ed085859f46e1e8b7f6fd3220fe02e7e4b268b1e012f0d5e8f49622b151cff6f1388d0481fbaabf71c39ce67b992f13bdd45f9d74301810432106307e3a63fc84cd2f7773b921250e871f37f8a6089158a5264cf8da101db26d251b09cd4a463e306561e4649c6f6b7a82815c27521b1a32c24529a0c01b3c0a019de904475fc6eb48ed5d5e571be44411f1d1be0c2a9bb60b809b156f03412a2525af6a222843aa275d5a2930356eb34d3d6b702bfbd6ec690863a529f25d264762e5e9c8f355a10e93a28c7d6c29b1485864cfae6b877d16dc453486d7de53f2ef17c3b2e59a6cdedf95c58346dbedd8c4a5373fa6bb4a753b0c1d7e0998b055979499b5aaa94c138361fbc5923bc2656cef8d39075353603d20e1b3aaea06d6723acf13b63f83f078daab23d952bb652018eb30ec67f74a80c6264cf86e8d223111be89d4111d495f733c000d6c16e3503c2154ec8f0792a5265674e6b7986d44d551429e2fc54e709a79bec1057cc3efb0a1eadee3464889de58672252a1c8bf865d35c8bb191bce0a00bc124789aa117e0366e864f5580fbee9f0662c4df240f7853e3cca60851d95706efd930b8122572e5d2ec99aa125d7ef21549933f11c02be7e159c1797d7290be2916cf2f86ea22815de8fb43bca76844e490d7083366b883e03c78165db7c84846761778e04754177b0de500cde3dd844ee7d24f59b0df397e52467a191021a9964cfd77be0abe31468678af3d7b2c61df8c2800dfedd74ec860ecaf1ef60c30766e0e6768ce70b89111c348ea3aa4be35345db63701c8abe4ef2278b0e0f70e7e5482d7bd00ef09448625907680d4609d25db46f63e297f94d63ef8d49e656692e7fa1e8786d3a821ccdd8a8b426f876d08aa8242f03b537d39224432214cdd4d1fb5b41034d0e07d3aa8c919209f6fc1ba531a9f86e5a87953fb6b464a31c49ec1623cc264447e098a041c2e1aea59276e354e96fb48fd5c57503981b4bbf8dc95c3ebd8775a63f3f2748c1646b9e86091eebf63882365cdb9d0977f7c3daee0668ae130dbab710490048f89e3576f36be01b6a33c103e9b9db12e1596427b7c6f0dcb93dda0cc0612d00c456ae545afdc20710a220a11a87442d90004084baab15f4d8470b7fb68a03d68c862fb70e2b0cf85f38f132df3dfeae8f60fda7a4e71743fba6e83433a68d7237deda36c648cad9e6c964eadebc0b77966525f81d8fe96bc1b7303febfcbef43d45d52b0021ad08f153c50e51896462e66febd2fdc9802217e204a211fb6c949fed3ef41bda6f049a7969bb3f4e049e7ddd450a1b6e9c0b03cce86a4add338e51eb20cf67c093760850d2002b8d644b4c3427728102cdb67bacf236c01ac903a94056bcc8e0917bb7f0ed6142d01f03314aa303530398c3e171993c58521d639627bba9cbbd07071aed4739d229dfe34726f5c6b1e3125d66b9cfb5eea8cf4213d20447486b46de0300277f2d4dcf3c11cfcc0b1fa76a1420b42331ae161f41add8ca4ed9efd6b5e9c586197e08291e06f27f32b166b78a5557e3026dd32815e1d5d2aedba35c7f096dfdc714846cd9837700ab34cdae3b885cef1eeda78af936cb6b6e932fb7d4d177dbad5b2e4e37fa6b8b186617c9b4706c254047111c10481275a4b6236667ab9846d700c6e4ce1ecea5fa02987cbbc62bf703a29a42b508065ba5c1643d7b058016509f8a820a696a7209e2c4eb9ad50ebdc212793e60eeecb2bf0ba967fe64d303aa89869e104fc26480192b0352e262c9de4b20ec28af4e9c9ee422464a7bc4316174789637321d3a68cc2dc8816f24d73f1ac16e30c367fce961f4bcebb8a2fdd0d2266e2c6bd7accd60d09aa4e2f29b1e772614df412456a4c79290f55118384a4aa3f2968716a9708cd909b1ff10e97a889d17d85b0ee29575803a67e34fab925678700e24f99f87c32dea79533f1ab02e50823f0e92c298eafeb7f3b208f09816ade6f85aca52836e0cc57262ec6b3d7b7412b948a4fba9b1d7eff6dacc59766a12c93b12f341c4bd426e0cf88095c01601f87e12bed054677a976852daf4bd6571507bb9766aa0237117aed6b8ce04da09924061b0e14b445d00f34b5f99c26935ec2f29a7f08661699990a79325c1a0dd50161069e0b738be6df9ad6bbc88136f3306d9a84a9c31fe945a9900f03a386a5bae4411052872ddb16fba94058cb3afe5f8c65c0f6751309bef7786a399c334333098f3015012f0552e49a568f4f535502aa644ab1673ae49eb44989675190d20a72daad328115fba001a1bd68d979c99acee5bb6ca8e4942b7f3ad8dbc3ab5c7f6d77526a65243b79d6adedff9a6286d9b61bc5d2652270ba4efeb47167df34444d601500c0d08057c2ef974497855f637e4e6e4b0cab20f455afa8c7038d6125278d0a096e44cdb9757d6e8196323880b6082913776dcacaa8dc249b0cd29a3bc338c40d773227d6de20d5f14f00a8eff484ac725d85b79ef309b729d8115274bf1b69cc6f6c47af7feaf8bb023a56f92a4af5e45b7f0f574b34a26b9a82c9cacb61e7421ff5403f987aa3b098759275a66f1f63dd493af9b6640976bd59c90773a4cc9f7d86c79af7a87683a55a5fa33316bf8efebae5a950ea2544ea3c15949d6faa623539826fc3b631e2b7d923410cd7c13297180391cbad3ab9eb79d87ab4d110032845d398fdd064b8925e17b14cc6d9af8c62951fe8b722291f17c78dd696984b345a446a9c803605ab11ff2078a9d4ae6a12af9889dd1c5362159a6cb0defecc3f667f6c4e29b8e9b4e5d59a3602ab0c299ea87acc3804350125797b8df2981de4a875e91342d102534444bec8542069330d626fe75bb2337dce1a268519294061ac5ed2b4018825affb618c9732869764f583231911bc6001e98b28642fdc741a807c5697ddabee5ac1e84d21aeeeb3f620eb314a3cd53e4d0a3357827f0d293664ff45cfcc6b46a966cd1246d9da5ead210996c4c7d5568192d4dbd435c9d4f2c135953d41adf70b55d81298e29d522650ca82c49c05941653599d94b3b08871407450846685c1a4c57d38ace2d618187137a1ab6b3be888182c57cc656dd3c0b296b9994254593a428de0a7e2b35cd64cd3fb242ed5adae7cddbfa7d8135ab18641a76edb755277277d0180f68b58c92eb340ab4ef06e5ddc1b930908c658cb8f61b0ee5dd348e75209376a25c9ce4eaf8f8fbd63bec70c4fe9351e276575e1241e54c9070b8db56040232944b1816b9420645f60ce067f15392ddc48828a5895fa25116b782b66517d38753e80df163d93ad5c3b648b852bb85251ad9adea97dba05b41b66f4f9e564348a8cf818b9454891192020c0f3409a692c89f2d994a688190a539020588330cefa0da0eec2915605946ec1153620bf7219ded937c3929d600621f054ce11c929a53975c2cc241de59c5b18b529dae350b9247fe4489862b92db22737353a262c79d1e6f2b768669de495e238316d370e20ad3a961ca682610d2d6a4118de7a8ec1fc68a824c97e2f4329ea52b5d4a25dae8943366d7ed80ea798b8fa9196a47e090d750ce6e9e4e7743a3cf422984eb9751d45b924098359571c985903d3c80c357801db7503c53775ae93d7065f3f7c31a8ac20b4d8d318c717c28210308712dcff2552c969b8ca9ebf01a2fdb99a184ac690bd326316bae12d2bc9a203249fc6715e8be4774314a5382056c5777785dfa7197bb7199e72bbf05498123034846722e17e6ed00a169b58c3b41cc7076e0d129576032f36754a1e143a0c15330063adf852b580781647d0da5de79239231956343973159944f5d152922dfc40b26445ade8ea76f535c5766d2931f9f0c4b38fa3cd870fc320214b2af68a415f3e90c9284bca272225e2eceddd781269071dae8d8bae9f32ee4d834638a398bd897562cd8b75065ea1238488101e98f4cdd7446d05f5041aa4c91c7c5016c8ece010c58fcd7b0e5c284dcab5f8ed78bade879e7ca14f676a0c75d4406e7468f7fbb0ceab808428b81f77597799bfe8d2d236faa23ef8aa2c6c41e12d640b35cc9cd9a399c009ef783313d66ec29edc55fde4f296db300238330b6978c23f7e33736bed58628d8c25fee2812bdf413ff331e0518b827e92bb1c77d269f4aff501da095b267d1e68dfb0fb808ba1c425b4bd13934cdee0fc6cc6734370e54a1d80db27e5d179571d4194c79c7dadf3c204fe825c2afa7a720b9d0e27b983e3c9403a59eae701dffb06f16ad813ce4d7c9c5393d7c1e7f682b3903d7092b30a57ca9b6b9c7073fbfb5817901c9477130751b0f01122b121c790495ecd1bf1a44209f8206ea287a1c117c66578c1345033566e657f56a01bc43fd541db87c3ad0ec2ba2e0d108c2b33108c79cc972f71e851b13a080806a9b679c24f2cfdd69142150c75d210a2af257f159b0a36ff1456ec89034e9cde2799a4b4ff702ffee13b3af0fa4bd178af53ba25ed9460042455880302c79d0f2a24971e381c965ac71606203a617589ee575052d819b41c54b1c1ce5e7ba9fd210a072990b57798bbae8e9ea42b90a8df577beb688b2efdbd0863ef00882a0dcb2da897ce9bd176bad212bd35063b546ff4693aabcad2c28787f08b3342294ad711c6fa57a70d43fdf80256f2df688c829e84bc0e2e2a87f1ec52991a0472c364d4aa26aa848119e63e8039ca4c2cd744935c4b320c7abe87c423adc555b7edc1e57c59790f40ddf6bc34747be641bf3d751bbd9e347154a686025d4a4cef21863478185a7a18feef132aa06db5d05b9a8b3088c1ecd627788881118b9b1bfb96670a2d4ff2636cb17d6dc78416c0d56b300af2a9bd77deb8d0da5a860b8204f7757fdb7a4f23de773b7afb1c7d83e9b937efeeaf6bbd897d74b12203f998e539bf0f62e19270f5375c2ebab53b69f820653a7f4227545e4e07e8f1c709a5a3ece5f5bd40d1721500003b2ce8179974f9f86d1bd25f3cd75abf482a77e2fc0e487d91d07170ad126130a1f811c2d952b701bade7abae3c73f7baa027daf5e2e103f8445e24c6b285f395a70bada847bd131d497adadb98d99428a209dc58347192f9797ad446a00b1ff0697b1ee7f5d3f4bc737907c616a087feee69ad3848864e6b9c4df0375e4517180128f1f891390029e04506e44428e8103cd4df5cc9d5c1b41546fda51dc655a9e05e1ebb14f480eb145c298385ead5d58c0bb65b976d65677f31b575097666914769e1b32229cf24ca77f3d181991fc453ebe1efbd0e4e38e1ad0a3d384babb208d23ef65a7bb3aab3750452ba9a330ffe5b1831db1d70e6acbf7374cf5d2562ebe3443f683ffe4026b4d81ae3efe0bf602cf5ddb48efe9d92e99ef7aad12641c3e2177e06923230ac05c882f1576383cea863faeca0848fc5bc400d5b7476d53228e808055ef5c4c8900ff64b8b788bcdb3358061c02dec97f9ecfd0783e0464e5ae47722a178f445c1fd32f7e7073d4f5d3f9d0a2231e9716c20b03b497a735305103434822bbbc5c71ab1014845c7ec1982a54d75253ca13648d635d4e89e9bd00b34ca4c96862d9e2cbb12466544fec149d62fab477ccc5a594fce7774b8666fa194952f1852805a45fbb7e4907cb71a0529c85a5130ab5cc5d23ad05c3f6aafa24edf0c113edeebcb7158192b36d1859b9f75dbad33fb285eba648dfb471d42105cf633eae9f6595d2083099b19c015def42253be5e92401656c9ac02c0fe4bb45a840ed9b0a459b211971dd0dff41957a1c8dd73a69447fbbed188496b3282ff05d96675e12c541df91b50ea24c1b9d81e826baedf191da81f956c271277f05b3a05bbbe7d625911a9c7c30282afd3b22b15df262dd09099342e9438f91790faba9d2d81a88f3ebb9f4929b114b8280d21f7159bc5bb3048aa257a4033ba986e36cf2968b7b09a3adb2359de8a18f55eb752e7ea59e4d2b65f3cb5d250923a5efb7a56cc29e24da3323aae926b75ba144f1155374af4a59f41fa7f1b654f9a07675e33297dfd80732e6a16a1a516522948a86a3cb1980d68201b492cf632116ed2aff880155c4b510ac1c28d690af814cd0489598e884e9c74d6336f804a0b2be3d7432100d74b56759198d182602e9da6b22e8d91893b5a86b0c2675f130d99c0b131553f62ad4fe6b19e3194e4abba1e8c644937135bc1ebfa38c33114de290aaa2512f44c28369f0be598224d874783c130df6feae83f3cdf5d4529b641622ae619714c0c0f19a4c9fb51970a84950a41758b001eb1c1859df1f2d3ef83df0325648e035ca1260e64f4b8a6171a6264bf839cc39d6144e90c3f6ec405444455d52573d31d09c7158847e01fdbb2f87a83d345a478992063186aba8d703a35e39ecc092f313d59b92b164956cb51b27cb901c4caf1350c84681f2753a5e181b14d8e807122329640777f249497e88f8f2d473d682eeeab9c6a061f502415da528ad19f47a825ad042264ab1a9ee35093ff63fb26391dd20cddaeaad0a2978c130a3029dcde3621cbc4471747f5300836de220f448efbb29c895e833c25350f9814ce5da39c05c0ee5ffe8fa434141648b772319ca4605dcfbdb9595916bee1d131141194330e09f20229a3d748da4917fc18d4ced20464d1d9543d4fb8c2f88e23ad1022838db91f2ef2806dc4dfb2aec32905d90b25c2af7c838a5daa839b3fb3dcb2839eb4dba12f5952a77b91205f9f6bc9d33078fb220f7a159304eb795d3dcc9720b9b13df52d6cb4fcc936b0e200530855c7da7f83f02d7c949b470e4c21cfccb14bb08535d22e3fa24af8bc000b9be891fdfadc80017e9fb7d94a395756d43699831e387c349a4628dfdc40a5020e0be515d466d9c00a43cdda81f7d8dd1768a5ec0c90ea03c7d4c5b06cc90ab75bc45e33e6ee19cc52ce80d42f924b1062184bfe4103411223e6f4b0bbb4d675db021d57c01788d5b18a6d07d485d9ccf12f9b6c563ea15d37c296e48051dd8411f23798077b87d1bd51833a4f9880ea8336ecd0f671f08082d9462f5da4fdbf8557f81b42fa59cfbce5574e00a513defc548d042d4f503959069afceb38caee86eec683317f5338655da429ac29418ac33f2d27d8e0871c4c8e1fbcabfe180a5f931402f6e1dc5bb4d18e5753a0e3dfe56120356d280710239d336af0cc46be9d27b00a46c96b12638f0ec847f67b7f0d31261532c683e393fdd0ad73c3fb5d519781224d97699c058943120d233825c30bb36e8bc13f785361762db41aab6343fdf9248feda00950496794993331abe36d16d79d05d40a8cb3bd8cc49faec5f7780d0f4906427f227e82f916ff56872913a23fb85cfbc8c294ab45510ff8481650f417bdf637d9f775db16e1ba542202bb18fc76f4ff22fa4596943d7ce2987aa00ba43334174ff536ed453273382e1e159f381ba41ac56da9f90ce2653a36814e33a02bee3fa5f556f23e7b90658e140ae1f87d172dce796943d2b31d6cf9858eb80695136065f95733b303ce89329f689123f6419d56bcc4958e752e74ed0143a77b4c4fa4c9de4bf1e147b06afe70df13d731c020f599b8f88bf5100f9a8fe86ce26e6acc73f2ead38c33e415ea996c36acb5f9b3f45238d1443e79747a62839d34c6623f3738d867906b2123ac203dd6d2bf220f424ba3a74c0e11afc41a23a770b5932a2fc482d09be99d8f089878a891269b58515c56204d82ffc9f7e1e4d8ba25cdfc8e4a19c6ebbbb48c4514bc4188ddb8bf21d0716dbe3861456562460130ec0ea4436eb5008898d36fef6f4097da451771427b219650bb8399b672bbbe4bb300a4e2879f6448027f408a2b441ffd8d34bd68a74a110f97f5fcc54a9cdd8acb69a906cca9ee46a4990db309bfa7368bbb48e656a5652fb20bb487ab350251f0242bf2ce1e8370554831d46898c3030c025967710557baf5d2bfbd97d6815a3df622549748226cdfd169be93304abb41f4467e1e04d7156370151114ffbf785f7ea94903cfcf7d4d76e52fff178dfe1b564354276054a87e44ca0f3a864d0e25d8b44122bd0c902f7517f60fa7e524b4e39fb962a4ce24d8472523e3c79085e6a0c81f7504a6277a815495d94f8b9d53a1b278cc67de805e89cbc48014ee0f0a6285e20c5e341a644e3520d5f6b50cfea9fc435e83ba08c6aedded312a64ade8200281d1efb4bab954639a4ea46f5eb6b83d67b4bcd9419cfb1258723b33ae5e50abbdf98de3eff3cfa325ebf2dadd6b5c88173783e80131a3af7c65c77cc29c7e3dcd6dc53c90dbcf442c045cfc099388f4c2848f50c306df644b7e228226f966821d064e35eec5ea4f5264f6f1b1f017326cc2c65145db612d1ea56f8a074410d158073504d8420b2f354eba0da4a0c18fe1b893225afcd6ccb6a10204226a1ffa235b40a5485d2b6e0209d50e8520f5d18e1125f5404d91a4a2163a179b6a6c2831411247fcf0f86c06df98b6ee602b404ecdd789db201cc944805a7a0f6da962ccdd9e44529219414445ed3a2c0c7d59dbbac1708f06995a705d6bff72402bae25003986057e7ae59de1c8329e9f9263433aeb549b87b4403d3a9225abee3b8874ebb17cafb45c11cf044bcf47f3da465306a37e122fdf9f6671ec9ff34c4237f959be6af54efa3c2773fd32b0f574da1b94f38ecf1fe1766ccac29ed13b4632de4e84230933b7ebdd6c52e4987d12df869e1a55a6ed369863a98000354c9507577e0941b218b2e4caa7e002ae56484945ed2ff810dbb973b58e7619d7c1d27bd92b1eebf89d26a8c497e5a7bb6c24821c9df2170495d9fef104cb39a346a4011ab9d6a86f69954dbee7984b8426e97dd5882752078f4830574ea0ca3946d66821ce0784c9691526ee64ae19fe06abf67d275845d5e2ba38ab237f9f5a4b7f881ac125918222336433f41085be54171d95aa0bb1df82684f22839fcabfb57797b70df9d43e88f808677e87c4467a6e8b86976609d1abf90dc0e8f27c492558b49ecf2f48d9b51c2d69b5509e217b2c973337e243bda6f1b2336872dbdd9ee06d032b19461e8fa1c4b05037d4ded4a50923a7ca3a52cf4f6f2b4378782435deadebd1c939de6fdf06ab666cc5f45e27aa3b27d4779d03f876a6e018b9f5482ef9fc2eb18d7b1796bae028b5cd0455d0e40a8c108389f894b9ec4f1426ebbc6465767054e505cb70c6b9927ce153c1054f9d30dbf29c14065bc1d6b82bf5148b26dd412a7e851a9e206a2484ccc2b2097883607078f01bee90f01436972f96d7a7171bccd71f10ad47d504e16f1a90128d0d619bd4a800a99b18813360c59c9d63cf5090af213382eeb391ece18a294919d993fcc2b5497dafbb05b856f832c562f1347d00a3c348e7885514e1a162b5864e69d7dc63925f058a7f3297a0b5a8ea402549c52790152a8fef182f5f737eacbfd673a6942683032a28de7999cad7a0de131a85c1ac2171f40c6fc649b07892ee01951e19054584988213b8e1fcbaf790f8494f6cb88adf7d85919d42319355350c8800e84918f2f434fe41b363a8ea074c7dfca968f4408a65cb6d427d93be110888e41e6ddb123d23b60f87ed20d34920727ce93e27e01867ebb70c985988d0c8f7175a9f44e1a0e67a31fa9e34fc6134b30237bd8ae50ceaab7e1aeba370243bb890ab83b132f37fda19ee14ca0048cdec27e6314b9db6a0e6929f0b23f59a64d3912713322cea2dfb292c14ef7c4eb5988983151d0cea99b109a6071192fbf93e05953b094f8b58fe4b56988a1bdacaaa97e1f2856e79c3c8774740ce589d11f4049ae02300c2cb35138af4f30d17f362f64a1f04c1c824a5a74c3734c843713dd500a9330c819e9be5dc816970884826d84f869be27de05217185a1712257ec58159de20034132989b7c3243ffd42914bfef6c8b0f94e49a8518af4df7e8d36fa5acc23fa2a4d84805852cdaf432c0eef3d79e870e9d9458bbb3ccb2536d040421310ff6a41228c0d1bdeed200d2849328197402acaaa155086c938b2c48f410bda25e1a0fa05f485854cc66c4c95b843d7603afaaa2ff03a622603723db684d2b1d13ab4024fe4b1a05d202c82690c771d1f7def65b4d1f4a20b1dcc94e5a1ad145113536d880b3a385a36c00eaa24fd6622f2f9f148736f60113031c29d505c705b902075ac76baea8b0f9f98bdefc48c10040ce8de2231ca82d3bad54b3c9c38c841ae7ff278755432bfc482a96177aa9a47bf111de3f16d7c932aff30416805a423775ed095cc3205d61789d6e368a95436e2d43708b7962f981247ac7d29ec997d519a925d8f5929414805f63b66a143969527f259585f62ed70995e9ff33f65af29394108e49aafc39f2e6019a7baa744e6b83b4a6546a53633dc43c473ec226b727d583fb226626a31d8184208647357694f6db25193d57bc1159d68d8cee41cd1823797fc742efe634ec39ccde5dd8c6f48a1a7c2ac66ad75ef18b9c10a3e2937d0b1a546308e8278e4f074c538f1d8390be3599a842ebe3f88e38a6b1ecf0262003ed7cb0c0ce4c112ca579733b890183bf60742e857861255fe313cba3a304b81c64034d529ecb440829c1700d8443ae78d153fbc73e17d11b17f8e983beef18c9f63fd4a2b55a4e9f87f3411b5ac987d1d84a47a31582b183b8087bb1900878a4a6d0eb20b948e567cf2346db3b3c1358c6dbaadd7fc9864fc06e30a340726fd788746ae240f2d37c277290a35b894141555705889729efcd4a3671f05d9f7006a90e49ba2d49c7e23a62e8e067937488aa0acb90ea8c0a033267cc70990122e106abf3ae05fbe2b6a2b8166abe852918467e5baf8a5c05ce9b06500152caedb24dc5288980886bdfa42194c7dc64c78581a4a297ad93881447fe142854bfbb00a19c38192f22d7066c6f530aa7ac9471bfc32db1c810cff2cdf141af1adbddc6d14f4e43b3187cede5fe1e3440b1f0e6ce1a336173edadb5988e77628baddb80364d5a32f84eeb760eb20bf3b2e8f12889d52f78e9dc6b6d1f6cd402131d640c0fdc2aeaaf7c31ac587f5f6e915770709cc0c66a707b6e76924c6b1940b25e9787200db73408ad601896f6cfddb964aa92523584e8782ec6279fae865dceb73e22b1a643d64a12253b200acd6cda1649c5006ef6887ed60a2083a7da0b212ee348ced5ed0a0c38868eaf5a2288986747d7fd7d48a8b25dcf7a180210b204fe96ef7c16b0aa86c4a73f0a1bc252652fe3d1cf0c17b9be37d1ed2ff91f81a292c988f893f00dce3875e071c36477a870e21e7958f527a8c0f7443108c010bf2ab683e884d24f61213edcd7887a2c5479263a26db22edf2cbc724fb0ee391356321c3530e7a4802acb708e44eb4aa2aba9e4b9448de2be45d963dfd275abbcd021689c89a68133fa2726f350654edf8c5ff93b22dd508d25ff8d99740074ea92ce5b579f1dae7e3fa88ca3508fbba89de06e48b1da1e526d525eda04d303f72948022ce3cf981d62f52c9551645b9698988586700c0fe238423bfc2d7c4d53cb8243db2782583ddc3e89dffe249803f65d44c1b9292f23b37a7fcc783a1447a266f067327eef5a7604d22ffe28435437c131f409571b589ede04deb768d6642781485cde5c3d7ae08775e9867466bbcf811bd8e184795ecf8815fc38a5810809c6741c0d2b24c197e3984865efe29e56ea97fe174b414316757ffe018ecd44f7d1af3b836cde256feb079e7112c1e3b481ab86888b1f9871c393b4f4da08f371a84ebd143141e729903333aafef834bdd0e5483093de640b920085f22884a862bec525ba86d2b5a457256a80e9e45d1f072621e26d629250717bccc06c6bc8498c2b99d9344bcec00061ae0c5c023fb936d536b74f6187545f76047cdf4558257bbd746cf46f69fa9365eab8bd86e4c25e3fb84e4acc5ba1d39ffe2c4a68dfcec7aa5e95a9b997c6480a0afcfc58647ef5aeed1bec2d5536f762cbdf018d3d0c81fd16f1d766cedd082bce9ef689586ec8d4ffefbb1f0c9adfeef5fa4aa57e1b6940b503d39313001a3e34246745f8edb960112e0430058bd3f57398142c663e82878e96ad2562142c08ef5477c009a34d0234009f4ebf71b5fcb627d8afc436ffe664d74560fd133ab4fc6b11deeedcb8650c71d42e2c8534bda0bd7b63f767a2046884804bc5fcae7607c9cfa0aadbd5342156ca5ff281412765760a87f33fd69cc27a9c12a4b77b47a0f7b78b85adf0eccb1f1d9081dd75027e4efbf026df56bc6495aa8ff88b39df2a5e4f98e30ae4312800b09f570b717845497002c5aa71ad90d2ab0c313124143062412f86efb806da40d1b1347bfbc5738288866238bc81e3059f5e314c999ffe5d20bf6aa594a8d7015e0d93e05850adbe5bd22aab4097f035aba4b64e978cd75643906597888ee80874298ffe45768261810ca4a91b7091447329086aab3ed590d1f27481d03768bef9b2bf90073268da611c4100ea6b811062195a99af1b7b0bacf3f8d64251f3e85c9f8fb597775f52ffeb75691aa53453fd03c37af2bbbe7e75cc868848bb87ff24b852edeff18aee6a56a5a0fea88bf148e7437ca0152080cb6c0ead22db133422a3efc98ea8ad7fdffdcc7dcb2a7c2e07bce021152d64d18a3050a9f29ee857ec8edd89b4e29e54e67dc899c29b263e1912e0448b9ec35523e91bcb4c0c0f9273637e4636e03e8d9dec83558fef51aa66b1154e95abd2b4b9446570a7ed08822610297a5245e0a3e217596f7828bf1568f0b8ff579c0a826de0e775069b18f5216303c5f8ac07394df6fa473c975c658087ae7bf22e8fd54bd53897e8e7da54dae21c3808228543c6ea8e7cc1ee55fec39461b33cc67b2eb1d685b0df4f386ec1b7309798857ccfc97339bf12688b14b486a2b8cb8212d838015a03783ede907f8f6c6c984cc92afe481055cbc6b455d86d71fa345253af9b29088cb65e8e0e70ebc18837110244948fb24c10966cd758c2996c4a0f6545362c491465dd45ddd200fcaa4fd5269f1f93625d838ad36e996ec6a9fbb561dd5c123b9c24967207298fe3b077f469f0c63908bc03f6a46f21d7a863595114867d1c1b7edbdc03a79b13cb179cee83783404ec2ba59036bf869be8bbc696eb582cd38542141ce56250049a62dce0517f5692845c909f47ac1be4ef2ee59e313cbf83943e4bb79ebc94d0f24ac1d3855ef18188a1432ccc0ec4a75ff20cc600a959532b8b2e3373ff7f0d3ad012cbc64495e4f82346fff50903fe2f7faf94978101e77b401a56819c65d8f554fa9b9c654dfa4da6c8eab94306458b07b4cd6fb2bc85dda16dd6d091252b9d434f4707076688eded140832ca950f5c670031281038e70fbdbde3f2055f59ad1de86ec700232ebaecf4ea1ee74ec91c40a87d257e6587e55ed3eca53ca0e382c24ede865cd0c4f29228d8cc7d5a956c16d7ac662e949b9c9b75b7cf38f01b738d01da30b9634d1c255ffa5eed2224ac67facab0bd35055c00f48af6809544d56975b8ec14be3259e51213216bf785f3efe1508a3ac684de9dde768cdaeedc2da543bc4097df6940de8de11975547c9504365f9170c4cff664a11c6072a44b0551ff44d0154fc17223ff0ee22b981c3a792d866e18da3afb56894e1842442c5a14b1d72851096472e46d8f0fcc28ffae47b80c7ab9cddbb72d6f7ce03fddbfc576928d70030030221bb913d305830210d9240520ace4d887056d5fc355beebaa1b3d21314d3735ee8bd3d3e5dc992d3299877c9183fd7eeb6c79a9fdfcdf0009063689cf734fee88ba067e2aa03d7a69e518f1da3fde991e6b9691466fd5b8722a3a8c850e4e1195c1ec16c300a7d6d6a0e067bb265dbc94dc9705366f49bcfc64412111ed336e8bb2dca0728e86be28a60627412d6f4bceb672f953da55e22f2e131c491b766cb9ccf5478ef9d2408c8fc41db5d2936bc6a7ef26b7141c6547104abde83d2005e0ca2ee12cc656116e8452fd0cc6cb487dffdfe77623e94b57e04f29f180e4de62db5e856d32e65b9fba0f368d9d5a90ca7b37856c4185cae31f4b1b44fe6cce3971c710dc941d1b01733e00cb6e409269b502cb9618e2749163133ec80e9e740cd315c8476cd5677e983c0b989b7d2b575cf55da041735ba911f5a6c2a5361ff7ac569674a62a33716c721d7ebe42c4e7feb218b3f9932132b55d5d7433ad56bbdd29dc0d61f7f009ed555e5d84aead55b00dce765f7d8454672c58aef745574e0fe4ca9b9542806b852345b4f28545d5fcd556c49027ab5501edc6e13e487997225dafae3735fd85582a3d6e28fc303a6fc2ef1a0ec12484702e2aea5fd8d377c52fb6f62ae20219d65979afc4be37919d832f8860da43220629fb3723059e05d3e1b53706136d18a7f0c4862b547e786424d34fabe140fa39fef3b4f235887db77f1bb16bdb8903d11a261bb6ea3c3c1d816948064941cfec1c73c65d9a8569f775c8d72a14f17a4f67eb804127704c73ec01d5dca02edb0ec8eb9dd46a1615ef83f98235035b4d91ec3fec1f70dbcf8337e8310e8a247b2ba65562904dbb10275767f4ea97339dfa619de4204938a6550ddb76e8904a0f961efc906efd19647602c714252eb1c39184821e5662fa85cc5e1c3e0b1f06e5dccc58e8fd071fd5d9899f1b02e83f7885822726cb92efe154b379f8207cc45a3692406b20c734a6beebd60d0b92f252507fd30e0532b252046fcbab8a74597fec17ee44a7aa201eab62040fff41786a641a7ff2e85faa80b4bbba95213c0ff94039fa062753725d147a16351262a7e621118f7fc354afc12fb01d1c0da684575462f49f25eb3b0e2b1ebcf9aedd946ab220726fc2e778eada2ef5f30f9430f6b5135e81dde6ace74daaca967e17957f403cf0eee2157446d3efdb37e690265490e90afc1a049dafb32372a7b9fc9dd46360743ecc9920ca8c66449f507dbc83c8dd5f2703186f5e9fe140527270b7094252be19c3e9de509d4dca778ec634bffe02bab938a7fc1637670f181ab8afcbdacffe37bb14f16f1b1addc5b681d360021fb8da25ef7eddba8ef9516acfeb7ca445177267d3c4ff469c62af9c0a183c63cc2322199d1a19fb453c714774a702453ac851a465af871074f5a09d1eb07a75b0aa67cb808281a332e6feb4baffe98db8a1e4d5872fc67a18b64b3cee01cbf0f127f7e8599fa535881b9d3624e20c33bd30967588982e21710c4311ed6343aa6143cc79911cf4289008635c8ed045950f262bc018ffc99d09078581b40c98823a18d25a4ff74215223634b653bb5a15f871370f9e79ecd8928b0b5f3e3636c9e1842f8b2d7b72f1e197c7c636799cf065b1614f1e3e3cf2d8d9248f179e6c6cec8d2ea9485905dccdf2d77479088a00192aa51c10c06eaf0be709a1b0df4ba35c735593dbfd53c5dc5a188288358253acf656b4b81b99263cf19175aafa333e28647cd0e248ea1c41d551fce8dc3118954b149f95f35cf36d16d97ece072fe9ecfffca9f2407a58624e29a8bf391f81f0947eaccc2f994424210da4fc0d8aee92af89468c2e49f5ad7cd118e2e171de5e101b8661ed058df73e147dd6a6fb6c2bd496333f3f61a31aadf952078ef99f22a3fa9e2a16b13037a3f8c61ac17ef63e0d683d2dcc0c7197d2438ba32bfb472c666c8f060e683d2fd38d57035a2ffe7fbac156c299719858210201ad0b3d7225120b7e40727703fa6e4ba3fbc338402eabc025f4fa7f103f3eacafbae095d1c7befa6f5ea6ef0942eb646103805e1b0e115a278a37ea1a2614e3139ec231cc83c10cee214bc147c815874f10fd32029df445ac539be109cba42844d9b62e757d7033e017a13107675ba7a52ec65c096afc406c6d89c4e95397f8466a34a03ce4e405ddd5f961827b1b51482772b33f72fa6e36feee7a59aacf815d56cc503ef8c9e8b179f6c383a3019a6a645e59b5c3cafaf175d3a5acf4583a02cd435418fbe67afae3dd58f99fb78455667f9d2e704d221684b49ef4bddbc23d3aafe8ed2d904f9a75618304a80adca3ab8952a4909f8bd1a00ce25fe22f44fde9ca646b023c46d056e4a08b0e9d41babe960e84b9e0c623f3736633707fb33c0312b59b61c5b6aa0bc883f451c777c91df9a37ad768f3af7b523a457ac6591881c2f04e3f6c3c55fe29d271fb0c82ef1f8360c0e06b76f35168660fbd383c9bb180358e36958fc14252944075e0104ea7486f41d85a1424c98beae6a35c1fdb1dd1418eb280df688c72786a331e4d6ceb648d679cc87b444b052bdc7c94175538800e5a604346e0e3681cd1010405a91f684cdf96b0526c0ad36967be9a5085d76295c4a47bb5975a80ab38811a96126eb650c2ea2a636a4e9e660b6523ca61f79b72c8a66e8b15371f8514f74a47bf8c955fe917c69792bcfb309df229faf65f6241ffd04c3cc283f427c8b2d22b5dc56b618471cf5d20d168081430ebfb592fe2605b1a81f8a86f20908c3dcca8b5f2adfc184214d5357bdb5392a9502253192031eec9e165eb1509d7ee27cbc666387c397b3792137dc9baca9069d4386606c6ac4e160279133c8232fb62b90d7c4212940412903cf21a4ca5f1a2aa0eac97231e0b12e14e08930835e25702ae8e2d6a5090ad0774ecfed7aa1236da5416ea4fef8ba165be040d538fc89266a053d2e32c79487d55fa2895b752bfecac059fa82ea6c0f9e28c889a2ba81f60d6e38846f6240f1be9cbddbc77edd9adffb7abf7e79b83781f849384074575924b5469d2ab088905fc0629254626296c015a6b141f01ce06b2e000c1377985f337d03643de5a26b980b8e9ea20143b1eccdd01aa2454163d06a4e92f809d5a7576958315e63f436c492d18658923bcbe8b2409446d17818a3c510d8b606b00065443c261c96b299df66121d25c5860253b8b17f47349ec1c5944b2369f86fb761bfd8e0f944c68d8a0f2f078f6fc0cc520a6ae29f999c2f55e5c02cf7fef4093213a30297408cf21c13c6180a61019d40f7c10337035aaab7a25407d0cb26e04a4f05220512225625421491074db3f29a42a75499d76c9a07001a1ca8dc8d527906423ffc7411fab2f9f8bc8db7c54d9a7f503d70be1c5349b03a1e61348abb6a6ed7a10400a9f6e0b44d6c897fc0fb271141ed15086b8b069315e1a7276ecb4d14d160a8cb8f4500287f1bcaee742fa4ad36f128bfd78dfff526840023fe3ee07ab9b4efde7251a51c237e2fa42488b774be76c51975a378c96faee2c2a666b683b923531b10dd81e9b72e99b099e467183ee0a6da703644633166a0e439deaabbd60244202ec448ff3d5e55580676ba6a953905c7fbc9878fdcd5b81d30d0937fa1d4499027810ad05d8fb2664592c54ee62ca1f06fff692d633216b02529b3feac71a2978fd47fbc4ba1ff6b0f73b7c1ce3e92d8e8c46b05d72e9cf896c65152fa6d9d0567c1214a001d98cd7f9c72c6dd445de195eeb33403f9af240db42531ec2fa9cc286597ec34df21d26653f33eec686e4dbd3ea952a731c898b7d25e7e240892b680b22f26e82911a6a23d27b2a13dd15b982bf97fc82e0ae4006023d10fa87d2b66f485586fd35011b5dd93c2c1b965d040926cab2cd78ff13d4f4370070208d32190b9865e94235077e46d821f85025f3042d5db6878d784a2035ae94bc97e2f7dfa0c460ee80a7a87213be1e821cdf3e23d433abad8edd07ddbe0257dcf5eec608b3967c62f2eb74d73596ea0884a72699e25be76f4fff462db061724aea24566912da8a9969401ed66b2a98f8a97c0fec0047b0fbd6fc52034c8223492e15ac2f898a5c0019f6f1c084ffc0753d2c1ac77ca10b1ab7e43384e41927d8f5914b805e0fac86bba8de002e79c468fdfa85013d7426b992025adf15c79155afdefa89885ed775e08bad7973a8813a4affcb4d89d4232b19a42d94b5521f6e1407d44765438d130c7514b0f1518826fb02925d118585c609cc070cae5ccf140cd1ecaaa773ae07bae4af6806625863d1530d1abf5106db8db5f002794208fc0e4a2c559eb6b3c09aff1acd390134f3033685f362337cb81189fc889a896d2424da5d380d05568fa29d76f54a285917cd956fe635e8b0f5f53fa4f838f770bf14902203dc468b54fc691e8f22033e52e238f715da40f9d59a7147ed391f3cea96bc4ce9b114e2b16b5d346f6694bfd25aa5b9fc775c0c6d3b720f56cabe31bfee3daa5107a56f8fb9ccf32621d19f3b3d1e319f917a8b7763319517261f684e85a8d3558852b74254db15a2448190466f0ebae2788ec2c38f2b5eaa7ff4a9e70c83105f182a78dacb24b70d4fe58cea9d33176f8c91333351ce654cae68d94709a6bf2552c0559c078d8896d33e953340a19f0a188821fdd82147d692b3065fcbd1680fe0d5a7087cc299b3834e2c26bdea609022870140d8340a89a2ed142aa0b90e182e862edf231d2c26856f4613445d8ab0d4f882abee169e446e1cbf46cd0bd7eb27ae67c619396718aaca508dd90b4cd7a175dc97aaaee7e8c6a8eb25b50a7c4629d46ebade73dbc41061a9c7b0bba41bb96e52bfd051dd090e3ad88ba122c51e721223e5fe7ac901994be75c23fa7f4e66acc92f1d47b88cd829ba3fb055bb891e964a976eedb39b8027892478c49bcfd51a164af735984d8047f8e79b2b2cdf22492db86690545307f1a06fe4f0cf1410160d5254e8cbe6efea0d80750d98b7425e1ae3b9427cabdc66d933a332ecff45576dd202e917f63bd5a5054bfc9173cbeb4dafc80cb9493e459a60786efb1bc2fa272cfc8b0669fa9b4420a2e084db0d9e0b0c2ee732509b900d180a462d7efbad8d6b0ad966d66bb9b36e5205f0521498c86d6b6ac54e20ae194fe04624762ae9d78dbbf777a236041b7dbd05533b1495e69592fb62b66de55340a31233f7ed15eeca08be920c9ff0114210f5a1a92d4accf665cb62662f7352c12e731e1496c31224e2e4e7e5be8c6c79ec3b44bf84e1f0c623b36dc643ddc34a49174de5e37742161a00f0c7bf3b808a75cdba8e2556791481527e76580a4d6dd9936c8bbaacaaba12d565ffce6ec84bcc5f482fa82947be54516a05ebcd201b662574bb92264fcc75662f3644ab3cd653a442b54112749f62099d0d5f176f52697e79e589018c7bce2717e637b064f73c2f54b05a39a86303d9d7ce19e7dcfd42201cf1dc1ba77e9f8f6b3ae063057d24da3378dad94ca6f490c2bd43e616615915ec4a066562ed62f64a53ac9535c696608bc5b6ac51ab67748212f97b2b26d447c0b501edf35947d150c2a40b34dab605bd64e46112d6b72a82ccffe5aafd38bbdf74163c1d7b22bf16d0943fd67ef2759737ae904b1a5cf2767d5ca5abe3b646c69ef04ff3c61001229d34b0fc2b6f3556f445558541ea7e3951d8c85423d53fdfe6be11a623ea2ec909749f242f8f3e92678ae1458aa28c821d0beaf2bb76891a2daf9afabcc8d2baa4724d0c1aefd3c95ec6e111306aaf2b54a794b3ee25e7f9a4e91815c5f288bee0a1621b36e9f52999057e8bf1e64e744c64a356d24c6308868d982b32144202f19ffd40044304dd9eb1c21cf845304f49ebaddbc730c6aaffa83fb538daab0f1aca27e577a39660d2915b61a0afc6bc262d76a1110338bf1a1fdb7e7a54e13ed1d2f082025692b1649f66c98550c03f4132c9439a8269ed9547f6b5bb234d05ac404d460b787b2ee1a41675c7cd69e25158983fb37146ab0e292dc70422a3bceff498acbb9261cee1769ede865a65ed75273f71fad255f0ee75149ff188452896667492ef42d9397de441bedf36c15e6103e321a2b0839499a851cd900aba4dcd8c225666562e6ba7d996c166f2d43c1256fbcf16ae1cc5caeabb7b17b684b7ec5e5a75f5f5e87c373b45827e954abd9508fcb8b92da0f840cf43d9b483d5127246ec927c9b347132a631ac27dfdbfd4ee3912bb285e1bb432e2247e736ba51cf152b947b4796c5562fa56738a16c8a2885b2370a2c68bae0210d80ab9300e31139c3aaed47b9fd2dc37aac0e94f462d6d9c448f64b22e62edcae1d8f0abaaec4e19dd91cf853f40ff3b2a8d9666a8839926d853e50dd7d76b1937d9db060226dda09529b29d3d32c14ac0b1c24d2e49ec407cbc79f58723740e0ce59cf7b0d3db8d264d64bdfc8040ddb8bab7b653e755a4f019e4faab3f0a1e530826b21921e8b41823fec634108b86045b19f7ef23c6ea7d5f8631fb4dbf4924bc0b57f176cffda09a99caeec6fe9525b7f64f9209c01038f515a70aa2be42cac71d6b3d07de16ecc18eafb501cabf9c0bb78497273def49ba034d211953656147ab5ff0d846b04be0ec4460d551050aa8a3a10be1f26950ae718d4f4fd306e71ba234ff3be17c71dbefadeb3d058285f74d0f5879bbf0479761e4b39529c057d1960645dd934a721c67388e261e4457e2b8a27018792682684bbedbdf7de52ca2465fb0c2e0d0c0d36f0cec8a74d878e10a3c6277f9b0e1d01c697446ed974e808151c65d3a6434718f95290efa64347f8d4bc70046d88c81098519b0a35a18c7d371d2212b4cf55d015e418e4182a1edb76ecd6524a314e0286a12856f15d349a7d790c55e62b1e5bb4a540acfd948ae413ff6c7f91fcd1126b98664d2abb8935d176e64dfa90d9a2ed885cbf7402e1214989bd6b49298df5de1dbf090e24db9f34c5cd93cd92b5271539ec9e7246827a80481e5c95eda71b89ca4937da20ec2c3705e8862fcedf83d9279b351d8abffca3dca49c703ee504e4544ede2d5de77df503c5da0f18fc5e75426bbf18421aef437b827deb0796d4fbeec5f82fe94366874094063f0b2ed73ff10c8e8df15fdcc906b1f13b14374db6198de9725582a8004dc16dfca6dbc6b8146b63f8051cbb6eb14f90880ea4511a7f4f7f392a40375b86401fcc36d9acf945f197bf94db141c95afca76e7c989351faaed951fd1e9d6fba3573d6a4be7905d6dca9622430c7ac3da96bb52eeaa370646b8d64c7bb8cdad5d67f665bffad8a7e6db97cdf1c15df65e31e88d1f787097cd9a358a4f19c45fb68714db007c40b0554b2029c83c5833e5d6fdcf9cefadcb295c5916b67fa5e657f6b02ffb5e9eee247bcbac3afab26fa94e877243b76d8ac6408836b67d18f2eafcf014c3119f5fd934064240a1b2bcb22c6c4a69cefb3b8841dbcdefed776b7884d144df30d5ecd65d177b9f19241034230c451259fa71e3c8f54da40f72c6b3e9b9cae069c5fa8a8ae4a9944a555518b79232a958542c2c2ca915140bcb29b3b0b098584a240b0b0bc98a711c2bc69e078260288e23a9ea5b026fb6d65a6badb50e47388a18638c3116ab78abb8eb03f1b31065bbe9576d3a72d7f7589baac8e079e6aeefc1d4cdcd6a85510ae72495fb3e05e5093efb73c145d95f2a687f4f004add56d8674ab7bf3f5344fbc3b233b5dbdf83157682400e3bb14f90c3749fcbd0917dba3cd91f0af639837d38810e8006ca04407305b1bfa7d4055a8e6cfc330fb1bf3755a12e60ba5d9af8eb73c17d2e3877b934311da5801c769a8e524d96f800c6ff3e754be11c764463948e62ad943321a13093cd545381e9a73403930a52379bc3ac7173c1b9e02cccaea66e2136ddaa290bd3910bae6a971ba5f9de94c592fdfde772454ddd52374a7324d6c41aa5f97059ca519aef566bb961a05aa66ee0fe52e08a88d27c1f832ba530c6d8defa3d1c570c45e7247b7f621dd6e9a058b18aa76a34d6c2f6f7ff7014acc33a5cafc54378c861b9aaba2265c433d2995366b6fd83288d25917bbcf67ea5fb3ddcb4474b52dd209f38877355a7d2eefd4c3b53918b1759e5afea71137cff981b8dd5ccb0137fc18a1c36c54d9c24856b1808d734fe71172a289b760e93722f684d1610f0c15248957d25eb3e957d3f44064a917f9fa69dc9c89a2e5c20618a36a23899420899bfe9c89a43aae0812e0ddd11424eb042e66fdaf99b8afcdb2629d754549a76eef2575991cf6cda6dcf3233af8c32703bfc91b21065ef49ee24777ddfc3dd411f755b72a7879d5b927ec4798293c3d18dee7e45d1f344f772e4e96107ff7d154ed5c4cd56cc0e6f3b1c6da7d7510d41612c46d022d44c800e9cd8a10fa4185162e433b6fb415fe1b3e802d04d79847fd23d284df87f3eb8473bb210e5fbb11065d6fdba593ebc7dcbd8ce5de1fb466d1f2272f8748f43d87468d6b3ab35329bb26bcfcf408f744bfb679486888cc2affaf0478f1c9b906b36e1684cb5c37f1a3b7df83528ad83b58e4aebdcb819a3e29a9ab135e82bfcd0859b1b16589899f953cc0815628c72eda0ca2f92cfdfe1cfb8307e79d4fd8bb577f250280d52ef511a145988b2cba6ef5dcf73273e75683674e379133bbcf7deeb3d8c35655e0646cbfcd54a60de83b1b6e4bd8b17f91c67238fc3500f23f3311ffe68b3e67ff82e391a83d111a3dbe1fd18ad43675fe1a3b40e19ad23675fe1bf0e2218ad23c8bec2c7dab5654613898528dfa75ec98ac16eefebf6cad3867d4b1d4069649897799897f93f7500591327e7aff08bb24b46c78aec2b0412dbd957f82c48e499c3a8141df862ec8546b92616c7837d8e3d4164a8910432d4d0ed734c3256ec5d1d40330eb34cecd0d301e4b01327e7e1e41ce63d8dddf14f9c3374c60f7f6ce9e7d13fc318079447f8ae8342693c8fc4794269c21f71cca03cb00f36e230b108b97fd09d9ff529528adcf9f608bae7e5ed89deff10d4dcb121b171722149b49ba4e9c6dabed4b6f7f2b33d95cff65e0caa3a9ec5f65e35a3b1d3f64e15cff654b4ed919e9ae38cbec2f7bc21a8a903c85fe18748ecff1354cd36b82be989413456829dfe1487c4dc16ff14755b3c4db32d3ed116df14658b4f53a2288aa817c5af093205b145510790289e48a7d9e9f4208da9fef4218db1fce961fe24f3a7d69f4e6fc40eb5d8a797d130baa5774e2800b580a465e68b9619a01d3e91a7519af02db903e467f615bec6c11804a5095f558e334a13bea7bf7d6770720138a2316f3643c9b0bd8968c7b673db31daa1e230f15bb4d001f46dd4c776944643b901381a63d0d1d88893c3c9dd001ce1c7c969115b83d2fcf0740f8e020a29a4d0e330b164794fa56cf1c37fb1c697791adbd198e78d254b01ad8ff91a605ea63c81ccc37c4c79022641641ee64f10f3ada7326bca943c451040d67a5a95c1c494b42a6bc576b5bc67ad15c902d27aba83b80ce62ff9c343edf127ffff3f49d4301ab42fef5b9a85287f9bfe0a994aada45e5e5e500072578882939d24384fdc153ec6a3388e226914ef288ef7ded84efcd38e4d355e9212597c92122b28c8226a0505383a4fe3e4f09f3839fc3a805a3bfc91a53c3f556e874f4f95183b7c14804e3a5c40cd7166c111e7098e0e2787f5cb7b3affd5a91f571ea595b4b0a7c17d4b3fb2b4b48ca813a926a826a805242d20519d502ca59ddb8eed85a459399551005a2153ac6f8fe3686a7d0f47a132e551c4634acd90bb4228ee0adf0cacc344cfe3feb4a7dd7bb510f7bd0f863486ff96e70e3fbbfa6997a77c5a0fd762f7e0fb7c4d6942af7c4a13e67678eb3dda2119b61dfeb9c38d1de2e476f82b10a13ae214ca23fc70ca0eff5c01891db6806487afc38968841d7ef805858945a0979444be4f4a229fe36c87ffe2fd8a917cdf0bda46f2a89f66d23f3b23fb1e7f1c835005d198b8c31f6734566b826a829ec761a50fff693f739829bce15aac8dd88ebe42d4df1f511a13b92bfcabb1ce5de1b738c9a8f71ef557e7e76184a138cc2b95b41ef5e1639dc3f2871f63839a3c8a626fecf04d1adc58e7580b914f5ac6163bfc9527fd389e18b7efa7c4f27411c087c65e3e74f9957d11cbf33ee97b78f82aa27dfe6c87cf727a31093a6212288ff03d19ec13057a8a4bc04ba0aef0f1bb682eb0eea1b6e85387182b10d9e1b3e873059f1dbe4a9f978b9daac9b92bac097257f82521f25913b4c347b5fea45954ca26fd129947d10eb36ee9ebafef4d9ae4aeef4b3a93638be4e96fdf6499a00dee4b7a324131fca7094a917d8a626cfc62108d911b3f06c2411be39c1734b6b2f1fff96dac9a811a4af6f7f40db2579e3ab4f07f87d584a334e13f10b2ffa90368877f8e330200ed5007108da576f83a82680ceff057a0d1d8b8c35fa1c7612cfc54ca8e221a6bd9e1ffe4dfe18f3ee18fb5f0c759e8fd16f18f3fcedcac2cd08d34230eb3390ceff0c72571d47618db559b1370b04f12386b42947d8eb53888f639b3cf71b6c3f1b6c3116782e1934631b68b49093f5614338a1de9cc74683a3e0efb3e7c9d9ac3c0272db1cf18159f7dc6aa14d9e78c12fbd4e949629f37fb8ced76687bf6a9f3b3c31e4e67c252075a060e0f5971206c988228ad8f83a030d055fb5ed1e6ae9db109f904fd5e272df6bcab1fbbcb5d4efaa079e40f25e12bf97ec42490b43fde6b020a43b196b84669fcebff084bf156b2825819f8752b014b21408c3dc8a778db2ede7cae09d7c4d7389576db45dc6d8c22dec4dc48674e97d1fe9e8528b372a836cb1e593158d0021bc4d90d9aaac827f6f99044cbde9f226e7f6fb2d1178d5c35d19644bcf9b8e4ac99a3c8be9a50580c1bd4e5c20585c5ecdc054763f8bf7701b266e974d1edef7409fabea441938e6183c228b5e6aa5257fdcf687f4f2d2e29589e3b60dcc607c03f3ea9bd2d8ae393f48a88c6c0ff3edcc199baed4f49e97d00b712d3b310e503f81ecb1e6ed2345056fad1496e2ff90366834f69188661e85d4a63ce42944532fcf12395748c147f8565ccce5ddf8f4e8ad9c54871d76744699890e3c861a76894838ac39484537c00a5a21c46a2118dd10bfaebbec9b6a24b4d91b2a592aca061b2619e7de628bad887c6c4ff3efc5e5c82c2c49abb7c688cc2c427a8ebfb13f3d8f6877d7aa8fbc43edb253e416194ba4ed714b1e630971bd4f5fd17e628ca5144693edb16bb87bacf985dcc8ed27cef397c28cdf74f84fc7da85328a2345f0dcbd385647f7f86fbfbc0d255a33446146d975109c6685b16a28c2ac1d4680c00db621f5bdb769774a69e7c826749b72d08635459209a8cb6f7348644eed2a60e0b457bbf12f83ddc151a21d7e4f87befe245c647b88a9be37b6faad1188fed792fef8104f1fe063773f7fb28b518879e378bad3c4a6657046ae699d54164e5efcbac4175507f5f860d2ad306fdd90c0e859935795e9ef5f751a0bd8074d074f8e830e2b01e7c00b7e9efeba8edb8d158cc3e65e2d85746095b47cfeb8b130522fbfecb0c1741ecfb79664d93579e602d67fb9e5a7eacde5689416fa43cdcfe9e7423ab321098939691e2aefb2d99a27d4d3b6bcae4eceb7ece3bd084f9fb2987b17cfefb2d87a9fefefd19107458cbcae5efab9050d8cb17d4756b2f4ef6fd53f5b36f6a06fb7e8ae5e3a28188336818dc65d2d77d02e8f69501118b4ab7f4cf6817a5b98fd22fcae3fe49af405df75b9a077dd99dcb9592d69bb412989779e27926199dbbee8ea994c9b9ebcae476d63451b939184d0365adfa749be0d874a88825fbcae41c766586f62993dbf7048780d0b3efcb48b14e80b5d6aabf91a492e93e4d54f67d991d8d8db353a6686c42a643b3a37d622298adc2d158e9efbbec688cf4f75fb8a03091c85d381a2361220fa8ebfef9d264dfffc1be7fbaac317261ba55aaf82b46b2099bb458c55a3116f10ecf6b2fa9a5f38fbf6edec93feebadf47c99d5c73970a472a41c6c861a70a2733c561e70e1e6e87527c00ad9d4c910ad712891cf612e4220f28ec4588baee19e20f462ef4cc8bd08c94972087cdac415df7afcc4e6627b3a3343328e95ca3349754a67294e6fe1321d7ca1da5b9a472c687d2dc97d989341afb887680bc9443d438642f601afbb27caed8f725e864f9ecfb234b5399a6b20f7f1ffe3e999d257ff887f187bd0f3116311631267fc814659bbb6ed1beacffb492179857c2c2ff859e1796de8c918c1bfbbe27534469ee7fe5d76ac194323bfbbaffb5be6e25ad52081032d657ada425b3dbf755366bbefc7dd5cd9aadbff78b948ec6be709fb9b6efb734f6a95993f5f7b38dc6c0bf3f041033d9cb9f2f41fbfe55e1f605290d90c634fb0a777dcc63c6e29a0721bd652d2d38dba02e97736a4090073aab2ffb20e836fbb246951ad931f2e9b330fc5675eecc6dd604ff0a4169ec9fa2bd4364b1eddf59d5c14457081ac369501afbe0e3609f5f6e886d73d6f46e405fa2aef2b06f3f20bcb1f2d8c82bb96df1ee1b426e9f1f88836de3c898a8ea784ea03cd2a0312f0e4a63df564919914fafcab6efe540d0cb5d2fe7daa797dbd6be23414d1fe86b56753640790c41dd080ac35f835855397db6ed1b428c71e4fad6b4b28f8eb1cfda13460e946607239785b6b08d917e20d3a11acfa6d974c80924f650edc93e6b86767581a58a4c876a4774a866b4fd6f725cf0d1446746241805511a56d6bc256b467bb093d11e084961c41438ae90ed309251d9fdf2ed8b48fe7dd620a96d3a8484b665361d3a3265d7b44063f4490550998787a83226f6c71ba47499dfb8cb6bdce550e4df34280746dc6fcf6cd7ed7ee6aa432d57eef24fad28c9675e5db7d55692c3c4c8a9245876d94f4c64ffca43c32dade93399cfb6efa082efe40ff27a16f448acc3fd3e1790ba148a23e9f3921293a9441ac5d003edb783cf3ee9614d9262f46f09b7ee7c7fc91fbe3f50e35080cb4a3f7a631c39071ac31ffef7a5af2551ddd5a27ae4b41e7963d3df00d5a9462a0f7ffa2c19ae0ee02d75b8efaea331f0bd87ba5de783dc606981c2a879ced548d5f19fcac3ff672c6993db40d2d75ce73f55c79f541efee0ff805e52929f923554592e8500213395d7e6366bdedcfea0ed4f2acfd5c56d7fb1b445f13f5d6783b47562819e541dfb850b288d3f583ed9fe28a25c5f674d2ba33f83cb681c1b9758932cbe3a9283598cd46135d4f4ebbe613d7d80a1ee7027ac2f7edd61bda0674b160c748bff836ef187ec50eb138733ef4a85ff905df53d5279dcf76ef94c46ffd1a4805c491a40fba267bdf7deeb152cd9a79486d2f8d49a958b537f79d5a432ff3386c5a4b2b3b4fd69d5f1f2852337a02eba6bf9c2111d501e61500d0997ddf7072af9a386db8660ff70d9a74dbfd297c706111b1c61d7bf1466bf923fc66dff6a6fd75dc9ba713906b82bc90bd2f51cda04df9452a323616cf75ff9ffd0911a6c7fd05324d7a643478e6cd4a6434778c81833a54f7ba0c25061766d4c10210c6ac2270cd4cb1b4560420843fcdc60907980ca20a2710185072e2037153202911bed9678c2101344a4a943810d1af2216357e5a70dd2154aace1f3059225bc0144dd40e245141df44c91041fbc6024c9c82419a67ab34072efbd9507bb6522573c04939cc8b5d25bb518e9cce9a29ba574b5ac444346a46c3a64c467b7b0e950135174b0edf750672c7af52acdf229adfa159d7a945e794fa3deb5f7df0f557d2034c6f2f5ab8dc68c682cf5f53d88c656bebef5a131d4d7b73b1af3fc5bdefd51dafb158d52e9d4b368d5af34cb8b3a58e996ffb46a5bb1ede31109db3e481adaf6c326b67d91fcc1b63f92c81fc13f472b5a231258e29fa4a197f14fb2894b72ed42fa93fc815e917f96b8d856b7945eb36cda6cf5e05ebdca876ab798fe1469db7e8b4ecd284dfeab577094c6347b29d9654664db3fa934104a533fa5ab8dd2d45fd1d588d2d447690fa234f53d6d7db4dd9d970bfb599b66dbbe499fa920b6fd923eeb49d1d8f549faac535438b68b6197b06bec1a622298685b0fdce757feacc465b8ed0b910b4b25a15153b6296e6b42194d68028713c6a125aa60b14692dc1a3f9be6d6e8d9279ee5d62062939be67647bb960b18e9cc8931f6ac08b20df9dc60562b4de4ffdf35f673ecbf7d97fd151fbcf67e5bd38918b96e7acc70b32c6c9be304dcf670c537879dadddf2b413d9be2a49ae6f1fe7fdc0c7dec7de4729d59a8b4cbf962bb19699442229494b1fd3638c31c618e3954dab26e1928e7bcc67dde126b98bbab6e622fb706dff8a71b5f41045aabac4b7f3751799fe4853a99b3a6d17371075c8751211a65314d95a6bed531f954ddd158cdbb64779a69a58dba72f6f4a29a5279b091546ae0f7ed8565b95444ca3f79223e9056e8297b88bc2f0cd5da471092b8cefbd347be5b93271edc9bf23154ba1b52c2cb0d65a7bb1cfa66006e977f2ac4591566ef7e50a290d4869407a4f4fe4faf4adb5d686faed8b521d2a0df4fbf69e9c585102b4a988739778dbf4b62b0a06b93e6d69b17fdab63c2db0238dd3df5aed22be7eadb5d6b2e80fd9b4fc2999fe19f7d68d372d7f4a06f769ffd6bff7de5acb4bbf3cebb3fc876cd73f25fb9f019a58d45db4fe905dcb217bacfaa7e4fa67e4fab40251875827d5463a73662a566badbdd65a6b512fa0d65a6b2f087e1e0bd0f6c625647c4bd05d193cd572fd6bc12872fd4c02ebe948ae0fda72b576f4f1897befbdf7de8b31c6f8de8b31c6f80b512d2d52bdf7cabcb5d6b694228bea85a554b1725cece4fbbcf7bc5f2163b81b15b39203950344e1db29d8b728587bbf5e8a6d0a2adc5b3d9d8784c6ae903b975a6b29755d2aa8c8d5e58399973da5807a9d54c01863ace3e26a227770e9e244aeaf7befd561d251227fa08044fd4006b0ae1073c4bdf7defb91eebd9ec9a462b9b064ca191558a0f9be1ce50c0f71064dc2f0323031d75533050a942036d07828da19d17870417ec15dfe2db24793fcb272a969a1850b80ab46be2de4ce0580b7c1eb82bb3c87858bd1e62df6469c03d8f79e45ca60824d5190ebcdbdf7de8b2f4eb8aa714d81e241be2dc06c2ab7b0a454f7c65a6b4dd2d54d766ce97224d747912835f2c9bcf7e6dc344a6ae47b7346cf2b91d5b6c27ebf711cfd92e148aebcac5e62644894c6688e14306d837b7ce91877ad9a05f165625a302c144834b488853c03c48380e553291ee55160e44aa9cbf3582f2e784503eee08162235b1672c7f2a85f59c79a1630c6174763335b7e0b9e61dd42eedc6721773c4b2da566584bfe000380045a1304754158481f7ea2ba1dbbc3c6aa52a895530ba4b15424d71bd27558b59f4fe4ce2d5d98c8f533896223636c226f4838248cda65fc7507932836b2b5341c12692ce95cc018c725e4fad5dd5dee5248314831aa57b71649ae7f6fb54b10abdb8bbd0f0cc59144964cf9845a49a9585a562e2fac1899178a1182116a09b1845e845c845642af8556422d422c422aa194d08a902e855684504227a12c64122a730899844a42a4104928c78c104968141285665010128542211452100a8552504148051769bc55b502ef03ebe781b43ec54f9dc8d5c3f8e299f5011945823e258a0001e5d5a643456c5e1032cba643458e1042123e2772a9e86b821237f8d250028c1be4d4a6434a586153a2887724ab985084216091c46e8b2466d0c5174b9250f2d920af6c3a9484112324c1f3d132b8e9504f15cf0999dc74a8a708e01119b5e9504f0f80d0b3832d72b8e9504f0d782905738f6d9f2b2480396716912a6a2b32762f448e1469894190cb51142c33a0add448818a0ca0161938911a3262a18d41c40a0d6a2a5a0b7a50b9146dc911a719ec56c01a1a9226329841522e0308454ba2c734c6ec441be288922d0fe10899bb99a22c411a9a956aa0c4f8a488046b8c1012c10c92720da6d4800a297f71444883a2710928464e9422894f08171ab184129e0c6aa0113d44e0a0dc07d650a9ddfd04e7fd8009bb65a0c369d07690ed0c33a89851250f1531844491bfe806c700f30b3d3570837985371d42a208fb5ced1354018caf8b9c371d42c207dbdb2191039bc8329b0e2171059882fc9b0e2141c423ca316f8049b24b557248ec4048669fb8b171da6ebab57f43d1265dd31fa426955d52a633e7e7b341525719684d96e7f997cebc512757cdb6259d3379e6ddca8a6704be475b791aa86ca5ac41c98ad75375881c56bd59c9bdb7fa74a20dfa6c836f5fe0eda4c1cf9ae5fd1099ddb1bc12c81019b52f918705322a63921f07fb02ff85300962bff442980421dfbe1026414c4fbe102641fc732904887d8142980429bd97427a944a5b0a1152635fe09b4aab3b6b64b664794f654164c922bd35815eb248254b01f6c9afa1f454662a595ec983bbc0ff615c22ff3ead8e1a595307256af0c411d4a812050632f06d91356f28c21bb736aa58c2061b32f0ad0efc92ae344b2bbdfdd25b107cd7b5665fe0931a3f21b38290eff5b641f0ed0e1fe1238f66a55cdc0b1132f02d11ad818f8ccae81ab32ea490828f36c8a281ca78a87d8de5095a9d7d81cf6201313d0d542696e76ad7607a25a6d2eeec0b7cf0ab93aa5337f84e73d8ade22ceb8a4c653b968c0184201995e93c512407441849725a1d2eb22f302c4f7c837c5a9d27fb7c36cd01c43704fb881bc71ddcc583bb6a0e94c6621a5c56752090271a221b41ed69967ff8436434c7f292a500efc10fe23df8fe602984899741c00f4b216f5ff685d8213b4056a428f9962719957d25685f162481a053190542ae7888bb051ae9cc09f6f06acda097fc415e41631f7f61dc837ddc853dcf0812e4937ce2dac6f8f1cd612746022701ffc707003efe6c8f91a031baf1e7af0f7f2de3f7079ddcf9ca1e30cba3a40f188cc34f8c1fa88f5dd79654c760d2555287b7ff0b45dbddb32062280b2af65983c551eeda7a6d0ab63f3d491bdbd23892e96791c54d87b0e8024c020b35b070620a2c8c60c1ea33088a29570389cf49147f51294ec2151531d8202803c15f812008826099c37059183cfea2fb5cedf853d18409acfba8d0a2883bf3a888c2c7cac0c861b00605445c30038b14516b726a6e726080b32f0a52c1a393bd800874f39a7080cba84d85aabcb1cf9a2eaafca0b5e9900f194d8c2718b2e02efaaf4db3cffaa73f4b869dc21e6bad359be6b8bbf4e96fada53487062babb12fbd51b06e91b0b6ba66dc4559a84e29a5b4c6734a18e4996befa5f723025795d29513ac75c213c5f02dfec08f04129ab10a6530c1b68f5316bf68dd2b49ee79a40cd804fbbea7c32d7309aeaa64d1627c6b6e1cde07da1ae47aad5fbfb5feb5de57b5efcf5acf7a25c59752a96eafd8b2e119b97ae00fd692315ceb7ebd3a0cf40d7a1b8fb652f72ed0ca5561f46b8fd3fa630513d03f478aed2e6cbf01e6f1c084eda423d9200b6eb6fc559fb4bfd6fea892fdfd7753c2fe3e7f572cb1bf2b743b9f8b4a3e5d352e5aa1e413dc04d8676a7b56b0607b7f3d253ddb53b2dbde0adc18e7e06cdd07efe7244ef6fd1513fb56e1c6be4370ddd96c7f5f9040300915d0a0dcb9d2a00a25461e2af879423ec13a44851bdb676a1ca3286aeb5e7b7c321c740936802fd6f07d8d7d855f71a83cb4dae3e60b4e019a24ffec30fcb31ad9e1c3103ee80648e100771852a230a494e29212f2efa68d3f3e9585e37f38d058dde15380c6bcfa63bad1980076f815a826485fe167215023ecf06965c20edfd3359426fccf234b174983fcf8ef9faef18a61a9439e612fc6ef5fa0b1f1e9efd4074bef9538d020f8bd3207fbfa7e88eccc3bac336bbe2bc75d83e357d699e7596df2fd58d2d50811357c72c20f73f6f7aa2db2fd132c69ac6f0b9420536191ed9f20087edf0cae1330f1f74a17ab8652c8109957be7d7d22911cbefeb6df527dbbab58929ee421b221b293ee4ebc416ff380c3498ff6577437e99d147b48800dffc3fef877e34d4919ec8f650d3d4d209694569d1cc4ae3a37884deb8fef5a077fd2879a154378b262087fc8be640c5e52ea32c1f6bf37866bc117f57d3084e1051aab3c94e6fbef77a85989a0afefbf564ba522c9ef87a822db27c525f27941ffecf72098f36af5fffde7da5f0e250eeefa3e707f35685432d299b1054976f71624def7780186194c341a13c0b6d5e52e4d73c2176008cb1ee0d537eeb2ac1a484f3e599e8009f8a432afacc9aa817cd293ca13909e2c57f665ffbe00430f771dc0c30f4b1d5832803b7c70876507ce1f76f834a89231843b2c5932843ab0642875b82f963361e9da33b8cbbe4069ec933410c7b1efd9dfa13c72b0ffcdb1660ffbb2605eb9ecb6b4870b37eeaa7fde9876de1376be7a6b7a94c4a29e66d1afb19a45573db297e0ea3e2997fd9df451ed8fd44ff7597806b3363143c6937d9f851acf71610743edfb2f388cc6000aec1474188d411444fb3e290665e8b62bb17154d95e8267de94278c410caed8d429dd1d19e90ccdab5cbff77bf3aa14f558522d9637c8f4c75a9dba7f6d18f94783d87043150a85524a4b75562a915f676e5221f8cc66b3206c435118d9f6a9958208fb24ed5a93228abd555c8994e267dbbfa14353e4b6adc1f426a7c65d54077197c5a4516c7916d0f3b008f9ccdb754d8ebb9efe5923d2b2bfbfec83be1a87c895a6aa22933392e6c15d3be4700177e11f461b6e18cb20e2631f844ca1623aada43edf4ceb7118aa6443369d56523eab154df7c9a4e9cef786521964cab5c1646d48847cd6d9d5416e709729bf3dbdadb12f12a577e0c1614fa65025533ed558b3d2eccb7eceb6db94735764994f2a250787916fff02a42621c9bf8714892204146d20f1a20a3864760813a2181cb183219081451732fb7566bfd2ec7faf5941589e893fcb0f91b5681610d5ab4a2155a6fa2132fb95a7d26a8f66d1b5a6abedc6a2a94ca5a9cc23eb6c8422e7a8c8c8f4cf9a8a7215d12816c967fefbf7ed65d977d9d77dfb2f73cdb2a58fbb73f608459ee10577dd57919173f97eadc1e83f7a7d181033777fd7c1534ddc07f09e395f90047a93eb5d8fb28071ef783d8ab1777afb6a9fb15e8371bce0f73d58defb9f0669a634f4da3fefbd77c68b5077104aed7aefdd21b5eb85a36efcb7bc5f71dda727acaa483e2fc618dbfb7ddf7d1ee4b024398c525a6718822db52c2ec8e7ddf5eefb2477c56cf06df9bcfbfb90143a2c0c3f7dedfe1e9fbe59df0fd95f79d6fd53b2f77f46f67eac967ae9b4c0064b8c7fc809ea9f92ff8c7c4be2d15b5aafbdb5de2a449f2defdbfb3561f9227bd8ab5330beafc37d92bbaae7b73cdffbf3fef7b495ca418a657bb80f3d18e3499f55b76a9f5ea66e13ab844460933d4469a8577df0944b73f69cd9202907560a8b299f50a3ca7442e55185061a2a151aaa110d954a95fa71e5c7159694aa3ceb4e8d7f1d36961475ca6898d040030d3494805a616951a560627c665ffeac566db7db55a91214141425caed76a3d1684992e4505454797860c8e52e20c5e572d9d7d00b95873f08ceccfcfc3471f2c3d2b2a24ac1c4c4c0f8cc6bad56c92aa5f09a4b4ab5abf2a9baabb26a61098ae240395506455929fd47078557e14c6edb512c5b9cb427b1d19200e16a129338e6604dbff1541d87a2a8488acaf3a3fb49e2b70b541d87022887cb49092fbebd50751c0a974b8a2110a5f39f24b799aae350e0a498f9a13f04a6a29418e9fb108da96a7d7086c6c0afef620186191c4622bffe0e3456fafa3cf8e04363a6aff961a7af5f9ba4beae7cfd4a54a338ace56b151a73f9fa3e7318ebeb3b8fc35a6fd6a323f7a94ea03afef2678d438a9b9588680a11951d509d4a850a0f760502ca01e95840752a14285eecfa4e0635abcd0c1b0e76fdfae3669dcd922cd9f5eb1254a7fefc34b1ebffe0260ef6e5cf01aa23a44a11760ffbf2ff18a8ce0d516850e3e6bb501f05aae34235eb57aad3b2e0cd71db1f68fbbbcd4daff9cbdffb2cbe20890c47b1944fa6d40aaa8565f523eb29b9d3727990fce1ed16ebc88dd423af1dbd946ec485a585880a111195d54a0a084a4b797a1320960a54a1a0aacd9a6edb9ecad9ba6aaf3cd561a39eaa364a55524ab392a2a7acfd67567f9a549f25b4284ce2888390ddae4a8924f5b8612c4f6f229e348846092f7e17de05d07fdce549fce5ef48bcc92d4f5fb2fd094ad3b2a5d7288dd33fbd16c4aa2823f4a8914f7cc6b6b4d65aa9573a4db06bf5105ca01e308dd2d807b10dfc6c36375d66b726414f787ca0d88086723a221f879d60cd61e767c4e77ba3c7cb132f41a918db52d2a65ef650a9948cbf7a1fa871ec4c695255631f4a63c24bf01237577c70131c849f380c03e11fbcc34bf010d66128380a969271126cc33f46f78c91ce9c3966dbfe582feb5ed3cd4d929109677262ca99a03cc1b33a3245c1b32794986ee2ec8933f6690a7ac2c83e4d4f4c3ad36edbbfd557470e3b4dab2a34b0914f1823236b5299fd239b8b363032ae996ed8fd3342f2847e91fdcf5ccbd384a3414ab6b75a1a5112660b96a01f1dcc16305b984c37fbb23faa91edc3e8acb93ab22ffbab158c6e7504a3db96b6b2dbd696536cfbe7ca1adb7ead304647a58dd2ac8eac0983a32ffb40b320dab6303e1b660bd216f98481d962dbd72919501afbab2337b1cd65d6e3527349e2303a04c5946d734bee0e89115647db864629a8edd3c50749947dbafc6ceb62dbf674b9b9e0b67d7c6bce61278c91ce61674a064f6c2d95fbd2a8b4d118cbb6ff9292018df9db37d198e7989d7e463a73f298edfbdf1b94d292e4ae270bd5e684f1d7a861ac477ea4c0bd3cfd17fd80f7e1f2d8a47d5bf2876fd37fa3e9c74a72d1e09bf4f7a6277fd8cdf2a0c6ffd93d8a45f20fb6c9494ad1a9ac3bfb21115c571c908a8cf1e4e14ea7206c270fd70468e7c4adb5d649270f773ad11ed84e1eae09d0143627768528d79ef1923fec9f4eaa5d0e5f15259fd5fbdac322bec802c4613606cba21f7000afe4c13ecb8d38ecac3aeb3e0ef3ed44044da9473c8ef29a9b2eabba0aa5da966c77253cf8e0e48ecf0f0e63c980df7baffcc11f5b27ede71fb27165012a2baeee7444ee5a39b3ada41f777da0da5a6d093f2df18b4564fc399c8049cbbf9439e0604d560d2fcf7a56296488eca55cbdd5768f9656b72c6f37cbaa243dc9ad87f99692f435c9a75ef5beb166294122f2597d7ad890f3001a4c3992bd942e8b770fdbc3350c33fce0fce5ef38c7551fc739ce4a719717eddca5aa227bbfabb5de27c0189d74b50d37f8b04e80276836270fe0953cf8e02efface926c1509b00b166dd8120b95afdbb80f0607f28915e812aaee2f60bab861e4ed690f34e0689c94116b298b2c6bedc6eb23c3389e67ab8fbacb320ac7f2985d4241821e548c62a5df6f5c1c0b2367197579cbb1c6f4a6314e6bda5326cbc7bf801eaded5a23a058a6c83bbfc2bae098eeeaa917f3df2af3bd6fbd75833a6861e4fc91a72624a212a1491bd943536082d83093d98c95ebe878f2f9aca60b410216c1cc919c95ebea58594a08d1e19ebc75a773b37eb16bb5ae4302a0ea3dee3546764fbd176e7719afb786dfbe36b81fc6cff203640a1b2176badad01d78e20633d2583d81f37bcf0c9b1e6cbfbbb58efdffa957df96ae5bf1be9cc49c730da2d4fab6a66947fa78e525554338795de7fc764ad1d75dd568340d8a5b24595900220cc642b4baad6b5534744f269a3f39133cbf1eb2e374ae32f1a06f782bb2530da27f84a58bea563461741a31699e5c1b7d139ec9c99b1e89726fef2075f7023132e3833ac00238825436550a0a6821ee0a00c2e94d0625cd9417edd5e4b5eb85713878d9ab654b4ddfad192cab36ed06e522b7179ab95b4a618b98bf632971c3b77b9943a8e95745d3807230a283326c85a48d16b19f99124c9d2366d925e619ff48e9b7e6dd40ea07207ce5dad97b1292245cf3f758471eac8a6894d131b20b2f5a4cc93314f9224f94eee90f8de31da50a10747e8acd97a169c740477045c8ba638a06203c586c846a5826c95c090de85a8cb66078e8688c6c8e731d3393a4ae36f23f4bdbf4d90c3fc532fb82327d190e5cc4c85990bf7a259d37e2b67fba2d9f3d5c373ec72ecc01cbb1cbb2e32f8a78d0e3c79d8cecb45107ae5e875c3416c8cd2a7aac7e47b87931d413b703b4aaa2f16996ebb6368eb1d4e28e51185510f0e6cb2d50f91d9e81c66a138cc44e4b0924c85410da3bea03aa92ea860d42f2a50f5a2b6a0b2a036a92ba85cd42d2a939a45bda22aa9555415d429aa14158afa4445529da828a84dd4256a919a4445a212a9465422ea1035882127300109461002107ce07bf041043f94400810755685a83cb5884aab47d49eaa44f5a94c5423f548add514d49f1a45b5552a6a926a45bd552cea92f7cf21b266d5e2fd7376d6acb8f7cf29b266ede2fd738c728e64b5d9f6f7429f1d04dae4d8d9d768ad2ded115bec1553fc9560a03df0321de0c00e3a9c1bc8410319c0c005beae405be06b173ae62b17ba025f71bafcba85a6c0572d748eaf4c340e5f97e899af59e8097cc542a3f0f50a2d81af379dc257253a025fadd02a7cad42dff03589767d558186c0572af4ebeb14fa015f6d5ac75729b403be46a15b5fa1d0367cfdd12b7c7d4237e06b0a340b5f91e81abed634cd57273403be1ed13bbea24007f96a44f3f8da845ec0572674cdd725340d5f7d740b5f8b68057c554203e06b121ac8d71e6df315099d80af47e89baf443402bed234ce5723f401be16a1615f89d0337ce5d1e6d721b40c5f85d0395f83d006f83ad301f8213a860742c7fe041a8617a275de04fac79740bbf024d03efe072d801f81de7911e8017c08f40bef8326c0834017e07bd03dfe035af6aff75b6ddaa45ec1dad7adc240f3f0350ced81af2fd01df8ea4473e0ab0bf40e5fc1d03a7cfd429f5f81f406be7aa173f8da02ad81af2cd019f8da4463e06174ccd715e80b7ced42975fb9d016f88ad339be6ea12bf0550b3df39589a6c0d7251a85af59681cbe62a153f87a859ec0d79b56e1ab122d81af5668d7d72a7404be26d1afaf2ad0377ca542ebf83a8586c0579b6e7d95423fe06b147a85af5068077cfdd12c7c7d42dbf035059ae62b12dd80af35bde3ab13ba86af47348faf28d00cf86a44d77c6d4207f9ca846ee1eb127a015f7d3400be16d1347c5542db7c4d422be06b8fbef98a8406f2f5088df395884ec0579a867d354223e06b11dafc4a843ec0571e9df375083dc357217400be06a165f83ad3b11fa20df040689d3f818ee1856817de041a862f8116c09340fff81ff4007e04dac78b4013e043a077de07dde341a05ff81ef4fe0fe802fc6bd993faf5ea7197bf7cc8f275e608dafe2a2af269a37bd1368f9af398f1e0d13c6c82ac493dc7ce9ad4730459f3df3f47ce9a32ef9f832887ce9a301fb45dccb1db6e4305e5f325c9c963b679780f7c079e03ef6f6364cd1ddedfe6c89a3abcffcdcc9ae7fbdfd0acb981f7bff1b1660eef7f53b3a606deffc666cd0cbcffcdcd9a1878ff1b9c352ff0fe3740d6b4c0fbdf0459b302ef7f93b32605deff46674d1cdeff86c89a1378ff9b9d3525f0fe3745d68cc0fbdf1859f386f7bf39b22604de1f6766cd07bc3f0ecd9a0e787f1c1f6bdaf0fe38356b36e0fd716cd6ace1fd716ed664c0fbe3e0ac19e4fd7180acb980f7c709b2260def8f93b3a602de1f47674d20ef8f4364cd04bc3fcece9a08787f9c226b1ee0fd718cac39c3fbe31c595386f787cdac6980f787d1ac19c3fbc37cac09c3fbc36ad6fcf1fe309b357dbc3fec66cd9df787e1acf9c2fbc380ac5980f787055953f6feb09c35f7fbc374d6ecf1fe30226b12e0fd613b6b0ee0fd6145d614c0fbc38cace9c2fbc38eaca9f3fee6cc9ab1f73769d60cc0fb9b3ed6cc797fb3664df3fd4d9b3561ef6fdeac89f3fe26ce9a37ef6f0259d3e6fdcd206b02e0fdcd9c355b787f5367cd9af73789acc9e3fdcd9d3577bcbf59644d9af7378dacc9c2fb9b47d65cc19aad9267881a878c09f9458032fdfe39346bea78ff1c1f6bbede3fa7664dd7fbe7d8aca9c2fbe7dcac99c2fbe7e0ac89c2fbe7005973e6fd7382ac99e3fd7372d62cdf3f4767cd98f77f49f27203ffadcc5b6b6dcc7661910f637faca283ac1ea614428588b0c2265bbdd5415abe550aa16e48216b219f076da3b321b2d9d914d918d91cddcc6e68373e37b51bdbcded06770374137493bbd1dd10ddec6e8a6e8c6e8e706638341c1f9c1a8e0de78683c301c209c2c9e1e870887076384538463847b0198c06f381d56036d80d868301c1826039980e4604dbc18a6046b0237366d24c1fb366dacc9b893381cc203367ea4c227367169946e6510e2dc727a79663cbb9e5e072807282727239a456d27a5de6ccec8bd4307b74120ffa05e701fd02d401fd12c401fd92db41bfe874d02f44a77ed96d40bf14e5a05f8c34a05f8e32a059330c6816ed029ae56301cdaa5540b36c14d0ac1b0e9a859b8066014940b38222a059b91b344b0701cd227a8066ed1ca05945366896510334eba806dd9a3140b7684174cb6701ba55a341b76c0ad0ad1b10ddc22540b78010a05b4107d0addc0cbaa59341b7880ca05bbb1874ab0806dd32faa15b473e34cc6c47c3d05ed0303e05d030359986b16d0d73eba1617004d0304003d0304102d0303917348c4e47c310c534cc2e001a2647c3981a06a6637074cc8d8eb1d13100d0312de8981a1d83b32f7f1e3a66878e09b22f7f1a1dc3828e5941c710d997bf0e1df3d2312e1d73a482964941cba0a06566b44c0e2d536a9918cdd3fa218098c9625e6b1e9e225e46a9cd48fa9835288e9365cc8ed2b88d0ea6a32d384c4763e4fbe7cc680c66fb7f0ef2f9bab170a3344e4344691c46bfbc7e91d12f56bfd4dc953a7add62da8801c2f61779ccb67f68a33b73aa9c01a06d1f03c9e661dbfe2eb717e41d386ff55eeb5b2bcd0ab2fad6b756add64ab75ad0028c87300512474cf2ea4f9391c9482c5ae91c22fb128b6462605662ce9a323139183127e65a90e90e9c356d74feb2d981b389b2036713c55dde45b64eaa4e73974c0cccdb954c0cccaa6e158fbb6c79e4ae54951527f94c1dd9e81ec0fad687e4035ebea5640569a1387043d6f243642dcd0ad2fad5af4a21f5c8122666b2d60f918daa2cb2fd1307bde0b6fbc7ec3e0a2e87c85d6ea3eb615b3495b57cc4ec9cd98a939c3ab226ccaffee88f604a1b9dbffc5b20751b9dcd1455934cf76983ab6b2a6bb1f44c94e114d997ff8b9e893846db6d74db45677ff965d15436d6f2efd346b7fd6d76d67c710144c612368eb0c51399bf4d9135799869814515435da4a10499bf8dce86680c232c86a49c013e359b6aaa47b3e9d39eb62f636f1b4cba5842b9e9101344a8778d5d57bbba6e369ba140566b8522801b9c37d4f424c73e29144ba5b460a9b5f5ac3fa5a12cded8f6af7d708918db7e5e2d79b2ed3f13dbb6ef62d2836dbf460bdcb69fd3638bd9b60f43916d1f8814dbbe0d388cb1ede7b0850eb67d1e9ed8f67fc03d991109a2e1743e49b61de2a209db0e7571838d71929ac34051193081062cb0adb1031e5c3184c81b49d228428c151cd1c14f153fa54bbad6bf923b4e2241310510bcf0411c3c50a30c19a5c093202409a47aa8e42b757751ce3aa5664600010014010315003028140e8ac542d1581206ba24fa14800c7da44c6c50980ba41cc77118848c31c410831030000044808488b641009c66a17cd0058ca0b8ec8e7f9d0f79b268a9f89fb5c6ab9c8aec42077a8acba80a7b02af8594706b618c35bd57b0aa645f2323ac814a2d17e7f671094ad99239ea052550b656b19b9c2d2aa6e34f70dad7d190f7e5b33ac403bef216d660792a0557ecd48aca1f43eb1865c45ce1e10082dada4a649522966806d85d55d5ae0baa3451f8d017d7fcc8dee4599935a99ebab00f6756917c334fb45f0496d9f12016ccf8cc6c3ce12c039e39a0074f5c9523aaa2895717699d36cc63d8fd8107018645ffbaf3531f2264337e29688914c44806701b25d9c9a46d6903068ae003da732c976f23185a91cdb4c1afc1621ee378fda30767551a5b0696bc32d01e94266487e0e1da2561bd6bd48111a0463fa685bca0e53a0f794066d08e18f42c50648d3251665e8777cbd140a5ceddb194bc50d346837d17a468fd8d802a6fef79ca119de5dbef55dbbb5d4bc96476b07fe2816ef6a2afe4d8aad98bbac851c3b2b01192f71264b35bcb43ab8588b4a082834750edb4306f0b0479f90951aa96d60524eb4dd9f8e59c94613b40a0fefdac368c296b776f7c74c7888807809cae287c96564f241e2aac35543fe6be631b081ed5b2bc0785a3d427bcb768e34861ae3e7439de16e8952c5f6853720911b287dcc1b865ea4a5e370f45853395bdc291908f27433931c90d19003eda27fd584d65ec4d2f432e55ae0210c5ad2355e9b71697d8b50bd9b1c6838f28cd61bd7b2a8d5b2804f6becfbdf7cbe2901a588851656db3526c353519a6aa97f1c0a553b2d754f167755b0639c19b4ef13917d37918530a56d6c10e1bea50f652ed7c0eea35eecf322e8e8c10c453e3b4f1d1e7bd3fbde4096ef9c90999baf6e94bc34cca0dfc5c8b445e9b432c9e5424ea273c426faba0994511d6814ef4656e6973264993934095b8493a5754615488449c9c641602443adbebaa2c74feeefb62e712594fd6ffa97c0db380323c8057e969359a8a9fcb8510d9a0d6469265a59b3c8aef64560357deaddbb1e891bec4cc50ec59ffb3dad55c1cf54aa55525be7f536b5f7f185d964ce3b6393d5d904af4b1f56b954a4caf386a8ecb2681dabe441095de4ff2f23b6db95923937c83a7cf6b45c272d1b3a6494c66a23da71a7bb91fa70af6dd4893750383a205b150c059af44addd2b96515c6d78acc75c24868276336ab0702d5ef2fd27dbd386d4d774fd54f36d66f515e74346708ca78676241511ad27df647d735da764432520031c8eb80fae47d6b41a51d5c2a0c0fc0325a1dc7b1da85289c02c05347009e532bbe7a96c905a7fee7f2393633e5d2a43fd02d52b8bedbbe1509cca13c65b80c4a499e250e6b191d9fe13981a854be9954ca79a8ebd7d914d2ff748c88c7d894f8f7ce9f8a85393f6fc78a00735f720a23286240c825d5cce88b27d2fa61de4fc422fe877cf03a76b1c276fc95ec2fc4b48344840f6977895082c2080838a420915bb827363826db934f742eb9097a400070293a62f85b6497dffe0fed68ee874be17ffab086f343223ec9a8ef1239bfe20adadd966f8311d07ea85bfb92e2211bad6812517f06a0cf259755627689af6158f9aa9feba22bdf567419c54dc9e5ee1bde3f2a1dbec864eaf0a8cb3b9748cd1de93bb68666d64620bc75a54b5d37a99dfaabef87b1cbf70ac32aff07021e2bfb2bad894e57e488817ab40f9230e313326ddb87a7ee7b82a0e0f3a5a1a68949eeab27fb4af19bb086a5a9fa4a69259e276645db40d8205fb1d50f52a8d4aca67d977ee18ecf3f9ccbd202e982ef46a6f63dd1655bbd097491fa5a613913d2d704a193b6232179d17699c938e0003706c993bc8bfb842693b46c33d39bab9fd6bc856325f544bcc60949b007a8c7ba4d5b63ee4402c1e5c961a957c84ccd7dbe62201fc24f99a56447a8af8799334c708dac3f15db5f2541ce77cbbd536729d4b0ef1d73cf60b5a9f9bc3276f1d0303c09a75d74bb4565294d894d17ca07903d5aa15171bfdd91e97104929439aca228a2604e0e6534497145e23ac2dd3a1e95dc1544cbe3ec303a825597014a4a5e80fd1815e39d8876200a7b7d2da90952852d14d5d39115d0a04251064cb4f5aefe456a23ddafe2e843abc28047bd3f2af1cbd49fdd65276a4e73e1243a959b78fe4d31309dd1c2ccd0f0a035569b32275969fe415f47e363004d49f35b976894e14085aeb9e637b94cc7eb7244b9b5875f760f574a320f4b0bef8096ddc1c33fb17faa071d01c6a371c51050cbd5a1964afaecc6c020134288da0d056491251351c84a61016398f43ebba88ec4d6f6fe4a19c1ad3f76f758abf53e1718a4f3ce4b51e39e53f6e99e4e969c5b7bea66999d304925aed19d08c9914558b8cba0fd26dda01c8127f17038a7d3be226d5b22e51fd947eca4b939f366818ccf3c3f465e8b9284865def0277cc9c7bc517056d151609dce681226904e3a3d1d84d8a12e9e1818e32181897e0fa175ae862aed1ebf379841d2b2598745289bc85c19ce7209a77018636e080bb54cf881b8d9112a58d9ea117ebc4c76955040d2f2451faf5786a4dde671a0688a96d5f9205be52d8aac94c594f8ee1edf8f4093edffd28c5fd4de177fe0cbe6f7f266bd10735ef00b2f0db88b6aece2e9ba6c992eef3b17d2910b56e2d224b8e8e12d1ee1968db7e5ad6ca1deb5e09b5a3a931695a3c50f67d9be59deb52c944b16bc8da53962d17f583c002cabffca63bd42b55dc13faeb4662baa6b45a2132f32f49c529259e7923418be06ca4aabb0a2c4557cc12afbafcad35285b453c134a9f4252a8a878a0f3c6577a7bc6e53e8362b388795965c4577abf84655f64e95979d0a6da5827951e90f23a8286093baf4c818bcd664e056f036424788ddc8e63be768ca25067320896c2b9140fe72055bcf8b9ba0759c0864962742dd27910260a6cd6c57b97d21c7cc6fc981ee4dd076aa9f37fe6aca3a8078f3305a1278bbfd86535a4ec2a1dcf4628b792595e37ac11dd7e6d14650a628b3846dcec7263c50d5e65de6b7d5d575c2f6f585691d0663e83dac4b0aba215dce658904eb165008018238fd835ebd447e7c267dbc489de63d4f5e752973780461e2d42f9f651f8940b27a33bdfd23db1eead93c40c3e7a4be6c46f845960995f41b80bf77bb66c8a65b7bcaad2586bd542d6a0b3c96eeb507072a083789ac73f8f6d06e9bb0ce132321dfb5ad6bdc1b7ad3be9d4bfc201f9a95ebf92dfa5bb7bd897ce36edb3bb3c917ecabb5629dbd47feea5b96f137ecbd65779af4853d35d657f357b4bf66e31ef78adfb46efa93533f1233f39323e71d1abf24d9b0b3a7547f583a785db947d0fb99543ff2165fa6cae177e505a58f768767abd2f82d7fa16a43d9fd5b9430f2be9fa0ea31b5ffe22a0ead93ef2bcb08ba3fb70ac66ed3eb553e624b6b5dc34ecd96e62c77323663b7606439632d7ae916ed3484efcc24be0c9aa278c8ca1a871408b6f06df868f844ee19cfd83ea80dd81e3d6bb4cda96d400730bbcb15ac8c9c40e8ee401c2befcdfb2883abb22b2c0f5f945ca3f10c1cd30d80b52e338a5445a6dcd0e286c738b8e39a28818969e02cbceefaa453e5f3ee615cff54925096fab76e7cb1769d3a0dc08c838cc6703641ac0f5156c82b35c104dc8854280b606cb57476615af035fd124bb71ee9753f2aac6eb514ad7a2a11ec00ca666f97be86a84b5b83c982fd538c419ad4e38441503c18180a2624691dc14ca375f5290eb0e6bc936d54b5113d55fb16775c0c2ab29eee97397c2bb85273fa13bbf444c31d390b1e434df46c770d650fbb569dd39538600c9c0495def36832587cf3c6cb4300a1bfeaf1b3f54e993a09125e1933098bcfeb8debb085fe693c1c119a132fdb504cd4260c3f2e1dad8eed864d1c30c919844442ff0b79ffb69cae448c6e5fb26fca114068eea9387767a05d3a52e4d75ef08f58b24213049631711262abb1cb638acac70ebf1d79d71c210ff2a39e52d425624db51e6093bbf34482d22548454811d8f889d54093ee035752430ec8e0eb5688e6a23d38be3e22a0b4c8fdee0bea96f1c4f1de8705cd22cdcc7b48303052d0e2c53b1cfc4b09c487828ab90da0df93c42ff564a1672b57244a04a41a632197175b001210221bb34fec8a6c1b6e2f8e7b16e5c4e7995b90d57c1a306360ecc29d5b31f79dd8056c624061c0185430660f9d7442c507406d2e88819716056a0406b3cf7198e07aa19f70f6bfb5032acfdc52f52f0f0c46339873e0dba34d6dad3b8971eb2a82f1d74af5219f3930f19db9330a8ab522758cb2d74a14a4720ccff95a8994121da3fb448eb1879153a79e643cbcfeb512c392ce3f6f5902479a84b7a513d02d14333cda25a0f08dce34faf3792733df1578b81c6eb225e65f03c3377ded650dd590cd3a8d2afe13768ea52db8d1ada0057444a09d24ceaa5d094607ef7dc4959ebd7f9050523bb57062d3a6a6729118bb9554dc7c0744baabcac8103e65f386192174a9be60956e1ca8d494286b5020f4b0cd9584acc3660ccc663da472dd104b55625d8c66bc7028f9d6e22ce92f024fc7baaac6d54ae31779643f979f4572d084a6afd999dfec808add6132d2b193e8cddd5d999a78b65889c74bdb472ab1e6aaf3a22034ee903108897712c7343c3a21f4129ae4188b9779dbc72e1bb5fa8dbee516bf6c2881be9ef8fa1c2d38fdd05d6a8f86680b7cb5551176df98e3ce7c27b23f8e760c65d72bb20bdff235321698edcddd6ec96ca8e10f7b719889fb9a21ff311a9cd8e2eff36bb0ae56a99ed64bb064cbe1a5497874593171977f25e77736f3fad71cd0e4ce79489786a58f788bad2fb77186b4ed556794a2569a3ac5a0d432165683bf2363b09fb24e0f141f542d5b04e6599d8f1052a2af6263f53d244752f05261ca2b1764283724620d4149a98e72e855a5eb426057378d69b3a76af2aadbef1a20a800f1c2f455a759755ebf499a26e908a94b159d68d065bdcf5c0b2dab4b5ef5941e8ed503bd46356947ff6315a44b1950b07872d4b648087d2034d6b47d8d81c6d271c06329d64ee311f1d556207e03d86236a737bc55ef9d2449f633ae5fcc2895d8f17e006d4b446dba74d958617f98ee6974f910bd007e41fec3e315d224616de9fc90db444eae01f1632d0da983f168aaf28ca11fc5b11fb8e6b31f749f0ea4d5f55ee3f0839c036b8886e126dde28a7f63da323d4e74041866b8a5d7dc82c755b2c6564ff693cfb8944eb2ca11b8ccecfb2eab5d8af8f61351e9f8519319e4e5d63f0f9c629e0685715dbe0b3a1a7ff8aba2e55dcfddb796aac5aca18b702d7648f07f432af531b67dcff0f814ee1106431113f66dcbaeb2576523209164434f20a5a27e470b9fd0f64f1f2cb13af04e7631a18eb8b7d043f7aec64a0d2eb871ddb1246b245aa8f2706752ebd59b9b1093c2c2db58b47cfb15394f127b1fcc471baa6557b729bdb7af310c44c4760dd164bfab80643465ba77a65d56c7aa64e759c472d909bd5ed6b17af8c1b9a8ad46b3d042df14189c0e7f4b00da3eb3a7cc4d8d6af9106f79570121d70e946e52ccd70d757c085d31e49f16dca40256697f0c05fe9a109cafde96d3209dc881bc0cb7b79329612c75291d8c0bc517f3494dcf2a351c0c6d357e2cf7d9c1bdb97b50f315bb2e47767c4aad78d3e49bcfa537e96edc4f81bb717634d013201ec17cb4066fc0621d1e942cb366fc22dfb795a071f0b79211730c0c3f3f5df089e6bd111e858ed32977e70bbf3d074db0ff71030e388efe83fc2ad33da3ac46c5a3a382f88828ada5c425a5b2c170b1a74b451d64cf27e52272500f9c442c94c840c842a72eb22474bd20fce678f212dfe8928359c101d10acf017605e4d778144813fc06400a4117bf78bc09da67302462e8b6c811fc1705d68c5150d68ebe04806190375bf5f62254734f059467ca9c70954e482ab27b2ac63bed132ab48a07f09e5e0404b5c5e2d370d0b37bb15fb46d083c7340447591be7c227a5c8efa23547f8a24941f8c73788999f29bdc5b700a8f38412f86bd3414d5b3ab9e2056b628c3d13be7a20ab69c1c4682ad08a3468db5a99346b87f72c7153a2483c9cfa85ffae760da7f6ac56271a8903e0c041ab93e08fd00f67555286fbe10ed357575119aa7afe64dba8616d23ebef18a897c5137e881883bec9a993525e4dda7f64861f71df774768a7c28205aa486cde0e79076346963c5e52874b245443990499bb82bc3882bfaad6e584e6b6d6e1f598da39036599bc075fd2eadf2bba59b1d76113be69f4db89a0d58950bd1ab0a516a79faa9fc863cf7dde3f264d48c5c5832e7d4a55a5b033e327a6683dc571508a754f5ee6f74a9d662c26edd0f9d455da4a8aab6c768a516b467dcedd030bd54b4fad0b699deb3f50da8e97aa8ea2e88d894fd5404f766480e38ea23c4a463d045b474783dbea75c161dcb18cf177c45b1fa889b94308073a82da3002c2766db63d4b828b0d26256f866dd54e41413921ff29f20de2300aed502914421e206736a889809713347960caf2ffcbd0f3bcac69f00a93150f0201042e705220d8d75217ee940b730b5aa025f99f8ba9cea5557461e8dfac6309f132fcac8fea0ee87ab9b1aa87cf009dd01326c9391d012b816eb9c0cab7f510ceac432a1483f4382b561eec140c2119f00be9387fb07b3787c1ffce305343007256aa59d014265d88914acc4c676af91bfab17c39c21525c2d5f2023aeb39909080d4b4db8ec0338ff7a0936c51e6677c4e673ede51536a129e3069bb9e2585d473832dd5dfb71368126b1e7d55e14e0079a2e0f5a1110183ac2ef928fa303a752a4739d26d62ecf94001421756551d3ef03c1b4ff779ca358f5b60821ecc34634d87f169b4ff402cd64c3af23307035e12391c97552aa7fba831388dfa8a2c9598740379b18c7e3aaee80e57de2f40e71e9505cdace4e88c0f466cecfea8b98c53066bbdcb9292075f862f2885b8795b851af805f498de4f8e9943f583a801709280a4d063a83cd7d258f4369092b03662e013a03cca9606e018c82e4fc995ee5de70c1d836ec5c164339d709c1f907b29b603ca67fad0378e80efca17af0d28c1ca46904cdc2aff5195cfe5dda31cafa406bd7bb32dba45647ea04f607627822fa11f039b718e57370e49afd429529de2cc9c1056b55395002a6035f1f886855b3cdba479fcdd0f558d60bab54b0aa46122e42fd6ec7ceb598409601603e3c9aeb4725fea4bea997848e4d663858d1349b7e90a5c659e7f88f9de9bba78b4923af5e50efa53cc496b7ea0d6276a9cd3a68e3da43dabbcb1558fff3438df7c599b60277ad43fc17f88ddaea382008f21fca2cdb3b83d4c605e60a9d3c928c3f85760c9de22149132bd93e56fdaa887c341cfc87c427620c2878008801f1609df924b4a580136c19bcd80e0476809075025d0173380513220c494f983bfa2c114648686bbb90f907698604b6a72a186294007684a096e68849a11ea8d21f7708c05430e3c043830597056eebe54a374424b3ad5a3b19447574eb1a96cd71809a6b288d8bfe6c0c1137385d10775bccb31a31c194552ca8614a99515e3abd52dc70d24f0a9ab768d30840b4eb2ff200b638031117198a66bf681e8393d8043567f0e69ba0e7bd806187739ff00012a4690d019cdaacee43d3f377124b6ee9181ebfd39c4bfa7943a0869b77de6f921567efa0f49049c187eca74e900f3d047bb666ca3c728a089965fb91884023b1950d29d2c779a67746fc98fa219a2e992020758746cec88fedc796ca4d8ed078c001495a968af1c037c6b0dd4acc7f06b808b284201e3d587a2de34174c26d88cd744b46a9a2952ab3be2fe05ab7eecc46506c5ec9bb7031c00ac942f903f3f4eb7091740651365e47805199da3ec30d27f5e23102a8e6a07e6dea135639d7ee3c6ab372e6166a2438b4a545dd565c0305da584594b5baa05aa73117e81f3c38b3d723d9cf88fe59f8796272f0bacdd23d3b49da243279bb0646a4f8323bde901a03f63e5828ebcd90343e28f7edbbae9a4bff7e7658e4f6097508d8cebac2e1e51e79abe59d29efa15e4a9aece93f49e42467cbf6564018da6cc550bb73149827e6fe640a656645c889f740833b96a05d0f7711c68027a8a04e84c266f1d1ea863304f9e6352d4463d891f5fff65e3076425c17129902a121ebfc01ba8a0c8fb9f61016012c34b5bd7667065c2a37d1a5fd8188dd86599cfb8dfa2b481a0a5322bb4c3705088f808ef05a2929e3a91e94c8a4c4ef4e49ef0ab80f2a5c2fa5115be9391cee8c396de20b657eb0130eda75146c15695a900b522e0a0f94c2648887fe3592b2f3807fce9a308502bc9bde9f1b8c3065023b67e1f118a6f9663e5b2d0383b07201ea01352c4d88f5ee44efcbf2f095c5d44979866ce4bc123e46905c253add8e3b7e18629b11f8918ac9c78cb4615a38a6729540ac8a639e3840285db335499326e902951d5623ce46040655792f47fd0da673390ebb732486f761b1e03af89ee635715758733e463cf13a6dc6210c026ebffd278188e888eabc2f7a6adaa0df9c351e2693000bf9d676915472b973533f1634c4eba31ac7dda2d80929e8c740b698013bf6a324a0bd8a0a1ca210793589210ad2c27c93e9ebca56148a10c0e63a4b0ce919b68470ddd65e0eb55a189c9a5bd843a30e00f53b439120c18abb1aa2f290b64e4789d1e313f551a905bb726deb7148268e80b6e0c098328f03ccae1e21582fcc540ba0737a43aa12b60a82bb03d0895b769439e085a505cad64f20c21a2f034ec8664e6fc9e9196a4d9b24a3a2e1228a6892f89a7467d9c20c2ba1a0773f1264ad8d3c0770f0400bff4bb4abfeb30dcb73ce3c2b2ba42530a2682ae7df185e9259b5c991f0f6c3b30dee56849869ff557bd1706ae919368e2f053662265d4d7c56851c9a6914bed2c8739864fe6852b70a011dd710a04530bf9e83b407273e2ab777df3e71ac5909962db637ff267865783e34789cd165dca042da95ac1e5fa4e3082aa327a9c703a3d047f25fd2796b3d09016e460091b0dcebf99ba60010f27a7a106b61294fdff31a9065482d522dae4b15ad660a4f21d2fbd0900231e25aa74d5b5ef50c7f48c7dcc16d5a9f9752dd846da8b50ea9f3f6a6503b375eec22e3fc4d552d2ee06b45ba060132943011a3f2e6b267ec9099085b64875f77c18e3e80efa37f05f1093ea14a56a4652765c0e118a30cc8fc549d945474c9efcdc9d781be1f584822162a0cac60d94bdabfe133f619bb22e579ad3588ba7e97b43441936caf7d3b5d0114e79a66210b5cf1c8e8fe0fa91c1f7a6273bd9d52dd6f66b3c4300d860f70653ca32ca8a5011284dd7dbd43580bb55f1700d65a9c829848425a31d2ed3d1336028302ab2bfa15ce7b6e5a2c110fcbc0d32b32dc89ab8d5e4dc64b94aa2a2788a5118cc91174758263c036585dd7da9851288a9eea8bf2fbfe114d4f1205543eefc94bfcbe4191f701b436e27edbc920dd51024e1329173dbfe95d57e8e628b53bf99eb020cf4818b1fa8c74e63b91c6ec036e5a1293deb092bcfeb2326fb5be734d6dc1662ec1850c120ec1daa7d4907f04c01eee68b6b13e65d7762f4ebd1fd42b2526be643f4c1e3b26bc51fc617d0059563514259e99ba3a583b4082e5f782ae357e731a2db7c856a83906fa24d7b648da0538dcfd507cec9945071a1a4333ff14c1e0cb258ed5f00f148ba010940f3de085d98e592f9f68e62dd12b0e3e81c412bee61eb3042030727829c984ac8e3356b5fb6a1fb23c92c039ec73bc2757abc24a64ea8eede30515710cc090fdd4fd262885d90369e1880b233434e3289305c6a6acd1d9e9c8b44a8ee6fd12c9473ec1642f6e1cf2a70928bf8c022879cae4ea2504e1c2b5ff4f0e9b7fb9acfac80f6aae3f38e3fbd0ed795fe826e71a735351df1774d350cbcdf265d8150bc4aa8119491e69fee9706ca519caa902c6b6415ce779eb5bb8f70a26a19ab91e33fff780d384f4383f931dbede65da63eb391b033b2fe8b19be9c83d7b1289c952f311369d9284415db17807d1c5e907aba5738e0868321f19d9fdcf210c1906127a772406fd9dcd02ececd75e0011613f37f56bbacc64eb6eeffc3c4ccf0bbf763655a9901d82a232d885171b324e5c4967edb7b176ecbd63d665a1a894fc648b7fbe082c044fdd923649697828d491a61856c4b39ec28d9018cd7fa07169633a27c0a5ec5076ca1cf0c37001e09f49e08f813dd2e18d8735a6282e25f7647899636b2268b1334c3ea3ccba24fd72e5da41d7fd4d8feca17caea75376fce1da046f89e0bb88cf4f2382bbb65e3b8d35be45f9dad3e19807eab56fa66bcb4e271d5235ae0948af23d137e32cf59240c885830342c39a78e03ec917c3e173b558f30990132ce2a13ad8ceebe1328864238ab5873c153cd35b057eae1006af23c2f441274d2c7585d35128c6044ea9aa48d7c6ff8b7525b99fef89e15637526e9b89083deb631233e650e20ec3fd46558bee5a67f1210dcf2c94be0b0e6bb9e8f713a94799cfde6b700877f1eb6e98bf23c7bed52ac210cd044816075eb6f3a53d3b2a9ef07a9498aa7e41ce87c1f2ae44e92220d9baf5abc0a033dd8cec05b703e9321f244105d0064aa1fb5a7d0719ff4d9f7bd38515616dea31a639d125231c679f34483c7b5df77322e99c49f6d86d7121c8c10e62f7693e91e230882ee482f61c29b0dbe4033306e96edd2cc2919366b9738de272eb2b59769f624cb4794aa8813b1b781fb2ff0b5c385b65e02eef90c1afc796068ea3b10c7739cdc4bdb2bb10206170771629f00422d7704fd9491234c6dde10b217b6b797eb966e3de2fe626ccd8347d4f9aa9ae1aea083cb41ba1f679471bd4539f01d0bc0f8e7fa8da14499bc9afa9d5392e65713d8576e129bfdcb1a59a35baa23cb1ed9a8d5a924085beae5f098d1500e9e2ebba542107437749dd411c1bc408fd2acada4f220bc8c120834c3a1b815a33005fe91e4f079bd795785d1c6471e5acec414372136a4a8b359392dd8e0c9c49bdf58b7c1dc91778d4ffa2616ab2889e349756c883a18412cac8234574cef1b2ee307b4b1e4a626d4e27421dc22841d14e7699bc4df2baf22914283168aa4d07e5f4118c44986ea3c0e0812a77aa32e6d05c4f3781abd10a7e69af7969d3f115b612de31da77f57c7b8539889ba168cfbc896dc08608cb686844c62b33751ae06e7af241da951d4c1e1c491d5895c5116e466d58cc15df03b924d7d2df31c51d6843dbd79667ea4b9d5cc0e6906160e0162900cc989f874cb1d68d20a5600d6272357058c8d3b6b56fff9f9d871f0a3e941c0ee5f91344f678996ccb640a9765979967b373cfec851c3d641862a2375fbfeefe25bd441a14cef00c160c7e54ce24fd125c756c6f8a77108e886838d1c3a8d6a54bf00308c5f794c05d7c6c527e763b072e6bb60e884b59e71842485fddebc38ad8d9e09e029db67ed0001face11a34a8e85a25052c3c46539694f5b6dd76bb9f761b5c08b7c6ac73750703f6447a5e378d53999ed4c36db00b5a1bc34954f74e43e3cc6b9c6a1c589ab4f28d6ed59e6a563fb369957de1e1bd51ff8b7c217e0e630c20868ab7d424c5f30c5cf649c5128dfa1d9724695a366df40ce0f50ccd5bbac564114b76ff3a3b14a5e56264171e64382f9ca355988577cf408c4fb622eb87aa9ac4ae1c7e6fbef1bde286292da8edbec4ece1ba325124d54260edd7d926150fb9334a6922376d4cc8ad16c0efdee58e1ac9292f9715bb6e7837b637afbff150a6f43784501c384af21a902642e630518d1c808f2e21c81ff5ca32bd9d37d45567f22effa8552e3847d2b8bd4b9e90c02820c0e9f8a64f6cdd68af9f0609cd3f045efd916e46dc8b235b16c132b63ac639ebef1b61e750729b6e8e0be7382419a11ffc85fe4bc1f680ea2a3b034505d08bc85c46f1afbf91a8c891343061f2eb4892df5a81239ce65b5937b642cc8c544cd3c48f4fc74895e7787f94fb1cf1136ecc9ce989ba7680186a850f02fdcce907e81e4f3077edf40162533b444d1337458c87bc806744a6ed21de2b4c8f6fa8d4e485fde30c7c675948e2cf452056e9604ee0979746908e69c50b92c4e874fda2d98b48f24135e5cc959c563b2d7e51d96144482c00336ce4077d262f9470459a45507384e94b338756e422dc432f7bd222604303eea22aab44092d7bd406013b236c5658929132178e7c0a5f7eaeca26497acb37f8ab3be6b0a083625370088b6b66c1427cd8655166b747abe48c651ebcb2b9c1bd532a9f7264350583540e47893520f678df040703c2a8e00f5eb9968d884ceeaa94eba7e9979c269a9e12356828263547a7072203fcba7100ed53b0d268b20d32e494bfd15277b2e9195c5611f34fb2a933260551e57b5d80281139024b2bc68ef040539d2e6e56925ca5b56651d17d3fc9867c1bd34c45592900332ce6bc645b6b9217631ebf7c693ea2b2f22253cbc8ec2c9913c0a7b84ddca63b1f0859efadd035efa708151ff9eb6da261ac5650bc88437ad4921987ba20860038b823c7ed0921f96582e9b4beeae1c6aee2bb4d41c3b321fc047ba3c3a61925f53476dcca6bf3cce1132030e679da384db97aff13368653ee09f0684060e97fb8b4b76c7a591b317d5f52da588efa1d1e6537a4f2dbc2bf4e0e85530020c536a86c65638c9a232ce801b6048d90ada09535a62749bbb3c4cb4e6b77751054329c08dc7439f8e5b364761fdcdcbe27534f7dfc59c816264025606cd597954cce172da9c5b18a2684b11e902286e93a9788cca239e6fe937577d919c035b706f554a6fc47dc48fe6bd7eed90535e49ccf2195e9f11e2ed8bbb067b0a709d2fc188ddea14ede51942c069df011935d883a36af3c0e349df875dadc67c32203d052e857e46fc8c33f5a8683444c046d1ddb4b11baa51d45a32c7bb4ff4fcc2e4afb8f1b33cbf85623c1a11bc0b918d9baeef669c6f4ed63f805cfd47b4491bf0a01b2e9374f007f00efd02df92772d3d902cd681108698e266588343610949488017d4d9db071ed8b39159010d497ec55d9614a9f7f60896a95d4b865552620237639ce425578d7d21111151f164601863fd5eb63c293431028613aa2809b1115d2ff4d78333ac654bdcc13b25af3d431fc751e9c6dda885ec009dc04aa55612e451212c1ac5d6424db0c206a1259441aea70486baf62d80fa9d88d2c12362655a3d07b1203b8dbf8f4083fae1404ff4e17b15bd88a739a9f5608e271b38f193632f46b8f9a348280630941e024ef52a564beea87aace10c7f00f5fac2f144f652d7e38a2beb7963d649d6a14bf004ae7c25f87798472786cf50e949b1bef1986e1d7e2dd2ca16edd695e99fa8ffcf7e6d3efe9ae9d262e0e731047c4972c395dd3afd00ea3b0bc812c53505d5d3f879a123166f0b2fe70642fa70b1a2e11165caa2376216f0b95920b5c1f5dd5e679dcd5f79a93b55d895bc0755b55b82c7a2688b73bd83307f1deda239ac00180c16ca5287069f9aca670945c235767e110c1f404bada730ca24ac42c6e2f518ac9868240ea5f61ae4dda66517a8b9894da15e39170a551a037a9d7a872942cee8b4ce10376557e3e8b7820a461c4ca7ac34aa8ad46caea86dd75a682504988d7a1bd80f2ffe8681463da7e8310419d6b4019c74a7198b8d9691d43cf81689a0baa0fab56d2bb5fb2551dcd866bb74c41e1519d2a3cd196b5e48bb86447d3494a593c0dceb3554781173670582b54e7ba601502f36405e66d5dfbc97782219fe606e51fd90276c6b440209bbb4f23650584721c7aadfd6dae5ada241f8a140f6c194e600f05149a03be34b5275bbb7343eefc75d8ce7819feaec0917b1f4952cc48136f536e8f148787cc0dd27f607f348881f21750aae3417ee1dfba4568bf35463028a0d00ee566b4f4c130baf8265a8540da26bacf7dea63dd28b1c3d291572af3025f123d24fb9845fc586cbe242c3db045fd7035d7c37ed740e2fd807be0861e29b9c8fd6b2c81368e9df30af877db8ba1c5bd8d8577937d0856f40da31304c5cf270abda649b65e9815d799328c0c96b07263532b1e00984c31f39ff071afad30b57da28b14ad92eaeb5980f7a1fa54202427e35ea4e4da580d8618ef3c579a73ef9226bb19c3ab58ff2b1e537618f9f008bd07abb1cd59276dada3819d1b29c74e26d8460adba11a14675f8b4751daa2d5095d78d762aec88931ac87463eb96615c4ec67c1a2307edab1f0672208b2a1f38f311b45a600532248f1fbb6743fe0cc06085f9887ed939ed951878df8d93b7adfa276422df8cbe593cb0f1941777ac9602dbe9589a1e7fc3e5038760e5e6222ead4463de2ffa7c7db77cd10882fda563cd405a278669176544a2e7eda594191017760d6a0af84472210159fb39e5ff6369e9e456aa71ca4eccbf163d8d2e52211cb76ea7fd4944b53a02d3c4d075455ea79ed9abf481d8e87b3a83fabac8f9087ef8e2098f424de3529bc496c9d01adc0061887b824e1a45ea2ca8550a2f8d3d6d751ea7261b21310d51bbac31c7871295a1c44856314a15b0225e4db67d2dd68a1a82c0ae42886809b48ea77307c23e9523dd343a19f4670f2d69260ec775c703d4279fed6cd402f57b15d2f3bb4191168af23a95f6c897be8b82cd87f1400303c3715ef8400cac5caa9d8a567b7b75e20cf62e3483dd412c57fbb4c215d1df65d94aeb90c4c85e2924a7c33a171767be4731cbd9b0a3aa4c82412b9908b1ff73c04739d10ca0474b41532d4d4f5727d3b5da9629544d580ebf974300d06287ba409638e362da790ff50faebc3d3d30d64068f0fb0bb43cfac2c98e097c832a15ec9d6e49045a570d47b5e9ee35e201f8cb0b50aa1df70a762d36564b1c18a00df5d6431fda453e0189c6e3673db4a39f07700bc4650b5cb8a02362b52f1cfb2003a4690eb918b48f84bd207132a63930dbdd8d285f027100e5d9d12992ebba732df536c96e503878cd1b838818aa23ac8d3b30fd53951548190a26425c66e350568c4c88789227d2d2c7422aa8b27b6389d6a7e9e2642b7217602ebd62f7c95361ea8167f89940a84a3248da1029b0b4334f704a056bf478f7b1d5d190a9113a6f0fc8327c43f8a46e62fda9527d2132dad2dafc0120b90b3ca80eaed51d26d110911b605098289bcecabd15d4a06bb1a97bdbf94b7455b40c58173ca3a61729e07e2d7a21e03710b88c0e3e47980ecb1bcb8aef1c512b7c8bd8c5b8c842907a3f3e2db9ab53b227a3749cd7ce04c7777b18b85a1c6f255f0f422d14ea7e744dece1d4ab20ca54fb85ada24767dcb21c4c24d7518ca35d26c07f9886336140448bd5c67e9d47e44741c62f5c15282ae3541b14bed9f79c40b11d08b77feefbaa1d5505073888a48092e7677b1af78c179007dd9adb9e77a6f3e079c019333799010eee8a5663bc37b4ba51885d2145e0bec7e2d1f47f06c2191209ddf47b9af681565a6ab3101f488792ef1c7237a9985ea49d216cf164078cb8a440e63e81db62d5b10e9c7b387a538633ab74b14096b130f2883915de6382b9c190cdc00588b48b995da2b9b76bcf5a260de124f32856fb8a85d6d25e525dbec1c1a2c4a10e1913f8c0b48432188b7b6a90a97f91f3ce62915ff0b5d61858a07b16166f2d3a203514f0d9879e27ad6cf86da55e2729004a5ae1da69c37f50d32758305473f86e71e7a2012938b1e5a6f4e60f5953d0d7e03d3267c37413e321f463e3c5d48c429d4bfeb610b29d47c8656882d1f1d890e49f120f2cf86fec0b89a6f734c0c69526078381efa82a33dd166814e2572b0d3efba8bb664a7f3c697ae7fcaa3691358a84f9a3bb31438809e3d4f54a5629245d133fd97647bfefa3066816cc2c100d2b53cf556366f5b3c736435fb4ffa676695044562a8b58c39af1e3e7176c0eb9527dc5b853a41d7857bdb3fb6a4afc27054078fab458a1d3261d9f35428de743ce1acfd2203b81a0abc2c3872c9d0759345f393798d93711078146ba976ba8a8de258276671bd80e337f4eaff6107f61e0b74850e0a36bec04bb87598c3464121264b23f09464cc3420045114d92e4763bcdf66daff6d968a95acf443232a5874df0fea7520f42176d074251077bff344ce582ad878a5b09f944073cf05423f6a4b8e94c505f52f6b448935c3c8f914d13527e5866eba78de0cff7682035b276ea2c04f126e81f3c1bc1a038afeb0b8d49d5e7e2fbc0ceedb0ae8cad1c4a4a3c22b51e28d334d4729064c87221c17679949ebccb881c6d813facf74cb146657d366886b3b8c4743612f8c7ca9a448f507ed1930d6a42e014735cb8264afec0ff9d8a0081c20f1dbf00cf57e5ad6611d13a68a959aa50b210a4167b28c4e145483ef28e20e8815beb3007216f83dc50943f5162add3486def72b7439ca6d54d20d0bdda0f3d6a1b74060515af10d51149f68c1df5b431abc9e42804472bbfa52419b151673d60228b7aee560ee3ed6eecdb404ef1e87993ac45632213954069784a8d9155e3c5911a1fd890a0a0209d94e9f3654dc9c01671508e64dea934b0ba0f13af876103e80b98d8f8e6fcd36409479a23c8e43d4d3a04624d107c291de2394378d8b81f92dbfa060db3bdea95dc2f09fc8f343aff221353cae3c896e48dc36a885c967bb7e3a555d2ad3603ecef9a9c75412fe816c704661ed403bd9fa0caaa944151d1a8c9f89d6e406ea38a2fd8c9cace2d775f078ab70ae8d4d351b7633eb97abc2cd1b06c0affa963057c600f0f0dc35d8f2cf30b151207b4546fca1bcb555465e74db5ddbd7e532cf2a4070d9a2502cbc674e65ae5e652249fb549e9590db5e8c3ac27d4a840013a1853856b7ed58078aac3716a8b8b505635209e6020fbd2274b54afde0487d0a843c6194f38ede7e47280ca4e2592e9eb22683b25ed7a8ece13b98411e7802716002438b11060f6ac36ee506db2294d06c45fdcaafe99227816b81d356b94c65dec03d651d9e147ec154a8a0d9f8b912e90d674d6c58d390be7a0a210559c474ee126f4c558f4f41ebabf6f51ce1a3a807b6ad5e38eb48804a04d74782fe5517743f5949943a253e3fc24c90f9a6fadb14daa22eb148059483359bf7f3688075951c833aabbe4bb6caf98f6c87d84c218314cc7b68641e1742830d2b829a2afd073783cb203b265d26904b613c12d2c035743adb13293067ed4b6e8b947c7aace4365545f4e2171130b2c2c9b803c82743ca9af1c31d9036c4c66908237053f7ff74629bfe03b375763d640d0fbec537ed6d0a997fb82ac060cc4da3e4419228f675e11f942079a61ce5f2bb2968f620213c08b33f55e6b4d95d097d51a29a755d9f0db7a9bc4c46c4248d2a77280be8e0a55ae0a0a6b12e2519e897739aeff14f691b50a23f2f94522309c55e0cc078acaf3b78ab797f1fb6b7d9f797c87ee452796cdad10a1ab8485b556075b2b425e0c9f0633b4c52476dee4672ec830166f985c9a792222a5cf02bf327aebe2f9891425e537d471db3c15af259e502511cde8be92456cc26f9a07767ebdcf2413c50ec9220f93ac42fafcff215a4d1a27a916ff49f76105ff4f58e319f9e2bf191164a4bed6ddf01704c7d6fa65ae873e41ceda096ed771e5f2ca1f154e2b6856438ec28649769f57d65c85e0e364ba9b7e8e5e1935446dea34b3d64e5449d995195149ccc47c5a0c06a292a72844bbda8f5bf77c7bf6988ab330633bb62963b49830db7a29b0daf36fd61928f6bcd260d74d906b1eba7f1872c04453c9de0815c82eb73ae9023979a4213130672298ab23f28f43a1c4184e21e2a33a2ab9cdd263987b65d09954e453d7d08e7a660484bc9113e1585aea823acc2f533928de7225ec1ec1aa9c904cb61cd51e69c0276de539c54a9b247f4d278efd439d0e4f76fe0a27de02a2f7b154bc0cb454fa0440b3bc0007ef1817ff45a544a0af6f4ac65c9dadc136f73b7f1bb44ba9538855ba7c7dd09d63742464ceb6957f1f3ec6fed42288c1d0079f0cb1b7cbfbaac5007efd204866266d39bfb9ed5251ee5d97c16b246ad1ad2c47c1c13a6c9a188a10db411ae4b64346de6722d428d0c26f2d42258718ce5f765a5a2796ee58650a0c16b6be89ab3af37fbd09e37d055b45ed659d92fdf3a0b48483deae1b93db73a980c9fde563ed05a6c91ca7a451f8ce441bb705591855fe73ce8b5edb1f495befbaeb81923936bfc4ecc1a65e629475afdb328d1a1a7f24047d53f08c0f5b35f3a437f37fc57457d78cc59ec7a65236f33a317598c83d8874fc6ee3cdd8a8ef7b1b9a34740d6b6da4d93188130b13b3ffb7dd9a178c6a22e324b2779e21e8517ac5f38c889143da128807e0e857f188cd37b151d17b787ba765b537df8acbfdaac396846abb4156b729bb857930df7047dcc4faf68e8675346aaebf665666a2c36eb4f6b9861a624cf50fe14cce76c11b5a0333050f0714d8d267378e8024147d97a15523a93d9063b92bca193e409ab546da2bba99a177aa35a1df3876e87d2749d76180857125de5a340043217fc0e7ea1f8ae1e6a25edbf3904f4c2952e61bc2b245098007df38d255ea9998acad12f3aed99f221c6d869a16e0c8996afec3b223a50b884be6b7c55c15780b1ae21a9836cd943fbdf6e9dd227c684302df7e55643ac5648bd750eb98d85927c5465ebc9dbf720f6acc2a064f8e659ce18a2c7a8b774a7cd8d8e4b5b50737a876105b5d8e0fa34ed5b9543814ab9d986cb20bb148fabaaad563241d21fcba89b6a8ff66c5fc0bf2890ed833308657d05de53ab50d61056fa92bd4edf9df1e33b1d894ba0bb687dc1b7e0f1ebe941853f608a69913828f525c55a24e33609cab9a30b9c4b10b909a7232fde842625381643e5cb9fde572586d7195c190f5145fa8bb852e4319b157db3b3ad5422ab23ddc5ac45a659e55617c106c4c751c3fc9ddd70dda0628d4323d56316a0ea184c4e57e8a556b717f591279a01e9e259e39ff1b177c77bcaecea8cf00cef0737278e0d45fdf360ac878f97600337fcd562a8c57ecb01a4a6c0cb117b28a8eeafcb85f229cb7f1ead995c88fc57a9df55ff6eac8ef645f765293407de00a325ffa31953f83e691560b2f0fe7a3131491e7460bacb679fb6377c377de67c55834f1821cb64fa85efccf1b57de7bf7f8a1d0226c4e74bb4a734e669edae162a2b8e3b588942da6dd8d9320724451cc7b9d21a90d8b909b2fe0b76ebebbc2e282de5d1f1afa7840f55e35c097b9ec30865c82e4147717696c743aeb9c39d37eca6fec3a85e7b9c486b0bd0c976bb29ac4fdb4887732de4b323b93fdbedba555612b0f5d11d9a1217cdbe62a15721ba04a0c17d9ed513bd8520e8dfdbf9255e8c3a849cdd537e809c06e495d3f1ac767f073efccac0fe2cb38de87123af3d81c857be794e641d626c590e350b7b13482ce11ab799130dec3da82c597a9369c09515ba1123e52b0f207145de1b4aa5e4e42223a7e0cd3647c7f5a5708bcb05970cb95a16173b0e77bd0c788f744b094699a3679b7058a668d4cda31e9418450ae24dd817aa3d354f56bf43c92e066633ab2594b9df544d4ea66ea344c29262d5e49c33d6b31925def484af5780d957270a52e46e59cddfbb3a075a2cf221ef14740e0d5cfe8d87a2c20370f4266722f2686caffc4554ddd6547292131032b5b89eaaab9786704c39525860c7e108fb871601ef28d43657b43ac499396563a09cd7f2d3a4f8994f4aa97a6e80c5878f81ee3b5de4a7a5e0b704ab525e47f1d5266e764a0943ca7a6745c6bf7f07979590d299c5572d064105ebc538809b756b30541187a0ceb47cf04e0b98ca42c3ca94297fa05cd82f1cbce341dfd14c43afad03475b0b3142dc474c603434afad90acba7bd7867e521ff2c3c4f80ed18098ae3d9ed6bbc882e174cd0c5a38136014200682f9dd17059a4080bc23a36696db10c1a0ddacebab29b66a0afde3c10b7751f01ee5cbb63f0e0ec63a16b52abab0f0e7035bd24c7e35d092a43a03ee35019a14adf32e7f1995bc00d2a982ce2153a39f068fdd4038e750cffb5fa32a885ac2f6e74df05b53fb55947e5110d02cbde46ff87a8624b71262835cfbf816b48e226916e610919706f303932458eee8c195502954f6ebc700f2b133ae702fe74ca2e244a4357f276cb510725565c1909a48a0dbff3fefe4056320fd67b2d3cbf4e5937a29f1dfe80150851d9e4c5fb0fa4ad3073768f2d7cf757ff9df7e108e2001885798c2ca024b0c0c372a7932c13d9aa46412fe4a9e2d9b3610fc1f566c59f18e367507dc6d8009b8f5ccfd97a76516170e4dc99db8e878ff537e1a659ddd44290cbbe14207ad0f8178249197bb56bda9ca0e6f40dc8e8424a100c7713677ef74dd1b9327e896300b1e7efe35e008aea78f2ab31f90a79b3cae15e651bf77116c0b991de467a365daad74daa48690011c05b7d77ee774de047174815de8c069335b6251746721a2d40e80426833e3ae1ea1f68380251fde836ab8d74ae395b70e54c0d45c340b46d1501dc6e62196ebce033c6e06d006cb1f52c5656d0641c88e30fa083e33d0be1e72811d37a1a7717456c22a43af4ac48848d08471743ea576d6202d21d06920c735954c163ffb89e8047cfc98fb48e966a3900bb07769c139422ccefd104b70bd5a9a0797a95c68dca077a2800097735a98b179041ef6b53a1c341163edb53a4ced08dc89d6afb286646a9a2df259f793e04311144848f2885aa7467060dcbdd5604233fa96a043df547be10fa12990e91527b170f5ad45d7dffbf2f02545edefc8558b9651b94e5d9475e06d025bf9f4c0f1d5c29d78d9e307cbe755f93444257467b1754c0f810791e2801ada38c87a1c1da543b852ad1303d02be43e11aa74a516e3213d1b2dd94345eae098ad90362bdb7d4d3a1a7acf5d8a644f8f47e17e529afb144d084f306e00f3a2fe3494058ab5e7d70a67fa054881ca81b2f4a52b1a7b3e923ca2c691054717782b775799483f5f293c756a4da646e1b1ab04a6d8ab5b3dfeb26728294abd82c1da26747e62b5ea03bbf3d3cd3c91e89e5a29775c3024162bdd4fd57b293359a1a18ac8fc8f5408174a1699247030029a68305ca3ce4d6a512542445fc1411253ae6ac57628cfc4703630509ac6747718d7a1a4b310f57ff100b086bac5f62f9d6a45f304e1005a236a6f7d033b546a20b3fd3d07a80657e15d865268fc60568ba7c4116e9018951e55dacf1aa567ef38a23aeadde6c02d4515bbb490e13247c3387d2878467e929f1a0e72ecb8a772ccfb800191bd4fa8ccacada5cf7451a55150b51ab9ead7f5b35dcd627fe15e9126f74c75f6510d850523995b9edd22b5ab6d8bac2739bc11fd184554ae8bee1f28f4b663e3f739b8bb4e90cea4281401ad740b1c7c816a50d2803ba3fbc17a7f75832aad76bf1cf766105f5d3081535824c48981afb293dbd58c1423ae624a03daa24bac94bb65ad5ab2f112d7e060e957890c5af8cbd0d414519734c2c026c591b8c2199ec3f44239cef5130aba751d6e30ac6349cdb8946668c984cab7ced9fa0ad5902d8586f49436c41777ce8fd654d64f9129b8cb7f6937fa05c7ed58d192fcb0848fe69a6cde2c057e2325c1e6ff7dc3e5dcddc4441c460e81aa0343688e79b650411e21f715214a3a3fb80224481584148ecfca6cb5c6d0c6b28476ee6c64bf6e4621714105127cc719f2bbabb005bbc3c5905ddaa5fb4bbfe118726555d4bc899c792653e00563eafac02e4d83a5c0c671e0d748010518f3701d74902590ed3106cd5c2c065bb30336137b821e20a30724d1a506e809b8961031bb0a890c6bf8353e2676a8f2b93653ff11affd650122786ff49232cca019e7a162b6f4a5dadf5c63f8691594cd02714bf63a2b63db05dbd01fb03fc3e4cb6b5c84b93fd898825a7f968cff109273493fcca188a639402d40e2409120e16f58e92f37185dd34db706d26a713fd89adc1b94d1eb266def9befb184560033a5de8a905e9dae6c9106c5eec050e2843847e1133e96c0428001c798845a4ee3550273da30e24b3d44cb8a118e587056413d1713aa00eba32967aaaafe5ca72214359799750f23df629f0f04f5764d2b5c28e0e69c89aea593f40669735e8541db715528b86ef9870de6359c6df127f2f95b4ecf2a0a3f3e0465ad3bedc112f0a92782c908083aea9bf7e015fb076db95adabf6c5a7f99482a5e0f88b369406a9d1561acc7299ee00a11dde8a2ccc15ce41d7a5e4838b821bd038e62f650092d180d93145921b7ef647cd02a216c795258716e28231ac26b65963344aca604fe1f433b57bdaf4df4262b3c84adc90ac7c12d8ec2929ef1a4a583bdfafe1078ded6b327b27833665e5ee535462bb7c74dbc173e921175e9e8c95bd118857750229c4bd16f49d3bbb3e50cbb111427d63d45bff20f1ccb18d221c3e8d40492ffe57a57f40a1c824106919e0a12a7ad6ec642fb0a5a9726425b21c430dafe3b5b7f9188891dfce39a3263239f297a4857edcce260acc96932c64e26b133b18b92f1a4c776f60310e18a3d40d70d8292dc9f3c4d14bc3aba6efb8041338c62b4fbcbc03a24d716a188b0a36a31aa6f3752cc57216e2cf08a45a8f567b7ea58046af2cb80e27d1117eea4bd7cfa731afb94765e36116363460bf074ebb54b2920e0c9184d3aaf61b42f3388238f6bb2f7928e5a149504067f10d82aacbedb614a5a7942f3a1a6ce99d4bd57d1f780ffc4a1b94dad7a1c015ff0816921eab0381971a562c8aec43f12f3428c7eba9ddbb6702a6f163fa4ebbc5377b3f77c6cd463606f75c498d8af8e189ebdb16245aa1db140424e2f273265995525321c7bd445a031861da3f98ca9037a81dda284592a45c261afa9589168972710dbd1936855961915221b0c8bbd6aa6640ab91b5a38d4470871967dd0648949191795d352851959740303a5a4425292c481648e41f68bb419566448b79e30341b11a133181f39211b0a381c1130ede31db073596857fd91b3eaf5cb450257644580ec6086704c5036304b1823901194118a0dc90e660a6224001aaf85a722cf1b9faec355e9056f3b6cdb306c13b73daced706c8bb1f33629875ed8b663d836665b78dbe0d91e6fe36b9204bdf06dc3b14ddcf6b0b6c3b0f79b64a1d7c333ef9ebc78d2eb47e9b3e10669f925e42b21430f0d7047a27c6952346806776f0f559ff0f05b0c2ea37d0aef809e659a8b356a17bb889a0c5158a803b0789de2866a8f6761a74a95855f126cbe7ca20b104ad44307756b8ba41e475bd854006e2069e7cdf890bc1ce9f8f092e6fc16d0871ca703e450a41f4a7e9ab8213852fe75741e34b3964a509d119b783ffe88dae66c7db2d4e626432263d76adc076b178ff2586d84e254ed33731bc7b6c311e283ab15ae2fcf68b3a8995b53ea6ce9476c31d321e0417b85b1a728e952754866d39e890848c6c8b355a2a1f4522294f4c3b17c55715c8d4eb30a38eff0f53bf60b23e320df2974530f48dc0741165cb3bc5b9ce98549f4d4d23bcd9e2a515f04e5c947b1a5330e0bf35d06e91c6f017c572bbde1b7904f62976ef158988f3248b3f12dc4d7dad22b5c0bf059ec96b640691f0f4d2eac17ff8de492d35bd7563864fa2867e934c785f9d8318de35da0af6a4d6bf916ec8bdcd23bdf85f9a4dba76b40da0707a6a1d3a475568e17363cb4eef20e13f97cd1357d1b5da6ce673aa675dc05f441cd6955be85fa2277e934cf85f9acc3a76d91f649e62b1c64fa4058e9cae60b1752ec2104a5a2d83eef68da37ecdc866132299b10c62687aa0597c0cd9bbde35bda19ac8e8a10707d1acfd47e8aa898d6ec65e5035e56ddd5a26776b4f1aa32b3cc9e6d3ce4995d464d079df40fb527cc0d3a4ea4143754fa3593d6c4fabf2bbd20e435e0940e6b0e8ad66400e9068d7df22310ceb3451e02e08a5af53efbcca7d66ce6a79f53041eb7f42c155feb48c73b158cc6c64e569e743541af88579b255cc91ec103193995a2ec96879d3a78eca91b1133bbea91c7637fa898484c471cd010e8e79c5c3933548a80c37eb5c82cc66447683c67eaa0de60b52267868a11f1d94f6a36f2d0e105c43674245a976b76fd8804c3b20b9aa99846e68e06b795113c8c616f345b625ad05df594596145d26e40a0d5e970ca89a868992d96e5ebecbf473f6d12c61280888bbb84881bcb9270d0a86af20218156366b087175f212a5313752d97b5d1ac776a4c1fe5298b6f7089d6d076a890ef7e3f5e3f4b07ffa77471adcff9e8e6a8bbce0d15db3f1df2ffe2c0c0d8a1021c99b7b89e946e7e085062a0489cf5c2acd58416e4658740c98d285a564576798ebe02b8d44bbd14f95cf3f416a6b0bb1e32f18094e33e5f7597113119d918a743743bb0504e365258c0332f4af11780fa7e258569a6cf3d71561c521381be53216340dfd3434c5b4ccdfd714467c38d72490e528cf87eacfa0accf5b8f39a60f03fbc327b7820a77d10b591824472597e768662acfd33704fcbd1110658cb18e9ac7ad6665206a727bdb691f07d4119922c155f33bb667dc02a6a3271a7fb36cd7a86321b7465ad715953def74c9ea6162539af63ddf1ece81b58ec66044bab4c1d7169cd46b33ada4bfd76d576a9f223595766c4ce2073f45f231b15e3865e5f38e54f3a1427c16a21383b4e9553319f86c6916d87f214a31edd061410b341c4dcdeb7e5ade51677eb8c34b24fa8cb4db5ec63fc7bd0f265cdafd1a5ba6765d030d5608eb47999b626928a3091316755d2a86a4008080c472dcf48bb37053783d76a5396c9ff53f9285ac4e8f916b29683ab1ad2a57621701c5d81a0e6a10eda467973f0d01f6e584f8fc2531c390c357b206b8ae5f29f3836da08d1696b756975e970423d377926bc8a21f4c9a73c7609b3749667ce36007fb92f58106bab95b526fce37262fa8fe8dd8b03ec34fd369bd2f6c2cef94c31590c0845401dbb7b4d2fc49284a21a1d227baa1c7c22e060da007e30012ec7adc1a4b886b33819cd68db91c4f28b5ad0d0393288849568ae911ed420a8120df4ac25e3cb5c1a781236fcada7b7d3646b3fab89f99836e2d6b1a56f79ada98db996e54a4f83d37dd88e1fd22e08739c7f05e688c63d420090d27e1c8822b2a53ec26a5f6c26be08c9c3ddcd4c8017433a3b6044204a2357ae131a4b2b03742c9be9ff20b37237cdb22b5a225bd211d9ddd51f10769a77f4e73c820ea0f37f37e8fe5077a970cbb6721b935d27e345e0aa0352d3b59cdfd48d22956808c42512c917fb24c3cf87ddf630668042e1969ac188647b87f607d283228a2cc277bcd19ed9132f1b51ad0a3b22b261963985ee9df9124f5e3d17c388c40f656336f9abcb8bc2adbf596748290fb2ce9a8191b518dd6efa5af03b640bc060bc7c7e61d42e68b75b5041d881904e396958151114f3277d6eb91613d46aa800be476e17a02e346524ecdc08c357a0efa96d3e1567a58d7fa85b0ba39bb23b37e357b738082706178fb36e23cf072d904b25c9b7cfd775049e222ae60037d960ceaf68d2f089e451d031636e0f22ef5b3dd85be8d045213946d5790fd73cbe0bab2d27a9b3a283f3120fa6cdd2d4a9f5e394e69650f53cd5f8d2d2928a60164a6e0fb24af5242ddf286528715b4a3de2424ed90856bca94c83f7112336f99089204087be22b8937e946c5a8435650415db496796bba95cd04f631f6dfce1e0e01ce88fbecaef0b8faba0fcf781b36ecd1fbeb1b0ff14433ccbb12413d2a7a6acfcf723d6652f9a656d6fc49ac33fe80b320491fcc3c7e6c07b583ca7caa51c4487e04dacecd9830e8e8291131c5ec37913c8c71b242ce396487478e6ba435ed06144948e4ebdc99a5b476aee681017d7213d5f871f263b7e6653673320101fc5b3b31639906cfc016d3d7f430c96f7c848fc7e3589a043de681e02f3bbdb5e2da27e66aaba912f06d695eb4695cb8027cd23f0cce647a0c94c1952e627d0761981d15773d3dd607513d409e7190509f133db2ee74d854f6cac3acdb6e388b3d4f13502351ad37b85a59a405d744db3f09666ae07ea84b4c36b9f0822ea2214d77a9acc642c50d739e91901c98c322f206f9b9c5f2550d7806733085af2bae05fd2f32219898299c28bf043be0252ef3a9ee56272a3e96db40d55d5a1af3bced7e5689b9903ea4ecf7d2cd3991e880227ba955b3880627f3375f1d4885cdb92f2bcf3c90425ada1c81ce810797161c1138dd272b483af1b918fa61fecb452d2a9ef14a91de8d8576af86075a135690ca5933b575f7382482478300c2b9a67c4d8837720f7324e958fbdc1e41e2ff16edaa562a7e8d10d84b6a22c2c7da02af692723fbf3d5dbf55c05c9e13bc025aae6f3377c6de5920788621dc2d8ae7c2770f86ad788b123d5304e3e41047d1b4fc693d49d14bae7617fb41b1af5a5336727226030e82ff76ad00b0e7e60bd366e0ede5d6dd2243b3980e2da44b4041a3624edbe14fa7a8219b942c834cfe02d041422896f9036e1570de396a1b734a7a9d5287f4df0d0e3e5e425f2fa4f419987bbcd074f970d4147d3e41b4f3cb6fec223ca06d83a72e12e18f69fc879365c3e26eaf35d179b44204ca79b3803970c5d6def246878fc2095107d13bc1daaf860059bddcfcdbf503cf2d35ae031443ce816937994a778d49fb865597067a4c10c9495b247b847944dd7fb92aa3384d61431dadd1aa2d8ae2d1364dbc4c279bb35fc10f076f5a33c6697d7655854c490665783c734d838d3ccfe8b2179ca814bbfa341fc46efd929f5cbe4610bbcad30bca0ea899b1a0676f1656baaac54eba07279dc8193f84f957725d808063aa3fb18dc3bd3f4cca749b78d3cf48a2e3e6a8d262af5c12574973b34ecb5390e3887c06be84ed00bfa540fd61f122eab23d9e5ccd2f68d59d9d9199ed12a8439726899eb25faafcb12091c9d76b64773806289db76902ae488fac1bd9fe01ac69c83efee9dce2a8b8d042c3989e4cf6841edaf3dfa9f588d3f787dfa290d60b370867df87cc93c828d4fa969195caddebdd1c0cbd59d15f238bbbc3eccb0dc7520863944d0b1b4c833528f32c07fbb07a671a6fe25cfbec0110eabfc2416c5875f93b3a533a20f39be3047738630b2d95afc398dffa7070f65b20034f14660eb7974947c80c4b8e270cd304f91b5b9c00ff3dd5d5ae785df03847f4b0e8c30f6af5310829b70b7b72bb2a1d7dbb222eef80e2b083d2c90a68023472b95f8edf07b79b8007332ab59ca2a158dd2c7e651b418260a7da4ba607eaaa22bbe07d61f2c9cd87d7dd986212c3462cf3eb0f4f3235b2ee0890af78feea5aed4fb869f5e32287341dcc6996143c67261fe90a091715043ad5ed96e0bfdd45f6d0e69a97d571564419a4d43768c76c91aa8cf028621f507d719df91e82bde8e559a472371da23bd47f1dcf4e2b0ce8106cb1bd8f7beccaaff892cdcd5fd1b1bc3d8c6ec1a4ff77895c447a2858f73297cfa580b7c728fb65eb3c72b3c54a529cd87c1311b88ca8d0b17a4c52c1ac86971cdf715cf2ea40d1f893e46480947ae2662490639bf0da2d29e3c5412cc680f500ae7b786ad61308a03f73efeedb4e8f7691eaeed45b507512dbb964c9498befdce335c0f9496047d92be2babc198c37066c8905c4bd0ed4f11137fe78f18510d13c3ae5057db10109db78c5f5ae680bec817d86810f29b2f569ee430f702d9dfc2cad0e7b9e89608342b5a015bb698975f35f75a39a18958b06d7d9ba9ba20d17795531189aa5d83cc4ec90442614d9881baab351330535a85749bd4beb59666236b46fb9a22d58662e3f7a00883728d9e3bc34abdcb010349d11c8048253540e59fcea91f458227de7c9a622082c3533d89104bc2b407c03b9e3362ff24343bf1d4f0aca672d8a3e2920a9f4ebbe01cf9380f17ec59e2c82bba8aa6c47ee71db178e199eba3d67abad00ea9ac0c2b087d7e91b4bcd047a73bdd71488ff959d9a9be4e7843d55cd94d0ab6d01adb3247554b456f864d54549185c3694bc592d193043b45afdace2f8d082aed1fe0359080aaa0a381a4c4b43716d4951bb2f836cd48fdbeed3f4e063d0327d6e3c7fb3c4c1dc6c77e5b33ebcddd9b107c300cb83543997b5cabc245b8da8e02b80443cabe44a9ae76419046885815a762c9a9740b11c4062fd86afcf2f75d7b6869117f90d4f2c2330bfa0e0948a34e6004a278bab40b89ec563bf8c301b94a8e57634f60a52646a0d59f21642b8cd1465c5c1eae6e3fcc49bc2acc5f371aff3d7b3ee825e0015fd4542a4e8cd48065fcadc32107ab5c2dcc5d63d97b2795c0f0fafc30b6e8febb23214a2c397bf039a8be44ea8eef06c3786a7ed0b458e94a3023dfdea746fe5dddb1fbfb1d6044fd0ab986d49bc11dc6035c9e128cce3e99ed549d76524e877c0499b21adb3983c2ef57e5bc79c3db2eb8b3e8c0f66b8631742b7249273bea92a9be3ccadcade1845092474b32f36b876240acc139998f7cb30031ada49171f97c2f6089a076a3f66570c3351ab8d81a26bb5d85835a71ade9848ede617dfe3c1e688db3a95d2fc39d99b33e13dac131cafe3cf84a8332d365ab1df51fecc6436f1426926774e9edae2d12e78b10eb495c201e1ae5c2cee5b4d629d06ab7ab193b60fa1ab44034e5f0b9a55457279d48cb6a6bdfe60394983bbed5f4462027c7fa4e8a06ff4ccd2256564955b2433f942becfca0c2442dd7d7e3cb0f586f925fd4508803a653577a3effb64c72297e081e806054baaa422431c70bf5a2cd646e458700b2ce5eea219769ac9481a6a9af9204eee967da60d8afd925bc89eed4b6ecba301c249d0f9c2ce697c9cb2bd31320343c24beac4df9243adc9e7fbfdfbe53703ff8e03a8fa31fc0163e718c404446085731f5234f1062aee0a8896ffd25352f197e1c9a9bf754e1928fa93b7d538edaf09b48a528d9dc03a04b0a8b44e9fa6533394977519dfd011ae3fca8cd39e2c67ce413e7e3dc0c3ae400cc547f11931cfd538b92b91f88894011779f156a3d59049a2933cd61c160c6f94fa4e785a6ec7aca2c24bb2a8da837e364404866d3a9110572d860e9e944d087b9611bde9c5a577eff40592cc8245263f49ad273f82721d25e5d0bc9d1ec7818d3bf48b084488901db8bd8565ea2ea893ad06687a9701927e17d153a15a5c0d5ef97f65315126b1adbaff8e620ac4eedb21454eb17e6164a94698451d40c1c3f822cbe9c83bcfd31c05409db7814cc3594cfd1df110a77391f1f97f329dd15df25c70acfd894150e9cfaefda397e8465d90e0726aa78fd31a99c0a4511a0a68f11eb2b493bac2bb6c931e016a9b23477bf28d939897e28938507b6a321b4c30ebdbb7638eafa8cb1d9f670f465492abd7099ebcf4e2235731b5dc734112808b472beb960ec152b1fce9ef8e0aa4b6ed0548caa54ec6d1f4b0a7291d4137ce6428e5a7232bad8b674abc73af37d406f6100a44fa1c2654a99bd679d859304575cb9f051a8ef4e4031ab46f2f4c802fb3cbd63d3c4dbbdcb7aca1920abae9423efde37dcf0fe877bd4db51243e71ce15af399951ee62acb024910a335eb3e5cdd947dd98559b63f4c4c5146784a554b6f65f7b0b4245d5351d7fda52836b4b0d814edd4d284b500ae137d49f08cec9a2aa80d26199e6f2adcdbf6edb5f1271eccc6db5e8c87542ab41f1283aaf8ad9e206b6d251562733f13c5d2207d29eab364f3db2b02a256030ba1a07c92bcdb18ff050684ddecb591bf77adfb192f0368f1f73ab7b7af63ccaa5fe45bb64e4620bd6ba4a26ea8d0ee2e6b49212d65370a79ae01d799b1831ab372e15e16bf0183acf0cf4b00a7bf6e9aa80fa6551596de18b16469973f5019c6a0445f2dd7d46277f82e6d24b52f6c3774a75ed98e77d5f94bd8efca55b2f4862d9c388eb8b3372f446bb1cc96917fadd982563105edaa6cce7b2e1b0ffb9f7061b77303e3668446ea8da544339262351b9c814b774de879946e943070a59d9a525dc1a4e2239e495c85a222954f8b96fa04b94de56b34832b841149f9c23ef5a310c7ff705c45e422b09c1d0b79d3ee19a7c69af6366aa86d92bd283a38921557c4b44d4847b3c3ca009c69087a1755e603d12f5bd062a3e6e9c09542e0b3362be2ddae7f5f2c3d1e5c8218aea20fcb17dae09b4ddddade5325c4a4eb65f6460852314db51dfc40f9417c7c79aa098d165378537384f3cf15a55861732db992e19c485cdbc6dfb9df79c7dd32c740d1046ee79247da22261157c5c3b8e8629b5993e2cebf553dc9640649be5d15f29d12c777450d2ec6b7dc15c7b5f153b2e9d6c1eb34ecb54e6d82a420a41712465bf54ab9e4ebae936ce3216ffa217a59b34b127dfc00bf34e5b46a2a67bfb6dd22cc8150dad184b86475e716a7c2a68a0818a1ff8a75d7b42b33e9762e372cd15b3717177449cfd884169dcc1767f37a6ea425bba1acdfa82c0cb7a94bfc55834c93d12dea050aea6fe22f1e0efa174a956eaeae6b931a5506561a3675da5fd013dba751bfd8c05f973247e3885932661917ba1da3ed2f2e7deb2ff2f6bcf4d777b4b22c80c5b14d5141cb986308de217e752e49ff300dc4b076d231002b1683dca1fdc16ffab7921e2dc22d3f0cd5b02e3a37250bda2b51b55537e10e6032072e0247d40318861812c3e2a58394f1a34104eb141121a12553e0d01eff35bfe57a894a45d75a9e2209e508646838410cf03811f214d149c7c0a7c4f7bdf5ecc1e77cf38f6d5c43fb0bbe6c433c60f33988ea1e1d607c9e2a8fb86064e5e4d8a526979e693b25c6f0c77dd154c9788a54ac657da748bca0589295eca61660c7edc683a140c30ec0432bba210478abd4c95d169b8edf786d156ecd1872e60b23841ef3233a0c4b8237e64199d366bdb09e7fa09ed323415384bf916ae148d80ab4fec794eb9a4f96824419f0200e9b17d422f728390d1c6c2f97ffa14f7da29179eb2dafb3ba2f3dc45f3e4ab5ad132206d73d70fa02ea83fef19c6ac85f0439636262d5d01c9535c9e11b0a80787e5c34100f0f018362639b60030b5789f64a31ef5cc64f9dce2ce031116f4107484bae82e2edb01997bc6148b42b520c80fc2268c85411c137fcfad2f69688e3b522c3776b03b70994c096ac908d5ef35083806217f4642a4e19c211ac6d72806155344242b716519feb9280cec34d33f8b30e56747cde6ac4ed7199090a634c9fe2c017a291fe68fc1badfd4ff6d0a9d7dda99b18ceead6f13e8d9849676ce1aaba4ca17623458e5fc1d873b42c736db52e1caf8dd5551071f18b230a9871584c9a8d5f152808340a3c4e1533019e47f9711ae8aa783da7d55cecc0c02d83b6ec054e1f1555bbae91ba23091cd720fef81f1ae59e93b78041f2ca8d139ce888c5a3577b921746bf29d4bd28bd5310cd09cefd42fa7d752a23b5533ecbac80d259658d522a1e48c67d4865dbe4c151676c26774d1e22bb3148e50b19f0a946a56f26d6a1965379fc64ab7d82d560bad5c3f2cb3000fe1964d6f3913ac7d3b76f668d3f10f6e41c511d57b83167321505aba9a8a874083efd7f20325c02162861405c395991f0688c2cf3041a7ba7c2e112676483d1e717c6ec467be3ee1335bc8f33b42a3cbd021b09edfcb7c6135226dadd52e37275d43e37ad9cdadb5df576cbde6165e393cc2ca8d1d27857ec564069a23e502bd4e8af10d414e43c039a53f27458201a56a503d983704ac5419466d4d085bd40fe85bec7c13a7f94fba896f014a22b88696a36d49caf69563f205e836268023400298c0e1c450138a909852f101f43c05091958b2e0b467294454d12b2f7de5b4a29654a32053007aa0724073a74fccb2e2957d24836858abd8c49373ed481bdfff3d2d08d6f9becf8a456f5f7f4f4f4f4f4e4c891832da4ca966559d6430b5a594cbae4ca7dbe8f0f0156b5f0f22d4ccbb22c1d5ba7e3a755b5920b9c0b3e3f7ec9b22c0b66d9b37c4e63daa4f9379d4c283768785a4a73f1b9ad8bba263ea6bdd25b998000a2858740300842814ae013d009fc61d2c2cbb28f3f4d3db007898f855636f39d5c65d9b34c9147644fab2c247e0357343f3f33599a167ed26c90a755485ac5b0a739332afd984f418bc7a7553fad4a7da4304a6e944c648f4472e3db2cb343b227258f0ccdd9f92d6c2dd443a887a4677b47e08ac64e0b04ecb972614cc226767a978f49d78c49d6f63fb3cd2023f36fbd7db9621f4ff2c8236ce2126b7ca343fc9ce622121fb982ab2953dec29e98ef244fe9608f44014f8e1c30922787653b1ddff239ae63e32bb3f14d6d313039e495e7235772756d1d3cdd4eaeb09e174db65ecdcee037d9bbe434b2cd8d91a921ff557165680a9e21274a869cf0b81c11ba315592c9d1adfdf8c760ab52259913ea643bae7eca7614ca4574a307f9cd8e8fdf3c7eb3c346a38ed67c573b548d3532a23b8c98399592ccf94d0dea5d5abe667b5cf39edb76bcc7713c5a85002e8eb8c2d8ccdef6ae077528b9dae1fc261ac955ab4ad694fa6759de4b1bf32f633b54ca5aac4b92e7c6c7667a52a9d4a7aa606f4bc95820ef539fb2509b8181ecdccff1d24b02abec9bbe8b64dc18cf88f92e364105f35d7cc28d510a3756a1b463330245ea87789d1d302ff3a5c7ae6ce6bb6864c43ef8620c69564fa898a78932ab2754cc53d81ccfd297ba79c4c0c0c0c0d8d4dbf743527f7ab0ca7b318331302c294ece7a42fdcc7ef8d1bbcf7636a9ff01ded2fb60eaf164be647f7837f5a7a3e6a21bb52a65bb920523be53c1dced76928132a70d87b9f7261803c3921a4013ee776c3cafc33de672a4768e74a3233517dfc39c915a553a7dfcb7d9182ebfc7c16ccc1ccbc6cc711b730dd56cd8b9a9942dfd090658a4f2d0139fdb4524a41c50b9f1bd0a0f3de9b9b1ca4bbd94b569ee5907a3b9587a784bb62b41f7aea904f3d1c848ab9e45596bbfb4c1589be64ad6c1a84c59eaf3d013a0db399291238151a5559d1f59496a15e45028d3a9b99967d99aec78bb19157957c63a95231eaf895f5d6c577f6efc16bbc3a6ac83d1aa0eaeb08e8f42f168a919f9d8e3c9529b7372e337d9f170e594d68a42fd739ccdcc56b48351ea5f4a2855539f7a4e7dd6aaf7a9d4c356c97cea59fb91da6696d0acb9186fb81d9cc5ae30aa673adeb51fff1ef40a10f3f11d07ec430a56cd7ca4f7a5fa90f90e755f9e53fff2339b3397fa988d5900a997d17153cf6da9df61baa97f9b26f3390db375301fd3428a66088a926bfaf756eefbbf98a9bae0820b2ec8165a78176868248b4c2a9582da0da64fd91fde95b1ddfbd290528cfd3791b46ae6e34f9fbed9f1f16f7c343a42b231db8e1a2b2e6cefcaaa461628040789804b2e84c18ddfe1c0236efcce06aee02a2606ae62e02ae63bd48d5a90bf3490e663de6766521b6c2ef5a9ff0b5770058d401e19cbcda56c47242b6d7f83e95fa9f4d5c6c72a49ad4aa9116dccf69268b6a7c6cc3ee64b1f3fa655a68f8fb564331f632d166a877223ac25e376d42c81b9f85df49b1a1bcde09af85d5cc387a342cf0e9b064f01a2d113002b817bc4efa051ea294d7d573df541fe3e987299ac849a724b7648e98bbc6bfa216ed45cfc22ef3a951863be4a73a8b7e534173fb5c5d05c7c990d678a05126f8ce59a8b29b86a958c23794d7c1616976f79478a414a6d3a7edb50ddbb39646c346a2e8cfa5e87f6d947a37814915aa5e3e3c72aad7a389e1bc76fd048733ccdc54b33f21b0ff29af854c676b46453463a2c5c35f7583ce38d5a25f36e48fd7b68148f5a85c43e38f52f86531bfce1dd18dbc13c85d9f8e630426d1d0fd9d83ad4cbc681e9b2199d58e0eac6af5b91774d36a6b9f8a88f969b8baf6d30d80479c46c47a7d0e59912f88e6d9d25406073ef5b42e9c35bc3b4001c1ce8f1743b9c9b055120f07a381839c109a61664e31eef37ee41ad0cc8e734b4540bc2752c9783707341fac29f5a908a991610645ef897c6800b5af0b1acb32ccbb2c7946a41a8a5fcaeab14ff7db49707aec7278f80314d27796e47efa3459af31eb887c7cfe9297ec3138d8c9090923ada51f883ad518f34e73dcd390ff7704fba3734925edd0efe2cc075a28d495ee39fd352d4ae91fc5cf76925ad923fddfec57b0d9b666360dc6b7063587dcf76d03d464bb9873f0cbeba6e03a3943346092585d9cff59fd93c9d2aca88529a01c5c4a01e0965b9cff5ef8c4eb9ded18b5da9d81a357ea601d1b0ae56ed145f3ba356d49732ec4aa5eed06b65617187504a29a5432f7544e4a782ac23814d506a97c518e451c86f5e154b0b12efcc0a869ca86fe28fd70cb5cafaee7c882806c51ff70844a7c757a56fa2930c2948bc968d4161d4675dca7731e869312806c5a01874db87e2fbcbef7c2842894e62500c8a4e22948d277d9309587646b586a47801adf26f92bd75611766875c0f2fcb83a6b9d7158199e5ae71e8434238d8d3dce6467b059a5671b25eca104e86ff83b4d0daf068eed1501c5c1b24ad88b0c2104b58638a3558604510a438e328ca910c484105134f62e004149c50c114523839c2c251183610e38b229e1062d1003a02152450810a1329b6308e521005082db0a2071820028d221b4069e2823298e038800014b4b0428a1c1c61052cc8c01123c450c2119a60c4185af80d3e100515fc80c88b235c410819a801069e64e0e6023710b263c5154850a22707681ce109da40144c1c15610b2420299962c7870a461cb9c20a92a4f045141e1882020a4ccc6007660c194d09fa620a477aa420c30645c628020d1664c1082788828381f724035684eca8a04a155a7ce18222809080420846f04289a01bf4e00c2a08b121490a1a98218524a4c0c79f90400c9a60c4092648c30a1660a0ab544188295338620889a320271420032020c98213a010410b2c80b1648c212a28210a37a8016321064b9e8481d48409a00889c265083d52b4800b19f064e14ddc48e30a5c1c9da00a602ca1c3cf186828843890106fe203952a4f60228a165cd1c40e3d457c51e58c22b2f04106de93f7e4bee7f7f43d6a8b28605c1e7a0195dbbd25b7df85cb435086b0835111f8f5b4c31118fc98337cf7e1e1d0dc13f25e8e26f54612f5bd9d59521f4f4f73ddf284cac3ef238402a40b370ebccbcfdafb31301cd80706e3cf47b795d0f79c3f24b022148c43cab167ca58622e9165f8cc325a300426f420054250820ed270b233c44f110c90f881104aac50c3548610d59348239e2165193e5f2621ce39e79c641881c8c6110af55ceaf210142837bb3c04e589dba18a4c69c8e911d24cb34c5889a5a562ed715a18a5af87d8477711fa598ccbcccccccccc8c3d33f3f5fcf27c7a6666fe5eb5911e626666666666666666666666666666666666666666666666204c8c8c26eaf402452848485eab15d06ae537ade4c6f3453d6b35b8fccb90d3db38fd0bcae59efe861d72fad3e5cbb73b59181a4ed7c69fae8dc9af4b16e6f4fcf22e36ec90973ffdf56283f03dd956d2c2c2a3840756cc8484e425eb511724ea834b685c90a8ef8588d83133bc02df773d74b90a517cf8366b5a04c6345dbd020321a4ee9f754dbbec09cc96028997f2056480fed049f4d315d5fa8e4688eb40bf338734dd14429a5695fa6d4cdf1ff3a596e756b53ce62d2d09d8b96eb3dbf2397d99eae9eb4e66633b3d6b2c9fd3eefe41f8ba8579f921fef205c2fab2b1c7d3b673a34b7d58bf25c759aa65b9f997b40d661bbdb20b4d6ad40e867e18e24b9c56b1ca55f0716815b459f6f2ae1a604c43b38c6a5ac964d26a4659584c47a624988cae69058fca7dcf9710fb88f71aea2ea24bca7d3add5574df14783b9f1faf0573c95c20bc7e2ea0e61a2687090416049d69d96b7674504d4c604587daf8137dbca6e7b6a363c388da9980809a4973dd375652fc7922426955e42cc6300149b91d99dc8e5544a1db5d248af099805ad599983cd1d0c4a455ddf503371a7c8a54effb2f261790899164395670df67ac82ffde7b3172dfcb91fbfed997a3e7be172cee7b48ef4dda8fa7e384048aa4178b56938d8cd2394da51b19ddda055110638acedc62c8d0c15019ddba680b2558d1c17064747be1055358e5c8e806c31449fce8cc8d7530986c6e39d09f3f2d1023f0d1a1967a4d4c46b389b9b4ece86098167774b04b0b92ba306e4de8cbed3229b990608b0b1884dbdfbddc529113a80ff7688b28fa10bd15f7782dda0ff8b62d88ebe7c21abb7e2e2616e01ecd4731beb400fbe06c8b317e167c7c63d17ec05a652c19acd4eddcd764c808239db9c144a11314002d5cc34c266e95655dd783cff2ce019600befc98996bf62e6b3bf3bd30dcdddd71fcb93ff89ceb1a7f4ede7b2fa7399bbee9c13f6b95e5f33d4a2b5ef3afc73608a185d17e88f6d6efdcf7b48d3bbbfe5d2fb70e08ecba28b42c67e3313a84f006941a1f4a1bcea1c3a7ff8376e401df3b1da2abc02cea8ada6533f84dd63510075a8893bd2a6ee4fc39e99b2ca85554bc02bc1bbb0a0c8656bdeb8462ec273f5765346e34daecd2ebc9f7a5b8759762ec8e182651a86ece869bcfc3067e172337bb6d2cebe563d666c3f1e0e07cf836333e3b63cf12c26e20bc117630bb42ed7f3cb61f73664995f2c9e8487c2ec418b336cdc5a743b5b3318af1dd7bb02b9dae1a215d59af94dfb2b551df50a06be24b29a54f46010b0821b2830e39c8d037f5630cef37d5be1eaf895fa365afc12010774e49e7e7b49c6ef96599a63df628a574e5f24b26dfb99629fbd2d675d1cd7e669fe35a66b3b78af15ddbbb906d2e6d4e6a41e0d3ff7141eb679478ea3fe4075d46c87f907fc47e5a02f8f6d37ebceeb634629bf5d867d9bbf6237bcfc204e121764689fade7ffef53b45ba1a776edc9a8a2700ec7beb9e938b3dddba1e2ec68dd98cbbdf6d17fffa1b638cf7e777d4da204fe0c6b72cf936ec6c73be4c46aebaad0c5e7285e232ebda71776c25a83b766c505c56aeaecfde755dd7679bf55dad27201e8f51c7578040803c72e363a54cae2af69d5c590fc453b22cb33aeca0c30e3208bee90c5edb5b4df19b67a46be2472537be0edba1f8ca94bed2463702a14685487ae215d4cde31a1d1fad233abe9348746034b3e4cb205af8d84c825ad54f51505770630bdf49246e04924f5cb9ba74bc2dbbb2cf5ad01117d53abdbd5b12a3b20eebc8bf7e7e2cf21bec2795680493d847bf8d1cf681ddf972a310fbe03b4dcf5a03aad7c4d79eb51c4a6fb240605fb2d4afcf6cb655cfaecf69ec69d45edb4fbad51ec0b46144e5a358a5b9f9f104753e5ff6e2721648a8e2c61b89aacc10a5cccf992f839458a5551dcdfae6da8c4061fd10af0305fdd67e744cd74c5473f3dfd37e302711f79838b4aa8b443932cc60037df621c30c3634376d4e73134945c5c4246f9a040d4d1184343fc422f106107e883ce010c1b9c1050f386d44bfec973fba378a352ac7e7d326969c51e206d5c4fa6859d835d03e44791116bf9dc875c38bcac32574a11de2960ee911a03a8a8a791af9e4743925a5db9cd361bcb0cede8531c6cc1fbabf08e58d1d096eb4957b5c0fb3d89581e0421d4bfa80f20c4afa219094d29fd2f2a5a5937cfa7383710b44475a1e9cb6710ebedce8a42fb749e597e4cbb7343a351c2116aa0fc8759b05bef7756d06166c972659938ed6a33d5dc218e17597266dd5a0be87f74913d477bb2c631f7c5bbb42bbc2a5094b12d0772e3cbdd87896f52e2cd3b40cbbac1dd467e306a4724687f0ce243289df994426492293c824d46a4008f7e807c10ff4c21f01aba02d6243ebe186663da9f1e4f2722363f6d1325fc67f394d3bdf270df3fd5b268e257298ee631fecd2f2723198988c521b2b1b0e1c2b75d26a18723ab9b4c4a46a70b419d029bd421658d24ccc3e260ef76a43e1a82c3651c74b8c5f23a5b5a276dcee05bdb903b6d2a6924c121d2f3db3717c11045b88ecadbca655bd6aae41f0b4263dd02009000db8de7cfd705db78460e19a959580756f77777f7c95a0f408e994f0c26d87a7e9108d6c982136dc62c0890e838dbfd50f4210111229841042f9cce482ee50ce77c489c8894e09e30b8edf58cfd5fc86c2617d67b37a44f04d6b57f7a2b8fd9adc7e4b8eb8fd96d7d0604a18fda528a8574cf4a03cf57fbdf29b57e435fdb4a2be88bb5daf8060f715d9a0beef5e117661ab6073fc724d2f412f4a6856b830a159e1b26408bfb73b8c91254b962c597264d8d4bab29acbcd6d51b8004d6abde732832bf352d75ad98af2d254d26af88045b9a4f17531964bcbd07051c2a5498ddea4e17bdc0385aa35da2ec618a3bfe7e6803c1144ed49bc3dc0306e95774bf6196ea273d030343c181a20bfbcf1de7ebe44d0a48cc5f3e1cd7970f205cd87776d6ce4a404e01eadf9f02e0ef7e8b7a2b0e846f349de0a021640cf67c20d6a3fb80842eaca1fbfc180b8a69fd25a7fac28b5085c00fd98a63001840395f5630c96a08dae0189d913403f403f4cfa067b02c8faa9100826c982ac2a5c4ee8ee73494bd91ee71297524a972e3129a5844010b2db18ddddad229670518550362bb7b1173da635148aeeb4c3686da70ab7776d6c855a796313d70d242621945042391381ebffa6294a133c124a93fada6f24817cda8f272c41fb66a4905b503bb9c27856d8118c070bd5ff7d12953eab089726b02a700bdba041e52c8e8092c511403d591ce1d31a0c0ed6f3cda1573ad7d776b943e2a49b912170742c3b9f4aa66f6d3c383af4afcdc81054873e0f8e8ef51884d1a54f6bb55c9626b129fddd7620a03f37d6b13699e3bef9808a57f6b41be6ed80c98779dd0e8976ca0fc1fcca302cff69306c7198555a1a446e4dd4f7cc0f7b3631e195657fcdcfb0ecc232138fc5432fcdb22c6332a7bc1976318950ca1727004d41b42d2eb028e7844cbccb6a9b28a9fb562854adf029f01289e62044d3e3e123183be25a511e8f6b16142ab055734f2a269798a692bcd865d10ceb585b6569354c607bda612b8b36a421bed7d5ec4bca77d87bd79f9d273ef8d0c6d56ce0d224820179de7befbd07dd9bd8b8fda47cef512924819af2d3950aca713420376e3cfaa806aa4af5aca7b946027b8ca47deff9349206247ddcc675e832744d8ecfedf7914afac691f4f054d8c3a898868592cec33ee053e18e6caae03cd18deb362635a7061322254248708ed84823f18aff30a1fe1393341afab2708fae561412e8e7dab8d44a13d5c6adadf238e9cb018728b593404ff48d33f19f25357b9425a17069c2a509961914f9a4d6a44b2cb9864c7221178232295a96949209f8cf9900a251629472526b522724b1ac7871db8ad256fcc689bca62d289a45850b35a7594feab32ccb5ae2657c169d4bbcd7c49c3e08b2d22a1b3134a739513b1ce781d4bac498d29ca402d7f45b9b5c835fe897447e238d64524b315825a3c01c91a402fb16b75d887bc0371349ffdc89a48bdb4860686e22b9fdee62734d23b7bb39c4ed9fab1e40bf34f21b0f836b7a0d365199e48d84dbd2e876ad56022ef4d28a5f2d3c5caf5726f94d734dfcbe7e486a553317bfb3ebe51af26202ed94efb2b499d4f7ed42dca335a9ef3b17ba33684aa1d695455883bf7caad1105fda0e4e38211c12935cd87befbdf722134c4a7825c618e39228ddddddfd3121a1f7dcf67628fce5c2f7b72e49c0d854a81c1d55796adcf76c576fb46dd42a1bde2305769c56315fff7a9aef1f21a4093b17f64b5b0298063c1df94f475a9e4c673e0fd431227f080a1fea4c3b8410261df9ad93d3dd40b6ae81c0efc74c3f709096f985ce6be887f607bba9e9776a6e55b31f0f02282c592309bdb22488246c29c139435638b9f325a4b693df3f6376830abf93cfdecda7ddb7bbf9d4b28d22d47ef9afeb972f2d8d6b1c754ff7340f0f5051a84cc0deebeeee97846366f60714f54bdbbd2b9b5c6f63837d7cee035ccf9fe3379815d235ef1f154246ed788a0e18dfb0cefb392d4a77ae65f930af85e2a13386c818e33e8d6bc6633e6f534873ef2f2c6a975db63c9871d8a6cb6e0c8fb9d1e6e83f0b9b3b3d8d7c8797853a0e01e875237187304aa1592194524a99c113975589921b96652f8bf1fb46db3900ca55c5650835346ac4308861ded8c3d846a9dbb9c172a3ed2a70e13f86a50e885b9a37dace860b4b4597ada5039b1454eeb6bc00ecb5bf2e41eed14f43107a5b03c2dc85dce388bb1ca99026be2eb906c479d4405882a101081820f4b23fd8836d3083ccd0b7b62f0814922e862e861b5fb8afe6beed3e1cf769593ddd87d685d296ca62dfb495b677df6f98991f85928f6df2fd238e2b7f6e4462f0e74f082e31c5f8f05d5c507bfa47185f46f7cf697a093d319cbb1cec62682ec4be9334db75518a3d7d08316b43b113e16e3b846f634b84c321a50c296e7b67ed58d02864591fb72e0695be43d1e0e761c94620afe98f110a0d581575c05cbf0e3e02ddbeacfc18e4f4ca8d63d0f51d60b1031a85ac864264a67ff765f775a62d7b6bf38bb16a6649cddef496f6e3d1d7d66535c63e2eaca4d5ebdd5ad2b0cbf4960febfb2ff6717d635ffaec31aafdc84c26abbdbb5ddb7d6fbda701893ffd2391d375f823c22b378efe11b6e949327c48720f8a411fe8a116410afcaa482c92e94028bbfe4568cc41edf758bfc7da5f0bb81f1c5fe0b8525035206fe3e112caa27652480ab10f9b4b2825a3b88462eeb33782b88719b54bdd08ba29239b2b85b8474ba11b41dc8fbc220d212dd210d2e2fdf0783d2a94d5afa31fc1a8ef42cbca4759baf1b8bec5c0f90d3b17f39d45dba1626e7c1a98f373735c08da8704caa34a3da8a72b9ed07402c6349daf6e3fdbf43dd782735f8f1791d7f4182684faaee93b78e9bf9e7e9cae6d9aa3b6fb9eab66f5667cd33d2d7d3abd8bcb9f5aba8756ab755be92badc64bbaac65a92d2a2a7ab7b475d05fac6215e32e86e15cec996f30cc6fbaa77bbacae1dcd7e335af2763a19b3dd65c7398b51d856251b9b8fdaf83b0509fad1da576ddd33d7e837adad59edb287b83d2f862bb97e4d29915307a09dd21ef5d2886eafffe4ee4bae185f7e3808d22f48594c8e9c288739fcd7ddc7d7f1feabe77bd5fb3653e8ba9a46598aaab92c88d2f9f947fd96a791b02dfa928c221cad16d2a8cdc7e1bc0b8ed58e4f71e2c11e0c2172eacb970c3c172a145df6d8d5a6fb21d8ef525dbd97099ed1eb397656b4370e5cb969052230ccb31b3a416791347b74314e0362a6088dbec4694fa1e0b309beb3ce5632c99a93f4a51a8d7d111b1b9fc3e0526e4c2c76c3bf953b26476a69799f923731b717b8210c2f87e7aef11c92ecc822143c8b6cb2e43082133430861528c36aba7e69c3198417be28f3fbf8b913fb2853f991f22694ebc8cb99b9b9b9b39323fe6677eccfc985f6302a332d3a936f75e73a2323fae2c8fbbdbbdbdbd9d1fb34801f3d78eaa0d5877bbb7771b617c09a141b5336abf1f7777aeb523770da96a6654a89951bbec3252d5ccd0caa8ee5a19d55d732209b5cbaa564675d7c8a89a13ee5c047e3db1bbbbbb7bbbbb5b96c3281bfab767ec0f26088c1bc360840c193264082133648e514249e14f3869d4985029a51905d29c80af314173026a4e40eda83243186345bde6448514c208b15a5960842dcccccc0c2384b6eb6f2102fb71fda0f2e7386b4a788f882eaa74817499a88b295d0ca18b2e36291059215283e888488cfb9e720f1e5e130e24197940e812d241cf25b48594db654cb405d165a22da0dc8e23da628a7b5d26dac289fb9e015278bab812822219448511111974fd2d6f56d80209bb4cb40595af72e16522294833a84c2465cabd4c240508f7c6ed2222068010728c31be25c008238454fea3334ed8d2258411c22860bc8335bbf9f02dad06f9d6538d86f996edfc27a4164e5b2de50ae7478d861865a4ee45a4f3f277f252c83eaea7597c2e699f3d7f97a03f18a13fd732ecb2e894517baec48bf44d6a39fe0defe1cff79ee5f91e5f3ef66e8839666420619431d627da118f969f6198bde00d2feabb176daefb4dbeb677e96d9620608646e54106dd213c54bbab68eb64d055c43e626ebf0c7ae1be2b2efd8e25087e1646a88507b5736125745d58ddbe8ab8470715dde6c0bb1d8cd0ed177904c53592eeccfefaeb7774620ea5c71efb1d9dd836bdf1c5f92deac4ccc2de7db6d3219e93a8748d177541c9109508000010003315002028140a87840291483418e7aaaa0714800e7e984664541b0984518ec33008639031c818030801801003668464303500dc51d1b7daf6b50b168ceaaf5c2c7986f73ba0f5ad9c0fb40b801e38d07cbb65e6e8e1caf86586f080e2f876959628abfffcc3e30d8670634fe48155b85524f6a85a8278fb3e0dbf0955b3fdbc991720c923773eec09600622878f7cea7cdcaf7c79fcaa43b725aebc132e163e98eb42c75daff0319d41bba936c2f01fec6f1a6f6bb815b82b663d23ec1c85e36c9fcf1d7b14c9a1cb66fe15e903638988e036a6254d01bf09c2b53c628d7f4c6455296cac9100dcb7ce6b23216632e0244214379440e688d3844d0c2e6fc35eba7883cf13cdea6217678c1047ef3647bec421c37b881327a7a6c12d42db7c5c838a1cbce28094d5a97d6c1a86a0f4b14a56885321ff6e488af1a5520b5a57040f64c1b744dc7475e9bcccda980f4fe4fe1f39816e951d4f00facb170b9c21fd1d49a64bbf41ac1074c8726fd716ca4b9145ed6a99bdb5e2dcbbc6827677f1d7a3a55061945060a0d967f5b9e07e5d0b6bffb9ff14d7dd87ccd072622a389a1c7e06f2caf8007e4016660792f92b9bd5c6ea5a399fb1d80e14d441f1cab64bba29573f72c3e6d64846890dda81e08246ee3c7ac25849254fe0865656adfff2ffe05058f7befa06e231ed2a08894db7853210abcc031d3964ff41fba7d30a53519d38504f8370b5c872145d7b227ccaec1bf25c73d936afe825ea201d95a233ab5b63987c9b6687d45ca41eea3c40f3d4923e0d2a907de466554a36c8350c20a017627472daf27823052f41e6be36c7186700a1f184bcf65c6ab2d5f263654a3493e97485841294fd440588d64271c43d248128509ee3779e5cf349e83eb2462755b9fb91697bb781b446a3f2477e1caa6def15122d8a00df91c9c5167c1e4e7ca0c9820a7bf389caa088c85d7adb950081ea63fddc9af6155477f1233183efccd66f82b3960f8ef96f4ba82f431eca6c6b1683cd29309c9c320f649316fb2628db92dd5652d139fefebe7b69972cfb5d2836249bd34901e742a021b656bcb7d5dfcca54658e85d5e0a0a4ad0b3b2ca82067875d6c37009d3f406a8791f4cb8a642252f8a5df0ce8b070af30a895a00ee2a3d783e6c37ba12b5d7fd5af105e55bcd1438b1ba02b6a899132ec91499ea758818d4b46c9bd7e66e39942253ba83017bb4eedd2a2eac8aaa9ef4c96e86c93caedcf18e70eeda9b76a1b015b0259d145345ff37bd73f8422d5941c7533968217406181e73eac56af2803c75521e83022e4b2836042fba54b3155f08adad48cae71ca232608f97eb84cc7429cecb8e2e736d82e64d8719e5113aad4698f28b40491fe76f91728575eaad1db907d7f6524e438d134cfd77ff9aa097e64fa65d234e05e01042ff66d1a19126c3f8ef93b4ca630386414087a74c89915e8105a0d8c8dc85abcd118c322c74f5ff101fcd1ee79a5e9d1793f0eb8efdc7490c6c667392a8669874f6b5621048db2d09682b1bcfe47d26cb8c286aa1fb2d875ef87cf7fbd0dd02705be6cb974471fe4dd005be4896d7c2d3a6d752a8c63661163d0dd9a45079a89b595876de91a26612050ebfa180b99f0afb23389019db91eefa011d38b605e9e253c7bd129a12395e3429aa34e0d1b0299fd2fb86100a42edce96fdcaa02d465663443ed9334048156b13093495717650550daa313dcb4c2fb8a180c1133243f96a83a59451d9a38e73e6cbd06a2625ff4ac988e3bdf6242c0363cabb2421732f05663473579d005ddb998b67708359dbb893b9948d15e9f130dcac5cb355325f58371a3a1ed92e12bf31c1ff3ac1af0e4481fc0f6c54d4aa402b90638e3d6a4dc55bc0fa724e3d598dfbce9faf85efa87558019e0849059f780e3c411ccbae613bdf5ea9701020c1aa8eddc8ad5a44edfbf214255f538c26e07a0e29f66be996304c151df8af605584dac3e0a25688ec8c63f22752d93dae987d5c3bc725a1e9cc4b9620bcc74f5a067d8623b0287edac224c5415640beaa8890e0c018f5c5891c6766d793be8576cb6743be0d4f5b0f10e9f8b2303b04d3bb1560c923d4e43766e702fec02103daefb09db17d7787d9ebeedf684a90eb4d3975fe532b2c0d1409883f7784793fe66425f4cefdcd14f5b6f4086a62e8b77bee001eed2164832ac6ce918fbde5edcb8e7161687b04c6a23431b9f7d7461f026474676d6672d8acf695bcb09f793e7aae5d36433bda2cce3e5cca877fe73027139cd8cf3d30f0e23bb596b4a38ccfa18581f898e80908a5ecc711f6af601233266a494553664d2c53f872ba4daf212480277e32f4f20212f2254df56386afb008cbd60ca04beeb6e187c7d842fb3ed05c97371d9af9e7b104586ea81caea415b503354c37c275075d57718de50efdd2bacac3fb0397173e34fe626a0f381c1641c0ac7533c93dcbde47546a5c488281aa2190517dd33c154ccd7866c9c6af797fcac57165619ec71c631681aba03254eb3d3f2b9a925c9d18467b7f6e500d7cd90aae23224fb7ea230d316e19bf6bf81d7e2a3ac22a0741632adb2ef98b05b2145f0d79badb580ede983ccc570e4f317f2b0331f09b783849419c50344629f7181c12dba8a4fdbe9a39f0f270e38d197e784e1ba500ffcac55aeeff071fdd772a21cd14e2ef4ad0aabc8b1ad45d0ef3b46c6ae8ccb86eff49be331e5fe20259b0f71bdf1cdd9022daacf84dba7d04fc2cfdf5ae1743d242c84a0475e28a77a6dc9d0e4e8a753361585ac5dbea730bd1bc09baad9dfe14e7ce740dd3d4227bc5d20fb6634264ba1ccbdc86e5720910062b95801d2e466fbeef56d5ab24e342b694971eec99b2462c57ba7e225c497c1c1ddc2741c713bcb0fbd51d7aecc32648fce2dfa23b16b258bf330c3db0421dc9198fd5bded925a2b9b7fb7ed9b57724ff02158779440f81c50ce6641455588dd6c749186677e679b24c838a650673a679ec5345b912c997902fcb574e760ac1c19eab8aa1d5ce5451ad030a206a3b18009cfd5a7933858dee11d0f86d5a5aac8c39e2fb9782c2a64688e77fd01b391598a17bbeb26550c96f2ab1d93a1fb3a04cf9587bd0bf96af39dcf508ed7a9d3b2c8a2436c2d788035a4e38acd6f1e3ae7b7984b4cbd0c4380c0ec4838658bf89afa9b3599fc135b6303c390edf2b60c8b68247eaac334c486bdae45925be77957f09d7a7a19a861f93d8b8ffda864104a7e475eadbf987d406c94d562df599feb0f5bc44a0941c0f27cb2208c18b7f857012130e051225d36bd54cbfe535e044345840c3bfbefc598f7c8cb05ba54dc4bda1283ba14652553bd8ac863a5170efa2575e5a0c5dc6e10daff2848754df2df51e088520896539d80b71a740cc993109d808e703dd2cfa1be80e6648cd0fcfc6680a1c664b28559bed2d6a9b53b255eb82fa96547f314728c20c53ad1ae9cf5600b768a394b8bdfacaf9cb397611557a766f4ba2ef3a1fff90cca9365d16126e87b6b4b4dc8b2fa3930f966a8ee094553b16b1a097584a85c0907a73b997e6eb39337c8d0dcd0c546884e33fa39387ed82e2923478e4eff702a8c01bb09a91085fa100f6680ebc45850fded89d31628fdc96119d4bfbfa88f9dc91277d3923bddbe383b4bb52c35dc17c1c1d2bea5860f1b41849adeb26f541637a6509a72431bdc938f9ee05f7ed82633f65d44a0f94a7ddd661083191f7ffbdbd8141d3191df97b8a56c9ac9629c9db195cf1db3515f651b28e311f8dec60205ddb871811bc636a34a89d702b90b12539309a741e0de711998ff9cacbe960fbffa384d1f91bbaa0f50baf5227b7f590ce19b56cf0799eec539513ef631b4a166bc81658b82a4901d13038c7f40f3780af4be5fc32b8e5a22f291dee6618d565b3773158540694b924a9bcaa6e03db23dcafc88dd8545a58c92cd9fec0c5a699ecfca959dc89044c4883fca7bc1da65ea5c4e85652ff7f7dcf60e1180acc8ed81726435b607fee95b5eca74c2335aab0e3a2de5a0e351928dc44c16ca086ed4832a89215acb4dfc24cc202a756ba3400678dcff557d8894fd7b7a3d14bdc1d581aee272275e7089a6c8bfc8fe484be8ead188ceb34a3cd112f19a2b04878fa646920d52338a443e72fe1fc7a52671a5232eb5fb6243292307979a5ffe09bf3beec28f14cc8e05f852e8a57c92d23303f90dd30e5b88b62f7a02ef48622ff11c3f5ff697f65c11e405029b0d4d30271dd763484b00e37decddc78378618b97ba38aea36dc01b9c2dbb8f9f711ab3217a4073ff73ccd176ab43bf0ab1065f8abaf63041155da1b6c1b7e421cf36603a7e30f2802d65471a59c600a63e4095b95e5caa6911095fab385b183ff9ae011dbb362dd8734161b3aafb5a39c2cabef57305ded0424035996ed346416e167db49f92715f5e4da28ddcd41e5fb2a78d539d1c27801a444c8c5bf161f32e8e56aa230c3652c6c0ccbc5c5a41cce8735d6211f1e5b478cc2543e64f99e582296d4007de4cb023cbb96377d6d1acdaaba0596aab4fad8ae33a211343841f81565d92c9810ba47e8eb2d3c04f14f93e69cd396b87e447cdc5feb452e6137208a39176c59deefd411b7825825a3c99a541569ba233cd2a8e4abd114a2caf0e9e82c4470f1dea8eea46a635863c1859eca482f74bb372193db7c66776365f9bf129b938b91a39ae242b3da5897a8c1b9c09f9030f27a5d607755b62d1bca00f66c595d718db1a397dbe7a746524dd2975305078f4b01baff012f6912239a858989dc21f3f2375036683166b0217e494c9c58b80621c34f052dd4973724b30cab726b8fd600619fcd9acc865f06f8f064df9045e6b7627d8be5d90e8b781cc5834e44836e7ef0a55bbf481a82b7d0287a3b8e61329050bdbf3db8a0168101e4f1c37a09b4d3cf0fa54658fbe0c5455065fb2a97347bf8bac5f40bb70413cf0f635fa7b51282d9e007b1967d08ae4d5b18aafdbec06c8908594716508183162a9ee79e174c2575760ef01569c3f74c7aadad6ed3707d8160220367701b0ed7deb7bb75f7100fd2a2753a90599dbfcef3f88804f5d2a3c178a0a1cee51e0fc991e5abf0207807787ed3a36dcf39ae39d29c936d42da74416e64a7dca7bada8ab3bec30406dc28863880c9b62fbd0067921d0261bfb323b2c060a999fa760d03c0cdf99b056fb37f6b111d611e9434a9d9a4b8dd7dd58a930f592fec62a458d748d4a52c1ebc5020eb471401f003cbef62fa0827f4f3f7a26e83cda4f248eaf2a8f5681b6975107359909ef9dc32898b4ac6445522ed8479d0d60857dbb05eb41d9a520300c624b30ee27ed0a2d9d5fce460c4ad98a1afdd1aa475a3032e86d70813c8352b03627f41a246bfe4f8184603058f36019153044a54262b18055012a4704073c88b445eb4fc698c93c2afcbd4dbdb0ae903804aa67cd2ccbb718b9cfd5d561c9f5220cd19af446bde6bf5e079368d9777cf80980f413a47698774093fb1b4bf2be87a5618baa149767401d0a4b8f52bc4c6f515ef6c2f37f660cb06cf0890b98441570c43adf427be57fd9ab36292d86a0c1559bc664266eda0f2af95d902e75bb7872d89a2f6232a3e401523467e4a88fa1bde8cd6538acba5ddca3b5a3f6685687db040e82c90ff8c79fd649851ddcd6e4a2d3b5bc941c250210242ff5694a488d0000c0f809128dfe57449f7938d21435399eb6b8b9b79535d09a30ffc388760a01e58bf984154ce9fadcf1b486bc63025211a4651b8c151fa279b3893ca5789221046f71fcb549c3c31f47efc69631150f88b414c0773353ca5e8619ebb355ef7124c1255f09c6773df200c3666540075529b35d5a0e25754127a80f8a72210874729d359eceae4bd8051061e81e397c4ef6ab6e278239deeb3a13a75cadbcc15d053a81b55b4a5deb9b06aff561814e66f7e46a63826a879e78cfa850d53f9686eb27b5cc1801b1fc73725ceaacf58574033c36ad15bd79cd4a0f7800615175f4dc9c1bd72c1ea3984c94a9b19c1281d17e2db5c96a49ae837f3feda49a32d72727bbdf174fa5b034ae453f2c35cade2c0b9c25121cc1c96484e604fb3aaf7eabf136651b9c27673ddc15f0c357745e8e741a6eec4268a4e535a843562d631326f44113b3187fa02cd93c45f370a160b9c9f1c254e11097d66987afea4db0428c4058af71af5e36311444731f4767e3fc7e11ab0a66a909c94f8fe4a915b2b0541f70677260bc3e92a470c760b8a08d21d465fd8c56b4ede54c187990c1b8294542a344f7855d85401d156bb5151262ca705aa1ae07b7b780183a543429d50a595a4a7599cc2a75d6f929329a87e626d965f047685eb44a8b855a21afe006daf2fd104a4e5d0f86b63305a543680995793262ad0a9a1f107148d22bb1aa4c02d7e99d693b9ac497e72d97b0b675145da9551457fbe36c2e137675c5f8cfaf287a17ca61a7db00a6473ae59191036bf32389fd63acbbf4773880abdc9ad41694aab22fe4d0ee19084a28704075e9890fee7ae8153d58cc8cae61e4d2910fe0aa14a2b87d91afdf7ffcf4533a14252d7eaba480d5491b17689747f3d7aa92de7d21668e00ed9ee2792bed1270bbb424fe327244bab32ee904ada4219e6d8ed17b6516a116eebec022517375c16a8f420719f5dcd1b67b3b97a1deddda2dacd3ec01355b3ee28caa8cbc565edc1bf58e57671d1cde711990df809edc4794fcbc8dc7a61ff0224438fa80c69d8958935ba86e4b60181e0b6d2bd92ae55ae873ffb276139a973bff42b1abaaac3668c36e2301ae369859d4f7b8dddf95f38017d94b70bf0b022f4184a2d136586103011ec81d2b6f9534bce0f20844286d8d907eeb5165741c8deafc20f34155e8b46b5997946dd7427558de417e7cc2de3b42c9e2d18e3e4bf07b313fc74edbcd921283734c88012bcf21184178453d243d07599b64a71f555b9f58b70f8866dcd32702030252a24cef4c01197ac9e6d15acc43d5632003ca296f481a43192976b5c07e1677b7eca8369034338295774bb4085e183481ba52db3be65903503b5bc01d59ece176932252b8167ec0ca25626be6afaeb388441d03baa2ea21d6221cd6ed4fa2923d40924939d4957743e05515cbdf74e5a9928c7754f0a52e6d45e30e47ae686bd90c0b17a80f69654119ec31056e30e44405c1fb91ad48ed8c7e600a2dff78be934ff1f853c40880b356fb4977fbf6861b808121e206505302b5a1680a11cbd565444c5903ae2edd848c7463f07d3aa29d3627276c8d0dbc54fbcd9c628586df98b8b4dba88824bcac2cf2dad90e7796681af776f14d9f89e833011c6010516170208d8794489911aa31bcc6e6cecf6f8518986ca10cc87cfa4d61d959fa3699d061eeb6868208e1841391834b1ddef1f457d266d9a5a27f56b4a49209ee98708c435d727ad23cc542ac59d3b3113acef09fc06aa76df88a960d4fd046a6e8138231c8059791fa142179dc53ed69bfa55d9c129c42334bc99bfccbdf72e59e77314f4476becec41662ee5c9938f3b9907b792d06726a1960570ef75ce42a76d6405d0c20fb16c3c426caa15b9d64671d1f303133365ae864eedb161438f37ea037421eabecfe0248632dd300c445fff3208b5654b30bd613566ebbdc600d4734730d3778799329a43458783b9fb3b054d4bc907d0c6bb0fda1f8ae3a44b14435c49b2ff713f2486874728836355f9863996720b551ed60fcbcceac134e0de9517df7a8b5a39e1581b03abc2dddd49b534232d4539a8cfa439983c2526bbc58f87ef485655761c52790a46692d5ec491496ea59423df39d69ed79886a6059adf7abb9c72bc9ebc274ae1b415340f4798bde1707d2c982c46c6f03a6eb1873e0b1b783c06614218a687552ff342d7fde76c1957a0612fa4763d014f9f6f7b2648a0e08cefdd5c74c6a36d3e2c641a477d5644eb6b2bab2f016be754268f08f887b99729c4f2467cbcaee04516af42b8f3ada51742af4117ccf2beae92f341ee915adf36f7a3582bc5b364c6d7fac935df01d0bab5ba404a7236416a3efd3ab8591592d43333751c6ce3c8366fecf7e3bc327809e7b45d6525d1c5a8dc6ddeecaa0c1439b7bb740e943caed79c0286144a14a76b5d7e67c01cd906e26bd35c930fc72dff964ed99d913cbafff4410f5e90077542676f19c71c97c033d5a31cfac9579b1fd51fd5859800965eaff89ad96d3819305fb8c4a060d2f5a128f64d2bc832d8c2175fc57f8cf615b114b90bbee8628f0928b9e58bbcc1099a7388a6702c91ac19b30becffb430eeb8356405a943e0e92b4d15e71f23251614d0442503bb73612328dc4a368cb89f123bd9e9d2b0105218ae5c13b54ea753b8a861d9fe7eefb194e85d2b2df5ea7f249227cf92a47fb223f00eabbb39838c5cc9a2d08c22d42987c85504cc78aae0215f83b541a845c4ddfcbd1e607ba24bb63da8ecf5a78125eb6a4da270db4855fd088759d57d9527ab83afdd49e1f6569e3299faa8de811adf9524a7dd6b7cc653d3d0532da5bab1348696dad4e985972f8fda08e6806543324afa4ada16d60c61a766019b57cae110c5963cd19c41fe57c9ce44212b172261155c1152a0f6a02e0ae443942d0e6b3fb3f1b12a43e4267bc8ff7e629a6226791c01cb8f959c515fd65a3dad57cd707923fed337297a69f0521ed59b9fa412760f0c56bda76606dbf0d228fe9792fc6ec82470ebc3a8eabce75415591ab65bf234e5caf3c5e16e438e2120dacca8a7ea583dee81db833a1eaf928d326c5130809b05a07ed55bb26c8baffa7e3de6857520e352ad78ad0f4896f96face034f7c4133dc41646cd39156bb4019389d3a6dc09a802248bdf1baf7e58763197057083204c3cb786eaa80b9a44036e989535865d3df2692fb6b99486df03c58d42e77e4f905a55c01a6298f4b7d3b228ec467a8157a255ccb9d89577f7f94d3323552a67c54dce78983d188c9662b666f71bb353c13d073a3103adc73ad29689a29563b31005b6a0e6d547026822b32a817268f734dec515246d4a4ff03ab1aaa3259586756b84d1d9b374c56c01c994f8bb12056b8c8902b01ac148d82730eb74dc3087a7d5d520ecaea8e885d9631e9a386589a14da1b0ff761f4aee6d845b75ecb4d0e88ce992d45e6be77e720f3a4fc91c61fad67302f45ac5e3df42f707749e626c487f68e036a8b7328b2871e0bf41670d5e86e1ac42e70d3d014aa0d99ae2a41dc8388983e7e08130d0c35d8897b4f51e07d32e06b0e7eceab60245d2276b826e269f6150a5d7842cb29342103c46d7873e395a8db529c2a16b3041ad01f53877e4e0845c0ba0a235f764f170984010107a1d7d43c4255814ded44cd0ba6711f454645c8598cd166ea760ce1e57c898f24185b26ed468d4195db21af54a228df4bab41ee27acaa7054ca1305b1a95215fcca90551a302a811d20976e8224650fdec65394db2a4f85b86ba32c47bc5c2c2a0830f8f235d601b166024576a982a986416886a33d90d99cbf715a653516ced62acb16104be9fd43d3cd0a34ba54a3e26357eac719c4dd0221d29f5354934b04672627d9475da716d06f5f1d4e7ef0c5b76dc2d482ae2df688db47478e9c261f8d76af1315bdaed222c85780fe306690abb195b35ea24e80aff60f9e8119b9516013ae78c2fe40d4d83eb8ca35557a70863fb7c6a23da03161396f7728da552d69da82d0e3d84c405e10658ef4d7f093e97978947a15b0b0615b789b9ea56a85f16422465614e4fa8eccfbfe3f55a709f16abd09cbc05a3f40b4af67ec7f359e8f70ed58ba6341d73c4c5cc318d46fa983db8e4abb8542cacf0bb8044cc21ae205702ad57e140208c08da02d7ffb036a300befe527c8c9867184ce9c6275da8ba7d2437b107b6df6923358b1d58366f3095c9fcba00de9087d3dc0fe00a9ae012e45eb7ed4e8c3c10cf43a4040bf459ad5084a0a6c7a3db844068d1ca1cdc05e1a24cfc800a166674462677ee853410649e7034d3c35d0adeb8e5aa1621bde421ad540d2311a29bdc3062529a0ede6a82a3bd48e90066791e73dd443b7e0a66c06be6d6300b76f243f869977f45260e35d73dcfe2ffb91fb4f374fa71c23b1ecba9b9fc0295fe9c40aac710cf08753775f311ca14a596039387c23061fce023d25323a9e415654a7f5f8c5010b560f72ca1a719cc5190f52dad9af1b38650b9a0b439af971a4d3684de19cb2769c0d031b6c908145ab5cb674cc1900fbadc47fdbeecc6c87c1117183d0436059a932761e6289dce82a1d8cad03549f6e0d2f4860f6399640d9a586daa5ea28f13661198fdc48eb317edfcf5a4cd2d0d55231d3fd93cd72db280e7a96bf2862437ce4e9b05fc19cabc4417dba80e67a403e2386ddb95ec1bb8d00b054d325eaaf559c9b417681e5a0764de3e82251b4bb1d91eb4d0c27235b5c50846b391b5da43ed401aa0dfc413ef58a3f00f03e695bc99c25d58eef8e279bd50924f63ae5574fbefca0a9c3b73dd624f68e2dd1b50eb1447c98b683b09532db61c00ac576b010b51c5f08fbda39e6bece6fed87365a87ce3b2a4820bdb2c0a412255c51f2d922505b399f60ec15b131cc2308a62dc82adabb2285287a408c7c0a9f2356c770785e8dee1ee2a2f81ab13a760ee7e005f4baaaaede1f77af2d7d15d6f4c28e2097d09b3bc22b2f81fa3c8cbecbdbd5e8ad49de461e73ba2a3b5fdc1a7a39848cbc590c092b8f28da0bcd9d444ace994349c87f5ca5a63714f45992046651c99fa56c9056bac52284ae8a55d788ae222cda46585a99d641c2fcb6f3a06bc49f072ba4693e74f65365b0bfc97feac4fcac3c3598ae482b79ddcb33ad52b9e17be5b9ecd97e1c8e73a36bf676b53b2a018baa15e8eb64cca24259be0402fe9f8ffee2e4d90c8a15ed4ce8e871ce5543d81f78642fe14eee73f1b770f5c01a2849a3fbf787f47a16e32e3c10a5cfb5d378d0443027a3f9b70761f370d151d4a8cdd14ebf5b9d1e638bdd622d064d7ce41bdd3b394043e9e6e8677525c6896e85aa20e877adb375194ce82f885f03330c9915a1b433955cb9873543b2a6da02b473d41633fb4b83f62a1344242c1e5ee34ef48870538b40666373aa0211dc7321ea37213218765b7ed7e63e2e6f1e658f9a05e50f02cf6c170c350c54f0f8dd23a6d83347868371fdf52e20e09840c372b4c36df7a9e6828424958a3ca07e98d8135214768e6ab8deb5fa18f14ee8492925fd6d5a87e2ae19007e97b9ac2f2dca1d6ff3a4de6b483a9a8641398717a970dbc1c040e53fb2522154bd5496b5b0b530e2368e7bfe69b20c71187f5027bec4cef18488954cca6731eb4f470bf725d9ddd23e1d042ca79c0c609a49971097229ed6902a0d1d80d16582467928f2292a6dd51e1f9e2a3b1522e1533f1e45f55fca1a42cda598b01759c94fe0b96ef435a83874ecb628b3f2267ba2b703666d415d68f78feb4963b00e1affce1a8c54d91fc39f615da35c6f54f8886c4e8876b02981321aff1345ee9301d9e59bb500b3cdc79201d763032a81476c76f6a16ba4ae09da1065134b6e9519a065920b21ea5697f9db5837e5b342acb4c47b9bcbbc08a1fb0c125bb8c8f1a941f94415868b31c1f88e5af82d7e9479eb4a3185888f1e92307d9977760bf4451bb3502aaaa6da18fb9baf22bcec95065356f4ef911407fa0092dba43542c5e86eb56ab4b1b47a5feca9f1ecc58cf9d6f69b899c65403e367ca86ad042d29c2ace41167d8127c2c6e093951f6f64a5d2d154e68b33d277c975468f15aa5e4a219520f8f62fae66b29f8aa267784b292b2def3af8ab71cfc89f3b61ff3c482d3ccac11e64cd03907ccb8383ea4d7cf049945fa9817bef0288ce81ca8e97c180cba1295d0438e2b64d586af9535a412addab19a7197f4d00c049151a6e9682f1393271fd7d128d2c14447e048de1c795a56f0ed9c7659f24113b55369d6920d2867b44388ff1a6c05a32b630aa74364a57d1242bb4886d7ca7d5efadbda570629a129ac77adab64cff0904adbf67a1b08af6947534b189a94b6555063d237b5d51fac7771f56ba8b70da42f7c19d53aa314cc6074a319ea1439538cc464a82d13108b2a40fc5fe21d1af19fed8434b1c1ab3c99b61a6ababa861e7cbba96763ac539294fad31436ff039637efc59657d60f347e39fe178696fa3f224c6abe2aa6d237a48d99825d22580fe1c90275751e4c8baa0802681c22445c23791248c6d6366560b507ffe2dac325674a85ebaeb9b754356b83ff61fd078829948c5908f26958d03125a888d42e8328e9adfe44dd9e7842d47da4c82bee2c6ce20428c0e961ec9a6af662dc0f9797d6870675ea6d4330ac9389f22eb2f1dc979b80d5588e837df8c11c391806d9099a792d9da9f7b4ef5358017d1874f3cea16900c1f8fa2d95eedf91db1178486efc00ca93e3efb0dfccfe16a947a5949ca8254f3f46e2cbdadd26fe1f321ad3c65bcbc4647fe8bd392103cea5cc346d5fe588d4ed68602af884428efe36234848a19a721dc49fecd49996f1352ef84d58f0c2cb333d0bf97db94fc007a2df223b7a03005370eea85615988e17ac544b1cac1998eb1bca25a2f56177d2e1f2fe695936359d591151516d98ab37fa4f8550976761aecf886bfc7b165ffdc5cff08f08d45cce270d5a61dc4aca7e495c794fde898aa8710e7755193fdcd37e7f5a646122afb534bd26955e072eaa47a819289b39f9b95ba15e37de504d16edb23043c141c0e2cedbd4b0a728298c54477b0153f4667aa14b81113102c159c0184a8a01ba14b4cf580cda3101096420704596cb1452793973b71afd21d2b5c2228da2f5176c2bc46a39ffb37a908dce066bc33f065d28710c074fd71cae059b5827393456757f226d2898b35a825a1ffa4499493b7963bfe6f82e86a22a97728bda05641b541ed20d5c7f4dbd2fb78fb10cf07676e57032d08673840371648a49d9fa82ced56293e5e60d7fc92c18d5bf1316924ffced084753489cba4b27f2d2f7b881a56df6929e3202a9172d4cd24507777673b5cb95b0b9dd7e250acd684b7da50dd6e75e2d92a776b69fee7647aa7dd9a8bb7a35eea50b18e35eae5b86e452c6739ca4915ccb200786d4dd078cf4cd75b97eb42881cba07fff17d6f756914dd7d1a2b74be959e51029655208213707e3abd6dde4eb2828303130157ab4cd980aac22e4515ebbb6790eb1e849e6fb5e2b2148c3a11acb310806dd93b5b40989a077b428a6c3c7bd88b0cade413404332801d52b14e73a85589d9f84f4ac0b7667f9b22e8b740f548b3e72d7050034b2259e995e21c5783b7d72df32854e206aba06175898ca799581f1b4584e58ebe1afdcaf648ff282a46dd5e63f29e5d4da0c475ccabe945f0d9453af89a9efb4e007cad632022a4b18fe8ecff6007f10107a87e6c6e5c8d116f3739db4cb0b1d8b86fba4a19027ebe79103abe77d546e7d622e0f3860a285b1cd8fbb3b4fee2201a30cbfe94caf91a26c1ce153eb94d610cf2a53dfd7d071a7defa6a32b0a0cbb1d5881908761044803fb125f5ce730071ac8c71775b2b015cde9c284cfdf06aac35bcfe3c44305104c654fab99a3504744362a6a69619068aae8e9502a0576cffeeaac52a238e789d4b14bedc6e3c7df987e1e8e652004665b79ec687fa568753e98b3a447971d0f98697e960d7c50cf041b52851d77798369bf4cf7a9b0fb6cadc035344430f4b90455f4e79e64a3c6bdc4f05a7be49ffb06cde3525514e4091c057314f9f46aca94d5a44592e4987437949de4684ed393ed668935609bd570e41fbbf8ac3c005b1d1901340bf896561a88ee4a9d0ffaa5b11061c8791d68537ab0119650116b09df266127dee809c644d4775d5851d3c75823e62f04c405b68509659a26d06e1c4d0669f767c732d42f7f8b156fbf7654c522e5870ab922f6770939cf551a638990547155e8405699da53c77c9b585f5090c18263acd98d19c680752bf9edb321622c88eab75e75ab8f5b49f384f3e0b8884be0c63b6dc9e51015c3c85ee618b4cdd7b599816483829156dbbb7d45238c7d8dc9bccb6b3f911af070f932aa690c80ee5494f7e17a188494b6be1c0ec03a09698e44f713f3aaa9df873c768bfaf5df78d3537f57631913f36fac1009831ea0f615d1ebc2cbfd625d2b8cddd4eafd5586fc29a50e98b8814421846b8685c8071c910287a3d4d33547a218e03db6b051623c5b92cf5b879aaea981b0b86fe23f3cc57839f1fe4fb5fb585da3d9f15919577b4ce0fb0b7eb944d3b73478d484826e8f3797469e48b51dcb3e389e26a73dcfc4b96e04dc3e56f0cae9451b0505b7b5259926dcc64837ca54f5aab4d27dfc58a9e854120a7463a4ee40eab931a4ea6e26482f08212da7b4b9a4f8ffba2b1902edd8229f4bee6b38d6361d95e55a618b351da1081b53d318fec372b3ea7fa06c43180395d722ffd5ede1024d4c2b686ea07b886562e255d25129c2c074d54fb3b7f6c18afbb0c81f7bbafc769ef0a6cb7abd41eb624f3e8bb0a567898a94903a3915e53a5aebd60a7a0fd615af88d8049205383e9724c29285b4556975cd230647e7db88f31e167cefd6960a66150d80e6651c93e86dfeb32aaa3285a23a66f72bd0a3dec7135796e09561171beeddc5b6baba1c246f207300129fb90f0d836fbbd74355254f0b5c957c5c0f567d64e7e5edbfe9b29e908089fe6c2a37e26939e7b7b514cf2163108eefde260e493738d4016774841f68d73ee8522365b5fb36d9ab0ad7b5b7ce88887b756a733aa01e7fcac1166b98eb5acf80c369f02b321a9584ac6bb4c3ffeb065557c1f1a733d4b3324731b334a71626d25530ecf28cc9f5fc50c1ac4ce76c93346c3ecdb075d41c2878942b5870007ddb856334268c0bfc4a405a0f2089d716178d9c1ae4db1b20050ec98c9d5ef02dc95ea98a27589fbbcfff4cc32498682f241e3085dc6eb76a25f64bda9c398f7db9cd788cfe01b9f33d452d6c9dce962dff03ae0b46ab2d07de1716c74d832e23bdb2b8371425a5071f3d56364c4903b08f3c02bf2b708a5596f2da970e2748993468fe57b838b886a7c76eb6b97b3e731ebbe59a61af036b584f02b05ad107c491961b200a60366d8ff9212b3b4fa02f4d4ba89361f4a3496d3dd59c5fa8fb7e6783315cb8729ffa13fc18e01584fb70b7f364b01e77baf98f6b3ffacb51ae22d0be1773ef54a172b8f4108481fe21c9e38c3b8828b4df34319bd00bcc67bdd4d6efa1acdf2f28b42d8ef9645760ba730c79f3e5099878e7f10958393db337af9fe6f414fd0161205c0b3cb2fc488c0f7e3a4952dbf3f003825b7b749f8cef71e4f67ab1f929f9c295b771a409224ac7e9a8026f01a74235a6d9af362a709c03d4dbe10cacc57275fca0e76628ef2c2f12cf0c31382c53640cad91182c92a068d65a6073eb50e8e2ad67b776016f0b289e81816e2be608be81ab27ae6f81d88f8531d8983226ba3aca3778c30153e7662c8198a1b12c5760e2b900e483f006823ba0fec47f33dd63ef2e3a41b1e344eb0c15ae5bce3b98493e1ba8760e7b6af03edeac1aa6b840174270de43fbcc33336414c1f2a466d6f4c17c9f8366a3430742c3c3b008f047e1a9ab78d5acb20c5be3561510239045423c1f76430707bb563e170c208393f7373682ec878a456f7f00cd0dd468727f22f7b0aef1c1f585c8436e98f88829ca21c642dc4ff0ea35bc58e0b67fafd2b05302b8460df79c7087e34f18f0fc0922544f9c0cf510b69528e9cc50e98b6413e4662a1934b6d5d1a54c650a3293201341c3c4b7f5aca22483d01e6106ac3434ef6b69b3190624184a0ed6f8eebcaa8410a021c289ebb7f39f8fd81a22baa54791eaaaa9b95b8a71c29c2a0138e72254d1ed3698b388f32620828a0253a1b2ce1154079e43722813611eb3c966f9a54d78ace1faa51e18e71e9208c3ac5b43f9e4028b19a8da83a009a8ae6f694f57092b3c1547cc75bdbc36915a18602f69b9b270962704d6bf536187a8528199fcbd10c05a872e213cda3f62d08346dd5a854fe7794098a914228d6e5689659de4b967b262066bb44feff7912650e6e9b4559845d0ee74c5b7221d1dbcd3486c18b076c4eb2082f751f0b59308a79fa6907ba55b3fb509e301a5f2706405e7ff5ac772662a51dc20a9752e653ab8a1f39af8396985ed9c33af200805185c90ddeeeb3f272962c410ca243ca422392d14f1ce80f4b8f22f2194734eec50b1c56964dfcdcf3aee487c1dac91dc995552ad77288ab859d989b6e203aae9c7bb4f9498b2941b11f4bfef99f429c7bbf3a4b52fd176a9f865b25e6c8311cc744325062b85eea3673e1006321050522b0ce5fa2bed32a4130300dad4c17956051c6481f0cdb7e7e1c9456babe8fa43eddf0f8bf61191732dcf302eb1ae1682534d9bab2818f952c623430fbaf10cf29e5a8fdb8bf410b30388bfecba13916fe0d7aec24f81ae410b0b405bb5dd359be0f51d251573b0959a1c18d73f463c63756fec61b8f501e4ea9a4675a83e4a6e4e7dfbe68c09b5234191908462f9ac760f3143dc308c83ea1678a43e3a459765e202963769a5f8432daef6a166b0abf17e307816d57e9d51532b67b65d1bb59bc4bcf939e102be0f7843e431155a0a68aca4c8f951639fba2db9bdf66a22f66088572d3e577474c869fa11f457f89e90320fab5e3ce4e39339eb693605852499fabde7dd5814943a87cf1f5e9c79f7c5dc9651b96626575a01ab03538d75925c5d865392937a0ca95ddc3708f1968ad6aadbfa728c770972a06f540be0f0e1f3d786af47e71c6164b99738bf359b44d60f91798504c416796a3be728ef6a5cc768c782803d95f8348ebf78d253b51f0ceeff55cd302c8a036b064eb51418262a40f4d5a7265f71133efee432c21211ae54f3661d74309aca34e63c23a7b4ebb96c2d383d49fc52ed990c497bbdff666c432afc53987125b473ce50330cf9b7912ed75ccc19ac728d123d0307cf147c38da212abdee469233e9d9abdc665459bae53a8cf5d141865db21e96701376c5511fac94a23c1256b06b3b4a33cde0fb0c9b3e4cd6b3f40683ba5608bbd6805863691639123ac8fa18c76d12845d6b7dd1b4342bf6ebc27fdf1afb475d71f9b478ffb7d288bac8f3b410376f093720749ee97a8b13d9e7f6574a50ab79b656bbd3d69af797c1d78ed152d85273b6536f81b24ed04b7a16d2b1fcf11d05745caaebb0355b8e743f909f5c7873a38ff96c70cdeb05bf7a599f5d5071254fae287a64984d043c83af9a4f0e74d50b94cbbe99c66a8218cdf778a25c2bd465b961bb8a33147d05b8a45cdf2db35b858c2c86d92f1d567e88a6e97719b9008519e8abbf343939977fd509201ff2de3c6d62a643640097d59bd22c755845f9f855edc53b49f5c3d41fe3f63347d9fc3ac4e5d2d6becd18027cff5b87a464258029ba7152a45eda1613129da1fa2b5e96b378c9f27143c049fade2af71e8785c9d3281301ae6336c4e61a09c9638ff7dedd3095e4009f048a216250ef1ba2f4735a4005daae0021da46912114a6b47befc906d11242dd2e1ce847337bde48d0826ba21601127e78e8834e6820d29b1e5dfa20f4845aa501f4f199ac818c62716e44aa8b2901510e4c4bbf33f6df606607595248670cc5516fefa8a9e033c2ca904e0733d0d4a4f298109794c667a986daa0188f386c65fe3fe31d2c8bd8ea875ee1a583baac4849827b6bca4428737156e75578493bdaccd82f03fb6bcb7d9c291b850ed26ccb01f86d26787107296b0f893c93be1854c2dec20a29bf3d29a29064456ea9dcea256ad05194dcba422d013bced17ec86f4beef0f6a1a642a765027cfef6855c080d80e8607f0abfce1b1d04a61c91e40ec29f056f1a476e59bc929c05cab90b5d25b6b522fe051cfb639e43203a44129eb18fa3beaa917c500a56cdc0a0d6f8058ffb6df435c646c1940b41cdcd6e785fa7c833367032ed6a4194031d5cd1595f8164a88489fe5802ac13b6babf032c69f8105693967f81d534ca925a17498ccbf89d59f7206e7a3184130140a32570ca165bbcb01a99c32b203471995239f8424014bd6558b17d7e079189701887ec2e60102f98a2202848372fdd780322cccb96d579419c0b69554aaedaf1906badb76074e66f0902dc53674108f1c6e18ffc62be75368215d31f7ab69fa59a4931c88286fc9881119dbf51b1451a6a7493e958996371d1427f97a1bd684d32d737ae0870562844b741d31c2811b93dccbe8163a569dec84d50d9415e6ea44604dd3a7eba53357aa529240413d5c547a75a11b2fa487ecc0efddb88712bf55e362d3b146f258ec39e415338f459da4db3ee3a1e8732c1a913240b74073fe815e787f25600d46d8a5142fd20f26232ff592ba0c32fa29393b340a6d6763a51da4ed71c40229570263b9bcdb5de72f22d500744b3383903d2fc5c302e7b733348d58b0eb31ea5bccaa60051cc8de1fca5f2e380b3b62cf542a651e3eae2720816e457e5c3713bf7d95d703e2675f68188549b333b735deaba022e931af568528569364c8ba7c9644d66d460ad7a9aca26b8bdb7ee9e425852fc04bde010247a816e316abccbec4cc4e0180784d834c06536567b93ba199c1848a21d6953742b369b92836308740925d030b269c376236632de904d63be6b73a40c8b9114edb2d310f82277be923e6ac4289712d5351227ae298616b131521801ac60d935b366259ac9de51f692fda00f0626e91125f5561a7391ed0b9eec85ff85025ed15e40da412342cac45e51a3575dc059ebd262e9a93331003c565e272b5c0d9995182a4c679b12bc1c581009453b43869773eb6d9d4c6557e5d025331b409dee60f28356b15622b8a423a3e9a496b5d2f72c0a57bae99f6af44318116d23c429084a036a411930942cf0d9843a71e8c1e49e74fea78e6e0173a637ea37b8091faa2a2ae33798a2161065f1c70ba4410623b573a4bd63006410dbadc67500530eabb8d59f65a1dd8d689e26a9cd9e5248981adca6e8cf9ef7aeeba6e47b25f9e85390047a2063b6960be53f534e029a2e7251d0c3ba03eea7f4f39e136814b18ac00ba02b3e78b69a589c4afb2d72187ec789c66396707fefbeb1b92a6d4e4c03900ba49ec5abae778ef6f77bb18f6d223f87aa4e8fa6b85e737a571e2272c8e24f5d2eb2e01cff36bce8bd01588ea5477b35bc30bdf4f4be8cf40df486f54b6f7c47d8b548e24cf71817fe6751f3f7f723ce9defe478cbf0cde3c31cee8873940b3c8e9da2980b2d7d9f03edff8717f0936246350153aa76174e1eee2e405e2ee35b7d753263905f00a0e18a6837dc2d2006e99c1117f03fcb6c8cc89579a95d992f8c4a620b04781ce84a1f7742ddb8470da7a4d0b84b48b33b20de9e7be5640efc16f2d681acd4e7b136768e6baa50e7a07757ad1af47d791a7f267aa79a0de0680ae97e95b563644e154c137751313aece2abab6829a0e8ffc693e707c753e05a48dee661ad8744976f2587380f56a5f2a908b7a119b9130251f7083d6457545a1c299075a55c15341f2a92b62dde62e2fd56c5118e309334df8d658ca4f47fa2e1b0ce68167655a0fc014383ad238cd679010c72d225ce104a0e26bc10ae710a4f97b72ae29adbc0af6e1a005c58698a2962c22deb29e0052f904e7b2829574f2a61f3750542dce1ada42026dd7b703ca3c491e48aabd03c374ec920ab4dec7aa9b9c6d56b5710dba7668db1c26f57938125433b6ee4fdb49ec7818b6099a6e79961425c559bd0259ffa0ca550db55135cb49747334d4cb2816ffcf8c52e3616497b941397ff2c8198865623cfca67420181dc1641913b50fbed625525b127081c1ce5cb35c19501753d7114ccb03be351e91dcfee89be4915efc4bba8a158008f20e80fee0275d1ad1da8107f21e15cb4b6d12453e6ec2249842c141bb24093f64dbab423620e2d184d62d30cd892444ecee54bd80516ad911c91141e8d08bf303b3ab52ac408fa88c41aec0d0990a14aa9372490e30a3a7c43326646495938065c29e003cb44195816a056845143ea015c27fa95a48ea60eac251e9238e6904ecb300880e841ef59e5015fa8c60dac65de4cec138d6af3509597bfb33aa4f4e2a6d05a12066e3891ff65dddad4b082875f35a88cd82b126718b0082558e14db98760569e8651af86e08ff21ba7b27943960d3f2a0ae1e01fb40ea9b7dd80c9b2144c6d1d5a84764517535051fc6db0d841ceca5d984274aa3d06c78490d874cd27a838721b69b8cb6630c204c171142f44bac0c8099c9c53301f34555bb59af6d24fc740c144fa016d8fe63c56c2237d5de805524c51d665af21c6ea9ceb0d05900203bbb84ff69bc02e6ad7c98914980d22f01f89db710716e8e73496d414976c3aa16ad4634d09405ad6deda2e21712c6742d9febc8611ff4a503ed0193f2d763f454819cb724f5882c8998506164be52c70152fe71560351838aeb70c2cd161156721692bbb2d69578e601764c40ffd804bc320f0edf58c681b564dc065a1bd1d11bc5a56afde8c8a2ee1a33cddf49a4950c0f113965363e6abd13f56ab579f798b889af9f6c795e7f92d3f6bbf4fa23da05212dc971a2e83ea7c081ba01fd8d9f92051616953c2cb27d2c3f20378e3fd25cdd05342b7b55985d08bc794414760207563b516eeb66a04a58fad6b6d5fba9636635dd6f4826b5d5df5a8284ee4607e5829487b7d5827167c3961714cc0ee23ea7538383e867a2f715d3fe30abe132b09408b3fd35c0dc0626c5092be6bc41cce7650ea89b3d8852507c1e246f4140729c471ae4e604cb87197e4398f8003883295a1f2ebecf2a015f01e7039cd01a57a01a580b51f6b7b005669a1651b200093eb022938c3e1462bfcfb51ed402d7bc850daacae61325dc551a9f71de2542c0bb8a20d9170d05b3fa4ac35e37f07548c5baa17bae1da32f98699199d709d5d129a2572c92113fa1d1db7baf08bc2aa3285168406bd95a2652756f78cf9b782973267cce048cb73d85fced80a0192f44354eb41eb7f386cabc2fb9a72380e13bb2ab0cba88aba90487d1475575acb746d3a1dcbc3f7d2341f4dd0d89e960f34961592146419541d56516d1422a0b553a13e63d8b90b5e9453c4c0dac5fcae6ef0ca92711eefbe4fab7c9850e2e4ac1cad9d441396ee128d544aae513ac92f25d8d595e94dd2f5a188dcd0c53c6203b2e177af895aa3c148e118af0e1a38483c94848d9067199eac2eb7925d4d35d576ad3a31c405f819249246840ea6c25706e2753e6273f1d72d6a5742f6c74d8fe5c22d100c496c51795ad51d70478f4fd03bcd80dc9e2e2c782e3422a2ac6ee75055b2f722860b420c80fb221ea71b6a6aa7625748a1b4ff522e08309a0bc484523e2fe9062b235323080c3c4eb3131a08b882c48612da64608bb401957fd434912af654d54b68a51142b0ad57956f4fe9cfb4b1b4e16f82759b530aabbf66da38a2f0ae790873f05ab0899f39a94c29a4291b2d2a0f65e0687b5a1dbb06512aa55882fa626971ca48fc1194388ae7c46fa87aa020b5f48a506aad0412b3ed1043c30871de7ed596d969f373645beb1352db6e843b6b2f530b30987ddc658b08847410ee99579d68ddb7f7c0a3cf1a5715d8729ed293a63c362a97ee6f7764f95be05c84dc822ec939aca2b00e8255e13d8a58590d6ecd7a4f6cc2ce9bca793a2069ed2cfd8beb4de9a32fa3d41b60376267dd8d74800bcff63d00436f4dfd7d8a959f88e80044dbf71301eba6f43fe68e2052b6a7a34a1a940ff3384c217ec123c01ddd11a6a9a085bc8e7b55d70810fafd7515971ba5df27d45b5a0fc9b013d743a84bebba62d156ce9daef3191589400d208b147b5ea7b463d025513f8b2856f26c7e299320fe93b145c643e0376ef19783fa2495e8cd9ee4a87e53286ba4b8690443f93045656b2fee0cde9746f3cd5295328d5b51e7696d1bf56e57ace5f0f8a25ffcc8f417e527eb4303d8fd8fed8b03e6e926220c2372f8187dfe453116f30cc0a841b93f55b6d2057b8d4882510827e17609684f5c600046d5e2de6120cca361b0b4df969b483733581a57a306658c51782700f203c3430746262951c7a0b86601cbbd05fb8051882596262f42a58ac83e158790fe1096fe68704035f560ecfc13f2e5a2b706a01e813729807e5fe69ed2245ec794e8a94de33a81651d09416a2a7490971a9e5c585a1c2abfe45b4c605f93fc2c6acb0188ac7a13e719446c9d8873ef2acb66034e729ecd46084b5f317fe70c3efcc51abf505e217b9c34ae5c68d4ca6b35f14914acb740504679fdd75e3c334a87277eb0b44d8241a76d0dc7a37a267d8a95c247e61eb95823c97451e329da57bc1b438968a5ca1958c6cff66befd7d3724802b558111722e6c8168b51cdb7c7f88bf2e0da7a5b2ba50d17c03e2c72edda554d5fc0f90edcf4baefa40ba9e8b1b4deec694db0340dc22bfa464373ee5a726b3f54a1302d1ee537da6fdd17c4d46a7278be6b47d80b3db0f4dc668238598896a336f2a11fd19e29c163d3ce4f1a44e79cb1493b7d2c369d23570167f3ad7a4c5711f4433b77661ff5538ec736aa1fbdf539567a68edac3189627468a1116db3de747c7145d1b18295066289cfdaa365c49ac04adb3c34cc52585c592eb25889ddea793b4e5238d646a1f9477678fe4b9d983e8ba83be5a99521c70128ca254f42570fdbc756d9de6a9f9503afbab8bf682be891a290d6d590aa51f6909ce5fb61b030e1d12b98f8c45981c16705f42933abf66d30ce827a86add23d7414e1a34fa6be143ddd136beec0acd5ea6bc97521158dd928c958833d71abf48903ab29058049b2d26f3778905613753596e7dea923fc82e05b3f0ae942aa5aa5f9dc0448f47057f4505db894e1ddebc0a359e159dc861637f5b44adfce5e68645683391a942df9482a008032d99a65366bf1bcea3a1901c18ec660982f0c0070cc6b4dd17c87f364fcafc4097a4384fe5d639c9bacfa5fb341756a26b953ab13e3edef6b492e21f5e6c499578435456c9c9b427cf6adfab0d8fedf66fcbfb310faabc21e0ede85a2522472d2066fb90f8efa8d1da1bfe2415325c6fb1218fbe00eb55f12f6f37ed51be894d0c292492fd2b0d12ae1c282a1aabf01bd32b56dfbe96c7319b4de5e5eb0fd34e86f524662ef3a7874f04b0a5933d6ebf650e0c5b886aa48056bff268dfbec9ad0ad0341aa66e8c2565de95228cf74529540c7191dd13223426c651a765b8fcd59ac1a06816e7d0875792e7749ed2328d1c58ceea97481b964fbfe9daf0c6e8c688377705e87bd45376fd06d577360c847e5bcb508f9e2dc85adedc9ebf6975704910864b121f715f07a14d3b358a920d98651d5183a95fd44c59b96e7ff6c038af012c4515f0937f1ccfee63c3220b46c1b86931f34363cac26657a02ac181898225fdbb3aa69ab52b0ac8a9103bff9b7fb38f976184ecf28e465dd6c126df61ca1b902cfa947cf44477fc5a1312e26ecfad0da038aa1b991764e740c9f12ca1a91c74042a8bc3632bb0190c9321b5324f0e8c1bd53168791ee2454e126854d683f19f6f9bc2c4e5b4d532866fae2526b6c81e429825b5bcfb006848f9a5077b5cc2407ae10d285f91de80f723e1a2a82c066cfb8fc3053ca1521112237e480ce852559f5c5d6cd722e7ddf991881f87e5f0d989e6704f0bbfb29b508f2c217cc816d52af093e05dda309c81f919206e58fe0df7c7126f0e696a0eff3e10d13564da2fb8684b5b1313040fb03c640cc34322c5d61ed7d1b7598669d85ce805505bf47e65cda1eaaef755a2db74003b2f2a85ae38c9ca3661c9d41e9ad29823f34c80913d693a1fa3e4ea8fb400c2593bd003a3e40966a559a598268667be5b10d8bcac0cbcf0491c15a203c7f09402c67dfecbcb0094692a3701af880d434188a6ba4fe441133d2e7e4c673758b73cbe5cee56703e6be53ee977816c1df9b87406df03300d5f7dfe31d7f5426d46a70f37e1aacd9c5e805ae1236c903e003b254626a3b4dae47af246c62e209e060e5482a593d35ab16eeb6b62f5afbe749db8014b7b27c60752a8be6b398d5b4d1838a48a1760d1fa05397f7721cc57351850dc775ada51ca4253880bc6167219db77816e38f0a7cf1f24e44525abde8c7ad12355ccad70b9ad3c39078bc0b816f82af16e055f4ee2d1892c2167494ebe628e96a356199dc6fed586481f91484bf46a3ec80a4a9cf8359957438040ba5a9b5714ccec9e88852a95a911e7bdc693ce9dd296690a5bbed7dd3136d825dcae76c0c9e355ad04e2270b84ae2fb3b423ae69594759a64c97407a99726c41de08f71896ecd1f320ef8de948c95b65e9aeff1fb3ce832e4a026d8f6ff809896d523a4a702fff03db8318b3928c142e05c3e66bc7fc770baaa9cc0b265e36b50e37412235c1f87a91fc4abf769f4ca328b44a9416ff98bb9f4c13f7b1d8d82377b13bc60b06c42b3d6d5c99cf4b09dcbcd7dc4cba5b07a1af9f3e48690ea9ce3fc21ff507c6fadae696b09d5a991e240106d2eab2cbf3221689a3783090a14e8391444b3cf4755119697f614955598769ee5e2a77feab3575da506f3d1af59b214e7449452db1592543e13f82dfd6f604319de316fa03a3182f4d9d90645a4b2eccba629a753505149958e151b0275585049629efe3272c561b98f0e1b54f688a3ead007722c9595ef6fa9a4c9a889b37c746208bd12a59cbfd95d2d96f8dc041522be0b98b93bcb1c52aa26611929c29311db643ba9c5af9f1eb0451480d40f19fd05d01101f3f9b266db08982d21bbec2cec183c6ff53a022b60f76c5d242f5e84aa86fe4d56884eacdd036b90b50fbee990da955dc63f23c353cf2b87641a4c68b90b7064412b8449a3c8280e48dee3c430de024e67f8bce8804ed194377cf9226aeebc6b20a84596f56a74cb2027760ddbb8960197775ffea6b0e6be7a6f88c4280f9883e5342f57b7bccfee8f216944451d5bcf8d8f15994725ebc255324f3cfbf7650bc5b3a4fa27c7897b93ad579d06735429199bc3699f4e394d998056db22073ed428a788e92f4d8f5a1303bb6c9c7e39ae1c5506d82b70a1defe0694f4519998b4bb2d322d9472248006951884a8f93ded002b31d188594a5710203b70748d894108d57045cfc61d44c4a661d60d208c79c641ffed37c8729ba20ce1763f08a0930062f920ea359943b23a53031954f736229ed74732504e7190285618081b594ae10608fee0f2143999ebd017b30667d348491d133ab0dc0017581f7a0727aeb3b4f01d1a75bff8cc5ee1e8a739818b386d8bcbaf84e11de2206b0bd78157647a686a7ba3ea0cada4e30fb4b4b390af9e82483c21bb92a4bc518aa4f2ffa6fe3061d9164a60ccec1e4f3ae73c95bf9abefadc939c9b4cc0a9ba1629ed90dfd7eccb06e845f4cb6dcda3fcd66120ef6342e84c238eb22f233bf0e1f86ce85576084e0735a06bb355bcc4dd9da631f5163da3e1473bd994260fa3ea781dc38aad3631974cedfaeed15ec12930eebc611992db394508a296086cfc961d6623723454e9eab66d75aad55d2a1200e6c2ee06514170e37c493819ae195bc49c768fe73959cfb86bdaa4506fe22ac251c2d7d6d7522ccb0c5c17584ef5bea2c3b99b727dabf499fd8b8b21e325f96c45e03b7f10c2866c860661c60fb04614e02dc7cf07b79d853f8603f9e62486614e89db444140f091ce9e4f7a42bdf9d424c747131bc6dc929277f9f6796190a824a0452e60ef592d850d0e0a0ed4fe98e0f99fed6640e0d2a3a4a86aa1f25552f538727a509a57d5198ba263c2febb5aeafb63f9a6712b26ec328ddaf1a92f3a1547ec4c9ea64f15896ed037b81152805352ab4578ae1213e256ab8a9316a263877611135a148848f615e1e62d42ae157cd0f886a765e7272d1fc86a810d3556bbe32eb5126840024fea506620d6a78e95a45f3440d1ff5a97641445d0995ed768be26d4c0d6e01e2ede0caa12ed95e311b5cfef27a075eb495b7c567971d349e71ba912a5b01894e540072444409873fe74d744e2f93070bd9a95c227df758c48ca800b80ff06bd199a3129c6ce56086b5b0c8ba1f03618aa2ea9ef98db4218df7222e43dd6db4e27855d0efdc5166eee403e0d5fbc8ca90ba8fca047c7aeb24677df7c4c9cafe10bafe78ed16c01abfbd67c1ead5d9395465b0fd4165be812f403c0d4853e3442741c9b3440bdcc03e454380be6199e0caaccd5dd6eb09e5c8ab02ba3d444ba2e81cb6c545917c4fa89a719cfd612d8bf2358c18075aefd3a16c0319da0de48c81c574cc358506acfbf193b14be01d2517064f160d095ed710107b7f9d745a0ae2a7d10cc8fa688bbd4f5e8da1162c04409d434b4911d17f42ecd4efc240d82fe7fba6650912268d73da34608d089b0589267f04e721b6f4ad549989b4a65af6b98b57920b7eebfd66f9f26b7121fe653c9a75473a1bc88aa7e8eb224a47a72110e86ec42cb858c45bb74e6c42e4db227d7931128ec80e0e5bc66c386c96906ab369345ad01a62711f6360ac538ad093f7c20a07d653eee8e453632feead3fa3c6781b56d5f59c86ce34793cc9b146f636143ec31ba158baace669b044874f8ce6d369d57dc4cd31905e1ea3e5e0ff3a66667c95904a591260d9748b9bf1d87f2b59dacf9ea3e142a2592d05a535635e6c9c34e4af62f369561a46bd226e0c040ede42704acae9ea59d0c07618fc0b8bbdf66b2cb2769d52482500fea5bad930291745cc1cd6381c4a4035a9ba6845c40d619a7038e329ba5d511b528a6db0080ad1754fb3781e563903aaab56f03a79cd2e13810c6628515003392ce9ee11e870152f1be74c6de0547387eeecdbd4ac01a88d41ff7f1dfef7bc9d88808b0ff5148db7bef2db79432252903eb07580897084fa381eea20b995074ae81653420bb90097d46703e6d741ebdc859979c7ccef376e0d72103a8e7bccc396f07a9f9a6699e79a1cb67de1d0fea36cc00ea8d786116665f1197d28ffbd46f64d9a1eaddf0cd31ff6cec327e8c1c5c55c471e3a7038938b0ccfb65ce107a20d1c67496266e185b32441c0c28f9e8b064b9afd4cdbcec7cb4977edcf82cac3b6249e28677a55dc4a33fe91d8b27f24a2b6e847e69e5938106afd44db9fe38f4297b02092554b1450ba0100499e943faa441a188112031840e38910499e940fa14b558820a80d081116890640432d385f4698646881b4879020927412090999b476a2941eb86d10788bb0fc9fbe3bef092607e0769bd09c03c91e8d231cf9b747e444440576c30a3d1d6223d72da880789c33cabb6da6f623e224de99aa6594cfbe296c90cfba2630104c3b59cf4e98a828c260a24e2661361101e0c530a12c320f7651e12556e4e4a83a46ca02848e99b946e5b4aa979488362186436c1b08976d5a30645a74fa14f73692e9d67cd95841b6a3cddf63b04a418943d3f1db0ef5aa4f44db64baf1d0135cd2c1836c50e8641be0c72cffeb417839a2bbcae98e77ae58a076b2b30cce58a2586d98fb3db673e4aeff841abfe42596b62bf7ca1110ea241228fa6e2cbf490a7a2f4860611c1e9ecda1531c9cf19adf855b431258b7eb486aebea268d014fa065dd9cd30e3eb8bd6fcfc4441401c8b5c6ead75cd935773de3acb83f38c9093fbe236b7dee8c49cfdbef530aebb6130dab8a760359c5f28196c8fc42f3e46f0caa827475d5cedbb2f86b8e1f489b9f588b04b6c4ee7d28f773e0226f3b88a613682731a99b1ceaacd3aebe8b769a785b111cc8c7c36fb6d7644d3491d91dd14fb64b8c1c3f8843a67e408123659491303f7c5c02073c7b4729f562d7664f49b174627395421029148376e006540590e59968d9050f2314b3ee413a19f0b1fd85f8dcde10637869f99a952cdd95d3006645f4d12afc2dd92dc5bb909c5b4d89c5fa7b5573ec64513572479978f4d08e108943a33298230cc1a3621106db473b286c196dc2769b2f8f617475c1d32fba873952f3f23f2474ff62c407f3ad95a2c4627371acd309b00e989642e490c5aaf7a32c81e0cb20c6e19a4558bb6628e79cbbbbbbb1c915a2c46abec2ef998dede5f3801d213699f797606a30bf52673945a1b33696300f32c8e73214472c27c70e54b19c32f0cc360ef705900c9ce19e382cee516f0ec1a98736216c332dfb2392567ebccb2cc96200558922dc270455b8cb78562288632b74fdc52c8673ee41a56ebd5d1fe98ab316b4924966fb7b662ced857fa31bf7af59917a242bf3b8aa71bf8a54f31fcd2ee129d44b25125c6b00a8a26fa643ebd5168e4bb767fe1e4e47f2ec5c5a47f667d348fd4f273292ef6a544970b4a7b581f72ab15c4a6d8ead179769ea24314d2acac5656bf27212adfe6d2639c2539a51f1faf7484602df9023bc6c996946e65ebd945d243d26595b2b39f944dfae9753f52d064482291b2a02ca85f9866945e2eae740e117143c9d3c3a6d8dd9483ba7543ae97309853fa41bfbd3f6629c41c42244b8938e88c537cc8383c8cf34488cc51437ca19da77005894222d840a28dee901be2bc44fa30f8fdf030c82e852b535c131c87b9f5da336f64b58df3f9859953d62e83dcc22fdb67957027839ae69ae6d3397ef7b399477a4b64d6e69cd296c82ffd917a70c31760660df5696971098dbc3cf212c9cb961e3c3488f271ca479e5592f7de2a2631975e84f4d6757009fb7ed0af5ebf23b3e5a5c785204b96599665d96ccfd239bfd28f9f1f73f1c322a41ff4a9d3ef0883f31bdd1f288004e9c1203b531a838e1849259511b8e172d8bd812bcf0d4b3131f4f8500209c220fbe863b723bc4f7adece79e79ca3af47e8ef2f2cb9946e58603e111943d3eeeab3bb629f05e6c78fc8f48671e9a611f33ba2589c37264947df11839d0b2290c807af1e467c75cc26dd3ab2ac52d25b2f24d1d9f4b3937449fd957ef4408281acb981431c1864215bdc1765c2b6d52df34d7e988b5c577a911b3f811b4f44de78cc9d93ced18e87fcacd76e07c67913b8f1618f27d2f98d0fbb2fbca1d978cec398e73c1c3df7e23919cf05e0b97b7ad1f9e62fbc00bc7cf1a218d9f1e0bfa3975fd8f9d4421fc0b36fb49ff0b4fae6cdd7681032c5b9e6852eaf39c726debe5093df73abb3c608ca6cd6acc1e7a6e5ace54ed7dad46bae69d1e586c75c7af68346f64dca031249f3f6c27b04c9cff9854deab9b24572d6ce29bf3dd26ba4166b67f6b9f8704798fd308fdf64108b1d0338e34982395550a1cb5f1f4967e9dc8e4c7e2d559c7a27a548aa7c72ca747991d731d09044e2d1cdbe1862e01776acb1f6f81571f9d1a2f3842c9e7e2aa82b6300e2864d2385390636d53b4a7192eff8721cfa3499d2f9c9292ea17025cf2b2d12712b753ef3dd17caef7cf3e835568f07772f451be53aafe4a3f39087be30e49dcffc160a85bcb0fbce9b21fec679ed5b7398c7a14f07d9050ffec9611e635a7524743ec6c7160f7c7ee338ce6bd7b08e4811f6cea977df04d8a973dd8eea5a7ccdbb6e86cf32e8da0e46a694972f99e800948f1f35cd2bfd8868deeda06eb7ee34e7308d5ff374905d98e2cfe73cd9c5f7f0d6a5752de2e097d36e99e56ef34c27ab14360cf34867a42c5871e563d8c60dd041f4d4b988a37be9d2addc62e319d4539fe9c14fdf4147ec76c8682312a1d315f0d327cb9ee1339e7dc60266e8d977b8a1670fd1a05d3c7b61067af0b18363fbd4d19348e987029e7d87c8faf8957c28e0d91510bbf81829d68450093c5f9d458785c5a729d3312f3685355035506c2af190f19b2adaa86e63a0b0a95b3f6ce2a200b1299312131433854d9c058b470383d557bc1da48ab7c3fceb894231afafdeadb84295a05f51852b395f81e4b478c549c4a15ad1e99395a9ae12d4a728b3eaf97af395e5fab0ea645fb852f31b0f97029f05a6eaacf8b029b2beba8aab4f51e6f503444ab50a8ba4fa7a93f3d563f37c5571f235ba74be3a3665387f323cfe4a3ac8a740d146f5ae81ea97ca82ea2d5ef21e0cd6b006eaabd3579fa657a08823fe8dc64a18c652c3a71828969412961c36d1afcec2e4f5d559769815820f397b0304177c48fa90a5e6eb0f823e6459f29565f59545e72b0bebab63b2eab8583c6c0a6fd41d363508bef6123a5f6bcfd79aea3dfa54bdc5b35eec173e515fc0cd0b8e516dd165cb32cd8b080980cb322e13855c3e5e71b1107410a64f21b7d694d9305de4211a23b42df3be68ad87bcc83058f02d687dcbbcb46d9a83d661de7a0f36d1b71ec45a1bf3d65abb69598b8bcd3c76208adaa24b0cda64f75b14f7461cdd7d7f474209454241794318ecbebb9740dc43124eb8c19ad002668e93c930f9b1a544942f7d6c2d11c4771f5b4a4cc9628b2e6175b95c9810212e974b88cbe56a12d49a52513d80cc8ed56212c38408019be286d105e4322599f3ab29ea841248954a45552a1c547dd2716fa85c5575430837acaa6d652fdbf44ec4d1d387de04bd80a8143e45e6978d2b894fa5619e295f29755105600027781e8d94b86155813754b4521c17efbc740cc5c245ad75ce39abdd81437dfbbcf4adbe2e283de6f5fed28597375e76641e3685bc7ac9a6169b38e49e9999577da23e5d4e8f9d0df4b3fd12c6d74b69d9a797d862187370b224e57643866fbfe1e65df12527b7b0a95d0966e6c9e056e557f231e757f2ad04ed3dda61da6fb4737c025128540f4028940cb350a86f8f2e3dafd8a28d99238b2fe4b0003fe9e38c4c7430e288fc859c5c9eed2e53ce80ffbb51c2c95396a5f8d3854d9dc453df4a7071a03e843a1021559ebc08e48064f5f1c9534aa9445536515693ae93240a84b9f19402e9174a1d86fa0dea4e1da41b0b12aeec6ad01c601d731e34cf9cfaed130fbe69d63ae6f6f3b22f7ad8778345d976708e51c9cd27550cc210e286f1a77dfc55318a1002103080620457e4c8b0162d16980007539244610432eccd6a1eac0b2e501fe3177272a3ebe0217d9aa1f5d0b1f8f31408fb42179c7ea14bcb1d01655fec97cf850f63e48b1b1b86b1d309b1c1d6106536979d0e4262bf80f40b494142a8ab5fd853a5209a73ce7d482a8a3b1ba40d1d10cd33cff68bf5cc7eb15f28e736ac37b4def089858542a17a60c262d37c8e2d26a03c877589b64aa2091f569d24743eacadca537d3eac4e24a59cdb0f89752efb9064290a048466fb6048fd2281745effd3ace7d48c4ce6958264b3a65f6cbfc49c6601b1801aa841942aca346b0ad7ebaa4f718910dca0891e2250410513199e21411445008116426871822019f67a5373a4caeb245a09f9022b3445b32a50e59529b65a29ada91a820a85fdd939558af33d862c79e94c7e765a3f3d3872089e1d5613ec980f0f998356cfb6b53df8c53f3295c34fea2755931af281abc3da7296f02932b6edb089b2f79039da5354d54aa552a954aaa66a2a05841bd6141336b5539c9afa9f8aea24927c5853e1d693b251f24ce917a99370f3992ce26a9541c80e48d49123d1860a648b97e85a8154570d9f10228f8eaa23da30c1ab32e1136df10b94274f9c38e9f93006d19e9d9f44b074a8cbe5aaae1d702a254151c7b278301fd7eb07480a9320a03ed51ccc8a9d56125914da0936293a7af82ae7a60757073931c8a572dd485450d0111edcb0ba362036b5875c2e577545966b88ab4f3daaeb555df5d3b1821b5617abba6aaa4f3937ab9c154be7593a1fd6179b426ee77b10e5d9eb930a4514eab84dbba15a3f241790a11fe5583026d8a24b485532064a3c4bd1a7205c86366bd6e072485f2f99e389127a02cada2c8cb53e2db8217dd117147e55f902908a15687424730a809cb029249172b8c909621c186429bb4ad938489c170e3f1da49b04844152078084d1356f40493a9c9483cb322553956483ebd32fad73ab4e8355a775525547aeaa0ef6c9540cd60dad4ed5618a63b7572906ced2b4f2646e091c6ed4d242bd003eb69268f2dbc7560f54dd834d06110735810c02936294ac3de286d4674bb2a17a355d87353b04d305544925258982713e3e3efd02ba0f89e40096f140941f3675b523c8aa90a201b169d29cef9796915e4882c9d11e16e0001f7d7a30d1063bf59139fa2bc00180f07c72962151a1fd8454fa966241ca36a9d790994a77777777338c0184a4c36855909d11aefc88b8528e8036ee8e42528b6f349b03e1329c75393936d9d1e6ddf4adf351801f304f3deb76506cdbe4731c773f607e5acf5c3eb5de020056a0753bea84110b307df358880598ae7923f9c274e95d001071ad4f8ec1d9924b82460734524a2925b394b24554315a59848d46af6b2d67735a5a7e445b8cc115899859c42296df55e11899bbbb3b7294cea3e5850aaa497ac8d19112e80f2c72103a486ca2d8c3938343837a3dd9d151d94801f2e95992534303e5c5da51a20a92e2c407c6856823ba4fcf929c5903e5c5da69559014273eab255cf303a5c5924aa604b9423b577e30a11d6649d2d3a9e804a11dc88e45845073429118ea5989c5505018e4f9c9570e6ec8d93c91afdbdffc42d2e46c38159f3a20ce864d4d391bcee6d93ba06efa016116e393a4fdc957088545b159b79ecbdbeba1bfb56d638e21f285b6a19dabf24d2b3f867670adb5d6f6cf2f4432049bbf8f59ccdbdb923ebe6efb04bac81c32c8173a743bccc0dfaf48b4d13930d8ed32c81c31bea079dfef398f3fa4833b3df247366d5a8c1285ab7ebf7e5f93ed844d395fa65b275c6e7ed5250a8660e1e686362d92a5277f3a142c4cb91c4591e7062cf8d8f910bd54020514b46777cf6ee284133c45284210085250852a3cf1c42acb410115a81045143fb592666af57a337af1ede1c7cdd9c4d521f1b8bb5316147a7a5619102b800214aaa842c74e21055a6841051541b46777cf6e828382285132148433ef43a5e47da86c9ee7f6e74365b30213ccb9844929a534b4044a29a5744e1d4deba4734e3a97085a0549d60fe69c76360dead3b5b749f6b3fdd273431a445dcd4e4df0ec4141414141151514b46261e2c9939beda656c93c9bbc81801c3020487ae286f4f5b25166d6e9126d746def6984efee8de4e486f4b5a9d8145a90b22c3737abe88b5f5a4a29e576231a42d4585c9a5a6b4f8e0b6171d92389c1d93c5352d9b54993966cc284db4b3f7aa6396e8b469863c9f37553da725e8a0416503eb6b070f2a1c582c9db3eb14d90eae699a3943669a623279d3cf3f474cf699f87fab07658ae687e78f6bbbae168f6546233e5863c6d5237bc6253a4e1540f37b425ea114aca875b7530a8e4fa879c32e2869cea48238d4d7bb68c91c73bced81c67e2a472b3a289139a8fad27a9207c6c5d71c46b3cbd713eb6b0b081e2634b08519ed6918c314e0665376d540cf61d692dfea5cce3db12e7eec226ce59c22fedf17ea1afd47dcc844126382d263952b8200a27aa9831a21584114d380084d301ce4a22b08066e7b5c4942b64686289193061841f4820029e1a6f495860411147bc204a15a828b2c0a2c609408852e3248bccde2357c8010b092240a1042a1ef0840b7810a4848a971628d43fef949809eb4881c9902a7058a0640708384e6a08fa01a2678b272449695ddce47ccfe480035c588106403538820332ed2f1c20110426fc90c4113c906997377dda38f0832da438420a142664da654e9f587ea0041438c841cdeb0899f6174a2ec9871b927e8a119647dcea75d699c9233b066053ce596be7dc84f2e699d571480475555d5c572de527250eae8e948d31e78675c5b3f5b0295cc002228ef6d5112f5dc75da9b0d4c0c6186d149183f3ead56ab55af90ab4ab95afa2eb027d1859917d8096bcabeb0dce6bc90f13a09d564f9cdc0dd7c4c7466cc4b5b082eb33b8b800a3a3476cc2a6e6c3d82a45ffe9b391f0fac95d06671c6d3424da9ce643ae7a3c44b421fd7af246e2883844b35609390fab730c4eccbb06607e473d1a8d46a351fd42243af0a05f994b1271489d66c2e08ac1226038c370ee768cbad53cddc3e064f5a97df865fab07c0040c4c57c340306c37b7e7ab7189cac23dc50a69af5336cd4a76c94c89bc9c42bb1f3d72b9992a95e45ce2b5597d3632b8a9eef1b9f97de4ba637ceec46f5c96bc0d4b76a04c39b497e86d2033f3dca1c230fa510cf354f7cbcfc74522b86d9f76957e5990c847c614a61721fff106d4cbfaa1b36aa534a1ad535a89f4ef44cd9ed10f97459c3a6904f9749228ecea74b0f4821648ecca7df40e246309cc5a7f7e0130b3e1d089b567c7a1016c25d36693edda790a444282498100cfd77008088ebb19ba1fdc59733ea79e9307c58f09e5c4fba48a5846f96484d7a46041021924626b937e69c58f5fa853c84490983d2fbb5c22f9c6cd1658bf38676e001f83961f899809ff1a5a50515dcf6ea3d6878fd74208cc31036d128744a98c7af3198304f737255c6271108c70737ac1b0fadbed271b15c3c94049ef200706fb4e144936eea06e9de2557e78186a0412f7849839a09038ac40c38954ad1140e2e140e2e570c12c2c3940e9140644208e24b08154202c1e568b12c8615742569c0821b3ad599cdc4a4d4bf6bad1197a5b3ec026ebefa160320a5ec165e53e0b0dcd0299bc7874d217d390182dac3f3617552035503d503084b1296d4d71a066d544fc346098d1a066924e9a651c360a591fa29e0dc28895d0d54d00d635e3a3ae6d5de0c158335260a9bf8b361679f919294062b06c788f1a2005428812115e3450d140d561222a0c1ea536ceca3c16296dae0f4c872f3d5779482cc48bd52108ac46e419779c878e9fcc5bcfa145bc2f8f9ea2f4a2f5ec4bcf8f442cc4f8c1418503024090214186c625e314130d0c05013c6bc60507df51798ac5113b2d4a4d814c6a8a941c3a66ed2c487dcd7b09991fa1d4a36947898c1d32fd54b1e65a857b2a165864fbfd418505c1925f6e93fccc8d070195e895d86ff302343fd7e0d549f4aec5ea3a64f25fe4a35509fe1ec3368b87f48a6d390a1e1486438fd4a4cc323797703d73f8614378c917407101a19acaf3e67e87cfd92b861cc8cd41b914fe386c1eaa10a0c67e07c8d79451bd55f38e1862c3ad4c31939335c349cc687847e251b68f020c36978949131e385647e251ba6cff0191f0f32d40619df0c57bf54a7f1cde0993c9b8bbbf9b0ea6021a509cec8abd3c02616af0e844d2b28faada07aa61444868c4f25a86764566efaa5526f6565a77b85d5236fa5b5c2d3c3a0a679fbc85b61b129aee8782b3b0c56676f85c5207bfdeddad375adb854d8634131585d250848256805d5a75210ba12b43223b3e262b0faab05a885299c3433b1527d25a84f33bc3a0b8a4d2d78f515179b64e41c1a39fd52bd1bb1c0f018ce5e0c16485ed88247f2195e94a111f362b03a8d9cae9746ce5796ed622999002b273db2d9c5a6276c6a11c4bcfa14c3ea97ead6863786c56075e981335b4d131ae6d8e36ee6acf3a1d2f9c08d617d75193c358c79f950e9e8985a6c62f7a16a1d71dba313aa9d8fdd0c3e541c9bc218d757e7689a791faa56eb8884b81b0daf148486531a3e2333c32b0599e17386cfc8cc0fc974191f4c1019323eb05faaabf870c117ce09715fb88e66169c763c62380c96148baa5faa73b703080b0b1db822af51d32fd5a75723d5527654098518f818f362d3cc57777d6c3561f3b1d504cdf3501faa159bf80be5fb50ad9ec90e8b1bc37ca876188cef43d5e2f9f9d86a62f31f5b4c44f90de37ca858acc327961a7ea94c98c96ab584c1a8e2cf876a15e3922b5ea34a160f98185ea8b1462e3df0495e7c185ec85e01d6f357441bedb0298c79b500806c6e963059b189abc22692b33146af34a9e76434c9c8f3475b855e11c714e968abf6505b7d2c3fd1463b5d89745611c7a8a2e897bd220e18cf7123960eb6e8127ea86fdf384dd527ec0bb5ea67bbe87315b724be3dec642c09b53256b4d14e3dea39b9dcf29b97136db47b53dc100650cb4dc421bd270d3e8401f4ede5f8112e7bb802f4ed2c2d3695e25c015a096261c1b86909fa7619ffa1e60f0e821bd254c80677c6af517e5cfc94b8116053c93238fa7652c441bf1d87c98a38607cd3d4b31046f2c76590e5d36e29bbbba594524a97739bde0ed4d28f5d3b0fb41642506e7442b5e44523b82cdfda5f882b9d3b06683f9d52f0a9a73d56bd01fc0cf5a2eca891f07da87456ccab5a77189cdcb17b55894040eaed5b1e2d5ab7856f0a0ae5dbb5a08883bd37d537ab5fdac32d35459cf2eda36df1cdb5f4501be2dbb51ba740540a0da253d8445d7adc9cf3209b734838df3e1ba4ebbe282b475d6c7ad2523a518497af50dec8956422a523a0060142c81c72874440ea79cc98d5455f7c8a218d4281a88b4e114df48a08b66d2b9cf8f6e9dd7cf685371e0c5dd8387a0590ab8d6099eca36ff709bff10f3e2c3c28498f3c3dd87ce4e9618967af24bf17def45b85d2e3c238ce620a149ce7cf083f9542b4d1bed9183cb782df348ebd951f3c30dae2b54e7e1bc7b1a769f15b173485dbb42c1443212a25da68ef5e7a9187c608bf31c7c96e86fafcb57fa95403e721b7a1f3ede3e1e3c188209b7721e7a1734e86f328e3dd7ed9c08d21c50d29504781625471e5f36fce79f8f22f11077d420dfe2092a83e7c7b88e3dbabf0eda10180a28d195c170a64fb45038a38648c36b49b88e3c5f74bf79cc1530b3e4195a6a6aa122b80bec38af33da718c287dcbf9c68e0c35af3ed92f261b5a9aa7a5373be7db2bce97617910fe639524b84ac45029743c5711c17b25a46a5d775d4c5ba7113558f228f42d1e9d3fda8cba5f32e9b841b521e9e4a796cd824bbeb42225128e4b1137d3a601fa24a186caa62d08641f9f4864f522645559dcbcea34a6ed8e4456a436f3c8a4373543ce6b48a476ffaa5fd7a54d52f9df2c00dad4d91c9b3e3acc9cd53192a377530e87cb2a085096f380b445df9c32fd47d60784096df20c1dc0629bf50b7f64a9efb813bbd93b0896b8d3d1dd5935b0f3671383dd8447978faa5080984b1ba98879125c3d78341da36fc4245a29004e386be70f4d9b661907ed8364f31185f781f63e1cba167b7036b9b5682f3e2e3e95097061017f39071a44ce500030382ee24d2bddc74f4dd4ff485e04e2734005971ea426e605171ea453616effa8a7c156f3288619fe471f2748a9c70f9a73bfb394d19faa3ffd852f27afb617f13ea00d06bac496131a869526a92e7354dcbf953a422c52bde611e76a2849f301366710ffbb08b5f99929b1ddddd9ea4e15374e2a3b94ca29aafb95cdd684bb49514496852e4685363f2dace6bcec9e61c3685acc56bed83d7ba781d641733ccef2fc2707764307c6816ba683bb36ccb98cbba2242ce1eb3304573e99ca3b56bce377c0ab9c6360c6a1e6124b945d4b84ce8e31a7ed1bc5d6a5e6918d43814839a8ba05c7985888373cd251756ab827c4163b945b4a1714e28695e73ced1a86bd635e71633d161d3e63baf69be71be79d775675947fb883050880a226b2db5de7908a3a1ce5ab7224ba26e29a594d26c87659d5a4aadc88a2c75eb226ae5cd887a0b0d391585bce89a87b9ec324cd3442291cf105ff495ae131139e622c7fc3af7d6c8f5445dc7696e35d7d19b967998c42ce6539fd8a647170be302527ac3a67b360d406e10127343061d4b602e1273b29c3736cac9cec537cd036727929436fd284c68763b326abfc92f527a497a7be88b3335ffcd24790cd3b9218cf422dcbbb0cb7367dbabf30c0b79c872a19138e531ef3a0f7577b2f3665e668e65aea3376f162112817c12d96e8785a1c2650f61e2f569b911a965a562c526a3c87919848fad1e9f9e2d765b1021ddddb2874480c11683928741f6f6994b563b2a9c1b46829249640d831c812146726090e593db837b84c12ecd5a9afd754f492995f449949ee682ec10c22e8bd8acf5195d5cea0da04e04fbec906e23fcf46b1c308a51a61fb795a8777b691eb9475c8a439f7af00bbb7dd1220cb24f9bc5ed115a87e913f74d7ee9eddb213f1ca2307b3a8655ee471f9d015365c94e9c5c8d515c5b0c2b8676121877d0efefc8e4527ba9bf1ff48f3028a5f30da2b8fcd0c88745481ff21aa2cc8aef207295d0578a2ff2441ab85e3d3bad78342b0e84cbac7c46dceba17bed0d7d1c83b7643df3c86046049c8fad214079988fad2130f98d39eb95aecbd2fd5c900143af6b419148e52bd9230c669e89bcf81f45e0d7eb21177911eead831dbad76fe6f6233158fd7ab2a7b5c40575725a5f5deac81d9b79cdbeb06556cfb8bf3ef9c4f110ae77b7e36eaf11a9c55dd824f2ea222ffae659979dc6dcedb09be8deeb33c4bf5f49c5895cb7aee25c68e44337e4226fe643db10e40bdbccacf4c988b055a7beddd1a54103ec9857cb9c6976db9c3ae745666797de0cb1db61b7deec66928e791152497e13f3a8f458bd05a401bcd183c67cd45d8089410795ee22e5c914a2bccac7d6145c3f838b5b8db01df261a94af9956af4d1c9b229720c52f758af942b3f7a09f312e6348c413f3f7aadcc953dc6afc447e844b59e98d272028bdf44d3ab08e886249106b2c69c02f2afcecddc3ae740d8a4797b10215c29fb7ed0cf3cfb465ac5b45aa565b0ba0cd48b903e73ee76645f096390d208743b1201ec1a83750da261f870c3d14f4a676a83e1c36d67bf1cdaa0caa8b42d5665392d15cd0c000048000314002028100c88c442c170381ceac2e41e14000b8fa24876521949a3208861882963082100180020000220202223d900c623d18bd438286bb7800451b09ffe1457277da1aea0af312e5ffa10be0f477ddcb8ac61534a6516264d7cb132b1f51b44366e1e4652caee1341bc1dc08279b7cd33a22008adfd028be02463756f260aa7a1c9efd2244f8e75c9dc0e207403bc9139439d6545d800e07a1e8081c099851635b8862ef550d8c68ebc28fe99710c9ae5e6f0c1bad8d3d82d35e8472deb33f6ed45543c2c95c1ab6b48faf521dbe7ebc4d41fb3d31e3ab8610ced78ced135fc98a31fbad36d45ddb7d6f2fb22d22996680a8a5416d53e7ef36949be6cc22294ce693109750fa818157b63ee7d40ec7385fff5020bac54ddda6eb62e5805da801659affdf59762bc20f32c86a917022c14300fb549c8b1c1f6b00b96b97bb742a0343fe9b2d37e6c4ca095339a3d2a0bbb85d70bb3cc2b042e7e4658e022c8cfe9dad0e8a50ea82c4f2013e85c4c629d1d798705cdac737e4fe84600528593cc7872833c94c9e498e6c37cff0d1c1c51da44d464678888e3b3bee049ecd5a00b460e67487d094ca6ef7cef01d65b248ee8f409e063ea75caa451ea202998e258b85b0e4f292ec3dd191a52e95f33242bf998e200843dfedf63d9fb0ce125cf7125b4ce1ebb294c49cb2daeef21fc00e3114186c8ccbe4039eb23355512c908351410948a61c572c91cef6c6e53ac5d3b083227209c8600c283838aceaa8bacb307ff466ef376838b69971574258d3fc4c11374e8aac62d235d13f84e50c26962bcf15820ca56b7d693c22b6ed06cfd80c2c3c6a60d3f740b769e2befa9efded24060c4db5c2adcd927d15371bc162b36ec406939d0864cdfadca9980e1694a87576320591575d3a2398c9c598b58ec0bb0546c86457cdc360eaa74175688c7dad458e4cf513ab0c13730d442a19943156bf637db9847c45acc94af7c3c96319d165b9c636edce4324beaed70bf796a8173d2b55f3b66f4e90c08c7b47558b6159b920ffc307c4efd5e9998969b81a7cbe75c689b4154e3e90cf0aad9b65bdf5213d531dc57af60acdb15217598ae7999e10008023d34dc52708b00f30582471fb44be428e4b3faa80af51a96d515256838fc9f0f871c7fa10af1140a9176467214877b8ced8b6716911cf4258e090caaed442fec0189dfb4608d547638f5f289f2008c156b6c45ff9a361affe699efa2c8de5a013f9622cf6da4a66ddf3d1dfe630b4dc03e112309dc54f794fa85a8b4b28039aec8dbb67c50fedd74dbb83e1e766d99cc83c4c45384a4ed6e31db680d7db5d92849760258a43047f4c97f51f08fd4407add42c5ae0bf8e1e77107dda3b6e9bcc41691d701f1757054f5f5b51d2fe3eb38388feb567fb6a5d6245a28dd33adabf43e215c47358ac7fa4c06e23962d0c70c312d750b5b8f83b6c0d91b560c00be0c667daba1210bdbc8a8c580c947bed25445a116de1fc9325f29b46f8a6a802180ff0678c8ed6dd290e4ac6aa27d95a4f24a104a8057336ab298910167e8a6dd17b59932a6df505508a01af4380b0cd0cc0b058c9456b2d88f3eb527248e3eb5e03dfe3649089019797bdd23c27b64dff8947479615c83518a5450240e28786041b77bc153f48dbb7ac74081751805d91c2ca38fdc3581877eb5622dbf838eb3012c80628921c3e45b020291895a3e66544539d07dfbf5958bbf37a76c1ab95c865ccabe08c7d0b295ea149542263c466b7b5264c53871959f7a5f564059ae5176efae262a2383cd6b6ae7d5f46882d72e02d0be0e612186b8b6f2d870511a2ae60844080326153a84a4f0251020a2835f68eb359afb4005afd408dd99780966ff9725b7624f22c3f04550a65ce487ea7357cab112dc614752664cbcb6672303398343d5ce87bc15d69f9ee458192e3403e467fa97b1d91fd2505edfcfb8016f8d7418bd3a02e189aa7ec8ae9ceb51b042f8a3782aafa8ca18166b43ae00dfdbc97fd20f0b9a960e844c2039189d4e75217458c4327e099b6bbeea796ff7f91b988804c968e2cb0383610d9710f0338209bf1212ddb64bbacc3f38774b3c8c5e30c51c254402a25b0d8d369ec41733187992e46e70780b5df90f1e262e034859f5a31734ed274b32cd42a719b2cd694047c50313343e575f938ac83de221c1833953415ad1fc95d38c95a2d11b1ca9c89a8b1bd2f2bade6869c5646d5f762d64a9f3aa27bfb22c1abca163731313c89a05bc1869f4e72008c31f60a84ef6baea3744c79f959ce729758eeb29922ad5616b8a0fcf43d939a637bdceb94fff4395b139837e82d47323dfca4c9ad7eb0c724854359aa058c486ca0e0f47225106498a8b547148baba0abf473ad2186ba90688f61c280f49bff8e0280f2b35f5141fd8538cbeafb1d7f8ea032d6fcfeee01ac1f3f735fba0fc1eeca6d36c831fc05f3d3c2ef6441f62c1d39c1b95232213fac6dfcac49c65d1bf1db2278f7dfefac4f81a0c9fe7cae145ac225463d3d726bb3b2b32b2ef71c21cb2fe0964056ab1089378ac129e91859ea0367b577a4cf6f3ad6e8ea77c168b0d641dc3dcbbcb8681e734ab13f28dbe2afdee33f337a27774ad2f3d6046f694ae7a17e0a09226f95087e687326c5011aa8bb3285113cf83f9dedb57771fdf0c2599e666dfc5b682876b99c28358fe4cb84e7fd521a84930bd3b425c029a0d902c2dedf89719fca6feb9d7cef3257bcfe7a3c45f6d58ea32332d0e15d2ce92d4627784f0a675e0dc5bd2afd003ee6bd946c1426fc778b06c23766303e719472cbdb74443c574e07d71e57bd4518625452597a65cf500845416bb6e38369bdc1b244c6c6fb1f94f177f0c39ea52a6992fe59e6850953b95d35d187ec75dc12cd2f092ae27ffdab374ccfc3db7624077b16e228915122b56591eb1ecc39f74c063c3aa7c9589653bea80bdd6e7583fb50c1a9ba898fe5ebf7c3b63f97e306581eecd895ec5be2071e8d15aa0a8fd5ca8b5ea76eae5a5d7fd3bc633c8362d26cf46a2a54b251effb26d0b4e44e4201bd4c50487a178a3325019391a259d51504e199ac9a4509160dd69241d41249845135e35731e3704bfab60cb7133fd0d176303881d65976b152f7edb7eb7470718641cc2e13acfc2c7173feff2d9fc1e7193618d168f9bb6318d421605d032a2f87e435ad0422e3f29c639331defc61481976b646b0b3ab00d3107203ffe669b666e40e7893e11e8b52c849e0935504b11efeed9a49a8ee73962fe450b1e02f6c02347815a481299213b4c7af813003c1a0cd694a218f35a3d1b89597c66e6f4d970475dd1c204413d2312d2f2aeb2db8554ebac1f6bf2d7833948cf62e0512a007804bb98dd78a18f38d51ced89e1f6290b00540df8386024e3c2c1f665eb7d2d4bf846d792edb34ee9b2e10843ce838bf3728f23033ec4598033bc3f8c0a8b59b5e0b6d41b6931ec91b9f7cf0f341253a1c8d87b459df09747a931194dd372e6132011a82ec2d422e80f21b51de0d01fdc20db5193ae19aaabf82e84b5906ed052238d192d20a427ec3526c9b26608e549e7c7a34b535716003acd184184b0eef6aae60b21951dd6734b626d771ed9434fb6238819165556f8480333b6788ef63af3085c4b96a34b6476ab9620a6522f03d99bca7af420d59283df7235dc0641951c11f90c8b1e09f87328bbc92e25bf8c6c6f94cad21b136aae60248e46350ba1d4e4854f996e88f6647706fbf869e9228dbd6bc4d7985b9b765459997dd2bc7bdc9582a0200ab6b25d4a85fced924dda9f3b282bfc8db14d3d26d39110f8b86759691a427b4e536e0f589c2c1804c0772d4e0907a8106044928280e98c4866f78f8efa1b28a050220d11c937af10675d589f4e00a384663824215dcb9d09e80a0901c544f3134f10c900106cdadd78cac8fc7e3875d1396e22e9a122fb5a857dbc480221284239de7d17b36319af6f52133c3278e8300e61038f3450c013d0afec567803e2eefe5b2d90c93ba4a14f47eba675d154c47dadc3f813afa8ec84645331321e39426ac3a5e3e863e179d2bb78a4f15a6fd86eb6b6746faa9ca471ef061cee83203603d61bb3fc6deb1a9e742ff40efb917ce4807639addec55b4ad9f21ba4a018947f52adb111cd63909097b19a478885d314f61f181fb41d21315842b04b54ef7130c24afd48d2785f1931a5a41a14315584a524994945de5013ed3110a3fb5e091f030266c435cb54389e7ffe2d788ee51504a0cd2acfc47a174054d02db4f6281f8a76500799c267f7cba214ba9bb7e8f2a5aa7beef937e4af624db32b7c7c8766da6473273cbc0805a8881751888a81bc3a958fd0862cf03daa9537f0c8b34a99cdf88c46472c3ef01d26db7da2db458c4abe42800b7d607a2f6ce26d914a6ec1722888920113930bc3972a2bfc1e3e4ad7ade91a59f49751eec79068b54b80b3393071e00bd45115e19ae544d3961e1f3ff93a7260b1301beaa2eb3a0d2d15be424c45478b04556ad714eb06496f5f337acd152aa58138d57ea559d8ae64b99548e566d1884da36339119e9b66aaf71e0751bb9599a33fd4139210d6c27d5602cda2371f67467e94a31e78d2e385420a30147f51a6bb779c3a0d7a7e466aa0e6b1dc53ae0d888a61c3cfda5dd8b7e24f1f1511c409332a46d0c0d528167a122412bfe57d25af9a0db96691ce6cdfbe0d3d681d012d7f56d21d2b8010b5e07d8ae05b79f163510c831bc04e7566e37bcbee7450f3fe42bdcaebd45fbded28d3effd00009884247fc06e0bb2e72a4a4bdd1a43abe7d67b038f6edf381463f967041c9e786ecb7d84fb936d023b10a4efcc172446afc555dc87df6d048c7ef5075448301a7f082ed129eb5c7607d7275971a46ea5e682957598dac1ed33c37c2e9115aec0a588c0019818a14b1183a6018126459257d2bf9834451d92c75c972d1afb857b3b25b42349941ee665b6856aba7e5254251e05201e5f7b17ea3fbd6a8fb6c2fd648d9f5f2fb42a7e3611ce4f6de0bf081fa2768ed7eab82806ad17c59ad91ea72958cf84f212ddb480f7d7a850409f13a9bc7d362ef5ee5f5c3f8ae3c9198859b0671378ba0061e9a4d0e5c8058d7ce5c7c8392ec173da72eb14393bc7100f871141a7cd85861bf11c71ebf260a9e7b229a15c2a1ed6b67f0c99f9f3d4c0610439862dca8dd7388a805b6afca1009a11ae1957677ae86532c86ead4dc4e6d73a1d697f57f892cbd48fcd9d1ec00da41872e1e79ab62a7febaa01314d96095ae06c3de3939a7771e3c0d3d35a6e15b82724ad4581c73bdacf74d3067d5e74f9d13eab77b8288d3dcd823933f4c291b74a365c97bae0e71f5c242cb5077683056398a13a395f7f1355885082979629e0b60b1e3402a02d145c00447893eb50ea27f88368d60e3b085e42a912dca5eca884ec53a4759befaf6343bbbca52ef14205a3318493ca39dc4497a4b1f49af371baddbb8eece908814033d756a1ce4eb4b93dd389462fcfcbdacf5d55eb0c054ea02a2465c98684ba687de71bd28922de66d6f9aeb8708652d4a9ef5ba2a484ab6357ac0fc935fbd7d08809d42366e7e2ef92611e43ded2d131eaba3448873f3c356af1192f0e057f736b3ae67e7ad0d69f7c1f0d94b6af6949a2cc9284d22be478ebc4b8c3c33a436406b579cfd5a8e41238ea228ac20f5c542a781a6254bfe8ce992c5c6179b4a0be039a9325dd86cbcbca140831d128a042e3c103e39b04aafd4b10db073d199d5f3d7af51bf505b26a6c01c8a5e624a7e7240b6704de10b4c6fe36a8ca7b85fb90dec7919740611d6ccb3faa3ae08f1704c85ec007f57987eeeb9af87fc6b5146eae44076b19e0ae0b69120cce81fdd301c5536b2a69fc367c4a84d0ca6a05bb25c79fee0cf7201507d55d6a5492f82b9428987b2a1075b3d3a09b71e6863ce94a16d4d95ea211562872162d05aca4f278b53cbf06531cf7ffc0f1594a6fc402431b258734bbf292a5fbd8556f6d52c9411b4b892e49346d52660959d944209f965bec6e178401e4b0e7b681f10f9bff6b8f9c70d85e658fecb2627342314e79df88ac38a349ff2ec6181c967e7baa4dea5ba0818494ca18f7194e2e1247bf96645384ad09115676c491e0421d2d2ecbe06ba6650a3d0de2e6b1b153e569b3ecdb06a283670e730b65337f8850e1d7708e02fe51c8818122a0d6ecbbc51c30908d636b7350a4435a269344e97761e9c04934b2cd713fb5ad2f9d4bf36a35de6a289a915e212e7a2b69869c6b90ce6a6ed5add2c1909c682774286287bc951f1563dc16dd7e1b707335a1e18430b6866a83e124da46ce4c23c82e8f9c30eb420cd3d4a793a3a3d8be08a224f4ea36b5c482c57c62bf45a6095886c72f0c871738606b38264a55ebc845af1045629bd510185e13978b3c49fa29ac096be260f66e1c524946e93cde8d28ec9f4ce8498d11acdc0784cc01b8e12ecd7c81564ed70da401f9481a59de0d0fb441ab534dfef266aa37479c1fcf3613a3d38f36f212a956e59fc3c39ef0b3e57d5e00ae62b3f88b35bf70d9cf0dc76dd31588473bf0a260199859f3e0113cfe44851653633c141cb2c435210bb6a2f86707176883b95d4765471d6cb12ce1c6057560451b2bf8665333640ab3f04c90aa7b10e8bb11eb640555a2ba2e1e15060b264c3f54aa9d53049b32661a7db50bf98ae8b88179842b041e17219a1652b5cad15e81db626aa9dc20394ec49f5e0ab53fce005f87dc147c166cb4d7242bd61e6aa3e4a2c94bc179cd4c9d53feb37eb6d18f43cdc3d4a15e32e22fa918b63392795288504d76759df6e73c508ae2107d425d29155a91f332a148150b32d7a32292a72926897595174d49987612615bf2cb5ef12cd36c1d4b5c126b419b224eceece1012d2a926261c532dbcb1dd241c7c20a8c183adcac81686019d981474bad63bace8b9ef4dd9da7eaed74ad21c1c32b90c067119bf18c08b28a1b5498ab2b31f365456aacfe315bc4ea0600900b89eef2e69b515293ce9ce8faa7d4fd1f0c00bdf85145be595a63f9055b004cebd65ddeee265f76d1b285acacd959bd0df88cdae5407db756a594872c96094953549b96b243937207ad45b91a4fcc038679e1d28582410041e6cff5401a0edd6e64065196e5e461206777530abe9905f100eb183e5c254d06a5d24d4462fc3ff2af2dba7939d03830e9425adf3becfbf28c0f1806a9061319c0aa918fd89a9f286810fa6b6ea6aea188de3b21c4a7b51d1f416c48b630b99431829a807feea380d7c682f1bd86852b55cb3f8250edb3c9ede8810a70590c03db824fe744b63fab841d7a482d2c6507162113a6156168303eb40d3e640da8d874350ce6e63c173acc27b896cc3deeed5300e7bcea43b6c3515b6574e918a5c874cf5193693eb868654332744eefd4eed6f32b10a4f8c2c14c92068e4d49a60efa0a7653d8f3ee05cfd04547d1cdf97af5b4fa9a185d6e0caa8e2e7a45372e5f2f9e564f13abcb8d41d5d745a7c89b8425397a0043feb1168d740f6ded3dbaf74f9e4b41362db3fcbcc6aa465c6e96acf3ef6ae123cd356d21021277d25b88eb71d711f36c0e6be20435237c415b34c51ad2c5cb90c6b0cb465bcd9c2a78973706c24b5765c4d8e1c5de1e9b3641ba4a4b8bcc668fa1975176c1d09a0a3ad0aae2ce828e6c5a0fc88d010accf9c0c3716c97ff780142550179dd7418341da1483cdf878a70d0b0ecd95f32f2e4e5491eb45fa1f10e0b284aedc671c934b36e3ac5372d7f2f9e5e4f17afdb8d41d7d34daff846e4efd5d3ebebe275e7061316513fcfa48b5e516fcaf82df47c55b274df38b0c9d2c6b3b959f1b4fa34b1ba7483c9b8d66fcde27dfb3b94955f850c2009ee63c0ef40f1ef6033ba67423aebd84244d5fbf605c990fe8aad39a75a517edfbebd2cfa1bb4c6041228ba8d447d350608784f38a23bdb8ff17dfb885e4bb13bc6d1ccdfb73fc1041edb76b2485b4d5c720674557b6e176d7b679be0441afc18ed1fa4ced73c81287dcc34e326fb2bfd22b97f3b324e63b0f88976f3e04adeb71f797e11e03d2075ffd6fd4bfb9e3bdb142767d7e54e9a6ce018f7495a1825407f16336619880bd1b88443dcf6defe3b589025fac4814d9636964d0ad40c216e60a259adf87b5d32375d390c0a4b0fa0ba77c05e8c2487cb84035c15f47165213ea0633530a86927a18ac12f186fda3b73480324411006d81c8055dfd579555c9fdc3b6f1a93c2540a0f32f40df83cfbaeb16841ca02e8900270dd6137d8048f5e66ee629b048213c5c5a670e8329e7e8003c50a8f43f0438309e19d1224cf6e3ed8ff239c460480e20611cc146025b0e14292a183be026f0abf8bf79a5e4b87878ee8cf6be8084c3e7b4f5dd56dda184996f819cb788faeeb177313f4b474a1070de097d9e883e6bcb0cada311b6f244172aab7fe014a385eb5cfe670952c54e43e350cce9b1dbca2e80e37c67f0545ec40a539c1e7d79e4535ae78be1cf85980a09f901447c3d6e50659b32d5eede00612706b30635f2e90fc340d611936c6cf99b07dee06c02c3398c1d1452d8d5778f65921a5a657f6695aa0a5bb5de9ce2f3c91425c4af05a24860a98a28fed0ae9c7b249e0b1107bd61b69dc0cd1b6703a256eb5b427e9227111825f5a59953088f6dfa7dff4cd32b9b1479eea70ed45e02ac3e7cf0a3304c37dcb9374f0fbeb32cc8fe7d066df50369c4de8c67d8e72dff0431d27e9db59ea1c6b050ecb30233d85dce855ace95f033774857c306d74993c28cc638afcf6830592434cf7752f2cbf44f041d49eff06e7c51f18063a0486f3921e3156cb65f349960130bdee3b3ec3878d3e3644b7bb454717f5b96817eb2a5b9daa2a4d7a80d45404bd1f9138ac15e76d04efd47f0ee5dc5964ebe9ac3e8ba86ad10d817afb0ce962f99803d710f31ec4e6a7bc3adab0604fe1c19433abdafbf27a2f628cf27fef56fe50307da0f4942b39bc8c2b3a0eb6a55d3c40cefb0ecd3ea49083ccb43a133121d36e499873502c17407582f0be91e51cdada72d33d420fae47a9dee3c79996b957e22a4e361b2d34cfbcc3524434cd8d9bb60c65b3be1abaced5613856f6be070128b33a7cfebe0f9d28a0d737796cfbccacaa46d98c061c6a8dcbbc05b52469bd57135f69783de605a0c7c841168b03a1523b835757e26d4d7055dd38080a6d0201d38a1d41b0b665d6eb50eb0e1d63fbdd3d9bc04cb1fe8331c990032536bd94658fead6f9c734e219d0f3880c41e12107eaf4d44c1f042a8bea2a81478077653e3efec504bc2b640a22e3ed2a0096471007c7f7f2a2e89751a3d674b06e0c876b152264cd89daaf6803d88544ad4981b2304cd3038d44ed495cc519dbc6eb1aee77bf403b94f272708fb07b0488992f2c7491ed57b06f4682b4db84c544ed0fe5926a25dcf647048c7e5bdddfac3753a1891520be4b43595c8e8aae694fa0022225f60db798f57f9e78e7d67066b8f227aa3c06443fc46253a8bd92bfb58153700c48a39a4ca0ba9684f99842d184f14eabb4e5385afc3d7096034d57c5dd8c01695f92a9a36399177f667087f06785540c487bf3256f73e7369e4216064d83f27add3ba5cfe7943acfdc68a1278690ad3d3fb037b0906023bc695f3f6de3b759d3ce3091a1d1960c8916515d82a0df190b7e4876b3b4e3c7eebc4451ac5a3562efefe18cbabbed112b308713d19e29975716bebdcb7c4b9eda99e39eb6afb22a78182832e1f8f393b3f38a198fb6a7fdaaab794e6c0bcf497ab78d1454c198e03a1259730e024bbcb030164059c92c94d9b4ca517daa81badda6f1e45952adb802eac6a24f46a20f60bab4b7db7f197e9c5fb34b5918cfbad5f09c0885fa2c5554f9409dd86ef12f427565c0c62db110046a37812282305fbc442f57ab0e4d1077a6a3eac75618c6602d98d889d434ab210fefc3fe4f301b94154a65552223e989571f371734864a90a6832d99c0edd82bdacfee67ca3e66f9e5a8359c02f85e96d3098d56019470aadcae8cbd82e90a6d3d849d686e180a3349597142fc5d47201d9fc2e96fb2c7f8858bce5c7593ee1319808f7a9514ec9939fdc561811fbf3103649353f2d629d3d1ad834e5c1a8c1fb28da7a38567a5154d761534feb33d374af3d224113ce7452abdffd20a5ec380b873e2952ea546204a505fa8fdb238382efbc1c1b182e73319243349d89154f11f7f613a65f88b9377457c662cf8a9fda3914151c6904219f5de68ece9525bdecb50c9313ff1c9bbf5317b18bba8eb69726708b1038fea143a44b38ecd09130acc67941e4f214eb9c146654d67e62f80800127c127d88658b0a92d35899c83f4855a19b3b113eae0dd7753a975a244b2a3bdec023f7069154008fb7b00e481d3b5374f7bfd0a30f382a7c3c6f3af4ba58765f3a00f926dfdf54ef59c3089d6d5f5a2010d27ec86f65efc634bebc1a3e9f655ec9e05d7dbf462307648f08c194e6a1a8d78f7afca374fd11101c6d4b3c2a1bd844e0588872ae8beb9707709b6aef82864f42c1772118da2c82cb3d69f0690c4a257b29119fbb6b5712e9d8a0d77991191a25d2d230e896ece0caae50afc118206f3a35c5152d9b022abedb2faac869592e0c32766f512c5f2efd1b7bc89169dde99192796f9a7c24c4c011dc93f942c4fca19d2a801a75b03b3b9d096b7cb80a0538b32f931499f9169e4450f51c56a0d7f657c1b7a27546f7be77a17bc6b7ed6a68d4f3ed10fefcb61f9851736eda4bb98c53fb313f8c9988898397f947ba389ff7b9c95335e10b3c8c5fc89269d7a58caca77a978f9b5b24101b3343a3f18c640372c1102d1eb10ab50b342ced9ed332e64f1367fefdfc15e0ad5dbc48f693d822d6fa4ea596273d7da734b25b1032aa48be5830206b61c4e825f55ab204558dbc6838124ba248c3d3da326d1f65cb34f0426bb67535b631340e6ba0e104d9723727583a6c8b93bcd0c8c534bbff837e99b140c94ad63c72dbf4a53b322a06cb484be2a4c013f6822ba32ec9776671134191019e70575de8add90511a9c5aa6c31d10e2996e163c219550bdc1cc7b6195a23318fd4f3be92766a7f213224a10de2d56fb9ea02d7c40360cb6e5804a8018835868cc58658511d093e6fc38c634314ad7ed4d9a8e162daa495120117db49040216ea4ca0a7cdc79842d40f0065239fcbd277f32b7b9d888727033b4aff790a86806637bd787849e1174ebb75aa203a27de40ea3ec4ed0dff7cf1af9b1838ba31d133938ddaac1321d13f5cbca017425a9d05b03c0e12b6ebe8429370843f0a9dfa6d1a120268af8c58e4ffbfba7dc936daead485c40fe9fc16555a50978d61f181f75071560c7f8fc854d4410f1b987818309760d2ff9f51e537509ae142744cbcf14fa2ed475bdd165d6e266879dbc34686818894e02eb271402b4626a362fbc750f540ac94a14a0811e19551fbe03bc95864f067ca74d1c0b909b153efae3daa7906c65085f3490b0e4cd0fb17756e60fee587f472adc543f6c988bdeb567bbf04df16a2a9dcee07aebcc0974301edec8e9ad709becdd0d6680ce700daa3fd50376e2e95c16c4f2b301bc44fc0fca221b07d8ab8a5f1100a098321f4e1bd05d8ffcb67e6d044cdc2d00fe7e07309321e8836af97c28692825599820fbd2fa9a52365fc6d80cff7828685432c2690ebf5e089e7565399c4dc7158bf6e6241d39b8cf880c3734e224892358914d522e6284331863169df29465a7a2748b5b793de38f65784de904e1c0853a2a184910fc2f4efcdf3746c66116cb6ea473966bb2c95e0a32a64dc42d02b4fda37fc731d7477dc9a0632f8b445a173b042187556682a8dbee0917d2c6beab57a390a2e185aa489cefb82e2718608d46f86ceb2abf20f874d4cfe6183065841c447a7734a1920bf6f5a22f20ba03aa839183c6738989760193d2122a14978096c6a5f80b51e52bdd2745d8c399325da0876096d9401d05186a9b80e1a3b4bc4449b877d6d27b222256e953510b50ea611e65a1f2a620f8739581e9bbcdf79949d1d31fd360f1e3cd38489e13b1b07a25db889e1e256df2ebccf586862478d9f575834e095e9c0f37b8af8f8f0ff48542c4219f3296309910061f9c0a4c0d0be9924337af2c8983daa55d971511b294e1f225103dce15f59017169e822e41dccf41432ac3e6f0af5c94deaf16339c0f6b04c031c21f64a121cc204e55a01ac144a0134324d122cc083c21426970bb0857b547b214f523b8a9506ba854e6553c3912dd0ff126a09233d0bfa2f581f1d7d06e2677ac7b260d46fee7b26183af40609256e0b5bcf45971213040137f5c6a2fa7447f17695d8f1c38d85eb4f3b05c94de823a1dc79ab82a183e3133b04ba268d8821d22ec76abe72d3fe7bd0725c2e051cfa85268c6c4a2c3cb65f23b50dc88d5cb49e9d47c57af15991d0497ff9ef00759b766007cf2c47346a64bc5cbbeaa33c22b9a74a6164fa668fd241ffadb4a078c78be7c4beed1bd8229732864e3d4f642aa0bd98cd8f09505b7226aa84b979230b90167661cbda2aaf55dbf5c96617caa18cbd34e2d0cd24e23eba1e09690173723b979f76f2d5b092bec0a8924fcc2fe2e868901b0962fc0b3e3ce8a73224d4ee0a60e61e8f813cd4f64f426bc90155f3a95d09cd81c5808ed06f123837742785ce6f6200895208453518356d38f14c4ac404641633d0339c085afbc3554185be895cfc86ec3536a31d021959f6c45b027d002ad9348abe27c622de6e2fd750c5db9a809186e94b04384acd7086221757869497f36039c7337f2dd7e480490b800b01ff8ff6532bbca9057d4fc5aa80c31ad9944d45189553295cc15ed977847d0201192c2b313d54b47d7ca3770e38ef46b2e93fcc61d85d1d5da656f74256b64c9b974c544678b952e216f45211db31d8744ae44a410cbe5033ffe8f58168260f3b7f440800d6dc89195c3bdad41005cd6bf7a9ceb0af41cb48b3c4a3adbfa91279244817c83b17597c2201bd6c3d44159258f2626cc82ef0fa4b0ba517a88e70f6784be12c41ceed67ca0fbe7d5be89403680e484f07ec495d99086310c09aab826f7aaa6e8b4ac8cd97de6ddf873eba326479e0181cc8f653c147f6ce3fdaf1213460bcb0fc5af3c80775330ddb192b09d0616f85688b7f9918e2329ffa2f17fe6c819f050a9aa194a0c1ff1851c06570bc7ff3d8caff3ed8802c521bda3a60b968a18a68e2b0524f614e278805711bda9a251054e797fd313d748c17e90f72ed26ea1d076c0010cd957e7bb181e6908a6a6415e6eabe59b12402756312801a8d9e2276cce3a081c782afa1f1e80a2e5ca6a9638748f1f61ca3fca92dd0fa1539469afcaf586673b62a2251bc4e804adc720e945676af95184f646c33401c3ce16814b208ff46eb406e50501805724af97619be1ec2e10a7794d363a5f31c443684a29f16e954778d92c18e5548c8ab8db678cbe9b525f0f9039b90ccb1e3347e730ae117faf3314cce029dcd0658dc9aaecaa2a49e7e176126561a1d9b6ce871e5ac5dabef8da6b8ecdc38cb4bc7351310adbf65c730c46b580a83239df1056dba8bc1bd3b9e35ecd65c4a02dbb240011019fd0e8be81f4c7e942b88117de3c6a5489a5a2c99417b2e3741d9e972db19bda404a361616c9be7fbf9f9df08feab18a2df679bba7818c6614cd059051ec509cd5cd501ce44ca669f3a42c82b7ddb93a1c79c4120e44521da9429565f694f771152d768bde7678e5ae94db15f7b3e8e95ea21a23f3562c892da1daaea1ed233a1254199a69d783e539c054eaeff3a9bfceca020bea949ec6c3aae276664a868967eccabea0f06488e85faba31af06fefb064decf4bd56120f2cf4b55cacd1226bcc52f16d3b857bec244cd259da4b503b7b56a0566f89a80121404880d7c72f858717f53aad6c18fc3df6ff9316b3c680478927114725b8a7d300ca992034b3fe5b813c01ae548b3fddbc0920464e97389632d4a7fba2f26aa38824c8a2d441385a593698f510e4de5d097bd50de1742262063f9c4151ba2e6c557775b71112ed09a968beffd01ba2fd425fa62fe1c0acbb7bca1f178c7f38838a089eb12e1d5147efa186db855ddea8656149c8bf43432358c785e9518c089f2d1eeb9d7454870a34b6cb0c0ad549c695c734c16be87fc958a7ed548f5ac04c80191474ba1fe22d1ee9c3d64fcdd1104e33119ff687729441e1fcd7ea132f9f04eef07f211e528e8449f104b00324fc1ef06be85c5bb8ea61265ce6994abb30a8970ca776d7225d3725b63f1f435ecfa76fa11f8cb5c9d8207a862350c2a057eadf471c39a1ecf9fc35cd7c2a0dde35ad830031da0ae808bf3716efe29fea86b424ff8a2448034acbc60ca89d2f5f80c93cbdb92540fb2a6e2573279f58de14997d75161f4b3e11e1cbdcc1fda280c77684f81a368f5b13b5e35b1d8849941324fb29a4138d40cc4ec53c99076b67ab34d90a8b9f3b7d21da1c169937c5b43b6933314692fbffde005eec00b18d24dcba65379433c4739b15447e659d3f2e85dbd332d2d552bda4f1a3a6c9c94eab8536d3c190a6b42315213da085df9cc5b4531f2869533b52c5057ba09803c7a5b0a869f7568cb4b5153edba0c8cbceafdb4530a50134a76afd103f56ad3c7ece46325a6c563cb711f674b38b6aff9feb2e3e8104c40fe7b05e3b99007853a65e18bdcd4633299efe91f6030ba3df6f246019d7a3b3933e1e614fdbb40a41642fe5d2169cac26d2cd5cac207e92cb352c0072686f0d050fbd6f3d4738f529b7d94ac3a61e3a65176b245e1b907d06f5113bc52475af675ca50806ab3b21f92d382aa8b82572e9528ff2d7e1a7f231500fdbe1c1e03b11748b9de76a939a21c509f0572825cf6fabb2bd0464f743e4a62419df79be40e90a43f29818a5ebea588323b2a5b9906502f592456e6b256841d82b00a1f7414c6bfcc07b4839dc5aa3fc3b8ce8128eb4f42064bb2c3768cc4e1a304095c8ca84dbe99e6a99475f7f5caf49726e5720c7bbf0f7f3377c73a03cb7f330705a08cd59f08fc46016afee71c67b460df4ae5aef44305ab7ef581e1edfde8b57928aa40f13865a32e50056c71a0474f84b408a50043f07b97202251bb8914414eea06e440780b5c30edc4db31561f38f38f0aae0941a9e849d5bc8b1d583434f4faa4843ba536d031390be6e0e5bf09b0cf599172f73409e6c3591b7df5e3240e760894ad186b6ac3f81deb2ac309e110e5b7f027ee56442ebe76cff7b081cc8921ba7f4aaf38bcba9a56d23b4bc0302b8d3a15a95129a5bed3dba2c784a255f7dba59b3e63bb4dac7b1d46a92582aeaa24999206503b651c0aff07041b263fe694064117590e3662d92fef10bf41b78e2dc7fb7836379c2030042bf93f8d0c3690000a34c17228faa90e82fd218afab17f377dbfa2e0e147818f3ced621d42acab265d945db043aebfc09824d499a6a511f42ee3007a0a396143c71aabdfca6abc9317ee13c73bead65be28a9666b10f9e93d6e0c58162daea354ee853e99fc4d085e317b88230820f26544d678c98703b439f868c274de3cbdaa95acc087fda6de486bac44a886e11fd6eca4a3f083f41e2df6a289b59c137f6d9e0951e40502e5b3afab569556c0921bb15772218c9401dc0d33da9cd0280a03e8249d160d02b0dc8aa27923b4f641900a3f6df7bade2c64b327e89eecd8ee4511d75937f9298078a07ddd1f17ce18a43c7dc8c7ed1528e7ad647d698db52a7b83660e156137af4114575fdd8512e1aabc71cf6d3fa0e1fd7a1e5425ca55ce429ce2e14299546ec8f23ad59ec7091b7b3931c61cd37419cb92061209f4c657b884217652aea0662f0bad055c1e037bdca1b7fdbe80c2641f5bd72fd8b0d67b11e6ffb879b94e3243949a82c63dfaa67f88f24ff827c43cbc43ff9cd12f8e9891d63242c233e13dcd23b80da25dce994de34bbf04ae26737c8143a32d63d7f2d73395f57421f664a2dba8fbc51a92d069cc80987c15fcbbb0403bbcd78520675ed362707012b94277d9bdc6ac454cb9f0bc97aadb598a4bc638777eeb42beddb8842dd1319d7a891e8a7ce264ad7bf59631d067840da0b73ebe3589a0108968b898f8e9d88755b42ee8c5ff2523aceeed1b1191143bbbd6fd9abb074e55d91e9e5988832e90e767dc1367d305084a9c141a621a22d07b5f78fefb2f7ee09df0688d66571f0160c6ed52441a7d1c4c0b00df60b3809ec247b7429111bf5f4001421f5813d1ee75d046e0d5265110b9ae087758ceb1faccb0bb531c286231c6aab08de0ce832654fd4978c28fe9e10c630342ad964f857a14aecf05a3add0847bbb50f469f14a17dbbc720d65ebd900ecbc8c5df6a2f79a5b58ed8c635461c85b5f7c5b18bc313292b649844acc0fef8107439379d5ca11b909f501e83f17b969ea31741c1ebce2f6c5cb7c20eeede5820f7ea8118f61d4076a45da0795d3543412256ce7fc8790a7399df672edd19722b28076898ddb415f9a4709c9eeb3720d5dfe6d4d3b0a58789fc3770d770198370acfde4601184acf244713aefca2cd12a2cd45353f498ec1e2bcc4ee045814de622f504542a567ce245b765ba58ce10965520d52c83fa65942d6f9256aac130ce8c0250331fddcd28221144d65afa829b7d4ec953ce70db559ada694c736b724ead51e9d10a112fe9fccfe081bb33d7a390fe5f1d3d2995b1740d46c6ce9672c20540df6eb7f6e036060d854d56ab9adcb9ffc9cc39271bc5447017390c5fb1f5f51f41d36b5bb0a1162449761c5ebf4e93f51074d1b2dfeba296561b29fe28fd9cd046ba1e3407b412be0a836bc5369d6319cd8647431ec378f5455e4f0ee280b9e5e9a4e350ee3c651d7a796f38656fb2ca40404c1133c4582cb360f4197f0e4946cb28c16495c021236b8548c36eeb048d789fc94c64f8874eefb442bfec03eeef2a0354a75801c515813a59c59b16555e76e8749de39e38257896c496c74c9d7ab328092d681624ca549c0b06502be7e0ce410ef341f58525ee99fb49c5815cf6170e6d3173f519820cf0984bf2b070572e7341ced83e104a50da74dd1ae6f0da8683a0494387c9f5020d82484d669e31155bbd6bb8ad2496cb96d9600e9e725eb4ee3030dd33929cc2c440f6c2994a5c0c17d5eb5c03711142c9ef636ecc73e1fe73509fc6cb84f917e86cae351aadcbf6ace9f795840e34589174617e1ee17bb607e4f25c49ffec5b649394bdb95eee9bc32ecef2e65ea2a9833233c2c1344ffb0c130ad6b7101595c19f49b22e2d61fb49c4a15ba088961db240ef8ddf14a10bea33e7933781007e31b91160e1087c116031d0a6c38c5a4e142c54f268d630ce37c0bd310adea09e548f56f91006da77be7f48bae7930fb4a4d08b72b12feec934af5a7687a6d1bfcaf8d00e7477d91cf3a7f25710c7bdfd1df3b44cad83394eebc0c7cc8b76528b06ea339cfc112eeab88b02a7ac64ff62962b303b02a14563b3630b917b8ae7fade4c56108eb409aa4cb63f052585b3a870120e24c814b6b604d81a6c810e940f7194e6ea015b3b521ef3f23e6cb2c6a95baf0c7fddd03d2c8fd162a1770e6258524fd1c318a61ad0ec5862acc6c2421fc14b2b0e39bc1c7a8bf309e1981d6f7f770440eab3b6123f27c7dec3efce88f81de4a214e1569ec965850a8be4e51e551d4050c8be3d7aeac390c9bc2095972ee8bb9ad9ce74ebbf5a3de0c904f78047b305dc2b74596443d5d5c8d3e937aaa6bdd958820543e9713ef7a780b78c669e99e0a59917d958fe2bcb58fdfe94adbf5c88a602c68506a1beda175650a76ba91510e385fc6b576c1082c0d5879e7f83c410fe1f3adf228ad6ab99a686b6f10b3c6b6f1045c20e2cb1b770008719dff5ffeb6cd28103740ba1c90f8d84fa0081ade4ed8e1852267111a0e73160e00b08e6ad1f605410e6e2f48897f18c094232742de774932ca85ca2d55d234628659a3320c8ee1e3493b72dd570764510562464de2d56a2c3eee89c2d5e7b72337bf5aa2ef5e6aa84940eda08faa372091cfea90bd693e78005e38b5df7d988b9ecce94e6950d863365d600b48ecc946ec95e772288987b6db5dac78dad6f8972c404518bb0057db592f929e9b7688574434f0c63a6bf41f2fd4f043dd309e39dc3677bc952062377e86165250a92cfad30994b65ee8a6225e72e3ca8ef54a9dc642463ca4e3b209d1c0f463d6c44e8677b6bc890a85c3f255e07a3a577a495715b8a5627c8bdc7825cceec654c6081d7d0375c72a43918db0b4a84d653524a8201bdb912f02b1783b77e3049bf077a5f30806880c7e13be731821e2ff035d951590a05efad1dcac65ea605c30de44a5736d8811cb76e0bef967a1d95bb3101f49d929909636b34e7ef75a123cf210dd16d749f8ccbb44b8fb973dab2783007c37e4a95cb723a6149dcc0b9c2dc546ba04ad41def762f27d8abf93d020352c41c3f4961fdec3be225513e4201f0dc2841a07e67d480320cb5b7bc2ce048ae963142e4839158bafdaa3654dce5abb25e637fb13823ed0cb487e737c49d70e8f230e38f2a02831850f7877929a0f281c8b6f41ee944d42aaada439655b8f37d960304bb18b60bfee6342bb155344f7dabcd7dbcf2bc80ff011f00536a2fa750ce48de2cec3e6586f727f13e4d7d6fb16b4fed85f0d31cf2116a185341cdac81c244097aa757f05123efbb5869d999e1196826c5b0328a3a3bf42f637c5ff4d735246e0e44fcb643d420fe70e41a59d632cc4c2edbabf6f871d54cb5d73130e0ab32f8a37218783edc729795b3b1da03b59950a9edc8be5c2faa115872c2a8a1db17f6638a92b2a567f3a21edaba81dd957b3ed930b9a65948fd6173e54750252c3e396516cdda52ba71ce896afd8b3be812d2195f3e597f167360ffb1c7d8b9cfa87a819e2a0a5ae168f9f3f21d0b0d3080f99f6e5ba62d3851c363d41ed2451016f1e2301d02a3c4d7201c1901fc4e9357aac9f95d412742eb480c2d8fac6bcc12e7864a01026e9a2c21b447e75c285d2e29a8151400dd0d00570505269092e285381a51da02ea4cbb0f9f7dbfdb73ba2fdf669446438fee2c838bd495f3b894e229a36789fbaea25a9788ba448f134669c8024446d94734a9c3eb7f98d0abd1c7f673beb78bb61be5ae6f8fa4cf3888248fa91556cb63ad011542bb91bf4e871d771652ade7f99d1e258a5b2f62334870eb663e8d035547a93b718668b53d22d19fcde1e9eef7bd3febc421badafd59f66a65d4037f583aad62d301c91fddc5159412bc53492dbec4c63463083cb5d15c85b7e232e9404ce477ab5f5fc6e381ea0a1b0ff5740f404f82fe73c43a36147118c49a437a59f5fe91b692dfa5825532030efebbea96a42b4afa97e4d39376aa85797db01594f6af18f3718dc5fe5000b6a5a945dda7ee300509b1170e232f7c31716376199936c0e3bd86493e4d543f546853bfae327f280d93c39659762895ac28e66fdf9a64a094a86f6887693651e9029447c4b91ba886de2843114056a7462e397ec843dd1f2663da82b8787602843c4a96aed66a4decbba67ba0d866d5af5f47b31c282cd735eab73a5cc386e0c0bc70d91150fcaea529dec512faecd9fb3f9b2c05a20653d8b95d5e93c867d6b60d72434a7ef71be0517c1e2b5a70609b7065b5832796c879ea2b306804c1b5103d484a75e91b728e345e5e1328c4454d300e479e484f617b68b69b072967b67ad212d78b941efae6ab6085aa0cb913265eac76ba7b46d94d21c3c543c0b02e9d6870ea819db7e2c2061cc7194c1a6286883174e35ab7285fbcc5593fd8f4535acb108c92f4a271fb0bd116007ccb8d2d2368c96dac822429c498d20c7bde3d6dba912bbd09b7008a2bba6b84991440b81542b742002373624260c60ec83dc621d2cdc87704e44d52d139612c4003ddba3d0c138e097d67b40e43cd1b2513f8b0911d474865cbb08ef83bb5a940a45c51ccc3c02a4671f682c820198a0aeabd16b5df3fcac28d354f39adcac720ce5dbee34bd45ef5884e23fafeb982fa6519e98747019ee2fafc4877a7cec79395f1366424b3cabcebcc44654d7149161bab9cf770172d5bbc94583b9e4652852a75456f94464774a45736fda3c10724df23a00b0e26aed3c74b69ccdd65dda04b1449b27781d420b9558ea174a198588e0e693b1a1317c151bbd7ad9f1d9be43333e70501a3d03bf0464c52a1ad8d27ab2aca89b68a02271600c5d650e961d10e296a8677870310807a6e4792ea6e9e573d844b0daa26d7957c9974ebdfa3fa9fdbe48b0ee271d3134a7d933e8935447e12963b3e47fcb7074d82f95f179498b0055ccc1216eecccde72c3fd5283482ea3ee9e0f957f2800facb881cbffc360af1a87b48c6c105d238b2f779d90816f7b8a4580f91d9d6e5e1e9ea4d14a82409043cf3778a363649b3184ec50b3772474d8d65888202becfa5b34d3b4619b217b1afc6bbabb51a4f4d0891e0184e906697af71f0bbdaca11fae9040681b873840c59ed390fe3c625992fb670e9ea524cdd956a12370826d8f487833bc8f1430345171e6c9da8c235b4156e9f0fb02f8ed440d26e1f707c3687ef7376e586c7cb3a1078b808c4e054233e9663e0874acdf6f469520bec20a03730d90d29eff07ddcaaf2ff04d851ea7098957ec55cbc5524bf4381cc7de1ac2e409ecea216b9cd12eff140a8f4f6289b2d01861d91250f04c953911115b94bb65d002d1882895a2bc2c8f8491d4d515e7ec7e6d21ba2ac86e0c466efa28215ef44b1ac481e4b07c04779c0824b5b12bf07cbeda5ee3dc689ffb610ddeb36722075ad51fc6cecb058d9769c765ef90a60f5f77aae56ecd6e5056a8679128cc755bc671cad9e55d61effe1bcb7a5eb51d60a7b76b9d162a0e4fd019fb175c341b8cfa8dbbf42c1673719372a4c15cfb06d771fa0761cfa4e9a03370a4419289bac85010ffbe4f6969535e9a94953665a54d6969a7545a299766caa5917269a65cda299746caa595f2d2a62c337778503838542d99c22bc72cd14206daa0bb783e30c9214c043f206e54a0e52b3fcdca4ffb71cc627c22e37490891d64720799ca5c820c1e87713bc8e40e6542cad10f350e8d29e9a55d594248c69832e33f063d1ea10b3d0bc8b2528988c781e9a47d6272841cc0e2b7f631e8158583d74faa640a47c7407139ac9dbc1d6e101e0c26d5f4de251ce4ae596d5c2ccf1f0362179fd0905b40d774cde0892d2a865cab1814db536ae00ced53497d2cd043deaa8cd2437350d84eb88897c0fb8f42aec90ed6dd5fc8ed5e505b41b1675569071a921388a11e884f2bcad0c6186703b24cb09f60774d99ae16e7a3fb12b7e9c2ce814dd25a416e254e07071d8f51ec8c1c5f2c167410ce906620d4706f500002000b5e4cfe8b2e8144dc742ec90931badcde6115a05576f4a4c3d3403f92008c5b390ebac4827b85ba6dd01479cb09f72971c0c0030279329e0eafb89001d8a790843ba4d72f1ce3f652056c8017341e2bdd13765294b1280afc3f8ee1006db231741637b61c6af9a13379717235d58b8f978182ed4e20f0de5d86a179b9d6a330f20468dbc5091cfb9aca30b358708d89add386cd71734017a6936cdda1a27bf088895312bfc27d83ec11839b6009c930029b03863f5fa828d367c754661ae708c0492bfdec3defc21278fc1100d5aab204c8c1843645f61ab973aad3077be27f497f71d6dd03bbb51bcdbf2b4274d5fd7534c3dd1bcd785d3dde86ae8d4cb9dd7eb39b3be0d22cb76db8708f82a43c8311289f9edde471c6b82f89cea60ac018823f58f7f4d97c50d1f44d90f5902138a858c629827ea37ebf105673257b2848f9377e13cc4b19c97a00a7cbc1c17c3dc2a02dde8099c7f00464216111e911c3bb746c2e6c8f2c7df36a3fc400f23d7cb9045deaced1d7d8bde5febdaaf17368441be83b14bc32773d6b4f5d9e72f478f759feb7e543868ea42d5d251f1ad4d138da2a795bdc38640368c2606aadab56655623b50a3fee2e57596dae5727a06577e18efba41ce3a43caa55b98a7c8e6c53da522818e50faea046dc7520cb17f2e862489d26f48554026abd04435fe6ebd816190b260310670703717fbcba6fb579d923d275367e8ba266730e407311289547a99a85e6193bbbad99bafcc082bf07a473ec4735a47d8325cb9bdeb1ec0232a2bb23f3902b9721326156a06deb9a3554db707856437a57c21fe6bbc42ebd6d3bd83eb27981d4f6d14c327651929da3e16c84de245694465f86d9cb492ca5b41cbc18aedf576c30f74c628ba35bdb7286e8fbc63501b5cbdd8de58adc8115492b2365e2b4149a01317996185bfd1a3ab5d70ce25c3004f3ae10d349f88e7e57ee1bd6b3d5164277dbe17adde4d4d0e3c3c59196071ca8377f6e4e04346743803a09617a63ed1e2a2948ba3599980df8cf9c2c9cb82f47cd742c5c401730283c7931a3d067504d122549ad5d84b8ee82480d57625d3b96c4b98e2d2c9ca67ed2e57a8c9ea8e1f6a55462e05f848a822dd04b15126e45ff5649fc10e657c382a8cc04c81ea01b0cbe9710192116391da265137eebc90d75383fc6f557fcfc80805685966fa5e668d395b583a9acbe8294ca35687cbe3f90bd678485601eb02c65faa9b6b7baf76ab1ddc9805467f732161fe7c8a3ac9542ec60f22f4911dc472d87a557790b9732bf85f0bd56e867f2ce864b18fa61143592dfdb58d91adbe487946425c2828a1b1dc252783702ea00ecf743878788f80aa67a95a06300d5898c07a05a9dd53238f0d2c4d34ea6fecb5cd2eae1b0bc486be33d8197cbc4b7a2cde3731fcbc34f2a61da801aa262971d544dccc404f9e4cb041749478229d849671230195668478bd06179b94ed9a687cb07d577742a50e7d42c943351e432d471132d89fc0d92a7c8c87c2cd9a8ff11d4e2bb7f55b9c443df88d24776a64577b61d5983fe92aa32f6aa26c2729709956135203e2e5e2b64d38e3c098512993412d23f3daa08e41b7d0de8c21c27f568eb84d93eff29467a72b2247d68c242434a9c34d65a876aafc6e963c8c9ce609e11afcf7aba2243d0e83dedc9d944755ef317aae62f2996b23c2c389662b45f7d663438ce96f9b71138a4872d16a773c4909fb92d7909b93b9a063464207bfea619bb7474034d55a6e3e262a99f458f2dc29f2e477d44cc954e521e672d4187e1248c3b652a33855531d5e82bc180345fd0179bcd90fa5ad4d2f2bf6b622736a585adb85f013cbe5d3d6f705499108d998cf0d7977a70a201393b459220823bc988bda9c3446892c890f43c82c7d114df3520e70011591743064fdeb8930fdea13ffbf882285e6963825c88ee706b68d6287fd3268eb73e3073e3839c4dd260e43c5a2750528fd8009ab575dc4982bed801aa29099594ef230940728e40b9158c6f9be12f2b73c8445d7abcfcdcce7a380c7894838706aeee6ff3fa2410c9cb6a072feccef0f3f83d222d2151da800750497b97e31cec27a6f06653d659cba2ab04aa781dad8fa322b9f4be0aaa68cd149694d9a285d14b973261430abdc910f3681e668ceef50e5e589082113c5ae3b90738617bd4cde8986730fd344ab8296b1a5054848f9ef6141bfb1bde25c2f36a2569a4129ec1c679a532c9d282280eaa2ec91bf2b6ec798ef400d72e115f0c9d0c640ab70f697143088efb9f38f700d8bb8b211575c9efea41451208237b7364b50e915091bdffd882e2012200c8687c6ce76b7f942a517436962c0811bc7e52ce7232a43097e7b600617c073b151154d5da45dc9b3b61b81e0cbd5ae4c2bd8a62b3cff3b7e106e17103bf6769e1be90054743fdea8e2bcdba6fd471431f1a829254f1963f67d2672517247a1f4c857cf9b1552e7f4e78782eb55f1b80a4c6b5bfa0df6c1edc871788e2859ac83efc845e3129fe109dddb8313ec59dbb23ec193af48fc764345502a86628273e2e63d193363be764e0e8d5b3b1d0688467b057a5132a134967440aeae397a476977e0a5440b54fb16d1e800b60c031fef9fabda165f5d5da4f4659c3724d99346261d04051bd2b7aaf8c8c23834451ad6961a1a2abeae11ecbb48705ade3062bc519c265685d7ecce04856bd1c3c0a3e9c8871b831030b53cf9260855a6935057bb0bc405694ddc5ec32e3c91dc64091db98c075dfa0d94926b32ceda8c4707e48402657d406d81116c2c54891bd803e50e11511d4a5c51d1335c87284c1a6b6bd758eecfa38ca05b892b203ee701b812af1bcdc8396338920e7532588637b924993011993609c5145c9df230b2a2745302c17bc3b17db2fe2a2410a0f880267284c2fea49004d847137ddcfc3d8c54c38d24ea13bd212f94122d8526b10d54c360ba773c3560f71847b62cd889ae19e896369a4a5964839a959e74daa1e59c46e9f213c9580d626febac6c4863cb4c9e5294af9904ffd469038caaed08f259e2c0c71ca0e288aaa2db23571e878a6aa8c1479dd1be41e3168fbfc991662a6e46fe479cdf0c58ae955e6724325a4cf606a7519dc241a3262896569adcecfb23127ae9093690c0e1008c83c2e046bbee66459a4979ff164eecd98bb3bb74e150d3df9a51cdf9e026165daf5fecb512aaac80098f8f43e77074bc0296b03cd98e4e0d1b2af354e34f5b326d728ab770e9149c2ab2179c9bc99886de2ef9c5d745724ac2e975d1c20f6b113157ca5cf31b4aee92688724495c1f271a0367f791e4cc29d58c96e7c7055336ce770f57d3a9fa9278e8240f51c0adf9a311aaf2641279e7bc69714d0ce8ec36f6be7e57797561b915984ddbe338418e76bb6080e7b3d98bff954920e21672645973124e9a32997729a293e1b075f9c7b589dcd5c3a6d2dddf5c2411af9fc8313d48fb954bb17a3d0fcda6d09ab720ff0f1dcd6d4d03b7e9abd1b82e954606b9443ec3667b06f382b1a7d9af49826485a82601dfeb2cfca216128650b444ba59a3aaa070a11cea2bfc72be9d630d15ee1342528eec4965500d5196efd5eb18daaccb4f9eb3572d488208b123638e9eac5398f0e24c65dab674875dcc44a70716188d9c416a4b7f6e70af50201bd10e3c9d45c8029688b5a6ad20e9f92f39bd1ca65b26470eae0d705d10ab317857182605d036974e69aa259d16d04a0fe033105f627df3f1af5d97b374afa1e6e42d23081a9106bb5cee9bee3171dbd3fe5b0969c2428d68f33b7c79432ad5b871bb31a24fd6e02ae2f52230d0c1c59e9d117a412b9b7e9f4a68f50fd610139976a733565de5d5a26bd4655a7a40b673489ebb83041366a92b37855d2c203c7884406810314593e83b8acb924a28809d34ca8857da7615660dcdc11b9e0e89d177a5b4b57a6fec8cdfe4419d09ad593a20e9adedd39e6cb64a055ba5f8bc7fa406b9ebfc8468d807322dd3301f624e97cde96b7a53ba0dbae8cec9e3fb9882e22929b4608d193da837c45cc9d073af2639317f9e126ad4b963290f06139fab57bf2e1d331316770bfa83cfe462b7bf9bdb62b0550a104e31171f82a427bc66fc1e012dba81d3d877cf69b80cffac4f7aea30a6e3bba1fe7750c6b9177d1c4aee96bbb10667c2f9e02579b28e9fe1ace2b4b56f822b202fba79ae5491e1b4e249a44518d6b220428d73b27ecb798ec5f980648cf85d7a56e0e99948834b381fa0fd06bc4bfd36f57a2c24cae9d9b87499e1be7287cbed48a0a8ebf7725a6608fd59b31bd9256565c2c92c7506acc5faab0b08ca6f42cb2d5b6e7a494526213600537d5f10c339644b105aa195968205c7fe0d596171a853588b51993d12fdce9a6749b6307f3d456cbc421c6aade70e0cabaf07f98fafad088cca494d047270ee2eaaeb72c2dcfadfccbd6a5c9334392cd9d064368eb7ea5710f860300b05b351d5a14745992693d7620890c6e97b0b39911d0c8ae2ee1b0cf634821d207e72681f61850be101589525838fb794fbb4f21030fd5321e90bd3d7b692ba51d724f8e8f5951a15cdc0f23af7c6c56d8720b1b7d8f42450c792dce287ef70d9d17896c32ea60af5081d856a5ef33781db09ea19f2e5ecd67e58e9d0cf357639d1f3cb8039cc636dce4f2650da55fb347c2f4c475dd45b3ed1c10d82e4f217db994c46fc413bdf0f35c6b38185a2b57f8ca82a28d1819016efc1c980762be743d0f5004696cd02ad0fc5303667e3aefffdc57746e1ec7192937cc4e5fc40830cea9e696590d45f90d92de2b03b3b46a75e0ba1c24bcf2ced566ef2eb1f1b3be008455f0042d6fae68153b695c9ea28767db8ab178eda5efa44f147e01ad13b9c8df94ab437e04291a000310052049986e80ea0e8de30378ecd8246689edf58caca0c0d41624a4f9af123a21dc7729ff0316dcb2bff6da7ec34f4826422562e7550cc3a718e5dac8c955c608f35acb08d9c137659dc3337c8aaaaee28ba74eb23c2427e3ae72cf063496c9ebe68a48a36ee2caab9bba08b1c22b6c05eff2612d7a7d53f4588a2e02b7e2ec011c0361875c586d83ea14a02903646d92203cbe99d55ccf80957e1843615032260b187b03758c60eaf4944b5710bd13611e84757f7f3940b2e355084eb09a25dc3145e59d071ea72ac8fcaca7f1d308ee18eaecc4bf924cfc3296e8e02e3ce37c18768084dc7a47d0daf276d6a8fc41051d9977acc9d260bc3f987d487a6ca8d269dbd16c4744f1dbd6c8ec825494fc47adb976a0dc259c22df70287b1760729e47c275584abdfbb63222ac577870adcaf13c3f85bc1a80103b192a908f868cd28b51055d23eaff9907e4535c2dd85e98657fbd9c4d0e77f36a93c20a3a794637bbe99b74685f8c248840df799f4c3890e0c1eba6eedf2be66e721717b98990c51b4cca8b81f45db5088a1a5d554dd1b2c890ae9b8ae1c44cf25cef0a90ee15d9dd5fb8819de18da0b0b168eb42b84bca88df00690ae2c0f44fd0c62bb94f9ea6433801028cc8765aa8136bcbeb1c7a7a244e49bfae12258dfe45ea224f4fad48cf9dba8ce330aad8f38d90345cf93fb5a0f02dc80bc6ca6561c4b25106f1ba907cfea3207dcf280207c058e2e40a56add487bcca41900e26a5b7e493eb90ee53f98db0e65a461e644d74c73a682d267820e7b438b89adecc1deda2bf0589745e961f16f0838cc327b17b09da1b6225472de3667775def060060bcca25500e0421f7252ae494f7541af1c451336e9063a9c5f7a47693a1596bb8033b26b4f1a7577321f0e26028437de04a49530fa2866017a16467577207bcef84a238c93b9659d3105c4dafc419173b29a462c0d74e39d508497cfc3a4bae39bc48f85edde74fb8c8c7eaf1e7f9790b8ab46555d14f42d095ea97888e6bee33d99a3b6662e2ffb9355882b14f30377e77a50d68ffb54f73f804636c437128235abe5ca8070e1fb29c55c31204b219b23d7bce4cc68501a49931cd00689dac1ba772edfe6d0d49680161c5fcc6ef2ccbf10b4fab63d6aebddbaaa909ab4728f5e6c3482dca349e35faee1bb21181ebdd76a5bf4be371f96025d2fec479b722aa2f41a6dede48220ac9943a3d3671c0d504f09d6c87a310075763855982d9894a5f8994c520933ff43bf4b2bbc9cf04e8eae60626a720473255ec70429f3b8384a51224a75025ab52885b42fc68b2c8892c820a6fb24d8ea15fb1455060328c2c5b729a1c0b33760538549b2bcc3f9887fdcedf517bb3d247e9f81c24ddc1be0bfe5eee7fe0a3d45ca50b98005ff960ea0fda076369925ce714e378b9640b8b79c442327ad0893c2984e0844ae1fdf90d438b8c64263d28fc479e94adb4979980ff5b0aba13ee2195c575006d84499940a3a10b404b907d08d3c8c1dab2e4996f9659226fda28772e26a5081026d0cbf848acc525baa641386a8e4d2ad32aeea879fe5dcec273db573c816454e219ce02bf0dfe92c46cfc9cd1c2343238bb69cf4cfce53d6d913907cc5e26ce8dc5ea81b107da5279b2f0c9a26088a9f7d3b02c8048632ffe0eb49591f7423eaaee2e0a6fc685c812c0f068574817c753b3804dde28c26f8ae5e45674abadeb07b61838c5efab469f429aec4e95066e94246c8e6aa102d731f42c684803fb0c69cc2c0b833f2ee35ef32a100ed7cb66b94f2881534002e440a16e6127fd185cb6f3da64ea18515cc2397cd1b0b456c8a4e162f4d83910ea53c0b79d9b62d869397cc546d2da0b61eb432645ca557c4ee182f91b0f4253b651597a329f77339afc96a952f7732f2f17f12d1deefd448807d2c779ab52af44a6e943f342e1fc399a7332628251ed6cd4b33514cb92b9dafc67781986783114de1ba59ae8c4f898ae475ee2e5329c610d3a481ef47c6a0fe29b4c0c4b5d99146f08e900a16a010faac8df65bdc96dd13b7b4732d11ca2e12d279184858967b0e5ac336327f6b010f1556720e9b3218479990a9d03b6cbafbbed563ff15c4e31db2a07f5f5925da132c205aea1475779222466f17341b700d37597e979b59be2f3a1872b19264096fa80f05d04e066454de2582fe3f3486c1d6a76edce69130883b145c541212ff005d8ea1363d0856e6d85b1f7d83aa20bd1c2f33c30f3a0b7e771b4d2082be98852ce628bb1953c0dd743143f7275f1ea4aa67bef77b961c8a5d1652d307413c7b34a0d3946ee3a2ec6595a05ecf093ebdebb262fef40a7efa0832da9a0cc979340a051d06a8ba543d80e8c5bb7971edbac955a03c07938a7c53e29274d03f11d9d275c15bfe3ff12dcf5193fc8d01bacd5701e423224c0acf057a955907cc78337869f608dd2fbad173a01ef8fa0708c80b2b8b44c3104f5d8dfdf9b0a357f6c4de0eb8d5cf66c296e775fa44531cc5869ec9d067c4074cec9063a6c08ee1d8a29dfdd699ad2fd365fba7434bd7d96411387921bdc6189eaea02e5b73beaac8a7c7f0e01f990ec0ec5b00388ce7ba62a8ba798d2161bd161c4815cb1059e60955da5ddab8a5c4f7334619605aae03a805ed0c1d71aedefc9e4d462101fae2ee7a45b9bcf4c7a0265ddb94c3ec74280fe22df0ee81bb28a857550555f1aa85fdba24ab2015334d332108844ce214f337b4134a7d17623c24607d5774c64eb7e924f1320feb79377969735106ca8612c356109e7cb7120f07660db1a2750527c925d510438321ebe0ec8a6d373c1c5e08547079ef6180c48ebef4bee1967a2a6d82cc88c0e686ea5dd3dc255be85d49bd65727eeebfb81b7bb5b84cc0dab804dbfa49c53ff9290380cef0b9f2ed21834ef87393e508ce2b11e2f14ce40ec5230f69d707d55334e921201fde90dcd4ab8561efc0aa5cabdf027017d7d7e0c8cd7048507616e74a529c1e75f1935416ddefda135e8f6a0d14a6bb9ef29ad20a7cfa4e4373ad36a23b8ac94ed741dda5c2fb50b65fb2806d579b3609c143299fcf40e92f87ad4cdefac1c43b8d130d59b904aa58af60de6b6a85af0c73ad42366509671228302c5ece850ba26aadc72da6ae7db7665a7d718f052d0e84f0d93627707fd701a8118466245057ecc0202481f1bce1eb2e05b8e2ae7a5c68dc00102b1d18a0c906ee5b0dcb7fef1d6cf5f5fcf89f688549fd3c3a888905fbeda8ca6a88c99a98cc27034cd40b81871742f2e67c35280f6b90f833fd343eb0c2dbc5d59e31c5a5681a1a7d1d01cc593be51f7d764df6072d345cc785109f36f66f2ffb6330569ef1b3b5c152936dab5460db7e1634c27d1a93d1b48b33fcff6e0ceb842bd5baaf91c3346e4ef267707cb92f957fc9916396140b98e6f36ad52925e318799a1c9e114b60c25a19c43a6c5365fef119531204cc7b95acc0b0c5a08316b377b3add66bde3501848fcaeaebcaac2715ae1adb8f2480aa80c5ff0758124e97088eac11cadf00e49b53435f124a59a98c107d36e8ab1e773124fe3e3bbf630b00b9bf39d281d0b31fd71125daa39eda71fbb056f76c60a58c3e7ba78a1c5ea74cc60993ac3e19b786bd0319cdcade6626e2163f28d005fe9965095a1f91132c5e78af7873140cf499b5bdaf51e33d69ed700b97d0522a17b9295a444559f462f43a5c3077a0b64ab21ff03a143198f402680544e703baa01e855a305c554d0799844aea95440c83734bf4e1d03c451ed1724d670b1fd8c66af9357610486260c6db7b055471c12314e3043166067660d9220965e1bdc5b264c3305ebd8cf29f0af27b31356d2c38a80909697befbde59652a62465960806085f08dc9111216fe6d1dcd4fef9401e261dbb30484056713872ef1a7c617d4bbed046e76fe6c8642404333d12a37e9910657f08d47c8de392f5ebd5ef3d81c795187d6b02b99ebc6d1bbd25166030e0fed3a33e9bdebd0aa1dcd3f0d0c4baef5732a79df385e6a65f3426a45fdec768705e3b343c3440fa45439a1c1a9d16e9a4d9a1e181c1f61dfded3fae524ac5ddba4c63d657bbfe348868b884742fed34e65120a4eb57526b57bfef6bb5b6da6aabed668ecccc608047f9a3a3f6b884b0dad5d3a27f8758a39f4b2fc09f8dafaba1a645afc126fb0b6cc905785c89f9604500c5ea47bdc9a35ec2984e3e5811307980d56190156ffad49b5ec29cc099216fcd04cdc8da00fe92caf902b26ecc9adc35b967ee7c3204be1763958a3b7af18409789455889d5e26adae00bb9a3680bf492ae7010d734a028ee5d39bc299a02f02a64785333254bffa28ffd0e834ec250848f68a13e4800ae3f900fb8047974cbaa41e4673431423ca47845c4cc8d70c135274f99a312245ff2f77487a426592ce22739d47bd18e0b1ebb93d251ecc2de18e2cfd59a7e9542af19ca4141287a33d6782b6e78e5c2e19ed6ab823970b09f6eca4735a97cc95c475e4b996b4d4b4d8b4dcdc161c6b1294fd6f4c8248a5924b36ba642e2332ae23300d2968cc52a7959837abfca121c5b6526425865762362b45568aacc4fad542eca78e645f91e595a1bc125b01f2568ce495a0ce66456865a75f92fe90959e1522414c269459f6d74a15653623932e36fb4b8047ba6ca63f754fee9efb13d8f59b94e5fbcc4f10b2d53fc44d81ecaf439a1cfa5b178e3a56622d1ee10f1c65c833e461aae4132e10f3a4ac49f3d3b5bbf6b4a1c1d9d1b9366ce9e644e128aff0acf4acc4b8a3f9fdd8fffea4094cbf3b5b500777c42da1d1e51f0257af7a1bf74655e888abb5862b405686c4b65009dcaa14150d4eb7fcbddbe1d751198cb23ffe624ab56a580c98f4b80a4cc388c6ac5b5d7f689bc8f467a0488b3c3abb09cf0dfe14a031c9fe3a9ed881358cbfa53e3dfd1a65158a64f77711e997abc066c0270345fa354a2199fd564eb0792b399d37d4e04b0b7090c34eef4790a27fe79259aaa27ad921657f1a3387b98408a1315b020b29bde612d2af215c6ea1267a4626678e206134374be821f0b812bb97731dc125db685e5efe7c078e9ebf9087792d47f362bfc828c95177d3e1b4e85d4d8b5ec3861b6672e85787dc92a3166534da39b9df4473c373020f22f7df921530e742d262872215f0e8b90b7998993b7221c142b336122434d4af3e327311b98a82a05ee620a7f777217119b992b88e5c4bfae5b5d4b4d8f4ebc6f4fe2d38fd6275d8d9704b5a448534387d44434d0e0d182514820916f0e94d41a6901581d49bde147a00f5a9973028938f53c88ac0e94dde24f480e94f2f614cff03669a22800abba094697e67329d66456e535373332b3a79279f53cad3cfef8e1c66fad99d93e7e3e449294e8b536746f6d319796b3e2aec7ebc35519ffad4d81de5f9a850763876329a1c6f39cd8db7fcbbdab5d2cd6825d6551aebd7e892e51d77c9fa85f2525e6762f2c5e0a9fa62baaf5ddfa5877e5f5d7ab2bf673ba4c9c101696e5a7410e06e31f1aec3ee8967831b85024f20f6961702dc1d8e2db9abc95336862359cac66053802c656208ca2b25dddddd4d733367515750cecc2989629268273b114fd632cdcdcca3fca9d12fd285666fe5adbe181a9c16576431cb0f8770238972b27f8782f2c5d447f962e8b33cd61753bb146ffc415352ba120bf08b945c1512860a5d41def23fe1521eb9a3ce04d9bf93c113d2a2bf0c5f8ccb25dbc129c5e0c4e4340c3b8cc6cc5bfeb77f7c50426efa3dd4a837bd6c480b3ec81f598b4c436a245988c03f2c238d24b94fa637855e50f615e051febc70c89f1a0d4bbdffa4c09598b75c8a2b3c2d8235bae56fc11b72802bb1169d862f4a9a7ebf3833236bd1080ac4defa7609f1d1959202823876cc2a720f38e327edf02aaac8f84b3fb9d7febb2de22f4f15ae76c688ec66e29412783def59d8f0d342e4e99700b2ff0a907ef58ccc5b2ba41a3c5222b4f06478f041b009d293ee2e73182a9c91b964d93583d72f1534f1d3a513601e8771f245430a2906215f346634390e3b0921a2210577e43466ddef4e9bf8c95ec3b10ae958e8793bd2654a96fe19bc0d0a53eeb9ca3d87ea132a9e942e723e0d347c31da07c093fd129b90305478c24d9052c83eaec45662aafb5814c5d64a6b8527fbb73e199a576252ba6e2061a8b0abf196ff09bb76909dcba34b48e68e244b0ab8a3ccc91f1a453490346c46466396dd25934232598732327713b1da7f06895092161999a913364eb884b2eb887402c73504ba825c32979116bda5255c028f2bb19558e6f969ad789286333a38e6b1ec2e3cd24483d330543813e42dcf140acd4cae805d6a4e3f763c2e350d9b31d22e379e4b0d2acb1959088465fe22f0f82208ac3e3d2f82566ac0e148b2780d2e3c598a612a3323b3210631fd8ccca550900b8d25cbef04205332024360a75f2c18336664d2250581180e4730b2fc09ea583c16016449693531c23438343774265930e003e6a702fe805040117f06144917effd15e00364644a23f86428925085581ea5cc08412d0dda5c6d0bc0755d9e74988591ff59beec5ae617532aa24502381c0dc01bc0178352006f7e32dbf7874218bb1c25945acf52976c74c9666443fdaaffcd0cb5587b668c04cd6688fa55c399a0167d46a84597b9ce186971e6c8ccac45379d6666277066c804ce04cdc8baa7b921c06743bb411e67eee661660e1cbb9b5147ed69f9627a6546677fa41276d3895654ca64c589d5542b14560a8b16323c78b77006151a00c005406cad7435b8601180ab45b690a464e91792595b7f46d630193f33413347668a669230e187e8466849762924945dc604591ea51092ec79944246d9858eb23b5193fd6da534373438fdf223c82afc907aca80884eaa4894aca47a2975968eb0ffa892fb35e79c620e7fb0bbf398d98b85e1cdc9f377f27cafa2932a63ea27fbdf7ea564f95d2cbec5fb17e337fcc82c481f2da95efb8ee356dcd316b96dd35e53bd16fa9fc0716655f8c5ac42d96d5f8cbfe98be1c1dff4ddc99bf393317de98b51b178f9c5ac3ee5658b29af4395ef2ac451f3ea57618f16539eb698f29de9db9e04caac52514a298944a2abd57f207df99154e0a863f5f4fbb8a7e0ea39fa2412a5f4bf932f8607efe97728afbf98ad05c882fb14d66af5ee28dd0c1c7fe4d5bff80e2dafc60fe495a3fceabbe99d40148e058e3ae4927cfad5e9bbd59f42395da77770f52770ec8eac56a07fcc8a07d3d74fa6fbefeb27e33dfd942fa6f4ddb7fa6e058eab4f06ffe9e927637ad37773ca26ad7e05ce3cd359c5a8c213700598e306d0061458c3c32915f82aa28b96175df872e2c3f5aa0ea61fd2cba2419bee24084cff4493503c04f6a7ef6fa36d9aa669b9c11311e0feab7d609b293fb7ed3ef7a377f203e6361010c9267cb6a575d6a9dde9c2055635bde1c406bb0b178114846aadee4d29a55e6badb5d65a6badb5d25a6badb50e81e9d77f0a832598daa41e8887498548e097fe334feca0f46e6b6ddf909c7ba69f13635c7a1daadc2c0f4b7fb50b7eaf81a72702b46d5fcce9b72fe69b537b2234bcd3f4ef48a86f70c6a04216e9745b4852c0fe2af97ef7f6c5907ab0babf4e73a0e979effdf47e2641c41dd4a1df5fd3401d766859fb1d5a26853af4c7b8dfebef81dd0de574ddbb6960ee1bde77265f0c0ff3b9ef5678b3f40ee2d740d3cb6fc7d5622ea99bb9fbf881dcd3fbb97979fbedbbf95b28a76b7b07bb23d9bf7e313c70efdffdf6fefea02ad5020b7854c9af22bae8f9b3a7c549e94b21a42a3fb84d3868b105dc3f7a272310e54b151d577612290a2329fbcb7c4b4dd71d8eed60e7eeedee3db18d0cb9ce547d9c83e97b28fe7356fade374e3755b77768d1a5d1bd54b6430fdfc177b075288f53d6350ecb218346299b39ddf217af34c22a692413a5915f8c5523c0fda3b8cd19339652d97e32a6aa94d923f30e2e5dd29716a9366f0aa29084bae816fdeeea2e444aa78b86cdee278b6cd137c03d40a6237d5214a88b4c555afc23baeba96e70f450f5f2be2c0981b5b7fea3b7620c5bb8f50c2fc0defe5709414872294ba0209c2c4d3f10021080a20084a29078501a4252028f7446eac176c4ddb98ae584c106cbd082450a0b65a53a596192429d4cb844fabc8edbae662bf59e41f0d442a0f230d601ce011e6f86e9644fa7f4ebe3149d5fe98e99db085dd7918a541f803396641e657fd935f4c80c499103c984827a88cbef804819364eaa75ba73e8bb1ca7ce6b208be28c53e7a679ec109dac26af45daa24cb5004b267ee0c963964cfc10cb92891f6eb2fc2d4b266c9664c9840d925cb364c2668afc65c984cd509eef5900032add8374d93173ffcc9f658f7469714b45dc9b923f4976a58b8f5f22b23f054932c9e220135cf697788a04658aa2f3957c4bd5b45a7ff0570f5557aa78a2b7e8abbcb5fd0c256b7e7d99c397fe21304e115db4bca095d25b29ad94ca9c52f964b48c250bfddadd54a0a63b9265be8661d20b3c2d337632fd1f71a8481e5fe48dc268d665fd1abd9d3c9f7efdf122faf583843c56a14c8de4b11e09da90e038d5306fcb16fc5ee20fb437dea2bfca4aa4acb7eed4d9f3e2b6c6cadcdbc7ec8ef699b336dda23f7a9bca43b7362dd29baab13524003beb55a39aa41e758b8e3549a6dfdd4897f994f2482171329d7541641aa3cf51fab6c6dae0f44b7beafdccf79ef75f38c32ff4f13d29fc0153c39147bf90d0ef6bad5d6bbdb5d62e92307549a6b6c65bf4692d6a510af9aa5448913ea5b5d2efda93ebbb56ffab54d414f58b567abdba715eed2ac89aa1e7d5a15ac31d3ef20656641eb896bc8abd6af2a6cce60b2cfb27afdaafa0969224527fb53738997e9da1d72225e50e436b53d322fd9511b0ccde7f3fae72d878ffc5708991698cd44aba581f240b7dfa281604997e38aef26a95a50c474b44a62b6985c87495698d64a1efdd008fb6c6abf42dd743ab66dfd6342c25c8dee8f0f4ab66fa76c86889644a6d2c530b2453fab62753eb93e96b15ff10a1945670be87535d0f8a8ad20b4a3928e5a09483520d4a3528bd004b02745245c9119e13e8a40a75d80f18674dfb33d5be16fab0f7b5f75143d6b4ff03e6ca210d7c5f2501c380215d2410c309d95f0b4156c82ea3902cfe2f86ee50d79b1698ca88023a7a4c1b18d2482e993537b467cb8b1953c0680943a7925f6392cadce5ab1ab66206a3c69546542d6ee24ee5743a7acef30315f3bbee9bbbbbbbe703e7cac94ea24896faaae9aa3d244b4df97e59d8f7f55dd45addddaab458bfffa5abb793b4b7f7c847b7eaf70082e98f12030ecba15b15876cd5af72094f909162fd0e4c80a421c5fa2808504d1933a6ab7efd0f54e996172dd67710468bf5b5d0458bf553bec55abb8f0aecffe2b7d6afb6462bd2798bb42bcd9f4eaab0b85a4889f8a444b2dfe4d4a17ac447ba9c644971604322f324f6cd4e39a7a259f693d83d1565ff3bbb455bcf46e4cb39159d8a4e8cfc099d54196bf8c9f6450f77aabd18bf1ef7eac29a736d7ba51d5ced6b242092ccfa536ae9534b29f540ec2dfa1d075e6fd11b1b3721643bd61c1b2d1ee543b636c7612a9b6e59acb2c9b6e6c8b0c8770b79a079240565fba3ca06552359ec37480a6ad13e2884b55e29922cf6c125e0112405d130932efd1600604fb61dae14693fa6f464fb2c6cacfd14fb2cecbf0500007cb21d49410db2c8b406da5748e780ef010ee8129509a9d34929a532853472207bcf29544aa294442989921125234a46948c281951859fa652b2d44adbba6bdc6f285502b2ae8fc351d7903bf23c0f15e484235ea531cb3e06fdd273caa9b58ee7813648cc07e261641bc0c89c405360a022f0fc99138bcdb7b1f9e3ccd169b1ce58ff7d1b9b394fe01f59ce9ca9e37d31b7b333b27de16254c93625f7ccf1d6fd626c7d23ddaa5f97e4fa5c38b6b48862055269e10442011e25119004a2c1808e1d7848a239d3629d993572c8ff9f4490adfa4870020a790201917070e489234f48e912e30fa49a815f8c2e60df53d6bfdb2abf404a39a7bbbb7b1d1a1aba45dfd43979825c52e3a3fa386c0e79abfe78e9ac99371305b255bf2291eb908e64a9df9d3cc1094338b6fe1cba58357deec5d85533c7563a34f444aef5ebbba8aa6aed163098679e5d73024257df860a853b45ae57c85d80809c416941ad3638373912a6eee41e3e5ad46a54a01ab6bec3e60fb2559f043f5990ebdb0fa78d64a9df79daf4ec60561e2db6b458bb555d9c40014ba02222d282ac1d5654e01dfa5573dc205c023c6b6e50049d245916e10444799c5916e1044ac8945e1858e4e1e1f1960d355acce12dfa16e7a8a14a8531edeeee9e3f3f3f0e9bb23994e9cba12099836672f0386cfedcda3568d7851e902dfadc0f99ca568882201f92857e7732d4043c7f26cffcf97b3156a97efedc8bb11c2f8f7e7d8d8f524aeb4b9f7ea0c292dc9dbb4b9741b43b3f99cfa2bbcf39e79c618da69fa35f3232e7e04f811d7af4ab5bf28a0adc925dcaa0dce22a2ee6cb0004ee1f55b6f0527a38f0e936285149a50402340514edb6ad22719842743de1dc9e621f29da3a38906ef3eaf0b20d7ba01d7082064ef0e41aea309f96601205390163c64b8d140e330aa28e082948ff7432d2294541e785817a4b24a9f3c080e99fba8ee200fb63ea1dbd098e6e6405b054220c4bf267a944186a9abb9ef7a6aabdbd4f43d2e3e0f2fd64aeb56f55298fbf18eba327a56f18049da47f436debf216defbdbd66d67be3d281dbd3ce5a6f9a0c97eddf6daf36dfbfa54fb7068af7d9a5d7243aba28a2ac430757836d720370fc37d8341b8f0031e0c12f7eb67e3becdf75938aabd35574c91909d777fbbcea314fbd09d8deebd0e0437955253b9bd192df68b11e77edc2addfdd65fccb48141807fa4dcf1724fbf0678f96ee00d7f621ff0035122cb1248894fae214b202538f9f64b7a61277f96404a96e4ce5b9775a35ffbfa92d69e9f027ee4fa0c90b96df46bac7efbb4870b8c3f646e80fd0ec7ae56cc3514813aa9d25e7f7d4aebcc9245df7ea5974ac9223b0a6af727ebbed49ede1743b14549c35b0516d2dd4db5f296f4bb6738aa9cfa67f72210114531c3210a221c88661293884fdb7451e88ed8c4881123468c183162c430aaf5296d6923a308193a327264e46c34d8845c9ecb53a4480f7c664f0f8acc9e2245ba048de3117951f44ddf78443defb440b4f8f8244124091f175c203ae46c137279da7eb5b6e903c9d93664137279361a6c43b62132b0420f5a30852180c88251500e54d084256445bca0061ec5c7c40c287ed4cc8cd0c4096c9890630498051c31450bb6308223b8200298b1658a239208534021b7fc994268069dd3385d82ce99372ed0517b6a951193a12323474611d335df41d95d29e51969ae55abd609104380172f46d01de9664be8a83734064e8c9b1839a529f8779d7c114248d68488654d889bacfd64cee3be1bad4c29bdf9fef5b074d9fefefd62aedc6101f4355655b5e8af892f2dfa0d6bdc6fc8c66ddcd6b1196ef0d8406a03912edafb770ca4cbf6de43b27fb7813becccf49910414fbe4f77cc1b72f430730d675a6c9c162fccf49a92c61f798621307dfa35fae5a2457a2fc6321f55a531e091c5fd7d8dc5853844fba910cb70ffecd990284d01d75a6ba55fc853f6902e7dbd1ed265e6f930c020dbf6cea3878f167770d8ace956d3efbcca501ebfc314a3349244fad5441eb650815fbac5596f5f0215f1e4ef97ed2ce8efa2818a70721fe5296b7889c0c111e2060721942849716a020c2960c09850541efdeee3d375fe3494d365bf417fdbf5e94c62fa4c1f0a051e53d906336048294b50a082cc981184d96be0f614bcb476ad554ea2cbdd49546714d3255fabe09ccd28a6ab52ed89c0f1c70e4d829a156a6c95e1dd66f5c1113398cd70ec91a7ebcc7622ba3d67e644b88eeb18b9ce2c25a57a02ffdb70430e1d2ad97fd2ef59bfa4eb743220f1fccf803aa9a242414a2b85e12e64290c1277bb087c865cb4bce041a50f90181499dd8d4337cec4a1e0a458a07d9d80f39c2fc4942133edc12d4d378ab8a41eacea20488184526f6f8669bbfb7c6f7aa3842147a430323f7cc3244214c94b083124cb2584d88191e5123735797e3125116099ab872d2dce2fc2da8f17ab7ae4cdb92e74701bd2e28fcc75e10e2d73614a8b53d5e2148abad9b2499eb9d3e2ab66ec06cb6cffc52d38b64d0e6d422755a0c091a2489640520ce912640904c54eeee417737283fb976409344392c769823c5f12214ba01990ec5fcc490deedfaebb7c3799e6ac295d0f6b9e8ac4251296f84b584a0f832510a754600af82aa0d8e2b4200c70861078e671e670e68480faa494d2931b204e428025e773c81ce23a80c83fb9019e619d4aec2801a76eb76ece3938c311fe1cf736dc8360c8fa2bc30ac4a9ab83b9678df793e15150c4d5eb50e5ffed8bf9908512e2a819e551c21e2dae9eb6b87aefb34166194216caa368cfbdf62cd40934c1e0c9abc0693d15a87a4ef52b8e4422d1958a5bd52f66e52916ca732b8ec55abda3f87333d795a97aabcfc68a9347c21c5aac6e7255ca73208b67812d1e45867ff10baefec5b75f81f751409973e8176dd136cc267c201e260c9170497d66d29cf3a324fadff75112edb42f8607eacd597abf74f5a6d3cb164faf4395fd8b99a7a72d9ebeeb50280e859a5c2aa34c1e953aadde14a2de0434f9ce643e0af49fa81797a8378941bdfd627840fd8aefb4933759f128d48a90a2cca72caa87c19337812bfe049afc0453ef20ea55e0042202446485c7e2e51138a2bf046b288179a030426f46c4043b95fb4b9730d7b7d91db270d8ef97b13ec6979268a440a6ffe2b2053dddfc3927d8dd78442dd22a9b67a7755a7429607ff7779c588d147806e17dbbebc21f35796c9dce691c28f0787164deb65abbbbb906474abd494f2086a10c66a9841888e4ae34652dfdb8333c964ad245664dc341bf7b19dafd8f3cc191e6f99347e71b1260ba6ad8ed04efbdf0fe008f37abbc7ae1e8e5ea799ee7e5e0bde751253c8f02d9eefeebae8723c6aafb12f3959da669eefff5ffc81ec881638fccfd054717e3cc9df71ef72373200fcf9bfd0b8e2d1af702bfe8344a043c528f5e4f12806e5bc8c2317f7b99f9db0f7fed8725c074b9163a94cdfb20a5df86649abbf6726c21fec14e297d9aca74cedf40ff6d48defe02d9fe6ebfd160ca9879fbfe62b66d08acf4f4f1e3a7e0c4608d6e511b4ae08bb7e8bfd4a895457a1d3eed491b38f2c8dde7fdc81da8c3cbf5b77ab5496b0972322d8247556e29768a38b9ee4ec136da2d1851600fcfe84f49ebf01278c494a6726b9af652a3dfa760a4d73a1258a35bcdfde47a765dc8b241e6ee6564ee4296f73ad4d7c091c7cce06d51dbfea57fe40dd4e1e5ebaf81b97f744d8d80a9a42d8aae7218943e95d6bea6b9b7682d1e842576255d5742e1e0247012281c520f28a552522ae9bdf7fe4b8f5d165b9c54e5468f3a5c581b8e3c7c52208dd3eead54896a6da53f54890ad4e2ac774ab9ddd0a3d391482badb4d49150eb56b0d68bdc0a76f6dba694a342ad15278167ecccd899a18219b1192a98b13363c746656a60f69c2a2dce96523a95524a29bf9320ad2a2dda29a5ece94e9802e8b3cf59aa5406f69f36c84c5b063e3285a5276152ca19529ff31ad12d1865a94496405b18923b6c049e485abc7986b3680778d46c349ba13cd211cfd01b359bacdd34ecce349b7e51cd46b3c93d9114f5abc226926ef587f31a2991c213a270c4fbe9fdf47e4601cb96d37e1e575f1ec1e367cb22b148210e31cfeeb3d6b396b3e2056577edbf8aedfa2d60bed7dd20ab13e77b21ab0b7188b9fbaeeb42b9d10e420be90fbaf7eebd7befe496e52acf00047e021e3f6baceffd7188dfffee85e3bd9de69493d7f49c74e95efb8e1b5b0bf0ef3ad677c3bfe39e0b457791c3c31982a02a98edd42dd702a3c55b2fdd52736c4de07bdfbf20aa5abb525b7fd24a6b7b0ea8bc42ddfdb3cefaf2566d0bb5bf209d1afd5a27a5af7594baceac93cad4e9dd7dbdae9456ea31587105dc3f7962393773d2233c7f0ae2ab704f1855b63fa5dfc99616a707e1f92ffd1465caf7b0c51278c438d52feaa966a754724ce926a223d582544acab06d7bdae992d1deb9fef490d2e992f5475ac14db2481a56972c4f1b8a89773ccf0078566578e9c98926e27ee35133d749f91fc8361c7fd4cdcecc85f737b07e773d8756eb3af6de6b5fd3b4ab59549094b74aa6e10fbaf9b3e937f63ff9c1175fbf1763950ad3fe1fee7e250b7d0f174181d04995d17bb2935ec0248f0dcc80517a95aa87b29433298d7a4a0fc4c394422448dd24d26f40d3344dd3be3045b2802c7a1c8683b7fcefc558f5432d792e39029b884f17e924d3c3a1a54514bda74f22dffcb9d12a825380ebdb2ed26d3e2d0a817598afa3650bef5b220dbb2733c032d7b07d5abcd6d6edda1e79ccac437d1d3a5a2fc863e6da455ad442add6deef22b3bed56c6c5bc8da5e87faf3372ebc51ff472789d19e4813699f7e7592168b34ac8fbae50fa3a54514ff8960ec6d84023cf64df6bf3dfdb240454179be0c6b4a095383947e1e39ac14b691abe6d164d522569d45fdaa3f9320f19f462da7ff75236fa30da81c96836ccd274ae23018aa57e1171d3c5cc0b416fa0bd97dc8ee41646fa312606a94bdbd2765484a29a5ec809d4d195da3693387d99f8bf17f36d4dee479a8e74c7e858927a70c49c5514ebdc9772afa96bea56fbf9339dcf78464ef39efb9d47328d4a7ee4f2688f0c9f34b9f059f2c95902510168872077a73061b5ccaa40fbd295d44951004c7d4cbd0a2054bc5c4e4498f3a51ad58bd4af52bc071a53a0167667d0d40a1645e815a815a61626262b262f535c0e457843db43cda2f8e06f9d228abd5cca793152bbe1bb771509f8dce2ad4db9fc106a39ef4b45fa890b56366d4f74073ea779472ea39ee5326dfa6af01a937097b9819f5a7cf062a4c852bde942e5a38063c764e003cfba352612cfd6a9df6a81ea950d6b48782fd99b5477d0da06f85fae543f4c8e9c341dffee97b98f9148ea7473d35d2af91fbcd7beda9ac5ff8c3318988e5fbde7bffdde0ac1077219a90accd7083493a709f922e2b5efb668174393151fd09f7276f028eaa93700538f3f73520f55ceab9efda3bc926e0c87de7b4a899fc4bebf4106b517b6e44752c9d003cc93dcb67a36b7953ba4c19d4f398d924ec9b1651e198fa14e90bc5407374e818aa736c62634a07f5da7fa8f7be1b29d400bc295d6ce8d0382d6acf63e6beb16028069f2104786c9bac69df40faa58da5df5efbe6e9970ea5ff70dc9fdf7d374aa16c71867da7f44abadca5215b16d98e26d9fe276173e62dededf5a48bf72d3fd8cad019befd7af1130647fa43d69e04de976e9b7ef96b1afd41b6b427010ab2f65f3862ca82ac3db5912c5ad8855cddc2de99c9a7338749983bcbf53b967ded459eff22634dd3ee0da5bc76f645469966afb141b9c1ce7191b9f8c99de24998f51b18f92f1a26618cb215e2b059d4adfedb17778d1097b6426679bc321ff278f3d838336c1c1417e099a5108e0092475a24468bfc7c2e92fb69cc69cc43b1c51a26d4cc72c061c6083cbf0ba41ca8348fd36539c9148d8800000200002314000028140a078442d170381eeabae41e14800b8b984676549a09b320875114640c4204294300002030022040188940006561ca06619e3e86dedf1f3151fb10db6297be6ae06a411fde88dbfca7a6fdc18212b2c60a603ae25def70fb27ce1ca3a97cf76772b9d5e3c0cc44fa4c62dbc0721a5255108b4fddd815167f0b9fbe15f2fc7050fccf39bd9f09bc55270197d1ecc643bcb64f94c25b98beabe6fd8129697fb8c74a85861138f73a9f0b006b42ce8d886de629e886d54b1dd13e6cc9fc6207e025fb71ef42445838a5840950335d876374f50a6db03872d976d88221a13aaeadb3b6f4057f8d2e1be5c78ca07aab2843137621112970ea64a0edfbe56a4d01f9d7c8ba3e5acad9aa8a2d9218019d607d0bc2dbe3964120dac101814330188954e5913502cda3ca16de0f824d1e97fa8aa54e6e62402e473663447f55212b8247be729ce1999a488d29b9df1a06050cf0096fb15312e9f321b3c10059fb5de31316fb65c17c84c6dfee6e4bb953e25c93ade158bbdeafa81d89b87dbe6de3563bbc99e6be2a39987261a142d34251e4d464820c8603c0abc6c4490cfdb479665f742c3cc630d9218ac77553484d47712013e920e80deb715ad0104bd4a142b197b9c050748b4003e0edc3554b4628681efc72211b18acd2fc453d1765e7808eaf9be5ad422955bbb1e35e893b181c6c529ac12c2258abbdae6983c03fcce43275f501eeace5693a35c91873d0516976fd35425cb3b4a0bd019abcafb11f55903e35e6c330ada8017f8fac2e23a2de4eda8c1f805742fbb109a303a4366b21c458672be271239ee98ffb3cf2a7b35d880c48b2c44f1ebca887eabbb559af04bea1a934865c02ec6e0a9fc5a5921c3bc85032d9b57f4da4a39ce3e53b2af2e5b48aef973215c07efa10c031741980e7e683429a0e0bbdeea0e01d5b67bf65b0c678e4f6bc986e89ffd317df248574c3c35527701fee37afbcb1bd6b69d61f637413ff371ff1bf9084f61bee11f5c137e4fc6cd7faa5877603ba6c6425e5f047ba355769a87a8246df0de3fb730e9f8d153d0e11ad30761066dd1680548fb9b272adc7fb696ae33d94bea930ada820d3fa3e3edade21604414d82f382e9b855601bd87e98a2fad00e7bb67b92fa68b97c40b8b03f0672d2f34e88cc0af4c32e9e13d13603378b3ac0e3733a002f3beeb110cc236b502fe3e121fe06f7790a92ff7d159520eafb0a06c8d9322d9b4210fa61ce7ace9b8e8fcec5e421d8230c5054477728f2baf53be50e0b77a437433fd8c36dd67205063e4b0f5b306a26aff233601da39d5038bb5fe3d298e90e76ecd44a3b621eaf4c29b96182baed661dfd6fd33d218f5d7cca85cc5ef9709177747b2a4902c79cba34a5d1b508da107291f4bed75dc427c6e4367fa5ac9242c2fb500fc880d8558fbc9efc12a3922d9bbd04a777fd2b21f132a208527de62913873118132496a9079604ac11243d0bea4386b2d3655b4f56be1cbc97125a86b3bbfe65171462ef66405b654b78ec25981960834907ea8c1f9c1e293639b8b686472356ed12397b81e9d65802450ba633098763aeafe0d04700c4ff4185672dcb0dcebfc6e8ba7dd4ee583cce51e05cd4492f2cfa48cf6ecf76aeec996a6f3e89d4cbe493e90c52392787c1811e4c2f2926dde212ad502d61a2260b969573ca0efe97ab5b769ced047c881c1999a0e099b19ea548f9f773616cebf626a50670d08fdd000cc0092b985b86cde97d50ad1fb01c678050a78c8f605dc731b6b06b3c0114150349cb178f8a921df123e61b34f8bcde9caeb22b0434676dd022a094c6060f1f04cdf2319c62a8e80d783717d94059dafdb8c8afc61cf03610c3a5c6cefb4b13ed877167311a3ac44f6d62ce6967a6680e465c2895b818512fd0bec2ef2a911026ac421ef12a5616f3e614ec9a1881d1d7b3b6dc0a9d0f03960c9dd4ae5059aa5542d5521f19a15b5fad0098d603356dee08340163f1aefb3881dd6cc387a6d3c645b100785171df082155df1a080a518a7dc6fe580b7e02d557653081a2d5bf8cb5a9d7a2d2e130c001ed94c01bea5c5da835532bb0f621416e8e341a31866d8404e6a98f6e5dba294b23ccac04b2aa0ec56432066bd7945e46223be2c6e3aa62cf8ee73f855dad861048c881702b5c6b27f2c022554785b55886a4c8b668bf5d6acf8a7d274a19558f7207443dc3fae16ece4046389dae937f2ee45afe03b20c91d6f4451bba459de0aa9e7a7c71fa9f066dabc79327d16606cf07928f9368ffc6695214878c17b4fa0220abd727bd16345443fe5bc4c50406c44d7a6f67cddd4808ec7564d77749b492213ae6a712f6fca83d1d299729be1d363f8f4126afbe5c14e5c372b4218edcc5b5997a32e88129aa3a38fa3865a3a41fb41eaf77421a3ae64d6b54cba96715732e85666ddcabc0b197745065dc9d495ccbb9079d72943d285c42f90894f56e553851f3319752f83ee65de950cba94599732ef86ccbb914177327427f32e64dcb5ccba9069b75aa6b44be593ca7cbd775f8850c4ca6895cf4bc8027ba9a02280dea363351382c4ca4af47c01ba1f755c06676f2a8aade460247d96219b2e4330cbed61fbced02519db11747a5936903095c1d3e3a5394929589df40d37648f4c8f9db9f657fe84979c98ca7a8162b25881a5e880672e6aed4695b62f8bc6da3e53854bb9c1a6dc07a5add1a25030f4534d2dee00df3a726f59ec87e40a01f1c710e2b88c364454561564c362b1f635f387f7fffed078f5e2ed4342566405bc872d08020332c2cfe08fc362cc422aa299ad3794e8cef3c915a1f76d23fdd4641b9bf626abe750f9b550de2337c49eb47661ecc873434f312ed5692227effffd29ba7e639d6676aac48a3de8a7b75699ee9dcc140fe619ec833a51fef5059fe28d7e552463f893e943ccb07834b13fd95b67daaf2e7bd5cfd0dc6a2ba165a65d3fde0702eec5521bb7fa9b9a5b49e6e6ee5f5e191658646ee8810bccee5bec935020ac6261cde7f648c37b93d69245b9d4a235f50231c3ff9cb840b6e0e496a51410e188727ce01ee0af15247733f45f376f95311c99084086f7678a796f6dd53776ad1e4c2a400b6308ce8e40a6b1ddaa5f3dc4383c38ca4dede04c5b10c631979362907dd471d5172e802d80b0185492aa65fdb2d728b64591f429eafb953a41209f1ab2eaf12d1ec15767da4340bf551f2b5a10c5550487d88b3ac53a60a6002ec16d212cddeba31aea5a484575712b999f2c42308a960b1f827965e56986f18a246196febc047c4b8446c567281a8d75ee73842d0f5fc4021bd4165f6301cb9405bdefd9614cd30ce1c6ca2802b47ddf74b8ec62d31452fbc049b5aacfbc39ea7ccad63d0380820cbfda66aee1dae93e1a964b184f6cce4b36072c4951cbae1a73e7f3efda965fb45e6c3fbd4b4fb9f4dd063e67f6a7565a4ceba2e7610b12b6d59a8549e46e6d9e3318ba3370c46cb290285644eea1d61ad68d523991513b1288c83d12109d8e152d2936163aa839c5f0b99e6ddcfb69dd2936860c28f7b276cb84d770e8b5495485b2f4e894ea0af47dcad87e6f8fe94a8e5e6427cd76dd2c8416ce96f2cb3962d2ebccfcf0f7ba9f44f83787f3afea22bae3506953765e9ec2180e9f490420a0135f6bc1f8c406387896290ffb44188987d018eaed38fdf156ff0b43b1fc7379d9e75c6b391bb55e6250b8f179f26e99eb932002c97c4431ba6762f8bd51bd7732dbc25bba300d10b5e4773549cc5edd6cccc0c5a267d745519cfc06e16ae8c46d6527ccfe3a832823ea8f6006c22131840d306c967b577e772143d0ddf49750d4b41f6322cdc728eb60dc7a463738d5fcdaa8798d1b1bbc8ab2ce3b8349f9d55fd53de515d6e94c3e3747f81c08df05cd22458a577d64fc791b13d9291372d650bedad40bb1c514d02feb5c28fcce75b79d646095d9100b97fd9f73025d618ea067c13afd89b5eb32f55d50e538b6f0d520d6d4a53fce3326c2944ba89d3a7b5a278e124b0f7fb88d60eb1fd24ca9ebe8f5281d337121540420a038972e06a3af0463c2a0d34119629e0699cb163847b2aaa873ebb8a389f5f2fe11cf57c0b0226849e594a3d5467a9b698f71e4c468d50c2a21d7a08d2be4dd978b599165394595b41c0541cda85bae8a2cd755f81ef72ef688dfab176d46c28aed092b03a2a62d49b31ac3bfc7b22684f946f1925e3a9f8d174bdb26cd210353678d8e247c4a031eba05b5c54fb31958e7c49d2026b748bae2138a5c0f5501f349f796ed100f12c3dbd654e844fb1b721403a3033ab381c012fd5ca26d2f1b3ad617b5203f84739db1ab1c501116a1f3c3088895b87ce40d486c72d973f41bfd04226c5064406aa1d723735f91c87d1389ff918aaa0bead7fb5afefba6f78ce1d1a21bdffc43d54dbc9a934c0745ca03a7672603fa0ce78ce9cbdd3d0b0764161a29e71f785b072492105affe1343d2a64a1ae5ed58c4b5b3ce990df69290400d9865a0f543fdb362550fdcfdac7b8984b19b0fcb45eceda6416a981af2191f882a6724b40b4a853c2a54ddc8527f6b8e270511a0b5c3f1090a4104703947bf9f4f18a019ed57c6a80d3bc12f23442a40c877e0656df3d5d51e769004bc426f5c763f154049e99de330249924332b2059216c44c83f00c615dee0fbf92ab6c2c3b970f0f90decc86b0151178fff9087e6731076c8fb1c28ac04370dc539f68a293b5e31f100cd3b93268e8b3853316cf5a83009e2d066143126ed877bb297fae73a744bf55cede894c6f707332c591488e34e5a68ed89e88227465527bd799bc5d254494a84acf2cc61995002e468309f886c838aa3624a583f16f66f59ff83be8512c974bd850650158c345dcd70110ec19426e2eb97a9ee34fe5aa09bc33f6a4749a5fd5865b363fac35e5f47ef93449710c461cc3a2d654c8a3271328ef5f456ddcc90922d8584c6a42265bdd49589e57e1a470a13a7f37df82be4240d1356ae9a5eee45c2570d360d972ce1d52f782ec37f7d72d5ca4e5fd8384c6e1c7f4cd098a8471398d6a5adabbae069175b34b6ea20ac9a36a3b2b17d66c4301a41db031daf3dc4a09c91748f56dde65e75c4b3bc4557c2777e35cf534654bfb8a724d48d2a7c2409a85c6baabc586bac6b2b734ed81478b0ac3c76468d2c2606da6a06c1cc3a8516bbde822025e7595e98b7054d878bd7b7f8083d32d56d509d4050bc5b4be905a4c101e9bab4386f2b808eb8561b2b1028c4130d2910a6641c40d41a64b0b68c46a08f3a04ee7ae34aea1924746eb91884a3793518d8d2c9da157466146e7229a427f1c3602b8be7e9fb912823d8da6f7e1c24690802deca1545150c3e88614f56ba338b7872356a0ed6e9a70cbacbc77e61667daf43fb5e37e18cec3d3ce72c2e212d08d219dc0c40d80e3b836c9cb68a0b3fc22fcc7be840d588439c489831331e50717269cfe3ff218abba1b8079bfd8048959caa493133fe983bfae6117e1b66d8a6f3385e3c1e563c27f9c215f63cb6401e8cf3067c74d095780cc40ee97ebb8aad0fe3a14813227fd34298064a0e0c6d2cb3d792f8032d995f30a2e34695b836a3832a246d15f3a8c32ee46237294a7524a7b5c7191dc145f1352eef86f82769c2074dc7c08f5f902dcd46a5377a78c7783a21e3992514b7df4a55899b3af2e7c11edd0dedbdf0cb74333e509f0ac2854932f5ba7b3dc448ebb8883fa18c2c833911f72a9e8eb9b209eab803d46e49318805616204f7bb479f9156dd99c23e06b5fce948ff3a075efa7cc2770f9743221feb8ae35c55d269a59952c194dcb6acb59a0362279d39f4cb8fa9e24746a8325e1141b7b558a5a393c619e43fedbef22e81522dcbc00c055b610cd86cd433a133705d2becb1abff7c112cd25543f04898eabc66d5a623135310186d15a3ac9b2a793e3dec4f96c742cb4412f4f5deacddecdb9d1a8549f37c815ddf065206879b4ea1d8b884dd1950ec44c747a4341b5e23278bfce79451a1e11988bf1e5f10ac4f45ce45196cb500951e82a54c37886ed205e95e2ba15796428979c4a7b5778794dc3a292fe48b12485c2ac23bd4fed2d706e00a323a46b68056c5a04c64dbb4a301a45c1ca001c0b11894a3cef232938b52a424332b2f5f4b64a84df8df9f4cc824c063d372d8d822856753e7d7aae9ed16348d447628e1874ddbb1add54648983ee908d85afa620fd7e46462ef6b15e0a6d096976e287ad56d5db6e6cd198a66dd8caf4995ad470a6e5b0dd36e9e3b538c727d90daaa90518c461a6d5009bc4fcba3cfb4f16cf04920ba66bd5a338a1fe44f594eb737add3d51919d0cb1f1f88e05e4f674b5d9ab91745144206e73902260684a024344f9900953ba58ab7d74d0a182dc813917fbd2a3a35777eb0a4523f1f82c339dc6967afd6fd3538ebf5d272bcd35824b6b16b83f03c1b085196d23cac8127d0cc6314ecd081b39fc711831011b203c9c6d01c826ec0aa07114074b6216df2642459f2f58d9032e2848604bf3af1c14cab3fd08c07f65b1d7fe0c48ac68b207421fd908e64c3ebac1b4ba977305053a78707896021c1673dc3217236184740ce96d8c25b05817004df022b466a0a90d4680561fc7f9240055ab247b5c673e5592451be77217f7c4e374bd26e3bc5a4fd8d270a3ee64cff756e7ac2086ccd18139ff4c909d485a27a4912d3c2b6112aa65a49b958f784df4a7613dfdcbe5e83ae00753a661a4a963c3c21094de51c0d5ba58837abd716f3ae93be3ca0eaa81e74cbf23d924fdf63e85a88f94f4a3c0aa38f8645cbed3a8b87e8b2eb1c95f868eb3ef85dd49bac58371c362b26d5a482392dc1f44a3007481c748b8eee217df0553b99d10103d3c3299cf2a43744d0f5062aa821888ac472a812494a36e1683a199a5e55c11359284fcfbc455390057003e41a8b70df90618cb87af3343e579e895bcb2c2cd5a48e6907eab9271dfaa3b79be1505e130f280a1d7c097f29b0bb7abd4e4178b67305c7ed1c4a07ff3e6ed13f8d88902c6bebb58a54fe4f1e1a9cb3b5c99a76de4491ac09e2c7d61357bd138f1224624d83ce09febfbc75387ca9673618fa1ce4853cd353df6de934ba1e0470ec2c4dba8208ff35032ddd5bc90fc1bf4095c3231814ad1d785fcc4a5ceb90ce8798a36f9cd768478dfa0dcf11c6823005277294ef5ab3ad70dc44e1000ce05bec995e2ed5ba4f4857bdc4610e4475094914e57925d2a5076c5fb2df645bd345484d906c8fe8650ec931b7a8c725608bf2d1407988957e82cf5646e0d32df634035f064893da43e3a4ca80b92e80bf24241f6e6f25eddd2ef72d8dfade10e5b0a08102cc435a0b330f5d9f220453743a2768a1dfc79d37de28ca626336a681661753a34b5292093f97789645488092cc091ab886fdf0f2fbf3074e55d1151b5d671099d2d38eb87f630ca9a5a380afe6be49cb71570b501838603ca35e01e0802d1e2286076e5688c1d52c02da260afac4e9114eac6bceb967a140afb4c378b793e60b3a7ff88fe0c927d22794862c8eb670b2e4a62a754196e0f48cbbd508a1d824b3eb9f874ea0cf0e9308276dc6da39a3933b6261bbb3807b45ece3949f4d556830fa30cb834b923e0e2d78e5ad7002f52c42f96b41d16229c1ef64879c3e52a80188d42bcee505c0cf9afbb70728490e95ab59dc05396f4ba5a5d75d690d4386fe67a1f1d209d20dada15efeefac76fb67a3d03af49c45af93a7290ee9935bf9b0b8b9971a2d21b6f7a3e97ecaf2e49d5cb488596d208ad5a019d5fc03ef40cc34627cadfb96fda55ddf54adcbde7eda3f344c97c63cfbabb1c4bf5b846395abc4554bec0faba9c2e13c02c6fb081675046913399898cc72d86b96d1ff2caeff813093424028248b2ac563061a058ab3ca8499a7a15219d11c8696618ff616ae4e83d1b2fe1402e31b6a3e1941c6b71b84fc3b19fa920e187326e1d62afedcbe15306cc7304170bd4fe41af3fa5c4efc3c9dcc69bcb161854511a1b7cd07e2e3466e6588f8968c74966e163be81f03e28da0bd811854f2efa0d3e0ae2f1a2c1670c9ccb8aa22af172ad9ce1a3a8a4f7d82890cd22af0314bf38a96715a04c9b61f00d7f89ad5713db0206d5cffa6c56c21213c2ac27c00f532e1cafc94099d6133797b76c5f4fae0bf2a18508296a38ca19a4e9615de6b606398f5836ed1e2ba3df2694e3f12df796a4f5f4686ab0a2d8ea5f822fa71864e9d4ae5c3f3a8f7ea451a43154fe7ac87772541e2a43c4f6826d789674799807514eecc2cc6f4a99ec9f56739b9b4502507a7e704ecb0dc3f9d3862628d615e608ad014d635f45b480b01070caa12af40c1227c35ed4bcf352eea7ad4a1b5486982d2e71cfee7b57f50408a0e4dc150195f23fc3713cad395e4b3e12abbc9958e48d0b9b767cd42d6af84ba69f78e583ffd666665d6a7a1d7d0491eca53031193735ae842a6807607347768b8a3fedc48bf0369ad68b5447d9b6493fabb493954d1aca755ffbc5f5493d1c913a1914d264e8a002a1a05441dbc6935335cdc9891354d45c79ea4b2a28cdc832acc9001221d04faaf7e654bb3cd6c6f596a77f66f8d5723f1eb704b0970fb5c570cdca8984cc71d8bfc65999e9b9ea1ce86b54d9fbdb80698714312411532fa108a12d5113ff8e896c32d14be706623d8645b2d2e58c02360892a77c3ac6bbab349babb86702d0e32b7606dd0bdc49d9b4b1d5e0774bfbada12b003fcae69c971d9ccdc1fd7001253522fe8d7c915ec643bc29c1c7a657fb48f9b7f4a9014c186dd605f2ef0a22aa82cb4f55ddabf84fd0a5607a2bec7939ca55fffb20df4cf8cc5e2e2337797a874aa7ec9a59bf851adccea683ef37d415499a60aab794db6db8322c154908db71522754936f9a26109f89e6ee2e47f10f69cb504312158ab314bd90feabbeab379cdede16dc906228d5436801b55b6c756e675894235124dacada25be2c6e70fd74c01c903e944900796c36f084f9d4331147daeda19a9ae197c2e5613956fd25574bbd9e04d591a5dacfeaf02df28335d1214fb80eca11b97ba21d1956e120a9fb8feff9092a33586d364d35adb065dbd568006880d6fe968c83b1f514dc2ba616d2c5aa9fa69e6e2df4a48110db0d8e9890c9d6fc501ebb344bc141a3de22e0a8a234d8d522bdba7c1d506901f62486515e3f34e9bebd77d0cba57bacc99599672bbd32935b3f66dd58ee83191cb83d48876571d0921ca2c8ccfbe35b9b6f9e09319a40c140a75aa69c2bf63d8d6648204f9154e1c552193e5df1476cfa1f515d2eace24d2a2e6e48fcce037c587d890e97ccf0c3fb86864674de854fe7ec6bc44dfbec8c3b323b71290e9fe9bbb77502e4765351490480f0f96f9b8248d6f434e72ce871964343ce39c2d1919c64a8c397cf6671d648576d0d010ec0099359dd57ea86fc9c0097fc9ca941f98963ad10e95034c85823a90afa4e36da312113c60798a071c77fcc0e900302d86514095f7f2f5d3410ce1cc26b700d59632440fd141e8ebd1c709cd3d371e9c653bbd332a54150bc300298d4b53f96cfeba6fecfed92958788e5139103876c7360b05d2b8b3b3eba6c6cf0f412b057f8f8cd8fff50fad97ba201a5f5732939fdc7b9d9cb4b87440c3e658a3ac08435ba40a1f4580251d210b6b9538675e2cc288f6e582e1f2e210d0bea757eafcf10354c8921d4c7105b87315fc80c599db104d081021000e4fc532e54d462384bf00e2724338cd3819bcf07ee1e0676358961bec830750a3656d1648d31d12024e7ad3ecf4e744240a5b0a89d2540221bdf41baa3e5ee75aa6ed1518209ab6420e2761634ededc2dab777c625b3c09649c510a4d50414bf65c875ad26d94deb284819ced9fd099597384da8b380b3377291ccb6e64d27c6ec41845fd7cf6e9d0a4d709c38d2551ab8533aca3c66c86702a967d8be689a5a84b9b734290a1fe9f34620dd2597815f4a24f330b1761b1347865d307eb7c8c0ed2b65825aa9536e06fc9ca48583d50a138ad54f4b65ca252c052c252c46ddeaeddda98f2fa1efc8cdcd2a2bd06d309f4a61696aee944656d814c330f241e2c502bd51f1fa14b1524a16ebfc71b4599b92057ccb0cea7e275feee4d1e5938612254b69cc08f062c0880e87250c6c8f65a8b6f12dd73e4a91ffe1dcb031221091f24c1e594492f5f565a82416f2c88cc335a0060626820b90921fe0f028525357766c67d76c2eb5833a50c3a82c01fc487b74a5ec5d7cc6346f282b13f3bfe1da52109f2ba624cceb2775392dada66238dbc93d99fe2df60a37148af2e6acad92d30e0f459efb1477365b53451367defcfae8ee1bf323d203575e7cac4f64e5f0862f4ae47a924d225d7c37d1a40aaa47153b9a29c5dc68d665d6fd48dd309148142244f47feb489b9f492ca4c9e260aad4f8ef9fff57a2998f6397dca3fc718e1b475e80010872bc9ba3127d5628335ac8cf7dce25ab53a3357761606ff4f6459ce479e506548ce3ea3ad28246adc0be20477e6120f1ba7737a72f57c2ce34ef8ea9650d98be426c7b08c30912776e93b6a7e0a6398f7da0d61d5f5b80e765382fdf571a1b9d814d8838ca0f702e6b5ec95d7c2e628e5035beb0485f28105d07c4b3acdae7466653f21fbabcba7a358c9b575707970487a5c859d01f7b6e4120a7df64426d8243fa1f3d9b45d7d854d2c5cc9deea17fa3eeb5ab7afa91a178ecd8ec3d4974723fdc177f093b0e346beb15a905be1e2f1c3643c719c4feb7f4828025357b2e5c2509e80f22770cd78a28f497ba90f66ddc3d62f1930ae9a110a34e8e2d95a04e8ddee0eed2123625433a76bf8c504a6ca3d25854d06da1cf7eb8bfe626a0e761c6bdd707f1217e08ec588818c4d8c67d265269905c4265dc8cffe26b9cd73117a786631d856da0af8faf868498b392f77aa7df18aaabcc5bf56610fd0a131536ab0902c69af82905f018c33953dabf1c8f7e34d6ecd8bb512d81b0711fa261a6c156b1aa93c362d07e0d6b100c4cd3c8ed4514a9b23a9ef5b084fd9fb4ba23c295b0cb49f6a9cb3ac51ee7f1ded2d2b14e3c1a3e800c19578654d1c3f11756f246a835a878a95d595a3468ff7309d8f5f9f79c3926562e132e9d85e998a394341a3bc079603cbf20c14e68dce1fe8e57aac78bbda9531f9acb55553aacaadb589beddca31b153b924685e64c868520bcb2d8ecfef635ebc5def42554525886d3f625d8bc7d60765efd231aa60c690ccc240896f14a69b5a4d15d80d49b879e6b70b73993f6ab9b7860f5c9338513e6e93afd19827b43c52e1c253ab09ec7072d0bf6079f8fe02c3fe17cf6dab2d8a20313e636dd92ca812a0803d3e52bac7c192d03928a8b0ddf1f4bb991705a0f6c553422ae375dcbe4a5dea003eca02b491a8fc66d02f135a275abea79f8467a6bb55180b4183066ef1399324e58820ace4d12c761f7ddb23d65003666c6adc9d3d07484a46a20e7c12a7654cb6a3ebf01db5ac3c85185715ab32c3d526a3487bbe321f0216ae964e5e46263a44733b51938df82b6d8abd819ad3f2021319c22fa90909a69c641dfecd6150c96055d02c870306318536f7a0e23376323d8570311e50d47a67cd3498d848ea2a16be892da5ce6f00475d933c7ea6aeaab8ab41153286774c18b1fb497c8226df6c5c98b3fc33b1e43aa0f9ffc3abee8de018eacfd22838927095c4ef3a33c05c5314d14914959d75e11ad195027d76015c84278c78f913d1360b7c4b8a767b9c0ccd42610aedc82d4c26a6886c7aa14a767fcaa41bc7ed1562e706606077acc28b8a2ec981b4dab72efcd69543da6e726bfffa94d498c4d84cc0d451cfd917737c6961dd9d473def6af4eaba7b7b32354b16c99cdd0e30ae5d315ee02f45d6eba9abe063cf6bf05e2c60496b27b622ecb88f8fabc9f65241ea7ce70c2dc27855d70859da2a39ea67f2a5f90ce74e88f9254ae2f8fecdd2ab4265446581ca401a89705312422766bf6e89de035fdaea69b6b72b15efa65d324848cd123eb56c8cc41167672c423f4eeea7d0e78a208e0d1d452a5a4d00ef677c26b594b81709f03dabed04900e7cb6a75a7f152f4b8f8cad51646bbd8ef14244704d58db2d187d0ff56f96c54c61154ec8266573716fa50110fdb74a3d12689c55c4e57d5fb3fbeb8f7a8cffb84acf0cc9366accbf1242745bb2683cd7845c2242ece7a210a472c45dcbc706f21aea75ec0d4e9c320dfd4078aa1d7c4a8f0c4f4fe292e86621853a7d46aede8ceb4c45be7b1d1d36a99fb2dd8c6c5f63fedddf341b5e10d516a0b7feac7cde8c815d3173f82634afe515b61ec1922e71aad1165f5bf8498eb09725a6486fc9c202448cb44f0ca51a383c1130bd26e2f9a94c544b7d29e6f45d72da373767dfe8cab817f345c314b4c849b022bd276e5d23125bd6312cc492ff11fb525f51b2c755da2c609fa109bfc2068b5e54ea0d0dd35ccf9fff5d0829880ceaf233b7349cd918c6688e4bfd434a3a0bb53d2bab5dbb9780c26d8a52d928b26b850cee844ec92c7ca5136d634c37e0566a40ccf62c7b725e00cace0cada64ef7d881b12c798e804954a3b135c6f9790c289852f23041d6bdb00a695e019a43891ddd9d7fc5b4a3c611ee1a7b0e3eb9a7370c00fb69e4ed7d910960221ab0e9f98a51ef9121a1588e0a2f31df5552a3c3d092ca504b4c2698a3a2ccad89b9ad762cbd1e578c1a6ad9d8e419f4bb6fb04053a295d2e5869174bb26e265b3934ff3da7c77b5facfc6df843bb19cbd258ba3fa485fc3d21c57c621ca166590333fceb26ff6c16c07521174e1ad744eefd11bee29280c273ac38a72f95e7ef0d9d34d8e8fb5ca3c94353d30067bdc568d94ebf51a788decbd528c9b42c3e7194f99e1f58baa0e6d6ea3fb2af9a16886a239d982375bb9527c68f55153300e1e28d8a0176c006acd68bf451aae0c614e2059230ee6a100572ae24481082fc1c8235f60310849533d04b8d472d7b0a4757a7cf7a5f2d3713db348d03e6e536533bd27c51e2b4ca4e3eda666932d4456f29109abfbf8c9f624c513e24c05f5824302d1f2c02f67c68940516f92ad60b400e177bab01a018aa8eef309070ca69c634eb4142fbed5375a4010435e240520ad652f51e1c11ec4a541b5dcf8d724889156259da3c45deb9cdfd0f0e8f5a6fc26140c48fbe12f6ef00530fd093fcb44f39c4dbc1d82933dcac810e8ddce93edd4709ad552d599eda6858fb4b59c40e42cf474d6d83226f539a8e9410fdcca9b5ecefc41ed32b74341623d15e1a9bf702b154663c2eec0e1e6e7457eea408ed959c13d61d85fc423a69f4fbcc6fe2023d41ace61511314bbf78f39998841eab4b4fc97fa2cc7a693818097e51d4f3a43c990a2277134b1116bff011a564f295afb2528d8e522868449b232662c639139c540bda032f77bac3ee46b1cc60ef2153c38fe2be423a81ee061e9f470611c1671be0d839983952d213e1e14e78dd19dd0392a18845750ff36d1330f9802f0cf23620760a60ae3804070ab9137eb747f44ade44a2a4918f996e7c989898426f1c6be2cd39455ed8b9f1f00cddfd3f70440f06e2fe5f8830eba1e13e12d1df6906780f183b67a6da4448fcdc08afbbdae845ce82e2f78d85d36b7434e0f83c52c14a8abd70d8c3908af8d07dc20b0f09d7778b1ab1e62111ab404cc4931be177cf881e2d30960fed8bc30dc55eb82ee851c589fb4c75d952892e9eeb3d3465ca789cf60c13306951eb27b8910f0bb1835b1121ed8d49e8d390ed1bbf058fd2478fb6745fa2596d311d5ce7a842910cb6d5f2e24f59c523e7d64fd1bea0d311db36e455e48af1e8f893e9e7e949101be5fb37fe9b801e9a47b83ceda46e573cd46b7a265130c26f49e5ced426b69d1bb7f228b112d35a7401620bdde85e04ada131f0a7421e93a35b8d95277c5ff0694249011d21ff09e6f0a682527b65b340168bc01dd30d9edf41e210834bae6f32208fcde8796cce3082ee55c5cc028dc66a9d3b128c0d5a571ffa4bd0d8f6ba1836a11af6c099d26b90f0d3cf260b9076bd027ae59fc645b0479423d06911db66b2c359c653abec60f8194f55b1fd8be42b776f02ef083e7528299823d4bf07ffa0d40a98f7f1e1c2993037135dc95c8b6b090e1950b681b346da051280cf439e400d99eee0ab0163e63ca2726e8612d7ca13906e43a0f541ab2dc090c4832ee94041638273a03f6d308c068fdd8ee38e5b5efef636138f0c658233f521d0bd9edea902c1f4ca98715b6e9c6c55cc5b2a65754be18c7a28d26b9720ef301395ce68c376bb0fa023eec8831c2391a45d7c0c02daa7ee7bea88d9ac744627ca1b9016f759b1107c000571a9470916251296ce945d36faa6f95fc07446d1167fedfa234c677a5b72143f027f6a24e1f8720d4dd64eaf3d01a7115c5e95edd1a7ea5de73c91d81398d3a6e5d00b38ecc3c54d93c46fa81dd16fbdb0a03bed8cbeccb5a0b6e09040cc9cc16c3babe156f2d9ed92f0ca0cd21313dbe9997d24ee0db7b9816c0d88d2a52ed2c08906fbf1f51196f7510baa538b483260fab4c454f45ed2d9cd466f8429aa8fb39d967b7aa7ba83a4ad879b4e34afa0942c46f555ca8f8be966a62be33f2bd7a34a59cee4b37d93bd6885509756186ab423a3023e2d51e820a5aea733b77fa6bf064e6bea27f572e1d60cd8573ff5eadc9ac37ce013d72b5b847fb93ed9d9ea95970b56b619bf32c75dceb28c7866221b1e6658cead69786340887a72072fbeacbd2b189832ccca85034a1599092b8067f92510b4740310ea3559280daf9834e01794fb22dd5224d49570db28d81ef5488caf75db8183939844646fc4cab394c48f1ae76b9b7743b47ef6490665eb9806ab9b67f85d2c6fb48b87177e1499250969cf55ad3e1df7ab6dd6183c7e227e0d491c28b68d6b9aed77548017480f2dec1c1d26acf2c423525b3fb232ad5e7fbc153d2e5f51d01804db709e9f4296c3b014e0f787d6b9cf28d2ae8693214ed6b95f5286001bc3063412abd49eb06b92e5302ea9d6ffd848e06890183e0319c7d004835a3412473ef129c926f6c94ca750a7b88c49a3593ee65de535977a87f00e55592245722831c59b707818ce704eaf4ce0e9899ab0ef929e8004fcabd464408c81720b50307360547f53467ef7fe8c91a08d5c7d21390c3f7829498ad181dbbe9145e159fc72deb03b15f6b15b669d407a785b75c6e34b88996abb87f0eed73c791c7be187efd2429440c656fdf7ef191300b42e0289925ee01d00c9f72a501d49a1038a4a89947ec32b153995e920abf2e837f12515f90ae5bd5ff9454b94909090d789e4a520562031b5fbd875d39e266a1ed5e6a854201692c310823924b8da41ad2f827516825afe0cd681026a6be6189b71cd6d3cd98d8b9baf7aac6d66f2158f2346170a8a48d21ca606ec98412dacb15637855ccb2643607aa3609cf00f5b45aafe3ff681bb0a009f27a8bcc64b79dad4f31d531a6092ddaa81749b961ce26fe143c386bc811bb06b7859600cc80a56a5d9bf3396897b6545c0041291e8991b881f134b5a74f86b805ab3953984869b77b585a114f494511adc2b09d3b622bc4cb3153becdea2ce66d93031218020618419e6c4ed87310536993119e5eeccd7c062b6ac0610d789eb44f74919fa2b7ae0f9ede1483dbfc6b5012722a5fda2f04f1432d188d5578a0d44331e0a7a3552c6f4d00b47ea293061a9161518f0634b4970f63306ec40485bcf86fba2452678afbefbcce399c9ac62994bee8fc5ea9869925dd2c561451486c249b67fb3cba01eedc69bdd4c9191266dc90b5a929f24a9ae59c868998fc4ede95e30c29a0d51c1f63548a496629a50c3a4690ad72b665f8c34da99422aadb2238bbd9b3b40371f02b026458ee5f598ce6d0963f129dfaf8fc091cc5a99131641b723cf111ca5a38c7f04255cdba924cc021521e5f5ec1a6c250f8da1fcedbeecea82279244e547044ed05807a1a4903395023dcd3dcf7d3184e83d89b7fef509d479290d2a5e7c2880ddcaa97cf93e3938f8512586b061acbdb07e586b8432f5bc7c9287600af72c0bea0c12515f9d3255ae399b251bbc7a34cd06c6b61c4d9f7739ad331800f61244a90dc27e04dd4aa618827350ca3141b5239381aebb2604fb48758c1cc7e22d9dbd0f04e0043ab6ff71a686cced3968e14262b064080bd11080ffbdb2092c9906309147105303fa821bb7a5e60a400926a095c48c8ced56d8f9870adf2b00199b4e4a2ca46fbc060801238262400ad0cf40c089a2c9ba6305e75d209e628fe5e545b69862f491198760957522fb3860ea07c7cce95827495c2211bce842ce170add4f1796c105ffd81d88ba5197c4bc88a17168eb7a628867e7dccb9c543d6712fa4fa0c80405952001606b23302cff7b0f11582de20385ad4ce92267d84efc17bd524b72247e28ecb692ffb0614c0f98c97fb3b503b77ea9af2905b32d41566b8801fdaa2a039b1c2821a6f5117a8813121bb8bc8611f57365e2e05a620f3e6eaa6b17daddd4d7fb1d1f903ea51409685b02b3fead865ea1db371889a1681f9c267b8d4d264c1f31cd17efff1f2c6e61866114fdcaa9024e24f1b52ee54aba1529460706e58255c53174e47c5565f48bd028fb6dcba73fdbfe179830ebc817ff10ad66d0dd470018e47bff90955a47c923381e4343ca010c4ff521cbc846c09aa5a1338b392f2ab6438388bc2572e62b513c8607620d4cf35df590f4936edbe432d6cf2852552dad0d69cfe94b2c5d8adbce80242157da952d715f4c9ab6f88e948ca22b662ecc04d80d36cdde2777a10422639476ce0ece564d7e1d5a3f9d3f2f108d2a7e0bf4077190a25aab42181bc5de4b5114ce1470c81bd4e73088be0195615cbfb23c950ef164d85e9b21e875e7f092ac8112db238775365e91af1b30d78e6fb091881a42a8e3a02907e1077acbf6d8d4af5ace8a60bb66135dd8d15857a81718f0633b9d61b74e96a57da7219e995445f37ce7ba724ea212f27157573e201ddeb83b5ed2802bd9a715cfd661667994d0a1dcad01c735a220b26ca9e9b143dc507c641a10ad5179d56fe35a41caa93c68d1813c1b14bb4e0feaab75baeb28fb13a9850ab061839c0800a3d8a8967f0215734f19475e609223c3a1a44474155251ea6e47790887f8beccfb8379652a0b794cbaaa8208ea428029f1473e05abe35e237e17def9fe8923310a2a575d71b481f16a04e79b17f223b724a2aa837b285e87c6b78454f210ed1c6f83abf4616b27a803de34a2389c2c14122a87cfc7756368728a78260d1639afacbf52cd35224f8adacac730ed294601945f51e2262530239184be9a7d2fc29807e60ab878847642363cd203831ebe3888e48a0fe01063e582e519f8fd2b324a5705330ec42a091c1e3ff85e65b5dbe2b55ddfe09133d1212da3aac6a6a2b0987f44db813e80bc4e60db56f52d64c9d3cc5e003b4478082692b20f4ce29100a478270db4fa0b5a7554a87d80b317f71fe825296cfdac49b1bd7c187d62407824715c7de8799f11669183fd0e0fa3faa5ae0b2207f92adaf6637207cb60fef23f7b0d43102d68f2bb7212a2c5b20ca57d29b901f1bd58ff69701fc47e0391e58867a442466db14ea746672857646fc90227c7e5adc9439388eba953449a9132a5dd300c776bdafd8b749046e2182e9d1799d80320100ee42d96021a17e758bc0e86a9559009d20d40865c222e1d752b6c486b9899d34d6f4f210531928269b57cec6a2c0c02e585c079db90fc1bcf66a557457b38e4232d9cad40ff5c91ec26b7a90fb0c891cc166d82bc2e562ce1dc001b24fdcfd156078002bd82b7a9aebd82c262522ae55f8895e6b9a6a825b2d1274d41bd952785e98a2e7d3d12bf62ae99b9a9f86139842909e6345353276592cc79ab80691a4c4f28e2273f2c62d5fce1c6103715679e425e0ec4437203782391ec5a00d862c8b67637228d1c84f7e43188b055c1284fa6c90c392adb4f02ad52b6b449f7de21469aafc0ff9cc18706ad55702c5291fb56ed5a74cd14a4d2f4ef68c1aeec0fc90a55c5789732dcac29cef8850ba22ab15259ee31124f0251544d8cecf21063459891ca8f254b9670d133d8364b4c0948509b3ff676c27e616865360a9b6415641238b9b04e5d5470040ffcb92bec4440cf4422c3dcd0f9c3c4b52461a2a638335b1638e5c7605bf4cbfeef565db3f685cdb6df280ff162f147e59e62c175a720860798fa72c7da306bd8a2f539d4c89dae99d7b6db12d1cd681d83018a96bba4555859229f92766bf3a201f89bc537c441b2c648e3247394045d55a800aad3e0d3722948255513baec15733069f59eb4e8da94c829c9209c8a5de7fb15df462c8685143d016b0ed34aadeff976c8a036f4d62684ce4578e6dc59de08fe6772d4949f1099a8456d0cb8a853475dfc3b8664515287412a18020296124667a3d0a929f2b403772347fdbd5028e12b815a8d306ecf2d3de2d18c6a54c53a738b0ede9aff18b3af41f228e8105b1721f46a203f1dd3954b30f00dc410ba82c532aef1c8c1f5362b35fb137519aaaa0727c1a14df14dc42a073cf3262c58161b60f7fde56288156281b1369274df6570292e21550baa2bf4c6210277b00d26e986e017021899f9a66afea54c8d278d24af9b4621e01bc52b4212f276bb41ea5e053a1059d75284ed3e2079185cd82076f7b75a8578ec5a02eb4245b9bd8301e78dda880ed5806096342f28bae5f70366537c124a134ddcf7ccc950c2089a20923a18a56eb41200f81b19b078b01e99dcd2c2d3b8943dfe55f613edb4a017c79d1746cbd522fd08d5190488204a5e4255708b39df9da5006b839fd641a39f3533a57673ce9c48256e6bf365b6e7b106bef490181479391d643a04ff2363ee21e69821d6485a56899605b636978828a5f23e7525bd0a0ee78ca109d3809471a865543058692618ab9c7dbfe2eddef55a8b9db58b93d9a564f0b583d386fbb95faccf8d21121ca176edd4f33e6af053395f094dbc0d61b524ed13594f421beb6237116b7be422115f7757adf6b75c9e6a7ef5005ae604d28471a7a61da1f9ea4f9a57f4dfcbf3fc75799733664d7e898e9fc9b0421057ba97f9512b7751e4757d9120b730ba4b9f38914767bef421eef6e7466e3b2f926c6b3bdc80debd9c95947f8c75c51676bbe2644f0627f689996dac3fd8dcd4a42f77f1662a80260e09323fa412074d064977ba4242879bde219c3388c74836c3780c41d89123349a27f38b70de43cc3a3e62a33044f7e91d0da2bf19f7e04d044155ac4fa087212bc129b5e69e3a4c34cc77055a39316001c87fd32fc187277c0b7db7c86bd3648ca218d2263771ad3ddc6a0676bbf6f11135607436962b22debdd1c39c06b5e6e1ae0801e9df3d783c245aee76052f470f8a33fd62c3b3cc8f37cab02238a73d0f41d649790188b9474695b9d1d5e5ab85efe065fa0a4b69a4311ab23f49110ecb1707a5ac7da0b547889c3d69111ad976eed5a104f689b98f83e0d9f310a51dfa02043306f49f003a76d4da647339792d2ecf161f1331af9152db3f08bcdde602a0717610d2554c6d8afc09ed081396832b16223932b183393121f9bfa35897a91b664f1702ed0bd7e698e4075fb1fe53677cd024fa135f5809a361ae89db64e491b74a4e5f19e8f3c22cc465794317eb6e39cbe3511ecbffeb7f4e06121a05b959379bd211d47e532c8919e6c8afee48776b40fd5b711a9b22cd476e88d933b8215e0b45179a8dfb1cf30e6e770afc352d7c4abc20f0c3d5879f63e15574e9da446a666612840d993ac3b07a5894fe43a7a3c196b66e1e686e5928c22a4bd0ced21d917a77a1ff688fad29888e9fcc28cd21180080dcacd13d0bd93b50db661108302837e8a7a186595d81f72895d59564e68692059d62eacbfab3ff40f839798cc0d6f3302197c061c6f110b058928da94b5c007e5ba094115b4606aeb057551394d1e1c21606ab54558c6ace50648fef0dcb7aefa81471cf753198d25c2c2ed3378a280c1f0fd14fa3191524e55fd434612a3eb29f13a362f12071471acd15b865554949840aa52eeaec6b4a3a7906c71e5538101a8b7bd88c34a52f876b2f387b850650d3bfb36c748d28a2e422f4e021ffcfb2b3a00f3d448cb2c591b3afd73cc29158ad29123737c61033df827f0860ae42b66b0e433b36646b8ee1b9c913b89d3198ad40437752413a74ec79c853440025c0c0602475360770c4ee418b14a79be4a24b4c130b50b050b959952e87f4ac25681b98b9d5c0210a02108b877b3450801384c07f3472f0a09f582003c4ec69e7423576cbc46269b2e5b391a8359977261bd5060109b8824ec96c7ec4df195dd15d581afd067dfcbf7b658ead7813062e34940b852dfb0769550d8ad32415db2caa0bb30f0d413288317ae6d8c4d9b18f08cb0c9840486e1a879046f81160de082be7f327e70be2b0cb85cba2fb100dc6f185dc79369d61e9c8e7212f1d5ec59f3a1cdb8ad486e23e8ac74cc146efcd210f7345a6dfc0666fa986f5cf354b2e7aca1363a2122506f73cf16bb7661089dfacab693e0001b895a00260e9c0fcdb0b5af6d8dbe80744570ac8b238a428f8709be6aac23bd195ddc4b73d5265749ab98f205a09fc3774db5d9b9b47bb6304c7533c17c0ef3bf4a713dc1331e30aa4a0e3bfa9d2aa6481e447a45d161de1b3026f3c0b6b7a8ccc1b6b6e5d9b08d761982e3ea0bd8a8e5a268c369074f4f808d8867e0099c66322973ff04b68688d453500c018c4eba4532bf79ba8ed4b81c5d9f4e5694e1147784a72b95e76cb942a7feb4fe32cacb729a32ba2745e20c35a21f3c7e9a84bde5e2f1bcd905f011bd5532199e82fe9bb1592a49a0a58103f56030a41cc43423b1fd1d73e2249ea6ad042a165a82e4925f48f1c71ba041681069a6d9777ba0c6d2012dcd841a9e4b47361d717a1ead06cc471dc5399eddfc681d567793d5eeb7332bb5453b69f98a341bcd49984d2bf808e7d1b539ebc55104ef30465053fc89f7a134aba2ee0077a28f9d08ca69296dbfba3694c21af5e97ef494d06fb18d1327a6a56d014c601ad324a1261a99bd0ec4501339cf74ac2490e6efa40d355e4a796245619fcda571644e1acc9fa5efb23ce02c20a6cb1aff6c8fe001037ebd9e3f9957e793d5257b3c891f4f79208003b13e23833b1882a0b8b50a221bb90964e41b0de346eaf8dfcfc01173d6d60906510ae439cab6fcfb6f2d0427dfdb4ac6ffada674427a1dc4e9a5339edca01640d963baa742e584e8bc824973e779141869afaca51853e60b85c803dbcfa5bfb7609adff8f1b55b0c5aa7ae2274eb660482b094a49eb5719ab4000940a30623770c4a365ca581488c30557b8e10c67dce01cc7b8e1008738e116c738c11907b8c00d175ce11e075ce31e275ce0d4b1d3a577b1145e02a308c2c22e0103d86109d0183b00ffa6a475bdfe4a2c8987eb988f75338786594b48829e12523289eb0bd72a6d3819d7060a5a184c18243150047eb1c4fa299a6bc435c9b3b93d58c61c323dd7244476b4859c4e81e68afb8cf2b39c16b9932b7a3a1c91840a2fba7914ec70e7f3118fb69b949971c4785396d6b54c4e99b45fdf4494a4f15a26a5382dd737090569bb9ec996f29de6eb98d81d1ce32587f6b87ee9e25745d177111d51591464c55dcc86b9a49f833f2516e84380944455c112582d2de3ca52837501f229087ab18ec473fce8e69d32797aa5dc0c2351008031dcb506a2fb7d17eed850157efb2f16c62c273fe6f79a4944358922e6e3872abfeb9ab57a3589b0778dec85bfa4c0a06f1c9b3cdc2d33c42593cb165929860b753f32f7f78496cbf4bb8bd0a526761d8d6caaced04283c4fdbbd49b34af8750f9b8e604237422a94e9a9193141424aad33c43b713493ac608e46459fbe031f264727a180c1a3192b898e859f9c99337a1ac04751757c682d9f744b3c9e923bb8941833bff002488f16831adcd2a02010bdcdbc783f976b05dcc974f0429e3956e60f7b8ae1f5437b63882fa45ad7fd8025d3756b25ca9ea5a45318493f194a2609197fea49a8c6bb5bc8099e07326253209cd38d82b9a5d58fda85d9e9cfc1fdb196409e7abc3213bf2698682dccc6a7ff39e9d8772edee1ab4f6fe534fd890f611aace802be785acbdced6bb79c5f9ca23e9a0237d5d16d476c551739212252173321ef565f29222231f669fc3fdf69210b0c377eb4b5540e1accc7b2c7f116269cf18a4a8044657c7cb8f0c1d08fd6c090661a53f02be8a79bea84caa0d0fc94361f30d16f0b899b0f7a5dbbf0a744d1ae8aeb07a02034d428c03f59039a7c0d0ae8e82d3cc0ee123a1aad13391696f31c3a5486354e847a1842a05020a064de6f5e854c6f7505df2193001b67871aa6ab2d8762dc692ca071450bf1384031e8d9a81a06d8780b94871a80a6fbb9822a15ec4e6960f09add2d593f9111e9fe8d417cd65509aac909c7497484f5aac765ad1f274b32941323c209f04f395a9d0f9e02edb1e373eaeabf97495ad28dfb6e75a8b13334f783be9fa7b0a7f7f0adc31b2baa1409ca81661ad8bf4d81c68df97276c0459aa65257315f33a862301149c679d12807f821494dfa26479a71566badb18160df9088002118408b34af3080a724106af521936683dc39369f6de0bff3ebefcb0c60b080f2c18807aae65d0fd9f176c40089892fae81d1e924b5a90097d6aabe96fb258f9f6905a6dea25a5a4be45ba4bd4a38f707431435e5f94a34f6d2d2ae12428c42c6387c24cd8eda2d495632e44900073cfade3ca5a2cf6c492cc76923ab4005379924d99bee5e950d60ef1c5e11aad5200b11cbe6a4ce8e3af94cac3de7ae63be3e58251b08db2195ac0018082d36dfef636f8fce14f2012dd0ee94f609cd70a3c33cd1751d6dfa49327f9bf4fb50c27b83911ad4ae1dc5982ac81c6ea2673e66d180960324204b7bde53aef01c662def9714493a4286173a43ee1fbfaa8afbd509b89baed8a8723cd329768c3bf48689a957158a6f204a191c711552b3fe9fc9fd067d552bcafa0003052fdfbd1638f2a62f15550e64590b74818fb445005a511afab71b41a7b2536b6820246e62c5e0f5812cbcf32262360a21efff8a946599bf3c5c5bd6e2e8518c484bec41691554ecab448d3c1c264cc5221a95ba55e9ccf8576f490d8b5910f90deba44f02b28200d6f409384a371fda872466146e7e713c7a5cae465c8ee1594b5aead3e04237f182e827bcae9434a8ec7e9a0a51522b499e94f19ddcd05da0a0a45386db8935650c0c96a2d3104d0575af5c223050d5051564843dc03e312b9215d41a92f23d11802b35e87969eb8b8728f220a520fe07f8fad2b51385f28965f48a29c2f710b5f962117717d1d51aedf0268002c4a5d44b919cec9208337f4768f17178942adb42e4b9868452901435e1488b2cfa539d3ec4d941f1205a0d2d8d43bc4334c4aac8b7481405797c5afba26fcb836a24bf8d83e8906460b7777923a4cffd4d70e4b9785ddddfa10e04084f4bad1777a1828dfea45b0f21296a53ab46430a3677cf5a0db0495d0da294a37ee0a14085921bc33496b95952920a81dcce9b890772b4f51ea3298cc8a4136c19d0ebd2f5d201186a72321c5d6f0b879a5f08fcb9758ea1dce3c4f5474a4ffc28209e341e9b5d9b2a0c00fbfe57a9893bd9977d9f4026cea8ad56c03b05e4166bd23259394ded07ede8491011fe1382a4e48efc5eede8c59a7d85adf370b12911b1dac34af9b88b3e2b12d7238a9fb32f388e9e78d4bd1d3197b5e68cac730acc1583980ae7ae40c036caf45a6ae3f0367a762e2b10763e518bae291d41db555c9ef4516b22aca92e23cb893588a056ba1862eb0a6389667e5694caffe0585e66e4860e5b2a401f4edca6eb10414bfb2ce01a209ee32f5ab26ac9103ba19d0437af0eae964abe0addcefb5f887dc50c0b7be40575f55df87658cd64c4e2d35655adc3eeb177f75d4d182be37de37ce122efabf00851f54210af0af3d9c4bd9419f948816ae904cdf1a4d4bc7cd490bc0db8d9f3b305bd9b85e72b549c0ba874586b800a3031eb9a31e3596df8cfd62b8196ba13d3b8fdfb763f986ad2e0090434e364cd8f9d80cf80f9dac156828a5e39ea4b8b0f9846c6793a27d1cc92f805cb1c784e9dbf97de42cd065ad21698341eec4cd8401694c89a1c1fbc34563c89bfb52a8caa433161a10cd7907930ba193c5a57bab762ff92575bb4a9164855ae23b06be5c629e4b639e4be41b5bdb320cc30e37d82de00b5bc0fccb7accaf44e6bffffd30e6cb053697ef5b86bdbf34060b34ac78c243c6719d5be4a55007f662af24e2aaf4581bc933ee40e12fec4a2946be2c343b057d959120ea07f476dcd2d0a4f23e192e23426ee83656997a16e151b503f51538089f2208a3fc0731124c3d8ed5e97de742e426c2c057d4593c469e7df59c8ea2ffcd014ac640af8463b69dcff0607ca200dca7c183f67e139ca965e8a4e2c24c286022bb8406e1d5fc895ce5f3273e742476553b402abd96b314b53be7f6fac7cd28be42fe03e119d6737d1fca763cab183d8f691775f41e6fe055a9ab2411a6591696321a9a0c0979a10dbdc20e3fce4ba95440a26c1420bb47206ff19dd0b6207191e7b7084c607ebf2d06983af8d8fa030a7fc583a2a5a3a987f77fa356476909170bc1440b1fb0d768c7d3e3ff75d6a6374138563b146f7625f8916e19c346214b0d84f7ddfbf648c2bb394540fc3efb478e68c4f4eabd6e1b24a5f9c13a92539d81b3e52d3c69cc5f766ff8f4ebb48a578dd056c4d668d1920f559c3e15c4cb45a0718d0558d3f48f9791f3bf588967ad03a2c17516459c6c21d006ec3565618e8b533672f2f54a90139faf63fa762f10fd5aebe8ea28d65f60270c355e3887991e11b411b224e9226ea92751c3fddeef8f8f2e06e928a219e035d750fcc4bcf87c3df4cb0c86c46aa63d604b15a32bdad4f1a61c6f51474756729cdca6450cef7ec34ed450fbf20dd5d61bbe147538e286cd82a4073aa7491720e6187834ccf1f3bd2083dcbb46d7aad43026996f3c42f85bd27c4b508013cc70a382c805a7721007a844ba169a5baa6c381e5a5bd916201aaf7166ce942065bfbea99e5cd40c6cb07b98a9df1f943888ba85e7b375090b0c0a7539004bf0875591d203c4c1eb114c112a0a2648f6458cf431c4c61cd8613569515c90bcce21c3c894c2e99a1218e3c0a359fd482af95b77ee66a1366c946e89f6c509d15f0ef1234f67bf22801242125ff883febed457ec199a1905e5152cf92e63370b8f88486f308cd7d567941fcf6526b488ec8d8974963a0e2525b32ff1ef0e6171b04e50d4cf4ecb80e55f79671dbd769a6cd60841a9baa41cd3a9e80593b6e6917e25dc0831907efd286ce4161882721cb31eb7b2b8d39c4de5f00f446b6ae41f35c4179ed66219d9a872144e2217a5eb200a522ec2c4b0efafe890a6716e412c675065cec789ecb584fe736c8a491bc827fee51e3e432249e8949cbb79553ba78ca3d0bc7ecc64380c7c6c7003d4d81de5c670a974a17f1edaa7938cbd7de998d77c11d5e65477cdbf990fd4816b3e03a6870ae44b44e077f956c6957b64e6240efe44653aaf8bd7624099e64acec7c607caca0e926f765c9111cdd031831f10accb9721246b0ba48750b25de56c61ffffef6b8d29954abd5cb4eccfd4dd47ba124323c61b06192fd8f81aa4dc2145900824b4df4764130518d985bfecccd22a8f9e168e3cd2fcba356351f1ba558bdf658c6acd85d96ded29b062eecd7c37d4c5921cbb45692537f9d8c793696669138a9914c7c8af8bf6ba03abf607a6347dc4380e3c76ddabdadf9014ed13427f473641688a52cc7ff75510f1a1724435c0773f33c216bdbb71efa3fddd4481c8dd0d57a4094b40b16b60c404be9b69f9425e98d4218ee4644dd5ac41757e79adf21324cda8b1afd07052d0cadff0a343416c2af026c1a876394c4667836d0ac079fe04684adc65a471e2862868f225df0580a3a60ab4f3696faf6df5b4730aee07339db3390327c112cf8a0cbe0e2b7a2a20596e998248d42ce226390b9e3fc9aefb52f64c9dc94dffc682c1feee047b62e2404e8da5c476605b5a53b8f9e398d53d3c9137051acc1329df85a055b2bac07cf07635b9cc4fd6f5c8bdafb383ba7d83ad5064608ef01d3e214bd7c2c8aa4c5aac82afffd57285fa1ab7e72b969781d69d4480520dc93037ea87efbc27804e59cdce9bad26a2571c87ab2b59ea76eaeb05a4805cbb0407df88d8148f9d12c6167ca0612702e1ca2bce22734b97f8aef7dff7da289a6c0cd28536e3a13804ddc199ee1ac6027693a420f543c238718e353c847f9840b5686ddc4c8ff8675ddd5deb183b822e56f4fd576a7d872f66a3cb8ed5a7fd7937ce6bb67d2a7cc091bceabed1fd1d8b84f803bee409286f2debb2fa4ed71d2db21d2989d9f1fc2629a2c4d4a2d97827d5ccbaa5cab2f3a07387b1896e01f3b1d4ad5d91a0a880efd947b98943d16624cf3996de7254f6d8a53d84c20a3b8badf707238f5ec3996cf745ad2d866bc53851715bec7930947b6dedd1e6d9355df782b1b41a4cd020d8407356a406e5152e363e61527b903d76b29fb5e58bc9640f1b33573f8a7775bad75131b6a6de98bc5371902bd2847d84eae4bdd71703ecd9f15d42657016eb251c907b57ff043e3588f3917c183edface0220d487ace0878936b733006aebd33f27b97ecbf53ebce248e6df108c63d40c21359b60137c9e6b95d3eb3fe1a33a996a4a547798e1f6908de2a1268440a045ef5f4a6e42cf435a6453c63ffd971a2884498c8fbb4ed925cca4e4a732c09708b2a3e1701a48f7d5dd424f32d3aa07c1ee93a4619ea92d9dc2d0b7b44b7b52c9ad9ef1c4871bc11ae9e66389cf2e2ff0e31c456fabbc93c512cc32f1c80097c4f962326c10c55aa64912aebcb5f93270716892c75bf29c6908f54517e82b0e524d1d5dfde979e231d2099bd2c3d4940111f8992c620cbf38224741f6e844bd2df6a640d1457f6f4c570143ac60d7b9221a9a1e9ced2f0ed3e7c682c65485da8db6bcef8fd13842446b9478e1ff8d0933ab98f1faba0bb9c0cdc096a4f2a24a5213d7eaa132c4249d58be054b473ac26e3e5ca1ab2653793d1a0f6861de89fcaa37606a33d9c09ea5c073eb5546afcc56ab2f54fdbd813e356ae7d13f369ee2b7ac45506ea1e9fda4e768b4a30c81ee79a864a2d2ae2e45217695c76c178a14ebec1d4b767b1adb1511dd6e29dc1a00accd2453b7ff7d89161919e0309ebc8f394e4a98e48870b137747f65c8a383da4446a2d0b0fbef4054dbd55e49640834af6d49b19c89a27bb2e591243e2fe63a20afe62ed473c4e9f81c2e458e4993d59f1b32f36712e3d3e61d2371ecc453207ae58b60a9189f6cd26d7b2cbf150c155cf2c09ae347f4151e80d93f7c2d3f43f17b18fc3050e525b6652e64212fbda06baa6ccb970629c383585dc6675cb9f657826e1df21095b2a5df3a16321cad82031dfda07707638a0d3a4980edc494bfad54d2311788ad4ebb665f256e5665ca28da69442e68f1b752218dc7fcdb0fcb9eb60af808a06c1fd6991d11b039285e2748bea75456f7764b84850597588c626d1b93599d3705cd80fb7b61c1652ddda4ec8750f7a0d3ff23f46171ea6e402ec2d80282f43261414b8866afe8f0bf63621f0e7225ca453e8ac4f623d63344687cf9822650741cd3bc3bbc7f8523aa18b4ab3ea29d7f2efb9cfdda5b18672ac40ae60c61b5818674bd5517456f9429396ecafcd0e77ae3c7ffc799b85ae9a5b82087983389908418ba3330f90f7fedbb9384ae9354f56ca64536bda19c9fdbf82006ffc405a81b0e7e3017e986688eb7a86e7485be020945e83f4cda2e8e8d0f4d3a2ff659fb7a3162e7cda1e59af9dd1e535dfc2d43dac90560b76acdf11cb6042cd6694bf83c9ac5e6715c4bed23865dfc307a9396a7149fb3188bbc07ac353d1282392bfeeb4357ed05c7c0d6e6f840820683b6e49bb50a3725810673e2edec7e93d7159614497a34a036262276928be63993c350ded7624b3546fe2fd4110256581a86ce9330301fef727e2a519474c1543627a90f6e091baf1ec72a1f1526ffe70c9913719e87f7a687f3338c801dcefa1009376ca2d9216a08361fd220a53959e9c95a471e3d182777088073d764819afc8de4be54bf62104029d7b99170a644e9a772db4cac16e016239674868e12059aba542288b0e304b18b0e4eb0fe9f8d1f81129a234b54b216d4d0ab1351e64ce403e9606253beb32fcbcfe445f5c35f85fc2ee6c8a2912a89028a85d6d76ba44e9624d2d796456d3618ac28b468cbb68279b98707b19fff79231e14e73dc0fb337c51079133b118ac118a220f5f0202ab9aab6310f100dd3f7ce5dccd13bb1ca02c3efa033a21814829e27abc5bce782fe3a77a842ec78a6c72cad583a984b7e4d8f53938e2c7cb61f616b1b743369f9458b94841d86969826060afb84f817d511a942862ee4d061563460ca57a5ac2527a44002578003072d3df1bd87348f65a3f6c0d1348565fb63fa9bf1344a85fd447c2712a147976e92c16c7bcb96391408c28f4a306636d55a1940014ff18459cb03078946b50daf71f8c6eaf5e2d0903abad836e70ae750050d39126642f5015860287370a01c3b41cb3bbb2ca328cec9fb98b46c2959f18da3e84ffeed188eacf027b2ea736a09cc85ecb15b6e61df5294f40367e7a3db522bcbfa60aa3607749bc535cd8dcda9830068cd83b3bb4e05022056669835c3008b8d06eb2907fed57e98ba6a697d6cfaa1e60497b854b60fe1eee3eaad9fcaf97c040b9aa052204a4730541fe5fc8448c03977abf071eb3b1b8b9eac8664bc339b2a005053b10d3204ba226f9ab25489229adb1156e6627017fc5944e4e5fb70c0babef84c5e0c2738655975c5b1319925d736e90e5bfa29c38c1d0b5a7b9b4cdd45d5892d7abfd6773787e8c87c62ca3f643ee5dd12e0f9e30dd934c5ac2004801fdd2ee845a888412a5eaabc404aa48a39f219078263544dee93ff52bc5c3f66aa58e9a8950377e5fdb09ccafaa0b564e5713f6d91a1725374037aa7faa94d92d55041311f07e9accd3a02ee2e0feb258dc9c5e4948c7cc09f4ca21295594001af4d01b4b19ec508acd43cd3fd4957c620e97272b820d46068cac26513a8b452e4572b5c69f3e8d6b0bc365c6793c2c9e904749afd394e4cc72459590ea91720618a57d8025823c074d0e30436e41e8f2c0b3b6a687a9aeff9d94af570244c324eb5a4cbf71f20e48e5146f65a986694b08412de1474673051457a90fcf7bbdc26875662b372619a9fc23361dc46d6e386c97b423b6bbb4da753bf649338ea6bead2a322224bb758a27d3ce5f224512faf6ca895dbffed6270eba980fc186bdb5d1550099fad1523367ffbdb2bf1424a903fe85135f32e06a064f31b6a87d612530c61d6cfebeac20db7edb977f1052d94cf261c103cf67cde0f8b80ac7f17747afa702740374aecc157bed312b15f23a174062c7520580986260527aebab49743d9bd1320089643d7e64400886a7bcc95246d5b44323fde311685128db52cd975d856dbf795a4d08412a40f892143a121de612858c9e72256846a4c1a687245f02097a8a27f892062a90e762ab17b0a1d9313bd21b509a1715216e3461176b3e3409fc83aa1de0d105b4d82b07759950380f834093ceb836e671294eddb379324dc4839c0dc5d37d10601b777412c5edcfc584e537da260e0e70dffd7f28d24f3f9ef06944ba23eaf09650e3ac4344c30e78f0db4376ec89782f8cb3fe1c837daa21925271f48568badbba6dd726c8d221c9a25dc4fdf02a49993d81e34d04f84bee380192a2d7aca5412a860371b137266352ce673a467a8faafe72794d717c0621c6ecf3424c745c4f61ed4e22044c594e0dae1842d70031423ba40cd631276575dae84dfc916c6745706798a7b89caed18b67da8dc095b3a89f1d3c82a6d41c39f76e8d6a2811452a4429f96993648efeeefee38c29fd74ab4424d87aa10def95f24f304d7748011a39189001ab18159ca4cf556ade9fa324b87f57cd648403c410f315e3e242208defac8aefacb61b8cd49e36b4340420c27838b7d31a315de632b8bb9a2d771c66649d7abf86413f9586e74e3c3347ad3654429e406bad0df48ba9468252e85fb3d274c6b8625d4ca51fcc464bb37883e4e42162a3c793c24d0f75aecb4ed14598e6001403a2c625f78b0bf589b1c4d998eab95fd4e880d2173a4cca4c1de95acd88654d56c0f8731e86e468c479a86de83e4666c7f4c96f051ee74e72da3873846dbb676a7310d055583aab9fd05b86d8e429cbda8a5124059cdf372a1826b8103a8467c68e72543eec084439537f0a7c3711fe1998d03be816aa59f6c82eacadc590e0bcc6bc8c4f1ec339f24a86cf44e84dfbe1216dfca763001dd486d409c34d416044c2e8e03d27f36b0fe4c93353af0420ab3d9c7d42b53b17d5f969d3959c60895233a3c8366be72294992c7112c8acd7eb4426dfb0a39b091fcdd32c45d330ede59e02cbf5599d767706a72a04250035e19f8295f9954f5ba83254032d121ef6b48dd8749ad378d2bd61e8320460c7a646e3ecfa59e767862b88b2f932e2ac35df60041a90d03c7cae9978b9f03603b388298e92d9a81d8009b1d26da2aeb235ac4a3d39c995d347d6e7f06c0713d19063abfafb096722de42b2a3a9f919ff38b24cfa8cd2a2b03e2a1f9a1348dc2bf93cf38084851b54262b061cc4b1ee60e84ad71e7f1ba1e41214e8481835deb2dbce3644d51bd8c0b755e4216ce951d4ce108261c924cb9df342346e7f0501c03a00d8c8a87436cea9b9ad5b30396eaae561579de0a2729984948dbe38cb06fc886243a54d7bb77e3cabc18170ea3305fc0d477ec658bd0feb69aeb8515dc0b52d7a62fda8a2f32d0c207c1a71159706ebd8f4f053979ea138d7d9f8daec0f1ca466b251a812d21d748146eed58718a0913a23fc9ef5d1863ae926b0d90f22e363269e2cf6f206e320e885efad1289f58edbed3169592f8b273425f1b3a419afb9b1bcdc475225eb8925d3377436793e6f6644cf92cce3a0c8e3c5e530b1a9059ec4c26af61d092a9caadc4475b99c80033a68815122cccd4a9213c78f38a8f50b6d0d0fd28d1aa99fa79c1465dff00c4c201d1aeb57e7e75fc15a076c76922c4a63ec743a12cc2365da42f9400925169488c11b74c41d2451815c796c3ad29fc0692ac9fd0bbab06068591b5ba78e805af73b8f461e537526932f5591dc89542f9d98b4fc1077cde6593ba1a1e68b07c340543a1d54c1716ffc841b7fcf40fc6d3d801166020a7cd1f71141ca40f41ab7e4a825272b284148e974752bd38d89f0f4d55efd3bd829b6345549f4a605a92e0eb226cdb87682d17e260340ac583b092e2b95ee6fa1163759a7ec56551aa72ade8b22052b8d494ef3efa85c4e5fa156f33d260faa6755b83ce1686d6a97ec8c6dc9e421f89148fd3d24a6c25c62517521707f1092101d77a8428939ad868c1cc183bcf65032b68f997ce483245a6eb0a04bcdbd3357e1567b6ae2bfe932a8994f706d58f48694d2f3b1018e7310ab165fd446e894b6724a10cd870302a45c7b7767a46835a2af63b5088b7ea88b8a9886be021ebd87fa2ee89206e7a658471cebc8f20b8767da5d4444dd3bdee6e11168be68725ec2f8dd31dcf3da98bc6e17ee7ba17b0c0a94f4c6efbdd3377bd26363be14a6e640a0a3763631385222d17a2905e049243792a83a96db67eb0519a8d96f4272b3b6d266a44320b3f5925a6a4c819f5aa5dc63e57995298f2f67867c2db3e0f18e3b7ab4598136689d0cd40e1965fb5bb39ba0607677d19f3c8fac49e803dcebf684ed1a0f5977844bb799fff215ad06e57b079d601f841b8eadc8fccd79170060e50db356dfee309276e35277920af1de1ff22960a430b70617a5caa883c505d860ae1805a9c58ac7852535ab7466978e31cae711ce24389ec98540b68279a4cb22f0feaa82d3419032e072201b02b384ffe1a45a812c3eb95701df2ceadb779e10361bc74bf0f016792dcd9985102c2ee642313f859db0ea47f8e265bf0e72b1377c89b5c2d71471930cceb326200d9e51aecbe7a9d0e66a82031072c505e6631c366c82901969067596d369cd5b00859e2c2e08c49da5f7c8d8f3ba0e09dae23860c1898c281a1c4f7cb720013d65b0cc512df244d853c21e92a78af14d44b6a9de79a94a37b148b3ea6400740a0134e16b2e69c18ea71cc29c2255fb5f7a64c0355cbc9d9f576381b163184f7d123d3f6eb8be99579360781a2c66ca14e2ddd46c5785971b4016fb4a98fc5462e1ca99df5eb756d82b0cf480a81f20cc0455def31de3eda9f0b11cc26b1cc19d195f24f68348edd363ca8fc32e73ee92427691496ec88fa6f06708fbf3335193fecbe6fec43faf593d671d7049eee307e9084f871c25384ed8b63b5cf9fbf54264ae67f0f18c7d9d409412c31d77bee2eec05c33c9bbdae563ba4667f904f0f242d724fda02f679998395e3d4de91619b053c73d8ab3cb7fa2e144e085a237e1a9c636d5a8300318b9b3896317306d065a8768feae459f7497847b0dcfdb0f339d8d363c80734eb73218877b992ec1bc6dceed024b1eebbf7dd682c3702d58f79e62c1d43fdbed240dec20a09a127dcd51b1c604594e9ea9d07b395408c25cfbc284b003ab10429557c5749ff6e075fba641d517d2547003f5ffc58743c19df5ddb2820c7ac34c9289f4d126de174bcd0589b17d4141eebb6dce6c746cbf35bfade3bebcc4d0a07bd05b055ccc798d0aba4625422a5d71ec928e49e9626b7eabaf7988c81d4648abd47d0ffe0522833b7f620ad32e96b61e7b3e576b6d3a0d95085bec9ab176835306284f28627143ee895016cae02da3c86715a301c156d3a197b0e3dc9dc7bee56f83bc29ab3b697df5e183ac56f7a2511d7cb00e71cc6351bc1c5460e07f77bbac830816001a0a57244d3329dbec06eb396b25fe590f2d2fe5f4c63c6105c77c7d9ad9b8888086db2f7967b07bd061e076d07a9fbd00547929d3299ec14ca4ed92993c9f7608b0d048381601f2c73c9f71f0b6d849503b2402cd6bdb702ab48d57831f9a652a99a7cdf7db2f09eae4ce823cb9048de934cbee7c4cb59d87509490bb3300bbb2ef97e83826873898b58560e8bc5cac9f7dd4641977c4197544d2a95c263bda7d52f664f32f6644ff62493eff168afb5607b3f1d1d3c1dbe1da32f87fb609ea8d31f172aaae7e3f9bc30533ef27bcd9427885ec5c9f72da7eff5e5b4e883f5e81e6cc9a25871eaabe634a9eb97a3f3a713d360700cc7704c8321d1429810d5a51d3e9d1c9837d21923cda9afb05ad2627574e94ad7434321518cc1f2ed7af2b52ef9def6b5f1d37189d59277ea510f5df1443055ee6f4c488b69316f041d1cf23d477a2d4f10edcb70952f15c3552d7daf7055a449e5f7c2374d2abd1e3be35693c6efd524fcfb2fa74ba3df7f3adfcec7d324ec71e3cd55554bdfab8e6ee88a4855eebd963aba17c55a55379a86caf7e0e85d9d788ab27faf5aeae628fbbd9885ca90bdfca6a9ecccb9c83cefabbf2bb7791841971edd7723d8d2524bdfab47f79ae6b57c1e0bc45207a3e3e383a726cda6756a17aca73b8cd4d5a3fb197834867a74af65bd53efbfd7bd48fb5ef5257a2d2e5daaa8eab5b4e4fb8aaa1593a52fa747f77b91dfab45f7f56d4394f6c00f5e1ef54ecd70937562b90cac2ce6ecbbf7dd03ef7dcf50df3dfcec7b9685ca106c37346ee41bc28a5504921fe96290402c692eb54c02f107109a7f742f4a48422d5a8c8040da49485d623421de57cffb788439cbddbdd924cea3ded8997edf773fef7a17889aefa89d689a663f356bad5df1e1f06ebed137acbe69d2e76a9c69025f5b8a694a82ee5c22bc7f1f590282dfe7dbe11d24bf7f648def236d1469527db79af403b39ae47d3ce847c4f70cfc76e0671ef69e79efc46a3f92ed4fb27df70e46f865187b0fc18fe5bbf7ddc35f067ae0177add3dcf7b671ee08e1004596bdbb90401f8c570116716c59e29f6314ee23d104daa17a2493fc21bd3f4793d01a649c5eb3b156312a1f8f0839fe167e1985dc5679c390cc91ff8f8e0bb8fc7f7ecdcb7037bcf4833d4e449863c6bcae0ca5d0ede4ca19fd9db51b3d6224a3e7bcdb4e336cfbba0a66d0d866409828cc96cb435bbb68225131604bd7f5e28731accbe4cd0b0d281e5eccfdcfdb7a3b53244a445a918b1ec99d651ef7d399eb373769ab2eefb7068199d243c674731778c71c761ae047364093e16c27be6ddfb91fdce0821dbb82dc38d6a91901e653dd32a6e669aa810a6a96b9a8eb31fcbbdf73d7c18d1a28a83418d5441c5adbd27b4721589881d4e0e54de3c4b4c42c935652040e94399525fcac873927746d5deca24719fff61ce592ae5d922ad2ff5e58ab45f4e2be4f9054c928d16e5f91cb304441db1e84a8f27641fa6b69197a83de80a3d5115caddd9a2e44c8b44322dea1a678aea67cd53656b9e86cd517dc77a276f2f3b97f444bd3b96cff7f3b273dc98630e71b7b2af3049f478ce028474a5796f1cf5a5c2bc8865cbd04c3522b45332ad9a53a5cab55e0b64203753eff3a324a5a133542543a44b34488feed763e6ec18df7b9f6376dbec9c46dacc9ee338aec2dcec711cc7611ad9f6787377df9d2bda1dd1cd73a6d47eb5cd4bd4dae1d89ad23429ab332d6a3104f15e451b241bd6af0c6b51ebb4a8be45a69fdf8e16b973705c4d10678bb8e397edaa2f6468c9dccbfac2ddc85c8dcccdc85cef64ce2473dcbd2e35c77974a43098a2fa70a44ecc5165c00f6e3047f595c2cc32cc2fe4fa2945ae3408f4895ceb0b664a7d494f90ebe9c755148b060d512edb55ebcbebad5d5f5fe82abf9a04a32bca6a8d41a79ece509a928a8787a1301f18572da9d03e0f8921d1555f5a541f442c69905c83dc4f9025cb506d790da30bddcc5d985150a888ce144a9bec2cedd91283889a37b36d0b42268133de38f2521a84e3344e3bfd70705ad6d9464fb069da464ff3dbf3bdd9b6dd6dde793321e08b483f6f1f45d4eaba1d387bdf578620099cbb3391319e9fe3fdbdcfe67c93e69cf79e8e7d6ad1bdfd927dce5b6d461ae69c9e8906c299bdd666cd894eac25b24422739fe3f60c1f889a8d6dadb5d65abb911a890426db5a6badb5b6d65a6badd5964b684d889963c2bed65ab32c3b096c0491bd890fdc87ea883611822032b289ecd5be49eac37cf6811e6600ca10e4729ee39e917306609eda19c4fc78d0cc69992be9eec8c474a5ded0c44d0e15e0d083203e506fbbbbbbbbbbbbadb527818d202cd944257bc091259d5847f4216826b4f69650df7934357a2db445eb71ce6b325d9a938e1e9026d17fbe9c3d3d8f40629a7ccc14daa345f43334d08d5c636a564558b55297d82296f42546489e9fa4d7284b4e1cafbb860a336d8f0e21121292939084587c2c24a190c9496e42428642a19291e6501552636a0caaaa12a9a9ea040909edec6285b35aad70588c8c8c8c8c8c8c8442a1874223231f4b686484e4a1938446463e3232126331d23c12eb51034c0d525dd6100a91590c4d4c4c0c4d0b1008040281402323231f1901813e96111028f491874640a08340a01bd08d4b0a3bb0d71446465a2dc6ce2cc6ce5dd69209c984a8f87c3e9fcfe70302810e027d567c2ca0cf67e4a08f803e9f7f3e1f22347f88ccf4a0480dcd0f4020f2d5f37abd7a5688a2288aa2f8f97cfef9882a3e968f2882fe39e8438aa248b338f64b9b20d3a73a06d528f87cc8156367152b9cd56a85037edff77ddf278ae245f1fb6411bfef73f11f91fcbe0f46f307d371e9e10983184313131343137a9ee7799ef77ddfe7891fcbe779e2bf8b9e178e347bb4864593405fae165dc2473b8363e7eeb6dc96db728570dbb66ddbb6799e77cfdb3e59bc6dfbeefdf3c8926edb466364a80c323d0d9da143280d3c8f7cf5bc5eaf9e4ed3344dd3b46ddbbe6dda27cba6691ed5b41e9ab51edac206147da127376c63676e85b35aad70326badb5d66a9a76cd7eb268d66a6449adb5ae8933a9c0a39363058dc6d41286554b4357b4562826a6eb3b7cefbdf75e6bedf53e167b2fbdb7c6ad61a365a707da391b3b773c7828a209ac8e2ad56c4a1aab56ab69774f2ff4fb63b9a4d6dd980cb95e9482d8c7b05679333d4a4bae316c13c3056229ca33bc50abd59a97c39a0d7115621dc3b2463f4fa34b18b6327f98227aad554b06d06e4b8a0c0557ae2a1efd0e30c91a315c20625809131b913c638400039456e1068a28b45aad56abd56ab55a2d28a080028a28a288228a28a288228a28a288220a28a080020a28a0609dc195c5dcaf628baaa689757a33a5ce16d10885268d4c96759a7af6fbabcebe7b9169b35b0d3a99beb5d66ac41c56a35ac8f625cef477ae501caa623f4d4f8825109c9b7e2c5454b2a304e51aa25594515a64c7a9626f63b4962f792788f5f7d969cbb4d48af3d629ca4c2c8c1ce6acbbbf1e439c76d31796a29b2865d8cab4da9b616de33aef0343bbca36771f152b40232c5a84485c94989cbc80316ab56d46fe3b185e7c114dea78f854b52a54e21a5555ef5ca9d54555aaca4557c295268aaeac552f15e4c4bd343155c2554cc7bc12e4fb70855dd8d5249c2ecd90e19d87d193f1625ad4d2a37b917a296d88cbce84393c0c653cec5c2e972b4479d8c562618c879d4aa55285e4c3eee6261c1f76a8300cc33fec666642180fb9582c16be78d8c184270f3997cbe50adf21c7c313963ce4542a952a74f190bbb909491e72a8300c430fb99999b0c5c32d168bc542160f3998301c79b8b95c2e57087ab8f1f0842b1e6eaa50a50a553cdc6ea8cabd093f0f375418830ac387e136136a2e97cbc5136a3ca1f8f04834697bf823a6a953a954e17d744953d5d1bd09bf63ae68372854f8d9a8504385dfc3fa70268c85b1301686e7b49930c4b130d460c250c68723cc81a7f45a5c328a88218a2be672b962f97e8c01929deaa65375aa4e7593ef3f7eef50dd4c87ea501daa9bc9f73060782f621d4c2c16eb60f2fd8b93ce8473713c21e7e23817c8b9389e7c7fc2b9e054dc4da852a96ef2bd09c916e250dc4cc8a1380e05a266f27d490b8dc516e360c22dc66db1180793ef5d8c60d0e6da783617b7b95c3cf99e6445a662536d379b6a536daaed26df873e45c49b4b5c64436d331b6a436da86d660c4f436108bebcb8785c2e174fbe17c7ee5b8baeeb54372a95ea26df7763e7ae8ef51f8baaa166349486d250f5da48c562c52eaa722f8a35e5c97827cfc56b99295e10ec12922fc642be177920965a4c8b693d5ddae179bb95e9129691c34b3ba3c34b4b93c1db9826890edeca60ae601e9497960619bc15324d310edeb67409a74e2f298bea69d2d93057308be586d83491385dc2a71c1d1e5793462acc152c2363859b6982a1ea520683ad602c586ba6492640982bd805bb0481c834bd38f80ad3a58cc5aa425832ac21197c7d69d2c9c1d714cc952c27a7aa2083af41a6a964a74b592a154bd516f0add3a4d0c1b718e64a96351932f8864d938b83ef225dcab49bdc38a41348c284b992c9c834a1669a5aa4ba746130223015083af8aec15cc95cfa06197cc74c138b836f972e5d16ab83b01a061c39787372e2d0334d2b5e5dbaa9142cb5938ae13449c515e6caada9c942064f5dd3f439784ad3a53bfb54e49e6e32181e3c15c25cb9259d9926f1a085c1680c780ad324eea04b0b3278ba82b9725d8074c9b2eae89ed5c302c17360aed81cfa324df4e091f811d35461e20bbc8fbeaf814206bf63aed81aaa726f809fd1257beaa1639af041b0d4218315067e362ce452b38cb9626550a6c91ebcd6a50a034fe78a75a12af720f8161f0e709545d8857974205d3990d82583c42e149227dfc720bd96990205313c4eb170ea388553ac7cbf8204477cc232f8747cc2272c93ef55c0f84c60d805660283dd7f5e7827ac1c96098b9593efc5922e94a56a4259168916cdd3361021064547f4ddf6b663076ce41ff36d4347eecf8acff99826fa3be743d09bffc4d7716a5e7d8f9f8723f86f2c9fbb8b63a9436b05090a1d6123d7ebb84bd01650fdad0d227bd09d12a9623747ee5dd775e238ef755d37d29952297df73c77202a9d0fc92350f23c786e2ce121e679f13b104d5543f2584a2083dfd8b903c77246d64a1a59a3795adb745a5b329167a6432ed53451bc779e2ce128d58152525556d1504a8370263019af93911adf2cf9e8bc79d01c4d8688f325288748932ec68b4889ccb468acb743ccd359bbc939ebbb7e79118a8f5a6a71162fb591d97a0b92057967a55a7b562b6d64ede58d1a75b41f8e1ad7ab63296619be74e2c664c944f634905896a28f085108869a27597e606aa39d9f356870b9f73147508b303991e81534b8818c68adb5d65aeb856beffdbdf7de6bada571efbdf7da7b7fafbdf7e240bcf7f7de7beffd423751ca1963042adb4ba0337da65ded710a9e5c8a72cd143ad9de8aec67d81a94aa7021aa237a4a670aa57364bf65fbc936b2ad9f9803d1d6dbcf406911b5efe163beaa176c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c6c3622b9a21c1f931fc7ff3f39b989c949481e0a7d64e420d03f9f8be2bfef9ef76dbba6dddadf7b3aa7c9bc36a8e22ac47aeb25d7151c43555ac3317405afa8ca2a8676e18a39a2529464aa8376aac9f0e69c132ba15547f5e2555f6bade88a8657e114d1db71c514d1161605ab01c6085372da71ea50b39393f14e9352b95ebbc1b026cd9a1d9c5c8f759a44318ff7591d0d640003f8022816a80005c6099012880004fe80184638a001270c7851c40214609200183e58104042848b1e3c0e10da51a223c7102338580861802040b905103f14e043001537564ce20056d828913e1f04d0438d00805e48430500293bf03063e3b49148871c64741ac800062e60810a506002128800041e6084031ac0802216a08004f8604100113d781c60878e1c43e010c2004164207e2800016eac980660a344f2a1460f0208000d1500a4cce061879148871c64a0608c31c6b8310f1f0b0ac6328e7219286449312e8232d28c8bb49c007bb9a02043064b6bbd30c678878f0593c72771ca0eb138b03596c6ce581d744619e18fc72e2e2711c4a05e46308e2d3431313134a2d72b478adac3a3b3851fe7c5d839860e3434ab22b85a2c239c9ca87240a184b86066880c0c3ac3c059ad56383278786253bc9c5ad24042b283d26add44412707278a50a8088bb173498c214388ec80b5523d313292224fa7204dc808812941e71638abd50a67ccc98171a125b6e385cfe74513131343f3d5aae60814e7a608123aaf802144484c0c5444524e7c1fea456cc666cf54034c1097b986cee1c9cd8d4b0a3bb0d714b6ada5b1681a8dac46ca2c326b6ea8cc183bcbcc928d0cbcb44330f0d2ce5ca0c777111668f27ddb324b4654e0a53d51e0a57d994037100974bfe2ccd2121178597320f0b2ea3ca04fde14c6887ea19a258a72c0cbba6ac0cbca6240379d29a2fb156696a86a012fab1005bcac3209689237bdf1d12e766689ba585e760c012f6b0b11dd94a7471799251ae3f1b26f0ef0b27176f4c8bb6174bcec26d44c138bd42c352ac7cb2632c4cb56e168d0bb6784e87ebbcc52ab0cf0b28304f1b261727fde3740bca471e8992615af596ad70f2f29ac002fe90e015ed258f3dc689a59ead8ca4b5a637a498b0ce0545561a84ab5d1a733d304ce5245955ed218d24b9af2a1bdd7e83a0364d607e0e5ec11400f34fa1c982bf5267cf78f98264ee5e58401e0e57ca5dcc72c55571dd519fd1d73a5f25095fad1cb59b3c3cb1b3ccc98a51aaba3aa639aba8b5eeaf01cfa184555a6293b86d59110aa52dff8fdd087a36dd492d6ca0089810b144157708e05c8b2b31115705160022410ba825f1220cb5ea296b01601b2d420403e802c4318c708b26c1ce3005403500c40cdd0154c53045976c62d0b5029409500d50d5dc1427c90357bb190a58600f295eb8920eb290f5dc97a7a9065d76cc583c60e40633b680c86ae64383a6050b594c5e4400d81c2819aa12b198d1033aa5aca5a0c40965a10aaacbaa12b991020c8b2efab8e7e7015c04500b279e8cabd41969d6f85a12bf7d619ba7257481339808ed980299124d207b2c64caeb7e50ab1afca43576c0f55a9ef4125005245835421cb900800b2145366903cb9bec66ac9ae5074c5e25015582dd9182174c5d250957a1ec81dc81119139165eb4096213107b2146128a4905cdf69ad1cba5263ad562c671cc7711cc71e4b3e16721c514e1e851cc78fe3d822479ac7d64d8d45412707278ada06141492be344d7bc5f8ffffe3387e1cefe26319ff181f1f63fcff7f488c91e60f21b203d64af5c4389231c6cee40ae3e015c67971727272727272f2ffff09c9c7f29393f1fff893939f9c9cbc18693e196d10db848c1562616c097e12c7d0c4c4c4d0c030313131313131393939f9c98949e863393131f94ffe13b2a4d984343131c98131d26c9203e3826d89ed78e1e4848431767e815bb010dc825bb0101724242424242424262626373121f96431212139b9c94f4c48121292958b916692baaa35f5083837452a124c4cc82ccbb22c2b098542a15028f8dc5877c0f7989db29715e48fe5be7b9a268ffb9e96d51d7fa3edd13a619aa64e695b39ba30ec54541e15425a84ada67dbbf690e3fade6b736feecdf5c37a2dbbe65df3ae816feb1d7cf7affb978655de21cf9a34c064ef1a095699de8ef4b3de1b6b46b14169f67ddabdd1a27adae9c60fcd12dd99f66ad3e47daeccb2d3c68fa5c91b9ad6a345a1186aef97db3bfcc237f9e2e3a17d2395a05924cbeddf4f3e16ed21a9840f3e7c3b46d98a3e10bb086eee3af0fb899982df63ef60aae0dfb1675a44a47d4055f0b7b17b3053f0bbb187cc147c6fecd44cc1d75e90c2f87858929e388e43bd9c5a76ea0e37721c5777ea4edda93bdc8b8f47465aad45dd68cf0529b3130db247e45e52978c2cb97fa4467ada77256cce9e4498b377d7638b1ab17390afbb5e5ec6dcfdc94db5f0ff589abc91a9a8bbf7ae1b05139fd5829613ae1785d55a6badb5d65a6bad271f8e4a5d2a494f25f74e8930a62ff485bed01790be740652978f473f23cb8decde8df66217c4b26f320f0011f3b88d4a2821e2942d452ef958b8f74d93c29ea6c9837bbffca1e240685ef1faec544b9dd23ee2f67d64ac699829f8a0b14e3155f0578c2a461aa44578863e64a969a2b8915f9ffba84b8b8f473fac3b9dea54dd9926af4e5179602caa4b4dc453814c708b06e9866adba59b689769e2daa55dda85e3c05233f9583cd22bb98bdf0ef0dc0faf23699026e989bab834a9a4ef016b8b589e8c6f59531343175916abeba1a39587c264fc9e93ecc1f3469cbbb1eed4292a1a2a4f8dd9170bd322548b74d452ede920b8d36aadff2abe8d5abbd76fd334e78c496392eaeb8a8fa56a15bc7690d64a33e865afdefc321f3c2c7641cc5ad34473127427d74a7e583c3cd27e2a414526883b33e5344d1d69822cc84b864b1e89fbfc41c62f67cc397f67293b652898a5ba53479814843f11ba81e84499b5c0ce6aebc8850bcc129d169826ed24249f0ffd8668256cee2711e6aef8e0c702be49b1ee78201a64f602d323fc191b43327e4903df5a6badb5d7da7b8d5a4bf688da7f5359c6b348a846a4b933199ffa2663ad462e6f4acc095d9d8c67117c7bbcf74bf09d11f13ab2d40ebe8be171634693a9b2993123b28dd90a660a7e38662ca02a3063861a95d0b247ae74d45226a447f82cad25ba5eb08c51b04cc643747e4d13cef836668b4c53d55854852c8f40f19e4498bd6befc21b37bad7e8c61b356277bbe3b2b016a681df7685123ac95d832e6d0dfa77966c0de6084f53f6751f395b14fe7b3859dd58d6c8f45606bf264423cee05b96a689e259ddb775eae3d1fd2395a0393c85c8d2e3c8f2e61f1bd9443a1d47bcccb8684f4c4dc38210b9a9b1f19d62f1ae914a7c43c8f0bc31cbe088a3af8dd9290bd222fcefa547f80f85c4d7ac532da2640fb931b2203305df8ed9890bf45a8e1fe0bb6b20be47f6106d4c71a9215648c6d701912e408be387e3d78214d168c9a797560e9e8c6f88267f7864e38064bbb89b8cb512ed21e9015b795c4d2ad1f01ba74975a73d0d249a84508e5f776a89468fb495c80ab5be93f13b1f3cf07ae3cddd0884661e0fd55276ea113ed6448c394cdf17e16ff6e341c94a2a41b3468a2dc2da6dd65e8fb39db08170c10aaf294c210753005fc1d7fa6d022bda93ebfb968a4f88dd4eb66d37d06959bf4cd1a5d33b4de26e29ac8eecf1f7508e88535b5a5a8e38c2d237d9415a54d696156b9a6ebded846cff7d44d483f7be77d483b75eabcd52afe6c89ef51ff4d452b261665987d4229c16c4162034a7c64abbcaf705b6e534c9d3d99926708a690ac5876175b5c8721fcb76ba9dceecda4e0f44777d59971eb95ab22096b5e5a5cfedbb39d6541dd2a35ed5b1ab0ba7491bb9bd9ad4d53b8c8748e869ebed357fde39f743ae7ac5e1883f80505b569e6cc9388865e599775a8fd5355d84eae4e0dc78352df280a5434a945aa445b6a6668a7d17c41fd5da579726fd386db7af299826efe0bd3b96205952f1f2b4c8d25a6395ac3d5410cb8ef1a4789a5452f64a146b5209a5abda538bd456936e2db51373647f03ed896c1f846c5fd33a6fdb453a48935eb6dbbcd5539a6cdfb1eeb1f7464a849a608e0e8324f411ed3bdcb05e8dcd6a18cceab4a88774b7afa969e26e5f77304ddeed762d89b0fb46e9b792eddaa85d3ba92c9df69e668abd4e93dea994180ab5c86eefa7b2c8e29776caa165cdd620a25f7bf4f88f921d9525ea21c414e2b52d9f41d7769260c696f840937ec8d98f32237bb7224868d68f787afc0b31ce928f3aca0e1b40005816092077b4931ce2de9ee380a84800f131edb98e1b2d672d47da16d5c81c59a3d2bef372b799b3d65a6badfdac49434b76bc4493ca50ce3e90655928e3b88d7bc76d24a84559f6954fc7cc019991a804ab592c8b2254342300000083160000300c0c064402b12c89e254b2f614000d7a96485a5a3a9849b310c6320c308831050c200600000c0800800c910800da65b97ee9fa3ed4a97364e3b207781ae23fc4881d8c58c27ea39c90363cb05fc4084fdff51ad850a6261b434209235d18c4a9c0aa1797c293946b501d8f4825d7dbe0e69f42064ecc7bd5988d38633baa808c46e3dda91481388342bd29eb3b0d11c4b7b0620e84fe9909ce23dab8184ff9941ae3d5c3c70d5848e23f1ac996d8736658c42bb8806499ce8af78ef3a753560477228010e38288375107ac24a70b8ffa16106d5e7ab56389542ea7ea5249df4f3face3aeb13895bb5c97680ccc7d4d981cdfbff708bf911b6e0945c961d96acfa2de0fc6c4d906c02689310f8094c768545b8c32d4cbe5a9ccc7057bcd3d9eb81d0a4f08b9a5c2e22e7634bcff24f2a0624484028ea82fa8155d0f1686c017b43e1611f9f1157af1f84e763df3bb9a5eccb4038c67ab8f0e3f1722f437db62a01fafde16f4923c759f5a29baa38eeefb4499759b113ec6072481140943e231450a38af05651f64460e03afc8c997823f6557fd754b864c97a62338efcea299553c2727f4069601fed1cf2b565006faf358a045f860ffba338d4609bc25d593584a276b1184c24a5f07c22462a359b549b9876720ecd2ec939b062a5c16fd94207dc732c89d920aefd8b034af89b74a28bcf7fef0c5cc6a032530295acd3e119711105993a56f1e9672517a104dbd1b3180fc77540a7e76ed345d9f2c9664f5c76a6db251fb5080418bd74eb8e1ee9112cb34ca9b2feb3cfe5e79efeee4ee2f0695790fb4e088125f5132e46e4e6def12eed2d1f4ce45228f6696059688fd13b44bce8c0401222e4b37729a623827ee206808388d3be8bef192523dc21e22dded6fe0367daf418963184d5ac2c5906c74f5a93695eb3af412aeb40eee02faaa13c13918904e6c7b410a42abee64f8e3fdc8e019096579466042f9842dcb4e516ad6375b3f0b2daf3f9c9e0b9f5843cd4bffec18fe8539136b21a0f115f92539ab7a7e75b82651becab5d67aa3242cf56bf2246d3832b24f7ab8a92423b8ff338d4abe2005690f4539b548be76d207b0a6375268091b4bae8513861294504f1fed6bcb508acaba9583497043190863dcfdac5de76197a5e7aeaf5a0b7ad88ecae8033df369b94489c392f8a0129e8b63c904bde96c15fcf090ccd3b8e3df5bfe749ee142c3dc2c6135bd0ffcdcf6513f897ad979a2c47b1531e0b74d1a9dac393b4f72c82e675fabc98e83608c42fd552b4995a1ba1fea525d3670725417fb2e773644b4de41bf92a1777cd0a8f78a7e6c82502f8f0ef612c21801363a6e54e42b50df657078d48a39ab2e066caed824fc79dbfcd5609006ddc4c17c0036e333a2de165e5a4dfc5c018e3dbf2de16517683c95ea73bf8f019cd3013292e91c5618b87a06e0bb578a826e9364064f6a8a7dd1631e7fe63aa67bc43cc2e1bcaf976049cfea01ee7d72bb2318ab1162dbeffdd6bfd5479bc8879b73182131200be2abcefe494e040314ed1ec8e8f9ac262d8fb11075e842523401e3fd171aeb0873328883700ab299c4822cd4288e4cd4325f728aad72a828d49322dddd66065fd42216b5b28dae17c3d6e2cd08719499843cabe8fca777ef76227998c2cbf29e8e322387473e65f72ee08a8d0032cbaccb4a9d5fa9d4dfb8fd9e29ab231a82dee68869877a87141b9a070bfcc2c74075747cc851fe1134e770886ac3ca0e814c2af0902eb472fca2994d59ef35a492c1cd5628f907d3b87ddca8b61e8c91b708a92ac567666fd82faa312e342b74de5676edc1708f3304d1cb636c4b8b00ceb9b4d6441fd798b5943844875890581fd436a1dccee55b0d6ae315c8662ea89f3cc823540d6e6b3e3d04fb124d374014dec0327398b197fb05728193fc40a679cce1d1f1199f0b95a87bc2a6e91b29ba278e29c739504ec8ffb0d63e065caba119d72b7f195ceb12c35520228aff31e0e675131595bd4b898361049c09a44ae486122252aa35ed8c96722e93ef4132298e23d08511815b36221360e0025dd9220ee009ef9a32d6916185104f64b8a85fdefe692b293d87dfd7f8702f7adfd1c0149de98fe0a8fbed77190744dd3c24477a7de1e58bb0fc035f893a4a5f9a0bb771886d525480de772a78c9dc05b1400c5675c6563564793a0ba66517580735002616e6ec8175c6aa181402265e82ca8206c13a846a318fb16f1f6006eb33d531ae7e07802d49d1c23a28e2827a40c3ac4d07b946fa99ef9dd2a3c8376cd7b36859c4e4767d707537387d8c7ba3eb4ccb91ff0d69ed701e57e03a7e0439d15bec9c078fb5f649faa32526adf7cb28ba7b415b76d2312569b60ea094f2212c21f95a0883b1a9b32d874521b7a75f16a2602811e4bbd4275bc82b82aedadc0687452ac62d0f60ee5f8addb033897abe059167fb82975f331edfc253c2691617ce57bcf377446d5645403205594164a884746ae4b527ad2a324d0ab1852b9712627dd89e905a98e0116331f10b0c5020a2e9e88ae8dc3cbdb40e7324cad5248bfa70b1edf1316862e586b1f5669c458f5898ebd3ea3c625663251d0e10e6e910f05fb992417f7edebe13e0d5b0871537277f7353f5dc8e339e43a0b18fc5447f869ac4e30cb4ce4ad2ffe5fd5dad85c34730f7e2483c7fb5c1febe68a3b21d85cb671ab26d1b6f3b83ec8d00d07706e28298e2227d154e20822e27ce9e82d439baf39c921860e56e65bd445ac6e6f28b9d40ca77549c2f9ea793d8ea843d2d879017bd768846db1b720ab08eff385ee12f2cedd33ac20f9364c4a272ac4a41734544d216da14580bc85b4b8518478e01d740fc356c502b21a26d7d04f3da79e1f7a80af009aa3155787dce9d22ea79c144fb1c34eee63bb2fcf1e6d6f2e9fa1c1a15d06209ab346c54383fda5913dfa75dd55d6b086b1674f24cc77f546e30cb8b3594903bde76163d8e7d6eecb0ddb4103802aae6e40bd9a94fe7a16ea24b53a8485000990631ebbbbd95063a02377ab7865846145e797fc16bf883d7ea61b1f470722ee2c3de60f4e1677a059afca0074f995998eb44eb27443afd98e5485b946f1bf0a56c2892a3ecfd7cd5d0cf523a634bdb62ede49e3733e12c42ceeb687ab0465beeecbe0c65db9ce01847e3aa1a6732d4a1f1c17e6eaa4b472ee74f47c04a9b341c310fd9f6fd6a79f31e43d8ece38aab667ec43b76b5f58e3329062f6acb588a0a532b7ffe0c833b84d58764ff68f8350247139e64d41fa7b6c8760c775ae0fd5acb642d455647db70dc342bb1f268b30e9d008eeb14ed4bafe597fab6d32578fab8ce27cd8077cccfd6bf9ea614e70789aa83177affa172d1aaeec66e263db215cd249ba519cd57f51766990b967c157401856190b73a30c74bdac20584a7e24b58c06fa431f7e1220e5c755ce8f04398e8f9e9445ace59e0114c02f6ea65e696042bc53316f2f57e5066e8737a8321bbe0f7d0a1846e4c7c3c248210c49a031af6d8378c7ae4799ee7e1218658bb045fcaee62b415ac4890c8e6e4b3438a73840106a6973d4d0254f13d2dcb553a0cfecc6d97ac6836659b9eb69cbda44f198d80415019aea019e4c3b42ea817262cc1a029e3f3b8464b2f04db55c265f96ac8420d0d9c55529237b80b04d1a7572f10e97999cba78748ea6dda0894456f3bda33325121e6e0ae80f0a3f89812b568a6e6dc8f51772ca46b54942bc7de02ef07598e5d2efb35e6d8f14fb2d8b11be2415865adc9f4ce2cac3ed9ee623ce675e6497eb957a215305ab9cfa0ad568347e79b12a308b2b11a33d53f61efdee82063ec5ba3f00c7491a9b55b72bcebd35f3c2bf7a9a0d2be99a8fdf3f20e2577dfc6a992228a763f457b3442704054744bb7469c81125d8b3269162efb9934111cec97ae4667f8ad2954312e1ed7af6243431dfba4e419261449c91e68f4b133c46f3668d3c63837c940cc0176384207f48f47551c12395fe3292e7c090da3ade65784f92e7f3ebbbd33623127e0cf27460fc178dba404c4de197fde44205c1ffefc7e29ca88db3098ede5970c4f3965291e1e2b252f70589a71c7346d9d075bff7652a0f1f4a05d81b3084f380c39a9c40595d0d175ec51fe05b742163b1d01e2139920a850d2560eec64c242400f2a7532063b35ed2e1f7b496c7049b96b6728052cc2f615f954900a25b35d3981da89b2bded3a07dec917f468c98574f7fb00c1594efacd2561ab90ae83c6a9413d136177b5e6b62e1427862596a265a9440a1b5cab00e001b4fff22992c9d5efa7f5be59b32b6484b35ea9d8a5bda2682b03483c75e01d2f5cc1ebb8e37cbb9f3df6480d60870dbded165e879f6793d6e598140192c3948d833361b2cf3328c85f371b3a02873ab7f7b16d791b6d8a3022decb911a75fb1b334fcf92806aa14b50ff5c6a97b9de5103fdd7418ad1e5a3d40b4bc6e868a014e3464add47171c5e23666c91b1582f7540453492b391cc2dd473b51c08827610690860c62c3a189185e1b433572e365557f4aea50e4057262c458c98b9971ac70abb6a69f8fe3ebb89a8c773e681760e25c5b49951b406df8b400053f6053c7dda04a7972d1d6fb8f2038de04b51277830b3228ea936a91dd4e2b0c1fdd9dd897f48ec19e412d15becd3d1e429ef5fac2972d9ee9fa371cc5128d0c4b67ef73b458101f9bf2ebfd833e4fc2e1bb6cb1a670f196161625cdd89eec2f22ade14468049a21b39b3b59e6a19581bc6be3cb1a81834f24bdcc0eda2323d488521cf3a25100d96f0bada94d9a0a1123bd62888543cf38f9396bdef3b3041b4173aefe5801aad2c3f3fdbce15f26190babfe49c1e19e1ee600447ce900f4232a71eb263ca9003c799e37b379202b05f3d872146267db114af54bb1cc93b0b7c492318439dc58d96bd1df54758d0adf7af523d5b4e54a2b701f192683db273787fe734f8381b6a6944b6294331562fc3273b1a9dfae3dca71d355a81f6f1991b0fde185b2bd316e571d1e88c6c12aba4ad7afe5e681924fc154384b44a9fc7f3fc1cb6f3ba247593ccccdaca652ce6c01703a14e68afac5fba8a68feabe134bec61541459c23205e6b367a1b88f83962bab0d57bc7e3031f70af5ce165edd60cdcfbead932dec329dc000d65c6bd6a6e2510758617d91613340d3c3277d761b15bbb36008f6b3b04cae1f4ec80c97ec3ca75bd8115eaf503407a4e1984aa862a8919439cbde0e4b1a4dcb99746936db29b5a3599efee61f9c3f7aeee19de324e765fe02194ac027f7003418caf95bc0a1a97fb310004660b8f7eae3a9f6752ff21b254d9653a4e728bb297e7638c6a0fbfcef3422b7e0f8361d3c573f5d4d91d723c7a79c10ce8be9d775bf56a6c93b1f95bebd2c126a5d7ca119724b24453a08934de19049cdea48d24284452294513b8b78b7aaf73eaa0059b6d33db523a1fef6abf9497dcfb34cdff1ff452d1d6503ae990c16bd2e942915777499157d79b22af5e9ad02968e9ab3b56feca1bffc894277172d1b2f90731aa73d1e1783640aa11bd1ef79952648c1352c71144f1aab05f85cfddcf4b9916c8ab4e05df47bdf74df4e818ac522589edfee6756de53effc03242dcb5ad0ad379d6df410f55340c91002050f9a898fad5c4c1fa081a8cb3a483cf6810eb5badcd78a6ac8412568f66839d1e5881026ce727f69d876d0dc31d964163eaccc5bdf3380c752ddda8a0a32d0de634815767866dd7554330e2a56e21297c810828b818fb079f1a231c6c290f2e9f2a0d745c48024a7e0fefd5b7f448cb4f085d513ed2969b1040242e26b8e871fd7d7f7a39b8ee5cafbc58b34dc2ef9db9b691f342931c0194b8c0c17b8a2971460a79ab2e5a4a9cff0be40d72dfb072b28242d99ab4e99789ea05db9b72b65d6ad0db3263b287f4d6d54da74fa3de076f794a9a01ad68a3642e011ff6af95ac7dc7213e8c9dc479797a3c156301de42e8f91ce12e633d6d531506972e17f1e2174095f8394e4b8a7e2c3491b1fe0c8033d665a0a29449bca86c5770085334302df95b76a5c86211b147db9d272991436322ca0a890a7e757d920c3b2aac37f636d1b5e06bea45fb9655086f02493fa495b9bf3dd3118123e6c61e1a92134f114727881f8423a528ac18c31e6b00d4947092a786d2a5e9e2b8435ec5ff659e8a5a1370abd8e0051f9c8f34b61a149673122de63b1c2883db19e94eb9e6651ecc1b49a84d2c92ea7fcd7ba908438c995249ca204bd607d58987843281e08c0eaabf1a448db101bc18c5a176206b1d9986fb198ca4315c8684da4357466d6d2967bc2fc416bfa50d8b70232e788af6110c8a98fd62b0c2404df4202a8d04837af7156e145b6052b9aca61ec90325341abc5b53b703b661dd94c3eab341054c02137206fe16f9758cd556efc279d88ef4a74fb79bda18adf6e9dd7705b4f752b7e869ffd2900b737b3bccfc5fe709c19c5f54915be33b971c31280632c99b3c623351a77f0e2be01c3a8487fd764e36ecbb2b6c84c0bd750ab55fba7d6835a460602bc1574085fb2ceecde44b9c383f0fbe908114eb3a6a3a934e1ec432eff96601845175a6b66d353d39ab81a3e4f61ed48a0b6531734a146fb7da81375384566bf7c061735d20d51342ea90c5f725f22affc712155fa1b8e208b0e3c5397ce662a054d4b8d3546a468116f70f54cc74b3651444a9a78533e8c5935cdb7851b7832dbf113578a59703b344f11ec5328d87f4af788c2070c47286d26ceccd9dfc6083dc97d74f63f85e231c051f02d1ac63d55961d6585b5cb959e53980302391c0d60b828a9d6d546ca7bbef9e9143426205786109ed4e27ecc4a1d82a34db36120e6df8d667c362341930a640eef922cf0273bbdc13ba2fea76abc90be49c16f2cd6477228c90611c935c02dd16518601954f2006b630a515a530e8ab0c2134b3df79804da6947cc7ec76011242f88f86720c5901d9f462dfbf19d4831999a7549a9b3819542cd280ad02795215c389be311d9b75c4bf0e13deca57664896d585839265d4eff4ef36191545b35074fd792066981e156b98d94bf4e2f8f347d1a158b4376b1f4f4c6e60f01f8b8be619c17829b2d469367a444e78e4cb85f400e7883e74f7d515777433a8695830abb1e80f06ccacabc3c1d87ceb87b034a1c751ae0cb5de354403941e33224a731b219ff5ee2188054196ae3156a98f0d91b6155d5e72609c9d6a6590114af1d9af2ee4b66e419860e85c8bd900670022bb170a915f18ccbe2d7c3f2b53cd309f15f9cc2c2a061c4d6d9b7c5d6592a678c62cfd547e588cce1b1bfeb7b9a7292ff88e53a666272b7d11e8ebc48436d59a9038153d4594862c730016cad6bb96ab70f74cca8f8bad235f357d1ed2044b918a2c29cd510e2f60f954c2bbe1ed893d1fd4ebc49b0f7a4ed0eb03b727f47ea8f7096f3eec3941cf0f6e4ed0fb815e3a20bc0dde9ed8e303bd27dc7ea0f7043d3fbc3d61cf877a9e70fb41cf09f4fce0f6c4de0feafd686e9a69addaf818793faee86ce4bdd4b467f175301556edb28cb9e207e46215a78c0bd84bab4cd1c340c01eb1eaf719226ce0fe77646255004a7b8fc801ff1024bd5cfd55bb5b932d7672e969dce9130c37e676c3d33bf238e169ee977d41b936f6c80ae8db69cd6231d7f8cb35b4658e498665ea31b2cab43068fc0e95ac02c88a6ad4d3374f4406e3a6939a33a4d2ad687189f246b74860d5d8b91a1591ad568755fc6bd68506028f00b0d261faf262d4e27614be47a0be88eb44f0594682bc44d8a71196ff5b4ea1b91e689710e9efe7ef339fdcffe7332354a107a8ae520d93d37cd8445365cc0f509501bdc729af89e5966a450228142371a04a95c3db83984104c78c8f3561866003517f2075b94b2b7baa8fc466354d1f9391583a2c99f52dd3b30919570c4ac876bef4b59d0c939d7c91fc0396737d61e9bfea2f097eb0fe53fd97c4623888b3902a2dc380308555e9360c2213a84aeec3209881a97c3b2ca2098ccad661229dc054601b16c12944a58de110a74255d80c076112566f3c3c854f1cd9be50fce048cfd08f8f8328609a6ec0c6302877370b781b378ce9c86005f8914746568bdff8e1c005e8808a2b2e42070a0e70014d6871c50d34a0820397d0113a0e5c800e68b8e32634a1c2811bd0371971c415072e1ce0c2cd6610270e5cb8c08513b766461cb8e08203475c7107fa7c893456fbd1966570ed8539f0cc52b0b4cdc671fbb6215a9634dc78974766b62122a7587319ec7f5c90d14bc4e31450b323e5bb613d9bd9c8d957fb4473e1c048c16a62b1d402891501a13630473378e40224d9f2c32e35115be33f8d4bc7c1819ae30de16e361fa2be0c663fb741d7d7344cbaa165662165b20bb93e370d6196d05bdb17abeddf4237e176a9888e6b475780f3726e6d1fa4bce13228fa49f75b8c9108ca8c44af0d25e40ce391e6d0ceb0b60c5a84bdf18e2b1a27b9a961e6adadb1ea38877f3a2d8b985750f403c5c44e74bb4344c81db19500fc1cb79b476ae1df4237c1ed72111d77455602f173dc6e1e6978c36530fa09f74b8ca3488a9904af0a25e424c72325b1060b6c19349a77631dae689c7453abcc234a69d5715efe349a2c62af41d16b58068527d160c7551a4eb8dde20e46d0651db6d12d0a3926b96f66e0911c37705083a57432f6b5e53a4e687f17f998d7808cfac686cb6031136e6a997948d94ac9323a0979ab558525e424e39162c96938c82e66c2ed5a311d67c4af03f1f2dbe87fa9770c8c108fcc14722b57e2d03be84031428e73404d3eaf0c26656e9edf043a3592a14b11b7f9b0a805f43c7256cdff9b22b9a46630056a304dfd0aad97bcf287b89f30c24f7d0380f1b9f0bcc54adf063fb448122e4dee807e1401a6963c301723eb1c2d409cfa012e1b79c0e552d5f1c073f108100d5d9eb21070cf2843e33b0483bb2acdd127c693115cd991116697741921801c8c8868efd2a093407f876b759580bd8c9c71e258928e5013e02434578bfcf37b8d41e298a180db0e6f9bd02890d17e601f01479f2f6d55cc913c32823aac1148639cdf086f2177c8fe7c058536fa48c582c99b6edd9d8e7667d99c46193278b50551afb6cd0113886513e718d3f03480dc5ef03d690656c170e208267afde4c4f6719685819e80bdc44077a7fd37c2e873f220a48cc13715cd48e16f40624a075d4b12845f33a0eb93b12809f46aba140e51385e74250d0f55e4eee1eb3352165d5785272d42ef810c4933a2017868626041391cfe5b950b457ef61af4eee241923531a29bae99c0103e68867c79b17e931b606142e7e8fa6cdc8742081de0deeb3000727b9f9aeeda4c148504444a93f757d047bdcd0d6affb538a48ce22de322f8004a53fc6cbb2e48f476448dec40e96c0f9b90a209a131c89a47b3782e7c2f44fa2d1b8848d4feca40910e461be1854dc5a21a418d15a234b380c56dc001d0535182b929b42b1f6cb8ad1dd5ab7759d8b6e203908f6250229fd6f042f9f4e0309c4213d0645044dbd5bc4b05c960e044a3d78406454708467aaa09514ae371dc8b142e4cfd91f32f2ec7255394f9b44703d4ef1fe9c19084a0831422dca616545f0fc8b93f36434d2571c8fed5f063f1c0cb437bf0a376aa7927e31d09a6f50890bb737838749ac09ebe9bd75ad30993bfc9259bfcef6db7c9d755d2e372f218f8f341a96c404a3a10a70886f2962aa3565f874bc75b72a2867007e88a4324af5669b489e9ddaf79ae3789c0e82578f40ccf84f5cf4b01f3a9048bc6f600e5c43cc9837a22f7c0c22ca5da8fb0f3fcd335c4553987373e586e1921787c3db6d3c7c7b75b5bee7797979bfd7ff2571c2a2b1ac77362bed66f0c2bce36b9d7eb4bb3c83cb77e315ca890f196b0318d92a1bfd05c1794adb61bf13490eb52dceeb1bebd3f09e1fe153e35bc3560548d6260f686b1f5ec845793669541ca271144bc0c5464b087f5825ca44d25ba1f1246e34d8c87996c15e22e4b9a70a84d262150c84206d367782daa7f861998b4b01156adaa61d6385c6037d94a8580affd0c11e294e51429ffe0813727f6e127020514469b29676720c8a0cf25ff5918835d649205980f8c6b555b1f0e9eb5c399ad908db918a70d0fcc1005b5f5212cf6e37f282e8a457fa4e5f90d3092a71018ae568909e9398d98137516c1485856ffe098f8b8d5693c567aab7d34c1dcdb7d9b4fb4abacdc988eb7b76f364745a76d91b87ac375684afc34b91016b37f99d4d666cb157fc148f8994e3f5c2451672fee2e2e467dc0f2bfb6895e51dd31dc213959776d0b88d2bfdbce464eddf208c55fce4473d3397cf6b741f18a9ad872c79a7f3429368427b7fe51c4b8abab9fc22b1dabe3b5401da2fffe0d0a44a02988bf505ee73e51483fef73f33e532b3ad02e3f3b5025d9c8e271d259d4b533c8efa891bd92ef1d60949271badd8f3e5bcd147ddb46f27406c657aa3e213da71173548b0e0797c51c827cddc466c6f380a340c7dfac23562687f74ac7e9783df8a869a834da4c09ac08188f56c794e8534396c35ea5fc71caefdaf18da1b6b62fd69673d11b374cd7911e23f25444c822f14686143d9725bd574405847dd402469692bf4cd04c004eab6d1d9065a3d9c01687ccb4212a68e299c33822515cfed758f795ea105e06e45cf439ee091b35bb0b269ae522e1ff9cc54fc37c90035cbb910b3bcce07e8216e35be0279fa439bf998eacf9d24978938f02bf465846921756d9b85d6f870fac67eba64d0179fa37a340c472454ea1284c8dc273b9c9f14b06d4b8555c3fe9284cef2d86094687d172452cc85725f9299a3038130b18fdb173413070de1b76b9a60ac14da194443ec33ed16c8d4958eb8d38d7bb8bdcf65c06cccf8db3a975284d321dd9398fc24d19e4aacadd8ec3766390f85c6966c05fa5abe928119703bb71ab291ce4bcbb3c869462a36894c7f69fcf6002f9ba324d3ce24862a75014a63601e4da93197502f2dd284e0c8e37b724b309c6c96586742a1c7c1498677d147f976d84511cceab51e715f510be04c449fc79e41d3b675d308c22bf5c958c35aa8a9c76316b3aed5931a9023fb28530dd5cf3a4b5b22398a9b70f914e8eea824b6b951668f12347753eb0501aeebc460bc117a138c19e81f8bf0996dd2fecb05842a0aec3f5fb5de45a0c1569a2838b04ed6d50e5528ff510974337869e6b26dfb88508b7257442cedf22a464478e96f31307a4842616139f85a02aa5a70a6a9b9c1f243c6da52e00016a5b6701b707c0f9ba16e10c4767185a92380f9c8134c73d975e9b160f845ce5c7b8b63936d6b0c4784aa368da19c2b596c7b69cf75204266309162c9a10ce04e780399b7ac394cc27527f17b4ef87a51f0e86e619699d7886a0121fb891cf407681631bb039b4d331fcf18025d52a409abd7a38857ca312c864829227a78bb4d55b0375e85b0042708ab25e32fa436a81ce51ea0952ef0e477f953f158a4ef66508395de8e14f8180cc74eceb54d7500a59974064c2798a0bcc0c7b8d4648c32037dc70cc9cc00c6bd6434dad971db8440677cd74425e8c213780ca926ab0a11be48b401c88794ae8fea96121eee2108a343a50434e8d84093a352e20a3e557f9a038c092f2550ed281115cc39f8940e1886af9897979345d8ce4dd2662ea45892f059da42c7e359c488d028719020684ff3e81763a79bf240b4202c6415037030120bab99a5859fd6380dcbfb4508c92394c6420bb95c2dbb0621e48d8f1618c9b31d4519663938162cc7767aa4555429785d624ec241c58ec4d2f67981ad416090227493b5569de965ebd242006ed02bc04b80539344f4ab064782556b899ec9e4ab70414926171a739d7671da08d8f5ce1d87dd2eb46af49105ea49b821511dd0a5788702f5811c17dc18a48b7892b43488f237a1dd123127a8f235ea19b882b0add225616b88bb0b2c02d72c5826e912b26dc84805e47e841448fb4f409d4ab60dc98a6cb5fa8c6de142172b10f452583dfde8ff6e787195191576aae1adc53d6aa376d511a48a4822a1a3d1ac50636d461a521245e4c04d71cc5f5fc71d88bcf241df82a76b89598e5a70d27f891ac03f6540c37ce1d0cfcff062802b719eb63ee24ca86a3c3386c0baa6dd1ba87d9ed12260486562a38a4bf6df09e1e9143757c10d606f8c7bd5701bf02a13f5f04718121a401ee8a629357a23204ec4044c0b5b546911bc5e3e756818efe40dc516813309b65df818ff95de818da2e45d4525ad5836ec721933106122bba2fbc79599213d32293d76c4b3166bb8a7cb60f2a01ee02ea80cea6783552c8cef89f354360510b255c36db1c10d5c29de3b039225ad3349e995538d6485f451ed5539fe3d85377990278a2458a7d56102fbb9c282208525614740a518736ce3ce705c1ddd24140a15fcc838377d36fe3581f82797322f2fab8c73681bc70f3d0a9274af408b4c9ce555d56cb010323becc3fe7a54e1829559e251836fd72e55653cbed580a701f60c475157d52230970809adcf584e6f3c2562b27466b09d6bf967b3ee33922854066274f5b4ff11dab4f6b7806a8d1243fa6513b7f8ff873de6f432081cbce49e7c4c41480be2940f5c336a4610e76f26a425857341d4174a3c2f4d3446e5053bbee756fc9ccda449aac4da463c52c6d5665a21ad566d0c860ac4d4ecfca4c1aac4cd3c9da64d3f16649c7d14cc9f9d0786b93e517af4f41e7b2f66ab863fb719c05f802c67a8a830cd8d2633f15f2b04984c204e362dfe0586d19415c9bc9e9684de29c766f957b8117a7eebacce960100c6b1da0977a071e84c6f7630a115b743b5c02b98aa0104eccc7dccdeee6b31a82c51e5dfd2cd3945dfbe502e6089f445a68d9e0792e54b2936931aa7ac13059362e289736723df729c86213cc93e50729d8117bef962af8364de91994e7f6df6491fd2b02f91d695f903cf1e11e2ad5e9e57ea62894443543fdc0b572e9d93e28ce64b9e6a25aba6edcb1802677466a2ec7a9089f6aa6e29a71b2933da67dc48bc97b938a56216500a364b232f334a76461fe24c71942390c8e0f5d54ba4c75c0183d26e35160bc53a29c0f0dce37d5b7f143091a6b800453fdec7f23f0dfe2e85f1c5d02a6faebbfb35f0953bdf807d1f63fe3fd0f4eaf83a95efbbf4a45e9cd8315da62f409447df5f1673a9984a995f42be8d1c0146d77181b56b168efb7c6eb07ff87602af679faaf29d4336630d587ff1e19ff22e2ff740a53faef0ff106536be5a765228429eaf32308f48348f3b748a383292afa73a2083045cb3c9204153875fe1cde9230118c3838c154dff957fb8bc354fffc9308ff83d8fcdf45a531e9c10da17f24608a12fc8ae8fe1241f81178ec608a227fd7f3ab0add194719973f859c3fc7118f30455567a1281630651489056bda0e565d317a99cbf4aa131f81a951e220cd2064848c20b624758a1eab81db61d99161e9e0132efd4f03532ea10d04b90d492ddb8801a6561620508429f0d397e315a012a628bd68f4d79b0253c01c17669a778b4abcaa9ea0c2947f3bcf0c53b4907883dfeaa5db91f07b0d5c43b40e54430e0badc11402ef3a6d4c374a1132aa13de8d12471a17f00c2c854211f36a6a3cd2b4f55bde54bd1b5158c37debe5bbf878ffaaa0fd3070462204c305ccc3320e481b96b6ead7744b5469c8455c0317a1070737bc08c2f4fb09433fa8c6acfc02e50ba333f2f17dd8f3204a94ac0dc55a1ed7915abe812133c0caeb82d20efe12b80c602fc93e790e1960a0e463c9e172f0df68fc5a14c3ef0b663ab4d6d8a9d2c7a61a9ae53cc564d07ed7b11458d596025737b178eb86779814a8288fa4a6cff4a6b662584701bd51e3a1d116fd5c835de3ca2a55433ace9f8d728ba3d45ab8506f6b3b25c754670f93eb9a82b7b69cd25d75f77825a4ff9942b79d1c80e23a9af37a203adcd11262d1a0e45f3d082aad90f33bfdea87468f7b5468d0d0ca251a7da892fe75f8e9840aa4d4ff22c70603c87f3e1c5bfa2ca1f95bc68102fd165ed819c2d1e026a9b559fa07c7d82b14526b60bb1d778bbd999545693af7c56287e51f91f69e5fc73a8ebdb36bf41799da02f103bb430cf80c3f3ebd19e0a22494cf927ba82142c1095760ca51981fab0078a3bd511f2ad8a3387c7c710810b8a3131a02cce1a8a8966edf71614279fe54f0bcffbd828261f9c7370484ef3c415e71a981f56abbad37e65ce6dc46f993831d09d542c9f10c507bf558fff6a230bac89f567ed0b8025c685966bc6d07f775d674b78d8544d54b5f4001ae0ef8deaadd83487b642bb512db835cef28e2bfed66f8f10af34cb7e7e639887fd198e5d95537564f0c27297b056ee26b76a1465c2e77b9edc7d88a94913a36291182599db016ec6dec02c5ac1245b4b969a142e44580ab3d47f6626515e244c13aab79daa1c125019e2d9dba53a3e42c776b4c42819565a19d4e1fb02b77bf79964da85477d8b2ecf1d62efa317699230148648178cdb69b8c29c11c39ede49d06abf4e64a8e806fe23b0acb7c22405a4235a3c4c5e59c9db0417f06a844d98cbe731c45480f399f39d94462cfb5fd1a85b91f38c51faa117f232ad06f216f28baa390004c393a09d0a349f13950137ff5d0febc3d71c1c57207fe9dd5a75f06548d921f8c392c08813295c598d5acec2d97ca43a222a07489fe4fdbafbcd9018c8979d63ed6602be8bbfc38fc55146413fb7babb3e7b0528c0eaf5557d390251a03228a71638e3010c4eb3633c90e912edec48b48be23922bd4009e3f08d1e94114e8814e22d7cb0e552d2d51aacac854df30de2d4a2664e0227c70a0c677af0f83d73f584faad663a61d6c9e1ae3f6180b8c07f3a00769c02433e866c24dc9dccf8d5a33dc082163e659eb92c06bc351dde8b149e971bbc3483d8d2d1b6a050c23555e333391220285a348d37934acebda43f0d5b95c80ad6861c5e3c950433dde3ede9619d3a721ab48cf215368440360fb7a184c40865848ad5c7fd364decd82adc46204c045c908311784beae33950ee3ff6b480dd34c236a8abba0b9d6d7c7e17f73eda817f3094ae8d8268972016c5bae0335823bc4847903628c584e3f9d449040f39a4586781b2c88f7b2342cc847f0c0c56860a46269890ef02086c82b275112f564707ce393d4d790e6eed556d1a84996c558cf6a529cadd55edf5a9fc3bc55d79cca3c785f52aff354700b29f6808ac830677b9abda5f6a0eebf7677c6eabfa5711bd6c352cea80d97c013199d23bae911e064fb1a7439807c022e561c5260f3f3f6888f4b2a26b81b47467a44297f11deb7b4deef0982de1bfb7effe7a10019d3a8a87b5e7289681bcc527da6615d3df09f2d8c14e8dc8a9784c88e546a7361844615c8ce0f8ad640502fa140de0e7cba29334a31a890e760172141fd078b74c79cc776ffd3f64a711bcd1c388813e01049b19907cbfec632e889951b6ea08264b39234894f51115054f8ec8b0f2d10847e70ffb2ddb55b7f6beffe43a5a8cc7a17723f12d5d0f6a9b555bcb990b286e0f36bf1def423ef95795005a29741618507902cfcc1ea86eb80232ace4269433ccb9633ab0d03eda416b7006c1b2bebd3c85e59d30bee0d1ebd32f11378241f33bb5a91b3019c19983c482cba58c4847389f985361d84da340e780c1f6cc828ff53cb517d639ac713669f375f513c0c094723083e8b2c0ec0a6eeb18199c99dcc312f5eb53bbaac1dfa04ec47a774562bca0da1754a9b6c3b16d635d635057cd08c0463832ce2ee72dddc2f137896358b85bd98c00e1d8500a6a1487dda25f293743acceb236252e765ec7900a80ba1728604e2f4cc41e3b45fa67309cf676fec499f7b4e41d10d1a551751494eb99367d8b8c3406f34d98bd7db9b5c07aa5a3ae01cc8f767f4254764abf3aa7d692940a3f3948c7a869f81471477a1668ec8b0d3629fd1a2d377036395eacbedc691350614149b99603c2a71bc5100941fe189778aeb8b0463aff81e5837a262f6f86eacd39561265436301d36bf5046d1728608e900311bc33921015fb3f14dc269a04cd25d800e92a7067102ff2dd1e3112d1f76dc76528fa21bb8010e7c14a05529638858f814084db78a418ed04d60dd90bf959645593a343e0814e01e7eaa6591ce65a72011f4f947ff42830d5cc9c39f90377a7226ff32e4a204622a14f3ed07a0e7aa95a76eb8b61cdbd7723a00ead4c4e9279b14e5ac7f72d59eb8ee32ff4284865550b23e652958b3f6377c06e4e9649f0e4b2377da6c949b993f16d8b2584863c306a626c04acab33f6e4bf0356794aec123485653b21ddd01e137ce465593200fed868f3d0e3180086ef51ad5045d1f74c102e93c64dfd8a9a594815f1237662a7db9aa16c85a1b115d72a73a1cd2a53d676b688ef6114b096d8ffa8f74197a3c55035d21da0d2de89009a3f24b1c2926fbf413413a02296c5d5ae86538fcc9f84c7d91235e2aeafb4b4f5f411607bc6cbcb441720dafc495e6b7bb6226a0a22012630be2a134f04605ad1599553cc7f828501aa5bc31351c312c3cc6274100b1d147410c3acb3317820f980eba537a3a977a2cfd980f5d956117b2cc9cda459f9a66e802c8624ae5cedea90117d7a041d2be7239e2494ff0b10fedda05158cac2595cd28af3f70e9f13eb1de37e745ebca53ad92e90684878921062f61a4bb04cccadbe2f01080bd17eb4438f515add5968079846ca719564bd4d50588af8d4fe465a1c3cb178fa192a85b2a60c87a34a1450e99a1a04541214a2ea437b3a73d17b50967b088f728d8a6afff25e373046866babdadc421a69fbadcb6548410ab5e84bd3adad23c7fc6c0b815743628ed323bcfdc6264db0dabacee8c1f35fcb501130ef65758ffaa45fb4d9f5b4a2e86a07cc384a142174b9513de407acfa2f2ed07946a0de05083c7e060332e634345431ff65bbab6b398ac0f74c3e10a2009cf102e2035f63e0a798b4219eed733717af975a9ed91c009137e1c8c859a56ee1b0a67c149d6bec26b962e8c1ef3a9c2a6c81e2d241084182d280dc931ecd44a3c8af1bc1f84194ed50d070002f4dd6792e3d0d0e9fcae7f66f47b1ce5abec492080d15578f265bfbfa0419b5c22db2f383cde8611bb8bef2359a3e865b1f468bcfcca4fba5ab85952f3f2047bdcd8c6188d853d11c020ca088c53956dd957daa9a247fe57ef7d14c8dd1119f2e0f0fe5ac447618be9cbcf0885cde71148b800aee48214275be755d1a98e4a40d82b6e3a140c6a29058b32f4a2daf75476dcc7cd247c3186824ead9be23d93c382a9ba5beb50329c88e090f70c1f08857c338faa2f0784d0ffe15e6d1289430805e159162609b772ed8050f057de39dd16db6197a870267f6b413daa828d766e937e827e11ceb40dd2320869dbf30934b793cb5553b46382f8842caa27e1e90929e972554a3476ed0014754caef249a4f30e53d61ed84f3a01eae75308180139726a0d1113084f9dc4d1f5d2e57edaf8542183fecad8948d9c38b044cafb9479476e40eef6641b8714b40bbf3f6948e6425e6495c45d16e6eddbc405ea1945806e276aff7771215950d1ab486d8d961e9bbd72d5f7d591336400adbb862b9e6f0bc5e888fe897561f5670c6515d9476c6ebf85a9fdd1c5ce9f174149e596cb0be10b3090389f3ca9724177fac903dddf5449d0e909796d1f80b849bad90830cf3ae49f1c7d38c3fdc49ad7121416b05bb72047c088ca7cc28188624fa5788d049503df78b159e2f804be31e8b80d9f45241e6aaa69dd37d5d738fcf3a8e3bf07c243e541461599fac07c542ea3f29453545166d2284ef35339e087c33fc59bbe34d5d834a659365de4a5147625347512f755bbcfeca029a1db776755a115b28da3c395460a2954408cd7c28fcb17ec2b6c4ea2a78936e7001852015a11bd391cc6e5f9f0095bb0810a928ae4c9ea1eb40363d612dc53d199705a1ef56c85011340a55281bbf89d03b11d3f0d66c9e5e742a1a76defc96d54569c4dfa988fb8505934a5d2fd3e827ccaa62161d5dc7ee1c6ac226659764326b13572c007a200280f92fe98b48b630c30d743039066340b8fbcef2228639b1dd44a0e2023281f9ade58e42fb1ebd82077d593129116a086d102b599d1c2c4639a5c483060b821ea8a0faa6432e03f5adbead8b88e4c45ca3fa9f7570eee5f685d19fcedc5d6f0c84c4652336307f993ebc36409407a780682ee35fb823cb3579f8f9eee8771aeda989518e5b51f5e732dc7163a16308ec164d832e0470b936080d6bf2a371202eaf2288f80177a749e632a6229c970284c034a0b1eb4478c90949e9c6f251bceaf75e2b992f35fdcfc3c7f54ff649786aa89c40828772bac05f5585dafa542692ae10ff02321b8b418dfd32761785835aaef9f25396e6e55b024393f2a30a09e349bee01615edd82834d8bdb2e842e1da99f861324e9c26949bc737dfcd87f5a87b8294e93e03679bc63c8e68bf346edf417c68b2a4e0140c4db04e648422544473ba0e1b9182fbe35dda0910019ca340c57e40119226cb3653e4eb2b5531aec3080576629c133179771556d4dc402f8570c1bb38af2b610a838fad03a8b7b4e5611f1e1d4b0cfac654354eff29b12751d9c95e33394be033b899768d692f260a577ba251d8245baf52a1627fc2769275bc114b53655b433344ba44e62acf5ccc9d97933886962a88795093bf923bab98aa51dace48852d8cb086ebcac46ee5a2e781846808d83b945f5030b99d3d56a35f9497fcf29939b398bd0c99f21184ac8c3cb03a84d880273572429c71783ef29bc03aa7f2d1640a170a0d32ed659f005fc05b0d1be85e94526fbfcec849bdaecf0b823ee7d56217fb071426707ec725470f8ea75df4eb26702f30b1e9fc951e3011fe9301c7e33e4f3961e1cc8b8af09b27ecd3ec03a57c21f9a8375116fce79b2860cb0d225c6cb22a78374f484f7d6764b63d5f0796d455c5cd57bc25c8710c0a8cb80b4fd2744b23d6ee9c74851b8dfbbb141a3cb624ea6ab8cc45991b4291e9e78580d13204594b903810be642d09b853ee1702aea4a2430ca01509c842cc81a5586e52680b1992381666ec0cf0d1bf5bbc457a58cf07fb687ef30d50b1dec400bfecd01ec4e50d823e3e84545ea51d8a1a189cbb742ac0bcb5c9678fe0f5f4e562ba7fdefab45ff55ea19d0ebdd1212c1158fa158c5c8998296a2ffa5fe492509d1dc385e77898537c4fa978c6446e9833cb830600393911e86dc9685ed2437b9e6c8af4735f4b6fa792225f309d6e68a2940098dc2f35e0975c71ecd3682f4fa2a1e52a6ff0b4ac3648f12fa4bd81e1baf00776b42585214550116b01f2c3132903db38e06a6e9c67e2063ff4347d31e0165c60864a6078d798ec6d6362103c12fc50bcc9b8cd832209394e3bc5920163ca0595b97b6d69724adb4d2a71f0e3b129b9c2c9d5d264829a1d71b7e2dd13c2468092bc744186b4895f62d48c3810aa29574ecbddfe325488f3a807b37a1b853abf13b27b1e21fc17336bb1f223c395f7a716f30d8924108f69c80774430a9a11392c8d6c7adb618f6514bbc7ecccd828b10859549d1077f4d19aabc853a0042d78a37f573d67b2a1a64e59a3a30ec1a73f2f9aaf6cf19464821ffab4db1d58072f8edada1d5fb1ba21486a7c00dc2c7bb293f62855cf6d3a80685951a7dbcc6bb4825658c64b0900d1ab7047a4098c619d908d681ddda3803ad43ca437813c03677de139538a33fa852541d91199e79b542839cb761641af6f70e146b90685f9b8c204581cd4904c155256d499276b6278a7a20305c6338025066fe6ad75d73571c5a8e4aff9a8291892c7600acbeaa3afbdc7ae6adf600d53d27a613e2811bf58a5f41d2d6078415bab599af6ffbc3413bb4f24853028109c2a7d1d53edb204926c5faf47af2564f0c2667a18096e946295ab017db65cc0782740c5f68e07eeb645c602f057128ace7d507b9486a76aeab8c0b58557ca23c96c8e05f6f7599834bacd84730917a0977463f69c70cad35411feeca4debda78133835831be060cca767d1a23cc3e3e789d78c6fe8603d68169d9daf2267e2d7af6f2f082d137f3e9f42fe569aadfb44f0540aabfd262abf63e6536db6e7295d026fa7869da30ae397ce5b19d01e1887fc42b5175e97dd7c01a56021b0afd8ba3838e29e51f770ebafea84e95b4b08566c32429d96538202eb9c787ee5440aae158e84b7aac3e19419281e3c0b0f2461d1fc18c415f28d92767074cd88fe4b5ed10d35b613bcc867efa0d2eacbac5e981a3abd1b4a920e956977a6285b5fe81e8abb137fd980f645cf358e0cb20d55c47909b75cc1b6f28b0c33220e49f821b0634d1f7e6c0e8dbfc00a8af33e01666ff7e32ccefabc5c043c316fb7251e5b759850eeb0f4d6023da2d00e5cb4da91635e42649f6a684b5ab153142a808c0e33f55a008d01229a280e7b1eb19ac08600d4cb65ce12dc9d67da1f42611d44c53077dbc936e88c4cc39b0d44349ddd70d7ba381608e27a85c432742bb020a4488c76011738b87a2ca8190915d50377a6a9b9f2fc1739659811a2525e88ea182de14a670b68b1aae1a359b69f709818627cf3cb25eb1c03ab012cd6cb42662419da89e859a49102ea0a4e675c301856a50371cbfad100ab67c038f1b54ee0cea520fe05869b66b7cd37cd32d1ad0299526e0ef46e13238400ac40830760f9fdc3fdee970fbb46f299f46986430d57a1a0895605c5ad84b1641875d906d984ecbdc996724b99924c0123067a064906618d3bbc32eae4d34ff245cd75b9dc1385e8d628afcb777b2dc676faa2f96a705ed1c999fd7c8983de810e3846fb598f4498f9538708ede4ce79444a19c69d1cb4979abb772af9ae925a75221556808fe5433ff228333ef429323e9437a90f5554520d4e1fb57e9daad68f81bd4ac558bc193262784d79bc98944fbf7240a4872a20e03dfde9573ee2d09f5f8fc456c4c14172e4761b6783867d96651b76daece946d366b9cd6e9bd5365bda6cb6d9ba59ba594c686e566edd3764ebbeadb463c50ed521825e3fb7674b9745c7d73fca9fef7d8f39270775937eb8ba937e18c39da1c7f367a9dbb2aa5d9acd9bedc41d20262a30775c0d2a9bf634e46a9045577ea1cba5435c6e77317bbaf108af4a7fba983525992e66b920ee6276d3c1ace637dac56cc9a874319bf5d44642a7604273c9bc9895975fbc2a61d6ef105e95be47ff70175e953eda50e600f2c6001fca1a1d3ef429410a300ff0491d7f99ff8106f85e87cf0bf2b94c013ef697144664fb2022704d1fae481db964fb12e723cb4e61e8a8b247a2002fad2afbd3cbecc1dbfd4af7e09544e40da58ecb14e08b3bfd32bfd64ee50b3b0ff585fff1a773e79fa250bdad4a40de8d6ffdfaf5697d4a3722d295784ef61288bfd9b0c8a59239f999ad9257434cef0877823d2738f9eea856cbb1d5d8f4e5a5589d456ee8288223482104f95af76cecd56090d88dbd3fe6d31e7547e929dd3557d617b7a2071846b222087825bf5effe24d932ee47123106d548f74bc6925bda4d22074218fb0c6302a8c37d1034c822b630aae8c2e8842c39c8fd81db9c70ba4cb3d5e10ddb041d0e305d08d2f230dca2951a906e30d373f9e28afc1083418bf5f990f142858c44d738cd37c8b185732bd66ca4aa552bc9a86d50885d3b6cc64ca366dd3368dd3a0681a9765daa6699ab66926cd64d2b4ed64fa2ddbb4379d382de33015f7010123a6d5c8954a25ada471ac7916392ee3be725fb9afdab7e45ecb38d363167bafae6d5ac6d735f7df3c3b656eca327fd3e90b4ffe598d5b8c264eba8c528ba55237d36d25cdb137d9c955f7ccfd31cea46dda66e2b48de37ee334971f435e4b84e214243d6d74a313e449f28889c33cd3b4d3f61add4c76be5bbea957d9b82ccb5031ba9329a5120395752753966948b1c5493116699ca6699f90cd2dbd181737ad765babdb348edb348ee3384e8b2ded156391a6b9bcb02d42d9324ecbb8d7366d8b18e7503293c671a66cdbb62ddbb22dcbb6cd74dab253663a9d368ed3b4dfdc6257db66c4662cd27ed3366e45c6d337653256386dd32cdf6b6a224b3476a9b5eba2bfe6b6bf47338dd2126a8471d065eacbe7c165ea172550367325586b846a280b613f6b66ad5d7765df2839b6a947cf8f75e412dc5feeeeeeeeeeeeeeeeeeeeeed3eb0c3fd08f385168d6a2a2c1e27dfc968e9921e3e34a4ae563a0be3bc5983e3e0df171d061071e5ae6fb8d0b12bf197ed8f81a6fe3a3a1c1e8df8f06e3e340a4c6c79c1c9b1c9b1cea2ebf3faadc74f4ebdb1bbfd9eca5b5f1737ec962cfd9d29b4cdfd9d3a35033ac8cf7ec8c67b15e0d1b041134395e6be7d1d7b2adc5de78956d791a56f52c96c66b36decfd62461e3699496d085b1c88866df345dd287adf31f760d6efff40b7ded6badb7ebfa470bc1ab7d61d7681ff68ffd42f0d6b07c378d258808689f7141b67767d96ad4b8613b4868c886f524393ff00bb3246d4a24d6b075ab516f8bed20956d21db43b6891aa4efd92e6a19f4576c2335d8511aeca49e82b24e63bda6411bbff19711cc3ace910691584fd22ff437eb4a6c88d7bffba7f445f1a98f8ea24be5fbd060186f4bcbbc925272fdd3405774612c3ae2e216754c51348a475f5355a78c30d3329ebfd0af3c3d03eaf8e1352bc5d6e95972e9f426d39fb83967366fb51249023548ff475b473299ba372544cec4793ac68f2ea5d4832e3d7de83f973ed3faf4c17fcf6b9fd327b5ef0bbff4994a5a1007c4f4a5d7b8ad138a1ea563faa7b40c76336b7ade60498c5cea72e4d2caa6af9bc9a776b5ce984ca6afa65a6b759bda4f72dcda4f6a3fa9fde4d69f2cd34f984735fdc60539994cd99f3e33994cb67611787369fdd06b28eda3cef4da87a7d7ba0e6ad0b47de58298be162a7d0f3548bbbbbbbbbbbbbb29e7a383f4972af6fe51857d40c0eb7ffa598f7852940603dcaa35f459b8556de8af70abded04771abbe5a9855e3e97bcca2f1f4531db3504f396e552338f4336e551cfa935bf5489c4f7f6356f7f42bb3eadb78fbcd05a192badcc9a12fa9f4e7b8674e218567564185675e6185676eb59e7986199e19000078e60004e09905208067eed1e399ef7d6697eb9907308067a681061fcfeca38667aec18667b6e1997ffcb881004070003fec9bc333dff0cc04786620cf8c03f839fc8bd54af6c667b6f418f627bbfd8a3dbdc9ae7c0c6b9a61532acbf22d56f5356a586be373b061c4398263e47563535369a62445413a322a221a120a02fa69c283273c7fa2e791cea28b3b988fbf10c5a13bbdacc69d89d320117964fb808077fb2daba76ecbb05931ec75eab60c9b589d7362d367fa80a0673ba813875fe63c8265301e108a3ba70e3c25a60c5a10e9c499473a46856158f6f29cefdb893b2a7cd835dc875d44cbd088346530a4f81375c0acf91107dca2371186592fb5f3329ac2830f3e86e4322de437b1358d44980ee9ce6723f406e371196eecc5f39ed77594a7d6aef3bcf025916f39581c2c104b007b83fd616db061adb9f36bb03e2c0d7600d665afed61056003600160433a74e7cf605b7605ab824dc186b409e5017de2ce6fd01261c18672893b5f870d250eeefc950d6513777e0b36944edcf930369451dcf93b6c289bdcf92ed8504a71e7bf604319843b1f061b4a2aee7c1e36061b4a2beefc181bca2777be8c0de51577fe8c0da51677be0c36945cdcf92c1b4a26dcf9396c28bf08a594508211ce0bdcf96fc359c49defd303777e917f79dfc6cbb8e375dd8eb5f54e23b185bd8cdcf9d303dca23f3f20b861966604b728105007eebc5104b76850d006eefc397f5e806706eeccc0e0161d1a0a630ab33029dca24444504862d6f605b768519113a230ebc4046e5123232feee4825bf4e8680947cc3269c12d8a84b4c59d2f8d9815e3e7cb2b661677be2c6296cacf974fb8459322cc4c82c2ac9415dca253aae056a5a1825bb52608dcaa36337e7a3f5f06318be5a7eaa72081c608b786083653dcf9520a6ed59b26dcaaaf08138513dcaa382d3f7b9845e3e74b1e66c9f81b27af1f5c233d90505c1b3f5f2ad104a35a1127c2cc9d25b8455f11662e61566d4d9c08335feee04a1ddcc9c49dafd1b02bbc0c4b03f5d5766fc3d6d7eccbdfb01a0b2ce8d0b15ab5d0020ccc8e1d2eb8f0c20b30c0c083470c31c4c4c8c8ccccc820032b870b8eef5be15b6c0d16ab7acfb2fc0ceb7dcace30d918bf624d7fb22bbfd9d363762bd9ec6d58f9376ce9e30efd499f4e201658c05e3f3a74fc00ad5640412db4102404032334b463c710910b2e1015bdf04291110c30181df1e0718414430c48516262a224c9c84c99f99929777ea591e165a861d9e4b87179e1f89e5593c3c6e5e6e2787d5fedfffc8873c3c6cf9f38b16571fe6f3c8e8d97bc61c3ecd27f1b7297beb59f0d572e7d1cd6c586352efd1c36b4973ecb86392e7d19ec8c0d5797be8c0d5db8f4636c18c3a51f830d65b8f479d81000973e0c3664272efd176cc8515cfa2ed8909b5cfa3b6cc8525cfa30f45bb0215371e9af6ca8c3866cc5a5cf820df9c9a5b4b39557f451326c6753bca2bf82f57845bf866de115fd16fbbca2afb22ebca2cf62415ed1f7ac0e5ed19f6177f098e115fd1876065ed137d91ebca2bf6269f88103afe86356871d7845bf6479e88157f45fac0fbca22c2577835f57a2e934b8a4c1b9037e4c0a3f3ff2304b859f1f9d601667021e01c768b1e5432f1adc6983045715f8d0eb4efa1ad5a4fc42292995a055c92fbd7c156c0ad9a6da8ceef42259e353762211f67219a9233ff9d9679f655c0ef2b71dee06f9db977df645222671c9d6fd7c5903669d7ecad366e3c5a4947f929ea3fa70d47442c80c874d175b7c4b4f9f48cb6810196f26c4b695a200993606ed658f25f37c8c5c98cb3d51905caddb342a698cb2c300df7a2c281a59a685a43b01df7a2c9c798ecb8065da08fc321f070e954a45e5869ea3ddb0359d7e99cfe14cc7e3f900a9fc8948cc88634cee7cfa386e3afabaccda3a26ca21c9a46586f097f926d47b41ddcfc76f769de77d3174c1cb3d5f2cb91a377394a6b0080e7da9de6f581c39647ca842f85e0ca933947d28a7dc194a30ee7c09e432eef2df8792e85fc7797ce2f4cbfc960fbd1a1f765227c717d68ae30bbbef0b3bfb85de7f37beaf3ec501ddc6651a27c7a6e5b389452ffa729988037e99affa42d0e6cea7f1853fa342151f04afc99d1fe3e5c48b09afe66bf3274e1377fe9c3c3577c68913274e2c0ac38aa7c28be2ce0f1f7b6e0c3b892b891f3fb3918749dc69307e13b94c0c01bfc4cf2a2ac6f8ea9f28afbb4bec1322aa80dcec9356b5d1af0ab50cbbb2af1a4fdcb961e449d55aeb0c0d7af581998d388cd7b9205eab971e8b38545ec2e571dd09377e58398c1b3fece2066efcd08300bfc4a71f0f0dfa374da59f9c8f0834b835184b567583f6c517afa24a26c3b861cc7834e8ee59fdeaeed53b5efdd031aa1bea9d61bcdf830f40c4306ebf4b835bfc973a1da32afd4b5562231207cc8a4df02a7ed47ed3beadc1b02f9624c2c48f4c628c31cb6292d88aaf08137feb2437fe4f34bd0e37fb4cd602455c9c7cce66807b0b147171f1155b52dceca393be617cf1cfcdbe210c748508e117090a70cfd775e03eee339b5580e63ae5325084c6554411573771234fa22b6d0f1dc3503041ea41127991ad7328c9228b2c8eb2c8e2288b232eb8b8428b370d4483f3dd86656c93fc1eed577e0d1f1f496e1310bc9af2fb8157335d793a1f6f82ddf308a1ddd433f7f09789ea7c8830f3575aa7e7ca5743d9d6e1d59220217a35dfaa650d4bf1ccececd001e74ca552dba3507f42fd09f527faa7d4cbd4cb5437832e95d25aa7757450ef6d94fab0b5b8f3bb28b57141527f6aa293c60149a5521faa3da9254dbf7ae3ba6db33eb63fc95a3d27510a86f9018a480da21ef59a8c4d760c2aa262924c777713e1a0e9c24642c40d9e6ad7f9a056ac5f8d8525c66b9d922e8c3ed187572b5bd78de4a863622081ffeec3e3d53bf7fc5f0ee2ac441f268a4ea21431a85fe61f7945432b3adf75ddc51f786f498d444a12b3ba70e553bfa156b646824a4225a192501f6611f59d655ea15442c88bfa204e17857afe64ea2bea5342ea974afde94ba5dc63ccd4770aa391cdf28c4ff4711e1df709bdc9457dfc191704f5271e663110d4271f2544bca8afeaf4e94f5fc84632524b9a8888888759f4ce7724efa93f5dca6b711e956db33e50af534fafa5b6cdc6db4af06a7ed7806176749cde6a835f207885c2bc4d211117f5491919cc427df7326ce497d3d63d0b0b0a75fa30bb11755a9d4e1fc4e99e3eda3a3c3e40f7d542d14849067743f733362fea216dc676b242d48bface65dc3bef26ca5f7ee336460d1ef54b6cf5939a3b679486c249b873e56b222d3abeccc298c56ed4325d913a4ff268a44de73c1ecaf21dea1f699d470949a84f3d770cea4b52b1adb36407bba71f346198f93de63713ef5dbc1621eed3e0ecf93e30ba19a33a3d11d931aad317e30b7be84ef7e998d601a25fe6c79b7e993fb90829fa18d1d1d15909f272bd4b42178162102ee582a45efac49f08947af92b2b5f2864e525102f146609d1ddd3cfef27dc3afd54f9f96ed331318c5aa675889885faf95dd431ddebb48e4774a7d0d4949532b6153b6fb7f253c7d366772bbff22bbff22178b594759e06e707462704fbecfd13922222816eb3f1c6291d533f55fdede7c7a48e51d56fe52322bde7731e1530860e94058257f3a9d5e2ced6711e978946daa3699da4249d126f3ecf8c6932bdbc26eefb8157f3b778630fb34a5f0dd9278178a9a46147631777efa5a70024fa4dfdb68fec7e75777777777777777777777777f757a3dbc65fe66c24773a55d160f166c85849a9c440752713b769a50cb375e382c4ee96b7d1e296887fcbb78dcb74ed726a48eaee8eb963d43de9d56ae36b0dcd967edbe8b7d4dae56c2a6b43d62451c3735c49cbd49e8ec912ef8b3b7bbab648d9f35fe83e2d1f76cf7f217835cfc67ba3e5392e88f7f2370e88f7d27bcfab36543458fc08927e992f994589c4dbe2598fed6ef26fb1f5caf651d1b00dd4419e6d21db434dd4456dd4478dd4516c27f514a7f11ab7717fb911ebd6fa114ff275cf169d7ff7c89b8eb1f11b4618e45018dcf96d7d68f087291f65cefe322e87ee69d0c773ba4767d6e052faed39f35d0903a1947e363322e9c6304cbe5adae3d1020b2cb4f0bcdebc6ef3af22b9fd5aec64d05940328b6fdc6198f92e5dcb8bd61d3b3c4244f4c5a044425f988f18c02dfa448499f47d5000b7280f7880844bbf0766dd78fa09e0166dd2c408973e0f0860225cfa3b302b7bfa06a0af430edca241414e2e7d1c98b53dfd1bb84585e8ff60d6e9e9fbe01edc95a77f198a4bbfc703400097fe0ccc8af1f465685dfa33cc5279fa31c85cfa3c98957afa2ec070e9ef60d68c283097fe8a5b344a120b97fe0bb76812fd1cdca253e85b6e551a1dccf2589ebe0bb354df5273e3d2af11273841b461e2041f90b14406c44da149e198e076c0f5a820a1929345819b428612329650c951c9d1a46440dc14dc141c131c138e890a129a144d0ac74493a2497177cfc19c42a6c2e655aa20a18284bc75fb2e0763615b414e4d0a33f34b4a1d9b8c25ba1839a28e50c9e9e287db7569c3dac2aa615a883b78c2f08e66d9404399c0dd7d02fe2baf2ebe63ce7d034c62920952d626a840ca8f35d099bae8c2bffddfdf7f83599cb1208644c4be7d018d5da2952fbbdb22e59a07f68743309dfb5a8c5a68a994ca758fceefecceeffc429a590a617f65940a594995bc52aa6db57671c4c6b1a0b258a79d6faa14ebd9857b6a48cae7745781bbbbfb279330a3bc2b4256da5b56d86319fafd3b5c867e2e9f4bb4572ec05eff1e8d6153daa053991853a9f241bf6bf36830ce7011e5861d0f23495b80a0f3cb3d494646e8e6e59e2428b5055d5fee497a422d386d8ab74bc30f1cb698b323e927898adb5f3baff32ef7242db95b377b7400448927b0b802c708e7082a7ce273fc1adff361c291c86ae4c1e183ce7319e2729f4641a3016c0a07a67b6184cb16d4bb510946788f1f3434183f220e78efd5128451c58d1f3f21441a1a1a9a0db8da252fbb5cb6901ae8c228c1bdfdb59372ae8ccb3d61d0dcec724f184db2a45e41145c45acc22573e373fc1adfeb016f6455e182268af083274db0c2933826aaa04942090aa2100507441ab880c755c4e5b6884b6b0de0b858b0848d4b933939e07169130c1c9786d9e08809367473db4a4880e4d2ea921110ed649bdba8c40e914b2b2581e4d2b4cd6d8c41122497b64519600088bb400d725ca6cded0b374c905cda69731ba120310221575b150d5c5a57821d9786dadcf21348c8018fabad0a8a4b8bb1b98d2e2882c6a5a96c6e2312453eaef8022410b9b495cd6de471428e4b93b1b98d492881c6a5cd58020837341e0d1a97a6eac8aa9f9f1cd0b8341625a020041e1695ca894be584c6a5b574e49626433747483d485c1a8d2549a0e0a37272a4ad2a7e8b11ae1623685c6e55f1a37169353a720d6992bfe2841a97db08851348f082c6a5a9e213903c8128090eaf549b5bd50e5a12aa1b8a6efc5421b8f1695cd2247fe6033f3de07169b1075a0c21cd23374eb7d1065d4c01e46aab72e2d26a6c6ee3103e80c4a5d9d8dcc6245cf8b8b41b9bdbc985133c2eed9b670717c8b1f103509aecec58d23de10946aeb62a18b8341c9b5b22e25011685c2e9b5b2298074940392effb644b418e1f28f3b867073c1f1d9c78103070e1c537ac71cbcc3e4435b18a171b56557914844b7f681e92ee5f4e9ee52ba942ea54be9eeee729352c494524a39a794524a29a594524a29a594524ad9794d3892d4f574efb6bfa5c4989358d62dbb5bb66cd95dbbb6ecae5d5b76d7ae2dbb6bd79652c62143b61edd5956cab212f6dedd2f9faf3be6d225ed9ae4ca9a73e576faa2144b4d3897f8a1cb8be3e4d13c7a07bfc0a37938e926f48d773701abb199f335e7f47ec57ed1404a17256fccdcdcdc1ce43b78f0685c0d5bdb2f1cd25f4be91d5c3033b3e4366aa3c6a28b1a8b366aa3aca46d1cb778dea6993ad5755ae92431efe208cce7275febba3802a595e808b8c5f3b04e759dcf482546e57cb77756e0facfebd12505526611db27b7781ed6a9ae63712c7dd860bff4e6b6dac82bf9d436afe463563ae8f2eae26793a53733c7ccc4d80686e898ea79f487e818ecbde80d21597034d3cd8033fd229f5fe3ea457b271f0de117f921eac608c58e90cfd0a07cd9034f9fe19524e202c12bf98312ba70e6ca283d021058e101dc02e31066612fbb4efe8cf3aca06cb9c2951978e212318cb1971d73c17fcfeb2e16b1e7ef7ae0150f455db8dd0cfbf8b126dac49b6f000701d132333f30805b3b4418ec31ec3b0f9bf91d503762ce8a1ff2102e26bbf932cb98a852d920363fced7c442c88aa0201704797d9a75920663ff341823f7e18be9437b4f1fb2c4ebfe276bb29ced88d08511e9ea609e57fa3ea993d5af87fcaa2049bff055819206dd39f4219fe242a5275d164a235286fbf8cea4637c09a59e73637c89533f963ebe3cd2314898b5026669ff9a0de254b2e1f68551da549b0663f6ba719d25fd6223c3b9900ff58b8e9436f57b09314bfbf85e85d7bff11e0bea7b6532a82312dccba08ea942dc2724a7c1ae059d3fdf5026b9f10ba30b65129ad59d8ec998d48f724983510e354844c6a18e42bc8a42682fe91821fe3abed3314cbc090fe2847da5cfe42e93341873a49206e37743e8426924944b7294f814d950f825fe16d58b0e0a4219882f9774cc3e0e491defa7eb89411d23c4713ebc14978aa884acd8a98ad62945220040000000b31500003014080643a2d16090c67130b90714800d76a64462481d4ac45912e42008828c41c6184008000018428c99119aaa0100b17a19c30de784ce1de75c2aae63595034f96b9a98db8a37f70e589ee884ce1d16416f5b86cdd6e92d3ea389047734990b47ae65e677ab79623ca6bb157fa30299d913fa3198d0378812c9af7e5f21f5e5d8b6f293ba1e3363e3e5df849a1d4f622b6950ee41b30e76e1b42ce9d0c4f00cc85d94a9b426f7e622700547c4bbf597d074bcc91079e16f9fd5fe847556c4d8038fb7f2a59fe45258210f853285d27116e84e782f30fd042824b463acf2beee87bfd2b43677dcffccc401472f3f39e0d59f36e1485bceac5d4fd373bc2a69d53e419e958a8bff08326a376b206e71f976395d4004f41ba4cc8433277f7aa5629ac1b9371ab766bb149d9c3b2f19889b8c03b5e838105dfb1af83a3b5cc7e084c9e7d40d5127a8aab10d04b945ef3783a65ceec77504642e3446ac97e37dfbe593db736eaaf5b40c6f3821f3b610ab0bc4a17c6fb32ea8d10981e4fb35ad78c0afb8b3c8d4275a5e58676b406838479c2e422949cd5e85fd14754c2c266b1af3d96979742e0a1f854682318b55e15b7b1519f0420a31e46f8848298373fad5cf434090b3980489e0bddc8db88e03da028591c20ec58cea3673d97861ac06e813f8fccec9166e8fe0ebba982c443674f4fa4248e139ab1f8329a2204ad5545800c864bc7c525a8e4a38232206d16597641ee54af6476842875feca01a83de7a43337abb34c0b01bf3419a3102c12bcd441217af20af7808fc12a599586eab9864a96953d7bd53f63e9526c91fbaa0ab31c39a4923b51dba8c4028914b532d2630619f2ef01bde4262c3c3431e8ce20827165d5e7e6235d66085afccb53967806bfd6de9ebbcca7d56786cf459454044bf75fb3f405dfb9c5e949d511873ec286c75f795bee90f6634e6b7e97f911cb040c8aa781121b13b7075a1f6ed81627b6c1387aa0e58c8fe684a15f6e7053b58b5293714adc2b7ac46a0f15c526dd15e1a84c6a2bd7118dc6bb7b52b09b7eabb30b574fa4cc518a4bf1e3e8fe0dbedc6ef107841946b250429319b7c4de4810b16c412222189b5cbed97769a83d24723658c1463b4f69ab7b96ad02f18f0dd5cd9ec209ba4dabda98e19bd46d25302d5db7c7e705202c6207ad7fbd5d9e2c85e0e472608a0673d0b53e78117278b427a8ff253e1ed459257501899a98252d6d42d60dafc7fc73c5b01181220003f6be26a86fb2b5ad1d0e8aea2ed1e3abdd69bc4172a8add71139fdb43ef9196df8c22be5a911aa21fd458d92e99cd454a845ac1aff452a0254a74bd54758e48152a3c2e43805f58632823a4899ed904195fbbc189155ca3ef1a26acde39c391d65a29814fc1a22a6194892b26f91440d0cae745a6c5ef379dbed54f522eaa1b268409f916dc483536ce6741bb99c749591d3067c34c58dc37048a4d5132c2fe67196ebb10c34bb94cc6d52b4f4adc72f0ad24383fb11a3f7b1ae8251c48aaa12f4d464610d266f3bf898bb678e4dbbde90d553c7338a98f59c8d5bda5525679ea98ec63ab4e8fe8bece513979c9d03743499e54df2e2fa9ac60147ecd6b69c3c4fd067450dbb9fa8a829c44cb752ab0c8897f79ed09bebd37b158bd2090f666fe3ddb7964058fb2276a4ef460818d27059371c42171689bbee56041a2735679d0c6e98cd917ae8013988c0a422c093380ab0bb26f92424b0eb3e4581915be054341c532ebb60237f3e1bbc23dbff0c6c8879bfd140c91d48b110d9e928a1615095c9783c43c5bb7e25b1b24dadee994a509effb2c1e01e09d92272ae2360978a8ac9692478e0d3f02c50a7865fb11bc993ef38797879178fd20e45e2a32f4db5c7ce3dcbe816fe30291db940b57bea347dc8136280851444dee0eeeb658087494caf7e8d1c205d5db4eb7e7b19ce7901f203e886346e043b83640b0107646751ff2af6d1f8ff91e2c183d85f641216ae7b2d1b7191e098d1b184cfe9343182a383cc9a73bb7ef3f8544428c80e9a2ea70be82f70a87c37ebc0ed27adbfb08ed02a16fa874a17c9f49022bd3c9f02fc292819eb66718911df86fa31aea69a4121179cc7b5f3d2ca36c2a2a0bf8aa783ec21aa904c1c845a372267cbdb0605e10d6d5352d624401996ecaa1723d21862dd08efc21339939227a64e31cc1d6b6e7139fb83b260748ca8d21bc7c771165e580942913c31be79d6ac849bb8c90e9658c937539ac11d29beeab794ebaf67dfc9064090022d602ec2c085bd52a3bf4d44132fc15b2e382d85fdbfce65b06fb18b892de73918d6cff9e33e6cf35b410801ad0d5f2bca9d5005e51cf40a20c19111751734d17d312efa30c49bd258264ca4442f071c256f444129174a1040f81eae3c8a3c9d5a3a146e47de4cbecd44304c7ddd82132365c0e63cdec92b3d4870bc5f8de40fb1844f50de9d3a1f21088155eafbd481b3a99a83d7cbdd7c22bdce840bb654a0fb088ff07c4feef29f431e3677a2807c4787ccfabfdd20a6a8fe2c94053fec028c5590fd6c8757832e68d54e9067578f0be8beeaccc4069524ffc960cc9374cff32f3902a36c6d3efe9aee47cc93edb1dc653edebf14cff3f30b579d508b7f050b4b28532d18f793da68f4b81a5f72d6363b0a1a75b1b2fc7a1b863c2ad163b7042d04223ecc101162c3561ba6760febd8d566b4aaf3a5ae104a3ee9801ccd476e31df2259f0b81d06fb0f0d2795b7e853ee1f43a158b272ecf00edc13b0f75b4dff8b357e3858a127d0e7a6d09ff27c94328236ba042078661116e74d2680798b1e07289c6c92003d94e9a6287ae5f8fd5d3be1b0bb57d659879b382800c64127777884a6121a5a3531bc1de1c6184459874f0112847ef9f48592ebc61e873139cfdc3b64b1c342de09b81473f2c8090687cdcac5e1fc6eae09124dac924eb38601a49357ddf35bb05e8767c9dc8696ca750015848e67887e187d0405d6f07e99361af77c9d3e584082adca77ba8c0235f6b68cb0771f907fc95679957219ab6fc18a6aa0128ef60ef7ba114368ae10819bc8454cc1d40e936cf8677744f1301b103e3506221e5703134f2326c239b0f2127c76632612e0a386c17198a39d636ba7c015f7716ece21234fce12c2330a03787362e7425d3e64d1e2a2c61f2ff388c4e7b89b8e6f8d7cfbc9473a3a0422e3a2472f08248234bc510d09a3c96d8208d226a9e6b942d7ca1f637b66b9e21d1e452f56505793c677039c0f5b6b95d49468105ae685ec4af97afd267b249785eca4d3c58cbb5b77732b91c437070faa6a5acbd4e70f8efb2b41b4fc4ad8981fb318f84912cb25d01119b348d6747ca6a01f46bc202c9c29fdd9d38adf2eccb452adc51d9587bad22185559808665d15743fa94aca21a9a10a51df2d37d07fe21b521c83e38a387c5cbee9b186be985c4bcd3744e52bdef7d9c6cac40df877fd215876265dda81b6c6796fd242ffec0067262693677c1e5cf766fcdf71b4dbc0c6eeab2495d31ecafa1e45ca63c480ed85f6924522c31882bf31bfa90636a0c134b1ee7ffd24092bd41ac6f2b91e88903b0fc6c84aa600bb92d1c8654d4ff90b8bc92413b3fd20689f6d7805fa1138661ceab323bc887f914ead25ce5517637ec76e9f170875f09048b67ad1dff897f8d2d11a4f12143e52732e3c2d4871d30f9d38cdac0d3ddb4f6697df893f7609d79901e1ac168ac112e781e1ec0d771628d9307519cd30feea178331cc10bb6621cd3142520cc35455102ebc9eb86ce0b129fab9fdfbf6455af62acb336b129d7e2c771be671b87567640a196dbbeedba5d988d7699e2fd20d32bedfc7f88868178644ad073092a8ff1a4a6c26ca4932ee4bb4fce4aa58d74b8edbe4917f1149543abf13579d1f0d81907e07e19472c599cebe4fdd9364cb2f049413c029cf716966ab235e9268ed5861d30d4a2ecf114cae0ec96e66e69bbc2d8775ebc3bbb95ec70db7f9303eb968fc6c34ef65850a1948fad81e14ff808eb5fab734d3f899f959f9908f245c19c29b428403d9042220ee96b71148f48f3c1f13de49a7742a986d9efa0fd9bf52b0c264c9e6c9ea134708888e1c5024b3c19d4673f53219569415367cb56f33149b762f9683cec64d655f81a86526f4fc42c74917cc60498156d24c592b40b8188ee53f43fa375f3cccbb5e6b43dc131527394a665c8fffc7de90aa0441c5b9f3122551ed8d1442de618d2c3d2a798090476c180a33b0368eaa70fb2cc722f6d4c923ad26227b65e99cfcdf59613b22b44dc5e8718b9d9f814d1ff07eb4adc050b887ecafada8cf64fa28cdb79ac0bcb0d2e25b47086428b578b85d9eeb4aba190823fcbd46f28800923e6c2d0462b87c23630f9b3056cf41c42087e1ba12cadc3bc3ea98e2e3b87329ae02de30111325aca0fb7dcac393149ef3462bd4a8dbbbcfce28fde44e83f1c01d043f4d24adb1b19471501d05e5e162d3258068241c205293de40b351e3ce20bd764734c02199ba2833e4d498640b1377af13e4910569d41214bbc4e29e394a1289b6e6fad1e1443c2cca08471c5ded05c999765dc632fbc7c5cab4af63391cdb7404112b2564b8b92fc66af735192051cccc859b04caf2cc22c66f75238f9006e41c1a7e7911850865f28e9ef51460edabec74f1fdd45b4c4603bb0bed050b36ed68650fab98e9da810ab608677542c129dabe490026a52f25e8e17fa047e60bda8d7d9ee47717993e0e6c06add125dcb2830257b34eb53d2b9ee3a337e082f60653cdbd9431a89bf71c783eedff2cf95800607c563c5c878c46896b2e297d4aaeaa62b0d34982585b31600cce12dde18bb8dea6e831ccecc88046f914573d8e412cd7967bc2ceb74c2b910fa7c209aae293b1da3bd7963ad15919d7f52dd47ac9391bfd7b98757aad2f2ed530533ebbe4a1572e8359b389d3cf5cbd433eae4c2db84519f3d635a944c016d433770095217f13c299b041899fdd149bc1d7aad51eab334d0ced2ede1047dd62432209330f511be0dabab4077a68171d05506f5299da5758a964e2b08c3d00d28fea0756a2645cdb46f7aa0f406b237f1817e2f1435fd45142b85579f3ecef4b4fad9d3a09eee4a19156c67068da9313d154f312f3f4f6e546901b835850618a8f67e3f67dc69f5d7166e996ee8bd12aae6f5856a780f5b71efd0a185f18acd6eac330f69ade13f9e2d747f4ad1b9ca293a995bf4eb62548d51567a76d4b18170528e0cab7ec49d6961b0e4ec7dc4479c5480173d98395479283499cd2a82311f4ea030e875f3374ac26f5c920ced5fe71c7fa3733d850a4e866a2980a83c048eea322ba56993aa773f026bbfe2fc21d397a87a98770a5040a3c0835a614af460aab3dc230a2d42bc8c81ec353d1bf9e81f52a9f10668035d7701036be2ee3baa948d151d41dc25c01bfb9a991e95d592e95331851e74bbf8c06750274db5f7265eed723493e8fec664c31949235c99d12f352d8cdf03f825da02d8fe22f040c459bc17898cd782dc5b3e16222f55b7ad2ca7d53dc03588c636532a0f5a45cfdc689eab84771cf50e6ba96b603785b554045547eb6cd7e11a231e9324d47fc4e0eed3728e1c7c692f0497e65a8ae80de2d0e8b545c3f02265c8972ae5f0ca143c804be25b1cd9d48f8ee9db40bf04d666712ab06338f08a9f58ae660a74331f9e690001d1c49ab1374b02544870c3230a4659b9e5ec12186b8fca88995eaaae73943491325b8b8592988fb86846520559d32aa53abd28e9a502c58be212a9b9eb3b4a4720fef4be0f9bf6fc26212e9c7cee75608818a0fdd6b57794594c8e4a089b2190248d49d03d44fc5ab20143474992b40fab915d3ef545e5739a421ed9296698d4533165c658e295061af1d0407f6391a47a095e23706c16bf3242b68ec701061a322cc34fc57c099924ac6620c08d2b684a663337965aed8a19b87873c0b072ced7ea0bda2e117114c63b8e46be326b119f3baa22f806da686292861cd09bc47010aba6e1ab0a996a280c409daab82857c7e6e5c34ba5cdfb465d376a7617d227b01ff4272938336e81040aab318f06daba685b494a221595b3686245d5be85c264a35b8556312c84a08f1b8bb0615f5901e9d72263efee40cded591b9c803a69fd37f09c654f834ae455ea1460baf50e55a7650443f7d6ba52d20e372a505ab59474fada53a912a87ff66a161a3ec965ed84b84c64cc0b155724e61e24b92dec1e13ae091129a186e82964a3bdc78ad4f4ca60498368bfb8a80054c87dde7c618b0ce768ba43e3a62ac3bb08bdcb67cb4ecf1faa0a84449b1051315ebc11ad19af8b736bbcaeec17b17eb365d05b47de44334977b2666d6190f2e0eeb479fc393bfd54baf8eddbf04f13b61022ddf0b65f33b111b16e76ae9e2167792314cc99de293fb40feb874ac1f41987113260b65ea88e72038f6be8059430cd7ee6a5d7005d4f1ed37f482c25ebcc4fc7a2c4d57a04b5573053f8a123413b7d499f9a768b1a040b3c43901725e41613eb3f289646876ad293dd69eb568acff2b8798e1a337e99a6ded8ccb21c6a7c248e0942281b76ad2acb17bb30a0b353b3313e176c15cb5b619eb7ca345cdeb940e5e25902d0f3f70a5e3f3aa2a892bb3a0a2d11df62dfcf22d60fad60fa563f579ada11c7285fcf71e9f4990c0668bce3d8ce1074613a9b5a73f8e76cd856b5a8bb72dd84c84675fcb9aa9162d411886b9e8945e5475cff954e94fa19573dccbe826ac05c1457cde23c68e96486298ecf845bf890571cc7b9081ff03f962ea9a9767937ec7cc75c478de7b76cb27d2fef2cfe06a077522ecafd42c1122a57997e2690612bad232342a51c2e52ffec91ffd3b53b1c7be433d0835922cd098f9cd0f0e03d0e1cd9578b17035f50689816c0e1a79a93cdefc622ab5d9742d0c940fe8218dff8110ac27e3d3fb311e5aba98ce88bea9b526e7613d74ea796368df4116df4475b52bff529841f660934776853ca5f85210822392af9db46bf78f5d331fd5fd35f52fa2ad37b5cfa07d1cbdce14ba1d758d363f9e7801ebe63eb70a8fac28343d8e310327265056e8b6776869cef04a8a6a8870cbc7e2769a8bc3c055571cb943ff762a0d00fa98fb8767a793bd24db2a18ba3842dbcff10d7a126ceaddfafd0a964fc8bc0f9c4ed3e875e826282f1a53892ce701427d19ae982e1dc249eafa909d730c8cee095691e35cd1ada716b9defdea7e84d69e61dec22fb446b54d88c88c241bc5e7d17f966ea9564d7dd9ec07d58df73fde4b25456238fbdeab72226ff7e5aa17765554643d465653345188edc633c740f829bd68419aa3674066c003982d81d1c68d67e9c6dc4cdee2eee375ef30710856cd53b609165918a4df236cd0d349a604595a0a24414c0efacea0263dea96a871a4fafdb537ce8d0cce03392eb32c5c4cc821bebee61332c8b455a9198390054292d057476ad37f042ccf5baf9f202191a51994af3000025d9c69bf8c892656f19855fb1e26f824a56211fbddc258f2363450e02d5f1072b200e3b7eeac8432a6948dd15915f32c484af529b37ee2ffd394540e6abdc54df7f17180a4c06625f448ba3017fde33006196deda9901f347e29649ea460b5e95b73e8d458d4adc40691c89ed61f7c83b7898b6c839f46192b53260770f1c8c81eaba83015b8f7050d23d0758da16645d040425be221b8bd1fe5987f2f21e90fc0e09b5447d88578b56e22d9b0197b5c23a832326690b202a62e9f059ba53662584270ac19e8d6bbd1934693ad93904b1650951f40da2871ac4f9deecbf2dfe724219f456da6fd450b980e955581c759fd2c8489c9aeb777d8cc4565f1163fa61451daba5741bd6e27381645b483f43cc4a18af847519e34f6808d3cb9d2f59fa6001335eac689dc895821cfbd4c04e5e2cb4cae493038edd7a42e24cd88e6c8447b2f7eec9d3163c7cc5b6c4d29308dc5c491488ea1aa9c89fd0e7b50eae4fdb101079eac14f69932c30a8dd96494bf58c866978c0de125f4d489cc016d13e67d293e6f2f2136865203a6e4a1c2b445d5ee634b0a7e31c945a3e4d465a1917e00b26498e41d34c3e135cc31b357ae1806b766b6fd2988e78570f4080690cc253b2d535f2a00ca2d2d1d7bb708524d2c3233e7e83960c91f92b0411348d431438a4335fa478c85ee5eaf85532bee58f18f3273e4a0655cca75d870f27844da42a363ebd9f2ca2e864e602a07a2086fdbb63412a1119d6e095a3ba9e83a1b435d928394d5fe00875b1bd844ccfb1ac97b3082a3d1e3b88a674a2c72635fb86569a55cd5bfde48194b295fa18aa1b96af086af0e084dadc01f726ea788ae740fae038166194fd38b86874f98bc60f0f4fc16ab8c29011301d0e92d1557028b5070fbb34fb9858b258b09b48fb77c4034dd0ca64972a309813d2fba5b21cc3dcf79e8d24e63e7713ec1d3de7973fbf2e924e94ae92b88c5491019131336ae062fbd00c82942a91b267735c6a95c70fc9ce7cc05e31e0e264a04df4ffef6974e64f4fed4561f9938354876db318fb306411669f4ee9dac474132da0ced009c4dfdb07383c2f1e73cfdd09738dca0adff0acb1a3e79e1cc1880b57028df28548c03a1e23fa91ecba064644fd41da6d3b06e16a8abe0dd19918b93e8d3ee049d664b9eccd9331d83386bcdc5224f02ffe11e0f8491509cd49c088f34c3652ea369ec1e31899a1a53d9339e849dab9145a2dbac0e01911295ac3568b76fafa931061c9921f5ce104eb0662ef8f3948e92e604c51d3e378bde4298ac5b7261fda6e8f917940f80853be1e68761267df7f99abff0f4ad1a8c9407a9a4e792d789b0b948dc5289e0b6bee2c785729524c4ab591cb3ec1c7018c1084781af33872b4b1d632b2b872a27f2e947201fe3cdcf0984e5d82848e77d90e7d8768085eaf1381651acac3613dcff3789e7a685a851cff480c8bcafdb93e242dceab96a981fb46f102f502539411d6d3dab1a437571217224d119df3f0ab65da551401bfab038fef71ed5986ffe3c8eafb3141accbbc28ccac6fb78dd34304e936ab502cc6808af593039d5100e721e592c68a54290639ef20a725eab8441a6edd674ce36a0c701861a1a6a5afb6ed6207fe7baf2162839d482548f8729c26f0af9a23e52f0b09458b508f1cc85c00b13f29249a142fc2dbad70e5619e2ec14378418f95679b4326936b8ad396d90aad17f8a5f6934abcc8d9461c11f312c8ad4f988afc64656d75606f315d88c20c6126adc4ab340e3bdb8ecad91ac0786c65a0815b590df13cb965938f71fc41fd867265f329fef4adb8bb7d86eebcedb9697e5b6e07cbabdfdcbb2056327ad643cbb72ec0c67ca7d63fc22ba146448a9ddff88273ef25b979a744e9dd3185587bdfe56425e9550f8fba8b65853eb6407db73c8455d64c985c15aed7579718e329d1189902d665a05a4c62dc9230b6200d8dd99057523ca68fcd8706611e6dd21f03a45be36f64a0af1ac83e40a521aec1f809a8e0908aa545560b1e3a61196e250e2342c8ab50491d06bce37d5500099f876ec2f61ad47c3534175be853e029b9fdd17f75c3f8e10c0feca9e0780a97c4abb3d34d6f192227511f8368a8300c0e93065f46f005a3e023e7a4ffa6acd5fa24a8f346ddc77b098285f33029112898a8bb3840969c1f6eb2f54c5023c3a60c6356572166b37ed62dd4845cb25138a5704ff16681f6cb7ee63f3c0e370f321210ba07834aa4d97ca9cbf1f1c5b98f710c930f1782f789ee06e8c1f6a087e7cf9ef82419e636f0f9754f5bcbfb124b0e5c80ad83b752672924f7b94d543713e5ab973ee9c82bc1ee5c210339a146be4106f1659e581ec648a414c6204a091cc08635462ef2c64897ad94369d2307086f83653dc0a665d924d038b76ec092ac6bcc06aad23c52d8ddc8d1448aba97ee8d6621e03fd41d19e876dd552f64774270cc57e736ebaaf85f0ab60850c93659120b4d1745421b808fb4ad571b2ee9c64ef4beaf58af426271fc9a379f22a1e10831c5c584981613894e0770b172625fc0915512f557c6b1027e69fe615e592495ba8d8ebcf7fe18bb6d84bda0450cd2546e47188452c3a816f8a5ce234c88a52704bc8d819349f9793f262310554b2c9142fdcc82d039d13c44116b0de7ac99910dafa0b42881791ea21303ff894003787b79551db64c1ba3730e91f590ffb3cb14bccde477c81519293b56df9eff1165220faaabe1f923220c4594b4844f3c3b70a4f3b19945257e07616227800f1ba15fecd50e275024aa3586ec86a260f31f088069066834b8d050347e9d45c0721bcc49264b457e49136566402e9566fd5abe4a5a915882537f057c0b7e2933999a65506dd4a445b20cd68f9298112e83b0c589451534a2904b5fd01e53955658ee6e87772632778117b725183b007356eda974c5681e3a465866d46ba60102f3a29e1090bb94194b32701035296e10b3277de25677225d5415bc2a67704c4e5fccec724504f79889d3d19af2ea089e3f6cd260a3009001f258f8698a40755b2c4f70431d4b350899c89155611d41840dda4bb0ff534f501ba2c39c7e3e79f940a76677b4729b3216ccf0cf3d414d2ca79a98b3346b97dd567281c38358dbfb4f02d7b135a1ca2ebbfd6a86881eea3955f2086ab78264bcc513d484d66d947f67d2bae0196103a162d20dc23a38317de300af6a3f816b9b94c558db8a2f1eff32f97d3af17ebc457ea7d0a01c5c2b0f5c3bdf16b76f83ee49d01e244cd525ee997c96a37a69ebc8c6c909645bdf4f113de9ed17e2d620a700961916f7119ed104b23dd407a5a2f01efa4f2f9cc6245a7a35095b6c676266fb9498023d864001ebca47e4188e4512c215dd94681bc3ee5ce7ae181bfd5d47cfc6ce76ae5d3d28169aaee738a761e6afc8eda2936eaaf7a1ba6278868db72f654943301c08507d5704692d727c26b156c4e8007e9940dd109609f3890f3aa8eec4c57d61f34bf01ed1d150d0188f7b81d80321a0cda2931c94b806d7014c87bd2d0267a1084e45fe21b185c10b684171cd182c1681b984cee980b14fea9c67f0cc081f00cadce6281f146c83472720d2fb1b3a301b0b954a9c9b8b89d5303a374abcc0c787c8285c409c06c3b52a4a99699996a8ce3853199c547d1cf946d25c22361c470c1d0eda62bf5ca210ba3c2be4dca9b8f578e1c297a1bab7efc8951845a2e9444163ca23681bd29d59258de6ed1e95afa5e1fbe947f94b69487e06d2fa2a2e811f21f9286a6d2d6752c280eae4c67f8cc4d531099c38e11e69b0f56d57c2db9477ce480ae83111d08425183337ba2f06694f13e43fcfd485676976e297daa2c11fba8c1f87309ecb0a1bae4419964fa2447f8e0ec517ddf7845139e38e40c2802b94cf76850eb4a240943e90bb74fa12e58cde5eec2d4470e165ff4193f9dcc04e687b4f335b580c27cb040afb4cd25ee029fa9a1930360f22f591772064bbd8f15db23c5e27ce0bdbf7df7469971a80572a9186e46427f827829a9cfb16a6ddc25a7aa92eb77514574bc94a6384f9ce2ba65044c55aaa7f3b8986f542f905c32dc21fbddb5d232a2f541a286ed1a8e7dfeecd19d1b08d55a959909b1947c68842e84bfd820b1d12b782b81065385962b92ab238e4cad9a81a62ea22b55120b0833bf8b3813a677e9679a61561c931783789956ce845a989de527ae0621f2eebec1252273c1fc8441e8242f5f07c52815444115124db02b6b3f348873d43ed6d8818b071ba1886414ac0761a7b17a5e1520dae6b40c7414b4445872b73fad929ffa514eaf41ecc18b27a12aed41db38171e81520cf3814c5e77e9765440924e711fc95ff02584434b43edc7473e8c6a09247eb8c066d296da596c81c228730d32c714745d19a60011bd80fe532a98143f4be5210b104eaaa9b11075d0994033599808e12545bb70db8f905449f17fb5b43ec6cec4a3eb90f6ad47a1573709210cdd609406198ec9f25b81f4e46194a50f3fc983e0b222dcf3ef243436ea27cf4d94475905d138dd805ce0c02d35b105140f763921cf673ee3dc6b354571b08ee291de40e4a866a660e42f5961312653910e67781547f0c64f5446ccd23390bdad8628098979a23ed52d303e6012e4e12711bcf94f5de5597a930ac6ca3c9cb43824f34243f66f678590a705c79c049071795aca2b8a17dc784e42aee1440996ba7d10d84cb5c0fbab880b815685e5fd044dcb709e16e0624f3238d04c901bd4e528c40226eaa0e0ee7ab314dc4353a062fa969e86302188e5bf7807bc78634bf16f398498f77fbd8791b09a8676d0372d590d13b1f7bf64257495cdcfb605de11d5e2fb5ad55870c76c80a7f60788b035583f112afc86eef3924c84bf3f7fde37f42019577d5e5d36da6c2a28b3642724f64817e11bf47079aa650db1b2e5237d75ab9092d45c7cb30fe7a65453f620e3e336f7b94ff233b795ae1f6ee02a68115bac5b9a3bcb63f34108b5a011c90d60f502257608808650bbde578f5f58de096390613b4deac601d20cc3eeaaf899fd3ac0d1f5d4a5eb2814e6901c51eb250dc6e145c01caffd88984b3e3f967c344b917975e3126301789cdd9810a6779624484625951600181984e44d427e4409c380a0ae1199961795dccd7b60fdf15942131995f2115a4b4b806196cbc900c52b211827c6b2e87ec3932f2685ac8f8d2d151d32a9487583103f588268403b74b1520d95d26cc0922aab559b63f7230b76ebb59b407e6bacd4fcb4f6263b02a0466ddae1092e943bd2c03d207959113102e6c1a3f0516dabe9fe1644e1a1ce0ef2f820150fd24e801d21f0bfb8f8d63340d9222dd3e43b6aa31934d21539f15f026cca2e073de7c67bb0d4106f7637f541938de66de44c3cec84a255e2ded900e19a8668a9f1a93eb13f276dfa9fabb18064a769cf4595bd7692eed6b2bc89915d0aa794c19fdd800060c0cd0ac471ba71e45cc49e2875c8123078d52015b746a80a5d502cc30ea85ac71a73d63ad63cba6fd9c1941f4d0ff47f81cfae199214ce28f47010c0212bf3c0ac11092f6e755108610893f6f85b004098c254e28c56013b2d4380d990258a08c7871ccd020a9cf4d249f0f141634734a8eeeab61f5b613e7ff8c3265bf0aa076bfec8fe3609c07ff2cec6b4f67cb48f2b56773b44ef06085f312b9c179188ae30114c683501c0fa1733e84e278089df32114c743e89c0fa1381e42e77c08c5f1582266a380c0bc442760c07fd9beba7098bc215021c8d98dd7442bcbd4e40f46cbb6c50cb3d4e2b7860a279296114b9dbcfd4677ab4d178352f31b6d9334ee4c9f104f47ad80aa1fcc132bde529b0ae10b56d0cd1089554d3b67b0e438dad3df3176feb5cd4f8ce9defc7ecaa0f9679d1543d069df95ba25f590eedb85b2d97a578b49605296700ea812198b5de94a8d098ee056882b4f6c67440dd166ef4e4b0214a42303efc2103edb429bfd024a857ffbbe24948d70ad9b5a4bde1829db06dfe62128d8005c7744f2abb5f43cacf587b42e5a0730992d87f6ab787e6d383551195c03515328869acd39ba2e4602205d096c28452c64a25066265c7fde81aef806ef9feae748f36ad9e021c8151789301713b0737eb262ff8d4b5625f96e112ada22258d7a8239a2fd770fa865c4da3ed2d68645d0b64e61f7bd61b6adcb2a608b04f6a4feda218319cfe838c7d2b9e2afbfc5d118ca2a430865ce057e47413de5ce0f0ab11b7b1c59e4b93044568d61ad11611eee4c2aa302334cc66c5bc20f5522304d2c795afb6c02693253f389d59a6080665692446ba6d574679e54e14e39f2d4e61c8994c5e8e2e033abf313c5ac3af81433f4f61998d9489bba6ad0ec0967f0992d9aa0b27bce5dd42b6b6b62a2218694d6efd8925b5bbb63a5ab3c63040d55a6475a0cdea4e3f614f545e86e1bcda76577ce0abc3a65ecf7f1eac3b512c2f5a94fd36a6c637045cc2deb62c1dec5b281e19be809cb607d24dbfb4712ae6f4df0cc3ad9e12d1f402667416b64e02a71d9d6ce533572087034033e101beefa88406d0000e608591c94cade442808ea0de09d8231e5227d83ecfc80271a2f1a63c4302c62133bb7d2588b6c880c8630bba1cfa785f30302b4a32b3aed7b48493c17583e53a7c164abc8d2c839af41e0c428a7a44cfd63621383683c6d61af73746d5c15a2a7167d0309a9f584b302b034f95b4b402e8f8be45ba612eeb79ad2f0a9facc8e0b740c6311220428c3d6aa50814e85efc1a072797ec97d4a7abbc05a95287d71b16b26499f5ded74643035953379175e486c0fadf832e56a10e741a790cba19c537bb840c5ec75ef6ace127408889dbd5a8c6764e00510c0329dea001d4e3f0040390c6b4647e91dc1b3dafd16679c3d087e631808b697c2c88a60662dd95899576da6254abf43d2139e25957a9a4dbd1faeb03ee582bc166b281e0eaede0d07f726082147bd38a0f9776d05cfec0eec59411e84e2a75b618fdae3763bf772f4a28f5106779550589d19118196cb454911558465ff437b94134cbc3717731532fdbc8dc223986b0477a15e2ae8d65e12787d67c899f81948c7496a8c7ae14ade05ae24ffd5564112ebd40288ce313034a949ca12502a25fe9e467fbaa6ac6af30eb4a461dd0d10aa2c3b2ca313167c754e75821daad0021113a29700882a002f1571cb8641e6a3bca4f8b9dc95d8c8d6ab3d3e5028313daf1ef1d5ad0d0a55dd7b8c131c27ab13e76db9fce7deaa769d6d196fa51372a653ed2427d7a8315438530297dba89d3ca83127951668fe4a4177e4aa36e9a90a6a3abe4877ed806800856b024a2f7d263d86e1b388bdc2ae05e566bf198803bd058645705266381c121ae081cedb6719d59780ae192404cc8e4870d6cb472760a677592ddb09379e3844621d8087e39f8dca1da7dd591007fa5f1495304aa3260d926f02b88dfaf0bb8e077d16febef7d6dad2633a5e046ebe716f8588ff95823be493a386634a49dae01a643ea77a9d2ad59ce412f0086e219be21cf964aa39da691ad1a076475363140b3499178c2ebdd3cbf80eb9c3581e21e802c37acaf1281f2d32f28660fccaf6d40354ca5c884d8de7148ab9202236e3abc4cb853fcb726152ea3181449daf59e55a18c992addeaf9e762d095e4fac683c39c6487fcf5e6709f4e30422494ec0baf89d23b9be394f29c5d0c4cb74804a17d44bde001d47d41bfb0db688cf27e0105fa38b5161c8216fd2cb7d88e539f4fecb9965a6adb72c179ed746a4647fe050fd21ea3ad7d9dd5cb0361fd44d582622e05b02d492433e9811d94637e91c52951bb31bd63830e4e002c180d512e4f039441be2b4bb5b2b82f32a05ae90e469e63a6b5e3db83dcf817ce09bf9bdb50c1104988dac8538a06b1a856a75b849982e19cdc31b18a10026896574b9eecf32ba9cdc35b65a3e8a02962796090e80bf13f5f9055aa8b450f95a6861fff777436b310905340c326e293e3c9187d59194f7809175c5ad22a2128622077506916ae0cc1034fc46083ff026081c2603840c8ef9410d9cf181ccb36cac1e290af08866872ff4768c74cee57a9e27873170a80453d0c7c0ea8b14a6845ab56e9e5b82d7491242533326b80629b079e68ffdf8367deb80157681c82d46b861159c8a539129bc0f9a8426374dc2c088514b6c58c116a239c8a5eda25091e372b810173d66e50efdf9d649c40d3531801ac24a282b404fc3953bfa21695a8256b01b7f58b3ccb13166373580b95554bae9debc8b1c063c424f5a93553f9995dc2fffc10e4ca80903a108b945538e72a452240fe2a57e5400f480e02dbe0c4f3e4ac288c5fd1168b8328a65c30ffd144ed49b31818ed8158120090579bb81ace44e0a11fe559f2a8ad2bcd58f81c206bd6ab278021ba74a3ded83ac83a2aa5f76b85e61f70af51edf4f9142965b732384154ca34b7975b91beaf649e1787bc19a220bd3af35714d99ac5bbc186cd3fa625e01a98524fad65379d3afa499ec30dc71b25ad93ef748763be9aa52d575143bf73ac18bb58e91043266b1ffe90293f32a45fa7cb3089f59349a6ff1ed8a0102d57b30fb18cd9e361a779c44c38e5f1423d4d637a0040f31bafb656ab345e43435198cee2118148fb56b2f6125efa00207e00fcf801295fb123f5191f70bc30dd0f2cbf0e0e022d3859c0472b95a514622b948b395920f93898dbe73e1cc60cb785883d07d483afc388dd224b487e9184140366c5e565a25a4b3ef2bfb958216f6c02b61099add5909350621e00e91e3c7914408831f9a30aba0ca3f5aaa0daa321a3f1a2f4cabc6628dab418329e4f8935ff43c7553956969325252b28bdfb808677b1cf2deb7ee88890e171b34888afb9e24aa143133bf6e17834eddc77bc4f1f5f70374ec93af4834c8888452c8604506cce688867010e9a48295b2af51eb6a108bfcd0ef12b84931cb398dd61c2c538176b25526f5c9f6ca5d08fb4b6711465124d954cd258f46f5fd6fbb2723bf2653029f20c890b4c2f6801bc526bebf93668a883cd36a993bf66a856d8a9b5a1af3c04883401e8a45abc7be6d71ecc38bca85c320d11f3633bf0f3d907d228e6715a46ecfbebbc56e26952ed82f03a1db99aabcd606bb4035ab10ab492890cb2cdf19f8650deecd600332e791318b8e0f3df7db85163860aeb6bca8d8c5ec1ce83dea72db6892d6a429034585f1c1fead2b9ec5e5ca67ef079668daff8bd7e43ec026a695a644ac587da646c60272fd1b88849f0bade0c7d3165a1548101c757a70a30cf777f45acc30f593fda7133daacc1e0824a9c283b014e5e85728e33b0bef06570c9a7a183db385990691bbe6f8db92bc05d1d2b58a968ea38f581a32acb763032194eb52fb17841a1a9c576d91e258e2df816881715582c31287206845780c5eb648e21e609209782e0a231eedde28883db3b4ddf720db0edf283ce290bda60cb3a268cebbbdb9ce236cf2250e3ca0fdde38cd6aeaf08f447faf1cfe5b754de38bbf44d6cf313798fbcdc9452603f09464817c9aba0726c21fe8649cc00dda16a7350f8e169af708df3e7676884c1f6693c9eb064d71a9684adaa75ad8fcd8e2ab2f4d9d8f5c7a34ea4d4cae45e240a4220d1830d60d43e9c0f09d37fb632a54023bd6f98764e303e391e34ae7c248842bc6c1356090403d603285ba022946e258ba1e5b6582541fa7d64c3dbbe67ad7d01ae4749045516c3f22f40b57a4b508a0ed062d522c456b6e6cf5c2f887d0b8b6e16e4a38d016a6998eca2eaabdbee7e03b724c6fe10a87c1742f0c7f82cf01e3bf1788c000f77c6ca95ea5359811370c92b6c70be38793511417856ac730eb41049c0c937b8cf65216a3696473877df7b9d7b89361567a534ae53792f830783be99a950b59ac23e4514a23c9f48c8119df4bfd763210384bde00ea8909714e7cc14d7ec962c24be04819c751105ee0a43841bf9b51866d4781b8bd020bcce038ac280bc52dba09869b7180e88cca84926f1b5a3da8b0373ea179a2190e191723c444100b9e9b8888113404a6e866f0508c951c3bb293622d4cc0aab87ea063a82de24c5345b27cd4c2b8fde54e45e1fe9075d2bb628650f9601a887145800f5651c9f19b5cd478b7e15d0c8ba671f4c1dd3f6813f54e8354ed0a47a059e184a786454de44d979be48e42ecf2e8c175501dd4d87fd79410f2409d1a364025e9106a1424cf0d622039bca4f9168f987c17ecb726fbdc707f3366c533cfa9d1c1f39ae6fd4f72cbd76f2b298da3099310d36aae3439b61498d9ab0613ce2b1ebc6a98d1b14170c8ed02217766e329bb21c78ad4a1f1cbd3f3058c957fdd6523601be310b09d4c80829381801bcf4ee01216f23e703f5c92d34081d1937bf546a623fd1bf63e804b263611876e36493a70f4f31307ea807d6ee689eb71cf72e4c8c17a6b94883b7c995951c373c779d30f860e562896d282969cc6848903fcd5c42a888931f4715694c622161dd3f87e4d8e40f2fc0f896e9a677621c4445537e2def6b09a5b3968ea71be97273c62414b418f41e008118c091986c47ef76420f1b446e09ce0a10b0a0d633271c4e4b09ebd7c9ff67834879589591e9d3134383e904bfb58a250d1d80d552e152d3b14a7cf06bc3520d75b68200201154060d15ec1d361ff35508badb89cb3a68a941608a4c6f8b47892f446627c1ad55fc8e95375188ad0423e7abdfc6c5e0316c024a45b7b4926a1c32428257741c9ccc5dd7345f30db1fa3192b5a60ac718d9996fa0989daca9571a17d48c4dbdbc9a12f836f48b2bfb795398ab5b0111f6bec863118509477e4504c224cf11f37738519b6aaf5b3addaaee87e959693dc737f8f334c9f640b0a4b588021e96acec6c14a84cae88b7ea51783bc0f4c1a172087e14baa4abb51978d9beaed55fe71f8af67d6947d63ac2cb90379031b0a9e3868b68126b89b24855aa7190c02b95f3e97aa6f10392ff37a27bb3020691acd0cd93ad6a81b8d4b61ac7c883542ba274cedf2f959dfb65deda83c03d6259e1e382867b83480134c7885e2296f36e1074745b2383739d85ea56460923ecbe909c7f13249559f7620f5091dffc7c9561eb56d06867891c782b7726db0b93ad790dc45cb735e7bcc91bffcf681d7a2d1f89f166eb3ed1dd64c9b5fad2d4be14138f95abf1860b6943411e14f7a0c7fb1a54aee7d55aa938b76b4638d0519703a9053ccfcb9e8bfd27a791d5c3d9c7246043b5b20d3492d317f9c1558b3ef6e1894fe41b1f37100661bb94334cd07e64fdbde4df3148cae8e8de900360ab0c60b5ceb8a6eb135dfdf05cdce05b613106cbef8415dd73158e3cd8715dcb0da27211a5cad1b32c557278ca1ea2ac8144dfa52c919922ed6c93dc5d8129f7a49d333e5b14ece90dc74c59411eaf2031dc37e351422c606f433ff3d9df019bc118927cb69e65995c43dbac1580dc1861a476dcb92037c63ce257808ac057d0b153cfabb3ad322bef771eec2737ad3267fa92a80419b9b43ede033b1a9f532d5e734e7f4028d2eaade1b71f04f9bb754aace43bb2bc7210abbed1def5d8149aafc919409db52ea731ebeb68908b70c04a2111a8a7e7a1cf0055ae60c060695f6e970e78f4283872143d6888f78db8fa3e87ecb9b3b7dc235ca687bc86a434941ceabd2b8bece2e7bc10bcdb6ec9fb6c24e77e496ba10e9dae643bfeb45b60f2f61efd142105c9098043b47cd3437ca2bbfeaaa394666e5e6ed289babc3b49b0c3e5eec85631f0cf6514bcb97863dc6cd95c8f689ee7531191c5efdeba071f7c686af33e4be2431dab273672be30968d32273bb53185db927e1e5e2edfc59296c68fea325d1423dc09d8b26a3e6cfa66d7547b5360299c7bde4cdfb73263d4ad634ac66337eced89b57aaaa042de68b2d0891eb2fd980accf4012fbe272f044b4ddeb2871d82c2f0d2105bc210f16c5108216862f6a0d176df2b9eb4a39eab3977168a32ba00c6b06e96a4992c0ca01b087fdea97dab816f8a946dea83aa22a75a79c3904a317fd366e9b4818d908c2e50d2a3ce0754b763902a531142eac31cb3c0367c633ee8652d23bb371a5cc3c8f8cdc2d047639a757fdaa340feccb84ad2ea413341ad1052a4eb1226a7a1e913cdc3ba785c56ab295eff52b20330bd465bdad3bfc4a17e298d1a0b1020a5f3abd61fe4d0188b42574a3ec3dcd4740556176fb9f5091600551949cf5a6d8170b010f88a4700c1aeb5867c327ce6db0a6d2d9af66c2408794162a790db354a5770c8f625459f2bbb5d8692431ffee0b62e3ac39b83680b30e8298a3de0b380b1e1074c3798f116ca27b522b8213ece85710b288741a26798cb969948483af661ca0c899e0d4fcb24f3d42c557d285ca48b04c53fa488929c3338c3b543f3a2be6fe2e9896a64540d6607783f72f46c388a015a6212c48d411496a2781f5aa28e927452ea3c82b9a99ed2005a14a5c509b4a11c3d4b63006882cbd100a1094984b8a45454e8d43ed2726459b123796e6de1ae414ab69b06814c1c6df9d0fa62af671a053514fe149b92339409bed78cfa0121b0dbc2227c6e817cbdcd22aaede0a2ea475674296f462b87a7269e61508d6b783f0a3ce6488ec878b5eb86c0f7ccfa818ca680d6263f5d8d9155ca34b9125d2616ca34ade033d65827d34c4bca82172d0a61452aa3f69d4f9c9e0de500da6882fb46e0226c99b1316cbd17562414c1624250a8c2aff3a7273d16961696e9f80a825b54bc65199d8164b23a28f07095231d082d2f55ed0b68aa5b82c94ac804dcd2013a4fe9466040d05d6d0e0edd61807507ea0bf15464222251570b9dce46dc83fa891fb146ce5d9189ffb585d4416da4b27f6abb3c68367985ce18a067b0584cb4dfc3d9ba983bc642a76248b59cf31b97c1446f0a8afba6dbd14626bf7b6577f7963249290328043a0480046413db729207f92685c102ed37e51f745b61d8f3fb61a7fd8a951d3041deb6e53aa892032a539650825cda96e340750314d6daa12448a56d391236909274440d68600439836db90cd02256586b65483180c10b888842ba20849084d222fd6f1142a76464423481c8e414646d3657d7754fd4731beb7fe2cab5cc74ef77f2a5e9fc5d2c4658b9d8280fd82e312ad143242222412222c1efd5fc2599457707171f9d5b007dfa8d813e5fcd67031f8659d91674b6d26139ab0a43ecd5de12f8f071ea3144c379be4c32cf1cd79bb3cd798491e2f4a6abfce3735126a224d73e0be540b15518ba484abf1c96d36f913ebfa47a737978430876dd076ad0035e67613b17bdeb72cecc4a722d1b99f9c51938fdcf7ca4d4a1a85f2e9a287f578f6d7991be1987ef05b205e410240bc815904f4815904ec8233205240a48214823b2097902920959238338f5209790262095904948204824e411d208f903598424420e217d38059142c8223208d903c9035902720752879d13d60a234d475c3ba6171b5e749c809c7ebcf078e171a2bdec40517422018a222cfe7fd0f831f9ffffffffffffffffffffffffffffffffffffffa7d168341a8d46a3d168341a8d46a3d16834da3f8d46a3d1fe69341aed9f46a3fdd368341ac6dc8fa18b8bd893b9cbc69f8f62c4a0e1cd3c03ecf86506b2d4e9efe833462d8d11a4566a2d9ebc8e2b8ccac5ae51a8171a2fdca9935863022854ee4a12bfbc882bf460eea5f4e32119268d20b57bbab5dec4b8b68be128ce48852971851e90775cb54237f736b8f58ae3b80b079a326204a9e58b6dc57614b1b8fabcee137be8eb8d335c144531acc13f7bac678fc1d9e3d9e3d9e3d9e3d9e399793a9d4e279bd96370f678f678f678f678f67876ae56ab950dfed9e36ff678f678f678f678d68a898989919999e1dc34cf166eb5feda163a7b3c7b3c7b3c7b3ca3314df36cb5686854a8a8b1c136367fad0d8a7ff678f678f678a6029d3d9e3d9ed5d4d8a0a8cbb562c5072c300b167f2d0b14ffecf1cc069da1ae87526badb6f67bda207bff3b9c65dc971ab4cee6d7bdde75ae6b1c6633779d7587f5874f3dea6b2b8833678d647cddc7a6c15eb8511440a5c64f5ca1e779b7fa9d8f675c6d7f0e147bf00d6fc735badf7adccd7fa210b2f3635bf198b1d8c56c5dd0e40fefaf50afbce372e5f82bbf3fb6adb5d6fa8d2c0bf46beb8ab46ebaf7de7bc9a16d3f76efcd516badb5d65a6badb5d65a6badb5d65a6badb5d65a6badb5d64a12914424114944f6a8b5d65a6b257b3c1793408f0ebcd8c3db6ec8fbe16428d2d43444068d139a7ee8bde24d3174ddab11d3961ef66ad494c3b6c92e9fc0df30ff97442cd6a93535645b5e33468599f3bc11680b42af3cbc76f53be92afd5cf07fdafb37d54aadf53f5117dd36b3e895579c1bde4fdf35c2fdf3c50edba2bd5e9dbc42c77217e90ae6eeb84853ce157a5707a757ae3b2e736f23d2012b5087e2e8b2c9f2847a49a95622ad088a142c981899196e9e2d1a15353668eedab5e2031668cd0d3ae27d753a5ed12cd6f8191e9891b97ca3f3fef33a6f08ef7c0dfc89f54bee5a05eebac626f4cccaf3e6edda6583a2e39f6ffb408c89c01f119f076a6bbd1e6c8c65faf36a2876b8c33d5caf13472c1b5d3e2f06e8fe1d1b1eafb97f66e541bfa66b8c4d9a0e7a5fabebeeecda33bbfe78d7e04cd75aa6eb30a66b11a6eb91d5b54b8aae378aaec955d7a5aaeb53aa6b5488cd97ee9920a8c077e66c819797d4a96b55d9f58aec1ac5ee3a854bd7acb16b18b1eb98b06b19ddf50cd835ffba36bdaecfaeeb16d7350dee5a458d4df89995079bb66b97cd5f5b5174c427ae37997f1ce08444f9a2fcff6723c8e6cc5fa4ff9f0671519a9a70660a01901fb4938ff781d84887ad48ca915294c444cae853541b7dfe71fe7c5a1e6ce28fe74f3e43f4dba3152ef47e113069455654dd016d351da6d68eec22f45dd7ab51d15b799ea1ead0b8e8056dbf8382cd864253b581478047549b2dc7aa0d85775dce798daad3aae8e5ab55bdab8b17e0c25fc719f8ba575d98b76adfd5857912044c0e4ce27c9ca00504c404c4040404dacb7da0d76590e823f2886eb57cc40474c3e307fa7fa0ef81b5166f7ca2684fc25acb755f3924de6c2924defae55d4c2f6f4040444444abb10ace1c0f67b35d15d9f75e185c6af7b92ee3235d25e22a51ae44cf02b9adb5f8f33c2fff5c14e888104ddc11ece364adbd5c8de3475e202222d241021d40404040404038337996085ba2ff7b6f0eb8cbdc6dea747c4817bd402f037bb9ac83a3183fd05512baec51d420a8437f1fb7d6fbc06f632217a2510c89c09b6bb8b67a5b80cad9b6bcf471c382e3382ee70fd2aeb9b0242a7b9443a55019548ea0042a732865250ee50de54fc9a3b4a1acc15a4b54d250ee28759433943e658e52865204650c250ce50ba50b250e6b2d50d94279a30c4169a30441f981928532966d57c40413ff997bc1892d5a9a6882a6c2a8bdf21d173d2e8860696272f1f91deee7773a211307058ff4fb2579756323d65aecddfe8a37cbb4c2859e6c187b375ccb18ff90254df01097884d5a32998cc6b2905d2a8f3d507f99d343e0d0375473cd7eb75ccb471c97ff2873d68617456119cd5acb652e9f680f1ced7f6bb0364787d91f9f1f999ef241484826241b1a4a6d0dab718add6163aef338d3f2781d4fc6f89372d290bd6b403cc69dc73d10de1deaee1077876eed8bc80d82ffcfe96e4f8fefab03f2fc23d6f038c8b1d8f39ddbcb423b64f0f92630d771d8258913203f20d377f473bb8e8be279ff8fbb1ac771dcfb9a7c4bbe1a10a7d82771093b8f7bec0d7543dcd0f3f8bff85e18f090c96432990c67cc75b21fda28eff8cc4f6c98cbdc630f8f4d34195960d2ef678b7d48ffd9469b0b19e3c71ec723a33532ef6ce7f60b714f76a7e80ed4df8ba5940f7a08b49ff9e25d344e40214609b6e5b017293a84d6f2fd1c5c2b24ab423604a18963b10e638a260d868330b70e93b9954d769a3463fb9d9ca39f41624a93604c2f957ac95cce1bf3dc712f2f3dac25d612ce98632d55181573f9742acb9294b9c95ce91991b06c582a73eb97a7b7ab031b91fa4d524a97a85c1d18057e44b22fd5b5158665569e1460d7f1d11e585d158a54b0362567987a56181df7e2a62fb8130561d8955f1dfcfa06fadaaf178f64bdb9bc32890dd1dffcba157b5036ec8b59d095a6d68c44dde94e079c53bab5dd19c6380d77e4d9382415eacdf392c986714239e9a2d6e6a5a48b0afd0e172be2b289c20944ee0e0f4770e182058b0be3849ec384392a12975444b964df25bcb204f02af47aa42b8d8dadb92a6a85fdff3f6ee593336bedb837f3c980311a2664892946142eabad22533b98bffc9f50a8d34b9922557be582624c21b242181d03ce70f36cd1d45aebadb5d66a833ac2abf5d672e67a703d72b64196e7decac3d92735db7a792c0e1cf71303cedc7bf75e1c9c50ea664538d182176e5ed85e0a7c6cad844710eec71e7b357262c8c7091b883821021938119b610b135b6ab0838633b2512a30dae11226433a221b15e4640b0d4fb6e0e88ad87acb13fbbb62031dac25b4b820898d87286283bd1a6931eabf13430b102fa864d068a225c88dedd2ab9116212d3b4480f2a1a5056ec816b134edbd0427b45551382128e888b20ce99eecb057a32c34d9d6bd1a65c921284b8e9dc5060ce05ea12e6a390bbbdc0117c43e1dc121d9285090637bbd1a6159a2c446f56a8445872d05c8052c3e1ed04ef56ad4848573b25f7a356a4aa26b628bbd1a35217119bf0c1a27ec15d72cd8b6bd1414141414142493c9aac8aac86427a01310107a037e7c87d42a3be888b2054b12509242206454c4071e80e4800a1623612d06b5d397b90e779eb7e3053548a2d40224821822024cec5092e1071d8620e1a9372452dfd4b9783182131ca2609a80e86f24acc140eb7a861c2672d8c7612087690ee338cc0bade5a1388e5c1c4fdbbf30e45f786acd417ddafe7127ec798c7fcb35ec3fb47f039d45976b838ed6e22bfc5a6bd3b0ae7338d7ac107bcba21f99376dcb2b27d22bb7f9c41863eefda0433189375697e798dc1f142fdca82ff518eb70e68451a9558a98f0626c6253d75cd4d43717040bc5e75d95831086402e8e4d433327bc21b470f10abd1f7c78a8639ebcb6138a42782f42152a6a6a6a6a6a549ce68591ff39ec39976bc58a152b56b84ef3f98f40425861b8045c169120ce40fb2da1630098102346ef3684162d5ab46811824d8d8bfffaaaaffaaaaffaaa2eaa0a9ad6ee094d308106066abd9641680820fca008e007124828a184124a2881840b80b0468cdec313c41e9e00ec9f008432c49e53468f9864db1921014ca0e1aafbc716404cb22db703c035700d5c03d7c035f000f00a57170239406873ce29d45a13707bf8de456b3640788010b3f8a020205c80d853534880bd113157210c816c2bfeff7ffeaa8050abd0f18f7b262b9f95a73b71bcb8e9a39877e6e7755c3320f4cc8f77a6f7755c858e7b260e8fa7e3208829e058ec464cc1c6623c1def70031ae000073c0063fc80ff5aeb0f18a188fecc75de8772bc624157aeeb729db3d893bd172ee5d158dcc3d9e68409928e73c9b13ef08679f476c84f3d34699c67f3c5546f7462d0c1a1137b69b9e8a5b2947433693658fc86c73393a55ffe6aaa3897af786cd8b891f2a4e0334a284999e2536fae9962c64cb9992e753cac1c1b7653f447de656f8afa156297a569ce983666f80d8f8786df48795afc4495a035b449881eb95a70c55c3eae1dcf6de7fa59ea30d44c93a82d2e6f99290e6acee5a7994aa9afa58bc60c907966ce34a9e6f0f04195a04dd05a882a418f5c2db862ae1d2e9f478f8e5cd023f4e8083d72fdf43bfe8ffdae11c9e37e94e593fd411eb68e5a4f5a369a1c3438687e68642b55eae5d33442ad272d1b4d0e1a1c34329a9f55cba66ad9522ddb4bcbf6b56cba65a311d22714eac1f0854ea7507330c594caa28aa982501d511da99e54d472141c860343617cb555b6daa15259524caa982a08d511d513d5110a556ca58aa95431554c1503a28aa96cfd72b36b148ac7b8dd8bd883ea4218a906c30e25a45128b107f331c7b62f30f973e9294c1e64427385cc2fe0f5152eb0bb0bf752a9143822b174c05a4add52567050beda5be6a674d3a48bfa6cbba494546f524a56849794d41423524b57e7550412fd7250a95f219f1189a5839495d42d1c917e441247a43d228d48231212f5464ac5b91c9ba9d245b335398f0ddb2f2f29b1a7e32e288b31cde4daa49d1c34692cd3060f287ec3e30141f7c4134ff0f0b0c205760ff99be48db4423295464a5bd6ca2615b5dce2a07c656d79d42d3f914e7334e2baf238227548568c206f57e7554445ef4be885a3dedcd75069e4a72cfa9dd70c6593570c65edeabc5cb0e17418c9f442327d24d3aac34826906422997679d42f37974a0ea9c3727e96cc3753293e3862a99694e946450975a649f586ff78dd19fb61b4552cae124dc09de34f337968d24ef3bca99bc5b14c424e1363de5539992452bd612df58b6d1d9623c444c5b99c9b393f3932660e8e1c1b39b18b5e3eb3cdf44a7aab37e952aa64a55f9eba591152292912a95bbfdc9926fd6cd888442efdb0963cad7a333c5f48efba984a15cc54432204c8506c5cc9985bcbf0d17cfda8373ff546e605a40af5d70df53543a5a15f241a1421273f4c9870242dc1905e0f4da68726c36b85919a34190eca7017181307e749c131152bc2a76471f0edea7c4b175ba93adf948a5ed8ed98e977bedb1ba93b60905af43be08f77d5ae0e78e4a2b949d50193e0a07c6326b09642e6b6c3335f28f345c4cb76325f474a568417948af34d79ad60e9eabc9c54f4bea2f4cbbf53a95f5e9aaf980ba6dbefbc66a8ae2038fa8fdf79b1505d49aa0b2d47ae8e8ba61a0c0749bf42fae57fc23890d550bf7c9fb7febaa15fee72a649606d3c5f3ebcca86c9dc92cc1149e6ca755dae5161366db7306169b45731a319d37fc64c4533a562a6b7775d1e63a64cefba3c85891267e074ef4c9770b0612b960963cec09833a7d89d32b78bb2ccae55842c1c8bf1bc99a26b93c6e2212b85b96b509c3131305c46555dc7c4c070303d3257b20c93cc8d25ae80fb00d5358befc6eb9d892fcaea7ae785176599952792eba8e4cb9b8db5533303000000331800000c06a240102549940459c8e90314000d50823e5c5446280e06427140240c82280aa22088611804811008621008e414731aab0021584b9210048262f9067817a2d203140a893c639c555e2f93ed5994ab38cc5592502a35e8fa25ea40f5f1b84bffa63e91bc7a561da3f30e9e874334dc56378884fa700a03cc347642bfbc7484e684a392eccef5d23633d611b97b1ec36e1f990e24a0111e726f438a00bbe5a45d4c041233003f66a6915bb1bea568108bbd2065e9f09399e0cd7ade479a0f92989814d2b443929b4612d73f120db729d2b59004a5f960fdb6189c3eb610ce3ebae293d96d8566f2b2059c05cfb936ce282dc6518ef1a21a157edc4e4ad092521f0e7ea53e6ed1eea8d177b3f0f47c937f7428092292fe7378a9ad64637f6c841a18ec91c93357028bf328916d602c149f040d9d7e27e337d5fc3dc8bcc997af68d159a4f87b7d2395197dd6965ea745a558e4afbabdd20a436f18ba15089e04a47a5ab64ae2f5d17a49cc41c951b552e7ded292f7ca928770c965113c565fd18d5434c7116828391431b708438ae13aac08afe252b7fba5807bd205929587ecb375b55825b50d26a2306283c6cbe4c9bfebe2b78afa7b4b67ec0d9ded7fe634f4c1659673ac23af32299d2ecb35db023c66b50773ff23833cbae45b82c93826bc0a1bf25963f6d6289a398e230b94e486544e50c4a0c43d43c9b7376a0682d7f508e91e6371b7fef3c3dd15b7381542ac7d50845bf00441f1abb05019f2ed19d2118e39cb2076da2ea62c5093ba5f84120c4ae06bb3cfdf08c28134d653122a2f1c2890c9afb6ee7c92b475a7976d6ad52e932d2c7785d4b35a1961fbee9518efa151c5ffc31e25e8da211f17e0e3e11e1bec01a01e08e840b6f0a6e7ebea63f85e925122725129a4b6338c706ed6a2e510642cbc7f708f7f366c7489176d59487492692da691c52fdc2b117c61f9c6a50402a8de949e8b375b58b2b7c70afa66ed6b42a90c595f4bccf99e741316daea5f3cd5eb4933c3db04a28314a80f08b7636bc24dadbaf1f407102d3740df26ee3866e57c97ba22b4c5bde776f0b78dfd0e83208f45b2dc0693c3b8890cc6fcab7b6dbb5aaeb81f4e1e118c5abdd8693d70f480394c890ef3fc95faf19deea639d590ae93f60d3df507cf5c804d9c46401b4909e23cab50a12f7154d38beeff77440277c527b7807cf2f867e5531e7813ce3b851a45b19fc218c168a59eb2593ed0f3f29405500b50e42a2b80d09380b30f41fe669b23d2d5ff75601454acb5cd2718e485b0622ae513a17b5dda09933054b879c51d0423ca97a1d4e4bd29af27f3d4151e4825e455631baa235cb8cf6bc3f451617138ea93844bd5505e26dc62d1dbb980440b43ef183d2936026325af15ca1bb2bbad9b840c77490769c918da5ddfe1340a5c6030fe957bacb95a90e28d1c477492f763e895e7c0c73f1d4aeec80686b6244a94d5d16671e60267dcfaffe084c5566b15968b6d178bcf351b120ab76d06606f001956122e3bda11fdac95848e065dd2bc5ca00fb293f3c74ab308fcfd1a80cc910862bb5bd49440df1fde3a28c4d7f8d8ceeb67c4048f5eb9f2a02fd2bdd6f6e56ff586a37858e0c417c2fa2066ce7b2ba7332c1acf7bb3de85451dfa1bd0ccc2d28cf062567ff01417f5c5dbffc8a8f8344056566ac63704a23be616669bdae1077a83c6fe52bdcfe1290ee2ac7920336ff94a993e9854d371ea34798a3b7af269bc8282d9e306b50066de89af2c731e8e606cf072d5029d66a9644fa4772cd010c99b317c5a30a86d6591a570ca82372d6f0c91f457e3b548551d46d7656c5411d3e5c71b9a30d4c172aab995c7b899c9160f40051dd18b8cc2b5058f62a498be917e740443a67b08c6be49c256c25bda09cc1a1bcf661ca79cd979e883a3f20aa9da948e8a5cbfa5221521f98037949b4fe3334a087efad14363f33e899b87e6c3329e4cbf502c87ad6310e5184f9d2815e9cc18a21f117b3a060f5ad3a40bc1ce595e8b27a499b6e219c210e7b674d9b850ba0b664d56aa629c165cb7c50a66018e80f3718e46a254a99da815bf4d362b90a2113baee7585dc4fd5058194428ec0b7aa7dde0565c98c11f3a1f4bb51b1e97a49998415ff737c4a400e3881e99eba3ce7555a585297573cdf4c5d7c7b63d5d541635c79d1cab1b6b82b183e12553ce39ac52fc68fbd87765410a6bb83220baa41cb07ca82bee8c44896c4d382fa186759195323681f931cae2242f82c8549b005d1a53a0900ee0bc3370076d2f7f65f44d74d24234f2e5a50864f4b7899858e49dcac6f80bf874be71cadd452ff3ca068933e30b2b3bd974c0a43ce281e27350ee1807e15b84c51e00703308f28ac74db3e1efc08d9afc6b7225291aefa1ca03aed1f03b0aa3cba9aac8aa2e28ddd529f5be3229f39c8c0d430e92755ec665889aeab9f9465b0ba15e5d7165af2bfbfcb4058c651f6f6b73d410de49af1d3efa8688f9fa3ca91fc349cd13b7f9dd7342bc84ba688d90a6ebe225723892ba40d5a0d44b3ce2cec50121ead4cc7d44c56691483bfb86b28707b93a9c6dbfbd0d76f8b4164992cbe108da6299fbd6e378fc5063cf1f475b912bdfcaf423e214758c3f5f58bdaff2e56b665267fd5e5e78d6269666618e646040a7c9a5a601bbc097069feca9a066079680198bab18199cffa8620539fa6b3d6e745f952c03d23c4b298c561073b895833760b806a98267db4fac04f0a8d913fb3d508d6a56bb4eafd5791d2b32c2c6ec86704e0a078b072770ef745cb853dffce944ef7b8e476d819d38a3b755bd58b827a71b2cda08ecb937a2bc97dc739cf8dd095bb880ea5cbdea33ba5a6ad74d2304cd76e85a30c5e2db01fea03e16d18611008569d75ea96143eb225248a450af84f9e4edf932413e122ca89660fa14b38f73dcbaedbe72a051b47b667be90968187cb33c7c4c5a53a5f04f6e2163502be412270d1a72d800fa4894f745ed1d084581b5d0502637f29cdbe00e7ebc9c4c03c95a78cd71bd3a32ff2b3cc9b3b6e1b839231e155c832901341e64f964e510eb2d1c248661b23a7507efa6957b269aade6bf52f779645bd46d83e3badd8af494044eb724dd80848032023d15a237c9685aebd8e5b9b04e5984327a26935d592be4f6831110b338b4edc3e359a2c27c6fcc69629a8d21204a32f83d30b3f647361ba38e467f44b321652a446a9ab3c260a333b81f9875a5c540649f0f7d417c257e56dc1aabddcde9a59608bc3c9bcc984679c5af99b833d7c91cb8e294cf1589c7103ae32802df33d59a3d6f61abe121e0a90a467023806e120040b9edd7d752fbd7de3e9f643dbd686401f75ca2eb0472bb9d7d6115c6468403f708d8f61c3652c6ea436cf4740533dd7270e1f6b68123cca5211d97cb33ad7d61e13bce6d6f3370d8cc73dbb62f143ee3bc69dbf6c40a1ed38872b23b4f2ef95091fd1a7969b1bbe1119fbcdbd82d14b6e3dc36ec0b83ed3c7f8d7da1f01dcf6f5b366c792cdb268eb3c35ffc893ff883f19b22c48025920f896da1e095575d3e83635279ecca5c2f75f90a71d233ffbbfa0e6905ce51ee2058c7b3f2932413cc4a109f91386f18c38e6f6f03da33389c17638cce45a5c6abbfbcec09e4dc4e738fe232a9624a18a6e7b05acc7879c11a5448174acb059754565f91272eb48d94ae1e8591784ba79d4acd81bf77bfe9442d66a3508c8ef56e051b4faa4f700241ea4504b59aaf08f6c432ea34426e6b9be2f5aeb649cdf6d6cb83e86b959cb95ab75cffe40dbac14fd24fa4f23752f427ff53c819426f641b3c1d339c9344fa042a536ee5525a6a51907e47f2149fca06008dc478ba64466c05e8f551674aa6b9f7fc28580fc9e2a6c0143c99e29534be149054bcc9283ed8128d7964e26cc8d4b68390cbc801d5c3bb4fe231edc47bd65b282b53fcd8aedb1ba90748832d210d21554f96614ff19fb5587fdb723741b719966acc55d524ce57d6eb8426b67689a6b43f8243ea50bccb3fb7dad7024c9a614652166abf866a3ff98df45fabfdeb10a8859513a94120948839e9ce1066b6a68bb4248447eaf2dee68e35ba245d09db99441fe89215bd587a2a93da925a30f93e24bc631c7939017ffaf9e9ce1d276312ea5d5c2df8e6c2bc7d7e623626b5fb61bcef850b65d72be8fd196a192ac1d043f1218b3801f56aa167119c51b1c2ee1003f0153d21b87e2e04f5ce86063fcb7eb920652224c720de4d30e740e509876207fee16e46cdf80c59dd24e08b71395f32004f4f17cfa0270c0c4d340a2cd9b7c7a01f114daa8606c3414357fc4c757b3d86c1aab7783d82656ff2c0fbc8a1c574389771e8503ddc7b8f87a3c2b8059ca7c7785d6c2efcff8a6ef1be82c8c216741a35f55aadbc00a6dc4b6f0d43882818ca7d79b8d0e965e7e7e0d24fe7663b8bf30a1872e77310fc5a13351d1b78e93628645560d6e29a9ab4231e0d040878ab12481c377b1c5162c431dff58b0f2958420610ab2f71bc1a26a5b5826fb39ad2fd4a519f08a00d1428b9d79c4cab425d8340f12492a16e266349ec27eb0cd2af5df22a912613c258bad15dab2623071ae01354ad7a966a086785b16c015a8e58c8287bc0d89357296ac82ac1be522a132d67ae13a6a5daef55b4926eea8c56cfefd1cee447b945f109cbb151f9c1f6c9b7413b8a3399b487e64b4e398abc9a86051fb411945a677b49141ddd6ddd4ffc1f0431ba20d35c17aa9af1d820e5acede90902ee96296287edc96ab9e262da28cca1ff80e5ce2517b3f4a51c812ae7620beee7697e3e4b35a8661832224fe64d8e311f1ba76ae3d3607f98e545f1dcc7cfa7695683c6664fd6e48d0511916691f3212c52e2db2af04215a88114cd32ade9ddaa2d9acc91dedffbc66ad5c26d23d5872e280e28f97bfbd6d2ffb19fc7acb38e867894f44bea386a3d87919f289fb16aa5fc490c08852536508f854321e0aad97728425a4bd4035c6f23d565148010eaf59beb197bca36151a48a0fd4489b2e7023e6a98b9b2edddde9bfbcd2cba606ee2ef7089b917a768fb1239fdd14f96964a802ae5046ac6a14fd23350fd58c96d69f23a85aa3659d0fc9c9a5424d302efa91eec69b20b7595f19bc7851b8f6022fbc316c5bd7059cdfeb44ed46adbac1ea4fea011e5a065c0316844ff2fe26d18d2034594c7992df5347c6847c2fdb4952303cc456a5c82adbd308a1f042ed34cbd4fd3eb330f039a209ab1f4abe4af09680f1a49fed9f2b2c2a458346a9b1555e412f7ea891cbe7e42f25d6f919388ce87e5002dc4178144361ee53f5813b576bb7ec0c081fdcd9cb7f5c793bd8a892986eeef64c976a2f811b12837d35a27bba185dfb822a7aea2929e90eecece985edca1eed85fa464926040bdae66962a45bcc8f04e6b0ce2c49f1106d461f747c16c68e2cc0d3800872023fbbd88af6ad91bdccccca39a643803a18fcde9d0f0be59663badd56672c22f509412db1b8244444601100416e2c20c1b31e6f72eac7d1ab17a0e8809b32fa988e16471dde85290bf6822d071952e1b02c7592807c49fcfba0ee28b151233e00822a2ffcb099fedba1cd1b65a158ca5ceee120eb0cdb0029cf96e50c77a04d535cea4e527ffca3dbf22c2e537805b28d2575b09706072b4c447d54800e099d665b13ed5b5c10cd0337d7da127007ade9e8c5a8f832df64c924c960b1a32c4accc28510596eb2d176a15b74a1a048ec7d451059f7bfb88c21e0f1822d285cd74712d41b4fe093c6e854a2e54c77b35c4f134ed8a1958d8641fe5366eb1c5916279b10321e60c3a4a22cf73bc10422e17b2c888c8d8b817a20ebb12b8b671a772eceafd33641974fe986a4771ee6ca0d5d0da2d70aa9663f15d34f59a35dfc538eb54f3c8c594e61a9307a51b4acf6376201f82a16d08b8b8dccfd8186a995c1f47e5abe900fe29270c79447d53fc8616760f571c2eff9e17a01234624d7919d25cbc2fe7807773d3ebf0ae5dbda1c396d5575055b23d1c6d958a2af51b5dd3a70813a15a60f1011cee34f06120286d9f107d0bef7a4746536aac79854833f2ae995f3b771489b862fd7fec44e33025e419620b67f7ea73db6d6205b87f77e1c06202ca3b44b5aeb77adb7c87cebdda6867226e4ed1026742348c8ac24830fbdaf96e7ba2c2913878d684522719a7dcfad64083a1280e74a6dd22292d39ab96fd0ee52db55a0e44de3183094155789b44406a0ef78c5bff68ffce6e458a9836a9fee97a14b0fadc7f63831e4e4f8417556c3674ca72396112edc67ec01f2e7766ab25b4321802c5cfa665ad39a19b8ed7aaa22adbeb31c94f174b383e4622e5cb771597af85f3feb1a6ef442029e0525603e16b7f0a8650d30d19b414fd135ee496046e1de71d837c0cbc6780cebe2f7e8cb384a5c782bd00676606d70bc6900c6a2d646c3b3e1a58727cc305ab53118c9685c5640bb5e60cc5068e1020f0c35d91a75eb4e0fd562783400802bcc3942bb6a9a1c1f7a565262ed4e6e6e5acd9c4e94dbeb91c0742dce9e79f15d116ba531d356d0581e3bc1c1cbff616936b60962894ac37c30f564f2f43ac49853a5ccb939313bc6878f8a57b4a7e9616dfc87563127c1ad854c4d40cbe29ab43eccd9844bbd159a51fb368dacdeac79f74053bb09fac2e2af382668257a5090afae19d8b35e106122d709deda30a01ba35f2f4a228f6e7a0ec1d443571056383978db7951b4295c724e3a70ef23c90bdc0d526b7b3d9a3c00639de4daffefcb76fcbcb664f5028b742da527b5e9d4cf914e71969f8ae24db53d81ccc1ae5771e6b016fb7142894da0fa3243b14dc6c9ef28a058da5f6fd576b19dbd2bae967b516b3456127b1f1a4d08fc04c890d44bc692ab1d55f20db88b08e8ab47919d6b5f7a539d4dca6e6dda08099e057c35c1aa441c781a897d2e0232b206d3e76f6957d62978ad87b8f96eb56e1e86ad823914a90e8360fe868d0306e8d2144e402958b8e06a7013485bf0b3e11d2ba2245ab56b329e84ba7cb98baff26eb7e5b534721f8e60426b91ae1383a0ea3384e3f81ca7f464c64d3812e88ddaa2eff1d4f8fe87eb31b50d78d2ad1ef90665590254219c7fc1bd355f7b1ed2c8bf719a98d54dfab47d07e7bf14bc4144ebd31261b11ca8eb8e4c048507b03f78b1bdc34a8f725454f8d5f2a49477f2f467f40f99faef9687f7f28820aa23948e623d3729c0143ba9738522594e6eac7c625772734c739520fd5fa6c6906b2fd4770a1602ecd065af5a12348a48b72b89badc0742d0505650a3f00181695ff0a98b44aac4cc166624d6656a4c99c3493d9e8db328a8c16781a08f2d0fa4087b2bac6b2f0029c00b0fb5a698fcf5b1f292b31a6cd9b77dc9ff2753324753d73338541c405918850bf4bb382d0e68ed3a4008210cd1dd2c82911a27573d28753a9bddecfb326a2efe9ab27edf01e801fe5926e5c5076c484b82af326b011fc78400bf64030093cab43406f34902959edd27665274e34ffe6be343ab6e0815c508ffe2791bb5a271d3b1a3c7a84017d3d435c8206759d4747c3f98d9f942e0fc585282d5894b8cebc30090a1947b4bade3e7e4e6e0ad70c4607632f1bff20109eb8249c768a1923d0fe62822fd8f8c1af8a272c6c1bf40eec30f981999950aa21defe5dd24efcedcf30088a5d81fde6b85d0c19327a77d5653c464d7d7542c6d4ba9ce1eccb65f877247d762ac0c44b4956299815dc4380c16b25b6ceeef47b6e66951cbb5631a9b11933f037de41d131524ea896cc982fa2e66a0da03981d0f08bf00e379b16c3551dd0803f81fb812aad1dd2e5346664885b7d6a1302c193e831140b93328a6b287c0cda0326eafe69650b1bc3ad420601017314ae4c1478bdd1ab3af960920373fbf9110c81588b74c17dcb1700ad51bcfe0fcc06f25a09755fe15f60352500afb68520c429c45edf4d0cff1f0d7e690bd81a13a4fc8ff94bf702c658b7e21506e90199f3a010ca1937714a8b51d4650a070449bad1e57bbb487a511c920385ca90c4769b7a5ef71c4f58bc4233328609bd9168d823773273ce32c03b0c441c0b363c43e648ae2099d9a27ac8d9303ea16fda7815da2fdf448e076f0edd473db674f72410f9c5357dfbc837eda40cd3aec5403a718eba78d7ca7d1d75eb5f02f64288c74fb4d67305d6e6a3ce1b6ebd844a890606fadea8bf0488987a2853c129b61e4a94c94f2fb0d429fb01ffac29edaa9d880bf06391c3a70d49dc2311d1ef206fdf0f950f49cb5f0a228393e3f047817d38bec884a4bbe2b5181f88065ebb6e0a3352b4f665cd0df700b4fad073a4dd1d3c5538b613d802119355e4cccc9cc558db1cebbe16554abd2ad8b40881af5d5ade2e88f3afc86c071019970144e535389ad93f28adfde816e1fa9d11e583c633a449d5834156e95b6a4adba111767de39ea0abe8f16ec595c245d202f9ebe1a7a35d06273adc1c11e45347e963496e5342530e3e1dab4f756745713d013070d26e4494e031b816337530a5a51f13c0f242ad72a51475b266b8652862d0cfe635371aa5b686784b081b0227577788a674b59f7a2bf1d3d3ab0bf01214c142857e153fdc291ad016b0ab0b168a90a707c13c60bf0fd982563d3703628b0151fb8dd58958108d0b1f2d4af235d524c562ab175c75ad91044a76e1008400a61feeb213746fbee81b19b8dfe27671b8f155a798ccb4419893fe008ad5f9e7cf1d213a7e6b4265fc3ea8168195a0e3aa9cb1d1f48e8ce88edee0cc4a93871e0fd0ff0e7118862fcf98b700d0a9859d80790d17b9855570a95e915f4274329cc0f0728068285cf283a69ff2238a0968353770d442602cfb90be1c3f2d45ce9177756581732c535189df32facfcb47615c028230e5b9e67d1ed9040ace331d1cb332fb65e541fa3c4bc42aa639270d63279a827b6767638146d2c231a699577c71d9793d16355e0cb92a635993e3569275104e6a8e1686fd9642a84096591c9088b10adaf2b99093756a4a070813c17af78c6220d7447b7b21ab1f0c08625c17e6a82d951d3619dde5c5c535da0dc4c3321200c13d2ba1aec8d78d716c8521342c79b1c838a45fa788fc488a8c06a5cf074d0cee62382a91d7117de49311e38f999572d7218fc094b14aa0dd9c9400e41aa65e22dd67d319c58feb9e22652673f1f1156aa86b8903d5d29f4d17b61b858b0d510b2f9cfdb692b547da921c3f88cbf89fc9362dbc3dd093deb8a5709885c69653682dec1b67dfd3007b9b9e4e87ef2788fe5e1d2f78aac2eb3fefb33c0697912bb0d674060c8b20dae139afbc3a5e286fe5d8c5157d622c520fdc7230f796c425515cd8ae273f7066153176a969fb5df6c825f1e884f2a232110a5748f6444c00cb3e9c85f7ef584088506f605966591c3256b52d7815963b0f5e05b1d5676b73656263c49b8f91e070c817fe2751ce97968d8f353c0b170f60092c5c0e6de03c2f709a6f1f9a062a1028e9a9ee8d608557afa89b7811a01652de5b3400f83cdd219c855a63c2a7e279a364bb5d154ccef8c301714b0d3a0c6b309d1ee4731357afca75e08174f9eff56c161ec2b0fec12cfbf5fa86502ab303417b2ce286dc11e27814e38d5f3310fd1a174aecf4fef271e4c77061bf928d921336ca62163a8fcfd19a63b9841f0b2b32621dec21d0b44a29e7b46ca25f8cec3ffb38862dbae44f8f181f6995344393437fd0c59b635ec95c94fc9ac26494a3687a741e210a390403ba11622636f690f89586d14e17fac40fa1ff2da18c62d1b6ae21539c905026f094dee7e4ecf877d176403b30a89c75177e7b936d131ea44de539f4459e624e0f742947bc61ae6f066f0af2a97ff647bd67c4686c802ca4a3a9df23f6c608493c0547f5a2d7e5599a83af6131f5a7962d934b7c59640288f60e4bd4db64a6135c08ca35bf4a80354a69d7f58943a7a7b294da872ed23e534832f3af3e7321de1fcd408e2667b25fbc4ea49ab57c4f8929a57c9e6cabc98c4e06d9284a1ada32ee84cfd44441a22765f3316bf3370e1f2abbea2294066b50551e275eaa744bb68754670a241047d23824696a057000e6ce55b704b624fe5c89d45c8b340a7b347545a7e04905bfa5a23b6618db0cc58ce1349667884a92a703b694146267dcbb71c2301ac24224c18c12cce4385dfa922fc7acc9b4cd0fea653356c79bc96199d34b8e954793ef40d4c76765f8b0bee2b3621dd8b7cda90c7b0eabe58f31e9fba8f9ce2447c27e3c231dce3c94b483f742c5b1853c026320c9c846b6a8089e8b89b6d82d727f0f6ddc942c7c37f50c15137d00102b32b5984758a849f90bbaf3389c26b21b22ae8a891ff078151b1ae6211e6f94be036acf9828f78ab52362ad9e0b497e8dfa33b98907d398da90d0fd213fbce1afbfa9a12576761941450a6b31a7ca61585f14e3bab026ae0587262ea3fd4a9a79783cc3f316f1707bd01920981053fb2e21364709f4307654203e19d1b1fdf8b659f614bbb2a454e26456adafeafce5aea990982cc9e972c48478aa35663c929c67a2c662f2b6c35bab60a220b95e1087bd83a26a67eb8353aa6dbf938d89073c5ca7719c6946eb8aae6f4a3282e4a37105a4139abe6c4d1efe947c1547bece6ed1edb9b747749323283505bb5146e1b7c53ade2f18e7ba451cd3505ca4e4376e5da686196cbaac5d7905a7eb081bc8a8b02476b28b49fc1abe6da14c434c0b2bc624ae3067cd3442adc0f17f0855f4b2e5e104f723331d509ee5e04f945530ceb4c4c3a7ab9c4a7a72e3128ac8a93f75173b7b7417370b9b0a8a1b1a658e019815926688dad2ccd28ac6d962a0f4cd9e53f063c4c9b7c2a146c161ec086ecea98f4e5b153c7b04a7f9edfb66069bc152efcb9c40122a452b7d820c9d3398dca61705bb4f6053a8f83baffccdbb4d649326b3c4652d748efe4fa8352a2d8e2aa2ec4deced996ab7460bb5152a585dd9d7532ccb77087ccea52c4bea80ba60cac8667f187f444ed5eb3ada9bcb0e102cdfdbbef6d68408695a5a5bbaf74f0b0c8a398249711cba0bbca3b4dcf4efe2db0d7b179e1902e34f1f63bdae2ba40b9c20c01664a324280c616e1a51598c16e19aef313fe31808754f8c829d169b8c1299ccab531ec87b1760a4876ffeaee349c4c3a60bb165c425f3cceabe374189b4f4d2c92942f793bba7f3f0aa413cc6eaaefd4b582126a566f9fb480dec650fbf0c8423c839354541daff86818f476ac8a033270d9a19c80fd85fa3545c42ee4894aed652c2e8bcf0dbf70ec3771c2eb65ec098056ef81d58e614073ab6e58bedd34e68be3557d3bd574ed2394cbc611f9912dec2de88ee3183ecb87a3a246fb8f1610472dcc8bf6b4508b56c9459d805f94f8ae231b9c0044ad828e198a5f832de732437c80a8bd59c7f6a5bbb90dab7eb46a2ab61c44392f713ebc8559489fd2da5015e7014679059e3418c8d83910c72c06e28481382645c78b808bac8784b171df5d7fecef826b0c96048bf77b5ea429f42520f18d28e0732340f4ce40789903c8ce32176e2ef55c52185887c0e23b0e9945b11d6ea88b17c2102e3606c3acc3d8d87fedb68e72a134cefd234d3a69180719859e05490a1ecc32c4176597649d1aa0993641ec41a64cff006b9668c119f1f8e1cc6dd66e701862a78eb72e8e939c84aa7607d7702141039cdc086d700477a3a2d708da70d912b948e514843e39497d7fc17d3591dd6b784f958795cf41b3094f64bcc58dfbfce9ca080680a16c499d045f3f6419a048a7f7c2faca08909693c42ba1929b82bccec21d0efb5abc1891a5e57def898cc22afdafc2bbdafcc67cff26a70a2a78672c2d351f746a810b3bc6773bdaac64ff65921deb9d1f03c645b2beb999b0dcd47dd66453c732321f5b1fbaca8776e4e683e669b95f5ee037f156ec689167580685107444be1bc9b82458b2a205ad401d15259dba9a2aa4614523544a17fb390efe8eb20d1b20e8a967460c9f1be59d6f529324d8fbad998aedfa25c07aae45496b51c2cf424ef94e06ae9882e2063f7c03fb55e76e386fe7745c24dfb6e6c9d431614fb0cb343a06c241a239ae700f55cced171c227ce556810bd21a945976996f702964b0fce6e99da73c472431256a8aae8f1d47ba1f5537fb64ab51e0140e8b4e57456d267e10bd94d200ecd542099646ad911ea43dd6150e15eb950412f1710c70bf435869817ccab6f9539e48ec781d12e22404b49317437c0ba9ed59991249d7c5f2f07e764e0ceaea07f60a37a5ef2f14c670db2ab30cc2be5efb6f9afcbe3a158c3e8171b406e1fba955653e6f1d844303fee4658193c3abf98d0ba712d092d3adfe8bbd3fbeafc95fc47087dcb73af17d9cc00d612b5f6c44edaa95ba242c577d3cc0e562bb13a881d12d7f0a049f22b15b820ade6dec2030e97e41a39fbf92c899e5e16d4c4616d30fd38a0bd964fd0187559b6c82367091a616cfbd1e6f9388b191b6a0a95e69c9b1a19b8a703c16fbc217b517d6e188777a16c6aba132370adeb7d356096d9500e521849b65f3a9f513ddbe1ca3d0c11b9283635dda919b8b6eb751d10db6c543e2e4f54ae7f1e7799a11727a2dffba1f6b2fea911b836eb7d1d30db6c541e2ecd54dedbe3ae799cc7b85a6e33c145efed78936d36940f6553d09d98816b597bd73775e920dcc2d29a2c3f33ae66187a2e08f35af6bba06f6a06acfd5a7d4b517dfca0d93562927b5f51637b9b877730f1347cb2cbd0e7da4e7e98c9721ad705715acb4363ad37da553cf5d6ab64641c10ed383e8a10ad64e4f3b0b0535b784ee3aa13c86758f9ff34e47d7d173fa6cc5e0620f2eb795e5fe0ec7c70b4ae6163d403619e91b40bc221a9dbc68d4c37180328540bcd9403bdfed67b90ad32951d133f7a9ea3ffa2ad546f2417e747a3a00648ceb7be812628b70b522fb04d98557fcfaaeeb279df53fdd0727e887d279d88b4d484244d9ff3c85efc323233c6d85f7d5ca1be9a5841f5474f351d2a6e583fe025e58485b8e948e7f112e58da71540dca5e2c4b8ac1fa4e7c00288fa719d7829eb07aa42553ffc9de0d4d91445c99485d71e87521e8c336350e0e275f61a2940ae2ca6ebf0236c8489023cae7f5d8898901e6a03a0f213ea87f3beb06d917b620837dd34e2606fecfae3782f45864015016eebe0b49e2d42a6f70bf228a669fd09ece89a682b195daa029fe842fb9a7a6c6cbad62db5a55185b720470648f3a87de888f4c42825a9a5211dcefbb6cb7bc88d820081b5baea1a44c4e0888bf759e091c3df893ece3a5c811fa3e82d4b7e4be741ec7a6724ce7462baeae7ee014bef72704a00c179186994c8180358b38763b8e703a81372c74f49f22c2a81c588c220d84b86776e681395a47f349d0a30956fc571e25ce16348227b95cd4512de95a445da0d206d07c10dd47c0eb6548b640be271091ea33ca04a76a668c8b5814a087ac7c68d9ab3a2b40c4bc3ab999270c28c12374fefacadddb80ac1e4eb279377fbef4f75797d15a52824a3cf260df928fda94d43379dacb61445544617b28f0b176b928f2d5a3d634b8687a2ee73cc1c1a781e9bf66db4cf6f04baf24171a77a5ebb9f7b14fa6fd8b8aaf509a4b5973e9dd05d576c3c22c2bedddbed345d6520a3642363c859d65363a921f3a1dbac88a7913b98d9d76d56d46b6e24541fb2cd0af5ce66c2f3b1bb59596fdd6c783eca3e2be39d9b0d9b8fdd6c81a98e7063df19e61342f517b276fed6457c5cbc83246fa9db88ccc93bc9f34edd8860ce6867860e1a453d103864946f424420139e07498ea96a445ee179c87398aa44f04a371e770b8b50bf0aec1428b11a52f1080ec9df90b521058f541099b6fe46219989f7f3309228a4b623b28b17228f2cd52b82ad6c04b44c4e56c1f82cf9462ef3b0e451a4b644b05b862095e5341f18e79390b59e12885499b624ae93ba30fece284ad556c810542b579b18a566e6aef564fb6218f8dcacda3e42b8c455c502510b76c8a1f4369d97546cfbcea791d0ddb53918207e6cdf6cac4fa727fd40b227e90902922d82aa63482269d5151c2dd03dbfcb19dfba5d00b4c0419367110b278a45149dcf36cd90ba9399d291e48e564e78118cd6a7dc98efedb23158d0e4cd46e12d9fb9c7887cf1af05e36bd64a03a8eced37139b49985f91826593fc65806d648db68f7522d25465d54e73ab7e0ce6253cf77c668cb16841700ac1a3f0fc7cdccdd03a4a3992fc9f2358bd022dcb41de1f80bb901a8c4b713fb87467fbab170f87180d3190bd7d15268bc4c4fd8beeada53492c7e3e686842a3e59445f1960bc5fa6381c298e4505d82b054b21193742f320609162aca63bb87e634f3102c2340617d67ffb681c6987c733e678a8745e8ba0ccb07ec36239e835ea771671d17a222d578c43fc3a24865b2d81155abc9a3a02a0595e4d171b725ce04dda7ff00bb67e9e97884b885fbb53750c828c152070cc24140d3de1f14b93464fa040a813427d2d9c0ad923478fbdec98d0bf2be7b7c7f09b1b94a9ccc173adba2fd42392d50572e7fabf06f765d432073b5be698b21214d4de628a04ff86dc0ea7c3f7cb8e0719f1db410af49fff04d201dc9803daa3128b5a20d0b2d21c969fb7b69f1cc2a8a2eba30a1db1866607b8aa819e381549ea87ce28d490e25787b36da3407705a34a972bf773ab83100748ab4aab0866fc823e19993b98889e0a9c5ff7d23097add8806265f4d29295bda59449a6c3089508d008d65aabd55aff8aad6979562cae08997ecd0f78ab618944847c374aefbd3df3de9bef15cb6dd36c7f65612ad6ad36dffeadae897415059754bc34d9df56b16b4fa5e2505d49a14f6dad19499794ddbbb0fd9ba67df7acb3ce3aebac95a66ad6e639ab1695e6c34c70f9d1f88eb5385b6bb3c94481697ce7a31169b4adbead4fad66cbd653ee9fb906658232e13ecb9a7da7bcdfaddbf5ec5cf798ff69d6c664af81e0597a99bef7e50627ad5fc112c6ec69d4ed6c4d53b5886862f9002f0f516366f72be9d7159128321fe7b3fc6211fbe82cba83ef75cdfa631ae455a46e304351f6a9852175e7c83028a121a34d46bbbb55e0514afb29a594524a29a5b5ad146dda1e815b2dbc5a9b36a53f6895a694c2aa3ce1596b86c54188596bd3a66034bd60a8ad33aa65bef37a79f6f6d2ef4c302721a821276a37cade8e64826b437bb92fa3a82118871445bb9bbf28cfc6e439fe4e0e73a12dca873632b26f60eccb9136d96bd3dcd64ab5244db3768ac65599228647dfdab0c773461de7e9f951bf69307e1b2570f923fb787380bfae3b54dc12c60dd302fde6d17ece98188dc606ecfd5e43aeb8d6a7229ef907a1da7ddf9f8406cae3c5a8ca5ee2415d1b4e8e518d8005f03db1869691497a3f494f847d24f8b04a0679dfe492b343e0fe0b27e9a04f2541b1099318d27b273512ae277687c069734be6be0916e48d48373189f4969e1e976b1cff592c8cb7e4cb04058978b513354d1c755642389c6f310049a8eff529688267fa30c04079366e0a3591cb7e22b7b70cb3a49e84f24cd8b521a23974684e95143cbd041b327822fb5bffeee1bfeae191680bbc7efb5a57b1cef985d7bde375b785f9d8ef7ec511318ddf73f7c699b2c24ab5e95862e6a530fb9af32bd29cf3e73b93ec0bbbc7effb3e7feb037d3b036a833b39cf264429cc9bb618984e2c37243238b1dc8ca272797d23da86b297774bf2b6f890c11e40a1f07bf2d13f06c66868aa92a6d7303721caf341798e7fd41019441e84941d7c12cbfe38b62a7e964edad40a55b16946d823f7bb3abd04ca9b5b5a6bb5f5865f8fd6c65acd03d5266e5afca6e3bcfb3a1c5d15ef1fb1dd6f2009dddc420b7e5b5863685e7521edadbd1e633a67becf77aa6d56ab360555ada9d42758e3816a1363549c0a3c96b6dd9c1b4d4b56893f029850419155deb040a6343dd679e4a9d417d80aec40bc79b7f07eff103ad0a8613e8a46141db60814c174c4c549952dc838c019434848d9228d29293841a7e50014cc6581fd5134c2202df1e5e612c60aeb26f5938cd54b3d3d4568411811056d820997ad490fd40ea4c03815f4e4fee17a1bd6c561d1ce654f14b9eca69635c9fe3f4488271cb06e189ed71d44b3955edfe9d6c2b6d5c54a44155e539ecd861be9cdcf6ee12a03d91f67fa36dcc8cd494a56d2929ef6d99e4eabdd361549c53aa7f0b68da4f5ab166aa4a77d5a68496ffbb4b092defdb490921ef769a1935ef76da1f5a7bf81286420d7a761b9ca381fa91be975dea6b25f89d4405f3b3e8c11656e56353646338630cd8cd0c87d370120f7e31cdfcfa385704dd387838fd341543737373737b29b9b9ba89b192fbed08433d92c4a369bcd767861d18eb7219059f7000206c81410299a13e5a33b35c99ebab028e846040246fbf01d2c9c1c2f02c1a27d3065205eb4c83e73052787d87423ba6444e113c93c310c1201e0c1f3c0828404171bcb18a55e4c3c2a3373603da854190042170c7a00fe1e84ae2b3a047f1ea1cb4b0369f2514a145db2996cc4322231228d58c6d858c62895c3c4777e808134c6688c881f63ab31b68db11e54c41e547056947b6f47d20e27762ce138c179e108e1fcd0c271835503c4191a8dbaad668713333b96709ce0bc707ec011f29d1f6624f9506234c15f611101ee58c2191a8d46a3cc793259cdd3caf372e048e1c0c6541248494ed87ce9a31ccb67e19aa5961328db6a6c4cd524518354e3444d928d8da9968d291c36a66c4c11816d4cd52c657f9c9613d872cafe4f35352b4f26933dc960b3a62a429797f6e1892e99ace6490798233caadf8545a127f3ab262719c8be3c417df1313eeb6666236a5e26594dd31402c48b0cba38f90e901654d1945f2a59eb8b8d2f36a03895cc53c9a84a162353c954b22aba8717261fa36e5496c95635ab9a272f2cc2f92e2ce2f15c587413061dd5d0cf81330b43ea08a3d80a6eb06a8073ca24d9609af108554cdbd24a6866252573848c91cc0a646237a4585252444849594909c992b23f4ed31314d314e2f2a27db8bed860ca342290974c267b92c1b237b9aaf0f2724d4945cd9e9c56a18ba94674c966b270ea69f65473d3854538ef85453c389ccfc16306855f3c70c658c99e6442db8e3004d814193e4af928f3d43d5c4d2ea62eb2cb4b15503299ece949e68935ea071848578890d2835dd211dee010c8104d284528071b8296b6bc10ec73e99235e99845750f9718edc355832cf28c08e4250bc38e5be9c8e1f4d4458d5911111212204ba68b714d5388aacbf4b1faa6ec9f23bc89f21cbf99c96632a6a69b10c8524d08844b928d1048cc690a01b2a50b2d4fbe03440927b27f0da71f523f6633ca03c486a21f534494e7870d908842f29d1f6020657f70766546043793c2cd7ac8fe31dc2c87ec2fc3cd84b22c74317599425c30b862a5ea824520af996c76133593657f560e1ce6c8540c5d329ae3f49f4347932cfbdfe8b00975dc74f63450c717e2ec0037f166e6e38d075f1716ddbc779343c74d1716e9784e87786f40126ea25a4fb2d9d3938ca9c9e94996f3dddcdce4983dc9644c4d4eb2a830a4662a5919b874c9664f32195393934ce7bbe9c1dddc70e1e7e32cea49367b7a923135393dc966514fb2d9d3938ca9c9e949368b92c9664f32195393936c162593cd9e6432a62627199edd4491a092c9664f32195393936cd3ac0c99e3d5f2084891e122e3c48c931927334e64b8c870699c7247a88e51a3a60faf387892fb6d0ebd53a57cf4cf11a33c373abedf5af11d1c04c50acd7cbf25a267b022b0454466bc0d84c098ea57c6c24bf3d4291e9b44e7f4d72d6d9dd092fbab12bd63937c74d5cb7cafbeed52d0d1511774f47d932771bccdf77b3da77badad2d22346f4ff3f69a0c33db772b6ad3877b3e32bfb5ecaf4d219d7d06cf314c30b956b165bfb3ed1efedad723da5bcd5634dc4f0002715ba040f98add63a9fd56a9a67ddef6d9904815eb96c207ce50c19ecbef9b42ee975c76d0da193cdfaeaa1868bee2a6591392b0dd258531a72666caddcab2d9bcced726c434acef09f67f6f0b6ff6c2268bbea2ef3dffecfddad3baa430b46df3114a18345f479c68877ca4d67649562c3920cbb68650fd2114898694b59f29c2164ba676a8ad10140bc5478a4413ed90e7d06f6d3604b8f278efb0ee41bfc15807a175725478d4dace532cef73f6efe5c41611ed3dad04aab6d20034007a478feea373fcdb87bf0e9eec54fb8dea3852ff738b2d229fb5ffac7db51ea8de3e3d62ed7790b6c243417e1244978424e8b8c961d3c271835563a306cd8ccc0ac7a8c0cfebb8bb69b6526f90fe1077a7e27b0c5c02b9d239b1802a5005aa4015a80255a00a54812a5035efa50155dfa7f240950a54ad4015cd0d950a07a8ba6193e346c787e20e1c1e2d1c37707870a3058031e78300e8f400c147102eaba6cd9f010297f3b96d0748c2bd1c0fca43fb6ef64210800afc62542a55cc070e60358ef507e69193a3a2b553d10a44a552a976ea070be27d69a5582aaaea410d4000be4ed5a968ed54b4f2a8542a550f01820811a10006c02fdfa11f340018a83ac08f1f433218a3c21f8e897930e6bd18954aa5023f12013d5f6c8cf2d8587fffa5e3739f03a08e5ace07f7af456a7ae7cd1ef66187fe6e5ea702bd8ff6e038866361364ea323bc2fc7e99b1af36a3ffb728ef64e770db0042d5ff186acbe018439a74e0072b8072fca638568cefca121a258acc90d0f59109c1da1f61ca5770b6b4012b67b2dc7fdbd36e89d39c4e287290f0e6f0d5a43e70b971727c70d3c6c3cc03828eb860f6c34d1a9d1a407083231a32b5890bc2b58624858aec490342c9a688dc0f076a1e763e5c221c4fc8a75030dcdea59345800ae321a924245d50497550a1523222a528c88a80c0d00a46f7b8032049b37dc424b4439289c68857e7c97f2cc205f5f9e9eaf7a04f8be20d77b9b5067fa98d313626797b4fd0c145cd2d738ae0748c2d6207689607101aee857d011ab6ff763cf4b9eef2a30f48ac0f74226493c30b446f4865cbed0be2cec854b1b032137a865e9c10497368b4ede426be4e37c13c65cff83ac85f665833cc76d964dcbc95d780de007f8aaf3d89785659fa57df9f08007ce0e107ae804c0e6839cd1a5ba3e801878f49ba03b0ee3c36019d873e85390049f34a1074e515a047bd2be01ecd36779101272e67bd676496168b3d6b644d4b7dd7f3bc7bfc5727eebf867ff3ac5eb5d949880d13425264659d3346f9bd7ddfb35195e890d2c7038c36d75677713ec572170896f749016117fee65780dfcf9dadb7410f0b5a7f1d71eb3727410550c3568b91cb3f69e2a9cd9439cbd5047ee4255feec8507c85d78933d4f0a43bf2f9cafec859389dc8506c8ad2bcedcdac49a6b76297556e0b2bb100097637657cafee30d4bd95fe7be7f027460cadd7799c3c6f7a56af2805f6a41bcffd2ab387ee2adc9e55893cbeb9e153085d8f7f7b4f76fed4b57d993bd3c40875b48db8726965ab78ff2fe3cd2e54ef4692de12bcaf059fbb9e5064d0021c7d061d2c8f64bd1d3c2d9d94ed4aee74d6c11118b70ae0012b79207b66b4b4d74cd70e6d1e5d2617aea7cf342c90330250f0ccd493ec09bed250095d0019b846ddafd23cb142c019edf1429d39f29ba5f77b7afa0fadcc00d431506afdd6379e1956f4153530e4842de4c90144b5224e55e92022997548a2b525069c02462e98b18794e2ef7d217a83c1f0240d8dfc35183951b03e5948a9a03945973c0c1d362b530e0119a3d4345c4a691716fd417ce8a1386758171f16059eeb7831880f38bb1f2c1a45c1b1810580926341ff6724286870486aa3455564e983c283252776607344f38326ac87051e39b61418d953a45cde724863b2e373a15e068551b303fd83831724225e6e48913d8fc2c201af78c1b4c031d647c13a8264eb3a909130eab153c8484f8794d6e132e425f114e168f0a8f2656401e26519007df94f95c6ea5263eccff722b3569f2611d5ca9f94f59b06c70b93864f18ce665c1071f8e1ab89801ab567eca7c1ca028e1d0043f51c2e19585d0f9a4726ea5a059935250172d59b2e3a801b75290521095ecffcd294220d838c387eb0b7a32451b20665c72f9cdb4e45e9a61e91951eea59950eed7722fcd72c861ac9153c08659d35704c60813f91b60b9b4b1612adbb0fa336003f6c7315fb8956e8811e14964e90bd397a5dc4b5f6239f7d217a4dc4b5f8872c9eaa52f40e455eea52f41a1185f2f79f194e77f5ec8727997bc589a41e02df792175b72e7ae9bbdf66ed66a2cae1be10417eb35aee3344de33ccff362f07515afe34450c56e342440e16a5f250a2784073d053d9941495e80018912eefd7275acda077adcc6d3d3f3332868fcc04fb3d67e9ef7435cf33c2b812db00c5c780106097490ce3784e1ab01a679c1a35c38c2e50c7a0a82d95c16eb7e0fe571a1e7da9ffe2e80e2d3273e79b7856c7f7ef7932d0c3efa0b2e804280939bc1249a73528102030d2f20f19dce9bd7af00ffd123c290114ef01d3bfa38b2fcc5f2723fa7f79ff7fd98c6bbdf610c35e4eecbe2072c5ef09d1d17e60fed420b2b0c81bfa64b83053b8d8feec2387e8f354160a2a4ef11c177ec37cfd31cbfbfcdda2314e18fcb68c71532fd89d382b3586ebfdae06d9ef3f4d31fa50e4e15694541023899d6055877b98630c119c70e6a030b2a1ea9dfe5232dde20a50ba8bfac625943eeef2a9635e4f961eda2be0d51f071c59630b98f2069a8b286567af19095ccbc891868a8ac894790f41442b98a18e82984f24fb662d9e59e42e889f7bd539b7ad2ebf5b242f67bfd03e3e4991bc4c9437c0651ad5f7b7c3fb7f69988a47fdbda1a7ec6a1955acff585e06ffa98ce62515a6bd5706e6b232bb19952d14fe0cd7abf199b22c6de8a083aab67467dec230d0b63ccc2345e7dd0be5bb4e375f568e117ee485c597b67d1dc6cc32e63c809ae1ea03b35a3cd666e730b4700a55c79c8f67373f5f858c43d27626ad33de8d74cc1362c1eef27125776651bd678a11dc49f7e8ee699407318d3f8884277d1e5ea52c172a982e5cd05187ca45f83cb167e512e15b2231c18f1812651dc008465cb0b94b8f202a5a62a48fa2ec0702fc6edc28d2d30f7ddcff7708225f86bdf5a88c4952b57f1cd98f25c724819f8337d1ae8bb401f8697e69d0f3809244fc7edb96f2adba9060478ce71ebe1969cc81aba72c7851d45920c845ea4935aa8ed40e405813f7f9eaf094b428350f5aa84d7381f12f1855c3e0c4660faf3bf32f0d74154f9ba7a46d79829fd49d2bf948aa5122d1b81e93b0a3399fee7547ccad3a4ff3503bf942a90acf8c1063b48a30a4942d1125d0c457dc9324502ed006545952f2cc04116242039407443942a39c4e00c192965653e4b4aeb80072a6224788202131c91338b24b6e8220c26b660411454bcc6d1801612a9afd70c2e838ff94a585948f798d47fba28437d253713a08a04e871be8313346106cfb5a77bccd7c0cc2d22d6c5efe6cf3dbed322e4f9f3c7f9783e6b7ee34c0a82da4d29a5deddddf4e53790ea5010e703ec0663c448b162febdd2b128a31917a758521759d31394145218232c598c90fa47ecc3e94bc3fa51c7d513d3128bc5eaadadbd6252d96f72fb6afbd21a71f7add3d0c671dbdb269ba50bcfd441c822f98e16df69bbe43b32cbe43bad144588c7497fee6e35a0d253d995a210e57b67df15cbc77964fb6f450488279bf7ef8a40a3f38467e6104408b2ffe8f21d1bd9ff471041d9bf678846ad511d82524a1dd4a856d4fd10b746de894646d4294ff7f37b7edb53229b783f7bbf3c1de663672929bc9e006e25133cc937722b998028d3a422de03911d10d96fe338236ed5f75abfebdec59f56fdb1fb1ffff90c68f27f5834477b171f88fc9e2acae033ff7b0634f9893f532c59e0ef10016ed2924daa867817b6ecaf4073342bcac080268b883f270091ef3565cdc7bf7b175b4562bee5c3fdf7dc7f3fc94e3cc240d1fda2ee9b6c59b14890bf57c4137f2639df1f882c7ba9c87d8fb628759e1b224dd334a52ea850a41468dc4bca4b86cae5b492358d6e4648bed34a5056b2f6348beff80a8a72f9c5884131effd10a746bed34a484364ed2916dfd191b5bf2fefb9077afcde17be6262c496cffd98bf221dba3fc9ebd3894a30806525f4c8be17b67c384a646492dc4f927baf0a4c91284f6b7b8fc6284ff7f88dc4c43c16971cf9781f837f494c93dd37b9853084493acf09feac2d11edc08c34447085d015a406f41a4111609c20cb124a50a40684030f5f94800269498a2648cd4709b094e089171c018321527b2f8c095ff3a57af0e9abc4d6067ed226fa7433d601915e177aa1f6df039148adad7b1fefbbdfbe137f8e36d1a7fb4ffcd1be13e78f4876f34573b44b73ea5f71be2807e4feb1c06b9cb25df7b68b9b2417e250fb1b57e0ce1afdaed8aaffc37d1587d01c6d88875ce86ad5ef1e88ec6955b1a502c7fdfd5a459ffb9d88698ec6894d3ff273c2abee519fe6d40a349d6a719b30104b52424c423ba4a0e92a01d1b4c518452871858b1e666490730733309ef0c20495d71323ea5f2e5aba64fa57094a52ee27722bfd3095bd9898dcaadc200b8aec4939f84bafa3a9d1fafe22bec3aad9b17139af96dacf5289164eaf37703ca6b981238c61e6235a4d92c3f2cb37f2101a63035cb6ac880b49421b3e2bb4c0aa7956eb4b2535dfa7791aee6938d17261e719430df9de7c5be1914be43e7def86f6cbf9343f84ce1c03172aa999b65a1d05ff8f28109ca1040e4dcc080109b4840e82a68c76b0c3972ea4fba5455a37eea5236d8938301d75b0c259134ea227133683421f0758d13d546016d9ffd3c26942a0871a0c1439c862f81721c37ade9c503eaf0dcb2f2bfd209535fa5b089467c8c5f4d14d5995c6f654bd56cabd689e4a3f34e5f9ed4f3ca491cb2f973679be84a0e4f2070f331b3c6d1508820a173580810e4ec0a0842d3778e142a50827843c271c0f99ce289902750efd9a2af8e6b2d654c15b2e2b16dd4fad82cd2d16410176d904f17dfa2bfab493b991cb984cff86f3d53d2850f7a03f6de81b0d854c2e3b4c97cb0ee381007f98ab05082e5a8479e2054790f461a03c2950710226322ac0a4a00c927e911588c07cfe72cd5e8cbf67affa778d9b23cf0992e05f06bf14e0feda7d565509f46934d1661416d0a691f6d17c3a68646c46131fe4561af29255b99584c2b8c11877b680476ea5212372975ba90724be79054d7f38722b210565566ea51ea660a13424f3915b494a5196c9add4430e499fef6080958fcc189211d19c420ef371d2c0da49e26391201c807e88f2640bd80d6540d181b4220edd85872f8446c045120da490557481e6ccb29f3a0b91cb914a2e3b694a2ebb0904b96c2929b99cb0a11925973376821160889a86c0c1054b90e577008b0e3e50d961cad215b2ec5152258a1456c4c408c309928a65cba8409172833286a09a8e4817cb9ef5b88049163d2461040e3d4c2e455f42f045135464643987a0e430440e96d0d0c2062c643991f20c02087646133b1471c40d3a6082eca26c1095840d49b8204c03a22821c5173ef890821d90f35d9407e88620bee872049358961dbe24b8a8c2022e3a385541ce7781f27cb0c50b26b6f84094317240cea781f2cc90518696a822c0189d809c5b84510231b40031860b8620e74f23ca03b4c40b968c88e20a26ac3c41cea43cc43534bc7917e03eb8e615045ef74eadd4b310f756e2b57a7737389b4eea64d36ca5d48bab33f88161939fe7c9f0f9247249306c72fbbeb03b673e2876e76460855b2aa81efc155462d31cf057f87e4710477a96814820d2bdffc2a0ef7110f83b88700c3d45768750dad73c0f88824d76e100be2f3ca261ea171e5d9dab93fd7570c61ccd3777bfa0f77de151e7db119ae757d3eeedf2c31465d85ec9cd6e87bcc639aaf368db9e48cddd7b3e3bb17da62776e76c205b2e576febec716fc3ee28869edc1d42f7134c817e479f0bcb8ac24c07a640c384a175f3c2238fe3dcbdb3aa2bdef679376d7609f60adf36918229581b92f0c4af7369bffc3622b512a9e2f5b15ecf9b46034696b491258d711a4f39c1d573ad6d28643d2314698105e5ea25a6a6a7aab16c1e4b9e3f1ecd583a9aa669b72231c1eadf5ffb6d8bac495d27b87ae60bead2aa6df65eedded2c64579baaf7fb5961dc1c7bfd98a43ae73e1b512dc508861a5a18812f29d86420c2dbd71c9ddcfd3f2bfdf3d4fcbb937b23de701f978cffd1c75e2cf0f100d4b2bc0a0eaa61396663edc7731cfbdafbe9bcaeddf85de736fe4fb4e5cd2fdf7e2f74b62be47b51263da47f5a0f833d29c7e15ebde31b7c7fadec5960adc776f84fb4e5c72e4b3faee97c43cf74696acbefb26cb1e16540fb63c266cb938f35c28f3340f44e219b3304dfc99464331232bd2ccc8e00e56ce21b1351f88ac6124b6a65824c8c67f93325fced89ca239fdddc770dfadc49f239fd5d3883f734673fa571f23aec49fd924fe3c27fecc256e896beae6eacb3995fb65c26de90b5bf3ef7fef85ad29b654d8de7b239bd89adfe4931658c8d00191cc1ff9e023fa3fb07e2afa782f23fe384c74a3a1d2619e1185cda6286c36c50ab79a70b311d6089be6546ee6535d496134ef4d34a7ff7f8e7cbcc7ff73e433f31eec00a48ccf77e483ff137f6844c7e28fcf884d2629e34b1e8b115bf481c84d96fb4b5f5ab5a85824a8696c5bf2a6dcdfba829bfcd5e33ff289f9ef3ff1e7a8a5c2f7abf7f97ef5893edf63f1870e893446ecc26a4473fab9d0a849ee4b3ac4899cd1924ee4c49611d583ad22dc33a0494e5ccafd46b4a920c2104288a5d78ba44b34a7ff07e664f735700f8aad2f692cf7ef18c24d36352d69d10105534c01d5894b6a7879442aacc2684e7fab556486bd224fa4339ad3df3dd78fa3095c80a0a4dc2ec86535aa4315c67d2cd7a1dcbf430a6eb2656492dd4fb27b3a4567b99bfcc4964ff72d178b6c496449a7727fa703fcddbf11f56f46fd9b50ff36d47da94de5feb2e5629dda5eb9bf3ed518cde9df421c5b70931d397359634b3ef66b6195d19cf67ac09fcbfa945b6aaabf3ef5d7d926450364fd46516ff5fb431a3c9be328f7bfbdd84925b9379cf0f7aa5f3d7e2b963726a9c592a5eaa415be37066390c552959fbfb21337afa5c2f7aa67e17b16c06f2a0ef146e2ca9bc8da8aac30e404f023ea7c8bc2a988496898e4c57febd3a7e20ffd2adeae6f4520f23dc497e53d5ecceaa1398efd59eefdb4964167b5f4d27b29bd97d639e9bd18575aeb6f3d4257cd87182d9e5077492d76b125585d8cf270e2cc48acd0add9826967675958de7e890a2e79ccbd34c517d9abdf8c16b8ceef8c289842779129cb2b27f859d857de4012fe0a5cb2f234810e758ff9a0fd06af06ec5f7113cbfea5ee31bf9158210f8bb8e7c42ee639f367776f86e5be14ec623ee0cff32dd27c1b9b6f89ac514cd2468471dc3a4fa8e290114e18320257b5cb9a426c6ee943e89d3e2a55652b7ef718fd4e21a1efe872f95e172ad1a6d8d2bef30859138798616d9849a9b7fb1605d2d190bb6fddddad241fb97f3fdfdf78ba0542e3cecc53890497890a61f98b448214e4b2274f2c51b96c2e79f6129daff97d92e77ff331519e58a0f26c51fbad9fe646f265db1e0faef93df37fdcc0a8d32ff59b27707ca77e3dd3e9f7a3c7cfa871552010d173ce8994450b5c624ddb30beaa0f60174b1a9aaef3bce9f97b768e0ba3eb6ad751ef6657bfbb0705a2c9c7fe616306b8ebffc8d5d301a6a2d8ea9981727b81c49610782185c695d703a09c9a8019d124072d9787e6f2f3c7f9783e6b7eedec721dbc3d7f77ed4adbddff3e79fd03ebe499bdbd6b78701e1d72eae421fe29c1a46cd8f24449c9092633d8522c2ac88a263018dc7f438a97352bf1f9acf97de794d7dd65dcc8010e62aa12441153a80009262dc6962e4f042134851528d2a7f8cc9ebb837490f6f7fc94c722252155031d7cc8c10ca8082759d210620ca230366cf136cfdea9dffe55ff3a9f3569e054478606b833155b44fca98b2d2265cd5e7ed9452422642422641aca53812acc90428c2d1f20c1580225984cd9c1891dbe203d2997e3055ec0050d29aea4a1040639bfef05f28d82bfbf1fcfe0b5e6e3f80c6fc03d524c5914a795f8c76419ead7946270684e285218fc6f8a34f83893e6d2449ab12916c9fc1097f95c2c16c6973a2b4fd1e7ccacf113fcefe7fc1e4401fcef4b24aeaf00b8954ae0e4555596a166ec3b33d32c43553a828cdc4a470ce572222995202a4f24ca53f3fe5346796abce32f6753f69f42626b5e427d306ca9fefb160a313f7f3654126fa920f3336f44c608cdd7109be6dc52034079f52f13d2844f73e617a1abf73e85d5d3b74572ed42d52a6c81fffdeab7b005fecc5bd87d4c88df9b604b859997791666441991055538b3fde98945322f660d898c3891eefb8ffe98f5845d75826d1bc35203e5678ed64cc11b0ae111dabdd6759d26969b667fb38e7dfcace898c0afa3e3e29ef27062dfcda57dfd6dd3be7e7dda2ec033576d0ad6beba3b88827644fbcd841946dc1102fc36cf3081727d8dfb9cf24c3043fc4ff077f9f7f86f634c8f3229fd39df892e31e90a49da6bee4968904a4283e5c4a79e0eb5d67e1ff1df44c0dbfb86c495fd7fc3f1913e8e8f54478796a0ca3add83be57330577b9d449a1a172fd2452e1f65e839a5816992d16b8f74416ee37cdb1ab5cea649d1ecd138394ceb462922df092239feeef2ff19efb25dd5fa9ec84971cf92fe1defb25f7bbafdf22a2b55839ca0b3500830b281078110328481a831824b8c10bc06062820a493f090d355330cea54eb66f847bef8ddcef5a5654817befbbdf44ffd2e585b608b5d452ab5324bb5816d142ad2c9291b86c58749fbb7f47a9f94a42839075300473ce5c36150b9874ba7a7efe3834ebac4f77058e7173ce893e3eba56606ac16705d7341d8c3156655c552550d65af071b95c38761081cb22f9883f12d70d27dc34879610969384a05ca8f4ec57453dcb90a29101000000001315000018140c8784429140289ee869a8fc14800d7c9e4a6a4c9bcac35912e3300a21630c200400000c00100011229a511000639641d0832fe6f7dec9024c1683bb49cc533adffa2cfab54687740fbc290e900e9c8c289b0e94e9de0e48291c333440bc8c60ce5c851ee59f20e146a9ba7da879ab0427b6a03b8f9808a5eaec3e1eb3c49c23be61473706f845fb20d156c847d009d5fc1e434e9baa4f13c7ab82e12dc61de1292e38e8cdfcb3983fcdc4f743bbad3f151185bbcedd9752f4787fb3383f33dd7a00bddddc5731140b877f3376433bec277d1fb7b4f533ef82336337746664fc3ff18e10a8236f008717a20ebaf70f74f2062d014b3933c8683ce65ccc97bfff7e41831fb8c8459b03f494bef570e9ed0e0f575de953bc3920084574ef95083989e460527dbb8075d09aeb60b2d30ec77456e160092b1a8ac74b48c18a8cf0f52607a46bce249f65d08a28402c8151b22cac438ebf560c746f49bfb1281047fb0203b50c8ccedce563bc81dbb7c10f5fbd6c32b35a9cdd95f03606a5415c3c54401b1ee2ea0f62a3da2432df8224d9ab55741da1c5b46404fb1b68a999e571c65f1e0c7a5833c391ddbc6712ae530db0857ae8b333af98a1033e6176a319b12b62a1c8eff63182303b2d386173a2d8d53b51f760866b183020f17137eaa719eead6ce34f53a7decb84b8d0b6e3e77b86bbd4adf872418995f1515fc654ced9f06b069c632b1c5dfb47348ea9aad26ca290d533cb58dbbef3ab20642a0f6b89a78b864928fd988245155fe8ea2b03d199c28d4438d29c76e180534c3b45072e125ef0b975b0967ef642f9a3cef8cbbbd07e1b5028f829d37777fc827c0b0a1423fa16ae53a204724f1252438c78e3fd7c15ec8b634a611ad81ebb7a558d2565adce52413a77511f7b03bac06833a5c2d045ea81359f531692d480945206f4aad60f70bc9dfbb780535f5746dd6fa6ea365effcf8193371e39a8a026f3f250a0e280bf358ca8f56546999a56d698fc858ba94ee25b27d4f7b69204c115d15f78d9f7ea4c10329513f594c4fdca7a948c9e4c6e3abbf5076bf9147ca100e770db455aa7526a0923a7f2fe88c038ca49b360fb3fa22a4893353127de8823ee9433f1693c8e10ba94d6bace30c57b0da7579c5a0c1f80e497c17dbc9b5ad2c195dfe7d9d4cd85956b928f147c78138869bcd43fc7079f462eac0752cc3a70599666e47c57a46a0c4d90dd98c10d494a6ec597590904a8268e77a54a88f928390ebdc21cb91ce5ae3396aea057e69b629fa49a467aecc941215f41e358edd57008545596ae9cc667784f4dc869e3b1a948a8e6dd4a8453a7d8d61c831c1035183ba96e8033b387bf74872d93490d072130ba4f4f743d98b3320a25ea7fe06da78b302ea368524d3a19da73287cf22ed51804af2cae26774602ef67631b4f4327586fb702c45b0586f7ba4abfc8289d71f800de5dd71aad71b76be5cdda819b3f4716fc49631298f56caf539adfa6fa85ed5be16868d612f1e8c71ab6e7da0a747d7a95f630303dbf64478511605d7bf163c2f259cacd8c0ceb867153e42d5c79cec7aec8e0064289992e538a3641eb2f994f1398599952494c0d8fcd198daa0a9a644a578d6368536dbfcd6191ca7dd10e634c1c80241861ea7e01696f41adc468f217e4fc48951b8578a553658cf56310560085827ed9eaac673c911da01b55e1fe34caa670bc12981747c8754f0661168144b1a2b8eed1979f309255244cdd7a44c7531056e975e8b33d5f7984542283667817cb4abe80c6290820c6cbff388789e23b74d9b3593f173770419fe9887341ef53ef9f561cb30f0f0ffcf9d4238ff4f7005f303daeaa0b12d74c0ffcaf9a3a7047e8d14e32b13254892e4134eaa3ba9e2087a997605ce1381344f3e112685e503c7654133b9916e2673c3d7169bab3bf0a7cbf131ba01d6d3d70bf386ad140f06d925da6d7ddaff0d411d3520c94a7d19f6b59e92541c307ec1b8562281502fcd25574997565558bb93ba341f85d32b2889e29ddb9448fab76bd3098e23ca380b7715ff95b3405cb199a911bbbcefd19ce79e109effcb90d58651080363edf0d583e4184f34161e78daefeccde7a110c4bd5701334912d06321a54a9d56d79f04bf9aa38064e193291a43a804ad1047aae852598fd925346d2408a974068b0b37042f429eba8b011397764bad31d16f598253f3ced1419e1f0912abcb033da9d2ea2deb9c8ada47a3c898cd440f6a4fd59825912de7bc0c1685339023bf1399cc1ea22d82dfe60a0f69fe9747347fa70e314b7d3c049a45d8c6cd368727aa19960275c021f150ff4eceda82a0ebc7d5a1a4034e02b29a7bfdb37cb6b60a92e6032f1bd21c2e5e4e17eba157fe31d694df01418dcc2ef1a735da1376b8dd2946822670a1294d1e66334ea580ba0a19d3d72b33ff14b91dfe58a4886ea2911f1a7a576a012d812404819a419f912c9a02d6e435e5d1d14859cb67245dc0e6d3f42df70645f25c86a91f2254eeefa22b20d56430f3ccbe78608859cad588145e9a5a5a8104d4a0851098e72dbe9dd0daadf0fe5554ffe6e9dd4b750fa47887140dab30d83d31bc97c60c4699d76f6fd91dbc88c85d2a42135bd4322c6c7db98b8f162c85866c9f4f4817d35ce361c9df3b9e8fd77496274350bbc608c95c64ae27ad42f78d36848102228d7fe5293bd07cccfbbbe2be2fb9088c58a1efeb52a55adf055718f3580d2ab8d538841c2abd9c8a0d99370dde22267bbff7251afd4383951aed4d41ed29b804699ed5e75700ca901ebf0e391e7bae887b18357c9ebd37e622de32ea979f918337ed5a2cd62a3fe17f0bbcb4aba72053de62403f70b3477e93c12017592878941a0597f50a8fa7f9858761a6728f40939433c678016bb667fe3606f2f1e0437d2f40d925a3b6820dff249d198a32c91ea4fe8c87c0c9de4d81e1ff7a1ebe87b88512fc041e4fa37c681e58b452417903e1e052d1644b49341aab2a4c413ab8d45bbf067a5047ae9e17fd3216d1db51d73c8b3e4714e5b1407a1c294c47fe39140ce0f1fa8f72764feb5a0b12bf223580fd6936b93e0af1c10b22658898d475875856abc65cd099dfc5ed53f544b304b4dde85e8461b9394af3a2bafd8fbe7ed061b30acd5773df4d616cecd8c40d01cd0544248cf8f0b9dfc9ed95e70810a5e17ce2495c47e348c8a9f067ed6d37c06b5e832f30d8dbe996f006b291ab09230f6e2450c11648b9277270af809afe3b155d7f5d11630b6659946581ca041a61892dad7f1db807edc3cbccdce164233d3a1306617c01db15a3da534d5c615088490eb057eec5f89a11ab5e6b6ffb5c45d6b97ffbbcd2cc69b7d04860106bb0a2c893861546a64444bb30efd160763b79f460e39a714757f5174e21de54a28bf7f5fbdb9584855d8eb094cce3ce6ad63f297563ce093758be695fb87b3a0679ec91a7915a85a88a479f23d01681834afa75a93798dd1ce4edc828d58d2995d0bcb27fc45c5ccf68ecc87e505ddf179d405bec48d8b4dfcf574aa59ff23378f08e1c802d54a4643c6be79651fad3b87eb81627cda374f75de9ff65d774fd88c8002dee0374fdaf31913502c7139206403c832441c657c522cc20be0bcf33e12242cb278cdbd5bf97fd493d845e43e44f2ea94a3e25577bc4d5ad7ecbdf668d87057f76e745b22d9532d0403646b9835a3650036bc94882c2ec848affe1ad98d918c750727b2f5f23fed996a89964ef00f7c8bfd5e4823f8752424f815a838659f05e19cdbcdd7506cbf2fc06f34a4c4765a7cb481d945c379d1023e80fcff8994d27a512aae0eba610e516e336709d48a55935b0678353880e1a96430e0dbd079ec297896594b9d943b3f91830ba6d73b1fa221c4f6cdcfc7af50261ab6de5fe6d352fe71ca427741f21c056fb500199e4f5491064e99b0473d956c0f8c916e06470797f6a6aa85b5981739951d2c9050ee0ae507026510cd0f6054373a51c576c513bcba1147e3d7f67846bb2c249868eb892911417bbf63d06e21c3e75a4a820a0771b3e81e14e9c0718a6c8668efb4b44e5b48c78faff81a00f0464638620cc517cd795454633634067ccc11bf4c761af223d6550c990c5e63124bfe4351a32adb044dc9bfcaea1cc1ddfa05a7614cf37ebf7677dd1ba781855dedcf56e5ece2caae5d5c063bd65a575db9ad5fd4089cb6fea29c3835c9977a7a460e0ce8190ec6e30f8e4cb4756055977781c6b6597a79fd479aca2017db961214f0f115148189e1d2be096c5c31a404a522e0a6fe17950073cbe15b31ea62331d416c5c9294e7e4c84b35db69e55e08f01befe21d24d4e6619b0131428f4e6c525611f8d1ed5790bffc89f60c30f4e3e6b9cf053a14f925fa57dfc20baa3111476cd7625bcfb02b7e8c6b788b74ea39e4e4b92c2481301350d5fde330179da6f4c62a55f259188267a1c8d42310b54b79794a16a29cad43e601d1358e40195f4298834466acf335a6de76661802a4915654601a00ce5a1474ac753209acc2f2919967f1648c79ba0d8fbe00c3e9ffa3389e9fff8cdb4272386ad84f0878defe9bec0517bf0bfaf6a12ded6e5e519a1c4e5a979a0c7423d088ee55e10953b1c9c1eb26b412b87d7fb15618704d2851c567e722bedd0ea14762aa9a7c132413dbc6b7fe5b9448e24790601edd6715baa75bdd6002d2dff126149e530ff2c819d4e447e545508c4f4f81d0f7f13f2d49b66f1fac31f66a792e74e001f76b626ec9682a9ed5b92c0c485bcdc05cc197ec9bdd53c27aff034cff780b6dc1ff162226a02c32d57213654f122f229317dbdcc2d3e5ab4dcc9e51ad85df1fda932519f1fce93d5310c2fcf137554e85ac00e414b06a8506880e2df70f8051f75d9009f78de808b92615452b1508fbd19498e4e1a014320d8982fc4fb16c06db3371318d6db2ae6cb58df20ca47b566bc48fae66a32bf01cc052f37af7c14c9f8ea61131d15f044d531cea053361d0b7dc19a2f5b7f0cc4a09bb48dc92b5c20983c161e3324a12a112caf9e07651583d22debf31148e2f853c027fee1c8c81f3be5cd0807f98240bd30f063d7a6618ed985512e5a92e3adc11776d5021457c47fb45c0eb483882b06cb96d531be3ab3e3d25f7ce34b90b6f28b8705e8a29b7e492fb9680d92cf74103137c720e59fd63ae76ee56b82e2824ba8d5074b17d83c71d6d04789132a90052237ebea34c048e0ef54f0f15ec0df54b1a1749243555c1928a8d2f94fad75568be338f9ed747c50e736376a8faea39db475775973350fd1ed1f3288005559d608efcb6006bc8c2f80c724d5cf37efcfe29dd2f09c29b4f0143956d177ca7f394c3c487f317d57d6c7f98d6013e7ff89d4170bb87d3c0cc92fe32ae9cf226a3df9e693b4e9709981a0d6c9c349837f9658331027d73001f856774a229917976c2fafa1a8cdd86ce49679a023676fca03e6990f49745a42ca128e7787819b6474494fc2d328cec38b9dc26effd852709b2ea01bfdb89865b07a886dbf7fc59eec8a38427770fa14d8514dbd3c1c1d5cb27ff72e42e74d67ff513b74ec5459e49abfeb4e1340912c4f715fc1bbaeffba2431aa360b4bb188bb54633bc2712913163f6bafa471f85f10bcc08103293ca8cb4263103d9dd669d70b36f0947fab412abff3f517a50e86ca5b6eb5b7366c000c8189747ac67f1558f0ffac7c0a73962d6ed9f511d482b81772111be213c7806557008f208ac345b2cdaba058d733559a4dc53e326fb34db0a687035e103389ab1014bdfc454ee248fbc2beee45bb79a04cb4ab5ba87b8aeb61a9f176992e9b086b5022ea467a1c7fde8bf3653af867bd1c565f738421d5d1054ead55496b32c8dac0b86d46170cec098ab8606a70796ad19e2725ecdb06b0fa5024424f2635ffaf1e5abfbe3f0e41e509bd5b135b24062f9dc2347e7c1cca315c828b477de7d3d270d319e219429999ff3332c3b90b06dfc8386e59b19095c88194341c5007f57d12366a47099a7bb6d70a0a6129a8d725a2828a840bfc0a502b32156ebb8d176a3334122413049ddc0fff64ee16cecf6d8b49ef42fdf08efd14a1abd4871b4858d7aaaf3badb05dd6e888c154341388a1755de7fb1494a9a7124491625584b8ec5cff14f899054772349897fd31f33e661bb731b82b56fe5f75c8c422f456fc711b94ade2450189118b4bf23411b162d6735ecfcf01acd3d0ac325419ae8ee8272f914579aa82462d94bf3310d2f200057beb64850e257acc99d366f30a1998c4876f38e77227ac514ddfda233b8a4a8cca14303bbe9eef3bc9e8e36e6a4ea6f3547aaed4bb466e632360fe791e1e040c79cd958ec7221622ebf131c92c0daab57a7b00c6086a364832558b60c2accdd80266a253151e1edc053b11a96c4dc7b96c414641fb734186d91b323b9bcf2b4c9e1cd4f464ad8f7151e523bfd837f502c197c22d98171b8d8f2b33de7747dac543d365fb1becd10449dd4f5ad3979a62a8151f11e74bbf96d684b6cf798f3d79609de521d2cec7c764347799b82e432ec7ea262f957f5b66131c620b9cd21015b12c82f80c13f212f165a4b78ab71e900ebe8d415da08170bda9ee670409bb63e696b672e9374d893cf4c7bb8ec7b6cb1839c416b5663e6b3a5246a15627163e997f732e926de0b365499c0441257380d8294fe5c7871c540d97667856898b3c723a23c05612a25001d35d61d8ab31ef7ef946a3ecb9e70dff308f60e5e6fa0033d379a99ed7a29692effb16788c24b3e982a4116a937948ea92d9f74b4a77dfe63f179abcea7a237821bf7ac73e6674ea040646b25ad1f6d2fcc7eb0896e090a9ba46f0038a6674eb1f0b5360cb5d351a9854c8787c7a3932b40b1551af460a525fb3c0887286cf81cf45e12641f903196686ec90cdcc537782c6a6b59fe04b1b8931cf66349f96313d7ceb5110f2b14f68c5b4800110d6a88e9205a881697b697fae3d04572157d3e8ebaa5f71054d68208c43a4b1322ba2dae1f513e35f3934182a188705a85abfd0e7239669f0a6a0fddc6ed1892abf86cae13848722978905e472cb31b43bf9a8eb520ff5bd5b0c592431e8eaa1856f8d97086946604ea71798b758a275375c43578e40d50675abfd476c605f7383fa4df21d7d92142e881424b39e1db17b5fb8e30ef5043b7d1872e60d015fa45dfe63a59583ede657143855c75b69ef9ad2403d33eea52d1a2ff4b973e183226d3044bc076ec4ec654c941e2d400b35384bcf4f54dee43384829e9d6966ef5a9a017889b703b9225e0afa897d56bf703f15459e2dd2f96ea9d5644aa97090f43eee2e293c136f962ca8854126aca9a8088b372220d2b5ac3d41aff870be921d782a4c81be6444f611d3b2b48bf2ccce3a2ffead5b2520b5b8ee12f7451284cf837dd84f5c1afc048dd97368b6095ff40a29a6c2d5c058c15f4a548fcbee8606e01e9c8c80c41867565d033423ef3ac320aa3ac370d7c0c783217ac8ed4a7a8adf2233dffea1f70a6101217c28f46dfb5be202072a18150eb6643585ec178fcb944358f1917894ebdf745df77f909d8cc224c82bec24c00dbd3e9953e0e25bf95c0eac5d07acb943d145fd7cf517fa8789e60e28f96620b9b2ddc54c6b2e3542cb20ba8b8aadcf6b6294300bc9d6af906e210fe80bb29994901049f4b7ac9d888037b87693295f1fb7bdfb7ac5a6afb2b202170a38b8a43d24f984493f00af5a9a03f91f275f334314d4166c395e4da48d7e09ce78414a34d2e1807d0f0a3170405c83a9da78f7ae9fc6d1e42ad428c82716bd5aaf9f363d81ed8d18713f76df11d430506f081d9eb20603f6d0854c30f8845742a652cf1c6ef4e99637f4f6b8891b8d00e741bc65b10451f54c3c49afe951a77dc8f0fb26907432c94fa1a9c795328e0df5f3355ea49c553a54070945823a180b2153e9b51048270ad5fc3969f2171a3998880c5332d4c71bc8829327b425d697d6f249c98012e7a3941ba790feb8e94af2e417d3930d7c1d48fe646e7d79e9105a6f885172b6d552cb329bb7afa19fb9a0e562feb6c9e6c44abffd32d8fdfb96cb317457680949cac750e2b243063f2004348f45605f805f61d008d07b0bbc47bebf869bee4197b9e5fac63e101db54cf3272e6b1eabcbb24598dd8e0ff6034ed61ec2691c0e716780446eb81718b76e7a883ff1770e6c24c399cc63270b7ea51dd544bd3903f0c1584dcd2b463cb4bf8792c8a76bfb454c1ebeeff1d09a11435e133b1cd9ff78470707e2631fc5652a861094c7ab146e8c5877de93fe9456a3583a0aa7d46699ddcd9004af07637c6aad4d184bf47038abad96f4b78b8f3ac02a3a622290e9fa847bcb49211095850e7e8ce4dc81da70e9107086cb5422aff52be094b9bf0d5866a701464ec372307c43e352f8c9ed4db01839bf533f05fe43b804b8cc7b40c7b097ff9a00997665dc5064f974b8c08ca406b6d73b7b42692359f64e9e06ba93e9bb82869a050c498bbe684c865a6586524d27017fc9be403a72d0f3c79821dda96b368a1b0daa8f8b7dcf55d1d0860429fda23ab136c94afbf4134e5d18aa5b0e34f1367c02261fe1a4c9ab1995c54a41278a36729f9cc1782c46c4f24fed434a5b8478c8965798457d26d53b68b2ba0f28285ce3f46fa61a2c9c1ba07fd8efa3d9213926aa704cb51006952891e591a9353f87fe301f07e385fee7160e068447c8782dedb637925d8b45fe87505b21a9124131fd51482af49d950a5af5d613c1841620dde13a8137d02c35e6174833b98db21ec32a3cca4889d51d0638628ee2c003004a1fc2f0b8b8f83bbf4d53062aec353101bec38f9c0f83c01463420209a7944137099ddb1a5893d1cdde512cc18113cb1c3a0fb52362ab17a745c73702c56696fbc7e40023493ccae8d2146042562ace5a85c00c2a51c21014d6582828250b948c266d6e8568cdd02f57f4c4d56b23e00b63b43c65260b6022491b8fc6254ac071f03db7c8fa4749a59978208724cc4e2061bf3368d3e49cab6fa1fad7bd257b58c349f50df760e9aa0cd02590fcbe5e39733a73a3c42f0383b0d9b48b5e7ae049fcda3bfe21aa180447344cad52df124882d586cb77a6a842c431b979a6da708fde7abbf30a52aeaa953795f1630cc878e7ab8564b80366e64644a6062e5f51973b348990bbbbec7364bb53abba9f0a9e4f80546a20dc03e276d81fd789c8b8c1b0ba7c5bf00de128c6672a15d7de91834c45318bb5d800c58f0d5d6471a4c14f1c7c18ade9bda27272b9c95c3673fe7d1c5b441b9ad4bb9d2920cbc611e6cdb9a376efdf76412f0d789bb32374c3b102918fe72bfd2b401c411c800d37430ff72d28b73c8afd3b9563772873ba272526e6a9cc6c8b9e2c71090ced306d01889fc2a50433575f7654af31d9e7fa4674a538a559414fee98f249003c86adbee5de8e50fe79c083a793e1c9c1d3d519835f86221cb554fe35e34ee6def8430afba2ab01b230780282c5a0d313c2f5eb3dc3bd008d7ebab492d3d1d2a93f27269383ace5855e3c51505ba75ad9046e6580d00089500ff02565994f83d87ab8ac8735cd747138cf4959159d54f1b4d3a03325cfd6fabbb79732abecacf7ddf6c54b111098aa4303b7db163d1e6cda2d9a10859431eaba259566d843a8e373caab394614099bba2f95bf630f792dde34606e0a5cb34baae823dd1ff9fd9551f5d91b891f34acc8ba54a1e71eba93d1afbf4c9b2b16f6f0b72f6491f5408a22c0e46398d6acc0d6bcea34985eeff6b1c6fe10ae23fa9c120df1aae04486a5035aeee90d1a160a058c6824bac6645b886f2d732423c98557790566075a18147573d532fe7da92af1facd14dfe0c3a08b4646f1ef949b0b3efb60a7809adeae929d677c383449cb2be4879247fef11c077d48476949c7d0ddde259973201abdbca69360e33cde39bbf05892c933468d613b7112edf1d42f49ea44e96163cffa42a278e123befbb9eab9408271a44cfc28dc10042713e973bfb24e8324c874b7007ede2f4fc00cdabd68d0a65fc214b4be5d7274b1f4423f1d60dbf2be1062b7b35fcab57a2f099c21248cc2606d128a456057f4b13ec0285e7dec0ef72c2f684d3b595b463c9b077c7c2199f06c46afaa215eec045f7a06ca9d82fd39f6ff8812ddd0647e48d98781f00e5987cb3597ae543f8297136794df6be7ae05b452f7054515bdf284d027d76214a49abef068cd19d299674811fa9dca0d1fb4caf3f4c3e51f58af67812676e0a6629f5bdc2c52cc912351cc1e5a81932e4221b31ad77cc6e2a800e38046721ca929cf297bcc6084f722553d8e4b75054f6813808652ee440e8b6e72ba820b8e730190fce946eec20840999e40878670b3be52f946dcb03d63d15b19dfecdb31fce85ad6268d66dde0adb42c8d47844464cfb4c11a0d65aa2c78ec71e7ffff8f8e55316ed6d1ce9a0002ae013b3b70c7d5492d4c7344353811572d1f6977d6348babf82560f6dcd62154e8c2440b7efd8b5b7c5cd85b34d06c561c085aec33b95ffbe7caf7505d18769732e76757a77d628f748badc861dd614d9265422dc4dd5e5fc603f6c7f82d20039478833f3682468527b3303d76c18a5783be15286b01b7714a15ccf51cdbbc98b1253b957e3c03a71c7f855b985ea57b2b65334f6414cc0b0ffbda1c4c901ec057a568cb02fae8a084d7657c2860d73edf6b8265b0631e2d7f4630d361a7b47c8d1257bcd290e2eb1568168d8be14c9fea5a4bc049b8b154f5ba779efc3a49bf26eef10ddc5e51aaa862039347084e2c95aafe835a21583a2309e1d329806315badf377fb15a1a363a1b943c9e9b0d2c9cd51fdeff2fdf36fa38cdf4408db922f116770d7470453a29ff39413580c630da4969ff79b629c0cd343f0b0722d4907a27ebd07fa636347ae96b42cd1ae2f88e7803fd97ac9705bfbcb0eac7247a652eda9819017cd21b76e00025299be1fa008ad38e3b83260444d2a20d095aa43b2aab37faced168f2a4b918036915c17f246161dd4b7e856fe2101c6bdcce328f68bd477bc6d6dc7dcb382b1ea5f5ff9da2f2d7ea9f2f3e091c9ee3853945a6ddd976a795e94792d9afc4036d07f21763ab3b1b928e0e42313e89b8ff3f2e6baff18cebdc2d122370162e65d7fc8e1bee66122fd27be0759b9b65372c45e062a278db8a2c395578605570b879b0fc130006f053e72a21467a33b0fabf19edb12e36dcdf77c35875b03c75b94cd924154f1bdcd1f3106f1ebe83e6578b850b9e2b53711fdaa3883fe21962c442c35ce9ea300114cba3f02b1702c76c424195403e1e6f9eb19c8a990eec2b158e65a4f4008c15fe5a4adc9497db392c30434255df4e25b8c1f5ae2501f943f9a863033302dff94ecba74d78ab524d1cec2d98bd5cf6fd7f767fd100fd16f2f16d2b11f5febcb5a068859f666eb5626665579134e10f42b0e0ea73d0f4ff0ea0884676da560dedc5d999b97b05d1acfab1d8cfac88d280e7849d2dcdc5b4971614a5467b0c93d8ec6885c9f5e67a05f2526ec9a7061b61ec04781facb52a664f2dde64b88526ba61ebff61cdc8b5006b85fb28beda959d2763d281a5bf48116989452eebaec15bc19cdcca086d0b64953f50b3cf4d84c3eab2955b561a5cee93d4e29d6caa4244e967e0a939834c72c8de53b4d6025e77526423aff6b7585cdabc0742fbd6f30bd22b53083a949a511dde0f22ba8a810a8a051aabded20ae8173c40568eabb3c13be27feed5387e0c5b5bc40e101f2b35b0a605e54b7c58754c55ce0963cba3c09cd4bd56a225f24b9aa31ad8337036c0771dba8f88a0265a18d2efc09e6048dba0483301ad48db715f6251bf2a022a5e214d57c365d0bcc4771d8c32b222743f11c9bea417d3676cb2e73adda07c55e0bf64e38aeb6752649110eaa1d33d7475291a6f5dd01a3b7991272c92ba57799c7be0363abdc5e02998b0ea724d6a11f78c44c91f6b1e98a697f2f86d0629bca5d867a71bd0ce73c285c21b122052042757d9b52866172c12558f4c3f25ab75f1a4415ed6c5c71713898bcce2b0b89820d78465934e1b7819f8805ed3d217c572958ed5780cda630afe6287ed7ae1455546771611cde116262fcf42bd040b11a9f2acace0c52501c1c3a2f05a6970476d91de87352b95852d71962d91292b303dd2f5985697d168cf4c939b1d6fa93ceaff4b8dfb1a5cea8c30702f6451d8cb1dc9557ac6e939021409f5abb8599cad33af313ac3d037be9783a98f0c0d281a1282139e5530c9a305588ba9d2e1fa0694fd605249c982ed2075e310dd132aca2525ad9a6e70817e2bba0624c4d15be367ccceb96fc7b6c9dd191c29900c7eaddbd3305cc76f730956974686594d12b42b5d57b41948fbb0d89554cd42a58159aee36737e329e72eeb8a7ea1ff2a733c6dd0cbdfc7a5a381844612462fc45d8181356c166cd79cb1a62b0b5b93ead7ab5fca81034114b6848c75cffc671c02298d7093e1d9ae72f3b09ebcc819fa0b517d2c29a7794253a9041007b6ad59ab5b69e4dc770d76a5519b4576aefc0f548fabe16f66e3abc9e5bad8652671d2527a1ee393ae6fefc10ed56ad6599a3c818e26385abb4fe85f7772f8930ab51c514b7bdc77dbe35c25c93221a440ded93de58cedc6167062d76d7f08b937102643acf06b614d123678855319e76a46a603bbcedc57fdc87b2290f3fd7c01731464dc1f953ba899ed9ddd3249a13c9355f8a9b9728f2719ca04563b4c10408d26e22f5533f5444aad051613f393ecee7aaee05ca07ba59d1f4c16791c4b2dd84e925d3b739417de7658b6184f60cc1d9cb207178a1553b831178a7d4d4dc9ec611ab34b20017a99efca3bc6f5f74f76b986f82723b855874f26e5e5e78c4222ad2ae847c51367bf8be431d3b8f78bdece0df61bd22f8643718580aeff73e5c776f851db7917f3688e18bf705c29e41e4ecaef41959ad4334a57234b8ab0c306a2063b8472464648830808e43781a52e9f474a6ef66939e3f7cf694b88170c5bcd97af64ac63cf7383c6005a1cb05fffac868e61117a59925f04c7247b8d736a738e7c955d9f5f1af73fce8ad52197a4b825a64f2fdcceb79b4a8ea02c42a9a7068573bb07d17296b562ca63f612bcecbc7be0685fea56cbc588686eca8e40b80260d2b6f1edcb8eabba273e9c8ca54aa058fe071caf119677054e16bf05b97201c47d074315f43380f4dbba638bef08606c3bcb35bde6225eba0844dd9fbf6490a180981fdbbdf519bbe1134cb1a838a6a9df95b58d5e56d9cf9221706b510444d4588943f2b45e5dc35cc73a5846d10aa351329f10f3b73873efa2dced455fe5a04b42e368598285fb5ba63fc0ea79f9cac49159b628a9c2d73b5a237e90679cc7c093a0bf22345f114c5559bb1bf9a68f44be95ede54ecf91c5e5f70db5aed0b7e7f31332a549fc0fd583b8d2cabd822604abe56341086f7f1569a908f42f43c230349d772574b1dd257656c545de394a465aa18921e39fe82aed1c85194aee5f92a6be7abac4102136cfbb9f6e3d4d8e02d4eead942467f7ed5a03c2fd2f694a113795e30357d7155e737149251af759016c2838b226f5fa4adc2064d49acd364fb2d6b5a16afda3985a3e4a5aaacd93a89277ec92c807e69981e475bb8f1844fd42a3be08d06b92a05ac2977a41e16523ec2061f75faba698dc6a935dad058f2b9b4ea385b76e93e2dc28a24e1c809e35d797d1a0efd9de3d639d4fef082d83e5821a5535bad91c9cc0259bace71d4f47126204de75486921937b323209ab81ca7839e8f911fb946a78d25a831be03afcdd092074400d00541c410d89bee3c8fb7ab6bbbd5b56c0d0862f4fcc223e5a2c0e7e56e5cf756a0fca81ea5c9097b9f295152cc62329a471b4d5cd4f3f08be638b87decd1c189f2abf1ee4b9a3212bd5ffbb9ff84a2ec77a360f1b85ba8ba83204e12ad66338e26b75e61b6468c981b6676fc8b7a6e25d5ccd9eea1ee00df2246eb968ae4c946020f8699f0d0f09a36f1568f5b29b4553e3623f2b4662e4ab44eeb9d128fdee6483a6e471d7ad680abf3bdfa355f6c81d1b67d6b8f37d14dd6359c487c37f440013a72d9e31145edffc820ca02533f6b058ac89f827a289aab16996be65b99ec80f634b514ca85478371d2553f65bcb014e0c9f25fcb9e3697ac0b0883e462b9579ef93b90f3abb5d4713296243038296a2073a0ee5ff3898b8b24009e0f4100805dd0a15475ac7679aaf3675e1ab176f39ec777dbac50f9845309f0f1356bac8d6e6f66f93d58b07eb52d08f3c9b9be11de7401965b243275df7722e3e33383016a70cb5eb0119589a3a29bffbd0c70062d3f38fd3c265ee26fb8ad6b2346f04da6f2bd827c94d6dff43c57da2fc516c1d73089119646507f3d572a02101f5c43ac8ee48eb54a1b62fd16606ac1bb652c1763445379393c6685cd96e10ba9d0cdf96be3d1b0c55fd654d51daf7a36d1dfa80be594907ce61588a1896ee3fe2a70f9f3beadcf003e4166b25635ced15b8e8cc5c12e1e60e7c6e06afb61e3e10fdb4be6ef293f1f852c07e7a94eeb4ef0f3e8214a57d0dbd08cd79b756bd88b80f3e17f722048c858786d67327ec6f368c27733d88ffd25df52ef50f41e39d10fd56d52c8fd9e2c8c6501d4431625f91f1b9095a14858b33f3b45d8f97ef81099f98a6c38d31144c04a6606d2d74625a24bca489a8af26ef4e44054c5cdec74eb22d6e1dd8f67cbb96f465a9aa50d960dc000245d89c064419cdff474e4d49155baeedb926f33396c60b56e6ea041289bd53473b861ac942725307a68de63ae2160d0f3e7697febfc1cabb882bee229055170945795388d768f148bc153e4b8b92750857cc6de47f7bb1abb490ed2330b58c6c8d707b139a49c7521a61792738860ead70151194223e64fbc6cbdef2bf7850071ea62479463c85b7142c9c026a9fa293ce5b04f1054f9fa046e58630d8502cea56dbb486e98a229d80045cc40b3a52f0264ed6ae1271e759601813a449835a6737aa6b892a3678f839b9cd400eb9c1c52a1b7369088eaacee8c5256ef2da10b3eb9eb582ef96c6398f32ae5896a2bed881c7e548193424ed6904f59c95cc9830eaa4e0c47ef97f507b686d276aefdcf3dff9366245a3494523f3562822533171f46ad33db0185dd2c90986258e07eb940e0fe308e6169488d383b5f569b22e01c98c0626473c0e70520ecfc1a2eb436f162a6c3c31afa1485d1af92bcca248c2e934ab929e63c94452fb8f4603b9957df74e37a406c6f656b79bc636666218fca0318cb63b2eeeff26bbf026c27f95a32c18a7c0fcae43b8b32ff5218ff271e90626731b8ae3f5b8d761e6146e931b0fcd21c51c7d3a91a671b2e18d57007f50d482941cee4939204c8337c07e0ab5b245f03344b8e411a8100e53431a755ee90fee5c255c5411d14947bd747f7faafc6f214437eb157d4bc2301e4e271846c1c43347b648ca05d4cfb051e0d4029551d5a77a93b1b19139b461894e541f5daaaa73c2d81e8c69093168eb21aef29fb87d239346f7072b06b58f2358fb1c4d818d6c0a7d237c548a712d7c2b990d0a3fa3925d2c38925932e3470e10d5e9addfe96dcf137a11ebd3606750fc4999d029b34918c909c3645646f995d9b0c47ee07fe64c587c86f4b192d074209f8cd7083b9053ac3c038cad904949b55d8c6ccf55bbcba360233ee02868655dc0db00dcd5b883c32bb82e9c2f835ac765b85134c5f97759cce9c7efb8ee2bd1e8eb16a08c3351d9ec75601bc68056dea4a36ae825da871f40f23c99339b40ac02bb8f402d36eeba23531c8f55038313320a0b487febe8066eed7c22aeaa6945b68843b1fcbfc8273e3e378c4c9044898931aa8f2c0c322c1dc0112430f4d53b48d86cb0169651a20e6e61288b9c45d60edfa07f04cbc749eb51013172ecfed071d36a7843ea1641b3899e8cffb1cb6c9d3889cb33c8ca6c07c14290571c3561f6672dbc12229c5feebc575764f995459738c46c51982149adf38fa3bc09908610045d53d18e909e3109d8e257bda2186d0b3d7a8f7275bcf8cd6aa05c3b3ebf7a108fd58f0364e365f0624ea47d51de497941c55198145808dca52fbc8f54c5b80ac77449fd6c3018a1dfb23d22837eaa91a3dfd4057a61add86ee855fe2bb6b1caff7d66d18ae85dfdec5475338e2eda506780b293c7bf2667bf64272211960a1922f299609da4c7b9c01d537c88c4a786b46b3927e9e72b32fc4a51d923115ffe31576d2e2dd55cfcab77eb0447624a5aad6a998f1b3ebdec58c043491c9dce689c08efa5fcde22743368456b1526cbecb8fb3e4435e8f36539a3645051acaffa84f26e1177369e587c46a0b63fe3d9380506a2d9bac7227bbcecd915fd2fb115830fabf3a360de046e50160f256f0053a070b3cf242ce21fe34ed1a8fd78b848b3e960880025b983ae3018fb81f952b92d4e29b7b8dd77ed2d91e664e5e680810cb5859e742504cbe8c94811d40e376ef0ce49774c1082318b819065fcb337a6bdc42aebe98c383a71250d5741a41ee738750e308f788edb1e1401f2a5b418699dcc8dbc7c71a039b3c538e0a0e7ec1115a7f0c33481da10b91ddd42d0712405b93ae99c62e87cc4aa0a489a130e0aaa31a50ecd4d01d565f8b83da00cfbfc99b620c66e7a4e90bf36c922bcb35e3a326a66658dcacf60d8ccaaf113d1bf30bdf8196d9510b35ab8e2a31ac50ef9b896b41350d1f98a02ed8639c2cd6615375d0c0436e451595dc98a82723e5f688eeca5de9179b989843503fd84da0114fcb286dbc4ccca5c57d9a1b8768fee69f400464a324c40140970118869c8f85f96f86664b31708d2653087c3edb1c37148a0984dbb14c47a41ff722bc735d8fc98741cc2e2bf5b774a99f7392363f4cefea6eca66d9b054fc4e604b9c263554d0c2b28499ad1a29c8b9e91993d6a2884c84ba8bc4de7d6081af4298e680ae15eea24bc68456d46f8f98b7a84f4dbaa3ea39ba23028486c1e04781e3a16dfa9f99aa88a18be6113d7c8d29b50b2c2697702e40f7acf147c31214e631c6dea38cd163fa33fbe0d6dc9bd0d0db79f2999676f39681c444bda2a9d8e1fe52cb693e465710a71058c7ef6d1ce320846f8a88887f1392032a04b90c4d025caf0bfd442b5552ace188f8ee4ca27ccc3a78a5277c77561ad174856c1597972cda10fd754a835b99cd60eb7ee91df1d7a842424cb535289c8ea58ab78a19a8a69995f14512d42f847ea579483ca40f5bb1bcd73751a4761a0b3b98b6fda3d378a5a85f5a669d5bd838d50ed0d498921b5335d0e7a8ba44c62ecfcd4442988d2256c37b5831e62efb0105c660eb5cf8e45790841b2481f49f4324d5fc432e75de7961ab724adb72bad771ccc21d20070db150a9d900af129d5d0c7d941ef7f352f41290eb39d0125ee24dde7c740cf6a186787fb6ee1cabd4a1fe1444b7ad8ee0e26948ab618e8a2b0e0a92d5dede325660ad85d28e5afc5f141808c9ed5ba829dd21d1756021784ca0b83690e53ce043f72e2e39106d2f207bd7a28830ecfc766c705310689959f4b62b323eae5e96bc77ffacaf02d21fe81a778ac1fde76746f9cace6777172246f568be3de6687f31db6561af4f29053e300da08be74d944d5658d85b8487f05ae5cd513d19f23a8585acbb50cf2605a4035d2283d32564b3766aec1e8c6aca0efbed8eb1688ab35e54d8b6e765825ba9642cd18a235d05cf6b8248005e18a60be8c9d205171dc326b0c423b1ec4d69b90dc0d75387f21c39600a54c58c00de0cfd00d911ea53a43812c849476b053c1c35018f0bca24660ae1318cf8920aa7551f325923860c2dc37660a54ed2c0cff071047a3c1579b190d17781d4dbed1a41a69cc0055a8ee0bbb1ec2dd2038fe8ee6f1a2b86b712eb4e4fff8ea21f3003a6e1ebf9184a234cab6e73da88a66697b24baa6cc4ead258541e7faf6f17dcb545cb3e6e76933b152cf32113748cae82f4a9b08a6bf10b5473d03b3ad639330713ae212d56077c1fc9ca7296a0766870b6050b7b523c2cc6471f7b05309c131b905a40c5f4c870e1e4cf93b5a0d6700a5a3d63362ac673d4ccd119a89c5e638b3fa24f87002c2ade104a09b15f3ca725baf4b82e21beaaabc1081e7a6a0050acf73d5aab312a543da9f9fd7318601f39951e3a9dcb26d27616817332d6585681d4fc23521c7da465ccbca9068cc31ce45e08f506395046e1cd21072d3629156ec2321b56066f38c5268380a20a36d0fa624198876ef406bf0d4d7527ee95aa41c2c1a5109cf1c1b4177da3c32a3df9bee4e78ae79832c9d8b0388ce3d3fdf1e22400742b515d618f861b8fac663ebfb7ee7c28b186e7ddd0ca566d07857b632b6ca15224c2c7f3c33bf6e96b50e7589ea5c2799c5f5821748cf2436d62ca0d75e1fd34368b7bc14d8ff287c0dc1282a6c5624edf355f2dec64afa2066ea41e192a410e11ba3b0f43ce0868b8b61c87cf7212058a911f5d64107e7f4aa048f99dbcb4d4040e055443f90c6d45b7ca47635c6b054ebc9e1f6413bf08f1d6a50680dfc3150219b8b917b8e9e1d43903b75bc7f1316dc660973c0601ca772d69dfc9271633d200cee1cf80ed3d66162bad208a96411d48ae0950594e779079a156a3a846aa0cb7eed30493fcd0680d4d980c756f1ff24a74752a6df9e83c8cf34cccc28dd27db40a04bc1cb673d830a3abdbaa243985ed68937e1b05837889814fa55ca75b8e13559d81dc35fe85f4685280aeccb6a003b994a47f3b1696431fdbb38c2df83255cc9d6d120ecfa1da8122b9731af03c94107baf6a36ca29ec1e25dd1dbff656504cd401f7a4ff1c022c548b7226a30cb90b14c0f0b8c408723ca99fbece37f3bd67696deec0c5883fc30e30ca4a9fda6f85ddf08786042ed207108aa09cbbc2a3d18e2800bd38db2ce3d7651d2790625d21b7cd59554286f989f3b6c500d03c0b11b17e4497e65833ed7f3e908f42e3881a849cd6479eefed562c0b03afd425ca51469ff5550e61bb35a0ccab49f4cdcb7ad0b94aece764538c1613dcf951999b022235afd64a5999a33258a34144e5c999e87f67a6a7240aa1baa3791105a981b811c517f884c48033257f270cfa7d2a2b2adc6375cb5f77485a409d4a864f1ce95e1e4587d369942a569f4a3323bfc978ce134a3198703861a7be71c4840bc8c950e2d69eb4959c288e3d6b5181ed36f33ba80437195eb0445be529900585d36163865e929d9e414259903a1983fa6c5196ce1b61ab255c16739d73608b799987649c6693f85a789a2a45bbc84a3b57be741dbf4924f78148edd91ce8363b21a66ff22938a6ef0776870112a3a764ff238cfa3e8aa38347b27f7f9bb5454e478c911f1491bac906d035bb579b839a2959259aa334799fc580aed535e0a8859df86d77b9f98a2e7075b57ecd1d4fdc51ece36562014658caf76ea4016f7806b292eaac883d30ee4880a62c7e201854a162c1ab8d76956ce9b7effc029ce26533859d39f42616aebac8755240558fa2704f52e42f6d07d74fc59c98159a393a47cb7a8cca2709d13695c188a8c259bf4ca65e8f54288286e14f65666e0a97630f29c3f1e7e9ee8094bd2185ca28f52f7ca47d7f2f051327d3ccc17e9b287e3fa2f55afaf139ae3445534298085f6e33b23c5bc145123406e3533a496918e183b3988756543171c39daba59f96c1daa165a3dbfb9cb64ad89e32208680cc2080d9c7a49dca0924e641fcdaa8fcdb6cfa1c5ac668444892741dc0f0dcabaad1f1789c0996c6e49cf9cd474daa31a5d05b6a946b1333d07e223e84a828308cd07a94efb2c7270347e8698ad8375b1dd24f69d048f70e867b53bed342d1cb8677e683fcbe5e1cd24ccd8b42f6637c2d29ac92abee64aa94e1cd5b497bf190c5e0ea6a39c74f74cebb94ee2d910d76c03019b95681e8c0d52875b411822c92a8c746447d6b5512ea6aed94741eddb560122e39d3e442760f78fd20d2554c64fea67396c133b8717ae9778d04c34584f6fb34663be910c58bf7967d450be19e6fb9770a71b56ce2b8e363a2c39a21efa364ae931af6f8bdd79354f0c56af4e4b9e6e7fc757a09253c7d5c5ffc235d8e091efcffb268993ca2e415686fa0f52ffd11502001393d6241d81e07ebe04786b12d644aab296362840e33a8a0f74a83a2050135d3654dbf8d453ebbcc11aaf2b2c60d22d54333f34d848e2c02e2140078e10ef0d605875a3a9079292c8a2fa95e4d2a43ea6e7fd80e67c72d3e48f459b8b497b03df8c7b90ab59848e58ec8abf26263d9c95e81272e989b59ee39704d502aaea20df0eaccc011b2b5e1e5b1ca26d9a66af7844b84dab1ee22e23d76518c0b781726218f21d659bbcf86a89c65bd3c41b6cc5014762d1263fe5d75bd284c440b31d0d66641a3a3a7260dc1ea784e6bb332f090646b17dbd7f97a3280ca77ea159dba89d49ca6f61c7650b61da6a4119e042f82598f283f6e145c1d82238c3df85803d0c92da473c0e802098d8a2ab7a8a50c7f6ca729bc020457a79b74eef4ef714e572022dc7044470e84beb53435397322362e445375072897229c772c998a57667143465364690a99c0277b7a320eaf5886038d57e8313132f0742db50711aee2ab229c291901b62713accab4dd61a93e6004b1c3c9298e3e8aa16256fa1dc10b595d0e58cc1a85c22130a74460c18e464111d528f6d0256385f507f6c1c631cb03ef249b9b61a194027bde4a7c4620a61e9b1597e3e028a2f935b892b3c2da7b42d4005520fea761bb4a55da0d8f2eb7bfc622d2e1d5ccb12fa3f9bc4df6bfb6a4c9fe4fed8644151b8087e93a40c6ce341b87da8d025c92e3d3d583f11144ecf095c1fab6123664e19a62e8bd8b08b5bd77876b080ffa8efa1ca3288c9cc1a37e9d277264a9a4d49ac8fbcb229cc563798e1890431f8b7e053c5e452ba74c362fdd45dcdbadd7bca48ff6aa274350f9c004f01e4545b6a778fa0d5f0af160009200f8ca90a429a506c56724480580f5d57d298bbb61b85682ff5c04ad1a5b7c3e03ba2b3adef8d7e4335fd2a8addcf5c553d3a854118943b9a5e01f6c99bc949afd15af1ec2e6709f86995261e6933948b3b650cafee29b9eb45a2a4d4b36905ba97693e05c346d1d582ece2fd59243ad01fb773ca67517e9396426a79122fb23a42eb7a4c0f9c82877409a34a05b876f9c67bae5e125897f5b679d992ddaad788410ff7800d1dd1fb63d7b1b0aa82ded2158c443d43ec175fce886dca97baf54bf5e54f1684398a1cf0c7c7bcd73d284433526ef9c9f3ee88f8ecfbcae49d41666dac8c562b028832eeb6ed8e8183fdba5459b189afd580a1e838a2d2709d28bb1220d9ac673a76546992b77b15b3ef8bcdcf1250ef975261536d6228b4cfbf8ee16669079ff4e6cd7d70ed251bc4de656a22d93c9216d2a0734bd1e299fd5ceb59570bcb68870e16d5dd1ce00e36bb281d531f68c5f42ea378faf9b774bfeb3a1084cfcfe7de52fea8e191cbfe36074db8ce0063f3807cba285d55bfe669236403bfcbe8fd83387280f1632c685f48d54f90691b84908f5f59f8e54908545078d090e63b99dc35ed25cff329287c9079434c58e64d54de03ff28fa751ab4f7dc68c161426c774e85db523a3c849d65236e5af5eca90ef92dd9bda0011dcecd151088fa540294757339c110b3e4b9bcfaca904ae997189c85bd2858b3c8616e51758a84326c846e0a3c2b8a804e2c935c4ce581db1d3101faa9e1d4455e8d50e235cbf5f6b513256244cb7a9a5b43eda8832de2ef1ddd2526a3ae8a749eda1402cc6df0919041da45b79fb794cf08b5a094b9e84f2d06148f696bb192b671da94958b09bccafd820dadb948dc5417cdf75102ea7e0bf38e5409744ac462a11db06ee42ef1db56a290ca45e1922f54ffcc620bd381b6d1e76f8fe2420d3d9693eee56e19053d25746f69fd3946c92157502dd193924a9f894bf190e30152c06f1632faf0e4db3b305a218ced8b0e466f7f23739811f459dc03b6fa519791030ebc1408fda258a0a12d65119c46eeabf1a9edb7e7d5482864a3bf16d73bcfcc966381b4a212c86bca0938b40d00b7a5a5a4165b5d398971d6136861d76192e04d0a8e02937b96054a28f74a2824004d7fe40b703f7e1f8d7907a1a676bf47ab575cae243448c03865741ecf61931892d39618687b6bc54d3c8e0190d60b47448e9ba0a144f2d0fba3abeee436f4ecc293c84b29a5e61e67bddcb230bf2db31ccbb57a18d3ece9e090fe1d44ad44c23efa46cc86b50994a7ea549a4a0312a55758d9d6011e444b25254a3e457ae815c75f73adfcdb54b89399950866f67b95e3d035278aeb0621071eee00cb12e06bf1fe182604a5fb87af9572a21dc696c199e26b0bd6a4e046e3a735f630e330984c9a521fefe154d482646b8d873a0022ee3e0619a3b0b9a9956618c7eb3eaed6f355cb1d337a433007c706b5bd9561e77d592f6175fd7a0466fccde393660661a341d2ca22b94bfcaeac5d87d6365eab1d3d0a22d46886d4a5a644a55acec12f4eb6da936a43913925e3aadbf180754f35b5cd9f047693ab320b6779b9b66e7b45f0d0c6156c87cb5f2094b2a24936644451b9ca2549cf8e322e08a23745a46eca82004d93ce6618002c3e59091eb403ce56ac21039d5580bb2b62d093bb0bff0b5a52eef24654c52f2fce9d801acc7a5540217a0c74d400d08eab4077701d12d69f332e5e6ed0c3af3147b83dfa72b5df2fa103b8160f72a2cc4548d1160ff4098c96798ee4d7e99349aa3e01b98c7009a88ab22ff7b4573a5acdb73e3ff993a33f82e3fe07d6fc6157650ee0a15cb66048b81432cd1117a66d02cd2f085f1bf121d8f2dda9e928da8000fd37a22ccedbb8bf927d66d1b0da3287bab74b660cff309644aed518c7814599bb00797893dcb90b8921de163801c55314682d441b80716f606755b64a545985764823eb36de76f8215a96567287ef9d57f601b4f69727eb6c8b619a679fae2df7360a3845d2b6a266828e1d9aaf8ff0d8e856a49a644d2d7e1513e49a3464fe4214b70bbebc124aa7e948ff13412356266b631ae7951cf533a8cc8cb4d38b913a82b860841d924e6224ca0108808abcf133235d7d898b4246864b59624f9723a1fcd164565310e655e3b5144c87f07249bee88e51612244efecb1f16b6c35998adcecd4cbd8bf2e5737cdd5931e4d6624f36a10ba9cf8e2b8cd8ec4d8f7210509db507ebb0894bb62e61b38f80b95df7fa0767efe3880f9588cae0abaeaace4a91a7cf0b83b73b3e5875b68aa707d7adedab8efd89967e541c707b238a4f8e91cb342b2942a681f66a13b45a6919d01c10b961c877ab9fc252b39ba0b7cc6fec7fe791614b9deed10913963674511a13639c4eff17c7db7bed515bc9b477cb3f7a7f64ab98c7bf2e4d72a15332890dd23b5627212bbb220d013d5cac7300e155e785b70576279ddb86f763313fc2e42edc303a09f63f70130e5c31f9c94f8634143ba047c3dae7fb3c94c78e69256e37de3ad5fe3ca0ff254fdf6bc657173faa8d11fab3fd890c1bbb41aada379ff4977e6006a59d0f38f7e4ce4ae4954914c2972387eff27f861eacc0ae44e680e612390a66010d322003af75cebef4f2eeefbfc5532cbacf0cedccf06ef3ddcd4643ff5024ba088cc8d9d125c5ba4c391f55c2429931869f84a6a12a8c6a5ef921627b30dd433c01037f5dd958b23c049474c50a85881a575b7e7727d85dcb555b22db3018631467337215329051344fcdb058801ea36ca3fd0c16fa6416c7ce46bd8419bf1520c7268c1fea881d2311f195f9fbb81a173316514ce3c36ca30bb2ae030d239d6f841c1fdf47a63591118312843e8f1951a76bf83ea07004ab3c95852aa98a0a8ae5c17335ac3a390d4c9b5b81cdf5a7a1b4bc753992ecd4f6522bacf29ec6e895d7fd8bc889aefcf56bd41722b49aa3dceb80acf1afa94c80c25c05988de22ed29161492357ed970cbea2df1b14b6b1edc0e747bd8201b7b30913ce29f058cccce327dab25356613a15590ad4888c184caf10c203510e7e8515c2bdadb258a48dd8ca337195f2cdbdd61c461a6cee004bb88fbc4ec35f89e145e5c39b013a16d1c4688c6a9dba465bc78771d822dcb5066d11cf74a4e7ab914acf81606bb5c05ab6c8a341e55b06d1a4d62bc46e3a624df5be541b313052b5992796580ec8820880515885d19867265483385d0a42e26770127b8f1761c68924529f66017799ddd6cd52d50eb69e7e7d2a20eae9ca428a3120f2c5702f5a98573730d46f1c91836ba71439fa1d072e4697266232fbe6d24775eca5cd58beff1e001926173c0e16528f6aa723cb527b8b146306017cc83c3f17dce5e75632064af4c4f1914f1c3209b0cf5a1a4476c4e7845da8fa4bc2618955aa0796a7fc00b20625b9bbd907807371e144f2cb8e1d8c18223acb900759a2ec50a3205711aca5830b33224debebfb7fbf2ac0d0b4db3b862367016bbba195d77e1aed099d8db89143373616de0c3cc77c615e9091136177628e8a7285e218d868817f4b63a2c0df275dc5404c172e155d5e4a56661748abb06274801310f7be7d2201d2ee388694d73a783810da0be45e9a474a1dcac0694bb8eabd8a8e131e8db5d10929c2494f3f48af84a4c49c1afa17087ad753ac013318e4e6f01a79c848f1b9801ddb49c7332a076a2c0564bd2354fe63c2ad5e04eacb311c278ee134f97dac44b03999021bc249a4ae6646bb03dfa7ce6d4560282f1de35fa14a740fa4a70473c74d1cf179c873055ab1320ec6181d0897d67e7ab08e950c31c9d8193da106d28995bbef03f12c7fa170ab65d2819c44df0d0ed3edc045a1b74a517f17a04561f9fe8af8187b04ce3bc25c619f20fb923d1a93a4eda3a8166a1247ba394d20b51e2d1587091fb50977f700005736012aa73eef965d2a62dfc105306e34fe5c64ca52e629953f8364ef997f521cc4ff1c9432e19027edac95d7b080224bbc9f152d730d3d1601a6fd35f2867a91d031f71a8298b6c41fcb198b6ea6d629c91e1e0cfc36fac04e31367c970c5e157f5a83aae62809cd02f4449515a35ee500dbff1b364a909bff00e17f3eb37cbf50f68b988bc244412adf0d20cc84861c48faba74e1d7bd8fdc90ebf18ce38e87c1a6ea418529c7817583efcc5562412af13ae846357fe20b4d414fd057a4249b2f62a433db8b6ee4e629529f367935656fa9b5bbc3fc78906a64db9a69f7e662b9b1f426abb025b41766dc20adc8a51def8461d07f2c1051f4d650af2224a43acb1b7df52a7da527afec5859a2d169a5c2b7031d6ba31093a797f46a2473f72c501e69b853dfbb817efbad8c52af371b1b58052cced33e44b60c68ffa98ab01a286088e5aa228384055aac39a1dd386468dba0241156c352cf02e2b6088b650106da6d4c2219b1e5020545f8407d5c56836a311625cca7316d22709987cc850b5368bdc9cda1f6fab3ad5fba6f74607c0e85c09694bf116c43e1d1c01c82426949157b4864a5e812d63848119d36f4110ef4f299476c390dab46e2796b6b02eb26ad942154904c4b44f75b4ee4240a6d9aae4afc8bb9a26e4b4bd47bbd9a75ea9ef090ebaa05298b0886fcf8844be4b128a6ae37ef75b9df6bbfbc5874914f1763642b784b210ce5a3ac12ec176c9064b2d439c450220bac74862eef1c22ae5f01b4bb9a75223d5a4f7c21d0e9bb1c0372e146ac6cc5c7e54a10f0f343d6e42544f9c0ba2e2a4af5ee6773ea0fcdb9c88ff4dabba9f02c825ca9af1562cd8b78faa8ac20c64eea41ad85a541885a81a54a74a1fb518fbca10290d193d0167b1f245998d6c14a26c6c66a7a1754554dde4734950d6a578016afa1c5a6e64b0132a91d0c6b62cfe0b2db2288ea25810c29da7ea2243a5e1ab0d3a1b8741b7e82f9574ea47d920e9075c7e94c8a314735b76c8722f7e290933479d2193cae0528ad5f2cb41999ba0929a452a93a01e94445d452ad375e98682fd7db4f84f38d9f8dea01ffc903f7387631593e390a11ceb26a893b438469cc5dff5df2efc163edd8acb732df95c8aceb123791b8960537471cc24884b59360cfc0805939cc5c3467d8a091fb2a9eebda3900b2a412c652148c4fc190b7c7e612abde10ca00bf81d81a5c85024f3b71b78365ce11c93b1024ab1539b6298bc16e58162587de1612d7ec74b17d88eb20ca376605b67a6765ed87bdba58c9adf48adc63069e5ce454a6c5d3787d111d84762f60efceacf525b2a1ef7db1e92eec4ce257a9daebf232b4089f7d26eaaa698f8ce6866089019cf46e42ee905a2b8861b47fab1a8e0e2bff71dc96ab87de4c6b4e0c0ba7e1de34b7169b3e051b5bd8fc075e7a35ad1159e3e80d765fdb6f0671bb7c00156fdf4b317239a393e8e43e86cbf96c40a6140545b9a78181fa7170a61a573785a7eb8d69f998a882ff953cb6b2ebcfbde2c8165dfdfb7149fe1fc5f9743499685c3dfb5fcdcbbfc67936eb21aa9414d776c6a8970f4e53ae5e80da747a169ac287ef5b497cfeaef2d24266d172ce60c58f12f03ad755e3b3eebea0c6d15ce92eebb5898ca5385131f4a0b26e9a785bb6ba278a37faba36096d14de6e3bf59891bda6488b27824efed62559e257243b38f80735e3b75827ec6660de4c6daa2cb0e2992e5a4bbcd9d5d0ed31324ebee41314751db91a054d053b9a66e8dced92f3904854cde148a642d3eb5195d6a443d548a6fac7158fcdc3fd3b0c9156bf10e86394f160603a53ffb157c39f50f2bd61dd7a5090557e5172de18bb0347a226b41901965ccb307ab0e21ac5e19a7eb3a672e47af58a452fdba737006d5036fd172eb762bb8a446f6ea1dba9a1cf53837edfbcaa9f95cfb05ea2e351b7ff12bf6637e6c475d5869702cd195a1d1dbd036af1abbdcc791131144631bbd714c13756c57a2e2193cc0ef739f6f67ca68789e4a60335987a5ca446908209322f67626c7802d0a5a0c557086318a52d37886645c2dc093fcfb945937069ff7480a862c66bb68f5790cc61d89c068c63b327a9588fccb09ad6d067dd48a8f864ee6a35b58329768a539f6633622d11537a32f3d06bf86c5ea38111836fc619d16b415e324d2d129415dba9947972fa0588ad10c07105d384ce4aac86068e38844096cfcc5d0edb1a60897794ac08b51d7b6236355b95575b87f0c3c0db5c456cc8040492404a2241228f401424761d01f041d21d00d00dd86df2af85463aabaafe6cf167c4aac4ad80a6e67af65054a0b9edddb3bcf1eab023bc8255b6d3775f58cd51362c7c67d21ee94c023a6a1a9b398500edf2a64e8b80042191b953bd502338161a08e283a021000a5654de6c34e05b23c09eed0cc506da2af22b3ff43944e78dafa41adee71772a5a167092e693d1df0f65261c385a76e34e654bf7d9f2395c1964354d8fe9a3eaf9750fa1bafd2f382fd71960d8327a91fd81c0d4121637b482503519a945021759d5fe8708af584315908704cabdcef1c99daa22649d6a70dd9bd9a863c0b021b0195d7248df0779f4b141c5d867e4a3699bd6925c44ac53b769b2eb750a38ef992e476379ba2adf3a250f0e3105b585d23af5cace68e1a5042031c38692ce926386ba920a1f972a67d2aa78ea7b818f4bb1bc35d052357831db0d7a3449bee47797e5db798b870a97e2f98481fc2441dcc6a5be8906b144bc2b2c43d72ef9899b1b22f7702b1c521cdbb02a9314c084e2cac3b41f524547b6e0101c6ea78115c6903aea42d80448a64ff951ca574d23776718d6ff1d52a1a7310fc58b9e4abacaa0ca983da400bd922681b1e2f4b826d98c93128e051c521c5a9585c82377e353fd36f30f292b6c63614dc5894f94b457fadbe88531a8a56c97353d1fe68d98f215368f31f7c72b562640121425666a88bacc4f74e40df7300a9a9d6811e0ea3df682a22aba109f50e9b8c7ad8eb8694b76e4481bca1ebafb02d76ec1e27fa010e7e1036f88e13ad6d68684342dde15a136da7fb31531a60546de0a466956b7a20b304284f280b756363f82d29bbd4e73ba003952fd1c7f207570c4e60297e671bfa073f81c7b89370495156a3aff350b969700e34da802ea5915e148ed7619e830c4044cdeda650139b0026aee629dff42eb287187983d4452b431cef16174dbcb52699cb9012bbe92e2132b8299c318b464913762944a1ab9d2d3aac7c657bc5f25b9a5278d7ccf480926be7f801d83e43fa59bb4a524fd6564169aec547aca6e3c0218bcbc348b2b1b3321ae72e1f7dc7e5ce2255a0d52a1abd8f896ac68ab54f9d327274daf49cc1693531f56b6cd74026a11dc79728a372b19c497d0274f5f754aa0387b2c6ff8fe956fc1584b63a06d727a82873e83a7bca8c8b40f1e8043d1a32d41a4fca6c9292a09a4154154a9e84feb8cbf22cc9393135ead9f4aa7c051b3539dc98916783aa1f35a539a8ffb412926a9741d959abbaff6052667641517774d699fb522ec58a16da25f7c17f58b0e322cd7c37af618efe486506054a1dabbb256abb4e7cec60965d1dd08fd6d71980dd2844f0470dfaa432815d5f79c3d722abd2bee5d70f33bacd63ec6f38dfdd6f354ac2e3ad98f291e3df901095c1d571f63fc330edc6d48fc7e86af57d1bdd6060771ab5b35d89a459b25c97abf0abf2e17e22ef9108daa3c67673296d02963e5c541e52071c42fd889c406d570a7cb596b752eaf84fb5e003a609cad7231d97c53056ad33d2c6e5c663cc12de18b9b64eb1967fef9480a702c895db83978e3f55ed984b396988660ff83e228a1433f15564aa3e30edbf12298bbffdf89ed6e6e6d887e56e58123f163e79fea2d91a8e717cc3d99e44df962bedee4075ad1c67ab063dc951857e3cf89c832e84c3a4916a48702c861689986400da884104a5964ea0c17f42a080dd44003fa63ca7e5c308cc29a0e9db8a0fde659b2f4452f03de86d241d4b42d19f025b5b9b67e0698de4f50f8076f826029e628fee80e9b4e0c0447d3d3812008817992593ccba82a32d065ccb3d1110a904ff7510a05d3a38926adeddd6dcb2da59449ca7907b107f80796ac2004334bab407e83159a664f29263ae0295090982861252634264518eb88d9ce99f592257629d6a07306f58bc74786c796800809a1dc5c5c0c01a16caddc0bdf945a98840bac2838d04b10efe9eb21cf10c552b2435127e5c85312e5052ca52a2b4162e452b9ea328f92158ad8ac33a8a15c6133754ad57d82885779b25f865028aaea6d39ca539eb2668d3bafc19cb316f3043a98d1ae3da55cb0e28293109df794724149d7827eed29e542d1047b4a1d7da9e1fb2ac6186312e817d65a6b2d0d6b7177adc5322cc6d85afbb2be4327f65a6dad75ce396badb5ce2cd57ddc9fb328bac348d84e624ad3e5fb78b408b027d9e3eeecb1e96f9f5a6bddfd9d07de01d894e401f31e77bbfba5238c5ef206fdaa83378f1e77c37e7bdb290d2e28a5d456fcf82f69f1d329a3d61a7bfa8a8345d3efb2cf9e4f634fa736a80633eb60b1306afdb27c9f032cd823e03c67dd343c363fdce27ac55d667d600b74854158b358ac89bfceab369bd0095d0cea88e2d7a2f932b6170cbdce0b8bf55fc6aceff7f79fb7b3f77d60484196f7f242adb3c6b806dbdb79accf4b0e52ce4f59f9332b3f25cb0fe4ffbc49bde5015d3278e97e35608d8dadd5c792d1d6c6864e3eaf5e71fe5a61d07581302ef875d592369bb0bb39bdee3b7b3f9d2f144556a86be8591f193480622f844f487a24e913c26f16ebf3f22b875a772e6b696cc55d667d20d0948f4f0e114dff63dd19f3bc32e67d177a6fc9f203fbdeb893bae7e5118886c7bc6e9a8aaff5a9b10983b077a44f67f14803c8c70a1f266b63f2cd9dfaf676ac2ed43539df883a14542ce352c1d836a6cc838ecc1177c4f01fe766021df06336e80cfbdd9c3c327c68003500b43165fea1f670d0373835342f1b1d9b50145d2d5d414e7730ae87330b070e1b55e60511d491392f689a470f6c5ce9cf35a9b7b0f6461cac3028871d993d005f60eebcf086ef111efc30a88ed5f794b531653dc0e1b14bda40d21d48c37b6c87416f49652b6eba9fa6f7502636a52fce66157d9fa23d41a000a53b70ad5d4e339bd2a21ba53f339d53f4e71223bb9bb1bbc7615027c6ee12f46197af7defe7fbdab6c3be3fc7ec2b5adb33ee12dca5ceecb2cb9ddf258c22bbd61769d8150458eccab4c3ae5776e579dab887fb53ef29a564655324f463f4b548977c61077784fb9662c7185727cbfb25d00de449beb953be8e76fe3b4316907ff3cbb761906b5aed2e4caadc80b02e4c716d2a7386c3879985c89cf1d46949307dfc1063d04b6686a108b44577decff86bbe516cb0d099eefc57ca9c3177fe055cb214c5fb753f7f423cb3482ecb6fe4b21c64c6c85f5e30c3fe981ae4bfd4feccb971b8d094f5f3c7ffd676fe71ceac159dcd514277a49094593129e43b34211286d659cd2c426cb44993e2ff81160c77f9546150be79dacd08cb81ffe66f48a10d946898fc9b7f88861fc36afe4b96b56ae7ef4821fa43ca0c2978718b84d0a4783f44139a52658038a209a1e00d4193a21f850a04119a146f03255a29ee79bf5c2aefa199b2fc4ffefef0b1bffcd78aeb9d6f97caba489e9568a720f3f5a57da1e64babb4b36ddaf96fa2f0e46ac5779bbdbbfc3dad668c9a2e6d51e954f5456a27278d8641386695c16c3ee7067d3fbf4dd4fc59c0ce7f9fbc87e6f35fa7b756cc992df2fc2f9177f1198e1bc573be5f3cdf2bd74a36ca3ffd2a19ab2daab36a85ad21d999043bbf0d1901a76112c847608b98d065c555dcfca13b7f1d227f0d59714decfc739252ec9ccb09a3fda9caf2bb8d4aaee107dddbab2ab3569ee342fb2effb3c9e9d25a4100fcb2e6c311060935f2df00491b32bf5379cc29acd122ad6dfc366bcf707acc4eed9252d9763e7241e7bf79d225cfcef9bf66bc8049cf2878d0bd63fe7c9f1f479d79aecaf2e75606f37f7a9cdb73d96ae79b6b563346b6452ecb9fb3d619d4a43d226d91c7f27fa335ca32add1e7854160fe6e9aac11ee39867bcaf2b3be14f3d750a16d11d5ce6f8d2c129de19f1f69e76f7d385aa31aad1d92b668c6c86f63a56b7e9b35cb5a41608ad9debf8e2c20fae6ce3729a5b7d6b0960b4d7f92e57b631ebdff403a76fb017467d231eb73d9e36e6b9f7cb422f97096b0b3b5ed757777af4e7196d0f4a7bbbf3ce6eeee3cb61d93b7b5015d1dae3b3b524a4fb4f9025588027d6683946c553677d7ed9703f9dd532ac91517ddacb47e9bbeff9075ece46e09283b53d19fad5b417f7b4a09310283f6f694126264a4c33da58cbed825cf56d2774f29a32d829258e1ec2935a40452499a20e16e2d49c7efa62dec06fdefa6b3c7e650de30fa439b66bae91eb77dba9f58520805daac324a7e373d34f2b05bc7cc6d2559ae53eb6634fd6aeb9745d3b73ec3a9530d68ad497b7e59666ecfbf5483f940ee845a0be22ee3ae1363d9e630a866efbe740eb21f165d3dc6fa983e1dea9c1a5810632f89296435d55aed77b956ef62dc749b3808b7f558f78e5962d5cf566b77c05df8e5a0ebd30fbc77cc12d8ed80c3a06a473a35a827d41dde3be66b598fc826f77a7a3dbd9e6cc0d880b9179c33eee776de1f08dae4349d817716edb561ebbee80c3ac36e4bc10dbf2bfa1e7daebae78335c24d491072fbf109d569c04967d0b984d319087402d4469d7524eda14e69d0c86668ec1a2fdfbc2a9fba2461c706c9115a5fbff52dfa1f4b2c5b35febdbe0f2cc10eff1b4bb0bb862c77ec1158ff7db9637f375ff325f8f5c3917e24eb5b35640fbb5f412fd28b5a444234ec46857d3f49ad271652ac2882ca0a8995133c8850ea824911284b436c943ed1900abf95d4b6c1571191dddf54806e3dce57c1edd6e3d42ebcb9f91aef69bdae33188e9c874960d2721ef641ceeb8c7e3406e12092d16ff970448a17549c6a359acec35e4a0e0a3ee773725ee773e4bc4e4e8e9c87d1cf217d72be14734858fd49c35165742a00421459428614aaa0024451922d61b490c2c869c858f3e078f3337440f8f5cb9bd7016e307c902ced063ffc3ab2c6b22c4b160544d82408c1d837ac561dc190457e5fab4661e3e05050ea0037ce837ff35f1dbfefc2a09b0ffabe9a9a0f6bc81170be65b7dd3404ff66042bebf5f5f55f056f46f06b70c21b38dffa908c93f7e03c38d6af6107adc7e9b1c3c719c5afe38d8f84dd60dd3c0d6f8824ecfba1fd9125dd389f1fa8e28c74eb005f1bc401ffe671c6b93309bb916b6b9c3b64451d198138e008fb57cdb7465815c7b93f9b7ea236ea744697d4b62386c912562c60a102320415e6098b2d44948089c245a529516591215d8cc7e87bcec5381956ce5995d4412307e787b62d9ce06bde33c1d39cafb1c179fa1ee53dafa7ef57bce746d3fc7733c23ab8b9f9b95f23ac83d70834f773d3a7d2c59eb73da5a8e0b0c551c727b66eb0be3eeb2b594ef12b59be76ebbff939c87a701ca18e0e862009eb00fcef6b80a40e1a3b24cbfa25d00d7ecd7f380f8e382f8e3d3c86f375dce131faae2774b579cf95512529115292f75456183401e9b5f166f42b1ea37ee431a3d1896ef4dffd69d36751313ef31badf21ef075aaacd76e75e6442ea335a7dab486f39a4f6dfadf0b730b171c6058424288275410f2414399a8232a5c31515942b4e63dada7ef49bad441633b92c7483722f22b1ee5479f2bbcffd190457acde68d9ec4baa298c863d46b1ea3cf82fe9d81323b40f1a40a22a92f341a45992090ae42b0a5490c34fad4f62169df7e9441152535a71aa8d0e28a3163b22c3521d18204e6a8ce3000250a172cb52d989c6874fe10858c135024b12a3242a3ef352f722bd16504c9364facf5c8e9b1fc36db6aed574bbec76899a75b5b9a5dcc2468c54d29adb58a63742cf36072cebfb8624c626b6fa9e7bd4fafad0df0d805b2379b18f29c33ecbb531e3dec7e52837d4069f729ed924520edbebee1daf55dbb92e5d07ee2815b6bad55e3fffc892a890bbe7e687fa23328698f5c86f9e3a42d3263e02f9a3f5e657f3c555555557d15eb09e7a7e93a608c31f8d8e23063f83148da231087b8855df8234b181a63fc36e4c077256dd48c81bf6584a657fe74e5352ff29ecf08bf2379529d69b77994fc9edd3555e8d29f3c8a3f8135ec20bf475a9cc7700d8378d8301ec36f6f84d09e611f9c103ef8738aaa2a67058e42ad3f21850fc26f7d8b3ca125047e8bd4210e909402db1f127dab53150a638c31c618638c31c618638c31c618638c319df1aaedf93e7f66529d0dd1f083e310cd46cd9f236bc3f669635b0596c067e7399d2c3dcff33ccffbbeef53129174df961d92be24ac6960c1409ffc6f965612cba5490da0927f9da2a5c473d65a14ffbf3a8e34b6fdedd26cfb67fff7a73cfbfb5824e891d6077a6467b2143b7c494b965fc93246e447cd769f6d73e66b79d1def722a8755562ffabaaaab96a55af6ccd16d5dafca9b53abb3d55043346556797ac505566ff7ef9a55883516bb923adb5f656a8d70f1d9b3fbe9d8ace70b242510decdbf724e64f256b9519c356b25211a1ebfb5f5d79cd8bfcc893dc363585a3aaca59d1249a64a34f5051b79913618709f356448f7ca07c806ce00021840a44a0cbbced672d7e9dcd5bacf20cd1ec3b2eaace2ccdfe514767bdc0fca9e4769212cda6104734197bc2c82f9ac918264b9eed2069c952d41ff94353a04c92640da1ce28d194f91be590946c0fa1ce262d67455598319ce585a651a8135561fbdfe8a0e72ea953e737c9c7a3472e5d55fbfe474118bd1fab33fcacff20bf479ee07df63e9fd03d266174d2f038ebc5711f84fb40f76ddca7210efc37e8d9be0ff4fdfd1d75c6fa9cc17b9543a5bbf758b336c91ca0095576fd296c7e9883cd0fa7156c923f27099236aaecbed005aab24bbfc6dc3cc419837e0f7e855107ff7b90cc3eefbc936e20678def93670bb7672801a76192a7cae6bbaaa8672141c2ec9c3da782dc3efa2410d5003ffe9af9e3246dc6c08f693eb65f3f6ff3664295d99035396b113f0ec91d3639e8fbd8f3c896177d6fbe68ff584075a673d65a147f5eedfc1d740fbeefba69c84117c4c37bd6a64f1ec3452c8a74b5b1ae331b55865f8bfa2bfe32b6bda19ac61863fc40558689348d429d3c7673d3feb1084c5aae328a44e3c00f027e20fc3666b0906887f2825840892b217e482104353cd11443133543b6113cf970a2098a682aea97e0702001163a0441e6c6e4c98f7057314c43aee410456e882e70f8cf3e4eccb0767d759ee7796499c9fcc264992d49abfff219a5cd1878661656ae7c4cc9c294c292254dac0c293962696969092a3c547905d13aaeb33da6f3d58a637886a27c2103161eb810c1444ab63561f142610b2c541055010226647417ba14f7ce4e0e0cbadcd9898933ef6072a44411d40a52e46821cc1f3a9b6ea332ed2ac5a4cbaebb46142552d8c814f9220b6d661bff1a670f5a9a6ab41982951ed1cfda203cf630c16315b7a3b544e346b06f29e9bdb537fb7e0d83e68c51be30dd5487cfcef9c9eb77d4d98ba447f9c8ee1d756669f54df01e9af310b65d52dc10499586d9f5bf89f3444f29229e76cf9422c2b6ebd32fde4345c3f86cd244f1e8881ed1a31d7acaeae7ac2b4f9dd121a6ac529f26a4d8f5cb39c553713346a547d4569f1ed12407f0d0a07e0f71d317668cfaf6a9257960223346dd37eca07624253263f5edc625f8c6b8c26e548aabaa4f7338aa272f1e4196a435622ae0c4a49961797e4ff83c30ab49dd22a7c73efd4a41d316c923e38b6fb4ac58ccdfe8635a0491e8ff98166fb88849b77e7f2bf779503ae6d1606178cc69e6a9330868e15234444b0f4d470670e2c4890c390cc982051fda37cf0d235717cc158ae99c3c62adb5d6ea76ce396db53ee7b573ce39bb56b6619c31e6d79c73b6d6a3c9a1ef767455695a3f2789a63f411212ddbddfe59ccb2865afa325d97deda6c7cab98c128b528a85fe704bf4abccc71983acc0bd57771da54b945233d6dea96fee7cd42d9867ce1e27cc37dd404ebf52abad9d404f9b399bda01db5613cc2eb5cda6da3b6ace68d0baeda89b95e57976cf568ca802778508e7c4e304f782972ba5996d1643e585ced953ca0b13db4b0f49730a3dc5ccac23663bbb213997996565caa86be2e659b9810856a296ad4031ba55509d1517966c1345980633492a135637f39461c1b3cea05622e7b24953c2ca65739759d39004d212381a7a788109db6b3067d78f283252908081418b7b4a21d1c244dbec2985044a007b4a2511696db5ce59b4a215edf3f8643bad33b1daeeeeeeee73cb2e5f42e0b0ab171576fd1d71126103903329700133840e534424408af2e48b29a258294d3bd09060feb81041767d7b416e4aca09a28623483d67123124a1c06fcc4c1a01ba40ed5a3f07d1c2ae3f6a275cc6a701841920947605bdc75dc929ca04b30a34027e7062d7078013929b1f8ee8643aa6898abbfdd2866568536400133bf0e16a0a20637e5439e26ea33009e3eeee41d1db6e9b27e534d3c32908835cc6c3ae9fe3844528c67c48b2eb4f10065551861feeee8e1306d919bb7c19608a895da7a4ecfa376150155947493019c96204091c08397c990207868b0d3c5028db1fa8a968fb37c0dddd15462fe901ccaeaf30a87ef6da449326dcddfde22efb25796626cbdc91a5b609839cc7a7ea2480cb985d5fec41cbae5ca4ecfa3561507d216a2c74213273c31150247099428b2c8234e9c28b0c4ea6d04c1af70c7ed8fe598b1f9b524f6c7f3dcf108144080d4e84407db181a48632669c62009224363f862640e05c016e97b1e54a045243f8bf7f8cc77d36132b6c7872a4061ea410f5ace209c9354377a11e5ae0b030367d1a4e52fb579a822922835dc2e0a14c0176d5c2a4658b5dff635b82d8f55b6150e5d900d5921441a83441b182033fb4287d29019515513c3db96a85e04b478bcfc30ddb63538a2b8a1cd142d395992310a86224852b511c71060bda93272de2ae6fc303ab5aadd602add65a6b0d832c8581d9250c71973294d8e1cc2d885b2ecb96ed523c30ed90b4dd4764da3996dce52beb1064b1ebcf104cd9f5739df55812042a89254388929a54f17277f7c1a2c5aed9ddad93ed31186d6f6d7777772d6678650a195898b08cd9558ccd7f1286a6d233b30211ec526747872248e820450b57aa3c567ff25419ad4bec7ab36badb57a54f4dc747a09c3c32e614471d9ee3828d98e43131ccce480dbce33e4a3c8131059c86831820b5aa92bd8618811449aba28c284e63940f00fc1bdc976272ddb61dbdddd49908a270b5df2500ac4ded9e5cb062f764d62d71b90d8358ac9aeef20115ff8e0c329cb114b68a51e82a109243834a1a2e40a0a9a0dead424079afc95c70c8f0c4a65a3848b88ed9f9dd45082ed2fda4064bb0d65ac7cd9ceb3197045cf1f6a9bf34667380bdb5f17cd9f0db63fe581cea86dcafc7f283511db7fd224b63fee5817638c71e7790fe497046a1ba2b5de9f3ee120d2effa215af8b7d64871b7e67daaccff5dafc39fb586149292c3f52d52481412cae4ed27add5d2a22661dfdbfc102d46c23e120791eb697e88066391b00984dffa1cfa6d482129acd7cf2273080dd126ad868455921e55991329ba4d8523c55519a572bd94f0f5e708f10bcd1a9222901734e9391592572654597d1b7600fe2d3f702c816e0b3e1eefc5f8812a0942db7b3c963076f79fe78541f56fbddeb3bc30c823e9531e496a3ba37f636af3a8e86af3a754b7a96b29550734cc95fe5d52281a456df449577dae9fbeb9d3fd043bb01eebbea45ff5f7c07b7c5316a064008160b3a2e1696ea1e1695bb0cb59e562b6032a0f100d1f1845e0aeaf4a963a68745047a8d5e61bf4f1d7a08f75d0d8992cabed46fc75ac9fcdfd67b6fae68e100a3382a872a349b1dffd9cfecff357fea2ffccfe3efe3e1563d14c8db12d06db02e065bf8e53e62f2b0002c419c3595e680dcc50450c0d4c41ac00c4032f59007175e44c910e34ff993189c77929ab043cfe3e5361cad46861376618568852a3f1f8fbf87fccbfda37774aa754daf52d16f8af5fadff3e56ebabd0ffadf72331fb76a54bafe1ea6c2a4195821333559440e2834603a0436e4a92333400a9e136456db6acb528fec7623ca5d758ef398fd150cc42977e1343ab5c565582dd6095db9e5255a0c83da5aa186dd668e45554ccf794e67ca6f339ffbd8b4a7f6449ad5823d27659e9467e842e67175537c2ff482ae66137f047c2c2a7d3c19cad5023e68fcfe8118ef8b4ea1b6b8c300e7c7f35efdbc1706e9ad3a4d76a48bf7dfa47a1dbdcb68381e78481f7b4fd31c0c0b379535e176f0a4c0a40f66eceb379921f1d55289ced9a9241d31fc73008fc425e704118047ed911408d67bbb2aab226ab0aac6cf3a7860923460c00bc08003ae113af5d10a32193cbe9e8c0309069315555b0cf0a46814c36800c32803100170d434545412c03b022bd40cfe6643c47bb78cc7f8a4edd7aaf78ce739ef39ce76e94e7e8979c90e2dc65fb32007141e01718e0975a6bad17a4c211c0658301e2b698e972bbf842b4c318ed290669cfa42db79b137354ee26888e7173de489f6854cecd9f2b3e7385092346cc255d367182f00985828a41809bab55b1ddb381b8cf4a031e8f1a1515211d29f158124de2c9440530c0d52142aec70e2b218f99608003803a3ebbb99bcb8123049df00908306aff3300781344cbb8b96b3378c9784ed3b33500c865f39eeefd5db8f983dfdfe5e4b3cf8c6703719e0dc4793610e7d9409c67837d56369893712bcf8138cf6d7f10077ef199e7e4d93cf06c3664c80883ecdde0da7cc565fe5bbadcdc9c3797a33c27efc9635e2908832a0d0a429f0dc00dc220bcc1ed6165ef5a18acf1c59b1baf997b75290839b0605ff25ae5c47a7ce6f3d2331001609e3f4e9eede63cdbf6bfb94bc667e0171007e210505b40131a4dafc5455e78e1a6e8a6851b166e56b8215ab24464d55aabc55d573d8cc242bd1deec41d4eb9f58a4b464053adb5d6d6ea3a5a6b6c05ca568ba1aa0d43551b86aa36af0675adad532e1926a529b54655285cbbb7c35d777d5ca56aab935b5b2b8883aa3588bed65a6b6bc5165b9b4fc902435ddc754baaadd509d32555071aa7eae9e8d87474aec559d4daa1e8e818593af37ee22d2ea33e3468aff0d3ad4ff5a93ed5a7fa849d94f4d5876bb59d1393d20f4b842c712625caa4349994ea4d0a9752bae4c687a69f3d4a8d782c4a8db06e6a5f94c08b2eb8d8e245024dffeaa5050ea5599c3183c51556bcac34fd5715165c0b2a70a7cb7499f84042a2a2a949b4f7efa87396c188900abee11bbee11bbed52a7a387b030d152c4b188a0a96252af75ebbc29177f3907c06860923460c1932663c1cbe79b8ed97046daf252a3eac6dc82e51916a6a8232f2742a3eaa471cdcd030554f67696949676969c936eaa239a348481489569276b1c212be9d59f281e9cc92521390a6a57c66690a4a69d3184a8b505a448a5c14238042cc134e345145295d62620925c280494204543ab55a2c422937415a4342a89b2041ae800aa16e82d038b161721384a9e876adf5b086ceae9f453cc6aaccc7825d491e23ed2938e5d13a6009fa4c472c1285e8bc8ea84cc097119ae20ee7e766efb48e68ffd77e7d7915f122e235c40bf7f2a2e9bf847805a1e9bfbad400f1d2d9af1f5e3e4c00bea634fdf9eae1c545d37f49bdb6bcb468fa3af6aa875ad50d3f90d0c286aa0815909c45a9316592a0dae39e526382d8e09e5263ce885dd50fae02906e862d7ee02d4300e99c502d1e20e4c70c543c2c4d214386e220d04145111ea89aa042852c7e744382f8d169714493e14c13932a64c0a8f00347b5909f9676a8c588c90f63aa90c1891fb98519a61050d8c834f9a1c9174d6af0d9a55844c38f8e093712e18b92205352362545acce22a1ed9e52464091a1bd2744f9b56589ee4638d9548b5aca085bd1376b338f81a74c154b4c21851209ae90c018204835223a3cc12283f2747503255a159a5d580081131a0ad6690a2dfb06f4b3d40b484c3414ea1646b4ee3329348160e248161a0a7609155a474edf20e7215a47c23ee8decb1debbd6791b97b8fcc19b496fc6efa923a1ea3be4129d62e934299149a59829cc18186823dfa3ce61b504be977d3150a5d49504ac895bb5491da76f72bc5377768c6cfa33863f8df5b8b183205102b9cd86b9bf45095bb2e672993c4c817652ee88d0a48014b8d96c95c6550689bbd310873206e2d02d5216efaf58828986842dea3e0454bccd0a4d41fa27d74f446d2c272e44cc272646f84e5f03ca09aed4fda1d73947e50e88bef4769deb97e58a5458e1421b4c89941882ee8acea4217e128a54165949a07a435078a2e75adfed1233230b9daf3cb9e525f9ceefc6cc36357c76be70f7f7a3796b1dd7da763773b76f724a0508a3b041ffc281e5718ad93d02851a4be206dd99e5245e4f6e77a4a963436fd7a29cd7ace189346cd4aea9ba614638c6b6a30a5e3d39bd798abec3ecb050deb9e4ee16a351aac2371d05b95dd6fbd111c6cf8e2348317426c3144a50524669e7871a28413355a1d59be367e0aac115dda8d5fdf347ed708a379178ce6edebff78f0c77662302a524dcd7b1854f31fbd2166b3bab2fb2fd7e8be0eed6e9c36642d4235f81ea852a89dd87779dcd06490eb812a9e2df0432bb63aa3575c76ff6eb93f6994c7be2534ca8827523822e48a20485860ac80450b255d9e780101edfedf8fddffa2e8f243ca443836c0038fdd6f35e9fb3842d8d183023a7280900111c2ee35cbbf1aac8f2cbb2fc1f3678dfe1d0d833ab1097d81be0e4647dadf89790f7e5ae5721a204550b9eacff979e67c737e7dacf13d6b71ccfe6f7f03a1deef151004edd6fc9fb7974b9d73c60102900dd0075d9fb2486fb44674997389c91e76dea05d7514a2552c59314543e1b3f242133429f6bf2f633c7bd26a059a312a98295221584a62a60622b4fa3e75d601285254c9002497e405adfec7ec131c277a729172daa5272139b289e862cf2c7b4a1111b58b98da3f7b4a1561b4ad723746788d548523236e34db3e52e2319b8b5978d293d703f98bb4b2b2f7c3a7e3fdd2c60ec37751e9fc5f17d6a0effa2ee4c0b7eb1dc9fc319a3f47e68f8ba4463386af306320a16dbe7a5f5ab0ad586333aebe0d59dfc318681a5253d24596ba3e502d2dd8253d2a6f764971656e8d3a7c38f0bde305dc179dd6a854cdf6553de914aa11000000009315002020100a07856291481227aa9a861f14800b69943e725c30170963498ee32808a220c8186200418400620c3184a922b202c90be5ef034f2f72867c98f93393cf48c4607a2fa2e896a3b33748241a6ba538653857628fe64d1c93b487c103a791a87fe7fa2b89dabef157c48643fd5ab512e95aeb0d8b7a000e8b0cbde65b443bfad3c05e45022d58665c0621d6d5202839f51cc6860d42423f8fa3246e9eaa39080b31b1901cb53bfa24914d9159da4aa50b6c9698934ffbe44f9be64e3b4fdf9c6f547b6e18e6d89c2889a37192ecce29854cf362a3b134eaa50c4480e86cf84822b23b6fe5901a1feb4fc6746e97df54f99b3a1276d170a32c51d0cbaf2583570c3f6e3d053faec866a67ecb3b40bf6166b490a12029d9cac8d1b14a6a85389ab4ade44885e426eadf3127b329e02690c1b3db1f2a58ccd5070ba437f76127164e23ad4921183ddc963f19e7f1805088a0752d17a9c1a67d70b842689c189345ce77364f79b2aaf99e963d8d04c166097bc3912020a37155454df2325c2892465bdd00dc9075a554eb6388a1e98c602fde7a7b3a926fbdca0f97e56b6c5fdac185c792636a71cd8b3c49d3ce64361c0a864f9a520025406414d27dbf269accceda145e35ac6c078aa4d6f87424a98071b12c8a95babbd407ed6b013975f198be117569ab6b404959c88698999f298a5034d271b4fa7bf8c43bcbe85ec97714861794c122837ab123d87e11c8ddf71fca9503b1367006473f0a1137689a92034a06d7d12c4a1d037f37fe8bcd7c492a7faef7cb956e248abf8deed32a7f11cd7b36c549a4ab400d9e1a2acb5549a160e89b7157139208ac670d824e87eb9f4829d542f5749b3d98e3dc8aaa040ef69535a410239598684336785b8840ccb27aae78ac996002e5f1f7949699d49b8a167d1fd16e40160e9c87fac8383670fa54fc02eefbb09c3ec59b0d1c5294e319ca4f5b15c68e5639559b2db1647f7b9ac83cb83652154993ba36819783f56891165951e8d8f2cc560c4f3912800513690c53714b3a6fed8d4c187e8a616210a87709f8d9fde05aed278d7ec4f0a41f0e7f143833151c9240d8c86f8f0f83734c0da97dac0f8359fefc411cbac1908c06757765dc4e6f280d47f8f62ae1c0a2baf44b01f2b006db683e84c106f137469e6385c7d7fd8dcc4db86e7e108ee31c243874946c0cb228fb10eb48a82b60f2c39d174281a9313326817f9db558dacbcd6a72844546d2a5a5be6b530062fa3f8367d4676661ca99f4bc5ef2bc12d89e24050550d44a8702e15deb799d61b6f3cdf09e517f0239383e1bfefa0d6799c537f09c9650dff7327b16e870afee98beccd7059939c0b88d501aa77a47bff5d0c0f6c581597d7358e23d474d04ce5f9e01d907d02c2d48aa13a68d99ecb4a692a55bfc8477f041c35cc113660924408746069c205d3daf85be70ad14e884f6fb9fbac61fa430680233ccef36dea605c794969d79d1cf9b542bf036186ab53f4d27f2009cfb6ca7175fe8266d16d6fc0de9818d57ef9b7f03db37b0979737085bced34e9f80c2d9de8ddd32a50bdd549c34f60fe1dce82bf553bd2dedd70fe597f95e84efabbdeaf6118b27c35154c68766c731ddaa6b5b17cea1b3828e2d60ebf61fcdce53064282332403c7722a49a14705c2e225a0e6b46d10aa32bb98d74cef0a89f01eb7f3e5681772fd061b7a719c72be7c4bb952ca5f61ffbea4843488d2cfbdb8a4e3aea5672f45ef8f8f007e1c64f44be8b89187e0bed1bb3d7024223a7134b6593972456a8ea66d4a74d4ccb238a95f49d8121b344578611b60bcc66716f878195bdc684fd878e8f95e22e778b00e820a87640f430fd3a9373662cc8546a1e432aadc7ada41174f199a7731945dda5d1861ccbe90e9f141a63af523d03fba51f194df802f67ad61b6c6c97a6e6673523b7550de8e2822cf5397ff53e3b70e88bfafdb6ddc52575db38c786cdf04564445cf53579a9d0c051780751039ca3f2520858fc94378490d3a6651929a499bc4ed064cc57fd6058ce038fa18f184ea2538f786ba3e4f54c0cebdac298898f711f9850744646207d9f39f3f7bc1192ce8c0f0abd7edc620429cc41bc2cff568bd0485092c2dd6944e817431c6cfcb87bf4742c429e6432f427913290299fa57a7828a6f8bfaba84b39d9966d576b1a18fad846263cd19315a5c519013eb2dd1c2631f70677a7c17e34eeae58e8f85774a6729dd4277fef2bc07a26cc9b7ac5236af4c57160f64abeca685fb39ce96aec11d12bc691f9b39c2d70878b85a151b9fdc365c860de8819dad70a9cf9c8705c2b1d78565d114036d0984c8bc6db68f6d8b7169dd462bc0523240bb725e15dd76319f7da346a91659fdfe7936ecf3126944216e42126936216efb23d22305d12c2d22f316e2d913227323c453069161df6f39eeb2211223f9109e60317b409b46edb28845596718ad9c819be960dd28f9c2a40eedc0c1ba0a14ec81bece12e731ddd078479145713f07ad12fdca030d4c0022ad6715c9b67883b04204c419c1e19036bab9008eef70ce1b9103af127424877881ed7dc7578ee613b44e6bdedfd07fa6cfef39f9ea7dead6438df767bbd887fd6c8d65399ab162c78e0606f155f35406a0d9f16b382b5ee8cc4d8b0e3403ff7e6fed4ba79c3808d6a4496cf793023e8458379956befd3a4b1ee3a160c73918a77a090942065a94034e4321c10a53ce4079b4ebca211856fffe6ebb8691856845e603872ad8f471775827a97a4756582cb01daff892bfab75b28a7065fcc55a0555e2e3b28e57cfafc3e88b5e41695d9952ee11c7b5ca977c6110d066bcd12d7f2e4209adeee594a1b67352fc05fe7517f63196d80a87ea59254c3d491b3861b65bc8321e7f68e115393bf8b2d2419c6a1ac345e33f45d9224b9799abd115f5e3e3fdf72bc3286da1b47a1dad48ef3bf14784db93723164dc34c3d7c7c7bf09ec66bf54da9bf6d80f2e3ee64e265cce271b7ac46cc1253e8bae4d6d8ac08529ab5a1e64ef915cd0e19eeddc0c4fa6cc7f52179d5547e132166e079c5511dfdc5df088e6532388f36d27b57ffe4b06336b6148013f11803f1d7a1c4df9e611916f61965aa4d1f7900533482a18eb6cfeb0bee46b4399a87a28884c22a7bb99efaf0b67e9bd73ee3f67e9bd9b5331242367974ffaffd078050a8faf0533dde2f28f613c7a3a1b7082ff7d9943a2bc27eaed54c1ce93c3eb253cdd4a590735ab0ccf2c97aa5398ea2e217dbb28ec98c50b9bd40f2d500f0d3136338e959e04b06108b0e4eadac236222abdf2790463f4dee9201483620f89976c8b6e34ab129834c60f724d9554aa9c763e24a7e2a8d9e06183699a706420b2a482e90044a4495090387d927b314120058af9117e5d2e0045e7e5931614f19bbe9c4338a8ac287169e4265f8288dd288af38eb8c2bdf70294e89d345b14c5a00fcd07228ef5c88411a5dca7a205b23a0f4a05996bf608bbbec13d338c60281f8b7e9b4e6cb0b1c363f44976253bbe548ea685259009b0d56a1e7cfebbcccb072267dffbaf49fe92583293b58353b4a6a655c48a425682aa0fa8394f443fa6ab403d852a7499e790478ba0927f2761b17b42888531af3a637dc2cf0fae1f1133f1f440ea5dbeef1cf2b613639e3af7db6b5ecd09d2c3fa06e11d35c7f511e870191b6a5e410dfeaad9f36478e77efdd669aba5e04d4d616f3256cce9f6833fc69bd8a5f69c50eae2b31fe11c1ff9572f9ebf25309266fd847c81b5dc8832ce351b7dfd416e84a7c4e20e5ab4a563e0358201ba2ddeec9824fd1d286fa423c4e1c993457b46e8cd233093f436151cf08b5125a180db225b532c7c6d91f0ada430dff07ec95cafdf27d4357dd4e2825f8642cf6845aa8a39b0fd7555ed7f122bd3995d934716ce45143b4bbe3100c33fa0cccb8da29b12fe45b05c58e1487d425d9cfbfd1f5a819122090e7d53bf518d044d88cd068260357f935d6637fab00099460813354aa85b20820314b920aa035c2bc9790dab149538f4142d66e99854ae3a5094c7b75360b172dc2959791e56d5a029545fe9dfc63ea9dd61dd88bcc861fbb4e64e8a9319d43293e4d3757f093643955520f329ba7113be765474d0b88522a6cc6de26f9a22ade2db7e611f5351b3c5d1cefbed8f594dacd72f8afb30c6eadd8ab94120c2d3a7a3e7d14a0602ca009614473784094fe031b74d5edf297db5fdd18fade48927b02a98a4c58880a1a7c3162aaaf52ba53344c0c53c4c1561090e9c7d0888a12d182224a76b5c20ef9a66604a25e44b0b8507e8c5a2d381edbc7e0ec6854756959e833efd0c855b81603e4fc80ce3a223abc698a1193fb7e1dc23d83e5aded78ef448d2bbb36747a6fb5b1a8ebe83ce7350ddd042ce9989eaf9c19ea39f17538f1778667f1986f96afc8a9a0ee8671901f47bd249c7a823d37b72d2cfa5f0ba215c641eaf1bf711893ae3cf245c560eb0c89762142f05305fa983c0cc9fab61e026828bd8b86adaf890112043129e499fcbe1dc11ac18d1de83a57979108e982d6a7afe0023be13ad09e613b8d6e79f2166e58091e908018ac4a4feb45462effd968645e7c15f791ffd3bbf79f64023fcfc455c12196030dbedb0eab41eee2fb3431de70abf2ce0cd4b09745ea60e2eaeb5d5ca97bdb418ff6f0e43b30b37c4432e7cb917ade146b13086a95cb0c0dadc710cd6605b40693b6bebb81599161b50fa93925b54029ed7645f4baee88ad1f820545036bfbbead249109f8ef99c3181647b16556870495736714bf64fb65ce2e498539bf98230ac3396447014f0b5ab391a7b2f9e3175c6c83297872af403654fd80c64b334a100334b37b8acd8cf188222033ec0d8af942e07577a63b1fa757f5098596027da00112cf4492551482951a03bf6a893641462e28c42929e82b24f81532ee39aecca63e8491708128d9dffc52e7bbf44f5e9806f47932c3919364067439bff47dba4756a56405c1c29d93581e73a084a748582032fc37f5329f8cd99a8f312ddac5cb4a988cb0730abac9a398101eb4ef66a1c1f15532a87d1d840ea9ee1ce303a8acd3d68d43e480b33619f5378f750fd905201097bab7adf9d1a1229b452229c9455972a8bf672c8432835de23a69c0a93eaa02f0711575d1426cc092fbcbd37d1bd75cabbeaf3ab0edeb897e8f680117903f9ecc7002efa5a72b83af6fc8deaa0febdfb4d5306ac2488ebd41a28f058c4830facd4d36b43f9b63dc77ed7d14475887e92a223ff4ad058874308595519b297a658ec2313c7a851a07449d87437d154e8692d70861dbbb7ad61fa6616bc49b6ccc1a99df871b04016a4fb2e32359af5dcc8febbf2b6c099f6ed925eb3239345f31d4fe7236206c961c0706f6edb703a53ea5a4de1169c88e427b6cfd38883127fd98d693ee9ec3119d2d39b6123f3e28397f732c61b3b79cc597f105f7a8e7119abcf5529386df15f5395b8c0253a54d0556ae817bd8006418fb30a9c6f541fa1805305a217b812a794eaaeed94501003042067579d479d5359a84c1c779c436c82eea9384b662540d5c64209ca04b267ff006a6a3a310c5151bf7844f96af0cdf573a566bea1605084169eceb495d7db7710be596ad938bccbe6155c0ff6686a256efcb34c4fe2fc1f8e51c5790f197ca23483248a63289467ce6d46dfff93bcca8e8380f47c601ea39574d57ff9e4768790ac151fe9a9d67620141d627131ab0118f2a9681cc3482ef0369c2fc64c1cec66cdba1864b2316f0e124e9fef27c387a303f5f018281d465fed3bad7c335e03a456a00bcc503e2bf079dab21b5b374a76ca69d11897ded2924c317b22885101e785ab81c9acfd7f1663e43f0bfc068962db2a4bfb855a66d5c77c2383ad4263c15acf680ea2ec5c163c82736c199b4d599d38c38710b9e5f08802f04e02840dfebc48bb0725aa668cd493107c287b1105372dc4bd7e787e6ad48fa7475f96ef4ea7487b3b0c2cbe97683ee586fc6e05924b383fd328a37fe865975b1c16e5521382e612bdd67947099ace81baf1363859e05b550681dd3f7aa36e414e04d094f10ed76f7d7e12f3da26394d0e2d1fd4495022acdc62f786d7fb8199a9c7036ad55b24ce5fad9c8dcb484c4283576d801f0f006b6978a2a79b33c7e03efaa8445edd05c0912f7c12e40373e461e8b8664f800d4d8dc5c5861ba363422902124bf0c5da8276117dd480ba547d0dbd8d1153474ecc28c3bb97fe7c8cdcdbd01e95868c43eb55c850295c42c28dca11edbe4848658ad0390f6c012c3b3cf6336d08a4b5241da5bb4bd1e093101ab4762d41dd6518e28071c62be837e7b058977ed4321ae19e616995c79ce08ca269a6e84ce8692c0e18df6dc7ee86e088f3dc971a207f8b06a849c6bd1e971864e6c7729c374ce0a7083acfc0351ad527f1626eb80b95958fd58cd6fb6dd72f374beafd5acc70269aa4522d808ab443985f7e77c564b347a17213c95a40cd14674e664bbfbcfd0b049eb0632d3405a4274b5a9231c2abc79d6d15388a27fedbf0df226dc8f28d4249b75b681840b4d14e2dc12371dcfb056346b538b3ab428f74a552bb53c861e44fba46a0924f215179d01ef80ccd92e146059846bfb916aca35e2478a5561331640c8def32fa1d55ebe228a2cb87308ed360c272a225de1d4cc85852006dc823cd365c54b1fd5b795ed911f8b089f50bf210f47a733aa45fba375507aa8766e9641cb5d8c6f7680ec05be278246f1dcc0726bcd640b202df5195b1ed0eb9882821ad414a3c94f1bd8f33b7e67ae87e7f42bbc3d034e3f34042c5823002a269eb5643ca4b129c08ed45b1655d898d0b4e24a75a954406e284b733914a2e13aeda018f230e7b28c48a44158648917fc83c2fa4b5e6f65f20477f8239f5906fbc3c29224e05fd532c3b84209ff10789dd67caf0f5c0e7209823daf7bd77f69989064e5bfe911f39e19b87dd298507b877a8bd3353dc40ef301c42ccf579253de4a5649949ebd8b2484483673d70f93c685f1b75e0b20ac4d974daaaf1db509a35fc94d30c278ac44f364debca4c78a99c128909cc17ecf1549aa992e1086fa89032a18189d2490c386a4fce747d65e8d93f527c41007204afcb5ef10fa96def2266fac6d2cc9c774d8564c94e18053de66d419513ee89afcb499d93dba8d77ac182244f2fff543367c99d518e981190f0f99e7bf459f2a965c222d6652e2336b4e46f78cecbaa33521084db9ed54548161fe0242b46f9a84a6037a76868c7d3022826145889175d0bc97046f4c6bc84bc63e563334eb024079a9846f80392b97f69f5e096eb3bc43f35e29c60e99b42c72e604cce1959f8afc00e6f55799f17de7d677e214deff3f02b949ec23c64068eed6a882fab98d98fc9fb78e90ebe83c79ac7eebeff25550792a801c9ff6d82fb5d8706de64d87a4c91fb91829b9b34a86543fe0cf43e7a8fe50253e78ec7c101dbc1cc4f4e20c161740448ab2dacadc31663d1c4508e096c900cf5d47a73e66be1fce885a1f8d24a4256091779b7be8fe05b57e1aacecf080dbe8b37bd35db44526768993ee3301b319f23a2d60114e82d34605aa73ac007765ade5d3249950148ed3737747f6a078aad255c4a4bf9d1f59ea8ee9b02b97ba39bfb48fb20a27ef8ea034a08c28c00483f49afe9d007c33007e172e142ee8021c7745b119487e30db059430d97e629a76100b7715703c7f8bd1e655dc62fad4e58f5fac685d94a19b270c62a68d8643f77e5ff0c81b522fa607e04579279977e6e002aa4b35e73bd1b6111ce77048023a4dd6c10929ef2e27af038b9530f994e480019757d19345f561a5a5ffcc09b0c4ba0beb629df12994c03020604293feb8e209b1eecc1efbcdea4b78c5cc46ae79133e6beb3930e0bc09148793c68848d00ac2cf45fef68724fd5b36e7d98b7376a0a4602806e4da2cf7dacef61725ac9f4627bb19297494787d68991f2c5e18d1f1b94701c2ed67955057c065baff2572e21f937d43adcd0dbf6644a945f44eb8a3e4fdeb4be15c5048044beeb73f03b10331604a840f423747512f4f2222d65bcace010ce3d72035d417c5b6a52b9b83b7196d6596d0cf8e14e0c21595c41cf21690b026639bbb9926135de1e2466321aa6777003f1a93e3df9184b846ff3d92092f4868298665f1a062666a186efc748966292a386ed3bce73d87b383b1a9275472b6a2491aeb7e5b3dd453a96afd6b00be6085da740437590c86be9be4b2a7b3e466b52ad128dc6a49094ad36b63e772caad0208dba55181b7d3c6bccce4ed6fe885fac85ac9f2885427407f5a3bb578c53e2437a999df21db1875eb813b386073832ab789c89025881191fd40212da9c2c176637c95d842edc187838972d9f3260f11907b6398f5d8a3c5917d86bd782b97ea42ca20f68daf10e3a3f67a1cd039530624e88481313deb20c2456ef2e37060c68a052c2e5f8ec260ffec51e8bbb99ce2326f9e88409ce11dc9f93657f358d45bbd9b97b7e182d718598a3e25a25c1993cc008d9d2a6b9a82d40d6cb3acb2f2fc2347ed0c249fc257e19ce1fa2335c1c519245da948655ec6844360482af9ef916a497f532a38fc95cd15ca6d236297e75b288b64133fc5521329fec0ff9322fbf3b5c3ae77489b749b510c1b74cf0cb70baf54d33f17446b44d8905d9e7a7b217c91d1c874af8feedf9c3cc797e4079142b24a4de0ccc0757620c6285ec42dc9fe423974b91daad21f348a675fd5a77060c65ba48c7cdae2fa168393cdb2d97714ad44fb8c69a865742421c945ec8561a42ed4a6fb96a691692ddf937ca1396c1b374d7d8d578ddcc2d7ce1c50ad1230117ede4b875e607fbd4725dc1a900787f28a0bfecddca8e6d2e6277385e86585700fe6b187160d4312e31abc68cac41d85f226adf0404a8b30fb90f3f9fd3260df4a515b14afeb20344f6a05d05f3b815125c5240b26f8134aacdcf3e5c0bda54593a1104c5f5d8d44bbf12a5850187bd2af9d82b360432e59438521fe2d690f4e01e7361825921c8bebbe818c5e4abe6b68e6b14d067419805cadab43e45e90c826afe311cd647fddc4c8c8eafe723e3b3a561b8d05ed963f6d7382ebb16fc4151773b5e115a80013cb6ac4ab48fb5392e5519699472a3dbfd2b54b595585cf9cdf136943d03aed92d0e7eb78a8aae9af3f0a103277b0f238447dbbc56d41ed0e43a8ac79c2abd6566093c03ac247470658c4144bc825b46abc034a6c0b1cb9dc00e094a02ea2e66644469de3476b8c77ab0e68882d9208ec3e9be69f15c97072837776ae8d3f08de347105b69fb9b81b6d5ad707a5da7a8832fca2a0a3d447c35836f94b4b93199b80d73160e358ae0530204ac1051a9a2fa0def7917106c269abf6a2340a3318480842ef018dad0126f990bc7a84142596500c7ae397a1a10b0773b495e9db781552ecefe533ea0ed3b3edbdc0705b7e09eb3be8b90805793f1ee211a370eca364913512333b597b36d963830185dd5e8cf84f415fe04155ea7d515dbb1a516e6077aca9b5bc4851cc6389950b7d7267835d65ee9f27d1513ae30345c596d46f327cb2f403cffadd13a101c256790e6924f8f0b25e6a2e15c390504aa31416acae0e727e8162ad111cdcb6cf5c7f7e8eadf4d61c6dd178f0a658e1f27538247904edd464874c6555e615e2d54c34e71471ce42568e4786b495aa3ded77511abb5b1bbcfe2c5f4be76930fbc4cdd51d4cf3a23aefa8ca530e247c3e123fb68fb15a1f4a6fa5139d2342302591a51ddd65078952dacefee7ad04db85c033d31ef3366b296e839108ba086ba1e466bbf065f2e177891b6a0e8714476c51f73bbbf652b3a51592e12140d262afe57f0e67322186506a0d0a965db6dca951b2c13ab75250e87a9cb67c024e26878061d4c19c03dde7ede37d865d8504561cd1adf4db6bdb41d83e65e7238ae335411c1c548badf82cb5253982a3493ade15079deec74974c22823f8dc8f2aa5a692950c735b4346d97fb613117846f27c240996ff6305c7e2da9cc49dbc0db812e1bf58453124d9d0075a37cfd26e3d71de016231546a1bd61f4d246315b30d576405501789ee5e2d20d75b7705f3726204729f39bb09743b314d0692d000296c4d2e796e0af5120f374bcbbbf99cb2547b64de5a5ae685945fc95b7873ac1b4897d86e3348373a4d2aa7dd2b0ff2019d06be6ad8370c419be3b0634b76c0a9a4dc1b6785679889e172473d5c57a5d602327d659af83f8c1aa6ec03a31f08d4a1fe3f169a3283d67ae4ad5853584f1b61ee73824ac4ae12582ab1744229ce6b98ec6e36931896836af4e13e3b216dbaad4e5887afe8be944d6fa56695fd1999a4e1734f0bab5e4cc359a713b7aa5432faadad48b1790433d1c371d20a54c8351abe59b0cef1aadd39efed7708904a5602c1d6bee66c263d057a16061bbbecacd2bc2962c4121d5c9738cf05adb37b2e44741f1011944d69d361161c37d48873787d4a99521a935e3cb5e0e8990eeb9d0246022a507f2f1ca68e12b8e92fd60f3e34067cf259f76239526d6644126a3036183f101693ca4e50ff3633e3d281dabd140102899b2f984d0bf63fde2830b14e51d8cce8b59367ad7600b9bd88f8d185a8d3810b0d3c91017817cf7f4a84e461b8da9f1965bac27898b8b93d87321d6af41309dd467db4ee6d537b23daf9b9f3b07db64c2045942723df657cbc96ef3d8399670eb4a32285de4067dcef228b3c493b50cac33b7079239f4c8250256b1a71c05855c8f77ef4b375eef464444ec83e4ef2238db99cad100b15f6e6e583650db5ecb7134d416a0151f1626002bd0926885ffa027acf9ba7f1fa456eecd06878b4c07e6012ac165b0a12a6c3cf9ae9f34e2a487d08f7f4d4dec4dde43d99e2e3c66dcc1f7dc8f80317b65fbab6687fa1701e2be7b85b09f7ca4239a66205518622c38b1c86a1602086fcc19456f49544589451989de95e58acde1bab8c384c117ab0ffb858cf15fc8b6fff090f9c26cd0090c6717fa2f7917bb33340ed22d5dc0c351c662e329d71d900487bf189ca9f3728d55aaff51652ef155c773cd7e8830a68c0947bf218e0b6b5b36c1e44d7dd540b7e373d7e0b1e1de095aa3587aec71405d71c4d6caf1403dbb8ddfd26ddce6b35d6e0eb966ee859c872ccbc9a5091491f40f3c428aea607a8c83f50b43e59f6cb222f852d82e91d438d61039c745afd9f1b19672669144cf99e69c8f5d35d62f7076ccb39bc0f90c67023126bbdf432aeb48cf35498942f7ede1845222325826adda63011042eff129e7a9234f14bc75ff124a90fa956735a986ceb62f4219456d1b34df8625df82c4ac042939e7958d89ecd3c7ff7a072791dbd47fbeaf77d127b907d51e207fc58ed185573fb91bcbcfe4af6e1479d73bd04bacb0b6ed3e01ba05b923d28b48a5b32c4edb44faa70f91872bea5036a24d88875bb7d19882e1b4a64067ca1779c0761d0cfa374aa15bb59f34e5d728a635df23d45b16765bf35871b284452d44908331466a46569a4042fdd55b039c89fc6b71e32d1c31cee62d3ca2b80dd595260448ea211ebcaf0467b15ec768cf838be82499af0f1e4820f15d185cd07f140cfab4fa2c3af4f6c2e308c442a8988c42335c1e24ffbc294f78b02def95c281f6ddba54da8fda36a718f56e326735050a2f34560d2acc38d9ec835d8121258cf44036f710595216695dbcda592774946ddf61047464e1dff1289e626d76d8641244418ce70dfc27b8dbec1589e80b8b446bddd82524fa869f9bbd12926e5455c4bb88f681485081a8db14e42bb06a38a472c497388092c3f7ebea125aeb5fbd89f572e5880a6172b114dda7a5d32bd335f70d84fad5fea3822f355dc66c3fadca2907690391dc15bce293a851bf6694c3a9de5e69b98402674f1fb5887febd09a300d700d3ff77d2cbc213663e425ce3b7fece61e2297c1efdf79b88cf70d61388427ae74507c9f55cd4d1a91a7763b05669befbce4c54bb1c88b67eb4469750a3df5cd061418bd70907b923745994e072e986f6acb28385b7e40f3834dda9a33112c8d385429742bd9eea73079d7548854fe0775746c167524fc00e4328ed2d838b9cf32ce91512bca1a3b11a23efeae9c67b95e743709471d154cca30737a2d00d7c9d26a8070d29614008c889c312db6c139a6a99c60f08496423a754e6e4d31aa31e6ec6f6f561826be7bd5acbd387e25262180ee5739b97b5791299699855d9797b08880c58c300dcb98496009c1128e5c14de61f9637550788e51afbe9e1d7eefa9bb91363ef12a37dd8d9c7902587d373a3a705d303c6e82c87f7654da78661a21d5a2084173e200e6f00f17869fa170d076ba01ed764dea9581b3825844363a897c4242fc2016c3a0b8eb4dbdd1ffbc23a46da1b774d1aa188aabd33ba11894fa9a32abbfb54569a1ded6cb3263340f74ef85d01e3b155787c756ea1121368e3d529650af1900c13090fc5ec08a47a996e13d53c898fdcc7cea5509e3841deb502bbaab542a645a7df227e4cd07bc25c9313f87651776d962b32a3739c047b632ed170c16e9ba8dc7e9866650f2002de2d17289591a01ca3a6108652bfd65532d6ea90c18353021431b984efe05b10e6223e428cdf0f9c73efde2745ed07599def1367593c308c0eeb170fd7769045a2f02a5f07faff65e79674a0a298a824a1c88a5e5226513dc7d06edfafecbc62d62869f1df0276596a440c80669e43b910841524aed45f43ba9f067411cfa1078fd3f51f47fdfa786859f19031e2ead8f4377196dd4422c5a42ccdbd527d7fa41aaa8bb600128ed050ac46c31e13c2daf844d99cfc97527f2040bcef4cdbc4cc8f0c44f538ba8241856d847543fd008ce1889ce7da320071c1449724999af4dd974ca5b1cb8311603f95a8f1f3a32f9530d7ed8e5d906f369a286d944167c02230f487261d1734987f48468694fb02fc8f70a7fe2dd44aa86d9732d2268d51904310c0640ab421c5e942aad54a6fa02bcfdb5c1397f2d2221a3779b16fdc5c90acc4e962f2023810b14b89b5b4181e3301199ea6f9a04a762d0b05bf955822bfac6a84368c29608e46a402027052ef04d29701c0d561635e733d75da5efae1a0ea1270bb3259f0f9f6666d5f025457749e932136a79a6825e86ffdf3587408a7b9a64ee794cb141fd1525692490e4bb947c4b70e25e4a1343ba61d0b5f454b137d18ee0b7e94c08cf98e9be69077a51d5c1e0dd6bb9ebc14af811829f975d56e26d3d660ff80a3267a80fb418baf1a44a5d93f0463f38249e8cb1643be3c234fa9d29dc9a5b946b65d595a2a431d4a00af1898a9bfbbdfec627f8d7df4409b3f68050405a07588b0dda3ce5a00d2eb428cdc739cf97140b8e62c21e5a2c9b025bdc185ad219db6c8540551a3c4a034f41f0893aa0619ad44725db40610ed869ad2ae121429b9c417af2ad62dc9cc181683e7a31dc1716b089bb8e8b9adf0c9c001ca38b77cf76e312155ab9a750d210758d6ed8f84fe44b7c1f341cab0c9a22769e67160e0a3682bf896f0e7b44f7252825630e8d43928c5e8e83a661551428c44eb2b121d26b907a8753e3f73a739149318955b6fc5028931fc4e8cf16fd19d4e52dcedcff9f0ae952055549143e2eea8f8c68214b2335163be106d762b07e677932b4dbd466943a0e1bc607b6432601130cb24be54ec30008d067a5ac4816520397055977e851c8e1aa1c25dd3a25222cdcb10aeccd44e30a64ebc938379daa0b32bf552daaed59c697207852606aa50e13988213b1289334d833c88e7678539fa82224392a7271c2983cc9888156349a5672ac215ca70a5860fb6325525f316286c181fec1a010095a061e82b9797176f46b7a8cc1e43768991e57cf04755da719ce96a8680503cc190afe33622c1abe20b31d25d07004d8341f810dc022e4164f644490eb41889379dda3bb24479971f64537c736da7532294a2f46a2527cedd7dbdee3013f94249632e8f082fa43fc442caef35ad850ca14c5dfd654d7a53fb71d6a0c5b8145f46664d55dd43013af4c0d562a1b9fcca1f32dc6fb542a36698559daeec8843dadc34758b7dc4de4b1c9a13a078322f383d374e0652b6c14e88d43dd49e3c414229133ad5b37b0841c0ef263297240d23554deb442453102fd74123d3497c281f49d19be4e9d390b431e39970c55fdb2a56f1dad162c888039df4cdaa95bbff0fd8a2baa4e249c2dd6f258c52784e6a1ae48a23f64dd146f1f17d7f9b6d5cc13f7e57ab868393099e835e08d6b4755473db88ac7a21e0a7dbf5d98de39c64af3233e3eca9022f4c42bcf668145d67410c2efe26e6ffec0e780a76ae16460b2cf353775f9c02cc49ec8f82d1ad1e3489e1d0992c017d5b5577f81bc69d1f9c7107d1401a3b329c497c8a2330771958578e4988248ae7f05aae185bc640697892c7ed58939589419b95489e99eb99190f2a697cd1efa16d3ec03654d273bb93177d8d5bd268f60c71d46d9e36d76c841f648bc89cf0dcfce6c1add8ab9275646f3384b6c73b5e6b9f7e446047b4b64f24ff8e065365354946d49131dbf1326d61b4110002a050c76c9c76162f23e99eab496c06ae15adb87d426dd6c4b3b012ef5efad0cdf37543ba1d6de97f2782c980bbeb614116a618dbb84ccc2d61e9260c68fa242e7e1e0e4663d88c4b1c4d72865610b6de10e45ef8d14f3d07f56020b16ca61df5638fe332971051f22788d03c5d5adac14887b96529dac3e5a1e401da0056f4410aaea6a4d3945e01ca6bdae7d5c46b37a797c4406ac54fca87a13ade97a7899970848b927bf20c0e5244b6430eb8ba21482d079ccb6c1b77a843056e75bc88638f89f5445914ccc243a48564bf87df451a6fba6fbce4ad1dd4f0f7d07d68824f084c71abbba90c6f104c3b82aa0a9f5d2405c37002bd63589f499f363ee891a2e1268e3f5ff9bf7e6632d768ec6a10c3e4776d3f7e4e29ab1a0046fe5b80377616294ef79efab626ece69526f9923d745b578e8ebb00940f00bf608e301e9bf89fe3388ed6ae653e64346ece39adb2470de0ffbb4128814caf62029bc5ce212cdc3d41c76a4677d5414eee509582e639759a2bccdfbf3c4e81b78824352fe7f2d593bacddb4e190dc23a4fdff45bc90e91247b2f335b9551d8dcf010fa3f45954a6024795636a229b60b49563f52300ec532e009148dc105c26ec3302bcb4cc8162e2b7171a00ec99987394a045714921d7ead2821d6f86801e1491f9bd3dfea2c42f164f41cd4110b376356f179b2ca8f145136dc020228c24b41688cee24c3f9b36aa60660bee18ee6c262d49d0cda634a07d5c69b01218ed3c3423cffe9611d3f64d8cd1b1b37551cf7b8cedda1253bbfa55e3fe99b43ed8af6e3671e9d601ab9c1b0d0c35694118fbe9c5c499406008dd977402ab2fae60c67b22d8dec570a216cf5d467b303703e82eb3206c7129c0de1943878cff57f3b656dd71cb4cdaf2fdc0d2bbb022f1fb7a82544a68c0e7d3a452694ac90efd60286c4f0df771f0e43664d3877f2e7d11f8b4c9f6c5f97cc8f6054ad00731801a13b4a2b942e010aa69af07f560d8251e0468892f3773dcd0c49d8b31220d4e06aa927e06d2431b6476391b7424707570a3ae892c9481d941fb0bdb53f53364f84bfb6d707b83f2a8f6ba2550c9160bf7952c7c096208c54acd13c39547113a2fac17911ab0bc41c5af3c69e548b7492c4ba67bb7d69bea4824d5b0a9bf67ea63237a4a9c786652abbd02962bf4566ef321db30ecb998c846211fffccc5b28ec3e2b0286fbb3db37c6cc4ed6af9047a60bf56967b51ff8ad8eae4c289f58348915b38e88165f42bd28a2448bb82c90d79d6cf62bb407971535a7a5239cd34bba7604b648164d2c9ae059ed3af874324d004e0d42ae8a68ff151246356c7c29f8ca4b5c3e96fcae5a9287812ba4e626518a51d2cc591e90e22c04c804ea201c7f9252068e3446c327a46dd47f62a593f1f54da8c67441bae9f7eb4b54cb22b452ceb1050fb9fb096c187f583660e4e1d4e3a5880fb4c14438c4d6dc53716d195ff6daa179e8d40d341ee1064f4dfbea8a29ec0e9647d414cc7d5b5ae29f8996a1d03de4dd0b512b087871c0c215f71369ae0fc2c346a3e43081aed73e6094e8945bf600645fe6e5fb0c168118297bbbc492e1384784d596607aa930f66cce4e338b8736a01a111b15690451e85fdab40967de757515d3261e3a7c5c7e4cd4bfc1bc97ebae9c209f0ed1e823ce9069314e0cfac6376750554439113e74ceff774b5a9a8fb87ad91a39b006b987c24842a759c79a27b1814d2ee3f5ab79479300541d420f317e6a44b622349c55f7ef4f6cb2c545c7b61d13b854bd645d3d2c928ca3e809db3a780a2d4686285cf4d51809ff4eccb9fed861e9372c47aeae3c53b70086e60cce15ea4922933e0c1c858618eca5e0e7a2e207c159d157ac4c959796b892a1c19d9432e5413fe6269d77490859a4642edbfd21460cb6a0ae0aeaa977f0952009aaba9fb22b196f6d243a250d85a8ad30984d30dbef7b781cf0e3b64cd760477e15f295294b2db9f2edff2e2c3f82c968452b38c6a5957d213dd652da7dd960e35b924bce8d08e4082f83de2437244d431522054b0ff2b637c7722c80595c3038e55fb00550690ebd9f7bd677f3343327f00fcf260d3195b07a7c8b99d6f50d334e6e621dc9d8dc4efa805504a13059d9df71190b37e3944c10965ef1c85bd735cefd45e8ad458effb69dc41fcf4369bfbada74f3c68474083b2581b06c05b10deb3ead9be058ed762135b6bf965fba3bf5f059f2371eaabfaf32b7f86275c04e19aa8a6f143df60f49507173b83a2527cfe0537490e2318ad6670cda904f4f9f1f6d0c07b33d68aae1befb01aa5c6614782f147471e5deb7eefeff64c0b3e92b08a30861eb2405c92c0bf1284a70bf79106cf3f654666e818a47a3dd71833314da38e70a03609627f00fc123e52de2864dbc0a63d8c31a2b12a42c5acc1bea82d725f18dfc6a4ab0d9d75416fa6331071aee2523899989347f4f12a5d5d7aa3d2d4423fabd2f18319a167a861bfc6cbd4a20401d5c99864cdb2e696135dd1ba9318c2150f41b43ae62ddd24e22e067867163f369eeb571944a9184363f79be639e3a2f4b68931ac474c9e5e43cea0e101426e9eca945c27cd6e17dc28b617875095d1e55b1d27c862702050247b1c7c51816e5e1cf0321b0f5653a9ef3b38b5204ad35379c118226a18acefd0e83ce0f38a8bd180691b090341922ab62bfe407f11a8c68d7326e315170dd1632f35cc2752c5a9b3078c6ced8c8b0ad41817845a9b07153f307abed3758c3ebb13bc87b2c36e896db32e1e459c3b862ec8200f9c350a2a8c44811c51e1181a81821062ec24607e803602102877e0d2722f55d2ebe8746d65b45496b463567bea8e0faf64a8fdab32aa57aaf942ceeaec90dcac563f4ba6a8432fad5be0adf33456f376c34ccc2d1d128276baa56b062bd70f5758acd32e220fe001f2dd1983c688abc71aad91b062304d09a3737753c2836689e946004eea5b33cc34e018c34b18ad317839cd689096afbd260666c4684837a0e0a482de6e5325bc1cb55f31700cd90d3481fe028e1c71dd559082a701437a16dc8178c1a09cf18701e20ae471d62a2014c76ef14e635614efcaa6c7ac3ad9bfd82ca4a84e8a41dcb1b80f9e3fbacd2356972a1f21a6641cdba7c21caf5c8704be19e9a65d3b7d3f2becb812c588fcbc700ded737d2017baede27c670c69c7b14a16ef7eb1adf019bc483dad213a75a277f6d24e493085ad8a9f2731d2884c62caec6b4d9a176365826b2c3fc40c23d8c4365a0649e7d322cfe46587ae39443918cabcc7d21f68bf153489cb7a95cfc960a4cec699fc1c8ce0e65c81887d4434ca34f309135fd489ff2410af75a68a8ea5a11f8ab88fcccee6a6b0ec04e80c03364da28ffcc2c6a8a33b76ee35f2de0bbaa41545e4c927f41fd4aabe184751974615338244a146c9cd1e5c7389845c9308d6e8e257e6519ccc804dd14692afc0ce17e639b722ed2bc5d7dbb7e9df8d9ef1dbb1f8bc0168ff3ac142d91c42485871ac69dbe15725b9b3300703b0d236ee0c0aae8856c3027746c0c315919bb822242cae2838b3aa70b189c047fea357cf8f9a8365e0cbc1bead232e7434d8f28e1aff35da5c730dd7cf7f2ff5bb6e5020a5de2dde7661901088113a5265078da55cc8f09c82994e45f9fa43a75fa490424755849cf172d489545ab333bb56792acc53b71e1928a31c0ba3a09c1ab42c2fe16e52f8769d9b275829f75454d0b5002ad86048e4627edb8f13b6e128657ca94aa02acd93293ecfbab6fa0e3be484a7b80b47892c48b0625fef49875b3fe6b5d5999b5cf90c0b8573f1b9ef284dda2b04a6c7823a4fbf4175ee1df504477cf42f3a9aa6aab527f222e811a15e413326d16b146306489a9a3052b87050f820a23b431165e476cd9d204eb5eb0957028cf46d13eba3c749079e209a63b0611fad54a99f7786d56011bd50c4958b6bbef95d4156cb61794220f58279c3511c46448251824d33406c008f084d3333138b93629e86c009889c4865b7e99bb81feeef285b12ae4831cf83d5d872c3032181c9e65f159bd3b30ef1624593ed68c62a91670b48d020d4f85b538afea69f2734e65a24f8674f9702f81a01f29841001f146127ad540416c9c70c92fd0dea750be4e845598b30c995c71252f64c4abbcf316bac59190d544cac9edf9463dfa3a52f060b0dd993b979dfb6ee815833cba385a263699d1936d83760b46c1ece744fb866e12fe3207f1d8fb6e308962284867c0753e13732b5f8d63633f793e38f9c7385c86a88493036e6bd4372e9fc532e74e3454fc9e03160c2a2c51ff9d8bce3452ed2974b6e4aa9e694ff93f470ca0c505212505277423459ee71f8fc41c992caa0478bb53a24bc8b54186c0f1fca41d9a23e7f7caca650862ac0bb2c9306d59ede2f4ac2266b9da13bf9cace42b04857708fef9e840c69db896417ebee2436168846dbdaf8898020b5b83085a9719c9482c254cd5e72f6e0e5b88277b723ccbb6e306d1d4eab68ec68a467bd4c02603349e45ec74f4c9a1a1ab43725c793c0eb8f2a4d5d79d660150b3d32b555573608cb0ef448ab4c3a6b629fb5ec7b3901c5fe0948f61891bd3360317058054c90933797c8f150fb8c2e7d38ef0849710f46719b18582755bc5f346b679982595d8e2e44c00b029a1b796e23e663c47838f0b7ad1431c5ba6d2dc575988caaee31b2e06fcf29e97a70decfcd355464c0436fa67c60b2a4ddc9b565fe8d2cc63fcb5f073b74835e46592977c7aa1d06f0bc805b34d6dd3266886cafcb0a986f5d7deb90de58293728ede046f1e2758f227aa8b186c4740b02730f163133e856ff1589cbf1169c5b154f4103aadbea7d31883c30a3fd99172b981146bba8e7db0234061ef8e51b0d55a6b59197f528114ecfa9b705d873445743771a0559b37be76bbc1e9f8d2bec79a8e921a4642a6fc0770f1d5e0765af7e1d55dfa57c0c383dcce2c132f496553d8abfd68f68d58dba9fe545f4b9ee49035eb6d6a8fc5c2fe2968d7ac5dd7301faaeb39303bda4b651ed73dd086bd1b8ee657171fa778d597ff7cd1c10b1d092bd4d5d07ed888c5afa2c50def5b5eb55b78105c9b96e1e6c04ee772ea3fd50e8137b7916b49a1cdc41078bb3f160a28108908018f15c69423054ee5cfe77dd02bf09f61d0c012896a8dc5cf4749dee91b274e71b46244d4d54d2213d8b8b66052d3d56ded578d8136b0ba0d1277d6c662edf00f202dd60e975f2598334b3407604bcf75f3ab66d502d3bbf422dfecee4cde8f1d2c638a839d02845d05f8b5749faf020df7884f16d3a76d1c3a08b7cc93566ed6ba09d09366bf5ebe16463a26f63e29ef6cf8b8b17b41bf7834e10880cb816de61d401cc97e7a1286c7d98f6c8731cefe7203df173958392d87d044a154d80f647745351a89f322712d0f820e0f05838039165612b432631e60118af5e8ca42a8c5027ee24d6345f1323263890d30dd56e156c3259954ef1c80fb5850def6767c87b0fd4d78187ffcdc94e8af8c2ee8207b12bc82276892054811e663de44e88baa95800d19080b7fd0320617d4e012fb5889bbd8771d91f871cc5300dd599f0874a6280817cacd8fd6a152f23fa83ed4a3bc7d1702ca4dc916e3b7f93939b1869e832cf102655f2c3c187d31c585f24e8a21b15140e3091524af8fc0208eba6d0b8a3c356a5b0c2d83da23d5327ae8d9c74bcf95feb8415f00c1f69a5af339d49f20188124f5d04829ff550dcfed130dd64f14a3a05de1fd1bdd01559d21da3744b457a6fa9df2a1d20731091cf47238559a3c10bef30f7169f2bc31a383a8997f9577998e95b98009303d704001ef6560964c0c327f93a5bf326e671196de36950a2858312bd03934b64b952aa301b6c8cd238102d8e5240a2662e1a088e40f0114e322bc296170a1243d0af222054b3a4a93799f2238c3e53dc35142148da550e98ee0b3100de5069c26c3c4b44b844a96ea2eb661ac7d442c65a7e9ff553ae82c2734c652fde366f935d33a95b07c642f7a8f5e582bb992ddbc8089b9b5b3f33bb99966c89ace500494b631e32a14021e957d58acb7dfe6eee8f331eae0540b0e1311ee33a547ebcde826e41c368545f3554c6d79d90a444bdf6a5844ca97dcf41e8a4819fef2e14c0eed36d84e867b63e7d54ab81fcfb65d7e76d9b121210023aab3182c14f360cc7f0909e95dcf58c82932a261dd594dd8354afde9cafe3d957ee1c4ff3051670ece86425d08eb7ea06187a5c2070d2ff57b2e00ef9bcb1a077eb94fd015f05fea6b01a20f202cf66c8ae04ca16914804a30564f87d91e78826026246c90e07b24379785ba557cb7e503af61e5b69f4f9a79a86ad3afffe5c44e6021792022131f42a58038915e514ee9a84c0007766fa1c83761cec1b47eb053e5b4eabcdef1fc459fa512da7c0488505112d961fd9c17d2c0bc8da86cc60ef1ae62c0a3a0be059f26ba4f33295270f4e3987f441dd2260a7dc76163538fea201fab4a7cdc60c6e847a7a3e43e72727de90297b7605d58d6b900c107958f4b7ec83c74c368f6fbf432de99fe6ba24920c341eccd3b6d764fad36554ec23b5ff6a7f7e91a525c2783c5de831bf6c3d2d66434e4e3582fe45a7485127c8acee2d9fcc57449e35d8916c1e25ca89949d5bc183f94645948e63462bc25794b12229b660c704dbf9c8bda421c7e5e6899664c406f81f0bdb83aa9da790809e31835f0882c7c10515583563e249309e8251eb85c2cd63c31064621e7fb3ab487ecc7aae61bd2d591ed6eec3455b9ac08857179c6b08aa61f62825299d6dc327fe570412298e7d6615ed11639506b9d7c32c2288c1678f17bef2acabcb9b9bc62afc110bcf792b84c8c689565d3ab14c43d00716b6d0a16ada38438f9b825ed0096a6b7123747fbf05bcaf9f7b61ab6eddeb9383391b2134948e3cc70d2a23274ca586c8d792ab5c9eb14ff6c9e31cc0060b9e4ea41cc56d6231a4f46906c33be43beeb2f9cd35f88c01cbe4348a8ca428fa59b003f47f9149f2a90430ab39bfe15106a58788055664832804fd2c276d6601a05380f18f57153ed53a5230c8c58cb1bc5031a788c4ad26e2b61d49e188bdbc0692f42c648302bc1175df304e161a8fcedead11b2f1a49950973a2dbb45a57d43940d106605bb545dfc40913edcd6dbc9cd9032278ff7796db737f50b0278771a2e08d9b97d8ed052eef4859c613ee5a081b6856760ee355433581cb47b48faa010cfa73c04da25b2f2321a7d8876ffba43898b493838b041e5f36440cd5fdacf36edf41228985cec62b2938198596767c9c27da21eec49f2fa4d66533a1b88c822aa9b316ec4c6bdf1166f162f16b584d18732454542cc835e87164441eb2ee030558b16c34d21fb1da234ec97072ad85ac38840298a310a9e0765f493cd9d324756839365052c0200fb22596c1bacc9bf87174a722929a4556fc31a5e4451e5951806c02ccc1c751f99540e6c74f854b862c53d12124350f4dc780c25733ff973848347e46c344167b8c62dda87ad28313707acb7ed11d25f32d3be6f9bbc87cca3d77dfc0663a023f0b01c8e0769d7a3d86a3e6d72c83c2c80b168b250483f936958ded6e0e6c3f47c214379dac902e9d0aa3be463e9d286b08453a1d30fc814be040dd7020bcc4179b50d645dab0fa493a3f17910d11e06be937d28273eab556d6006969be328313e6213a9b2c74d8901886c41b038685144edf088a45314618903a6876348c2d63a28108f90313ed1dc82cb3f4555e35f065d4b55b099a3493305a1a8cebedaa1d5f9d5302c36a7bf274fcd4d1383059402ee2c94cea23b07b425be858491cf828b33e11802308b311dce650322347194159a99ec67e834e8f044dcb16c815d552f6ac7b1cdb9e94b1fa06e82c81090c0140fa44fdd320226bfcdeb6075f32b3445b7578f6d705f15faf0f5b19ae505cec01958d9524b6e6883acb61e8d1da1df6c3199534a5eb1101d527687362b615c25d1a2a0e4f4365c94528aa77cb813162c8bf239374a5cc4acce8c59ee9c1da2b97196de0f1054cd62ac186845c35b389dac13bd6039a7b084a39db83536a00b427288df0a6f89409bdd940a4e516b3d9c61abd0754d63c80c0f50f2146bf470661582345ed2427e0d8beee6bf857320657e85e506384494dc518e42313e0f93a79baf4e4264f215e4ddb568c79a8206721616eb53ba75aa87123c5b7adf1ea53fe89d0aef5ad9a6d2cda4bb3520324f96cc12909283e80eda37fd7c3ddb873ee71bd4153b0f34f69a9ec4f27483a81bc5fdc9c85c630b9e8074ce826402c5d60f910e0723f4552ea559544ad8269c125c8261fd18498a9cdfacaef4346d5c34e0fcb6161446aed6de500836ccbbd122192a972730008912d7b8eb718d87756f7dd0dcf0bd3e488148196da4a2d603ce9dce355ae223bb61bfc28e6ee04c7f3953400799d07b03dd7560953390e09920f604cc25b39ead04c8c45eb1a7ae88ca8e673997b00acbc542de28ddaa510a5b0e577455c63b7926e5c5c67a2484266dcdee598341c553f36f0ad423d1759ef0ce8522350b68e5892b832b7c82807fc93e4bb68fffeac14331bf2ab62cb1a3b82fb1710c227127c5120bcbc0221a8bdc004acde736edd034acdee21608dc7baa0397bf1a4f9bc4a7cfa18164580e088b0ef9cfc02cb2e1efbba08cfa2c18815439592e95e00e8e33ef3182e1940c7fcac29e4a2c7f14a98eae7f1808fbaaf904d834518262f48c50315b3dd10a6d5dbb4a639adc48f175d30ff3addc78a469c898ccb1e662a5fe4a423cf116ede743c6c973c1efb7c89202399381f65017571638d33dea9b9a3edd33321a891dd72e9bb451e9507dfb46b36c956893cc65da45e62e3446b64ea699d04df7718f43690a2517e535d2a70d9e8b38b2b103ed97fff74353d8aea07f4edb2d88908fd6885ccc64629f8f40ad3a5bab8aea223b73d57d28078c4204495d5ed4f7833424a996c1a2223747f9f0380bc308bdf8dbd6c4833b839f9e0e4440e4f348556e5a3dcd6dfaa43fd840be405ad2184f0f901f283d6f7d1c75031fc987eb82afefad8b83651ac681be897f0959f67f0e7a3314dd286953760680e8d03f411e927278e4990a78b204bd910e0bc8bbd758ba0a07af34aaad43dab8e7f4c064c1d0655bc464ff4bc742103d7948af16e06e85d6da738e47c8465e35489650111bb1e982d57ba90d95bd324066962dea4b47ceced2079c6d31e8c5716b5ea61357858a75077ed3cf86a13fb2a29f6f02128de214064ffb381198008a33ba557cfd6122361af335f401a308dc2e908cf5be32fc56014a2312c188f48704ea1c1dd07a68cec4c0e82b323d0380722396824a41005b71057ea51379496a52c96ed9f8c63af46a0985859f34bd448a715dcab7393f7b515ed3a6b493f7c04e316298de22615e6bdcf3757846bdcca29ca5180df1999d1cafea2095db7452ac791ce9e9dc4fd0d07896deba7c38736dd1c73c46bf130798e627e384d910eeaa7ad35d01070db47cb430a2a5cb2ad0e5514ce9ac25f696f96fb83e3ae0d2a5c3134c50f8af28d46fefacdfb9c3fc1d3ea705ccf10c7cfd92a1ed5d2bb81d18db1d8c8c30f7a3fa5e7f0a2fee27aef5802ff2709a89e096820c657be694c172123a05f1f7ed429f1a93441699f22a6f736ce60dcacd14e03e947c71413a45830aabc26db482c96b4d41548020bb3000e569b148559381a8912e9ce51de8c1099734fc78314777d21e1382f122f97d901752dc33c4be674a1420cb0aa6075f0cb39da12af01a2e00a841cc01a222f948f84900599a76bb6ed4adc810659c61870161f7ecc180f54f2f8c4282c56a05ae50802fbdded1ada7bf86d833f7813d2f417ed8fdf6f649d5b76d518ec3b9c822ac52be1d7b2823deb09a967847f8fce9a1cffdb87ffdc38cdf2f0d09c45a6cc8ec81fe205268f38f06728d1426a705e274cdcfba8767fb8767ff489726910df18d0a8dae13bc60efac8ffa5b8a421b03927f982e92e66b832bccfe8086da8f961c2d84f4d15c15cf74ba4c4ff12c49f6618e7db8b0e28b2af5fdfd7b66ced9ae28e02c2acd07bbb4cf489b06f6c507ff87ce361f223522cfbeee093c0e850c4fc3be9e4b6129e4e8c26f1d3ec16de26d0412ec81e448ee97d93bb10242623ed522e669950c8d411a8be4c6e2cfb0e8850c3d219e85ff283dbc95e02f94ba05891578ba21318b761e109ca0a5e4c2ea6bfc8905c4597d7f413f97ce451122284b748358870ff35554a4d2b784c4868a26cd61365566fad8344a1d0eb27619f32c29ada26a82005264a800eba5760d44ee9834e3fb8cdcbee6a12584fbc2e89d053ee2310edcfa409f7ea603cabcd64f3d54976fc2a57ab59d09c1ae43d24d794a714289e42abe047d49217430ce755eafd0439dc8f65a2a668d2fada7409fbb34c6c429d780dc94d9841993924b4ea855d431aeb48af76c997cb282c315860ee9acd5d4388f964254efe3dc5bf72f7707cce47e2333d3ee8b9b980a188d2cc32a1247b23d40314ed38a0ab00a56eb91c784740a33e7123361c199abfafdde786042f45a887e808d6a228a74905fb729cb7c8274e2aefc2be5a4f3708eedacb4474ca59c928e2f6107be47bdb5a0de5b3c1ba95a08828526e3bce5b2eaa4009a9111c92af7c04080c2ecde7e95c13e855aa869ec4313be9c813595e81a283d397452a38aae0cea4e206d927ba0928e3f804ddebb1f67cad646604ccb55472dc4b7b9f97441765158fdfe6102b2e89613b333e40776c07faaed418ad35ea9c360b80af15de88991b80125d5d6943e65713e968b12e98395261ec81981892ce851b1343141d25c1bed1fb7743a825bdcf424d8e7eb848f50a33c95eb02e30cafff4fabfdbc3be9879ba2ec2929fea101313375bbf04c1842cf0e8eaf5ff59c927d3a2b7f37189301c91e0652857cc465f472c1cf60adc0735255fc9d82fa816946912730f3029401c1f145a5f8c842bcce152d7658d8ffd97465faa173522cc79af59598cd18f5d9ddc8e044a09734a74f0f7ccde4332e0e45c35a451e64f23aae862169d7dd383044201c773843eea94f81b809052c364df59e57304532f11e78f52f83f581d9e0281a3a7b39efa652b126fb73b6dd9e7e90d35de5f9f922e5e43d099c93a5d8a51fecc17b1be51309c25d8d0707e084e8662804b0b414f3bc3950db13a6112ebb3840439bfcdbec674b170caddc828e3fced0505afeacf0e962f890c15ab6c50adb361866a1c341455f420045106dbd76fb71b0862640a19c4dd73695c9fb91c08bcaf4a05d7e32517f517aaacf45fa02704bd5919ca6f026b541c1fcebf6daec8efd0042b024945610c7bd932721edff9a3446ab021b9671b3bbd12da3fbc02b23fa08f3c0213884a0bed872a0a147208f1ec70eea06aada4ac2bb71576b2e0b151830a21d3856a1121e5fa23f42f6827c9ce43a994515a2ffe81dbc74039a6a0a7f5e3050329b0e95b460827971d20547d2efcef14afcfe05cd811c46d7a9dc459d19b3e4db76fee879c3a20de88740104ca9b26a0895005477170c22abbc37965d438b0c1bdce52b229970020412fb6206c33387bdc591ecb6b6f79632259902cc07ac071f0838282759e4d0e554496228a5784ce04a2e186c069bcd60323098cc0c368369b213065b0106537225aa0b46dffd61ee3eeb9893244c06461f2633f30e36a32f301d1f3fba88524a290c06f38e60305c173ee79ceed3dd7dce39e79cb3cb29d590f33ccff3be7a9de779de6ce679b5ab335a9581c1cd44f0e1b2f9fd48528eae376d018e0abedd796350d967b3d96cb71a3f1de97775f28cb1838624fff696b2e477266c36a3cd68b459cd6c5643a33ea3c9d0d952cd12ed66faf4e9b3d90ce9091fb23072cb990cf305c61d4606a693f1ce3bef64606030de7557615aa65d305dc2dc7e187ef57f302b5cc0d01c3e9f297cf0f92ab3cb69114f05c1ad3cbd54e43b4454861a0aa89f6aadb5569ffab5d65a6badb5d6dab532edbafed3cfadb50eed10f514f9dc429c0f53fa513affb32e2e19d6c3c0663513868f67831e6ccfecd66e970191ecb2feaa30edfade5fb5fe8c1ceac35cca33fdf56b516d42a77430fc70eb7b4fcbbc9b7b11cff03829c12159aa372702ae60d1e456261d0cab1be3a8df8d4e489692e64a8e71d40f63f06e5cefe6b29591a4202524b7fe4a09eed695d1addf2b9f1b6ca9bac5601c53c69d5f3170fbab651cf3cb0c5ceb2d779bab4fe32182d1adcd4486a3fa29c9705419174394eab4fd2b8cdb97036fc1ecaacf39fb3b27656a869a61caee7d46d2da95f337ed6a277bd24abef133d99f8beee58cb476f9dfd07098d272ca8eaca9dd239050d4eeee7ea3754e7b7fa2777b777b2b7d21d5a10120f51491c86ad76ccd09d3321b1c8d4241691317b70c6d20024a9966bbd07f8ad4c474297577173d9fa47881f9ac76d1b96200b7eb036ed2b6cbba0ca65ff4290c9d350ad32e9aa295683673d90bac66469bd5d066b4198d36ab99d5cc68339a8ceb6160fec2d06a606e6078369bcd5a7c6cc83264e7f3f7fc55c623999999999979b2ed813243eac26ad7a7aeb0fd258b47ab83ade1635691b44e8137d87efaded17a2cbdefca63eafc88e2e387ce8f283f4451147fe8f888e243e787ce8f1e3735392624ed748c67f60809128575bd66da7e40f99836205050413a3675a288629428ac8ef5775bc0cc689496e3ddbc9b9c8e9673cbc9a1dddc6e683995d2726a70403a36020945b7eebe312e873ea5dd6e29236e9fd7829a196dc665a429886a15cff33c1b35654df7f77593e5d7dd9f47a750c18de0f368ad393cca39797493e6dcf0a04e69ed6f26c26c465f6936e7ac5d25598a13e7a06c8f0d5673d3dd7cd49fc3a3bbe14179748c3a75faf1b8c96997f3513f0fda7dc3a369de23d0128e829820a463e5fc16a15dfef50a5bd2268e95dcd4a3a949841b3e3a3aea74982c2ed81b9712b9646ae697f36bda75f37d7f81f9a477353735371da3a43b75ea9ea2b49abfa133356b6ee647ce3c12e645c6d3cb65a61c679a5fc32fffaf660a2335e0652758e0e09635f5044efb65baeebd23bbebba23bd81dcf932b3eebcfa24612e27ebba354bb4568aa2d3fd32a588f40409ae93a595b94050982ad3947a4f2f407f56f3f3fd65fc674dc72659fef75366b684cc4ca6c6e727d3351ee9d269978c8cf72d398aeb6f8149d3ef4f9dac4e8c963e42c7e6cbc8f0c7ba8c2425caa53249979d64c1736b17a09d1ce81a2dc6e1bca3de5a6b0dc6e1efed53641cfe3b58bcee2f3a0b90ed7ff196414734256a4e41a2c2c88e7e149840c204cf5d22ea7a70196909196e7f0b484c3b2c476cdfd22f233501754b8e7225b774a33bcb262a5a62242694eefc5632dbe84e214d3850fbdcc93f6dada4a889da355f4cc196df6552288524fc946734b1af05cccb2b9c7eeeb124e192c0bafd9cbb6c935c3657e0d7fc179466583a72e79773c72949ae053c775659d872eedc1d135c36e74e94093e6d73a7896e08c5044a4f38ecf438f1f2820b26908aa0a418d5e677d1744f872fbcf8609845bcbc2c81420c2d18b0b8a588b454c50c484b50dc521497706109892496841045d2239778788105822513082dd520c5520b466c8b1643d855143b2801a5071b5e465262081d909430baa5d82129a1025114919408125f7479242562409a41955b8a517850ece744b7c4b28ac8c1ae80f096d815d11696c665a419d4704bb10696e532d20c56b825dfc4234944dd52e4db4d0e0ff15d6015a21298441629f4d4703be2061aba28b170c2829d235c3ca1c482db8c147bb40c6360b2840a4b5288a1082502380205a69d232e56c0841530b841799099d548414ae276615c464a02caf5cb484928cd10129a95da8e1c3972e4c89139e791eaee3738a54568115a69115aa476b4082dd2cd398b78dfe7b9d28c1b6af5a0d4fcdaf38e5666ca3c83f6478980fcf29eba200d7dfcae77c10ef4c02ff491de4ead58a5ba201892ac7ef57f2c96a74227e9cfc995be928f4f4301524aa7535a038a524aa98dfab556a7947e33a594524a29e50a5ca63fb498a90d5b838a2dcc5d57697821e83a168f35afdf3c05df0c771faa5d270354c508c1900259bb7ae601c64ab7625a9f87c49595eee767c5839d2b7a7dc65088430c193358337376b485460c1ca8bb534a29154560a7979f8d1addb2e1d25ae1f03bbb904e5e071f00bcee4b79d4a3a4ad91c567e37635a52aa202933a6800d48a85bbf3dce04fcc0e1a00ed3298cb58331bd7495b438bcfc6f500ed20b4df17c2be8eb52e77ac83cb0f52bf595ba5750205b5a78252432920da4e69755a6b4781bafe521d985aadac5662c898c162a1d14a4949b85eea073bb8755117fd8f622b69a226223da0816468e885a53ed50e0a214e4c53bbbaeb7e35c57635c6290647938bb2a58dcdc6a763dda7ba7e9a1ccfd45026cc11fa38e3d651e8c6a7462197b731d67c6a3f42346a404d866a3c57e946b94b97e9e2bc1a086e533f15118ac953b5b1d9fcd818b1097a40d75adec676a33ad6b9cce5fb2f9596cd9c5c74e2263b64c94d7a44226fa49d8210f0d30489cbe6c7652024f92b06c252bb9a632034c1ae4efa982b38460a7ef583d004c762a060572f752c06d7ae2b7886e5fb63ac88a9826758df1ff3144305cfc4f8fe98293e660acfd8ef8f718a9122c96520e062a288b101cfc434c540112325e6099e517d7f0c8e67bea499009e87aae181d5c42f63b8b8fd31b9d6217efd72947c84c3ed0701e7b2a3a1db449492e0f6db1a6e3f8c22b73f8691db2fe3c8ed67d970fb67dc70fb59806ebb8f3733acc61b1ac69b111cfda46e60601cfdaaf12686f1261c6f88b058211e58cdc6cf18857866351b2f23868dfa76e480e580782b2964832cf948073e12bafd3738708e7eb0fe75196f7e46266f7c664e2e8b19391ddd7ea727b6283c31a618027e62701d1923e2c11ec5e06ad178e4532908387f7970836da75bfe2c0a01361db9514794bf7ae6a4c34907910e253a8a461d465fe878bafd3aa6b0db5ca6e34847d3338951ac8e27b79b26374493a3895272190d951d1aab0588d72375dcde053138954d8f8d0a3c03a5888b02d38090340b606303a1a941c0b58c34508df39134391b2c4deef6dbd86c766c78688a689c688c5a7699989a9a9e9ea06c6c4eb79f65b50096bb62f9b1f123ae76b4aa7aff8129cbf23354bd31541949224191a4dbdfb3b05c90bc4a48d8d2dad8587c58ab1d7d53d5fac4e040c05519ee6428381f5308087dfcc0195ac3ab101cc08b07e458690b8d1aef0963c56585c6c83586c2ea1196709dd47ba410ef53a4edde63a46055a3f7a95147f5de4a27f51d29e49b258a525491a0aa3570869dd77336c758293be0dd454e988398dd467d44d21bffd0a17fbbd4f7f3804d174ce59143b32eba152bf9940ce94f9b18a48412829890ea1f61f5e08738135cf62bffeff60a8c21d710e3185783a947087ec9ccccccdc1cc4042140425cc8b5efb35614ff5d2ed8dfd92dbf0417168e656da9f6bc003d8f6cd11f52f3dedf049775648b923d765e3e6dfef2ffefbd074921299def53a4904fd579b4235bf5551ed9aa642b02dea75ea7f33eb2451d06cbc2c47ede9ec5f7fc52c220f22f553db6dd077cbf1a3ed81832b75ffcb5e60fb97303fcdeca2872b85281a91aa7acbd51aecf9fea90bf94ea9354e30f1f3dfc8a2e9bd994df3f622bc3902c3b1218389d76d1f79a3a2189ce8a093ebc9fc633a9bbf2cd37526cd787b34e25e76a3461f9726d856cf5587d4b2774b54a05820c5e2048bddfcf9e177cd57fe3bc55359643ae178e347ff56a8e1ba0b7147b68e104064ed51e08d8ceaf7bba12aa523fe75c11dd95fa707aa89a284e0fb1bb73cc4f8db3ae1de953442dfe7927cf5c5a8baa2ab6b21459fef29b43348c18cc1c3eb37da629b165332867b3d95098dd303db933f531337339e472131dbfc2ec04e78d3172cd8e5c8351a32a27592c37cb5f869cfb46e807327bfa00e2b24ab67a7cdfb742a8df3f82cb3eb24bf0d70eeed549746aadf53d52c847baea975f255bf4b96629497339f943a75dfd2c4cec740eefc82c4796bfff07cb133b3f8a260ca0cc2c6351964363190cc6b27f96597fcdf974a42cb75e617e1fdcb8208b0ba95b7d6917c8dd75b3ab2e2b9c6fd77477afd5ab5777f9e8f2b2fac0e54e0f99b89125e239245982b05c4257e62f99d9ab3bb333333b1f390f7db79ffd3e1ce380d82ffcbed07e76f64c1f374229a51488cb3e1f589ad8b980a9c4cc4c839120c217033b6f977f164da2f99ae91e6792fb97432ec7be99bfdce576fecae50bd6f0c19673050c238a6764aeff24e2194a0493eb3f5ca717ecd09b9ed734283911e4f5f439e7a4369c56dffb0a6703dd7faf72a2964d19886c365bd1516c5e46a241d3bc4171cb6974ddcb315d71cb99c414e59633ca759f3855ca9b9ee779ded39a8fee244bd1e98737021945b03bb69221bd59a58f09f07664d44680fa278a0a549425252225487aa6cfe4717a4abab10be3602702e497b2739627b6f4a46e280a4b7f7ee949b41b621cde51efef4433efdd6f37b0dddd007d62dbba1329e19916b0cc89f0180071bd744f3a21f5dd9ff0bdf73ade7f7f42f7a93fc1fbeffbcbaf555f27f5dd771f428a64d7e9defb8f9cf9cbdf23857410449676a875a4180a614b8ef2c338a02c256560662f80e96ede5508a4bc72b3fa2ea77f35caf42b8671f897de350017007602f8ab3f41f5e1f797b079c2eac13f217cd5f7b756afd34a910f007ff52180bf2243507d48e6c0b524f3bdf12687c708f3977b23df09f30203e285951c07a03f150148aa8a2aa47aeb0e631cce309ef9dedf002c7b00ec5a1a37b0f396b01a3e8cc0331edf7e78866fd7bfa3accb5a297f97a7c85604540fbe4ef8ab4fa5481dd583a410156987d45224c941aacbd5bd43f99723c30acbe3236f82b04d9610bebbca0ffcd7ecc1b50e82063738529be44bbb3a5248f5d62a79e45bd13b2d6c2543162776c2c8a992780eb0b723c7ee5614acdc4939d6aa3fe45672bac0d47f1c728c65f6e73fcb567e3e8c65e1cfa7b14ca534c7f79e565621c8feaa179cab4a8afedab19464852c37cf21494729a594524a29a5b4c3b5bb3bf54a19e9891786024d767a6e7f5da50e9b50fcdc86c2766754d1a96048099e8c7698d2025194a30334fd2054c50c2af4100df102a7fa001a7a8e927cc027862d26d0a409a0238692a801926a853eea6ff24515a4a01b102ac8a4e0a805229c13280c81448fa418917a2dd9907404952a4d8ea0400c54dcd00293140071824943576827de7d9f1ac58f1462717a7cb3fba9e4c5910f132740486698c28115a8788208173d7491a4071580d409cbf5c2b2a1d8527eb8fd5fc80a037019498a0c17c66524293ba1119ea2c30c434db840872a82b849aed399c2053454b104d7851128dbdd5dbd800d113222caa7862a4dfcc8e0a34c9c481534c5004a0e8ed8c289babac245dfdd6f60401114a2a0c10b4e8272f0db131058e148062d28410a422688b183865ba7b6a0e236e36148042f24fd400912e2bb9130c509262790c1920d2df8acf8ae19ec26839d4a31e85bfa2eb7150ace0caab0804a16465d88200823f80915348c8005513091a087d40ef67e1705aee4c8f3d9fd82c95eec44f181265b0e5ea8b0040821ea1d8264044e9a88c2852ea44851a394525a29a50e3493f0e19be946faf1430d58dc0006447cf1841a25517161845117511c61220317b0135334a9e2071f5e106282bac0049eca66b3d9946af46d8d1a96a84062a74705163e2b3ef3109bcd664ba2b18c6b4aed3b300c56404587156c71240625c8a187179ed06087a2179450a74b9e7821bcf4ad03b86062450f476e5dc02065852daddf7eaeb94f9916708288273a283d3949a2568a4c7fb87409bdf47378200d415142053c465ea8d177cd4c241862cf25b24b715097d2cfe141bbfb6802a1e2a5f4739c7edf31d9eca62e7d4bdf4529a554453f954aa522cbd4275e4a29ab65b336435ff8cf69ad34f5cd148d416b4c4bbf2f1035d89286942c6b6883961f1c9ba4c64e6b017d5d18c774b2b583962da79524211c72875cd2064eb258ac9015d28e56fa6dc14cbb3fa75dd77564f7aa7ad947bfbcb250d00fc3d0a692d832bc338466b51e84929f0add32a6b0259db556dadae17e49a86923bc93d59fa47ffb535b3fef661c93741b9747161f678c326ec35099d2d9f3dbd54e36e51a4ed3ff275b49fa432e6d209e9c42016502f24bd9b75bbfbb74e9f2ecff6a9deafd4350bd93279cd0648baaba104ef8c8165dbdea57affa14c9b513c0fffe84f03fff42ffd490e82f7fd51c58b0fffb59d43eedd340f527516d9f5bbfc71cf2579d45feaaf57526cdbc35a7a65c23cc5f95fe1c6ad90da26934933a1685e9d63a9fdc5abd2e56d6dcd4f0f6d787b9ccfbe61501f9a5f46cb7fb3ac6bafc5c50ea51ef69a744f359cec835b41e1d4b8d15aa5ddd9d4f96caedbe452bd5f1ef7e2775542ad2f2b38e4a359f76ac4a562712c996d5a9f68c67baeb64cb7bf055df559fdbe19af4ef0f0124d9fdcb996ab463cd81edcfe994943adceda6ccc60ab5ee695da774bbaf51ad560f151982ea8554dd572a5d5275aab96e76df5fddfbf8b5be6fd632171b8d47c7eaed5e049c4f37bb5df755a78e951fd5b152e676df7dadb98ed1ef86b865d815ddb252e9efdee532f76c2aa66f48ed7bfadc63a7f3287dbac4332c9756a2fb5d5e51a24beb1e40c6d60e5f27965ff7de0ba93e453d35d24621490aa004932ab58ef4d1a37e1d7bb4abbb6412543d3ad6a363ad1db3fbfa37f951148033582c161a2c2d2d2dac19325a5a62d8969616182d2bab9696961515162038e79c733a3333337f524090794e9e73c89c25b0b8002547859d0fced9dd2b1cfba0bbaf7056883ea097d6da759df751efa3df4741ae3f5f2ae5b3c2091f5485a20a0c713a300cc355c832855dadacac7060c0e0072d8eb530eccacac68861adb576ded404c1715e90822b218c9506402170556e106680789964a796d6f3fb8f03b9ac467fc1aee6771838d651403dec3e6deba796b9cd5fbdd44c1d5b81ede443b04abf84b9a967e16b34aa92cfd817433054855f6ad575a93064161a3046062b15c5cb48dc40b8390f1235653dbeaa15cb9496154eea57561f5018a10cd07d7aae97ea541f533735ad48958ded1b6f6c8c63e79655c99d438c637e6aac487640c10d172b63e56283004b314baf24022cbd922ecb574721179ccd8fbf80fcd536361b9ea6278c98ee8dd9d3cca95d36d89226479383a289ea58b7f2741c317953f8dc1f4d0ed4717bb979e3ebc63898c28682fac80e886af772bb5d764083064f1627eb238c6b638c39f9ab7143ed8a218911c594c48abed8133123f759c5e06270fe8a718ac9c540c550a1c915a5624431254c31381b1bd936361b9bef5c1b5b1983bb4a3680aa8f0d20718513bef838e07f2d4feb8e68cac7176471c1fab84a8d42375c6e2cdd12013f08e0f19939cd72516214e338d291a4e3890e252a5d4481ba4d93739a9cd3e46a7e6ed344394dce5f35b61a9e9a9e1a221fa9e3e67d550a0e5485aa31b614038a05c5866248624cb7634b4489c1c5e0629c629e62a0624436c61b1b1ba0bf11bc4cb8261f9b211e7ff5b7f81809fac8abf448d89289b8d988b8bdbcac7054ef23a75254c01867c7e282ed7a6d8c37cae6af9b2b32ba1d25b54b1c79be46c32f164fa2581b9bcd8e4d4f0c2e06d731afa9634e1d53aad978e6fbfe1ba5999aa96985b4b1c5e06c6c3136b6189c8d2d4604f2f0cc9e664ef5fb4ec57a90e7ab0108c00aa7fe8a086c49934b8d42ada4275196dac5c44ca8d8a07e7c9a6c6c363c3eed6a2246845a3a1b4803d5b2968e752d3e7a6a146abd38dad8fcd5ad1e221ddc90b4e189c19615d78273591deadcf5b13b1f27f3bc759c77aec6b9322f8c71ba50eb53a350cbdb71328ed912ff8afef291639afad531b825a9ef2a49bffad8ba6001421f6ddc3a0a899f12491aa3f5978f356e1d855a9e8ee4e7afff0e3a0843803bf53b074755b1fd93f642e637ceefebeb7cb57e8a14420af9ba9deca55ec2235ba9b906dac0961397c4338e9b4d48d8f2bbfe4c6ee063fe89842d39ea32d949edea6fd005b6eca4a48e3d618aeb607091c1011299d9e72e4a9b8895a2a0dae6b59c6c3da03efd10baffea5773605b3aded3ef282038c7794e8429b3b142addf473beef63b4f8f568fef21c0b58f0c41e82381f8ab27cdbcfdbed4516e6ba786622b8f76b968b392957ae8e4f0f0e9ee4800b20c05fa31ba2505fa11c24892d25ecf7103dc9163b0ac86e838738cc1e4d2b147fddaed3c9e63b2740535aed121207f8155b896bb4014a85d211621bdd500eed40a84850d9bb0fdfdb40f959da637108180d7e692bfb0b014e8e6faa2dcd25572156a04dfe69c2328d9f2fbbeefef6c1cf5deb23e9716b6fcfc23cb2094bc4981dff0f88f8a3704aff2f30ba05bfefda811422e397cc337d8527c115d6c207ae1744bd166728e19ac5db92ac472114b9885c95028382f90745151d4a5451d2b690d8c60da2573bb765c9fbb3aa3b72e6c69c5276c498bbec8650d03bffa9b04f4d634a977601c13e7af166cf9851427441035bae50c2a1bc888202433c8c505c6a55de1778c9defec1cfd2d31d82b6cd9402575d9fc197209ba2e35786cc962894d44856a605df0dcb2c6085e35d9a974674d8efe10c9fad7bceb6be6a5ddf09d4eca386c0afb2d49d85274c1551e0a15a5449f85af7dcf2fed63393dcff33ccfdd9bb32369184448e768ca359836b7813bdeb74fe7f8e91cfde217b6b4220d6cd93eee4e3e29e9b67d6ed074cbf6a144aad8d20ab1b58b57b49e38779a38dc747262b29cb91c59cea85bdaabe4b58e744a8412a13f21a55bb8dc808885afd5a761e7e0c116826e611edd901a6159bcb065384327db07de155d8ed8f92e2a36918b9e5b4edbe4e91cfd2d1f2c0db236d872da40275b4e9bdbba0670d6f8a59cb9db6d02eb4e66e6394960d1dc2b194488c8644b86bafd41e63394dd62e8960c359b58cc5dd775d42b4ec8d37647138404115780fafe2f9c391ac059eb179bb0e5e4a13279e62d7b2777773a5636352204816d1bb7e6f387e08332bae5e7cfc2d7e8c36058e1e739fa6b08717415901bea1713d922f1f6492ea57e2920b7d42fbee5cc835eb4584a329f85af75cf2f252c477f4a0b0bf3425d25b07f5352d892de86759179b370623962795e46ca62e7d20057739fafd431558c1d342c81e08e9f270eceb0897297ef8e1994748c937458ba7cfd9f74acb5e3e7c9e59796e2ee1da3b4eb9f17bf834e01ecaffdce38b8d2eeeeeef93a362d6b461620ed498f68b0bbbb9d64c6c154c47703504610fd2c836abb6de31922ba0292298e4a6f0000005db52de98ef5b3a5fdde7d9becb9faa09b13078673ce39e79c73cec9d3d68ca3560a8026e2990e6e7f000675eed977489d730bb074c568d8d56f6333d1c5ef68f779dd4769f7341c135d16835f5ed751dafdecba2a4646401adf8eb03d7b76d3ee20dd9d21d4ddd3dbf6575f7e2b5fda0b63da219757df07761e3e4896e2f5a779f9f50dc97276e87a15d98de5049a3fd367f24451c9758ceb9438a983cd58479662d775fc8daa510342eee7a951037e3f578743cbbef54f2e690245b192376ac084ebddd2031af0ae47964378b6afd0d92b9cdacd55f7dc31fda210b11344c4cecf652276782effea32112a78715597895021575a0850a1f2f4c4c4f4e4899111235181a4db0720442611a8db36b7df47ff8fe6a6cfc78ed79db61e6c397b88f00c9d8167f8ce9e8e3577dc7593a763df67ad287e4bdf12fdbe02dc7903268383697c7001fae7af5896fa3c24d6031febd3aeb1920bc8e1050ca13d1da35f790cb994e4f15bf45738b36193c9f2bbddcf1e7d8523d3ae8edbebfc397af001db95f4e9760f76d83d48e9a4dcb4233dd8b1423c5f4df5e5a792e958bffa3ffb7dcb9b4b1db9e41a7de23084164886d062e8692cd2f344024a102931a4c40d93865cd0a4c1ee5cfe17d8885c2683b4eb89294724b7b3040ad362d17e0515151454b544eda8b7c4c377c5d315b822a5274b2648895fcf17d6a00291806c8b16a117c4154bec8a2e0d892b565c4144af00fac221605cd1b364adf86204c9700aade894603123e534a30a8b29b4e2c9678591154a6a44c16245901536582b789ee6e7040d26a42496d0a56715d1925485d1ada2870bc438c496f4aa90d82a8c1011a930aaa287a8068d1a6cb442fa4485e797d4858502a427243726e4e208c4c4568ad68f3b1793accbbf88efb28402d06341fc6e0f5441900b3ee4406486154850976c5871164d5220ea8288a163269a89d205f3260b5410115fa4020551e9c3a10857e1c863a189e9878a0c80804195145240e105149060f242d0112b2598b8418b80cd6a42563885931580fc32e7b441cd0953bb5667a15392b87a775d85c99030ed6ab9f5142237bac64af0f2331197bba98873f26119eed22eb8fc2ca5cb425cfe0a877ed7d5b84d279e991445b764a51b389e13ecbe9bddcfdab57ee7010e9604d6ad6439e47a2b9c94bb8b257a6b60defeb089af60f9f94e289791a458ba349409bda4cb4852105d7e18cf2e3fa5e110b6eff75d952feec7b051c661dac54f6b5515fb912c16215bd2d049ca38dc457e5dabeb2a0d1b5f7e1f3d97437a0b533e5124dd28826ef9d2556775ac7c7949c064b5cbc722f66b58e6b5e03443d4d10f4b94d4f86f58f643d4604985254c0c31d59873ada8d95e2b7d2720bff8c7629f4c7f66c1440b1aa8931ccb875953dba7a094a8048dd84531656a68000040006315002020100a8644a2b158248b1271301f14800f72a0426e5e190aa44190e3280a62c6186308000000008608ccd0cc8c0000004160518bfff3604a1ea1244f5da6d377257cf10079f11a5438b80d317129d8a7d92f2cbf20aeebcf3003e9fd9ec253d0d08735344599f389b135ff021a5dbb4beb69f345b4d757e709fd91c0c42dc9d17f8a782ec7ee195ed3552426cbaeb97cb1b8e308ab930d1f4146f19157a8da88c3b94179e70f83903be22852834f71700f306deb5173cc3ff0712e63be591a746e16249fedcd96610b9414a1a7c2b5028a1989f9c052caa02bfdb638f30ca80db416012fdc0b5026f15e0998a308e9a55e8ce54059f37d4c87c6a8a8cbe74c488e4b12f32373ffa3e7736b976c02c9c6080eb3c74b770545bbcd0167e38724c1a11ac4e47cc3a6566f2a5c2fb64b7df2819d97dac91c6d1968d952e46c2353aad454cbaacb7370a8b7736c05cb7ae08587aa99e67461962f554b85d4eba654087f6087d9eef8d19da35e01054706ee6dddaf4d712473657d7119155af2b18177006108b6d60824436ec20884f10cdf8a5aa9dcb5539013bc63bfc7ceb3f110de7bc83d3f72ab3955ea66823bbf511796960ef3ae91e460fd012fae6a8874c20823545b067775769d44d25164d627ac4418bb6f67fa204cf56ab3105b7aace8912d3d3c1f54e4eeb242017e58c81f882841d18574b8edde6df49d485c93013d108d5c0a1ed230c705d26193c84f5515b34a0f7ce273f8fb698234e7bff8d78a09d8b501ce098985b29a26280855516312a80896485f8f16ea716ff5ce247e374f014400cbc1521f4f00a6976c872b896df063066d11fe939a9977bd0103d3bc137f8fa809d1cf33b923764728daf4da2d2c463d908e18d9bfcd061f3b3feeedd936f42462caf73da9c2b7bcf8a055592e185d4f441ba451ede36bdccaa57ae43239103ec5230d37e80e6e5bf739f6c27d8baec04341e42dd67e0050f626eaf23b183f27f24735865d1def39d014b52db93eb8ec20eee8091d6e45600dbd89202f0190d571d8b3102c667fe41d4f4a7770418b0ac32c10d0233fd648989203f845c67c7d63fe3ea9678ee20cd71892b71611595890b5ed29f95f4e5b096a00b3465aaea76169677c16c093959df404888d9db1662f3db21924af72298c4b1f2b1efaf5973dcdcc72c88cb00d0114f1fffbce3909c061603ed2732cbe3f8ac17e914c1d8f99185145d68a8a976af592cd5dd5b8f893e655613397a775ce94801b495eb1b9838e965177f68c90d6cef9ae6389887313517b0f62b493f6a586982198f81251377271f1f21e93a28f948df1a0ca13631bb3cab8841ab49304b128b7ca793deb7500239bb99130223a394dc569f534d538ffca9c3fa0e3d8e72402d6caacd00e21906bba2fa61ce74b5059f74b516f54496f2080818cd4f343351b1b825de4652ab6a8b43ff6ee93de26485e3b92462f62d8ff17fce7414ff2ce6c31924f70e5aad58bb689882f85ad69910159dc02bfb7fc13d8f218a85499b0c9a6364bbe43bc45f61a8d13c18dfc0274706d6605635770e81fccb37b4a34d4fb479d748faa8f4c304b5875466d07774a2d4a9d7945d6bda05f4a4e1779f10e514b1e6aaba3af9db1f53bebe64ef6bc9f7708f77f41924c73821b299f4fc60c92066efeff7971c1a69676ddebb9723a8747f216175c0f346c2d7685c8e60fdb10f3f482f89221470324c21f6a0b801ca8924d1c8a0af16bea1be08a990b012ed74bcd09e62825646fbc72fc7cb7c9b0888e98068a20e79c094386152f4c942a052e4bed4c26330e2812514ead556549ae081ba9b272799c29dbf06731f518372a66c928cafd68a573db687927e9fde264af4e8a8112ceb61324f728d95ce6835f3b430a6afc1779b1e609b05c54efc5dc62d75dcae9a9883aeb1353e2bad99453f66ac0f4fad529e62b6a1a192be8a04224ddc93bba880492081a7182f4934ec1a87ce6f28c7def22bf394052a82455a1ec4a52581dab24f130f92db1d18d0358eae6f7e13b6acc43e4358d90fff5bf9ec055260130041e9a3013656b4f719039fe2a14b1c4abeeca1fed2e53279a03d031062904e59bee97b4b059f1a2956db3b7f2b3b26da40b21c832a25b683ff0d9c57099a38066c2b6663a7499369d949e288534fc27bde08957b9f06f53a565a8377be7537b84d35f747e73db7bcf2e841286dc8f237f7fc6e810a0efc334edaabb1080a0b0cfd660a181b26f6c9c41f582cb2f1ec5d25dfdb3198987db61bb428f08416b93c06ab9a94a952ea8419ba3617e7b7e3de787d1dd4e2e8c440d250f98b752a100d695ecb6857ccf6bc1e97be2405b0f617961a4f07a59829708cf1b588ba6001d9f45ef453f6005098c3c3c5246f50eaa8fdb12280557c12a2ac8d5480f366def9137769dd450f57707f3544e83367b23f66e7ef90211f925e022694107fb650806db0d2ff8289596d1435a5d6ba6d63120886ac2a1926f4ab7c361b1e2deb1ef4235c41d014d18cb539a693ff689e13085d48491a75f898eee9e09443a82559b3665acba6031483bd06762efc8bfc98bc246aadeec58d6935eae9afc5baeb229bcd230a5ca6eb902c669e8e4fa6033948fab743aa031b0db1a1cd2fbfd09307d79dc0c473f2365ff7891eee08c29b7c9df2b63b4cc8c4e85bf026965a39d98060881e288661dcb406e13bda416798e1875cd09065c095d5175b578b561be07a4bc11c2e3c3a91bef00d634f52e5ac0801c97ac59ff1857c174d03d8ae316f93d831a2faf4ffd9b79577852aafec723c013ef65e2fc59dacc98a99b38d2a5ae2e07024556c06e069c1290716d7bd25c6ec61bc602b0298f04bae8ea7dfeba0d38137f543123cf629513883263b69c3ff68064f45c1c7f702c3069726cc84cb70fe877acc71c7b024fa01c1284af5fede2fe634d00af37515949b8ff26423623b1a3c4126bb4ebf59582e401c122e2980d3bd4c61af6c32d10037ddbc863e313a6fee887a755b6f9fdbfa2aea4ecce9894592226728feadcc95ffe069fd845a06a2c4146b116f580ac642dc068d9c6efa10fa801bf7f8ec39e752e8b50c33dc2a03b2691b85bac13eca32693214eac2e8af8db619c85b6da28b2d1c359672720f0842b31ebac639a1725f94951e2663da29dd36d81c39617206b83b85dd54dafe100fbaeb484162e8ac45c6b1633d568c5133079570891fad2169e12bcdc54dae56e45e4d52b425b21991d4dbb18813754a3de65a7a7ca2fcec8a926d2fea927c048ce673e98a88014a4468062fe489b8c13c8918aa5e1e648514e1af900f383d725c3a3df04fb0dd1dc15eb0c92e4b532081c2a597ac00460fb2394f157ddf4347f1b410c6e63b437542eb51962ad51afa6dfcd6654827e59b5712ade3ab27197134e5d11206b6ec2cca1743b123535b6bd2ac8cb14e42e7e5c9136993fc5b109157912279b1810beaf16edd6915acbe4f0df3cde776bc2aee62cf7841f96707133790a27e5ad6939cda025ff3c64ee81265a32377f156363880493bf2c4d68d23ffd88900fc9f3d7b96cb7721a61c76dfcf9e12772e0d3f5c6a70610d2d6b58179b98b29af61dcf9239c4d3ffd7d7edd9ee62733d9bfd091fc4a02b42e2fa191129450c33245fa7ed735fef977fca0eceb78b45f0cbbb96fd2d0e4277da5e91c2c4c98d9818e9ea59cb1dc4703860d055ec2d14f0bfe136c8f11684a47aed2157ab06d4cc6f8fc127696f4afcfae5f7809bc562be21c9f1e62733abff1b377d3774c8d49f57e95626486f87102054cf47b2a61f59c790431f8520cd3648af7ecb051c37be27ae5e9a5f86372d70acf636aa7f4bcd4a98100c8272226bc405ac7859178b67aba786f9e175c710c7159b6b4d1e9f6f78c3d5f20adcb354e497a04110bda1f2d47d1eb8c2b8d3cc43ee4b5ab3f0211a2df5dd2d03004d10a90ca1c80ddbb5862aee10d339eb875f2cd230ef061f39edf39dfa50cc6204c75299013ad9dfd18f76958de04f877b6b39fe045313af0a57effc0952c790ffd175c010bc2e59c5f3edea85b940b2c7239715ac24fc4ed9f1cfa05da5e950905ebed2f3b1983405e27b31d74b20e0823f8b8ab165cc0fbad8fd4b713fb39c08e43124f6073163cdf5c91bd331178c74194bb18b1ed7c4d05e3212a9162bf6e431b82970c216850549bc22387710703e77044ee262631e258b40c265e73c4fdca3047c2d8f5fb241f85bd125fc2bfc77a423f6d82068a682b7ad3c894b519a8c3e41434d04184a28a34594df42997a0015d4183869bd98edc797b247616a379c4bb75ece80d47eda233fa638cddd5803ce542401503279619711f25dc41a2d8fdc71cb410077316900ad1cdf11c53db16e6e313f1591ee1f147eee1a1ec13d089fc690e0a319988839a58a6bd16a6d67c46a9d66b7e1bd7fb3f31df66000ed5999381d9bae3ef939fb70843e71b507e2a24ae951c99deb969166f3c9d7458ebfb764e9a86517c2ff8b5f45f837eaa749614d5f66ee2f1203eba02c0680103b48dc1641ce1ef6a640ed0bfe2f42f33f4366eff81ec6b93bc7397905ea3bab913d43969d99262f7b88904a1f544b93c6235ec4b6516d544804eeac6b3d6e9c00e30735d460e00394d21b09f8c5cd5167c5a8be9176b7322680dea9b6478324d50cc4f78d1cd69e187c7d8325ee35a1b43bd62470e75832ef6db3262411cf505b5de3c6c1950c75f7108387a84aa5026b50622d645be3cb33d6cc1718318dc6f9b75f0df878fb1f1e763aee2d12b79038b9537dd0925aa41140b116491bcdeb9db9038edfdba3952c80f3ca367780b58cf9ba4047f5c3f1c69e04e8db74b941a2318424e1f1b5fffdd7f103d9ec36cf549b2711caa6ba2d306cebf56ad5b8b4b4509159bbafca263ebfbf3d7ff7557e7435e6a6c36315f680173ff85054939ec043711944fe2890d792af6c1fda4ba9d4ad0298cac28784ff3d848c50ddf05fae8bb122066bb60fdea8c608f83cb4fe1a4ca21bd20991625ca408a5fb1e8e702a52a6094a96972cd161cbc8eee5cbbd10875aabb1d7a5284c9ef011f026e487cfd627e8268e6df2569802a41107592b0e18da369b65f45ab01a1c2584a319fd10c9d64a95ff6179e4798488f1df00297b43a6f846ff96aaea3a7bf4f507cacaaba73fab0f5b7527788cf6e35c93cef3af6da8f0803e6add85cf55f2cd6ca9d6605ba3bfb6519c1666b4d569a75c2cf3c59482666a83c127e5ac0b30b67cbe40c8d71deaa17d394b1d3bf493081a3962e0e218d9a5001c3e4244ab737f6efc9776c406b65ad05caeaa9c8f54b1ebc89201fad5f5af62293c0a2e57bcec31d86af25c334f297206cdc02dd9354456fc95bb289bd4f2615aa0299fac58b7588ea8e7e377bdc1053103fb575fbddc9d464969d2fe00f11a434b792d134fe704e817754740d04c4838bc41a57cf81192ce283abe1cad2a0e9adbb4ffb8cf70e8349b3a25ae4ded993805070fbb9d7f3c615264f43c6a15ddf419346ef4c79375d16e9c68de8d28c219d26fab28c7e9bbb4cbf834f4b4674e134ae270d772bf67accd858b075575c5e3182c3ee984addcbe7dcf04f0ad95408478cc0a184a858b52a64ab88a91257d622c83f4b92f04fa460f77ac9ef8cb990cb188056e826e78816e120207140ca789bd267abff4291a659a9768f5a0f6c8f0f942dfeeac1636e67a7bd43387c54a1a269c13d61035c88729c912e6103c41da5e1d3872e423340812b15155f884e5fd3604e675670f90d038d9d0be45aaab4a59db54ee65279839311e5bbb6c7d354ff26230b9cff26f87cac639dc661e955f94b8c7694b9e6b8dbffc65a8972b27edb60946c9f63b60974c47c61b4ff30d0fc7bbec802c5b3d071996205060d00e9bda20742e0e453ec11423f7ae4da71c205c930939edc41aa6d0aba981fe18453608d5fce806ef3d107863ef9c27f3d8bb00ef64885a31643edead7527b682ea06261625cc1098c91fe51a0f3018926bd97e1ee84160efb99cb73b06d2f15be5d80625648874c3bd8ce565efe1918e0a621ae04bc6708f3520065797ea11fa10051f8ac2406fb4d8663c187a4f3277b0e11b082a7c8b66079e1697a5d8a5e96c4c91e88f3b1a9e66c9eeae4f39acd194e499a44c53800f0e0a7d3a400ea5c815d1a934fb8122005f1f232230fc0126b84de37623ade35f29cc6969dfd64dadf6d0641267761b05da3717a4f008df0a9b1001f72f20c800c02bbe66d717cabfc1f80e0e03d8029a3ec8c219264b09ea1fb12d7a898796409b0221dce14926bc3950167429663c3c3c1d599d95e3333f1d28263f9d2bcfa650a555ae91c904b2efb1d31b39143e7eac2f13023c83267d67e7ae7028aa5f07f65d7805659bfe59f268446329d2bfc2b1095bc511eb52319130a15dd92785ecc394a865974f7ff38d39a7d5da0b89805eabd1c3b5581a4c7a5c8b37683c394bf93b5846c16f3b757d5e0e6aacc9a42cb69ec0235e07fac60ca06b852b21ad81cb5e5ac42afdf04b8844c1317c9b9c197b67c4d80467c27dfb564e8b63713be4098d0021ee3e65b1b1d3e10a6aa53b19cad5547890634caf1fd16e6295e092f83f1a782473cbad7229b076b985015aa82edc83a5d42afff25d0c6a6ee5a92d8106e1952e9321d2e434e05775f79bfd85234227f2199cc40975bdd8f04e4772fd5aaf8e21fb0858d73a1433c41b3293cbca3d1f7109a66995f8958af02deab0caaa5f2098e22259197e9cfb9bc22cc6bde94821c7bc6c071934f0a0133740fa2c246ae2614673b618a740c4be8c3deaea167d567a6e8d1ef8bf15a6618b40e9e94f59b2706f32f02b711eb7cdfc03b0849a5a5c15f80023a6368a96bb890d32e5b4310c7827d4eb98c64fe3e554e2d16fee1c6ffa0819057df9612b1bb0e007a7dcababd61fb74cae817c72eae97646bcbf8e00ee54655597dab5cb0a80ac9928a1e155b28c32c3d9d19080b314df96f37c0caecc0d03fc1d4563a25242c28da2564418870d2048e48213fcc55af9d5c0ace108e9aa60174137f462149e5241a5a9480d2364b164549fe5070dc1f04d3935daad720bf5ba114d9c79385a936ac3b4785cf527fcd4a6a4fb974feb1b035efe411192629415c6dfa37aa4c4bcb2d4ff0dd807691d294effcbe87afe45a1736ee89dfbf1ca8e008cf38f2529ec3fc45b06231385f69d719f7c12aa4ee1a5e6e0beba1e91560b3cfc009c7963b8e52e34f5780c2762a4018f49ad45dcf27a171ed5316570e222bd7854bbd103f20eb1ab99818b0c615106c4181344c153d74c5249645a6b2b6fa6e442cbd9275a125975ef05e5294bd043436a0d50bbd6c103b16d1dd383708abb31af5a44b448eee00181098408cab68c0eb37665a94fa683547537fcb1ad7471d1a45375efaf22b248a5d10e39a2f23486c01cbc017dddfbb498d93e02bb48bfaf7955c816962603a3c74a9cf7baa82e77c016aee36f6259fd2d36fd93948384d86349b81511124235748d6d9fca9f1409dfc999eaa86f94a1270b8a2192b88b604073617627562a2c0dcfdf227bdf032be38717d9b42b4386bd3bf7475d78ca028142a033505bc2f428c9aa4d4d291ba5607f8471731c173c9a5fda7302a0e4e48cb059d8b73d18b97d06ebc56a82e9b5b60e4bee86899a61bedb81f7808e12d586391d025fb1ad51ef606a8da2b5021c05a97ee40a08a1c564036f9d5f7bbcde42fa6c14f6b4d2673de913b3aba43021d42d935be8ba51f72ce04254c10430d8b92cbe0d499c1c735ab2daa2fa9acf7bb3ce9787fa0f3627266e85c142a73e31ff9ce44b5a31349a69efdc149508e147313bff4484bd0432ee1c863b22e307c66c41bfc44bbc3ad77cbc88726098e46b3995bccf927dd3da36d47572a6f8b4124059edab096c68c37c326df0fd7befd3060765bf72fb059c4c28cfbe6e18ae40e4b764505f6ce1f7e3b3b40adce52253e32083dacd60ed7c7d8d2d55466dc967b8409da6775ac6b627575e079d8eb54a56b28ec4508e5769d7311f67e8f9a73d1db114610ef386f5c073eb008007748bcac011e42ad89f1a9de8364c16a72ac610ac8262a0534501b9b3a56aeb8ec24cd0264ad32d61168d91a0ef1e2fe9e9cc3ca7124305145bfff865e8bea092808096ac88d21a416ec3fceb28260cf34bd80f69e15b1413932f49733a45132662551607818252c594014c9be4e41d0cdb44fb40f0dfdc7ca9e39610016c36195d3b43214d6f2c61c0117be1af858ab764be561444276f5de49a2194eaa5b456bcf649b628b9c332488be23920455bdb3109bd7029a23eaa0bb788377d08d0682a3902cc6ac0716430a94048a2494f2f7fadd0b21ef25b1768f60641726e46c2839457e9d48c39aed5a141d0db5f0427c5702fc671b05d1190b652afffa26fee42c088441e37973ef7c7c053dacb8085fde60508449464a7c1abe2b5d2b2e994cf6d2bbfdf5e63b54c0a64ccc13dbdb41d11828580e1017cb27c40950e86062279fccee91059c64f1c698d6f3aa0f4ad95ffc75d831a1f1f2d0268f6240b5a5674b718e76e531e272853ffe49e7d6dfee2dc01ee7e5ac8aba3e3b1de0980ace0bb6ab1404e24574aaf53bc727fd6825d2ca5d5d6a5a179cb1da453d233e879b6b8005755911adba6de425bfbe0dd31eb0eaec5b4d65c125af604496acf8d75f5c196dbd53693b525cbbca8ba9159f42f262db4de696454e2da4fad5bdef7ae6e984c014d3bec1b24466055bf79bbfed73f8298b6cb5b8ebb622e020380b10bbcf1e66617e4613a7b4f59fd93a061c72ba248db75b735ca696cab0e32cf9420bc3319db116ece8942fca2a7831a1dc7dc1998adf86f4862e8b84f5efb2500e9918e57e27a6fca0bc323983353e60ac94b74d5dcb4271b6eb665392a8d73adb563a7b4cc149e32951f1c96527c4c2f4aae3484d2c394d22880b675d503802857a91ab7702c71234538ab86cabc67ebc4e01c4d13c7c667e9191c9c16df360f1834ceb01812745849f610a2253cba1834ceadc43892c0124ae791a7aea6c5293dc4f07878d7537cb719dd03f0a9dd3ad45881a8662d09cad7103a2a7bb93bc7941ef4d3269d1883888ca831f98f9fa5e7e1958387fface78a11943f8d5df473d1f5d6298bf9c0c1fb6ab9fe2507d12d0ca69faf9bc733827a228755ce5e26c3e471c2bb216c67cf42b8e671d18e832b216d33e5c6785efd9b991f2d9ea4e149b9a178623f872dd82910799ca38e2e564bb372af984e307480c5721ef1533336e8424748dd0b87c3a07a86a83588fd4258cc1042ec03ad9983b7385b5f2db6f1131c9c8605254e67d9bb393cccad189451e83b1c9539cec518eb456ceb13af7084d20c49de4cd65b098aae00e83d0ff21fa208fd35ff65cc0898574e2bcb756c4178d3c16cb27f8ed5f23d7691efbeb596223aa99333f6a0643ca436e42a7462c0557712bf606cb4a5ee4c57c29aad319e91663d3bfc402d514935fff2dc784feb56fc7262653976f06c3a5edf0559ea5816e5c67a91add24a82a669efd36b5376cb5f75b012e81e3e425c278192f638e35da20196e9328904338985176756d6076667d8f930917380b1bf4dee05bdc0345937c16101a7792c4b1e8227842243b7ae4be793f82828e6dd4ffde04e4d6c56f070a3b4d182748f8ecf2a3804a0ef83526be9d9276c8e67c1bc6d295727882f5a3214220349c9fa3d95b2a0ddbeb8b90f2e32931a654dbdfe2cf9293ca58f1a345f2f3039be0368f2bb15f312c2a5fd99da81e6221f063f4787f69b9db3be045bf5d856dde3c6c0e3c65804cf65cbd28b061a8817fa5427baa029297dbfe11dcdec5622ea04d01d964a353e8664463f57f95a86b92a730638669d81e12a6600af4c06c5c6d27811e0acaab28b2d5a3af3354eaacf6971a4509e5d2dd17e542096917cf8fd611473c988cb341b7e9e4aafb2852d4a51ed369cf0a2b0a4232725a8f713e7fb06d7de5cac825992633ab11900a2a2b624f3dfbfed446d834b9a5f70f503c95e6f58070c59aa9231b441143519f5e5b6f3ca6df033767dcce02a614b5624892085c8c24c6db439f5ab0151ca03fc96cf3d0f43879abec3112b3b00041d503a1abaa84e707d026bf200a387b00874b98a8e486dad34aa703c4e67584e5969aafc7ea20063a2522c373f7bfdb5445901749edc66e157e0880b732c078bcffef47a932bf2cb92799b8076758e18f34cff1ef9f6db627bfe748fcc9892afb0812a87d11e61dc78b07cd242c42f9ffe271edd60c07b4caab865ac074382fd74c6aba32f9c887f967d1faa7ecf953be480a3d88051e791bd1251db8eb0df0ea767f6ec0cf989245df7c64d86cd80645d0c36682ad8d980917b11629f8fa5775717359f3e8154c24da72be80f02313f1cd1449961a5d116bc3f94d3209a5d35d90e2bcd287fa1a146ffd48d6dabb45929504840ccc5109778a0b0beb06867bb0ae84b5a607471a7b24bc4b98900cb288abd1ba30656a0aae9efef30758e2b6cbd13d5d6bedabe252ccd021f47851340bae6d020c1d33f029a115cf0c94a92256cd587c6c298a93d99805b861a0e4c3c696c2738d30dde41304e90d4abd9ce62ecff8aff7f57307710e67660931b5cdea8d9e63a04caf43b511a54d059eac02a4a9dd0e6bc5990d31eb8aa9df84d875e7b8012596dafe1e003a6567cae9c0060eca8122c7ced08d430111c947663eb1c02d606edca252c4913e2597ba1fd683681669a50e58af27602c8d3ac2a274f84211b3ea961fd6f6effc45820291dd0024527a680d590e66015ac126028dc999f839b64d6a76ca5e0e8731f6e87543f2738fc783d780b4abe117675ee0b96ab6ace7af93e68b309c618ed6a42d91225c60c8f66abd7a7ba05d4248c80c32cd59b2cb0bc3d75519490b024acedafa60ed089a8d66b94087871862d955c7d1cc22ccffb12a304435b1917d642f5bb2b882c8ead78bdde7e12051e042568f2176e7cdf148ce8e7d329c16f1e1be3ab3c7c27a3416aaf3685890ad22e25bcb371ab16cc2d6864e3d3620a24357806724170bbe0d2c83682a0ee106280c17825506fdd19411e453ea01b0517f484edd2a91c4520089ee7706dbfc962ecf7d955cb104e119f4acab2e31ac3cb51b5a65fca332742aeaf439753b754c94350dc7f70766ebaa7ff0d4cb41242091efcf3c75991ccf64f1c8be6dd2835da9a96cb74971c5d815789bb45cf0caca8963cbb03c31e35b0774c065d77a2c4a61d74227a7913ffeed4426281a8d2b521207d05246281fa7266076e6c0ec48365a0c5d222f6d5132857ac529548fcd83d95230c08b04dd9bf84aeaebbc68d173b9858ee46474ed409eb64126739cff8b2fd11e1a4260d60c6535e8abba801a5768861618b54357e38e80998aa59fc1b10fa0c845c2822abfaa59afc14ed19539ef0548e47e173eaac5b8a5007174a1afa80b9fc827e3d6c2dc26f177f10d60c8676bb05588eddd2988b986fa8b4cb1544c35addaab5b38f17894993f1b9fd7c4458362dbf6854f111708fad433caaf3eecb7a3cbd6b286034450926e03a6b0588fa4842ab25347615d218335aa339414fd540b4a62000923fa11634fa2a3454d4ba597621563b0e66f628a8825bf44f713f56cb5251bc83c48a297b23680edd6de01f2599a146228132305673b5d55731047ba5d21089a785a1707a0001411295f30d51ae953217666bb7a1044dbe7749da8ac3c0a8f0277768625c13771517ca157d808b5df83dbb9bec7f8d12c54271801f6af817e78889acfa8686a28fa572002708850504305e26454a1000479d43ffb8dabc8406f94fc76074fef8fa72959a05697a496f028778100feee3a587c74d3738b9a591a7f739548eb49d5a54e52e05a2ab60444392515653d81c1faeb4393cde16ddd4c4bdd651eec06196d1d5677c5f2d883f63b111367349497a6db3c0d3961b785871dd73f0ef4eb64b2532a4bb7b30e5443a45fb93896c6bcc55429f43d33b43fc3450d1a2b153037db8fa2a259e4b13380bd587b7dc398f59e8895c150bd4c3bb68ee5be9137a7c0417f1700fa534bfe2c5d2982ee922a3075bffc89cd9a19420d432d1ddfccb13640f31271a7c5a93c3027062b22c8cf049de2162e4f5c4f04910aaccc6caf4c91a8435a0b2233c78a483f12eac0564118d6ccef42512684f3591d008df66ee88d2d9733bbe55280155942d0b13b5edd03797f1b7e1375c633d7b0f4e6e36cea2003c085adc54f0ed1c8aff3edbd69d86f39577b0539f7f31ea44aa827f34f0ec81e58d89d59ab376d72d222029039ba2a923d943a2b6d79fd473da01b538bd6308e22fc30b101b21f5ece1a6c7341faef87d674e75b61b77d5b4c1af68e59702ecb391a7036cc5a0d9fa10cb02f35570537bf30010267486a3e6510f086c8fdb2f986f7a484cc31932c594cc29596935309fe7f21644b67faed86d86b42abe5f567deb8569c43f04d1c30cd586e33dfcb41d15a38d7eb766b5623c23c39b33a320e06df576778c539e2f2be39c8e65baf3e9d0d498589f2a548d04c5402077edeb914989ec24b1c25ac8e9ac3aa0b55d149fe885d5a4fca0a132fa346e47d49318bf6e0bea4e09e9fbdca7e5291bdf48671905211e7b1441c153f567051f99e2c67d8d92213ddf17a5262f59661bde9f16e6217e3fc24e32543d5fea945d8f509fd48e33e5e6a8d10ae0b11450085c22cfb48ebbf54cde3c29b8b85dd4e7ef5408d8cc3b6f8c5ebe51beeaeb2bd9bb92726f901e42d150a8b9f7d6e62dc4ee950546fd1d3b044eede02e052b976ac5f335555cfacde2c2fbbc574b089c1b73a2d676ac0c2a1fc6a5dc5d4e7e91446350f1aa604eda717b43345be772f5d99bfeba3305cc30fe4bfd8e4113ef2751440b7a5570a156b02cf6dec1b4829d2ee55b442d7fea504f36121e3fdfff8bc81f4769ab214e49981d37bf3c24ebff4bd37e737b3c21a831b19b87b4922d94de928b8311500993a9c65fe31656d0dba2b9c82edbd3cce6d3c453d3e8fa75b0bb948c1cdc651589b81e649ea1c86aed198b312713dc94dad8c15c25a85a1cbe39aa0418a4b8ab70a30d7aac22371dcc8e3591e8cf9185668f8c37d1cada179ae8198566a099d8ca90d6bd2a3da5baca5cedb9dee6ec94cc6be2d0399e5a9bf0bca51cc081a3b26dd772dc9a4d7768d41912a232c2ac90bad993123c0c71f643b9dd34d1911a950b9d2ff5b2c812d6c16def7ad6cea44af1d065196a8f13be6632f3ba1b55da13152019941be3843dc62b363e74dc45c66d9270ba8769a685613ea1acfdbd74b10fdd773cf32324f3f910aab586bc5da92eeacc5aea210e08b87ce130d50700be109368f955cbc28ab5fb9d3728601f16b0b934ad407c592b5a7ac480ef89b51366c3696968cb2b5404704f95c09ba815321cddbe177a4b2daedec6b393e8a034dd55b707b92605a57f41fca258edd6bca76c78c2b17f7141a29415362359c7f12047670bc4b85161984aec9a39f476bec27d605739ac026ca7816bae6406ea090a91e64a62be19304378c5846ce9f30190aa303678dbeccb18985ca540b08cc06ec1800dfbdc9d02d40ce3642911ec56ad73add16bb1149ab04b34ada42c5a437f3b568a15de99229dacb2ef80557bb45687791a94de59d2f2860ab9650931ea7a2fc4a487c188ff5a5163fbfec4f4b084685ceb3f38f0b200dc677108c0ec70600e714284386986c1bb93587f007af7a477ee29859d930b27cf5f639c6b6e6eb92632f24c59cc98e2cc21a736300eaeff4bc9857627309424f21f8006c5a304c008ffda2ab81b7ad4e6db063b805c77d4e6fc09807452788fd0819ad17a938270d038f17d48d4a1555a96c28a40868de6e66be168ec7b85dbff1c65c8165354b27d37ee3b58abbbc4161efb51d4f6142218df6afa68463957a182c9e19b9c0d4606f8132645f90f8024a51d0348c725915539161991d47373ef29177b2e23b432966445b9e17613af6c160d88b1371f43bdc4dca879103857343462168b0547800fd8032f41e999b5eaebe149017b89bb00cebd129b5ebf84cdfe24bda241ffdfab24f3b76420c09d22133d582a12c03192dc1df4ed78ef5373843c96246c774744168c5a5f7195c5bcf9f60015178358709070054ca009700291daf0c1bc40f182f53e690886ccd0256fa55a1ee47ab8cc9a43522d281579f84926247f1ac3c165bba35c4ceff178b252e6c4536729f08801e6ee578bd4624482e23eb90dc3ec724ead253c6405af6cc8502fd9ca7c18da112667d037968c4073638352a35e6479a805aa3a8062765be4cd3717464a2282299e01b318e5565afe2772b2f7dc85efbf5e6043e0a466c160fa2b5bdb01bae7c62883b9d8359a1c37c6b0a9a0b5a6688c4b3ab1c6e1618589d79152d1a9872e667ac9170caaa68c6bbefae67a89ac588d6bab9827a54be3901249966b9a21d041cb2099c087e15eb3a9394cc13d929a25d2c52eefdf561c12a37b15a94c09b3188a4508aae58bb083fd37014c7764e02e72cd2b9ac1b7fba4757336837cd054a8d1608bf55e618f08b20edf52d44a0b43c2e78a4248971d2a6f576a261d69079bb04ce048d2bcae59ecd12f0585980219a8be69d5c4e95506f2f8aa8897c48597b865461cdc468da0741bfee1bae16f17ad959a4f4e2bb89fc28dff74b0e86aa4879c3b58825ad89ac0a5bee4789c849a13f0b16113b531fa8c08d99bea204e9be3a8194fb9cbd9f56520e87079d935f458affd015b3d253937fca68c917212caeeb953571d240ee484d23e79f04e704e189263d27af0458b05967104bf778b630c39d82902370075447f928412b9279f321dd1e12366098b4ac6cfdc7cded2fa89e7c0c4b9396cb12925a26173937250aa1a9505c300e98061a74d95f71f36dff3aba8a3bf95e218f4bce692ce4e905fda15553d2d6b02671652c379f939c9d8a6f5a7824205208d582a322e2b574d20455425cec31e647844efcb652226cf50f1764ccd2af0275de686eb3fcde2270a1abbea774d31db78312d48167ca7c985331f5ec32f15bf9c9b244a77d9168eeb4249799c1f9bac3368a580a8820358fc69eb59de929d26964f17642cc266dd0b71ec19500897b4f24f73ae5121ed5243ce678b422e963990429d7a9df18939bf1a9189921cc4ec49ae90b3a083a2e4b88ec7498bc3a0d075988769ca631ba530be1762d3e307bbaa48ea1d661d2987f3ef10a352ad30c10f72dfff737fe9b04c32ab0127e5b088891b93ef3a4f7a68aa1b9b6cdaa3452ff42bb924ce8878c333ca48e83efef0540ab108818a9c6ec030299167c2f4d58f1463ced8a18a91ec5f537661c388c346e1222709c1cd3c428916828b92ae4a5ae35cd7238ceb9d47e28f9b9e07d4ffa2a14b7733173f1fecb2d13476632a49fdc9e66c4f5c39d7efd466af31c22e6f2618f2a6282bf60e70b54d28f46080295ef581d3428305c3c59f45c57cd8be961d21f323f26d7e50410fb657ffdbbc0ecc09097c620f1877843dc0aa1c5f5b5013a87b84193bde03ec24c771ef760dd17a6b7f4481e8d45cbff7cf46f7e24af07a8549b8dfa3c4ca74a68bbf2bc67640ab0c0bc723fac2ae9cd7f1f258c84d25d06fe3472b74782bbc8cddf631dc2dae898290a1e70a618014b72fb71bbcb8680e8c78ef2caede450906dccc44651f97de4c8f1f0ba64d9726c0e46308f20b86e963b1b9e271a05a673202b9f3d1e984ddd00f4dd997de06afa6da28629016e4bcb43370cd8b76954274771bf976e24375b0ae8523649db063babe52017782c4c47e7923facae914fdd2318364392177ca873adc2f09d7dd1dfe5fb5d648b6b55b74ca73bfba8ad52311fd9acb34f217c5c11d999238a0fbe2098f37edf900b0b02971c5d3e694c51f55be12ad1f9dc315d0c97f0a58e0609deccc6b9831f33696b419f6e147eec0b1ce6ec36d4b00c77a44c3591c0ec6162b7093736dc61a78cb851b96d7c774d5bd11e9c8c9e66d98c2a022db584eb546108dcbaf663ee0a3b23a93f04a150d5ac9e1008a1088b2f3caab979f9119ce3943315f0bdfa318d41e618d3fe8738469bc575080177e9f81cc3413247dcb24a668ef99acf9875ab2d4702c9a9f713573b776e3d3fcaaa08487b1d001a52a7192e25fd829a9729ac45f3e8559bfedfa4996121664888763f769ff15970e7b46f5d0bebfe65760c399568f8036945b31c9a36944ddbbd7dca358ac96d9c51ecf00bbdac9428a4c3b64e5ecde8c4e5947c7477b1ed413927b39ce3b0c0a6846a6b69086271a88ac697dc42f2248ce187714498de529a8382a37e13e00f4015d0c00482a106110ce1fa2c39e75dbe305af2477bd3d52a6d308a221f2b0a7330881f0d3c42560c83a1ad80250856d7be3662c219b2d897b209d45ad923c94b844720560b5f611877be0f048f1c5683c12ffa97f396a2d2d67d3a41fe5d56b7d749bc1ae62824be02519370d67b693fa8bc18266ce586800dc9c518dfbc20bd5e274b7c10c1b04306fb0f3d46bf675ccf526d1cd4f06361f45f9ea7de3555c3ada04b4adcf3041f16610eadfa0652ecc688213ad77d1954ddbad74bf34095fa93ce84528d340b82bd024f64b17d26d4e28e6fd6d89082dc899395a2047aa4a6d52c62bf3d123172621f9dfe380f2718e87d8ae53f9a7dc30041cf607a396e24e3201ba004c03e23d7d15ef1d19b576515e59cc285fc9d0537b1cad7e66673cc852abff7e2352700676e6a5c40ab8f22985c66d0713b251d7619d33d31ad0c8f02eb35c79f45c6ec28801ea8283e60eba2c74d456609b9c0650799a4c820ab1f2051c303e1741dff1c8ee91bc3390f4ffbdb62d117978372ca01898cd666d605a80b72e8b17035ed52176f72a1c4a3a049e4e6d3eb2197f7fdce1575edf702779626c422611f968dc31f7092539704ca2a61ce7101ccbf513a26eec7d6a3b09f480fe8309560f19a7249b2ce84366121a96c8ec60c904368bf28c9361d13dfcd7cc142380de901933b031dafbfb54784e660baeea300893d638d88e31f0f883ad5e519606620b0291ef970d10cdd5711c0bcfe450177a0bf2941c5cbccf9178900450fd726d711f2cc4c05eeedc0264ee9b8863868faed5440d7bc5d02fedb6c0454c4b0752c9ae463995123d39a4fcaeeeebd320f4ea4f40b6a261cc71e49c5bd9c4866644b46244e9cc97932dc6431468f94ee9ecc521fa5c433a1748c2ab8fffcd7859b3308d3a428b52fd48578e84fd2c356d6f607fdf5ea8b273ebacaa732102f2e3e149467df61d2c3595949398ee396411fdde8e34db323c439ad791c97fb88b6aab5886a28d4ece32f3afdb41df26f0a3c1263a9a6b715890492d0d6b6361e28da1a00f4eeb6e477f1c4ee035d85ebeed5defe1c6554d26b122f0664ba5b230cb9d5cafb8de9634245599afc9519d4b8af6905ab4afa3d2287b5a681f088e9e45d5454ee64fdca87b5369f117fd689726ac8afb93ef82794e2535f9e8d8480320b828dc5627452ef536b63b7502c8c7ea3a0b3770ae0c23028616f3b668251d287a0079412003e5cd7a71fb2e0a7e4c086bf7aec7257bafc2a700429df56a7c9a91093d93cfb12979a6a3af2870f42d4de7e67b13d5a40c601e5d1bb77daf66512c23c0c69bdc79d49651562ab699e878e835a29e9708f3604b33cfdfa76335278b1e2217912b8152bba10e540c73ff00b7eb372eb454b7339bb726f874c4d7ae4dbc1dfb76315f4ec632f85058bcf49da3c1dc9048abf0bcefe5a00138d25f4092e089db5b67d87941765c83f8027a957e17086da9608d057529e23aed536b2440be04e4e119b401bb225affa861a21a96f29186d68cda1f0350807cd9611ae1a08082d8064db0b0fa416313c84d678b5dd792e64656478cce775371a44eb0d7e08f4dcab1d5f412aea256474b22ab0e87aa064899389c82e55aaa1857906f485cb4c3779ad20e4e0edc362e513e9a5a2f1b6403d2078f77220ea2a1d6423b3eee9810794d2d196eb2c28eb35f42008c416dc84ce57258d1fca9247fae3cebc50d65f61d740870bfe8a9d65170350dd833c7c6ef6e5f485ed04bf97231a25a5ecb65b328362b14fe81d7994d56b50ba30a0f0ef172c25c9b76efd367e2820056d192e11599fda0f890871f6e1efc4643a70d86b908e646a0eda98e3dd5f3850a876d7239b2e15ab632a0eea10b48ddf8e869a1bf6d495797b7518a5b0a297b7f454b4bfcdec4d24f04bc039d22e9102119548cd8dec999e7f7d69e690fc35bdb8575ff66d07d22ef0df3c94a8d8a1417420f10cc68f67ea7e92ff028b241fbe8b49be434902ad661c2520f0d97b159b5d1c9f7ef0190057694f49ad42fa9a469470820324bfa7420a69333eca41e86a03fa980825337548ca15d0e061b0f2860d58a86c99fe95aaf26be9a66a82edb3b0ca286b955b2e301097bfaf290b46213100d043107b1cb76c48eecaa1aac26da76c1666c4f95490f0de95a466d4e2851654d7d2cd04e561d1e1b9eca4f2fc4985624985066cdff60b099b362f28d5dffcb4498ec2dc402d532476332a6a7478beb9c40e79e262239d9ea98e145510fbb5f044d9c5ee8f33d2a9c30eebe217ab5659cc5758c41836e054f62d98c17c08f8ce10e2a4d59b1b026740054af24d7d6f2a3b1330e9d0410b0a1f7a1fc44592f0cab840799e2a2943991b3867fa21e4c9f8cfb43b6fe05905433d7b3229f5b1b6869a360147352935a52aba30474daf5fdd66e434589c1fb65e9fe58983a92c5f1ab1d2dcecb8b3322c357d76dc5e5c9069e7dd3777c159ce85fd9143456ab8639f68d984c89329f5f217a56952e2ca176bfefd9878d542e3b6814b0716e4bab84538344a228bc0990afe2b555a54ae2254d1014726892a189258551309d564c00278661de1546024dca669ecde5ab4e9c411a810a58bb67df2c32bfb121f20be2048a66c2ddf2c925ff1a86fd4fa29f88b4074e3a3a49fa594e346af4a88af10ee334bff2011f0920b9d7d05c067915bebb020c0985aa7e2911bd9591d43d30102246bfc60f77368eab731e65931d9cb9ab967d40099448f40914905da46d0749b6a7ca9d781fbae895714bcbd54288b5290beff4caed2c7192a219b905ea1f9b83a4da18138dca625cb0aea239ab1244411efd96ae1f841a586874bb7e7ee7b0020b2b8b5b9087b2e871c0d02b850056928ec392ed379f9ea469ad2751fdf90e837c9489e4632eba0de9013e3d10cbccc99ba6f71e30675ec9adf0073c7969eb804650823b39ba1252b44ad7f1ecc527f9f42c59acd0bd1821f949fe5d80d3efcce18618bb51f941ff02c4d0518f273f1d2d118572894a430bd73038534da5c21a483f649be836c0ad072349265cf39b37d05198bc8a0a2f87a512232ca23ef83690c9465232a9a3a8a7f2afcf3d1d0a4af43f4d64e4137f9c013ba959cc00c23077d02a2b1d4fe3816ff7ef47f5ebf4b7e82962f0965e87275302b9126b235f3f6f8347f6aa2b4d711a70a50d7c9adb29f3f45d7e3b16539d381f75ccb0592c5a5c4e3d579dda4bdcc4dac771bc98493e266cb7b783ae2f64395a3b5d1384ef1c15319fe70567cc47763fa60116d7714b59be89a6237525587fd5449f017fa623fc198c15a0f06bb58f21fb9b945ee89979ee0344d3e553309d3337f6e97b0a68ba42dc350ba22ba52b7c059fbbbf8371f654cd043b5e152044c45224ba58201039b98ce42c8c320938472836e4e2260d1326eb3a30da0bfcb6b60572f79b944302bcfd0669b4ca65c4a02aa03e70bb78285b79bb22017a41edd2f421baddca72d5601b604d244061fdbc9f6e39be1fb5cb4b8d5334734706f7018b2c759a38ee3e3ff68526a08f085af5252838e6221ebe85ba6f808e65b23e02b119e729d82faba2d618d019e83b64ca4af7cebbfd0e96280bb42e5149113a135c4ffd7632dff52118036c12c818da6c836376ddfca4a1ce95dbe3aefac48609e2f2230feea42db3d5477e1f136cd5e3248b04a0ce71f1ad5e62731788c56b1f2d3253858a8c5bb49e6214b1c52e1a10fc6220180ca3fe3e6f33fc4efe57f8012fff1a5a8a4f414fa9249c15a424686c0ffc8128cceae318c2277096012b654e12e433bc7c2ca72fccf1e03bda751babca01d9c296651b641126cff08282c8cd873e8753b680f2c6fbd620ad5047737d4892acce891eaae3ce4a2652c554773a49f3fcf3681b18f4cc3974847e724fa7aaa17acdd153a444367d6acf40b2f5c4740170d302ee004b657fe7ce19cc5cbccd10f03af0ee6c475ee4ffac96d683da92f443175ad33ec967b61a1a109af959d32c7a22ad30fa659d0c34bdad8852b76c2d55c410c81104d0a468515840ba7ce3a77bd254ee19dd2c988e0df5aa03712915d3a02d5b2fc0e7638aaca55da941c74d7331f5427a604ddd7e16063fa0fd5f2b8d16a314796b1d892034311d7a3368fee4f3ed436cfbe0663e02c6478b8e77b9ef10e32c2f2bf6ce87d48ce17ae2af5d44452a7bed5de90590f5230b9ee543d317a0747047480c0c66667137fca0cdea23b267d565c454feb097b8e40b20c3063676a45b33430266537890b2575303690a330a360b5961460b3923d7c60c8c29af2f8a179bc096cbefa3a055eb45e6719d40c9218adf9b8acf85224b9f78f394957c973649a620d72b02b2dc49a4b01a67b825becc2cd4ba4d55b1fc12f08595a264aeeb247deded9ee2dc5a336e138ac33629898984b96b1e722323cbef4f5065a441770c14d4a634798b635ff68be2b5e423cb3cc1fed3876f90583f9b7010dba7e7cb32539e19118043018346e395aee61c0b66d5bfbeaa7c248505a5daf78d8ab602d57e10ba0c65af8a796d923f6cec70fa4a30f686780ab3bbe1167ae4364f1fe5f761093521c05ca6f6cc4ac573ff94146f88e7e6e2ba137192ae967b6b7b507e8a6ee861fef98c20b19090f0ca38bbe5af0cc5afaa2170cf5974959707892db9f62e9555523b87310d79061ac26ce2da33a98f0f4bf38df8e8dfc4edf186d0b5cf1c8bbc547e9d4f288e67aa5ff782e8dd21411a2ada5a422c343102282635165912d528722b3e0f4f284437f6eb166e065b03ce98d428d8e27285450294dfa5e0837a6bc1a4f18e28225a14da8ad60bfcf8e7a2189347bd84569291fba05e58fefefeaf43ba2686a30a1fd7d5721e8b4218d8470fd8912da159b7a790936620e6e73b5e37c9c9a30d50ffc38e66d32b40ab61af89f153064273e2fa8868d78b3fc4ebc07d953074eaa5766b4179d1eaea952718c268385a8be0cd0ad982afe052a267b888624933e03e9d04d9156e5ccfd9f9b24cde73e9ff65217391130f73bf3cd19deca94bfb8c3702db912a29c1d50e04fe95fb9289968d81f5b9f2b2f2019549689cd246be5e3bc79bcb41de2030818fc80052de4c11e141fac40bf7ec8d3c90a05a36429e8e72f431e46360310e22bdaa474b1f1589a40632b833034c602cef1321a4d45ecd5fa0780de31c97c9ded147fae298c1c941e068c70bb3c667ba4199aa0b73e08fe8ff786be6c57f03d91d0f66858c8db411885c5ee5a04c0470cb73dc4902516b88d7f58d7d41d858f844541d239ec2181e3b4ed41726bdedf0688b72e19aab338f44af717704e29f21c38dae8b5b1c6b15a8e7b3c94589054d6aa29a9b9475f9a695b218b1709142ea7e2975557d3769bf2ccaa5787dc2dff1caad72c1afa62fe55befdebbba133fd17533f1637fb7d6fc2a3a0d293eb2907f9721ca6d3746a6c1662c618db360bf8c133824cc1a0d0d2b9eaea93537e0be08c83a5c200199305e9fb8c5c889e0573dd29225c4dd26e1ae0f721afcbc8d3912c9359c1faa067413ec0543939180bc57958009b35c0f211ef059a4ced64bd0a0f3dcb4ac74c5b809032eeabdcdd9575b17cd5f1b7f9edb291eee813d66df5e51236ec2deb51fe72f30b064b23f0b3632093a8fe3531642fc82ba1f3d307fcbfced24e4ebeac6d5c632a521b6053368181ba80bed68c1e99379355dccb9730137d17e59d91bcc6246f047596d7897dee5047440625719529f674c4f0fc2266aa8d48928416015563198ca77e7bba569c58c17d5d564c0bd8c5f97185ac92a376573252aa4c0ee448dae8f240d783b6b7b937c8ff5990603783035085ba045227a9621888b0f08d9fc106e3c5d9e24734ecc7461030df20004a8830e4455f3af7dd9ab9c5c4f1fb5efe6e437a43a1b96bd4dca86f7468bc3fb081553c60ebd78312f287aca4d78f1530300d5d85c3610fb6f5b6cbd431faf6ba3e6475f33734bf1b0323d76da86853da656fe7a292ce246e7b1a24b9ff58d27869c86dc85d9b367790e602056da31e75f938934e86246b5c741cf0c1b37cc980bf1f60b12c5c1b4cb482398c01a0760b7c6d29426fa18cba5be47ceb3452bb14d5864ac05b610a7f08129247b39c9e3891cc4abc0f67f3beaa731f6377687f92bbf7a3e0b76a5f729d5b9cd127ee2a248c6a628fe2482aefd9cdf6dfee0a4a81855f75b1db2c35a6944a440e29d5a388dc064916458b6a3da220e66e52c4703379024a8c52007601dbb2b63a829b22d68296fb59938b898eb4c2fdeb1211378f1b4eea28862e5169ed9f56876f680d0687654e1d1b02f99194f65baeea4a7723a8385557340194cdda276ddfe1847060ebf8b16ceda1818d59245060bfc8cb68f08237ab1b13ca035043cfb5021a0d569112d54809ce47ae09f12e70c7635cd73833539527057e86b1c9579f6e1fef6a4c311ae958e27a4d8cd94825316929b027816ed00ffc2e143cbe252786b7ae9b2286a178ba61b2a497f9002d728538be8698ba8168b252ae4e62b51692d0561512aad818358f67480655290493e5427a6499ae30049aee74832db53addd77738b2c84e1a0347d903b5552c628ea44cc0b7abe763b652b1f49ea841b78a06bf38555decbc3af4ccb7daa2034ceccc76aa60372a83793aeec257114477256fe55993a45809b80bfa8db2b236626014fe6d0ecdb6fa568ecf6a20719cfc2e6bce2670571990119cceae2670d71371951dd28c7005327304545637393622744decaa5df5aebd9144702b9f2c1948cbf292ef11da0cd3f592e0789887a4c53b572f6d8635efa9dc70197ec7ca4dcb2d89056a2d4c81fedd0b5f35180f33753778e7934a18ac28ca3c0dc6ae6da2079ad7ab2fdf0c46a06d419511e8cb8fd9faf645d4c7d1c07237e266485a7ac96e0cfb42108b37253d1c7fd12c4909a040efebc103775284f1badba0c10f7f43597abd116d5a6f8f797595465146ddaaaf2b7da7cc46f2f9e3c2c8c527af44ab5b472a00c1016bf8cd1b62e10f249aa02c3d2d36aa34ba28df41c1a726784ce470c97eb80b58c3ddce7e43c96ece6062c04210d50aa46cf7f039649b03d056bfabe0dc5905f0de2b7a7426c245021ba89a0f9da9f1cff69525998dd30dba979c9741960e3ae15771657612c215d5045f00f322b7caed4c67d9038745b711e5e62ee90cd70927e2e7a1e1cc0953524670eb180b509fc653a2db0b7ef2375673fd6ece0237927f2e7f5a6a3ac9d8c2351f3e5be7eaddd8260d502870e6c9d612a7bf5b7b3941a0e28e5d69cb32d9d0e5242085535999c51d3034f91b32d19cd19a86aa730ad55081702785334c0b4b62d52521637503453d36dcedf131e481450475dd8ee13dd49bd64ee3befb631925e803536835a63f9b2a1a0314ab455773b609600325070036e935e126a5aba058b03e7c65bcc61c76afa4c9e949a07497b9c9e7514faa8a9d9132827c01005c99acca2ecd947fb3d4bd55d263ca13a66be24f7f70c41489c5a714e365dabc04fe3a4c7fd938d9925d8385500d9136e4a12c6679250769e382241714c0932b9971de06108683f342a3279c64621a08fae6c499866cf207b3b4ce5c20ec589a2cd52e2838dea2243393713e8aa42f2e6d9feec4bd0182c7e5a48822e5892469323391db9b40ee90341ddc75144964c798eb688f58c9886c27e1ef4b0846bacc9f113ab63547bcc3c492166f9aac3ede75e99b6226c606b0ade668e24e02019f46286d9956e7cc716f87887df7f35064d1fed9414576a23048ad13fd5e8ac898e396dcd698e4f03968dcc9caa9fa6d5f1e14a6058ae38d2e1d0c7129402423d892b12cafa9cea896c60e5ab0bcb67f9e45df1a11aa81263364c340608abc48eda98d867e9352c525cffe8cc30730c5349cca179de9b87e1386300a314aab1edb1318645ad252ef3fd6e5650ab073b3741acd229bcc0e47e4227b206a3301ee8f25fc67796cab7d9348305cd0ba81aa941424abf682ce07f051d094c34a23ad325c02d89c45808053a62b5058a0e17005b6b8de5e384e37670b1830366efe7abb55fd3c5ae6616c4f7eb9ff9d0ee03c0138b6092af1fd92247580388497f91913496bd12f8112702a0d51dfb85102748c4cd5f74a029cb3a640d5fe41bf6aab419ef40340a01c348dee1dfc1ea344b8821d209d022493aec330b9b10f16680e60a048db2d881fd348630543514674f7cd36994549b325ad8ab2a0448cc9b34aa8f4472fc320c1f90b5b8e315cfe4f25aeeb0c965bbd75e8216399e704e225ce6d32fde1255f4dc9979cbcd059599a935dabc70569db9ccc95b615e2537d06d0f3f12ab6397b55e7b410dbc82fe26c81924b281374e351e08193420179312dafdd93fada4ddf08a2f6f3667ae597cfb58653eb06d91e3977019bdaec0112cee0063199902408edf5e4d0cf4c50079b9f9c16d73d9973098b5b75618dd581a85b71166c67c59ee77198bf70eaa29f05a87deb3ad6f526199d88fdc8767517a0c77a929619569b6b85b47da56e59263d5e65531173f07d1681ccf1b01d158016e5cafa2ec139de684437e2a627a6ce7cfeb320853f570a48094c0ca56df54f7d366137f897808849f14c484a53a3a8ddcce3d07f8782d62b069342f3712409ce6bbd8069aa999b91530b48f4b7db251ffd827672054588fb2ea2521469a2894f5d84ff6ce58b862482bf7cb2819c5363e67b230cea835d6a1668226764744901af2d5c65b9c69db433b884a44f153f114bcea8eec56a79ea72ed21bc215151c8b641b4812b1912f19fc83fba171266cf4238432621b4cfe54e43aa6d47f1b08226cd673943ca077bea00151cdfefc3122c161b473c4ce3a3b3d3fe0b31cd33ee1063878aac9365c8c6503966494cb670b511cbf37b484c45049599ffe431107193556ccfb55b6b222dd937b138a5794e1ed27a60878195e3c53b284497d9c147a14d6615b049a04f107bb6b69188eafcd9d2b317c51690eb8b4aa08416033473c7025a70656aabd66bae2c4fd16c68a624cea9022683dff0b4f4288f4a040ba13c30fde361e23d267c4797171e713876b1c8fb4931530795946a6a14fe1ab28bf97d3c5b482e8f29bb61d270a4e99a096964076f6154e51ea1e7a75ecb48c4be1787e71cedcae09043b6c5196b42d91963aeb5e83edaa3298f76a9960f4226eea6d2ffccb58febd9ea3be89c549fa9353442db6062a25308a6aa412ad292c6f35ba48aca931083904731192a22c35c46620cb8fffea9064db9132cdd43a529f72b9bbd5d550943975cb00cc678dbd9189e6ef12914eca902fe88e7ff85ada24fc331bc1faad3a4fa25261323e0371da32074ccb4b7fcab6caba424e2f912e4652dcea88ae795f54168a4007ada6614781a1a6d7cb8e767cd0c67f7c9e5a6634bdf914fbf80d75ec8c4ac75504338c44b5780dcc58e8f1a25572eba6895e8cfab3458dfd0718521085c18d40d3a12c1c528773ce59c36df7bde41bbdf4185caba012d8f23ace0dfbefabb66d4c693e7eabd03e4f6e3a6725d297725878ab9adf0f78edaec7074ca08f3eb583199d2555856345bfcaa7b330153df5fe124ed3f27c234589a84815c9c5d836db844f9661a2dea0b789b85c248095bf6406dc5fd20bb84495c7f2b4ab0510f9c8e084c5836bedb4675b885e4a08e4c2225e089ceb8e2f9fec8dffaf4b2b364e5d33d2025d6bfb43e5192f984bcb4405fdcef9caadbf8e0ec6ade3503939e64d5e066f488e60652d7448a568ddc3ad652f4d39fa5c19957f9b7b98f70531c445e845959853276de566a5c4905ed55e43090fd94da7d9fe0266804c2ae16e63074f273d67de84c3c4b2f190d2a0928cc953b5814da968150f993aa2105f04bf6c8edeffc89a51b2731a59e81d2aaf23e108546d0caaa1a007becbdb7ed4ee8670da562bd0c6847174ea9b0189196022e6b437b045b051d05f59b7dd3a02295665634a8ec2a4076049810107268e62e216871fe1375a29d7f3006c75b4b8db35f52055efaea0d52f67b3d2a661809c2b0f8eeda1c72c85b45a2a5ea91e85194c695489f568f3f152fefa7ffa1041b6220b8142c8529f989b2e38c8ab4baf44211c8e9da20e30aa20f3611d14fe01df037809f436ec61481e3ea1cfb22520ce45bf854edee6db9c6ad84949dcd8103439f03288249ad702963fb2d1048d6cc08f2a5281807c9c0349e98efbc5565182b64fd2e026ecdeeed67d2f5cde039a33af2899dd227c0cb9dfd17f29e44edacc09fe0d1eefaad5c6c64a215c9df37c8c042922d6f2600c8b3b66e357b706345883e66ecbadad669c347eaa70aaf398c90413c7865619d97271e31b06ecb22df44e8d82ce5ccf7d11d18e521cc32eae69d177edbba2f0ce7e2110c3d2d60f2cb55604cff2753f036d9ff7f6d6241afc72ef86d51b5f2f33d63274a3405201a41dcbf0bb9f5d578e07752bbbe2ee1ce4eb13435fb920eacbaf83e2b33596ca877d4adf8506c0d7a68dbd8b74b767d07ec92c52e1d43374402a79f19114e80b830ed9db818a6792b8976c394f6aa08a804b48da521a6d94d824cab988d34f3da008153be364c8353ee1906867590e033a8b38f640cab7df59ea6f7ddc46a08c5b5cd43f52136e15be2eeaff33945df4cd9540e3e9cd8c683be83d08985c58307eb899979a33d06b8011ea3a3f4c2242e69156120480bf9b42b9d73a12ccf4ea813e57609836c43208d80e2897cfc97144f1f934a8eaff887f92f8d9a52efd134b9fbc4b4054b7fe912394e18ecc0f50cf5973acfcea4e4591b72dbe9296dae172c6aba649dcadb7b51277387d17a3fbd647ac104da27d0984a1c316a6bbf153009a7e37adc0f48a783b511690c2f4ba41cefecfac941e90fa2e0556fef09d8fac9d35cc4d2920c918a6ad35ab7508613def434a502c12694b1af3e9fad895d92b47d1e5199108b7e0abf09d9835dd82fa85d970a0b385a79ead7488fbf6df79c4e5dabed728e20bb23cc4dd2a0e67c1565d17ff529a944d8314519c8cb5e92ecbc699f0f07593f232f9a9ec975422627bd4ce91388c3898da673ab0fe8b963468a41e6b45057019321430f004d52182b13373e9643655460173f5ccc50f872eda06990dd53eac573cf4ad0b1715cad9fc684128a0d0563ec7ba82fbe6843cce930c56a152a83343c51605893da18670a75491d0c3242dbdcd141a59025c5500ff7185a93d41ef359e3663280ab59ceb8b85aa8170bc500de0ce4865b5089716e02ea0a78d07e93b0852a4fcad6f87c45aae5ae852b7b72b833799533b19da11d154f15594f0afd705200c6263e374b3eda46f98b8650490be6cc048fdd108037e7a280c805abf76b6a1711592e4c727147e1e2f4e5bc713d75bf9753e2f256a25bed8dedf3f356644ca2bdf4b811cfcc1d47348b5c51c9240fbfe46432c6568a3e2d82707b4c8cdbff99bc5edcc7d48143b1a32409c40943b35b0c373bd0ae36b83e99659ce7a498868079524063530a8e1cb428e3caff6d398a9eda206d4fbbd98dff292dcb3eb619b6d5bffdba3820023b37456dfc2d09527fe55ca5de23c3124e314579bc59cafc371125e26299685a696b613bc127e3ab31d1a9c8fc9e84c9d967632e1a46f19efae3ec8badd441ae92d49615fc2e316d17ba648aed1d697acde3ccfe1f897fed0900cb9aa14a0bda047084fac7cd32fcdd480f6a16a85871e4f5753e2e72f8f1248a6a9730f7c323e54987722b27b1211ff0051c7b7a561551cce7a5b50d7ea2115b131eddb5b6c6ea920aa8bb1fae61f180d50fd0e583213bb19cd5291118248c6c2495fd5b81a298eeaa0c23efe6e5d5f5e0f9efc14a49f28a2a424f3516f1c6fa50fa3779be080b9c08a4691ff2115a42f7b9259ba27d600c57a7476874dfc19727914e4ac7741b41565f75fc9a29f1a30544bbbd20629c1c7e7b1188253a677f1c88cfcea51b3ec02b4fee1966ea557ee25179595ceb12e65cd149df33b8dbe695f85fce2b0d0252b66110a0feb70e26f508608f6afad581b7a545810e60dbb937ad4bb39d2db9a83fe25423fcd3d482a9185d56f31c5a52f7cd12f1549206d9f7e6fe518b05603f396ad409573e30bf289de092370dc7306c7fd47b40847103ea599e785c305656a5030a83a4defa726f4295590baf838550fcf3ad71a22814db7d1a2c40ad7aef798904caa451a8b6f0dbe81fc290f978748dd7315deb0646e3e605d80022fcf91866ffda3a566c9a72f0f4c58f2f09d97bef2db794522699025d076f0783073c7d84aa1eef197d34c60d3950a9c168799ea8c1e8e436b999df326e1899ba890c6ed84718cf511b711e7f1a44e9dc28673826fa16e58cf408b0a44d3ae8a7732a7be467dc5421f6da17c62d3e7ac6c4f3d1313ee27efa8c40aae8533f948e504bcac53e8a4c474b12a7597336354bf237936c2e62666cd3190675c3c5dcde94f752656bdbb639a70a6f9e6b4a29a55ea9a3a62ae46c5ec6d9f9cdcb6ef3b9719b0ff55a6dcbd9dd73529f35c75c511870cae6d9e41113ba1da81f39ec812918eebe78f46194cee5216cd55139564a293b5655a5f314abcfc6306173e7248a9398a469d47d86c59999596878decabd9f129fa74a94c424a9a3a3344835ce8d1aa4a98ff38da3be515adff35cc7166377e75d6b47639292a457d791a9a35253e3744bd3354aaa5ef7c5a4d3c625f5cc92128f72469fe7c39d9473e9363d7c7439d4234fc7b9e5386b933c49c6d02439e3c97bc495332c4e2d0d675131c7b4d350f58d4b31e94852550d49749dd76e47777eea1e70f35de71db7756c555c3b2e3bb269b57ae7d55ae738dfb6deacdfbc4565997319d771d76dcec3fbceb56e47b76d99d6b9f5cead9f1cdbbaa77357ebec4d6ba723e870dbb1bab3754b94c9d42b9df3e3ded9f9e6e1bca6fabbd745b6fc56a04f3fee53df1ede30f59c5742a459a1d052625c6ff5ead3bb3a7dea984bfd56a071c90ffdb0310c6a879bb97699dceda6bc9766713e7d4ecad16e87f5ce4fd76737bdbb7ef3a75ef1183e1288b8d6df268c7f7da556947347fdaa6e9ea23aafddc93bdeeab4d25aac662a1ad231496bb5169b5eebbcf1d3af4fc76acaab749e1a1b62ab4d72f40cb300aa731e5ffcab73d66218866118e6d2b118a3f5686df4e19726686226cfae1d94ec10f4ecd251f2610374707e43a900d3ac9d67f779f6b08b1847a4e2f901920596414db91e4cfc79f1e8337db2c7a6676f1cc6c15dfca194d266d5be7ea25765db4fa7ce79787f8a5de7a8edc85a9faeb9ecbae6b88af2467987721dd2aa34948eaeb5abfcc9511ec30973945bbff956859ccd73ae69df9b73c7712a24a209d52b50a6aa74eb7a838da2721a0b27519c44417da36e3e763b34acc1cc3698f9e09cbf6a5b019953da5d2bd9e64317cca557e7e1b960df0af431c76ad57cbac720fdfef69140c475a9719520c873d3d74daaea8c427d9994d8c76522244dcf444b28dd67a225a2a076b85ccb102ebb0f97daad1ae4d8a29f538ad52f478312c5746ffc46a9a0fe798af2eb6890bdf8b1f4c3111fa6981c50264df840f6a01ecdb496e38711dc50058a385910902c888784363202173720aac1124b3ca162b10ccbb01c649e756b31cc6218860525f986228809ac1b05073c805f2b26e2a21f26d874c0f0038888837a76fdc0d1e14584d266d9154810ceb8031d927c8486282140b6131d789a0cf9d1727a5861b2a2c5060320cc2d1ab0c3123c523cc9628c29738b0d18b9608a2041929c204a92c64499752ffb5698fd6e3418577286eb1844d3da0d9a1c584813822b241d649f5d391ca94040054dc1821c259076b0050e49d8140c890857952637b4a04748921c1d6a10fa759a5ae43084143949d1631c5888d5485f7a78e23eb47fb9ce95f36a8a4dafce32fd359e20bf1bbba30a727c86e830b5cc1198597614dd3276e51a8b2c4ffd453e22e2d85167897bd592e446e7a2291bc3b458ced00a7eb862c678b57a1d2fb020633ab6588a881d5f30b3bfe645491848301c6d7098dd41cefcb8d4e56eaa875b9f5d3848f11cd731d1a368f962762683fb2e1c86b267170e49c2c041e683cd680855446f5a1bcf2e1c80fe3ebb70d8f9d02b72cd39e75c619939e7b430d8e8d0c739e59c92bb08d0161637a4443e7a740ae49408e3984e9550a1ec39ce291fc63c4b295db694cd371487eadcb9d0adfaf9a881bae086263d517a9ab0b50ef8f1a3022488aa9ce153832a45fd01cf0f3c3814f9a0074d384c5cb1cfe052200510152739f0c921c9129ac50d901d76a092c30f82501123d2dc70439f71030edf6ec9d8b11144e3d3a38c1f63159e6558241902020a2658f80085fa409b477c051848a2d0810c2e84ec907d3a1adc41bd81edd9826435570e40b43cbb72c851b25e684c646dcf04e209ec13a38c4d1ac9726c966d5996b120cbb18e591be404dfce7dda369fe8c2658312f7ecb2c18adf9e5d361465add10086a79ccdc99c6599958c127a541019574a29659c73da403279e9310639e59c73460799871ac054888de98d1350fc74dbd530934a338d6601077806638c2bdc3cf1d4e774adabe1a1cdcabfa1718eb131e3e8b88d5963ceac6395cef6ee668ecc19116e65aa0333f0186dd00d53bf792cf923fc076e5c5668ff6ce2d7b44b27d18583f4ecb261e806cf2e1ca64fbd788cc36255888ba7e9e567d30f02efc31e3838386fe3cdd308bf691e763fc30c1e8855de52c79865a48c9491723acbd00fed87f6b113f8e917ceefda8fe1cd4777b24df9b222e3865e8674c3d5cf4c6ff7aa347de83560dee09567bdfb7253432bf0b82a441f7a72c62b67e4e2861c195bfb4dbd6042b8e14d0d7143663ac328fb8105eacce4575e475f19c345b911280e117de2ceebc6337ec2b8d374b9dbe375e34ecc79c59d577c0556f536e6ed90b53e1cd970e5ad338ce5c6d822778c5f7763b3314c3f40fafb4a070c58c20d9a1943f715dc909b48fbd2a0f4588884561a21a59452cad850a49452cad83c90b1ad90524a196543e10123a59452cad8d10a19291429a5942da59452c6ee8194524a2963f3404a2965742923d7039a949452cae852c68622a59452cad8d28a26a81f33f841132898c5aa884cf387214022538e159d2645e4a882eed4a08b9c8f3ebb562aaa50042a5241158262ad8dad421be22c66f0431b9a2229533ac2059c04858f78f091f604091ef0a0bb63f78bb41fdd461b38ad62dad0486b1c0707870a1b69238d40119c708104e49e704652a89540e2831482b2aa81c493157c151e019e20c103af8a54027e70d245eaa559369387a611158a4e3079820a41996d532f0e0e8e4d8d1e3b768cd1433065ece437572bd440e209121f6f3a46201b372ba222ede8b375706e4e4f61d85729334db15397ec9529b3181bf7c6ddaac1112a2e1e211f827e7e82688a3ca9607087f47691df47ab0cdfde32f5744ea7f1c8cfe05e33ae94dccb742f4aa1954be9e5d9d50315bf13e5d9b5e3e4c36c8aab87a5478193977976a1e0e7972069d7cece37bb4c50e4dbbb493b79b2f3217d3579d2d4ac18d69ceca6308c524a69ca7a42dfb348831df4521691477e7c767e06f9a3f62c58a697b8d70543480df6d21124393c4a2238bfe7fc3543f85b9cbf861741fa6962fa41c2cfe2fc349c7fc5f9efeb4f3ecf393f3f3f3f3f3f3f7f8fce6bce9ff1d708397a0ce76b7a823e3aff0fd86d08714f5a5c8e42c892b74a484bcdb296c928a959ecda69fa766bd4ac90bea2342bec217b144f78b18e9ce11f5bc43876b026ccc7bfd0e68cf0859648005f689d04e00bb1222f5f8809b97c21c604802fc45edf5e3324a859b3e9f94550d50c093a7244a859d38ce7f7543543849020c169d614c2f3db50d50cc1c9c919b2d3ac59c6f3b7a86a86ec0ce119c293d4acf97afe1aaa9a9e2425a59ea5664d329e3fa5aae959ea61ea611a02d4ac1984e76751d50c011a526448919ea366cd319e9f86aaa6e7a807a907c9a75993e9f9575435437c7e7e86e8346b5279feabaa19a23324c890203daf664d319e1fa5aae979f534f53409596ad60ce3f94faa1a214b42988430f9346b2e3d7fa7aae9f1f9f9116ad69cf2fc9caaa6470809921e9d664d29cfbfa96a7a747a82f404316ad604e3f935558d10a328518424356b2a3d7fa6aa119224444988520f50b3e617cf5f55353d403d457a8a1c356b02e18f909084bc9a35bd787e4c5523e425a44948134eb366524d0f4e4e4e50b36617df1374e4484dcf4eb32617cf1f55353d3ccf5d4d0f0fcbf0eb6819258b9f9988a3e3d3248a281f56a66faf54f40c77fde99956e2e4bbc977d0120fc93d52c446b94855e9bd2863d48938314747ced057c7b4ebb44ed3974ed3974ed3978eeb625fb87a15dc90bea65ba7afc6706ac0c15429441f4f6327011bfb39b1a941988f2147d4430d7a37cc50231983d024897373bac82aad708321a7f4ed3449ce54a68ee95a9b9242fa32faa6afa4ef5783dd430d76bb77c60d7be8e5453dd49e798c69622b5ab94ca7ee4274fe68601a9268813d7e2e9286e8f37391ceade9dc923faebf0853dc70155d3d34094209530d1e96444912409024209600f1f3cd39a994f28b16ab1ffbe474307b6259d5d872adae7d977e0ec35ba7ccf5a3d5a31f5b22966a9a9c9e79a55e35cda9df7bbf10f34c95c50e02da0a180861be7a5b0073eab55b81045f1debcb353887d840062966330f9dc57525b4f012063cf18bc3f0d25f34e071e0e54df178e97c657869398cb98b93078d33181970d26216b360889044079a2c83c2a23473c382188c61022642cae0210306ae0d0639b0bc0501769c48d243194c5c51861667820841138448901f4096b2225b0b0c2e5f4e4a29a7e48e9d0339270a8b3ba5fcee3896891eb93e8fe98369c389f436edf1c7c4304a29a5149b94c6da7b31ccaa38b73ca379f685d5ed476fc5ac8ce1ea011f5fdf67984fc31c4f3f1bfad4c86410c65f269d734aaf41164d35c8914ec99ad356136c1a169b7edc590f330fe9b436cb32973191525a6b95d26edbb67d2c63eeb482f2174e7b63e0ef0a20490e971b4ccdd04a97138c39e79cb572b5d67a7296319c735fadd539ce3a0fef39d7d1d652ea95e338ee2381885b552167f39a5b55c84d5cd5b48c7aa56eb128d4e0bca2316718cc2d77a81c2ed720f5300c8b58fdb02cfbc21c18bdf1d4afaf4a6816f6a53c18cc2956a9b4c2c9d08771697213274a7e7a649a403f1d66a6adf5d0fbe2525b236e18714e44dc931077db301740d38d2bd0af1ec8dd144c9c4ebac87611151f77963ae793aa0a147382d46f76f4a9b6b65b80870f6cc2a0010ec860f3b593d9b934150d4e8f12859ac54a62538dee315d2524bbba3416e09948044e671790a357c0b30bc80a7e8b39bcd05e226b574bb39b3a663a8f17e44eeb2c6525c2be266a2239d33b71a963a617ad88c0210ff25617b4f60bed50cfb0899ae8a7a3805c39a71b25015181f4e3a428ca914f2c822436c1e250b3e81774242a894b2ca5547cfd426e22ef0bfb28002ad8b30b4891e7312e757eee527fa1b4db31bb0883cc4a01c8110cf23796f3bcea1e728004602b81c1a548e892c45cfb429b79492e5d4a29611c34df332e51a51a31b8218874f2ce430b7aa78fedf6d18f391b415c7ac4e6537504f7e9786bfba8908cf96c6cb162834c6e68ad11cbb4675fdc90824f97e8528d9d8e072c886dc7cbb64d6e87ec48e7a95bce49916e576ce77a3e783e7437a7693f6e7f2e54e2529cf2ed1be7a1fdeb39b87a4e7d2cd6d2b877c5f3ae3bea8b382a1bc6656933b7da50980d793b377ef4083373decea52073dbd66d5bf76d966562dc62dc36df62c7c2e9b4511ffa03448b341855f408156a30469c8883dd70ad69b1b1f86c4a486beff53c779ddabe9540972852d59133ddaa3a7ed30aabcf6af561d5a940df61dde1f94939a7945250e78e3fead3627445f810ac82138d006d452a4f8cb288f4414a29e9d1e6ed7449ce6429809a63aaea5ba61d613d5a294f2e35f205faa248344945972a8e8c29c0cb8f1ef5e05a19233f1aa54130ce33867070706ca84872befda8818e7cc8d9224ebc4e119e0feb912a5495d4c90aa9d123358bb6e09b466930e43af626d4f56c0c13a686524f7cfbe6d3207f3c21fbba522384021d310e02bca53fcdd32ca022f7654b173746a73ed42715c536b5b85c57b87b7c9ea56496cc74279e903d3b472164e959ce74cbe3e75c8c3c3c564d6f70c697f3ab2a0fc41954e0f740acb2c96e4a0ceb6ecea002ff11d65de896fd7cd4605926361827dda92b353db65b219ef1b269bb3c23021718d1821fa0228a60a2c55b08f92c2971c51342f8c1ce3a709e7b8563dade9636849be3468329ba5223e47599b8f23bc2a5051fd569b8817afd5c5cc068a88e7d49b8d8065b95f2f576b0fd7a0c048d8a5c92404610810d19b1848a868028461899624693325a37408240c4850e43d8208708135bd090384f8052a023c616992dea5c41384bae229cd8710d91e32a22a8c846e7e8b697c44aeb17448a56abd58ab210db9415e37826151db1c0332cac98e399dbc3c682c12ccc22ea530e49cffbc2e935527a1e06dc8b18d26c70ea296020a932a8bd84d91b3439b25692527b89e91b00cf2e23543c7d7619992208d6f210e286dcf3483de5a23933aec194b51956bf70f547dc90fb6e6f6d7a7684dfa4f665dcc7b0848fd279a49e9610b128189b44343422409262c60a8408b1240a0bc628a28730baf0212208920ac53cbb829ef8d3b3cb0893a127ed71a997013cbb827c8cbc008acd36ab6394316a9d49ebddaea3d9e794de5d2bc5a695596b9173de4e6c87488282031e10b929048d58a28b178011451453c4b03aed831818115628288ccb422b476cba60d69271e5b3cb880b8eb88c08a1e08007c42e04a0c592305c4c52805861840511074694f8767b3d008871833e048bc4d85ab6702c5652e0576c637439acfca88c362fa273741bddcbc038434a4e9d446890a6a0389a9652028d470a10150ca38d09185a7058768df0a9334608910227eff2ec323284afcf2e2352b4a1cdc6d265676c73cdb74f6b1089c966d6fa6c2e2ef88840106a694e0197e806586af930c0526bf3cce3ab2c91eb10e0c2c8074c82789e20d26a26ce18022445921a30c96975185ff4c4a02988213f9650d8a14809a02078b1c517cc3140481e7c760195e081a87876013579996717912bfeae70bbf59b67b62e224fb828fbe9e932270947d1958297232121c4f890cb705c4478f8909b0871f434ba3bc2bc183513df3c2fdda7a5186c8d331de9e74faebb69ad94ab01c6215f7a2a9ed03035b8210cd10b7225672e7b1d330376cc0fe209483f552baf590cd3acd0ceac94f8b0a00641bc40074c2de9ab9ee196740dc020f18081f1800d3066e4b6b13f9dfb93a1c1e6543c21bea43ef03c4a954a7ae8b5953152bc59f2eb6e491bfbf473af892c6ef846fab6cf1d0c8b9221275c3c4a9f69115e178fd1b38b87c8c5f344bc00a6023f6f1e0c4b76cbddba6a289733e3ca59e9d402e39a2e6791b9cd38215ccdd9b54fb39e65ceaf69f69b0ddeb8c52a952a01c643fbd353d9b573b5838baddc29654f1567a5605edd7a298c257f5cdd56c72c16bf7e535691592e9e60a3099fbd4a1bdfb8443150b231d26e479cceb5e036639e7d34cbb210fb5c8acd99c596cbb8ccbbb109dcb4388cfbb2cf6b70f354831b00885c98df1c85666d0ed32c2fa159996f0efaaa599a6f7ea3592a6cade2cff1dbc6f3f321133dccf6c5c045fd45112952c2a0a24498691a6fdb9c8db25f967dd1a841ad5dcbbe88b4491caeafcc797de5deeb5345bfd056bf1efdc6200d6a2e771ad45c061b4de3fc4eb9e1eab5ad9b480d6abe455ebabeb5dfcbf2fb8b472ca3f915e366aeb96da99a214e8a6486f846af39a60a6de2910635a4d77c43e268aaa250839ae6a72257f378a439cbfa85f65e4ff355754df31c376c188bb0a65d1d3188e61ae899d9d2348ee2350dca6bce3da331bdd6f49a92d734bfb2fb42ab691f8cf6c5d0dd1552a45009c3fa169db3c885714585c38ad390f25b711a2a1f37ad95956fc5a52a7e2bd2e78c2b53557d45658106ad47eb3a50a039ed7035bf53aef52d722e3f9620178b7f1d539dee878a8f724cd539a3bea0062de6398c03738bfa2212dfa2189773cf8b3585f9d8178558c6fa5dba9ca32c2a739a13ce0f634ece0cf18376f868f0c65bdf90c0e2ad5b97aa8893a97aace05a8f426e55e09f321c59bfd65a7fa1592cc20751495472352144cee64b9f9ffd24a5947ea1f67153dad954344596810f9e9630155cbfed5e3b5bb03d86ed01beb32f5cc0f7177a1cbb1d766a736ad3b318b31833bb6d2048c36800a77a6eb85a3120739f06a5aa695bdbd66ada9052b783b7e39920292929c926c998a694b27853b3a2771719d9cbe29d62dcaa7097420738699312e8560d6f49b5a45a5adc464b8bdbf094caa505cf53eea56cb470316d924db24936c926d9240cf3ad258c1b82df9452564dcb659f08496c12e3b8df6e43887130806b8125e52c2dd0a8e134fca6b5a554bdd33e322695f296af775caca7bcc56ba85c5ab0e135dcc6d7353e17eb2d5f2b1992312ef68b40b76a788daf83be16eae28636e9d52ceb1dca196cec5fcbd42c94b767dd8e155b43d52d492467acbd44aa93676c82744b24db63de2c517f0dd56ca5fcaa42605fdb3c9444a81a1eff881a9f8f1a5aa98f65cc51107b0c621c368c9f756f3315f652731677a15b2cdea96688cfa992300e7316ca03f3ee56e027483cf56e699a0b0b34fca655436b6b8d85c5fac7b1a8668b45958404b84543d52de92c1eff0896cf470d2d1a5f5292b773db4609301593f267f5809cd35a204c608f659ac506777ae849ceb2eceb5129a59452ca959116a01622afd7ebf57ac538a7b5f7bafbab9d467ec843b3bee46a0582617dc9faaa5e10378883d10658a8e089968f1af875462b09cd6b58fd804513ad2442afd6578d21c6c14372e68518832367588c00f0e3f6e0d270169f4d184e7dd9d0b72c2a97e827bf69d150b9c4af051acee2d159589cc57da09cc6e72389166838cbe763c569b88fbb45f94520661be751c5a29ace3e7c24d1028bd3f87cd0709616b3b84bf7020c11087b7c746ec91a5ecb68a8b8c5a2e2168d1eaaa8c338a243e119b99485ac92144e1eea52832d6732289cc52ba94a7d4d1eea8b653a336299f955a6aa645495b020d84e7dc99846c553fd301df9459c1e0d66e0850a308bb2e617463a18070d9dd275747dd5d7b74b3aebabbe5a80b85e41d2d91d389ee07fb096d2281b6371b7e6a80a9d6529a08a50d06183cb5f001f00b3b08e28f4269ccec958bb648c599a64e1368d731ddd9d4ea7538742713f404b869a1c4df7234be5896fdfe64cd6b1e58399e880054068d54085a8b43287426bb1f7cd43ad8039e794dda9a0eabf1dd32e551c48b19edf9cc10d3d12bc4a67e51ad96bcf3b233e615f3d1847770f297bf6e9c3493b9e35acb821bf7acc7839ef0599340b60cba4a77cbbe700fae9c1322398b2c3b70d56461f96e1e1d24f074d839ee77972564a2b9d93528a6118e5578fa114c4ad5bce340944aedb951a21491f3ff9b563d65a9bb90bddcaea0f15a2409239c64dbabf74ea733db6d2e3ec76b47471a5eb68ce62630ec222c4a284b5f77a9e3bb85a81a0fbbd3ee9c49133ab150856d9cd032aa6b4a05503ed414aab73ee7b6246cb67cec4a141c43858c7de1a4f6e38715e326018e605715b29ac2a7f1be60edf1ec6cc1d11aeb834bf597b8bbcc7bab99ec29bb70d869ae711c05a53a7ca0d65f43aadabc08520fe74cdedf4c88106bba8594692335954a48471446f9731e0999a05c7b47be1452f7dc8468dc5c461a389c3325d8f5eb24932e13c0d530ba7af85cc65f685361502307cacb200a695813377a6cfc4993ad6560cb318666bc5b0da611df63371260e8bd04a9438c5a93b7d5cc6d5a1ef16326ef72157238a1bf2100e0cf89e711b6de01372441318c7ec1918624cfcf9e6891d9db8211fe5341437e4a11860c8006f8059f488a91c718c237e5329a5dc344de3348dd334adebb4260d0efd002d6199e82ee309b4093621ba51117de2a3870cf8de9ca0b43e1123cf580faffd2210eac30814a2dedbb952b552e23b9e7eebe28691068bdb1e46a0da1da518a558573a2510501dd2b938a82a5c54cd707a1bfb518424f705c6211907cb8b31bdfa8dc80137adeb9cc74803ca4fceadb80f1a92b8d76f5a2b5725c2145704242eca69e0bc731a4e8ef28ece9d4bfc22d039e72e741fe702eaf4d1c8988eaa196c2ca5b4d9020dbe7074431a9a4e070b9cf3b7106f108327adeee356bb4782cb08ab0278d2e8056de862612f83bc922e67acbdd7f3dcb71edd8ae0014cd00a3d1f51c775c550ab06ee08a496f52f2a71d4cbfa057790b4029aa5eca28d202ef721bf5e90a107e38848a29211f009b1056c427b5c82cdf88e5f148ae24e0fe34ee6d65dc83eebc29531bdfdb87ea3821b7a929000010427aa6841f16a62890b2fa2e021eec49db81377548858ad5895b556eeac571f21a1a3ad898d61423a99a5945232056a909962e192c2e9a5f70ce637c5325d3f0ec80de910188bf8fc00812078d482ad017c1221ca7d7991de3e00129885f98d2ff23fbcb40a98b754759cf294796f5b6f9bc6b90bdde27e8096b0cccbcb500552949ac27d6be9c38ddf9c2a9c5ebacb198ee35a8cae4b0ad84bcf9e33bad14b70436d481b3a2da198308b2a699032c160b787a730be67881488095ae4dbe9103c73e0ce322c6540a1048ae80428229669ef8fe5c532ed2ee586ce32edee5e54c5a04b1ce9522ad5608a89667e83b9cddc867e86c5e8957e56a54a95cfdc461037fb567469882ed15708de90328e10984023ada9c138fae594724ad9b3db4195d0251bfad2a950079fd4a804ae964541e9d090200800c314002028140a87c32191583c9cc8a2a87b14000c7f944672589a8983510ee3280842c618431401000000080062cc140dd52000ba06eb06df284aaa410cb617f298d2cb5c888d91d9a4b125379085312ef99d73d193476b99d9288f3a377150b699e95afba12e658fabd770e50d8faa3e9ceeca4bf145f4f56b7d3531c02ee2ae4a0b309a359f39533993432e5384bec0a79e2f3c4eca17cde9555141d7bc29f43a0a00775399117d3f854cb68008b28d5e553448c23a545da9f7aabffc9d9dd2eaaf5e6975cc7d67dc07cde7b92aed6e266e39a6ba4709d88ec885058bfad4b3530f9db2fc4652396bdff076c77859e137975dd24c863627dcdd65e67f8616fb7d02738158ccf744ca7cdbaeba2b5e5836701655f4fd96833bc8e72bac06d5b6a21f59d03745771ea3a49ad00a51e060216f3dad44c97cfc858a234d7ed642fb2e668d6b58006071619990291e3f2a1cfd2a874d50620dfe80143f4bab7cab15a957ed42f4df51b1a047536ca072f6934913024995e5e58028077936959eb98e545f93ad29c5c9d891853d3b39ce0e6fca5966942288a7be62bc5691e58bdef225ecf286af11118cdc65bddc7557b95dfb1282271cf02e9dd0d11cc9d75501c957525599edbef012961a7d3613111967650c37a024cf170cc0b4d10d1aec659a44e7e34e682579b58441cec4da99d5646c0eb30519def70ca72fdcb1e022df044da3189ce20987e4c2105dc52b66ce2a21377731d76b79957ccb6028178fe0456b3f374748c1af82bf139804d1ab5d563d4104b4c41535403445b4251a4046b982c9d8590ce5a59d96dbbb047127033b2fe4a6380011df3528fecb1213d847fa581f5aed560006d8596aeaaf166725e801b6f8dd15f17e87a7af107ccbdf1d515f47c7ab5e7967c30065a430d2ad3c012730f4bdeff9ea5be897542d29b4cd4774c60b88c6c6ef8025e7288b8e608d073103e76807a37841105d01772a153d5864e7513a1bb0b778d2b639ff67fe50df0bba5ee0916ee804667fd09ac07df60a9cfc5ffdbc808c0a5d0f46a8864d80b34efbe9fea886aa96739b895bec90cdbf996272891fb55cbe25051d9528e80ba91ff7e2cec8dfd35628dc7b94b775b81d1ca349097774b5b31d8abbcf5b1afa61b43860fab16fc74e9bace8687c2bb87545269e8a595f7c2646f4d872ed829f1cf06898718ab05897baf92f9e25ad67c127ea2daf097b49eec36b70befadb6929c4fdd3335a14349aaa6479ff313c49b731f67ece007a2f18d07021efe381aca19efecefd7a4090bfbe34e1e39af2c151f84b21ebbd7dd82d1a3cc74ef6e46469cd52ef93534d536c7dce1a333d7cc5dc4799c178d186afbd42b694f9dd86301eead700715daa4711be075dcd83b4370431059feb944ad9ac5077364207347c8930eaca27d4295b6a020a8f4838ee142648a6c1a351596453a6d47c4234b7cd0dc4d3d0e77df3ad5618038b2ff757a54dcb4fb0428ffa8d6655e8f1ecaefea00a0c16bfc57c2557a47e58ba46e18d22c6b1338e07534155118b39b98255a6c210416033d3abe5594a7572cf85aa8e093f54278d86d48857f8c10700639b7009eedf915c224798c2831a699de0e390053fe7e882a065e4aed511ed07e4a86134cb971582694e9e263f1e05aa4aa5d380d9cb1a1e38b41803582ef6a4dc449d771e33da5420531a53711f8521247200ad10c48befe30ada98add6d58535781ebaa4b0227ebce83771a9e08b3a306191c1552bf5092ed1cddd09ccb52894edb0f57e1f70b4e9fb4c4282fe77fec16686d4b5fed4d730eae9a7f04d025c9c8c6410f7e2ddf0c61242d4e7b241ed81f1a304e50501f75717ce7a46ffde89c6a1455494107f8a2513194e4d0900a9adaa743a8722fad9a1d368bde1510446a9bc80d440b868531588cd1f455a8fbfca43be0288a5563b51fef7e20e2a37f76ef2937832e9a495bc7f0e4ed2b5cb4e4af29972e6dc2bea5aae034fba6c93152f87618befc3b75722212becb97d5306484c3ded1a8eb1057aa092fae77efe97673afe8a787da9d5ae4805da238ef542c828cdff8d85a076a8efcfa17bc7b1021aa5610597bac4c7849ccab7d2703df3b07b8cb88b4ae695f4b0a9955bd741f215f3556ca483e948d46cb1d17318f1edd6df53ae6171d4803f4d209abd24a53ac4ec6e9c50b4cef25eabf6fae8367b10da238a6557f34edd38965b28fa4cb48656edd06a9dc7e15f74655a0ca9fa5f7e4d9af3b5ac537a30fe30d64b019e2e80ff8a8d11732540d907467018c34fe4e4fb0b5423e17da649c0aa6f7dd84a0381e53dbec249f103f41afaf1d3f08f21323ade1c6c540653cce37bf5fa3a30965c3b78d33543bd474106d638ecbc620eeba5cbf7e17677612af57e7e1d7a54a35edc8944f920d77b3bbd382ec3aa331d94229006309794cc4219968e29b548221a4b98ac1c6bc91dd85f6186e6a52b35bea234d1a389b0f6990c70205ece5c3e9bb9009c93c963055dbd589f23e55eb0a48981144bad47e0353ce52c1e5a3412a193060b443d9ab486f48a667feaf001933ca448f3d35b44eaea3362765ad591d4c8f43d717043f141961d38e9d0e1392d63793779f87c57ac1f9791ffc04ee34abc3e3359ce6480a9c7fcac54c272766c58a9745e0549da2f4bad81c625ad8972acc84cd90e3932151a4881f525e8cda2bf419d6159497e569ab4028b63b4b436e04e85d8b08672ec4a94b0b83903501a7f4e40681b15bcc66b143c99d7aebcdacd2cafdba7ba4bd0f43d7993de720fbebe9a1c079a95d92890c96e42544e1c74e50be17549ff4d582c2e264d033b8839754c8e42fce2033ebb827b021d4fbfbb2ea3512f8784b6378007ecad266686738d01e7e8c37355dce91ff6cb1020fbe14257b1d36c0077f7f0927fecbddc93ec417e7bf2136cfacae8196d427f6cd8f953dff39b3d57995d2d99dfe00834d08197862afc2d20fb02bfbcbcc99c80fff70b5e01d9ebeb260f5a5314a6c55780ab744cb88bfd67f298e723e8a0896f346e49f485a3266035d4ec363ce973fa3e9ccfbdf1cba11d2a838522bb83a3903e94e226978e39c266af7a4e61197b1bd53de1aed549aaf39199847f96e00b3cd13c11ae6ab145cee6593cb29b4716b366ba3fd533ba9d4dcf4e14b79f65769923d918f23b44d7c8b67b1cd7138d7104b025cf51ed52d27d29a5371d9294ea948976fb896e12f6e943bed65169346aac62b28c8238dbda3123806f4de4a034ef272acf33c8b8875802035406602786b6fe863b3965230b164663d256412cc6a1e1b66c8781ea0eee4cc5bdbbe03785d1b1577eb461b03d812686114b9effa7c0af6b864787891768e1aa63fb8e33074d7f6ee4cfd173068521d01b0e504dab812b7838e2d71bfc05860ffa66a71dc9c0fe38eee4bbb7d5c8a5236c97e730daf5ad2cf144819d1743bb5563678738bc2ec9955791c41805cb5cf490adec5e99ca84e5b9bd8cad0c8e1471b1cdb295220352b5b76b816fc7630acc88a08934c5902c2c004814bea6d909a106a7574e4e53718168ace3a03589afcb5aafd191d44987e0c57e5cf25c52a5919af11c40326c02207e83334d30d05dadf3b71d1d0e3b91b15fdf2f2ce208d173951808cb868a3cf187a9b18c106228a230f747949179aa267529e378b2e0cac48ef7b5916de8c4200c256183b6cf414356f4146ff4328330e51dd42cc859023b9735d77d73b7b92fb4f3ba28824a75948b771aedc69851ab62a6b4b2f0a9def4ed9cd39295684592ca99cda4473c591eee533b7c8d5e4e8c2df32e0da574f5fd82f5b86bd0b5ee60417ed0af90caf9fce809740713bac94aca111abb56cf14fc8dd0a203252c4fa80ee5ef24d5ae8befe230996c8c0d02a39b06c627ea674a427d1053b172977ed7051fefd56f235aae07b4b517393579b694453f8f3c1b0043a7374f6858b71064cfd52bb849d9f289255c60dd2a18dad502faf8e8ff7c2ed8f40081e22cce52386aa533cb65d568887a6a23b6b7d4cdf1d7fd9cc5b2e307acc03cde1543d3cf1db643217f9c62afd4e4006166f1ecc3869b4016ec9189030d8e8b2766a62b25892be420c6ac8e784a7d5490460ec3f3d631e5e26951096529fc7257bdcbcf41ade737590d32147ca8d4bc5d63103923f9a24eaccf22c9f424791054967b1e98405368c4f294688137468b2de8a9914b8b9e0d22be1ad48aebe605bb3239917ef197dc15a1c3b625c5a939f8fa24e2e3008f02e00000f7593f469336829797954c60e3152803318639bcf8a1397bdbe0fe56794bdb22e2036dc1f61be31ed302abcdda8ae2ef4f6f62d484fedfdedd8959b1d25e60ba5a4088b5319b4786985a5089959b00e0ff4ead7c58c50e3654506e701a2203689c7164f65162cc4dea4ed9f5020465d7088775bbbf412060580406ba71a16dda903623d1a1cdf8999dcd88aec7d2112900f05b4158267b361a6c9950e109db8161ba2f4ae4ca6e52ad0e85be8e61b1c8993e09ace3b52079e5d6b1b31f76a7627c9958f7ac68d8b676abf4b4774d1d4e918a10a3c46d541d9fc865d5903eca3c7698eeef761fa6b1c149995cf6357a7634727d46e0057817198854295b4047c5a4d1c5af3352f627f8b7af5f44a7bbed494829533226db8bfc1e8471803d2481f7102f19fe816d1ff6e50ce68e046d02e138cdfbac18c7d6e45be68f000ed550049722f6edfa3632e7f25b9e3fabe6d072901608e716f9b0e9bc96f5f252cc2e3b9cc9c74b8d9c5aa225dd91e99216479fac8b6dec74a746722e2918c7f19a8ad596f6147e894fdb426bfb189fa16c89db2ea3219e8ec00ee0dc70b2ae3bfd6e904a01dbe985da01b55285381a20d13c2e0a6f8e3e4ab47832492438520b79b8c8f36062d02f48b0d2c58da70fcf7e5f15ad1fd82672e64f856f44886d7af306bd44c8bd0c20701194d4b0fa8311e8c46ab770f312902a6cfbbdccf4981b441639f9f1133821fc6d09578f490dd9a2852a6da12e760898e083a3dd39c764001725e852f21bf726883a6a6625e89ac402322fddb31abc8cde71cb4a9b7bafc7f951a81087f10ea78493b4cef9c5c16dc5c2a640f8d92094d7e28bdfc34749d30dc2f2ddaaa77350cc112e3d5a9e3d40e2a87702c27ef93aecaa3998013f2c907b1cd6e51522b0f8a32ae742587cc400f57ea03f7d46a537c6916e2717120bc0fee888ac51a0e99518a466caeff495dbec74a8972815d8c635892ab6b4e223bed74dbfa3f3161112a9b539b6feffd5fe86159cec2807fc36abe4ccccbf46ed87b5f27fcb8ffa41207617d8b15f5900abd69c1755ed60607c282529805d4609ea78023e8b8c1d270047fe87f629ad98f270e06430519f5e4f7a12e1682034ddcf99425ca9004a8af0077ff3dc3408f713de1c68555f2b80c5d5d304f3947a35e0de5c65166dcec13731c75d8b8a96dbd3e5bf6ce15dd93b2a6652b9c64c4bfb23d0510a854f6a87e1f6f9fae438c1516b428f238f7d8e6b8cd09896c39ee2a7a7929dc3ea834b92a9467fcd56eedf86e33dc896d10eaa987715c54cae05ed31d273b6855b31c475dd47651767e921719f49aab17ae27ff8b456874b1b445cf51d9b0713314cd021759759bfcf88436c768a909b3598d229f3e135f8393e4dd981ce15dcbc658977bfee617ca2bbdf3b68576138a00a881d4ae2e7b997d0eb61fb03b7580a92e7febf94f9915fe326de5b0e2fbeffbcfb1ea8170dfbe06648d06801900c080452252ca7ee2f9ba4d4a4fb35d930ec8e57b99c37c043ff16411f852605f4752b680a947976dde60cfe2aefe4b456f4318b6fbb01b5e47baf637d41913a61f0636e6ca200a8cb4c6f76d746d000e894f62369b86ad3583873d7c2899231430e0c083c87b4916c96cf7c6709aa2656b045c14afd4937ead0eee54f9b0fca9240c48e4ab76d3f9144338c820b98fecc0c08e38ef6df4e4a7bd1c2ef212a47acdd945d8869e44f8a2fc417dc59a009313c1f630af2b4fe16d1d7bcd0afdd23257ea38f2ffd5b41c94307dcd39a45dec261f111ad57e095e07c83107edf22cdda4e4e77640bb2987ba924b6cb131e99e15e5e392a96c4e5d91873c7d06b279614c215e299211c879f50b36a3e42945e228408a528056c4d442223326d4b075fa2a01893b1c3f8ae0327dbfa743a40c1669de559cb4865914129f97b8d7c70b8f0082eeeb9c02b809b58aa5ae1148f46c59d21636763e2475ef773de46fb1f2e530efa50a33d5b659b1ed00f33b28268d1faffeff22a907e044b4a35a25d2a09b1acbd84ea0e11aaea1cad4da53f91318f46e7557d879bbf8a9717bdfe85c6ff27c758e450524b08fd907467dc0c1735da94fe040686c0cb260dede8859d3350fbff31815c9a532de275d6c9fabfeae96f1848c3c317d42814dda889632ce35de835e7a8ea34eb040c80756eb4810612c790d2da34944819e15b698b95ff979d5ca23455fbbb74c27512af2d90cb528eaa803c1b34e0baa961ec37813752f0530ddecaa7df2bb376a9f089bf41aa533f0bcc9061ddd48a02680557f5994c50d2f47bed729033440bd4ea93aa8b48e06f255b90c2504e3c7ad574a23b273a52ed6b80402c57610d07cb708dce1b43171ab852f10118728c1a95a88b091ee7c03f019e01f83d4738afb1baebf2a4a06d8eafd9bec9ba583c46f7976421563da75b476e6fee5b1842de5d6da9307f0be567b7a5ecfd0090d957ea68897b1af3497d0634860f43e19a037d29142eac1b85d270ab3356bfa92f644629f1569f4d9cc506aa73897a581d5a9ca72b19a0fde3126eab12013fa4fb6f9b4c97d38f028d1241171bdffda664c28ab4677e0973a311998b4ad8fa14813984c1e96b4953d66b09bee928593edc533a591d354ce8fca7dc668b73bd1770b5e60ec43926d10ca86cf758433f7d973ee745af0d5312da19fd5dc9f19a1aa090ecb89979d699694e4c5217ce0a0bcd6d113a9ea775e792d4509f200532c1f3b6de0fbf9352832cfef5302ad7c27be9912bf98ee126f37f62fb1b9ad691ac4832566aff76dabd762540b067be03b4554a0e99ef64f2cecd06d5c7ac34e504be5ec485755f414e120d65ab1cf9de6d4233f878a9d52d38f11e321a02b0c7536936667ba0b16283d42b881a5b8b7c6f26837c0946680286a23ef4b0cbffef27383f21a923ac7047250242f341f9b2adda3541031df550739581c5705b20a5350104bfb6dea4db6194f9b2d44edfa5f865ad6aa406efcbd825431bc5e95d7642545927c342f1640e8f8bf3bf78101df1297a04154ef4faa5e00343b3bd9c066faa74851b41995cd580c5128a0ea8901f80261b3443228409cf612144cc7d2e628ea71d9cfb213d95ddb6cb04bc8e2443eabb3020b62e2f439c86f52422b054f68a653f628e5cb653ea517d0c5d209ab8407b87364d2a0504d88906f1a0a21eea0004ecc0a986c3662f1e247ea3580c50a06f135332ef569276ab58696b0a86ba598fc1ef483e1363a9d3194370063aaf0a403237e2e13b6cba083cab6b086d6dd24cfdc0bb5c054a7dfedcae2c36bb2380ad57e351bddb8ce4571ee4f5c835b8f89e9bfb51bac361b18413a3e91f24d5ce665e09af2c16f6c4daae3b8daa98f92c60916355174d7d0d87b6480e20b611b16af5810590101ed8e80832d7a8e0e3a4001d8e6b5dfa8c35d89549b83c5475e1e72308957de12bb930c2a5a2e9300d3dc375aabb731f042449375bd04699aa9738c89cd59978fa6127c8967c7694cfdd0f920fc470e6393558bc16e705cf1bfa72d7e919cd6a9b69aee9963c6d71659031bdfb6955877d22b6b42da021e4b81ea2c3dd09a568bd1978db416e1f5d6d31d6a59cc9b52c6d77b1c6d2e03e5057a6efeb8b98f7bd4ecd9d5f20669c4b26e4642bca767e934ac8b9a15a700bd4681dccd0ac2b3a45a10ce201b9682da57560479f8325eadf5b93d85b15bfcd507617393a2feb9791333fff840685edf613327f12f54c847353ae571259a0ad15f5f4f5bdd7bb570c14e8ae417cc5f6e1eead356b85bd13a397546e12dda53876a7995f779e5993f1c990be3bc508e98098d485a06bae1cd4c56815cd69e54f05e2ebf5f2a20e84b50440f25e937270b878974f9183dc485fc62ad1f02a92392414133c5a3382b469c32eb05b6b3e901d4c21413ee038d2c79e6a6b609689da688d511da461e838d6b2983cd83d35d58950e65ead9d2464243b669256c7c1456d88e44bbdd8d0e52113db4dc639b73be10de34a74efd7b0dc8abda9ef648090df6013ce212afb1a718d2203f55ecc40144cc3353489b862937db9be37aec6b2414bc7474eba80c05e84deeddb42d3bc4ae0b0362437b72e64866f8b8f36229d5abc5b1864bd4f88be53a4caec0f8a2b71f9c6e0cbe49855498517d082ba9f0068b7d64ad925ef64d3461a20f3cbba8631fe9baa4094faa2f93005bf7839c8137d004662fd106f70592176459a0a20437aebef6312ea170d52655a7c5ced9b2c216d49a67c9383a6d0f8a52ed05b74f1663a4c2ca11a19a9fd7193e2908af7cf447ba52f00ed9e6b65b6e9d21e3209e1419f45e651f746dad11f1fcf78a01c6f87cfba60c95b48d665df8a135e983a1fed63c673ab3ac213b5f18abf079a8555794041083420b64fde1382fff5844a96a1696834a1de58abfc3f8529903fa22743a44968543443f8a83360b50540334e104a5849da6838dc4656198cac6eadef6200c0a04a9f9215812a633132c9c976f66a7493decc7c42c40d3b7e30dee55f225b0c51e625ee3a0a569d3d6b69462ed7b96b731127f739a31631ee85ff9e86d4035fd038daeab31ba39d93264cb364841f2ca086fe4ef5dfe036e2f456cd234b0c2237c002a476d3065e8eac8312b54efe78c2828308d0f0cb74409781dd5eac6102ff5f0eca5d04cb412a888385e579cfb2fa692d7844d7b1577c949003f944038fab083cc0873345264391ef426e8c3d72c8b639553e2d8132af534e1d1010330e905978bd5d00e08f0504472869976106179fddfb3f81c16b5dd53820940b7df2bc2d15a02961d8cbc08b9fb50ceb0fb8aa04b7f37c0dad1f5f85be2a091bacdde220780f0d52e3ee5f9e28044f440a820415a62b277da964a96d6cd12d66807e8ea5ce28992fad95b17aa7d5f0920e85551b5275de96b818d9b3ba50206a8357b9d7ed187d366773e8b785b7d1b3c54427430bfad0786de8c64b52af6532c082bb8bffea7f882ff08c1a85a956cee05e25113819ebeaca19003b4945c2a34228c9b023c00d99a95a4a589ce79b6a615aece9fe0d300ea878bee4c4827c86359a19fb3bc4fa0bdb4759a451dbba25446e130374b04147166a8cba4109fe06939e1a8d5245d58bd190f249f20af16ab7a862f53be55ae745678225c105c3eb3998eebcdb31d24697e88264e6ce09b27ec081f0513e53444f0e65176f6eb1a9b0e4806fe6ec9ae44094b1606c1df1b171effba8b5ab5d2c39851b99916ee9539baaf7f1584deaa480aa90dc146124ec06c4448cbd67c1a812ad69bfe00d76d2576867f0a6597223ccc112256ff2552e3f40865d2800541fccbf52e5ec95a3927300ead7ec866141bda98de672bdac71417cf7f029972f1340ee94aec85f4b2955c19c71e1325488f5f619c34f39c66b3a758d3e95db79300bf3be3bca5fbc4991a1d1db5a804ade779a60d302d6b893e5338ed758bd936a01cc28350e437b34ba8f2a44b1b711663f4af02c9c827996bb10bee61dbda3852276eb3ac805e0e8cab845d511ea2f50e0ef50104728576ae2d6e722dc3741bf6a82d0fa97571abfa5fc635c742467747e0261adf606e537abf64e9b1e31d63615b5dc3ba4505150b85768f07f25c8c001cdaf46b512d3097f958ba605036d250efc6775d32e5c585e0c8d6a5db365b3d34e37311071d6f2721743249be2b2c71e5a949fb3f26325400fa86eb2662e70a4afd5457dc09bfee52ac5a69c359a424f069382002b95cceca920d9a2a5f3a4e6ff4c071068a47ac04a59c369bbfe4cbd110ef57c0add0aeb7a33eb20a2db15305906d6920413712872610c780bba0d2665ede2072e5255fb74c0611617acb14e8a43789144dab4476056fb68f1bcb8aec2df8b5ebf8d96acb3bcc5adca5d0b3121da2077956473f1dc9aaeab92e56da2070d881340ae42d2dd7981e562d90d2c43b72669a37325837657551a525b420eaf48215dfaee8612a75e206135945f909d2d5d2f707c0caf7d110483cfa7da2b11fc7ce385d05c68554031fcc3aeeb0675eb198f460ba86875e99c96936b1d87f450d444c7798a5844793b14b4ec1705c19e6591b3c4532c170f94ecff645416cd015d7aaa65d3d41065d5cdb9adba91457cbefbaa7e95ce1cf1cb5f613490464bcf843204ca8a859376c76076dc3a6227f061b26bbaa5e65e35699c898c67ac62fc95b167fece26189ed1eabaa4223cf0c6518af57a3a77577d2c17a3945858f0f2d41988f5f357e43e68e324d50889f036903f6bd6934dc8f0c4b64add0a74b830f0b7010cf6aaba73ce9d5ffd69bf3105b95aa551981872749393678fc0b6ef2a06c93755cf37f3f20c9941aadde5b1f9b142a4f03de443219dbaf3bcda2a394efa296f202c6ae94a8e8d42c61a8a033efdcda689743cf974ec39e8381f908ebbb779bb80f73bf902f121283eab686ec0b23147d41904a477b6e19ce1d6589cf9ffe2c7feb0ecbf1de8933134a1aa16fac774690a9941b2c4862264657e200410bb00d11600a0af5b8f35a29ad688eac870f99d78a061384c66bbd477caaae8d90535e5ec58e89459e2ee680b3019c0184ebb00e30640dc0388360c88da06e545e144188f6da2a72370de6a789a43c128806b696c99d3eadb78b83f067e7b452c19d6cabbf2ab20060c0602fd966b7b2b25ab8ffb3a50e0e835c5ee78d2303404bf0191e5869d82f332d1f0126ef9b921850bd4ead2f2a9737e3cd03bec83b0ba2e6c3f97feb6ea1cc8cd8e945b6ecbb22353f83b2eb1effcc71b8c2fbbb06fbedd02b12d772db16552950edfd021826bcc9e1b76c2bea9d0b90478e9d844eaf384eac167e1bc8054fb0fc9b7f3306ae9be4e5e9ce88c05ad76508b0131a97225776a54a7d502ae947255a9a9dd76ed4ed06c8429adb70556483f224cfa978c3e671ddee76503cef30dfb813cbbe8c53af63f729652dc76e389acfa2eafe27d9e58c24bc0787f330be230f8ceb8747ebd70da675590da63a98620ef8f00c4cc7b3c638b041d1f33cca28f99b48923526b136e745c515f7b784e58a9a75deff1b345559d2ccee0b49b08e8ce9962ab123c1597e04c55b6fd0fb1c429c9c6cda0e51f177625256c13223f3944631472c9aa72ffacb656511e3022aa0428e27241f9218968dd1079f9c82f4c884e3351c7f37608c4b84397018ff675bce31b9fcac1186eb422aa51cd2443a8d583afdffcff7ac79930007c788771f6df5a2cc1c5ce4ee4fc7f4db8ff4f426c3743792f28f8c5eb6bd72ae24da45aac8cf502b4cb404768029aa230dbdb8165c663b4d287ed6ddcfbe8d9f9822324d712302e6ad55f6b10534f1bd02aa07b6c23fc87d22b092c11892d2b10c5bb6d3d2878fc91d82d49ef90714e39ed8b01bcf945517f379ec570e367ce97bde662206299a0e027d06bee47b53e3b999cfbceba60f8218c54b4d2d7ae01ce39b285c5f214eb74fb96518e0f0077a4b6567b76403692a460013564f0929a5cfa09a73b2e0b488168747a20122a79508be7d7a57ad34b4213b230b29cf9c348234009bac6d14f56a82fce31d9c97a56d80ce2a3ed7d0e294f18f6d4d8c553c88f8e0504bb93d513425769a82925c2485b1a2c4f7d8ebb2cbd8f538962525cfc449f274fcb2db3bd68f02d4b7a7752d507b2e53b12f596d361227407f5b0a40dffd8683af8c3b798e4d0090a8eb4e7a9438ae7fdf91838e91203190b932f94616950689dab10a58c70cee8e02ec9f12f77132d856c9d50cf78598d7c5577114943f23a7c5e946c18a5efb13d500e0ac5a18fa838c2320890e0563b0ce08bdf2c37886494246977a406f276de1b497078ef581c9b648c5fc5b1a92ff6daae81bf6f37b3e077d5bd64f70cdf878c5c95979fefd1d38c82f2e282d3cbb6717f4036cc4226167d4d5716324ed84522b85c85d7938047023100319ca1876cb01cea87b3ba3e5a9067b3abd65ba275888c59843a36431959c28127ee1a395b850e3c410d87db3561f608f9bc5402651542a9cbeb9a895cb326cc5b75e86e33353b77d29151ebe51acd1a799bf9a73eaf98473308d3972587215cc49b14f67c141df9c0e8fa9633eeb60bb329c39891d223f28b534cb6c10729f3b217d8e08058e0fbd6585ac424ebccf1e503889ca4c3309db2d2d20278f279391259af3f97253593d4d7722977cfcc70c42ac674656919eeabac755cb3be354033c51ce53207e30b04322cbaf0002526b8c870ebce9057a91199a116f79cdaa538ff6862feb687f5ffde571a50a71e932657e4b731ebce20955ed8ce8ff85eef52297b44dee13954b7bf1d9fa59b600811a77bea574523cd6d8e82851b78bbba843a185f077a7239e37fe8e20f30159ca5d72dde56879e58bce508dd131a59f05be0fb19ff66720bfe98ee3af13381f8827f1f87a01a38d8c4691af14dcfaa66d25bb6425db84a300311ddd7448753c748fd5a7deae10ad79550c2f4cf5870d0e9f5172c3bdef40c780d02461adf47dba0f63326c9650ebada3b7022088736ce244610503496f57dd780da6d5641ba117130bb0592bcd340dc980376c2c8c56cbc2d7cbf4145b481e189cdf6088f672018ca1362486929ee31c58870c145fb77b2a88a77c5740247d3ed0aa93995556e16a6cf54ec50c8fb439b36a5f2df4ba58fc56fe24ea5c0e1ed2d02dda7574041945de60193b7e6bef0ce54f8272daf4e0e8ca270833514ca29aa6c34eda0a7f2c3006a4ab3b206ead5657c1e28998d6c0fefd73c3e70bc3942c79d2804cfba8e9ff061aef1e3e22a0e384e88207470850f26cb56d9ef2a349d3fd1da1cadfc3053d5f3efcbfc12eb5b9418a20c10a324ad960e9ce7e3e9b80fe15c4f6cb7147fa2e5a9e088e024377b9aa1d7efb13bb6a0606f43994ff5a4536915a03b0c62efe0d72105db0e432f7843e87c147f9be90d9d0b061001f3efe909129d31ae53b4c4f0c60dfa2758613cd4ea3885af81366fdd291bd5203181a810cc692e9f2d32c2be30dde755af28fa446e9c1cdb17165755bccbcb574485014a7f771133f8780fdab2ca3b694812b90544b4853fb66f2e06d4dd9b27c3fa9fd9ad763f54ef1a2456ac801155d496a87ed31b14ca8b2e65bdb21afa4335620e4199f1c01a95d1a7f95a630d9a57b318aada9d6aa88f752c6fa74e61643517c6b74452a7ee5573c38a954bc919b75e4dc91aad4ca09ae8437285f15753bd7aa53149809cbadae0bd4358328bed8453db872b5b5e7943720d75cfb57f19c0569e66ce5e1f303491f8e70191452c0021e68093c996585c54d7e5c614337f871353e071ab7aa3ac2bc13b5d531d200665d20ad4354762192299c3ba021da4fc92a6a60ba1581537322f10a91ae87a7111a018f4b2ed53a8f3353aa00b7640a59622f54f4504e54b6b827ed46e343c9b393a18e10709051f0c565d656112531c28697cd18223517950008c2de9b2406065f66b27fdfe2f7652bc91d7784684d608d70118dfeaa2849cef3fd7eaed4d65fc1db2504cec0a17e3802b9fbc5287adcfdfcd0da3a08a36c7275bf723a5092d5a43354f1dfa91b7b81249b1ac483ba0b3bed162c8739c2194dda0e93c5403a9525f934f0ed27f33a1004451add5375c38182280ca59dabcbee0852d337f8eead25c6294a5a6f27c57ef0ef8d8d683831e1ee9f9b8d424f4d4510b39fb4f6393148416a1ea334db1dc3ed02744fb2a0850560fa51f1b3f3e22f531e83d7148ca20e31b8a3e5f89e27b86814e3f2350363afd7a7ea6881b8772720ffdebf999d935028599b8950ae780d767b4bd10e2738105e04658384350778f018fb4f38ffc915c07e88b203f7959f3d464cd3168bfc60d9e8438498d8dbcc9fd81e0f82c1dd759884d33cee890a180713ff51446f2b2a64f0872d915bbd29e59b742ccf79655081253c656b37136dcd0b750a164b8a141e73d6ed9a05fed4896643a21a92abe392baea8ce1d805748f6b9699309d10478b4c9abc35da97b7b95611b782d817dfe578b7987cb494c09d5146971ba5348098cd2d23318d1c500635d3ba46bb8764c149519be81ccea60084680329ba50e56efc8055b93d5cf66df3dcb083deec5eccf4dcdbdeebe0ad6f72231829b9b0ffa0e94f2b21b71e45ce34e06f2eae492f164ecea7ad5455b8731ab803c9dcb9f5b73bb039332575d0d8c7030eabe3823a39f40c4373805438de90777f91c14d803e1fce741635d55ff7e3347757aae47607f3a08af5cf2bda80f3426bdaf9d99bbcf67788adc8cd70e4640b16f6cfdc12965c447bb58b9270e3e29913169793187dc5bd5a94bfe3d9d67a6089ff6deabc7faf94c2fd6f893f8e1b289877b151c60013677cf8450700b708899ac17631e6fe339b5ff5d41234f6d0db81c9b7f7f0c8e22b14daeea0d0794b7bcc5d9156639c5f769bf3184a272be10ee175945a838a5744583b94c5c83b1a9bf65899de7d6a16ab06d6fbcb90dfa94ef9aca1ea36a9caebb0850cf7a49e8a3fefcf6d008df17ba28047b2c44deaee22dcb43e0a505946d4917947e936836d356e804979111bcdda26546129b86e79c23423e4adbddb4a45b59f5b41ad1ebc146c92deba371a53045e9921281b2a3b3172e32e4c3e668a8bf0d3b72dc273eb0fb85054101858f515d264378c41db07bf46490f3c1e37c782da1b7948838090217a0cb579313bbbad0ad797c6a23d3fa208a3534f03dcaa42332299fdf3c8e7ce3f05c12be52896c59f1c1f7053ae879c8fdc890ce21d58d06a954fe43e54b830df91aefdfa47def862d8c747b0ff80bc18d581ced0bfc5262640f788d9a6a548143425f73687b63000d7c1325229b858fbddf12e5724aabfd609da5ec72fd92512d906de9667ac87dea01a15f37267ae0368f52c34562456ff5ebba5c1f5e0fdfc0632c116ba1137dd23dd6e795bac56d52575d090d6995a236fa1b04541e8ed8b69e72bfaf4a0ff2801d42c7a1d03ce1b212c3e4add1720382218e4ae737a143ab290de3106702232d59cca3baa8c65ef6315cd90fbc888fb6d6a0aff6a74e345a9958f6daf6c3ac642f4f13cb4a3029b7b03ea5e0b9667a02d33449b673c6ef0a04d324b4572497c532a3754af71f70233f20e63ccb719cd8a28288b908273703b1d8728d9d95104149d7598772718e3051a6d2563b33ea956ea46d750822deba16b581d27bd1a44bc5b6fba49f20b9a834a72dde3de968e18df25185ac2680ac350049f661a2a4f4d0344a91be613d581ec162ff79581c6e9bd6dce0eebf706f92f4473521295cd090588af1a2d225d9e6958ead2176233a422b1a6dd16195a662fee2a6b448250f99121859c166982b1c7cf4ebcaad70e402a5aa5c0f9e43264d8ff8c4ede76e0abff10a12bea860651de820bc8b6030a403cfc7594396fcf9175facb89b5c62edf23b4df01e6200b131d0dc367d4be10fed366eb9a58f45eb4129caa3d9b432aeebdea940cb3a59042e0cdd4b4bc55bfb2dd112b98444d02ef79e796964af1724ce99578ebc7db2170eaff47ab6868fb480b27912548c28a07c72c317cd03383b235d075b02f5e24d43253def57fc9e5edd4211d3fe37929bab7e157bc5d24c928198deb936949ceab0d12c09c6846266bb2498c809baa06c20e6210d3464f1e19a452f9d33243111bd6c86c91e911a120c378bee41084645d8e78f192a5a8114511919868321d1bd4890d446f477db6ba46cbac89713ae33e16dc4c5a830e3c7a3c39c4a105dc245a3b9480cec167f216e45d4a09fd08406ae7ee931b56c45ac2dde56e71ff00e87bbdc445690d8eb0b17e55cb8a1e346b7e350f63e9d81f7cf720e331cc1e8ccf7a207a4118cf35b764651f7bf6cb6098421db6855b3a4ffca74f33696cd29275196e50131d34f43c3ccf1e33614c21537712625b4de8686c1faaec4f31785819e89d33d66e3cfe8077fa239590915669520a946f937ecd19bb990ee8368d95a7e2aff5787fbf979e42f6be2ba3ed2066a5e9e77791272c4fbcede04f54dfae482b1a1dcdaba7987a15f5798bf389557901702a1b869eb847d2961691f41d8d3f0ad05a458516f495d944ae2e485c696c85a3cb146368f393e8690981adea710b8f26b191c6e7471f0e7e7523d01f9d735013b50e03bf48e30bc15f1d282517e8f88b7328de6d1e5c6ef25278b7c71b0e88c6a0ba08da4b2993dd608afdf27aba945b2758d923a9219fb408d04bb24e48cd5c415d4cd096a7950d6b96bc3ab6250ce00f7868f487e961eb35441ef831043485a659fe23cbf618b2c4a2b5d38b65b1a520e1d8a36d88b7fd22f3498cba53519a67cce35e58c2f0161537bfb504c5092872f5cfa949a6c3e0c3b1390230c9acf777641044805b3bbadb472f5c1fcd445566fb6a68c46d3b4191bbed1e313088c53597cf8c065e0cb0e3b103f89bf3bf1eb4c3490621e78c8c3b9364ef146e443075b3988eaedf1f44533c0afe80fa869b127045c11413346682021d63dea89457a815acde9a2a7c84785a9a45448a92db314813045134d1902a77edea933fe14d450f3aa615712dda87c72d40aa4c8aff616012e02eb802b8533fc5d3527e0c85ab50da887254c00a84c20faad369da83e2ad950188aa4e10630263acfd0da077832fde268d07d4040b601212b01d702035f129c09ff4213e39af7e17e5432f31fb4109c32d727c4877a402e00187268111eb8a707a1a8234604beedb7087a7f60d1fb10582d4d3c4a63f782d3ff89a4a9428855251c123745681577881ea9387196d02616c87503f900c6fc1880955d02c4364a7cc16c1340bb65868fad58e2abd6b4f89afd3a8074c81e9fdbb1c5170d28f035cb3980b03e0ee09698f125d97680e890009f7464425c0db0397b5d332eef8fc1716593389800716354e5138d12d5066ba26c696a32f2d5e111c2639a7c0e8026352c8cd7acf58a915e6f4e7ce75e19789e7a7125d9992bc10493ca7e09c1a7c51dd09273e851c4e79095a37f6e1a4cada6fe4187c7b54d0061c83cbf4a0f90c0741d3107cbc442d60c8cbb1f69a4647756dedcd2b79fb18a282da56f5ba79ceb094452c878d9c5a6150bb6c0ce12c182b4c05a0f0ddc4dd5b8cd669df820fae876eb66be6b2b835eacd70862b73ce33e0dc30de6b13cb5da0ecaae57387b95497c96dbb597685db16fe17eb06b142a56a89f5425fedcf6b5b9e25a6411cb948267d181ccaa6120b5c852e6692234d97351654b26c6d2c1554427b5f39cf963aa5be1f7668484a9bb89ebd93ce8f3b3fb1b29420986c095f0fcc2d5fecc09d7ca8e8674988d5f4714b053ed944728fa15a0e10a20106d422d817a310604c3cc7b7db2e7d5d612dfd45580bac2161e8edd7b8a9c5638be4ae60577da5dfc1cbe1662cfdb4edb62f1299ef6b4aebbef028c9277a3e4033e6ece96c960b3f3d6e1df50504b9059ce820edf0872c994a465d8b47a2f4e782c5f3203ecbaeef5213cb2947b9554603380060b0a7058e44f67f085c58f9cefdaf4bff23e941d91f505c383679d780f0ae33567d49ec4644a452d2f84a64c59c4ff4430ddcd9509884c78c8813a066d429d3cfc2dd86f3bfab4400294d67552a52a66f3083674512d47385ff1978f4aeae57d8b3fc9e745f4de4d95fff56645e08bdd883436465f2595a4824c5a0987d914d057b40d299a7fe247a6b70033cfe708fb5447026ea12ea58e7eee0df8ea24e17144428ef61285c99741331a117a247ead8e5ee69150c0bf3f63d28cd317ffb3737937adb385e6c1aff2824979869adeb4bd40c322a230ba2b61b1598a929383e3936428ef681eebc404059bf142d86f43662d4f91baf9a5194989ce846d291f8b88e7602c42a6f0101177e0c23153e026b6989f196053f60dee5c1ad9b0a288fc9f842bdfd8ac354b7912762d7cb00334198a0412469e3c1554cc12822f6b8ecc02063ed455db180837878f6f959ac4e110966681ae18926653c33a9aad618be116d64098b8c8f69695a0ca2ac7a1fe4a563b8acb978a217a6fb280aeec3be9b5c61265ec58bcd6426be1b77353b34947b1d92fbe7c18bb20ff157a436ad8b91d77a51db5ee03e692e450d79c13b52a9d752fb687dbea6e3d44660814da6e593a9c0225136cc0108adae94bb3d4ee5037e110afe09c4970b88a5581ce092d025bc727b57999c8853aabf2d59b0abe0772cc95889b27de0c55d96985a4e4b02ea464579ba6aa014987432ba2b22d4019d28fd303f6a16b8e440720f4b51c503dc8a4c612c26e56224e5ada56ddffbc3918057de5e05182c4d48f77a5aa03287212bc6e4c863876c68ca2f887a3746c8fe434537a1ab0f95484367090def8df043477ec520f976981368d9545ad57776417516165a3cebe72d0579ac38420ec2078b67e0c504cc3779b2143f523fdb6ef30a8d214e716e096510af5ac28c26aea29aa9fa5827b691002f25d48f2fc9bd0386e76c1b2635ee25582067b04216d316299f898eaf9cb2ff188fa153f8265129dc6f957513050074b2ad25165bec53e7828bf28cdb73f177e86f757b9e26ac6187ce5f1bd16b504f869676b0c5b63480d8e9b907f324c6c5b3719a64a3770b2f5f96f1cfd86c8d3cc818ba9c75194baab65693744cec8ba6590abf9bbb28832c0ff54950c63f08d1588162f5f085e2a1b570b998ffab2ee046344c9017ac1694d04b8d1b143c399006f383d52792cbc5c3ed11669dfd2e81a9f1620ddba57b3994034d22da67a74538fed7e7ea42c26d7d015a45c05e94b9df734e23cb69593b44a595ce729511ae58329ca322a6f93eed704b10176050ebe6da103bb69d2a75f14e9841c8f9ab49b9362c5153867111eacd9bb7e99275771f170338816146fad39958dfd944c572dc49fab01ab86133544874b93d3866ee392901ef5d3a6b54a7ce36d7ada42c28432161f601f85a29a421962c38cc780d5608dd4c880af3b95d4dcb0aeb2297e63d8f7a29f52f2779ad08321d8b858a07e9c824db706729e723eaf0c0883fcbb7aa94e00cf1b1343902a5e567a239df9751cad29f33dbe9f8283bd029d3f739d563ad1579368c527a4de90996fca0fd973974ae5ff6b3377bea2fc5556309dfb704f8656cd1eb34c173bca2abce1d08fb34534a1e1db205fbffcd8f1269502c886720abccf48cb89ab62eb85d93ef4ec77f690c393d9f9683d8e4b78ec84f8e1745136f39936573dbb662364d606456b809fe2acba1a79c1228931d5fd8b6e02383d6e0e3c295e61a60d7fe92f05fc2c2bc700e0fa5712a30d4218f64f416fb8db38c0c6074822c671e7a47aa6b205b1c0c83930cd39f97f10bc1d56c51b1787af362d1a166f52f33a8ee1d67d0cd6cf8abe9b0001d2503d031cad50860f674800725827f0589fc75058968028c74a9176d7237e452752894cc970c6b087892ed068e1610d6282268f34e65c041446fe03b6c15bcdbd12d8d3f667f69ae144dc9d84e1ec676b17ad93b4127625db3b95257807f3636ce822a8c415e952d7ba24af4dad7b63e60139152b4c6e2890031495fa79c2ec3510f952fe810435223cdae6f076c36aa7d6ca68b6cd606cf16d606b3ec0b16ad23179d32ecc62e7d088eea309b2b48580cb49295bea6097525fd0b7e70b0b26bbcff29a75c4c24e1cb7820f1d50e73c37773cdc27525fae698aa14c9d0660e705d309f508b4fd329236a001e540de3baf3f692682b2fe8d160863a05bb693c3a19cae8b5ee19315f628b74fd316c476a93f9b96c4aea55ea5576bb57cf216f8672a261c920002a2a4d3f92ffa541f400140ca6b0ea867ac754121bd1326706164b040491a4ac5f01cbe26198a0ce37e59b7ab1df34bfbec1f57ad60d099d865c4c27df542a7761d7a2a22e8f9a77b02bf86efb4df4a7df8ec321e47893243342f69a276e08e4d1f3aceb9c7ae8d17b2560b28850bda3be3df2e1bfa52192351143de050947718827ed0f6a38cbf30fbfdae52cd4d7c3bac5694f9b17214886814ce7419350a7f4ada37ce0d2c9aba6f31d535d4d73e9e06254c43cfcc940e0b007915e6ea783a45364aa3c90fe680b562e60776978c5959d99ce7974f598543659548f005320fdee64943e903f7dac8910ae484065d7deede80b1c4855983947149c76d1d51c6d1a35b57bdd2f933563901beda3b79892a491844d71b35d93c2876e5ab6dd41776212c8a55fbed571538836e1cd31975224323685080ca36c3f33c283318c7a0fb87b82de7368615e4e2dd4521dc6f07d1fca90533ad56c1b48ff027f83d37b436554552eb7935325a2382bd788e1328d97c407a8fe37996dc52bf162b524721a9d8f58476d23f6b3f6cd4afcab782cee2db896ea319aa8c40d7c2197d974319f41beb59da1bf591d6eb2bb1d5171239875f8ab78507aebc7924e3c9d14b086c12e056232510b0aa3f8a61a6c6a9ce7ff167b7daff5b87b9798707ef791087417a74af1844300a0040110521a41071dc4a97168037aed912a262f033961b57746b35a973b6e1cda5dc73c9998448c2cf57a67c809d941adc021ee5b8458fd624a9b163cb22095cdef7a43f46d8cee3094c16a8ddabe5f382fbab1569a713ee2679d3c436065ec1e8fc0cad121952cf8c19efb4f53a73b898ebf46449adeffb12c502103a88ef94506be50f0efc9e569c6ecf019f61fa32f42e18141df0c822c5722bf8fe2320b79a1b8e82ff6a7699aff3caf8823b97265f57a2ad016f8ca60c25fff6df9fd799d835ed1423505a853a828c8a891223f6cc902c0e96e4dd968c5991246a2eff33bad00db715d96f917c07d1baf0665e5682690c331f090d9219184191870e32c89d7b2c4bd80acf50d25d8c0849c770fdc3acc56c7d25aec2c4039747a543f3c2caa1b2a285b9ce148dea2d29eb3e56e1782cf9c0c06f94c8e7b88ec0e7241762c183f1d30f959c5d101562c964954a6d584fb3137b7a7b0a2f38228e42caafad812896572c538a46cee60fe04d6ad952ec766906a2bbdda3cd09f22312ec947108f1d41915ded77c950995d546a5366cdd613d6a980a014e06a2b86dc14f931d1ef6e8943a9cf4266a9a29794304a3102c5a687ff286bf59172dd69bf227497e0668d3e63a063ca8dab91821d52e528caa9535bc71d8c3570525fd8c332dac86712438ca8e1496ab11dcbd7583cd621030ace92bd8634b92f98e3640125fae94a6199cb7198d780ed54edc47df6211cfc2035a7e0130ae0440cc3be72cde60c7cfc0315531b9e47bd4c1dd8bddd01fa90387c2a2e95ba1153041d2098645f680516b8f4c7e478a71953cb775a0755bd70395d8b65345c75c0887c90c765993c8572b758efda304b142610ad0b03a5bf912c91c905023d519edaeca6c075242c27c19d6d325d5d57101b4ef1eb901f50e7ab0f6cb4ec765385dbcb09e681a4d6e6b260f76d1cf87a728067c2f8c9aeb35c758333ac4b6823f0bb97b26abe65785ad79fe6ada11babd7240f38ca1e6bbc0fb47a103beac59f838ac2268f6cc895f23899dea2c3a4bf72ff41de51994f5ea5b1e84d96f444884fab60b39db63d8a3f3f8b13103c35610572e17c02692c35ae426cf4c47455f8a647cb36beeca2ed1c7a52c3616951fa93e9aec10c128a48247075cf7d75f434ad65a9046bd03a91ce8c33732daafdba97d13b3f4d78964fa2b94a17b9898427ff19bf12a0a1bfa79832af4479333a2a39918c166dac6c0d3a1c3c6762bb019cb674174be0b056d53e6716a002123f8a0491993c87ca730c9e05a73611df60ee2d3ecc6e1b7d78d0320f8f18f0c88eec964dd850e49038ca3f3fc69285d418232ab414980caf82e66868d9e99e9a09f413f1beb4d17b543e5ab6c55a4dc71ff70175af6c1b2b21f943382a6b49b1413343631c5dd6b8fff9d3c10dcd11fad0e4067904da4a3ac42ca70675ccf7054c2b9ac76eea655ba13a1c5b0d65cd176b73b54f0dbe3751b3815dc51ba763a682c361e37c9cfd6f8b894dcd7485d58b7c00843aefb5e392fe748a5dbbce3f95cc1af25c341cdf3b9670430d7eaa8b8af69fef728d055e9f5e319d4e5fb83461c795bf2b119f75d4a2957bfc3ddf12b452d026084275f471df4ffb8449bfb9a74b2310842a9f92c22ce166830b56496f4d1ca10a8b5195f0f32fcc76c8f66c9ea61ff8a53a83d318ad0f4c14532ab465a9f523313a90e8c53d13f46a5daf184687696cc29906f22f9f783e9334fd1b18e3f33a1e11b31db26f458a55f47516503d041d32d8344801a08ca404fce13646a62bad2e2946e2d926e44d58c79f7105e46bbe78bf4d53d9e5812be8b17c3486559df002cb2514dd57d0e464b6f02e944ba4f16d191e4c70cca2a60eb9cd0fab2f064260ff24bffa765ce4729a617ec16aed322d86cf242672b44ba8e0c2ae3c20e99d4539cec0cb5b856607e0244cf8beb4bb682b6d702a21959d71ebfd6252afc7c7df419048e40525860b770f24658ddc307901758b87aeb28357565b5bd06da9c08300ac50d25edc0eca658a416179f96a785994fc4afc099ab7c621b242a69eb1b25e8d680e32e50bffe7e6fa9e4634cbce2c2ba66fa58f45a76918f816e2f63a09615858a2cb790c77ec5acf365495440200f1676470dc632d012013dbf5c2e21f04d555bc8684533dadc0f67f459207e8c689a832f60c7cc2c6e5da09987aa8a8cc00efde700c50440b31889ed6aec077c6e42b734f3269a08b95199a48e4e4f62572fe097c1e533757e3fbcff806156f8e897776292b2560a63b80022b7cbe7248ca41724a608d768d21a4bd7a6474b4a81f079aed62221a13ef3ff006412cd323de27b79d75fa29e8e65665937577aee064e8b0acf928a988074f63996da90868c34f52d8b3d1ebfce83751084add5178e46d7d0d8bc6beb46d105de8596a0a4a3ab7090821b83b83be4e216b72dcfea793f2a92ef3b9cd6d3cd27eea3f7db2d0eabaa513920cfd05c3f6599b5f03dc698f04d83526b765abd4cdb2e9e2d26a3f2747c4229c087adedc5500072e5118e4848fbd186c54c2481f348e78a40d28a4cd8323223a4dbff4298746e42d5d2cd413468a16e50d780c99d96833ed3fe26256e931f5fa667f620397403daee333474de2a28a1837de41474faf87b30808241d2905564136ba266cc7a7b58a93bfe0d7b1d44894aa6dbd659602aa898e3f54bad2b9fb2cc105145ca8878d817d3075a74fc17085d9d485679df5441426a7ab6d4c2aa20bd49e36cd71d875ee2fcfd62d88b39f843823f15512980e15dc7eeded22eb54dace50db595c08c163dcbdf074d0be7441b8280e40b5bf0f32c801c15cd8f77cb74e15fde27d58364a09556436a4dcf3d45bbd55b48b68821b916a0acf572665062b4f270d004178aceac1ae2eec9b306b009b86f6d711aae6684799fa01ef0023360667f356ab586c0c659ddc3babd62abd1659c6ca4794f18d991732439b2bdc2587e74433bcabf94b5b26604f8526cc0bf89295a8abaaff897750c88232988a2d47ed19b9d2dbdc2323e4e995d520bc11fc439fb8865660a1e4067c6b364baa2bc35a88819c4ed6e21defe683388991f2dd76d725bdd0c2e7efb5650fc607605e5d919cf28300619ccb5b9341706007ec927854f7e903926f42a2851bc0ff5531e8d94af0155c956b54804e45b3874219812568057a6691430450306af929a795415fdde6d2cfb4668e0e6cdb4d8b8280443d2a001d01cc8c82d730765c6ac02b0b327fa6a4f22ee541f9630f4f7e3591b68ae8081813549da3aa7650caa5777fe7175cba521e52fec287d74dd2b11560578170ef4f3061c5ca491135f730eb3b1849927c79fd465f5c086f8b98e2b92444d4f4914e0fa5e100cdec3f61d90e5657de86017c013700c0515a26c0f3a1f655de048b0a047e7484d5a691ad33d9541ef17460a1a5e3ccca318009bf04abafc8aca7586a35ec78d16120c4ffa5def82bac6d208dae13433c13ab6ce8e3b804ee32fc7ce8723081271e9823209849d16aa4820aa92640c466d02a69223e58a9c09693b13af20899c8869213e2782c356198b3094d59b63c99141777a97c688a57e2d46d88b2a54b1bb4bac3f4ded09a450d9767c3056d932f742cee0e571e438e79c559ca18236162f672e5891ace68985658b78daf281bc163f8bc5812b322cddc8d9dbeb37016df4d7dd6d0033c021d0f9409be4337b1e6cd6d35c7edf29dd448f729637c7a573d44f846f25828d3cecc3fef0f541cbbbc127ebe33a29f50957bbe4da06133882063a53719dfa8f445880d4b454207e8811999064764435f3a9357c9addd1a175563c006db4468bc549b16e2346205a64c3983d58d0f96c6d1fe4284e2b4df6dff28f6178e4f779e3233d586a66bdfdc6a9fef04a3bfdc448ab2537647f3874f5c8fe01a9a0d471c55a88909667648571d501d72e54487337a19366da062e64128244af5112945ab9d16d7311ad2626e3b9a19310db46396f381e44315e6a1bcb8eb565db5e25257007891491365505ac527f31e905b2c5447bfb697679f368a12e8f504900870db0b79b1e1a50f733c62fccba62cc60685c79b598210c3e63e7674cfc386c1538c55b33e1d0dddca2a793f9ee67592ad7304dc58b6d744dc8141368d3e70881039fc9510e7cd5a10761d698bdfd866f4472d6cd0ca8ab137be7f906046b49606b619f062d3a665e66a31e3b391e99a2be9d412176254ddf34556e34614ab1a32420f4f8d3d356d86559877e276ac6445415b89b1afb394c0a9765f932e18a7dc028c6f1279da3968fee2fa72164cfffa47921d045ba901ef9a6453fc7a13752b8aee19e04cd50d99a40541c0e09beb0d203975c8360f8a6cf929c6472afbbbe0e1948250b4cc91991ef8817c7fd8187ecdcba4c234900ef8c2ac0245fe7c886fe249d61585c2c7702b345095e587206483bc2bfcd4d81233d2b9090c3dc50a98094c2a78b92fa80c1c7476719f4248b6c7e8f6088cdbc6598c29b902ed66314e25adeab514afa3e2134c6426612bca52fd07474e6283a8a773995794eb7ba1c501049a36f901fa638bf19a9b3f205fd88f7cd8ecbaecc811e4dccc97bf94d0e013e8c6913cf59e2da537827de165d3207de2bb201b95c8cf0663a02f005d2e15920c9f75fcd266beb2434978ec6aaa1617cb79545953494804e1b5ab96e1d7cf552839adab2a8b269a0501715b8035d430935ef22374351317cb4f3cc621c65dff9f555aea8206403dbcbc21886ee373edbe7c7664b812f1aa31eb5f50043b9b98a37ce19635bccf6d08c83e8a203a5f0d986334ffe0fb4eb5b5bdc89c46e84233c195305742bc4e41d3f9c59c3720eb8b70c7db586b8608575886adf175a99fe1374bf96f18503f16f2f20198e2dd07dfb989778a2a3e8d44b3b189690fc6de638b208e628c34bca2c84401d33fafdd50b02fb0568ea1f1c97e851307cd6b68b3cbb0ec6b79ea9aaa41542354c67a350a50360466f69c0ff97c3b9e0532a7e6ab2a1ca8acf5047fc826772fb054fcbd9ed1722eaeba446ac4ddd078b82eee84bb840cf2e6522d2d4b03b2a42c3ab67adfe63c3e9e28181eaf9e45c04cfa677b0d72942cb238ee02a15c50b0906b007b2a03bb1f311915f0dd25b18327a2315bba256c4538e74925c23f94a45895462b85807d965a388668c503e7186104e8a970133ae8643b74ec9974f6c7df41a65719a0fa9f9e850de4b6628a8771b16ec3f7c6210954bf8f8d99c5d9de834fa446686e39b17ae36d886e65574f1b2942f7e1a854f8c107051ff69f8fab8b444e370b7a41d3fa960368555bb18b9dea8bb23b49e41361bf159fa6bdc051f269c99f5252e272e4c95e2253d03e169dff1a0575e094ea794433f27846dde5dc989b443d07590e4ba049fe003f18e5311c712318e1e0f0ea223d38b79d966498e4c14066a48b69d1f42909a748018f1707889c43396e5614ceba271460ec00d60dd038e2c48aa886402343c479eb739d98bee7f5704d43038752d933d52a18d767de55ed4ce8634c2dc691136e4c72259080248662f77d087f2bdfeba025141d185661518ccf1efb62f706cebac8df77dfeb7829c410dfeb31111d8754967b999cdd24ece64538bc6cf4af5d36e15dba52a3d335bf6b42d025d830e8e1bc853f41392d656f5020f3088793b5608ba108ef79d796e65381fcb42a3e902c40af437a3b9c889136f041501718bf65ccf64a227dcad6e5e8837d6188a90ae9e100c7797b2755c06a759c705b940b7205dfc16738e5260f4f23503ed7a3c3b6eb9f34a1cd3679b2c42b0bdc080bbaaffcb7736ac1ce8822717201a20fa318d320d3d9803dc485fc81dc71139b2390195e9e39a39ddc86d5f19d627c2c8f8bb48b2b2626334cdba3bc23aa95bcb78cfd04a85ffacf3759b8c112384296a8b84d9a12ecd9fb2a5286e681cb69760ad21a196a2d3098940d85de076b10d0a0b6463fea28ec0960db85c9cad6947d73cbd1816af73501c8569f977bdd4396a95c9fd4036fcf318f33bf71d5c1aabf7bb1c4eee9c69a24239bf3e991694659a6ceb0a67a561194d189b1a879f9e2f7b8d918b0230b11683a813c2a0b229cf795db62f27f5b7fe16ac663daa0467de54e0f7e0a0d10a750e2a8a7daa46868f08332bf00fa710ef8812a252a08baa1f7ab202f1ea9854ed58ed282e1b0169e95e0d282256447e273419cbab6d62841ab1f39ad3d289ad97ba96663a2729edba4f9005293733def0f3c685d479e85126294c9d180e8fd46f268563deca652f6a0da68ffab46c4ca248ee28028e78548da0b25a18620c49f7ffd4dbcf0d944f137b5798e698c82859ff1e31636d20b961ae553441bca14c0da306300044a6f08b47adf3fe91acb1793f6a2b05a8d0571ba0749a29d9381a1d09b42439032de208f5e99c80332f44feec25679d4b5c09e546cf7763d71383644df8ea152f422aec22029cf15438483d671eb070e40db1370aa3a1fd1fad65d39183a7945f5b3e8cb8b412756067d714c057a4c76960dc051b6cdd141eaf7419f3b96e75039f68ccb391f47107900641873c5ce456c750fd49acdf585c6607590784743f07487c9a07356c37261b436cfaca9403e41bc0763f96f3eeb5a633dba929171b74845097d41860dc938381c809616208e965ff217a1ec056eebc899c032acb1dd45778bafaed9329ecd469b658c26eb1fe30d30a95812b3580daa95cec65b4fd322adc15f1ff72503b8024d276e326b838fbe462cd0832ff247584c6cd53c30f5a82bf5f10d7c54e439be039c8d9d175e14b64653e73167b5ba7cf8e45551a5a0559245b6c00bd07259ecef6d5d32bbe58c88d0a94501ae2eb78befc1d9d978e16ffba20dcf119c1eae9c3773a5c009093910456b890abda281df349a2d525d94b850c8c241e17412b41c4468097eba093e0e44f6f9419b9d8cd65b104ee39d7f823032a9f39595a6aa5dbb579008f0fd0f447818a6d883831cccca5a3738b80d46a29b0c80682365e22481de58ac33be125cc898325b723b6e2743cc4d5a9742c85c173dcc8ba6288b564270c0d8ea8ba0d95748754a9e2c3869506b1125ad4587628409782b777670b450aae0dadc7427a1931cb18fc32096310d690e83b15c41a70b49d48065e6d275cd3ed12db0c190897c2ffa289c85f416d3bdc71e1f79d506e5ab34a56b453d64fe1ecc01ace679051954b12d09950834609cf47869b8e47fcd8618f0004db933b4c34c0daaccfb1bb8aebe31abff037c7196f342f06a10d37c91ac2e571057ec46e1d7c0d36542008bb01e1202c4c8baafa43b427b070e0c5ce0bb4e10f427b8a843f933a86c7c0c2f33ca04ec93d4200b05014484e18bc105cec6ca2ea080e2683bfe45249bf0166469daa1e98d4ebdc5ebe3b98b535af4c2e93a4e927058e971ae83c9f14a89f676523af92ea2f6eaf90390f549e2247d4f006e813aea7fe5ca778a2aaa7476c0563d565fcf51b036a5718e63c609afb47a00640033bbc37173635cb115e79a69ef052e0d278d34c60ea1e76bb9684212d6adc9cfb8ebe5965513c855e5eceebcff63916632e0c3f0259a5e1a0b7820301cb08c29525b3b9fb810be830b6a8063ed923063dddce85d0dc9e28766a52d204d50cde79f10920191e633d778395102a4ea990f8c225518140a5d2ec9144c1eace8c0de99e1d6837317736e223627978b097f37a2fe370f7635cfda6d67d9f87cdc068f5f0045e425378475f6536111e07f8f08e2ef7fb911582bc705723ce1e707285d5b8c65b32993920cab0a4e466cff1ce5f33f45a6051859a72c1245094fc803055170f1f60295496853d085f96dd8dd750e022ec3fbd8a8249a803fd538f901a6a99860e50d5b67fd369ce10f412bc3e7f144e98daf86c99aedceaa19b4c07a1ae1b82b3636b386c58c660a0670bf06a281ab25e7b4d7bd2e39355840bfb1360d376028057306aca0b64f385c83e1d8fa63381100dede98ee974f7f5e0984b3f61e306562661e1e273689b4eb2baded4aff084c5e8e88041047dc264a66c4b589996e88052f137e3cbe3770134a5e77341f3de32ae1a79580d0c153263815532a0aa81ff0bac3e43e57ecf66282a5164d89eba1f5138632db4f82afabc505a49e2071f93b10a50f7d06fddb47e2852c52438e3ac1b4f299d421808d62915598b31e427054c22045afef29b5b20922ae21c14c39afdb3fc63d8ebb3b80c3fe5e319b804fabd03dff37032fef1ea499fff9efc3e03d837b04e09547730783244480802200843fc0501a834773ae3701a26a7881916ba6d4ad500d5ef3e82682f2d59d95b4a99a40cb209a009c609a9ee05dbb66dbb646899c9a6caf89b5cba556d86aacd50b519124ac2f2d2765d4bcb0b1b5821884d046c784020c6c5b6f86e3836f58297d65a6badf5bc4f0dd7a1c24007413a833166c1a42ff45961b41ed675dc1fa0060c56af9cd5ca761c58a9b40a5b526b4c081625062b0108442044c80742155661aa303523c3d66ab76de338fc81f77e0805f8051cd930e7d4fecfa8e852165f47a4cc9c0b050c7adc2b561e0ea0236808941a30863e69ac016eadedbaae336d679858262532994c2693c9641645adecdf65a5528eff30c71a4e7399d75c546b47725cb87d17fad81e637c16596d21f52cb2daf76178799c1390d293be44ce50c4343de94d5f7a188af229e849c3faee100e0c69a478305f3e0fd11bfd223dccc31431614e404aa72f7d11f3338deeaa1d93e941f8d3780212f3a78f215d75028174970fccc390cef2d687c60ecb77a93cd4e9742eb3a82ccb2299cbb22ccbb2cc652e3030a61be8330fd5582ecb435f18fa74dafb0ce6fd5dc88319ddcc4316c5d558f21057e36a5c8dabc1b8c098f2900bccd79d040c8993639abe33b4feca8070f7b02f630a5a3b0c9975a45b8f3287997e3b29c45cbda512a9542a91f2501e32e52223179d9454251d2a8d46a3d168b4928666515ad3344dd3344dd3348dcb6e9a375ca9c2cca139b263039349a7371ac96582dd6a16e512a369156ca385eff2278555bc59d96a1bcdba84a3cb0309dfe5ebbbb8b8b8842e2e9ecb885d5c481c973f6d175bcf25b435b429165ea0c158a037580b8ab2b3d9143664360eda6c66519d16dd14191b1b2d8e4dc3304c6e424143bcf47183834bd1681d476e432db0b0d16026c060ee1e8661b8d1365a49f5794b172daa161d72d6fa9f0eddf7fe653895892cb04062e66c48d430bdc7b13248317312607a2493996e0dcd66b36dab5b193898f90c0b7dd6588dd55075945f67aeaaaaae2ec8d6595b828efc75e75326bfce6aad0ed559a551a1cd91279397d6f33cafceeaac45c5d28298498a14b473c9742d2be37fb7d041e7889983a94c31bfaf6f18c0a426355bf6cfae052385ee5af4e6a5466f3a25288ac2a6a0dd93b36b51b1b29897546682217cd1c3f03d18bee855f81efc4e092ae3df35b1bdf3d9deb5c0ff1e06d1870f03f8df9f36f8deaa02f8df0701c72056067c3a8bb291e84a9edd4ff7caa1afd25a6bade5be9e95524a2baee349046f6c3deb7942b8a7b5d6da9142aa1d3b1fdf9d8f97af6d632b7ce1fbb3605199d682f6dd5c1d8f97ae47ef8aee5c5dcbc6bad6f6aee5248432e8b36b7576dbb66f5b75adae658ab52ca9b1017edbc6711e9600da4a0249213f0d0f9a055014adc1a1053f182e34dd992452f7a9b5edbc9cbdeede9cf3f7656e0e31359ac396e5db175dc143a2bf28415a6e8f20ddce39771dd013acafcbf4455f3ae3d02f6808d23173b62a57ccf015a3121badeaaacaf867bd8ac55639df0a43617b2f76635e9a865695cc3df4ee4165d7557d6242ea1cded3f034018e082ee28d5b856dd5c7e5351d4937075f54ec3d42515c13b1ea13ab3eb1eae31c498a1ec21d0af545522f9de4ea13ab3e335a4c568da8486855426bb8af755599d81e2e59ad406feaa626cd5cf7c2d0d0c6719ec7855e187a4e5e3f377663a951199f93b1f295af7c95b3d6ff34349b09beb2281a9ab2fc2f4bafa43982053cb0c2c4c969801c490861eacfa1497285159309f8a70d133d307344214c4d32b14f5b3cdbff5eed232367e893ce6af8772401fdd942ec87ef23b429900f953dc2a6403e4b767555d78ff02d795223978b19b93bd406318baa2eee59485b63395797cf6aa432f66572022c7db9ac66214fd3b63bf2abca5695683c05b02b79fa143eb6af3a8eaa660d5d617b5f4722b8ece1fba430fac2b6dfc34b4a29c6a18fefcb32aca545d11b8af22354c69f88d6765fd1196ff9d1c3e0f2fa6168f9d1d78741bfcbc330fa963fe9ec645f05fd2eafc2e85b9e86274b5a40bfcb03d1eff22d4ef60ff79f132fdd87ce845084fe9f1ae72cb7d994efa5f28dcee32e2f57b6556531ebb315ac9d597b73d7658c398ed39af395af662207c188984f8fcbcbd6c6998ba1334ec6b84c4c4ccccad5e343438363b8891a1bee2c2a7ab383568efbdcef859950fbb12cab4414829f47e6ffcfb3f96d3f1118d20f69683eabb2a7b6a9611c84def8a6a64d0a4132405126a032fe6e94b1692df8b52d40a1b7cf8fbbaeeb3c0fafb65a0bd93b306cbe7ca13aec8e19fdb2fd2d8d4571afc75c8aa50df04ad3b3313d7ff95899b715641159dc6f0fe8fe635b161fa555b4fdcf1036e501d61120e0238317660e9e2149f7dd7badcb541e24ec40d119ff53b44348eb14dc75d775dd4a6bba9991bf5190aeef6d0ad4a2ed9a378ee3b89c73fe1f14f0d256bcf97d7f0a00863ee0abe69884f7dfa8cad952a7e0484d934adb9bf30dabf98d3a3a34d098df87ffc54049f0afe3b74367e802ce6f86ed0938bf1ab6bf457d2afbd9404bff6f058e6e8ac6d303648841ca04472f367ab153f5c61310d17b2f223d9937b4fd4bedfafd477a3490f46af64faf8a3e3fd666296084026c01ec4a4379e0afff42519e6b446b381ef7655486fa3832a3325501bb8e80df735954ee48cf855ddff7b15a5e9a1fcba2bc9cf517c2081e8d66e3d1b67bb5edefa60be32905af74f2e98c7f5f77121f8993637aa489c5d2610bb2f8116b221b7b013c37c04c6a8e23c52f7ab3b33d082333f4c902db73af81ed39f26435c07d87491b1babf10bc7b00cc33692f67abd5eb56d07d1c6430c416feaff1b3e00a30623c8507161da2f8a30430b1eaaf8e8d4502bad95d6eabb52167856b058ac8b59232ef4792d665d5d6169e813b3b6b3582ccf0620bc40b0a27eab9545fd9b74b74f9a6f8593001d4c9c1c12cced730660e2af52c59226264e0e6745656e24939cea45142626999cec6b5b9edf6af4d2dfca261321853e0233fb56d53f25b67f446cff5623207d7e463e23f486fe467d473e2218f0b52cf9ada2e84a9e78f5d54ff5f9f019f95646b6ff164319f406cfe88cffd0aa0d1cd840436f9cee1f01d89e8bcea8a1cf6ff5ad7cf6b7fa5620bcac7b402720a42f7d89c4293d892c629e7968d3d09c5daa664911cbaefafbaabdc1dddd6fdff77d254be3c9e55fbe88491a4fde9bbe88f9d5ddb29d8585054665fc59f208a4f42f24cecb97de1b8190de44e2989ef4df8be9653c0181f99787215d75eafee561de349e8080f0a607c1449eba87e94c6f7ae9c291c945144d2ea3161004c16d7231bdfc087431995e44ddd7ee7b78b5a4919aa5919a75e4be459fa0964a2f3a2d17db1fa466a9744a81542a9548a552a95422954a25d2c84d3a342693d6a7e985201645cd1ec871c49099b32d0185c9e43401fbf52bdd560629e669d2a92968f5a137dc56f993fd5b051455a77812c37658f5a1335ea5505529e8cddda713b0de227e3a7ae9d1137d9a360e5ea876046a2e2fe9a893e853976f833e3ff4bf3efa08a1081dee937d286ce0b0dd0bd5f69a5ff121b7a2d2ef5676fd142caa48135d4c9962248b248eb861d60f62512f0071e48c207460620a9659bf8709f561a2d03416d5638809bef7d562009ce8bcef709ed98688a86bd694b7f3e9aad3715cce39e7ece7107173ef7d0feb9135b5b3c492259228a1c4aac634270362063b62683b09b484d03e6d6b8920fad1524b5320265cfbb4ad566b5797ed71143561fbb4ad7ddad5ae2cbbc46bbcc9cbf6ecfa76e5a86c0320d32720a2b7ad81ced4b733d011ea9f99c7b5cfbac3d3a2de788a3ff2775cf7df06d6d0c7b6d5f0873bc8719ce71cfe286dd87df794cee4ef484a67b80f004ce7e7c8d3bda6bcacefbdd5f11a27eb8e66798d479a609ce8b38ea1e9c334d17370a30b790bf14c9e39a99d59b6d5a133b55a1d591ddafe9d05ac09923586c7539b7e73e4e93222795ffb746c00112f2913706c5d77bca6be08c4c4955deb974f8082ba3bf204de97e0fbfbfc9f3796d07dde68818e3cfd2d2eb2fdc42491bc2f692d8f973506d31fd9959ab5d69aa233d5ba6ccbcb5a9fd4449f45aa9b82ec4bcbbe7b276099f430658e24b8a7a106349962623fc706a9e143388173857d4f305576ddb6ea9eb7a8b16133689b0cd1859983613085f97de30ec738e73ceeb049001d610120cd4c9ff4c704096ca752b6832146ce34fbb6d6d21f0940a9f7298ca5804d81b2a0c1b635bdeb58b73d81caf84fa1a40f0440464f7a3b5a9d136436cf7638b6d7a16a53352b423ef39eed3e168a3de2947ef4e288f3f22effd59f53b5168e3ada1108e95dec152fc78c236a1c12f9f2e2123dc44b2ff59ff94ba3c9088d4762e89fdca2594ca1fd197d417354e96b33e8d3d62ecc41ef4761dce75e9218c54631af71e5cc428ac81a79d2ecced66c64a0375858a08a1a9dd60b2b033b86bdc176bbc67691b029501648ec7b9ba0379dfbc83f8a5994cdda8e62a3d82ef7696be53e47f4f68c170a3a73a3a8778c950c545eec00ddd4adc2e5e518fab43ff6c76b60fe809d374bd767fbf778e97221f46ffa0ae3ca1e51d1757f76c4f67de7d15fb017b92950163aae9acfa0cfeaf369b1448b2449942a7e125c86e8cd8eeb2abd7dbc2950193decaf34da2b2eb34bb6f63e5e4057a06c97ad6e453dd70574c3be2e8bb2352d7e360582a9b6003605c2428d5d7d2ceaf63801da4205b4c56b8da07d5e978f6a3b7dadb1b3eb7572c7bc476335ebe82e2335b78dc3db636ec34231fc5abcf8e986a37859b7751f161fdc97d7f87562c91e1faff981f9c5324aef07e6f0872de15964fabc2923b51e5e3795b46dd0991fe1b6351d6d6b5e838378b224862ff669afe8f3baaecb7a0dfeec2e9ab2087d5f5e5e9ff182506897ce3eafcb656b27efe975d9daf6dad0d68297e4ba4e3d24f01f101a8f43bcc442388acbd4b7d2a2b2c2b215eab372cb678e5fb07b5f17765dd7e7043f7cbb97737915dc7471b9b41b800b1a6664d04da5f400bd971ad6f670afed615139ffcd5b0a8d93acbc5ce12c6699cb1c0d5b2dcb727683988db51c2705dc4297b0715cad9b4d4205c7e294cc6675665269acd2f8b75ae22514e35cd66a450419caa396416d4067fccf03c8883e043fffa52cdf7802027e0f8a7ca420a2658c2bd0197f6e24e2e5cca2b2fdde4dd50cc71390efc38fc4c1555ce1869973552693fb497c22b28795194db0295899ef06fadce4d8e49809d1bcacf7ebf7f0d9b9c931b35279d45dd36757b3ddec79ddbd3709c762114284fd3a1c9571147f1886892a7a439fcc2caab35d1edf431f5bc4601846e2e207466edbb6719c8fc3606f701cfe40bf97c4222931a9f4f69fabb60d460a3c446fe010ebe338288ada197635b2eb4efdcab2eb0ebbb220da160fedfa337d52da107e32091ec243acd16b6485d65a6bad75ce5a9b4cff1f0b26ac60c20a9466354c975a08a1c40fcc1c9ca48ac9a46ad8ca6586aa296b532b9b5ad9d46a5553228cab93ed2be4af26f879ccbbfa784d3d7f7fff7dff7d186fff83c39bf778f4beba58a918286a7363c55ab156acd536b4c5bbda35954aa540100457777557af90093d872814915a9489f4c6dd4b6fe82cbea36a0d7212e551abbcd09b4a033ae35f7a43ccd9f3ded0756f5be90dcd79e0b39654a1a8ead22c7a0381edef4e1c15be94ed32531b1a07b58c5d65f4c6c504ea3dee3cee4bb28e53f7e1095a9b5428950b2de3dfbd97ddbe3fc44b16bcfc7665798d57654b1ce53ef80828aa56a1322ea3a19191194719cc3e29adca28adca28cd8747fae7798c478ab216856197d55556656e2b0f4e881bed5883aaacc6c290164ef04deb08ddf7f0d29661e825612d69555995b5a458949c54271decd3b747a2a8844c9c1c110c0c93f439343d3526a6f838348c374c1c1aac492299709f339a22c9c4fb6deb8703fad14070d11bfa847e6d6cffdcd831e8285f041a8b9f625ae58149b18e8069d4526af10c077929a3e2259e82c1e0464c0507e158c907dae6ff304c903e55f1490f447c1289c3a43e4ecb8b240e1320e28f1ec7e549fa3589a37f44e28c5efc2226e90343d24822912796a7260ee94f2c2231fc48221e12476ad210d3beefa379292f1d7f377e7078e91fade5a3b5d0ad31f9753a198e18e8130b81005aa133796e3adb312dc3e88d161495677996a76436b22cc3f1e5994589445994bf0cc727fa84be202f9d04a44f2c14b4ef47a3d168275558034a59ecbd97014f6c6ca6689b5a6bb5d6721cc7e12e5e542f3ad0d0d0d0d0d0d0d058148df64f93da61c1a238a12b3434341a1a0d0d0b0d0d8dc98946a3d19bbcfd4b2d169671930dad50d9b53db758db9f24037d8a76f628b6cd3e92db4866e8994571acdf66987b9820cdbdac8cffb6b1507776e88d0d14c5e16007fc1bc9cdc84d3663591447b3322e22cf3224cf9f712c4d96999b0571332ff4c951a1e235e736936d3e3bc86bea6bd1eeb0a1e1b8548ade6c333a1383c9d4d2c2a55810e967791534a9420d9ccc4bcfdc36c36409f5ef89bb1c4963c3cd388ee3b6d936db66dbb6e17bef6561b9afcae266dcec4535f2c1c7c7e78ba137eed8c7a26262b04f0cf689a1333100a0283c05f689a137223c051553f809d662caf65117ba92e7c97a39731f1f1f11eb6046868b4765bc66a4e539c6b870cf68e8e5f2c138e635be5136aa542a15434d10ecaa9c6cef80ae68639f1876456c9f98caf6c72716c2d7de7bff87ef2b73952e976b26834aa98986a62cffe90af4c63ddbfccaaffc556bd37e39a23b3ae35cd0fc9e77adbdf6ebb80db75e3d320fdf1cb48274a66bc04c0fcf49633b85d8f60702050719b540feee4db0a88e3c656d6564e8681695c914adc1ccac19070135b3fb4c522b735f70f8a7f0bab2fd81046dff3c7c2bf329d1bf82f567c1faa760fd83d813fcf07badb579154b213845257bccdddd9ff33ecff33ccff3f142a5798c76c50ace0b2f7869af97d4d2468c6badefb120b407d19c8acb3ce6a5b52f6f6646f8c48a292e95eda8d2c5c1c361d1b3dd104367a819fa5e9be9cc63c818efc86dbbd837bcf10a30c63a1c2581983f45a8a13f11886d004a0a408244e0d2d9192209330300c026894ef1f6f5e2b7b1db7e106b32d913c62dba318eb2d1b16d76113ae3cf22860641115ae27c7be8dc9d43f2e40a142d6610430a8d83758327569aa852eb62064ccc608a772464f7e3649fa61827cb35d31533d809a1e51d086208244efce024871b3c8006153b65f43001b252050ddc2301116c90460e98c8011a49384101571341c8808b1ad460872a5588aa4409f113b9eaa86ff3d364019b02fdecfca44c657cd4a2a87e4a29ad955a8e6b810815d255a8ce7ea0ef8c0a555a9de530ab568684687566d2f15894ef5aaf9452ea3b58c795db6a65e3650eb0344605c31f22b004165cc313dc6da5336094a04dc4f7fdf304fb922aac773876ec5ebfd4a34f90890dec388ee338af7b2e73983be9383126c921e0b6e457f1e55ceb0f2c7a0dbef7de8c5fe6103129e6f7fc279833b7dd4bfabb7b76cee9bde0c618ebc0e1095e02b74d50e7b09b869792259da9cf358962cbd7cb4a42a8a5e0af6f5f9f5974f1eaea4bd4bfd6d6faf51dfbb098a1ebcd5e8298a45e566bcdf84e4a29e924092c66e45bbd4aa5d704130ff4090eb11962b3eb2dc36bfca9833ed615e0eb5fa55ba57e06144f7c30c49333e6782243a2884bc4e76285ae4fadb5e4694beb7e9dbafbf6f7ede48981eb9369308286273153183656c4c22dea4ead0fc617b2987d8a10031fb60d61db184851c50ddb56114481ace8a14121a066e6326a3da3bbf7299525e182eede0c8631659f3135db3f375963bb13283e4ef3dde28823f63e9020f75e12cc651395e6818a1c4db48b150e0dad83362b5e88c124092fb4b829101554fca05d3605a2a295848a20925081c3b603fd6d0a44456a28866424660d7ad972811ec205072158583b2d99e6052cd811659d41add23434390e1a8a90b1d182216863ec40446b4a0eac191646888041a162b59268c110ac950e4a765aa004c64487f5fac10d44e8606788571a3b4a5a3c321e8a706998034dc13ad5408922e490437b57f212da4b632b42733690e95006f909dd8205e7447b4d3821986c72680e892d56c4aa0aa0226aa0e181166d0a44841bdc103a6f0a44441b5434b8291011676416e87053202264254cb1d22ffb6e0ae473659fa61c7c5f67b3cdb626ce379caf7bb6be615d7dc3e499b3d6f734d9eace42fa53778f0404095faf78c35e376ef3ca9d2c505b36256d3600eecddb1b25f5d891f678e24dc7fdd55aaf9f2e40cdfb38f465aa00bf0aeeb7dc54ea3edd985e72536bdf2d69f2b2de3d84fee893ffd099ec25cb59f78937cba959bc6a8a45757f2211c6248e0acc4b7a11ebb9250addc16badb5d65a6badcde40bc0da2d6c7677337d6e0ba139739c085b47331e29714d1d8faed4da9005ba7e16812d3ce8fab55616202c667e6f9f2a304556d8eb3567112e779ecaf3bc6f4aa7fabe0f9cd2a9c0501586a1480b4fd52911b1545bc9ab8445ab3c25bac5226195b4d4a7b556979145c22a1989a425499274352401ab50bdb0bc986cd62fdec050c4d2c3c3c383595858f448873ef0ebdba2b2786b5d1e9e9f283c3c9647f5526db5b5034f8bcb08abea4a026e9768dd87a2c6a0ac5830a1323e9243bf206a218bdaa3aa3c2a133a823fecb5aa305802ef4b1a09eb4eb6a86e052b1364080b486822e9f6f0f0f0f0f0dc1009a9748fb8484a2ca217d33de22231c180d0c3c393dfe04102c2e9c6405f1dfab8a71e1e1e1e1e9e1d78625c5a62a213d56de9ee6fe3406a51245034e9e3aeebbc9177df7331bb243b7a9c88b0b97cb12521f367512d2618d61c85a33588fdf47b3080f2a8ab3a02d7912b581998aebfb1bc6cb98c571e55083a827f7529a1335e02de96c4190a4560b6595793fe1d37e065de41442c20b52891094487363434a099ef6d795398845ea2ed4834e92fd1473418e62c66d3824eb428f461834820b5a892692ea9494c35c927499244075d2daa64d2ff348b28043f967bebe80c9daf6945cf007dbe2b76fd935ea95c6db9a0f2bc76cd51a8c876a5403e4054a15debab866acae55369b55d412996ecefeff7598aa1fdbd17faf8748db8bdef421fde85b2bb28c0d85d7e2ef491ef096eae8b7d8a9babb23928926c0e0a1e6cae078a69fb4c71e863c36d6cac03852601e80957d6abfdd58ee7eefada4413cb1f60920330daa8358942430d5068d1c30fcb074874cc5b357662bb123bd8eeeeee31313aa65ed3af01b6b8f6f312dbbe0672428c6ddf869a458c0e9719086842b5fd4def250b3e954ac96056100651c8805c2dd8ee291df3f569f629bea00a0a04031ab69b362a9b6c7c97fb2fd32a8f4c5a561ab60890abb0ca83232bad6e416f2c59d3a033f7ef7fd725e579d904756ff99de2ec8f29ad3c4e809f08dd6500aa682d680d667979b111368aed71625f5ef393ffbe65dd67d59a4515312fb863c455f4a60a9914542237b1ef14fb863eb00fd0b2e8ccfd51149a7a792db5b69e5468df2b5ac1fef87879ffbbef8dd68997f7bbd1f65857cba22ccbca1881595e63b5a0e5fd7b33696174e6beb8231a39f57d4a63656e95d199fb1c596196c6a2447fef5fcd5d11e9d88a7ded08f6687fbbc4cb9b73ce99e32ccbcb6b5b303dfabe6539ead2bce69441ebba6f7dee5bd67ddbba584444758c31a614dbf1925993a6e853a495dc21d23f77ec2cc2a62f8a410b01e344d3378da14f749b9a68aaa3aae0a33a40b841d3fffcc57d05b2656d65ea8b5aa8974e9e4ab06fffa442e63e3f354f2a78306cef3d354f22beed7be85f8558f274c2c8df8560177c0bb14fb328c2caf63b8eb61d691645b0b68f2d8c4e2a80d4cce349850d06eec320df73e40908d73db791413cef37f20464fbfc1b48ba0b0ccfe42f9f61bf6e7c54c709aab6fff79dae533552b697b3a4ec5a6ba20d3385ae5552d3e84cad59d4f76e501e58093a827feb0d8ac24c50197f1a9a031c2084104ea75d6b94067d622cfb0774ac2cdb5e16855baf8fc42c9919fab4687c1ffec581da4079d0280ab3ac0c1af4067f1cdb7f673b134620217ba024e9a049a54f1f41a14f1f72f3db40fa75d3c7b2cac392deaa23cc80de54d297b8e20d75875c8a65513766a150138b8b0c86a6c1b9bde220b79a95798ddb133a82bf3883b6deaa558bfa9a255b357b63db8dbdc3ac4cf5d9e77f67e8dfdf8f97bec1b69797242234501858ec338b58f6ef2dcf983cb36e99c028f409eab0bd627a747d50d5b9aef2511274ddf8dbe1e359efbdf75a7bdd491ad266dba735745b8b4b5fc8c098614a0e9898038427a208a249921b9af4302a439f6e65d31b479d4012e7238b982c5fa43ecbe8302b535f34e3a0ebc3f49cfcc793f52b5e03f23df876040282ff9243d7050dfddb16e0c91125b418e28d2976cc6a7b86a860030d5a93354c2d7080064f8aa604072fcc5a8405850e6020c70c3c109ac3ac1f86ae344c64dbdbd3c778cc221e7d12c1b90ad1a79fadd7c372a37d4a046f9b69a6d4dacf5fb7d09835fd21a18ffd7de7c5e369531ba76443b11a8ce6afd9ec4583d56238b5312d6d36c58ffde9789f33018e3581dd9624826de8c3d21c6c0a546568d3b0c2283163ed3b23d5a00a6d53a02ab54a6b5798ad5764a42cf4496974a6b6f4595b3bb316c6ad56ddb1396b5d9f058bca54a67ece9936b332534c538ecb9656ff3cd2d7f9db52afb2ece0ef535a53761144cd09284fbc9104037ec00219784062c90cbea845acb0d2438f133fc8b023034d83a0317c38a20a1e14715f72a0f76ffdb2be367d376b2c8a98d2a2b2c40f376061de4b6aa2e93ef59230a200a23203a3cafec2cf5ee39bbed7fdc3de368ee1491a41e0d3c7f4e67b4a6e1bff055db81bfc6f7c629b806583ffb910fbb348f6778fec0f03b1bf0ddc61e7f007b9bfff28be9dedbaceb7aeebba8e0341741659b2bf070aa387ed8d277d2f8cd4ee685d4253202a35fb7e458f45f4e43e7cd1f770137a74efa34341449e4576489ef4bbef3e320b28509e8e67c518e3c724fd13e3db09e92850c48a4da908675781ee6df736bf47bdd1bf43419122f4291d4b556e91af6e64d47cf1665f368e2be20231e2481285055ff4f050afe470050d4b14f192829b8021030223265479f8018d98e96302743085104287394c1f7548312b193970220ed3473a93e10d1f48c163fa686590627e17b4637541b1040dd347dbdac1b78176c4a949e3063f9839a10b7a9a744f9839a31f9896a41b47bb05a8a478993e522ebecfc16d4bd11b21e0fb3eeb069fa6d3d0e17f8f030dfe89abdb8bb76fcc9d28fcbcc30f1ce9c64218abe88db831def831feee456f5e36fe2f89feeda9f6c6df11fab438fcf19530800d9294ce7ce4f61e0a79532f7dfbd304f26f9f376eab7d1cfeedb9ed3401fcf631cea95e5bf5a3e18ffcb98685d2b1b19ded283836b8edd0956dbf0140b228dbbe043eafebbaae73d11917dadb73384567c2fbdaf9b16ae7ff36d0431fdde7ddddd8cebf61967395a31cc75d2d3a8b6c9d3c73e388ed231dcfd304b6bf4fde944941d82678c010ef5541327b4ef59afa30c5267d4a9ed9a2b0cf1754f0cba2b6bff8f103d9486a65b08f95d9465cc2883c8778283c0b0844cdaa8d3574c3ac066bbc7419d3aa1ca29065950f6dccb8970a8b7d82fb8c01d1289d78ac2dde086a238e0f7c5d71ddf0c34eb7a96ccd071b9ed881d3092a577726368bc520e58594241ce852010521e19af26344cbb5aa2faeb8c0c8a1c72b40eab27858a37bf5a0aac2251686927d965eb42096bdc663673bc8b1cff287872450dee8918546b0ca333ad76c870eb435583e185594edaf34f659eecad5a4c8b1cf1d52a894f6b52ed65d5f7fd500573e6a51d6614c209199381d0dca909943a178510b03871bc3cc1199302d48b118aacd4c2af3420731937e31a536333f0cdab10291c4182dd3479a1ef3db383a83206430d3c7181bcc1caf5509aa8676fd60cccda209878f0507facc9b8ae4052fa54964b7240dd5619fbee6c10d1b2831edb8038af9551f180e548a13180cb96047a583022849d1d4c0601831c3872d491a72981f8704184fcc2f8377a4af558cc7fcba2d6640630d2a469395161f784702d0208c32d200c13be210e08dd60e6c98f7ed7849ea249c7ad791729162e5c0b4230de30d9308d83e2fd5a22baa48ddc0b4a3788559dd22f1f95846ad5e8b7875a10678e7ebd7fa20109a6a4b7776bd6285bf53327f5568fa3dbc5683de2cf569e812a4eb531fda07a5d9a73a2ab54e527a6b131f15b57e517c2dbe26bd487a91f4a23549b7e84f6b2d6a51d4a2d65a6bad49fa45f1c517452d6a518ff9c59c4bafc527fd169e4022919e441a718d025eeab16eadb5feb4d6598bfad3fabf0ff4d0871e8d44fbe248e9687c791a6a4f2489dd477a196910fcc42c8a4f7ab9a5bb3d06c117d2964452883ef593c250ebfc5fd55a6bad45f1f5277e0fcfe27fa2d65aebafa10f4da3bf8628e817ffd3242dfa10bd38864f1a45af9f348a63f692e541afd1e4096e96d7af7bd8518b0f3a82377f5e97b90d5f5215635178b68e4d81a2ececa14d37dd1c7891a16bcca3813ef3b616557fbc202dc4b9ec99a1ffab7b48b9adde4621f789d4bdbdc96b4eefb917e2fdf65607bdc96f7f00f4a67bfb5fc7bde785286c8fb7c7f8bb717b6e74a1ee4bd2ed1bae148b469d9bf2dfe0f828075e76e32847b7f13eb76d76b321ec687a93dfbf6cdd8ef733774717eab664083abad21c6351127453279b6e9ab569a0288f4aab23f8dbb7a48f5c61feaa347f9bc5766badb52f4a6f7c58281475e3d067fdb15fc51f7a9727b8b72bd27f6af04f7b79b891ba318e1265737fffbed5240b79ea5d7f8c7846b6a5376c608c2b45551a95b19f41ac465777b0edfec8faa233f659e2d09bad98baf7aaaf5790972cfb9295f6daf65d9fb7526b596a27c44777681a8e8635ac21ad36688bb32d925ee8db7bda165f14738c6c3147b5c5d168829c3d7ab18eaa3521c83e17b22dfe68f4e2cae547ab6f033719382bfda90395c2b8edb8c0e1a51dbd85d962cb16ab2892e790728f1e0785288824162231cd4b2b64c7cb1068d042c4bf46c6bb33833edf2d16dd9497b604bca9972219e335222992316ee82de5a57d17120f7969735801f147cf85278c5efc3afad1e85da87b445240072dfee8bd1f8d75538a4a81cad8cfa706ddd0a417bf72610546eff25b78c20d3bdbe5475f431446efe2f22e3abcb42ea411d75ca8db85a44008def007fefb315786d42b5b7c511c63a068f14f718b648c972dd0d88a97a2386e33d0191d981cf4e781d76bc47c4da33f7f8b62cacad817fff344d13cbb2d8aa6f835f421d288afc7d3b77e6cc5fe6804bdbcdea25b30cd51d4b43c377575bcc6e5ed9796d05df8b089f81efdb9e96c3af4c6b7a5b24397b15443912665ffaa2c8a9a5614926739f2c8d384f7884cc14bfb21eca047eff2e7a6b3e9784de9ed969f9b896656c6bee84be44d71b3ee2dc9be27861e9142c41fbd0b798aeff2405cd036dde2d31005f147dfc33fd16544bdbc673e7190ce29dae7c653dce7a673de7d6e3adb9a207a0c5713abe8036d036d21ab21c8f75e16e8cc4dd19b98c74051de72981fd9615fb761df6bef257d63c12c6a6b5919fbf66b340c8bb52cb54e5e3e74c66eac6d51f88dc9fb6333ebbc3fdbfeb9c5b6dd95bcf7e7c26e941c9b7d5447ae5dd7e59c73a643de5885a8871c5967940e55a14aab332bdbfe90296c0b445ec0019f7ed5f9add6bcb45f691ef3d8cc6b5ef3391599a5794d087ee1f770cef33ccf0ba50ea8444d364645ea18a21900000000b314000028100a8743e29050342617a4513d14000c7b90427c5c190ac4598ec3300c19630c218c10000040046086666805af5557e3128f736bf716bc4fa4c59b5e168f4fb8496ce9958ea950bee53e0366bc40deb9a1816711a7ce43d79e1c509c6955a6afcd4ee8eafb6d7e739c524a23eb3722eedae92daefddbe6704d616a77e5d85d103ebc72f683db8361810460a6f47d0a60e0f077f103a9fb7e3e1d4d3173005e8bc8d845039c2b2b98cce981a429ed47b7144f7ad8e25459e9810742910d79e292fb785f21992a52149775f8149b90e990e21354f686d5aa31cc47b3623ddfbd0c73515fda8d36af5056a14a87d1dbeadb866bf0419d5cc6b468c02824ee40bb3e2764809de11c38da541d77c4180107aa9fae82d9b42d243270379019e48b0b8985ba967ac6ff6f2f62c06cc5c730a134aba8720a06db617132ba22b9359dd2b325e4439f1400cb8bc8203c0c1f1425d8e3940ca065a5231b113a52f3c7d2eb906db717ab9a659bbfa1c00d5525ee9c6207a84f95d9b0b2d218818a488757817c69d424ed3f14e8a3ac61e5c1e629a6b3a241992c3a4c665d65b363a755120c2c2d010c6076a4cb1defb267279b2262a6b0e61597fcf3722576d18f9985f6643f9e9b82959f2376845820eff9006754e0917af5ca11442008ecbdd2a9b09e0e748e39c4590a32e5c43b93dbd381de27db3e5ec01064d726af7e619af646c52ae471550c008fff4584b7f4e165530bdab7bb984e73778c4e4d3325fa5122a768939d41855734138cf2ae1d5fa8d894bcd0fc2b51aae4c30b093c051c9225d2ac2bec51b3db5e09bbab4cd20160d44cf5fc5c157e289409bdefea281830653191cfc3cdd67ffb8a82060821f1ea49c9db70ec518c55fdc0c655701e8dcb671252e1a14f9d9ababb345262c01732997381b007848c93dedda1c1cd67d9edb548bb7d34bf2f312bf924af8e6c5dad1dd43df5921ecb1a75016cbf88db46da88db4031bf5ddf815b9117be5d9fed9e10a8a31cc3875e9d914003ac1afb8cce62cc5b058c30d066cda7a4a061c572594b71f222b69eae633f683d6092b7dc89a1cbfb1928595c4c8b69cbad35dddd5b250c222a46f8a747c019d5c6a1458c9209faa3b6d76a2cf222d49fd52463fdd75bea42d29f67c1376e0f5eaa7c8a424cd08b9b5df38dd97df687aa9e88abd2820f58dc4c7ff820ced6719ce67303b792d415c5bfcae88ee106d811cdd2aeb08b76582530e261a930722da9e983f282083a8ab133902dc91507fcaf24e3183b5f126a0426aa3342e65a3bb31a85d48729fcaa035149253c2adec922c4242205b36a8c9225f6fe7415b8264f401cff3c981b680e54334949ee04c11049db1ed7208c71d82f6598d3136d53a439a6ad73342246b154d820203d1d784d986c557d0b1a02fd109fd8d5687a13c9ec004fd0722fabf09874c3b9a5022a75bef030f30eb73eabf6dfa01cef0dc6512043d27d78585c6130e60b168ce1937924eb97f1d4a3f86b57cf3c60895e8ceee93563ef03763f4612b5d6be4b17b1510ff52b419ed1562fedea9e9d66ab114f05d54545325c69c1d74677587d2426bb7499555430ffa42c68cf4e73d7ec34d27f22bd6fed878c74ed7d8a89cd8395d80129ccf9fbef551c21398bab55e74c96dc5de305868cd588fa172a15b9a550e89d55c874f6313de4d4b73ddd0613e2a7fa271faa05f4d1b4b5df0d8b09d162eb209c13152816087da7b0d5194d2a8f483ed482b83eddeb8f9c536b82ea286e630aa8d351754febbe86017c1de4a95397ee2df1b68b9e9ed78a307ba4f5da89152e727014024efccd3716b48b8db9c87b7a0e9ff6457566ad6e64d65adc7a3a4f9f9a7e4b249f388579a5ed978cb447536989999a3f14981d83bd9ee26d3c084763aba790a0f43d980ade0781876b12b186550b3d6cc4114a29be8377330c28609a1a188384e5cbed120987463172b1d13942e71989288352f630a1abba05b3bbc36ba313ebe0cf86352166bd64724c9ad77dc6022b13c500546afef493520104fb05a79b71c083e56a9c61a4586807ba81c7c64977b02f5b571ad2a2450fe9eb0b8e4ddfc1cee95e29c18d5b0b3f1d330f2a8157c8ffebd06ebef6e53db2f4abce9db092a5e43aa0c8a539ed373157eb59b8b890420625e49ddb37ca4fa7840be7d27a70fd794755f2067bcd69d604e50d405eb92aca682f825afa51de07adafb26ee1de618e56343a15e3acd041730c61acdbf299b8272fd4eb28cc95a70f31242f84b09e99b98dafaaca8722e084130b9fa3d9fcb3384a0c07c4735754a8ad5a8b8cfbe409c435d19327c963972d44c3ec7449fe8a19eed7df8035c7f1600c1c5bf55b4d2cf7aa523ae1e6f9eb22975353649de5c6ab9dbe558bb0b798585d9efde010c4c014f311b092b323993f414e8a04ea6747929176f40904d10c70f7aec8284d7e870c14767c8bec5fc2270a1f102b3fb8373c6af98028c6b1cb7ac73d7cfcaa2f11134916b7f2db99718b723f34c15e9a1a8405a3f6cdbbdee5771d1e2613474d08e5078b56fc2154d58422b109b1fd1252532cc6ae288813a21d01d5ca76ede6f24b4339d01ffe919efae3200cf192fbb57b440b45dd0403fda13686e17b63790df5ca88143c839d1971983991824028df402ba12d30cd6fbd6edcb36095b6c01437b605ae3f687e1df34ade072b76b22e4100c017981b0cdc15e607d9d74f602584166a041d9d27438b4bb3a01ea177f3e058268b2030514f83be3f480419943980d4cc15101e400aa0f2c7f28081fa08fdd48e5c81dda3f74b7f6fa7ad96473a1976bcc613e1d9f3f347908a8bc0b2674f7080f650e6df27f681fb225bc990833e6cfc4ea148447b3215d65bf41bbe0586bd84c81363f4238103dc92c12b7d58cf711c4a53143ba54bf615a9e10dc70faffe18d55538fe7aecf2a890de745232b0a8af26dc46c04e499bb8e8b0efac587da0b3c5540dd171bf9a637c2dde4b1c96e49376312eedd9c9c7b8e0e7df4684566a337f4e6fc087fe949e5862e8851471422a17eff79c2772eec23e2ff2495c8375b2e6be28edd4789f63618f00c5f518cc268717c45a636d60ce311682c4e49effa43f51f8c67c045a406ed90975ca54896a9b5534438aca92b420817812232578227717fa7465c5438488858ffa8585e945c1d81fe9c775eaa07de5e28b55fec0467b10652b8faa9c4aa04e610bc39a968e7e749af4a80000c7ff2b7cb701833b11906f2a80082e8cf9254419d2dfca03f870c07e3ab1614a804a5a8481cb5103b7b6abe7a760fccc444756ba42a31aae47dd1a0edc3c79e9e323eb563c900a12ae0ba575c39c82fbdd0f785a9dd9e9f2d19098760d40d029c780edff25306eca1ed44ae3a8896cf4810c826143b1f857d84c6cad831a02eb27dba9fe8d62c454105015472e4d5b810052c15d60197e9ff9bf9f6cec07200c21fe03988fbaa819a1c4e85a811c056413e2c70300efea2732a786d0d44ad04a38cd1c87c569e92d8108e050307a3034f4903aac206f0aafa5b16c2b29f975e524f0a9a94c0237ec5894dc1544b5d1fa26ce1f015eb449515d11ff316c5f4375582055eaf3869523dcc2fc23b19c01769e1b77285c001a3d9bc935ddf2ec9d40e1d6fb1f95632acf59ab555eed331fc1b5f9ae61bf5042fddd3ac2c7cc7d2e881acc9c694f849050b63b2e26fb1a3b8352c61d7944d2374a28176e4babc0c8c35614bbc880fcf1216968f728424868c2d0b509135864b43d2610750629365da68691b9d2189aebad2183892b5f25df5c95a2e2a332dce2d7055cddc87d4a9b7f48afe856aa2ad592c45be9a2710e45e5891bb1bb2c175141c11058ee9de443ec6a9328a2af28969614f359e9868993073b6b4a4081efd41522f2dd344aab9e9cd02c47d76814aaaee2b7dad35a854d7106d22781baf3c7f38ec63ad90539e11cfb41288474ba3ca38797dd4ca50ab9cb2757fdb6c1657675f5eb50dcad2545f7db55a984e25b5447d95a69b703496f89fde32205a99b852df414eea1d75b6b90a33f7eed9d24891faba3f8cf8130ea1d91470992fa9d8b1c01e842b5e9f430545ed96b03b15782ddb3fa297b579337149ba2051ed1e6a22d5913b92405fdbb02515b4090d217def2511ba47bdaee8a77b22a72abc327ad90c53e78c8a1819429214ff115bfc77bad01692a1d43b1011cfe1031262d167bd84c08ba65ebd5f47cbb9e82228d5a8e61c7e51e43a59c4b4ec465510d7ba79d8a0df37c984f70e6ffa0d8681f197cc7cd4514d9fad036e648704987675b8e50b6c8a2eac9f426c5bdfa2515812c8d0e3a19a970663163c9d048dbcc339a44bad09c548ae1826b8284f96e01df0b82a062846087fbbc0d86436aa26973a356f4bd136b647ff7e28711a57f08161c6d096138ba4b27b9052a7494bf10f2ea83407c17c6b1de22440f5f1a37a7acec49eb0b2c159a64789cfe982eea8e03653830a07b2dd2fd109b20c48375ac2b574cfbc660291a243e8d2719a73494d31c087a01e679d621c30841b4b67aa63889405163e8143135db63e994510014de325adcf863abe888c1ca9e73e21085d6dfdd9307cccf58356f064381f236dae1f571c89ca0b3da06fceee81ae53916f07bfbc4dae68e054f3f2f39ca087049777059939748544217c0064cda34e57cd83343174bfbe55358dcc8314f75e431ef6cba58487c39e46e53f2af3b9fabae6bb8262441c8e909708b0dc222af7d9c92dd7eccc2456d0d5d86f7ba3a6ec3508dcda6d4a5fa08f567ebad01f3f70f2f4ce78f318fb119d181af694715dcaf3d0dfd80ef55fb9992357e38083017b30c17ab017127a82d13c0d45233fd680248d4e56d254aa8623d5ba7333d34234b236ebd9b4cd5775fcbd03e4934939ecee8bafd1556c20e7f3a28e7bd6e1edc5a6dbfe922fac9112da7732d6e642d99be331b283ca7bf5897e058c965d4206fad3ace88790affa2b2be706a99396f00b045095d25ad4f5e14ee523357749890473c844be8746e2616276b60b8a6dbdef3d22febc5a964062867c7e3f91fc07e43fb134215457b14262bacdc5ddb670473b3e40aba6d765a58bffb1e7ae1a33d44d0ce56ddd4ef81a94a71ae1c4dd671dc3427a052b64c84eccd52c2b5a0e5a0b26268bc9a1f869063a40c42584a6124d13c0060d3c92faa2f849b90d4b4deb6a8639333eb34a511bd08a4fb8cc673949cbc0326533957f5743093e26c123d5cae033c59453303e26a9e1ae8187dc14bbd81345c721dcaf2dc16decb7e728cd8d8fb3ad847fd6f29d68536d9ec930d5d9496eb3379ce80e57bb83e97bff7747c2546b3f488e0ec07f8dd5c76ff6c2c5da059aa8909d8f6506ad79bb101b27e94d7b76ce6b224340a9417e630b455a71e2ad8c3bf97b0afa0dbabc62a4231a3268757918098fcec2ab8b1671057aed29a902a747ffbcb4352a95d0686663906c7d16372302ef1f050389b209061b4d9e1735fe51a53ca6b6231eca328d9433ccd080d14595573edefb9c96dcb7262f1e58933605cf5a40097cd5fa3cdd44b4ac6a0dd0cb0293cc7af3e0f48bb45c17368c04627bd7d2b3ddb004f22267d70b967128002fc840b86617ee8aaa4c6b840d770010bd000fd51bf5ba543d02a5fee5e2f2771dc1d2b9d8aeddf0eac7af16f101018f4846ed835f41d369533d0762e6e6b5a6149f9e2c49eae7dd84a277c06cb24dc40abb463a27b46455782ca02c7bd3c0a27a2056ff5f0e8ee8fa4e7383d5169a2464db27cf1d616a860e3bb31cba9b36341320500222a708ab11c812854aefdf74a6e592ab481023983d9948ce388115c44d2c31371bd0d6d403f0fe795df86e1d6289ee7c82035eac25bc1a7b1eaa4134037d6e153576546e3ddfccd0c29fea30963b2e9a8fb9ed550cabce8400f7e11a6ba39cbcda10986f960a1cb6368205817cc167a8bcad763ee777db6dc29544208ec0c8dde285702af65b6cdf30075a38e20d080c7c3fe8a718fec76176435dad469220edd9af47666f407bde564736871ab910ea576e77d2e8a93706e8d4813e5a475fb6909fa5fac028713ad8e9ceef3afaf9167ef0ca275b899c93b83b699fb3ed00a41022e465525fafd68f811f8d3490afedaa2d97d7b50d231434b395896e05e8ae2355ce1363417600dd17eddadecf195a62de0aecd23e12bf2e4adb2147123a3d487b7aecd86c607256d714806d28909e1a0a03d0a474316dca726e14c070514d2d2f31c1fb97326560d2c99c41d534a2039eb1c53cebf4937f167410087724295facba5cb8c691d8cd762b9f76540b8d4b6179cb622150170811801494a6b2ec008ab34d77516d659c50ec768454d11adbb83ffeedc38fee2990c3594e220506032f5780db969dc1c2ddfdc9c53542b36cedf0de02f175e72d2b76721ab26c19e3cde475393471e3d0ff5fb889992591d1c5068c81d59dfdb650e0deec091daaa257de42d97c28ad87bd0820234f7ab0d07541493e441b3d16ecf5a9d622d0eaaac8b06a215f21a8cabb5bfd1828684d1eefd07f01630332f6a0c60e272accf542302bf2cc4ccb30781479d5513cb64f2101ca43dace9ce0a5833558882049f2a566a623468442bc33a12860951ddc7fb5691f8df92aa441ed94c8e3b755778e8dc73bfcdff43a65c7de9acd9336305009dcc511a8c15a35de133a7d331770545128d7d51b09bbb2b62211253724028b1ae5d8f0fd3acaf7098bcf0573cbf4d207f0f666a35feba3cebe0f2f8e696751acee839ec1bbb7f634247ddcf46fb11251b4b1b9f0973dc4547881c5c633ccba0a6afce114696cea67591a5db907ee7241c207402459f0791406193ed23b93035322baa105384a96321b356a1083f728eea6296ee8e59dfb624556ba5301fc990586f92bd50e60e91d7bbee8b59cbb15f0d03d50a4b479053ce1fc28751f89f403a76fc741139c5fad3223aa3a84f5d96d800132f3fc8c28ab929e00634d8ca877e461e7aa81abe2477be81f14702aff40850d3a9ceeae7533904cb84b3eb0d8dbc5877dbd48eb5f7471406ecc39bee93a15beedb808795c24d42b0488c28081bf8fe552cb24c82936587952e56290273e6767e43e98fc688424bb09b923b8c20192f6ecbb9aabaa89e5f6cc7f0bf73b379812ff71e9cea38feecc2b8258fb6a8aca190951d9502609533e4854d9bd09c95082ae8d7cc305fafd2ba348940233c4e3b7611f4b8e74467916dc81094a1c5ace8793cbc4f108be0af71e3813b8ed64e28f6e61457ec132e3025efafde1c72310382ba636d596d1f88e2d3519f96b4e541f52361fb6a5a6c9e0121f400772c5c7fe9e196586b1ce5c82a57163161b7ac67eadf7bc55d1488fa2a0402a4c7b8e4c2667a0b4c26d7d6ff9efacbb902357e308f6d089583cfe0995f1b0c5f2c35152a7000ab40a4e0e0ecc0be0b5aea247f7f13fc1e65eb1e72103831163757169818114d72cf2eb6f9ec67761f308407c33d50232ee21430145be5b2b416259aac21c3f01523702a4c2868bf377a8d27bda52ec2d7891c6494a2c0889a3adc10237cdab4307331d97d8d8b87ffa1028c0e44338962f892c351d545fd7465629a7cc562dae9ddcedb5d1911a784a0e2e00adb0837dc536d12f312be40241c2958dd14bc23cb99dceab5b833557a1a044bd98ea55bb07482bcdd1b7370d7c7a32a7d8a54968faa5e14fb4ca70c81ba3f10b77e70443a1f0c1f212b69be1091a609aaf96017222477c28c5c47d082cbe14080bc66132acbd1056a1aef8a4900b6f7fdbfff82957606543a5205113b131ec418db0c0614c05931f94deb4d4b3a234d8af44b93368d168db0a2000abe38048a827bfd5719a56a9b25ae10ec9cddc8831842c86fba27473f7f5b663ea836264d40cca4c735b32191224607bf705f017f2cbda94c66badefc717a16188f7ca2145dbe3b6fa3572e7bc520f151613081f0bb4b83aa9bbd4024062dfa70f381894fa3f7e0cd47258f497f37a1967acfef34aab298095017bcae664544f59af5de4e08c0652f9481ba20ecd7e560dfb6bbc375fd097b2cd90af5cbcfbaf369dccde364b2dc719fe597992e51d8d5a0d6e9c644d325974fdd8b5bd49a2a712bd1602d3b4c27880f1c53349f85046b6a6552240705bd2098d3e37a909be1ebe2920b19b1c4b8d6250cb95da0a79c6b9851a7803a90d90862c2c2d757c7b175e42da8bb8cca83aca95f25175b15d954dfd93dec057c653f62d04fad8984f17298c1ec064cb7882381a4a4c9ca2dfba0cfa22675acfa56bf91736e79c28c682f65b19f5fa5fc6283211d731d7fd6cc96db0ff03c0608918c49be8524e08298836e0a77c401067ff5cc89f28ff307b2467dccf205a2b9e10767ef74eaa028fb10e591d2b97abe6147bb978e24430e03cfaa731ebd29511101fdc47bdf73eeeda3ffa74f5412360146b5df3dd2e32de2008a3d4d6b1e4631609901a3985e8d3582dd78a6c6835fa2367038fea94b145451fda6db9656517db67931507c0ee00945d54ff49dc2fc2218334162410eba615c1b9ae105d14d706bc2cde8305df53a981d525b1723ea0da955c8169ede31b7401021ee5db7c7e812650dd0360408110e6d7671682622acdef43b25353a9ab64f8397f6d21b5deaa7a33ed71b294601b00394ef9c9236b8125d3a4bc630a06183f0daff4c2f273c18a33b732186dcec2bc4c90e70b74427a0ac42cf2b15ba0c079c6e871340948f19a68c984b4cd5fbff8331c1bcd80e6b0fd739202d14b0ca74f56a7d3c7ff6bb8367a9507cbb76f6e8359e491e9df78b255514360a81ff7f57df6d611eea9d02e4e4d5f6b10f4b0c0b8fb793fcb4ed90358246560a0d2e4782a9223acc350a33b8034990d81c2f761292aab602a001ab1cbea52ffc2712c973d4f6c52be02f473b488d6d908b11f8de57ad205ec2870db040fd88c61be8ce54eacc53dfdce9c2374728a4700f98e89599ee06172977db29f7a7760037ce4a2ccb03a89b092620abb13112eb650cb0e7bbb0eb720e8edd9c2717664cb3de2a3c8000e94988b538a5233f854e2bcfc981439a0e0ac9776589ccfe150895102fe14e575a84e67a28e1d5996a063f97159650c53ea97029d5620c45f011704ec79a1c969a1d9d014f7c42535b7602b46a739b50a6208b34ad8e3acd97071d62bba3232583b798bd2739e5039f1071395e20cf0d94323c792ba6cba7f1950aabccb97fb8d5caa10de82bf17b143e09004ce5c044a36d42206163e5e2172b7ed5a04c302ba8e28822ef76216064b7ae8ecffd84d036192816002e90ce80028686852b8c109afb0373578e818c9721ce86c01cce3b62dabb7a2c06f1320d121787c1c35155845c0c83f498f472dcb13105d147999160728bfac03a70f6b143de9753c15417a72e2dc96969c93438e7fb450242a489dd6b138865d08103ec58d8bcd4093579008a9952808bf75e5687fedf5f2fb0ba94ab6e01b4ef94d9d78fbf3c75438ef795e8fe0aa1f582224cc85a72f2976f777ed2ce3a61a3e4b85271c761746f8ef7563dda0b974ba5e6d853a5092a842cfdf43882386b0490af4658793f23e0ec80280c3820d508036da1a092c96370ae15b963741660ad6853f127ce7a7278a81818ec239870241aec0c91634a50361f18090eb0771d2a58c0ba004a88564101c596ec50704764f012dc4017bb0a77ecf7652ba7c2cd0623f570fa351081e16430877fdb7bffe97db0bacb0cde1400291560b35458cc0b4522152e8b48a900d79bb26221072d2d563a4d595f868b7a5b99a1f291ea66cf03fad622dd07d73ece60b936b4f4979e16d7a358caae8bd821e6283b48ea078596b223123596beecd3efb85b0296b257d663efcec18a89494b74657d30af213e2658f9175c1822da4adea38859f3bcd9d2edf13c26a9995de7ae343f2c5d2c3781d95cad4dab208d1936d29f8c2a7b95bb9cd0f0c082da5127b9c2caae3bf0a8b6ac6233f7d7c3e6ba23fdd24879e302328ec47bfdc203f4f4c0e849a2d4b12a5e82cc49eb0873d2bee37826dfc539d11258a261e8317df50c903c349f0487d4115c6327607f339cbf03c9344d2ea01a423ddb8afed9962a23e0969238e97310839b30d9800a6cda807726adf1b9597f2ff4c81f13ec7396fc9cee714455dc46d21fb30887bef972b40701d91d33ec81e11d1be30b8f614f91ad80e2b1ed83f98088cb75657a9d8e48fe21420d7faeeb11abffd9724f85fc6e91cf0c896e18b995e78c8115d0c10d5505a407c3220272fa6a2f17a53305b4807b7ca8a6594e517160f2f5ea4656c1db49f784aef818367bf8c5d3ac7e2736348e79af803616246831a1d720aa7ca0310946c3966aa799c5c523377eb799100d473558530bc8bc1e8a5d5058fc20df7bd3fe03165275c40cf25e8d571d7fd244bc62bc44f0963f09970b59c1d97ee6109e2a70e1400c1d091403693e5c60c83cf192de20921b9af79a3f7fc24a0af625d686925b92ffc2396f69651afe1abdad821b8aff92932f690549fe82df46c93369bde50f630437f4e2f9b7888e90f2fc23a1a3615ee3db10dc549c97bcbc4a2b48b214f4b64b6eedc12bc130c05ae27afb45cb0de6012daf6894bfcb99aac660d72a3471292fb2be2114b382832a4561d1ab487d46bdb3039339a61e4213144f7c89e91287252f9f08c8c2dbefca9d120583bea337811da52098661cbd74c8e58aad92a823269fa897122d6e89731300074b6df5628fda8388324c80486e6c657c1e197cedbdfe781dc7263bb9d7920a1ddf827143ac61b2851e333736684ca3e63b27699c30338173d5895de27a2660a416f5bfb9cd0c9c7e2d7fd16b06d1725785a38c06ffc0bfe04dd5d50c25ffc72192cf4fbbe2121e1db7b6c0819c240c55f0f5957c20231eba2ca50cd52faf865df356fd55c481cbdb4c3b4861588572aedca541e0ab53fd81b7c29309578f469a8c3465309ed60718e461795315653e27d8cb0a6a0c0f13c3f1df32688e325f18d5d282cf9d79d7d95870549a37ee628d5932f6e8a767e62374942ea749ca65a2b55b07c981f113156d4f548bfbd32af3722de517a87d98e38929201e4c09a56bbcbae4262f770fee552c29f60de6a143c0531d8fea7fd847a9dc7a3020238041a82c572ee78650ab1e4274c724c2b4bcf6dd97a19bca1cb50f90eac1ed98edb971010f044cfa43f914c0996b1e058a168457d629429327b6c6a7591471a9bb1fa23f08c095e97491af9dc4813e1fc2e876a0e9edac10dc2f618778e3fe67e65d924e4771cafcdee3826f861d1244af1a32ab1ec32aea8680848a5f74a1b3f4314aaeb980033d458f27d795b3232a0f48b8117f464e78acfd2f6c21326478f28ea6c4bb2cd223a1dc972321401247c6fcf2c6e393397691f1cc93557cea8d634585c3da38d6252bc38d4b100ce8cd9952645f448a4d2113796bb42f776396c19147c13a9e881d07fc420d1cc3cf602639455cc72a335b5f8604ba14722e4972226164138056c73ec556f12966423e9d650d8f159f1b3f4460daab28eb4ef8497b9306a4dc9d371bd0cc29e2de305aa59b1a5de93f29b9c09e7f85afd4f596cf33ab13676c3984ad4f35356cc6a83406d1dba311efa67215507ed952375e8649947d0613b184c9d255451e7949aaec134da71b3d3e2cab009b3b0884ebf57475108ce7b4e7185272e9a7511f585c66441f181f6928972135a346238779a1bad0977a1109f402c3328f9b26aa0a605f602cf1b86146598724b68800798213cb7324ba495eb2bcfd53dc1d42b7538763881c30e3f0fcd5974111d3863e443512eb4d1dd47eca44fa507a6a0db140f4799d0932d0a2a67c2fedb35c53f2e6223bfdc4dd3ec75f3a0800ba0712214a784e615197d9cdeda6a939db40c0d542a36c200a63657ac9914d1d2b4b6eabf64c4367a8112921ed874b013da5e8d8c5e4c7e992f4d9e75d5c6037facd43100b24daa195603525aa040e116a12690435106526e7761f81e0213707fb61a9d21f39b0e00ee718624abb589f5d60d50fd54588f8540009d4f9145c9c80c520bb71650ed5b09cc89d7602cbeb7248dd8f8e06ccc28a07cf1d8120c02943b7be970570dbdef173a7a51284d8083e828acddd5dcdd1e750b3146a5660d0247741520515662b7925b4469425448c442c9d13b1635300f15cbf271bf154d02f2b2c0af012b87055e53eecd2892b39207b42718c4fc2a2c68aa75c82a7ba6ca421697ee201435249283af8c8b26ff0b6176de19f0137ff9a00e02e93ec62c26a3f9c187dd4b290a345034494ed23847bcd83c10f9b62c53a461b0e208c820c4e66d51240b0225717c7df4172527bce2c5b718e02fd2964b9b16d26de4a9dfc2ff8968b63ce91edbe4e0410ea211950655c745865d99546eb6db8115717ddc38f1d791c4c4b167319e8382466fb389cb96989a61b1e75f138e74c0cd5f39006cba7d183cb08a640a589d3b5c900aaeef6b7a8e8551d3ffba533b76a2d2228c42ba68bda98c07ffce44e5df82e11ec5895a8f32f58f4dfdabd834192dac28ed4cfd00849b98789f68c9a84364e511c5e9918fdc59762b1984af36478eccdce5096b8fdc9ca3faae2002a59dcdf43545093b4fd91415fbcaeda64430cd7056da72a00ff3e3e381994335c1b39248777bd59378c1d3cf409c50cf55c30e1656836e6c09f7c449acd4f9271d7c68419259bca5d3d5806f22b4930faf984bf5ad12f191acf5b8f904e40fa04254c04d21bb20f7327b564c8889b2f23cea6a6881ec0b0acc6ef2a69e8f3cb1be6dbf72f3a7b64bf2ae9f23749497511c6f59c2eda369661611b40d7d2597278218c102c3980396d641596e9a18eb181cf28a4d5e9e1550ece883147fc4871f59d36b0504ebd13ffdf203ab017b091b4055d01500692c2a19d0d6e1545eaa056f68b9aeccc501895c79842cfb5ac4c3450b118b0f09abaffdda4cd1636b43528ce604e512d4085f4e00c8ba561e18e1e64ab00e102934ea7be539f94dcfef30d23d57561d8b283ae2e4cd50b91ef1b104f5b344469b6c59bdf1b8b631eca203d82b9a7dc7ea521b24bf0526539cad977a3c7db447b6ee63bec468e1df4141b80d5135d2fd0c1eb45a8bac603c81c703320172accd5e81623ed93405584b6adaf77705d681ce0789472a47fc5b2b8bbf9dc6e062a5bcf8d281dfd3a8ea4499dc282acef5c297fc18014d99397eb9430f130ef29413288b4ead03b127fcf3ce6a582a6af0cafd2140fa0e348e4179a8c292674e1f8c63a78325694732038bcdbb180953b969fccdf92ad745b8f3a05c25cf578c2418f8b1229c667251d6ca60051a37d6ea7960aa960dbffd98d3b57a60cf0c96c3bd1a6127c2e5cb973f7c6c2c397c14105c9b9821477eea6c1f65204436ab7478822e20c0df19073cf8353baf8fa33708fd7c7a70b39977b84cbf409cd0d694634f158f2e911340b449bdb5c324804e2f41df03cef4e2ddadcc57ae6aae6d2c6e025671ef2139adb5373cb2e7395404c22c191b79b546ab887ac3e119adcd861e7460189b9480388d9fbfce20bc321a8cb7ccd9425d5b5dc502593718aeb07ab3067ffd45e13d4552f6bf6d349b333b0d838973b99e51a26c083f606d58544d498fb66c493e6174c739a0fb45e5909f56704e0ed22e4cedf8b96b9f0dd83b28a2b17e48b3a7dc26966a90699318e7d24212f23baa36566a92a5f94738854ea23a7c5a3e029b3d6d05b773759c74effa486f2294b43730179e3e30d47b33f163c91748dbdf8514ac8340fb550792464d57d8765b92f473016c4406ea90a4faa43df43eded97c02c64cbeb379e0bc7fc7ff941722e428c16d24e354e61ec01451ee2c52accf1eb107c160deddf72490247164142be22ce2b6eedc3459f6b8d3ffc3c36b5f8ac67ed47ec8c4bc36943adf6230e41c6827e62dbc89331b8cf1fa5c4756e70f8f0e60562c8981501614dc3504c5982ccf05a5c96d01c6b28253bd2db094e534084f69756634035b72ee7bfadab4fd734c9bba174d936fd529c852b5dfcf8e73032523369ae76c5fd3895f6649f14e4a0af4cf35d93c00918a41d776c80ea244eb186a99c7946f40174e16eafba46759261045895d4fa72c986e8891a26689a65913442516c8cab85dbcfda134bfac2e4079ca88300c334bd5caac02d72593d16c080a18c1f3d1227297a52b59454e61f2a6949b47f6cb006fa0796bc0d62c6ca837e8749c4260f3b01f9d3f5c583060c95bc1c265b6a02d5a38e497547a0d99db041b2f249fc50438ad349784433af1d1842a32bf449b5fc95915e3aa1e7d3c112959ab00c166eaf961a514bb0d4ef871411416157826b655549b5510f8ab6f49753b4edd103a11b706e289d638da220e4f49ba56f23712e5664d2e123b4089290196b6ccadf3224cc4669b4f0b35f314e925d309c3b2f50828f653b495600bc85ba011363d7eb95748d25f5dc67f3d6ae2bb840996e9f464671b9aaa80e5c38bcb50e470957e5812be6b0922f1bb83f5e12be7b65ad997d6874853d8cdee2b269738755a8271944b303889b15e7ad88e3136c845cb580a16adae88c0a1f212b6d7647b2158a3f403a4ea37f02d5d052d3a5c3a5e90ae242a00ccb65b570af4326bc5093a0ff894a2b1abde3d753680c1c1cbd62ecc249ce2a492d6bbbff89200c57c61091dea34ad771ced97f54c7feb3117a66b10970d585cd483eec1a6b5d1a925ab942aaaa401fd29507994e523aaabf6055567449c3e950d640ac526d9b0cab6f68855fa4148a7a4a64121c11795b025cee2b29fa233d0bb1cd68b44e5fa1e14394e7e99f471c9c29811bfc752cd8b26c194b37329040541f22a41b60414da7d0b17569f7e34d568d5de73fb839baa3bc13bf0a1fba5c67599101a6754fc04e3cd64b492b20e8d90bfcb5b3d38bb8c3ab49d66d0fdf1636cee750ff3c43eae78aca0539a7dff0220c5d18419a3dd909ced5cd61cf5b3f4bb1736b9eea58f98030d0f6542f320aecedd5f9dcc0523db8970ed416b0893d7d2bb5331ea5c714a47066073430a677f92f101717cadb7025f29aeda9944117ca6bcf8978de205a91c0ac603b9a12bce2aa2b366b3b20e273d2d7ff06abe867b4f4baf112a88c3f486cdd1d6cd3a101aa9cc49de17070d59547f0a2a52f413352bf57ee75ceca122d6038997c8b621347f7663659be7ffaeb907b76bf624ee2dbbce2b446f52365b747fefb989298e4ff8b796c58e3bf11c1c063981061ead4b541bae1bde8db442fc3b53f97ae5106136a86a09e1a10a8d76eaad8e0674d76d61510f4b26bff22c3498114c3a6a8cff1101f1b4ef8329fe29a9b65fc044630f72f640156b9a3832b6de3f3b2daf8a38dbb7f69b3340384276dd9d6663d5640eed6dd409cb9ab9bd789feaf2b11234e68425b33fe12cf0543799f6dc2e2264ea5ccb2d4c687a6feab3a33ccff970328bfcc5120654f0d738723baca802d3aa4d4edbe538e301398de66a608e95c44ff1ed48926dab2ac4fa2acefa2c32e2dc3fe45b914a88e0f6211bdf8b8f3ccdd2a3155930d7c9ae7ac146afb33d9737384a357e2a8e0cf588c9f4735908da8e3612c5acd3fb1a5e420bb07d05ba56d26743da329b50ab454f0c67e29dbfe0d92edf0e46f04fcbce4c03397eb851dd8fec5480092f5361cf7e07f205fa4922ef407c79920fd8132c6d2a2d055621461dc498f0b1ec86e7de7e37b99955c9c6ab1795da65646e1711e109fbd54a9c1968f3755ab40b836b1a13acb08508c275061cd39809d4853f78186564366749832877cb47e9536d8ea440983d0ebda7ac2e1b87fce9822a4147c30c3b614eac11e7293a7b3f1636c167e0ce6ee9a41ad01cad75de15356fb87115a19a795073a79ecde0dd09b440b634e109b2d7b89ec2c2c5c7f5fa4c48259f00486bd7e6729c73e178d76b5e29be49ef181f4bfdf2f10ce7132b594b748bdc2980dd1198563f75dff59d40f133217b7b6728a7d3abbfd2634881f1aa03084126892a5b9056078fb85efbba8e4b862bdce94b98128608c6f7d8f7c437ff5052e0c1b6eeb4bc06c61ca0c20c015e72451310db8e629458ee3a79e7260df9957f118233879e0c6c857414d80ad881f5b0654f014f46da51866dec283855bdd3bc9ea60f217cdb12795f1d496177374794654fe95790250d32deb3b589cf2c28f0592004a0d93d3749cf6f608cb4f88e0d578bbd11c040ccd65892b48e069507df82c9549456c9d3275f7280ec8e7f015744681a85b9741532a0a4ad99ecd802c4da75c29225631cf02a4a78394c30a0251bd06e7ed4cc0f02d743791dcfcdf4be30665b7c365e011308624949eea2a26d2a1cc2aae3fee114a69c4029c9b820f1e246f942c312ab34161dfa54649306242f1474a7343fe967e49af5520a7e47681e8f8b213a992ad00e96a6f1c4f514887dfbde0e8256e1eaeabe51b5587ace30ed5d66af10a9cf367e05e8a7faa9f83603f954fbe2c3546ee76efdeab5fa17a141faa22686252c25658ccfea403faff8f5f4e685c19497e01137ec446154a89cc6a8a80c7ab0519281d1ecaf2b9f7775226c958db1d2409f7c8fcd8e890c012b62830f828fe9ef4116c0cc42b47c614b709c4e9e3376c1416266542ebcac720bb9c030436a0c2d2642354ca51018cf0d5710e230e0f8759d1ea758efc97f277c6c58f414dd3b29722a32b41876dacca4a71722b7fdaaa6d94e5cc809823f2c4d5894f0c2c421c742e2162d44674aa6152b74978f33dcebf01724d7cf8bb574c8872ab73fb5226003b7a6104a20dc1ce0e658e13f2d69a1e73f970bbedf4a6cfdf4b0b8bfa37e5047374fededd614bbc2705bade28307c1799286e369c520e33796bd556d0a421dda0763dd4d9445a3cc7a3c45441164fceb0f282d42dec9d249d82d09ddd554fd081ae2de2c75155497ba937039ef87c4b531bd506edb1e2830df951dc29312644e433dcc167142b76514297d631076a911e9468a29893b430b7866704a4ef1e18e4d812510a9226b00554cca6c1eb00747ab9fae13d7a61d80f740b01997113148fcd1524bd435d7952c5cf6591b1957a78afac3d3bcd6a6a3dcd5b39951588b2a70937af8156e6ec88c59643ec23cc1f2d4643561968e58b07babe0617748cc4bc1e1d978fcc6d539782ecd436aab726e90973c8a7e2a7966157670f1e6ec51f61bef585213fbd2737c7399b5052195c99f9a656b3d389a9a51c0f4ebc6e5ccb0b2e30ffe88df5bcea8e1c691a81ffb5cda3424e9bc6d2005f54b0a1273f910167b4009b6fea909dcc3a20f6c1bd7c3e7edc3b0b38bd301414c78bc4ec94b76f975dfd9aa6f4cbeb6e3205942aa3b41fae2ef847cabf324b27214a3fc5a7af1a831bf8ceae0e95f54730c2a877f9dc266349bf5c607066de332ed2d1fd12e80b7ab06df73809cdc52bef594ec86cff3b1bbd97594309096154375d795781a2957ae3358cc50e3520a75489161365fe5000a280835025a825459908451f7cca08f09beb69dc4a817b2c3b0d23f6185761ddefe6564c3da2562fb624bdb6d1d52332da5f3ecf3c08c8360fcf571e4b5eef073f8607430c68e8266c202c61d793d8a6493306c9a5ac29bc457e69a02f9542459cdb0eff44f878b26caf13373d0462d29c5fdc07d437c8d8f652eb5608a3757891df7dd1b9c38a8453a2e270ccaa25baf0dc60dc9d6a25c12e0a6d29cd569cf5a9c6dd2e7238304d7f9e036662e716b1ccbfd80c9fd21a7f10f7b0c3de28147d4e9ce953990275bc049ff99d0ce3222351456954445e851fd242a3ddf1a051af082d5cb48ecc3468e7c75a3959aa14d01f21b43177d45c4e0820f51676387b5efca42c587b6ecd6b49c540513442c520cb711daad35864cd1fad667648b24be4c8450c39b9322211a8726c282b532a7c271793f3006aec1217655da24db21cac2ac7eba04000530f78bea89203a9b0ca1ee0ff6166e1fc1be506e25c9d3b1f9c99d5617f3c14153378e80ba1f373cc1bf3e24392a9c85cbd9f2f5fafbb1994de4f2305663a01e77162d5e3a601f755b38103b3388896974165f8f903fc820531cdd1974fee574a2e38aeccf0ad05df152829f737fe06ab4b2b1576ed2f5713a1adfc962479a732d26e986f157de6ff78c7e9da3c0fc1c6d35358471e8ceef401f1fe70632477809721b0da2a2105984fdb1659873c1433ce8925df018772448f12397d1337bd7b3db6410032e3b9518e73fd7bdd1128bdd3c6be62421a10eefb0ecc6ad6d42735148b8b0e8b9d3272ff2de2216ea5b1bbac32399c58b6b952d5ae4ed476dc8cab435126aa818474e8fdb0d5bcdceb1d08f87efbc80b7e628f4d3ebe31d45c981beb7a957155409aa1dbe507b3a529601f046de6c91837b1394632f8058b24bb187b3dd721e6b1513b1c8eddb8403bbeb12656a9068e201ac5de5074e5f2dce60f5d0ce9249ace5c9b854b9b1acb53a2cf4990394292e33a68d6d62ba94deddac32ec048408c40e2286420e20681f8ea221593f15b804c7da89265bf90387257f940f815d26f515f8dfc361f77c7e07bdced48080a020c084572fa3324e9984480a2cb678a3c2fbbb3b3b6ac83b9820cbfd6874e464edc5fe3b9b060194fc1f848718e2e511f38d866e2bdf60e0e0f4373cbbbecbf1ff3de2458612cf5e0531dd51c09a704c23e459c40720163eed8d3d2962eec634fb33e84934ed1d951295b84a3f85ce8ecf000a86e1476f8dcb5f47613b96d8e577881d85a643b2775b2ed716e3388aa7a30c579d02f0e5fa9ca72c5a2f0e5af1c6cd4e0c19e29912a02e6c2afda1d4faad128801ac3f637cbc565ef9869d2d0c21b255d0e15ed61bb9798a2ec54d18f95780442d78fb9c10d86b75dccce65abf8699c26dd2dbc6ed49f1af89776b851af33d795806cef5a932826f3b82ba6574c8c120bd9332fe13ccdf472b1611ad3a25e81129349b3f18fd4454394c13a0d5311e24e0458f760ca097da28cc02bd43a0d62a88092443d7ea42ff05fed0d1a7b9b1b346c365c397d98824779def9eb6aadfc157a92fd33de5e78d55b556b9516f8ab15fd9532b02ef2a579cafcb05af3d1cc08d6bf875e0b3314dcaf10b7314df1986d55201d0ee471ceca31805808491f2bafb33a1e332f7f703a8facda6a49713de1ba0fe4d24a332420a689b0b2f0c5bc93e1cc2616ed07d156c45a11dbb8f21bea8e30a88be5625c30053d2075f181ee5eca739d4b2ba48f1261a6bd9b5b7af71f39e3abd430da54c5905b3672466fcceb38fa40b484270233df8e6d34e205b73d3a7f58c0841c5f9272110b2c7d0813277d163aa31908b5929e4ec9822e9fa9100e6992d55b0a0a5f4cbc3bf58140ffa810f6c2e38e2443d2ac7d42c5bf0bceba1169201e66cba5a4c7c9011659ec746ed807f177ad055235dc16b044aee3a762cc194992a80f3b5699bcd62816f4614b1e8e91baccdf36d4db6a443280183bcf0d02e9e38d86585d81a208fca17c0b22ba5171c3c07aa00dd4206f777806d6e47308c65d7ab65667a70bd37f5458db1ab2d7d5e62dad7971dade9bbdb519f9ccfc5efdf2e0a5f188aa532b88fba22d1efeb66306cb1df74251c69f507fb2ae066f2fa560f963797174680cc577113b77bef45d15576a307f6f12b3ce89ec24eb0d749eaea511ab65960febffe7cb6bcba9eab9195fa560d0d4d2d6d5a0d6b1173b8f479523a158fbc39a7412eaa97fa8e5d637a7c6b47aa3c4e1e2e0e21076ebfb8260aed4c654213addf20faadc070edc4d276f9dd8dc539786aae797b64753f3bd3b121d1a853853570084fc81540db27cc66fb43d493817b4d2e3b6f9d9a25ca63a17d0f15af6bd47d1fe7e254b3a757d4d4a42e8def3e9d50067890c7586a6c6bd0b49a5c897455e6a8cd9bc8821f97bf7407c2a097f7ab35851b018b73f72d05e94259038c378853bde186aff8e622a795a49a147529da1936a02b05cc1bf0be25277c6726c79d03771380117f8f83b869d3aced65cf021764fe6e1ede268188e99f69ed381a00a36142f623427b6788a8d1d9038fed31e79e157cafc5fc376166d7a39f38d4c3350c59f3daf5681e2cbc73fcc3773f2bd86df724839277589ed865b47de0be5b320cb4887622a78adeb7af0ae12a2aac356e6d09bcea15832c087996751a16c703595b5b6f4e3a7ebcbbb84b4f5eeb68fb8a4f1c70f7473039e5db9bd591daef491e5eeb53167c2aef7878db24aa33ad0f3973e8c6701c61e4a802dea343fc8ffd4a2c80be559cf6ffeb0dd1ae77ad644f441799975aa583fa566cc793caf77295258d3b5a989c1d0b84e435d35da93d951a22aec2d200cc5a24c314deaa616022b68129ebb51b6ac04eaa74b785805aab4213c950dd462e0ab8bb7c44288c0dd260706df824200e73e3554e2f2085b06bb4d0f6e9b53d88db908c3e56bd9a93f26fbf5e4f0f29232f66a0a37edc11cb3de49b36978ed2c74a0520175542bb743558a0f259dd4566d7d7290147bac2f0449e845b379376b76271303b27f04089067588de9e41b02da639d7658eed1dcd452600e6592682e263070050900f10d558140d312d6266dc5d6aa6bbb09e3295d4ef0cf5fce07cb2915681981c188024c61f67b77125c79a895051afc068502d92e0c29bda80c3f592c8c47273be06e0a07e2a662523fdae73b5e7640dbbaf4332cbf227ca09dfd0aa3cada634a8469a05221605c398e0fdeb2088363aebad47447469b922f6016a10e9f44e2131dcd912e8fee7b470ce8c33bb1c814a6cd0aa94d93b572601f4b2658c056765bddcff83023483c537a724547f3aa86d84ee6ce562cbc69314682e9da159633dfc78cb4612bc10ad14cc171560b57409a56e2dc6cf709d768e53d173b78c597b52de9e681c7fe9e2871af1fbe2c0dc49ef4081ffe22181e0ba5642251c290580d18fdba209ad209ad4cad3487405828d9c3d1970325128617623726383db1bc4e970349e3316a033a79aaf09860340fec1b449da7de7e14174cd68194f199bb6c96173dd8ccf4e3e975948c7323aed3937467ebbaa39736e1efeba0b9ac0970e8f22c4717f203ab1d929f1e910929350b478c8c37602a827affb0504a4fea9299b398510314992a3bbd2c7cfd4ac2788b1f16b50a8348bc724f55656919024727ba27717344658616f0cda609f2ff8b1c32bddd102389c26427552e79f18dd0a54de3942552dd49dbde9e8c0b20811c036f7c04a5a79822b9ae23cea0f6fd4575b4c410dbc351a881f7bce821b9ff89b4587743548272198746a8e40a3b4d069516b887170055db8d97aa8729304e39d015f48a91033a02b46071a26ad588919cff6f7f651fc7f4be7498d0ceac815da7c98076938fac02f1359d5471585a742c07796a50f1009ebf977c29df2e374bcfe4897e578b19c06d0cb2fe16f65d0d612bf2ce69784c71d1d0c1ce5b8383b515b648f68329d38612c6265c25bcd81b0c4650360288c10b015d592e30438e6ec074dc3301df32102d60d6acb09f6f911805bcacd3ee92e52db22b26546f3e28b973ac60a29e1feb7380415379d3a04ac473ef8c6ab9e66ac9859b1c8b6b6473138cffed9e23ddea5a3f1ba40d211c37b2f45be250ba53fe06e31e25446b7c8ae84916054c138ed6a6e303a7c3af91b0ae0a9a296183d0d81fdfd8b5f84dd8875b732f23a8418112ec7d2cd95dad7ba3726c9f0dded9157e92c5f2d5729d51bd1f288677d216f63a99a0cbf8eddca42379241e533f3c4e9ea382598e5578d88260dad3446bd4d4f2a8227b09a0067fe65fc7d330c7381b974b8ae995beb3c4f0e853169333d137533aad263f9690934950564bf54f534ae25637a0b9a26802b539804172c1e6f2839fcbadc0e7041cb77b7f2e7f10b60976a05caba6018aed32e2b1768e04b0754cf0dd7b6b7eb525d2e017c6204f66701961a09f6c95345a4bf0851c1a9e969a102d09d35c622ecf2b181cdbda0b24ef4a5a2f048f86b7304e538f9498285115b7f1e544899e7c4f4f8315d733c2aefe278bb6a9d218a5cd64028c7a3491951e0b7a57709aa861530c39715e233e9b20f0e74a7ffd954cd69f27abe5be8b0b870667df0dd5cf726d6b330d9221e9779aa44ad8861ebbb13436991a376cbb4a8c2e7b8016a04ba30fb172d13fc696ff69530c480440feb27802aae1239c32f1430bd02e524245e86bba99b59c99a058fcbe229afec0fb1a3417757037d80d97b1800a30a73f22bd8340dfff4cf43aa57925145cb1e79224268bf5052f9598ce004660129d3c91f9160cec7cf6d096e6b7e33e91cacc06932d04b52343700cfaee8a07b301f6c6e687643b8ed8b9f7196b6710b156f1ceda20e49d49c0b3c425e316eae93903c2369a3715a8bfcb137c7f5976e48dd82a798eade884efff91ec13946bee0f8b39cc4364e34b9943cabeed57695e2303e1560268de6cba8a1cd6a39e8b1c6ea8895f9b2bcedc2f0b539c1afb1b29968a1c84639d716c812b1795f752f8d45d9a1dbca8bdc2c12ff9bea2aebd8004ed06dbe3029c6487b636ae1ed02d5205e59e432ca522135a91d60398aedbf41a6d3e8425236ad51f1081ae45b109ce42a1ce8baaff08e65867ac1405e182608331d15b1ae750b4517b96917493d040d8cd42d9327f510c507eef279021bde4c2762dfe16fdf84747fd0d3ef713f4efa4ea60604ed824b3624f30675755d22a0971151efe1fe12e442e5feafd997f92749bdf9b598ce827de2077178809df6f95f8fc78edca1652a2082331bdfe1a362ce979c00601906f46d260b281dc4435f999ce88b6118e0e4023815e7b2142f3e1399371249e0b931bc495a9726b92ff63daadece517a4a8ce68059e1974910ab2ba81ead24178d480a411badc82b63a22656d0b2931862a892f4c95e83a960f3324d64d6babf6df555016a021b65921290e40a7042b7efd048c9183794cf09ddc9689d4640b26f2783c9bc806230c09139063e3c0c3c30f926c3b9da45605dfefd3aa728225dfbd40b671653056d4d71a5b75ecd63be2cc82855bcac90a4c6a4263b595eb80a4d143b7c097b7528366b967289c6f85edd469e49f7953154d9a8d3e5a3718d42f3b847594731770c8f81b79110d3e500932c34c4e7cb741475d0c96c55f566ada223251bdab673d08ac57880145acff64e9c7e95f218ec83ec1337f0c3cd7ff40dd3a189a371fc8c785da9877e657580969c784b01cef460afa240e13136cabbad9e8ff130012d22f375702654575c609bf5c0d8380e1f219682dc412ea33239e43de6b6a62801d58ab5d2acb0df95d8e1e48a617c433cd68696a972f8b3dfc3c4b6eaea747d81517ff73c18573be63ff1b6cfae7c18ec2c8189af124a03ff0ea513042ff5d08230d9a785073366b9b973c961c7b981a4fe522f6451f8d177f96599d2209a1f4c08d33277cb568f30c9e16008ba90e35f53a0e9294f469415329bb3b575fbe3d5625f82a427efe3b01c5928ef9afef7cd588fcf9b933a2efedfc8c692621b5c1ce075c5611ee4ba3317b0bd477eaab9474f5c461509109f64d97190cfb547ef24b0e4a877a51468efe904dce969b04a1c8523f7e2941c1f73d99904278318917617abea0c301584418b560b059aca962e0f7689a66462f217ded793c7b5799c331239514f3a7c45524ad2c656b00057feb96b2f1fabddb892fb857c74658d9cf020399c049c5db095d80f22bb895b07932301708db0a9afb048bf8e684ad5012ac4327867ffe8e86b3763b84fc0a4be4fed358e4a6d30ae006a4b68af46019bcae4a2af6fd5feab04c42c221bf85836c61521a00196f3a7f8bc21a3944b4f12a09a0b1f6f4dddc6e22f899ff9c8e3bcde79e975bac2f345961eebd73d4dea751045cdc44ead03260134af49deb3ec009ab918e01f71e8ef7bd21bc1798d9cd21696031d368cb2d044f77003e7f4b5463827f9ffac073c8725385fa860ae9edf8af365643865ede58b2749cbae4a2b3dd92663d422339aea938a0c97dab019aecb2c26ae0efe29ab127e04110e824a768fcbfbc5b370e4b450fd1bd9be92cfb95ce3046807d4335ae28f30a843011acb00a4c71847fb4ef5a50dc2b722d13fcf85a6aa15d38420a6e81b02e9b45bc2d57b0c47a3681bc238b93a3e08cc021181df573fc22136f3671c6b403ed92d79e7b41b4a71fd3da2183614891294f472904ab041f6bb8c08d0636fd680fe21ea1f6ec1ff26065b7e9fc8088e992192763586dbb17e704d81bc8f4af7bbd5ddd7b842ae62cd9bc788e51fe620e5433e00745f90043ad8a1a9839c1258087f8266b8098f0380aa556dd1e196eb22e8d8e0e33abbd989f77e4d15e8791fa4bbdba9e50fdd9a0197a0753e4746d4b68e839d5408e2a7c7e908d8ff9f350ea628ecea46e5e190755e8478ad36c61691507f671c1e60f21e78b26663fe1ebc4a1a9e2584adbc34217aa26410c79fe462230dfe8e488dd9f86f22c4da087d270a5d23d37456f35d661996a4e418c93194eedc6f0e6487af4734e20734934f179b42ff869cb88f892ce14d2a5bcf4e972c00724868d03179d048701b96610ea7a399b9f47258d81b4b92cb1e7493662b72a81b3ebc77bf1f3a0073e1a127a517c3e41143c4a0c1c8e03843097238599842065748b0defe04514216960fc5492d09e0cfae8c02e084b8ce7e03469781099bb3030e71d11e3ae2f09ea235618edf2b0ed8ccc6a10069f81d456649052ce0a70a3167c419d54d3c18228da937bd0e7edeb65cf0759ebc90cc44bc9e1e0093f5be24e35c941fbe4838af30c436be8db867bfa0e9a204261e0176ad761890f1c751a29b54fbcabb8bc46d35535dd9318a2fa4fb5a2d476ab7f87a9d40453974c5dd1370177095b1bd954b405dc72a7694d55bb1043f882ba23b726098c32f91ef8883df47ca807bef1b8041a4a58a822da30009cb450fe59f1d2f854b75d9db3d8f0f4784ac9fbed65a0a2adc5cfbb610159e5173ccd1a4a468d2ae953f99a72b30d99620ebe24bc4cf479f34096004a69c5e898700074e3c19f2d2659a755a4127ae0cc327e900fdb6913d97a700fa7207c60c0e0f36a47ae76c4c5f8fb10432c1040f2752d44a947558f276d5ee433940f4d47500be46cda8d33f4609e6293f40c51ae26164622570b489f7baf33f918e0bbe121a63d180157b6a464598fc8355c4713d26d9e016a9750e48e94d28b66652c20f60c5f66b4b7655e3606559259b82e265882e37229a29b0570c0d5581d7932140c326953e6c210f781a6437d0a076468aef0a82eec45f59669a8a1c2294a552678ca788e6dd230cc669c9f84eeaad0348b996637c58c3e767491350956a983dcb1b145f692b33b638f51bc26318ce2239fd7d262aa042e2e726c15f6101cb3089ccbded0ac5208da5a0bb18a8f279cbe087d3ac5ea14275d2d8a47489e7f63e546f45a0c226d71cd5c0413407022bb1495f828b2d82011141465be6ccb657639061804116c1d7117162fc11b3694840f2b68be864f67fa898a0faba94d4dd256dc4da96d1171f6d69e2bcfecb2d6fe091e810701965984606b78a2a0237cbe456d30c529046c6d801e270d7189f2be1e49e0b3fbeec59820180ba7b261672e64a14e0637c90adf323e3c6315c9b6c881d5a51ceed2ae61670345304b97a02f689aebbf73270adc343a6bf69e86107823b43720dd06a2a9f35196762327487be3e20d6e5d237845b37001d569dbda656fd30231a6f7fe3c906277e476b22442aa5f4d2ab133492f4af14c9ca665d805cc6b51e17d3baf04ebb2025ad73096aa891491c6e67766fb7f1bb291351ad6209aee7d850931b74e8cc4ca9e30171e1c661b81c1bea2c1f807b7417111d8a32e13c6839b75c2235fb34dd3f06744545a94aa76817677e7c100eeadd846756d93ee5eb537358e449b56f43f834ab9e09c99ab24d476c8c16be5796720a82eb4f06a1f4f8d248a2aaf87d2b1556f24615e441f551886b2cd8ca169e0822a28c981fbdcec40e92291b1d18a0c52f26be38833b2dfb9f3fd932b4dbcb619b2fd9edd3d8ec424d8e506fdc6585e5efef66a6c3d666a9f5e01d086642bc8d422240cdab385e74770137f6f0d89278f9dba2b638f6be353014ea71e37c0c11aca5140389038bb110febf0a0365ab14da767c34bf79f5a8305e422180104ab28c2e0df02bd9a41d47a417fcc7bec175c2112c0cc3ec51f5ee139583ebc19e3cd06b21ee8207ef158235c320a00103e16e5c00382d7fbc5613c36dd11a7f9b10b42c9c3c50d6bed6893f07f1431b16e38d4e95befa06c7fa2f5943d5f09a14ede27a48e4e88e5a11ec6066e82559ae4f1b05bf42350c92eea0f74947ff6cfa869194af308f75641781ea526b9b4159a07798e4abc8b537fd34e6394ded23cf01722ac3f8258615cf854ed805873f89f06f04f9ac7b629d5691ecf02aa1f1652c29af950b45357822dc8cbe3d0558e2d742068f285348fb07b23a76e462f87a45312802370916fa96a1e842db823c1100f91f7f84f373375d8127850df20e50a5bf3d85283bfbb12d722d9db3156208d634f0a580991c26c9cddc074de832050f3d8128d2478d66ae575029c9b01f8fd4263542ac44b8e7b675d12a0f194b457508a6efc9b98ec280f412836bd9ef1954786bb247da162c4298d0b7bd3b99e9ee965c9cad08885cb2438d5747100347aec23c623df6eee5cf51a9c1d9d4587e0178afd1ef06773e6e6463ddb1e90102169367946a09aa52457e78db45a7d16a0b194bd2b799ea92659e905928985f6d40eaea83474a6de7c223cb4cd6b5018e687e43abd1a89d5dc3b3c24076bd084116a60efbd2ff909343889c270db307028f31c5336a2d926322c08e9f81e3e5b1ada949f80634c6252c12706511258caa927501b54d7ba62a9fdbf86d43de9ef49811dc17608b7a0cde764144b1b14f600e920da4375c98f79f47d56365eea361bfb488571bdeee64e95a50779a4dc488178fb78e0750c9f2f8e1feccb9aa9f91a9b6e3ec5ed979623bf92a41a075122c57f71227d490227ac1d271642d69a2848eb2836e35f3b9a9cd3a417b55cb92eaf78b65a5252744e5a8a9555b4f6dce6c1280ced1a671b12b7cb3bf3c1a5f77cde62baacc1ce3479db6c2372f6ef2c07959137a14be2a7680216a500ceec12abc90af1bfed61abf9b10efdf232c53ef87eeb7c283db45a25b50b2d0404500df4c51b7a2e61385a0b12660ac25090312f229d55e7a031576dcf6dfadb709e02f6774b5c2ba350f3ddaa556634a7104af7e6b40e7ae9219c1295f53e1aa108d8d05d0e73b2cbc8976573b6f3bc17bcd8b60d00af9ad3e11fdbddc6df3e86dfc152596f0b1510e029dbe6ed9aafa1977a6a0ebac10419567bbf51a9cfafeda1dccac967f9760dd9f9e89b7ca0669f6c8c8d518d6d7c52af7cda0afeb68d8036eec2356f5057b05868d8abf89f7a908f977af95418b7de78faba0b8d8ec6c7236fc1643bd89ebf830de21c99799622558ee886d6f43c5be9254409378e55612072976b4c8b05756710564c418bf56f6217f2854cba33d6e0b10f42bde09e4c6a2af332ac47ce3fd02ab4c4e42501e803f0bbe2e93340fe15b4f4dc0acefc5d4c9f07791712cac9eca3153800e148f8de9e0034562451cadf6c852eb761d7032992f3998e45eb3aa483226389594808af9d437f95e1b34ef91699c9230755ba4b56c89e67646d3d62f7d3eecd684f7db70a5e6bfddfbdcdf758d5e5e47d577516834a1293f7fd0b3c39f7f2f8b9f9f1484ff0c3ae8a331e6695d53ba33357c0d8778174a936af3c5c9dd78b9baee82c9be0e87468b280eed186d5eb17bd43288c5f99b11faacbee3306ec75a057bea99b9244fd18b5b40c2b6f02aede60119100b300acd26c3f0308aaefc193e43d3902b0ade096533965a23f112e861c4b9f2f2b36e24b1401bf9357c924f00fa3fb4035f0597c2f0a75150925558e1feb5af82e6ea079185d53a5e18311c4070e719a4195123cd7a5de91c8f7ac517438ed12ab9acdd04c78b88e7fff6ef892add3616d95e03a7d6cf3ce8180d7e513cc860f37c2222a5c7c0e605be09c06ff9c16c560695008bfaf9fc60c3766a77653c17945bf5fc71fa1d1b01b3d55c3b5226c20db7fcaa9f5c49323f51d9b94b85c86bd54f8ac905d96c69b2170500fa8023e200bfc80160404be401008821028de68109229df7f3b5d3e85009cb9d4ee81d2dd32eec55a52b50ba3164b4488bd735c6359d52f49b26775bd2c9800b7d1ec9e275fe20d502289d9de19d7f1a9dc2f30e6f183186f6e662810a5a00d31abab78f73c21a45caeb62ced522f934040c7c3e0457868211b5f5160a04ff3d81f691a25d45f95e069fe69a4cc22806a3696aac448c1199dc5329b4443076740666843f1628cc1ce5963bab8626d5c2edb08a1a993bc6fd21ae213925b4ce3bf79f38c66acd63fa831cb035835b65edd34c486f46d10f91aa238829bc6c0e8aa06869a9d3bc5d90d9b1bcbf5de3b1a2a18e9f7053a304611e607a2ccebeb9d3036b5aa3f00eaa450943081ee859df49abf135b1bd9a477b21b3aefbb0609296935eef57424ae2ca5f6899f8cd211506e7d3d09d925aa853ec96ad124202e1970110a65db0f04c874a275e883768e814b7a79fd363d0551eda0e1bab244fd395201871937b1d254422675cf64464f42f061140b04267da5a0fb265503a8677695f361a96f599e8a458657084c23f33a78b319a8ef1832170949a3116baa2c24402a16c879795e917aa1d7992b4123384bc42737f4c3a8c4854e3c624db6d482f0f874342cebc66cbc410b9f26b1f7a18ca9a0cbf73b124621343d12ac801b105e099ee91ba5753510090307a721df055180ecdadc32483fa914134b157f70a0314ae3ec478eb211cc0960f2cb2962c046c9a3459af7dadd47262644689206ea9075aada064eaeaace10a1148aed23484759e2b0179b919c331a669465bc30907d4341f5f15281ea436903349d28dfadc680493599e1b517dac166459f506a875374a58004317b8b495d8e04696f9fcd21b817fb0345503338aed6c3f6d804dd7c18cacc28bbddacc08bf295b72dd3560183e2507a6a477da3af329172e5e07b85e8f27e06f55f036deb83801769f5450090b7183898b61a318d2fdb14263ffaab4db7df7ff2a4c6c3e7c42efb4d20208cf97a042c05d649659d827fc0f675c621fe0802c2739f68fe16178052d9775f4896728a4dd5391cbbf2ab8b8cd69004d6f131f8c41943e279cdaa6849192fa27d7f6b1121f3de5538f04e06908ab5baafc6d20a04a0e664665fe1775ec4d2945e82436e0fcafcba95ee46e095beab37b3eb690242df8926c829e2c80104307022ea41332e4b52638b50e94daca17c0b82ebc8b858783ac78218e34658c0361b1490d82259edc839ae6db192a350f958da4de394adbbd202b1fe0c451e946918e0cd1c1876585bf0ea527aba22f1100ac5e401957ce786669a6e9b98bdcc6533afd8301b46a45c360a7e359881ebb1f4eb2056e1a3c9a941146ac681db35b95dc5fdb1077f907d38b746c88da4221154b15fe46276b5388f7b1f8952a8101be13db8bf11703a9cbe43e4aacaade56254d9bfdf4e311323d9de8ce2d51776064d0a452449610baa99e1d65eeb7374b6b10ab21e492c6778ff366e2065efa64ad58612720bb496bae4592bdee188d4839200dacf571b474df96d5be381d2e7fe1254ff88f79e1081925c1dc4a00060bffa6312064f14c21871a0f40f843b7decee75de57162c175d76073995cea00360eab8487ba0a7240f7b34967e41793da9613c21f5801fdc9e50d573261806d5228ce3e9a86101a5b8ff1f5971bd4ea1809187ddfa400ce273d49cc02eab1f72e99684394c79863be08c80f082f92d20557fcd9acb9208653711639654893e1345b2fadea8a794b8d3451afa476076b66a316fcf8af48e414f884ca5e18e7da7189917cb6d42b94a18c6c82c36c4879c48442128ecf95cf08d283213e4bd9108302267931215a7ccf01b0ae9c1fa3613b6b3ab99b5f592f406588f1f0879aeddfb15dae7f6cc1d3db1afaee14cef8a036e000827609a773586637311594a76999e31368cf701833fbf5a890925b61b687fd95e3ac587eae8615d4546b87ef652c11f3a127c97a04c95601e472ac37d7eaa2e148d04b05f7626b0f5e23ba9e2ccf58248b3e82fac7ce6073a4ec8ec6afcdebda8977495d84513a17c1610251d75adac1db2257ba7c225e26344ec55697670cd74cdb0f66bcd0dfde317347d373d0c369e373b84f899b0cf4a63c57abfcccb8bdc6ee11045b70968a5e1c0248c3bca727ae900db4bb567255cb04bf3c61dc43dd22200a7d140df0b32dd7ca97b2bf9627f188d488c140c2cb294e62b6e95dd713604b04dd414997e9435fb919972f298d6734ff15076e86d110e9933dfdf50d07124c0e59038460d74846b282e81d41893ce104ee3e1f507f90ad745a8d747e826aaa9c2e106ba9058d087de9d0f4f0fa33b1dd277cd604730b50065de21ea80ddefd768cf02231da630cc84adc24728f91beff35b4eb16af433e4ba294710c2a9f8a12146e1a587681ea037949a8f4d303e6d3359d60ba7e01599abbc4609dd849f903ecd2e9e2aa46775a24715eab1f34d981a74218d8add2fa9a7911a65e360b1cff721ca0ccc60f55eb0f48e17f6841359aa5b40c84f73629831b07869df9cea6984a28c7c17c978a01228440f49e30d4e8d6185006babfc56ca0431b2497990b74679e6720201ec4ee685f10a4d1a053e0f8f43fd7dc2dc25fda3b6aa00e314333ed3747b27007219e71cb0600240cb05f15d8ee3758f612886e585a9d30a4e28049cd5790d0f8782039ce9083e752d2d94ca441e297253837e124144a5fd28a94b3402f02e41ace7e65ea058b27774f40f6e906b51e1240a55bd3c1db1c289293eb635a0851b9c4f15ea93ae855ec41b6f579e7ede2031fb62d7dc373095658fc42ec0225b9a13f4b42fbe6a9c27ee7290175c9bf464656303b33d5a97a2674038ee64af6902eb5fedb0f1bf823065af2cb30452dab3bb65bd7dbf2ad0c1c43d9e42ee8fc980d825901ea53b42cc5c875d72861de71a2d21ba6af9fae570837d71b7ed75e5c7d7fd7c42e2a217b5c5ac560f7d816ab0cafd7325e57d0ec2c44775f72e56ce3fe2a66d79b6abcec17ae698b8c045c7f777902ea0883c11525abacfe4c3779169bc743bed5e6f9d1493b0afebbb1a878592ee37d3186e94a429534932b5a62490c9437badac13ee35974ccb4fb437f76d4395f53ed15dcbc8a25e8e64b7273ca0e6c6642f04d36068cd284a6dc2a5cc1f0d2a4892f107838b6b2b4f86356626932bf4f01f559c4c98a81aa22a4f28e657d884a55cd23b21e16622e9cf2bfaa5ee44ca18c5c15f9c8f0037e6f578f8b37e2f6b87b6eb576d27bc45abe795a88f96be03001e95214c1be0007d82a104e24843ad8b991c6f62619342b4203c4467ce8e7b1a8fc67b958a76846d6741f20b16bca9378aab0b4e16fcf9143f16b738179072842fd03b8bd925b9e3deb28dd6c31334ba8a1682ed5310f9573bd4e27e3c1572c95a5b3471d3f45b685858701d6333bc7b6d5f2a3e8debf74cabca9e11ba707fbdf0fc5965208e3a734a304641f6ca8c41e9d8b60ee5a3fbadf18d6fac773d9580bf60c72760543e598e26130b464a7c36ef1dbd6a6a5d232f57685025bb783987bdd50422518844f8ca0302864b1e5dc5f2a1f56021203c3919663fad08fd62f70139b833a72536b23b1d9410cc5106c25859614948583b1f227624ac43b8bdbdff894314c4a3ee179558eea75007ecdc5db43663f330349884a1393d2856f49a350726adc36a4b74a8a3e8996f63888a9fa60d56e9368d9dc95ec50e58597efe0d9780f308ad0b195647901e79e14e6b00f1e4f224ee94403e8e494fc379d5173d10b29dd93981e87e39e6d5d72bebd30fde44ad782801edff5da2ba60acd7d30148e1fe57a92dd5c731864a9df74ed317b889cf41ec933f61442ff461acd155a1a14116cedcd0ccd88b70630555ef2ffe0d2aace49719354dbbec6489bc3e558236f54093876e9f6a1198a81e3b9e96c3095b9cc31310371429e0b51dcbb731e20bb959aa4ac72c7151861730b3d5f19c26eb00731ba7bdec72f1a1ff3c0d6b3f040c71bfe6048cab93631a42851d3252478fd432e9a22a918826b9735db0d82c60b2939af2716f743f9f550aa47b68d0b24d05a931f9f8060e3a00aa18e36dca079e619b66b49a4d84d05c4fdb574551d965134bf20d60d5e5258293650b497ff4bc457ce5409b65e14f64c33ba9342ea0ab1ea2285902ef443ad2343d162ad54273ec4d5459e1b7e6a658ad9f1d95fc4ba4a0ba51e8a126514a4d648fa81bb793c3a1e6e40b35a9bd5b0b8a394fb1fcf38891852a3ca69152f8019ab18028c750bc90adff5eeb6c34ab4f745e621ab5c732016fea84fa8628091a185e926d9c163da2b7ead3959b258582dcffc20c3b0b09df71e787c7ba96d5f019023f19c8b547ca82a443c3cec31ae4746360fe02098ff458dfcc9b6d04b1f9ee76154af329642a838de51232d9c0188de6b50b0e75888b7518d4e14f8b969006c8fe00ad98a69c4e45948a103503ad859cd14f81f1b12a9c3108616330a06be447483053ca67938d6976a8521fbcdbe76378a4622d9bc85436c4c617d4c04ea52453a4da88c7891500a70a6dbc6212d9b74e129081bef11b19887f1e617b3987fd35350c25cfe0705447cf5a3b117267ff8c85d93f551ace9e043119d5d10f8c1de2d0a016a2469b5cba3f00747af8c4c19859124c38ec5e4c323b46282dc33f3084e96e6b2cb4b6a302148265e408f97f7d6d8a8e9004f809e5e2f2a7cefa25232acbb31545abe2658d03a017eaba84781410d29461d10868b8524dccfa8d8bb3376c0837a8ccc5224c62a3d7bf4a70c9beff6aa784bd454564935ba176398bfa98a652c7c512eb35983782372779ca78f87c1bdc8f323bf75aba83b2c8bbf2ef1e4e305acc0ef3c8cb5cdf4ea2f02529b6d719753b672c36e2f33eb9a25ce245573973ae61972df16dfc9338fa67430a2fba4840b8559ed087d7bacc98d0a14486af5f2ae316b6c83a67c3ee5214182ad79db736789d8ab40613bd083ab993bb09e0e3ab83624feb92b08cbc0d7b16530668bed56b8087e23f81dbaf85111f4a240046315f4823e1471710dd5e0c9e844aaae412c061eea958e8200e3b54d664ff104ee4c53e6cdafbec9bed14e516b943de2864bc417b95316b89e04a68774bfa8cfcf840394f5ebdcd008aae2e5ae08dacbf3dd4bfb47731e4d2871ee22ce6f3ac985f92b154fc499f1d230070281a7e37975a0534dfebdca85731a812fbdad3766d2c262ec658cfd6843268c073bd2c4d3b7f7b5f65245709eb53423b5b83a621c78eeaa5c7ab222165e66984fbc961b7aa2221dfa35071bac55318ee7405230c4aed85098c1237ce1887c540b5e34753bddd6b9aa254208334bc6dc72dc997da14344a3e73c42cfde3a935599196406c2980ac3bf3a78a6d6cd840e2ca80211a328b35935135ba5c495d8c4c9ae731f1f8ab231122808604557ea02fa52a840ccec68aed8ddd9016c0fe87ce1ceab5c0e466a845488d596829cb2d88ed581d0ccf030a08339d5b30d0aa9ac63139207642ff3c2ca11c1e77271bdc239f115c36786cd01774445eff59affe054f8f85eb0530ccae1a5967000a340a0482d13c496ccd50040a1ca39251bc4e65a1fdb795b266f63e3d3521216defbdb7947b4b29a50c060a7f095109944e4a27a5d92e63368c5c6372beb16d13db43f2805d7093d672df4020728c3eb574b398fba6b9536e746d3947149005626e66f1983fcba065d9416f1b2f9ab105e9d1bc745139a346423468cfa8cfa6a74bd4a04836a5140d2336dd60603f878ae0b029a5945227636c2c65cfa6119d426992a954063d458306ee27362521890e6c984109243f55502f8e28028c32b2508309204a7554e103921038b8f0840d62b33946098a508a42c516353022369b93e90d31b4b8c27405c9e8274651300512608881f4f3421a53f60c6683386cf0206865688339a0618339e06283f74220e0eb0022ecef5d08e4a330536ea0b7771c02f15c98c8f20926277b46a5a4d16477ef6846d0c2095aeccb01d3500c9f0b81e08c4613402e3e6d735684bda18164cb194ba3d15a60a2d162540a9572c6949ff94f06479b1e7d51e489b10425b634383a49713c23885dff829d58714d9710883d63095313bbde1502a9483d78c1325b6480831becfad6085ec0a20d33ba88818c16c828828ec8d821a80d26c488390144142a162c7090c3d191112e60d28489221e627926091139f82083234943c4eafca9b5d65ab72676adb5d65aeb2a0452551fc018a0c7ecc790194a9b42b1e9710d80367d76d5c08a4dff2a3f6cfa579535363dacc606419bdec6c8a637d86253bc0228de9cc9d60c236a0b7906f69052f4588ae185b444c452d3a63ffdab8c279b96b106ad59bd41c6143f8050960b641001b3e9c1a14dcf809b39f35927c6c0c1aef7422035bf361c8506398437db387f013a3393d34ea2317e76bdadbf6d88c10608f4071ef23c1223885db1048228e3882531a480c91bbb046648a93509951125463f6f86b2f85a68c833976b4e22317876adaf2c16ed64670094b8d8f58d3c035d30444a3f3e40d67308c3674b222a9aecd9c7c49edfb12511184cdfd09e351e5295b19bde159361581829276d3848cacc4ba44a23311e3da4bb69120e3f930a7dd1240cbcb1ed5dd81687131159bc97bb4a4b5f43495428120cf948568bf572a8d26022a4ccfc11464d1c6d28908cf611120e923cdca8a0f59a28cd34e2a32159f235a13392080c9e3dbf9e3d63f6cc6bdaf3fbf99cec09c6665fd09e74fe2071d213a4442887211d8c7638f2a15ad4f6fc9c5d2b4d74668687d8436c49fc4c2849c44ce9b167f3878a52152696d8b37965e7fcfcaec9a3e120a43d7fadd099db749b6ed36dba4d98867970cf6dc23ff367064da18d09980d6ce8bb17b4e7778436a3bdd5e8cc6c5bb2f16c3d1b0f0f4fa591b19e253f3c5b90164080df3894160347599599e09364e6a5524cc6bccf645210f0de28cabc7f32701429538c226d21ed43676694fe541a2c449db8f25d414fdaf3b3d774122434b4a9d19e38a8cacc6ddb8636a31d8aacc0a483f441ef013a448768b45d4791851cd99483f451ef0114a4d266a2d1b61dc549ab296daaa5d2a629e141c2437b7a94502474469c4ba60f0eda731e0f61231c8485bea143f9648cbca4977b5eb610c41847c280618d169488c9bf2a8dcac91b3124d98086232462f2d9f549167c5389b9444685204f1df29c39e41d73fe53cec822f42c0ca133b2c7ce350372c8cf1219ec90a2837cc6a6df51c65ec00892e693667fd2d24c2b8288ac40676813c9d2a6b5394483237b066ed994d4b4797a96c81d74669667920a3d8c2a9154848521442e4067e40920e5019ed852d2070972abe012ef4d95a993f66c3a8536cd92c7bc0c32ce28475c65ec28abcc6c852ad6d1041adb32add3e1cb9652d9922a952dcfd92a5bfe2e618b71a5135324fa929f94d60a56cede0d739d673dafd2e96d98ebae873fd08260a513bc1efe3ad00b3bd00bbf1388ca36e74a67fe4e202acca794caaa54954e15989f9ca06cf9140d423dc9496cf99590fc952bb44669572892a6a329571c4da18264347fa6cf6cf2337de693b98456b1c224ab5c69a23fb67c1d9afda07a26a79030774ea990a8562b16cbc9966779c2dd8b71d7799ffdbe4ae7873bcffb3e100c4ff674aa749e3e300c4f27142aa76c2a55e94c9d5039a7522ad58a6559ac4a272ba55aad582c1696168ba5d56a6971b95c5eeccb4ba5f3c5e50587980346078e6bab75a5539330f70b48b5984598908489232461ee1c36478e4a678e1c58d217d5f22d2dae10cfeca67a066616e8228a53dc4e62095c05f6e702523df3a0cce9096d5114ad28562a4e719ee2afce5aa53dcd723601ac7c3266a6a347284b2e324a68cf5c3a90ec791d48e80ca5a821fa424911126552032add439566c6a6fcec209e01a38e5049a825d4918e9e1f29e5e73c9efb7b9661b32c9392f61c6719b691c0d0810ca458438d2019e4918f104d6abc40040ba2d8dc4879e4446b8c5ce76c8d91e94f4320dee756c3064f45cae9b93bb985a7f034ce72f6e964c308d01d8e9f0c4fd8d921a88534702002c2e28bd8499f4e5b08243ca767395bf4febd625000f7694976792b80daca97c7020c9df9460f771cd775339480dd1eedba8ee3b8576e54c1ebee82a921a0dbf3ba6e74d157c52fee7a729207bd6b9e4ef9da46b0e7e76908f65cc1b5adddb3ce260c9dd9c60c2e81b0ce8b6a537f43299533d899e4effa1b39dadcd424a1cd4a9267b05d613f1b66adb5a9bfa987d5d76c61f71750be7892afe433f237ace6afec82e90c9baf99ffeb7342a5d2de6452cf9e3d8967cfc7ecf8e28a2d89be90b267dff3345b127991c47e0c8d00bee36cdbce71d46e76db28dd3298459e813b26c79ab6883c9354ecf9db59f7db212c93405afe610d25dd737805baf16de896c2dd784c4101dc0a74d3d3a3ae898a152a55e673535edab60b2abb86cecc2eaed8f33d7eec29ca6495d9bc4b3d83c95e652e28837191e961446a647759f19c30fa82d564de6d280caccaccdfd3d7fc0b4b17f9af6ee44220f5f2e0b883beaec8b31d3d6a6c76c831e8d27692673349776b2d0ab07d4fad75d2f4c394c4242592b5564a69bb14eaeea4acd6fb3e6f7303abb1564b09dbdb25099f96370708e7fbc69c8f044c789cedfcc8b63c27759da115265d0f0f303094a6d5b3a96c4a8f8a6e78839e684538a4418b70a8422fa574b39555b4e95db9d65a35379ecac0dc0026a9ce1084cb0a49693194eceac182a1af19e41528cc07d0033402633003e5d98f84b2b016d9ce0dc9b64279a6804d5f3f4739f1a98826f2f552525a4f475152f91d99af99fffc6bbe524a040c9643829516b17c12b0828801cde748329000e228460219450f1952627904121f30b194f29d64bb5e4a8bfa048fd233d93ebd6a1460bbfe0335032050c245ef72773dc4ef787f23ec1e85fac0d3fd5c61db179ce09cf71eac09e7bcdf15221e485f4388dc930b50806df1321c9e9d2dacc71a4388c884c0c8288d542349eeba65d10d503685815b2e492bb269d2669d3029e2e54e62cfc03d84884cc8ac7b9e84bae78eb0851653ae1b7739859a69d49c735a8eb3d6da534ec368d2100d10a1331f67193587d4712680240d1019425f9585099c2aa9ecfa7a9623382eb658b245cf6c262d2125214951aa328fe55603e9840e90a032060e4fec90d4f57044680a1b45cce0862701740687beb8d3c8fd86beb8cb84d4d35187be3e0c654c9f383c79bed3696e9825e2cb31add2e438179e6b9dfb14aa342c9f3d2e34c8f30a140eea48880c46c66878c249bf3cd4e2e70c653518ea4f87813e74b90ba6f3d1011f93c60353863ba75255f16e957cbd4ed61840d2cc16ba49933cb87bff8d40bcdbedc5254abe2eafb5eefa5c82329a3c1c8737c77d175401c4913eb673a780a4e9400ebae0b8736fa99145135e0e7321e2717c86b21ccf4e72e849ab32dc71c0e427b9496eb23951f6f222c3ed741b2a6a1dfaf02f5a07e85ea7fe547f3a4efde977d4f92e8d7a8b56bda5536769f02c7a754ff5fc4e8bb2d34f90b1d3838432b659f0eab59a0a67f254196ec9fc51e94913229bb41cb4a5072458ed7054e5828b1483ede1d8b0c248a5fd6c6cc0a00474c9b2c18213cc3786aa8cc46ca800498c36546524268146f3b0b84bd9db92888a13c4808a24ad2d898e949031534a796badc5dbb6adb5013731485994c2d03b6a80ca50ccdab34c6799ba62460d804a7868c87218ac74d2cd3249b12f9bb3c53e9bc58d3774d8b5fe0b8154dcc277904608bbdec3d40c20845473be605e5df62ce6486e24b1831976c0c5ae6ef8ec7a1c02a9af25395082c70ca41b1ca5c1013482ca882286104b8e36221f82b8e0951bf015a54dcf81b556273d54993d0363d04615146c0ad65a57e0c6ae6740ad3607511bb44d4ff10e941acc586ac30548f820830c4a92da0d3d081dbd616bad7542d9550556ec5a6badb5dacd060d7458f0e4c6c7946d91155060c2865e5ecb3a0a400b0d74a0d27800062d7620d5d81405c983da91c81059857e26e927a5b5059f8c9122489a6e44415a99f9d895296f2c463985b9372079d4cf9088933c934637554a298db2b4e236ca885499faaf966537f4552b963453cacc89e710125f96f272e79e6d8fe5f7a2652c7cd13266c11c979c979d987da8650c7f4772117b16ec87d813b1150cb58b8c8597a12c1cc5ed38335b8a305c8edb1361a1d2b06e5bb793d6f273354064087d2541e9aeb6ef2accc5e78039a845f1e161c4e760396b8311eba457bc77089115268dce20a129d9d6de6d661e3a337ba6e55aa65508600b81295dcd36a4bb3702c15723db6f15c46d94c188bfef5acef25aebac7f303ac7458de32fbade45b33044fab8db1ee5848875cd9ef0398e133ec79803b43da73efc36e280c731e6d083e1450ddea5656c86a2ac7e7769d55b74ea2d9d59fa943aeab5fcd32f78197257bd564bbd867af85a7eed743086beac2672424ddae4993d2a2d633bb42155c6be4e5ff6f534b3762e4d0d01e2cbf9fb20f278d4e92e7f471d201c1d5963535343e7cffdcebc3c8e1c7380ea88237fc79cee72bccf919fe34eec7512eb57985bdc8e73e716eb7580ec75e6ef7580b811075f5ee7be8ee2369a307f8f337f471c797c1d3ccaaa4b0cf2bccb2543a3647361d4e0850d68a4182e4062010c76a8c28ba39858e76b95a932b41efab984d6e6e53b18ec250d77233816d6786a62e18de01875c5e82b46e75734436dcb2eb62c9201884d533352136b9d07c7603edb12c08363adcfc2ddfa2cd5fa6cc592dbd5720904cc6cb90dfd5ca2649bfa3a31491f33db1e5669e8ed6b571a1cb787d95c56695e6e3fa4d2b83c34ba7dbdaea4bebdaaccd652aba7c711eafa93de89853f6127168e393bb11c201c8a430228444f62e1984302284442c4e871e819fb26eada502d6333536fdbcb4ddcb617a5f100f6e306e768cab61b37334319a192ec514a16455146958625e90cca88c5dae414999e05294f19c9c37eea1a11a68c3dd5a72d67016603d8f61b5f92873d8b510adb55d8fe8d40f0e75310ef28ab951e043b9bbb0d85696de251afbd1cfc577578aa4ff7748d1ab9eed9eb257d9cb66d1de6415a8719c52d48cbc56d144d080ff320e161461d201cfad3839c0e73985187fe7419d3aa833a7551b3fea25777e97c17cd72ac4f90b15a8d75d56baba7ce695116fe04190b4f2e5b56abc1c0f25a8df59aeae16babd7526fd122d7d22277d4650c9f74a8655db1586c4acb5898839c4edf7490f0a873da84f0a851070807fce93aa887f8c5658b3cff81dc65e053382186d23236e55565ac956d2f2a444d3969913bacca58911b653206a28e50462f94114ab583a92ae9b3b572f7461defdcbf91bb8e1665df7731880a25d03d473ae90c65f8b3ea29abdd73ff2a95b39ea4b8e15107df7b37ea00e1e07b9fd5b9ca58fbceb3d65a4ba9c599bbd52c549b99cdfda6d2d4bb7a324fd292cb94dcfaea345cc100be358a1786d657a37855c701efad361476efdde8d7e2935b075be34d95e16c5ca6641da0ed3aad83d7595df5299ad03a789cd628deb76e0f7e1b7156636bc469bdbe35caabce5dbcd79bd24777f963739fb57a6c6ec794e13ee3b610486b7519fb461cf039aa83a3e8597c647f15c49aee4edf4d4320a2aca57a0dbfe78c38adabc69cfad63b8daf9ea825fae2bcdfc4402d7aa32c5c7db58caa825242296dee1f0d753eb2bf0b5a3ae31de1b17406dfd3d5f4c8fe3c7d53076f81d4c151c416c817f1289a00be751cf0ad3107083f07a51a734e6f7d27364320293c606e954c754f73db535decc9c05107085fc71e7c9029c51157c45aa34e7d7877eb38f6ad51f4deba8ce1d48bde289ab07aeb41566f8d3a4038adabaed3f2d583e8b4aeba8c6dfb6b693105154aa0fb5ec6f2145a17652d174f90b1163148eb9d773b596d75d56d684b8bf7accb588b6e39cb83b4ce1a75586f9d65d401c261bd751d96b75cc6542b164baba565a5654cc51d8f38f5e1afbefb72faa6ca705ce69ed2b2da5419ee8e3b4413ecc1e3d88323779c7af18e99beb8cb98abca709709e16ec3fd86ab591413b8c3d1940db7d66aabb596db26c7a120eb66898456e4f9cb6a6ddd28cdc5f7f234dbd940d0dac4c4da59ed365a5b47bb7548986cdc0d4cb8dbc4e4e2262678dba6adeff69cb38909e6daa0f5470d780b017b435fb4078c07bbe960e35ee02e0f17f3b06b9d55f6f0e0e1abe49331f647cd052dc510b8f7ddd5f6a6070c863b6ec7ebd5795b17438ef9bdcfc2b85cf2ac7c2fe5e7c9fd85a09c823f0fd750af106b94b167b034d6a0c2c61a56ac51340395d8e224a53584b0929cb7245ac3c91a3fd85e8d2634b00b2b2941b26d1d085d251892d8255c186898a06e36685b185830a16df0b4d1d3c692ec7a810e4d4c4d4d44613c49b286d05e0367a66710539c5ddb96446a1ced2218a670030d342e2d835b124d31c64532c50c7ec82d5b124d21e585299260229fb6249a82054a533881a961c4da92880a33d4a0591d7cd3bba89ec9221f98240f49bfa9393b75dd5fa594d64a2915524a294305400d207f3a535d2e8c6ba575a3564a29bdb0736973578b4fc604d7d342bcd982f944ca0c2169bc7b6391196517c167641c26d9f77de0e6e922bb2b21efae82074312e8b652fab076fe67ca8927b661189eaa4d4d4dcd939e276178515426df03ff00c00e189297f4715f64f2bcfe2af3c386e4f4f8f614e11967d3688869f2d8a332287dd4e30f76b9e573913982ce40e02af3032e72e7924dd61e1ff8623cbb551a3dbb76972095e9c61a103ebd911ceb5e9f6b772339e6bdded575a3b8795eadb5d65a3b975a6bf55e6b6555d76beaf5f45a5b5ebf8aaab5d25a7d6cbda9b79f0e9fd2a04b772fa5bdbbf4ccef3c15b88bdb081b6bbddb466badb5d65a6bad95d65a6badb5d6bbe1aa823d08e6a65497a085d47bb5de481ef52c4633dcae45ddd65942590df5d34a7f6fd12a969e31aa455968f583782b9d42d15a6badb5d65a99504bd5eb523b1c4541c1d80e15d1a25019a13d35495e406364cf6f6a818b6a88e2cde3a1397bbed81f9644453d35d82730b83704ec2d49ad28cf0c60db579b0552161efcd8b31f38cfa0b4eb5d4890d8f5b761d7a2122ced7a58110d33ec3a83925da7144760c1c650ce3fc218b78ec800c3b6b7c73533c46d7f7966510c4d70d80590278a6d6f8b789a72cb88a5a936a6c70f29455e2195a4951d7b26af6c3b6bdbda6d2fad9547f6b204dbde1e67d75f45351bb67d8dcd8d0c061eb6bd9021546c7b2245b6d8f62cbc30064d8967c9b69f3d744616c1b0c3b69f4b7e5a7062048ba0a06d5f74840d9b9b1cc9354b91b391154011d21e9c2d96334b1ff09ea00d3523b058789e1ca3a10fc11c81a819c9b14a358b8696be76f33674c84dcf12d38bd18d6c4891874df6b21bfab2463edb6de8bdd9965c23d44597cbcb41ede2f2f02f2ec721762e5ac6346c0c8008dbdec82e4064852b464955989af0edd163a9c7528f1ededf9520c401d2485ab1ed8df7cdfb0c5510bbd1e5b775115586e4617f35aa0965c694b10f51686c7b895a923cb697bb2ec4e530df6438eea275e8c1bf689d97bb1c07cc8f1e2f1aa8bb8bd6a90f378db7eb2dc771bdc5f56dc469b938e650d7c5f02e1a34a11b714e2cdf595a1586200b4b765ab2349e1ba34b5550287da5d7c1f1bae57c719baf1c60c8892a17575ebdb4dc7ba57b750f0f5ed43216fea4c1cf9cf3c30c5ed433a6d23a3017bfd23a403a388ef272dc7b379611cb88c5ea24d875db08829d7d5570b9378adb83d4a31e845efc076ab1bb8eae3b78ba8e3107e6a7e7f84eecfbbaeff35e826070868f91fdbcce684ad7752761ee4e34213f3c4ef69e63ccc1318addeb51cff7469cd3c131076614bb7ad471e8c5d38b3fa9fea259eea2592eddaab1aeca39f5d66b35969ffe9db26a95532f23993fe5750ac118551d1dd91819eeae4a63475895e1fea23336df0f4a23ab0cc701518f02a5a963cd488ed5d780ee8de0d83c77ab6b4660317b9e1cab3cb058bd911cbb8237874fd21ef520f6a87a54bd0e6a96a3583167117312217d6c3fdd0c30b840623a31a3d85c9752a96418de86d214a5f4e58eb210280e56cba562a2b5150a2b6fb57a59a50ea35717757e082f4fa9f4cb593af5979754085ac6bedbf9984c063069260aa60f6cfac0e89d3e53647a164cfac0e72e00493389088205c1f03883e83d992c847f2fa9cb50ec46994ac5120233d65a17c71074ede5a92993b90d7dd1b596af9ed2b5d6f3838c829a4038424a0a21e8358df4390fcecda3f1b399f4cf26530d478743cf20eedd57bf09ca847010fe7ad1213ca54148a540780820fca5674c7cb98cc17cf0d483c4fc65d4393de6a9d363ae83fa074250ffe0424e8f91d132f66d312c9161e2604318347d82421eee03e19d9e44cc213d8b9832dced2cc06c2211148e40bc8717a71627be8eac2e5432eaa7cfcff0f60f8353a310c24f90b1101e0484836067770fc7eb8be06802ea1f3cc8e931c79546e6158a26ac56ab9c7ff5d781aacb1c477519d455ff461cd65f63cee9ac5f1d827e39083af50f34cc63b4f86b977ba0757cd439ae358e1c87790dc7c5979754085ac640d032f68196b1182d631e68191bb5cb75bc56cbf11acc5f5ec3f19af8d4e74fea4584c19143878b0e2d63397668b3c9f4593d9ffb904aa3629d63b9abe5add5338ba5caab568b4baf543b341aa597f7aad7a3f4e9f638aa51bc5f9d46d4550f72fa6ad459fd74d5a80384b31ac5fbac23de5410d5f3981a75807052289696b1cb714f9d5047485c0eaa325c1122f4c5d9d7a32d3d2001cc0ea6394e900f5ec6428d5a4aa198c207c94f8d3aa9e78763ce12d4322136379f055da26471b3f5a707a1478d3ae0e94ff43ae1eb65cc5afbcd1ce2f696cd254a166283e2b9b11625ea58dd5e48a56139cced5968e100c200fab2b7a12f3b8495e0b07b10fa965fbd6913eac1873aa9d3835a070827757a9dfcfa1c1ae884d3756819437da54f9f2190510748763a4a06b19c9dd8e93ab6afc0b31e24fc6ad4493d3c6bd4d1c9df0c45f042e8c30f75cae10dd9dce00c41415a1942924a724932c926d4525daa343b762ced58daf674c70ecfe5fa4619ea6433e48d40f03d2d6e075f9fd2e226ca5028154e90b11a8ec35cec1ea41e7c10faf09b16bbd18450b37ed2abe3d0aec3e896bf68d545ed7250b71ebadefad5a28cc55ae1d03206733997d76aae5acb6b2c5f5defd0be158ba5d5e272b13635942c3fa565ac4ad63655c61ea56faa8cfd29049996e86b09d355151f0576625b52947c97f471da73667af8d37ededa7620a38bbe5c552afd3c489a472a8a74348fba621e4929a5d0fcc4b3284bb15617ddf30ca8ed293425a6c805257bf6431a552a85e84c1274a61e416908de8656d77cbde7bae309c8d8761b8a4a421f77dcb5dba6ad96b1891a4209a184f64425550ac280a22e6c1933cb2e5364518a92d3e146519efb88a37347eef8a2c4d9de7dc3f89eeced4eecbbba75ef288275da50d6223fa4d2b89eef9d854a93bab7bac7724f32a95862107e97a1cce5a18bfebc8715e8049796b1675defbdb7b7de651fa4fef41d2b4f634e4b9e766231a97195f16eb5ac32df912cc124708a2c2fbd4f11ccff86481ede598cb2fc07f35e73cf3d48d79d1b45a9d3fd8ea29431a95df4e59dd3f73ccffb10ef44bcd350f6c2d24596e0e96ba991ef56c1eecf82b6de862238caee4f90b1fb20d993f7eef6bc13a934ad7bb24a2d6b19efed71eeed9803043ee7348adf3d38e2e4d731a7358adf289ad0dd3e48778baf634f3f8d3a32d459585fa99ebacf9f97bd5fef29ef2aef2bef2cef2cde51def56a46187d796719ca529e86a209f6dd85d4e39fb48c5d20ee33cd529410dc9c09385d7232a7b1a6ca7035303a73fa0f4ac3bd269b7e2699cac84c3b45a34ff1d06726fadc44cfa28568960952df8e8ac678f104139327963a1a746564d60c591d1979f63de5d0166520698306307051446cbea6d254e00b2a5260f1c41741f4109bff2a8c2c43203285f9864b06960d59ce4026840f3cd03a70882e2d2cab142afcba6fa388b3e5dc6fdf89edc444788110333e07cc8babc552e513786e2726ff892023820ceec93b47008971258d2a8650810d7e20c101ed0a273be0f92236ffd232048d8de4791074fe40bb8ec831da03fd8a92470dd3ba26887c6d5365e675e81b9e9c43cb8434c9337934844818f94517d12c8091679269cfbbf4a44d9e2cf26cb6585a2cf2faf038f2b9549a207dac156b95ea010cea21a54aa9521e147b64851528de029a7852831cfc70c41a58c4a6f4a268ca1a6ebc7143120c62f359cf9e3a97804ff26cf69cc25348293e3aa2a2842a1d612a5485524a413d7f26284437ef3a325465564be4d91cd2dbe967153967953ace32187384799769a5ee79aa45d39e3488fed01aeda9b352aa4485e8cc6c82b195380ac40f7b06ce5aeb49a8bb4e30ec3d5041ce9b7e5aa1afc934270561c7d2107ce6d43187f20b9b5ec5fde034946cfad4d643a3d19220e1347ad8f479a325dd22363dcafed0683425970c7068d39f6c1ade159b3e64a2d16832cc33dcf8c6d8f460128d46cb81a74b8369d37fb5861bc3a6f7986834da0c4b6c128d46a3c1fa5c21363d3ea2d16839d41e52476cfa4b8768345a0d503c2b363d1744a3d174584215c6a6df921c612b6e6c7a4b0352d82346a7c3a6a73cc4288d76035410db058e33145c45234869c018a54fe44082384e1004de1e7b83e80ca561d119d9e42691c4a6975236f5d91417a580ca96b26717ca15ba43d768d35bae5e9e8b84ce542577fe541a4e287361034e9b13d2228350e8ccecf26c274f82e88cfdfcb93cdbbc45923e5876fde6e4b50605491fadcd7ddb1c154c485c94a9d8f46ac1c2b3bdc8b3db83f1f775071fc4f30eea489bcff33cf039debb7127067614a7fbb6a11ed75d07681b71bceef39fed3acef3aee3ddeae0089f1b009182d9e1f18eb7a7bb3ef7891d67b7899528393c2182420934987a7eae93db7397804397a684be3c248f2646ba492019d24b63d68ee7d66097c8eb33533d7850a46a89898f4224d98941e9e701e438ce5c2c5b12b9d0c63f94af08a38b28f9b3e20679c5840d390f718f32b82551163d7033c82c5b12654183111657b00bb9b52511166334810516477066b960353dee9d468c28d58b5310430a6cd834dcb2e8e7ca1ab39b359b0bd379ebc6d96db35cbd146f5ee7a56a704d3ceba5b5d6ea72cde6de6a9dd55a6baddc9c63ce287a3b2c71f71d017b094002bb4e29632f531fd8b584d4aeff2a4e6df6727adb947c6d23d8e69cf7ce592586c9c7351d8123c821d80892070eb943a5aec61bd70fa4b2ea62407fc5cd89017d164bab6e596b08860ff8402ab7805ff880116cd6054ae9636604390049838f47968fcd62ede0d281df11940ff672bde3e6eb392de5cc5556bcad9545b2bd1ff28ddbb5d60ff966eb965816c9d287b53916167346cc276fd20523bf6c59f40386959caa228b9c9bc0486416900d3f3c5c2a7e923465d696453cb4d1455e6d59c4c312a7444e6d59c4831636c879cb221e8a9ac6a062288b9e299c5002c552113d510ce590430c869094008a1e1c3099c273c50e464be03085d009a4381a628a241f134c112aca8147490c7aae2091e2a74a4f0c96b03841144d454ba4d460b4446f4944e507570f2923648495cb470140c11a288062d36f2cd60f2fa4409cab3089818be50a13a05deb297e21cfc09817ab8bd79ec5ec8004174a7c9c308161d7170b4dd008a2081d86a8c1a7021d196309297c88086241ac521f9c04859d1a7916433363530735360559dd139f95f4e5babfb71945ebb8bd26b78db5d6eb90d2b6e093d287cb654b1946a0de5a2e7c40bdfdddd9261da262c49ec1a2c8a72d8b966c4ddc50067780793863005b1235c950bb8dbbf60a28b4f041a929a8c88a54530b4b4208eda00917b8ad0887269b82ac19f8c1964537bc5174c319db05efebbda52ff08eb31f7b565383b71ae459ced5ca5b96abca1fbb6a20dc3637ae0a7d98ceb8b85a5a9b6561ad54a98c3a85e0e775f8729bad74bab85e4ee1922da6fd5e5c5cbb6563ed0222b736cbc61ae3100849adb5d65a6badd59eb5d6b6406badb51d6ec0e56e8df8309d7991cfdf8b6bb760967df526656c0882b0045c356baf543b95f7077ea7d3fe4e60d5e1fe5060d5e0fef29702abf6f6b7022fde1f0bacfaee8f05ac9adb5fcbd702bac0aaebfe5c3e9896968bf8721ac1a69f2f6b7336b59b6eb47a3133942d31124e94e0a6cb0df69ffd2448b97ff55e1f0f54f09d2df50adbdec61f3acc11748cec9d7389af4aa19d770e74f7f40cb330db313757cf592b77f09c4a342c61c77cd5d14a1e49e419cc031e327da51486b185edd9b7e5eb68e94bbf1ab0b3af7cb247fee1f3595083c7f943f2d596c8b3bcb7cfbedade6e5331ced96bea019e3be7439536883728254d06c1677da2493f74f8e143654bc2b38dcadefe690668065012f006471b6a6328cde9db5994466eef51f323efd8db69e3c0f77b7ff8dc300cc350cf44a0f4abefcd9dfd692ab4bdf1870e587f3ddc0e07f7ce9eb3cab6fb8a190299a100b2268f9eb426f28c2525e9e8fb3e2ae3bd7ae3ac664695b2f759bde3ede5ed79274d95bcd3a46ac63cc0dc5eadc2000854e99d5e51af3fa5c987a1b49432a7312b25d99503ddb7ad56d9b8839f9e7d7f1ea867df3dfe7676a7759c6c3c5633e608e34ee6aa78923929629c80419012b78ccc45e19660016784934b94f18f1a26587273c8dd9645264812440cd887cc6d59648217b824aedc2a32b6e244be36e06ec8aa195ca9e28e014595ec6d596403133488724d90f19645360c715dc877cb221b9c9060c38fc4b969cf5c67803fd0d0c5b0e4d30109f660788624b7a72b6a813603c72384cb38c17604e9621895120c4561c30c41514c1093410537c46240a229a18187a786a6a77650454e6d4954450bb2a8a287a18cda92a80a25770519dc92a80a1e8c82bcda92e828071c164764e023326b4ba22319705c476b7e45cbb6b417bea21f9cec153ed64a55533453143d85e0e775d48569bdb9d671462fe9eba6cac8a3917274b3b456179d9452cac25aa9522c271174f0ada0f3b49baccad0534a7bd097e4215fa91c8ad59165ef8d529c64b58217ae52ca6d72b58e19f5aa3272abf5d6d62d65035dade06543adb5dea38b2fbe98db6c137cb9cd26a9c2a482f5e28f7234e3cb6d36c9c575d68bf10dc310087e584ff5e2cfe336fb794df0e5365b936c1caa5efc799be53eaf89dd368bb924f86ef6d624285408041f5573bdf8f3b8cd7e5e137cb9cdde9a24d79a849495ab0fedc96ed5ebf0e5bcce87bae1cb7db68613aaeb76e036bb596eeb241add287ddc08dce3a3c2077c60d7e7cd813ae61ec9a526b749e01eff0b81e05aef06a6522955b5a9a9a9f1522110ee29bcb25bf5bacb61aff381bb97f3700d75bb5cb75a5996ddaad7e1cb799d0f75c397eb6c0d2caf3ba25b605a2dd8759d17a2d0a8a4acf8543d0b952a110000000400c315003020100c07440291481ae8b15ed40314000d739a406e5c2e1788b324c841186390418618030821841862c888110d0b7598361a3f7acc2112a0f201d07f7b02e015a788463fdca936722bf0bb675d90d20e28e3fe030fe56389a218dff41effead151aeb15d36e8d464f18e16b53387d8f5437d8ccbf70f24a39c66d2296370bd53665723734d4ba98be96db9b246a4895fb6405a3aaf0f8b9e4e1843564fd35651388e2b360dc71b587242cb713c41048b11db08a5bbb5e9575f608ac9bcf01cf803bba5260ff965d1e63cab2a07fd65350d009adc987394028984d3a84262d3e69aab9881f2b5dde49aa79619b486ed678ec281da661f9610b21710a9de2b2d1a314ca8840c6102ac91777c203f0dcc8dcd2d21a82b5aef36025f15c2369fcabc51cbf72314252feaaa066d70209ec2e18e9cc7d5b18d60818288a4f1329b1c9e2d76b2ae155d45d3dfe3998e54ddddca0e6e3e4ab749d72fe47a15fde9cff17173d49357e08ac8588325c885358435f4077c3de858a1f7923aeb556c3956e1aed61a3023e2c94071729c0cb0047d19b08225314030a41cbe210d0c31b0a6cf7229abd0cfd536ccaeea05f60035985e504a130d7762aeef575f862042408cd6cb693dd457183d0760657998760484bcaff7e18008227b3d33dcc74b9a352e28e39d43e18a142bf037048902800a6b8fd2ae82b57be2ff8917c042d1e70fcc1516c6b9ad31a8130443ee178a53323253f2640398a93cde792b0a797103af8f57a3a121aa383262d5b9861f9895eb88fc0c8f306fe0b733f70dd4c123455cf2d59e7b876084be469474f7da500c0b36dbfdf991f0d8a2eb2d2cc30649d0b01ef8d7a081808bd37cfab59d6c6eadc29628689cc5d7723ba9b9f81a51f32c2d74f1944c53f5cbe3002c003731848d71f09b3196a85e9a586210a272c9ef8529ef4a855b4c59e8b53ee43868c5da2386d0c305b56e5c362730a06c0f44e02085ae41828da77faa406a0e19f19b671d5dc757a3c9150d7a59de1360ce3b132e72b1a4d6d6b56ed99af387e7e125b28a9210be6845578a921024efc982bafab784e357124def3f427cb88c0de8f8c77aa80f937574aa9038f025199d6a40d8b260e506c8f48f2b8c68a8baa852c534b5e91c88ee0c2a0cde2107c169850e99fa1226a232b7cc183bc49c9d990f56a1b37d1ceb3d31d7ea127baf16e96a22fd7e11c9008287021b2a298816ce83974dbc2912d006348434a19c049eed6fc29ba1eedfd488b40ea21178a27b619e116dd011a9b6e388e1deab61d45d51679cfef2243b64a7962145620d0eb99db7f97434ecbc62da2255d4a13d9e628d34244c82ff62611a88f19475903746cefc783e09f327b649c276400e168ed92d8c2765d17495742256b2e5932825c037c59fec9489369407e5f2fd17f4c304d2257030c976848e7497ac5a134aed415efa9524278f83e0fa022f84a6111a2bb7e4c1bd4886b83fc45ca45624ad91b92a0dfb93c06839b091e943599d2cbb05a40aedd3ac35213e04c404f2de83adc45c2c97af1cba49b710921993a0679d6ed09a215cf27151c95a90ec7938b644e14dd138410accdcd61e32b731cb70b4936a19520c60da70cc2072064d30cc76da9f745b5ba3308393c39de99aefc45411005430c45824ae6c541dec4d375137312bcc25a813d5bc8641430a005a4c8a8440585327f1e96c6fd39b0b4f7438147700a80a6033a0a98bc6a95a3e310886dfc97bd3443e811da6ee02e6435f6edbea0e7bd773d624298c116141084a3b876a12616f55e5509edc46e51d5e2194c985d77d1a6ded4c9504cf4107a1caf4ed1e7e5a0785b133ccf0a82357a00a1f125d1fa74aaaad06cf42835b3a53256a450b6ab79ff802bca3c4c495ff44e4c41f423b950a532539573a680b47ad49ad97e1a5d056a94e5af0dca8121dabc5235cccba4aa268090c409ba22a5299d295bd03d51731170ed9abda3a343b73f03bb7d4e20796841c7d85adebbab5f697f1c2b14c9624221a92a5c24a321e4d45563d17d3812aa92a89d5e9314125a944e65240e083f44c0d189108dd4e1288d14e1394622c8dc24962c284e9f21ebb13b22c2b6d8993a452d54949d285ee58482841374368d41f5a637d7920e2cf486b00d4a83c3ca9a1ce0acb7140a1a1fa3c92714fe44a006958fc9eae517d7912d14fa4417d7a4ac3e2f720c73e99c6e5f7a4d510aefa5405c480dc68e83f79d9031bbd28c912d45618d82c32fe2308d40dc80861010c3ef5f8e10c5b7c0529525057b809d7afe70995d89d7fb824999734c0041d6584e46d3e4120f7b6e3d2529781f2c506d7ecf999b5cd7fbd2974c414cba0a02811bc3ca0593e9993beca40f9f240c54afa882cd44c4c51c0cdbbd2f295fe4141ef6c848168064f7d304bf6a8cb5ef10c46bd512e9be644506eb84f2134479a109cd42e9e77a1ae3dd714e17c87ff2611f415fb1ab752c2eccad5254272764f8489ad95c41188678d0b248960e2992738df4a43229b28c812b5cfb5805bdecb54cc1718f3e82cc5ab0f780fa679ff61c14a0cf168f07b4cc47d8307fdd45b219f68372db0bddd7dbdf0966c8020c32699c9f6135c7b199942679f7521236725e11da4ed7b87ae769f409ec960f1057033e2ebed602f1e918abd445ca3bc4bb6a06fe610730398f22ccd1cbac4ec8e9a8a5fcc3e69f0de331b4ee9e798ef4a23ff19c06eab3b90190e80c1f5173987f1ef27f1fd7d0e1e6f32cdecf7f777b5aefe0d87cbec3d1e8ba34129adeb2878f2695ddb7893c0209ce207c48dbd3859f81e23919e351e99e99f897a27398f5991216251eb2bdc1097d0bda5bbe45db96fe9c04457e29acaeaacd893588d4b6b3fb6750658ca987bd8d100f6a9de7393497c52c0da050aa6564c780d7ab2d62b96c65ae2f134a8c35f63113dfc1c265bd14ee831f9c6ff5ecfb1e08ad272f1881a7a904900d5b96e70608e6b0162dc36e4d596113f818608b3671d5822aefda398ef4678a00f29b2d1a788d572d9c444ac5dea55b7690bc923f3e3ae0b810d9150f4b2f117d2c582e2ed261072d141f45676814b62001dc4583a9b3856c2ada84e021006f6f9e0eb4374916acb0296617b3bc0be9e25c9af4719d040ed5307941260d21ce2d7006a98e0c5ff295762564c991280d3f29a787386e03242330c7d22765dc9cd534cf62062d0470ae852ce75536ef2018bb313fe0c5c22e966d2cdd0633eeda0c5fa9c41258a038da50518944ce40949219fe46d3e46a3f5fe41d0b33faede50297bf83feab02daa54e311c0e17ab57901cb40030c233e218fb0663e40d97c3c489fd2f214d48de34a1eb4035a0e1584f4f9614299671b8ea505cb541be09a8e8cd1fe9700607c68db505f336426715a6ba5df9f7741e7658e55e4dc7acf0bb58ee4876e01edc850bd7a1bf3be7175d413f3d0c18ac9c9d8fcff6585463217e987070c0339d3059910d1d4b5416e985b5171763ecc8a80bc73f243d13e6e429f2192340be5364e0a38a763099ec36dba9f0520d0798575e1c373dcf2b597b7983e773b6db4f5b3fdda1d2b63f17ac8ccbcddbef8bc1784d43405fd4b417b1ea6a88c415bd05b41549c5944330d6fdc4529223e55812394b123e28d1439e46876b896f62a42a7c21afb19ecfae90feead40c07efc6e4530f6ef609a2ca5945f7c570b74ead8eb32da895296ecb5b36a123a4ef7728586b2942cf335cf6a88e8c8fcc51a9a8452f4f9d5bb8a4412756f998b695104e74351323f259420caaf8ee596b0e52fbc5510d075fc1a8440c7e2afd7d02495e2cc2fbd5594e893b59445b413a55c331fa662d18225dd49ee55e78642b86bc35f4a57064c1d36047f1e45553a97a9892eb95b3a0b15d3242a016516b8a920743c9b0be099dc9d7837d631967e4e51629a464f7bd30a5ab842eea5c95c5f7c80ac311d50b5b33161bee201dd4878f6c20bd07a09c5af730b4d0d85fd6fdf2287302c3c1f3002d20eb01d445b3887b15503a3cb9ad5ec258cc44b61ed4d5040192c88469df98de1f42c847812c91efdecb3319ce4d086e1d531069e4e3d44b6d9691edd0537255c20776ef759594b7b35a235c18ab1b7ddfdc246a60c4dd71c7693cf981cd9aa74053130a31972867043f447fdb6a8da3d0c57c8c20f2a756a9527b408e4d5b61a76f230c73e4312d1411fb9c0333590d9edb44aefd75015b7d2cb38503f6a97d224655667fa8eae34d78cabcdd3b34ad901d1ba7ed65a1a8aa017dca2ec698a188deaca9e5518fc8a1324a5acb4530f44c42c386c11b632030a5a928d1e07b8bf7089a6fc42e889e12bde61170d3c79b49f2fa5b344174c86c4bba66c42ea4523b6569a56702c22080001d933604953f57872cc3ea657dde0528148c17cc64a10f7d4a3283f41216d9d0d1080d1d50f3fc147c576d169d0642f4efa402c8d9f8b341aed0b52449b0144d3a914b7674d7a26285ed0f27d326fa31b63da3a2183e943d418a2d9e9599231e68426f80fa56530319c3bc6b58748036070962dbfdea485a561a2076d69aea95e738c39539c284ed79caeb9b2d2d80d9f8623abceea17736742dd5d0daa770ae48cc4843874f2b0d160a8428adf6123be38e8660e0f9be3609491013ea694db434f1009561044983b6d3ba48361bd9c25d9114ec2f368df75869f03450deb841c7dee4fbc43fcea82bbbae79708b1ac348109e6a2c788c77d3c7287de09ffb5e47a786eb432dc4678b9e17f8e0d515fd485d9f9d16297c2b3688192ca6952673bb0d1a9ec92d619e38a0acb16c4219c684d3618a361047f472a0641ca5753f10941eac91d11bb42624e227705e7b126800cde37e055797e9c1dd67a1050d642e5a157455a560782fc1e6b088d8f24b2bdd35bf61e7ef68afa5c09b4202a4755168df42095a5a138a812dda047a5541af5a09469a33c1665011bc9a0c99bab3bc39d330c7d1a31adbdf1d2b24361bf064ef123699c73ce90f5d9287d0b3ab00be56880957823c040e67ad802ed6f8314b2527f1c95510b1bf611a4f3a7c9c63b30eee714b6175b15cc29f7dd3001ced80c0d6d780c809428a0d5ca10749bb91d2c6003367b5e8c92f49876c518702833d1027d80fa80ff5483ea4473f9e4f5c04d8c79fe3c6102c8ee080bbb3fc81b3a12047d368d484c30a19329e91f2f4d7cd773088e0b5ac5bb8af0a223f66365de12efab009b78c64fe516549e467f5de6c3d8abd8d9d0c2092c3f4dd3859bcb9e3752018be953d46b220f059f5722555b57b2d79b465ea3f99679d20f2a098b44cdf4cf6df9bc6bd38472e92d77d1f85ceaa1bd792910c89bddc5fc786f2fa2c4fec756ed9452b52c2487dc53e7c88be36fd5bab909350e093ea0638a0ad50acaa789385f43a7b4d02a2af8fc6d615fde9806780dc29629f1db1476734e697fb8dc171babfe16bcc9c37e15e002f7061b7a4061383659ac6a6e3097a93c840b08fc70a450bd351405b1a59dffbabeb8c479cbf24cf0f3c770de1aa0461e397e04034757f483b6b2f94773612370bfc8d188a220cf8383efe6786653af082f8953f1b88cd0d4c15231b121ed4d312994c32ba7323a045b0e3a4495bc754c8d0eb6a23da1a2d9712f2261e787caf0e0f81284d098f486833c67b887d154932a6b6057e74d90532a1d0cf717c5b0fd673e1afc2b181c39d7cd0dcb77571b4337f0e7f669392cb1f5da4f38568516edef9cd393a2bc4f6a967526df81de50db391f1340b7b8125d4ea150bb0cc20a9476ee3a0215fc2e8fe4d5cbb246ca7cd31d6fc1068f8f945e4d5823842c99756a9ebb24bb5024e69ceddebbcdf51885dbf6fbf1e077d4b9da174ec0c511bf1b8b3116e0e1b31a63d10dda48000bbefe82455f3d6ca1c19a8fd39cd78e0e5e8630c30e7c66f416097c760a3c9ea309e255365ce8d3f1054975c00e39bfae0144403c0edec1acd1c3daa92876c77ed1d516b3d1d146ffe2f61a130c3d1e551b900ed1efb5dd468f02e0c66e1fe8aa47735617346cd7567c344fbf17d77e1166176fb19fb326a239539f049e748fa76349d21d3b54d71e376379b37c1b7e6a9d66dfea2e542c9d3a4b060fcb4bdb4f00e4e91f4f5f60e864eca4a9c1b366338240ace7c6b697a852faa4c5e3fe30fe2114ca22e9792e121ddf4a34f07e0e7e4a5f308e8c028421b8bd5223751e33feab22bc93255847076fef085fdcaa124793686bf633d0d7be11373710818679921610cd52aed9b8815700a324fe8d0a04061240d065a35bac2b2154b35138fd822b81617b5280d14144a67b7d72554ace49da38246e39b40769e556ccec20b97d0d4ff30e23b926c9d7e1af59cfc2926da1f2af4782423b99c92149081dfccb33a51617dba75e357957df030597bcfb2486adb849669d9c1d5c9696f964068127e74478d7c29d7da1b757848ea395516ac665e04ecf15424a476994dc52c544cd1d84265127f32fad5d41c9db91f04ea49d90d2618772f0cafe583838461457c626f3da1a31b35b1d49ee2140db83bb0424f583faec9ce3e36d6891b2d03f39b8aa47971ce7af0d1c2a928eb3b369d18aca13f936292d28095a6cee5a8a3cc4d5af6f69f85bedea69208faf31497d3b8fbe87214f3170caeb816629f9b8081d5aa36be606db4edb2e6d324e9bd7fc8ad7031612d64c60e1fb375ecd5d251ee9c238f89bd649493fecc52ec3e11b14bdf248c968e5cd8f9fc2db4596e7b78e6f227e88db1fe71d576b10758d28c95dec140c8431a5466917f83c0b8e33940e06cf253577ee5eb11dcca6abeddc1658fbc072be2ecbf7f5ef8eae28fe80f678bd627e820c88ee05dc55a95e203fad7309d8d1f4dff592f9afcfee2290db4a4435bdfaaf5ea0cbe2af57681195ee4c299dd513d1ccf8184a74f4132e480e1515c3b91c4e3f74a17aa0124474d4c9818a849867b64c7a9d0b92cd0bb9029b27ebd786987a3f7269d6561e3dbd09df3a0350e6fac0d2b5101d2eef8bbc7a388ef5e49f883b58b154e923157f998dd03b419cda1b2737e67b12cb7f7021cfcc6d0f6e1edadba8df64077aa56efcbbfda39b76f8e6c9dfc291e9d0926328d96ec46afcc4c8894c7fb7ff37feddfedffca55bd8c0e4aac42e98312ffb75653a0e2234e84fa238108d6bd72880cc502de9b33de42de11f1d20dabc1de0bea11fab7109001cef1c5f7c54dc59429c0023a1bbf267f470e0c948fdeeeec97b1f9f7205e6bfdcc4defa0f5c5a63fdc58113d0114a654be4def7c9e94243884afbafb3601ca19f85b67d232e9c3cec4d31b618f609103ba24005c5efd015bbcc70aafff47fc6b5708c47253fe42cfa17519818f02bc77d38055bb4944b4cc8d2d0cc012895f416dbec8d4edcfb0b2387a421a9167c3e60d106addc849bec6a3cecfb00f2236ffde4528830e7b3b48f9952cccec61983777be5e9fb610bf3c7f5af6fbeb9427f6fd0703fadbc2eacfd3c8043578cb77312c13757c22dfcef0ff1c606509cc456ac4b85a4a86f269227e8cac783797f4ac475931c3ae5b67724fc76fa551d085e34df442606ba45e2fcf0f5bfeac2bb3134f6474d2855a319b022a43863a38b2d3bf89a944d2dd127cf8fe88198c9260d335fb0a6d1290c1d1442c6369480feea518632d4577b4fc5f8974900847cabd13c5f1ba813ecc9b53342b5bbc6316f672c630ac7b902409cc69f91d97c12160065653280c450e432e45cce56feaa90dd76355cb414f977eeb6891c9415fa63b569b490fdbf7bd264fbf1c78730bc6ff2dcfccea54e991ee85086832e104a86ab6d58f26b9eb2a7bc387985104c30e3016aa3f9f074d40a4c02ad12495a845845236517745319c535afc2b29d6c5d134c2513d62a67c63e8de1deaa14888b07680c94906e0afae7b4b8ce18c455b17d97066faf893a1634d067397035d2a6f34250f80054c9595066e9cc54ce5393c3be4a735c6d13c4feda1ed048889c7c0053217ea788e08181f97d945044123678a6b80558331dd402e9861df4481b634c697334d036ecdf9fd358c78f0f70d46ad8b70128ff7a395212d6c7555b61e4a24d4fbb8468314ee7819db924a2ce7980837b4a88708116331bd304ccd9839a28606084eb02fcb2646ce5f5b4838ff5c2f4f338256395ab0c20e2dfd5f435020ab7d5d6530cbc08d56a5b2f45ab6af164eda10732fc4a52aa8eff5d8362484e58f8ff5898f02452c787df6063bba47c21347ae4881b39b1ef360b8ed5058c0094e31ea8b63f373e2cd041ac782697920d68f35efba842778e59e81f32e8303a7630ef4255ea85822390e90b65eef87a7badc4a226873e6b835b105e5835e10ccf5a2effb9e68b01ee94c043e7449efbab10f8ffb91c4d8b34c7e556a9d8d5b5000b2a6549e691e13778e9d44a65d90b235b0bf5dcc1267faabc27583b67985b8a2d2fc1ac43125ecf0566387e8325d9c3b0aace37d0a586dd8bb35d4523bfd8f53ab001967dc6c699a2820576ce617b594246617bb1d578dd39e92ec07ff2445d3bf54f653c22015dc104aa03b6fd6983606218d7e2b718bee04fdd0e13261ac88d9ce7b13701dbe437474efc861091bcd777e7e032b3560a02a45d4a6ca72017bae579bfd2e902e1c25e859080fa0deca522fdd95b028a7a9ebc9ceb3a07c84dfb8e7a93519e33f10f30266bd5473c11910bea6a8d98b9217b1cc470d91ad9abf438513b50c33066da525317129220ba20f084195ec5190225acb67fe5389faf5634b47115a13301904389d1eaba38683ee12a4753ff7c05381e7ec3a0d4f3504cbba9d02c4fab03948d5913a4103e42b098a978fd2b5dce3bbbd53be548d6f821de1229dfb0f9db8ede04d6f8820af94a563c0809481131d62444fa7b08c631229d8e1a76975f256550fa5ac99fead710cbacc431b1c419d7c0d5216f9ae3b7076bccd1a9582d36b7a52aa579a1118e9370287f2902fbdbe81066afb313860d760269ab1ae5e56ed470d089f7120f93a03c6af068e30ff597a69148a171cdc471e3d77b6ebcb595be2bf09a013585fafe3cc74fe70b391bf77f0e2c2c737c84f5f309a57a31348bb5a32ee3173cd85f5bdf2a3bf3345cf286e9e96cc146de9892c47c05deebb454ad00997d494b1b9e5a0af424abec81cbc3abd6b8fc54e6961bbf5d935f4cd63346e286d6cc946b4230b1cb309a40466dd0c4c0ca48900eb3a4f8bc9bc362ff6cdd1bcd4ce3370aff32ff58f2e5d559080d2282b1759a792034335f55db32bf668b481999ce5e2d74b41c67f0a9c181fbf76b258ff600df92cc139f221e5d00db6c95da6babb58267fad2d3edce264f99447b5ebb590498a966c80a351ebf818a9f723f4e37939839b6aae14e05999fe6cf2414c62ce8ac2dc66706e674fd3c639528159ff9a2e99092f448f4d021919aa281149b94d297d20757fadacc5c1693f8c797c02a29aa0256f55c697d7d585dc480aa604526350cd1974564d21500d0d66945e41e1e06969f89e68c8eecaa67a269f922674a4a2685ab2ad5b7b0614536288d565dd15ba86726a0165a80182580916f1d848ace846d4c9428d72777b479a845db3e7412ca5f7b1cce3e04af9208e34526a2eef422166fac631391defd553a83686736a8ee02e30c8ab83a8635f6a158f9e067a07d6a9620fe6a3085de3d4998ea123498d59045bff4869571e0ba36c77c56ccbd7b1d5c7c55848ccd308f0367f24e26f80d64dc5840eabefb262d066654f82193252641df7291f70192f72eff8d9a6518b89879ef23caa446eb864d3b64023a6e7cf87000bef5d3f568efe7e1fdf02bd2f9cdf97afbd75976a8418196597b61e4aacac3b440fc45568e07c756aaa2465b877dc1bac4a8a229e1917380b1b4796a99095598a9e5de535ad4dfd3034f2742244a101fb4b5db756257b04cbaed5bc65c342c00490a0c03388bb7aa02551325b8080a8332e17703d4c60c35d5779a09362ae763118e741fdb95c5fbd46ac1c76631808d091fe6da7e01aafbc92fabe16fe041c905e3f58d2b49f9f170028e1889826637184f21a0468d6e4b5c835ea783f0248085171c9f8d2ee6e95034719aa1975ca2570dba1d0bb432292f4897845d0c1bd8594ce7fd7a2c1cc15e02616070f2c98b824f28ff4c3d5075a452d9d5b68fe089c2f5e590c0162021268eb5aea9d3a4e40441448870984260a580a355fb3a0137ce2486c65b6bb28c42e1d5d000ea23a5087060769c7fc49c5f7c8d653228fe5107bfaf7a18edccefc776200a6c95e18931db26631c2635f0433c52002b7298a2c312af63f0d6cc76fb905a09c14f7a262030630a296f6a310154ca336145401acb004ff23f0126e379d04316b9c86594cf073c14af2d98b8d85b25e213432f3f2929b6643303fc37d582a00d59b0db51278a7a18e2bdb913f6fa2c6f61dd04c87d42538ead089155f08b12b75c418d344964658c73ac1f865a4972795cc85c400b9d5de106241afba43ede612bea32642ea6ad2cf3edc58a55829325504b2c63b99d783647eed4bf14ff42efe105b5053aa38cd1f91a98410663b2167de7f2c2c06585e4dde2c2938922ba0dab89b834bd775c49c4c4b387e1b7466a5763b9fd4c9984681e51fa0fad7f46f3771c1968dc58f31601348eb8345c3f91b5c899937b9ece016985e5fc36ba588e73114c653cb77059557aa8452ebe9105238f11a6452cff1001d1a53a2214313d0b3e61f22b26bb3c2cbb1ed66745b3c0a7f607a58408f9720d6c9de2419d422d4c6eb8bec628499f2fdd154d4c486869c852feea2cf12ca1e37a1f68054d6fb37ac54e4ee8a9eb8c350c01f8b81bf9331138a3ff99ef66f89d6f46626dca421fb1f549b301628b30efa792a3e408bbd4bb43cffd8bed90c45a1b58ae5430f1bc9f6454513fc272296c0527365b43a7af1fa18c181b7869735406ab8783cd254c5368db0d86f9bf3f6405c21b7fa4ddb7d9064e6eb0d80aa4a1479518fa9845b2f322180c98b1e47e8084b44ab9944f3428cbd88edf15d5429e2c43f100e2f3ce2a3fca779e0a3bc61168e6e80254ad294c51d4ba90c1b555378f7475a254c2d5ffc95b9c8c373a37ea10dec7faa513b278cd3932f921ba6f197999be0f11ab0f71a40f852890ec5245424df506c080f0bb3874b9212d465b2e9458e98152889bf662bfc83a6c9fffc3efb38fc414232f207e71102da994407fbb4f388c32652125d4a4880e8e2b40d553745cea1b9d8e6857a0d8ee03451de762a9a364a945e2877f3787f40edaf0926352a42ab9c23a8b2aa05140599a7b4399be1a96ac41267f659fecf24cbe41069683353cb4d4cb133bee9f2ce6985c4c44de8ba5d75779b3b6a519dc8c2f4df6da68dd6754a2e776c5c6bcc93741206a542c191e1c5def61f24751c27623cf3fbb700e64b86a00cf9080476e39c22432014839b5261c9d13931244ff39a7975fe17b429fde14a38e10fa937a70ecb4fedeba694204e48bce1c733dac0b7f687d8e002f10e45cc1ebf865484fc9b6eb269c33e8740cd96b57e2fcf6de630e68df511743264c8c9aa8044ffde9a541e0d2e2888182cd4d0c7f68c37bf0197e1ecaf23b97cc3ddfcdca07cdd50b3a6bb7118248d52d883e59f97d87f00b5c472fd078be282bea5604e97c7bfd5ee400ad1f5e0cfd5625759ae5f1aa832a78b4509b4aa60cdc04f0831ab5bd7a88f164a5fb6596af8e3a6bf1fb4bca89038d911baac681b480fc18e9958abddf0c4434d056cdba1b3b95629002e37498df48c1c266db8a4462f3fb435c5d0b3cc4a6c7330175eae8920740cfac7fedabbbc7518becedd64ea5e0f70f44220a2f2d3c306bf290b91623218d1ac8a0129ba207b08409b778ef6f22f7ff4ac25dbd6300d6365a1cf5cd48b6b93f44ef8ef43a0d7e5660b611cb681b77401c551435c61cdaa3c6e41ef715a41ada8382e07a2099cdd700a5c186291be1cad868d6d99c48d61b1a31e0185a00826a16f6bc0ce5411e144c8f181b91cb66b73ef864d299e58e8dc4f8e58088c4754fe9e61103d3a1eda23514978c9a15277e67c9c3e9289b5e8b9c2816d3c72c119f03a53d4f6475af8f773446533418240854eb81e344dc712560c21dac0943b84a6250aba0f705c2a969a05089ed08e312ea844a68707ae892f3ff7c576b348052bfd936059900714186ef99ed75f4d46f5e3b55ede0caa781594880366f8435cb109562cac407bb359109276ddbd5206df8d8704bcfb4109be27616616a66f019b12d80f8d22840424d6ce3c4ff680246c3715a3e19d2ecdfd17b71ab5fe3f95fa834f72af652c753d7cb70fef693044e411021b8a80ebbfad45c2c416f62117735ccc0b3da28e6b5b64204fe37ca517f2ff52bd5d0b4033c5f68bc3871f620f16b20116580ee071937164a441583f5674e1216080df00652455880390a2570ce25b3609c01cae7a65f22e22598247cfbf29156daf9fa2126bd4897026ed1ca37a97aeb4b9d865684ee6485b5afd21063011830ed7f529b1e969d9d847bd21e7e82c3bed8342b40a00e92d203f3b838281535c8251c0aeb24f76f9500ad7db1b3cc4cb440bb9099046825b31c5994fc202b6b20eb1b7886a7135d4e07d17dad839e1f60fc14071d1e02e32b055a052a18fbc2e78a143affb5de4e499a0986affd4b161c356e5fb3c27a6b96d2f81d003cec093418106a8a8b36a12e6241c1f9ba3f16301cc62ca744883e5303a4bea133380ffc48fd20b95d7bdf77f66b72f8ddb264dd508a571f85f7a9c8d2c144bc786632508eaba31ab723aabe0017250331f8a4899e1cedaa9166aa36175d2045a9d4a8fdd657b6ef1c7983691b652e907c6825d17c3a8a1c2de0396eae2346a4775454b95c0c99c3c15ec7661935cfac4b9390895931d2446290b2df48c5809fa756d25cf91bb34b1d6162f9a689c7fb5f4a0977720899cb20c35d0be9347727997b19e3d5da24ad7a398c191a628037fefe71ec02b969a4a51f6b74fe39fae5f6a4c076475d6f17399f0abe3d4a34e8cbe291a3dde3a2deb47c1df59fbc1bab5674df6b0e4b56639bac74e55dc240edf88433a559706f30c6ddc93025f2a0a8b92b0a3e81dd2936b730c71ab7f2c2a7dda0df840e4ceed0d8fc5c2412a2778cf2ab5be76bc90d7b790b4fb222c5ccf1d964bd1f407d8daca2af1ffde9bc33c2534eb740332e43f5d421027d85751d3ebe06af4761f0b2d2e767fc980bb20cbf8006531ecca165b837160585eff37de2bf47459b6a380a67f538a6510d4460f171fdf2eff1320d15c6dd9469984f6740dc64548b32cbfbf4215200edd17d0f8e1aec702826cb0255fb7703d9cfab693bfc0da7b666830967c25bd0de108bad306b07c5b6137313206eb345a2416a104e01c6a0e00fa679a8a5c2610cd2ea846aadbdab0bfb4a69b37cc5aba3f78cbe1d20b90cf08c3e4b4839c65b36e905ef7eac0b9f3d73985ea0dadb8de7b042e2e79f6e1acd6755b58a5c9e47647431cbce78046fc624be6fff4d73d1f604465b5794f132480354db84688bff18f8cc486a4f6642d2afb2f471227b722f9adb18d12cbc23b39752b18bf7c15eb5057e76a68a82e80724d0b0dd2adcebc8b3024aae0e573e0a00eaa86acbd7be5d3eff26873ab68dc5cc9495b0141390936dd05105af3e0179d038b3134da08f6ac2ea68c54281cdb70f3ac9b766011520c304e43cbe83aa0655adedc23729bb9422464e02a5794e2912d345800f67232fc8ba8fbad4fb1942352c3525b757da4a1a973715e400c056ccc3609af55d92be1d831e612cef0299f4beccfaa92623a4250b347c973df1d0647c3128ff59bd90c50e5f3ae003f245cf913eac5d5615981d757dfa9e0223f7702001221de75e3435e3a0928564c09ed21c6ebb0730d2f6bda3d605c5abe3f0febc7d9137b998a0db8656e5a522052e1ec74c25e6924f33803bfc460722de8892b047ec3abf90d62c01a241b25f2908220480781ca724becb6c3389c93ebc526c1d3c97666333c8461f62a12aff3852bc07e3fa07388c35e05387f1332bda5d8a65672a6e97bc83b5462f78ca6b5782a50459f0a2c0f71b199c1a95ceb28afa0d48b1cc172f427bb9557f680b16561e004599f0014f4665645126f9d7b707572937a9810bca1a29079d9958278dc4cfc3409bac9e461e20a4be299d327547a65395987d49e4c850b3f1a558122c0ae63bdbfef69841a5e7b19ba252d45977c81428a46781880fdba75bf0e4e32a4408a306c991dec622489f16aa7907cd63b7ded18e57816d0cf77b7e8bd053fe2cacf57a8e5194048a17345d1310258f527bfffe7ecfb1763f618d55d4e0d7cecc6ce5ddca6a4dd7ae39fd27435cb03b173f46e14982a487d288217e993995ec3fdba59d6e9fb3c66bcee1029e53d69ef52d85f1d1b8319c87fce8c6ad9ed0059986b081b9c0f32051acd9bb4154bb42f161afbf53e621dcc7d0d9524e8e35bbc921192650bba6182309558af8b739181a6cddbcd62374af8a7ed34c5ee80628877844187f2aea057a5f34f5420a3088030cb0ee20306347d0ceaac389a074b15f104792c1a8843b00a247a745d75ba3c377fe9341096b8032dfc1d08754dff803d4db24338626d99155b17b0248550b0bbab9ae7591ccbfbf46333b7db48b0aa0e4825e5cf10da95b373b41f13a65890968eadc7679c5a72ba2ec70e249404d44b277894915418b38911cfc93a9cf06d0ba2e43167dd7c42b28e1b6437b969169e35f58e3f7cec1f588c4d88db881804ff23bbc8ae87ae22568b90afc9c87f3e639959766f80f3e1b594f463e20ef1a016d1bd5d026d855ad63f00a3151fc2fb621d3c42b75dcd731b114260722e4552d05069e24536105526251972ee83f813333ecd4d125ebf636c3ef3bf2c237660d2a395f4df966e36db7d2dab305d885397f2855aa792a3943700d46f424e01d97bc5579a35f91a9834b5a54dc09adb606fcbf16ac499b70eded22bbf4c4635c9fbcae87d25d217e50a2ac9f9b2e39cd1632a52140abee06a8ca01a89734864237c9833d219c92a013cebc4abd0e2f45bc630252b1176ca27139327d9cb0ccc2a2118deafaffad900f598dee64a1e374d625facb22ae980201f31dff69dfa961eeef7eb2243ab4c4a8f5fe13bf2f594c5db8b323fab4f346389c40fd5d2f167354b6d83d996d5bb52aea1108e180bbc8a8b6a18a123b107bfa9b0cfbf5dcd76359a363f8267c740d44d0b8b580c76938394b3353aa57a5f261223ead42a8633aab552b8d83123712592a5a2c4b7ef29f7bf626f2cae5668474af38b948cb134f48cede85d9f6bc500df69e41403ad38648e28f58ffa9770987806f875ce101220cb90fbbcf54d962576e4587c25a225f5fc176d7596258b823c35218f81943333df97191084e66178e7afae6c44fc45dfc15ddc1cbb95c9c50b32b3e5edb9edbbbdd860816427a808b5cbdd4d9166c27ca46375d28ba7365a1eb2e9cfeb53d6fa8324572ef0200700353274488907b0dd0dd59f925429f69c9edd1f8d1a1d8eb16933f7241565563542c7531fa6015b8a134a69b4ddfc5c670d6317014cbd6a51903edc294a3bf8d9a8c2693c201e460235f332defbd2d116ee63f4e08d234546cb9d2575c5c801c36bc085cc9827db4e7795a1956d4a5a5c16579088a3d2384a72115c2f35294cc2bb98ab258a88656b9a9b75b2e8b409b31608d3e3776be993adaa0966e8d249af5edb60c9e6acf2dba9283669ec8772ef76a11c5ad9594b27c68c6708e06a13c66403eebdf71cba0bdbe12b04a17f200f89ae817a48a7b520074efa0298cdc8e55c79ba89b2e6cc1176fab4dad00b1e6e6bc1a9e681cb9d652e6b9ca8b8587b82e119f2f49fa9f96cf1f06aa9e51d6122265d6bfd49ea7deea9785b943aabf3281d3ba2460d926abfb22a334892061a3d0e0669c169746c751b967b8035a9e2111df0c53d5815b501e5291a5c35c339f77b5ed91dc5e052fd5b0f689026c9557606487d9b44a6ea97d901eab64ae39006851d05330f72450d8857f16f16d82eefde48227d0ede37fd0e7ea6edc1985e80a6bd11673579af81a7425be12901ea9e31933fd7ef055405f2379e5bde0c284e71219893d5a4284d3c2364572bd1314520132ac5408aced2b1f0b3da8f548c4c05d739d3e43758d04992a5aacbdcccbc15af86195be31b02b3eee685bc99f81a9bf417a330fe56643f510de3fcc8807ab996f96a1d0b42ed981d6f5cb61f3f74ec5394b529a31443c7702bcf7cc35bf0a11701d1d8a115e291430e6906057bc03d7b69d65f1f47741ab0ad9c8540f5a19f4c1b53cab9f480e810f0249f8dff2c2f8f27e10b9119653cdfd9eadd722e4727b915a384988e2330f7c93914e671f8088e9e26b701752208a9b4f2f98c0b5d4f547563350d71a3f7198c36dba7d14333b8f760442048c9f6531dac1a47e11ad6a7b068b80309a7e6b9575d97002193c7503350367708d064ef6b8b60fcda7eee360c0cb050a524a3e192a0e5b62e6bb5dd3a2e32b013d5807b02753e75cec7b691771732d91ca82643d7d024f510196e1889b152986d04632af2944245b88c218243aa9dda0c9ad94772c9ddc8c0d17bab97518d3876ffec81f4a35f01d138fe0749040c57574820ab14cbe29237398c20549cae8be14200dae87578c6c331b6f8c5711c79709289e09bcedd36511608548929610e7b6eafd3fce1c041c79adeded6bf160f024cac440e7e06617426ce369fdcbdd621c5d0656755ca5073756456ce24abe177c09ed631a68a1f60b062d912f6d6b9822fc16ef0d8f56d5dbb595470eb433a77bb7206da874c07c4c9cf331a4d0c78cbd31de1647669dc6fced4714eafa56d1e951dfc09c22453378d980ca274e8d8819e65ac0ce0dbf6e7d141335c2dc5531ff4b1a27af9119215e3e0acf8a2e7e59f182ec5e36d5124724f370e3d1855c28c2862f43846532beae6cba5233c9dc56bff6324931c29d815c6e6be712a47ea3d77d0f463f5dcb2b85c198271bbdb9914f8d7e66f3032f39aaba7c09ad79ab8161e2bc1349830098e33bd969465af1d14c89ba13c31559ce593fb48cc34e46381534f0c0e09d318aa323f49fb761c5a3d59ab8ce7d94640665fc7a0b3f9402483060277bc915b176ca86c9830c6aeb178b1b2bfc828d1a6b3284525cb97e0bd2929dac6516e2044f19b5c8d4550a7093d24ed64cb2aba36cb0d33c71944dc066009d20f5904d1384501e0457438f86250419e60305e602159fd9b28f28bb11d4b562beb8965e034d5d57dc01e00b554740889e29b79b51c29aca20704c92c49984bdf2c59cdcada50846f147d66745f8437ea7fecab767bea4d70f2cdb5f69ce6d8ef25986cc7f1d934329a7558dacb5a96ec0aec7820a4bdd30055036e5cb0c0debaf505cc9fc1b3337c8f27d2a2b18aa9f8409ce1bf220cefd7df15d86e2a26ce4ab6df389b8f404c329d3c5349aa6063760d191dcc03214470e2765ccaddb2e21820f6d814b00acf9bb215680655a0e6adce7c91768d9b4c02bedc8f8cc5f870e6b7ea92f598f8b7a5676fce6c9bf01c6fa7bd0754a6506bf6f37b403b5eba37314181154fa1fbb3599a679252345e68a14973d57ac16c19eb4ee614938f174164c9f702f2e25f9288d4b703f044b2f64043c6b5fa0e15a4492c11777cacb18fb1899567aaae2299302aa526077b988d7db2a4ea67fe3300185ba53532c051e38b89b8f12cd2831fb4945e143295ae4c14b6873d41abc4bac102c049ce0f16c8013c0771d435c5008a8d4375063504a2601e5771a73121279de6127bb38b34ddfc068d74bcd812c56a23657f1f01f4fedadbf4a6f1c74087dca6eee4cae78fbef6696b8c2685cb577af3da0d6ecec4d0a0a9dec0f8879e6937aa5228e55bba87612634c88a9ab367c212e32d15df9b301d02e5952d03b280fac03015e2261418c0536bcc7ee8a1337c5543a6991f4b0051575a7a1faf9963df6da840929bbb34e3e54f085a337b923417423a8c003b43a9965f0987ef2574425ffe444e7daa6636fdc5c36c5289de5f26008b4a22fad2ce691bfb41596b214822ecf1fe5fda07252c20ea6459edb9c218a42befaa9880f1422fced9b9efc3908ab0127089393fa969133bc60e6b64aea55a12215d88763ace481966e4b79606e191a384e2bf8fce0f8840e499ed44846fb21f5451df223a96fe2e9b6cfe450dbfdc6e3b3a8ef5b91a86fc6850d68b7a1be9d4be4dbb338840a2a993f58dd0b55d288d04fd0aebeeeaa802f07cf61ee0600eb376d2620994c78ed2c0e0cedcb632c0040340247b4bbbcf9b28cb9f4f8a97a5622d7c7d3ac36bd18c79cac567ad0d669941521a4fc570a279c61d388ac4ef2bb934dde57063dd8f21bf173d78b2dcba1de0753a87f04fee8d1a01799cbf82e4147f35979519ee1bb06903dfa93539be9377867acdf4fd15f44029f48d32e3166a449063d9ba386a7d01aa3ff362e48222836bfe0f17f293bd486a095f1efa5b119c82e55ab7bba2bde4a8b26bf6bcaa179c385d0ff8162f67891b32f0f2583906b3eb6112e022de2b3b1345c95bd83150ab3628ed376b11f82db060a375aa751f7c84f530e55626c8a388b2ebb2ce51555eb7943288605e41d2301e76e4c901ff860a38046163ace3d393ab2b3b17ad366af2ce48e8e5c6860a07d41c4972fa5374e321e14032211254a526c47bac2e6ab5abb95c306baf15342bd2267ac9cd82edaf5b197f641367ef37dbfd227496dea58a89247b7c5fc3ecbbf95429dd3f81bb3cc69cdad402a0b7845068d83ec2095a21859cb02f8b948dbaab7020de52cd4803445ced1a71b7fa307fb71b01f1b6250333b1e46e916baa4dce1e8ed90b48b241a1479e43f19376442096f7cf705dcf8f60c1dd8be5c37b759d098ee5c8a62c54bd646a2dbabf5b4611ca2ea61186bf18c44210bfc241ac874a7f23c721aa1c594fe61722f2d70b3c251b3946b10d9bb6ab8d8d72be71d759bf661215189e606ed1f223b364f0acdd29f113d701e5d34d3409197cfad0d8df0a6f41a33fd388366241aeb9056f755ec8f193d16f60dc6a76322fc2012f40d8416336e8cf40e10065a46a26710ca1ad2d07bb605f362b794b4fdee24087baf5d68d65315e42f0cad73c3ee79a61b2e2b5645de25e18725d68661a1f25c77647907eaa8abd93ab2094a12db706992ab6a08a29b4f223a373920c7c00cbf5ee2f28900a45d241ed58cb7632330812d59c81507b11541f6717c6b10fbba678ac2b1423546d40bfd1aa0ab8a69856702d39b2afa90453fee80294580f0bbd41e2c51eebf10f363cd099aa85cb3a8db35a6b2932415b1abeb69f7da46bc29285cb1eeb2fb8994ec2831d51cd592ca17e4520500eb628f502e1a9f844183419953a2f9d69f5f5d99337ff307c9da15ea53a1a947bb158ba040032752a3c56928a9a784c51a60b042d792a63651812c242a167d694019278c0bec54497f2aaf039b1cb6e3fe719839c4715a543a858190415251e9900d482190ba790f668e8e84e4ec6e6306d935a790719ec69010abd0efefe82ce9d4eaa8614703c3fade32e6035feaff195ae58a6b92b6be32cadbd8d24d037d63139a28799c97165d7ad0186a75a41440a15ec1db94136476a34e447555fec2297ac8f9a6bdeabd1dea2ef638dcda43c09661221d6f1ab92bcb3839fc2a388937ef2f69a9d49b8563d9cb348dd554a836b5fc530ee1dcad5eb72a96c47b35638e579442db98ac6d88d043934054f39378179ffb9cfccea456b7064d6a77e18191bbe565ffb06b9e1da87e5153431def9cb33021562975ba5081e2bd3724f8300c5fda69fc45c1716ab9d5f1b1247e77b6670be0d9f70e3ca793c714955e48100b7226cd34e3621bc86188a6ec4de80bf2945439bc2e8e32398a0455d34b0fa9aafd2824a6e5d3f40a28e025480e089452498a3b04dc480d2fe0573f3308759006007e0255fb31641516de0354168ee902b20c6036f22dfd07d61e3f0975f7fd31a8bbf7976940345c9751efd85d4a10e495460cc1af58f5f963ffd382836589f25ac3484bdea1a4b24edea43cb3ece2cca5a8566bd898b9fa90f5aa5e234fc0ae2a4b0947bb9f054169a280c65290f2f3f7ffd0f316027c7308192e0c835047e789fe5b747089fd4925b5f46bdec809541668377eb540afa3f7ed983cade05df565ce1a9743fd0ef1040078e3ad1e647aa2d1a3532518b3dc01f6f60cc442f1fc697bd055f56b333a37d3e8c2abb0ea69b701d04af4359b159703fa6a954c820cd86ed208fd2e2047f5b5e8288c1decb8a9d0b8f0e3b03caa02e77479fbf8bb737bfd75752b6550551d6ad00487c32225b60764023085cfde2001da76fca6cd2ed2a3ffc489be2ccf33249ce8f3d038ff61e09476f2b78518ef2c2e048b0720da077c1c30d9536124f49950824303aab7c9f1ab569fff0491fc5ec05b8333d5812f832e8d7e352e9b579b7b86aa3b48da9ee7b42e5be947e35a87d9e710c2f9f6e6678112fa0ffee0a0a3a2a0bbbdc00aff691a6490cb16df0b49fadda260ceb47adc891928e51ffb6434ff0fc776a62dcc9ffff4866d0cdf5ecb94cb4378150403c3fedec9e38e2408ac7b4f36077a47bcc34150cbbc1fa9e43e7cd083a562ab8d8a0a6a78785384c3a94855f33bba3190369ad69c5ffab049057130ab296897ef65ccb205c419e538a6f13e5aa7cd813ef895419d63fce30f615d92fa4a98de1c09e56560e91b5e8c3a30e62097ace69e4520b02fe8b8e006401097f739c3bb1d283bdda771437ab8bbc2dc120b5e75c6277799f11d350bdde27397ab2380928c43f2d594aec64b374aa56c7e3061c271b8c32d10ed3a20140011ea0486e001e25694aa2caca50048a580a5c45f0f534755a78509af8b747623914103b16ef0d4e32f3ac0336134e240c10143393f1f94ea05e1abde54f89a2c64d22484a78bc27fc0970f5122d36b216a0d3b9affd32708b14a4c40d9aaa75e7bd5067b23bc99efe8100502c1310eb012c1881c2c2ea79b012b5296f8f87e0e2886f329b287850302839be8bc73ec450e3250bd0e360b73ddf6020082019ab5e3b29054844b78aa73c6e54ded4899002060a8251af8ff53cec4aeab96991b0411c3d4e4e81acfe7f2226d8fdaf01ec182622a23f5fda8a0eb4994a184e93543e54702e733cd6cef81db517bd269f5568e0d94a646df80591a182917d810136164236c3083276caf698146a8fe8cd6805f0e14102496d744cd37d57a7157aae08694894d804b05c12266dcf1c7d5e9f9dc12bd3a74ba964b8eccd40ad2d3fba7e719446b5c46d679adc81420cec6cb92f4d3eb62ff64aaa7cd527c6e1c78e0616fa1d4303b37bcf63a398411ae716bc22787b88d7ab26bfb3b891bae34b0551fdcb8017a6f1c73d7ae8bca2ea0af1cf7410c2f02c634da1c744622b12196357e2f13ad72d14aefe990681115a99221cff7f5c4be5d55393a70f7fd04a71a1d4852ca52a63a56eb448272a374fda017e9f007e734c44dc0bfba3a65ae7be2d8c5262df86a4698270a3e84ff603becea96e4e67660019a86b58a56d965b9ee4cfa0b12fe16cdfe16b61d3b0c7f51546124ddb5ff3057e5475467fa3c81f1221b3e8d7212b74e816cc040d8fa8d1dffd95a6f0770d4d6e3ec3eb8f6d59dd09294e21e89f4139efe7954ac20a5df1fcb5ad514cabab8e08a78c5a56e2a3567cea9894d83c8390feac0df9a0e4fb225b730a8d21b8a0e45a249dd22b1e7901f927da42e1aa3c44dce6e3d6ca7fa59c8d0775b473a46cd6f7e56e44f62351f47dc82ff4afef7bc73e73fcfc31db40e8e0e09dde945f4128b510ea35dbd6456f5d23a952557462ee0b401403caaa80492e89443c4f54c8bbe3e68374920ca3e3e988689be01b0b171af548397fdef0eef88ecdc5a949590fd5ee9a24764547310a7d6181e343c6632601c69495a6b4bfe2162aa043566a376d44aa5e517e509123f9d2af9cdde2b1d9d1295128ad134fc6968af84fd61d17f39f99212e0fea2c25d54244b1417bd13d01e6b7ec700b254eb8b4b0830f2ff73a267cc10cd0e802023fbb3412afc03d9c5ecb5404fd897e7dbb574f28fe9ee61fab3f3d5c74bee1dc69a21d88c475c0e983e3bccf0167243afadb2bcf9c43a14d5edc1e2b15bca662537ea0b4001fd62cee8284d0753f8c01acabc7a1e9ca2a7c474cd1a0322c94d7a90ee2185265e6a31cc3dbee91df01480180e6c00fed4581f4af7fecc2248752951c8942096381ed3650bc52beb7426a64c911b1764494adc2507b75a738f31417a092b659ee8e2acbfa08da29319ef3fbc011eb655dd958eb01e1fd3a203f2803e68040dc41ea38dc9bb99e9093f45e365dd81dca27ab1caef932e01e175c67845563656b286372ecaac31c004afb888f9ec8ef7fa8b903fb6f426e1c8712d11efcf4393602716fe3261c746db5b3e3364473282bb9bf57031493c0472efa004e0c5bcd6d5b0e5d8761a4fe5921f31b0a7782bb183d02f0cae139ba51e3d0b088845b8998adb6f34dc861cc48a398483a83f63054f620cdcc62d433cf94a380d1c1fbe90e9d22b6cbb3f983323f1e122138b775e082a2b874ec4cc5843120e5ff94ef26e77d703a6034009ba85f5ad29af053b80d945150b877b681435c2ee53e9a55dfedb3591d76e8bbf831fa349e7dabcca1fcfdd549393b7d6492036a533c44d57451ac3f1ff7b418e207bf7c7ec7c3812290959d22d349972d23c2308ba44acf222e454d8435f05938f5e95744410f0e368866b23bc053f5a0e0202d1a609db4082da5ca672655d169bd09f8fb68504acca06248c2488808f91979036599b3a17068a3ab2089be3752bf89442c62895fa9f26fe264d42a819885b2c10750b8c8d2f70e2a14cb095c45bbc64f6f1271f4c70d6652e6f5e4d4e9bec1255a0110ec57b8c80e5cd5151049bc1f35ff3ed642d6db03300eac232014e46af16d33fd35938d0b6534a5c478e3529b323e95f5f00559ff01c86f1dc6f18ff5df1d1582452b9ca227fd00bd7c9b8f44bfaa25038139363daf9900122c2427a92d423ee249110528ea20d29d658e62ca25ba869024d6ece7a9e586f4d83fc0f2c315cec9cbe411f2f70623d58a822967e84162034a91e809dfa6bde84e8fdf91543e7ce173da2c18bb14e68a304f41d9b27179c7a243840a18d36433c09e02b5cfa63e52c54fa0a1262694fd34152a5bcdcce1b6ecdd99b2c78a6026ed4fe958429c11d7bb6fbf9ec775de16e23b30e60d600076d4e72db5863569517c96fa4530e190e1fc90090d1f22bf8cb8be7fe60e10f9b42e618829e3bef92eb819254743b75037acddaf975da329c318fafc92212d82b4a6c60e4705ffb43883eeac01492fd5b678dcd09354e83ec360d0e41d1050ef5c652923819f3c274a18f292b3a647bcbbac221707e69b28baa4d175c3647bb7ac52867e9ef35de5144b77231d585e9f20260cd3f68f06a1049d473f7342417e53cb1b6f6029197a4b45ad73a1f185ba9c7b248fd9ebd22fec2203bbbd09d389c3b778ac364932505d6b8e1fd04e6cf7042d5c4d2446a2b0bc906edba24eaab5718f431941465ab3f972921b8ee4e237893c36b843ab7a8b0f1bfb9e59f149ed4c71df98598ac817e021986ec646c7e17ee6beb5977d1750e1683785deff8eaa9708d2b9412d2a185431f13a698e37c2c89c998fa837afb369950d56b4ca896f5893f14e9d194c73ddad20918266d71552d27f61752b408f1e15ca8f1b1a7313a3686a20493384fa73eaec65a59596bf0ce6ca1bf51382bf4581d8cb784d632454e933ed6f2817c6ad57c90b9f149c6e193310542e6d9a5b7c73fb09e28e92508628e3702c765b5d7234e585f4aadfddad40f682c3662bbb4bc1ad63e6d4879d3368a4782a3be40bbfe8b1f889b2bc97fa43309678514982a30028b06cd2f2d4c8e33f2f7d69a98b9098e9f19430daa750d2c3b85b434d43eb63b35fe7781f4ad48957335e86a7dccd17e20e81dc0e02518d37279e0e0aa4a534da794c0c858a65b22c913d8e4a61c7ccfe834011acdf98b07c7b7242400c4e8b15562a55461cc8fd0f2f4820942938792be2843f9e328e400b569a5177e4189a826bd0529a84ff09cc0d6b3c45f2d9a8ffc118a87dcef5772582c2e6a6a91c99f8ff67e30d7323f7fdd45c1a35e9518a927d28cdbd528c07f9278325c674634b0218652977ed98891dc39994e07543db7684610a3d5d09760d37b60adca86dbb97a96e600a4294e264a7f2128859b810e385e8880a09b97bb6f425d82577d1221681f40d5685cd5b2bd01f0a3a97cdc2f52d4a2a048b30faaa06713b6b9db0b32153489e65402e180eb11d547814df769c7f21857c1d8a4237d843ec80b24efffb0be947824a8720d605d9c1ffa8171707da706b17fe7e3bcaa28b79e4098298e0dcf742debe8531d61e00ac2bf00a2b9ce4c1b1555a6b485538b822a316bdfc1b59c0db3d9a1e4046bdc640cd549fb039894a7f6a5aaad027fb4800295e1cdf14fc7b2a6f8f65303da038e38c8649d0db806d4c624510270fdf9bffeccd05834e20e8d297e00b046af25da3f869f203220543c34df9e735e2e39fa2f8a52628a366f2180fd6fc6d88c75a6c1e0f6417a8f425606f823ed4e068e3459a2207d4296e40748e91f02cbebaeca58fba9b7c7310c7b07b7a3ec0326f95dc60f0a66ab75aee06bfae52081059b2bc81f936247b66f44110ac43dad97ce6e8ee6548d877ba9c71ff497dcdc1b714661c1b785a1c2648e9b961b03242142d44f1eedc448c87e5504c2903c380b71562603d4d3874028da0f104fd0c5f9f9933b080fc4a0de72bec311e9c51500032ad00322c8ddd9c2a55ddc920fdcdd7e8ff334ab93d806bfa7a10d0ed86fcc86747b5120e1326a5fb5a85393a0bc8e785b99a337c3cf673288713242318b3cf7b24887ca8c1e988e4e6fa4fbb4fa6c70219c1d74a58e94e005e08ff510734d0e232927717ba41c4686d7ed1df91df107c4541056d405a280664ea1cc1756313038b00404809f08b80cbfe4ece5910234d35544dfa21ecb296c7ef55c27ae82ac81b2f25bdd44fe6fa54eb631d27527caadb23672ca381be3d6a6277b7afe0ac1a00be1e0b20f4818880b26329f6515c9042cabfb61b477a327f4feb5acb4d228ee1014a18b01aa4712bebe5f0e230cddbae58fc896930d36941541a344890f80d39209b02ab5ec915c465eaf30b5359af8e3b067560e80071f1942c9e0a7b612f8a902dac67e6c0bf6b25359213318a895b62d0398973d792d4313500594d581eecf30088124d2e955999a7de2f2eeceb18409e4c5ef1030e7632afc0b4d2b42233335337aa21cf4bd5514f4cc0d7e5eb4d3164eb7eb9c5fe1ea744a5a0100c4bb86193b76ee3359ff262bb8a70666c21906402632d48252c6295903d0646cc8437431ecbec49ef6845e914bd3df7653f83ab476ac18294d939b2970d96a83a632d9ee98be7bd57be934ad097c71debb6755fda808dc7ea4e77285b1c3f2c00b16eb05177cf855d3f01a620b1f01585c21c42653cd7c7a0c8af2bfe72b88a4166acc37db7a267b0cde69ecda9a5100a29c1d9e79dc7d36808025394f9e09dcf53a42c0be1c9bdf39c0fd3cc340c430e3401e4dee64ecd61a5100b49c4e8e29de75356060dfcab181e1045c3dac288545bbd1b84a28b96057c61673e53f5a5bc4b4cea5a5fc9e5f8fbde56c675ea30df935a9507c5c2ffda020c92491c2fc8904377a35426dc553a1345dd023cd5e8a511507fe1f4ab91f147760533d68e903d9cd6169f3871ca87005f75cfd185418570276fd008160b54a36c6a271c8c9bd759f13fec67be3f9b429300a8cdf7ca571c87570df0a9656b6a7e97d45566af943d3f6b6401d5988c7bc3f7f1fd8c2f0f806afc687a06ef393f5d5c963fe263ea47b73db556ce6715431b18fdc94f3730e32050568216ddc2f5b09e5354426988ac164ba347fb7665cc487c71d4d28dd117933ae58d13b3e321a2764585afe7b65327717038d0f0fcc5f7f56b886040ce6dd01ebf21b0976cf545f130bcaa09ade61d277b488235cf2a60c959031ec7f6611b3562c56edbe2a2843418d5348ba6f42d5c2f1f17ca87a82226e89512589fa5130f6bfc370401b211c65a319b987a5df8264bb6633aa031885161a30c6c9413e6205668f41b89d24e042a7b55a3b83fce9c8035e8826af75451a1ba42234c6f132231884ceb1cb3e8e025055c84f6e482ccfe8d58e3d28ba5800a6a15ee3c7abfae6d40de19fc86a1fc529a6fb4e58727929c1b21984dea988baaae0b04fd1ad85ad4c17be039f30879b9db89186c502fd8ccdf5e352f3511ffcd0153f5a7dd8a6f8f6c8d33e81e0d53ffd866def186fd26fd3132f65893f1e8d420d58bf9b38f9078b6e458d7e3c100101728b62a1c88c5a8672624033834db0b9922ba17c5542b782197220708a7dd13f6d46bc1095d7a43d035bdccd047c1150083ce0f8895b273230840004d21b2a3ad4adfb2d31c21214e9a1e51a8d973c175e220e3b74def2626c2d2ca67e05bbf20f2d916c34270b4ddf2c1be18a8ab81011b66a914f33b6a39c346258b46fe5bb1c8233d5c299adf265a68a4e4603c3891b99611c63c7a1e5936e80b891249e54b0188b6b963da5e474d84554d4b46967b68e21dc37fa5aaec63e28ecc0d57e6a10e6c2e001aff1d710cf57d903641d4d95bd589860472b6f737a57388464cce6b85ddfc6ed89f2a61656cad1c9e44739387c68240db5f6405f7d14bd867df09a3d8413c6d6cffa11a9546dcbfdcbcd1fc63014be2ea1d6655bfc894033e4a86d6484724c90ff41c6ee1b38267cf0e72405cc890bc4d62422cd27cb18040922fe731d04c202a1eddb730fe08d7c6735262d380ea885ae44b17a03bd7944956169f5ccbc877d8056ea74d275624b72327b60407e88663926d8c9960cc4e4e6b210cb0c03ea65221466e2bcb212492cd796a0c2b7eed9323891e453355cac9835af6e8f2c7fb6c45b94ad15a1226147919602d93f8b0746e4250d6a8bd86d717ea345e0bd81e597c5c3d97eadda31605ae56d6abe2f2a3fbbc6da034f1b950b77d425364285dab5477006f4c30a57b582585a02e34274a26e04b1653654cdc26a616cd06dfea810a0b9a0ef948feb0c2adf654d9c67710904880c2e9991173d24841f1bf08b66554c85f2e104144ee4897de600a80eb054c43f2da4a2a3cb68ab833aeb879763f0315b6b1bbf812a39ae59ab436e904ec47a7b31502868325e2680aa56422c4f5a42d43aec0b3b41ad668aa5094abb4c87940af41b955a3729e4a0fd69d3b43389aa6d931966ed9c2a7e84afd235d041313337d28aff12491ad663d6d1ee2c51f8452b44dcdecf4d2bcd974127a35fc3738efc19f328d1aea7f7f0d6668effa76e1d7f47947d10308debb1f872f706c0b0e1afd84599f95346465841ae75c10957c05d078449c743cf4af445bd926ad18a193ca182f107588a343be8ad33372259dbd2f89f11f95cc05eeed05595ef47631a88ef2458c3df7c8b9d62038f42d12f7f8891d83b1c61ba480bb9743fce4d1e159913848006a863abb82325d8199d5a120b06f6d50464d16b6208d5130d4d38be6b393683a7820ec37a6d92fa4316e86bf3bf4e0f44a6a884a405f8f4316c7107aaadd50feabb0b48aab59b0dc87f23683b43b372fc78d1a2f23c3ab922960abc409a784168d13b5aba6b77434a62c3a6db660fa64e94695f59b8876176d1a8be55fd57d0354601dc7d71020cb191f6547df403b31d8c04f4742ebb6e2bfa4fe6787fbee8fb189f861b6d9363a30b0baad8b75b5ba2aeea483161ee0ceb7f48c93b3e3b297bfdb76b58e0f1f05ad28191878986244766e51b536115a3d1fad69c40f39daa24333d67ce81b3b2f396fa1a473860b4331f89dd5d8f02a14c0671a7b126c37a676a78c9600a50e99ef1b3631d96bc9b5d9fdf53d70a1b6c659b4a59b8b291a013770650790f76a10d279c2ee9451ebc6473c42ef9e9fae0e1810c0746222bb3d253885c28e36adca277d748e36e6dd974a7c4c4b3bc490eaca5cc82596a7b5b0c60e5937a57fe6a2563ead1a789633753f1a2ddc3f2742e0cec8cca98f5625b15a0d3cfaae6ffcb172617966ed85c8d2f0b49d5f38d4232e51178bcde66cc03340b00e4435c69ec2651ebf82bb97bf589b39745be794af2fe5b65f14c89085c8044a32f28b326c6d5272d59bc9c9e6130ddb0d8e2f0d5d404a6f0a224ad62a7bdfea313b9acac598603062df1643012004795ce92e1b4446c6efcb58821b5ffd626c1af7ea0840904697d20fcba03faf3eb2432c87b19d81f0030910089a750deed58b618e1eb243cbb9be4eac9ba439fc97a2db6201999f8d1789214529efc1b5e54884e2ece2e5e7974d7fdf9ffbdf2d03e53380d9eecde1550d6f6ae4efa48740749dceb52dc38f39f9ebcb5cf013765a9c7443b4918db3c5fca337749c51a203c1d197b4a00d6c5320287c707d3c1b307c9540f1902a0f3e87e3a0fcb2b90cc98be08513a9dd161644910edaa44812f25071701c09759093db596422e607f546f28714c373f026f0a78a3c6c4eb18620882fa2d5df15fccaacdba1137d7f2d49645c12f4f5edd683f4af3609c095d9e06a07ba7d1f1c084d12d89cc514e56b163f433d95f42428ec83d9a873e73abe38518f9cce390405bfcb1347d4c71af2e611120de12d096ecb99203180062dc6ad39e2b42a9d9b7ca86db3b60cc8309d0eebf161dd6d90cc81edc8596d10c831be2774600da7ba342f26fffce7a2efd7efc7c2512ee7ff4d9ac67755174f27554ed0fefce5a10d78ae95c30d905923ba9bf83d170bd4eda15d22d26a87767a4ec0f9707a4754214fc31d5530bfaf965deca75ace598611bb42cb8123bceeb3cad2a6ca4a02a1a0d35869a26b053715d365d87e95cd3eed64b9079f508365ef8bc66a05924e55d7d45e06e6a3237504231efc4768ec1bc8124e0b55e117232893ae46f47b68dd333ddd09192c42cc8af0d0738a3eb525eb7b16ab9b2f24163760be6ac063b2003319014255723c794a98da1887b3424f8b8f65a70e50e0d9314c89aca216b66f2196e1685e3d5eb9b1481d2d8e7836707ed858e37987173b1e047a86277828fce13cf5e35179914857a765abbda9870c578d026bf401aa8d5e3ed41228420e48aba8e3001932b0ca82e859207aa249fa68ac53143820bb4801872bf67e1f21adb1bae7980d4c7445106933810851bf7c4bd0d038196c1dc340d92ecb01d8ddbd0545c7705e62053b3a940aa23d76978b60e7d8a0d649c07b23cad96915a9ba9a93a7a57486944e8cfb827eaa6a3e405f0a7cd98d58944408c8f37aef1c814825b1599cb824a21f1a7d0902ea722c855a091c7e76efc5d3c71d17837a368d873567bb9d9763de7a44274127679ca546813b38804f5125e34d7259454e8d719127a1d22655573b4071b95c090753d77601736ccae3fceb0d6116085d08e24bad0edf3aa6e17691a948c2bb333d51062084ede4accc54634382d8a5615541ace28a65e7a69a96e14af638df27a534102b703ec7cccec5b2defe7f5c92a3adeb4c54100be0b51211175ca31deab711e6269c10ac8e9f477fe24c98945b43f492d721228aec9e55117cfee905a4b4ba6fa06c8991f00456cc8b7fc86f7f5448ce6ce676e13e4321a0597954734a91506249331edadb265b45bf1e251f07e4dc25981a58617dbe0b07cee66d253db6b525f824cd8f99342da0a7f9027c155bf13c3287abccc037af7b6955a2092324a7331c0af9cc429da5a7c5e61feb5f8c5774222cc976d5bdfb4f144eeb1f8e68da22a056d4554909837a0760883890a002000403d14d25fe1ceb2bf0b8f20a9d8613990925ae28de867b04744ac6dadb5d1d2d2d226015d09b9081b0931d22d053f57754b418c828b81ced319af0b33b830c628ef828c3570aba8c41414132d6bc045cb9f64ea9d3e86202a15702b145c0cf06e85451a01a17e8f3bf2f4a56670e3e1cab1e65d98980424b49110988340a48934e7ac16b398c52c16b13b0cb3a0259d2224c14aaa11deda4dc2cb78c59861cfd7987c50cf93b423b1b3bc0b421d2766c5cbeb5116b8267c7c6660c689c7a7563a032e6a7cacd829236c21d142c20c24b8645ab6dcc47aa56e4b9c2b3847b490d8028b17ef6d2171856d2191a581c031baf9c70f9feb4020f53a3c8f0ce706f6d3b5b6e5134b7b7624983892ddc6ec693fac78d2b33fcd1ecb7eb26b3867acfaeb188c5966b72cdb58ef58bdb6d5672f6632236d28a87af484cd23bc74465129d3f0a8313afdb42174d6cffa99e15ceb4f3dc59945abebbab1e8ebc69aaf9b9bcf58f1511be24e46740d11e828d1c1819422d0f1f1c159c25a1fc9c4ad779fad1d79e1f5c3f285d91367506503d0f4c15142a70b25a685114e5aa917b5d6d7da031a249d32429fec9443a5d559470ecc3d7a93a162c4b9526bad2d2a465debb3baaaf7c94e3934ed5a548ee8ac6314e19842859d7245c6c5942bd714d29421ee141794a6a420ab01e20a0323c1fe842e4127ce008b141fb4d39aa8b4560840d504869a300144162a40220d0b94818332535409a20c348c20e3d4d50837bad274dda20a941145a48c30c28c980187a193e50675256c84a0e08c280c74a05e2ba5810d34b5d60ba91b0ab5565a7feb5d11bad61904a16badb5521c2b943465843a102707373b232128a07ed3ae35c54bef68d7a22283e90cec51fa4e30c705793a4d6d70e91fb552894f4f9c1dc7ca752d9fcd076130aba092831619568006108210822d9a5298c50e4a5288c0c7c51ebb72ad28627aa65d4b06651ad52d29579a522d5aaee8792ec57962253e7dc22122eeb46b496941db762d2936f0c02a64931abea242caa002ee8fd38907aadc718ac8f073c24fd684113ebacfc718e7637c2e3bc5dfd37bf1c59cbd67a56d7b5ba5a45807aa9cb4ad246ba116fa0d110512db77b7e5db9f9f383270efcebebfcbf7ae107086783341d10c3052564c3023600d64a0ac989c7043123758c9c72dc845b162e2a858494c250231c39715131f6d4c9121e8e9c0039915139e1368e105039a18ade2e656414e8a1e7258318941ac9e4503074208b38a1b66c50a6eaf9940a107e10930a793e796a61183b263063a897f2e46a7c5d74d76fc9ba3ba1e615c4fe676e83b6a974386877b5ede97078647aaba5ed8138f24ec8144f5cbc4a2e9cc48cff1281e913639047b9c8b632010779dd01ccb3485f2522311c52f71873ecb264de9af2d8ef9127b2219b84321a63d0e5ef738b57a142bc43845bacca80889b0d30cc723a8d29afeeae2dac7e77844e5a90c40533902ce36d26e27a8a28f47b10712bd1d7a14eade3893f110f144192b247a26c4d3431b1c90ebf41007d7633a35dd90d0f69984ce90a8ba1dfb6b8b4e651f37e77cd89736fb6aa116ab3624d659eb562feb6dadb5d6a911815538934115e9f90a8133d705812da53ca15d115b1c162de9e3c13347a9c5a88a1b508a7092c96c0d097f3a21bb3c2eca3efb6076d3b24ce548db26b3ce267482aab7491d79bda804460a631e9b4e4a87334fc739e39cd33dc61863e6e101e2d6db39e79c71e600454b6993c0f2d4d105ca0fa059730517a4059e8e729da7b313c2859804d9db0b9370931a7aac4827aa59d967db723b754de699733e4b9c99b44cc191d1134771d9c5d1f16f739fdb05825a7ea6e7a3c4c0c45de164e5f090bbc2c9ca74ea3b4d03ee0a27ab8783dc5171e7d46c04b144d11255bed82169040b869041081dac9ad4d063f54e54b3724d6a802b7ba206acde491b51035636884a92f7a0671f44250989f47090cab581821d4441c30b1a88a14509435cb7127281161d3c790205971aacb1722bf7ec93e44343ab77eb0573a794523add9ddb7474b92c6a2da594d24c2984ef6e837f94d6c75723cc94c2ab21a53372400821bc405c5290231e91524a690d0e17524a29a570fe414a2f4f5095d394524aa9d6aed5031994527a4181655c1cdc3615e6665568787971e5a38b4f6097173447ef080b81c8619d94121649f7ca9abfea9c724ee922ce4c1adbe2e966c4471750cc11d493b68410f360a438cfabaf70d2ee5703c9499891466757afa34bad70c618e38c6e1261ae9dce74ce398bd3821b5f6a8705072b3aa394d24929a574d66395d6d34ae99c129681b594a3b3945282e1365b04c62fdc97ac24828165f1ce43e63b5c83c395c75fc876ad21a2769771b820ceb9e91cce0e222efca50bc2a3f39c16aae6a5eb111fc90618c42c97afbfd752c9924c247c6d4a4c775d321d817798056f6fffa69cd7e796e71fae2c7ad798d38a5092cc70ce3ab356b3974f6eae2d5602d490d5979228318ae1b7a57e4e33529598e57e04ce39b1852739b853edeba9fdc07e9bab2e9b5bde32e988fba4d7e42fceb6258e72feba903837f8b7c15f5b5602d44e8965b9e3e3941083ab246b77797a77255967cd727758a724fe81774775be06af318f0717802167a0dce0a7450a2e2b1bd4855638175ae55c6805800bad6cdc81d78153494e3b2eb44a5d6835c201b065648c90b36563a81ec48ecd87e787fb7eb3e9885b643453ae2ea563376d8140eee1af0f2ec8027a051764e6b5a6e6d55a1fca1375dca05e8fdaa48c32deed4822f6249acfade6366351ca4b0c44bb668e39e6e81afcaa40157c52a00a0bd7035e63e3e67bf4b0682e66862090fcb6949197cc0a4a20102c5c9022aee9989494ef06274710c89d0922cb6387f7e88ae305277cb00323d6d0c28a174702881aa6d0e0830c3698f092d7f53441d04a3fa5946620daf6986c3bc485cc96a32c618cbe0c19116571b2253b2e54522a2576b969735b12d4a53bed4746a0d9a5d4b5a5aebfbef03dbae0c08884a21479d1c50f45c811831d3cf00224c67c51638b1c86c0a28c915e3181382ade28f3bec0b1037c61e068d2f98db99d1f193814a93c8240f24c103d66260808a48718b478c1459513882186082058a287304555a078a38cc64289a8dfb11a316ebe47f7888c0d690cad208f95d54c10f233414020297ad7f15bb8dc23baa100555face5c1854df4563adea40607ac749ce8ad502f4108221d3a8efacd0aa5e3e6ae930881f4a676a0c4482e9923a39b9f14296f8b14295ee8163160a4944444efd54b6bad95d2ca6dae107beed1db728ff03d8a3bf0527e81a47b646d0b29c4bf96f84951c17d4b410255d08b9b959c9af625235be27b0455770c54c1f705fe85d9f2b8642bc49e9785db81ef12a46949c7b01c8f329db4ed88f224927684fe271ebb3da615a139a61d91cf9174124e19c1ac9088f31449cb521702ad5684f4398fda5836779d6d2da02e9449afdfb1e5d2e751db117992d48edc4fac5d48bcd996bcfea1afb98ead88b31b4babc1597bfd0cf6316dac12a65a6a7ece0c9bd9316c6e2d60d93c365db0a4cf4ddac78d5ea42d5b2ca1aa0617b66b35b143bf67f9231f718c39a889b8b710f8b425303491e10443ed9cca4dc0b5733c72fc7c29bc889704758edf01b32d5c955775bc36a2543c74b6cd9a56949c72bb5e889d6168a0a804d5f6176c7b391a5bc2066477605c1c306e765cdc57c040ecc91eaf42cc36db385b741e0e16373b2e1d95f8b4fc7b9fb3ca70e9839db20cc34aeeb9aed7c37056a2d3d93592832a0dabbfcea5bdbe074f124af9dc2cbdf3d87ef89671b31b93513d2a84c1f9c175b76f07ece1db57e9baae0b078c9b9f69e71d7b99a6611454bd4cfe7a184836955d294e02553d28c42d37dcbbe4b51de3ee3c23db46245df60f08849ab4126675543c78664e3a766df1531b428a11f25cb26736158699b60a33d3465b9b5ddae671ae6ba493b4211a49db645f9a04849a842fcdc89ba64df6154b9b6983add5ccb43d2d6e961d33932b6571b3246d70cbb7e1eb69360b77487f1a91786dd92190d48654988381a4910c83db45da64cb4b5ad9979ed1c5ec12638cf1452fba90b00b4e17403002492e3623c3a7257eefbdf7cc83019c2e48745444b2bf671e9fce1e1937f3f0c0f83b31c58e4b0f06a00f0d113bd00103ae073c8e979b0355700819f38b8ee3e1708ed7b14db713bef97e9173e64493b3e2dac3eb508a73bcb8a937947a4da02ae71052158f97590c55aff5b447ae58e82bef0e247b9e4a2bae135964a1ccaf3350ec778abd964cde16ebcb40b1256b09939e7745f25bf23278fae6df2442591276b1a6cbbef657baa8bfabf336fbaa0dc97e6ae5a9cc79df4e33f85e6b6f6a74d8d0ecf8e9a87b6dc7265fb521286b6fed0ed9373a6c4e3539f7a60b89335be9571ba299ae996e350908b58996eea04a629b931a910d9e6e59894e47897a530d291bd64a7abea79c96a65f2f5de24c1f6f2ac9d8f75233e2e698638e39fa9a646bd976c280a67c9b843042d38b3a88400723c1aec7fe3614fa49a0df12268dfd6515bb7e913e9d08749a355fef2c8e1837bb7108c9f3e5669d79d7f68f0e793712c31c73cc91a58bc8ef3c38f445ad40e4e7eb26443e7301e747858e77b86e1109045233b8e5c88a971105d76342400854cdffb820cf05790da6eb5346deebe9f51829d3915c740b07589a74597a58dcae5b4cf369b521a55fef3577aec775da4af1da4e3f52a2da1192dd309b41fc84ba846486b7d27e4897acd2493f6db9f4eb355b2e9da6503a093365f5a73e5e0702c1fe3ac7cfdcc72d6b8ff6d46a47ea2dcef108e99776441e2b1d7bf07a267ffa134e19c15e8a771929e24c7a3ccd0c6f155f739b6b47ea73f64c7a51889c3b800d966970166aa037b3b14a7f7d3796769209db94366df3d18ed40c672ec8ebd7c2c198e8c2ebaa4540e889a71549fd48d9b19df6738760db0b819588c33234d4f633da9237c7d6c212773434d440348d3d02658d1d61a1ed120734743d4807a2ddc275207a4485de9690b0c4014e8b80e3418758f978291ff1fba5f1a47a484c0476843550c342e384d2b2f4239a9abd6634c618638c382bf9819f2621907827e9d18eed9e6ea567db0995ca8e9333023d000e3522d8c3f9116755539c7df43c86615996b160bcbbc9b2c7188ffd2fbbc12cec70c7e38540ec9484233b70860d4f02ceb0317904009c7d7c19016755971c9c9f050ecea81da4300a53fa23dbb2921f196661401467194b4241b1d45196e95cfac68a67d2f461c7b2f70c3ba892633a976a297be9d87196475d3a3ccfceb663e6d5d767253f324f5b4c1f5f9f2f1c842f5fbab859a170f3f9005de94bffc932c440b0690975fa1ac34038e33c29971de19a8984dbfc3a5288a738ffc4d35331cf04faec426296735e7a96475d7fcae8e925aae3c724e0aceaec8e2200f0083885217e2f45f854cea1b444af6945e25910df6791469c5d10aa3ae86de8b5198a5338f374e91736a19cb687b3bd29f33e97c69298a6af5a91d3b397b6782171e6375bfdc9663349b1dbb5f9c41e672fca3efbe8ec436be866dbcdd3f8505d38ab0e717e0967d48d34afd9529d95fcc88fe659cc221dfb4be399e0738d5c9687e19410038cf4ecef198659a4d7672fab3540104b01a3a1c1a9ebf4554adc999f3e7ca854ff9432b153253fbaf4ace447db9b9e79ba645d8f77ab15299d65b1f6aa1dc9baf4bad8d9b265d961f498c059c98fc66ec2b6845dbb4ce399e086547904556fca56b14ce3f9a039ef3a58a249bf5deb0644589aa75d6b891dda0664ba00ed5a56c404d1595fb767024c2ba05d8b8929bd449956b56b2dc1458b891b1a0bd396d2dccd1ccbb2276f630f0a2b6946aeb658d38adccbbf870d79da100cbb7b0cb3384bcc5eda4becaf8abdc42e24622ced4cda3a6b5fb436d7b1cb3f56e95acd85336ced3538c32efd85e9771bac1db3cff6592b31ab74edf6e587a5ad42414c2c9663689bdf98cef51bcb9e49bf4d6a3fb14befc27ee1fcc42c899ddf910c219053bd5e8f3d679712e71746963010ec120682fdb0ac529630ebdd5e62406aa4fcb5615dbadd32904cd960d88ffdfbfb7b26bc63f87a59c7ebf3336945ae3fcc7ad75e922febc057da4bca67a5883deb92cfac7d97983624d3b66753da7c6e917bec757b3f6dd96b36d3e176f3b8a16eb77a21f16eaedfcccc69b6d475ecaeb537f39e3633c633a1d6633825c4e0225d9845ba3df6b014ec258629ccbcf4b60c249bf4199cba5e7fffc67826d8d7bf6bcfcf4a5f5c42d1cd40b24ba8edfe667371e79a36989f9522efac12ce6f6a47b27e38bb20d4f6dab3bf2ad9a536247b6136697dae953f585bfcc6783e2a9d813468eca0d57a38b89b59c5e1c1cd5976caac70a104982ba515302d6d4b1fb4cc524ded5a4a38d1b25d4b892f500cccfded707eaf07d5877abe82474102d953624bebf4e0b1b1a7bd1e6ee6f151e24a4325b8f4f61afa70df85c02d4d2275abbaaa31c687efd893bc63d8df493809ea261c643a0a23893bf5e1209eb8533ff31b3c838384c49dfa577f79821e77ea75e01ab7eca52d884a9297a280fcf52492f4a07b79124e129fe1a0c7c275618883de5074020f71d0c341da215621eed40795eee28e3d0d4fcdddca7dc96fc8e66ef5eae96ef5ea2ada7a9b2d880a92130e7aabfb99d76c345b0c549260f841893bf5d7638052c210977e5efcaac49dfa125e70710c41542ae056ab0bc730ef56f955e92a6fdae233f8a74615358c1a73d0c152941412fa0ab815fd05de6aae4c4211561b60691091869634aa6843584adce91fb5d743d6c9b93c50d93d0b57532c02f7f99f4b04574734b4b094c4670f0da33e4104720c2a435374748490522735448a8854914eaac8c7a58aa8b575c4c52705c5fa64a71c314e1aa75d0b0da226b56ba1612533923ebca32c6a744945a9605800cff042a403cfd822053aa918c8940cc4ccd0a676ad33c674e6d95284339ad0762d33ca9831a66fbb96196032800551bf39a374534a27a594ce450731283308630655f6f97877114647920ea6a6840ec2184faf4cbacb18a58b523a29a5746e2e893d3523f118620c2ff191881de9614fde7b46e2a398ec3ae79c73ce39e71ccc0273cf84d70e66f010083eb43c7c263c13f23b90ec4c9f816cd703c9bede1cfd62dce01d9dd1d20b52163c9cf3d99c52d6d3d7f914693e65e75374ca0867dcde1c5d711830fd8923ac3228234bcf4bd8d735e4a2b4565a6badb4c2c3ecd15aeb6bec073f2fd047b4329b17d5f275968424520e9774c8c22e33984f526eb24f375a29ab1bca845d5316ba3234d42e4437d415b79065a8e581ae2d437dfd443243ed8c865a621dcf47fcd34ecf47bc63a3a58deb11efb493eb11efc3f56b7b7d7241aec799acd29cb42146ae540ff7a6e3e9896eb16d4e3aae0df6c9e6ba437dfd9cde5b48bc36b9657b793d85a548d753f3a2f4492abf24b634527f6a182ec248e9a71d11bae264a85d107aa2ca505f971a91c8c450cb2a432df1924866a82f5cca9e8ff8140ff771a1c9e4e6ba26ba244e1da58b77a4309d5d5e5aafbdf792ee75efc5ae76b35b4a52ca1ce86ce10e93b4525e97bc2e895da4d3aa0d7949dc2b9f2e0c5f534ae924694328b6ad32c87476790c953908445229b76b5ee28c93b13b6cb33adcebd8e1599834925d66b2ded15f56d60b4b9152d33ef5ec6b992d8947e6b3f70b13715e1afb96afcb790ce70bcbe7ebb20504298d611209bb9672db018bd13e4854061330bef8b62c33e9d93ed7677a484ad9544dd107218c18ea90729272725328b8f0f0c505481b0be05cd0137a51280b285b7c983319549d22c003e65bbeefaeb565a8b31e982ac6db2b8c3a3e23e31d69889f645c1144c72a7990a5eba949dee964a4bb4eb584f0461d6ff3a56dae1d75cd6f1e0fab747c3c9cd9f23b6d242cb6747c4d16a32c4e263631cd483c3dcfb4ad336d4770330252cd6f7e69ef06573e6b8745ac76e8b41f21b06a466caefda27563cd4840e889ac15b99f35afc199f4f97883f34c5f2ff5696604cd929fa9c09700e2081f90a1032aa0acaaf69349a678d3f6199cb74c2251d8512b5282ceeeb49fab047de12c2f7fafe14cea79c98aacf912346c7d91af9faf5b3afb6d1d75769a65a86bc6b2d950979b8e6b1b4bc735e77a906425227f4fd288c85bd3af2d4f23a6dfdcf49b6353934350972c7a96e99afdb539d783f48e088979b2e4e5b3539c426122425d7aeac7e6a6dbdc74d3e96db6ccde6c36a7bfd9b26b5ba6cfe4777c6e14b3b2cfd79ca41d395d48cc708a0875e933ec780dd8df6ac7867250c5caeeba666365c766b0cf963292ddf4ec26ac8359991601a127b408080961559380d0135a91fa7917b7d48f0cea18da912e37264d12eaa8910ee5851d886607a2bda406b5bd298b6109094d7aa231266d2f4c025403a13acfd7f989630dacd801e28782b708add6d00fa8386ad7a26287ee69d79ac2cb0f2f0d7b8c8687374ac97073b8ae350596d60273c01c4a35c5685921a5e165c62325c37dd903027b3c5c54999c2f3556949ed069d7d202040f357e34716ad7aa224a0384808345cd95234a50b21d785043894c19355a6454eca0b28316a4dab5b290e1e1a2dab5b27cc149b1c0a16e74d89c6a687694e21298bb3bb913109cce1aea70dfe33b2b42230dba1c6ebc8b183cea25b55fa0d14c58d45ea0990bd2c2fbd22f642517a48537d44b1cd0ef43ef3d08869d5170018598c6e097320de71739a5fbd250f6b89594130cbd69f92467185180915204d13aa588a50ed8e3e1ce60ee4e47f5c0402dd18a0c62424144cbd423fb8594e5b2823d71831194ec073e3c2dc768a804069805d85800d3f472211458b6d7c37df6ce2f1a3e21a5a1a321a1007b46601dd8336206f77d2601415cd772a24cd7762d27c63841463f27b8e8b70127b07446f5eca2a31356baa34ec7cb03b70b71c2b8f374e2ecb4c5cd28548eb4d089134d5039b5d65a4f385cdc8cea8aca51a17e608567c2eb7a1680ea61a8a83734450763dab574d0a411d0ae75458bbe273b378913c6953103c587339c1e5c244930a0c207e6bcb2a581c01c74ac5276594a43bb23c1b9e23afbaabcf7c67855de18efd986734ebca43684602e9457e511a54c5aba07bf3939651af26808931683d79c2e3bb99c0c679da63c9ae24c6f29a594875ebea6586ab959ea6470475e9ea4cda434029fbd48db8d6ef947537b51253f9a84651acfc7ac74f2e80053f1d864add15a68ed7bd1e83ad20991de6c52a575c5a8d5040f3c9d95fc9047528c9369c8237924dfd7852f2ef7bab04e1537eb4895445d7ff7aaf2c688da902b36203680e82bd800f86c9ed217a6d69aa240bca9090df1264c037c090b35b665799dda3badc87512b6bd2a7d01497a21b1ca204c98314c9f1377e6ed6d0db419ce6f1c2c6ee6d1f3a4f380406866683eef939de6f327649b832a9aec77cb5eb339b863da1c543d6d8866379be18c9dfe3d66ce08aa8165253eb09f13029738c0a7b390938e241c312b3babde3efb4899339c7d3a7b9df9cd787cdc8603c6c57e9d0702d1eedc49b7b1c754c2d962ce399cb32cf3e86c2dcea0cabde2a9412946134d4cf4745b32849eb4a40317121b859e689c162a7aed34222e8ca6384f920b423de798964f19915c343da6dd6663d1db9c66cbf4343900d3f2a45a73a90db118cc48db0ed743a849f13347a4503b2d9e8ad8c7478aa4db6ca3c7b6eba48de6f616490e849ad36648bd86b70a66909eb8203820b833a2382a82c205457850c41449198a68182aea7982050d2f45ae0754c64c91a5b1f861072a5200e1c60984a0e010451a5f7830420289221441939042799ed0a0a8c88de1ca5841d1253ac11555c8bc21c60d1560810f7af8819624a238633547124d6995286f08ef06658abea062004f8450a4f3048cf3e205456814d93c69c37509f2e4c70b033f414151ab88014fc21425403e314388a2053c11821540f8a2088b22b7e573ce39e7fc3dc19c39e7bcc436ab3ba848506963cf49ce2907133d273da2e79ca7d3e9918ad4932a4798a6521e0ecea8c79377441607c63bc385517405019efc50e4f3048934c8004012561cf12487287a9043175fb82000a04ad17befbdf75e7defbdf7de7b15db2c5281c939e77bf34d4adfa38fce290f5fa8cdfaeb7943705b452930a7f34347561b638c9107672049c7d8e0ee9ca0c20a412e883c742c908ea1d0d6a7d63754310c50f5829ab81e97cbe2a02a228140227e613e34a1bb5ce26da1f9080fc04f8040dc8cce63ce633c1c8a3df851957abe4f8e0f3edaaf5f8ff13f90c49e0df5f867c505a9f98eeaf130c49e013c0ae055213daa9c914d9cd2f1243cfb747e3ed44d894f2bf169ec248c74fb854a8b6ebe3b1e8fedd8f21bc2e6b7e40471edf3db4291c87a5ab79b9deec07962a0da15d30cb5a936211860018620a87a35343359b6f7e52a693b1b2aeef008605321003adb835202dede96b8f3be6d27c1c59d1172525c8e7884d1c9891105f8010884da90050fd068e78e51fade7b8fb60d2ee9384fbd312ec8157b4678a4877f61e251a0983ea7879b79743c0f9e1f40b5dfd1b521186ed06bb2911961cbd91e918b3b0f9b935208218410528ccb340c50f59e989c175cf8720b0d7f856ea0a90a30608236007b360077de5748f500b3b1a709959a04f6243165f711a2c2f634540e5465f7b1514aa7d8a284a8e07abcc38d4914c220f4c106a0ea65d730165c9020d7e3ee78482090ec39773fa66df63eb5bec4a5ed330a5dca3e5d67686a6cec0dea0ed2670b77507884cdc19d1b9c6d5b54db1a1e1a9c73daeab4fdc5f59989a765e79c5cc259869140953dc6a33adc81872ea8740579036917188645ecc56d71ce398704aaa874ce39e79cc3eea8255015a22f0a81bd3069761209c3300c833c6de110d2bc5e98f216e737f6ba5da41c1eaed2e1e14fb850851d3b86c11decd8af2ddbd691da935358e8a4d21c28375b49a64b28ba8e4c6754ce0f977468ebedd682ecd3a6c49181018b10390cf55504eebc50a11398854fb3e6e9b492059f78acfaf0803d33a7941ef51766b3aecbd3dbd8737fe18eb5d7b20da5b359b8638fc92dbb0a8d61a0d9d82fac822a7be14395bd69b3d6a72daef315db895dfc01465f2986b310175986cce92c56b73c4fb1fa1c20ee955dd9d8dbbe6e79de7cb2d8528c33a8fa1273c05e1c5adab5e008d3d9d4ee3fdab5e050a29df6437b8900ae73001680bbe4b9bb0dd32941099cd9fd84334ab5165f8b8aa930eebc18db6f132a721e4b082526e1c607583aadfdc93ea39cb5b7cfacb5965e92a29c00b8f5f416b38ec30873ce39e79c33e73a2a1e93c29873796cc088bc4ea5aafc09e5b6541af7846ae1b5bdc55148519230ce6d42659e449ad39226fd9c76da1a6bc076ec50868986ee2121dd91d80f4f23141ae140e38e87dacf56b52132b2c0010de1cd3966630f0fdc81a733dc8cca3a0de7e17596bc8e6fe1753c8ef21edf513a3706800eea4802addb81d8e61ae0e4ac75b8e636a132710d5f655001f1918c0b9fe5156b6fbe3abef375b91d1e1d2fd723fe80aa789e9c2637f3b83a9e07cf0f9f13686c8011793d73e36db07b9dc44cb70915186103e06dcf83b874df5b00a65d27310a845e544c9571ef09d5c26b79792861ccee7c132a51fe34603933dceb12794db2d7c939fb4d4a7f82aa790a5369dc29670bafe91fc551ea85c0072baeb70995f8fafb7a8b83f4b35f06a3b70995876bf8ca4205c00379b5d6a9a5406b8545987376e687872d704ce9d7291e100875c14f392ebc128ae27bf13dbc80fbeee020a2df1382ef3581c978dd1dc562ce6c1929ed5a657c3040bb561c61da694332a88a3987aa14106ecee9a8a3e2f11a3e4ccbcd19a5604c431c854eb9b9561c5ee0e579b70915f7ee4aa63ea57e704a7d9110887bef35092e26ad856ca4c44889019fb39bc1ede113843035c67b4f8d411fa11030b70168bab084a22be9a3f6234f718697f0aee10f3c8b0a2f3e38c8019614173c36667193ba88821f6e889205951a6c892f7801963878a0e1071f54b18af4041d6304a34a5456c1e164c601470e6fc141440326aba5119aa04b125d8488f2248937561905870c3ddff8218368a05039d10dec42509042ee54a3e71b6b48c705854fed5a6f7c0104192b6e4c21c483931ebcc850041b5c24f1460d9abe718300c831802751fc408b14405186163064f0c60f5abc41d44f88eb5a645a64c8b47ba95d8b4c987ecfc870e9762d3258fafd8626b705c70e7184c0ce3271f4bb7bb7efa867db698fe7b51670450a1b8c00b3449530261c422fc001cb0d44a8000b2845d0dda130a3acda5aad103f7cd1aad20416348a2004032b9e2ce183329ad8810830b50d37ae04e128d639c362d406911b541a6bd7724388eb86937e6e0c418c8d18a6dff67868e38b36b4b4dab8d2ed5a6dc4a07d68b58143bfbbe7c33d080fe57cfa39ed6d893d128a4fc559a5e18cc2103b9e12762a0d1fdf780925de8747357156c12a71e72888a174145ac1370487ba2788cac35be24e7c8c7ff3436fe805bda19590b8131f816ad314fc1bca40b529660d8178c90bb521ce4228e8eb566e35f11b5ac5376ac3371a1e489136888ab4618353b9ceae8a8e2f4b3fb9ee8d76d18c266f6899c3056ee8906525d48412676ce122031a5cd1c4ea8425aea481c4982d8e8c102a228a1c518a2033068d21ac621628d8010b38d4f881862c56110819bcc8218a2e6f702922018a366cf0841735c071c62a7e71a4c410390041268a3756f142e28462a114524861f403ba487fc4db724a7c51524a29a594a87b79a8c48861a3cc8d4fa6f0f1a1c25a9f103c91b3a862085360d102086564a0cc1531d0a2065b0ce1051b42b0411ae307a327c678b1730c16239fdbaec586166c680142c69d8775d8a0a2b30e136cd0608ddaaec5c6136c2431660d30845cd085184238d15a028b0e6ccc4002118484b8820837c0c1145d6e30470acb183163e0d092c589a32c4e98d133edb238d1a5df3307c0c3a7a080737a816204ce6804975916923a17275cc307224499738d2b7acec7839ef33cf377629ca5aa5cb8b3c695865230a7e3607c48bcf71efc7b3002bd86585e8a278cee7bebc710b41c7981428e19d48882c309ae10ad32aa89e0435353533584ac18394146142c4404a1c42a65c410bcf400dab5863084a6ed5a43382345832add8de1bae9d81603952497e931c0ed5d974f725dc224d9230e2abd84212ebe37eed4e7db100751493273f399fb9b07a0daa824cd5595492c992a1a090000005314000020100a878442b150341e1595cd7d14800c9aae446e4a1548510ea320c818440030c400420000c00001919992320350c961c8f7b46323658a437d7048d7617a751c422f6df7c547c7373aba99a3db1df5c635641fc64692dcbb0081f6962270a1e956eae78e3fe8862663c9c8996957cb623a127d07c93d69b94ffad0e1ad0e6f3abeddc1adc925ffe8a6ed3a919bd6278cc6e47277c544d29b8ccc4debbedc8f8e43baa11d3331331ceaef787a27dae33a61b2b0242620524990ff9b4cd530b70d22033a4e84241647a3d391907ad0762b3eb56397949983487a3450b2949d8ba6dd93115fda31ca99710cfd1d24d3a135b742c42f1ab10466ee282d7d9ad225aedaee24e383836cb73462c9196aaf46502c4759e969db5d39df2f0dc42a44cea4e90a425631b45d52d608379aee247fe61871a31dbbfc0c1dc8aa4f03a5c948dc34dc143e3bbad9e1b6e3de34247e2e695caef4dc244b6f21cba7bd358c40ee9a4d392464399cc3260e89ff5089b9ec2773e74a81b38d6cfa30163ebb9b5871c08c827d831fe1b40f3a83279d442d6f5387488e22632372b2c2798cbc530f3b6623230821666c0dbd773f61b95f882a023e77e267ff4fc68f40e9eb6e7692fef0b02474c20e06cd79e3d2301b26e39f0ea5d2af9f8cf8a5c558e46d6696f9d096831b636667c8b14f98245e535272b93888d08bb63bc48f1ddec2f18d39f0ed3948dc68c72e3f9383487a68a0a41832175a744f46fed0c62c677624fd35922d29774e714bbdc6ce296f8c27f1b9866d9c91addaed9c5a76a24f9dd3bf97a5c8f8b99a946e102aa0e41442bada72cce47108d9d196d38e5e6a17ca4b163df2580c9d3d9384976373b935e49211f552b9aeff99de8c4dad44f429fb6cf164cab6d0604390725f2b1ba3b32d2bcc6d82250e8050c504052583685e2f8b4f7b817e313972f41441734e23a51aa1b1ed941515409bdb0013d766ca1d0113c88f7d1597f6cca7d29df732824bc3c2b17b6e13989589cada0be336ff486b2853fe1f16b91404298f3e6d7dfc78f263627bc2084a980e0cf06453119f56c1f05cb001796dd9fa96a1c519f50844e7d6509ce55d8948a9e4f7829ca2072c0660329c8ccb6eecc2af1b5f640f30cdc85432e716bc21f7c050993e6b37c5b343103b6964e7ef1082e9312bec950d56094548f80d230029d1dd200e8decfa870dee12a2f656fcdb31f9dd18b374fdb5ea859c404f5528839244246579257381403f43a2d17a4504960703eb9397c8bcd894bcace5418755aac1441326a382c2e64f1405fe4be6b98010460bf73c7ab3e46bb90b6e4a193709ec176eb6918ddac026c1595dbfec32cf39e2022c68ab1119c24af3b9d913f6d40b6f7084cc5af6e1b5f5b0056e9da4a9a97a30fd06dc2ab92bf8294cd5395e717f1dfde3d57d909696c81aeb2a3363c882b7c5fb6de7b4e7429c061ff37077bd5ebb22e9875d321107c0fc0717445a512e8e5afde1ba005ef8461bbb77f8147ef4064f38d16742bf45723dbaecc43c62c2eef10c9b4aa4829acc07070d3363d77e6c2ca5e4adcd277b084a8e18647799005c2d1ac090596d916b4d01e1bdac3973b81478bfb0e64d54a563a533e9533de47aa22faf4749cb33ad935585b10be04ae7b26ef52fb868baddc2689a27ad667a88d4bbe0e1ef8e0ab0fa976cf94a6ab8a17adfcf22d6c7a235c28da27bbf82569b5a4a0ac03e7facca2cd1a305a8e4c3010e8bcfce43521d15c39d1acf7de2653a4eae69b81e4677e3d40ede0ea24adeb8766480793fb063482b684c7815d2f75c56aa0f38f16d507b71b003b9643095890fbd7a0169f0e635f4db68dfa72efb9b1b6412ba68dce68ef462e3761dd95724857254282408ad7cd95e156dd556092521263129c1e3534cd280c6b49ea5692a8c8a70b5e40f7bcc39f940dd2030f09bff76fd6a934bf12e970626278fad56e9039169ac3d29b4e9a58901e13f0ef7b47fbf094cf8be859ac1f03f7adfd612ce2a3faa96c22f135fe7eb743a85554822e10fa74083c21621984dce8f7e90250c0f9a78ab2ab70ed47ebebe3c2c0d8e51d1b4627da94320988ea081cc6d17a0680e84b47cf7826bb5f25e43d8d0828d842c2147f56225d13110b28fa6c5b4337fb30150e0b564cf31bc0e4ee44dfe4b82c85fd17571502237a2ec9bff5ba1d18dbee89d4a7342e0802e6a2c41bb667d1a7b01374632ad4f4573b6b38080f7cd2c7619002a7126c4b72deff28688e49e1c375ed5a101721b4f37bc796401cfcc3340a0940e202259ccaf1b4c093f5035b3a61cb89fadd500da352e0d1759d3d9b8bfb0a04543058729180c8aa6a8b987b9edb0d6b6b13a48127662e921a52bc7667b5773c47dc34c303e227263e0e557d255654817056b7f77a246e7091a980cdcd8d36d5be57d5ff0167e7165bcfbafb84cc51eb3cca192e2f12266a967014e8c4edec7ff39d35dba2f70023bd7f028cdb19314d3b7c2fce67ec8d872196e25246de0a46087d2217a6f63b8e6399fa8a6ecee5728e166dfc6d571833da3d0ebb8521daf24de22d6997043cdfa5f610b2d3440929b7ed8a68e28f5618c52c07a18d0dd80df75403ac642902965a1358c1d204247b21fd1deca74ae51cff1a83d989bbeea756972b63a00ca28c8b62280cdcf2f746677725dd328a1b4b02735396f9ac7888fe3ed4dc521d9b28d137d8f0b8e5a099beda70e86a132f81b822579dd33310c17d0c4140f3551ced74d752a2facb2f8d334843bf1b8bd77f63b4c89d882b6a9526b49f2951337422e13b756211ff6d60f60c0156ecdeac6b875d876deda0fa914ecf352375b1c862bfaf2f4eb9cb51fc387028795b313ad2f449c48cf3aa3e6ec50d3a188b7ecdeb47b3df0afb6f1e7a5a7cac924cdc17d87b90c5c62d92c19212103c5c933cb6074170b88aa86e9ac78f79264bb3eb09d68a9f091e28d30a0112d37e5aa451159dbb59a8a1b57738675dd7188ec865e006879411044adf573745b48979d948dc33b32ac6bd345bc36d655b094ee7544e1d758327326be8764933c36d80483a7e8b7f967005c98e36631a4cfec5ca223c9041f7e6261cf30cc54d9bc875c2d6546b22a8f222343dd9d9bbbd8ecac875d5c23d45f441986ff70d3aae9d095c46222926ccb1d4b48a3fbc1e6d93d57c6a9812e3055a919f9bebb7e779b4e2dd897ec8ae95830298105dbebe11ea0888082c6bd9142ec3ec23bdb9d1bf11a3f7b821904def3314fb47183ce265724862e67213bda0ba93dd53799b4cc3e79a5414e24b21da852d28840b0649d533820a33ba89207984440ee5446db4a3978b0c176a4b7bcd8e0b71f152581161208ff554777836c9b01f573900290e649ad20925396c4b5b0a09fe473811634cc447023a2f56ad6093fcf0c5dd2f50f8a0d4082b3d838642cfa8e45bb9abaa88a96625b3593f8b9867e63b1a20275d301f77a234c5ef5c134471e3a9bf5aed945c59b300a2e4bf4789546294aadcd7918dce82cad4e3bbb532a26f6ac1242540d5794dd46fd8633d43d3f3fed91980a3281a88333a16dc8d5afb99cde7311a46dea74cfbb485ea5ae58e015bfcee0dc0505494d7fa8f76f881516b33ee049060101b75b2076beceb20f220fe59baf07f2aea9d9b8e8cb0836314ce8373d89566541e3d4f6d599b22db24992bad492965ef89760dfbc9e2cfc41b227b2fbc381df8a5b8f5700604c9c010f15f36126e775862dc920cc76d51e79c096b1f9606a4fbe22e377553f308d6492c3f5d619afc34b61c923455a4e7a4914fca99afe97dfd97fe8905f68a57363e5aa8a17ed45d027e0414a5751345a177d7f9dc0a0f2e039c55a21eaf3308ad4389855313c938a76e60d482a328bffd11dfa667f611d49f870b69565d1de0a7d2ad4d1dcf150e09c372b9e140af62b8fba1afe508d050d24446f7aaa0ecbc1805e592ad600219d75801eb02815083feaa2a77679a3ff218da8dc9b6fcf2bf336950a0e5068a34b7e433879241e9168c526511f090a655d9fe9445a8cb17b3d682d91c8622a0f2a32ecfa7ed68640d0dd2e27cdd5e2e29d5e924c1f2fb3301375b4194103677bd59723ab0365c686c0f68c1fbc8033131ef759e1a6c4a31ddf6f4f8565bc62b281b96e430a505f6dac0c8f0732fa2e0f3729fab0413c9e4d7534d8fcba21650fc2fd9044e7e78cc74fb4b7cdbf431812a2130e51967f351511dd68e58e8c82a2f282bde7111a8ed614a32076e6896f36032b50fc5146d9d6a95e3723406c28fd036883538d2ebbbba2f74513ebc5bcd2a440e32fb49b1ff80282871db2298472ae7a68711a90f75091d499d74288cbb03ce0d40cc2faf719ca97347578988bd34ee7ea62591b5da840f5000cac4ef2b5d15166b1a6e138a4adcf7b1b1a911fbcf515acf65f08b6c2b1eb805c684eabfa33c6c947c7ff439d16732048d1588b462a20d89ea2b536c1b70dfb5f742f168408ebcd7a02afb533b3178a32a51a8844c7a1433c6597578dbbc005779cd763b882cc5c97a3e495e0d0507236c48e72ffaac43ada55c3210ee5c5a93390275983d081736ea292c3eda824462986031d62f8026dd95cf278f9ed726e6c3ce72767433f79538090f3c0fcc6c0eb14128526a0cca0a6f6815bc7eda59c967f3304b0b56ca098c9131cfd7726a25083c64dd5b91da6cc5295a15412514b56481737902a5b100659516105c452126d99511230c336816d8c05cda3210641f5ef94004080f9e027e10d123b6cfdaa2faaf62ca813b5b1b6611a3a5dd9090d4fc6e85b2c0caf6411b7ac19c1ce3897cd134ff6b392c9cb7718a91299e7f997c1dd90b58de64d827c397695f0584315743425fd632cc607912766c7744db85b7a08dd2909b75eae12d9d3bd313acab6c16be55215de4d6e314f6094a66ed722662ce394d1734cc8b1976ff5ab58776f8ac9f10bb9913f55aed0cc81973a03bb587ed993d26621ad51b5ff64065a23db8bb74d192ad416145490c33303ec05b40605a8c7a623847551103a07a2a3f2c90233e190f6d3b6e6bc8a0ad8d0462706c55c9dc5608f92849d269c4a3a69d872a4b2f6225a814f3731d649fc68e585fc519ba5e1f607617a9c25e52f4f7cfebd689c0e08e08647200a2e2711a614a0d45acef2aecd2751ab717f8de055326643efa9f011682ee2aa3c87c5e6afe15b763551d63054e689b52e76ef21100b851d26884eec1679c7cdeb96adf063e1a7ce9d357aa4fb4a0e298a71a484a94a6a66401127030f3e0c694cfb0753c14d4781c38226b12506fd15886cf7c4245340c84138a56b2c9a3e956ea5ae5c219531f27c11d26870850896661bf2bed4fa64671edd3bf545afd895f9b5d023e640b8467cdf76ac4d11ae342f0b71d325b1b2e23017f0a4a06caa5a8193f1d509114973c62b08d87492bb9ad509da4ede46e5be98d5d48a1fa749f861349b3915e445b213bb746f6476b21b695b15333571896aad0e5dfddbea58dc065252fd6eff543c3a2950a63cd1f134713892fa84328480333df9cf3c00487b1fafd1e3c0ed9dcf1cb74b483de5bdaa753b8ba558aed653077049a88545e1c9f83a998dee81af042bc0368a4cefcd46526a00be3c2885be613d900ede7ace6c7237fac2861d7bb92b0e152ecfa668a5a82ee87cf9cf67a053d606364019739dd97e9e83685a77f5efab6313a59aa43acc280cb9ca1aae22c0c9f053e91846b4d75be39a5d8dcc6f7b0cdbf8630c9b60f8bad817134335e3a7bee0130b2069ae8a913a9158b22aaa9bad19efbb5178c68c517031ad28778a49d6c5ba4bdeddc111836cd5517f0cb8f260571de026af428347a51552731cc7cd6c282a8a78d71fee19c77104648d287c6280046d56cd8a04b82752b0b70e9c3d96d13083f68433eb717331d9541ea1e18bc733a4ed178f0279e3a37d796992b66de0bf24a605814c93e82121a4a8a982f29d0b6f49a636c9b8e393e9e6a34174c9ff1de540c341d3d804d86adfd5a40f9e4de4913949345569cb5f2ed61e316fd7ba9e8ff369186e7705bcbc238d151f648e6a9d9096b709df42e7b721d65ef4fd1165c990702ce9e16a79d9341a9c4cd3b12e1e5dcc23065db41497279a9acbe0b598af03e9e43a35a2d4c81521ce3d63cb7be7607c0184d4591a3e8f2e9072e37de654c85b38e33e221e56fa74f323a7ca2f63710a99f804fd24e1b934bb770449f523baa9cf23e988c46133956718bf7caa6725001756b0ee491f377ce64b8de891a1ad4df38fde7ada572663f1ab3c805b91bf9c0fc440942347986f3395f33fd6a31230176563260d9971c8ef06790348d8485e6f0f7bdbe4bdfe04fe8dcd69d369b411284002341cf9164d2ff02dc74b145dd3afbc80916ae4435b81551066092052b66a8b87ddc99476323a8f51c58c56c2d3f71f27f05fd894e256b83d757ad33a88cb922ea2d1f2208426bdbfef1c1a91ef36fe8b9d87529e3701872ef0b651cc6ca01436712384de5e20316d3456a90265ef8e9cfe13eb155a203f4c4162aedc1c54c43d9e142aba0985b4e7ae62f65e314a5f00661a6a72060471456c1215e8c249dcebdb9ab2004f8af8b2034757d66afc94637b7fe3569b048da797bef0d4acf08a8ae0b1323d9e5d77411b36ad11082c0660e28a5817371912bdfac5a0dab9b604ae053804bdc3de9f90fc7d129d393390d363b6a92fa4fb3cd29ef9df2db15654cbeac8b9118669167a097b4a48006d6252f50e3abcc07547caf124955a1dc7bdeeeeaf70d68efa10fd956c89a15c41baa11f8821d012808309cce47cab68e4ec71bd13424c9a2e16e0a39726a2502383d3bbe5a85456d5c291a368a73507535416a0f6006ab436ec127b572130d2b8e9674fcda447d65d48e88437a85baa5b288b2a1422caa1eb31b8aae1879d7de7c5be85fc57846b62d3b8b1b684beb2d07b6d0bfee4e642b3cd3e68efad306d824932090e12401c6310660688cf0cfd63647bc59bd90242115fb6b118d16b2c4690290811d97a8b113d6b8793d817485f7d46e0d0abc15454dbf5ab243b0797fcac5371d6dea105fdc060ac5e5b5d9060e0378bd22d13be8dc6ee28055ad99281ad081e5f7791f93c76fd568036b22f1187849632f13acef8640c8cddd3e2869849efd20520c64b330177130e1137f743ec4ba95ebb114567cdd02e1d3729de108fbdbd663cd431aea003c120c3b02a6b781dee05f0187d129464e7a583a4f77e35921f97d4a87c6d254b0b662cbd626b6fac7c0b997b24350cdec6aa9c6cb8c0a5a163333322dbc46fc65cb83ba557d20fa000db103ac3dd8b7d81caa684f9d16a47e8b87adc4bfd33836b1a46f4d3b399a56eaecb6720f8b07dfd0647d5d99386759851be5217c78dfa88cd677d70a2dc4e7e85c1f14997f854d512102b7e2e106838622be1feaead849ca9a47a83e944ee5742fb9f666d6d985f53715f0eb03b71184212d9cb0d547b9b46c5ebd9ffb79bbc000b0f9590ebd56cbe210003702f03fbef4cb2d906876a3ecf9848d37da14037833cb84b8908d507011e0695f10b15052ff8aeb7352e0fa1be7581b641346f21debf82e37d14a8b7c3294f722317a9b46b0e5a93a71aec5762905583a63573afde5ac7aa6d8c916932f8f6033fdfa22abe6e143dad2af030f6cd00dbe47486316abce9cd47edadbb9e51829c41ee03b8574ac4e95a73ae519477144359e8ce8b3074f237a8d029e77c5f40fb9168711f9dfa075a2d4755b5df8fa18fd2ae214dfadbc374064a119937d11122fddca764085f25bf98cc9797f0406a9cc010523e385f5eb63bc26785e4d6d4ed240040142989241825f98f215c553b7894a72aa8387e9dd052886342c5902aaab85ce3a41a0d55402d205fb2cedd60d226d64420ce2044f9edc9bc8538922498f86fbc7599acd816f804b5acb95ad34ffce1d1d845f5561773e36ae6eacaa03e721f28762dac9519b39caf5d59bb9a85251d73a53b5b300c61311a517807990a667f50b0d82eb00d249363514cb1a5c46b1b8b86437760d4a00f0bcd3b55d2daad44e415981fda297d113c0b84557ce0bef86e8d86edb811197cc041c958be869ba32e058df2c05108dcb0545b935b5e11e8741d049a1c8f060540b1d64c72d350d9ef8d336e3de32886f61800e7bbc7eedba5aea146f0565e819d908985544265730225d577566c61a14b2a3573828e3caa830e447ca58663c2b7cbaa969a4ee95bd75f3f568db1745bb797ffa9f0c530db042d1a81e43eef5e5b6e8c27021e495829120d5f9507c9287f1c5aa9df46917200809a11e42b5f221637b0488ce32881bf0ba98e53c6fd3b3c8da699a8cfaccedf1361d3715a14bacc2759ff6c720336b8d08f827bbc3ca1499f183f1e61fa6cb4205b3b10756227539986bd193a16c7a8c315201b9cbadc7b5433ec89672fafe1d664328e19a3ed458bd46a11b42f35c6a35526d854452eed4b87b5711e558f46c887eb9bf103d08ef4111427a0af07e94bb4cf7bdb7141f715155d2fb72aa62a09f9e08a5ca3f506f14aaf9eaec8df0c877f2da579a1ce39a01e681e54d12019dbb7df78d4789eb8acd3017f3517eb8ea702e4e4ca13f23450000a076ad0f7fdd744c9eb4cc89d237b77637a3b2ca681b7777722c95dc4d427eacba76038c5e520b431482f121a41f76e7a4519f6347181b9d1bb9a906154186e1232c22629e50bbd81a490287aabcf9d2396453143647fab4e5367e1fd2f5972671818076de1d8771b0285daac4e89de816a41e71204509643790a7306354bd8b3093132f898838a82d9b7f4bc1d828495e21a185ce69dc97480ff4a8a26a3cb41924b35798bc2b373e59e37bf972befbfd12e2cc3059bc8ab2a172f3c8a66206b4f4e2c12160bea25816b03726d8f508d840f9cbe52f0eb83d4ed79f68d333947f3a89ea4c8bb8e5607f7bb2d3dfadf23a2dfd34e37f87fee55a8d2b7e428137fd36bc192809fec1b1d045564148d8359f105cd9720dbd002a46e11108be75c83b892c225ce398c848ae6e84f01e3a03da93c4e17dfbbe6c1ea53754345f482f7a0f9832bb90fd473bd1fb28e9d26e9701f0fde2db4010a6112d245c5ca819c02df5cf717a78a5c74afbe0ff7abfbdb4742cca421a63990ec38930da218a02e2cfb2dd1515137ed42b53f3a1d9c590a6c22fe99b8e8e0331249367f3e5c920a18086cc757ca6a6ad37487cc890f2434c9d977b11100bd247b8037ad7355f5d0344abe852457f8ff4bb31f01c88ede6bc16eefa9db230c95513481d934cf3ec243db4953ae2990e6fe18b60f1e3e6e7f6e2ed84d99402c910881d57dfc2e8ef3a3b5e044c14c5b09f030fee1f003ca40e85b1f16b7bb5a59f85c561e9ca62a255f251adb7b51691c39af965e751e9ff079c1caf57939b203153d87c78c903f54934317eba6167e9928c0ae53e2e3240e0b78c6f9dca10b914ef324cc38b73ff5da7c1958b04def544c69f0902289893e6802d8fec4b30076075eff7bf271c11515f51cb56d4a7bc17da036fbb138666afbe6a77d2703cfa2363a87c50c5faa449c10ea1511f7f2283db0190f39044507935b41adc98cc4aed7d8f89f89a1e8ccd45b01581523fbd5837d3df99feaef3d9f2bbdf1908ec0f1ec04c310b180221222a66d18b41e28a58b62f974a7c747221e0353038c5e2798717bd660281f423d809129c9b13ac5f9cad2eb200141b4965ada2eb371853001171dc544c0e985b95c66c736b8783c64061bcd059180747326742337ed366f637d1af8775b96dea8b7550921c336eaef22921e48945d79c901c88dd54ec26ebc85a18d55ed50861d521bc78952a8757e9ff3668b99caa95ad3312d6a953498610055ac5405ebc09ca986d752d36064f0fcb3e74880f6e9cdb0be0f194f51eaf6ae73d6ab6f56ab7756ad7f16a923cc227ec32382726d1946a101f29b7170751280627e8b014f802758d742bea3e966a740267b86cc1cc380486c11e9f65692a2ad6308d3c736383d82e6f582a48ed7ecfd6ee6424001a09e8057a5622052a0574f38fbedae859da2e08ae00de6a9b148fa903d268a76cb045d8bcf710080cca6c72661086cd2a870205666d40648eb8524d0e5e7fa43da3e6f5412fe334e6e3950f5b68854b836b3c01c69db711a9f7dc465c4645516a53042faa55edfdb547f4ece763c6c4e45a049d7071266e8ded62ff2dc6c7c3f5e6d45bb36493629fa76e5cb18240ad245e2db6442d7a3e54db9a6ee6f25b6b12e9aff57a3cb93305dde63d731677cc6aa2cfa209a29687cb016cad77698b02c6f6d63c4d78878c87c92c569fc140200153ee5d449a449af9b4de0d4f032763c724889f40a6de4a76dce9f9850029a477aa66b358c61840b1c0dd03d0e2c8385be93ade4a10fed010c5f9dc5bb415dcec11ccafd8d0224e6dd975222e347178c30195c0e7a35f44d711a3000d758e2a9b78e5d84385756eef85c3f58e15cad57da015c20e5f09ebc17b6d4c5d36c1b6a4fa6290e66365378043c85e356f0b7a57eba87ec89f36d803e0eae0043b67b8c40b4b410047d148ba88a5c7062a782d6da39dc2f6c789f919555af3b78bd5520f6d2925039f7d7722de64456d850e5dae44f629b39105019da2e2a047f39ad613d02f0faee65a93ac10850534f1f321ac476185692151fd9df3b00e4fd468541a90e90b8d8e4e1259cfae4ed57939fd485f031598c306041a39384646829bdf878e6842e4d841546c3844c9b005a457acf934289f7381a44a460ad3dcb4f888f20c9b30550c3833cfaeb694f43f005bece655ed3ab014ebcbed4d7222fddbe462612cdf90e6cbada012ddf1b05475dd43b364e47fc8c246555f48af1f506b22ecdfd3863398a88e2664e47428f88819f202a640b49b220ec9d7a0aed312309662e4ea28d2da44056e03f6ce0a903b41d3bad4db8eaf4f550892792e3fa74d2e851897da7c73b9a1133e3a45a2dcab2b5748afd954bc9e60557b44a180c4150b81d4ad3c19ce66c689d948708ed2d2d650c078ac382581905e00857bdd2843b7db4e0908b3a2ce3c9b72cafd09448b638866b8e37f9bd995ace9af13d3034c8a6274945a380e680b9eef1b78c9d06c831426eebf8362af1b797165a7bf755959db8f7e8ea9a820c11ebff9345b089dba4d237a82c4a12f732b024c39010fafccced94d4825d576544e0565501ec7192fe41392622052b0e383ed45453d1af9851180743954e27093cfa38af06e7f175d626b523fad42379c57dba7cde517b62968cb59bbdf4cacb2c67149a686a20058c729b49307cda12075485d750178e3c3071efdfff4d64a34502e7580f5d62cc71fc667359844dc3677a1df8283716f24831109e1fe57f5a0ecbdaf9cac2986ad996b6d1b176ebe56b61cb8652cdcfd76ff0db27ec55983fb881fc2bbfd2b02c54c08be19982b5c3761bf342067d31da55ddc7ba072aa5bfbf9404412c81118df651c979eb10249cbbe321565cafc08cf36650fbb03064facf1044072a13325efb105b106cabcc7b768c051a0bda91b383757466c62a51d654d257ee335564699b35207acbf672d82db39c21cdb1063e1dcaf03d504634dc89e16578a0cce1f63a983d850db7e2f86744b11c73131d10d22ffd968022dbbb8698ddce4edb923907104b8501560d4af1009477f9b6c7a3a8583819c92d6597f16b9b7daac952a58b74ca2c0537429dbbdfdadb27d5241c975342427486c05e73349078581698994d5277cd94e82a4b01dce25b645275ad61afc00118df1f59c62bc12b2788803180afc778da8f420a6475ac515d10eb1dd8be92f00ee61b2f1af839ca21891d68141b521407dc2914cf8712617b3b27086ec07697cd70818bbfc270aa9e7a52ef5f283853bb69e89dc7ab0733d956ef61aad0639ca82f9970a32488f7dae2740bb790b7cbe9788f215161a0b8e2d1b3ec7a9a31ed13c29179ba46960cc32eb7e6046a36802b483bc665a826f3e678aa5b98756dbd04eb1981b49c50d114086df79ab697f9c85a6e8664f81b1061c0b549df7abbdf1ed94d04a4b38f98123a19e403493196a46eac4c1001118555cb122ac06daa117a2ff9a2d28453ec0a5955eaea20adc3e9c1d75f88892ccca7f47fb0a41ade467c4eacc50a1c75bb0d21e18f3d266a7476389033f89d094d4d6ad4ff78cd6259e4b5c69be60a0c0cf2d434a03cf01bd95c9508c2ba13cf47a0380ff4f253fa9419de7422f0de3b16f4fcfb1eda48a610fd46e929b560294d8957cdf841c8c5e605c8d95c3ad1586ef96a10b383ac8f3abaca08d7c574c75053559b4d6a5507026bdad54bd804a80d9d10b13029bd099e65b3f5326797085a7d382788f80924eaec698ad820497f6492838497a6f0deb5e24905b955aa0761c2e34dd9263a02707e06f64dc3a22d69929ca6dc03e3bd2f46f57744fd86e884da1d280a396d6fd0cd02ace4c0b30f635c761f2a8a6704a80447cd131436e27d28ff28411fcba28746975f73a8cbc12ab596c91f8335f3524d219bec385fd8e5872636d8dba0a395414f7cc59b3a4c6a8f90b7728a130c51a00f59f6f14303ba640f9b1944ec9f3dd1293d45a3bd41237b0856d18d9b4d11ed7353045f3ecd5c087bf2b7683ce36c58c46cab17e5267e77d89e1ef3a113a62468859c9c76fe1d175500d1462fa57d6bfd1bf90f7914f2139a143ab335776083c02c22c921a707ce8e01399e343e952e364e223362af102ff43f7a235b2ec5222a0c8a86bffd8429fa86218a10e3e3601a762d16a85da7889b08f3c1b9708ab40305c8b4716eb0ea0745b69a61a1fa448dc13007b84db9bf7074775ecb57e2022ce7a9c7479a4aac1e3f37cfd40e40808d07b06f6ad0255fc642469e1783694ff713f271a9e2bb588f36f8930ec972df14c92e5a43e754fe16434f4e94bc6a2bae546920581f5b29c669288d5a38443c44de9325aac98138baa95e3e4c27a9dbe8dcd4134fc25a8e86b60916de6de6294cf3b54b83230df0223d3f6438a6d2eac0d3d801d3dc01d3dec1e88783a791034a93834cab834f83838534ee768d7338c106ccb472801cd441ba0dccf6c47b6be9b3cd1f0eee63566e94bdc78ea9bd47f7dfefd19ddcb422555dc6e0dc8228e6838a88d0c17733b4cc9960c03fa0ba57b95f5d9dfef780faeae2ab908ca438922a44d4907dd615ee100fc8df570f6af75114bbf0157b9706b292389effa0baa844a317d122b2b10bdd161a0a8a5fbd57268549aa8dcd5e7516eeae1a52743bd5d7543f2edf3b1f2d07b6357d3dd6953a396ea69b3ed6dac767460ebce52612cae0313be19ad4cda059303903f71b66c0b24fb0e87273b599bbaeef11caa98ec1db8c31f299a562bb0cb6b02022e3b47b276322ddd31325e2fe4ad8582f37dc8841f25c606f4c29f89c744bde517d388ca5c7ebc302c0d2bce8305dc78836285b855e47dcdb97fa26712a3ff24546caf4c85d873321e31d7122152a210c3678a3a65247db8a539a72306364c06746ce27d8caba7ef20e7b218b53c43d1f82efa1143b2872a08a91d4b7a87eca1e6b6bf96b98a0cb097b3ceec6d4c1360c14a83011e2d8bddc24404cdf818e0322da5739677194e3c5b323477ccc1eac4ea426ab0a0c95b37b176295303a401c6c9a9dbff0daa47ab37259692f2b5e31b05a613496b141badd551b4e68c87a809a653458445b5a66a314d9b3a6e19da42b12376ad583a595ffcf156674f3dfb542e65616d43731420f5b19b69dd9bb2e99a87c30755eb6515d37e213a4ac7c9a75fcfc057da6c04cc778b5bddc4a41adb72aea934c768d711d1f66de1cc4a3637b76931d74ff638a87d04614d604ad1d070599758c4535de1492f0e6f166ce67ff72d88724351a7ad81d79ba5c3ea3290e578e696f3933eaeb9a243b188513f502697aa00625ca221ddc154610ef9d42b21b7ac160e4353ff3208b8f696d297f97a0479c399fb4c7da697b173c2f0f7e14dc2ee336b5304a7acc26827fa61d8b4f47aaa203cb0ade900b694c37e4a04b99032ee07166f743e6605c5b428b9eac8b48acf03a1aa7d017a72572b29b026474e74d11b8a409da7d7eb60a39e13870cf8d0e596c54c8a831a1404372fde80398a12a2d3cff2163503230731e763885a478860071479d61cc1b88da63e2ff63377444ca42e0713c7de3c5afa89f6ece5426c9037a8d8ed1e0dd3b21755f835914f50979d7b5710d342ad313abbe20fa4f85945b84ff8b36151221bc38f6ea15bf94b51e736e16c7cc1046fcbd0f4b59481603a9395af1aef6279da2519ae1f342002d89fb5be62a0a634f126d38fdfb2cbd46c232f67449d468a409965e93bee41cc51e39ebb3cd1c0485b0fc80ca9a7dceb311216bb50832a80abacdb02af6be425dcbb1490ea786033d0cdf0da805a430d2e4aa381f93fee4edb84df5037fff970cc348bbe48baef41c2ddce4f0fb9e410411b2277706149c0b9aaf94b5c746986eeecb8f7ca5d2d1695433d65733d93bfdb2da74a7af7ddf3afc4d20c472e03fe5a04ef3d239672f3c2debc0f1fdaf826ed439278e04d16c1fce679c7c70286067d559acb71caff10d32b914445a494ed9e71bd01f5c756a01733570d628675649e6ec4b918a810d761f3211bc4856826d055f28e05aae28e57f0c3de00ff38bbbc5972b793d535d49f6f9fa9e7dce5a935391888e35512b91fbae600c68e1a34263310732100374cac9da1421cdc239bec9a455abdb95504a349931fce5cbc7a727e74cb3bcbe1e43ac8d15899e5422156d9cc47e626afff23351541a40d3025764921c254785675ae8d22c86d8994ef856f6204db38c719c9f2194aeda4c79875626a2c306e7e2cb352970e24d8a2d376b3bb4490d5d3e2e5d82349c4240dfac93c22b456d252cf14996a006c805d6f04c0cca98947e2229adfcac3f7d46e8ca4ab59d418a147ed2d8d028513cb47be558893599c27b8b556430aacdf597698334bc824548e52c8d212588f288a15ecc2c28308ffbbbec8f999be98457a1e6ced20960a0bfd45d2521fd7b52b6ce8867260d80a241ce8e5ba62c1271285d8edda5458df46761a881210a4d56518a9e87c917dc014a713259bd934b5a35508aba65ca32fc6016fcaaa3c81b82a4b12221c04bce8f44e5e352f71fa31fb343b178ece68fb0ae00bde7ece79ad7055ca1231c6c9696febcd9be52ad4504c38d9c1e5c0164069c938e9ed7d7bacab71f4c7ccb4da6e4dcc9c1c9dea0ff53708bbcc5d1fafafd9b057e242f58b78d2d90a49cd9711311e3477e1049bc6ed1c6a5fc128ae38f18dd02459bad2b15b5afc1cff967e17cd9e7f823c6127b2f2cc05b82c53d5d88e58b3043836818a39d039788cd917bc937428a8108bfe2c5f0b818073780883d8f576c06a20fe1d7ccc9443d9baa21114467d21c35def2d568cfe04097d84611de7a4b4879c012191be55623b33de684757f74df17326229a33d49c8f4d6305bb76504b30fce723942b1dc412b94ed07502b42069a8b0be722e2c9100bea48e19f2e8bfa4c85435ff3a33ef2826d9df17512f701c67dbd2d3f66af8e5e3004dd13da67a022fa295ac9de94f56329c3937aa936f4af2011a2cd26cdf9248ec07e1397b0027fbccb053b946b80263c1c7dd38ae3e8c091495dd532a213816ff245d24d7dec661f6c69ebed3eb02dfc51621faa71356a1bfb890a54e6006c6b86303a871e355f7f1ad8155f047e4a4133186143c28188f686d92c65e1413eda1ea764012dce95942ec6640e6a703747d6779da5741da0cd24016afd7abc3c2f2435478b3354b2f0467bbc0625e6638652a907b723f628db0ed54936ab147c62369f39b46f4abd7a3bc70bda0fc86454e99fc3d07801f221b258f8c78bfadfe00f5cd909093092159e646bb473645824396c47966b20a6f3fe9c70cb8d3d0a99b542007a174e678a1d8555445ac0685c4cf5c3b45ac18d2cf4bf39766091964fce5a68d37faff80ecee6b44a9413ed8e9d4843461643b4a494e3f62b3b6a228c7dbe699b4e6c611548e15bd6dfb06c46f1ba28f965068c5b5e4bf61b2c1c450217ff20ca37ab27f239217b5f1643fb87cf09d0064714c1852616e2111c48fb61a1a896028c086f21f91d948df5867cb849a76952662d289dc7587bbfec380e041a168dc52a4b9d3993022be4c31e1ba3c39b520ed777b5e4b3676862d8b07bab6fce1488b0ea46948fc0e0c33c6aeadb194ebd89df79a8fb1a05a34223f7f89241f492b291c3785181188a2ed35978b6df5e381ab30237c3bca4cf52ad75b899aa7ce06f59b596d07e3adcf7b6fb1cf4774eee5e854c0ac177bb0144eedb2278f513436a7eee5b00ba9034c8158d00f202950734c99ae4f138374a218ca4e21106a5886f62ce02078e8e7668057b5dec4f7fc68eb35bd5a084974d30594442066413f8e2e2cf0b4622fb9b26af96c02db2937be80c0f2786189946d03f369e5b5ca48774c43f69e9c17b5c37ae318388f6c7509db15796bc3cdee7409dd54cf4d3e968ca62eb5fa4f21be930bce947b01583737d56bdce2790079f391c4b717f998e3c1e88b5be59ed244b3af295080dfa0120fd7f384007664345e63ceb46182182d7e1f59e06f645c81444df813c4a36b21bb95a35508e46cf7226bac65996a6bf3267a281515c1618cd74b60edbb9e1253d7b2c4e436c732b4107e231df176b630503e8d83e411cadb4f1b36ad68762b04bbe7699649ccd35a25b9dd5f00758b2910055c7e6bc45f44cb5ff8ad46ac1142de34018d9b8b9225844046a7474e33aab4b6ea132d52adf528852b711d51c4f93531db149ec49d607153d4184ff248497311ade95abfbd6d3f053388ac3a8bca50c7e10dc31dbad004db776550bbe3a362895000aa2dd53b20597f0668275063cd44813cf36ec378c88fc1a4ca53eb7ed7cc1299926626ed561792f320a838a7ec7ea277ea0f21f1c9b0c7996e4cc6fc0c63ebdc6a4e51b113054afae0d010f9a2eeec241eb2451f54c2430193ea44188d6e299ac56d490c8731e9ee16c54863c9756c4d5a5cdc5fc9c9bbdbc7be0d647dc93ff1691e85e72c33b8497914ad46089bd9cb65ff08ea95e3a159c9b74478dae82dec539678255e426106fa4bc2bfe7e84a62395c4ce7e2ac7c0aea65274ceb50878654d34febd4b38c0e70777d3b84c26b68d8fd81cae1a9703e72ce52977b0f569b8f8925ce4d372995ea47ed34d8c84288f0ebbf9455c1320e5b7916ba987384f8bc450fcbed8a473ee131267afb40ba1dd494d7e8c2f831a0e02bf67afe89e3b29d5cd4ad6060ff56bd70e6be71edf54d28310f20477f2db0de26c62ba67b57c66d78ba80813e966ae8d1e13ee00a052b8464295e9790207059f8e3af2af68e5e09643e153b19e0865b4b488094703cbf2a813e0c0f890813d8a4500ca1e39ebd87831cbca58eb7df43c6581c362c67baaa5ddd3c9a2b24078ff9d29350f73a4eb10543b398dd6bfa06d5fb14a7dd479d2c61d3129713babdc1c2c97a7fc1d00a2022fd93b82c1c5beb1c0bb6f025018dc0cc9184dfad39cd682c06c8e0bd317fc5e3a95c437c1f0fa3ae34b52115505524d09978b879d0ce6b9b869e9e6d4987825e33ddd4070a04c6782592411d614d326e6ea0ea0a742a91b3c1fe597d59d7cb98295594450e1c2a4c7eb7208c29757b119e6ff930184aa71944010ea830a664c8df964b9e0531b4c42d690c09e938f9a51ec3d7c977ee2ca1aa4b8a067b9f8543e4d51da18cb987bfacc2fa67d7a6c4981b9d83d6c36571884737bb77644484046ecb1db2d80e0e1d98015e21903c2f3242cd00ae3028eb3ceecbac3d1b1e3646756940bb0d1dc42db512b1d32da8716806733949c0af7fa0c7d397bd8411ae8edec86e68ef6d9e7d04eddac1760f025b6f5ecf50e23e533802ec1f71cf71798cb5e43f38b78ca3b15757155f7eaab3b7c1b3f048e52944c40b9f356bfad73e96b82a588370f48f3b88d45e78f4ec1c15558ad58bc580fc6f77558dd11cbf09a3b45fa60e1eb9cf3e53f845605bb01a78be55ed432c63f75556b92942e43de7c174ff8c3f39021bda24ada740c00bd318c76e8741ac13f129edf1f9f91c64c200b22a7ee59363628134112b861317faa2b9b181edb239ac0203f29cc089f792c1453b23035076dbff9270fdb6e7dd29b4f7bf4c742231454185baea8cdfdf825d640a45fc7a49bd4e219a4b80bc6e8ddac7a7971418ef76fa852a8713f67da1bbb6510aca2c701e8fb4abfa9e053096874093308f7142e22e4b9431497bcdd2aab5341fd0fe1d6c007fb07b0a19aa2ed4b0e980bba993e5a6328467f003eee3818bffe91a5794d1fd9b8acf3134363f5a0b106e3a6c2f52e51b8e8532a0fdd68be2bfa70855efd24b40951821e05fbeb3701f21e21271c6a417f63f24284e3dfc86d1d408f4f626f728c37b6cbeb68f2e352ef5a8abf0164f3e4744cf8c2cfe82f7caf88fc060b399932669acbc1e6ffe912ae206daef26c3599d771431e79d0535934ca105efd3d58f78f230926b097a59e08b0133cb60be8d8256a684ac214649c4177b68dbad86aa7c5b2ae321063bb420fef0a71b2d3679398822f056c5a696bcd1807934bf6459216e740beb6256409479fc4d39bb62117c1fb79218251d4f61fcd9ba9febdd6799187d86fca1f1dd5a01d84265b77ce7fa53a1481850de829d651eff1c8e5ac1192d8221641b9fa123b288829e4a6a77ef693c241507994e561379da3da615ca46a390c34c0c6917b02104359189e266dbb52094a98edb8929cb30cc5042f4b732628f43595ce37d95b139681c0ef0bacb75192301c1068e53d527887ab3f58bbb543a180079cf3dd996795012ab607fac00701d458c8b90c1d2f728b796b6c4155255e10efb6a1b91926e167033b3a46b71e9c8c213922cb0489afa347ef6e35bd03890764eafbe7348b14d56a07acd1ce7779fbf71096f3d7864a18619024456ac1fcf80916881bb8f622c2dccd560c81f217cf8420aa17d02a9d11ca253b430586a77b6a2d911e99257c78206bc058cb2238e14bbc8c133b167be10db23ce8962d4b5b3d5a701ca95d610e52187941e842cdc52a96f0c46a3e4a6a1758460c74aa0087f19f87bf962c32dcce629bb0fe88b7b78ff28f2d99ba0f40b3d6460629aed062046ccac792fcf9ff2e4d31147013763ded58b2b3c49535bdb13bcdbae6d4ce5255edf0270cb9fd75ab312e10536c17d34a11aad27784795d866a3c79dd3ba5594bf7a77b9bc50bbfe01e7a0a3d090eb5c315c01a809e7ca7b482b4f236c40db04a2dec78dbae86a59d78047ba0a521b0c2c5e79eadbf867b029eca07012e151e784699472aabca0424339c7b0c2ddcf3188edf836cb1b71cc543d8c28f5620820207f1686c7fd609f93eea9294d84e5f3144c3cc38a57dcc80a8c51ec4b3072810bdece64d51cd89d7b639cad74e3e381ac11b1ac1e6a272ab7b356a3ba71d42936178bd0e847b38c8b845505b74f8c17d4ba46836ab6da5f67a5ba5fb6cefabf43724a11038085a739a610cb103f2206d22db665d90c46c120d4a6c2f99f58ee64c21df979217407c5fc3eb72895c280eec1d9d201fda69139e0f674d8d37b7ee826d6e82fc5825389f6a675b7274dff3076bc86aecdbf2f61dc506b530b8b4f9012e980cce35fe4eb5b4fe9b5824c188d8b505a0037362f64fc6f2fa80c32eac40f9c82aa952089652ddbb65b526a00f28fb630a0a85da85c94ac44e026d912519a23f9a35e4b886efd7f699ae6c6941d43844a150a9f0e066692610f343dcc2c10988dbf2cae2e6689a2a04a0a51900897472a0459a5298a3d351ab0ab314dd546e2c9329936f734acbc8e6f0530f01544c924664ce0e4ead9af16a921f2e90b0627e8617d3d78adfe6e80d78818b5b89076af6a4c41f7de068230c85531119bd5725f692168d7d90b4cb9d10424fd86c32916154bc9225ae84965543c91b0cc0249c9fb37bfe6ef5121716f7449e01f7fa206dc5e80d903ea09b582306e370071f05085f305651028220c169f30a1d5edd08369fd9568db387f0c89e8b2817c348274cccfae1bb5b804c0ada40f2daa09684b1dc8aff2e71f82260679104ca2c12cf57be58ae9ae1fc383a9b0f3a4b6ee313d481e500b675e83420f9afe4692866c8e8846b919be69976b02e5501416e4181aa28e90f814290099de2e4fc421960ff99f191fed5681bb84f15522dda6e95556c8bdc8c25651c8e589bd69fcf66e644cbeb967f74b36beb362217e20d6e02213f7a46fd24cc40a58c6171e5557f8f0a155226d40772320476567946483f5116967a9335a28602c6b807bee5a9ddeccf33df23b8428b7aa886106d88a29a228b88308cfba31a6df8301c005d45f802d990acd81f507311de6966aab92f7cc4551c594d43d21b844b839c02490b3a2570006838333d0c2f2639519dfb6b61e20b54d7fc32039ca701345ef55ea704a1c4cca1806edec9b34852ad0ae2e576cb68dfd892fb88c1467ffe38990551509485577499d2e7c8a62d45116fc9dcf1370fe51ef1fcb99e32ac0054f4d56a14dd41d9c7ba88f748b248d09d5a3d8375c296472a40a96dd71b783a1624415aa1cab3f4220d02d480b5a92d51ff66587dccc93ed0d4ad192c67d8f7a06c1f5d3aef0c09ebfad489d9e6b15ff8558fd60f49202a5a39a2d661ac2cb1f3e55be15311e16ba3b21777cc9f11b83c639933d27a5fe167b7b0db739003fa4aee032b6590d8d262f37e7130e49511b227125b7dac8490e165cbaad42e3b5ff83c5ca6bddee75cf60d753b22d465950f3608f974e7af026effa6ab3a13b787204ebe10dcf4d8e4cc40f48f8ab6e78a5cb09bb7cb16ea2eb5d84f0ebf23acc9fc046c85717939c30a8b9ac29f19265ed2f1bd3b8632ff5b8a6c04609b0ea011edacb87403743f37ca5f45fd28573b6c9358fdc90aab54803429298a97bbb7528511bbc9495558e8197701134045d35592ad1085fc75ef07e845680a7e5abb51931ad512d8b475a23b32699b5d0e17b7c4d312404bd7b5111e8c2c75346fc0387a8bf60ca7fc933b20ac95342df98fa3a50ef6ae309ab7c64e2f6052486f0f69933e3b94ff24dae2fe0c63520cd72aaf008b4071a5e51307e06d3925d0bd4cab6f7322edf727b618ac148ea83a07b46025d5cf5eab8b7bef834db7656d5197ba4a9dfa0b58a14bdc1edbfa950d7c713d80d2c802137b054d609c312436542f957ba6aceb8f40fdfa411de0307e1f1b215eaab61cb026043920cd8deb0469a0eebbccc886b2289a121b9e5c0722852fa6d99a8b6d98403f9fd0f75b03b8888807c776e18ae45c19fa751171a89f9d7d4555d12a140114fa6fa055efa815f4ffdc4502eb99d161b895b3c3af4acb7c1c7508d9e8ac923210496aadacbf9f935aa9697b9c548d517ab0017ef3791892578a8af1ab5ac5ef9fa8a0da51f9b255ed59d5779b52066b3ab5c52707eb110d6bb74c9f4c26a7b03bffe206d8bbab5e01f4d5f81da23e6f8e4855c224e0cd5849b3012c40e6d5b09c34003aa04885c9fa10089e1b6475ac56350a0172ebf0ea6a8159f6bf465fc0cbec67c83a16bcba0463d7c5ac9cebe45d650abdaa03f0b5ad02a50551c27e5c6af5effafb64df8b0ce2a581a15b96d0223e1ba09d2b73179260dcd8f32fb02c306e4f70a2cd54c5b980075b565cefbca98c316183bb821fdb3085b4f57053367313bb8ffcb6e1645d1fd6cc6aa09dc0750279b1799c13bd78a9ac20203ac32a1886865ff2dc211e1a0f77d7be46b140128c644b58a011b6e7cdf14681b36d9e37a68fba608ebb5c2275d66a63a2b4325522f3ef1aacd31713ce5ce915035326a9d8f6dadd150d1aba95b05e9e59c9cd326f6f6398fc923dd1bf354969cacdf03f3866768501bb17c98400ab9321fea32b8be8dc7eb1edbe014e9d5de8708308daa2ec32a7af5b176767644ccd057fe3800cfe3814e7a3c04122f4f6c632b22f5971d079f37a6496e3b82ea3058e963d8c0e9567ca25ccd5af57c6771af2857a016028b9592c59b02e4b2931010c3fc64d474d63945c81e23b828c319c433450367bbff0e376aabd7210c5ebe3139f752cfba9028bb575ec5643e3de5d959fdb58bfdc41f8932275334d65d4188111bb7998e74452a57125bc07b5bd72cc175d732e4604a4e93b9ef6b748535f58901d6bf9d82218ccef56999763b0e54cf3ea2a555559f58e1a81483e1d706b6f65d31fa6b5c4513ea48829de365db277312dc0bab673211e44abbef7af6a9837222be7be196e7ee2a28fe493be721bd9fde84426a3c4d24d2a699a49f379e830bcc69ada14a9ffeac36445e7ee0f6e895ec06be695290123725c3f2fee0759e4ed76c85cdae3b206438d01944ca3b32299401e6f9a58c9848fb8d29dbec9cfb43f217cc20c09e22f2d3aaed3708c6dd0e40f47b1eb898ea0e3911b1664a01d0b7ac42c9fabe9adf91272cce28648e7d3b2e08b3342d821ee6ee3451e2ed0f9b705c0875eb806f481952d8b92cef54b190451a1c83fe89379ec019659c2a0606e4e992c1775cf3c43c8a77e3a0ff4496362eedc0b073717c8f55f8a70385464f0e0c6853dc035939c6ee0bca91005105061108eb88927ae4f9882d44bc65c8ffb7af23f220d925dd60b1434d6686b1f1fd536e2e062ca4ef4704cfd628d302dbba037691062b7da6b5c0b4d917ae82cef166c769d389105632cb8365da8a01bbb9538af290f96619b24606c8be9fcf3aad99479c17fbb5d6e110a3240bccf540491c8c8fd34157ae1ebf8e85613ef0f9f78fe36c5113c340dc9af9ab3bd678cc412f855d274fbe7c2cbe20bdd849620e22e0261a16e3bd659230b08de3f409f4987c580f00bc800407471c51d7c11460198bd3426c6c54ca4b3ab0eb83ae8335aa82e2d0c7ad372ca6adcf0394f3975b49bffd9e0fd36cf13016f49c07b1131822c2c42c5af4e61be6908904a38b2a6f712f75a6819e01996ba05cf3ad0cf5cb9aedaa418127ba992567d521aec5911c63a2ecf5893ab10cb50d1a0e0c9b91d71dad30df3643addc0f9fb403f0ce4d9712f409aa2894bb17b34ef88a0ab56444b4b64ce9705f389925b55c5861ad1e5014b7965059c7694d46afd98d423d815eca77cb06554f0fdc317e8f490419edf1f84274a2de88450de0e4a1c8a88553fe6b695d0b2f90bf16ed058af7b5f923bb2ef9d9082a06587c49a6f64bc7e48793c5c1ef5d19ea0bd1af197d8f96f4ca695347f2eaee6c323aaab3c450d5e32d87c0f86378b0bf7b98b2fb0c2479efe142a95e417206753a640a9f44e956e3eb8f4d3bc04b11a46429bab3d995cd7f26b42860c2c624021e2720d040c85a1e8f77b7c9b4273184a7ace839258a48f69b2f8c85f8f838d523efc5ac42a0bd1fdc3b4ae63bee0ad4e1b1e9e63bf2c3a8dd4528a8e0ff72104521544a37a12a7807c8ba03fad55e7662821d09981c31f13052f0e869fcd70c291b26a1fa78fc0ceb9eee08bbf0f58f805210335b9098472b77144182ef384eb3b1c3841ae9326bc672e25d39fc63df93611836c1388205939b5dcbb57c7c01d7ab37156045cdfb9160368efc1ae14f3d319523246386bfa8d239924a3658ebb4a779826ec0bbb45d20872801603419e913d6a3149129953b6c3fa9655820cb8231f2235442cfa78f69bb7304e78bd12fb51d0569848d4f80264b38ce21791950ffa46a3d8eb295f9a7418e80ef4a173443a7bc2b0ec9ed7ad7ba9fcb59e7e692f0ba1c1713b0e409e0947fa93be56f30d79529bf4b905a3ad8777adb040f35ce90ce3d04dacee1ea7d2a05d5f9917f2429924a5eef1e5fec73fbe641643c29b1b969e243482dd707a45aacf35f191263d0696554cb9a35cc62ea6170e4c7d24a687dc4f4b8ec9c89c07f426c8f8901bd8738c625dc663f164c33b48037fe69649b9e5c5c7964846c15f88e500064d7418dfdda3fb2f837e4cf08ca23f5892e7d7ffecc6e6136a01ba3087718c90dd9c67b5ff8fffd777bb25345c5d3f2be2a8304adc7c31f69aa140284086aa7572432e383d0ab37379e45c95778db31f202cc56198c6d13b6713f63e043b40d10f67af1154935f1c9fd4d004f3b47a6dffee3ded353a14692b91ab18e91dc88662c6460ab02453fdd6822caa28d3f42acb9bfaa0786888a2ce27b5f09dcaf65f979ecbc81c6cb296cae432d1af17595b49dae51ca22f01b5dad4115a068c7ac398553064f8b77f54e97dd5f47d168c362d97925f65dd55329124fcd4b94339a3ab6656003f0572b06961850923f276432c7a91490077bd1ff56b6e557c7d0fe4cbea8285d73ce90b276973ad2c5ffaba5cde524fd61b72cadcd1079c8ebdd586a26f61674e67b179e46d3e5c663b27f98135d1605fb253169373c04c2be414995834deb1a6d7328bb87f3a7625b4913f44d37b7341ad9e4634da8474ce2293e9a95d65988311fd2434456a33cff6765044aa581139b2b6a3e09df319850fa26f40a1a71658c6ebf3301700514b062e9f41e7c4d0f995871467a4599a7e040246b8e7926aeb141a08e38d9595e7a855690e90f87245fd05b240a45137f259c56fcae794e2fe1cbe661193db6648417fdec34330676c1f68434a519505529122961562b02fc1abe64304864e1794a92298a6293285f2b541fea3eb4d16a3b03072cc17bb05753f5b7ecd03f0a1f8bffca624c055553e2dd6484add8dc7fb5bfe33239c40378a8f9cdf5fd434b7780fc891d7a5340e0ec917503c559ace04455ad49bb355ef00696b81b710c3acba57c5b836249dc64afd910465c584b09799da656deac4e4a62aee7d670191e746d9f3f41e0f281c8ba36957ba8fc1fb885667de08fb439974a939d730ed2a60bea00c785bf7eee2784b7f0a1cc6c9d69787f3561be7b1612fb1a4e062d909f0747e3f931731fa86307bba13571df53d216dfb565cb521057d3fbf971f548bd2dde6215c820df5ed709eef5ad3bbd7da6b140d1225a314e1b82c89e666bcb2f852f9a86870df1bde7a4cb81059a7396246ce7e35aa65d52ec562845705fc34c6e40808bfbc814df6cb0c4bda5087c3f260c0a8f98d5feec48ef206a4a7791fe3ff267502fce1697f21c5ce447d6e1b63b36a5fca144d97d5ba3646ba0239993f04c1a88d2c7ca8d188e1cee118291b7f1c58da7a7b3b6942b753db570f6757c7c00ce90333bc2893a75de49264c69943576b15023f174c701de2ab94af34b016bc51d673f7cb87675d16fd7846f5318d01e697e6f20bdaf6046bfb3072180373f485c4f3a2b3be6181e6a86b9555abedb8f6c539c95ddc658e813868e4dc52f525f6170f09e5edfce2d5a0f7d2f17038731a0c7571cacd6e8f34bff9a01d3497c791e9957a38ce06766ba0b673ec484c32176725bafb323b8c8e87b8c5a9cbe31c9c15f1c7bb981bef7863163e0e44d8c2b9d5c655f9577368e060176fa27110abba2c6813dc352053810c5b821fb296b4484a4207ce7438565eba598c2507a8655c1ce2bb8e569219eeabe42603df0545f9b247384c5fcdb8cf4c35b5236710a6c2f611593260e29cd8c770dd2f41e1193b14f210d2d743bef055450f7ed40aa2a72af6ef0af0ef5b1be0cb82e82ded99c8af63a4f931d17135b04d5c62a6c1d1dbb98152dc0c977f80523e024b3fe1ef28173a4b3215b1ea2aa61dae62c9108384cad90a44e2245bd3406913f2128fb3f1a6a070569f2e12cd1c13625855528841b434a6b8d853123a8b67c3f545253c5f24e0130f01d50da1009c9dad5922fbacb2ac8c0da1fea314aaeefab052b9d063f40e8f87bc685aad2759538805d469a0b64ce3602afa28a509f9a7caa888bc6aef88d9f924cd43375a9ef115db37b071bb1fd1e63e6191efd4292b78ea896e698cf045569ec88b65909e25b5a245fd66507b1d53b129ffbc1538a47a2322766c7219e5453913bdc2f68c7b91321d654a3efcd424a1103a5bae6cdd7b2fbd9b0f580d4fca49677eb7ec4a88a4cb16bf4e93bf1c79020345e6f6a072a529854d825021936bdf9cf7386064e52fe5c8bacde7d3f5565005767a4153429780bb1ba92f3fa47adb116c8b73545e47eca31e0ec29a4c5355b3bd28c04f0d3e29485b1c9f1ee2a15aec4363e1cd89d632b7c7bab39d1f1c138fcf9e38b8394f56f63c42f7bc099cb9a8c060695be1c42aaf37d8d0bd4e6a4a31d008d0d250c834558e63ec6ec285f1d81416736c257ebf690519822b4234c11ede7848702d38eb2f217701d9f83716b115bdcf120500212cbb0fe7cfb31b3f80b09975b3df5cc6958150a964f64b96a4477be561b316c5676205d2de321c2c2b7ea524b4a2ebe96e38199e576629758c42ed0bbd6e4b079158cf4030c992bdbd2927b84b74968640f244bc348f2a9e48440e572f3219617ad8115da881e67e845dcbb3446306d0f0f732dc3a1666216752c493cec57721dc8084ab5b8fcda21a5cb9f41c6adbc55796962b10573e2d43afede174e5835ca959cf901403894deabc20c84768c0f82a664b037139e3f0b34e2c16c6a0edcf5cf7a5606820c2edc26f6d002535c880f3e60072f2649dfc3006f368697d9a7d2933c9f32db4d2a229d8514aae8f8340297437f9dc91de336a36efca02da132c3ab1307e7c7468eb69e8aaef68318001a1c0b275f3ec7adb85fa2d4edbdf56f850788500dc9734801dbdadbe7d5159e576490d1d0c609ec5b23ed77262c6123968785e0b422c36573903af11c8b498884bc1352f3e907f9faf6af1324adcae81db6d601fa16437278c50745da88eb88f942d766f7270290cc47054dd8d7763012651706e64183ae75728f038fabdebdab9296f740e4b6670c6336db252180b56059fdc68e04d5a18447b6a878aad68e76346127c6842e2528b0d7e8bc831be3f2409866acf474c60667f54192cc07f581893c95211a346e1bbd87c36c47c0f575653257c83b24f120936ac2a38f4b1ec9b226effa636820f2706429b0fe136214afa0170426441a98319323e28288b7810e6c2bc214ed9c36a656b644eab5f2d042e6b829b1fb682aa45a4bb33d09efa9c556d778dde09171a2ee54607af56cae54842256af39f9576efeb36839dd059a3016a037e06c8c70fb7abdc0bbf1ce03cb95a398b0998b1a45b88368052ecb2785fb4b9b0bca76446e98de9f69073000f9eaf6bd6ca7ce0bf6bfdeb3774716463d14233ff765297642de30ce8ceb3fe612bb6c52c2fdaa985474dfea1e4ea02fccc9400650ea9a6013c40e71391d9f53fc6d191c92cd6db4a6ec2d35cdc7b6408a905f66d055585604f42e4de336f53e7604ab331880653154a1d8e45d2a93ff1f7a6f1a2352af7e10188390a05184aa51ef16b3fd70113ac1fedf749d0fd1d3992b1497fb2f909178cb770347940b3c3dc84e5c8fa97b8f901c175560efdff9d5dad14107b06b20fd67721c9e638cdff04074409ea62386ade11b212bbe1b98a481485af68ee2c159dd1aef237d232e27890dc3855067869efaf3de0c64edfa23f4b508472b119392411ef5df5e2dd49179d39a55f227be7691e418d033d83d835f410afc5a694e352696568c16aa6b005843492250c21b93f04abc78457b05cdd6215ccde9c71a106d27f7b87d2e255402ba39b75c55a48456977e7eaea9e2207bdbb0a6c60819308a5e4d4a359bcf2dd3c0c699fa85a0118dddabbcd43e35f227d2a311b3621108e80ecd311919a95d53b8ef12584ba969bffe8bda2abd72e2457610e46b76633deaabf46568ec68828416c066f3ed9bca12049b61b7b1e9ba159c0056ee20a5088e816062b851ac632221c6b8662f33ace7da11786750c37271d7e46464d60b5b5301051f90049c14fcf9e9538d3e9f29bfc478c8517a6170e96cf613ad471980d66e20d17bb6bdecc3398ffc92a3fa6f1ba6ee540e92560d4612aab4cea3ece2f6ea8da8739444718e1672b0047b44de1a8cb2648f4e3892ebffec1f836dfce9393a411191ae43237518c10f1ffd18b7b2c8b051dacd6f83d51f80a549eb60ffa3cb0420f292f2bf90c4cf157401693b4c945303ba655320c2802ff6ed2ed542611d5d7e2b59e32396ca359db40836a0303c7b54022c55205b540da08672281260289cf6306927438f8e6aacc2714360a0f752d839bf65e68cbb8a045c8ab36b791c87904aaeb579677f18abd7d96ae20ac4b689a7ce3939f736bcb8a8a40b6005f1c171163200ca38e7699b34495ac69b13726ae7106c3c7e7eaebd2a4a0895970a054e1d8f1b1ffff9af04a9ab75761cff73d6d54a7f655570eb524bae6f27c93e36353e0cc14a8998b3f6280ae1755097e8f3876c112ce31a7cd7b6c53814e51603fdde2ee16e63e412c80c991e4215ba616968a98ce9d120c7f9f8d9ccb5849ab159bfc20e4de6b22534c4cec9c74ca9e8f963f83de23aa095bd473390465c42c8db3090f62beff066ce1d9e8f17cf1230516c9733016e674b8b1f82717ac9b97a2963afc854f4e907c60c2d62f25128bd66910c130027d85b06d41eea6f61fe6353bd73ddb7434676b9e9faa4f29ac5288e77962435d3ff0413d96251e900dc6996f7df4af7cd4a7f2ec76078e832d6556091f3593bc34bf4a62214e11e57f87bd13222687b7355e847e5d457ca8dd0421d739645e0324a4080437eee963ad7cf6397a8db8630cfa1d800f7a86471c47e37bbe49733152d6d182ba0953d3216bbfdcb57b02e48204db905cd28cd974f2bc010a555c0a0b244c629c00d7874c2f7b8757f99dd48ebc555f2a2e7862ce114e5c6c706d95476a2971380d56450b99a476aea5be888cc58a80da7efb82282100127c06201f98e9d2faf88269af5e7620641fe02b0a204190d028314a81073c22448443dcc52188779e29107433afe36eb2cfae376b083d2042c9d046d705ef48608c27c220906c7cde9149f6e0090d7658a9170566a881c9568e8b9c65c45c17ecd807d8aa19f266efee0672bc6c28c6ca757fd2c483c24a0f3cc7296e649d8fff8478adb1cf9c01019f762fa6fbc30c501938d37d617cc0a16b0918c93e290ff7498dbf5e0fe90667d54785499bccf4e306026be62cde471fb456a6198edc7b4b6113996c1b470a43c07381c5ac6f42c7dfe2059bcd818aabd4208950a497e90d6115b492597d3061a79b36bf5f3075ef569ff08980c03fb6cb3bcac0675c9a5a15f04e82fe27349433ffedece1549b09c14d1507be66d75c1710124d0e9480c0eb903d25f473cac69e1e942c30c191e031d1c29aa3e27a68760b79348de7657fe83fc485990e0aa045aaeb1a085af6dc065c6c5819fec1530731e9f18f02e7334f336df929453f2183347a78ae4663e8e6da3e3515d4fd48826f4b4a2b1f4615d77ec717986b4599244d27cbda362608f6443ec3b5a983edee197c9c97a5b5b2cd832bb96d97c9506d87a3ba0cb69cac7dba8561b643bc7ec8c39a54949999927b90c6b76ab498907b9c4fa6f277934aa67dcc43abf7485ea608e815fdc17ec96086183f905b50051dc0f14f7577f92051830e872df7acf772d270aa525e51c3e4a90ab7304b6ebff881861611fcca7e06a03f15b04384d184d24568cbd92a98db68b11118021590f1993c0e746197b136bb1b95d4c0b1c132c4af185a5d3b4a6e3c8d5b7d573e0e8b2af1a010d8764f6cb3a181882ad79fb1e86e19b41ff8a9bc53b096240a97fa91b3c13684c7fb5ea11f9209cb74676cb29390f4478f7fa71454e6eaf7f58a0e8a913db381630aba2a01dbf783d2b6fb5c1c3e308af5ea46d62387b87c5764c0e0f643c8379a40f2efa7d8166645ac23d3ffe3793a3fa249564b113db1a8d4e1ed466adf918fdf11d2728d0cf9276d7d7d1e5763b7bceb9dcd9c4f1c3636f95d38829157d309a7cd9a9d1ab6b72a213d00d1aedfdb9a40dce30c2ffa7b463398106417a2e6fdeb16ceb2395154c4a1c1e4ab3cf06132cbca257c905adaec9bdcaf248e51546b2d1523c44cf09f71423addfaca9cdb3766aa36d8723d1999001339ad67a7536c2e2fedd2c49c7438ade2a3172adc35665f14e031e7f5866e68ef26ff567ec25978920b5bb02f8b7ff061b6b3f6eb278a9a8d09482f8d2c06a854d4ed39ec7a851da71c59165f967a180b90556cf1a42c97acf3a4dfb78aacf44ec986bec3ea5025af7a8d2dd923a417d73519dd7c377025a983d10dc8093b2af491c5d9473c647f84992a00203ffe588235ffe33ba57dd0e7a7447154abda245c818e549289ca293aae8bd7f1f0a041f0667684b5e909b0376a395ea4fc6800197d3574bfa4b3b6cce25d7f77092b5611d40e19f16bdc61ae4848e6038dda97a557b7ccb36a092f4bd39e76cb4d4873d629f7fdd139b9fff18f0372c4c5011a57b14c5a400ca5d506bd666a95150415552251665515746931d888454914c16877b3f0bd6619c8d960048f8a0778621f6936a17cc113d84feda776998b23f3cf73887311f43777f9e21a4333469223ae2afaa45f1aadeceededc32a59402e204ae0451043c229ae4dce29b0db516ea8c6cec1d86b93eb89464bd3d536e1d948b626909a938c4a3a7350be624098a8021f7e4ed855adb74e69a8db94ec25a1b5cef8a2cd76a6a0b8ac6529b84d42a1972c57adea01239ad5609116d959c7bf53643ad253b735b8c21096b5d70b953594853ad0aa89767090ea9051b72e97a807672bc7644bc22e45aac373786dadb74d6ce8db94e612f13d71b22ab8531e5828072732cbd2a90de9ba1253d6d0e1239374888a8911b7a73c1d4449cbd2dc688612e10aea2acb7046b4e8d604da8360a930ba5d784d095020a0bb6543a372e8d4e885749eeff32581be7c0fd9fff5a7bcd73d63ef723e79c7bb30c629c1d9b13070409d349b04c92d3cd6a48319d31d6e137543a374e3745419c9fffbb00a6b6e997971b133beb8d4d8e5a0527ddc01bd42dc2ba41d85fcf556381c160eff95e0b77204d0e09c7337a22968bddec58070411cab2c3a0791945e879981a10ff77016cc511df98b8b1417f8e8155807068ab18a9854a7520115854c6c0a01903694e163814cd86c898c636625ffb629bf8db486d1b185f7b950fd904c5363a3a14fc1cdb0cdf9818267561bf2ccf7ef9cbb28c51792d911718cb52e8670bdbb2bc5e95699a2e0936c66f7fb8f8bf5c7c6b547cb687014c8fc7b62f22b03d0fc2a786a866e7ff60c0dad2bc69d4d0ca20ae8143fb3f93ece7b8a6eb933fc7355a3ffd39aea1b181549f605bb2577ff95b329c730639b6d1f939b609b2a028c6896128bc541f04999871548447108b19187060278eaa9c8da8023656115be954af53ff3906b17334ee0ca3dad35af37606ad470f6fae79fa735e2fffdabff9df3d6f4e92fb243d09af1df8889267dad394c50390598e67e27e5e19a0338cf63aa36b8794c350e9065f5fc808c81bbca85fef51fb778afd5df81762469ff6558873357a6fd54b8c0718364c3c6344c89d6149b227760cd2aab1e7cff1ccd76f89b05bff45e5b5fc1ccfb4f8e8cff14cd1fff5f85b6ae66c6e928fa6d65aab1b86c7d330d71b4aa6582966774a0256a71900f14c50279e015ae09dda7963bc325ea81732c0201c5b51d1161b4da7b141d48b10422357683e5e2b327548cccbfb82f702e47de1e586ae906c4528658833f440d8130af3140208f5131ec34dcc5e1ac630c590839a194da670884b9014eba6b8b6ce540041abe2964a116b3214b30408408821ee06941798168c2928c0c096c4b07a8263d8a396b4d2d4906b585e20ac4b85d9898aa19c8db6a105610e2c618de1d3d002612ba431d43eb28e010833157de388aef20469086478a6b5609a0c837c20cc3f86c828d3c1b2c724a509121e693a9e844a464b4929a0f08852250eed33884486150887ba866fc30208a3402de52a430508cdac8c9e5474151902e2c01b5414504a5d985b5d942e83a8a54c0cbf869a8a8ea106aac886708040517139888b273f268ad4e024e9e93196cc0a486c69f9c0592b334163e608450b9e2a236f1be8467428e22a7c1bee18661092c2b9a1d19045b86624972181030280cb8927a41a021982103b40ee917968d8195a61a0a4ab0b710c0d200cf209739c1e91f5e6ab1c660a7b0cb58f0642b7e14e28e2268636db1a66294286aa90a87b729d0ea3409873fc8052d419ea201a4da7691e3a6d444fc962db85e6858e1b3b9e44903d85794561c27a62925197c5f62762d60a4d940434641a52e0282b641180de7befbd9b63efbdf7a5b82158ced045185535d46efac406011ba8ae3e157cbbdc57df7dda53e8a967b9ef2b2babe9f58ad67a853f981ef52b47b486de759ed3e9aadf7ee7b70aaf3bbf0361c3e88a2fb56f056e397df7abcf76e29c2449aff63c97e77e5be7afb05aa2a8dfc1bfadf33b497a15f52bacaa6589faee375055d1b613e97f7b3ba947b89905b7a2154944b37fe1e798e8f457f87c02fc1cab004a7df5f3fcf6c53fc62d667e027e8e59c4318ba098d8246641fc69309f1ef56bef9df4be0fbba7bd939d5c3b597a725de1df0e7e9dc21ffcbaaebe72a7dda7c1bde13d02fab7f6bbb5c38a5ffdb833e4e0ced039e8e206ae7893c5a769295302edd7bdfe4cf0db44fb03efb3c0ada3356c5f6e9f95854bbfa335acbe57e0f56f7f9eaf60072bc02cf08fddf0e7a99ed7f708bc0eb7b078d2af7ec33114f8cc29ec0ddc3abd2c77905cfd8aefa7bf863f68bfe2559eefa7575f4105ed49bf6effa184791edd9b47c1595cf1c578a0fa6258ed7f313ffd5b6f9d0e2bbe7b32f5db47ae90e5baaeb0f6eb4ec324f4fe07d377bf53fdcee77584be835b4e15fe693f7a76ddd11aba05439684ded7fe4742ef7b7385555fc6ac3f76ed7b27f51bb877faca2145637c1e6c9871ecf0ded11a9030054d616ddcec0930ff637feddf18feee38fef6ed86d15aa9fe798c959c5c44acfaabb983ddcccc9ff9fa2953c5c4947526ea867e594239e978314e6c314e3d86f41b314e305d149d8d5f52f8a513fb739c74a207766e25ed00936e689242d8f47a1e06c9495b86c4c4158274d6c991c32cdbf3bd9f63242e22696e615b96d72b7b8921a608034792ea61919874c8916f96ed792414ff07433221f1dca047743de7d1131db37562fbcff1d1dad1184f3fd2c1431e6101c7a32a1a7e145573e46473c43462ecf53c4c8af848c7288e2635cd12b6ef907f7ec915384f2fb321fb9797b27d7969dbdf3da97ed2b3bd199c9748b352905252f1ef3869ed6f19ad4d482226c530cb6012a040de20048ec1e7e3580693c0053c889140052e8081f65ff8187a3fc729427cfe734c54f77fbdff06a37c9787cd8d430b1b7b757ab47539dcb16289a89745139a521091cbd5e32621c2798f8840f898e2c48d4a9223223ac4d6b85860b553345a2927b767450d613be3c7ed1ad2f11912d11ac5c9397183694945daac1f2edb0e9789d6bb34d5ca7872636154f403e46aa1d8114241f3cecc61bdb9444c5c2623af5110baaf1837da15556d540c1a4b6e7ce40e117a8142c1b688904d14dd1c14a43517ca99ab33e4b5e1d13689816cbc3933a85cb47149eed6908f899726e8e6051134e3964969e5da5a31246d64ae52987ba6e31d71f50aa55c1c2f9054b44c295a1fd70628e7085088768c4a8826ee50899b53f692f0f1fe74b93759536ad480e1f220b66cc376c889b7e6048937c589112e8e9c9bf6a4555ad27299b93280b840af76ca56eb46b504256c41c4c83511b4f653e2c54f4d55152070ee09b5b6ca919728c45501e6eac07165f50ec9689730b94f482b5030f1e1c9f201a6d5a588d2b6b1b946d07a8cbd2e7ab85039aa14dfa428f7a80987d28b82a835d2e3fee8c1a1d203e2dd99e2beb9b92c92bc38449088b95f5c6f5852687c3959ad802284fb09a2b3c384882872ad9037d74bed153a238eb93bc25a70a165f5986abba0da1b4b4f905c29434d7ada339e9c9d5f66c50ca11f6f3e8c7c72d4309201daf9faba91a2470939fe735c4388c55d74dea8b62e1951d2dc682ef031b5437783c91551108da550b0f8702151c1cf710de0577f8e69cc95702921c4a50410979e586a2ea6118ca566e2a8262e265c7cc25e5273977be70f5b257b461b36fbed5d76d8dfb8e60e5a3c6cdfbd0923cae60ed0124e30b2e40e523f8e398312f4dfde7fd3a7805ffade9f8bdff4e5ba5ffa5a3c7cf0b7ffe0839f57929b886714c5329eb25976b1cf39e7f0afbb044d1df67fbdbfe319523b9ee1c4a746d693a4f67eb4f049bf7dcca17c41febf95df65e8e40b3269bad0b0167e07be1e550b5ff33d6344d65b6bae5d42b8cc2ce0adb2f7cc7eab04d9c01d24c918aa2b7ebadac0bdb3833b08f5a6bd4cb25a4cf3567558184f45e62ffaf1535087b96213d3d7ff4cf5a9fda94fad4fdd570ee899b3573768dfe9f5eb84d5fff4644bf6a7cf2dd9971ef566864798f2c77f9ea7cf1be6f424f47ee690b53f51df2bc7fe2ea03e7bd593a07e9324c95c9e1e8547203fead16c7a13f6645a6c09fbd35454baa8b5768653776930edf4a27a406250f97ac23eafaa5fd775f5bc9d01f5ebaaffeacb95c3ba7a4d34555e6f67d87934af1bac78d2eb980d43fad2e7010821e8578dfd5df8a457fde9773ed4afaaea4b7d89a22a06d29fbeaf1cccf344778ae485f292fd0b0c063e0b7a3f77fbbd0543731ccff3dcfabf94355430dfc9dc53599d75f7a93c18180fa3e1cc7311c673df39f7fa37fe0cf334df0003060caf1b8be1979c83b033581f113735899bc0e226a29fe3269dd88591ddfd6ffbbc7de687adcf9869cadf5e771710ec87d26fff1b3f7fe1dacf51fd1d20a39dd81cbf98fbbc3c7de95fac955a8309fa9fb07dfbb3b903766730617f4e7e96256730f57a7a72edd072c2a6b97ad06b044adf1f7f2ecb13cc549726947d5c3d8c33333ac3740fe4ae04fecb178ed5fe458a9e3e853d7aa1e7ffbb70e6620822f8f4cc1f047ec178ce2dc1f11798d1efd5030aab1be67cd9580eab177c2caff7ae8d3f56ff1283df802c822655be3a20ff16d4f4a8e9496ffaeecfbd2b7d4aea71efca78c9e9ffd43fc62d2c3862cd71ed406ebd77dca7a5cfb0aff44a37e729499224e94bd2f4325febd2f78184f9596ae66dfaecf7b8c24bd0704b87fc35dc72fa0fdaf793fb7eea09a74f8fa64f46fd239c96690db4e79c4b45538fa45935bdcc373deaf7ba7d6afad487aae9ced721ff1d04e09d1ffd0efea55efb75b7dbed7cdff9ee77f04ffde9571fea41e0da93d0fb26bc77f82893ea4dc6ae3e2a1ab9926ea0ea51b5f423ea555455d17606b44c570ee8c87d0036bc6e5fa266db97e84f5d7d1f2af813fc9d29ecad29acea11ada1f4fab7f75a61a7a27ded2bf8b4dc7aef5dc21f76be82df288aaa4dfeafa3db9fe06b947b5435d31a50bfaa69bde423baaa68bffb122e4b5ef272077f402928cbd2ebbd2bc02aba79befb92ab66e8bafe4ed82ada2f3deb5b593bb015fcae64e1f18fe57a5b28617445e19f562df0583d525600ffd81e0b731fe9d83994724ebf114d8f2ae9ab20291fc18f2a35284275425136948abc4189d1f3c3a3d5b6a2ab88257b9e304b80fba112f368414787aaa059a3018c02b4d6e55ab6c25604452911b7881b26958d58c2d3d326b4c97adc6eb3113246e6a20a0f2659363e80b668b8d8f1ca1ab3a05361814412f9d9392cc1b5f4340704880c10060c265f3b8c4830691559d1594b6559961c4d0ace0d12ae242b37a11e60404a40a46149596d28cb7265cace37827c0873204d414257e62b10664ea8562821d3d950966529c58f6e1cbce8d1460603e8880a90144ee29430919ded7a94b35be89c49ce058823b7ada21c352184a411997c9d708232ec7c7b1344378d8c4c967893e984056e25499254cd22123f23c134a2474d8fd50d0569377c78b8e918ea29b342b074b8dea4020e890a57124d170823886c438210915145e5dfb4d01e62f33c48efbd9b63ef44bf43b5954f58ec1bd30949f2e252b1c974e26149dad8578b36291f2c5d431bc12646889028de94c1b3096f67004c095cf1674ad8164b1bcf4d90d98b1d27b058f0dc56bcf4cefdc8b52bf4de47ac24b286a391584624c92b7bc78afb9d9f3d6922685c379480f0082e4d60c892a0baa81c39d8aece766d522313922449d524b38486d8c8ac9e5e9c51fab304d98b436667236a79b1e826620d1a0b92244992245533587664d523879a150e19156d613b926cb1015d317df22ac74a5f8b114b9b32054a4884949094b823a8153cd8acae944a354d77545324848a885b114a65f6a486b58218a7c784522393a5de7b37c732194a47be86494fac0050d4542c73c3a2319c33971049922449922449d5bc2a2164848bc8092f1b3906fb02127c1216262c1e2926317bda075a664276d858237a2102dbd08b2aa709eaa728f4c9225957d2af469449325d4ca466cb460ba11d23143f942c89184165455283c6a481482d048ba7e7213c9e65f28d81aa302c1b2c9a7c29e9ae25b226b31e1a2aedc4a3292850ea32bb112705213262da716544c6d3568ebe6ac17baffabdab2812f9195133f9e171a1a605ec92616a7aab296145f313e32ae8f77e84dd2cb81fbd4a5d96a5af862d4bcef678999363f763e63c63513352f0a8e1e9c90166dd242d29ca88b16e8cfcb22c7d4036b3fd49ea81d7d1c9acf0c09110ccfdecf5ea61ff9f08a6f6de5b6badf7d67bef03ec7e32c453eb679fbbbef28d263f33203f59929350fdec8b0ccbe4924c6532a62ca42c7bd1c83bbeb2102265713ad6eb08bc1a651c14e1008724cbddcfc39651dee1a581d78779f2b3878fb8a8807112001a2f162017250e25e4ab1910ff84edf5dfeb08bcbfe1df07c4c60bbb1f086cb09cc85096aefdfc83a3bb5f08c0cab39f3d5f19d07ff8da8144c180bc36a0fb983e3af0a471e4e338f291f371e49c8fe3c847edb5fb7d1ef5b35f29fedcc1cf70d61af8f297d9ba249aa2da4ac1e6d8aa98632ba79fbd39a4bdfa80a20a54dd1b82507df5085184baca5e615d61533576fc1c6d1832fb905c15ff0a3fc756357f6644de577155dade5725d828e2c8649514550e31f2420c860d338e56609f732ba4cf59cebdea52c4cb6d5239fd959f63aa1a742e431b451c5deb2021e68facd1daf44932841c53ed50d07053d334844dae0ecd0dc79120384c485f54223e1953d90891a2aaa99c04c292f649d26b9d1bc711963ae3a9ab756eaa69aa28ad61f6205b39ee472d692ef63a9be9408a00d98e9696649d2d019a0ad638327327d9711c5d82c6f14790fda8b40b59324aa610e100020883170020180c088844822447621090aaf61480075ac4404c40228f0e2591301805310c83300c420108022000003108c32014c74228e700040ce9986a77d63692b23d91ae6127cb2e0c31da1d93fc49996eb7695098835c7f921065852898d2567121dd20a5873307a6163e4232c88932f0b39014c173f8dd1813300712ffaefd06c9cb2342815bc488c561323152f9bed09ab99167fad1d3a887a67abd242842b0babadad7a687a028ce2f11c579b10ae43d569e0b60fde74b2f1980d073fbe99018e10d21a6dcd23eb9c4b6617db40af0cfd43f021e8da909339149951e584d5e162d23b4c9491e789923edf144a7efef0fa27fcba1274513e78b32632a5ca66277d4a840c339f16341066f31e8921b874d8ee5ce7371666dca9da0a4d5d28febfabf8123914071a527a6925a74c240c530390756aa6a7aa14f57f2f4092b65a20b0638c7e4bb66d92627eeb9522a956b16fc6c57a55bded4fb9d741347bd906e9e90c6828cdbb8460bf9fb3262634c5546d883536f4b5d51e10f4d9bbe33fed3cabcf80f649b71f265ff485d369ae4b546b540c889033f070ef4c9e387dd5858746de707459bfc0b5067675552b162151008f22fa49fbf43435cf75e40ab89374641ed3e94c752b1af1a845887e657eb8f8c83fb828070d8833aaf9f8a446cb866ff01f4d4a4a6ae8e6f3427f0cf9863301be08947e3c1059a5ba055a1dc5d385c3aed70a9f096a7fbcca5cef1389741ea07499815363d22c7453c974dc63be6d5f54e4713f34ed019b251d949058dc071460330ce617801463d643aeb079a66dd69d4b60422a8e80c1345fda2b890956154920b84ba0a68e01b2b3370122c1f3fe97e320af04113412d8c57606a207c08f114bfa4d15c6ebbc44b449e0dd140611ee89d44b07e12b8608e6260c69d0f5693efd172341865de0093af689c7586a422166538b2f63e047e651c524f50fe39b6d7848ae402ee13d8ef378c22aebda74208937dfc0489e8a28618f06d5b32340cb8a9cbcec2edfd87c7cb5ce60b096e9023eff8eac2d3bdd93520554a8ea0872f2498029f4eb1efd620f4b27b104875fc936f346eafa8cb1f20ae61d045ea1eca2e00b4d2e234006a08f88ef25609dd2c8d22a001a5bb34b663181812ab42404f4615eedea3acce5609b9d9b048555680a44d292bd424a328806e79d3b7627ff4fe25c4c9a9da06c3aef561518a16b28d34b3ea4443f9d255e91603712951cbaf6f91acaa65445895b2531072cae703713737edd9b0e5e47af05d7c69afc06a09cd62c0ff313920978cb906b8fdca4a22146eb4418b8c083f926fa9c2ece3f73b792c064cb99b501c680cd3d6e5522b55982a151e204c18c981fdfa004835bf17a8e5562f5978ab08b30b0695dc96fbd23b91409363e15481c1729fd0bf41a2ba43bd9e88c1ca645a98a0f045dded8d29be316ee883c81106e9837a2e098dca6afa39c597724d0a206de73daf1774b2afbfc4f13287614fab72955cc4a9f8f97866922f101b64b64aa14957e9b797e04fc226d06d633e52330db39bee2a2312c09946857b6bd242a2f955c5f8f5fd8a27ec991e55bf5341f8bb3d92653108c0460646f2022b34ea10753644aa0cee3781aeee2814f99b9c996aa8c5873d0843bb151976dad7c4050406f1365ebf19c0624a75ea06a499db2637e507678b57f5e9b8c4df6f42910895c35f246bf8941f6bde3dc3b639cf352af8c627593d753639cb9f03387dfcaa56c9eae32b0b3e1f266c2a281629ad5c23647121845f9cd84bc552c72247880862454202d738a6e1c7ef8d02f5302495b084705c2ff5563a5b8f773623fd7247e65da44ae9223d7a5ffe0f7dfcdadc41ae2ede955fd9919e320b2b91da44f68b79973b950900182f3b48b52be74cb675412db2327a3412fd0ff58af60186fd50f2b920523528112657704c2d0b188de882e368a14074358114bd418c1e71d2c18444caf5d4266f9cf4dc0fb493603735c123e082dd8f1d723c32261dd9a1f800f11842b1e2075857ec1bc394a34e414d157cadc7a56f9dbb2867067879754d2d90b099e7076065ef2ff8fbe349fbdda5275686a26ba6ac1b715af1ca3b1359b94299f245083827626089eb6329f795f928e9dc0f5759594bf8eef3dfd0d6dd0755f363eb81c88454f56f805825d890133b8d815e73cb8ad012b1a9c38112341f4863e787c07f6859c02e0622ec5265b816b88d8cea8d5ff58595543d8ba588321e44a8f9d55f1f34e8c617c75c29b64c41648d0d0c17bd014159ae5219626de1ad247ec4fc65d5942368af2b99eac1160ba277074d4d1a3870334f3c3805a1c6518282dd05cf290914e4718f02b3f6ec8160135aca9ddcfdee385cba330edfa92c1caad7975e378f1c8210d35d23981573887726c23af2f50062c55c1a967c80bc53cb4421500964ba27f4c8e23b47cc4188630ed7ac72630e3dc7c3f497a7eb235cffcb28eed5e3b9a5542c7e9d82584a2ba11cc23bf92b917f1c8d1fbfd0e61ed7dc8cfdd89ac30bc6b565cd1e39f25543fc458f9664dad6d6303d0c4668106023a9e069b8f6d0b36407f04017c9b302c5f43ca85ccc0da8c878968ad07015efef4b28c7d50e86d0f8e6ecec16b73ce3914341ee01004e52d88ea5203702e088884a4bb3b52ffaefe12f13f18315f2d4305f7944b1130c92478a9c3057874f676ae3f4a1918cbf80181707627cf000aa10e3c031c4a838175daaa474b5108376d1f179fb2d5c3541f227142a9fec7e502d094ff88892806e1faa31f6988cc193231429c490481618ff5b719680998f5491c31fc88965d14b63dea073b756d7b068783e9fb39565d148b42591a85c1b22c3d5748650e4464236cfecc9c0578c8709c521b0558c2a16814ed3b685eeec2013caf1892015a76d419c58d8bc61c2e0754b57a9ea404c15b6638ef8071f6e5c95dc19447f6302619f722e6e9238c3ea70dc0f0c85907da9629aa77f91ab4f166f4278c9af8443ba6b8ace6afe9689e92f284ca62e8f15e302db293938d5330a1a631bbb24b063fdc5edee2a3b38d15e102158a7bd131bab9034591b73a93c33e0e2d483a755d45e427d810afba6cf2bf8e6207cac37277ea84e6b5cb03ddcf8f8c3b2b15a360d51d1d751d270c387cbbc9a287d20ca28e71df0028e9bee7f8044672137c091e21ca6fe46c502b3f2b2052f3950344eab5bbcd3b7edf8b89dd1c873156ee151046aa9ff9d7587e44bde9fcf7ce8bc485a162af565e372f71c0b8c2c0c8ecc56643fff9b8b437220b6efbea7f75baf4d93c0c859ad9b1c5515bb562673373e5c38da2cf35bd21910c5949f24f7d67bba2d9fbbe83e75f91630003a8f5ea0893328cf7350375bc10085ea824f77a20d00897cd71770d92fe0943b4897fc17c8dadf86acc110086584f21f2d38e42c46f8050e63e546d9dba89bbc3ac4594350cf7c4023f63b8a07bedfbe80dcff111362ecd2cee90806502c2980e6867fb5cc867a45f80494018e76158a229ac16ea98f22c74a2e94740a5b3902efaf4f40e5a364e5b6bb8bef0d2a138f351c2ad8100b5a97f2c1c0a60fdccdd57e87add2ab53f05d21796dd1bdca23c2c4eeca1e3ed2c593925ed83b2629e1d9b0de4611672a8c0fe22829be81d980982b135a32fbe445d697752d9255317edb363867c341b60da9a2bbe083c445ed4a3c8d220a067a430a858341d595d6d9c2289d1837f1133de93bc06960666229cabfd0a037b4398ebd462979ea373ad1e9f525bbad442a23831c3f270de352f7b22368cb9014845fc4e635dbd1ef8b8f9058c2454801fcf8548a141fe42fdb914bb41215edb84408c794721c278be39f93ceaedd30115616ab1cc54d46a4ad19a5054e288e0a6c3c2af2ff37308411095fb48c2a93897275634e2323915f0d8eded523b1279c3fb296e538cbb35ab94f8d801c6328bcf2be2c25b4abdea458d08b3ca8b90dd314411de97d78ef275ed2608471d05275507b559d7b5707cab9776b3b7888a6d8c13455d8f783a28bcb885c4dcad933123cd575b4c3bf920c42ce4275a482847470f528172694d513829a9b7a94ae046f85a23bcc5769cb691c6bcade3b8f1486d38340837719f4592d71b1ba9e4d381085ed548c7876df73d19aa46e568b2bc84a54ca6541695709713d441dfbafa2a8279cd6828e2c6a10aa604c645d4ce08830fa08c4b458061ddd8fa7efa0f9acdcd2a2b11a50abf857840670d595097b7a971bc51584742c5635e4c8358a094204e3dc6fa24709a8bbc3fb826cf23a956867132569921a19d7ed2047ad646432edcc2852ae4c622f5d2786ee81d3bb7a551555fad546bfca8d5b1450fedd7c5fa81b1e9a502596ee68645e7689cf1849b718c9b24afa6e315bd75c7c22d580d8ac4cd424c66a1be4d11fc012dfdff552edf9f6b9f1e084bb9c5fa7fbeec48071d0dc2dcf4bc14494ad6ebd8e35ec41492a9c085f22b4703d0353a3664b4b54523418b0a75dac711d6485266305393bbfa5432221b1be9e195482394579983384f14ca7d256cc7df9125af8960ee949594078cc23524a350c4c2d442030039649e215cdf6215563aae2ae8e48fe9db37435dfda48509e49450bf27671f200544d29329f5a8252edb26228e7fb367c026fdf0b3e004f3a696baba270b4dee6337aaa9441d3db648f2f1346c4b2bb8ff451292fa3961d8e6ad3a8b473a56858ece748df067adce9a3a1485fa7bbb8caff5c9459cb6ba5679f6a0af22447725487e4f4c61e14e48f321d37700f55827830525b46c7b010d13bce0c68752eb6e675e3f2439b6d6852b508a98dc4850b122f63effd430e7ec9c889127ce415b91c20460762f86f64fe929b70b07728edc94bc9f089067e4c6036276007916cc328420ea66b36a7fae0b76893d687e508c80084855c70ef07369fec7fcf74d66b8f47c525481bd605b529101eaad7f18ba30dceeadfedbdc1b740aafd3074286aaede9baf1adf38b7ead58c7fe62bbe7832fdc577ee860aac1b34dbdc995e71418417ce80e34f95df3af0784240092b998d402d8f11de09eedd8945f21f97e37a3b4727c0b0a6d4ae8406e888022c3ed1779a5a005b617ae8d16ea75cef6fb1a8fb8abcacfae429c929d1dc2994a5b74a5a48d8b8e30d2e00036fa2505f1d5947f7b197bf340576344d48f88a090f5d31c420e2cc17a18696e538e4d83a8539b437c65f649364a6e0dc8c49cd2ed7c47c2854b25894b34c85803d1860d849b890e15b2a00ea3d9cc0b5007b10c8f95b710a766e7a354cff270aa20213f0f35219b7341f75cb85c5a7a2593eee7b711d98f5bcda60898fe28aff29e7374d0811815692d926e6307deb76329f3c855cf606c91f0e7eeb9e9a577a67b851cae11b7a83760f7e394ee632eace748f53e1cdf469f6ad35dfab24187b9e235729e4eae263f6b4c46ed7d1615035d6a10b8c9e3c74abcd5cd501ce2858167de876ea9651472738e23b862640878ac30edc0c7840f6df0d2c08a5dd0ba34b90fed16fee2842e3f758eac58409b0c7e67928b6c4f839599aa8153b5d6468b03e4f2daa74beaa2b94da14f4303d8bb123614b7052fd132cc3c58ce8f78ac1dead44b4836a03e83761f50f20763524b2358990eb369ca61169bea9426f4ced225fd394e209233cfaded8ea4be4144768478a902d4734befe11d377233a14ff8e9a55a67faddc7c60232091d661debe5bacf2ea1b15bcf4e257d812738f801556a6790c547709b92e17a31e81614ee15e84f886c60af8b229709e09f4a02d71ee90e41460f14a5dcbaa5d45d4eecca68c23e74063b7c7f36c4666084f64940a302dd3aa398f5d7ae36867e3d4c57ee6748965c05bae94a2fe021ff1d78dc0635637746118e357c540ff07e21d5560f2feab9089db9883a98738bf220c7e327357a68671825cbaf310b26366a3d338ac73b38c29785d56d01c89aee8f6a2728636008e8cfc9d2d5924a4e874322e85b04655094a4cfa009724be9c52d5465d483f42b87364e9df50d4748ca610cc33bee935cc25fe33817b13105d483cf33c8e28603a46548bb5e380e72dd7d7c4b58e7dea94aec8e7765810e44fee5d6742d2bf6d89de94f01e65f016cd8b8e6b4ba6ae7cd726625a6dfd54c8c290ee0cf66e4eb784c6f893ef8153e998be5ff9da410f86c94ba49a30105894301778cb3d30c694f734d6564434f9fa705695a7a9cab215e08d927fd07299c821dc0d53deb1c3445949fbb7497d6fe5485296c3cd76066aec8d1a9292e5686899d1fe3ab9019ac842bef6ecf8996b6384f741dcd6c18cdcb6b66586bd9394638eb11227ec831087d68ea6bf9c7d99799171efb4646aec23c093950662012be279943c4c48b7b7f5411da2ceae7d6e95f5c6f1dee4c02a0f32160e5ef8b2347562a49fa663369f3645762295734444e26e3e08498ba88f5e98066489b68e9c107549c8d212e9289f7766c4957c841e645f79199789373b45b880b7394780ba0877c4812e234ecbfeaee4f93004fece41d504630e41e4d36d4af598f1401f04e0b2a20f73360565296d5b774a4a3038ea4b8f3447576a5a1fab3ca84bdf2e669ea0ef5cd69637d7674d08e07cf45ff510916b59fcf81ae013171a67038ae021a25f12f7cad5b7eff43308386baf625373aea9ba1c27bcc568b4bbc550da0778e536838f4cb8d55b5dbdce01941fa57e61922cb4c9c70f74f59ab8150748a8c22d1b8a1830ae616a8785418d994245af56ce9f5e37c15aa545e405d172f9a2d147d639eb247927491b3d6ae1f69dd5112fbb9b8e3934835c88e7ce3857885396ab0e6c7bc9381d3635655990bd1ea770e6fa4434a135ca647c4754d4d08d5b6b9dbeb8ee6e70128fd37c22d1c1ca505e35ad8e9b563f4fb6ffa217bd11271606ff5d2a8c87fdcafba885872113fadcb0ff2e79d195fd6121cb146c30dd0e038e40e354fbe0ac6a8a4f6ee0d239731119caad3b12a1ab1bc163790b59bc12ce0f2b686956afbb05c7f017167cf959e6b1b563a431832d8c6989c8af830bf71039d1dd8ac76629a7164ad6667bd4b10ccbcbeb584e843668f9bcbe4ea5a105d1e9d2f2825542b4bc30d1007144f7f07d64749b91b95af7ce2ba1fd8b46e9e2b00c615eafd66349c6f01a6b6ee194300ac3dae81eb37919a39549b4be8e0ec24d0dea21730f75f955a23a6af81db3d4870018b3fb2cda1f6b7d04b657680021a2f207530c68a7ed9080be467782dba1f1529cee0e2bddf06e69c6c5caf0f2d83d124b4ebaacbc6868b4eb62431b8b581d1ec62e44e1b05b33180c02c9c0cecc8557b51e514d79e7d7b5b27c99d9f2e5e31a1c93f0e2b3ca3e48ae6566137c6f6382f7ead872dc1a4323378b3de05b17933ed142a98bce9bc51c70fa4590faf935e9584efdf234053ea318e8dcaa86b5b6a951d28b5eab81d416fefa3150895b31c9689cc91b9a4052598e8412eb8709d810da0f8348ede2c29616f892f49b3c91328558df566fe29400b409ddf98e8f8c8f1c03b5623889a9cf8522774fef41999c5326d2a44afc39cd39cd49dd921743b42ea2b10d5f964e1794d419516225b4da35dde434b5dd6419a723d3b4f8e600bb066657cd244e7565c7fbd16829eaa606b3c70ef0aedbdf40d8e5ebecb4b419eb9e3e4243fbccc300999b968c05a467194b1ef119b441d58df005fb2afaa58a6ed1d9cd2cd805bb37f36c2816a9a78e5c1947edcffef54ec74d5c607265bd2cb9b3dfb4a1340433e1ceed83f0666fb79eba4f2303e38337c91dd9d1fdaf5bc109afe9d7910526c8888d221fdb4df389826707acd1004a023659884b8d0d26e2cf7e6314024def33a1d98d481b1ff6bd95f74520d2753d3fa38bca859c1439fbbbc1052fd0c9fa434c8d34d8563d74c9fb55b4abf7309d025f80c0477683a13c84c0320373a3a1d9f05200e6d766e20a112f96daa9ff532e14886c28a46f5a541ce843408ada30b2b8525a8925b7e2da4f8804f21283b32e629046bd62ed897f2538551ea432b1fe36816e3244d39bbfbc30de68fa5414e50eee67f8880301b6823ca1ffd4b935db32b1ead68ba82c5694ba76a043e3f71c7d23224bb365621583ace94556261665c278111c7aaf6a622d25ad78b26036d5811acca747d07a4b1dfcff28e1718a90731ba33b48ab13e083754e73f202a3dbf1f3405422b529a3473f55fa4d4f1fd3148dad05a8589082467a21864981f09c6cfee8e913405cfdec37c582868ec2d53f8bc044d6146b1be7a32ab99a86ff74a40e69c5e734c8c1942651b11d5b91be159df8c012de676dba8b82722fc85a4fef1129fcbb607b09b65e50de4be033529fabca1f9b6074abbfa826cf67731afbcc3ffdf034a48b0c044206d8b47687a067898b3132cc477051fdde5037ca201710e8735c93eabbef110a2a90d1a54cbebe248b65a38a2b2f9b013d2db8008dcd10c2c8d24f4b9f9f05fe7fc7693130dd947af936136b527d19d07e1132801372ec40be8d5c0fe76b6e20eb28e518da281f2e55055295b840874008f289b79fc37293afc4a29112746c5911f1d73aaa15d93aaf396bf5b585fe5da0a8a4e273f42ef92754a7fffd3497829d0708d72996c12f00a69c626d740cdceb375082d7f0a773051999a89e7801f9c011ebeab6e9abcc2129fac551604492a992edf4a7e87b2cee5de25fe773a0a0054b97e58cd3198d58e7857b979642d4cd3b5121b8fe82c21e0d90edab167931b8320660358f945500b521c356d57b769b503eb4d27c24540429a06df79adb88f72ab10561849181925e0d545a444d88a34d2320c0a568aa561671fc5c0d9fdca2445472ef00150b0015a2896349081c264e4d5b82732af13addf0e9de485951b6f08dec0f5847aaec2fb4c11aa9df3ad2964da2238c762303d9c991debe1311949b915dced2300a6068b73cbc31b028e71396938a8037fa1b664fac90650dc75b65ee8b644cf9d32f942fa6961ce84498d83bb5790ed37a0c906949c77c05347804e2d25afea00821e7a58aa496d944b60bbee71be3c3144c0c9962ec3e2ed52cffb9120f9e0e3be4a2d418dbe79fe8edcb67ad9c41c481e8adf6a1fabb89123ca268a280cb5bb68a4a92f12507e2f0ea0718216ddfd7be8972610bfe52f18e69d85736037fb1da3c34c070fe375626f7b61eb6e026da6770f5ead932b81d3a7284a53081e7d99a795317bc86f41e5820305fde09f84bf098101186d38bb36ac608b33d86efe3746027b456c0ad91bd61711b87019932ab2818b33440639fb5e254ed3c7bc8aaa6cb9691fb3f3d943df6d3df6b08f5c6d106fc56cdd642801cc97bb0a5b03229f5051fa9ef5356dbe78d29cd28c9880702e6038a62db8b79f1057e520f1832f33e043b92f5d2ac997676c19766098ade7b8004c9091288a505e3f58e3b6361bd9c480614356c9cf88487f24b3e1f10fcb4f61f42e05cc26ddc1a2e58afeb34f28cf92d90aa96855ea892ded607a2e9e1cd77b5be45f127d5223e633a542a8cefd9892c8442a42d158c4a100fa59fa399c58da1356f4b5a58d268f2ef13a1ac60ba65e19fe9c88b22d46d2c6f11a18eb7b863a1a04cb352a60000f9b60f776e76f6c4b4332fd428840a01457c7df5b2695c946003dc5293d257b884d08643c0208f976e22722b0aad97a20a0f3487fa135306e3c0010320e8543d64986ecc6839531e22b59ac3558760f3e942cf14f647094a11404ba14d9765a7063ce4965ce16cd48a11b8727041f20adc4c355a8e5bcd2f79e51fe993da9c131ab5495428344957c8f98fae44ad2ad39c06b9721efe2428eb9953112cf667a3e471ec424e74ac962607ff964708c9839f2e10c4a2e435954eb42e54ff98c52c9342171cced218419ae2b09d85445d7f14237b70dd832026bf50b2f7b61a9c3ee53dc5512f7d4d67d7c981b377a9bc0df8717a98fa5855823fd9744747f96e024ebebf69308d70f4254109568b6dd715415fa9c82d0f4d637306c3df8cf0adc196787a4ded0748e569c7cfbf6a006741247c55098b355480ef8256ece0d8975d18f627090b5fcb3d941b40bc2c11f0e8872ef10c62af18b26d10783e0e2bb2c68905ed3a79b5061be2d36b6a1fe2b76a6bd1c3174bca62935f0210c7ec0e0637407ab630e8ce1ecba9e6e4c79511edb9875db797abe682b04c8fae72e172650e9bacff41a84f1e7dbd2ca4c71d28c0e992de482ae5184044810b6f8bedca187194a0e882a00d8542a13f87894aaa7a07177b9fca24e4c4a6bcc049a11bb3db7634e55c1a36fcedaae8a5784e239053a767a58594adb63e44b3f754c84a0708dda1c02305491424fd34b2a7007793d3f416e55c1876fce5aa2d70288dc102b257b542e8e44e637d84d8a983d7d7aa62054c0eb8231bdaf0a69b4bcb8a1b97e57211623565d0715786f5d4237858543742e83988a88425eeed139f307f35171a22072c04173b19d8c769875e61069e1078e1e929f44f073062863a352cacff1a12dba774771d8a51c370b3f8f1f4a8e38543c9e68738b49c7cf164d5fd8f5d760001e33e0a82cf4973bd2c6e030650bb1f021d8a950f6dc99c7dfa20a1f1919e379340fcb123ebfb0432f17429f08136d9c6eb83b6568f32eb9628f640c5ec108d117ebe2a4345e4cf32ea69484c60fce4811d2d6f5a43036c4ad131f7798390c66f672507a7c84fc768234190f84bab064e65d4424907dc910072161b13b1d1ecd1e0c221549f5136a8af44590deaf9315dc890383844c2cfa7a49f18764f1d5388ef3c608212e3a5d16d8a47914ad5982208da9f21b504ef6eff4c79c967a1f0a6b0408b3d11cb96d448751bd0a0facff996abb849d94398cbc03c6109e30ff93ebfe2148c202e79e4978c4e83d53021fc8a3fd64b4a219d9ee4ff7db0b82d9438542e4f5553011619b6f7b11ec32dc4b5290d802668e5726440fb23257afda6c7cef30188cd5a63da1c8d918550ce8a7c376e21fdae4c630568d89d82826e1553a22381c26de11d80f9e7a82c392472087770f28fbe35b41bb1bd45f6cd10d474736da20a4caa3e2c7029f8d3830537961e2a5803ad81118e248574036a4830eebad2ac1ae0cb3af46832206e7d1fe31ba59164e7098c31574d781f01750d829f06e983b820b177c71faa2e81f6eba323c60bdfccc7b1d34914c82479f4a1f98a021c4b10947f8c532ff2a16cddc7e630b35717e0440d31a40f0101bbc94965992c41cecedbdb43f221858d2d3ed408a0658365e660586a8e57fc128654629eb1ea367d50f5b0216a70c090138a8b39d8b15435665102c362c4962416851cfc61dde46834ff9b700ebd60eb64cc53909dbf23394767385d97b1bd397c0e32068255c6d2985099a591c60e4d6c63784cf013bda91f99f409e3fb79ae297b120c87ffde6dcc68ae790f4afba4ddb750bffb681bbc31dbe2528f35ee6fcccfb9c049d194d31abebfd213d9a8bc26910693637c73e387adec576302e9b72c9ce419809b3628280f477aaa622444b761c98785e055ab25ab010a49a8653b2649040329e74eaa68f6c992bd624a461057e3c3b3a184b8cfedb7a4c42f1a80bb26c1501bfd23eb88b22bb6defe38511b9a5fbde3e25c8db456078c1cf10c09ca6d6c0b5b54ef0f769c1f599259f4adcc36326e81188774a4768bf70adb1007626847b815b6d501162df16dcb3eb89b22ba412434da71ecedac2720a7e4e55955e0af153a0414d61dfc6caddde723834bec650ee4684417cf30cd8d201ce8646ac2d3dc13695843af98d9a5ebca791c4842bb3f7ac6fc11a8eaf794b944d30abe7fc7c15a9f9a591c7876ed9b51e36b5cc11046ee526184a6d407f09fb8736f0ca81f37e9552e50f09e6fec925a6d6104b588b75b788f91c6a45eae3ce0f10d332dd637a2c728e1311b225882b0f0fdb5e149badb2b1509915d2e57870af96d5e877c622bcb24969307858d20e8bee731b877bfb56f89b4046bda5ea28f7e7665aabdfa53dfe060840554a28eb7a0396a841db28799b10e05d51a6e752dc320ae4c65711b6253c42934dc9fee81e29fe0592c42ea3d41a7442be19d06e5cc7cf43f79ad32bdfa27ee2402c2ab924695784396e14da949b53380372db1d5fbb499119b5196d1184a8cdc6561f84012d5a206e3acdfd80e6b17ca745c42a496b44bc7f5ba38bd0a8e7f0b0a77147f9710606fc627b97d79aab8db10332370d92ebc1a8c41fdb71fc92a5e1dfd20a45cc13a2331d995b59b8be220c51048e98f3ed3ff1b92ff9b54994f39aa2e2027d0b39579467e1028994b18384746603c324437c30e9add73fad9dace95bd87e6880b443a1a932e024c61cb2d612ae2b872f5f024dc3a8b0f4f2827a1ff3c965e9036515eaf9deb6161514965352cdc3e1f5c1e7c3c1e40f3ed5c75b7ba5db6af45c76c83f20fc7b3c0d3583be1d518c327e3ce4942310e42cc27b05b9436203ac286af2fd0fa813b47a5c00a07416905b74012ffc613cc63e514c793989e335b81bb278ed04ec789e06841252356344a410b47d9ba34720ac9148d1ea5d8699abcc888691a38646a5268f514d3a4694f447aed25980601299859f9dd76914044c75b379a8684013d2280b624d1c39139c7e275b3cec523eb3403673c5534e93277d339b4ce44e9c6a1ec20ce317f8e6995b41275d2a19b3cd1d008106f454f7f12f38ef3a3d324534af3a6b5087c718c7468b705f01c65d1b401440a3a142246ebcaff8e7d75ac919e16646404432315cc8ea28efb75902cd0a85cc866d1984c4632b454420cc1d0ba5c48b06864042bc717e328fba3a9275c38161d4470fc3b74b9c3ec221ab8c5906934a748cdf1e7b845475962b4b7c8140e223f9a7ad2ed58742cdef18743c1415c305b37f17a46bdc22604c5100cad4ac808964656b21d9be090353ebd158900d1aa4f46fe695df1dbe1eed0c1818a0e923c36b6932401d35aaf9cda855f6862d1557a6e976f50aeedc6aa4de5c629495a4711b134c9956efd69bd04fe77f8e845639a344836c39b375371587271bf9d32d1f1dc003a9a42a6a75d7bd28eb92729bb4e03f84242a3515c214ba3319c8cd0d3084ecad2681d574ea3d12a56184b4b6b1819a9d3c2947a87381caf8e9d5aa9603a8872f83b143a9098a3ac9f26eb85449706aa827e174d55381d8b1c4570fc712c7200a28e63fdb4d5c2e5507410a93de5a57010f9d358554ce3a4a98a8ce4d2544a7639ca2e696408768d04c1761473fce458ce01441c65ffd04055483834b5043939882c69442ae963d0aa4c46b034d292ed28eef883a3143a8a14d19c084c7794f5d358858c70696a858b63310791da83e8740e227f34b5a4d3a1d451d491bf0e92455a6982c14124876f0e4547311cbe392ee228e2f03d94d0c58f33aeaada2c2572872b8e7d0751c7fc3ad2879c261589e8d19064cf91cf11741c23fe68aad2e5d0e5da6c2533bebbe07c6ee2b1b4bbfbdbb5f7bdd2ec9f7a388d3045146ad9cdd8ae1409a6f165fc7494fda681968c30d13405193a487434f2041b4771c307d45301d4f5021a3cb6725c3016163707f92f3d9aa873c316657d130201d02e06fb1aa0153432ee58041143cadd1c530eb3bcb80c4324f3c1def0f426ec6b8401349c478ff7fed2514369763280bff97b708ae99364095ac06fecf63713dbdddddd5b4a99929401ef0624072207dfcff74af95e5d235f6ae9b71c7699e1d6e2538b4f9cc3a7efd57a76508a635e3edfcf0765565746512adfe16b06ec2cb822fd1639e90da6e08aa022de5a0ed4b9d3b5e7da412557ac352670bd74cd8894d132c73655add1c26f9ca967911669c76a0ddda9a1b268fbc026abb8961ed2aba3647b75547b751f3f2773771d8a7aed41339ea1b27952da52dd8669ead6b4ea5c65e62ceb81aa23b0f1d59b99cac99fe8e3ebf550d9db30a338f550b486a07ca91ecab6500073eb33606e9d07cd7aa8eae3310f45a5ccb46ddb384ddb5a062cd4a1a35db4ad7226133743ed34ad56afde3dd82b5729a595690db3cc43b194dce6b137c861b3bbb7f364c0dc76de0c5898b54bbb50d40bf2ab37758eb2cc3eeaa1a837b3cd6c37a0b6a7dbd728dfd263ba74d40c43da759937a37932f3b6af86dbd75014c1d3906f101c07e2643863d9db5570b190f3ccb5bab948779e5d4a29a5949a115a33e79c93c56666e6b29b9eeea618535a7faa15ed101b30d06d6ee65a877910c024e6d96398839d67dfa13ae77cdbe98a6da1b8d53cd79de750b43b4fc312b8be86ca626e6a47b876ae296bce39e7e440cdd33c1e0f666e55abba9bc79107a5f4f5e251e76aae7858170f0772270a25d2f0d4396ccfbe513595922f943553e339b44fd8783d3316036a823cf104bde69ca057135095f52032e489413d2ae04a97037962b1dc496948411f2ef5cd05eae1983a84c9e0a667f292f3b0e22a0ef23a077932b03c215d5c502c4fc8133be907f9893e5e2472d96e5fc5e43e4aaee233945cc5abab8439d8c014e6b0e22a9e83c94bee83012cde82bb39c9a7c8396731c232768e15918bfd9dcbce434e025728e2d69abfee39a986a4ea1c2aa3ef63a21fe452c6d42122a906f4fa9450ac4632e932dd044a59732062cd1028b2b49e5fcf4eaa31bd48aa39bd48aa6179426471b1f0b8be86cafaf6ca7a6b2b132c4f60265dac97405b1d03690aae6863091f4e9afdf4a8db788d986be2523fa35972f6608894e99d1248050202aa01ddf089b715c8cd07203266db419ef88663b6149f56b009b1a960fbb105b101b1fdb0d56c3ed4748e9aea1ea40c0f1bcdb68394c99c7d4bc1a6c3969232b5413536e2f68267df54ac8092b37357c5412a1e12a93869047704a6b7a1122a6165225daa12796226f2c42590a63a79ae4778f6cac32db0d754365324b08ec0da04ac40a821b07e215fd82f5885205f86205fc0a01e5875ea12f9c2ce81d50bb032912fd555b9902fec1a58bba84ae40b63be83edab809589ac604817c64259c1907767ca9a7251b0c65757e7d8b6bad5ad6e18e6e2969ac15ebac4c222a9adcecf9570b714fffc909f0e5a8d9893826397ed6c32b1a6b57398c9178fc115e987f37dfcf478b07471a6c32b5fe48b44a5303bf7a02108ca17f650a1cc31e76173cddb6ba140e698cf90615b98b54b7ba88b9a3d663843068d5ed4a1a3a23e19b219b25047a8a35dac9879a8d9638654621e8a938f7933a367661818cd0b1d883b3d94f61dce6c93bc7dd469686b68c38cb2bd0866944701f551193302e7df2ee57d714e14fd7629332969538fd6eed1d741cec337c30d41e10c61d62e1285b2df6ea3a05e906f35df26e6b5a767b6a6160389d6d09a97ceccccdc1e0aeb36d2ddddd44359dad3f3d229a5b47aa85af9a6d66a3d14b5d662a2fcf9b121f350fc1ce842689bb59973a1f5ecade5409d73be83dbebd10d79299efef4d2e371c34c8dcf1c55c3d6f82ca43b3f5dbed450a4cf1da280fae0b8a3494dead339b0c64fa073d4947461cfb27bdb9b55781966dc69459e69a8b15c0977b28b4fd3f90cac459ed8457aa78c31f1a904e6900b902eec59c3b4c89803c813dba714b4dfc37efb021420653e674f800b52e63a3b02a44cc8d965a48c4826c5d975489991b3e790329ab3c7b480c30052a600de3926d0305226c321b9288f2880e40f0295a88151a24607034a77a4790a3882fb9a8bc011985e0b95288559bbb4309d9b4f22fd5469610293fef494eda78bb89f1eba9f777b7e677ffa86bd4cf9327fdae62969c5bef62f81a414cec69001bb777a32cc60c36c467950cb0bf239648f3dfb6268e71b50dbb7a336d08cf2d2436ddb7728e5cb4401fb68e620fcc4c9d4c172380a277e7a6785102b82502b7ac870a4f0d37a0f7cba82091966d06abd6cb58cbc385fb688d0d90af262d652fdf456ea459ad597ad2ba2f0d3695ff1f3733ee17c87233bb365c58f2320d0913d7704e765eb488e12b61d8bc2b4d62a1146ad350bc30a6badcda8b5d65a2596a84d8860204908f934992b9851037aab1066941948a1011fb8480169e1600835303c4d78010d6ab6a8f9c1c84e81e2a00a2d7e40842e966002078e280210238c43b8a04815530880958212b3d60afaa9b56250a8cd6e93f0da806449a85438e970a4084da14485610c263b10828dcd1636395798618322577441860e70847c13ca908931610694524ae97ccdd7eb5f3ee29c76aeaa90baaa2b918517ab47e98bfa70f4a5d157465f187d59fa2a4037410308310091673fc0101cdd017038f1ec2db0625a8889699e31d55d1c4362579f4eee26d3bdccab6b5a3d9f5ee46d8221a0e011aaabeb46231a345c626581851dfc3dbb3a47e59dcaaf0ae5c7fb1a56d711eecc34ef7ddc89811727b9ce229e80022733b243e2e4b826b6839fbe0366d4f1bac1020e1724ce2a896b9df839126168dcc0d1bd9a06b289910a6155246e2079ec11ad2c7ebc24f2d32fa645102d62f0d36fa6c50b30239c23a940939c1e3172b4c88102c5c591a344cec84a8244122039370110a20b33ba5001105242c83278864082c5139000821217a4bc821086ce932865e88c9428c20732462267f06043868e6e44630b1b5c6eecb9ac9bc426c90f2ca060e1e3011ddc8be4068b28b0688245ce8b2706e5640f35c305f952a6a7a99132b6e2c038cbeefde19f13ff3491cea193faa2c689eac9cd7b3e2b0f0a47b3792d6f62b66c5a7a95c7c00d4a7d6d5068f85f2a876b79a1bd3aaabb51a31177b2a7a4e1e5d39db2ad7cc1bab17a6f96692653bb64b6ab3d6aedbeb77aa3e4b7378a7bb0cf4ce9ed28d998379379956e4c70f286b518c671188771e2c97ae55c07a5cfc1e54211f332e7429ec79c0b310f4592524a297f1ec37cce39e7640c736666ee7af318e6ddddb487d28a615eabc5302e742838d0a1f8c41bdefb3cfb2f146f78ced94381fcf3f67a80ecce63fe619c17f2cf636e873c26f6ce63a1689d8a39b8be06da14ec6f722aa79c2303a1b8e20de507ec38190ae7c8329aec874dd6415a88bcb14cd81b3ba48b6818481776cb848ce921e48987704cabf85444cfa065d0411a8894894113d1370d032973d3392cab5fd02e689b1ea25bd02c68959411b1ec4d0be9249ebd57ac8052e88248f5472956cbb08dfbbcae6459ac17852ee849a314ab65d8c67d5e270a5d106994623351e882c0f99fd7719b966125fb51dfc1157b9592ad4f7c2a14a7f961d3aaefb0f27813573cb11d3731eee5ae6b10054c268aa2991c8d327a517402343c50cc43518f42f3288a3dd4e59326b5c94dabc5b4af86340ace4ad69d34740d9fe80f3e39eb8a5df3b4eef0c9bac8aed79c73c280bd7a466666eadc337637a5d488aa568f475b51eef0e8067d0737d3665a7a645ffd86c75c0bc51b78ac70c49d2e61b89be9947ca12ebdf60c0b450e67485fbd6b6a4a5f4376f18986d3d9aab415679d03b91457a4dfd67677dd9235ab7df5a636fbea738ebc76ef855a3b6bdab49a4ced22dd5a6babad3e278779eddd16559d1deb2c66c119a53a078aa166dfdad43eeaf2a9046c0feddbe7f34e0b751ac2158eb89d9cdcb47a1d372d0f9d733ebd8ec3300cc35aaad7ccad67d24f98d739e79c3178ad16337777379d94d26aa4563b6b6a2c26ca9d1d27ee66a9b5996be20d6f7d736d0b25e9339f21919ef418f8836158575f2e8e29bd74962c5987734816aa4f90f4d63f147950a7939b568b65dac675de07ba2151ca88545231adb0883c6ad8225fa67b832d35a4215f660d156cc897e915875dd873329dfb8593c77991a1581ffe9921fd0ceba8c5ad29f932e30527d95957c224612191040808920079d94a82449227e22949122c82607183450d162946f242d2d3487690b828921189918a640812232c921b8c91e09c899c9a245072584996e42cf1353347899fce2e1ca668f994d10a82e9de972d24359b0684db83ab847bc5cf0e2f5c93b7b278f10404ab95a49842a502d61386f870030419467464608424d84001c27468a1663e3a744400881efc80f2ba228c263e584270818430c048c20721a6c00187a574d4e8a8c97474231a5cb444e1ba2ef6b275859020575c91029607e68d1b4772268c0eec080e8661544737a271a4096c3527ae914bb5233d2f9e80e0ba6c5b3f78b57e90f226d890e2624e70f0e0623946b836925cf1dae8e26659966519e64e3079ebc88f6f79d93a528323415e3c39114e8413415dca39419c658cea4159088aa7ca4ecc452b35a33b6a86d7aaf11918f25a9d2324f25acfa1170dbda8bb8ba197f6d27cf8442deb60bcc33a3f3dd3666754ab9be5ea6639accb3caccb3ceddb40dab781b8db85b8db853cd197d289847c444091a79328aff834dde7c707ca8fcfab8593d3c2d1718df3c666069937d366aad849f748273eaf0ce80045177e8a38e894a198c3d3c9dcb4d6e659b969ad1dad16eb2c966999a6354f0dcb346de3b86ee3bacefb401f08d43c415fe779331fe876206fe686442191a8798a543c548a69c54391585a4a2d2dcdb365668a3a09a67429dca89320c943cdbf7c22954acdb3947d2d3db41aae645fcb0d4f5da49fcdfe441a402f875dd8bd169fbc169f38a7157a89521c23d6d0cb27445b52a676959352ca76336e9f3294cabff8c43ee0d350fb297521af157ab50b169656daebd5bde40bd3118773b00e4dd34081e2e3f3a2f69aa2f69adaebf57a0a720c346457ab4aaf1652a4571daa6b4733a3eab0b56a8ddf5a9de3fb691776aea9294668663c0f7931201cfe9cf025c1ab212c233c726b1cc7711c552c232296882562895822968895d2495249aa7828954e9a56e8ca4af35cb1f339f9f4997835dd13dc181c10babd3c26cfde5ecdb373f7c4fcca8dc10179fd708a6b58c53763cbb5c3d3a312f18878443c221e51a963d1a4a0dd2003639ef1ecda1cb79c67bf9a149e1da4dde0d96706c6d872edf0f48ce3388ea34aa552a954356ca6c2a6b04c6024d95465aa67ffb0299e7dc5c2849609f3a76adeccd5109691711cc771fc161a356aa8a0820d1b8ec4b3cec4248f45c2569d9ed768f5335acdd468356b46af6cbc2d9398f21a8d46a3d1683492e1c84697f1208615619e869587d1aa73c0b4cb5c8dac9611d7d87a76ce46570ac17c7125b5831aaea4c29a3b5d5c493d937ec57581248a5c1fb0a47083241079c212472e16f78cbbc5145c38cff2b2e512824b87b2260fb7aa79a4af3a57a1105794ae508850082890410619cf893e785ac5e36bae405c0dd64ba7e1416054a385853f91042ab0ac98fa134b60c3a45222d14f3481d74fcc010cd94f3c41887d220a9e5b21ccbee9540a1ab385597a859aaa8a0cbf18b568ce53cab0f8f4f992322b3e9d47159fde3c52a6e453730da46ec116d2739df781ae8744998bd5c52ea2e11c83d52dd892c4772e5e277cfb2c5d27d0f09c5542382d6d1a82e5e98a88082bd75b9c05ac4e0314538a98422e722bac86675fa3ea507a1aa0c8ad549e657acae6922f3dda52f2c57b36274917b7c25a58564c208ff265ba0ad82af932bd04f6c8256e5c7cbb0814a728b9f869c4cf32449e426c16fc0ce3a773dc94a5d91a8a6075712b9794d15c03677bc6adeca8656e58d454bf785e45664aa4457878b6a855870e8347be4c1a2d200bb8b262d0d4aef22c59110e674d6d3568cf6728dd637131d02e6cd7e163c997ee06a58e70c551fbc825653c6f677979a0487391e5c5b2922f4d5abd932bb2bc56df6e632565ea16156419a5a44cf5267d07cae7401bcbeb598cf8f66ce4da52b408a97d7093d670f28648695016cf161e66e15ee191a9e9c555c5a58bae9f92f492445954b89ac0e182c4c9a1ac89b17efa8e17df6001870bcde3bac188ddf4a271c375e3a251350d88f048852cf1aa480c992b7b84ebc665e372d1b852b0c514aae03c8c30bea071b718e3c59375effa196dedbcecd20e425159d6722df944a794b5d65a25c3d029a2a8828cebe4856b722d74b4b0620b9d76aea7dbd0b7e4a9e120e4a9bd7590315cc3a786c2f219f2a4bd53ceaeb0c65720f5a6f6d49eda537b6a8f8a4f1d53438d0d81a9f8d4ded84dbbb467d9bd26936327914710544141aa8a6340447c48bc9577d3f57071f32d1a527b442bf9d2ce60e8850d211282a93846640476838d3698118c85ad6a7c0d535cf2a5dd95e0d5d0bbe97a807841bedd2342764f6c54de0f9beaa0743e3d9d23e4c32eed21282f9afaf3e3bb453635dfa220df2e5ad5376815865c8b4b41d08d7c6997adede6bd8babc2ecd1aac3e1447eaeccf5c122b7bdbd9953e5708620fdefd9e3614375b68125954abd0c71984eb21f02fa71d8d283722872e0a70c5c8437c1542adba4c9ebd5a4890d330a0f3b3b3bec1c37ed4aa9adb55a6badd5b922b3ceeb358e3a77c2803d754e9359758273b946bc5aa588c6d0545d1ed0f7d25d09bb38c6cba436e7a43a4be48d593b7943d21153cb371b99ec4b5a69adb66f578e47bbf522e0e36b775ca5146b505276610753177bf1046fc32bb7e7368f476b2da994a1926a5dc6a5f049664514e1f2ec40c709269a68028bc835e32ab95abc80467bd9d2020a2a6ac603217468b27259e1031da8b2d87942730412ad9f8c8a943671a628e3314c4737a29145cfabf09305e79abce2578f74aaaae4f1f19c057bae8f077bae9c614b0ff186fa844b4da64d2baddcb45a8c6258f3c47e9842f9c940b1d2d414add46295665413690b27a7a58122d571615846b5ad528ee34091de509b20f48603452a84ae38aea3de5729a8c7c9931e9f976a7cfded9a670fd1fc404d16dbe6d947ad225112a97992ba8fe2d9d9089f78131be7d9e9c827debc79985a8df340a25169a5051c85e889bf70f24408e78061224e7014303830392f9d57d3877364000ad3f00f9bd7c4e11c53a59a39aaa9a39a5fa89ca8a4cf916332973e6d38c71c679029848813bf01ce31b327d7c70445bea44f550638c6fa17ae63cab91267e572b970700e5eb5cbe69253755dd7759dbc2ede37f96ccae24217f479cd69a411671cc771a4b251a954aa141ed1c662b158a9140dd729ad5359a7b04ed94e3dbb65015481761918555dd7755d07933d0c0cd73c1ae8f3465a732918ce388e22af392d0b752c563bc162b158ac9700dca853a552a95423c7711cc76540cc2e8fd6aacc419fd77528c3dceb5acb469c711cb511c4a96c542a954ad54e9aa7799aa7799a67009d005cec1cc7711c354dd3344da552a954198f98d73507c2e82bd3469c711cc75165a352a9542a02bcccd7eb956559966563e7e21d47ec65ddeb9ad33e9bd16dc419c7711c613a02749e7357ab5518027a0ad9121fb02c6a2c1541d45ef20465d60f3b5ec06cf4e02e8101cd0b263f31e1451823b231e6f705634b3acb827254d4277e2e61fd740e33024896694b60b0ad405b52d343c3e05892aae9467764c3c985d131c20e377aa09a8e6e446389102fde182d104b6a7e662f5b4b523a2f9d9ed631c20e595dc174c344c34d261a7e63c70b0ed0616287def1821c1da073c40f3a2d50e9fce8c164f2934e143a5ee8e4bc0883a598e430f9e26588034f9700a0730750942851a274ddb5b469835d976592356d6af5ab36fe76d5e361c39c4214a23c0ed4e77b1020691e0fcc35deb6dee8577df36604f0d4ba54e13150b6873a3df50cccd8852de636ab216d791b709259104131433560190879d9f2c2e6fb65cb0b167cf6b2e5c50f4b565ed02c91c2929f9f4770e00a7a72109a7477f7e42080344c9a80344aa0fc005eb694e450e730b7ce529fc5ae50c4b5355411ac5e945e43653ddb39cde001813bdcf930cc9f2e25a92e5e5d08f9f9a24ef19297569ce423130d9f77dc077ace81a0e95d1736dfb94a17345cf87c7b66c3c58feff61c148a3580dc7a3174fe7dce7d0ee2ae7ba01872e90f5871ef03af4b4f02f357fcf3cf39a73078def9f7b9f560e01cd412f22e145b5033ca5f970f0ac596503833a3fc0d45b104aeef5c7e095c0ff2cf436eaf57ef85f92bee852b1471bbb0861ac38adf908615f7421a54bcf31d1c026ba82cf15b712e5471e92650a4d33b67af874a48f9540a455228f93472caa7110c2930a4f8e629a08882df40debf390ce2e75d06240c22c8bf94503cc16f1bc8bf81fc0b43b13a0efd9b48f9d43908877e5128f2ea3b58240ac5f91bc841a1c85510e42b147171e8dfbc3ac8331087f91b2af3cdc11d6e0b04e6837c3ec8bb9006e7b0a5c7f4ceb7e79444f12cbc6c29513d0d5c8fed419aef60c9b9e6dc375b5c3879cdb91b8a3efe865628e27e1efa3ed0f3ee827c7a10980e722d143907f9e79cf450d34381409e01af77e7b7f31d0d02f93b50ec1cfb1c34e3b95859ef39ff17d2c0b9c7859acbfb9895a91fc1ec41f2a132bb263debccbe8e7487d9366018866118ad9949a4a1d14a2bad540b4759c8c395df591524eb7a1e85a28f1fb1422e36111c6ad0e2620ba1e1620711dba67f884dc3ee2a2eb2f0d37f8506ece093837785b08d7418ca76e9169f38a693642a843542d1f4dc3a81603bd86018e99876259131ad449e8c80f65b898c29397b3391314190a592b7b44c6cb6cc12585fb6ab673783f4dbd5b3c1fe769540fe76714c099cdf4c2418d205290b20dee7610524c0059173f66bf1c71e0465bbb4849223917cc555544824155228f944726e762fb4644bb6644b7381ad03f6ce0a6857516ec9371f790afb0a287a8fe2f90a187a8f32fd73f0be47990ef21510f41ee58a726705fcdea35c92ab78f62aa178c3abb8f7265025947c2a852450ac6e7df608ec14506c27cf2e02a100c3f240b1aaeaf87a5eb984d4d0ac6fdaed418071e0440bbedbba546050137c4c211fb0c089e6f4ed387012c7f546908bb6946ddbb66ddbae839c030171e7dfeb3bf84b11f5180abf700b2f387f36112141bad93fbedb3cc3d67b3c40def83db60b7b168aa6be376c67a9bce63df6d8638f3df6383e772b2d04dd380fae685f2f29a3e1e0b3ea3b3ab32f10c8259adb8be71973eb1869fcec39da814f5c1034ebad7359e6159cb19ef9f785e27c9057d1c757130cf9eaa20994f81a721b484115dcf92017a94c103ead9e67b8ddc897ac8e59762fe6a28d17eb18eaae7767043ef39983eb33bf61b6fdf01e18322304f3c5b03c9ecdb363be8333d03acd444d7e73ba2365a66f2ea54ce6a4f1773065f2621d2512484d4a2c313c24d2859d8bf1d96bf2cc5e18cf3dcf2e66a1d70ae28adb8d1832a3c9b3d72ab154f819867e7e5c51e4124f2f6e224f05855daad3643fae8d29c8b790af44be86a26753d9b52ce41fb1595f3b161eae891cda892e818b6553592c4b10f2621702f0071d3ac01f59a6e3c60d30084a6f9ce00c209654f1aac20c8c091f43f8c0063c3754a48268a2034b1c21c6155b3c3105328cb05c5b40c146090eb688c1123e8a28026589288c40c215634c2365ece007149eb0f2a28733d8bbd9b476b518f55024ea925a2cd3aa7dd18a65da66535418a52923a66d5c377ad4f39aa7c7cab46ece39e59c3e7f4a3aa7b59ae65a8ae6c7b37735299b67ff547c629ae2133bcb8813511861e18c2c14e92bc79da847e444f444d423e211f9885e229ea9bab10972a312b2524d8ebbe9f1d0c6164e4e6ba4293a29ae9431e527c527054aca4fca8b2695f2e25c4ee66e4a2da7d1a981523e97cda9d279cff20be9cd339960c1cb6d9ec153bc741ea58cc648ca7899dd18f1d2e74a0c2e5e9a8aa810416588120ec909a424464cb0a63334157976eba20a119ebdb6ca10f3336d74b1b4919cd0a4249e9db31193e72929a5948622bb78582c168bc54aa552a954ea8644a2941109b3342ced34703e8d2ff27c89708700e17c4ef892a81caf42452e11ee10cf6e039ce6a8a42db616310d15d10000005316000028180e0984424112c3699c56f914800c6d86465e5a3a1609a3a12489911cc38c61c6006008010000c0c0504d150a38d14383f0befd95ff60abc8e50bc1bac6340d766cca119590def75f6de325e18c4580a34567fd7c54785d5d3aa7e1527d029a4ee4167941b01e50541f0fad1d4c386987830b94d088f18bbb4f703e7b514dceb4111016567434a082301b9ba0a92667188d5c9ac7324dede24941b660006097f2e697154c8f5bca6cda836cabf570a3e032cecd6ec3f40ebbe9d6568a16216f6cde9a506a3b82c6d4fb413fa3811543147d4c943922cffb2d9a58668693e18c13b82f50609cfea123dba25333ab059f3af50083d5788d4de12097f9c06018baf2f940228091d51a384caedecddb015405bac19cddb89a777d606ea692d43a1dde444cf2c4d525083fe9d05d9f9d2b51a6d598dc95d2014db5b03346b92768f5bc6ea10b62926293919d58e6ab7bffe31578dd7759a5d04f14bd10edd5615ffbc3b85a53f2bd0688db7a73be77e5ddba5fa39f0b677b6fa409745e9ad1662b86af6e1fc4c090f008e9a2c1b5e10f13ebcc77a1f125b4fdef3d625f715cd8dfd636813b108e5b5de2caeaeb2246b5f2590d8d6cc22be721f85714c37e1af69a1bae6099bc4e24e57ac11a09302ef64fb5f281835b1e3a8b72ce82ffcd618c53f3949c8578e0b90bf025c727fc55d67d0313716690abe49472897cb2bf9d6cd435be997d3cbd9bbca54011c15aeb11b3c0574c13b858d99ef1fb985dc998359bcb779f91ad1aa25adc5009dd4591f37cde48609471461529b9e9378ced8b183255bd58c2572f849fd64be067c11f4a0eb57f35aa746b9e5dcf068ccb705ed80458dfcb446f7fbeb08c8ec581a82623d27bd2e5df0c81a53c3326cc3ecfd848903e707fa0a861a0dc2d2bbddcc53b2e3d6ce33822679b9f9811a9a118a556741d9e7c222c83dceba8848dd674d1d29a704bda15449e277534139a2b53ab84f76ff830231f7727148c9392a0f2e78fd2e29bcdfbc6d85ab56eca96ef486c5926fc0cd66ed3323386cd6a54ae58b1a91b9fe326d4cbb9dc5163ade50910b8f9f9625a8b9d6d0cdd58a098856d12e5ff63c51c5b5b0848f30a3686bc7c10dae0ad3e78a1f19075f82b71e36fe245ba4469a3556ac6b6c7468dfe67126d51479b9cb575cf297c25f0d388f485e5529781442e89d8311436806fa8831974b47f8c7efd4083d05248ca44bc640f27814aa02d5cfdf89aaf9ac5015a907bb95b2a6d206d9f845071cfffbc4f52a40bfe1285783c7f814e516cbe494a41634338a94d4b96aa1c2447b72826a578fb77b04ac901150799243f474b2b5bcfb52d8a84f21d6b0f25f0421f668f0b52ea09bd6958ae37e68b5907ecd5a6292bd75254cfc48a6d3c6c945c5bc4839c83c85ab28265bba38699e736ba41c7da2f880af7251cb01b8ef7addacb7ba36a868e40763d2b910f732382d75a3318b75335066ef6615e6493c1c25b7fd12a8b140dad438a4f0132ae944d17585a547e93a1e279001f0ed4aa2815152f9d3180f711fdd20dcb8c774c01509538ca11a29672dfbc07e9d7ec25c1630a487c01740f79b4f2a93f4a422ca478c7f80f13b124bd83be25eeb48971457023005318ece2bc52d5eb7aeab82a0de07c024660afaa139c32f2a5fd5b276e85281ab15718997cd088c4dd548ec5ce71e361905244327c2018249e6f36c4f56ea021f06ef18cd43dd73815a0d7b9489528634a9360aa3e479446291abfbd1ecc06f30862a48463b945732eecff2769191ab1a41de60a90e082776d110c1c460e39b9af2031004e4c8722f80de95a23c9180d74a2d41ef61317327b3d8d53f9b4bcef5244a60fcb7442d1ccc6683c2ee97499c47c88be32353d2c9fd78a31ee0ac7a016e82b2481f6b705595c25fcb64438e7f9c1a54adca071f73c22b254e050870327808a8f0014304a99eb2012c7aaa36b427ae0d07c080e4cb7e0321ef36e215add2245104951145545832ce7314562b2d075fbafda465e8de3a0ef8f16c409f19a63278d01ade4400049035b42bea80b5248dc7e3feda948d098d95e2475eed497741024647091eaf4858be64ae1930a63d0ed35586928827fa9ef95678d5db046c0f80524a4c0473eeeaa051820a498d51863aaa159fa492d1e5213143f69b124be26ce0ef8eb00b4a594167665d47a1c02340622d7badbf82e3ef748a333ecf9ed0106320350567ca35e452f1ed710a46fa30ce0caefcc70f32b5d3caf5a97f9771cbbe901a3cf64d90b483128262bb397194adadc5f11030aff8a2c6d6b46cc3d33549ad61d234c2d866ebb70f74a1658caad56b3961e994102544cfb9c39a0b6402c52d91e7649c8cc5ce68b20cb5e0825959bd50e64260e73c9531589282da58cda10d104e80814298e8b9881134213813eb3dae52d74193ec61047fa9cc9def4472941e6561357317bf60e330d3f1a404a861988eb43b8fa6c008a6521911ac7c223a904139c343d2f54c2f2c73a4a689959dca9bbb00bad31e936d518872ec362b4ca3e354f148456ee1e6b60a76b485ccd2bc1519238d760c1a14a031a040c518abf47eb9c5180cc5d5ca09b48efa423bb5aab58496dae8573649059c641d4bdcfa542099735d3c42a14e8bce02bf3cbf8dc650c12401cd10d9169be685a49a2ecf6a9071ff1e58482b921e3221a0422adf59918c78ee96ed487011234636e8387d26055829978f196792f09927fabef8135c8019dc04404166e5b09ab972dcee4e867f160a251cae198aaff0d8e933ad917a2789313b26f54c71dfb28dd4de75ba58a903135f2504d7301c44fe697bf89888b4ddacbad93e9a12e0bdf4e2cfe6d535d47a60a14e410b2c3037c5365164a2997ae1bc836132bd714cf6471b2212e673b0ca0938a2b64075e47258b68c743442619e5d033dadda922f647085d9eb26822f536320e849b90f31a3c8facd22c7d3d1a0c93b7db697b83789756946e4b0d93c2442b464ae4e0d2b052eb94079c157d9c7add31e2e5a7022a41f593b42919dba0104bc4245953882bbb4d0ebb91ab3a93b444613f3fe318b46a7d87ada81dfbdc0e7c162cc60d45649cb6ec39cf829a927a174c724569c315db5854c91e4236530c2323c672526b1bc8c5671b8bf10ce00b12c9dd8195963b2658bb27c085e35a36734726ced274dbd208fcfc1b993c2f3ba99602aa4cc86c90d339f07ee722ccbc28086da3986f09022b7dfe1530bf596712f00702fe038007af600a33b49efb226f05fc47bc9a2aa47067495c95651b7ebab25450e544d09743c1c6a6c040df5da0f9a15883e500fc46dfb83e714701034197698f6f88013e36962f755a59d4b0da98bd0ab6d8a3658f51ca2b55678611938a2f3e67bde3ffde011b0e566279a30dc53bad80bec034357746646ebd9408387f9bd3a2366d549b429d644c2be28456491e1e91803480e5bb3dc898de1f70d5a867af4b5487ba34463a650604e0d1cbe68aba268ff0d620d29c645b870292d755120b3c866c1c664b8403cc4acece108304995ab851e4b5c02d6e4e1e9ec86dea8609ca8b1bc54c43e9374bea157383bcc51839093f877335f9624cc11349888c20b9002fd64bf47ff72735c6258695f262b00f457ab0bd10c3d692d954e563aff3349430630ff57416631c0dfed3312c88111fa7190b422c12d6203fe22cb82402a87afedeedd40ab2f0e83dd3da34d0c8031161d4e76e6a725158751515e903e1181c99770963c44f291147faf97e000a450b24d62087e08cacd1c43da862e46691bca439cb91f3d50c3bac1e3fb0c2a26aef7d921ddbfaa22b3350dbc35144430bb2fb690ba4a4e6fb046f3bd9633264bf9387294b26a4365b295aa6d8813039cfa33758af6ccdfcb7fc83ce893f3f845111751e3a037e5a1d3a8f80894e1b97026a487a3f0bb4f6e427bc2988f51881b073a2110da0f143f247de0d89ea0cec2876c26908aeb8dd8615c7d448df2bdb37e47083fc159fb4ca7409380197f844e13506ab82148b4861809a2d0128c1a8a1e84c8dd575fcddd2ee6c0940713a13666eb100ffa7bcafb37134539554336ffcaac63a201d1c9c83dec7b3b0f384eb40eb67840c661e845b98a065a5c06af836cb93931010c4b5358aea984a2234e819c34bf317f44304c27769f5ceb79469f856075f690db000018878816f91735d5e368be93b903de0c844ad71c9c18b78837d12e4920a341ab5db5ec99fb6168e719f902353b05b1576c889dec6a1ec269117b3c49fa602f426193f2ddea90e7ca6ae715cc1308be32587ef40b054a6979d33b50b815584d46c3b46c03eb533c4db041eca4ca78d254970ec804d02aa42aed9382091220d2c25230e6e2005395adc7374b9723ee776191534de11aa1323fd3aa0e509a6e2fb20e05dfe5c921b9155c39a8ff07ddea1c536be61abf2b233f6b06ec6da1f0781d7cd27a1aad18958ff83214f37164351ef5ae220bdbe6b874e85720ac567de144f016f4318635f416cb93fc62d7184de1c981a0f52e2ffb8128b978033c125e0500f71ce027674e1970dcbbfcff27633f31adcb08339615635922d59f31b11e83b74f8ecb1e4534a744e1cf67a79341e89eb9be14a2ce23923c14e16c4447b3b0d43400d7dacb9d82931f351acefc5b5cc8e4b03cd308a44ca82c847dc39334f557ceefc9a68f61615d8ebb5a88fc8f56ce95662eed53ad49e30b314b6bb091958ccc2a4fd77fd56197afd75ae8306e226b2e8f830d96d0f94b23a55f5db184dc50297bb15717197394da0224ec7bb53290df30e07688d1031d5b9f53e271f86466f9a78d16ace078876492569047d921da69db792609a2eac83b7c88927c5aba0fa83b801df66a2c4cd8c83fcea03466036d4e2541f19044df85e99bf54055edb6740059a6a77aa90e30d0e62eb244f7ebec02b771c44c1632460e910d52e3b20b2bc278ae8430900dfdc9208749b5bbe55928c05f7f1810d7ecd003aa25c64121a043271895183a6d96fb74126f036f880ebb1b86bc6eca017541b68961b5e492be424157da4d2658cfc2d0f700c32d2d1952503afeba85bc7613776a4a56690fd8e0e4da741030093db16e6f7c1af004ce35871a4e11d641e2f95e1a3b7679ccf6018582393f01aa204fc023325f0fc1300b6e16f9f138e1c54b2eaa7a5498b811090c8e6761555204ff4048f3e87873a457d39f164864022ab5354e6a6c2aeb1cf35d01631caaba868d25d58b6e5525d588dafcd1d6df4955e2c1dfb89e64f1285e8bc1fa5a38ffd13404741811b42f8fbb9f1fb6051517fcc7b2dd993ed34cec0888f205cf38f045552692a1ffbf93057c03d0a68cc93ec2d72ea27a1c8a29b11645b7aa6657395ee9c548be363bb65fc4d4a3123d5b6d9e26696df58a6fb560d06ab4e4e0af2a1989948723070214f49e32412384f36979c1480e79e60e75ed217fa5a09ccef6828d29c218cbdda902201a3f409cccae95625b840f4edc122349ff2cebbc98f37235c7627b246f62c1af990b67962c4c4ed25789a495793dbdc036150ff1c77b4a5880ea962096f3cf45e8f9251e06a99fb70d48cd40367b3613e1fe5a7d76e1386c9210ac84325da04d37b9ac568e351bbc1ed7333b34e20abc026de73baf4ec62a6c2d763d1d06e2487a8b30812b41eb7412dbc6fc4378bd42e239004c8bfb1fea480e914acd71129f553803cb7239a3944fa5e411ade1cb682d3d03a073e7d3566e6c39b3639bb974ec85d9a80d3e86c6010782616cd63b97f183c9d98047989a46cfbb1528245b0571aeee427c867c952fd4ba6855150740be2a91f09bd30fc5f459c9b0be234c4cc0dd697e35051126f7812f9fb5e580a77a17eda9057b22d377fed7eb52e9b256f241e20efe96dedc7b61e0c57bdbbee4780b1285edad8b344676ea46987a282b0451ce148c778ec0aa045b6e4f7813dee0acb1b0b7cc117b6975a76024e4c1d4648be2344d76ef66f16f79161846658de860e3dfb40766c2eb499ba0755113ba20b574a114f6b82325ab353f414a3c56879faf6deb96b92d1d65db6bff670faf60f18c61b09eef64310f4850a27145ec7bba034e167e1ff5968786425acd36f9955c9e3811480a37e77dc112ee402fc64807e3c905ebf1ea8520d76765d46e4baca982a18bf205aa3ab36eb533aa8c1a389afffcd8f3e4a503240cc868bf3e4c74d49d368ea12a1eff5a2b55f233e19b0e7699a22e180bd7f34e5e501af4228734aa486d234e538dde5f638214f75222ebc16230b23f41741d1d37e92fafc51dea1723e97089ca238cf49b71db3b7615651f62cb816de8aef64325d1460d5c57441b70c906f4b07293cf2a1bd4384582952ca471c7aec86082005e306fa0106b38dd26879c40237f365a3c099af2fcab59c03de7cee11161fb2992bc5d734092640e451f67811d223580644ac8ecda074d1c5d7534e73e62e322bef2b30a68123fe308387338eec737b1ace4711158995f65799fb744c031fe041522e8d5080eb4de0800905ce35c42a35ad31cbbb77361ee45512fd364b5ba1e9f904a9fb0810e1cfab035ec0d0e399d212e1da44f98e141e5e7a07ecbec8aec47b25f2c5de9e528bf68f5db93c4fb939d3f295aebfbabc2b112e12a6db12c05c6f452586aea2b4a23f4321e5f4b92a7bbe301994653355bd842a3660a87bf81a4e18a55be40efb625a85d6f1bd4ba6df3f1c355113a1945e692cd1e12b6c33b211751af4f603a5ba52a1aa2522d68cf1cc39cde1e0cbb3361ed0a6cdf9550acd0ff44f8c77747051364fbe65486ba9686f37871772fd5938af66c939178cb505db79fcb80952b8ed723173211a9403da6ad3e54168c900cfb182b7e78fb1de61d87ad751a8fb35ae845e7cc0b12ce66281f89b7572ae2f97ed58d231888660df226b977bfece28d0a2106e3ec33a4650f82c4195c1ec28a4a9dc02d03478c7d75786a4c3a35311aad17a3f0de01f3214402aa6f343dfd97a9249ca91e220437ef1a26e68a57243ca5884229608bbea4fee6bf4c1e4f13fdf56a7a25667b546ce3f2a5054c984c8c9a5890d2df351d3d321ea7dc268a22f91e2dcea7c881a4621c8370b63dc91f82d39f2dbba3e322a3be8426f6f2f1be03fc343e3c830df675522a8cf12c4062dc44a3c40bb80c12fef3e21b4f8bece7e8152bbf232b55e43046ec794a902b172228e4421565d7b636fdd60d9d638c902bb6a570ffbe7373e496108dbb678b2dcca7428dc2f65cb81d551190e2107779192d9927e6b59a33a893982ec541d7235a98dd352649b4b7010496bb1ec0c085304c9b6157280b0e1e1d4f52ae85708e7e2b44a9bd041a8412eed326425ef50e16a5b29345e2915b310a952b9807532326f6ccdbb23402eb34b16170a85849a53ca8161307364d13f3f26819d0b53896502f34e5bd1deab512d2b772c6d95aecef28682eeaa92f6bb8d6594ced3c844589264eee164d0fd9ba3ba211579380d200c1a4cf7ca5044fc8f0e47126e017529a3af6b95ee816b625d824e484f3f93862600152f3a492d526244401c341ce02095992dc1f1fdd4e229b37e2a058507391bb792b7e2689b28835c8e2d827b8ab9b52cdf952b2be728985a7e0034a29788408ac1b990b3745205a595f7bbab626f97dcc81aad83243a11c29fcf363de12227a25e9d9a6e774c4999c7c9205040f5e61dc9cf683314397d80ff41ce4b9c87d8da4b10a15308bdde2b0c5485b7f838233d357eb31f058a1f7099ded574649e028bd730e2245085ae89ae4081f57996061d4b815d4f5f70bac1c10e7bfc783cb38ac5f039857e4ac1df6708732800491b9617303498469f42de6254811589a8c0fd273e13c05e23faa252e68b98ff067ddc272eaf41137113fd2bd675512ddb11ef67df0e4cb28ccd218ee9191acbecd81a7164eb12012e3101f28b19010cd40cba6a8fcec166fb880b7a5dd5bca0107105ce48c0e75cfe51e6267b792da620522d6c7acce639264fc65cfc4360312e4c21368e0822608a2ad3061dfc698e831d7d5e9a4dc7518182ce60caeb748f10f4dec0937fee6ecc28212032c88ccf098fe6547325829598862343901976c5dcab1547375886d2a05567d8524177d9f6ea8712a3b011e6da994350321cab7d6b6270e02bcefcd9b95d0f73a5e1bf3478e04b038f80f5ede533dc049de997cba73e1abe4209646df0202e7d634e835e7b0feacc18d3f2f7ff6b1bc608a6fb9c11ea3c75e873a7bcfbc435aef0a96e22cc5262a5a11af46b3e37e3453f6a067f5fa6e234f22e82459a40b813a6cc36d7bbb7ee86aaf95c7cf4de9dc565cdc5337b7f57646469f6d30eeb892b238a1bd493f45b1782959038f3ce584432d113e0f03e32ff7e67c8380686300abb569963f6fdbc20cbc4b03b37b828dd5ed8ef3cdeaacafd9d4ba9a4bd161139879de6ec6439e5d11ae2c50d4856594a9d80107f5d5dcc5cd58d8d87f9a36b6b89442c471133160998ad179cbfedc5d963291f04c96671dd254d0b2e5144017b37d75ff8a89de1f3c69d350055f4d477e7881c3f035e99726937d5b8787b27dfff00ff8e5bd5c95f35d5954e01fdfe1c20669e8ae0d3b53ac9d99a756c0f239e54e48408c12c01910101680269323f80f71a87ea11933d54a6c51d0e1859010a1f4b9ae75723b3ed8870cba0b562631fddca89ca2646168cbdaca24018a8d66842cd115c1a609e752eaee75c51b1a739669a0fa0549902e9f8430ca701b4763ff68637bf4061eee3407a539276caea05719e890a1ceffe57adb7e2f3cee97bdcbe18c4efc4813985e82da6107688a0d40ff8282ea34807d2a03a5cbd9f458db77089945eb0f135612e11248d83e7da7cc4aab015a5f3bbb4d65216146f10bf7a6fc96d11dadb3f319d03091e68976d56d425b11129c21731d97ffc382fcc82ce5b8cd246e79f60f8dd0d80130a7b40a970ac4f4ec7b2c0a13075b996e0e37e33e1a7ed691f8c48bd76fcd8087b1c32a01e79070220c201114474d1bf1c932133e7ce3d10811c98c2d34493c5867d7224ea90f03f97c67e8a1817317e0d36da196a190e06a762f4cfb0ee30a28e94ca706105c47101648a3d0c1eeb69bf4e0878e671c0ade2d7ba1bf4978f1a53a2eacb1fff340aeaccd213e8f0a0b141576dfbfd02e8e1f8aeff534502ffac7b6599473119a0d29ae20a43416b109cd58100616f021edb43888f7eb05602a66e62c46a51a98e2e9aa25e213d4e40a6a01ed9a85ef8a26e432103f02feaf03fc240f0ffeab81d4219d2ba0a5ed866110f93c44c89ba1ede81ee797989bbdcde9c0b17f0e816caf86408f2fafed0d14481c8e0bc0d0055ff7954b4e7f85549d642b9c43eeaf14f769ff7d4ec4a017d1b6229b81e78c3c2668c9fefdf43971001306ec8e23c0e8825b510a1de23dc157936ae0b52111314e542d639be45a8f413f8a26f64cecdb62dbe211ffebcc0a2535f67485c89fb4b335940897e7050676276f62d88f7d3d29905200e5d54671a3ed964b9ea7d8ded6ef6065ca42ee5e679ca8208915b0c8d0ae2e8e64e5456f49c13adc1f2626155cc0bdc00f031802eab50eb158d7fa5c7c0631a53c74c5647723c97bf7da5695f8cdb246ccc0b32c4e1c871502e47d078d63b5548b09de64223b9b4ccc5b83cf9399a8133377be0f479f7c66f02fa30a71d24bf581e02027a903fefe1d4f83dc433b9701cf4c1fe011cafd389692224191c67f506ad17973a8f0b081504fb3e4e0c3f709b86aa03fca8817c6f0095dbd7c04665bdab6780045a87e1edc1b09b58b0ef966dbde0ba9224964a216ee70300a385ada8cebd04fc34c7af6eaf619db5d689860f075a652b2860e023d49c8012ef0f300c0878489e9e866ef2951a866222932920305b9341f01e2098b8d54d7b93240a3958d0b0cf08eb2392c6fcba068315bcd4024cdf5f1fa514f4486ece3663120c2b7772aafebb3fff9ad6f7fb5a80792653199da0eb05545c0644a44f5bd8b3127f5f2df6532fe5759fe3b9103f8df83acd5e8246a2366af6414811af53f31ec258f5481f3c13785acc5cc66b8b83eb15bf7ca06df1be7699974ec7fa0eb8f59178205fdb72fae3c7457a5af18e7e807db1e58f8bad39380b046d80a157ab032d908eba45366761b6d836879f9a7232957015176c48510d78f1fd45d00f66367759fd26e71e8034a729b37326410f25071cf62e1c742e010fc14694cc75384af4a977042017705d822aefd6fd238436207c9c3260945b055e0b099e4bfe199939c613fcabd04d80738e14adf2978caa6c1e93fd50d9027f3e02687ede2f4c260f8ac8b7a8078a465186a67a49eb31323330a15e5595fe2e77d45f54a4cb4e1e8c145ae3b2d6c8a2dbfb4601293d0c6b8521f4f88ed86e880c9074527d5191ee366970574a844b942f044ceb692aab9f83c07c8b7d069fd0bd642c7cc1c4cc9813457d220c14f76e98a601d4bb1e523a112fc7e8f6324e4b7de0c9fe6786eb1d5caf03cc370ace868fc73294c790328b0ddedc94fe77e47d8b283bf42644f7ba112d79d9d67725ee9109904505647d40f7114a8afa44eb4ea6a425c2c271611890d3669e73486210a21e37147fa4c01131dff7d04a69626e1df56b0fda4e0fd9388c35860a0e014d42beb281da8c2632117b64cc7409fbc4bf929b3c5d1dd72aaa64d24b99b11478605c1117a7dc39c1519eba5bec10fcb1826966f080dddf34e55bba80020a2fdcdb85cf021bc318216cecc8aaefc21fc5fb2ee5c18f421cce159694a689056343081e3ee9d31828465a1a4ae45fb94c10105f7eb718326ce356ee22daba925c4e6907cce799c50f8023a858bf06229af7003f1134bd159905240079d66c322e53dab145b6e5d4d8b69b260d58df7a51b3a96e73ce9eb3b5225930f58915d55d839f4f2c63b0b6db9f1009990628be58a05b510975068784504cdb70d4a9601e1423f54535d1a040f17238bdb20d10e47b3d4a88b1c116dafd5976743099253362ce8cc922573e2f56a1d7c68bb7e3627687990b4409ed6674d44450b6956307d07a2ce9a97a9d67a14fbe98f78e589df169949ecf288843cbf5845f30577de47c9dad1f0dba81c4d37b04f2983deaaf6f7fc4ea3f57e11fe4cfc8d1e09a2cc819796bfa7465c037196ce23cbd4378b376c8911370616e54a6610a9c2c3c5d329987e329622d7f9102f9b4e1682bad410c3c5d9766ccccc0ed42649e8d504ea979b808029e9d33596731a39e989cb5d2dd536eac131933644e661bac7555a3795dfdcd6d3bda7bea05464f8076a101c0c833c2c8a535eaffcb42a6953cc2ca7fea271b4561e4fcb321b1964d90d421b659e25f56a7163a79637e232c6de5aac7c1c43cae8a33ce88c64691bd2c4d6a6ef4f7673b24601b10cc32f4a8c939d56dae5107005fa37bf087c2de0e6b1c3973ddad10d65ae1654f0c504bd6bbdb32a46d62a4625320787f1a3a00759c9216dbc393fd97440c3031ef60c8f4cc1e06357dcf6b943d0c0e15ffa2121306ecc0b6a61d618dbc3df2b4c87f23210f0d29f4e2961d9e109204905273a1d3693f0a482f58a3db6dd3501780eda0f95827e0a3e493507e720cafc9264c9ece8ba3320c38ef15bed9e2a7590d1a1f84c82e38bdd2efc0893b178e080c07295c0c9afb4a09292965921209d95548526c1eeebed1ca49afdd8f972c955209d9822426038d035d0e6b1c2a0cc22329e48af5bc085862f97734ef6937ed0632afdc50a101648078ac3f54994656a62925785befde115a27fcf70c7e40abae5c2c22f9f8f6fdeb8e4cea5773b7a0391efefa6ad717dc9ee7a9aedd896a37e052cd341d05fe6a305ae56c72287d9aa289020bc99c91585cef67c6a3d762bda2e2220facca448f04ff9c12ddac9d7d4d481c9bca55350c5f57326db4d5a423a81944ea3ea9866835c92e1bedb6db593877cf57010b1e49cc2fdd142f5b51c0c4443f1a770341e3b96defba177d5b8f61a3a0d05be8ae2f9932fdc269bbde7e69dd295b696465da6724efbf73fb5dac267579091d3644a84465a2ed15b39a0a070074f1a4c314d68ee9fc7627a46356db4bc814f3e5655d1dfdf4f3de5edc43acc13c2f489151d2b7ecac85e66353a96c8f021e9bdc565640a02c105faead9992382692d829f516290a2f5becb3c9d7ed700c9d93d95ba8415874f7d9b34601b08a46f9b7d06e63d3c03753dfe4ff555ae2fe13a670dc8ae2e8e8057da3a8c5cf18f90ee9ca90e873857abbd99d07a50c5600c04b44098a1e8cb70d44050783d3d30026cfd5540cfe4a5d36c03bf2193d00c43db3ccf93c3dbc01084e0f6e670c9a1e787e370ae305cfa07faea38a45682774c6b25b891f1557b527e48a2c1022a6ce4c151fbcdab517b0a717e4eed10fee8c648f133b9f96b1a9ad590c9f7b787b9739fb3bb8e911888ec80dcd42d85a0fc4b680334df67f041cb05200b8dd76631b92a24b23fe51eb18de906b82b3e2248a005d52f0da48326100672582bf6f42f1a25362900677bfb868f80ad16bf889cb612001537f634229d2e20ae6cf64bc134847e7dd794797d90f5de8bbc0ca6a6df539bb456f9ee97bea4d1cbaf056ff818a6894430cdd45b9c59bef51f567a140c204e5ec80ea47c849a23b69fe8ab53d60f90c4a8aabd5bd41981547ad6ff939df0e902f463e2317c721793a7dd7f5bf2e86e44bf417fdeb29a2066101f47fe343a3cc00a2a5239deacde67080abc260167e827be656f2b9a2ff66ed6c80c3060873880a68e8efee334f7afafe703ac55ebe16ab49e437b92ac941cd0798e4e21a588368c674b5ffdf4bbe5e50bcdc5c590bc447cfbfea40e9bf432b863f781d837abf39e5dfe3b0a7b612a88938345308f60469770e54d34d6e1d08e9c792db84dcc4570f5471b909a049f638fc030495d08730c05a3c383432c32128d07042598bc1f07d5ae1c85aa1cce1e2d86b493f92be41b423d9e2a611557202c8ebbe2383aac05180dcbd251056da509d1ac5892cd6231794549e3d9cec1050e6d907f216b0866cc9094b23d7f5e064ebfc37451f3c120c7f60548240f870601080e65008230d1b9a0ac9ad6e31931c194a262749da16ee28be21bc805b37afb8c21235cae9d1ef143da5de0fcb4f1ac7ecd19085be235241335113e348206f24e12ac8b40f61ae66dc3a2c22695c6a700e86d7f7519cf07350310169f5eaa64723f38fb09aef09f7209f780d61df385286f0cece4b84d170930e8630058a43d539466846d8d1bd243823ba220331de67f3ba3e7f79703e060af659ad18b66c89cbf4ec4676c348f13f981691b577dbd9d9bee69c1efff247dd170c50318a5da3d30e88e045d077d4501412307b569d149fc6a0f9096a89391a5b68ae7d1768db84dff43aa2b5ecd8cdfd64870ea8b72bd2649dfb4689d97881e2a1368f54beec059ef2558dc9e576f0d4e7f865723507a529c7531dd6e4784ca36094d6b1d5c3ee1c1a23039b2a2b4f4fc5ae0bee4d026dc910d414108e0c85323ae206b6a9b837723250fe68c0f262568b3ae75c46502c0550593194bf09b8732804813c0ab1d26ea13f0323f9663d3bcdb74b9bd9d15aaced63dbd51d0ecb4f7bfe3edeee932b3f1fc70095ebf43ffd6617f44750120c5464523422a09a6cc43f84d1831c993cc0f91ecaedfbe90144ad9905f60ab28c30a3450e8ffd256a6324d78d31fa2487b82b79f7975cefa72243659c7c6edfca064dfd505e5c23895d344746ee3c3937a921c6bd35bfc95a3e8ac7e0bb99de6451b8aafab48c5f7d341ec849599255a9df203fc53d1a61386e5bdb759ff8e39c40653bcc369e0846493c6c0fec20ec20891f6c727d6f4c4980229856b143c1dd3b705b8e65616003c00b794b29440450cea13a6c0b4b789465c57f1508968c1432504640ff2756477683121f6369b1df25aa385ca228e1ffc77f77ae8cb2c4f64114f829e98ec3a716b23c45d1eb9632e9b505d8e3e270a2a08b9279e7be458e678f1887ab1d884632b6e5b8c1d607216cb21d87d30d3792bac737ba76480de647cd387c6dfbac96b7556d9d805687f72e3db181adaef7bb113ff2b672bd111c1671afe0d9e1d0215dda9fae87ab4c52af0e61d2463688db7f618ff87095bb020d6eea92333f0a0b380449956132968b934d24a85309bec5f7fa9666a9e8bf96170cdc0c1713443315f71780e598d3a123135c91afc5926c43299e14234607e0b775a03b867214075d0872de663a70a761d67157d330630b88c574b9abd856919f91b410f2ac9753883e14417002dbbbe9be2efe04f0fec6eb8e9ecd4037bf04026c57e24aa17c261c4be0d3ee5ee0a11802cdcb3d93c931fe4440eb77fdb70131743a728c8a87f1e04fe0b9eceb9ed538f740db1b3f86ebb219ad499fac49bb4b68f3c92fa07857ca47d51ce074eccea1d52211f320950a2283cf2e3c6c99e350a8e8732a786b672ac783d82e2976679b2951fac2864e1c1fb93a7b6d858c6e7e5337c8bbaeda935bfe4cc2e60679bf960f5d591ab2029cdb4c6b034a5ea9dc2d32125d5b6efdc6075ca2f2d52d2f10571b3625794fbcc0852a5b3ab44082451c1a54f06ec5a008b0385e90e4a6ce1d3a8b2ec0cc93bc39d41e03417fc4ee85035ee5a8332aeb117cc860e57edb447b2a86ee8d29a8e16cbc10361b4a214fe8f6c64f2beb6845a84895bad9c0c1b65cbb8149570ce13b790f4f5633940f7702af7b268882af829bd6cef90a0e60f64f29a44f0ca84f6f4c718ec5fb99a3f42136e5597d05a5945d20c68e00374b34cd794554b58328d1a322ad6b1cb85edf493e0790e4b0ca80ae6f21c31b9939d46a6f5b32fb9ca7f20d1c1981c0051e179caafd7f1d1c502d433763e05013047e5ad7ff7a658987890db398d92971682079067cfa9e42b8d21618d06474f8c49493e71a9f8fb1cdabbdfcae27ad6f6673354bbbaef5075583694e8fdb2fe9f6a6c285310e7db95eada432c599c52494b5d25bec0c8aeb688693f9f827b1f7055730c26dc227d191ef0a855259ed21da6017de878a5e01740b493e9035476c0ed45db0e992aac4520f5a3dc635c81784cab68ba8439e40fc69f96b5053b3547be5073da189e05a472c1364b649bbed990ad154948a3f378db84f51c9f76626048c925a94dc91bd788135caf907958b1c78a54a4f4c39191f4367d388f82c3321bb156f3e902cea041fe62946438f2576235cb66a01f6702c23544383e012998dddf99696182d48ae919323fbed7ea5d2e34ebc0b946b4ff8704f195f48da30c0e1f6b88037ec65092ae94944f41a5ccac734b490733c37aba0c9776ed681962ccdb5e2c3ddad586c7a0f9e1187876404ecb5ea66916ae49680e968427a148a15cdef8be78e8491a3b2dbfedef58b16ab7ede5dc84c03fcfab92b75d7ebcd36365904bf89b461c98c180488ff631c15148733d86c0bb2ee32f9b9acff50c435685177c8f85c2e918b356c77a083ffcbb9b29b6313371b22942263a4fbeec193277f9da37024943e8680fd8f1e226ca849f5eb7df61ffc32d591db0e7072e24720d49673caa16539ea69b87de7088adf3bb55c7c4701b5536d802f9a69d30e00df27356dec6c4b6a3afae9c4d4d38517c2f5413e5a42fc49d4807a1332239536c444333b704495eb161feb05ee370583bfe55b5e0e8a547f65255a9ab68585f19f7e1fbb0e01b53a998d00641d5da6fde5a968267220c7ffb687d19e739a5d9e9aafeb1e0ee9faaebaeb796dd04380ca1b52c7c6967ec274bd55cf8f1198164bd74a936d94c6514afba3377bbfa8b3b6d77e97291ebf412e4de9bc1ca9b12196fdefad2faf67cca86089fa66755630f5d18822201cbaa31f3b5fa959cfdf0e62042c755d375aa9f549bd5c4a2110ea148d0476b77521fc2ef2f23e0a14d7cdf98ca8a6cb93ae2bc33d1e5eb7bf4ad06f437c815b6e5ba22b0700d0660fb6c5dca8a110f48eb7eba09ce456b72f1b8f6b480c711a87380439b6bbddbd093bf61e7687b56230bf8049e2bd1a97b421a1a12b06527ad73be33bb107a0f152c8e699f4504048f8dd67697466c2a6fc0041b5dc1a4ab99523389e39f5e3ec80ee2026b95a09490ccf9fb733f8c8344b1a15406551c305ceb0199ccb61096028ed7c85468c096761009cf3529cdc6fc057b747da9da74e170745358640cda81f081764c89035239bec19996466c892352b9bec4c19326664903523934c9023e8bfc9ad8431dd01dcb1dfbec661f06e9ce7b2d201351bb39800e4d516cb26d55495dcb1faf0588efb6ac70d6f2884ba086b5f7facd79c5e87493a59435c6f3c39d55f9e07e4ace95b13fe76c45c25519a5f0c1654427e1fc57c88a03468be2c4ee7904ceb4bdedcb14dc0b4421fbe7c5edfc135541d0318ea6f5629c9c7cd236b09312cd97c4cc3a3c64a2a8b26dce96fd796a83bfd0be7ca635f00133bf3bdd1e2cca24894000c5879f59cd2e29df3258ca7e48432c229dc580cbe44058209d57a42da4abe4ba9b3f76a61cb80e685b857b935fe337d192a93ba6093b5c229e768064493465613d803c0a7ead7673a96e6325b0c65e14a01699f3feb351d9aa1744bc720d1fd6985f19075df4b63b4482cbd20345a3340871501d8d2f779b2a37d3c40d4813f2a02285a04aafa7e1fe704964e94df12c893158f9b811329180ec27f6c16a6f431b6085bd60c3ed2f654ab3e0243569c3c86a57359510569f180588916f420258508f9ea56e958b000ce638f95dbe65f96956664ae6ee29ede53658c4b73a7fd269a28f774ee71ddf399cdb3bfa23b6a4d2fd27e24f177c3c0b786cbc5679741b746e1f526a6df0e75d8d932c92125369cd3aabf64e71c53211228193de74c54586c0e0a65ab46d8301fac05e0518263264ab834731359d1cd15449eb43c9eeebb7c250f30cc438ce0784566677aac814d997af7373a5ba9ad51988bd8e9c894f2688426e54cb2b6b9be432086146695c7d8763c25f9ea2a1ded06f0aedc3752307c342f19c39b40b8ce8cad1624a6d3ee7910b03d00983b4c750e43afca800def71e168d8e3572eaa49925898f53abf438251c65841321c82d6bab65ad9b0c67fdf6d6c60741679838a03b206120cd63350420a38d376474c17ba12a4f542267c768c303a66e2d0ee84a15b213c68f4fc97ef4cbe38457ae3c9c3146c18aea0670d5eb47c5e0b8e68803144a334702ce71ae1bbeabd02f5ea47387572c371ab32a5c800444d2b5058aa1e097fe06a167312bf90334c5d242b36ba800a8e143474a2195b84edfaefd5e22f19035903a1a6db9b5647ea08cc6540edebb1f6a15e9575cc3caa0cdc9e2e394421171821e905c5a2769bc623ad2f3020d3c9283803aa489ea6dbc10ef603b09b4c11d6831f0f88dd0a9038af80587db1ecbb2edaed02035f0f384cb7c2161f48dd6a6a7c87d6c95bd08cefe46e1d45b12aa735228c7b9b0a1397575c601e05abefcf82bd7b50ace91dd8111f31348e7fcc4605bb2edad35d30d1b99c16df469151665888c72e8a3c482d4889c09865ce8efba791e7fa5b1c4c648af2cbeb15eb3d547d4a41681eeb24ea9fe5300e9babc155943a545c7431fb32e2535d82028467a2b14938ec7856dbc5f81140517c0820672e1309b26972b11a791e2fe58b0e4e02b9836dad3cc33653ea6b785f40fad16a1d290a46c2dd6ac242acd704df6b58f3e124d1b1fb2f78ea1456f616bacbe0b501c2888891e0b25ad2aaf6d50f7580aa8fad2b000d087318556f1820cb233014bab9f56c4a67e3417e425937a0b3f4f8fdf3e11a27de067c58d734cfdf241bc2b277dc245b2c7afb805b39e06c24f345f3b58f9100a385244cb364cf2637380eb3c5cd4fb05c97972080a5539aac1f2b3fcbc6e211ca6df554f1aac8c5a742d7416ad1c6ed445b0f47374766875ad839734861b14bebab6baf4a05ca4199a32d0e65f7a097537058d95cc9bd8ecfa660aeb6ea636494136f3fc85c7f282ed3ff9e557836c67213224e7b0fe151ca3649ad59c855aec6e5e199c5508a283d6e049091ec88333a94c2b2455c350dd47ba8b794a10fe0c340f96bb33a28d894ddba2a23be27681cbb42b35eb46cf5b5f6edca1e1e792fd793af49abc89c0dd6c58e5946d782cb8ce489a21bb93a45a5c4d999f049b5923aebdaef24f030f6acae7afee23d33957a57de3bf9016ed95604fd8f468e04253d8186d4cd786c42492f0c65b0f15b53269553069f8c32369245182bb7cd8c4ed6aff3184dac1f22c00c17d9722a7b8361e7c143cce4c8c14369e59c151934131ca8327675cfc46ee11aea928c5eeff111a0e4316e00bf0fe13f2499166f2f7ae80e6500c45cd7de38b45d6df0466609134d01a740a8a26802f8b7812da4997c2b25fdf9434ddafb8c73ad579b820c05ee31d2476b03cd6c9b40128269970f6006c51559aec9db4f2b4af9cbe719bb31d0a9552f19d7ec94b246c01b668929d5dc868de23e68e68048bb997f8631c602a3b5cf3364cd5e614e1f7d55b47dce5a29b6cff1e198c25db245254e21d2dbbcff94d01be8158040308a131aff364404ada305213fd0444cf5692d0065a375ff7b8f2b7fd362ab041ecef582b1e236e957fc7be9c687d9c85b8d808f83a0e8c485ddcca5d984dcae50d04e7ecb66a06614a343222f16718a9e1208ca30eeba1c9333d9cc8b1777f029617025328f8f36bcdd692505507a1888ef8101bb2ead031dc034f8c0297dfa57bb2cdc6246954a37be032a9b04b6d08d9ac7e45599dae445f27d62caf1f4fbef100d0fc303b529271bb4e8eed0030d53c6e1240e72265a604f1101a757a0c65fd169b40277b4a49c613917be8beb239956ec3b5b0b6d2e0cb66a65e9efccb3d5e544b89d1b431b103338d60f63725d10afc36a6b83f2a0a04819d4ab64b215d21bc1fb00b315721732a9097565fb6d904798f160b92e143f46b44c0b3b3c02d6765b3ae90169db2611de880063f9903d7a403471794e1df7652bb715f7b3aef0b35cbcaf5877bf292c3f0d417cc36878191b30b977be25b596ef5f50a74d716dcc825a7530d40b591ff2748502a44dde7d0ae224a1f5f32713b7a5f3a0b338b97699f015f4f4dbcbfd94cbb00df0590f8d9a7ff106f783cfdf291f8710bbd90c03f6c41d0e1bb788df770aadb620f30969488257f4e39ffdb26c1545dfb26e2ee24a2f180b12a1b9f6643ad081e2bc1528035479d50f38ca487697c9aa61122c9d3611b9bddc184bd8446cd3ac314efd6ab26a6686b85c0c898bc5eb9cb1774470d7a539cf6fcdf16783d9c50a4b671735977fc4d6dd8e4ce099e926b0df905e595240e465c71aad33051f14e732795dd7ce32891024bdc12b5a071ef4e93ad913acf31630f87b97a82bb29de87372d149af3e5a05d72156201aa539f4faaa6a124a1ad84245e3ad90649434bdf61761142ed5c164bfd07d04136a6672e377fe70c97fe0d2d7f4120395a0691541fe0b9d7430ed48c1b36e974e7149fea2e3e780c44b74559b0f10a668afe297d6cbb54fac52d9cbb9a1999e3469180a97f748682896d5ea1c4c1921c6f21fef7f78e55ba18d1c1b64188747a6e18f18852f026848031c98900aaabf9911a14aff68277149d2d6c0cef4dd80f0bbfa8f6e1ed307e2d3370cc018c8d794d3e453884990039e276770bd1b3b4371dfe2c124a781d248d5a77373661c19e676c5d3ffde9dc51d2cd07b0817b87cd1ff669c05a23b75cad1a6e14db495e7a760cb210202ea78ee101a42f100b7344d14fa657931fac90db1c715b95f37e6a4588fb48d460029989d0b01c7a5e047ebee73a07003f23e12e1f2ae8308154741541f84960122e10062a8d1482d21d0aec6d85c4fbb8d1fb021a43127939dfa3fdf88e6a6e5457c860b8a5988d4870a6c97c7af3b0b49a99538280fa5af06735afe7549fb7fecc57eb9186a7cea7e909297a4d7566131dab33cad57735a539cb460010a81e2bd22b582335d2238f06b74e365ceac7ad105c4b3e67e8fdd4b60e690167a6ca041873fb89241cd07a0a34265b44301d3630ba1309857c62ed235772576639b2789cd3fb958bdb209206bfe958b372ca64c7d4abfa820b3b2bffb61268de7a092a1425b521921257eb7fa1e412f3556537f3cb9a476e7aa0134c2ca6d51ec0ed4d84b57d6bd2eec50ad4cba4f07eb5a3d4bbb51b15d5236e60a64c9db2a98e95c814a3ee6a3fff6d77ad7dfe49f1bad579cda55ccf1fb6d81749e6749eb8b2d09a49fa721cbddefe02abf317ddedcd64383e5b7ee84007b2cee690a060bf63470b15dbce371b96915cd6ba59588d8b8aeafb5b9eceb66dc6ada0d13ae3db84eddb885551d1b64e76e9734fa3efcb94d925aca7f5b41339022ab0087defa79b5ca86cfdc686f9f4c21ce1257f8707a31167874f6951fff65ece0b45722e160d0644520c23654a23056c0a385488df2d58e80ed9101bd4de8ef1b76789dc1934c14d9747a8dcd4d07682f007f52970505ce4be05ac9adaa58881e2f1ea07315167d3e7558824fa433bf94d4a891f13a58ea02cd9e3b526a6025a75362bbb2973188345f0172ca236f45e7eb6853d707cee19c56958a50a36377ecee19fb6039b1bec916def13bfff7ff0eb18ade0f6e13b5dfb36a4715cb1a737031071e79e764ff8267dfca87df8c0cfb984fef3f33a513b60193e92775618eee8d1a58d13c0da8a4d187acad7dce7d7e82bad5b05eacce96962c98a3610eee41340f2103f94931b375b30704c5093261776bc24bdb9317238f2ad40cad22b5e106fb08e83cf945d86541d22bb8a3bbb011f60804457fd9bd65881f2349564c95022378fa4d330364f6fa8f071433569fe754835da88f48381dc75e1393493ea97851f031854d378369c05cfcbdf50a9bc65a73c9d11c83166ad639a8cf2b0bae436b959ae54d12370e15930922d950a85eb8152a3bb0cdfe83a554850d481641cb001360f7cba9d71c888f29dcc284fc2c57dbea3fa2b75fbfa49627e217b7cc2d610a80bef4c3c846df52169d23d5784aa6841c65fde6f61fa2c3e073d0733c687ee041bbf68396771eab1011cd28dd919745b14297af429f56a19daad028aad0e65468482a742fb4b2be65018a222dae17b480be1743284023ed70df8ab8fa286254bb3adb7e188c7e22723e2b623f41bd2a75229b172d511cf1140d48f89fd40ea833935c7040241b6ff1ee500e51cffc9d7e2d8d5dd7095a875e404fcc31229d342dc88576fc461b869a55f82500868eebe1dad6c89ae0cc51351677fb9e460f8311695656e92603d177bbaeea0703f2d5bbc0df76032ccf54c09586085d8b3c7e0555cc17aa3f4a3cbf4330cfdf878eb72de0debb388ea66ae825e5587f49bfe488054839a9541ad2932ba6b9053517c93cd195ac277948cf3dfae91ac7412774076a95b28acb471895800b2d9b3b2ea47420afe12e54b8cdb5b05f7bc706286fdf6de2bbc3aa60a24eb821161fa6c30a78754d1cfb5e2379ef4edc975f2ae3885c73983e3749c6770b81a8b8ecb5e6cf4e87466abea3110e25bd78f604d9119643a85480dd8e507b5f5485d8e9cd04f411b0f6e3824876bff29551cd4b006537bbd76d0aff69df7471137144f69f14368b2c6aee80855a97773d232bf2b6c8149b95b97cab484730e1bd8b4a2603330d8551bafd55850764f3859d4c155b6b745fa2dbd3a30edaa4320731572bfc0eb2a41b4968bcebb0334307f8cd56476fb5b8c336109f2546bd2f681a7d65d492cca8ae0e807b6a6026ca3638b317a2a93b20d962c13f4a01a2b859c401e9d8ea219bed104ffb7e9ec60e26d4a8cce59c07d3c5b5f64398f05916e4f3d43c8d966a109991ea0157596c3f27fca4daba2dcf0e297afd0592868a076df5a2c622a79dfe5e11d35bd8d1cfbf4af23f8362cf50886b30f3e9e72c11056b5936880f36b87a65a240ffc47d56495d09f22f124953a92683c315bb76a7c194e5db46ae32dd5513a7de4215cf553c350211938a6805add48d033f9daf26916004a3e6c06de093a824e00e2910eb3d2defae8c79bd1680fa29d6a41426b5da8e71cfc59230aa44c762d0e66f8188f86631f076f00020441eb3a4f09f4274eb1404333be24dc08b5fa1df8478c5b517243f72e4b245710f40eac71d67019bff3d1050474c344bdbb85cb9bdca89086dd2208696fa69230aefbc9cd66b30ea06126c4c0555dac64972503044cd049774368bfe5b0b6c6da92940b01a5317a1d5c87075789e30db4f6dcf6ed6a2101f990db1e711cb57a86ae25a803838527e83c78bc7094d295fea68a5590a4f6392ad6db3984f2eab40c94a5a85b35adb99d3ec205b9cbf5cd1199a9d2d8ba04d49af942b353ca018d035496acf1e3866ad68477996a2ee4f152eec7d72dd1891c5ef97b7f9b6389443594b64f66a6c11d25bfab6538fc13ac757dcaf01bc262dc6bf118f4f930a3571056ca3f6d80841a7b670665abb915610d232da91cbcf1ddf5acc6f9f98648181d7eecdc45d231d8f1893b05fc536e2d4be4b73f17b3a5c6e9e4b59a7e77166f151ab7b177ebd977c179228f0d206e08510573ef40d198fe870a1b692d5d3895e22fdd989b530770a5d053fa58c15eb47432c75b7d44948fd96884afc0e9f85ca8aa831ef4a461a13e5f7290637691a134b4b63be963426a7347f7fbb2948ceb8f25cb5c13e01cc217d613e893a1833208d392472763e4930cf7a4e806c3dbfc0385672f53309404e1c5ba38d5f095d23cba8a3fe27195dc4bb3a5cea45c47363f3413766b9a2f40435ba086c5bd936ec1e2e242e89084967edfdd2fdd70ac06e464e29817b7e5a7a9d6d5e63457d2e99396f879284f6d33e5777f6095578057c2a480eff62a5ce970cfdca8fb4fafa16320fa0de0c5658fd4628097f97243209b97764c74f2e6f2bf17ed07980be5f15ff4b28ae179b02ab800988040065d8578c2fcc1625b7bb8db89c69ac0ba31d4b2f4bc0325bfe8424c3923b667599c9d91dc4f8b124a87b841e28177948ea10604b3a68d5ea308ca4b78d4072c469d013007256e17590202618164dd240fcb03b8753015f99daaa825709db96dc90b3ffbbc5ef746eedb6e4239403852834e18c366cc4866bfe49a70f1f136198aa86e1ef51937c8c445854d5c8a7f89851ad85c4666b8630a54633f7acbd8b4e4f8901fb6e8fc7c1ff7d9b94a708024e354d6d6aa9e0faf4f310cb3662345eb912d0cfea3e1968d4edfd493db284e62777866de3941e3c91eebcd3d278542c1e04f81694b41beeff64a5fc56ad8bcbaab2e051221c4a9ab4690a5dfa7e5d2b8f818889110e4a5cba3c28f536db4ccfb21c3535060f133529e59ee7961c37c8dcc93b6283bc84ba1e69b4bf2b19d1c916bd370163c3714140a09021576f33a8b1d402320dbe6a68ae9aade814c2324942bff350d2b6f1d808211999c4edb3ecc05ec7bcadc882da943460f2390352f7c452d6c7c3f59efbd83054ddc0fa477124433e2a233deca3d94f28dab1191ff2ea050d540f38fd75a6c207238dc6de410bd83f49765713470b93397c90e2f6f7cf1c70e1255457e623f26321818196fc2e9bd70cf09243785fde262b89ba39255dcadb4751c71a24397dd28006c194cdeaf78ae5cb809e39e9cd797e20b8c1c4adca8fcf60240baae7b9bf3b7a245b8b480e25846bd38fa4b9fd86d183960013c56c157b53cc7fd0193c0d64ba12fddbc3936958b0fd632da0f244691809535c91342c97765081e5f44735adfb2f0d91cfc5b03e0c4536ddd894a8a4e52b787c20bb193474a4bda25945b5199f09e0ae56252ff2b2044f3e1773c76c54708729db37b0aa9910b49403ba99aa865e40d2594d1bd50e14d6de8c786a75d077879232b74f69a3eb883a6c43e928b7af4433f628293dcaa567692fb6fd219ecdb46b965e84dd31ce09f99b672baf786d2f87bfcbea4f564404e4253d261964d48faff0685b6289482291dddddd3be808e007260849548ca82ca132eb714645680a1523930a112a3f3dcea8bc7a08f648a5864e4547d629b52948760a93294ae49d82e4c89415c8c0537e7a9c4d9972838c2953929692a69cb02521e99055f4ba020d5ad9f23b13240991448324243dce9288240d49c2414a2ca927090449ae297e905190442162822822b820a8516888a273a158c150a2c8010aadc71994222842f4dbe30cca0605490f2b141774f935da04a14129a0ec00a50523f43883f283c624024508c214020401294895a007c89011041218e320769083f00166022be1c1932f48a57e95229222ca0ea3ec893ddb40d8577e3871a50627929c30eaa4134b9cf8a19b5888027d30275c4ee8744d5c993df4bcdc462bbd39672576b8abec2680a061efd4374145499421c3084c311114e9064b28920c17105a868bd24090438f2137d06640c304424005a9890d60a0841037c8e106433ac63452e0325c3995fa55133c50b179d269efbd4ff6bdf7dedb832ddb4ed086b693cd831d839d6da513c9d55f7a9c21fd20c19ca854a038ecb0f648a9947cdbfa1bb07feab3f659a7e5bde5a5d34d736aadd586ec19ec2a15424b793842c738e25c7520a1dbffe1c302f7758d73ba98a8095dde94b0ead4bb0143ad74e076820e1a86d869dab75903e47164cc02c87a3528033442a9edc0ca5536b8d9e9ab6cd04ef9ecb16b30833f382db75c8dd0d7306420d5718c26842d5d56192935d18f7195c188b381321891ef0205f4bfd77f9902a38ddcfa06665ab369ed16d421834ea756573a33be72c340bfbaff9d370a1d638dfc41a60326684c20f5386382490f778f434cc8621c914a99e89931e102c29289566d116552bb19ea0a591ec20c04225d02a1a7871d105e3dce8030c512497b09a3258aa04e34e80405fb22153501d4a5013a580f3fa609570f5ff4b05bc2a887328a6882a88959134074e98a559d1a7a92a41431022b5274f084143b2c8125e1317b22c548862b6719240bd03a0ec10db19d204fc149ee072c127507937764ea64d166beae459ba97f58383aeb12b71467b4407dd48f6af90d28cee05c3e17c5191b8bcfae3823a71e0bc5197826e9f35ffed2e28c0bf31786849dc1ecd0e7c77c5dd289335abca4943361a0735bbef6ebeb9c3793cce72ec33d6d01da1810061946224239249450a4c07002c1020ca90d215d22ac4750615deaf3578030c848841c02c50482dab04437f9e41187a047d48613f4f9198829530645929a1cf2813edf1281440bd146eef0b5901b153abe08b957af1f230ec864cf979b508df12a146deabb7ae55e52053abe78da36fdf4e2a4b57edf8d1c6dea576be37ebcced58d1857e169153f7a36e25cade27f3bdad4ef6a80d1a63e186d620b3f6698c1b321a3cde6d5d838adb78ddb3aecb92083d6d4e7bcfabdd69df45cf85e77ddf46ad4d7df790cf8bed37fcf7936b87ee25a9f3e9ea34dccd1267b35b457b70bfbb5d775ef790cc8b486ca38b3697fbf5f7b36b8fe71dd75d2b3c1b27ff36c682e63eef42cf54f3cc440df3c7e9ffb67e20f65e7904f837a9b03c3adc750463f81728e8893818e2fc2965aa77f44eb7176d413801e674f8efaae0dd158bf135b3e0f8e68723c2c0f9beddd4360903de4acac4287ac22d25e2b0f2d8f3e552bccc78f79ecd3b3d1d2f74fb4a19228dae89f5d6bf98933ea46836e7b0559450fefab56c03ddc3ef74db542feed379e0373abc36b4bed02e1a1ecfabc46d9f7adf46adc1bdf820f65d3bf11a3112de59cd247941171203ff80c92063550b2653a4f625d3e019620b284901e674becf4d02e31c3d152060600441041380d3e734e2b440521d8a151b1410e1d2042050e86e8d1431074806be00259c45b6ad7ff2a7326d37981ea648a00320c109fbc60ce9ec0a0cfcf1daa7b327bc2f3e487cc88460d61eb19b11fd149ba0cb23e85749d540ad179a5d7af744736a9c51863bc035b8c31c6b3da8beb4ebd386f79e374e674e7715a77b5f36ad75530943f6a7dd30f1313e95a52eb8c4ce64f643289144d21b3483c7a517b516595547f876c87120d2459620114260a3dbd3e4d41eed4b72dd0c8e9e9139c3d132907661493727ec29c579f5fe5a4b4562b27a5b55a7babbd17e39c377cb7cb5ddd71b7bbde357ddefdbeeeeeddddd3a9bb2c2bea8a1574ca15e109b5252cc1a5ab2c523595a253a6f005431990fa055720f50ba268170c4bb8212f181aa0d77791a1d6e77dd92fbeb6ca70d4ab8cf5494f0802957fbf1428148b180305aa64865af94f4346050db0b4677830aaf5302a414d6144eb210a15734209195be96109730a1d4a103cb2c32ce7911d29a5f4a5fcb9d529e9037a9c3ed0f235a5943e67e94b90d26feb5ac6b9320991b41b60e4001da790af40923c574b8af430264cc5c89fa29daf801246932ab1a4ae78c22ad1c3112556a08410256e50624717a173a284ea71e6e48993254e64db090f2727296059816a7161917a8151c5b4909979903b01810b273c5e8c4003038740833bcc8aae345132328134ea99b2c9952744cc9200222711832d091db82472d05b8fb3247a3a971e674814c16be9f2b589a5c937db4808b5f438432205a71912236099210164c54604144c977276040d581c3124353ba2e7457e9d42832cf8c19582071ac824a8cdd87ebdb5de289a4c41005c9b28f55a6bad25ac62669328e67c98289a24f52322789934a462be89088e60a2044714618311112f54e023423c2982871f2730e2d1829cf35a1242568390223d38c9c1bc2e66a5b552258c7aadb55618bdd65a6b35328108688c7a68a8b5d65aab0e364b8f33a31e3d4cd148e20911b8e881871fa9015cc1ce0b0932a3c40d35c828b103a445117862943ea07ad203b344042fb214e58187058d14a26ca6e0e592fa544ce5af240929f4c90e8a881540bc5862c073d261672791430d5f123d414c45f0f1a08ca06b72839e85804bc1083624460002248084e00822047102825e4780536badb5d65aaba54e78f45a6badb5d67a040d7aadb5d65a6badd5d22386f45a6badb3d74a8fe8e9b5d67ac44eafb5d65a6f988d9274163dce9498620483e8051b88004d501044cb8260b00950db5fedca3682c98f262470d2e4d544e7eb7166446d1a71d4c36a4451971d358249974f819e250f37d8e13662e3602fd93f589a61efd42fa950c830f23c5791762a79f4f94114d766c4830ab7c6adf386d65abf059b37352ad6bdf5a2b56e5f7312ec1cf76d4f42c54fd7b3939e0ab6efa479f3f6376ddefcae326fc2166c1f2de56c24fc34a691b78fe6ca3e5fb2abd52a19be92aa685787c6d0315a63df86f9eaf4cd55b068636339ffa7633ae6e958a763ddeaa26e5f832d3419b5dc531ece705c54c9ba55d1ba7d5e3beab6054ab7bf85fb488543b7dc050af6d5e1ddb67ca409f5ebe55f33ede0b1763c6bdfbb1de7711ee7715e9733e7795ef71d77ed77ddf350765fc7e16b3f67eae9ec62f1b078583c2c1e8b73e8b89fd65a304788bfbe0c16db3933d7413bbe1bf79c3767ebd5ea992d221e98437f34e59cdfe34c5a7f9e5ef638da4d9db99ff9e96b6ecb3ca49ebc473e5d3dcff36ce53cafd6fc1e6ec15ab0eebdd77a3faed5abdec6187bbff16fafd6c7dec3d8efed17f3bee2968f34c1eb346ef9b47c6c0cfba0e2d549e871b684d497987469438fb32964d5d257cd8f7a6bad758e90fbcb69fd525a1ad6be6505c8ee3d8dc9e2d95befcd12f2b14bad35e63a68dfa10c3d877cd3fedf313b8cfd3ed3182bfe83d97ac5f72c1fb7ddd776f3f00239e115ead9be09e4d103abf456d05df390db388a6214ab334dfc04a5d8f3aee7610f7b1e7e96cb7bd68e2704638c593d9ee7b15ed8f3bc7047bdd9a31a6fb8eaeff16ffc271e6213f7ba4e63fc1f1829c777d4beb178505dee210424f4fe8ed9859024042553c4ba007a9c09e10aa5f4317d7ce9638a6f7eebd9c8e9f975c5383ec618e316911cf6638fb5ceaf2d2135def92e86ec7b23c7e4a1e4347f01b77c505d940a8b31461edfc6b7f46d7cdb319843470c11b7605b0b8631a6b11ebe6063dc4f90e3936e2fd0964fcba7e53337599f9002480a1dfbeab3d2df31bb94e2a8c3e87126851088f401f43893a2d675d455462a2395914a968b9579af608e1ea9b5ac570c6bdf3143c977cc90f5ca35f2472fe7cf5dfe537e16d073f5ef0b3d7eda17f31db5e38e873974dbecd31cf239ab9babf895f297695e976dcdba16ace7ae4d5debc53d8b95520a49697ab902e7dd50f9b4609c57c3e697014d6f55df027c61d1627fc5a99bf7de6cb7a702eddddfbbdddf72c773d8edb1c07dbebf636e330f01341b1263ce393bfb72e3b2dbb85dc9c354af96873396879bfd6dfb568ffdad4544866e658bd7adee5b3db625646bc17374af655a3eb2b57d0b3bf35646ff4c0bb6e2430bd4f2a11dc2e2e3cbdb2031868dd19a2af3966fddeb4e6adef299f98e3bf2fefb1d63ed5bfbad57ab47b6ec5ffbdb765bb02ec77dd56b8f85ae4f98940b2aff94fab37d4ef3506efb65edc7d8dff63ffb9ecd72e63c538133e04eb265f6c32d94dfb67abafdedb30c68fa16608f013fd0035b2f1ba331b8a3171ee6ce59701b73e12d1cc557d8d8bcb1cfa25b3e57b280163c999e3ba231f68bd6d4dfdc1177a45dbd7eb83a4d165095358c8b2139f0e9c3d3476f0579e2aafda2316c11ada99f3f1ee6cd5f45e14cdf42aefbe10b36c6bd09b4ae68d3b1d0f5ee6d118d6183c41a0934c5901a0eb45ead0d5d7ee5e10b2d1fd9eaeeebe7bef56af9b460db169aab2473551f6fa15e2f6ff948136c8b2c46be44f1a3b6148592287a7a8df68413a0de75d3b3643d57a95511aae2523aea55605d77f9ac17eaa7dfd75df71d8b97924f8e3d6f05ae4bef86e9e7575666b9583cacd7bcf16a60ee51e07e0c72af41939c3727a9f5875939bcb8426bfcdf87f5f71e0aafc8df7b2d2f3f7a2ca07838bbf72d3c9cfd7b1a538221ebd571e55a63293597fa75d4b4c37c723931c8d0f1672ef3b34296901e720fe6902f43c760487beedf67ee757ecdeae92137590867979ff573dfb35e9dfbcff8e5cffaf4e75441be0c25ca033557b53cf7f355908f59908f9fe59a37f3f3b376644b6b1cee9821ebd5a7feeddd303de639f07bff4dee27975df8736fcadccb1f7e38e48c39fc93f36a742c0c7eb5ef03bf25fce15793dcb3764caf9f03e57ecae25780df9b4c6064b9381b82f45b74f4e1c0d9704fa693f72769f2dec4e2c9fcf1873b5eb05a7ef8f4def6851f0efd7e35daf7f8bbef4dddb30023adf1f287bf0fed51bfbf3f178bc5234dc0df3d8bc57359afaff655f96afd7e35160fea674f16341da71034c488336809848649a7bdf716eda04d85c8bdf7feb065484e2821620fb1c32dc5a672454987b24fced25993a30db8233fa76bdb23edb3db3e41f0de3ff55aebed2e1798e9f75e970374bd6ddc4db73cb7f4b06e3dc60ace1e6548dde5edb276493b095dd33925e54cf2798f9e0dae4b9ea34dcd1d007aa6e9f945cf96832ebadeba09f22e44d79ad2193567a21f44c79e0d0eec39cfbbd99a313073eabc56925c494652ac484992d2841427528a9032244516a6a06c293524f5b022a5244d294d50294ea4143124452605a86698149e4d4a0d5d86e0de1be5870f6c51907c2007b14100e4d200c4d248e1d23b8ba2d3efbdf75e2b40288d14eebcf7de7b6fd29e4962a752bf8a5214058a28b41e9e401467e48f7f828c487fcad6f6d1931df8433f908cf3c3080c30ecd83b529dfe8edcb7ef342871b2b58fad9d3814f503c8e3b4c40180a78ec107a309f32fe822c28835f33b1362c49a89803e3fb7648bc11a6da4b51b4ec6c1383a771abc387aeb34687134d769b0e268dd6990e2e80e779c09a7ab5e973b0fa4389aeb3c70e2682de3d4d5544da859233baf864767f4aac903399c4e7bb4eb4f6f19e7aea6fae0a6a0ee1f8737961ef3cc29f84c5ea7b90da43ef86146a6458c0ae625c5c2a505b582e5b43f93d7696ecbf8daeae307990e6aa0845625d290e4e3a01260983302783f7afa694c4a3f7f33a7cf4f8338e6aab63057d5a5fe09fc9f6853f1bf00555740d512a8aa3257f54150559bab3af92f459b0aead09a7a7fb057fc2fc5193a3446cdaffebe7cc455fdaf7d8c3757c7fb50bf32adf162b4f1fefa8837351defabf79bfb0743da67b8aa567f64c0d006690186f627060c77877901439a22e166e122ab85f5480b187e4781e11f093b6ec9048a1c4908a86ae08faa06fec464769a2ebd747a3060ad9ac519dde9639c9f7491f53a67baf71b0c53bb7b2f41d550af4f5da6ebbaae0bbb4077e7be6ecf15727f2e91ae9b2b5ec48eb426a489f5fa3440b4a6823f3664fa0844436c186ee80f55b51e63f5351fee148efc1ab09b35f2678dfc25f66980666652a9bdef5ff06776fc7a4beeed50d1e345ec9a5fa9903f9cc07b3f02519cd17dadf9150f77804073553df087f36087aa5aafafaae9bc74075e5515d592ea4acc8f98989d793379ed40098302f28797672ca34deef3017355412240454024a0109864de5c8e63ae6a77230cb287e08f0ddc2707f90d42f0a7d7bfde9493ce6abaaf6394b29aaeec7a0b0f40a221ba392f268c21479de2cef27148a7594014d87142b486be2ccf3651e48a3aa5363ccdd5a9b93aaf57e37b5dc193f424a531e3deff81614e8def86f719af781c288e8385675a633fd29a0986d6c575d893034b5d9e3e7a529e76acefe736b8fd079a62d10456cdd5293557a79c1c20ea33666373259fb360cb58cac510abb9e5a867c36eaea36f764a96042176b1d64781f3202af913780f0c40a99ca8540915eb7c3ad6b3431deb33d445daa58bb4913e9a3748f36689c68893871a499f75494a8925129944b2746cdec4cf3f5f0bcd9b24f3c67baee8e702c52e12e9fdf73938d2e3dec7f0bde461c6713af1a83db07e06ef4b3cb90f762c0b6dd98ca8cfcc8161ceebeaddd061fff612f43e7f27593c9403b77c44d14fbf407d9640f7b78f8a2c91b5ae78b0c3b88406b5564a4a39d1ae3cec3811bbc6ad7fd8f5a9ea6e3cd21afb3938d606bb3e9d7c073b8c4bfec50e76b84a0004680b3822308179b3929102015038217e8d3dd65c5a75633e9d1f5fc52f3039b7d162faf01d1d591f6ab5eb43ad867df0c187ec03de7cc83e703ee815bc39a5b4c27be03df01e780fbc079e8427e1497811dbfebd3fed2ce25226a238a33ee57e3a0db99f1545d186fe37b1e587f603ea74166de8e4d1768a8acd39712061b80fb67dd118f6f582c17e7e2c101013d0077b052dceb0ff090971ae2ebf5a970451322a4506489020e146a4c4c0ebdef4ddefd71da87f6bd37717909b1bd9bfbbd7deeb0eec4cdd36fda9dbff7dd7bde9e321e74676c863fffef434e8a933bd3675de773c87f7dadb7bc7801b897123dc888bec5a400419115e3f308c69300bc3f76da4c188603c82828282828282828282828282828282828282828282828282828282828282828282828288fcf0233d57945c413204da89e5b96f493d8b97d7e027bf2beaddbbcc504310da459d5a41bdfce7c15ec0d04bfd4bea85a6f2685ec8011a8de6a55e60a9df3c47ea5f780e97ef5eb0b0540bacbb7c7c162b5c5a58502b56b0b0b0b0b09c4ea7133f42049d2b4c860004a3c1ba37993ecc1d0683f1180c06a3c17e9054d021abd09f0d59c5ef9a690666ba0d7263c6c71169cddbae435661b97559d79c4f6fc4145acc39e79c94524a69adb5d66aadb5f6de7b31c639bf60f2174cca29f56cd8e07c7017f016d49cf394e0d76969e52c97e43107cb79035e444a29a564a1a5d3237a34e79c13534ae9adb5da5acdda2a7f7e2ec5bc082fb2e5c74d8549df72abc2e596ce89a730dd98fe3bd003f57c2ae9aeb3e60fbc11fbf7d64b21f6cf06e9ded7bfa83ffd0c2b9ee5afa77201f5a7c781e2385670ef591ee7fbfbed7fe0e631da84f6e35c87edf1b07bc97df49e06b5616d501bf2448374fa32d41c6f522bb03aeb57fb72e1af9f73af95b52394e95f3049cc354b018b27051c519db7878e2f42fdeaf4b5b5487aad3c6aa005b32dd85c613b6b0d5f9a30df829787b2a757d9f29126546e897851a74f635a269d3e57c19e1fa25233460c401ea7e52307209f3e2a064e250daa83cad06f982355b03f5730eb97915acc2211da6285492d2477427668893209768eed2de68a8c8e90685cebb5f1968f123b5b929798a05a58b52d2126d8f7a555b2840444444c8a8c8ee64d46a2cd9bdcf269c1888a92889818b57c72eb955b3eb1ddf2a9652b3abe80c9b72e1ac3f4d2bebae433649f9ae70e07a9b1e439ecd0c6a817b9cfce91df6abc75afadb41d0f73a2a7e5b36acf9c06b5dc12b140565b2240f3862ba267ac96e3506d4fe725d83746a408f7d9123f4d326f369955326f663d943db43f5312d2431bb34b62f326ce947a3a7d8bc42661f14813647dce72751db48a2ab8cde4d5cde2cfd9126db36a3299b0c478e3eb5d7b31cbc5da61ed6016cf4ccce75b62f1fcd0d9f9965cafef0a8b47c9b7c4836fe9a77b303ba8743c103f14507a786530b00e871c142fb259b7bfc1161dee43981d5040d1c62ea9a86cfbe1b7d48121cc4fd8e2ea768796d70b10ddd266741215ec2e18e6f4eea367bbee59aefa9ee751fb99ea0e4b48c9e2b1f6592ed60e0feb2565c763b52c178bc75ac9e2e93a96aeff09d11afc2630d21aed7d6877e8183feaa8639f9dc3beedd87216cfbc79d62bee7b41fad3e3536c3be9e3ff862c1804fbe137d4f1536ba57d2cd3a377a37b6b3a8a33401743760c42a79fff29b8713516ebf8b38575f9dd4c97c519331d5759b4c12fc10c7673853f1906a2e38f750cc47ab17850477a7640d43aa599b66071a7288d7a76dc4b29a5b4765a6ba594522e6d4aad8cab1969d94d4ae9b75ef559004a0dd938e0ab436bec63fd98872fd8d84b10639f16ac7a356456ac5889ab553703d00cf6e7456bbad733d7a06f3d17629058d3bdbe53c64aad29ccf1b80e59059f627fdfc1444a69f7f42dec3f10835fd779b763f0337d5a9ac0dba377c376db873399ebae7b1ba31c8c0b14d4ae0863fcf839893fcbc7bdb3b0380377098633b98b36dc9114fa02b2732aa89052ca28a99873e24945ad46e9a554545b2d15f4722ab6fc1b935381b38d1af906d4114cacd616580beced117d52fec24562cbae3fb447c864bae4a81857c552f132d3449d5c820a2a5beca65b602db079c3f1d02e010202020202eaa73ef1d718471d054167a90526d32947c58476d802d3443ff16516676cef51be65def213c2b4c0745a603c688111c1c4f20fdf21862fc17950fb8a5a64aa4e6b6e97f40676476cd9bb0fbb25bb6497ec925dfae9b148d6b1a218a5baa8884dea33e7bd53a9ffd5fc6e5bee7298cb5c8aa3db65b6f019ecd0e5a582d1dfe867fa98fee55cc21da666bae5a10dd25d5ef24397974aa679440105145044fcd686fa59d6ede5dbd77d8d63a22feb9e36dbeba5107b9e9fbdef7e06ad72c1fbee71781c87e6785621731db20a89c39fd836082774bbe5d65591624848b1d8f642465cd245b24248db56c3131351525252525252525252525252525252525252525252525252525252525252525252525292dd8f5508ff9d8f832dac3fb1b759b49996fba9f561b824b656fe43f3cf9c0f3353e2ba977349e66a7248ec0f8724cb68a0e3d41268cbef66645ac4a8605e522c5c5a504333c46a189a61a6646806993d42c10e517d7ef8429c81bbe53cecd03ec955762a954aa58e6695a11fb3a11f497aee71e80712030cf96062c80712433e88867cc890f438e483c8908f1cfaed71c80709867cecd8a11e57ba7c7d59f438d4a3892e5fe3a11e45e4a11e3618ea21d4e5ed948719e82b18ea0134d4a304433d5c433cae0cf1a8422570838e934629a5e4354b1ffc12301cf0a004e345449be6db77d5c499b8f55aaf968f979a2b1a43b5fc2a9fb31bb8e78ada0c76b9c9c62dd85ccdafb23e8c955db67c3a698ba0793081a20aee62377da8ffb3fb6787b3e7adc07937f08c287b4d32d6650de679433fb25c33e7592373e035626fbc72bca3c25c1630b2a07bc612cbbfd3daf9b7c98ddb75b46031ce449b192d50b499cf89ec70e66826ce88b4ee760eb4e55b3e6347d226cf88d635ea07da17ada16f9a32e27093baf2c738a211ecf0880877c431e18e24f8d3f2e17620e29870451c509c217fce52407034e08eac7ef0cd7d5b33b771bb0eeb7a0c7255e6aadfa52b5c6dae80b8da9ce973a987bbe62e66838e2fc24f167138d75cd90a0443d2edc3b8400107d4ed7330cbed74cbc1aacc5687e3388e73713b2f1ac37bbb6d361ed9b73af3a67bfbf68775d99d79b3bd953891c6a84f6b388ed3dd4b6e76a00702791c235adffc05e90cd919a8480c8950129992d912222645464748b424168f8e093e7e825d7ffec49949644a2ebf11bbfca279a3921fadd1bcd98e906849f366e3f3e6e2df36996f8e2f41195fd654f0055322ea608f33a5222c1767bd64b4a13930be821d628b045f1c674419dc751cd62f585795cd2626ffd9614cb70febb41ec519331d957a7530d8e1db21fafcce8530e7ffd31b583c2c17cb05a44868ce2abbfc4a6deb35e9b4146799e50532b352e409274036d6ea69bd74663a34d6ab8a9d220c41fa1421492575b05055321bbe3f7911fb2424a3170618694d55c96c784a29b7ad7a356430c6f8d6aa526d16e85badb1f1e8c90b0ef140aa4248d71b17377c39afc6e45c881ddaa32c25b747b67675e64db549572ccd56b14bb4762ce40f711471e9e53fb4c39390ee96e05042f34988069d333fa5a79967e628cc938c37d9f42424c48dd875aefa496856346fe6cb7e52c264dedc24b2d39213d19d5546e306f71b87f1341fda23ee1567ccbcf72e6c92a481f173067c179cceb8bc0b4ddb47f6c845c280f134344fc363a0f999ea22ebd95fe84243bd0ae642734972a9b954d92e938b067d14280c9a9f2dc099e72e321725f3e6ba2c993723681b5a6871468ba7b493d0bc9979faa724f3e69ffe49366fc0a77f52326ff85397b6c18546cb4f03e3691e078ca7a1791838560fe361f01860fc6ae63308b63872757a1272a1e111309591c1f824e4228b33e6d37799d11830522efff221ed2c5e9ec587167665c030a7cbbcc6dd0b992ca57c7c5bd416285c1a34a06ac2005593ab5ca079188f83e6613ccdc3f8ed67b6edb777b13dc8b7ed5760a401efe534e68ad26f0172af6843bde7a04d022d0db44873457f06b4477345395ab4a10f03e46ab4863e0db879272116ecd01ec17c781282f948639c54e1eeaa8f54a53a09d118999e363a4f4232609c2b996f018639bdc56baf468b5a6bc5e1ee7746cec8c8fc05430b7499a7416558b6e7bc1a2bb68f01430b5381a175c1bc80a10d9262e1d2e24273a1b19cc07087f5c87712725112ee239a03b74a230555cdc5749124d6f7baff7e06ef4def0123f33dd0fdf7d87bd3e3eebfc7d1fdc771786fe234e605e604f90fb605a2312b34dfda9cf3efeda3373956a6374f1aa25e5fd71626cb7b3cd4365fc2872eb2d74b9660f373ce0963e3b05f1b875d9335abaf791cabafb1f9d5aa845f5dd0c567107cc1a058a23e6ca1c55a6276625c313f6274e6aad280d16be187cd97f09a33d9e1bdff80d503e01f50f32478c0088e129e84f7800d57d107c0af1e003f4be02aca5597bb00805f3d0e00e45f3d099f3feb1a5fd7757fc1b003b90efb7ea8e7e973fad46068816f721aa09e0df3abaff9d045c6e2616aa97791b9287199b92c69a1bd7c7d69a1b580a3ae7e9ea6ccc5047ff29f2f93cc9b173f6980688acc9b4c8364de8cf02daf5e5f75fa9807ebf377f1e26b0bed755dabcfc19935bf7a1c35bfe23118b91fc3ea6b38c741c2d77c0d8fa1e649e0393813fc0bba38ed165a7791d1c4688c9a6fd122a45de6e3cccb803f39a29ba8d48db566b5756a6604004001d315002028140c88c322b150942582a6b80714000d8196525e4a1acac35192a328882190314821020000048800ccccd0ac0032b7a4b4d2951ced8af2d34049b4ef2964eeafdb2322c860649368f636bead239ca31c09b8e6d18855bd01661a259e80c973791b8d53b6f8523b8e8e03c7576c6b0ff4525f779de13e18bc01bc1767cff09a0d30a1698023057b771a02e0b3ebb17f947d3aaad29163e5e82936d379c0729d67f65510535575aeccc58c0281edd0926d749a85ea046e90946ee7ec4be7a7258e83f6a15be3ee3682960c05b2fec14500edab09f17c4ad67d313ecae802443aa94b6e54744119d2fbd6616cd626a0595c59142094a55405735e9e2de7ad5afb4a0444e7dd74a3428d8889f188b843ad9d47de32412d4e01f1b317c42ab4b2b398bda4781324758e15e184cd435bd67ba22d2cbab87448fe52c713f381a37a6224f0c581af5c8205bb9e65dce9f6077d6f7b37e5877a15d7ae32e32783c1d6f4505f5d14751dc57f59dd23060496b824d1379582daedf81544a623f407b46bf2fbf7512b7fae15168ec867f361f76341d672b8df07e5f49bd4518cba8faa26ba0e1d50bb9cb43a3d58f51c8aa98e00bc7c4437e7e16e53117cbf7bf82711fcd16a415945a7b23e7dc20a02efe99334997e9858cf58af9f106bd891ca7f4223963e9bad465742976a6099653d56a5bb3c1206b5302ebdbe3529b1689c5e3c59d81b9a6196977b6b60ff436f24c46e723ee5d004da77f4b927b063bc6b72c90becd4d09779e0f02548c05c2f807354122045f3bfa630e74f1a537eceb309ba404f9050e27215e75110729e5c70a99ff50d8cf5809d25aab72e4725b80882b25b8b40d7f008f9ef2031a86c1fae6503960bdd815c1b812f523250d2cdc6a180dde39cfbb55567842f35706ad35c30170c0c198ac570671cdc56794ee6c2074276beb787fc07c0240aeed57d09b04073777c390a2ae39cbe75a8d799743af40e4267eaf97dba4992326577fa4e1b8a6d7ca42ea2348a5598a645c0638c1e6fd3520009544bd1d88a15a9689f0a23e425e55f0a2e8efb31334346b283d3d0e4de5955e395f651789ff9b73fcb224f4481f051ca839003a9ec03fbef37002c2006b7efc7557efb5d02104acc9c46cc9a2115ebf25adeeb1cbb59108b476f06023450e8fb988b7e81d7954af9d850a79b8ad7b36358e9c266eeef4aa49f1dc67176d487358be91abf0b86bb73803fcdd051690e11dc0fc0ebd93dd19613ff5cb555350fb07f0c5f6653b7cd8950f433ba8b1b46a1b808b4a423a198919a9186679c60f0527d84face60a8b9d46b628ceb62b44b25f3d68b1498b9cead1c78515bb618c354bd1634dc2ebcc42e9b05cd1c1ef1d7d4a4add15955bbb3a11667d336d0cb947133684eccf30063115211f6c14fc7572b75c22b04cb7053df5f6c367fc438caa3a626a947ce0f803be6cc7b38ff944abfd96aed2a28cd65eb6a2f977492add63e3bd27c6c6951e6b2610ba1208d89e3d14199de04f4ae345447b9469d22d8d1375680776b13ad5b0ef9816b459e2d7657f54fe39b65b0a62252fe8d83e6851a948eb92ac182818123aac2230bc530dc831b04daa8eb8f6607628f8bca2046562d0734de3cafdab2caa101ddcdc2411e463bbf33091db526005d78c24d45d69b7734fb8b27c136294942b12721d3a5c33a7fe12858cef8657704d65d4cb3a34136b5bdd1cae17a25d88c2cbe10ee71b1a8d02e0fbeb0352819d205ab999ee0e31b54f67b4b1d7c2400c18c5c1a8e0ae6e54408bd255932f3f19586cf1bdd9b35203796d8ef3a0fa6a62642a2d33908902d3750c6bf6706422febd6197ff2d6a7d6e8cd4a4ba3459b5708b804fdaed4b67c97faa71f05fd81689eb3954db16d052334faca706721db3a8e2d066e95c938688f2d98c98aa31d4fe7d59f5be0387ec0fe7faa0bf178b818b61a818d1678d0cc5d7dc056a4971783016c4ea59d49020c99565fb975133999d76e93c34a27f5440222024c8a5a65ad2795e3c4e419a1baf7cb21f250ee429f6b22012eeee9e89e0b4d57d43f4b72e6d268c670eefdf7b5607825b007dc4eeaad3bba8a178a5065e8093dbda2269a31d9b1b7532a8db5b334475ac4a2c89476b81d47483a5a3a5cdc20b4467324604e21fc3053a370523b5f28d72fdb81c5e4aa017348fbd64c9ce43ac4fb385fc8170f9fbc78ace6e79f9f3f3e7c57f0e0c9cf3bff75fcf8f2e1b39a3f7ffeebf8f05dc5cfebe2b048994ce62d4c6b864660c9a4ee30421a1518646687072a578c8634ada451cbdd15affefbc0f34dd424a84e191e11bc39f69a50707c03f90ece7a828b9064618ac6df8525a809bf04ee3b34b4bb31afdca6d5713bb2c2d54cd4c8996679628ea56c88859c629faeba8c3ed61ae277277982ecda73d923ae0d11b62587121d82448f50a592be2b61e277dc02cfee8ead67c6dabea5c01e5e2a8c9ab2d25fdfd020834d2a20c6af90740ede6b6c4c59578e93fd7b8cbde3c212e3e059da1a3a49a1cf608a8477758a313ca19f05a89f502fbc12429f205a247662f819d905c59bd6052540716ba69acc84094d99c2a4e926366dd660b769a371bbf1bed1aec94d836df3edc6ad86ad4d1b8dfba6f78d360d771a6c1b373796cd375bbcde4ce1bfe442e8335a4c870aec1c855fb4491fdd30591a95a13613c099ed75d38163deccdcc73972db016992e616f7ab9b6bec66316040042fab82aa9eda2a5a7ac886da1f73e0b8aeca8103eda6756c04373c0090fe23baa233e2aa3d8da10e39a45072a5ebe61f7bd6489c2a65dbcc880ad221d4bfc40c6134d1a248e1c88cc1ddd42e67d6292f62bca5901481ba100dc66ce634520e67b98a62aaecba8b55996bb412baf2e2e5af07458ecb7072646e57298a92bb3c3c28cb3116776b3e06acd2e7adc2430227f131aea9078012748c555eec178a14ad312ce090247e7c484428abc1791d294b7823b1831b73c19767af23859eba2057d9228a1aaa3e2d1377e4a7d9ba5bd8685cedcb841d3aa955b3bd61765e86f39015d4e4ff644c248215f9b5b688c0881a37566581e6d88f2dc5108c0b38628dfeeb4d6fc19b37c25d7c651146b797ade806062ae839936892530b0419465622ce07c288c9fc747e4f0a551188fea7d31208f75e516b2cca3b487a50aad953a229ca1e4043760ec8ebbdda18ff3e0dc4308a71865d4b509721674b6f4b87b9a318bac4fae151ceed2fd7fb89041385988381431494093b7982c67447f365c1849be609fb5ee2e69e0c5bd0e562a07f9f486b9f0e183a8e9fb15b4b2a12acf31ede9131afec0747389809857b25acf310e720f3168a21620b0a4ca3969fc1a4cc6188141ffedf837f8b5eb24cb96897099cd66ed99fb1f36d4f72ac4ecfefd17fd64a317b230adeb82f4832de4ce416d4e3de1977b72accb53872eb28e999166067ec932ae0e276047e3a0551357c5b1b2a1b3596e238c51a70066275d92610db9fa68b2141469948e36c95989b731c01a6bf3c29623ba16a2e8f5a342da02bae83aaa50df4735ff4a2ae5076bc4698dc907f62281998bf99b19e2681a46767dc0aadce966a7b0b34fbcb8e112b1c8636c11c39020270da0201710365560f0b27c0ad73bbcb13f8dd4e7204088cc5c4b66a7954f4c24d88b1b8c68a2b0f826a2ece56c548877f550dc2fcf0232bbffa8d214e4eaaeff1ea9db5125e9ea5e042ac54d0f5ff1b3148fd0cd07c3fbd293d35a9846c3dc15135f9c2cd3b6615ed9a14269ee7404341b9e46cc1fada7840633e536de9ea16787979404e14e06e4da273dcee02a0cce3e780ff77d3b50d9a21d7327d9f24a4019e27d203288b5d9b2cb4beddd0a032fa608ac788220609e9bcc8cfa6de66725a4c1dc5efd6a012211d1439afa582a6cfea6d3ac4349189c9836d31ef3fcd69da22bf10473a9381b3d09b3c334705e1713ac9e514788969e148d9603a0297b849958a4d442dcbd85e2ee4b09b029bc8e127acfdbd458a24fe02cc268ae1e96aae1c78d0c5472f4711fc2441e6c612d20b71e5bade8cfab4895ce1fc5dec5ff8741cca73cbf18dd14da3d31b143fc160e30817efa6fbb910a8e42b53f3f7a66b050a8759a6ffc559bce22cdf871173a8e59018269cf040624ebab15b513e9e790f33e68a1a3c3d5321bf4fad5e55113095031727e2912c0fb948aeb12e2d5874c88245cb8181141318cefc6d3833adc7009ac379ee8129e587f32538425e62ee19ff49ae48b24b5f31583fca7f00abfe626e2f82a0df5dd6a2093048813393501f7e74ee26d017be31d921e688c4dd0834e6be92e8e64ec1dc0d91500da65bcab658a348cb5d924a5e5f2e7ce18d7ba03d4550315657c020f4a78dd3c5ab816d39eedb6b4954840c66ff43a7f6e39b44f0078587bdca274f5df2d5a2ef3f696cde78699137e94155dfc3111976dab500ad9ad3a12934675d1efbe53cacad9cf3b867b3e80e65e02b27f839643a061b2732c7fca0143c0b6dbbccefe3ae41dcc828ed2401203f9378218be61b05d9aafa80787ec5828975a71cd44cc0c8b501ca95f8ae60fb29b887743fd7232d611832ccf044285371a7e29ece4cfb6aff36947d0402a2570d4eb96b81286dea6fe0e66c23da09a2e3356d8d42babc1272a925fecba810436bde9a0df804088672685c8f69e0135fe988caead21a005f469628ad49e1011b675f7650699b76adb2ed45e51f59bdb294c1b0647ab01eb051bd0464585d3d960ea0ad4d5858aeee400863fcfeba0175ae8a2750471bdc38e4a833e0c264cc0f4ba3064866cd71cf44ba400df486ffd4500b4db7ff84a28ad976b81c14f1996fb2407d46281483f8872e5c73be9d69ed773a6147ac1f877fea65d96603c175b60376ea5ad6dfb994b7ff6c1fae2f13fc4eba2feb572893a42e19d6e242d8460ad0b9d955ba6019c672d3ac5fbdeac63dbb9e8a13e89d457659248c48a907b7c4ae2efe29b0754d327e88c456d76fdc8ae08019238b0c69f2c4049ee097e52cd7cef839007680073f8350bda2e5eb8a4842c1bcc4dfbd98babb7fd5ee876f79741d953d9b71d0d174b7b1a21da4e116f78bc7685343115575c40ac99fca9d1c54794db374a4e327fd997aa23e18f898cc6b883f03e09578091a984499a1d3695762c27bb18e16a2697c9f8c3262b2e84efc330a5e91145da8d2f4f836bf553ec5071b8c096a5a437f1c732c6e349cb8cdf1846dddea05093cb8ca9ad399396bd4d4a0e3044dc1f06ff5234e6bfa12301dec29e956bd46d29c1a78e7e4661e5fb70960bd89510275d4815ab4477a05b3a1bf6d5e6c732cb98d59fdab458bf555f4de06a592b9d8f51cc33792772a7a72f1cb98f11b3c3474bcc7c069b42c3f2d14e3f5974958aef9cfbf8533f348b66ea8b1710df136a377091af237703e9a5b20e1afcb09355958ef35522c8c4085edb7513e1f88097ac2f29da72b613b3c9464f582a3438dd3f315e848586945b02ffebe81c4b64e74c625291e47be1c45084cbc3b84708594e7f40d7242d122988117b73b0b3765ad0791844957390e6094146f5c00e1ec2f0792e06a0db60b279b148bd9ce8294f1e3a4b0935e062f80f3353dd089443e849c4d41ec105842652e260bea670934c95484292e2666b3dff7cacff6c380ac858f5dd4ef670a163367a5c96579fbca473a3f54bf29a011a3ae823dd84cb8bea22a074566fc3d55287392a0ed442698903d06255e7c25780bfe228c4a14b656a5d8e257300ef30fdc27e78d1a966c3ade97250dd5871244a6fa9987617431a007171eac4c0380810389c3e6fe2848d5fa1a551148c8de1df016ee7e3c52766ceb8c2d615f03246e1de4b23dcae81534b82a744568c852a25412a40c0e946cda92c7907cab0b184d665656ecd844e8d7a9a82cf948d51f68bb4d58073ebff73aad0868629fcce88ab6b4a59807ce22f126354e511c55912ff5f053d1c1607b834cc6a3dfb5f2ef6bec91d00614268ef52545ffe7ee7d4b483306575c154693f8792ac465b84fe2b639b4870aeda672ab5b5b738d22021bf9b549a60e18993e709d9374ccf41f2883599e532dae4242a74a114b3e3e763c3fbe9efacbdb83cd3bc340262c94b15237ba1864eb3a7bdbe1f745a0b43eb47b6594c740f785ae6975f229bb52336304c48212e1d79541f695a886a652accfc2732a568563358137ed82c6498f66f7fbccbe8840909c00bee9931bd5231318f078d09dbcf36e2510ad3f4a850ddca7e2cc5de05e7463cffcfc33242d09a400b16c89f8871aa836866e34c15935dff2d6e3b1cc7b5a5112af9abc3746f20cbd0ea7a51658d144dc8299e249e65514d4d05bb2df2cf85e2ab315b0c9e55926355e49c1fe6d0139e98640f76d8bca2e34fb118782312ff9f39077d916973e609bb1e6e5e7334fa6acc24cf39fa067be0b88a0ab8d85911e270478b2a3f77b758ec4c3fc9d79df9795190b9c415c020be7a28e16c2d3c59e70d657ca31bb78e6ef5e1ba42e422cc50156b3ac567a9ed8a14e4534cfb8ee0e2536f4cc611ea8009f10dac48e768c9881cccd000f1c12735135e8d062b2fee320630369508f7b9ea237b3ba4711293818ddcedfc262ad9764a6e1095a2fa005a0990e823d16ee0cad971b8df0a1079a28f21cdcf0155c8471e2a37c64662ee677305424dd5c17bd7a2ff57cfc8c44537f2baa7bed75bc00eae7ff4e70a09464c3e281ca520104c98c75e52c0e72483bc6733c983dfd0a75c0929411a1cb6341b407b068e1169f213ed49daa75ba987a16c8769eddc91fe363421e9101948e0c28ef3eb078332fe87cc118047215c9085ead62302f1277bebc8e0a7175b7187402fcb1efa4e988cc8e3fc5ac9ba36b1e7b26ee049763753446678aa105767aade8bff45652e157cb351070a1a770222ce0c53c9efb6b075a2753890ab8d8ba66cbb9fc7d081b2b6da3c63b4d6b73c57c91f2675a6d680644624e103144d8d32d6d81cdb7866430296a98fd6b953f4d71ff1eddd1510f660fccde30ffbe33d0d1381179e75913dde115bbfa12f453d474b73e69a0812f2c6d22317344c6e8309056644a126cfd69613f45175409eef7e7b54df8e09d3429140dddacb1b972077d27c6aa9247000afe67487cca07ffc34b146f54573b6731ae5be15d61d936d46f0ef1b089a60efd061474a437c781a5a11247f66269a2bb047900223054b99458b73f7feaa2e1e63c92ca69959e6dcc848a662440012cecd0684795dd056d6918ca8ec9b7d3de673916838d5abe1968fbe3d0d927e778070f5bab82966cd2d1b6f6a7aba4bd22019425df9239a6f00b867736a28a8a140feb8bc2d045cf15920c1271e04f83874a0a2b491d8d1448834a75951eb6af8b556ff45a15f6b2c3b6fddbe7fe9755d704a3a5c68d8ad93e080fbab3a84a2df8d13c669931ce887d98858e988484315fd2ee61db525f2403e3e171f4cd33013c8ec4d0ccab096bcf2aab42fe00ec45f1ac915f48fce013e4b67add9c813694c9150440103ba21646ab4aa2af128202ca1142c6c953451ce4e520cbfa90feeb8e95e495d965731f8c9d329c611046582212ce34a909f68e9760ff866696847f05ec6d0bbb6ede2253a0d526cba58300a0ba3017751fab26b36afc9f55708b5f3896f4197c3449b27095d8f095634f0c5a9ae2e280945a8536e9f009520f629488dbfd96052321017ec5c89b17f02437957565e5929b45289c4f8ffe222f2242931491e965e6b2864a6141380179f649b1704f1cb188b57a10564b8f4625dc13f72ba77400b4e62cd3c249ced1109eb585926bf9a646c4f9e78d00baa640e20ab60b9615e7581a8ad0b1c384a250ad4182e571c18272be17a4e3c5b592e28cf50b99485851f24e367b51328561f9096ec321cd8932d52f36d3755b21ccd77ee15a2df390c7ae7b0f95fc099773e880b88d36b8e38c43b5d6b1cd366df4d11f43d3e8c39c077ae108414564397bc1738849415a9a045d88874b43b128902d74b1be1212bb776a969a89571d9308e17d7e61f913989a2c81556698451e5f8af9729d97c062813c198b8ff758d5a35eb11fbf4c0ead8162dbcc66f375365935fad2ce0980abb7bb1e50f470e977d58a5f43fd3604e308d4e1268a8cd36c6ac4020a873ac1e16bbb41c34c8d3fdb6b1204eb57d6fd412a241c8e440213b3241a284344409d3feffd7d7688326d559887705ccb3863e6336796c2a21ce984d65ebd51911967926040b68b03e67f5e4ddf168ad67c035b7f27b7c00b39db4d0a010db06ac3c721020b1019172c600158199d799637174b68fb115971ed380d1a9f8b536c8a15586af3d52650d592e76931952b2d8dcc4a7bcb8868a633a95a2609d1f590571610d0989bec446602b22bdc2922a08c4b716ce6af9798bb1a5567401267a8a5d0792c9fdcef5fdecad9ab59ba3c240a2aeeb30aad4e624d42a9f7876c620860301446bf3c06992cd6ef059c30fb665191b687df26e764377fb35990e5b9b6841e471b775d5b9aa2d2471958b9f093405c2d3dd8d15f221d213232c092c8a070a131c6a644797ebaa86c07de26ab027895f84dd4406799736c618801cc384864ec108828aef8c2eb3f4bcad4735f544ab5e7a95edeb87a29410ff7429d48e34c09e539e9d75c05a37bd623419c4b2e378ce6a090b343f18affd86902eea3ab6d1305ecfb4a747fc163718a727561590b568aa314d261c65a322721453c0c66649bce2dfc48387030790c7666d9cfd9718ee7ea3c8144e5aa9819d5f074e6d7e025add26f5bb95a021a134fb9a4153f5972d0288f718a17d26156e0cd72c15682788fd71c9d3c3bf2bf5c00d7ff5e088074e6a4627d1780d2a96c3933885dd6bcfe6c764e13850293c73c8347f7fe725907413f176e9f29296590b48ae52c96c976a1359808b41f120b9b33d00b87e262ec007a3196b5c12c72144c1e3b00c1010855b06e21a25ae394af767ed64566b49107fda10b1dc44c1f46ba5a27dd5518786535ace473f85f87ea4d910a3683af66b0d66292d812e295552ffd59d87627996923453ac7ca1eb63d2248346755d15d386bfdc7ca790ab5e54e025e2b8ce677e6614d8c9072a0e8b2d3c954840a6a7c80de8f8dd7ec76ace7d44710f33f0e444ee734321f5280d4af1f0e62972fe5969f691a22db900b7c2be25c65be2a90ea2076c6d9ff2116807511d72eb7ba4f9c029cbb3cf9b76c9d39fa3f00c1aed52c8dcffe2fbbcdfefdd906a2e92bd783275643f76d311b799b0892441cd145d52db1843f62c6bc67e301e1da3b950fdadbfb037e44c5c4affce350cab5ed1ec633a05107c1859662073329b2b605ed2883073667e54c66924d44ee56e6d44f290e8c6137018f0801e26b604c8b79d1bc85f53e35a9e85f341b0a1b9f02f6c840daf3724c21a8200bbc4920b01d3ece3d8456850eb543ee1d10a99f3bc10f58afdd0c59de3024717df983b9bf4c2c464a9550e32a812a7196b63c45ad2156080294c780016f3f928411a09e0cc3cf073f902922c83abac109e2a1329a709e3ea96bf2f516ba841690fe4560f0232e2dcec8d783c2dbc82087ca9f8278419edd3ae29b189d5230b8c4a51ccdc2e5b20ac62918ba1275f56190a8083df03ad4cef892e7be51d051d6a1f9b75ef120521366f4c31389c22dc023dac027ab0ac713861afd0c447f2db7614b3eae9f38691e089cd4bed8869dd27a452b36d280bff2f5e9cecbf6a822cd41815eee4230eff250d8b73040759c7b2cd43185246e6e09b114ca74680d424240c39155771b23e3b7c18725b27d9f11dbcc59f653520507b5c4cdb45cd245a65b7b2074a3a7aeaf85474c2ed92375e74015be9ea342fde17b12974ba25c85154254fbcc4f81bec6c84fee9d919fcbd7872edfa4d69a844830564845eea24a3ae1472529cef1beb85f1c9951ada7572e0b2d9686f3715ef1a8873c5ba39b05b9f0433d3ce118ab5038abb9d7ac9efae02607ac359b252e1fa2ece0c603c7c60be060e02601d9f77fa4a52fa8c965f5163a36a1f78cc76e6b84a17ff35738c1f11b1ad6c26b065e66c25b3c813eaf0dda2b2c2ddd67e60729e793183ae32cfb4f8d3d05851d14d5b0df4f8422306f8889954a688a687d08ba95ae3d4c1115ba776a523ddcad3c73c970003aac0887e721459344c9adc11ba5d9b2d317dc753041564600960fd23b9f0444483b1d1e0e6ad71c0b9c5a0423a71061b9aa1af93fc8090f1e9e739a026b5d138773825aca14860c61f18f0daf6e60e02fba38b92c48b3bf2f205504b13053cdc63c85b6463243f0dd84704fd91cd34699ce1f38ea5424d4c9cec2db988b45bf0c3afc66882a0f17576d5810183205d85e1a982dc5e26ec4a0167d0183cd4f61da2e1a4c36ae88ff2e6ed8e513545cb730d21ab5bf48611169a057ec0abfba98232112441eb753ec03bd101328d7b04641d0aa48b280d1bf6cdbd8a7c3a089623622ccf6d49a4b9284b2a10ac05f95580028eb0c76e8ccf2d18dcc4d76a87051b61cca024a18a33c1d93c890788a570a5a0d8bd8d7163fadd1bd02e8bb02034275bd7150e99f9f12f2bfc798954256900260b0b1f419fab9c18957837825faea5be1543bf907b34dd1659e826e431e93b47bb841735e45f5def6733db39c6a3d8d6e801e29b9d39349be856a9851aa17b82f9bf2f3ac7704606caa90dc58e94fac8eff2ad03a4101cf7b0a7dd9570fd693f12ee9c2159b70144b982b80ddee94fa52d002c7491655b0c68a70a06bb146e649313a5e31d7aec66a4d6cd731adc6e919acd20d0ab279227f6389e9530a667b2798b6afffacf890cd93d03b0b06970b0da74c16c0f7cfe45b0c8a4cc0d2654b2994c30bd01d1e0d06c75651f55a28adc8dcdea382a4c459bc3824b3499b926a8dcce43129a77f93e70f6ddb9584c7f1569863b3efc0882c5d45fc086ada0384a91c9ca7c432206f623a3dde5e14107ea6ee117dae5e4369c3c7692b75644dc11f00b75029b5bec150f21481422d7f8aa60562326b7ff8d5451dc63f3bac29c3b07809178002ce1b43fcccdaf88a02dae51ea75c90d43d099e058ad133f23690df5c23aa3eb681a293bb40dc20266b10c0466421575bb7c385fa98788905f1483a2460bcb9cb4fb84a5c0c518e10d7fb421201b309bc68380e6b4f128acbfc010683e9deb37c1353511b9033737b283b618530408a800ce4c184c2d6bd2ae7ca033af3ba4e56e4c2cfa5e7afcd7018a2ab4ecc2bda150ecb4336fe0af9ff89f5b708ae9043c7b71b33c3cbee0868cc1ba066f634ff3e872100aecf86305ba370ddb8f344baa73c708f64677eb7f78a127e3d3310f55ab75bcc2dc753ce67d1c25713d1eaa299be43f3b5e6e94e178ca6bc84dafc317334c350729d43afcc0c929060f6baac552e01626673b04f305acd4388256c24a1c268b2117ec9d92b204a6a5665d466eaebd90f5221db68d4bec798198d85ff69878657be45635d8e265ba744e3a0210b9493ee6b2a905825c2705b4b35b768b9279216377f369a3b3fd2aa98438ccc4f99aae9c441473b22073c9af7b8f4ea291a1bd6690f39aa1986a3cc0ca6d754a5cb30692ddb7aa13fee5386bd1998863d624f04cef11aa864944cce594f328ced864eea51db0740f7e76c216f3c3cf2f0b196977f5ebe78f85cc583373ffffcebf1e1cb83c74a7edef9afe3c7770d9fad1583030f9b248892de6bc21824c373fc2ea797d9856d828e9db08d84f0b41bff5466d78a77464ff81c547759f0be5b7601557b8159f2c21707fc9a07fd96c9ae11c7eca5c9ae07a79a7bd993228eca85d99d96de68d6199a5251e325a0dd37c24a2cd8c92e8ce7be8aadb128df8ef029da3aaf90e4e7005335c2cf7205161bf3d10dc961d483014b1b2f4c76650069c51694a4716abde19b3ed3e643c41ec097c8014037959109011ab6fe54db4d29983876f9907e01afe6607d27be1295b782d852f2965d72e9affe20c6c3c5ff0242704aae93b40d3fa5adcd38162e1e1a8ec62d09f2f88a60af8a0f1f8d7774e0f36a158b39ceb39a0026f089e3a97828f8fa37802c87337db0e130760673abf565bd4aac6ae0dd8d28a32affbe9258e1c3830fafc081947cfb77911b7882c41a70895c242422676aa8990a0946c53665382de6d703b5988cfc10be79153fc6bea763eab723810d56197b3a1da9278e8536580d373d36af1d82aca069fcfcb3b0ba155380bc4a4aab3ab5fb9431bc85480f648a4a91c7673594413efaa3b6490a57803b126aa87526db170c434baf8c074a10d43410140d981ea7ee7aec7524a216e3cf510ab07161da5f6edf133e50e4a5d13aa22e909e5ba43c84a22dd64848550ef96c493ab52ab4146273598178b033543f8098472e877b7765748d4e1ac205dcd02df9a1fd03780bea666829e96c168c3287c6909988affea69c04a29f1d50faf8491e9c7771f995625092cd60491521f0f61873078355fcf2f3c6c73147d57d860e9a9169ee300c0d71a745f98019ddf2063d84c029c1dcf94c9c6004fa2a236eaabd3250008b66b9036651cb6554246edf8b059128779c2d83437b62d727831e7d405ead978414bb9b2b3e1765739d8cce2388edb2c28605815267b10fc23e71e200313e100c96145bcab75616c2a2db0e233af8a1c24a34571c1d6e0145978e198d72976e90577b867dc8abcf3179b7d0f393061dd31da12d65f048d40c20a633d4b76b159423baef8391ee3e57a815f384dd880631864c1da8ed590c8ed22f25bf78521cd4c6f05f4baf022664bafb1b28180b93fa58530e61eba2f5df45c739339a4d0c36950d2ce3e8e53cbb447612a9416b72b802ff18c332e2eabafbb9ac326bdff09847c9c916928e0d5f41a760016d4d6bf25973060b8414616d6be16c5a24559e6b58865d30de29cad5d654d16cd2b43e344fd0e1f3e8a353ae017253e4cf816c8e59cb0e42f6458d1199f63fc3630db2fb41487c9af423cd279d5d7a0ae8218793b3db8a01fdfe4bffb3f504451459bc6febad9f50f2cec56f35a179c1f68f251e54ac004d998e017eeddafdba51fe22f160015b6c45d002ec260aa64c1993b06c105939911d9dfc02e107c6bfda93d68dcdf6ca44f252b9d70777da0896e8679baa45d298747f85fa9f9b9533454e1871b79b428b55bb995a8a4b9c1d765324bd274686352db9fab7881355f1e421f72b4a325ca32cca8a9b477affb2177eef50536ab6f97f578059bbcf718187fdcf3106d860e3303e8d493ca2ecadf08dc2a164bf062f4b00c95259c300d72d36b3bf316f79414c0e78c829aaf5d60c0b62966c42ef1bf7f3b0f1d0e3181371d98bfa2cefbdea593eb0a233d9f9af6e440fcb4886b5e48336ad3e58015475678905b0d54edc3bca3cfd7e0f4ffe80fc33ec7f5477f41f099d24ccfc439ead2dc3ffd080e604b1e196055faac4f006007e1584c359f28184e406aa15316e8cea21ca9ca38e3659fb00d97a2166258212347f37aa78cf535f3cd9bf8549c64155093dc8b84cbc0f3de7c25762b0c55bb2c952d52bc16a200b15189a394f0227ae99aa1ed4fb3fce930b604e2502ff9964148d2349e27f94f262a468331d44d5513fc0e332d912ba793a9bab546dfb3d804ded8620143368d6026c48ab30964405161047b0573362de0aac81aeeeaa3a9f44735302e19942716aaa2be40e58260a02f8b4a215a7a98e2c4f8c8b2156c7fac217008f818bed574b63837921ab0dc8b33cfe2603358c8bdd21431912c59312bdb1b842c114f7f78ba727f3a02aa61390d80bac19287868087a143ce47148de8e5770d707dfe24424601260718168629920b04126221bddeff586a7d1191005f4fb7c68e76d13cb503a98826f346607ae2a803f7a110b591551f0a5b6280aa33eaea0c79371666bf00c7332f5854708ce894e2b59e06d18b0386db99cc45e33246b50111523dc1328dd30e8afdef267699ae3ff97e91cc9a92189183f3fafedc89c8b64e721b9c23318aa726fff90ddc47d6d33fe5697126c61c2e59e0c6d29a64b16b3be7dd3995857bb4248d12041ab302d39cf18c108ce5406610440f9020681116d246b777f00960f022b27d992d62f9aa90608e5000b0e048ea0161e8b70c5ed7fc53d78921621e66626c9e599c5381c993fce7061a57b5a3d602cfbce0afad0e0db805634537a02d9c5ef0d52b0b9df2ca4af41c1db24e6b4c87f43e6c961f81fa6e06b482cc4474cb8bee127d3369829bddd0b0f54a4fdfa85e127297010af04498922bc52d81ef8ca9914a51d2a531d550af8de24b602231e2de9dcf0db98b1ce94146f8b6017763908d91165b1e0edf6bf5ab1ff642626452956a1da82e39ae333464796277a46b2e6f865d05e906abcc50d6ec360070a32f6a683b024f2abbe22612e306cddb5a4ccb9a1e1b8902a829c5514f84b90b5b3326559e8bc07028df740b6908f8f169c49455fc07eb2095bb1d54e7660482b66182ee3459d3da87eca39d56f57e16709f0c92f13a10183695ed1eee515cc5f053441babc6b96346a31326a833f023d238fa7bce3e1d9fea23bd7a0323ad359a12b0c7bd05f3b50ce0fb68f5c48e11b7ecca68b1f67d7af613e06fb8b8aebc9e83227733f29a37b5f09fdcf1540c1b53ffa6708e48cb7e6dfddd9b21c9ab53f172d5b8bca9b2dccc3dffe5f0869ca6b689290d0133eb73ddeafcf0ad68825eb752d57d95e1a49360b4580bfc3c6567b5ded510c08516fea0eaab0e09c6123f218d09067d18a464edef4ea238c13e054539b44a1249640d5a68288eb8a8a86868b1e8df037b261348d3f36893c11830c0e911cb6922af2823af3e04d2f2a22771805ff32480791746997eb22c479b3642e408365df8cd781661c373abc73b2dcfc167226da570d0b812c8c390243ce604d3e1c03e758f9620f966fe1f7c1c4f0d3983e48f2eb9532cbac78f6094522c2668946e94634ec89876c750d40f2430b2877f849e5b333391202a8d94ff61709d22019277b449073fb7a98c4ac74d3a524338b68efd5eb0f293682d96b2a8b2f8933d07846e53fffe7f29684c68a7832644ae21fa068f86322e852ace0eb351f5d1943c37a2e4fb32f392b22f5ae64fe1f238f5e2b7f24b9e1f0d523fa8b9d5b32df500a13759841195d23f482789c3ac582f5a271d368f117b0cf606443307558134476bd81e104197555b76988c083b1eda73554b2b6162e579942ab1b905c4285acc9d2d246ed729bc325d851077fd9fc3e12a50e9d907939b13a371e4b3c7fb2c84d61b49a07dc614fa8f5da7160380bca7e781ab8bdda29a2df78bb9ff68a873af271ff002d4bd8e8759291e8092390082411914ca1ebdcf2bac4a5009c6ff47d6486d86c9012ff4a748215ca4938a55dc52d3df2220ea2f52cc89f467dd5c4f3100dc09d2a96e0dd100e13db1291a307768886b89682485d6e9cb1010a785e9de88b5c06f3966699b2e3e7125b483df6a2a683d05c2562e099252ca3563a831f4cd7469a69ffebfadcf6f0793304ea0738298e3567c2ad3861f8835bc5ab5bd5057c0008bce118dccbca7f47f65537b4e099c62d9e5ec651420142846a7be93963578ebe7f7a4bc818804d26c28da9a8f72f1b773034b30320424cd7a7f78c16a73495429c30b70adc5276a1f8cf6ac916b6c45ac8f77a71f076af69936c02de263e09c7d24c1903d2462869bd149572b0fd2e35f830e6edc70f7e93e8adcc3547fd9d960a145d725f268d1513c654ccc7e3e254b0b42c582475a2078155070f258594f1b173c2162da8792caf737c20aa14fcfdecd522a8003b44d14ea9e32e60fdeab21912600fc013e444132afc68ba04e52bb6a517a78e18dd4ed5abde7a7e8cb545b7ec1e251d4e506480c06a972588592c288b67e888ec9d2ee534476b617f419c135c81b0527eecfae8a874ee3d6de8368e86c44d1145e263156e18eb4963d035825d7d16b9c8f772fe0a0e266e02e034d61c0b195c915b1259f56ff9206410bbf85ee10597dfe4e97d472ecbbc763ccd3826eed5ae36261bce3a04c5c29e61cba97c29169091d4499e62f1677d14b740b09ccb175aecb5785c135247812fc317026596f41ed62b14a6c1a721993c24eea8dad876d66b8baeb6a962f15a0066942bb6974951f08f697312c5b15a5197ac90611bc21b0471ffd7c4188a06aaa8910d278947fb4e89ff89461c712f8bc836ef9e841623746f9bb79516ecf43d65ac56c4d7afb88a58275e9a36bc0bb040ab66b7f36aba36db2003d030bf73a72306218b54e8803655ec794429de152a327b2a44918aca3985881118fb06ef6b4abe439c78c4d97981980ddccc1bbfcc2e38d26bad763838c52d800b6fac9e6c3a4543c3093db0f7f7d852fd85d4b31089d84f7ef98892d6ebe701ba57496d21c43b273df294256e8474bcb26a3d941ed197e6f064d8313abd7633be08e8c5695805c515fe3f7d4349371a3474df6e77f88cbf5451bff5c903418357ae86c6870a668124e7409bed28a99f15c380cc4b7223f1917c6eaa229fadaba0aca26cc14080c86bc1dde28c5166367a9b58d88b407683e3a1b3d7aa91039d1aaf80a674d93413979745550a682afa03f53031d848c2e1559d874d629b0824234e001acc877984178f54470c359b31cdb1c32353c2b4b361b63951558f6cfb36b496d0e69b24caaa1b3cf01ba80a58153c7e350bef2b1786253d6dcf8696fb8eacee01d9a857a6ba67c838fa3fae07651c5b9a85d261887cc4cfbc2d2cebdef84bc9d529cfb7608b5ee654afca1d1bd05a000324412f36e06da56e6d3a782f4f17f13d8292cba807d09cabdcd16af003c44e1e719c3ef0a1da7aa2ac278ce1f15fabc0c69c4919e4a124cf13bdf1c7286b94f090ebc65d0f8ee35ce2d1d00b129008bc63c3bde01ae4afd47fe381ba721d30463dcc149cb3956f07703199910ce45142c87d31ade415a9062ca37a7c2b470498e7d27c12167d37f9cb8eb12994d6a003e536c2222d21e5928c2aad5f586dbac261a7489e9ac6d620e62407fddbe190a8d6f6608c5111d1d73cb86e9e54418f1b7b3776b3084775c0ac455a24a8bfa5e875c63a014ab81f805fd8136dfbf1ef45051c0025559f97f6b2ba16e527d4a3cc11a08a421c0507d7cb60403a702c5c4a1d0d78991e49c26f974830669fa2557357396c749782fbba493c8868170b95dc2e38264e5acf762e158fd23886ad0d655dc81acf42be3f1cd356565187b118f4b27dd2110b141227ddaa96d575f2c27b3e993bf56409e36611a0b55071ddd041d39efda4a9536eb04255aaf543ab8070e87ae30a22518aadc25c421447508d311dc046a288efd2b120b27ace288430539cc16681e33ab03134dd828e86ea160f7be589299df70f00481b77a70a235c730e9d0bd362a1ed469765b94d5b105daf8b581c406aec6617ae05bbef074d729f14ce33ed125e1e1dda960e4d84ac83cc5af93c37a8f394fc3215fadbdedae26461d105dc493679ab67b3320e438d053c9339490b5dfbb63e4afdbe683f45c824a0b049355722d5ff679701a0952a543cb45a9ce17fe354b5aca55640d834dc9e69a4b5581c32335dea179d14378e476b900d16549429d0caaae76af5d1add6894fe1de422435ffcd8fdfcf16b8c571049b2786579ede9cdf49c0a16fbf14e120b51d0a8105a794632c2f012005cfb6ef29d23e6cc20dd53910a4cd68b4876fae46d06c3b03a3c6aa39dedbeffbf1b6a9def91abf6ca515f9a158ea9038efce815d24d3fc47ef300141a718b747b21a9d1424974830b04bf18cf5c4a68da0969c6c65177f5da00c6bc3cf48147ac0061f8f2209da2a6c9d892e9d7b0d2c31a8135d9c356d540ea3171382420ed3c4a46335c2b39833f0aa963842afb1cfed6f76ce6dbf8005fa52d7f653ddadedceb925abb5a7b47bdfab49321c81e1da090f9eca4d8abf0eb2d600548e73dbb391064bb0a1a288d01ce18244ab9c1a8ab997b4f5f6ca94b29474c9cbe24eb57878f92cc592cec7b9e1f9b44cdf89b4f6d751df3234ca5c392e82a40a47f5ce9dc9bc8cbd38516538325ec63204de1c487c622c4a12d93aae07efd98e6cbfa3711fb08dd1d6ead89d2236a2a3648c64ebb6867b78a3ef19ba0b5423eb81d57af45efd9a1be6b663237a0e5417542b0c53d67666e6fe339104265f0619767aa2e142616bb23543a01e6f33ce6d629cce6241375abd3da2a02f0f682b8022899a2d010cfcc5133405d351b395a9f524bdf5a136047ee6e93102036e2b5aca5d2015f30ed38518e123bcf9c2de686ecdf90caa4101e9c9d9225ca5b6a4b5fc8d5c0e048bd3c441c001ef24b6c04eed96ea898e3b3f128bb9e5af3167037f8f9a5e1a695b9978c125fcaa9d9fad76239a6df5c2916a0a0c42591a6990416187145c79e2b4b9e85520eff430969e1401aca7913eae7937c103951dbd321177f04dc219a847802fa27631867e2b20d8c805a39265061ac3f1fa46543288b468ce19983aa0453ad2b79a1fe5ca4ce56a15c00c47a11b662f528d770f1159c235226a610959ce5ed26a17b26cf829c32825a8975921ff8e208f515567926330cb12d2228d41721fb245d098cb11d95118c04441c157bfa95c2edbca4622ac12c8eaeed9ec088aee9a1c9ec588e6d082d9197df4d6c49ec95476de19d3a3c34b7a740294e9d5be08207e4e36134fb8b87032865ace2b00147d9d722b6c59930d87117018ffcd83479ac2ad5f69aa1e64b86a427cd88df22fa2440d089199faa11fd01f2ba876904bd3724ea0483e8d5974fc0d821fe6513dd9457fd9d95aad19fd1a984d3298bf2cb7c7e8733f819856a64a38a8c530226e773dd5d9377c4747a58b1446234fbd817aba1c98b22cc0c1b56a02ae75923d51b6e7bc834d31c00bba49c444f29348ed3583055f9cc40983bb9416295909e6a5b1612859be8422d0624017d766e98267013028cf33995c27bba2ae6065c0507dc4df778fec6d864210e5371709d1dd67057e33a08ca1c16d0e9b888a86fc3226af066c4353c6640ad5f7fb5c3fb71805ad9370fc4bd018858a9d3fa01592beede60a63f76b9fa6e34e7c9edd448c58263a4d1f139ea64309de1166facc01feb6af880b9365dee40eb37d07470d1bb238ad4da3fcd5a412c4813bcc4a3ef0dfe5031128a0f56e988efe53480243c8842e1df744d139e3a0de648ea9e291cd41d75b6a2bf3b5357303fc5c1c918a2a802759a8353dddd9532b51f047ab1801d26c624f209140cb4ac881e6799e6b504e2a95a931781cca11e80968a59e2ca5e8d7b79895158fa2603466b135e9718515c9413fd023a165af7e786103088af61a6a1eec375ed4ac6b1e5f49a07361491914b04bba917525090e332ccbe3ce3c79f9bf0344c93f611cb98876092c29a1fba7c897dc997f3d8a846f2bd9360756da26eb7a97bd5692af3cac4de4e60b586b2eaf6b64d5bbe6c956b35f8a01b00c640e952ca2764aa254ecaed621650f50374e4e81b96922608fb4b14fa90ef01370dbd17ebe8cb9cbb4ee5f81218bddf343706832e2d789f952dc7796ce8729ae3153cc87a7b33041805a8a5bed851ff40f02734ee208c499946b70023bcebd04105f3dd605cc7ca55b8f97308fe032dba9d1881f247625db24baff4264024d301e44af3b29d495eddf75fb24b334d32b4472a37c7c860ac7775723fdb5dea7689a6741e0b1b98e89c5fe7787d283349c0ca71d25c56fb9a8157f1bf27d5c5e39401988ea56c17842756a157ef6d127d269d391b7cc1e81c15aace8104c2e7f7efb4e213b7585da73e2c73e4257fb665e2e64380e46648fbdd89442dd49dc0ae3cc1a024fa60c65421892258cd828c37d21d9965ac9e6c44d573370b04a164a7351327fc87b21e7ac91a2e8a11b5bf45dec072e6843c068acfda2b06e28d023f46c933e1e2459c8ac6c926604fc6d5bb4af2fa67262b82f1da5bd1f3e3f526a9f64b960ae7e3fd2ac584c8bb91f2922f8c8cc17f8ca5f9db48773d3e7f084a4084f72262f43ef61e1d953c41f294caaee666f849a3f527eb669d7a32cd4a4669c71ecfd4836c943c6f598b073d410fdc8da234c499de823d3272f8c1f1710150192efe4f5915f0a197f0c5fde2fe55f86b4cd825b3fcb28bff43d92de893e92c98ff13c04e8374387fb6b280fb68311730f7948a95a6784a108fe2c932c6e47226ed5f037c938f9e1522ec51ce9bea3f924113cc958994fca235b72d32feab172e9921344b0b6c88445d484162d854dd60c312885f2ee22744aeb6c11d8e70c561951ae3038fccd4b8c443538fcfcea4b4e6b41e4957bf6089855f8f9e9db30ea9d21dffd7569d61c85250cf4089976e36039314a3ab5a395b0884496959ebb4b8e7761843c6a2d6d0414ff05e6afb1881de31339b2e8ec4147ca6cf71fa4d274202f7e9502f91e0ef2b8fb112926811f822d548ade0cd01e581c29914ff41f496ed2f5a31b7f6437d7efc329807b5baf6b7eebd9edf0bc1116ececd487c467945251e7788d7dffc8c58b99bb1b41b1bcd7d96361ed7bb81efb4da3a8034470faae4e897fb020b73e5bc1703b575d8476f2f451e19533c6ab66dc26c03ec64d015052e793e34d3ab387567fbbe22268c11e505e62c240e102fe8332aa092c72085b5e740144c344a1e1b8b905172905f6c40e27af03bab90c04d1b038943bd25a18e88f8a85fc429ad3ffe6b24ae157ccd4cd094e58e675cbb98eb5d255de2d748bc9d35b257393819ffa03688d61f8f3bd4a24d48d480377c829173f84ddee4fb860015e52b500b416339340afcf962c1a96f7ea62f38875a0dede5802ebd9db589a8ab31875feb9269ad0a7159c89cf87c34c57d94cc5397a8a78d53e642ea53ec442169e3d941aa68fc5be879ca890ff89844d7019148b43a032d7c05c56985661f28bf3d59d55ca13fa197db0ac783a3cb7d212c2558694e5c85245062ab2ea559721ddcaaa7dc1b4e96e18d462d8b35047fa7629aa441ba9b8a9984a60e88d80595d6e4aebfb3c800020dc79e79691456861eeff7edacbeb102c2949780f14ee39856577668cab09150f8ec06d9c7522a313a6b5937a62588b47bf98325eb343fe62dadc86f9ec92328a32072edb557ae0f3829e54bac66c4bf7d551fdeb17f6a5d509e77093251c417fec87236ab1580c76c82639d9c007e0d45681c188902628b0cca60154b6e14116e10d3887f855d4c3c26b396894ebd1132adf7286beb061807e1c3d91103354d7fd7191165df4ffa3a50fc52f80e92dafc8e9d9b806474473b1c323b386d746305b00ea0d1470b371daf4c610a33871e81bd880570f6ad51141a69cf98cbe723e033f600103dd4feb9baee0c917f84539523f3f191d15418aa973a8150e09a39addae343b911edb824ede19ba040e1b16406f6ee013dac87a5fc939bab05471be68f102ef06b7f06ecdf5097179d45bd087dca1e4a8470bc75ab7d18c145f3ccf17500ddc5bf767ed2fbe4905f70675aaa850dbb9207ca6b318d8ba3f2a77abfd20e773232f7069faba3689ab3680176b79d744d1ca487e36497f0beb03e3014d05811323b8a659a8446e9883ca69c1919b248f0bf3c3b045a1e5269936a5e9e2d9d9adc53776431b5c567b503249af3b0068ba78c5fad106915e5e08c4e09622f6fda1006deab1c8126bac64c502962cb2ce32eb58b196152b58b3cc7ad6ac63c54a562c619d75e41426e193df4a77e948dbc43f623a205c55058e4dd1877c0741000c15b557bb56c0559ec6564afa786eb959304cba48956087cb69477779764e7ea515495d0947448828b9aa5c57556040586428566016c1442c0a24f5752150e9cb0a237e270652ed4414c621000918e4c994c2f18ddeb954c20dd5491c31d3ebda01ad72008818a5631827b7ebd3cb33b6de9fea363ece230a26545f8fb89008732b02210e70db3a7c503c48bae30046f3d185bc8c86f363d7c57d16bca9fe814f5291db4d0c8c3ef1c0465f2cd47d7ab730789d6195c33da85a0c5ac423fc35b8a81427027689f2acaaeb3de8c07bbe818e0aadca744e08cec47452ef7d785885612fa88d8d400937902060a1bd7ee0de4e946de0f3f808b54c12d545dc580ddcb0320a76448f86ba28691ef30587abf17799dfa8125d077d1dd43e35a4c8348e2338b0d2d61b890c3218ff3ca8ec2549f7fbe9064db61c963d7ec937b1e14b687a94f33f5f1d7f2aa32653c781a1224d7183c56136b09dbc022a3350f1495e0d1ec0bb4913df1539501e4ba24b813ac808f72e375569a4b5fa3964771b1a5fdf58b130ee46705e7d0a04a544e4e8eff782c4bc2dcbf0b6afdb4f703b3cb4a95ecfcfdb49c6e1f2535d5b041a11ff4f0643d460e4897f4f716b51b70a162ac6690fbf21c785568ae09c34e254a48599e525032ddc13558aac92f70fcd623a9d8f169b1c61a483d466c8193671d1f87dd5d1522ceb058ac5e414422606f793c418aedb41f2315ca33f87b3860e14efa51686adf48388e57f10ed7a4616a2355f2df9896d647eecc9e349565f1ea8cb357ad14970af7b3a908722aad749f531ec912b2727f9184c37b45ea645c875386b3fd1191910f0546168b058b4ae52d163ec9e6bc050dd6cfcecaf0d8c112a1a1df6406e61d7ea4ac31aee91fa4b40e570e683420127ce71038af30147c56fe885d77a85f2a2977955fb3ba33be009a84bfc05c6e9baab89c65539b3e6f1a21d0005cd5801a233b080316263c5cd191c4243337baf0aa362ecc69635cdb55147d3ed6f60de57a1c18b134413951f064d54c1e55c3f7f3507fe6aecbab3c219359ab90a91b52daf47b08e4d5f5f4c5d39038097d3d59834301b468db25e405ccce3e80b99d8faf805b408cd140730f3f599b9480a574edb7212042e8067e9098c66f8a8df441ea3f44c44b34636fa5dcdf65935819e24d7745f5f2723621a80ee405f0511509c35720358712c60d01fe78c158ff03c47e10250d76c2461062238266d3f04ea8f96a6887f408b40d72d013d7465c261c3559537181c15d7f6e005ae2b6ea36102b2e922b2096045f4e29800dacc408d2605f79470f511c70c585aea3a93261641b74a022cd0688db96fe8b06fa87b17727aa54c47089bba99a048239c6f1b812feef67b83961b3bbcc4525f508a85742360bb5803071420882ddc15a21ee5625aa108e79f6a862e6a055450b67b5f613448e7684c0a4d28acf661d6d1f83c060ec55285f5aeaaeaefff09fabc14b079c4cfba345adf239803d92739bf8a072dd68f0c48bd63d73615ae500c8e2eacf2552b066985b3ae28d0e22f18402fe7c8d6d3b3795e42a8a20ef38fe88603680227ab281e41d0ee423bdea133c2a786a44e26c97131a96f65748d9d25bc22f074144781a4a3ab1496d2afbd02e25b0160ac9e16c38f9b739206cc89f743263f023cfdeaeef04c1616689f705ea92fcd4b25746114348108b42eab9943e10e8b0fd9910531873069ed831641d668827a0ccc32376d3432872ce0ba6c795f8a22bff81ae1022701c8e12275631f53f72b208f12198189e8c31b1b5e417fd545469f465787992553a2dafad669420ca8141e74b0701a614116a4551e7ddf96454b97bbf7539b23f986be333bd4f06e00621e8116bfdd102ff2c9e4799570d4a45bc5aff239ad900eafc80fdfadfd49722d6e5875494f4124660342a6d9125f226372a549b963c887a11316f5fdbc16b5aa9f3dbdec676e6020d8b1435d45b83c38b3bd926b26a0d6299c5d535601aae8c06d14c0b392369207280d08670d7d92092aeffbbf642aba79e502b960335acdea94ef68c066fa10f4c393aaaece9e4099c0dc3551f5319e9f8b79333ed755f8f1567b37211ba3a28ac61d76ac90f570cff881a568b52019489ce5b47fbfaa3e19ca3c43faffa34aade6b5aac254d85a1f637ca102ca9eba0982138f1c88e85cb9eedca2b525fe1315a1afe535cded21584caecadc760cecf5fa59057b29e56900d80d785600c1b23f7a4294b9b29ca0f10fd867f5e552d93545a925a247d4d7437bb7eedd5875721f5347a4761349f2116e95f4ca15f840f0366a24776c240858b0d6f40a8609cdf9d38b5b61eedfb3ece83535f505cdffb86781ce18fe3d684e09217366f5d82dc5e0afaa4553416c59b73984498cd9cb25b07c24fd179023ed855f6db94f9c490b2d25d08d29ede4823842d40cb7edc49ef8aeb2bc1b678f2d28092431242f133a6c9860d24446e6876992ce09f483a441a103ac32b88e82e9e232b28c82d197190d7aa84d729b86a6a70a249895bd0a290a4e16911a30d593fc82133cfff39c6585c01a3dbc04cf3f146ac4214c17fdc8f203762bec3de92e0acb6cc2c7ca8ce7a66e1b9f9520336c2740463525e266ad800d0fdad458f5a4174d6c472a6225152d2915fdae118461660a5553dbad3f503e4c2ce3d086ff90d3d2fd484fd396c29b1f8b12b2d13c1c4cf6718a3dd54834b50b512d0f8dcfa4beb4812dac18f4fe54057c293cc347931b840fb33e25acfb3af0d96dfef7886eb54309abd6d7e81526828c3e660d54e18bf6daec01a2838a8a21b4b447606be9fa1111b6076d3500fdcaa4c351776594c4a658a2f470503ffe40c0f6a7f612b1609bc8821a882a784aa0d7e2f9f4dd63ec6565a41b3195a085019b763a22966fde21f92a30ac029079c50ad28735ac4dca0331740b1348705070a49b2b4ca3e36a07ed6ffebf4d39776bc06efab487534c7e2cd11b067e5a0909488451fe05a62f11ca5928c5e2bf68b4f0cc156679ba1d49114968374b68d0953224a968edd661e455071436eddd1767d4b7a0392521154e65c3568ee8987a48cb7998939e5a4cc3eb220d7ece2275a47a5ac17619836c62f9f4cd9efe54526cd9844494d643d49cc36a94ad26830572584b929bea680de4cd4f967a0c38ce746f5b164cb00656000ed933160ab75b4e9bfcfa349e40f343f306401fe4e87a11c86abbe8a675422f2f6429e988cb6746a635cf6ae3428ec1ecf569eeb95695f9f669d790b911470e64e40c70f7339ffc6963d1383eac11c55f101575e2ea286ea654f16c2867111ac84b6fac030d3461ca6647f2795190a5200a4a19374ceb03b459bec42e7f3a16bc08a66a1f62cfbdff56f15ea63dd45d861f58cc2695c8db464cc475bf3aa82b1b75d19180f6af55afa9a0e454c0c212534dc8f261b72f4597bb9089462556924a147f82442d9504d5160e6894810c37b4439e03064a10974899eca554cca21499abd099dabe06df339410737729ade21246760475803f44f91b534c7e9bd4071e68e6d2a5f6561a5dc80bf22cfb9b2ac557a9e9e27dd1465e1d6736023644c23a9649f20c14fb8dbb321680019208bf3c3eab32950330a48f604e1d0087c5a6c1c446b02020104d009fc1834392003c0b0514f60d4658a056c9d2b45317040e578d4dfd2b8433d5234efc0a10459cacbc618fc32799d022e502f3b15c8f994a2e67285c959a599d368c62201bb498032898f5fed8fe2aea8f3202444f7b37a83cfc93f8ead3fef1073df103de26ac8cb02c2ec3694f28f13e10380d2a18c5e08013c15f8d8095ca4287eb803f900031c6fe193d0b24d2f947c8631d3ee51a381d5624f809c1eca176fb739f84bee9f594ee02986579590e20c9e2218c87c1a15b7d56b5218a987093945937d1708251323e98709dfe827bb048e012350de6bc511415844663b83198f03e1829e25b722bb46bdd409eba3f9edef8553106e72370b35453be7f0dd0047d4b3e953acf87d39afa4102b06b9dc70611113b72b73b12dbf8a0019b3ef0fece33e8901ffa6952cf7d78ecac0d1f1d1ea1399ac8b9d84a5c597af5cc71903fb62d5c60f61154499729ee919209b3b0d1d6f5cd84e75dfdcb44d2e731e815e3a41099d5e6c1688619b652a9de880f56b70676f131fc7e23a61fd4d4150e7fb858a84dda5283126d0e7dd968bb969dac8dfd7d303f2d2d1574403745f27dcc843821daa97b57d2e9bdbaa4575916bc8b36174e0fc0647ef6e805d6a3a5aae9e23b09a7d515eb483995d1b9fef6e909252e294f78a26092f1f33ea57fe4ef4c462662c5810217070a1013c041720a74ca1e2d803b107f38a6f5ab2a503d616f82af22528054d7707329b46048ca3818a4ceefbee81e49191124e53b9de9c9f5cc474ac03c10a1409c9652256dca760032cff0efb0e3cbd17b0041995ea808869ca49dc21a96cc5dc3947e701b0a20cbbb5f424e2cc2382cd3cf020a849f0a265bf9e018a9aa3c091135956c8aca5c19b1ad6546db60728be9c9068219086b0067f15c25bb2012071c14f41cbbd6bfbe1bf5188c802864971485a4d20d566a260c48c0a6426d86020a0da860b118c0dc1dfb0a0bcca8b63d5068ae891537000365ec38b112eb87228629abf42d9e04a58ee8089eef4a501add9985d444f05202427dc436e8f758b026da800401dc929d680baf9fec5943f8bf949f02beccfc2a0fe08070cd4a3568a17cd73e3a096114ff8d69d2628f8399eb205491267c0b7a509303945e7e456a3eeb476daf204abc338782ab8f16b2bd5bf29af52153140ae3d88315216f2f9fddc4008c5f1628210b50b14c0e715d7c764d17e3726b573ecf9b654e23be5e1780b29069270e29694b54da8806d28cbb3034506e816702a907de7debaf28e4998e0cf9677410ca7c73ef15f3eae635b91bfbd5e2b5a737af6b26b0c0438f2d468859b4b711b382a0e1a8cbc51e29ac186b0db4326db2e71801d335bf8ffcf2977a6495f72b47e1245da1abcbad8fbecefe65ad0e8cb4220cd3675df05f271d5bcb6f6f61a0a7d86649580ceec272836c1f9565673f3af34e589d000bb3df6cc4ba5c636d56b70326fb11bf023e67c0c8dc5ffcfa17cff68ac62b6325b4aafac99de9074badb39997f5c4aafe33ecf34a26857fd6b29307fc4fcddb96213f3ca236b91ef101b1a408848ec55ff6ee617cca0fd23b3a2d3c8dd415eb0c793116bf440cc0e09198ac48f2869cd0560963e491370f8997980c31e7e042c8c5fdd1750d44f565792a7a226ec516cd2252d3ed238d998a0d2c228d2216c8e30ae288824a92f96f770940594b131d6794f617e6c8dc0c7999189b163d891fa8d8fe89107fb2909c8a775fd4251094b3934625bd1ca9466491f8868123c9e5db1af70171031b85a97ef9aaa8acd6b575559b17ddb270c2586da81a0e821493eac16802a5f519dfcab066d0cbd89b117acb896e0e7363da58cf7f5d98065d8cb4b6b0af4eba0c270cc01d65f4ad957ca594864ca263be7a3e942a667483c42f433196d34c833b0c223bae95f38f2757c334a0bc84ea0dfd023f36f13c8cf5c9608c0918f5d9fd3c83aba0cd9d2d38a0f11d9818175ecea764631d73a19a01dae095568eb1402ea4c34f155a5ad3f62e54eb414d7e5851f308cb05a252eab9ff1800cba9dae2f92648f35411d9400d0ecf9e01e11c380813bf0c04beec8ee352019f1c0887f0ff497e71780799d75039fd3419aa5002f9c7ad4cce564e3509af95f4e8f74f1d8eab4d176e4a39a9684ce3bda81e5e68b8e913a43023f15c9f1a363e39488827d3489372262e9a8d71846c231551e689b2aea8f7cc4526218506898ef24fa54a1a482821c515a8f24bfb76c2369c052384d8d2f2f7ab389c35d6c7287e72285a80678875477ba4c406e226e8183184200902697c0e1af68679d33a751f6d466cf5e99010ff297ebb64cc8ea9f6030d079669628c12de40c300679af0031e0ea04338fa1ca475491ac2ab3432c8800ea33b3abfc905747a3ffd337227eb318f401d7adc4220357b7279e04664b957c0de55ec4d02a28ed7eaccac557307c2f8fa3255c9abe5a3e9ce17c94503ad3c54da14f6273dca4038d21a61ec4c4cbb6ba1ca81670ecac103800c16f8843e3a422361f86970d2536859fd622dd12c31be998fa0a3555685dc87408dc28dac423f4be3df8de8661535b4300568856b3b9606f4e63933f958396d07a8411216eb600947fe9d2ffe6b8988bef586c5077b438a687663d70a521202566fa3ab28c6a3f0d394d04a97384c61035694a68e46e505ac35868ac6372a595887ab5bab768e9217bc7fbe2b91682a314808891623fe090adcfe9910ce8fe395e5caafa52ec308aa45d22cab0813177961d8a19c0ac8f0a25cd7016591a479edae81ef683518a2c59cd8a5bad00279bf5f45803ab3fdc0fd47b24955a953696c5cabaa199c8ee7026cdc52ea6b798c218672e3eff8a49ec96500a1f5acabb28ef3f8347cbf3ae97d8b816d863855883cf274b3463ad1cb8479cdebcad143d1a53629651101a4cb06091710b28d0993a483d8022b221f0446b0d624406fc7148196c5bca8ccf4e0afc06154dd4c63799f086dce7691d7add16637fb764006034039e5b3da3a03708857e8c357f5bab9581219127495ebf3c2e4c94c48aba817524e56c6386a95eaa5c2a4644ad055adcbcb939321a1adc2ebd88fc6c8e1b06240bf6a51d009ff2c41066d18045445d27415be5da259918279c7130a00d8956beae30a84aa48840a420a11f87001158775fa0d5b0f976afd34b22aeaa0a564c8d0e8555cdf2d944c06294a95d4e1c2e465d46855a88f96922243a356bd1e2e964486294a5532a9ef9ff129e90961156149a3df2bb1c60bcfc890b5b526a9ffd396d9caceed80a819a0a32af787e49cd82e67189a4595f91716c69f0610f3b02aab39816495a6d7bc566cf313853f8efc8090be10b5acc52cec0f6cdf82ecd1811a069f912957e013aabffdde3ab7f1e313e61642074a6cdfb9dc0b4ecd0a25b1179f49b3ef29d9e4ae6a612a62712845f32b41ee0b36bf82b7cb5523afc52fca785a11dd327249ba683995d41577879b2048386d3e8d6dad75030e05de0016b70d95516e57882902c02d027408fc4538aa546a1f2a3b80779855b9ab744599e6e2560f66db8d0147607010366751de6fbb1cd5b38581d62b7ade9e0b7569179df28284b422e04dd5a835bc043cb86a0a4bbaa092fcc5100191a7f055c0d0e853522ac4fc51a9c14c1b243144ffe8ed6f585a2386ae4a9fa584997e04a9af824c47bb1def7a162c019ea8654a8ef361098d1d70cfc28dce32b853aff356ae0d5ba3e33186ce29710b6ba3d353386f65f7c0a6f3a0f42f05494a2620acaa43dd2389f09ee9a56a06542a018cc7057ebd854c13551048ab8a3ac07fa6f4ae2a9a09cc0496467578e65d6026c6982f070bfc16b7e0d10e1c8aa5dadf52b26e911c7221696937257a03b6fd8febd75878af43e4370dd374aebf43b4a0d704f05065273720a1646bedde296b1593123912488ec48a08d9b9e1f14a751718acb1020f88c101302a4081065c6144114214008b0b6652a2c09003c601c712253b74a8e004228200e289131d290a00c4ee498b972ea8393e3954707c416861915ac077c55785c7f3eda0743c300607f502ca4750e13bc1f3c132015582d723458237c20b0078f040b9523b6474b8664c902921e60498d70babb5627dab954a85f27a850586850f5c61bdb05e523a5a44582f281464987838aa69d9ac605a3d29991d5e4a66354be95033a8570a8d00307165a5e363bda4603328f430e00a4c13193105d3c1c327c4878a49ca5bf968e00a922542af007c2998d4929b1f5c89410f2e98c183a78abd548881872f65020a87f4687e542f90e0ca6aa5421216117600f980928107015c29e1c5894c083221541912816c61181f5cf1c92f32d08c70b15e5033aaa6d40082e0a195d2b142c1db1184071948f1e24209b0b4de5042c717a38ae1c5329252f250b6f40000950dcc104c0bab28291758467a98401432f4b080214670e96099099710e08b2b31a5ad8900ccf0ecf09a9c803ac22a81080f302c232b98960e549122195028c00cf9e00a0cab6866a945e423c910cc0b91cc92e833812b24a4604460563100ccac606292d4dca0802b302da2146a405c51a15c2a6f45c30a467564e5c20f504cf902a445b48261953023f4f22375f442420827b460c2082eb45e50a2d4020f302d901564264891a224964c8a65822a8622f2229302e231b05e5830a91c9592544f0c9eca078a463582ce4b2b44194972a4470b668497223c041dc50869d9a47ea47eac1670c5051d2921d50baa145e7ea44ed8b18342a1872b608e87b2a1705228150e35371c71015bb76080195cb66cb1802908b0430e4fb8c9f621ed8628363c69c2642969c90c44b19e20362db0b082a738004697366c2003187e58a831a1049616108c518502684802430c05116462565f7841012daca8628a0444a1e50926364072c02698605aea12070f6a36b481030ccceccb8821a8ede7080ccb8a228828f2720234aeb0226684080921c4c0b45827f8904004a2bc88743443d1509298909d1b1e2f1d33290408310001f050638805b660c0027670d2a408911e21a44260c60e9afc2021f2c25a35e0070a38408a248e0002072810808021908e7e8e0091f1e04005e17b23e586e3e063232583af052a353c147c26f84af042029933be107c657c5e7c0d406df135a5a6783f3c155a28a84e9829e123e113c10be10500158fefe5b9523abe1815ccf7d26a7d2c96ea4b7928cf5b354c9be02a2188eeb13673a597cc79d186b4961eaa045a97a083a9f798a347105c3d6cd04df35ba58fd3f98d23f1711b243e5ee9ed6b3db874f7aa5d3d28e0eae100578f205c3d78e86e1acd6dd66fdcc6fd458a2b754c3d533fb2bbf34e5ce8937aded5a4802008450c57436c5440ae1e32f7739e64cecdb853a8af3dd708628cc045a519bfe89e6d75fc56f41b9b0f6f69f108498c70a5c5fa793a1e8126d6778d008e7082e3f2adfee836eb1fd211fbb5b63b33f6bfd5795f4278f1f1e5cd8fc7696371408556abd0ad42438747eeee9c6e1c1a18d9f11fbfb70c5d3062a4c7481123448c0c3122c44810233c46768ce81831d2d3d353a48748cf901e213d417a787a767a747a8c14e92952a4089122438a082912a4084f919d223a458c10e9215284081122438808211284080f911d223a448c0ce919526408912143860819126408cf909d213a438c08e9115244081121438408111244088f901d213a428c04e9095224089120438208091224084f909d203a418cf0f4f014e121c2338447084f101e1e9e1d1e1d1e233b3d3b457688ec0cd911b21364876767674767c7884e8f4e111d223a437484e804d1e1d1d9d1d1d1e9a6ddeda35d2114c995f549474a77c3606030363639780e3030181cdc618e83bbbb77f70bdded4277df0001801a1ee3628a6e8fb900d003009a5c0080d21e83f158b6fde80e43cbb81bbdeed9f6230d3f2ecc338784060992eeb6010280135c3ce2e8764c735973c7f471b9bb5b60a11b26e679baf84d21ad93e40225964ba36bef4da2b3f75a201e43743708f2a0b978c8e0e211c3cae7e6dba1fef834733ab64a8fe6d10b385e58a0bb8144d10112a5e63f2e45078aadac5da0bb5768d74b1482f39d24a8038e3143f7d7c6f7823454e0ade01b3f225f90234c78a0553d6841f712495ce91d4031b4f783966e20ae6e141bdd2d7a3736bb4ce67e8629682b6b345fed11cdaba59944ba62015864a10503b6b8d921e23e3ebe63e33eee2f780c33f67e15dfd5fc45ea4445b7d93399fb9ca70793437783eddad12a31bdb725a91d3548020395022cd09d4008d5030494900223b878818f2b7c5028382308094f381144173221282e42dc9cc8b941a8cb1030141518a059230654162ac0f98102e28a90921baa5451860f27a0c82c6cfc04b5233cb80901c54406ae26e088c20999276450479a704d01831914b173e3a5506e860a6db814e0040b2c0ed40a082c84682302313861020fbe1a54c069c9922aa61072d9e033038e26ac9c608a2a847cd6f82260c50942b014e5050f48228daf09176881401a4aa8a0133be3e36189116cd8010e344b2c18e3b38de164343182284f547cf12dc912c70e48d0418dcc055e7c3b124803034b4c33b800195c7c23f880034cdc042c0145942cbc38a8684203425260240816a6f05ab08221282c70002db31738e175c0002e701125084a687900125e16610c5902238c24a42009c233e207283f1801a509303480c5d371c1b446143b15f4d059f1a2e8e0e509072e7268f2217b4052e412700026dad0cd307a4050e0e14034812c000d446fc608230a53800f193ce9d6c1175250000210151498606a3402d08196102660f129e8b6c096157c4f1061686185504b7183508a9d33be8003884f67810209480b243051934448e74820829e29b098c1151cac9786d081870c1c681085eceee1a204193888c112e101dd29f0008391a7379078c1d28dd2e2a90660645193e9c2061b6750e1ea42861331c4d1e501219000094f5c50c2c378d0e500417831c68b4dca32860dbae8e0050c5aa2112f136ab04697500e0140400701680fe848a34bd1027efc3800c5468ce08c2ee01a515c5fb8f0c291d5185d4238000c2ee0801938ec90c517730001045b5860f23b3b11f0620e1610a0e5c61b18d821421317737c310121f28821ac68a28c2ce6b8e28d2b666564c9392031c51c432880051680a20b18743184137364160041f783bcd1c10248cc614312473e045104055a6012c41c3088e145179a900ce82c6199830501d466aad1ca0c40589903060210d0c28a0574b9d24596a38d1db8e08d2356b0811cb430ca41820460617b323343810f44392890822cc61f39d4a8c012450e2d4734414146055810230926397c00430542404c18010828b0448e262c619cc102117000862342722439a0e706870b431c20848f1c43da1002b304092e6401032172f8d0f24319205002034af00026479b20fbf001167a8875e0471c312022091ad81ea225904e88e3031a702141c4088e26454288a3013df8f0d8498900194e64e248820163141511c3d352ae4b2a0e1c68e0448d6e051c00f18138e2984f50c962082d142006047810c7d008688862b3c3848900d8200e5801cc50410b227688c3678d385e176852441bb2a612c8a401870fbae81a10c705bc4803e90c38d2c0829c83840e30c1010f7477cf31061c1988810965a09098908405303132339e0e4f89f70168ef47b747a574aa54a7e33f8ecb917c1a4950b411c5b9bbb1f99cc5334cc11b5c569a03459b5a8967e237858f0bc15c670e14bbca1253910c454233198a96664f64468ee4c76f6cea8fa0adac11e9f6bc0e4206ba3ba75d2c2d8d2f58ed6d5e316777fb3c6fc639e18b3c79b4a9967e304ba30d3278506f90c695343af003265ed8e8e081d006096330c15cc22e4c3a7c804660030a2210f9a105076c5b5a7000954a0203a0b1a38c192ad9b482240ef010214700689c008a7b81110800ca12a015afbfa319a8d0024a01417628c10b106c41c117a9345a2328a307365821af91b343841e39502c38c00b68801faf7b20a1660003107880822a94b841edb9818881292a789dc2014e4e06c5872cdae061851f746033d0ad1b8244c7d44003edede074a780e54aa36662e83ef26e9619dd1dc6b744c791fcf8cce38bef313c8fba9ba65d2b9fced38eb6d98e8a39b9b2e2ee66d22e15096a74ccd7d6e617dd1dc5a5c26de97e9aa25b6789ee1c44f78d72a5bb4651e5eeae71a970dd35b5ee12ba8bba53af14aa5b846e0074bf3c275244ae5416a92d1ec3622d6dcd6dd67369dde619121fef6e5777efe86e1d8d2f2804dcc1c19f77281b34aa043d8e33b7642dd37d9bad04f2480f4b773b69172aa9f1055fb4e18b3ae0105007a76708aee5d876747486eccc5a8d87472cb26323826329883fcf1b82bb9b31bdfdcdb1b73b4330e7ed949ccf595c4eaa3ba63b498f2d33c9d93bd4dd30ad20df199de94862a7e5491ba15d9f77378f767d56748fd3c9e6feaab47c455c1f91ee26a15ddfadbb4368d7b7d48de4e9c54aefe3f09d6e1c531baf3fba8f7fcdc5b1b438ec37ddcdd3edd5ee2ea15d1e0fba1b5f30ac3bfcf2e5389d9c766f129ad7e9d53aedc6869c5757cb582c8f257e259a8b3f8e33ec6eeffe6adddda35d1e11f88239676b75b7d7acbef6def73a5dfc7acbfc37d7cffd48e6a8673a6ff65ba539cfdcb5369f4108d1dd26b4abd570793bba5b84767510c41fe9b439febcabb9dbac574bf3f4ddb5b9cfe10b7e2374f709edea25bafbd5aee6a2bb7576b4dd77b2becb349ce40cf105c3779ae9e60ded38ceee9ee9f68674b79276b54d77cbb4ab71e3db9d2ed2713a558a2f28da5c4eced972c28b73feda306777e7add1312748109b4dc8dcd121b213f64c51a74891504787088f91da2cb25364c810233d44848893089130cc09332e6f4e77afba5b854a75f7f7620024629acb952bb246bd2ce1464c4c0b55c48a151d3e47b90e9ea7dc8a164c2c87712b58b23890ca7f70201d5ebc5563e5070752d558d1e1a546e5ab1a1d56deaac9e2402867d5e8b0aa51d5a0bc5d879557635678a2891fbc1f5258b278fe43aa6605265670c2f5794c0cca6350aa9a6e1c14ca5312d329d5d8c2d2030f9f7f290f0231ed791e8b0a2a954ab15e522994b75aeea1a6a0529ee72914eab332c5f317f752569c3e6f6594b7bc856a5961b558fead584dab1a2a56642f354daa9ad6e74dab96a93e6f47b53cd59698f63cef73d49496bff81713a37af156d5dc9c72fa7ce59ea2a1d243065343c50a951eb2554d461179b2164af6523325e55e0d152b32564d534c4caf6aa8a0da95ec907d9f065a9d5a4189cff3068a91a1f95c4606957a79c192729917189a558d8f2196af9a583555ec3e5fd554b143390cb294a3645a340df47d2b18f71c8686064a6169e510e35eea8ba1f901062094c3d060c9e201a1fc07188052de32322f341ed0f7a55a3557b0bc78160782f19603c1b8175373058525071d500e5373a506cb3763830c4d0e3aa0fca5e60aca3f9f6142390c4d160f08c65f68b278402f1e4383e5071880603c8b0714e3311f8d8ca76692f8a021e5326e03cabd9a1c62b0b49cec00e4790e30fec5d0b850372a6faddc035a418b8b4a7791ad6a9aaad87d5ec5ce9b49fadc9bf14143ca3f674a3a408ce7d164d1820a0c595258b2a46ab4a002c30f5a508141e639694ff683e64546d56abdb0584ed3c4f2542aa663542df7427871c1786be579355358ae43870e1a1fab19a41797a199f198989729ac2196affc4545a3c3673c660aab66c7caf31496ab643b689a665cc6a7d4f858394b87ebf0d48fcfe6b3f96c666a56ee8355b3e4b3f9a6fc904df9e1b5ac084c4648083e5fb454fe990163444c7f62207145d6621c81841846b0218601b08881c41a44d44cb191b5ac9b3cff5056c4f48f29ad560c0af5c547841546cb6352334abc961779aa968cea93ad56eeaddc6375610697547b9e122f0c559107e3791e4c8debb3a1f964de8c92160b65c5125150ce4243c66279cb882e642a5fbd78bc5efee30400cc0c795c64ac9a293245627c4a4aa652d54c89a1c1a2c514956bd1e49a51e2f94c91ea45f5523385f5c96240c9f4f8a1e343c4441b9fb010e184159f2ce53121c888f0cdc82c21f3d21a4146e55fcba728f1c430220c19caa8a8e5fa6c5a2c57d5a4be14ca9b01c23714d35f0cea5badc420c20d99ea88eb738fa8a918c20c59bbc745d6be65881da9ee98938f948f54cdaadda36179d328f1645e4ec9da3bf53263543365071fa9f6dee193a56a3ae6a9bcd58cd1cadb61aa9c62b11ce5ac1923cf68ca0e3216ecb3694fa64a79a9540d4cd66a21799ea3dca301ab5f7c0aca539ea24175b74a05e3a81a989ac641ad685a4d2823940b71e5fb6c56ee4365b3436aca8f0f95002c76789e5a018b0be5dda4f2ecc958be429694aa632f9ef256938c0cc65f563035533cd9276bad9ce52bcf599e17842c6fc858de6243d6b2d619b214b8f0ecc9647c0a8bf5e2c3f3585eea25c6635a342a67c9c0cc2461b17cb0bcdd07cb572c19562b0686957216ea05e5949279a919a396b36a7c78351ecbf356abc99b82721f2d1fad9afe6c542c160be5ed308fe5ac1a9b15b0b8a8ec90799eafdc80a12163392b0c59cb5a46802e562b189f924a85f0d97c5e8dcbe5ad687c781ee3a53c9ff1d54c12191d3b644e2959cb734aa63aa1d5a3474c2a5533c5f31957cd0c799e8edb38333234543cd914568d0f1b550dcc8bbff4149895a76052291f29af79a9691ccf26e523c54ac192b08c18c01bb28e81c5f848f9141b94fbf052354a6c64ae83cc7316cbf396121b549337057bee4d59d550f1642a1aff6a609f4da308c086ac46d6620ce00b59cc0e19da734ac9a8ec90f98b7b49582c1f2bf77cac5c65236bf9cb94940ce623e59eb36aa6ece02355a3c44666234ba16a3e17c4c060620c800b594cd66264794386c414b297acc5408208d945f940a16a503925f37cca4ab5c2112e4fd63e54de3e54aeaa5162234bd5d8c852b0c669ffb650797f2d9781f5c9d0352b18f76a5031482aef1a274fb6fa607cb46a58354dab26d4e7c1f132b45acdcc7c543c59cbc7cc4bfb0c0d15cfe805c56a7d33a81a252bef9a299ecc837d21884165614316e3ad94f750f6649ed7c8e1427d36433e5e609cd5dd2e43c5336ad53879d7a06a863c5f790ca8f6f1e22d67394c8dcdaa3f30623aca87f4791d6b259fb725a6a570d99192e9d8f7b50362fa23d2848aa5541f52ca511f8dd31644c8509e12c01519ea073180786307aa89e5452e19fe3c268615b3638aca53a89aa69aa618a749cd14c5f8e7312a2a3b645885f4798ca7689c3c27afe5df8c0c312c7f711f543c59bb534ae639951d32cf613c3583b472568d9387a472afc6c99375cd14547f36354d29cf9eac4655931aa2e2c9520a889272961a5152de72317e3003d5a84635aa6d5a898d0c266b99b042015c543cd9e72894c7983025e528a749f92ab59a414a79cb5533452b57358a4649cabf1a272f49aae846e6d5344d4915adbce5a8192a9e932753b9aa4955d3ca9e2ca56243e5a9cf937d2e2313c209ed2b18e19aa27298ec734f89aa26e5e465e026543e928b6e3017d23c733697b34ec7dd4a7b7159c4319155c81f187f188a75e289731b014beb3c8db4cbcad40854712c71fe9b58e6ca1c7d9a397f5cbe8f694fbbea2b1746778337f5da9a8d678a9940598e003921a31a0dd26e1c261639cc86f6b7cc4e13574b5b29fad78ed0c67106d17c964e36376e313e69701c67682b6df64d33d39a669d630fdd57bf8ebb379a6b7a4193104d3d0de6d2ba78adc3f20ce94896a24f9aa9c3ee3b7dcd3337bfe6bb997370d2e09af2c61429a620d12eb48b8b66419f3428bef85f6bf6928e697da77adfc9de7c9c659d460e7ecdc791ea76638d626c497f5cc6a5bd7fab53bcc9a5fd1ccd36fbb5f492e2fc7bab3e6d6ae9983aa638267037e2d252a7bfe4ae56a98b1fce91b44ef1d4d5e9369b045703174e095c0cdd60b564395dacd36698c3eee739bae34a670eb4f7e9fd928af84ef4c3bfb8daddfd924a129c0ed7ad8b90daece293a4bdb870ba3871b29b95ee6e72de5ca7f8393ac730676f4cb714786314f484fa259f3e53f006be4dcdc6c54676d73e9c24769bf5a6708e3e1d9313773f09acd46fc007a98d7f8931fd9cc58ea78ec9d613fef5c731bd1b4e95fad7c417a993bda4d36844ed7a2da0f8f92ff9634d7c5c3acd1fc7f43174378576c4f773e538d28cfdef14ffc3b0c4b5f4c731896c5c6bbbd1bfef6431b5799de1f4c7318944f4e7aecdd41f97453ac992ca5f1ada25ea602bba4234ba3bbbc509b5743788818444dd0d66fc6fbb1617d689f337c85563a3c6a5c14a8d829ef83843bbc4557bea4a73f7f38b0eab25e5bf61b5214eb5b526d6d2da424be2c7e5a66c737f67175d7ace5e9bfb743c719ea97f5829f6c731cda7679ab3d9ea6e3053b7f956692eed759bf5ddd439a6fef771d91f9733fc9aefc671deaf7f73189e3af12fc52ffae398686680d5baefeacce189a359d10dde2a15eb63172d09acd62d0e539deff2384e1baf3a5b75d61fc744b301737dec5f739bdd1fc734ebc1fd3c525bb5d4fd714c3fb5ddccfdfcdcd88cd6d6f0cfcf38cea01fc7d3997c7c72e1934c7374c9ec47e6f3648172e193dd9d34a4b6af5f7b9ab91ff19bf83c59a08c5fe40952e63ed3d9bfed862d627d7cc575c30d3dc672da5e94c246d727718f764909039442fb5c86fff42e29596ae9929274df36135f8a774ba1e5c2a7286c342885b6b3d16cebec6bf486b856e2d987d7daa27001a5d0707e8ce72c5f4bfef839164ba241f1ffa5f0451be469e18ae2c3029433a05c00ca13dd8ec4c73d46a379c693f40feb7412eb0c97d03c96465068da86271b741e574be257ca854fba5b8b2cb040a55aa80fc5fa58ab5b430b4f9d8fe30c5de67ad2850ced7a829b389f5e69ee33f51f6f956297b99ee8743788cb9acb890ebabb6d157982944e22e06482e3f83a3c1d56df89defc56a9dbac3bb81bc7d2e6a14845c7ef36eb5826fe50ee7351ee7311c665eae4473267833ed7225c98275013168c3497f72669424ac294c7123719e26952653b4d72fddc6e92b3c7f3c75762c24433e961a2418319ffed5662cfb81bcdf993bb3c1f97618fcbf573e5ed4e7f5c7ef1718e27ce5df7474bba3f627a40dbace7cafa4ea3f9e398307e9ceb3b25617a619769ae2fd21991213cff17c7d434c3f0951019c233714b4486f0581dd337cd118827886e2aed04d14d259d20baa964844737957a787453a9088f6e2a11e1d14da5213cbaa9248447379582f0e8a6120f8f6e2ae9f0e8a692911ddd54ead9d14da5223bbaa9446447379586ece8a692901ddd540ab2a39b4a3c3bbaa9b4b3a39b4a467453a94737958ae8a61211dd541aa29b4a42745329886e2af1e8a6d28e6e2ae9e8a6d2577ba4a48612a9c414831e9e9d12dfe638346f7e4a328eb21053a3ff21fce42ec762b836c3d5e2f94a34ecbc921ad0f882949cb3cfd3895e7236e30185803a38373bfe2df37c9bd3702d674e4d34f1c7daac4f2fceee9bbadb87eec6d2dd01e8c106a4335a372f0f186407d4c1a93a7b6b383c71485b88da8534c5add29b976624fedcac41b198134f90f267769f7c9ab9fb34733f3e4f33f7b3c7b3f6c313a4f4799ab99c65aa4741f793702cb6c4e3c26524a43b877faf0d3ddb8add6dd49fde31f5c731f911daecda194d7c1ca695dafcbe38d212085f10f370a5dbda6a9152c67309cdb41655a1e3ac7428a4b8d29b9f92ec469294e1894bba9fd43126b896c470c4a5c48c8cbfceee673acbd96b9b854fe29cf09d9488ef741fbfd2ff1d0a31cdc562b87e93cd659e79e9c33ac709d4f882e374cdd04483200824ff08cbf3efcdb33d7210fb38e75886e30c6f958ab58c8deff4e32c9683c31357cb582c162bba81aba8064526e8a6798ce679ba8b8fc313576480ced7e2b05b9b638fef3bfd2dc217c4e189cb71aa96e2fb4dbabbccdde2f8b486fb4e48e25726992cefb54143e2048ac5f0b5f72649b2b65a746d9e629d46e3bc4f228d3377ed512c96af25c912cf3e37af0def6652db23fc35e0dd4cfab7cdf06e9218cf3108e3398632883114c3d00f2d494ee88010946e1c9e44954e5cd0cfcf8f4ff84d9662b1a737cf483cf314e96ce62984ab45379c13ca7396ebe35a7424cec711cd664e969c3dcd9cec067d4444c429169b790a899f31c5f7939a28619a790a89f3898e9a423b02f104297f5eb4414d7c7e7cc26ff2c3c427fc26d6568bc6d10689f3714d77e6eee7a99b91b95b75569c898ff187f692d5d299eeeb3873b555e8b538fcb99978a78e2cc5a2bf4ff479defede6eb2fbb88c74a340d63205d9a3712c877e7a4a9ff09bc462e13bc56262c63312cf3c45b168f6d786b3277397080623c659563a7b9ab919990b9f76337c7176673a27bad9e74afc97b457e409528aa3c5e1bfb83cc37324b253ce32bed4365a5bcb983efd0c8fb3de28cef52949c3bf3f3434be600fb803eae0e084ef346b9aaf8bc5669fa3b99617490f2e243780e2e7f049fcf7491b62afd4afcde13bb9f804b8a1bb6dedf2217dd4e86e6cef57f9519c3fbacd8e33ad79ae4f436ab395d8c5cf368ac3e1247336240206c1c1b9414a94eef04816420c31221647cf3cf148677e21329748e28bf5495c2e3521f5add2b1469762b15cf854e98d5e24231ac06591eac43a81c4c74cfa477c92a437e3580e4f9d4fb74113eb93e4a4392e539ddfa7e39defe27bfdaf3906d207e8ee27edeab1025f30d7cfdd1ecfc417cb31acb496b93efe4be232e74ee62ecec5bf730c5fcc3447c727ba0a9537ba5bb4e1ec455bf13bd14c73f49239b512a3808d22567a4929085711978b4817dd4d8393bcfeebf2d7fcf1fc1b56eabbd17d07ad03223e35f1e9cd3424211d75b7d192ffb911ff26d25b93d9f884df0487333afbf24b2a33118727512c26cec7cd422ab919959cf85528be3f9fa7483271985834ef4cf2b9556a6fb9b4333277713332372373e56c9cd9669e20e5ec86730e1092a4c591963a3b200f8eb5558af3e30cb1f8f546319eb83c939040f173a6b99c0dbd19c0a670d66c9da1e789cb3e719d377b7dd2ba3df2826411e7e392be204bbaefd772655d7503695710990652f15bd1b3b5d7ff36afcd7892aec3b344e30be6348576accd3e4f9c1c9c93d324629c6cc5d9345a326797e99d24981fd34c9fde9374b792ee9ee1a905d0dd35b46b2707eda5d0307437107672774bf191f0d5a003037cc1cff3469d666da2849c46ff9709a889165a701d4742e3f9b1cd66552db4d08223f971b1beaa4893ee5405525aa404900a42a13b059492754a882ba7e75a9ce3ca39a18bbafb849eb50bcce2c75a8dd6cf0c1788ebf6d806da85e344efeaf43a7139d7bf6fb351d1a7bfd3c4b9cd8ec5ffeab890e2740e739b2b15a71dc5cf617933ae36f4dd58ad630a4eb7591c2e7d5773f1fd6b9e6df53ac3eea01076e253f123394f9f798a8e7753374e171f535c76b14ec7e189f349fb729c4d6231f1ab0ee9c55ba5b87086fe77fa3be96ea0ee96c5d03d040ba2f105c9b2c9dab18707d4c1a989384f6f76c19ada05fb76c168ab5c1fd76442366b6f92389f68de99d4dd48ba9390b94bf4f4622d1abfd6890bc2f8efad1691b94b24ce270aa91851c909dda8adda207a337e25713e4e66657871de1bc924db71699ce27ca5eef639d2bb9b6b1271be122ecc3387a951b65669e9f3cc4bb74a6f13e337ca1687c959f1ecf3cc78b69be3df582cf719eff0acd2890be79de42cff384e7286cbb1cc9561d0add24a67ee95befc92065c982789a9d06e8eaf74032a00900609609062063010c38a13f8401161b5430b02302f0894518457a0ca57771081137c7841172cecf061c901688898e131c0135c7081a3831e49f42083045708e9200226022059c18a6685ee1e61bb5ca035bee0ee9b66e30cad028674f78d9476dd98d142c01d700767acf652a7fa428288efbbb1367399f39d38ff8ede1fe9beaa9ac8a14681c190fc20f19b2791da64db2f89295da46cfb25eeee350a0efe24d2d9dfc49f3585f3e6556bf5b2322206121f7fc103b9963674243f5e7f9c65db8f3371b42a20a054904a23e504eb848c45478224bcb8f6d30349bb5af0ee7ed156f7d88b36f41f6b1317cebfb574f1efe7fa1e1b67bd9f2b7562c7716ce3634782c433ee461f07fe4d7c2d4374379476b120d61a988a826449b220f7f12791d2daf5e30c7cc1ddcdf57386ba594c74b70dedfa31055f909cb99cff9b6b39b85a9ac31f471b76f3dce838bf0ac5b9b4bbb9a4ddb8426b568ed5a94e21f19aa5c513552f8fd53b3cd5089e0eafc5932ad228245229b0be564b9542795e93f081fdb547430a06af594754bd63a55209f962bef63c0ff511791ecbfb3c0fb5aaf2799fc7fa4650f2bc95c7eacf9b0151df6a6503e35eeafb52447829cffb60bc1e7cde4babbcd4877acf9bf279ded762f2f9f8bc6f95fabc1a7c9eb7fa3c1a3c123c0ff5b536a042b174782318f94468a1bc27bccf5b7d9ef7a166de97827911f2c9783f2d4ff50385c4637d5f6a0705f37ddecd0e221e0ea99d982154d2d7a9fea8f052289b94eaf350ad3280e702afbf76b95cedb597f23e0f075eeb73c1f33ed5f7a13c2f8897e3b53c99effbbe559007e4fb529fa78302634a68b5e0cdf030e153c2537d2578290fe5f597f4398c97ea8faeda695e01504db301af63e0c087f2565e8ae5cd78a825beaf1543793d28effb52fec9bcd8782acf63e9a47654d0f13e9855eb63795eccfbbe14a056decb97423979355fe979281cef25e6f35a2cef8be14be14be14301d5a8f67678abeff366522e54ea2be1fb3e6fe5a56cdecb0f2f46f5792a4f47111f5f112be6e5f36a2d19d6e7d1e0b53c0ff579298fc843e133f29df0c57cac4fe5a1bccffbbc9887c217f3b1521e4a85f2bc221ecab3f15e3c19cff38e78297c302896d74a799fe7c53c6f35c2178297fa3c55ca33f2c578a82f050f85fabed497f28c7c9f67c207e3bd78add4e7795ecc43e18361a1bc542be5795e11f77ab8d0f241bda0f250de8b97eae1bdbcc462a0f848c15b21e57ddfea63bde712412786c8f33eeff33c0fa7594db60d3b786ed48083f61aa260c38c1a68d6b08193e902063069811acd4483825e8a2204bf34cb68a528bc784289c622d110c5143792a69018964491c20e88e6093a46a2e8916364eac0a2480b667e14a181f188b4c0938308ad0b0288f81c0dd2e048018766c50753430116e63a2ebca005d6860a349751c149e0d15a0020a569aa22da5301e8467577efcc6c9e91e5acbb757a85cfd9a5aff648c77ffc3e2e5b21eee338d31b156bb6b6974577a7d02e15d0b8d15a4eaeacdd3515ace86e1cca28f8824fce10bfedc5b0368df41421324448109e1d9d28dd492e1592f005679ee26c6607ca07ea02575205b8925ab272c13d560f787029e08a4a25c36a01053ca4a2d84991203305162b025c492d791901e6841e01b8f25243ca06540a317925d31a6af5ac6050477ac0a83e70a5d5c59510a2f0f05204f5840e64587045d5e58a4ac684125c91c93517b8f2d243c7c73aa2ca5121914584981294e82115c4951d343b685038af9c568f57971e542fb47a583ea81d289fd6145750463b392b9855165750312b1352b0981d94979249c16086542fb06a5899b082594d9109412684971e2f23b06a40c9d1c3ca04d4961e54615c61614a2ae733165048c56476ac5e290f85830a4a25c990b0fa584e583e58472a117478ab18942a258342a13e140bd542bdc09c9042b198b078ec488279b1562c0fc54a0949e5a4bc5609281f3cbca8a0c2e28a8e2c7878ad523e5a423da458d043cdccbbcb1c3238011a2130438c30cadb5211442401820149115bdbc0410e10d78e160b8a0d48475dc83843042a0ca1b384123130c1021394d1010c48608b2a72c0169228f310f8f620076ea4418233c080c00e3adc10c586274847320ca9900209237851811db660800e39cc5038c1561574b06005547257baccf1031f448142c2082f1374800319c0800422d080218418c0ec861a9c201d15954106074060812588528082323a0006062ea0802980f021003970c30424c0c005bc7000962b2f162579cdb80183355820061815a00017571451801767374481e2a428c991d8cd6ba60c32c478a28922b0bc78c30c4543498e340cd628830c0f70a00214e0a201571821041629331405e1c5507477cb43c0d211521153d0119319664f644638d656697baf1695576b763739afeec55a839c57e736fb8b05820ec23309ff0f55264a348c740e19312d053d49cecb84eb374da6c7f7c59df8473b71e6fa4bb2d78a05150fbac5faf8950283a92828dba3c74c6a91584b3b94ed51536897e437caf608ff0f2d65dc14da253abb84299748e2d7ec9138c509b4abd3c85aa657fab1468bb23d121a6bb332117f48acbfc4e4853aa1bb73e1d3eb9ba3bb57fdfadec02f8ab0e46f77e24226affe21471a7390a00b1a75fed0a54a17dc258c397698155d5d5273c031c70d6230070bbafd49a438ff3687c1dc610ef3d9675be7c8c196930b9f70e440a25bc542374dd348367577aeef2452db24288e1f76f8012d8ea7386e71cce2508a23280e24dd2d8e96088e379a964b92f64ce078a2bf5a1bc286e0a8010e9deebe51c734579887b19c1c9c8373e15369ab45b2794b992c173e0902a2db23c000babd2cdd9e007ef0a1dbc3e205c0eb8187eef67eb0447b3f00a24bd0860c2698800e0c38bafbab512436072f388206dd8daa8154c282042174d94177a7ac90e28a240054208c22ddedc1600414242206f08417dded015103156eaeca078beefe9624810106400001e207dd8d1261083370a0c4125e88a0bb574c18e00def8cd81c3174f7b7460f8ab01287122f28d2dda92668ac03e03e308505dded9d51e301234a01a8a800c78636b477f623699f9cb79ca0110669341fc79aa758a9cd6d762934bc4483e230dacc9ffb6b83c025da5f1b043ef8202565e33883c05c9295d2fe872c138dcce5bfcdda2a05df06734aca9270f966f36cf66fdbdd313f9594947d58ed11f838269066b3fe3228cd66e0b536d7e59196b519e4f7b38d49fcdb6d3281bfab937e8ee6dcb5b6fb24a69846c3f86b89fd9b66aeb4b5e9a2d73b7fb496fc26eb54a9c5e57f7fcaf76f0ea7cd792c276c7a4df25b8af5ede8367b2e67c3bf450ec3239d36f75c922ed6398ea5ed45eabb3abd5a3c05fc4ba3f9cc45ef629d34d79971a5d331a6d1829c92b2794b19386f391d97a9ce62fce1572f4a92f92cdb1183e2e312e75966d86e9cb794f9b53611dc653a4ed129399de64de1e3823068b3efee7402871cc4147f9d94943941022939fd7ed3b5ba99cd66c1263cb3cdb6e42025e7ee9bfc05d7cd4b47bcfba6d90d0ce9582b49173dc91259d052b561bd657e2507b1d37a6cb9a4b948c7af89ffe0a44e2e3eb6e4d3fbee9b1e8fe3b4363bfdb30c2efee31c601086192eb8010656c4cf65a64e60d083abce56256bd8a09bac4c320de9483e2559238b168bb02ca4a465cabf7499d6105ba433697ca75f425aa63558c04b3a3b8eb21714e00540bc40872f9873edbb608aee98633c497c419c5cf894930b9f726e95de66c6f83ebd77d65c806a410f5a0083168c819fe6fba4bda4c33ce6308f6198c7829c7cd3646ac196ce854ff2539279cb696db568a9053a8d8db420a5a459e8283a8a1acddb1df162f06ed4e8b103eae0646b2fced39b3d5aca9bc9783648896203141b6ab0a186274ebc26292f860469a8c0ca0aae7437181e79cc63d2ed31757b4bdd9e12a6b91c8c694e05600c3d939087a4caee49e754667ca990b6e69aa650dccd861a9e3869c28469498986a423a3254a6620926128895010902c07c4817579c1851b1b202db0f063851a9a2eae420a289ce0c384127a903042972e5d6c69d46033b9bbe1113478496984d0dd3ce814a0414bc1165aba1bdb7acb140c718546734c73290853c0d4ed308f257523a1e08c06230e241e92062630861702cf8c1390d17d63e33a81044eb044b7fbb8833f8a7456ad5f6b433ac188c53b75450071029dee25345ed00de289f35c27bd38681c6750aebf143e41e30a5149264e20348ebac16bef7d9a46a0141a990b9fd0a0bc68b3599c17e7cdbe9b4d56474767c7c6adc50539f821cdb6e6d2e6bff96ee6e8b4e1af338f658ee29affdb1ecf9a3f99c369c346414ffc56297d9c1307439a9b7527da9bab0d71953998e9d451fff2666b6bfebb4c71269ea157ea47be5acfd32bf56b6d0e0e09326408115b5d67efcd71ae74e2208de6b42624daacb33e2e3becad2e1739683de339667ce9add29c0dbfe6365ba9e3545bef8fe3cc61d8e799a3193fce7d272bd6a9b3b5e9ce1c2eac5ff3263629968409e9c841eb7faded2f4d7c9adb69c76cf1ee9bee938ec591d4d1c86964cbb852da38ca1c1401acbb8f84808deebe61a41078e1e1a07139e5c80c43e0138256dfd2e6478e886f460accf802bc557a0453370389aab3b5a93231230a3e3203d695491971883f8a75e26a59b32350195e3478e49becad796efecdd89d9681a5db63e263260ee2a0275ebf512118227419a9a681a14ea71f5f8996ff46c6183895c664382a3a52923921c389eefedb246d4ec695ee2532bebbff36491a17193246414fdc7735dfdd77a2e38bdf14522610a8d17d63d36473e1530b36b74a73e153838e0be77bb5cec4412cfebc74920ed2dee6b52636699c8f6df4be93db2c8ef6d2d7792e6b78baa53aecafcb99debf5ea94fc7ef747fc9c7a8e9c6417090582d10168bb247458907ace8fec095ee929c8ff3d8071ae3c2cf391b823939314ce68cf37c9df423e2dfbfdde8cdb77c278aebdb5ef4e9011c808186c7709aac05fa2a74e936939698c2778ac576dfd4ed1d898182ee1edf7764f0b74ddced1905f9b07e49e5b1cf6e6f098f7f158a47b2cc3e69c4e8d1f882f7c9f171b3fb334cf1d7bf794a40f1a938d874adce6d763cc56df6fb380c0a74b7c78e90966640b9c2d0f198cdbeeb6e59bbbe784007cee886814643f34afd56edd5b9c3f0d3a954ca3ac0a541daac5ada63d0051df841b38657e41175b7ec691ac5624c18ff981f73400bf8b76aebad68de72de727280724086ee0e6b79b3c3f0d39c9fbe82c186a7058c2b68d98e4b4134c78579e6ecfd2a164f116ba000f3961387cc854ff9e971f2d3cfe62de717555c5fa836d0830629a6b617dd56cf2fbaee8f9c0a22a070a3db93c11bead4109d3a8006e2e8d1d90175c01d9c6af194d98bf7f1e3717e79c7b19cb79cf39613470342ddedd7fae0840b763270465f208a05b45840477778ed2cd777caf59df04ca4b6492c06f373ad11935cf8e4cb2f692073e1935fba1693b999f1e728d38fc3967cae1d1a6b731c67502c0633c32fceea8b22c5cd283967248ec56ce3e358ec27a463ad4c224999658ac57e389e3e6f29f399b79ce2b521a662adc4657abb9f33d5e5bfcd1cfdb97fabd436236fe44867ee9fe8cd33577bdd386f3feee648622a52c9893f383c8972659d3980e67280cd3b0e5303d81849b2015bba41f72a6b0009860db0017d4b1877bab885882d3db7ccd8e2b678a31b1431b5475b58d1602d2f1d49b2c45b3c216f95ca18f006c5d94bfa6e64c009189005ace5759b47aac3d4936e778e5eb363cd311d1960433728ba3d6240cb8cee99f8b99cb31ccefa5a68e99e798af9b5b0a014da4cac8f67562c7153f8b8f0451bfefc8c73666f33f18768de49d666e2e3328b20b220d2e0ae06fbb7398da499e636eb30dabf8de6b27fdb6c9c34df1fff6db3c7b3f66f9be1728a387f7efe878afe6db36a292669d67d7d9a39b1da1a1659baf3632c9eb41df10c0b9b6e3c670b7863b60033dad6660b98e5c70b78ca95cede69feb800a2eeee05a8004aa1cd4471cec46a6be268299e5dc185e90a2d0d8a5fa99df2d4dd2dbb22a9eb153659ac16e88a96155ceaf45dcd8a1cacb0d9cd9c8378f74d8fcb55b8816df6714c558481757f5405194ef2478ad3b9ce8e551055d143016cb402b810917fd74401318cb3a4f28ea9a800d7fd3a964eb5c8eba4028d6e2aac681047c5152a88ba7fc9146ed8113b06d234e9144bccbf5324555bf35d58e9d1149e0037442ad61926a08bee2c097892009b592e7c928207331c9e3829b6808e7d4e5d92911291579914b4c638d36a43cf52e8b414a906714c516c016b25f6718ce24914ad06314df79546739ac5e968e3e31c6b51a3c9a985020d4aa1cdbec992e2e37286eb6ed0484b8f6be9d1b74942d1c5c4a58dd3aea5892fde19622a3a14414041830206016af4dfd2f13b8d8f738fcb30f13fd7796779f36c2b2e2c976a89000e20207737288eb63a25e7dfbfcd240400e009347637e3fcf55ded9d463b739fa3394f9f61a6629d932c9fc8d20d3addc7fe65a5367bfddd48efbc96cc7d7e22e9891658e9bc394102f04b9b63ea7f9be457a14bb118d3df26e90469674e1c815268373f7d75fa4b8af57f7e7c8ef02d6d0d77a35f673b71fefddb4cfa2a14fffc7c15bae4b0af4297c8f9443e3c4198d85c8b1cd65392f3715f852e653cc71f269ffc4b4da89838a35b4a14873131056814f48409209888d252a2b8481d4a14d028e889db6c99ebe7ac512cc6a4b395899deec7b74a7178128de301cce8f2a6fbaaa5c103d0aafd9cc507d001c51f0fd00dfacd5f9bb3f1ddd725b6ec1e97fdc87df1dac72d41b3474bd88ce30c52820d9d1d754a6c69dddb94c8d2e0b5cec3a4440cb67afe9dc3646c38a663457225b144cd3390ea33571b166957124f1a749b6d354a62eaee8b378a65060863f4bfd30047e0a7d7ce7078e27e7e987cae1dca48b0b13343a28b7e248840a2a99be6b1cccdf0bcf6c727576ac9cf51a6fa38dd8f6c9c4ef692e4ac74e68e08a37b573b22cb114347342ee7496f9ee45f98f846a8d10dca8c58824e5214a7114f466c44cb775956041afdb70822ba7b1ca7db78bed6f3635911b4069bf09415d1837da9881e0d625c2b31116c74579dc5a9954b4498f1f4621222b6341311b8eebe3627063988dd668d8820ea06fd714c2e22741a147f880857f710660cb1a5dbed11113d04d9ddbba690e6a52188848a86b0a143b8c0eefe6997101cf0afd3f12dc3d07efdf9b999790a39cca656e2dbdf99a7108689c57e921ccf588cc9e7a75662dbec69e60ac0e5ce44712e4167b3fcf8099442136701920a60d3a014da9d3f860568815268ff6a74675a5209a28b20b27407410ba2a756d6bf41d44a0c041bb3fc18082e0d4aa1cdc60feb0c813062666db56897adadd21ffc348d1c76f3e33383c3eebc40f8269653c4f1e9905884c5f1a9eddff67f6d36e72c9e11008dee6e026c49d22e02d0a88d13a045c5bfe100ba18c012e00098449b07b0429633b01d3d97d6ebad52985012d7d9f16b9ecb1ab6385d1620b2f490bb8cc50adaf0b167c9580066d462ed1240966e9b6d5c14804ed76a2f3a8c46f35dcdc57166cb248056ef6a9e1fb3018aaf9bb8fc43170de64a73ae1f48f0e65aea34715fc334f7434f37f8d7f6430f507c3c752e1fd0e8066f7ce802147d20fb451f27cdf57d206a9d1d817ce8318eb449e7394c58d4103f372b162de3c4998ab4a44247c7427683b4a1aff27f6d5868581c2dd1d334a23dbd6371b438b759c7e2c2f94b0205408d066f14d7c41500287e2cc5c785d86f4e2efbbfb699ee6b2cc6f483d3fd30f9d8909604c0069442ab650f6fe4f9e26cd64318b8072d0d4aa1f540768f7346fe37f540d4830aa0141a9e95b9799fda8a9a42bb44a417dfe668ab5fc55edbffb5f1c0443b919df207c7624c3e4f1608cf270b34ce9087d6bca2c638ce5917b84c755796b8423ad11767785e21eac68579d6aed8804e521c76ede0863dda218cdd3729edb044834245e2916b07a1dd37f9e749438bf1cc51c74032758b1df64e747cecbb5762b3f69278f74a6231a61d5cdd9d1feb3083dd37cdc6c9c424c6624cd6568b74a0b50e3ddda14c871ee4d4c97260a3bbdbbdca7208a34bda8b368cd172d0d2dded38d57a45ca21c89503cd3aedda209adf429a249c373fbddbec2e2b5c1afc4cb1c5a9b6be48435a2eb9ac5ce9719c56fc459d1dc78943187dbb25e9b74abfe6397bebdbfb55702a0e51e020a5bbc1bf65f824cecdbafba6176d8877df542bf1ee95fcec5e49ee33c5018dce8fab6cf9db2467e47cdc2c3fae7265d67467ee6f9527fd446d7f4914da5545671c69539556f76e0478964b9b1fff30913627c9f59dfef1c491f8ce3cc50fabadb99636c8f64a78de241f567b148b318d5337af88cb5437cb74cad38b957e6ed65cf824ffedce2c161d355dabcb5fc54a9b6ca5b34a73b94edd6c861f4bd1e6ee5f3b65e6663f370ee30952da585b2db2b64a672fdaa0da6e1a25f9b1565aa1719ce1b5347f5348f3d3cce1a7997b277a1bca854fd8e66679cec44a9590bb3cbb2fd6c74f33278448592de571f2c9854f62b1204ee20b65fc372ae692c4e1f943745f9c8f93a2c3238527881fe929a13cbd58c5229953093f37363eb9f0492e7c72edbd8f148b65fc798eb1582e7cfa9c0d73697338717812e5c227229dfdcc6e95ee2689ff6d4486f010e1f0c4e5b148a4b39e721c6798b10d5d99d62016ebe7181accf5b10cb37143cb854fc4fa4bb4cf366b53efeb1cff0fb9b018f84a83189798b419fbe7e9c48deebe5d7483d787ab33a99480ca159c690ed34a6560a62efeb5d5e25e87278e8a50f7540af895f263bb24e352487c9d156b12315e6190a08bc2c8407763b03e4d23b05aeae5d37cb599ded23a4d9b4fb78d8fad90c7bed2d17336670be4a0bd5f85fa2df3df7633873fac7fbfb4bb252be4d74e99399f4e965e9fb4b1264cef758bdd8af79d5e67891c147f5629cdeb0c61f67e151776e338ffba602b721a24a52436f8918c88c9959230c99228c9e049809c6989899183f5498bf2008d5bb1e2e23b921fb762c56f6cecfd2a7f6dd61d142b6c897a4923a7d1e392b6bbf3458a6934c7306cb3d91c9083349a97b6861cdc679e420e131de693a3b825721a217177c7c1dd561a8de6497c0507afcd4e3487f3c599712eaddb2cceb4965cba70e1a2bb4120403c26d2190cdbfe3a9e2f74abb436c5fae4539224f8d6844b0befbe09036980bb6f7ac16962d1933ba6dd2bd97dd3a4554bcb7f738cd361cfe43785ef5484813811bfbc551ad29cad36fcf1be58b1933dc2bb57628f76af4414128b64f6c88b1a647bb1173edd5de9c40529c562b399f84d77e65e49f7474b15c8a1024c92542095d433646989da9aa683634dcf108c6bbc67c8d2cd81d484c06fb24ea1cdb524caf8d2f2929ef18ba3b571f2bf29e7460e62108b75c6700bde14da11c8411c49fbbfd656f38d8d3f1ee79083349e20258dc644a3d1b01d6dcd95eadc466937b01f269f6b876838fc366bb398d6890b3fe7b74af1dfea3bfd88e338a419d39092329f1b1bf769e460c67474da0f930fce89f3afcde23c592007afcd7d0ea7529f4d6cd268abd41f535d91e7d261440ed2684b0ede6020391b77101bc172498ef3a6521b677207858a423ac771067da658a8daa31c5aa622cb84c5ffa3cfcda3f0c925950faa982337b1e352b4470d48bdb6e0a0052cd832c6160c6ce962cb165b98d8b2c40288e826addfb06093e3372cb8c358f018691dc682db380cbb942dbf4589c76e6c261c5bacd1e0f77dc003282bbed802e30b7a2b0660e96eb08650850e06183538d3c28916ecbec977f26318edfe6dd669e459c043e213a38c283a25a802290b57d354ea3b58f4008b2b5890516e941ac516a516254a949a28505a342d7015b300afbb3153fea56e2a8eb86207bee0fd719caf2ab8780aa3bb3def9fd4fc2577354f0a177c3aa8786a0a7c13e8e24585f7ad7a8f29ce68a19ea46f3645523bcc1ee52a9f0e9e145d74f79304dcb8bdbd885f52cc80d314cecb443493b50c5e5178d1af2858dd8d6b798fe01f7f9ab9212d41344b8bd0cb0b0a1534a63f3ebb5a1288abcd14f623999b4f3fd628ae8fafd5797d6c71a1dfd2d6e020c6659e7792e4f45274c1054c75d31fc8412c5a7a9ff49fb5127bb564e9b42f6fa6b9cdafa4542b97c41745d938522541f9979c2081135438f1e44df149a0dbbb3f08e05a89f1ad5298ede9c8c1dcd33472fcf749d0af509103c97da6365a2bf1e71d10789f0c299e40f62303a4653cc39b6a69b6391f6958cbddf84d74b4f11badd9fc4e30fc548681c070a6379b6b6a25ae19e77db2c4b8f0b11be08a0b5c0912ce1324274c8efb9ae72217ba76a8562ebd1395e148fc1f123f378f6a25111daf246470788e60002edd3d1d0803e43ec20042fa0048f00014bf0924b4bc137d2171c9f9b858ee08398ec872c453e3f0247a713e51bed6a8297c9c113a7417d183226ed0ed450c203fc6b512138105880d922f02dded41e047882cddbb51879c19e76816420d21c610620c217cfa650351bf6c28d22f1b5ee8970d3afa55030ffa55030efa55030afa55430764420081ad5f2068d22f1000f50b043cfd024109fd02814cbfc668a35f639cd1af312e30c616fd1ac3897e8d91a55f6358e9d71863bfc660d2af31845ced9af1d12484f0fa8106fdfa0105fdfa618c7ebd6ee8d76ba85f2f21fd7a81fd7aa5d0af9708fd7aede8d72bd5dd31ae18ef7544807e1de1d0af235cbf8e6ce8d71152bf8e64e8d7110cfd3a82f5eb88847e1da9fa65c4837e19bda05f4667f4cbe88b981d4ad8f44b89987e2981ea571272f42b8936fa95c40afa954408fa950418fd4a0202fd4aa28a7e25b144bf9210a25f4960e9571255fa95c4ed571253fa95c493ee1ea1a563c6b503a6c54501fde2c244bfb800d12f2e57fac585f68b4b947e7199a15f5c8af48b4b4dbfb884d0dd3a7690c043040b3ce9970594fa658124fdb200d82f0bd4ac48704008fd7280aa5f0dd041bf1a40827e35a002fd6a4016dd2d038036214545bf5249f42bf5d4afd40dfd4ac9d0af1450bf5244fa9582f52b5542bf5233fd4aa1fa85ba41bf5069f40b4546bf501be8176a02fd4265d12f1414fd4215d12f5410fd42e57ea16afd42d9d02f1452bf50423b4c50c1c88ca0036646c523e65bedd0ed85dddddaa2bb19d0fd69f165d1fab0e8fe16d0fd5dd1fd59d1fd55d1fd29a0fba362050388f2031aed9ba2fb4b40f72745f717c50745f78780eeef89af89ee8f89eeef00dddf12dd9f12dd5f12dd9f01ba3f24babf23ba3f23babf22ba3f223e21babf02747f41747f40747f04e8fe06d0fd65e9fe04d0fdfdd0fdf9d0fd61e9fe02d0fdf5d0fdf1d0fd5dd981d6e113ee95c51b87a7d34b0059082000dda06de629baf0c31b3b7e786a115e3f78f717a381f1013454e0a941835cff6f1b5888bafbd381fc8c2bc54e5a260b6c8146007e08a00711e09aac9de8c1e6a3e1c1045ded51b65649d44da5d86c768454b4a494a4c92c890c322524a6a5d92cf625155acb586c47da9bebcfe6cd95c63ea4170fa94ea234f314b2b65af4a5f0e55085e2afe1cfc1951f3c5c78a179b850d33c5ce0d13c5c907959ed6006ae5f3bd076f8d11e7be9c0467b4c072e3c66c5633a08794c07996e8fe590467b2c871c488fbd7210d2edb11cda63b397952fac10e1316ce589c7f0ec170e36e86e1cbaf098d82f1c96e01082c7aa6ca9f2d45584ba3db65363f7d4dd829d4c77bf9ea600f1fdfc395b3d264ea0712c3f1142987d37e07f9b942f8a37c793bb3cfba0d850c313275f13ef99302d29d190847494fa8cbe25392bddd6568bfe8784fe8730be4fb319dd5fed2d4fd131f17755e6925ce62737419e6db571a16c138b85d88d1badc5c4c744f84717dd8d838be8f6180d466eb3f8b958ec8561ee1c57040de21bce39cce8c2ba2b152710952ca830917be2b1bfcd248c9f2ee5c7331b12ae954b3624bc7b25f9e98f6c4842d70eed5e89f819cf25383c8980f48bb46912f5863da3db61652d16c341b74a31939775b2506c9285757b0c5b5b2d7a551b3c4e64c07dd510ba4b31a437bb648b5c0b721d688fe570f876e703723edd6d45374d02c608344d9d3c532830658bf6e9eec08d4d93752b373387619b16ac38cc66f74db35d6d860bef7c3cdbdd59690d5c2141e2b70c535820997792aa221cd6c7396ceaaeaae645bb5b65c30bb7a5bb6d3fdaaad279e16cbd9be392906ca809e8ff4b6eb3387499835f2d93d0e3b2d531d9ac2ec98809987fe7d9d6fb3ad0411c3a16df696217eb9c769c3fafe7c6bf398ba9c3604c75fe381db44dcf8f415ca6b890decf3d8ebc554a736129da2b854683f239bb44734cc72a739046dd6178270e7eb5590a8d06c556b751b7d9afe53ac55ae67236c436d47d7d929244082928169b8de3eb623112439102c51ff73a87398ebd397e277a933938c58973a553f775da7162f2bfc94129b4266b89826850284e2d87f5b178adce6b9183758af597b858ed91b894ed912cdba31d90f84998246ba075bf16dfcea7d3ed3d9aa65207d2fd757982a4bb73ecfd2aa8182756344e4e77b7c0cef573bb11979676b7aba95f4ddc687cc157132ec026a426567437d957139b6eddab4908ddfd6282840c4b7437be6251f864e629f423492f537efa236bab45d98e4ba3f837dd1fe16ba990488532a64b70781289d50205dd4f0a6b696b9505656c89ea2fc1a350fe25910a653c97e0dd2b1175f6c80999bb442fdaa0a5ca44fc1f124a2a7a279ac3598b788230b14ca20cbf48ef7d27243227242ae1b92467332e833099bb4438e846f12be905ddf8e9508e2788df2a1545cfb4967e9fc41308e409b2fb26dacd8de83087d9d8d8ec0b2e84e698fa38c5e9758ee3ac4f5a9d5d629fa6d1addaebc41eddaf3aa46c8f6ad17df1222de97ec85aa6237b24be510c8fe30c32cac1e8a67b06e2719cb512efc851b4b9feeedfaf32abb63e65a60fabad2926dd4dd42f25354a80503245b4375feebec9e635030ae6d3d7f666484245e055d4ea9e52e9bc932c1224c80ec53b5c5482a25944039105ba7f360bb2f76da8f6287c72a929fc27a6970c61bc864278c99034148139c31714c14886971097fe42f80070bfeaecc7a3fb7b7d6e56cf8beecfb523777f3a3c26f0bf6de69de8adfb938981b9ffbd8ce30c5bde37ce1fabefd355f7a7eafe52dd1fcae925dbf29225753fbdb986f4668ff9d8747f9ff77597399468cf0839dade9ba4a44167977c9e4236a45c2289d6caf0636d5a5b2daa9666717c3a24164d3abe688df0ff50fea51f6bf3993485365f3b4e7cdf895626496ec9847ca2b2fc4b97e8979694762510517e4a72edbd499484eefc31680ccae487a1ac3e8914a4fb233277895ec8c938cea0204eb1582e7c12a4094f935cf8c4278b4f0e9d0b9f74787882e8a69258f4f4629daf235974a710f0e3e40c67baaf49bac91057b7f783af7e7355c40d4f563ad4467dac2b1bf056edd5e5cfd9250771adc4b8b0ce0bb4aa82072a05cf07291ed0f4a0dbe3418b9524da3a43b7b7836e4f075e0eba3d375e90c5ab67cbdfa97b285e3db9d2b109057a74ba5f45d8006b322f8a12232d71d98f8c93de5cadd772e50d7d3a7e1c2e497fd1d699cd95cec4fa217ed1ebc1a3001e2bcedde953fc6b8b5eb44740424f2f938b75deb0d258ac962b6f9037c548272d9739dadbde09c8eb88b4baed10253a3613478a0b63dd5e1ba91becec803b38e13bcdecbc84e01b9bfa23121f1769ce062fa88117af205af0053fac8ff1cf68d0edcda0db63a3db9341b717836e0f06ddde1a2f60c02bc84bdf5e3c622e73af1e6ca05f3dc8a25f3d4082041e9fac797c23340f4f8de6e14da0797850340f6f87e6e1d99a8797d33c3c1dcda381f002102f22c216917e4cd4001fdb31f4a7fce58d8ad5864e5a3b3a79810127a663e8432f3078eaaacdc759831416e86c6dba3ff698c6133e1376e0c1bc200f8ef6562af040772be917900c747b2bb039091b345438400a990eb4a78234ba3ff0023d0528e85e22633a42b2a1480989c869464c8e664964902d2d25319a0929c99c2431993d9119d18e7088ba1b07088e0a386db3c33c96b3d7864677bf605c6059b4c72c4ee7b0176c00b9b4301b6049264ee7b0d9db6033af17e678bd6083d70b6a78cc676e86a97bccf677e6b17fdbbfc0a53da684a4a494c46968687af4eb051c5ea8f202ad677706cbf198ed6f0e2e47f296d861b3d70b3e8e0409929b34ba5b847ebd90ea6e17cc70018c970b5a7a364e8fe5a78779ec5669a54ee5a502910b3474d3d4e94cf8829fc929ced92e0c3d763386c76e127063801b02dce06e6c1cf4184db5f48166998affea974d19365fd878e1b110367368b23dbd6c7c74db8a2f989f7ef6793ebd198895f6cfd43b41b78746b767826eaf0424e8f6cee8f646d0dd2911786638d1ed95e13d78e7b536d8cbcbcb0b4c9d400ee6c7bb7ca968c3bf995e9dcb3c00b42003e22b8480065420020960a1067cc1fc39f86fe2db17986ac53aeb8f9ee71cef3b217995b5d7f3faf1842f28d66f0a676df6f4e61cce6b8535be7cadf0c323a3e60b5014a78b3f8eb21a276ac8ee063fac13e77e4dac46a7bbfd69e66a5078d5b4ffb8c79230cdc458ec4573a3894213437b0c5f3067168be158ece54eb41c4ed443051e74f74b85047483b9cf45399bebc425cd66f882393c75e1b4e1a8c878a530834c65af14a2b0c448a13d0c5cc0025e3051010a4ca00b4f021160e285824c9fb0067e140daf1370a0d162b1970f2f14d0ed5111c5cb87f83261096f8a6e2f015e025e2500d17426fd0f81d86692d291cc4d1a4d247365cdf3dfec9283b93eb678c4258d46f323372ff8916bf43fe42ef80bfe6f9bd9381227699ee51f8fdc9034db84e30c6748dcf38fd70e794e8ec3322e2f8d4673b0e6b01b92661bc7d98d778e3457cb8b93abbd361a6d7e0e574be758defe7aad96a4d9e7cc35dabf8d86298de697626b6b489a2f75aaf190364e24da7dfa6f7399e30be6c2a758acda5cce86338c5f224011c1a71be6317b8794fe3693c42449e06ea4e18fc57069779ee76ea4b71f735fdeecea741bb5f1bcf4348d40f1770f1b6748afcd98e2bcfe9d614572b0ceb00c6b37368b67c6a0149a0da9fe92a7694483e2bbda6eccb81b1db1633ace1c9d4ef3524cbee85f5a7b7399e7e8df26693379d34dbfb14962528bc4247bf4b799648f94b23d7ab9cca896baaca0b5c96f952abd5cb8eed6d1c4f9444bb4974bc888c37f875eaeaf5b8cbd764cf12175baaf1d3f5e3b5caf14976e8fe988a3c5a2978e307ad2262f1d4874bf744c9e204bad2348b7c79c689e475876c1d7cc2de30b561bce5e321a78c958d1ed31b1d2265cde27cb252ceb2ee249114592974c949c0c2f9910ba3bdb117bec15d305be6093b5b8192e717d5c6d681d673be2f9d7d6dd4f4b18ff154559198b8554fccae4053383174cae2f18cf09e29413a9c3a894506926c21e069942ce8c8088000000004311002038281a8f070432c970ca6dad1b14000370c06a964a9a8ab3288a29859421c41010800100101008266100ca7d2e0008c6c615a6db84a223edb368de7b45f8b296ad0ec8b7b743458db2fcb6a5133c21b1178c302040d4c88a0ae400110f1f3aab46094618b28b026d0eca6372e391f10b9ac015cc7a8ef9ce51da15ec1e8a098b7023594823d3b91a1e23626cd12c0d508930e9fd2ac67dac30a25362b87e3d3cc6dc0c46590fce7e9230e2b911903e992c790d86e4fa1585dd83c6d9c95594b4fa31aa2d3da98eb7b140482b41871e30f399676cc35fbc358883e8f1d066057405ebea40dea04bb14ebd09f0bc3ba5e0994c1f632621ea13f0d0d0e8470edff4068e9b71505fb593b1dd01e7f151532d1b4642f7b6cb5c93c82c179ea5983942c6c485515f0c1c0a6c1399622d67f46241b92db3facf172793c578b8c4eeaf8a58c0b27e236eb704cb0053605a82a61bb6d3db18c9aa3f463d7ba3738abc6fe5d50af6469fec7523c85cdc0f95d026c2990fd9a74211a2c55098692544e2513e2bbbe2bd4790ce5c6926a2810369ffd2b65e011d429105213ddd690d064e90962cc35ae1ebecc217cfc77157deac1387f5e22d03b29b5a0c3ea03a50ad3fafd734c03518d6634a867ce67104992a46f04b295554466ad1bf1e48094188e821d0e43e1a216a8900888e40bd5f0e7e3531262d3a94c9d88cdfe793247e7676f755b6ff26fe92b235133d322596bf9bf8e230ee269f7c6b23e20edad716216f65b100dd92596fef4fc37018967455572818948c2168ee7098b964a976828cd36f86ef61c71a46a61c61f1b2e17d12b53df679a2e35bb046b3797ec4eb5bf6a39f8276e20a36918a7d12abc9c43e882982fee05914d01064d85f66d8e04583873277df0ed1be2e1be539de67cae4db8234062e5c773e6292229d958fcc50485b24cd89753ef44f0a2348941d5ed10ea5f0993f9bb2b0c1ac12a281dd94cb3c26050a8a5f15ad45c84bf54457d8b452145d53b56ae8c60b028ac67b0d49ee06678792f29e0e786b47b527c3226f671ed0cbdbd69488db71d09908318b3dc43a17908080e4c08d0fe3eddc8d4d498481c7fd00a3372a339ed0a01d713f4c71060a7e6ea826f4515ddd830abcf443985e6f8b6a0167bc42d0666698b5323615f7573eeab5c342b08059002b8331d44e3a0b0329e309505792d4b805b89139190202ccfaea94798771483ff336a93625e285fe12745f9f66e4875656b9804a5ae74fb7d47b2a8af7ec0f325fbe5bd20efde384263229ab2cfb1d42fa503d9c077e87973f57e6db34a0c1e56c407130d89804db5e0fbcbad5b8f92d72e73d2b4d6c2ea260b2666fe1710c2a1076c988621ec8d1ede875d158af48e3e73d74086e7de0760b75e5dd92f991ce45731b596c8ba26c7372c590253b4221d3bd345f1c563aad4244accbcddba734c37d3d0dde5f44d53d5721a4600160b5e5a24b2fac25f0657480757ff488906b39c8da5009fc3e1e07d25d48643945525641f4cd4f7217f1128ce6480b57441e1574a6adeffbed09bc234cf2bf260cf25283cb6f5d728453ec59f79f151b68249594dc8e076def190c5a0365a7dc961abe7bd6a55d1ab985bc9da01b04b34860ff2939799cd4a0573367cd1a0753d58275653da3de0f002f6ca63fe26f2e6690a49ea5b89f693a940a363fa0d0207f531ce33e607bb10028153ee2b1b88b399d49bf97d150ca9c3c0af376195875d0a8cfeb6a0eeb2b11f1f4c1d1e6d388b5c654ff6db0d8de994f0ffc0a9d5268e4994f2a675ef9b5569d294571fc37ccfa8971259bd15d7783a34120bf009aef0f24d55833a51974329d42502f4c3fc080fc9f091f4539efa8c1598a49170061a20ffcb229e31169d6d2d1c2d9dd34e40ca4bcaa0c32bf96b70995f98c24ce0dda60ecf4b7d149f86376fe86759577555b0b6932346b04693b6e72148e2984557c0f627af5fd40bf996f934f729b2c39bad60c69e4d91dc55e45339ddb904f30fd73627845e4f964d96af991165190725474c0f65c34fd36a89f5f58298f281c6860857d2b38d35b8e15dd02a0bc16654c981bface9a9a42c5f61698434a9ef852ccde94a1c4654151ee51e7e1bb013509499b8f0c81e7e439e9c6260936536d3e585c52f61cc5e74ab1b38afb64a44fd3266a8a77fa558b72344c2a4e8a21ae18e5bf1eb24c133d4b8437d6f701591d05280ca414252ca06e27df8bc8340ac40cc34a2eccb96c02a0687369c96a51583ca1750921464d012dea90bceab4f66585dbe0791b4024206b2707db4fc79be7146ba47c9aaeb1fcda273badec36211b8d1be84192f149527a8aba657389987d1cea825ddac5ee337ae93211289923b1431e8d1149d302aa5dd276bd0d0e28b54e5df1dbd4ba05dbe6b6ba3c03de3b7e5820db6c0f3a101fbe3b4dfd011fb42d87e699a121e8c993d822680e6c36798ac23c2f6c856429a5a7fde59ab58a03553018d16d192b66eceb8cc65f0f2bb5e4106b9651ea44486f84cbbe67782301111f131d4efad6fe6479ee5ec2541b733061c4dbbecda1fd6e60986b71d52cf85d331e5adf6eded69e6eac7bd8e644d228e98f03668223ed57ce86680efd2a76b333d418b14b0ad3e41cb316d794718ffb3ac47340949a931773ac0db9f6e085ee1f108134d812430c14741d0b18fe52c456a96cc8d3605f5c55ef9e216779be7fc33f150a6224d1869c473a7fe10c65ad3a7c32544beb09ecfea1b9ead308f53e13706a8f433b8dff289f0ee370be032db480fd62d5fcaae9bff1c760b282a1d01b942999001aef1f808239f30a1f2f0d52af82873f459989a41e42dffe40831bc2a3f772a7c96cfd386ccca01ae04aea78b658cdf4f374c39f713e7be52130aa3b04d386ccb225090fd36416a5019c05da85fd03bdfedfd43b00c58e1d80d40a02ec0a0a90cbf6bfde0ed2c9ffbbb47600d628f4ff31de72b75236b28cb4e5145360d5f3510f9af2b7de60969d31db335b10860684700e686284e2ba93c48fd0f86f3fc413f565af113249b995bcaa7f0a091de66f97378323a077c4d6df7894da54b7f31f585d7d7df2323cfc095e32bb3c93be0421700a9d6b12124a042817e72d690faa04ce158a7d1d9d8206c95c63f37520a42fbb8e91397373aefcbcbd8d5fa32802e850c8b657b489135cf943586fb4bf863e88cbb14ced91a5e52a0b84f057a6dc9ca5a5cb4865c9f3f915ee7f1487cea3daf7476d9649ad8b4ca4bb92b4357fd6ddc73bde70e1fb303f54fa2697cd8dba6e6166cfdf8fb808a7cee381f6f89bad93a40b1f9b4afe4686ce3ec49e6e62ccf9eebb967a9be70d60fa7c00a4ec0e1a2ee5b3a039ffaa7871dd4fd86c21250168c5c424defa1393a56f7e7e8786850b1dd3b9ca70cb3bf0d86deb432360df695d9c783c49d2b1f50d92fefae3c36f2032e63d6570247e9d49bc00d8e536c1da3e34a91e0519b17da186d9025344b4e7f60b042c9ed9d0d7cb28440f0dd1d7f6d2fe9f7383ce301fc4bff9645c64e1c6c2e6c7000bda855cfa481d91781cc450f59715e43768e1bab4bf13661e2ba390738bf838387baf0dfaa3e99a6820b80329cde95ee33aa6acbf0b3bfdd6cd51eae4244cf7ea3f9f62bfe118b16b9c5cca90c4f838eca67e709b77e933009bff62e035364805d1be18e37ffcccbf5e1e641c294303a42009179ab54079637fcb856c40704868be000d9e4ca68ead0af05c4c4cff378331a6618f0323846caba2ec297c9d2344dafd125aeb67802bf220011104f1a3225b79b16fa3167ec16629927149c6a6e0148dfb215354f1b87b7cb94bfc969e75c3eeda84cf3121c966511c7726baff5306ae34d75437d8869fe460d2c1f7cc98a9515e5a9b2d0a78f2084601c55532726322971ca8aa945424868d92bf6c9fd6b30b45e85216ff2f1adca7fc7d6a5f8112dfe8a5d0222dfe90ce92dd69f15dc096566830879ad40ada11c2e3407b4bb22fb3f6cd36471bb35ef41ab7626ef7a7826185e7b8c57b31b76cc3c72cc148ca1b9599953214406725d2401c4cb0523161d829e3bd5f15665fbf3ceea45c790298f31c5227e65c6321396da7686702b87e3832ef18648c4da6dd720c025850d521aa431093d4b37f88a31a857e6872463c47f9b349e06cdd7db9d63090a0d9719a47608af5a1183e1010be21e86b61b202f4044d2f68532fac0459a290385c4dbb9a7399949bc32057caf55ba4f8e8e8bf88d8aecb41311b16e4bb706a49861a7d047b084744b05b73f03152961d3a3ce7019127ada22e861d9eeae8c6a6953f9bb2dc19df92e32228a93e27dc2e38896384621101aefdf462fd1bac7810dc5aad4e0337a8444e4ed61d7bfdda06e28fcfb915b04f0c50b9b47129dc63f0283abac3ee1b43b2c8d405c5c44e6c25e18b884eb0a044a0c0b78b10fe5be66171540e025824cb7e0ea7196243a824f7559c1665c55cd319c2f5e00e846ddb93b70aa260193ac43a0dd5f33b741ab0704e44d9aff10d92b0dec709a06c44dfc68818723a56699373885b6a614258b06899ed08f80665485ad098d024506726682c9ee55197c9aa8ba03b419c2328d30755bf885d92d6d88797230858e056da1c7e9b32ebb0078e296072aadd0f13ba6c3a1a55046f44c73c00b333a34e10bd9702fb45f2643eabc5d26808b03e885992acaf8f5b7f1a0a8d204d5407f5c88a8c625bda2b072a4db1c06ee203f70bf08b973c7241dabe94b21532a0cd4225573a37e0068b57c749766c6504d25cc143319236590f63fe3182c67f4a16241b71bacd1728c9c31beddecfc1e79521e4968ea0c131ac664752a4f2cda0c59062ebfc548274270582e1faf0fddb00cc334003a634f91356916422c6f39f01db551c32c8dfdcf020a766c3cf5199237bad8fafa761a42cacfd9682a817c2aec9d0cf09e057decbf1e9f0c718b44227d68a5282c95585a0a20cfdab52ac23724a06186f5f01bfdd89cf1d339859312f71960cb1e083b351cb3cf41b304bb0af1150a040d7fd4e6f0345b4ee926cbf0ee9c362abe9c5a2b4b426a127b3129538870167d0b8e301a364ed0198c1e15f66d153928bec6b2d862cee4886939642e2c4e024014132084c9c1464001fe0a649021b442dc88354c0c98a0316130479d154c0b1e9084c6be3816c070b5e1fce639186816012becf101d6b34feb3c395ff4e36b223834838ee3941535f35d3058ddec11c25ab06a4536df9a245887c8868cea495374a33287e2eead515f0eda0d5a5b7a9d82506bfbfd46e71c0a030748c5ebf83854a112c68669773fdc52be86d960d6b729b2ea6e3c8fd2e5965bf71405e330a1ebf73e7eae7aca5e3bcb2052dfb33fd58c5aaa6d473345ae3f839637836c3f9617dead0c5fdfea8af714ac317e4a8fd9a73f3302fe7b663ac06baf8323022dbdb6c5755ef0c7e7f69ae50a8f7066bffc2c4fba6d5d6bd89efb0d4c06fb5f13fca2f24761c2a5eb7040ef1e1fbc474e2826df687056fb9cbb8a37e7d35fa649c8ecd4b3bcdf0d05766a6709b37c02bcb86e37a962a4877c43fe938536dc413a226af7f90ca9ef9eeb498b4d7acb8b2d72edf7fa0363495e15af8a1a61b98ad3396789e4dae80f2eca0eb8b2e38d1ef9556e83e558af4ebbf98edfcfe6168314ee85fbedb06443339f479d5fa0da6ffdd195c5e06e909edbca8921d68d67ce3c2c2a02911cc825150ea7776081c01f3539cc033f336e9162b9099c045c473987a233678ca5bffa02b972cabd97bcafb08fb34fe9902a0b60d00c901823fbccdf088c80867a11c728a7ae0293ccaea1f77a9390bb473d0d0b06cb234427c3e2da35721d3e31ef657c0ac6ecf5baef50f5a01463b7c7e76c8ad6b6280d57fb99ce89fa68c954848ee30803513a127d38ee02535f855b3f7c9a7c87b7b0f86a3fe738ce6792aba4ec92af00b129399797f47e671c3cb687acf4d9d05d574c6ac8d076fdd545a736fb322a8412fbb84917b8c0000e93c90767d8bed4d540bf80f2aae49edad5fbfe8dd2ace8fad021ccf02e8b1e9895e9a5a0171e4348ddfd88917179acd2713f5232982e5d6631ba8f59301470fd7deed5f5637cf7b197a2fe5396dd905d5a864e6e23ff0fdd7e1e18ec0e5e822600ae97da507887dc0478d244d88f45932d8baded02217b337bf4767c982c27a35475717c2d14e64f000da0cc7ffeb3f19ab5f40943f48802e09b6e4ceadd887ffee0f21fe8ec982dbc66f9fa61edc501642d9c48b3ed66fdd3592e083fbcf9f9df11a1987fa3afa1b572cfa582081be05bdae587beb1efa9845d60957e825163de16d0ae3f36abca28cfb21f2b6232d2b26cccf52166220d90a787c1ba82f9bc275cc38cfa192cab4a8a00365a6445b3ea1262f4a2dfe7a2d5a052482de8a4d71dbd1e0337bba0977245d297688293d5146fc612072d699bc3ce4a302db28e97c64e1ca17c5168520ba05a61bd157f1e192c0e038d1efbe1b642af271d061daa6ce5c28eb9c71c0be5c302e04482f806591016fe6c40fe99fc489b629b18af5ee597aab89501b1ddf2bb3b9ac6cfbdcad524a6ed8f7b8844e4f497fd8a24b9c2e24083d0272ab3f8c2b58105711c0cfd80d8c0cd342380ec1d147220c4dd26c3b151cdad22e7c3f2aaa7d15cc16251d510ebe221cd14be00a5ec8598d5791ffaa802d3ab1ade473ddffa3e1bec12bcca2c6c13bea4035ceade2f8e2281f51dfd163c119477277f02775f5612d87ce608c86db98e0980c99a389fbf8a782ce792ecc9d426eb73fc947b3bd18b79cfbfc439d2f60fcad36cc6b2ae3dd4989eaadbe28dcaeb65721e01653ef8214f8f5be36d0c03ea4711102b876bf5a499d5a82eca37ea5f1ab0da31291c38a912b4c867539eee8ccc7fd5214690cdb20827b065c294ae484fc2f635e15c9925c2a7b2b56f9738377007c2122c16f8562e5c5697973713c3d605d4e53481e783aebf52623b956872e1542484879f146e25f65c7e8d149574ea35573cdb8f4490913d1e7245ad85ef6b4bbe77edd6bd0cf5c7d4775ed281c21f6376a34f2d72f8a3a1973f07f58e12e45d09dc5154337faab6e70859318e1b9838b817ef79be21399b99d33b7634426409a52de05bdeced31dde136a984a983f8c87e72472ddf8e23e5b5133bbf624f35d47b9a63d31764f4b8b2e47968e487bbb2f4ba12c1b4499098d4baa41b865d48222b4514bd2e0169cf4e533013d97b613a59f7a572eff21154809c311f989e112c79aab264147eb6607317feffc730dc880836bba29653468356b8c43110a6205e1952c5bd18dcf24ad01010dadf781255ff6e163550dbee0cee2634b5a63d7e4840e1cd68a22632eed0ea2e2001b01a832bccfc19af9f9fcddafa49765b0697740f1681925bf4c61165789fcee4b5df44957d1dde0e0ede1290be071ed78161f729ac463a4a064f41c4486f5d9558752b98e27265be56b831abfb4f57f4bce89d2cf9ee75c7d598c4e8cf35f1c9ff9a95fd11a48e240242d2d5078f2bd63ed8c7e6214b929028e25cb5d68e54469c667a5cbe72b8ebbbdf3865950c89df2c72e0015dd7034155cc87fab74bfc9155d4406c5be9edc884270d8fda3521cbde145266f34402b57c16c648d267ae5ea96ef1d13278a86ad8b9eea988f2c0287509f03611fb1778761ce1cacf2f0b34998d9951b49b39b6df4feb271941ddd2fe187aed41da75b3ec7a06fa30e2acd2cc0c6d9c9ef154740b48f39167e5c0e58891939107707f62edb1a3dcc6426b9c879593e4e448e1fb6592b1a3f708e360a7ecd8b2e95893d16cb1ad9db79355317a7f37293a8f372129013f5f4d446cdd528e51e5e1e4a81b66795877ad508744a789b5edb91de771e4957f6385987261398aa3773e760bad066b8ff10900b2687fae1c7311abc57aca9990aa23e51cd64441e4a9fbf5451c186dafde17f622408813451f2970bbb27579aaa9adb9a49ce621d2a8794eaa775f483bbd60d3569758c058ff0a6fa5802cb2d2275855341eb6835297939c57e120241a089007edd2ab3a672ada869b2f98be81746ca86a634c9811cfea8780ae78b456baf72faacec942b9ccb01c06b3a7ef60096d6c9c1082ccdc8c1465318b975fe82c6c899511117bd8fcba7188a0022312369e450a61be1ab147f540992aa08e8034dd2375f50d7c84bdec2a2caca9fc4a07b19d4064848e8973c001acafeac65c2cdd3045665c79e9e976aed2203372ed36a15c4a297abe92a905c37775ca1072c8b2a5ba69f0410cebfa5112128e1265858593117313088a191b0f4db3b7e3b71942c00ec9742fa28d5f93612839beb27e9cbf33646df63273d24978c4cac2bd1e783c4acc43f6545349c9808efd76abc246010f6b0c4a111f0773d73cb3f046933a2ce00dba2836480a3ab984c45de5f3a0412674a11fff5e09862235b3db848b23ef26b292c92ebfed213ca2b5b027a1a05d3ec1a586e6350b6bb7aefac45c6f33382ae4f53b03b064764781a436bab18b806051c0a55fe9b81793a1c11896706b49f51e034a8e825cc41df0ce8a2cbb97d9e2941cf28252e89b86d643b8d8fecf9768e69174cc05baf9f5432035f8bbb0566923eb1a0e58dbbe6ce98aae8c35c666e6b62450ee2e6da1f5214e5cbf1866eb2b376a55aac950f25f7d029d1d5f5152e16554baaf979c2056698b0cb8e3b4242ddceb0854ac90bd07974169edd5f27624828dc6aeb6c0e732ae4d7e4ab6e9e6dd4150249d0861a86004be50c91876c8ec7f24341cf04e94d273ad1c6f2ad9daf02e09d78c6fe117a7410e9e2dc5b4fa260e721f2efdb66c11b42a8de32d39d64e837956c9025688f01f6ba3ac800278037e3b0c4e1b065c5069fa2145fd093ec689e380da982f29a75da844c2bf31d8af5730531e2be6ec098e04bc06275ceafbed59223428cc7a1b2207571b5abf349109d53fb5e78a3d4d37544a6ff590cb5d5d3373aa1aa787446187af53ec9db45408629bf853ebf351cc9680c63532268c9a6177a6986e24a2755a590b9459f10377f16e0754b29721dff2baf6a7bc1c9abac0f2690528ac9e903d8fcb54bccb9a117f481e75cac14397fcb604a87f904afc466cdc97f520625fdb851a555251711f0dad67198e3ff82a2c8133152d024a980446b90d152c40cc39fa912801e12fa6eb098a752d35619596e435e52c581022f97f4010ad2e023e226efdbac35f6bf588cca8841d4c505ab50fcbeeed6dcbc409f82a337a005bfe68425688308545e7eca02fc5b4cff8f3c417fc87f61d07fa4fbebdb3e51aaa6db3ef83e242d28c5fa3a96c14bbd1c42410faa3111da9d596a15b474fe7ee1cd25d8575845f38cbe0c5ebf65c6a1941ae9154a81229d3c1355f366e9854456f1072a727b7ed3f6a8b4e2476fd32881d16c75b746cf96ccd4d6ed54ec002bfb3eeaa80c6b86824c3a2a7a3f0c6fdc6b910ceeddffc2c8cc323e94772e60381c60827fba42d5ebcadfcce91b0f80efa476103aa08ac0a0ea292216e13d8af036b5e9b4d3fe1b113aa970a505df83da3ba21a1218198d2c7f02b038932caf5d2517a3e5849f148278c5235b3272d71de8eb0e2670d186185c2c8edd4f63b83937d3818dc7fc180c2ca9213269920fcfc755fe1d6b8856216e8007055f187196dc1800721834c50e9e0c01d52cf7f0f94ca2c0edcd5fede0b36e0e720e19e4b1b5342e886a501edf40b97b923ef623ceefbc77e30d477920eabeed4095e56c5f29ecc16a9b3841ea7ee01ea0dcebd491d516e22499c0ea8211cdb6c05750793b13dfbaf1545201464fba7a067b08b3851ceaa0447965129b41f7a3b22d7d82f7ef65a217358a37f1cf9e056429acfd3510d3b30f241b0fdc9a38725f9dd7bb4a3c137420aa5fa27f6a1b1a40186eece3b9032881f5c9bbc4f87fc6cb16abca43d3bfead8749be58a6a3c10e4a96050732819de17fddc14aa3a2165a8e03badb060851d4f366384fbf7b8c753ab8b91e6bf3a10c8900fde1474c856e00d75704c37468f88003af71917daead8af117cb5dc77877dc917030503910d0b3f1d02361d34b96219f57347adc7f4474733eeb402be8fcfc153c639cd6d7d9841a10dd0215d79747fea9c4d10e86e336595cb81b252ff1676164e01df388f53652b2a26083cb2a89f12c9f72fa3e5db4a05c35cd02572d5f13da3f5c2156b969a2cd6c271d90af17b56a6f1c85a0e492c0be9a8d656ce93ba7f50b3a4849b5c6f7e5a2dddc2936e790cb9f8c6c1a51a1d7ae91e9e0b8a848c8fa558e39e3017c0d21a99644d301f3066e45ddde4c08f36237b3e9cf9819b02caeda1894a989faac6ddff63bfdbc6673ce21b45a2279ef6c3d5016e90e4f815dd1f08ff074913b1b95cd5d4df2d4aac0b34579e1617a075cff23813167b558709e2106a478d5140f5a0d86184ba3d5777521118cdaac00e77cb44cae575bfb33cb10ca9de16bc4dcb7641378e9f6663fcfd7ca8a07aaeffbfbf78e7336ff119adeff55ff906f0df80d0358a5fcf7bb8c85d45c2577fedbd577bfe0a7e91485f7afff3c805f1f9d625d29fe2aa75f80c7480d7de42193808e0df74fb3122cb9281578706291106004bb6d3f0e35bb82d31aa5d054691dfdeea20094a71cfac6a4861055e43b2ce4981d6a24e614b258243ad27e26bf7ee8e44c99f861b2e70fc815b2ec7f33b719678e6253b3cd1f8a5e2cdf601103f1ba14185a1c87c0780a35b1416a3e6c3bfdfc74101d7fe5b1e72a3705dfc7e05e5ff3f25c9930aea1a1d5d0bceae2d6d7c47617140b0cfb759d182e6f59264da4867d42a6cb83fa973dcb09fd32f16359f14b74c692bf7a2d81edb079cf23ba896568cc5a33d45f49ccb4bcd6d67dfa8278f94d68ecaff19d265182f416e38cf1935608eb17a5140600eb410bc7356225716881ac9b9675e55db939def52d1e86842c734ca0f7a0ee98cc7dfd7afbc7b6e600f81da9315f6d7e38890576e2ccd5e4632dc02ecd186ff0ff76bbaebb0f4aa2eb4205973764ad9af09526c7d7ea9af6bd2c45ee620a6fd0c8261b996c6c57fcb4c03712c87721560962cae7e71a265caffd2ebaae8ca217355348535ac36a9575208d65ac6bbbc8bc303fbce1cf8c68e61c754eeef3fcad97d309f478316c6e5a1fd13d0b54eba289c7526b8850a3ad852c456b0f28a344116cd71796d19b2ce39f1cdcd9a6edf9a42095e9714c29e634578d9b21a5b2fdccebde505082e3fdd3ea2292c186c2efc869fb1322d01240dfe6dc32a040e186db9a103aad544d250b0943116a44a107dd0dc569909791972f5593b1b381135fc052b4f8b936a299174ab8386ad9f9775c0e73ac3d504c80806dc4751ec1582cf2d02b4400feb802019776f46574aaf1841c9bbb14c67003cd034b98fc79b2f00d3dd77dc52119f801da7ff9dfb8e34d617118e81295404f2621084b2a03188bded81462be797b09892579a86c9004bbb3ead95150f74517e4de04fcb50f79796635f1269d14ac49ce74c91d8b96792613716d0e6d782d81516f28de2e2d7b096699a3056036364dc80dadc3fbd4865d1f621cea98ebd080874c37bef795e812f42bbbd885992d6d4c7d85003ca1890694617bdc7082b95b5815e7badb10f3fcf891b0397b486e0708e7d6c1a22e981eca4921b277f05ca25891729429cf50f3c2d3af8757e156f9d10d354f285437e685e7d808763d30a09daa4d07b79ea71bff068dd595fd3289ffa304cbc75ad045c7de85972a0d5d97c6c2ff6b0cf46d7cf03f602b7928341636e95ece44dfe0ac072d347eecf11f1f7f66927b420272666decc5a8412864f58ee332001d2cd269ea934c75c0f0e6c0ddffe820ed1c364cf81cfe30982b44a6806587429fbe933b68413f4880f93bc3c347fb8538bf9952ed70d54b571a33ad12f1dc5f5c91fbd61f92fe06ac2305bf84354dbdfd833793df4def5e44d24c280f6605e96edae0e724787cef7137b37eb65aed2be7e9baf19debb91b5c62fdc43e5201d63f9c15fa261f8febff98f5815b0922c2eb141273bd92089f96abe4053c899a3ee81f072cd66abbe094bb7d7183be661d3516ddc41ba01d05c5b03270095cafd9e23a23710fd2ce5a397140c986fe578351f78ead63c3d8d930264e04c8eaee0bbd0cf0b9ffde3e86dc15bed42f61e8838f909ed71645e43fadd900c01646d7ae30605b07e90ee97a2fd73e2f02700f032a10b628d7fe500dd1a43ab738c4a85f4ccc929869cc6b8229f0a3504c0585dbecf240dd6f8c9d471c5a044e3c561bb012a522536df7fb2f7968667beccb3e4cc04211d5f5c3fca93cc32434e2b494bb18ba7b29b12ffb290347dcfb0ecda9e09bae747701e6cb5c28b1e33f0564150dec350e9b6153b1f99972bc33e36910a7754c93a592677cf893bd2da0e13ae887717b027fd96ae27c1dafa4317ce3b3877be5b45f617a8ca86ed11e1d222f7f7ab5692dffb2cdf7566323fbb8473a23dd5b39e3c85cf74ac118f2125c1cd1d9300f179268c48a09b94b28507bf871f8ca63bdb6a82dee29db8f93818a1d3f893810497235f23e935c5b0c315061cb2495704cdfd8d9d3bc9a018a9c3af8e53c48b9f7c878dfc9659119f2f78d3b171872a396bc5870a78ee5d2f9f8e2f57cda80f5f38ada4368303e318ab7dbdec12d501402676965a30ba15bff9fdec944d5b5c51bd64f74c4e30ef312009ed937bea5520b428940f47d895d9ecd8dbe1bfe3b61e07f516d27328c71411bfbfeb8915acf1f8bac9f17992ce1765111fa22703cc5b40f7fcbf26766b6db08470e2e1b2c38d10ed6b8a4f98aa437179df3cb6627930b8c4383c19e56932e9363f16800efeceb4c4463a2981b495907886941e895cd34b28b49d5f0b0a3e1915f1904685b4f6dce747246e154b8bcafb520eaedde0e60d8867314f5d01c4a81f132e408e8b1823f4bb88ff30839979d93f1d07dca770c7c64532a8f511e95856758c876dc1f6d02994351ff6bafe71bc133ae2bd51dd9d8c478dbff6aa021bd757042ff7795ef592838a6604a0ec6282a4ff9366815821670f3eb8bb2de34304313523166ac81119b77ed0d684df825615a63b7e50ecefd2d749f9dd2725d15cced7ef27f430cfb0624d01fe987e676a1019ba1e3c4a4fed7ed6c74c4c98f83d3e10e98ec7e4146f503c83b32d3470650b9f8e928c3c917abe4c5cde32e046fa8591e4c108c62b0abbb872a47505983b923a2ae25ef0e5c7edc54fe3258f2baec760da2269796a4703b45a22cd9bc1b034793307599b4e2cb3471c581c859aadeaa342d1d83ec4526d614fa40b4ec284238aa40921af24fafe9acf50d8cb1c1fa3e743e0a09b0e817df40ca57dee5590abea901e76ce88da9aaf352b9d07b8db425e199e9ef25038e2763b40fd187798a17fa7d908d1f871422f4a672a4d933059b179441364e0e7e56d055050c8bbd5ee5798cce89c6833b21d74fe86d47b0d555c7d3179938fb8540eb6d13e8bf6790e2d29c5d95eecc9da3ffc6c7cdb39f8fe867dec2c52219933b7333dda64f4c7d1df16833dbe16351e34d070eb79872fc0e2172c399461554d4281564f6b03b9333918bc59d7f3935be9b0d38edce7404b58a771aa98cc2414be7de65a515414103ccfd1ba2dfd39a01a2260c9c3e54660b19539ecd9df32be348906debfc7219286a02b78361f935c8cfb124c62d31b94e6c3609e83fe59fa8bb3c4ea83408f4442f242fc8daad20afd421ef6a9e0df48ce4ebcf9522491ee0b111b36c76cd3da48c6587de4facb1c7745461229144ceac51174db98f65a3ba8e0afc1bc22f436de03b38e2542ecc41116af29fc89bf94c01a372a0d0ffbe3e7ba67a78f340b80a9279db08fc70103069f09febd667a88e5b1551fc45218b6a51686a907d334ffb7d9c534656054adfe988f29c8e5005b498f0c242fec0ab27dab0997993ec4fb79dfb8c9bcd7dbc9909d4f8d268fbc17f36b0c304ebdc9a6877375872ff174cce7e67a0ad24d086611262d6894d2a8ff201aa895daf8d002935fc4b470b2dfedc2bc6ad9d855999e428625a3d0e53065c60118407aafeb0aecc15a4435667c133f0580edbf0cd1eec4635c402ea6e977f08cc80a044a459003ff81f0e164539c1e392a642a4ff94b85885f640dd8303e6dcb2eaaccaa6db184e6781ac1660c9ef1aec6f949df350290e7b18609c60d27958d6d3b7054a681a3e1c7c60089477eff00d0029a72010c665bb743ca189158dab6460130dc68a052598db0030ccaade1e239441e090269545957c932b08c2ca2270d0576d61e0a3ea0fbfd47e7c4708080a97c192602d76f37aa63096902b0c478957729f067724d2715b3fd2d4655e61146422b586ccc62337cd7d725a36f5f4466bf949077f15ad373f0b6b99be5a9f1b66b0d29410672725fc5b8fbaa1abf0acc7af2c1b319ff01f9f1efacdac225f7a4f11503306de80aaf6b6935d11c30a73c07608d401e3805dc857952bfebb4c385092c06ae8fd1d506a8f70e1a15e2bdea03664de048594f649afed2850ca0a6e8e9a7714255f390c78c64bb67878052e42026401708973310fec12d6980740b3548f496097e1fb8c750d8bf8d70a3640a54a69982a686fc961eb70b5301242a01be4286522d3f3137accdfff4269687ad63c79ddcb6e879d74e4bc60ee12730bdb5b24ecad09fdfb138b21b776df8450c98cdeb9f3f2d6082876171ab81af62750e2e07849f20c01c7709994672eb766f38c47c941d6fd09b40ec60acf6027fefc70d16b1659b7ed5b82ea5b0da447eb05c80b9cd1e760583221eedc0b9dbb077cd176bf3df49b2deafd3383d65694355e130f5071ab7e931a39e95c8db0590948e6e20682943075b7fcd338abc92b093d264228cd5a38c19c13bbdb9c09b2e00180cc9e3d6187dbeaf4bff5636efc3066969b33040196c5a158b01b31c6d8e30dc1658a2a2dbc62e3a8ef86084e221dd80fd6f8104c9f10a76bb70edecf7d7ef417f11b141e0b2a2f96317fa1ead4cde654e0c80a8d8e87fa26f3008b93253185f71077b0446b6bf574f0b71e91cc0da40310428122f1aad64774d606379b558422ca0c2b5ffcb0d0a2c15d899f6884c34a8161b12fbb601e8cf72a74f765206326965a935679ea5de902276ff1c230debe98e3832bdf78b11dd69a230fa63c9e9964d2ce35f76bf038725c0c96445535d5ca17c27fe19fe7b39cef1bb47189da01beacc6d00360112a1ed8c6214638c0290d223f2d4afa2298a53f8aac78a5b1f59e42af050aa8087edaf69d39860bd3fe2bc6baca722e31239a3b37fb02ffabfe74e1d171278d10e5e013e03279ce383340eeaa9cd1fa8f04a4bb58eb23cf7f3edd0915fd59851a8f48c018ecfb5b5025969d1af0bc73649ddecabbc9fab6e957242ec54a20108227bb1b5ef76e9d6fbc6ac0eada9bea610d2e6925ab9219f7c05a7dfd3e3b74b06b0583f70868eb8fc0488880c49c00d84e445e3ae56ac3d5bf11faa7a120780f3dccc58ba6e0605351b27d71f4e5099179a1f154727e0c5ffe9f884be0156f40de72dd375528b9960c1b2c15ef4fed9374a28115e32a134744b011cb9fb8fab19b978c6f6c2f2d32f880b23a1de8667b9b0b7a8da2d0452085c8069fba2312e89ad8affc0213da8684acf4fca5d7bbcd16c13b126797616ec4aa68829ce8381d75ade1a1feb5c9bfd6c1a536803d677923f98748dc091184c78948d99ff605ad627d4ae19dbe8697d372b912e026e049a96c896c126449a8d32baec913ca577e786d4c3ce408071ce82129e76fce8012f0fdedb0a06733c167f67cb35eba3f7458b9a3b38777c5277604a2923809b94a620024a365757da9c6386bf97eea27da70b85f92b4a515f439cf0eba63f208f422e10cff95018b754e30d869855fb8c2f71ede02fb94b0bb1191f28eecfc5fb489562f4719633a557846c4933dfc41f926dbb0b921462f1c791dd718819f4c4cb2585c3e80144c460ec81dd639bf758c7b7ef0eabcd4196a1b3d065dc242728e227985dd1be0d9880d35476ed1988072729e8c5c622825e7c863bb183f68991e2aab05cbdf4a75fa05bd6758680991572ea93dc1a3fd79d1240c51f4f230aac07ff7805b4471a0c5cdba64aed159cb4d60df6f73139a7e2d049cc503600597206a9ae06db3c4fb4d5c2d8bf18082e34de02e3c7027be42bfe4513a3d2e35b5c74eff31f0f54e50bf9bb001829091269f71dd2f198527c984f6387706c9edbbfce5828ff0baa2be822018dd7d50e4c7c8558fc0311e8e7f8f30bba088279b77925c3b54400c64e5b9f5f1cdbaf0928e2d1c8e97758cf6f28d564f9eb433505b28019c91ae0d25d4d39b4986d16528f2c7d8b36f237b31188fa2be3bc302d3f96bfad91f70667bab26148a47fcdbda4c52a7115ba08962e617706ea4c226526f4141d5637dc7717f87a95d545fc1aec45a45ede5c7fd69b1d4041c8534f73346874e352c49b384fcf36945d247d9baa6c9009a5e54123b8a2c09a7de255e4d1a8c907d82fd85f5ed3301e87cb3f582029b0a01062cd259c8ca2a561348280231f729e9030422a5e47732d214538920a888e49fd1d1c10e23ed01d276173c2b005d47b8f1d93c461b3c798294820fd154acff63085066fb3fc90bf1b52394f00f74e1e7dd096bebdde538673c92fd7b3d0f9d9f6b309ca562a839d96b717cfa1f8a1fc78c507d1adf83dfc323d50dc5dab554d257be1b0f9485323634f50c8c77f881ff57d32492dcd43f82e52de5d341507191967726659f48ca3e2d85efc8a080e3b9b0e8348fefb21474c0ff5a2b54c4acf02229ffdde221923ff61a040cb2699620c1e1dd22681543ce566cbcc8ad40b349402d03ad3096d8f70e71df507f53a7c12d08a1c3ffbde9444f1bf3f07ef2d4a44f3241ee8c24bbd95114d8c460915068736046a049453798412a8811a1fc115ffe0e28d378a1a60b811bce0e572342963b0a04aef48952fc486bc6d829a79dfd0da1593092a43ceb490e30400d098a7ba1db3ff8e6ef57478758a0c765abf4e2e00667c69553d9db78f9d75b0abd81dd4d3d9347751cc2b3f5f10aba8f75d5cd1dca256402abed18712057380cbfa1b957ccfb74c4d3d8d38f7a49cad3afe0bb24ed139e96317fb94c421bdb4c694833acccc005b1f4fd8bc3e8bcacfa83e19ea9f066a0f068cbb9ca83a44209c180039a6f1f79ae21a55c1d5e764644f1041ba104660dea11133e2247abe0baf3b43d417f8c5ab381e38c6410b1dba0c4d1dc961a7474b27143aa5b0fe42aa24a37ea86ab4386e62d62cd2f097aa789de88782f5600722db994f19e5d39560b458b0d99e51cde4d670968eb41d244af5ab0844cfd0d0c203cd7f967091ac321d3fe229197a5f7102cc6c6cb9583c65c54f3439818e07380272ce014a441feec4761d365954fdc43f2780482f8ee9d5f9b22d209c8e50e03877e8d99b9efe26f8dde6ef70d70dccadb0e5f91bf860b62f13278fa074a1e2bd5e810e1ce10881d5e422e439dc9e417f6658972f4211e349a7ba1052127ce6c4d3d933722cfd08064f975b9421a83edbb61263e508d90fbee899b80ad99e89641429dc2c3362197661490e1d94090007c3464ba29fc3422e3fa9ee5bbbc96400e2b7eb3df43c53d9bb2a32b6a2e8b033a79981eb22884b6b310b66e421a303debe4d0df88624d292e3b6a93ec6bce156f77c66a7f4052dff263ff8fb8c4c5cbae20faefec1c21ed10602a7cb41865d223b98af962af4c74a4bfc439467e854fca3b722b74d7ef2163698903f3fc49d38c9c8f0ad9762cc006a9129443c02cdbd874c0f1b63f359b79c09f7385ef32ecaa3f0ef0960d6432a308e30eb2685d8bd0dbfd6f6810956b6b0dd1dfaf5bebd2123bfb149e330963473bd80922d3b42c79be4feb3b14913e4840004adc077667a2a7039ecdd4328a9f3e9c2b9d7b126081e28013119e4f84b7d295ffe24d41db1a789c2ef19a55e8ab8d9a8e05579c408ef60ee92e101c5efa232a6c43a8813d3ae699e8c9ef33da1f456c879c22a305518c27d4837c251f23f3bb261554912d90d81767ff1f15603a58c39af4e4917f98f60d29d2b6fde06fa13fe60cbffb6fc48ed332cf3c5dabf2e41ecd184e507430746017d5fd4e5f3041d89250f3985bd1f30ff6b5a7239364c79f865467869136e191ece644dcab1a9c6afba4080d18a2244ab4b747e26d9ddc80b24d6a937d419bb339b9d55b5b8a84cd911862f5996e4dc3a50f52b360bf2da61c0ca4f43b6cf51f52822074454f1b1490f0a42db3f8f99bbe88917ccfdbe6c3d9dd7b0cf8043182668eef78d30d0f37890259d9a3f1f1aec1ebabd6c6dc42900e253ecf8e48056d291a616dd9f2d701ac008e587b9320540767bba844e12432db66127f470700790e07fb688667a032ab53b29d940f82ccf6170cbe4b1a8a379c8b95fd20248a79675038b9de80e7fbf6c223ef1a29ed993f0601ad102ea73f10b44774cc1855434c4fb5fe91abe0e948796c34a0a3bca0f282c6a5ba60ca8de28a13e795788a40f51e792844aac72d8ca8fc631f4d8c13acbc76c91c8b50602d05148b3ddf3e6b0c7614c353f9d3b56ea9aedc5504361559c07ab75062af1d63d0df1af7e83a01c70244e7ca243c002f2eb6908c3c9f264e5dd125ed5756e46cc7a8498cf3a9e7bc831cecf0c6651172ab1950148df4e7f931638a72a3fd85fce7e54b6c2f0ad0050d6a1f82410a93b8c2a697261653fa6e8375e9caec678520ae3d0bb8ee19be9daf4b380b92770e4f7a22132771e70a00635d4aa5adad081f50827193707caf3c731718fe46353bf6c6120b0f4ba6114caa8e5b21567fa27a91ed716af6f638d5197bb13722e63c4717a56b7d579aaa308fb9188a6fcee9f6a31cf1b1f1c24dc6d5f073a291efa8e8a1107f97ef3beb126d62ba109ce7be44dc0dbd3ca09214477cbf15762f5d2ee7369212f6407a8dd575c458db70ea619f0fe7950d2bf2695339bdd731ee20fbc4e8cabd2ebab74a735eb47104efb3de8194f4e45347cf57adc778b44efc9dc167d9cb01a2c358eb99b9310e65081bb5f2949ba330d0cf6ae459e67a47de560b17e15f2c57a0b545546dea4e79e6fb7fdad69d8e7fb2ce6f5c0b9aeffcfeb264d382e6f388dafc3930702e9491ff31f95939228f288013436ea3508a204d03f8d8ead2b87095adfcc7835b85eb1f2199ca947197cc20c81f1893de10ba8c2d23069288db44b3dcb1c7d9080885790e525957538d4bbefa36ef9aa05d0c3a7fcef9a732d8a39d690d514ea074f4750e456df0bae0e77b3335e9d4c491248ae5c0bd6de209b14571562067670887f001cfd1e51e30f788483174c68cadf3c6ce662366da0a9ec70c8afcda22d7ad531a2c2f6fcfa569e958fc372c7bc0dee7fa1c5b193acc03d835880d2cb6ffa5c88b170a6ac960e15f2afbb712845c2f86f51a667e82cb3c7a1b699b57388df57102707d6482d75da59d7ee2a36da26795c38eca075bf6e8711150c78a3b46ecbf8866c60597a199863b67138a3d5dcfc5dac5c6095d56facfb063b705427b9878f754ebdd3d6eeb36a2d89da494e964e1054e7bf14b09e42f4a33c08161091cbdecb8a800b4cc2f0488306faaf8979f291c0667a2a78ff9c53041d71902f286f9181df75b5393e64e1c7c8bafcf798e015c15e950400fcb281b03ccd9b6f6820c3db04922f68ced8d415149117a16d54180260325b33673b8fc2f72de96cdc0e40140468a76d7c67b45920e61af27e330b373031ca89681fad48d9e520423ff699eedf58235ef9932ae7494a57582891fdd3463acfa0b369a80f7eced2ce7d22d51abf809120f76b2b17cff192520d2f0d06b4ae3f0c9cfe2a924ca360767a62d483a3b329d7993c4b826daeba23859ee370c223b24ad210de73599ebd79eaa3132f49f019caa23bc15989ce2a1df765b709608c239c6ff848d74bbebeb59e7552c8adbe4e6bf446bc6d813e9e20cf361d92597c6a9119ccb52a7e5d9af68c0b599b642ae52829ccfdf95bd277f41f12259589e3ec9fa52081aecd78bdd7fdc40555c133a2c1670f956954a7c9609f927c222c8ed4868628aa1180d9ca13dd675cf1a833fc19ca1b5241adfd0cd9b39ce3b725ed0245bcf6186d674b42fc31d931091e23202bd11e257317a08fe0e39d880cc128cfd5579921182bb5beb27fb9b5ef0f4b2977dcfbeea377fb7f0c26988883e44673a920ddfeb11b6428169c9889308d02c2a60b81d17b7b1410138abc7932ca9a86b39700461533eee676dfb7f35a00756f2d670f4c3d4984c0dab5a16862aa5e0bdea5f9d3d3900216c07102fcbe0953f8301f54770f3a72a37ecff2b44a4a6bd16de2b2ca19aa8aeaf9981af11819b02bb11a90f929f7636f1f4fc239ce4b6c4ae804ba2e8d78f69ac54a5a38ff3e163918134615aa20235089d0d8e2f16ba5124ca4d0ea9ab59e3634866e1447bbe7e67cef4c154b2cd239d7954b1b9a6a0e3a55f68c9b68c8227cfbe2260773ea40a1b54a1c01e763aaa39579248bdb3a45c092c51b8030159ffd6d89995dcabe7d393b814baaee6add8d98575a09d5320dea0aa9a3f163782a8a99e15788c313eecfa5950db413018771d8a7dea0b6a945a55f244947e9df4143f3e65cc47bae80d05d76f4e7ac7c951679efb43effa1eff3165475ffccdfa472f7175a3a2d24e1bfb3609e6dedb7cbc47d6a0f9b4e2a05316cfbc904319af11d031301f1cfdfbe3940ba9bb8a76d8149ff6a1d8854b6faa1dcb752ffd90da8478ed1ea5f07f00c8ab70e195f37740d5ae3525d84ec635e15404a560966736e1057b25402d67182adae0fe81e57f5bc6fa53fbc97f5816f38ef09cebc0fb11d49b58f1538bb31284e5d34b90b836e755feaf303951374135f3241b7fb228e578279c1fada42f21cfaf3405799ee6a1fe58ee9bdd9dc91c5bfe56570839c2e28cf6f267f377cd0bcbbad60a726a1482f75d446cf30a36656c5bd11837e2e47f7942594f6ac206f380c7275face92c7b54b50129e7986a42c69cd682c61f726020a5da148a7783f147fdd9d62ece579d24c718b8db0730047173dcb1c692b3b9e8c46137880e1aa52f36b79401653664efee0293b720de0036d03748a80d78683ff7ef3b3dac91556aa0c1122081becfdd0342d6f07733f0165a315c620b17bc509139d2eb2fc4f292dc5cdc043528e62fe7aa5b3e216e8d5d571c4ce51b29b94ecc96b5c88bf871279f95d4b68804d6d77aa8f210042792a93e785af7acef46627e4a0b33c0c78315435b8b36f920c41c4a48c2b468deb6c06eda22600ba2f51dbeaa3b8a0dfc3658d56c7c5bf4b20d77bc3e8761549a3cfc609ef460b69d62a079fe9af56838f45465011e67e406c41672b22b17c67dc7d520b6a0fa296dd927f2a03bcb9822b441defd810941f8004cf14f1e539fa17520738c2b1b817a4e1523266c79340e58dfcdccb59457300104071b4980961f81bb47a88300db63c0fa15599bc312a17f913114110e9925b39639f4938237e969a28723f474242aa2396005ed8bcd551f383172ee55a237560fabd0463d1fdfb878a746be3f361020de810e56c4c5edc099e3a25cd469781530db37b017f13e69839d4ad0d54766cf1162a68a1ebc2a22c6dee265cb81d58ac8a79d1a128cd1e6ad80bd3a8e5b454479f4a2fb75799522d1a5e2af982e33541aa8c06c932cc667ff8884c3c2d79cbef1f732daeeca06f52e4758d18f30de453dd5e4ca10de9eb15f9796daef8a1a74abe7b93857950cbcf06d2c38260031d3bdc6a0fabc8d7390fba57eb43596b5a6765c077439739eca5e1dfa94bbdaf4480c7b0bcf2ad597085170a5897821cff037f86139b56b81b0a49182528cedf96c8347e8e5ac8c500d46d002d150b86d0ab6d7b2117587e2c848dd92ce504a0b605b0656da7e1c70aade5b0a4c8930760ebc0261e7ab0bd0f3615a58b3d4debdbbfc64bff818383b217ecc9439581232f6231a97ecd06ad794c2de66fbd151207c8e1ca4af812a764cd3c1dfb6030f2fc5f0afd80ffefd31b0cc082cdeffa47f34baaadb4a7976db964a3bc1002bc93e1974442ac37b08441e939be6b7f9599f86638a1238d0108597feaebf15d454aa316f1726eb04cc2b6321d6785ef71ddb5907752a0c71ec1039104809b2fe50b4881b546c68ec753264d58723e20a1a0b08f5e3b784cd3c8305ce3a148dd3e4c6a4db6c869458e9cc23573f0a3cfa5d6aef0b5baf50c0d8fbae7d5eca6a7e9d69d1b485e0da2762950a6d6566148f992e77ed7bbfac74a4e038e6078b2a4d6bdaf000961d840e0bdaceb5a745d7862e71125e638f23f684288d610929dd4cdfa716f9d2796468942f7ecee62a5189234080b609f3540ff21ba4fd02717a32ae29a40dc48b291babeba4f58c72291f4de7615bbda1145461704ad7847f1f630191739bcfca704e43fb87ef60fbbcef7504bd9e99e2fac38cf68ca6f527f6e6603cea6e2c6a7e9702dcfd4416234e4a0e351d85459c1cd59de276970e56406d82687aa6c38debe6cf9b8b49fb30b8460c80a50658d47ab3270e8457cc9cdba9dd4794e3109c0e1e95020a8dfccc28924ff9e70800179c9ba0281e8285e9a9d187461cefca8eff42a0e4ac0d257657577fb5d10ec4faac9db5907ac3414b4cde926f86a1c58271426aa13f073f075b49a0b88882a4f9792bcba9984162a499c06f368aa3dcfe2f9aeab9874c6e217f40ec1876f9066298cb503976f1050f81302cc280d0761ec4afb9c74c9a5565303d273f3fb39c608076d3c5c92e2721469b821157c250bc84d6d2beb928fe26800c373c96af91cd7815c6111511600e2947f6c882d374d77d8b353e0c55df12549749af853338103ba8992ce76baa7b906b38fd8c406af12f0236dc870f685f2ac68020f203663b671f623480b43bc8788a3d3e8cbdf4dd34d9b4acfb7ba19911ce338da172b0036da0cfda064c511413bdc71f1c09eb088ae44f58b6a9834ed0625d7bd87164a1aeac333bb41040ac4b4b80c17970c5b6d90445e5313c31c738423276974ed45981dea64a2f98e3a410826456bc6cadbba9a1a62fb2cdcc80287a3d9da40e71c348da65949e818f356eb8b1470614004ee3f7891f643e9422d0d0a0b46e60de70170f5a0e4b32e9395a9474fe1e1e48253c5b7b31443a23f9bd1e15c0071967f0eff22723007b8d6016d2dc0a1240817038710bb51d8369afd05b39e05948c67dbe370de45d67caf626a82bb207c06e3615e9e4755a5aa3cb7d0ca80b51c2bc8df208d610d319ee58866681383b406dad3b4c18b728aaff789837aa772bd007a6ab4e592ff829be467f0a497e70c93ab7adf0725cbae83f0e0b6afb0782ac3d534088e2e8831df1b50658ab485525f124f813a4c9e58616f11c757950dd1e25d8d0fcb436fa36f6e847cf05073fbb1bee5f1799be9af63c04f2de3c126532c7a20846e72df11e588c780b6f44e12c492de4dbb96465afc29f26d2c41c0ef2559b14ab33b42f3e8f513caac764f3761e02b86cc5de18bf0d81a9d28008adbb9eca741c6e5f035d72d913b50c834e24c40c5183d88b50f9b4aa1734c743bd41a27093602518a614c6162b821206479e2d49b129bcde252cd4617b8f9dafb26a5b338eabd7361a80bb9598d635faf5b07109faa6b1b2afefab3642d03f5c4071b3ed5931abbd555eb22717ba1714683e87e77438d93e2f1a22a6374febbd2cdec79646850f81c676d31c679f6f6d317586e02c8843ee7943b6db4f51bd8f54872b4cad60a584c1261f889d113fe7c0dfa18143adf91a573e06731df817a520c3101b3b0dc4d81847ac9ee1d82cbae8c38af1cde9c422b65e70fd5ba95c0727601bb7a98c4a67c45e684cd0a473a1b71c489378a1925394f9b588043e64948dae712dcc639a7df7e428b85e77c0691fb716bb430dd630c070394c98564ecbd71e5a1ec56612307248ff86af388f909298aba91237ffc1ce814367d3a1558cee555474d1f3128b97805bfc3644edcc481ced9e25d3f903d203b626d9ae6ef3aadb7f896d9775253670731a27a9eb989e05e471584912d6bab9ec10980d10944cca33b7513f16f330b9c7a350b93946aace2f1ce87a3d93f9d8a716a1067c0d8c16bdcab8d5f832e20c897115729eb526b81860d237a7a21b70d7409462205e7f8e840b040ff54544a65294e2d1aec7b614ffa5fe75ac66760f2822a48a33803225a2eddbfd1806a200d0f3652be8840eeeaf82da4cf161d27177b44480bb96ba765ae4d4127b6ae829b4faf7533b1c774e075a0981e22969400f0caf4659b496ca3234d99dad1534682147395a4c8ecc2647c2f563290feb477d52c0a76dc50c2498e93ae0c1460633a23e57ee2bff1d151c294b8c9d7d2063fae2fd994cc3e136a69629d5906cb0498edda54da542ef5c2e4a78598051451af4dc6c63e130c8c0d69e06649666716b346b0ed65fb4c67524c9e043f01a2c9cd1bc2070591f3d78ad94cb9cba267221745464dff2521c496b226b367847b5bedc327111253667d0622721ee9f6cea11df9ad9d509a1694a3d26f929044b6edc645d4ecf167d960176c97af0b4194b6915a1a5e9545a6ad741e8c22cf42d266d8e9278f07052627f2df03147c011c680a71a406d166fc0e18bcb24fe08ac1cec1b2c9b0c7483fdfa978c78e3eeb6ce3b9a108e45f156336c86f2decf718f0efc0ac6008aeb5e0eda5bc397e029a67ee797aff79ca8be1f90e956952cd9ab380e3e902fb86e7d424f3b9c457d5a65e5860ddb42fb66bf49f4456e68c429e89b1a77210b7727fa913074f617eb077a6a4e96158bca368c9def3d5eb6d3e538b1358238f6efea429016835b8bc55ae98abc706dd821b604483c64382de9e9a699530cf16500dd604f0a5ee0768be231608fc68ecbcb3fa3d5369e0b081ce2bcd1f6708e780b0609f52caa137e90ac89521a3eb0b92dc9f2d54cb0902561b5b83d4f5070499ab4726d31f543cb7a8e02c38e0af30c8a920bd4d4327261730b986436d508793eebd43bba58a9a075dec6528827369257affd38c0b6b67034794be4387123e23553ab64aa9c5f62f1386d4c700d7b1b982f489c2137b46edd6ad81d3d294b5370e4e9918278e6b19c81d672c406ac01be9174f050382b2e43d68c8dcc05fe81af36e0b269edbf2dd0d4b2ac432d25aff01233b871b3da05d3d867ac13e69e0f3cc78f18e2ffa8b0980c6fe0fbb736e9e6700e5a4d4f95b21fb63b6ee2719f1cc573e021e22baf7510507d5c4c8755585dfd7bc490b743b76ae4bf33859a6d0fdb07415f53f6c4abe9619cd929271394486d3c367b403f20dcacddcd6db6544876d6ac1f37eb3ef09c87f892c4a41ba5534010faaedeff05dc2bc4e09bd2d2ce5e0c24343183924fa8fb057357d93f34ad75a36f92fdcf5c437036726ea1a9dfe22ff9ecf4b74f0dd9b742b456d133ef4e78316b3901d7e7cb4d25b8c293645c4dfac88da2af62284032673010f8462572009a011831cc441d18443132e1eaec54b24085a03765c902045a98de77a6bea6a88fdc9868b4e04e2b62f4d6fb9fa0044ff9c16b2aed36eebf8031cb3c078b64e0d692aca223da7b57e28a8a62f3b9ad9bad8222beeee72ee346520283883532ff048c389ab1b1eb35c89385d89f6df0459acc7e062226dea79db57fb99bce508e9efb0a7664b9528b7d9b5507415c749d8148f344ef48b3d826cf29e62b63f557b5da336f2046ad6b043cb1d693fd8aa8f7e7f954d4573726a0843f36403d536bab2e0cccc3989b9b3175537d7d6bfa8dc352bd6106bdb75aa6dd9db0f75d4a672cc9224cadd8b1d2b951f1739f70b384479097777073237818613dd2fe02d0cfecb279b792c0484d5c9cdc218d32ebf1e82cc693c7c66d273aa3cedcf29160f7b3088325a539cb9e9d9c2f6c1bab55e7d526da8feae65a82fb7c926a22ee32269e7f6cb617c947134ab2087c4d60c55a7d1b28c4cd950b38386688ac1332a6ac826b0095016596fc00ee16f46d2705832d419f5f03366765ce4f3670a306a861565f5498c15adfbc0e72604c227f0f6600cd01fd730d872717a873f0313d3c42a599301b5a35645bb22efbe954b390836403a3d1204137b22eee5d7e87899402e1bb1dcd87395059c18d097ae17f76abdadfcdf7cf04f9ab4bd9c1fc96ba92bf44653256241cc3a12450fc19439ed1cf52cb5cae8dae5ba12d100eeca712b4c3b0200f21b2c0a6c0905a15d004fafda417d2dc91fb2ad0df9d4f865cec4818058da785b602131f60ec7f1b93ed5d59c26905ec7b8f142bfcf7f9b5f5bcc196b7ff1ec4a4979523013be48c16a513260a8dca67271f1d4893fe016a5eab1591edac7f81b0c6d62e8e11e0371bb02fede7454bde2c8ab91b0f3fb49fbb5c45c8d0261c542decd115d273d7139f4e446f15b0dfcb97209bb2450a5c6eef2569195b07206f81eeca424968e5db49937ffd4a6b9629f967bc323bc89a2262c7c1acc8eb44de00b51b609ce2f318825e58db2d6f05ae91ba265be14d46469e75d6ccabf04d6810c1cefa226adc42817d8136c2b613601aad16a2ee917c663ad6f56ebe342dbb77bd1c66a708274406bb4c76129290c0c99a9a3623e5646d23b84c5d8dc4fb1fe56703e7162f2a0ccb02df141810c72ad96c05366549bf6a1463ed23a11a77545c124d755b730351b7959dbcbd181fa8ce77f720af43a37172c508d5e27a50bf3bde858ee41132e8586d38d76057ec6cff6aa8c79c9cb4843f4371c261a4a7e4af1b9bfa55414e942ca6303b3394d8c7c2fffab4037d9432801d242e8b67a9f8ba898de7419ce8a65ac7e12c9f6adb64928e664ae255641fcc3e44cc78b62eec9c335a3b22aff7b288d65ab6478b00adad0e46ba6566f22884a3ed293d7dc342d9591ef25b9920641494597261e646728ba2597da7403b2e1c951b5b9fd75662a59a195d27f37cbc49db1361d62872d4283b9676af97b88f52825255911a78590f5d434f518769b97daa40486639efd4aca696a1cc80febd89b77d854dae61b1c50da9b314adc1819094c97c8c1c4ac11725ced44defadd591834d72e11d2dfd7915db6a2dc5c0048b9306df40ea65c5c6b75d421b50ae6ba4cc24a7f378368c50fbcf3edb13278a5915f6f576bffa5a60b678a695468c83f71874922a9677e0cb5ebbf63063feae9c8c5df39971329743c2eca11bf9c2a0fb582a375efe235e79a0930e4fc745aef857e1cf31b0a2db12c06604534c105e55e38865f8e4591e8775e2d9519724889fed5fab742f31df8e58f72b724e12e4a5af43ae354511adbf3bf8078cefa5357f3db9fe42fdaf90d8be2905c7c3048c382d9247468b419ac1528d1fd73cb7b81586e599baf7b1feb434860c63461e64420c6fe6a8f231b670bded5109c097c897e19e94a2237a70ba381a06a0c9f556c1a785f655e0a9af81d96cb791a6291961495e7ff1837713368cd0e128e483f37a0098bf3d32f2ef87ef421d821a16b9f605e465ab0587dbb47636650e4c212ac61de5de4a4e58a0fe5d83ef0ed778af02ad1624106717ca65b5b69031f35f86727b160b0f9c3ee48793d62028f6e5c6d110daafb7556db4c74dd5ed9e7e4895b00e968acf9f5fd675fd0be5e3892e1246d2d3df999d8e9e9cf93f25d965b9b398238e477cb50e805280f5c6d175ba3d61c005a53916647b912e801bc2e582e4537955fb113f94d58a3bda72fe1af211465cad6d21f02473c7f25698f2610e9ab341dc5f68c868940798247ca872c1568291808d11bc06d1e506c37995a30d67f8ce026ae4356561ff236e18a2c46d1bdddfd1aeaa8f2bd4b0d1468eb7b970d8917946a4fbf3c52c0b24fa06c218906a6547ca4131172e93236f5fb731609f6db694d7d1df56f1e514b7cdc3410a06d817440a60eef5dfe7d2b3f2c5ff18560894c2213457c3582b1d5df570852f31c24193b4ac2029581dfc0d6b15983c0261236ce5048383cd9890ed7a61da23f0e079ca879636f511d3668f012d8bbc216661f80b4cdbd8fd7c12e036f190a5cf55af167059d2e83880da7748bf9b6dda948d57e5c59abe14c07bacc4b740146bdaafb2ce77015765f15700a7eac1522ca8aa42dabe8c1a5cc8ca25a6c6deaaf90b0cca579642803f4cef329d92e67672d5b272cb0620b0e268e0687c48339d1ac4d136efac83839a8a5393438e645206fd329b65977f77be64c3bde43066c000495376aea1d8a8276cf39c1f827a6d33ae645c2f1e59e162b454810b296c64fd4ec5776629970ef2831d45cac68d315c61ea6c2a104ab058143f6310c412d80260e3f69a3a0a4d680bfed18a312b399d8bc975c0495fe096ad3305918fd570b652020aa17db3652e21dde508540a6f41070bd6bbc9a4934e9c54af68d9657f608b6d37fa19d6acf29c1f567a47f90fcc42a806d81923071667d4d6f8b02769d37c445c73598e424000ccbf2d2c9d19c0c3df0aaec768b923f0f111af4109bb7a3a1c4121acf8f727e0afe1c0c05ce7a7cc7939431bc66df149c1732b9846bc92afe95d177e924dd42c8b95a1aa4738d1c2fc7857ca9b1b8134c194e1757bb1c528e7ad0407b6846991961433e7e8f8260889b098591ef66db1145fa5d090c944bd0cce02b6975857ef114b111a509ef9e2a69522cff1232295488003cad45235925364135eac0fa36920b5201a8335f24c26da9fc6416a86b5ff42b69e2f5743d4cb7c8db4c6430fd5ac87b57ec1e312a9aef853ed0fde8496dfb527b54781dbe0b74df0119fd8d61cd5095e2be6340da843c8aaeab30252a8b4e58f0ae8774422e4248954e846d445c9690f553a786b3fab7aad733f73544fe895a67c5793dbed6456157230dec5a2011a1c72880344f429f5f07e404545040f4053ca49456ae53e1a1009f008cfa6064af55baa8ae4b4a793b339e6ddf7b354f22b01f0947b59c35a9a7860caae0fff7e71d013949725664ec6e3c707cf3eb81f6fdfe40f809e8578d37ca6ad9fbc014ac2c0807f1e011e5e4df46fe79bf112fd2733a84a67b468fdba4e8e415db9b3bd69e35c48955401cd0ede7393e626b41cbe6c75b349c79f6b271a820e1f7911505f305b31f2641f3b7f5cc34cd6d1e3d6db7cbc22737e09dc0a0ff70ae53e9e4cf6898110959af9b1584963de70791f42c86ec387169cf751390b71fc9e6ad213d4de33474afee75c06d407bc61307606812000f0733429b9669d018c47326c5e1ba5fedf83e682953c664bde1565527867e4f407f92756881c356f8bc8f663f29e96ee201e8a4052a9de324af7abb0d9591a149b0beafe7fd6fb2124054f039a617f2865dcc044602118abe546fdff8c5838182e26cf2df5224db8ee14d92603b48d0a5f42f9a2caa89fa6aad1ef81ff89a03a735ec65136927ca7f558913962cc310d202fa2bd4599bd505544396356fa201bc0d81c6f2e39edd8a13a4076d65018e846f020ec36ebb619ef7c72da5e8df9baeb04b074e109b0c4c80dca3b2d1a84041e3eb98523786219010f1719a3733319f1a71c19b75e635d4846556086a480a988445a47117efcf2adf981919a5ce167f53c423f2aecb92d5f56305cb639520eb0ebbdadd8d6f27a28392bfc457ab2c6fb29090e94b8ed37b468c45fb233d29199a764485fc3623889c25b758cbbf2e60188a984f2a24e0d5207e2912c6a378d24159e422f85580ba6474d4228d2a9898d113ed1afadc2d84a1c3016047585073f8aadd3bacdf7c9c3f80c8106c272d1d0a329f59a35c7d39e24642d60f95622dcc453487e429e7a459351016af7214555a6bb77f666a7e12e3bb777b7640823acc918c0d2bb06cf2c31ac029765db390298c8d6c2aa82dba3b6ceb6263f59ae5485c5f8c693dc916954d009af2fc1476f5f38e309590a6f843a310cc210a9fbf5f97c7034c3f65e9156a7f6514c2cfdccb9e7c5a2e5db77643dd6fea54b890d2c1c9a1c99f2abfea7634851a9eae2e1454b46eb5a2c3e1d5a6035bd64da7c7cffe0edffc66db50478c2909c9e443a920d24b2d18f24ac86aca3629ce35f3c19f64a4c5f57ecdbc819e5afc2de5fc35fcc1d047acc9d679bc2cde8e62131145546d8c6754982209b40e926b2af80b3232191736e661e5eaeaca4eb9ac82e8e3a16fe600f77f600973ce23be0a52e33527e341c610b8dc92dd414a9ddcc1e7bd1f8e64f74b2f5484820ad7d874e36248286fdb690323040e96758d57f480d92c0053d7d507042ee50fdc22d699f95479e4de9b7293f3e559f43c428ba1bbe6fa7c6c7f231e9c5d9fdf52c53f0e2300bb923ce55c56cc4f726d2e4903747573b46e9fb29e02fcb84a08cdf414e2cefc7c6fd8dd9306cce74ed788b9d816061502d8b8c3024f866d61b61c85f26e3c506f594f38c2c7b5596e39c03547325ba5b64b3a476aeb61165c27b96b318c5a90875b972d72d5cec33f7547ed349ffcb9df2cc0b6aae2e9fadf8bd3e63f91b0a5b9084ef2f2eb2239c7abcd80b3e242c9be83c2d3ce273ffd7a3fe6c49435537089c540100fd15c461c54a4b0d0f257217dddc7542ec2440402bd2e70aec997d32fba47b0220d7d66806e9fb827f1f32758cc82b4cb2af005b579be8462df143096a03dd671dbf13f6272f18b02dd6190718e0aa0ef0d2fc7a31154f122b8e49923db0ea91697ab2d2a4125df9ce2bbdbfcd0e0a494c09084f07b94a877737f249635e33e5a3a0a6e8cd093d1b1adec3edf1f6cfb00508784503772714c7f65d9f63ebafa64a5e54d11ae26b0d8298e1e0fd1e476b98798e12f7a77adacfd0faa0ef9c4a4fb1027dc5f4e1f68f88193e0e5e3bb6fe17457809d6702d3385656d095f56c46a5fcfa8eebb9f4948c63b8db048d2ee75b050e8e3e2535d4bdacca1ee06439080e05f1c92c4001b7aaaa6dde1122fe28261f4ff45e01dde5a6cde7eb3b59e4ff6edbda4372674fcb354c524b0954b90909d459bb6c7686eb031e58ed0872ecbebc6415e5ee756657eff05eff09aef9483c741037e0c8563de7348eb4ae7747fc938e8e7ef517320eb97a632efe1b133ea7522d5212b462e395d5353ecd08565fcf53dff504d635a70beff0cb796140183d9ac4e77f7c63f3f245cc6fc54f260d665c2663a7ef4cd659b5cc724da987de9485bbfb42c1af00c113c25fe77fe98960365e162d7893ad3326710958e88733ccaeedca082a924454db740bcd32a1ec9c4003e67e1c3f22a2cbf5975f1435ff7c7d4fbda18f31f4249965f224dac7a5efa115f466a2e57631eda8ffa0f3fd17e9eddff4eee1b5271187dec62a85253d89edfd39e4f3b907138c63e933c009c67d1b1a99eec22f66fbfe76d78dd94b3fe053478f221959e2e55670d38d28c04b4b874c8e3d254e343bd0d857e4202e59cf02eeff7da11350d43891d850505d37f612736917a6c3bb0fadf06217b64857974cc1f44bd21d9c026711ac4c151df17dff68dfcd33e8c65cf9b274c857159b6f983bae1ffa03f65066d9a93d4284bca5862fb1868f7bdcedc23d52318e173fe260c9d2c89f847d4b89ced24ef2f75c4753ec6aba5314054270af79ed20ac50bd3186f424d58457818ac13e9d83ac6ec83bbac20985480b58100beb265277969428c77e9d9bf994be19a8b3ef716fe2b66623e4811f7299bcd824057422203dd17aaf44fe857a540ca28bf4eac494e5409a6ac2b0dbe4c14b4bcf8e216cabc87d2fc13c9c2cf792a079396767ab0aca75923bb346fbc265d2ccb65c6517a806327ba3720259e2c19548be2a75f2ca6b9b64046c0fda77f8cf029fcee206e4f9bf99d7103655f2def3402f83cf769d3743cf7fd24f7aa91d227810337fd94d41c9f3ded6bd3c75f3b9c1f39fd1ed4f62864c4f5bc65fe483de8f1428e14b5af3c4a238ced46775136a63cd397e450dc1c70c42fc5fe323d1a6dcda2ad4b8d134cfc28fcec494c7c7c31159dd3f03dc6e0f74875ab7b56defe0fc00f8c9982bf0a039a36709b903098cbe1cb9272a93c24e529cc513cb4a92ae769cd0d5113d8441fea3bea16db5f688cdaf3c756bc92a705a4bc1a081a1b0674cb9d8b884ba7faabbe1faa4df9c9d7bf4b7fad257fc2aff70655bd78ebc16cf7613cc7dfa9e05f60c0fd69520f1d9b7b9e21872d98b11e564771ddf3c36ccdf0617e7acbb1afefd506eb71df728f9b4232a7131d73d1894b021f5d31376c0f6f2a1be7ffbff7ddcdf29fcb838cf88f83b47f579eb1cbb91ec61f07959f456434d8137f37b7a2dcdcf5fd43ce95c9ecf74a84876a62f2235c225c7b6c98f5d01241993be22744e01a9250dfb83f071fdcee02b758383d20d4bbf7646e587807acc11521135da4cb3c31ec9f86982b96df17e02cf6edfb79800c62717fda887e9cdfafa4b40f728112c625f85ea1ac83d7ef0bc64fbb586e8fcf26a0067d035a71f874a01aed9d130ad2dc7808ec6d6cd1ec300556a651f48eeb8fe829183dfd688cf42af325bff0ba9bd8219b3cad937c2f455e3cedcdac6bf4e777e45fbbdb435227f79bfbf611d9edc657e9a273d56e61c4ad551849fbf77963d825f8d2bb773987eb31f251b09475135e2e069a9f01b1ab583f0216fe81840fc60bbb57b38128c42293e510799d3517222d97e40ec37cf61cdabde7ac3a2cc739f743e47962ffa221d368cdc9cd41001f2996c37d4a91f7011506c1dd2c80fc68f85c5de70670bd9b2cb7c76ca176aa9b97b75fb2cdf98d036dab32edcd0e8d2e2c9d04b3402a46a08b2404f908cfca35e01b5c1bfb8db50c3b6b4220cdfd3309b9dc3f2c57e69285a352feeaa12293141b76385fbf1b7e7e3e95009cba03da376f227870d92705871bca666d506a6a7d294b62e8032525f63eac1cc43c7e5856e1a34b4f8cbe59c988ed2f96a4d8f9c17214739f592631e9f34b2c9efa18c41df6f3c130ee36f5832d4d71e0c7bc6ed4928b5e9689cfd914f68d99b67840f3e729a178fad8d214871f59ba62f00d255b6c7da9a4c5ce87cba198fdac328ac9cf5942f1f831a5218e3faaf4c4787d0c2bfe33cb20a63f6fa9918e0a2e66da86ff1d3706c119e436ab8dc916ed46efcbe91a1ea9f705367fa7e8cedff0002104def56fd52a9c1c2b65c9780934df55d05f64ecf7370fd7d94fa2f25aaa8a113de29c8fcf2aa52f13fa2dfc8f7e3fd2edf98bfd447fb3d5801998ed67690b82f4e4354dd88be7d1b558820b10c69ec690766fd2ba3b7dcfd494c6e96787fd9e75156a0a3f37d0c8ecb547b697d8a7b25812432d8df146d6e7c0ecc5e1f7b019f1ecb18c7464af576dbd59bbf2f9e0ee89fed9bd291ea7f12cdb0bcc0e9cb0f6c89cdd0abd3cd514a5f48e35a5cbf1b09f7770e10b1b45d507c63aadef2dd318ce4b071a7d487fabee2ffbcbfeb11f8a5d5e54a11fed87ea598e772f5268555a40c11b9caa8bcff26e815f2fca5c06cd83f50429cdc56a5fd0d5295f36606049e6c4730b7a201fef97b48c97a9ffcc6044d7594fb3872eb60f7e9501503c00b23ae33dd97d2be128966edbecfe2316b329c151083044a81bb24140b66d7aaee10d18b8fca84b915c96a091660275d9fb9868d9791bacd3e2a6300be0ef42efbccbcaeef73cfa224d60e920d5e5e91454df63c2d5bdbe1c00f99a9a5da94fa3cb4fb410e0f2203113661c9a4139db6090b1dbdd9d935f952972a51e4485e5321806bb61a49a481d93ae33cdb4b75283330cc3beaaea29acc369d3907cf71d0a0ba81e3082c7c3790ef2e4a94a0ee47e69d0a07938d41c0eaf830a9ea862f0ed2d1dbbe1cc82bbc82f8afb196b5ea18c1a74dd3c9fd457cec3c939863ac4293146c34973d147a505659aca9e6bad722fde7974f505f7a9fe8f8ef759588c85a15d9ba1dec516116455ad658f7e06d432d7590ffe28fdf99b085f5b683b96bfad6ae84665c6dab84227694780cd1c33e98e2a870c4e58fb6ca713ab77a74429455013230725d4f2d7d5ef915c2121e3ce6d31ee1bb8cddb4e860306645ff21990535c6a380f9a297a76f1a620be66e5ab1641ad60ff800274262c02272127d2a1c1813da0531c92801297c2f9b445610460fc4b0e72671c9de5906696ff40c8540c016dc40490caae101b5f0a767ae69280e6d006cf02ddde4e5325311329c1e1411ef70c5620f575810a08ec00119001c41a954fb9effdb87f2f82755a9b0c4a5a076d6107123226866b51a5ffc707c2adefe8094ad861176201f3c0971cb9535c5c650fdd6ee499434ea5528619d8a2f09b2d5a133a8bdfaecaeb333f78d95dc2c2552ce0740476ca1c996e8275a0a489aa35b1354dbcbaca11043ec884946d34c1f7b399ba4dcb3f4e8204c1523912b547ea395801c22d80d25578ceb2abb1112c5fe3781a48b68dc5b1cd73286a5599208b4a9617008237e620bedc085f477286b122eb0b3cb65323dc8ae7c676380ed2e3ba6bf1227c31fd6abd122750541434585c1bddcbe04767a83fc2463deb201e60a70309af785a7dbf76e6cc92755d408ed040a334aa7c158a9a5dc0828f04358ab7ed620ef81dbe13b758eca0ec23a36c400a88d31d8fec68a2174e17fe6c0ef33ecb550c55a721fa60e0ae008c1178e4534e5bf1df937d85d3fbbbcfe1cee40349e0da9e7b79da804af2025b4e6224697060edddb7c04eb13837870d6f1fbb973808fb5eab011a88b962fbdc0f5fa3f035b9b988c1a8f6bfecd01c0325375304ced071e230a395c4afd94cf5e0c08bffb6e6e3485b1f29fa99130e4c9428a2dd49643b372abfde16ad207c209981ab718d23444e655ff5e044ecab135bef2c01646554e258124b102bdc15ca13e4fbd94d1dabbaf83bf796d6fbc26315bfd945762b75cbac037e6d70cd3f60cc902008afd10d2388fe5c171f17fb70b97c6290011450f7e141a7c61a2406f23a603edad1646749a794197e1867cd78595699e83d99ad7b7a91b8cee0ab157f43d2ff51631ef0ff1fd503064adcd34153995a989a7a98cf7e783f2300bf7a97b5db895a093865a99d61bd3b250135d44247bfde652d338b74680cf638c7b42ced7e21a1024cc141748210334722985716917de8e4b23f6204255259acfc18133bf975cf50b09965603d40b43497d557ceb3d4dd1369408bc48fa6a902700c264341ca68af664721050c2c5b3c8735ac606ad6610efe68d3f19738b1841042ee5965cf3356f8ef55f000ae18c24974159d51418d9c524c63780fa5d0936503570c0ef2c48b6e9ea27d9538b198c452a71bd6767628307959f6ec029b66c307805dd2e1347a78b8aec45e84c728b95098f5065469fb8e10216fdcfc0ffb282ea53b568590d1d795bb6e0a546526e9b322ad20d64958ab6becb8ec574158e6c182bc3b3a4b1f8fa2631c5125f25fa5d8ad3f98e8e96f858a83eb3806f5764d485c22e1129aa0c60dec841ca6c4905a2538811feb047c61faab24739b6d8e825b736020462f5107193f591100c0ecdc08ec4574fd18dd2b26ca2deeb6428a286e5f6959b12714b04647bc58c44d02bcdfc00c3d37a9b6f85abb6671b105a71860891178328ab35f52326eb66b9aa1437579b5cf3c4516cd38df896bdb00a348f1fbd74cf3e50255d4da513d53cc4d0d36b5c9d97ac1b234a157baead7253374d3c7c71dda02980043a623ed40e88fa181a72955234775478647e4d2ee82dc8b8fbccbe769380a4de2ca957533a8eb6b89ec5d6aee3f98a4e0b989e6c5c2edc9cd566060d3404aabb8ec3b52614ac2f80b589d2a0911327a77754be1b77b03c3ba995d7e1902dc86325f03f013459e3149c7ed320990ec20dbd4e46cc881e0e86e969efd9d14d3721b04c6198a4ef4d48bab3ab3d0edd76531bf177f03dca2bc32b637c156e883935715933dbdb5308fa172d8d2d944fcb46f2db68412794eb56fda5390205d65a82d0743a4631dfecba1045b112b15bd70dbf0e029a8096dad07cb8d2d1157830f3e38d7750a4442bd7f69274ce52692a18cc53e55b25b54aa59b325bcf500127ed894f26d7d1ca14c5ef215902f7139594b4626736218b5bccf0a0cc0098a0c980b21e8541c2333d00fe3226e7cf3d46476274feefb3ff0297f4a5668073b79f0a18b10cc838994987534e19be268df70c2c01cf7ffa1a8d2472feea841b28b664684ea090def2e2b79305825bdd18db9b79ef9d55187e463875fc7f242d500f07e0e8c889fe684208b269ebb0a8ab07b1320f7eedd3bd6201af08c6a4e2cc6289704f8bc5344203bd00f9ce653789b7b9c57de809d05a529574e7fdd6d47d00a347f22cc11913d4a54a993be74fb65affe68e1f6bc24c8f80347ad262d61a14a57d03a94eee9ae3d7b5310d3383c486a36028a974d4216afb5e74acb5d94aa7da243b0ea46747e7a751b46967b61537089bd07a97afa9dd439080051c4c7adbb9159b4106d322c8db38db0e80259dced14fa4b1b9a1448f6b5a957a0444b6547412c6154dbe2d769cdad9aab6c340a25d1911a9a1839ad2297eaba8d206ce15497394d3b30a2461a29df0cc03e0cccf19c1d69d52b35eeb35bc50126eccb45c68716e39feb355042d46d642ad3d361c1da2333441dbb8afdf6d17c46139743ad8592f0839352cb07bca290a62110d0ad187b54f8180a1d7fb3cf40fcc521eca405874f2c475fb9cde2433f72a816203f66139ba923d0d8a188a6b0f335d2a7157dc90f68c1463486d62185c6ba6768c1fbe64bf73ffaa309c23963687cc0a6a20540f4884a39092645b2184055413475827033bf6696e31fd05c43f9c46b372752d3d15f45bd7608738d0f422686a1c70a2aea1588d0ffaa9df6841d105554ef9a1f9d54866659215b46b93affcf12aed0d323ed92240ae725869911f886d976ffcded7b2f6a6bddd20ab48c85224f2b72cb608daa6546a8e9a280e3d3e4d3d8bd129dc592a0baf1d241316a3c1359ab12b06c80e0916db5b701749305e21ddf68fee33dd98bf3ce8ae866467b66215230d20b0957f82cdeea65361daa79d6485b0a42430f7e4488da2d074c72e082c3c83630e252b77d70197ea1ad1ed6452939547e44bfcd9c38db789ed0aae1762af74807810d10b338b40147c3d88f0c28e6fd2eb6d2f278f0287cc90f94bf0ab9f61f21ea037ddb6f698da0c50690c6ab242f8427f8d235ce1fd285d3c10fd95ed1e54b5a74ff8dc58e1350a0cde12e29b9207e7d4ba6a909599e9aa1ae19a1b4427231f86142b1db01b382b183c4569bcbd62eee8083d0ef4e2f0d04630898cd06bfc55c6ef7eb4855e85a726467885bce31a37fd632637be88d1f2ae0f09ca2c6084dda1848f31d6910692f061d8bb71ac7b9d57ecdd3674b476061a47877f1cf5ec7db0bec668f9f4965d0a26ab2824ea91c41ee08ddbe0f29da7938030d867f9148f3fbb8a9f3c74809fba3014090a264cd225de493a6d30fc8761d26b488ee8e165d241506ec9a946ba1a79e69bf73153ae012c5f4bba628a66983996d4bded61c1b757589075e651722167e9eda52186c69cb82c1581c0288b05026de05181a8a1ebaabd089d141dc3dc1eb8298258675e2bb344a1aa6afe0000536ceaba7848744a1ecd0ae9231569b60ec9b008bc44faf8e1436d085b0243d3a3c0edbcf351e036c955fbccf8a46b672ed220d17827805a608144304d993d2e5379c7454932d85fe170671cb6e9ec0f60a299a7a2739c18652ab56db5015206906b24080b26c03e2b2349396e14a4c058db9698cac5dd8ae91f56a6f841003b2293ca98d2ba57e50f3e2ce0f1bcdb248c74e40929767560a10d128d84945a2e21930a6958fd418293611d0822aba789da33dfd99c85391875f71ab80cc00a0c254d974e24733eac4f25157beab80318ae104f4306719d55fce509ca5d1ee5a94a6cf361bb01b77c8dff80033098493719d5358aa52de40f19e4a4aba45bd4e855acd422fd33dfad4c098222a1da1d7702e5427e962d3bf7d1aac1a1216c59501d7577c0d6d04bbb2a294fe78d9a5486ee4985ecdfa096eac3cf34b8250b581114fad9c0b6c60ef6a13e4cb16210c68e394e414d54370e8494ad8b63ac21748052789c2235d4ec859f892f49434188c4a6a12362c9b0675b3e08bc8df97dacdf969bf30101ae9423cfdb46efa76e8b692acb69b449d456a3d240eb133534d20a9ad9673f9019411ae9219694275e1e667e534e78968033c5b1fb31d3158382341754d001c3649ba72463e000910003a3bf409338d3eebde296874eb65274cf30dd29a6eb0e2a0556a392b8041b75458bc68e747e0bfbaa05dd85ca6a25b65e8a5030c28a79ff025f3c0d0abcc4145536a19e205920c7e05a2d28f83f64076bc9534031e52d7115169f1f21bb7942506efa7f9a029aa51c0957de5f30ecae91cdfa9ca308ef76708b3657aa3ba2e47037a2fea867942fe382aa2668ede578574a71f67a93d0191bffeac8a56f3506960845d3fbad32210714d87c729e59ab0dafbeffe9047310055a047209ad1c62ee4fe592a506bc06aff256003d85173fc66ef080e87960f32600011dc010074006420bc0e9cd084eb24e2ae9ec8b8107b91bcede10695c14dc95e33208a673019c458ba22659afa5d48193a9ad474470893d998645aba3d81c95025121fe1c32cf8a13a36d8c33614f32653bb2dafd6506d0a6a3d2c63a9529633e94e100c9a0e93e12f986d8378bb4c86fd60971d1f2f262ca3525143dc1dc64c0df4f40811736980cb203563d1f9143290ed58933ac8a5bffd47ffab0e5a668e94ebace6947c14bb2c88acd169d4fb5fcfe4134d6ef597aef0bccece6a7985381024150beb4f79c90a2dfe34a0bf2bf05e57257a315d9e2a63baaf41ca967ef19945055c606ad0b46ad1062c4073415062e876789a88fe915c460ad2b737ec09aa8c4a46ddea3fb8e97f7321ed2c79c5609a047cf4034e27469c12481040969236f7e5b7feaadeebf3ff2d5a94fd7bebb6fa29a05640550442b66dccb666116b7fc9955b89101e3c74cb8f78ecc333d5cbcd95bdb35c8cb9f338db2d67ecd888689bb5242b19bb1046101e637cecadc50cbac7a01d33241248fa735b78db6bf7ad7356e4cc664267bef45054626ae7b23f99ea0c2bc876ef7bcbffd59f6dd2a882842bb67bad7508a1bbd1899c533b97e584c99243a687fe151028b57341a03f992a6ae6aceec9099383e54b4e4e182e39a16e3a6342595208a17a4ea11003288066ee3c60021c3291c8984825a02025270212083dd72b44808516042820258507a470020b0ea0400356306131408512da73c002d098cea44e50c0732d2501cda1fe32934443644a23116a8aa420a02570000ea16080de31d5d0e9cd98ea9f42212ef35cf3d447394e9a504802245060045409056893e9c4000294a9939248a6150660e79f1820c20902e0d093292100280070289442081d01104cf8200aef9c70133a9952b3019f08d87008de548f036a38f4a250a8a2463ba1149a6f4025811048a9012635bf334b37520c314300551e59e041e593491f2db0508115544881021340214702521e7082031a6002034a58800212700003e09030420108300011041000008400c207513e379d78b9528de04587339f360450e5e1012ba8541f3cb2250455556d024a0e6a704003386aded0f24695c32701a0c10714d0729345119c2c8a9cbe9e94c822c4104b64913242085770b08001421958ae00c0930a4766f1851755c585125aaa24b4a44ea3aa4b95d3974a23291668292848293da9f4a4aaaafa2b9c2b95991734c1248d4a0dd6428a286af082019c2a8454a81388079c74c249557d36a9a2aaaa103e96843e9a6052559f1d5476f4b1a4f2f28fa5aa3e3af85c6249ea64aa24079569878413039aaac2c01dd5070737a8aa4a0a1c0c1ca0aa2859a3aa3e9354644aa9892a335321d27ce186172e70013e70621830a28059c010acd8200f49aaea130924a4494da42c55f579c410470c99a969abead308238618b208228a18f241a23a7d9951c9d425352a8971629c0c3b158d0835ff64b2521a996a6a54a5aa3e6becf4481bbed8d2a7506f43557d1241a4aaca9c4c58d254a9aa8f1269aa800953559f430ca9aacf1b35a82a1a5455f529e4434855d951680695959d7a43557d54f01944063553c8a0aa3e820412831750f1821e18982e207f54d5c78f2f5d5a4bbf80d31187bbfa9d59ea0f73c247ea3479aaeab3c7a987e4c59246222b9f34d2fc0c4754d5270f3cd27c99d5697e8635da43f3b6a444654755f5b9e3634755bda0f252071c74cc81b3723e7254d5270e1754d5a7057054d5e78d0f0b58993a536054503d894e938efd92182f261dd2fc2b261d34d2927a4c36ccdf999244eac1d266a64c0181403b150dcf8e189e790af366462893290cea1f0b99d248e777469364a5c7742a89499d4c3c3f8cc0a02cc9a4e549749a74aaeae30689d483e5942a892989a9aa4f0a50c084122768838d284cf059c3befd92988f1a25d31724528f4e698ac2fcc97432f1984e5e52a8f95c5254aaea43821d53699eb0a44a4f77becbd791a98634a71ed4fc53989269342a8d762c9527cd511dd91e1948a81199e7429a755412d50ff36646a99efa51a44625317367a27a66f8a481465555694a547a85b80268a7a2c149c10a9c14ce54a81ea64c6166a64c49010329b4ea6346559531029408381480a2ea1a28e08502b2daa968580d287883dff06e7037b41bd80d7d43557d44c037fce9b5f4041a990021648c71328d3e210081189f30c0f8c28b2eaee0e28a2daaaa0ae1f381ca8eb4c8a251701458c0829a4855aeb8e28a2baea8aab0a4910d55f5a1e2af54d5670a29ecd3402245619f4482e2d24022512191a854d5e70954557d9c28f5dcaafa34515555089f0e5476b48589aafa2c5132e93c29f5281433832301107022f0c94789661c789c0444a26a69e6e90823aa921854333353a6b419184cb7b405b50586d27339994aa31d184acfe577a60e9ad9e5776669a6a685c16eb1a3d0e9a9dd3265ca8ea9f476c7543a994e278942a12c6964030c17a85fc3884ca9074ba9e7dabae5316ca9d3f492c69aaaa44e93c76e49634d556080a1d9059a8949a14a262bb0b907f6a4f932edf5d851b31e9c074cf1e121f4a9d1e98c9d7faaaa8f0676a8aa8f0e9f1cdaeb6933219c1322c139a1109c13f05041ca949d512a74ff94c209632a1e14ec49d5af0135e2a1821af14c32a5118967678472000b73c6642584aa4104a70165e034a002557501d45b5309c78410648101c78488c3003a88a88ad80010257c5255d54ca1bee09440aa4acf43834907a704117016b04405ab1e051081938025aaaa66934f062a40aa70122002ea04b22134380888a332e120c08b0b2ee0206084aa42634b3806a803c7004c849a5a70702ca9aa8f97aafad050551f9d2e55f5e1f299a1aa3e3254d5678b162a3823d4a0c219e10315ce08385455a580ca022b3ca0aa2a05449c11aa543805f8a4c229801c154e01c4a8700a80a6c229c0970aa700acc22940032a1c026452e110e08d0a87005c542464e248454226865424641248085bc08831e99cecac62671554996a225511a54ea32a55fed493ea498d4a3d6446280b8c405250f3e924a54e232a654a295115ce80c8803e8534a52df3f4f3249d73ce39d75a6badb5d61a638c31c61863ddddddddddccccccccccab57af5ebd7af5ead5ab57c718638c31c6082184104208a1bbbbbbbbfb7befbdf7de7bce39e79c73ceb5d65a6badb5c618638c31c6587777777737333333f35a6badb5d65a1c638c31c61823841042082184eeeeeeeeeeefbdf7de7bef39e79c73ce39d75a6badb5d61a638c31c61863ddddddddddccccccccbc38427faeb1e69d2d38e044e1a9aa6a9ede853a72a19e50510850e144a9a9706e2ea9706e20a9706e14a9706e04a9706ef0a8706edea8706ed6a8706ec018800044b04f32e95892494be97f3863227d9534a4120d6264557d64557dae7cac54a82f55ecacf2b14095667231e9d817d5f95f52a39d1197aafa5089a1fa60e0a6aa3e307c5ea8aa6aa26c9560e42845eae9923299be7c0ad5334568febfa074accc2a3c3d654ca8d268ee9850a91e8a7afb4fcf5cd408cdc862b15f3a337950a74f33495248d392e683f993979d4f6df95860ca151aace8c8d0171abe7c9121c945cc151aba846ea0d265ca944f4d3293c774e2e162e6c9944c2418c8cc305ebe8c290ca9c79abac01e18763eb5858c890403ecd9f2a51199920c65061552a8aa0a0d295547000a1a1a42a126cf27021f0854b334da199d2a6a647750f3cc09949caafa7c3e365555c30c28d24ccd5bc68482410a0b1798a969513c28fb57aacaa607a15415ca93419ad993e90c0a35bdd84f997444a98966747fa70765c3c9265555418702636715e81e35abd859457ea92afba7aab223530d7ffa1e1f260f0deded20c76c0113ba22c76ce14265cb17092624bf8809434527cb16301365eb573bb41c5c49994860daeba92a9b4b2c499948603a815515e2e19953a64476ae4fa82953423c9cec549b4c4203099be850a14ea0d488c2e610aa02e1054d0421611309a0803a8150a1d3f36882475555204de2a8aa0a368b09010c4d46a8aa295334e1a10af1a0a88c495345ccc8cce84a89caa9a756934d0e705055a4d3495613894485861e00e043060c3613a8914155f3c71e357684a1831be69f8658848f1d2441091e600c81c6061e700134526c0833783ca28704a45061882a53325032a290150c3180154c70e4260a2984984198461a00c88906428861060d32c490032342ec1c32831955151f21dc910b2c51f57021c4a701a0442d365923083facc04307159ce0124416673e5803022f0420884a459938188085058270c10b1a578a4b3801a29301d4e0060a933b80a8230067d841c70a1008294260a2cc1f617800040e22a88265014a6802444e127e78f1c307a10d5852460025f00472d9c00aae247244059ec0b281243e90d830f1420c36e0e50f4adc142c6ab00106402221b0090e1af8e191246e4c6021cb103f94c01f101220fd0f1b68a2033cc0344c3f600180058868c106277e20018c4f6e07d0e0496348bb2300677ee892860c29beb0001578bc90e634002e2e8c000c4e7301460c30448a1991060413aaf0a183263568620084e391410364d07451c5126c98b1c64043a68c292a84d9811b681a0778406084393a3913ca96185a245ee870068f295ad0710321d63853053d001770f404ce843e615af0e4089e3329fc61a60917b8186366078554400c278240801917c891480f3f4c16986182cc2339c043c7053361c09c700318303861464a1521d2e012ca203d937c4061e4007a5cd2d3c61fa1e89c09218e1e22c8780150b143a6470610089288173504d083001a0e1902e5820ba41611a1043d470f6aea8c2c454c02832cbc48f5c4c00f31a91f1690a2d2e3c3219ae0718094002a69c0153690c101d420373472469a2f37a83014414104ee480182227d008e9b539822508f9105480e66fa40d9e83c8102222480531f326c80121ef019272c4a79306105264c9ca80b4008c38a26829c5a08e5b4c5179780f1619350e64840094f18e2031ddd10f961068df800050a5600ca143894f1e1062a5c602a07a8c107098c000539aa4348e0a90465daa25961031e15a8300104d06146181e24a45072858b25acf0786180184082887ff09440c71b44e0a1c3102647b8b8a28f9d04f0615a2308e9430ece0ba61f680827f8e0082b4cd284292b94e1c28c690446acc8c11b41b050aac10d0482e0c14ca43406179160e1491143947c90e14b229f90d1a26401334e602d9ca2287d008112ccd1813944d881411b50380bf8c1b3c3459804b0808a4620d9b9659c9147151a28d96908d430650b940448a0d848400a4edc70d21dcd0631d8d1891d242aa458c107e01d3020edd0c60e7440218211240ad021c413c00baecc0e6cf6d080c9ae50a6053d2002ca101f98516609314370976141193067b2c024851a569907a0200707c8b0844b0f92505203937822003db051496bc14310420f433c22450b0e1fa07ad882440981fc50268a1e0e302241153c6a1061a448982644605c19646486944406d0c7944b46a94816308319d031a318dc50040d3474d41805400e323fa421430944322093842770c8608c288c07784143b9a24554e6f57050a60c40e4280981053dac9881a86689406c08e18c01c8f04180132e11410e2564aef0c104636ee00026c84c4ca050430232084286851504f148942b1cb89a7882c5243d7401ef1c34911cb0608d4eee133df4c0915011515c1b96e0030526f043841b814006e1240a01bcf03978400bc6088166be1b253c02b81349fe882c488c80c91d37781d4202d109833ac02f208d1e42ac4461c53602c7268a3c119e55e30a1cee1b8ad460d3c8037c596ca0b157dc4a6a0773d8614760c16da282e88b5a882235dc502586506a08d84083650b325d79a2a8a28c1a49c851a70cf1453e22c61f354a8fc02791640c0a48266042954841826e1181137af0482508fd361ed10289aa0cca3b20f103209512d3133c02d9848d26c2b4638a1516a2d0619039051e0e0e0c048166ea806202b4872798cc09cc21080aa64fe8e04107ce0c12386061c3031c11b0614a0a9774c183123a688094a0400978f832460d4d7cf105131e1c20031be41e29c04128924312290380d025213614f0482553d8a04048082740b0801d283985b4f01891c69137720819e00907f272851a1a48448b98044462c3101a28e30333d0a800870f0da4a2886981871a0ca281186eaee47401e20c0d00008c9d0f1899383b0842840df0040ce8d9018c8b460b3b90a08e1d7a7841112d1e70646787164a970f10f162c30ed51e3c3198019546073d1261c024385f72d0c10343686101951a00a1c36c303ce0c796a543059068116864045d72d0e4a383242890f2420e72702103983a20c12207275ab0a2020b04c0891c6ae8001756b8600110e410811082b072c327468cb9010d68941c5af0624c0a106082039123c41823ce68e96439a0c774694204999480070d631420c60dea38001818c0811149e0189951021f3890808a0b053013451a38a069288cc1c9e9121cace83009252da420070e04f08404345aa8b81b08c183067680d156b801048130028950810537985430c2a4aaf2821be2848014952b73c34d9736506c874a6c000406153299a3044ed8a0052805a8a40b4914b1c1ea819a80027040840d2b8c4cdc3040cead81075cbc81831b535ea8e10532ac2c7658114a0d538430812f6230c21e35e410c30b7c1ca18353030a7c84f282238400622ee1d9c356c0001810c38248ce0804cd097a88e1c0974a0ce161016288c9400d76900036b04822a601559cd001377c408581c49005943ac144873026d892060a56d011449820aa90400c25be0085c9226ae204910b0a61705600801deee03901cc219af45042d8a86044c0c90e92a4a1030d60502d28000736042102181848e004097430d3001342132070410a3a395f0211c306af02421cf0e58b320500800a38dcf1651481d3ce0a4810bf3413a06801e8923bbe540910c01e37c841ca401e6f2472861cee870c5881450935b415f0c8000f681621810e313b195821871a144411b3012f9920e0039cdc5ca15ee240040155bc2e4cf0d2814f2ac980259e84bc88c102851a50c08521bc4040a68091245ca0050d9488e1024064d0831c684081097c8880042d124043116a0c7203021c80041ab87069c2005b5470021a120002317a04b1620a1d461a50c426875811810e1a3c1839e1812882ce19d00a0639e48e1774aa3481c7198e7c61750680460acb942cbee83203385480011e3f94d0450c50584080e849962e255a4723517072ea0269f8d800039d64d2e5731a2971e7145cfe7040cf183c5c98c0250b4734e0801dac81002ed5068e3832c70eae7071c190304a376eecccd049105d2ee982071b66a8c3c230c6912e0698410a2fcc889717ca98614c0936e8a1844fa8cc90b388124b1c200f3f64b0a40d12e990120c32ac6005590ee08120960c49cc18983904943864c8800904788110f6033298a0012142d0634a145b1e7984c108030fd4961220410136da0043872d407c30c60dc2303bb6602993024bace8e0c516122ab103873f82e0a2c510130ca2c902f048a3858c4cd0d4a1081853cb69071e38034a8844cb0b55854be8d0610c2d2018a104265cc8e0802c31f023901512104609b278a10037acd83032218b08a7933fd24869240bab324f777431024b28806c310921407cb0e041462311c092071758aa70e304278852520096d013952c11c21a39585480018708861393484c58111e40320308c8382810890b0fc029423251880f8e8482848d0c93062629e88f93529a588185146ca6b832091a2b690ae9a28d2b2768c1e68e4564d0e40a1196fcf14117195071650606383208239578b98200351c80e6044ec46065911b1ce1618a172a2b67c8b14346078fca8a9966431284805159a142471a578488ca8a0865329940abaa2a83bc51c709525455153116178fc45055557618608518aec58c24555555b1012324a58f3e1e8b1920517100a1024282084e7aa063892862c0a18a21a7c280253892c4803a814c239b1b54950d25556533890d6a34d1810d18a94124122f2444d291e49000c927555591483d2529539e274d0a124220f1c30e48e2a8aa4a0529535860210548ba80444a69a78764aa52a47c69d453ff849a29342f22633a9d7a50251349855b1ab5e04205a49c4c5274a68e9494894c0a523e352a8dae14d4a74c69be8c0a5878ad1e1d5a586bad1e1d529042329129cd130f11086207167898c2039952fd1ea8494a699e260f161a641388a8504a21cd69864e535443a811e8923e940f02d0081100e0a2919c0a75028520499586742592aab281a4aa6c1e71a4d2a1e7747b4a29dad3ac6791105495141616b1a25a24c543088d28c203c8a005e2165e1045dea82a45425049a108123b3da557044dc53377141129e2a5aace7c49910b289242552562852223545212c12455e7698a6a2282f020450a99d2c88daaaa7890727a329f2a8d121141225ef0c08394d27c92c944d3ccd369dad08090aa8b14891c00112fd5690c225654a81348949a3c2ea449154208ea9442f57c91224a4d1e2924129529534838440e099c0eb9b9711140200a1b86a4c020a10629d0008b423279aeb514f246216f54558542b39a284407d40914b28f6674eb28f53ba2d4e8345d20a1105855550f32b899a42dd123870a581e1b2c2cd8800e0241c00b3cec31c8213f6cf1422499c41087155e3c720128d0380540121774f1023342a8a39221ba8840834a5ab00318bea0a430e48553164e6c52a5c4c1024f1e4748674592fe632755814bb4e070058417a0e288e2030b2558239312dc012fd4f8f1811790c1850d182875c0881e70e1010540501d4811a58e00be61002dc6d0018c01f430058607843e70c4eb440e411e3083e9880d30e0411528b040009e038cb038f088217f7c869092091d66ae20f2c80b34f4000a4254d8c305142e60821561fc4065027c1cf2e57306088e25001ffa9832a5226106241206f984844116a9aad4c944a9787966aa0a06116aa2bc54a9a534282aa81d32a5512da541cd3493f4b674c6644926530d85767a4aa12785d29c5221fbcd7a44299eb78290613d76cb5b93151202790202fca5aa2ace404dcd076df0b188223168b60f1800c287cd1f367d54950d1fa813c80512cfce08102da44c41d92db7b485876754068c2d99aa9c799d33af63ada572e6754669489f9a23fb3b3b231e7890723255fb684658a48076e081cce8da9114501ad4e4220564bffee94c1a3a3283e67b76a43ce50185e2410a08a5020b695229d83f3d8f14164615b5a5643a63e2623285d9319db0a0465c4c61b6a44c3a4fa223322392b47b8062c91e8d5415097b6cd903850a4c99f93680a490a0471a7a2051551290929a52a44839f3a59d47a126191daa501e98bca8ce30a5ffc174c262dffedbd2a8a2fecb166bbf74eaa9623f551a75b12f424d12982f2531010f0d1b11c8efdab0beb6b7b5d8d66dc89837d2c5b6dd5adcf58a9ca120366330b69e47c69e3be798318cfcfcd66a7d5a0adfe23f6c4220217cf7398c6f7e7d7fed93d122424d916c26b001816c8eb0f6bcd3f9aa6f99c819bf35e93468238684949f5bef5debf5aeea4c29c7546cc290eb19638bf67abef5728b9c9d6403869cd4b27e0c72a4743d84227f4c594f0e08b4188f61f3c582cd5c6bb075f3c6cdcf9ba3f1b95bd7bcb7353391f373ad0504ca09c385dd0b69fbd9e6703ef6ea858f899c5d0bc84a8e951c2d395672c0e484e192530504ea2ea4bb487fc6171d17d2bd3b78d9c1cb9c9f7d0b19e37c902be5bb1c5bdb784ca72b20108fe96463d41913aa29c2e6031e5fbbe5d85a8bb1766eb9c62f32eb6cb98db75bb322e71e5488c511d868212974bb2eb4fd7d6dfbebe58b172e393961b8a0619385848f36cf359f4fd7b1194b8e95bb859bb3b0c142c6f5ae3bfd0999ba3add622f6cae90f0da6ebbea6b70d66747a5f9193c20d74ff7c60eb61917745602f1cc1db89ab0b142f6bd0f4e786d6cb65a73a8641ab9b6a9425e66d5e37b8c77bd2f17796871ea6442351b2a245dff75fabbacfe5a566ca6904f197eec55ab856db1863b3652c8559b8d745177de205f5bc6260ac9ff1ee372b49943ea5ae4fcb88b0d14f2237d2d3ec61abbfa6f8a9ced97ce9842769a482050eac980403961b284403956b806100804fa6c61f3848ccdd158bd36767fd145ffd48332916a087688a72754c6642279e784c99293811c2b395c72c270c989d4bace9890191b2764e55617eb572d7f8bec3521efb290758cd439dbb499c839c77a4fcece48840299c9a1de93b35a0724b3bd6ebf46a715399348b3b61296b66142f2c706ffbe45fff9db1b75c68484b0594246f82a9bf1dd0a6343be87d828211b7dcf56ebd67d85ad2d080402350ef124361c90916f6bec36cbbcbb9d8a9c43cc92b049427673eddddfaeb5b9c54ee40c8db04142ba0ae96af73668d9fb7491330bc2e608c935d6dbeaa5732e6ad714398762d71c6163846c4ce163ad32b6e26b77ae16d914217ff2756f4d66af376fd58608e9ac65b1b20a5957be932d5ecd4c674c684c4d0f6464ec36b595b668e95fbb050442bd538ac7d68422ebbba34e1fdec8f7170545f66c6bba67bff63777f713597d3da5163aa474cef89ec8f98e9d61bd8ecdf93e45ce31274c961c53aab425cc094b7d1e302090b3346a78209765ecd85a7f27f3785fe46cbaa518060472ee4cb7345aac33265443444d27923e84f5a79bccdd8daf3991ec8b7b32fbecfaadb3c8b9f4a4507d33915d0d41dee479bbc7edb16b2d46efd8dcfa36aef03ad88d17e4d64e291e4d24d74ae1a3d54d47a35b3713b9f8793abd975dea8f564ce4fc6abbbdeaac27df5877202953a6f471dff56b45aa03c962b3b766bbd0dd63d34be47caefedcb78b6d97bb25f2616ce6e7556d83eeaf12091d5afad8795e7e6c5d0e647c0d273b7dabe1737438900c1d3257296595bdb3ed06d29d2d5f303277dfcf8d12692bad97d2ebaeddca964d22fb3dcfe8166cee4137db06b2bd3fda2f2e9644beffc9d87cceb13d7e24f22be3cb2c4ffa17be85442ea7b79b9df741d63f1f910c29846ced6b35d6161d91d32ee66c8bf1b5661136229939cf76d3d782eedc12398b52a3332d274c96343f837364cc88a4cd207ccf8cffad45e722d259caf5da189ff6bf0771a85144b6e8d7c6166f9cde68df44644fd8a237b662fb0b694444d658e1dfd9956f645adf21d299b1faf77d52dbb8a921f27dec8fef785ea65c1a853e35b906adb9b386dd60648cad1597f3eda6ef2bb3c90d23aca1817cf5ba56d99b0cfbdeda22673365e0ab414d2192fee2bba83b74d151336542773e29d4b886195cf7514388bcdfeef73f5bdd7ab3d2489aa5130df64b676880ceaf46939a1948c6e8cf7a99d9deebfa45ce21938583c88fadfec3c99ee96dd744ce4fc6fee9775c9b6a6420e36d1f21f36e8e46fa6e8d20b2d9f698bb9f5fa3ad359133697e0a152a43eaa161b8e4a4d07caa143b10d9982d7b9d83ec96df9f3190ee2dc3da95912985f8c958399f8b959c1a72ace4cc90632527d5d305043addfff2d6a403028140a0c56dc3450d0c64a415baaf153ad8d45d0b88744dfd56c675da1a5b757fc86b27c7d9e07bcf9c210481dad31913daa1c60fd9a2336f95f2b76a17757dc46ed5d78cf7fd7a93f1619dfdd5e6f3da6f6fab660fd97cd1ffd5eb298dabf59074c6e7ac763fcadeaf9587a4f0321a57a315be6b1a9dce98d0971a3ce4abec6fae6521c37e5c7bee90acbebfd868a396b58fd30e796ba5d01d6436de355fcd0be46c789fa19bd6724d1dab4ddbebe3bb5bfdba1739b7e73c3b23b6a5860ec997799defdd352f48d91c9241b81a3bdada6da5b5c921bde78db3ba767a5b652e0e79db42862f46e8ad4e5e2e90de4ed9e35b6d63909bb7405e66dd7d1c1d63b439c870c8beb0527fef99420879be21ebf3057ddabbecaa7ddd6316c8b8dc6bcc8d5f7cb7cd3c3c625620dde3b3689fe3e77edd1fa1792da73f63e2a2811a15c8e922bff5f642a6143a6deff250e38664f7f15ab728539eec3116d5a440dafbde530adf9ad1be7310cc8ee984050402814e29d4dbe92991a94181aceee35d74def86c5dac8901814ca7ffa1642a81403b3da5a73326446b4e20995a66acdba5bd226cebda900faee6ff6e4f7fffec8522bb1a36e4bceb5a7ece5fb36cc50ae69402c3eca7142ad69840568776c63a1d3f830e6faa27a252f0944231565302e9bebda53f1dad17b2d7a1d2939c433ba6d30da5e13155675d4f4e981cea7a72627fcd1af2b177e782b1f2a3b331ee186ad490b6b9adf898ebd5f5fa7d576a4820195bd5b2834ce18d8d5f1a72bebd7fadabae355f704d111ad2c16ad9bfddb7353ea3356748db16d7ea58ecf5ec793e3ea55066c8c6b8b2d5ce42677ae74ba1ca90d1d65f773aec3bdf8b6d32d111480697df5beb33fa2e7a1b91168b40369b8eb6bb207c903dd65064c8f91875f6fc7ab3d7f1dd18d2f1ac5cdb7cafb949fdb510c8ef391f6b6fcef69abb8e8140728470356a1ba4d37db11643467bfdd6e61ebd4ead37d761c86b9963f0c5d88bf1632e7266f61a3064df7b6b6b13b2bd95d9467d212d75db6bd1cba0cfeb20f342b2ea1a6d6eb552379d6f7721219cced9768eba7ecbbd10bfe642ba081febf676ef8bd04d91736f21197575d9b55cbb6f703d0f4fcf076463f3f66375719c6c751339a3795128c45ac8c76d275b0cdb7d775645ce9f85842cf682d53edbd8da68b190f639f2c7c60e99d27eade60ad9a6a32cbe696d6cb32d37951a0fc8d674d5e7e07ac6e26593c70ac9ec7491b55bb6de5a5721a95df4a98dfcced2664db6b13ba550af860ae9fcb677976b1fe3b36f22e7335f62a09a29648b0ea963ee699bfe7252c8eb9a6bdb137adb5013857cbf7c426691455eeb4231355048e6f119b37032f6e71cac7942321ba9fb7b0ed95d18d9861a2764bb3959edbfb7b9bae23c7513f036aff49dc7e866842267d8dc134aed5c58d3014999b3b1da3679797597c26616aa6182dad7ac9baf7b6babadbd9ed0a34e93a7f14e4f8975a95942424addf39eede884feaf99961a25e447b6cd6f6ce7be68579173c87e2a64274fe4d3a722066a38203f36f7eb0767d36b7b954ca4b9338aed644d12924e6f31c638176cdb71a650232eb10609f9fc96bb8ebac7ae3b17530f61cd117fe9ebb7b03276f72f7276a72f95b684a93142d2d99c7d0d327fd75985aba608e976b6b7e29df1b265ad3d89a727ccaa214272f48e8ed9cba6b5eb5291f37b6108d914b2ad4cafbbf6994391b303c30c533b970921adb3ee9f2f48ab7b7d17153bbd8040a8d3c3a7332644260849dd517666be8b5a4621e3d7404818adc7fb713dcf5eaba3d31913ba6103ecddf72d8d2cfa62c6c30fece99bd75e5fd5b9ee2972663a6964754c99fdd538ce09ef474623d7ac4f1b53c78ce384d79646674a3da6d219c99adf66b7699bafdd759e9d11a366e4fbd7fb6cb3f4f6bcb6996e694b1d95a61710c8744ba390eb8c09dd1ef9f139081b2ecbace5672bc5a87f8c4ef8bc5ac7de84df9ace98103d4918bf3d3b1de35bbbe7337eed83640767adf53abb5cacb6451e428d9a238fa4cdb1c8b6aeb6bfdeb9c8f9d9d2efbc88679ec8386e76935ccec276bdfd2deb6d3691730acd87426f8a1ae5a729aa0d4c49cee7d175fc86f0fd745d980e3b92d9b3796f7c95d7e4e6201089f4150792b4713163df56ad312ec744ce76147a9e3429cf099325274d890a0894a63499ce98902c239dc348698dec7acecb2e7276a99d3b811e2a9c74be3a3bc6bfdf5ab3d53392b7d9748c46d6f13ee78ac66e21539a5f40201008c5630ab1eb8c095991b4bf6cbc705ab7d3b5d5f56dc8940a395b808c64db0fc207973b7be3a222675bea319d42691a0e5736079b7edfe59cedfbf75eba17219dd71d339f4ea1b39235d3e5e682d6fd5b8fc7148aecb854e9ce7e84ee75f184d3d689e6b150e9d6b238ed6aea565d77899c1d0b53d2ca11525a1ff37d7859e4dc30f220d982afbdd972b521b355e49c42bde32d2139ad5b6facc21badbd2152cfcee2d5d0342333aa02df0534207db1abd5359ccdbad651e48c0a4126531a95893b480629abd1b11b1d9d17429173e94921346f43ad9dd341da57a38575c5f5cf426f22e7c5674c3c2152cf4e7cd0777a4a557290d579f3c9bcae6b23f395650cf30621e3f79ec3b5e0ea077fde755da46d326c9632919f3eb5c50a08647fc463aa20100a84e54b4e2f3ea5786ac4c041ba1b2fbb0b2e77d8fc6bc914bf966828617910c5639a7283648c3d6fca9875b3c2b944cea993894e09d820e9baf62b755dd76a76c6fb5ffc91e9a16f5d6ae7329e1ada6cf17db5c7566d8cb78861ed468e70b2fb4cdf899cd90c611ab6fbcbdf1e7c9fad5906301232afcdf56aad424bd7b4d614197e910c593b736eef82eeed14395bd3940cc845abc39e93617d8fb9596b5ad18b64fcdc8dd7517f6dc1fb56a4412e8fcebd56cb6dd626f1ec8c42f64f538482ae2359ed781db53f59ab4ebfdb025da4bf37ab4c99f58397c1332612698a50feb8c8092963ded6cf7addb368da319d78b8a7cc20a3b533426fb0ada7f33991338fe96479c920677df5dba5ace163a64be4a614e3de2267d34b63a4af7d5bcb71a88e5233856a662d1246d7f1411661df3bd71339c32a5924a43f5f6b95d1beb5328340cc9d523c366091413eb71c7be486fea26bd1c106db84dd2b5607a9b5ece6acee21f1ec8cdc4e4f899db922ef5d5fe3b3fa0dbaca1608041d8a3ea7332624c68aa4f4e1a5bc2eadb345fa44cecc0f3a146d3a6342ab8ae4d79e23fd47e1b7bf57e40cff64b2729a35d06efc74c6849c8a7494b6ae6f5dd737a9e318a46bc6b73976fe6a74abb9a73326a4010c48c6abaef71e5b77b05976af2914b9c02019bb0ca18d8db99daedb0bf2bd5f5e6b6474bd7721c6a3f7b8be19b6e502d2b1b93ab2b7fc327b3845cea17a9acd6a290daa5db1805cceddc8da41172fa4148a9c5dc944b202027dc944aa201008f474c684729822a3a3b327ad14fe6c2d569173a8f9a5762e7b51b665b6ff3bc2e75eab50e4bcf8ada9d41c3315b863328548f6140a01c0a5bdf44db6dd9ab37b6d22e7d409c6f024f31a695b97bea7ff5c1439871c3ad95cbb6bbab3eda613b23709af8dd759a6cd32ae70899ccf984e6442dc8c599cff784efb66ab5f45cea714aa2dfbdafa32668f61fb6862d9dada572fbbf9feb1c844ceb634b91d872567fb6a16db6bbf67ca226711aa87277432dd4725c74a4e18773a63425c5ca06ee374dbecad2b32ea44ce8b3f353ad96043aa6767399d31211f40f27d3578dfb6839331ac3961b2e4c0fa358040f5cd8040af7969a167f58ebcfec5d8a0bbc8d9d964e1de38d9a3ce763deae01339e784c992f33f8c503d3961b8e4844aa3108fe9645f9f523c35546045771c14aee5049174413b197e7babfdab0391b31f747abbd2cacdbdc640def58dddbbc9f7d9370a03c78e35bfe5d0dbb16bc858ff748e1132f6aeab65804848bfd967ed67d3fd9a377f48e8ff16656ef28acdecbdf143b2f37db6bafbdaebd57fd387fc3be1f5f78bb6cae6c31b3e24fb73ad6d8dac3147e38c21b6e2660f497fd2b99c71fbd5b65691f3c3c08d1e92353657e5c5b899adc9423c73c7390d845a6ef290113e485fa52fc6b6582f3ca4cf38eb7df6eaeb5ed3de21bfd2689df7abf79f594eddd821d91faebfcfb19ff3d97c817c085babb1d9c3c6e67275c816db4606d7acb32d37a343c6d96cae3657e3f6917b0eb9ec83fedc6a7a63d7dab6b41cd23e489fc7c5987b79b3767148a7b359fdbb9863fba873ce05b2f17397b9e75957bc0fb640b68fee3d3adbc6a78cdf3907876c57bb35f6185d97d59e8ed3b87943b6365f8bafb9afffcb170b24fba26f3138dfabacbe0fe36605d2adad33325bfbab7bab3a15c8be97bdbd8debce35b9b921dd678b915a6e91ebbcd3b914c8e69e9935d86cebfa78d8c9e425cdc9881b14c8bbee852f7ad39e5ebd1bd700b959b939817cccdad65ead15ae479d4d734a95646b433a4ad95bd723e546a3a5376cc8ebdeba8bae7eefc2f68d39c48dcd3013c8f7d6837442a734ce0b6997110f15c7661c9b616bdc9440f2c31b29bb775a6f3eedcd1ad2395ccfbcb277215f679adca821577c8c99bbdc6e6b8b711137249070cd1a2bbd93ab7df35a303c3df6afd8e7e9b16f6fd290eefd8a71dae860dbf7fc060df6913e64afb6f2bd2e7226531aa5b18b5df3cc1d86ba39435af67cdefadeaab5e17c10888c1b33e49b953df7945d582feb0b02a19e183765c856ebbdcfc1c5b0ae557b8a9b1148c8ae8d6e795d91f55ccf4b9a140814e234a9dee24604eef572eebdc6de7b8bd9ebb8289b6c273307821b32e4fcc88f3d6bbd56675fd7cd18f2d9ae6edec6e89d17ba7d2f2010efb4326e4220eb3fb7873c79453a1d8d2090afc2b86cff63b7ced7ae18d22f6ddcf5bab33dddc530a4ffbfc376ced119ed7d3760c8586fdb7676aee86e37f785ec08dfbb369d6db9d7e8855cf33eb35fd7b976236b5bd0b8e9422ec8fe3436389bb7d81c871b2e5e33c766d045c83c42e70efa7db03bde162f9d76c69b2d64bd1656866edeb99c2f77f301395ba51cbb5dd6d6b2f0de68d1dc6a1e1b8b8b176476b1e1baf756ebb7c2b7d1edbdc94232f762336bb45d7591bac521376eb090efba7a8cb035ea18b51704aa79e3e60a7979557f96b5f7b7591a45ce3c3b275188b9349a2267673a63421ab8f180e4eb2eabb4affbfd561744c18d15f2d9ad5f6dc5b7d4b5853961b8e498e0a60ab922df582d9ccfda5f5c3754c4e51c3e66f12df81cf66acf55d6e0c387fc9eb89942b2b5ef759a043752c80b5df4d6a063a63342bf8942bebd3f99add9bc317350c868df7a14363addcfb6d613b217cf778df9e5e7abbe13d2cd67e385acc6bf8fdde7c54d13f23de6d1eb6547993976d301c9b5eba476bdc7f7667fc3846c714217d76c6ec5c95c5b82977b8f99bdd79cc5f82237379fd33af80fae58e7c31b2524b348e77343e65873ed174ce28603b2b66befcd579da5f51d4d42d25eabb56bda1dffb58984ac9551b66875b69442eb9c889b23e4fafa1a2fd7cea9858e62716384b46c71b349eb73f12f3f10288698817153845cf6ae15a95fb6efd8574e182e39cd8c1b22a4858b975f7b216df1392772c65283f3954f0f64df79e96a8dc2eafe20d06a2d3ea1c8af95ed7a73561b41918ed90be1657a97478f91049f4f24d778d7c736639b5fa71339bb538ae7e389f49e4ed9efe5b52664111562c6cd03b91a3f165b74eb23b3583f9d484bef3bbf8cd1070281406d26143df0e144564723a4cdd9be1636b76e6d22bb2963a70f9fed77d83491efb2bd6d679cb1be769a89fceae67b9032ac6fb1d84a7c30913f61f5b7287cea16ec1dc8b620437f8efe75d80f3f3a908b63df7ed4b2da9642267266fc2e910dd963ad356ecc5e6821639648f7eb41664b9db5f75e6395c8c9ec5387fe7aba6597036997bfdaeedc5cbf0a1d03e3830369b9fa7dad196bdd2f7a189f1b4866ef7be6b73db5b45116430c9b12b9225d0e72abf3f93bd793c8e88ed9eee66ce37fae6d20a37decade3fef7f92c7f24916dd96a5bd7c9dea1fb4422216d14c6b7ecfb4521756dcb0712792be3f826648d355dd73e22dbdde9d1a77d8b7a7cebe388fc4bef73ae2d7c3dd9758d486ae19af521f7aaac51b8bee458c95919c8f1c225c7493c3ba3c78cc8674d9773e72eb31997656c1109d9df6a8ef95adfed56c61491dff8cea7ceb75ef8ae4d44de1563a395d5e5963dfa8c2122b93e6c34ba8f73c5e78cb143e457da167548fd3a566b058158882333445ec77ed1172b6dd1e7bd6c31107c6a20575bea6f9b2dbccb36a741c3d89a21bb666f45e6c58b976b2d3e376fd539489bf9f029447ab3767632b8e2b3dfb8de0002b11a2b3e84c8fae09bd4f96a8696fefccc40b2a3be98afe9d1c245ab1a9f41249dcb5fc365ad73d1eb8b687c6420fd46eb70d9671bb3965b191f4164a3ccdb628c3a7797c3271059ad8d94bf3a77f969fcc5216e323e31901c17adf12fb3eb17db8a5d7c60202b73f51fbafbe766e51685fe87116aa6e61510e89df101443e8d2f5aaf1436fbaa5dfc87bcdc985f6bf0c6f8569b20906b3fe4ac90ddeb499b5fc7e0ed433e7cefbda0a5fe97d5c887eceb989d966f8b6d3a65339f3d2474f0b5db68abcfd5e82ed41913427df4901fa9abadad8fecd1f5350f59df9cd0fab46d56eaefea9b618e727cf090ebc1a67f635fe7de420a0604ba43c67bd9330bdbac3f57a52b46f1b1435af66a63744c2f576787e2f302c9ee187cd6689d94677d20504718e26ee253875cd5b1cae2e2f6ea8bf542273e7448fbb1c286fe637ce690f1b2db228d5cedc7d91f3964ad33bafb848b9b39bae2902e425bff42c7cfde57990be47b68bdfd7d8cb26f585b20e774ebab79c287eeb106877ceb0ed6e9e865da71fd1bf23aefe76bc2465d6495b140b60a5fe3c7efcd8f94e10a24ab6f5e6b6ffdb9d66bad02792d745f2d758e4d6be97343b6c7d86adbea8dafadeb14c8f5fc7f71adf7bd750b5120a7c7f70f5a66e6ea9d7c02e99179b71a7d7973daaf0dd9226bfbb3e7725e6b5936a4d3e56d19b2a36f1b3e13c845b91b6dedacf59b979640c2daee6cd5fdc7d6ee9d6b487b1d33db6fa1638ff95243c6c5d459ee3899858e04f23e73ffbc4dfb6c8330c6f1494332f897468776b5f8aa85cc216e313e68c8b62cbe5e6ed9675d7793e27386e4e6d6a5ceeb5a8fd62dd38d4f7ccc9090f1bf68797a8593995225e9c5a70c6957b4b4b27f353a07691b8174f351ea333a6547eb5a22903ddd42afcddf1dbbef6448e6d8ceb25ecb56e7ee31a46df37dc639db9bf1d917025997ad8cf95176ae6d5110c816d9bcedc5fb6674cdad18f2cd7af936737fec3e38c390d1cdf686ed316dee1e0443def8fcbed8d9a5d62ef785bc75ad37dffd1bb40e9b1712def69769d3769542e7ba90dfd6658d1f9d735dfa960b79218bf79f6d0cc2c9deda42b60ba7b571b2fbdeb8e307a4bf7e8dddd9d85c71f5d542f25df5de6adf8a96ceebb290cdb83a7568db73b7d68785fc78d97b94b2bd42f28ddffeedb6396965cc03d2b1d6ab997dcbd6fa6b56c85beb6a5d9959bb5c745d85e4faccfe5d13b6af35562ae483ab575c6d4658db636b0ac9288cadb648273bc69549216ddf08db7faccce6bb1c859c7755beed5e67d7660e85f4052b53d7ecd10757ec276474d7e2a290cd3b99b2e884bcaee372369dd55b577b13b2fd6d4dab6dcdd1c71eeb8064de6c538eceadf548271392c13717e56f6fff35c64b4838a3f37cc658f77d7a959037ceb9d8655fcf7de5c601e9b3dfbb6befb3707e7d49c836273fe44b6b737bce2221dfe416d99f639359589b0a3e4748e78e3eedfa67ab329fa46925c4cc4cf3161f23e4a3bc9e2ffafcebdbfb45c86f5f3eeb8beee3baabc1d28708e9dcadedcd9f576ee6b4077252eb335e5e1eddb7e5a1c486973db3bd5e27bfc540916e1bb5de9e1dbbd7ad0602a51e859a369f5ca6904e78b92b84b5638e172eee0161e30964b69a718b0baeb8383264f51bafb60e5a3bbd3a080402b51910a81f0fa43fcb8bdd199f2b4311aa8727d2f03a91fea643e6da7cb43efb9e13c90faea6f1d908e1f4556d3691ddf7e19b6f3ac626d366a38964bb5eecd79ad967e49889fc77bcdc73fa0ffdc26783897ccacccd566793e78b0b079b1dc8c56837e7dab5d146387520e9f3452f75bf974887be988b1ddfb544c2c89359abaf427ed6d94ae4b5b7b567cb117ea38be640c6e7ccccbcd27799a31107f23ec79ead962b6dd898df403ae8ccb67729b3d1193f4a9abbe7af5db7f6bc9b1bf6474af979be9f1e23ad33d84c22595babd9cb97da77e7a3a652c806d29dbdaedd94677b5eaf24927bb906635ccd8bd5f691c8b96e378e2ed2eae2bc9048c69eda699765fbecd93e225963fa7cdde8f759f6d1c611e9d0a39b91767376bad8108b4d2392f18b7dffdf6d07d77d1008048221e6793b150df4800d23b2b2d69aae59e7756aeb2f22ef72f7086bb7c77767b45144fa77adce45dbd1b19bcf2611499df579e37a4e6753cb40a0670604620ef133d3d10611c973b9c58bf9dfb2f9fe1079293b8dcb7a6dbfd4c62a395672a8e478e1d27a6c0c912ec2d8d1dfaff8a0b5af06d2d5e7ee5a6cdd94d27b9d01b1a1819c2d7e7b915a8f6d41d84285c8dae27aced67ad4f2a214040281163b6143887491b2ff7a6fa5d0dacc40bada7a42469df6ff6426620ca9cd20f232fbc96e3efdc7ae73f5adc9ca5b934e5c7c011b19483619dbf8dcbecb5ddfb72d3682c8e8ce79a5f5b2ead1ef072227655fd73d8d3606b23943e8ec8cab79f36f184868dba593faf24a42c51395c70e1017d7ea66bcf8bd6ee6dcb1f6f73efc06bb55e85d83cd1f12bad74a7dc2f9ed3d5f3f7864d307834a367c48ebf6e7dbe89eab10ae2572b624d30da539a5e0971c2b395b4a3d223075f49eb0d9435667f3362f6669acf7c9402e938b1ed2ad7abf595a39d6e5d6cd43babf1c9b3b68bb99d98687b4d3f563cbd6061ba3936dee700ddb6bb1bb39e8ce6cc1c6eb39c86b3d37673536b743d6f7dedb999bcd5fc5f22507360c362f9090354717bdacfeabffbe0eb968cf6e3fef6d8bba65c370c9012d0ed8d021f9e17baf6e35d6181b8a3c274c969c2b201008f4e01cb2d5575fb370f66baffd0f2314471b39a49bccb638d979631b5b8b43b66bf7ee8a70b66afd5be4ccda071b17486659dfc9da75db3a7fb116486bdbed3ae9375fb1bd0787bc95bd76d78a0bbe2123b3d13aa7eedf63819c7d2ded8eac415eade9a84c642b90efd9ab91aef6adb166ee1f6c5420ffcec9d179a4af57bb8e7243d6bb18b239793ada6bda1448569d83f5bac7ebeffe4281bcbe165bb5ddf667ac97c899d3d89c403ead93d26ed55acad8ad2267b6019b36248cd02d65e7ec9c4eeb44ce8ba1b161435ad67f635decc1d75a6322676e938d0924b46c36c719d9d518df4525900f9f85aec5086da5f355d7289b3524adced9399feb2d93490d79bf17af9f74d5fb7ca1c8199240be5df13d5c3f5d7434a621637c5e0d1ffb74ecd62383865cb5694368a1658cf637d4ebc1e60cf9ceedbc77d2b5b831d67f429944ce6648d79c521be3ff63b4676ada2e9946a9d9b8f1c9a60ce92c33bf66dbfd606c2d72de319d6ed3a2050482ccd8736033825abbb986956d85b0bac8f945755a0181425644a8a9c54a9a9369e7bb786548582bf757162374ee0c4720e1cf38e95ab79f2fc65004d2b1e5e275cad6ec6a2f19b227bc6bb51b63e4477f0cd9f451caee9a0e7e8b360412fabb6a23af7691410b020997b3c50d6b6d6e5bc5901e5fec67479b3967340ce9cfb6da7e5d3ff6718221e39cd7dd5bcc6fb116bf908c325861b38d975be8bc90f4dd9e97ceea9135d8ba90cefe7bdbef2b5bf19b0be9d759edfb6feb9dad7d0b3969658bc266b1d667ed1f90d6de77c8eea4d039b26b21bb72834faff3752c2ecf42bad5d0dd5ea696bdbf584866e9a2f435773a61bd5748c7e2b3b5edb0d909af07a4c7eb1afa7d909bf3b542dad5eee36df6ab9010fe3387eeb1faa54f85ac8e2db7ab3db9e3b35348aecf7bda36dbbebbaa1492d6069f3b3a1a857ccbc2e8d6d6e5b0de09859cd03d377f429e97ed1392bac7b6b5fb1c37bbe8848cfd2ef5fb22d7b76013f2be6a5b6374cef9ddb003b2f9acfceba3d73a2b1392ff7e3ffff407c212d22d4bdfb491b1ba9af903410949e7fa762f5d3ee1edf640e080acb07e47cbfc3ada603f109290ced1dbdc9bf151eb763d109090909963c86dbff9eaf540384242f7d862a62e56f87f1d0846c81b9d3beefa9035df7720142163bc9751e61ea5fce23b108890ab517b9bfdd2cbcfdef540fa85eddd6cceba7b7e178a7caf237363acd25adf3a5064747799d76cbc1842eb3e91f51fadb49dbdf7baacf344ce87f05ee78ec26e8c3a1e48c61556d65a7db6934dd789ec766aefafebeb598c8e1319e163cc7e646eba5fe836918ee95b58bf56582bbbd3442eafefd65627ec67637399c8f7afdae89aff55e8cd6122adf7abf0b2752bbfd7dc0ee4733c2f83cecd566b99d3818c303efab3557697487f6d365b6f51c8d1b2b3443a7bf5d8ed9a45dacb5522df5d5a29b3af97b5f4e640fead8de1b2abce76dbc581e468efa3947b455bdbbd816cbf7fe18cde6eb57e4a64e466ee4137f9dba37612f9ecc1ee59d7b3fb28b5819ceb5db79cbb371d6c2a89acfee66acbdc3df4a691c866d7b4d6161b9dce131259d962ae45a7aedb9bf011f92e5687f5d9d975397444424b1dbfffd89cb57d8d487ae73f7b6dcfdede6344c2b758eceb7da785ed2d222f5deb9badb0ce66ed2922b9b247bf91bd3917752d11d9dc8fd919db72f7d3354464bdaeb9c55843dbccb9768864dc9c46c8bf6043d89a21f22d3befb39f91b6d85aab8164ab59b67531e6a673dc68209b9baeaee67ab5422474d6d678b9d1d866b484487b6143c66f7fc51aeb0c24640bdbd1f5189cf0d241647bf4d677a96bd6b6a53290ee7f51681bbaf722a48248db334e77747a6db66820b27a3bea68ac3306d2ab85d04d06575dad270c646c8ed43ddb6bd2672320f232e7e66d6bcd6f3ee31fd25a1b67bc0cbe09298c7ec8af1632dbf1c5f8d6c53e645f5bbddfa9d7772df2212be3ba1ab335de4a3bee21d9ce682fbfd815d608f590cf18f35afda27db53e9687640819fa7494313c64f79d90e37fbb6cd96377c8afcbad6aed7a671d7bcc0e49f94df86d52c6fe5dc75e20df5bff7cbe776f56ca581db236f72a7dd86ec2379bd121e3f7fd77f41b6d76fe1cf2b92e476f8d2f879cfdb11bbad51e65b77148d816ae46dd6b8f2e365d209b79aff726fd4a1bcf16c8d6166495326b37678d70c8f7e833db379fb9ebe21b92c6d69ef3b56eedf99c05b2b2ad6c6f856f0592d1caf31dfcb7efdb5381ec67fcb1b60617acd6b921e1f5d7d3ceea52205b3bbb66df9fedb6c850206fdfcafad95be7fb9f40fab4b6b66ebaba0de9cd7b5ec82adbaf71351b1272f7a3bde87d75c5d5269011c6ea37f2cfebbead2e81e455fdb6bef4ae215baded4e7fd0dd6bdf55433ea75ce774fb28d37549206bdb1b9fb5103274eba621d953d7132e86ffb63e1ab27d2fa697be3f43bab5f83a7e6a6ffbf666c8d696ffb496adb7a5b50cd95ebbeb71b4f01fda39024967b7da8bc5290209b936b7fbeb9c7d163219f235c8af63833c86a45def72cfb276cc197208e4e3d8de467fcbd1a7ce2090cd277784f3f973de8ec59071b5096f63ce8fbddb380ce95885ed2b4f5f96d2c66048769baf459975e7fa8cbf901e577b8fb1d92fba63ec856ced59a55ded57fa6a7317b29faf5eef2e5f7a613317d21964f3c266ae9fbfe62d648497cdd89e6debbad7fc0119f9beff65c8ed2664d642d6377db2b6dee466be380b49ebbbc7ed8e42fad56271f9b18677527a8584cbaec85c6d9336d6aa07e46def411b6bb7395f4f2b6483ce2e07e164abf9ab9031dabaee757cd96d950a79197d562d857f594f9f4252e68dbab3bbaed92a8584bef8b573d5bef5e9a290ce989b856c4dc7e28442aec9edce6e8da9e5c59e90fd2fba7e877ca33f27245f8ff3d6f6a86b94bb095999cf56d98aeefece0ec87727bb5f67a3975764425616b931ba9ae5bf6cad0f96901f6fe506ed7cf3032564dfbeff98b786b32dec0f38202f5c3e597cf1abab6e3991f3f30f9290975d657a637bca4e196ca91e9e0f90908c464817ad75fdd717f22e6d419d7aac7c7084bcf4ff5f77ad0b567a7be207463c6ff5dba20caef7ffd30745b05ecddc45f722f4c6adddd7af459d5b76fed7f601111a88d2036999ad57f6caceb9d7d1ccb79c3059724873b4632aa52199bcfc63811d8a5c8dbae8a6dfb9e6ad8b419137be9bced9b5fa7ff5fb44ae678fc58e2ffaf5a7ec09732c36061dc7d858bb86cc3dbdb656dab63f36062b0f2475d46bbfca5ca5cede8ad2897cae4d69fdcacfde399d1369e36d6df25cb5d9659f46d944460bdd4fb6a05dd127e4ee289ac8366773b6ad73916173cb443e5a1b6d93cd16addbc630910f67b735d9dd74ff60941d44d89a238bf0b9c7e75eeb668e8cbab77bff6d3532a2e840c2f7eebb35f6bdf5bde6512e910db2d89aeb9cadc616dd3d8a2512420761659371775daf46a9442e9e6e418eb5df5cd5c2283990f31dfbb6cfd2e5fc398f8203f91ce49fb3e963c6d83d8421ca0d245dd33673163ed7982da7443eb6688bb63265512669af3aaf0c36838c43fcfe886203c960acaf3d84ed457b79558922896c2f36b490df9d2b3a84512291ffba2773c6ae42da0d3206895ced2f832d36b81cbbf6629447249c4d5f75b34dca94bdea887cd68b6db365dc88ece9f555b66a6defba3f46e4f3daa6b573deafb0d1b9887cb1d16a1dcfe9ed215b5a445144ae47dfadf75a73c6dd2408c4449444648bed3a5aef748f9955fb3a0a2232f6abb5ce5529851d991d22eff39a94d236e9b297a321d2726debdef5b4cd59f66a20a7836e3dcbdd5ce18a8e06f2c6766d3933d7b3dad50a91bfe8d307235bafb3697bcd892884c89f6e5ef66ddd2de6fba2283390d79d9b90dd5edb2c339613260bd419133a4519a44576e8acb5768ca1afc88fc147ef7b8db658e75a5f4491816c74d6593dfa8c0c462b887cace78affda9b8148aeef19f5766185ac678c412fc6de7bad41d89683bc60c3ca986d2eda1805069251f89eed181dbf05ed0544fe85ddf7b1eb17b638ef1f72fa7c16b2eaec9d8ec6eb87e4c59721f3e77d48172bfbca28adddea62970f39d73b83d7518e8f31f77b48c76eb1be5f21c36e570f09eb475a3f52e6eff9e7212b4f77fd74fd84cf1a1ed2576d0fc2f7187fdfbe43f68d8c9d23436f9497b5434ef8a67f33b7d4767d2f90ebb54a1d65f5762fcb6a1dd2d9f86885ee8ccd1521a543dee6e8aad55d5cb6dfcf39e48bcdfed4577578dfbb1c32d2a78e2d7e70febd370eb960ad95ef7cf3decad60512dafec9aedaf645690ba4853736cb783a8d94231c12be3b1df3b2fdd6a37b6fc8c9a86bedba6175fa2c0b6463f89c555a9f9d0ea75b8174e6f5de2c6dcc55679b0a64b36edaca6dc155adb36e488eed6e6ccad6faf79802c9a85beeddd9b52bad8e02b9588bb7b676b5b1beef04b2b14337235ccdd2fb8cb521bfc5e9fdaeeb47bd5bb3211f5db1b5fb8d79dd9f2690abd517eba4f6bdd5cfb804f2f9730fb9dd87f4415e3a4c88286b2cc8e09cab72bc570de99e465a27c779a77bf3924042fbfc97bfef7bf6f9a721e37f6d6f6635b65becd190d5d5fba27be7adf5af3f432eca6e32bddd30da45ad19f2fd8bbdfabac5ef18b36548daed31d7b052f6b76c1d8184edd97daba7bbc5975611c85aede3a70bcefe7e5ac99094be65d6ce1ae3f7e43a86746eb6e71a9ddcacab8f8640c6d7ec437afffd6acd2808e45db03657ab33c76c371543fa7dcbe37b1652b66bd130246b6d516e867fbb6b9d6048572dfb7ff0d1f5ec75f00b696b8bd15d6556dfed825e48c70b7ab3bfde857c4a23c37761bdf5adeb5cc8eaeead7e9963cfdaa2be85accbb1e5eab38f5907a9fb80f4669ddf65d8dabb6c3a2de464771fab90b1aef339978584712dd8b4564a2f9bedb090ad2d4337ddfd15f2dfdd3f8636bab8f879403af7b0aded0a9dffea668564ee2d086d3b6d35d22ae49cad9f7b94d5e70b52216f3778effcc6a2abecd814f27df4cbf04e5eb4dd4a21195ac8ec42c79a3e9e5148cb7e39ea17ce76978550c8ae753d66b6ae3177de4f48cb2cb4ef1a6538ddbd1332d667e96bac5f3f56e98ad284f4e6223fb670ce1ab9dd281d902e7673deff6e5e7f0fa33021598d962b75d4977beb38ca12d24ef65ae77c77dd14519490f47b5d76595daeba8d10040281608851cf9326e55c140ec857a3fb7b4cbd9bef1bf1cc10d3191302454942dae5e673cd8fd79c6c3ad27532444142dafb95d9c8da5157dd8a22673226128b7284ece5dee7d7b7dcfdaf51e46cddc4854b14231cc6089f776bbd165cb07bcdbfd3a99bcf18f5e54e868c890b8f490704226322b1538a274a1112ae7a638c2e3ab7d5fa462142b2fd179da18bafbef9b107322e571fcf75214757590c455a6ee697317aa163eb81e2da73e85e638e3118d95973caeee663ed6275ccae4fe474af51e68eecc50b9b7a225b3bb8a07db4a36def3a1ec8d5b4c2c5de70b2f6ae1359d7abb4f162b5d959172317379cc8d87cb6a5abd75371b389bcb43d667aff358c77b626b255c8ee5a7fb5732eaea29b4ca4fb5e8dbb2d8494bbb5d00d26f261f48eb1bb36635dad28f60ea4d3552965f82664b1561639c3e6d73ae8b6187b6ef973d0bbdd6a5f5da9a56f2165cc1cea643a9d64c93402457789b4cfddb968298cb5ba9e96486a7b2d37fd995ee7ed55226d8b95d50b695c4ddd65205077e02607d2dfb2e5489db5eb267d8f9a222f20908738cd0d0ee462f7d6766eb10b99adef06b23547dd8493175bfd9641204ae462ca669bff7cb6da36c69b49a4db06a775b4c275db471bc87aabbbc9f7cee60d3e26899c97ce6f7abf1f7b8dd54824bb6c7a847fdda48de7bb8144da77f3b6c5f4df1b43f78864e79feeb9733f99cf0a0255d4680704aaa8d14e7bcc1169edb5d62dd8b032836ced69f66421cd46e4bfbf5b8d45cae8fb9c22e79329947a328d2123b2febacc21fbb9d88c3c2a8d42a1c7854a151ab864792934a1c78b48ff7899b3df356d74ede98c09f970a3886cb5f9b3ef5de67c75bf7093885ceeb67d5d97b10997bd88c8c5ac9bf0bddecab7d67888b4ac5f9d96b585dc973243e4bfcada9b75b58d31421b6b202f6df3ad3961e47a97331008051f0da4cfe7fcaea713be8e8b420fdc1422dbfe73efbd477fc674a226c94abce28610e9de8bcdfdd3d7d5def5a834d30b0804028518b2194886effcda3ae7bd7e7d10f95f678ccd32adf451e63290b7a38590c6f61f947ea8340e6b35792c8ea2188a610080016a9f11000d3314003030201e8e0683e18826ebda07140004416a62963a2c289308838140200c05611003411002000c02310cc42018849710a50362d32c8a41e7fe33ed8dcdf1f9e9f4ac79cf3a56dd1417a6f54b7a92557a62b1f6cce6447ef3e93eccedd4397557d9639aabe5183d243d4158e8a232bec83c9b15d381f68ba2225954975766fce96b761b4ae778da98b223c2f849fb1325728c5ca5d30406fda51ca822394faee834c2a8ae55f99483b149b9d0558a59e7aa33c58df9f8f13abc0a5df3cfb5673637f2e3d3d3e759eb1e198b3445a1515f4937990a893e5619cf27d5d823cd85fcfaf4f479a6d69269f397fe4f1dc34fa137cee3afd3d559e29e7c6c58658be8818c5220925f082f59410ee90585591efda09b2527797e7af93c6bdda38e1557991df6f1054891bf7f1d73c561d19b764738c69ad9e647d21d5d538d42207fe9f923335542002cc63df3da75a6ba41711f7655b7881d6f17a7f2b58917c1c292ba2fc6f327168682e4073dcda546c8259d4720c9ffa48b2e2346e99acaa0b0e48765dc2bafa57567bc64feb1d6ca06459e7e6afb4c6ad951d90a2b738ad1fc10df1115513de96b01bb0e7eb5abfe5e3911104f0d949e2664ab1a31a81807e8b0a8ec868eb21e114a3ed741a60bec26f1ee56af4793c5914ae257cc36dfaea2f939d7f22515e711beec4ca9f40396768c947e0f8047f0c4030c0d24d26a96505d40b1eb6835573da37c684120e228a7d97c62b82aa8751c9af2e1bb388f38a32db71410a2320522466f154e7002f2223e842d95914d6921fa7d53e4bdd9701019387413a44690de81cf04320622c387a0d542e794ad689e62e3bb394df4c741f9902d49b9cdf78794a9cb8dcc93738019f3c4e7030b86b94c326925a30768d6bce78af14bca62eae8403a217894d0b6c0c9a9a8082eef1757be21905c1ce3a64dab7ee8c685c22161fd57d02e59ebcad222be7f2312f8182d79c113dbd4deb6716f3ccfb293829d7d631ae6eeb0dafc53e49890930b8287d4053af3c7c676c5f6dfa5a664ca3bdc28c437d28857ac9eae6abb25027de350b9b1a5d39fe748a34bfee02a4cca7269ab869eeee00929795d23c46885d608829469125b6d076904b063e7206403e43d2c7f1a15a70ac179d09100c30372e228cebeecd0a3a8262648efca130a83d20035514710f64a93d27c85bbdf452827621747d580082ac9c7ddf0fdde846e03192b41ffa7a73a515d864e2a9eeea7d9afecdf1790cb55a1580fc2f390d9e1325a8d8f8c462f36e3f1851a8258f294ddf9ecf046fe2b9d15f5887e9bec8d544eb350bc5ea24e2e4bd725e21e47ffa071cab213490b4e22dc00773c3fcfca6e4157251a62408e194862a02e788e8a93b4a0c0807826a43621b10de50d28b450cb82a6052526344ce8b0a19901e54d286a42b01b420da867a169418805ed4c486c42791b8a1b106842c4847036641a43c40806e5068e7f2fffe0cb1492a3342201ff22d40744b9b76d8420da2409bd2524c8208940fb11f594871a531b649644a03f097fb2443ab6e87bb1d58c6dc40dba4a30d021b54f35b52006d06453299d9f8657aa283a4337d5e90e2ccf4fd3754da129359d3f658179e464fc9711992416102bf13ae91e9f9b274d5d6558f449aa563bba7a9ef9d872561cdb4194f70933369d6434e646e051a577d59cbb23943a5193bdebd4dd52f21f36ae88da5037e22a72691658792884733180a7293dec82d0a670cfe35544f6679a54da04ea88493f5513d906d2eceae64c13a4d59192f4123681cd26652dc6cbf53421b84e96f3751f37e5011192aad694171563724e66e4482ade466472aacf87429d986d80e2687622b5c3e0df478e4bf580cbfe00229bc48eed23e0e1e83695a34416dc05490b8e0910460d9e13c418e8faca3229e170162d9c26f4860c3eceb1d1274e7d3437aa54c3161504354f18d3d91106d6429a576ab5b2fc07924f77cd967b4415a9f9ced79c1ea6e3341e1d87e663c1b98563736aca63b2a09fc2ac24b34394c686017100fb592c7441124bc4b4f4674d767ab3852bc974572135d6ed58d409de685416415cc961ccaa46f95765c0c1adce33479037b35092cbf59df1c79470d8b88622aea4d0d51b7c46c1281d0f47147b013a379a1b0e6dfa6f8e461c8a5f5895b2dae4c06cdac3c24daadcc7e367b92f245005e043eb33d697ec1f70d4a48fb96591153b529e729186e30c0fabdf2957a990a7e9e8eb6ec27b2185e88f2a128e10d3b1a2380cf18de2ece9b80292aab55294e03b99bd69d8a77b759941ec4bc99d7af0a85901b5270ef80d8404a00716bc09f2db628fdbbd473f28c15b080453b9724d53a9fe4495322c478bdf3c57aa72a13667b01cc08916347f62efb1972d89cc9e3fe4e08e985b3708d2a2b4169258244df18c60f3f94bd410eea07d4ed412d2953dfd7e317763066256dfa1df8dd8627bd641ee6fc729ee1351b243ff40809a47983b997c29a0b6500e413e404d470dece13e5dd5e03e20e6941acb4fd26b83247b55e2c260650f275245f1cb9d14dc52a8c748a1e9ac40695369686a0286c89d56052d4c070abd57e2061e324cf034e26e582b7d52d09010266ecb0a1797d04b86308fb158db69ba240f2c70a2409d863619aad34a19b5782d784ab1c52d753bf8c0b5743cc3347d0ffc3da7f9871d2952237862ca37d0896aeed7dee52a391658a3ee540e60874085e0da216920a0ba37db17e0b07da8030d00f0695b63304ce42122ef9613048e7ab67b346103594717ff111844ebf9cb262b5a20878f2f30705b17dc7e51c00181c10e68591d45b516d479a435237b415a3c87da0dd96865975b9eccaa82bc4b8bbbb6ee353199d0894ace23ee523fe2d9130f4a55770030654ae52c5a5535b23f0ed96b4461278671829b23d69a7a5e451c7425b58181cad1c50be16775a4be374b0d6ccb70458e626f920d5524180122039b8c781050e2872efdcf582114e8b60a83b599318b544f16dc7290bbae81d48a2cee9ab097a2b0e249d2ec56e70180e2c2fc31f4c20deec1fdf897640a503fc6b10ac26a432a5b2d22a03c6077139132d7b798408a509ff97f0d17665cfdfaed13adb40e06fd8116c11a1c41a86c7a60481cfbb38335dc9abdb1e5ae5a42ee4820744bdb5366ccca30290b60f81b35bfe63e0dac40dd15e101e323a43184bd1ee7ed494b5fd10fdf92d6269243190eb118d8069fe43c12b695dedf3b45700b1b9878acebc89e9b7c187029fe32275f5c8a4c0beacd3e5265151c27714fe551280c42cb212c6d5e70f18f6123f3cc4bc2631273971b7714a56be12bbc76f78c849a50756efa5bc27ea747e3f62548fff0746adb7b40844a6e744a829e5897c7abf032ea27d318a2829207bff8113676d766a6a7dca30f684085b9d3169c9f057294d1dd3ef724fcc867e201582209634fe0670b5f4c7137481dabcc119936e39454d450cae3455ff0b48c9ebbf509cd1543313f01ac61ef50df3ee0258a833202e5d968095ad4a455e27e60f255ce7005287ba8e68df2ebbf29c1a0251c44609b3ed2b6adb2a8029e3501c37b068d73bb5c9cb2061f72fbab03281ceb6269455cab761a509a53f456ab0d7fc500a72845bf25032e24f4394a07d2f4f1e0d732edb4136828e9bf7bde408da850ed749b64500ba3f0f7242d143aa45e822c7533411d8ad4ff73c105cbf7b09c37fb4af7f681cbbaf643b8bb65969c6335d58e9677e9f6d2cdf6447480ae61a494d0528017075d68e11e5aeb1dd4e60ee16d48a84bd1d946086b9af548a46a6692078cdbd3f87ea432f127b277a70498e3727f5cea0c3701c4600aa19d02d08f0890d4d2ab44fd0aab0265ae61565bc29eb900964b70d08d745d8e4e9c9e86132c7d0445811301c5938266944d14eca753469c9f7e6fcf71d76fb88010e1843639ff786d8f91c3138d8915b18200e5ca1a96618aebe090214aed9dd5fec065d043bf0f46b0612b0b23e7d4708b6669be4b41f94de43f2c75fa6f13fdff8eae559961d15d7f20caf91cde59727fddd44f16db46e3bacd2098d717afcc1a81538bb0a2c9f4ceb69680bb1c0a652f8f151470e465aaeed461e9aa217c2211f731171b90848368f30c90909cef7be0efd4af2dbf38b8af40aabe790229c92e3a6163ab01aa1dc29ef8ad573a3f337112536c521413352d411e089b6fce5cbd1f2b45ce09cd68b429823b35719fa8751dfe1131fea8527508d23079632586aa9bd0a381df2e0f53ae24f7ba6420b4010eaf6c377d6825952295aea6867cbe847de390ee674b375b7bf5849b5773acaf82c3eca265cf9a3d06d7e6b5e9b1d6f1940e1feae53611e51d90e313d0a56d0530a394c28bb8c2275c13191ddcb7a8da429b85900d0048e4e0daa875b136429c323914fc2b67914403a0041310e441e5477a10c869633947699489664e215f3460a11e6ef72b525d6fe997d4569d6f6d5c6930a9af7a84bdcc1bd58e43c5e88aa4c170999b4dd18ff418ece23c32d00b95242e8477192ed67b21c45623293e106e1d40b5f9ea180ea67c2e562be575259fb6670f688831ce8755bfaab6d93ffe19333e0007132366bd61e37b68a7e53cce71b74f5b86e58b74160770ec388437f2826d4298c7e6d2e764231b03c32c69fd4cf24093ab89d9f39e86766176742b7c382f6f113e85918ab0dc0446ad91bead5e8d853ba2672b626122192c5acc7ae85165618b3801aaa5968c7f7e72d7c28080fb15a9b2440265f90c80686d8a11db09a80d40e4bf39ce7d88e0b721c72d35b3949e83471473e4c37b9842d0829f03b401577c443413c25fc65b9bfd4a199b9bacc6345add8f1820b287d10f86ac6b88b33a797fe4ee0331cfb9fd2f99cd0c698e3fd98b367981baecbfe554e5d0ab06729b1c8679262d4e9cf30b09cd901ad999c3c207abbd4ddc87ae5f21868c48db4f03222c1995108e57aab4cfde4e47e030cf57823f6f7ae0ecbeb96a082e32d270dff6321623a263c89d10e4ea38ea8182bebd610b480a7aeaa2410491711fed06624bbda6c52b9a5ed3e7054daff47b45cb2bdabca4d54bda5ed3e1055d2f69f092a6d7f47b41cb2b6d5ed1caabd2207604ba42b7634e256606c3cf79d3cd47160e62c831259ff424caf931b5864f8c29d03562613e82ff6654ef880ed741bdf78aa7b7fae348b8d680ab198a35a1ae836a3da8d641b93e94eb40bd1a8a35a05c0be50a50af84627da8aba05a0daa55a15c0d65d64029b8f322f292926a7d28d641b91a94eb42bd1a8a55a0ae856a0da85642b90294eba05e1f8a75a05c0de51a50af856205a85a0905fc950de9115b41d4e75d06501f03edd0f45c42a3dd01eee526bd145d1cd0825024548d6939793121ffb35020fd51460de09449065f543e709cbd96874e72eb1883d29d8f0e3ab5799a481b188cc5b7923d35acde7e860f8874357e958ce0276397bf7f8b02cec2ea07a06e49d21b88f967a47dd8085a4122047d5839cd1179991bf4fe29debc304e345d73fb68438e0d6c2744e1d0b8ede66fbde9ca70db7dd7d14adc0b4881c9f24900640aa48827472923429b19d58d744775a3da3d49d80dc249955245fb8f1bea2a0e654b424930a6b0632800c99962aafd2283e759919a94fbb757eac1d3307c9a9e75819cf270b2a7378f2fe5f27865104029553d48bab989d569622de353fff732e870a5e219de45da3739afc68157f15319a4a80fc313fe37ac578467d180c6cd3b73ac103e35b86b5e8877d0a054430d09c4dc2322d87c8f2f109e9b98205ff7fda916c1ca50b6c5363eedf6f9240e678dae85aad8f107221ea606de5f1b83296c5f1c41fad5696d065b6c7e87d613914b569df612caa3debb28266f9ae8c746ffc5bbac19287552bf22136a45564729e82bbce00324570116d02c0637527d9b963112686b9b02e0501663626d00ab2947d1467e5499288dd8edebd96a6a1468157851ee80f4fb78616e44e0371a40ff9de5cc077c263f5eee41bd3c0e2c96b96a2721957337cdfc305983ca40a73718ec2c108ef64e6e04c390dbd8a3912d9b078beec55e84b7ce360d8c52782dc7de827476bd45fc937a107c49c7cea98f58f191cb5c4b365a39efde6ce627550917a2a1d77a7ea015af8c0bc9cd904768eb28d50be200f2060b3710d919bcabd28206da11034e9f6866eaf7d368d240ba037b645c186ef9eeba41b3ba81dadc3e6628e8965bda851ce44d1602648e664ecdbfe8d53f98a53fb984f113864121e2b811dd93d0f576e232455188a830d57a6b2168258be2e7d23fe361397c0fffa0717cc08bce4f311898c120fc14370e92671a17bd62cabc3667e1f1b5bb3bf3d53780d25215284b12350001bd27ee31926f3fa9de2b26ac5b4bfa5f573cc9dc4f192db095c0fa469ba8c0392a3ed5e6cbee47fb8cbad6da98bd3a7bcc37772b2c4c8c4f251172c0251dc788989636b559ce5131092835f5c26791670dd52dd9d5184627e2e42302f51091c056ab67123a8cc4305b7dbd23c2f83ce0e427849688da6dee0dd241a4cd191bb43fcaf95a5641f6e90aec641d0c9549de7456be4415d42d7b1d34d72f85f5d340a25f3246227ec17f51a93e8547766c4eac0afbc9eca541fb3e56270b7500b35c7852356a187b6a01622a338c2db22913010e0c0277151e8192b35078ca7d080823adc17af8344cb9e80fccc911b9d7c05ce97ce6febe88675951e6e265c41a3c0afa49c8734d70a173ec0a0acbd61a0b7dda9b8dd546efeeca9ff39a59cef3010cbb02554e662cd8abcf878b63b2f4b700c576b7c39421e8031c6b60a201cff1aeac2d563b250b1baf1eff6886dec436af0bc0ede8d8a4509d7a7760040e03977cc39760393da0dd70a11e84c9abc4cc50557abb21d0ab8301c1c4af02edefcf852fa972380f92f4309103c5279ff6a0e7b534718424c668576cc4a7443bd9ad33d88eda265df1d02bae5060aad2b840deaadeca76596c2638eafe1561396352df30b9c8e0261ede5bc5a03a2800a9d7c013030bd2ee83578a521244bcc2900d616c2c1842ce7db50a8a5ec326745c5464b0f45617883391928c35956d877ce03bef1aa402d6cca4bc02d7361db3cce33332b3f0a66021c7cf7d1b8064d056d6fc44b2ca914f4e17e981036a69ab981a406b298c82c31e750538835e1ed99c74ca87a0457a600fe0041ee25a12ca894704d299eeb588706cab12932229dccbe7070f0c44740443626e4f309f17feab2e48fc5a0bd215c29f5ccc54cdf7402ab94d55a2dee814929ba489f90a1e52ee325774c6e3d960b81b8b2f6082103d4d613a7fcada10452d5d44084925f524b7d62c73f0f3ee541240e3d78d40d2f54353a41a0d69eed6faa431d2967c1b2852352877708a2c4907c584607e5d6bb6cc80d6eb1f1eef42d78e45ccc2dd6ec34ea53e8a7a8db04f0dac9a2c2aaf0dc74223b41ec19bb9b06e157444914aeadd35bdfbf4f6a4e8ed5e96cc0fe5d056db45eed43a8b75a550fe91a6a09d59f2400f1347238fe705d6f05db3712df3605b8087c248343876644613cee91d4a1941bae6cfa1763b476ef0d1b7034630f46659bb5f414ea427be06d8de758e4f9a5fff0a1220ed5886dde742dcf5845fecdb94e71ed60df0932e6f61fc299ca91f0c35d1c68255849e0be507d6bc2f3bc70e12529b6c141684497df7f6a0cfff8cf57b028dc4a6730e13048f076abab639268536505323c28c914343ff5345889030a75aaeeb0fd22b2a9cf3d643ec14d6cedec1aecdb6499e14387d7054355127bf91d71c1e56727f3ce5630a75c1adbfea9ab376f155673dbc8b56daa480383dfbb0d78b0cf9aedb2ca2a8c11a76bf2bfe78666b073b67110c4dd7e9d611e89b854ea9c2815698c91491f1638aec3cbbe2d31854fecd79705576805df2cbdfc542c94f8f46cbf39bf5aefa533c62b6eeecf77de45b243ed882dac9ab505b3752d3a4eecbfda91805320b084121694115b06d3f4f66d64b1b20d74f158005b0ed2e0c778aaa11362770d6322fd5ee04bd4436064711f3d275400df49d1b1d7165a03a563caa639b31324ee7788c88ddfb1f982b503642ac1500f787421de16316df34445421e860eb5e67d897a5c4719096c2edaf29a00552b4df489311a0ac256aa25e65fc528986030889b2ac3fe5bebbdf872274bd7ea49775396cb08202cfa9cb4257efb565d97a08d12734f4cb6cc70b23564d3c4b0c1c73a21e61d66c808700dd867495c375e39aec03a5fd5f918f39e7ddd2da3b3d6a856cba14332fd9306af81c0dc7fa2f612066c4f91c1884c44604fff8fc46929567ade5267f6214733643add5b80984f5d896762272013e3547cc7a0041f089dcd846302f486449efe3578e6ae3a6083342ffd6093a7743069405f5da6c6b68a4e6c066a65c65d11d7f146d461dc1a0101dadcf9705516bb96684824bae49e82558dcd1c2293e1f5d1d97a50a1c07feaa1cff45a1cb3a091ca7a6a1643bc27312139ff10563c9cefe450a45401afd3b0df51d240765a7961070929f31083da206bee5300901bad2a9a12e44e50837d8b69e4ae08facca7eef793155cad7f4fc1e23ed85d11456a59810a7d0b0a1f3644defa2e4e3187f0aafee7fac06284c8cde9c6bd349d2c3e24a9c023be3cf6523e2c134f979493b9a68bda081a1b21a2595af8065882de07f39b2fb404b55fc05398338def6af4d1b815369651175c5a0ab59dc252241b19afa267001ca7c055e271d290e7da7d05ed8df04cca9fc5b40318f241d27161b3271d4c8ea49a6b7b21907a9bc9140de855ade05accb041f66009a04a319fc633cba4a9055cb7fd1e697407c7e082176d0d9b48805d2c032f6ce94735a2a8bcdb59bb80f755c44e892168c7ae71789b9d026ed6c9ccf95dfc0d10ea3ff91e670282b48f408069f025be0ca385ecc2d50888432b597a4cd93d384995c25d287a31a7c70f6ffde8335bea58b745fdee3bb61fb1e4ae2eb0077869f6958a535191f53786da96a9ca20d373939a01126a70dc2365aadd23bd79e98b7e67c3f06456f9570c3ba24b46e35aa4c77ee0656d52def4eac8db0ca11d4eaa0ba33bc230fa72060b12cf85e72f31f927b6a475da7b700ab8ba7e90a4659e3bc430d70818e8e9407ebe13c28718ac44983877d019b066fd1a91a5263e2d84f30944a4be202caef610d0149991b0ec6242c90faeb779298ba6563db45172a8dc20b98971e34526ae34a66c6a890a901af01c538f56f780550e37e383b395390ac926f012e50076634c1824857aaf1281ac868c14272a4e50d2d9fbde667393f7871a0aeb9faa1a5db5db01c75c447a379e1ba9c94396097e2ef6c64b998d3b0c717fe98fca717d03bb972f2f02fe0a8e0aafeb14d194862cf974a8901b100afe6787dd8e3e4e1332e7cf170781ac3b0d8c99ff4bb37a3ba47e97edb88ee51605692dd0430b34ca74fdaa87356c182296a634b48f74b591a80e8d2354a056ef84bec8aec3f9a28ae720a06426bd2f599ad2ec5f27d1633c0f80b3ac8ac2364c402b400c14ef9ab59160be4942f1a46f6ac85ab5d202ba256f614846f7796aad6f36ad5dc8e2770688b3ec714dd606d7e22124bb1cc28015d9965df3e6120311e31667c3955d22800d748dc8ba01363c5523c3ad149a3c0ef16e6827071acf4b9440d6689ec0e76da20ddb250fbb4b30101850ee1fbbb09c92321fc1538cbfe41794f51e665899fcde20c6e62c85cd5a7e89dc011031c41fd4d2418d61883ed340c44e715f2a3c0eb2305f7fd44835c0f7590dbbca3815035cd3a3448381be9fa84cbbcf64474c8e1e829f30755f55b9bb5f3eb8fabb05c1752966e8433f42e358243765a84f3be91e6b19cecf168e2c8a9477ff9dcd8ecf50359445e7017e0428e00bfeb623ae9102647dcee36606316ea066374a6d68c63c2f4ccd70036b14ae4575f6903f7ef77ea3503314fe2d0974ea84bf495a56bc8448cc9a1024a927c36ad8c11133e39ab836cec68c7fd0998107a0a94bc404f3ada7ecf5fe45cb1b986dd7dfe672a15750db496d2b3fbf0ea75d44411b16e3943561f84393eacc62a1cb664a54182944b4a872b154da6b8a617c45b668b0f40b0c1dda071782f7be0f313cc2ce18e9778c66326d835ff4f290594810fc348af36dda4a9268c0139d84d5f3c1d700ec028763fb60782ff2ea95611bf6fd9f51e5e097d7e65e2fc02b4f568406ab4568d24ca4abb3a91c988c9fa067ba43209098c260a55145fead19a69136ef0aca15a48511c117a029e33d917ce7f05b748189879102971828a0dda20a5c8d913731247c30b461349c245efe0f1ba2fff01b2e88eb5f0be8484bb1b531cf0f9de480969ce108dba5f44a0a834f8170840a1107622d08b2b83f07666677de725f637655fbd967b4580772748dee8535f754e37a85c58be8e9b9041c0e5918e5da8c4b3642cc343308b1f1f3432c57edeaa8380be8aced1537f27f4558639f3052040c73d9fd2af5b2c8591b914d8a97c5a97bce4efc9485d5499f7df7d97dad164ddd621cab1e1263275c1e07f1fad0b52bcccb0d1f9070b98fe23e4aeb751aee563e34ac6b67de433a789a80fa7858014ba660774479c75fee7b5d3bea327e86490b30519ba65813da062d87c727d1446ee10b74d82af54b54d3fd10472a9621c8fde0ebb947b6df1b76009a2ea10da681dd318bac6792c80b85682c973015401c4b35008c469a06a3c1010ae020db70607a40ad19b6a3b28a654c560856924975e2faa37fd592e59a331ee6a478881088f805026cd2198decbeb9cc769b6a7e75530e36928ea91fb687813bb7ce2f05cc14b888aa163614af243a912ed153d3a18334c1669e1e7db071cdd7d13c340892f5a784ae904c17bad08cc6887817cf85e62952391d8d3960a00f61b00080138201c103b5250aeb5ae0bd0d3a08e8446e60b9804dd211dbce942021f63c0e1e5711cc19e20d548e7c310ba0303a0168f30b35aff0754ef08d35793dcb21c90c5c485a946f600b5a69e2e223b806bc03b03bc2fa975d09d20b451bf47c446826a183e9ec5419fc21c4222a8568d5018b712dc3336eb0e635a53317eaaf7360305f2f10f76fc3e9ecb54f898caea60981c5858c497bc68fb5ff7138d75cd5efc9a7f11b8e5579fa8e1e51a3ebd1a396b9c94a1ec43df030f80b4067f4d53d5a9bb5806c342fdceb6f1503d668bc50224d1cf5e656aa634b5e81f9b142d062fb9006045c8a5413c9f330e77b1519923b53a3faf3c6c70bb1f0a37a985b7617ef894fc2bc81a2472233f073b665c6246089587f3e62bcabb0582aa20f179d86df7a9d9d3ff22e60eb48ad680fc3d0b0e76169d81c0e4e8243c77d3f6f46dc94326f8bd27f8a87ba0f62ab7358df6c93c803c5ba92a1cecd48c8b01a812b8189714966a37fb090f359396c3270ce8a095f1fd5e33fda1c0819c13f8968fe5f3f8fc5209fe12e1bffeb4433bc2bd175028ff9959f0284254c38081031dc51e84c5d98865251135acea292cacad25648e53f2da1504deabaff161cd5f13fffdebd9aabd78f27b3acce868716c131c87030beb86a9912474fbaf892f300d9c5bf4eb7f1fbef160c9885d174e70ffea752b70d60cfa7844c783937f7223f0b6fa023d198a8ab2dadc02c1a2724091df006159cd7e1ed505c1a23801127f9b713e6580348062f7c6b871aad5a29a6a283a622adc6702142238e8495fabc60312f756f74708d716daccdb30c33a7d1973fc91cefe92a96917500a9b7030497e278d8fb673eb74a5ffbe570701050f3abe829cc423fe3f035df21024eb9402111356f037714748dcbffb7f7f8af722581b0ceb427c3721b16ecf98afaadf47a84cf19181265d738ea91b90a9b0af675685b131b4fe1daa4b0ab4a30f87177e4e564e2165b48e3181b54d088201121c69b39f1d575bac0a17216d660ba366da1b25eede9fc086449ff66642531b1ffdd5c0810c76f23f26589a767c13c5cdc3353142d751927ffacdd4e0145dc56b6d9b41e209ac539f7d49c4d933eda7ffca815a31f362ce8ae117604dc259a58e0142bd62d6c0a36c5f4933610bac6d5a27745c69a00d07e3a4fb8f092bd2592b51991e6891a0323141b40cfe68a047b513725db48c558f6ee5ff24bb8079b3fd2697be4ed42c05d2f1050c48b8e49d783ddb562700b53712a591d881b4b16eb0877dc89688a9b1fb5daf9143282dbc93e78136088b97e09ab97e4ff491d8f6e56eaf900467a9cc58e0f69be5ea7b418884162fdef1d1b38a453a97cbb820d68f9b5964dd5d77a2469fd10be0dca7910b337f26108f73956883c41f18588d2054ab33b3190ca35a383c2b317874882e4e4fbee83c71cb55a43736a4792f83cdf6f24b2d35973323c31d4ee1e7795bf80ff4c6b15c3ad29b75bee34c749a194716eeb1bb6e2cb1b027830f91db9a19c7ddedbc9fd1b902cd14edc8f6e7296ae811bba4f5d0f63e6c85c5510424227d64c08ee5a6afb9c743851928314cfdf5c1fe3155dacec4a416649725fe2e06df510de62d66ff97a21c98ac148722ed2239bc338457658b2143cce3cb620ba512db14f207502a4dd93eabf7c59ad3e2d65d96626b31a1618d6b3e3b5d05a355a6da4aa8b4e2aa510cc5b05004ab153fd3cdcf8e386480ea28cc082b133aece8d3f40e38611faaa8fef65b20aa26cd01a76453ae4946eee909730ca71f4b7d007fb707aa822b3a6553eebe1260f853b329226b85ccc342de154f25b6e7cbe38ed2247d4558c5c7a37802ef2c5ba09baa65a7297ac306157f61694412bfc25adbad8dcd80a43d86f0d21c441e501ad4fecb0351e26f1f19610f8c7196a42c5dca8c1c15828f41969d76b3639f4f982635e6517742b044828c99b540189c15c35b22d0421b46423e793ca1a0c4f28a72f06d98aa62aee603bdf62868e892ace2ef79277e6792a639dcd1391c8f7592ae16ed425f6c5c2bff01018b3b46f484f4807674d5666a8717ab292e134d17b07a49d81ff36fb32d4ef44c1052f58b7bb1feea08482d85ca7f7f56b6dfa5b97f11afdf605d470e0222d9b4412d6da39d18a4edfe75f9f2d0993a14adbf18b6b8aab223d86cad72256ea5ca46770528303e6ce58e1d766c0e99bcd5bec6d58287f7a330eb21df48972cd931cba066491229667efbaeea44598a1f5d872e3ed351bfb354b3442c0189824691fb352122ae074e7a65bc90cdab92309bd6aa0f6bcfcd7663942f22363efdde8916de6be8d4f76539b13f234fe552d020a30c40dd1a767af613c627e91155f5d332aafcecd982f502e7b5047d42a3e7f319abea4971bff34fc019238cdb10915dc4c8cff930630f273cf4e89361fea54ffc21fe5be4cbc7b0edd57d393cbd032c52573e23602629ba9eb5bc3174af23cf28a344936efabed8b0ea312f92b228617ac2d2f57a92833a5b0dd99edcfe93a8b7c9ea0170bff94bed437b1b27f147037a70e9ab15b78579c7657be614e12339de7a79ba0762a5bea37bba55d4017139b93d65778553a9a92541cf630191647f71e3f5777fa7eed03f76c04e1ba00ebacb1b79f1a7644ad1abe5377156ccc106812b5c790709251e26add36e24993d1a796a6264be44704e8ac2c408ed82a855f0e0bf52002c7351a02ecbb8b0afdfbe9bb044997e690dffb08055644005deac2d66464113017823364365b7bba01439589785ea0f68a78468044e15fe3f69b321ce6fc2251a8cdc74c3c69410d5da3b60c6f27c0b959d3ba621edfe495ef9a924df7546f1e42f7da9ceb2dc61f8ba69f0985db0b8f08822bfc5bc43835d370453ba59b5978aa517199ce761aca9e9a5418fcb44ecc6cae77f0729f37dd1198a70512d218f1ad74953d0e2cc47c0d46c579189df1510c8f635a7d7459a170bb9ec2e5dd989fb936c72a25dc0979b18cfa9c2526086fbc347aeaead47fda014f579b57fb2aab7ab4c7d43b5bd98c3c477ba07abb24c789f9d6c5c6eac5e3bf84d2dab7841367ea2f1c38cd9d0131af90226cb63f147bc6aed7125d24279283b61142f5fd2b6592e1fd483d2145d09cd51e15833bb481e7fc68fb47916a050bad8dd0e1020f9badf72dd614579c41b33821b4d301996480e4b777e0a830450e3848eccfb1bf9bc9c128f905bf795990fc854f2ca8e1759de01d19ed95c307f9818bfe4a123e47abb9097c677047bcbc3dd05f7c292f5b3d24b3fa9568c1d4996255dc3d973ffb95f9c4af74f08bd7e42f751b8d9b5faf7afd04f15e5dc7c33f889eeabff65a2f99798b5321147dad95151fb2235753a16b033d3720efaf8a4b35951c4d658ae240de5deff475a78f73527ce52d16e94bbe19ea863317ce2a50550ac869ec471aef6c440627f93b9bab76d25f5d976e0dc05db0104778d88d99d753446d8c7e615a1bba462cd4cfc4d0bd2746d28c04193670d971cf1c903bd8393bf6301e37634deab5adad8411128110d3c6f2726bc5cf961e1519f25a64fc7c8e3ff5fe78966d4d5295ac82e1974f212f3e8bf0be889020eeb1653012fab6ca406f5e8e3acbcdad47e72c31e0730cd5f3aab4c802591e35652206d263c2a1da4eb649019ad20b9e309f5571ba0c31404f5c1fd295235b66b3e72b839bee18d043be11b8fbf5f4ca82f2c079a98eaebd1e1612efc6faa657c649cba17f0da8670d3d6082a4da89a10f4cc481e2a2f31c6e47eb17c10e1250e9ab73cb98e44cb667a8fd56058eb19ab14af0dead7075c054dc34d7dfdaf524ef60919784e7a36fd44e1c41fd9d10ff6309e9ba25ece3fca9783ab5d08edec8dfc10e692f8637782e6b4a138d06354466f9ae60aa88f544178e62cdd400da53ee0adb92a205c3249f437e2b423a874ba808bd44f707c3504a36fca66066feca79069a0a9a3ff475c25bb8831a62faebc52440556963c3f3195fc02a82e77f020db90d55849e4fe03ec511b20d4bce135da03ec239871db0f4015d7096c538ef7882eac16c211fc1ec9554c27b822ea8e2f2e576f091eb7f1dbdcd4a64db602b1057c8daa3534575b2a357c918aeb0f7ca0be84ddc11ec6d87a05ad121a25a871c82925704fb66ecc901abc42b1578d8606640b7a4986d34c5b1f6093852aea6dcba012829b849ef8206bd30b464da903fa5a75528474209681fe133369c111acd0279eab4e0d1bb2984c168c1ba4c5ff86b248b7231e2273ccdca2641c8f7d927e1aff7d8a015b3609472036ec30d202e5634f9b0dfc54a0737df5bac5dbb15d362f17797ff390db0eccae5e25b0c7480f0232a4f9bee845cb12c3978170059344240c7fa18b6007012950a4ff60e7f40d7bccff628dd38e174647b6e4f3232961358af206b7d52030d35aab550f33cff964d641041b3cc044b7b8f8c3278675933504768a7ad5dffaccfdcd27725b0cea30136f60613248b3261e9a454d1583b8deb4c0d4c99f43bec6433c1b4dd09c88f196eac093de5b6850c15f763ae3ab213a840369fb63595274921e047d207d02f4189356db717ebdd616618752c9a5920a69d42ca35a93b156f5c9bfc4aee876a54d5407466e0f384baaeaa55514c90ea7185ffd7bac68b5859e36e065a859966a35e5ab5ac0f1ade5bde99e0b59d0a8b56222a049d6841004cd7520d2eb3577a281875e360c218ddb499632b38bf87e3b105ce70ec587312c8e5c1564f2ef0ae9081075d6bc19dd0e2d2d6f48aa5dce964c0fb883278f2f95636efb156fe9d2481d54d78c17891b6334e003ebab53af7323ad3243ac12858569d17a57c5ecdf25ceb756de4eec58d25541a622f33c1d55daaa0c4e0dfb2b32ad549c0080e24e8259c8123062238813f3ad39815dac2f65f6b9577df3002669b94b111ad74472c1449e65be03ce6e3dc0400961c362cf6e2aab3071cef66cf4fb9a884c2c3cde8d1d05848fd94cd3c98cbabe4efb8cd78b731e6b901bb8597ef267de1871d787af6a617aff196fe7a253d3f9b595f80813df57a2ae88eb0c8c8bd76a3c3e1e08e812cf7c2bac1464aff8be6ab2db012883d57424522588f3c513d7445ec1ba9ba8ade5498396caddeb4cc8722f4bd21a7780203ee21a365e81e253c9daf46fffc1a4bef966919b878cd8bac900bc1bc9472b883e9ac91f37ea29412d560909ba25c4492d3cf1f86725cacfd1e4af9a647ea5c1b35d1f4f6af7a43668d07b05a0732d35700506df5716d39ec84b9e6d6048c5068a4720ac3f070b7785f3069ae13ac29d75ff7dfcf6be2c579db539148bdca52727aa7b0533a9278058d4bfbc87ab4009efe9fe9866ceb49345a76613138343d850d114273d1c7461f8ad5627f24dc5c7f58e5cd67e5cec47b4b0c8bf309f3e6fe4b48f65f8ad23e764ea5e2bb9b47d72fbccc2c7eb683b61497b46f679abf8796184883b3ae4e75428b7bed04ab7e46fb981be29f19d1e7f067d1834ae5a3e733bc46fbee66fe932af1ec645fe28391ca5334005b5b5db61c3cdd089f9b02cd152b4c30e3a510c659713ef2f659c1f80b3a5c7f642b4fafeef2ba23622b3d51331a9b4d0678ff76068fd89013a6607f7b81f38aa373cda35a967bb6e3582611c0dc5a93d95704db561669fc04cb8707e61b810290a17de37f179bc6edf83a3befe42be7ecd8196073cbcd2dd8dd57e11d87a3e2a89cf485a3201974dbcf0108cb8f3c9a8970134188f10ef715383d9cfaac615d8507540cb4928a53a39116fc3c51df7ad2718af1f7098f511e22c941135cdd10bec6a64ef62bb55e05555703fecdc10ec9214167ed8d7def6da42e6f508a735442215c4976322074e10488d73f131a15978f0fc10365806ac560a4d4348700fbfc593466fb151c6f25074e0c2c22d8c5c651ea1d2efb4631edef6bcc81f42e15415faa03e9858dac793070458f2f3e0aa9869fe212fbed8a242bcff7090eb1d59deb204875c7151bb376151ac842c6729f52159cdd916593eaf45e4f812a680460d6930857049bdcc24192793a33cb09c27d9d72c9381e57c645338cfd7754a0022ceff015e2456bdcc21c2e1291aa9a2fd7028aea315f22670b27abe7712ea789f6de7b92d3f0b9f48c5f0d8cb57120e60caf2536f3630130df45e62d83dbbcb0079f54610a42a0936d6f4d5f96124e2c7a1e5112db69b0e0619da96f01593a31cf2c649912c876af83bccfc56cc996c26ab499ffcf7420e5a9845ff34f34b2053f4c445b5ee2a3daa185d69aa076aab5cf30fd4960768c0d32b4bb6b0cfbf44d5af84ae08517c9b0232ebdd41983fcebd74f780d877b83767e6dd51a1d72f7efc1de906dfbf93a763cec663ba6076bbf1fce757dd885f740416c72cc87b19de2bf6d58936e620ad94fb8dae6c15e9d8b6a39833ada0c36a1f1623cf5ac8cce1b19084985d5c4c6f4dc5336954d211dea5541de91f59c73ba5bedc7c21ff843453f7ba705490611bcf2909dfaca8c06facc978cb99a7264e5f1e74d06de274f1559f4dae0ee643ef0d63eedfb75b34836d1273d0fbae92596c6d527fe7103d2465bbdf9e2c133e16c327bcad053f708676b10181e35aa6dd8732193b32cf234f13ca637134576f6b86ef1955cfe490c216f5353d75d61faf008c56e42d4cc4daaae20e8bc1d9dad97ab3aa0e45d674128cc6721061ad58f7330e1881c63f30303a458ed8964870464e839576df6e1d4b058a47c28aa41ca642304984b460c925b7556e82bc4799beb188fdf1f19a410b8d9e1b0a997c31f1514b598d08b56bdc55d4a78c504c5dd348806c706808d6a34931375bb9631b4b2a31d62f1563d0486be78410d2b39297767ebca52d94f03cedf690a147df27a169e0ddcc91d66c21e5202b048c713dd15c68aeb540b29d18ded518f2eba6483ed21d8cdd049712bed781d35b357f8cc44f4bb9e70e3a7355fc5c91e100eed82b0382380a42494a138365bbeb4245e382eb46c1c331deb92177ab68594abb98b7aaed428be30571dfa03fc5a562a9b1dd06e718ea6364f208bcbf59e1e1a505c853855f56a224962c45b0883dc2fa01bf833e36f7a0ba9790ebdf4de5e0c527bca2ced34c70f3baa66d742817a15d8252abcf2d50f139ca70f1715a2b1f504ed59bd5de971950447759e577a0f9f2c2cc3fafb32f39e491f2f01ce548e16f8c0157de11e4cf07226cd0edeef005f56cb481f866a991173b188fe4cafb9c13aff14620ff099e7576797ec20a564f592ee7547bbd081db6d5931d7fe07b7e1763b80b34aca59aa4847319cf54a0202ce105ec8008a82a12da86a2c4bba54f05a4f1bce3448660546192d7d91e8a1037d75221c9614e5369dd8461a09f12f13c9faf96d04d200acccb357ee35506bede168960a986a1d32cc5a0176e51472dd121bb18e39b0fe3026764b5e7c9ce64fb11f92da74de5e3ed5fe80f4e11b7f532d2a2b87c82974c0d46f4b6873766078d787e10c41128d1508b31e925ead236fb3d7f8a5352f47f93b36fd101e1bde7efb4357ec1af3f418f54596abc5b7cf815d2c99964e6b91ab0354c967e3c2c87dbe00550075805f9a1690499afc7caee3d278ca7f82bcc46fdb6c4ccce8c93c37c4bb3710d78dfffe3b18734e79673cb5f3230a4dd535de816ed4360b971668fed7da7dce8050f82f0578d91bf6747ed4ca370bda490be35c2f656f5448541698ad8ffe2ccae62d6777f558f4b9ec66c34e515b22134f8a57f984c0f471091d980dd1f7179077e5b4dbad17a909b09e253aa840e664a0d897102c8c0b4a6b9a8160aa5a24286103e2aac0e8ab89d1dc47acdc3fa50b9e07623f4cdd8f87c5176c897d0dea3df56052cca021ee984a00c3760b26639ff00000000000000000044b351224c2394e0945292d123a850c6b98a32a594a44c918b8377c199894f67263e14111131624709f00bc30cea0c288b3ea07a3bb4c5ecc491a5a30b2ebae01b7cb8562d5a25f5cc577164dd58418eb7badb0396d32c47cc089622a7c7ca14d697f5494e7064ddb86102772f3247167a406453f324ddd3bd695f3890451ed0efbd9ed6592a9f9eab40167840a8453e25d4d63ba04cc5c9cc6d69d2a98c043abae0423190851d105f2268f6c709dd54e3c8dae1754047d5b194ad1e7392b8d906b2a0037a53ced8e41b9ec23238b256e07340b97dccb59944836f2890851c90d9be3524994835163c410ef62e13c8220e2825ccee3bfc6a0c56061850e66d11c8020ee84c723f924a3266c8e20d880f4946cb14fc7cd7cdc20dc84c9e2e2fbcc3c4f659b401e9665e729d6b31b96c40b8dde6fa4d1d4e9bb706c47fb894b4a7a693dca80121eb7399c7ef82a4888e1c9815f8c08d1d59a4011d4c27a52d5ee3d5a91fc8020d88e8e1c4521acfd59ac133a03b84fc5d1b2f2b5f64610684fb5b857ca6e7daa21eb80a7ce0c68d2cca80f4ca5de693aa94c8850ce8926f2ad3ccc4fb5d598c0195256e6d327d6584b31003226ffcddff95d1f68e05e9149045185029a89c5bbc94fbb204037a5b369a5f8d09d3e2179031ad84a9d198e4c68b171031690b9f3267c81b635d40ff7a9eec5ab9803ea97169f1522d68c81610a79a2c252d934cf85a40c7b59843cce677f965011d5b2d965ac67c15f35840c7a69464e88579597f05e4e697e83f26dcf2c4ad8092f7f4e193cb86f5ab808a977c7278b0a980ca17a6624c228f5cb0a780fad2ed8eac6929a053e336e6a6a09b3f1c0564495a2b4d39cb7387a1801cb3b3c9b97332aff80948d9485237c993131066e633a6e4a58a9dd4046476331fc95d13c54b4c4029bf988fe03f7e91b404449439a5315b9e2e929480de7c7b12903906cdbdd499699545024a4c5cb9f1eca01fb2474077463a152b05f3b18f11906fba4eeb5f6fb0d22902d244b52a79d584ac1e22a054e3a970b14d3c25cf101021ec887fb8dbc5ef08011592743a4d5b10d09d629acb577fc8910304d4d9a7b6cba69d76f507c8492a84bf0e61d3f23e4084e81b4f57b252d37b80f23aed9fd2649cbb7980bef7209f9397fab93b407dd49c3224993e4d923a40699e934fabecfd740e50d69f3b96f9af95e20025dbdd44ccc95356ca0d90b14d67f870c22c6c80d453fbaa6bd9c4d297450d507aceedd4e9c9674a97050d50d942caaf3fcf6fe2653103d4e64e22c9f00c89b1cb4206287d49e4d774351ad6c5029d7c9295a826cb2e1958a05663f08b1cf30a942ef9ea55c97323695c81902f652b49f6bff7a5152899de3efdc524448285158814369b05c91fe2e5ca2a50fdda711e96c476af0a74a7cd34914b05b2d243e35855872451818c8f706649fd85cb9d02a5faa9d4a5258d773105227e7570b9944d29cb4a814c37b3bab717291076296c6dca8e025d31eb9b5fb294fb230a9496606afd9ed3c53214a830c1b287fc19173450a0ee2d87547d21fb21f509544a3fe77bafed267b02591e9b3933e1b6bc4e20f355fc5cefecdc1642004e203c6d2399ba91b910d200026c02997c521c15f518e7621c5937b8580e1843104013c8ab581bf4b2c60b1fcf043a89567fc5a474e70f269071ea72feda4851737b0954996e8eecb7c94f869040470e1630004d0380080258023db9372ca67bdd6c7e25d09d3a88be5a5af09873a3cabd60c116a60070080250029d3a7ba57415b249bd49a0e432c6b5568895fd220964e5921adc94b6d4a66223081009b4d899d6689924040b4302ede13ad6864f494a7d1e814a953a57d660eea9740470044a6a30cb253457e5bc360291fae72c6d8c6229491981fa360bb39f5e62d87311a8dda4f6aa53ccda2f2a02fde5e61235c344a093e6a8c69ba4a5e2820844d0b9f836713b04d2fdd7ae652f7c55420043a0dc52bc7f9bf14e6e16021543def394cff276f40881b239c9798296baac9b10106010284bdeddd7bd9782b7824026e595959a3e44922710683539796c3da50b0200023979b653d296ff804e5a639b29cd38721a3fa0244d2e3db13e7b3fc127401f50656aa1a25f4a52d87c4067535afecb554e9b760fa81b49c1d6526e4dfa24801e501d61f388d89c07f4494c9363c8abcfca7840e769e78d244c774096da24d190f4b6fd6b07b4c51832a63b1eb173ea80d29d37c90b39bfbe890e68d97462dc94ee7131e7800e9fcbd54736f52f07545a11dd942d15378e033a04cf7b9242d81dd5c001712ab374dbc7e0252b0478034a8d68fcd89aa4861c02b80111df2e5de29a4cba0da8eaea1cdd68baaab30135593b9b4a5af394d6803ad959e13de7f4ab0654bc1829ad980efb4903da53ae948ee392846840a6d7674f932029d26740fd87eb8a26a9e467cd809e0fa9b2b652c36540a8699bba3191724d06b4da66bc12dea72a670ce8349e347d986240ce45127f657e18d02fb3592187cdfdf2c18030b59c1d3e23d988ff05e495ce6351df377df85e40c779acd413ec02326e76b0ecf1eff2b880bcac97d34c26b6bc2da0627f2655e549f7e5b480d8946f4fbbc4b471f359405f47ca4f5aeeed99c702ea640a76a52fb2a5cc5f01a5db62de11ab2aa7de0a48df0829c695895ce4ab80dc4fb26a4be6cfd55301b5adf96bf2d366b8a7802c99ab763a7eb2684b01b5b1ed1b9e354ee72820eeca734e36410125d9c486bde4f8d5fa1390759d83a5764cdda13b01dd6f1fe2c5681aedbc09a84b7de5e173facf31ce0454cf9e465f6d09a875979492f490092b0179d69fafa3ab8b2509e8385a957488637a238e047469968e1c4debef7f04e4a78ed7f293ec6c23a07b6392e9d5ee76b808682ff939279d74894d046405b71573d310f4f7b8a46d4d42408ce9d6be6a968d3708c8b0312c572eb5942d10d07b93dfd6bd92c4cf0f50226acb653e8f93aa0f10732776e19e74086a0f905bf711ffcde601aab3c629a9b12b5ad83b4027a5cb67523a40d8eb470b49cc56b0e400a5f2e57c79d6c4ff3840a867d7341b63d0b9fa06a848266524594e597f1b20c44ea2de8696fa5d0374ce95d4699c8816c334406ec81632936402cc00912d4e5b760ce31e6402c800a539c8a58b9653639063810a9f73bf6788a97c0c0b4eae746777af4044391329fe3d078f2b10a743128b923cdd695a81cecc323171b1af2eac40c6902b564b4e3789f02a10273685bff79cd7f3aa40baa4b4714fe74330a5025ddfedb392b2bc4605b274c335cf5a4ade29505225c73a9582a494630af4c611afb89020692d054a750a1a229f6371240562cd35d34cb49cdb8d0269317bb584c69e594481cc4d594424cfe46428d0492385601e27163150a0426e4ee25f7a8f7f02a91d65de2f247902a52bcc26cff14ea04e4bca3ddf59f637275022a99b8d49e914f4de04ea2c57d96c2c7151d604ba7d92df87b8a6339c09f4e76d4e2d7dabfa60029db673268f1333f3b904522b72ce0939fb4d6a09e46799598a9e9e4f56025d7e99a5e25b96072981885a96bbc486a0dd4d02f112d47c3b9aafe424819828f9ca5ad67f2e91408794eb361e2d064f81044a56964f49fb45f6ca3e0291472c95ee9c1eb7b28e40a4f73af90effe0d53602a9f3e925d3247d125946a0527435a598b16bc92e02255aa3da2783c78eac22902125ebeb340dcf7d22509364fecd4f972ee611813e95d93efb7e08d4f8a959cff749d56e0894b8549de9c2c48b772150f6dd275e238a599a10c84fa63a098f9aaaea4120c33d4e8c219f5f9804810efbbc6cb91408e4a960aeae1a56e30b0894d2fb4a09bf9624fb0754c57ed679d30fa86a5fddb86042dbec03ba7d24ea6b4e512dc907d4ec953ee9eebd1fdc032ac6af7caf211e72a807944e5f317a3e17bbe0c9037a66627667f180d07ad5eebc2af3dc01b13b57ae29b231e7ec80ecf867ba2fc6f890ab03da7bc52f6b8ca73a430744b8c9b1ff54bb259539a09279d25c49934c5e910362835e48aca47e548b03fa53b58620b6f7371c502a6d6c7552cb5ddf80dc7c423f7572d8911c372073c6acf5f1ddb1424e1bd01769c26cd80aaf391bd0c9546fc6b8d780cc62779ea526c4a4a4069458d96fc549d380b63bb9b15172d230291a10134b2f434aa53d553d03eab5dc3c969b7e51d50c28d31ba6a6227b9652cb80deb92b0de79afc924a0664bdc5fda7e01890398d786cf10fcd1a31a0d6aaf764342e7f4c181029e7c9b931e4ce9a0103f2f4e3c57031fee7e50b889464564d1779245cbc80d27ecd29a59f5bdeba803aa523df25edb91d532e20ff4ae9f318f1265b6a23f678a553a9938e84470c3d6412e34f9c9c4e8f2f4ea03dbea0808e061c0662e481785f553a6fccec19811878404c4e132e4c758eb4658c3ba094e7bbbc95a7aed7c4b083c9339959c69c114b63d27c4ae355a3d789db0331ea80b4bbb45a4aa77eb14d0c3a204b4b49929afabe569903ea3e75ab662ebd3a315088210754188f8db9e15f3e1a07b4fecf89ac5f76da64e08012b2b3ea6ae2e2a5e81bd0ad9e74fe89ffab1b74034a539d12f1aa143404cb62b401a543886261df97ef62188062b00171393da7a62fcb55de1a9079673d87ddbd7fdad5802e553a726596da8f296940a5d848a62c67342033093d6d5d964d46ed0cc80af9d5092e39047fcd804e1d6336b7090d62f2325ca5a9f274d34a06646e53bfd7082144b1c780b0142b65ee16abec510ca8d0dcf14354118f5fc380d42ef5a54f6b537f100c08953d0912fd3a6fe62fa0c2543b3ec958912ce305748778f1f73c4e8a5676019d732abd2f9e42d2d7b880dcacf61571365b40c6f30cf7249bee23a6057458a7ace1a64ae92f650131ef597a9dfea3d88505846ccc3813dfeb30897105b489a6ce6f3a896105d49f247da6315f5a98e0c832cdc5175de0d0c0c70276b80e1d5b7c7c7c7ccc21461590e27193b287578efe5301356ba737da479c98f929a0e37636a563bd4bc75e0aa855d99f984c6dd2e4a380d2b1f4797366e6b543012529becb2fc44ef5e927a0a2964548d2e3be6bda0968931b39e4547513d0156bb356ca7a9d6226204292972dfee649767909a8f0ed90682287cb1856024ae7a49fefd48913164e02c2c4e48c55fe2cb9180988f7ca9ea40613c1ff740444aec95539aec908e835399f9224f6b5958a80fc9c9794f614d6dd2602fa2b628eb64b4abeee101039f95da92f8580d60bf215295bcef1db2020e4f295587f8bbdca020195be31e6093efbb79e1fa0424a15a94df701aa54c90a77417f46d71ea0359d4ef2482a0f1021cee757661a4df10ed0a5a9498453421da0bcf25b49d05412829803e469e5fca9f6357b0ae200a5623ec9ad853740fbe4782e37f727c33640f7c432fd314d76736a80385932a71c6b134d4903e49889d7684a79c77006c88f1362bece9842f62e860c1071ad348f9a5934532c50396b6c32132e216d60818a9aaa77b5944e0e31af407ce746df71cbf14dae40098b94b172d81836d80ab4cb67f5f4dc9db4ac40fbef69d08d57eb216515e8bfba15af9394f95305ca4cd55a96bb5459b354204dac248d891f7312a302fde62221f7eacea6d429509f5255e53999424f295a595b8a1c00462950912324592f51dddcce6090021d49fac7669f63470f529e63478f53810fdc28008c51a0d45eebc4bd8888477d87a92dd26ea182cd40990a76c70460880291c2da47ca298fe954c1915ae0e0b10fd0130ac485d3f85922e654e003375c000314e8ae091b5bb74d6beb4f2066d37667da10672cc713c8486539597dada76c3b81b4be1c89a7d33597c80984797e2f1bcb6c02194e6db6b90fbf56174da03a35be6eb2cd28b1f24526501aa6bde1bf4ed6654ca03ba6867fc95a96c37b09649ae67ef19f7c6109f4558c1263696d79be54022d9392b6a095e64a241d4a203b891c7b67ff49a05c23e9bf359369f5950462e5feb7d3e22ec95c24509e2eb9c76fc7e41b030994d57b1292f4c5454a3974dc383a80f10894fa1ad9d8af21eee40d393580e10864de942d84bfd3fc19c1c13a76476a04ea7526de86dc59ea545e00831168f953e16d3188234b05aee3868e2e4c2980201b1798808d18c05804da3fa94493f14abfe59703188a40cee9d36125d6b15c782103188940a630b9a44aaf98a949850006229071ea91b73ffc87ea7a3c78dc283d1e1a38e83bb2021fb89100188740daaea9fd89eae4a4350432cea68f9abd3e2dfd4220538e84131be295d00d06215016f463da644bb16a0f02113e75ca9e4d5d96dd08c2ec0fafb2950702311ff7738410530c0b0302993d7c8ceb595cd43a7f40b97f2917f5682a5f8923abca35c000adc0076ea800861f5016c35a56d3a50f88eb8b49f5f2578cad78f0706605a0c0357014061f505be7593e87b977a95cc2d803b2344c4f27b75f7609479641187a40b5f7dc464c4933f69207a4cea658bbde38011e88be5bfa5b217fda70642156e003375200e30ee8922f55263dce9ace175c6c0a8ab75d053e70e360d801113cc94d2c539e2ed57540991c939d62caa6c44d0774109518537268f68acd01b97b216daaf18b1d437064fdfa0458d0829dc0251160c8019d746dbeb8d010e3270e488b1ec28a697a6798e080ba49966a3be98dfd0be30db7058b266c52cc8eea281d80e186ff4c68670bd538298e2c16a41ba47487f7c86160b40169a6f7acc3471c591f1f1f1f3b78d481010c369c77b38566f40893d2c3058c359875e2c70c5e39fae180a186426204cb66a171cd1b3abaf8f8d8620217c8c0052660e3c3861636ac34043e3e3e6c5c6002368ad9d1c30b017802461ad8be9f70e2a79acf373b7a78c130d080929b5dfc374676ad01acc3023a1af0f1d1031867806186fa805106947e05ab924fb21d72a38b1e3a7240c0ec0130c8800c133ecc4ef03415535504c6185069dcb34a9acf92f9c580def38931b5924e621b08c00803b29494bfb695f98a7930a08405993c69fb023abf861f7fb1bd80b85ce9d405b4ccf9c509b93d666fb980c8e961cbb3dacec4b305644c2aa5df6c8f6a26b5808effd96a3167df98c42c20b3bd6e5b3ef956dd6001dd376bf2fe62574068580f318aa678b29539008615d8ebf238e13e36436c0430aa80ee3435a76c63e69cf45428abead2bfec84cfdf803105d484b05d13ef22e57f524095256f0dc18f023a694eba2e4d856fad4001757a29ae645f87af0ac613504a043149b93d7bfeda31184e40076b3fd3ff394a07184d408e65c8a49cd5165fc791558ae81c603001a573836a7fa654276f1c5959012e1a023a2c900130038c25a0c235aa768af2fa2573018612d01e3f5efcd2513db3af06184940f85dc4361dfd3b7b55678081047438fd522d7e17a75f0f1d9e822320e532a66c9ecc7466ee05184640a5289e323d57a5b5388f1e3ad61c461190a1edd9e2dba64c2720804184e25a534a8e173778e4382cd8e15f60400b15308680d688737e2dab7bea701e853780210454c79698b2a74a9e623abac082809340870e0b7c7c8c02461090a3395fc22e9b4692e0c8223b1601030888dc2f79c6d3a518f2b8e126d81e66a607183f40674d2aa914b66749c730c0f001c243d3b685102b8974e3c8eab4b185034ac1e801c2c2ae7b9ed2e973d40fc0e001e22ee9ca39760447168f2ebcb8d1636fdcf01e5de8285b183b40fd5c885ed9213a40fc5cfe1c26a58fa67900460e9029690c41733e592956bcc861021e384067718d9ddb4d1a728c238b541a0760dc00ddb1453ee538955fdc2fc0b00152a2a6c66a4ea7c2758c1560d40091e3e5c69952f7954d36b698808d52051834408b8e5a4a9e3a859acc861636bc053934e024d80b7c7c10833103940a2f154fd578b21803430608492104891eef26858523eb060b76f420554c0459c4023d339b74498f25e25ecae690052c101a49a933612d67ebbf0279396277d0c9c9b27357a0928e2ba62e6557d0b91588bca655f753b3b99758819c781d4d636c6ba69c55203ca88d8afc563099aa02199e753345d369abb154a094ceb5a4fe93336f8e0ad4e945eab76e4fbd9c5320d384bf8b513357524953203c3e5af0f78e4176530a27eec69cc57d27057253277bbe09c936dba34044bfec97356a7afc92287a9dd41e633b6e663c90452896a4b1dc5ceb07056a4e47f333252c73ba3e814c976c73012964e109d46d5cfcece979984b2710a3f596c23293f06e7829dff1050f1dc83881da5c39f926fd4d94ffae2e27cbb22690a2ba15c2a91b0b72c291e545d5156a208b4c2072b43b4b61a526b20547561926d0b93f9dee6a0e9e56d5b2b185033e3ebc3f3e0a0fb2b80422c99b961d8f1576161c5956669640eba5e79c0c53bf4b4d0d595402a919c765249d0c5b99551694405877774cbee949a05653b2456dafaad8d9d8c201cd458e2f7aacc06f38210b49a063941df3bdb24999e1c8e2714890e37574a1818f8f1dcee3e3231208cb199ab26d317f0909e45e8e1bf7ce9dc1d347a0db9408975639768875e508844afca446b35647f21a819ccbdb992ed6299d7238b25a478eafb2b1850314d03a7234e0e323055661c88211bdb87c9c4eae2a713164b108b3ed926f8a29b89e6e64a108448e7fdfcaf2d87555168940a524ada1e971adec83238b878e2e7270c1c5def01d5dbca7635c70a1808f0f1e26e8a20b1ca52a0b44605a4f4f896439c6c373f4c86166630b07dceef8411687404778ad5c92fed3b76e0864aeae1c4f439256440b819274f136f2e6a7585108591002659272b694be35b69e8340a470e9bff7e2886e44095908027d3fdb73fe9793d31308a459c924cf97eb639980405bd29a5be645e3e73b59fc0179bfa2e23171dd641647160a9c871fd01b6165af6ec491e5c59ee046ebf00c7a4055b76549d999c286490b33f28048395d47cc1a25c69cc49155d53abcc70a50e30171eab36234b945b5f90ee88d21e45c93c9b493ac94197640472a5d3267d2754079bbc9202156d8d22d1dd0219b935c4d1993e59403851973409a4631a5ecfe7a53490ea8709a26dc6d2e0e2815aba5c22eee8eaf7040c7bd6ceff024343f29cc7803ea5f7435bd987fde1c37a0930c33b594c92466a40d283d135284a4f9a5116703d2d2f6778ae829d7bb6b702c99fa93263935202d9e7c6fd2a923b8694057e6d918b3b3684065a553b3395b3635e133a02f7e8ab19e6a35346306849f6c11cf9895520674d86c72d35ebc4ba233c8800caba497a66e273c3d06e4a98ae6497cdab70c8b0195d36b5c4e586c4cba196140566daa9cb13d6ac86d610618d09d738dc96fd2f963fa02ea2cd2693a8d79a1ce3927f5aa10638a9a636674019d3f4f34cd7129f286142ccce0024a72ce31579692398e5b40f75ffe85b59da49ed102523cb8cd57f29c9917999105c4fd77aa495a1b75251be8b15c34e0e34387f7e8b15c7c0d61061650d1e3d7f6c945f2135f01654ac98f263bb6027ae35ed8fc5878db5215d01f4de8c7b814afef5201693a6c4bfa94f72cdb2920bf32464d4a5d92458f14ce49b7eae77c270ac854495fd7a60ab2a64201292ea7d3c77bbb48ea13907be7a7be2a57c7883a01799f76e54e0631f16613d09b4763a55d2ae539c98493ceb039efc55c02b2cd35e54a8c9e3d470948fb4e79794ee46cb92420b44ddc6e8e9ca35e1009c812539e35e5e5d1fd08a8abc8ba6a7226c79311907d49965c27d539e61501391337c653aaad734e04e499083957d7dce48680ccb7e5692699764d12022267abf0d13559693408a8947ac727474c162406088813b3e9b2484a2ed1f203b4be96997a4f8ca7361fa04ff9b929cd91f0e1ea0132879847e3f39a8974f30065252ce74e3294c18c1da04ee6f45e39c9d89e4d33744063460e906aab79d2f4d377d33b9881037407c93627331bc7a35398710384efa9fb8458c1e427bd30c306286deb770dd0d16b64bf2b6bd2ba601866d000113f3492d6ad0c72beff6ae06ac60c50e19389a4e2115be2a40b1e3abae02ab453810fdc88c00c19a09277aa24bb6eaae904001ec888052aa77ce3ea51b52f2e326081f0b06be7293b5d67505f819298add2f6dcccf787235d81faa4f24d8c5b3dff093c5520a315a834ea26ff9244b74b5981d2f6f45993e79376a18c5520667deb63b3e7b826f390a10ae4ceaf978e62e3dd978c54a04a9efeae4c8d713f45062a50fff9b66f62fa93c6659c027995e7849bbcb866b20c53a0c4632be630ee11f267050119a540ac65cf089bdd2dda09870c5220e38ebea99874df9ae0c8bac105177b032bf0811b2b90318aad3278fccc532b1f8eac52517817cb646e7d59e63214c8ef0f63597a2da0a88f4fe81692a7b60d61d67a2f6478e29c44bc7edff2451c49aa13e8b8a3a9d3556eda94e1043262badb86bc15c563646c02e579415e2fcb8584980c4d2044e6e5d257345f55252313c8521e26aacdbbca8709846aca57e79a2f81d4d636d54e5b16ac23c312c8781f3c5e42fc2cf1e1838c4aa06b4dce7b9ec89e69c9410625507f991af9d47bf48b962c838c49a0eae6b654fb5cabc76d902109e486c9245b2e5d78d4311248b7606f4ae392f65f2f0312c8583a558c21216b654e08643c821893dae75db754b03b6ef0a10c47a054148b6ea62ca674223890d10874962456574c3466530b5304198c4057752a194e06f30d9a1ece83c78e1c7b01e7c1c37bf80efef8280100828c45a0cd3587d3d1359fc4d01481d239ad7c4c8940a4cd0b2623e5d814642002f1733289bc96fdb9f22305198740ac5a527172da9b2a690894f8705549b3d529936a21901e7269cd2625492edd08812a19d7914be707818e65daea17743b3f14044a24c9d94a6afda55a17640402953cc8e7df6fa76ad208640002196c3425eb8a694f671d90f107747df2d212cd9caf1b250732fc80f86cb5ca374fea537603197d406ea96ec9ce0a47d68d2eda5e20830f688939df098dafe1376c848c3d90af4f2cb237ba686d820c3d2026c449122d2338b2ae6c6ce1000b002364e4019164968bd869c6bc3e87d82964e0011d82d5afa59c5263b22040c61d50e3514ff559ace592ed80d23966d4d89e378f95ecfc41461dd09642cc345e9a92522e1d50be6677326f081fdbcd01a5d4ff06ff170df92332e4803c9da277cea3b7958c38a03c8ce48f9d381cd0bb3121960c13c29ff80de8ffb5569b9442939f64b801bda683ac5734cf534b1bd023497e47bf2df56f1b5b4cc0467542061b909a4d59c448b97e6eb7a1c5056c6c31011b1f841432d680f83897826de709f93765011b5b4ce04cb1840c35203c73a3b9c41cd3db3a9c87d1a275707180909106d4f98eada61c31f3bf0f32d080aaf0e936be3338f2468f1cdc0517ce818fca92710694b88eec3baed164cecc802e8d95977d162e2595012da68286cb69c4e63bf7061964404f4e294ea2258d7953032470c680365d5d91abc259810fdcc821430ca8cffc7b9776db3acc38b2d0c61613e8f16125071961407f7a52d29448fae5636c6861430b2dc0807cadb0b699ff2fa0e353de8a181e9ebae91a647801f16b225fe5c8a75fb26790d10584a7fc31b67ac5dd8f96410617507e65b1927826630bc8d87fb93a35490ba8ff34319b9d932378594029a13326f67b26e49830c8c00222c737792979c8ba76aa4a06645c0195964e59c5553853922dc8b002f252724c2ac7ada675645401755aaa4de4d47362f238b2cc8bddd1012aa06c3dde9ffab68ee61450254d5f930ab732418614d096b56d9a718d025a62baae7c21443f115e820c28a093dee8b2915b376df304b4c76cc63ab5cd141727a064a89c5c9d523ae7ca26a0c5a2c5bfba3f2572ca04549e8a65b504a457690996a72c240b2b015971dbda7a21c5f6781250218a8b256ded0acb05410612506b5fd1c73497868b1c0191b52b35dedd9e48d11fc830026a55577752c5dbfd241fc8280222a91c4f7f3aad3cb9870a328880ca51757b2d46fdcaa716640c0121aae99447cc132b72706459d12f6ca4fbe20219d0428b0b4cc09812640801ad396e248497d1ae8e7f81821c3a3680a3478e0e7c7c10414610ced51a7c43e385041940289af030fa292589b9f202193ff8828040860fd0c1be54d44b7152bc28a640460f907163ac491b35e4f9ca17a6870c1e20f72ce9d648da476581d90e193b409d8839753c7756e74a0c64e8002d7741b45c5c1939408633d794bb835db0fb4617ad3a64e000f11edd54a752fbf972fc6f9423818c1ba0fcee6a93ac1c8eac03830c1b20f3c638a72e6397175df4e061baa8c01764d400a56c24cd5b5eff9d8f23cb7810f3820c1a20239fa64a1f4d27d5300974e4701d838c192043f4681feb65b3dc8c3b7a78214306b1405a89ad58992e316081889d6712dde4aec7e48d18afe0634eaf65530c5714332d4689113442ea2f2fcff490631a05888bcdd1c38b13f088d10a647a9fbbd65d1d5587053e3e7474c10a64777417c96926ab196315a8e41d274d4db7236938b2aa14e045173b18f0f1c18518aa402431f5fe1766c2fc920ac4a4ab39cfa55ef5d4a8406d06fd48b182a740cbf776aca42fc4ece489420c53a072c464b8d790539e7be4e0912305c7c6160ee89183470e0edcb8f1f1f1f1f1f1714301308918a5406b652f1162a5470a845dc8fa9e8257921d4b428c51a062c60a1a92c74cb52c87175b620821862850763f1ed6e4c69175f5d1e3e3e38387162cd041821c1af8f8f81c3b9c0314e0c1c377747f7cecf05ec7f1f1c13990035cb0f70d2f78608c1bc408052275d4b1b8fa932fa238b26e14e371036b05e8e32306281027ffae35f64d48d03e814e9df34e0939eff8e609744bbe34319367f5a29d40954d7853d26de504229c1261bd72d24d21ba893de6fb206f252f8e236b478e1b550982189a4085b71cf70e2de9b220dd30d3b1818f0f29c4c8043a557bd6f38c9a2ae770646a053e7083053130814c3afe2d7c685ad0ec8d1e4e82ac1eee80730994d2d32d16f3f7e8e96358021dc5d2e95f4bc90f6254029553a50b726b31d2cda6891894389bf078271f53cee9fc438c4920536dff8b97bc53393e154312a85415b2f79952f39aa122462410d16bb5cd345acec1189040e4cf92316f2e7157bdb1418c47a0c4cfaba87fe5f10a3a02a19b1192e918d388c497f218175cb060470f4620c28964e7bbd14f698773c1c50921c6225c5953193b46d392b422349df594493d9949870e3112814ef3923fbe1662892822d049ffc54c73b3fc91ea418c432034964ea752ce1b376714886108b4c5bacaf03863a77e08dc7007c428043267af95beac4b72726e08310881b4f06173cc51a344883108d48759feb6447b4d991574b1808f8ff6157491880a02dd9dc54f935ed7754f8c40f4751bf2d5cde9a738b26e470f2f76c400c4d6a6cb2af87c2a318e2c2eb8d81b1f3db8c8f137bab7478eddb10509402862fca15275137e1e673941173bfee3a376f4f0821331fc90c797cf9fe4cca9a70f4cdc9c5939c44a11c387a4a5555952724227bf877e7dbaf467ee6dbfa2106a0c02599559a2464d4a5e5e10a8144e4f9bce9a43d206026d62fbb46f3e6dd97be858129c05a10620909ab24cd8d9afce1f72a387f3f01d7f409fcef514c76d2b7f6b7e40c55211646c4b7c76c579f401b93aafde9bd562483e311ed4e003b2522b5ee9d39c1dd4d803aae34ccafeb59da0278e2c3da033a648496c4cdb58ea3ca094e7e49eb18ba8298c0774d5c6eb98fbdd2aaf3aa871074430ffd37da17f323ba036e94b2addede36b0e0735ea80aaeefb2bc99e747a4607b4b65dd0fc3c7e5935660ea8fbd5ae90f349d369e32107c4784ed6dee39ba62d8eac38a082feef897998cc2af11e3970a8e0460f27011c9049f96a8c64d39cba546a50e30dc8895e2186aa7ef48f1bd0f3394ee6e69ced726b03cab47e86286362ced246831a6c40960a4f299f5e2c211b1c59440635d680ced86d9d16c2c64fb91ab67a31b55b2955230df58106545c7c92a5c73b37ed6740e549eaf405cd26939a0a0b76c78ebd13d430033272fe34f58c2189490e92a046194a0d32a8b1217aebb695923135c680fe1c7e34f462524a4f8ba2850a35c4800a9e62d2a723a583056d638b09d8580003da79bdd0000b5c0259881a6140ef9a68483959e53f32861a60e0ea427c7bbd72fb71a8f105648e9a25cd16c73f7b35bcc0034750a30b8838baddb1cb643edc1a5c40794fec9f74fff3133510a8b10544eecef6bb571e7c6d2da0b7638da6dcf1ad634c1610a754f5728ea91a5840294d2f9d4b1b1c593bbaf81b5e8ac70e7f1e3a4ec01ec8fa1a57406eca2415349e6f8cfb2b066a5801f9639253edc33da594a9420d2aa02cceb6eb2355630ae85d1f1fb58d18f38638d299078f8f0f2d74e4581c5a7c7c981bc01c6a4801691543d221ff8b23ab542b6a44016597d27555fcfba5a58b030054d480427d60066a3c017549983815c2a91c33ea04e46b66cfec8e249a521c593b76f849408d26a0329876abe50b47de40eb1a4c40c4fd8d7ea6966fb7bc408d2520b2bff8c9603b72f3710d25d447096a24010036a88104b44ffaba4e62aaf11c2704358e800e5b53f2ae6416d1d64ff0058ff4050fe3811a4640d84799f5320f47d60d16ece8611ca8510474b8e097cd22d5e65772ecf02f5070a38b1e444026d14a7db2df8e2e70b08e2d6a0c01dd96933abd276252325c430828a975c9d552db3a97f24c478d20d400c23185d1fb30a5498538b2cc870d2d6c6861830236b4b061638b09b0803f3e6e9042428d1fa03d6431291731837b93a8e103c48e26fb1ad39fb36937b8e0e28b5f40e6046af4007df561b5cbe254ac8e23ebc619568f1578f9400d1e6c9b32e94faaa0d7d8017aeec35aea4d2692c33a40a596982c44db39cd598f1a3940f82761e1d9eec922a4d004357080f8147a97318c86cf7c7771023c438d1ba032db27b33deb9843d606bb6d9d8e9de87aca8e1e3a503118d4a8016a3762079349cff46587e35081174b8122d5c3793809742c0e3e590068430d1a20d6c3edd3f4db77d671641d0ad4980132a4da981f66afbb94400d19a02cba5f5bf976a33880462cd09a94b8daedaea463c29155a590062c50627bebbda2a76849ff0a645e9333f53ca6db7657b4ba7f26e3a5bd15a80de29f52d57a4cf5b3a20d4f36595288af026532e5147356b5f43bab02194e89eb0a935f1ec554203ce791b33f331d521815481b7dd5f1f2f3a4740ac4686b4aeaa45c5f4a3205d22ba364b5f096023d3f2b6612d336c94a0a64a4ca18b14c66a6e819052a9d368927e2e9d54c8a026522b7afa630b13ef45020737d7b271741814849ad5dfef8dbc73f818eb13cbbc3be5fdea82710c137a4ae0b1b962bd309c45adc7dec49c1c24f1a9c40f8a46c9aaabded2466132825b3274dd76e17214613a8daf426277defc55b3281f6cf31d7bbbafcad6002a5369ace39c4ca2590417d52ed46fabcad2550327ce3336deaac6a9540a776959f589dd920a1410964cd6dae6821bda4330941631228af8f94191ec1349e342481b21c6f2f4decba12ba0974a0166844021963898ef8a6c6dcb1b2020d4820f5beb6b2a9950da9baf10874bc9dc69ef4317acc8d951f683802b5fda65a3dcb89f745821cafa30bb6b1c5041c41a311689fbda01549779cca4ec01e7052250586011a8c4068574c9525c365fe8d23abadcc3e406311e8bbee1ec96a324aaa7c7c7c7c98da020d45a03ac6942537aa468f2d0f341281fa6e8fcbe36327a2e1810622d0317b9478325adc9c7d12681ce29c2f5e851bcf39378a23cbcc109b6d98f18a16023d3a1ff34cb08f7a624d810621680c02a949e552afb696fa8817a59f4043108fbea9dccf7296c391e53bbcb8d1455f1193018d40a0cbb2e4bc283124c8c10310e8bd1ecfa0b61e93ce193ad0f803423fd6867ef0383da639d0f003da62a68c77a7a6b3c371a0d107a4e5d6b9a6d3164c6e2b1ec507444e93f47c65f6ecc9111a7b40fe7b08c154f6e0e89143057a40a90693b7133bbaecc9bb4a1568e40191372517ad8c9c72d859906e10b3b185036c20bfe1058f05d8d0c2c603d0c7478f15b851020d3c58d2a3c72c253e57a7ca1d36914374533c953f65061a7640bfc6fee50dfb3dd1eb80de19dbf99434c4f0361d10d7794d65d133a9493c07552cc74b5e7f1ac3729640430e48ef207f771ff9628a7140c8990c7973f75c061f0e88609ae3e51062de8096d85e727d7346cf796ac3050d3754c993c7b468515dac8458566b75b71f4756d680461b90a754c85cd6342f2dd160034a9588f9f9d4650d488fa16e39a59b94f90e68a801996c53c6a4b9444f511a6940bafa273579c742cca28106f467c7cdacbb978867407545cd9a6453ae609b0111432bacaf74ae0e7f1910f61673b7458227cf93011d2d8a958e6ce5cdfb185061f974300bc9272d2d06f4b6a7d7142b6973138701f111c442529f03064492a5fe452e6989cff90252728af3339f175032454f951745eeae2e2053e7754ff10fd772015d3259eed790dc0232a4289ff5a61650723df9a4ecc9fef62ca0625dfa75d8a4944c6201b9d1547998ad08298257407c881d1ea7f44fd60ae8f2fc1cc6749384d45501fdfe316575b3983c55a880d2924d51ebb094b236055457e6e06b49fe5e5a0ae8cb54922b3529d55ed18802d2fcd44fceeafc4442030a881893da60a3a72720444f8fbcbda756540f0d27a0dd2e6a2e4b5133cb75e3b0804613d02a63b1539e4d1792a7c10454aacec9ea94b73bd0c7c7ee701e3496802aef91141f924ac75441175a7c7ca8a08b1d3b0a053494800a1a1f9235c64ee93f756824019d4ae5f6c679e4a43512d0e936d76bfb36dbb54740da697dbd4cf14d85182320cfc7632c2dff9bc3a50868cb1b73e6935bff554a0454af6f58ebef954e79d3416308a88e14264bacad9cae0b01f9bd5ad53ea6bb550f0232e5bc9d4c870e04444c932f6f8c8da661fa01324730a5ac74d0b53f7d80d8f0315959d548727b80b8f01ff5481baf293c40cc9e679b97e85a753b408918dbbdcee2b2d5a20364e732d99f3a520a9fa2910344ea1ccd369999a9da7180cceafa9624b53740a63049bbf89beee8ab0d90b5671931c59fa95cd6002537af8565fa1afd900628a5693f4d633703644b8c8b61253e6f4d32d19001cad3587ed50dba1ee558a0b4ab5c54c36949ebc002a52a49f852af1726bc57a0fff593ced9b47212e30af468bcb3cdff8a89592b50235f3193ccba3eb99ac10ab4c994add3e3cd58053293f83eada6412b7e5520e43c73d2e6ec0b4f2a906e25e25fb68f35e14105523f7a9784749bbb32a740c9a8a8b66626397932c00c53a0e5e39fe7984e74248923ab01334a81b4787597179bd13646478eede13b08026690a253251ad35a8c7f810267003b07cafc0b1478df604fc1c9316314a8beff2d21b32810ef2627575636cd6f7e60462890fa7e31c72511e3e7b3033340813efd4f9a3a5e7f8ee32750a1117ff2698fe9699be189d209748a3ce953c8a9cea9c291358313c4125ecab2c45eab8dcdd80462ec74bc531fd32535bd98a1099b9109944cc24492a0167bb1c6913c4ecec004cab2886e0e3b0b714d3832f512332ca1dec9aaafed4a16bf0119b06195861995406a921b6376ec5697650625109b63676677cfaf719511664c02e5c1228953b52633ec92405df565bc10a35d4ce948a0bdc2a4d6182e8464624820ee74ed2ec9fdc8ca8f40849849fe5689b9768f235096826de4dd1c1a37d808c4e6b27cc2a27bc51432021525e5d8212995724bb70874d29434712ec54c9f53045a62e8246d9d56639b4420738c49c9135f4104d2948e6e21e39da71d0215cbb7e7bcc37d47c80c43a04c9e5a87e5330a819890325fd57d8a54a5198440aabcb66c24539e541f04fae55637d35541a04bbd9c349dca40a0f3add726a939438e9026cc00c441c28c3fa02546d2dc9bf2b8757a7e40f547b09c4f7d8ef1b3573bba38017bc0861627600ff00a70461f50b6c9629f757c061f906ef9be4c24bf71cb8c3da06f4dc754f9d5b5d2fac28c8d9da8646f45135924108742c150300804040e38770083130000001018120663b16040a2cbfb0614000551382a4c322a1e282018128904828128140c8342a12020180683c2c040181418c68c5094b51d00bf132b7ce05f34a0426f54571689a2b8c842eec6f1d3ac57be4bc2d2a47501787e8107ec18548b281b07f9c44f9688c9039bb4c48e219130cdac0863c1708b17b4fe6a21ced66262fc91ef470e25841ca2f45fabf440e6bc2c007bff6122ab6eb2dc3889471e3a88616b29f6301ed9daea51860fa26a312c0f017d7dc320848773b2aa6a08d54212b90bd1704dd45749f885a1087f8eb3f99c58c85102ade307af6d4595744c31a2eb150ab27697355faa0da198de9d225d3ea1d8419f9feb06e7d7102d3f95480c8359b199592712bdcc76203bb17f30323de7f21f5bda741190d8eb3d4aa0c41742d3308f20432c1ea03344d43df09dfabaccf4cbce169a44bd63409146b674e4b7ea24f0ee610f87fcd37f871badcb430d26c485d235b2a93b0df2b061c754f01979858b8002dae8a5eec8f045244f8d0eadf01ccd1875b4c3b60488f99ab2c596600a6dc7e541d5647b876f1032ff9bcf0c84b5f437719b32ecb5a192378f06f286d71d4c7d188c6e4ec676c5a95b57c83b89f4aca990d3f9ccd1854e87ea0d38ab1ee6ce0f24e90d114eaee30e8e5b8f1291768e36d846535cdaa3bebfdb195ba8899bf6d3819254a1c96d15562f791b3170deb43508b08b3ce02c46083678ccb4faaf5d04a12408cd5ea87d58a5933f8159985ce6f21509468c7393a93f9019fe98b2d18f2ad341ba0aef7c31f4452451e5637690ea8db4b9f7f6ead3c4a7b0a76283bcee7bbfe2f81f10ba6094107d1e51a137ef68d0b290ab475315cc7529e56b2116f9cea9ba27b849d11cddc58e010ba43b62cd61b60d42306796e9dc6f1a11c2dd9b5808b91730a6841acbc33149ad3f6e960f8a04d30527c4a012b767acf3345e1028b332f5ee4fb3f46be4d219d49e64358d90dd664c7f8fa00d14f1088752b92bf614a823f7945c8cb401d6d84ea7c16aa43610288d744e5789c9f12a4ece555f516f72e1c7d0aed5a781a666a2124f81e44979f612a4d08c75e1b85d32204a67d6fe6cdf69cb3d0bd8c4eac3679de40252e872f32bf28b856b127eab7416c792183277e58546218d318d552e21c4f303c80cd063e286ecb7cb434aca2dfaa46263d2843f9fdd4610fad54a463737fb54f115643d5cf3739813b31ae4755f9d454577e7123d3916606654a8ad8964def2fa794d1581648712f34c65de047418f274957fd2109fb8289341c70c6a2e485acc12c263e1aae50794167716e62adea1c6c5661453e15258a8f10d213c7019f19eeaa4f59f0f350e09b96dec166244d688ef31e0a09ef89c2185e64b3cb4dbc552a90b075659643daa163ae35a06191c91f39d7da644b109dfdb1d0af654cbb91b4e3974d9dcdfe2d07a2f7d4e131b9def85863121e7a5a2363ea68b0a2b367f93c57cbfe80a4fa82599b62a47884ed738c9ca95f4e1fe9a1f65bef5c4fc29b6b26f558ea267e71240401cb4a55702818ec509166bf20c94b5efd1198ed0b9910e99dd0b72c382a30df1e94e6511e762ebff2955fc28df24cfeda07d40c8c5d84f805316c6ae31211c8cf014ab847a4676f1f72069ec7d8a8e405791f9e2df500844171f8c52cc602dcacc09881aef463eed28f8de1a7f61c9c3806a746d9542f0e8327a4283625df066e74219f67134fa7763dd2442ca9286e0717a57dfbbc59f1afbcded24e4b21e04f1e2b0c5b085f1a3f69b17ba1e336c71f2abc7e3b14ed3990daccaa68685f2b13937887924a138352cc7bc6850afba9e2f7778ce5f3633604c4516c0e01d4bf18fd420e64c1db6abd31da3e90c3530bf9d8fcba2c0a410072b707c9cd34d3e1cc00b05dbc06f891d6f9b31e82cc9b312ebf077ae04198b8c305ad491cfaac362e14361af2b39700f62c86e07d16148ca4677a4327146a5f4159a8c320d72dddf20ed041cdbe84d9f1fb91bd69365099e158d8b3392fa1943f432291a48d5de24ceda13655194361bde0edba2b67478e0566dc830ec0a63a47759370a46e80866dcb653881f4e860a872125c5597886e9a26af66564cf0ce83a50e9db6fa1f90766287b094148844025e17d2eba46493b42ea74a914d28a128d6bca1a7a7e7b77f2a5a0383369f635c6d839085d25e1703b436cbaa28b04939c8b942b229822d72abd45b387a6ae7c69bae3f5765a137752a26fa628ae8637f224e7a847a0957c3e3001c43080a4657e3c042309bf61a3da26729059e767650a12e2d57ec654d3ad8300befb10022d02a26cd9c2271eed93e0052d3314a203c6da6a658135417bf075a2fa1401819c6d5e283292620f86f4b6fe3f76b70ba22bfcdef581a388deb03b41de376a96922410b5f854c996298eca8bc931221c862b901553e2035f43e45c5f290eef88eb4ec1a0343a4ec1ecff664e8a7d884337b08bc01028444982b024bf27269086d40789d1da2832a37b304ac44bfe3d69f2c1e59d8c4fc3ac9a2ff63dfb16c7bae48ea0cc652094433daa3aa87820beab380d54eb04c1871ae8ba3f8f6e446ad19153f4d159f7fd27b93f3b1043d4e96ba368a4f81aecc2ff479ff7171496a24d0678a5f6f6fa976d316ea764b4690d3e74e77dc5bd48b64494b5c6d6c486cf0b43487cdc82f536767a3e9a17846783ec87c21a7ba6149f5d8a2b880f53df77ad4c0595ee080a2bcfd16fb40026b80737786f07e39c58d7157659d1b30a49a81b0de7e98312e721155e33d942d229c367213418f572c2750c5977ad4b05ca18e7a426ddeb6ee1b61e5559d1df5136500ce84908add0152c9689e6c5a69e5030156cb85a4d3dbc580679353f1f65516a904acabd5abb5ab3a76615558ab5450d46c3409a2795f1cd19d1d8de24309b20945a2bfc11d6d19a02a3e9ec0fa02ca68cedc2a07c19053b0eab332c3f601bd27dc2d8a5483c9d0f00aa5d745c89deb4d453567b5ec21671e72fc1863c94104ca0b41a1716acbebc4aee3cb444e45ce7220856d374d0750cd54a2993c32071688554970bfe2d0503079f075b2198b6a0d54c7688221bf001824264a1cde301840feeb776f36bf03ce78983e0a827257a99e99c273f23ae40a1167ddb28aa88f0c9392c17f620c420949c30a25e81510122347019ca3dc58c07280e52006431029abcfc22847a8012fe0fa202161d4cf1dbb08d582f9c306272d4dca270db421ce3b7cdf864e0ecc17b85608c68a8f08d1b70c065337b9336ec906a3cc04e3fe3f00ddc4d6324c8fa023c77b1e1937c1a383293b777c43346407364c391a836ac686bed6c4d02097cd2659a96eaa9c8f12076a8a120822bc126f90e25273f7e57bdbd55f8b32e1976d6046b230a6f7f73374a94f4433e8a100392172c47cacb70391fec3cd41eed074b6eff3bdee91bf944899b092fc8088d19012cde8557880d6de7576aafd64e08aee653eeb08f86c3783ee8fb1788d055e478b7a96637128bc30993d33de75e21e7e5c82a282c3466e05cc323006330aa273214351a2ec5fe347192d85d82e4b928de29f6f33c7e7249bcf9380a278f534afa47d9f454ada942936a763521bd1482723a61afbdb9315ed44aad4d66a46330f736230389c1cfb1422435184512d90ad1c812c290230a910ab53143876dfb868ae1dde0584559b3e47c794d17220b959cccbaa9a861f2c140018e61af5436d750df5599b29bd166b218472f3eb58e8a06a9639006e6d5677501dd6ee3eb79e626f54e93561b6f933f49a901553d85ed74a8d54d92b5ca0dd0c6c29cd3fd8fddcc33a008704c89e9247c20085a4d2d0edc813458bece502e2e5297fab12e096e8dcca7c864ea4aeed1106030b09a62977043e09be11e2c5f6db07dd24af85401080a6ea14bf27c33703dfd956f056a789b46699c340f22350f18823abb77c191110d2b89ea3cd8c605a5646cb5aeb80667455d247f9c3cc308d230af49a0c3725494cad93cb667baf1070d7198e0a1b536c0b7997db7533bfef58b60cef9e26e114665607a33292405bd30b9212c13e2aa5e25385c6975d1c343fe36b79866d081dd8d75211ed88082985483ecb789029bd9a968024cf87a55c2231e8d54892cd743a5350d7c7d045652f6bf1092a17b60722f2d506ec2313f26c747a2ea047187a49bf3ca4128208ea60190edeb8352e579f231b655d3a89c3d1b5615f37fde25f1b963a3d1bbe08de149e47dcfb7112b443b537a02781078fb3cb73c637cb75e6dc24a9c7fbe16660c66f7534a680334e817f6605746b7845a40a5bcec79071cf00665f5f07ee34f26be2cd5d1e1a7b8403c0f0d14836a5fd5630f3cfae6a223dda5fa3b19dc112b6c80789e2b6ae053de377c0256f384a302fc20765be0bb920d585e01c810c508c0110c3ef3b0cc7c17df1a6e9b78f23552ab13dfc363bb62d21a88d345d2fdf85545da143a153e39bd260937c9551847d65960a1a888099aa9cc86d516ea0b7375745a89ff8af73d54e8762940d869ba35ad513c082a819a64a33932727465c5177fbb9b244d7716af1f65ce2d578837a359ff247f14cb3c6dd37847bf432d10e4a8134c1261ed0ae55932a731866d10fe24bc12aa1d46e6793c8de62202601db0c0e403cfc6e081bee3ff679504dd97efe0472d6fb4c02bb3ce587e420f77842986e802d37fb080aec0d147eb6739381cfd88eb640315c586e136ea6db8e5a80f1e89c461012b4043543631b5e22b898b6997f6bbb90efc9d8505b1eff2b1302d7924176f208c84b64caa0acaa6c3d470c56d06c05d314bc1be42d0f69f369308bc5dc2c08b98df491eeae98e35008078b689859c91a1c202b88482d55921c21005f6047026050268ef96e6218b8f4098260c36ca0bf20f0fe654eceaeb67b3c26cfc8e5139315165c14205f551fe93e18b962fca2cf2938f6e08d44ab6a4126cbe63668b5d4354bcdbcc66212b243083befc0811852b39f13a38fd50a09503760992f599f3448db3af2456e1b234d3c5909f3d0e15218cd099ff02ef31e3a2952e5ac3edb8a44601928cc1630bb63c85c5ce6cfd8d0f728b74b3021de0108076f50e8e34be5a14d88dba19a1e284e98a11ba31b3b5a32a8cd97832dba0b21a0acffab1ac077f32225c923e059ebb43a6c6b84b0edfea2cc2739414bfc6eb6e7253f8452a5fa9c968a854f1b99bf0c020a4c84db19931a977fdb96306bc445b255271a0524b9dde13b21e1e8a14cfa5a1a02c18cd6f0f5da50af55dbc760bddcde7edb63af96029b09b8800af35df9a2a257ec6970c187aad23180c5f4db0e6e4cd2ac5a81adecb9470f7869677bd8713557a477081ac7e93f1547412a3843f294ab1a93dd87b2eca2212e5326fcd1714982880274b5d6b41fdda7a060972b84a5b3a000d7e381239d370f263e96ed1aa2f26302f6f013e20b1bd522390ef4b3eb58294b1a99cc10121e840ee06047c3bd1e4b4d9eab9c3d7b10b37ce4d533f343262ab9417c10efc1882f914d7b22c92ac51336a3a637188984fc075430d1e12e0cde6a3556b68f838e550cfada08b31e05f94564c32b4cfa072308561a80e243b04640c13427b2ce47f7a32ecebc5118876eaa60180dd48d9057062318c2946a33cb10d03e963401e53ae4bd257e9010f0e66013e51653ff3559235dcdba28480f458a4ffb25c6a4f5f67b314c323bb2daf2833a8451f6e6315520264a621ec5572a43af9018236e1f559687b48b06c290905d97ec805663eeca972a92f3ccc3cad7eb8c3b2efc0634712974dee92bc8f1c33b98543d184335a82b8b1878634d36c4226d6a6224d77b94011c06638ea886aba22c426992d8fc9a242ae35d686ef661b45a2f7c9ac3ddb6123f18323feb48707fba2b1e48758b6b2d942a78aae6e6a0a6d7e805cd9d9fe6fdfca33d34638acd4973ce5fbb45d6f8799e03f2d29e13e8b213b7dbd579b9f9c16a58ca7ae738dc88b4f577ee68e789bed680a9f5cf70f62d927abd4acc63edbe707e32a7c6dabe4d3851d6b856e85a44fd5f604f1ae0a39be91ccfa859600fe0d4ae35a022cbb6492d443cc52a3c8f7a78d9c5786a61726e63b4718b0178b7ce8751560a8a4dd3f774afb41fba6c99a9c1283095013222da38470e30153ccb6a224e5ed0d9e82eb1f96171040822c1f07d107ffea99d8e437ddcdc8928ddf5e9608a136fc20f54bd6115519ca667d5b574a313e3e39d4e53a7bc35fbb87bc0e5b928f53dde8f4441dc39c5ac49d50ed22719094364231fffe3e621d2347c31a06d6b24488f9584a18468478c3cd473f0a0fe259203171a2e6da26f6871eb26180ba766263fb94e829a3557d41c3c67b501360102f84e2ce451ead8777b2ee77dc579c35bf6711907856f7b9ee748d2e913f26afa2264614867dd35fe08aa8b8158fe6dc06eaed1777fce2374c8de82a8131e8b6a9e8a05d5db9a186f4f6c134b2b42d2b1e43872b304474f17b121826e81b65d7a430343b1ea88159a34fe5c398e7bdddca485d625c9064006e456e9be8a3ce1ccf8fab8823f9ba3748603e88a1a24c76d685805d13e159071edb153d1672b57372ce155cf121ff9a1a4b9d268c9a7dc18506579478b51a4d3023baa0de08a5c9260e91cd44bb42b26d2952ba894886c0b615d96d9fd52ef8dd90ff1556c44812c6a38532a8b15d061f9a9fd0d44389b56b87945587b358f9d489fd41b4e5c1cc10ada30a07c1c48d7df8ca996817a828dc8a42878812f3a74c7bf76a5d68eeb620d3621dbbd2292bbdd449e3659fee953369dc377813c9e5796216d9b43bc421679665e233c5e2f4579fd46a01464af75e4e811c713af649e14c5a4910bafc15b6200502c5018ad1e1b61ded3dcd70968487695d557c1c27b7cd9302d0e2d4261424ee7853f1bd0d2583a8995da5669d6a3682592fe1e9771d5a2eab5ce3eff15e0b537d5604e6e4572cf140e1dc7ef9a6d7d8c7f4c7a3b07d9dd60af0242c10f274aa424d93b2d34681a5457252bf02addfd1f117604ef97c6c0b449ca11e5fd46b7d9d4afc85193f3d389c05056038f4fff8e827d4ac63e4b360764a05291b0ca74d20975aefa00174b595becf4577df19d25e32232c2bf8ca350254b278688738572389a5d641b45d2a59baa04fcbc5c32bf9407e325a921c25a0c74405d389ad0c6a9b5cf36d87708f2239dbae8e35aa05d17274e8fa99825d2c1b9e7ea8070a1e6582ac37c4d689c479b65c21ae50383748d48205720e519b2af27640a8f417d5f1df5e267ce1554e86d0420319b79a9d100f59a7843608efa1584a6fb1c51677002aaf8a3da483449347a37267d0f4328d96107e91a49255f20c4e2d6e147fd2f6a343893f104271726fb6635451db75c0861372a71200726167cc371f32a0a8420b70c0da302709cc7c723ca5efbb9ea5e7d723a26f3b28a6200b18586e05087260099f7f3a529b4e80a9e850b727bf714c87ae292a1773198ed845356e9addcc60fbd5624d92d8a68a89fdd566f2ef6a1c91bb09530aa1cb801c9f5675eb65a21f74aba28ddc5af102c06e09ddf142de4750c6096bf0560441f02528baf252ee295c9f4d6aa9e8bce47e12992084758ccac16a537d8b2881498be5832bc4c1d037f2f86fd88b55d98cdc4552af6797d9832c33f6efe7018e9cb8c5731ef2c77e64441e2ac5fb584f232eca72cb28aa331bbaa44cbe4830d1353793fea4204af59fc5d8485c4ecdfc20e8d8fd4b358fce49d720b05ce21185738e18c6c6aebc90f715e12db03ae7c5b986e744c7babb4315eb4c64f96534163911a6521c8e8deced5265f4644d34ec603290620dc83f2360265a5d1c4afc6005137e3f08cf8582ce23e5eea41198db0a78c50f7f8d1bf771d0ea82d4f3af21ea283aa7377402f53ea6bf4f50e7669e95dcdb2c6b19bf65569e81850b3a644934cc559999d91a67d74d341db538b9642a89608675b1ef870d1ee2ef20869151e2cd0bebe69c0986b14ddcfbac627aed2c5e83d7754d319858111bc1737a220a664238ae5795651126ab4e7cec161498085621ddbcf0e003d85753086aaf6224bb0a919f4b1133535dd9cc6bbc4d5d6625609aecdae16bec6a4f3a5b80ee586e662a4868f02b540eda76c8ad33c7cbac6899840eec90af4a434636f589d8a20dd064a19f1ba3e7e3c79ccfd5bf790e524037346ca4d5572de28f25a57cdb0a6617d86f63e2d13b9b01210fd9747e299031c996f27e2a20dd1f89aabd7cb5b70c272d5f462e8fbe6a39e316d61cda489222be27b3879ecf5bf9255711aa32bbd6cc9eb1cc34d8612e7a725d26c9236f96eef7dde65dd9655129864f2d265558f97400a5ffc928a8811e8406c8f4df887f114d2bf9c7a5b057b497598730c02532a280ae4c834374ae1cc4d48ef94b47aba6d001c8741e889d853e749f532044f0bc1260ac6bcc5c94449937a4ae7888fc1f8470de0e613b76252b4bb14d25830ba886549ae2d53ef8c37e3013a743e5110a05c4dcf8384152980f0a935ae97823741623785d26b98812e9907dc64b255a5cd7875a3224c86c615c1d65415cff7f07e39435c6b123a4d4ec8e3a65337a3346c94a98eabcd9d70eca17d3b1002bef8c41aa09f106f2112c93720151236d659371ff81c9ebaefa9f897f91e6a4475cfe8cabf9989669436349416d101726e1f325c5cbbb1714a958fd17ded779dc9f7f598124f68410cf78616f1b8b2684f9d62ed56f2b3cf27537ac39d0b52a1c90913049fcd5f24229a1c593c2596bb53dd11264e012bcc870a09076c77e312f3cb433aa06f6335c96631a285e39148cb2c2397397d27ac82416d42d890de67282d1d93be396cae4dc06499f1b52e1bfc8f9c1672c2ab021383948ffb5ccec8d4c23892d31a3b33bee82c8662fd5143bacff6470a06af5d2be82595a9e40e25265222de882d6ad2be48ceb45a99dc14e8c7abcbf5fabda99e92190e835ad4aba814d6f70641da91581a8b529787a1a0886f873a3d86c83f104bdf40939ab4069d520019c89e7927d4c35f36789d94adf4f79f95cb0025d4da63c9dcf9c6b06e356ea8783d06d38f70ff716307c9bac5c3e89ca99ae51362f6fda157c9acb246aedd4a41b255598b67cff52b9e43f5906007a2bb998edf658bb1e0312f4d6cc3aa8ca2f415c2b00b85ab017d01bb7c072d27d097463b91babe9cfd71d74a253d53cb37247a0649f52afe1e2f2f3392df6b010cd5f0a19f06dc9c3d4d2f072d42347aa4755a388059632c7da581d224154d62e1599228944842a650c0204c0f3d1457e0f74a0f9a37260500f06b0fbc56ff83f22c1071418b8dc0fd009fd209dba797c535ce40ceae620b84bedf779e4dbc381438aa1aeec2419d04d7971a2cd7fefa1aa531b6998c702f7d6de5d857950136bba86b1a9ca7e1261d1d90be241d62c4fb72d53a35422c1072615f64a4952024793935892a4122e565bc47f12388724634025c80a3240c6487bc1eb99c59634ce4ea2554e7bc5432a39953e09499de1eabf4c1e265b5330d90f76147983d35626f6ee9fce8d98ca58801fdd35ade330cca3f462ec92a457a04190a1069f9132b15792502c87f48543c99a1834a4a280c8c139dc6be06678111636c3e7c2d3883918e8706c83ce8411b21e8fba9d590e5020f546c583050f894260753cfe2921cff436cc4032bc203e01ff804a71331cc3f624def14905e9f942d969059edba10b3f6fc5c7f8bc28e00d03edcd5648e7caac2ad3282f27733339f2ac4a7062c911f795657477b19c3a5020ace391d97294149931fa91118d6a5aa01f58ebfe663cd1aabe0ab328c3e916f6a43650ee16e49ec9c585fbf831791cc6ac89547887a5e16a149041178d0075c9151c182fb25a3a6c5d2cc2048b3eeb001fec8ca81b3c2e893b62bc8ab8229845ad663bb19b597a09bafdde458a458527d4395399c52e42d53933e06ae09bc3018bdfe1a2e16dfd4ade202d81c508f41c1c94e418af28c00b0773c321c4788e4fbb632821d6514b1240ae54543e6777170be8454b8a073508c61795c9bc37b0e11ab105750c789fd276add44a265453b17187abceea71f4dd0805352145d4370ecdc3643f6bdd67036d79c60241efb411668f07565fc83cac017900017b8f6cd75b0c94b9a84d87bc0ac91892a90a7f98d51b121e7789b53fcc500814853dc66fcf640ed170a8420ced426942ce3a84b1008f69eda7d02d911cd0ff5c58e3fa62f7cb7389f035410ff827307b0732edcbafa54f759fcd91e0fcfb36547a980fe8d92c8fc08f07340ead0835c9b35597e7393b0d00db8d81e4457fa89957959202a0a3c2536d052c0d8d312893e5d9e66053cc5b3f48e4241a8632e27e2dd34b222a0f3a3cb0a7a6ae12edd41ceb387ac48635749be6c447f122a733a04161f50d108e448c712bbbfaf71f4e00bab611a63a980791050df3a2edf49084c30e25bd8eb8c5451323a505e758111250431906aace607c729bf265d6f882136ee90ea4e0d458a5736f878b7e19fc4daf4930e961845a33df455ce2e65495c85e7ed76d1575eb44821f0276d33dfcd643b0d3d9fdbc0be9e1f775b4fee18d3b0b31d4db631b8b4c6f08a85c95768144c5647c16f4b378c691aad75cb96a104403187e46d234b728e2b7a4bf95ca316add8352fe3968aa84046afd56eb9bb1d1b72d0cc0159cf5f888f1a5d1ff4d230a1cfca75021072200f4c7fc74fc8d6b0a088bc3fe715d9b3485c45ae9dc3643ddf523c54ddf3552c2537ff517c876f0efef522dd31835568d6addb73109028fd7b5d152a6fc5ff5c7cb2170805042dbbd77b42bb974e1726d6bef93bdd550d9c18a8cd80bb1aa72c89c368f2ef760bfc90ec0e11003f7329e68aaa682240b03c040624cd73d27221f1d99c6efd9e87d53bf6ffc62c65c38d534c391187c02a0b8334117550028ac47914071264641b8c3ef9ac5a2791e707f25995894afca5eb74d234ed5d74f5e08631b8227555635dbb7882e81f35fd922ae03d67740fe6a158000ccff26ffefeb7bed59f70c9303ac83858e9f825bf3433524b56b0216210e98a0ae46c461abb425b143f18c9524fc35ec28e119a3c026344c61f32b1446c11938e470ca712838aea76ba22e00b8a7d667d37f99d6cd4178205c938027185ed6bb0cb082d83dcabff6f8406ca7b63715138d10bd3658be5e8a2ec942c104fadf54b6a53a82e235256c2825ec5cdb464faae711211103cce080f798c56ecc886530eb9bcaf16c79fe79ebd41d8045f48e949e559802bab50c5642515e27612d08ee510c813f2d9341777aa19ebdbfd8b2c1bbeb07df12d534c4b29155886b41199d853fea3bc2e3c21069656281455cef078dced38e5d6186de53414ec7442017639bc4fb5a70b7fc796aa832889d00039563e3b3421f0b1552bbbb5b082fda583085d6853101c0307fd99d72cb169bcca80675d0eca471088be4be96dfd68ec232349900b026f6cc56ea5dd44732d60663af5e4e7d06954373e1106b1f0d525530db48a94c1c3ded881af44e37f69c05cfd3f95e1cb3db4b7495997fb30c6cfed22500971cdf28962bdc166a72d5e58671f6882577c249c0d85caa563a2f5c43cb599a0ca94e97c4c04db98809854de884d90ccb60da7a36a97254b06de5126bb40d1ed0b64c4b8a6ecae71fbd041bbbe068370db1cb4d6bdc90f668ebd0adce99071be56394ad91cd46f21bd984d14e2a182dc88cd4397aea5474bbf91197ee75c22a8936eaab9a686aa3880c6604612eaec1e9bbb42ee5c9952af57bb0f0accdab0e4813ca4a9391fe9605ac0664c7c4b2505b17194935184cd5427458343e46389761db10b26441e94990756414a632a1c01b194ba48f8989081b3418ce8431fecf1e5f029f40ddcecd961be07a15c1b7aa2dc067accb8b95adcfd12b962e80ac27a58bc87abc9305e9f5044ce1a02811222bf117fc6d486e4d15706001fbfb9ecae58d9a2a55a9ea4486bc17e1a8adfb5e712a46a373e136e945079721b4d0970b88acd4f6113cf9621d7161abb2bd6bb71753c516b9e28943b68c67e34b9896d3927597c54b73989f34bb3ec17bafde4e7ab57bf04980f9f8d74482b6ac90bee5205d3b78d32e46102312f479307f6c363dd3ce5fea7fa1c5ace9e53fe7da51923ae80004dea177405cc8f3c4134a045526d006a1260694f152a57ebf316d6e33b0aecc7cf7372090f3493415dfa97163faf77b3798292e7863d0cfc03ba45e4ff0710d159914897503484a6cbb268dcf6c87326642732057d9bf6974e9af39828fc6bfb17dfc67253339091ed698e1461250cb5a4b1d1bdb42c944bece523e4ba510f4f91ed75b1052efb268252da596702498ef3dffb24024df1cdab9e92ff0fc5e0384ca0c2cf06487cf38e82624ebe86e12630822042b42e094be3f039bcb93282e33bd04580dd40c617c51f4691ddfd6f62db6d3d8bb0b4d14fd95d42aff1456840f1650e020c05f66b29c9112822c1b8fcac3ac40128b9aed7f2a86b7529e1ce2008a1bf1ab95879f0826a03d51b98b54584da6d57a1e0d9da851afaaaf7159e9e02c592650627415ce5b2ef2aac16e1a5cef310a6fe2542763503293814f565277a18f05958c12cec3b88f2b44241cc755a38c5d1ad91b457456103f43a420fdfd6164ecd73cae71778a9d7a8a19932e8d7c9196fe00ae6b1350fa9be681ba341ea5172f0699d98f437b2106c01c009c1bc02068393ca3d5736107be2c142c4316bf3fa84d16f1e1600b8699bc478476ccc448f11196a54fc49e56ec2bfa36afe54e078a405816f50e5217bf02ba9080ab8a80115c1a687b3520f0abefc3d825aa172bc3563c9c40234c9722331cec016598d88a80343a218b9c6bac75cd8419d1699a90adf0781ef206fb5d9e7c6c112d656cc17f08dd11ae3bfbeb061970033a6092c425f65d2350b1607b5082a7e819c36302ea403b892613e32726d152bc4cbadd586cfb55565fd3914d74b32265c2fc05989fd21d9d95cb7699d0363157e5cf2e0e45387c841c116a9e50e1d44ce7d9c6c670bf5b4ee586c9c4a5a3205ba7800f7250d16c49ad37574655673c367765c24e6ad1202a177bb2413358c45b13ef035b2318ba5d126e31743add5be42d8c7eaf8abaaef968f5cae9fc1124265b0ca402c98689b95bccce3e8f1a4890072463f6569bb3083dccbdba5ab80610b98aaef0c6221cbde85d308e2a77ddbbc3b8e3545949972bbbb3fe117d2ca3f46f5349ecfde94296d47439748063a46b9a71c35480f5ea0dcc2344111fcb148c054fea050f55f5722766f00be53a2953a8cc742ddf73ac1811a194c5cde5fe0f76f1f7addccfb2e4ace2349691b563cbe61e8d4163aa4d41a66be6ff4aaab77a5c4f5bcd73391cbe219c85d8b0f23c3e363d8c3473f3cc7abc2e157992e37fa45a0be9061606b25d7322b32cb0670be8d50bdc84e19e5b502f36783b86d4938591f4480137bd50ddc662ea6e6ce310b4009d654e2f16ce996a2ccde414eac12d523aecc3f3394381c6c9059a49f2ec179bd87f3a7f1e8423b64f24436a1417352af167f9b97de9c2cc8a5d48c7cde029017522634a3b5619f8e6d68ce14e54bd1e312a939d9db554ee2dbb20c35ac199b252d595fc881e1eb7ee2ca44558d01f6f2a752e45ff28d848f86ab38b08f482722bcffa39c57b170ad4a7ebf01137a50b05f64db380cd98cecfcf6450995e16e60e15495f2f8b2b771639a56622636729422500ac2910a60eefafb983d8f175d9bc9267c1293b432f2697e0443b49cfc8e5e0a24d89f4901b05a28ae4aa3c9c617bad9f460f78833371de5d482ee999c7617b65d2a9ea73ecf8d25aa9f565fbeb587e6f1f26f760568a3ce78e782b13f648323d1077dd39725e2f1cd60e35a20329a8fced22b872d6ccf818856b8520faa7421d748b5428384a7655a162eca1923bf387959b72264fbf8b6a256499e1ec8604c421022ad3d79c3760b024850330333333333333333333d3a4fc35fec7f3c71692d99ff1c5c1bb9f1cac88888848005ee476c19ae3d6da667fefd199e98112e8097209d609f97b9c1059b750c879649a369be617096ba16c223b3331a48ab01b17592807f9f1ff9c3daad38385e2b986492dbbe321e6e20ae59ffdb752fd9025706185c2b677e656c718fe6918b8a8425962c8c4b0dfe38896d924704185c284c8b66fa866ea7d0ac512eb48f6ff1d810b2914369826f33cfd70edb888c2a15e2231b2a89845d8e84182bc052ea0500831c718cec71bb1992794d3c4493ffa8f20a31f2794cde336e6668f4398840a5c34a16cb7eaa13121b4e70c130ac16a4e3ef3d825147f38fda7e2292970a18462fc983b8af43853626d4ce02209e5f17046436efd78509ef3810b2414dc3663e6d16a8fa37b8442cc1fa8e67cf1a1996984c265083144d63b587a7894072e8a5068eb4e8fc910d23c7dc13fc4b07a03174428797d4c9387bda1f7f5108aa9ff238f780e9e374608e55ce2bb9a210942bd9ac2c749824028fd48353dc71cd9553f55e0e207c59d601f5c3a1f94f378902788a598acc47a50d6ce318f07d1a61fc7e28207a595fbe19ae7ab559d90055ceca09cd1a31e77f03c9c091d1d147a90799be19307f9ba15709183a2480a9f687bd71ea41a82325e023fe00207c58fee9b99affc36b45cdca01cd579360797d4639f0b1b947cf429936f7c6a510ed59d3ba7881b99495a1427f578d33f0795f56166511ee7ac13e298b2287a876f1ee6ce743a9158948761beeee3e2f7d30b8b72acff389d91123cff8a426c09f971e5e6379eae28cef6c8c3e9795a517609afe17b7b56943d2a3afd9e4d1e8fee042480061cab288ff3a0f762d2ac8af228333ff32277482ea7a2e479983ba5c6fd248da2a21c5a5f9696b9c3f6e714059ffa93ef2cee6deb83418607b00c0e5314b38f27e4f60e79248f2e453144f7181e99a3de4d3230022fc4e02045f1a22c4553d7511423b8cd78321f5f6c89a250a5e22d21af9915798e5014624efee7f7c380a2b89bcdc7b1a24defee4f145222d6aad6639051c60afeb117f8c7181920f344297c3d8dbdc7ec2de117807148274af3a31e4d0c4947dc5d4e94ccfbe6533bce8fca2e38364196f8e1a649f37898268a1dc66bc255e4817e241345f5926893927a235c148cf1646c6d8003135b5ee730651bb3f1825ca2b09e3d44f230f7d00796018606382c71558ee6c83e38ff185289a38afb8460be617eb145899249b80f5299e6610ed2171c93503f7b7d3e4412a6ca5035fbb1e6712a12659d9b0d1a33366f642051dee81026fbb8acf4258f286d74b055edb8234a35417fe0c39ca46a44d1d3ea3a24598d99794614a427f3a70d9f63cc0317511ea48ef4c39c7ea9794594836fd5d746fb688e3011c53ca731d487b9b8f688287df8ae9afa4cb35189e18231f21025f5a83e082eebbe799c21ca2943d9894c94ff750a51da1497ccbfd1c7f113421482865d4f25d1071d268328854df9f8b3cad90f544114cfd47e6a3e6dfa78980747208ab6333e360f32197344c6185ebc1860a0400c301010e5f03a216378f55a862f021c7f28efa7b6e65af9780ae3aa031c7e20c49d92ec9a30be0c30480638fa50e8db90c7193f0ed5a9f3c5961763946175c618838c0d746115e0e0432942b727fd309f0f7e680938f650f4f1b60f4a35460fe571a7b30f1bb32de2e71c79284cce79cf4f3efdac5facc07c41020e3c94c7b3ae7ce7c16fea71fb7538f5341f45c61868060332ca10e3b339ec50befeee718f3cf4307ab60e2509ff6175c8413a14dc5f5b6c727e0e8599f5dc0ef9c8a110dc471fff1b8943f1f4b7433a4bcdf6180ec57cc90371cfbb3dceb13794726c7a987f1827d2578280c30da5bc32311fdb7b68ce1c6dd001071bc6e058c31bb28cc7e73cd4bb484002f0041c6a284c9cdcd5b641e3fbd83414a737dad5eb624f2468a8046881e30cc5489949b284768d6639cc504c6b59a5517f242e1a407094a164ae21c17b985d6c2abe317090e1e6c03186d20f7b2492076319a173a88ec02186b27964efdcd66e0a93081981230c25df1ffff0c7be1f635415c00186729cd4f77bebec85f985722e79f12c3954c73cbc50d6f918d343a93d09234717f88c2145d632eb743317f0f15862ccf5d837fb5bd87f70aff629fac36fc5a1053f5e6768989b68f6025c24061c59286448e4cf1a63cca23ebcc08185c25f477ee6f1d0667a9c2b147b4473f69047ad11bd158a29f94cad63ecf430c3518572e9d89e4a4c3dfafe411ec041856244df6ce57b841d99630aa510eb9c90afe734c65e141a38a450cc231f4bb6f677981847a160ab397f1e7e64dc1539a050dc7011f9f1af6acea316e07842b1c7e32cbab63eaebeff8b2d171832380c0e27f4dbc3cf31fc6854345f6c750106191ec01a0447134aab3d21670f79c9b1f3c5d609fe578014e06042799cc7213d018e2594369596d6cce4f9f063061c4a28bd6de67a3e1fe498ef2494359c5ff6f5283768040985cd2abb497ba82971e517701ca1f82d31d446eb0f72d857c0618452498aa54e1e0ffe2b2383a308a7fbb08d51fbe1e6a9f2c87cc0418462f7f05d423c1d0e1c432878b99c26f90e29e2af814308e5181ff2209ee73cb22fa681230845338d0b5f770fc97e78b10243b502076c19388050981fa6f9d57747bafd83a24790fd095f3ecee91503870f8a65d3f5a692dfac553070f4a03c8e19dc43909007ddff173878508af03dfa9ed8f61fbf1d1452f82867635af440332f70e8a058e163cf329a7f5c367671a3036494dc02470edc90ef92101c14bc33663cf38caaf53580e306258f1a77bd9573d8801c638aa96855b5c5b5288e448e61be9973230de3cba08021830c07a00005268c0ea00005268c15dc71610b5a946e4e326af62cce3b1890e1010d70200151d86216a6f8814c676ff98c3c64b175e6e74164fefda9637194fdca281f2cd62889fd5a3591597d05ef213db87ea8b4cd7145751dd7756cc5fb9ac9d642569c2ab7ca377e32c92a9a1eabcc4788917c7755989356ed84e0b965572a16f5817f1ec79db1b7404579cf2e5f638fe257b45394bbbea657fc8729caa7a725179b91b2342cc04011618b5294c7dfe29ee2d6dbc3e416a428b9ec5804d32415b61845d143b2c7c310bede3d8e284ab5d9473a8f8744f7435190901fd5b4e5fb5b83a278ee52e2e1a4b787b14f1473acf94f8dd13cfec413e5d3a8621692879a72758213e5a89fba4dcdf5571bdff080045c6038a0c65b6ca2f03b5375136caf373d014d145e72cee9d6126b22df2213e58ee8b4e3d1c7c3ee0d2690ec762f8f2a8b6b89fd9b935ab2cb59d8e212c5fcd16adc2c19eec7b225ca031fdeb4dda69ae4d5169528078bd98b788d927f3c28511e450f3ce7911ece666912857ce7439f3da9d5494aa2ecc3b0d58d9a2ddcff489437a334567f9c87f2319028472d49b3ef69133f7f44e964637ed8ef1f744737d8c21145f3ca34dd3ed271d1168d28e47a8bff90f17d38932f76065b30a23cec931f6f8b8f5a43e88b2d95c1168b287424ad59d79069ef1480e10284c1168a287a4594cee0c94d66ff62cb052fc6d72d618b4494f52c2f7efc216553c348d8021125498710e278a59616010edc4842870fb0a307c5ec5415d97c1e94c739ab757dfb1d94277ae8d1c38f483ef04dd0a183b2488f2b73a7a76dec735012c9831883e54bc8360e0a917f9c273ebafa3bfd06251f8fcb07d91c6b4f870d8a37933f9ea892a9e95a14335b9b240fb273135a9436a6fe61906ccf62f1ec3a791c66b33566862c8a5f1bfbfd2e8e85ffe1ad6a73c3a2f0eea3da10935794cb367f725c9bcdce15e5b1a60d9b36534545d78ae2fed02244ee8f1f7568062bca32d1b679142b513f7a1525550d9356caf56726aa28abffa8a4c7d77ddaa2f161462a8a99296db34abccc83b313335051ae2bb70d9b7f4682628c01460cc008038c3252a0012c2faa3431e314e541ce7aa7fd2195cd3045412a4635861ca9f3950c98518ae2b7bfc71fbda74bc94951d0bcf1fbf0c38ca2d859125266e461988c45519a899143dc764351d2a9ca7a1fe6cdc14340310314250f27f3279dafd1ff4421756ce69c7225ca043d510eb76d1a35f4204a4c27ca3945749b94974c9671a218ddcd32fd7042b9641345d7f2d05891aa1593046668a2106f839caf87a6fcc844a93b4e8cdeafd44d3e3051f4b18a4db8fa182ce29728894cee490f6be366db12056f4ba91f5e5b89a2ead6a6ca87126c067f391f86a44ea22c32eebd9e1122a1934479c3caa47d3cf6081f9128fbd0ef7725d66f8434031225e9b164d75ffb88b2878c214bc8b9012bcc7044793c7a53f1e1cf8f83dc88828f07b14dde32aabb07238adb521e39258989c71651ec0ae9e15ac468fe49114589f3d96592d93ef2484431859a85aec827ed9188285e990fba66ee4394f34e4869eeb4d1e29a618872ebd7a6ef75ff6c6221ca21aca5aa84eb284081e922025f94014608f4308310e597709267c335242bb90f330651dcd36c791fadc743356f74717898218882fbf8bbc769e5934ef84617371e70981188629cfa5964e9f138456a0c330051f24f5a19135ab37dff8792dc6786b81e31e6cdfd504899589bd2e329cf121866f4a178e3218eb4a6f850093833f6404fcc49f1a3b6b30633f45039230fa59acfe9f121a7fc0f5d7161061e8a3e76f6ea579dcd6f17c1438cef800c66dca1e863cdb1c7a19ee60ac35fc03bc30e25f7acf98ce1d2804a61461d0a521a3b34865c93e84361061dcadda29221a7abdedb23cc984371379eeaf6d024c6f0cba158da9d7672ccc7a1ecf5a3dc30ffc3b8548d0833e050b2ac0fafd8387bfdbea110b2247e45467caae486e2e90fc347513dcec3f0b5a120415cf64713336e940d85faf5a1a7d4d49f933584196b2887ad9d4e1d0931c20c35940777d515a977db9b4f4331cb790c3a97f5f1d5f3c10c349435fdaaf9e8cd8a4833ce500cabecde18ab638538c30cc5d7682b9e26868ae053614619ca41ceb3cd5ce7cb1c321462a867d46898eff38ca108eb398f7c688ba124e3134cdc4cfbfd9f1106f387e957106680a1fcb2121123dec479c8174a1a4e3c44b488149ff242a10712274a8cb21ff4ef4279981e4136d7c7175b5198c18582477d4a06d3771f695b289f46d4d0bdf89fb8b450f4d8c99eb2aff3c09385d20f93d9ee874e175363a1bc1d7c50f231f239e615ca596fdfd47ef2e0376285728a18462a7eac4241446bb36a94b9f0615428f79e0f7ce0f92994c7c953e671cc210f4e735228e654a31d2193780ff3289427c57db6c9a94dafa050d4ccafefa17ed4d9a227945379d470fba1dd5ec609e561fefbe874e2a50fd526143572f4d9d83cb4ac9a0945f32c39a8cff4d8cd5c42592b46fa2506c990252514354f48fb799c4a4229467cc473f8a8875924947be4336fbdf52b1b1fa13ca7ab753db88c50e8fc91e67b338b50fc4df12173eb19e3498492c5cb76ce394796c8630825f3fb8ff7653ab6ba100a123ef50f2faf2014dd447e18abc7d3d1372094631e0fcaf345f883e2d8c693eff771775a3e287bf438127d30f6a0e4a7bab921980fc53d1e1452e63cf2b51fa4b49beca0e823e918b26eeaa038397a3ab748611d520e8a3d1326e70f45d2e2193828c6bc6b126288203f96ccb84149e46c4e67b3f2fd9a6183e2783eddcd19df7d1ca945b1479b6dbb79b4216f428b62322bffb1840dd911cfa21c240f75fa352f8bb2f6266f71f9185ce258147f3ce922cf5c888f3eb0288fdd0731445a8f278f5f51dacbe0aec17e9c366d5c511e0fd2cf8fc378f8c9435b516a894c3bf1c3d5ae8e15e58179fa0f374ecd8cb58ae2feace9eb0f3486b254516a57b989c92d22379d8ac27e46eae9a1b7aa86a8288874f484105b62f5d05314f6da4aa43ec6cfc64c517ccf1ee8d6c72acf5e290a2e11c1bb273e7c0e290aa1cf4635ebc7e4617014e50e3152e7d4985e3f89a21439b934fe4027e4a8a1284fe6f0b07befa41182a2387e9a6552e7fe86f313a59c3c8816597e9c73579e286adec4086e163d8e52278a96fddee3716e9c28f72824e8ad9f6708691385ace970d32ddb63c93451bc4909e5c3d0a61e57268a1e3967d28fd89dc7033151b4ec418cdf3f3e9da92e51f2e82ae9e395d7a6d712e5718fe4350f37ad7d90ab4439a684bc5182e60b1f4a89b2f7586243569b44c963226e8b9dc4648824ca5183d64d1e873c0879248a33194b4646f2b787902876fe8c1f459e28d54d8d2cad29e5a3724439eb5f567484bcf2418d287e846bc8d83dc9aa32a2d4e291f3a6747da3b888a29aa78eb9611ede2f4594be227f50f2a6fee526a23c1efaf86634879b9c2b44943b27f18166cf28e9a34394fc72c5ef636d8842ee6e550f27bbdbe985287a8fa35d5c631e27b309510e7f359993ac837b3c8872fa482b7af4394194fa2e92b8a7971b1f812072651ebb8a28208ad5c3d41731d8870cdb1fcadaf583acde7da963faa198692321fea3f041697d2848f4c804bdcededcf0a15c7d3ee17e3eb04eee1eca21b846acd21c11fee9a1b812c36bd09acf372f0fc558fdc31afb943f0c121e8ab9eb87b7fbf2b596b943b15673bcf9a16987827fae8831d5e43c12b70e058f8f938f3ebecf83181d8a1a53c7cc28a3fd933387425acb0f9a7adfb75c3994c771d3557ddca9ce3ce250b81f7a3699af8d15151cca29e483c6dadc1b8af9b987da396f37146cc3644e17ab0de58198c8cd6be8fc38c58692458df6a6ddd8b68642696f8ed6ea495b570dc5583f5a9b8759959e4c4321c7885dff7898b70b0d050dbd6eae713d4321c87f8cbf3985448b98a1e01231779ccea9117c94a16c2e6ba21f6232943b77748a3cdecb3cd1188ae147799faec72d9ea1180a9d93ef87d63eb2a10b43d1f27348a6bb67fea3c050ea5afb951ce222e62a0a5c7ce1e08310de231e25a6e2c085178a92f3c7fb5e1be9cf74a13c76223d303fd9dc3917ca9dfbc30174de18d349943a4c8a1843fc3877659228ceafd8990f3e78fe48248aa3f9d1cead7375ad9028dafa6ff8ff78983eb14714f2707b830fc2bec9fa8e286e8e9b66fdd5199534a2b89f9256a613238ae1638ac9b259d9eb2ea254f7691a561fe3ccad8872d2a88d3c1ab1210f4c4431427a249d37f7283e878842a4d8c6ea90c9f9f44314bac7390fbfc7532a374394a657829f5988e5e614a2ec753ef8810f26691e588428bc4777da2415b9e90da22c2d3977989305514837b137bb8f87a1340c44715ac2448f1ecba81310c53c941ee751c8fc8792c7d94e2913c9e30ff4435142cccaa70e91d3967d2864b8ac91ece39c3e677c28a6773ee9e17e32b76b0f45711f479c7bd939c9eba1f431ecaf8ea576a09187425e849c2652321e2cd0c043d9ad375247ecd1a875ee5074f1f7e894db0e859d1875b24777eb9a7b038d3a147ad2f47cc4bd7b7428e7de2dd73cfafb413b8772ed46d22499eb2acaa1acba3dcc2b3987758ae350f098f8ffa1bc8369e050f8f3d0f563ffa350df504cf1710e9d773adaa91b0a3945f7707a105dc7d386d2a4dd5ef3cf41c407b2a11063a22671dde27b5b4361c3c58fbd5f3bdc576a280fab3b3ae4bf64cd4943793cbc8ef3830d1a8a9f367ffce1c707ded10e689ca11c3fd4fb8d7eee2b9986194a3d9a18b6f912717b54116894a1302f1e5f152122d02043515663cbd406cb9c3b632879dbf760b2974ca75e0c4b4a484811ae0943a13dffdd7ee79187c9f832c0c0a5018662e9c5f468ddea737d90d880c617928617ca436dcd9290479bec431e6254d1e842c9835c97f968afcd2b1a5c28daf6459e77d1d71cd2d8427998cebb667c3065e5176868a1e0e93de3ece58f2a2fbcb8eb028d2c146f7f94692c22637cc3c08441b240030b059becb04c367eb16552a0718592669d3cbd9bbd085259146858a11c6afd563d779671c91e6854a12caba13e1b43ec1fc67aa04185728cfd907ae75f42fc9842b9873dc8b1246584b4ae144a6112a3dc49b2ee40230a6591d03168ecfc36238142514c647fe0f90793925137d0784269e543d77bf8e1d4ee6da0e184728e14f5495452e37d1a4d2876ee0fd266964d937a020d2614ef3cc28f72248630fe175b2be041d0584251e3241f4e6abf8e6a95f112b00a040d2514aca6f5278ec4cfb2125d0646e005001641230985e80f93b3264cf31243037c081a4828ef57dc47c89c793e038036d0384261f33a471f6f900e9e32808611cafe3f784953bd130fd32842218794a1eaf3b87ed049229487933122c758dd0fab8b1ba4811b5ddca00cdce8e20661e0461737e80237bab84173a03184f2f873480e9d0ba110225d42f87c6dfbcc96a01184d28ffcc7b3ed75cba68c14348050d2938cf3795cd2f841f9aa3ae6fcd9c3078509e14c3d5649e4a85e2c2868f4a0683fb2dded518fed47152768f0a038f135e20f82acbeb9ab679ba0b18362aaff61bab6b779fa75508820c1f7d46b6c423607c50db1b379ab31c4af3828ed7c79ba916c2a9ebb41f1c397840f4b974d592368d8a070baf9d1f92ebf2a8241192908a388a1811b5ddc78880186056e7471e3461737aa111db528a6eda079b412c143c8f00a9216e5f3e0e3c187ad1ecf45b328469cac8c5f9d2674c8a2a855f583911c34e66998d0118bc269ff20c8a6ce9d32755be8804531d54bfb44c983e8dcbea2e003c94b0d6937f1ae163a5c518cb4d3d20c9b5614d4228f63a3beac280fd28da439cb8b551422b5db64a558cebbb8548f47b24b235f6c915414ab7f98235cda810e54942685aa246f37b36a51d0718a62e639eb61f89c24e4cea30c32c65801da0d0f48206bd0618a728c26a39f79d823d5baa314c5eb714ee87e8e90a220ae1aacc3d6e6be7014855ef751e74a48ae39298a42e56b1ec6fcff3f560d0b1da128f5707b385ae5629a7f80a21035544c650e3f611d9e284c92dd1f8ffeab424727cae2319f471fd94e9c395188f7ebf1c3b332cdbf89b2fdc68c5e1621acfc9a28c5f857e7a9caa8ee67a290f53192dfb2073b3d30511493fc1d5e37b771728942c8c64cc958a2301aefe3f197e7f120e24a145cfa077974b2f3e62a25cad91bf2b8cab23a27348942f6a18fbd2773de28b124f692ac263134bcaadacb8e4894e4c607ed3ffe791f6755091d902894cb8768fcd0cc43fb11e5ae12f78c1e57b7781c513e49dbb17975230a397fb4d1cf667a201b46143598fcc9d70f26526411e590a3ab47dde03939ac88e276ce90b6f320bdfd4b4421450e91c8107fe87121a2986d3d45f2bcdf118905293844e13a25feea5f433a0f4314efa74eaf225c6c8c1da1a310e581f8c03bfbd8471bbe438872e641874ca8cdb1a6338882d47cfb8ea44d474710e5506d1a368fa440143dff3824444d8d3e3b208a11f37083590f7b5091f9435173121fdc8e8fe71cf643c1d537a4e6fb5032a97d28a6cb08f652269d7bf0a1f07f19e43322e71c727b28c5a778d2b5f5fd550fc5579bf81c232dbd99298305614820c918a30c439ed0918742bad69094944a0f1d0fa50c1f665e4f7eefb2dea1f8929a43f254c44a88ea5980026313e8b04379f8d75b926a351bc73774d4a13c1ef9a083c88fb2b35f3a74d0a1e4c30bcd63af69c91e3e87f2ff64c7bac8392086063ae4508a685a12a347e9b0712774c4a114397568db0e9942071c4aae412cea3e3444aac9d0f186e2b4779efac87bc2845f6ce556871b0a1fa2bba696e761d5a6a30de5b5abdfd8dc9f91fa2fb6bcb01b1e90c05ea1830d25bffbbc3b89b1d20a74aca1e403cf5fe795aba1283feae145787b8d4ed25096ebd1b4e69d1c5226d150fe506793a9ba8e33144e63fb20de595e1413a2c30ce51f6c9698dc4d42ca46fdd0518692e4fa119fb4a9f63b2faae0d04186929abe0f5ade5d5b7234748ca1a4529ad6cef632467488a1309927e1b3d812b8d145b9d1c50d0874c16128ce4d4eb0abea8d906b0718ca76be133377b4e30ba589af9c4b3d33ababc30b250f3146b744df1e592a848e2e94c79b3bc7bc2d73a1987ca0bf39617278b885e26fbcedf5c8839c15590f3ab450defee05ffdaeb261160a3df9ad647dec575163a1a82f9eec7baa2b1472d5868e9db7baf06185b2b9cd4deba70fed8354a194613fce1fbf4d85a26de6a1e56a0f32f89842f96fdbd22287d7eaa11d5228f520ea7bf8b1ec884231cb77d20d9bcea0030a85f908e31ae3d4f184428f4da2255b47cf39c94e287888ae6be6e31f0f755d4247134a771ef1a6c7470713ca11ad297779e6c3eeb18442a6bf2cd7f4a1ea24313a94501495d066ef93573763942106055ad09184d26b9a1c72cc6e2dddbc17ca820e241453587e960f3faf48f08b2d2fc400a304df638c414618e6c928a3039b811178a1828e2314638408c9337d6cde6b181d462844d4bc791c8c8e2294d35bd5ff4afcab933a885050331f4328bdb7c63e4df3023a8450faf1c50f7d7f3cdb11cb117404a1d4230f19e6d3637e3e20145a37b6a675c6bfeb3db0810b68a0e30701ff28808d411cc086200e6023105e20c00620feb00203d8f0c3006cf4c10b02d8e0c30a0460630fc60b02d8d0031736f250c3061e66d8b843006cd8a1c3461dbca861830e477ac8a3affa994339f6783062134ee4229743a92a6224654ff6484d1cca9e9e619ec5ffc73f120e657df79c492ba3e2736f288e84f7a9c7c8ef183714437b98f0e1b84731ad0d850f492e2bcb87d59b624351666c93968a4eee6b280f637fbfdf830f23460d658f7a97729d3c8f5c6a818d3414ae62628c8fb13a458386725a9fcab431c43bc73314f232adc7720f79dcc30c851fe69c97d62099da2a43214af871cc8d617c18271b64289ff7ff309d6fc70a7f0c05d10ff3e4c31c4b33e2850d3114a2e7c93966f2e1c7b636c250de8dd51cb9a1e0c3781494301e056f9a811178616c80a1ec63910efbc9b5f185a25c4b8fbb737d97f45e28fd7053b8f68f763fe6d185a20fb73ea9e441deb02b178a19acc73d4855dad842b9073a3ef8781ff7b767430b25dbd8db8c3cf9fe236d64a19c3e1e4f3eb797d4b70d2c94837496a995f60a85ed6c3eea8831fba6310c4ec00f6c588188cf9347154a951592bde227caa4a95016cb989896d18314932994d732c7e7fd954221daf8e7d18e6c1e4f1b85427c7fb16d2d91fe2414ca1da17b7ebd27143a0f66348f42aa324b27943efd86cdb7cd8f93d78482ccf8d00726312694ed7c28396cac9650accbe87f39f9cb25644309e5519c4df6faba8b7cf6071b49286fb764528f26377a561b6c20a12021e4a4d6d5039fc0200606052a021b4728f5504763e6538d509e7439a9bc079bcfa63539d8284249624abc4a7f6d10a11c43a69bfbf41842612aca7b2cdd99150cde6c08a18fed519eaa7d9cdcad1cd80842f1f3bfa491d63ae05b7bb00184c2fe20f27a6c9bc36bce0f8a62daa3301db5d0dcf141c135a4cfe3a1f53d2869271f5fc718b249ee3c28694ce671ca729764921d94de6b3bb28fa3df5f4407658fba4b1ffe0fd2c6700e8a2dd9623c35d6eeb638c07c1421df25b537287d460931f6048df661c306c5f49f39ce8d598b4247dfc6cee396ad9116a51eacbac7e8f4e71fcea2b8a1c487ffe3418fb263b228fa68523f6dfd78183bb50218bc055660264048512316e561aa39ed983eb02867ff417ff4090fd37945e94f346a3db4dc68ae289c448fabaafbc8a36f4561ea337aca4dafef9a15e518253e793bafa2d0e3d22c717ca8a2b89f3f69e37f8c31d754943dc73a779f1dffcea1a2e813ac07d2353db8d11850e314c53031ff3065d29c7a25a628ce6df06c5292bd3fd62845417c73269e7d648fab440d5214b2a544508db3a1529121c607c4d0c08d2e6e588d51946dee87255e762bdb7eb105032f1c0c3252c04fc6181178c08d2ec02063032830609404fca186286a84c204354051fab4ceffc357c9282305353e61353c51d60f79b8253627568d4ea4c9f4d7da6ed37a18b8d145086e78e00237ee08278ae7bde1fb31d42af2d844e14e937e0c9d48eaa335511ed5e8b8acd774d4904c144284f9684870891c4c9475d3ba4479681d7de2e609a9fc638972787b499fb35d89628c31abfa3592326b28519030613658890f32492651d05cdf614d327a8caf240a913dac23ffd4498f8c446125e6983be90fc73e834441b2452f4ed347d13fa23c139b7c38ba212e2b4794f3ffc8871ff3602268a811e5904b7e1cda734a768711c590697e3c1ec6cd228ab1de45bb2265980fa288c7b95779d211494479282f31fbb86673868a8852faa4e974cd73f699126a1ca2b81f26af26791acd1e350c51cc92adfed9e3bc7aba46210add5e3eec3069d29a3b420d4294cc35ab76b6c95aa1c620f0cb2ae9ea515867bd20bbe1810bdce8428b123504519039fb32738b70bb0351ea0cefe3601d69638a01514893343c4f66aaf387429cfb3ec9a91a7e28bbcdd9c4ddee689f5260c2b81a7d6037337e1e0f3e3cca3c9ef4d1c79a657cec410fe6365d5beabb1ef4b9cde38c3e99983c98ff7ac673074d193c549539a3694a8c22217748a4738cf8b83a4878ed60a787c9c8ca746d1d081fc387aa7f47f74987be5efba25f23a73987e3a47c69e8978908e54076dcec41d4baece2f098fbf8668303add79a87d1837453d71b087924fe39b941e9eed2503ffeb186a70dc59479f49b4525feb84b3660f5d96293cafca03594a27653c618e24c8ba786f3f538eaea66984e6aa4a19cb7eeb9e2b4346756550605081b6aa0a134de9be6e3a18f33143b2c2a25a26c8672deb4ba32c9a3ac9e65284fc6dc9dadd3aa764d86f24688d9317a60d2c3fc180ae9c5eda4e30fa2645a0cc5df1c6a99cb25d7a46128e97cd611adbc50030cc549ef618f4c273065a059e0461737ca02373c70811b5ca8f185225437acc70b658f98653a474fe43cbe8c1a5d20e586df1ec986a4a273a18cd49b3cbf4ca7b770b578e82476e7ab161e4d5ca9fcb29075fea8b63475fe0c0bf92089c7bc2c05862a05268c83418d2b9c9b3cd26d32a5795260c2a0b242613f7a5eca4d81c180d6056a54a1ec3b3974bbf8a6851a54a8ab318562acaff8da3cd1834b5fecd5ab75a186148a252a9e7c6c72ce1e17857257e6eb8fc2e226d4804221a9cc4645789e50d6d8cd22bb21af8be78462c68ad9f11e8b50a309e59022a8bd4a361faecb84f260dc6744aac7128a39228cbfe71f48bc88120ad9278f079976a3fdc61a4928e7749d2284a422df036b20a1b09a5c7d20ae1979a8ed0f6a1ca1ece1d9871a3e104fbb114a362e3daef033f7c8d4284259d5ad2dd42042c9d53dff307b1439823e84e2946fba6c88544dae10acd2f2ca8e2c2157466c3582507cc9797ceb53fa9d9e20d40042396b237b696d5a91cf0f4aa6bbe9b5eadf4799f141a1329cb8c4ee81a7e97a5098130991a67af0a034917ce85deff71be21d94246baf6234d30fd2870e8ad6a39dab128b1af7bfd8c2428d1c1425ba79fef8b1a53d4c0d1c147466df727ca4b5bdd5b8414176d3bbea347d8fd51a3628f64022664d526b3fa945a9a7267be6b4f7392e2d8a767ae1a39d55727e16fd60d5f243f441b2286c44cc11c147763d8e6251dc1cacee46a2a7cf0f1605511f8f53f74c308fea2b8a9a2272f691d9ae28dfadebfacab8e70f6a45413b7f3c981c53ac287f4c1337d7db79ec9b5514634fe78d93355594071b7762ce945351beecd116d35051569dca8d91ea2e5d9da2dc33b2333fd659131fa628db9788ffe883787ab214c50d497fc24e88e3c126455193b59bc44731f547518e1ff3fcf130746b5a1445cd831ff9ee9859fae0509443ea711e68ac979c6b405178fdbe1ef678906d73fb89c27fa71fd9e641cd4fd813856c6f9bc13ee4f18edb89826e4a8c0e9e21bbe39c286a74dbdcc3eeb0d4741305fb711e8759e692c891268af1834de22391e9f4e14c9447ed4a76b5f3d70f8389424ade8d57b73af1ec258adb71b27e92ba7ccc5ba258111a9a13e34a94c739b1b4db6fd434498992ea7e1e442989f1a8c44e6542e240281085c3a1402814080ef21e00031400000008169245428158341ca98b1f148003442c203a2e2e1c1e1a121216141216148303a1602820088301816018180e048241212944108d1fa7937670dbf9092b6dc9830ae197a4fd34807cccfaed164a7f02ced2ad4232ae9569f820d8cfb85d7f61324eb70f6442e738264b31319b2bb06881864c56b6500c5ba0efd7b6a834bb7914705ddde16761353c20a627309e8e8787a6b16ff62f9e1ce9a2b6297d88e9f0449fed68a9b7bdecbeb6ed8264b2c310008815c43922f2c486a202114762f38bd3293cf1feb0f892952c3c6018499cb690abc140a21cb952347429246af829f599bb602cd496ff9fe5a64acd092894b2bdca4ad1b8c5dd1251515a0270db7898dea08ec42a598d8e7ca0153ffd5d39b27f9216162f27dc7d1d3350bc8b83b9effef9be3bae63b06a11dff43029f139622bcc01868c55613a29176296c2227b71e309c3cca3dc5224919285bf0242c58e92e0675ae5ed87e8bcab7aad77840d3b8c7eba448957cd6df8323f294f612854ca6ef3b6724bd0f93638710c017f6a3390a4cb3712bb646ab81231db23b6d00808034c66d2206cd53a44661420250ded124a620b52138f112f7145b21ee3a11060ce2cb9675954596cba4fce7c419493116670f14e64c56a78f1e0d2b70654d6388a9d93c8bd24c43f8b0898a7ad2562ff0fd14a2ccdce116fa756a8c762901b610bd72bd443bf0208a212758708bdc84eea477d7ed56aaba2e39d27473c2d5f000f031f704bcd822938addadca8aaf9583b5eca7fa0bc9d0701ffe060c1da40150d03c28542c212df91db4eb7994f2f84b0c8528a8c04d61015d5c9d2283fea2e6107f63107e0e8a2b0bbaf85463e21952ea6dbad1bd44dd28dd43d0f375ab1c4bcfb0274ebe8cae041e72e376f5b372addba1ff3b6cf43f08300c207640dfbe8406bfdb1a43e0fa9571c45c1450d3213a79fc9af281169451900870e9c60f91c5c377ddff1b88c2e6bac286b9cb03dafe47064ed2ac0e4e5d8ab60f7ef188fe4b936e07ed63a74572affb6a08b4ad88dc75f000e48fb160355c809787ad6a10a480a2a5300da152a53c7a414bf45d2f72505725fd48baafdd10171234a478b456e19982fe26745ba7dc503319d13bac529eb1d1f0fbc82c5e6fc8f76761e8d4c7e4529f42b3df294c432df428dcd6eddc2613c2c81050c21586bbe8ec3566e9723888c8b0535ad956946fe5062664398c0e17ad21d02d657c0397a19b624dcfbe30d36e1162386bd9cfa5b75da2d0ab3ea0498b90fb23cdfbc6dccf075220c1836f79c366674c141394e6c58d55083346d6b2f8d4211690909362d59b37bf094267e0e193e0a250c2968185311a75d3e10e328ce797a66906f9064b0e3c0af0d694acfc03eb95034217f12888dd36adb6098fc2dfca133801ad40dea066906751d1408616dbc43cf8c83dfead302359841bf47bf0b06380e6606f3c9acaa415b834d6e1cd690ae101353fe7108249254d0f301916ceef704403ce63460a5f98b07c4bc0241416741079f4aaf5a835d4d6642bcce8e25e3b406e5a21a69301427ea58aa578bc780be03a41115b9c00682588842508096bb360eba0288a887a0e0548412a36510e5c52a1fa8b1ed6f74233502f97f3a3defb74c3666fc42e03e6cb0d2f1dc331ebdbd37c4480189aef7f2eddd2b22243dec5aa8f7aed1f6a4a3e1dec39a37e1d0faeebc2a52d746fdee36f93254555bd07b84114e51039a3ed88d00befb932319fb1f95509e0585246e61b9644c7f36499953444b0536ba0fbd5ba2301d8fa174cd0e57778577e461a3e3628898762f120928cc2851858dfccada5a92feead7ca623211e32eafd59f3c23ebf2224f2bf332c7ac1a898a0f0ea50b8d0b665e5e368b4d2c56c25da1b545f28a3f20a42771aec9b89816742583d075cc4f63881acd099c992bc8ae1695d7cd67039482cd96513c190c186184ea3120cd8abdbd3da2567fd2cd48626d6752ccf18ecad54719461fa43cecb607e151397266e28d0833fc75454533965a5babe7c759aca73228b90a859248ce9fc9c8d69dac223cdf5be56fa65edebd9dea7e4f6dba521bb814fcddc988556326306eae466479f28f9122d11f1d58afa66d797f093830f3bb5a3e8cd2c44023f9bf58c5e1a0ed6832915e90247752280cb77ac43f92d804506f5035f3cb5e2e29058807db4afee2ef83030de683cdba2d10854ae4b4344d64009e300935eb33569d0ac50dc9598180c15345a1c21a8ac907ee625f0fe0b6ecbc2c9b12f116dadde80803ee052f25482cef2b1600435d2d6a68dcc4b825f397019de6421d7bdcb09a5b554c209fe99b91812008fcc7ec88ec69aaa725cc73e2eaa632443bc1b7c06408915edf6378a149e12a3ef40faa8df86f26863d7b89f9cb4d0c634e80479a30d221a020530847c1808cd007956d5fab66a28cebc360a625d97d7aa2f74997c8ca6949f03a4703784c5e5c5844bfb6dcd1274936e825d287d96b3cbe16594337bcd707afe39cf96adbc610e94a7475b93260a1f88a0b6c22ee791e1af2e2f02a7845ff6b31b5ab6bcebc66d85f8b5d6cbef3bdecd3d7d169c4488c5fc76f5c2183cafb3afe0ab78874792d3ebdbcf1fa62e895158db4b10cdb8624ff025ebbbd567f7885bd18bce85e0c2fb0178417ed05e0c56e78c5792b572f63f4e27b05bd22bc4aaf00afa65785574445f21fc15329205e775eb8579e57da2bce2bf74af36a7b15c6eb0939b1b257f52af412d3d726bc1b1e4164bd085e0d5eb95798576a791d6f0ec7012ed58884f19cb236d4c040ba9286d4b3a80ec8ea85382034a68c6dd679aa5428cb0f126970b9f8362d7929e2b970837263afec4831d180862e12d278dc2d2bd714b587a4515ad3d5de9c46a9e9d15e6884a5a15265f815482a2aaa8ca38a601a996aa25f9517a49c5a6ab210697361713020d4683961c1902fec42d8f12cc2cf268d001420263ba2328a757f51635d581d8d578c6914cd7b1bbda651c527f7ae12de16c1f42823030de2992498a3d5ef14f7bd288a82172b0aa911deddc573a38be8f055049bd25cb97ad7bec6d2fbcec7f6b98691dc41942ee0b00d00050933641c388008bfb8d275d5faad4468efb9ee48b4180cdd88bb35cbcd1a25b590d8949dcadc3f04ec50cd1596569422fbb9a674b10026ea2ad4d55c1728df03c7a0a3f2d95c4be4fea42953841539e18be0353390183f03d30d132083265396f45cbba4d174d4be25ddfdb070d4adb82158e284217790bb32f5c5039654a9448e44816e56f1c3e72bc52e80e45637b8c40f35d4dcc60b10be1af006db2404529cfcb92bd3675350109cabc1f48348870e142037a9061541ae2f43b8a848365ce5223a9326da73c44f321cd56c9fde637e8d244531a53b793d46f6002ef7166e29c282e9796e74eb9b72353713b30d1b193e36da2706f94e455ec5aeff6091a792f9c75c64295d711d422be0cc4e346274e94af18751833b8cc73555c9f5a76da8f8bb753e6cb489add93a4682cbbf4d06169108d9600484b6854bda692c5d19e81328e3c3b97d49ef152c33a8ac10439951886774d98ee418ace319c6fedfa5d412ec5273195c30402180899c199a83d54a31f5e19c1698f0830d9dc00498a07c28761a3c040b37523f29c637031398234f763bb359ef0bbf4182050ba4f7d8ddf065a71a958b3d165d2c30056d58403af0156fc1c2051d89fac9365b23c60e63336385b100f4ae9f0c328d8a5bf442b07fb03c88123b39e0ed6c8b8de1d9acb13505d74608e62b9b56e50bdd8f51530590c7d605eaa0db6b54c07a277dc667d14d7fa24ddc763b0abaa847910306f11fa691301b172eab1b287f821c79a0087b0e04499f833baeb0000686ba0afb76e0b7462880c1943a96bbd7320d1718baaa57e072a34615c011e9332623c816eb92b51d56903e72cbce8cc83fd343f9a36316390f419d36619a514050bec9e5d60aedade232a2fe3b58a5b79ea5a4d1e85e358af2a089145e843cfa0c5ce509dae38236c69362328362755632b15364c0954cf7ed920863e5108cf225326a3c2e887cac2ce2d9670f3efcfcecc37f1b0481403f55a600d4c294922e2e29df00800502b00274195942949f1b02d94e9c750752b0afdc5296fa05834cc441e7044b503137990c909345858370f1aa720db01caa4cd6384f0f8742ea5b3c083b4b939384c578d761caac2b4fb11d04fac7a24a55aae95e48bd5eecc4d2d69520a76da8a6523e98acccb47f5447df1e6dc1285bb313045683c420d4206110b7c1720cc9c5b8a4b03220c260b3ded969a437a2d320a230eaa522b08434c8cd39cb037acfe64b244d29d01288dd96b8b64d8869f35a9015eb5584e6df8e168003c8010801b400740081623f1d14009384c280ea6e078403227e23d6217c53448780802820ea21128fa8481412d14e02b464ac57ef788ba26122dcbe3cef776e843612221e5a3cd55f9b62225ce85ef29303cb1c48b3e036d847d8b1bcfe042611150583ebc374ea258aea7e947802625e64a978b3c2a8b1d586bca177e112637b9c921956229a3ed5c0244fe3cc7de57aa054ba7e9d2704cea66080aef8097c973f08eb33d4ee5b8fb0ca98cf6cf9950ff6c726cc6213b4fc85b05d48a19fa22682203d829964839711b51375567b13e522ab177e486beda0027232f5ebd8a25eed989508752a1080f5296b3c6fb9b1179f241ea5ef54367a75d0bda78f9b2ab515124154ddaa7ad0b118c272a1b075a6d2abb9d1a10e630a2295bc7810d64dcad2038679a8f8eb2444cb8b41c2c9a9807c5c34a5a413e3726e564f683e2857732e9a618a8edaf69bf727f72a02b09d064081921e206655156c87128a951d63cc210abd6a02f431284599001f206e107608842581c33a207a3aa693573e99da16e08e099df6edf54eb5e35f0be23a3ac1d100309033b42f0b9c82a26ae0c99e62056885556b74a9c3559e2687b254687ceae58341764827642689a96682d3252cd4e6d284c1e3377e0298b2153ca1a3458268fb8f310e69d50108124c80ace97a81f89250f4dd32b14d2812a4c96c4047c9bcfed1c0da86fdd0163676427e8f5abf3c52734f6306c4b0402576dad7ee1e7aa5ed09901958c6ba94df51fd02ddc1500abbc22fe4044ea82b6c1ec11e674702bda3c157202dd03800d546c02d5c9f2d10af6936473e8b486e69d046ff764d29658bb3eaadd1ba8ed7e84750fc1dc9e391daf71e586dbb5fb017e1c677c7d071fcde29670b6ee1141c4dd40d706dc4af8546af6be398ac056560df5221259a334294c10f4115e37f3fc58432ce3f3fb290429b58a21efbe7975efb73a189f4d341024a4f4f8e6c871a136e18ecdb3940047332801d0dff302b449e15e2589a275574948cc34c97de16a50ca1e0f41ca0c8c070318a02b0f608028baff6c274fe09edf33e82320ca50f7afe20e3ff4eb8bd4e39166b0713db663abe0af2e074b900380cc522aabc7466056bc55005e5a5069088ed1bb3270d8258a0db34497d9c3cac667ae2a3f7d3f6456a6360c9b2af259486b9240116423b0d895a0bfbf8f80a90338ab9262c03965aae149a611f4befc9554098418906c05dfd73744b40145957732453d630c124e1a822ec06126032320208ee269d9501c0dec87c0a79c8416ef94880e2f886ca62afcf17c8f0b05b05ca3c6b89b9acd1791b9e22b31c4351700483381e6f13e6f082909afb9f4bce90987151cf7ab62732cf580362a10157ade20d1e75c3441ff2ab514cedcafce0779820d00c8eeffcfcb5363c20af1b320fc71ed1f3ec2512375aa1cb2bc48d05ae9fcdbc88be2aa2d7b8fcb42bf86ca31f0843e536870342d86672efa22c296d22ccf783ec6a68b5f06652700da3ce1d8671e38f109e4be4186618b85eb86b4316a03e762171ae067e6f15cd67a306c9b9f9f2c6f7ef0e538a3a3adee6cc2ca5f061b10361a488b8930b38053003e84e09a28131190d15c00a65d8006932cb1d0fce1d94bbab91118337deb14a16602a79f17e3d6c770580c209afb2c59fa717748f677553f1c93685aa4e0bb98ea9718852ba15a2bd80b91d983352aeee54c91dc9e5254701839664b4015f85e7fe7f36d72ee017b29fc68de5d53f26d0cd97fe0e066b452cb2d912a9cc82158d3672540dbd36260da5b0a5dccb192ec073348a1bcdb61dcaef713af1d68288c411b3ff3d0533c39c6d2533adf2ee1c240d2c344a6f1adff40c8a0044ba005f82f3cb8e005c93c55d155cb1904da962703271e460c18e9a011d75317e8ad729c2e7f30b9be2da22f9b3025236f1028030ea5939c0a28da52a72a8c043581acdbf2eeae18be1886e6602a5eeb1aee7abc118bb2e369a0c34d62c13e235385e43e7ea86e23dfd157fd284eea80bca2667a00b8c5208b378870b3cfd56305c225ec24188164e4efeb2d061c5516e5efe49ad3096a692952c2a0335386c4b26b84ccc7fec08a75e0120150c5e4697e7f5ff40d3ff55b01acf84d0e6957a37095f727c45a87cb00d7b7f996cf12f5b07f10dec373b8b2471f49a12c0304e43ca54073f229fc14743df51c9868d3867745d9ad45fca016fde20dbc0186b51fac388ccaa660029920ce2bd3edc44ccb4a955a737b6e670ad41b3c500702e03216c16bd03898d0453c144017b4090940bd9014246a089164506daf8d3d4aafc7bf467a541bb3501a1ccc178ff2fe34609bbb182b257fe260fad8a5e39154fcbc6f867d07b6f1e4eaea5950e30ed5f1ca1f67f1f3f6ddcf421596c955d2579cee155a71469492322d33ea45bb940d038427a25e403a2958e598b792b8944d1521bf3ad36dd47466d1434a1353cdafb80d84b7732d78cbd4937ee745e3370937818125fe68cf950662674d0561d0b91ab1531b1556ed2f9a56388254c92048e4d3d6a9e32e817e2e7d4e3044543011f288890a896bb6b0a1aa82fa246a5565067a86301d5978c391c7428f04495cd4fb6520e526d287ba8062a102a0255840a4035428552503ac23394aa6914592a3ba380db584a601ca87b92600a410b6a068a800a80517db13138ad40fd36aa4f569b88a34071cd281d849b390f44a110a81488ea9bd9dea13da8c246014351ee4fb5a73a28b28da02cb1a802481bcb6913cabf14d956505d281c144229609905c5851241b542d5a0ba5021a858465552e1502da80aa8082a012a06156151a8b20d933f148a14aa0555850a4195425550b5505d01459b8defdc2843411b95948a822aa8b6d786008732867a43dda11680d261085540b19250d9242566be4f01cb0d500614c047f52189aa56c144619d2a7b420fd99650a650281435141a0a1d0a81c287424021be512e45a4608b058a04150f15418543b5a0a2bf28a04f8f92e989027a8fc6cd75a1e2004729df6728f1409da866a026a8031ba5e30b1de71182b2a04e4151f7ae801cfa43b1a1ec500ea080946533ca1b9190e8f7562048c1c011db2b04a2e07beffb16bfd539c482981cde92053b5814cbfbb66af25fa0a119fb28e06b6e4aa5ef16b206f669a84068c46afe1a7e3bd868af728861410e0943d78888f22ec6474dcfba04d70c3b270b7fef7748c65eda84c53ce8cb92900ef5e17d3bac2b3c498f12ebb25a36ed3a9d6a092829f3b78d03cf01304fe94de8815611b3f451ffd818c076f2c7f598661d7a8565bb25499f663e228f1fea31f588056f6f46fb91329e0ff8339023b39aa34f0e24ab972a9ac6a933259e4a1f1af567cf80b2b35f9aa27e48532e0f2647e1f02216a30816fd251a95c3ec5c857679f5eb2735794d4f377c5a9641c53355ae8887418be40d90b0c95a9129644594dd4dddf53c1e1b39b3f8349d9dfaa6bc196b3265586f6f15b5e91a071896b430116aa4d50bf02368309c81eed9d8193cc1759f6771a3e371593e3c382c0f5067736454f0800f275188d888a0ad8ccdcfccf592c6dc84417288c67084b16ff057d6871a3b0b43247c05c352b510595ab31e1a895c90d4e317a70a9632753adce2a9a14158fd8d2fa3ef677c37050de234f6d705145f5f4ddff4d7bf1372770d7367541a12c1a48d1253b165784cc6357a1f85e36e5454148e8249005364e1ac34153dc8e5b7241818a454076ae8f619c2365ae698057d7f4edf1a1346f3e1853a6aa965a20801547be86f1141680ed5725256862bc01adc83357d77d6c06b675f5faeb85b162c4c5a15a8d45801865614442eee161b46cb0d1c36d4bee493f3eb0e2de3995b964848f1127a9b39886e64d47ee285abd4326a524c6fa1b276a96ea6d2ae73ddc6b299b5358e1a7921a1a7765122ea6c5ebd40ff6cc214eb1bd6b2bdfc65eb53ad11ded95770135596be70812b8feda00141e11aab34f2ab83060620799a34cf060d21a1a75aa5ba7d49728bb6f951296433b56034d1869daaccaa403879962220670ac35ff9b44300b0d19db9fb9610d9d4cf0dc22149f862cbce2237f5277c1d9dc40cd535ca094e521be6f95a15897851b6c50e89896acc87ee4481d38cc7661ffb4077785e75162a56e9801f698d23c655ad2139c2fe6695029accb5cf2422d4fb6cfb531722aaba4b896b7fbb2a94991952eeaad5522c16e5a6558a051537d82a6cfcce1ffb3979ef8f5d3688fdd62011c0a91573fe8bfc4fb2e2e2c632738ba8f53f1fed5d96c3700606b872aa186cc579f974e88473dada39eb06d81c39b2e0325994358bb9df2be05031a9a2e4d1998015d7a6e249e10c00aba5bc6a0e0ce80f1641d4d44c2067b5b86a52aa8a7d3700161b25a58981851d36aa14810ca493482d6860650643eded51685a226abf5acbd9cf086bbfe3fa748a4013ab739d998829a26ad60ad0f1b872218460a24b76cfb5e61b63c82484e3a476254adcaafef9812e4a5cd9c50fef27969e659c515061c3b1c98139b79144a252d14a214e269fd569e8c8cc52a359295db674f32e574d85bb52e1d65786df7d80cb26070fb06ba7b254460279f612adeeb04111a079134ee702dbd936fa601e4bf2497f127832b941fea990c0e276c0bb5d1ff3b4a172891d603e8828fd4318be63816e12e8e313605b62c32e280ca2450bd7ad3425d4f8ad808416d70d055cf8596367528f593ded14376c09e1c9c3819e8ac7bdaeb08c84c93bf00905f9c9a5f593ff27dd6c87153c1e8f7879e50e8243316ea00632ad5e4e90a0414c980401e68b2d0bd3200afd674aa3502012239a88c671ddc12ad019013637aba0e05bec9bdea054fb6e229fc34135242d2b5f660ca2342cc13f5daace680467ec8d6a7e62ce75c60f506d2cd13edc017a39f0504d4685b04811733e22024a3fe3cddc4309bd26e33fd248181dcbd215904619722b62fccb6440fb6bd0102dfa36a04dd9733c6fdf5a0dc3f9833c7608c1a25b1b8c0014bb1007a15c0c1ad435be32a3af9abe5f3b583e3cd65be38c80b4385c71a532968ba855e5fd9cd7e0a4f33232856ce7553fcd4d350f482704be21d66bbe313ea8de7a1def97b856cc413cf07cdaa1aede3b2e9d56eae360444d7647935980af410d9cc766449b8305171dba3b036f2844f88a1c02f25a34221ccbe5cf0f584d733c27fa596936c6574c28abf112f585d905966297893c2a3394089354095b9a1d4f5b826f5a4348f3e1b370fccb04d0120a51616333b3663aa1c255984f65cdff93ab5181ac48581885831d9995276f01035ad2c4a4c54b80ffa5448ed774d18be158b068c1c82c8d49e55dde582be606fc69954d08baa4eca1be96799911be1cb88a01028a26f83addb9ad3748e0faf6445f70120a20006a9f69292908203009a6d608919d4a0236ac06ecc43b6d2a99abf1cc1fe8cd27dc29516149fcd58712927826b271f19c235b9b243a70623c97031a355d7509cfd858a592f452c7026074e28236d7b961269514ef96a51b4ae70aade7636220b4b2dfe0dda307a042de4223cabf6b04e3cc99489527cd74179506f59961496176439981aef80278ecc4db79b5814a66f0a492657813c4541f680ceb0eeedcd6a48dadc3a800567925922cc19604fd5284c9482e83b2ea156a334f065f1f0c37245847744f56d914a38e8bc2a579e3192468d3bf8aa57a45e0becf9eebe5a7f19b7af876d310f794fd15169fc66246d9740a108a4554adb0128e648bd6eff0b28d5afd7a5ede49150d4c33cb92308f43da71dc4c9edba0b4c465e8fae444140f80d076e15571eb03dc2fb0c63b21364d3b074cdc4a6a42d7046bdecc177619be8d9475597d1d263e2821bd6dd03e304dde889ce1191ee6ebf73d7ddfab1e0de59dc76d5f0ea47815eb40554c853d5c67480087d26058004af0161af6074cf0db7434d834072936e4414c6c708056308e22044c6bb81d51cd0d7f9ed901681b8754d9bf44fa5cbdc07ba3be3264265b68309317cf985734459870d8af627398596413038e6b45d00d3a50b0a6d001f3ffffffffffffffd74df128beb5b6f60760954c5bca7424d89037000329a594924cc90cc080df0bdf8a4f88348b22300a0000c6b8f60d130e770d689da3878d1b3cc4d0812000118279c465b154561f53fc309c0589b775b1e3014a0290209893a8667ec5bad3277a630dafcc808c6130f15ba32d6eb6e1d602c158b1742b27f3a457fd0fcce9e35285852e95f4ee03a38d2a35f22dc373be203d409cf6203f3c101e981da4c85095de8d350870808bd205c80e4cd2c6695152744746e000a203d39edc272e9a693979b409901c184c669cbea44f9c92d3859800c1814950a626e3649604c80dcca2a1e453935412e34beb08101b987cd47549bd2122406a60345d392ae2f465c38c5998b30435723b569aff8b03940c336461d02743f85c9272fee35818eee3427eedea9924570e16a69454a733794e9d6c25af3049a52da595e89e5e728529e9e813cec4d1d1ff5698a3c941ce0a830e9654f838d52a0aa344de94198219aa306f8c704b49508e8c5462462acca2f45e7233fdf1f28d0a635c1e939fe7bdd49ea730e7dc795ebae429cc3085496f3c898e6f3ae83a456146294c2b5f762979d0d326e50b33486112b6e2bd4926f63d8dca8419a3309fd6df136fd99817916086280c962678b02b55436190a77b726e5b6780c2b025d507bb4a6945ef199f30cdfaea49bba3126678c258529c8de8534bc25c3a61ec9c66fe472539612c93d3999d9accd884f1f3a4d325e73f659f9da10973d0a22b6891632e1fcec8844954ce93fede2af9563330618a7a29ec2a29a96bac19973096249a9cbac48c03332c6110536a556caba43cf38db5ba2ecca884e14e9245a99c1cc293eec61a258c9fb28488f00c539582579831092df6d59485dd7d79634d053972dcf82f121c777898210993563ec14c47bff99ddc584b2ccc8884b14f6e97c9ba97bbb51b6b9a8519903027bbacdc1f378c0c7471a3070e10f0f8e28b0670d105175c74c145175c74c14507b8f0c2025c182c7b16e098f10893388fe7a9c295d0254798435475f4306984e95258fc783b31c2641a4afb896a5a84e12429879095c4747593224ce2a893a5a4ed5fbea44498ba04d1d12b8ba5cd12224c3f2beb5a73a192ff87305ffb6f5ff8f26c4ade10a6933ed7cce70c4b4abe1066dbddafd00961d2259bbd9aac97d73f08e35bacfa2c5ed9d27d4118b5bfe3c4362957360984295b9fa4354499091d409864d57eae715123f53f18fbe5f35b38f18329cc98ea144b787637e983f2e9c44f5ae78369754b54c7cf905f267b3028d1d45ad6996d5d0fa670a12627cb6a9f4a7930ffed651bd3c172070fc650c25ea5136ea4cde80ea6f83d29683725ff630783c9fe4952c2bc89ea60b012feda4cde4437a183f9b379ced91b13730e86ed58aa552ad663480e06931dee47cd270e06179bd1d1f7818329740e5dcd929f3ce5bcc16816ad4b2c75ab273b6e306e89636299d8e91c3b6d30299d2a6d4fff89a5773618d72fab7686d6604a41fd25e135c694520d06cf27dfe7989f732e9e06b39e162555febc906da3c164a6e37ddb4d6ab867305acc11ef69b1194c65bfa394555c0693a0167e7efdc7aa64c960b832699ede8fc1a8e1a1543c137b161683d93deaa79417562b0c836144c6c9f3a01f66513098921c448b9fa42fd4492ed332f9a6174ce1a4742949c2ee67651198d1058389eeeb7aea1e6e4c2e98941274ce7ba51731d9822949b2de8c9d97be17b560b46e13659f72146d62164c2f976ae7748805f3f88a741da5a410fe158caef961452813f4cb56309bfa3c3988b754c16cf2aa7bd01f74955ba8601284d22ce14f65f959a660f63ae5bb15cc9396450a061396637a54151df45130893e39e253db45f907057318b9a46cf6e4948bde58d31d3d74cc7882e9f39338b9feb362ef04f34926949293a868166a8249c807bd7f8f11131e134c5a5af153f8c8d3a725982f871dcd12578241b428dde9533af1839260cc51befffe1a12661cc1a89ff4a9373997944c338269af57eb545ecf2a2ac20c229845652bb1f4d55e76660cc15c5749d2fa2cf729582798210483e72835e7a76f9607c19c3f66aa7c2ab14ec7308869f5734fed0b2f1998010453e6c70ef3a1baddaa193f306669acb8a8b785193e305ccbc91f4c1254d813ba32cce881e153af653d93848abbf11866f0c0eca54f74ff52e27b2ecdd841db97732ec5cbeb0f62860e0c2a0923643ddc35748e1a66e4c0a0a5b3b4c97eeb58611e61e0284b31ccc081f183123c2e4da8f324bf8019373007258eb8a4d366c3520f336c600ebb25e8ff14a17449961935a8be92c5cae5b6b8aa986d972425845597cab9ee111fb330558c9da9b62525d62f0bf3beddab27d98a854954ebff38a56e6943b03087998579f3245499965f6138a5654fa93ab9c21442a5529d964df0eb5b61f6a4f93a663aac305f926a956f4ff7dc6715a64a49f67049ebaa309a20df1545e54b29772a0cdaec8411d1964b135498e2851435ca3a3d3e770ab3fc5c298d1b614ad2dee0c314e6f82589775bbacbb7fb2885298a52a2783c71d59d15e158307c90422fe16a4608af20c001cd5118de5ce7cbdab47cc945f8108539ebc99964611f67a51b6b48848f50984559d0517773e145047cf0018a640b42c5a4ad061f9f30dc8bcbfb07190bf2d8f48441d5f3091726421b7c74c274b28d67cd4a55c1e4983130021b32f8e084498a22e6592e4e9620d4e36313e6d46996e4524934614ef5a2b449c289a5766ac147264c92a44d890b56264f9f30617ebd244d95a454742a3f2e61ca61cb4e4cbb242b7b2f2c618e76b6a762b78d6fe7a312793831b1bed2d1081f9430d7b9e87c4ca2dfdb010f08c287244ce2eb7fd4f6755c766eac45c2e46a7d2a5d7610427b481843e66d646ac9d69f8f30a79e92e7232a8e308a8ac7779c3c3da3b3d38f4618475d32db52f139fd8c3008a1aeac047949ce86f7f8e293ac8f453c762a5879d5c6819111b4e37c28c2d4b36a51cff7c2051f893076f6ac5fc2cfc50f2644a4a64aadf9ac7f08c35e6ae8eac9318429e5a9d28f6a7af5c40b61f0120d1d425335c44c0893ae8bddbe214e7f7e0761cab0685b9757419854a9bacd0fd283f804c258f2e7dcef7f3eae2520cc5a692d895242ce34fc8349c35498102768bda7f8c19c4e9f98eb950ab90f9ce09b978245f960fa647a92be31a13dab8f3d98aea41322d43ecb5b25820f3d986499689de57249723ce5c1785f3a765b8a07934ea62e7e9f767c2cddc15882a84ba9e349924ef2763065aece6dc5ab0e7fa78591a704e960505763628f5978bd2473308bce54591b4b62c9cbc12475fe939116dd52f4c4c1fc712b7c47975b2d693898848912bbe4a094eae70dc69273ceffc17583c973aedb0673f68868f37842ebb26c307bac5ad07d274dd2ea1a4c263394a0e40d4b494ad5600c2b71594b29d360160b3fb3d6a964ce8906f39ae0ebf7397476129ec164f154577615cd60f2d3df95fe1555d5520673f80911efc96fad2783d1afcff7e45412ecba31983a49ad9347c5c4603cb13b09b2724aa724a98f3018b4949c15f79274e9a43ec06010b24d92f4288ff1b13ebe60aaf03f13b55621cdfcf082f1462f4917562262841f5db0f32d9d1244841c7d70c120674d49a7d5f3b1850f2d184c8bd6fe08599694fac65aa5171f594055b21384b8861f582829f95d9218da840e5df1710501c0e1c30ac62b4950fe3dff258f4915cc21eebf43dbdb8c2e3fa8601e8b9ef228d7b9101fe9c8d2aa8c8c8c8c7c48c1141e3ba8da796d0b1ebbf1110573b85f2549ff9c3e69d403bd0e1e614cc0033a72ec78c004c0c0e1012eba18194923231d003c7c40c1145ec3d6cb2c6c49d7138cfe7a1b2257973c7c38c174e56749ad5efd95bc09a6135ac4ce274b3a87ff860f26986fdd4725afa425983bcbb68925df12f6cd63c387128cfb497692ddc6d2c81e868f249847ad95fc795b25e79c0f24184e54ee5e5e4f316b7179e1e308e6703b72df7a4e589e8d6012ade7a42ff1a1ba6d114c3a87e7168fb29ebd2782a994e47e2569add41d22c3c7100c3afdda4d4eff023e8460f491f1aeb9b237a18f20984c1a65779f2ee98fa21b6b363ec630a718f1144ca5367a8801868d17e30b6701aee00308a60e5a4a735ede04d9ef482c8c8f1f186d77dff2b24a103df9c01c47fc69dac7d335b1eea307a6aca5bd83182162fa7df1c103c37c12a4e89f6cfa7ada81792d58ea2dc13ea5953a309aaa3da5842969ae73fec88141698f164baa903f4a0a0e4c92beca9594328d3b49c1c70d4c95848f5269b6f2eee48ae3c306e6d1175ae7943abb777c8f30fea3064631214f49c62c0c62cc73caa78559c6326461e5566bb5b23beba4b3cb1bc88885e194eefc365a6e42c65dc0c294a44ccf12d2debb3caf30c75a986b3f2d29a85f09325c61ee6c32bad48af549791ec56cd81b64b42265957c4cc89e65b0c224e59c748b5d5a85d1e74aa7acceacd8380d3254611a1d259576cfd174e5d42023158693843fc1724d32cd1c1526619428e26f25595257175c2445c6294cb2fc56fa14ce4a1eb1294c72b89b13b29e5218fed394a0c34e3c49a96f0c3248618ae127bf2a3d2e099f2c838c5198d46de459c969649a470c3244614a41b5e7d1aac9202314269d3bbf8f6a8ac5b09430c8008549db96d0963f5782e73e81cc9530299db41d166478c228bfb116a45b4aa77327cc96236eab64ed2479f20a323861502dddd0273e1d90b10993597ab6123b685f90a109b3473771b45fdda4188d212313862b29cbaa8dc9271592810993b014aecb2479a2c9a1e26105199730981c6c2ee5702ad92779820c4b984aca71be921cc3851716e0c209322a61ecd5502a7fe625d926106450c224fa5b8a1a53a71d6b0f644cc2a46372ef92998e79e507322461b2d6522a4cb6b8258b91309c257d73d254af9a0512e6ff92544ebab2ee584ec623cce5ba772167b37c6c154386238cf21f261a4a102d996534c2fca79ff43d946c8a45062344642cc20617321471001989281988c891c2c061e3108630808c42144006216c6c216310360820431001677f05739f10ebaadc0ac6d0e14985535d3ac5ab60ac1494d88fa7debd242a98ae62e26a25a71ef6f51ed3ecb46fa52c9982c9b4f3bf87c96a3a893d3032d2041129984d2841c5bbfb8c8cd8108982a94d49e3693584eadba0608e339121c54cbeabbdfc80c8130cfe97e65bfd47b647224e305b87ad4b9f633b728481021ca502912698a49cb24d251ddf584b39dec68e1c664c30c8be9d11f2c6e2c39989ff0e1c115982399ba4bb7df9bbb1e682bfb13b449460fc2443569242aec76a1b874812cca663ebd76c6899664305ff3a8a85218204c37d50a26bcf99d496bfb116460e1ccc851711f0e7c0231c5f74606424f1df7143e408e60a234627ad232da751c40886d37e3adaff751bba4811f02c4d0b5e6ba9bb2b45fb4b5196b3a84488604a5994ead579773c8f1dae0107880cc124dfc92b33f3e4c021220473524ae777132b27a973448260b88bcb392a3fe7578a8c613efd36fa2bde39db2e0f8800c15842e659dcb416e922084020f203936ce962d7841902111f18744f7ff8fb8f480fcca12eb5c81bb5bf0fcf12111e98d5939cdab3fa2a7030ca52640745cb1563b92dad659c9696b824446f81880e4c97e6267b4a5eb27b7a04223930e95222549ab897b29d88e0c05862b2e99838499f2447e406a62edf5f99ebc65a0e1c77223630785ffef8a25c4f1e934b20520363b7e99c9c3b612bc7b3302931b91ff50439a3721084c8c29cbae45756433b7ae808898549458bd939b124cffc21b03005135d7527a558a9b20c7c1819f022e415a6b10de559fb59ad67b3e80aa36915ed222eac3f7d1e286d85f994d0b98228b183568815a68f26dd4267664689e304425661faf28ef2a65ddee3892a4cb9c6acb36a6a66ec21a930da570e4a8975ddfb16820ac39be8629e3a9f079d3de414c614b1265c52fe96045f8c2f7e878ee5105398a2aa496baea56eb4fb3b6cb4e0c350734048294cc9d25ed26b72b3647ca3876b006ff4701df8821e8721a428a865b14b25a26ad1ea8498f3468f1e17320a532515f5f38963366eb68e105198fecdc3c99025896e955018c4defcdad2faa26ba030e89347654ba5599e643f61d493c774f85d38415bd45005219e3087fb12447de4b373c96274c254ba4edcab19eb929f2f72e438f9450827cc3a62c289bca472650ad984d94f4811a6d77bb37e88268cb525eb988e673a08252199c02ac32ca568053579b360167489dd9dde583076e480c0c808183b72a491114c187d3baf2429f32d991d7209a3c996ee3446b7c92dd991c346183b7e6dc76320c412065d59520993d56e282954107329943025692ea9a7123c6dcd8987183b6cf0c0c1c6e30b1c3dc45040c8244cb976744d948ae3264eff00168448c218affa9d4df62fe8512261d44ea1548e21df2dbf219030cb8d5a353739a5b7e811063ddd9722ee3ac258b7177c745f8d30f5870e93ebeb9b9732e2ca6a51116d919157ff96dea41d2b10b208639570eae2afe71c7a12a208d3a713d62ceca41abd4312614ee2dcc6e83071dbc38830b527f1477d0eb282f810a612848d65d798d452430c614e920aea7399a49b5f09298469c4595cb8ac5bad3f218cf7e123dd838c594e4306616e33af545d2782309f94c2a4fc39550aaa05c234ba5df7efed1040184464a83caa3ec35d2884fcc1e05b9552a8c8b8c7de0fa6adcfad32d2b4bd72fa80f260d266b33c3e70e13bc46ec6d3525a6c5b123bb4a42fe18413dc83f90459f249b2f36a9b5a0fa650d1c30975af932625240f26497a79ba5cd686e1210dabeb8acdeeb6db10314b27bcc985dcc17c622689fb4e364a12640763e72ca34bf24afa47bb6387183d9c075e8f3070e4d0809a5909a9837184feb79c25dc65081b10420783fa25bd375326762947468a1b42e660963fdb334bf6319e0a91832947b4c57a4ed25f5838bcd041481c8c66dba2d4c8217030676875e76acfce2987bcc1d4ede983c9d1a5da65881b8c7eba6f8349d41165f51743588942d8603c6d953d9d4711733d640da6ddb993b725d3cdb4216aa8bd4a99ac9cf2693068bd85ce9d54d090b59c776b76a97bbc4c4f4185b3245a7f06d3c5d52db76f11f9935a4288194c972c575cacb48e4a3d21a40c26498eedd6d64912c755288490c1a0b27ce951dfae103206c3c5acdeecbebc1674c46012a4ac59387d82cbf7216130eae8d918edb98783b123070442c0600e7252dd85a695678b0c215f30c8dd2c295e43a950a71c215e305df42db73ce37e5dfa2447171787902e186dd4be648f6795a6358470c1d8263a9bb86de20521c2a1c36d80c1c35bc01708d982b963badc687b215a30e892952b9ef09ddff32159308bec51275d968da71f0bcb5c682519bbcb343f8b5d521245d5aa21573049aa93e5cbf9b98fde18215630a70ee96739e43676e478142c0542aa608e2794f4b3e90dd4e393599a3e20840ac67693234e922f49e5790a2661ebf29d9fbffa0481112205f3ec8f8972e249148ca65e4eab253f91270e052e9514ab2d77439e605249688bee7bcee7db09e6fd6fd75dedf63c7713ccda6d5296a928134ca3bb22ee2a85127e2ec114de412bbdfecf5b9460fc9c7b5b94549366c324982495b2ac3d6486492a483065fb1247a72e8f60d23fbaaa44f38c60cab1db39a9f678f2b5341d7e810e1c03428a6036c93b3c9849fad28b37d6c68e1e3a2ac70e0d2182b154b5d4e554a6e3ff37f67608e9e7a8c7056f6c88108cdbbd21b446bb09e3b9b1a681902018f475ce1eeace45c50b19c3a4833c49c8ee6d080182f9b29f7e9aecf0217f4e43c80fcc317ae4c36f7887ff7808f181299bac6b52271bf55b8e14068e7c1e5908e981b904e9df39e8f026c678634746b8e86287183cfc77b80672783132c2a384f0c05821d6d62b45ab47bcb156bc9a58ceca9a054085901d74625642694b6e000411a20383ea507274181d3a28495e08c981d12ddfc4ed11eb69fcd343080ecc9a15579dfb67afe3b521e406c6fefebefd94d57e331b426c9020c7eefcadee901a982d967b7689fa7267cec2a4e4b09ce22d8e0ed3591a4064611246a9d8d14a2e1646f7a0e2a5a79c67628201041626a5bce4ac43fe0a93a7b998186fadbb557904882b8c7db26a27e95f274db408905698e693d2d329dbf939655961b69347ad3f6a2939959191b57220ab30873c256225a97b3453ed00a20a93a7f56529fd01498539b6ecfc24299cd0a982a0c2e01a5a4eca79f6794ba73089d9a2528d97767edc1426e5ed6325c92e4829cc15c6d4d3275971b4986ba430053d693ea5c70b67423e808cc2244e4a9dd60495b3e64487182ac891e38bba448088c2dca946da8e4977284c175407f1642335105018c653bc98d8ed49a9928d93d8e0e16a125041807cc2249d4e71697242c513f584b9af64934f55c98a4ee313403a612cb1e23a763cadda3127cc965644949cf674297f1326492c254c9ab9f8bddf76014413e60a15fe29494987f44e264c62fe88fab2980b2098309997b264a25916794a2e61bcd1376d4a1eadd6dd1266cfed24bdfdcb4cda209530052556afa35c6eacf5e0214662030561e0e03b20943086d9d9e88a86e9976c804cc29cb3b3764e529cd534f9008824cc71f7837eb2ea8d9900120953caa6cce819fdb29730c468278040c278b2a9505a3da8ebeb767416401e6116932e4a8de5060fff8207fe17c78f0a208e300513b6aec294387a4deb4698d3881139a1be3c662cc78517110823033632c045175c8c8cfc01841166d32b7e1ef4c995c4380059842943f3548a182501441126e983106fc27d9044980451cb779e2fbb9520104498f2aec8dd0edae4f432c821cc7349ac646aa10d8018c220fce4cad7b983d2a2df58b39123292b002984f974e86c8ec4728010c254b93d88134429417f04320893e8132cabd2c273ef37d6b46d0c104198ad2d5df29354f509da8d3d13a353001208e305dd3793269f0eb1978204104098d278a71de9a184aae9c6da1707071223f91d572c004900f983e9632f2b6f95f8962fa0cb207e30e91c7a7d943aefcf721f0ce274a720554fec2e9f0fc692929eb45392f0963d7b3099e78c38d1574af7a207e3eee893946ff8d6c9c983498afe49c97a69391fc383d1f3dd4d4bc531312c2602c81d4cf153653ea57630c813333a45094f01a40ee619119f2e3f423c3bf4012074307c12da23dc4da7550bc81c8c59d2981236f31080c8c1545ad49a6caf6500240ec692547c92848e593aa300040e26614fd2f9c4127c03881b4cca84b1581353b3deb100a40de65c1115d409cba23ede580361c3b225e6dec99ad5dc6e0d06dd16cc443dedc61a8f1e613c0b5e0de653aa638af8c9fe4abab16138ba2f40d26050d14deceddb5e992068302849a81059728a9e1440ce60724f1f6f2775b525291340cc604a7766da6b4794ec9232183e8dc99bb926194cda9e1a4ab8570ffe3501640ce6149d92787d8ff73989c1a0abc3bd097b3b337e180c167bd771deaf55163018e44f0927dd096f0b1b1440be604a1663f7fe615fbe9b000b70f470143c064646788c8ca8174ca1ea2ceb9fbe32696200200448176cb57659cb955cb632d64d8b86fa881d51d2e37924174c29dc8285ba78ffb903b205939c46f4758f5e04102d9844fd5252a5ac1040b2609eb34b1f3e0825afc3110fb61dcfa32400040be650324b29af0df926545730eb9607cfdebe9d006205732c7b8fa3e2e4588956c16c42e82487f1cb9cf5a860d2134368d1bc17d3865d1440a660b61dfd9632da3fd7470a2649256579b29f242b692323234b008982f17c4f67a5948453bd87918395000205839fe53476a98204902718762fb56999a89d4ac70926af534aa99e2749e90f08204d3057fe16a172987c41ed06594449e95269a76909e624099eeea2f74a308c4ebd5cbad7e2273d0946939763f5b47d8a224582594c7e5f139450728ae7114c95d28f952468cfa5a3110c425fda5f873f299ab4c05ec70bbcd8f13a74f80e108014c1242c4695b0fa8960b2f8163ae81d7d6715031982499789f6ab7493066753e2f556e712861365c27b548e250cae273cee291b1f55c2aca2eabff6235f4a98b46b95124595096a9a84b973749489239fda4bc2d8a654d0eb3da3a34818d59296fbedb19e134818f67fc32a478f308c6b49296ec711e6fb2e71b3d7bbc2de08e36831b98e39230c9667dd73bd5ffa7911e624a26e2cf4aa8558110695a34d84295af8b0539267cb1711c6eae49e3f9d49c9a3873099503184b93f4f7fd5f6897716c2a055dea255876a7e4e0873fc78e223b7419847889894b1a9159a0bc2bc17e71f57594abe3c1046f71274948713f2a41c10260f7372c2e8a4e795ffc1949684bc4b5e4ad7c90fe6dcdf124c7d30becc48112b415d7b3e1844f474527a3db7a13d18cfe3e9b47692e4b7ebc12497a453eedc793028315da9bbc583b1c3e5143c5b0aeee51d8cdd5572954def743b984bcee59ca4eb90eed292e4b8163a984aae20ccc373307e56d89dff3ac19383298b12e476767130b877578589351c4cc992095b637a8341e60915740825c83d7183495ec57bdc4f5ea70d461da57496306283f9bf3e852579a5a4a035185d7764baae06d3c73e215a3d9f58a7c19c74256194fef4aba2c19421d6847491afe09ec1a0cb3d2e9f6a067318bd96c120d672924f4906536d96c72531ca643906e329792d053db93a490c86331d97b3e55f5282613025134df4d2ab3d4a6030ee09bfa33fe50ba6a03f6fd42bec0573ce7725b92c51f771174c7a7e65ea72cc05e3ca5f09a624d9a2690b661346a8bd20e6cea30593c748b94bff12200b4611a3e4ca9b5141c9590260c1f09e3f760a5a54c875097005e3c99eb763a524762a9700563088cb315e4b5756112e01aa6052f2a7257d10ed1f5c0250c17ca3928e25c52998c48dc8bfa44cb0b448c1b855e6497d4d2c6e5130c8102252655b28983e548c7af32cfaa97d824990e15dea5a2798538b2839bc75ab474d30676b298f6e72f7e930c1749ab9713a5509ed598251f674bf747ec9bf2bc1344a502322f3249873b47652c2b9085b916092043bb165c92398c62ac927c5ad890a1ac13426e73eed249bf4952298b25d5cf2ccf9d02182490e25bdedf39ebc0fc124732927564c8560124aa5937d9706c19c7e634965b3132ca563184fce253bfb57d229090826b9c40df127ff03d3655fab65a96c9cf8c0e81ebff916da9d3c3d307792479e1e3dbd0f0f8c27bacae43cbcdf3b30fd8c9e9a103ad6a90383550c692667cfff790eccbef7395a4549ca6d1c9863dffba4fef873f30d4ca2e49c092588f2d2dac028a3d6c3c431095003d3c92aaa355fa12fe62cccdb2eaaeee48ba3c49485b9c416fd979e54eccb587c3a7ea2a25ec2c2f0997e2749727a452d5f61d6dcb0d16e62546ae90a53a73ef1b19c93fa2c5b61d8b83c395e3e9530b1c21ce572f34f2e9d975661d026e79c040bd9264baa3005db3e39374ecce45361fe24a592f56cb74c1e15e6b13bd52f4a4e61f6b4352aa89343f7c814462bb1949694b4b35f0a53eaa037ae24d182dea430e8bef42729e9b6247914c6ee0b91e7d99624456110d6663925c9e52c0d85392cf97fc983c270e29f53dcfc84b9e4537f6582e809f3f898f01ca62b870a76c294173bba99ca39616e534f49be3be568da84f14e3229fc45bb60bf26cc51fcbe2b77097ace84594ef47bcfe182870813c68ba6a3f4862e61923a794c4b492741da9630255149d6ca73a984a9f3b2c509951206b9a56a32b6f1b5964918acde4428e964774d8b24ccfbb3a6564aca5dc21209a3a67ae5fed8d249ac40c2a463a9b0a99f3bea551e61324ba26ccf8c0c7d7284e9e43eeb3f498d3025395faaf7645225498c30e7fcdb61393a62a74598aeedb692a7cf2f5f1126311f3a4f5cb30a2689309f20444d7810613849b01372b65de44398e410522ec799ced70d61ac647771c296143e2f84f1bb93bd8d9bd69e102625275e4e3949a2a93d0883fc757bd17ea1c45a10e693cebf732910e62d191d6374efca803048ab54de19ffc1204c7bcfe6ec07e35b6793322d874ed23e98942074484f5ae225ca07f305134dfd99fba8f5f660524a5ebeaaa02f96e4e9c13857ee61dc7c2d9b9707b3c97f8cbc4e512d1e1eca77db9ea478b93b182c47d653b414e62d6707530ecadf4e1a9dfd52ae0ee6720b2727cb8ff9ddd1c114afa717b7b34d6d37078309fa6349e969634a7230a8279362af6349618a83d9ec35d405a582de1f0e06f9b57895a652ccff0d26957b3798533bbd49523cf5f26983f1c2add3d4c7099fd9604efea12b672af4c26b30c9ff247abf5992f2558361df4344fc7cec5dd360925316a1435648cdd0d060124bb276bff8d77db13318773b8849659a152b66065376a52cc1bd6afdb33298333de5589b27f19491c1f463a2a2631a8331dc554b9820ade45e0c26a5f63b07151354e584c19ce666b782f8146983c1741f4c053d41a81cc45f309a3c1391117bc1a04e96a96cea7207b70b261b93c2cde3cf8ecb057309f179e9cc2d98925857f59df446452d98d54cd4926a47fda964c160b163c94f926bdc5830c936965353abba725730e6b95bb2a459c134a7f4c8b9bab4a882398c2a73fff7cfe96c2da86012964a05a1b7f5a38f821d39d215bb9e8249a79cabb53df24a682ce0d2420a460beaa4b7f6604aa84e6a1105e3e59ed51d9bd1ab7626144c2727952c27b1b5dc73bc83164f30982c6a4b5292ce0476e0b0a183079a164e30fd9b54aad256d34dd4a209c637152b2f871e69e133c194639b94f2a3a55c527c09c64caf4bd91e4709796ba104e38b50c2a696a9f9bd5a24c1246a253f29d16f2a5d012d906050a2f849a2a5b1b04b41010a727cb1468b2318f54b3ca54f5fe2846b0473ca8abe3aa3faf7a2695104c39bb2aeb95c292ce570ece8814430272ff91bd7ab79920cc13cfa94668ede8f757808c15452a894515addf5c62098e276746f4ce5012dc630cf9e5459675f4c4e1d1168010493a03a98fcc9414649262dbcbc1771f9964c40a0850f0c9b55ea3f8de8fdd0045af4c0942d79925b44a81affbe10c3d327761fd08207de58f820a6f4a2dea7c50e4a1554d45cb5cd5cde3e080fb3d1f5e9f2480b1d98feee64298bcbe13ea5055ae4c024ab5f8af331e6b39ae80063022f70000f1eae81179c91112968810353093a5d05abe495463b012d6e600e656b3a22325bc414d0c206a6d295d2a8e9b8f9af37d6344f8b1a185bc3628decd0376b2f20320b93345b2d2a945816e6afdc0e25fca5bc7537d6d4626132ddf3b911eb8d352cb0307577a8a0634bca13340d88bcc2dc6146778f7ed84bd7bc10718531c3538cbbd9c8eb78b4c2f4297518115ac276fcaca8639a6ad74c6b1506956a7262d9aac274d2fa563f5c4a564985b143e7a06ea63422a830f9989cbf2c652961de53984c9295b48954f7d114c6b28f3dc9e2adca844a61d0669e7354921446cfa95356ea9d922e1e85414cba524ad4eb8b2f7054606444144918385a1086180310094515dc52b66a9c6a89d2cc13a9b1dae18d4d5098838ab65fa2e534d3ed8d3530f413e6b9ff140b6129eca80977e4e8e1ed0983a56849a8674b93923203229d306953e23dd5898e2eda1e6150408413a67f319517546eacb50d1b7a88070e3030070e1b3a2420b20973ae92c2c4981b939f4413a6f794737cc424e1e45b2413a68e15930f8dffee24983085cd13ad3a86888ded1266bd5dd5519e620993ca6a9212d56f515555c2248eee9408254c96aea533c2f3fd3c38524231bef00f4c0002101819611b273209639d99ca9053119184415f32cfa7a3130945ac2cdb5a7837cb9eaa83992a49981a12a94e5972e5237aeb9637b535f7101f9e2e4e96cb6e7284b15c740eaa7230f5aa34c22499c976ffb5122ba54518610c8f7fb28abef440641126cb8aa6d749ad2a294f11a6936a42d4091e914498e5b24949a98f69e51e220ce292a4abaaeba9ac133984493eb7aec52c6208739a2408bfeaac10264167d577ed049ddb09610a7329424cc961b4874406d155ec4ad9e5c25db2738d5356e924a5b27fc84e441026f736d1d42df9858dd79103f1280601914098de3f4d4af750d3a1ae0d4400615253134a3f45f6ab6fc3fe603691de62f1a48ee7a61f8cda7f23da5bc3aca47d30a8ad7b9664f17fe773f2e0c10810e183a9c492f510a26e827664c447465ec0c9a3acc81e4c31e4549ad45a4f52af0773d2e9f3ad3f546e4bf2602e41e8122709e3a114376e6944aebcaa3e9bba8af9398b3c11b983f1c5b4fc9b16d9c1a0544d98b8fca3c29c88d4c16432f4e7e9fd5d559e0eb527e1f7f5d79c83d994ca25e9ac7e9f931c113998521227eebcb7d47e0ae340240e48ed3651affbf43b6a200207a376fa5e8e75efa711478e0f2818226f30deaae5575e69ed9f46467e870d738371b64f95888c9e1ee10e317af8dab0a481481b4c32fb4c0955fffed96783f1e5f73ac70771bedf0244d660309d2415311594aceeabc1a424e5213ce9a9a0e4246930ea4921722789dbbdaf081a4ae144d5e2de64b62c58ecb32bd9ffa593af4c103983393f8f08b516f5ef771e43c40ca60efbe9e5c2f9450746466c189b48194c499077a7c2a78890c13c2a3bf5bada85b057640c7cc82ea5ca7766433198955d9ba22da39da2ae9597af2be524fb261206939cced478929388488fd9ae0818cc1d4ee44fbb76daeabf70b85592d1f06cb7cd0ab7acbadbfd9de30583dde9dc49857e638d053892f280e6b3460c8874c1248b3a41ace752f2af04c7d9f11a181919592e18bbe48efce8fc16cc9a7d22ecd7440ba64f3773a6c453240b26254dbd774b49d13f61c17c5e197b09dfc5e5164c309a88ee0e25ac7b3c89a16db10473d0a1543cc94988efca164a3096aaf91d2bd5fbf4f304b64882b192b426e5b3ac0d1d663cb64082498518212ee8d61def7b38c2f1051f0f33c11647306d65e8f07d0bcba6c5b185114ca3de4486aabfcb7ec9346c5104b3081d6c4e50416c5d4c0483e9d4a3e63dd44cc96e3104537ffca56fe5122e3d5b08c1a0cb4eff89e7a2608b2098a458a6ed7297b7c518e6b027c90fb7b86d49eab60082418afeab1c7a52e91d0c5476646064440718688b1f18d52be9dfa5a4cc92680b1faca3fa74b6521d6ed1032b49efafa02f9eced2630b1e98553be7c839aff80f7fb1c50ecca3046d2ad23ecba5930e4ca2cdd3044dbf8fede7c0f0e67134e4dd87f20f8c2d7060d5097a72c95bfd496e908758aa59cd2e4fb5da2ce1d2f4c893f77c415bd8c0d8657263cd2d4d78708b1a18ec4b9e771fd92c4c4a1215dd3eb2308d5e93b3c79f7c178f85a9b25befbcc7c9ddc2c258723f7dd495ab1c7c85b9c5a42054ee922b4c1dc4ec36f4ad3025e93c69c5b0f01d6285298ca51c66c4c43ac15f854185d928ede1a47427aa30ca78b6ad7a52917c25392a8c7d25c9351f2fe3fb29cc5e4a3871c2c9f1ed3685b164b4e73f25e7332d8561c583f40a66420a937e3c1df6d6e446988ce29cc2564ce52d1185c1e7a3f98a8cb0b425a130a831a555447ecbfd0814261d47871a258bbf9da04f984b7c0c9594f2d8f3204f983e67abeab7bea02ca81346b9cd1a6da364cdf570c22465c8cc2d154c3f3d9b30955f90a224c9543ee5d184398838dda524a9ffe49e09e3a914b3a2a7f194b363c2bc614aea50b25fc2f029f4fa2bff2c4cb78439e8b2cdddbf9224cd2b61ce2157a7a4341d936f4a184409d5d16f84d60af7244c65fe153d9a92305c36933fe72444ebd89130ae2949b0ed24eea609240cbaa269ef2ab93d7d1e614a19a6bf6fa684561d616ab392dfcbb846234c6f732f4adc2efd8b6b3002f7cb9ded61b28b306ca7dad7aa34fd41ab08f3a951ed149ef246b4893087c8cd95b5c969438b0893d62dedd293848f760f61b41365f4feb5a9a46408e3ad594ea2c5919e4c5a08b3af7df85c254298f3493a7a124c5dfa3c0873b6a493521562395d1584c1f2469fd2d12ba8520361f630f964941c4bc2a580307e3cb169e1d289eafcc17cc2f68349b02e49990e97d3b57d302925099ab3ff7be283d16ece833c6d0f66534289f769a51e8c5ff2a8d2abe7c16841e84be27b58030f068b539327f4ccc553a971079378e292bc98dac13c9e937af749d69bd7c1a0a579a146bbe7f8d2c19c2ca9909e5e2184720ec6cb934ddf6a793eb1c8c1a02da72e5c4a8983e93cb7b429d16eb352e060f6ec29c50eaa4545f90dc6bc35eb90f7dc60be20ef4d450f963e776d30592841a9895f524e756cc0465f87cd750d6693c64bb83f7923be1acc9a1a5b275410d79d34984ae9d913448d06837f569244a7cf60f4fc27dceae5203d663079f4fecedd1f457b65305bf4b80a42c7c890f6f224ab7d1a837994b8f77e95df495e0ca68b3d517ff2ad9b6c188c268a2c3176844e520483513e668af6f0af1eab1a5f307b2a31840a9f638adc060f1cada586173c25091b9696f64537d6ba60858659c8d85a560a198b274d724b57599f1a7a5a2cfda9b1857cbe2f8939270c841a5a30979cb6c49e5b146d6e8d2c587bf22e8e90d3352a83a00616188b9e43283927cd99dc8e1e3a4a8d2b7026f2355eb65e15bebb3e4f924e122a6d05d5b082b192244ba7689dacae43831a5530e9c9bf78a547fbb64b85928a8c5c58d52cd336e22c75700a26f3383a8923e5c45a4e0d2918ad476cba8e4a493eae1105738a1555b366aa010583cb9fb77a7a724bf20c6a3cc1a8b56556e174fc9f8e62d4708249a9b3f68e4b9752ca9b601425377646c84e4a434c58d4be6edeebee55bc4dfde3ce8399ce9eda976050fd71b5d48a71504309a65cda5e9dc47a51351fa146124ca53b95b925d94ef41e09e664237717fb118c17e4c8b854a2bcaa6204b389f136795b57e7264530497bbde125b48638a9183ad488d0d786ad5b5c0c0db7727db9245af05c29eaf121144b90a253b60df1a08610cc6eda7474c374ab28098249b787cc9f50d618c35cf23c69a5e67cd0e10f640d6a00c1e4b6e39515d7f88171b7dad4b9e724499279632df97f613a6af8c0ac945e3ed63a454bc4ce5259d8ec285946438d1e98538fecaea4ef7494588307e6648250bbf2a1d971bbb1f682ff1d3aea72a43026d05dd4d841fa3ba6724d906fc2a3860e4ab1cc2d5c760f57abb459f29635354d122b65811a39603dafc47e35b1060ef4d44a8b95ceb6ba3bdb45fd8b1895aff657a0c60d4c4ab8182ddabd83104a08d4b08149c8a9d396833239eb53a30606bfd8e9de7bd49c4567618aaf7b272bfe29c5278b442b7cb8575b8b7b76c7e6eddadb97190b83aaf78d533176ad2b3460612a414f4cab5d59a7188d57ece159a26959156bce344dd6d50ecacd74fe4ac31506133e0942ccbce91d198d56983dc756887f298f5ac2010d56187fab56cfb51e19c9018d5598d4bbb676f8e0c8c8a1a18afbf6241345341aa9308d9e56497d795498b73d7dce28bbcf291e9fc2d8399fa814dbcfb69d06942e6898c2785f291e967370d32506d028c5952d9e7562567154a80faf4961ce1663949c34f226422df8306cecc86183ad1806688cc2bcbf96a54f4e4a84bf61f80e1bae83870d1e8f82e46d24ff2a5c7811014fd01085395df68b3315a4438718a1304927474b1db36479dbef6880c2642a954a6752ee2abb697cc224ad4b8d877a3493d244d0f08459ec73f88cd90b3b3f8d4e98b3921cb4f559084f8b0627cc16a4e79c25da3b9ea018343661fcfb242febe69668cbd3d084a9b3cab2f288f3ab388d4c98a27a3a794b7212d71c05343061d2c13f3e9d6e695cc2a432fa3c851da5bd731a96306527bd3f2767777a874625f24b139e262abf8a6ac7a3000539be504aec155bb3b4ebc2b274beb5b0a675e9abd3988449ce32992697f99e9f48c2fc553a72cc3e31d088844958084f5fd245a5fc3b0d342061f6b8b31aba2e56ff7b84b13e5e9eb09c73b4958c8186234cdae2bda4f07d18388e36c2e821ebb425d3e901071a8c30a8a0b4a7ae5d9ebfca224c276f98ca3ea78451521a8a30579d18ae7d26a89394050634126130296ca8562991010d44983e9fecbbebdd925f9f1ec2f0774acad029c969b2c70b1a86309c875e25399af4141bc6804621cc997b494a319efcba27848d0cc2a4ca92dd459b86204c925792cfe27c9bde991b6904c25ca2cfe7113b03c26856f91b72f477c9db1fcc95823e3949a712362d3f18dda29f9a385b29d353028d3e982f5efc8a294a62ace0cd5c8c151815a0bfd1050d3e98a4bc9404e15e6288eef0a0b10783790a0fa1424e16f139a0ad07e3a77d1515ef68e4c1ecc93de71493fa35668f42030fc6f652a1fd434933e1c309d0b883e9f74c3e531d4ab6d2b183f9737e9172621d8cf2173f9dfeead271a14107839794c75487993a4ba2310793f2ad943f9616e64b5863d0908349e83593342eb807198d389862081911fa1e7a4144030e06cd3fa53faea4eb72c340e30dc6cf9d77fa4cb6afe4dd602c4175e50bbac2497ed206c3857a29f12b9a8c6934d86012b4e8142aa2a41af569acc1fc2a9e7436a19eb6c334d460f2ec27cca92a13748434d2603c31ff93ab8cfaf547030de6a0e3dbebe66f49f38980c6198c35faf6a7ffef3bb5663028a5cf2a899e3298d6b304595a3c1a64b85464ad2a657505ab571377d5dd63a53106c3d6efb867f9f4c92406537fbefdce1f46a55218ccf622742afdc160d8911dd12b61fde47cc11cccc35b2c49124ef78271fc42cd08333bb9bb60d029fb97aa34178c25859ce7a0fcc4932d98e763afdbcd490b26614bacab9cea66e49405c39bc9a54aa4090be61cbfcf26e5887a2e5dc158b1e460e69fdff296ac603e9d4aea0b262c7895aa60d22165fd3fdac72751c164ee9621469745fba760f0b1922194249e24289182a95bc73f5ca9ae0f8a8239097aee7a395030e949af68398927c6fe045392933611b264d1167582f92e7f4f9d9c2ca809c618ddf12be245a8c804532e39ba4edacd5ccb124c677216a5fe492c1d2598f693fa0e561edc724948fc9c4bfb930c09e637294e988e600a6a434ecf6be9db08a6ced1c2645a5f04731c911d4d594f04d385192588abf5b4a5219873bee87f39551ed90bc17472e5223e9ed49304c1602244940ef618e6b5df2aa144eb7b0682514ee7ccefaacd857f603a656e75dd715a4e1f98eb552b09a1df944af6c060f288bc553c413dc803d3685339c84b4b72971d9883ce2925935b3eaa4507e633b156cebb1c18f4b429f9ed2ec71e072629ef8e4e7da289d96e606ccb3da16103b38647fd738f0d39d1a88129db6e77633ec9273f0b830ea5a4ac75417bf8b230954a5ddb36aa4549120b5332495049868a156f020b73ccc9974f2a3dc9a15798d5bc2c7cbe913b39ae30bcba7b47cb2e497b5a619aff987e42d79dcfac30a67b8d6537e9deda5518d4cea2b9abaa30cde799c5f7283dca549852acd3dc7fcd8911a1c21c4bec1c4755e814e630a7e6cbc45bd6c9142649ff74be312985f13b9d247675f89c0e290c2674740b2ab59bfe8cc298233ede84c96f422d0ac3eee8cffb21cb461d0a7307a144cf6583c2d851ae7546cac9893f61aad2a3e4f0337692ea09c35f90a6d72e059dd44e98be747ab153c97c4c4e98f486da8adfa3a4f63661926387315d3dffcb3461ee1825e770aa93099338fd1dea6a4ff8eb60c2a4628925018eeea874af04a3c15028128703e260281408516e1b831308001840200cc642b1603812e47d0014800358282246322822281a1818180e8502512814088441c130180c080342a140301c12bb0ad2f2016848b3428832491f42bb2fbe443f836c6f388a97fb44ba39a4ba9079b375ebc6a044d80bd25828e26e995ca0aa60229e212449b256e891158a57fa72d1d969f8e3175b928b2c2a44b3928207817d90f030ad8ab7a403ded65987f16fb28eb4e4b3d0058d9b829a3bdccf550d519da8cbfc221cd67342923c1299ae1460b1e50907ef00734773a328dc872607afec2b71456e571eeee9630207e0a5c1f6d01fc35bf739e6966c202cc3c8777c35ed70d49d7511c13d3e78f500c7c870cf2388f979d82a55388adc73c59b72682a51e024407c60a67bb291ad741895a76d8ad002cad52e3d8e861f421dcd17387869b552bcc6614f5dfe93481ed85a833aa35a8f5a1b299e601799ed9408d8af83ff842df1335dbc1ca343189731d81f21e7285b49b30189a53c0022e4f89c1529bc1d0fe8a6ea1b3cd905a5aa6c01a75f0fc8719bf15a6e9abfccc0a3ff0178c5ac3514de0e7eda996309be42206b39f2e22e8ce1592beb0381b8a108d471be296838f511571b8b74b0bfb45b6f252d66479863a8f300187d1232dca063ca041b138cbed574354925482649e4e545c11f62485d39660e16c8564fc53d38434e81bf524132481f3f4bd4479d936cae2a459de280e9084fb00fd2c06a196b2c1373b7fc8c9dd959641cbd9911250b14c46ff2f65c81c0280fd526ad24476e948442932ed98fcc40889b961ce44736f472027132eb6037ec0d66e6427a6c779853f809eda120a32a5fa9c6cd9d9ae83c19d3d145676c945a29d6dad7af93dda453c4b438c8b047f797e73f488323ad76669e2a00cf8c1ad5a7bc3ba305314951b472396453be1cc1d3b9c14e31bd71a4779eefdd076dbcbeb0df3b295fa7c965d386850a54c656698a7e29ec8a5fb8b82ccd38183ca5ed0cb178b9c31afe0dba687c25747b4a394420bda38f7dcd83ebf8193c0e778d295c10716c455259c2cd0e4d4924a156a716a56128e31366aaa61cd96967d1ee88b87f4ad66d5608f741bcd68b8a1dd806b7be276a8247fff48cc168729e63915e46b47a4815df4a6424aaa2de412bef775510b43a0201b67bd93c5840b275a013ae83706511756ac58e7712b77eecc9e233140945e41549d1f672429a53dcebdbbf3a0e791f30cc85ce1901d526f5e265ea1c2bcc7a1826491638ea364099696e55993857ab714e493343132c732594504751382846861a6540548ad5aacedbd7250f8e822d142eeac0dfdd980a15a5158d09f1c842c6ae083c2b525e01336a555539d85230f55891b43e83b780642605bc4d763cc4c2561af05b8a0c85da829c2e563db60bcec7606712aa761209b18ccb542b1055101bce73e5be8e715f66df735fa5ef0ab0cc24755db9f9daae00a5e7a38050b4921a21b707b6575838e51a747b01653210e0d0206f402d96ffa6d964c745f65bc5c0de062a4122184c91852910b81252a90241bdfeaf6276c83469773de563b2ef05b908b6c08a1eba40f03dbb4f9de251c47569e37eb903482604ea5c404296fbfaaaa57bba152155327bc6334a1be7804d91a21eaf6deb071ddbb750907a96cc4aa87a75d8b4a1dae69c6bd621e15f9fb633b35052ace8234fe72c177d98b9ebc0cfb7dd74479d7b5cdd8582a8c6ddfb6ba1aa8a20e63fbc1846c93f1263236d47ed4620f68e353af1d5bc39c25c60dc8100add094aa924772f0e4bf8cdd126345ebb78aa53836bffc78efcf0d2040c754950b0d7c428370b4666b0098e67fffa9e161e6e2c336c123a0d84371660c37d19a5dd32894d9af5dc0ba49d97a7eea55b01b8d29aa182ed048ad163e40081c36c745170c7f43d4ec6df6568600272bc1b2295033e56e2f47418ffbaa5ab17b4a9169e039dc040f3d303041974c66af287b514a46a40b09b9d90c0bdb4bc3ac55c447c36cf880764dbe9b7398a1d6055c6e0fff0e863115448ea2f85bf612d8b593faba586afc2bacb2b88cfa3dc6d19a30562df79933235bc1c3ac4a4474953e0db1b9d4275101bd5c817917ba22be532192742611080828993a6a60c8599a4eea70d0c029f5182a72b7eef4bbe827aa907fa243ac1cc5e55b073813331b4a43439deb4b2fed2c5993c23c4f09b0c709ee1bf2e01f886a1c3620a62bfb2c36b6ca4547c8fb38422de3d4de18a9fd017f085c61a6aec9e1a028916262e2f87ba18951623412bfb04810c23bbe22bcb90296e2774cbf25d2f7f0607f9a2c7cc40e8716899bbe5a6ce51a9bdbeccbb66d1e51f0a96eb3c2956d6902d877cd03a78fa27d60117864c058508c035ee658a150ddac98b9eb2b16f81179ca2c4036a10b5a6f0c966d100c9194766537b57de17a954acdc25078b72291768a982303f9a45662f80e169f3da380367a9cb17c19e56eafe11178cb27a0700f2cde7ba43f86622e834b2162845fcfec72fbcbfd6997b56f5e6994c6ffc44c12bcc5bda69d304c732016665023213389713358c62abe874c9d0e610289405fa95639bf18babd5a34dac2a38ebc2612e74267238049b39676d11bba4b40a13cc0638388e9678842388f4bf16d5dfe83c879b964694e57d58632354b8eaf727516eddd08832a40a67af5d63391b1db35ee928b8b0972aab24181e4c9edf59095d6f82bed1b223f3e75ee90950a38be6f70750d3ed687f3050259603aef054aac2502505a95f8507bf5602330b8ea9f65ec0add421d1007f5d74d4878f53f162fab225fe6c607ee15b2efb00f8a684e3c4ee102f626da0ca559636fd44692bc5034eed7558f8fdb27c5f7debb52993b90f3923770571a5878f12fefad7b87cdd891d69f50caf09e5a1aed78cd40d1ad29b0624e241109c498d89e349c7d1d86e6c0e0b4709fd63b1da12c0e0c64af4fd8c7bb2c90367771f64d42a8451c3554511a2b398ccc05ddfbba243cdae129884e76c935a24b906ac9293db34b9e6f87e18b75c80b7dd769b1d828e7d4ccd230536043a9a91d74918b52048951d4498537a5f696ad3e9403a81a3df5f92c9fad6e3ba2e69282e7ee9d85a7e01c5e00d7f3ccd1b04439ee8f971599636d4a7332ca7728432891b4f2545c0297f3e43897a7f4b2bdc438ecdf4b4f1d3c57f67014d141fc7f4a16ac9b595176d63a74e5dffa23707764f4ba0f51f6ba0167e37d38386fc5d9f261872b35588260296926fa2288674c6cc4e36bf00e308ac9064f21b23f3bd55a84bfacc23f791d6258bc07ea2e3ca62ed186bd79aa5b04e6c0683f7a97380ffb57dd75962197d2276aae65b5425f921e4d0b265b4a8fa29609df87b46e8087dd053ffd67f44f091abaefbe1e36efe6ffeb18b784990a1933869e96ca20711198eb2249f9e2f98ccc3f159badfd929129b3af828a82093b97cf028c3a0b6c9632628ca66ce95749dd074c7962b4d169949e2f73ca69c46cceb629df1bed3cb3f0a74b3373e8c2ab3652957d9dc08dffa8901bbb8be95bc4fcefd74a5093175625f017d42646d1b8a9b0ba37139b6136212761148e7162c3c7b77239f2c70017795ba2cf9490c36416af8221242e6fb7ef7e3c607011fb1438ce75b5e0cc50db309ac0f9b94b661526752a9eb848ecbc0a7b56608cfa91ef72a52e599a173a855c87b36829c094e822459ed78bf792c6290444c4ea39ddf492a05382cc62d1ce07d5a32704bb169daa337db15ff26bf474f8fa9fe9741a1439f39c9ad94c19530c304b0a66a1528f28537b5be458d06a3a48cf9299d62f7f50117f194cc234c28bcc96803dfb49e994ee3efaaf2bd11f6d23e833732448b12812492c3b7b66184532c3d049bc0767f252a2d117ca3ee0a1322f19ebf5993ca9e86cf5228297fcb86c5c4654e83f7994cd8d3ef6612aef693b7e9b9194c995124682fc197743a0a44891a884f4956ce7fca2bfdc1fc4a2c27920ee770d5957c92d3db73be63819264d222972a094abcc4a4ecd4c71c9eef989bfff3f2c36250ba0f804dc3f67167df597a2f206efb359ceb76eca99135238a54cf14ff6b0cb86b15c26034e75f9e62f5bbf3088869802e823b65d3af1d99c0ef94ccaded6dc6ba263e7218936d12588423738e2c7aee57e706b5d6474f363d7d1f80ed1155eae6c9a7e014b34ca9043b46ba09de2c39b0f5262c92740cf467f236f475d44c8fbd3c00cc68b5d3ccb4de2b7e34d992f4256ebae5c1c6cf5776bb9be0c91dcf9db34f46d66ebaef9956b4e1ba11a1532fe92adf20bb5b029bc295b2f8989f6096cc026b6caa54dea0f85330e6d9ef83d0e128b49ae6b4f6865853d19590bad20ebd078c2f3c39c7c70bd418b876d8b8366058e5c92bc5b09f9087973af82afda1ca37955688d3a9cef9ae8fa8e7935c6f19e43afdf80b4d863c11f1adc2ade927e1e51329a6b42dd81335ad633228e9f6b4be17f5c33cb6c4cd9ff2fae1512850b729f6aef3adb6c0482ecb49af80c2f1760dd8783e40c229a91d8ad4b7c4365666949e6f5c801e019f01002466f25c42e7059c67b7be31d5ba32a4b5aa9b016311564f078627792e9f4739a79b5dab096c44e2066007a452c37d22a03e957092b581cd624f0b40eb153a032d228af5ea952da650cc44e202b424ce8420e3021b1b4c37bd802605dfbd95889a266db33290935708985082b69b0a463348dcf129dc4736545e466cced50ab22490392dfba6af135fd0a02fc059e283310b4f11f4d2e72761dd140ee938e19078508bd8456f25045f0fb5c1cbeda1fd9a26b3606c72fae248af66401be32964a6ee9981a75901408300841493b52c6d22d0c7848fa63094ae6d9121eabf042e62a44243eb27bfdc5859abedde06ba296a6444f13639382bdc38d2bb399d1682b511be5dc6fa2570b7527edb5f5f11d3e4150398ca8088db9cd6f0ec93f67221905b4c9e793766c4b11ea3a17e66e1e79ebffb55d8eb3751095924d290d3330a3b9caab0b14f2b50dfe925ce6f0a47b416f830b82d656cdb66fbe74774b2659797878257c99b2ae3c6227403de8627a171d2b8fd1b52c6ddff50f021fa4815bc14e13525114116a704abf726cc5eb25a0b6d610c449fa8c96130d31b8c94c6591e2c89e33f8c62e9f1d1b14fe9b059eb10acb5b489a84263796932f03bbc224c9fed11eb7be54aa17b345d28d61d8ac6ecef89539571ebdb85a070b9fd8c0a193704505bee8609cb554370b819086939a3dc2f7696035c07e07508018da183f496f5810a05eae4d7649e0fae36967b6d717277fe5fb72aa4a7d0829f502cadd12dad4b4e2cb176f1e218d38aabac80b52cfb1a0ef2a44d6ac08506ded602d72b02e56718f12d40ec360b35c448f2411d6a5f32169a94b3c35dc7968b5093a012e23901971e20131a182ddd9d91485c3aca3b520f0c8182cbbde522742076fd6fd2409544e2499728010d974c88f8ff55a8e706382188dac09f59940a4fea36416f71b35d803136b6c74481d71f3cc84220e7de78452ae817600d3b5fb066607f93c11a4eb7843d5c94cbb33465131ab0dfd27958088d240659d91101147ae1e7a00cd4b7d4220711c5a864e522424707c45f5753e5e35c6e7c5801c9ac8297c1197d7bb83f22d2f5a88a87e2d04365d3a45c7fa8332437688b61b6c9a47dfb9eaa6f183bf62e86cccef9cfdec2c23d2026ae805df7134ecf048388871f44e664fcd564915c8da8dd1522da8473e290acd4b523324c712378c709f65cdb74cfd85a3805433c0f236016891f6844569dfcf9ee1e3ed678585256d19b96ce42bb98ccc72f3a7df7efa0264e6df3b0030fce270a21d237e90b34ee019526ff09848b1b063d3c6dcfa489ffac83b9fc9651b84c4ebc5b2fab1ec2c4018bc2a94d953085b694bf991af0d7240795ee8f475f6e22669ed45326ee6665fcf680cbfb1d3f8d3a8fea033b21c529c6f1b23239e3dda8b383b07325fcf57095245a584a72f255058dac238b45526fcfecf1c5a7cf803f30f371845697b9f04f241dc9cdfa7f88e0d05b798205c9934c4906ee218df5b312dbae9a4bd010fdd7acc14339b6f84d90ae00b7d5186f16a74e570be2eba3093cce7723254ac7754f6c64d441e7fffce8ae22176ccdf60cb9dfe8b67f7a27a8eed94cd138ad647c5fd22627a45755a40628dd00810a4653c0da1daf234a398e104db9203694fe54acbce84069261522120fce19e89ca55ab23f04fc20efb23c1bec6dd2cdee25790883e605ac258d14dfceca2434ac1ac8a1cf85ab045e132d606189b54112d2f5ffb0169c8e85fe454646e97ec685425f407780850327ecfad403990acd56c100c87cd11f0dabd50de54ad80d8057df5f10b983a3bc56d07db284f44f2066e5659c51f398563485cc1bba1edbb6cc9247f7f35110c02080ee0a0d453448956a7aa4e1f0ac36a24955f53dd097dda1d4da3d0681feddc719e074ddb9095d54829e2940e13df0c7a82ff8a3a1df65db7a921f454453773308bf96cf5a1487a203906424636c05e8f2761a42e640295302e63ddc1179ccc95e5ef5711309cc136ce6c513b81d1bd83ae82043543e6c64407376d83810a7265374c623d370319984a745b23d2cabf47f719653aff1996a81b81c851f0d45ce8472b98cde40ac68dc003a22ea88a1acd19ddea468aa8abaec09349f392d48f5f5c472d69ca5f33da11bee5fbd31e04cbd8eda06cd5064da69f35ea40f3bf501917a8c5998aa7a38ee61864a4d00f877331a79142babac4de2e3f73355541074d85fba2ee158876e0be8c7d4bccc2e1c9df96bc307c6fbb15bdfc0f1b712023465c1b797598a14a417946cc830e99d7670b0c6464d5717c8deac9ac12cc2965a632ea7139e0c226f305d24b1847a76a0c4a78c07824f10baa49a628ca554b7f105eb9817a981436db5d422ff66fcaadf1ccc11331029dee611a420b54a00cc86c10ff4643c8d8560a69e183d501b1f6a4162d074fa1fd19f06a106dfc4b56454ede16d162d49e3a856f9ae1f40a7f6a878435b395ab81a43eb1e2e7f6dbd571214478c7b7446284d4e0bb8369003dc28aecfada533cc32354956620a705e9bf1196c507685d3d39212390a4b2c2cd30cb2ef9de316b83f469dfe7e1283819adf7399c0260e8f2821c8065d03b7276fe29aa9af4d2116ebdd03fb74f3b034504cf599cc93855b2915a07a92d0ce28fdb3f74fb6636b3a0394d9fdc1527ea6510700644dd26fea04bacb7b194ff88360aed6d5b190937f132cb017110c53bbf4d7e56294065019552fa79ac70d7d80e8390faa705a89788ff6b3eb3526944c5f991a42446277bb5aa589423af75b1672ebab3cb928321606a1649a308b8687d5520683ddccfe9d2b3f94815d6f7cf598da51c7b4570d722b37d6f3df9253f2b759ca00d6ddfe6fcbdd75aada657889906c68e141d4d81719d6dab1e2887147b61db65ababf10aec977146ae3cef9ad55fb3d362761e6186014df8abca020c2562e0913bf08a6b19b1200f0f1a5faf64a90b3b351428caa1863096d38a9bd3f6c6896f9575aa4bb05cb3e5bec1da6fda3b6733b975a47cb10748f281a540d5b41c50d7932c8ff851f0949b033d41fd79f79c294477d335d74968305bdcecff5c0a256138d9c1b66c4cd67ac69f807127425e9c32cc1403f6477a090b02da46bd5c2352288306c0be6c36b2a6585c82f655998e4f329ad2b3cf6973cbc1271d971d3c5f2db44a251c47e15872abfa5ebd00851032faaaec0be2fbe56e8408540dc92624b6ddaa9018ef61ba953f759d4bffca05414380b91257d5065c77448048a061d2827743af5010ab61582a2abbb5fe8800f6fd28cc9d0003fecb3965e3b95fb24d96fb19059c8d6cec907140705f7fcb4c7f24927c3b032a632554c1adfbd2ff618bc866f233b8d3518c09ae49826290cf815a17b3f7b3fd69586108753ffa77b6d7e1d7f4c210e2340dba9af9bf4fc6d94258d2a55548d9f9d670ccbb0264dcc3af1b1512e1cf7498cbe255d1ec016cacf970ff0a0af2470497db50c63238e24c5133f4e9608111af9261b1486ec4493827d19a8404dce6af21b964f01f359545e3f7b506c951ae7122ca753daa47263d9d52fd5ffd791456b22e9191c893940605d2acd3c8698c219fe58c8046626586dae650fa82fdb81f965176d3186f48c4f7dff0f6477c1db63f966d6e7b284b607d94916e5cc4882970277e46598e4b124f722e659ec8a24a5e3c7e8f01b75783c31d3834c50505d1ac5d8ab4701fe99d7160598f47ef75c58ca84928b92fe8dc3781c732c2eb79aac08535ba66c4977a707752527113c3526bbd582e92f29ca9c3ab3a763ff2b3d285ba899f76adda90fe6c993e9135f8b1b88c3220810e813c35909eea626118d3dc990d8ec919b925df4d809ad3525d086f4c40a2905bf8b306d78d092e8b8b2574b9c7c8f88463a5af281051fcaf2944fa662ea1e5596724858598b9e8d0b3347b15e3555cf59c0693313ca9d6b27b3784cdd33311cec548e533aa702f02231ee4e8de67a781f5cb3bdd56dac96ca86e7ecfda9e83a1519d2f837cab9aba39f92451fae74b2e45b5bfc01c8f05cfd66834d5b215ba806e9a8f4a452a62b916c828b9314e58e7e618b3862cc2e543a5c65b6d9632f19b6b32793f6139f5aafce4aaa4b9291986eb2e185d6dcf7bba5fd13d02d49378aee770968a3cf300b708594bd5a16bcd384cbd70bb1f5f7a0ff45938307bbd47158e899e03d74f2c3eae8072708dc962a0e7c8e9c39da65aa705ee51362d270c637dd1d2cb0f38b2f9bd82356fc483cd3698d0b36b500395ae1891de62057cb2d6aad9119951ea42fbcdfb0f150331a4f246c011530f2997447661ed44e94490389f116fee03dc95acbbda496822b9fb405f53ec6d6042982a00f9f212f0a0ee5a5ca09a7328f1b52063ea64599bf40ce3f54552f0ba2a44e27539c90913b90338fad0a94642532f9ec9ae3e5692a00c3b4d2c20e615118d54145c3e1fb1c288746abb235cbafe0346264eec9ce50511a94cdad7112ab0cc9efe2041f4527f618130f63dc47626953dff9282d9340e274835fa5f4c51a5c069d3733d69e8551a8c0a13d436737324d3823863679023a9b353306dbafc32e1ef1d8e0d2e57026b6873efd5ad22d18f9be4ef5896a9027b2e300d3a2230240ad996ddd17e41df7eba607ca82d9a67b52860f0a5c803b3206780ea025d0c98c5b88670f541c0087ca4bd459c4077ebb7c5ab99683c9d14764381e256b720c70528af1385b51737192ecbf784040ce4727095bf848801f36fc52f9ee11d53a334c3af3f58caa3f31e50674b1e65b8589faa38d88c0e73610c467ec56920783cb8bc532f1d3ccff44ab84acca9b9887e5d162acffa2a1ac8fee40aa77adca10cabb0d8c43b84ddeafce1adb51007343850dc53829973c7a02690724eb91851268b45b7067a47440536c8a8bb311977e9d999414d037a7c108a6266c5d6510a9eb7c34d4529fcbc88e5112111866dd28ea0e88d038e67434b8d3171dee58b232d6a00b854a06f55a3933bc28add4f527ba2ccc3e6fe156bee292e89d546b5c7a728df0645d8c64c84c5985ec259c519489659d0f5d0283a91578cf408d0e38de09fe3c53af5f1ced27db2d5372427b67580f27862af13d0dec46eafc606ca1a6981021f28e16af55e1ebe87eaab4c44145e4a4ca40d613622150a9fa30099271f135e42747641ebe8c151dd1c9c296160b6ca0d7818c58d840262da00760c2fa9f90fe50cc0ff286b31e668f6ecf1536d69f5a45074042f7689a8da061f533611c3a2155204b9d845a643248c276df500ce28866c170ae7ba264fb9b25165de7cb9450ae32958c0961aa9775eca40ab09319758c071f5540363e99798d22442c2199b4b9d6fd420a9fe90953131127b5a708b9d60c6e2af4d456032372cab926d029297ef343c7c2d45f2cefbae7005194d0c1e3bede13bfbb91bd2c043a655a8c9dd633ff70c1c1e7b04a6544635aeff122ff54a399239b226f74014062894579004ad5af28fe6d8babfe86aba01f47481c364b1e82e2beef81ad36ae0e347083ca85fd2f9221eb3408dc644747ae8a4899d009ee7dfe32b33c9b771499d6fb49ba0abe8879578e74a7598518b3b487750612154a2b92a74b7c59683a041e5da0b638d88faff1254496df20a191c1cf4b2035004baf5909c13d6db5e51ec28f30452b1a9614f164542d02a64d0ca5310605e867f4280f012b4765289041a516f65e1fc3b75362226a83d6d2ac4ab0d7825f1d2a44ab6f335aba98b7745bbd1f1ae0ee7126d0e975d5176ddb981e045806ad4d00aa44180a6407deb3f8c8afdd2824abc800e6f6a9c8b3a4e543d13e290c569b380b21623bbda36b95a6d34f88350d9901e072d4fb5175d459b758bd826f1d0908e8b529ba340366f9e31a63f9d497e4310f78abc7eb8b354afcf5413c3abb8047945f9c57ad6abb538f9d26b25715f10935808f9ca4fb75c33ba2cd0f398590f4854fb47523d94cc721df28047a666ea29d9cd21fe4005162d6bdc0703f2a10ec1aa498fd23faf7954a75b635672ba2ff0c30e9f96d8ab465c044a453458a7113912edc672acb44bef7f17fb553062c6d08c46f8be9a2571f049677db9e2b4677d0e4b2043b6c5c29cfff3fc1949e5231e7194a0c3b59e50521b3d4e0a05810d2ecf6bfd818554dc8940b4c948a935480ca71f83a4303e35cd0c506319d2a029cce0e166aabf237695c79878ebe55aeee1b805502953aac65ef97aae79ae9956933c0e1edbe521b5200ae028126aa25f3ded48c71701f74c022ba4055b9eb1fc1899493a88f105f39a7b89a26042ed1a5514c8a0cda0256895e7992766004aff065605b60bfb1d7571215e1514f2f130479e71e944ad06d9073dfeec1dc60c91fba0ce6e56cd133038a3e15c25e364763a985b37cf684ac8fcafe702c75596a40a45d2de6aa887ecae9ea61b960f22d0513770e424a2bcf331b635bb258afbccc97df03885003bd6c473d567ecbd274cc49af7f96cb6b5548d1e8077edca5eb11acf122e6353b803bab329194b90a7bff6a2568263120946e32c118130e2f2452bb5477b594665637c23468185e85f273d321de7d5e925b5e6dace1d22a067f7b13ce115c90cd3f0ae9938a773bb6fb3abc8550c2f261ac60ccf55add0ca021f013db042c9fcc0065ebea0dd0d92a890e4d6130b1a20b6c32691a8982465196e27f42ebbd153d7c1be785240b9e93247189abdfa814cd69f076f366d516f5e037a9250404677318a3e7c621828dd6e214cbc0bfe1f1586738e183527ddd1a5ec8774975c85d0201d8a4241b816708833aeb76d958bea7a954664d21bb97735f771c8edba016937c97805dad79d059353a524dd0d303e38cd77d145321b6fd0c8adf816b8906f61d6c39c05a0aa0e3bb6dc96456105cfb76ccfa8e38156f66e39619d557ad61350d1cb55e9cb6075db7b1c2246085cb4beacbf2afb771d91770e92430489534143b6c45abd6c69c2a90fbfe856efc907d41f43a676e136cb2ce8208dbc98fd8051014e948e9d78290b80c18c446a373c248e090adee507d849261d08323d9f43145fc20b6cfe9c722d598d7cc960643e30f6ecbc0536155e824fd5320e5c819c753ca9bd60cec2c8ae3db2649a8613d28ad97087d2a0adde14e63135d9f6305db0cc2f281f02abc8e03870959a0fd966ca2dd78f275d7b23e7bdf1b1d957dfc0ee75337ab6affe2a2c08509fe653aeb388700aa917295550018ab5f2466c6f44be38acc0d0c233489d45636108912a3f2485e68fdfa3404cb27f9a050b8bceb81ec63414c2b418653d39e9b0c697bdd1e1e323b514c02bf5861ad1bcfa38ad0ec1819346a00c3a0477820047d85767a271561d7ca225021ad2ff3be424dcc42c2c31ccc0bf1494ae4901ffbbcaed1641e4ef2b9a94edc68dd1b372f699bb96d6a77c34a980bad774be9aa7f8a7c7009b6d7db9f91d8b3810e86dc5cae25b40c516b9b67f89c56ecd152b2389b6bbe96a816d4aee892b0daee0fff736c8a35eab2a53943554cd4f1552f9d558d7f7078163a3e4d83e15f266b12b6e3bdc2752a3d4036bad169af88346d76e9de774650f39efef0a50b9f0b123e4c2667ddb8bab18c0c1f472ed1c5dd9923a4555a1e95e6a05bc9d2018895451abc213548f9b447365b0eb2654a92755d04ba601e15dead247ebe82ee67e3673572b42f615a152bb62b15229f0412b91bf76862c4d7ffd91be0b66b9fa766b1ee3c13b71793ddfaf409f964731b865ad32ba6499726a57e444b3b0e545eb535b2273505898a9d1b34de13d2e8bbf2b620b43aaec6aa8dc1d48a1f6595d26ed000e7a2f0e84dd8aa558498a4d890bfa5e5adccb85ba73875039c98a8c2640582146e6bc57357cfb76184db704ca551f9d0c3b8b3b1c476987876b28aa567bab122c94a611ed59a437c4cf14422ec43361004106484e90dc11168392661e59c80622328860cf78dc9409e2ab5bde612b29026c26dc7f4ac7f209027c0a393855ba46a8938027cd9d30584f0f57f49dcce06a70280eb1b7c432f9bb2b97be4e37b55bc56b610551c8e95ffb55eb59a2b99865ad57eaaae2612de8e48dfdef517488d0742556b1655d8211ff9975385293e7ef1c8b314ecd57fabcc600326492ea62393869415ebe2a4d3e250a5ebb7a84905e28802a2abc525e67e90380ca6822e00c74bb22d07b5da6f201537aec9c9ccffaa74334f1d1dda8829857dc993b49e914ac42cbc57963a0f67547fa3d47e59420c8100f68d45e4dc710dc873b30a7854101eb110ca1e9508a7885e0d12d9cb66996c9dcda012ae18d227fe242707c20c7b7cdc415ed84c60dd7a8c2c34cb1e6c79c2673aa31f1562c7dcecaeb6a091fb67f4e10da6cdf9c30168548718554c8bc893e967da4e7af8692e294f35fdf19a77d01b87bb17b121a4e15ba2e34954b600214cff430eaf5cc317a47f8302c3bb43c8e463ba51c7079d78594cf27a8cf1627bbedb2350ce0f4bccf1307e832b193a860e9bcc166089513b1821a342193dd87e6fe4922a837ff90b730c8437b4e43e265f2359443244d5bc87116506ef867acb6fc129149654372555fca00320e1dd7aa843f900147738400cf4422c6e854d4320109ec02c96a13376643a6dd840a0d239fd6f13085314c6f8d32cc059ee40979380fbec42a4b27a4835ba3379002184a24287cb620ef5ca4dd6cb4fc063080eb95170989f0768fdab406d7215f03d4ae71e57791974eb16a07fe7076e1e4e573c070f0e0bdeaf1058132321562a44f0fd3790b6aae13dba0a882ed771ea989e2a31810744fe8ad7c7ec6ad669ff2ab663022080accae898509c9eea8a31489d76ee85546a60bedcbae4991305561202dcee1007a1b713a0a8ea817d8062a9fcd5326d846c659f970d522dcad1ff013f9ddc02e26c0f338d2e0a5c762030b0e9f3026243c5bb8bccb683e6e9e0921bc7b689e0a8294ed766fa082140123eef361ecbb5cbc6f8ef28ee18de85ac145e98cad5bb1253a35c0be9711b4cb59e1a4ef12ebfc6cb729be03bf8c9abae8eafa0189ff10fc81df4a7c6032c9ad4892a256d75d52f73d81f1fd89d1558732d6889aba834ca27af8b5c0adf50387b224eb8c535614067d22413bc10d61905e49a92a194ceae72e08feb9c420c58e71c59208dd47c3d024653504ccfbe775824c06b74ef1c7b2d992f334859287d52f68ebbfd8847816cdefdd1da01d451f03dc52a97387d9cdeeee141a7067f6259f79bf869a19c40ea3999520941b753e5bfd46c3bf08226d82fea100946c7ea0c3746a2ab9c7aeff217ccc002029793428300c62fcc83f4c7af5d89d12304d1b2d04c77107019220be23d96484f78adcd19b0154f52dc77219b1d15ebb056308fb1b1e3c7a96069ed6289daedc3856f0b95072bd04374e32235463b63bf57a2a48a9ee1e95dc455959a5ccdb5f62eddc73e157f5d1ab7aaf0921395bd84e3dbeda4f98e096d544fc5a08620d67159402e1b4cdf891f3bced898cb0cd4c099bcbf48449b239ef362adec3986ccc78c33ee8e57616f6e90ccc334fc7f114a87579992ce6effc24a7c2447274d28c615305d2048e4219af9726d014d6a14e0d08379991e891580e2968dfcf3c273a6438fd887e51f355be2cb62178a4a99985f2ad143f60e66db3fc57c08fa43ea15667d76b36c6f49c725e023d6a238cfa842574dfbffeb50a134e9ae810c97c63e42288d171860440a2060ab88d84ed028a96242894da553870177565303907230726044d5a411d5038ea8a814244fb624efa35885344f3e1121907093d9806ec64bd54541d19c222a67c834302a6e2399e425c9f8a8552b5dfe40d0fbc779029a95cc86f651baae0828ff2af88d48e97188494bfa599ad6297a27a08dfebdeada7991f16201594e66fb2de1caccf770bf8af4b255218ee4b25fcc8a5a0e4683f20c55292b43f17b344b850242957088dd53c6bb41e5bbf21602962cd06474877801f04c3fb3187b6c7da4507da652250f6ad6302d92233a8dc87acc3830dc04ff057c81b87f800a59afbb3dc32d66f83d238e0345a50b5ac32af88fc0a1bdffbd043f8feab8ae872af41311d4732d15f403aa20ddd55e7f2af48f9325b414427cc70163a8f7164b8e75f64b41d849496f7a2f034732c4a09b97bea1d0be3a60f871db76a0c0694f53ceee3cd2c50d906c4b5a5dd80a2ef39609698f5e37319d509e86159ffe3775bded746aa9424e967338ce7c09554634d9aacb04bba43c6e0a80c0ed427c212f66419d5441816f51ec31540f0d42b7bce19824830eb5c254a515231f54e7bc879862d4fd9e1295ab3c776c30c3b485c558122dad777542c572bb735d255e62b50a5f5bb6cd21c5a8748846401f20cc69f040d24d62a16c0e523232d1f683f3007c93a85fcc8150012b6c9795c75b34b642abb1d12c4ae4626147755f73ab443a0c8ac87f8986e05279c8319e9e2b22b5e7fe88e893bd35f25813a550e97b7955f634a562e72631e413d04b5c62c1cbdc2b6e2af9088d208c6cb5478fc17c5e86524a3eefc3062ac26d81a5004dd8068710e7c3409b9950c3b8c60e932c94b39ecd8dd9c2049b03b0f9c45ce7569d358e7d04f792af15d507296200167180860a3eac067138ac0f5dcf04a0ee97ab2a47585fdf74950585ea4a84c9a07bc541fdd83352ad8efde1b049c393481a7d5baf6f0248ac4fb055662adcc547493fcb368e4610c4defcd43f4aac3a780d9b3d8cb0d1077834f344b8d88d855ae06de8e27e28ac605581562be2c662f04a43a0e1837c4083abae48ed0c9bd7e81877da351bbb397f41ca66578bd72ad44c81be90cab8a18adc4b397fd8deccc2f94c116612bb20c955ab008eea87f14569bf261105c15785d89cb787ca85bc33fc15a5055dbbf173813b1237e944b6c9f2cec0283bbff1fabc8abf26b7bacb33904af163f4bfe7babb6b5d6eb20d5dacb84be1a874b5edc686b47abe4e5774c4fa081253eb09658d9edbd38d825b78c246b090b2f697ece4fc50901eaa405453a50b224c301c33f3f3f3f3f9fe2063c556c7cd8465a6dad1d4223564a2949e34199ae68446f4a29a594525251d41d247b0ca000e0c2304a60c1da1c041c0429041f8b6ceede649279ef804549bcb6f98ae22925740e9e55846675872bbef592177b97fdba71b91565d59e3bdf8c585112ee32348b3835e25945693c3ca3ce6e54510eb6399fba9f54144f33bd8acfdf818a924c261ab5f058d7d90b43c7294affde71f2db5f725fa6289b54d334bd52a5485ffb86e9e82052146eb592f1dc79d5d8e9184531539988cc8f1145318a9cd0ac854c4728caeaa77b5de6de35a51da0d04f7487278a2e740e369e118314e8e844d1d3436727cff9f9cd6da0831385133972579f6859bf8f8d195f80d49011322223069bb0f4e737347b3fd6ce84bd14995c299990bea4424472dc684d945e694625ee5ce7120e330222233bd09189f28ea86fb5db94d2b46606c8888c193744ec441e13c5d2fd2193ade7f2a8775ca29834097ffdaafb427f69896254a7dd2add65d8cd55a2f0bbabec73e707ef0e250a5a6fbfdfd4b53efd2a0f3a26518cc235cdca934ba2ac4664ce6ae5cf94a93b225152b2be7cc5f931e88044597c5ad32f72c7233a1c911f8d48469cbb49dd2b9d356647ef58c47a77f745756c37d13b14711f89b80f4444d1a5c62c847c30ad4fd4435c2ea6deb1bb5ef2eda95af6aa1d8628e7fa8936550f66214ae7aa9332252fb37a3921ca42b9e93e99327876c5d03188a2adee341e649641eb2c085796cc53215d5b881d812867bb51ea6406fd49972ae80044b7a73a6d16f5e159cf8e3fe4ff5b23fbf3a92ea677f8a1f01bf5e585d4ab647a791f4aaf36bdaadfa85b6e121f8a9db5ee78909d3d94659451ea75897a7b13510fe59439856f526ac43c143f6c6adf502a443ca8b32ed3772877cca7d3986ba1db528876287a9cbf8fc9904d22c43a14439f29f57ade9db414910e65fd36befb3acfa812e21cca6dab5f46ed7e76ad842887626a3d52489956ea9fbf230e2579591b29d38cbe17321c4aeefd416f0e327e749df88692b7187f7fcf2cc333e886f2a867db9bb98ed031d88692bce6f317d925b2a1183bb96fd23a4b5c434979f8dc682eec504369c38eeca9d3b1bdeb90be1a366a8088c8d8331441471a8adbf63aa24af4f5be888672f729f51afe85672866efd6f6fe4e2b644ca219f62c3e6ba97b65c632943733e5add041fdb81439759081d1416ae9bee118cc6afa5c8eac10d5273194dc468f792a0c25b1af7beeb9a7f5cbc1507e5d19ef57aabf890f7ea1a0637ad3e95bec37d55e286c8e36d3a7a5c9d769171acf6c11cd1791737f534d4ac72c855c288f479b4f1f73d0da188fd1b185628e3a5e4625562a7468a17cae5e07a95b3bf47c225928bb563d2d19dc0e2c14b43839a74c657cf1130a1d5728aa10524a2d43fc87ceb015cae1b429ff8f7ad37aba091d6314644e7dcdcf5a1d55282b1d42af5252bc55e8a042f1366746d17b390d6bc7140aaabb5d76bed72984df2185b21e61a3a39697b3bb45013ba050d6a85fc3ed5e8756a5276087138ab99d61f3eec7186c57fbe3a8559b903ef50145c378e139eec490504232099444e95d3c9cb80a25912807bdda525c0b2dfd539028c6dca73a5afd09219a47dc25f7d9f13aab3ab77b6a5d1d5589230a72fce7d59b1a0749234a1fa478d90da6a4a99d29614471d55e94bcee8cd9d3b421594431dbc6e9ef4da974ec217d207a279028a2d839abf7d56f49228a522b15d339780b3b2fa44f86887b21414449f557443f56386e6009248728e75731595a4a9d1d9054c3a0406288921e295aff7dbadd6f92429477b3ce9f5fa813be9990be942121442f63ce0fdb5d489f6410f7211144b185d633bda1a4d9229004420208fcc3f5625e7a6ef388c40f05d92d2942bebd0799d58792549d614ae9d32332c58782eb70217b7ab487723ef7a03553ae9887f4504c6a320ad7429e66cde4a1243dc455943413397a3c14fb7dcda5fcefd0417d87a252f70d3acb551a566c87c2ceeb1c5f7ad6ca73b80ec50d366b6b3a7428d62b4d2a94eba4fedf391844662987c2aa277d1c4a3ace463fe91f0ee5dcfa50ef293d3448de5050adba4553a37f6b9dc40dbcda9f767f966df68d51cf96a8b94cd286c2760a3befd2d896516c70d46c7c0d25d7e23de8cea354ca560dc59c426ced68694ad25032dd9cdbc5b349d1af0612349483e7534dea635ea1b6e40c651763a352c59fba939198a1704a6678deeef90449194ad24468b9fae77338213214743e9d7aadfd19e3918c81021231145726a1bd46cc068f0a4359860d9dc3690991ef0243598cfae86a1f4b76167da1a8b3eed78e9d9944375e28be10cae59bb89b3199ec42b93734e75cafbe55f75c2828fb382ba6cb2d94544b7e9469adb52d770b245a284997ef2b326925aa855928eaa0a3d27b3a58289a9aae5079a3ecf3bf4251b647f896bd798a55628572140faaa74e7bcdc78863947674968ab90ae54d9373e3a2cc2148a8509442b6ad6e8792299474b49bfa11711f84ceeb402285f2b950aa59bd6e949a2814bd359cc768aeee1d824279cbdd94c6cf330e244f28af149e2dde4b22489c507079429a2cadafe2c36a0349130a9eae39a5890fbae74b98501a21d44895a7a93d4f1d86640945595aca18b2347e569e4409c5ec36d1a3e9c15f7c100ccc8124094595b13535a40c266423414259c364b6d3254f6e52f9402286a75a36a6b6737fb64108b9af5da99223dcc74a8c500e3aaf273d67abf6b4244528dd6aaebd98094f5e4a885014a6fa468bed9531638650fe9cbda6eea95afc4608c59cb3542dfffd209463e6d341cba8396ad402a1b451e598f8c8243f306c8acf496ede3e28fde77a99bbd377f2b0a407e5f49959c7de98bf533f20e141512af59ca9a93a54ad243b7834773d53ebe573b56354b747d131e3340a3b20d141516ac8b0e283243928afd4a87327214c4918c5f3a0faf5375ef4af70503259adf2e4a7cf3d557283fb409d45e9937cf99fef75c8a2e02fa6fa641a7bf203b1aef69ce9b69c97d9bb86d05f2175ccc80410a513a6ba457a7d07559afca1b8616e4ea7d9277e28c7ec2d4df6a7f0fef0a40f0533b9ee2a5fdc89924df850d2d983e752bbad3338d94341fc9a47232b30d1435128ff3df1f49bc32787c86d6092875bd34979cfa7b987f4211e8ae9b7940c1a57630cf20f4cee504ea59961bbd474cc70062676287accd5429febcd756b485f63605287626aa1b3d427611bc54884d903133aa835e5ef0a7f2993cc640e1339601c7602079dbca138273f5247ceb7d27fe206c6d6f7c7cbeecccc95faba2e69522f3026f8f81089c1a40d451d4573b796f31e37880dc557a56cb64d385903aa01d3701f133494bd63da989b2ec5733f43f1cfa38a0fda4f7d4b99a1ecae5d869833195b779332a409194a42f8ad99bb9053392763b88f1c13311493fc0d7152a78efa9e4fc2701f60b88fc9178aaa66c3954ce3c40be5b457adc4e798348a69d2857250faa9af4b3f0ad370e19e1f39f3d84df7106f35e5aa85b406932d14847d08f33dadf65c9b68a170aeb9c43475da7f2a0b25ff18557d4e3a7ec4040ba5cfa75a6c54fa150a9b478d9a9149bd0e5f202656286e16cdab51698cf28a57ef54a5cb4e5e85c2472d546994269aeea242b17343d7adf76b68703285a2f234277516a289148a2966ab71327e6e31b2601285d28a766fad1e11feeb040a058fa56f7ccfcb6e9536264f28e88f8a5b21fab3eee484d2ebbddb3da90de91b09f942060e5e93261434081d5d7d8c3e52d34c2809619e6adcb56ab284928eefbf291badb57c2594fe3366d9307392843d77ff65be476e73cc9d20a13c9e7ff3c9584d515d8cf28b8914559f3c958c1ea1243469696ff2f495c7264628a6d359c7fb6774a1e345287e8ebad633d7b89c9c08e5549a459c84c9108a5ae76234dc0865323fc64408853dd7a7a395ecd5d4c59804a1206365b4f3e09900a1604aab9f8a4ef59847931f947b746430273e289d863ea9f5b3aa7a560f8ae5f532d596d4b14fc383e2c67b78902edf4141f4c9d951efaa5386273ab80f124c7290e88ffa29a760128609263828c1e406390b3024b2c858c0a2e4ef9b32c7f64368e615e516afa936bf7145b15e7f6adc7b9bd1f25614ed4f759dde7271bf5951da1ce66aecd75c852ab22a5f7ebb23f2221fab9fd9b5b04f5a96a8a29c2fe346c8f4f5119124152553b67af34971bf61a2a2a4c546273945b14eac68fb714d518cf9a23e868b334b51d49dc48ad02eb47bbe24a428baa688079d26630cee0241328aa21e57ea7352a94c511433287b356e5adf097586a2b0f14ecfeb333d9080a2f8224c96cc5eda5294f98982c7fcf143d43ed5aeb9124f184fa611d9a8dc24483a511e25da4e8cd9124e1447db37c9d71ad3490d7313457952a7cc8c1f6aa2a8d3490fea6f4469ab42fa24994096d65ad79a422498287d761de6d183ea9ce412c69fcdc2456689be34caa82bd50a53032460809b415289122332505dd4f8428688011e20d2859a71cc480e1a0878000044d402410004b470405a17765d241a7634a0c33eb23f6e01684424078e016c3183d3c501b41811c94102016ca1be3039bea86166180000223814ca916ce0b8c105084464dc3007d8420a5a6ca145178a000a682122723e0400003362d2c700b6302326d9c0f151002d02a0002e70289017203322020282002db648400112c4001e57b841c30a05f01823658ccc08113120205c785461063710154694080d4583001e5328dbae745342273db79e144a1ffc93a84b6514caaad24443d1681a8a06148a3a5bbad635831b8886a2c134148df57842ca180143467242ca18493668e40001e1c2a309e596d713b19339299d87b4e3e5c0a3a170808021238124a46e88fc8dd490912235648ce0503364dca06103f579a1029011783021658ce00811990102c285c7128ac23feed898dc140322f80003f60ce1a18464d44b6476b6b6d7bb34ae88dbab1213ab47128ae5e1597cce6d010f2494f5b7f81d29b6fef3490f314ae234f4dca8d4ebeeaa61668840251b5e787a1ca118b7518b16afde4ac828e06104efb5fe33dd3754d7fff42842d9b3474f2fb4c7ecdd8fcce002333c8850daf0df3ade26ef1c9542fa968c109117b96103c424e03184e209f5a39a3f3c9f543af610c269beb559fadf677fa3b341b396ddf0084251b70eb2e95b3f7ac73c8050d2d6d0585a8971935a481fc80c8379038f1f9493565a57bf14eaf66f489fd6f0f0413188b8cdccbac36675521e3d286d3e53a244bb6ba9421133c3051e3c28fd0ba567478a71f16cdc488f1d94673e3be6245260bc870e8aaaa74cc8d1f9426aa98423046178e4a09c7467c8ce61a010291478c1238c726b2d6472adfab48b1bd2221e382887921eb253c8d339bfd40cf5b8415189d06651d0f1daa326d46aa9cccaa2b041d86faefd50424a13c72416c5955a9fd9f9dc8345593b9b7ff8cd3f331d1b235e7c7cdca919e7c8a8317905bb625b515cb97711112fcda3101726ac38b65c3d546c4e5fe4d4d4c76a2d44bea86ae0dfa081343059456143a7f7f06abb37674d5451142955641aa566e24d935414ccef9390afd9e7e53b98a0224f91a6c05214c4f967b78c0d29ecdf99ff7914c52873526d25d67f3d19a81acb811a1cf802870241220e35226305135194b314324cdcc7d25c3a139884a23842bfd2cc2450149528d34c1f85d2d2519f28c928e5e7d61fe589f2ae896ccd6dd130a54e1456469de6557d36d79a1365ed35ad54d8b689c26f46e9a2758bc04413e578ad4f56a9d5d4a49c64a22843657bd02a7e7cd0608289e2adcbdacf9f13318a044a69c0d4303440945a934b9485bfad06b9d17f9eb5766289a26e7c9d2273e4c8fc9538bf508d1fa3d40d29911af5c97d448df074121349948366dc8bb63412dac967c89fdbbc79aaaba7720289e2a64c5a698dcac9234af33da33da4bdd6197444396613aef5b3cc514d376904beb79ba299aee9aef533ee84117792f25a4c6f4ee245b8f5e2a1a63d325cb88589228a4968d4f2b5b41251fafe20f46bd323a27c2a668556db1ea2685ababdeddda630d110c5f4ae3d37d3e624362f44ca6f746c1d4243c1841045cf27fb656d8cabcee30da2185e9972ad1ba1b39f8920eccd9b474db61e854da8b3e75196a4308ca220640822c6b6d301d31248201034228e040302914c91347d0713c0008be2c0682012098481904818ca7110c5301002310c02210c44610862da49a51ec70c400b078580973522c803f7d41b4a44c444a31d4e83393a13b9412818dd25cef907c107062aae8d7a97bf1e49b73482c6a9a569a54de86f5e350d4dba7566104adf4a68f135690b2cb9a5c157d9ab8f11d6601be49a344e8c50cb72c48ac1263e162360ef526f3801eb8ab3fcad636722cd15809df8c343775881ac64c61ff53c85df4ddb32d576a00b6e971d7bf1081649ba2cd13ca27711490e8828e37464a7ac3ed854fc9050fd90393c3277b34ac629a7df709519b521b30446d3fbea201a990d77a44dc0ef3754eb2a2bc64a65ea9c004b39ab986b7a5c1dd55b63e4216df6132f6abd3eb819c8d1de0209177418b33eb80261df67aed72189af51f4ad68e83ff970d0644e0643159e2c3270ec704f39e538673ebf05d038a65f763b95bfca1c0d406792dbdd84aca96da02c5f75363772103b58c6ddbc70095f70ae1bfc60b398f468479daee91409915a803633254be43286e4af23426c97e4c342a669a8a5cadb24a4e40adfb90ddd6f2143e5f52f5a2096628f4404186bf0a07551ccd1c11ad6bd25633564d105881ca6e444f6137db1ba354abb700eacb96e01708f8d2dd7285e0081df95de7b1c4f4df565a10893a8a018f32ba40b0ff341305737f6608681d42d088aa1bb80c6ebe38ddac4c2b75477250867be7128bef5efdc787521342c3ad2abc4fcf87384e3f2c62de4c4eefc6b559fdd1c1562855f25e0a846bf0d55a5bb4258fcc0d6d81afce55135992b049b2edc76cbc838b5acd08bd21594359ba30b16a043667a77fde51c3c4d60f16ca929dc3bc9843b05c8c0d14145d91959fdccef8ea7142754b8c80e667475542e6e48f8d5f7e71853372450ff08135d71c59f69e98adf496e35c836ae8c49fcee0c11f3c5eda59d6d04b84a57af36ab5baf5947f7f2448a2fdc59b49826e53e7ae11ec425becacbc03f6505cd1904861f8be054274fb9862502dd7d65a6db8712c1758082ca3443429af16f004855f52282679f96736befbd140360ba144b4f13d4d693f2b8f97080ac51f742032383c04527921aaad5cff0d60cccf44a4e345d2cfe7b51bed2e5e6a8359ba3491cf6d2405b895c3c4ba7ad6dd9dcf65df271b62c0dca739cf775962923ff54e879a26aa6648946448bb8ad3f066dc16100e0214507cd0a4309e939c77f06d10b28f95204227196664c76001cebbe56c8384085aa54d6c0522fc0902aea72fc2cdb43817d7e0c5e7715bac4e0231752b80bd366a42aeb84d7749344b3e59c005839a444c42dd23fa0b03f4f544dc681c85069e639f669b50a8327846931425c0fe62c7f854acef830e6329da9c3214376aa3ae36bf2f6405b982530318b95b5395a1250d48841f5a5ee4e41029c95e45b052f745c0741dab02e67fa83e8a1bb02d119c85a740d9f3d3d0d5fcf792450f24bb719a171e4cd4bd6a7e24c48f26946ebde7513534173dc16b94889e53a715f3eeeca031133a9afa00319125b00cef7254b21afab09f89617d0db965b7949615afc2fd33bb5c709fa2644313cab639f421710080d3ac2ffc061482b9b1a8c3da6f3de7c94794aeb8684e0aa43e0e8adc43ca1880638a4ee0e358f2108124a0e60caf3ab0ec1122a43b3a3796ac904dd8d484e39bd43b4d06d02bf1f3bc47dd28e7ea79fe4d797cc2a1cc5d88d4892792f7c218cdec2c3f465de480fd5315cd6561ec3a181c310c15b160ba0ddc04a2d3396a868f6c158d27b42375a83a19c1025b0dc039ffb60b9007d2ae1790568cc5d8024379072c0ac262f83af0e19c3a9397c84565a1db44c1127186583b3dcb956aea205f1b54504126ef0174f1b4747c462894832accbd0eb2bf3a862a74be40e63778dd8558a9e25a3ce3a067111af9271c6fe511d9fa228d0b4f69d9346ad52ac03e55007681754494cbb98f40ba85da35c99d77153adaea21cf16250911e403e69241eaa75d991a57b768b28d41203344cbfe622317b04cafd4514b987c6c47f2c8fc48a6d6ec7bda93ecb852edf11c5d46717b160591f83bbd4e762e7acae99a5348e916baf59450876720b23dd2d9afe805d8175869dec1087319d5202a12e2270e4da01f1a517269b82512f322c2502be4085f60022d7412b9ac48d6c843eb1403907e7568570c04d8a64a6d8c3c8d4308b3f3400e2af059e6b5ca454d8b019340007d55c9a0850240df6ba12153cb13f8837bd01a1d5c0d0791bf02673c3657894a1c602c080cd2d54b847e82b8ae15e663bcfde8c76f6887b978b2f3be75cb564e72d407788847d5706f48fddd05ad0238459cc8779acfd1646943371df6cddb0ea06914cb00c429803dcd1523bb0ed8071cdfe5d760a1c619d0990955443b93553d4eb716cdf1f849d3ff0d46608544106a6ad98f6cac303e2333910a1fe9f19512d7f721e9c2f3cc9bf699cb7df42d05fd9deed7fb1380a825b3c057b8a1445ea19315c777262572a9dab202a1721e1df3c34586176368d633525c83cef02d353a7bfecd1411a5bbf096d53c725f499f9eae6b91e13344919cc539c7ae357a4f9b5918e16e0dce69f3dacae147b26a0e0c3be84b41335b32bc1a1346cd32d0abd7aca2f3fe6dbd9caa2061bd377a1769f81f10d6855c2b9142f0beca3a3bc542509659f38b007cd2b4a64764832dd9bd2ba99d52534880cffd5f2e2de69b21ab13a20ffe7a9b739258a049843c2dcc1320798d2209cef2a068657aa7b0210626d2dfc5dac5ed26b7a39ede0b995c755cf37771c4cef2ee3fb46860d402ffc43d65a61792a76c03f6d90cded4ba0a8d3a7ac9d9fc244e648a3332b741d4c2ae7ffe3646529bf86727c26606e49e2fcd0ded683ab78b8be5361f377909f0027036e2af997b1311a20e89efd9e53b6a861b5d4beaa1a70f66bc857765791c7e719d5dc9eb266c880340e49d398eaa881ad1606b956a3e19d7f64744ae664f017973569ae9051d8c8ff242d596ec0966681896d77e1ac99d52920f517d5c7d831738a23d7ca5a0fab6ae0bf2b3a9045e1ccd17cb3be8ef767e08bc2c82343a19803d1dc34637bb8b98155ed26af6c0e025a5f5159b616222edc216e4ab105af66a488c685ae205b4798ae6243f806c84bd8504f8c7826f9c6bce84e0dafa189275fa26874c6ff57a0438e39db04f196daf7710be3a0070e96195f9b884a34a6195f1043d62820013b37f4e69b9df33b6f57f43e90677a8514fcf9ee03627ca9ed3a3cf7bcbe5d5185161f81ebef0fe8f7f7109ee6aae498ba859a809e2fc6f447ff551334746aaa86a04e672f43716158d4fce86d00bb32b18b032124679bef7a964e859f4349eef51829689c0868b4eb7f3b895debeae2aaba16978c197ce5b702a1f7560a453b0c6b2ea095317d40078a7cdf6915b03c12dcd46895350f61961d9c9ced0f2f6352bb078fce0a6c7f8f0a54a71ab511ab6f32823eee4999754263056493ec8c85212e90d836b92e95aa2c5071040e0fadc1a0a0af3e328a9d8be2491edc4f86020caa3a2154e23e1d8e221d3c5a6aaa72b390db03ef88ced16600d6565d5655b00d613181d944e749b654e21c5910f119e52672807207b9c98512e99f4ad5210c29a0afae6d501affcb782bec9c3b5860dd2f51aa7fb401519735c18a2e48aab613cad802e719d139465585070631d55519e48030a48f1614f3702ff4a8b5d641820cc073035dd6bd5cd6182854ba1a27144968a3ce24d23eda69b486446857dcd3473b73d64f3c00649c163f23198a13fef740bbfae284ffd68a164752de008d138001a7f164046e78aa337ac2b19accdb3367e47a681909c86c8e3646d3fae1b79429d9a6c9a8e311bb52968d019ffcc1b583d1057a948a5d0922f81488b06155cba0dd64ef504c9755bfe4e500efed5b866001025e06cc76bbda03348e419cf060b56b34b9ec1db4eb52a985b477c03ca952855db8305782b1c1e27f16108ec3eda92b835813601520102aa960004e31bb5de1aceebcb993dbdc37dba05c0fd80ad6a81403d43a220986f92496989b685dc82ac0ab282200d10f8b07b7fee140ee1de3157de9a408b93e6b580c9598be1ffe4a803eac6fcd23915c47be0922c6d8566640dd911c105326880c032e7f5f25fa9f28736212d9c9a09d10bf95bb07b66c1fba2d87984022646ecb3e3461d8cc7c79b0be3277e76f0dcc4640a24459389edf1620b8e11106d8d9cb4e090e182fdb0b8746890a72cce88dd0563e06b03011df61e5561bb9df21f2aafc09a6bd83f2d5256bc4dfdafa063852673192a18f7eb4562aaa5691dec71d6718c6ff4d7fa2409165b845ce9356ba48f3d358171684461a8435d0350c3e81ed120f73e85fbdbc2f37d35c33cc445a94aa67a5d8f155b4bcb83ec23122840557dd897d2b2d435bd1e3f947e3235def2d004eeb86cb9852aab811eace22b7c8845d3e5c15ec1990308830c2b262e025561aa118ea3d0ad10bbfbf584bdc8613818a09cd3f65de434a07afafebd5e52379ee06744eca2388b3c0b0c886392a593bb7bb82dab92cc53b82c170d352ef495150b4da961d6c76d059dc0ba9cc41751e9c68f7ff91dc959b494a0b12ad219dbb6e5a5e2b6c8ae5588df7a9e65666ce4b6252e9fd24c9306a84331b6a474d62a4e86d31d68b96540a4115c682aa7d4dd79392f9bbbb39bb26471dcf8c39435b20243c4e83d7e6fb0c5a563971bca11e50474a442942c2e5217f4057ac604b746234994b2024282864a4c261e060859db2e8994868d390462237bb481de3dc9e2f972c7d71b66585146f4bd94d10524106994465ce742588b70b632083c868f291a78a7b42258f1dfaa935b64c3dbc2e40ade16b1f9ffa2309e2fa34abd499830c227d62ba562991ad155dd9c5125ba870f9aa8d5036bbb13d729763a0a5586f36abc3371ca0d8305e68ba0f586ba5f4dec18882d1d9f41a06d0da1d5eb42396bcfe7ce448dd57191679a6828dc8edfc7d79445a7f169796dca3f1d915b57e31c7232a661d4d4a2ce7b3c26f8a37876d031f05e1ded4a4761df8ebfa4cbedbe1200953ba8a32f2f22dcc582dfdf5dbeb9cb4904a1bb4bb89dbcc64951b0139167b425c8c49b4fc63617f2f52e0ebe9ea3e59d4bd2aa5aeaf8171761ced56d9a07ebe21f0ee2acd0c398c3b25328d3d1263862ae49c8cec13dc2515b68ce3529be7c57f12633bdb26abdfc4c72796b11da172da996e282a745a8c86b1d7ca3984173a95d9a32cff16d60b61307a91a696d9832cab8350d36160c745d58493b0a8554c8221518e948d492dfd1a17b5d3e477e8aa5e62d1c014718964ce2b24085d9102b1b67605a0837fdb0c36e493d566ebb08fa73ae8affdac0bde53787bc3ee9497e8ff39f5e240da303aba2a4a4bbe17a24ba510b1968d467d8d570cae9d9c618c36825ca2f99bd275402c9c4674d740729b03eefbc0f3f1d51068748b031efec255b0f3b81ec4e01ce4c28172c6a2fda733b2b3f046b0c2931011039d9890190207f2aff3bf2943027e83b808432b700d51aea313ac08009e31d92d40637c145ca27aa34ff04f6c1ba0577f30c4550a4b4a43fa47148c107a52a56c104a8924e52ef613f0f30ab96904a2256ef29663b344a3e5ac5a1c02724aa758219a4c67c30ab14c8393ccae0d587c1c4220b7c6df2ecd568e7e6b48d281b9fb55bb2e2b22", + "0x3a65787472696e7369635f696e646578": "0x00000000", + "0x3c311d57d4daf52904616cf69648081e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x3c311d57d4daf52904616cf69648081e5e0621c4869aa60c02be9adcc98a0d1d": "0x103a072cf16481e51f42c8032f54a90c60d0d1dbe48e0ebcf3bd25756ccaf0c6414a732a441d40f919ff1dfd850e758b55f92b89acfa2baabbb40cb2d287eb554f90cc433f516a1f13141c217a3a52b99701a6f8a7b369a38026f7b7acaef00030d0ffb2cf8fd9b4b160cd02ec808aa1b4607596112ada93f614830be608178d6b", + "0x3f1467a096bcd71a5b6a0c8155e208104e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x45323df7cc47150b3930e2666b0aa3134e7b9012096b41c4eb3aaf947f6ea429": "0x0200", + "0x57f8dc2f5ab09467896f47300f0424384e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x57f8dc2f5ab09467896f47300f0424385e0621c4869aa60c02be9adcc98a0d1d": "0x103a072cf16481e51f42c8032f54a90c60d0d1dbe48e0ebcf3bd25756ccaf0c6414a732a441d40f919ff1dfd850e758b55f92b89acfa2baabbb40cb2d287eb554f90cc433f516a1f13141c217a3a52b99701a6f8a7b369a38026f7b7acaef00030d0ffb2cf8fd9b4b160cd02ec808aa1b4607596112ada93f614830be608178d6b", + "0x6dd12b3ae7975bb95f841f4505bc193c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x7474449cca95dc5d0c00e71735a6d17d4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", + "0x79e2fe5d327165001f8232643023ed8b4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x7b3237373ffdfeb1cab4222e3b520d6b4e7b9012096b41c4eb3aaf947f6ea429": "0x0300", + "0xb8753e9383841da95f7b8871e5de32694e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xc2261276cc9d1f8598ea4b6a74b15c2f4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", + "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x00000000000000000000000000000000", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3198f821b775e1d1ad0ffb2cf8fd9b4b160cd02ec808aa1b4607596112ada93f614830be608178d6b": "0xd0ffb2cf8fd9b4b160cd02ec808aa1b4607596112ada93f614830be608178d6b", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb368de3cfb46a4384a4a732a441d40f919ff1dfd850e758b55f92b89acfa2baabbb40cb2d287eb554f": "0x4a732a441d40f919ff1dfd850e758b55f92b89acfa2baabbb40cb2d287eb554f", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb39b7ed7da779c8f1890cc433f516a1f13141c217a3a52b99701a6f8a7b369a38026f7b7acaef00030": "0x90cc433f516a1f13141c217a3a52b99701a6f8a7b369a38026f7b7acaef00030", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3db6f1c35850476fe3a072cf16481e51f42c8032f54a90c60d0d1dbe48e0ebcf3bd25756ccaf0c641": "0x3a072cf16481e51f42c8032f54a90c60d0d1dbe48e0ebcf3bd25756ccaf0c641", + "0xcec5070d609dd3497f72bde07fc96ba04e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195026301997d60b83c06175726180d0ffb2cf8fd9b4b160cd02ec808aa1b4607596112ada93f614830be608178d6b": "0xd0ffb2cf8fd9b4b160cd02ec808aa1b4607596112ada93f614830be608178d6b", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19508c0b99136c0a741361757261804a732a441d40f919ff1dfd850e758b55f92b89acfa2baabbb40cb2d287eb554f": "0x4a732a441d40f919ff1dfd850e758b55f92b89acfa2baabbb40cb2d287eb554f", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950c23348a5e1bb080b617572618090cc433f516a1f13141c217a3a52b99701a6f8a7b369a38026f7b7acaef00030": "0x90cc433f516a1f13141c217a3a52b99701a6f8a7b369a38026f7b7acaef00030", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950e389fb0c07962e1061757261803a072cf16481e51f42c8032f54a90c60d0d1dbe48e0ebcf3bd25756ccaf0c641": "0x3a072cf16481e51f42c8032f54a90c60d0d1dbe48e0ebcf3bd25756ccaf0c641", + "0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903": "0x103a072cf16481e51f42c8032f54a90c60d0d1dbe48e0ebcf3bd25756ccaf0c6414a732a441d40f919ff1dfd850e758b55f92b89acfa2baabbb40cb2d287eb554f90cc433f516a1f13141c217a3a52b99701a6f8a7b369a38026f7b7acaef00030d0ffb2cf8fd9b4b160cd02ec808aa1b4607596112ada93f614830be608178d6b", + "0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x103a072cf16481e51f42c8032f54a90c60d0d1dbe48e0ebcf3bd25756ccaf0c6413a072cf16481e51f42c8032f54a90c60d0d1dbe48e0ebcf3bd25756ccaf0c6414a732a441d40f919ff1dfd850e758b55f92b89acfa2baabbb40cb2d287eb554f4a732a441d40f919ff1dfd850e758b55f92b89acfa2baabbb40cb2d287eb554f90cc433f516a1f13141c217a3a52b99701a6f8a7b369a38026f7b7acaef0003090cc433f516a1f13141c217a3a52b99701a6f8a7b369a38026f7b7acaef00030d0ffb2cf8fd9b4b160cd02ec808aa1b4607596112ada93f614830be608178d6bd0ffb2cf8fd9b4b160cd02ec808aa1b4607596112ada93f614830be608178d6b", + "0xd57bce545fb382c34570e5dfbf338f5e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xd5e1a2fa16732ce6906189438c0a82c64e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xe38f185207498abb5c213d0fb059b3d84e7b9012096b41c4eb3aaf947f6ea429": "0x0100", + "0xe38f185207498abb5c213d0fb059b3d86323ae84c43568be0d1394d5d0d522c4": "0x03000000", + "0xf0c365c3cf59d671eb72da0e7a4113c44e7b9012096b41c4eb3aaf947f6ea429": "0x0000" + }, + "childrenDefault": {} + } + } +} \ No newline at end of file diff --git a/cumulus/parachains/chain-specs/people-westend.json b/cumulus/parachains/chain-specs/people-westend.json new file mode 100644 index 00000000000..fa29853c70b --- /dev/null +++ b/cumulus/parachains/chain-specs/people-westend.json @@ -0,0 +1,82 @@ +{ + "name": "Westend People", + "id": "people-westend", + "chainType": "Live", + "bootNodes": [ + "/dns/westend-people-collator-node-0.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWDcLjDLTu9fNhmas9DTWtqdv8eUbFMWQzVwvXRK7QcjHD", + "/dns/westend-people-collator-node-0.parity-testnet.parity.io/tcp/443/wss/p2p/12D3KooWDcLjDLTu9fNhmas9DTWtqdv8eUbFMWQzVwvXRK7QcjHD", + "/dns/westend-people-collator-node-1.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWM56JbKWAXsDyWh313z73aKYVMp1Hj2nSnAKY3q6MnoC9", + "/dns/westend-people-collator-node-1.parity-testnet.parity.io/tcp/443/wss/p2p/12D3KooWM56JbKWAXsDyWh313z73aKYVMp1Hj2nSnAKY3q6MnoC9", + "/dns/westend-people-collator-node-2.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWGVYTVKW7tYe51JvetvGvVLDPXzqQX1mueJgz14FgkmHG", + "/dns/westend-people-collator-node-2.parity-testnet.parity.io/tcp/443/wss/p2p/12D3KooWGVYTVKW7tYe51JvetvGvVLDPXzqQX1mueJgz14FgkmHG", + "/dns/westend-people-collator-node-3.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWCF1eA2Gap69zgXD7Df3e9DqDUsGoByocggTGejoHjK23", + "/dns/westend-people-collator-node-3.parity-testnet.parity.io/tcp/443/wss/p2p/12D3KooWCF1eA2Gap69zgXD7Df3e9DqDUsGoByocggTGejoHjK23" + ], + "telemetryEndpoints": null, + "protocolId": null, + "properties": { + "ss58Format": 42, + "tokenDecimals": 12, + "tokenSymbol": "WND" + }, + "relay_chain": "westend", + "para_id": 1004, + "codeSubstitutes": {}, + "genesis": { + "raw": { + "top": { + "0x0d715f2646c8f85767b5d2764bb2782604a74d81251e398fd8a0a4d55023bb3f": "0xec030000", + "0x0d715f2646c8f85767b5d2764bb278264e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x15464cac3378d46f113cd5b7a4d71c84476f594316a7dfe49c1f352d95abdaf1": "0x00000000", + "0x15464cac3378d46f113cd5b7a4d71c844e7b9012096b41c4eb3aaf947f6ea429": "0x0100", + "0x15464cac3378d46f113cd5b7a4d71c845579297f4dfb9609e7e4c2ebab9ce40a": "0x100845a5993b29977c58c9ef36aad0e09946f8a10b2ad30956dec1207beda8014a6ea1de453086c8ecafdcb8c05c2ffc5b31dca333e27af61595e11a6dc88f744876aad3978bef6ce80e5b7bb80e9ae9e1fb23fa1133088fa9e0555d6d96f1151bf8465e78528188a1511df15027568a300d1319d346dc7ddde5bc33dc8c27fa5f", + "0x15464cac3378d46f113cd5b7a4d71c84579f5a43435b04a98d64da0cefe18505": "0x00a0acb9030000000000000000000000", + "0x26aa394eea5630e07c48ae0c9558cef734abf5cb34d6244378cddbf18e849d96": "0x0000000042e478677a0a0600", + "0x26aa394eea5630e07c48ae0c9558cef74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", + "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", + "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", + "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9446a2e9dc56d0fc437619542d91055bc76aad3978bef6ce80e5b7bb80e9ae9e1fb23fa1133088fa9e0555d6d96f1151b": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da94bb69671d3f9f0999498b683e73934d36ea1de453086c8ecafdcb8c05c2ffc5b31dca333e27af61595e11a6dc88f7448": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9d541fcf54011c18b8f8c5b4eca08a1290845a5993b29977c58c9ef36aad0e09946f8a10b2ad30956dec1207beda8014a": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f4caf657e712ee5527fb899d47951485f8465e78528188a1511df15027568a300d1319d346dc7ddde5bc33dc8c27fa5f": "0x0000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x59933870656f706c652d77657374656e64", + "0x2aeddc77fe58c98d50bd37f1b90840f94e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x3a63": "0x", + "0x3a636f6465": "0x52bc537646db8e0528b52ffd00582c95057e1687d115511068699374c0c0584cc28185ea3236b649401bcb6091468b5335a83460b397a2b8c2fa04c359796ed1f8e156844e030238c2d7b44a07717524217769c6f69236bedf078f0d7dd21a219b1042c8de5b6e191d18d9147e14bb892a10ecea3ed537da5549e2ab318696e8997dffb6236f4c6b755748372bd01bd3f3f2bbf1b03debee0dd86146b731fa3eb442e42ddaf1f93d8cc25eb5c43ce46962f47fad37c1e3d585f09bb0b9e802806fe289f79ae3f0853c4dd8d4938ec39b37f1e3f3fb0bf23431a4891eb7f9be06f234c1a39e787c34ba8dcc47f43c7ee2514f32416ef3138f6b1fbd09584fd775ae9eb85bf027584f577de2fd743de732dfbee7204f13593d6567feb4a9a77a0bc86b385bb7f9896f534f529eaba7ecdc4f369f6f22fea69e6868aea39ee0b17ac24ee74ff4b39e20fc699ef4198ebb564f523eab27584f3e9e9d83e77ed2ced5939cf9495ee734fcc49d867aa2a1f98e7ada71cb7a4e3dd1e47c87b5e334fc649d867acac160ce4f5890fa4469a69e66be63c749333b76d403c9b2e7f8c8b2996174870d0f19c8598c653ce03577c811951a5f363223bea8c5412eb3764ca9f1b0e171d1918ccc300c4eceda21a3713c30cd46c6e28bb311953ba0dc6103af1a02c04d1ed1791b6468c86aa861c666424c47e727be8e0ec683477d89bb5ed20210809fb2072000d4b246afd7d1b2ebc852e927fa520da56bb4837b7d006c641e80dbf0138fdba0a3f3d3bc0e0d3ab7e1274cd650c3a4af2fc91d2f710d35d410809fac07a09e6aa84106de061a68f0f193761fd8eb7572ee03080f1baef393cd754a25009c867a2a1d080dd7f9293b909fb81ae433336cf3fa1a7cf838909c9c93ee03c87dfc24731fd76bf80d3f8d7ec31b82731b7e1add8617e4406cf80d3ff138909faeeb947070ea71748ef3133dcefb691ee73490480792534f3eeac9c7819c9473d24fda49ef27791a5efa897be901a0869facd7504f00a8e1b59e00f09c9c977e82af3f61bfa19e02108007a927523d913e33739c7abab939a99e703e3373d24f3b4eaaa71bd26f7ed26acfeabc07b90d40341df7514f37f574731fd7b4d79fb2d77ad201e4f5a7598f589d771db7e1a7ac22b13aef36d45300ea134f679e867acab2d3d413cd270d9f3f613588594fd93c4e3d65d7b06b3fd1fac3eabce3fcb4a3f2b03aefa57aaa61c701504fb59eea69a00f524f40fe5a4f9b052a6428634c0cc0a0822a26aa04124891843274e1054d28c1d4047d8f4dbd56e79dd6d3eb79d45d9df71f75a1ce3ec787cd71ea8954f39b7a42fd20075af80246063430e307261b140c9678420ac448830c60aa30d9fc24536b56e7dda69e6aea421d1c6a57eafd6954b9d579ef512fa8b3e7f113ac45acce3b8f7ada519f78a626644e534fa3cfd42786989a80d7514f32a28fea09a5859639b46811071c5bf082092e14c4e4008b14c0200e31c8606a027ef4135789accefba89e4475a18e006a47a4f727ab0e599df7add6409dfd892b93d579d7ea69d6274aa626aa67f5b4030fba70e1067030414c0d4c587de2a6267e8421061d80f10427caa00553137ceba7ab9656e7ddaaa7aa2ed41152bb21bd3fc9fad5798f95833afb3d0a0ae9b09031f3bda069b8f46ab8f4b68041d300c5c65921af2e971e7d47b681de986d85f0b515c287344b77b1d9052dc46dca8954ef656fca0929bae31d78fe06b7de94135b960b333eee165f340d97b6462ef177037a635ad26b85f051aff76f096e534358625f5b449e8f6d916dbea46bc9685c5a2e7535fdfe7a535a84d1345c7a8ff4f5d2f85eca092a6f3033c32e101ec243086110888126b0747771c3de5413437ddee1c720dd0de72554aef4a69868a3bb51c3dbd09b62824bcfd10689bc83ea8e9fe4e7555292d8efb1df91181a1a1a6a8e1d121d1f2bd0cffb7667f5fba3f24617533e84ef7d3e0dbe7a318a1fd0f24ea735f368acb33970d55f9fb84d31b1456f8a89a1ee7e34bf00bda925ca68de7c6a9a5fa3f1ce753ec73bd5f934bcf95c55f5f9b4d7f36dd56745831e904fe4523c12aeabbf8d87edeabbf92c973aad9fac1daae575bd075eb48bddc507c1b6be9b8f7c0fcfb91bacdda9e12fdabdaf57b45b2e21d1d7bbe55277445fefaa2f97ba22fa7a0f84d4aa40a786afe8f6453b9c8e9f4fb3e87645b77753121b4a0a041b3ed2e5d2ab914befd68330982c21ad9ae9eb47bb10f4fbdcc72cea46d00fd2f7dd90c87eb1996ea3f82d991bd40504dca696e02200dcebaed44b4cd125dee1dfc03b0f0b192b64bb8735de19e2c4dc1ab8fdfb625f76bdf4ee7e83ac02e6ee70effbc5e6f2cedbd7fb395aded9e67757cf7783048b9715b23ddf6e301efe1d6e3eafee9341c2022f5cdae643ba5c82af79e3ef16eb72a987e1db7a4035f7f0ebc2dc66fe63ae8b7a0fc9dc6f90a51df7ae0d81f0efbdc7f03dfc203c4308e13b7cccbf9a2b29093f9e5f8d5cda73edf8b0fefc1d616e90ee06e0e6e6c02d97e0db8c20313434a44443de81efe212bf8721d5b8c42f00d7d134ff3dbebb9a3f6be6d36878875fc33baff938bc037de07bb887239df2a3a5a0ae7ebffa555292f7f8f758835ec31a5fed1ec3f7c898db1ba4e39a3f2fdee96e8060c1bd775af310ee5dc9fb0facf1514e6daced1679efe0974bdd6bf8fd8414070efe08acd764edd1d8da1689f2c43490d553748c26d41e85bd4da9b4303d45136d91286fa88114d0effcdd94c4a1b721e186fa5de39d6dfe6e48de50bff7f0d2205c7fb85e20287eccc69cbb32485890e2d2f67269bf9b4fe4d2be871787e70671ddd5f25c9596bf7867534a0cb5bcc63b8f674d1d4dcbcfd106e9def2cb3bf19dd6fb8b77e0f7cb3beffbc83bfc3dc73bdbfbdd90f0bbd7f1bb2189e7f7f00691f5e7bd4050ef3d25f6d980dbd41667f41b6af839da6f90ee0d357ff2f490ee764c777b7e0f5cba0de9ae90fd7cdad25702ee67bfddbda1eef67cee4d6da1837efdce5b9237d4b0766fa8f77337255cc7433a2576ac406f4cc32fed50bddf2dd2c59390641d2bd0a8e1178d1ed2dd8ee96ecfef814bb721dd15b29fac2d7d42e0de5fef0e60ff36a037fc6e405cc38ac3a5f71eeee11eeee11e5eba5cda6f10ae3f6fa817080a3e46633e33b8f7e5d27eb5b93cdcfb7e31204abc141636c880600112051014542ed437aa176a983a859a852aa66ea14a8192a1b651bb50a950d9a841a86554207ccbab50366a0b6819ea09ea50a542bfa84ad4256a139589ea442501bd41ad42dda039a054a056a06b5024d01a502fb409b40d3a05ca05aa020a037a054a0635027501c502adc2dba066d02f740974889e419340994095a04ab818a81c740c6a031a07f582724167407140b5a045a05ba814740c5d01edc2ad40e7f8156898977125dc8c27814ae15fcec5bbb81797e338b8109e83dbe0477819ae8387e143b813a7f22b6e023a84337133bc8967f1125022fc097a042a062d83864185702b07c3ada057d02d688afe805241a7a0601c8b6b71326816540b1d03e542bbd01750199c06d407f7f231aa14b4073505150587e359ea0a2a0b2e06ddc20f2e7e74f1e38a1f5bfc90c10f2d3facf8f1821f55fca0e2470c7e58f971821f28c839430e1c3959c8c1428e1b396de40c21c70a3955c8b9420e15728a9003849c24e44021c78c9c2f3963e43021878c1c25e42c21a74b0e1172bce41c21a7092422e4a491e3849c354856908090c306298c9c20e4080167091c2570864863485b20bd41d2028e13384de050c16102e7091c28705880b3029c2870548093029c2b3828c039018e0970ace09480e4060e169c1690ba40e2028e14a43390e620c9413203a90c243290e2208d8124065218487090c0405a83c406690924344851203981a406a909a433484c202981d4857404120f483d2071218941f201c90b120e48291215a42a4828209d8074856402d210c90a890912159212a414909620397163861b396ecaf0b83c22bc2d6ee2b819c30d186ec87043c68d116ec4b811c28d1736616e6070f3029b28dc547193e5868a1b2b6e627093c50d16a22a44508852204281880ad10a4432106921ca4294457485080b9115a228442d109940f402d11511165109442e10c5402485080622156c4ad892b07dd9cc109d40c40291159116d1145b0b362c1b0b6cd6b091820d1b9c623038080c04eec23f601f700f980bf38077c03ae02f38078c03f682b7f00dd806dc0573c135601a4c2f48276c5ad0830c92049996992f382d1c16333f98e141b6458d1830093a7e60c3021e4298b181c8063dae305a43870f7a983162a30716b6316436e871060909a4347a3441460d7e0276061e62729e40cab2430b3ca2d811051e28d8c1068f2b3bd69019820c117654610715765c61870f76fc60470f7674d9c16547183b523bb2209a0183d9d184466507133d98d0438e1d57dce4804920230599336cbef448428f2ee420618606354ad450c1e6a86183c60a4d097898c1030934506c2fa07982a6ca8c0f6a7e50e3032e06335d381acceca06607353ca8e9810d14b8197059c8d860c712d90d66b8643398e9c18c18150964a270b385bb018f20644b88bcb0d181b6042607060451171a1a5819b03832266ca8b0a962f405110e74a0a1a3093a989075a186891e5e90f142668b0c10647020c345e60b7a06991dc83441ae41ba42c609b405dc19354fa856b80c66caa070cc0461134346839a20d4e4a046079c153340e0aec8b4a80102a785c6852d8e193066749071c15191d5a0e68b9a2e355c38197059b22cb81a7036c0cc2083841e6ff40803e94b6c8188063966c89123678e9a35444cd4a8b19d81ab6867684ad096a031619be3668a1b176c637608618718a2219112dfa262a15e81dba2068c9c3244285437ea11a818382e7aa441bb9839028502f7053745b665b3e2e68a6c8aec053234e881049a2d6856a88982e605ad0b9a981e62b0b10157450f33e4a011e1f8a1452443dc42e442cd12365a645ebc316cd4d0aa10d5604a611a6116617a99644c24cc34e611269859c634434465be31b530b34043829c33781c212e31b1309383191cc84041e6093cbce4488107193c80d0230e1214484fe0be20a3841e637e64e1d185c717d20e3837b82d3f6a5073844c06d9173550c87e3089b04389cc0a992ee610b42d645864593220645db0276069f4643e58c0cd19322ab22b4855b21e645d645cb22a321e90ccb8197333c7468657841f33804a10e580c485cc17ac8b0c188c0c3dca2083460f2e686df41063b3a587164437e8f1051b2f7a80c1e6062412f43803690b4907181b189818060b427c824c1a373ac85c400386268d1e3ea05fd0a2c08308346190c9d2030e1e63c82c81060d6d06d5043953d0aaa021414a4103a3d140b445a2115910dbe801868d0b681699303c8ac0a971b30311173446c856602303192a64b6e011468d82460c3db2d00308978214430a829606090c8a058f21d40cf518c39ba099d1630b34269059838a1981790db435281874f440f3010d19326c9c0a3de6c8584083021e46b0d9c164424e987b815a71226849202581e6043db86454b62d28161e608cbc205385b6c58b20c3841b311c14b827d030f048f11043fb014f4107979f7123d0c0f1198cd29060280faea5871b3457445fc4347af4202a6183a51aa26a482dc82cc837241b39606ebe20c59060c82f640ee418d20c790499923d90489040905c6412a41749048903b9457a2187207d20bbc822c81fc832240fa41064102419320c6904a903f945eee0c60b928a64422e21958861885e886f442c442de4682166218e2146a1aa12a510d7886a4436221a114c2c4134c10f17c42bf1045105518a18454c41b472b3853874c345742232119b88546eba80568055806dc02bc0347ed0e0860b376f40336ebe60359805bc044e02138165f0e4602530137808ac0567c15a6e8ac050e0346e6ec056b8048c0286824d00e4047cc68d0dde1cef0c8f0cecc48d979b2e70149e78e089e195f18ef08cf0ae3c14bc133c243c133c2b493c322af06381a703278f8b224620822841bc2e5e0f240044048c40e0013f28f121490390f0c000050829bd2fcfcb0d3a031000016c9862cd315fef1b410163d8448a101b587284104d8a58b2643e480494264b96644284cc888188274e3eb001d24c18b6034e3800c588264142348932841427529a40697224c80c1c432c31820350903c7962c402828668f2e489110bb061060c4366bef0e48910433c7922c402bc50445007a0347922669b34e1c0122382960415d101274d40a033d38595f2c48910414d8858d2a409076a98e1c21ac101284e9684204a930f002d717244074169e2811008f1c367b6b04d868062049425422c7172443719028a110e0882f201238618a27dccbc418411433421e2c78c16564a089afc2c912225044d924031c28914294d224067b2b0207072444769f213c5080a28a13358d8254d3ed0e4030f008288261de8801040d830e3c64af919a24911435c61a504416912a54911509c7cc60a509c70803453851dc28914284ea20421d16449089e1c7184104ba23421e289930f987e8630e2890967a68d9572334385156209cecc14d6034b840812820821829af8203323051138792284932027509cec9809f381219a20d144c70c1b1bc5880568336bac94264e829c4431a288a00f0831331385856284932021a27c80882541463c91b2c4c9112d44940ff40e9924eccf10463cd9c09226414210e1e489105344fb9a3cd9801041503ec0812541433489e28408284e962cb1f965032b0c1958cee845cd4d0d0df543419bca3a83758677c4b3e28d65d560dddcdcd4c01b23dc8d92574e8ecc2ba5fcc11c1f8c9059c628a584b2c7ee5bb92c25438e52eebe27e54af97823ef9352c68d4f4ab9bbd2922c99e5be9572e54a182fde38ee0577595abb2c9777396617e4786190bbaeb9c1954c438c31ce186705b9c26294d5f536325b2c65dc1819ae8cbbcb9007091f4b8ed64aeb3d29656649b9bb5d2cba584609638c0c2f1b8e0ce5ae8c22de33b3b42c087368686868386e39ee8ee0f5e49bd742ec5d162f73bc38f24ab9bd1899a38c31eeae8819c6c8bb922186edc60bc26d83db06216318f3755df08231c22bb265c528e505a58c1bb661cccc33eec597059923af05e305dfbef71e335f2266666cad853cc21e3c1279f7b1e44a07ef6e662432030000cb1bdfeeaec5ccac6952c6b8cc524ab9555ce86313777775ec32336023330d7c3173906bb55d8656bce0052f8c732e1997779725b388777701f18794a68e3042f9a484114a1937eeca8dd9076fb1274e1ca90018593e8ca5dc6529659897392ec35df8de5ebcd735e1e6035e0ca3c591af0839666608f7e28849292f9a4b4aaed6358210328c31c2181380005e66ec452847d24624826b590b972db8cbd664660c423877987177a5e4dd95a944bbbc16bce2e315897a889e0e36bb221911ecb195e4dd2ac65de6b82be7f21599e32e47b91c2533afc58f254bc945a494707b528e300cc3468c3133c4a2bc38bec88c496bca7749c658c4a2c7fc83232f5b9121478e18efc695cb1b23b35cbede3b40aca9a9a9b1761f64e60b5e17c438462839486486917921b62c17eedb279779e5ca8d91f971e45d22b107c7c87057ee2edc27e332dcb7bb1c19c66586bc92619452ca85d77531bce0362f8871575555315ecc32420cf24a0b46e6dd85bb1b23efe3182f8c73969939b9cbcc115ed74ac9bc316e84f14129a365c117a184f149192333c708618c0c992f4cf2c818258feb8a314629adcb923cda0162001e23c82307203ce07b4f5a963592514a4bca5a0049002ae9b3e2b3dec8baa48c1b4bc9978cef4529d992721bc015e11525b46294bbb292114288c10861dc4b4a4c2425478ecccc5c31b46464b9bb97940c4409204cc099e5104431c2034d3c50653b8026539a3c598284101ef8316407d001239e2ce90014271de880114f6c64ae038926444071b2048a13218a1882031c30a2e2404493284d888862c4921d0310a0899328410128c093274e7e8608a00621a51b4a3b6ed851830d0108c01019229e3829628825414f3e2004079a10a193c38e0f248c004150ce8e0108f019020c6009019afc08f164034b3a00c54911528428e20400a21324449426509a74200a0dda12a08914294da21ce10123865812a5c91423866812658910528818a2c99201fcec188000470cd1440a0f0e079c1c6000063000018868b2c488a02342106508205184089252838c149b2f018c3022cacdcf10426ce0c91323a204a024449328372168f2b324088926507248414d3a60332325488a13249a5441430821058a105182960439f180078c28ed580238e140932847541d518468f26408920c11509a1c7184104b9a74408828460449793b000fe46c93265138b0248a1141420c61c49327429076004d3ce02408ca07a254221c08fa808f29509a401d3b8025508c7022254a93294b906852c49220284ea21cb16408294e3cb0240889263853a0348125ad0abc4242426f85f842090909092d2a5b212121a18d09ea612321a108511864262b1499a09e90100b4126a827846226420f2524042b262b8462262b8442c1893aa1221321a1c96451288c09eaa184509089d01312420909a15015934509a18484504f4888992c2a63827a8fc90a095d4c506f858450a888b298083dd45b268baa509209ea2d13d443a1183259140a858a4c16856226a8877a4c16f59820896bbcdd7d1e9022c406679deb4198e7629dab2369cc43c33ad7654a0b1cdde5d0f2a42df25a1ea3385cba0e57d0c3bf0e1fa6aff3dfdf769d64912ceb9bdae24a6f6a8b289a864bd72bfa1aab385cba2c2a57c87eb7b842f6f53e9464d8c57c3de7db7c328b6e979f931a4175a73db3bed6f71aedacc32dac745c219b11cadfa8758cbee65fd7377a1da3efaadd75519e7f135e136a1765adce4fa82dd5bedb914c7b36a37651fe6e47e6a6617f1b101254965062a8813a1098618e312d65bf6c210514bd97826aac76dad43a247afab0d50e899ed7b66a979b91ac9fbd07ae8f567f3223d9b7029dba839df5ac3fd7f9dd7561ef813d8c9a2f0a616e10172f85e3ee86b4d4d24677352d89f08e7c0ebc93d3728796e72ea5fca6a0cc8edb9d992b696a10a63905478ca9f3f0c3cf68eb97b72ef9b6aa4be1607744dad262a5bb05d3564d0fef74170fd6adefc03b3963b4f5e59d1fdd6d19cb25f91ec6994cad33de12dae2aee19d4dc9e00bbf85cbf10ebc751ade89b7ac6bbcc3b7be41acfab362f80cbba254e4d20f549a48628d26be5c69a2086bb4615aa8d3442b01075194e10619c6108669a10e7f5946e352aca5d2fb429e659d8eeb736f4a0b373a6a1d271ff943de180db5ee4a3bf04053a7f5a3d75a3255d5b824abd69bd2428d8e95864b6f53bd4050f2711c73495ee06870b6c86bbea6c51bcdafa181982cde90828b5c9291c23d2ef0ca69f824f37dc1f10d7a535dac68aea237e58325bad49bea010e90043121a63b5497aabb0fa48008bd1fbd2f3828466f4a0762fa8dd19bfa828bbea137958333de76244342980662d2fb2399182a1a4848d45dd014d6a8a9a2bba02daa9853e82ea8045390dd4949430736f8e04b7752b87ce9fd35341487867ac7f4fef51cbd97570046959668f4fb1c01bd8e9f91ca58bbf7b624f05c3b31ba743412ff5ad20e454a22d1e87889467752501d2f0fb463c68ca11daa597609421c4d9bb644a399fee8b71d79f3239db2e3d5204ef2e6c3c9406f8c849584e41dfec83bac41b3c3e0d241dcb276fc29afe1514d1b52da1c347b8f928fc7308bbca1ceb64891acf7bb3aecc3217eb445760e9eeabdaa078c315648fc167b75e801438cc5613bd68e6b27d453b83b10e5f53b46937153d336050696061af594ab7a3a6cc38ebbab8ee0dee7db8ce0f8ad193cc6db7c80e2d0d086895ca41a551bfb74786ea8d17b7ed9d3210ef57e5a1adc8cac1ad6755d57c5d705df755db2247aafce106999bd292da6681a9cb990e7005576e004136728c21c719888a032042666308517e6a881691fb9f422bf87abdabdab5f2b6522976a1704fb1d3b0def4c6b5a59563bcb3a3cc73bd9e1a7455fcfb71df1d1914bd8ad20d8d9e7e37d50f4b627dd2ef1ce0d1d4ebfc3e3f0ceab5d7579f809dfabe836462f0504c97e34cd48d0eeeabd56cac42d0897e0ad9f4b56e547dabd067afb8a06c1b7f96c9595e3126b346f1cde79c3dfb04560c3209d3d89c52e0f845bbb37d4307ee994d8fb489170bd8770bf68b001de901977c2bd77b1e338fea58514cdd7689cf4306423e6f28e3c8d5d6af9205c74ed4d610105165874c1420cd422edaaf3e3e6033cd708eb0ff758a5e5462dd21f7ebcdc7c60d81c0dd71f787e77c8120b127487d3b2665adaa3dcbbc5f7f0c2775ccbcb6b4f876d7958dfd38191442403e85d21efd00613c6ef18cd3e7c71c519cd87df22d9b1c7ad07f9f8b829e1c3473aa433f8ec6530d36076a85d837f9b91ec70d2f7ac837faf34b825e19ac4f5aa72e299ae27e1c43355d593a86e3d88eb495c415cb71e1f6cc11cca4c72fb4bc3bf6cfe54dd09eb5d6c56a4461ce0e4b3578f1f5de6afcabca24c5caf2ea9506692df2d62bdaa4299a9fa687fa8825d4afa4c18ed024801dda1da8a2d144ad6f31a4592f5141d6e46de7568efe8cf9379eddb59a350e6b7f7401db443b5ccfb68748e6adfad875747f5035c777168e85df41e9ea3b75911a6696f2acb15ae90a283f4a6ac1073451624d1b659dba54d4a9a224a9a9bdcb62dc9762ba874b525c97ea82a13573da14c5975c2fa33492d552cadcef7b4aca74adec2aa2a242b13a3ea27a1eb55ad7253f52a376155e8aa556e92d5892a0a30358132c9cb5b15cffa2301943c694621ee3a7148c84a9a97f2ef55d2941595a5a1fc6e3fc8ba50e712aaf85a632e12dca6ac84694ec920d5db97a603ef30ef301c5d2808133781ed423435db6b6a6cbe55db6b36aa7db2161ff6fd8c52dbc95b10a7244c2420d8c45920899b6b4f82fbcddf06c4cdb57a129d9374ceb75940f41d1fd124441f5d869e449739474fa273dfcd0233b7790fefa0a7d17f5ca327d13554cf679fac49fa9aa332df7e1ad9d413f7ed074de274dacebd9e4d3a6812a793b6a6113d9dfe9ccbd024e893f893c8f94928099cebf88e9f6a7ee2f113cdb97a120121bacc770b82fb4c3da14ca3f7f00d3d3dd3a84a6a0191bc4c4d82bb0c155edaa6374545989ebbf95897144ad6f2164592b5acc24ac33f2ae4b0b4dd2c6073996b74bb88266173d1adcd023332f524fa8eef16b1c049fb8f9f44d7f1dd8098f9564f36d744744d3a6812da67fe832631739befa0499cb4dbdca21daae51684f6999ac4f699cb0d089b8b5e434fdb67aa50123dfee3db2b6a019b8b6a12da479fbb05a1552666ae7d54853293cc372a9499b8dd22b276435a4b15d1b52a9499b4f365e8e81cdd9ee9d1eec8fbf5b84d80ab27ed5b7542f42eaafaf344de7a7599ef1699b51bd2d6b3dabdf3e17b188a7cf59898b94c3d3d13a92651ebe9e62799ff3846af6b948999ff780f7aaa798f5751461553f47c9509b2f49a71a5324196ae2e3b36155c7a95d08f08aeab8926b862454c156a54f146157264b192658a2c5c689aa4a4ab26c1bafaebac2d377adbb0dce8eab0b97743b26d20804a2a4ea18ba1ae6e75d553a4494a92bf284956245d1debab774382031a620cf586040154525d997145f41ff5f44c275a7f703ffd470e578570bedd4715c2e9c23af71d4bf4bb0cad7293cc49b4ca4dda475468f41dbfa942da77c854a1d147df3e434f28934d754254bb005240ff74fb70e83625c550bfcb6f3f530dad72d3e93a31313a55b94948fbf699f7a0271e5548d3bee327211ddf51abdc243a4dad72d34c15d251abdca45527642a130a30c95cfb569918759b8a228e7e3528f63bb6295925f4ab1ee0cce84e6ad9d24ff64b1f95a52f4dbbe8f10b791e6f6d13107d740ef23031baa85691a95d544799e2ab2aeb8f55258032716c123d0a71d7e90d0d71486c6a68a892e44577e226d1ab774774554952f4f78e49439e514d62bbf6f8ebe9f0eae736811f634ca2eddae1068476513d89ae89364da807ea628e072a88a3e1b32ad53253811b0d9fa900cc5c0cbca855d71e3725f0d9e3c6c307b87e8f06716d7d66bc1979437a00bd5b76d9a1fa5d979b92ecddeb9ff7eccaf8afcbce8772f301ea3625f0afcacd677e566f5904f4c6bcedd8b7f317f930c9524a79883d039536e9ebb9db91ec36df48516069f88cb44551a5e12f4dbb76613746b64da4bde7633422e51c0947caf1b1bd2ddbe663dba80f91dc7c1cf3211acd90483ef80c124947249dc749234e7b8fe6078ce3078944371948dadee3dbe746495cf00ee9f2939bf9b979f6213db319b97976b92581cf3e7568cc9a0f9c6d8b8244cbb9c61dc9e8d7b51ced1a573ba0d1467d5420a126fdd14ed3e86b1c12e93dec836e6b3ea4431cbaadb59ca44bd2f69a6f8f56d4c8fbf51e6843bbd737db6fa88d0dddaee94125162ec9f3a0100e2ec96374a3b43bb50ced4ead83762711ed4e300e1847cb4b2cbcc367b43c848377b0cbcf4acbe8f69c59252181ff79bcf5dd78a8b8e09dedf273dbb6f3f64745516c11059728bc4401260a377666556ebaf667afa7675acbed736adbf61e9e9a855d74eca2575d784774f9291289445936e2342d0a922c9bbf9e65d9afda4d8d8e3a394546b7b91e8944dbdfb7fab8e092fc4f33249210faeb6b1dfa29a5744defca48bda914183d59a3af8bea536aefbd87b34dc96e3e9b324196d6e957ab2e5c92e7cd07acb3da81801370fa361fed4248f4fbe9bb13379d7ea1131652bc3164a21f826a68418a21d32b15276efaafdac5f90ae8f5afeff6e0a3d8330a3f69874463dfcd875263efe12ca3b09353b47cd585bf70495e765acbb7a5a53c7f795be4fba225f76fcb3f2e9e805fc60d08fa1f6e40fca7fa57fa2ad50b4408a2485c8316ba9a867b2b5d1a3e6a47506d05c5c3da21e94e51a65caf6a507cf52e7627d4b24302e8475fdf4d89e4cd006b12d62957b5a8fcee5f16a01f320b97367545c333dc8c94a6a8010b00a4a0e14a102b40aad4867f5468c3bfa137fce947c32391d3f0413e1afe089c867f426af8226e1a9e089b866752d3f018e8d1f041f06878207634fc0f340ddfc34cc3f3a0a3e11920d3f03d5cc3ef306a7822a286cf616bf8215ac3df301bbe94357c10ace17f353c8ed5f03555c3d3c886e762c36bb0e12f23dcb09292bce6bfe6c74df5fbc20dc9fb7dca5774e5ab0e561d1f5eee29dc9294a6c87edf2d0936a651d6bbb20871d39b4a55691c1f3e3a74837770707070204e0ece27d47070dec31c979393f3f9348ee6e49c379f9c11158da8484c96a5e36fbebf9e0ed6fbf244f7f18982300d7f433b6ed2778b0ce9d16f805cc1913ea4bb477a0fef161940f367a6dd00b982ab3ea43beeebd99684f48e7b7bcd9fbb193940ef0ab950fc8a7646505d51543f4afa887637e7cf6c53c25dfdfa91aa5e15d58f5eb47b7fdf3e826f5c95b4f21c806d0e90af346df3117d44b739ba3d2f39a48ffbf0e1c387f4f1e33f7cdc878f1f3e7ce05c741c9168be2c6e68f79a749873d17344431ae71de9fc6a33024f7a8d73518d8d0f117cc387482412511f2caaa4243deee33deea3631f36373353347dc82b221f3ea60f1f746a3eeea39292d47cbee6f3138746898df31b124df5c5e8bbf9f0bacaa6cd47b7f9e87344e771e8d533db21ba0f29a81659605efb10d1edcd6726795dbd8771e8f63b46a237ef813774db865a677029be86565bb814df834a2bb43b7546bb5377d517a7e5f1d179d42b0e2ec58feacbc2a5b88332e1607716180b4cc75f71d050261c77577d517dd1f1d619bc23adcc5026dceb4e5ee9f86a0bef8c1e3fa11bbc23239365df92d4d0991bbc933d4e66f6929d379fec3c06efbc731cc77db71ee63e370318845af7b268ee70f3e1fee8b60cdd7e9b129de62a8fc1a5f889610f7bc4bef413d5d5a33d3c3f17035b5ac8d095389aa737752595ea9d2a2978a371be4cd13e7a532990a355e0a5717a532ae0a2a70ecdfadc39b5ddaeda9dfafaa31dd7ef9456b9896a8fd613bd50665a36c0757d4e8dd2353d1a5f5d0ffbd4340ce341ce8a92deb7514d4a72bdfa910bbed1f1efd5abdda9df51fd369f4783b8dfad4d89cefce8f3a32aad70693e7e5a5b921a7a6e9facbd0dc9fbf5b721a9feb6bfaa2e975e0de2d6de5d726c3ea2cfdd46b513ead12bda5d5dfdd18d4641b2fd3a121ddfbebc73d52e0a92eb3247c2fdfa56bbea3aea7269fbf28e4ced805e6fbf6ab75caace8da85681842abad16d11057a3de737baadcdf92d49a9672525c98e3dabd00d2ec563bfe92e393a3e9b8277b0fab2dc5c80ab7e810b5c807bfd637d3bdeba61c2fd5cdfeee01bece58609f71eaffa2cfa01ae83b8aeaa962a379df88b2c48b062c82414dd08e30562989208c109650a72120c313931c4d4c5bbb4c23bf00dde793d456f77504cb3978ee73280403780b0174e0090ee65d1f16f8bca63d4970527a03efe06c815dcc3d2dbddd5f1917748d5b554b9897e49550582a3e7e604d0c73f5af3707897f4666f78971b1299868f1b10f5f47003e2f4bcfd00a47250e7fd6d3fd47a419df7dd7ea075a1ce7b16513e580071bc2cbc831d562058702f4bc7eff58efd55ec8f5ed9eb81703b9b4fcba8d42015658faf7d379fac6ae1b8aa7e5dcfb28b3725a5cede33aabda256553da3b256d9a7f66b7b7648af6b74be075ef311db4fbabdc9ef45b47b41dc2c3f77aef6e8768c9292c063875806a8f5e2b776f2f3af6ae10ea9fcdc4dabdda9b58ca3556ee2be9c00ae9e84465f3640f6d3b201e03925a5eee18cee1f9dd7289fa36b1ad12eb4cf47b7dac57ed7e89551b919a9fe0e69f649aff7c0ec7a7c0fc4e8f645b7990671bf96e7cd47bea25d10cbf7b0047205f7b2f4f6cbd20b4488511a5750c8604b89773020850b3170b427f5a64ef0059b408ede21ab37658230bd9b8a5f7ea3018e7b5326f0d27b6eb275a65db468959b2ccdb2eac9ba100e68883164b2ac6da02b03a59e4f7b59ba206e98a48686d772bd8799eee623c188a34b0d4f1dcff4a2556ebab4abca4dd5abdac5045cf5745dc8fab20138cad1f19335a6fb8bae693725b0f9b102c13163c68ce90ed5f0165d3640b7292baa74107716a844a7617d5976f3e10a6409314a72c585b91a0adecc1582db94152e5af6a64af0a55766c26f906ebf347f420a451cb176a88e87b47bd00b0fe188f0ce1ee775819b0f57c33b5da9f9dd9021bcc3cd27c23c1f1a1a1a32f17b98e7263e0fbcd3c316813dc2e1be683e0defbc262d1b1d93decdc8aad1fb09b5b845d4e41452ab369f2b9656edc03c6b2a0195ea49b90c44b41f6d91adbb42e0b9055c37a48789b8d1fc216f343f07de79af77e8fd22db28e3c57a550882e9008e4ba3f928c0edd60054c758df63400f162e6009ec327951ab9db71e50fdb31548a8f71dff6d7d4180a28cde14145c4428861ac6f9b61e50bd5cea62a3baaa136e3e92b54a9ec623afab8b7748465e57afeaf6bba4af3748ac3f1c67311df0f328102dde5b237329a075ec39e20a1f65c5872719e1c3c3ea4ffe0756bf7887bbd2ba877b18f5def3329702dc1c41a146ec01f5eac5a5f8f839ea0148a8e3be8e750373194208cf8f11c2089b4c8dce0dd20d69f859bbabdf7b7fdf3f01c687e3ee701a3ee1052708ef7437dcc03bf1f0e79dade19777b6ee4a0d799675628c17effcf02f2ebdbf2ff344d681dfc7da5dbd5066b9b4ef622fef6cea892cbd8f3c6bdaefc646f8312eeff00faa7021c11b2468e301e105817b53b8f702ee3d177037ccc7024ed49b2281977e5fd1161d5ff1ec184343a6fd50cfefe728f24ef53d13bd9fbb45449f13a55d44778568b59b40dc4766edb8e7df35da09b5f65ad44911eaf9f8ecbb45b08b5688a876f3f0db31ba2b64ab9d76b8fd28903566cc983374bc463b9491d7f13d3ce976467f629df2ba3a12eeea704b12cfb543357f7bfe51b819a92efaa42424fdb623da7785bcf7c01ed628d01bd3d74594b41db18ed5ee35f68c76afb3cf8a76afab6f8f9b9278ed3d3c1703dca648c0a5e3abcf9daced7664fbac5dec0979cad5a28beadb90c4ae3ee76ea2daa15a748d4eb95afba4ddebf9dd225aedb43f29d2bb42e6e77be0a4f0f36993c2078f9b4fd5a507c6cde741115f1010fac04a2a9941700956956a91b9886aa97293cca7667d8e2a265459c21b3da126b3c429201696e2b5ac571a3e8857a53e2b5c82d9dfa57ca75dc2cbeb706fc9cbc8d1b73fd1e52105820577d520d89b458160c16dcdaa051f7bab3f57ddac775ab564571b92abfec0cbde2a5f879b12d9b03e282eb31e3632afda695d551c9579d50327d42a8de36a34ba2d437554e7a88eef6644a3af7554960ce5bed1a9f5758e46d6b93ee9db8c58bf3edf3e86224da31be9c53aef19a5343514874bef540f51515620d831422a04511b6f64c02e39638c3f5d7578a15859b543b515e327434b24f9c28e7d4eed96855998855918768dfe64d66659d835eb1ad6c35b96dde2b66bef46df30f98e65a6cc86d52e48b43137b377236b7ebb68ab9d3631acae55bb4af61b7195c612d4e800f4a696b0650959faa5a037a5042b3d471789bf6d7d7f5555843a65d95f95ea59bc88fe74d8e585baa28b55115ee19698d5c596f9155b7b503c1caad13391281389b2f7c08c760f0bfdd9befd68073b3b9765d547d94795a802418e7642fdf3be711fbdd371ee7afc320f8d7cec8220771abaacc3d54aa6067163d73919aece886a2705d5e9a841dc59159dbb4ced46a22a3b14da72e96d496667b5c3ae2a4fc32559851e8a63ab065f86aaca7232fdc2e5cb952f7234017a535fbc30a34e9bfcf65765e34d3210ec4d6e46506d7d76b715beaab6fd566d5bb56dd5b6dfaaee61f989b0abf75955b03abcb2d51b205a70ddf6fd6e72db3639eba65dbe63d1b7eaa7aadd9b0c47afce55a21a847da4d520d8b376a88cd68b46dbd8dac20c38cc28a3e728f283b893c045d7d09b4a4212c474017a5349e8d27367b4827855ac850de90fd0a9ad6f2fc73fab766ff7ddabcbaf361fcbc7fa6efb1a9977d5b99bbfbeccc3ddba0c5dd6b1b66b5cca2ed2e9e44775ab5a55836057efe4f917058205376b1077558f54f5a762ac5ebff86cd59ff7eaef95ac1a976647ae22963918bde82562919f8b69d9352d6279555a0e7198c7b57bdb76e4e6d923efc0ed2bdbfc8845db7c78f389670267de5de65d696ef4e6353c767ce6329f733ba41dd7a85306b347293238ba50bfc5798f1967e34ec9563beed1736ac78f76114bf3fbab5d501c75afbed11f73ed2ad449e84118b3e8ae7ad0cfbb5033b4aa6ff05b5d2ec529baabb2779ced95f52cab5dc4d2d583b8399bc93228a18492ffe04c36f38ec354d7957d9727cbb69a77178f77dc0ea823477c6859e74af2f1ead987401e263f6ef3f7a017914e53d271247ff14a94e2e9c0871b3396ce7e4347db91d1b9fef06f2e1a6567027572de5d4dfa320fe9b4fef53f6a7731fc8f0c6e70742dbbfc10c819ff47ed388ca807e457b7895e6e28fbb068115c9227c2f1e328c5911b3e0ed5fe68357f43b749b4fb4d8d57b8549d6708d491b7a9dd5553bbab47ed381eb5e344b5abd951bb1a9ada7da6766f1db52bb54ced4a1c675d1bf7de7b56fdb99e9d8b2cb02ac81dbbd15cab115f3bcb1ed59fedd633ed6559e68375add6ebe2b8ae86675787ffb86fb57b41b2af739584bdbaf52190a75e9e89843add82a1e1ddebbb1a20efb820a7a1be2b5047be7b90eb0252176e985a17ea7435dd6d98ce5efd26c6de2e7ac761daaa52f6f6eada56bb77c5fa76f9c882eca36b56ed82626761bafa959a1aaeb7d5e9aede6a17243b7bf57825b22062c9281322b8247f5169d5c8828743f570b870842ffdde9411c628e34a0fe94d1d214c1be18bb6a137e5050c385a6bf8ab8b195dda00bd2933a83412cee8526f0a095c3412dae8d9ef563a56d6cc2daae353d3bebca39d93f955bbd7cdfa2eda92647d6ddb11d1db9ed77b7f567867f37991462e5d9f9bcf9c7352d1e7bc2a773dcef7783dfe6417ea6bf9ba5e8f3ff8a0783ac4bf79bdbb6ac79d7d543b6eb6d2efd75523ffbd2bd61f7ef6eb9deceed5ee17edb8be2cd449687649f4fb0cea87a53bebf4e7ba50bfb82181ad0531df95ee82180876f77a386e4a785850f42e7bacddb3d2d6f99fa2fa2eab41dc93e63b1eebf5493bae41dc231fb2d7a3c657493d6e21b9fe945c7f0f8277e2e75f95a7c3fbac5dcdad8b465514dfadc72b7635158a440f6edb91eb3fb176efbadee1ec92d1d7832911ee0f87ee55e9ebd67644f4798bbef3a0da775099d350ee23eb3d5014049774cc5052f6f9edd175e87823289e0edd8bbc13fffeea84ad61b7de59bf01a20517c4add51fecd7e73bedf3cd374363d5f8ef6ff341c745f5514c472565b74e8160c105c17eef82608b6e5d0be21e69e7e87289bb0c8d5ce2ae5bdfe8726954bb55a3ad57db91f71f51dd2e37255abf573b29a8bebe5d7b10bcb3adfd41f174d8d61e371fcd4ad318b9543da31797aa6374b94484eb2292d9577d503c1cac6ae6e9f081972fbc64e1a58bbd5e5c50f5a6bc4411c6163148b5d1fbd99b0a4305586f2a8c27e22e84102e136f8ca98b8570853ce6dfd0fc9aa537f04e11fb20cd5f2fcdcd406ad83464050c2184f0828fbe216e535b64b146d3a49ed0345c82358be9849b10ee021d88ebad385ce2238441e509410228133f09f826602581024c7cae42fcfe0ab05fd10e20c61aba7be76e084a5e42bd54f8d2eb9246da9d3a5e422fc498ae3ab4665c89efb08635f477b3400dfd98c0c37382517c8c94547da954b94c5795cb647d692704040f99ae63d40922268b84e4656959abfa83f56d2038d355551568d4b26ab9be68f490f7c0bea84517ea74574be62b3c54445a259ae22105823345781292ac61051ab596f84563a10ef3ab020610fa30450ce0988703153c534c1df4eb37d4b0766f087e177ed17831988f04dc36c13d2ebd8536ec9902bdc6e1d2fbe9a11e2be0f5e4853cd63baeb2ea421df8853ad17a7578be7c4816c05e1d88ebd6755981c05ed55317f2583dd4815180a87ed5130775e0e321b0a61aa8232b9899d664bde31aaea9a26b8ab42b35ed2190e115f375ec9e640d1fcfbd9fb076f1b26aa91eb723db5aaadcd4053cdc92601d6bf743438835bfae1daa9340ef16d922db0c99a5b0610249798dd59f77ec39f8a23b8ef256887cd0d5403b467b967dcac75d75798ceee762205ecbc118ad4d4c6accf0dadf96443bf619b5b71db13e31aa3d6e49aebfbfba2be4755cb14fda3136e56a207886a1de5bb40b7aa8ea7116e60ac1c52c5d5a7a31c68394981451e91bddc9f7deabdebeeafb1e54f5be0ec23b32ca3ea84ab2a4f9157f1fd7dd1b5eede0fb817f315eb9b42098bc365ae2408eae0e3fa4e57a6989032fdd0d6959fa2108dee96a7ac891ddad1a2d5f82f16d0d4081018fc0bff7cd077e8ea0ab9f924842e812c28cf0e162b5e3ff5cb583df775555d5249abf7dde61867f554df2ce97c7e168525be4e88acae67867abcb39ce7086de6dccdeb0afe81bd3bb0ded0dfb1eae280f29d1ef0cc55c6eccd1b7ef696a78673e488977aacf8aa23aa3db2f8aea396776788d92ae63dfdee8f84c8d8ec73e1703f1dd80dbd4962e5d7d6ee1a2e3b7cf4bab68fc9ca857d14e1e1ec3a89c4f93f3adcdd1fc0f29897579cb1259492ecb1259f3fac4b26f635935721d3bf6238f55ed17a66159b52989cfea8f7c172f05d5d5e5a6241ed3fe532989b76a575dabd877625a454714b213bb0378262aa33bb13b80eacfd403359a55a013fc6844d794d1ed0e05049360f5677bf40122036e7b370f794b123f5fd56efbaca479eb5b25cd7a65b72e2bc9655d58edaacfcf9fecb376afbbeadab794d1f19376da49d897845523f2f3b36af3d867dd155281de18ec9fb5cbaed1f9ae5e5faf630edd0ebddf5f4af45e348488d04365ac3d319777761e81cc43253b952ee0274637c53c59831a4637ccd643dc94c035f194cb0d1b8042415f4a86ac1807f4f475b825e1515b9f4f8a3aa12bcc434f5fe7ed0894061242a2f58fb6786b00aa8abe8ca0b2341093be3e45a24e284b57bb3774d75f035060547fb72e2dbb6af7d634312da36bc2e89a7843c2af6ad609b50dac7475e6e8196e4ae261edae8670b954d50e6e4a2210ec1f78b96dd50fd474504d57755708fc797f8f9494a40b41f3b9e26aa80b38bac8e28b94d93f29b8a5b1374d344547efeeeeeeeeee7e7da25c5bd4d091778554d6ab7db645ac7a597fb7ea7bd64f7e21cf9af85c29c97a9f2999355b216c59f40d357f5708b3122d2b5703c761cc2705f73ee7be1c7091ab811cfdbe4166a4b5e59b8fb71eb4337dd7e80f1fe1bfbfb98f06dca6b8b0d2d9f90f0c2f9db5f639a1f6b623d7b1ffcc67d949db6e67cabd595adc1532ba3c53d147b4e3779c11bec8089f7b0fe42829095f74bea8525292acf95973bd592190ad33e459133cd3d145d6a6246bed375b045e6e4a482b045eab376fa8773bf286b4c8bc8739c82353e1a8765757ffe167eff8db030a8c2cebe119f9bc21e1673fa215023f5a2170a8e30a8150b838a4446fd8dceae8bb42b06d7411463bd8f3a2f9a0aa451b8d221a69efe19176d1a61da3ddeb79c3acd8b333ddde953256e5b854d5dab2d288d882c17c52d4200c2d05277b533510b32b84066608e1befae4d60e895ea66fe855146cdbb6699fdfb66ddbbe4136a632e79c73ce39bf41e61c188661d7ad63188661df2098182ccbb22ccbb2ba407963fa9abfdb0a911797e49ffcd237c4c596f2db16f1e12de2c6c4b6880fdc2239cc0d0167599f2378082184102e84d5b55488db540dbeb47cac2a7aa4b2ce5a8c4623d1b76b9f1f8d46a3911a73ceecd8af5b9f73ceb984b9bbbbbb6fd9d25688f54785b8eab2bbdab2ae6d11bef56d8b6c5b676ac1e50f995364033d36103785bbe3de67d6664a58d54e5bce848c745753397f44d6b342c93aa18ee78effe489a1658592f163edb25f59673548b5ecec336a5c7556974b5dec4ac22d835a2665e58743c5d899f2c3a1fa84af62fea66ac04936d55cbb1e6d2d19f94df5a66a30d41b46738d5caa2aecb21adea2dd13ada5943e117b12051389f51823b5e22decd879f3a9ae29afad48ad4fe6af90fdf1e17a75acc62b46dac53fecf37aefc55fefbdf72bf2aff7de2fc6f8e28bffb8a27144499129293e521e7aacbfc9da8b0cf4c64409d28e40c2a4af6b6fd1eefa8c87588d02b46286863a48475f873048eb4bc911198d02a480e615121f547586d128d983aa244b1afb0f2005f45b21316275f786f8cd887c5523bd2efa34fe8b12eb753d0b0e283fe1e7db247d639826fc9ca8be5ec7bf20856c1d72053aed21dd863402c1671d08c7fabcb8747d37239665d5e5d25521ede0a770fd240e29d1dd75204b0e25c6f4940bfb89e7cf5bf5a25a775dd57a771de8a2b284121d654ad5ef53ac96826aeb3dd0a2d52fbabdb4abb20af4e4e818c41d4f42f2523efc8a3eebd5994ee1ebdcf21750079f456fed1ffd79d5a290afdabdefad2381dd4941b591ed587f60fdd9f3fe1d0c7369fa0d7bbf3b5c1a32c74c82e38d0660fa42e6fb06e9b824b82dc262982324d7af5fd87eb12ff6ecbb34a31c764d797d5daf7e3eadba96bd9ed98734f6f7aecf4cabaa24d7671d617fdb8b8283af589d17edae63cf6a87eaec1d7b0fe43933ecbafa1da356b537f065dc1bd848ec8751c87b03bf6b000a8c7e7b03bf0128307af7063e962d469f0a38888463ba6d51215d511c2eed453bf9778b925e057a5d559c318686da86aec098f24a09b81ff91aba93dbdb4db6489421ad658f5a2bfc7db756958a13424cd5abcc98acf00e4d774f5a7e487734dd6d151eb0262ad55f15ae7b56aad0f1a73d0775c230050faae0c196304343a6ea6f5643b10627c062892b8060a2e28410d37b9519d39e8a136cb25e2501a6f78a564980e9d40510efa71fa04efcfb72ea0208eb553df5409d78ab9eba00a2faaba7439df8aa0e59a8934abd77fb65c5400232b46ce1093490c2128068e1d6845a411940a0828a30c0e0000ca635edbb21407c68c8f4acf04e0d1daf30472be68382833a3c66910e49161fa350c33f2a74ecaa78ab42a96a57fd09f4424ccb5abd83b53aa466a0a02bf94ea8bb7728ff0435455b50d68c2b2ddf89a02bab42d9365a5650104025d5b27ed9220838a02146ed90a081171a70d15a4e7ba1d1983163a630615a867c98400b29b244a121cb0dbc0c051db16db496211cd01063680a02a8a490185a33ae98f69d085a2eb16d98b03ab46d98f6dda965eddee1e2d06d6a8b363ae8b596211e6b78c1041686864c5b4f7b21285458918612720c0d99ae3a44a58b7fdd11fb48e1799b000e68843166023252584306676062cc18134d7731e57ef901882078c75a353a7ebe20a51b86747cc9a2dd1fc4a21b1fc4c3211e082ec5fff003e4f97e59b25f3e0427d36d988eefde90a1a8435d960898147104126f4882614ac9f1cef5fdb78885245e7e4a3ae5773b221f2fdf0aaacfc73ba3b69bcf4a198e4befd8abdaa15ad25049bb47a7bceea6bc8ef193f72d4791cc7edee1e10cea382b4a42b26df49ca4b91b12cb8d9e751f0e1db7acaeeaf142d13e1ce461a44fb48eefe11570ef355cdad37069ab57f5a73afcf636c73b437a8fd121fd8ca67a767d37a0ab715608c7a5bd45bf42b66e8d5c3b8d8b6798f21ba4bbc438c175572ac53bd6e3af317e79e19debf1dd5546c7cf2cb6340dbda92c9ee809b3909276808bf0d7af3152570ff257bdbc3c015c29c8735d619df878a536c0c95fa9eb0a97e29b70b29290f0d050c30b0d0df54fed76f494f8e54a929d038c96f5893c89876d795d76504ff174d88ed7e603cf3da1d644d42cda5d573a5e579e0edcf197144b74fc85857760c7cf07f9411153125f4b150598b0bf96f4b545497c92fca6ac7421c91a813561df54164af4a6b2186a24b0e561cb2a94852d221f7f7d813cf3f11718c8f34cf15718c8237afce5c6d3e17afcac4e920741190d8223b48892e49f894d9392647dc075279e69fecf24e90fda2fda8100095d3df684fc164651876ad20fd949d663c3263d603bc9aa3f6c95891d1307f6d8dcaf7b18b6469978a6594955051a8d692d55723061676274069313cf849dca353434945526ac3163c670ef26c4fbc32810de2f31bd40842a94648b8df93e1fea3d03ccfd5b02c648e5dfb3a4ac0e6f49296745719e1591a3908f3e406f4cc757152746fa3a323361be5f5be4d52c8ad0345c82bfb608fc66797385705d2e5df03d2fe07e4af8e0e175581d5687277255f0b03a84f012874b155311255d2953fd5527c5bfe626c518549756c5e15255e3b542f675a4bc84c98f5b8447ef718bbc0af4c6b05c218be2f798982b1fb748f5bddc222f072e492c3d04765a129a86c33cd9e577d8225f21d7e56fe01d8e4b171675b9d4ad1c71f48239a373582125fec275391c893abdfc859330c208454356c87ebe6a215b52e48339390bb7354e21471c60cef8620bbc02adbce1869731b2e02c72a80186cb17ef8a98273c049959b857e3dbb7f207737289a9e0f693196e8cfd6a77aa1142285a2d7383301510461212d9406f4c77aa1d231b81838f3be440c3b3a6f81b3ab611a63b229b7a411031c6f7e47bf2317310ccf2452eecf5447b565e309f941d8a779bdb9063bc88a5aa9846163c1cf6f28f6e8d57220b1e0e6f32968dfb6b2515738350e14bcad2a0a8a23ab033762d3e5689555b92aca3dc8e445ac325669ccb50ae87b63ea2a26fd47a56e035de81bf827855f873f3e17ab980cbeabcb4f968cd1c9ba1cb3ab3b93eeba9c1d5e623cf711545ec39e2ebfda1c169dd130d42291f1fab808b1d0e5ab7433f2b49fd612aeba1ecd03feffc2130057383f00e1f6e1a5c8743f383f04e6571acb3578d11c8ea4ba82bcb27ca75abeec3c1b2a2956989db69fd6012527df51c5552e368d862ae1acd0dbcf0c5045990f1851496307535cd5de0c296152c01c51263aa60e26f119a9977b69211bedad5e4c03bdcef4436d5dc11a13b225040811449b80109b878c3d471cd35f082186cc00326c8200a634c1a10638b3554f0250a5b82605a2970697e1c42b3147ad0fc0bf2c02fc8600c15c4784298284cbca9eee11ee6fa460cdcd59b92c2962e5decee89d6f02ca525a555c147f992c61f46ba0d97f9efc93fc951ca077df87ddfd673696fc5195368430a3e68498360c7c3aaaa64c532c6bab04a9c4f8394cf8f47e2eaeaccd5adae22641ab974ae8f6248214b0ba03715464ccfd191c773d18d8f9512096fbda8b35caa240775b77fa235bf43354b7e62a8408e827bfd7c78fdd880234c1661a460c38b4cf29ae60688165cd08e9ad790dee33c6e7e44e72ebaf6291abd735c9abbcd166c60e97369f89a35b6343c4e90861b92eda3da3dd1aa4d0977915649b322d151abe8a36b32df68a7e3fb06903ef31e9e9526a232dfcd01af49a2cb54205870a26af3619ebb8876412d7ab5f9a07d24f3ee6a914c25cd9cab1d49898ecb7c3ba823cd542432dcb7837a7451a7e395cce5c6c36bd239da719f1508161c579f682df39112d265ea0fe933f5c7e6dc13adb98f6827aa4fb426d5e552cd359bef6f68179bc7e196e49d3b6f486c6ae4524d7d8fba5ce2f1c8251eb593ddeb1d3b9e7d07ed843afb7c1b92d1b54f8dc2ce7ce8b86b4c5a04e3db7ce846e7aec1de51bb243ae3cc87d1b92aaa9d7c10ecac8b5cd23eaacb259a4a73799af77046696af73ad3b44cbb965d5efb45835e67d9390a8e94e435f7d7dc47f56756129237aa5dd6f361c2f40dbda9305ff4646d447fe6b14fde9064cd7d1ec3e8e4a8e81d63a34a639f23da05f5e8cb3b3a3ef3651e9c8f66aa8ccc8eae1d872eeb68db47d8ab8be894d7dce386849b3b76ac76f3dc456f53b2dc73e76abc19e1aae8232a738d765a6b871b92d1656a0fe428b7253a876454352e6d6f51fd997f9d569f683d2bf6e5daa25d4d6f0f3dd17aca43b2a3df6d5813c38c5f7a06a142413ef90b772408ed621e9bcfe6e1d603aae77c2f0b067847012d47cc224c17b144f9288f84fc49528912894c7bda332b345e89315a1b0fdbeff5c0688577ae846079b8a7445c0ef2c42cac231fb97027e0580d3041300f932db23c6f75b82f4645c60a8704ef60f3b23e043c2e8fc41699620bdee15f4a704fb4e4f1eea5a065f7b2cc772f8b8ec1d437766bf3014af29eb5c425eed6e7a3d9977748b366b57bfd361f1e580dc225ee136ada630d8a768570983684c4e90aa7bd7ac760ba8d83ab5a65c970d04acbfa5ab504f91015de01735d0c86c1301806c360be60208ccdcb7e2051559b0ffd7c599c110bd4c112b78025eedd452c60aad9042e1eeb4a6ef472cb13c4cbfeae7e3d8c5d9a1adcfe71f3a10fe2e9302f6f812d925dfe02bb635d067977f1d0f08e2b32f35d1e6b75b0cfdca2704bd827ddc5017bfcd1d869e8d1d8838c1a7bc647de31d33e33eed867655d406800725931cbb22cd60ec3fe33eb31e682b7eca81408652f5c92a7817219ac233fadeb0a2685152b114bc462a5e52316deb1ce13e4f2714be41253318bf845ec12b7885cb4b4b0c737e9eb8825628953c42cd913ed7d4a6cec40a3c66acda6843b56a7bcbecc7b98e68f0aef64977f55ac200179e210d491358e1f78e7d56efe71979fd84f7d5005a204d7c395c62a168d54b029b824b5982562611d797e82bbeee339d915dec1c23b399717943e6c0e4409ae5b2f4347825e73ff8955b8241ff43a52d9275bfef48618c02539578ae6b90b97e483504eb18edca279bc6330efcab3c225f98cbe2a43b50eb57c0ffc41bbd73f6645824b12fb4f3ace91380df1ce2fffa88cde5d3d7a7cb7c777f3c1790f531aa78859b8241f3724204f105047fee2b0fa1a7d3ce75dc4a204762478e7466e4a6c8ebdbab9fce90d6d916df96b4b62736ccaebac76da756cffa0db3994c3a1242a7f436d68d412e43d68c7f1a0dd93a2e577d04ea3a171b4fc0c8d62e9a03234e835577be0927c10508a6ac7f506a6e579803c41aa64ac76ef4add717d71252ebdf8e50703000cd5e7d27804e4e9f1eada17f2f0f8b4e941dfeac0f390d9d5e9b086645cf9d2dde392c282058eaefea6e01d0534192890a3cb185d69cb3b7b715c92e73ef368516e2052705d3d824bd52d1a342dfab66ac4fafb838f111e11f42785e5e1a04ef51a2cdc0b5d91a1abbfebb2209ca14b39c83304ea54afa9a9aa9935acf4f61763f52e8d06c74b07f9d2d5b3cd6efd3d296fa099999999a9535ed3d4dd8c482c0dff635d14e31b525a228ebbd3e5c2552e5cb8cc52432eda965e6a6aef4a0fe96e48774f8234694aec77a051bf77ee50c9f657a7bcb6441aa4dd152e554510c13bdbabcfaa6a82eb4a9a88be2e5caa3e04f2bc14eb547f4d0d57c1ea7c026efb7b61a874f52707efbcba7f6f3c387827be3a73c13bef87e59dadc6eeddbd303559703c4557d5bb1c302c6ca5ab6a4bf0bc676cc132469632b6d8331a56d7b68d480ed3b27603e2041785297a536a84e90474b5a9284861eade1b5d7d5e1ab46457d72b37baba361f5831b04f46c85b3ba17e337f61b6c87675a6b2bb3bfacba15fc5800edabdd6f1b75d54bb6464be292854a9debd305cd4e82226c53bdd7e19e38a17dee99e145dbd3a02ea54af9e14bca343070d97e439aa65c74734caab2ea241afb74ac4952320cfb53af0d51b5667027976d4bdaa63e0a23fc057df2055fde12d23ce31c37cdab9aea6b7e6cb3dff040924cb530375e695504aa3e7909eef560a3d2f31ddc2d1538eb5ac479f1047ef1bbda92758e9f9b62b46edd5c825eb536a16ed72f0b96a0e123e962b2b110949d5d7635fb5136a4bf399df4b862695461cddedd0f37287b933cf001e5e0379e2eabc6bb5d32eab7634dc5e757ee1ba9a9e6754efac797d8bd5cfe56ebdf0b04560cff7c03bf0f39a568d9f75391adeb9ded019e6f2dc0c8809430609be4031cd9f184c5def6a4afd525f600af2bc3658872b987acd7ba3f9184c355fa146cb7e61b8099cf6ee85c1ded958ef6448f0b1e50b0375361f180662b5abe1c234bf30d59f1b5be435d013136fbd7b5868ec310cef586737b64812ecf1baa571c982627a30d9caad9361822bbd6458f9a2bb379361a5caec7d8d4d3f997ec7e982f45e5b9e5dab7d2e1db8f8c7f16d6fc80f79386e64c8c6c3de166e5369b8d1d87f7dbe219b38fa7a27d361fdfe96a708a873fdfd7d3eec61b7ac211d9bb737a48b80dc3eec617fb72c2cc2ed15b145acf0cef6f587c5c9f210813ad7af77ef4a5f6f8a9417bcf4f56ec9d0d77e51c2624289d87cb08a0128a371e9ba240279ae9711e98b89bc31ecd37ab76ef4757e115b04f6f527bc03bf62fa2a69d17e9de6fa7907feba3e8477ac5fbf208f56af2f0e56af2e485f37f4f50d72d59f97a59a63ee2f300f8b14182f3d7dc03cb2803d7a53604c10e5a6c030515573583ab47089a280c53432192f535bfaace036850617346cd06f6adad2c7024eeb4da171853633ecb22a1921bfdd4451cb971f35abf3787a2e2c05a426480dce6b701ea4870706700909a35ac4092ee8c2124800042e0c1521872014a10c4aa8c218bc88821660c069a106b548cd6b706a204f0facc8b8124697242831460e52b05f9c30c51b54b420c11560a0841ab210079003f4f0b02906f0d4bc307051e2892f3c3187125db814fc404c1717f8c00827f842cb424a86484d4d4d0e438e5373419e203cd4bcc4a3378586959a2f570c667a79b4d579df8f9667c8dbff70bddba1c78ed11b243b6a0f88db1416b26899de941b5ff46e66e03aad9fc6f1ce8ef5f79aceaa43b8f4fe844813e1d2cb814b3210591f625122d67b873c1aebbcbfcf74b10115525faa5071c3c4419e0440a105490803054720030d9395ca420b7ad4560a0b4068abad9f7778da7a09f24493f521b57b42448b02a79558e75dd2201cd516f2d4b0ce7b2f03d70de93784085731bd6bcc7399de69986753cf7413066e0dd09b72021a0da437e5842fbaabe94eeb577f3665b12443c6eaf159471607567020050ea6c802325124c67f8b8f64e4f53bf78b405475594772f4e20d2fe0f0420e1c5081558469e6a85cb7e2eb4e6abdfdb6a8a5fa9aa2096707c0b7683390e6fb5803704d1c5cb703f30e3d15e370896bb8c4a78155fb4d18dc82f9610706f04e47a4076622cdef164cc3f36b20cf912d545667658d14abb353acce76e4212ebd0d1319ca31d4f0176f3e5c06379f9921398cb86ac8e693c30e5c82b3b7e6e9e0e35dd57b3d89f5765921f09dacb1591db2ef495b04fb1e678b5cdf13d9e17fcf0af3ecc03af035e4c009e968781dc23e9687db418a864f6686c719c0801d18b0430f03601c3b7abc382a4b66347a59e268781e3a74bc8777609e65808ec34f1f4e54694ee4c73b22dd00743adaf1361b6b1e2fb748cee3aba7838fc75fbc8343fa1f5fb3456e1e6bf764878e1fc225226ce440a4cbda58e71fb5fbd13914c90a81f7411bf07080c7a13d70099e447fe012fc2910acd33715032b04be86f2b042e0df18aee6d18b1435f4a576e0b123c61d766a1ebf5b5dfd86204f90439b3abf90879effd16be872a9c73b083db2e58dd5d906428f6c816375b62b3db2458ed5d99e94d2235e50599d6da65d4df7a01d0ff546a1e179d01db4bb9a860e619e8b0814b86d6b46874c5571f14597315e172ea5b834aa8f0b97e087b8f7ee71e189a61726d207864b3b0cd961072babb352acceb617537891c50dcdda7cacdc66ddaa3fa2c74ad34f0d2ec14945346ec9aa40d593c0f9c23c30eba5e17b00827730c0c30f4130d961871db664b1858b2d5f6ce9122feb9decfdf6949a7c27e316b1daa7ba455f6f34029d9a774b5ad552e5708863c0ddd0718cd5d932ae33b85d9e235b4abb63f9c41bba874bf071813af01cc765bd70592fd7e30279d6d4dd4b42432f0d5faa2117c8f3c05cd5b958ef7af016041cf33f3090e70d411df8abaa1dd7a3addaf5e8ee8169ebefe1693da36fe10ab17ed1b8422cb93ad6214e0b76b4f5adad77af4ac3f8baac533d2a435c826740dde1376170dd03d3f04f8da13678e70ddee98680e19d30bcd3bd2c6ef0ce13c33b1dfcd2dde3d2f043786708f21cf1a28cd5d9335667bb1a526375b617f21cf1a28dd5d9ee1e96c843fd78a817889044f9e0ca5b3a5e7b01179178736c116e781eaa1b079216a47a535410d31d5fe9f82726fe71895ca5230f757c7174acded5fca5d290eeae7ebd5cc22c2c8df2b93eb7cfad9278d8de7e647b3baa35dabdb543da31e1fa69e7ecbb41eb93a21ad220d999758c76ac465befaa7635cd30e02db8ee71897f5ca0e4c25bb03037c824c15ba7f25e7db7089bac4849f01c592742b62aeac465a242c5899b760bd0c9b4bc13434cbb03e8660c20ffc6c0452ec977352c044e26a0ca4d565dd62aba26a85d7f0c9f981ba45b31342b6b84f4d2e0630a8cdfd36c91f7fd8ee5deeac05f21f1158df4d2984609e21687d8afd2409e1dab139fc30f211ddfd5d0d0f11de76369204f09eac86befaef98eebecbb3bbba5ee47773f5a6ad97e757c09f2fc0075e4af593baebb52f603bcae2fb5dbd1f00b12da2c7a956685406e4bf017d5b6046fd16be396b604bf4f8c70cdcdcc15e8b4d56520b8247fe0928c0107cfbfb8d2622ecfc7020e0c1cbd4f63a8b70671ef0a29cd3d15eee631c16d8a0b6f3c2ddcfb07a0107942240c1422d0fac23845f60fbc06b518ad5fe7eaf15a9402677d317a75649ecbc4d79429b2abfa132febc5710916cc1bea36d5ad17540ec47cf144962ec4000106a68ee3dee9fd0f44204f34a1b428430a7e20032e84e1d2c5b4df0ef048881b1a1a52c2d4057ff9b2f2d727567ef03d2c11ae754d8b6b70f25b7a3ff1a5595256b177ab2a0909cb3a85198db95c5561a25c21fce2834788d1aaa4b42e2b462e55bb9521a394d6ad68494b6a518bb1bac2c719151770b451d15d21f0c917912023d75455256546238410c65891c19263ed628c70a74c4308e5254b2821e48dbb7079638c153db25d59307209725f1abef7c6d0e27bef3df9a2d630565a600577ad1d3ac65855b08a558c11aedc8d0b81c010468ea564b6688c114a1821841156affa62c7b02c2965aca28c31ca48c61c2d7ca4525ec77d62d627726bbcc371795f18ebe58c28adadde45f96e7445a3bcb6ac5f94e1e8f93448af14146a74c595e3527c8456d5b8142d4bca48a3bdea4549d351639dd8697d6b0718c0e6352dfbb65d1b7d9272b1aa16aef62c19c428235bd6b7c36929e5b32c29658c52ca28259dcb3b57ede275415945196394d10b8c5183bced25137fc5d81be37bef41186384ef6dac1d4da49d55bb68590be3930f46f8e07befbd171f64c2e3088f6299379acfcc3132f31b83991f4ff8f8bdc7f5d51f4ef22056ac71105cba1eaf488160313fadcd674aeefc47b16b9fd5e6a345f97759da26dfc355359f150379c697393ab23d27a49b8f76c616a8f126e5b551a6082e61e74b797e458160c1cd6bf3a9a4b5f5806a09792ed67918d5b4b8f9c80abba86d3ca337c504ae37c5842d3dc6db7c887072b076343356354d68a3377546aaa637c5042c4dd3bc5d5c42c595592e2dac91af57bd11243f34341424218410be43f898f911a6f16407992a6360f164073482387223e1a1a1a1a12006f39ef08448c30b06c146a2230b32a27842a48fc6fbe3f7becdef6f4a7cbc01720517bf0da34f8cf5c90e3255c6b8a21f8adf2bc15cded146ef45b8f9402e3d7eec84cc5e618f5a7d59e981965073876a291ff60c7b4a824012844bf1d60d1d6bb8147f511c2ec573a9e31f18ee7aa7753cc73ca7239cb8e941f10af01eaf9daaec819d50f3ab5f60b88d8f16bdb8344462818429ca88838c31465c6f47736dd7bed77827f2ab91bf9bf5f9ea463ee34dec4fd2e7040e6edb8f6e3f26703fd66577ef79dec1b2d1948f8eb0ef365f0d824b2fb6557ba0ac220a3f696a70788737ca33a27c7f4de86826d470fe98c03d4b1efe86213910e11dd161f7ba7b503c1cb28a2ac38deebec3cb08d3f0416ed82dab71f389572263bcfc46351ab92463d63dab64d52e8865ed568d0d02b787fd603e6d7947bea8558fbc237a553b28379f27695555957c15a82da8844a1405c2548f928e29443333c2008004631440304820140b87242249d3851f14000eadb64e549fc9c3200862c818638c2106c000000008008c0840027287c87f9613048de68563e7e7b7437c79fba550fa2ed3d3608e505284e2460d180c4d199d905e55a6e3bbe013a98ec4f2e352d1a66164e66db5b714b761efafc342903e27940bc1378c648d7dfb52907cd9a4fbcc5ee6bed43da76cdf14db3d85e3865fec30a53ba6f48efce615ff828132fb4fc9ecde9c422b8f50fae28446dc66f9ede696fcc3458ecda791958182dfb3febd17cc343ecaa6610a5b3f6bd62d2c801461d6b176428a8edf26a03abfaa148298a74a99b7356cb8f51dce8882b545e461646eab96676fea1e8e5c833e82a12f55d108f8088916fb38c8d6e5bcc1b4ef3f5b4a9a1c83a4a9e77806118e2f5251fe7de0007d8c06204b06f6165e2568cfc3901366a86cb36939eb75ae3f717afaf8a259bf8592b07216d2b9159bf6248c6826a12f99a13a65c1cd474722b2bf39d5ef0a06021d2122e826a03e6ef98abb94050a3604f136edbcef14ddb6377d92fb26921f6337d15450756a2fae4a5ba85630f4e80639fbd5ff8b9dfc765b016f83c606371790a81b1b6a9e0cbecabff333a17bd10e8dea7cfc752c685550b30082534cc92e11a4f5734cd77c0d85c9b2c4f25b049794d0cb772dce3c3ec596481f6d7bdb31302aff8795e88c972956ad75cb536c793cc5a7fa90d9c930ed42e21281afbc2ae5861b7fd7ff7e327cec4ae795182edba93c750b75169d8b888f69733dbf05aa7c9b65e1f88d26500a592bcbd612d9dbebffe1e2db42cbad6c5196d3156c2731f13bb2553b802bd19bdd8f8a3f3d0a056f553d5e295c905de0c6e379fba209375a458abedf72e806857f6ac1dc4d625f3e60cf99db90fbba6bd40a119f61d9dc84594e6068eaafb9f8d54b0d8a85372b5a8aaeede30a8d4f1225b052a740cbf22a378f7c737450d17c648519e385566cdc973255847119306c907a73d45ab209b4a6248115824181fdf37b9ca43d2fc06a7148ea6aaa21868c9fa7abeef8c65c94b3c3ac848fa762fa8a1275d78556c81d75aac781905076552cd597cf509b5c93a1b2c71d212418b5e3834dbc2edebd2124dad2758d0ac73c8bdf4af35a8b403aa75066f3ad6fa0b97b784a638cbf49309db666bf7f4fc12da24b9ea26bc844f31ece1a774ab63e0a050ef026257d519f933608d6fa2a7e446e54d8728711909f80497f4e9900bdd85180cbdfd0dca943f75616769c5e328e44a15070bacae0f937e54be526b11036a6c1e5171f6cce4a6f2f1133afb5d22305303d35295b51323290a5512ffd4e452efd56983ee8b1f9f26b1c2d668d9a562a2a50a635950e82835fc0d545579d2206a654e3c05742a6f4d2a9ee1e79857b3ba4c3f7614300dc3cafe42fc51c0c84fe65f780264e13b54d919a9be5af98ff3e9a10cebacd4fffb4c167e422fa923a97fa4033cb693ecf1b646c6877c291778fc9c5fb82bad661b0f2997652b68763aaafbaa0f7e9404411c51b2663ed1667c832b43d061f6d1c971f4e0cb2f0928f6f04423d62a7c21bf0eaa4b47aa8c0624216d81d53cbac59802d6ec196c000420495382c452092dfe80973edca78aca854e8199d615972ef8f9b45b5928642a1ac6ab8f5b6b7a6a118f13d6335d9ea979fa3ba88203c83ea618275c23dbf768bdb3aaa243cd80b95197c5606b8d5fbdb93301714a09326a31a194c623ca006400fb05e137a4dbdb7964bd8675c03786325e7ebb385866061cfc3a63de5008d2f26d660713637234fc9a98dc7cfbb0224b90b678f1f9884b6e01dc9324836caf01856df01275189e1100c0eafba2eb86a59838460158b1791f93081c8422721371e30452f92dc6a218a9040cf5d4834074b6b12facb7b861f4170f097dad305179ece7dc79d8557c21d1152d8dc2cfbc0154a0856a5c3a691ca1ca3736d49a9b67b258f20ecb138593d7f849490b53a462242eec0b1284a1cc0a7dc11ed6785e4cb72cf047e99c42924c78d85371a500868403d954291ecff3ec835e2fa8d5f5c8f3c541904b429cf2a193db54795aa96adfc4a864e178c60deed5890953444a89e29464e70501cb34e9bb478a6820cabef5194b51da62af04bbf7be7d435db924f0b599051a76a29c5d4ca363dc69daa2a658a4b3f8132468d82d63395758fec8ce9d23601ea556fc1b103b9a4edb86d69aa4077ca9f3c6661f971e3b298bf4f55895aa3f1fe34dd3ed8b1e93fbad4c633b0b76b5287303ee592aab454508d415c61abd949386315629c372f7e2e399b060ad3f97704121fdba4ac8d92a88eb4622ac72aec827cfe4f26520a6e41813b7217acfb39724ac5fafe127f16ae9d49c2557ca9666a7ef8774555a17efcf48b6d9fc949d902ac27dcc210939bec103445e3dfebedebcb2c4e948aab90446e8a700e80a64e28d221f9ce15c275af23983270d99c120220c30861ed105a31b65408889001a6f4362c5568a1cdd791c416d9aa0419c05832b1304b97e12ee1d7aa23ece7feca920f6aa04a62554eafbc25b10c4d228c07b27f4376ec4afb27b3a7b175121a912755723712323b557e6fb6f733aed200e38ef49ae1f6516a30bfde2f14f71676453550de682941552dd35aa577d2943f542ae60dec8170839910ba18aadf29672c21b3044a21f8e4c98e3a72b4ed48dafad46b7a6a5d69dfb4b68533d11585285fab843da11bab8d75800b9e85b2b67ad701432b443aa33f9eb4c273048dd0435e586aa8c037a5f691613edc404d0993d59132d46531f62d6c1ab5d6a59d38a14320fb33595d766d7b74c8ac5a1288e8a13a0293f0272674b0e9d9acd1c98e82b0c95f1cdf54941f0f370817a50806bab05e118f430a7773bbdf41bdd04edf5164c196c7864fb4823e7f4f964606ab37628eae39f7c2c27c7b0cb9da230bde1b8599e49ee35064c9716d17f1b89f80d42998ca1b9de653db92255c293a533adcfc5b69aad932e551b7aa8a8c5e456ad1aefd1bd8ea4b13cf273ac3c56a3507cef5cad85f4f5291aa79550f625f57036f5644799a9f4ee8fcf4a2925d957fc74c957f526d320c3c80a87630058dda416ff55e04f290ead1beda72ffe3f77b45d14bd535a12d0ed916fe026e91d9c4126eb28e552dcc0e97fb175e4c53643bf8865b4b620706db81b1a46c72de1ebdc87fc072e0d28c4ad5815d2619e63065d3f33281d5a3512cec577f4b6101e44da4700c8d745a5aef16b10013839a717af6b743057ada2fe6ec130dfee837ad6e62d2c8f7336f49a6fcd46351e0b2fb1408239267c8d205d0f89df47f33dbd0d99e969fc22ba0c7ef5b7c540c81f5931b5fcf08181e8459757251482d32264632109d15164d60d174396d558be5aafe24b4d65f21e1fa730ae31f9564184ab4e5b1419f37381b735015cad34db7f951d0567e41c0861052889bfe5c226157d8ef9ad8d920d6e3be56297a1a05d5710d7503df326a1baacaa557e0839720c10db6d269c91c8974deeb54db57b755752594b93acd1577693cbbdb88df0cf1b593d74f14c42f7d930e86b876e3b1359b4e4dcff27a4a354e2b617a2a8e0018e9500de18b3c98a88e8c2bb4e754ffeb05819394c63214c2d7f480bb4b82f50537af394a0bf63bbc035886f11d73b37f07d8031033031e070bf15d67f35905269e0336e7688f3a5ed516faf30c6c3679596718fb6d217e489ed78ad1034f160c22305668573d4e0947555d3937abb52167400247010b873630e13e425a1de400c6f04270c230e67416c1264f09613e6a50491244e6319934f11fbac884bac85f55aa7d356398e709159d5ab5127d7c66d9031fb73cfd7236c4059b780bc966e540bcc502cd1c9546003cefc009f2821e854e666e388b8480ab5dc1da90faf860b65c06d3199213c995106a40226a011f472974dfc43d3ee5b44561029929a0fa2c6b36d5df995e90224fb8b1aafe1d1986d306b351595742f955b5a6db6330fbda2940b96d34a037ce38a0ce9b66ce97de7f69b5e972307ba982d91e596af53cea70d8fd5859fe5033bc8f6701d2d0699dc8cc8428f6b4387d8a46c9884a7627d745915508a282e75b3cda5ae5ac4af1b892d30417f1800fc6f375955049108a915e0e40c6ea7b7611f8c295adfc2b717d41f66f1a38d1d624f776debcd9d839b66c358fc5142ca92415d3d367eaf20ac4569d601240c0789824c025615ba8e93a7076d86940b8a6974417ec52e92b30d14ea88ce5f9eccf674592f292b64d9e3fd102d28a5002c4681a114c2f895654aedc7902cffc3fc111e587fc1906a9ac72ed83bfd7c5043251b379a76981cd5dea657a5c6965d8ff63644d67bc1a1c10074fb12183cfe38e3b62c775721d917a97e158e10d5acf5db24226d2bb72078f1531056f165d86b87540d223c1e49ce25980bf2ad011c2848f456bc50bf731968d6c23f3bd04e23d6ab3ebe45d52413a8e9b6378f755f1cccce303b0dd070a57e947b060cd9312ebcec6bb20b624e671bb8290c83c2daee1938ecda6d9be61f33324e99501de6ab99634c60885fe5c68ea0284e8058a95fada4ff5d72bc4d6c304d4d00a1515009b8ba1cc2417e101a55522199e7990acf0b27b6b5b76f99cf1221ed15f061cd0022fc8925c90332dcd732708ba3d10447443bf07980471916e146c963f187aa51ce857a61fc12d912b7bdde9cb9278f163a1f41cae50a310136689373934019fbed6c9b7e150873c6c6dfa4a4adae037e1826426f9e942d566978367788e7d8356eb4bb05b707991e4f2d39ff113fe15bf4430e6d42f4ae8aa4b371ac5e263e760754d4f0e0ccd8089ec13586ed7f42dc2db1d1e0788087b673cff266e0c4a1dff4d168aae009bcde51ee222594fb4aa374d1c373bcf402c7ee658de07ded5d256d0430f406a8d6f1b2cabc75551388c181cc49acf44e3e239e8c9573a61ee68fa9659c12bfc20dd76fbd4e18079991abcce3cf658d69ffdc45e3fe8cff431439c65cdcb30f214a63bd008bff3e6c6becbdbfb84c6f745a5c8eca69b21dd57cad3e6e03dc27317998a6e5512f7230278d8b11fe382d2c2f252d9c2678453c9a7d718a0f0e054518f5502622aa5ab52ade7dc35ebd2f820fd62aa2ebb8a640ce953502b09209c9cbfc4b05170013f2b04c7d077d71a2dfc9f9dd7c17575059db23f734aca880181726cec887b9a60d4197d5da604bdb8abf728eedb9a4c77cee938ff90a19229ba8b69d22120dae67b1771df4917d02154e3fe2588f3856c123af717fdec2fa4e1f25190422433a7d64810677f65f8768505657d0a814997fe84eae013d391851b928828a8995608314b30fe46dc2ca96adbbd96b8bb282b4f12b9ae00b2357631f318cc33d23054dd78680ab0a5dceb75691664edd5f722c70e9acb4f215412425256b9fb0c9fee56d655bf440a36a85e51c1de73fd2f490ddb40bda95d7dfbcfc835ce25fbec321923280b72075e12e495e11d51fa19f7a6e6c7d23f2ba157462ebae863634be49430010ccc27a56da89e736cd88efbc0c3e1fdcf81217a96274f18b5146048bbbdd570c174ef142646d2aa593ea5190c1c6884623bb5a6346323e393a7ea6d84ffec6c4bb6816bd25429158b3c0b2aebb19c266d27425515c5e56d89f16c503ceac3054dbdf33f412f30364b67131d855d413eca9966d617c936940161f6022a9be7c46d43a00327b2b8f55ca04e7782b2ac8c84a52b63a7b4cd51dbc03424161c695ddcd9c9c9d22bb79f6860728ede10afa4be592115bb132ba688a2017e82b55c11a57a5eb44e2fe69fc33b93b3ceaad1674b302b5dcfa11292d763a4468fa0673d980ef4f597d8ce148556628378c3604e2f9dc6932004cfb09c51d9d0edb677534b871ff59a86d3cb3393d32b22689207da1383c5d6f3e6acbf73689d6afef135685dd88a391f1b621704c4d29ad7ffc5c15bc6a46a5f0b89f05d6029245a27f4e0c61b33f33b5e90cf25276e04b8e8d71c4a523edf77d7465022566dc98a6c409bdd4e40802acbc3dda25542c8c8b1a288943ccea8130b1db8dfb36b8d46689239f2cb6a41d2ee4b36e3f5e38924fd872efeb5fc5ad70eba86f0ec2fbb957fbb14990e0f97be33e52a1be620166522e808cdc165682e2132fc7c289d89b5d6885a8ce1411428259e879cf72ba6b77674f37b987ef040adbdca531dc2d6e4856b3427a45beeb31c3fda22849762e47571d6f31da97539b0cf7d7da4bfaeb849f073db248cd3bbd489378a0da781c29a07fa0be4ef96e305f1c56870fa9509209abb1e072b2e762d77fb937088e35e53a622bf94b95c43b9918e9b0c52ae2b12e92ff785b63b0d3994cdc193c1f126cd5936a46dd27c740b562ada718efb40f914bd191c63c93a8bcb8b517e019988f73d71880738051697cbf622561d1e66ebaf642f93784f3dbe46b98c73c46d9c63db767fdf95cac6b5533461d4d57115c739f10157a921d082058592a5f45b1cdd7bb471330c5b43bfc162bc7ab6a34376530db52d92b3c310618d18f108da31cfc13e8e258318d0afb351eed4eac3026539a7f7969dc7837ff23384fad76fde19bef9b95f19515e9d7d64d7bc2db28b6c157d502d99175397926f2716627d2f1dec888f62991c6b83f4c64b0cec417a015e1207e6495ddf0cd55270708d4f4d2bba047cca236a7790d78e103e5d2c655617915b49dce7361df221f2a66220aa47ea5b6222ad084a1aff1b069a6d39b7fd4bc16387ba01b7e90eb119232e491627757bbaf805137b67f384820e2ceb1284ed0f3a8c2915e719b6a9b9f5d037b501b1bc7b141f83e21c83ec645bfd46bb60ff49ed0f50443aab45013289e373205d1338292fcd19295a720f48e79162af57ddceacf2f3e09b500b17cfdff8bae9fa4944ab2b4001685e3e2efbf8f0a240040f82d9ed2d9c2b9d3b7b0074bf02e53022ed42b1f80796bb35a0fb863315ae7aa38cc362fd7f1c5ccdd91349603678601620afb4af25040a3a98fd3ee1a1952814a8abe90ac30dc0275df9617b48a1786414fe2e5b049d0eb3e334f8004c48cb47b6e4bc6d9f403a3608deb059700d5b04d1836d40d6d2f57a3d45c8023a01c61ad21f3ce7e5be9e6ffad109dbca6259d622b58850ce5ce41241445a8cf101f661163e6e6f604f83e13cd8772503b7ddf70f0fbd03adb1a21316b655388814f4ae36a30e4474e2c1b72738e99bdcd5b041aa0f8f51818070f42deb497d81f0cabb57a93d0d99a1feda57cacb58dfacbd8f9d26169578c73d6f64be37be534514f971e7574aa3c28059e98047734dda794875819e9f67b535ba9c6dd7f8c9710169fdb8dbd99db88053d1fd5627219219fe2cc816adf7238e522ba8983d1103487effb21e01248a8fe8202aecdece00707aefba439211086ffe1e9202d408d744ba4455ee596314b14148178f79f228310a81c527a7a31fdc4166cf3fc2bea975e51e5f5052ca02e981e75975dd3ec7cf0a9c62bce129ca6b463b4eed8f6a084bd14013eb70e2988df09b791be88dad78dae3e2bc6f2fb1cfacbd5136d9bd7d92e77f25efe9ac61c3b49a051e1902d99b6204e81b21daa397092e494d416cb3abf110cd13a962d21fa9d9239d1b899e454ea350a23ad4e26acdae67056889466a6d343c707b0ac5ad1379049ebd887bcc4755ed04e35c4ae777572332c1a7956d295262c376f07ab002fdeed0e6bf7f16d991165f7baa0b80bb7bfa71a28bf68db872db630bde03fa2db0de90cd4a3b7dbba3e8c3e000cebfd48726bb202cdfd83212409cdc11f3d0d9c08c0d1ef0e063e98ab74420d9c5c923988f137eb0acf2423f96084babbed05ff9258faab04af40901372317c8b2000b73054ea5db478c32becae2ad33f9339c9173386bc0215932cb50f3afe04c77c8c91371dbbc1664bb4f2288f7f89ab1921f5f0e360bc1601fd3931d5470cafca774abc80536092c865c5ede3c083058a847ba813f1e3b433d14d0cb7e7a59e15f09b2bcdbd11aed4e4b26881b8ad450f23b566152fe393d001b359605f6c27144e1154bf803073cd6618c0ed4a1b3d096213a6173e7bba09b71a38740ed907a2a8cddef183994998612c7f7fb97523ebcbab5486df33166f057c6e9022357256d7143f92edd529fe5fe1002359cf14c0b470a1f1821805d4d4c5d2043f64af550fe1146e48b3a11bddfd49c9d4a0ed364dbe8f354dc37b58d506b70bd4bcfb6e4e19cd98456492418e97355d50639864695fc2c8b9fe41a3920b812d40192e1239f312a6d3626625664ff481c46140ba71b66f85b8398477463e653d8a62ba2ee5224e05434bb5f9e45e1000dc1cbbac35d3c3c656a25888ad0fa59cdfcc2594d148d70e5a92cbf70a4dd9383271316ced44a31219f3da11c149a3442050aed96b91c0a655f6c127c6f463748f61faaa02ef06438db8215109aab481ab5f8ebc35b0035ffab6142587921190ac5e76a5c68c8b30f21be547aa112110a9a960de7b5de4bcf16dd92d87f893b202c7710e528f1a099d647d71e4445e6241e53a473865f863f1ad3b8a047c3d25d1936c710347a9270b432e984b6c9e50727f74413a76dab40d59196c916830c2badc0d8b016c1f72093122239bd2c5b23df6c38c296f312b9da7c3ed3caa0b769b97e044463c9442162ee6707631e83f010cdc30dcc7ae0990796261e38db02171ea2b52c65367dc82c88f1118dd8b1f509203ccbf18b4caab303b37e10a8774c2751c83aea69111b7450038f8d35c67bbd5b78a2bbdbffcbb3c77b9da27c74d213b80e66be677b5b931e252a0c8aa010e8c6499b0fe9c97d68d9a6a42c26a5c5575f3ab632a8dac9c236bb422fa97a8c6298ec1d4e94bdc223ab33410160e101064fd6a248065d166ecb3e182eaf289e3bae18cd73f38b3962e55bc638f34df6cbbdb3c01db93cea82a8a2774094add36cef8168bbdd89c2c18219ec5fc814d9937a486181780e5a7a076bae97b55e4a9df91cde2859ee7332d49cd90b7442ff6e6a9d2a976cee36209ead1b23d57cca183ea910070fc0b970bd93fff3b7e94d8afc6dd570cc6d912b25af7822678ece51ef54e4f21db503770bb96ed2adb89b1467131decf2c09b4f7467901c524d49fb88dd1cbc170198bb3211732528e2c7a386c5f6b496001592da563f33ce4438444f691e7b7647df53a478942bc6bd4aa799118f3131c37063cf50d13611ecb0df422c0fe8cc0ab01560ed9af86b082247933168620ed57ba296af90176b78bce15ce913161ab43a1bc0ec65a2c70c0f4220722acd8b8c82a9f970e84ec156525cc62eabf4a41552c80bde034fde5591a5f7a70b4448e5e8bf5ef2389a131d9e627a6e30b914c97f10ac819c78a2c0cceb4a1d7f5c8091315f2756cb9a9e3f9f83e4e0d33a63f39b0754a767bbf8af1531b503529277257c4b3eb7f3f2d2a057aeed008e6020c0d6d248fdccb2cae086eb6dca11e6d88bd6a5d16931e4fdc456152ed48e3a29ae47e3826652655fdc5ffd34d202e8d185827d9038fb2dca3f382670d3f1139707905bc788122c6596c523be876f6d2414d241c68025615271a05cc0b8f8e3c98d495b42dcef94502de8c07efaa785bda05a99592e945616bc0580ee6b4176a1c86b3050260c6d8f0f97325eca7aa3239e14b842421d481b113b73ea81f132b1b9e79348d38288d63e5a9aaa21c57ec0a535613b1c068225566970966c7866512f8ef1a63e90cd1f751e2b581597b5947852ca825e6dfcd417b682b08db2bd17114b9cf969db8d331aa3c45cfff8ab593c432662f87c6068847ba70022f913e62890b8dc121e9f9bbe568f7d00fce5362f4a421f18588378fee46a5fc70c6d8471fb55081223a1600b4c02a2ca7591e061c4ac45d1ab96ad53e6f9ac473ba66e6dfe51c728c794b6459500e9aa9b2ef922f0dc758a2fe4fac636f326a2345641c419d6af6c98b467edc4b12513d7af1de5dc382ec1746690cd1aa848b96130b640692969f273f185c9dda4303cd260329303296587042cc30e64964ead4bb01d4eceb04a0a71f44f5e61acb0fa8c88d0c9307efb1f5d5ccc306f578e7beab89861898bc63b0453561105a1c49a2382cba8fe179f786b53ecba47171257fda994c3921e43aa644da2591152a09b8bc31a494cb53c09f59b7ebd5f22eabb09bbc1b68ea7087c9720020130dad5da1dab70376c682b5cd3e8791ce490f5a01a0eb37fa23f36e1be3723d19010c022c757786a2489ce2d2097a0f17741b9db712da931e8aad48499c4da9a01b699ee23b7a1b7074d4658e062ea90fbe39a78af7fda11e49f465c202a1cec298000941d044e88d850c6a5a7933b8d1f887670b5f50c11561ec05af95a08426d0714425d666df9a4e3fca0b182b530168c224d0676abfeb86840f9b1a319236252cb244f01f7c7040c17f11a2e018ce38fb3f217bc5cc8657c980908e96b6303fa6015605ce598cb3784f47aa35d0bb12288d8b29f25bb024291a0aa2981774138a36382842b6c9971dcb3adf826e46895503b826411bc171c94c7f0b328076f1bc43e74c09d9b01cc405451221264f48a1310628b5763bc0ce0833f8cfb2eb6b6daff38fb57092d2e75f8e68cf9dfe672ed403168689f2e4b0f7f0f38c4eaac673dbb7d67d8d7de4f9bfe4fc2ee53478d89e440f8b86fcfbb0dae8926d8ba3c0763bb3ffee04e2ef88bb0128c47fb09ad9d8f581cc191cb0dc1acd7943ff6ab38755a1eeaab050ba67304210c42b1bc6c0f503b42b5bdceeed408946392e455985bc33eb4dd8c347d6fe9d7c49487f75ea201e7e2b1eedd65b5e77a6a71cd864e79190e9ad628340f293d603a2493774f8edd6a83638400fbd2b8fc9feb719326513485b50053b063382b084009aeedc576ff8f4272fcfbbd1f2351b2531db36c85ed457839bcde79d212b2e582d38b494a38659f6c9f11021f0d553163441d1a48972798ff3d1ae69f6da9368c9754f413b1c742b181949113f593ea3ff1fa5e8e718f1957aaf9194e5d8ea37889aac7a026a7e1818ada03d76cdaedfab84f63907329f9fab8ad093cfd4756e1f375dc775678d685b9ad9dbbb60ed768040cb5be05860a03b0d105037bed76b6e42460c9e5b9e0d890ca82c75f58b5eb56da9c0dff5c412dc5f744b36674902f562d4b2cd003b795f8e5fa800e843628ad90abbbdf8bee6122f512e824d9f9d2f1e90db2a918e59beccf01ffe0df8b1507c28dedd2a300a7d0c7f832f091a0c2eb21d00d9c65361e22fe792a2da70001ba7bc5a449029a622bbebc16500d69453e275b4519a5ffb1425dbb4259225760ff37c0a320922a0b9583c5be8b5cf84cc9effb86bb22e5187235181638a2a581bad728048ac38a846bf569188f0844d9bc5ab7885859cf32e3f689a81acb7214d4e7e6bd3de59b0cc6b55e33d45ecaab3ccdce32a4f0a0bf1eca9ea01533211a16e849ce976d34f0d46a643bd0bd7808a1a6c72d15a3ae1ac6a5c323f1320374b4be8e0e8219f4d8c283f10e15ac409ac4ccb175dc4a5e8606c09efb7b1eb83431f9a8705b87d14df1fad5b976b25bbd2e07a11a206b948b5d1380740134c61eaf411d0497a0465692caa7427f386f765b6a91a986624c23da8928a906d9aa6338f8c1711d32a3b5d9c42546e36258187ae7160343d0cc31d884da55bd1c5864197e7bce2fad8c1d1b56f4cbed2de4b931271e037f1f6b34e205154213884a908a4d90832518305b0f79caa5bb04fc32838267731e9be2bed6fb17f9c33899f091ae40ea3bb021a76253111493aff90ee720108b3007169acf680df55983ad82cb6a88a29b22cf778a176b65571285f0b6d5396368ca75059149cf08cc194c0398740d40f5005d54de53891f26c7c588932485a2e6ba51a0dfea7fec627476e63a5e2bc914190795ff283a70fc697eac719ed9fbfd8d6f5c6df14382672d687eb17c438b8ca1e902632a199abc660d06befb063755331668f46697e1b305f8babe9d489d1e962a5eb869eaeed4243633c3b5df314daa4567d64fc15a4d7ee2771d1ca3a1877e1d4f2f4c839aec10a20648658ecb53efd53cf97219219cb470a6356ebdee9c2ccbb720014f2bcbc19f73872605c3c44bb4119a812aad6bc3007da7541ebd04b74ed8fd014288f5a45be3386d5012d08247c77bd615363c1f9a54120e558857e6605bfea9ec0cd877900d17ed464173a9e97ecea6b4773f86b0ecfe102b45b09577544c1d509c9567872d04cbd64eeb08f61dad432770305c40a202bc069a439b9eab7348cdda91719f0e12fd8188bdf4afd6cce69325aadc9a4f7e9cc4b2c5df6a1ed58d7b6c20621756e3dbef11fb43efae94d65d0974a5e17f398ef99933f219a4625e2eb9fc44b472a19e9ac3fb017a40073ca9de64b23141b6454cdbe9056cb16323d4db6154dcd5b293829d9149b46f2c386569ac78b8d037dc2094f6be6c167b51dc9c7a27e3bdd1c05dbc022edc03778b686ba459ca5c854112453001527062072425a9c11b9124cdfa927fd2c66fe568db28c95f0be8ed381c420dc42990cdadd46a84c8dbc3ba285c363f56ab8d177f4745162e1baf8f387f9ecf690393b4e375bb48496030af86e902fb4c893c254570d9f4d21202949f4bf0d662cdbce12969390e26acff43c888888f6ac855d0f44160bb2f627ff614eb4ae5a8de991378d2cbe82339174dc20e1c768e13d80f892221041ab18a5fb9307d6dfb0b832d3ebd828b22bc493f23ea3193ee1b2810ae4c5f11afe20930064dad77150b652fe3d556413788b6940a2f0c639d483c440ba256f14186d7a091fa9575eaace358d440297860cf1435a7bdfb2041ab60256f13bbba5efc34ae8e80d86eb1d44f63d51f3612bb9d3f509bd2665dc5a9878d0138a5b5779d8f7d394ba2af1a84209336340f1aa9203042b3a210630095a86e28c124af20362a1fbd93e6b21e9899f0ecb9c9f4d610f0a924eae1d4f9f5b326228ee8e2611927596f28233445b4285adb2dab24ce1681204bc603a352a059d4fb6cf2f149ffc9655a48abc0c230ee6ac328803d51f963411ad9d7975ddb50810a957467a439f2913238327c2161b9af0000312600e8c1b4e47b4e642ea71c317d190de4bc7e33bec82f96bb8fb8d2cc89bce4fc92a1236efb8857ca02fec4ba5888864e11b719cc29355954f3b7cc428072916daa9980d2b2344924582a15145812e60b03efb3910be83e00b56c8c0479e7e52dac56a3eca68cb7afc2091fb36f05db992c17c267c1df30abfe52824d545f570fe29f80de5fc80c7ab45123fb3ceecca6999bd76789e877516904f69b2ee237c1dd86c786e70b0c062794a0128784a33a1413c5f19e10aa1458c8764d7b58f0d00a1b1e2cd600a1453ff0247e6879f200bb055cf06f144b55fb0107207924e18b193440a46980af6e298de572fb6a35449e24548abddd8f98f1584b3aff0ee1a284a24021a6f51328710fa4f7100bd39cdeb8068aa8b32a11debae07fd0f89407400f726ae03527c57064d0701ae815ac9db6990e2d5088805ea5f04ccbf426cc1d82816b19ed95e6d9421c06050dc061c7577624eb36b76b12bb496956aaf2a8242ce55214870f02c0648af77ced3339a896dfa814bd8ff207e3ac02b29bd0ac56aba56a44586fe2ae8791eaca54330c0804fefb792c4cd2e5423d0d9a8bab05fa3f706415895b02f17b3d55c8b753b362393be673c4ba19b278b9ea5bc7b10a7f497407837026fc6167009d0705087f861559787aa48896dcfe6cc649de17128a21cc9f8681ec49c31b7b3330455e36c32e9a8ae1e44522073f196fac1b31c5073c9bdaca3988a8cb399deb4d1ce703a3092d18dad9a7371401b7b106bce2be8939bb62d90aff001932dd4724f46a02c41a28ebbc773e6184720e3ba31c1b8ebf3a64f0b5f54534156740ffb07cf2ee51a872b487b42eef3468c132c5eebdedf1ad6ca196bf6e3e3fd8be775640bf619f8d30c4eb61bed95f40a975f979b0ad4be3c1417419485ac8949ee8c5f033c5223b4a3ed4f0656aff690462bbabfe09c8e58f2123692416e3efe611dbe40ed5f2bcd04f1f4723a9b25bfc04af75248b861f0226eadd2656c5ab66b105150635b7c9ee88002b12bc28eeb933a21850235546bb414ae266138fe8a70005f408cd10b5997fc3dc635d28a8df742fb482ec95b0a79ac661c21c70671f5c64c8947b855cca212b29690dd3e36a9e2e33915f4b5c317922a314a7fad0cea19225eee30383029241ef4a3164559cb4a95369fab4d7fadb5683ac827ec7a68439bc8f4ed0bc64ad4197f4ce3203829050e101c9783c7c3484c67c5fd2686587e1aa587f5b2fd9076043f8050b7b835249d997202ed51a666642cab1e555c3cbf06e1a76773100fa6addc54871076ec399cfdea52c0316c77081053fb65ef7d1bca85d17d1a461f14774588f0d79e6e2db341be6a1ada7ed0a270d2742d63151c3bda5dac2cdb0345babc8320cac7af1ceac61ac970b338f863100a5a190c61c72f2949d4ea3fc143ce9dd781e77568bdfd5d01bc3fd0bacde9e27e91754917ae017bc361f34189be55b394964b07a8bca2ef2dee76927ff5aed07c8210b191d296c27a776ea48f087ca425dc4e6e61ee75a8cb5329a955c052cdf2a06c965d1e10439c391d92dc17c06af9191f1e6fef96998fbe9e4b0e1d5d20e28c051d430cb89616e5a8497dc45e3cca9a58e82d570e2175edcc4bb8c1145244145c7dba1201bd085f6a8a068dd8c10415bf490fadd1dcf48765dcb82a303b8b45bb5ea49800ba24da13e43dadaa6c2944cb460e0856a4cba6700544c047a039026204e18326733c25bce40212033700b544e68542ada507de374b2ad545adfc5b92f6171f889d51a86798418205fa6968aa272d43231656f4dc51f26b547dcc09b1e2ad53a5a47af120a0b145b4f6d09cd0b2dfe4f8956abd7b4d7bb81df40a2a068061228ec84912dbbf9ef4795120d34039f7699247b5bee32ec19c8b0da680fe04f4a94f0fcb2aa2eb45e66243ac5d530bb7133ace3804a5ed0ded65b0a839f6e603fe6b67f85b5ccdcb13c96d9c0dce111b38508a026117cef64bf73449425858bc7f3a273c7c84abf4b43cbcbbe8179b33069a774b864e5b444f4424b5b54bc2a9153c5a080c9b6aa607c6123c1f5a99c3636f222bb611cb40dc0bfc7fc6de5074c27ebcc37a425e0b78c142f7656602caffcb4e04143a5c1784cf0fd7afa0822e58a2f44e55697061be3771d4fda8f7c26d66dc759aebdeacae5906ba7bfef2d86f993f25066dbe39ad7ffeaa39f9a07e6ac3a61790910b02ff1ede028cf5537cd7df3a9d8300c4a016d616e5c590d281905dc83e486cd494c08a209fb3673269b9e587f438ee3502c4e8a2f0610e80f2ef0b8fd0b7b8394e81ae5add6d9fb46fca13e4325d887f598203bb182ee574e482099f315e5532a776095d5c613608a98286c66c1bd9183badc8adbe18aa2149066e4f731f4b64e1d5eec5a40dd468e36612523ab9bbff47e13934185d88f45f3d8215da91e5f586c2c89acc22d7020544284ffd4beeea456353e4178dbe46a4d7bc4dc468d0e8ad1968d7013f0febccd57806bce547f2cc1a1134b6dd69923f5e65dbd75d6db25b7126b8b3eb607c037b1f12520951befe87b43d81f35d7f5e46ae81300b793c9a54523f7e8ad10c744175814861897d9144bfe07ad784474059adfb02a20e82e2e65b80570fd76f29d15aaab0daa170b8dd0ec77af340f60524b5eb98b7c06e461ceb798bd270383ce5aa523130e5c2a0b63c16e9b741623457d684551c3dd42b01baeeb8b676e3b70e7f0393ffa94a274b767b2e8048c49be4165381fb59f3215f8404b8a46a2121586fb4793aeeecc0250510771812d9c2c25d538373921d5e8b4eea4e087992a603a3d93a8aa01ae1b5fc72b0c3b300b31f9493292ea574dada2bfec7b507660d9fe564db4d7cb9b648e0f48eb9ce8fb6695b9236da1e014ca1937c834a035a07aa1b74c0b844c74c46ba0ea355b84d0e626aa251d045314457abb38805e823bee76d49e4de5f47ec3e4b4976abef2b137b577d9877a48ac0b582b37b7dc8b2cfa8dcebd85e37129e4f38b3b6ab9b7d362d2e6e4f959c6abf92e32642959c14377411d6490083a059b08654c3821c2cd42e40eb9d9b3038419c53ea3bceeaa5f18d36e7f54c7756652b11954f01b3577c62e2e62302ea8b1ca0085ad024bf716eaa29aef6b45136d2ad5abf7f0ab62a09c6e6bb8c62670fabc4529219b8ca66307014e51e5c772cc1e85f71ae48bfff8dc951bc5b458884032727c402d07147a9ad2c91dcf45bf8af9214cf939aebc1bf7545a4610738c6eaabe2ebda812a6a2bc87a84c12dce005fedbf3a19899d38cc3db22037cc23e10001f13cd868031494667e7277aaf5402c960a9f8a179cd69b3530733e4a8ccbc6e864c178cf83bd35624d291eed2f8b7f127709b7bb5ef5384a9680066ac609796db5548848a197fa2a832e7517d8c019daa0c73a2dff5c38e1272d31e142f98065c0ec5cc9c10bc5038a59036962e6feb6526e587fcfbd5de21a5d762456af3219c7bc37d9cdde4ece04646fcfee3e7282ccf63e78d66d07140d7a7bfe6e0d3ebbd09689c59e20b5f3d9fa139c8421ed601a97e1a66f1fbce5c7e6335c48a87daa58514897f0550c704b4101c39d22aa1a8fe79c082bf27c21541cab0aedcdffb1edf56ea70c48d28372d4e3f494ba48fac58e8300406f244e937bcd9a721a2f3b980c409ec3c909f364fbf79804834eeac5faee884fb6809444701727b5a5decdcb2c10b0826a5024b2b80bd08b7279f355425dc5b621136fd7c533b8a1fde260fa1fd1319bc29fff6db1274e53a70238161c086d15ccdb691f360d8ba12ab4957f05cda37be84e190785d8eac0e49823c7b93b4b73204418c6f8c4f842307f4a010552abd9ec41cebdc7cd3e60de2310f33478e77e1a8adcf6e75828fcd7cdb815467e3dcd96ba76b0356393077264fa1df73db1528c7593c9b792ad51d6d074f3347cbcd099574a9e48a36d90f1f4d5a57e73d8ba3be92b0dc51db3ffd6c6c907b81d5281deeb773a80a97129d617df30970b3260a50634b2370d1e7309eb6c4c99840f9305a449088ddeeb02390314897b890e45e8df99fa270fc9ca04e0e098165130a2cb71da4b9c04e08f4db0e44d596431898cc0f86a5855fa28cea6cee074b2c3fb5d814632e6529bb82b4c49a7882bd42416cb2e48f4d305dea13196d93e8f32a7d68b10ad4c943ab9a0babb31672c7bab90399b44c7abe4a4b26e72ed69a9b45f8722670fd21e65c9614fbf67d4b4425349c499f5c5839db4c7e18809d16eb549a0347a1540ba1e04cc2fc3a0620d044852e09601d383d55f7c6d82f8eb7c5c9453fbef4d5583fe4cbb15e19e2686542e60daaa9335326775879f18c187819761c1e99080947c7089fe6491c75dc55b3aae95ce832fc7787c380ab69665174dae7c888dfabd03aa275bf45cb84fda74c1f7ee8763385985122f04f6b3da99c349b2c2114d3d268f6ee961e23cf18cb364d521b62aa6e37a2346281c292aa109289c324bad87cac5a135425ac0ec27f6d87ec76aef91471455bcee3b885a0cb08e04e6ef48f14d09913d7754033c26b213a055385cccd2524d8e0897f4c3fa64401ade64849dcaa10d92f0a965de11ee7baaf12cd8463e0de510a8dd757f3d1ded1e67159743d1fbf08d8305390ffb05d36fc63e45812d0ee09b977e5b957e59f47ec72466a857299daf47aae072046427ffa3ff450ceee073c0e700ebe33d13ea8d07f4c06a207844083244f4c402f4261f449c5cc8ff862cce3b0f84b586499e981ee8d6d8e6c5201bc47746ada15fa8b4a765fd85f9be4822b0d9717a9174c4527cfc83f001784136b779b7ab3bb3b2bc6d77da13cd9782118e54ace1f9407e65c391a7a41b2fa8db77c42e0615ab1bc42c5e3ba41668156be025b402b380b64f3d9cc0dfad0d01bfb337efbd18965f094f321da6e4aa5dce83fed86ae8b13213fed6734548ca30a9af20592df895713c990d10b22d88b33f3db3ea5cee541033d535e05eef850444adc53ae5ccd2ce7d0666d42d9b4dcbcd208856dd7528ea015d339a5b563a53dfedece26c6b7282f1f6a5cf8655828111be73413774221ef9532ee26939a62dbe435d937eb03d283bd4599c5931d9d2c0997090c6e8bcd42cd6ff1847f935a4f74535f5277cb842c23dcc862702262070bf661509284b3806987d218d4452e7eaa17d31c8f93ecf41603d6819b72ca8ec7769d4963f2789c3b02f595600f64b747b14eb824319bddaa8c55062b5c06843832baba4420a5fb776246ece3105bdbd4a0ceacc87d6a0852755fbebcaed09e5f567b4c02117ed4df0cedece60604f029fe3d80929087e39b381c9a297a832798061ddfc555f737f6bf76393997603cd06ba07daf82c34b41202427d5a3703b43af54a69bf94bd3b46827160d289057538d120bc79c7d75106c158c2385e46c9676a64522b9eba4a3946ceeb9a2d124b8f4420cc8f5e24babc8de331d8d2c960a468261c6331ff4fe13254da0713231e2baaf68d1192e2ea243525c011e2e856142d9e8420d1c8ca65b9e8b142768b436bbf45b5a91b2114dbfeda5698b56c8e660cfcb16c16b6304e2e2c55df4a6dfaac48a704b73916ebf91e1053f7b5584c8116819dd09d95251ecf5143a63529f0028aecd5d3056466720a70dcecdfeec699ae89a10a51691cc86cb56476b1eb481009aa43fc4ced737e113d0ade3e688e0c829106f88d66f9f9280f057dd9c2586cb4025d3091fe5073746b2dfa1a8edf2184ff41de380abd961e9f09c7f4af1dedd9a812ca8f1d62164f8bd3701382f56f448c897a15584860f600c8f11905e092b098cdb91e76b06a771526f4e33fc4d51b39c498a8d72edd9bc732650b23fe3ebf9efaa3a3d7e44bfe083def805a2bf381c4474a610dd4a9eb58316281a1774f6ef12d9aa7788a431e5118c608c4caa05724e2186fd6da199193833453ba4624d0851406a9d817f7107b54109188682bcf8201d2d804733607f07c1dddb2ba7c332e1bc8cf4315577e08cc12255b1d1ace46aeb82eb3e6838932b92fc168206c193d29e4e0f7801b7d9b8c285109291743cc189981062a9959b4d58e325d97597f68c007908bb13cc56d47fd9fbab099c44f4282ebd2e82dbf1117db8b87313bfc42b5082599619f00c85a3b7dc43c6ff00b84d57bc57d06d40ef162b902be483e140efcce462901495233704f15c8f44b9b455b82adcf8db0578a1454a7f458cbf7fd4fdde084f1c9c66f10c194d25826f909a90add0a803ed035ceaa01f685a5d9a95d8828b27a178f7b2b607a0c3c0829ff93ccfe76b394903689e5497b905ae05ae1ed2a2159be8a424fb71808bce19352041f677e52b2f04fa6473757ac10435868b41976358b3986beccbc7f346b586f294e436e2e6f72a045c915141300191715d559154547e1c504d36a1d3011d6c83ac03c5458f0a0b12ad391136cf3b5c35c02759eb437370f0a1b94688e16c6994f10ad9203e2f83239bc315b1feb65c5dd0ac44014f3c81f8a18eb6565075d837e197c71beef1f803a6efb2b80d93dc45f76571533f06fb007a43a80fae45defe2ba859fb0c206c54d1efb39225db05bf6415912a88b697bc574204682f1140706e0795c33279bd0856aac3cd53e34c84a4728fc5bb8c1c720fe6737bad7d080343be24f49263a0ea8e0309753876287f8442c5e6265a753124e78c81a7bc068bb10d79f6e3cccc15989542fc81b1d06e2a24e124ac0650b549a1cad0120695b643c2105e58fe090a0b8586849bd2c471e6def9c36874b9aabae7e29fdce653d3b7bc50a486a22de15ecf1063d9669c594d2f3987cc3e3d64eea80165d0933ab866238d7f099844ebd640f77e842b055347b615b87645aa6d7c17c8683b94b51dc7fd40f0834c466144721c24e48bdae8f8ee27a8c4a211f7385fc27eec2ed911810fe14c882552bacdadf7a5c904a65b341036c64972d3514e05240adf2246d6a982268c1cdcd0ab1707afb04dae643df5b83c840d4f7bd8e27a83c7b1417dc3f707e69ae0d8e71e62609b76b2d8b9c0dc09de0f3e219880e13d6242b07f51f0ed9b733ea1c31673985338157ba8cd2794be714e9815862d0207b765bdad19281301a4dc55c2dc6d4678c825037217cdb16672f936fbdd3a426dc98e636139167054a751fdc8d8fda99e4d3f7b09e0f5d29582f5586f603c81b09d7348fb95c542a19af1f522f94943902002e3810f79562f1c1313672dba19eeb6f955d16d2887c39e4182328150a362f0ce37ff485806e476403afde87bbdcd4466ce071e3ca680f271e8d9d8cf8b80fba0dbfdb9980ac8c56163742e33bdbef54112ff03b55f48a2686f2aa5790be7db7786532edf43a97f184349cf52ceeae3ff091f29e37d8be79e70bfea3b847e3ba16e2ffc528ed1c60ba8222a79ab2d655b25cdb29ff078e30a42b9ec3838638b7a6840a14512a0db590b7f8f98c6b2fa3cec7beccefb032caf928ba04aab83c05630cea824709a19179170ccd2e33ffe04f06a6d1ffedf1dc58921754c0f51d72be197b656a11afdd5bb41d2b195eb65aae5c6844d6217f8f940b529ebf7f643b599c56076b55888395228420214306c6e2a07243278c5b05d5d93dd1aea711932380e529bf501778246cac668c0e21a67cdd114e5dbecae54dd84b42b75f90c4d5aa44e21a87da062cc8303b34984d3d38d7953cfcd8c8e60e54d708b8a5dcd21e4e3c8645287dd79d5c5712f9ecc28d6370476e05fbca067862d27b33662ca705fa06ddce2663548a39fb40b5c50c46ee9ef96514428a2bccbb84494b304f84529cf4a49c801d332ebbd8df34d35c6770903a9972e4884fb617fbb08364c54b3b99aa757253bb8e034c75ad2a89e28ab5e49069bd647315bf2cbc8258d5f81493f3e10c368f2a54be80a9338c6aa8830eb0d494d89effe5adfca95579508bbffaf65d6ff956abe9760061386e83e14fc8db5a166b52c614da71450347b87c74e155f213aedc299ca64bfefe35cdb0c348989101d6e5732af8412b43766973acac8372794d728850ecf0c190bb9e196bc19b1eb2f77de7e32209ecc2e413dc329d24a855208f5b4935d33ef3fd1ce69abeef7a44f70a4ba5aec9d0ee41fd443808149b202c0202d20cb4e6dbb88916ec5f6aad2df7b05c0f81e518a4ae9413011cb05f255c25b7c6d2b1f32b3a50a29ed17f20d4994487918053195da80027efc7c3b9cc6f153c648892f5bbdde666a9120bccc96b3da89cd440ce0feaa2016a8f6a5c5e188b848d20223829bc897c5de73de0ad83e224f49d69120d8e5df2cc09f404f86476e72c9d1dd19bf74c253f308064076696d9810df88c5bc5b823e07ee3028fa8756855423c4b3804482129da8707509a21d68590583bb11f1b1dfe438d02b9f414f2327fa2cba3d1e1c67d4ce11f8a3dc3396085dc704e9e1cf1c9b2ae7b7daf6b48dc44631dc322c400fce6d602e01406ebe78f9ed09f00f1434434f842c1164e0eaeb52f9553acb51e39fa00c7fd2ab7fbc3d120f34808424deac23348d0d7f070d09abf6a0c8d8d6d12a429848aabc4b4504723dca2df2378286562d69c054386c93b20b5987d99b16548895f117ba7b3673c5e4acdf8583c67988c062cc24f00033a585a95ce13d236a03c152aa1e126c550bd30c8a6fc68df6c94e3ea2c40db0da7bcc3bfa7c13eede22458f30cb76e03e139b740fcc857c42f9cde919c49bf8eefd170ac14414da5c0a61ec0322639947e6d6eb208c9b738daecb738f3c9f9c264ca409c7ff62735fd4831353022198559cbd16d35d830d87c7ccfb24bca3eecab793e45b38826d7424b5c6cab8fbdd1dac8350150a64445dcf4f0d56102f3a488888d1bb86719e56705cc160852d92635cbe2eef6f183d9165c7bf3e5c03a33da99b359d1e5093615446e816b58a3e751828384f7d1328668db843bcb37e4678bbf49fa3ae27f0d398d4b009b4b07ec1eb5b8be107ed077647ed75c98d6712af8196dbc0c85d4cd8284635ae24526c4d2c350f4cf3045d4d8a211b999fe0fc41c57fa6294437da9212c098aa35dbcbc09f08017000f981844abb2524f345a6b14e51845d605f19e7b31950c4e2bcc114f4eaaeff17211b6def48a5e9ea389c42ed8e6babf616627d33333f12e7c99f17936d52fc3e3ea1cb534c0f41024f032086d4ebd7d184d7247616fafecf9c24e5df7f2bc48208f65f97382c6b8289d357d5dcedfcea7db84126f9419451923903307dd18296ae24a7ceb64e134d95da6ce8043dab34f2ded8812431426e243395ffa0be421618c99457583201d91c98354f7d74d7c31092ee2f280320ed98c792896c51b2d26a889d6d27c34e1c98d88db36bbb2b9a003a5b635b1ecbe141c2926196f356f52e1eec8530ce630f9d34cbb035c42b3731fce88572f7c25a24079e034b2a198346b20dafadb8adacdb12cda4ae86db162512d166c754b8b7e388730de55bb40ac2ad14a5b848ce715797fa3488d5ef63f58fc2c3c12e61a08953835ce85dcacf21b8d275ea75a9256d3ebe04004a07b21aefdf92a4548cc16c0cb351ccde31bf1bfdb691f9e9a9628d8d5809560cbf8559f91f9613aad68675214fd481f34851a69492a320e8232f3267267c47368e7981f8240c5445942d1546a356203f2629ccbc6baa380ed782ce11eaf2712260c5fb7e2393988d44bde87316c2190f8ae6fcd60f1cc2721c1ebd61f9b6a2e58b1fd84bee94a1785d9e36fa70c3e96353bc058343e2ba61fa4d68a22e95618a70561c5cb56a4cc0b700a1827e4988753b526f842704b6465bc3f4ac39529fa62de016ff0ed1a33fe87b8b6d0ab3e828bb0418b318b90722e8cab4db61c3da6e3639b3de1b29fa2d550cca16484371078aa567c5e8361db0a8ad78a81050c1373e62e48458e23b423be52723272342d1e7787a5aa5a15584a0dc2e9358203bdfd6555f8104bc4b27fc47ecb3f913f5617d4ae18f0a06fe65d85b9356690edc3316b1c35546fe6a89b1550cfaf009c0cdf304d279c77fd1531fb2069e9332cea586ffedde9d4305f53edf89b5d7fc3f4464c4fc39e455ddf4cb4af0fdc2613d05039e49cabad216d71331eb3dfab3559b3f9c1480cfd3c3b5d2fe52123d2a0a03d7ff6c6648307ccdff833123f9c55e8d82fd7009f1db8d8b1d06f2a3a298218a890f53681544f5e9a6e7405c807631ede1c785fb2e2079ff10fcc7539542280c4ef1c46ea006b18e060e6ef97082e2ad2eebc71d6db443a0b263d380656fd9d0abf8c6252298f9ba62119bb04f5e0bdab77745825fc420fb7fce44abad4d223acaecdba12f7c4691d3f0972d4eadf306f2fe1e6d5ca586cfb172e35b8b37683605901b5100da410104a3ef28ae4ca0a5a05000f13be11f1624070ad0d274106706b47701e45e53d39f685f423baea88e7f6bf7b5038f6d461140d5cda53566f6a934fcf3a6e36876e0c253b8b64376c4f3dbb3f0909b7a970e18126ffc6db3047ec0b4b0e5f98221f23bc3b9335e75bf35d0fae20c7118c26e2cdfc405052ec7cb0661732c78ea417e2d759483f61ad7d416355a9c8284fe04834ea0381848fd115b77f6880a0b6f6731dade1f395c2a6d130a3d88ff17462234b187301d8ff184ec5eb1a3b589ea5c85390cd253ce8031453ca2e5d0d0cb1be12fd390bf30cdfabd31831492b433d7651577f5999e74f124d7c0e8d21c3d26da69f95957e9c42d40dd95b140f8c8ba0f4075d63d10bba4e5f3be6225f767cac257f250e9da14bd6998004e513f0789444eee279a18432bc6866fbf378d04117c534a49c33f256ed303c5bd315e0a4457d8a169d40c4edbbc9733b3506b7c6581fd28152a1f6be5292e48e46fb8255b777da30e1d1d3687c4c5e9c7b62341dccefa51138b913e6046fe0570f35599d02395b87c540e5a13e5778624b8c0a4843ce6caa7947f2eda09b997ea558477a3d6c95c397490a152d264a9c4960358e02b737fc4092d68312b35c746fd06faaa200f7f5d942851217d86913aa2a20450f2b0efc688fe5586360c67baf6650d1d37f362a90969adf8501e1c37d4ee0dffc066fe1b15e0ec2db04683a18b3d59f522fb2880771d765eb77aad3845b7e98b3870839fa374fcba973355442c5655768e6f5c1cbea03798a0f31944de5e66b01d40d4b1b051eb3c2db1fbb7cba801e7f2da52532cbf61df1bbe229a9e15d4a5c3c214dda68448f429a1e34354667aebdbbbeaa3813c152bfde4b3cf0015ef52138a1f2d61167cac475b6a2dc5621c145fcebd685faf7b512e5d162cc63a5d3cec12a55c1addacb8a3a8f3898725b476b6deb74a8504022b1bfa1ffdf465ac8a556ce1bcbf43fdf5b5ba1bf3e58ba4a7618acceba5bfb2cd9d5ef8181218c8095ce7425dd65b472f33e32563bdbd4498c9ed9064dc07d32471d886a25c25a3e186c0a6c82f67d6d4f74a2cceaa8eda80abec2d05d41d225b1e7d2d3336db9e682ed8037633c6fbb6d301e8995289f67007022a35991fbe4a0413ba9ba71062e13369b327fa6de6676bddee62f1d06c0c088b4176fa8f396fcefa2705592035cf0bb39a5652e0d456b7112dbcdf0dda5f739596c0e0e6a774e9c96e900346ddfde0e150c36c55c629e10859f57c5db6fec4581970e411fc0dd44d7a41b8888150c54584e92b5c0116b40d9064477dc55db72177d36826ed970092e20180326823dc2028f09bdda510ef635f9ebbff4788449428587b5d9c3f40417ab2cdca83b5a442d3ae937de26ddafcf2b1f02e6f2e8409cda736878a06f1c70a182867fbc97f4d2a5b93eeea7c39db5c5710fce1656364eb68c58003fd3de652c15fbcce30dcb899ed4b3992cffe03528488ef8911695ae45089213598be99e9ccbc1f7926e5c3807c989a6d7dcd923e80dadd606a46a55b16c9c0162c5c74fc54c4205ad4af6ec2e94b38d4fff157126b2a39916f1b50dad846fc6ca2b9b68bd547bcde0db1700154281e1e768c717a86d659808dc6577bbac915180bdf1a9907596114486b61130eba080c00ae323ff19e35a95ee2163aad6bed1002cd840f9264a0303f05783392f3563f4779642f0502f417da703495fcfffc57136711a2355de2ae611fb3a9c40fb9d036887373c5ad2f9dea0e6f4f38ffb9fc880863136e04c7a31bf9d1ac2e83a257cce6ecdf60be7f224b3717739885c35a0de4c70f065c64942862157ecdb5c1ab27be6cf4694b8a2c60edf1d7d716c71017a0452a808d4693432dfdba51c0c0af59591001775cd68e326946cad8d752404983f32418b12a1035f630a22188e45aead00e6e39761a7ae87f7323d19efc58b7beb6584d4f4566ff98ca7b06790bf77a76b3d54fb651e0779b3776434e93a4f936d2f6f6ed01884b2a2c33dea3e2882087d9614351fa39bca80714f89ce1bc711bcc528325d92053ad0f215365b8c875789a46cb8a056b3d80c1107a0d405478195287c1768e749a825036faf64e24707350a07de5d05b551cf37ce12687cc082063a1ddbbd523a755c0f0336710c49afd11632ca93da68c8378f10b7a3c4b44abdf91abe97ea1ad4d75e976a34fbf2e20a1ff5137675ae92980e8e844e42b9a5810f897ff16ddd0741937acfe9eebfccae7b7548fd378699bf284d151c584ee1bd576ed49d0c135bfb4c5b80de479f7283861e665bd2619a6d5bdd581940a7e81e9b58dbb74795560e7c0557f557bbcd6d4bb09e55d7d34379b5a688b7dc4bfc463817ca47f93a0a492aaa7a9dbcbb6a20399009ad8434a1487017b3b92a977f5e35cf12d8e53a92e460c938ee72f491b2e550b2cfea7209d668ff4239fa54b6a7172166aaba37527c9170868a05357f1c365136e7f0cc0e20c8c0899884c919245611568fc23017657fa893db3e0bbf6a730957f9fbd8f4de76d267c9cc4e9a73e40de989bbe1f11de5392c73710370a09581f20c50b4ac763ccb0f016561f8108707edf1b77d66f89aea04ffcfa6b89605fe9811c3878f00e722ff7fcd66fbe5409e6565e616e08c2a246645fe4055a089b382337255f5e54c1766edbe95c7f819e81ea21c030c4bc6b5a551a9d620811070218ac54714fa862ec6f0d9a89d7c3be92c1c9799bb0b44470cd4688ac9e40558f324872cc1f679102f76346713fd27c724566feff416038a310fec496bf258b0af6e6c68e31a180d6a167e8bb1be7ea93753fd76b05b2842dec747ea9e9d563501e8ef0f31caea62b9edaaad4f18631b0ac398b0a751a60ca3c42c6eaa55b0000e16ecc388f10e8c2dc22a692b128c9447e6de00c72648b3092ab4a7a011408dd3f5e87d0d94b7f5c228c7b05aaf0bf2902290e13f6b6c119b4e63edff25494b0dacd488fbdaaa2d057ddbdf3f71130a3c5d620c6d668e27a4b4aab89062d4b42a037a3cea330f7d08a9dd56141218b154eaaf11758231ce82a644a224065fbf24f9507c5981b5f32e16a24889ff172ed451131eba21a86c45ff50bbe10313b008565560e2cbe7e54cdb6b66f7cedc7cbc23b835c61ee312ccea89d5b9442ca85956b65903db6fc71e87aba4a767f0a97bf97ae96acda629d578ce7cfed01fb62d91103165ac67c5cda90e715b4dd6828c5c5506dea7203d6c42ee92246193c4162c796f09f82e1edf16690755b8d2fe68340c6469b651fe7a9c76ba2064a06fc28a4fedeecee068ce0bc4394f6ef0864af8fe021d22a232f9bd1ef4bda7b65af030068d84c06f6dbbf80b42944616c741d516a0378c62e259e0bc7cc44ea06ef2f3080d555b93372c8e0073676c9459bc987df0aecd563a5f748db9328b5c03260e886e4bfe6ce218da2b82aea36a9645057411c03023fa00080547916e52ce2b5517d376e2cf551883e8f87095997c2a041be3691b5cda569ffa9679b6b05666b312e578a11f5b4e4fb1f181632b99c9825d8991bed4fb5bf6678b95424e8b2e68c137806cb0635caa210fda402be5b62081318eedca379b79205aab56b8d959817f1adef2ed4804d404b3accdc53c8082d8eb91afcb164c1c09e4520fd3abbb130d56943ad69517d7512f3a6b5f66b2846d2616ec37f3adbf1bc1406d9e6ef8590f4fe86ec1304288526c35d045468818cceedd5f37c17a753f7c8e8f08d18b2d32bc964fec19408ad7b714afde7db6feebf046fc077a644c550512e94da0dab30d826605ebd19c9f56c6b8b46db17252a783586aa6cbfcd109972fa41100405a6dc92af79fa4180ae2d21a8727a430b9bf2a39a857ed508304de6acb97b7a8b4d2421aef21b15713f91b824ac5fd2292fea4f545ef6a904c4f3914483ed49c5c9e50105c7fc7902e3ed540262f840e260f6aca264f28082e37fe88908c661033809a4891f9bb0182e77328cd5f6356ab6fe06caacd3e01bcb031a2adf58bd1b169f84ea5aaa0743e847f5538f3af83e77d7abc10ad74267fc909258d63547a2127d67dba7561049421f375a37234ecf907a2d167bd6217b19043de2d85a69db28c5f8bd87d6325636d58bcccfb500dbc41704c03a6129c6552c732cc253df355ad0123f57a84d8f051bd3a0d83409c87b2defd6504d21cbeb5cf2824b3d2714bbd46672001495e9015dcefa44674033e1e03b7ee3d338bd9195fcfb37accacb7205a083a8edf1965fb6616960e5c770720842b517d9bde0994f860a55f5699178d92a0cf61dcf38acd805c28d269f71505631b4b017794cee7219ac40f236abdaa129d92653af6729843c809c2f0bcfa0638a862e40dc3f2f4e78270b2606c2af2acd0872929d9acf7388afe988fb73d4da85d009104ee59925d3c99a1e991ce94e2be21536acf5d766cca87b69c5519f0f10e107112e387627e5b7bf35f68492f8c44d74e31194347c0676d838d258dde69f0d02a0db4fdf50aa1ae8754bd7eec5a6ae14cf2e9190ac2caa8d7aa02ee944bd1c0e34d55816068b159aad968326d19843a8ccd55db694ac9553b497725fe6389b581d5addb6b34aaf553c6775b0b432cfeb4a7f6d29c8f06138b3a1f06fa858ec4c66aca958176937280f2c687bd718c0908af035452a797dc0f15d103b8d9a403e1d9d5c44f57ead63c48b258b53e042d047830a3519993160d305afd64c2e150eae7b2aaa21701ae6fbb44a7b38dbfef61900730d4eb0cb933d9b1debc62cd756b1f0093439f7d2149c91a19f1b157008600aa4c732bc3aa133a849ad706e1ee8066f2bedad8760c20e0e1eeca512eda6f2af7e237c36910ecd8a019056371cafeb5aa6d47f5d1a17b31d04108c59e92294bb7d9556b1319f4674ca018cfa01807d3719d40c5ffbe004889ee0e82e6b0da5996ea3701fa4eeff888dd12f8377566edab3d6ee7c4408cb3cb800157e942d6f8b322ca291801e60791020fea1cc653872ece6792ad886f2d718a026bf1d579d5b74ce2cdd75578427c85a0b097c7c8449f6610ce5a683723422704a8b88f0c6ccd278dfaacb248a08b0a37c98ea1f9965d8b2bd5d9e8c9605fbd0f9eb5ce52cb310f9f86bb01db8828e2583351fa41a3285548fc379d8ab1caa2341ee639e81c0de445400f8c85fb0f4b30f896d40f50811254bfe54a71e2118750b3a11eac808284223e51d943b4a10f7b8bc53d1e8402681a163c111cd435773844f07054b30f6b2b0d84506ad7c54981250c5dfd30b04294f31486e92a98eadf2d83dd112768f1037480bb0cb592ecb1787a2ab8b01f7c476c68283ad6ecac67461daeb0696f0c35411575896d866d1c00a2de187a240c575e6ca8648e17ec847f561e6b841087a8371b656de139e69f8a6385a3be14df5dcb5e7e9a6ff071c68986b782ba80a876a089dd836659fa80140fd0b049e3bf8eea39c6f6d7bcbd01671bc023f7648b05ce7389655992219b9695d1632ebb17f42cfeac34d9f371c6274be311568e0a8f7b3ca273200b5eb0f4c6c985dcabe6dfe1a3e03923082b58fb1ca2b6b706d3538283b712ccb105806b248e81bd2929cad22a4a5d1ca5fd2d110b16fcdafa738eb42b82d7e389adb17f4f20bf3b4a4e3e21f390b93b9f33a4e49ea8f00d608e65044889d122a10f939533835aa600f04fa11b3b4a3f3df83073c0bd93da15e37a47679a765c0e6db5871ff413b7f4b325b595a2d8c176ac3221d94a1522b40a88f429744922b68fd30ceb3402265d9f951c491c07c496095a3b06b9f019f94178b954419a5718849afceae5e23a1948aa2001f624f301a20551d456bcfdfb5ff063f1c480a31c58a50f1828457a4aa0ae512957340becd84b542a732a215f70dc6468803458ae41cc786f6ef87d7acfe22abf7107703ca3b41120958bea806591bba5782dd8eef637d2aee2170801e43dd918f211dd0173b3cd3dd4fc96abf8b80cd3effb83379396036bfea0990820b0fbb5b022e406927fa044a99f5bb700d6a3ce122477e0894ebc979b3054a1d76bf039700d9768159882744d4e81c92a1b25c22f55d31c152085c152452b10abaf45f69a493c2892606dd381af28e98cc1072b6c0c0d8b78b8299047d7cffa5c8bf9d896e72471c89f728c3d9850790aa1789a713ab265bbd99f69e75c09568e3b62ff692af57af49b6a6752f7fec6869fafabfc0d20fadbf1e34afd10bf88003a1f03eb6df849ed922cc994fc925dc9ec9ce997e824edff35c76c26a10fc38f15edc8aaca006fea6d39fd3e001ac17adce402106717233327e0a2e956ec0b0ca7ccbd349916c435ab5e8edb1e095e4c5ff435d39b6f3dd793259e3d42c9d449a4869a1cc6ad23c3c1805ce3e3e9452d0e8f30d9ca037ce8b280ba7740743ae50bff809338049ff4879e6e4cdb6b4b6ef5c0702fd39c2badc4ae848c88789da626507ac103ce66787c1cc6e5e9b89e6a79a9325dc996a682fd30f72cb27cb4212276fc200bb8bbd8ea2e1b6c057b7fc0c7470b3063e30cd4d86edad60033c920632ab81c66f8d0fd0c5cefd00e959c31d57bb071ad3d105c8d6f781fd4fc0f423f8dfdd9b5f84040cb1200648688eda9c3405c0bc91f759464b54e20a2e156efced8cd0125571454acd377a394b6844d5aee052d38d3cce12da5189eb58a970232f674c4b54dd15526ab8c1fb2ca11d557305941a6efc38cb698b4a5c414ae58dbc9f315aa22a0e31009c6fe87386d011b55dc14ba51b163464d5c8fd229bceb922d364a8af3ece1d1a165850feb4f05c62ac6e9ae93a0cb2cad9f59361990868a76409037719a65fef1cedb83c053763c20476e1d89d142deb831e116ee3d9058014184c67a2381a9643263ea020f1e719590f34c241592d4a70236000ef97a0c04962030e7ba7b5e3bca4ed26ca084fc85f198a84ae0a7c8c7b0db5f3e5b42b7538b49850c7b1b5d96b542b4d6a971eb91455daa7efe5eec97e0344b54e098bc9d6fba62d36577444855035fef96dae41694a078811d2b3383b3a20a3ea2f1cdcecb00355e7f69e2859a47b3c50ee0c97e7ba4c06af98c95ce0c5beb904d3c533a2212f10b91cba3c487b73930f09b382c5c4cab74a0f53af255b7193ddb47eb0b092f3b96e9e4efe123bebe03b921ad63b033990198f2d5eb8d8ab1b22c3903ec97f53551c8dfecffe7f4e0783f69ec8289b2632071ace2d58905ef7699a35a474a22dae62508afa1639173d00a09a0840e91d0b668040bc148f8cd12790f226f49487bc8395b5454d3e5be41e701f1118212e5893350283b548c63d882974a975358e5a51ff7bf3d048e89abf55495884aea9e42100e722ad1714c36b76ae3a83e03020ce0eb1610d92f1748f99212e7f48e72c4e5988a3dd19649e1eb0551525f7645042f23bca306778cae8eafcbafbe9d5cf34057d2d1859bd73551a158bcf81addcc3a071cafe67b5cf63568306ec657588cfb502bc0135cbc53281b4bc201f3d6eac8ed6243ee172931d8a87344ca9537333542b99b7f424cea489b55515a01a25e26a02385ce4332bb4d96e89c6c28cf44243ddbec01a3f4c5e9fe50baf83297fa1b001185b5783bbcf6f7abaf392f01eaae0d2bf42f8393b077b98d28a80b4344d77f709862e6205fe17ba68c91a1e5f891df244048ef95006652a8a1b72629d1753708f05649dcfb62208e4bc2160f9f7a72f539ac02d17f2412b3ad20504640054c10ddd6480514362a9069d9b9bd0e17e0e2410127e06eab3117854705e35cb6cc29ffe8cc4d97445185fbb27188d68bfe1191b5fda9f6f4d822ff78d00eb54a5b131db51fd8598d04b0ecb5d6c57cdd234b1eb2fd89116e6c881172384775d4f138dc1bc7e769bba0ce22401b7048568d0072a42f68f4f6a89018c8b8416be4ea1c08feebe187ac7845e275bc760ff99bfdc910dba3c5b37183bc1608fb8bdcf92856e3e8c13555f5e7eb07d0f664476b15e15f0b44a1daa766411f89c6b580d5b1066a3e7b5accab1fff24232cd99182172358fdeb0b21fdcb6ecae7335fae75d82e8681990471de4452cf3abeab5813ec63db8f269b9da89f707144e214b3b482b284fb08ae76baa02c8dca944152af0919bbfc1abdf2301af7db76543790db601f1c928810ab4f43756718ffe4f699d3b7afd9e994a6f49197f60cfe3beb77c2f045870923a3b921d5d2c9ae38fb903b0f342e1b90cbc8334cf1fb7917cfd85cbc39cc9fe5a108c2124c2d04204cea02f10850925f5741c2a00e38cc5f26592c3931c2b269460c3f182c62c265d1794fac2a4a2bc6af423536e79475f01192aa5688950130ea3b1b3169e56d4a8f7b9e638539b350e8d1f6ce9ffd3d3b028c781674337a94f4b025ad6f41889f1388a9bec7ed7ad67f42ba830a599ec0465af395c6608f3b03cefc0552793c53ed3cccb06c60ca7ad3624f5dd6275560a786f710475403c223807dc2afbf71c5572d2ab34deeb836cc85a488f4300b261e4bb042a89790c2e188043484a0d200180d0e0b5cf60757ec26b5d932243a5e6c559a1ef748bede96535e2920d83ad7c5f6ccfbca8859e2dd8db7cdf6e36709e017f1f25e3c8d7147f1e22dd3242409fd6fc624b4dc3031e6fa91750e16090c15e6b34b41ac42b281a05b543bda6008d9ba36f5bd43de6f9007a1352a703f9f4474e10457336878ce478159c2f7f1dcc6441700b095e30c78ab72d2205599585f349d9e8a9016f75226c3f23efe715536e15c54c7a73c72b077eefb4f42441067b19190d11bbdf9f8143d6e5083216fecd2db2a615558451e073bfe75ca34a65d0e85407c6449cb6449cacb42493176eac7e832d7ed4ab0a7dfe57927bbd206f510c7e9b14606d18ab1f2334ca91f66e88432e04dea38029d8b1590d8edeeed08bff5f5a1b2ed9663c84f8eb5ec3842a940a90d0d35f5e4ba89d5e5ee4a62a5c1abe0722afbc301e3c8eacb06e24bd6cc75f413504ff09008bcf24fd90b219f775a9105c50aab91721d6e4e13c10f58735623c7f8585a5ea25a225eff4dfec3d9ea40434a0954a812129ec60c10ec3302e41323ca6fb8a91e79411d39496948d1ff2fb2f24e1353e935464617cdfd078ab9ffe4d020b9101e458ded2d9694b8903f788364d3004075f4a6fa72ded0d5635cd9eb6ba38584d7e4f724a3806f2485a9e999710ea4ff39e7c2698761494152d103f3e963a793185275d314b162477bd76c047d495f82ca8ab4947433d3743412b5b9da53e5441da717eb436df983cc662af38ae7b33f0a80e6eb429ab161b73c96a8ce637a99786317a400776f17bbec15f1130324c455c60fe9bb6f7fe5f229d56601936692c0921f39f6f73d52982e96d7f66f7d22623a77c40ad71813f97d63e6c50a65c7d386c657fb1e6afe0b95ee49f0e692086b6b6c3638f88b5279f60bd6b0f8ba631c2953f3f01e546f40154a304ae143990ae713d247336df9767708b8d47d0424655c2d52a91c122376801290e038eb21931b19ff0c250ea2dc7274ec8bc7b7eb8cde84157387c2081dad56c2615213f96603e0b66c9fe01dc5903aabb8e8857209e15a703efc1d16718477d7fdd34ce9f5e6f1743b3fd9bc6fcfd8e636a1734ba887be2c75707887b15f526b028e49487a6729e3c0421e00133eef701ea8038642e6d682f7a19c13e836f21bfedbdf7967b4b99924c01420899088f089bf6b5975d1c83eb98748e4c2281dd1f8cdb98e9fe28833c4e3c767241fa16520ebb6674ea74caed4f49eec3685eadbe5d2f372367e72f5cf191f7f81ff849ea7bf8650141f90de3b004b4b0788bf7c8b6482986a9f87611cb9cbdf6c2253ee35cf336a72d2350f3154fdb44def4144fe45be440e9253e55cc6bfdead5a3d73704135e1253d470933ce6d233d0b9f4ce432abd88eeee726cd7f7b203f3cb7b3c7bd50be9571779224f45e4f578952f5ce21b6450d621f8342750c405f824ea2e09f5460cca8a53677e60009f3c29bd071a2084f04bfa0eec8bdfcb0de6eb3d5ebaf3e9aa41a5253e6d08f3d2b7f4b2c74ad4b430e377404936c9c5c88022217de3bc6d302af3f68d7af23b4f488a6729cefab05950be9f7e610cb9227cba5c877fe7f2935da4db56e28894a72ebd662151c204a8877ee0ec0ce939d25ad2844f50b614cf07149d37e1365048ef22dbd5edb85c7ee1c7c52e01dd137258476f18091df125bfec7288bedd1be1e6ec9d73b78304bf75dede7d21efb88e5cf48812a4ba1d72ebbccd39daede81e06471fe7edd3ae1e9945ae6e87fcbae70b95888f013179e662978094df95a10bd0be23621761b03df3dac8cab46f326e5c3945d2a563de110649f07265fa09356c22df1e3691eee153113eed4c714c856c510835faaa04608b5228a1463fd203046af490a224efb06de1f6ec2bd993416ccb4daee01c2323a98c2446e62f2cc1c74f8a6d4b7c858a611886f11732f1bbed9ab3a739163a26449ba2c491817823fae69833925ad5a0e42b47c65c8846d10c441ca57823926af78595fb9a78294e1b0596220e20e28d1892220df9c3526c168525f894cf0891d70106231011c7ee8dace3227506438ebe79fcbc83cabe0c7afccb27ed0b91881fae132746947e3af7b2a3fef4faf30ba23ff9f5a8f17a024f1a727e594e8638d1f92d458e46fc440df7c84be7801002012396de830f7ca2cef916da90342f59dd7407336f2f2f7d247d8f11833186f465496ab18fe004c8909325aaf45e161a967c641aa64cbf5d30940b6062e737536cf746e48f5fc89827412f8cbb1b12ec98de9f4f143eb8d3d1e32fae999bb16b01b34b400f2cb609b61b29bfb8e01cc1cf674f0946e2c6f42448ff9289e71b3ea2c3187a4e7dfc90b83c09fa7165e6cf287d9b9c12fc976fcb32ae141dd17fade4936423bc5c72eed6481ad9488d4e7dcb5aa3a183c6d3ef081a4fb7660651ff8808f4fe47c49fa79e711b71b009364ef3adbba668ca146ea76bde5ee69a27b52f8c5db780d905f8ed764c0ff97514e0e97744019efa56b9dd9a8d1ab71479805f89ebb18f5edf8ef9495aabf08902e72f7fd971f1a93bbcc218c6d3303ec32e9f4ebd94bfbef8f3a329fb3db018a5c08229377a297da4450d31cad5eeeeadc12eec628e5bd4d01fc3463630c7bc048e4830d7755dd80c9be08b6af0028f182449fe164a0db9c8cc5e99440954c3fab292e49c5352215e0c5e578e68861a92fe22f129e460f8c47eb997c0cbeb884f5e4c0f302c462c5e546c14a3dc4234c72eece381397b887d2ffcd129bf11a594524a29cd328ed98c913967b864a8a1ff9425f0628e696812e475087a6286266628f21b2fc7169d01c7c6a4deb06d492e1a1e20864aa280cca286f5e77452752698ca2835ece7de9ae816d89c7cf14b438dbe956b1272446cdbc53154e9d2a902c830c4244e2fbedcc8f9f198ce1eceefe5863f21bdb10c549041911a390a8132b8974fa12eab0c411fd23200f9d4659961489b210815ead3321479ee72ec179d8bf9419dbe94c1c6c1c6aa67499233331bd7f916bdd9491c603f7e51a585cad7364af36d548ac756eb5191f5cc3f1ca38b8795e421e9f2e824ef7217efa25d8e287354fc078e2c3e714736678f485a9c3df644227c5271c66114c9d9a30ea364c4f090a25c3c73195e6cd2267692177f528d72f9f86bf154547c65c5b9cbb1e2dbfc48b0facefd63e78d443d44231567f1426ebd8ab78affd02bde88415651f96afc6954116b62a7b56a299c6b5d0e4ee4313fa85b10dd27db63fc8d5d87801e5b386226f2ec17b30c6ae8830f9f8e9d009f5edaf7db677f44f0697e92410650f63a62b2e4e517929a5523e680c036a821f7ebfc720a4738b23e30259d4d47a90735fa7aa983d878f944f7e3e42e3927a5949b11d383fa34661e46b32c731dfb99f778ea855ec4479f5e587f661e75bebcc7c7ab7d7697a33f52b84a3ef618b6acd52676ae356ac1b44a3624949d3e2690df89f3ebd209a3e44f9bb8d5a82c280b6ab55aad6c48c3d18024d17c3c7b67437cca9c9d7aa8a5604851c947a74948947e55fe90b01ff9c34c90fc746741d036a5156a6c5d5990962265419e05adcf64418d923f6c629fee4e22d59a053d4b26724842f1914e9efd6212ca26a31818540cc947973e1f59ac833a2516ead4e153e83b7c0ae5cfb37328718e7c8efce19303910120ab24314887c54c7e0c6935949cad29b235fcbc2a3733e86e4c3f311cfa2b7f193044b8487cb00166dec461904b35062bc31e62bfce316ae62c8ef9c4de605f8f53b532ecbc838ac38d2a0ca9f4e1544d95377b1864c7bc59844176aa79121292ba477a60159fd846c9d7d927ce74d290d17e3c3f128e63733e31e4970a4fe87c38552aa0f7c6bcea8d9a2a36b1535a2b89e41e821ff3a34e0cc3fc62c7ba05b4639f12f1e7cb8e971f8fe93d8c5a1bf68da78ccb53a4edc86862db52d8013dbb8e944b9ea74e4c0feac4f990d2257d645eb267dbf0e8797e21d85fe8b28f743ae8cbaf590cb2330f6a1899b09e99500a46d09ff451d6dd1a7721356d5fb0776fb46f9441f84befed802e9d6d4bd988c4e77982f848f54f2f29d29383c35018a8856408cf0f1f9149fc6115d1c9d9a08592a4f533369c4c9ce8b18564088ffc217d30f96115699dce098292a4b51ac240f84713264758bf137562180c93687c6090bf52b4013208b213cdc332cdd7bd514ab6e6da9a69a40a95b6d9ce8060a6c54e56cca6377d18e46b4a6f1e61f9c020b39ed068ac8b3b079b4be71823894d5c066ede3a2eb7487ecd7108c849599649e76f06d51ed2f830a3f1bb28e9a8e92169522abffeb6679e4d4f53851a3d9c01e2176c5b0a57809e7de66f788c6a2acf52642b3be8805676e875b50d3fbf15201ed80033431bd572c6af4f4ff616a0478e3220c568f951b726543b3bd8a8fe60988a1afa00f38c03c7d6ecb36aec99ac465d3e8dc266141f9a58566f8379953a8934bdb5e9f9337fc05059aa15d58773c5f33b572bc3bed28c6c2acdc8a6ea2654ea5593422790670f597e7d4452591c1348dd1a6fe630c8118b5a102d88c6c3a889c35375f9a543737080441cf38918b840b5da2285a563d7c42e42a5f0b4e9c4970604c9d2826a109d9d39831bfcfaacc1e29838f106a7f0346ae6c4149ee799935224a5089fc294253c3b7bca12b666a900841c2d08fb329f9c1964ee4c9d891371cc1acc1bcc19cc9c99f3292c09049654ec74c86f973d5bf34346f161ec44ad8933bd0931f8f5f9c4e2c88ac41baceab490a203bab0cbc78719929eccc7cb8e30c89e15893832237b839da19035a1bf9f1a3dcc582ca97ec1ead9b7c85dd8f475c9430a13b2bb190ff2cb7e565a330b61db5298a29af9ed9df830fbd566eac3a9d232d654a5c41882cc39ecd725c7a0acec4e70a97d5ebe3ea07a60137b0f65087bf82b822dc4bf9b7905db964291e424910f392353644a9ebd322a6bb189bda9c8517d9841e1a1b035fb2c320167ad15a532255992ac951d79f6ec48e6c3a82cc966adac256a59b1e3acad895bd3720a23eff193adcbafe6586290dd478c2ab9cf1d36f2f3bcce60d470913cd71d3b7a04be5d08e75bdc3a91af4f9e46fdd026769fd52a61fdfadcd91accd7f78a670fe514bf2e5b7115d383ba59f8507be28ad587f36715840d7f7d9a6a495c192a33d77665a8dbf0fbad8b3c9ac9dea292dac49cb3ff00841008e08bb7b9397f7ea6c071658be6b7834c6c52db637f3640b6f199b70b4a26326ffe4c264e386f02b529680e3168fafe66932a544f87e7bcf91357cf1ece1f3eb5a3261336f5377fe6cfb3cb6ec7e8fb2b75ce203b7699dea3699390999967d77e32a65e70ec99df62173fa7410d29a3486c62e79119eae84733d89a99e6a9d1b785d4e85b2363e3773ddbfeb68897fe13001fb72676c76e8ffd831add07357a07a9d1bb07357af3a046ef1dd4e8bb35a5dea9d15b07357ae7a0728d831abd756af4be418dde36a8d1bb062d2f31b8ce7191f1b451a43609a96dda826b1ac8e0766b5c7e7d9bc1f50c5eb896010cb75b6303d73837701d031a5cc3c0b97ec2e35af571fd8218ae5d50e2ba0535b8068203b75b0e5cb300e4766bfac431c833df4faa89eb15e8c0b50a00c0f50f1b5c3b21c375133b709d821b5cfb98e11a053c70eb1b0f33377690b101001d4c600e38d428c57c9ed3b8c10698971932482e315a462c2b2a3545d4cd887665e4d78c056dcca4720cfe1067bca2cb38a59763ca3863fcb827116877e30db65d9a816d836170a994735e181d9243e359196deb46a4dad1d6f9f5ddf9f5cdc1c991237faa5686543715ae76ecfc4565275506573ae6ca5eccd1532407118e1123c6e0e72f8cc0ea5946a396182e2d2e2e2e239615171795eae2e292e222ea5c5c5c72d0bab0bea574b7942d5bb68760e4f1d1c9b6a5d428997239ba3bf53bf33b34e54525b783f1500d2ba51ce5e9a11a52cad56ec4ce6ba8d1392f2a2da580299d8eaa92b2c2ccdddcdc0c6e2c2b2c2a952545d4b1b0b0b05c53864a94cd8b4ad65b092761f223e78551496973a47b6134a3d9baa6ed7092e39a23a76d5c2792225173142dd76d0ab79e288868c8afa7f004f9f5ea854ce4d755562b7265a539ae30942028434150d80790cf11243e4792b458385127e6449ca862264e7ebd9b30810254440f343ed07c0f7b642632774b392f795dcdf18adc2de59c172631ac3962725e1786519a6952d39aa386d12cd3b46de33ad975cdb1d3368eeb3a9128a5ca5a9b638d222ea6a470b1aaa870718545b2b0344796156ed70be9b6b4701b2306b72e244922354792cab6c24516c9c2456fd4e9884f475cf45a3a1d918b5e8c4e47fcea225d5c9aa30b15bddcb450d1cb4de881e71683eb3bcc60e3135402f016a5124791b2c45098cfd04c042231e855154aae55dc6901e15a5501ca40520622a0c6da2ba0e084c6ca02cd19f80c73159b60c4097355c58c187a023680ac3f700966c43da368dad4a01a68b48cd26034df5e833002652029c31124b83f724803faee701a992b344c224c23181876cc261869c2d476b8bdf8ad122ea05ebd74f9978c17b5e5a587e0cf1ef2b283bc6c9d978dd3405eb68f97ce438c6a569b82bef6d0885e3d6956733d97625f38f3411fd6a0187f7dfd83c1f6d642d8407ac5442002835e5d40170f0774add6105e46ae15d04584cb08cc906b15775a3cd78a03ba9cb6a8f88b2a25731c6a53bcd4582f256751656b4ef8cb436d8a6fe72e88999f5f5d99f63e418d48c41c09a0537e725ed76784c6da2ba0d0c44bfadbc96f031aab45d55a40f2b151d48666a60706a343d9d9a20850b8f0f2c21aa64423abf4a564f8eba5bb94b23ffef9a0b45eba4c818d74eea593d88852f315b2d92bc990cef8654149c25fbf2c282bd985124c8f164c4a6c050db8e0bc309a9d38f06dfcda18e2bbb4e0f4058910795e9a40e7c178119c4782b9c0e68d4819f8f6911199c755cab5a4b3bd4717650bba1093028309518e6ca1032d7240061feca8418b26399881fc13d8d0ba949dc4f4b7e3c8242e1768160c68a04294214c1185f5049b1d2ae273052dfcc0056420834df4a2461a7f901ca60341522082ce1430480de1050ca9282c81820950448185193a2ca0245192d2282cacd035aafb656d11e4d262fb90c382b56141240bc02feb89164f7e90a4fcb29eb4b6f38106f58726f129dc2c6c307c8a71e3388f71db7c3b6edb32ef65db7844cf3cb27ee697f544f597731ce73a30e7bcc777532e310c1bea4d509bccc34a735d562cc81ecacba74d7cba9630c85e77b12676ea7518cb03fbe5d3d7123e35d065c59e7a8b057dba0bcc090c058bba80f6c25890e3629262f21c03104a1fcfb28967972916006334c074f0ec1d4604c252517e8bc578e31f650305c90ebcf40ad4a88c2e61baba1b0ae43162dd8dccbcc35854e6ecddc50a2165181663e6fda036f4db6628353a03e91f3d5bd3ee83d3d2e1fe19d24d88d0b47c03350a4b61a9540f91d5a8253e4c5a4e9e3d83f233d4845b584a6a9b10cc30e3f282165a2e2f70a00a3e60b002137c20a40a013861c70856ac200d38e00118452a18482e2f0ca9391031182b5001e30629bfac2847d0aed8c2cb43e9e1f4903dbc2e29e764ae6dda4cb6c7b44decf150a25f4808306ff9ed8690a954fded8688a9940de6d113fd76432ccba6fb4e0173101829ed8bae82e66802065328014a22831fac16291f27b4f8628814543cd9bee82abe2b891db060e5851dbcc047ce1186bc488209a038a20430beb8e28b2ca492f0880c544d64b1f2f1a48712849a44c103297664f0238599a4a3e20b2b7cc17a0ce33444c141e6048e5fac8658dc45a9f43457162a80f1ad89a51e2ec7300cc34aec44321734304ea2f880d2c587a52f58a8e6f051a8e2f051a8d6f82854fa285463be67a1ea7d14aace4295c647df328e85ea0d1f7dd33816aa36702c54619e85eacb47df3a8e85ea8c8fbe893816aa323816aa2416aa2e3156e887946ecb47df583816aaa38fbe8d3816aa2c1f7d6be158a8ae7cf42d06c74255e5a36f2e1c0bd5fad13712c74235e5a36f323816aaa28fbecde058a8761f7d7be158a8721f7d83e158a86eda47df6ee058a8661f7da3c1b150758e852ac6b150bdb818aec4d5e070e072c80114b59fa6d3971e794829a504bf3f7afdd8da8a995a995dad4c15b61e438dceccbbbb3a667c6401571be583fafa36ea72f2597b39e050a3f499b76daa9d03d68606d198df26d7def7de6f18d79eff46b9f668fc966d1ad79e0d0ff31bc7b5f7f25bc7b537e33711d79e8cdf52b8f648bf55ae3d97df54b8f6627ccb631e0a3a904a6d7b4b77433f7aa3df465c7b2cbfb570edadfc16836b4fe53717aebdfa1b896b2fe537195c7ba2df6670ed75bfbd70ed71bfc170ed6dbfd9c0b5a7fd7603d75ef61b0dae3dfa9b73ed61bf79dbc7b5377f8be1da93bf95b8f6fab71a5c7bfc1bc8b517753081a2fe6c306f6d042027c8944fa65f1649be6840042804f0f702329452ca15412fa05d7aec1937a879657777cb3e818c1d657797769453a6b6c8b28799191f6868b8bbc4a78e717e3f9953d441b24819eb4bcedddddddded2892e9ca98ad26ba70eacb2e17bb957ba899e8242daf895dd8ee2e17b1599d84856b2ee675ad6c9a0ab77172a77639d6b70ba2aed2a18be797477475a14be18676779b1b52596119b5ace4624ee91282d6b57ac27a8ca166a293b49c43cd442769b959c10b357a4bd1cb8dc40069ce90c12f33220c13addf242f0b13634594bd85064849f8e3c7af5b2b13c460d0f3e5f33d5747f1a18c6ef9e5554a571f62a9568ccf8218d40296f24216b7ee55130963d6ac3c8d2c168bd5a4ac258ba8641b9965dda944f85a4da06b67426154e6e35af5ceb5ea9d6bd53bd7aa77ae55ef5cabdec952d76a275bcd27b028e5a4945276a54a22f5ae216ce2c9e179f6ce691d465d3d171149248736c9617515b85e19a94da47b7ac5205fa9ee893312cdb8ab2c4967adce54192bc3611417246b5dacac75b1b2d6c5ca5a17eb62713b7595a9b85613230679b7bbbbb732c8f287c13a9b5c394e1835e710141f7308888fdf0b07c8efa573e174ce04da59d587bd43fa09c4851d59856d4be1b56a2335049fc18b8378788851978f5e81bd02c15e816094df95ead5f49c74adfa894c05b3b51397aa531fb6ea52cd1f06bde80c2683c166606060604a254a49b5ca9e69b26d69db488569201fc2744451df1f1f36cf75844dcca4723c832e9ead99438cca962c61c2c4891328170bfb32d5d57315b988307bf3f06908a3ae23176b74b1fe49cd2e9e58e81d989f56311346311436b1f39093f601c5c9873ef4cb507c0c7de80d845bf163202fb84a7bd43b3b1b0c0c6f31c6ddb871c187f9e95ae625d0069fbad26d7a37dcc8cf3c219b536fdbbccb1bc223620241ccf8f931400c1b79868479cceb8186c1eb9b591fd40f6ce21cfdf900e393e34a297ad13c70b7f09fd9c371a6c2704ca861e91905432243952d988161358c13e685c5c05a4c50a387a52630a1482fa1465782143d512401092398ef274da4463f428d6e841a7d8bd0ab1a9d084368286af4dd1a18919c91411b85a5cfe9cb635206370a1f815b2e26e487db6c4d37a34236ef27d7cc5f1f0c4988e6fd8444c326b963e6e557629072d760cb89aa36addf58ba433787bbbb4b22d51ad2f5f8b97fd3781e36e40260ea7099b030a8401a861cb41ceb6b45163834508dadb4cb55d20ef598ee2ac1603d49ce53c17629a5f390eda5f8a878e5fa0a341a09bd8165c586114b97637d61462fbb2ddc0c2e64bc24915c7667c888f132a3a5fb25dcdd5d18ae85aa0d0e589bd9d3a630b0d8c0d1b841c569e4548f2b236bcae7715255bf1fbfde57d42e86e3e2f28b72a50fbbbbbbc62e0e59d3ee28e1eeee86926e268ef22974e9ebedd179481a5766bf0b001f60692c2068ac5fd761e77d02806b2b6af4dedddd5d999652dae01a498dd5a78785eafc48851a5d7e4441951f9d856aff15aa50e5ef33d4e82c54e3b350ddab9b0b2eec90ee20c3377688339c085abfde5e3857dfde61a8d133e2469763bda3d4e821ddaf23dd19910f3850658dd2761ab5e970e387872b563f46ae10a9562c912ada6c518b6bc3a2c2b8a5e876f86e071448b2ba1d0a14afa083096cc5ce72c880966a2153769e2990646540120cb28513996a3e3538fc8e7ca6aa51a45dd2ce0c0f0d4bf36994103e9acf0bc120bbb6445bc2a750fb82f685f5f1914142b4899dd25a4924779f1762653a0dd50435968abaad0fb70835ec0fa79688b9b8bbcb91f9d4be5f977bc178894f547b92d1a164a9582a954aa58a3eada8e4a7098bc562b1582a954a25552d553468b8e77d5f4c4ca986ac51a339d65029629b6c504c492020205654812029e6c49dc8137b582c164bb23ec98af9624aa51a3570c021075082607304eb0ca5a92c928f03751120e84e22d54a9b5420d20679ea0725b904c224d02581a6049212a8255029b2e310048721cf9e034f0e5cf4909060a703e4a2174e22cf6eea74c49fabd541eaa04373d4a1bfb9c3207bcac7f4a0f24e9b429094d13c2fcb57c9e4be906a5f582bfd4212f685a4eb0b7dce9d972df067ab460b0ea2deee1e0d38705d0e2dbf9e5d290c08692e0660431b256bb4b9c00c163e1f92bce8f9909260bcf4c200eafb4370ca26f3da28cd59f37e509b26686ca8ffa0365996695e075e1cb0369933b12c9b10500f41e60178994af9fe10f1653f06647cb174127130c7786a89047f12fc42a86fdb4d6a4885943c7bb1f3cc5ef03cb37777f96e8d10ea613b7679e1122f2fc7bebdae8b4712fcf2a3ce42fd07a62b6db0ed9ea46cc6c11eeeeef340227e12cc1e6ef492e0752977d79b775dc654ead7b79d8062fa6edcd61c14984f0f891bf918e6c505e708a6e4a687c41031357dbbdae34df6bd3693dbbcb8a6cb27f75d2a7f7160bbb8e9bd34a073ce89e83ece89d83cc606f5880dca7c9b7c0f9b1e362cfd08ea9be76373cef3c1f9b6498b09528fd8a05f9b5d1e38ba0ca2c7f7da6c25f876e9cd6e47009efab6713b51f6fdc05ba4d77575739b0705f524e8474a63cc784eb16da3a090505c2e3d242ebf99cf3f444c7d714d190888f801c51134cf23897eeae0f7b0c97ccb3c1f993701c511349f44f37071103d9ee34f1b9628a29f12fc584ca5302931df2627a1c064e744b1ed17715b637db14d450dfd4b1f69d0d89afd6b77e6e03cd0b3c1602c31a992c1b0b44f6a585f1496e03f1b0cc612f80196c60282263d04adb09fb0465cab2abd243f24e64bf7a4112ffdedea35d673bca4c8424a29a5642eca949185ea35478c458d2e3fab2bb34ea5e496524ae9de25e5dc95723462a1e96e2eb6cea2465f29a5949469a49cf9ed2ce4ce3933b9bbabfd0752b050b5b4b4b4b4b46c38039adc23c9a82a4b6c8f4569ceda17579a90cdc3a803cec34883cec3f8821779189d107db4fb2af791b64ffbc0f813572b9386b89a1ebafc52ac6571c8a7de058af83122761968d24fbd2118408412ea01f1c322804121a40f3434cddf124ad06f1fc19efa4b8241eec0027d77534d847d135ba12d990c95ccdb1ab98dd2c087a2c55ea79466c6e4c9c8a48c19c5aec999c2198d669a47aa14bba6cc483e32a4f9f59910f47e65a86432aedac44e2b098bab1ce617e6b06a5408d6c46e821e15b0fa099f5883b843c5b36bdf1269a831665bb371b4e5535a28c718dadda5d8eeeed2ee6edaa6eeee4cc3a8d028f6b451b44debcd5a8cd124e512725bc64d5ba913851a1d0ab4bbbba75c19391ab18c9a0b29d4eeee26390d29d4e8dddd9b7d7b7c1a86c8ddc939b99748806013fb916dc3bcece9637ffd7cc92fbd2ec32ed15637ecc3e4a6b587dc671f10479e1d88ecb7519987154a8d745de35ad34aa349b93a3262b46d7fd551c6711d1239da27095c6c527a79fd971008e872c80f08306a777d17eda4dceef9d4b5382322986198413f412d36f204154427b0a640f92483e412234a295b462c2b2a3545d4719b9651ec9ab239ca20cd10b187cdb1477397b3513ecd9841addfb614caa719ed724d6cae49762f3d7aa0bba134d3364e244aa92a2c1ce6ad0dcba8c5c585240346c6cb0c517f7265a44b8f2398b2996387a1574a29e5ce39e737e79cb347caf639594a97334a295bb06d294c59918290b32f6629e3bc3c6e6b2fbe8c3de48fbfe1b3d61776e26272ce39e5ce9de7b93383304a1ba2f1683c292b236c0dc4ccccab5f5fc7d6aff5b92e3b5c206ea04cf472c3035b42e4963bfd92524a29a39452ca29a592dfcc08299e6c4a518592eb87c6d27a34cd0a3d8dd25a6df2e193f6c3a015f6a48d61c19ec7b02e07037c6c3a3ccd9ba0369b6bad46694db41f3e6941da18f6a4ada1e54527d6c4ae79f105cb03bbd6a451336d0ae2534c31b8863d45142cc8ce335a93881367f0ec51c502609f69d4b6e9e0d9e30b626adbb68d531d538dda4cdd0d8d293ed15d506ede0f6ab3797cc1a29cd82e6c5e5a3633a578fee1d9f02452635e055e7aa71461664b71ca6a4b3dfb558259535a14915bce0ba399b6719d28a5aaacb08c5a62b89064cc7881f9d949c915cccb0c1924971837d080d999ad9f182d239695d97a76151afec2ac9d56a9d414d1ceb377eecd88aa0b88591db769de2723aa3016909661ac67a75f0c297e7187aa624a2e4f7f3e5bfd3c3bd605d1f2d94a0da5181fd383ba2ba3861a2d9fb5a860c695abadb1e197db676a6ba477118af0fdb1af5cc9d5d6dc20a59ca9316c4cb43a49658f1da53227816d79f9b471d43c862a3d7a7b37393adf0590b0c7bc5932fc35bf979b18c65f5f787d37393a37393a5de86cecae8b4fd77793a3c3e0fe4d0eceabf82607e76f72825cd74dce0e83fb37393c0cee4bee2627880ea3eadfe4e4f029fec79b1c1c3ef5f87dee76556e72540cee87f52627e7260787c1c56ab06d0fb5bee4624872b184b989612496e4383eedfc480cf6e05a4965df48229d26835a54527d6ee79715c549142fbc2a68f5cbe2c24994275c5098527afd83caeeee9d73ced943b2532bb3b3a79c73b29472a5d4e1f23d6bc0c51f5b938451a425ce047432d334fd51cacd4e9ebdb750f9af18e374c2a86ba74d4df8349d67d5c3ba7cb8a5f37c2969f94b49a3321e36b1673c4a3ee349ed346a1b6213bb0f1e202b9c1e9de720970f37e46af1b7057dc1f3d38bf1cba1305fe7169f5cae256c52922979f62c1bc2a8d6e91cca2d3e919a23b7fa8da149aee84e63d69a229b52ac299f165c6feea246a79768ba94b28bdde75377f710cfafd68aae832dd4902606e6030501a05ba874ccf735452e15cd0000004040009315002028100c8904a3d158220cc30f14000c7fa04a5e4a9e4b234912c3288861180621428c310410800c02244684510ab0cd449cb75694f6a3953a2f124248d26c8237e140c5de51d2da45942e72876ba1c4ff1797c08983e19f58233c216934e42122a86c5b0281f67179c86404d848a4a362c05091c92ee172a320ed6330bc5d12095d5cd73480119eadb0ebf9af6b70409f188c9af4f9651ffcaed07b315df5c5f881bc8da12142532b3807239bcc3e485fabda2d5a1efe4d45487d5b79ff2745594fca67b971757ac87dfa60f9c90bf7772feedfd8a8f9a708161075af3dad05357ebbea6ba51136946d891c382d0884d022cfa15a181d3de8290217508c054642bf86b9ab32f91c1dbc6e0913a3a792d2a17fca72f9ceb76b5f3c94e9f11882a974acf22c1c3a07f0bfd96e6e946946f188438ddf269ecb0c212037bf4675e207d192a7ed30640f2738130a5a6a53a1bb0cc40bd735ed65f8e1c66c43423e31d2e187fc45de3b22b07718c726920032d3e2342a598eba4f0b637dfaaa229d758cb24ebd040b19519f0bad2d001feea2b42697c60458e71f85c6cde143f0d6134c7f327ad5686a431c4efc260e071200e9b5866c32ea382dcb06face99cee8063cd836ef2657378814bae2dba9f747407f6f543cefc5b6e159304ecc1884990f828c385f8457a0b245e5c47b351c06424ea8aa1d794e0d1baccf22745826b18cd4ff1e03e6b1925613169ecbbcfca268ce5b28506ba4e794cae7b68ee0535ecdc8d7474fb163cc3b4ac03a4e15af0abc44ccd7da883adba166f70c964f888e1810da1c724c4231aac04a7fabe300cf0416de9c6cb79928ce5ae4aec45e6ec4000ae20b23c84858e03ca99cef461976fcf40b8ab30b7c4850d248b7b9e2ba27b62181a8c7fa8a5e5d7c30c19282bdc8dfa9ceb51991f7335154a5e6618b6811f9162ddfa46b8f8a4e159d0f7e29eb6f5249f25256fdc0eb139f756b1b059de5adb5239dae4a97d3efbbfb6420c1f367e35498d701cd1558b9c359a5f482e7933462705d043caa7284ce87a43c7b72f1391d24ae0dc17925bf1695a5cdde6f8b88a73604b122c728104ac3f29e0ff60b063541707342af45fec882900cae7b27d970d6a540a6f37536409203bf79370c77420bccf841ac4456ff8d69e2d65f4b5849e25a7c12db56efd90cf8525ec4ff3d5ba23ff2b651e647e472146d7c83e6745c85f6709b5a25b8ec3377f5b6ab55c301a5332b8f2c62c82e419e2843bd1695405ee77aa84b58ada4ffd709f4c51d7780d05c3e3053d847be3b8fa90bdafa54b0b4186c97cf60dae04e97b0ae89a60bc2c92f43f17806203931721ed4137547fd3a3726424fe26ac642092f6924561426a09b117096ba594c5be3d8981d05acfbf336cca1156874ee53879ec966fdf42bd874bad56be690f9afdced68ec88d91f110d209822d7e2545dc1158c962e2d9bb575beef846e1b4e12a9c3a03b20433287fbb7e522836a729c08e7fdd82da2451855b1aeae6bdd01059156d78d468b9cb4f949a0d8284ee4305a3080ccc25a5b488def7a6e9b5278ee7694664e710c48c7e5cb8479edc2e1f85d14f64fa4519c9c5cd6338d033d6ea82f13139741e447ef622101a4091fedfd08289318d482dd98436c2caf11c9fcd06f7221d974d47c574dd5849caa6722b90eb68a42b41f9f4a836de099b52bc408bc68d3764fab0eaaf40b18b615ca52d04a65be23af18920f71c8382d1740f4c19b16c4e53b6917e9ad7f1839ffacd8198b63bbd69370940100f9244f1d9603d3195118efd761d05a49b525e124220abe5ec106d10d9d47fac700ad3e6d3cf793f73ff81aa67a2ad31de42224489ae5e1bffb84aeb19133028035261943cd0a07049a9453aa91369d6534d3615771de6975086c42fad1028ab8bec74c01469108f7fcb1433f49302ec7aaa94f20b2d93df4035aaf5f7d1f58a70bba97b438025a659e99e288a8b1b1754bcfe51b8472ed025d255c11fa36ae464da687e0576549fb324ec2b6b888077ed7d0dc3e2ff1976deb8862a25321087031b6b13ec8099daae50a6138803e5ff6daf62636c65e54b96ab4e52f758dea57ad0920d4a076f1e07079f881f0ba118ca97408cc9710335f6401b420bb41a6e1ed86925144f260b239b01acb18a683d58c8ee497963e6838e8800cd9f5f856b98d5b7b58272868bfdeea1c82b4a0c492988067af1e598825f2ce43fa6e70a6ffc8aee102668e4ba18a0e182e08d7c24c38283c3063598a194fdb1c60eac8c08d7046a85071ee380c03b7f7e391ab8486c2fe111963010bd7f5818b3c16801a09ed8339138a09ad5bdea6fa64ceb0523ab621b429b4c97016a4e875a773140b08784928b53282f51ca03d3e2dc9bb3e638494fa72cc3cf653ec043fca793939fb0ca52d90aa9a54e794b7a9bf1dc200e943a4d50f0a275333faf996175ab2b370097e41b9f9f6cb3c7d73eb91bd861ecd81e5a3ba1f205ee1597f40444025b26e176a51c23957abf656ab932205551630ba565c16d4797b0578e5a18e2704e06f016feb605d2111d4ce977bddbd038db2f388196e704b8a9ed6bda4d7db5ff70a0f412811624f23bb5688ea9110620c164cf15762e0802b8ea0d7598676cd27abbf9abe3c472bb4c798af4785c208b9c23e106334bd35dae56df41c78556864cacdbfcf807eb48dc590fc7a74dd3a51bdc1b19fe4ad619a0fdc1fa799a6c33ecf2fbc4a0fc2ff9c8d22ddf6474eadaf3110dce7b07c87514cd51c71089458c576b2dd841871f5705f54ec1e8c04e5435706a202b3d1f102979dc7fdfcb0c7973385598d0f0c187efaa214fa98c2269ee6934141cb8c0b38b13cd45cb3edcadc41dec95cc6d5e083363a976feb578aa1906a4b3bed5c6c5c9ee79f268252481a279b75d6c3997940a12f6a8083b0d3156e913ff8c273e39e69333ba37d0e17a848811503254b5b8b1bca3ca8b90852895b91758ce0f6887419419cf430544c6ecc1c80d686a8c439fd282f8e05a698c0b8d81421d5c462a54bc64f3e2091456ea019f627e7fc34e5ca2b2a16cde5e009fddd15f51d09b74dea706105294899f73730e0a84f194569c5bf5fb759c122ff6eaba5a18992fece9e9d15c3d714ef6863b5fc6a28608bcdbbbb1f4267c7e9f02e30e178a9fdfb245279389d565180050f590f89298472cc98265b453f4f8884d48ffd8cbb6913a47b0c13cf8f1593a1c1801fb0c6287487070d0633e0b8b2bd8dcd2870bb6f3c3ee1f25a987717240ebd8865c514b0d79242076355bedc436c33fd80b2e7b499c34b11471215351f83d7fbf89a5d302cae111b3a5885e95150f0b0af66083edfca4869c79f07ca7d2d524b82ce12eb6ee25b70192c476fe84e9d9b89888618e15f3afc35e1733637927d0b77c5b3f38b86fcc72b2ef93e332cd034047bb7d424232eb8629a8d875751bdf72aebd6ed19535ac0faa849d031afd1497518ac6fa8ba506071d4962bd6b1d9753a6228ef673856263f4b920a8a4ccd04be4fe6cd61679fcd6224d60ee728d9f7d9098d09f7ccec84dba00e466ba3be6743f99127edc01331eec4cea0bd740d65c316e4e9cc04c519ae2e9e8060ee58ae997e3dc138a822815e71ad259a9ff3f298c1f6607c685a12154d7c520605851cd904ca815e6817da47faab3c8deac607fbd83e9acf9f5435c6bed82b8f0cea8ab873b3517dd0b88b213fa97e1ec09002d8bef3ae761a4eaf80b7262041857c1d1e0ba7ea10e9e4e5fb271731ad72ccd977a89ff91aea413882c49c6d83a38b16058d8c532748b687edaf6ae76ca9e784e9b22ed33e4724b8a33904b51e52eae86cc93abb9bdb05372f50f304cfb10106b512b2334dfd9e10fb490d135d061f63aea8af2b06e4ac3100ade10944d80e6eed2057f86fcaaff910f8afe1c4065ef80e86d89bfcd1dd75d76bd5e97e09fab2e68a3da7978ba72f2d3a928d6fbaf2b378f986e19d1b4e3d216e0ee3c935a73b5f202062d55918e5214a1521af1bcf8bb7d4732d95992200dd0e46afa1c48f22aabf09eda2ca687205028cf7c9b3e69a32383bdf85b5b4f793a82bc3cad80e1011f92dbd93a9c5864dde692572a6ba0ebc895c4d4becb4572b225d28ebda37542eb44cba57d3af5742f39d617e76cc2042ad70fb36bb8a57d1d911237d6276e386d026c33d791ab81ca13010c1059936c372880c54f7572491b41f621c53207efacc7447f2ea72f25c24cb519429e9dcb1e034b83c6b60381341997ceacdb827ead72ec1c184a6237b501cb870b2f63c46ca1a5499721aeec4d695c26bba1142829b822d60149e66b414f4014534583513aaec2e545819e9bd17cddc1888aca8498064a8496dacad0a5d4f6a236d55683d491bb58542e989daa0ad0a4d4f6a035d4dbe092718746c2b47db1b997c8741aa37459bab73b7126adf83ac837e4651df748aaa926dcbfc4311f467d3090f186b626e28d64433826d37a6476d00fc867e5973ebce6be6955cb233358c7f0e0449d3b433ea1156565aab0fd16dfb60b7d75b903569a05e21166fb99a10d5d46104a6aa495a62f33f6ffb32f9ef47999948064f38a636ef70f550e0fa7bb41de18936ade994b43f866150c8679056650c461d1511c1f5698d7623d457a0e54a20b56d0333cda9b14b0134e60c901f5f8c4bb40d8d75d57f2a285d4d20cb0f99df3a93523cec1fb3617a7b9399ae3bbb1d7a66f7fbd862240c3b119e7ba101f39df1c528da17642aec818f176952d2cc4cedd3b5c0af925786fac77673bd7d06f81a27cf7ce09dd11643d3a4f02e3ada82d5b0aa49a5ec2c1fbbb29edeff9833086fed70ee102c667326987ea78fc39c18c093bb2b280dfa14131a3b4bdf4ded712e5836f474d123286007cc6a4260df6a7fdc3337a33467b5430ec1a305df5588013c28ca754992cca29e0e8077626d4effb3bc05011d1ce5ceafa9f998f9baa3f28cdb8ddf8d75a41569fec3981be5a1f7156de67e0c02178e66e6b3b568a66571d90ee0998ba98f309a937354331de7105976c94b4683a034fe3a13fd56f2ce396e8c01ff393416cc00bb7c5499a9ecf9f29ce6ee1aac07cd48f61d07afb41d1dd88a51cdebe3d96cf0c5a0713f786c4ddb681a9637c395240334e221c86a00176f76b5373881d0a45f3d2ad9cc7c3ce6a9ed4f49fc26b8918b1cfe2f1bef2ce55aa9b7036152d2fbe5604a6656ba734c3cbab3db66a15fedeb30c1971110d6d0b6eed00841149dd41be1c6dbad57ee074bbef0215f2483d8e8c498f499ba1311246c9c86a559628f74e93d8485ae0a43163275f99dfd6ce441ef77bc0a5e0a51fe690792e4e78cd968c2ff65ae368557c5a91c15b076580f60a6966cab4b9a8a5a5634cf9d5ecc4b8f7c92c1466489d5b6d3654b22d297ef4bdaf9227ce87bd831fb784a8ad3bb64eaf0fd4d6ae7b9bd1bfe9604f8e7e8cfc70c5e565c21d0a681dfcb6bd28c638f8e0c783d73debfcfebf3b1d12b083c7bfb7036b41f550081b5fb743f4017a49e35790aeeefb2c1e66593dc60ed931b29d5165f4bf33ab3521d95fad1d71e0dba046de8abf0e82942d496e828f79c8b79746df5d08b8db56b4dcadd21d608d6736ccf99c4da7f3a4262a3d8945b7b7ee53e32d30729b2034699fba48f14bc1ee51f4b8e7599cec484fafad637ce7b37f534ff004f08b0d5f861ade0dc9dba2813c9651d749a64c9708c4149cae7c01589cbc7eb78bc479b96a5d511c4499a6bb4caa43fa078327539bfb777a4940e58da845d3d358cb7fa996be534fcdd17afca53f8b75f5c2ba7e1efba1bf55b3afc99620f7f83f544566cd35f90a8754732f2aafb0ff4568e4871e5abfb39aed87ca04e78347c8814947196dae9457e4dafbf9860a26ffc40fbfcde826b4e3e8d691d14c51076f8397716bc1cc7d2426a02cb37de136c5c33eb88beaf6f4ed6b6bf6a6dbe76f9aa7ca21777927d1c7e04d3c439b162efc9715a99508ef57b30da7de07b0e85f5e72ed458075d481310dc8a02c70621ae4eafc2e4bf21966d593df0cea0ebe25f702eeb29c1e17477a0ef0db09f9c206f51b988f000d3fde3252b14c4bf434f1d7a3f95d02db93b472fd04408d8a006ae8c1f4c4aa874eeda7a90fd6a1b31fd41cc6d0b2c1c18e9670a6ec414ea469997d58901de37391ba2baffa0a8ab9a29342ddbc7543ca9cdb6df9c01015cf81c40a61c84bedf72cc21f91ad0a17f03350cbca8af934ca1c12ec68fbc7ccd806148ef6d4407c93289430e4321e04102b0f095e11b9b9e14b835628a1d2058000f2fcdc2f697203fb7269a267ccb2d501877e7ceb3f6b269b04341db31b165a726a51b4d10f81ddb492fef94ba146d01a89c4a45e8fc9d617228400a6892f2d1fc38c008f25712eb381b7b112b9ad30a9418cd64d346ba74394dcff9916303ba118ee95aab51d16d374be82874e66ae11ec56b8a8190bab825ab4edd3ebd5a448de3f68ef7451e70cefd37583f873c98258e7559e26044ee948927b307b9260390831c99ba06d4b1f056f7942e7a70d1672ee2a24784f232578c78984d2c9f1ac82273c0ef3a9cf750d2422ada7dff69ef39cbfb3dbf2c7ca0cde714e25a2a4d2c7b5095591829c2f68a9df4545a51988f1b951782a9256130d21e88cf5627ec67de7ff4304d8ff10a0ed9243439b96e8c56ba4521b335d55d10c7df7e0e4e1dc8304a4ab50869b31008b0b1a80b1e88cc4c0683b7b211045b2b34a94980a7083ea98fedf8465700e1aee06ab57384771f1dd68b32d5d04a59166eb0a5bca94147d8a905bd040901955f39d4bf204ed0b5bb7b13be7a1c04b82040592f310ab10c1bf725338c12283f7021afee58291986f0c95e0af7f5e5288c79e2429144db4ffdc30edd14159159992e9bc63591f146a1589941ca95a7f276601360f0dce435a50685d5ece0f3806746766988a4294407a931c5854594cf15baec264a015ffb86003aaa1b5ceeb845d5c96df3bb2d9123aed48d3bdf22dc75da97bb0e3fff65e06341359022ad0653048e93bd49765f70e24ac29a736d4fbd63699abdb81a0a359be35305cc9b0b1987ecdb13d00562626345144d0755158fafeb6fe51173ba764584fc7aab95a05570b3050c7006b69d97b2399a42b057329648d3c8a6f4fd7a832c26e471660bd8b0c7bed3831850ab130ac0a2cefdd66080158297e435c76fa1eca94c1c0ba4f5c602c0ebcf9d822467faed0d69b064311743caec87425f9948cac5eed0b5b7aa06a6b829e518c66cc3e3d1e1bbeb923142e5d9a50804d29b786ec9a88a5785ea31ae6a5c9bee5a22c417e015fdf38cb05c6c19565c8d745a345e3d61e263e125794cd89c37a0c267b2595ce9e479a7938d9b1d6dd853bea448821a3ed930806c68c9370a888cffda833d1eb2005fe9cab29488fa60f49b0934f08c85f51a9577cb200f52143987bcf2433aaa5ecbdbd68aaeb3786adc5a0e04bfecd8ee6c8104fcaa377b2a3b07a62e5133f73f54316bcbc9671912c1e0f41dd267dbfde50fe3adc4e1de0bdf611ade0c407dbcba1b7824662a88aca018d6e8b2cb42d008b5916c11785bf5932d739582dc707d4e9f825aced1e35c27e483fa32424f4a3e2c12e924e464c00e384342cdb82bf9dea4e0369496a8b54f900170406c6283d646461e1638324e6f9b6c53e8df5f4e8a2899aade3541af39797f07f787c992e69e465e378651b9a4e63212237205e1b12cddfaa10c09198d5334d5cbf6eee2ff333ecdf7700067703c1f79849671613acc584723a2be0454a92b451dc9488dede27387abc745960507626b665cf2f0b4aa5b1c73050db3ac52153f4777dac746b72d095492bbe49eb318ca0e78b997bf123415795466ac33eb90948a5fa3bf3333cc518056b6dccd8d7ce9c4873ff33b571fc60a2ff5459120b9f25b552b9b8677ec0d10897ece4205fb02a2b2a39eb1c4413192a3c07e97176319a14f1cc505a31e88fefd8683914381d987f214d4b08a976fd6c30186d55e3c136211c8a79ef582711277dbae45145e88e0ee28676c183640322ce834e47633f730b9b090afb53197bde057f84508d1913ba742908a0144b9bf1e8b7d721f3cbd9b8f4afea4c9e0c1fc3b8bdddd8ab38dab2c305d18afab2d29f68210382744dd553c67193b58fb3d096397f2d7f7a2223362f0dcebdba9ad876613e5d4374c8602d1b45ab8d27522de3b8a4c7f0fbc0419ec9a1b7b9c1221d222e8fa19a637e0b56b3773c0c50df422acabc2125af18792da2e757ce2220fb92a1416b9c5962f8edff4f3f6f9d8edd4934523071754f06d45ef20df23c90a698a3e557e0488b9c6c887901ba291e7e20ee1c985e592a3ab6c8bf3001f6e9160a5da89bda523d64ee08fd5e8142beff249495bebdfc978adca1988d03632b03967f3a9bef130a1fc1426d89a7ee46a42101c3a1a0da3f6ee8a337dae28587fa0c316667f0c1ef7bdad7df72624bff41918e14d66084115fbe77f1d88d9e82c719790d0e06648ebbc985bd924190f616731cc79216ccd456a5b879b8f78f949810998ff8466d6025cf88b7e47a0de55f7ae2886387774da510bdcbc2677c1cff5372da86ec748f0907de3c6c0e5468f4c0ba978404ef99ad60b52729a0a469331bd206ce59be3ad56578f6afef03cc53e41a13c29f1badd8d0a7b06544a40b2beba80c28a843e3edca635ece5368e4a77cbb0f2a6d3613d38a9697f79f429b9574bb0a9c9edb78e6aa910ab8c0270d9c2752aa8531273199401579e8007a07ae6ea68d3ecac19b01f744004998444932e867a727b9f6343a719eab47108457517f52e469578026cd1619c099bfa524587ce27ddcef8f2d580cc39ec1888f3adca8702cb2f1cc13bb7f0c5a140fea20738a4f6aec766cdf1697c87556ee374137cbbcd3423a43f0b5b64e3d9d770f7c16bc2b143cb61b9cd960e3b50cba46d138df1b2739edb894dfbf02b00ee6cf4f259e2a100cec68e60be5c5676e2e3656799a3e9fb9b7255a5790095264b74b0dba79bb78b58db2225c6ef7275ec20f37e751e57d88a16c8bf0066ef7476619917c3af7e70a65d9ef3e1b6f16b73a4e8105cd64b05cabdba601828dd37e095727e1ae1a267a923113d91b6d2e856129a0251d4fa4c965d59153351b123a867d5e74b03a42a28d7719c51b95b82ac427ea0c8f6d7411c834514d61d090f0d5ab38ddf056e2c5c21c46eee2cec0063fb1f9777c52802a5f370121d43893313a98057e7232a94c9f7902359807e2e3bb89eeb69e4afa3cfd46782ebb177156ada09721d8b80455540ea042ab1c817062fa86f106b146e33166351cc80668d547973c6d6c6c490afb434234f276015a4005da1fe2673dab7602f62d0b941acaf17500048215481144d17b0dc7c0958d3abb8796d03a26ef6ef9d9bc44b18533945005cd2804fb302bb34d53a2b232c65a9fbcb804f6b56a2c1cecdb8645161d76ec0553312cb9b6c54fb1858e4592d0f7b7e19398a26c743ffd554c1e95e805b04c4f705b3006d4d8f67104d022a2099852d4b7cd86d95848337f3a5c47795bd84972cfadda18c9b1b9b31462e6b4b647dd051a11175d4d7373e7954f11f9cfd1e969ef853c1a35fc60b760a66b2fc06c6f3187c88afe7f06558b27e082c501dc64b90c960fde91962f7f9f03e9678a2beaefed8c52ca31faef930b446062c93245581fa91cbc34a6213b7a2441b3f54d41ddefec2e4865a09f13a7eb33a0706244b283ffb9cc2e5fdfa9ac4838284b345d36685402d2a39b4e88758772756d64ea605977adc7789f50297cfcc28e184ccb03ce2dda0250ae32934b954d98cc6ef4409405c4951e44cebbf3e7fb8ad64232f85a465a265a5853587e33ed9a0cfea2d3178a3c8ef64aa3779765d8561d3419cc1fd8552dff46107ee0aeeb2ea3f45daf9cc6715019ab5654a5f69317745619ec8e11433a78aa47a9b52c6594c2d8c96bcd69af9509e9d5df5bcb2a968684b227fc037f25bcbd273c40943eefa46c3c70dc4027823e007a83b78673387bfc325a1d0530b4ad46794844aa02d219b6beb2a717803a124bab86711435496526f78de023b46e261ff835559cdaef38ad9a0f1d10c25104ae5e1ad4ed3997c56f1faa81a8d82c3f44c5b92f23413371fdaf969a5fda789e0bd8fb82e25513ccd81a5c1cf47e2937a9fc00bbde63102aea8b059024535f28344fe121233787abd40be8cda78c5f74a2dc4966f075c5471229fd1f32658d8442baea915f122a9a52f0e6dfbdc270d722027c54737760165b470f1cbf56508fa58995b3616a33db67988c0394b9f6f2b6a1ac9a6c2b027b352aad7b207118ddacf8d4d6de9704e263705be246e777510cfba7d65c868bc4acb322e79160c68b94b48a9f45a55c68536ef8ae52d54ee38c32d43c9bc1b547f4759b3d128924e57f17ea04cca15d93f541a872d2fba2710423a7b344c940ef7b92a6c1615218ab4e60f0d57505b93c271a65b8321e48996f130bbcaa57d579afcf18a0520afba48c54cc25c646671203133f18b42a6b4458e57e4e70204548199cbc755cdb17b293db6cda503612be8d14de2bcf41a9289c4118e41f1e8b535b0fdac95993bad7c980b50f3388105bbd7362ee6b31007dee0d52863b534ffb4f39d3e9c76a6a0c04bfa0de38d49f98d37579767302c8c6b96d4e70d275ea0162b02ed87e045f114994f1a53b14cceb8a31e8fe2d7f80797c2e3cdffb9c953f37d8597c5f1f614f38938214317c0d25c842ea7280868f3d72a5b0f39693d59552e589828dc0dce153b83b3f7d3544ef6bacfcd5bc52be639227612106383090b133f0b113ea0d346a8afc1727f9f7ec720b587086cfc34867daed2004201ad2ac79ba701997fa31accf8de82acc0b082d1008682160362829d4980715dff1e844790e5c786b2cd34c41004eb872d7aea8e9f297966e8899c312096c78db03a57500dd9220b31c228c4a272f1c927b4e6645cdc8c54ceff2805fdf2e2d7f86796945bb4138de76a222644a8951d85a760cbd84224ebf6324e0d52cd08219affb5609abc5f949f5161b4b7b1e2c5fa1d2da6a21f95565aab569b94207264d91be6c5a1c3f3efca27ba1de1ca1a1cf9cf0861f586118b405e1d8065042d253c9b225c45d6a91d564cd899bae531ccabe2006a28bbd6e7b3cd1fdc59bc8f0e44af690aa0d89d0a10fcce58e109e07a6e19415ce30160f230221de83c629ef169e629181659ae32ad36e23116ac08244ac4d67022e647538a85670c13a72f5291247306c1580a539e23094210fb82b0548c5cec2fb091e12fed0e52478a98af21ff7392202b7d90fe4c681fabecee80d8c54ecd3c6a4946515ddf8dc96426f7c3b5ff64f3463c0fd12d5de1c16d2a657c15a34de6a50cc9de01d35142b68625a4683e32c32919e588562c2f6fdb12cc50f28c3fddc7cc654cf00b8d0bd78c986acc40e9688785226717dabd8074b64234a36487e01526fc98d51c1d1b7be8e108f10645d94059c4e5f4b439ce977a3b603225ae5265055ea0c7b3930cb76f66443154ede3664f6a1446467f117f2181c411a57ffe0d76436f80f208581c8552def0cdd8eaa80f8f1766013012796170bd76278286a42bec6436038190b508c7421a744da1f96aa2f14cc0cf82b0e6d1220d5fdd598815d3fa0342a2054d18e9dc3c5c8f05f6c9b3bdf513c8fd16c93cba568b42706fae577ecd280b4d42bc4c3eafff8cebebe5a037db82101457b4cbd02e1604e102389d32319562465141e78da094b8f248d7e3e704cec13030a12f44260dc810f83ae91c5b5f6fd204d2cfb374425d818459f2a5a8f9c0f1b7e03d97292c982e86d0159635202a870aa77d067ba60727845eed6247848400cb0c3a24603627bb4fd113282800b69cec081af5f4e16488177d67a8176976c4010c7bca7a29a98abe39336e616f6689ee2d14b730c9c21b8cce36bc165e5b6b12719864c2716c096a01469eb2f915ec1b1b35893a8dd99a0178692028454be189d767c3dd44327f6a2bfb070b4a1ef793ab56e669982d9ba0345ec970d9fd8fc57bfd2b2d3365ae93188e4ad4cdeb0ef333160c5cc7cb92cfa70496220dad02b81ed06b073579370131e00490077900b3afc1b5f120a0eb63df9c10835e1976e9ac26a656bdd281b1a1feea659a5f74ba656a53223b660d21839f029a3b974e4abc9da0a92fb4c4cc2d0617e9c81dd7466379d81d4941cea9229c055e326edad45c49b4379ee39318012fab011561b80870f598685faf699030733f9f011b850dcba8576998e6ced476b07a45154f51e97efcf0def0d86608c1edf0f232216fde0c6b350a96ccc3bfc3441d764f26e81465abd4a13c01dc813f5a849d2011db25ec41a2d9fd57545205f71a71fa9965d5dcfc100d1d545460a05e9cb072d399fb0da447df7a527bf8d517c4a0e065517dd030c6fcf03f6266f51b2a1b92058675f8c7ef414a6cde5cf506b8823b5bf894f1c05d619737314e432a721d891db72dd4c9e5db89f8fc2b139bb35ea98e8b061dfb10f62c8c2a4ee3866c503024b10b5723b2b86986b75e2a211eb2c5630c9dbb021a94734e6fbcbf793b13cf795a64ef964860c0648d0692c9cf545738e23a0a95891bc19a55fde72e1ef8aee5bf15ea4fb3e0f6c55197187a68de893b61834c172886ffb6f28b5ef9d2a47bae48b11380941d832a83ae99e5c150d66e3df391813f8274a5a0836e3f34804cccb8d5458813fa4705a28cf4c773620854b4fbe38829f3592f44b21349deb55b420c3439dec04c415c71870588d91ff803398d591cd7f0fe993fb475be89eba71e839517577821fe3cf4b6c28f4d651c70c40ab1f0389097c7e1ebfce867ec11b81bafd0fafb252c9801289c64c555cd568707242d94b76be602477f3b0b8134bc36ca5f2db334f20a510ab77ec55986afdd30d15f8436ab3f6944004fe18742abc68af448eada4d377d56690af08b724d8c59d7ccf88e43572642b4177bef0863b5d8898376677bef9741e181966f69c19858e4e9155c4b0ea1f698978e88b50444b3f55587d58a6b887d3b6339388a095d9188006d3cc1dbea161dade011a68d685d2362071ecf5dbc0ea63e8b117e3547465ca70e13d378497ec586560d2a116e3c0fdd0f53236d05cb32265c789c333c28e9ec9fd88dac1929d191886153f97f4336ecb6e8bafccb759d7b74efc1c8fdeaf8ac8936c8bff29285118ae2a9c5d4968832d8c2f14e8adc6df13da3b7306fb6baf1788a3d7a17456cb7020e88a88a7d6ef4b7cbf79dbccb3838788e36affebc473737a5fb11ad622889082a3eb6eee3c5ae3bcbe32ed03c6d066bc219964bb563ccc279826b738e895d62351bec80352d80f1d1a7df3ded8fcf361030d240d7135e9e87d10bf2f7af6747668808e5fa3ba17074f628d7139344dd0a88ad38b89360ec77e9882fa224753e8672c05cbc21a1e1b814a1e3e37b77f38fa2109982cdf87b1a5594f78356171d2ef598dd602bdb2454be006d6a69b45a1d752d68f65d3e872196067f3cd1df45f938c99a2cfe6a8f202be53d8d04575fb9522bd03122f4ece3db258913319f2ebd522ff5dea8df689835d8b87892efee5927d110d6c0bbf70d5a8a8cd359a8a6e79b49414ff67c90f0b9e5a73e5f65fe467b3f7c397b5b0c87e70b9384592f94babcec533c290d29c060bdae6e5e33d660417102c135e0f24918a92baee43b7cbf370bf6768c17aa6047e54ca3b9729da55c1892c507bed76ceed6f9c42aa11789da0bcd3876a70d4886f1c6c477a7c3dba7beb51198d01d72fcd65eceba6bc3918b981f87720649e6564270ab82bd5d4d7e45b8b09fddf121af63ec6034db418cdea9ef1bc54b17debefa6e079b19df744f378efea53ee44ec3f9da53cea10c76d1cd9fd6a7b4cf20db0e810956246d90ea8035b3b4946893119de69b2577e8bca1472e63373e3ea0901f7bb58120994e31897dd68d32805fbaadc76c01f2b282e5ff69a1830ba7e851b0e92e458cab4580c75db6148ac8a1b75cf175013d893b032ae7d2984fc29a0e4d19d4896087a3e9ae9dfd6c22d302a1b8257c8ee4ce12d87fbde4264990be11f7a56e7807f4ff7de69563f10d79028cb8d2f9e320abf5dbfdae638461ccd9f1d3d5f8234d49a944a70f128dc4833167e712d155895e2f62fcd316800a99044d8dd1fea55a7e9dc89afdd748f8ed93e03b17fd4f94ee413b0052d711aad679641ca1f32c5385cc3ed380579a8f47e45d307c0dae663c23b4d62f27f91a81b73491c54b8051c9cb9ed28a0327717e351ff50089657ec86fd99f0e9e963006064e0dcbfda146e209bbd6257adeb50e705cd8880e59540d2e7a50b92c49e261f229d0681db39465af8d49bbb0f89cc214dcf62c16027057df7b67948eb42d4120f8b71df0441efec06312ebba43c7c011ce104d50ec6eb9816e30ffd1978657bd39d2e80fe3fea755f53e14adafa8ee7f926d53e607aef4bcf167e32ec607becf843deab16b2db43ef49eb44aa8eb2b1986fed12e406636d2842ed3939d73af748b34cb4b423e38a3e4ded61ded1f39bd3ac583bc2081e4ef22e2dd41f7af860538920650ae5e431b8f1bc22991b23eed3075586b0c587c8403ef0f6b2116d4bcff4d68583ab14e747554bae19ce8052d2dc0ae6d434414403b8c9fe3055037b6901de030379952df4aa1c061482a97f60e290423e3c965efe757917a42e3a743521546ea2c0921b24c8e525d6a210e5726232ce88d2cc335561ff598479151b1f20ef4fb7e156e6fb7cda1c1bb6058680e46bb0c6bd362d716b38172a7b2cf0ed75faaacf78ac12d9f2161d6f55ec05404dcb91671a57b4042c741c733d704978d7aab3aa5abac4338932f710b913d74f166d9bc8abf6417f4b2f8976c4d5bcdd908b27a05887f7541053f57810d3c1f1c31756ca8eb940d114841f120406b59f5241aa8c45f03addcd2315bd50497170ce28b3b3b809e71980ca1025fd8129ad583cc1acfab9b4c384a7f54d7590794da65792e0a8dba355aba21d6287859868d3ca15d4fc59058757c1782895c0cd51f97ab10cee214c453ba80ea0d1108a5d8360dd39a064513d1b6080055c896966a6590df11ecf0bc773e81fe171924f1d5248b09bdb32155860cde9ab225a429d40c5c9cb702d054381c1ac315f8632f257d0fbbb188b56cc2b8ca695c74cea54eeb7184ea7c6298e1c33c59285f35d729d5059d73d054ce958e6ca36ccdc9a5aefef58618453fb66cb723b80ddf0d0c53925bc6b89b52d58c34318d18aec4df0dab83c67983ee201390b4dde8406c04217cc9ce19d2c9b0f7dd70c08a83e1cc2dd557c4e98e3a73d9b90251c7bc9433b4b450ac524b03995d71845198f0ec100cd283ffa71400c1a46e725628d8e0f4b92029002fda5a4373cd08482aa8ffc01d8e26c7de4f4d2033957853364a115ff0aa8de3bd658ce6186ab86f2de18334267b6a6d6bd45c11d69e155c3b8e849db12a0ce9da90998b405849b025518141532a1daa80b488b9180eab99fa56a86893c89ef49c7e94ff9dd87aeec963fb3f7804013419df1600c187d03bf2e14c8391bd8265f2c1feab0c5900c05715a50b1f7c7200b3dccee7f598f2a89c957ff7924da97c77bb77d25b1ae0d36882abc093435f02fbbe3a3381364188bb712d46fe20a680f6b5a02f28ba73d741481b9294b07156315c3c066b6436624ea20fa38b25024015cee1f342b59be8b7199014cc5b14368509fb4725ea8273bc57214a6529b01d44655943e5d153bafb0a63d60c4074b97de0abb1d178e07f7172bfc0e36e29148903f24fb4cf14388a70fa3a54a30b4ee2dedc1f4f340249dfc73fff7a7da05fc1838d6a099299f5b8bd5cc749123af8b1792ea0505ea5631a3f2f4df52443d2259aacaa2e030fc0cbdaa07592ac1c1b0384ca96d5adc29dd248892fabb076f86802a41994187d94832f4d9beb58eb82c71caf099aca027e0175a8e830ad56b9a60e327da4c7d014865fcc7a7ca0983b8f80da15dcf20900cfc4fa16358d4efee349115f84483ff5c6e5a8e69d06f4ca4121052cc9066f6d6cc6a3df86147a929c649ff3375c767400efdd874a8800816fe3ff43145772f237e8e421f6e6575f48dd20d4d62ffd4117278d66c482d25057e102cc8b43e93d318e9ccba118bce1235579dc552fea9af31916599634cae92a202de9bf4aa08074edeb33011e1f247c0407c0004e00972db36922cb0fa0ecd15cd85875d1b2c859fc4aff1b3122c6078cd843d3f45b9342b5ff6a00e0d03b4da5732254910e03930da1b675b8769b7d18283265e0e2f505f83220e03897b246eab2860506831f229651e897deb8515e49f4dd9d2fb2dc9a5ff2ab5678077b9588983638ddd01704cdb8eb2ae136419a858912e90f1b086e4713be03369ecff9f2fcff3b907e2196d8488cd8104487d47c09b48912cb18b7eb2b7a0d72ee41be5b1ac11447d5d79a1780eae925b88361218a60e1f2853fe9bd3075e750d585687cbf029016f92ecba90270ea5af232fed579f996796b3a0d4d8e825702e9f54f1ce50813747dba881322b8905ecbff25b0db3607c5a051b735006fd9170a5ae43d287ac99f59c8474c585ab0265c702cc0f79a4550030c954595bb0c27984794e76aadb6818aba6875e61467fc1f5a530f3df63c7275c33ae4e9bda8bc92a50b15df96222e676b66ff3336776bef647807e1b209ce539184ce989c8eb79ee54b814ad1427ecf8b108541899ec9cfb9704fa90b06a817e027b982442b356ef263ec372ffa43c7329f280b7071025ebdf4ca65f6ac23f2b4b4a47cd7be02a3389e45541844f694d5ab287597419869149c1e9e569c68d90e8d675ec53ddca1310676de2246cac506c7555433dd89acdc619a8447d9cd57f1da42809cbba0edae0c8f109b04ed471a3403a7a5e5644fd657dfd2ad94c83cbcb176fa147620078b68b694c0049cf8a1cca86f4ce3d5fabfaf9e626269acee15e362a0cc5fd1a167e0b0ad7f60e3f69ebf8100df8e32744901287d85af8c96c867525b56c45a2135b284f800a2d2169962835b02709730cd1571a6380a21bf48f16c22bb1a2a1e6e096c2b9d435c6195aed435cf9b14cc4eb10d2ead88ada0dd3ae3e5febc532ba1e90a61f559d79cd6c23183a3a75021eb1aa915f6e6d9533e7fc8dd7d356e10ecafcd74e95bd1ad85246af518824a19aa6002981bbc2bba318842a5b3b030e319e848e221a274c1ef08c43e7098306ab1c4f0c92af859fba542eb411c2aec1ed69156c103d1d735d002168e8514ccd02283a8a03077d0971d70113f92a5867c04c967057cbeaf459e3a40cfd76717e9e893e706aea58ace024ed3fd9fa172a98c92b18c9c5598a8acb1ad8190caaf71aeb0fdd8da9ba7b9fdd7fb61aa1a20f65f4f9f58f0c73f64648c35495710a38e109bc5988c08c570dd1d0f60e38393c0c301a3f3ef188c2ebcd11f1e3427d34d004537d6d6ed71e8b2c7b9852f835642a94427990a4da3cc3ad27b6c719c9ead4c70fc08bb6f453633a1e9a5bcbd2e2ec3c90096ec479e0a01e3c2d892d425268f2722fe1fd0cb4d47457dfd67b64bfa0b3e8df2430e261c6cb5c2281dd54e438dbfa3c3101977c0a1a2ab060520d73f8e93413d4439f7e7fb96405ce1dc65ee2863dada7ac3c9efd62e960ef420e594ca932b0916471d6cfba9b35c40f4385d11cab1770aa0b0882a0a9c0608c443400b3b0f202652904348c873b25f98fad305d205ba728a628645b092fdde8b49b87bbda63cd0df96092f502ce717fd55a560c3c99fdf69f39fe3c2d14fd96e6f67884701a641b30546479a53c0ff0e54889b52a7aa2ae79a4a3ada0956eedd178ada9c10a3304061ed0c86e42914c0737a0820bf8f49ee1a3f2883c23d1148a0cf39335c26864990ecde6ee03d0021ad4aa912ae15c288e994095a186620d1c180ed9eb1370a5a3a21904beb0a5707ad98944b836a2c7b1904dd76580836ca412558b1ff86642a737100336ba803f6fe6ce50746a1716faadac5f54cf1b5a661a0e28bb3679c0a00a250c0f2027d8061f1838f51aa3f742f46096bdd38d3412c13c809ca3bb33b066f80d7dfab7cdfc424dac616b0e19ce40571b4e23d05c8633c5c9c2fa34315d780392e7f4a0b381af88b58a87e5229d2aeeafaa9da7d725b8ab0f9f7e4316d2f65f698fa516a0ce0973904b193a68724be3261b34f22cd1cc0da8e8ccf617c5a403b6e2924184d0b244897154c182215af02059023e3d69c40c3290021e858b91527a4711550003855dc6249a43ffa9d591eab47fa5b8ab6cd1fee9aa9ed7909266911a70a91edec5684c7bdaae2310d6472544bb196035763e753b7fef4a107b16d669edeb1624b3bbcff51e3a4dbdd8fca4950b7b44328d1f9f60b219704253b94889645bec06d98b1df5e73d5b2898bed9ca495e6f50e51d786e980654373a5d4a6a161ec8ef3e83f409f25f672a06da20ea83c48b6228d91f0be8935e99952a6e83237a60fb29bef246e1728e74a54ac4ab7a40ce8f2a3656ea6b5b7a7ce1f24374f9bf29737b259434df54ab596d4ae0cb109717fccb1229110df8e5af1a82ce24369b9549eb23465f4838283c0d4d0e4851c7454847292439461aa649c9388859871cae69c846665aa0de5c2bcd1bf198860409e7148209e09c19181c1c03d6c19174e9124cab8897c4ed1da5c11eec43255e8c520bc2314283294b55aa28afd7a5028aa7e04814eae0aa3847ca594ed04c39088c98b2b26076cd54a26e5cac5e29f0fca5b7d0d74484130ed6b035fb6553e081d52b0dcbe3bba881686d860e1194993368f7b22ad82ba6219bd250e28a59485fd0e44cb9a65a43e0b8bc04e9e0610031d49ffe658760d2673c85d532c9f67fecc282c87d7d3109039913f0641b01a653f4517ab76d566ba809a6a72399b476a6c89c8ed006c264ac47a00d84f47deb2820e2bc7dc9597c02227534a3a5ec56a30c8886dc4d99830671f7ee698e4075422b31c9d5f043de19b7f9ce5b3218e21d18a8782e2acdb96e7319b56b7c35a95d3199554827bb3f824a9984d2c4ffb80ce4bbcb44c31f4d204a1ea8142e7a67a4d399ae1404148354d53437847a01d5741fb5a11b77a1fdbf07bd0881d6c0fe37e615540e89e2e8972205c9e7d85387faf5b218270f8e91b827fb782553107e02ec40e32a8f9db75f2be0566ffc60219f526b9c8d83e4adccd95e9438169dd85339459cca85e71270928e6ba033ebae6ace3c785b9d6f035bbe635c7fcb8dfd97df5a9c46d1a013607985fe6222132202456862c2c987adbf4bcde89d187ceedd9bf05187398425fd2a638d79e9cbaa603d60935987be9ac13be05e0d87d41dcb957f6840cb874c5f4d369a2200de9f5f5d22d61401a9d2ede69e37ee0dbdec63f8ee6f25bf4f3986773525f972c77fe4773dbd71006108bec2a2a4117985bb6b7a50c285376076f27b921f1089d14f73b4db4ba3dbbfafe47e89418b6a5f3b16c5a5a47a40e73548a35ee306539e16d3e953b77dc3042e6e92cc0ff3513f7dda56b3a96322e056875238d413ba4ae586274d06f8f754ebd74e30e7b1c9a4c21ee4ff19572516c167faca13c84443782db832c8f563ab68fd442fb0e8e63f34fb895303a5d1ceab61b2d84111a46458f0307c92012a0600314dca6a1d4a986da20c0865f0a95812c1bfeed9b7aaaac6a5c6fbbffd186c52cd24c76bc3d0aa7b599f08a95b36e79d11497cb550eebeeed545e373214a86242c306cf5ca6e4f5262197724e8ea54be98bca4d57f12c16dce5d69a83150baca1f50d2c81f201792c7092bb936e2e50f3afffdc4c13dd2609c40562c40d8e4b29234b587d2afb4e26d11423eca998eba93c4ea9c8712a6d9f12a4bfcd3775f4e70b901e8cbec2c465c2ceb8da67e8a969fecb0d5aa1e6e76b961eb6c54f971230b99c8a5660fd6b4b7453174fc4a94e5d6c2b7fa84306c2d85aec5ba537a3dd507f19936d8dbd564f09944e4aa5af2def3296c3aec609faacf2cfac06bca5187eb207d61cb0355c3abb0107e87e6c92aa9b0f028e01c9e092819ab8170990b69ce80d219c1b49bbea19ad9256298c7217c39c27d1c79cdc96b003965eb5e2e5e6163f8401d329c2ca1a16a4010f3f84205c3f61e5f36a49ef19aeb0cfd604ed2fd0b1d2905a29ff2b886b040196964b8781a8508063218844375a43bb7512c8a94929fd5963eb564fda08bd6def50e757b7796666bc1bd1bf0915b43047ab190dd83e3251d294299d0989db3e5bfc29fab0d85b4911525d378e9041d3c0aee493c45402568e8ab05eb39e230e30c7b112d0cb09d6deb63fcc3a953d786f68fc65bbd5eb7a20aa0daf97256f81d83c8c623a86784bc16999cdda368641eff08bb78ca04daab840643ae0e9a59875ce35cb17719a89d37fba9fb571799c7432b6c5211936c7d4db51b0a9423f69c2a071c7cf782ee85a9866b1355f294617e04a1604c1abe5999c92b4b5c1e67cca99bbbfd987a0e0f78ca62d4c81f0c92c5eb8efb14e1524af305c0c52f58384bd8781223dc133821480630466b45bccacc46ad96501ba436a6c8e53fc0c1087139e50e10dde945038f728007892bd44e51129c197ad14f36b228e3620d1be9fcdf40cdb7795e9a9431210bac87b21ef8bd815eced56904a6ba635a5910b934800f0b0ed79ace448d37004d69448c660772759491e85e2664f11b3a6a003275342880794956c6f21782bd18a2d05e33b50e768f2e21062a8be286f4e9480d1fa979cd8564e2a8d75eab7ef2e3d42165721a15af83c2108e80e0cade4ecf073d187148c1052c4ea324dc3953eb98d1597d5ed076862f0246831b5472689be012309100d2fd6f4ee6633bc98753b2ac9cdaf41e1ab7ff950ec26d1c3c2715ccde750c338a68a1fe4eebc30a98e80e19e38d2d26d282a02b699aa3b186c15f632f7a13bc120c0f4578cff74b124830073f9b92dd63a53c1942f663e971d532d0f50e16f12c3d93c880d72c2cb4e01298be0f88cc51f0625ef2ffd35d7c46f9a71333f54c994a835a11042954279b7b7fee4185a9c82877e180df28ffe17370cd9d51a73a1b8f59732af252e36da1658d15a725e82a484e160cf33df072cd99fbf4a592fdd11b8cfbd4b9790384fb55a380e2e7cab92c1dcf8ad09ebbd6556e60fa6baf4ac748c1337eb6b5dec9cebc463886964fab6ed9c3cf7a2fe022cb635b8b6641267b0951344ac0ad0eeefabf004cb6a0d730755873a1f85c258b29164177a0671d10e9dbf2cc0d105e89cacae308173cde57cc1eeb8b3f8b065b12fb3d8e2fcdfcaa610efb4b797bfeb3934de1f8c889aae2d31a304a979e80fde5a3839e86e2680406bdf6e3ab86f3ad1f0cc69f867df00b82bf76fd1471b5356b803323b0a88921128891d594add2189753712fbb58fc55c3188063d33432d0a06e8f3bdfeafcc5e5417d04838bd9e991aa4de152cd78c46dd746831b7d97eaafdb7fabfaaffbbfabfd5ff53eddfd5fea9f6df6affadfeefeaff166a65bf0f88605cae7fc5cbd71e5f6b39cef8ad9a1fd5fb51cd4fd5fd54ddafeafdaaeea7ea7e54eb47757e54f7c3a726ffe272986ea1f97bdecd229b7af2ac7b6ec593e5c3375cc63d93f26ea34d0b7bc6941ef8201d74811de4238fe389ecda7d24517df52d75b5396f20680cac587cca0944db0ea81938f6223dbfcff4815862790456ef02796b15d6d15997d280967ce325115d41f6ac6b7cccdd011f623e8c21ce0e2347677ed2520c08fce6585db88df3dc64b224daff1600af74f169efea16c948a611f9a20c9a36c202b74c7039bd12eb63a8fb84c0c4ab90cc40663f22066cc890d761802ac3ad8799b4867d71b1f7d9db7adfd4c39d4ccc86bb86a07e0ff76f18cef3e2625d2a4b264e1d5e28615c282104f470af3054a19a127d98c8ee865fe2332505dcd60883795c078194f59645bb9513ac7083d5c1b83ad6d9b254f6ba635708d8aec7188ea50077c41394841ffa59ff3daa97b1480545bfb123af53828473b0240283b3ee6e692c201420465646c40d347d2b1c9f6511cf9ea4c35a2f950d39d081695499739480885506fa60cc69f52bc08eb0adcd11e1f1e2e53091dd0cbf112b5491aa970353442f186f5464434e31493bd958fd9cd12e95f15ebfb94658b8885b230ff8ddac59050e1ac24b9891000e3550b9c85f80865107b48ce364af4d2e1bb981dba8f03e296a3eb6548c45c0ee2862e01c206dadb9865baa2e8b9a1265df55aa3187a7cbe90bc93a06c58ee7d0785be665405ef4f94192fe227adce98537e4d1ba9b6d7988d2ac6973f0684e0c1b2e0a3f37602bcc418ea0ae4f94e44ef4a2a30604a506045bca462142b3bff110a20e0d256252929a08262a3f6b0cdf282d8216065fc0630ae7ba435095ba29d6741da094f8735ad28f8f8999f2c8fb1f9b16f2bcdfb8d00110b1fa9c44b5a330ca1d29a193566779d9ad1cd06f601febe41813ed475fc4fdff182f60c2f0b329ca3ecce9953ff12a86f0110f80f8553f24d826b79205d2fc54fa75173c3ad191d118f8f2bd42c64fc06d44bdd7fb38708aab54b7629df427780b4a129dfecb84f144c4891c7ad0d4e379ab64c40bff83b169d6c25934cbc5b2aeb570678d7c340d7122cb70c6132219fb86e6828b57f99072e10f514ac9f95ed7d9477f6bbc953c025344769d83fcef2f634861845b4be3d923cafb4e00aaae383f18c377a2a5ef8c1b0ac17504f437641709301c52b215be3063aee9db2082bd781cafea693f7e0518e00eba6b51bbec447d609054754e641d33a68d86590ad0ce2b4cdeefde31d2724050fff19720dc4db5b26f2c0750afc32b326b25b5a00d70af9325df18ff878b646082c9512c7c04953ab2c20cf6b2a25c8ce3282bb2617468728c2ac3e28a0dfe1f813710feecb4afaa0060765ceca69ddf157cd2949f2a26e8fc825dae7f192f16b7b22ef203b24b53428db85844d8dc1c9ef768ed7cd9aaad01edf4c526edd11bb14f068116313575e14df0634d979cf44427a3a34273e3e0218cbc0a8f1eabe0f5d24a7528b108e4eb36f3dbc530b84b93d9c1674d1d53245d1da07c2a9a859cfe364c80be476aa3091c4c2def68ddac91f8b1ec7772d58b4d7cffea0efb418e820831b4047e1c64953b1f7adfa7f262eee08db3573e2e61d156288c100e5c3ff2b835bd3088024fd4881813d3d015aac2aa397953b4d863ab1ce8749491c23759845c4af4e654ae439e73c35a10f95a6f91bb2978e8d09f90a0d48186c75a7ed1f68863f9f51f8369e4fe44e112cce88183278418ec6f4053877a8202e8452a35e85a3903c0790c0709a146e6b4d94b0ca8788d488a698dc9473967a750ea89d8b7fd79596113a5aa02fb989c63fc0718c62239936e04cefd3e7810f97d53bdd6ca9cebe5bf826079b40716b5f4826818fd085b68f11f55bbbcbb6fce422bcf7dfbb3377e6fb8501f10945a767a7c53569da646b00caeef36815b2f4d242ff5254018361e0e285ff74fe13297286d279e83c4971c84f24b5bb7f55b1804b08fd2de57ee7f4c5b0fcdf1cce9957a60f3db3a3e9b688ab58e57e4f07f4b6e4f35d5b34c4987868243286e026580404cb19e58dec832823e93b7c02f26b17efe3853c9b7c0116dba694b471044120d80f400eec476bc4ba726ae4c7a08d260713e838778acd0c1bf46738d85b174632d5e3c7de65f0fc68a0db69e59da220d51060593f38c5162ead8b46fa00d1dcf5240b3034954c91e6d705f434fa5a4897d439e0075c0f660502e8ba29597dfa041f247bf053a14ed9cbaea27ec1c10b48e62db26900536ed5c4bb6126bfb1096a999dd91de7cbb4062c53bb4bb371834a5f1038a9d052e820f7d040981510adcc7a4795da328cd5e5efde154e24a1b0612f83cb58e781d76df2b6bd1912e17b0b988e9a6939c17d8ba5a0213694f9a488fd83a16df3b891061788df663b83cd050943560c03ca42f847ec478e8217acda9f707af69dbddc41b741c81e24fda221b999780566a75f23540be98023d81a29a3bc1cbc7a3e2544347140a5398bd3dceef698497d34bb7da89404713e0cd51d3de7f0e4021dd4617a99ec4572b74f107365ffde642fe8aa3c371ccb764ad293eeff1e85a423bfeedb96006b29a7879608204df417883c167538aa4546ad00bc534835702ed7a2e13d1ad070c2db04e218d658edf872fb63f01f893ace95c2a351ff60ed08c21680b0bc82ed016a6a919382a6719df3e94c6e225e9d9d702ea4555e4e94ab534de7cfc01e2fb9f09b95f22df52413a69d07548ff09b40285eec630a7254ccfcf9fc9fa5ff4e83cebe12771a880b133cb94e8d0313cac6b1dde2cddde8466c512557ec4f5bdb9b47b9139290e74caed24281c09dca069feedf8975474df38d4b53950c1baa022d1670390aea331904342410b5b2d8ebc76f73cf31643359b908c4434a4e1fc1aa1f2a2491299e2d54a40da0b943d4c084b2fc3062f2ea66f89e0559ec74a62dc10a13c301d5f602c889f06323d16a886726e31e2cd942fc624e83c4ac604199646e4177237b80a1aa5257f4fef03344cb86b011395000adcb8d8dfaa869202571daac77e5f058ec876ada51632f4da6c3a20cd03e104ebc963d9f92f163b74d240654b9b2f4d41dcaa2707bdb4e72459d7b164187340f77b7b769a19e5fdcb865104630a5e8eb4bff7b59198c970e14470196e11daa7686fd2cc4665f6548e9d658353865ba8784aa9d6056bd78f2341bcbe506bcba9210cb646fd64648ca856542af1b63cb2b9f27a1440b26a85d0df0c10d015a3f632877c45f12d97e97b45d38d8c985bf75ae1b0c5920b86c759b5ce6a4e7ff47fac105c56187bb170243174b44eda4e34299485eee29fac74a028cdb74e3eac92611e588a11a2b7ccf2cab7b36402944d765e8e2455a83daa1c39ce7209b778bbf1949ff3649c8b0850c8966ac31fc25a6ff22f97ef7253b1fec33934819b620ff3ddad6591bf132554e3aa4856bfaf95d718296b1d6901d27c103825ee9a209507a53889587a196eb476c218e6db9b437a1ff98471a60bb13e4a282e84c6790f228244e82474c398a354866061da34763fd695c0ecc9a2bf01b8966d0b950cc80fb1a2471b6235f342d48e0bdbbcf2a3793e67a8b50cc01136f965bfa4b9df07602f1c692846820436451abeee11698f8f74c99138c6d4c34c33506b22c5ba54eb580d237d67888bdbc1450a0d08b730a02801eedbc5c05b14342309f2f6184f0d4e29761eb4c0e4a5ef3c313b081ce61b204fd490fd4b3bac34f6c8e4f604079ed178bc4fff13741638b0ccbc828f219be515916130b28cef0292307e3c5b837420c0786865a3cbfbd383317b191b9af117e03ee1de3cd08201eecb5e6e388c92db9eed6e7c96ab90aa666508e550df5e74201f52272689d8eedbe9eb96066bf2efe0a680bb71b88c42148f7fbf28f2bf54280b784d7afadfd60e3d81e528d908cfe9a4cfd10a11be4f5091ea5d0df86984024db481af4655277d52f2a066b5ac22df221956363fe4f56d17c307c8547e5134d02561313880d702d31628b2da1d58569b2a6c371d9111a41a50b638d064aa8eaa2bd91e8664ea323bbe4756e8938c82418609d1cbb5ed1d0b1561c95f6f7cb00b42144082ba40c04b28c80ff0a86afcb5b513c9082e8a9918e6af5f7bcb011a4ce11ce5192b3f7a0cf7e7b165590d5f674d4baa9934ca25f46f2c3e6b4f003ff787b36b4033b09289a6a3956b280a3d1d092f9ea8d79aa5cc86d4a5c0b8f3fd24ccdf88f8befbac3086c48a4a7919a5b2428625946a48eb46bd0f4573823431c0950f239b7ca79b9cee1d4e10f1ac0ed8b7594848c87aa13bde02f17b3a0cfd98f0e83bf1e222a4edcff445459a8e740cfd40dc0cd38f4ee0e92d9f26098f8875ea32d9af4af813e384ba54275beb249882bd783aadc37285d84a464346c40454e13daa137284eb3291bbb6045d8c02662380be8cee0b9be2ecb355a7c7ea242cd0c1cb51ef26a74952bde5fa6abb6ee6fd533c1ced18ec7b91d1c834bb67ec8731171212ae4b092144c21525558295ad42562a86c49463f3f40d4b82ce42e558a35bbdc66e7c09e9ab6bedbfba762969f98f37718c2b15fe445416cc6c64b7b0b05b3f34a1ed9e118c04e5f20628053ddd86239f12c9415ba393183f1ca1ddfd5293168eea9eca5ac57fd7a9779ed2dac577f714774f71e714af2dfe3b4fb9f314d63ebedb2dc553a25064f56dd0234ba955912bd62ddd1722f17898293b9583ce56b5e578e7a9ad6d7c779f62f7a9d76afcbb9ebaf329bb4f5d4de3b7fb144557d9a7ee5bab782d0c72077c22033a9c728e58304c69351d8a715b45b95b8200629094c9c04c09930eceb66efd88c03cee9b9224109041aa6029178997c4fb0eb72a308c8a270d8463d145d9d994c4f737a026fdca73935014f6825ad99c08092d35b2bbedbda594524a199808480847093683336a5c5e9e71002edd1a4b7786cde0f2f2f581fb2e9190c9b087c0d9aa0cc3b02c6f18868f533ce8f94479b7863d4076b404fc5a83d16e497597b4d6977767dca55be3f2788ca1cc675e7d144fdf7e5d7440882bde239a8fb41374a20b22a3f64cc3c7a2cf4edc28b38048e977d641bdb90b22670c6e0f5d363beb8c03995ff10c4ff04c4922f3b1db6b1d9f28dca4f1663cbccf3fd6f2d0cd995949990efdb520b43d61dea50ba286e5fd49762953ffeb180da54a773f63164511bc9929cd9411a7c6173bc619d77b669ef67b7166bab98b1d7bc8c17691b557b7de016baf266a1e723d4236525acf26e8d73ae3dfde7b579d6bcd5c705cac9d316b8176df9c75c618672d10d973c6f88222101dd939244770239a83ec592be3901682cf454cc89f333e87460c822008e631c9a875b56e786370f9c1f8fa2df56cef531370bebc3be32edd1abccb5b814899e2724f03a41038d74c24748c765073350b3dd62aada7b84f91d88c51f6e2ac772d2729adefb3d63a44b1b5d67141ca8a66216545415a6a8267a1b4ae55c05d5988138f431066a7f2ba0c4dc39dbb7ba3d87af87ca6666a9a375bd39a96cc68e8b87b147a0dc37cc9f0cc6f67d9f48000638e8c798c3d3f4685b027fdedc0a634013eaa39cdd370e619c5a8580dc54eeb7aec182cbbde288aed6ec6414622865113dcdc4562a3c42b72e56e2ee72cbad63b1cc9b1041bdedcae1b95797d99a84134bd0f3a51d60ed612ec57d737675bf5d0cd7926ad6662547d485bb8691cc73a43534f110213ccf79bcb5ad75aab09c814973fbc879af5d82f0e6f1f9db194d7c7b08add2af6b966657d6a971e4a197a5a9661228afc23a8cffae1899ae5010a365e60898d7efd165531bb25de5b26cb3ce79cb3d1dbf3034829d267cf688af4d9c573f47a3d0c4b13c97abe2a49bf970c71a5f6f0d9695e2f88ec33afd96b32a79d69cee8358a22a7226462899e20f220c5551e3754f9c5b33efe00d26bd4444643946633d74802fd26b6833352f43a8e68883b9e29d28f9ee2c71a82d1cfd4e8c39b13453435413fe99a2481fea3acb33eff314453f7a1eba5a7e68319aa4c3d78b820425ae8f704d2d73c94f9f5da59dedce821ad3ccd5b348ea3db1907231a7a089c869f7ab85194f465abfcc324c09823644c326bedbdf7ce5a1a0b93be61cd205e2af25bfced1b4d357a02e9711925f14597785c169a6439c9bab1420b55b65e9c097a61a7284f52102472e0846173a4079a267ba68f989b3b3c86f48991022d66eac06067891e372f92d85e5811026b3afdd840f3b55bc3c542bf903c508af078823547a75f2cbdb6bd7ed1f43ac36b3c4dd782404272d4f98a81050b2ab8ac11d3dbd3a68a8b362ef26cb8d32480af3f17543ec3d79f0baaedcb36ae7bb84710a84517bb59b34a0dfea61fd2705bd71dc29b2bb5a7e16bb4cc31ca34fc5bbf4e5c10d66fb9757e4be29e0b1ed84553cdc5ae059b1670ec34c1009219f1510b32638b2a7ffbfa6b51a55d7869bd5a0fad9bd662d1400f2a36555675a46a7c914c72a25864c9e1034b07b6ca708310226ecea62195bcf05108114a7538282199ae9982903c763284088c37daa2c563dc82f718638c75d307a390e828cdfd3d838486c843d50a2caa7ad8b73fd652af5e433474d1331a861fdefad644f7bae8a2a7d984e8227ac55244c9bb358a71d6dd0f7173182d3e5e4f61c04c3105aa135ee55141260cef499a2b499c3819411344053a34a87cf97a13c6c585ca4f89cb8f451a0b7a5ab576de6749e27f9252c74b871ba89d2e350b60234e8c1953baac21a3c3737213e825823e34a6c461216c4f972ecd25dda0739563852d2a44b1a34b8d8e20098518d91565f28b32d86af0244bc781cafcf5c702eaf111c9c287128cbc75ee62d164f7d71f8b1c3e2c476fb1bac165050d3b71e4d42e49a06e608db951064ded32c306d60b31757a2a7469f9358e52172a2f5e52a47438e9aa571272098675e3a42429ecb1f1db01838e3ebad4fc1534441632423804e05589520306296a60d06d748325ec0b447be148bf11027badb1901e392ac6785079d2050259bb39757c7405b2f3a58b056f4cc7d58f189e2727402bc6d4f1408b589d18746030e15125e889e9662909c718ae1c2c6c6479c18b2e355f6331d286c9481e384e2a74da95bcd62ba45edf5eb779ad7536cd0f46e1eceb6f050f330c346e117d4af427888480fa62ad8d84c0d8c9454e44f6b4fa36f8a9605282116ef8fa53a1e235d4d93a13082c900afff003489f227d2dd3aa55c19d415c7c94012f75ac986640b971a54bcdb7ca4b706cf051bdd2c2c9ce0b37a27a72748e74731f6e0e63af571e630f1d639c9770b5184dcdb7f54afded90fc75f3baf9f5b7cbf1415f7fbbdd52b661cd7bef0da3dc2128c78c551b355966baa2e852f3b797f8a8084b181c177edc4861896e7b0dbb7eefad5172a9ac9f1d6aac4469ed3ada5ecb9b13ca7a2ca45107fca2d27cf6a17ba481e71a88d0f1376f21f934f74a34abeafbb3f5e9873f535fc58c60e2326247ef1cb1c3c9cdd5c771fd5ef317dfc7dec14dfad3ef509ca1bf32b0dd550cb0df2dbc531af1d7d7bdf756bf515f1ddcba7aae8e53a3afaf5ead55dbbf16c85889d2bdfbeba4c5596fac37188a5914f1b5e20e45d9282367b41aadb4dd82701987c3d7e2c0c4c2c6c4c0b492de8105ed96fe7a06a5eb1a9636e8f8eb268f43e6c0015fcb6177e564ca552fcbd7c35ef80dfec25eb80b876130dcc563d2e1c4c49b8ab259ebafdf9c753397bf8eb3164eb398bfaeb76eee66df9f32cd37a405601cc751b6bb5197eaf6eed5f55d2d309fd6165717eeedeed66eb7dbed2e5797179898d8ebf57abdde6eb7dbed7615d86c369b00706062e5ce5cca5d269fd6165797cfe7f3f97c3c1e8fc7e3e1aede8deaf57abddea5babd7be5bb5a21f6f97c3e1f8fc7e3f17abd5eafd7f33fa500827c56cb6e59ae2e2f9fcfe7f3f1783c1e8f87bbc0bac4eeee2e5dde65027d3e9fcfe7e3f1783c1e0f77e12edc85bb7017ee3a85860000800004a0820afc3cf1b5e7ed79215394a51ac1e7f3f97c1f589f3832932945af1210f56c84d66edd04f6101cc11907200492ec6c8409ec26b063d7a789ecf91e59dd753b33da758888b2989c89909072983044ca637a542df5a05242227143167cfdf568c1c336820715691bb1a3ebe6ea07fd78c97c5d28e72bee76bb9d0a47127bbb9345f118f229118fdda74602f8f4c3dbb4fa32be23bef77a07f7ef45739b32e8eb6fc7d2dbae115713e908fb76bb9d0a1d044a6ce082a8bf1c607fbff28e0949fce9b8fab46ee958fa4fab57050371d31aa8c2f0572c676d885b517b0edd5c78371a66db081e3baf57cd58cd1f8eac1f0e276f9d5c809429577e38a63c30da1454c8faf1e4e0786a91b39752f6f58723c7e32313c7920c1c2a5e88c110617aae82afbf1b666e60f9d408ec51e320217d20234ac8991c345ec0aa65d03431b1b0860f972632a10bf905a42f1390d187c94ad89e1a5546255332a248e9d8d1224b8b1ea42fe0d5839ef317f2ebef860a61968868098c4b4406d18d2817445984e9b91b393e35d2807e3caa9f8dab2c07ce8a362c887286c31bfbfcf5c713e342b485b455266f2161309b57e5f7992f456c50bd01befe6a8899370449787daf759d9d14b5880ac9dc84e8a1cb440f5d0c51125efb46ab49c2c4b28ba366786e81c6588daa0fdde947632bcce0e24c83737093bc396ebc9d416e3b4beb37dfdf9cecfd68447de99b71f5d8495c909724a8e0695efa9e4900e7b79bcd36a20f487adaede6370f3ad39a57d7e0e3edbc69f010f786735b90e3fc76a624fccdf72c02362fc3302dff860a3d20e96b5e8e5e3a4e04493fa223a8e06ba810cd4d8c5e73dae8b55acd2b09b91a8af35b5abb6970dc99e23c08b540aac4a112d0e037d484061f5113a4dfca33c5a127ccd780dad0f484f9a47923671b5cfb0d4d399866596e7071838b1bc4d26d3eda3688e2cd6d38f1e6b60da228967ec389362fd10c193cc415cf0c369b68b3d95c26dac4164a210ffee66518966ebdfcd5f0fad5985286b771bc590f7f34781fd64edc9992f038dc975e2f880d6edabc7421134dcb2f5d836f38ebcd6940d3f26d1e74dabcde2321d7a0014dc3b7a16906c779900b9df51695684a7aad3aeedc9ee14c4f987f73f276bb7988a6a3dffca4d9d903926eb75b909727ce6d676abecd71cd4d948ef35ae9382f1d87d69bb379cd83d0fbb69b88fa42373761f3d26fa805444aa111362fdd86cebc44676efe888665fd408289cd5b0b62abe77c7367b57dc6d47ea552a6d9a2c05e51a111b59ea8599fddeacfd548f622984bc9372fce7ae3c9556a2a9429f9b43bc3641eb56c8bb80b02570ee1b0935fe6bfb582d840c6a8d008ecd9339a6e29ad27bd4ccd08a44c49b18babfa02695e778981917073e067bf2400dfc4750096b16ebdb5d65aa32771739a6b6f6badc5da43dcad4f5c6ce2a221095a4c640b04412424229b063777cf0fb7e87ad0793b6544b69ba5c64a94da2ce5ddbbd7752b8512e4d9b10f51e43f51b7c08d926811d143dcea225a6f97cd2326c4d50241d0011fa85e6f02f4d0c1ea459b91a96708b28db5f22c92c16d41670736a56c836b709c2dc8fd76e6a19b0373a06f3873b708740d67bd45a3256f677d59ce081fe1dc96c1afdbcef20c7173a0d7ce0d6e0e74da0942899b039d3c4518a15e007a8633bc4560c5472240b732a4dbd56990cafca1edecc0a61c5df4f2246fae66d392065a0ba6669a337a8ba2c8ef6f42be783088a6fee09992df810dedcce0cc4127c732357f4451e4340c4394f4cb436bad97a8a8b5e2adf5070f1040420a6b0c29ad6f5d2d1fd2cd55af5939a20f5f7b5b56b6b28c42234cc89f866e518b8e42236c7e8b26fd880a8d207d1c9d4451e43f81f4a427fd18cec2192a92e31e47df635a7de199e2c2d0c11015613f6f7073756fd71bbd587fbe59487fc57ffd88f89a9d94d64f207dadb586a817e0b4d6a508444c4e10bdce91619e525ad7a9070fe6191fd84d8c735f93a66429350b478ac854a5f50f8f7378bf20503148512f483f549f877b24c22db248625f60612454e1ee91070ba2039b32ffca9448565ff4a10b423b7697c93c7f9d8932f404f9a118a27e7343c6faa19c797e5b1d847b647db848145d441d539ce8d5fa78d1d3a30c2c533d80e8e90288721ecaf483286a5114bdc3993a9b5d51b45614452d8668959d22525d8de1cd85a258657bf6aca06d9f1dd894607e2aa7aed34545d7670e451158a3ed8e2ece6677849bbb6ebb5e56ad9a91f932f23c512f105d143d6789a28b2ec208a28b62546a02f833d72ebacdba20662ebae81515496bd11375eb67f9c733bf4c14c52aba9993442b732144c52004f502ebb8da87377adb11cdc3683beddf104976a544fa115fa297f99d79307495c70d095bcb392eb24f7323c74737c718fbed0c71919d9d151f21ad50a6358b743c7ae8e182484f54af9779e8d88d46c72349a227905ee678e6c16d4a0b8e9765ebe11b3bdba808376771ed823248df6fbbbb45db457377a053923e96b839116eae4e99d637bfbdc399b282e03dafef8beefa55b657247b097c44748bb68761999628997660538ac04776c62ddae4f68c55a695ebf7f6121704e9db451861bb95f99eba96676790a809f92f51bde0ba3e65670736e5cd5acaaddbeee11e55dd76a47b5443a2dfe6b63e2c15638cb1de556b3d5e8d6fce39678dfa871df9f544975a87702512adb5d6b5d6daa4b47ec5d4f0e6ceaae53a6b0b68ac445e3f009f8cdee7befe642cfd0c1dcfe1eb4f86d88f98d453390a3b5da607c1dfa88e472fefe6c0bb4db86f51f06538df684abb791abacdf7de1b4d4dc8f828c8f1cc4b0f3a6f67bd45a50dad89f9c1196ac27a7e103541a2a935c17bfa45d4c475f0a226acebd728aa2d8a6a34bdbcdf2ec318e3f0499d4f123e9ff85ccd4f49f8accf0f989f5113d6338a3dc7107bfffa8331f622baad6faf763693808f777d472470117610b4bdb7d6c9074d9a96f2aca8e263a582a5b29262802d533bdcd8f88252f29c95131cf822ad5c3612312430aa9aac08b3a7e193213ec2dd22eb554760e4b056535a9c798b3a7cfd55f13efcfaab5afa14e7989786c88c19234b543e3efc9c4531a13e3d10dd5cee1ae97aad1d675eedee81084d59bb6e51fdf088d72daa9f86e0998f80cd8ec4f0ba9e29eb5b1dd11be1c245b7c81a7932c2f4a99989707dfdf096c445f5c5535952638cc24a0d5f7f544a54bb4f8d8894e39e1ba5f885a3481ca972fcfa2b82e653935442c674faf229f943b87c6a92bc2c9f92660fac4f4d9207954f49f3c8d5a72669d5e453d22c92e45393f461e453d27c9afad4247f00f99434997c7c6a92543b3e25cd19bc4f4d124ac6a7a439e5e25393045244c5a7a41935f6a949d2e8f32969eed0f3a949eab0f329692629b5d7a72669e3cda7a459d5f5a94936a5f994346b707d6a9242c47c4a9a39b63e35c9205c3e254d195a9f9a2492ac4f496d8488ef53d32432e531c61893a11511518e056b9a436e33a85a2a5e8f2953f2c9126733a858548cb119d42c1578dbc76ebddc330e2c0ca2884559ce194dad635b8215b7b543b688544d814d795d7c31a66931d97220d60bb6ce7904c37a81f52aa5bf10e92f48375a2dc9a00d80da906d43872c134d0eae71426000f07867a1d590e103b8820f9c344614f4e0e922240d99235c98e441c3c44505062a3e453a0c00cd113656738404aae3c3859a325e4f43d6f4888870aa68e9a1e50c8c2c2b50200ed3949a2561fa7819724b7005ca9293363d78576c74b980a1d4034a193b53422f568cc913d5c44e1121a89e20be355fb248cd9182b265b2aad4f4618183c59407baf8b696f6f8fef01002852b11830557548fb13980221066cf8e9d0b2cb8c811e489c375d2a38852cfcc8f2a11a218e11107891637bda82701d0a8c01c42352666e765061d215d58f098f2b2c7ce0d205036179e0c69e305c8949e2a1ca292f85cc0839502102894c6b6f28ab324c7d28c3981ae54b960f323c98b29589e8064305aa0fe8881c1498b180e4b6aeca1a106c6180c27a81aa926cc9216ae7663756670a87ee08801cf1b177e3c9581a4cc6851a2b1e2676501374c4f3482f4e081f9b805495962038ace8fc6103c32a8b430d9681a33a669c31b2449e8d0c9d243050f833239dec4f9d2e2430b13948bc0c28c5311ac3770c27cd081a34f932538a8aaf478d2507362230e56133a46a0aaef4f1b3e70baf05c58e2016526510984f58488992b65aa54e027e6bbb205a505167684bf14baa2e891716607a7ae911a6344290c6b0c8e0e201930e0110392263c235365223075a74c0c1c597cfcc90180147459b1b37284ce1b335259b8141953e7cb0a3f1c504322007304cb102a7ed0fcc820c81a3dbf314d6b56b831b3355ab4784169ca1eaf01c430862986264f6250e13d915c5986a46923a74b8c2513b022e2e34b891d1836b4101f68b2f4a464d901f4d4052a0a193852744cd5006201518513e84e8c16fef8b051c683265871e0307931fda011802a4f98b0d09387c7c7cbcc4e0c1c2c32d43ccd90d530225fd42ca1da92e1438313254d537645946091015ed0bb8126099c303d23492cbe9894963c61c17127062d09468f2d562bbebc6051b3809d0a489a70ac314304065490962c4bc0fce8a8003352c18401cb71a3ab298e9c25205887e9a0232a0b2b6cc9574f01649c80fcd0f325cc8e7da1c1e8a59a415cfffcd9921a5385ebc51c5d6abed497df4eba706a01c791166cc469a3d331645f7f5259b4b4cd24f0919b43523c2151592cae944f89e827458505918691a58a3cf8f52715f5a951763256a29b5de8a20eb81f3ae84815e71e6add758b9e9ab2ebe219825908efeb98af5b56ced73cd63b3636863446f454f78e01aaebf7066464c8f4da932b612af6f0d0c126892a0796933250b6e88103c5ca1908ca4adc67a0a46424117da47ab53da11137f3292f9af994d5933ee92dfa23c6382ae7cc64add65aa37749cbb8b1be1ae71f6108113943e110730654f37c5961089d2d1c5a529cbc48750152c1494f9fcf194ae933ed33a0cf393fd19ef2ec338076edebcfa987b9b9c6b47a8aafdedbb7b5d6f54918a5388731c6262eaa679ab52eb54ce390447d2ce67baf085c54f3d60f2f8b31e00354e60bd60e3775e4d8b0f2d2d1448897364f5b3e7b7e6ae1738ee173ce8040dcd79f138b1fbffe7e88dddbd373858fb6f559adbdb9ee5297bd1a011f817e7d677bba1170d1c547a02e9f2470d1093ba74fa110b26bd7e809a1675dd58d962411e2a2ec208ac2f61c9e29ac42b0779eb0b0d3859e3d050adb410f5114b69f8002983d0a1f69bf7ea9f051f6bb00ccd565cf4b7573b6eaadef2a2e0a610b85907de3a27ba370d1f54c45757bf7ee3b635831b057577dac51bdbda4dfbce675562245e9b30eec6fdb09b73dce7cf4aab3dd66b667b3576f7d5b9f6d67d8e01c14d1709bf9388e34bb35137bebb7bb13432eb02e2f14d86723e837bfa127d81cf4aa9b7909a1106e1ee441e809db6f5e75a377503fe33cc8e6b8202f319e1517e14ea1ec384fd28df844713d8414a48f5ef31052943e7399a328a144cd432f21739a7350a484adc4f69b9350ba39483ae8375448fb065c64a37a8d92d0603d03bac39d4c6f3de814ca28898a8b78f832e122ebb5b3e222142588c07e09257c5075a07f5075372fa184500832af790d3d617499571de8258442a8f9f68d9e30f39a57ddcd3ba8af1dbbcdb78fb6ede059e222ebb653e83ae849ba7ca637eaedec83aa53aad95908a3cbfcce4accbce6b804e932f42e6121ec34272fefadcb4e218c9210511317590fd11c780a5d9484112eb25e7151920e855b52bee1d5586f20bdab461bf0649cf3879bab59883491f3c48e162d78c26899e9c253c5053e554056884064701843ca39e3a4a93550aaa8668cb943a38a910a7b610f58153c7074d9ab9b27a1f07cd0e73f9f730644e6887ccc7832a3ef83bdbacec04a8c9626a01ab7346328711fee87263d8f67e830c61863ffa00192067e4adad75fd39b4f4b0fb990fcfa6be27afdf5d714e6d35c3682254619ab1f3f28ca38214992429f3e704e98b9e3434793939e17a09ac18c076b8c3596780428ca08e8a9b79fa00022f2d034e5cbafbfa62a3ffbe8ab570e3c453931f90d6fcb1a548f42541b0abdcd6027885e03f403d29fa6221fca0b3649953194f54b0fb9a1334d4286889a9c7eabb7f188f3683d872e82248b9ac01e7aaa1dccd675ad18889ee2dffbb788a6d6b36f34b5e3996a07997a64d38c4fcd1e5b7fddd4fa8baf7511247d76d959421fd808a38292dd9592315d6abe9516a0959f17a83e7282a8d0c745135d17adb516c2a26149c070f304430c1c157d4810e32443eb4a94d31297a70b4201c01ea5a00278d3634f1625602cb650347ba4cea4b0e5cfd41e25a22d229ee404baf1a6ca9d29b73a633d3d2f808dc5f952e759d05a6badf558450462630b12266365ca2c2d5942c74b972034aab438e6328d76bb1d8bb04c55192765a694669293355398b610f965e9e06253f32068446b0a6a45162255b4a0beb0c400c3c68c250f697ce08042e266ce10b0500cccb2ad70f8d1c40b56af490b5b4df8fc7153864692a61761743a60a9c0041e0c30a47962868536293091c21506a78d11195f68c0ae80200882a0941e2eaa219d242b6ecca1b15505a68a8c07c12a3d1e8c5115a6480c3f64aa9674368b8a1fda1276fa0a73814c1515533990ac20670a0c3d5cc2fe54f97a7085ad51082b081027362a64647909028217daf0399302183b4f990a1a212c2e0d5858c80366088f2c5a5b354b9b2f2b4b634e6056c2a402f063910474e159625c09a102c4451727575be2c89111664d8f3c587a8874789f7907cf4ea2b5d6a3141c36338220088220a843b089aa822265e74d910e3d7640b9f101884515dd9d3db8ce9495db102e5d58b4a6b89c3e0852d5e5c7e609932bb32a4c90dc91f2e76a0c0b9da01a5b765a7bbe30615589b3f1589554321d9b64040897d8571baf3f51929ec4b8f34219365672f0e44cf91d36e5487903c788d163d2943be80079100564a8d4d9d314a8294a9295216b5ed8e324c78e1b735a00334a990365964409de0227cd941a30479620c166e2e40802256c8892ee0e12153480e04e8f4b130e3e2bc8191a237627c88aa93d31f4f96548a1bae9fac08405e60989933171747556f8edf9578785df23b091c38592b02aaca92b38a32ed264a8f3a4d1737e49802c193b3225c89c2c74f24099d1874f1419177ec0c234984f16059f29f7de7befbdc3aef68f4f92df76947efff612ca8d73e47495b6b2172b6368685912f38543979a5f46a779f0c1a5152c94c01802258dce3ef951e193ef141e512dd40002660e17307da88c8171c325c7459c8de562059c93520bd13a24b5e85a6badb5fe3f5ea248e624197cc644395285a40b9f1878c42005f5420b77b65ce13559e99ae448adc7bc5eeb313eafb5d61a87c3e51a09e880162b479660c9128312012237aca26cf1924405ac3d702ab04c1cb439741004391429410f7556aeb416b17e3f402b6b1ec4583eb0b14a5569e68ab59725634396ec79fa22444fd69a2c2ac8445193c28f0e938d95428ddb92bc3de70a62b17873ed3885b6c721aaac5f6a2996470abdeb350314769f775fc7e405b151bc4f32c4b31176b71b9131c64ed52aa9e1fcd5ada71ab515839a2f8cabaa4f87fc7acefa4b5a259f92b98352bbf56ca2f4d1ce345a6baef420057a447e13da31769d42d46b4ffa3193a08f399f24b811b0813ea343f600d7f76cb728ef0fd90cea5ff1af763c734046cb9bb58c7b4503b60a3c5142d6b767edd843d868750da82c4f0da874cb0406067677d6c91e3140c9a7bb6e79b5059eaeea2ad80b7d50754a61d17521211221602f8251cb848baefff50f36839deeba9055597506a8c282e3d3555d520c375a5d5a5ea2763b5dd555dd8db2173b8d184453d929649de655379eb51ae934f4049a93a557dd09a3cf3c049997e8093597f90c3dc10a849acbfc049b8fb2733c6b4e73106a4e73eb349a93a890f59927e952905e43852c2a3481d16b0ec2e835b7160541e6333445cd659ec2e6a327e992747596a15e10ba90f5241d790a59140508a4976109259a22454926e96c670a2b106c5e435358a5456a5eab790d45e1841046b8083b261dadb828442b4ecb122def02c2d4a888054f65d5cd9cf4717626e9c83349e70179da1de93334458a10e022ec23e022ec245ab109701176141f541d09b8087b091f541dcd3fa8ba19e9a9dd91156c666d94e54531455d9a9367cdc7319fd9c5b384fbd96ba7f5e122ec778602849ad3d01429684e436d0f1761afa11f549d12ad866b5e7534ec2170eddaaad391a7d5d5994571f58270635028bbad3a99468532ea013a429804ded0881f3f447e90420dc7e64cea38a5f66d33a9eb5fa1ec499fd1f474b0d29e1ea604c06334f7ea05568bee13e6d06a3919eb3eba8fce6326cce0d6197fce196734c5f86a9b4330c4453ae730c4f5ea7cd17cc12fd9e23c3acfcd79b2cdda4b7b692feda5bdb497f6d279f41ced15e66c71c55bbf505acf39e79c73ce39e78cc305e17219e68cb59ed23aaeb5ea5ac39b33730673ce39637b31c6586badf3e49c3dc563348355923f48ecd80360b832d58ba26507d6029ca8af212c0c0934441785f7dbc90b6296e40f15c618638c31c618638cabbe53d61f94ddef0918c618d78a317e397befbd6bf574efbd77ad9eeebdf7aeda4e597f4fba7e4ea8c07e4ec4b4aebbd6bdb5de5a6b9df10e70671c650785f73acc0990df53e2af3f274e20be7dfd3951fafdf5e784470d9b63b0a8097c9a4371cad4347515b29ef40e56661cee0bec2b0cec6b4cccde8b71ce1ae7acf5de6026f5de201886221886a228938d188b32d93892e46c24c9d98c46ab89206953b2fe7acd37e5af972597bff7eae6ae5fde9d7175f0ee8cebc47497d274a579d395e6cb8bcbf66c9575627bb6ca4eb9b2546376376695ec6eccceb04b26b85cae98bf5c6a1a1137777db4f7629cb3b617e39cb5de59ef0d82612882a128ca64e348ca46929ccd68b4da8c56ab95a5cd76bb05e170193268d0b0e14c3d25eae09aa987bfb99bbb19356fee6217c15fad7a010c656a66ad8a4186bfae992a061501506161bf266f7c59741e066831b1abc5c0ad331613d35f46cd274cef96e6036e9df1d57cca8b77209636486dc250a673a8ef18521b21197d408ada31d0f811a3c6980a24bad47c26549b49122c1d7fd26889aac1e58891d11659de4004939d064f320cd1f2e66c5985065ed2cb21b08f08d375b381882e8c43a61aa61bb2fc1e152e0af191d12fc952ce391bb93152a2a5646b8310e677e59c087d14e6ac84eb73f650899acf4ee69cc3d00829c9ce89acb4bcce0a6b492eedeb3debaf49d58f960c7b8c31be9b2634427ffe8ce2c7644a52b627b09aaa7a526e118740d2c0aa4a88140249838abb39231a091f6d7091aca63c3e926de0a6ac324bb5d1a137431b68d4c8835b2350fc28813326c707654b0466802985b92282842a89539c96a8542c7875390911b24800000040006316002020100a084442a128c91351fa0114000c739e48564c2894c642b12047411807410cc3300c60883100196490510e1aec00cb2ebf0b4c37be5abba1c40c81c717bec66256961067ffa54ed45a85c447962f41ebf5ec3a41662219e26989d57250e70e428dd66f6036109e90924888fb69e8cf267b4aed0451385ca133bf38aba0dd53149fe44b0dd1a5bf402b72ea037af37278bdbd0d519e072b8a7b00b8c21807a3792e7d57205fdfc0e0473e8654011d73661c010e73b2651f62f4e1bc53eb1f601e96d9a47eedb16506bf0e9fb982dbf601ffcbf8304b1366843a6fc0146c7c7182080fb18e2826492d947288c0fab2e90b754d41023a2642b0ffcbadd0ecaf3721d4add586e69c2faaed83efd41670b04890cac40e53ef9b6720156e6513af0f10c508550c23fcbe41f9a81403369dd199c32a4924430065b20d02221079313f7e5d53843b54c865f6a03c6b9c05721a2acc0c599c297ecd55d41e243731e5b724df175508f42b46bf1dbf3a94b03ca521bd507a42a6e1e5324bba4bdc0e50e21345e2d0a952990cadeb5f6d8c4a7507b22f63f59c5c0990341fbe31808d635ce693122a847536eff49b67660b929f1ec71c4dc778330ae6440e79ebf274a291cf1151fb3b697c3790438fd207ac10dbcce79bc3855e00960bdf0db31c4f25c9c39c75fd71e67f3a09ae637d96876cdac505517ac9510f7cd2af2bd0e0d51b7226c2eb1d8fefe46cb402ed313f8862c0a565c9f3789b604dc60e0a2a4dfcfb0e30f8446b21e8a09f8e04a834412b1dd844b6f287d3c3a12542b4c272444fc9e750a5280b02582d1ff640f81dd644429cd0de199e87721c5a3d35133d2dc011522a96eb6a4e3f3573725550595cac7ecf52ea10c4c472d490d1315f98a3e90b4da9ddd5a7c0102376bc8ab3529aa3bd71488c95df095becb9c20a4e6bb95dd6fee9dc3d1c7cc4e71f7d31cdaac428ad06a6967b26bb266224d65c0383a258b6c38a6a4464d05a35b504d22b3d3e5a923b0b3bedb8ec0e66287ac135720ecd19f36dfacd48d38b124a8383e4efe650ab3043001b811562e9930f84c8866af9ad0937e40e93d11c5bd9a40178fec3c7d6887cff5b5001832bcf37f2c7a905534bb0ecb0623c39b0e5dee94808536754c48b4d1343e3ddf8e8873baecfee8432989900d67d0d55570b4d91e7e37f1ecc82526e7fdea7a47755e69020201402043a0f9ef1743724ae92c7881876e7ef8f20e62593d4170545fcf5f2828bff6959ee240e741c7acc0104cd9e387bad69a28021a48886fb7fa6c73d555d379c35deb9e9217335acdee1d0190a913e39e56c4face8ab75d311e61998d07507f64c3feb0d739563844d777c98ab6a4749d51ef00057578155b4c6a65e855d1f267867a48f05d0d5af17ddb49c5d6e4ac1a8e6b26c003d8b9e1f7ce64b20a41e8610ba74e71a1c01396e7a6c20f5f8095bbf46b0854f01538a2e7f3d67674d85b4c4aba9a681bda1c6a1c5938f582d1da3788f03a68fcc4c3e685a3a11d34f7a49564a7a4e69c3625b647a4187af9131c5f6775c1d2b423b12c1919e2ff634535c9f5065ed68a3b2a30cbe0b85bb464ae25963c8c51109f60e0edea61ca41508f840328ecc8e38359eae15b3f980df54176e1c2ceb8e289661a0696c742d8808843827541cb36f4c57db4b91e4d290f7a3b59d9690912443bdcbf390aafa33b3e2591077af60a31f60c9e504c14072b8f98f4fcf4780f51e80d7d9ed3e4dbcd9036b511d94a0245bf73bb605f02cb07f3721bf35eddf918feb33fdb77ec37eb901b01fe0753d80770440e1e6b08d01da93986956d40d8debb9fc09c4dc57bd6cad8c34fd917eb16a2f44fadfd71b0aa3d5d69c395049a3eb73664fec681207e4484ace84120b97257117e89ec8fdb2c2d0d053c88e1101d8b95361749e75460fcd5f771def99aebe416b4339aceee4c53987037f3dd4de1986b6bf17131a1e4babc7afbb04cd291ffeabe40658612b56d6cc3bcab4ddf2f62d5f7dfc3ebf86c11ea4398520c085376bcfb14c228d5f3b583cd6d65be27df1282500bb249c56778b340aaa52055608c13f5f9e916e58146e2caaf6cdfafd4c37e21eaf8a1a5f0b1b27b4f5ebc29035c9b0a4db8cb8c588a2623bc421b2e961d78ccc67ae4d9b6a3e9983892e372e088fe178ccc8f840d456b3a9143db3d108c4a9cfe60a68faeb9344eb0615d06e2ba45113be468fbbba4a34f1ecc42224001dc3032b78a868bc0dbdc8ce0a27155f0d01e0d982d2f648f6329c5f72c7071a4300b5df4add83f9462f1bc9d70989e8ee3f99fdf5b1e9686213de7c18cc6c704991c6e0b810b0bf40b40a102bf320ee1208c2133f53f2e8dd374196bda04a2051e20919264f1ce7a1d0bd00f1000130645bef9e436614ee3e4499d59f10f65a519eeae672972f2c09ac13f21a3f46f6e57dc309f8d2a9a0b2f1bc391f60cfe68eef9fcfd29c2eecf3b7acb03775cecde44c5a34d06e86fa97f35611b4c4c6902cc19e6f1bb0dfef1b1c1dfcc6040ba5aa1fa8f2bfe48ce60a48a721b090494ec3854c96fa7b4d451ee180c989117ce21b16146b9c1b821049ca7b1192e1f3bd29c98de00bd9ba28e84757b19fd728879be5c0fdcc6ae8da2418ef6242b31550a94125fc99875798be3c5e205295057030b0fee3864ece79ddb695816201c94ff92f13104c2bcd33048156d41035091f3cb4facf9579a924108944fa797d50b17df49d515e1c39f109bd106cf0f9d38ecabb8eaa057a2304efd52fd7b0c3ab642b13dfaffd82036d145a3dc339edd02f97cb2908b55ed16b0257d2b1260afe5484d80ba5f999a65e685b2044d184c4281650759e17d4aeeaeee00addf188f655c0b74dfa99a6d4fd66a4334afd214a13979575e432ea28f8d7298c5522b260aa47ebfa6410617d4b8dc78c2040aeeb34b465ea299f7ac21de79c70db099df55b0c94001f20dc1d50a72f9768fda5dde121546af0b87110fe346bc56520e70b3fe88fb2e0a9b41bdb654b2fbc6e43e36b385d07b825afdd686543ef75e7c36297bd5a60ace0d885ba641e39956e77636514c5580ef566bbcbf24b375eb9656abbfd76d2e35f991287da7498df16486c6bf8c79d327e1fc6ca006bdf16278f1245511cbd01cf0e829394be97299d9d52bc8a8405ebfa524a29f8337e8dc71e97fc5f6e064f0902176f44883907052fe84e7f96a6842f32b62958c62c773e6e598d191f15c13a1c0c2714bc7481372cdfd1e6f08fa223d5dd5eddde9fc80897a29e605987c3325f631ddfe992cefff47c0bfeafd4bdf3be7fe30175fedf23295edd520472c1e59ddccf986df6082d14cb33d1fa49b3d7180bd49ef046e559c70daa6e5f0619c3bab522c62e441f15d93e89be6b2f42e25239e2414a346c55278dd554088bd33e1a11ce4687d3a4134303765b9537e5377a7110255df03c1e5f6f54a0049208f1398c35828ee3e85d454b3fbec37f60bf4df3d49d8f2f28cdbc597fcf578a0c1f7c767753059008eee75d65da9c70a1452fb628c05d2398531a15025333724bfefe8c263237e873db326bfa2f819bf45d5fdc0f0177637837e1f185ba9aed81202cb859cbf14077fde0174c4cea78fd583279da7250f5c78f2f6d7ed9c11a7c932ab707db462c58e34ac0a08fa5350ac6e41d88091a8c77e70f7057a1bc58758b0189817fe89fa446d89e04f09b9c2565f55aca59d57fcc899540fb957a2c4ae469383ad8e15806e91fa6e02e76d138a5a2787d545acc998db67370229f9e958a93819f34b6ad7ada984fd06d3fe784093742fa6aebb7d55e90870a27009c5e1adc2d3d6ddd07fa543baf3e349e68ffecfaa80b62e7e11b925e61ec50cc6c17ffc2aed1ee82b547bcae45cdad940d951a5b2e35d9d2608fef7b5f1ecb9f82b54239acd5af0cb3c528c822dc2a5598257f031ff4b19c4308a1cea4508a0791f1ce0babe05cfbe95357bf736fe5b165c0abad623377f93f3cf8caaf24563e728e93ee13368e7e767c042fb3a28475d7f21be229c6b86f750a9fff417982eefc625e43c530cc6ea59a5e9a6d0e7a8979772bbf4b21efe7db2eb0034668dfbef7da5e05216f91536169200c120d29c64b18fc658af13156fcefa2fb2f262f566c90958dd45c650f38795e29110742f4f8a887e8d810cf58aea583bc1d6e3b801ec636a881b464ac8732a1a131f156e83a598cbc27a4e81d15819f413ec273c7efe24316c67b266dd1376d8d39005bd931b384a289b6ae645a08ea06a521bdf416d8abc39e1cc446a081ec671803cd96ba14a1f6d65ff48626e1a78ff97b70bd7dc9931350344ad480fece772500c0c50d80760cc4092a3cae60537fc1ecf2b2c0fb93c24077528d5a9d78646de21972a2c4ea57768012fcd31862e0a0276a774faf5f973624354e49025eaede002030c901147044dfb96860b7b23855018a20d7dea1915e011491c817894ee0dd97d1b9279d34e99a1a9a8d236b6c67d81be74cf497fc7c4a3a5e6e4f2954b76a9044fefd773e5507a9513910a8c3b300f84e649c6652350b4ab8b520874d812b31213e373aaf29e0cdf2005efc2ab7442a0c0546e9cf215a3d762ae5ca9022d86986c7081b3d553a911246bccc4cabf276873d4bdf65b4487eccb0b1c2275e755fa48e73587c54e433982171e17d95e24c86ab7d677925bbc8c18f6cdf118a5081e27c17509dbf6d854e50747d722478902ed930933ff7bb0c47dc93a465722b3abc175adbf0d73122f0738ea09fb637dbdc532271307e9764ee65a5e16532f03735997961ae6990eaa84abe9d639a7959d83c5aa3f2882dc622ebbaa5808dff1f670e28a61a865e80716a5e9d313d0daa31ed8eed8e2596dc34f4b0111e3b1e9646e135c2b0570909c8bf48e534d681d4d645204e595a07d9784fd365f89cd52f08815b645ff85562796efb2a9c896fe45b445648c1ab31c1e19a568b16ae73a616e53efaabfa4564c75666c04abeb8b1ac9a1c581196730828cb6bd5eb1c592a5935ab5e38c8284a47ac92b8d301899ab56a07a7589a9b53a4b868de2053546b95ee53ac66649f9b097e724e822773b509272492cc544e862269b376417c0112ff6549038d4c79eb5b302cc16fea623716e5bf3003714fad7523c6bd9cd17422fb667419cd001da56430d2c020153d39d0bac05af3924f4099b98f0704b6a84ddd874f1764396a99f00f273ab3a46aafe91250bfabbe29749c3fbae65f95eeb19bb86513a72611cd696fea899da2d6a0847caa7cde652f024ada32d2fbd48e2b8f39e0a7187300069db6569ea2b0a0eceaff4ac09884a6a8200d5c6c4db143344c4dc792517e698f66c2adbb2270c4a9d0836019c41d8160e288494759a45a314186fe32fefc54243df655e0db8ec26c23a826ad38a9d68bd130a100f24f45c5548de04147a674546c132c2d4ea47e30c75704c56d3bc5725e40c10a652e53677012cc45d9251762b841773c04e868a996a4c4b582290f680e4ac9d1f13af033eb8a15e11d61d66b7dc980901bfb8d8697f0d228a54f0d4a6a1b30c5c0ac2fe6fc500d888aa205e63bbbdc2e30438d28e98c2a620c9cef626fe5b43cbf20c4ea40687ccc6ecd3bde28ca44ee627e1f895a34b66078729d47ba3274929f6b7b6497d24ccf544054333089d3b12c5da42bbbb26725f0f8e8771625db5e7f723529842c182d57b395ef1a6fec201ab80c5f4df608086907cd92f2943ae7ddb0d91f4b353cea9be72e8d080cacefef50ccc30170a0f065cfc7a5e0aae2473e5f9e924daeb92b085af2986a0ae5ca79f2ab3cbe40352e353f6c5567d179eb241aa4e1ee664a0a8b4c108512f82520d62e8f63fc43b613962fe32b67c2a202296dccf3ae3456e1af043afd1c3c84a2a4ede7b6a3da244e4d1297277928ab98defd8182d80705887c2bcbd941e45d9a365a9dfcb158487fc9f6ce6dbcd0b49a41809f54c9390e4393a02efd71705075cb16afd2f8869a111fcd9aff7c30641544880fcce09892a259e38f072042bdf432d1ea701b2960d594baeac7d1f6fb2ab2218e29aa6b100421b5faa5107df8fbbfa3d3c9f746d6fb3de5034a14758c154d143e4ce5b3d23591d70eddf12889e89400432ec3ed118803897310500b0d7f532b08f7b3fdf14ebc0ec39892716a63353118af72dc656578b0b03112cc08ef32ab755a46754232a0659a35611245b7d601f4b6f25ac74e30b25a580167f5eb2fca390df0257401da05246643a64de5375d6d038137ffa415135626602e7e7412237ca307a28d226e9c2c886b3e7cf7ed7b60c9abf13dfee4884a3db46f0fcf0aa449c9b83959e865ecd617d1d805f47dfe17b99bf1c665a7f145c8569ab535913364722271c3a3261ece8501dae471bd2c7f303c0b380eb131ac1c167c120c451880560e833e0986220c402b87419f04431106a095c3a04f82a10803b0ccd85380435107ac83878320e699a95d6cbe42785a3a003d1c787811be7904397b0624bc08df3c821cb3bf324e009c4e22d9afcaa07a3e16bb370f8ae342cf8fc59752681ef01c8b4ff8926f6037a824a356b7e5b7da8261ff50ffdbb01de51127b70ce5e66724f06bbb02ad64df314cabc122b74c8fd33f973e1360a163a3f07acafa5248849eb3b6a021cb48905bc316b3c8525eb327a95b6c8ee32c58d21ca4564f42bb362a9c8fd96a3b947c254929b9326d34b873a25fae489de1edf27c814f8adde1f2e2455a7e94a57725be64e7a4419d762d7e47f2c6514aed9ba08dee658c451560a5cf27204739d5c12c66f4ee470a34d5f9c1447879520ed9a0e7bed26a553f2d377c9557b951a96fafa262d72e7d41615f9aee544ca4fb919c9bcee0d6976bc70d234109fbb676aacbadd9f70faa64bd6fae4de4f935b879df962e29f20a7ca557335c34cafd63a1117b6a61854454b642fa6a0ba16afd98b0105dd0d7cf5569592d1917dfa564592d3297cfa5b4585b3297efa274592f9916dfa5b4ac2f3296efa5b4582d9996efa264592d3073c9f7b1adc5105c603959545e5d64ee238b7e647d8421c21275855648df3ad6929c57efc03bcb06c50a1d94ffb2e2127ea2ac08f00a6828e0bcaa3b34207f33d0a8fc98d0a47f4f05624bd53f033ad9dfa4888baaf619a008f85e0ab1dcca1f138a988f389675d4954b7b1cf99c2573a72f51a6c6389d1c56fb2606110b5057456b15c87f561096e54e3fd2cb5321314327c7f0135e3e14a1b11ca98b33fb9351ce0e61888ad42d87f8c9f2e2c49c58147258fd2d2b482baafa18a0c9ff1c8a5c6785ef844ae69738c4c65afd9950489f845657e5cb0ae95881f8b1b271061fb294187f3a71aec06d5348da561076a34720f23bbc59955f569b0e28e27f5971071f519a8d2b75b26ef56f5eb2bcb3d1b4411981c48f39f43202a447d4c161856ed9b17a8b8dc60ed56a9a474fcb82c30adf9243d88a91acfab54273f3fc1d391beef423bd14890ff23bf98e9f825738dc23829f281dd708fdbf12221d8ec31433e542642a701ba98eee312716eaca73eec75f2c60869cac7da2a20fe96c34677d42bf4635330f6fe93cc045efa4cf2e5d6307c7dbcc3ca8e9f016321dd0ed15e8014d70bd79f3b6d35d73499886d7e32983768c7d1fcb24e4647cf3c6bd8275afdd50b7ff388fb7992e75dc315fc4810cb77b049e9bb0ac0b39f37347901f4cc1396203c37d9f57becb5e65a6720425b186a3441b20b8fb0a1fc354f47e22dd1dd292167dffdad7b221201cc2f42421a800c0c16e93ad67fe7b975ea5b7fa630781a6027e16b8a4f9b8ea14cb9d42903406ac633f3ac57c5f5632f645bc71df8837486f6d218792f8e11bbe25bcab315c7081133885de0aef1badf595976a8e04021b58b29957780fe38207eca8cdf228171f0716e063d41e1c38dd6f8ad7441c1b133033478d2090607b5148b2b1e8f900cb4500fd73229c2f6ff5af122a361c986be1fbb812f3bc37be290f4df9aba9d8e00800bc0de2e924844a0062a8e5a661efa4a97c39bdfb2e79df201b0207a91d119b64b7e25cc00c603b253511494416bf27c5e616cc2d43c046e4af9132b616c1c3a3049f096d0fcb5cd56d792f20a5d4db0ed3c0b40af52f5752816b5994233b9a4c6868055a6bf013e5c5e5f1a076b1effb43add14b841b8dd2f7c7b50c2c2faad6a911b62c30e5fa3a6ba2e8e67e0be45d91088167f918505d07f2c7dc7bde5cfb129631fc8b1474e91bacc431362c6742c643917237568b6337a9337831bc96ebd39a717365945163434562c5d49ad894aa1dca65f2135e772714d42009aa58655d03adb7e686854e065f7d9da4914f511076e8f4b08568a86fe083822d6014aff15fa48a9620e2ae8e2c3ca68dde29e182ab339b021fed62fdcdee0ab396ed620b4d015605563ffbc274114eea168e659a5adf4eceb6b541de112522eb5dd301a82ca1f4476984d727e917756a7d33d31c8b6656f4f227bb3ca5090866de243ae5ffea04c4c2611391feb03a59f36e800eb903b841a7d14c5c690651241e4915e8633fcb3e1d80eda4d27bbc866538103e395e3aa030224ef49bad2fe24946f17958b370282e3578204677c48aa07870f9a5ed5f86a14341813b105283c9d2d51dda9f323cd7aabf05f2f36703f1dfe641ac8b9a7b99092283770f900688ded54c1c4e7c52ce47d8cda76e4337aef41a3ef6293ff918aa89dc5b983411b01b749329a61f243f73d0ba63867505d1618773f1706345df61641d77dadf14f4dad223f2680b4546502204876e6cf13ebf40b855e402bab73bf5861a7f8d38543fe4938b8232ea2790cefde77b62c2947d7bc5dae460aad80169dda7b272a61859c5d3cbbeda45605f75b76a3bdfca0b721ba6d195f104186d3d49c51c32c4caf1ca9ca03653a6638eb58cae3a08887d46d03e37462cdb6afc092c217aa0544adafcd5da8c120ffe097434fe148eb0988684a6f2e3c026a7bca09d4db41d78162c507a886c4d1fc675c83fd20ae26d2c0ea8faca968de869967bb5cc16576949d99862b06ba852b99be3a10592a16fdb055f931765552da5e3269be74347bbd8aed139639d79dffc71334997cab2f3457f4b4c281f9eb960d1c68ec915ec64e6ffff6b8de237ba1942f63c74ee785c09c7ea4c8528b385364c5b46e1df4141476b78763cebf544bf79e82bc70e4c567f37a74b21395a9336b41bad41bd129f1636a1b1ec49b0cb0954875392416eef43b537dd89c285c7ec3f7328063f676681c864b67a17c2152e350f9b209b066137358d2da78581a68339a7ba3c57f26c2136d8e4b85c19c55e2de0cc21466c3fb40c041fbf791a5f881a02923608d93d0fbf7fcc16c0f76e4c993f9805fdfb64e2de1c9f985a07863c2903a6b2ed8932444eee12dab8e7a1e127e411551639fdc804f51afc723d559d9cef2f8fed3ff0bb774b62fad6cb81490f46371ae53c33f1820bac90d9511a4b302d8659b4f2f41dd8140e60c34ba4b72eeb65e27f87bdfcf0ac494d9573c7a6a9578fbd2f7c4c7262289223f8d3b19b2853272540e44b14f79a9c50a0d29a197314b346427da0b71ea6ea9cda666c1f256b6ed25d36a40a4ad528633843ed458d4352ea280e972e9dc0fd73af7c4fb85aa05a65c16f45afa0b046a74bb398af7bb568b7e92dc325d62b58c297286c079c5f4d5ea094cab410599ab228ae5bd42cb9b0550c823849fa150d6123e39a9109c1bfe1d5294ccd4d27f0f71e05bb20bb7944303b9e4865173b0276cb7db5d2cd2a4440de531e10b08b91c22875854ca192096c45b73da0a22e0102bbfc971a1d4a16b9567a680d54115cdf68e2e245d928e96f9b292af0fd69a1b63640248b1415a8667cc63d9563d133a04bf842cfbc75205ad569daaa3229c4eea79096bec8489fff611ade6ce7bfec4aafcb06897aaf2f52d9c6a188f628a595c4711c04af6f576ee770e9a7668dd48c5388e78e9d156ed4aa60216ce7273f6c019ad7c7ed192340adcc966b9ac11a4e28d9eb66030372512b97207c5fd1d8c97f59367064f1c7d61c46594efa2ba8559256e4d9b219fcc404cf2e251debde7c0530e16f530fe59123b857f7871b730b53da85541e0e0466558c6dbad40d1b5a59c686ce60785f3ec073488c07930041dab9de0190064d7a3687d75fcf8a40cea7dd98bc1f58120aeb75f8f4fe5b481286974ec6bc219d80844d4ea0e78f3736c9a16eb010e07c889da56e5e3e06864c46431d1742afac1b8cdf5a0c2ad465e04cc33e3530d223ccb66ad5ce97075f5130e8944ad9a6b662e58e44e93752c1923c444eebd6e1eb90c49e916eacd22e17b2249cbd2a0de2a18ba3fd722a5e84ab80f7d7f485650b321d6b7c1da02ca66324c03f77bdde9a5949d7bf3f294a6830601becfc086e8d2a1fe38e401580c86bba602bef865d7652fe713645b7cf385a9e0b8211e60e432e12b9160304c251f2f095db086fd5ed461e1a9e14780d80921c14bc734ae5291a30d04193cfa9ba8d4b9c39871478ef4ab18394e7012bc9abcb44a5f730ccdd74fc1d2729e8ca8ae8803367e2548561a81e4142d7004e5a8bf373ae31efdb3d1e7a4ed81804bb950c5db321815565a8757ba5512700a1cfd976bf1e72c1c6a47a80eb5fbfd2075283ea7d27e6760c060350a6683ac942be25de3f60370e5a416265193c2e4f17f7246be5f7295790ef2c0a5367f1c9a007053c56e2b8923c8fdbdadedf101fc29e4feb1c715bc1a0efdf53e775d02233ff0f3e1d54e97ecfff7b8f14756c78992f6a60368af7ea860eebd699abcccba994dec6759d6b58b6d9371cb4569bd0f5353f88896b1834e99626172645ba8924f6403d947701fff6c60fa92982ae60386572dfbb23cdaa0f928522048833745289fed72a7c7dd3e787dd8672d8240ea26173ae38ae663499bb5ab44709cade8e148bf76f1948cf0cb4c219b2f90fd0d54dbefdc87ed33f5628f541e3d090d8fb5fb29b6870088d81e82d9554a90ff23a8d0ae2dc6325a5bb2482e1a26870e7e4c4127495d5175abcd26b9f2ac936a93bfd6f054832b0b793add4ca31269a2644e0921cd38d490c98acbbe079d723ad5434dc4b737b6014a71b09f2ad5cd6d6c6cf5f79298d3686dd577ab212301efd3ac92637027a5912993a1e4508c3807fd69a6132a7ef21c29b9f8541f6c1390ad1be0301bb6a05f510888a99d9f586d0554dbe8779a92be1f6d695d991177ef3aecfe9ba20ba2a961ecaba3a221dff228186a5cbcf0bc822f50c26a8f17fd6f8aeed5e9e71edbcb59e526f307146ff29045a998b42d3d191d6ec468b6a9d15f79f1258236856f115e4d23a0aab128224d2106c0d6508f7a2b4b48ec5d84e65507994d996d6410385844a58c85ea5786b8cb12ee9c64b17c706a3af3896c008e497d6812253380440f20a8eff448ce06818ca72abb1a628bc653b12862d71d818f209c53ab44bcb3a75a558b79776fc14420a1130eb6f273ad4d7f5a70f5d8150f17909db344f40b19b566eb1abe4d5949cff00daeac422d05a330a5b4be99a95a31e6be176f41a2b8d3a0d0091e78fd56a040ac90958e1e0721412206aab6399c69ee9aabb4e8e7e3cf60e62daea721e76134a758b0177031fb4d56d91efad5da8ed3e0210543bcca4c10fdaeaa0bc2a78797a28c56234d773881b1c86b686e30d80b63ac380f4255517dd3b9640f3664204b8937b31dc015c0a6d7503b2811e96dc860b7cc3b302708ff2e7c2458399e17d81f81fc774a3ba65f480eaea3e3e7f90acbca53aed48df6731d684712487196381a6a6951759cf3875d83fb85144db9affc96be55726750f0e990f0eeeba4016b9a246d4617a2ccd346f364a6b66a382a84b2790ca010900766ad6fdffbe98021b76e9678f2caf75143e7e4fd5a51d2183ed95eb44b816a428d3821b6a4be7052d5167c91d8ce11215b242008aee266a2822e0d41ae5b483f51269c214b25490d3cb7ead19faa5b9d66d7e4cec1682e7c4e6c71fb60a4f79044ab4e9ffdcd9db492c6f83d0d44b688668cd036de4cdb03715ca7e0024cf249348035bb3da9ff08e5dbbf66e075857575e4d993303c6c41be5c89d51b1530bc462330854edad90a12f2ca241ff547da5a36a2b47ad59396a0d5686d98673df7cec32c1e9251e5d06e6f91537a2e2fec8b06e9bdaad9deed790b8f82aa9d320877b476d06041604158b7f6849d96c0845dc611a7c656f2a02fd6ff18a311f751c2f88a29f1c10da268cb724252a4253471812cdf59937ba992e0c525383a4efbe7ec5ccaef1d08b48fc26f4ac19953b335415abed8d9c37e160c64a1ee4183ba89e455cd9287d63a8e735068d920d1b04a35ecb17abdc28bd6427caa0f268ea1b6cb2eb92888b21b5d66d5ee5fc6738d64e8ff8377981470f9db8ec48b7728d789ee1a36ac56d2bff7ceb9bf837d2593d43a37a62f3bfb49ec2d08ba600f3fd4420b2de57b32b188bc7dc3e382335b4d29ca6f710e361d4d10a6f8c862c2b3fb795288ae70b7bb09eb1edb83ba7b681a8fda90052c26c342c45081726141baa2433636a98e75b239e256ac88b1ab6510d2aadbf6ae888b85ced402b3cb2d170429ca1002f4ab3107c050cb462bab70eeb52c2f26ed7fc839692728254a81b3f30b1a6e543574f1993cbf1e10e9e88b9fda7faafc456968e0650bff5a5ced4f9b6adc81ad0bde6c6dbf6225e4e23fe49e1e2d66ae22a81110ed5eb7e91d6cfca6b8ba976c7945859e82a343e9e74c825de9f73ba318fd2329c963e0aa2795324265052d95c448c73112007b3344324fcfef60ad5e47ca30c254c02c7753aeaff2c05df376dd046992694f0f5acf5b57a9b9ba215828c65d4df5a043450389e6ba1aa531b67330410ecd60a4627084b1d3af1cfcea34edab29aab22cb2ba31595b9756b7cec9595b8b36d9c5fc4e6cb90d70dc12e32786831b74c1f98c44fafe8f21a749c5cdcad45cf34d0d73c4626f4059116f1ef43e0d6a873f4c65d562afddba6f8a520f175c2c7534a507d2ca77d3c7491983f76f1b760d61421fb1b8473119b5f2fa79fc7660772696b73a10c8c06bc8ef96009b6a9fb74bd88ff1efe7366423bb1412185855342d54853588024b9e9c6165e1f552a121c97be5e8b6b29e756fb3862bce4c948ec26a5c17a46c41ed326b8c69499311579b5d9639990f8bda677dc90c77eb3f8cdc9b3cb5423477b9b2d97b591b4575b1c6d45468b7db93672683b089a558818c3906eefc2eb892149e617136cc2603e961d098e1d224b757e77997c98bd11ecf47ab9d7efddc1cbf0c372bccb6326fca59d0d9f66a121496353cc23b854438c49e2d9dd1ad7be0b2477f9acef30bb21413f817bcbbe646773657bafe6e7c167b2d29750475c3a4702565d29602b3f13ebaa6253ac02a1d1d5c09b1987f8bc2b5121151a73f9e9719e92bf386c011c5be75278b6d849128075214082490503ef34623157492a1c1cc42cdd61d040ff09bb6f00b540111d1bd3bfb2b94fc3e39bcb1e9f5c56a51aa6da32a19ace83a3c92eee66e6931ffe3b129d89e2c9972aa39eeacabe8f19c2992533f1066c40a29c1022afa5d7b2ada8eb6415a5432a9bdb15aac56e9c8973358473c866bfc2bf0416f640d081200e6c29b3d89eb46314124c855a8f339040aa8a9fc0367f13596fff80e4850853188e07282e7e55361e28d1e0fa683cb8b12e31974183be89eb065dabc4d42cf99dd0b0c3098fa590895659c8886aa224285f3b58be94830c63c2a31244ee57982278446f4bd8c06578c9da7d7c585cbfbb01f6d55c15e7abd5ff5c244c960e569ba691bd047fb8fa55f3afa11c5f28818550da93716f1d4cbe722240cd42855029072a0ba63b8709f13c808aa61acad1414b52c39ff1fac40cea328bc76336dda3c62eb056c5b1f51f12e9c23fd8c0314f16f900d22b4f8521b7872ca022f5b34ef86a87fd7842c1d84d563cfccc5c0c30aa1bdbcbe4e4bbc85a38ea7f537f592eca5e90e66553d399ac7b7404e61f38cf8cd941a1684b2d427f0d42f9cbe8ec643211d2db4e644f845da8853d75427f1208c665c8c3f6e8a400206ddbc622b587517724f469ec4bf2402e5edaf1374f9835a445e25487955d3543ab911ed1b8b08b29e3de011430ba8b16e33aa1370ca48108dcd8be3446ce2c76fa8251918d5840b6f54a0818640ca6c0cb4f8f053ca3e830a977f2bec9f46324c0a29419b8b2556b96a8c024a01b3675441d54bc40f205d3b5f110a5a67c77f2a8ea29823e9d991ead542fa1f940fc5c0471d21bd3a41e69c101c598b8f66dd23795304db904bfe9f9bafa1355a23a80904e104ee77021d1964f5e24add201003e7b61c93b01aed22f83986023142c4bfbcda90486e0a210725f62898e9ecb8699faae311275420a3b9c16c5717e61ae6a9bff4fa59406ed90976cb64b31ffbccb134b731cb02b28e586bb6aad29add374a5294490e309ab9eb2865e053f5334a384aefdeddcf68391103cc8113a436d24d0725e0a52225b1cadc8d9a273801556b3c955a9d16df182e2b03e179c773b52fe8af28e9952cbb707dde0e305569515aee5c58d33ce096798ddb7bb0071e509316377287761c2d5db2b8b9e1ee16398eef932b8673268fc5f6ec460aa278402f79b4bb96c87f3701bca8f4a13b79fe0563aff691de413caacdb71eeb24dac3f8465c012d6092a86f0ee577effb2ccb76a48f83696dc253144e23b0effc7a02d4ab0c7b76fac9312f3364db375b733867d47249b7f70528679c660f3925e4057b9145964af96a56f50c972f1e73a4bcc3d181466ece1e8947671f1dd856e4a71e72834f1dc47234ba058512587d970f09284b3d932433b51b08afdd3285418bfebf04fc84ddf70f1159626f5d31757f58141cd34f4df6fb1917a861fba3cf943f96c10c587b31f2ee7e8c4b3e18094aaae1d2f104623eeda9f2b3231a8816293c5af0bbdb5222c2eda29aa5cde982665ddb7d4ceb7f8c3c649948ff25a271d4a1dc52df0b3ef753a444006d25eb21a7ccb1393d9834b286154a01b18ea2ab869dd7ae0ce4537799913b3418990a1e28037e422d844088b8b9a3b4021394baa2214da8bf30e0914996071ad25d0c3b8d8c1cfca5a012fbbdc2341f20d909d4e77ea407a9b997fff96a2256cb99c464cd3c90b9d25887acc3c579c63fb80a6eb40a0dd68019999247176b662fa54bf05cdf626fb438639b9ada96bfed873c3bfac55fee82a36e73aae27719279ba176090cc021de6bfc0e19acd1f9adeda4c33051b828fd3e41da347a4ed47ab2a4ef5b87b4fe1ba8e88ce6213e2eb72b367a98f30971ade4172dab8a1b98f2e17b0ba9e41f0e4aed198a91a956769fa0b6ead79a80a7805458d73d56b755daf7bc48cc38909ec98b0651a328be37c40a98f431393632a110ca70bff78d972f919339fb48e5a4869209adf5eda891901c56cd8f6d98b0ae745fed23a4d93a0fab3563eb5bb9da0a863434949a66382a56b6b9089938b62df738f0858015b070c55570ff57bc30c76f3843b4d118a1ec380e24b1136780059d8225337e3503f396eed1d66802c7a80dddbea735c40595d9e364805bf97f3478e1ea74b9743d0174ecf1f094eb2d36527fb3ce50e330475907659f2d1b5af087512289b7d44e7c60b09b2156ba6a7416d460a44970a9d989ae097c1ccf482e39dd484ceb66c5ba37d232d5bc88fb2b1ce159970af183fa938ac93931ae98dc04502f6625d86099bc9117854cfcf67014615e6103fc451fe5eea899095556408ac7417db7c34aef0ecfb6d438298efbd9c5c0a8d433ca061ac1e4cf57cf6d568b7381cc8d02cc3c4836aa5548e18b8c6bcfb8cc678926b13f5880dda056f47132bb71afde2ba817436fcaacd31b17e6cf2babefa5dcbf5f210d9a0403a516bbf333fa9437d1f52b769aea7dea53fedb0cfc4de8e67d27b6559c2e73b4b550d78ce2f5a580d9520779b9255fba16946d2be04be897c5333ee0a5e1641ca9e99c10f8b6d1ffaee431814e4d1aca383b4113414aa955aaea8cdfe47389d8e0eed2ced934cc37ebc49f70226ece570d060123cceba76d22100f0189d25876826fd464f4b65f99850749483f1333c710705b76aa7208de070c1a1e4540325bc288d27efa3a0a5e09f87b671f727b88d24bc459935ea295c6453729c5854093f15b93f537a04571ad67888d7815c49b59784bf2029a8e998f5a9aad96ebc66db4104687c4f0f3f859396883ecca4fa14607b1393b13d65ed1d89c6fa97a94f7dc3cdaf160971219e655949993e090ba63b97287000874dac3aa74f33bda1eb583a7c20848c71b1fbca63217deb4209a1d52dedeb7233690cb1424ad10dc0e5879fada96a000cfee90082cdd5f901c7e7175aaa1aa8cf03826ade0415c734cbcfb3aa520cfa92dfa6a1c1c378335095e7d7e4262c33506a03810c279dbb9eb391e1c819e649ae96de1213d3f46c762ed53386ea74696ea6a412dd257122899d0e9b04dd15edc29fa943bd54d0714f68a2e789b564c904bd9f892b0e2b1384c887688c10266effbb8bc8e80c22e444e48fa9e0c3fd914776b6b7dca4acdbbe91142862a8bbfbe123ae536e8c30d4fa42484c4e0ac560a89bbc89aced1796af1b57bb01a2376320ebe48a61b84d7dd7902a4c96ab6d5e047888524ca25ce5b7a7cb6ac4fb8a2d227630de9b6d65c50a1dd9faa69fd00ba08c5ebc9140667e6ac3cc971128597e78041ac2f0420791c6698c2bb4543686c89884e580a9736352a53fe531d03ac98a57341ad66b4c078ecaf8de658a3a4c82409a75512273436cb31c518b962c298ea5026048aa4c77204ff779461ba57705590cf63c11d395196f7cbb9708987cb1ea5c11a046fdb8ca0605eb09646ef7641e5d8032cec9e66020f46f19c76e9e6a91962fdbd018a922c083dd629078e8967ce7a06333f98a49a6ba2c218b666b1886dd04ca4085acff989c3ce968126e4b562131a6b47a4e2cc91b6bddb6bdc218c801c8b3e7ac66a29b526fd49b8802b98170f8b1ec58d4a266a1f86fe2ac975970a83cd6308aca1a513131022594aa68d9633e10ecca19b59aa33d5f23b1b79f5352f8c9910a12995cb0a2fb2e2af817f20b9493a7c4de262000404368f979df1a62a8b42363eb16bd86827032ebaec748cbe73c690eae78cb5521aa46f8a99e992a433a4f72bda591d564c3294feaedb0e7f5915dfbb326a8495c67a254529ba16484a183d8615e25442cf3915d73a9c06d66d684c4cd6338231373afb8118844faa81c8ec8f01903dc162635773d6d61b5c8f9ce0500b989e699d75b160e5dc89bc716ca3895d867f39adc543bdf82263970f40a32634eb3327d8bd63aba21f6984effa4e46093759f63aa82db04b2f4cb1a216a970227620f1b954715f60f7f1b9eb7bacae0fe17144b858c3772ef4dbf48c419db9a49084870d5cd71ad758e9539979c232632c5e9c64da76af66c17fa7f4596494a0899c49b379ddfec460ead01ca4174f4e0392c1518f56b8d0af8b9d22752c36718ce6b063fc351971938514b7de0258819b4d31777e1744fee5aa70cbf0a31723bd88fda28963b2040e41d14d744c772832fe7dee1523296cd323bcd84071f385715207c38451eda2397ce11211788c342b9129a93434d088670d26252ce15544cc543f94be2c884c8532d12581d09d46ceba3513d98d84b1d6f3bcc47bbc1b92b34f9f83726f2d0c4cfab41cfe97feced33912713e9f00014fb22cca4453f4b81a779444f43428b3e8c2b8a071df96398c9076a1ee828733c7627390e0ce558eb352efc9c4009dd9b97f8dbbce285f859a37e5176f0bc9530569d6c3b5c02e6404644192dd2c6c0b13b521bfdb1b67dc171bc6004e278a2b578b3edeb9085d0223d13febffd90f03a3462efae350a919f9328bb8caaf7a5218e789440a409ae74ca6deddfbad54e8fc984406d3a50cbf1854f3663006097951fb3aa42ba933719277461d8b2d6cabff389d2895f5064909120a48923be2c683a1c4f68a03f0c09bc2d8414a658810a2a04ebd77ab288de4c30a95490d0ac14fe5b895289896490558f63bb67c5216c5173e4a6e40ebb46ee30c74b6d4843156bccf26c8eefdbc947a2768e5d36583ff0d74e950766e922fd38e43f5a2933ad69f6fe762e75f6c9d5a727b4002d811f9ba63cfc8beb356e86e95c71d03799ed981684b47f8b7d310b7580dfb4f8e204e797ed967f2b978c7e2dd43eff3d0786a065d928d60668cacf90eef34eee9f09d4fb801c775d6860744eb51d094905d8c7911adfe1faf2c867fe4627d77fcb9914372493a8dd003261f46b2696473134c95c371dfb5bc39909bf9fc390d0926240f97d4b1a69508e58763d6627c50b7f135389519b744bf9f04decbe7e7ece99a4f4c74509164d31c7a52a7c0d1b88f1c43da4554b8039c441e9c675cf034023555f0be2529cbd5c248b5c8c9f2bfe3f016d50b9355f41b0c942d7174328f242ffe7f933385353989d402cdaf0632ea7ea703b44ac05576fc03130ba251ec55af084f5c078dee0c60ff0564b820138a75564d26b96cee84358295560a0877d3802fd06521ea252904433f201767caea11d05677c2d4192ab5bdb6daa6c0df6f4e7c6cae67155284002a3c83844ca6a26b52acb7e4be1a464e42fdf15c9e81dff6681c3e5b824bf34b3e4cfce2ae58b22a4b07d85ee104d9e9eca5b9ff326d844937e396d94bb25080801d92ce8c64da8657e4881c630b95fff5fc786cc3caa9ed6529598e0fb9045049f3db5ad0eba7a157a67a9399158ebc0176ac1b93da76c61628f7954ed92d5a371b9a0104752ba50d4fcf2ff575da5e51bd8b01c808a37c13cc38682e7c37193dae9162df1a3440cec77fb02374c4ef83893db3d79009609fa70859a0f2f8c60a1d5432af00a0533185542bedc65a93a173988ed74f4558eb35d165c4baf3d98b3cc1b73c9582cb8168574c3352a3e6e4d6594f8ab17fe43e9eb55ce1d5ab9e208ac574bfdf2801e45b7a888efb056fa4683d11bae189ce3f90c703b7b4f170b0a2c3b6acfda06997c2fb3c52c0567fc45eadab090f713e7c96ce88180fbb424a2656cc97b1e324dd855576bd54733c65fbff84848c8c170c000061b16b805f5999238343fe04ce5c28a8db2af0a120578b992c53bcbf994cc6530a0f045a316640495df2310752eba23a4aef186368c4e6874984e648fc68e81a87b54158a1b87477d7f2cfd8802a44942252f0b7e54a6e3ad34b8235ba8c3f01313cb375e0e7eb63c0e31e91b8913335d777d912a5201ba496cbb2313a73a1f96f6248a35771cc67622c1fc59b84c1ba040cac4b26baae4b26edfb65b50446f4574b2ee5651d30117fa83f32db653d04eda0fe4f470443ffb0262eedb92fb906b3e97ea8b365924cf75c0a28d97d3460ed23300c29a3a08a7fdf97739c1fb210a43652127e66beece852db543a2886e79d17524766c719b4b0e11096c8819fb6c10f14bd9bc019182734ec0cd1a16152e3e5c31f78fae7c85d4693fa7ea1d166520297de6a0fdd8cf8a3c139ffd61ab4b43279e381504e13e44252aaa415605cb6af99e65c50c984b618ea26dc6f3705d1e7af48902d40d764e8a58fb917ae5cab83b27b20864d60e05036801b6bc8fca352ed0bb99ada1667f482ca0bc13626edfe16aa61c214ae32fa41d14330cc5c6ba502711b32a1b2cfb96cfab76050541bbc2df58e661de408eb3e2795f012bed2d0ef3cdb975c98dd0ca3cc4540ed395201f327fa1d19e969ef418263404d687bdd35d2e413ff70d77785033ac450a1e314ad84de76e3c124eb547629026149c2d1b34a54a5e0710ad1cb261116c2a94e891b5bffafee94ab3b621ea7914986fbe653422829705f2ff99e13aa443c2c359001005e48573e11419ff9e4c5a6462608a5952c3e268508d1804745ec4ba9a536ec7b9eb80b095b41fc12fdf851ef25b07fbc8dfc4cee522ebeabc9f2ce22326b02526fc04d49d410b5c50c9d75f851d599ec506096fe00ccaa78b0e9942342cdaeb56295c2e96850906482c029eae0089069015b76e88056f4da7eed0e9c12a01e0aa626f6bd4bda0b6f5c0bd35101507889052172739739cbaba778eb8cae9a8bf9285178fb0f08bfe28668bbac2e71fa5f9ae9c07f430fdd8bd8233911c4620a9ae8e1d15d032aabe3d6f51cb44f9c0671b8d1f4b6d13d629b73a735156ea11503ad5093bf217f1236c236dc2d1acedc3ba4ef85a9c00e319c618f45c205f5a14d6355653aed2931227a44ac88ac8a0495a9975f33c94896424ea9c145ec261f08488141f957c0485acd0007adee764a0bc3503c90bc5b0e9aa9a4675ba10552ce51ecd68b2c7f73c62db2f985ca03b5b0a0ada0843a88e177cdb058306d2a94d5d090ca9768c269cb662e5a6fab24eea2a4ef6c3adac45404b845cbb83bbf9a938edc73b12ea383beaefcb8de89887bf343338665787749147da4425996e118141ff49c1020aee76c737216109201bf1092508fe2e9dae6aea1888e32b47fabf2c72c15935827cca01bfe216fca72a398d4082fff44d586a12fc3c1da55579a29d0a035b5b717a9d68f893ef5e1ef069f78db6dc358b164b08c1a913236d052918e126a14abd0a45fdeabd70307be58bea683f077985909ac83ba4651ba6418cc258bf4d474062985218b9ae2fe170f4ec737106d88abf10499c4bc31c8a0d087b127a1fbbf516659c39110ef6d9399ca225abdcc1b2960a2dcc019253bdda40b6fe669429603c2aba908744042baf76a32d1de5e47da17c8d717856856f8ce89d14b60ee827baf4f93defa8886dde897617294835bc158975e0656ddcafca210debb0cd45d2ba9a8126b07c5a5485c3380e248d820141fb444b09f3375624f60a8b1a9ddaf1707dea38f14a931ff9d6968d6b1a2110b608a9fc876c0a4c6e0b42222ffce37c2cef6780263f3d738f4c874f4d5aa539227dc7b9378ca242bc4d17aefecb03eacdccda94e428f1421469ddf8b6ae100cfd392eaa47ca70a0a2ff990c92dc19c1629a0315b36b25c34547f0ab199e4279bf724560b4ee55471d576c1d603619561921f74e0119b3d023a8729110165c572a9dc72b1f1e4775eceb46929241f703d5719b8fd108200923acb7891d04d6dfce6463554dab766dfc35e618c3143e80e1aa8c132cf6b74b8c60ebfbac43defd8af5bb7c93631fcd4467cd2f403ce0abc8da461ab48155e9b05ec4f2ec2c617fbb348b1d58deb34c29cdd2722b6fd911d6cf4fcf3f21e43213023eb2636e77803e7d4ff3356cc9ebabd33ed801c344dbc5d77ab8349448f1b806d375d800e9d082e9d8516a81aecd10e8e1a91da89b4047a696a0ad5b78ec0ad8a6cd381fcce260c261b894fe3b43c3cc4b12b9dcbbe2f725d3f262c15c85bb0eb260636f671349f80b22fdab6ea0dc87492a608774d77f7845f0310fb61fc8412c5f2941e2f634e9b1df1e4b1803270a9d0b1f21b64237859f8118859603a3bc5403a598f09a439aaed856f98239638f7504d6310c3d6533b55e96502b34bc16bef85b68b355f4f90e388cb4bdd9dafa9b00e706a4dbd0f670b75514061a3bd41928bd4d3d3b0505fd057a846f4fd63ad2c8af85eb69df9d0baaecf33666cfa24850a935448d071159dd843a17d4b352880e92bd99aacda9dabece1ed0bfd7cbe2c943f1216b210b0187b3b380693643147ed03c3d769977806f938ebd829c973beb19a511b9b5f7ba364f2fd59dc9763ea4e72a3e12db0541373f5e6765c74cf3195176d789ca53d2e253c4b40bfe8807b52a92edcc64216de1aa5018476821bb36299bc48e659d143d4b9bb5ec20090cb1607b868c7eef5d79ff1351b31e8ffbf56381cb89ed3fa4b45394a7535be204c6bb9e62146b64a955891acb8ace3f39e87f9a92a716b29ed52371dda5a401604059ae69cdab47a9e5bf47052f7b0a5e28cc535cb20d414fe9b574aab600042036aa1651c5b44b1f7c5403aab3880edbadc12da65f4bd64698e50b97bbfb47f14b4281382ec4a04356cc4d281c137aae01c151ebef9b7ee472bcf8cd9167ebb339dc6f08faf3c16eb6c9ac2c61e2e3b18174871800d184ca4029ac0abeba8e53422af8767eae4281394aa1c6e6826bbe474c5a507a2f5e17737973ed2c89604f333a5e5bb38666cdbf5025d18c951bf3604451bbb0a1d16c596b348a2396e32919a37e1bf6ac4ac8b790cbc1bd61b01a0ba6e061ef0bca2b356ff9c517e784430d1e83d79660f75ecac4e837d97d7ec1ad957ee8494a0a14e104d24e0e94dc46f1483547ce9a1aae8e310f8479aacd1beb19a63cfd4b557caaca2fd0ccc9b27d83dee963aa551f80f3925361aa67f9d2cd7df6b6dbe1569b4925f0c63e73f273e485c2e1201bb27c69f9b66dba765b366314f417c69b28074db218cbabd0379c5d2a9057881c1b6e5692ba146f91f5d25efc9911212f148787ad90ce33eb1b0e9ade9a707f7ac03e040e0c9bf61e0304f5f70f5da720d23b0d17d6ab141396d3e44de2675514d7b1dde736ed0f8f6e4881c4d608b95a587a12a5a3622bc905d4c1bc438b24b342d24825497b22230d20aed14b2df3a657a3828132caaee2e1f74988b517240d330435132c3724407847f7b18e6552b7a908d790ef632670dc0ea881829fe807c848f17dbf001a6ae6f2cd77f202741cf70dac279452b0a3ff0b4e38822cafd691968dd3f3a079ec8f521e995fe2679fae6a116454f89f258fd12b61610762510e10fa976eecfb59a26f12ff566e8196d980413ba403f834f17ea881b517d21082d3e047222c00168c0048f4c2901e865731f55076bcf5c432fda8ab9d69b9797527cc5863dd387f0371f7f5e569d399d7ed36c0da9eaac4157e2f28cfceeef42806733a6fdaabd41224a08496e9182927370559a9f414a69b8344011d1e0699c0e82c663b75022b56bc0e159b175e0e418ee4845b0e36077a54496f44f2b1a3824f0bf99106f39bf892f5295befaa9cd044bbd289569b515f42c6631c090b592e6a7c6f05ae46009769a7d15076353a586ea27a0935beb16e3cb97aac7ef0a6b441fe306eb91cf27693acfd6011bb67e2ba9911e59be3e6b03b273924bdd95aaf1196430c7d3f19a26f1556839bca318a2635e3210640f10f10578775b9c4efaf43815955da6b2a166c89fb0f9d63c1fc32c5cd6d8ec5879ba84f42c635de1858a78deea28356510190c9a03318830d06c325b589f742bde514be73df6d63cf2d10a3b76a7245f2c6f88e53b2a0e0803a4620bc44b869a7fa24c8cc2d136be2a07eac07beee0e289cfe3353959dfe54c79bea0805265e620c09b48001aa25194357508c54ab038044093430c588c183c2262a84b09134070019c27054190083021b900c0200c25702001ca1d12f35fdcc5c8e46dfce0c26e0cbe820b4624945fcd2bf80ef9f84afa3d61c8e63ca6565a3646b654a29492965370426041f04dca8097fb8f54e680425ff66d97974d2e4fcbbf2d2a4f7de85cce46ec75c328bea6e568035a71172efdf95c6d4a239c3ba69b6362fb311afa1ee30a8afcff2850579d206c2e9022b28caa9f3061b841662af204b389fa56e3dd77b51c61b05d543620151818c92703232a29866477476a01c67bc1042263742c9a90858018e4361433c23364c279bd785ac0b72c5e029fd5a11725dd6f510a4ba873041a019d7b2ecd2b205093bd6dd21c6744fc939e7bfb108c229d355560854519495f484744909458c4e6ce636a1493c3c24b75d125143c49b55e5c11d6d66e3a9f7decf8ab664428ab0c45862c858b03445d06eca70be05ccb88ebe6060ae604e3ce15620e299853552b3c2b862604de5b81d9570d1e9e280c910dc4edb5a0a17d98e50459102f512527241a1326299a1a28825c77eb8c274ae65209ec63ed0d5ecd094515f88c78f1600187383ea4af399b27680d353c3d40a0151f2c0d5dd9af4e81cd910a229a09d1536ae17cca2aaeacf12538836a5ee2c803a6456c07c612695e8d65024b989c8c25a496041c480b8563226a972ce39e7467c8399c10159942b23373a11ad1cb12429950d76e50d2dbba2432d65a794ec5bd7fe77efd22eb46a93b6805e9008428a6939494467670b1d5f6f7136c5fec8c98155c730ac1dc9efd1867943db7bef6273f0873b22177f301e369f27038ba10b36cc32e74fefbdf79cd3caabf7de7b15c6f8c3356bd63eacc3be4cb9cb466c40f293dedf9a75ef60de7b1fc6c4c3a6c24efc3ccabe1e60b1747763ff6cf3c4b77e23be41d53d4de5496129694106eb04992354442d5183131784ecd28adbd9faf88a993a45c06229e79cf314d5595e4b9172cef95c128b21bba2ea4e47e48ed8c61fae2ccb3bdf7374cab0f99a68c90fd99ea536c67896d29e76f25a9a98fa6bfa3b0b0b8b9265c9da7b2753a4f6de8b58a4262fe3aa2c8d8011f5c52d09c5d3045ba999caf2b15ad10cdada058551e872165d67a9f73a40a7959c735e779ce53a24e7412815c847eb2d084703901338376655132acc5dd7e355146994586a54e2c072525860c1a456a20d4dc56bda83c962b362e2b0cf3437a0134726106818360da6ee5cbdf7de85d1a4bcbb532a56f72e257b70015cd6887853e2a9f55b72935e09715587849cf3de56900ed9f32aa90edb8c5eb98091125dd1046185768a2e6d93cef178ac2b479e3834b3140e8809312693147362e6ed4a2bb96322c6c29eadf367ea73d6b4c010b23a9a59aae3a9e1127312336311010783848ae9526669917bdfa37a3f80bea6d28ec81622acc4ce4850c4684565b77316023c3877b8ae90a276ac24412e5b99ed958d4c1b7386d5d9aa6f27f15bcf9b507cb4b1555e5aaaa8536596162466e344add2492a81a48a86787b4b5d044b2f2e5c4ca74621b81864198c4b36292c8daa86acfd7b95d6d40167a084d9da8724948e2a829aab17536e85eab886ec698978561b6b04abe8c35b9b97b04be69f449c739e34dded021ae4a5f7defbeb31fe70e51e0fc6384b2570b46d6cc6e5ad3783dd9639bbda4284dc222983f35ecc33c320470ba604f5c4c49a0a8f8a30b7269f14218c6c23c325f2d69b79ef3d6f272f9f7ece904fcc1625968314f2f98325338543f11d030093789f91c61402f73d1701881da306192f457538e720286831272e6e28241f881a2a49629a45cb84dc3f150d008f14ddb6a9b25f70ad5e1451356121918840f8619210b33e5f265cbc90008bc0c42d960762ca2c425b4a6b3ee752e05c20aecc4ba9ad678b2c84cac6a4f802ca424c18e4b6a33322eb25028384000a11433d1f01eb1b4cce2da839e79ccfb25ad19457c6d8d4d88931aded628936a03176e4a7f4de3fbdf7b4b24f651f689c0105344b2d47286fc8fde5b4126492a2e4e296b400137d6025a885e6d24c8aa8b3664c08aa9ac28ae47eb27aa23e5ebc7d0ee71d01bdee3a7664f14bd2689f1cc1c2e711ee51c545d3ed52e8f24570b374e90154af38ada8899c9a07aca5a465afc8b511351715ea82de2a461c412ada9be0f4139ccd20b52bc4ea434e4f36eeeda982e2e224e67866a2ee6a741b47b2262a31c5eb43f52c6c6c4c6dcb845b1c1a01e680f8867b6f098682b2d0cadac7defb3fcbcbdf8ff8b189c1b123ab95b6237c124f7e62a121b793ee7a4cf55531354d001d68923a9f80b4573def0921aab2fa42c27495e3de5ac6049755682e8454025ee656a02244081a1aa40570bb769b6a40e4468bcaa8eaf5d202431b808a02896d0a316adbf6debb10c489bc99f01714fce142bfa23f8fe7085a29b4a19b67e9c38867e98e73ce79eda59de5bd6456472b6b3a2d8cc1fb66200b39e7bc44736f269fd1fb359bacde521ad07e8d4b63f327e26f7aeffd44de691a2b50ce79b15c035db1a1a979d59363505b5c6772973889e10b5967464512c46493158b092f37262314d765ddd15c00c11fbce7c99cc032239b73ce8db3bc218d6596ae94f9aedaeaab39cff9532e7bd1f16663018a01b38d53a4f15535aa116f9031c998fc512f8a565e382156a334ca6147b6ac584b48372748b24d6b301a6e404bbdf7de5b9af2ee7f2ee9d1e8cc6bee9010d55d49bf8a3c9c7d704e579c89bcb58588a1ae33bc770ca82b97b71b1b298b01b850526ee9549168a1ee6aedafb43c3cabed907609694591f4cc24396496d5626fc67c9c7023eace16f7defb3219bb6c436e6a504bdaec11762cadc5696c0e690d2abad6f1632117ab6f8f4a96424b6e76626936fe79efbd160fafb5867e1dc4a8c6a66ac05e2cb1609c050df52c4b24290a49cdfb27adfc7165efbd0bbdaef2cef147632e09e8b29fa9ecded2cf0a65855aa3d6a9b56abd5ab5af908a74529bea7ec439e79c7320e42c9320643a4733f35cb10a39d69cb7a07e80b2d5ac55695dccae72464a3d291860b68cc4ec34a32f8248646433d2567add047d4aaafbdfbd3be917e22cedbdf72e64b195b775cbb1d27fb0f5e7e5bee39c072c272482d4a6382f5675702f1742f466ae316c14da73c9d82b05958a6e79962e39e7bcec5897217fb3ccb17ceb9f1a9cffc632ac6ed435ee7289dc68c76a2b3cd4025a59a28ab104882f9017eb96f64daaa9047c037befcd4878c6adde7b9cd4ca2fd7918b283e567b3287c30d73b25c8b722f825c4820299e692991159f711f36cdedaacc1cb9bdf71a227e378a89d10b406b6a469e56d07222045b34222da72d135542af9d9503ae29be244e534d68459b2fa90e2e395565cead890f6c4316d0603cbd6d5e4cfd35f58ac660074c4e4b203aa917323ab0942da599841c6a6e97ea0e8348c21b3088650727535f3d5a605d67cb1ab6ed2242471626ab95fe78c1c1c75fecc9bcf7fe37c68521c69039ceb9cc39bfa02dee92131312de06d36f35b99073efbd13e30f573eee7461a1a4288a7c6458dc9c4cf0c0515cb1ac0c6709c5cc5807676a02d544b5495191705d394965386969d021c7a2b222546851c032f3143a8d4ea71eb1556f2983df53f4de7bdfee8447c49fbc97d85eef23204146ad40b281396a72c969c2791a414191963c8bf1defb2c2bfce166b3da7e1eb0d30eab2ac4bafe786fbdf71e9577ef1d8357edbdf7fe7c41b49cc7cf68acec81615b8a207193db293adda0984d5fe8d88c30ccd00038b860b74ea704a982e92b0dc963aa8ec03a7f92716a5aafe66207bffc7df67399963c98e221bd5befbdbfa07d979d6419a779ef7d0b63fce1cadbf54befc9fc512f8a56765ab961eafeb3117354ee60a6ee1788271108a51d1054d09fa4220b0c8e93d3071d0e3aa916244136402f4c9bb215142b94c4a4cc54de5c781f004b73a1c4829d389233c2c1424936cd78ca429cc1c60c2e233b51d22424a62a0eb22d6ed814404e70611c708b90c8ca558869d214e3c044938f928ac40c915a881bccd2e1759c1fa8c466b413ecbdf7de6c4350edc927d48ba9bd127fe4bdf7f1cfff24e5b6585e6eacba6e9c2e48226b6063642314e015efbd47c61fae8fdff094fc31a912892b463dcd60d5b5a55c5b6cac3b9b3308355cdc6062507f5dc92b1d9d1b29755514852a60b846c4254e1536b0f77e967ebea467a071efca904225e10197b7de6cafd83645786ce52e44de2c9d8fc620222a231338909f957d33b21bb03245f2a12273e860950d26cc43e4d829c55ad377076a9ea53c2bacebb5dcc09450139651738e8aedb89375d74892101db131644d704a0b8e9f5cd2a49337982c594d691a9d96a102354b779c73ee45dcedaa38e7bb0dde7bcf42e54216eb6fbb2f92474c2793b1afb998ac8633a6ae87891581c5f25614c2287d969af8a1517d6f32a3bb8e7517f2472b6938e79c733ecb5cedc55a76e4d158cc71bfeea19c33ff09b84c24af492a5e5c14f0026d82e2a9330a726e4104e113d8a47be974a44c4a6cc431a83bcb3857f73e97f4defb75b78b1fa8547ba018dd7befbdf7de7b33bf6927efbdf7be8f04ef7fff4b6b00ff97eede0f61634d7f1f90a6396cf8fe4c6b001cbe354cff0e0e1afe3407f877f0c18dcf83e18d07418d1d940f98016c009c61ff19080138c3fe1b28d0abe120cc02f7cf81efff017b1f06f2be8f734fd374f07d3f775d588e33a08732c61bec79d41de4dfffd08307c677e90a600427fc39b8218e371dec1e3c78d45f9ebfdf00c31e3cfc8759fa9f7fafd7fb9d96408fb7a1017e7737fa202b3757ffda75c669e798ea0b6ad73957ace3aa75016ad7092745d673edff6eabf7b55e40ed3aeb96b5b38e5867a85d27ddb476d619eb5eed9baa39683ae3efbd7770e8bd87e0f7df603bf7142d010fdcb404dea0bb270033be07c27f0642907f0409152858f8303d015f70f87b83430f1f1c62d8fbfbf6f7f9f6f799008e811de6af827abb1b3edf06b1f76d4cf0c37d418309c1215ccfffc254ed2d042904879fae4270e8e12621b8f70efaefeb490040cfdebe6087f8cf7ffbe0706fe0f05777800215ec779882daff37b8a3f510fe26803becaf82da038771fdc67ffbdeef1b6ea8bc31843f1c07877baa867f0660848c5d2dff57fef1f7a021d8c1fffd65ae77244a3774dd6a19eaacc5d0fdaae5a1070db2fcfd1fbe11feb6c0ec8313287cf8cbff3556f8bdefc63b8c1ff07becef83430afc97d6607fff37803190fffb37d4cb00ff5f9f0fb8a7867baa963f84d9ff37d8e1fd105ed9e30383430cbfff83c38ff12f042d042b04df0fef0ac10d7ffa3fd0f09fa639ecdfc1b7fddfc161093ad84eff3dfcfff98fe1ffce072b047bbd3608c09702f085798ffe6f18aaf6dfd31c20fcf9c3c0fd21104f00667c09c0073f0250e36f00373e8421861f70f83180430f2004a0bb019cc1bbf2cfe363a88717d41d03ff3b38fe4b738833be1b67c041fcd17fff1c707088e1c7717f83c35fdde3cef13b8013eaf70f5f8ef7ddbd7fc8e194a9b2f57df71bf4a0a1a679ffa5831d785ffebeeffbbe0e5f50e6f8be2070c8b1f139883b060cff7b78fc7e5dfede8386daf7871e34d4bbffdb080260c7a701dcb24c73f0fd0e3b0de6daf7ba1fefef199080f59b7c83430f1a6af9ff763e8ce076be16f84fd37f3b5f06b8353df51a5f1838437f8faf713b29bc16e8dc63fce1ca1f2eb254da9048ae575072b507c11b0e110bc44de645e879607989f4defb1f2817fe447f7e9672112ed3cacc622f78204ad60615b39592c840734139568950c8ac556dc03bee4b35a63af3fc97cc3647e6280742a2faf4a60406b7553c01eb702971e62d252d68ad98d86a88a28c239848c84884ad3d477461cfd072768ae5fc21d94b38e7b3f4830472356927282121a64cb055670b0f59ce985b0964073322591f30aa9a21b52989921473e5c625a4ed028c03e4e3da244fc5f9fe35216003394d51ecd30e888f61a8640d9ac50c1182e089222993180000030014c491304d24b9840f1400042cb4b89cac4424128d46038138100483016030000c0000000000001406828100623c2364560340d5f52e94e94f9137261ed65cb83b49a8fca5785f054b83872958f0532f7833bcd9c98b02dcdef87c6b06ee61e219658b59d0a7ac3acc2ff84a8c5ce1adc54241d35dc2b6cabe556588d9f07d35597f3e84b1914eafc023285d9f1277665c3bc1c5985379ceb6588806b05f5be87c68ffebf415079dc0d5477484971a680b32059479217a76deb2800e6935bc2dd24cab56597a32cf3f327918015193ab25f38a1df77076adb3a57f59550496372917b2604b8f3fd03e2c7edccedc880d12ce6271adb003094abf92f21173367581c09b62a4c7a055a3cba7bdb102ea9485367fa12472e19de9bc8c1efae578450d6cdbb0baedceb1bbca6cb36b66d1bcaf60e8a2c45da38d5ddc055e620b4f9845d7a5f24056c1a2bb0dc11750fb10ba850151f7928df7e3c4cbf5379fac51b212f3b7d3c09d3663111f9ce83a807bdc1593f69cd2cd52cd3d78eeeff6824313d7f1faf4e2c12fb8ec4af41628d9cdb9af6bf01b39b1ccd32bc7486a8175886e70b3d026a3b1cc319296394bdc22d13c9d8e1fd7701430a42dc49fa2b17077f7cd564e9d70ea6c88ce65f64022a605843bdeda19b9458335e8de7fad538f3bb351ee4b2fce945db92da17bab6292e4b67e5d01d215d3d4307f890b1112702a1a017df96423cc3c44aea13ba1f65a025d6348c324eae701c72f30528407eb949a517ba2d6ffa85b926e7ec4b316525ca9e6c09596b7e05dc4b2c8c3513e5616892fceb2e26e066f4b7e8646a0116ec5e4b0f1d22d12ed87ad831a28a6026d2231d64e0214bf94a7ba60cad87ca0e025eb683ac21a98f228ec624bf381c2e8eaf5b4aa43b821781777b6c858008d452a856367299c6c70227b71a5dbd257987a52d6d198ca15939a9ddc97842f8ff2c284b6aed9344c26c9dfb7b3632baf250863ec686b865d49de383d25028693d9bfab69af8920b1364b6b6d6f597474471bb8db0d0d233377379602cc93a5416cbc67d26c0fbf37d9067771586e973deb3a33cedc21145c973cd8b10ef54c163903cadd675fab45150427d237dbeb47f13680251342d8078d34d4d7aed33b6de32f07123cc0f7d43c48360f71f37e38ef287d13116b7169b743b4f3cfbe104d63ee1b53a6a5b715c8cf2959b561174597b6d33994199636f62c61636b1b5d23affe326c0d66f8b00e98b67b9d537184d88e1968f1a4264834d1b30d6f92ecf3769f9902da3479c2cb7ce03adc6ece11d532e43f1ce205831ab0b660d4405f61d8ed5005740a090a4be756db8d8e7d9cb42d2719ccb6f8a3122e92615c0f9930d54dd81b5bb1c4114ccb4dd18d82676812de5080f499ade6d3b8d03ab4390939d2f9629459e632dbd955366ae69e491dc5ac2552503713296630b904287bedff64cb81d1b275c258509bd0f27b46a8e2359f1e12c93d9bc5edefb46b6649da9b7a861ce710398e50e438c5c8f1e7c8113c45f22cbc506a6c99d640f66962ba9ce51a75b52997ee464eac7cd5eb547e4a9cbe4a96f6ddb61cd476c4c93c926b98b988f605df7472857f82ec1e52421432d9b5424836bca7b6f16f223ebf8044509be4da5b7936fe9ac7198955226eb9fd207ca0d7862e5be98f729269da67c639b00703f600a2e76e784c8f6383ab8b8f95db22dbe081e24dd9bc5a75e5c0f0ceb13ecbb0ef75dba130e003f8791889de81b989d14b4856b6caf201fcaccd83512df4117c07daa65355a7542b0f10e7dc571ded2c07e32186dda8a363b610dca2c2c515262f0eb85de6f961d3e00bb9d170f6a7f47e73ce1ab68445dda59cf6ec7937c5e81937da019e6b91b0be5b0daa3dfbbaa32646da39f1608767dc85d500db95723652fe0697555180fbc052ebf2d4e029ec4badc1b77613afd8de7830232a19f536eab507fbff2dd4aa0900c445cd716bdddf46eb684947afadec8ab11e469902ea4d0f0fbdbaa809e6efd3206210c3a8a40dc05ebce81b1175842ab4c968851ace848b15a9c952d00ab5790558041c6ed7043a624c5c3da4101a6d3cc796863f8789397e518e49facd334ba50a27fab1f49097b89341d025ee455afdd06e073ba7b57ecd2f12500a28156ddea4dec30d439ec6a28bc265674c223ac81e5a6c40f85608ac964995611747ed70cd5e9011924e04b8d4374e60b27cd6eccda7ab738e17b4fd99c24717f1dc3d7e74e38c3a1771020763725fcda9b1c0b1ec95083c9215922f188a6bc6ca54a1f9944abf5280d811adbc8a0e0dda262b86cfc2ce503307a39e7ab1aa2827e91b9a59c6e1a25ea042481d70d8bcc984a46a0c812e58e01f56b349802c0201b66d93043b1eba8157025866e6a3fc512e02efcbf5b972665821860f3780988c419900332fab7ce3639a8180590150cf3db85d7172769709f881c8e373b200eab7e583b3a893fded658bad4040f04e403438ca3e4a53d3db6a864862aca2d69da1361185f2a32be9d655a0990e1888289fa8f60b7afd8cedfee2ac4f68e598287ee82e2e09a30c1c390ed00a5fb50cdb5452b4ac554d10f1b1baae6ade32196edec0fc45f8cd8f379b9822aded3e06789b8b244246d33649071957b2c1a0e4401a6075fcb1089e09ed952ac3623118d9d37877857dc71f2783fabe1c03927abe2859884dba1711600db13d1431fe42cf34548ea5e5999eb9e612453d1fd6a1ed66256e00275de3d0eaa2780e99ef897b4a8dd5b6409116ef652369bb6ba27d80dc1af70c64239b1c45aa311c0bef0525eaefeeccb68c23c947b3d4060113580aa4722945b15f4defffb218c0629182c4942b01b38d63089af83174d6c2b88ec9cfbfb2ba4345d002a9d13682dc4150df2d43f5d3bb65f8d81ff07ef4817354ee12a61b8de6dc01be0c96209b03790f51ced10df0c6f175751dea8b156c49d60d86140c5fe414423cd18d94c31a52542718fcd867e972baf52457767a7525f576fcb9f22833893551fea4342d0cb141d9af4e1443929cd2a42be9b01fdef64f5ec452ab38585fd749200d9569b016a60902bce7285f07210efe5658012b9cb7dd0c556d2ce22c8e95bba95dfa5d1cbb32359e94857b361703f32d7d6a956aa8cc752e3ec767c09e96240d2a158d29600a0db90885eef383bda0c78e2d59d4b6d6e87351aebdb76325470ff94d942c070f464262e8f708f4416665f3f3e38f399f8064cf73433406d251f3db1086863367d94c4bec326166a3269386341610d2a028f407f549df02b18fd8a5fb23625924b62fca9a6a5f76e626513e6f7d9751365706a7b5f00df23c8194bdfbec5239d159a50d4237335e6a8bee3268792977ce3c5b38269d126ee01960a75f233e34dd40fe0ebb94537726e9fc1637a3348805008c03a8f0bec4823007ea442455832d398fd68a87865f529d622280945e0e312db014c17f974d1cc5621c1e11728f3475d437f2183f46029b66eaaa2d1740359e181b9d2e9d94f26127d64bf6279605335a6ff4ded4af96ea1b5da1a62d3bda343a41b1dad80dfdcec8a67627b2f8cfac12f91f278d83de3e2b7eb3405be4b77a9cc59e32e2a3dcfd26f55c11a8805c6f9324ef5ce2253dfb8e07dd24eaf2b3bbfdd2c62c32c79c9e8961dcb952a1b1ee2f69dda8ef3d8f6807a08c776b250ae9063d7975e4d0ee5db01d86393a5c1a3e7ef20f2394d158bd2ccec67b714a782bf7a5f35eee29bf0ecd5830fd10ef528c038da849534043241972931dd3943edc7c3c15109277f7cb2153c11123bedf05aaf9263e0e2ab7962125e585e3fe02e022210f6bf19aa52cee19e34236edf9381e65ec9f838017f8cbf98f3806aa806417dbd753a67452b75eb83a53dfd3fd0d697a7c075611a9ee5d3cccbf9c0c4f30ea8a2be5e4cf7784e0166893b32fac12a6b351a7464e7afda198809155b71c1dbd50d97814ed63e0643d6b8f8a67a320549257af10a94d9b0bf7dd4e4c98545c94ab6daac1795f9162192444c5e8dc1e5db0bdc939d8dcd64118c44a3940f18a76418c6692e87d17cb28dcef47d33f82b86e201b0c1a617d4bf5134296695184431e97064f1f1fdf3f3dd14bcdf27e02aa4dfe0639c306bf0009cb5a75f5eb7041a19f47cf40452c657330fea246d4d6ff91e16c2e615651160cdf96655629b1eb77ee5c055a3a787b5e4db7e34d1d1ddfab92cd74ff74d5731201e884845e3c88aa5e80647884f6a4fa2d66a175d7267df207139937a4468c5535829bf8c4492e81f48bb448e7eafd215e0b44beff1abb43945b7b001a22f228519d25ae79b48a0813154433ca1e0f05409c88d0f1fcf40f863a774855320e7f9c6943d3a5d6501f7dd74abe345706adac655a02b610333b822d6b1eb1dcad670fb2d680809f11ecc1e23acf663b49168280faf4d929b2c7c757da3c1ae98c8205585d60bddd48cfd0c50dd4c088cf65c9fbf9a2f89985132caf2105cb633cdfd889186b46194f34599bf780fceaed3c5c57e9c47657d8cc0e1bdb51c29aa8cc7dba8e1cb98c81054032ef7661f1be28e19891bf4db51e7bed951e48289a9184513a16c20b7d560e0fb2552c308e84cbbbe9add9e6c0684204b88936cfe74dd22bf817bd0886728ae6c322aa6fc550cad3c0f80097985451324d2c202a29af043e166e49c3c1181329771a5abdb5f9e8f24540747915d3062b04353e20aae3c7a380b0f6b23aebeadba2f33ef2208b2ab9905837049a491d77aa84397063b48a8bae90ab2cd3bfb6436206a0328a4c749957e790af914106d59094188018ab5c18857830ddc4d131e44926927253a2115da40c84c0c139a90b0b9def0d4e74de065022c340b2435e65d060eaa4e40dc93cd58ac49e8057edfdf520ba99146396c780e5533b7c76e2ba7da9ad713d411a036e717a313aed1a672d6e3d7d4c6c389dc726aaa3d206b4c6354fa8e2b3537550cdb0b0481e2abd9b529053b9dfb4a61ea301fdc713b058fa559d6c7f4a7e17b308429224a26606b9b838d0bd85390570229b293464d7304010854ab46c2e21aa5ae731c47a0a2c1dd292a4fad858605b2523a2c1a7fdd0198cc01d3ff993923eb022dcf4c4e80d46822631135c5f48f49662d0cf6a6e7f9182a772cf346eafcd2d4c62e7c69d44466e100522ac8a935fe0e826e9e8dca9357e3aa0c7f341270fa857096d997fab5dc0adc792515bbb305ef164ba53ff60c6ac6e005e7c6a6793794e38557d349f5a251240b5f70d9713fdbf01b3107ad60f474641c88865033077ea1ba625c361550a11deebaf90d0eb00d9e76d5267404204c584d7e4b2ea0f185200f1a60a871b88e57588f5aa96763160c2cb8b624c47d9323bacc630aa174af4a68e0cb0e5b31d0f5892eb3bf1aac2375415202065aeaf2c2a9ab9a648e2e1237bdcf2e26697b516f6714de19458021412cc22b91f7a350ec318db77f7f7c342bfcd320bd51c3a26f126eb06c9665599b5825f9b11b765b5f8e3d5e8b2aa6167d53de451b8a90f658a110bd9b89116fff18dc720078167529abfdccf0818b6f2b45c2c386c297d20146617f454f90ca93d847ae06fad1f99084fe32ea5d3c2222798740bdf6495c376a0d2a884e52346dd38a2ce4829d8c949ba35adc2172418557238405c6907f3b07860f9495801a3f43b8615f1c3a2fa4eac4184ee4f4093a15e4b44a300f6b4c2c308720d9bb7a8370ffd04ba3f95b1741e966c5ebf893d7dec4960c94268aff88ac9adfe7ebedf31e528cb24a95248e65815b3346e7a26b62fdf85aec665f2359a25b91c65e289699564ef24ae0b29e95c9e81e4208d12298832152b12d062ea403fae57f745d4a948834c8496bf0619cb7346eb92a53b6e655e908503e5de614c476adb6acd1297af67ea515280e532ef24327bc2a8a43c246e9080497c38f731470081459017dab6cf218ec1fc2718e877849fbdb9799406fe3c4eaca091e40b81cdedcc3330fcbf3d9beb4eef9e7df97c8da1a65809f58dcc51df1051d5a024388934003cf72c62214e5c30a04aa0ca5e7a8c3800a4b2f342e17a2809d18e8cb9e7aa7fbf3180e739ba1285fea5f3a7164c853bc05354a9e14da28052f2976b27249cf4b052f22db63471f2feec2df40812f887ac765742bdf80ed9159a3bd6676c28532adb91c445730c44e2d5fb63b3b12d07644c5b2ae039d09e6dfe79cd604418d29e0a6c915590743d3faef0a3e58250e0eb3ceee8f32e94f7f035e0abcf435d0dba41c3d077053a5082b3ed78ff8644ecd61326b24132683909e78623b8914c6564f211095747b3f7019ed44e2f596ace8413bee42ecea4c796b5739b98910b12d691044b1241e273db64cdfb7c381901dba1169f01f1eb24c3aa527c1d0bc6e008f4b9c6455108a05b174c6c685a17d351e3e866c854c5a75557f74119aa06b4d202c5ab28f6cbf67546d4620de4cc892b184701998a5350327148dd2a938b0f3e19bc18af4749950a84f8ac6bdd2a6c5ce2304e6f7324f1b51068c2c24a73b71d08143337e13488861ca635c4abeb7eaf138c079d8217bcb28a16b363a42099767e6ae323f376225593d896a8e34fc654b28cb563a506394f4cfc3fc711ee3044e9bf851c42e1dbb9d8377eae76d36273a202b3fb0896637cc74663b0c734f1fe191ca2e35094b309a7c48bd9de9cc6aa462dcb0bf284c22f26323bc0d73c5b05589f25e40403e2141859692ec231c65d318e185bf4a3b49f1c49ac4a3c2362ded0b876036eb7f380e2fe33473ca8469a07b269ba5834ec317ae2a6a1363908679a99e1df084b560347eb806c39f3ad04883f46eef8eea0167781105bc90876a4bb4ff073820ee9383d5919e363092aa42be0c08a968ec86e659b923a2f0a98fe09501e2e618e3e64ba32b644d71894232c6679825815cbff1f4c16c1c59c7ece3a591cb215c908136ea3323171fcfdb3404b71947b0ab02ad09ea13d4c783a599b82c3161b6c8e416d1b88c393af892920cb26ed81b58ac7f7c079d210f0b582d08e54ca1e756cd078ac0c404dd33d83d814b8d32bf33f827f7d33fec5b97811d7efec37085f44ca3711ca1e3ff3be7e839228d41cd0e4e15d2c5a097784a5438fc1460bfe9740a66dd1da4db72a8f6efb031a728c9ecc1d4796c88440f37f8fee3558187ccbea35c0e877788620147132424d757f5fb685cddef3ca449025135b89171816724aee2a377b31793a2bee229644a634822c99988bb416491ef9c54b34394d9ed4babcfb3f4e640dcd2659a355162a114005a9c9f18137d9353aaad173d8e5f7f7f7a5b882e9926f6dfd595f17869dfee82562e3f02f9217d19756ba64e9b9ed8eaa597cf23cc2885aed04751843d55fbc592c0b87ed18444be49983d2985d7ca4fc598d9e99579f9cdd2fca289f9d075588557a1005f097286eab6c4ed3855ec2d068034d982b22bf3f3dc601ea693c3a1eb1cdd6339af76bc9e83164d5eeb39d828508742579ec83b40b82a9fb16b28f29c0e25313cd3f2250e209495c721d0774de2a62931d01c8834151dae789a809603651d6c5377245e25285a4387e76289fa3972a2763692d787463c45c6f5120ac845366d4bae48031f1bab79517cfb1ba78acff94b19c44acb2e396385d5b57852067f1f18dded3685c1b2984c41b5e3cc02ddbeba7a1f30055cf286f1d778552bc2e96f4aa8e0f962edcda7c1c2c1313a1259e741a67141b0df394640c7090dd9ce618e4b762ea18b9b676260559640e48c1b805b7378b0b17c8e363f9a04f892e2e9d728e84648ac328553a926bd919b3dee41b5dee1bf34993532716a2ce723c7522599f65ca47ea95907c88affef98cb82ae40db7c3eb281f12531a05141ee3cf2cdbfa5f0df5ea9bf2d2a5cb8656c43dae11ec3f96640c6426b678e714f242fb23f76362370f9aa587a86ba73e2bdaed60fdb826e760810fb69ed813d6c2d9c1dc27e2feacaa44282a4ed0dc6ac86da2c06345013b8a1ddf10ee4b901049bdbe7514faa8fb8ac68c7ba6c21113be7d29b55c09b0309ba6ccb3a1e2244fac0a32dcb426a566f0d454d2b1f926350ae646f801c0a4a6d2a0ec5f7993bfae8995d63d0203cf640c2b9073d509158c70ae876e50046be5076e0341d918f9b892d0a822cee7d9540c64ec83619f0858288a16f797ce4851ded4b385d33ff0e6c407de92778aca3335bf3e5f2056d1df2081b15f03125f79823083fb91e39d33eab17401267bf2805d4ae13710cb02d9c87a109c60fc8e250fc2c957b29110eb634d84a60558925573e31d0908d8d72218a90d002a09298b4aec845306f69e5af6eb3c9f313a73c9b39e5e6ea6f5be0aea82ec5835e15786013186244682b8c215800cb674a2fdad26eba1800f71c9de2f86e0b946975f029c45578080a5b0a216388ee3a2022285a14131239c1059607a3a5187745dd5bceeb3d74813c318c9ca812613d9ad735268682bbc6e62c83e690ae336273b6b348108cd979715a361c15c77a3c56c4a5128c82cf3825c607b6b53a36f99b3001fd223656a0ca8906545e9e4b9833084ed9d3e1e3503e365db2abbfcc7c9273464a1df0fb08ac53e0896b62dd94805cbd291e24cec199102202cc62e0ff5534c02ac3ec853cc0d68b524d65d19cf4583925a9e0a8d4a59308902979ba1ff1f07cc43583ac256c1d07db9819f7cc382e83f80c05778496ff76d0cdea147f1b3488cb3bb205d91f500caabffe00329250a1cb834577726c0471a7ab754b1863357ef7ec8094aabe5317cefe258724d1d759d39ca984ae05c6b6222f97dc0072f0ff7bd1f93d41da39f6192416bed5187fb94f4ede50e351b38d5a8a8cbfad92eea57e8861269b2c8885f49ff62b1a3620c2de2d698407d146135f3b3f2018be9ec80fba813a2e67d780a9f81a05662563b25d629745c349c2fde38002b8427971999cc8c2ef54c968ac009fd95be550252e2ed2aa13e7216e12725a548003893392c53ac209364e54cad3316813c3d433e31a587781d4f28e3dcb4b3f213fd7dfb89a571c0e6b5450a3f8b5c4d112b3f0919313c12e31744f9a63e350d34726d590409bee5e4d170e469d272123d47d7c431fc87bdf6451d407c3a3f6ad392992496a28468870c39bdc641c9332bb2cf6b67d4aa4b823a6642dcbda466a8fd70cf25e7d044c202199c89cff308eeecf230b8f181b7167ff85882cf5e35e17f93768958320c701726d27af2f44e0a84aa672628fb8b4ad030cb4b45fccdb4aa821a0ee3dbebc631db5b84dd14951e83ba9d03929cd6f4326a3247f4418e1712a851ccb340d6a10f5efbd344b6d537389643d460bb1a1f24403b81a16c574697b92e94310c44c8c3ddfae3a722db2447ee4e74f0bb6933caeb1f651c65d8af426e629e8775a47b01c8dc8460fd38aae358c6558cf3034adb7465b27095451eee618b03d48809f895e23d99c35ba135fe4e4624954fd5498db8774690346c822bf3c67a88d47ff6923188b06ce35d81012a507677df2ecd01d2149b5e0273b06b5a2ba6dc7fbf9f241c3d1cefe8f2a40afad444309694151323836eb89b34437cd27311dadcb28afb0c478e5ce25b679c2c0288ec23094aabc8eba5793ab7b71e139a8e2d58d1447d92305c33412158d980d1adc11c3d392592268ca96fb0bde876c4e70ac8387d8a87edf81a20fb70322e3cad6d226c6aef9495f2763c171a0436ac52eef3636c9c22818eb868a2babc963fba01b4684a925354353da3509d3b867e4bf65f46088481af8d3815187752af895b13438f55c25c0abda18ff28be7757845b392434010a020cdacc890ba5b8ce034c4654a06252424cea9a5781c16ac1ab1d058c82451b3a17bfa0c055d97c37bc10d7d05721ccfe2419464b76c50b539b216163df2e40c68166b93d19d3b5da8d0c3f8d688e68a2c58f18507f12d273ed7f2cc5f025c1a5d5a371077d13668d25a4eab7330da72d37b14ec32f8fe54add4f043882cc4d9528c17783466c714653113b0f92d08dc51e232acb86bd91284747e3676848b5f70df05589f0370799addd87649dd5949e381a007b43650dd972aaa407f0211f3fa30d79090e716f601da643b01012c89a5cc5489836c193fad52cd8605023d19fc824c4168a7a7fdaccf4994de0570e1c4460a0b9adf5b0a0c1d0b489358537c7f41c828ce70f06991d21d78052e8690dc0451dee6dd89c02d47aa1db2474481ccf58c578d0deb9487078022c08f6905dd055883fd436fc23fbf49759990a843f506af33c9835241edc7f71ce0ab936e4897400db5a18f31b5cf2e60e327273cf960960ee2b18a94b1598cfd32c0234d66769a277cda989fd02fc7e12c592bf245ea4dc872ce22ce2617fb1f7b3f999ff59a6176d80057140ba7021a20057b2bd9522c8d3922aa090340b11f07e82e54bbec865a8d7db50b973eab8d15513b04553976f4287dee8731bd6e41434f8cfcc3f678ec48166aa9d55c790cfccba92d3e7f85942c27548c88a38acac1229077820013cbb9463fec3b9d9caa85179d84581e4f40985440157e7b89a7a2dc9d09198e149950491c1f988f47fac410b8fd804ad2fd46f601e1579aa505dd24e346707b7bab680efb8504d1505620ac7936ff4fb60026a5668c7ece157f9eb5062e0014e3b26dacab0e6c5a5972714702c8eab47b209fba575f3e4172c60db4fea3ccc67309efd14c0678db7ff2171d125866cb10ed2d558af9062ceab082f0d4d70e12bae06891e886bd04dbdb43c4ec777d7962142c1cb7e6e2803af4236e4d422316125147478ea68acb0734ff258b3b497237fe97da0ee664e73c8215d8ccc6cbf184cccd4e84f39c089bbadd8f6e81bb9163c77a27d220ee1a0ae3a1e307447c204a8c943ed5e3451fc5c4eb8d6d718cff8ce8f0540cde7ca57a6483dbd97704ebde2fc0fe278d24ceaa5ca28b46acb53d92680aa392d2c679366681f1b8f6a0befc969e31588ded6aaf365a4de830a3c6e87b38c2b4436ca844bf7a973c40ffe0fcb7261d7bdec892a76cd85e8c1e46a85672955684254a3bd56469f483647c7532aa7ee8d6c87a9764dd11c5376ba8f258a1ae522f3120868c4a9dbdbe5a79e212ce40dd83978451c8e84954fd3893f082c9828a1d6dcba9333d7443934fb59f41ce972c8bdf96eaac7c594e4636e62211216fc101ef526c7147cf51b903dfe424ff011c6c3060963758e78fe327dbb1a26d2dafdf11cf34355fa269deca2f64847407740fc578cf17092969f6c1b89c55727c7b4c24a67c5da403c89cf503eaf1928f55309a19a50dc96a92167b15af93cb12c06d0886547c9701f2568862d0088b00c864fcb5006b48c25db22a044683071082ef28f0f6c1ad1829793668796dfe0a8a414a752ff0b46cb58ffe6fbb1149a195dddd3b930ca908ad080a0935d58515d7505cd335de535fd339180e65633a576345468c74732351288602116323b59726fae6302da3b7dff015a4c168209a4a0b356ff0ad0be359e929953a39313616d94cadb51cea689232a4a94b0d5fddbab5d65a6b2db6a893031b4bacdc83640fc54ac65f2d24bd8532fc183dc6185f55c518e31573fb0be6f68ee1c02187bf188efff6cd70dc6fdfbadd2b4833cd78f8f1c50340ca16922d94a3d51100ffa20520b6da5a0c0000dcc88c3b43e69b4a07c1784bc6ad8f6fcbdf3bfabff673b8308fc315fd0df7e5635cd29baecbb70be9c38001c4b331dd38a6635a4c537126240550e5b7ac1c4b1b0178ccc718eb3294b012e63246e3e5f693188dfed16d46a3df5e6734fa45d7311a8d61fc93f4f87ee08b49692a9d233a95ae01a9d4da423f43bea62280cb663cec259e2aa23a39171143e447a1051fb57a884529be9a88a36f516a3591da43ecc70863b3cfac187762f79cea2846cbb2e2089facaf2da34a6a21598da3f5d5f2ea16c4a6966f36d6e5ab9d2692e9db6abf56ebd2eef297cbd43b6f175cd9db43bee5ceb0aeccf7103bb23de4454a7153eb72f9591b45b2561fa2b744d8346db3f916e13ff9ee2d977b480fe921447ec667f7dca85b78bca79499248a8ff51d65921cf1051d8aa0f4994dcc24d13d8af550f4f5c6ff40b361d18acca6751049270752ac35e933914c25b052b309582918ea61607753d543d8d46bf7e99349bea64377e933914c25d5fb6ca273b49f1fc467923c9f311b21d8cc7b08309b0fb41f180ed247ecd27eccd81f3bc28754f41f77c266de3f085ffaf88df8fe1389b77605f16b26c9f145b7eae1a28e2d4d094c9c31fe55d5a33627efdb8f4f251e31851f331f06d3296536e1515eae57e151e64f24197eac7a889efa79fb773452f5a2abe6168f22923e1f6836fe2304b371527ecfadf79f66d37edc09b3694ea4d86a6d779d4dfc60411356d5c4a79f55d57254c925ec8ba4947c79949fe684d9740b188ca0ea519acd07daccfbd944257af8b4fe2597c8f4adfb03a351bd1461ab5bc06c18abfe4100060bcaf1e1fb0fcc26e25b783641e31259facc2666128fe25578148f329be81af0c595e6573c0a86a55e1ec56b006e1d45a6f0d5de1a8c33250e8547e137bcc271ecae12857956394551ef4ca893e889c88dbd68ad7ffa45bf68d68b9ae84df8ead670f74ba3f0c97ad1378a7287ee4f4ecd558a6a254c7e9a7ae150748ef8b0ba4791e157ea5194975e7afc51732f79f94bb67ec7ed2ec98d4d30be6a69fdadc499b847e11e45a61e26c234ea77bc18d3c78082ba3294b05710575b8caaead1fed4febd7515a356bf02731d8ab62e0f0d3b14ce2437988f2f6efd76217d98987b5598cb5a49e550f415c4590e054541eb6b155551ad75893b14bd6406616d039c5511fb3a074386125d45e60e8543e116be82b825197e2b71283c8a1d0b70284a5d9ae288a88fb42b1ed4866a6d57ae0849696da9d4ac58f166a55d39d286bc616956fa2f21d8b468430d4bbbd2acb42b3faad095daacb4a176a55d71a123cd4ab3d286a214b2523d6b8eeb8ffaa30a352bcd8a50b3d2acfca842cd4abbd2acd06e4d9a9120aaba9a9127a2b8e3bbc63cc888dfa8705aa4ed37e6d98bcb0dae93e3418d279e2c261b8c6ff124e9eff056a473c46f2fa8a4252fe1ab5d7684e35fad95223ec986636bb03d6d3eb49f88dc28a5efad5ffcd58cf8c3a77f59cd48862f638c1535e1537b8bd9c4185b4b5c6a4560e0209ee5c7864d30769862dcf094e2ab87fee64350e3e91ced29f62643890b8787917ec3a7f6d65b950fb125c69360be158914074cf1d595fe6b1fe9df8063608aaf20cf846913eb361877013cb4bfd84f6b3cb9dbbfb8d597aee8fbc2dae0dbbcb472be6d894ff3e9b722ace957f12bab8a545694e256445a6ca21e7eff379b1d6de67d2bd237885f2ef432d21dec87fd7c2b42dfc2ad48d7086a453a47855335233b5ce63dd58ac0e81830b4e880a2e3c84b7d1d3d22582a35d6914455f5688149e838e2372a1c4851154ed3f9a42b7a78e753ea217c3d1442874f9bedaa877c3d14f744779d1c7f4a5f478f3fd58104564f4476170fd2d1e303a94b4582fea2e34886ef8e61e50edddddb57efd4d4c981dfb3752039b9d3fe78e9f0c9d7a42efab3b58e2379bea3288aa21a3ec1f7cb8732455114f5d4a52d657440e3979f4f5924d6b306f3ac7d0c840fe1bb8e9ece019f42194a581d978e2399fa165bf56879884ff0ab17b5dcaba918e34718f82abd88a5087fb6503ebfbed598faca1bc36f99cca9187c95bae1cfb7f02563ad70aa0e28f0da272e13ffe55a282e13bf5d1bc565e2eb6061f40975543d5a9efebcfe3b1ae98adee556df725b1c7b108c18ed4e9b89df54948b8a92e38b3edef776a7d958246de67dc95ac73bf9bd8e2446d78a4256d491c491dce82544f14976cb91d49144ac2e0a4b7e6f91349bc7a4cdbc2f95ac4592a97724f747a15cc1af2fab1e1d5f4fbe5c8ea2cb7ebc234219fe63d26c18d39144f5153f26f9bd07e94842c711fbc442b14fec131d49740df81204d33760b12a0f0d6a4af2b394c58b06bdcb515ebf59a6e8141ae437284739d9f3b46aadb520d53d59a2d6a4544f358b4489aab75e48d6bf543428532db4fdd55477c3a7ea6a3a3914a4e895784ffe44388aa2523a07f58d0ac15839aa3daca88f7f491a94e1c788638c55ac9e766df9ab77a474aa6216f58efb360a9b5ca8a752a8d62e1a24aa7a58f5adca87e83dcda6f990da61fc5faaea30cd87f2a6f0f5a392b00fad7062e56997eb47dcc769ed17ddf87e61cbbd6abe64b5d692dfb6dbb2e8946eb05aef35577ca23e7ed5d2ea1fb5623a65a779aaf7bc7f74ca8fea45f161d49a5d8ed60fc645ef64f8e8140bd3295d037eac99fa8a2f47a7740e9683b2f7f811efc9efe994a604e609c9fda79fe50a42f8fe9e1c52081f7ccc9d27feabde07f1dc3064f0c09e605555ff143e75c78daf16553ea8ecfd56d543f455f5deefdd380de115bd74b15927c7779c48fb917c223d11eef7821f3fba1158597caa4f8a7e44c3447c79263dcce53c18b719f78d49f5491062d3e8df57efdfe2d2837f11dbdc188ea611330725d2f711b7a482bd1a89a4c29ee4bf372bed486f7dff9e5534f68b12572aad1df69feb4dfc89ff789327ce5c84c2b28bb10e45398546f2f3445261bbff31e928a84aa56b447ce948d18591ab4591db372645174472fb4ed24b2a155983b2fb9d3692af46425df7139d8c3f67c44d226936484a0e496eff1c6e3f530d94cd700f895ba2f9f891d6939b115afdabb41981d296e25ffe7364b5c012663314bea410fb2f97d987a327b98cac7fdf125f96b812bd9f7184e58fde557c8d842c7c1abd1ce153fc97e5c378346a45ea68341a8d9a9127b9b43469469aec80b163c497b3ad48e369459a9126a35664d48a34234d5a91d1a888cdcb0b7ef911be4a30dff8b23198842fd96620be94b5e6d2f2f359b3a1fee16b460e223e9bb287d5994deaadcb78d00fc2055f5248509b919fcbefbdbd8c47257a7b2d2645224b86002e239b6c465a111f12143436a2b36a686a6cc40721a4a9b1e1227c2a9d607b78d9fa8d8f36728ccec577b4b27e5ef9d4f5a8ace2213fce5bb11569b3a6fc5955e6649533497b4f5c939621761dcd86cbb4caaefa105f3672a31fe13b74ecdcbb4cf18951575f6e5f539f7e9fdcbf4c7110cf97c3355da3d9a8e91a103e1a1b35acc6c6a3a9b1015f0d8357d64be585b45e2ecbf8927ebd14e230592da9c6b97619d5b40aac638c113b9723e6c90efbc7f8d72312d9cbf833cea7bec2978bb3befc5133a312becb0c9f28bb24bedce93debe1e113fc979953107b8c4d72b5e45c3fbc403a486dbfc3890c794486bcf7de0e119b193ed37a88abfe7275c6909d2144a2784388bc9d2144a218f2de1b32a3d403dbfe9ad14da487fc583160f2c488c913a3d168f46c099396167cfda84f3cc1a487dc65e309b6843dc164f4ec092623b6843dc1a4879e188dd8e889c896c4674be2b3254b7e727cb6248a1c9f2d61e232f16a26f96af9be2c268ef4a8af9e0eef493419c236920f4758861296c23415be5ade7b9745f844d9175d237cd1e47859f1fb89ce61f1897a11854fef5f16e17e827ab89fe8275cf50e3b9188c2573b974ffd73461c265c3e5e96237ceb9746673f4697f7a2a78e09d2bfcb4858fa8cadaeb5d7b95c79fdb95cd2f7a544ef492e92548af1153e64f2049327ac8fc2909f33723129113f104da58580682aae859a0a10eeba7ce5547421759f160e8b86c5afc407a2835ac865e2d5425e552d04f125473f5d30fc16a4d1198a21c594b62c253ef97c865b53692a55256a2a5428528e4fb5cc8f0fc4c8d4f5a349d9e113f5f3197d75be75996869798a2f528ef0564cd8dfe1af8ac0e85dbec5187f47a3b08a2e7c265a7e87d358ab0b9f82c0e85dec6da1d48dd665c252d567a88ff3a9afee45cad4bbdceacaea33f3a9a75d5deee85b6e114e58323e13f6e3c5612ed333fdd5ad2e13e36730b1f333dd424de54750503643054b8054d0f3b8705a342c1c8b90734243724a3bc4a373cb5ff2b2199632c45795a497ff625f5e42f82f97745d2e63332d97b11958f1fce85cb4ff243ed9773fad9b33baa12ab4eb5095a12a435586aa0c5509121aaad25586b2cb3dd9e558aa122414546528a8ca5090505095a1d65325a84ad7703f449b695f354b2dc3c1722b95ac6d3d6dc6321ccd839af6f557df33fe106d24faea59353f8ef0552a89f0c397b5f0108db506a1e4413d8c7396f264f325b6d495a3dcac5d34435586aa0c5519aa3254a57f44de32449d8331d2489d1cfa34b13e8da5ce515b5353937544fdbaa8e47b544ac349b9533a3954b5a4acfed592b5564dd6b7bebab5c2f79555adca32ec954ea153e89426aa7cef9daef8ee8978f1bdf732c236a9a7288aa2a80fe227fa8cb9536f7d0da22406d22a4adf2de9928af0bd7bb3e4575f2bf9be55b2caab94a54bea6b6d4f6fa5d235a829f1d59fd90caf3a3641a493b353832a965787aa5015aa542a95914e8eefd4a08a6564ddcee86bd0a80e8de855859c88c8898cfe6a3ba26be9b3a25129535baa542a954aa552a954648fad522727be78e574510f19e5dc6b2a34ff4d89fd945129f1839cac676ee41c951247f722229f2a1f2cd18b22359d853b971761ef4884ddc85247f1f5a3c617613ac5ba55a5f8a2a68431925ee40248053b402990029402284028604259b5d60a67ad96d515cabf6cd4d4748dfa229d1ceb692a8450045f545da0652357e72c1758df7d756bba46a514c4d7c43535355dc3e16a1b46a135f8b4b539e19c71eae4b0f954caa457628c5468cafa43f43552cdbd65892ccbb22f8a38fea8e651cbbbb48c2c96985d0a06a5f014521db9e4c2ddbd39276cf3596633c6e6cc99338710b6a7f136e7c4978d39e7a43fabfc4a75604d0da9422324a1adb58f5028cb640624240a1420c935990109c1a2359d9c965d84ef78e864e97472588c15cb3dbd6799b9dceefc5d1dca5773f18a11fe55638cf2a3c83a39be7a3e0c11fdca554a9f5a5ad1af94d65ae9e8a9cb3bbeac8b3be9455424727f97db7245f8b2f08fd2c8ab4aa9899d54453e7f7cb23b1aa493c3a81447afd0204a83e2533c979cef3ccda6777cb2ff552b16f9b4bccbb797b98cbd5cb6f8b230bb125f958a7467d6497ba74ea153e8143ac527ee445785f2d5be7bbe4e0e11be5383e494154b6eef09315785729392c1a8bca7cdc497b27d0ba9ded3ee9747d1c8ce97514a7cc92c7ffee8328733134bcceafb5b578612b6c23f1817393a911fa51ca9873d2e9d1385af763f2f2792db97deb7af543a878c0f237cf8a2d2355a5352796c42169f366891a988d9c892852c80cca4c80224e4483e4066526419ca9451077572d83b46e3d86d1942f6c3a00d1b3810bea4587a76b8a6a6a686b673c8846c3c51b4a839e77c133239a75312421bf9fda36ce4f754e2209e4f7d55fc6c521cc45f47d1a4e91cf32977d998b6f241f58baa1ef59be5f9acc68655e1f4ad2a9c0929b53a3944d038fb91f7442d84f3e5d3481df2e5f2d32db50ffd276cb1f8f24c6de4e912525c23270521fc7e46d339fa67f7e5f2ef2f1b99fa7a2d7ca2be06860bf65af580950f35c3af090155e150acc6cdaa47fdf9ef52f0bedfd1ea65352296614dd7b09e460b9be4bfa70249d4afcfdcc3161f9aa26bbfa489621e9489324df726e93a369006a1ab34a08305898a77503956fbcaea32ef4d35a8f52a517dfdae2e6b03b898932920c9415a863e7cc9122574be00e58a158ce189cf02ea7bc5802a036c01d58b904300b1087280a2bdcd4c468eeb4477576aad6ffd86f575875ff09f754db05a39ef5ed54f5355df44eb9ba8faa659ad0724c7820fa465f8f542d104b2a7faee24ff721f5975d51c1574961b27de1341ddf8781140e2a63dab807801a50a1190805285083d37a22985addf26136cfdf661c820f87a4ff5dd5351b6be5aef2a1cebebbba69ecfcac9d6cf7a2ffa17f517fcabbffebb266aa24c70bea9e7039293ab57555fc97cd5872feb53d9c23fe40a3346e3297ac19f52876ab8064ad1a79ea2a4ec9c8441498eb3524a210e45caf45ed55353956b4eaed85fee2feba989611e543639cc83cacd68b43759b8359677b4ea768697b5675dd17f958ff8145fa2778cd1a89e311ad6d32bc2575ff4df43e937aa7bd1bfe8cf9f150ffafe953a496cf211df7dc4eebbea277465680c5acc270c4a745f62c2a5bb3f3342f636c30b9f19e173a5121266a96040469e90fd25900b9ee4cf0cc8481399ca0cc888cfb381f3205f325901535851032b8a40e2481616e47ed62f73a8f284274e8840042b5c6102e76eb02c84942390d203d6ca22debaf1f5dae793b437fd2d32f1e8ecb9b3f51bfd8c75c3d63debb41e019b1142de3c1fa411ac83206a577b77f7618253f31634f7dcba4c638c316781abcefd559d734f4ab7e69a6b2d867f6badb52f3ce7accbb8ab66079d5b036516707f9ddc7c341c1e59c7b508666439d9c39f4f2164f00a56e2eb337bf9fdfdeffac19c07104a9709b285f9f025b391d1a7bc143e7cf8fdd09f36b1cf3bcbe5ef9154f0ec99cbc8fe7edd563c89d1a2836e10e209dfe7e860940e9a7a788847f072aef6e505af5612c9060d00dcf042aaa436544b2a954a31514ad59274d0010d4132222ec8cab8a0020a89e4dece39e7303a27ff491c9fbedaa2735cc80ac7bf914a319a50e8dc7bffde83ef41085f1a1e8c158eff73514812d1932cdaf053f292120738594b4c8c38ca0aec1c0cc7fcf793e1a0feb11a14d21a9108085de7e960842fbe076184d6c1a09d8b31ca02561d744388a57552fe000cb55aff27432a3d20b7e687216638de972ac9416906eb5c6686cbb42d6c7fcbcfbd6732d145bca3554bea7e3f804cb2d2cbe448a3438e51ca2bac94b1f892a1b9682c7ce9306aa1f0f53f341b127629955a308b3fe3f5b2df162d4a68418525852e3801820a5c40865a62821d51a968408213402811810e1d4a275c84f1bde7b670630892792fb2bc480a135cb70b8293b59bb9293fa49a5d1d72b2bac7921396e4642db52e28258f27bba7a521d63dab7a2871ef9408793c2fc6c0bca083dc2e280487fcb0fb11697139213c9e762206153c1e4a0915315a7cf0ec61b1af08ea55f00121428408b9b19e527ae10ded4aefbb7137ed86ba4aafdfdc54f752e643242f2b6307d6e443747a6f33cb2c5f0f9b6c964fbd67b9a50f86835947407b9aaffecbbe77d8d4832bd5f7d11f0daecfd7cf2032a4b59ab354c2d77beaa97cf78fba6eca29e56756c9872d962d0b73c29ddc375835c05f0f0ee3e6bf2489e8066c08a8a23f6a700e3b778452125113c7d3d500d9cd6477fd872f0da1a38b1f866895457951a244d122424c0046a3bd080b120d6fa7233b1e20afa4ecdc2fe9ddcc5d3f48b93d2c9b94d6ceecde7d331b9936d3debdb45ac86a65a48c288bf225f332c4249824a44792d5920e8004942a8e947f90503f54bca84263a9e1b91ad0294597cd978cbda2cbda0f9a2ca519ac94d5ad918a6f73fc7965106fe6909dfc41f32269b2c38e72a7832827a318b5b16e0b19c4e79743962c595e93e2bd5892c1a31c4b645160946936d5bfd7a1d958ff68da4c8339c635d848d1cc52be7d635d03b09952c9da1d7a6477d9ccfb3a939f34800f364b0c64d7c365efa66510985f962c59e408208b22fd49014348a9c8c7162745ab8f2d5bd1c77786c3fa786bfc672f6334de8b6e331aefadeb8cc6fbea3a46e37dbdf43df57ebe77af4a075f8431e27ef075a0ee0495802eb6051b7a81051303dba2a24a6043f30a134260431de478726b4d487e5f02b2ef0a1b8280dfbc4aaa95f49eec2cb4f6ef3b4ab3a1fee12052a6a9c1bed6bea7356bddb78f92af1204da0d857b480da5c6e29c0b22f393d9b98ccc8ee711a1b9c85ecec77befe4b06d4269c87b9145c988ab116957b87ee9803820ae9db3c23a07ddcfeb847b59f9a87a70ffa4744e3a777a6bb0fddcfb517d302b346185265ccdc17bf85f94c12b1f1ea30e6cac6587db0a4a4f5e9021460b917683f8b02fd66488ec647cc094dba1ce78c9fd65d3b92bd639db6c802841ab2ae590c3c439a22c6c3f104d6601fb883e30b0a33d2e723b396c73ff604d442d00fa026b02bba071f23d8ffe487487c377170811f9d5fca0cdb799e6eafbe6a2c4b693d5bb4f34ce072eb716c4bdee7ef0fd022122b7bb409ae432edb5f66c3ee9dd1762b0a5182ed39c78efa57ccf2a76914ce6e53876380e421cc4f94840962c59f273d9b98c0450114b8896c8d78ffa8305493993b88c733993bc8859d780efee7b78af89244b9fd944d7703f397a72f4e4e8c96124074f0e1aecc0b303cf0e3c3b10d961678723809814ec79739e18e1f3d65afb4ebf4e6c07928e7a7f2a2f8f4bddda2eb56e0f96adafcfaa0738f716b6debd5559d8c403cbd6f760d9c2d643ebe15b587e7c9d7ca9dfd1faa94e9ef747294bf67468bb14ea71081b362074d04167c345dc3535d20bd6bf54436aed052baba5594214233d478c54a12a14254afd36b16452bb5249b24409c557290a13264cba50a9542a55a80b500bb4779cbb216890cb441ae49e63d9a7fb7699cfb80bffddaee1ff2ec4575329d97df77553ba86c3ed83912c915bcdcda6e4334d4eb1de1a9dd207e81cdce814e7a0bb74fa4db10f6227a10f28371d14ba46598574823dcd196955abf8954e5c43318a925280827b3a4829508a924ea0544dd7a0f8d157d3359a86aab91eae7199b6a481cf4ef78e8b42d3d8af0af6ea9e7e429c95be173f3eab68ef68cf6709243e4b20614aa2e0dea3422f8a85dfeeb30492244a903cc1761f794b2049a2844ea141eff5f81ce939b2049d22a9148af55c354ad9de764fb369b57de8149f2f5036e36a3ff1480e1fb17499feaac254192827580624032d320392024aee4c65f4586df5d56fe054f2f68e25259dd29a74be9473ca39e794d6b4acf6dcaa306545f61d86838255ec9eb32f90d62daa2caa47dd3fe9abd59db056d5f30e9f735638f369acf19afaa7b51f25f327149b4b0cc7d5d5ad9f438be97ab6f85905021cfb21e86a55d2ef70da289592d297314a495172c6eb60155415df126d8156b5c585663aa282bad496a7a49a430ebfc3278ec57179fad6c521c54b39a156c5b7b56833f03b4a7b08f35fe565023fbdfdd36c3a8acfc028f9d17844663b9c4e27d34957a467158e0ba59c58dbd2f23bbcb2e2c5ef70d1164a94130b330392a28acc3ad31b6abcd593aa1e9e4d55155e5411079a1910d00c783825d5782928b61fc6ed7c43ad807486f114a6dedb43150e09d72858abaa3fe40929a6fe8d8f83ad705cacd81b3303026a81cbdb2b7aaab2b8b110dd0ebac2f028332029d4f0a2e670e3df705d2a9c16dc416470a1326abc141556660664044ab66ee7d912ef084685f3e2761edd161a838d9f434cc5a3f38ba730ca50ba9d65bca880742e5156d8f8f1675411cf27d8fe0a48e7185f01a301ff869787240935d5787dc76560118c067c7a85ed215390cb08b90c7c1312f6e5e508fa2ce1d3150f9ce953ea5a4f71ac70220e37fcfc1b280e1748cbf46fb8d844f1a4d6cf6f31be738b41adb7dec2b846192b9c48e5ed232e03bf7b8044fa5446a5ee7cea186b8de268ba9e615c965986b92070a4cbb20bcb2d4f65aac47058a25abdad2eeaa589a239991abd7c7a4d23516551938f3a7f5296c2a61ea89f3b9cb2f66baddfef52e10029311c254623a632bff1689374c69e53f457f597f517f554545954ecf9a256773ac132a02564215f0e830c793036648a0b99fa7abb65933f7fca3b9f528a2f2132253ffa30b1f318be0029b88c8989c12d05e6598513c4cb85f99818dfc00ef6ea9d3c84dfb85a4a764f92fd7be7c76fdccecc6dfae66a23d9bfa5f80df7445cc6e5bdc221fd88c63429e6c2c0bcc0b80a13f3f2313030306f7a817131d5fdcbc7dcce1bf01bee656ce810e365084006eba8f7ff1996c8b6bcff8e05f80dd2fbf3d0ac73e087cbf81017dbc0cb7bcc77f6ca474c8ec1971030bfa3c15c0bb8cc0b0e026fa0749b741b8acbf8bbdc6eb9dda47f5cc6df5f749bc9edeab61297f1afb7933492db4bb88cffbcfe43349bde9955acbf5b20880d0461385a48f62bd91b8c5356b4ec3e85d49f18f4381e2384a492212b70219301c50089bbbb8e10b22c81892b8e2045880d373d061654e1640867186205153f8846409e86c58822248f114a181191207978ba797672f7a4b206356c610a265850890287228a143103118420451137fddedddded3ca057cfc0766ef712a7321a5e33038281927c49c9d8902f3783368594383022055b7c010b1e08a10d5c2c9942891159fc4891c47f204306518c78c10c5238020ade041028385852640564d84293241cf652c95ae7b05b9769fe1c5029bbccdef5656d6a04ac0c3122240648602209346530c394315861832dd070e303185cf13c34c04900e48bf4d95fc2c005478c21dff083295150220b32f0e0053797cd2d0b4c40d14211292d30a2c58d0480681f04c3d1b93d0f486eb026f0c020b74ac2c2b626cd29f69ad14744c9eeeeb2888c31dcde7b1fb1230579d9c1075d0ef2b2732e8636044ade2133a02141997a754ca4c0897ed84837b03332531738c1ca1732633257e7eeaa07c9428132bf3102984f4c06d52106a93e9bf18bb60ffadd1c5018827f8ccee1df1f44b389c15a8cd62f993979411072c3977d72c5c82d5da33f860d2564068d0e1efc0603dab9929b0565576225468ce204032aa28b7cd9c80d5444155072dfb8e641f88d8b94fdc6d592fb1b080d3cb973ff06fc863391bb07f9aadd5a4be7c8340d587e6ede6537d42b4ecbe881b5f9718c9d7ed62f5b88f31705653996011d514466402fc06287cc805ec024031df1932f9b1dc8054f808e6092fd492ec5c117f864272b35623f5fae56a10751aee8a00822536e6e6001152ddc40c80a1729b871315091c4053b68c31558b070a3431114a0e08a14dcc00b46dcf8fb165cb870ef39dc5544db2a1fee9b74594311a4224845b04a0227f68c31c618936d863d736962d9146c7832c51ab4f899820d4fb2cf7c6a15702137eff3bb26f7ef6f1eded1c1699a8cfb9bf731b79dd2cdfbb8636fde373c82969920c17b7877e4cd7baf24d0defc59a10d6de8a20b972c2e591ce6bdc7d863ec65777625eb428edf6a93410e02bf73ab7cc464882f21726cf44908d3dc79733242d7e6a4e6ec427e4fa5ad70dc3d7bfe1a63ffae699aa429fa9ba0bff71a8e6bd73d6dedb9668df0e230ad8bec5c8333ac4b88ec70dc02763b97ee578bb0b994534a11cbd26f88babfb667cd796bddaeb36b8db5ffd698738cd558971099311a6df6a38209ba0761bb17f5d494b1616bad7db7d6dcdb11e6dcbbe047e810c66ba2a66c17df43f9e8b7dc669c0909cb4832b00e8176339b589619743fb173781264cced65e5f05c826d9901ad008acc5ed24973bb930acbdee402ebdf546e4fe38bb05ad7055c4a295f5febd2e1017c590861dfdabfdd357973f3a78cb039e7ae391f1e76957b56b1fadebdfa757bf79a22e641bd09f69b5c3f06a4db47f3c7fc9d031c63ad23bb0dc167335ad6e9c44677b7e2e1be79766ae091dd5bd5a300dededf991a7336dfaf699a247b53343de64072b2bbff0e6fd9fa0df6f0d9f7d3d8dec7ac7c68cd3dead7f9ac7c684f931dff93d8356c42e78f943d5818329ca2c167f05df05fd679dd4b28a3f496da4cb3a1d55d4112a0a8ef37aca200bba9f009eab39bfa37d52db599f6b3ed506a0368760a4b63edaa07fcf7f5e6b82782baa92ffb45805512a80fa588f5e9ac3dbf0b90e7ef708981749659eff58383b07b87c3181d90e943966f63fc1ae195adc7d22945253d55e1d81fcb32bbf1bfa15565cda6ddb06a5f85134d2ec2e75c5ff94dc5374d93c737c9e85c7ffba86abd4ef8d36bf2d711c26e68ab78b030b029727caf781420c777550f54c41f5dd583264becc3734d3a95059d5258f72d1f7e96f8a3eb12501e2e6a0a010feee1338085600811e490213ed1772f9a4fecfb1f7a503fff0795e9d3ae7cc4ccaa100109280d60558880c41332a5a83ca9af7c90df20453da4e0bd260aa9ce71f22fd33349538414909c1ca9d8f1616c950f49b51c9ffa56f54065fa03c4d4941fff9a00eb1c3b2e41d90cc6b26c3b98fc03a6eda8444db7853de9108d000000004315000030100a064463e17040d0622cfa01148010849c4c704c96c8e328886194320611630c3000440004404668860d0254a190779a38320a0b241e3f7f71e5218d5062fb260c49d7d85a3ee73d37ccda8669e3ffbdb8cd4560db8091882ae9112309089a22bf2e7252f8395a0a9069c2062e011444c21b8bf0f24a7d2b197f8ab61346c00dc47d7ebaa95cc3ce0f146c06dafcdd450eadc0cab22e73c1f07c6fba19d3fad27e07727913543261e2df5b1e0fe5368fe2e3c1536d6840f57be182ab4b4d39aa35c2e2b797f3e752485a20539a9cdf6ad7ae61bbe6669611c2d883a0471842f1663248db9def9523cb7da235ae72fa594b220d3042753decb4e0101fccc7728fc460b03d81da2ab40424ece586c95bc889305a3c78e4efbcde9231b5f0c05b9cd13bea0f7af0766edff1b6045bfa9859cd9806f21831e88ca1ecea34c8f333e1a00942d6af04c49744049c9bfe9ec30f40bdc3040fcfa425fa5d6d702b8cb1436b287931117616925563525cec0cbb498a68dbe820075c4595d6c0d90d0ec4988fbb3eac178410ff2bf306821eab91af1024d99f22439242ca90883313585c102d85ab65f124be0ebef93662399a974d25c4fd27e1bc8ec68c84fc081c37c63b26ae72f7528d3d4b9e9011d075d0319e10faf3eebce241a2d46985bce5128d9c78d1e8dc209caffb73926e702d13f5eae73e52ed5de611e3c2f13ff38625b285a908e37474352e798f2c267f1829a0dd2587b4f8efb94fc6c7ec087f6eeb8adb5c82e2c3d4da90831082891ca516ef8592abffbe86ca35fd43923775a4c4b774bf5fba921f094c7d1bd06732175681575737413d7351c2b5092f45dfe71a2cdb6d90f882f64d68ac0b6313859fde3e0dbe5ddcbcdd79cc6e1e72b75cd6ddb06bc36e1dc5c8c7d3c65f017410782a2b44def5d445281bb537e74c51bae542c545270c77bd1fc227cf2fca655f6d3e9b37314d804719f7f3410350af6b456a3cd3a1c1254fd326a194e94877b741779ea67149c8a510d43c340c5df61412ea45a895ffb008c67d2f71ab60ffba429da1c20dba2213f2b9c7cd302d4b3cd48307aceb3157b29280b69100826fbc69cf070eef4cdd8a0802e0cae022cfff01093ad850ff0308b0305453fced3640cf27734eb8a5d1705d37ff29f9cc63b5b92012ba798d3afc144073db2c26d1b531ac24c76a47661dece8f26d01bd3040e435917b8245a5f87276be9678430a5870842817033d7849509de1e6d8e1fd2dd133fb1eb436679329a7015dd86ff38e1d0ea0f181688c2dcea978a7f1e873aabd54f486737dc5143e3c3ed2e3e5eab133774a908c0cfa49513addf3c008ff3b8a5925c2a71ab8c32b2eb47bcd917ed33ed62725035f96d419e64dca2af869f2b2d30f98c60c9c3bef35411cb4e3cd5a0746623ea724e8bcaeba3788c30b3aaa2cc0c62b83cfcf92ded68cb991398eeed9339ec080813e99be0679ed323f58e5eb2d98f17b6f4f01ab0dd9f405786078d62b68c94ca1dfaa0955053870d8ec137586bb1f8eb14c485a2b017bf7aaf4d8550716bd7b2412dbaa1191c37d403944a95f6a5ee441b9ed60cb809206cdf68b31005ffbbf9e2908bc2f03bc8ab4bcfc5a618493a325725a771bf93eaa22e6a82a934416d60b80f3ea1adb0387db3552d3bea595097ddf1eb3f725b0c43c24593788b9014af65820dad4c40c5c0bcf03453f84b07420e22c9839dc1323b3d4270a78ba2b0adae28dbee3bd45bf2fe1bb100cafd4b9121a89b2320dd3727ca1481cefa090d50dce9e98e098eb489d4338ecf4632de2cb88ed062e022aa7c626128b994e2a8c522e71ac85695d5edd32b37af904cb13ae4e2d4b2f6ff1fe98c838891c50b2f5480069ad80943093fbc2b5052b44b84d1ae0433bcf90778df979ef63e501e77d09f97cb5bf992900c81f5b0eb065e25dcca3bc09030dc862c39d4062ea9bebf390d4dc358701beb612f5ca9c1ba8ef2a5f7e7dddb161153e00e8fea2fa6ba2ebe661e5e55ca3482b7be307834eebd89caa4d58a6a00f49a280b821ade005ebd5b3eb75eb3303205393ac4396aa4fc1f30093abcab27e0568c8cb65def05a7b7d6d818ddecc355b39333aee1e2f5f6155d3d39b7272d6c24f9e45abfe382f1d568c86f4d64b0e9257c689866be2d67dbc62ce0ff9a941df0020abfdf60f9cd06204416d790037981d68fb07d48d364890cebf72bb1298945c7a3c5262ee97d6404376e0bad3a9f43d503c0c3cf2d253f2c4efa30da73adccbad54f0125517f5aa9fa32174285dad52e4013e71405b8b5eeae0bda69e4d853f84e89926d12822afe47f4096c1e0049262755daa57af1bc9c0e8c24737d93012100e057d9397c780078351fa0181651a16484013ace77161c48bd5d3d3abd9fe427b9cac6f5f04e06a608530a2abca1574653f909312eb1a4a514295c24fa899ddbb5e0c5b17c9e315c6470fa0bdab747a06f21743b7ffece24f0b56d8b05ec71fc4f816d2657c486990872d8fddc14e44fe25f497d1fbbbae0c36a4d6f7113b60fac320c87146dc9995fdede0d38408cacc2e08ac04c98c7ce1f61d60e2b17efc522d5e90cf9c517a1181ce158759c6e0360d1cc1115b795bef68945f469357fba3c521cfec1d5012343b984af47f38e3c92df210dbe51d37b6f755cde9013c30f437bfa8dcf0b0d5902a2b29d2c16f9e509e5a2924ce07f09241a56200b3542c74a7076615499807d2cb612d8377e36d30f222f0b7e1a7c279191e7b1bc0b6765ed5e340f8838806aa260f44e65e2b1bde4c00e56e9c537f1b0db9aa53158f60dd20fa29dc890b2f99b19b2bf65b0b522feaed49b1f37b18541fde161959f250b170988c1e5debd18efa6385e319125ac4280c994f87c03a3b088e7eaf02d04c485edb4900c0eb73d8c23485b2e417fcb3a2d0a1975d498466a07ade753b06931fa237b9820d3108508ab0d81830892a725d90e5235c5029026f66b34b38a72e270b6c10010745636e31fa030801b3117d75b7bb21004b77c563404bdcf58d32b817cdb86383c049e7ab41b3c394a8b21c45a017cd8e0d170a991238dfffbe88120ab12cc3ad37d6fb4563f74e224768549d683ada51f4c9ae918f13420548fad531a5d5351d42ca43fb1377ef68e653f3837a93c6d4600d9a801d2c99ecafebd8a9eb9d49bfd6c3a5f3ec002c5ff3094c4770e5a10c31496e77520eac6c2851f91e6efa8615f2e2b9a58f17c252c3ceb8f5e6888f67e622ac11d48f839170c91577e19345497e3cb04e4d0edc397135fee6f75867df4f3fa47511748d7c9d2ffba82264d122fef13a819852fcffd841babd3a99ae39116b6b0ba7d402ff3d5c432d3402b223b79ac99e8151ca30b3c42dc81abff94adff721b10fded9c1edc053f6c3e81a928d9d96ad5615f7457a19449f019ebe34c0288e0d1e3c9e795869bf6da771e10e40f49dede8fec639cc1c522fb01ac2b003d2587a0a2a6abfaa7257dc64f5e62c970ddae89b656a6f67c6245a691cb4efd65a4bce6eed20ac31033840585451eaf29facab18b9af71ab8d43476e51832dfee00f8306800c240bc5222bb5feb90d88e056d8dc0b65a3ec7f3995e9d5a88ef7b87111c3663b227fd72b9a50f4a7467522ca296ff0957a5d0f5388ae3e0fea08fac6110c9902ad6f7ef6a90ad3fdfea074fea0ceee4181610f3a8b3d903c7b8b53ec7440ed7849c1c6e722db6f2d830ef38768d9b4c626560bdaa8a4dd1691c1a9d0160480fd0f6beea4565fd09839d94af922826ed8597cd91b0eaafe3688024ddabea024e7050f240c73003f7e9cf02f014ad86211d7b7d3954538317e2ffc6b9e6d5c43158f80ff0420e304e4a253854d70275479f9945a35115facef03eb7d8ea9e46cdbbdaad178e252f029c73b6566f47d846ba13a72d5d4033a53124b34840df0cbe934aae8dcf0b0961a3cd4e2c356beaa7818cb6b86fc405044d6ce1b7cdd0ec1e3dd0b81111566a37ffa8f0fe09f2b282e0927728bf526ec94cecaa564cca50ccbc5e33d2fa7df79a71eca8dffcad8e1ffa0df27b9233e2a61d77e9f1dd3239acd5376479aa91e790d26d431e9393590e1ac6039b0beffc5b3a405fc23a6351854dbf26b97fe0a1d73ae4211ef5a2f0d83aa94b292424bcc5b9aa564503fbf5ef7c249242d9b45fca1372849337300f0930ede8e68a14df2928393339b01d927522593b162b33bcfa0ff4fc2227892ec7e3eefede64076ac380064c132e177fb886efbf181b6acb31f40f6ed16f1d88f8e2b992828668cae6958f968cd841bcc35c52bdbeaefee751b5374cca4d3f868962c888dc69d931973742b2dbc13f082f903eb340c57563cb080bab3bd83b19628d99557c3fe71a2f7c8a9c1be17373afb9f99a88fd6d26af05141343ee38db9513742f06d42bbe548b6c3be9e6b67353f6d9c88a1f8d5a278869513e7afd7c039523e220505718fd2fe1def05cc254cd84b8c90646c100ef8ec913da3a4f696e59a7f860d228776179e6d06e0a258b89c6c046a1a1dbea838d9b8c037d417012240c8c0e32b4facec1de8e3402bfd1fd59d94459311c51077b6596f4969183661bfdf1e1c5143634f93b9fd4f3a2ec7b8b412552ddfa2c83c348b74d69cfca14d6213f2599ebf499f4303530273426bd8ba63757bb6ed8ec809b761a27a452d68a973aead0067e3390eb6cdb4d80a09f3545a258ebce703387402d285d58a4713fe01004a9e631889196e9d469fec808749d008fb8f37a597b29ed3ae11f55bf98478fdaf55ebdc0c98cee824e378d1796183c8945921c80053a637ad2c56af490ca1e37f02be2297260efdac2a0ded4c8b25ff945c3a3ad206a02bb52765a3b7a478595f04e1db7c8ddac60dfe4002b0521171d74722d34dddd4ceb2da8191232d9918ae49f0cde9b6a16c4f0d5154f1bc883bdd39d0600675b126fc6470bda1727ed3a601e950f3105fd2eb6a589237b31d6ff27d82d658c44d1783da8fd39a584b1378efc8dd1bfb2bd5285cf295537d37244bd3c19fa5f94d945e51a43da0cfa8a11576af7dcfad3ca7fa331705f7b5b6910c1c4328152584fe4035d5e049a71ca0d585f39329dc444f21cda5f63d86c60c7006e4f7a19b12b8b4f18c2070d19f2023e632beb6a46d5da707ef2a033ec6f21ac4f95563238253099e3ac703752445a332c91d9ffc9bb5e3f5f81183735ac6776e6573a4c32487d3db02377ce1f60220e9b720a8a5d0efcf7373dc0ae469d89818a00c191ed860b049455dc63e97cec840f93d48e3bb3b6ba281dda0c079b4c58bbb0e37958275a48981f0f6b728e259260a65a06f08c9d96f8604f1a1cb1e321ea75621a560a12ce527dc0d7657c3b3a41be2446a7f28b31f69fce28e468e9c34db7adfe888abb4e569158bcf63dbe9c97b7785b83f564425815c768d13aa5f90e78ecc3c9518b1b4f90388fd30a59945b11c88c39e124c5dd6129eaa78e4872c106b342c7470408c14536e22974d7e7a2f92a20fb2f8541819d04c72ebd840130d887f4466a2ca557be00a5283eb7dfa7785813aca0cf35db011a669aecaa3738097033528805adbc50dd096a26d67aef6485efb26246efccdedeedc6f6bc2f0405a2baf2a0ccfc1d94ccc59f7e457d55575b18bc453cd5a11b63a190afd916aa9130ac480cd598ed2430babf9149a2bcec4e7ca40870e9adb9577d223e6c80c1a858fd4910a3eefe0f74e4e7163ee41448bfbbba3cd1a5036e21c7ce103319b0cd0a80c13c53585caf684292da2b85e840454b97ac40acf5708255fc6a5d7f107cff151998ca047db21443392cdfd3648b7b1675ee18aeb200d8fb1525e87964b2a17a8852cc43a93d69090751dca6eca640fa667bc4189e307e130808bfa58bac699cbbb4ec8cfe871dc4f2641f1a92d99540aa54471bb1588acbcdc46f8e4f11e3b117ae12df63ab0ebf2a0035b21cc5b6320349b45a912e3caa1d2a57003b3bc02f78b0782cd7f0a99428504cd4c042b1fc71ac4c3a38c91e7603d598e0da6385c55b1114ecfe99599da2d74a51a01161807a80957178cb7259d78908af4896948a61e33a0a15be8ee8a9c5193aab81a0007367ad93b612ae80145a210e2b525a1dd73580786b797f1cca8d31b66b75cea4fb90305c7d6de5f77d661c7742e01230f57b285d6593fcbe3d30e8b7e3d538288b64660ebc7911f71e83aca040c092e11a2d2c62da6c116bc139aa0b42e84ac1b043b1cb01be8e5c5978d0cb89a44e2f028ea33f9be9e1ed7614efda642fbc20477f2e9a9cca72baa013f82700b372e8a17ab30cf0905ed0cbb6f517b6434895802745bbadffeea6dc178cba6f936dc50d226fd75f381706204b3846e894232fdcad28b55cd54a452621f31d54a7d8a69e554b19ba5217b337f6f7b6ed94cf3a64569ea20b9eed8dbc50d22a774530f50c2de40faa8ebd840791ed21e2ab6a7268ea0819f0dcdf8bcd2a329d3f98b687788804c85121d09ebf069ad7e2a2cbc823279355e7a0ab325d61c78d62f30edd99640e0e9deff8edefda405f1a08668458221f1ea0fc35296231a30a966e11ad51ddcb3bf29557a0b86ee635c47518212c4668b28906259705ab7504809cfbba87c7f20e53206879e0451ca05606f3510bd89ceb5f61138df4a980da6e05db7bb093ee904c2293b7b72d6aa8447ea89ed567e31c3d8727b414c3e080db592126feadd4d11ecc7e3b7651af9a2199afffda9ddb4114595e51dd6e3e12832e6c3d92f491919b170f31f0d1cc4426fb94b595a0ff4024131228364382063b3a01f6495ec8390bf2bbd6880c41b7e5e4641bb2fd773d6d026e99efeb5cebc6b2ba11d856c796fc25910aacb8a90c54e1fc007ece723aff49607d9ae364547a71b056d0b168503d58108fd836debbba0732f46f2f7de9dce0d5c29a9136a40ff420753271f46ae64c7d8bcb97a398ceb6a92e31272b6b155440bd91edf72151c04285d6bf588505ecfe93e013460bdd1bbb17cc44023bf4ac3ce990838361d0e8862b59415e4cbf25dbdc009c4a68f9b58c2f6f4b8174b16589f4e8ea4f19cac1ba7e21a3518f91c10bcf942b21a91b9d0b165c2263ad195923e5716d092a22fae88f6748e52522c2bf48b9dd825dbc1904cd53b9170ce5007fc8673ca8206430d9262462b78398a3e9510182733b1fe227d5f57a105e684b4acb8b3e4187e98ed030f11ce5aa58074599a21010e71f7870f308d51d26dee5e50238bcfb205172475e77b43b160a8b0d874d3b10917339fb1fe158db1c906addaa11232bb09422ef2fedd5990d4c7b375729b5b7d54b831292c27909bd27b40480c5323a878513913ebc9844fc958a7a03877af8895c5d119d832330e9efa594aaa1762815da70eab0ca8e78a5f1022c3969f533b02a201ebe51a05d1c30d0d426771125ef09a9d08aa566b0d2de107b0cccf907c07a5ac3de030788e4b65ae7671f04daaa60351b3d7d6b8d19a4a17fe680434b259e109e5b29035ab85e2229805162b50f6ebfb00eb6592e456f7591d851904a3d5e84267a86e252645ed7b79d11e800d37bd3fd027a890fdd95f649bcea0e54e52cacce67a5f897012ff8a4bc41a2a9a7e835a1b20c9844aff981bad1b57a2841ae2d65774b3062e8802f3e4f56e508bfd4f3b480aa5ff2044dfdfed4d82b43525114d325a93c99ddc1c7708e298066ea1bcd2e012450460a538f2014ea0cb5e591150756f7c8ecb82b9ec9a5ab4a0bf68a1be514d8792e115b0ac2033d61e159473dc32244cbf53981d1cfcf9e409c234f95f355703c12ac9c044919b33060f8a1de59deea74fc9adcf1bda0854c11fec9456b78f53d5e661ae3748e0da7b820fa8d2e49e770466ed6ba4c12296724299e9644601610a46b22d7dcf970d3b063edc22772b38f432cd9078cc9b592d060823a872511e933bc89fff7733cc405394521449a1f2eb106b8a6d89c721b74a503393b52a00d22b4c018aa7a2ae0dc1b64b98c2776a8cce4289c4a6e0d7304080833486e27d70eb6fc0498606b024381cf34f47d667e48a845f9f0e9a4ff888e21d59d141ee03c8e981ec48e7bea81b6ac8f0017a1438e6dd0929893ce8fa94b817bcf137c1226d645dd44dacbf9ee90db916b7412fce40095ed9a3298b1ed49ae9565d691933b59ff28ed2ab1d465089295db5b09f16e1445af6f11803959d238eff0208b17cddc202f0e125150f0c9e389eaaa9f87ee5b04db810e870715744058884aba71f5eadb22d708b193af02b227b1fdcd1e5834611ce54ac7686c2f9d50914bd1b043b933b6f7cd9bdae8c348f99606a3c026413eaffbf7395c0c0e98ae833abe99e9d848f888aabc4ad19e50e6f2aaca49088548231e7935387ec181b29cb1216749f34b86ed5ddac03c3bdf9210755c49727549384a93aafb16c02fccda8cf081223026e8e2f962a228eaff5412dc4eeca7ca1f3f3fa06e57ee3ca57c87083922597555c7bca26459850396cf4f5ac9b79908240878b1374595e16264c8a21e84e9786d6fcd9125bf57fbebca849194f451bf316d27b92f3b034ce3a1fc9fbcb1a9bcf669ba8a6470255d9f2fb5af6ffbd0ca1a5bd7dc1dc153eec0ee46fbe1d72dada7b78e1b8aa42b1cde63b295e0ef8051d94686dfa26070202be8b0dc79d719270007c3da95976a0e40c2318ecdaa7d23074e8bfbdc71c1d4c08dc68bd5e7f6c8d7d1825cd5ded13ca87affeded8008588d398862a29f2b5a090c5cbb17e61ced0d93de6679db5f0073a347ba7881fe40ad4586877f5789cf6fa3caaec1bd93b2c815ce1214d6dc002075b3252720a556e22279b95c763ef4b01a5bb2c1c419d37ec271bec3745219299c298994290c5e910df741d7c51f141251edd91e4dc13ac3deafb043b4e3944fb5029264a6bc65227c47fc7634fa59e3157ec00abfa6a4165ad7703eb2e9604af041e0657a2483b31b8e133ae8616a147d0a3067619dcdb3947787d1d9d4a9e0aee082fc57b98007253a58bec265a57483c9cc9d0b228c5b845f2ab5fb813b71d45a2f490ccfda7823e0820583a50045d2185435c3c6a2758a7a7f47f7c00c3c1011ccd52d5a74224ca0ddc0ee834581dc95b48d248c8be9a8397cfb036641ad29d79ac2492fae44ca4e9c88c5a078bcecb6398fc13baed11e16491c7d2fa8029e7d0cd13c4c59db2e2461aa2359dd71906eed495f225e13cd1785cda23442e834d4804faf488f9ef3a27a77a7ccbb0890b3729a76fba2916fbfc56e056af563fd6d4c9df78c2cc14e5020147e60c59e0ee42437e00f9823291936cd4e5d623ef60226764b072f5d8a4137fe48e545ad5b108be723d858cec6155fa33a7f57e6fb51cbf4572adc74b84c3d0ed044820a74d421e896e824d346a6de3d6484aa2e7bdaf8d83b64db19b23d72f60b2ea4f3b4f16b2fe76a76a99184cda4c1cee8aede8807585d2e6300becd67741d6dcda197d5382487780a11ac4fe9e0e2f0cb8484300843f482ff3aa7057743e55a5395ec65d771715aac715cb0552161d50db1cb0e33207352e6bb7a66a25ed9fe10d1e2759b547c85bbc0d8fbb15b83dbdbc8901fa02bd89c2d6804821d7baa3569f3a450cb1d35f47dfa7e442077d9eb172f3ffbd5c40d1a19ae8721e4c877853116c0234a6429268372c98f4541d5894bb27c4ed3447c249b2e9606de5ccf7132d3a52c0337c1813e337acd2cb703d449c349ca9675738d177f6a9909b9d613bc08c13675539c8e7c552c98a4ae75ff1ef34a3309ce4be605ea270cef6200fb05a8ac3386859ab3d7331fc40f43bf03a034cb5f1dcff31f8f326c24f7c303f151f0d6f12daeddb0151ce2e117dfad83bd8ed2438fa369e921e4eab5462150b4c705d84c558257b8e1410ace13cee58870f8b4fdcea69766a82e54b1f91c0fa649da7164ff6db9ccacb708d5ea8d759f64ba334d1038dff12982c1a1d77bed4790b37d614d12534038cbd834f20a7b1543a363e892342a7cb5112d4b72085f8e46182e853158a50ca941339951f1dceeb9c3e280ada5b077f20de76803c0cd04f06efd6311815e2f54199edfe4575846354fe815a6f2f88da4bc1b27f5ece53b46cc630f479926c1231549be40d05472436d2abe74d3168853140a8dcd6ad150643715af9bf0457a72d4328216850229b3ae302947aae5bf0dbd70b4a6bd3c5bbf52c2aeaddc9f44398d19792a2c1019e3486865462ab4fe70177d3ccd81cbb2d799f559f6fc3257ec8c78d81cda8a8f2671e48bf5d6d8083fac8b2051d06dc540c6c9a950ea6c7a775ca2513d213d11e3f4348bd498e8010ed4ceee0b0348ebc34eabf7ccc70833c3f93f79699e8a5661c707679de233a46fb8ecd08412f5ae648fd7d6fb7db1110238612e138e2692257301f9881fc389633a447157935a56feda347515d15682a9fe8b4ab6af6aad9299fbcad64cef571b06aefdea183b1f50e63597aabe23d95a28408e6d53a94c098cdfdea76965eaac0ac9769e294b0db25ae821ca07d4995afc70e261cd8a5627bfa359bfe671ee25ef727f5e4d005bdf3fe39e47461b0f6f7a387f65218d5b054f217c7aee3dcb3474429d2ac5a41e489451eb35ec56ff200667a4964ef207cbb7b0921c28bf0885c8db9e9ba8c5d63826eae95a43f22682b7ce7cb9f21a5aee3030933b8515325ca80233378934536056cd8b8b9d1a59cfa73ee336fc48ce382ef0f5b9ecfff578c4d68f1de7fb5e33236eeb802ed624ccd5cbc6c009ceba0e2047307d0421c61e0aec01e06403ea655a8ade8daa7d679f00cdcaff95745d32fc2a71c21444400afc707a16426b02ec477b7012c945ce0095db3e44644f35db20e554da1e2f5e034849306b098b06798703ec34f8cd3c63b8a83bcda834f5e529063691a9a5e360cac0a1301055d39b5a83517832466296bfd9aa848b3d200a25e467d539da836f55873fbffa4559e055f3f5b3cb9d7cf4e4b1ad9f79e9b5f208292b05908b0782d30f6b444f5398fb53455de76048a80d86c1a576362d3398a7007259c426adbb80e53486474773c72334fb1aa22ea25649ec852ec78171f84a7668fc5dc393b81abf0878b8bbec17d674895dc3a1a17441f975f3fe666535d18a21bb7aa31dc7615f8c51652e69d3ad29ed85fe120fef3bb442824bd306d5b16a98fedfa7f7d63aaf38cd73b239bc70673c2173a8ab90ffae8ce5dd2a53f2b412f2ebdf39bc9b84a2a3390eb0955d0cae0bcf5a337c620483d81a6ab57156988e2e4b912fd41a5ca666a1781a8a65d068abbc2f0b253bde1bf8e6b7adb9e3b59cdeb3691fcf8156c5c41385fe16389236b1188d78fea20185b2d23732bb86615d2cb979b8929d7498105d3a9d3a0a4ed634c1e68d9563183ae3e500fd2301cab3fc677391c11bb0548b2041df5280560179bad5e255be374a921caf75d9c081e9451a69d6f618e409670d89a342d981a6a97a629dbbfa3ea11b4ae510c3bd9fa03827ed2febe4094b0eda1ffd67a6aaacba3ee740beaed62c9f6ebd29861213a14dc49cf6a456d516caab78d6def3ab54da34e6c4c278055efe21ea36312e531386f5cc7d5331b6444e95b649f86ad6459c9ad648b3dd238f6d38f43c76b5573285c6b30b1342d9af1eabe5eda421fbd2372c255d2adfa689ec224bbd0c9e11e022958f5ea73bf806acd358fe53ae5e32558abd4df66c333125aaffd1c4c055845cc759085a9f68621b439c0229bb45fca16f02039ca1bdaad3c8a5eb9c80df1408166830cab0ba448cdc9f757a21a5370659a2871750c302642b0b5d30d4b1112445d202258629e09dd7a1ba7187aca385c0ddde6e8e276f308bf812ee20f9fe5af4b2db2d5d3a701d0e6f178bfb511b59c2dc02f105980ecab8f622e42cfa4e5077ef2ec6ee454bda48627bfc2843c118cfcc13d0a8fbad1179d0aeb6b1faa4e668e2716314ca19a16d9a64660dcc180e9fbc67248de562a02beb36adeaa23c525261a730aeb6cd7ed1083868e28767e9d55371e70a6d75dab3e3ddcc18012ddd9bbaf3b1bf6a72303ce7027a50b46ce6731de1d359c5a1589a67ac496e1e0458c0537d080d6c20307992f5a4e02225a1c8f6588fffb298026498c1a16e5bdda4b41d4f3aa920c3b64c20f53a12dc489aef74e16a097321368567d2bf17423fb70ed3d1d095098b7c4463de0cf422db2fc0327f96b82d5a25c3fc3e1bf15894f6ecee4a9c16f1149c0f71c080d8cb44d463c241ace4c86931019f89198c485e6c426c79aaf78620e9c3af91abc0c020e9ac6d590ce233154fc050d60f4c6b17fe74c90d6bd2244af2cfb3a6156adb6c5aa97df9cf70c9ebdf9f1b6f2bcaf38db1df4591ff08c433da71e9c6c8048be0d6503f7b322a1554e9c9c5f970375ff57e4334f880db53f7a0c7c00dbaf70fbbeb5afda25129cd38d4038fddf2d6e568c302617ce3d723033601acc94fc3358ceba12d18cf8b3ae21873075fa6db0b5f95f1c8e1cc83b121be2f6b04b57df10dc80c195703a094910bcb3b4aa38c8685ef223205644839ca41a0806cfc1df39c169e5800cf957f100da1d63638ff0448513cf4244c2a1a19765f35f9e53c08e4d0858738659c15763279f8c4c10174ef2c29ec00874a36dc032725549a3b36f04f0d2f9c06199d6017f9df8da8f738d1bb1fadda8e496bd8bc5de0676153e913a618faef9447d82ee3bec657ee49f1cc842fa62a7473464d3f52f5185c316035ba6e9ca7cbc1602c7bfbf06ca4e1dd220f4359d782db687953566715e2ad48a473852884e6818dc80a1a60518e46cefc0efabe8842cf21c35978b76905f2d11e242f68d60809a84e861be4c0a8663e6eb2d8448fdc2c36a2b72ec940b0bc193d39f6b96f67a7c6aee784f4e7ff35a7cb3fefbf936bec178ebcaa01801bfc8122e8d031a8e1b883715496b53a30fbeb19f05274d2f98134f0299b6b76bccdbc96b9589130f94ba527745d2971c1091a45cf62f738909b968c7d032a24e898b598514434320b7a9d4e7ade32c2e648aed75d29fb6080bedea1120a695808eb9bb9c6f635453d89a8fcb1cb0db7665f6367982a645e6d6f32e9b20fed1b6455943a6f778c92a70368341e0f477a5e5cfeb50d76ab857ede16236b256d956c079987c12f2942cb5548ecc505a5a6085963e3158341e6ac88e64a841df6d8404e5176f8fe533df1694ded27cb68dc7ae75b24ec4f55666d2aed30a8a375ca39515958a055ca012f0712f325af5977185236ee6d41b38472bdde0486b80aa7d01f7839356b9e7567f0f32699da9d61d8e57fd051ede4e860ac8c64dd4514390e6b58451be304f583352f0b98b3a22aee804facf15b8e17f1054714ab81d03a0c3c374ec88b84940fece34fbd44c83232f741b045f69c8ff72655dba8db99050ffe3250f95e91b7fd8f75800e04002c8cc09e3e05994238e0dfbe9ecdc3d0793cc63aa82c1fa9b5aed893556298d8855d93381621a6d1e8836ffbd9443d950751aa113f77b2059a49c0b7b55936ed58033aa63aae01faf579ee3160822398a78a3c724ec6aedc7f5e5a55cebab9bc7cc2efa3ef29fb3d1316d2c2032d4ab9dd08b3f3672f52b34605dcc4dd92da25e056ff72f149b2a57eb2a02a7c06ac774be99936f7a95f9fc5cbdc16f2e7bae161d30eb2d6ecb0b6da71ad73b9bee149582e0f115517f123d0b3dbb5149869d48c61ac376f7275ae80a05ca1c96f5be100434696a856cdbfaa097b81c8380f1d3447f7a1b6c906b82cbe0a986c22e4f9d2444efee664258a37a950443a79930008e4f6e5a44a7b9338807f7fb6a3918ebca7fcf92b1784a246689aad8fb6a6b3b757e63e193ee1b21482084275774706f1071dd5496ae90cb4d40f8a95b4a860b7c9e8bda8b7ea047c15672bccb71f6580742f1076bb6d45e9a960f3b183d9430a8f7340f6653ae3d99638821933e87a33926a58cc93827bdbe353afc8665a692fc2857f61e5415498d384851b0744128706ae7506c778cdd53f9423a6f372cc97c6556a520255db3ea4d41940cee03157554bb312212d61f3028145f001d0a5a7b59750630baadcbc21f6c496ba8049dc9b36407ee19869ad48a1cdb3cb0c873c71041007c403fc89cc17aa9399517f404993b5a71f9db978a4c2252f504514ef3afbf0b6f42178750ed217324be3c8295475c608a4c690a758070e324d28a3772a7ebb6234f90cd26aeed577ee28ab2bb58695a93bb18559a6949a3d361c0a37dc8ad4204f79e383aa1d9e8c3c84f55661cbfff834b8b28a1d0b6bf0c809301c9bbb9b48b9bf0630e51122d77605e35554816e31df18f7dd7deed2d1322bcfc0a864603cf7f2d7b52c9f1e2bde5d19549b2e4fc387c414a6461fefb147801d5a3a0a9bfd3cbdd9693da5b03ad6913e9f719a06b7833fa25354623ab55c668fac3bbfb40e6b8d4fa86f8cbbfa03d3c31b0c62d984253f7a20d0eb0d164d96b559fedb561f8bf32f3a4bf2d48f0aa0107c140e5f8c862295517ef4e71cc239eb7e1adc3553fcd612380860fc5f70341b7c1ed31b486265a8cf1841763009c7cd28ebe00113446db2d555d3ede98cf10e33f9e0b3e2aff832fbac89f058b868f2a89d11d93de61f9875cc02261a882431bad701ab1b94ecd4af8e690f3694ea5a25231e2958a8a95e20f6a5fb2142835bb1fa199082e5330f87c62dfa72c154acdee43401309225c4625fa43f8e79861ee42e23d367ecadfb97ca29ba309f043c342282459754c065c7415eab8e8fcc48f0454dac240a468675cd4e1c62080fd0781905057953ab4c50b7541a8b968e234df868ff6163887f691d6d223c530bde158cf01bbae4172db385003130c8c1c51bc94d09140908cd931e4d5a44d87395e8f4b2bb48f7949c1e986c9cf94a0e6ef637b9816146fa3d72ce679a6d7fa8c5426a3abbb78ec46784e2f74a755933d27ae2619bba44611bb8fbee23317bc4617bf3d3f280926501c1f602da2507ed9b79d32817163c6fd8290b26a04bf5c20a46eb97eac203903e988a45e82b5e7509ffc284bd9726693c06f97276f3c4d64d9381e350b4b190d872eed228edd5395fe31b633ff1d4feae5e04055cebd9288d9e8df0f742b3699c0cea4b4bfeba98584ceda9b6d835ee742cd10e230ccb02e0fbec0247929e0b18d544c72b0e54bc8dc41439e7cd018ce3e414f9d7a4635e5d5e7c47ffed8fa3f38210a7090579b288c7b67b0ed7270ebacc9e616ffabd4496fc1f8ffc0f6f95a866961bdace9b25ac07a9d75e67583df5c6051584e2ffd40d7d88712e2ceb7f9cb11240d36d520e3b14f24d08194aacb83173e76a07a63d94d4ee5a8a42a2e3d7c97b397cf394e4acbae4b3908ecc191850c20501818d6443e9b03c300208c05b1e020977c516418cca6f0037c7586ca906ee374d18953582760f138c0e3dffebb61a21e2c7d040c0bd0bc7939896543578445ba43ffbf08d3e2e6ff0246150a6f788e8dda967dbfcad5baaa47e2a7ca908513fcd3d60094c896ade2a9fea3c594743f0c415f4241386f1c17992dad9d9602dd9b439fab38911c82d83c6e56990eaaf58c064a05cd0a33b6b15c2a29ce6ef8f2a240f75c87d8cc5f067e4842fcacf179676dedcde152e665eac1e5db5d099adab6f67b78fb5efbc4990a0153c92f708b7adf85c0b73b07360a1896d486390ac1f25a2198579671bae6c1ab196bb349a3dcf7ff7868fc2a6fe0ca26d8442fe22d6b516a402f1f98047bd0856425e823d6cdc63839cc10e9480f6a5d94bcbe7bc9129688bdcf5c5b21b0effe619f856bf0ca2278b8997a1097fff7c41c16c283d5e9cb7aa0e177e7e51e445b8a193d0756a0db5b14ab7b94df9f34490af0ac482a2dbfbbf7ab87b0f881391eb3a36d6ab1d2862f5700d6f8dc3153247eb647d7a9f19c1477afbe735678c2bb944e6544f70b5870b79ade76976b3655cc711d73283882e4dda615d31ed13349f9f87f1315ca8d8299a3aa61656db49b638d752332f26829cc3a81d40b7b654e2f3103e1c0c7de62759958192459ee9c6e330a36a305994e2ecce9049d5220707d122530e2a2838a7b035ae3f1b046c46de8502c53005da64aa9e2c50266a243d78e259037c163aba5026f9812330fb5eca11fe8b72830d0e1a87538d853fd6eff864af90a4b67e193cbfa2fd6d77588e38844d6552269938e7aaff35322fd6f3ab41cc8eb935ce7baa3ef51723c353e64556fb9f60925acded903d299a323a3c295de2215ae4f6075ae4764b6743486adb790fec70e886867d72b24234fe039c0cb8c2253b4808593be71e5b6ec890286647970e6f0aae50f011c57034a6520093b66edc9c608c3d50077a15a1d09488bbfad5b184332cb6ef20b862e1003da5d6eb6bba5520e7a4dfc630cc05c055671539724d36b9b4ec089435f59b8fe92e676b50a8ef743eee8838d5676b05d966be614eb98509ed7937712bb478244852e8216a0da78297922c7961bf4eb5e1b5d6c710a8a45f894fd18f40083330792faf569ff6e89e57e3646f1cf05a1c357d156c10d7ca74cd91940160ba29402c76dd1c4fc5925c7949d3e82b3c57e65899fd0b721d645a3b91e1c03d78af8f631d971f482e8ede11976f9887d9e7ec76e6e604067897148a1f1a1d35b94a51c574e9142a42e61349f804b1a4b76ec4a47aa30086223c9de43b6074dd09eb67e86d3c631e0b578bed1a1f0c39a382dd719d505c12b002f08161b151dc71ab22d58983095351f2a8b0244fa9f8e1a22ea28c90860ffbfef85c080f569f9bfed4496ef9e66b62d1035df955e194381f23c48a0511a451b21add25cf59d3148a265e8cae3b8285b41dbdcd3e4a9a58823162a2ac3194d28b11b646d13031d3d5cc77046077cc5485effc778a10845d03a4381efb3886b93084b724dd67078f4b0c1355ebb419d373ca16283a9ff18ed12a8a6cf23574bf592359eb0b578f67dec1075c337254f0c6e7545ff172c589271b2337ab06f2309eceda0933b2c151bf617ceb9a77bc2d183e3c0e12261e14e076542e14b857cf83dbf62642f4f67e83c71dce831540565e9eb656588ad54c6bedd50f3b866da212ca492cf143a1e36aaa430d3e9b0ba6cb114cb6986a457f47982ee8238806d61946322227c2372a69889e7f5757da3da4536744fc771b977b1c37a95902adc16f5c5e85d972be85fb16e3e8d30e4a04cc43af082a1c77097db801f012a084d50e23aabf9e68ebf4491428ff8a88ece9d02db1167ca1934f171c41c66f1026bd848d072cbadf7982f6e6c883f0133257945cd087e779b1b6f1c085d38231ed4266f63436296b0a25e65ce1eaebcfb83467dfe85b7af59112e486d1a1c73b860c356da1c90268dde2e0a088b5b60a133cb6811674a3143303d2de7f098a12f0368b3eb32ba53986ac1d631e3cfd69557fac28336e1ec964e77aadfa1427e3ac51fe3746fd782295a1ccc015413f00ba019aa3a0ce15ae65715f29e86ce2c2d530854c46c35d2563fc57ad23ddb3faec90ab1a95836a94b084dfb4c451e15a425ba378c8d6f05c51083da715000ff138176fa56e69eb4535b3910c4833c79a16c18aa2643bc43357a05d2fa9c7428e7f027d39d8bdfd0d3e0b3e2a87c066847b16423f783871d7b0a295a6048859c915bf910762f3acaadd930ffca65825c6ed0b944829c85249ba17ee9ba720290c0a11e15a0a81cc331eadbff9000e22245b13652e944bebe3355921f864b56a332855bf5459dc1ad1d0f1018f6cba305d6a5439c1e174bf5c238f1085931573fa1263f509f6535f93075ce6dd2870254ca19209c4ef97fda9683947e612db31b27c3b1591ea4e14bec4f43e526ffd8e8c0ded27b3de059963237d40f62d0373e83a4db32994f1bb58d22f19f189cdca89c9e123af575eda3da0af86c1f60872a629a3aa0432a3000f0f13e0f2f04582963b4a99c1ab73c030973f41016b002c6cf815f41258ec9ef777c38c00930eba9602f704ffad8403e6224076ef19171e302d9d933567e5ef67bbc8d0aa02fb21c3b360ea918d1d37b9a83ae69711b10ce516a9ea7540554ea6244581f62e17a9bf2890dc2f35c344f57cd17d766896afe074577baa0848439803256f3244bfd236b2f5b97302b2cb0fbdfd1b2829a2954e51e167a9b8f4e76a55eab794c5bcd45b998125dcd661bf55bdc6a6e37433efa931702849570158c97b0915418fa45b9c7625daa7910c274aefaf7b9f20db8d6795106a9df27df340775be546e4a6856f3ce93e6685490b9104db7afe695530b10e7de7b8dcce4829dd7592519b1f33953a32876ced78c4cff3fac91d2e731769e9fb01bb8dcc32d1109ea7a8b7090830f532e66b981e259d8b6e2abe5d58929f315cc921eb6f324e14360d92a81158713d75bedf7293a4183cfb416efb0e1b167e0e0175709959703ffdc0ba232eb6b05ccd2c5096a302cafc2da81914b0b98c48d006be8e5113bb6dbd303d3f4cba1bdebfb0b85421157810daf05650be3404dc86f82896f23987c0dc1f2d77991a721ded00ca154f07f6714c1810da4c4ab046ef3229f8552f4884661c1c95d8213ac57745c635b5643e6eec9b421fcd24eb5cb1acc772193fb4af6efb78ca097e44805631b22013390437509ca1ae6976d08762c329f2591f3659c16a63437e2590f4d51753da271e053e8700ed9d4506c61b4609a3ccc8d43a052f90a755209f492882e09b8f7cc08fa2baf6945ad4cc5392440189ac03a407bc6d97a17f5903ec5ac90f242a09a4c14d7a68db625e57632d852c91851a5686f0f88e07b26fba3d6a1cdffc50c1214f90f2890647802a00e3f6f2a3ea9fac4706a5162d17400e7ae55883e81cf89bec83be51381a96fd01231120534de58ff1022a412a683c62224b607340f1dd22cf92d7d2222da5229a504f8b4ac4561a2b1aca24983d8d1ec666b14d638a32c21000dbf142e392c3dfb50dc7d86df64758a5bd6d1e3cfb712ca6f82ab4d0efad56bfc017b11a1c2535a3d4ee53c5e53c291cfaf9fb80889374e5905d1e5c168a7fa017a32974939b89eafc5ad8a3605aab160335a73da34bcaeedc667724ccd66abf627b6d3d828879963b3fc16333f15d2f89fdf79fc35b593e62f09021e7bf5b4abd5f6ee9540e0ac64a404b402561825892762c49b54b4b90cdd55ca07790b5ae0c120759df06f125d0653bb57b60ca2494d0f2d26879bc5d451cd482f98cfd86602af6ad6400f9330ce1e269da37caddb809705c2e821609e43900011b4a2c749be85288fd2b51d78af19cbe3a955ee90a2159907dc4836f2bd90029f8ef0d38193e2bfad53a002b372684920761bac029902823fa891fc5f8135033144397d088b409a4101fcaf5eb5848351a1eec4d17727ed9dc398abc72b4043f3a3ccc66d0e4191fa4530532d434b4cc3a38876805f1ba6ca4158c268995f8084b9bfa6d1812fd0d969f26d7beb7f0920696449cdcb5e2d00f336588c8ea226a7d96aa4e13a19390a75f5106a695e12e28c333193dba0027582167e9e4c86357736918890e23c673fb7c1a11a5c7440b7817b5cb6e4dc16f7eb290553427cd516eab5b9beed64ee29853a1d9380f802f9313c2f22c14c3a3ea3cc51a31c72fc2f08b829eea7593e51715c2753babc29a77dcd2a5f4a5a0086a9b337947937af460ac0907be153ec4f1ba1a70700ff8528bb04ef24eb6d2581aca9b105604bc71d48c7986200b02a02f78f068bb4b88abec4ca3d9331e5d799dca6b031cd31060c01fe974d58c6e51cfd77347f217fa113040ee6d1cd83f628f1e9533d7c86e057039ec1241aadfdc1a87cf3d7581f89c4c0f85158011838f315d51d290b213b34680bc8149f5cf0248803de2a7e0786460c71f49f323b30d0963b1e25a78b1903260cb1ddb185f7e48060804cb21d6cb3290edf817d7faef5bfe7da20ef5d0726bbdc9f863f9647f9ae9da41ea9362dcb29328853862007ae710baddd457914c988c0ab77f73a62a43d1d4648738195f805b2ba6cc6d10a5cc4d2f96532fad85b3d7db6a0a58449fdee7bc4400ac86b0377b7baebb057f1180e468b3dc896d8303123ceddc1d3ca00713083fca8aa39f1b8f641ff52e96d0997ce2e928e0a8696526c0333e8983a2a807331e52a4a34d165ca878e0a857c2c372357455d46e485f9ed5e6957e0be7b4805422af92591e514b2c8b43298755f52b1f80df9074f850047f3cafe14d3650cf702e61a4a9aee40a0a77da4ee920aea4ae1d02afe73218c0c684e3def652e853b990a09001304dafcc95400da31046a31040b1e8b3417b245a60277895064bfb03dd565a490405a8a55ac9d7312060e44793293cc14752a4eafb702cf327483bf831b55e3faad008ffa3304644d94f02ec3736a99d4ecae244c1965af8823d2570a584c8ddf83d7a1a57f541ecb1626fa3e9590f1c071be678ee00a1fccb31457fbc451ae8e55d3ab4beb8ac5ce227b0d70094fbb06f1356445c6c6f69c32a677975036743e5ba956b0b33ab14d0f28aadbce2fbe7e75ce331c2bd77fa844cbbab51d5b8369e09d92da7bf9b03515a8b1c9bd37043e0c654ec4d0f73348b0394ed88d3bad81006e291e1a8e6621c4337cb8e5de023d22f57ddf75ea7dee2a871792ad487a5e0a804289bb2b156ab42c3c2119cfd3f5ecd4db1db1c6e2316ebf3700dc117f60e8879defa2683d2af9b4745b28e5826132d3c8962d2618bedaf61fae0632692e8fd9338c46b2561a23a8468b7f64cb7f6d61a6925d0104382086dd9adc578adc853c85c68e351f0574f3a3d0e23f0a9d1048c179db6931d3062ae458c1874da931e868f171015794d447c122498fc63bae2e8d7c2c1c74c0baefb159089892efa8d20417ef956b48599cfeb9a6b156b9bd2d8d27d8a8e7c1ef7c3fb7b7c02efa32dddec9fd36d66e6f713c5b6118f1f6a6bee7535770656a66aea17dacbc1c8e56005b9eccb7f729d831b8a76f6fd0622b09c25dd06f6f0ee8fa24786fdc09ef2d633a278bf2a4e1bd19cb7d29de9b3a18ef4d38de1bc64a511192b6d1de75bfde2f9f70697263af59895a0e6006c1cb13579fd9b36323100be6f47d60922d0300a0d076a2cc5df0ec4ed2c046ed1f50412ebdc12b569dcd6fa338a6bb4ab34fe356c10710e9c4a584dcb92bbb132310e93571f807221b47e6ce6988e4ce94a271bedcc6dcd67263a796f89e4405baedf58b12e0c70b16b5bd3adf59a6d69ba7d3284b98bbba673dea1c1d270207ea96db6e7c15b1ff1ca334a8d31b559ff0097986c4de0d3946188abcc1f18d824548592a9600da1e709f80d699f27e15b3dd09fb7c488694ddf93f7fbf9009b903344a818e687c27cc27f1d2caa01b4127ac905e08fae2bcbf2adbd8a809f343c1678bfe085159c3fc4982fdd621d8cb3615816a98d626218d6533367274315f15253ae1b9edfba2a87c0a37cc74aa0e3edcb499ffa9803661072a06e9430438886ddfdbdf8da8520bb8036a275aff315fbc4707d1d9acc17be9e83b7e88abfbd5f41c532b7ed5e0fc32471f1c2aeb13e285ef98bcbd89ece0829eb87320327353ce57039dd66d8d8d6f4d9c8162d35030ba9c4718b602ec61a02f3de9e389ff055ae2aeedfc8b0aac004af68f2b50500ae70b7bc11f355adc49f79fc1b91578babae2a60991988076401619e659e604aa9f1dad3bea2fbbf2d7026041998ba87e16e2e180828b326b2207407f73f55ea03055c39e3a9d156112401b9fd0d343b45043cf7d0231ca04011846c6e58cf140c428bf89e96a8ebca4801d67ad55ebb8272c85cda5b4ce564a2d3c9913501b437109db0c201c25904a1fcef954db5cd2c3fb8c5cd8c37b37b9aaea4d9cb72e4e22e6c4cc070ee77f04a10200c835f7afdcdbbcff9f6a4fbafd6104d92b408ee8ebca40c62779041607a1ee240872043215d3eecaf626214783dbb5e873a8d4fe670132f81c19822c8380b86b1136e5ca76f65fa26158247b5c8c9d567708580076275670b9a27161b7a224ae440950122151959044e4a3f0c21d54fd0d7fe441d7a26aa061ebeeb29e052c0b088ec11593fbb4d20960fc9d516b9e2bba80e4b3bd5b3a6d3cb6c1a4cbea587b6aba4110491137fcd49de21e608982af8facaf61dddb8d03b1b78185e48e5279ebebeca7a3d96b03ede80f0c6ac66287783276b407007a29416998830fdb2ffb3350f33464216fa73b7c4956a180e87ed64bc4394488ed82a0a69d3c0ccdfec3103b5f9d83ed13f56e88d87eacf0696ac436a09bb6ec28a04790b56bf3960caf4d4e7300ae2eb1dd336f17a6f558fee7360c13dbba95b5ff8f2fa79a235f04679b59344a2cce45d19cd8fe16c9365090643bea98eca349b67f43a48d5eb771d1bd7099d83e2dd94ebc976cb7bf62b21dd9e1ecee0201be738fb11df3eed7733e2ef391d9a98a417728e1635fb25f910da2aff243a87e8812740dcb43c347ae84d5a231fbe0a3e6afdaea779bcf02ae1bd7365e33ac94fd4ffc5866d9c9c6918069e650a50dbfe2eb3702af6c7cb5fef777970eb4b4445367e2918c1afa945c80f2f083bde7262473e7407868c4ad46260f2d02aac0edddc40ab647518ccabbf8b2b86cace2bb80e0912c179d020d6f9605c340707a2a360f0f2e517e8cded356ce3109f237056d0cde8fedd07ed17d5af0340a090eb7759163befafbe954cc5b5d95b93562618bde118095c42c4f994907dda1f75ff7de3a359e4c68c4b1e0c9e1c11beac6b15a4fdd712e750f35bfa3f38df24af03729d1d1a4016ebceb2638c3b92701ea8cdadc5e68e208daf774b1834f2525e0f6bd19e783531035c1e2046da988ab112eb5c4a814e48506900c0adacca193d53b5ced55abf5bc755d054793f654809c4aed94461a7d35fb242cd74cbb76f268cd7e425b444c69e1578ec74396daa08c97ecc82c9cc8ee474e8661398f480e27a27d29a2fd6a3639fe611e077aba4f88938f4c4d01006979fb04e153b3d7139893dbe87f3f0b0fa1e7ed58408cab3c91cc1da3becdf3b77137fd137ef231d970a766123e3bc39e70cca647ee97f7dfd7769835f1115d05a4b0860536bb06f9b4254a06ea4369bd964ae1b4c46a283c066acd4eb691cfab8bd71a6745a26bbbea2962a4de40d2647b850f20602ee03f938d6403765025260dba3054eb8aa2c0cc09227f4ad941f1835017a99d27ee82a28e44bee530dfde04edcd047be9bb3ca203f698ae9d186bbc5d00aea1eb192c8269fe6b0a5f0d855877b52e40f477f7b65cf9d5745874ee9fd24fc29da1e82e94cbb5595cd9bde10adbdd433200b27d4ffff0f33ed59da5de3d15f22676f854c95a0b9e5d4572ecdb373056aea4b153d7b50ed2d036b869dfaa53b236695c71203f299616e7d82ed5bbf36aa64f89e8e071efc455348f441ee51a5f30e2d0ee7e7fb41cc37bc94ead20e44990ca906d02116dc58d402628c7f560f3b1c9c21619f3d402b2ff2ea88caaf9268d61fa32c1eec9c54d8862790d0c45949e0c8217bc40efecf754eb92ce79a8b9c8ec510517355b0bd5e5dd23459d1c1260ceb3fd29a3ec9d08b27fab474f6b72f5d6719bab7b985851b10c1f4c7a43e7d650aed44cddca9aa89f546d13b9adc93709d187040081be3c77974a0b6579ae1cfac95ce1d9fa89e223d5cf012de896d743975948e33ad507bc7d6583fdd49987c792b6539b80ab4ec0a484c91cbdfcba5103f60e373385ba9e92d2402e05a83edf00e8d02b0b8d2cf1a62fead7c2d21e623efb627f8e6d3d61e454f6906100de272bac1ea0c2f08c258b10734f9d7977388908ff745b874c471830595c75e687412b0181f5631d82ec59f2dc34e0408f8e483b815ac95e98a3155d7ac0c69e87c571f1d2514716c920cbdda8923d97a0a68e9ab9c833f3879cecfc636806d90d6076a147452dec3c424ca01077aac0780468df586524bfcfa650d8f156159a57f6c97405dc99afb7a2f0596c29a5859cb6a627a49a9d03bfe4e05c40d1eb68830ca030fc70c59e716bb7cc50fa90f3f5ba25174a7e9635cbd8c26548d793056ddafcff42b5a4d7816ab1348a21aaf23f39d2898ab2026aa4146eed1a097d2198f56aae189c56ba9c69190d5fa8ff15b9104b620cb32e9e4f3a1440ae43b5b05aa83a09c8f55012c83523ee150344996df0f9ad93bcab3abcd8b4e6238750946bada6bf58ccfa9d3fafe542cbf56cbd893e7c88cb5ca3e2cdb5449204f0aac971b4e65538d72d2fceb5e738d778c17e35376dc9aae8c91440597ac665dea50e2ac61aed7f85a8242b01135898e56649509b3bf8819bcbd6042d8a1e5ad986b10a75bd2c4776ecb0eabbedf302d5452670767cdd38891ca995bc7d67aa5d197bd29002bd3b7ae34e20c7c33a6ee1b76242994bbc0d4afa541bcf4e5cb1f1ca0ea017f94408d4e1098d1627eb14e4981842191b3f324ad6f804bf7b5ec48443d4256f2487808e8044098a6afd277432c50e3821eeed78db1f7e0f76aace447223585665940f5cfcdf23828c9d363ec2f141086c52695ce8a11ac2104d04f9cd0a6447e91fe5eaa90206aad9ef25a604bc88be6b26a692e73d80a41256c8af7bfb0232ffbba00422c8f31040504dcfe3054c1d19de14590c41b050aaa963102cea20764e5b60df3f466565b598cf3b15cac7ec7c72f09fd1aaa505cad3802f4163923529778434bdd0d29f1718bbc10de71ef3f237fc76cf0180022507c707f034b6280af406506906204c0d885a15bc8d3aa475fc29db78eedf3017253a8c0ec6851636fe7ff49b7e0d431eacba6f235631ac0871389114ad393ef8440caae1394d4eafe80451ec061f54c936882b6b3c55eb8a1e9f45e2569de06bebf1205a70106e8746598fb9b39ff1ab724d893880639f7c8e0d2c328319a186ec828becc08f939ad9f1e15394f850bfcb2c4cd6b8a50a42ce74a5725a3f8be5f321c10278cd2e92c0000004d081c3b9a7319474b6a5100d4ad14bd1693d6d19a74efc2d0b694a0839a224f1a2bc2c871054fbcc212a31457cfcc361e465f6c8e73d14b03a5be6715b8b509715e54c4a1d5d3044a8ec958d5b60772ba318452202e9ab7089d0decdd3842e84e2170185e7f2c96d134083d4e732378d886f6051eebe56db57854ae5483b2b0b3151f925a2c8f1717949423885048ffe61b6df6892b1139846d6268fe36213770f3d23ce5c0e938b8f1ede0357ec54748de283e1f49208ca482b1f80e536582488e6bd341365d7056edcf9a0a0607539b86d673930a7e300e620391d69b38ac3cf258c047521cb58c5b2bc7af1eea181faa6179299be204ca0e111fa1c159d06070365837b6913816ea6e2b8168cfe984a1b5fcaf098beded6861583e6579e3dd29eb5b5b9f600877599dd637dadc62a3df4f498d2946596d9832829dff1e4b8a9a68f62c15406bdac7b536d49e3fc9621d762f540e5ddbaea72f84e27d8a0863a4deed95b354342ebfe311353563b39ea7f0a0caa486bb2053c264e2671c5e42ff64cbd446ca3a25dc05282f93dda3b9e3d1e8a5240a7b46d0c9e330c4980f58e414fed74878313135d2affa5ec1df8eeed82e4d7af3a6bbd7a8527a2088c9425d84b435516bb8e4efa8a9f647cbc459cc13dd6592007e5595d2d2b1d7fe51e6d255e7b06eb16e3be8d41aa26d3603d862a3210565eb2ef66222b2f57947eaa3917b623851242fc8fcaa23cd999e8738d8cdcb3caf1c0ee2aecd1b56fb4199f5acc5b3dac6b55cf5f4152e90e786ae232df6ae16e9d84bcf63b459ee0cd79b5d4b53f0c9d4670310588410b9c15c47b14a859728fc89f1828e4089bfb61f027175f5a03b5f522f45e2adb1050ec3dd877f020bab4947838b70805f29fed026a4c6be4a57ef6b8084a03ce9cae8120e24f4b3e5af9a4d4b91b4cc472ad5793321530a3254aa970c8474d2bd5118ff853ca268e05fbf58aef75813f030f8b1b64945096d251976ba8ddf3df47f0e6e9784893f680619351a03b1882539f219857b363a3a5b42804574ca1807601d8e44369dd5ccc3f25203516740763a507fe596ffdcd76ce0099bd598da8a92a03b2229fb069d377f3644b9f7a1d5086871c5ac90a9abe2cf161c29afdaf5ad0429c81fb6a655e36f693177690b5d239635110a8e831c434a879d19cd6938321662701b5cd0251edf17e1017562a3e476ffb9c796bce80ec47405e3b9d5f676958ba73ab579e06964c150510e1a793e38e7ed17e70b131b6a254464efb2797c294b080c56cb550ccd4048159d3286026557390aec9d2e3bd5a19d4b22cd3fae654ad057a657a7dd2219e8b4b3e06b3462f4c4ba5f5b970ca7e35cafa65eb2727f662e00b682858e809b3c52e71f63911c60e53897423297c7bb53d5f79ad725b72df160f03ece49ba2b2de5a802b657881ec57b9903a2ec72f31e5120197540c1db14e90cc6006ecc19976b972dc4f23c471d0455eea4c3123c0e81582e1110894f5f2e5b6a09a332635b2e851dfcee5326b21eb89b324d7716a87e54c60be34bdc28e99679fdd84e02a1c321680005383d6a844696e3d40cdd10a02669e744ae8aecd2a024bcb5f9959ab3e9105dfc05c9eaecb42e359a1b7befc3e9621ee70bae6948c91e5bab342a4f55dfb000f4e6072c1c514d67e126037f397eae24e63d199bdf7296c65469d38f98e81b4ad392ff9fb36797ef84df054e667f78e7f7b6d1e1cee005da09cf281049af331c4a8af4df5b84246ed0f5e6b107601b59101cd42fd6070b5d41da105a1a62b35ced5f368200949bbec15243695baab46a815e4d0a90ce4dee68d6ca81d0d242a91344bfbe75a1f3ad31662e22158fdd901ae8278a409546ec757e6990a37a00d84d37e20534893c656846289bb015c602576c9f5e79da9acbe4642e84f36071d2863f0e2e0b442afd06db6ac92cdaf4233f2a93f897c71066b2100c9946082a908e095d6ce6b1047e3537128692ee02aee8726333038871a7a95d22ad0ca1d8b45f2f24446632016677c8f188dba2415c5af5da1edb27fb682e6f450c311bd17e783039def9453fcc18de16aee928e8fd7a742d679ef0ec849300ad20141aefdf646617138711443230871d984dc356533654b81942d70d702d73f4cbfa129909a0a19f1e4b18b7a08619028c83f3c9f38e73b07959459f7aa3e4c4029c18caa6b57327be8f94d645d4d66c08e98eae1bda7d5b4049075506f2b974e415b44198bd46af3f554c420d2c360b9b14a0de2a8748c04e7872cf7330d540aac6fd69ee209b2ac74973f27c5198ab4ca4d6945a38a163ae8471410c837565dc64ada0aead26eca9a3db7abfe9e591492fb551ddbc9e853c1335339793265b34b4d8a93b2565282df13a4e280bafcfb2435b6491ee901a541d87386c394df393d99d68a91a8972a053f186ce60aaa5044ae86ce6ce121a9a55d6a155c2daf30fad53c6e6c08e04b26ec16f858977bf7ce3733d3f3b9de166669dfb0a5c31706d24f8ac30c3a396aa35346ef8c642daea8a9c8502aa1ddf82c836cb5693b8bdef8dfa0c5e83b4f57ba3555206408416f27a9277ba5a661c2dae45366e18476b2ac5531231f6fb38bcd18112d18590b923ea59cecdcbef4d0178d565a5cd8813a4891478961e9bdf52a9785a52d45660e20dc7b5b7c2b95a080dc55c4f670271d355b0d5ae835a467ac71603389844d9c8abf76d36bdb7e786196f42b369f1e890e0d4c4eea031e42a708d3ef2089eb88b8700f212d13523ac5c7f48cf0cfb91d8a5e47f6b34886b2843b33e1598520b99301b6ee3a729128b16f4b32f5703728f1122d497b787b84ed45f09b3454dd0426c33ef144141cdcac81e46d499de1676c959f9a917733f4d339efb2e77491df66cd50db55c4eaedc1c8af5ebc19f5315fdd3b33dc5650fd943ebbcb3da12697a1ec905ddc008ad2543ccd0c221e37d9ed8ef34be0c79caba8ff0d8a0ced04685d74611a9ea06b83a1321495ca5c659a9b8e1fcce06d3b211026dcfb586d8c9c7ffc68444d8a230bb2f1e69234901c2d118f42cafd8d3e1df6160b2be5dee31d34aa4a149abb845b23441c0953e54fcad963dae1e0a21dff97b5df4aba27ab63430291b27373a03bb2a1d9b12873b2658c4150ab7ccb589ac277e91837c7aa34328681023d870f3954dd9c7321acded09b8f0c1c42154b8fb220947bf6487dbe11829e1b001140a04e94579c7d76651a462e4108e6031af8c56fb86e029c44c9cd67c2dc93371990fca0c9dd248de6b4594ea82da646559232025f54fe38110f09c8e525a957008ac32b4455ad55f8067c8d2b275fd820df5cace190ac49124b730264990f414b2c42f59dec2efed728430cacfd4a33c648a381286dd8f579c7b71f7d06306cb321947dfbd26c980152692b989c761bb46926e2ad19c4965292070a77f54a1cca3b835a0b2166d0bdabbcc057c0b0c911a3f65e6768c0e9a7901a8fa7fc3418a61b814ef8f14fd56f036701d1e76c3a0e90368779361ae04e36424f26552425caa1b138f97b56b3a08c65978622b546b3ac2945a3a23c634cdebbef93f6ef1ccfd070f16775cdaa10cb983b01b1e6012c382cc5d596b7b0399c2ae9b7cc13289567c80145aa08196a9c6ceaf63b51bfc90f620b726f65110e45966b9cbc64872812c4549c80e483a72dabfc2d29e48d6eb90be3414d20f7b655c7f24f449dfee652ae004246b18d9be79416c0407bbb9f46caa02fb81697fa40e3e4467612eae5b95b1313d522766eb2b51a272fd271cc5e491836f40a8a468cae1723f616ba3154c74e1b8e67c5528d550fb111e02aa39a206a9c5c86492e3498fe560888fbd4dd2a365c9de2987aeb13396eda21a4732168e89f031848f76d8bfa4687f91783bf72c57d6400f741964d1ed9e5996cca8810cc44c864b2e20aed9a0f45453c3691b6c227b8f8afcf8a42e36408d69a8608a803c80537d566abc071f2dc906a686a0947db658a5520e985e4ef7ac9cdf2b15f2c6b84a369a4941b2a371f0ef1d82e367a6badf908c7d95911a504faf4b6d0302b8858f7a0cf1cc22f4c54c558b29b58d5cf7d7a5147ee397cfef1ab3e2cd30ee552240796cfe3fe0a194158f1fd808a9cc6a7e46cb852670afe1bf82626d810284e4a540ad8727d1cf4eddbf7a2386a9cfe94a475148dfae9c97e951614f1b02228369a8531360c2920e3b44fff647ed642477c0c942c036cb26b4f974ee73f51a9ce99a378e35e930b9638a645c9fec76b32e0b18c826940f00a2cbf2a365b0057b29af378ef1de85c4ca5926f9939036545a4bbc74b0a8036118574a05a35e34e46430fd6e9434a98801ac2fc95b103cec590a00fda38a02c44b132cf316b2d5692b985b30dfa77f5ca9c961968e6a3cca93c3780aec36b03cabddc751272b0ffef2445919e874fb89cd08f70e8de7f98a21ceff3badee4cada24193543c9bf2e6f8da5ff3b4e4ac09264edd2ffa12a068d2d86e78b377f46956f3d726f54894de26f64f279a9781ba90a8d4e5105232b93ffe3cfef30162fbf15661833beae982ceee706ecaf2f1f08c77a036dc648addabf1b9a6e4675196cb599e53dfe96fc6d9ee2a9e11f77f6d26ebdf6f2c7f5f89d4da89fc8aa81f6358db4dcea454b2bd15c7c260c055025f81f0551419a5e1589f850d0ae9db72f48b434646c5371b6d3f7ce71a0a752bbf93abdd6304d63c0333e7e6bf09bf342f60fd4d8c126719f4dcb4cab5a5830c087d494a2fd84edfaf436dbfc57748eb9ea61bf31d2e286e5c1e9339e76b900b6c703107b882a49297dc103267805425aec72c740b3beeba218699dcec314e62af306d1769da2316ecfa2918c5b608f017c080dbc5889fde93df1500d1de48f0b256c7839d49907fefb83523ef7edfdc7f594909dc9a1890dcb674d7a62782eb2e64a87f41ecd20d2bf7430599f94a32bd9c01b482ec7572fb940d87bf4492607ee9664eabf59efd3b49549312d583017f81cd9aab6edb465c7a43eec95cab1ee8928e7bb38d1988c85a71ff0a8a03e1e2c3262662c8aa16eadb2b528003cfc5c9b8ece5a8dd4d7c42b4308eb08c1e84039e2227a06239c2f254a165666fe94d72b5d618ff957f49faaf76af6a03e15f4b2d0302b41f795b2f6c792c5b67258f3680b70866fb809b40807759961cd2cda72e34f177c54b350271670901a9f118f3e86c1f51cb521719e4d272f2e819402d344a28119365421e87638c456d224d29d6c7cc2f9c61df5ca86503dffcb572029559bcab9c63bf0fdc1577a1ffa028655a99bc64343bb22707f017d8e3c76f4e03908e889bd7e9010ca74fe640f1a04cf8d8771728c9f582c5dbe5b2a4b697098a545924cd11e6a3a29cdd0dcaee6526fe6afa48cbe9a73b2cb7b2d2ddf967d3e4be43bd792101f93be4819cb84607d5ff095419e4ccded490d9f416e5264be485991a0968a48982185e54168edd451f2f8d43562515247e7d03d1305a50a776ff125a8c65fde8a2adf8011179b11784f8b43b589cd2263fca5d5443cbbde77992a5ca0e522a1f1f7f277496572740ed30f8a610acc978b614b3674a1f42acb6fcf6bc7d95796475abfd8f19c63f8c58190160d3cb2ca5618a2a1b749f112f81cb1226503e1b972ab9b2dab419fb7745780a3589e667dff17005808fe7a65690a941ed618f2ac0237756200d297a9d53b7e0b7902344a8608757d6ce0a286549bbd09dae8206c68b3c4cfe745ccf95c9e6637aead3589bd81cb2c097aed0dbef5c7d1c354bc3028e886bbb8c81b9c58f7610a63bab68461a6793335029609483567adbcaab8d9c7068e29752f0b30aac4afb406dfb462718b662c0a2699d52fd7fed449c69d82c14e66f9d4b51e0105ddf38241c24cb8201a45853b82f87f5cf18f2d62ef2b32091b386d39f712c82bc97cd80a51761a2e1c66985dbd2c207aabb74bdec8b90959422c218a1986129987a464173fdf5a3a371b26629fadd8b3eadafc49a562a613881470815bd8cb613697615877ebcda7671e0182ff84c37ef385eb72cfaed32413371cd69fb9ecb5c1dce49cf7a6281e53a87feea21b9c098e58cbec799352a73a8549098cff589c1f392106c01c5f98c746e128fbe6fe87e95c6aa5d3031ffc2173f3f9c660c9226e3813e0e900d380617e666664c135f9742f38f6a138e8241e6c14bcffb3b369ab4f208e2786b9c9447d9fe642bc7beacc2747d7b2b597366bee66aa5b63d8dc5fa8b798e747cabc327a1e18fa4558402043d98592d926bd9accc42887818db9a001012ff0dc83f3759e456f9285f0d62787cd139bfbcfead88ac99dee97fa94b2d07856ccbea5cbd606b4696137f6916501d267b67b5e0afafff455a1828e31192dfb1bbff51122f6636c9f7893362d1d769661990864db2f00d372cc815e3c4ba3329dab0c8bfdb6fda60d7791586e75e58322c721e597bffdba3827b238231a8a291db6c62247e1e7c51a1cf3016f47244323b2e30846b09c1663e42bd703e91676c4699c7e41735b2358016a9c06f8f6d9d6b4180c55103ef92b3ea41251f5710e5ee74f168e99a75fe7472faac0981cb08232351641b8248267eed36b5b7b595710b2d4e960d3b0a5b81d985c1cb1e12295316ecaf25b16bea1c29516db416d97340fb34fd41cc20ea6b3acc27093816c1bfbc80ecc7455dc647e55a99ba850b4b907afdef5213f07321e1c9d3853e7a1fef675b9c39f2befa71f5f30ac2dc848f167273699d3efeb300c072ab554d62f0f2b887ec7341c54171373e1c386508ab95c97c7d520bff7df65be6b83633a38115e23b92be577ceeebadd18fe31f3085e0ada978b49495240efa57eb6762f323b1d0d3300600424b84a6070a9ab0fd7faec85bb521e721840ae7e6eb5c06a13c4568874418247727cff0da0af9adae2217a598012234945f851ddab10eff96ccd8be60a98df7cc4be39c4e55d92e1b8e9d5d3709282c26b944fe0698f23f340cf81c3665acfba995da1f448914689a9793c124980d25f5e1aaf5340a4e365731412cd78bd124d0dc46123161e97195ba3377ea56173e4de7a70be02a1e80e83870fe706512a89e05c3472798d113ddef3e4580eaa68069139e69875322aae81aac77340ded1efb4efd8cd887fbc92e4be09c7a942022c8829c356960a0e090b500967a9369b91deb432793bd3a74a0a52410b24062ed0166d401ecb7fc93b803f3bdd75cbdefc686a531fac81c43bc9dbaf6f91dbd578bcd93f5c9bd4cf8b524a706b9a5b0d3b2f5a7b6bf03e526c71cf43790bc3b7eb1e593517bca8d86d2ec25e5b42bc8cbe791bc5a15935ac955eadebf86c220878bdfa73e1944e31ba43df183be7af300ceb6b28e65b83610c17c41d38c1970a9764ace0b55147bc8820014faa8c7e74084f39d1c837bfc034baf74f6362fd59e9787b034bb7ffd64e08177bd595beb5bcc4e9d7ceb9faec4088812427d21f5fadd457729b7502ee77ce44b1d97f05a960f114ceea30305900e269b40f0757fb6b9ef2b9265d1da56dcd3d22ea47883d33fa51ce5105cbb857b2221a523f4bf3367a19dafa27bafcc269a68edb0b7fd8a6b6a0c43d1bb760d17e75f8b4c50a8300a8c4ad6a77711d6ca63bb9c88fbd921a697f2ea685046c1b9699610b2ce55e47ccb64337299705314ce4b3a3baeeb55f16b32de2011c297a92b1f253c18b2c0879597de1a5a717bd79480c7fc92c2737bb412396f1651e92f629fcbf08ac037f8a91388c1d580dcb1720ab50011b37cfb002e77bfb1d132e891f9de504974c8d9fda58ee2821b135b3964f0c918fa18f2a17f732729856215476fae3f3096e0621b8e83da4c1aaca7f2d027cb903caf91e975a30561aa50316514323ba3d465de4aa18ad6b18d6089a2d5ca94282e90e4ed46bfb628655adabbe4c69e3996c5c8b3cdfca53f775be455cb9411f0915663d117aeead5695fafdf37dc5be926f4b3e2192902de5de524a29659232c9097509d008bd03a41a2c18faf6178aa44cf7f65fe7d17ff3cfcfcf4e739cf48eab3161adc6845319a752980ca454c665608cf18d31f38157c2bbede8bf2f34abbfc770d2adf62ba1946f2f0142086f6e64b3621cbb6d16cab1e3add36ec6c8188593a7dca4ed30a5901da3fcbe46c5d4c8a8bc48b33aee3b375723b3ede89789f19ee679620cf5783c33dece42bb0bcd4a7dfb90179a157962ab5d4615a3bde772767e50faf6129ed10a927c0bc198989818ac3dcd64da7a9acb7c525b6a47cbe15257e6837298f9c826876f72945663f2f738a7c6744f907b34d78eda7ab8bf321488c030393b10da204bc73e4cde63eb29ba0e331ed56f9e84d1c435d72a2f59669a7d3a9763ed7a3a97434d421b975f8dc64bb33ea3619a50eedecb1e1cbc06fa2b227f38204c8d0fee77a20644859e1e41aa9eb9329934699e9db63c1529629f29e693e6e29b48687388e9a4b9f88aee9c4e2693c6e1994e1ae7452f4e8668d694329f34cf249a43cd45cf63e46e02d13cc99ddc846af409d42c1b644787f789c030d2ed4b9e3a7f7a080ef11d76d93800f8a1a7038b9a2c3d7c17ea1ffe21e7260f078e6f171e4e7bdc3a6b7356c28aa6e8e8d0435f1d6508d41c51b3583f5cfcabf293f4d7d3ef700a4c2e3ad2ba4092bc8873a4f5627b1294cca104c13140a989c0759307b91ec30d723ddb62789be30de9fadd813880011945f480e4859f9fd68e7f674b50b668c289202846b0376ac10f42284d9af96045533484312251f1cc7e0c993e89c43061ae10ea985f192cb2134d09b744c990cb962ac2a806b350afded5cad10e993a8443cdc127cd1d093d1d68829006d21cb491aae2c84f17daf20472695607a57ca320a10de873a30d89321f0821d560d1aca1834cbd834410a959d084b7a5c8856e35235313ba0e8922cfdd6043225844a195cb82ec6fe58d0031861659a4a1821d84d16a874a9127051468d181065244491284563b446a875cda37099196727488d440b5422650e8e178775301622488d43c2f08415d969a05c1107d032589413f40257806fcd23f0d048160d019df0e9bfc200502c11f2084d04b2ee20291a006b74cc91d44825c2052b3b6bcf972488dd05521f2dc4d360ef486794915067234541d5861c40baca8a28a2545b4bafced83215871650a1a4038028b56f7946f177cbb8e1e270451a19d85ee6e180910591fa30f397cecc18b8ff121fdfcfc28c15c7c67f3dd4d93a20134c9810aaaf4d0849b598c7898f2edb09d66b959c87488a38c2e3d045346196d9ba059353e66fb3c32fdc8cfed6136b65a0b2dacb5d63a67bdd556af715ed5ed56e757f942eac3f19e63dacbe8e6a3c647cd0ff9f3f3d3e726e46f206d66ac31c618638c31c618eb8c31ce39a77c32e2508fd465fbec44f0513e56e653a9367f2addbb6a168df3c8d7b41ff96eaf463c20f179cb353fdaa7cf0d3ff9d0e78f10cc870f5f6e9d7cd3e3b6a2b08fe08c734a2ea88b9870b1493b3449c908351e82608c904a4ae78d2598d4d189a4cbc809348c7868926a3ae5334a81d2b713df4e70f916c22de516b5cc87fc99e1e3772278e9717b8f934f070a89d1370b51b049f27231eccf579107c5a1347be1d8bf1cc26bd2fa4f1a7c1cf6f958047f7dbe8ed164da2e7cfb33cdf438e9290ed08fd8963d9dce74b70e86495f6c13c6aeadcbece3a4e322dff25910b85cc2be1d9aaedd476451766e401548a21564512a9d3296b07323c70e27c0529c08c88676cce4892094ccb003307a309a001230574ac0021e342145956f974b5cf1dd4dcccb07f15a228dab5b7def30c3f7b75bbfbe485144c2437894c5fa4aa86bb70e15bca022498ca1222ecc20410d41441081831145372c9102b9440f056826d2902b57628cd9d363891aeecabbab124ba6f69d66bd1b5c8f6e12fc375ed59d6e1d3d4eb0657cbb5cf94ac5e5e59615d24dba4aecb5aaf1baf8e0ce396beb09e91c597aff689723cc90e14b87d2daf71e191c48c1520f37f0c28226607c510329493c313aaac116444fa906244d7819030647332c81460f4dc288011238dc40071f7a6481c40ca12a4becb0c3cd962c922863073448318612489c100189d1185da008a165b03484922025bc38c1831a6a48eac1194e089106184a524da808a30c18145d01434a1528d0728592123f70319484498b2384904284196491a5072fa2018b09942ce941141c80428410689084172d2d88c175021758b1c40726c8e841940c6c81030a6aa0458c24a034b1d6044eb4347114a506253276a464e185d10f1a32983284840aa224be40d1c549c3c0c80ba020e5408325237e5a8937462be9044742d48046922445785284109ea8420ca517bc2e48d22823076368d12407284788a0d8c20730ac1c3185890f31c6dea294d271ecd8b1634f29bb9790aa5c79a2e3e63a47a79aec23a49c734e09db4e55833127a594cefcf6f150d5179979ceedbd189f2a498ecfa59cd7d4fae99494bad44c4fb3d6413fcb43dde6880369a8c810431ed172cdc528a386a58d37d8a7d6d5fc806f7f7ecd0ff8d203f0dbbf6c477ca901e0df4dcb9654a2548560e90466c80c7ae94366901718617428046eaae6da6695555b4b2989c40059386ef66311969224e69d949b25317fde5f7c97b73c1d5416ac65aded8c23d01612e35693bf6e9daf12e4982f4b3d03a44d75d41c7c5c62bc2c7dfb08451298ad1391171968e6308166d0049a40136802651298ad094404c404d115525451214d558c33c619e31de1460ca3c36d6806f17de784724e891911c4fcf2d34790de6146c4283d9da6dedd9f3c844cbd3309bc567d5c3011a3f470c8d350e4a92e013899f8cecaa2d904f578aefc7044ed3b5be33bfb289419dfe13cf40ee76f379eadbad93072771afaf65394771a3a49f17daaf2edef5d0fbd3b31f1446018d91cca3e1d28675073d02f7f1905ba65bda7b52d06195a75531555331a80812e64f8a0c30dca3862c906b0b082861623d2b8a283fc9eafdef3f79edbf7fc3900055ffc33cae1cbdbf86794c3d1fffc4d8f0e0821842a000902a4b920d707b97b5f3c5ca159d08104691ef8d3fad929a179e009cdb2b9e972ac624e527c72df4dd74155bba6c870f520cc4cd855ad85277b429dec69ab44d9de1409fe7ca75900f0e725342bc6fdb154fe5c478f6669fefc8466a17c28e2507fcfdb6fa65d106298967bfbc9bc202641dcc985b6ccb300bca7856e5403f06b1dd3aa93a0096d6e35210138d68406e0ae09dd3800aea60dc003701371689b3a19be6e30c97e868556ff6536783a347b3a540c002ad17f992ad3545a72d7499ede64311b4cc2c898408220cdf997c6cc27bb91e306ccb21e271cf5ecd1512400d8858b4f19f5743a9d586821e924e9e9743a7139dcb4a7d3e9a4c20a5caeeb3a9dfc74da296167d36097c6a15e339fd4c6834c06be506429de95cd6a662e0c51ba2e93df38aa6630e96219f893c4e4b61fd3faef55dbd2098218de975aaf6beb3ef0267b7126b32ad77aaf1631c65a93619795925239b1df89b1f6ae8661c1d8b314e69593f9e0ed86eb2243afd9dd2e2a72d4b029b04c5dd9608f1a7694e13f231ca67c75011491e3d72da7b9ded17fd39c0a326642d95c6b8c27934f379d4c73dee9315ed55a9bc2a80c7bbe329f5835d97d55bfa9fb288d98d6e1c73ea63c519bc2d7f1ada1b1529ab9f4aad564d86563a53e7d564c7dfa4b1a13232775e82b7a6fbe1d52ea35c638a3c4680d76d908e19c50c22965add40447b8e1da6055e4e89daafd96a057f1bd1ad9f1bdd7c91a5ba78cf1c5bf31c62b4b7e8e92b18bf0d357cd45ea236b665329b1e3cbd6a61373e9984b9774de39a57c1fa7d4b0239be65af530d6e86999fda881f9c31a9b2eb74b4b7eeecf65e633b7d5d3794fbe53c16cc743e3a7173f9b36a5ef513a29ed9ed06484c401ff615972948975769d9148fc5a678c4462f89a1fd7e2da516a44e2533aa9df8941878f653f681e6ef7de5b33f974a084b8638cb5c65a6bcc17625b889ab4f7ea63dc296175c6c78f33d8f9f86074e9f746dcd258149993442fe58d8460e47662899f6f8b81e7f0693526c831f389efbd05e4d74f7b1f610db028dae88d9448ea192c51fa1ec102824c68c2f35a0f46b865f128ad9556fa9e9727df0683fc216f8b68bc93cd5bb79a3f9ce855eb763ee2c06edc3e4237c4e2bed75a8fe7c9b670cbc3afd2e5270a73b3d2bb8a9587fdda74642403295d7cf40c3218e29f910c987ce780a6f2ae9a6b1b22a27f46444ffe00ff8ca4283d97d3ed25348f8d80232161c96e398dc345c97573baad6c9ab35ef27423f03bb85a45df9acb7dcdc2b0264f1ec75fbf327399499b6512e39612e3adcb3221d6e5fbad833fdf5d9f29e0c8b60ef318896e5b8f98c5fcda8ca41c1949e1f2d2719639a65dcf341f381e737bddca6c87755923dd62bf5bd7598779118bb5cefad5840cc1f1d8c6011c8f39b6c180b94e746b9fce651dbad5ded7ae7d0e61277b57397a42a90a08ae910cfd5e5865063430c9fdcf2889292c7809c01459417e47548a8ea814f1ef88cad03fb7ff8ea8f8f0f4df11959f97c0855014613129c1e2e50b2c4bc03cc910db7f58a0f84141194c80b07f463a04c57f588c86d0a187e86e1f4b7a8c4ffd4a8dfb187cb91183a52011a05e81ac648d5f1ede194a74a1410aa0263908e1d45014060a6c30224b1a39d8f69d1b36ab1d49457aada9957a8ee621c1890e202b2481c44b7f32c74b59c6cb4aa74be93b9147fe40d4926e238b64b7a6f3903f63a2e49705913f10c91f885a2f0bd25c926450d46aefe9c8135d1e71b1ebd3a99ece39e7a4dd1055f418c460ca771e8366411ffcb018b5e0a7a55a415645c997bfcc0297ab5c90dd62da6ba9564bb9cb9507f5ba837aa4437e882a6a42d673e4b19b8ec691afd27181b058c820c2419831ac50814e115848c0c3171e8870468b85263b8031841731b614f18131528002a41c301104a6d5328dfb72d59269aab8b121cb306197e4d53fa31204518fc8aa7f4625b8e1bb9dd721cbfc335af26527064d9ecd51ac289246774ad6f34efa94513617636c289f4c8bbbb569eb85e1d664a5d8c5adc5af1a9dd90f11fcf4d6bae943be908b6f364ddd914c6194525fbc28ec951119badd6e381fe4d33fa32837320a11a59766d33856be6773142645318cbd58b32a8c79e8d388dcd957f56673942527689b2dce41d6eed82004c11ba1ed8695a09dc8638794bedbb16a75b3bd6f59498a386f7b10d56edf669e070c25459cf715d36e5c3eb1f0b59fff8c8698b055079cfd673454c44398e33bd0adea8aef6c9e0525081fb1f8185f70f41106407c84c112c7aa37226c2a60ef14c117330484722501df7e339f7e5c740832412c02e1a35f8dd4041137603243174bc8f420480a3039c0520510ad86e23b8722be65b6c81dc7451e7a839316f49d1b91a75bd07b449e37455118413f2de82a441efaf3f3f3e3a4059d8566d995fcf9692131f4f14ab45da461aa142201c47db44866f042065b205185195376be853002438996a223b8b4dab96e2adf7ee30a0dcef8efee6e6eaa90e48e7b38a459dd537ab205e5330123c14b8f5dd8f868c1784970cb165b5899c177394260b878928511424614e1882c5cc0c3b72a8ccce57437af8bef4af8ee720cb1e58d88e081881f14a1e5db39211408ede097720eb7fddd7427a487efbdf85e7c7908f9517f9ac524008d984f6695c9c48cf2708cef70beb3d8d0741271a0df303256c5b1a287233ad6c543ec0a4c8a87b17bce96c0abdea1fee9406f6d36a9946e361721f7bb7f5b901dfa1c8a3c4380c092b4f4031d7e40460b1e800b26a6a411c50e9a30d1823e9dcc272724dac57d37903ab459c345c85d6d48fd69d962bf19817c944a3804bf50dd54f26de491ad4cb573c3b9fa7040efc883fb6e665e906f121402e915c5b66180432863467e3d27ac4abfc2cd69187569e12408a577c6cbf2b8bc2e35be7b4a4bf88ace809ae9d2fd73732a29398e20f383dc612c870cff798698367c8e9dc773ec47febafa315bf342d97693f380648e7df1232f20819110405878a0c3130d680248072dae8082072f99d6a37df19df61bedceddc6bab8efa6064bd32151b3626c4db7d8f542b3ba8754f3633a1043b0fa899f7e31cc5ab9b2198874a11490d4c6459ce937e2bcf14062eab2d865ed55032716bb80e802afebba50292da382b2f58ef1eb5762d86218635424618b0dc1646218c5b0c530c6b4d468c1116c4dc716fba2856631e0a7df8a61188602e6353be49bbc06fb91c7df427313080ed5004939e63b8f0121bbb0b1d05caa4bee1e129020290d0269d08a93fc42e4c9f922892674c842881e58d19a0e82c8d3630a183182b081141e6c684d6761ba0ba72029cf5b0c354fb452fe3278c50b15452d940bc5f80acdb27efd5a913444168ab1a2295c686e3a86f9ea2863186ba1b989b1c768390c988736340e5012f6797d8361fe7558835ddb90e6a6b3d02ccca7056a22030992512052409e1cb5c520d3c41445ad93a7b4ec2f8c25274c1ae5272de537d2c049104848f805181fd4e535166beee2796004c120264e9a673a7cd22c24a6c32128a568bac52e16a6b730dd8521d7755dd876427333a55d5591ea890c816e84afafadc70914909e1d66148841509eb718f09416ca611624e5a72d060654b152d44aa5b493a3b4ecf24579794ff7e8d1ac0bdb2ead95b5d7aa1028e95feb39440ac00feebb407e514481c40be05f1457a6bc8d4d9cd80759c8e570bb696e1372dd2145fe7248e5dfadb3439c52086d742378e80fdae84400c37b3add9187ddf5d6a1d7adbbe0e972094dc07e39852664bfdc3e1c995f7edd9410b2f4761674f903fc336201d1a390f2ebd755cd35143d319571ea9a9c8566056f68e90d2da17c5c9871aeaa15b59fbab05aadb5f5c2d66b4ed66b4cd66b327bebfdebba0caa5ecd69bdb606cef1da5be593c96afce530ab51b9c06c472f397aee9f91122b7f65b0b5f5ba9756834dd9755df5fac96af161c6e3a1f1b5a2b4fe7bba7ef2180dbeaa59325b77e4651cba29f391397971279e317e253e69d76fbdfc450badb510de9c2e97d154cda97cdc53ede9180da230cc7c2af45456b72b8a0cfd62d7c668ef61f5d71cb6aa1db2f5ea9808fc930ba91b3783e90a320daeb2c8663e15fa9d7242db5233754788a854524821a5100ec0f416cbae3d4d51510e331e0fe801d2e3dec38c87fc930d41d80699c28e4fa60ce597a352a8d3e9ba289cc2e598635986717672abf178dae540e8f5bf57837fd2605073441e474f1afc179a95f9522cf2705c97529869dfe46f783a4b3b3c750ae5a9dfad5b11f114ae00daf074e896dcc1a1a7521e0ef8343365287ca94051b423c4cdd143b32a4b1c74e898f1eed5e0e3dbe2e3abe2a3ef783c3d22ce3361e5d15b8f75e170c0479e8f363e1600d59dde8588d3265c8fde0fc7c9b71c3ac0e4e8d1d123f2c0271127f2c0a399ad5b6599adcbaa231bb37536a7b62eafdcb9ef9ed253baf1dd53b2d36a53ca677d6a3e276d04bf5a8d068a381d79fa49c4e956ab9c819e589b333c8247f0081ef5137814b1ca673f893c00f0953bb7d3f5931b4f9e7c0c8a38ed34de598c3d22451e006cbd64b3bd889323524e79d4e215cf46fba5c52c80da5fb75a3910d0f65e1c8a11e9e98c912352f41bbfb4b8a527c7edbfb8da95cd6a623b25ec642b879f653f687eb5e1accb783a30f3e9329e4efb8d19e79653e372a677dcb4560b3239cdd65993c96562105469110b68a33d468b5b9e8e168f6befa5542fa17a296f4b52c3e21511a995bebd95ba0cd50ca6487c2771a851c3625b639a7e329d6a6ab5895d7cbb292275f5bb88d4451de4d021836a7401580093b4ea32da1865cc62a54d69adb5d61aa7afa2e7342bc7e6f19f3cee449c213966703b536edd8acef97cb00369d792219cc2dd348735eb527b270d16c1c8039bacf22f612f64a240b74c1b24c2ac804d40ae1d36593de6736b22b1d630c8c4d3694804570f479cdaf5f31d0ce3db61a694ce79b1cb524a695b1999aa55caec5e3c7d6694562a299555de182ca594b68354be7d5689a194104a29218412425ac3822bae90d1677b3767f4e972b3de739374c6289f742963ab5e4a3ae7bb9169588fd1afe994b66dce7abc20078356047ebbb5d6e6a04e53d07e6ed9ba7f5dadacadb5569aafb5d67a67531062a79d73ce2dd3ce3ecd91834edb995220e4ebbaacb538e2bfd9335cd6dac8b3b2bf42634584dc395ed934cb621bbdacc5c6e8828a175468b082f4a60244a5c9fb537fd6dbe1c3818da0ebc7fcc2deba1b188ac0af9756639cd1a79058c277af8c9f4e5db376f55d47c2c79377341f4fde9d3e7a7c2cea317bd71fb347af2f6edd755d3eaf123c7a6f325f742514e19f3d0f47f4e92e68e0e1903e536ebad1ac9ad4f683fb94a7b69ce63247f9f41c994f4769b6b9cc336b5f47028eb69f85017ec6f2b32ddf4d3617bd93deb27b0a69975dbb947287dc734eef99bdbd085f34b5ad01848c496cab32fe9b3d03a4f8459e9ec6993e5768ac8890316c96f5ead3afad1a81df6dcab47c91f209a2c76490df7736cfe889a1efe4ef3011f4d4dbb356a324bfcc0723c92ae8104b22773bcf880927d4bbe751d3fa9fdbdc6428c0a75b4e969befcd9b731b7f456fa49f0804f3120623f6a717a1df4fa3c3a73f1cf07323f2c28479b9e130ef74aaa96adc3094d4bd2e0f529512b9dbf979e3cd35abeaa0c50c66f86783ef4af8e95952eefc7d6245cda25b8d8fe9596652c35ce24bb3cdcd48bd266e3bfa238f0190a6dfd0d1acb7820d4a3fe1d00d4abecbf1d3862fdf3d2e3f9322a4f306273f29a5cea39f6628d01b9c7c0acfb5a68e6db639e8ef39e8b0066e73ce39bd4692fc8ca65879eab37ab55d11fa94fe5c6064673e92ca93ef1cf0ed3367b95ad527e510b2943562635b7227e95b55792fb5b4d62abb2b959b7c5e2c7df4dbd7e9135cbefdfa9db4ca8cc7e4afb3b12fe39c6649acff476bddcec79d1c3d82b030040449827e7822a5284b9766751228b7663f30efaddb9e7a86a96e9673751e199118268c8d8e5eefecc7089e627e7f60f4e8db769433aba4c53f603b85dcd6d9d01821e4ee2667e3fa0925f9207c9a736d44604e029e4e84b1a553ad849da7b31ac20d97d3aca5cb05b771e407dc8626f4ed26be78ebfd0f006fc614bda3557a27715c97528726f4fbd88108da20e105f9069a40dd72eded2b12aa069f8d76a9c567a3b7aefa7b36acbf67a36b9f2fc46a37cdc52da7264bee0d06ffea93c86b1eddf60f031118e6613042df3ae0ed069fcef4aa35048ebc07565f64f5288721de71d35c2b3f23269cf4edaa4b2172ed2dc7e6812ddae549ea77663e34767bc3872f520a29d177a7ef6c077c0d04ed1fca00df3cf6faeadd34c100d046578c8bdcbd2dff92b63c2417ae7c1b4d5182100864ed40aebd1d729d02bedddaef10600068828d67a3fd55b15a7d870088d3e5ef1090806fef721e014fa7b12db20b1d02be5968418b1c1d663bb8efe63e0cafab85d66e4c88f5cbabd64114ac5ffea8096718bb4c2693a9566cb3cbab76f97dcd8ad6de6bc2267cf9a89ac9afd5fa61e6e3374af9d2ce7cea15a52cde571eaf078fb9d56a76f4df77eb756a1d3eb55796c2f5c94cff8c7498f256ebecca5c7baa575a20e5a3e9df951610f1a6b71bd71cf57e9463b9666aed954dd884f3e9fae5113bfc88edf5eb31d86afdd65a7aadf5abb2f5f6a3b4cea143ec18aeb59ab0099ffcf2133627deded3c1b6939f4ed06d8751f9f29d0df8bad66ac2260cdfb5538345c412cb224b97f1feec64997f00f8f62ef5cf0730c23f7f5df7cfe3a79395c07247e8d45c4393941242092194b27b85355f3d9d257275b8e115cca0cc289d14bb6c9d544ecf7ce293186baa5aab5f174c01c7ce772a20e4f71dfeae3cb0d52648a9bc525eb64e896117c3268494425a297c1ae5004cdd07b64e1a81a3b516c93e19a35d72dfcdeac51bf1bd51bbb4681cde6eae0e4bffde663383f0a233a317be329fe817ebec42bf5ac431c7170dafcb73e26427f2d44d47e344e7a2c27bd00ab481cb12180814a463a7c7b332f3820a3c9de83828778fcbc7f8b850e1498f5e8187e355a51c397a9ccc19eebb91abf73d27a8d0428c31d2cee1babb1f0785aaf7b4ed6c66adfc895d1e11b274d5034262ac7a3739397f420f4c49966244bfdee57cf4fb8e78621190155c28f2f3d15f7cf21dc672f4dd4bc2d224c6296f448f36f8f8bedc883dc8c8efa837a1eab96eaf713c0605215faa563a9aeb0182e6e49cd46da473ce399d880c366fa3f46b03d29cf4e79816a439e9980f727c5fb718b6223cb0256b04e50efeb0749c0091689e6ec9d79233c889061f26016a960d4c6093b9611d2750ef9e951ecd49a7db099d4db36c2410a411491f129066bdd0ac194485155a706148b3e6092734579dfad44ed041467edfe9681ed9923a9a4567ed9f6164b5a9736e45e0cb04913b7fe9cda29475c3e594d0acf7966e58e689dcd92fc2a2b82b409771262fe328bf8d3be371f2f6be4f461eafe8535b273fe517a5c97826ca3c2d74af4b8c7743548ff2e72da8b6ce569fd90fe8322e331f312eb375288f49794d2d91ab9b7a1aa334f83a9a85725c2fd6fcafe61fe39ded72cabbd5a3fc3d9477e683aa39b5bdc7d3f370aa675cab0cf1d0b39457797b923f792e3ae34f9e3d3f8cda71fa985491fe18af325b37e4651ca5752ad4269b43a53a943f97d184a0b621aacf7ebd9f311aca7b226ac7c9dbe695733b5f6f7c759326a43d7ba675ed59765326cad5a357af980f7276c8035b15f5e3e4d98bba7c8c937043ae2ea43dc6bb7695c75addc6f85b5b6b4a663e2994e62fe3172583d250fe501a093b64146ab3cd45993d66d2b356e3237bcc8d794f474646eb509e794aeb50ae7298ed40798cf7449516a3d5f848f9c953db6b4ef5a69e98b5d3c3340e5cdb10d5c33641af2798d970df8d10a1e9d885987c4e3799e2c973660af327bf363e8ddd1f21a679dc3aebf3c8d0bf6c070cf3f65ed789c86b3352e38948ef8010eb2617623d5e79a553bfd6ad5fbb11b9a4a762542819999ed8d3325aa7d23a201f3d26a57523f8e828adebf968f2774df1fa080220224fbfd7bbe9d7e7b5312479698469cd3812a0da5272a435b3bdad8b9148841d8ff744ea4f8fda8b3b30667dc891a18f442eef40f0466a7ce65db4712372794767dcc619ba11c936211a665c890c4a8e380d0d0dcde5ef25a01bc1539ff1970159794fcfd0ccccccccccccccccccccccccacb6f71230b3e588035d06c8d3191a1a1a1a1a1a1a9a150d0d0d0d0d0d0dcd6a53b2d1b80c339b92f770e2cccccccccccccc0ccd16e986f97b0cfd618edfbe21f58dc4230210225f0ec37c97f96034851a264c98213cf5ce7c5c5b678566bc3321191e520b4a8d8f975fc58994876eb70091c54806ba23cf81fad487e963fffcfcfcd4fca01e9d6e2818815fb721f5e96624fedc6407a14c6f4b573ace579747861e3e1cd29d48f40e040f9f1093db8dc80bf342d93b6d9323605ef2f34704bed436ecefe57470831888b4afda3622d463fbd4ba6c3379673e4096c016ca5140541b1295c770a4a5f24bb31d4460989797d79cdc9b933c6a4e273f49e9971022d13b931b892f140295bfb740541b92233f2d2431c810068a30cc10021a4508d352b992232dd5a624c651a68d4874e9981e19fa1aebd1b1cd6becf683fbea5548e5319a0cf0a7c84910501212ccd042f2c2b4f20654a3a5da6850b91219941c71140a85ba4860981694e92a2d0f5da5299141078a1c18310333ae10824b0be54784b82001115ce0c3113360d152a9542a28727b4f47b5c97cc9edd073e4a181a6a524061a685a4a6450a15028140a8542c5a05028140a85f225375aa84d8908a4a0c2831337e0c10a865a319e72253228f980521524bcac208a2282d042b90caa4d49f624499200dd68a91c886ba93c09d0aaa57220db527992244b6c0bc9e9cbcfcfaa85a482f9f969a93cc912ae8524a6f1d352f9921b2dd5a604e53136dce04a920f55c4b0d26a8f59e5c6b13c50c9e2043760a20b1a5a0d8f0c91a48a244264018303a496a963600067c85fbec3d8080aa57fde0e9d6498c215348ea0c881cd92039b050a2911d00185110f07c7424174d3bd06acbcc3ffdccef8f3cc43f3606bb1da7b26cf341d4af97af78a642cb618fea5fdb7d6f8e49c2b9b559661ac66399e0ecc7c723c1dea60e0a6d7c6a9ddbbdd688e7a7d309a846ad4d87a220e6d1aed84c6a1bedaf2d4312b72918e86a6ad4b8e87e3bd2644ffde6af5deeb423357bbb2c4c653502c973699e16fc65553b9d54e3ea3258192657afa562c2f139af19ece2c4ac7a3fc5e7846832d952634e32ba7d1922cf1d66a03f2d6ccd623e250938cd6a3b9d3d6d31cd5d1e5ca63fccb7c4e3276a70414ae1a7694e33f2b57befc45fdb37225075ffdc6f070c60bcd38ccb87cf598fdb372850ad8dd6f9aba0efcdd7a34477b74a41c3a7671399ccc55a94c26198cf98d63bfd70c5e69af45f3315af7905aa98aadf6bed65af3bdd90f9a1ba70c8a26dfbd305e52eeadcbabf64222f8baae2b730c6b98c52e2dd8a7fa553737994c12c74c5ecee37dc51863184c9e798633b71ace827a124ba6c137dd3447df636cc2a60cdf7b618c2db610638c5736580631c7b21d98872f7e667843e1906fb21d96478dbf7e5138d3e0636cebd535fb51e32f66addb77c1eb82d062590a7ea3844dda7b1c25e9efbf2b51b6dc9b8ba1e9dda4bd3f653c6a643f6abcdd220a4b61198cbdbfaeeb9a99a961a100aa01c47b27994ff8743ad59bbcf9093b69355f183e9dbc9eb4ea399f72356113ae399f340c4bce19d75cde5cbb11e3c4e4879cbd66b702e58cce76e880b2744dd92dc5624cd884537e792a2695651bc658963d4bddcc94313e9d7c4e19b3f65e0c3b51a11876d94ae95cadea7bd4d297dfab5a0dbe97adf56535cbb61a1fb4bad5ea9cf6523537ad636beb755d5e1dd36a72862fc52eeb26b76eb193ad177694df3f2b4b867e352b8655cde42637994c97a517be7e69d8c596cad17724fcbc2ea7588d7dd55aec7a7739e64fabc9f0a55e73d1f7ecb3d65a8b59fb306ca3b6d2e92f525853436cf8e02545ee6c6034f3791f3521ecaf663ef0a3865dc99d0d5f3d1c77c237a349e8c6d6dd2cf4cedaf976aeae5c8a1e0e884d19ee8723f32e5e1e2011879a607ab5d68a495386596bed551dd3e09ffcd27cac631a8ff7b65a6bb52bcbd5f864cae2b418be6496021c5a7579eb698c8bbc80dcb5141b866856d7529a887a3f691ed8a2de3f506f276d0364c113408eba4983373c88c3d3a19ed26010e4a8c3a5ecab9cb3dfad87f0fea19d6891614dbd1079e0d00ba12aa894ccf784452b99aa1909000000e314000018100c8844229150302ad8c5e60314800d8fa6466e3c1809f32487611c641031c610420820004440606666661d002f70d35175da46bdef9979f19df598ee49717fc8ccb99653c21d6ea3a49d1b3625ad260de216826de05a689a234fd595d222ddac64f431620257f0996e917b5893dccf2c566add5bc1a78508e16621143ebbae873b95faeeb0d5f524e1379a2eb32d5de606acc180c970ddb54c9e9710fc1450729a58c766291499b09f7768f86e9bdf26bd19a2820932da469c454ae02312912093a4c892dd325f798442e149924ed9e1d519af51fc793f558fd9ae00a0f1121e41d54ad5ecb628ee247445c1aaf11be596e7f30cce2ae825cf6abddc3e497e0f3cd95f432274883046249beb25fc33dafe32d7e2efe2828e4c69b34aac50f67dac490f2ccbba4e3d37fc8e2d684a1320b6426bbf001b4330e489a64f2c1a765ae4f014eabe7e120af8b023eb92039d1b41a83aadd004cc50b8356857c7be30aa1baa935fa2b669dee5d40ad88612d19494532ebadde48d44190146da3f9a39470a0e8348b6da64e80487df69a5ec2db4618d94a743c6884cba9d22f5fa75b0d171347dc94a794f3c59008921df550e26da4a9cb2b57913bc82b406d6a619c3b72ad90d6c10f83da8f71b071d5495fbc4b92d18f66f38e430149efe42ae9aa9e00f1c29926c1e24283f8e912f26e35874a42c9ee51ac3014b43de9c362c7e8fb60951a8ecd92396ae49211bfbd3b3560a13dadad95d4889e1fff9cb2997f8038d48a9cf4a490a56865680d445063f160138de5dd75945e65735fecc171c3c79e99e400c0f0e5d68292546632629d946a849313549af6179ca2803eb79346fb95d8fd91db9bdf961d0347a79be20b26f5e2237eb7d2bf5790959fba890d2ebab10643cdea4bfbea3cc74657c93dec373515c0b1db8cf3d563d6e285b9d80772dc631bbb8158f49ee131ebaf6bb0eccc6ae63d8440fcfd1731a4c15f48f410183ca3f96c4af646d137deb4820b70b917d9fe779921aba25d5d20447dd1f1f19dc6c91ce3d9f56907eff3482d939ac82dd615b735732c7fb595f97a5e34f8f5a741c180e33eb59645f4ec31a77a2e23b60f14520c4de39c5dd1b66a054a52a4cc9ae3802bdc7382ab9d6a328fbe3bc74ee1e0bee2ac0bdce212c77de2575a7ad1ba44798416a63cad5ec5d68ac67f3cdd89d061de988b2fd51cffd6b4913888729578412584d0bad655bbda08cb6581618f92dcc426cabd88a0820f94f42ed7e41b9c93d39d7b353003cb343147d31a9109026d3f188a28533a5dbf385a46dcaf338e24d966fb662acf51f084b501f3ae7724b9105c3eaa6d395b43fc6e19e6b96aa9423d1a183c0e1818fea56fe85e9ce5f789084153d6992c679dfd442c13ad9ea593eb99fb7f86c9f1e31d26957ba44de628a45a31daf3a404f74fc2c6fa7d81e50f9201d851ccfb5e97555aeab9c9f26544e95070c41f32908a37dfbacec99156c0731acd9160906032fc60c2a91d1a7f043ffe92ea43c478b9849912b468abcd6f97abd60c9db48bf815ba66103c43dd815f266a1a223c05db74965b09bedfe3968473a94708b7ae4b00dfb038751808715b435f4e3ebf0730b1ad3f6c754e35a301ea92bd004f1b888318ff6340c38f02ea221e7cee4bf5a0cd690bf45c73d7d12030a18608fc4472ab31254ddf9123436e2cc84a4666837d3bce1f55c1a2c102b030b7e5190a738b3ee884d9d86429e7e71f93295784688983380054f370f2d0d39bff53d068324db7164244e71c0bc43b97fa4dd3c62d50f35ce1c71697822c88c87d848b90d39260b51b3a4e6f00fab1a9f461a731edffb46a8c2fb0ddb3a33dee45b25a63890e9a13939f6b70c8e88f49b1dbd020dbc852626861545e581ac02e4542356fdb51baac10473eca8f3459ada679fba0f653b9a86902149a03a063007650cfe54c5e0e2d4a9f2c5b6bb2a196bf96b294a8ee67dcccc50f7b9075fd1c6e3d39884183f1f08681c34ee19c13c6944c986775c4938692a2364f02025e74f8ef7fe82c839950a07445542711fdfc82d42a7aab84da5f8504f55c02b0cfc4bdc8937504b62857470678abe29a934bfbd0ea9867cadd021528502c2cb3cd8dc08552fef7d63997db0d2cbd5db30c888cc9c5bb74007ab5b4d3832d8f72a5b9426c643ecb3bd0fad0811e79bd051fb79f8fd81900c3adbcc5c6dfa796d9b892cc0f37f2d0d40422b1caff4119757f44fe7955b7a41e3eda6f6091ebe7af80945a7451c1bc15ea19b545f7950cd3eb86f1d6dc36d65f4c622332ddde7cb26b5fa3ea3968a78b46fae9bd2bea9bc7bf3ddf4039e5b3cf247bcf0bbf14d378fc6143df0403ed1a57ce34ff569c7dc3de12be4d0ac7b77f7523cd610d820c7b439f130494d91fc917105df1e255addc2777a56345733cc6d7126c3df9c30984e0f60270de71efeb2c99d2479c973f54d6502ffae556608d9807230e42c1a4bf33bb9c5644b5009fe50cc6e84191d54c04743a84790b9d215021d10d396d48d7a0d64a2ae76a3b61ef03ae51b9cc8e2ff40a02a6097ddd50a822a1461809af7c3c3ac550e1ef095ac784b8b9f19e21b4e77860c11e38a50cc1658eaa75066aee4abfd3ccd9031cbe827f90f4ce88501f50b20d907226aff7f14d41f8096d077d869c4b42c93f7e63d8c64ee9c558b2d551e3b21fe11ca0f0762629756116439ffa39880a640aaab06288b0c80428e2bdcc6546802e2e772531808c1d1f25d9c02cd17bfced01546223cf4bb093e90988c405e92f4c6efbecb84ebe2375ebe35e0bd2443d6d962ca7964bbb6954d9a6c67b442e4a32e82e745488068a615e6d462bd4713b720eee49608f4685ed992e1f17a136ae17e98dc7081501709cc79463a83f347a4cb4b548d03263d5044d3a3c3f0da12fc888aff168b69f5965af3764c07a0b1e096c441525639582bf88d22cd2d87f25dec9269fcb719328ea2884ac80c873aae3c8e3eeba6ea35834992bfa2a277ca933f57606fb36db7bdcfcbc4341e54609d785b22205916c9a649f82b85f2de4e34b412867226342fe8fb54b4cce8ce8edfd4af70a9ab0994f1a7e51522f3868326312839ac98437fad88e11525b97be6635dac31a3084c9c73c8dd25b149d59a7ba78f8ec05b6313948f42dfb0bbb09ba09a45447e86ff8c842252a52907a36d27151f1dbdce773b4392aa9c45ec9d94b431c89c98d200ed680d96915efa7daddd221c60d801f420b4c25ee4fc8e79753f3858826097436df308160b3f58ae8b89d2a2af396603227b5761c1ee1f7acb7e8e2335b738913f134bb3b19102d74bfb6dd2d164036459dac3f98b49ede60a59eb6aee753aecff3c6ed2e194b2431718b63074b072f3be777c6fa5d1482952f2674e8bb80e5540ce32fe570386fe6e9d2b4e838905179137d6fdfe8b77d21a625009725efcc5ba3af5e9c5476f17d79c89ad62f02471d0409f82c334f3453c63cdad6b3558fa542bc35fbc1e72b2c3ccc1124e93e69fa65bb78f7b18fc0e9bf3a56c69f15577f26c22ea1611114d3a9913123c0a112c6680b9192bef5c2d48d9a5de3aa98ccad05db127d5c4700bc1c644523b25554e28cede053066bfdfcf6c960206e25f580d91f96208ec2cbce484826a0c9fcfc772ad38f3038ccf4a08bd4b421d50264feb7ee291baa0d529abcb44202adf5c8b77cd43b0cc94200e92bf468ccf3ef4e5a23185a4dcb57520e6f9b8be5f1657476bba77fa16ad280278f70a629352a1e149843108d9be7b1a4b0eac0ec18dc798ac4baf656b9095d684d07b366e4cfa1f595fffd514cac8e65c6e7ea05e3b453292cb5b12e45ce5296742da0e05410c39e6851dbfb45c4771830517e2244b01f02614e6f6502742c66f9434de8d0348929085b4ad2d86184acddf23211c856634504072c4681b1a3b10224b7cfb23e332ade42f2d2449d084cb46675f4fce503a7f998e5db10a647fd9767224258021a56246dfcfd8448981924c1323518034746ade6122121ab4ffc83d5b42af955d0041bd4c5912448db02686c6ac4e87b8c59d78c15f562d486612d71e25df0c98383eb8d0a3c91a53f5a5569dd61e1672bc66150708f7c1d9aa69d626e2fa006d67ac5cfa07c4ce11880af0683d399d41c5fcb9d3f89ad04894573e5cb637cd2fe118eb522e67c47e26755ff3c6e463e75df6f02a0ec4738a54d5ac692cab51f0bf3f221fb10c5163176b24e725dfa3d1b7186ea5248d4a53525faa394cddc250ee4ece36a14b7e9e481c951a8e72d77a0063e256716e8bf608b951280a120fe2ff782dbeda9a29245242ff09635e686d6afa64d2cbb2ce12cc41b0954b001db316bf958d6ef95a5c0aaeae298121a07314b75ae927e74fdba8c9882191d5c2219d7641b379744c81993b338e6464995112982e104198df894962ca4b44e4d860c8206554a8521d3ece6f7d0e95a88504a406a97cb8568b142e970ba370035397ac7bff4b7ac555fb74d91eeea0b491e0dab7ef03d2c6b8e46bf03192d97869285b17f27740779af875f3a191dfb03deae811e8b3aee745c1f2e76f9a0e0a83f654d6f0197b88b849132d4576c5caf1276bffa814961e5c5c164420b5073b1529b72c218a2945c6f4977a6daec24fbaf29aba33fd5427a2262b6ad1f8da6105b9234901e2e61861cc2dd33234fffc1cdbb700a32d72d23755acb33e0355c580c9d54df5496287ae5ea6da71b8148fb982f62b57b3e94118cefb9d9dd08cafa70160ebbf64687c688815a11311f696a311e2f8c43b6d4484f51d1b47fcac4e895bb64ef18afcf640949b6755f8b3a0c6feb10ef2d9d50d7ac83a74fab7b5c260007067e78d627abc2327bffbb79e6b6ac8cf6ee2265a3cc53d1c2009556bb69bb439aefda96b3c119678cc8f975467762ad4a05b169a7ab8417d7e05ff28ca04b6e56fba6c8bf8f05272bdd8653903793c3535796436904e515bcc9b2ce14887f8d595adb8145cee75519068b226cfc2b6c8b87a41c182461db679b7140234eac033b966e8d7854e6ef98fc3f9cdeb5c1f48de357987bd7445938724bba54cdee9c88d81a6af723411d47c6ff24b50107b623d6b17acc9d32b25bad1e4994eed2554858d8aca5cf4d67a535372159d584d9ecc4db9f672f48b0a6cd204046d3f479837390cb58c906db84b28a2a0f72bd59143138232b8668c2160ad90b88c429958acd0435193033a4ace2b00a6c9db32c4be7108fa5ca8cf5b6887cb977cf0a0e068f2a41705bacd41d52bd7e4fd47d2780ee6da9e537ecfa2a0bbba1c8bd09bc3294a15f6339407fd91fcb0e68b3a724ddea06ca60c5b0093dc50b55eb4c5a490549317ca5284f61cd93a741958ab9c51a1ca0e671d1f598c3e2a1b094148bbf6a9826f70c95c5881f668de8f76bba199030bb0b57a14e21ed20c0e64ef7b9fdf737f600ed51d11d658d529221db7e8c3e24a14a42292f7c42c57bd9f1e119e11182fd0470ad04b8abb779837faffe19355117a29f91903dd1121653d7790a3602e78ea396a60046d61979216fabe6d1be7d98772ad7c910b603632b9b9136a02eeea49874b754c7710fd41ded4da5a366df200b3caceddad940ac00343aed539db7244403b46424c9eaeace0ae279bc279a76ad10a926621d47844289c4241e0d242c8d2dbd5be4784567e846611c0f40f07dacb88d0559f6d034a89fa8870f252495ad0cb8bbfded7dd6a7beebe08b57b85b38a06b214fb5057599a95f10deee685bfbadb88b86b187b4375772c9bbea16e1d59e8c637426361599d6e333f3d1a6ef8d8e5644860b82006c5d5b6be397c7123a7ea887036f84eb3162129b72cb22e67748ebf7b4698602953d8d8035da4d0a56222bc46c2b1a520fe2eb4006c37400207805ff5cb0f57b8dedfb22341386fc92874f3253abbb796f5a57b9a8c08c836b2dc79038bd417417381ebb94827473845afcfc1ead0808682a4db0ab894d838e87df84ad9b686fe78d433ee44e8ccb72e1b4a962bdfe4eef22907dfb3fa8668e0c0b9fa6d5f345eb24715bafc9b34eda67da8d4d0f34658385e93e078a999738f0c4027c4163b95d942a3625745ce95b837ccc86840756f8dec75043fdae19ab210d02217d4a97a55422a15a46ca6617dc795d71fac371969505b12d5d8ab3b294aea82bc50a63146548efdd6ec3b5e490f5f8f25ee39fea29132b8017b29d4397041305a789fe393ab610871c0bc0004def9cf22c04aaeefca079019855b8e96e702c8934bb0419d49ec9502e57342289799581729ad70b4557010ec0dd936da090616ba71cf2a88a25be5e5358d7cf5cdc2976ebe7bbc9d8f15409375d8c721c2cf664d4ab2c33d7573b26048ced73a721b8ec5377d5caf2be3cc9a6e87362efb375cf570e704c87a84baefd17d1a2bb9bb142e2b4b611b73639cf1be3b4f737b3774f5819633284b659bee072d73c87346b50b7fe532fd0691dc051f8b53dd196de6aee71fab3441158b2a169c41df3e83c60ef0d82919697513a734359c295bba2528459af43a6802b898d02f2782755c0adcae3d6a412ba0096442d33572da1624661cc60018b5021a73e7940ca6aa7a070636ee1a4c259edffe73007c9d891ee60cdaeadeae15d2b80ade36db86a10a967e274976505554c8659700ccdedc92bdcc8c63b6ddd5370d405597d49acb4447ce1c2ebb5fed07c987fa6b982ced9c71a5ad16360dc30ddb891700dc7e0656a34f2e4a105fb6dc7530cf8e07a51af55d1e4a69e1dd81f481eaae9b111b19ba3acdda28702ec0f694e386d637d547612bd277cdce56f4bb434b9d43192f524b0e1ff17e631ec334e467ad86c61e08898093e841285fd2828547e539ed73df41f922791427b962d405c05f3376b875575c75884cfa74adbae758c1ccfecb0810fc648cb7c64e33a4bb6b6c50d7bc3ca2fee051567ba42319a39e57bfee16369147ee3b86789012297dad7cdc3a05f23c26eb4b877738b5221b8557bbafa0813d7264602ef3227fb303ddcabca8d7e9b77084c6640f2d72ee41553132f429c5c92520506eba876c9b7cee53d9385b7c7e6b4865e00e8baa676e443a491dcee64cda3a90890194a9d5c0d4cf90b694461a5c829fb438f3427e562a6c6b5f5c12424f62409be2867b449afe3f48d60b352fe552b3bfc5dfadfff0930eb81390df2f94e31d509cb9d1a142edd39cf21faedfd69c2b3d086e1f8d0fa6741b61697ad8489992335c36d2e0230b7a4626998cd5697db8b8235c6397222dcd3ea6db3ae02828036b9ab56bcf4afba4d99f8b04a1b3a401d5f1a64a8de8ea71bf521d0e65011e469b6e02076c13d19b26b121a78f02bf63c7cebf41890c875be8670ff01be305a90588bfa650d95e34bfa134c1d866e8b4d94797aabccf6afb331540e9b3063063e02425dcbcc563fc53ce19023ca16996543d880540f3b69c964900fb6172d8080e01bac649ed22841779ba70dd1e7a5fecdd66abdcd212a1ad372c6bd3c0570098b993181a96eccb2fd77f63f0a07eb7c5b754beaad73811869eb144375f12b1d3445bb25a564bb1afeb446ed447963f9b131eb0dd11a65b5e2865e8c5d0e64ee9cbccba60bfbf62e34d5edb05b40fdf4ba9f619adb7bcd59692857c92848fd0cb1ca2e784bae08b1b1df3b20a587655286a721a0661fa306f142a2c2ba57f76a19c0752a3716f4c3fc8c1d30468eefb678702008cd33f31d30166393ebf66075818a31787e914d75fe6dd5bdcc1888e221b8f4088d08b0658119c8d6c47783adc982f3b880da40c5729224dab0573e330ac1472fd35651307c35f13bc1780ad892770916135d18d5ba36e0edf416d7afd88514c24fb8cac5bdd09aa8ec347804e0e96364bd04d040bc4a4c702f01c65ef9d5ff7e76dd60d927a753ae261e5e1286f1d60608b89738f3656e2a0f32d005bacbe39690e386ee55a47f7b88848bd24331deecf11cc925c14d213acad469a6d07435bd39037f07e1cf709d8a26172a72c0ff104efe1186d0f3e28c62d94ed711f773dd146fdb1e1ca5f7cdcdde355b056eced71ca6676f3ef2649255f49c41c2a30a365aa15ef3f85824bdfc6f76594f1a76c896bd6da7d65411c5d6072fae36dfbe9b29013603b285c7b97670c4d4d8f0f75d44a629d09c50b852bc06a04815f52ced60264ee9834c94a4ac97673bbdff96858f5e79c4a276268659ddc387c7e1db1ed5cbd64f04b5a257467c2c1ac58797941cfbf32df6843c3e7fe5f3b0292140401af9594149e7ba52f15c54dc16fb346f4262ee8361464a170a30b139c3c6180490259b7cd66a31a13a1b36ca9dc397afa6738b807b82e4008fcf7a03a1adb6ac136b91f7bd0a5d2238c529fe5b4da1d521dd02daf6e0d94b968c865c57a982a56c4bad75a1c6e71ea205424f6e7a5499b51e038c0c101ddd48d084f58a85fccbde278a3c010ff742fb97d7be8e0120116a4f81efc6d542ab7a3bdff9afb0aec8d96ec482e5fa5b33d3c8e7f8ce66eb50bf3037dd974bb003903c747b8772f4a38de8cdf6417db5e9ac985e3570ff07bc150ef6db755e99fef33f4fa3a65726ff3ad86e4fbe043e24c6894d482c43ed8f25aa19a4f2c52612134fbada5ac33e386f8a401dfe4c9eb06a7a53c57abae763077a3935a3dfbb73d067eec5ed1579c4c519299509f503a098dc3adbc148b73874f9ef89dc11a0e08cf2f44ee5813029fdeb18c72b2033d9e0576f70cb76a9a934a1e46c6146cca2eb4d75a5bd1ba5f056e75d2363a6abfcdca2324e135f8a9fd676532a75c8696897c16e512124c21bdb1f6a545e1272a458adf2317ea784dcee45c85dcd67d71d9b31181f3d3cebfaf810e636b0ea947f5b7b82c6ffa41aa3f15e3680eab8a68020d3b96f1aa92ee18fde66218292ddd700a6099fe743661c218e9347bc434269d3cf36695d17eef5167cb0a5c34df6739cd90ba150056327e64e3998531da44ec079f263b816d6e46b5f0f6067a3452944762c2c0a46ac04bcdf55357abafb18bbe61876f25fd91afb26cba7ced00f42dd44b8c9ec2ecdcb30777f99383c3e247fc9c695a421dd2199b1132de527cd0e40e1a46c82c5a3055a441e7da03622a282da80a01b225fd5ecab35acee62b8eba4f4686af8240313a7fc20c7788b6e9d9f45fbf500e900373e6fbc6611b0eb34071dfa2ec18323cf991715eb78ae4e870ff449166b7a52a5af0e19eeff0fb92349a82083e8e5ee271258f3e280c2c5a963a383a23486de99a577e68418e1a4c838153686eca7ec1342d8caaa094f79bdd97dc1846b55bd13928691cdea8a4b58ddaadefb5252f45bfad5798d89dc9cf2137ae7cc3ce35e2443f62b86e15ce00de19ba9af2f00745f68d9e18774f5ca8f1795cece6b986270e3b7992fc089e6ab55f22f076aade115df21269a925d79560107a3687de8bd86e0a5ea4cbe8767de716f4367dda9da765a4e65e313ac44fbcc939232ca4c063c68e0c7f95b84c8a0d2bf9981c1602a9b8c1c5f0ac51b1f6f1dd9fdc2020031e45c5ba6a4d35fde20a96d049595ccac0099a13fc62200be84646dc5d645052dcf9a6916dc97a94996ef548696c02fd3b5783d5a673118c56c9285fe9cce98a3773f9c02cebf3552a421a0f21ec51920d66b972377923114221ff87b8d95f8dcfbcd8923017a1ce655614909aba3793e273a4db00b02ee64c8c5f69f965a3c4205b5338c69f2580444f3c58f837ae28acd126c97ece98af6218dfcce74cc00d1028979c82e83277d73bd44c24525341f843e676a1fd898c2f26aea61e6bfc3457197255108b4e836c80a940b0ae1f823f5b2d3fadf0977c3465b2a0ef1c9e99cbdbed4e6395c9ca735ebafc5544958a0c5e8f49f5c91520329214ec872c87282e1f5eadeb947ac60c793c87986575b17e3704edc9bdf00fa9bb013093bca6ec38d05120060d49b11a63675e5d04e1649932de84b9017efffca2797e242bf0b3d26a419354d1cc4e1b6112b22c462e792210e5901df5280132a3d44359a7a84d00a6d4e24e5421cf89e05f306457e99afa12eea94a6c4fb252c09339199239279ae88ec71e3976d6a73530c1ee807210a39c5e0f59d576b559cc9ad89a456823caf6d31e41ff61f96f8bf3eb31f44816495d960ab790ff1e55ff46a4e58685926850bc6d6bb75cc66d6c2668efcb8f8ea317efe91daac587d6c4b82f091478b8b73ecca00d5151a23fcbe12cc56d8206e6ee73c45573a48ba6641e22751e55b3591281aeb9de4ba253cd52eeae09d6b453d631682c2e55676b85f23582775af54badd31d9065aabbe7ad21328bde7a967d92b7d51fb326c8a5f074827bc0d7f5782c456c08ddf5786898fbf2cf497f798f123c76d2f3821432f1dd0d515769f0c256114ec019699939402296f65232954a20122055d20dd76ed1774e0356ad28ace0059d2bfe755443a81ff8446394dc90654e8633ed122909cfccf69bf88df64bfbb8237e278974e68e3073853b454739b07411cd57d6fe68d917b6956aa57e33910bb74e08ee0965a18880603409048c94a02a1aa2aafdd41b7c69934479311a369144bd8ca538bd6e63dccabb686a86697306de7848cf9a9356d0693f5ed73a5d47fbf2fa76ca20beb2506ae6a7abeb3d930f6a95ac3cb57721f1af8a2b81dc8b88f7721abf5df741ca0e64b2f3e743a246460ab7dd096194f3bcba089558a24704c3f491cb9d7616b2dd261db8c4a3193f0a0ae97806c51de42c4c70cab82be2b4ce12065a6fa8edd4aec11e4f0e26a85984b051d68d215153ee7336cf9c21e712b9ae362d978a69841115ae3cefac2c35767d7bc3c6ba19827f88c5c273649fd2c14f7e9b76304ee526d7af8d4901d48029e71be6fe2f622d7c43eca2fa943797e70f7478216ca58623b17a4ffc57c00aaabea44c8cb6998fcc3fad06d8b3b910410f12cdbe62160e3c282ff51e1d064ba118a39101b021547ec9952d67a6ad0d60165f13730d39e77cd22f5c30f9e654725f6aebe945f6a300c84f8cc957be5cc3deb49e22499a746e57c270f5a1b64d751b6dc49ac8e38cc6ecda80f4dcd24863323987dbf9723a179b6e1104efeb13ac37cd996df00c6e768a0a5f8bd5602c2cf1d0248278404488b86443365936034c9155fa99feae3aa825f2f120e36283666a833031e4ec5833693961005a195f9db933d5b3eaecedbb8b95643cf75d1ce583a1635e4504c708df5f6951d9bdf14ccba4a1ae64618751170fe9d3b6df1ad0042c7dba04ca5d06b1b67c41cd4ee6c64e61f4807dd69c888668d0d8626dbcec4a1e4ee7a8d384ba0b259d8a92bafee9d007d922af604a828121f37f18247b73a8e4876dbda83c46625f26b66ddd98c04fda34fedd9f763465fd0e7ca074ba32dd19d0ce8fdeedbd0a2d5b238bd4b5704f460987972641eabdf94e337dc8112d812cb24aa3615ebaa9fa029bd2ca2552a3a814dd3ce2d00799c3eed1e2a6573bc59356f1642e35ff9a148de62c5d758a2db335a84f48b0f70dea04ba8c1b757b600dee91beb3f85e3126c1a82dda12935d77ea26e64faa8557201450c85d7e40e627a20a0082b0f59def64123ccc253e45e559d8b20775cd77adb57481dd88bc17d6281346f72c3b894ea427639ad420bf376750de2639b19880dab2394715067484841f04425d45b89747d22417446aa1f127d752749772bd72512d871da04ebcdd6974d3c15d8518c9d8999690b7c566d9b3b819e6cc2d0aea9ff276ef46e35e002098e504795283a540070294c770d68b465a1d7331d82742debff8ac345deac800406eb78d43d04b595bfb5ef15444d4280112bbc58192b41f700aa8a7d5151454f054528affe675a3d65e5aa5195964ae68456eb1475db22c191d729840817953d5485350adfce4507c19a2edea201b12144aff49b7ea4b6e558dac31b094302af87037c55f063f00a93f45872f5116ad00fdb4bc43399b485505aff420cc5750d77e19396b42c41e49aa06bf91295fd5d7b7d8bc4a3e50c975db07de63beef593be38b24e532e1f7aaca306a415a39ae290540bde6a2276b70f0a1e6ddeac65f86048a4dc31a6b441e4b270d9c31fb6564f0f6204590f3d44aedefd35d3f5e12661949471779de67a88d9b445a5a48936920851b1be0fd26fba7bcc1c7c1f8a118628441105fe88f5a07f79db49c30603a7f7c38ae70d4d8fa0be69d438e64e945fa0f26197b9fea5c7606363930f7fed28df66958e4357387cbb892c72e3496e6f18af01abee52da3f28a366278c4620adb510e9ccda1d8f35b8657d1e28ae3c69a41482daf2abc5cfe978bca0fa8f9963103abc7f7f197d764fd5878214e9ebef8ccacf8bbde10f5a006bbcc7be44b026a1be95365192ad09fa42cc8c17e2a34bb768f2940e5cb90cab7b2a42bf93b90cf2ba700558c709afea59b93adfe78fdd9ce7fa95fe6589b340339d396d3fa3ee240f6048b726aa96ac960af6420073ca360a551105ca9bf12689fedfd7fc9bb0fc0204629faf6ac8be47037ebe0d7b964bd666f22ed8f88fa5ab7fd9d162831de56325f79d235049b4251e285b121c2d9ea0078a22ddcf14e20dee5e416a12c443a50181b30732d8c5c00f6c46300bbfa507ceb473f7b6360f7be212fc11f68cd045a03a41e74426c8237a7bf5a1fe653ee2e9d9cadb3574248fda8ce079545f214cea62f2dd7f445efd4420e3f42b4385efe37aec323171fcfd33076586ff17103f243ae485d71ae1a894ac1cb91b47c6d6678347cf635ee515c74aed8164a0821645a32d34f1efcb3e9441d2e5d8b6d06dad052d3ed164189b8fb554956f91a8c1b742920435dfd1b8ca6b4c84ccfc8898cf84172d47f55ae0fa08d092b839f3c2cc29416914fdc41be2a1cf8c6e60dc2afb219b2b4bb1bd7fa7abe8beeed9cc2fb6e59332a041684b75069db3628845178e84090276c636008ed148ecab0b323bf3dcb40ed30803c71d1655fb07ea982509c6dcb0f060f4f99a5d5e0c166e85e189c32518f9c4684edae6392ed47d0d1c764f8410b30453e5624470b1d5d89e3005adea2c668f958897bc18839941889b7eaccbb1d8960dd8523c1d3fe33510e92f977131a33b5a8a00848f52399f824610f6b00f5d65f9a6c40554ad6743a3cc34d5849561169974ccf6b7506c655fd4d28a8fda711e775d90281d1e1f187562fe11783e681ca31620b2fa7f449cccac54047f7a0ef45e014ab7a928274180d64fcf672edcd263224c70dc5e9f0566acf9eff8b782ce55a38cb765a49834b003ef04943ef472cb51dc96422243b60d2c6ca4051d260416055113a53b3206eee76c991a9c3618c81e1807c85a572ee38804ae0bf023c6589e6d82e4153dedf0310b499bd31cf3f6f7c1dc1e17624f203b25ffa2580c85582880e34b5072fa000985e5dae39ed2e01587e8df5d809b60bf61015e2729947077de1046a90733933c872b4b8ac3d0493ea31633290a0f4728f50714fbbb08b8f80d11c63a8eab159067cbaa8419fd43122d11cfe4dab2feee8f3900200de03a8de09c16069d0d74bcc5a94b4f17709a98f9bb6f1782251023a0915b983223ac11e605d6cc5f39b8fcbfb4b19a171979f941c9d84c05ad5fc213efa149df08a83f3bf90836bc0c5c89eb95a09110d4a99cc222cde3b483823bc09f8e82d5d309bb89040168bd995ecbc76356832c1a80f5f65c0e05f4670fe2772f287447329a27a067ca21154f63d43a0345985f0a76cb720a74700848e79556f4e4a0bc812366667957c2418c64175176e64586dab5c76dc791ae922014bf53b59d37173a84850e617f4ca952a57d574347657d89cb547059134316268ae90e1fc843c30443f01807699411ddf15be217822d34ebf2078efe68c00e70878e7e362105ed81e21cb44ebeed3231cdac0a73677e0438092d047d24841a7b204ac7761ea9c31f070d797899d40351b896a8d9d11f784af20d0450c3a51ddba7ab7b05fb2d505ec67eb56c8dcbb2741cf8a1741e1b7f1eea96ba2bf6ecd3a25abd58e56f4d3b49a0b175c04522aede79c30bb782a3b2829112ca000456010b6acb187eaa6832cc68dcab42d23887f07e6574119bd9c71c8085288e940f21b0904a8ade05e0ae879901ab7dc8b658488c7e45da2c7b21929c574d4d8000a813c8a9ef1d7e08dc2a58643a46ea02cafe9ae2b1ef726bafa9dceefaffb46fc1a936dc4b4d5bca9e538bf172771c980894fed7611e82ec79f6540f00fdef8428ff2e53aebec6331365ce9f32228528f59a7a8bc7b1b1a03857a1ba776666ae26a93b8caedfc49eb04c59cf54b6a951c7ac3403002d90c01141376e8cc6fcf485383a2bb6d9781de641c15522d7dca77a90211920514f4e59311ab63c9ce74d0c45de8b7736f77ceb454ac086f82dc63380585c1198bf0cf6e86cc4d43b3bb448bb13e5821d88871f73ea7a87de40d95bcc7dab35e00bf32ef8285cf2eca2856da5965b27486d51322a87d608422b1f41f33c9ac1c494a9413c6f234e099b298d12212e14e8e15d96e14ac645ae808a39eae4399ce8ceca8297c5e69a058fdee02d821f1f366703c122df8f4f4280661ca504580458a90674d30a88aff53e39367ee8d9b02a197739b0cbb29acb13d86ffe604f5b5af2e20a83dd71da5e0f92372db652a8271eb660881d3790b30edc9c00531d8586e3fe96353014f437aa14d03abcd501fc0a7d1a0c9a3cd061739b56ffa49d3ab5b7c95c196d23cb3dbd366a27c9a12f2170ffa47e8079f0ad4018f35bd3787bb8a24738fc04a17d915d797b5b1d1468d33151abbb7c7abc917f37bae5280a8928bf77fe433abf10c27876f7191019ad7693036e51a2cdc6bb1f583339779610d9296c4498c1e66c34d66b82af1ba275fa23c9b90bd8964c74158bfc53746f94ac2a5f95d4eafdfb640d50b2802d5c3c66bb84e297bf53f284caaf8615df3f9cff934db6c89f73245bccedb2274f71e136f2bf5ec0cff238513df545ab7d57d657585142fa606c3ec54a310cfd8afcc0a52dc4c80d197837197081d30c9d72b4313e529134ba8d962e2fa62af92d2041d710fe70c92c21a3ca76f0360d8210517fd01512dd63b8148faf8414de01c1f2cf2135c4dd09339a1c38f3c2b13bdacabe1b773d332b5cdbc6293d64ee34f1c2eb7680749bee7297b4c8a781eb0560fc9cf86ca430a2c9c18fcf631658438ba308e8a7e609f561d0d6394ab33d885c46f0c234e25a7851f4b1b5a9ef259c47196e0c710981d34fed13d6e37d4a50a158f65fd217cf9e59acbc0d1a68b49e31b1d5beffe502bbd036e0de662f21b58ab06047f314e5603ca6c62650803a30ca02a939a053fc54a589fb6fb756ed6e58721a9f2228b384229d8242c6c6eb2830f9ff07e83720b7b2bdcf7349209ebc0a0a26829e725c11fc5ed0edf0bd373384e266aa904838e2a0c70de32d78d30953a8403a6c258953345649298bfdf4f36fb7616b7539f88906e4ced5802d8f8017bfb0427dadcf95a162e516dd78fb53cc40f9342b8e03de1634b062964f685e3e7146d90704132ce9f103f2d19da32525d6412b84283b55829140a0b7a1bb81f578f0057dcb14e44a2efd89ff2ac1c9057954915e3b367d923a91cc3efd18fdce61019253ae46641d0ba28065009ddd500c14dbd45f6e430e8fa7acf72cabd56898744f1c4fd40469249226dc25b946024f6e07d59ddd9429e3d38d46312232b917b9ce7e19ac613a4dede9c9045670ab87af8e538d03162600e4f55ede1dcd3c7d6628f72434110fbc8a6ca38df1f6bbef228aa7b64143f724008fe0161d1f71c909f1617981f0df1bbe65b245887fefe0ccd4644f0d26a0cb54b8c6367e25369d96a85945379890d24f52f8a580622858a66c4014a30182a0998f1b0ff801ced4be83a2cd8f2618d6e22b2319b9afa9aaa1d5a111ba34870ac275286b4079958295630620c2d89e02ce5e214dd35524e32912e848054536d1ed2288af8d35d93266705726790f193a245ef2c0a986070a620e1667853418db68515014ff5da6208e0a2bbfeb77bbf03c7049986bd3db12295d5940f5c406f14eab88fd4688df8bf5240bd15cd7df3bee1efb90e5d3243df6865785468b120a43daf7f70e5b437dbe5b3f7090c958ef0ae1166f0b83aa954ad0663eef6b3c3bd51088b48a60710be15a138b1f25d7a193325c9b070767f1315d81c037f417b0854ab1f928808fd2031e4e4b7d87dd5fad3fc60290108fe4011f67bb10674df8dd481aa05f695e6f0379f6d01acb1f83c93d9a967f817ca2901e4366f42f16189d8ee5eff05718ac1eacd7c728571a887036f2ae3c370341418b494d4d19c70a7c0e05b37ca234332b1d0181178a50667b934afbe38a2f509007112523848960683ea1b24a1e46d54176b15ce29417a1d3adb8eeba514ccdd6f9f1698843d45dc6518c71abe938011dd6194123e1a445c0da8636b3a85f39f848d190e3b715abe851cecf221a54f8efb10cc40f65f3e1141ed5d31f104067d641f687056579e11d3ce25bcb2b6a5b7d399c94a3b5a4e7eb5e7dac17bd03b157123d5b00f045af4ccb1297e69a243b0983ffd56d0ce8ea733131ab46441160f04f21ecccfcacaa7ce88fe6a95005875a29336611acc92efb7e921289c171986298bc6e047f145ac541f5c2c5b1a74825189830505052b12777f7c2b186dd96006747b1f7a43e0fba875bddce4460ccd788830dbc6181f205cb243aa639ad500ebc686f768030be14d27a99cbb8768c8cfd96f28c0c4b6612380ac44ea7134081926e971079836d918bf6fc784bfc851855e9dbce4fa251c03ecc7819312d6fe7a172523b13638298ec01da41aa717bf3832280d247a6414f03d77c83e9761b3106eddfd690025dd9a3e4acc830843d4c910ccbfaea62ff0b0fa0ee2b320b16505d6796af43eee4f203fc3e2333bd4d2b4a44d5f8bc702b58a6223cec54e2c241b5f5d5904c1a66ae489384b3d74f613579e463faab43e6e030fa4686175ac2eee068fecb8fbb172ac17548b1a565d14c462e2d893a34d84d6385f0cb3a4a6d67063f7a3325ac955288681c718e823eb3d13ebf902aecbd4dfea5d16d40e74afa3fc3840e2029c1d3d437b0f0405737c6ed3c307f36ea61efd8dfc25c186fa7320ab0000f53983dbdf67eeb2b6200038b26ea404c4ffd5bda933d870687e35349906fab7d8ea1b3b49aa8ddf8fe6793f78c1d4bfe2c8f5b9d4dc93ae6d4a40ca0a65bcc81a6116b51ab3e26bb6377dd535d340af5b2d8a1c2172e1a8f98c3c7abc6bf97fcacce20fba731f7e7e9d2cea809f84573ab67fcd24d10a35d54e7f11f0e5ce0f740a3a2a157e226f654ebe5b900ce83ab1266aaed173259403bd6823938521917af8efa6b00c81d5e51296d1702300dad2138dc4603d545ff666209961a1cc8c784be229a26ff38450a76877f717da47369c8748c08c47ad636b22443efd00b43405b2d9f5213e6818ba67460ab38446912ba66fe5912aa228891d6756c16b1b34920749b7d9118c1f836de6fcbd36803bb619898146eb4920d0e2a21ac4290e717b6857ecc58479fbd8c0e6aaf984f40f22c3e596d123ab2c040652c2cdac1ccf5b73f26f8603fc1b4a4cbc97059372e065255a72758f99656b69e7257def75d850ef48fe64fd39505cc6b84c193ef185b7f5e539c5b36130b8b4d28a0f9612e75d8d1aefd4b387423c766c021259a46300a2960378d59d1ba251545341bee48e9adb99bb305d110e464534e5b589143be46195b3024e75747469f286e877d20c5c7a83ba45ce37ad03ce98f2cc4a5e7829739a4088d42c55fbcc6b5f5264bd0b75ed739de7f3157c1300da1e0370df24446366283049982ef116ddd3fdacba6b4ebd006ddcc39820200a8d1cc4308ad6837eeec4c9735bb90fea28bc32c49600d83ece6ee3a4b4640d44e0f8c4405521451c617acae365b1fe6270ce77bc9d410fca48c2843851b3af229ed9bb82e47596d45ccb9569bed0635d25eaf3d0280d077dc612e009979b62d98025406023de262e15b38716133c9d93794555c76ec87b198d3bd5efed6becde141c7d46f7d97a46e117a8b013631c080bbaacb1e7104ae501609c9ec2a724b93efaf9073aaad3192bc909f5a0b89b7dfcae80a4d66f76cff4b929aed5ed0e6162f742e2b049728ac9e0e88ce00f27a200ed2302e67b0dbfd141af01f1765639fa0a041788d4fa07c2c68440dc7803450908b2b9466a69c327ff7fa91a5edb0df195e818093d0043af4dd1b2dbf1133241561b75c5a0ae6a1cbe2715555569aaeead988a07132e629de3ebb25ad8275c1be25096bbfb9cbcf60b88340a099a4022110ff011e35a3e9771b8bacae65d6c13bd0a2b1510aee217f7e5c3a9fb871174cc6041f90be9626f295f47fd0347dc9fc0d3d72053d2161493dd938491e7229caffa12a8ca5522018f7304a13119eeee115ddba1230802a92e8a1d2d8242760b7b7821d26c5afef2385060c3b5102afcb9e71a57a30559cac6e34d1ae5c702754cc952d7f8d117aab3c17967af5c643ea3fd5f5aebdec8eebdc4eed43f3237c0d34368827257d0970b4e3c45674902a6076a030d483cc328e98cdcde411f566215a32b7fb7f4fdfe491dd6f668281e3e1e51b314ac459e8e34e5d583b1e2f077963b3c4a821bf511057d87874008e7dafd488f806beca4667bdb53a1247a685300c36bbd77ac9cae28f0a4d4f957a562af5fa44fa6709c7be8e62a6f072983331e7240a1cdf4be855d2279b46d5ad0ce03721537dd2783671324daac0c0c3c63ea64dc336ee48c33641188c4cc8a16629998ae3e298f2732ebfa0f4354278480e2029552ea5e6aac7283a59ed16d0ef524423f7b59da7161e39d315869143dd9c30ebdff0ba458f067bdee76251b72a490c72dea26ab3107c714b21635943ce51deb01b8718ee23e43d3dcf0f884ab8ca23a985a51cee920b89667a083d0b368b54a5a6f4dd769c1d4b59dbc4057d4737c64a32bb4ec0448fb1bd074c6971848853971bed98018c159c20dd133dd6c2ccf19a99b0bc52d2db088c5a25fedd7eec14444944f091d5252a9d0e09fe19e744593c7f718a04c60be114287c0c6b9835c51be870310eaaf69449381047ac664265d625040137243a33d1e016d3413b34682c41605cb75a66707509ecb6732c06e75e0104fe6871e9e0d319e788cb896873ba4f4deb37ed030cda661824cceef4813919eb4515e115557d54ce2fabb2b6a2cdaa3dc11d389abfe278c92f4a64763f907bdec1476045108c865d62ad6bf761541a771323cf2d6cc49191025a4725bc5e1c21d80fa556db7047ca461f2716c4833bd1c52a5d761490dd74b8dc60ed1e65851256805a20f930e309174266b35572abf74437aa408edcc5d41e2724efcae6c3344ea65279717eb844706dce60c430579ab0fabd80c08dd0c3d893eae2ec71ac43ea777da7403f97d8e48b2d6f6e457566048e98c1d1d3a3a884853cf1b126c883048d90072959560ccbaace0ec1e59313c090fdb23f00c82de41e2b0b025823e1d6fcef0f5047c014045bb317e99dcb002d549c9a2ccb04da838c9e591acc5f5e4a4f4c993b05fa0608113f02263bcc1b107ba447520b8f73ba74b64b8060b6a0f102d4b59708e56d41c3a28a86841d19d0f97d0a1b159afd6c5119606bf7fbea3a4a600b4873e3bf596b09c8024a046d7b4c2b5482f1d4e05e9f92c7574d96c604ecd3972e279f0592ccda8fb0369e72aa448ebc6c74b055470be6902b6cf184ab71abda3504205a09abae9dac67f4cac08e45630c3a6331f4df95ee3743f1f392387dfe3529a65958e3dbfc16fce01939ab0ff6dd0652c10b1a854c3d1dad4e4501f51f2f3d1844f522f84d057dfbda9e65c7600503e5a19fac0c9d527dc0dbfa29d88422b8560de5c258ba464871109c0f10ce1ca4e4492e17d4f6b57ec9b47cd77c35cd248fc167ca4a577b0c77e35953c27b294071b091e2799edf670dab12db4273d667461537e4569fd870a8142ff895903afd51050bc2243e90c9372df8594279d4d1e7dbd0fd10f6b80863731215c7b230b6693a98114a89608b64b40865edbeff32525394e730d3f236bff4cbdcf0aaeb5d8c2bd3fbd4623329f95b0687e0161b1ef1981c2f422071076954bbe34694a8017a735bcd28d7bb4fe2a09cfcdbec51b4dfc30f0803b1a42d8e7eb54d5461565f80afb3b71ad76dc5cacb8e04fcc18b4101e6c79aad808ba9cc9c9417910008adbe866a01313e61ca6918d6e498e7ea35678aa9be1225505b7e1e3d900c12af64343fc44f0374607ac2e76029b718c9bab1eecc709b82b041a10fc8e1e1ed32c8b4b142c6bd4da27c13dc66345bfb5bb9a81bedabe143a27b7913b9eb5f1c092acfe37d8f0d649e6b07f5c03771a13dcfb3bf4e31e9b04310fe60312bb3905ced9afdb0279e8bf38ca45433bd93f569a411fb1249946b78df18617b538300a69b3164fa6f526468ab8a16871af14885ca4e8bbe3f0a14ff42f2535dd9d956eb956bacf84f1e94f1cdcfcd3042fd6e017a47e0055b339913569252088cc0714dcd57f0b74afa3d374319362237b80ea5a4267cc6dabd9523825ce266decc54a622cfd7e32d0664e9d7aa30442da4134553d284ace0b1601e51070593c80f30842a633bf7559d56d3b5aa942b5636962bb8fb0b2ee0f34f6ab18b7663c06fbe9fa56f208bb04d7f1cf5acf354ac738e747fe43d3b0cc9f1718bc9d69e8f3ca7f236985e9c97b0bdcc9526d25e50103326bdac3f0d06cec4490fb7aa563ed9b771770c98890d6b51005d458f3abaec012e0a7e4a9b0a6eb7b9c0f249d188de38e5124e54fe411698b514b01c48c1576dae7594f2eac608bf1e0a9252eaa680e91a522479101c4e886210b3a39ced2a0260d7348aed774e9ea51078c150875292cbc5ebb8ce8140d66522820e384a052b56830f867f890205e2e95ade123b3960d2a1e28f80b7a699b8cb849f42437e222426a8151eaa2538acb2e7f8bd120417243a931d1ac0fcd734fd73d0665966ce1f0d0c49c06041344dbb88c3fe5e93183208ae9a8aaacd98f6e1a0abc76d9b423d102863b22bbc1bfaa128d75c44b1d6d427c33c1521e7a691246ecf61372b162a63e4be9e2c5280c5ec4bad258598b89aea7d06ee7da1b9bd4fa9c496f0ba1913d2ce48a3ecf8b1474481cd94911cbb70c34d92135c0d057602ef3718f01a6985841d7f9b9184cf87fbd594c24beba5db7b98c40964b9b4c2517999c7a1fc057058005ec4eaeca832bdd498540c19e400cd1d519d008e2dd9cbe20d0aa273cdbba5e70a556395daad2b957fef8435bc28c0a64bf94765d8d33d3ece160e14b4b21bce7e2017395c8bc998f809a77017d2090accaf45e142c45f2a03b73b0345caf2340787fd15be488cf93411194d8053bc7e908bd67211cd14529209e4328e95c3931e0e087404561b9c33f3d100533161cfdf54d8fc53697f955b0e5fc874b590de9cbddedf59a6801ad662abbd8bba8056b6906828f72bcf3cb83e99d5b18174092aa25f468cc27b014a819c1e8ed9b9b1984913f1f5cd1aec326e9727e13c0035f47769f102b151581bba3b4972b0511382a73f11be5a86a0eb85fa4a7c1604e048fa9417c1e3218f1c3cc35e8476faab97a55c3da0b88334ec17106166fe078e8879bc8973958660ddca98f0e76ab275fe2e96899180fb98f96536c35ca40c24a98db9cddbcf32729c47c0206063fcc713faf1b68d164f8e171370ffdda99e39d7468018e612e5e06c223b69a9ac0b1106d61455a3355b8ebf7f700f5968597ae2a7aac39544affe9d98f0e28d984aba5010a6f28d6a21d83f78434646254162b4ffeecc0af5ff8253d30b760cec37c0fdf6c0877f8648019c73b282777fcfc9d8b0de400461605859babf015c084d5aaa77530913bfd54263667b69ce7281eb23581d33d78c08127f40a240dc13eaf84efa25ce43b360a8ec10fb6526a50946fad9ea60649c109a23dd457943598ea1a68a42a3457cd9ffd0c15bfe7f414c968a1adc6f3b94c1e64d047c8b2628cf33130b26d10769153a424ec3db341d97e886564b93ffdf278b9d61a0dbd87f039b0bddb28f91f617d64eeee27ff6b56b491229f78bcf7c597477b51c2b6fe36d209a1cd3e986c22b51ed0139610112f6f4fd9c960257b1680dcd66a185beb86878724340c60f221d69e387211cefd49fa04ab4c309b7711e9450064e5b82146b2743ebb5262de301f84cc1c127356a9c2cef4689e66334c669a4688519b487b2753f41d01d100f913714bbcf562ca45dc1d0e413c95d18019e69d434325995364dd47823800140438c18eed06c8af448ce1fcecd0480fd4e5b9902c47a097612b99456389c8f19342e17ceff0914027734180bba0bf7bf35b8d2a981a42725737418f13e5d5f1c8b4fd844385c2ba7329ffed981f1e580853c5bb2ef21793de52e518e81d093eb7b980d98f34113dd60edd0a4df55e3e928eb007d3ec9e00ca0c64453bbdfac9acea7a47b825e7e850c32fe3e0412cdd8b21730e9848dc28b8d4cf4d6cc72548ce4a1b3ad5b1af9d315ff0e6c661cadc26794cac5f5c16fb7a6dbd2661ea09f4f7a452d0c6a7fb3040c25a13a65e7874ba3ac500005fd5e06c53b0be94d627a57deb29f9dac0d815d49619d00f6ddd932e1f79849b9c53c0d2daa8d70fa893ed56a278230c86efe6fff4fdabc64c54d2fe9b953d5e5974546764a544908d5dee04b9d77a9053b96938a1082ecf743b785aace1c61b8b883696de48f69c12c14d63e985fb95302a0b81e24b901bfa2eed820f4974a5a0c7c6fb98718e5960067695622cc08294c52d0c6046c8520f95edbcc692f277ff73b24ee63e45a7b7c21dfbe1886eb630bc79da07a51c4c523f0c44ddd85c94fdc55d5c285cf28ece762a6bf7fe712eac1af3ffd12950aed9d33992adf81723685105646c248204870115eccfa1130b7158fb9aa6050c0c612e54a9b9ce7cacf870c78b35fedafa7df4f2a9a5ee07c20939d5d1e7deea73efdbe732f59a9a06a68cd7d3e1f658dba270ea12714fc2c04d5b592b30291cd9ee74a552aceaa491cda583e076d3bddde0cb12bc2b531dbc235f40f42ac5a50d124e0c5522c6e3ca31e10a14f7066e97671828b8ddbc78b6654d82c2156ae13e390718d37aaef2235d072e7d17439edf8de331b4648d1ddfb6e56d6fa250725ca519081b22074a5c311077cfb0aaf9a23e82996dc55773b77b6b7f884cb06188b8694ce171c0f2afdba133c63c5caec941829839e92e6d3d5a25958bbe8085e3f4fcb129ba5c9d073f99c488ae5af5e71d1e10f83b07949e0c4a4da45cdd99741876c92cca824a485a76bde3b27f52999cf294b7aeb0b9b9b9e12f701c7dc0b5b530d392c5ef00228d2fb7dc768b1fd2a66a096e32b939aa203fbc29eb6bab9e2b0fd7343ebb2bd58920469f7e3af89220b3aa858f7eb1b547d6b329522c752c1cd4a1757ceccb4b06678d2e273f7b70c0e6b15364528b3de22632a95c3c9d6cf6f026b285b8bd7e9e4925c1eb987670e38e5c01bc5d93046a4c56c06d32cc25aad48da50c23ea8c094b25f9e549deed2a65d246cbd8e44d64b390a1828909f568ca84b5f68bb7496faeb52212b52bfd9555fb47bdc7503af4e6fdf1a8121823c046c8fecd5dcd369cd86ec195ef90e48327d499785c8c320db98c3bed413bd9d381837d8772c10b842197e6f48a38f1ccfbe680ad96f2530b38dd8b88605aebcc22837741598abd0ae8f6b8fb01a5408c0a0776397915fbf62c3658a6e38f760c6678aee9158c753adff0483717e8402ed5f1732b3f5fe1cd9b4d783f71204ea4cf79e0cfa417fcb86764260bc421ac1515e20366c1273802a520ed237f221439aa40abf4b726c74cd21f4f5356befa3b1ddfce3469ba17b73644a8278a58d139835e7cee130b3159ed0650b95fe6d8d15e5ab87a4c9dce59a33ead8755da8412b8a1afb10241dfa46ba5e29f99ef44f02267b9e8724f24028cc47d51e6a8fd65fef24d70c7c8430ad127315900a23d7c73e34c81e3b8b333a95d069b03c2df4cea0b6b7f255d4baeaf42d2d60580483cac77461d9b2c6351019412fabd1b249966dc782c64536642cd61c77c1a1b73ce530419f6c3a81c5acd33f335d9176a83263675225627fdc756301dbf1836d39f683610716971c0188da5d48fca374ad0a523eb0e920cf27ab696194097b286532ed0c958d4edd6c8f09b3917be17b31c2f6f5809a3b46416ccde64a6079991b30ee7cdbc3c73f71eeb9c134cfa20d069e005afa376e0f995aa23b96a53ee9afc12e544eaa2e8f4d70c02895f8ada89300b7fb07b8b859f1f7778e2451cd3c5a14e2117d5152e081e3e7ef9332a1fcd50112939949ebba9359b081aac97bef81fcef101b14c25291aaf50d3922416a100c2515d1a7a50953a2e7642e408c6532efa78fb5f4a811ed8fa643ae222720364c65e22998330f116a07a60961a16a099bd4eb47ff03a88604ba981c52d0169bab95b5203a1e158fe18546128dcc5577eb485fba8fbbe85445d06a75976a88a30fe0a30769d42a8ece38eeefa432ece02780b4d1e99e4bf41eb84f6dd5f3012a0c55f908881bae7b67ee734006c2dbc257496e3a6f3ea8b801b278e1a51b5a6c6f2e6f82b560c88f6ffb5961fd640ce6f36d3128e58dc1085f1634ba3197fb3131755d53dabb7a097feab6fbcc8227009a8ceb933d993c64ded3cdcf9c05d647200d42245ee1fdb0b659686790a85c713302254682fb598586f9652fc3effb782bbe84fd7506f66e30b3186dcce6107abc2bba76061fee3d3bec4c46e7541903aa2610cefc11ceff9a09202d39f4351a7cf727c1e0560fab4115562f22d646fc6f9ffdc957251ee389ffe09d94448c8770b1810bba5c6e29504bae8fa84d87f14cca62ef60b4f4f0ef28e795b1fd3bb4ddcb94d9d82119f2e57505d06e608d220ee8b84b24e5b438286ea034b6d23e0d181cda5d4c78eb202d3c0d4704b85c5995431b752b7f9b6b7a83812633ac88d63eb3cf2dd1dd8454af15241117c76a77747c402f8a0e9572460e0e9075ebdee4dfd0d278a7c81e8de39f5ed1bbb818c414ac7b41c0116d282fec400f5462caaf692aa74fec7051570c5dca7e16c9f7a7a4eabc4e50375a27fce38719d899ff626a1763b05cb83b4e5ce4078904d29eb3628cac04a71bb090d34513f521e342c3a4136014f4f2ddbce97c840d9c55962fd69f84697c0dbb990532484f83643fcd71e912c59acb78dab399b7d6f51afe1ed68f1fe1ac63b29b5f5b1432e2273ba797700f9781094d8070fb83e3263809cff16d606d36c3d5469fa4fc850a27200ddd522611e4adfbf1f69b51afc00e6d561d933be9a2a42b50f78133cc77b44e3d284e0ea3da2aa15596597674f87ed11715a994e518bde2d3bcd45cff875538f083f06478203109ecfa811ecd700bfab39f476e57319a7c0cc69c5e88332eab4e318a3518f16e034084286a95d4d7119f5fdec1344f3e847d67f7f78a4bf1a444aa6b35812c9a101d6345b06ca3e3fdd2e6ec20c79d8953e65b24d95cd2d5a367898d4ff43a58d451b2c8823faca8d8086e7fb325f28c895c9e6175794c9a5362d004cec5cc34bd2aa5427b892e29c3ccc864566998c5f315131e831b8f7f51621b2b4541a091c9ca5d90f4ee3fe3615e5e4042f5396d277e204eaad4dfe6a687c6ef0c3747ea2218ecda7a71c88b4eae299bca7a1857006d8e6afa5864af6815beeb5540375494926c8499426bfdad482a514748e4adc08112ccb7035147ec04f0825b829938f29291a63898fd20fa64e17c9f6c93a27fde70dc7cf131c452e075a58522e7ac2256352d608c3206815ab4b6e2968c543b55fff336140e935392be7540eaba424df5390972e558afdfed3b1566d235156147eee1ccb5a6eb2512179b69c497a0e4ae468668d0439ba8f45ad459900f41761ecb1b9bbfdc46821cf57c4e66c66f39ebc0a6c7400d43d41283a926586edf0015f0297e325686b6ae7054f005d0794d02ee539bd279bdee372ad1e2525d828bc0fbd6d15a0a82cc741342e20e21ab45c9fe986ea584124cc28cae518d162a853564f0dfa8aeae56f97db9d14acc382eae5c9145e44701dcea0b2a6aa523d9dec9a146f8d92ce375da2eaea2265411361f35b54177c69155a0da080b0cd925240acba5262598a2bbc8403be0c4475c5dfa702400e69cd68afd445e38e06273df0e5dfb043eaccff094130754b7205bed36f6e20bd668c3522987a1e17e6bc7e660c12c139f8c51db2ce8ce3ae6a7b158e43f85f9c8a09001aac88763ef41ba4a7dc8914b6a16a41a843bf5ce42f195db05a52d702c23091503b19330cd0b296a5d0d4381e42033ffe33e40e249e6848f653b95a0859a260d2e4cf3a974269834820fda1c8a91f4177666574cea1cf3a20534756bccb4bfdb89cf862da8fea4bf553f0dabd2654210a4bcb61c464fb7a01bbfb9866ecf4f63a31ed92fa24f8ee1945db7e26f3bdec71163b1a603877c28f73e0c34b036f56ad97c4d0b1864558bf38fa3a4110f50704b22a20a326601183e8785c3a5d86bc8d6efc3cb41d6b1660794eb654466d31caac4b206ff79e7c8d20112610e621cf1f69a581ec5518a530d0f93ce9f0594c63d406252efedcaaaa3825ded87e170dd16db4b2fd692c19608d23f5ac3f7665ed26fb5869dd88c439c1528c53f6e234f6df8da5717c356a774a2b59aa714a9e2763ff6e3c69dc27595dbd44d137eada0d99213811eb140e8333838934a6b17ab1b0218bed0957f03eb1924eb790e687b9e670e4501b1e2f40815447d8a0423c0effd8bd4967d18cf6fdb2310c7494cb54386d1efe526cf72eba5f48e75a716995b564bf6876712131273cd49a2e8ec0c1b793cca30760cc7e66bf50e9dd90df82e07dd5be1f032a8aeaf2f0c76154fd3a403e1106641c6b8618063b03a551c4d8d2de1e3772839196a9ba9046d1e22b5d59ff9292e114e6e7fedb65dd5dc071f1d3bc04b6b2a2a95c140e589e506472ef632c7cbb8d1cfbd24c141322a5d310803903c7476989ebf0c3db04a84114b3332687c11abd5a9a7973b7db88115fec445955749a61f49287da5c6471560fe4b24054d33937395fce502aae488aa6450b982852017d820b35c01ae8a75173ee46da3993c8351b55a75b5b3112aa92e22019c90c0976288198790a8236cae58612b6f3757ef632b37d3f1284505a156f8642135704fc35891ab9fb338ea8875ad113a0fe8723ae4d2941df9b7087ac0f4be64e527cf2a63e19eefcb0f38536a157d78194f39d69783a8cafa9118e7e812b3fc8fc525a71a1c312d6b4244711a0e06a9012f6873801b8e68f5bcd4a6ed332723de42c407570f332515efb6b287d33170c5bdb884caa37d7377d1e6db0c1d82b63bdc04e89d4cb2756bfd96d3c5657183b3aa2b56dfc77143600eb37f8d03709c583e33afebe9bda951f8426c42728e453abb4ca75c5bf9b6fb4a2337c4342f7a9e7aa0fae105d54c8d4d6f4c5e7caba88b94497d621429a656bac77ec1362f7e1003cab904321fd6829afbba87daec9a425ed578e59fea50e55e6518ad841ff9719e3f1d9a35f3d560c3a02a622d0dbd1fd2a0aebdc7a1aabfe3daa8a02115df38d46ef0040be8e70cffcb07ac299f5d0b6eb97a25b48d609cd2b25b71f5cb428a97ec29222e87a8cd074b2c60f27fc71c4ec2310c16b310ecfb93498966d687caf936073ff7b19bb8bec4baba2a64f5381a6fbbf3aed85ccf6f8d68a1494e4419313b3ceee637005685a23c574ac2b7422397201126020313b718a621a434dde8314b5b598fc8aa971728127e48bbafa247b662bb9342d032cb537a0a08be74d6b439393472958d8151be9c30a1d711c586211ab668a53ec0eb697a61ef0d646d9f9c37bf69be9dd3bebeee7e6eee160bb2fcadabd6cef3993a074007e905ea210ec032d20bb3c3efce317039cf0d511e91162ba94c1fab41d1428fe0b6007845e13ba0f69d275ea00d639a45d514dfc471b5d0498426bb1644e1ac91c295b5e3208d0cafed0a79ea001415996c66988bae626ec5a95076ef1650ea1f271775f858cd352bd1ca200f30c3f46bd566d5b92d16699ea1d009d49f94cb19561b84e07c0662535ceba50d7b3d339297d1ef80306374252c6907a04b6154d519cb901d5c4f92a56c934167cc9f09c68c8b98f0fb675b6ec51246f4a4aacb6bc969112c51e5dc91eee80c24f3a72428218786d148625ae1777cb7111514f8470e69cabf5b72ab7e67798bad7474e72ac8f2c5636b35b0c967683048dbab14c585d7a5becb531aaff7a791eac23a1198cc50811effcb0c6c876bad6bbef6fdc3e17ac05592c8afddb83ba654f101e2958f55c4b51f77eaee29905753b46a2271fa07e89705f833cc5e762ba34afa2ca6cc3372df57dcab681970842d050e7b6a7ed289a6ecbe77c161ad3904682e441e1e1a4ed4467f44d5bb107d2707cd8c8683984a5865c923ae707711e89c75040a9fdd6e3dfada5964e80549dcbdcc4918eddca5501c5add93f6d319a1e304481da45946537f2e9a0ce2413c87818e65975a5d40e168cbcbb1de325912411f05d1153ee2940fe12f0d515144af063622e44121d337896503d61f780c32f01b1900844f97e9b4fb7e6c419a2527768db92649ba23e00f20fb102e02f4f6978576307333b5e6fcbed0d5002e2ae4763e3e1d42b866d8a822ab0181cc67a245e9a7089d50ebc60c304d6103237eacfa448c2eb9fd97442a759b07276eec1a8d93545d986dc43874df34002952559cd69c9924544eebe1d34910d8878deddf8dd4e2a25513f4e19be76b59aed2299951a92a798d2e7af9624b02972294a378957e6d711818b129384162bbbf722ba82d624e1e38abd04c17d5a22e0e7bde8b747a07ffc079a73e9a1b8a182188a2ee6d9f26524a242ab33d7d6129f0c1ab9e9a6f9c0c01115de349dcd14da44fa8118247488aff64452e02e04f0eac80daca8428f80700841d7b0011192adbf90a18aa4969fcf5df373254132855c6ccff4567c8cd4d845c352aa790481af22f4f22c00bd006a814630ef6b0c988353ce59d1ddf407a0092df0600972a79d17c8dc06fce8e1129923cec677fa029e36c29cff217149cda3581883a79c16e9767bcea4cd1b5c014a4e38f69b2239e65011868f0062324d4e8bff426e274ee92bd981f4d3847206bdbb3510b5693ca2046e58005a24a93890dbea3ce20c5b681ac97bd68f0c6818858a36f6997c18cf26986d99efb66f483d21e29f05f7e406f897f4f8496317b95dc5dbfb392426ac5777abd51c989caac40243e462ece2989521d9cc227811541aa35f8ca33cda44bcbb256b0354ab03ea398fa95b300eb34a078e87ad8eaab270d9f75d557b5eaee7669fc8e15d89b7eae1e77051bac2e3d24da98971b840e4c982283c3b4e2f0001d86708ee0fd790e0481bcc6c87dc596239d926f656737eb0214208d972ef2d37d9726f29a59432300a010abc0a2b91e532e25eb9f4d64a64b15cbb65b1fc9371cd5af9d6cf6279b712c396af4470fcc0fc96cb073dfcd11a4df001fa062a6fcd1c8aabd5b87b3ef4164bdc2b9627e3396bfce1796bfcf139cb57620febc1b18745e35afa2b86f5d164bfce1af74c4c4c18e69cc3cc720dea1c3a0bd42e97cb15e64ef4993a9562a25ff3571e8e3fb273fef90d7d7a987fe415e7a0b8590f3e4be52a5d232313e32c57798d17b372cf5b6208e6af9c56cfc7cab9917a1f844e250f5ae9677005ba1659ae125b5df57ca8bce5d2e3403bcb79d096483d1f3ceaca73ec7325d2ef2a07218bc23ea79e0f3d7e2ec71fd9a76f6fec617d1e3997fa37ac876583775baaeb7c846edb6eca9547e8b119a1c7a646b104cf742ea7f1fcfa3a9518e3a0186a2de3618c87aa0f5abe729583e2b67950837afb83e32b66f4d11a2585a97c056a9711b74abb7ca55dce83ea111ce1b56b9e04400ff1d65aaf5cf579b80a5d35c2081fba4abb625caec71f2e5f8d3f58a1b8bfb1c7e65d36afccf23a9a9cbbaeebc20e9c99999959026abd1af7cfaf5c256e9b11fef396e80fd6d4c46c578c28292c6c8135a0d78060ab86e59fb75ae3c60f8e3bbbca3f517396b87b6c56aa300cc56df3a12a0c6d7a6ca4d208360eaa504424d415e96da7db40f4a744edc5f90fec9b73d835df8090409f1cc16ab9dce5b98cc7cc6495cfd898a03f04afffb2ab4057791886a0cac1d15298e779ce1908c63e160890cf9e3d5f8d1900a1559eabc61f9e77e38f1957f9d857b9f6c6702666c6d592898969b55aaddcca2c168bd51d813190d72fff40af01c397e73a679db3ebd1731b17fd94b09d26dd7eb08dd28ad5b50f4e98542851b9cb573431ac18073f08dd73cfc3d11b654cce312dffc6fdfa2074ef6b8d3ec2d11be5077930c7e4ccca2c974eb362a9562b954aa55229f9c087a764f118c46e63101f1a844e284e84cc8ccfa8dc45e3afce3fefc496ebef731a9c591a67567670dc26d80fc1051fe3a06bde079f772def5a63047e3ec6f3d043f740cfb3ca5b9de8a976e7dea85bfe75ae7912d00e46e0e77de8f7819f0f4710dc786f045d52d8e7dd0ebd4fdc9fb7c60c80b0ee8d3f54de1a7fd0f8e73c6828fad06ed4342efdf5d1cc7ce37681fe79f77dddd77d0e7e32323232200882204804e8f341fff2e7d3bf0fa49ef7f3b9f6a114f4c64ddf73967fe2c63163e8ad707fa07aaef2957fda439dddf3a12cd5abdcfbe1435f3586603e08faa00ffa049d1b77e720087afe89a16b71dbd75e3f0d82df687d743e7de4a4c641bebccf9c995e197aef689b7881bc752e456fae96de5c97de074080fc96ee6387c821c298633927e332341ee3ad19cfb3086aed2e578dcdcbc1b1ebc697f7a2f18ec603d201e980000142e3f9581a1aefc61f2e1feb639f66941426e372e9332d970c2ba6d562b1582cd66ab55ae59c7326c218638c31c61ac8ce05aeba4094f40663acb5a6301f0b04ea7dea0ccd6b2059815405d4052232765894deed79c5fbc10de268f0254261f77e705dbbe3eeb9412068fa2dbde706e15085901bd42581c205a90a24cfb91124284a9cca532b4f79cc9ef196b37e64073dfbe75d1669fc13f574d0e84197218222f4d5711324265fdd661ad71ee839fb973d1cb57fa1d388bb73e933ee65319cd9d9c3f1a371d07376cd93c0e7fae53938eed7079d87a0eb71bfbcd187f61074f923807aedb99b7150dca0d38c1900a1c170c6c3f1c78c7be30f19077bf4cc37cab874170b948959f97570dc2d164bebd56a057a07aeb283d9c155065d832a954aa5b5d65a774990aa40aa02090a12143074d033e8d943317bedb9413708e83d0753423708241a01d40dba41190b2a8836a8dfbc9b43f5665b5161924d128ac6baa2274ceed1132ca923286a7842658584a8e88888918e12dd580746ef4d68434285c2362a6a4e1ad5b48973c4449bd469e949893acd252a54873ed59dab64bba1a11036596ff61502e106d59bca418ed79e286cd342619b6dfa6d8cb714b67a10244ef77885c7177e5c6712a702e0680a20a5a725ac29e14987ea8eb55ad417bdb525a1df7c13aa3b5bd16634f46de8ad3dfda685ea40511d2e54a77640bb79ebbdf75e7cbffafdea1a140adb1c8b9a12856dce6d44f4b98d88eee0a6ad686bb2296d5494be6c55b6a30dcab6b4316d4dbf3987ab16953453020aa23a5b73fa4d8b2262a48aae2571a20fa125252854872e694c4e1a12aab3a790464475a6a684ead022cde888ea68db041267154fa0b0396a4341286c23aa37db4c6f6d686b43bfb916a57d990919f2392108856954d3666b890a206d52c94546cdd934e2734290399b40d38814fab5c105d6b5250adbb84d8813b723143680d91450a873e2bc31143ef71cbbac3b28749e1d8fdbacde6cee8db8de60975e089de751d61bac3d6951f526855329ee0e25094971585bda84b428ed49f34ebcae2d6d42db916d56779e42106104124aa83bd6370adc58b785d15b8bfacd3722aa43e7c684ea44519dcd556f36b7a2d79bcdbb7df39af8dacc6be16baee58e3925beb922c6f152e2e08983c2369f95256a0adbfca5695388eed42ccd2125495234f96d23facdf784529790f89db7242bb62424bf6793dfe6d16f6e637b2efd36e9464475762ea23a5b1b519ded3aa23a1bc72ba13a548cdfa8d34614c6efadc96f60fcde92de87d0120e57ddb1d7a9cd36fed8a0009064fe9c734e5a59207bcc48d139c87e1125bf04a13a428accbe54180c0683c16039b07ad362d25b72f13921e8ba80dbb8c10439c88716ea9c737aad3cdbb66d1af0687627b5f5cb2657d580de541e9e1e4f95b0bc992e7594e0d218f37061efb538602e0d731902d5c91246b5bca1b0ba93c3537778c81bdac30310248cc2a86f203fadb51af060217cb0f75a09a36f42909f14bbecac9e1184a584edc89beaa0bee63a46b0792c250ca75c07d54971205098071456bbee36dd29abb442dad269677d3a27c501a394527a6795f5b36f672b602c4a7983e91a93a73583de3c5f44e2546f05e910768e0720cc22b68b1a369be238e7b484b17a9ee6694fc8b1a9d41a52031e8c61b09c1c1e1e2d242f0b7a5684e3b028e650afba7631e438e40e2da8070d785c4a1efcc5cd185f7d1be0a5195f7d2be0254f15e50e06a4f6da2882c4a90ea6a1778eebb89a4e973bb4a1fb45aa0906cbd1a0470829285560475096989a5250a80e15aab3535efc520aca8e140eef0198de42ef54d2574f25a594aa4d359560871ce4830c4339d53ba51950500faab35d20f4e081d2d64384cb241341cb231e3a20905377dc73a4bb6a86b4703ae4a0231e3d4220a127477239924cd2493e4928195557f0d55a6bf11772a7fa206faa8f3106854afa5d53c3a3de54af75688bde395f61b01a1cb4c9d619bae954ce499d523ae79c1267fe1c85d09c3e169a338b5553232345059ad534cd5a6badd62e973b0cf632e741a83deacd0c9193b59ab556d3344dc3d5037a536bd096c26aedacacf49b12673a0faa6d1d964e2bed7775d41c1d36a8864edae06d13650c8b32c6893216e3442cea221edd530940820019613af2346793c80c9a42734867cf138cc084ebcee6d245ed09e1f5a682d11b04088490739403c3514495485902fcc5de6b71c028a5a34b1cff49773f3d23692075a746497c5dbaae944ea7fa750fae87300209b846c9e9f435cace649ae86d7fcb2a3f5dc609cd424303a1b7cd3f68ba9abd2d7a99c18f4f1458c84d8e8e8c8e2614aaf4f4842b1545d6092323a33b8592926644772cdd985052b2d4e62ae1254b4bb3ba9c955b014ee12484baa19a675df74454948d61a2bd2af4d6a4b0c1c84bef8aa8cece44be7ac59908d5d97996675407e80e4daf7506815374d2a6eba2686bad6be607adfdf60e8ba64fd36f90c4b9770c92424c42d122558c31d2d2e9595c98881114aba2c4828dd8943853e64a2b86d6902a5f21d820530722a29e62767c853006b14ba811aba3ac3fb1216a2841c5aa6897502386c328aa4b9fdf0027aa388a5531e710eba69472cefb5551c6ba2d4b69c6153800c5641831ac00c5a4e30b8662172cc139abd0ad918415a85887454cba9e0ba0a1dcb13de9ec09d11b6bdb8694f76af76af75a6b6dadb5baa02badf40671b2deabddabdd6badb553bbe6a43a4c9f5edcf5844be46aad9489973e4e5b299d734e8ee3348ed338ce1ac97df3d23112f286babbcba565d345e21ec99d1b34ba2e12b2ab3ab8864f7db33eb76c9252db7c87459a30a6310b5577300e0aea522e3d136442741e428d7563901462a9cdfd0d0cf50a5d22596f248e91c4995ec50b2471a6370531f4544aea96866a89b37a2971ae9885de29a1a7a090dc319ffaa72477b49ee20b442d404770880650522af5746c81aace346348d7a18e5210945910b60294b637a8d65a2b1413d55f9dca30d7ebadd5ab07b1aecd246708318ba19082dbf13255f12ed59b796fd34fe96407a6974e7440229b5e3ad1218daf4172473d9238d369ac1ad51b34aad1cf588a0b1835a0cc62136a368b4d3fe18362ca1441b3d8a447b3a0ba3363d3a750dda952a84c499ac5a6cfa1ba2397664575878269124487ea0e35a2443f9dce28906a0907a7596c3a1582aa3b746929eaa96936fdf4b944a1eacdf4e993a8681a955077aa51bd996ef4d341a83b0ba862c9516cba082450a3ba236335a8d6190f6a4447a39f5bcf4ba7dda2e3a4b66ddb91a1df0cf01b25e2b76d63d54481f2312f91cab8f2dd4b242953b29d214a4bb72f91ca5872f9d04939e7a41ae890b556590f7974af267365d174dc1a09111da2332ae44b952626a3264ca6d00c82e2d2b3d40386e3a58de42ac7711c9df2fbf6cfbf4200639ba77ecf17621b838820866927a36889ed7d4aaf26455bdb49d1db85a4a9f3a854d43a295ade99436a4ba9be52e60d2bc92e275abb9973b13c570b3475eaeaa6b8d4a574979296cea3ca7b97341d33deb49b53f6de2b71b66dc318739c8e4fc9aeeb347d0d6fad22ba3b72cdd2e0250e1b223d5d87e6e9a2747499a2b3ca384aaba594524aa909293c154d48b9cad074dcb9eb72ce9f27d3e0dcf0a67197b3957253e61c0c9e74948660fa3cf273836bbd0ff0638933bdbb73de3beba472ce69bd4fa6d15159e71c7d72501fcf1cd339e09e456144dd7c6939e83ef57a89e4858aea25521954a8d79a243d67119ae652d649abcba85842dd7979535d0a28295f7d8baffec443e24451181502925de80307280a93d7a56f8c359d74f677ec4161950785d5eaac31a4b3c87842f798d7c51f29ce4590f2105b97cfb9f6c2230829f99ceb8a9d136dc79df3922ba2d37cd671d334bfd5effef9297164948c12076051b96145010b77187518f8464a08835a33137ac6e09cc1c0ad2c458a25a4d65abbcc5ac3ce9cf3119c179dcc127a6316167ae397224b496f4c297d55e7defbcece0ee6fc0ee6dfe75e7a1cd49f23d64e7ae35bdf266f7952989ca201bec3e277a93cc5f07e97f3143d70dfe77ad7d6ea79744a4ee2489f629e426f3cada79ebbcf599f627dcea6f4d4d265159f39be7c8cf9e7d893ffe77fbeb3fbe7a7b8e7db978f6d5fe2973fdfd19edce3b2577b89bffdf3f83b99bb14e77de2a7307f2add6e18a7d592b8e2890e736a30b0f6f66a23d02cad73d64dd3b81abcb85cd2ba66aaf3a2cb51644d0333a7e67d6a7c4580daa843f771f802c91d5b94e9d648eed07ccaa5cea9845dd746f0d5a59c122726b35eae52ad28c8d8e783174bf49b8be2a0288c0b855df0daf80d491cea9988965b95f49b9213690c83507738288ee3ac7825ec5299e372507587933757fccb41cdfcf59dba1cd4f837035f7d8c5fbdbb53e2dc14acb552fcee07b509a151d179a77f204ed7e4b473ceea5db54bec9d723528b42d870dd7aabfc0dadfb75a9d9a487fffccc9a59e5c4dbaee4c21f4c6e59ab32cd3d35f5c2e57bdf2a6ba5a9bba0c45b6b68d7befb5dee7e5abb52a0163b648054959b1ad24f071e5a49fb5318d025d2278bcb32eb4741ab3a20736bf185be9011ffc53e6b0eee3ba3377cd9edeeb43fceb9db6c9201b465fbb691bb3621e658eb41c92e215f2264063db78b5151a93e20da2d708855da122d70695fa0c115afabe4174de7befbd578a9fa4a92128cfb95074491c1658eb3f7fafb7c18cfacdbb0d77138889cd59bd916182b994164bb3098549e152186b3d73b09052f8a5632e95e2f0cf198585425dde72a270c04e0e0160acb5cbe50e83e9a62c3bcf4be1e0dd17602e86b349de842177b0533cd6d01bead4378de1290b938d89c6ccd2d9e0148ea7580337f2c0cd936300d80dc673dc328a8ce2b7037672086086f5cc35674db059fe02d4154bd38da6ac2471dd71adbaf5cfabf75da8caae97afa712274a95bd973bd8e5ba217738e7c639f39de3b7001eff9c652366ded7a53eeefbf0f669f7b35fa51301dfa6bd0eaa5f078fb41f8db2ccf00e93f057d35c739c92fabad42e0f9f1b441318bb9c7bf94bc6b3cfac400f1d04694cf00f014de8a0ca41ffc4edff7ddf0782e066b9f408c88021183a286e121ec4586b96cfbd9b84d71e3ab859a08cb7401907c71f32ae1a7fd038e8737deebfee6a86e6e5ca33332e97cbe5eabaae6bc249f8b0d5d2e3be810106175c5053f37ad1d0ccccb85c32323131ad168bb55aa95461a835087e9fe7e5dc75a914c7c9c88c1bff27715adb0e1a7fed9071d76bdcda7f3ee334a2943833e3d65e7b8c768d312e234a89d3ba3a2dff603ed7dddd1d6be92434bd8f65ad206f3e6ff3b6590aebbc4b39f6944f093d3935a913238e4ba5427043a5f2e9c93d19631f9f9edc938d388ee3388ee3b8ecf37af5658e3b219f805952bb4fcef952e09ca67eaf769d85f1d544e86139d41218735ce72e5f79a1831efae7e910dcf856286ed67fdfa71a23f0f3ad3183241a6b0ffd63798cb85561e72de741599df3a060e81f1886e32b023fcf723dee1e16f8f3aa1104379e35ee9ed70efa56752ddd396bfcd1796bfce139c80ac71ed6cf38cd0af46656ab9c73fe42d0bf0c865ae6fbbeeffb96d0aa71ffbcea591f7edfb7f2d05b2d96f3a82c517a286abe12770f4b058220087e5fddacd7afc50fbfe79bc562f5b0bc27acb79c6b8eebbaddc37190f2d49872ec3d9ff22b6e113e35eecde5c6e5eb1e85711c7463cfdf7b59d5062646f2c6b93c953d45e334331ef3ad1cec56a28c6b31a4ad0f405fad5c8b9bf5daf5d62cd7deb1c4d05b2c71b581ca47bf67531bbfa7529404f3d2a574499e979e23af5421c206338460b15224d6a3ee9020a40727a0886164c9173159021d78d001892c53bed021b6e5d302909c3c319501664b1131e953c89cfdd0829c407534975f5eb2f1d2794c262f5dcba2d96c5683f4f94475b81ccd663322d22510291bfefa85e1f8eb5b070fa5bff84a2a24649182bfd2493e49df92cb0f7f632e1091bf7b1a114ac1dff01229f9eb7b32b97726fd559a50febaeef5d97465c85fa7f9a4e5ef8d9a5dd1d2fa4d8558df14888891237f9d0e0df19722f97ba992bf4cfe36f9ebf48806d66f9af4f24d95a0502a4c59fe7ed7377da25afe5e1ad58511023e741f9e2c640113af52a954aa1bae5275a1e45559b586aac655aa50e552a552fd18e1841428b63881450b2954439638d1a0850cb31b546196708c100796df3a5830e5432e3e74cc85111f5611fad08a0a1f869e63e5c987dec393853c353535352e5960c5d738079eace686cbcdfa1b357fe3c60da62d7f638b2dfe0613117fc337f06437649e4c75815395bfc021e0c92ec031fff2f2afd05f2f95bf5e503820891266090a8a1f62af2e9cbea420e8cb124a003941f12f06fc66bd6a00bf6b5e1586d1ab54aa30bc7895d39157f9033c99cac3300c438f79b2f03dd90b8b169f3de7ec3638a84e8d67cf79aae1734c1661847c41ce39e797e78c41ce39e71b9eb3e79c73ce393f8df1eeee3c3c99dfb871e3c60d778027bb81c1d3108f8137c09361805fafd7ebe50cf0642fc7f90baefc05ae8127bb200cc3300cc3300c7d019e2cacc1d2c2d7f80e4f56836d940a8b0aaf72057832158f27cb577a50e3adbb8dbc32c45b9ac68b4075546e7d0479e5e86d68e40892b757b678bbb22efc9e4a54e7e5d627142a5fe5ad23e1c4cad1111acc58810b1343949042c60f61a40146ccbaac3b1a1229a898e18c32c84822d6458b234351337c81244b6ccba399dcd3e8ed9e456ffd75c5bf5eaf97ef78b257e8aed07178a5890f5dc793852a954aa552a9542a9527c093a96c7872aa962b473e3bce5772f8ec3a3c59468027b34dfe346290f1347e004f463333333333e33933336ee5678cc8f9ec06f064195b6b1d5b97622479eb399ecc7a0e4f36c3e39262f42e2f8027732d29f9effbfc731b1c9f9420fefbba7c2ec297bfeff32e465c0c8952860f667c454004e91044912c513e672d290560a98ccf8ee3c9b22b0cdd153a0e979c7ce8383c59e84f8038a40e8bad58e3adeb266fdde5b09ca8b75628f1d609e0c92c0f982bb64862f4850ca43354f6555c5e35448696219e142102838b98ca0a245ee503f0642abff1649fcc14242fe3304f268359ee62b1582ccf613966491b9e25258ccf07f8ec02f06439009ecc3a003c198b2726cac7b88d278bc1ac5f51347ee52bb759f9ca73e8ce0c9acd6630c4565ac04022c5880a5167d0105bb9ac3b0ce0614a900f4d28f94214934efcca2dabe68a1bbf71bc8eb71adcfc96495ec4f0d6ad63ed45106fdde5451b6fdd9ba2bc75d80f6f3de70b276f9d071834bcf50c3c9955b2f9ec72f37c96493cbf25d367158604d140859623a4901bf6d9733ebbcc2e973ee7333ebb87f98ce4850a9f1dd71d129c387a620b164f70e02196bbf0f2d9474f969b444fb66a61f1c5b7dc3d59eb8a2bbe5633bebadb54cfa9577cf9fa55a85a9d84b0562a5f7c5d55da82aaf25a5715098b295f957c2d632a41a97b52f9cae4140592114f841c694214832de921090e47a08e4843b6d1820e2c28bdc0a449ecc789335e68e2c469cb0e47310d908469218b1a48b43043ac03326c11028621d08882059867b965f90d4fc6c2366f5de6bcb5d6ddcb5b6b1d034f66a3fc8a0a0dbff20b3cd90a8b600b24b6f841081320e125b6f5ab545b5ee5b8eefcf0a28b228ab0020824c488a9a80c7995d7783215cd872ec1f8d05f9e2cb4e237eb73cde79ca79cf1f98aa3295a7c761a4f961d00478cace0128509b20011dbfabf4fcb7f8eebce0f112654f882c4ca134980119b62c57f3ee32e4f569b8e5e9701f4da653c99ced2e43d8fcb7bee30cfdb12c37b2b8f66f15c04cf47f0bc2d6abc177a940c0fc7bcf73c979e634fbfc78411199e5872a2e58729b12d8f784c9143152988a288a1e48d60082d47801822a20408cf65dd2180952e46618c38634a17b19cdfac2d26786bb744f1d6635c4e7eb3acfcaeb9c9b245cb119f25e9abb772ced9b3b33c59cee0bf2c39fce72b4ff6a93c99a7f4a0cb2a1ef4d09381788c2bdf7d37c6779dc370509dec9de7f0b8f09d065de723785de740c848c177449dcf20235dd739ae3b15681af2821a504c314512b1ee09308e601a6209223666886d7dd4754864d4f0dfe7da937d4a9ca8a82049156d2041436cebb73ab8ee2c00ea88054a583162458a989562e5ad839ecccebcb7e53dff3c9967061950a08a3461e20415dbfaeb572c5f9fc800c3c21a67b47002a258a5c2e5ab7b9eac7a1ee389ce93754405f894cb2edc95e7dc613838cfe19c470b329ed3e0b9223817a1eee018c77949aee8214c125fc66821c67539828d205e5072f4436cebe75c6e79f49cd46289e7b4407aeb96ea08e0ad739ecc62297eb3be7e75bde56b1652b85ec64928cd93dd3aab5f28ac7a8fbf77ece191b31a85455b1e5496879fbe55619eaaec904acb531597a7ae9a19a94af05b35d1f8ad52a9542ad556013d556dd5d053155197b04b7880df615418154685a1d3530fa1d01d4bc4120943a5704af91dee702ef91dee10e869b8c3a1a7e10e8d9e8658682cf4cd6fcd546fa6eba8d755f4d64f5a9eba864277aa5375d2da8c25bd750fbff5d65b033dd55b0f3dd55b1b3dd54e640e27619e823509d4f2492097a70e9ac104ce2f7e831b9cfd06959e3ab8045201ab804e4f5d6e10e829086ed0e829586df8aa0ddff8fbab425f15faaad0f77d1f14ba538b6ad1f799e145fefd4d30bf3f9ac3ef6f7ffb037afaed6fe8e9b73fa3a7df5155c1ab2a78fedbab42bc2ac4e3f2d43d33b27842b657e4799eb7bda1a71ed11699634b98a7f90b14bd99beb39687ca5c9e7a36a34bf73bcf27bf3365e177de39e7dcf4f4e9a9cb9d819ee69d879ee69d8d9ee62732c793304f3baad451a58e2a755dd741a13bb40aadd25179eaddacdbddeec2fcee7607f4b4dbddd0d36e77464fbb2323640e23c23c4d15a58a5245a9140ca9542a954aa5a80d1cb58193f9cd0971429c50d453e76694e3388ee33830320798304f319d613ac37486b1113cc1f88d37de1863bc31d053bcf1d053bcb1d1532cc626c6b6b7a7ed697bdab61db6bdedade88ffcdeb66ddb1bd0d36d6f434fb7bd193ddd8eaad06615dad696b4a7a71a754dc9d3ad699aa6695ad3d320648e194498bf4497e812dd7b6f9326f72e71857cf97d8bee254241e60013e6a9fd3267d65a5bc53a3d750b85ee4c23f466ba9d293dfd6d857cd06f2bb4ad96df765ba0a776dba1a7765ba3a7f6880332c796304f7dd72f402a14549410a1a2aaf4d46bad4dbff4558b4ce600239f8479fae569bd81a2559c9e3a8552850a4e181c9963fa9e609ee6cc27a81c2b4f7f53214f5d6e2a54f4546e0af4747e797a7f3a0a720157e6984ef7047a3a899eba9c7b1a353d8e51977b7af926f4f714f2d4e7ecca530f2277c8a7518feb0874c7c628453aa3cbd339c553199e7a0fea983ae5a1324858223f5da648b3969c7e7a65aa3b7648c70e31fdf49512bdedd04faf5f608802003f44f4c4df7bdd6d70e4dc0b850b4203f8ea164b2c88782bbb210ee10d7a57a19f9e3242abfcf4540d7a53a59f9e8a416f5af4d3392b7a53a19f9e51a037ada2f77cfae9190bbde7d24f0f85d0db4e0f93e83d897e7a4ed24602ae1f5c3f4c5aedd536cca5baec7da00e552b562b46c63543f3c2e086637041cd8b66c6e5624d0d1a6a72c9c4b4582b711caa412b55a8c1318320f0f332b009da8ea0b20d00001000ce35140001b8860400cbb96b25b17de725bdba7cc9f13501ebd72d40bd8e2854148c08a13a1d5f1205e932665dc6b0286b5783f6df2e9586c0786903082d82b4f8992509628c254c52f0c429d642112c4c4451a454c513398e50720414534e8085506c7a15a9687f26a5484c9fac15e81cb9837e90ba4294589014565ac4b4a7c0222266c4f420124b1326806229c82982b85822a647235e1dcc1fd8e7f8d2dc41f83a27e873fb38286e107ab208010f5ad0d337df32697c752e9fe795fac457e7f8bb31877a0f0facedf227fadccff3dec8dbc8436154c7ce8c6d391446d3c8e1a850c1185a7809e20c2c52670861830aba88410a2c29117362ee88e00db4600c309c7410a38b284cd842c41953c6a0b282239bf782de7269f7e4fc6bbaace3cb41a03a5b1e852082fd0f48e7a5b515797274b0919346912846441051020923240b5060258c2c2bb0a2822962b2056498c08526c04082880d3f424aa004172a5440256a8618754d745118f5cb3aa241a03b328d26113640756410aa2393908e3c15f234cba7214368d49c3db575f2d097bf8d8e2ac3effc44348db264041a4594c085295688512fa1eefc287132858921a63c61ba22461d04ea22d49fce41fd8963e8a39e0a734689ae0f825fc12dbe04edb474ce69355517da750d6397cba926e6f05058a54d246ca004aae354e2d4e924603c6e037ccd9138d5375002092a31f496549aaa8b505d47ea8be6d9e0575775a1bf70d9b3e9a9c8696ac152076977299ff0d244952b3720edd0c401f18211943596706143a787681780931c8690c2046c3001149b3ea3ea4e6512d5440bb03c3951464c8a31b028993df5108315b1f933a4c4192768a3852e4e6162d389cb42cfa7eb3eda75390383de3e17cb6dbb9a94a9ea3ef72b9658caea784ea7f94461d37dcb26292575b969f68abbcefece98a296a0949ee85153d3d19312d4d2964c33078205e56c9e973099c323ab36fadcaffe92863e7068daf2320928683651d8cc405afe0c75342a2f3ae905282f935e68f27b2a25bd40e4a7d2f4399d0b1307dfab9ef4964fb349e2e4179aa64f208cb52e61fa13964cae25adb44989e594538abe89b8473651100d6b5dbf4c6261889752c7c2aad0016a0952126c08a18035585881862448583065fe5c81961a982cb16105a02c341755ba3012840abafc3067a4d03f485421450a912884c8c1cb0938e420860e458a6062288b9f6ee9ce03a086e88d7c00944faf3b1c38628953123d54d1c2100fa2a44145d40d5d809c884dd7d35dd3652caf586fd7db273f4821a242840d439ec4ac4bdda4e56fad21496241035a26ad90f4b097492aa4e03bcf37fd2b9d7af9adfd55c1091955b24bbf7247e772d4be83fb3904f6b377a2106f02f8d93bca820adfd530df5930df5d36bed37297c71e079272da46f3ed1f24df79d20a6a7c4adcd2534ebf7f3e69052a5f9d73bca55fb79cd3effb41a56fce35df9b7bfef5e0c1b98cfbc01bb78c020905e0bdf77652dc9cffe0bc3ac779dd80ebc62d3de5d4eb077eb09472c4a317d85ead6adb768316608e4061610a131a2617199e7081881f8ea254224f299d19a23427a9d06426a9c0e4c83a4d1a6cc0b214a3a2018ac478e0a1489818156da2c4a6175b968089515136adc046095848418c8a758528f3046db4808d18152b111a0850324429d669b98a4174c620028a580a9e912d5c7049c45258ad21350e0133845114a3a2a402e7cd357b6772c78fecf4ab6bf132b4e79d27fa169dbd9bb4da4ec4dce7397e8f47cda2fceb44755ed8e9f30d923b587ffd0ac91df4afdf26b9a3fbebdc91dc21f3d7536a687f6d86b6477247ccdffc1d499ceb9a0cbd6fd04e05fdbd1e07dd0600c0e93ec02f298c73cd3bc0ae69196c82c2afae4b398e1d9da1d96ca6422c09d457771bbae3f4f96b52922a3ad521d0a5388ee39c03fa9cf434dfdc1e3df61bf4d893718e9fdbe836e5b66d567ffbc7fa2604370921c38bbb2725be3ad0dcba36da7c675d77f4db54faebda26ee9ed4ab83ebf5a630e92402e58d599a37a1012f25ce8cfdd014269db38ecaee1e5da39a3433b2d7af5208f40883708dea8d1565bda11bac3e70d0474e81fe504a71c041da50521067704d49314c31d2de0d5b5451d25060840479b9b284b959d39723be24316d3b4b731e3d41c24313979899bda850435dacb11d7961244b8a3544877e28c2a4739a7130183621506041166709a90d1ff0ec4b1246b65c3464085714866887d0d6a0195351d2cc0c252901ccec501228b8a3244f4ba89668120b2cfc86b1718612a6504584d4a62c524f82e0f2a40891254f3583828ba83aab62041e82028b2628aaccac704541160a0a214cb8a0276d183df9227405b4d4da3a1304a628d3232b7ec3a0c08001c668563ae7743d2907f6a99d03e0d2c9ba5369144e4614c582704980298aa5209160a04186205b17b1145845c4ea28690276fef9240a1f84625dcd5594590cb5308b753657514a59c11345b1eee62a4e23563cf114a3620e9358a769dbb77f9ee9882d40312ad6c0104b81ce39449db34a13e88d5d30964dd6359e236d30d599b5d64a61726c0d39d5a94ead95763ac5114397b9d051322838002b8b1b2af474090b8f8c322a702dc60d4aa9a5e3b67efd06a594e6305ae1105da622c56283524a73123d9d524aa997bb1491cee97dc4974ebea3486b28791fbac1f7d4a728c97839c677374f517ef19d56e994f6e9cb719b709bb414431eb4f4ee8ee2125afacfef0abc145f5fd1d2af28e5bb9401becbde07ea4dbbd6563aa77492a168e9aff9e27773ceeadccb97b556a97dfbe7b3103aa738bc69def7fdf674dc1efca764dbe8bcace1820e1c742acb0abaeb2284f6b2c66fd892199d8c13d75ee8e937668ac0f215428d519f2f041d83a4104b61d2092577dc97aee485c8539f93ceea4da73ee50e9b41123dbddbf2943bea4bbf1e05241a4b98b65c89018927c088499ca7dc413348a2a7dc313348a22b9678e20d636a357cbf6f0779ea4d74d55d57e8f912c98aa2971496d9d0d2bb36d400d3c6061526f4020dad851ada9bc28b960ebe448a72e237fe2e5abaf612294a092c5673081bbe448a4292452640ef58296fa8d08cc2e47736301cd57ad249079b93524a29054261734a4dd3348dee1ed64bbfb4b694e8aaf368dd6229474993a4862eeac89c538d270965cb2529a59455d64a11d064d3e0f2d3e5a44d48655c99dd1052972a26921a426638e7f44aa5e8c306263a75e649e91cd897936a4e3216dd49153091c14829082328c280c00c4a34218392a52432c4e6131a86ba0481d14318226c91c512332f5c9ea8129b2e45cb7da1a5735968177416d21907bd714cc751e44814494c4396b0428803ac28912183113438618acd2f4b80c05802060c1902d04489142858620a32b0c4a653d1030a93fef425521a427c6e41cb9c3ad38668ac84c492a1235b91e6665a0e7a33824da0c31d342b1a2be11d700b73880b1a1b5a1be12334562a5adad2d01b1316d2d98b293a95654b81a68219b4294068d512da093456da76d8a0f24ba4356e90e2286f5226b3b6ed25d21a3fbccd2ca35bda5a0fa159ae1a0d74f074d1fa7510a1b11226a2f112157a63da82d0f92592195eec604617cc447333cd0abd1989d2e10e9b1a1a2b6d3168ce8a664483aff5a0b577e180b958bac686470fedd25e5af01b96048f3b8f1f61178f52d3e3a6c73e891ebba01eff0caf668f6dd14f9f2dc805d4289963baac6bbcf0f287072a9820e2e58727a633622bb0803403115924d1014a6ccfa0973e872e60e5882e4ab024871b6070c1cb2c8d2d5830850b3fc44c40c442973276b0018ac4e2044d1491c40b617889edc91426a025a8644b188b8b9c558acd400200001316002028180c874462b1280ad23899fb148010799844624a9b09c44994c4308a41c8186308310400408c3180a486481d051c42f72e9b97777aa675d07bb058039a27f07c80e61f40663eb5c01bcfa62b4932ad27affd79ed1e93977248a50151abd099d09dd7e9337929474b9aa2c4a832a13a6c5ede2190462916763638c7838af196c9eafdfac78b831904320d64eeae36e84bc9a14d5c15cc3c94bd7adaa02fe9d1969c9ca454cb1c9412c4c9586cc9eddf779deb7c9dbdaed8eb842e2703e219e10456387f739e57cc330a2f591295a7e7a3755e77aa33a7b5c21a9425badb591f62b1a57daa14cf099b9053c4806c6ce070e970078be9f9fbb204750e35d31fc2624b72dcd736b59e1356825e0e781ef1ad8fb26e125165c242ce29684b58b0d852a959d1e8aa8f860286dbe771895969517bd979fca2656452206fb1a56ba1b247315aca01ec3c7e3130320541e743aaa24716679adaa52cb6d4fb2a26133ffda13f365b70b19cea56a14fc742d6adfb39cd0400a9584fd103451772140650d8229d2e8ce229a15ce17600749fd4a15538cae1d593c3461bebd5299aed74752e96829f7e7a586b85d2d39aaee8d6bd0bdeee722dd687a21d5804a434d8cf8ed65885101273522a8c3f242f819bc1414a82fcb121dfd7d5bb537340467fa152377fc7c384a7a818a51b44d9bb31a5dc8951abf2aacc5bb5a45ff87062f0446b45f00cea6e1041287bd151d384ecf957013c13b9cf7d78d126c2e91994286103f5f285269df2ba5ae7488822ca53025959a4da10f53162b8adb10998eb746264ab8892e01e3cf1849cefdccc701aa507b0dce03c77deb3b90e8e6fca71212569cb7810f9ef03ae0f15fd2cdeb9a0fa48d264ce39194c15f871e8998fda064f76351fce11d2df8b792089f829ff8a8b3f9306782e7d2ae13de6e5c199f4c5887e32228733c2240a8eaab3168d01058e339167c08e70e8a3c8e7c210762ba472a3772feb151d5f70700e431ab4c0f1c3e3eb99b61c3b980db67fe38073bd02e8d2f3985576f34fdd1bd0904470dd87a45d682f4266c082907c0714706be9a8ccb7f4b5c3465a0424be3b81a63c3bfbfc5464aa2ee4d451392c8c146a6349c7d6533e1d167dca461ac723d5a647dd8a9fffe7d207aeca964a40712b120d13d7293096a34fae9d663ce3e02e9c88b6776a89e93c8cbca79d882e7427d8b4f93c287c83240267bb59c6f75cc551a2d27df50d3a8e2cf44d9b2cfa6aaa4e5a674500a133d01a81e5d557d150724bb790b6a52d6191e172c14a7743b6afd009f90e3954029ad0d3e4a92737344048ee86a824df7cbdb7eb5a189eeaeec26f705ef2162444dc798375f12915794753949b07742f8b74edafa7468dd70ec067770488a245022d47f7b1b4133c1a86100456185d90d8c4dc00ffe0320edadff2f427145a97a308d993054248e4bc747e6bde8f0a7ef4302220bdac7fa4020a280b904ebcf39489020d1fd5072005a08cc7322c48211f36f83a77eec0122896b3a603b44b4e7c1deeda1bdbbe91d7070d57a7df28e9118ef5ca4d3d75ed01565626d42e21e1e975f6f5991fc271f83d5c80a37ba1f33dc5ce2cd08611892e7ea731d551500092972f5af989697ad5844d5d59daf8389d20bed31a71ea6990191fd18ab06eca8341e18a56e8459ec70b5779ce5ee31d8989c876628c4b361cea7bf6674610706723736b236c5ffedb0dba87029954b7041103e5c4c250921c2f69dfd238150f88f9e2c11223eb00d58ab4d24ae212b6d0709d9d1dfa23af46bce4e3232f6530d85d6905f1eca6b721435e327fc54bd97c679f24194440480095890037298d60dca8710db47526136347485cb5638a97a88a553d371e9572af521e23f0598135385a84fc776b04566323330df4026c38b0cc8528dbe854cc58aa127fdb91e9014ab30236471b56a90ef820fa1dd8fdae734f0f451db22c8e389a2b4563b94a81f25e1004616f4bbe963b0b34878176313c7f739c1598edeac516b279e34eff4c4178871eed82050d302ae91b3fa5f32633b676bd79ef0ff5e57e6c8333b736eaa889a665f626ac09ebf57ef68764e4fb559d5a99a8bf4ad0d137a9d9fe3fd97e1669efffb9961492cb9150cebf0a61f5551e26dae28d35a2fe117536b8d6de69be6a2fab33d0419f118f6049735c8525a323e5dacc97458248a220eff82b75e4aaa869cc9727f9d31f90b92b1a795f7be6722246313a3a7b00ed1f323099d800286b3ac2b4f7a9211e37270e28ef79128fc8f30e9afa44b8ab8504bde22d9bcf2e465b903e18f50da1ac540eca06dcdcdcf71485e2c1188c2bf538414be3869145344c6df565a07ebcaf26fe10609f5584812f7f85155892228bd0978d7f8fac1c1e1ecdb72bcad8d660ff8000a79049c3817f5170124b24cc62e8615e086e52176886191a98534ba8d2b8b4d9fde7af716461c91610bef069b538439dfa4f5fc2eb43dedcd4ff3f3c4b082dd08d460caa1c671bcaa1ae9814580e978e00af36555362fddf2443d488f30989d570bcbcf5d8809720700a30f9c6b3ad0fea718e39589a1020b4e598fb18e4343a5ae0f2c75c7f9e83f76869212d621104fd58148c9fa14ab52aab6718682ef04a88674422be0c493a1ac738cfe2f834f65f3f9866b7431f427087bd2fbc3ca3a0d7bc0805e2b624ada25416d5cfb342650697131e508d38255ad17b44f454527d74d3a11eab00aa601066ea04219378a0940b5b2c62bc0408ffcbd44e2cffd01a433695948ce4d89a406cbd22378d642f49d9974445d8c4a7e07c2737c73c01ecb3298a20e23a10558caa2a048a03614a4f990ccf8486eecaa35a232cdfdd6f7023139f7c9fa14a8b2b01092509a819557f6ae4b654b210161eb03891c2f20e12606c3bff6dba518836d37a8bf392a2fe222dbb48e6e84b6776daa06862186beb7b9381ae4f75351604f9be18b758fb33a76b65426a0438cffddbcce501a7e9763f0aa900cfe913d319210907e8dd555a5814fe75488fc470ed26d97e378c0dec66d8b13702f6d801894b83c8cd4a82e7b8d53a5dbd345111387d1d84f9a33dc4b3e60f338880e2da490718dfa1223cfd6264530266ddd4d67734c5bccedd33405b06617c5da9a348d25516688bc43bdc552e7398e43de7b880576d1eee3dae1fbb43f6f55948f1647b218831a248cc43285d2487c7907cca3803939ab68a3f0c3a24c0004c4e14bb1f126010c2fdfc1b5d0783e0a5c032bf8e1115a05e103b4adb7dae7027eddd56dc6b778e7fd680e80c41ffbd1849a418feb35dede74e2bbeb87a9ea300bef74cd2bae2842e168748bb3ab7eb833c88851f96493653b93f18f1643b0664aefa74da0d7b00b2e93a2c625e2b83517d1aa1878a7dc32bec06e630e371f145447829270d14643ba166440fc556464b82412a8dbc3e604357c65dd3791fc3d159a7bd422eb834ede92f006231336aa5b3e1af548f73c1dd87b05967033036d46474931e35e2c6d91e05e51af395b709cd7887ca01cadc45181ea485d02878ff414b0f2575f9a58a53ab7aa24beed1788ceee1c9f9eb8410c7b4078ece03aa25e09e854ac1fcfe0eb69be835a4d6c2b5faa58026c6fb5231b3e174ab28b18354bce2caff191a3c6f31961c65168db9bd707c2bd35a8bcacda2c56c0548d09b4b1926e9932ac871a2d1db0e51819896f110958898ba4f1d69fa2fb7b13c10019de14551fcae9f68edcfdbb5a0ed8373bdb862e5e22f5f63f2bac4a6ca86298ea028929d59c622cd6e92652e62e5062a81fc0a8b3486b561bb34e4efc307cf8b6d257726616a550435464e0c7930f8910ff073c66c7fa3548b81d10162cd03d4be8c288807b677a13ef973efe7fe04822475ee5ffe029c11cf1a120481b5464acd7a94d790d24fad82a405c5bea5be01ce76ca2223eb32bd649726540aacd9f268ec07b7e15e6da078871b5d447eabd1e9a731f77e983608f60b2d602729f20bd437ee1343337077db6c89c5120944402dc0579a866223f6c434e71f5323e11efb9bfdc53356a2947ed21dbf4eda3f7c9984583992b0d5409903e2f52ef821121ff47af76b60efbdb70d507c60e4ece1afd58964d472f67e3d74f6fd811df0484c9a670aecd83cd0f422988545e0b058d867c54e67c2bdb900560444b4c2a5bb36900dd01ad412b494ee04706467419a050aa09462fc21d344be0e7f252a03ec061cfb8fc021a805984b4110fdf594cde7b499a4004bc060b1cebfeb0fb5f7590190f69ea1cb74b07eeda6bdafa01e04474b22f1bec5eaf7aae9eb2386e81abb5ef4dbc5cccf2f11a3a1e668f1051b919aca21daf788c7d12fe61098af18739138c79ec7bc2aec59391d5b74aaeaeb958545a480fe270b6bff9a5cb9b65ff87885b60f52aeca3cf930a2d4d2566fc5e5c223438e057ac6b9b1280bb2b05e84af701545b88cfe31f86090319e03e204adfa93a122a64314a18fc3e16a07da163803bed49328607250d56d429b9eb74b701484a323fd8f96a4650142eab9e3c9e7f91bc465129ee059eee2ffbd16b58947578a7cbd0a18d90ea376631a0b821d91884724cf7914a270860cd146dc9b08b43845e694487cbcccda227aa8485d8175f3aecbecbb7973ef5bfa709655f0926ab519a763524bd73f8304e3c6c23837534d20e42d0ce178ba3d656fd401342c114733bdfec66460fd9fdd7f0fa54043c499eb21984a3ff348bebc61ee9d8155841d6334b012eb7a9f9c720b4cd29d9a58e8f1c94b8589ef245d52caa9127848a7cf63e47c465efa8ca4f58ce81f6684163d471c560b1f445a1434faa8308a04fe5112ab6d8a999b8d57bbc76e85af9875db6d6e10567cb1257fa6209e64311be1c329dc6dd947157d02d0ce666a6892564966bd4695ff245c71d41d99ad896c1534b2af8d1ec3662ffefed0bf58812d8f2d77f2d873788c4b1f2c6abc58ee7a2a63f91a65607e2dfe2db890283065284bbdda0d4a4fc7e83fda1249a663bc393d51c89ff96b77e64983bb05a2c90ac4492ced2ceb47c289132a7146754e3bf77a66cb157d5919be3f7d6cb8454499225cd0c40aaf1e86896a74837421ef76d57347a4348fdb0fcec3232886ca43165dfb3cc64abb77c2b7fc641256597f9a5eb10b1e9eb6645ad7fd0b2dda094b70123c01e3aa47b4d0764aae607551b32f82d631b68e08ad4ecaa7a8ca140883ae91864c4c66e98f37b1658d337e803b81e61513f8734d9b0fe4911e042437c4cbfc24b08798efc4af10c60c0d351c7dd342933253f4c57392477efff1feb6f3170aeff6ebc73942f7339115b9070bb9928a3c495a409f341b4c0edd5937012fabe63c7d7f59f6e6f4c32e23d135de6ee24498c804004eb8f4be17c41fbf531b758255ac0e3e901b70a3359b675a0a5b5c0d975e796d1037e39e647d5b9cbe4717b874fd455f9d00a71f31cd3c34acaf78b085ebed120643847dc5eaf16ef45df29198fddf88d3c6099dfade6604ac469105d5954a3e6d1f9c1b159eb16e6d9bb07047123116c538ae5354158d3fc370aa5a7b265b847030122fadde9b6708b8d8c971b9eae9119f5a3d708ff76938e990d3bcfba4016ed1d12b17db269ae17790974d30586015414127fd03b4ed13600863e7c6c60a3a27ad145787c0846e7b9b5cb7d7a187f3c6b3d64c6168c5e7a6269812908bfb20272ae45199eebe89230d629039ce472107b05952166af21a26c6fdf73b6e221c198d92adb97aba31332d382419ffee1441b2e860d50ed8e2bce552a08b0bb52c4716cd56f58ffd788fc916c3e43331917bfbe42e7043329fa7ffd6521a9ee3e6168ba73315b0eef8ff5ba6f616c89ee4fd57b3ef3586ec2ab25cb5849c4a01190e8488d7cbecb266f63265125d1c818922e845f506a1c5740ea37eca085dc2f189ac027a69c8c774490c8bc294cbd32425c5be44f58a669eedf1680a185c72d3825e2751400c54b357ee49dd5f748f157dded472f3706b9378703688787122897c7cfcffba3928576f9a50c55a96a030ca272137ce18f1ad0157777472e23c3d525309b747ea04b65940e08d8d2cb7acc34bf1a8a94fc7aca3676c299114ca1975f09a6849aedbb2434afdd3bcd5c3b880b27c0e9903bce431fd6b9da4355f97394bf662f6615c62e61ea6b5d97efaf16a9e815b6cb8aa94ccd4b8f9d4da6be2b810defad562a30042399fd0544ba0b353e27fce3d04cea4be286773d4dbad4811b86b89db52f95c8ac3a73367e065c37c9fc5c69b50dc0149c70746731f5e1e0e18a2a78c8e274a84f2308be168f94eb085125044d8f8fd8e0f1b4529fa482ecbdeb64921faca214478fe7b585bdadc57f2b2db9e5cbd7599034cec2f887fe27ac32f974392f8e90f603052cdca3723f2f46e2a18c785e469ffa82781516bbed57046a7b40ec006cd01c63e35b25c4eed3590f6507a7673d0a97038a8034904de1120d8b0cf184fa4964207d498ec5aa380a31a31c3abc8638246709b00d77b806dca64e5e7d79cab306b095bbd2e907957b19888d2db8325095f57ab6fc0083f1d5a5ce28fe8ac47924c9fd8a3d2f798850f61bf75b914772be34e939b498f133af7d656cd99671f430be670e6a03ebde389162dfae2d572d89717c1e6b0f4bf0ade3f0c9c87e9b260289960dce6ba35b9fd8eb32457d4dcc05e45db79685ea0803560796cfac1b2d732017a911d75f3ec1e0b030be3f46935248769e921644888307b7d9b08f9745280df931229994c8f31ff5c71112dfa920f736ff4072cac8a6ba771550358121eb34e4c3932dbfa16d51d0881c61a0a484c748d0cd0b01c9f0d4b8544eb176c741bab233a7216f504ae650fdc2907e7dcd4105491d3b3c17a1ad631d18ec2ec506d287436110d62c7b7b6b03c7aa8b731e6a8d3a96d565fd709d4c2684bd558c29f0bd28d0d016836b4b5a806b9eba7bf8c5b2a3a73ed23ae53e78f7b336f507b7a6e93a8e68305ecf7766749dbf974024c17a24d7cba7b554219dda0a2a694e0b6a9ff861c846183ea0c9b036ae24a50231ba644a35047d9f97133b29feef476131ec18dac3026f03ce8759aedb1a49b6c0c5c9ed98c0594d39cd1244b6d26d41dd19981b7d33e4126c97e26228c3a3ff7302cd53cd314c573b6a89cdc9487a7b10b618b82408b1fe778c27021e03cfdd5e4be4ba3a99ace7b37d06928e749b5c05a614173ee546c3342c37a9d1c04cb5fe887db0400be270952bd739d214bf6b317789dfbfc5154cafff61d2cb03c86fe302e8263a95da64d582fb17b8a1dcba7c6603f34025558e035b94acfd4cfd7377074f18c2da9786ff66965c11dee35e67b964971474e7776f9305fa47eb6850ff709b0854407a599ebf01d611b5834e31507eb2c8ba171fa82bbf9a8962ce5608a009f5825d2613cc6b4277fba88b83c01fbce483b92f722707790d85e50e81b647c96eb87e3f37f811938c86f6968436c2f064c41491120605641460e443382473e40d00ae41f4b381101e2c35b5e83bcb3fe0b533b2bbe331c78a94e038eb1996b8f16e79ae5ed3eee34fe0d70eb250c3e8f3784480821f37cdbd8fba71d34d0381d191105ccaf5b949c38ad588324ea3c7887d588504c7e3de39e472c445d90301c65a600cda254ca0d7d81192bee43e3ae5c4cc765e9476cec01ab81a0639d7b0d60cb0e321b0f332e6c4300d92022ee43744e4e47febda274959a31c63413afc28e3b124e21b43c2d945ff941307c239bfd5f142b05f3f1be5633257636ad5d7803aacd0c8518e6218086dbe35e364a12f3340f36700bedb90ecaabc6b6652fa959e389d6ed41079e63c9d59c3a0e8ae7cf5df0443f8f6f6d679108392042d9437782df70342af49b7f5e3bdb1b4b7c57a18c4ba7a805f0238d3019191ccced35d20e6303ebf86b7814d4f7da306d4cac6ccd286995184c0eb9f8228ac195c42c006704d7407ccd9bf33eff9dad7bbbb5a3d413d6a7b08f28a1a353820ce5ae01dbfc913212db2c79542cc89e2a974f880c2b4108822daf9c70451653700da210fc64842b3ba522199509d2d16e0cb3ec0a51340c5a2c8f6fa840614ff4e6b0eec71c237cfa44465d60750df6edb99f65df7f1327b69065caf3de2f15ff3ca5bbc388b868bd083c9dc03d4125b67d7cfe21f0cdbc0539d1d83e6436562fcbd413b8af409bed9f95199538eb830ec7d53e9c7fd25756fc80499310a012fb252322ccd0f576946b41790539be7c94ef83dd646d6b7020e36ddcad8909e6e37e97c7324cc70455e27d35173f85044f3d96d75551922c8db962e8375423103dcb204689920b956a08f2d01e2ae9584a3513d2c032fca27090a90e8da6e982426c0199a613f735f51d08c5ed3fffd89d6bf40a35501b75b443e9bfc2cbbef22a9f05c7a61fde37b18bb852ee0292739ab619340caac0b496eac3c1b277e63089fd012a9702e6352223df4d3721185b7e84eeb048d6e35cc0279f59a252ac57cf4bbb1cc5f31a7c19fb8facd8fa86126b68fea587b7a10f27234c9fb036e61786e8e15fa6a791a64d90c79e10f541ed7310652b6b75bdb8b196a26a0889074e9b7165323590ba95b5e6fbd9b784eaa97ad085453b88cb0f0f19ced07811cdce9c5fe79446b4803b0a181e08db53d3eba798872de7dec5da5bba4d09a7f5945931e2d96f26cd8c2178beb0dffa5f51a4a2f8e254218dd0486c0f49fb9344b962037386e7413a7dcd520c230ecd4e3e96406cfb9a20476fd184bdf8aafa79d7ba1875c6c4ebcb33640d364033b6b2f12ab6afe5913513fa64e15ea554b0538b657cf64476ff27387d1db30c5fda18fdcd2bb594da4e79861cb1df8979fd016ed3240ed00b72a1a682c38330d22aa1bbcd76bc92aa281bfcbb76961293ee668bf882540a10711db23358810995b962882166aa1c79cece2a0a42ea50715fe1c33b484640af20e5d9202774257147a3c5facf98daf31363860598f4fe56d59d2559658eccf8ccdcff0e66678faa9236dd6534b5b642d9ac1f64fc8f732e0999803a457a04b823d9591c632ddf15872714224c5ebe57f7215c0b62d9a96297d17a19cbce31b83b834c6115bc476169b5f5be4683fd7952f80d3bd28e6c43826f0f55fa4ceb2138ef0cfb95424f34126d089294c646f49b5164a5893f07afbd545e10a8497fd3035f0003b269ae2cc8a490aae3d570d2fb0e7bfe2e64ac9490b9158b06d7352be8d8c06c095c5e835c4b9214244691e8a9a7d24dd882042119616c33a996e47c07ad16d9046fa9f772f17717299dc9eb019e42c719351330ede2675fc7cafb44921748c80d51c47b3a7cb37dfbd9a8d33d205c169b482f371be51bf3c54a66364e210ac727f7ecc8c31970b1184a2903fb85906efdea56167a24d7d2e57e6b4571ec6441a09df633957146bd90460e8df7b7cf2b46ab5b32aeec19174d5f33f1af9f86f76b064d12d45765829453d993539136a972fe21a99c4c309d83ec9f79228382a6d5b37cd849e3c3ae9f54a479f98375b27b34a6536662b057a3cb3bea0f04993a3e00b25774878d135d1b18a92c4464324a87ecc14be1aaf73146ba7c4c4a5a00bcd552b0b204229efaeb835596c94b9992367ae1285c89daa74ea513a4db70d9740923211a7bf8016605e9e7718db13cdef5144609fb827715abb0d787ffe4e0079bb3ce79e61cb07f1ae973b03a4c9093513e4fe4804c83437109cbae66618eed9dac3a093d453345a5e8f9051d0328dd18aea29bf405a9a0fcdad863f3da4323a4652fc9311fcff7c2e04af7fafdca36cbdd0338fadc459e3ec0bd872d45cd1bbdddba1b5b161868db61d08dc44861b36286f566543e702f29192bedf93ac4b895ac96394ab1fbe3190a3125f7316991bb414a8477d8a590c2ba7c9a2ae7b30d376b6be196ec2933ae4e158eace2766956b18ee00f1bd892f321f33f182178c2925a1c6998a3bf14e68a4313b7bf9718916195d261d8562e555e0fcc69b280f9ec566f0fc89c3c575f4e5925bc430221b79655444d93df68f2e36c99343f109a34fedc297fa687f34dfcab1c4c1b09419a7d3163f18779e30c603578f44a9ca91273a938e5304d6e39219c93562cfbd50a3ae884c26d93e2bf718080fbb2a2ce4d057359d1414f0325c6dd2d89ebeb6c46fa7f136ff5df6a3c9f8b83b9df02b8dc580b9e2ebb4519467427f7137fc4f11d224bd22a24bfeb317939e22886a5aaa0ed1ec5c6d9183d4e5f53eb8550cb7a750f193eca0bd375746145e8ef778d698fec8369cc13162d75cdf7ab0ad34de00860a8b35e7cc7f55c3cd686114ae80b9387e9d37a960ad2ae122eddbb2a3c18e90e47c0227203ea26082da525d13928fceece8d52ce80edc806846935db041045cd1fa013e0a09d184b292c5983aa185437fea068b6acc1d94ff16515927629d2b6ab620a3bdb8400c2bbe8073558a469dd1b8b62b9acfd87418d23be7076f446e056b3cc3c332e3d712ca5f7b88c1120e068266f1b2d5d549ef0075fac3203df0a251a4b02d17ac6afce13301fa816f5dea58346471f9118a640ccceb98382590306718d15b9110c408001349981b77622a08ae40832eb6bd3116b8c6f120d75ad1f25f3e499cc090e27605800c922ddc84216ba7a5b078a33b95c20143dcd1ca55ecb90a1105ccc7cd0a6863a1223c9a55591cea5bec4d76d909d64cfdb80798ade1db399bd5413c11a8609efbdcab335615295ab42aa0f3a1c4ff4b8688fad040aad35347ada09ba310d8702624a826e76dca6a302d374f4d32437c6a94d5389c39bb3a74ddbdaae6d09d64830b2373a1696abb4f4b83e36adef818256f50a5e4586a4dc737ed661358e0f3992aca7281e3b677544b1a929abe8b594d74b5f8929da76a94d9692456d4face45c8209da8bedf474bb0a5a38c5b2512347c098eb6ac3d79267f7fa5d6428d0299f87dd93af2dcf6fac7d390ca2bc5c95331f11361b6a1a2ab057db5e4c2229b1abd41d7cdb524c8431253918324aadc8401b8cdf034e05d823580e9a859b370f71b04705cb1a6e22fc8fcef89c8299f16cf1a482357e165f300ed8b73418ac7cf5746fecfe2e270d666661b47018dd204e845e998afb6057c5fafdebd4bd4b2e6c7081c74be3eb228c0c3237c4e8e410a8d0c39b072266533fb187755fc437077ae3329b8149b9f8571472105fb93902b8962a85eb3beb3071bfc889c158e9b177d90083386ce1370d97b19b71a5cceb299cf4e4821dfb7d5d8a56de2e3ef534f3bf4ab5d2e8c75f9d770101ba1fb05e0cb35339db0d3898e3214f1fb568f5980ecd20d9c6a3e4bcce132b678de1282411d5a15fee61c96e548c43dd4d214e8126f13c6af70a3c1512ef009878cbbc87da9de99cfb8be8ec542817edc4b123ed4449c13a5970645deba8c3da73abb4d31e460a7b779157abd4fd452eaab07337f8bba3758c8d06de85b028fda338b6878ce28cef7788bf5071cc73038a79854d41745aeeb92199045feb9b55907bb35e0278d2e114afd7d80e09037739e31b267b4f60fb5fb642c8b7aa3e6519e11350b7f88d6fe24228155a663583f1dbf003ac7d5ed49eadef4d1ea5e7e3e650a7c98002f72716e0e9250ab0daa95e897f5d68644203971080a52b5569951d9c65831005972435b024a92aea509bd04d7628df0e1a112d202b507119c574142d1f0b3d0ab8f133efa062052bc884f3cbebea5ba6be371aed8071b45469cf7d16eb47cf658baccdbb8d0b98cd3bd363adcff423cf658b2718e7b1a481d20cbad1219342de06c034e84d979900951217a12c74f3127950d1191bc691e203bd3671caf2a545c3f83b36c877e1225b78b0b9af9ca7db2bd7745db70222c3cc23e7841ce76e2e670895aeac444890eb664e748323439bfb394b19ff2f5474a84d18abe39d76bb0bfff02e50fd1de0ec8ed319b6fc220dca1d0afa476dd352e8a89bd91a28d00903482ffff956f9a0a9234ba2e94112964270bc19d65eac27aa1b878985a29dd3e188d6fa319faafe50d094abde4868c74d12a04e3e31a8ed28426c6164b8bbe23f8d6725addcb4537f4f8d2db8a782f48eb7d76d7cb10ee1112f39f748ab23e7ce842b1b4f3ebc8649dd200f0e25d9edff9c18f81adf540c0047ab4640f91230505dbb0c0f8c12106b94a42e746f4afe06f9dceb85d9ccd6713b42185179e1e5807e9535ae37ec5d778c0f194c56f7b512a5006e62c64a21cfbb6e02647033d3f20fc8ab085dc27b5278b282f55aba691ac17f150c7f4b7fac5c15930ead19e732982916af9b8fa6fb0cd8a425af455929ab55bf52e9dd8f4b92add4ade0110f14ad64cf96a5fc85eabae43cb847921a7cd22801832d07f6c79b7b2339942fab66c626e1a6acbcb7083c86f20a4b19062f5e938e94ffd57d21955cb996a26ee0e00881b3bd59b6d01ee509350b4d0b9cd6a99660e8362d8fe6522bf872e5cccad89d4818181178cd296232c0a4d3474daa4422cd0a450a4f0c00f659388ae906e2040d9082201a922ee3512ad175a10cfba9fb9e6f62dc3c9881bb782d835ea66033a5c425aa60c389e489a24b6b48fab3c56e7042fe3f1a216b9860fc85f16ea136cba4a2d1482afbfe4fde90e20c2f583ac52105f5a39d89058feb96d4c960bcbad657118deba6985c5488e0125daf07f65d40279fdd1b547ee42ec13440c6894dabb0849516ac745b6f26ea0684a768a3a36aea299cd7d4c731ca57c4fccb874813912fa72be50b529a316fd6ea5e3c4544c702a533ac89d0ae20120433595fa81e912f83aac3b2f9911f7f00d3908d20f7832f8395355ec6a1ea09ea0192e183188d6adc80b4f122250690e3aca2547b0c4b3abf22b0408569ec74adc6dafad177a72fcd743146e8d39c4b5a17dec15c2bbd8e8394f8baa3007431038ec7cdeea981ca9b8f52e21ea288d227ff322b2965a1dd913ae74f1e8d54c90f7dbadb93a94c6d66637b31b94403c84e881d7ac421b854f027850396a13df8d00f58271452aec362534b4e0803a14313376e568731113b0a4cb1ac385aa8e4a0477b34f76152c908f4bffd71682b57d34877d2acb3183850d1ceb626e4cfea91909785341720df031c32c9e9b2c98d65250a4338c9b2d41c8f0a9c15bb1350e2ef876a1bc5bc98203ca7885d7beb0e2f3bd16b246326c948063f572bd8d71995a1ecf568dcf59cee6aa1ecb23a24282c2cc3f4945940127554074f084523021e04cf52c5e4c356678a7adc8819ecaf1bf98870470dbd74dfc22e289fb878c73c16a6af0b7405a10d72175444aba64b6d0e30b77206a21b2eed94600b4ad819c1c5a56ca6150232aff0d154e809d8999ac2a50ff475144385d0b57d7437f006a8af30bb3593a3e3709eb941bc5fcbb58004c90e0ae99dfc0071c3a115e6fcecedd1314cc1068ae1d4d757fb7fc008512238974a1a751f982dc877ff790d03c2a8ac7effaa50f0546e81733d2b8c316c42d051c11940e12b6fe4b4b2a4cba594e4e89ec10971105b00d019fe2583e09164fb451ce895c7fe1f1c29592f9389dc180105763c43e7a0bf10bc927266dfad1631dfddac4616123d2b4bbb82cd2b5035e637882e4aaa2e24911d98caf078e1cdef6622f778b9c464d6e13e17f1391e6ea0f27299b029e99d275e4c8e1a818df0435eed999a6b663a8150f829f20dbd6012b5ac246b44db30c039da46d629a45934efc4c30ab950a1b76c4cfa3562303845950766d4e9e000d44811c1e3457bc489c9802f3e6230d519c5f9b19a8fca97a44a01c487db3a62681938c2c993e4fbb0a62ad6debbbe3b77b4725a3ff74bd874f90719a9cb89537176722d5be2c6b8115cc75c5c8319622a4316f2afb55f652a12e3c82a716406b43d5427bf15e20b7d0bff022e46804e695d2340168949ad54ed5f888591900eb1b308b1ec6ac86531a2b6f258d319113cb6bf3f2c4c22f9798b050cecbfd238a13b7bca0b5ea83a2c9701f6c9a7fff8b6d175cc86aac3f4b9585c4ebc0e8075253462ac0c3ce7ab07cf786186ed336246c6f5829ad69f8bb5a945bc01b90e41bb3cf874813f3ab16a4264ae655f239faa8ba7fa99406b9e41abe318f4cd4ad64e1351f6fbe43c51297be3b4ad6e6b1fbcb9ee601d497523bba5654d06f8649cafb84a08ae486d8459b22664efab42ff221aec2ab76bd5d17ccf7b5618e4dbe539e1ac7ac3810dfcace4ebf07d10439a71ed9d1cf99ab407260d53a10e0df4dc5fb2877ec18a1d73ea1ac6b4965465f63aa7c087133ee9eb04e74d0a0427eaa5610994f1b463a17015a4b6fe5aa88487a28f55d739c3b3a0ae4dc7ac05ba0e4f4aa0cc29747d94ae2968edd7c7bc676e7f937ad523ecce5167a19c42a536d13647a911af548d77a02624e7d898045db0a5a2e27100c427f460f11ddbf1c82732e7e0d1af26141c6563e7c575a3150293cbfc9886aa9920fa25083fe42ae92b173f2a5f5d4ff8ffb94e3485f6ea042f4294ca0b9e981c5e39a1734118a9bdf55fb7558e03836daecb762c52c88f3707cc35e1384e2c144fcef8602858950a17a537a81e0bd515b37bb87e411d8f6299fc3edf8f4366c67d17e07b3d823c6d0c7aefbe26ad4ac410b090473536ce75737529054fa2d537c6b06203e5e33a971811f4fe5ca49a902e69fe582ff6c96dc822302a823b9670eaf54595eb8deaef9866542446e818d06c6bf8ce5493516a02d72b6cf98e0193cfd1ddd7308f0fce41d2f33fd8b6d8ecbd9ca169d054c4b6fde71c8b7bcaacdb4a683b8c849fdd653851901d729fde10e11c28f50049c65d28a855f472056ec302b1de0f38cb16484b22abfb0a2a1990916520ab13a9c33a7f353e508f505f3ff93ef96ebad8514efb1caa349096f69634c5b2effd8c03fb0727bf568f83b7152836c0d95f2c8e885c5b8d37e17a12fc328f31c0532d75e94d9ba708412a4942686365bf5bd4e901a53006b0da8784c54038ebdeea433446c3b76c8d2b0900f6239f53d7f82395682550e3e23aa12d2e21723bce84496c17078a557cd8dc6950a8fc50fb04f91efe2eff7c821f0b3d18484b6e8c4e05e7ac420e88d812c4f2e534240248862436f26bf8c3da48e4a61c433ec8954f96799520f1130e5f622371626af72bf4a7c748e7e3f5e962f5a148293a0b36a8a260d0f7e366afe057dfa98f6ebaf41758122a9ef60643f491546935f0995df01664c07d03450751c66770c8918c0515ec4ceb60e918e07a500ddd42182da4d7a09c3667846dc9d1c9e979cd2ed77f6d1b87e37d512536a292a3eef76a43fdb1caca47460c04e129d8b7a6b2f3a189c23f15f0777685e5fd9a48549d8581b634c861d0458b3ca3159e2e6126d835a15f92db8db7d73a53885412a0f23be695ac6124b47e9f49eea942120137c2720c30e02bfa63c57d49d3f6fab1b0b05e6abeea8b9cb7f1a6d7119a88d45a8d84693dd4bd71d86bbbc63e16c8d22b2f7ab55de032c454fee2503549011da30ac194e9b47944a228e66ad735ea482ea54a4534d1a45003ad30a39bb2d4257d6a293b6d41cc594fcad31763feb56185be30f640499011f022cd8def44d48a4f567a8e88c6209a4f0f9d9cbcd355d45c74bd82e4f75e67ab68f51921bebc9c0eb207e8b1042285444c4ba73676b9bfd0dd0cc55efe5afc614f9de8d780173ce562c27f790bb41ca435f4505d64db25b77bbbf0b0272c5f005a87cf9743dde2b225bc3218952f2997a2684fdf01a8ffcb8edcd49e8960561607a9f3a7678dbb20880e3276b5983081ee3e0376daaf3008e04b69b0765dfd63f09bb8b94070e0ea1a06b30e6a76f8002cf322ed6fae13a747008a3a4be36288d41d4f5c42f09f84a2bde83418407af5196d0c7aab373f38033a6df588bb252875192b838799b65d9a45b364e2de70d9c9d7e6a9bbae4424515b4f439fd580871285a4e8577198fc388e6ee21492bc342597e10ac365741b17238a3b41bdd603034c38c93dc146a0b07d3609b041cc337064f2459361c60a878e4267091a6038fb8f888dfb9056c32b653d82d942cdb25c5f7a5c3ab3ca2b757393f329919ec952b754a2cf580bf59712e468a905f1c8c7d0563acb382390c367c47625bddcec6f168b21dda368cd4d20186585c4aebbe515d879903bb2d44787b7d47d2f5506b19dabd0a6453bbf3668c9d348b4460c0b01e48313babc46a34953864ad6b0e7bd219e50b76dcd4473116bbc7d2a0485421fc267a617b1818c6c9697422388c21b01dd29da626d10d8fdbb2dc3cd9c7664ded8ac223156ec514065bab9416c0f3645d236b58dda819f20870c501067fac8fdc719dafa8e4bb3f23f8e01389e0fe771cf8d2ada622368eeecce773a493f9857bd97cc81d7544c455a4fb2b93a8425d323150178bf6675224ccc694ee4bc73de85282bcc3a84911dd41912d7a4a8c6073afcd0bc124b4d143c808bc34a090a848b2fa03bc41273cd2237c8af8c5b84eb1c0e3dde24ef54d8aae40b2b7c2ad2a73cabed96c325dc8a59facd4d20ce65dd9dae51408e70a26c1f13bca2c74646033efb28376fa9a0e861ca1e0c25de90d75cd3a63803be27c8e61624efa37649fcf592c8e99adbfb071beddbbc89b7d17fc1fe17817eb5bb7bfbed51362e62e6770b0702bf5e9fe142926b6d7f46a4189943460a83731f7e3e9fbd2946a23118a74a11508ad6331f5a558c66ddcb89e80c6ab4dbf0701e2f991de814737c2ee4e9e70e1f9a3087273a68503d64fcd900f9b9fd44bd19bdc34e664f3b0d7983ca3db701602c1dc2eab06b7bf24943a0c48e96b13a898a77540832ab875649455c65ea9185ebccaacc45699eac5828e03963a6d3109bcfad5f1e504e10b2495f5778b82d8538ac671d75a56818adf76cb1e394088a0d72e00bcd1a10bb1ec7e73d983e282b8bc0b0e65ff63dae8f1f92e9b2b142aa12d5b0872a2c84051f50b516361e55607ffbe69a539e63bd6af84d604c0aa4e9082111de72af4c461e09c737944e1aa32431fe83432fcff74fd785cc19c6cf70ffedb4f3bedcdc4a75e2d85e851619ef09e3f53f99d986512f75aefb593b1dc92789311742204c264e6002b49a61ba874de0c30185f5b88f8b79981b3cc33e8e93f535127131bc8bb78979ea6dcce390a8b6f8abf997e7a98d19a0dd1d6752a870b66a9baa55145fcb90cb7d4730891f80d6d7b73bf1aaeb8f7438feea4bf2bdc362abca7b59c0ff420d2e7ca613b1619ff63ad5858cbab84b3f45f0a31f0e2d43625982b3640021e4495310ea891b8b20d2ccade27a1269685441e51f4ed7132062ea4033e21b69169730086eae387def170531a2cfdd5c8f331a61565e6ecc31ec86e929f639c948950d4152138772fdd9225bc86c98efc327e1ed7d9aab290667179a1ed343185da9fa45885c428f79a631069d8f8c9e44da59649e702abc17d7958da2f33cff93b584a782e7928878616fd575968766c5a1542a083134cb909f23baea326a7a1e15713ea7733beb3968958969b2752217e5eb3760a9152b2c2f37784444a5095996947e095886d9794b64fce15c4bb03311f10a8f142fba566ee6402a7984d770f57c16ba5a2e4acade711469735543fff5984c90708108f46e1069587ce5f5a4fc409804a9be140ab566343f44f7e2e20db9427df742f6cc09fd4a5fa66148e50fb1a34ad399973e06e9cd8c6a02007289cbacbb076583f40938df10ff707194b4f7f1ef00bc4337a4e1a19bfdc61936b28b941d99298b99bca120732249fcb5852328b711394b3300b21ea05910dde18f53853e105a127f79da2ba32e2f4c909bbe959f3d6e73c3a311889cc1771fdee0284bf2bbb3fd9155490582abdb7f9032a14c66ffa99952c91996be92931ca8dd8cdc40cfaa3064aa52e8a896c1dcddce07d354640c74a829335d53377ff0b33cbb8509c1a8687cff9668d384ef64841b60a00cd1254b2ce6d0bacd1f4be18fabc3b0e470ab3c1f27a0e7c36d7a3e0aabe72392bc9704406eaa359b1df9ec5d24bcf71f421f82605cbac1e39dd170a4e06c8c992b422d600f5350c73e0299047cb6830f943ce9263250841db1371d257dd03690c148c8d81ccfc5ff7067e2545888bc397e3dd154269989911645bc78592014f1281ff04fd6721d33161bc7e66f0c19e79673b20e92e7ee3b8478e041230b5bd4e95909962c7d722db19facc0ca02d4aecf6443789848526139d92bb5aa290c969eac9f010a32b0a4a9a6edb230b186910bf91cf2a9e7c125fb8b6d855afa314453f6680cc556578f765739ea87f7baf82ba6c2cc93613392cf105803332c4894c06fc604e9ab6a111035fc63b34d394e0d8c016ee83d9e7eaf118c10fd2e89ad7a028cde0aad4302308a9319087639353f169a87aaf23ad2a89da2815bbc14bd27631de0525350996ec188c8032084e9588fe7d5de97bf30b1d0c337f8d0831dcec0028575c78154b4c45965d13e6165fe71baba2822655fa83b075ee76264dd86b2633764655c848cc030ff3faa251c1a25080c8a43d629ee32cc9e8347038536e6c7c1d4cc18c7dd4eb1c0b241aad6b5da0e150a8d59a200f133fa812ad6456c35745961ad6962906b777d91a65bd6deea73c564d88a806560328055cb0cc736450be61431486b3c5d39f544e8b902f02acdc22912091b8c7731c455a68a309d28adfc60d060e56a9fbfdd3d22a4d6bf6b911283bf7d29907d4fda13c0dabf289c8d27ed89c0df5c14ce96772d44e06f5d1e60cbbb56e460b62e0f62df432b72b0f6f9946d104a51a29ec69f7c827bfe44f394647b3ec123cf6ca1bfa1872da39be2a534c92eda2f8911ce4950061be58d2043e4601718787a7748d515a1e224cde0b2a7c04036a749d99a6cbe382371ac13ac0bb244d56f1a0627770f2fd844115976a92d61e35d286b2c559bf1650e6117a48c5195d4f4f4e64b2ce11a6da68e23e6aa2ae34c1330561541398b0901d98615d12f4efd503cc54ff57c289c54254bd3d8ebacc9e56a3be1726e98aa2d5411f040bbff7dd2604dd565fc3ab968418a1f00bce1ee45710e0f35ce3f6a5779e10aea3cd1ac601bc60f9e55e73fae9d1d33edcdb01c57a2e6e817de729e149a3f2e37a046b5a22bafa00af32a03a8bf4195d69104aafc5f784ba29a59e44d27739510fe90c551043047f5c7df28b408e727db699bbda1ddda921b342a07b2cca676360f0a01f4e3c1700b6e5f1b0a00de55ef7a6afa0359063880b5e881f820cfcfbb9cc0661c76d173e3ab0b4e44324c1a33b08e7fcb75e41e0051399cac6f96fa8d9122322385f34401379f5c9ad83b3cff1af0e475c0a9a7800a79695021e96fdb58b387754075583d32babc0fd6e72723f7d3fe9bfa8f8fcb3f49a1a08debf293ffaee4e90487d87652cd129c52aec8b42908e7488d6fdb4b46adc14738e6b78b87a7d7f30000e9c51df08150121846838dc36c6188f5c3471aab7fe9547d5156f0e4abd78d1dde215c02016d0b019e3d3c735184cfbe45256ead43aba379658cc1f5cc468f4ef38ac47654fd62931225165c33a934688d7695546da715ade6b0b957f45c46c428bdd7bce879c53aea11489b55e8a762a12404d2e366de6806dcd68c0e0f99dddcc72020abfeb4907e7f2090bcf25a7d52a6912d185d2fd54fe6a7f20f869a057a49afc607aa0cb9cd05eb8b1a76d77f37049991d74623d915f555dacba5f5497058b6a36720be3ce049da86c63a800a8662a76a11d030f66c4c3a2a5658a32a7017743997a0f15bd9056e9f11a13bff32492093bd7b05624ec2f56aeae4b304c4e7b7a1ce39bd2cde9cf9856ff165b496b844c97e77ec178db5eeb08205972569a6cb09a39c9bcd88d084adfeaa50a7c8f39533d50b688cc566482a0a8813c9b2ede3c0d7d6a3e164a478541c782f33a2f8283321fcb8000b397664ec3b881f4b06f54f01d39f21d71fba416c882571f1a64fe5d9776a4e976a5f2667c7bac24239875352c8766658e6289214b0d9508e11d549fcd6fcfad569da672ef7e20e7b3e6a505dbfa4d1806c105f524a7e0db5eb61927b9d4fa37d15138c6486198fbc7b0c7d4180dfcfb284041c46465fcc8702060fe3c863643b1710ece773cc6b41f0e65de56f7a9eec5ae522a9f1ffe0167916703239033f3ba83b9260e75669d7d6e4415b3bb1de22ff2e37bd88ee43c4238a6b9f2336093682528390b4c37f3f41ef4952d8ddcf6b88129fe15e66cd67124f7a77fa3b023fcbac08e1607d2a06f7bb630b961b4de4286b6da44090294720a402f86f093bfa79967785c9cb1338d745fc33cb1a747dcd3f6e884f52191df8daf28a6e5766cd7dab025d9f222bf4dd1b893596a60aaf4f4605825dca03fd70ea06dc33407a9830643e74a22155d70f977f1cce890c0cf1837b46134330565f423869717c1ff5a6e0ed56af7340acf96b69833f606d94f95802ef9f2321d1ddcb6080f2352227cdeff7dcdbf67eca40438b1139e5c23f5970f43dbac32781eaf6272f87d21c91420ca5d61a1dec183c015f2e84ea8b0b5805ad11471030c75113195bf9274496a377e587fb21e7539340c7d78f43c598f07928f2aec25053abb91f89ab3a105c361c714423a8dd835afb9887ca88df0e8e8dc5fea47b057dc86c6298db417027c3ac5fbf0e749846a20e5dd921e96705d43eeccb5f9377e9192b8b30e7f5798b312ef984028e6c80e4fbf870b7bf7e3dac782aa3e00de7ce3abc37c659e2bec52e71ca7dc632b1aff37e21368595682fce9347b4d7735aa047b447b3d3b03586b6ebfb04690e1188c7900e7909cdae35096b19ed257d2221110080d1f31d66621165a5493ddc547075a19a764bc3125c5ce7cc56311007172121456e5f1a23022e4267b0a7a70165a70ffe22473dad9799785a761d8cd56e6dd1ba5a96a5a9e20253941cc4ee9d2be9ec70615f2bea179677d36e2b3257adf1f7295269c88d6cba4ee12adbef7c4d0d1a724340e581cd44dba771fdee84e1d6e1c45401fdff70423bb7cf247c81d2ad56c1a2ead0e817387bf6cbd220dd53c520563697eed725dc553d561e88fc9e41be3ec9015501ba0b556f19cd8c66bb5742d06a816b8d9bff8b3137a9842abfc44a308cdb8845ed17299c4ef8a7b3246787359932fb5e702315883de4e32ba8cae4ad0da16f1e7b80c3d14744f49eef4003278685e2b4298c0f51b5a927d2bd0bf8357dc89340a4ef6e7288f79dba47da887c0838967cdd6e8ddbbdc4ef49e45b2a08f06fcc3b897c686d9bb5ee09fc7e1fab50a3c81727c6c9ab85abb4bafb7aaf00a5688d710aa10649ef8becb1ba245245a4351691ff9b44e67eb2389d1e2b2ecdb5fc28f21e91c6b47bb78c3c3b05382d11a6da3f8ccaf9c0e65e0682b4cd2473fcae890996e1d29323de8e4ef761e499a804824f748a9a55f708ce91c7184bf19d55dd6ac9ca4a0aff16d735879f70395785dceb0c6a37cfe52c3af63b851ece8db3100e056e2bdef913f304da19cc81a07c0b9b002f480e45a65236d5e6f4dadf81fa35e375759de38a6d2e47ebe42ecfbdb47980d6c8fd50cbdf93dffc50d5255ddba1fe823ca9d1759dec750076fe8008cda190a4280bc7cfd16d6b0fa1b922c8e54c6eafb2ae7a62f6cdbceeb5c89ec98a83972bafad3b0a1acb61dbb842bb20820b48a584815470c3d8732b70a6f012df80b3c5ca1555040b5a90ca68d23fe3cd3c94eb75f4dca787ee135295446b02924170ccac1ea045fe960f4316e185b41fc302aad2bf484a856d60b43fce97829aa8f937f780c0fee498a2dac746e4b33a9cf65d43c8af81d6cf34716e503df513266dbde823148cd89e6366ad2fd036045830241c94da7a4e3c71c4062cfe03121d728671e8be2f7484967b7708cb5d11089febda8fd673bf0fa47cbafb9b7d068115308a86bb6d9665f49d05557517d594e98754fc51fb432aa7a42c2f29887866dde932671e343e69fcd97d4b1ecafeedba8a3fa4f2a2fb6078e344c4d357c1da1a11070210638193e160c334d13fb7ec552d34efbc0b1acd6c1a6ad0ccfc250111ee611434637ac3ded499695da2c7bc32749b1c7f7b534749a54aa640d0c4be8a462d5ddc673f5c0256d452c4862bd29b7c7b8c6a9d88396a776cff248b431fb7c5c843b45685d9dcee7d109d21fd2817072cc699d05ef6f2eb109a15126af1967b2bb6aba8cbde4062af17b999402f8bdb98b6e2a7c73829b64662a84bb5033f2d3e8da0549733ab53b29a47b2e02824092499bcfe910f454c01162bd8fbf6ea1e720f8821c8f286ab36e939231b69556725fe5218612fa122bf0c6e47fc1895cd09aa0337cb3dc0eb650cfb1173b903332ea7bf993b7c6e278b3cd8aa087370e96fb8352f1585fdfd1e21999fd74582a9df815307e860e62a5a288c09c8bbb6fc28074ed58052da76f2cfbdb3797a2b6a5875e0d48c63a338303862ded71a946cf94afee22d66eb182c823091a6d97ee584d38153f6e20961f7c61d32987371e920ba329ce9b590583669b3cd5961761d2a2b074e59c95aaed954d24decc74953f3c37301cc68b6034fe787b03159cdacd0dae0071e5fa4f157c98a0e9c5a8428cb78b34dbceeb1237eeb7a7cec7da6e5aeb4ddc4bebbbdd00642748b6e3cca36a3e6957730c940296505c7d69fa24ef21f9857a69312d75e7d58b5b38295fe40dcbc1c39dd201f46685772d4db0a9d326e299a6b858efaa3f84206976808804def68515b68d4aed5dcbbca2ff632a93f8f30a933aba53b1c73ae53257162a920fd55492e6c663c4aa1457c6fa1eef45398d4f9f83f87c7bbbbf5bddc321758308f744072168239110f8c5567164437dfb774069bd4d94c0ae3a44e8a255a1dfe4f0d1840c97003190e046ff540ca53753e5b57e7dba54ebe55fd6f7ed284bb5dea3b84389d99e3c6f422f379cdb36b2ad8c9189321a34949a96e1b5613ded453ea5e22cdb0a895ad624addbe1ac6c5ead34529a0f3e91ddb916c2c380f427c3b676eea79b5b6725317fe121fc77a252b9527a59e7b67e584ce0be4b40d4929eb3ffda74c68e6fecfe0b860ab7030c7d0a6e219494de1392a1ca79472ca0d629a4d2915565a4a2944ed511dab80d1471440d5a5cb3829b54c9ff879919a94f27df85427163fa32f70592928ff1b44f43076510ad82669607389180fedc23da313b2f45b2fc1a3d975d3cf410a6747024204803093290a508f2c4429902e29ee06940d60b289ec383ee46950ef4a83a8a7fd927da3946dbdfed302ea35750aa5710282d265991edaaf5ac26526af2d3690990d8442602ca7232f4108ca96526112245825d02cc946316d7438e6aadb9d816d15b0f73e967e6270c0fa484836dcf53ec836a237eed2e7873ade491f9a3ad10272a5f4dbe9ee6362bb4f2cebd2b6c8db862f323a78cc81f00460c60ac720928270158f24dcae63cb695864ad247d4d428f39916128c0141b09930242e75975652c28b70f016929dee4b1891f19082afc0414d7d1cfcda8297303a4092b1a1094684ba4800fe8543f3e077a26f03307bfdde8c6cfa3e27e53a81e259799ec0d216ed93ab08a760df0ee50146b6a674ce05d0b015c5a0a15c0324c6aaea60b1019ac38f3ee8bbe73816027bfffbb6830cdaab1956aac39edce5004a8bc2628c9bac81fc52f52010261afc174095e2acd3c7edaf4f498e6318daa234ff33007fa93a02142a5d1e9102a3c634e4fb9ea955e4844806fbc6d3e440ea1b72ee3212885049fe01b16fc268dae0845de8f5cdd6d8640881e8d4ef4d0513505b7e1cb146bc6129f033a51a08fd780da05b1c299e4fcfc91dbfab50e70801c91711cd311fe521a8874304c29ebe4a7f7bebb3a9941b90f5203207ddf1a0cd7b45ac2bdd876a7302d86abbb30e62326bb26c6c45108c78cd308fcc74b4a006dc3c791653da777d74e3a96a532c825fdfebd35ef96c27e3776749d8b30abc82f2fdefb5a2bcdb9750dda02a95ae08e1668d059e0667a306ae466c50a35b2f6939d4ecd42c3e669eadba84c21e5800e536c7c9015749144a60743c2021ba298869d8ff102ddf21328bf4ff488e8a4ebba6437a4fb71412166255a490f1123d33d44acfd360ffb899923c91b52d89452f91a31cf9d6807538d926c4ab3d27f4c6938dfc2ebd9572839e117f08f954c4fcd07d9bbc2382895c27a5e8a908992655f28b935d8570f73ccb792ffe7d5831597ffdb90d64912b0b7820848614eaaa4914b576ca209c93894bef3ceac0453ef5a0718a2238f9d81f4011848a554fc64ab1d0cb59a8be051c2323fe1f4255821edde536b40d67876ec9af7aba844b112816c656081d96ecbfa28818187e8daaadd4388a54d12cb20788932169782ad4998aca484a773f04ad8fded56fe949c006e380ace61e0bab5f3d6eaafe841e0e8b62f3d79e0b686943820e5b2e9a6be1b65add760af588d03dd08caf34561bb33124a3d23b0021a3958d14863a5919177eb56d0f31b5b0820133cae19aa851b552473fb5eed03b03659b176a36512ccd43d65236d899b745a8c09dd937aaf272193b6a16446601c66f5d6fb3d2214758b67ed5f674e904ad2cac0b5baa20359b62a3f367e5391b9ea361f73e747ccc86606b4d9c13fcb5ae74682cd90ca77315cffa5ee70c893f45adf5cf480722b387a74573ffc3d00d6ced8929f145aae22c5681708032e8565dc2a24c0dffeb331d785602aec5146ad84c2c7e89237fe3d51c71974dacea5e4cd3a56553b57c3573ba75b9b947354e7871b7fbad7e8ce7306d1dfe95eb9373bc8519468ed43d184ec5409356e2ad150c0a117fdeef577412eabcdcf566016df5a51c6eeb47743b89e4c5e450e0025b2cf15c9ded014f23b8c552bd8193fcf416e4f22c76db345b0307ffbd9d822300f87a0a69c5f0d4c4b50cbd1420496cd118ede83d463113588ee68f99a7dd230c97a9a1f78088e570166102db4c8dcd73c5da26fa409ce757bae8228c42745f36d18f7316ffd68b2e032475679d8ba8c1e2b6bbae7e4f1f8a32c7c5e4db4b2c7613f01d68d9a0b07f5262c87974dd39ef1949fe72b4fd2a7f183e33464add44b2a1b42a79272b5c0dd649bfd1eb4ac031959a64329be849e279b71dd44499cf331b755d90c6814ca1b3308a241f959096888fc0c74b93505af2f54084770e65c20f83dad57ba49309fd879301449bfe827ca20ec18f91379fe5c150314d19b4dac0956bbef57d1975dd936929e9af00603f13f7100bfb19ffd765c888728027ab2a7917d3e27af62e526b36432720843207db0484d82aa8a28bb6c93261fd3a043859fe46ae338ceff7144e93899745f523e650d8557e2852f334e5ecad710697f5fbe916365bcd0c595997a86ff7b880c796ea065ba7c3019215d13ff800a0d234b5b260cd49b7879bb4db076cca80d8b90505d5dd123355db4b3afefc6843615965bd08a0d349c7025995ca458477aaab7081c869ba972a406f96b8aa5c0a752d38ab48d38730f98109e4ecc1a8d02efddd5ce97b8856c916daa971ff4da0f6521b46c394ff43230d75a98ca029c2d33e189986e56fdc6fac3a9c6af080ab09a86b1888711bb6997b008d9442ddf839840855ea7f9128ce3e445a9fc3ae93c5ef7ea25feb5112d6b34816185b78a15a990633f2687a5c412aa4834c5ed37c3c938bc13dd86f3d16365fba7e5456371bdfb9049c53a6f5e430ddcf7009d51b9566fe6a94d99f7d428c576947a400078de21ffe3843017ca8ccd80c7d4da0e26a821b43c8b07c6b8288df53c337e2e21f60401cc14e31dd55507e58ae0a5b780bc4cdcd161c122d5a7282ac2714f39329011d4b29510132d4aa0ba4192c8f0c4ae909068261064547c709d265adde300cee556376f12b2705558d0842dd41c7538fc35f53835a60c818864c0507bb5237a855a29188100016c730c53574bb74e0fd7253c162d4dd8851eb7ecc0e8ba402c1fb69bd3a1c6aea97307cb683f73a97499be1341fba4e64bebb6466226a7674094966ce573a0736f1b2c6c9b00dbaccd7fdbd409b6c9ebd91ec2adfd303142bdd923a22435184b924e9169ed78055d7169beeb46f3337c947f97843261439a2a16e03743abab520001b6b175b5c1aff7aa6d2a6be5641e8c0f2263d70dc30003031346ea54b299ddc82cbd4198d605ced654104ace515b111f935c9c777a11e4060f8372c7c247765cbebbfa329e80e1c53f6ab370c16dc9124c6cffe55680740b89f31c33a7ffadfcf281dd22f38ea4a460e9d028d69e85b012dee46753925ebfb5138dc1d02611ea13242e6bce216ef902e74b9000da0c3c7f5dd9e39ab1adb37d57563633de52e3449814335816ce0087a859d051628b106b8ae1379c6d70e003e746bd0ea883dafe0655a0f9bdd2a21f0cb7fdebb496745a9c8ca0094269ea6880ea83e6eb134431cb8b4fc5b192129f2dca5c75c043b50b0b2e7ef4726d5cbaf365dc86e4262aebbf23ca32c96b689d5ac0ec689a2c77d39365759608e9172f13354a78c705ce1ae3ba498d464e209a776754c5f4ff891b74ad044fbfc404bd76eee906d0294de7026952322c189b533298b4dc7fe6b7a484fefd2275f57e05577b3a13cbc96811bb446bc5e64ea66378dc1cd06bc1687ac5c36813a299b5693006b6bf45be0f29d8df30916232502b28921a473fc833409aa8ed50bc5563ba03187b42aa12541a8938a09eadaf0208493b42cce2e3290b2402ee61ef6f3bf32ebf7e89d18945ad530e9f8fe45e7e68cba24520667a2461fed613a163014da833d641241cf1a50e509257831848a3c2540043d41158d36524d19cab894ea659e4b42ff65c651afcab3127048a36c19a0b87cce1518b177fd0a5121ab6f1488ed8b0ed2b9272d98a74963870b2ad6552023ad966ef5e7c6cb2d153710c2b0bd25b04c74a394e5874d82315016ec889744707e339194e67ce9da21b8b7ab9e2023a06900d9b4e3b6ea2a8062d7b5022beee9e2368dade72ebf68e0978e26e592f0b89a565ab315b64f7d30e7dba5de83c15fa58e8279ee6b4bd569fb1ff9473f365d094f1b824e260d02f35cdf8d912d9996c26b88282903a5265f236a0a356f4d880e874c6ee862fd114c6034a3167a55b2090aada747a621a5de7973813f6e5991b93ee50595ecc180dc8c2e39d3f639db04518203ea7c009f0491f0da16a9f9f7b0025781c202018c566cc21e0ddedc8511a40dee14576807e63ce0371b69fb7fffbdf4d84961ad95bee1d9c0aee09d50934248059bb8f59abdd4a5e6ed448d15a2c138359d0de836deda6dd4dbbb51ed074bc40eb7bce5ef23a5e80bf21c1b361e4d4ec5bb2254f0073257d32f706ac31d84bbd94e9e76996b67975ac85642ef45b8923afdf4d6490696e9ee4ae2ac844bac6f6113772d39f8d0609114d91fb360e992a750d95b6012abb6b35688ccaec60056442431b36c4b08412212ccad80c038921c628a30b1e345154cea7dcdf81850f4c40e0c0c2136794320c6165ca155f987104758a830c2fb238656152122a7b0555243106194c422da8514e2a391613e346060f823c40c9200f493d30916100e898a692451eb3f71be678170a9e4f3809e558270dfde4eeddb930a7b3b99813f22187bb2c6f5673d2664d23c96430994cb682934c567652ecee60e4830b1c7b2565fa6f0b1c7b65ba9497be29f092a513d4a10a2135a860d1c4059f186080410d17c650a2461a75099327a829923bcc90eb61ee0d62bce84b9863c19b65053ee4fa179e4c40492dd4450b1db2c8f52e14b4c0c51b3898010c3720624e61b474831c8cde68828cf2061bd058cd1f2d948ba01ee4fa569853ebd2d21146e800a5892876286334b06a53438314273e68f142931065a54232992c49596badb5dee45a6dc855566bad4c44ea0a842db03840175a4ca4264ab9a570528393239e24790246eed3dc2c49ca0107414be4f412931a78b406db264f727daa15068dc207150bc8311f4ccec8ddbf9849ee241caae43e0c28b70ac0c8e99b561313294072ba0506132631b90fd62065a3359f85c1122d72bd17e488187c814618a4dabc34b2d50206e86917e6b4fda1e5589ab46496ebeb39a13072f7cd38dc80a776c30c79022e28038926300ce9104796010749b3a7a332a694fd20b5061b6cf04205bf281632d7579b1a6c306d652257d60a700c8cb161f623f79dd420cbf3891efce4d8d744a6e7916712d016f943cad463ba36f75f3238a6759970130f70da68485567da5ca339433f99eaad1e5333a94ac041a84ac3baa992ab261ccb401cd99e856c8fc351c3667e79018bdc73ac27d23676535769a61df099ae21559b2b65ced023a1e444a6548a4c1fd39890aacd2c95f21253369a3dbc2cd77a4f6d438f00fa644abe265d03a56b66120d5832fd803295a19f50a61f51a66019fb8c326d2ad435b481323ded25999ec6da49a6a7fd24d3d3ce21d3d30ecaf4b4bdc8f434a6cd327d4c6b22d3536e0dfad435b12b4416a2ca20448b5042868a8f1ca34255ac6001ca31ba46a634e0e3774f9eec1a31657a6e8daee19eae8c7be29eb827eee9caeecf05e29eae1015a2445a133448df3da3bc1d7d4a599b754d4c6ba2fd683fdacf613fd56696404d84328d693f9a91172d0067de695909923a7586822f5267ac94b3f41e9b4d43c07ba4a8e3fdfb2c67a80392623b955be05833dda33a13d43542d5e636d10bff758dde2494a950b5992591d111522b5da34f869f631a52a6d796e835267a0d4953cae1480a4e4fe68f06412335924c962b29aac0e364fea807c109d34ab64e3259b6a44865332bb9c76925cb96fc28f97969810c90b8a00a2660104d1d24f5e0e4882c4ad46002b4a495748d489bd0a06b94e92fd255ba46f7e8437a11df9cf453eccf4c7d5670810d5ea8810b6cacb044390fab362ba23860683a6386a524ca79fcfa66101a96e53ea5a7a7b3669e669c3ed257a18b74cd24c5996334f7c1201c9b44f3878fdc7d0d4c1b1e73fea8c7424db4582177521b188ddc9f65306084792d724f2a72dbe4fee66cb2a1591819a14a66a0c2832ea14833989163609e4f3354c93f404d268f16ab0c33f0683aa24211231828000272cf27726b9f3f48981985d7ec61af9a3da8b8b3f1f894748727489d29e9d75b5071e79e3bb5df46716723674da19242bad4c85965b5bb275f195da529cfdbaed2b461c9733653c3e6eb6639ed6e9d76b78ef3eec779f7eb402fec402ffc50606afe4381a910a354208ea24a751412a812799e7524cb92a595f4cfd312952d96a8546152a24241148a100da25128116d32df58d6709a58b23ccd2b3389049a63407abcc99f0ac42b252b16abd5228ab271dcbd5de77df6fb6ad3ef769ef77d20187e6018a250a914565995aa3655a15218ab54ab154bb562b15aad961657abc5e5727179bd5e602c0c4c6d0af3029343d411b323c7c11e452cc68424d0dc638e9004aac3ead0519bead0716323701df518d3a2e4799730c7c8257ccdbf843918e64514a9d863cc2b82520f690acfc83bcaa2285a51ac2d5271ba50319feca2ca4dc63690e96376366cf6a8755a548c2753b2006b7c5326b60348073ca7e0d451dea124d3ef50d2358dd430fa0e7352493ae0f919f6cc4ae8534da2036a67fa9814124d09e56bc34d2da59ae85357e8534b29a61d4056684e4a7fafaa04265768fe9c9934f3cb33065fc83225639826338dd1861654b0c103a32473290888271eb420258829930c229ce0810ca7377e909516b05205063f402081418972ceb90483171e70a5f48507dccff9a8268517197c220759b248af9d36cddab791e61ba24294043a87e43743137c72305a410d1ca028e2428c1235623206da8c7a38c652c8df44ef1fe991322780f98701bf3c70b413e6a9e07d8fe99a8ff46eb7d109d35070babdbbaedb4814bcaedb5e49d0d9f3c8d7ab61f5923132a78fbd3e4a3b0599824d27acffea145e96525a63580557c0dc85f13a9fb0c10828a888d1451745f8e060050d6ad0c10c3a78f2d4dd3346736bc99625fcfa20f538f541587926cd10945b66e0184d9d6196eb7dd05857164c5ab880c51940c451d607a93630441cf1e40541495e7043594f537fb37dd104c81504a63aa0e963f0df7d7e6001872b453cc101135e6830785ac2c906654821c38869e86fe84f0fa3ff90c0b1798546e2864d19d6805d062c995e86870c477926c940946df24c5222942f238156ee7fdabd2447c6bab1afa5a0853956b39ad61de6f4351bdc335fe018b89d1ec42d6a7fc0b17945a6b7d7c6d86d77db5dd2bb1d63d722ddd904cab0500b296b8fc9f79b1541adef461170f98a600171c411479e797add3d25614ab2e4220283576240ca3749311c654ae93fed33ef78768ce9646b9f709fc60878fa2aef29a56918cd2cd43e431dce1b69ea0c6d183d17e304ffd5b015136e98551b18a77634d329d32dcca9e742126a8b0b1ce3918246efe30667fee84ccf63be9bda067d05091ca33464fafaeeb727d064ee4d89b2b5765ec9d65a6be7b45dd7ddb70f4273e34333274dd636a4c9f1f014ed7cff489eaf23632970f211d2c9f36ea336cbaec31d7437b4614696a4a4276e9094044652d216405c356c4802b69870ac05d22476ca9cf6ce8063afd7050377a6b4f56a1f40e0d802e80b0b38f63794b758a7a742f3c7eaf4d469fe509dbe91e60f7cfa0a347fa44e5f9be68f96a3deb2b120d7733bc8f5b793bc0ffcd71afbacb1f56f35b2fea9c6d53f3caafea546fcaf654cfddbb48dbb9df75929f62d238ae698e9056a1459801a61bac7e80e2e881a5f925edf63f506d4e8023e56c7c8f528b035f651a32b878f5929b9b6fce696cf1efdd6c81a75462ae4347bd0e3b1912ad0ec418f1a6b084e2c321da268b413b5864c6960a5e41659a7f4bd7a78f5f0eae1d5c3fcfc0b0aa6290b4457ab6ddcedbc0f0c5129ac5ab15a2d2e97d70b8c189343c750cc90380433f432f41a7219720de9d831e41a6a196a0db1865643aaa11d1f520de1a1d4106a281cfa38140e8143df9037349243de50377487c80f86ee1037f481cc10372403c2100821d4d7faa62db3ffb87f648e77ab891aa903030661eee533d75fa74d524af467a3b2f9e3e60d05bb337f68df5e8169f38139b37ddb41deb6eddb5f86c0a21098c79c88f81ca7a18e8e63221d638e181c0543c150f226eac0dc8459c27cc80c3554789c16c79e7e7898b1a7887b4f3daa1ef59d7ad43972c47f8da9bb8cabbb46d55bac7babe377a3a8834279a52bb75cd667b3d50efda933db51a9ed785b51a35952599dd988e8501936caf38314b07cb65e35c11121c100c713511248e2302a9201c4713cd59979715001519d99972889923896eaccbc45573c2e966479c3882c6ac03174c337e7bcad735a4dd37e4938e39b321bd72d13d31cc9819ee9df168e79c958e910a7b66ded1b854006c6129e3da069763a255d98c5760967ad0f452ce45affb100c76c143072bddddd8d031a80babbfb8a2b5e9e6b05024aae40a8916b1418240131cbf51706820fa8228d1fa26071858ca607c8c2904110301c418588ea6489936ac11f7a705d4025f737b0d63a25d75a2998db8adcbf5bfc8024f7edad376891eb1b1024023b5507d1957b2da63aa8410bcf8294c6d0984c6131b74452ecb0a82c2f51b0a5475238a161fd1519b1e3f4e7c7698353c9d8546a2f7273c08e1f983d4030679abae0051c3cb027cc1e7d4b1a218b34acbf0a03f74f6757222852aea8098069d39127f44c8d1120f623d72858cbf3065804347760f6a8a7a191d9a31e7c0107515252c279db22b019a933f59f13acd3b07a7be7ec72ec22d5243e3ce7ef9c32310c04f359beef53dac3aa8d48eb77c0fa26795e5eeb79600e96e07dcaf282f688bd0af645ec8dd80a86e3cb2cc3cf50272445ed3bb6264f31669b4d45aa8d8edb1b51a1dab46e5db72f97c7a810c70123451ad664df71ddd519db7d14ac3117af23e6e0288a0f1f235e47cb5b5a8c586998c335d97cd064ad122ccbd6721afee99ad8b10ccfb0acbeda44c001a81c012add45e51bad88d7dd2373ee5f86c036a36073ecd9a2206aa44e8c78ee9dcb5b3e73bdf52f66d47171cc7198b1fe6554a1c8fcc165fb1491112aa340e1757c27bc0e92a7483b4f7d788ddc019f83e4e983e1c5113c0d459dca1abfbfc6d55d46d55d237ecb987a6b44a99efa0c1f756e1475c210fc0cb7d56733d567a9879fe1cf500747cdde88c5e3cfaa0c471f5911d81b660f94e7072968f970ad42e29b32e0fda4e73e64fe923ddde739b2a768a767dee0dcdc341512fb94887e7e879ee429aae4ce3c47f2749f24779e794afa94875dac4f816651fb0ef72cd6f714d9f7d073ef29dac89dfbf91eee95143552083df71d7a8edc99bfefb9a44e0589c0f44594b4cd2ce7dc6a50431867d84c328c600a2206396011c65229d6be9159d257da7ddaa44f657dfaf3796a547db4ee5cb09fd366b61dc92dc3d9cf4d191ec92dfb5536acecc75879defe084b9e33c833e988863cfbb965cc639a027e6e98801f58e902f27353ba1e63b5fa2e9f640b62a88e4b10c6a93094d3fc5193fb96a97bc247dd1ea7da80b7d7a93630b72f526d5efed84db693e9751e0db387c1b2a8aea946589dd15cc622136639abefe71867598f1a45213e6578137cca90e4f129798a767a87a78725585628439287a787255864653fc748cb8fa644ce659c25c5ed65fb8f25c3304d83b5cd074d344082ec74cd84a20ba26c534d55aad11439067a41469e47396b1b4d5de91afb5453d74c28bc30caf6292b4d524dd9feeb949252aba5cd33707f93613a337bd87004009db1ef1195a901620470002a7f246cf6b05fdd4004da51d0fe91f422103952a7d63e4ec78c2e4d7cea339883ffea187ae3cd10b8c2e60f54b6aec77c88eb31a4a83de6b31ce2123ee643c2c7903d453b7dd487a01ef318b2a757075baf11ff656cf91d4d98e56cd6faea3396a813a2c4719630e32c5fb2ce6ce6027ecb67b3d667ab879fb13e531de5328adbc1cfd2358adb53bfe276d418aec65959ad166b55a821a883640f382414123e45f614ed8047bd27f5f0c2804c60fa0fdcae035e042694546075c672b33045a561f6db69ea8c153752075667ec3f2738b5945282a594563eb757d329db7aefb392a210eedf876cf7c81eb2a768c7fbf69eef3adf4571080a259c36d9b469a8734febc894eda9ce8cfbf6aff6a415f53b8aa290efdd8778bf64cfbdf78eec29dab9f7ded395f6b8ced873a3b5df386b77eb8c3d81e440c3ecb4329dba6d114e368633b54a601056a16e27526d26ce533ff3474dde1ea4dad4bf80f00f9555500a769d75960be057f7295d707db522798a38aee2340dc7715a7f9809761d749141eacc86034ac13d45da7b5c07dfc3faea9c10d7c1efb84891bb4b237758a48b9c75c7f5fafa95119e9946e438cf0271f9c8db63281b1e7466cb71b13ecb8fdc01cfb33a488adec3cfd2de17f257c13b76ee464ec7b57a0dbff3d883ffc81dd757244fbdebdd78f3a5a92b0ddbbc0729c151f4481d9c5986accf094e6149594959c9dbbf0eb911bfd035de0bfd73b57e217fdec8fda3a1284475f017501d24c57b017cf192a210f0aeef8077913c45f73c29170feaaefb94dca84180e67b1366b9d259dd1bb7ecadb8ebe98037619620d95374df630f7e48ad62c60d71942eb2a73ee4b2eb3bf62e52f4eefa2c774421acbb3e847517d953b4e3faea3d2e677dc8ea2d6f217b5c388dd3ae5114010a2574e6aed372119030b3771366d972d7451d978b26ccd2e5e210d7bb96d1dbce753a33d65722f7d667e9328a1c290a7179cb87b8de227b5a77bd85ec29da69ddf59e9615abd5e272295de32c5bc659b6c659b2c659aeb65f72a73e3c3772b961db71fadb0eceba3db51d6f578ddb2c71891a67098eb30c73747c346cfb8a09d3c7788842ecc1efd883a4c87d96b3ceecd48bdc2c5f7566bbce7622db71b607d966f6f529a73c3f4801e8b3b5aac9c7d55aabb5d6de0dccf5db096f6d92312379bea4bc72e667b5b66a1dabdc9c73ce596badf56b81dd3820376edcdc896f04ba4d021b045090ed390f5812571f34b7bb68741e13ef73e30367d768df2c042a044a90b56c3da09d0bd57003b595a0bddebb3564b19acdd46a5a16284259b2d43ae7a4b5d62cdc928fe609e4e6c656ae46a061fd200d6b1f3456db64c03c60306dd3926099c7bcb80bceb7348dda12ba5c8fd31a38bba601dd00f0d7da37b8596957c39cad6fcbc060f0010bee0c1ce699e443d214ece599e44312f4fa20440cdddd31f820b4d1c007209a06f8f0c371de36bee6c54d39f64ae385f1a5b9f1d1b02725da1b32eed294418375dabab8a1e6369a689706091dfae20be227259e929ea8e0d70e4fd888c2461138a906201aae1b4ab891d43333c72e66baf8a5e59904e5288351ccf0060d728c266f3f74b13d81c1299ee0af090e08ec421483378436a4376c60e20d250d8062d4ca36cfa41eace4d80bc9b6f1eef74b0ba6d9e3fd7d796e795a4bc79abfdaddf58a39e79cb903c8f300e39c99b764ad5d35dbddddddb57bce395f9e747743e9eee6bcf86837edd6801a464b5b031c4be5cac4e99baa041c8c1a3673798a802ed338b285d2337d4b0347824beff52fdc75a4a8795eadb5d65abb975a6bf55e6b6dd5d7abea15f55a5d5ebf9aaab576ad416d717dd7dbf0aa117ce9eea946efaf9162ec1dbfc3deb78b1a39d290b5729aa8695d6bad55eb5a6badb5d6ca69b7a2603f029abbc7124622f55ead41668ffad50d68a871dce87acb51e3cc2d1aeacc5247b1c6ef2ee3aa35d2b2ed28ea741e6b54a5bad65a6badb5d65aa74c55f96c9d5ae262dc640631c42ad39b1e32102218a074891c64fa514a29a54c349129a5a74a940a6d62874c5bd6337a8a3495e693cc885ec9d4898928f277fbdd0b73be2eccf16cb7441bb9fb0d73ba7bcf8539975b0288cc7d0b73b8bb599b6c2f162584c85a0d016a1795a976513fa84090a092eb5f49f090eb9f841bb91eb694eb696e5ea0c651966cd38d6993fcd1ee0d248caf74effde18c6c6f7f87b2c8d69ee32169ca0fdbed8182470c91eded114d58071cbbd9be522fe4e1a35a3bb7a892ed1a3647b596420123c7689429ec5cb23bc8f6f617bf0ea37123dbdfe004d121e2856c4fa4c8946c6fe48813d95e052956c8a8fc1021036a21dbd3264244944154c412464db24d32628c6c6f9196f4802b2622f79be26c29926c81bec8d69615876024c3c5a00dda91d094e17f70d90820c12b53b205b358cdf33db67ac61ed7f0f6d676ede8eb385d2408d0fc5193619482e81439d27af8f4a3454027885290769ce682684d38a5d4c5d70bccc1f1250c5f1e1e267c113b98977196230d290000647bf106d1c1809114b2283561717aba9c0f1f577c5cf1e1c3fbbb12883c602acd2cb20de25df34e51103bf2e59ceb62aa8cd9c39e1b534f291cd019fb309546b69fa92bb38706f3d789bc3ce69a4e8ebf8c3d7df030630fcc5f7e9323c609880f2598b1a8fbcbd8531fdefcbacb775e77795d23775c2e923c7d97e3f4eb62f8971114521f7e87dce983ff502d233e6bfcde1a57608ba563653f4194b85e2dd1fddaefc9f1aae5a0c19814351aea00c34d5cbdbc300bc685e3b274b02ec7fb47411de1c18b183cc5183c7e88c18b232d57634fccc5b3c69ea29d988befc9f1940e8ee3b496524ba9d5eac0aed3c811f874230a2ff74851fb90fad487f4c57fe02876df719f321cc58e1485e083dfc107df1d24798a3a7207f51d244fcc51d7719ff2fbbaeff3608c625086124a5de4988f185c41230633987d5ea7d43533065592a88842f0c3efe087244f91771d244f0e52ec5e9f3abe47eea00e923c31a4d8d5a7bed317df178f5a1d666cf98beaafd1356b7d85b1eaaecf662d471daf58ad16970ac394263e15182a04b55976ca69f5c5929589e999edafed5d83d34f3edac6be05f527b44d25674870593f2be28ee496748684a6b4ffc165fda129eb91e032cbdd404a274d7d887daa3e55df938ae1a02c281d829e4a993fb43f551bd47130860c9280019d226fdd6a35c3f038ddaaee86e1481d113a47cbf55ab9b434cb3b81e575b358acc3b0548f195917477c1160ae5a8d306f8daac3c0a844e87e501d08406de80a68100d0da2691a74468c06e5b468e68ffbed039836548a118d11cd25a951dfd3d111e11f8cea33143b5267b56a11618a2167ae8ba408e30ce62a1a86a4cecccce5acabc699ebf8464a464f212c3135896004537d3b55a24cd566fcf6c137ba443e469bfe18759ae5e8728cd4687bf7d58f8233223c84c3604611ae1a4350a942b808211c36d25284f92c6340b8ea43640e43f6a02e7315ea32ef491d0422a9837022a8cbccc0d02409c5c18630c828fc09e1dd48a5cc1edb7ba44874083ab3dd526a80184d8223a9915148e6780f2fd251a4f73db3ce388153b14bc713441021848fc027770fc98f17415248ea207c08ea32bfd566e63051088bc5fa47eee0c3b8f1ebc0d567beb3fa4ceaab7fe44eeb309207f5d6b9f11361847908a3ea208c319719c57f7cf907e38e93a38e8f630e1d8ff92cc74518189508e32c43186709c2384b9971961f8cb324c797eff86ca6e3b398c37c96e333f1aa8f3e322aa482116372e8d8f1b2639ca50e1f198542836810ebdbb717a936abd6b796bf5cee621db75a2bcc72b9bc46dc32fac8ba3feb5323eaf63b2b52e4ce4291a9af3e047516d9c33aea2bb2a76887458adcf167897a8fc891a210d6551fb23a267b7a8a76f057ef51a55ae32cbf8d1ed599ed2a9452de9e5a35a98c8e1869d886b2af313eb775fc10e2719661a7aea8524ee187e0abc81ed5f14312631d223841e645d2218213c4825a578ffa907e8aece9f784af9fa5b5f6a3a18e0e51bb8b0606612238f3c7fc09626dcadedb71fb20d586757b22d5a6e531b75721369b721ca76116e92eb961f7217d9773e3902aa41e7cd88db3613daa7e0f7efd47411d639109a8ef1867993a6b449d8639644f910eea29384a1e9f12f51d232d5b46513b0b7ceb43c2b3c81ed5c3b7c89ea21dd5c3f7e08f86227822fdf04ba1743427725c909d2227d8d4957aa5daf0e07185c7956cdf3c7878afd747eaa45038481e9973ef5dd40ebe5e358a9aa8934a7126cc7296e33117bb0fa9073fa41f5e1bc58e14921a5b478dace7185f8f195d0e33ae2e8e2f0747d7c3b1e575d7672e6f69b55839c659c670dbea2f9fcd5e3397cf5ace7aabc535ce3af36271aee8cc66299d120b1e5363903a638f0a41a72b0dbb52dfb7595f7c15f029b5a620fc326de67ccd1fa84c8f6a9a3f6ac619720e2053ef7ebb3dbdc954a3275f0d7b61a9fdd1a555332dd1a7b6a04b73ce79546d6ccf64bbba82e71c5faf9b0660c9f4888a8c1059720c8852ed79d4354a744d7d1282c7e95ab96fdd2f0566a91da7534a8c1f377aab513bce579da129a4d451c3524799bef3a90dfea49a85ecfd0387c03ee54ef7bbbdebdeb391e2fcf6913b3d1cb9fd5e9c3bdabb6bf772a81ecea7fcb8d1c571a408566a755c5ef76ea4dae07b57a1daa8ee79a74daa4dcbbdc7a6d38a46c9c1f719eabc3c7c193fefe1575fdc688fc7ca71f5dc2d57ffb2b61e35ce12751f6b5f3f278ae4714d944f597ab7debf1bf0046334b909fc0c3f7a069e9fde290d4510ff2b327b785fdd00cf7f34de6fb86f1fd275df3a529c3ddd39529cb39ce3ab61deb7f19e77c4bb0ade8b7837e2bd431d98551b7882dfcb1098a3b19f79c7862248ea701cf6e63dcf73dd9bdef4e637eab890dced77b85b92a7083c0f8a144bee20b9835f491e17297ea428a4bbfd90eef6bec7befb907bd451640ffe47439dd45b5a67adaee28e3f6f34e25de57de5b5bcb7784f799c77d330ef9ee7cd77280ab1ef4ea4fe1e35ce923b4e7ba407b0cc76ca08a3ac00d4e736b3fdd50645de5458a5e91ad481b40dd34ec3b6a3c8a4200ddbfeac830a3fa4bec99e7e7d1892227d49c73be23ab37d37600a449b5019fdf9509fa10e8a14b5efc41ca73f11e657c7b7f05bb5717d3b3daa362d47fd334cb7d8492d11d18999658726a0469887a3781a8a1a0d75662ed4a3ee423f7cf92ba6fbf181ffa03620a0ab1c9b58565e8e4d2c9e0b09cc79dd14b59bf9e3fbf6034c1bbac2cd466537e002efaee0d8339d485f94a1e40d1ab82083212c2046152ab878420c17f450d21fd64a02cf3067ceaf07dc2e2f5a39c00dc677abcd8c08207c30eec821beb8b4b054a9f0ebae91e28ec6c35dbb4fe953020016820c791d31302f576b8551a0f78d1477b6fbed3ee5fc07801900cc5ca018b2c03e48149191450d2c84e0e10c204a7420db82088e1f314a7ad8384518af16983e84118330be986099f18311760326479a71bcc9018ed1ec18837081758c39462265e098b188381ab18261c6237586fe6554a106f845ef32d21f2f708cba5a5c2d935bd263690997e487a9c56ab15439804639a856aa95ca8b6297a2780c70228a193b6001126c7051d219461454d8e8411c4c9a6250d2e39102a546da043be118054285a890e6ee6f0986a7b6a274fb68a9bb1b1ca910d6018e5121dad1bbb640aab4f504c7e873acb15004f4299689a58d289631e808f4140bc5d2362f748d262e54c9b48d5a08ec59030535944c6bb791953eea9a181d835ae922da888e11e6d0351a464f9d28164a3b041fdb2204a576d0239cc61bb9bfda849494e4be0a482693d1b07473c87dac5926ce05b99f1212033cca7d9435c3a392fba1934c264b52f61746ee834d3299cc89ac53e34aee7f15066e85dcf79c6432590c40b649ee774d32996c06bb84eb21f7ef924c267352735049c97dae916432590d51bc29727f3392c9644f8e588191fb1a0d4a778d1de4be9d61299ce57e059a416743eef70e65cb643648f190fb143ce1850453106c1bb0ec1dd81c2052ee1bfde45bb7ce7d0ea86d5a4e32996c05289c1250727f265559d0bd22295f1125c7b82272e7187714e39038a5dcb75bfde194744d6dc209559bed683b1272002a6f47b347df45060c16d13531ee2713815140a3aeb1a742dc4fd7ccabdd32cd1f2db95e237a35daae79db51ee734d4c1b7aa3c057e4e6bcc8ad5dfbc961e0180774ef37bb831fe2fd037b26cee77da7bbf77acffb47f27cf7c0f378efbafb9460d73bdd334e7b5bf79e228ddcf1bad37fb6eb36cf7b8f47655a1b4804e5a00543b4e3480ea8e38238202e4aee4f0eca1a539c4481428a25d270a2441c1027c41171405c1310896bd5d137656213091f4d257a973826508ce999416b27e360b040935b4255397851e6ea087a95c2a5d9cda0afbdf3fc5f79fe13096fa1841336e02fcfa4d91152cc7aa862760311b317381ae0963c935a48e34669a1e90e61579e492d4c01d4021248da0b37371c0e6a702d04c121e9eac41931745a6c9aad60ce3199dc3456a0d1512dac7023779867921556d8a01dad37daeb36e5eacb5a3b1bf6d2ec562ba7f5d5bcce53d5f0a2f5d2cab5a6514ddbe8bd98ebee9c1f124b297084499369465002d377291537de7c2b2a0c211002155e7121c8da7206c6b75a5c35cf1a82210442a0c22ee06727f7aa19810064eb47a66fb5dc78e9c0b0842228a554dbb671a4b51ec1f5666be7116cb92dbf5e6e478bbc663c8f606b796cad55d36acdc235350decc50d6002b9ce39f3a90a41ae25a8ae4ab39ca6699a366660cc356b73fea879d64e1502d5fc61bb864e9886026db6ccd7b4e1de3234326ec874db53120c9367921553e4188dcc0eac40c2092b7e88c30a264758f182156ccc702bcfa42a6ab00d8159792655b1e445154d70605421c46529590184a9c8564a4c00a5949e544a2e5882aa02082b3d010a9588524a2b3801ab4042ad21c34705511885173a7853fc8051289143d7f445c1021cee92a702ce0aa12e0a15d0b049b174a398dda055e1c441e1b44406851525e514506c014404c512548ea08852432905911df34c4a92449c017ed1e4a06a8115c99229c25a6bbd73c34b02a02206152939dd6a013d51812d10b7ec0c74e4a6620b2a8ee8178b880a26b9d677151c036560338049c143ae32c8558a2cb94e0134c519b956980a50d270c1104f84a821c8a7e8051b3041459014a320da071aaae45a6bad95ee40298cdc49dd13dfb57392d6be8ea70d778b5397ebfa6d9c1aac6adf312d11df9c3f5e2f5502f5d68610a8b795abdd48f702b1821ca39101a3f24c826213038336b8445f1020cf241fd2e8ee2da4f0c2072b4f465164a17a5ae10a10477038c1420d9a018b125064c12409919332866b0e494aa61632b8820723294f94c1460b4c7ae206199567d2135fe4a04d907bad1c090289dddc5c2d86b336da98ae996fbd646add2a905a8f288ee281568b25446c16b48fd96b4990be3c11c582543efbcff656efbd27617263ec45f20cca7f7f1b7df224813ca123f428e5392913df047db2f626bbefcd317655e0e18dddf4c9dc9842cd9b7d1d71aa36dae97329b5d23c28ac61247425edec81068ed17cd003eed75a69eabd6dbbd2d04cc0e6d85749dbb011e6009fdc39b49476960f286ba72378fafd23f1a7e49b354cfb75c27b9a658d524abd27f01a48c67c68760bb2924170da60103c1e53238ae680415a95ae69ea9aef9ab6246b55b2f68f8eb156d61a703348e2344c53d9a0ae7107d235e0b5e3aed96c508ff1c81aca03df392041e0b9300cc3f027b092bf8320f78edea33ef91bfba823813cb9a36dd807b4e570304f9f4ca91234cc99debf77efc8d6487fa8ec091c6b25d5afc65e37b1b6628363af4c29160fe7d4bda7c63967da4a53571c5004d0ec69b1d7ccd3b341bddaa45e5ff178e74c3f35ce398322310ca8e499e40495ec04121ee8aebd62f1ae0599193c093383e4072cc0f7c9df187b0ab96bd01b7f3f9fdc8d3d44f98e15077404daca3ed8eb0d8b2c782342864a110d3e7032c0db0e2d3881032773028873c1891f339c90dd2170c7c675823734b828f06606e786958d0d7cab6c4b608e0b8e09af9e2003896d0c2951905a9064871a90547084b93c939080907ed000859861862e06a14f0816945c18983c3568e07e9eba20aec4b039dd20b05081d6840b2249061bca1fa42076b8a14c82144412262f28156599a18481a889a6abe0b8485c95385410471c2f1c01c7d3bd010e2c1b15cccaf30938be500207159705b895e713704cd9b6ae5be6a609255cf24c6aa105a416bea42d80be16ab5755d5b853dddd4d1b15825f7b5d5f0eff9241c8de345b6f6a574abbbb5b1b67bdd7dad82bd7ee6e410180a6a03516e77df224ada65367ba7d346cf698ef535b6f027b551527a9935bf2a8d9dad44e0d6529cd97865bc7172663539ba3f6194a406bb5507b7b85d599f9edd6dada72a1e5421f753439dbdcd29c5fbdf7c91b581f5a94d5aad75d6ef33a59d52eb77dd60854aaeb3a246e6c9ad5eca6751da99200f7fb54088110e05cb30780a635026bc7566537cd89fbad950355614ebdcaaeaad5aad75d6ec3b9b9a9dae536cf1aa1528539db559765b5ea75dc76bd4eb671dce65d23aac66d9d358275966d59ad7adde536af9355ed725b678d68d5ea755cb7bee02e77b9bb699685cb6d9a9d72dd68e3fb3e50bbdca6d929dcadb47277a691a9b597ab53b8cbdd4db32c5c6ed3ec14cd6edcd5ecc682d534bb4db99c66a77097bb9b6659b8dca6d9294a5012baabddb8aeeb3cae081391fa512272d32873468869e3dd238fd029473a22bce3a4f37d1fa8cd99ae2b01e7ae820743123adb8756a809fd6aa59736b9360c4354c5b9b9b9b96118e6680fb954ebf868204a0280cf83666622802aa123cc1fdc8fd01fd8af6d4a4e81fa973b427f3652236314c989fe44792a24a173c5f517365f1a05aa47e8085e6b853b1ef5118a005a3447e8230931430768b99234caecd1471d11e572f7d20e4597586a00e5da7d823dd391b3a2fb3e125c76afc7b50ba207a824ec17eb8a5832542402000000020316003020100e0844029140980992e27b14800c709c3e6c543419489324895118c3400c320620630c00c01862cc1815580013595583ba6c62d36a3072c29d1ec0353c9eb0925514d671fdb51a140d5da71ec7bd18b9a20721450af5fee3f66168a1604baf9f559e60a67a16e4cbba9967462d1bfee7d9084cd0507a5df74888c7c6a6f02cca6ca88fad26ff2c552ef86fdb6b45305adcd3ac8a4513120742e87b40045b6fb83b80c508b1ce15231918481b3e908c2c73037e020475cdddd8c6d921522c6ec69f86207d5bbb2cf9853a9725595ab2a34246d9772f6b0c3354639bdfed01aa659a1894c340db9ac11798da3b29ffb2cf83e9a42bd994e273fa15e69dcb9ed8ee50bfc943620adc4fd0c8814d008b1c55067bab68601dab349ceda2403ed29d4a221c2d703901f2469e81196f5c19ae6c6505c3e280604793393e0676ad98e3ad814da83cdae00e4b25fe35b20cac5fe38a76676bc41c0a4c7680515640ccd67b283df3e31f52eb3215ee9f3de8db1e90792ccc7486a2752f8b14dc6a50a312b9ff112e0dfe0ebda20a4f610bcdd8cadf64498f7f510e60615c9b0338140616b9002800f6eb3526a42c67365456e32bffda56d832793300b249f24c5353943a698468de103d3b4f2cc9199acc1b342fdcdf100ba31256d7285aef1a0d7754e46ab608cda160afb6880583873528e3457e309ce1492185ea350caa74b06a9cc7c1c74389210fa553eb134b61581e480ed723de3225c7c16e0ae0ddc6c04262e01f6319b272458ce366382efdf0c522b2105a91e7f513340e7bb66907cc1d429650f22d2478a0b68d6189abb119ca85c7c8670d36c3d0f09659c8d6522afccd3916f2cd907097185376a50f27b99ae64e9132c7f536c364bc064e2708f64af0f5b2ba7eb406fa31067d04fad1e1a5667af0739a830b882d42787617cf0385f09ef2c271b8cacd8de7af972b42af37828826f427ef6e35846ea8b41d9145f8c43fa1bb620c1ed96cb92d62b8258267f9811db5e8dceead7e9798db61333087852c829675c224d60b6ee78310bc64b001e28276a9746926712ff91db549a041bc1dfd3161a56c3bc00b41a76bd62e9a700fb19b680cbaeb5cd5be8ccfac6da8962d43511cc8043da7a1d50627ba1c67c59b6e1a76403e5f380cecf8c4be755283216bb8c79e691eee6079c8132208bad7259d830d9ba2f20d1178bbfe90028224ac4ac35493639c0f12cde7f61d71ea2a4f28c3cd9a4cf07269aa3c1066d37c6ebe81ba8a1824455846101060022b0e3dbc81db3846320a19f86a379552925fed6606627617c2d69d81596a6b161bdf1f4e46d4b6ad66be64c94ba7300c90e963a4f009cf278223c17315ff885128c7ef4528b18317b387da22e1769571abea2b3a78412ccc7d0e4782bdc262d38406b4c270b6382c64db63782a3ffb192238653e70212b33716a9bb855efc82d562b014d54d13db3289c1581ac8a88502576b4408a950256b2d40d383ed69eed32a286e7992ee2b98b9ee3307832ceb681e36b8bd24ef402442e1897538ce441bf17dedbbd62a0e81b8f456e90e598e29ea2f92884116d02194bce9fc8aecacfada0b2cd3736ce9176e80e475db78d03ecefe53e0b5796356aa02b00e071b57c98c5cf75fc19392e1969d8e6ca63b343e24a05cbaa9f713a47c624e2c10a22e3174323f6f493fb9a3ced5466c191f170c90bdd0f24941ea0d4c8215d288f1b486e571a195bd2c93b406a601822be90ac7d50236c23c38fe6ba6367726a24902aadb753913617f230d4e9001338e5f52b54527c05ea71166a638e7d6341001ca50ee3f9299aa5e83ef8a06b2bb616ae8e3a37781cc6feee89330c48181bee1b2cf2c60c03968e189b38c42431b1094782328c48840bc0f039e545b08a81eefae3ddcb674b8a3d272f61d0a57a6ddfa5fc2227f2b566112123ad30121618ecaa3e5be82a7f5b52e42cbacadf76ddcac796883c5b97f2b06dba0cf6bbdfc802d5fe48599d52f71e074b32db10f89d1b7fd62e2584460c91a314a8b929558cfcf6d5a4d3d8c5d7abc24176f312ecb3f66f765e4d6f6981dfaabd8fa30c829a5c24042e612a9ad27455cb6c4715e6a09add0cbc176cb35e81de1686baeb94b50d9cd0a4f3c23c0066f1df12cbe8e5bd52e3b302e829941e36adb451bff0b9c3bdee8af43639f17a85d15f0d96c5162b202af1aa3d26c066a9fd118fc1ad4a25f52b7b9559d7b45374c29906bf3291ddc495f50ef0ae5a14c45a250749f5100a33a0189c68c53654f9dfa214cfa352c7ad49b854da51c70f34da1ce657952cd1caafc58f6021616d1fc75cff6be1e103ed20c076e1fe284b1346f70f0b3a3062bb83378c87f73707f66ab3da77510a6b12c071b25493c1ad748d717bf35774a3f5b0ea49d64ff9789a691adb6f08d6a82e2256f97dddbd0299187f56e5e368562a23d1bda75826f24a9574c811ce32f18821df840f9a3660c71f31008ae232578b6412fcb0cc501f85376603dcce58f7e5687394c871ea2cd178c07775796de20635a338a1584b7c10658e0391dc957141498e874baf203e3a98bf1f7f04c9624ab40eccc38ddce1f9e8c8635cfa89754b7aebbcc0cfff63e6871d843c721172f2a228c8a22509c9245fe1b7ca5490deca4416d3d3461484852a8b57af4e3c8d53ac97eef6ce61aa4912e26c42e102f547aa4ea5421786237a6a46bf981b095711204ff4f9ba44d0e8937ee470b13a733e238b214beb14d445a06df784a25bc80738b74adb2accc81ab99d139083c8364227dccd7305fccc276683bdc2364e5b9481589e5003a47d7fd987f60834dc241caa5cae256a8d3b8a6f0c24ac07e3220e308206b8404340af2c71b199674717285e4e05c173f0958bdf2e4af528f8dfffc41764df6496483138ce76ed0ae44a79afbc18c4a07f2ef1a2d67341859ffe7fc6249513f1be05ef142463c892b088070b18682d4f4596c9bd8e896df15a6f8fc95ed5aa842bf75df4e9d9633a22829d552f69e71ad65244f61093016781d64fa7f05ead812aa49de30f5556f7ba668c03df913f100f261c3d77223994d546caf7ac498126c25e7a5f1eb3c9e396d914c674b9b1f71279d9146819163d86318b430c5906810800181c64a0232e956065f50f8aa2060cd92150670116586efb61281363b4cc39096f7ff50b8f74355516b1c8d0058841f4ee840118f81072c57bbcae4682c64acec195d7f62473ce2deaa6c4356f72abfdca6beb3beab99039fcfe944b698c87ec2ade9d3461818a6e66113b65c928155e2cdb61f11d15e8ee9ba0c25963605488e661a290c1223222bd29a4b34cbb02dc79dd5af47e0ea31b697d6bb6dfd758e0e00b9c5234254785b4651bad7f5cabf0b74ad1682c175fb636b528118db9a903f39215162d12852957426388452675f52e6e91c8ab7b9c6ea28ef7a800ed671c034544bc1971ac2570a32eb085d9ef9ff0934fd12098c172705c387e686ff9702ef3ddf27d0abef8722e1b0f1328e855f0353bba50f46021a9281ad48eab4f4bcdde60d0cb7850cb42798c325ad2cc06075996c75a2ed4c723a3b5331b1c44191e6af9501f979cd636b3c106b9055a8f2b79288c27f62f2eda3e5094331c48e47e64e541751cfdb454760d82428f07bb4d76c7f6df161321c2492aec55517f2256a7f988618afefcfdb9a97153e2f7810a0ce813a35af2e868ab9080dafd651f7845d7f629d91a073ab0542069f86478cb86e5e0c00b82741a112b01ed6b5f4cb0fcd73db7402f990c99ecca100cb69de7250c862ded2111a545e4c87b12140b6a0af03b9cb69a3c166370a2ed992c0cf43cf7b57a1e8208d3091537fd518a8b45f09cf21fcd507b85f24195d698b519c95420355e9e1b37d6ca8c09e56aba19216c035e1853c95324f1676a046aa163c0827d090616599733eb16f835f56071a46a39c92e663c74a88f4eeb04f78de444011cabb8474e39b69ce0355d105a5d88243c3a9c4ff4f519d836f054d5569f6490138b840d3d6cbd7fd59fb7382c3ff6dead026484a683ba765d8e1ff7c3adc3a3131006eb6fbf8a93c479f072344038254af840ac232f1bc3e9d525916e25f7f7caa2ecbd5149eb92cd37517cd14f7a99a78879fa5ebf8523c3d1010fa1595171a3a61613906b4060c0238875c033d82288380d6db9c36c3d66594ab68a92b663512564c40ab3121c936bad8184353fd2d1ad7e65ef079365a617349e720ac7f1df90e0263c847bf24ce676ba8462d0973aac7c33124ca75fba7c14048ff25d4c8fac48eda1979ee28c8b9468e732bc409f6d522ffe7f2015f36c32e74bb9bc7e4eee94a4f80c9d98f83b0c668cab0c977bcace5f1b65a22f69b3ee29cbafbae10a41e42f979e017cca0ddea3e9dc1bbeeaa46fd62de3ea4afea012b0366fd19e2cc92dc7cf930f1e38c043381adaa704b9d27cb9dee662a9c1249646d3be6af3d49b9617d4fe82fa1d83db79e126b49a3f58ded48ae9b325d3bb6df459e7f62d06eb7f892905dc2423f5a6ff19af2b808d521d83f06badfaa1afc7eb18462c51a7ff4a8d63b7a43e64304db5b8bb2b5b83a2b4cb03c404c6ee2b9609a9cdcb5cdb7540b5c1122961e92bf7672f02f9c7f368960069da47638b34cc905b59bbe370026340d2d5edc6a09b10cd1d2076f3b7a0331d177436973bd28736d91c2fce8952d994e414c9f941ea5f2a54e858f8372ed6a566c8157e89d19c462656b4c9e6817d9b0f4a2ed91db56a9d662ba966baa410f2a74f69ed7ab502965fd89eb44df5dbf8647ff7b2be5fb70009605a2c2949930dce19d45db2758d589f427229a5ba3131307c87c2642c0b552a93845fef333075439ae4c5f6bbc486d62580aa9501ca6b943aaed6e32c5c2db6b65dfe337d6198bbb9419bb72c0cf6aa8d663c0062200297e89969b46bfd1472ec64928f6bff6d8def1ce7cc4556833876f9d5bf9671c1bd0425f8137860513f7244c1c4665bf1030f574bae7d83093078a1f25a7a21a194c1a492f7b5cab0d6baf06f657fae1470ec600ec41af130e3bfe6466b7838474665bcaecb71f0f250ca6f47977785ab7c1990614a12fd878a810d432588e45cdd0897055b95a0bcd385fcdbc15031c046c185ae52d321032fd7c090c15a3955c728abd3805b8d8fc00a4d5d147bbed00a7fb884f2e73296e8b3f6a11918f3c2b86771210c9da98498a75e984ddb60eaa56e963989f841a8df2d7d068b5b2bb8a725d53c76e73213a1ce1cddda91eddfaecf12a8141623b15cdb535469df0dc996bb91692f53bf9a10feecfeedf653bcdcd0f4f78029cf62905048510e1c8e882f9b091bb9d12c0dc5c08d684f4e2467995d65341200b8f9413b24b96f1c404f75d7e74256b8fc0c545f17fa8b9e945370fec99a02e097cd85a7ff2c62f0c733a293d49f55b260dce491a23f2b01f66526ab0e25f53ff2ad8d194a503f2fb5a8aa159a4e7647ef1b15c92f8b45fe27c8ae405580950be995392ae8984fe4976cde7f51e7d74460093d9892feef40687a8637b8cc976487c39f1438ed1b4c4b6d0570b8735ac74b742b379df3b3ecf0b38f24e4c1cb7083167bd3a113ae58ac5e248bc1fd75bde3a0e915370f1f98f527bd201f9a800b4893916a1e65cdbf3509b60976d9c50f3ac3127582d0655d8657e4bc8a684b71235d0fcfdf1c9c56807d6bdf0a1b4e4dbb5e28a937ccb530309588f3c8684b8a180a8485bd7e1e0b837cbac6088818cb8eb596fb5a6f276d7b5a1816e3d27568532be94bf053d45e2b3f113f21cdadf093f74931dba8e9bd8a4feac54033499d4e9ec316ced98bb0a4ca06594ad74087fce94e8f69c60fdc87eeb78ce5f0efe0d526134c461cd95146b50b8fd13f159294ac7a3a79345f92eeedc9091a9af5ab9b2be9959c354f965a441d14d91b5985f6215591d9b0b6630d7681cc28509309a4fab60385269d34485881d0b82906d2f9463582a050e7d7d98cdec7a292c4f1ec70b3a94cf36ce7e11d9d53d6ba50c4ae43017d53c4cdc5184e6df438b4e95affbb508b595060a45e907e5e76303cc8c47a6c6741612cf1b4b8ad41208a6d1ebde502c1fde3e8ee6bdb8ece0c032a711d4028ad9b34bac72771210ff87148d6138b3511ec4bd17c9ab04f8af4c9c4be8ca991538caa46adc7e8d287131dd7303f4c09a263a8f286221a338cf5a064ce6112aa98f549958d34b8742ac97e422c2f8850b9aa27a2720785324ed56bb3b26ecfd6eb6040b96dd196d2a603c8e10c208384e759daf775ee0a102c0bf5c7901d25000659103733a96c9676adf5e58eb3c2b1c54cd7479afe3f7be1048785fdbb6f7b409bf8e83872a32a23ac04877cb7445e7c81bc74707d43bd9027799b61a3c337fca7f3d7fbdf3d3881c982aebb7fb9c543b991f463fe540f7b961bf5b0a6c5e22f05987054cf5d3d24dabb2e8e3b14d54543462c2c5903cc4ad5823d1a19afb837f0aff74fef2f76ff6ed87b4feadedcb40dbe54a3b192eafeeaa9098f57320bb582c76631217cef1d9ca6c82b3e3817458854894b93fa0162bcb0d48b9c8548d931e25f9f110945af147f51759f4ed1297da98137b57f2f0b52adf653b485b3d17d2689f586628e1d8067c2e48ea0038663a028b21408c2ece035b2d61e9da2dec8c12a060c7877033e3c0519632a324ae034d754ef78bd0c69e56527351aa5e790feda91d353926074a9dac8f47293702856847163365cad620a6d2f76b51e335f3bcc6cdcaa8c14a374f0c9cf335b7591742baa014e9aee1bb9935c6641a08f90bea8cf0ccb7a518ac82b4d09d57d949546db4b8ff7603d628ae01333d1111bb473cf00956d4e0d695cfb78dfc9349c6723de7d694d80dbd17d80cbc821a87104e8fc298690cc8354da5fc871dccf4582118690a1333a46c6c1a457ca457a6bd1cbf147522215641566669ff9d892ae0884bc1a9ea3dd421cb47990b059709eb5aa820eb2a772f3ac847439741733dc0b0c6c90d0444a51c56899698fea5c5857f7b00ade4ee1ac1e82f1eff38683ec72f35039469b0a5b24f45362a753205d170b4b93a42308b9d0431fe0d30deaa1af681f79b8f1f33f4bdbba4ccf7e26aebeca99c025afd392ac4bd53039890af265e2cba88d4ad9f34b49aa0041448c68443543a139b50009f82f78f50ca79c4095201bc7cb11bbb51604735b1fa53b4c294415909af83f29c730b5ccaac4571725eefb9a2446aa96913fcdc7c21a8412345059d5759b1fbee5ce1e48c6e23f2fe909b939489dc718dc19cf5e18fdb74c1e85583dbda9d9eb2d9e02f54a8ada37fc834d258ac50aad53b641617fde669213f6f755b5ce6f5704efbdae5a9ee85109f5d88d9a199a5536d307837a510ddc7504c266b80edecac9f5530de83349eae4c9543f9f308a6a80fc77d99714575d2dedac81260a4f25e91d4c80da4a569f8a9cf092e89ee431edd154278fbf0ca3377bef12116fbf457091684c9d02de59cc4f1c865bed9ce73ce6ae7370b866cf2b101c0e4060ba6df063c339592c31aca325132a9ee0586aa3c7a51d16f857879144357624e3802b73bcafdf013249cec96405d45371642e8ed483893b173e57699626aa0f10ef398aab641de6c45954d110dba84ea7d2503d54b2b657a3c0363a657aa9c4d1cbca1c36a2d26b00136382ba127774064e51741baaa350355c1d15b28cfdf9f4c6d3e1a96ae1416d14ea54fcecf2892463730360f7842a8557c6234661ed6f48d40f09af62f08e41f6cebeb282c3c01e2fa23407cbd873bd45604944a2eb2cba7f2b013454c1ceb0367b24b5edd315978be48aa98926358f34c964f3fc899dfc1f3d77f9b4195e8662c3b74c18a90d62eeb0e20c3f4a57077ef5553bb518100636b25ed4075c523fb130f1939f19f9d614cb7fb99908ae31764bbc24eeb0169dfc441287e992552d45c8a464f0063c706917e745889ecb794104bf0288abe960dadeede415c7c9933309f3e6331df10e1babd422a83d8446c4dcc38595e4f128d669b13aefa0d0482a1c6c8cf10a4c3892fbfefa73c6eb88ad427995b143ef90188694ab886062021b4aa8b8a7c849a5f3dec45879cf73a2837f6d0ddf62f1d2340b4c08d1d30e0271c13cc649e5b78f2db1c90c6f252b425b850f1093797c81ad8c350dcaec2d6217c40b2d769dd9652955047310ceaacb118683e674789b5dd4e5e95c88a464f2eca9314933b89981cb486205d0963ceb982745a6fd94b98187d7c555e18c8d046e911c4d5aab9918838770a75a3caca627090ac7dd8a7687517a57abd94473789d0e2e23af5bfb3984441635a70ccba721f846c0e4c14b4faf86efcf63b97b70ac51fb395748aae27590dce8869212ada3f27f4db6f6745002c7218f4960d8fa163720d44ad8488f6f535577116cbea76b73a4610e1af62b728a7e43398994a1799c179a8cc556157c200ba3375cb22305655d1cf3c66e87632f21e179c98d9d7c7756be7dff075eb07c9e44fb9f11508e8b9f29df5a7c32029f29c98b8fb2a9183132571c7e6cd32f1e6f4bc5484b5e40cf20e2cd0293327dc100fc404f029e4b07422640eb999629c8cbf7dbbf5fb1d580a5ddb96569bc1f4817b43f0353821e53e24a986c52e94c06bcf800de6c75ce68aab1a318d52c6f70fb75f1e7aa235025654f14ebf7147966794f7048a3a57251ed7582ed686becfbcf8d99f526b14843ae82b85815966f341c755d84b1a186736d12dc843fb84502a0869f3a2a59eaca4dd596207d51c4e887004265acb3358b0d045b2640ba24c53c7ea8594d39bc170e9fcd601e06a48cda80cebc22436f8b28f94c674fa699694155804f74e516d7ecbe5bfa30fcb992259afd67f8116a2c04655c9615ecce14d0c35391d07ac966c85783808a2074132bcdfee4815222b40baccae46153a4b6ca1e12c9c02f76e152b35cb1834920bd961c1d9ec9fd8679c329558486250fd9b4b06b492f59961379fcbddfc10f9f9449afde5dbf906a1c672dc47e16ad2b407565d4067ecde67196e8495600c859398f41b23713110e72d6798c3ec2f1536aaca31176d1d3f0cbb72883032037b0bc12f2620c68d52aa5a480a4122c0160d65d3407bc8424694ea2df24bf3f96fe1509af8e26b7aa13af7b59e793ec3c9b3e9a9012d69626e631df1c4bd8100ade983e368cb541120e8d819aa6be52a4472b4429e83cb6e0709a0c27e17bf19aa8d65831c63ece808d11b87e0395dbbcf97a6fb98c8db3ec1caee28adbe168c7fdb959bdb35a37efbd95279c80e95c5145905ba595359fc1a76b92090e3c7138ad80cefa04a59993f744361809aefae42e75c27a531615e2a76a2130a44bb9c67b0512a6229165a72e0419a738b872a07d6971cafae53018d7043231379c4d3d51d7358fb138a46f9df7adc0d4f65570d6842ba331fe91fb1aa72af27df5d4e58a2a6b68e7e744f271d4e547f8035e5df86d6142bb96a331264cde001ccdcc52409db954a0f96674131fe659b7c6e21c14ea531d394b31d46ff9b02984d793ebbd79a01b130f5c90679ee3f6c049e4fef7a5445359f4136fef0dff8003d4fbb8d88da5d4517394553afb980b89a188b8c7656cf564c5143e33345bef33fbaf4a06d2e04ac561f6663b7f5368ff2ad6c1b2a50b2bbf760d3fc954144177f8a141be9d70001de6f5c6a13ccec4fd97f8fbe34e9f1924e8a7c31cab20d45e6960e6f2591371c6a42aaa0c88d4a74af5eb3f999f6172db3e156f2072969b1613c1f7801cb6cbb79e29671bab6bae175de23049bfe766b04f3cc85e0460c6e5034f2fc5692f16df34667bd654aa55f1fb5e828b3c650dd8436d06c418c365bf831afbd5482664f868ae75aaadfdd42dc6f095d4de55efb90bcd27e539764ff3d01589f008581eba2609d3c61786e9c5d56fb17c8946c33d10d5d0163e4e591dd310968b4e6c91ad5cdcf94d2449d91750c990aff9085d832526febe61e31ac8a13ffac2b177ffb19c87817d82b1a5cfc8590d26a8b85dad50379ac431fcad2b936db01dc310555dd860a5e6fc253675547b0553007ac808114b09e0fa31a7fa1c65ee2740658d05d6f4e6df1a507bb842c2114948f0115c18e582ce62e18ea60b665e540e3907a35f2e2008a64fdfc825e8a8909519bda2bc223afd191cf4eca8ef47e9024484b53016fb02739685e3c2bdef8d4d5af8f1dd5f4ddd72dc279474459f99b69324af64b7f2ce60b698978f994cb0be8fc080d21bd8c1d6d1fa7807b398c1da931a4691235db209700a2127fdf444e5644236fa40ab6dcb3f38c4c65c23269f0420d6a602a08fcd66336a226678db1c96c16025e620f1a8cc0c1e8e8f617e5056c5c530255b75981341b1835a2e0a195fe1c6124d01b7fecc85c3891e8619f1362e12954aa328ae4cc73887ed845936d16e287c88927f87afb59e9b71b4b7e3bd387cb3e432ec644269e8ed9a5096a053124715d0f5be173c432d3b811abbb3836ed2874fd6b49f4f439cac6e10e9f3263993ee5c6a2dd8c8e0f9d46a6834f4697ca9c484a572437891a9f70f4773c3172e82cff1c5469ac97436f37f765446529a5a70413d4a294d0d135d8c88c3c9bda05179a5c743a16f44989a88eae06baf6300c393314a537048a783b69a192083ac8ea40a3b66e362f709288d403ae926c4138cd700b1d0a590e4c79118bfc62ee5a8b731a07f0d2a0ee06b9a0e5780bed551df4df52fcf782d6cca8f2693d4d73d274f97c652fb68a7479a00db9e007830ccac769825f6009685f7281c15374e0d396e07cec392f3fce41f056e482f3427c38cfbcec6a01de4960cbf22d35e5b1ce3772c91a381d291229ffe0b34015256a21d4cf4a68094ea08a1d6792d48b96b89743be8b52b272f2ca796b7a5a8c9416a620209a9b800e4fb54d9e8b315121d7d4d64bc96e8eb9a45ffc9d13d1b5733d60c830ec5864cef1344915d2cd9f56e432c062a42ec228bae9328a244ff924c025b5e2138ceaa95d94efb41b70657afd7a70dff5c3007b962eece29bcda05f46608abc6acb6b70d9b5553fc675ad7509d5713f6916c29b6fcfd2f32904d50a433b2368f4f1f504f144c03edc335c3f0461928e7056cb802c5cbc24231d17e66ef081adc9a832ad8050b99a7ebe62aed05030c03e9500770473b1009c4bc29f80ac302b808b21f42a8d442a248f75c9964471fa64497a124a9b4d45299492f2d8d17ec1c546fd861829791f85436a92afbcdc26415053e5de0378e7fc901001cae2cfc2679ec37948a83d2d9432cd866b0b8b9e13a251125a5049142dd8dc94c9476e385928010dde807fd3c380b169d58ec10adae750e0c15e3dc147aecc19dd454c96edc1461e4b5f3bf55db32540445284c84ce946ce5accab635eb7e67a89c3873e61e47a1318fb38e862097a682e6b3873bbf96107c9ae7ab10631444f3e8801d45a7b82460ea06bdd508975368393ced81b23833b2d5ca7da63223d97b2c9cf02df822a27b66999b5cdf9418c3050896a0db841cf57eb0a984d25cc305dbd5c218731508c7b4c0f2db904eb79cd04846dfde4e73585bbfa0e8fcad3450181f71d0b6b39cb63966c681c274c9e235d21bdb4b7dec73240fdaa64bb7973b8a963e0ae014dc299306392f7c30d093334b3741613f29eb5aa0896d7c8cbf3e8d9654c5dc6e1e43a8b0cefb3dc250ec38a660d9d64783b070432f6575586a62d5a2ca31f1296f6d8eaa28c5b922300c1f04117655b5d30981fb41fbf1d1e8c4d8c66487c66e95eafe67e8e775d0ba6b3f26576c412e1cee4b238873e9884bd07a97ca7839df9695fa727f62f2312fb596670cc93bb2f47a7689723ae98dc9263366d59b0af4bd6bc01446946ad6aef8adb9d92374017bcae501218bd911f3a07bf29f57b0ca8c45470c47f6ed40225c7ac4c429dadeac119a8efdf04a63aa4bb37fc26d80951bc7cc7e2b7ddaa37773afd105f276be139abeda097c8c1ab3b71354409094828054582e33532bb0d58066fb7f13e20d5a4a9a839127766fe2a80813d96025f4f8fce080e451adc5ca5ceb1a3fd2aca760bda40c629243f9b9cf9aa14b3c6aa40d21c4d14cd87dfd6528c2f35dd31deeeabe9c1bee4a01ef4d6ec43f66fe84c4700d81c4c09090206be5a3a404e2dee4a6f59cb8061112ede9533861b55a9e990e4354d080a8d2b89f75d5d2e6cb2d893bca11c0913e17697fc57f90e6d967cd3c7936ee4ae434c90ecc5a6006faa0d4d6916d1835c1c2607cc5f62a8a26416c2719606d9ac3a729af38bf7476c28b831da1e8c4e0dde59e667e256702b0667de5fce2936b53b8a670e28336b10ccb86ad66806869e79b98af7a79113a3bc2d3732147cb49f676d7de76fc8a702b98556811b0dda82ddcd1a4528281f975302b9d874d8d56056b524b2c6ca8b01c48bd573887cd6321c0b75c8e61642d38cadd25025619238d3a76c4b6e1723020bd0d208e355eff8f70f9d6de8324ec822151d35d30e8ef1b8edecf9013041a17c1f037a2bd92b287afaee2f8d0301972545614569b60c262cd2dded436023630c009a69db1ac9638610f6bb680b08cc7146680fba87a84f4ecd9292b32e40457c74d0f61f5a39fd8358056bf38db870bfdee1591ede19ed61b32a1bd1b65eaf511b872439ea10c6d26595d6d3ce78b7e0c5368787794d19d3cb8d6217be3fd0eb3a192b3d611cab34c97164c16199e8c2d05be41915ac641ae907825c50e971fc918e2d6ee9c24a4a970e01a1fc00f3a7f63ac0fd416165c02ea07018d00b7a707f10d0a42ff5a55a10e8fd4d4c45cc28e5f4d2347c04adfbb4b85efea9026d8f94d7e44846d0f79cb8e5a67fabbd44417807ad808c9c2d13e4720c7350e72991b46476b96f4e569c1675680dbb4693068709c3302c959ee1b44506ae017efb79b31f6919600bba8dd1ab542dc32f7765ab6f3fad896ed9533ec19e3c08102d237fc9fedca9e8b81bafdbcbc5a2827a774283ad9675a9d7d24604948b922d120d46a6971ed2877def4a04dbbc48df2366de17442443c6e9843eb6ab2cf5cbed9bd7affa59fd59741f8c1cabab2007b06e6ec05c8e0f997e9ea90d2384fc5b490319d5c08a91c4777d3c428bc16224008a06b16e3272dbd99af0015c3e629d5152c62eb518af03cae085dacae5dbbfcff86ea6cbeff7c82c876a209f5daa94727426a7087a4d527061b028251f8d049e3dce87c2a6a433297a9814a3eed8ae03f0f7b9174c225fb48097fbf33fda30257a8891e03a436e24a68bef42ef7dc4273a51709e03b6e9a8a69d76f5fe4bb81c3652b0ad453c86b2f3dc4ff9b617dd2936ed003a258ab70113f82f7af82e21a1839ceea8e3858fd07953edab7b3ade5dbaf3910e81c943abaaf584a7d09e777727fc7c6accdaba3dbc8e6a99a0e0ee3c9cb751ab6985414130137480406c5ffe125f244273823136fb1895e2d801cc915aad3be365785580eb4bca2d4c6c1f4a5a659ba0c9923755aa97b46f2089a58581f43014c614d0d007946c1d419945a579171ad6084a0fef7b8d885dd5a059f609c56c2f99080de3231286a3f70fd875352971ca1ac243c346c295ba27bbba240514b827b040227695402c88bd1556eaf11201949b3d5dfbe48e0e21faec877222683c3d437832f4856d1bfb1d04813ee0c2447e2fa359e02068279e917b2d10e8ce67a442dfeeecd42ede71633363e0382985719be0e62db5c2590622648c051802971fafa5afd6f7d1a2a13c01dc85c4985c5a6ca375d1368f1afe8fcef47200f6ebb6efbf6b6a06ea9666a9347e92f662dc855870d0e22e02f729459fc657bd1de392d87af0224fdbebd54bab9cab4a44630029f727602e123b808f0f271a817aba648e0f6742bc750e225b02a9950c045e250fa54950315ff8c8e22e0585d1ca24e0cc089b3387fae53e1308808181016b0dccedff420f77132339544eca348811aa4683039cc083cc4fd14d3344100c26837772beff0c23b71eee980862dd019a1467708bb1e7d471e5f1aedf4f162addee1e1a5e373d3f74a6b50198be36df3549965333d25ae01d0a31029962f426a6eb7a00487aa7e98803e41f4f32f143e7f417bbe2fbc7de82e6716c018de382e3ec9d8755107c8d7a33cd6a890146ae10a943cb3118fbe7bd5bad0adc89d46cdf814d98326ddbad3d6e66bc7d0c373e4839e3c64cd6f71fc7f408d94383691d2a1d7600c891566bd33bcbd50e9847269ebf9daccac0c1a99749e993b6eb58db73b75edf7ba2ab5b4b7d669b5d761759175765edb0042fffd5f7007365910e5f7337b450cffcfcbdb8970346b84ed23bf40f7c8292abfd4c80e0bdbe6c3b11c6d59b760606aafc3370beaa3630b83c8060547334cdc4d3a6da46df9f30005c523b0695644ff36af4ac3743bf9d7af05673691bad0fc2b6f1ce324696607681986c2699c66040005108085e27f47709919b12f89b0638d731834e1ff36057e81ef740ee62fa2dfd2667399ca8f02a0c1c031988a536f86b1a8172afd5f73e38065be25eb5c160f2a92ee11b54c65effaa0b0dd62855fcb24277e4f688aec82db8f7d8cf05006642ba52200e466201e3b67f7659756d3f6b1abc36c320dbc456206d9390d00e0798f59b26523c668e7b6f4bf7b69298a96881a09f051eaf6e48ce72d36bfb0b5f3b294d224a9c2e324c666ef46e092b6cdf1c6f39c9798746b8fe75e808997384733a1f5fed42cbc771b217d6a946831bdc0caff8964e757a180ba5d324d0b9c1b21ba1a5fdb7891caf142700f98c18f172e785a0dc4458b546bb68ec7678e7e17077db72be39aad28d65f06e8415411eb6f874fec8f467d42b19f99e846fb1a011c319f481de08e3f1b648729805229d0650c84e774326807e90f82b221c6fcfee91836a8dfd3e92073e27a6414fb11b801a442c63ace63b8b19afc0611c7bbfc58c87c9ccc0026536d849a27d719bf92c1dc59fe323444286a607ea51e83fc6af1108a54c3fdc648637fc8c7421523db11ad8f3cad87fe3db53e30e6c2c94ee7c3b5795bec89ba1a9754d82ca9ab4723cf86f8e1f8495af0c3d71dd1894eddc3d21da92d4e1aa44c7a12db33ed7f473d9e4929a5de284f08e51ff881509d583bf5879ac8eadab9109400f75133d34ec96311924c3b622229e2301eb0e809696870c6e80646524a217270d8cf56636f6f3a46a2ea0393525464c32f9f8e7339dafac5ef5ee9d4a503abef06ebd50b6de403669b930c3d14bf9c8635b048edef4d3a50401a37f4d326987fa2e5cbaab9927c8b88dd252311a1f49511a0568ff57284d9b562ffd20eebbe0cb2ac22c073753733f3cfb23bfda2c7267fb12fd82d0caba1f7439d6abc0da80a0350beb5d77bfd6485a4dffe4b132449c2f1cb2441f96fbecc28abf4edd005b3199351b4120ce295ee4ad21a387a68dcb548b4ea7d0370aa1553518939ba384152424e4e51ec7810aa8cd10bd444ea30a32e785e43d287bcea1911f9be035ab3c54b0d6700c263c00541e4abea2a2be1eff48f52cb9f17381b49b56e9f8b4c73710d03a2fbbecee76a3a50f006d530a57a9a8535ac58cc5a9a5d7b94ba85a7ca9357be3dd4a0d5427e52e4ebf60ca10ed5943b4f2b0a46fedf642c3353ec0ac753dd620e7efcf30a6e9f609ad873d2da28012ccb2d2712cd58420168a6ee3e88346930f9b5c23e01d349c3ad87e17301e1b05130777ca60da1f12d5a739d3f3e06ba4f02b12a39e10e0a135acf78157ecc6199ace18cbb0ab6ba7f46fc0b61a359c7fef28b3128e1450a8859c6147059ac76a3c3b3bf174df6b09f5765430e771e7c4b66247e25b88a711cc963613ae3a6ce90089acbec7cae9211436710469d6003b104e34f20ff8c1d5a2d14fb16391db1fc98aabb3123c156914bb35186deb0b61b72ca6a888662adf8efcf3f08fb204b94fbf0eebd282a44c90f5d0aa2dbe1ed6372285cb4119eddad38eae2bd1d23f49de18056bf70ef9da175657e4ad55a0d18e0c31e1c994de14016aa70eff2dda9eb58def9540242d1ade6d0be67e5ea2a25dc72829491a2b10ba58cabe002c84c82fcb7b1f61905f8be3b66a5f3544acc722926855a14f5fd5364df619c9ecb079681d05ffb5893536ad2f8a9bca929ba388b68040a7a5d641d7042a72349a4729653a2fdf6893f58e6af2c0ee2d242b286f5e597e44a5a4f3e1c946c5f1ee5eaac373d5743aa259092b258b2a57d0ba745ec00329041b11fb686eaac26ee124c2220dc72870909d70c76917699b444a93ccd7c26e506efbff71d14e7586a45a98fab033f02267e8472f2235a720846d8238995683a036920f7d2d63512283caeec78e16c799fa99465ba45762908f5f8d6072a554493090b2313927b2648e66cbe1593c78d19f0adef59f24e1f06083685ed33be563e2d445accf9d7994cdad3675f38125b716c2c879e0b5c2992878f29620c9197dfbf6849c1c97149a21fed12541f761c8e19f6dbfcd7dd3e2703d8f22f7274fca79d0cda95a9c4b6d6a5cbeda482df2208d08325a2dca867f4d6420e97b640a983fecef30455e779a5ecf32bd208895b2b2914f354844ce5e9ad76e32b2d49ceb3153d7b652fd32a35cb51156f7aaa0bc8b6879941d3bc52a93364c214b6362dee09e116b87d853b6fa0d093e827c92229f11f8b1aae7f8c5647aad693aa5ed5a55a6f163c4a755b8366a1e042ddbfb6b29f1b51fa9a345b677d09a603dc5141386b86ee3686d2d3a0f61d286c17115448f1a79dbbd9f07ce15bfe5abe4251e9237b35292c61b796b423e739752a8dcc29415af676c2e875ce9a8879baf0f706a75424ab335403221c2f664fa6f2ac3666ecf4c6a92690c0b1a11b7ecd511ac25aa0594b0008f27cec007f465ec6b98817275ca2aa5260be46ff96e2cd2445d9840b4292dd805f1e0db436c2be2f53dd7c469a9032fc6eef2ee3a18b3b504d71f3b574a0cb40bdbf6e5ec4716a11203fda4eacc5044fd86752fccabb1c8ec23693ca298d6906c61fe076f39c5e70ac15c607b0068dc05de61d045060c2a853d8295b276456b87e627de34eb87aa0977dc135a9d3e29cfe4fc386f9c2da62548a2d3dd47018d3d7dc7791342d6dd19146ab23fd39d3586d52e06862b3ce7ac5b188be8f9ffaddb9a4b46414c447099e2e71a0b419f6f047f2c6e1e43690bc2e3d125becd08f9ce1d4286038630f8798a9e8db1cee814a99673b1913d185bebd10eb2e2a0fd7258f8bb6db0e242eed0b1e419f99676c1fd215535477d2a5aabd35a8f40a21cd4aa2626b5020a1205a59e1da107bd34f649dc4a360525c4ae05ed909666373c9faf13b31fb9cc2f79d501072a904892220aef17b9b7f59299e2ed38b76eb049b47311adeabc5dcc12737e0b1a4d3094b49c13e27930572da1b4c5829c9cfbecaa80137406de9625600f072be21fa2f9aeb8935b3f0cab28690a14c79d5dd3c58a47723a6a26cb5390940912906ef7e63416271b2466a36f5e3ee8abfb53d753fd8cb001082ed14f21f453d4313542f5de6de079468987be1177d645f03c69d6b8b3c9e323a468066f79a8fd4f9b518fa4af606f71263c94806ded6d9409b47a9348e7d843bdac9c168d533e4601e2c9af3a6ff4e4d920486c7c9230239e17849fa796937e4bf7f241e8c25ed8bdf4c11e9ea58fc2fd5933e7bb6c272a956f0d5f874dc6007a22d3902020036efbb5395ee6ce44719b6d9b71f5a46c24279a088fc266f9d42b5a71d4e1b9054dd165b0b5aae66eeb3ed86393f8f603aa43ca072e57354fe73029eb970684edadae5efd44630d13e62742949450ca5cac49f3ee0a001fbcdf0e0a309023d3b0a8625c0ecb78de9a191c3ce951bc327b7ed584ba178c0caec1b48d34f1317681c81fe07a06f21a50fc99999eca4805109da8804e023c62c46a6cd863f4f03022a2cd9f7ed3b84781c6eb7c6a84fc47a8ca16a9168cd4aa56053469a92a41686df06cc5cb151ac996e66dd29c23a84b1012a821d1120613560e31e8e9e1c09231681d857484ab645cd14c4e5138c29fc850437e497565dcfb11150cd0944d6c209615d7044db3a2888a762cf70699728481d8f791d09318dcc6ea645de326eb6939d73c2ca4253451ad60895a68eb76c7da635a00ee457ade9b20bd241be4800cda424a8e418926886afaa66db80d933ba45c25be2ae97b15e2b1513b3b6646fd90c950fe58cd71c0cf5c986cd6a70778d0d5fb75d3e8693fcdb84f9b06c01006ff4fa6c4b594a1f2d52f6fa02331879310bde07b87c97565836171e5a0b17d8c206b70df2a1a55cb76ecb0735f8cf7b140c34d01fcffccfb50f6154a51f2dc3f026d99b90a7129d628d0194caa67113ee85d69088a3e91448fd35f9d7f44ff4a5f7f83594ed4ae4a9b48aecb08f0c2bd832abe143c2c7b88f09dbdc4aa18410cc96db04a3a64732a07bfda1f12a23e65535ee4f4fbb24bda3f5cc97a66b0fb0289adbe46600b1a2173be7ae29bdd6793f428b1d75399e7d8e1df1ef3186c9d47f84aa0738a44a2fc4c137cd460d08a709d9cbca28c3ce1a6d11f81a9f1054af79e28e7c7d71d4c2e50b7562aa1f6d43fefe45808c775981745c3c5b734b2688d4c77cfb762a5e3c559e010fcb877a01d905b90147f9617088f2281cc54e3949ac482645f8f65e2041540082d77d0de28f6f86929acc6abb9d45cddef463e2839eb8297e1c94af0e8282ce90af76ce76bd335da4f004db596102895707e1c58d8893ad41b608f36fe1d670cec7e5e250cda9e1230a85bc2be6d6d63e8d41d0a639fcdb7b73e2d3a769f031bcfd169518e5989c04f3e45eff2b028b772c7512780a036a7c6becfe80dbfab2d2a5e1fee6d4b9d0b1f66700120ab888f16406e94ef27b912ed89ec4c12e9212e846672cfa0f203313965eee5e431f9cda1d20b8c2399e4ee1722d39b94a157130674cd3150326c693a3c34b45686c883425a949133e40fa569a843f87580bb35fea19da80406023fa02b5a91e63258532660f3e1d8c5bd4aebc7e55907b3ca7f68eaf0f9e32bdc4076c514f0fce38da518cd216ae35fd08d04e92310a6abc54a74ad601e2ad8d3c03248ff66883a60281f9a8dadd4dc48eb01e06e6cf3cb0cf48b8e1629ac125770e0cf5ee7ca4747b3874ab07edef4cc8a4325c9bd7e8bae09e7a5a880a62f72b850865add24abdc4da8e50a062844721572614542165b5526982580a8960f12e94be44ed23aa4c370312ff16c65fef5a4eea2b7c5b3569e5ec3160aac6504b1adee5282b0c6931ecc32307e63b55eaacd04fa1320af5e477fe91657c15e41facffa5d43447787b1abd9c1119e9cd99b46b6fe5aeb26aaa1e897e1cb7a6c686e10ceda1e71ea937fce75d892b16c3dddf1ebfa1b87c2a38c53a2fc6c5adf268a451d9b1bd2c259b97ec8490d8cfac5de0d0a2d85798647b6e674ec8f78f19d29eb4cee8acbd7995534cbb1d9990ff7a3d39a9f73cef484158ee8cf1650cee9a73c6b832b9f54e88bd63d8f974ebd63a355bbac68544bb5effdf5065e6b2f40731ea42ec01c07c944b7c5d1d8b3c097bdd68e661b86c898a8f0926c93c2070e4dff33f98c56155556db97de69911da509432b89d60fe07089e6a6bbc9acd15538d127857c67cf17228acda64509bb25e951a445ac3106d8ab455f168391f2de1a74968687781638d3d5301b1c29d76a8af4dfb001b9e21f6dc979e8214ed852cd0c3cce5320b441a2ae5a7aff87f1ec671d6218da5a99df226fa3a4b11918d89a2a1b26cd12912cab64aa52b3d29e18500ade2076e589729cd254d96b0e1afe5dedb40b833a8cc7e6f33c8b010e58037f521acd3f0cd5b53121b2180a16ee94210c3c5ec4c0e39131d50299fd500e145a3c1e0631c412e1f9b2cd06995c397557253cbb0186c2792a93368c04b46e97e2fe205db39d8e761bd46de1d32e6200751395417d1f83ace24298efe6e3c0f5a83e2d53dfc0c07be40aaf9a7ffdaf9cfcadc017215d63f6c78d64a0024d758b4b0a4d9276156c0129e91181f6a2f2a5956d1fd6253609057a568cbd704112e554e0bf47140f777ec183a24144d05f1405688d9bdf6000cc2be0507c874feeef4b3dac6f7f0fad397ae1a6886eb8f7f127f585727c904931bbc1a6f88e82b40d731c1607943448e5e89d2476e7ebe8d7563104b5a6eed805bf3ca5b2528e87e25d21437175c3f1dc3b4d7ba217fe7b886b54236345f2b943d7ad25ca4fdcd8f93ca0e218168eb2bc7e5af5fde1779e46253eaaa806f9cc6a08ba79f152e88f771b015160e9cc4d8119085144b92775f9f7b7dbde84691753f974e103778cea7dc5bdcceafbb0834f38301d74f48cc80c5437d183f97e2e3c457091c83b0943721dcf8ca22cb413ce613f65c2bd6332ceb097c88bf117f3df24b70585f2cebb9ae2f90d9115419a4638719cbba0f27f91512b03d968cca16e0611f49c74a550581b1a910e1fdecc0206527b05003da3174c6eb75e14fce9a379fe0f2ecff31c1fae0d4386ddaa97a06604a530dfa2dd175cc537f009399b006b5c4dc6cc9e67a8331481f0b298457f466536d42f4ed4f2a20e1085cf12889a268849d676bf209798608ce5759daf8e9879f4a0c420af1a4ac7d66bb758fdd4388f6a84dc6d812543dd239db6ae8797b45342a5a200f764af8ae301df7276253603ba055ee733bbbb153422bd63141660efa300ee22489512b49f573ea5a0005b4ccee8773d2f92e877697ceef8c283af4fa2c4b6aeff989d27ded84343c8e68826f527073d7dc2b21e10f456015c8708623bb29da718d1e040b39cf75cf19904a677ca44ecfc4e508f652d0352613638e54b59c6dd1f342014f19f96c343641ebc3636af7f996613cffe0cafb2d61331a3f0cdde79de8f54c5b6458c822628a27f4b4ba27d70c9d3b118b92878362d9e380c53ae3ec0aa9d002097a6c4acd77f50554f3ee441ff595299c875adcb809462f3221556ea4552a7685b5d8bf6855c6b46974e12d4e20b3f6ca9a724685ee9436e193d43745ea24450760322eba938c82214c3e4ce56412c962da3c60433d58b65f1146d4f4d2f22b1fe79164643cc974eb8d01efbeb8dc5bdc9dc604fea4c24145a29ea89f732891aa15d0be848e2d32246bb0ee5a0ba07da1c6863d345835cf53b83f5c569f33e60d311dfa1961ded1cf33f5d91088fc3fb2d6b9bd532c9a63a0c9e106e64fea9ed5b379e6f524e41604ca2a60f3f71b1e56609be347e562cea0c045deaf9214b809b805a01ef2c28f272dc7eaca636bd742039e2c0e3963001f9f1b9d23138f810bc344bf83261307b0f031b7e285d2e072c9a440171177daf52a523f98f01f430f0d58b2ad63949a63e0ec5bb229cff839b20de9714fd2503c6565b17072db130aaa6e8c2fc197dd983a32ead8a4e5223e46c507abc85cda4eacca0578c2200ef4eabb8506ccfe8ee7869742fddd141dde99f94e0a953212e8238a5a45d7eb55be90bacaa31a54025abd2539de39089b421f1c59bce82952a76ee0253764da069710817ee3fa7da6a5600121daa4a2bd304a36f4885d85c8a4a82e523c7f69c0c68b1aa06a495ea3e2e76e52a2244f0a6fb80e6c90987437fc9473edabf751359638364448600fbfdeeed64990a5891c8d293f6326981af11324448b11fba821f7c3bf6278e8474fadfe0f0559beffb306949d2d182156691261937e84ba090e25831973a87a3af654b4fccabef1e0066f2407d823852fb112b4b794e8d46c9f3e8630e4f4955a1f1f20d05f1ef802c5d758eedf2ed77402772081282538dc56f4da97c03fb91b281d96559f96822c6f0714c3f1fd94d74abd7f0ac08f36ad8acf45f940495b2e9f8299005f1e128bbc1681e0487e6fe5678a4af30d1b2f21dbfd36e106ea5880427e78502ccfb0abd418c619f2f59d6e20db2209317b2cfa0fa0d5ec12d9481b1b83891b79b8a613f1f7b2e22a1f0bee6e0f8856b087119b76248170b7a04f68568db9ce55a17ce1b63f305feef680bc995001c883c5014ea5eed06fdbf7e7f8268952339a6099d3334fe0e399c951e6e57809ed57a6efd20cbf16f8f7895c789fb0542f2718c52c2559001e870e483034031401117bcc18c6dfa4091dfaeaf531d3dc1b9de4bb587a6e1b423d9ac88f6530fbf5af08d6d7f23f5a378f7e3125e48429413ad69bd25425e9153c338c30f68aa6a22b40690b004b31b24edf30f2c07921ba55694e58120bfc80fd276725ab8ea1b161ed3d83fa7222ebdd87bca65420f2b24f9efca0aadc8cb2100f2ae1f92c50219787bd0fab4f07b0a590100bcfccd2fa974f3ca63f97324a314bc882a932f76ec44112b80ba80ddcb804be80fd91a497dcbef2df09a49212fc97ace786ebdd21938dfc31342e1d330017d13caa092d5fcc95ace143524c2834ac99626cadfe4212b511b83d4aa2b775d163c3d8416e328231b410b9ade6fcbac75f5cb50f3e48395e0a090b529808361a6e0a1197b8b30244222ae56b57f7413faa1d5d873876a20c3812be9bd7ecab06e551155eacf60d2caa5d433d0390a8a26f02e5f2c26f64184cd67b82d0b1f26a295e74cf02bbd311980e0d8ad8353fdf56996d5816095d52380c741e98c9b962e0112121f639d9c2eb4ae8b1cafa37afa02df737231316378b50698490da2d9f4fe4145b7f31d9e19a3089e5c8f789979bc406051e908eaef2a0de0a047fddfcd1dab7f90796e6d7ca8d70f6003c5368d114f6a1d62ceea707398dc512e5061315f7ee0d483a52258fe8680b4e315d910289c811355bd914312251a0bb79c32a0d0456e26046c4ff9b24212093f64dc0e8673fa66db1284311b23a68c11619ae2fa4cea6827b570b92d04484fa88272e5d2567bd8f8a3a97fb50622373786ec1b98967a200bfe698c02af7097ac5f8d59ea0ca1f7b1c6498f4f3e601e62bf508486ab50ab01ba0d03983ee0c7aeea2280ec78802db774de081c6bd206115354fe95234b1c2c4fa5641121a6ec8fc964f6763d28c011ad7a8a295176dae7f0de9731b376c6033b7fd56e192700cb374344cbedb9b28434a3b4bf9f885bb3d7ae25e7413938521be2ed24f55935006ea4c20c94284beb0250be97cc1fa4c05d2f732371615485a8563846ab2d17298ac83b1998e05eaa9dd3a6993db7605e90280bb4447c2857aa0e33a4cc8c6d0b896e9e3b2c4d0f734dc96b17c0b5de9b4c7e65eaaa38f403aabdca42b804aa534782de03cd82dc00a744fb9055e02f4e3e0ccc2d4f5d741768bcf2a5b39c211732e04de5bec19bf0807042b0baf4f3c2b6d13e9388485bfb72870283468bcceae459521dbe02e25a9710d6ff669ebb30112094e1123dace5e2d9cb8f8d5fb247209ce634a5fa2558b1fbc28dff5116a5dd05e9e58d5b9dc05595ace19335a1c96f8df9b8434b4096422c9956f148b5dd586ff1add602b8da76444b446a4bf317b44658717809de460264a9a705bde5be55432863fc1b4aa650daf0f7446f78af3e93c06afd8f812d7d9b12f2f682301881e1a5be0562ed2c10fda7a2f7bb77b37aef71197d321906555269eb19ad955a905c96c9e11bbc8430986bcb896c4c4a03c138eacb5c4075522f33f94ebe28a64ba0b0e014b701e53b892bd13e513b333886fe04c76b4f4339069a9864449a636f275bddd20d3be32cc00b52d8c504822a3880c19e1170dfebe460897607acd0a8b89cee1a24b0126e3c1f3052072c350766fd1777473f4014f8525d2e26f7d2892ac4b9ed46e5306e1d3786144541ffbdb2de4435d318121993e610fa1e4a41ffa7e3f20b55175d7e3da1c05f70813607ec44affae722e1bc4477830d8612c6cf820a1836dfe0e24013677fba1a33668b53f5c80068f02edc0ecd38d76544a6e81cb4d3ac126351ed7446952e0d76fa95111888fd42047fcb1b40560a99ff50bc98b43046495dee39a4f36b1dac8625a7b4d1d5d7dd46c0cef16e875f1dfd8f1f4267b052e2c3d85ae40c9fa08272d8563a12878fd3cd9d8b2b98468d829fe85fdd8d712b8d9d5350298620af703554a63065d1a5b2c970f47a214bc09938b4fcfbe5ebf9c283b2ef01313961e03ec9ffc8a9ffd0188b7494cbf425f061a0e4147d5641ef72e84309a2d0879bdf91f749be247b7eb8f1c4aaa43be282076fb111be794e0708a974e22df55e83e7bef4984985c1e3fc10414f88ce527a2d6327f9d69c5b55e1070ba5f10912ba64ea9fbbc3b68d0cd78b527d8b1f73fd30ce9af6d9109dd64ebce152e499f0bbacfa47ce7cdcd6613654933020f3bfc3942a962649114635c5b1475aa43ee04085065c90893f71470d4623225d06141011af2f5e6bc683d74c62b5aacb2e821ee59154063d9e08708274070593ecb893f05c23cc05f8a6ea9b28126505c36ef30c1589f7440ac749363478adf5e95b2a26dca759725545697ce51dcdc3cbe1756ebde1c3e86a201c4d112874011614c4ef0312335bc0c7b9cc3f0fa7ca89f20ac8c5611b32e56e3e477ba740afe78f9169d1aa66f6c5b488a6cca73cece3bd39355ff05dec955a390ff565b1f7e2bbbe35c06f17b73a33f7aab8a0edf6f5d6c6ecd9c3139b8f70ab3d2b2b9758b98e488a738d9a0bfec875cb63efa08ec4d4f03ac92483d2245caeba5b282651e91e1792970f36b83a746151737e1c49dfc1193e82c703866ae57b1cd43958b8b586f56b0713ace1032d8d3940bad3caf6a4f74b1a55c1dec7cc460020449c75cc56a9c5ce886820bd42e23563b0f6c8a922a999a30cff9c81666e8f1edc2d3325306f05010926463f53d375f78c70710f23f4d16c5c245857eb8f78fc0449dc0a116a5f236c0fadcb7c345d3d663fe670a03bec86c2974bfa564bb2d674c85b485cc608aff578e3d6bc961bf4b52e0554006da7cd6c74351b868d887ad2943c84c67f5488778a92c88a438494f2e52f4be7e923f01e4a74f32302ebb951fcfba6c6c175b35c9b746d8224054d57c18dea39347aa08894b3ac43779cf6a3f2f82f5fc0f99a56ddb2fb64a6438fbe25515a3b1d9da0a5b65724850e15bbbb753f6cae490eab53f44d1ac3d6c161b35729c7c8738bc79db5aedb5ad223d4a10f0a9bddb13db4a7290f5427b47178d46f6269096876b35d36f6f54a20856dce3da0e7e08d5fb22a6aa62943d52602418ba17383334191255f993a209d5ea6e714a72c07956129aeea2f03039cad1e7d23519a82c1a212cd36a4e214250c22c9d78f27f0750bc55a92bfea16756e7fd5c948819a3b47873136fc2384cdfee40bda676a4bc49174c77193291437b8d144cf83cc21108a21b9a88ea89a8fac9101f697b2797e523c60d447b42f708e03312536da7f86b8595edc6fbaaac76170356ae53cd1f5d05c11ef36548280c1430cae411b137a7f26df714fdf35a6fa19107d35c3c46350a7b67789481fe07da67be0f4c1e0befb840c9dd8bb7a284e71a988fd2863e590af78ceb183822199c81ae89245a6f350568a681f8460c97ca9d0a78f65d496d4df4106b555a9a282838138916261f9179d5b779fd9c7b4f742df2868728e605a1f83274c71296bb81d27f54bc7844aac1c54e67bc68262c18a4c7c2a06ad7b839c087a0128e5fbfb40a92a7c0143ca0c0be67aae01cb24b6c3e192331c542979398a64c1b9b4f79accc89910f31b36e1ca3430a248b42746e29e410e5639a116b8b3d823a29a4c6e2fcf404d341d5b41be7c94a4d37ac7f8fb0aa42f731f7e4ae8ad751cde9eb429fd3c229fa98f2c1e44b0b538be0deb12d29aaf2d539f3d03953db177d8f0672dec02feecb49dca9100713f349e41332e8cf2f339d5e13be254a54724af1977e7004a0c09264464e4292632ef0102fe36a65e77e6a5280635bcb8e1b3664669124a62ab6beb174d386f144ea75a65d21ae382ec94f0d2c0661f3843a9729007bc75b800fd3c2845179881db563c9a37213c1135f29c48be8cf22ece1faf7f82d1d2b7466dd4b83e4652f61543fe2f7b662225d3faf93fd659fd2918638faa722baab9b6d6d7825b1e96662c80f7f25f55bffcd4ddbf4dfe51c23e5b5709ab900b900ce93363f185b764360cfbd9a5a271a3b01422ae2fd2b1a6714969fecb306e52495aa3e31f3e534717b07ed4dc1a5d625dd8c1bc0854c4926b44ddb379c10613a6c46c5ddb284ce2040ced49af4bc6294a42b9cd32069672541af2e80f8f1d2b9f89f0780e2d437ca7725b14ba94ec7ca94b34fe7e591f5f931249c18029b8a88db375088a901d0650d04880cee38fe438dc018b3fc08ca20b628fc6f45050e6c6ff70c55f5f5dd063df17ba4133d4591071291116818d51502d07aab9202c3870daef563ac444da29ce5736cb242023178a1281b536b4af75199f41e362ce1588f260cea215401e11eddb6ef32691d76a37a1e9e4a2019e9df910840833283e0e3741e019e064462403f499916284412179dbee4a1f9588b483a1f726a187547912a38081c02e4c0514a00d93e54ebabc92f59f958feb64cbc1b53744284f08738428d39282b14f9bfcd06020c49666bc8275b8b0172b118d31739519787c3ce0bdbdb424f077fa0f32f635f01a07b97c8ae0811a2120278cd8356fe4822dc67219c2b5c1182e68b659c2a7e07764432061440d2a78788ea92e06b970ee9031b4f6a0dce039741d2ee67c680048923e30ec9640999d929d17e06ef7b865de226d86532cf634a623af5331dea74fae1967c60bbb4dabeb25ad44d73e8cd02a7429275382025ee15cbfc16fead161d68bf24cfe0cedc1c6727d9b15277a1b047f7ea2c8f08fd903523b4432292020223d99b32c26ec74af8603c2304e65db9976f6191a22f1fae2baffdc68f55a5e531ec8253ccd37121db7a871103d528a627cace6a6da4570e005a8929d5cba1388e70a134211b2c9e43b318346b864fa9a8f22482f0473dfcd133341de501f31d0924ccf1243eeca0ad2772012d62cf15f0c3097927ecc525238c6f288b087f85845597e4b4049fd2969e63918054b708ae7015e0b3642bb6c5639916e7ebc52405ae64a6a80dadc8a32a9a063636980041989a4f26a5aedcf6ca638baca202ed57d895c824d4e7c167598c710bd2e79e9f771a54e51d636154ef5f9c56c498895f5e98e419068ebd06f638591848f3724c2e7af1bc2cfad4d7033bf6bfe4818ebf02467126a94b70350a0b0327c2671c256e11e555b7c9d75067cd74d84643968a45f26926ac79586ed42cbdd3154462d7872e25bc90423bb4f52d736c9a60420c915956d032e06a7beede405d692d103f9d3e9c98ef0be340d36b41ccc0cddf57aad9ee50df14c3a1795bed732f2b9c96c14c24d1dca0052cd01ef934bd68ac205d894aef9e9518172232d499802c81d663ff9d1e6579bbbf2c463d48f8a5c54350243c38de1f10397e8a21ba78f8dddad362dcc99dc0c0248880ebe711d502ee16e74bafcb957bc670adaf8182d7c26e6a839b3f13198866b3c504205687fd8dceb006be2e7cab03faddcade80d6bfd29019a9662a6a2821c12452ab25886c0c49c5d3a21e88811b821e0d2dd8cb288a21c7eb35308a59008348e80a16eb5fee2e67b7990e1571a489f40889ab1d30d2eeabe24bb62e4204dee487feffa441512f78c5193c6291d1ff707dcc1ef035d00b9d1c1b6e171b1015c25fbdc0aa8fdfbdd54f7f43d6c2c01d7d169acdb7e2a520b2bdb06ce8cc26a153c70505b510a64f2ddd6f1099fa4929cb35b68f891b06659c7ac7d5f699f96b79af9189edbec23908a5353b0e1184353444c209dee8a76ae0c608eeacfac626e2835e6183392905602d55d527b58bfea4088f0b706a4f90dd3155d25be555eb51b2e67a0c2a2df9e9ee9aa648c376ab76d04a08d300d436dea27b3a188c111e60bcfeac6a8462dd7bddc0ee7dddb7c4046198431d3415c4bd36b52ecf4474ae1dd1975acfe472b855820360c39b5a1e63f6bb5ce85183f93a734a9b848071db293452ecd1bfbf2a739847718202aaab8861e75fc92773b66031400899f241a52c86bb0a6bb70216c88c14ecb0b03e2b5867454c0f4ee9681b2f570f4138839253c73639662ed4787a422738b3e911215a7ebf50678b2c768390984f34c025db7e783436a50dfa17bbbbea1ef79a985f83d3d6f1daa465769d01ae2b8b82ad21c9884ccf642c8ddb99b1862bba0189a51903899f013d0262a376482932ae82ab92104b0d7605965a75b7b5ceae2e6bfda21216d35e43854e57da6aba8a585f183f2bfed2d3fdda7c5ffecd6cb278286e11b7baa722cdd7eefdaabc8ec10c30bf2d36bf22c1e69b3727ebdddb0c853ba0466b324134f599842c95897b901bb1394059ce507d9b4538695154d15426b7d59abd5e4514227b72947d4a8309e34bb2b795344ad38afbddfa173f899aec0ab6ae325374da877a785eb74e5151d05b4b00e18e010c6bf889257063475d2c819b5170619a90506e9981556f5e56dbb9292ac6f56a8e9be2635f565ebe397b8f89b55ba5ff86486ceb55fb8e712089376f5671bb1939c6b64aeefd08c45a29f7f6b15876ab3b5f0320a395dd6fc4c5b45f7e7c05f6e5be3922f08db156ef562fdf66b5ff976221d62424b8610d575a5895759d4d8d43e57eec413f36e35c5199eedcb473a39e9fee9c4e679e4b027154a18c9e7342afaaa0e98c739b9a2a513b14029cb2034ad37e905b301616a903e938f3de942298474d14d934c4e616eb722e8fba832557500021aa572e9773c504e2d29ff250b0d8af6bf782403ef5aa307f8d8faaf698046ce0092436e5cde6dfcd2ff60624a622e2c91842c8de25646f29654a5206d0080f09fe08ac15279dbf4c901da5a6574b4d4857b8531ceb6683f5cd7b9335944274ddacdcb671cd81425de74d908ab846e90ec184d0ddddddcd02104d8f095dc1350221e613778660dce9de47c3f752c2cc52ad939c9aaacebba5d1348312e93c085f79eef369d8813895e24a9d3b0f189e73c96d9c775de779fcd910f314e4f32be72db87084f5d0a7c382288b84817a07ae4818a887c0d2b4417d9a38e7424fc7f644d77d624ce63963a8ddaa6576954ab4bb954ab4cb711ea73363864f273d312e7bdc270633fbe813e37e3ac419f29c73ce399944229144d36998f1335469c1cd6b04943a37054a29e5a8afa0eb46d706ac24a69343c486b624c94ecb88939a4cc9119d1b224c68b02438ad1f273db29817248c749992233af486090d96a45b3f4e7a64af237ce3c3840736719efccc7afe23e2ce7086311f117c6dd06d835b47467c43ccee16cd244436139c4cbccde63985b3d94c262c723869a210dcd133425bf2237da64dda8a36691db6c905145ccf488b555fad5146bc49f38c3cfb57ebae6d9f8e49374a5935e90edaecce29b2d9a6e838ef3aa7a3cb737e7d74ae9f6b14c50164da68977206c53f22eefc6e88cb793727735dbf9f86e390971286934e5c7f7fdb9c337da18bcf75ae55a2cbc431c3b4d1de9c0f7fc32012a67560b15decf61942a2f0a3e17f4d24bff47274a8499320e0e9be0d7b342d103af68973472d3973e3a9f70079a37688be8784a15e72c11d7d0639331970e2d1e389f3c2d357f3f3e3d17eb2e1ca2fb5e08e5ca98473db3f920b488c3a9cfe91c011784a7121f54f29e12fe0f4b9fc0e55e1faffa00e847a0fea3ee8464d338adc05a468717bd0d1e4a350f485e3bd1d72e95d389a1e24c340cce7207dfab6c51324d81d392220e831c65889a4f30378058239c64a142ae139fd5c829c4fcfab5b70eec09f011f6cde73907be00ef333d059901f180a39081c5d1ee4fdd15043e0e883cd0b014797afdece59704a181627c03edd450187b41352d05af910c20203b1c466e5030288e882072bea0d0e913f58f920a558d15089362205af950f36a8d063841691859f950f31363f9060950022b05583723564a60004ac950ffcc56a7292134161074cf05935d81161c5e07cae2e19282cbb63be7d8eb15118ea23559e4459b7d65d6ce6124eb54b9fb4c924661bc5cbaaae51deaa88552ade56af6b5d93331e8b20a736ac92b29d704a9a288bb67cec276f993afd403d3ff24dd31a6539f6232562a49dd02c87b4f6aedf566beb1b87e109e461f34de776477d2fec1a8bf6ad876697f3f64faabae6c919eaf4060034de86a3ca5bdfbad62abe9928eb2653adb9aebd75cf6371f38ee9def866e268b7ce44c854c8ad3309a46ac423966f79cec7961ff9669328ce43604b91f3064520e71fc85f6f9f8ede360edc9c829b2fa0e6b7adb72adbf8cbe93a46f16e0e46a12e43398afa1b23025e32f3f42a7624154f4b2c4e908bf99890f26d5752854ecb0746f8a9e20685078e052b25fb285d4ace729cb5d6dad15a66f6696dcfad79b4962d187ab6166509565ab6b6729c9a99bd10b2d65acb6cadb596ab4f2fb138e3adb5d65ae9d55a1b7a425249a5ec4f6e216992d61941c2e6e892bee451a2f6b24a294138e84034dabee5503db4c91a293b1c7df8aa84b72ec1760bdaf0d26b659f1ce610444ec1fa0e3120a7600d791b86e414ac97a1efa6b731e18428fc28bd93a00c146c9b53eeee2aeb4d275fba74b5d62a6ba54f6ebb67adb5d55a6b6dad9bcbcd6ed6d64a7909dd73211904d9bb829c90ea320c6d71a9b76c1f84b64079c14dc1a5de3e6bd0c9e738850549a90bba9a43059244c8637e945e788d0f4338e742a10d28241204cc0ae437a41557f39bcf9366c698eae356bd561fa512be86494897627cfb04e5cc21886432a28c9247d6f342e66f3df820a760ad646823a760ad465fc391967e8643a49b1a557aae038172c5711c88e37c34aa7dfa10256840a0708812349ccf70881876cfbec5ef1b34ce2de92a1624a55cc8708c79d9b576added2bbd6eeee06191c83c43c7b73e139b9d2397fc13bbc38b8d4b770ea0319882167a4dc515bf04070d9a7db177eb4d6724c743e3b0e7390ce3e379188038d4061080c221a496797610eec9286bc8263f5196e14ccc17e3bbc70f4dee33cea954e0acae7c220429e73f85018a49f3bdb855e415b839c863948a7d47370ad35e446765068fd82dc9cdc26bd0a8eb5ed47fdd2b0c31c1d24048e4184bc0ce23de7394897413cebd22d38d63088f7dee7205d7ef7271af260976efa513a7f1c72d275337c092980220a14178bb38443585c651261a7b6523179cdaa05af59cdf09a550daf59718d625ff19297c2212be169251cb2e225af59c9f09ad5c96b5634bc06288fdc3903850627506c017416c8006fc4ace04e6701dba76bcfdef578a19423212d2ec95346b2eb0778062267507c23917ce3b81b37624451aeb08c5c6802e995d43bc52b4872aeeb4fc746374a4321f649638c31c693c2f96291a70e1558e850217d506c38354ed9137a7f80049954c8991df2ad1316290bb45e477eeafe9cba28382c52efdc6787c30127ae08020da66004245af8122b08e20810ad0f10310aef1022ffec8bda5a6b3fa760c7b1cdb499fdc86a311f18cd06761363c9463913a5b596d2ce29f83907caaffe8542ea8bfc14f27c7e28bc35221bd81d716b92708116581811032cbcc048058a58c209ed8b2a4a7044d7b4db4e517bc2e4d96b4ce4c94f9f249af00fdbb4a5354e8d2838ef2407ac07255af4bc7e404213302cd0840a7c5cf07a228c279f0ea29b9fde957c70c75bfb5b9333fc6c052faae05a710c92153b45c17946c191df2e9b69712d58431119e3b8bbc4e5bf99ab152712840cab15bf992b93afacb8c979655a6171f93439f83a99358a69d863ca565d11f7fea4ccee3875acce94e95c702eb1b2264c28a537cd71f7deccdacd71de711cc7711c3806297d7b954fc10aa42ff7e1c885b74669f3488de338af853b30a05dc7d370eab0a60e0d8b3d58e413f52dee18a4f4363c51977f7f58e413bd3516af1317dcdab34f1afbf401d2aa59048962cfa286042f641286fdd6d8516ed86f8dfdfef8004b5fa0743529ec4293e2492c478a27300f94049013eee8aa39bf52638dd8db9756a3ea18f7a545bd86630dd85ba734c21a3b293e29f385355f58aca2f17a69bde4bcbc5e92704a4631abb5c878de7a2f3a6f5f90bc7dd9791bf32fb16f91b5cc3835cac85a7afad5224bf14991918da4560d9f166f0987d4f074434b0f34bcc5e58a468dda101a9e6ea05ec36b843dd47a038db0464b58634663ddcc73fd68634e585cc03aeacdafe4d627c029925bffd1a5b06a98c2ea9a130d0d1a61ca4da36ccaab51b682293a8db2294aba53622cda145997c0949e9459ca124ec95fc26228e4ed2550c629302596a2044c91b168ddcebace446a5d8e747d1a651d25c50725c507c51924b16e6c6e5258ad3ad154d24d9852b302536a336a2d78516b5e8264d3aa16b74eba21b138d5825b4ff1e1d4e4969d4659ffbc23b1b80c6750c68a091ce79bbc6b0134b5c8b4ecb4bd2d3b6f79b60fcfc90378d57ce65c599fcd3e324d38d53590a9b54a46d628eb1c2753135f46068a355d8b0b177b0c3233833e1ead9d2eee489ac9d478b444f93ced329c70db65105a495e7e3b78b446199fb7ce3255f33c5a3cbdf31de18e2f2de089a6c56b0df04453c3690daf59d17008751a618e8f8686d77048751ae10d9d3bbeb054fc5e7155301082fd8ad78f0619ce427291741ad583d4a2c11d39f8d2ea1757a3ac773d278a68f4c0b74c8d53356fddc94b9e25af25ae3f0293caa3f57a244960dcdbc6a3958445f93c5a3c5d1079c9c3c5cbf49267c9cd779bc7a305db6115a9c5288b8491bc5e128547eb088bb2c5218fd60bf6323e2dfec29233ed36e4831f5b643132c03154f2098a23fb0660cf611095927792515a09a76c07a096f34a228371ca83c2ebad93629ca26f9d2463155db54c8d53e30beb85c5a9130d34bed391306f5dc609a75a89b72ef323f3c48653202231dcc4508453ac841c4d0227c0a2f59417d60ef48223914c6d07fa638acf9872f3293a63cacedb1f3b3dcc44cee8a4c45ac5adaca7dcb44aae604bac6cf6a38d81c231a5f55dcc73bd8dd9580acd3a8a4fabe4aaf6f3d6c6e46a9544919974debe76dea2ccde5a2ff6d6b77034519fe17869d0002b87a70cccb73612c6fef0f685d5289b73c75a7beb33fce43f58b4ee83c5f185f5d66bad553fd646cec80a6ea76d23b55825c386e4b24eda21f1704af234e1c95b4b52c2b01afce8f98ca4d65b1e1f233f9292bc6de14712ec2d29f696247bebdbb4311f19a7aced236f69f0a367ed92b73edad23850368a56b732bc54f8c64e284c4214000f043a72192472f98f067773ebeda3f823e738bfc129cfbf14e806ea2317115122d4f907d250829c089494e3184834b8a3f89cc83907aac570cf398dcf731c7785183fca3c87450ab82b6a5cc7715d08c4cde0b9199c72e1c21c64adda74d2a5a3e28ef777984fc3f71df2e0c41d2793e9c3aa3981b0f8cd1aff00f3380aac672810d998b72c6efef492278b1864d15242275d46cb9af988f1d1aacbc919d7282f7e789e589b1a9cb6b4dc36b7cd8716dbca187794b35a75c2a9d116792e42c3dab2ac1a050f09b3d56ad5566bd6fad16a558e1badd6ccb66e107147dbea5eadcb60f4ca1672a6e90a13ea077e68b5ea8455929966645644668970ecc9bbd8160004608d98512afd7047db126fb4aaed9a333b427b4ef2d3371b5216acb594526aab531fb91db8b63451468b27b09f2fc4dc6819e314f3708a613018a5fc6a5575faf9a02ebf1b6ac85dfe1d9e92e3bea198efcdd39caace35c3b74f20c977376d529ed1e30bdfde2e83766666b0ba9de19530d3ebf0c483fad77c7b572487c725a65b741de300491b383820b6a966255da42bc9e1977399b6bbd0b9047fe89ad5dcab7ceac2a9d6f9faa33a90ea3d7cd893b53d5805c270d0618892af2e6b954bbed65a6d2ccf9ac4154dd74d5ddd5b2557e2d75a6b8f46d598ea37aa7b75b1f268c94a4edcf93d200401ceb71e420ef21e38dffc44130ab9466d0e82420edca44b65de9a743bb8e5ef705ce16cb12843c91da5cf6c714ac6de33f686756c1b230b362f65f8e55c794daeaa35d50bcf351c5d66dc12e78142d9a8f0851f65545c2f66d962f6f990df0ddc03e4aaf3f965c0876c140d47b186a3e9c747659d6842eeb9170eb13661ad358abbf9dd70030702b946710ee242e93957b3aa5eadab5a17ab48301b1b9b1f905898e459624369a33d127af1cc84f8d1ee60d1f3a3e5b1b1672b7b1e6dcf739d4d69f542ae693c07854340151cadcd588974614c6de74403a2bd0fec6938d92810780a8543e88dd7ac68385bb55675ac51ecf79a46b1d6d8da3cdb9b67db7a6e58a3d8ba5eec7687ddbaac4e8b7d82fd836903f61dd1b067afd51acb295574d6d66a59d604d6e78e96e59324666bced700e4c84f4792844749ce442296042645cc878c8689a37252724c639fc9d2c187e5c3ba01c242826e07d6e91c6195e4ad4bc2a9da2179f61a268e76566d21f9e916641e168bc562b12ccbb2585ca3c2b8a36521e1547bcdf951faf8d8d1de60a1f3a365b53835764a5846709e6bedf9e9b5d5c94646583b8598444c1b1e78903046cc27c0d8096d6d0f3b7b80ac420b19cb61734898952cd02c1256551e463159b2a4a7478992244f596000dba9b3d9ccce6cbc16ce8f94b2c636d98ce65373624df0536b95d5d9720471473bf38c702a090fb7a205a8052115744eea4bc7c5830b2ecb0b74e4cfac35734d9b9f9f160fad3bda598d53eda2d96c6667123603326b550db3beb4990d7334e18e7606fb51fecc2cab553aae97ce0b7645cf8f76f6ecd64b62679c923c57dc3cbb5dc2a969998c449fd75d91b5e1900eac6a589b638ae8a4cb5887689f55903f780e41ab84f0556d961c8a823b4ad88c5363a5d1268e76f6ba04a71a516139b8986be256a070c74aabb4ca842b4dda6963d69a51c4b021c272c4d44188146a3d9c32e9e0d2f9e11f2cb23579b7a9db9e3f6611b41f3eddd1cc39670f169925053de48cae58a19a72f80d13eb8e76c7a4f3e3644d1dfb6229c1ed649cda7cb33be19c3b76a755b365b23b5b38595e0ceec8d99de79af39576a2816fccce1e4f1630d702e703f092070b257cf792c70a24ddb1dcc89922a61336c938715c126e67d3ddf80c7ffdf49d5e990205a272e1c376a50b76715c95352aa68696b54a94b12cf446ad7cd1a45a1f4eb5e5569a805844e08443354e519d9f5e41b99a3ec2f0d20df0d22918239b383a8441da603780119e55cebc9ae0e8be42855b41c9a8b1e274a2b1667a172107a45b087fedbc7f747bc87330d7d0635475543d81b5f94f36541e586ca73cb0a812855b7fb4aa0646b173b5443f8ec9adc1f39072174e202cb2cf1abc677ddb40ef4b2f9d010b6051fac9864a258c748f45897204093349af677f74ad9bd4c0624fcb4804b44974991df2706a3f7568437d1e589cd31907373e7f14f26310d38b3ce5db61e428fde91085a70b825f15d73a28052492e241f82a2554e25eaff7de906331f458bc63cda3f88913415480bde4a182cdbfe47122fbd3f5f9d753c0d30d5f5889dfeb722c8aa3114a78e2786011e4a290b2081a8dc4b757ec91bcd72fc78526702a01278f0faeb8a3c3c3c138c5cd786baf4b094a5da7d66f7784fe745c5ac934c35d3835ea46a0f40ee47c7e21aef3c0b1e63def79eff51df26f7842f11c38bfce398a87bce641e0e83d68e428f773f9897c04d6bc080ce2fd47bf03715306eac28ea80dbf2a40be39751008e49c7bde83c68777028536d4073928f45c38e2da2d64edb679f520a607397f3a40e1e65bc843d392e9ca2ebebd6fd4b05f8869970e4d2a04127eaa983dca4b29aae0f96e54b9960f5cebe3c9da9087928ae358ac6ebd6dc8adcce0ce97a78dc1d3e6349c36afe369933f4f5fbab556fa66dd3a0f95da74d62b4f125a2f9fbce4e9228cef6ea97e555cbab9e55803f355c0b8ec20f7fc07a738af8e03100f942c8238b4a13ebbf452e7ec9ccfae3bae731a4e81e369fae6414ccff9698636d49f3e431eaa6fa0977347b1ce502843334c2a397701e28d1a38356566e01487d55f8841408e4dba8bac3969194e5c4adb85236ed76ecaea643871db2f8fdc9cc1cedcf3a91381ba8c9dcbde2e7bf4311c1cf1f2e3317a9c15ace0c50216fce0e0bc8a282236fb54e577c8ccdd3c27f3ecaeb5ca96d38916b4c0070c9c973c6014f996973c52b879ae556c04470a2ba4f881109eba9ebd4eb6a9a65bca188bdcdd9486b12a832561e61b209e5d8509772c3d77e318619147661961b95e9c92449ef9872b99a83471b91c2c5e669614eec8ac9655caaedd534adaa32c3db55652c9cdade791591d525797050cc290420a4b2ba5b45228402a78c2c3c304131c16c278e2092490f8f9e189134efcbc7e268c4629e5ea4fa3da69f74fab2e779b0b5798dcb1fe7cc37e66cdd164d71a7b2de2d97f7e7e7e7eaccdcfcf8b14451249ec70519b024d66451821a6de362f79a650934478c903c691b725864969a4c5627b1c239f3b79ee2e9c629d238c6a97371485a70f490e0f121d2a9098220858d428c12384124018a2964384c7cd2e8e20928406c5932d6690028a25a2480210293801d310879cac1c91840e64d0040b9b2994c0c54d148cd0e4a6470920f082a52297072c340173a20b22787105058680440f7e70aea07d61c3b4b1f98d9330121677824002048b9c2370921821a7e7013f3e412809430a4558dd08ae7fd734314416c460a266031d0cb16aa7e5c0092b9e00c4133ae8c1aabb218a1006153a70c2248a55fbd46915a9083f20420e9ab8a1e960d59e92e48ed3b542c51d4d23b5b45a50baa66bea4c17c34427e85c1f9d1c9b370e802346145992b863a5559a8b8469af3400d0247c77b3b86e8b532357615d5bcfdccddda29556699d6bf48223475cb56977d306420c9a68024444c605edaf5004a538a0b5d65a69c541ddb66dabb7a6564ab96a69a594560a85d79f3703cab7fca35b76cdaca8a52509d3ee13870d55a48df6fef631fc6eba7284bb63ea16bbe8f2a7a76a6020303e252ebbb4d4443f257c14c2d3097747c944af8cc59ad9933aedf9d4da90c5da755a20d8979d31ccbe7ace704e5f797273b0ee0b8564034e4a9c3bda57ac53c2a9510619e44cbf74f0d37348d97da1906cc049296188e8bc5eafd7cb5fe2ab559c7dbdfc258bdcd1be6a3f4ad8cbe6b04ab2ac76e4673db3ae1cda111f24b5243c4a24f55c1e10649c2c95f807df214597176272d4008416243949a7eeb499d04997b1694fa92c75a05945a31c4c0313f9d1b320bf40c2b858cc6171fa37625105350a75cf47eb1e8b25076c7ebb542a954a25ebfd361c876460877c296168a86f4329614a3e8b783e8bc899b9d348587cb1c8e2fcf56071fe74949aa704f606b612161bd6aa96318ab6ac61b2a79b97dc3a7f3bb630891b5fb1b492a7cdc3a2051ba66244c39efadce1d4d8369325278e4aae3cd79948c053bf38ecd764593b59fdb23e7d6cd75b973c4c7cbe5d9c9ade473a8776dbb4ca6f44d68fddb22c201da70870947c9c2378ea964e224f3ddad3dd1b5c2b431629e520a60dea54f8916ff8bd90819030d455a6b863db340ba76dfa666c9ba75df8541fb948ce7c4e7d8a40ce8c60e200959c3a0258c5e2a41e9c4a7114bf4e434edd9f989c583a4a2663ccd3511cfd75b880c46de71ded2aa1929fce225b0197fcf41450b288024ebf60eb278c075a709cb59f9c87a68360d0c3c724328b4c1cf3a9df1b9452d74f29616c38f20b7e4e1c1667d35258a5a7932e9dbcdf107e63789a80a7336c66bc5dc093a7dee30710263ddf6de06973f9d693dd51c268a59556ead99c1b833b5a5617e394f5d7ce0c368b559611b0832edc7a250c8b10a67b6fcc0dd3bd59dcd1bea0fec8e027133774458cba02d60a16ee567fcc6c7ecc66f2c70708c6db5cad405817788209683e7caccc2e4b6e03c9c8a22e9951e0fa7347dfe9da08add5c3cb7127b8218cc3e9a4cb288304c09cb35ba0790123bd2a9d3dab21396297dce047cbe485f5c27a61893e7e907048aeb72d167374be25a7a5a5c5a26dc1f996b1c5f54b20791d7961b1685de57547995a8e96a9718a9dbdc11a3a2c5a99279ce23087fdc6768de67eca64b00c192a30ecc4e092a1f2c27a69e9d4a045d62263928e8e96a4d75bd7d1b282279aea349c463884bb4f5ca681864c6db2fcbcf54ee5a4a2225363950d999f1888c4c08a01a7894d0c3932b5186e623012438bcad462d079eb2adb7c69bdb83835ca68bd7d31c2a9b60113e34b4e0dd7ef70c3a9c6ac51d64f3ea306ad51d6b3c1a5e12776ea40d4ac5a9c067862a7e140d4ac2abb7bcd8ac3d303aad770e690a6c53d1c42bd253cb1cb558b0fa1e1353c710b6802656a1e923bcad4688072556984b25161147794a9e17a21f35b469db73590bc75999a9cb10788bdf571a6f5357c8cc1e6adcb1a5ebdc64eab7a7861b965972d2d3dd40865a35a646ffd06da430dc54659a7a15c7118b251a389f32bbebebd134511f5827a717d3beadb41ffa525a58d25a48a1476368d6a4fb9369a40096de87ce847c27821036d86244c061f199ab08a262603eddb464cc6cd1d654f8c293369c2a94fec7112b3433eb58288153734b4d1f33696482b8ad898d990d988d950c262c7c8b0d81e130ae18e2f2d9dd6bb60a8174f728a654f481363725b3dde9e71a9482e511c8722ac228534b246b5f70d4ad84313c19db1f976144ff1b173cdd8b08a46c9cc0d7b1d8ea5191b49130b6357be1b714719d90d0aefbc64642f03c8c01cc3c78f84691fc00b9ef4eef3b974074d8c06f1390914a789c91e99e99afe05184f7a47001aff35e146008753a71b08a089c99952045a3e7e6ebc8475301e0c015e5a4a2b897547c9e406872238dc509a8401b22361da1904df9f7051a650409206f8c819cfdb15b0a3644a21ec3c12a6f0a22585208bf142fbf57604b0c1d9f064abec4ababf7419e3c90e06ef63428c046212a6ddc74f0b0c8307c3a7636bc100defc76809c3d8ca263e1b0385fbf04f5a19e279fda888d366234b119a7aa7f3433a65122ebe154751a0d134ed59046f681343d2cb6fc4aa384459a253434161b2585869602d2cc50401a194d2cb684e3705380c9bcc3fc9b31487dc57c3af885f6d3993fd1e8364a0aada492ca0a8bdd4c325a38cda051a3c5410e14bae0028000840420a25eba01bc0043001b31324624250cbb953d319a18ab70c06864344b687c689c2c6172d3f3e45bf6f47cc79a30f951f634f9963db5ef9e9f6f2b6cbedd568ac30d0e4538d54d780113f144c2042dfc12d5e3eaf2baeda38b7b9c9a53fc90e7760b99efb56a1872ac9f8ef3d34bb06fdf9ee3d48c97524ab744bcd24fefa794346c4f43707679078d27f9845e34f4fa7eb58fa15748f2f1e28e765e72a6d4d5104493332cef792558efa0932e6368236b78a156abb650c41372a1d6c7c44ba7af5132013df1ede3f7edf3c828e2f9760a826012a6bd82e0ec7207ea489876108b3bb2d466b8e4ccf4a64cfcc852fb0675dc8bcb3ea6d4befd24536a293f24188b6bc6cf378d0f6d2810af6f77145ce9326e26f50e77c8671904ec903f5bc9789aa157923d97452e94e23a0e9c3a31f9d2b79b7eb07c7bc80aacca7ab116a59e36dc395fd65a724979f2e4c9d34b2030cd909b9553d427575f7eedde83500b5f10ae0c42ebc87f4bb82e1c7143b0108cc5f63fc26540e8a983e257709c36847e0b05f01ca76a7eaca93e9f476be7c53c5a2fcadddd300b8311955c4b678e56bb1de18e804021cf743f91e8db41471f0d9fcdcbd1746fa93b8e34e79cdc5cf298c4a5928aca542195462a2b2a2b2b2b2552caca0aca5d595919ad88be9595150f89ee00ace764ec0b79eb8c51ed2d845854267286bdbbd637ac6355219f5459288cefcee6dbc7eec6c7d00bbe3de49233d4bb396faf4eeacf13cf6b56d365e79e0f51827d88e75d3872349f775f58b39a5e9d716a89e4641090f09336613ffd00370718c1c4f1e9980760d150c367b426b5d62819a7ea8c6b153255b79062c37e8623cd2208df4e41d783c2f18638be2053b730356a367dac3fece305bdf4ee4ae13b06828befda93917af05df566ec07232f633f40f10c9e6668e353df591f279bc7ad2bc09ea92061da3b8e06efb9e0bb90c7600a10222885f1a16f860c86bef8eef3e6cf936f174991a83a9130eddf4f50c68824e177d8e7b03d17f90ddfd7f9d7c3e721b9e06d54fbacb50fac352fc99dcfa847c9992a0509d3defec22fc413f603f50a350973a7705d586c0fe42e143354639d9f1e72fd74d0596ca7aa1664f58708cbd68a7cbb2be79b7a71851fbda639c1053fda9bef2f583f5a23dfb6655d56e79ba777e7e0dbe5e8b9cb48d6491749ebeb37c7c1fa8188e37c3c1c2dcff33cce455c085445e0e713fc1c3cc04dd7191477acac5765759d144946d6a78fc0ca84c5be619df117ceb826dc1aeb1a33d2fa3eee45a3518efe40912803db8b2a0e8b5d5b2c1a71b557566de170ea4b1de1d407561c17a7a4ac4658eceaaa3955a79bd37114b0ba1ad57ec1da6a54b33e2eeed64682d0dac72020b8be7a37c3b6598f3aabb83ade70188712bb3e8caa2e8b898912e6374c31b7c5caa81a5389e252679f2ec2294f36c882fef3d3d1d550038b5e4e0d9c8ac51a25caf0b9db0c610daa36c2a8ea9f4b4e957cb4e2a389452412856329e4da088bb58d7ce57e6309c73bda74a09f8ead8d344eac559cc3a8ea957362a2d81d67cb10777311386312a6fa64e9d03131a2e86e32dd5b4be10dc7fbaf12bbb4fa164e5f400f1a4ea578751f1320a178f5209c1a79f58e045e4f998f025216b71bcad18c7d205539e2b24ff768f251d155f51a38af049351bc767e7b978888da87dceba4d39013188ba1d09c9e177ab019db4112621d95bc82c52f4ec231eec1e1258c8461ac84653c631a08c7f5e96890e79d3c8f08ab648f2ce4b308a75af4433e5f49e60ecb62a12570f1e3c4f9d012784234144af221f7267ff1a1c6c187ba3d9f20279a07cd5110c841e0e6dc711e084c42e40c32780a65ece8b4879c5dac1279888db0187229237693b8f19528e49b19724b84c590ddbcf979362c865ca5883bb120673c0ff9cc02f7a14984537c856923c4330c0913729529eec83a1ff290b34ea87a88f390334fc8bb241f0a790776fe7d9ef779e10ed744561839c77195f3cf455bad278e736ec49946e054024e1e1fdcb9c329501218e795ab951b85e3bca1ccf9a872214e954c33443e1281d243e0060a85e86834f21df247e1e97a0e23df7ce49b5ff79e1332ce17f91d71a2ef0b39078eb46b2f140281f6d3c16d73e3363b848e3ae5625cc45a6f18e9a6bd8009f890b931438e2354b8a34bcca45f53a794a70c8122fd46b3d6ae9b10fe199eea1409f9917e3a4035c5852390326a4e3f4d6f1785b2e6e69bc5aee15653e455c0b863ccf420de538f610f1bf439c8bbceb74f474729a55e6bbec1d113f2e437ff44a0f46a7e8241bcf7bc3790e7e80ea4498cbc8ebc7e3a4022ab46ceee32023f1d3762742efb1823af53ce2b9966bc50b2e828139e9f56bce4494213dad1f8f02c0e2cf2b0387ba68c1e7925d961915b392e1e62338b501c58641d58641527f7d41ea5d64ff2443beca6b3d63aab4f7b342cfa60916717724e6e2d20b8d5b7ea396c01a079a8540d1576494d992292000082200043140020301010080563b1582c94a9c2ac0f14000c91a24a72489848a3208851104386186208308000036004446664463600806dd29e44fa2773a85c0e22dba41633158dfd1caf17c6152909806e6d2d0b5b5cb74e3cb306ae3b05ae8ab11ce70be447d92275883ea948dcce501813caf544a155e9bcb52eb1a53cfe8195c3fd41185926a5a7789e3aced3112416c00a367bf84ff79208702a72a5c07a4da403c056330a149a6172111ed112bcea2461c744bcf7a6e00e89f0ae71d806b6132a32ad3af96e121552b30259e1fa3e42d2a7c1480622683f6586eb642b35c21edb57ebfeadb8676afcc09b4d5b541fb973eea9d7528fdb7b063c73e2dfeb3716fe1a542c20619ec1ebf9a925bfe93714181e394a2d433a82ae4578eb357d8c38debcd05aee2263ca71f1f22332e5783ca9f452b97cec15cec2bedab52bbaa612e9b2c251c90b51fc31d3fe01aa1f52cd3b901b7c68e73cba6e19ab578bf180ac45e23f77130c6755fad7f2391231aaebddad6165767038528d3beabf5707e5512b5f8eefab5183405c83681cb75f456e7f1bd2e5c12c35f8284670acfb7179c1e0e0a65b3f017975eb08e343484d9cb442054f9c0b7a89eff2d913d36a00c5d6d3c0068b4178b488ba634ad34279497e83336001fc25c64aaf84be90376b6f13f45a4778bfdbbb56e6c2931183c5b56f605af24bf8341766197bb6b0e25a69d8dd545dd9b7a469a696f9af5bf701b42fe70522f6759722d8b089399b34535e64791233704151cbbc59663ea50935a88e5a367ac0f3061bb6fe760c05eb05c65fdc1c5e1dbfa5b640a93ad7eac058427bd856df5d9c8973091d5d24911d578a51778261faca0a309ef00242d66c145f493c7d4ef7b0f6f624ccc9d0aae53a297908c57c6356a0a35187fa19e9c0ac0cc3c825bce854067e13c1084f30b465c6a8d9d990123fdfa90b3753ed53b3e302d72baf8eff54112cbf881d1e43bc8fed987d85bf09f79bacf6c72f49622c17398708af0589eef249333a152227fbdab8bd9d318cf8965fd58ab090788eae1d59fb914772ce82c4630b4f50b6d18df5537329a8605248ee5c41447c30b2f9f6cd59357d65e142fcd8ccfcc50e9d679f21a607642b727a01ef40f7bac77817ab1d0d38370b34727c6e1adcfb14050f92a7959f7c037900b5782de14a2e1a6d33405bc4ad82dda9a04a789915aad39efe143d30c3b8fd422301917ccc6a1d50df21909b8c2a17d54ee7abff81acd093233afd078060b56d312b5af4955211218d352bf213da89800f141f65ba9a571bb6b2c0395bf847698340280a6e6381b52f22a9ccf41674196a5009d5cf22182fed218d72a4a9191edfd9914ced190ad96b1298cae887d393a9b1de51263cd9636d12e488713a4daf8a121646141a2e4d8c23edf482a29f351a4faa997030218da670c0859c6ee99d0da2a13919789f500175e62957dd8bddbc9eb3d3694581d268877ac19ab9977a4f6133195e0d717aaad67097e934034bee1882a12ec2f978d81909e0388ea3e245208869311f8314fdb6227792bf4a06ac005f0e455d099fbec983ab5677a949c9f73c5031d301c2a58aa84f8357f194d1c8217f9377ff68112422ae9e735d9b4f48f9e3a9d29537c4638f5a7e2e898cf0c11c37a8f1060cf3eecc19539226d1fbe612037e18ff4d9db1fc174a4d872ed94e300923a50b7bfeb84fcd2e9295b6b1ef594585a970e91ee3502768525622ce2c06fc4ad90a8f0d677cd6ecd49f75a7fd30c07a7fc3d1452ac6d4e06c49763ea138ce3a445e70d6681d5f0eb027de39fe5b0b7d3008e1d76994cc119fc3a6b1b95852f2ae6e9f3be829309c713b6c77df0abaf1eaab364ca32f47853ccef7d2625836f699f520853142924525423318949282208838490abbb991db960a0a71f76d88ebc5b60a060f018232af571d9a623c3eccc812ad043edd645e82b25659eeed38d08e408c1ad3c44f433e3a8304f75f530baf151bc3ce9ecdfdd1a04307596162a5632982a0793dba6ad19906ba5618101a6beab790e6e3146090f3342d7f617da94ba44471df5ee20057218fdd63aaed089751de520673a6f7050d4419c88be0060c1451a84e1e46e9f492be509177082f9ee632b31c7e438a7108ec998a763a759fcc8a2a2823d37fe92a3dbfbeb934aac1c115649d52ddff9ab3f3ad63cd88c0c8aa8949b1f1a598644cbab2fb2ff81229dc9b6cde1fab4114f1ecaaa64f9d88bc46fc3e4bb59dee95cbedb8edacc00a49dbb71caf37313b5dc5b324108619bf1bf93dd71e6e00b63d5cdfcd25b576044c3e540e2a3b7243b73a4ff9130f9199b89907b94c9f258443692ddaac6a430f69635b71775f8825231ea0b391d4b79c3a43091506453f73b113e331fb0c4634fdbf9bd1bf595b070fc308abd52d0e3f960eff20eb1774b012cf0895fdd354c1325d3a0ba71185b04104bd55f32754b4b8b07ea23d675494cf9680855534ac3b3f56b9b6569f3fd58747ed9ba82029e3149713fd20f52dfe61d159f256277e6f10e9b7b2ed58ba3973b90bbd2aa12e4f2caa7852fbbabc67a126d1773932f0ef9fab629da27cbf0ce48660dafd9bf53affcd7902d7d7b46cae077a52aaad4cb3ca6b8b8d83b9282528e68da68bf3c829475c7f9e9bae587729e71867ab5369ecba26f97b6523e045ee19c712db3d8a62424915f5b83386c183eb7c1353c8b3985db1d1eb3b32ce9d99581d8c345e563ab144c067f585f087e5e8b4c6a0c916dd1a8c100c14c6d93a7375f70d634cdbdd79b942d88b51b3381fe3b7e406060716dbfc612e90183ce6087f45719616900dfaa09d3bd5895ddc8ebd1beaff6c63179e08b87f33515afca036bdba968b71edc85853dc75025af8a879d55e2e9f748a71fc4a9367d0625d77402b393d8e586b7d81f8a8a3dd5473683145a30afdea6d9e8269f6b5d0b18bbf23bf41a6620f49a1f1cfaa344fa51351d68d5c7c53e9844886567dc789d36c406cb283f4461b10b95036088c2cfda478221f38a998af5de2e40fd4f9135f5639c4afa0c405e8d42e7a8e078b0e4ea5c3e5fe47a599e0d13ec36e2b3cece2697aaf5b28290e47d2d6e2d001b79e64d98e690a06918d435202ab28341166e9622766b1cb8d67506ede01d5553c14253d8f92888d191663d024c37c7d7f90b4fae9314eacbc2230371cce886b89cc2fb45ea977374e2a8b9b6436bab15eca712768d71e0e22c6a48084ea2049c24bed9f115935d9ce615c0db01e7f24e8f13eb54498a4e400342bf569f9bd948f9552e8fc9853fcd5f922a27a6bcc0efbcd40d9153ae451a23ee13c102c49bb5d9b5d9f408c08e09fa6c51048ae172fa5830aae948f68f22d2075906f9c204e4398a2302d38110df827705b49b0f315b83b1a6ff527a543431dd30ea10a106cb59914f372ed69045f3ea59ae3908841befbf356dc2bfe173f8d678b1d993971bc6fdc972bf13877296453769d7e8a21032dfc1bc35e4f03dba7db96dfc78fb360020edfe756396a57b704c21ed69d9aa98c23c59e8001feb97d707b9efcf7b607ffd994cbad633b432621814fe3ec762af0a65535ceb68b9cbc1b3ea643d14debeb1d353296f13d3902eed4391f5bd44414ed8cc59925011f20eaf0e33bd71f66db5b4fc90d0f4873e9a2a345d12dd5cf7b38aa46d0b89315724e5917ca7f222ca9ff4b34cf486d36f6036858f9519c756055e85dfff991e67f0aa4f2d497aab7ed30630dee796d21d866523231242d6d3b653c21abd1401fb52f1fd8c4f7850115ad69b6f6a54d54e882dc7e87c2b4a39beb7a742eaf3f5f009d3d514bbeb32173eed39ac762c2a00542d1756cf63c4db4e04ba6d2fbbc2deb6ccc71db471618c320fa28dc0a7c6c472aa683d6cd32e0eec9f18b371ee26696e6fe6eeab8e9f0f1b40b2250226af5c809b186c83f310f941130ef5128a0de1907756582a84692cd929bb23283fa5f0902c1c55560311b610453e43154ec06d9060dd2b15c739a438ab6852990305b30837f9c6866c769d6741272b641dce28014aa6af38ec342a141c27cf9d654d6e83c9cc44d6c6701812c7a9a80cc141b18a4ea7f9f76b8132218a16353f48c0c5c30b2b7b7a1c3bceda682d4d4a4ca9a67204267e7e1f84a039f1ed47be05c6c0b8da30e59a1b1e146c22c65b8ff3a7379f82b213516b161b20891738128c32a95aaa2cb867aae4a5124203cb00d59bf50ec08253f571aea995deda13773ed72021aa4a4f9f89cfd350635be3af82e5b2cdcee8167cee486133cec6e5330fd1adeaf3616b0277bbbd050c593d599438e2a14be520f61f3a51bd13e80481a6d72466527b0b549cad304e45b365fb6b910ea097bbecfc220e9eb0ddb930b3a78236649229b2e6735cc074f1e64811e1ae31e392beed12507ac452a1f796028ef5871a25a0fc3bc9b05e60b5da18fbb4e85385d97cc902fc6aa801c37f2df29436fb2af3c67c9fd4ce958c69650fed33906189d1e3a74bc61c77e91a676bf92382cc2d9312e73fdeb950f800dca034944f72c0e4a3bd753b240c0d87d55b32088c5efbf028a404d29c94ac9fce2daa53a4a8f4711f3de89eafa3a439a1bf557c2bdda67d24c82554a1169fc417494866412b97e7af5c43cfd6c1bc6cd55b6735e5f2f44ca086333308f5db8b096c7c8c319a6a9481748222cd494f399bc66641163e6fba8a6264b4560722ad49b3919717886678e1f1e652ca69989edf13fa38c0fd1211c87abc4c96f9ca52b9c92e9e5f335a36390205f0fddac9bc44a0e8a97dfea2afe71dfc441110b3a83d11da0a6d5a8b891bb4020d1db470238c23f280b44178c287b73401d7c1af2b684da488b575a7c6adc164fbaf93395066ee58ad07d1fc4136c106bd6e2e345aee3a26f978352995b97e2500de752879a997da298d9e476a456167350b26e9b24239853b825ddfe08aee2c78fe60384b81fba91e918281400b2636df61428c3dc3d3bf00596d2ab3a1816a06ae06176cd1520bc8c8b875bc3bf7136a2dae63d94bf8ad2b886b6e315357040606acfa03496a67949ef8870d2919d022831b8a57d0a0caf6b1459d4671e13ab37463a0444653e16b5dcf0242166527643839d6aa2ae70d21c0fbd04501c25b938345ec7abd70c06a4f82f6fa0d780cce16051f21b2f96d289d3416c26129962e55ad565090b4cf094f9c3e95898d8f00e9d278fc1ac81fab2aa4a0b40080886b49a8a414f4cfc30d04a3faed1655cd222a771e1cad3f6a3651fcba3bde94462e3e4e5f973996c659117fb119751fb788a123f53a0a19d4ca8092e5913782300d5fba1c732152b2d562f3ba5a4410727c3cc1744409a94f08b4c0abb2e6e07eae62133475ea2cec0283a1f14f60fa1a50f599ed1a130d27a426cb2562e0e43fc75d6d21f1d366200291d3824ef195dc26b53a92df60ff54580d27f5339c561802c5a412fdbbcb91cfcd04e3f50aec86449ff6ca4b37afeac3772bce58a279522cb5c1908a676d8c703d1d91607af044b1140a852dbc8e1c64597dbe261637a6c762b924e5c3726a097777f1f4b571d40bffaee266fdb944f96b1f817ed9851a144e78c5f0f9d22a74e224c69cf8617c21f0184a731c9a535ae503fb02eae8453a2f0ce1243ac9fd79edbd77984b2a49e2fe00b173060588b16064ab7ca2b6cc5453912494cbb34096df06d56ad30189194083065991f81ef166713032e9dd7e6ddc0d0903d0d38985e9ce3020774467b49d6b094ad96402a798a642046089c3d3c7d828ca4129a448402f92e6b22ce2229170129863d1efe4afd1c0c5ac353c5954e2592f26ddea7cced15f985ec85261279722a076b8e4371762e5a25a31bcc8728851dfd4245e6e29162d4a2f50ef67d7f0e440dc543fabe22bcc7a0e1ff7b9d4c08f480d823eb5e3ac9d7c23a57816c3bea792466ef6f328d7191b9c4a81efdaba3b9fa8005781ff6a4191af2064dc4b91ab69c07a671ceefc4ab7563cac7443b034203e4f50326e653ef967123b124ae6e79163dee8de85fd572529bf82236f73d4db4806439e97b25f95e2f2cb1ea25b6369345a1c3ca48a8784d7f0d9ec491a4c3d705c1240eb8b692c031b9b6011a274ea9c0f3c766955473725a19fccd77b21720a9031838b9f00c9e76e0c11600c56e2d522674775f0c087f7c310d30d9f40e54a950d431127dff506d460d8666a45bfdb46a3342911861474298903e74331cd105b9021e1ea40df1f47224ab6ca011420e04981af16ba73a9b66ad5553778f658139c016038f8620ee6f46f92cf8bfb4661ec66b1152adab2604a213943d13ce92c00263b34176e36bcad8855b184acfe8c9e3b50e043613e8a6d38e98e51f9aaaf3326ed0e1ed081d5d0ba8707d9b90a13861d37d40c3d6624f3183119c5ad69e790c90f843eb5299ae9c9c88736d59b7ffb03b6dfee1bc7f4b19959b22180adffbc7b776815ead8d6a447177fa69c1ddeffa3fff455c24c85b372778091746d71ee3a1f386d28a0e69801c44e5f67f4468c0222519450b37017e172c811162e768cf6df3afe63f20ff57a358eccd068a007474b98fd4c78c6c58ebc1cbf61f0705df118606b48ec0b5d6394bd57804b7341237cc145622c2aed266d729ac6949b3f9604dcfc7eba7ae9ac8afa5e4346bf9ab874a4e0e9a7cc34573819c1d8046761a30833b09756f395480ff365dd0c3e9bb982e18bdbb33401398d1793347eeb9ff892610025bb79dea8e1cbb3166ee38502409a946423f7bd2ff058319e3d0835dab393420709dad177efdec95e52f0367f944b10c3b8cd4169fa96ff9b07d523853f0bf32d0131e5870ae09212638966c039dcbcf134e79e480a353707c132f06bfaba023f3326d5130e2be966754ed04495ca80aa6c8405e93945ff9d15c2319af4283c09bf0765c6852ee6e36283aac54aa382835b3b14071bbb2f1cd7da3a1f15106646eefb73a90299a3c68a124733fe50fa56c79ca137b5edda7d85de74edb21b21f2ada13f2c5c2db87548b140f9970175a0a813112e4f5241fde11f4d28993c68ff9257ea4b73ec686cec0c6d8894924e099c69d663358aa6abc9ba7f864e72cbc37c5ebb04d6439b4ae621bba7fa7d338b75bf90cb770cc48d40d16dedb2e6947edfe25605c39a96f24c15d1849a88957af5b1f88510f624080335c0e537db6c30e68ff42c56ed39dc2a7f328f37b8dffca116a021633304789e305cfbf0b5b291c00b6ac9fe3fbdb6d823cb7d8171c2899f46a45066fa4867db2a6d74eda8c9de0590e06080441ee8be9a12bece99e713a66290766f026d3bea34f80d126af467fcd7d7b0a2e9017010d1d715e7eff4251f0ac7479eb9f78da152227e1458ddffaa4dfe0b5e52e474b32c4a1784d7c3b92de8dde8ee2a160dd52a1de6eba74a88892b66ae72b7a928eadef3d4a6b693434114bf0a2950d5d9bd9a14272902afff1acff0bd4b153f72368f32cfe05f3c6f397e51e6041b5c7671f944a496ac6473657d6662b823bfcf4e4ce10c1d0f84c739a06f47aa87032503e61ef8096736809a533330a413647c5e1d15843a706b7a49704b3c65262473946e8c4d2a22c19203b5e37925b6e422a06089bd7c1caa9355fb53ea4e1fe9da80d5af83a2d9611579e77cae9dd73c9188bb704141f5122162b860e513e63b5213720d513e66d8dfead3f498bdfb03691e0e0c4df566b8d020f881ad148c89d19460a22e43f16263657b17c0ebd91c69e46985d133704a622a6f4ad37bb9571754cd3e3c2369092fa503821014444930b84581bf91302bc974fcb32fbc9f7ca58b16a2932f60f4c2aedf916514bf428cc0a27f11cd233140a5c081c50e714355e280aa8faa2594973d1f7aa3faa2353cfcf2a858b021ce1be8d597581108c000398afafc917bb34d701009495547c381e31cbd7f219b8d208cfea943ecef66e3296f7c8ad81432a56de42468c0705a239088912dce3ab87d9ec6ef9b0fdccb9407c81816cc418c3c09211259dee2daa9907f0ccadabbcc5c5263ae060ac0ebbd70562cfb7e6b60399660275dab57356f5132b1ad23c6fd7046cf18d13ce49b84861fafaa8f77c5d1f8585a789577c96e76508c9da11e9e769de9c5b53eb7444f2152e20a0481248396b27cd88304500dfc0a7d102d055b1c9069e7c16e6885423104c7657f6880b866852c417ec62343b09f2f76997b5f561dcbe6386aeda19218db865a9cb5c5cb4535c61fa2d8521e21bd9b7b60b137bfaa611d1e2f44c6aba47977acaff0c6658b8aa7a6fbc1550178632f68fe10dd867a596fe7eef73a00a0a22c7dabcb915f5c7a38f8a46a9c1a3fd5e6c484bf41d94c49a100b26a66a377458d6c2e22931401390c2bf428f6e2be2aa437349d1c06eba1904817dc58f2671cac6903a352377e7d0adc12cb0cd0806303af1a561905577ba5eecc275910825f7350cbf4ab13620a133350e1d8d40186eec111a310e38546c89bd0c0eda5e0e75b04e1c29e16048b3e059a07fc2761ac71cc5415ab75233b401ee5c820506df9864216eb5e090a9c6cf57cb8175fda1bb82f888f6cca0a302c7b17b2d16c545d05fcf7bbe34854193d423e226fcadaf8dc580eabdc13e4f704ee8562937a07038a1e63f92f32db83e605260e3c9cae1932eea19d76f87e1202ef5e71f892c03b4a3fcf008305a24e698cbdda00aaab67f7bd1c26ac9a7c5e4802e426094d1dcba8393c99bc6d1c6671aba95d462df7b16c68ce4f8ccdc6be6b6b7eaba04c71af23e87b91425184852e5d28ad4f883ec1b33f74f1aff1355dec7697ba0e3f7941b8a9da1a9c7d1743a9be209db57646c3bcca7b9e6495b89f68d3344be6bb5b5417b09860e85deb22984ca2411714359b903628aa3d012ceda4aa4e3bf7592cc2052111795e6c24389bbf1ac687b638399189085ddf376f81122f88341334e1c2b5028bda1704910aaf38314aa946509fb22762704860a7a4e3d964cda04a182c6b9d639e0ecdb0df1ea0143c9f42830997d30780e6337fbb6c9364225ba8779eacf2a514ad374a811cec5073901adc4d2fb79e185289515fd86147aa8c1011a426d6406c04f59f9db976000a1d39e20f3a5dcff7565efaf440c009134c431c34059321ec8707e46bf7307903ed819677fcf1594c44cdd98ef6e5c43e3732052996fa5391b356140b7609595629a103a40940f311384da46c3e49fe335d97cd7b7ce2b27a3da0ccd1be732608b986db9661da00e25466835606c317fc83446f579a0272f73c97e1a3deffb4a68262a5c7abf5e75a07f83c232bcd5fcf03e80ca760282974c2ea393ba5d15c7ca47bf4e17c5b1f3d7a3c3add0d88599a6974cd2e1ae40b1851376eb4f85ee653c11142368e4aaa1f478b640d9833954210480782807fa826204a97f5b1ab68f35108e61b58f3ec9538a81cd4c1226209a5af3c78105b93d884017ed5754f8931c74a33ac4968886ab3ca706783a1a81c8a156d3f1f6753ba24a70045705128030fced8d10998c95a354d1b3021aaf854db005ff9b3c99ac9c06c0c1f4447d78f720eaa62bc001a1cf2774b82934b632403d7a50227edc3a7d2aa50fd026881f33e60bb1d7edf8fced2255150522d62b77d2bea1ed72ce0a416bfaf2a6bb07ba5957da7f60b9cb9f72af2f2bac3b01bde1a0474c18111b3a5aafea84c9302e01a82dbfd5374ccf6f6a805f61ab002bbb856e828c0f4050e42431d63b662ab963106a53ba9cc1dee33be6e7e416f1862acc751d7d986bb4614bf60fc702ec7fa83b12fcb9c6c23dd108e1495f3db8ce3bb248737fe4db1e9df45c703c557a6549f7b5438d593f482e2c08b6d33f3eeeb7488a53d98610eafda2f684fda6aad871e2fce81b3231e044a5059c9fa721fd60fb7010f9593d3946445fee4ce4c54b17e01bd9425bd8984b644742f79cd28331750f5c301bd106f87cbd678a5a15e4ac586138964c2f004e5687ec30de9f5faebbc55c8ebc9271ac4d36a39a771038c7ef3d668b43390381be9df28848f26add47ebe21e631410f5693d337a7239313313444d68b69e918864a5a9a8699bfbccde67a9f43e424dfa84d9448c53b6fb5144d46db4476e8827f206b47939b7a802214c5a45050a9cbca39e17d60efda7f353b974f2a65103c4aeda48306f23be1f7649eaaa35f49f92bfcaa5fb8683cea783de00999fa7f3a9dc74f206262c223f3aa1cb55616cf3f57e6abe2ab76edf98097d39ffc749224caca0d0d0159f5e97cc43534eaef0e22d46941d536f461230240a9fd7047d58d6f50300a59b554a7ac0da9f51c83bcb46390090e438eb4e5404406a15b2f6d8810f93aec575be5c45de5981537dbaca3eb633448a63e147e52198cf2dfa4b1e5f3b49c265752d8566e5d17a4561e5b759f76d12e223db7f60568f9b925b8d82de1acb8ed0415560f944dd2e058b2d4c206aa75d809b3b5c1f42be7d39686ee0a3f67719898c968034389119f3de2f6e76bc4448abc4cd63fda16884a02efc97228da15297aad151ea8df50b9850636cdc33a84746480c19005b7ebe834749c945ca805e6d45b69b25f55ee734cf00c4069ad4a13401987884af208f5757c011a8fb1031bcc0b70224a1c9c5edf802a160497b342828b69a3d5d2fe648bf82b852c4b8c15ff837d1c775df3bc2f646d7a4dc798c44afd1a65d78879c7c616f60d20ad10999b32b603dfd284d9732b8bc655b976a039ac4b75b76adb20f6f79246afa4aa5601c0b2ef351ae0734745f22fdc7263eeb5540a5f233fc996ab0fa26a87d704fb2051614fa5438808f1f104ba43fe6038fcc45da9aa7fa8a4d02b150cb8644e6e6748fc9015bd27f4817603ab31a66de0c7e7aecca2ac053b1bb8d989ee0662f72efbb6eaebcf4684f94261d9f3827a3c13abc79780c19979fd1ed2a0e881f46b9356025931ad56974e186112facf996e96be9ca7a92456a469f4de7eeeb26ac2ecc01407a44b5fc613f167be3c7d076952d41cfa80d9b76c6a3695ab9450a56994d9d6972dd04f75b3ceb9c4c3343aaf563fd429c68f2a30337fd8f3d01ab0f99d63324c54cc6b202d15cf113d9a589a206ee8015d609ca07724497527dbba4137821602729cda605f1c0d8a6ec6360555e1234f31f896d40b09a4d2d209d51a27679f3efc14af35625bca97477a5cc2a447422b0403f60d2143c9b11b027040196fcf39b4b3e9ae2169db1159b7e0680d5b756294db7e2ab072f9ba6aa42aff3f9ba430f26e3ca4742a7a531188f16192ff62459ead5f55a6bb922dfc94938eaf8fa8607006bbd2cf41cbcb1bbe6722c938abeb8d65a844e2071969be94f27b50de78d8b3608ad0f0dbdf9f2a0ee1714b091f7cf4f06a0fd2579aa0e37e10314db7a35203ca0c9273d6fb8fd00f4f068e02150c414f2099d1c73989b635cb0d0696aeb40b3da9ccf1246f4bb33be678b84e28e033710b4f92046f67ff0e58c0241fbb5798a78b03176a39b39b61e5e1be182fa76d93c4b08d09b44f79bcd88105b8fce5980464f78f0c5ec6cfc39e524041176276b72db7d5eb43e38a1077512a2d540e242a6f88724efa8b78b21d282e336f481f532c5a4025de9781185ea6cbe8b05a9eb215b845614fae74140d7d047075e09776931a1d0d59a266d4f34417875da931bc4fd75ec2bbeec4ad25b1fc4d6df1b58bd196f041416b854356c8a21148f1d06d170c2ddae9e5723256458c8c15ae402beb77e28e07b152aa0cfb844939f22ff0677e9dd76e8b3332bdc5a779f635e97891bbf35e40778b3dbf36ddcd9261043e6dca6344c714054bf10d74ff866d318391c7f96359067e58ba624a4ef6b4c153c380aac338032695c32a5f5776211ae3e03b0892fe8755dff76775a0b6d2b392faa6f1bea6571e59f99fc10429dd0648d00d0ec286564c1d47eb3ece6e40829b4d7461d19aa45e547621557cc2c4e5c7097de76f17696d808d0a50b16efa024949c5e73a3271da506268d1f0b3f3fc8cb0c08683d1aa7bc93b7b1b2f99c85c88f1726a1e84eba1dbe5d667c52edb23b0ca9b22f749069a80cd62e3d4b983c159a878e1d73a3f376e4aeaf1bfe197a74ac1576f060b0a3f51507322eabf18a31953fbd0ac66b1f77caf18356ba9e8bbbe7e011a150a25011ff8bfd7cb0a99a9fcd1ec929d641ed607f42dbf0c239fa446a10da78754564a65206ba2b9c78ff093276c3aced98277df4bc3844b284c0648e20b4411200c230e3c38587ac076bfc1791b33ba7f0e9865791e361b99468119b81b809cdc504f8aedda6e306fa1e041148416c1b1817b148eec4c5430670cb3af0f437bd283a6f498a34630677639911cc5eedfb237b0aee8278c56fd30c44b3dd86be3ea21b6577f1c664db44ca4e45a2bb5bb114d78435aeb9d66d1efe397be0a8312ade3dd98e47c8b4bb1be20455d1dd1196ac81ffced8607a868d40a46ccb91bdd2c8ba199901f2d25028ab382490b5d17b19152315caa831a894474a00f69c1a8caece795276b5047607373a83bcefcb1387592674229cb4f86579cfae2f985eeff2c19df4a464f2d96f7cea3dc807b5f2395c2bec577e0d0756e21c00f7f827ed2a7fa32751b9ee5b75efd18db8783fda50057cdf8f2077c1f011cf64756cc16fbdcdcbffd719c9d8d145dab732adf4c0db45b4bd70ae82c6fd346f795b66eecad39aad12d76d4903a43ca886a8e4544e38aa0699d3b9a5057c2f520a1bd95e6f4baf4920f6b9b52785d678ae346b0c7853ca9ecb18727b8edc28ffcfa667d089b1ed2373860ea0b7bbf37e86efa4a70736cdeb3ff56e183dcdd5d1305ecd75b56ea5aa348c30cd1106d5979041670f5fda2f59046a99a1465dad17a907300ef6e379d7103b4d4d5fffd0cca64081c02c30194ffdeb179e09408d98b19a876c0763a1dcfb16b15f76109c12898d27d4f5e24e1371007f66bd4c9cdb4c2ccc2733a0757e4904a5ddbd3bde25f2df13ee210e439bc1b7e57dcd092c2fdbe7bf25e00200e9679f6ff57fc29170bf5f56eaff37ebafb1617f4ffc25194c53ebd28ed3eb1e5cc5d9e0c2a50e3f3afee7452b7103ac6bea092e56befc45c132a3788397a58abffcffab7bf794848ac4935093d5dd74126df82eed54c4442f1c74e7120168206a8987b8824d5e83c43b7bde594a240a69d364f1727490344ffa2e9332b8137b36d2316c528b9be8aef286df4f6be9ead5f10d88b5e0b896b0911a8f712add406d1f05f43565c96f08b6e6394a3a4c29ca350bf0751feee806a14a6c330ad8ef933c5931c52706d942c3264964c475670db2eca91067276a7a044043a38134f8cfc0ed53d05ee3a4eaed84a3318d1c9d66826395073845b9a9257572e66165782d916bc47e68cf52684feeaae270e0cb026b6f60cfd1c5781bf48972a9eeef8577aace5156ea1c32d51c829a62aa9bf2230b3001891d0b7c7806051f3aa74d408d1854eb8355d50af9421d490cd5f7ada2480d65287c7824a7d94d8aa539f826c8551fcd4c43197d33f41dda79d1de456b85c49138d9b2385283857330695ec3f31859ccbe94c05a06bb3e7349db1c0d63189565ae2fa54ecbe25f4436a53c63722058a8d504a20071c0626471cacd428802d845b47b64a0aa2c85e32a1df6de7875a6ae817938e57eb0f4b47accfe52ca677d7e36400f3e5124a0dd8f87256197ca354b0510f07aa927131cc6a61f60419834918210aba18d8f72638b2ee963339abcad8d1a2d2ab2e50c91634f4d452f6326746ab177714c9799298ff9a65be980372468d213987994306d796e8910343c1b95824c07cdb6a41ca8b4a339ea1b3ad0175dc422c5eed16e68c14c9535104eb2fafae056cd746281f32e86797564d0c4f568df4df7387c9a36028d08d9a839cf925dbfc8e5bbe02b93dc6c9d5b02cd944262cdc1c68975134c34098c4363fdbd774c624908b0fa27cc9bd4d692004d623996f1f14f656ac6927c5c210b81caac2a632e108c24bc74542d83d98eb440efaab6ff7661f60385b06208a7feddd839c84f41e95aab773651cad595e552708b38e33db3a449fe3f4ea88237c5654aad438a249b8f536d46426a4a6a5071503db01733b5f3705177d5f7c2c9febe8a9fea23aa62607d12d9a1ea9ee64d8ae2440c1ba2e5f77aeafcbb48237ae4cf3c7547987d016b81fa8286d114d9b4f8c34e6d79ef9d8daae6e618b43cb4b6bce6acc73c6237043445387a93750cdad88ea40e0b6e412d941fd3f27063d698f20b5bb9169c779dd813a1bac0e031fe7767a8a6b45933110bc289bd4ce4c181588c4a448f8b77442f48d94b5135ed9222b4180971ce3c848eda72cd84db16377c61be195933363650d704644cec80dbca0c6133f31cc688b013f2060fb26e35ea9d997963d7fc95f3c39e3f218d6f93ed66ffcd469f03c7118cd17ef0e9954c8eb219cdb46830c3094e07fc557d6c14f179698a5f379161a71e95d6d3110e88254aeb017894d2749ccc6834a37546a55d2d1331a4ea12b722e99ec9d19afa4249148a0001fdd17407bee0fda45e915959cf44006db0124d552ce0408a17654caa9cba42c1b9c4a8fd147e4b6856eff2194959a67bc379971a621a162dfe24601882300a374c56cafef72583bbbf67a8ee24c62aa8376e4c71e88992f816ab62fbaf39c7596899d4143bb76263471fbf9551c1f8b77f7becdf30689ecda0cf6f228b126594285aef0a710a3740e41b5e1e4ecdb8f74ec4f4f93f424c087ecbd95678e2a3f85a8e5340013e48a5414e6db3af19372b666cb86f6a22ef847d4f41f30674db180dc71ab4085011febb46af064d6fe04e39f8b16b38140be6f6feb1a01353d7d36c3917e43dfdd546edf3078c0a7d18fc1fc6e439945177e6c59b65f1c07464ab04f6cf943576f93c94e19fce3d7bc2d0bbe119e3c0a02855d7065545179d6a62d0f9b2dbefcc3085cfea079b3c334b91d7c0a80890ef2c7e1f68ea91ae96a1fae96392d8ca43564a10e69fbf050438183f1307f4b2320d370470341da01fbfbefaf6969466060416fff01cc990df7dd6a5ff2fec2d375dcb62a0be08b318125cfc00e01cb719aa375c3efd9b34fe8787d16206c2b94297614243fab3e274d775890d08a1671ca1c22c8f475f2ace28d507e99c9356d1781b79d22dc45a80a5e17005c8d25b3399c5663dd7e1fc989367f4be849042f4c0c91faa31dd696eaa1698e189d8c3765370a432b4318598ff885aa631e9b8e08a127c353198142b795049f78328732313b09109155a6f536b9d25cf32d421b32809aadffdf82732fd4bd7d8ad2c479a317eea7c4a2aef7a97459cde531925f4b7033ee6bf04b73a1d0cfe56e6885548f577f4da1def897e170a262ce84010850e7c0de4676d755b364e2260fcb4907e16ed07aa84c02098b748321c64716615feb70759e83c54893fb407f2f7fe3aef87ec2580bfc09f8a13b7afc640bc067796f9a99b61f95d7bbfa4cf633ddd9d1c0b795db606561d13e69cb7bb5933c4696240a0d2aeefab197e2198a9d823e15adf33d9b74817b3b79cab0783919577c5af03a3758818a20f8a2a1e4b37f11cf7167caaf524355cfecf616d8e46d35d85d338950e40b46237622087bab04e534fcea8ff8d3f43847f8ff5b9ba18c3014a03d39bd1bf0bd0e2a3d8ba314dc1891d082697d487a92b27cb3afb6706b3b3cdf20ac1ffee9942a172f0c5feca58c12d17ade3168f2db488fa3e8f9d278e1b3a58ac89af24137d35f61f50333cfb27921a1487d4587eb7882612a54f693372cb9ad762d6d03256c11f9c647b3da790b80f2bb7b6849121321de3822acd6fc12118bcbce99fccab3d1470171e72d4e9dbd0ef974cd1f72c1ffaaa2724f1a8dd9fa3d5016a548648c8b959433f1a04901a729b97c0637d252b7cddd19f3ae35908dce757829b8e6ea3bf69ec7d22019e60549193c56475bcb25d5bc3fdc4f01b3838a64d5082bd6b5a4d666a25f1c9fb62b2e2fcfca41050e712cfd3b61ac799ce905213bb54b0d243e2697ad693242d0f6875ec267d0589bd410d5a5fd56891301a531f9327ef3b609c86a9dc678bef5dc4dc7e4db4ebb7d3ba830245671e39e38c0f29fc687fdd60ea6985172dc231045dca119a62abacd7b75e0d85b4f0ceaa608ad3665ddda381e27c8c1feb65aebd584c1a4d23552342f5760932037addd822a25888617a0e1b93aaca1a29b2bc87d83bf7efd2c0667a6f957511bdaf59fcabb01c1a081db4a495db3adaad01f359fe61a8f655fc0c2baa4a33cc5cad1feba8a221fc08e77be3c03546dee1163ca8879ddaedbe1af8b461fad6837ca55aad09b1c0d33bbdafb3cec0791f98e3da9b226f215eb8ef7298373a7f7ac9e1e070d0b690a4a010d5d37c465090a74795234415b2062a58ac388149729d9fcbe4a7b11b67c589bdf98eaa5a48baa17e0c7f04ccaef91080af462a362e5b4355ee68221f8e48a68ea7858327bedac09bb81d9ceb97bef2ca96a57fcca0291a4822512e3db2f0c1639ce76da44dcc671f703a4981c8147e70e96c6063b66ccdf38ffa98f1df59622a943d59288421a4e2391594b43085f7ec3cdf84e9f88e4091b1cfb1b846b1ebf233dede0b1a633252597413929190c0b29b0a6975859c8cc353807e4e39dad976b7c39ca19351a632c7e2bdd5dc265361596dddc7c7c1a3ca51a2d34b1c38158d4d115a97fce1e31cc394319596ef6b53a74af9b174e21e14ba12943c4926757ae6460a2500f7aca1e3c6cf826a6e7c8469f1e5f416d4308812f6c79900f6e48ebd79981f5f435f4d9e391a31e5786f75cdd20939c99e229401ce45309370788f88d51d7d1e864b3e3eb169e6bb347db5353c0e10bbd1f87b2d0bda822c9cab5de99a882090ecb91dcaf8c57b7a45cb126624c3c3aa2e33c3f6241abd9acd80615dcdfbd3f99343f5fa6366cf883c1ba976a540d22d134869a06ae1ed2e13a0cf91260a35eb239d984c16014e1cac39111c229c583b06026fe5363a07227c45a6b3f3bc6d7e0ba5a95d3bfb9c1fca2286a55cacc84a9d6d79ff01fdee3bbd7a7bea6cddea02258ee89f558e3b974f88782ed5f8c505737f59df2debf85ec6098c22328ed017a06ab4036c5264ca1f33d05d8c548dd534a24e6c248bcf4f7b5536cde5162dde8d6dc7559a77a60cb6342136bcd7bc540afb568edfc769be5eb82daa15dba6439bad664bc441f538ff304b562a1a10ac6990a708b4376babbb88f61ade59c2c2a7620c5516aa0e453ae32bb8978105c2f26eb5cee519b898e22babbe2ffee2467b935b02965d228b2ad85f225713b0bad68c57a2b22eb63f25cbb622d568046d38641f6512e388bc76a345afb4ff7634d72b92283c55910be45f0bc68409b4d48e2ea4c84401e418ea64fb3b3b55c1627fd83ca683b35455134cdfe0ec72862d2beab9c41e1118742dd17234e78ecde5f60700376ad6dfc75903092c7d1d0104dca6790eb9ff9b8e31f757d2360b09475c63e7a427cb6b16f6372ca7ecbf3349742ba525a897ebe8aea9f49471899e428e3bacc20bfee91436de43c3af79d07f1b7142942909431a7a82a91e731ac696c044967af50e69cf10c5ed6b825f40288996655050dfee8cc0c70872ff272037645ed3f76fbb07eb873fc1c4d926c5ae4b478cc8cdd12f35ba9206518e48fc45354435567bc3b9af999b07d097cb8c07fddeb89e2d1024b5525f100cefa040e50922d4b8794b29d3908913527ac00259013a3e3ce22c71849b39815421fe4a54a6dc85e375f2c37ecc33e941ac0cf40bf8e52ae2b0647724e269094ecff895b557a8495c5ccb11c9abf0519332851d9134f68d0fc970a5be29b53db4f439ae92f57948a14b4a3a2c13f9ad13664d432a2037a7352599613986963615af7729c01e091ddc6913dad697156049154257c02feb3167a5eee87483d43abb99da974e48b6b1f9b1dd9ba3f5183752413a9eead3c4152a9e1dd1edd3d2bbf5700bd8ea7ba4afbfae95bec46a243fc79bf6a99dc68ab3e356e3d3bc2faf34a22794ef6c0c8a72204ddac8ba4c05b9eaa093da4cd0d9654f4f3b993328f3fc5cbfe4af6ede83b23117dbae6f9e3bb368581bdd4bbeae3b9551375ba4487d91854ece5c4e61489dfd03f7f9d2d51a78272057fe84a99ff3d6a8c827b239e830d5d631779787ed8381f174fb3564c4905b44ce64299cb8ded874680185dbba1155276d482e91d784f1f7560a6a000ae2b4a1cf2ea7b06645c438ab57f06d2f0219b30840e9f1c170f55ef90a4303d680cbc5caade23816ba929e88b06037430818dbc358bb504a60b9a26328b5ac59cbdb347f49ad9607faa23ce5c5ad67ea0b7a4fd1d71553decbccad85d471d4bc325986a383ba1274b6db8bc1b021fd20032b9fb14a5713d57fdbb59a630874eb5bf7869242e533a1bc62fbf01911a63dc0e5030553c378ab1887e2fb9ac2aa653896ed81b6bdec42bd9c0c5f935db02f273438c0337b307af11b6f40d57e87b4177d4dce3ca6675f1650512c6c0a0e5977f4b40e8583589e2ac8116f656f005ae25c5fbc316ac14db27c5e87ad38788b441a4500ca66b9153c3df47be249ae9b2d6e63ad1a5bf631cbbd75312da3c232ccbd9c9efec72da6073083ad32bb0c32947d96d0db7f3e79b88c5a9f4137374b3dd02f9de1ab19b76e34b4c944be2b27c3a77c13aa37464841ca29afdfa445d6c14607d4214a513e58cb25f0ec86f9e0fecf6b2b8f185940cfa8fb5abc7ba4ce3a3b7ffb0930e8c9d144cda83439d20f3dcec90f5732bb224e2673ce9af80398d2a754c5c89d7e0ddaa2eb52c7e2d84294b349fc15c3d26b530f25db780ee815bc5c68d4cc555736494f4dd29f6fda2f83df322c7eccfbee92bae3f2b600aa1e8fc9d9be296c21b5314146ac12142698d5ba32f96539f7abb02ef0b76be639b0d235c55d9a1792c85b66c2d6c5db71a59a7d1e93bde1fc8b44482aa6beeba52bd41e690cf780133fec1b0ff251294d24baabcc9e4ea1f7916431eeea56c2a6d0b2c106c39819ab0f036c4fe457efb1eea511d9b22312757d1ddb55ba6e0abfc64c8471fbbe139ca4ee589175a57c517d581de08e3316a494b961b6e32ac6a21c7c6684aedbcde4d281c90c481bdeacd6c03414472e055ec236cd5d7eea18f300a45287db38eb05b205894ca71102a007d9423dbc916c919dc1c18ab08487e4ddf628f423317637099c9e3ff33587ffff844cdbfc9359e89d506966c014c9067ba8094755ed9a370cf2f214d4057d64b3a5aeadaaf8bc8b992cb9eaae3b15fd86e9dc1b9b909204cbbbd65dc85fd1755b95d2d983151f179b293e7ac09003a5e4ba21c68f431d7e209a66d456567d2e3d43c08a47c46ed794e3f4676a1959d6386740a5a496024e256f27f5dd28f0e0b15657405f72b399dd1fb8416efa99b2667fa5f6bc1a4632156e53d66079a38382868bdb5ed400bb003cb18d75839e0305124959e25a05db13ad69030206b0ba25c3bd9e621621d3447d8aba239d830a11d21472c01991fe2fe1c3b929a778100ec67b46c9c3e914566fd50d4890cb524e67291ed8623077783e29b987ddbb18080d68cd48093c4b682c8ec107bef5cdeb5b2012e7b3af81e9f11698b9f36dba5ab292813e7c8b1292b5963bd67cc2db02d12dae423956fd67e5feb66ed9a190db5eabfef0269bd74f795001808304f95745ace3f0de321d9a6c9e934f76a2a12be60c1592431e33bf9155b737bb35c04d9db9991e32269ed9956e61a546cb9ff63b6782d38919ce16226762e67183906bb515c76fe11f251010b211ffb59bb941e0e36ad9c5fff8c51066e780cd32a32aada192aadce4ed3a238a6241b4b61a79e2e18f82c212471860f1f38c7e3bf801ee8b0227e5b0d5ba6c570571ea98c27ac0147eb0dc8039def13d99910cba4eb1623120950738a92037ada7dc5e3282bcc8838a0dd071c5cc42350f62253ae846e77cf52d06bdb6ecf056dd791b2acd685cb0aed8d44dd61dc8c9c5f8a3a8fbd61d6952934b8020080b6d6f5b83911299293d0beee54e84119e6cabefa88500bcb4b247cc09c6cd1f3d17b17e625548ba56084935aa874adeb313419274f241d9851cd1e5d060e6b47d5dec6165fe3dde70b40155acce73d737d44d2589d26b5eef959db40c03439fe2106a33a7b7ad4e94b79fbe33683b4f5aeb2d6d9196c2847e3761ad3f5dfadc2564e4d29d25bf1f2bca7fb4c009ac0343eb52369517faf2f5a244d47acadf99305c3fd70d3fc77bf0f08371ba7b98f563dc0ec08f47e612af101457e1577a76bb520985e95d3bb532db307de486743198a9723b58f1472a32df7930a44b8ed36d4ad32cf7c83e7a62d6e6bb50e6f8b71a4de3ec8b0a9d3a244d24be2d2563c2dab56dbb434ebd9a8285d18ccb281e2d51466586483338e7b0a3b60601da0301514ff18f3b79758f76430a3de4674fcdd0bca350fab6ac0d316f4762dcf347edd273b1b514606cca46bed88d840865c6417b5a39a74ba82ae215f7069a3e66efbfb829c9d2804685b4eacbeedc1e543d06d212909111861a3d89350ffec3ae3ea74619b40b5a8e7c5f6f5193edbf5665dac29225b67aad5b7d167bde6cff818b074aa6f714da89a4d804bb2f4a48aa2ec6fb987cfe478a84df209fb8d0ea32352a0cf0627527496fe9157fd4c8836658d93b5fa07abc404b6916e3eb53f9cd1d793e2b8054455c1e5ba4fc691ca86819ae4533dab01762a16620998e06e74543a9df34446c06b1203940f972ecc764afcc6a006b97d3d2849c0bf13caf1a9a7ef16324a2f5c0be7b150a4b075adb6676affaef8d6df6f51ff7be2b04b0612be635be083493ef88bd3d52e3f261d6f6681189878642968f3b7a9a88c27bd94c3b7b7d457f06afe90c2474d2424f7879237cc4f48004985487b993cdff5a2916c6482691917ea1dd2dff174dc361acfd5f09c088760a148e9d26a52d7836b348572652451cafacc18c9b757dd2b24500e4263dd2cc843cbb27f63a381f175b2a52f15617bf6505ece9b63e7ce0feaec47a5f5a951b3f927750deeecaf06ac6e40fc825199266edc9084526c9681856d5f25cb4e901bbf118e4441ded5aaf02fac5964aead18a5bfb0dfffb82db79ea2e754cd26c3c58da2805f3db74cea32ac676572f64ef72ee8ea077c92651b4534080d750b76a1817c622e859e5e202e3d6116c9b73afbbd57b8bd48903b4b5eb21ff6a54c46fdea8c7b33dbb666efb4c077c2f751c3b50b0d050854449719c81896d9c4ba26b53d08e1f88ed22699b3ad2ad2609cf4f4bd1e496b04388349542ff263752f810bb17822c4941f28d1aacb88ded4f81213a69817483fd1381228136cd67d5bc2c56910acc7c57b63197d4a96ff5ef27452872072eb3181a5d038cdb827d124c0ef2bce413d918fecfaf7c52f0e85b77333e1f18e4706061f98ee0105859f6bac9e1e4175edb16cd08376248c69165dc0af602a9675c1f26a31902e4015b01c28089709268891e16b4db24e73cd00a4b0596e0579a2a1aaa66392140a3015a125f96cbb20dbda83028decb496a9ba3490093a1084c4d77eb99cd1beb7c580e5943dc90b6d3f7867829c1aa851faf084a569d2deddf25c23e857be71a40803a5d76d8e1016b081ec23c08b95715de624c9a1bce79c8ea305d3ac93fc8288e95e52d4ec2516b0df88abb590a9be8c4677806545e36bb98e71d2de1f5382a60479e98c46b36ec2d4440c44f60f8766223307fc7c400e0f7c494dcc9386a05208014fc013b241b877b402ac6ecdada1703b886958c1835cd2d60c216cfe14513ba1f8e0ce88f3e85dff2447ed731a8c6930b67a0f78585e300298bd1fb02706252817f140d4ccf7fd239c651c9c1057d03010a57cef19faf519060d4ea60175aaf46cd8755360b789a2a51a0884fb44f91b21d95a590bb2d48975371cee39e72b99d1d49bd2fd06ddf2928729af774727fc9d51b1114e7fbe7551a0e564d18b4060cd7946b356760dc96c2ce2be015932d652793eadaea9e2f78fd980240d8223c64be9b4357f07b96833283a5cd7d02db65138c1b18b7f408cc822c9dc84b4b702ceb82c9cdfbf4e2d253bd3b5bc9c48a772c8a581b1fc607af6c00d689219f6e2b03ec56bbd701bcde5495df9295a78a371a29bc86139918af5a762038edad6842c5cb58b168e0806ae54bbab988039daa53bc51931d0ac07694f901c35188855c0c23ebbf6dc112997a3e0103d3c33de64d296ba27a74b5593153bc46a432b2fc7d5ff7fc20b21c49bde9504fc0743703eb7982384ff4245cce0d338f954f9de41a16868d5d9b95c50a89143021a82b6ab211192d009e8b8e5713029cb8efe066ef774d28d67e8739078ac4b66b4e33d51319e899cfbef4d99bbc73b4f63689ddbf175ba80e2d4219090d54b72f008888fbc843e095ac70c6cac6b612cba4a28887e45f8e9eb2f46a42d6218ffab6ba1ca4e669eb0713a28e6f31ca0deb6b1788e9454bf843d5792ae8e97cda0b1cd83a8717324e679bf0a9b57dffaa56b44ea72f5cbc07ecdafee2b2d4054075c48974e86837c0404b56f64707f56dfc34f610efb07c2270adcc936789432cba1455de9226aceb24ee805b2d56b1d894973e0cc588eee2e9848e7f3dd00e1d3efca68a0335f3d52bf811980c38d075fd6cf419d6ca5adf05898e32332355ec6cc54d0849827bbbc9e884d3fb77ca3bf31e30ed304506e658a9cf1dca4e56c92979d35da6eda65deaf374c4a84b20ab986d61367e43d50c4856f5f9776ac2fe73632b454a679ea45f23dea64285bf9090d445ca6d27a168867fc2782d4f6936222873f730bafdd56e4ae0dc29c2b345fc25bb4f31984b8b273a25bde838c4e36a200a1654dd8f27712a4910b476a785598ba973121bc3539f657a7e7f460e3253221185e46bd5674e4e4ee796efc2f4c9cdeffe371d7be95c4ef653805ec2ab9ccbba5f3fa370e15f2043db17356ffc027ce988bec0ff31b75492badc65e346d87754a92aa073642ccf3484990cfd4c64cd615dceb1fadb92d2a9ac6d1bd888d1aa15febd9d2da14547db91bfc2f526060d7e14c38620f9e63dd19358ad38ed98c6b2aba5f81f0e94a9c3cad4a165ee0032eb701976884c3a5c860e2a6307961987cab803cbc4216576401974b865988b2204fb3305a40df58f515dd971604bca5ad031872ecb2c930efadfc8320c3bc5bb3a54e61d1cd5836d84a108657448193abc0c3bf006927207bac832e3409976f8ba77501008ec7bdba18629ece46b46776169f80f77ec8cfbef45f330927562b08bbaa3601d8d11f34df3b8de86944dffdcfc4e402cb4a31a4473cf31e4978d2327529e39893414fb0a0a69f860742aa308728cb010b158e64c490549e57c94230bd619b9a6ae62b094edf042251a0545e5d8dd7a75242e94155a0fca05620bc1b96e42b3f0697fb72e91b38ed3b2036920dfce30982f0221140c18044d396801104fdfdc6123d3fc017f1bb9c0d203a2e59ad8bd7be5e7d1af636cc68425fd6d641188ea4dc9f03de8098ed3d5fa518815d2b1ae312171f71023aca88c5f2e4dfe8fda0c8c63a659bef9d88187d3f0c497d2b92d1be4f0a2972b9e6fb191d52fe5b0e49d70ec23de7713b8e75dce2187776079fb2bd15f96574fe7823a53630283002c5c391544617e04cfc749553a43233b02d55dfafbcd02e0ba4020e418d68aceae925b60945958725128f999faa9849455a8f50ff4c69fac845fed3204a03524c0cbb94aca7bf11790bd81c87a51a50af234791b1cd5455516afe8ea0c33d171e0a77983ee20f0b2408c5478414ba2bc5e2f6c70d67b313c9add49d9a4ab01aeaa7452082b8db9335e7f2264ad4b8f237ce42258bff16f78c2e2802cade323d1ed2dd3547b56f82b0e8028c416b4f5a04f84fc30a411e3b209f52b312e2a71973d5f8ecdcb785ce9e57579be7918e5e3f95832ae3f9f21d553e4ca2363f3c90307f492f60c683f989fc5cf196b9f3606a9b1928fe9cf5714711e37daf599e1dba60d02c2b0a459070b6f06e10752b859927f080d6604a9ad3a4c26ab8f3fb114784c8cb8db8d29ff3be2fed80e83d762b69b1d360cc5f37e63489a047a3664149b4f70c382edbe7f46a3a6d6799a3a2d075b05da69075fbcfc213de5ede3a022763dc316e8c2c886bc5e7d5ab006b05c7c7fdbb435e9b6a1616639a41ad04d10c4a3112c7c6a2592938289439b3e84e54f994384a66514dfdf8c1197119d8fbc68874c22300021f908dfd27eb61532ea2510fdae912556b6ce1c3ed449716669bbbcd7b4d18657c06cae57e24bd79406b726120ceebae5cf10fddb967063a2e418f48be08f6d53e9d8295e73aff0c1220a6a487f179d4a5a73922b392ca6aedb03f9b840d364a2698cdedd56272398ebbe2a456e10786571af05c339ead4ca15c1b84fcb0ca6b41cdea5bbb8580b54d724b9116f1512a956567b98fc560a129184672af2cb5f256a2036d19e4118b53325abedf62ddf4b7e722297ab2a2e7a0be02725393eee225f428298a3ee3c149a89ef0202eade6e531b30132bb2e249121032537bcb5172d9cae7825dc425d8ba7b3feb26dd131432c5700a632f7a495697e7f61e886159b7aefae7736448127b368f1ef9baabcd6a83eb243e0b67d367cf4427bb8e7cc482a01ffc83f90cad1415d731b8e3d38c7f47ceef690d54f6e6baa8bf27a5de096c0b21f2f063834abbaa7654fa9261db7ab62ed99f33233bc59a672414ed7bf562f9e0a848fa66214542185b80c9f682d827424d28f21a1741fcb9166d4d7532b4743e669570d25855f448b9835b8455e47395ef21e0af871d5b3366b76e1df5067f18f7ca3f316fd1bede536da19ac2fce37ff31e087ddff2901bdffc6a938b177aa4f48fb26cddd3d9e8b747f8a80fd6b204bf6894e29468ad3ffd36c8cfb0408b6fa39c3f796865739f5fb0180877e5f572a5f22e35c4e5399c746f5865a85028fb743f6b4ef9dd86081bfda28025353a1d11ecd7a0dd0965d25f2b0d411decd8c9acdc20e6c49e4fe2f041fd1fdebd2a6ec8bee923860a4fe1f726682cfd706f6590cd7d89bc5a3b8e70a8fecfa79eadadf8b1e56ef493d086606a0b69f1b34a5282c3107a6781764ade1a9dfa5100c10d667289c0038bcec023ffa4d704727bdf293b61387fb6832f79565d9b866a2a9259c229d91609a2970065dec012883c612a460f294a422980736907477150632a8c2f1ce6af64199e22d644f4d2db185c25b0e61793ec842e4f4ce076a556922ada97a4ea3a6b5a2818c30cc92db3d791d657df47d6fb768300722d38158660b0b983224dec83b2419a2f3a48d6158d4777238223a4884c255ef3f18c8302323aab7945ddac640e41822d28d6a237ab2404e6fefb61f712480d7a5be7cd19ebd2620bb1ffb71ccf71a9a47b486727d11aab9d80441a462adc0826c2b5505ec5790a60885730b5c634452a12cb6285de3a9aff451626945cd55999c559d157fa3183a325b31d771ec86b6a7f85b9192e449613874f42bbd62d33ffc825e1d8402299eb690056db284065799a2ffe9a0b0b261af6e71b1178f182068c6e674b9da86907d36457128bef81b7d39e4f739ecd7a49052d0d5c1c8f3990f2fae3ae3023da219f6cf72574ede7ad3528a360b73bb20069aa45c6862be5741b5d073dde9b9fc6ed22ad5e14ea37b4cb577663461e245199613f3d39c5f6000e233342a878ba632bf706bce0359e06296e48b8d7cbdd6c2c35531ec8cd5c84dcaa2eed44a533012fd92ab59f96a36be36d2d884c0f300b47a2faa0435b77623128890a35cb73c45b4d83587257c5f3f0f48fb6b50d0033bd2d782afffb6367d4d4f13c5f580f6da32d736a48e0d80a4cb59a36efd4ec623700d2b220be318b253908e5d59893f5d8168078705720ce3529246f6ee1b6d148c33790908d75ba75da8a95a9aefe65e51dfa7ad321ead9e2c042c06cb952a6ce7d05ecb54be156dd6db23d854a87bc64cf803ef546b7d46d2b507e7b43fcb480bb2f6d056e222ba7d66f8328e5d69f4c60f7da1de5538ccd2f0f3278abac44eaca979e8edc8fc73eee6c44643fa35b0afbb7223a7155ebfd666b80c296a30c208e63b0f6fbc9f26f334fb820590db695d010e5d14c43c3ba82ce78d410c84cd7f235797ea3d03f69dd32ba1a479a711855d18deea545823a414a9e1b8a7c9a054ba4db60954688a60f7f0798ebe1b823c5369a378b70b22d43b408c0ac476ec0ad54cb1c7a1e045e71a513a77467f83a20b4b375cc82020f2ac422f6e1900a214d64694718396f2e55a42c9310f7255e68e71f652bd31a7e3b843db786dd30f9a8888556b86d59bd67be048701ec8ea7f739d0ec9322989edcce0cf5c2a1d421023d04271a523f5f7f1dcdf94a548728ea24109e6cc8160d81f8945473d933164463747417f349246ca3bbffe8ac68a7c1114879043475e2d00e8a86bec5be1c41f00702e0af8c60563b41f64980f9c324f61086889245b32407e45f5b2849f4a5bb3cb044e70096217d72d4440557f0a4df4c1e78aeeed0b475a753d636ec0b57cfc0f1184172c47adff593f9f696ab635b12202e2925521e8ddc75b774aebeab50890c4f4a071c1fb7e79179e79032d94b80a6a89962957075c7cf4c25aa170963083b549c651c8d806927faa0bcc5b5b28f47d61fc0a4741f34e965c56fde6af6abc9882407550bedda4d82b4e96396e40855294f23fb344962d2c8529a1fbeff543b716ccf6e4fcf08b42381393c0f99b9ba09a8adf6dc14dbb39a7fc7a30807d00b3c51a74e370248a5ebdbf588563fe73b21d13e9427b1044183d489a835fc6b93eeb84ea80bf479ef35bd95376aca0647451d9231b1c93a9a9b0a8d725ed615c016a00178d6d30d82798b7bf0830b7e663e68f40db0c8189f8901b69a8c2c7f8d88da444059d8f14ed5e2e3b599f25b3eff461ac5f1a6a1e3665bf1026b2fa7192fb08bf8476f7be3f82facc38951332201cbae989e1814c751e935585786bffaac83ab20e302f4b3f30b07e918d6e37a5098dfc64ad4812023f7960351a3c65a29faaf8df44b8977c01c7f56404bd2780ceb65fe3a4d8341defc7558b51f2cd44f27d82ec23f1d5cc91cd95e0ed5c53d4bae9dc39393d7c48b344bcdb1385c8dd682c8eda78028511b622b87b5218a5f1aea5c6a226a54c520b085b6c09b2d28e9ed382ee7a58f9e762306068afdd03047d44c6811b73acd1c045a5868356ff7f6121e0ea6f5fd20eda93aebc44690d0704bb3a1308a61ea8a13f91c38871c39e40b99f385a504f19ee45c1c441356eb1714cb8f5c529b15290d5fc4109218c398a980ca0ae2369016326ab41c519d52d225027fcfd9e01ae18ead62d752f2db5d4f35019c1e2c663a99d3943859eac9ef03def0607ed5fb8aa71194cedbf4b4ba8a7fcb338aa0b20e53e6158db435788e1a8865f55dae81b03bccd30b987cf9dd8056884ce8fad1ab2b0bc17ee3325cfc137bea7445cd5eedbdd8f6dc2ee7aae502958fc8e6cccf6d19392aff75005ee019166993fda1e3b9b5d0893bbfe5a4577ec4c3c815df65099706020f0e261f3794cd2574f99d468812240bd3fe425ac78f1220e87b0f9e17c2063d4549c0105bf419caa28de751068fd8e2cf6602c5e63645dc106d5c8c9176878480cd878d72b546aefb7cf6d3b37ea3e4a18f1b6178bdd4724b78a9a35232e558cf30198fa7c82742ffdea4bb259ad8b6b16ce6bb57227a4f07633d25895e8a280b58d85854d8fe0c7c868cf15e916360199364ddf14e720680693df659e2ab7d0147424ddf68cc67b7ebdfd86cdf0615a40d9ac9fa42622ace8a913f0d440faff78b39a29abbbb88ff39fee75e0d2c96994582b9fb31d5b569661a8dbc77c57fea5872e02177807fdf93cbf1268e4cbe52364b069edc147724f6c204fa3d48f0d1537767776a1da753fae77a343eb8dc8ca1ec702570de8d835c77380fcc5cf022624725ee229d9a9ab08cd29b563aace8ac46070fa99bffad8bb670d2c7d7495d1f8622d49d64322d043cc74dda9b1ce5e4c64bb4cb562946466465967122889652703fd597a36cb4cb2f35ada509fb4e837c6b0b810aaba6b140ae042af05a70b88436dad239912ea23771f1962e9e21769998cfb6e4bb66ad1f57db915ace1b76725a39ef238d2056026d81085326ae3aa53f1232b914866c19e857cee8c48d5d3d455a87187bd5d83eda555f4afa40f49bb542d02d756ea3a34c93f6cde205911d47505008a763a1f4679ad47d20d58569f618e1d4dd2cf74e1cdc5fe379fcf9add1a89a994097befcc284475faa6a330fe10f502359bfe1a22292b940a1013c4fb461a7c79fec657822198ec2893ae7116efc1ace3331e70aa8773f278ac1d2f1cfc79e6882f335b0d1eab42380f1bb13c7f98d870273da15554a6574c734daa7484b42227ee47415bdba3330a0edbfeb229b3878197871aa7dae771622445588bc56fe654a653f9171fa4b93b4ff53a03652c2a684f2ca9990d6caf379578b4eba9da58c508dd8c276948b5bbbe015d08e3711fccd1a410d8853a3f2463ba13ada4412f9194a86928abce2c0e0635fa57bcb66b4c1657b457d9a1809b1d0482a2b35ff29ef411900059803c19d5bda9b4871fba40b4e3b7831e70e97741c5ca5a1b292dfc5767db1aa52dfd68839018fca156524313bc8bf15fbbafb881be1d98209926b2d845bcccea36416b16467e45daac688a5b241758342d0f778692a63c9c0c57bac21cd2a1424c07c8217a06763c3488c56e859f1b0cb893255361ddf6c34b7166fc1f9d424becc2a372b1d4e6b4edba96423a358625e46024ec90e45f28ec0c6c3fe5041601642e32e4ad50403e0ac7a088de4f04a5a074eaf13e52966c623524e6196b541e5e5f7209bd116b07bbd66e813a9bbca27f42deb237e471ac24d5e5ebac0150f9fe6fed9166c86a9d5547a28be944090da36ed68a5acb52d084370fe66570cf3778cd009dad9ed975074124de0c2c6df076e4d4866f4a3d16b9292df09e0a5bffd747b6635398fbef6d22e59e248ce9ee8244791aa9de1f907afb848d161e9e8ceda90de1ed41395ab62ce56be3e1e9c70e7ef4883b72af83051f03e8509827007282edc49e441be8b5831642285889fdf9ff0ecc2dcfb7f82c1a16d14824a24d920e57a9460c2ceef0919c1d3ad7625332e3226847608e0f70545011eb93130d8630e323323ada24af28fb120dba156618a36d9efc0c09abb3bfe35a05f4a873328a63e6cd49a24ccb0722bbf08a33db1a538c3c28a041e1361bc2840a065c644695b5269e11cb9114318a11a15b12b6010d22e7c9ed019706767d5474f90a49feb4699489854f5398d8b30cbad6458ca4cfc8a293819b0042bf28d5264dea3ba8d606419b723c3590f66152ed808afdf237835ef5e7a89fc901f810d122dbbe4c308baa1092543f004513334e0dee3f6e2d69fd29f2e096c36b081d119c7923ef2d1b84d155ce6740c55d1bf7c34c80f322d0b5e248c33fb0b6f59e6ee702ab9009e7d1638f6c35f3dc66566573e89499648da83863840d4084b9ebe2f55f66c4a04df0c054aa167784ab8b3fa2773a4e7a1cd78daae974116340b1609831b5e919456c46bc2c6c97c6b2c36171f6563c57e01f16b390cb460f5a650cf5d4908642fad4da47d02cadbe95f5c30da514d0709e87f5548c33b818dba636e9f2193e39f880032fdc025b3293968657e8b0ff5d64c8254cc37b9779a03801c606c876297131be02f61a0e055da0a4d6c0b4846e47940636f263c7d2e27a80905b5bd65f7265bca94640a0506c205a305323d1f053cdcf703a1463a4a29d534aa518d6ab5d21ca101a289716147a6dfe18a47d5ab0ead68fedd42f362f000f06ad10160737d0bcdd3c28e2d3a2a1b4e6f7a53080255ffe94ffef4dc2a997650d9500281aac31f31bef428d309481303a4893501bc9351cd205fb743196edf1410ecb659fb7ddcd08b2844d891b3d0e1aff34b221a03acaf2680ffc9cdf547e53ca05b271cabc341d7f425cf86d25726d853b37ae8c26a8c6818991f1fd729ce8f57036d9d429ad8cb9664765cc53866f513bb23ea616a6e90e820b945563266d1c8587466d1cc58f4f76e8734312578e88e5fa98ab61895cbd58e9ba59a57bc5c7b5eb5c713b2dc126ea8456702923e7b2513e809d91e1348739885e90eb3502158c48271b896343fa38f4d910ceb8b1b5aad92d84e9353cab98aadba580d75ab252faf179b979bed05473bf9d94e7e482626ab556c359b594dc1e2c0020710cad4a2d349ca301c588c5aa068d1b12d3a362d50b440d1a2d3ace611823a727d6c89dd1623b745a7c5a76b99dd969f6ad352a4a547b3787ecb122d3d2d417e94b8218729852840d75f64425180c221da579a18c768d77f023b1c332a9960b77febfadc9bc00d90f89d06469f0ac12cfd44dcee16b047c3b02667cab43733e38e42a05bc311077a7369d8a2d363478679e048e3ca8fad6881786190414e95ac8135eda656dad4e0f430e22606cd64cb49c2d06dd9d169e929752d3adc90c7b0d7be7e734321b0f31b076e885bc22dd67b84a51ef5b84d881619da28ed68d8e2a365099d961edd873fb0fda57c3538dd611d4d1a42d7df7a2e134a45319ab0a48f01c4e210c201d42c0c6b0a9b1c7332136a008a924adb400e273b34f85ba0a65927d71f0721d75f8786e996bf26a4a759236701c575ff559066f9139a068468008a668d5c24a6792d2518752d39b5b3d1a29fbcee762bca888c14ec8fc398dea560d1bffe4a9b2b9f4c12d2f5c701e4302b9ec601f4bdc0f298bc88ae789ab50407e318ee76912968624c2305c3d4dc3011fae4a5043bb6e86c1bb7926215db463532cfb01ffd7aa10eb969b64646fb20a12e86bab0deb458715aac2f16b3fa2540816675c82de1865a9cb99920bd61179a73fb4b35373b25609cdbef42dc7ee73941c272ab2457ec61c5fe1138faada10e397677e4865649acf5c0918b00f5eca7889166f5112024aba01fa7e7fbc3f4feab242ba15517aba1d5926675e10cdfd78bcdcb4db366f8a3f4fe2f38cd5275586db8252d9ec21a9c66f1377543432cbc4c58b0cd4209879c78fc9442950da82f7d2904c1e964c4615434a51d4ca1aa54fa1d2d597ad3b367c329ac3f618595e4d752c90414e436afd70d5090c9e4b96068d1a59409656036bdfc3ae430a597dd39573ece957376382dca378226e63032b02ae42cf24f6185398ba4393dea51631de20ec71aabc97116afb971161974a54de91c09798b4ea5b357b1dbc39f57b15387aa279ecbcacf73d5d7be3fa6677a4f637aae7fa7793539353835379688edb7b74fbacd61363f916167b64f27d0045a6791f175a9ce4a61bfc3f1e5e532d6d795b12b1cb91cbb82cd002ec7acf0737b5240babbbbbbe646caa63ff9ca0ee42b4746a2c3487a30929d2bba3537f28e0c83a1653866de2ed579ae1a9c16635cf1f28751dc30929ceb5f51503c177d14cf355fe5a235a5dbd19483ddedd69414cfb55a220a5686990b83614ee1ca644deec80d55125cff4aa35bf178aed5122dfaaf6249704c5a745c38ae9c86b13c0e8303c859fcb79e3f1c33bf8d984ea587dd55cc88163d5c7f14586cc69de11462972558984b91225ddc3695c2eee73a14ecc830d60c0cbb0d837aff961db7dcd2a3bbbb65a74587a169001d00b6e8b4e8b3083d9f05d2d0c45a9c9d40eb2c4f573cfde32a25859b95fa2e77fc1504657a861c328cdb017b6d7b33393c8c3024f7fd73f4f4dbcab873821a0dcd2c266d8a09b875ad52c50c71a7c547b3fafb96d04366744ce3c10741ae823b76f798c39c429a98af627755a3594f9802d61e1676c7613866e1c0824521988503a826c7614c3cd72d23c1818573430ee38f03a8c39112e1730ad8751e9d9dae07c7c891124a595c99d2e24ac956ac742cb0e0b944df8274610a86398532c0aab842666cd169d1910f134cb8de65998d912bc30b64a0c5b0031c9343defeef19db75af0996c6b6298416b15d1df28e5b11d77f82a418bb3890ab435ed008b6b9df64078a9f3be79f5a3e907f11892885d9ed290dbf8dceda7d07fee72c73f4f2e9f3fd23ec4861211876b4777e29a28d9749e7f49928d1b5ec32dfded9835de48b8ec0f0173b2f071072274c9482913bbe30baf3c69cc69a35763d2eac593ecd721cdcf9d448b3fc9980dde08eb4c89d42ee488f8c2fdc080816d530dde86aa0f76c41edc659e6a72e10dea11bed41654f8fecd15e7c7bf43a9a04f96ef2726b36dd68d35c847a692f24d8fe4e8255739006d1242d0a81b40b900e35cbd46817777ebde118f993e7ce1d2c18e74ea02ac49d93fec83571e7733d1cd33fe76baf1b0d87764fe37dd7bd176e34a4f7de0b77f09e1472386ea05949a6f794d2a63d302964a3947650b384e6923bb597b3cc9f34e82916cca2506071fe9c94fec856dcf94d7b448f522868af20fa93fed6d111d7d14a41950cbba02e280d73ec703910e36ec052938eda8e963a19b30143a5bda9a3a74e8a504c22f553ede66a38773e9561d7e2ec30d46c5a9c2f20966ff7de8f2907d874ef7d01620a508002dcf98c4a718cd603bbcc9f8fa2f97067eaa65297391cb522eefcb174c7146b22b83375e78b5de65b2eeca8bd3a5a5ff335ae67522ad25e2291f66a98941fedc6889df9da12b33b472dc89d53e74e1f77f2683d777a6bd484dcf9228d0a41059953fadc4941f99d45d59e1314bc2d483e907c20f930bbdb5266f694d87e1a57d4ea6d61332080ca2b40562e9ff458fe715e59816d3a8c4afad320ed69a8f6a270076d7bd1ef404395d47e476b632322ada381a5affd78e306c74c805d0aa0c5cf13aef312d8c5ff851635ca46e80d1b9153ced99f104572838578897cc99bd9d29f6826dc78a14aeaa7c333363ffeaf616200f1bd01c3c6b3efc54fdc27cbad59ce047fc27fc781a8524a29a5333333f3125e977edd886cee5a4f6cf4be438bd45ecad58e5de87f7245753071821d536e8a8d97176e34cb1f9c71bb5bbb736e96b6e2b3e5e42922f59bdcead4db49a2d73614cc0ecd425f872eec7c990187a1c0a533300ba5479861917e0515c03858a48f92804f1ae000724557fae505f0460c7e45a18d94a71f11eb2fe39bcb5661e953aabd4450cce9d5644a58e5951e8e51d9ba2d9c418204b9c9a146e811211c23e3b216069132743c20538e2948860ebbb829e8fa6f405bd0a86714c4cb310599826408f9112aaf8c00805d8d596c54db9e534e3a3f02973b5648737236cd4b62a9f622924fb3e66b4f8a694f79b61e2b449bdb732b77cefab3ab1cb839cbdc74c6110fae46736298f13ddce06a390ef3d9348b663f9babd16d14ea9877fc6c4e2fd24f8bda8346aca841d20f0b401cd3afb520a4e76a1db604b18bf6293d577b159b66a990dcd9a2f6294254b47fad05ab851d5b1072b591f47355ee04006ce3a935b0f7801adaa7cf9e73720a69f4c0f5f72231cc971797df9a56c30d67917f633a45ddf1c695a420ecb8c5c07933dccd21c3e02ebb4807d80001c4e62c2c2fc82ef24176d946ddcc66124337c3cd9b11c7d2e51929f2662cbbd43023baf339ef01ec2c7334bf76dd755dd749de489b37136e2c398e445fa32107ae87546a48a8fdd5449af44c7bbb37e3d367269d73ce508d524a6734514e8ea6699a26f266449e13ec387beee640f77ace6d58c38484e4cec83f2ecf09563effe6314054472cdb27d5441b6966bce1ce9e5003a2f2cac859c026ff7c66174a676bf5371789b4708845a11388357d090c350db9a1aeeb4e3f42431d8d356be4866645ba8e613537746aef813a641d3b1f38fd09c4a80486dc6b83322a6f89e7d10c95848ac0943e8950b34ea6f0bafe1078798db38ad124ac560239da7347aed1686e5e14ecb43db0fda63fa96e291c29cf94e93aa7e7e25ed33c17f7353b353a0f444a4d4a1958cd4db3a60e4fb3bad7a991cfea51b353e3a35933acc9a931a2c5296b7ad4ecd4dcf45770c481f67873522a7a999e73db46f56ea2cd1f0792fe158fe452be7ea0b6ce7297624d48f6bb16a77d13eb59e652699a802410f57560ca832ba0d8e20b1a78e300a91f5879a7aac392dc7e982ee79c33e5d383d40e2ce77209b984943ef85343b67f943e64287b20848725a59e6be49c3fc7fd0ef72018aa7ea30176e0f4362296d3683c0acaa79e5b4c3d0edffd1f79ae0f5528e10cf4a23c4aa8c3779e0c7c69842a9447e144affad1c9049e5850c67fa0d4ba4ff53df77d8a23914833f571f353d473a51ca542792ec5a954a977147f4e5e9a2ad12ee5c590e2f8081752a045ea25ff529e03555e05ce78f672c88b42e3657c03534f031c7d0adc1e05e44b8166cd86b1093f886f852113ced3e5254929bd499aef79de244d1df33b69f2becdd4974ccf2d9a1ee592a69f2d9a4e27ee74e2508efa1390efe9e44b2853ea4be1e94fc051de5478f2b59ec83f81fef2f428707a2e97713efd89ebf49ae7d271fa185f4532fe24c69f4e31c2a9423b0bcaf812184382a87719c447101f313a26549e5d60557ec6739ecb559e861d57e549def468d831fd7bd1578e4b713f5be44623d18bbe1785fea6d0950ab98e5c3afc4b5f4d9d946fe2b9be5779f65ca94f796e312515ce406fea53a10e2da6fc6c31e56bc91b7ddf9ca43949a4994abd07ce678ff481230ea99f9ec7fd0453cfcd2791e69cefc9f05c3aba9f5f4f5d7baed10c5025051ce5cd55a552ef8ef215081c77dcd4cbb8e8a6461e6e2a1c775c979d09447907539c0a1c714899bea6de14b25c99dec1d49bc0b11e49a5407fd3cbb42b05cacb793a4a4fbd99fade536fa6fb2ec573997cf5b69bfa9a0253d39bb16ffae9cd94de5f4ac94d4a3d28af173d29d7270394408bf463800e006968913e0a94e104c2d059d407feca04451be04b8b2ff4015aa4a14c4a071d112d9c9b4a83363535c4ce374d2f72e64914d67fbebf8d6824128944db084cf9c0f66f221eea48a6b438fa5a1c8d46db735fc1140f2c37f2c18b174f3135516f4d5b9b545229daa48d6db461471b978614ccba0d0f8110a5d4bde79cd329a594524a29a594524a9f524a29a5f44fa2b0f3e94a8bffe3021ddb3036a80fe25ba89009fbfcd3fde59532eda0776b9ad61c0373d6bbd24b2932791c3e958726bf8936d07b11687a1f409cc372ac892497975c8ef5e0dc3a1a792ed38f3c97f752f42ed9fde0e84c5eabf45ca493eb14aa48d5dd73996cbc782b40acffcadddaeb91e722e9d0e2e8a92703df2d54f5dfe0891c0c22bbee47ddcb277c709d9d3b7843bfbf4804de90437445cf3787e892c21bfa5deedba803e56a7b09d6233b44a0f416d07d3df15c3ae4735f6374d2e41db42f024bcf5e8e6dfb9209a84305225520771f79b82d2b901c7d953f0ab91e910d707fae1cf881a8195bd87165f42ba28d962f7b5a94737a406c38576c979aa8bc32c30bdb3f76a928ac7c1b2a3faff4acae33895d663049d77fe65f5ed51b74776f776f6977685c2aa9f4ef07d33dd7942ea794f3b96b9c2abfadc31c5a746d0b477b67286339e8e039780e5a8b8cbc1cc6013f32a759fcc5cdf27cb098c842de2cfedb666538dae91dc1f68fe268ca50d3d1b411ecceed5df6e4e0ce393722b9a120679ac0d8a06e439c36b470b4d246bf505fba30cb7c026c08b873c89d3fcef766605d5c6971b638271275f3667583a387dff3b67946981c98c281f5ef1f85a3aeb2f32dbce185e0849b6b72d9a7093c974bd51dfc9ac50bdb6d2f5b87128c8007cb1ecb3e5dc02efdbf952b605936c4d0f589e2dd784b2c508b5e11769c409e10a3219dda5f4d6a90edf5d7c973ce395b6ea41c1a3354525428a94f468c13d4c954b22624afabdc6813fd6063451a9dde5d104abece7e2759d893203b6eb755b96bad95be454df974e6a05212a9cc3ba46479430c417320d271eed73c029424c87d6245aeb73314fcd587dc69d199c3c641b511dd390eb335cb649e9df322503571862eeaa67734222ad352d7e26c91513aac64816519103b3220742ecb80b8b9fca3cb329b25976536492ebd2cb309dd11a725eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeb3d96c369bcd66b3d96c369bcd66b3d96c36739fcd66b399fb6c369bb9cf6633f7d96cd682e7c268138d7ecca9693f775c52e7f3d3649a5e99166960e5c3100377a7a9095b325519ca48d88b4c6704cc2465ada857b33870bb9363f84d25ef56146a656e9d8d71f266b8018532954eba134f876bfee65d5687b14dce4ff27a1dc98b21460c4f878b7b910cf13bf618e0afbdc97c67b73084324658f953f224d1d0eb78366bb6d87daa82fdbc247a23d178cff3bcae85e9329f55e69393f994f994f994f994f99481a7d3e9747241e69393f994f994f994f994f99485dff77d2e4c97f91cc97cca7cca7cca7cca6aa8a8a8a8cca041e31f04c31ab3460d6f594394f994f994f994f994ad802018d6a8b1b2c2020b2db8305d70c15bba204e97f994f994f994b120ca7cca7cca5a68c105516461696901808d69c386b7b4214e97f994b920ca4416f7ae0aa19282400a022908a420743cbabbbb495158f9ec2f766912303333333333333333333333333333333333333393889088908890889080c0cccccc4c0242123bf8370297221f5a11b42246f0c209960c01830c342c7955fb3d925ba9e8c2fea8a0a5dcbeae457e09981841bcfcb2dd4f5558f9dc74a23ae9dfd759200370e5e7302fcdd22f2fa322eea164977617c661d8f510d5a2a5d4c6a5d767f78bb3b4cf6d0f6f10a159d2172f378b6ecefdc20b12d65fb258b666ad2ebf46a2f34773c10e767063831df49ca8180de173a2e3d1f1f84cf0b1e07301ea07d40f289b51189f13a72a4e54a06c50361d8fd1103e273e273e137c29f852d0f1f852d0f1e878a07e40fdf003ea878e47c7634e1bdd890a948de581958fb2f94ce0acbdc43851493ae0bc3fe06f9a81d6d3dd4f5049e510298b0063760f30dacf705acf0776a441e38a2325b625a49187cb73f665dbb5d876ceca2e4d851dbf3a471cb49efbf505853ab94b77f7d9233333bbbbbb738ea69ddc70d22e12490906d3e9847447e1806af749a93b14964ccada5c42ed1b4e509c6fa2ba6d5c6c5de7f1c89bc17ffec6f4d24d240519f64435164d9512d6a2be9403bc70c30a33ad0a4a7ca02561fdb28f12980c2cbdeca324075b12b62ffb28b9c1d75d86c9c020030d1d8f121f4a98b09ffd2efb28c1b9dd8f0f5bf1831e42f6c43ed506ab71e5cbef5bc161e5be4c82564404d4a5982b3f443d1062e5470bb9ddfd7d6b3a567479880f4df4f6b787f81083dbbdf263ca2086f42085ef3f25af1be3f2901e8cdcd1e5213eb4e08edf1dbfd150e30cb1423ecbdfe47f51c8275c0814c811c110926421822144721c49a2050c809460074a482d58fee7c3437e1880041358b0c510487011821d2f20225394c0a608394462ac78810e8c208512b640426bb4778a6b032b5e4c2c91822b5ca1c5cf18a89bc3f4333bb18590d68e96833b5a2fc88191567525766e5a75f210c96955fa4550ab6a3438e20851e760bf4009b156dd821c698247063101ac55b920825ab5760e4a19dc80a7553b1dc43c11b020c741011401c6ab25b170c10f20ad6a3b07e50f1dc05ab5d439c83d50824f4eab411516ad6aea1c943e6e5e2db90415b19654420a3aad7ad23928655c00b56a8c1eb0569551832bac70f3f115406cf80a20363dac10032470e083900f9d944a35454b35c5ab55535a728aec084e921f2fd8695594203e5610a49a02a5874a7e8a10ad14215e2d0755327cb5aa4a4b5699a4f9275fd8b41c943e49cc88006a559554d2830a433e7454349509d50218c995a18a882bffd59aa4f9377e38d104ac55654c881cf4b4b80930d21e57ce90e680d2892b92106a35a89aa255553a076515433fad3aa37350c2c08757abd2e81ca44161f4b4ea370f90404407943ca8e0c44b909687d60b18acd5a04a8956add139c8834c22c4d35ae91ce4817fa00515465afe0df2902244cb435ea911825fa3468d1a3558e017d20ec94337c745156ea6945d8f9ddd53ba7cbf890d8111243dbb8547f0182174a33002e8721446fcdcb81c451141aef45c5e15962ff5f0a545f9595891bc2da9c31d39f70e8e966871c7e52ac785292dfaa048952fcd92a33045f668b11b46b6fca54e8b9e11cb1a6853e5ac42fe173c6018b9ec0346ac795cf6f942c8adecb9523eb6bfd0b9ecf3c5cde521977dbc805df75c29286cff680b724b250ee54d8b0196cda844ed16463dea981a81000010004315000020180c070462d1703c0f24c5c90714000b7b92406c523495c6c23810032106632086a1004200000618408c718628a34e031f2e31e3bb984030e3c072d23774d7e8dccc340dee1e9f349a369d8c69635a80cf4a699aa0bb3bf928ab6a9df1bc3952f3e43426e8dd997c9655b5ca68de1ce979529a1394ee4ebecbea03e65529cf2d44ac6b6e91a84a9c68b79ce99d2d22d72b8e68b48ab8a85b6bf6a8c4eaca45b8eb6f91b4afb9d3dc41bf9e10e95a7d44d3511a4d3baf7716ba7a53444caa9c266e74d7a18a28ed0f923d159b354b83c3f853d93ad219216cf888dabe28aee90d5d089e47d33b32a75787a209efb24259cd67162ba3c4db040677cda352610f36388f483ae099cded10a586efc832fea0632d7c3d17c28fb9806a82a300dcd5f2a4eb6ff849b32f8d4d601a3c70c5596c0073e6a340d1ceb20df44d27607091d033c6107af0b11b7b2307a0b5fb13b730d599463f5849b30d10545c899710dc42aa6b71848761666b6ef65dc7179f73f0f0dc01995fe6a4bcf60566bce50af85c40bfcd611f1a60d42f9e71f3b76cb50d336b6912214051c75ec1852e02090cf18beaf70aa846be9c57d06a2ce8974a19a3f224bfba79018bb2fb52af8d0e02c6b3c0c5d3f7774f00736e3a012969aa7cf7e809d9119ef257c33430c3c116135c48154088f6f8bfa5b7cc106abbfac360804e67e0643023f2040b2adeca058c29fc2b2384752cf70519adfab7b2a3e5763da8f50a9ca4c832c21219bdc379d28bc96bcc9d0d5185963cb464a9f5e2f31ea8be8872ba0d6e976fb70d9c4aa6fb452eb8ca99064a9cf0bfb0e4f388b75c5bd966eb825770f7f7d3dba0204b810dc36ce625a8cf26b93682f6dee68c14f0ff5fee15954f33fa698e8306d28309e172c841d2f2b96f8b1aa051cfa2dddf0ec88c8fb678d1f2670732e3c75b2a68f4c26b0aefe9326aef7de708c0659cb0fa8a173f3b25317fd432c5cbd79d93181f6959b15b0752282f0dfca00c7a61222c0cbb492efe76486efea0658a96af3b26333ed0b26ab70ea052f66e926ca0da1b2d0fe945e1a2fe3d0041908d8f6d79d1e5676724e347b7546968c2d76912bf6e6e8108d38be9949f0360b8f588b078acd30b2e02259b3fd0925a8947869a33317a8a96d2726e175f3b25377fd42255afe68f672398ecb3f4211b1ad52f2931a410100f9be88936da7ecaf9dd90195e6aa98465e7e4bf9431a2498e56bb6e7a82435f175b50bd6963ef7c1be4840318fedda85d4470e977c3cd79682da1aa3568f92959dd1b6ab98ad1ceadcc661e304d1811ee3b4380f945f50430edee383e058a70e87757f4a0560f078f306a9cdee0fc6c0abb5be49118ead4693fd025c68de8b23b7d34bb41ec76a79f61cf2d62dc883e3bd357b327961d4d9b93aa4f0a7386ce8ee9d3ec136bc7a78da4d727c23c4365e7f469b689a5e3d366d26a409309708b9eb3f2cf55e8908928f84b53242ff1d188c54df98aec2ebe58c21ba95122c03d7a5ce07d46431f0454d4b8376f47a2321f1ae19cd4df11e0ce1b23a2991a25c2dcbb1d9f92b1e8e9ab5c66ca1229d6a9e31180cebb22e23bb528c26265bef67d9bb519d8cb87229893fa2bc2b8f263c46aa6a0886c379be394e6a6bd8ade664537500cdf8af06f6af1088895719dfe2e56f8ca9d579c086bea5884a1b7b5863b04bb30c4cc5e95d852e084e094aad05ecbd1522160ccbdaaa8c1e26db083161df127a4760a5a6867f5174220f02a72d01784edcfc180b70651ef3b9fe084b604eb6e0c1077a7c7f6b1d3e9495918a8e3dcdc2228b8ea75763484323e4fa497ddee518b780cc8868f7641a91d3f347541c49958c24a2a6f84ec0e1624b4d06611a75c0607e2861aa1e2765e9477bd3685a47c7e64bbc4691dc3429bac6a22bf429fc2fac841e3d740041be0a5e01e2527093c4e29cf16603c28457a71ada2068a44030e006c0f6e396d5fd3e25916aca90b3abce5aa1931bd8b8230d3f8fe35a1ef1df4a1bb282067288568ac6efd618953889ca2f4c34dc6d377e94ae2a9af65e2d192573b31ff72570515a31043f7dfe3cd7f0768ea3c3117a01ff11e8815cb38dba52ff55c50ef148df42b515bc2d3a154178e29a46aacce392a8cfc8a1ec112036ef4a95984d3be981981a378f654f409cb015a8777266d00471b21df31802d7c34ab75553730e9f30d4763a098843bbe0412a011f3f7072f1bec3eb73451324cc0774f94adc432975423e34864c396e74e3ca1fbd7ff56b38d2ee5568d78780c1c64f39888f4a1a7fb712fa7548282b214b89c6bd49ca2cf545b038b3a5ea78af8dbe88b9860558bdad84da68a87f2e8118a2004742944db8f83eaa74a7c6b05e57b5594757039752a728ea2aaeb7e42671b2f2395da0d3a6ffc1863a92ba00c028f09aa63d3773d45937f3f125056bcb9315799994e5e2ebedd67fd1be220f0591c86eb43380e26fbd87c077f1e96d08a63bc4d0e76501a06438dc61555c711d1585de79565603ee92039f07914f674bfd80e0eb86bd05f80c77d05673eb45e9782448ff785bd8c8e4c0218fcd95629eb575376babaf8bc58f1e3b3d767cb1f63b27ac698bc3ed959c08dc1549900ea5cd1026c1704b8d68542d61d5728b9870f7fd21028c17c9ff98900e1ca4fe31487d2cf23a858043cc1a9a79c5b297069700bc45d116c08c1fb1ca7112a2f62d9aeaf468467e12e781dc372780f7ce6aee39aed2b9519a590150e01cc1d96539d83523ecf580f5b41754d2abde375e0b40c5b5befdbfe1811bb6227c2b1cef6251650a49c16c16353838e3c0e94a228992c01e76559f5da987b076eb06b6b6d949aafbe9251d494ea063de118a3d6c79a9499d38f987ee066afb03c86a2625e0357c2edfd0762327677ae02993fe00aa2810d4353f29531ba6b596043d2a3dd781d7b3f8aae085043ec223ad647596ebe7b7426df748d7af661bf48dcd10b70b75f7a6d4a8b1e18c8d1d80591e83afebe8072ef682315f1654053cf42fcb5a14c27557f012a17437265153815589827f7d1731347542bf7cf578b24e3d8924559c3544d60f8c3d5cd2b6896016e6be90fb3f237eb682e974abb5f2e22e91b261c0a51a3c521914cc6c7dbb238797d8d85f390b1e8729d18ac534553f9c6bd8d7a501f254c49cf2e6da8460a4d150e61e956c84ebd27e59f86830dac1f968e96e3d93fd21a6270293532e31c60a3bf8a6b2c9656104bd281c7b5172f242987d4811d0c577d1da55f62b1253383a5a232bb530c0d6a553215c01c3869e78eae1248039fe5444a1a7658914338f098b143a702c74aaeb9a71ac6c1b4f9d0b00eaf45063f0aebdb2e677039a0dbf3bbcde1a4a72600dcb9c70fafbc4d61335b0eb6b270e38de54b68ba79e0128dc0c1aca266e3c2b5bf81e67653054a448ed3ad70afb668324aeb2c57316aae3aaaf923f53b677450dea0ab49ee1c182143fed092cbc47cdf83d0704f4ef48bfbfe6bea022832551bec0c9b36970f9dd0f453d7d33cf0d3bb1de46719a6829dc619f26ad0a47bea403132d2536a31e51dab5929ec2f7b53b162ce29164dbe4d2a01acef2c0afa70603d400c67971f55cfd4c995aa68ddec1465e1c1a76b884570e70c48c6dd4e17e5c9c1e0d21ce08401356e564fcdf61afc4a2098fa119bb38a6648f2a0131100105d588fe835a592e229d6e8666479d8c5adc16b6183aa8ad9befc406cd6150dc24ccb4f7ab1821ebdb885e3d853903383319d372a359d3ef6d4828d4a74a7ac90f90d2672bb63cf120c131f6a60d889b8c29b26d3d9b24c000cf9ace997be685077fbbe6eb3d1439669fe631784b7ec08fc03d841d9c99d205d07af5162cc7568cc4d9472e338249b445d461c3a2f658b3d35fad1e2d7206932bca078a260cb57175d4d995fc784967a93567848427c0c55e7a53a1a2b30b3e8f03144546eda55f012c0acc45d411c70fed59eef0193f09fba7b7f0da00db194330842b6a02a314845105ef887620309cf018c7731a8514e95d94278213a332f16ef910e453ba436455c7562f4cadfca604e54dabfdb855d532006f715965184ecd941c467cd4c735f38577eca3732473079fd030c8539b7b945e697657a561f08127daf4655cffe00a58a98ef215cd9771be1acd60103b5b33500e7536567952259637bf994e348bce59d41ad94eb3c28a5dc9f239b34f22949d68159bfaf8ac951266ddb773336f39e2d47258d9e76b6202dfccf1b34e22d0d2eecf85266788f5d36220f4ed34a7e1b30ac8e7082c20392508f82e5e818c946924249d42fee873f1a363f2397a9387d0530d5af0a26b18cc12d4b50abdd60ba427435418e9197e6c90aa7840e2b753782d9ca6f985e1a0292429e102c968895b87678fd277de94452ce1135d9951f40506b3e65f42c6d8c3b64177e71d2ad975ed2d37eb86eb9c5c796697feb57c52204ff902c1c40f486467787d8666b2d070eb7d6e22ef2181884f1618a61aa58a438662cb66855c9b94a0e44b33df4b4a62ab3d2529a3b82052929ef12a3a9b4c54f8ea025ae8ee18b47fa5c4575df080a91598b3a72e9c3c74383ff2f69b8d289c79853284049b4f4f00d236445957bcbbd1610cc13161c2805447b364df445fc7c031150852d6b8fb2e682278e11b7e99164a7c8a3418ae5ca87f08e90280b10180e7dcdeaf32d6052b37a89ec0a306b73147cbe321c0dfd174cf2bed047977fa8cd5fb48a13ff09904b70344b50ace1e957da194254dfafdd32e148c6578092a3cf506494733af283b52f597acbe233bc313c63e2090f19780c39a2d88555440659645b348a232f62166c52d684ff64ea17f971c2e9fdd77e14fabfa6e14da1b112484d489334652f1b85765b1477d91c1c71597639e09d6f2b2e89f83a9881a5033686ade38f237add885f826405305c3dc25e07cf5199181abb3f0fb1e9186c236789f5841af5d07f4b03ffdeb05d1402e52982da4201fbd2eec6272a0802834132def7138eda42fe26f3a4025d1e155fcfc155c5a19d3f50e95c73bdef2ffff519417b75b1ab4535f028554516ef05afacf0fa66d68d9d01d33c3b800a5f0bc06cd942435d9677d6f2a1520b18dc1c73b810e9096c38b0efff803310604655b47235a1f2f24059ce4c0df5015ab69f118d5e2131fbc7333aca0da622b7e374242d16dc28c47740e78c512e1e888ac64324c999493cbff0927c27b324b7483a57cd05b84454d3295f213784af491243d6312a6633a95820f8fe6ef5acdcf84055dfbe6f9812600e6c0e7dc3fbe0bc75f03f5f309e0a1854b4a2bde0c9dea61864a813b3035ed2102d548a1c25f46d2a52839e284de746a5f1b1841121f644d971d691d9150ed62f08007f8c4e6f5b9ebd07b932a348951ade9b065a0eded31adf1e682541d0a7ebb5c52b231f8558fe7cfac6d2e55834d0ed47ba52c2e63a433cfb69dda8a2a6e1831ab1cc2d11295b5a516a7b6b58b01a423f89e1362f4f54b0105940468dc3ce6c4ac76e7f4463bbb4acfd2cab8b482a61c5e55a57727b0f1f46b317dbb76ebc27ca681a1fdf786ae9ab109323a5b8a46b5541efd919414c5fe96b8643f1d038b425430aceb31590857d693b764d644d52db68baafb32eed472eae29734b45a1b6848761a2574c5cc8a243e7963b9ed9e8d99041c427969453484b95b41184a18d4ddb7391aaae249ec63879915310e032e920c781bdfb2614c57ede439e751ee94a97be4e430f2b52acbba386ee6b6528df855b6c15099ab3e6bd023e806ff9f76a2a13045b020298f5c3f1779e6f8fa96048ca59e1dbd9456c5f026fb73896f0804b1891fdd8deef6a62f3162624f52381bf20b202842cfde19f63c460e1ef8912c8567a0672a9969ea7cffae08ecad186a9832ee9e64960372b5e4cb3e25abe19a6c51bd24c6fca3448c29b9d7a52075343604fa8d7e71bcfe877b3de34a6ea299ccc4138266eb46897c48b337b4451ae796dc6afe8e1ec1eae07227c29980236dfd2caa838e126d804a5461caef39dbf92e1007c4455fbd0d6b0158ebd17e438074ad71c6c9028bd892892c87a27aaa2360b67b22f89145f7de11c516161a56abb1cd93f04544413d3198a8a0f14962aa4858ed112b22e1e763148e84c50429b37e93036dbfb157f70189be47ecece2629c20e7bd023c1e30fa75598d57b8b27837f985f2abfc451f4125ffd3194d37633ccff5885050161a3c444ea791f04eba41f9959d23c11e87bb2992970cd2bdeb025daa7b50cd4680433f468f71fc66051132063d4e0793a62190ca7479162e42e47f63d5773d3249f1ed41af15ed771732f920355a8cfe755765d57f0c6af2d07a8eb03e2c3b2a992431394d1493a92267166681b31131958f4af93ab16f8700153c5046470580b43dfc7d9df737564f9a2ca9b1204687b7675cac03898c9327913c28fddbc8d75ee193cf57cd77161b22423090263fb58a223b373ff7251096a0d4edf2491418d985c1324516653c3ca76b9433cbecb2b8560cdf6cb1e913aa342069a033f19b0ad79b986409059c4e790849662834dd5c30c23a65679e03525a26b2758a02300cf2b5c22b5247df973f667a7f3023bf29ecfb879462c7801c4fb6d425a06cb1d6efb49262ba7a0d61b773e109b7137cecc0abf20a7b806942ae647c408e161546cf9f24f209b33fddeb3271ab65e017d9a2143ed61e4ae0483b8952128cc8e0c1647c45049bd68c4f58d0d63b66f4f324c1add144f20a39094c90e16e285bfd4f46a23a6727681157e41f2e30a8e0b87c1211e82ba3486c887e034a2f6f109a049baec014e8bdd85c11a00def503a0e098279d49289124e73436e85a0c670001b089e228885d8823eedb82184dffd299893ea921c3f9cfeecc35328b553751e6751e63f552d55c0793891e56b4311b51914c3b3c7cb0c83655c08e216da33af90aa083fc9da4b10f0364ddc17a73e3e41a3ecc4aa30aeab415eb5f6bd3670d42e4ab0570295b388da791f5783cb75822e13c14d716a2f70928d03e807c5f7091490b1b855d67b944d9f54546477ce233b5da8fbd3c66a6a2006ad9049a4f740e0ab4a3dc21ec748eaf3d32a67a5f8e1df655ee0c482b2bffb7a9a64bf793316bcfba681dbd1669bfb4174bfc0433540c6c02fdf902a7820be9846460db2ebb068732d62ff92b798d05c5c3154488431f700e36f25de8aa89e57134394aa1bfea12e3e80c2e7a858831131bf12ccdeca99433e54ccd79f30b29c203c43d79b4245debea7082b90e3d08b9438bfc5d3e7d48bbdde22dc44c500f8885dbebd5bc3201bf5a3b0c0104be7e594188b9f7f0917d13ce5dc27fcef11aaa188a62e064f556e52322ffa8de38909480fc23251021475883f258290498e26820a2471c7eeeefda6489664a653124c092f5a6b1133333fc0ef2e71b8223974608e46cca842b84f8adff3a90eb734019a25a48d0146fed2db5a3023465fdb0d68822b2f7fdc19d8a6a210d48ffbb4d0948c6c340b8c4ac2e04dde0dfa53596eb661dd660db917453dc2a40a94506c665d145c54de91561308cd4d5f0f0ca291db6709a00036f166158397a243d3087740d11f2c5df876ec4e98804c631a040985c122d8711cbaa7ccdc9028164448716d6c6ea26777aaf710ae9935b2f78ca060e75a0b09a772cd10862f0e87228d3ccedcd10a9aaeabe46f643122fe1cb5ff058de6e8017c0f347f2c860550acb9d301fb508c7bfb0bebcacc88e1c9a75635ed8a2b768af694fe8e975ea3f2436f8d8459bf9ae027af4f916b5bcfd0d155127be8c5583f0b425d8cd40688d44a6b840c4963fabedaaf66058f8c1e29f5d9c008031ae5d0cdde501789ca5ace86b57f7db00ab8916cf2f03e73ca46cb3a221ce0c9481533dcbdb0eadcdde140daa354e41185ea9e232a1a71118a6d9cc1ddb1b15ca5917b58c5039f7d55ae8c1d5089b1726d5a0bd8b58282b2af88db6d2660c4f195bfd3151c55733b3681d8b0a6da3a5562a8ef08c64a0e692da883d036e2ad824ba88ef01533a3ce8f2970653ee130ccda28f12a3d01e95c4e3d7686d68a7bf9f7bf730a9d4ca85f4a009850b0ffc8800cdac2b1df933c3c71e847ed53e64269ff8c64afa5ec275b4c7baf9646ee90799dee5f3f5c826460201091e502cf1dc10d2b98c43f92dceaaebc85d08847837b6d18fc16f47f86a8992c69ec2b52cc00b8e26da346ddf10efa6abb21d4f167024e14cbbcbc91f417166884dab227f4f9d1763c4546906df10154126967bc480f06468eb629f3c44219a8156ef41c2c20dc426ab4432503cf6486a82da21b3cf9664be5c13314464f645f1822a2c3c5ec57fa320dc16b877b656fd29e20405e1dfba57155dae3f10094771432151fc10d51181f20deb47b28812e4101bec9701cd8c5f1f459f557a47a03b0cfdaa4a9cf3ba5a54fabee3d4dc4639a0ef9744d9dcbcaca5dc47d13b917180adfd41e0b3726ede9646197b151ae997d9d9c5051787bae57b736e6ae3cecf59d0dced18c39d4bfcbb1906dd601e5fd4d310e488b3d18cfa793c5eecb2601330e7b9979e7206d6f52c39fdfeb0772f2a1ee469e46225a94c16bae89a57760c3f901bf77ba4719e771740c1d0e2358a1526fb294f9fa8b6684b929fae33511fe5d95cceb89c813a3169d2159dc0a4bd2e320a04cb9b2a5933a0d7f163949be04c24b9ba63e8c284f6bc454649d49f0e3c74b764017d5038e68f0efc33edbdce8ac92aade83cccc4f84ede21f64bd87832f05076c5b00347356f5b91ab5587537d458f42d04b8be9bf01e731da143431a7e1019f304d42719afdd0a873b85631c9ed47d4c45077f2e54e34f9a2f54361b1cdc2851081c7010fd8f68a904d82e09b04ffa3102a9957b24e0154da119d7285fd5de9f92ca14a950f5acc419a0e41777668333cd3e3cb739b044df4d78113cab6f2f59d9b5bab287a0d1a011b2594e2d9064d912a0f37fe3f49c4a2b469df8e61426feee783be36bbf208053b9b2a82fe51026029164aaa90f0857a08c3d41c275f5e85430a0133b2e2547199efcfc11714a456181daaae21d164a22924f6411cb78fcd6a881807ecd789cd9e03b2b1c734bd64256ad40f920861cfb5a901f275928cd1bc103d8d4329d9fe25f1b222ad0b5a655bcf414a9c2858ac6fc791e8f3a8e2a994b7131ad8ec883b19e2bbb3391860860046d7785bc922a8299c206f487a414f5752b8e4cd71d122132151f33e00698c0e05cdc131f41eb3b631828320d8c650b6dcf4cb8cefbd581f8a880fb2165813e5f44cae09a1dee551ef8516bda6c78d4674b27c30b2960639b333e1d25bb0f3394d09e7c8f25c99ec82388921e84cd08a3ceb8086f45931070f103b6e8be10203ec2928dfdcf012d32b9b7a9c097a87bf308a1ff3ca77bc0a3440839e842ff7d66acd0fed1a35286335f1b2ed63a6bc64ac1746fca5699a3d4778e087074e38e1831f3e70e10b07fe70c02da0746368982d67f8c015288a1b9f06f072a1a00574ce3d1c78c01bd07383f489d58744f3381295050366e5b71e7003a8259f9300b65e1826fa7372356a40fcdf5cc38ed9849be9dce34f477278a356a6d17fb41daea5cb9e339e83b02b4272c3145d47db061a4af443ae2001dc30bf8fee644e0aaceb33088fa32c8c2004cc17ba2219ddc34a46b4457b3a08a7360001160070bb812242e9a994bb38ea07c2323b8c4ada72f0990925a5f713d8804948a5f696009b980d593a2f12da94f9215afaed2d0137dd038e7710d0e626c03501a2cccd099d32b004ade13e375024fdda8a8b407bde25fd86b44c61823e3ea4a4a3ff94ab1589806ef3c3345310ec3b387ea579a5d05f467c81955f3906d7c1963ea5a3709a310fccb25541abc54898f0c499c7eed956a7258d99f15cafa0704dc6e874887fa3b90a19a5163fd2c59dece7b6bbf6a0ae915edd1205f18b21ab4d7e92727420b8249e645ca8c891b928f60c3f9a066a445ee1d45dc72f85034ccb0c0c776ca176aa6e904b8c46057733f2e796710af348be2d7190f6441ab2fe71ccb4506b0f76294a4326175d966e9a5985371d56e5c97994535949a35ddc05c15a50e3ddf8d0cb4e7ad163eb1323defc69c8ec67d8e31f424a83867f483544fde18b326690367340c5c69e5e6a44b430cbeed48cb8b8a0e6cdbaa4ef715b0740458538223cd77fe94ab4faec5bbf5db8561b3084ab9a72d4684be20a81f6f92467bd40d18d4bbea5447c67e8747be5787575aa0c917ca9f3382f5feda3521a3d0adeff49b1f7793dfb1fe53aabb0228e90b1518370ca8abb0458d43d3718d0d9643fafa8b614094ee848035d368152b1ad8b783c3f0c2b210d2b705eca2cc55157ce304bbcf90751eeb6937eaa009aa79c15a724c5a2a834070b4e5810ca0f7d1d71fd701f26144abeab6de176c6817a2080cf43924febbc47135180a80284f90cb0e643f2de651f1506b76b2fd8b1a90abdd76dbb42148fcbe8de62df1ef2cda8b01058d852a0c84b510f3d284efa5af5c1ed2fe68487f80ca8de381f1d659ff6976ac9e9caea3a79aa910800a26e3be0c9456aa3aacd44b6f21cec45c21327829b68f3c95c8572197858ac6a95b6aa4bf5df2089d587dfbb5599c70a33f00b2701946bcd5513cff10ad525fcdfc98c9f0394252a86dffe5b43702f42ab6d0fc94cbd5ba9f642654579b53dd7abb836e6e97207cf7e4f25f487a40923ebd70c81a3b08fba4535e3452e7307c17e793a86207659943e97991889c154bb119bf70afd4fe06be5b7acaeb7d563372d6c94ae1e3382c08274aa2b910c14ea5d5f447cd1b0e2c97868fa49949079ea4492176be767ccf7705e5c1115674a8eadbd43abecb4a53e973d4d96e058ec5558cf6147fb8660ea4b5ebb04e3fa08792739fdc0950ae310bbe5b5122e851480528a03bd514d99edbda82bbae342c407c87d6e2de1686edf152b064d5237c130908b705ace2baf0c24c95644a89cf8b226a5f07bb5de8696a19bb7f85b5039679e296d7f9b5f48c536a566584a7acebe8556f010d4e5f3bce0ded012aad11baa8c9c4aa68d97598124a9fca80ffbd5f0c6e94f473fb8dec9e529046a87d634832ae28b7d8f1c1d4b8a35505aa576d63c0da6e924474c7d635e2e3516653101a64cb2c6abe9142508337e4f14bd0d16d45ecc5d3b0bbef111dcc0edb6e25f8c4afd5934370adc3de9c517132fa28a89bd15141432ac5529bd82e2d7b14ef0bf51946f05e55704d18a84679fd8b2f464648f5141110e731653b7a4148730e0269a1cc789851f354e6f2a282220655947c97717440e810492a93f70d41d486f707a7382b6caa4c1a483448c1561e1ea35ed844805e516815035012c672de7bf7437bfb40a0a3d38ae3fb9b4e4a1aba0dc906b1be28b9e40701594bb3db50c04c55d3e851d9cf797f28e44d355bdfa0f5341697ff134fcd9b4d212534109118f7e09658090247676b021cbbfa9c8294c2050abacd9da534159552ded8a84ed13b21f8197b3e2a728514436992e3989f22967670b79256483392a471451df02e48d55e31551ce04e714dcfb0129b4c36daa1f248a9fa298c0642b4aec64f1a25c3df67ce7598b6f41a2f4398da52af8e032ae91949f3584d42ec1cd667a8140a411bedd7dc2e2ac94da3fecd3f30a0e354131dd25fd994500804528002a7eb367fa909a94f2cd18a3c079db275f714ead7b450cfdcc3e91498acdbe17cba7d27e59348b2be9f8fa021555b9723aaadacb287c0918b5bd33ab7dc79c4e3b252b9bb4cbf44ac352db7b36400372a2a0b6ff277cc790cd5974a4d8dc8275387a6741869604b403647c2a8a24317c9436592718f610c0f781f48cf9c2b4324f25023d3f4a857612457634961fde1b2ed2be11dc12053fa1f4485942523751f8a0ab70d4e1b6ff579b7bffef7289156e0e44adaaf547b5b487680979b99dcd9abfdbe139944b297b1b0ebde0b66351958c11a9a6843e5590b60a85b3e1fa820c073e274abc944a8688dacfcf1ff3166faae4bd56217b20da305174a3d97162f997a07cd054599619cd4261d58ca43cd78fb46b87b5d18a0a4bffa47f5c58234ddb8c3bc85a37a403427ecd5c5e63d92c85d395d55da0b91ecc20addef0b3c003c6d2837299a696abe027f73b0efce3d150c029d15f5c6fc1fa5e8a499d5d403d498a6cd18fdc0f273b7be27e6ad846c5ee66ae6008e918150520cb07e7971d9bb06416848f763661a7e4f17a1f56020c3d951fd7871e9f04ec7658944fb88090ad38fa9ce08716ba909db8806e0c1719249d515158d5c142a556da3592ada9d9e84d2d29ffcc65518ae64989028683c3ff2f2021f32972854ffb2b33c5a61b7b3f280b95bd6392cd9eca62f49ca47a6bcb94b1103f1488121c5da270b2bc043f0cee0d1b40c9ef3be537f6ae30d783943716aafcd5959fdee36feca70c2fb5c36a770b011c20989f4831ff98647e9eb246e0d1ec6db69f6ffb6be711cdc11a96b1c477b3533770d3c6a4b0ca6fdeb0741abc73cc678b610838fe6241c5c1f6aeaa08d770c34a8d378ed91b715377847bf04c4b8f745d5406ab821ed35544e30d6012f4fa037e1a3cf741c0e7219b34cac84cd3463250958960350e8135a99c53fdee4c88749d9f1341496a0e6907435b2e6a9e625bd0d1d72a53cf79c75ea9cd01dc7f19d7e1fc6b839ec377bcf8916cb016b2cb08eb63179cfd2889422c1e91a996ddb2f7b354317347ee12c69f4889f008b5228a8d7b1ea2b96c91be4362489a503dfd26d4f0dcd0c16bfe03e7f9869873a3bbfb7f59a4ead32ecd3847f47ae93968f77029d3f01798f142fc10b69ea7392f94ce80d1a15cec11f5e3c04ad57cb2822842e4faf10a0231e4bf6237a14a30d81fe85d966217df74d8e3ff6f7c484d6cc561d140560f4d858fe194d45b546c00bf740f45f03a2bd0df042f286f6d5840a5605243c962f0ced10b156596a0aad801029c4b650835d047032f9aca6c8a96925795a1695c6bc10dcf2a793ac04068c190b08779c4bde7f59ab42991935dd33f8dd20cd8fd28d2e5d5d682d6fc1957350365d5a86bb3a465735b37d444c4fbb6e3cc55c765a71cf25508ece51ba0afe5f71ad9a840deee283259d728a98f6c1d4d79c5b4a98084e1dbb5e7db77af73f61fe61a9f3b9ec1ee62d4709bf75bb6a879b96de88807a07dae21f489757d0a3c74693f23726a9c7880a4622c3b230879369cfd03d0f3c0a36dc989671e5d896aff869ed75006f00d69dc1bce0dea8174c6d964e00c0656797a08cd6bc8ee0509cf3d1640439383d2677e2becc18306df0a98ec5d577213eca5715a252c59ecee0e3cb78d7bdfac601e5356fe6bf9638ce3a2b25d207a5e7ce60cf85d1894f4b702c7c62beb643cdfaaf436a386abed7c105bbb8ab95d42257331ba104161bfe9440cadd303f57b38d2e3c01662618177b0001dbc3708667041a66ce7203b69d7fa1ae0790e336e66bf36a7654155150aba25a2984bd6e172a8eb7400d47776fc04d06db450adf606bf1351dc30fdb3088d5a7d96527752f70605466412186fb87ca7804f36970f52180626622b77d506dffd14b3ef8404f8bc43f46cea1d055f7056d4ef788becdac15d6a72fce816ae4d055072af8ae57f84f0550a2c458574aae783c7cbae92627273220e35d7fe4d40c5a71d92bd977697e3de7adc21c55de5c7fa23e83835727d250a793779ca55444823fc73944c53bdea3779c2f772e981ccfb4f59b7cb02a7b6f938146291bdd7921a7c1c5bc845b2fbd4000a85f8bf70318fdce5224b518814d4896ac762015e50d2a24a348bea2472cfaaac3e0daac2d31811399c45314983c80f0f3e8f660be7e21d4dc75498d039183f377e968ac23da49b94f767d0b4ac4e0bd3b3a7f2c1358a4bfc561175d22d6af4535e88287af6f16a6f925cd5571bbfc1fa6b21a5dc9c66455de8ab46414ea02e4ee5b60d74ae0490e0d1c52d4034a9cbbaed861e79770d8742cfe70d84fa2644bb19b7b89846afd3a892da5ec1a94955408ad7bbc9bc8524713c07da22db7b71a564ad6353e5fab431eeb11eb137e29f94906c446f50abba6f98e8670f3498bc905c6c8e1f18122dc21053681c3c5e89b5aad5cd3cf3ef9375a2678b82a20b50e1b49b7f810a44b03f0c941c38f19c22531c53b680b380d0114d0e2b8d87bdada1715792143251c8154ae9e21f12c3871c4436f8be5a77e279cd909518114b644765462e1103a5ca98037ab00f532cca9a182b60faeaa247d6a0e8f3cf8b34613f2c18fc2325b18134cc1f1f5e28be12549654af7a18527735fb8bbd3e0939855680c1e994f68fdd4c0225e85e4d9e7eeff6e5b5a1d770982c48c9927147b0141010fad0aaac0dc04064659487d135e41802d53b4be90bf67b0dbaee904d4e843129f7889a1d0b4aa6e2e8e9a0e9e3b821c8d5502a0a7dd5fa0d2819afbf99584b2b9a8519b7fa93da6289a2ba836a0528f9b32493e9d10ea1604f0a1de457e1790ddf73bb1c4cb2909219c802c01deb42942585192890f9c8baadc0500ac377075aff682e3240590d1cb17766b0f12788e6a37f37514e64eab74843cc434b4b25a0ac71915d19e54bad30d1455b718e00c81ae4cd856b95f6db98b627d0a440e3d5280f4281fb5460e8c1cebb1c414607d2dbc2a6a0b729a5fda6713c4014ac430c162480a3a882b3e80215383ea7e0f8cbe99c1b670026183b5664c5df61a3a702128366aa2c808e7ec1e4257ff534f502a31740127e6a8c0894febca2fe8c120a80373b8621393b089225c8eb7d591cf3c4c31370a887820943a3166c573ddb28ccd55cb4e12f54f95419b0c239934fedb27d855628b2913b1df18141b3302696692c5651ca7f19b1d027c66d3c151bdc2d8a1fab24a38f8a56b527d30a5952ca19b01847a67c13e14f1c2fadab6ee2fcd76032c9fd760f85f284216027269f1809577e9c0904801797660282eaf5ddf7924c211b691d618f37530e167f35f7cfb49ec6b099f6e2b013cee58387289e000b1082ddb0e55fe73fb6ba67e998231c72ace8dc69787de768669bd63c4b8afd1f78cb9cd7b62e55e99fb55eff12f9a9b9e7fee74562e701b1f484b8c3cb9a71f5f1185017cd8c5f20085c219be41382d15c0daf95707a0ed1dcad35d1d39d2016ddda6845cf65dd1f12d67d94e50fc55820192237e965fddbe99536a116564c049b624de954738d6eb263116b7f1ace5e42dbb3ca7d59aee9bcb593fc82f124d71d40c67c6e2114a36aa5f30a0a7770f2a76b6dc57d33cb07f925c8b315598cc1a44c2c73d14ebeab397ec4cc7a8d5c07bcde6825ff04c16b68a18f382068946f4bbdfe7fa01d0f1d2aaf0fc6d87a9c3530a42e56084a7c9c6f9fc06fa9eec03820699611d02eb6c86ad3ff7ba49f9b332a1169b4ca228833a9ab5bc483d5559030d9911e881496be5d8ec46e9ce6dd15ecb21f0bf03c8834da74150168640c04d0b04d1a97605aa448fb1f6a8c22a865384bcd448abf5d28476e9b128f0b231a7aad1ab8c11bebb42ccae248471c5a508b3b7a144d2ba0899119adeca308a4447ebdfbd34eccf05e58ed21dbdf4a1cd28fdf89e5aef915d202c322cb934b301b2867065d7f4278b638b054caa6b86ef95245450f25bad8b7f799c0914d41666a604ebc4095ef750f6495306004301d1bbaa45b9fae81d8953db5375c5bdd7d624f662235e6bad32146de7e1f7a5fff54da2c993267b34bd421dc09bcbc5891f701673a3931da824767e01d5ed6eca4b48f601438e11d945440111c9376deacc9e8bf329cee39da99c848ff7bc396dba75e2e637bfd1e6b01ea26854f6395dafc6b95c0f7f0eb0135fb1bddd2b50da247632bf576e069353cb3f7b24930d2daa569943eac8ab835d5c592cd6334a20edb6006e859d0eeb9bae3d0a0b274e93aa83f70d8019d45b61a1976244f2552bc3a184a27cc0d76c4e012677278b952a56d02e44b1007b28a3b9340fd5da16556d8b44e926c128558fde052cf96189e1e1388f918c8a25030f8736a1d8f2c0d1883c2400a4ef3ee49e644c3b9193161338d870752ae882d1729554af3fadc32d94505a8c0662f7f096e185d8ccb52639da83cac4d9ba533f6d08e9fcb02ec43367a4d02cf85e5711ad014039ad51675166746f8a98ce185eda814b671c5d86cecb5e74ca26e5187ca61c07fb5498b0c688396a658996eda0e236f71b4bc5205d8a92ac3acea5333281c55dc1609614645369a9ce9d324fa3d59d4b4ae00ed238e8bec94b59f68cc145dcf04c88571d823325339f4ef73219ce0dfdb94b4f12bc6051ea6f462b0b36a1a3f402314a7b8d6d2fe2102bb4910fc7e91f83a46c8e5c5c7ba4e680c5d57638f258ebfd8691585ff65f38f5381aaa720b67f932b7713c65ac3f983dcbc157f0b75820029d08bae36f2a08971d901fd95f3833f17d6856eaacfff5383f02d0841bad17964e4f51cb6105e4abf51c88ac5db172effd57cb5dcee3f3ff4a3553c082a3f3772854e320043eb0f422047a6305236b7a65bbbd9b4f440070a7ed0475f5bf87c7ba4cc0ddf74af590026286e65ee88ea7525b77fa400012c955ff063414d7c60ecdcda376a9d9ff51fbef9e680f5db2092aa0a8813be75ff54f4bc06957f9de4d69b41f37c1aaedcd02ccae289029c915b51f407f1b9dba1bfc2a633644fbfb1a688477d7e27bbb0616b3953cbbedd3acb44a437ba1b59bbfd8332950db4aed939edcf2897a60631ed3131693aa2975a3ccfa49c471230b50688843ec9576d8918730f94f6876eeb8cfffb1f6acda46d93d4e24351a9e417bd0baaf495d6058d9fc53b57ec3b4ce8ad8714b943762bb3be6c4fe374906378792baab7fd56c93b1c8cf1968c815a49e97cda2cb91ab262313fee141ab33603f748a0b8e7d8f12a5451eced9205e5fb7862b383984ac85bc31fa8ee5db1dccb77fe7ee0a2358c8d8e8f792f6464864ddd67cf73bbdb12aa847dad65c34e7303259cd92786cde1ee64202ac68adb536ec373238761b016a37931eda3210c3e165e45ff4cb77eee87c35425e1beebf754005ca91ac3cfc538e90fb2afbf18a90513e6949af44c562d309ecfbfd7d93215e2c43321cdc23a925ce333110c745954204b87e8470821fc7067c2bec0d6ad7fff6889d3d347c78890dda2b2348a94d23d18ba83b8aaf15d1503550a240532ba32e5c0a100dbaf10563a9a038749dec531d39bbe524fa33e1455a8a8cc1dc4cc89fd103a91fc80a00ddd479778a68aed203e3b0629fe690aea304454e884c6b1335699114fb0e9282f65704ce7b79d9a50d54d18b8cb182b9443c1a0d5cd0eb329b69e534f4dca524bb6e0b47a20ccf1ad5a8d00f87f9c259918c4dbcd2d3c5b8a407fe0aff2918e2a4b8282eed4ba906e7b724d65f38cd401dba3b28627973f4f52ab68e1a013295ee7256a3d25f57f331f06562d43ab34c374020baeb80f3b84f0d4710bd63fde7c0ed90b34e9690e89bf0adab6f38e48f8a7d3d4f039e003188b188536649c39df8479af495ad5e0559632454f6109df1299c4c2d88a4cea9eb008be4f5bf211229af2a232fd09fef8a955c3576d33c361ab632af975c7aa6d6f42a6f6a0b218c75cdb1449f7daba5c26e6bff316789c47de60b3e372326501ca63b5c6f4012ad88963e4ec05464439ee94806f1a844ae0fd7e5bb80d119a89d155dcbaf38f9ebc0b2ba7ecca6362f9d3acf2f0c8234615a85cf13430b18794da24bd13c6ae4f18ba59a44012100adc48798a5ed29a1d7c979149f8534e654a286a88ecb5191c9cf261cd93804f89c996cc188a6db2b8f47ed45ecaf13dd345ace61190d0654764b67b8bd1a2a0126c3659d49be8d81de9b58a102d40bedb01c60c3d40600b90898e03113b27df3bfcc45006129964499fa9c372dcfbe21bdc2887f65ae69283fc4ec29b9909ab9021d724258e1df54ff323b2d619d195f582a7a6ff43aabe97c41447c976d17c5447fc61174bca71eb56bebc97a122d1be581787acc4efe53a6db6cd2a8080e388e91fb1d70ec37e25014b8909811e64cc3cd5000544e8074bb9ce5566531b1027a43bba2d113d65580bbbd6db1695a999017fff0e087ce0fecb3bb3087ee59931b16062f71cff7c7412c357705c262d10a5b37cbb041401ba95a0eaf2ffeb9e47686dbabb9f0490967deeb51f6f192b9269d98e31c0ef93af5acdd0d308363b300c59cd8c6ac5ab80848bef98e688ad30f50b7e05aa83068c1f935a966d3478f71a2cfd6dc4d44bf56c51dbed89262627001f54f758bfa22cea46a1733370beb547f0166003b05c6f82c327209303207770a222eb6b5f706287ed6fb59b4c1ed01c60165f39863f886e6f73cd4d924bc4f38fa589eacd63b6fc2cf92da3888d3cfb7c512c218d0ea77e3e009a2c51256efdfac9df4a777ae302d313148649f4044e681bd285ce400f9263c5b6b1498b1d5bd25fa5c3193097e010eef06f01a9cd49990f5ab50da1d5fd8f2746af5d139db88313ff2ec4711626e04139ad79d77cd5115d1d1ba36ae6f88d695fe77be482777a1c47549c3c75bc14367e190033e85a6630df9e292cc7958d71ef056e14a58fcadf4959132a59c39690123a13aeb42099bc15c55a8b91f6ca27f83c4bd82fad63f74fc2e01bf4f6799d92f8eb3b5489f03ec5a0279973d2182832a9d3c8bb1414c533a1c0493fcd250ceb8ba35a3a31f0f0b4f9608d2017d7931c328f1d267df66d439081781c1ca6e7335a077f768eafa2f23333369f77691e5fbc57be5543b5f1611237bd9ac88568edb93fd2059a28e98099cf6029067ace9433c37e23f6c03b31d326abbb4a6888430e9c2ca3af84d61c6c4b6cdbbf9fd3e9fa13e003a357724713cc16d308a1fe1abc223f2243a42f06461accb89572e3da538b7b96f9ac257b0f7082c5724c67e0331fccde90014b4830ecc340d77fa7618a2488205af011a95fb2eb05fa2c00bacff897fb0ab80eb98e279c9096e2d5079ac793c3211bc87c785a1a6b75231f95e33c0259541e4b1f291f5b0160d6aeeb8e41c78bf002cd574ef8d560ed9c77de8e01cb24bbade2e3002c59255f86640d01c1c5a7e82729ba68d9b336f3b220ec641d2334ccd4612e3477e4be42297dac1eb63fc4cefe1a1ad01cf4d564c05ef4b72011174a1e8cbec01dca56517d3f43648d21a48059d6cf87c44e59e1fd02d636b0e4c6002138008539bf297e31a9be69dcd59b0d22c7886ccb46fc37e70caf646cadd63132f7b5db00ee9bf210ebad1d111c4e9127884fae601dc22f1f01f72b211f6d59bba304e9afb74803f1d52f8d260245294bb414e8343b003e31531e6508b8b193097bf9bb1bd65f5c5b5a87d1fec2cebb38f35b455291b45999aa37338d2618fe3f6a72349873119f38d930ad51011dae129bf69eb3906fcfca1200a3ef462929129856f7a986695d5d9a5042262a7bfe1c53392bbebebe478cfee89c3c072380dbaa8f80c01339867e9bfeb469f305312bdb7375217648736ed8809d7714320a2c14ef79941f5e081d2f72e5a89d4b43b2df9168366d9c0bb89c33b6b0332aeb6f3e23a43c43a14cb09c980158e36365008af1e9e7dd6906971de676c9bdae26db678dc28890738c42d73a696a42573aa5f93a84a3ecc98a0e63037b31aa8f4e115d9e742593199151465c36382025f663b94f88da3dfa5b2c604a0568dcf770ac29aaa58c666e0ca81719a86b064ad169d4dc1e28ae9345d6a2c1fd173dfe97d974f94e2eca20e4a6ea200e4bdaf900ee842474f16c600d61dbe6ce1f316414a0f4ef035c6dd7eff361b4838b48281010f4aaf5da57e9f00142779cc0ee39f53132d40b206c9d46aad17e41b238fed2f09189139412c1e2c0fd90c1f4bfd452235e06fcf2e871973dd1e9673ecaf7de49382c39b230b5360eac8f29c8dc40f9bb1789eb32ebea17b9becbc9b9492bd0b0fcf7e6fa31a738505a7e07b77ede6e0d539403bac85b3d8352eda947028a0ed668366a908331b36dfae564a652ae3690d03c5db0b61239669e0d419b4d5fc90c6824b4145615175ba504cdb90876196042b9aea6fd1cd7364a0c97ad49080294b702faf32d695c2052b2da1c034a82f14b0eb5f1fbacefcabc572e535bf0b4d36e442301facaa39a59beb8ee091023c0867b9a8b2c6156081160022000b0aaa3a3a3a38148d8be73f7f83e4fbcc7cc6efb3db95ffeb35a2cfdb2bb5776776f29a594297006a806b406f7de7befcdf7cb0784b8445d08bb8f9f00ebcc1e1debba27e65df979654f0ad6711d81d0fb3aee42c7bd00882de058aca6e31d9ec0047af4d014485140dc79950a95ebb9df7e797d0a90f044165970f9de2392be761dd771e17baf2b89e35c155cee9fbd38a736e7e1c0e33aef0375288ee466697131e5dc818eeb97132a3503461523b39ae1a549c3a251c346cbc6b5f5cf73c426fe9acc39c7c4d979dcfd60fa5a1b5ddf1a5d631a47d3756776ed955d7fbc6b5087325d8b315d8faaae4998aef78cae59525db7a0ba763179e67febd6f0a25f4c5d9f5cba46b5749d62e97ac6ee1a4635761d23b3d25dcff0afebd2ebdaecbaa6e1ba66d1c05dd7b85ddb08bdf2612d1be739de135fdacde1f1fe6f3ecfae46d71e8daebf1097ac0e6291010f4bdd00a4e95a9b5d8765d722ef7a9ce99a5c75bd65ba6689e9ba45d5b50b4cd7a6195dbfa4ba3ea1ba469dba4e85b87ce95e89c306b608e41d8171e95ad5d2750c4bd732bbeb15d9f5ccd83517bb2ec3ae4ddd350dd835ebeb9a86d7758dae6b1b5cd767eeba85bb16e1760d00dbf58df02b1f86cbdaf559736e8bd37527648e47083a76753f3e10e327f8c9fe3c500bb131364d5b7f5e2876b8c34ebc4e1c31461ab9cfa3755b1c399231d73981831bd8a049139c895c4103d20a29a4b837735492b82bf98a2d829c015905d984f4b9395cf7530a8142dd7e36ef374682afad4622b44e171ac619e31b4406477620b26dd8c70f0d125215a42a48177ba0fe32a797c0a56fa97ee92c0f715cae82748732c76113c648405ce6b2793ae167bf36081f3a5a653eb2557771b22b089096969652a21335898db9ce83795d0a9631be41f69e91b36ef9c5b8f3b83bc4b34b9d5de2ecd20d62d92078efe5b4023eeee12cf2f0385afb676ed33b7a229e4c0890aa23ff10c4043e570898eb38fc5901229165df90acf3b8d775dc139798e7dd7b71d7718eb3e24e67ee21378acee32ef696ba256ee9ee70add5620724242424a498540eb84a4771749baab2cfa9465423babbc4dda5dbb159ffda2b3097b98b3d2c1ec9e618fb6a48230debd075dc86aeefc51eb703ca65de71b4766e9bde111215dd81fae3af73fb1a27e5f6c092a796523a26a4b0020b3b68bb7254c7752e9db36cef0f90bc232472c9ae9ca422bb6e7c3a33f87f421be36a7e487655329b4206a414bbf22451c4000a212447c8274827504dcca8b52ec1806462571eb4c40b8c2891840b90208becca49a0933c42845a2b12d902d2089205e40ac822c81f92080184a40a4670dd3b8200ba245ce77da08d0d8794209b1229a34fd06cf4b917cbf46c56182ef107bb4dd45abd544ceb9008ad33c562fa1c90163313da457e6ece795bb29be3f1f8d3f2fcc3e3a4604f1f90767358a0d158983d0dec02ece2699996639673cee37168feb4fcecdeb37053a9bd6f0b02ff75fc81af5fee7d0b739acc2db64079afbdf7de5b1f1c3913b47146a48aa881e688a3a3a3a323ae5352529a559f749687ee1017cfc9b5562f97a9a3326aadf8e4e7fda2d6ca75625a39b3e5474c714ec1d191d275d52052e20c67eeb9f681714a5929756142acb53c9c404949899c5d1f2cdb888fe57564209ee765993db390a313dc2633d9098c00c271f8047787cfff18c81121109c6f6eb0d2b5d696e0e22e5fcccd3a205f0ddfa31c5c7c319781e413e37b649384e41e450d8240f4f7f1daf1ea7de0e76d132b914aa338ce4225d0e620bc9a933299ae1024915df90f517383e3382ebb00d0ebe7a8d5d53517922820879032f204a4106410a41032080904f903e943fa409a80ec8104526b55227920772075207bc81cc81f6409481e1207f206d207195baab51e5d514a1a02d2915119ae2071492a05a915889fa467bab773f86ddd48ddec138b5d71f581b82405444a264bc9421e78b64a32c638e79c6bc696e4cf735076220be5247976f30f0eadcdcff63596873cd4809dc73b50a6bfd979dd76b99283ca9c24cfecc9240fdd964dbf661682229627bf2d972b3c28dba06d468157c61884d1ca586524631c634c47208c628c3f188b462aa30fc630c6db38650463fcc2e5ca48347a31f6609432dac62e461e8c3b18a38c3a1873307231d65c92c62d462dc62c4628e393118bd1c948db957f0e97ab336a39d2020353094c3c2d485a909870e041b5f776383ba1752ebfde715de33097b9ebacbbb0bc09476deb833573a110dc0d5de5d813773a90e585db2483e934869f38c3cee51df8e1fb29a5b00228049310254107bb10638cefffbea6094230b9f66af1d3a1e5893008930f972b3d55ac60adb565d66b3d41a93695d7af9a351ae508a5f480d7f3d80d51a9c1cde2bcacf8d3be7c8c58d29bf3faa16589574f4b919bf3f2d11245528b90c5b93932519b8eb2a429133d3bca92beb0a448a43aca92822ce9109634d532eb351bd1094ad5e1fa624ab7fc3b41e996571357eb288e9e9aeb49e972127319a545375b94d205c59e28d345e344bcae342ab23aa96cdda2386ac551220ab8731c2c81585c97403458345627a25a8d62345833d0b03be61d192cb4af51d9681dc5e123e56d2ca72971f4e088dd9691157b9aa5ebe62272d9bec6557341f1a25b7e22aa3a5c4e9e9c8838d34523b2d191c662b338985f99caa651a1f91aba2d8b8bb05110d04f96a1d8e8071dbeda4ecd9465b9c355c977f99295af9eaf295f43dea7bf74f8978fe7e943404a7ea03062a287b69ab9157d8deb076fe302420e5c3c177107a884117780ca5be60e964025ff4a209699b287c364382eaa3abe28d526b5389fcd9e551ee7f3e2cf176c7473be1b92cf0181be157473c01f30c89e79c9e3804d881cb5393936fa6a55c758836ac3c251db65ccd50d8a8dbaaab72a5fa8f2c5e4353b952fa12855c74bc9db7c5ebc92d82cce0b8a3fed6b49b7fce58b72e352de7cb79bf3f2f12da01ba3fe73736ec6f8561337454116e7268c20d40609f42ca2db213f74ab43b7bce5bbf9749a8be6825283aac395c5db6c61a2b6a3630db6f98a713236baba95b7af19cb7255645b966b530d63a7647629d3af59ba68b715a574d96ecb725eba6eb765b9493cc1a67ba6aba4b257a5371353ceacca87f55b726259bfa6f299b0a4113b73755bd508712c0696402bae5732e5b611aec01268867f33e66a25c3e556b85aad64646456e9ea1693ca82bb11ae6abe0078abaec45e787ac95cce1bf3dc712f2f2671476553d970c69ccad63372d9c5a5a5a5856587ab9bb8b32a127746da958dbad0d5ad5beeb2591c74a4754b83527345b138a80c37a8f39186cb57c7e5167c51b67eccaa7c980c4e4cdba0b21518f2e08c063963d3777406674120b6e30b46bf65eedad6fb168f2c5f63392e5f49ec06fd965fafe2ce26635b8b7de867a19cad5f9effb3179fd3993d2c11955a3b337c7b72d6ecb62e1ff2685c8d9cb251ee27dbec59eb2ddbecf913c4fdb450b2b08213b19b1392707373e3068b15b3b7f8dadb381b17241111bff75efb2a15ae0bfd8772d8a8352c8d7ff4de7b2fa6c9265776dc9bf956a08c8e095522cc38834cfdffffffffffb7e0977b5d4c26979796130b6aa7c819238ca80a63b40cb8fa663cde959c9969f0ffffffdbffffb7f1ff6f4d5ddc7befadffff0ca8b39cb92bdc959c2b115c5961d63e4ce3fa76e4ea15decdc979d7b7b08a028e063de87ab6cb7bd6da277c2439c2840fa01d6aacd85eff263e88e0a6f810d229f191830fb1a330c498c1fefa37897de1f16cb17f9358ad23b2c9fe4d625634891d09c2e29c6c53ff26b1158cb1c3fe4d62426411e301ca52195014fdd8a1ad88adb398627f35880110aa294b2ee062e908219688f49bb3c332590262079409291859caa1236293fd995c31da57a8f460f26ed861171e125bc4c2b6777f2657a8f082d8a8fe4cae24d1017145054faef0c0e560874b5f6cdd9f8992958eeede84d294bd992845e101dca92e05bb8506606c172450f60c151ca12444b7826deacf44e9062edd6210bc16dc9ed8a7fe4c92b0e81c5092143e9282b88caf0929acb0535cb760d3f60d0909090909e9e8e8e8e8e828c925c92529a5836f5cfdbc43b0d7440b41604114194001830c274f4bc2c6c318586871c4154fc29916622401c41325a42f9cd84af0c3e409181841e20745309b3e395d2cba1b1d128ac0a1292609887efb3349f2219c6da1f59f580439aac31a56148f231f6bedfa0b43fe85a6d61cd466e5386fc7bd32ec5434ac170c9d45d2f273ac155bd1dcd64ad395a35de7709ed9ba45b55ae41417bb72276ace15631c7a3a4c0de18d4fc6703966d99d77ba18779e0ef32a9c71c1a6530a4626b41897b8d435eca95b212ed19af29deccaff7900ac4d7585258ed00a60042f089f174e69f21e88c8095346785527a441a3468d1a356ad030cb1c97a398678ededcb1e55a2d1144104104115a66c95114d77b4920c05f0e97406a4100f184b3db1270017ec78ede0530c208238c3082006cd4b8b9f75ffffad7bffef5374f8345b377421450482124b3484185f073a2421004204009259450420904b0050879ece83d5c0166802d33406882b8f326eca486d8f584300128a4d0dab2aa80d410bb3eaf07c03c300fcc03f3c03cf001b008ad2eec810161cd39b7f0fff76d0fd1cb71fc7228ce7ffbdb7e17103220c4373e27b6012104c49d164207847f6b3077210c7b7831982b395886e92ee44a0cd35ec89517a6bf902b2d4c8361b6fcf24ee4a1818ef92d51967e3928aab07b0cb883e96ecc5c05cc2d5acdedb9802cda46b6916d840c830cc3078bc16556e2cc569126979fb185857f1e3202f290ffe030982f46a552a95435956a6545857b8a90fd0044079a154aa06022d652a65fd3b3b2524bd394872510e7b97c197d0d0e109c1e9cd86d25d9d316dd6ca92e81785433433882e11c2cf90f170c86cf844124858acfd758286436981995e9b205ad64826ae14cc933c3a2e16692d99270a895432be613e46e72a86bc94ad7173fc294c721e55f33a6cbe693e45c72cec2242ce7502b87569096cf1d1a2287cea1ee1c1a6ac9ca18f28634433457d0d0583eb07a5832d61029d4e9e5d3ac1f9a2b688668682c1f583dac2158b2140d0d45433bd1d05e68681f0d4dd3d0583f6068b3996e64188227a3d3105031d4142821d410ea0a9b13e5a98da2d53ad369082723540c35054a0875056a68062a9642c550a8d809157b41c5503114addf4c2632d4a08c4f68ba6c36d32de683298d60ae4ba05548728fe846a506845b5a25bce2deab94c8f6badd1691ed6b5e52a844b9599c17175e10759fb1a6024238d6ee5813c7daae8db5b1e6c5d74821b2a7cd469a48d32d2c814aae4b2093832590aae431628229d32a464882664b4e2f9f366a194acd728c52b3d56c44b75a9528a9c57971f1a77dfdbc7a8c6eceab0824b2a09bf3fa61c90bc8cce2bc74a075cb4f462f2c464a588c8c983042c268b70cf59816f3e553b3d56e3559f6428a4f4fcc95644f237bda7413994c972db599b15b7a33a9804a1e9640260863a6e98e99a54bc952bbd57ed231de4686c307470f0e1e1c317b5a3eb3d3af71dd5c4455d2aac325c58bd456b3dd6eb5d0c44562f4184bcc4ab5e263f92af235b2af5921f133e4873f85f49a132b9440c184cc7673d96258cc978f6db5d225d08a83644cd9c361301fd177fba87c5f0a2e01160185c0283498423738832957566ccbf2555a3d95c9e523faa87cb7cf24ea96b7b07c29b804180528a4bff44bbf54fcd29d92a90c9c8de6cb27b5a5b5d44a5a4b5532fd8aa94ce93202551c26e6a68a8929674cb13357a93d5534627409a4e2a10aa6dcb7a53265565654375b9ade6c44b7a25b4d25231393a6351bd1ada8161323eeacac286194aac49db196c4465db634add9886e45350084aa1ba14a8335a14ae585aaf261614c299640311c8c493bba4ac9a28dba6c2e1c43f75197adf6462e5bb7fc8b29bddb4aaddc6c697ab311dd8a6eb5d4cacd96a6371bd1ade8564badd46c695ab311dd8a6aa9959a2d4d6b36a25b518d255d59196bb634add9886e4535afe3b2aa7c188c4fcabaf0044986b19f6bf2de7b31bef8e2b7b4229c58101db8a8dae02a7f5a9e75781c9cdad3d270a19b537a267f9e8db0382d3c2cfc791662715027fe3c17f13a30f7000b32d0916c0c9f303ec7b8e8cfb193cfc14648be65398a87fa73ace47372d06dd9bc0427e9cf31148fb3f99bf8bbf0cf431f476d741e2332fc398dd7f1d5be7e0e913fe7accff1b55a8bf12a8fb49decbd70270f68c5abbc7c241dcda090a57a86f42fa698b8d507da308f1e4d8963b1128886e7f275fb9a57d2cbe895be8aec69a3d4686009c4b3e23f3c9849a55bfe0ae36d2c4d8ac57fb86032dce4028a131d74fb8a7d8d65c998b50eb60ab2d19a9fcbefac07f59a9f6e7db05b5a582cb3e431f90f0fc6c3f383c36cf01f2e580d4ee354e20c3a9bf84ea1b38c336dc55a38e8db52595a3d3544f0add36c94ae2c7e04cb6b94ae2d1e87e5344a97937fd5ec4953bad2dbb2a6e9a23d0ecb57b7f154e26ce20cfa4e254ea1b38c33bd393763b470286ac52cce4d1841a7101242fc14623985ba53a8d5534304d710d9b7c8bead912bd2d2726fc9d2efc735cd8c6609cd102b07568ce5c30aa28299917a1159b2b30848b384664633c4ca8115630561f9a8688660688666d00ca56886449a2196ec2c029e455c4ca6fbe9ebe2a241fe9dd2539593110a092a0835432df9b3f2188edaa8387aa23cb55143aa28e277a85395537a3242214105a196a066312723d5c908e66434e364943a19f5212723d450b79ca58a22aaa2a0f80edbbd883ba84e571105f0d3a68bd6a1f08f49dcc12f220bf92514c92e531ac11c2c814a5dce30030dbbb7709653ed14e5d40538d25453bea5b2dd13913d4d416d4e9e5add4e451e14eba2d953c8ae3528b4af39d5aa8e9793b7e9e214e5f5a45b0ed6baf5898d34d594d39413d137d2f448bb238d1c69236da43df91a276f63392ef28ab2e9a27d0d1f62a3fbe5e524ee743ca32ac625108b8325100dfef11841754b4b4b302333d0b0bbe697c57263a1c292b62cf1adca6b4b6d116a89e2cfcaeb8c9aaa2f01fafb635d8ec16de0635b0e5363fb9b94c0a75715baec65afcb994b7da00929b8529c4b7de017721cf7852608c3240d7edf0f5ef792030f8f33d933e9c99702cb63e301527936e05d0006196ab0381fefbc0f9f980b45fd759e8ece0f711d1e9e3314330fb99c73a835df6139adb305826cfb23b7dc029fe3bb57c2107a4bdbb4f7056cd10b3d1bad3c369e9e189e54cae33ad77a99d78ebf600b4d9bd7a3675e5f041d067bda0bbc60e3522a117b5a71a79a55080c35f478e102326cc0721a6ccdcf57b039a97ba343c20e134e6bed598598a857abe6def36dd21eff920324e820ffdac1171f7690afb1fc05888d7e0dad417abc50837c8e3fff851e2e78e90e6b5e0f1774d8681552855499c9eb61cf9ef3e4b6f6e70c2c76f5667f7132b7bc7afc997c6c871eebcf7cbad02fafb907ce9f5fe0fd9a18fb58a2e327ebc65bcff24bc20d7aa33f7f34c55997870558fd6205641e21b8e676b9f8cd3139cfaebdf2e7b77acf5f01d58c0173b0c7f0a687abc5d5e26a31ce5c6e72c3948ec366062a06fb2dff0261e15db839aa5bf99b23785e9f5753752bc7a6ea3e8ce3942b746257a1f9e3e4e0592c1633e266b33aabefb0b6569e8c6d0a7d8e39be797f13cafb87977b39e78c4bde2f117c73b95f47e6b686d5a6e6fcf7e6d09e26bced6969c8fd9af0e753a721f76b61e091d02f9f8183db799ee7e112958184ee558f7b9ec73dcff34cb4ebb814118e7b13fd59fe37d190db9e893ec7f58a2f17d9660ee5fdde9b4d6b9acc7d4729ee35e16cda1974f095e11ca297e3ec6d0f8754e61ce7893c6ec73ba7c2b07979f4cc562ff470e7ddfa7d4de578e69acb9e4756f10036f48beab0bf787634f7f2898d39164f387b9f0177197250d7dcb5b93ec771dc76ce4421a0bb0a6ebb0a99d5dcf634cde0d6d0041bdda99d32e5d4de3bb54d40e067d95bee718a2d033893019c756bbdc86f31aeb8e28a2bae18e35ab9d501cee11539ef9e3326d36de24c933d2fcff75e0e55fdd7d4fe72a770e21b9233c647f91372a4e4debfff373923ddfff7c840fa81c6b2a29bf9cd1808877393afc91cc7407f8f7befbd7fffc87d4f0c24bc71c903f36bee1ee4ffffffffff33be3b705e77f150c759cbcd34be52dc1424d5227deffd4a92d9d4b3f1dbfbf5724bb338cf2fbeddde77726d4f141f2299fd2962da2026bae7c389f76557a448d6538378e0aa4cb7b19bd341b12dcba3f410f91475567e7a97d473cc06bdd9d1ae88591d94df3d9bc3e9d8d6d9ed79c3e6e8d49be7d5b49fdb568c14fb46c7e6dcf84cb043fb195711d47d1e151dfd2a58377e867a3770736acf6d7d5eacfec83ab3ca8c763de16bec1055b04efec4b5c25611f32ba260fbe53068cc31c89fc3b0811a38fe241fd11f8ae9e8355157b79d3943ed288b2cc7d2e463d718510222d72609540fa830cd2b4c9b3d214ce43d18c6a3f90f0f561fc7c7c3b2c2acd8028689e60f1c4898e61646821d6dfee3f8b8fa4afac7a99041ef54782aaa4de1eae8b85ce7c9539f92ee71ce86297aa7c22be91dd71834bf1bf61c8fb0aacf673b1ee87f9cffdc63cfe7d66e81af12fa9fe7e7977b8cb1c6188cdff94dd472ccb5b5b6e3d0147adf9e5cb54be867a1a4d7edad3cc76aadb5d6ca2d149bd3f9dcd8e7a099ff671886a1c581b59767293e7a149bd3f97c8e5a2794049a681764e533d1ae4851f763893aead94e16c56a251988253a2afe20fa9442494564e38c93e99dcfcd09896ccbf22299959f6e93bab5224f172402e984c06ef6d2b119da9a803eddf2fc77446de89e80201843e61dd79e89dad0bb328b982459c0f27ef7facf4a7eabd6ccb92e73382300a342115f5b45548db133c9f18b41c72591ea76057e311d7fcfe331781cf3ea710c7a36f4cee68b6fcf2158e23fcbf0cfccbdccdf8643adce5c8db133bfda25d129cefb40cd796b4618ee70002894a2990a4d740606fa35fd19d2d0efe71ac27a53ed757f2f974a79cfb32df1558117784a78a154e92ad002284698e440c40eac140049d6c4901d5c19e2080a40230a70b3103fbc507a6e08224ca2c2464b3d908e4e0f9c104166a0f3c3bb1dee0f9d1f254a38741eaba756b07d4f1efddad35296f31d41b822e551d1fadffbb735c7e3226ed0e50e06e3b0e5bb5f9ecbcec22e0cc3324c73612e3998e6ba6e847d7da2ffe6741dec069b46a8340c9a0d82c866060040010923170000181008854362b12489b23452d40314800e618a4e66523e964763c12487511044418c418610430821c610620843aaec06016041993d38a45abba2e1b8e19360cb62331aa998d841ccb3799860bff838f543aca47115e69b4530a6aaf28b22132156e48ab54ce8fe69a1764a7b7281ef1c450f424d061f1b572ae538d56c227646a8a378e1a1c42454d77830422c3c469d31853cf84f7053efa54bfb96eff75a565d8cc2d3281a0d891d31382f152a7e6ef2e39eabbacdc786e2634739e1d2a72cc9c3045322f908e5e778e2b305da34dd311a7a3283b3e77b45d12e491db06343a228893f6155c3da0d56266becee846706541a7fc09406a62730a9d58b777e0041bbfa013b085e04b49ec17c65efcc211432863bab9b07ce1a64581b8673b003ac4d7344c7106b9105999b2cf565c0eee8c884134548364925e4333169c9f31b5604e2a55c2433ce1be8700f959e8dee72d2963bd039ee41b86116cf416c947172b1e22bb73857996ed6becfe6abff1c09dc0ed75b6c81e245c701fcb18dc6e2caa451fdd447b2e08f0db4128b30c3eda03544753f8d4dccfc488514f575a1d4dbe29bfa04eea9741eeb407cd0f6a39ef76ee8ae8774b5a3354cdd16d278b807e989441c4e3ce74566b2b9fcd06c632d376b50d1d9260792d730e648b626a0f49a6b60eaddcbcb7cd81e8e6449d4d732e626408da0aaea1fade30298f4bd8acebacbcf13660f50d553600116a150b3fa92299bb78d854be3983434b3d78191446c68b1cfc4165663f1f517428b706681c4ce42803c160a02c82677530424623cd576ed70ab24de84bb50e86441713723f4779742a8696c395a0933492f3b709fcdc0ac28c20491d7a5ad3b097dd09394f70316c6ee2015f37f7c7b694f610b1e88f13b1e461a1090b7859a83a363f9b3c35721c315f51856d1e68619fff10ff4fbcc6965648bb588f6f9d74c351436ddaa4081079fb745da8ed0b17118853857ed9c0a983d9600aeab22814a3b26246f3ef3079b12e81c744b156f75772cf313d2a23730af3abb8e7b2c938669ff1861d192f8e5b0e38854a7b142f9fe0d89514a6fbf0b07424a399e2b52a8eae1f2c78e5cfa2cf350f112e8af9b0f174a27ae46b795c316022831b4abc4580d8de05827fb682a0f083b39602e2066d07583d529000db418e74a838ed868d6cce5c3de830e70414201e9f4d934dc33a6d01b8287105ec0565ab1b426149e42c294041e6bb9e3c20f552c5a5885c6fcc6695d3d1201e8688fee6483865b619182747f970357ff7304e6f78b2f0e65a40ed47d83d38dae4e02e10720f0b5b5449d22a6fcab32f95018e900981415fa424039a01a3167d3cbd5167ebad0a1d531180bd6b6e8a0856615e45c0e5cc60612dc980bd9da25bdc9c443e1e48e64bc8b1cc88df1239ab518e1f609d9ce7009657bec0d76c17d1ce0b799cde7253b0bb512ee33fa724a1c3a95742856a233fea98d8213e821551425a63cb618409a7bf92dead217e225f75dd3054de9a2b9d3d551fad818715062c03584898131cb7a4654c38010afe5863f8256d7cce9992023e15b1dff72e5be6c6534ea50b4783f11d4a00f2f2229ef4c90a2c10856cc1b224089e79041f4678e8bcf4682890c6aedb89dee64c1d1386065c7627cb7ef46f11173e9004643be490f1499756f6ab536b41902b980da1651f279c2441693849399b8cbdbe092840355c675837ab9ad01c5c46f2307a97374684923f1db7ea22f23484a12aecf4db89e16a993ff7c8b0f5349c211679e069c8fc138c4f2460d60a5f1159c9b4e3db0990c9231270fbcbc3a52e3df5fb13dff4ac3d4553437ff64ceeb5fb514a2ebf0957d3a95902322e99fd88453c873396663f942319d2464adecda76dcc3f569b7c8e68da7fde8aacff45816bf955b88bcbda0cc62657ce84303e009bcad467c2c777400aa5ac8e374caca61249a93510ac8831b70ac97e9c5943ef348934bab9789dd3f3ac894f6f45bd10f47572c81ed841c8118a104c4180407e627b0cfd1dd959371d0fe3056a92a1a1bffdd991318301ed02c54aed58c1b78fa771e86dd619975834acf1f94b4332f479070c21ee063a29e88d8940cca5d3410310834f7b0cb9078d1c0b93fd8873d82812d40d9c4a22d5e252be0557aff0adb3f5829390799072ce08397da85100ecb4d93f301ed557d6dce1b87b4f919aadef751f882a1f061aae4b3a4cba90e29a50d10d61bb0f03e9fcf19dfe4b9c7dc23d86f930abbf2f58e26a05b26ba4294c6024d1a6969c7b8986fdce96119a7e6a1aafc7a5cf09c3573b3bcf71c10ee2981aed7654d80352c4983ae6140840c1d01a1004fbcd7fa4c9663ec3deb6eb0c7fbdbc72d20553856bb7a2a3279918e2e8450994f086a88e63d08283705976d1bfbfdd642b189c00f20cc85227a55f9c6705cab45d4ab2ef7acc48494262860345cf1cca2d14691479cf1fac4c85795381eaf9971cd9314beaa8de0f88cbeba0649cbe1da40c3d6cdb24b4782b1fbc9dcefef85e12ff459889bf6c9b116b7477083f23d77d447070fedfb41412ef6dc56204b98fff07b1f158e9a5b6371174c0a44eaddabf852672e5b2c47db500d510413a93064943495015cf95d5f2ac09da88955b51511deacbef0dd1b64ec5ccef9d7cc93777685358688fd427899df16e82203dd7521ed028147cf14c0afa78db788a4c9387e1a959d10f13ab17611516a50d547199b5bb59f927ab76d006dbba49cd86293ade87a482c278b6eed7c2f4e9e30301991a972577b3ae098c5fe77c5899bbb470f0c1c6cb122255b6c7d97f7a1f421e20696cbf9d4c10d6f790dbb61c96030c36db082c77a24d85b2d0fc5e608efb05a6ecb04f95bb0480272ce4c257086d1097c0a5d1ddd65722c784b5ce36b30d4b7bc29d7902048f01878d3094bd5182ce43c45c4f91580b4786858cb45f9809b3b73f9579987263e916db21205223d7ce027ae118032cf09c3e6f021dd42463f01a8ac6aa8d6d51bec0e8ad9e959b5adbc608e6f9bee1bfe7c5d862e42b91d9dba95dbd20b5daf8d63d2661db1d245e3507d183cbaf6a2642aae36695ebb5af13532dad2c2396299371ee8a5e8bd268e14827ba61817bf1cbef4b87e882663f90ce1771caa94385c0c774d63462cd84906d0567969c212ebc8efd7b03ecb77e4ddf35dc3d821afe8494c6652b694bc018b9f40ce2295032e6b148fce7c1cc31e59de5ed66b981efbcfe6955017bbe3fc427ef66d377489ad8cbf2c6f3c9ca0d306f0d9908ee342cc12b62bd8576ab710804df67ca5d3dc45edf01f3b94ee0afbc03121013a6f1300e693ef65e6ea16807f478a9ad8d4ec60111d605a4ed88f2eece20802237219032bf5f73da60e70d97639d2f386563daac52812e05249daa276aa7405141233eb6b330687ffcd3b06d9af62df1ea0d8252496c811d0a048f431d4274ea8a5057aa881a9f66e39cc5b8953dd696b17b6317fc53672163a9b6d47888eaa42b412531f73e8791890c279c1c4c94e27c9c774f85708ac991e8025b80d91815ca2884c65eb3eb1a87b36449c39c0ecb9ba29d4c8ae6b6d076fa2ba9d6d76fb912dbe81e5d7869bf6caf31e8106c0df1bba580aba5c09bb938c55ec6cb378606286a02e89944093761813c75df8c7277bb49a7e477f6914103e8a87bce75476b24c0227a83a7ad3f0e9eb57c76b339ea7b59a1bea296d024d234e19006dc8e314e1fb964c7d89796051e9af24f70a27d7ba2c2731b8d299a044136a6e7731128a397ab1bee07786214e9a17601be52841dfb0e23a92fb9df539a0663844f826c74dac97341676b04b9a295a1cd7c007abbc1518d239f5af10ab51082fa8de7d6e784082c151f01bcd89330578737506e582522e972cce0c1bd263d91539465065d82d83d77aebc77eb36c26e5a309281f09232780ac0c122a201fd60ffde0bd7a02aadabf87cc589640232b16f27f05a60b4f2ea64813052fc88c2d94a9791cfc830d9340a5312c887d83b925952c7069a35fdf4a8e699113eb38255e5ecec321522e534485d91b1151beb61f2d7e48807262773862eb004aa81e19150359570c2135e342127c4c1e31af5c4537ccbb3085b73cf843923e2c1226dbb3ad1b8acebb90955c0e3eb8fe5701af006d7c9f172f5a7bf08611d78c3d2928bc077c8560cfe8cddccd7da356e1d564e2a2ee651b7e235ad39e5d5946f6dabbbc815284be42d9fac7595e510d662a6b7409c929c7b425e11212a7a3a5f4b684a46f10ef0c884ca5e851ca0af904bb428634c51a08f74f80b0a74442b9e812a0fabb216ba16b5a16c109c795cb10689e6633e60e4e01a5f34e8c30e88227212aabc0b37111668d7c2821f5f9f6b912b3857411d7f7df98ee102a055dd55abc242600e4bbbde019cbb9bc06bcf44220d924a0e3a39103591af0d03bd00a3f25b5bb804bf20fdee6d285c7d3ef1516678c431888c24835f0081af01c208843786c6f4c8f02beb0e7935a1c97cdca599a4711e0751c33c091ee55cb7f4a397caa04f0e34c697dcc53a1a662eb8524dd4bc611f6952566bcc013577c98b0fee02962c19b5cd221e0b689dc3433df162de781d5b1820de7eb50c717c2cfeb7e4039541e12f8f81aceace3625768da4496522094a0383e6b18e04624f95540e97e45e7973ea0b2624b6f1d585bb5676bd8a3a7eddbe2bab3f36f8f5431eeb20a15c8f15e39aafa872f206fe47ddc19f16d6dfe11a294ae0334cbf7b5708e5cc6809b4e10795876b765f43278127e3e56a5d1264ed56efb19c904f08f7edebe219ee0886a34676214ceabf5aeb4c63acd9ff99dca80bfc6b97225c9881006fc7d91ae16889582ef68bb0c4b011033a58fb9a0fc48530f96fb6d1f4778cc9f3cc587de5b03322dfb8cbc3db4e47abb3510464fb3811b4c253d69c74ff6cdf4fb1bf4c3dc731396b8f99bf6874ba834ebe8dff9638fb448309f6caa798c7523de2560507860f67c1230b068209e0c781dbc1c7d9afc4a87d6cfa30d91764d140919f60dba3c780d5e44ffc9546864e28f2cba699858ac7607ce0427de21147f915fc20caa4556d4e07bb4ad3a6277481ffc57d80723796c06bdb4683d4b6b0c62339c0dfcbff894677847120bf543604aaa0d247be1f0f207d6b0032960e4558124d57314b0215fa23adb58730c54047f22cca70eb09cc1ad9a7d5237a903addef7a48ed1c42c3a4c0794e3cc0c74312ca830a6339cc8834334e388bbcbfdfd3282939805f867c6adbecf8009aa6aef3a4b8fd1ff15eae07698ea6cd6820d6bf54258b6e9d8652c801b734c03b2338c4e675abe60eba53ea712e2cc26fa43e8f9e2fb2b1cd8dbd656caf08075b45bcdea0c18c4053c1973f9e61a7df2c459d17fce72153d173b0079d97c78e676086c43a349e2ebb2b3a8030e9eb50be517fed72c001c619c852b228652dc1e79d7b93b3a424714f7e7bf6a4a34fecc605f9875e4a068964822b7096903d33283c94cc3999f3320c453c8b9ed6661a9fccc875abb929397b2a1592ee06853a31d879da9c018ab93727b5bc13c660554de64363692c8e17c2f4e3cb929943a7d9e1195a368ae85f938f797b986dbfc3083006ce79a81e320fa5ed444bbb89c991fa6bb2522fe759e76762bf28fd6bf8dfe1590208db265e19a50c34cb6523860535a30dcf3bef52a892aaaccf362c98e6daa00b14a7e98552d2f2be55d7e6b932a85c6908a82c2f0ffc62de241db6ce1850d3f039f37adc91038301c58d8fecb0f781f159b33d67f7be630949b17f3f8fc00cffe1786ac4ac0e93fc92b5840f45f4f325300b48409420f95fd86cf73847ca079f4f071a012c44009970982efcacb0f57039d4e08abbc4c987acf2c279c0d6275b8b01f685e882bc1acaf6d40ef7883a35362b0e028150a115f42349940f93861f6ee72aa9699771c2155f10d51e6ba0dc9102e172f3bf8d79b531be28ba4bf12b29771fb897587bd75b53763c178efdf61a5c314bce2776547ef08ffbcfe1869a987ff4bfef09cfd8833146052f5e0399d6aa147eb8f7ca276d7b60071d04f6bd4972d3524e185124f29be396d57279725deb27f961c8c1736128d241076e4cbadca6955e88e012a2e1ea097dd0ea0e2b0499f9c90f1164579b4b357bad349b08ccc002f96a1db701f8b3c2e7629713ad54c9c80ffa51178259c2d28e46dfc220c8510fe02f18bea4015a50aa8e8681275cdb014116f8dec15c1005575fc52abb5e15cbc8261050dc9825cfca235e11f5219d53df654335d9a0bc4f6f83ceb9d58972e7db89cff151df46bf2d8b7ed591e5dfc92ae5b65db8db8f837cbf68277d3ae962d77b6491d420262d7775b3ef7a19f210bca93ecdafa34f204fba1401c95e8c38bc4bfcafb4b0137b1f04a4f27f5ce38cae2a64c373807920bcea20687b4fbe466e8a4b53d7fd28a9e5d2c959ebe5b0d8f1a93d649cbd3beee7c9436f99bfb61ae7f6e90ef71a13532fb2d4a2e7d0b35d1a0608ebb7200c43ed02a9e3070dc651db34bfa2f5c7fb0cacf6a69cabafe68033f5452c0ac0e98bda7e51d4ce16287ea3da27cf2068ca691c27ebf8f2833fd2a748c3b36c9ff609bc248d28e2b5c8c0a54a2155c84bd5eb3c299107b49346522247d5344a92b09fc7f4354821cb81103033fb25d6061fa6185c774d32f0647433e8a62ae45af0b0caa11c6495ab1f5d4cd731d363bc9f30a6d1fcfe7f0d9d47ba8d0261f65cba1bd5ae676dec80fa5cbe5fb6964a8567b9f222a3caa2fcfea7b546e47c86c71d9daf2c4255406898e6c5c0b2d0da19d77cb921091db75ca1483da67e3d4e5869efdd690051555ebe054d9147c1787d5a66a4250ca3c805b43bf7f8d7b1170adfc6ea15a320b2abab1410d624bfbfb83ca3ee7a56093e7830afe754929947e1f0557f6a57e44c7c411c943b7ee3f1d3078ce71881712f7f8c8877901327ecf7a2b5c4d2fd37d13d461b6768e1784d382e8bea11173d1c5711ceb305bd4bf2af1647363ccb2ea9b12ffea05bb04304d333fcbe9e5fd8294be478ace79db78c4d7d05c78eda1552948eeac103e69f287af0259b1d9a250da07af8e00ebb750baad16faf3082c34374e7ed1e4cb37ce013303f5e60459deea676e02d9f9545744e5d54c3ad52105641028adb1236807512e3ed10f6f6661eb0c2f63475df1ba3251b91c5bd9afa5b224ceeb6c60609133f0785464fd14a0ef9dec1533040464af3a17b3280b4ddffcdf7cfe897ef32e77a097d761caff4ff1d7fc59252df96e90955f053fdd073adc964b5da80fa9a76ef1e51a18187a558b6f1becec70ae62c1608c863c19375088f0929dab400410ecc29dd0eaa3019206b2a8a93e44808645643422a68b210a443555141e603744701f915cc415fc1533a2657145006ca61821353f0bed3d426e614b7b2fab8dc3110d44092143400a193c5ce8fa3332641d08e2b7010a0ba7ca93f88f003e62ae29aa305441179d8af56998e3aa6d568d9f26131fa879039fa88cbe1c259593983037038c4b2f1c9da039339642b9534dc17bfc07fa580b0d31d3c99289ea463df04c899b323305656f4760693dccf660ae0445c984df7e587cf4bede78902676528cb40e69221a6974ff686ed2a6905230131f7f14e353bbe85f6284346ba1f85a06d9d64899759efd448bee94d32fe97eed277eefc670c23192e9c62fe01a866c7453f0108049626cd81d60ac9f6858cfcc1a3c938f8346515874a38edf18ab3194cfb5fc34b1cfca484e9366b346613f5a11c30c43996f4964194525214f6ea3678d423c34628bee97fed414974074187c554b1a85ed068dc23693e7a3518867cc330adae54b891fa76e7aeb249f0820551521e11d2c08253e4dc5cf90c12632274984dbc543416759409cfdbd9d1d3bfeea4d4f42ba9488fffd595a09d3883ba8582d27c3f7f79e0c28a4cd305c911d4a00b7001ba8c4a7f8b90483b0b3c8c420d08fb49c932ffab15b5e11e01c087ac4040a7ea140ae2ac7143cc3f7b50fa989e309f45cb768e72a2cf61c963bc9d4a39ad0cf4f8514ac96d879c45698a3046edbc23c54f108ee699a4d3a65465fb1abe7da7c200689ed4556c97887578c9b186a117642d00f835c55c0a9c27d16d8caa68454d8fd4eaca5c0c589d75e005c1c9e126d4864bb946b5301483f5cf0f03e5e7bf164ed8be3a6467d3394eda3a6d3006dc36c158cec02e65a68467ba46058805b82dc4ee1a1250e4d0ac6542bbf43a3293a21e2eb1d1e992734500248d6f2bdbeac7125056362d82663dad1a88fbdb09c18e7c091819d543066ff37dda8b4a14c3349b67f695d8f51c4ff6e9ace5085c19152bea811c11365c7c2aeeb6517d3dc6330320b84592733a05f67f23c47625a46f91cf19c925142753df89b9130050e422de3bb456dea3ad90ac15a4a08b4258f315a46a32d1161959e60c3e87851d33b1ab546237fb087a2facd26a80d8d86169697999297ff9d89fe9b2d685f1221749f0dca47377bfa8bb2683484ef1e691dfae2b7cc6308b03f341ae547bedd644e1e712d5f9a2a079726613bf4a5d11f50316986b23f84ec6b881a1b1332f11c9f94dfe6b556e71f36655363beb20eab19fa66d836d8aa8b4a5930ea7aabd9d71096af72e5439874d830e0a2690f58b35384234cdf4fd16c40333b671999baf516d41b2414b26008feaa71bdd1eaa908c1dd589e355109e33266addeb0196b578c41c20a8ea26325b1603133b8af02af6263facf079a167f6b62b71f8f7f213972fcd5609e3e3c7b521f8f7f26ea67a5a4dc0f5ff063581fd7efe5d39c796969638ff0b98f32dead0d8ea79a64559b513f4d1659f3648a83c6c49ac0b32de41aa64015548f33b20b6125dddf675255b0907986a5a74e64ec40c754eb626a810eee4d408be260079d20cd1de1099cccb4534f141673074404670ae6016378367cff53efee5f44aa0112575720fa043c7740c7fc5a38455431de8b69a84f55662b7b705086cb923daa9385e529f0d9f78013de347c5079661fe4e5ee21f6b2c0369904f59310b5490366150700b247175570f63c1d98a030f7662edcc292e62171ef0a457d19953c79cbe36c6eba1b1cd5801e22c81e530dbed7d3e84121c9236fe50a3eaf55ea410c362b3ce22c6212d8d30e17bdbee4d079f98229b6ee7910798c3b06ad58012619962604ad4e1aa642dd03f59755184c7461680b68f61d2606ffbb53e07506258501cc9f53188c6c9009fefc65033a3fb3901cdf6ad3f4878da30c4606be004d7164c89096289bc9e23f00417200bd4a6ccc8cb1cc33eae6454877124c58708e21e79ec0c368fb4b5bf5dc1f4de36cff9bd3aa39ed790eb33b23f4416efa005cc51443eac139b1e2f48ce9dddcefaa994feed8bd74819d6198b905d1f2d2aadc99964a1adcb59c3f14336eebb898842724c5903a2706c79312c33817c939cd66b5f1e805ef3a932c66453d681d9a6bd67af14addd8c9c438453cf961562464547f79b4a2326f685605b5ebf8e5ac56b55ffff54e9c3bda26f653223be87ad76208ca215df3efb4c65e6207e0b4c835d08db4ba4ab6d6920500f93bc493611e40fb5e456a3691b8b302b15de5a13b3ad5e1fbc107177cbc5d41008c51b326a766a9100faa44ced31a90c6303e766f0bd9213c0d8d72cf2583f8b55ae8530fa6b3c2e9eb54a4365e73c5be2848426d86f38ee622c0f7062b3650e67dc307ee81257d5c415bb361ea60c063168cd95482e0d00c10ee319ff0eeb98d90cf66b245449a09e674af01f6de9b4450a64ab490c08ba731b0052ecce0a2f7ce3f45e640d9d4535a1df8ef19e8b8ab32e0c9db62a0cc2cc480dc8e38a8f3126d318628dacca242946fca740e6b8b60cc7f1b29981dea4268807bb3237a68878eb2e3d6ef6d343ecd1e53d6097e337c254836098b46087c46fa3af7dc0e11aa56b721a3a8ceec7d5f7fbce4d35eef9aa8f4f6dc9b25ce6aa4d87e329429e2c0d21b39f48ce1ca343d55bd98f7b65933f2c66f1a6c17dd437d4aa17066102a3acb4789c608d1d360dde9b6c682c27ee39395440e289de436b532c1db6a51893014bdd85ef759594c68bb43c2e0aac45568ab8bbe3d05ab6c19785245e95b4e0e5891ea93cf3aa28b93abbe3e68e706a3dd6963ebba3a36efd0c0b8770c6459c0ad4f4f156d38baeba5c8ebad1114ef227886f0a7e0d1740930e6a12a698ab5323971bbf7ececdde90bd547c19f307186f1109755bf007d2496f907b68284ba67ca7c2b092ecea3a18e88d4021e90a4f653ab91ec5018c2c72c10e3637353d74d9630148c99ee89f97167cdf92d080cf7e7cce031c502870fb5f2a51886b78d50f89c48c7c0f51888c15f3c11d0a34c229a942df3f559968ad5d073ae58b12a461da14c97513e484135f18bfbdb8374aa7f340fec99934bbb6e7dc0383e62fb94c9b6e96df2632a272fc31f38c318a8e49cc6060a7400c11b0ce2836021081403e00bf02b0c3ed1aa7a43c6a2f5ebdac8f55e76dbf6019c3dfcdb018bca9db4c9db76864dcde02c960f9049635a9f8411796b9f947056d25dc18f6e2fc1d94b1daaad40f70274e5aa98e58bb9c0467107460ab6fc7b3f7974b6f6db8ed7efb5a473e247fc85268340360e17cbf468527c96ca88ae23d577227d071ddb2cf371ac4703011e081482f83bcbf68fd13b0cbbe807ae156c9e1eb08467677d3e7e79964dbbeb0d885c7faf9e99c6c94b5a1459e11ec17deef370dc26f6dc8d471e91268f22355c153549cbce214b4e42e1d35567a1b80495d698a888ba422c9ea7e36f799081418fde15dd6eaccf8bc58cc81a17660f45c0babcffdbc8260ebe3d4c0402c624fac92411f23fb11add7dd70ca946786b9f9eb9460201ce942f3441d4024586086a1427b4dbd717696649831d7c5c041319205d20fa5957ebc7fb9a03a1f4f0907e43683312b04b72b7e98daea38eff5b58b207e548d3c71ac63eac44418e6ab12137935b27393da06ec04f23c8a911a27637294d23a48cdb3dec65c5843f32a41297091ab6b4484c46884eaa26595176f7b2fc333a448662c9f3956275def8b55980d85b31637e86b48fb104a98733715666c3c99a905fa419a5670cd2b0e1bfff1217b0eb2b01929e0f7b9141f3ff41acf2ba62634d267fc48a75ce356f4583da538620aa56bf11df742ad2043504cfbc768ee45ccb86d4cbce2091ccba94f2629b4335b4570316ff3289013af20d18b31ed4b320f5925b5a65c42e113a42de851d8b5c5839114640b9024bb9dcb465d27684cd7912a77044c39d9b1af5e016dfdbd3104778e2e7839137198ca4b58379c55080e16e76ba759c0ffca9735c9c98b42a1c00fd03b4916fc5f99634efbd88291eb962e54fbd314154b0db850f4fea5232360083de3a4f1d9a1062547673cfe5569143f584cf004499b7d9d13c7b17fc3d0f374026604608463cf00a60c41b0db111e2b07cceece01e2cf393bf493238f13f478b9469c4652acbbd29a06728b1e372448fb7acdec3b3d15fcdbca0487485dc0b487cf0014fa0ece210106dc0e1fa72c32d3409030803f587938d6443060cf3cde47e03c6e296f245ffb665e54b9aed307ea5fefdb10b4608b55ba540ffe6aa4aed623b6b9281b7bb2a9509520a8deae2ae641beb7c84fb3af86809858c21a1a189afbbb3ba9da93ac8debe9e4fc6745fa282cb894ef1a7708f02b98558198d3af5a6e768e9228945bf971b29b7361e111f165bd08f544edce948bad197684b1b8ef9f9a4eb9c7a87894ce6c258abb3ebfb9fcc243303132ce2023ae3565b14f0d28a2d45589d2d8c8a7ed63a53fdaeb8a66ab53687b9d841ed4d503a8f6a6c564289529425ab14bf9bf9eac08cdf20da16c1eb0bb7d6e27a6a98eb68fc6763a7c12d2c8275809f456bd20581e122946da4a4063bf9e52b2974d859eb028ff7d884480baec87f5c4b5b15f87cdcffd2ad49a6edf2c4ca8cff62ec1b2e60d2c6c086772314c64b1636f08e7bd664a091893de959496def0ae1674b6a05b4ee1fdc969f4e42cfd5be52302a411125fbe2c9cce64701f852823ef64264038e821a6ed15cc01c87c5dee396a76769127cfb8bb78f0c1b8784cb4ad50387fe7035b60fd7f1d9097bdad73106789d73a8ad7b627b4ded785c44b9cb2a9169b4cea35a7b9a10c5232b4c5fd222dd7a35dc86060a024c5537ce4602f9e9972005a1996455277c668d09dbc096d991d50f7a9e90a3515abfd8579ca6ab38d267b01aeea5c81c59258aec6443bc0f1ef0fb94f639e63dff059055af5e5a0f880dff0b042790926e796c45ab2ea5826741b69ffcec0459662a261847ffd7638d10683019e089b79b3dc96362dfed3a65160360026f3f31c9c06d0210f6fb62fb2b81e2aed2355ea22e09f9f4924bf28e9efb6c22d01b5bb8de81e9644ac43eb4c8e84f84b19a286d4f828d4b44c38aa44966e87a6080add850484bd09b86c67694fe57acd8a69868040d62dd51bed284d75b390fa9e46e40b09bd21105382446888e56228c7090773e4d02324296b8300ffb81319a5b43ab66b4d3a7f5361d3e60659130216317e233666c7d421bbf7c23f228983bce323d8a672eca3ea4ad6263b58dd71cf6c0c3a4895e0c4a4e2ff1783ee4945e929dc376df5ba07983e15000d818c59c1aa85d0290393cc4352cc59b9c7048b0cd9ef68082ea704f828c4454a269da7807898adbbf70208ad2b57ca71be8951f984bf46ff9e9560572f95234d6a7507de04e7090872e58332e8a42fee4dba591ce910bf577aebf37d8821a68d518fc26357e845eeee9ed4c4da188419e8e31cf8445f33e3a2708875ef2fe96b963e79b9bb1504ceb25a3d48445d3d420d4eeb5604a26b46d733c092a4fa4fbadadf7821429dd53f522659136396fc0f56c276d2f96e93a0ac2b390880c6076f0ac0bcbc73b05e464f63086cdcf32bdbfbc5309febe0c2ae2334e09282369fec5fd1304a65f74700fcf45c24c018d862d1c0616bcd9ac2aa203ec6b830d895f724427f1a48ac0744c8061b8c2cb152c7be1b005862b18b6d0e00a9651305ca1cd140cc30bf867c5d1a9e951d3accb6a42044767d3f137beae2764d401191d126b8ee649140a9a4ef001d400bd8db09155b64475051523a8ae84ca882a235019b1ea115447a832a2aa2da8aca46a049515511d59abf2cf82a372e0a3c6f866eb426cc45c74081ed12164cae09f3cef6318ff3a80b13d5fe1213d4de26e7f513907651bc9f550b3948b100db5947424b02d64cbec15062b61b1babc6ae4ab9e095ce98877dc5ff9be548ef1759549dfd7306bf6340e4cb355e0b2ebd77297bc7e2d85c6f09f08118045b2e4a0cefb677ef31c66902d0fd36f6411c960a846b13ef5c34dc321c7d366c18f13f749d5df4940880090f2cb5600a7f367791c332a0b662d849365a40f0d73fac4958ea305d6a27872927b12567081ddb24ff847a330f8ff916d587a2f030fdce89383be2c63ac528fb3f56f60f56c35116595ac5a8534bc6757f30818345343aeb445cdc8f0bbc9b4cbd0d892c97fc86f8c9905a6a87feae60a217d095c8aad21fee3d620c7ff5c0e3dda7bf5d13db6eacaa6d6fa2c603bbd8cde251eebcb30dfca8c3eba31dfd3115078d9699781b33059e6a975b2e586e8f17f2ad6759f119f816e559640b37a541533cdacbe29af7b81eb8eedd3e6fa0f0fe897a6dfe0e01af66f06fde565bfed359a740628923669936949cd4f74595365969188714ecee187baf1fbf957238055750fa286c73db8e08b5ce0b09c82f2077d68648062527a2f2a2240a743c3beb907f43ff734b5ce55df2412953dcfc106ed05626e1aa6b4ab29f0daff42a1844df4e14b3b5ffc6b25f42d2f8d83a7302e099864ec8cd0d7f970396980c2dd4bc59ca722aeb8a1370c922fe8d194afb4828f8d362e83b3653e232277231e7e7c0a3e1afd3da4c6adf93811f51ca23a3e74712a23b1b972835e105bbc7d3f2c4246dac9b0f66edd878503830c048109bc051a252c1132036f4335b5aefe9462b5121127aa623752cd0bd56328267a1cf23bf24377a42c9f937ef09cdf7aa783a790d0091238c31e9fe2216dc95c9cddde311d8bc0de927bfd7e1500c1a50a4f57f05999833b16bbab167a8d5565b02d04da65557fc103d8e3e4ccb37838d2429ac786a6322ea1e47f5fd91a4d6ec0ee76867f880f9619db507b65d5b9cae69b5319924b1a7520237deacce607634f9ef0158b29b5ca756e8ba01934ffbd195807a4cd1fbaf169fec1c76227fb9d5dcbb5a60ee4e444a065345a33a74400813e100182e674e706bdbb849a1ac5ab64f401ac1b92466146548da5eeebe031c804d9201400f25289eb09d95ce8f59c837b46fb49bd09339eeb1c4b5dbe5ee666922498ec607379af0e2a4d48718d93e6f7969dc1934fc64549cc73001b4ddeb7d7cd07c225ad141634862173cac0f26a2116344a46e4c1e05f4ea9ecd675897f812098c8b9602cb7c413fc1e955142fad509a88dc68564f70b6517cc476ad405b12e52881ca30263721efe03593033db641a1fbf0e2812db78084d51fcbe8134539face46c613e1c7e3c6bf2c2daa54559a4393c4d168265f0bdc5c7c06be0e831670a9e16d14dfbb7ba8f447a1dbdc2a5035938ab42f56123e0327f89bbf182808487dd98a23aaeeba0cedde7173531f1bf1a5b19807aa80cdf37592a913557836d791d8e22e2ee638fe3a402bec10e298a6ffaa005941a07d2ecee97d9efa92b6f17c830f73dfd304380225a598980b5e307b74aa222223127e648e20fe4fc4cd476b83e9e5906fa49811d07c14a65c79d8e2b20b8b266148b6e795a61e126d6ac5758147c40b4ef70425ba42b248115109b5b2b86d23ff18aa03bf72d9f1a79489add72a9cce6d1b7401d69d4c869d6ef2d985093e010410ffd405179e90f2b3db1622603be7adf7f968d310a152a5510b48362c173fa25b6b0acde7faa53943496abb56341fed548a01593641bbbdeb92cedf362734993eec4f1da8d3a8d6b1fe56ab1fb73bb826438046a1c66b62b3ba75e2573383afbf3b764e46ec711dfd0defbe2193b20ff7e13ad5c77dc95fd97cae277a7efb3b843d8978e63c293744cdff4a184bc5ad0c1ab71620d11c6f89fb5ea8115342c940c2b9cbf9a046cc10459f16fdca05361bebf83c25f30d39a88067d7382e76f85ae6cb6023864722861a35e90883816100cf0458024401b3164ab84efe45c98a2ec55c23714c022864ce2faddc5bf219919ec588fdca6f2c0599c0d8437655d49e6ab33e5f4ef2d32a126010e59762b7fd77e1727a7b04bf466e873a6e7694af9d194fde451435bc2fef95f8ae0054a42c1002060eccd0ef214b0ad65801d3cbaedebb9c040dad82104a7a7b9dd4432699bc926ad29d93df34c606be9de1c3214fdc0e9898425a5800d9017e0065a03a6f9fcf1a68049bcfdfc9e9135e44484473e9486733935b0cc111daa78ae7a9f9dbb4905f35132cd316fd62a02dcd9065090403fc71822e312174eb2827a5c6b846ad853a4adfa63cc3805c792b6ac973978170fdc1c598dd1fa4e608b6170866d2f80aeea3d244326c5688dc1f0075e8ff4d9883ef1ccb8b0058f2bb735ae3ca54c28231ce295762f34dd99c5747f7208e44397216111b02acb17bdb78084d4f7f1298b8b4110b0c668040e30be5499c5af3d729000b81e172590ce5a059251b739b2fa1bd24a537192bd81ea987755ee52276871f6affcdc2599c1f3309ffd2b5ff43f792e942e5b799c2e7201d2f08cf17a85067195888d7b99884d2b37453c3e5c1886b4bd9ebd6eeaa1d8ba9b046732ca6264363ed6ee2b57ea43bca700b8f23d1016142d06a8f3398038cb30966b9f92c2162bddab7f43e8d8887c575a7459ab0488028caa103811c1dd4e4c1bde281aacb7fac2e1f97337c5cd97df76dbfd02645b29e7b14b97ccd4bacf6a9b85b62346a632d1a0a50d5bc4a0edf61e804138a2a320a4ce9f8f34c7787a29629bca679a7ed27ca03ed8b4193934055b1840db023a1a1c6b5150d48b90827f36b5b2089f614adcbe60111ad16d27319fc09f17cb31163535b142b07a02f2eebed51af13f53fd32ceb267f07a408b5c68b4b2cf8a9c47a418b38a04c7183c93b31ed58454b860a9be5bf87c8a8b3b895896c92ec74b9fd7bce27e532fb7603dcf69e82d884c13175aab22de6b236cd9d90290b870ed3835935b394c8e51defbf2c63333982df3c385fbd76b61b6482c84703f1b3f47a027aa83016ca44a1fc86b61dd690269418e699c315f9aa46c3f8f3d84859d318c5f0e7a5bb95b13d7ae98e5ddeb69d793704b0ef577056dcd5773b56dc85f87b5c5c3c42701ecb891a1e8e765af51b1a23f870efb36c688bfbbe944401dec7e960dfb82be781924e449e17a4497ab4f11e95d9974a317ac41cd11c1fbe827172f4d57c5a6eeb6c5d625da8c766733bf4d480306ae74f3c8c8f54ff5346e7a3f576199ed99176fbcf2df136ffcf2de9337c747df7da2a8e1b2c96d02887c4f5811da72c39c544fe1e178ebb18cf7e28d5fdefbf28ff77e7af2da439a0ffb2809f54909c1ee4d8254ddfaf822a2548a824ada910e6f24b974b1ab84c81c694ffaa4aad2eebea8c4215955a3c8e3455a244fc2db93e658b13ff215f190db9f5a20799f7d3bb47cd2d53abe193a08b49296fb6943355872b6053ecc4fd1af247131c2f51cddf448d32d893918a980783f337c7c567612cae2f1ddef250d422fe484207ba6b5a162cc1c2488342e45cc7f4f6a699401d691db366b09bccaa2436dfd1d484b4b3100363283a7a95ac3d0100b05ee57f58a9b7309ff5679ea6f4ad3658fa28b0e801397de2e6ef939d9173fffe28b8a88385438388bf78a989836c579745ad6bd7a753925964a5cc7705fd2c0169980e823636b3a518b92b7b56f981e8ef6544ffd49393a39d5de2dcbbbe024e404d9b917b2304015d2e265f60457d72971855180705cb94d4cebcb9dcabd5801ebd9aaab555773cc26f003af526e3ed68e344abdf3428ac5246176b0525d8a922079fcc8100b01580e1576d169c4f0df7543f45b642d8e0dbeeaafc69c430883ecd93fb132f1f97386a2f3074ea89caa294da9aa72ad7b0ac386704b4990574de0a18707d6fb1d72077fbe7c05b98a69ffdca332b748c105b12ff268bf9fd010f846af6428d2be9b83f4912a4b2919c5cbb0f151a829c73ff261dd2f93865337a42ff74f62117244076911eb8b06e53192dac2678ed06c569794e7994639e0188020c31b692e8145bdd4c8ca2e073baf8fa9980725e7f5e5d4f870f25bc67a6b685142d978caf81a6871d2cf2207b92159e6b869c682120b8272a7031c9f46285381246d893cd8988f233c106945ce3073e04ffa4132eea3546ca7d183229e72fc007d415552d20b37569f0e9f2c6259a02a389ccc4796f822e44d5cc15201878e0259fd8a74daf6cec9e1a6d0f0e75e5129072dd0a6125006415dcf9bf06db592d9f535ab27b3fc4a9777a0a2a7092b2cf68c4bbd3504e640b57ac2700b3b212adcb8a339683c13426cda46e6474352383fbb3313757099d2919d6671cf0d87158212f579a5b51cb59b3372a5ec359ad8edcb4f885ae699c3d99884e714b0d29282ebfeb44efcf4eb495c2c3682b0d70909e5e0e6ae081bf8f8ad504d6299023a971f28426a6eca5ac94af2403a0b336163a9d72a8ddd1abb9bc7e96682a7000587c306605dd422b21dfd60c2a4d45ae8e65e96c43368baad53924d9f8721f5065a0e10cd58bb3ff39723b6f1297166b5638e40eab276dade6c3a0492243e871658caa7d4d16d3a498e39bae3b2fd3bb498e25c5c5b01131b467ec51c16c95877e16b8039140fe097c813f7a5e1f233c4f92380b15865e670c134dc28ee47050ee0ae0d8939dcf1bf1363cab8cd870569ea5c399899900841b4eb101b9d2f5571e6c02062c23376542e3910d96e72eb465a1c0eaa02c72720cc417a8ea74468df337f16ebfa637b2096cc9c8f940aaa8fa6f95cead4bf29b914cf2342bc7d6f6a9334bd01f3eb90e1f34f1413a87046f8869b78f0e44b691cd361659e5ab11a50957fe78d595bf71d30d921b20d9702a17f9b0dbe9133a88e2a83b350c770b398eb5a2758aa7eb24a570c0a8d4a684b91934271ab152360896702c36db2afc433ca2d90bffc198fc390b112e00cfdd540a356a64aa7de1b28b014e0b4d45801db1f0f094bc234ee03f28c8c6ee6c1e4a0db4f4ae572dc3fad0320e1bb9a7173f5dec8a9deeda630dc16b90120e87f5e5ff8d806b32e6cea3a3b0211f9dda1e72ea393317d649cfa338231d729ace4c25e5b9e5cae6a691290d3753ff664b51d2d0172403e64f059d68a64e54b94754eaa9826b2e52454fb2300084b0045dc5eaa16a2941382067c90c1df0eea2f414a1b63638b905fdd60666c1d3457cf621847c3000f0b090ffb3c64a48104b57ff2f0d3f0302098db2c21d7024c5f785a7479b9e951e826f11d75c436513b9138866c226f24731edbbda3d276c644909de5e6e894001e331c631d58044c3cb99cb8e5bdc740ff9810c910299b5992d148afd1bd95b879bc1c1dc13f4401954c5f30e3e9632e8ec954d1a2a2b166f702e7b6f72265881a40e4669fc39a0f53d6e6906e268f06534565f051053eebe40018abe25f7c91e400d94662b10eaa40466448de57fc42795644ebefdb6f1498e99524cc9226e57f2d9ba1cbe405f264ac10133d1ae844c3af8230e0cea7593f1a0cc5f66464dbec623181859fe1a3760a889b366f8c948474d16d5ac42faae8508713ce247bc05d511357083044f803c70ed2e65c9e9ce186e3f968a05703ee5f5288b9f0d91f6d86a37936228179c103bde1915d710a8bb45f64da0c7d20e57c9dbe8163005579cbfa93063f0beb1d055c4310890937f0d82fc29952b105a1a10c2dcde2a1250b5f604e5af1a378d21bb48e318396ac052df30a5a92ca52e34c3e3613e4064168a49fdbe1e2ef505f7b81cd0831befb27469bb59c92ed5c56d345007c201fb3a80d74889ef2344e41d186ce546fe0e560fde4ace45cf1ad146e02cf5cda9722a9725b78731928ab5fa5a66f8274357d952034dd84c48550647d9941f8a6b3c82040ecfb4f1a4033f9c89c6560fa58d87d27041fe254174f97b97324ddc924d389b223db0335f730dd65b0473bdd5174f4763364796aca3a45334e6240393709e8f94920da0ac50002f13e758bdc4ff6de07c178eedb07016141d7fee2036f8681671317cdb0b33b21f7412a1bbc5c248444fcc2a8060680436c0030c09a7b74810738e5d5fd8d9c455c02997b5c3a48509059e0a2bc834d88dc4a84ed0289571a91d8fa94ac2e963636b106aad9b3845416eea63481ae428df819560716806020824d625d9e63be544f6464482ef603779b7a5708492ffc038b6986ee4228850d3c8d8929d9df4764cdae123a8d785a0a817181d046bff37c1f0ba59ab70cd28386a29b4a1fad4cf3cd5d39a6b3228279ed0b834321eb0dd2708a736f6202e190f43acd2c4c03d4b113d430884d334886202898c6ce0eaa16a4b63254489ac364306c123cc08676727ac05579f0e402a3ab331856ae2fbafa269ca0e36fd0e1d5701374e214e9dd3c81153e3dab5c131b5033145a30c319b806564b93f7fbe2012994a1852de2a1c80ed5b5ede38884fb3b2a84fc492c2913a1b9bf8ed11a449f519c9288deb4084f83b89523b99bb192523524c451b39ac16aa7040d932e0260362cc0d65a4c95107f33e8af8c1ca95b8cccea10b617aea0c0167c68210cb4291565ef3df440be96f140f11879ced6e0d39a419647c8374b33ebd50cad6af8b3df31b50925cc8f2768a333023ce757ecdcab19a1ff7055d68814a6d1926ca41fe72f320e2d36fb003cfb84387c0185a3764c17595a4dc50af9a106aac1b5df08046d427391c2624622dad40003e01087c6f50ea26d9fa639782d5547bfc7cbb3ded87d0ab30fba19dae3c87b94e3ebfd9a980a4d2adc31d838d449c326159eac26817b55db5750e0284818aeb94203503fa5fa94dec6fd9458ceb8cfae6fbe3e8bac7ae6323937bb4ea8d014cab2f94b404a65a8d317ea0bd39b5cb6d6bc68f6cc24dc628b83eb0ea36fe6ec500af2a2c65120e246c365b82d59899abd4198922f531bc608a8a551cb796f92c1037e41483752604c708044c617127ba53651c6d4482ef988dcba5c8cde012093a52a7c57e57a781023e5b29b5acb0f4963113b6a7940becb4bd2b9c408fa2eb3f97f3892dd61f201411f6b26538d6000bbe0c25d8126716f206cc565587d81c3dc4598c5f376f5a8e7093100d8a4ab3ac3b55ce668dca2ae8eb268436bf63390cf74e69688a3bdd9ef7dbd811e22afefa64e88c1c4f796e385c453d163aa9139f1ec3ee43876c84e42ab680f701e568fd06acddc04a80585615549152d227073786f00c2ce31a66cb99b94d11167f1a64b1e8689126ba1832fe123952185c2ee56728a4f9a91dce5d254790b4b5b9e25f4f178e4a4392503e874fd32e4a8ecbf18924023162b56235e02e54dfe2176a26399a91123d45304d7f4a978041c445824a86561135d6f26e1b596ecc084dc5718751e0cc0dd5a1ecdf080c5783442a5e939b99948f67064d8d4c25a425d0d792ea0217c2c9951895be158e30c2e34889bcda410fa1127eb2dfc17d48a891d81de3924754308f4466a84f9fc76c2cdf7c73312a8974c01dd8203bae85369283f06b740237fc0e413dc10cd26ecddbc48ab3791f72c03624d8acfc0d8a514e7a2d4ca202a475c6442a110fc161bf6a8049b6ac3aba042216a97d4727e1e49fca0f788961978c483214dd4c2398d1d7c9449f220a081173bdeed9cf605106780286d6449b538a395580a5f50c76f356c8c9314cb985a7f05a4558ff96826b7ca317accef3407196f1b5bc374aad9bbaa7851a3ccd23352e7faaf354c1a24e0db213047c4ec9993338d64a05d071588b68a7981ed778dd4866428360c7592d8a0f78890f50eb86c4f8bdb9c5ab10166073413b649941cc5e2428240d1584bc13ef80331b3a3840ad21eb543613eb9948a0e8b12f08fa0d0eaec9b92e39fc18682db980f0cfc0c3d8895ac554e43018670f0a0e6fec06024814716eec68b5376b134238e5490665b5e506f9ea8470ed6c33e254537e3c20c1c162e9bf15250ffc99216d4779eebcbed97f26df8e08a59217425c3ffbcde0254fe23654c4567ad9da82b3a21a83a076304e8cf48f9a0ad3159e037493158d4311822b036466863b10dd8a261b131089c31ec5ab0fe98ce031171106e1bacc6a74f9cfe02fa4e7608599e7ddd2da6f3d2a0d416db8fa684a08d06141b57df3b6a0474b2f0d3d864369724f551c72ee82edcfc03fbac448eee8fa9888deb3a4efc07016c930893b488c4bef76aaa86e9820c107dc4075712e293e4c3f25b2338ea26995fe43125cd63d8efdb2c17a6d4f018d0ee634580562049bc1acf9be907eac9d8087a08eb62e40081d96e9e69d578eddd13bbe0dafcc09787772f16d02ebdfb72d6ef0f83cdc77e958841a6fd59008f8402d9f4f357cebaf3d082240972fbd5d1f9565afb57cd18c167cd0373796c5a3e0bde4c82e20570602cf2169d08feae7b0c038d9ed985064c7a703707330df44d0488a3efc50ce0bf3ee57faad303599d8cc3e950e5a70655bcf87087c8b857e14c203c02af75394fe54c5b11d0feacebe25675c35a35eb28417150bfb9e5ee5c7b0300ab356d18a2e18a50be6d7748e011b4d992ed0064abc1b1acd69ac99705262e76857d5e6e74fc8c3c3e142d4c2aa64f7aaf29664c4c1f259a617449039aabd50f3109b2b909330bbcb2036aefb2985b30d655510779309ee67dd2810aa7ca4573b8883d520129db18a1831ea33fab0e47eabd482a606b9983c5023bf30b6bb68c3ee7ab6187d77c4c3e68f52eb59bb6dcb084c2ec23b0f67b79ae7f12b0a5bf2c217bef2df796524a990280093c0994094ca030917b728f3565dc653be3c15a6775cb5d52c504ecc290d2848fadcf509c407102c5091427509cd0e2f6d4714030f7642f688a7274b80153cbdef73938e7046d5012ae98445118f40ad4e8aad2d8981b5d55c76ec71be69802daef03bf307316e389ade72872bec15659d7b1dff053599c63bfe116940517661f641c716c9c90e70629bae5f90cad2d7861f641b61ef288a3cb24723d3b9d3eddeb96e7f3f319b271c6aca66670c1f8195c3364b406f6399633c6a733668f9d9b719b11ab29ec579433628fadc865cc2de656591307029c8b5e4510b89ec91b6835855d1c6fa8d5143efda8a020d319da0cad5538ab2097aaa1193aaaa119ae6e891cfb0c1dddf25c3534e3350386bb451ffb0d3d74351dfb0db5ca9ad85497043df639928ae49047847dd954c02410d42d7fec0bc83e54c03292acc3fce23f576dd1ab19318ac2338e50395111f1d855a79f0acc388249cf8c185d55008aaec108e23185b133011a485240acf5e4a1566107bf2b7ebe11e66f98c205f51b68f386eac01418ea160c13be8cb979219383c70e5a1568cb989b95c968df893292ec3147e8d50c8dc6fc740b74ecddab19248dc25ec62cf9981e8f3d46a75b9fc7dcc693ad55d86790f449098dae4e42e8938ec70e7a1973ebdb168f3de6f6d8e947b281238bed234fae568124db8d18eca188e6b17b321eeb602fc5da6307714845393acc2f5e74fa79ec201883892d23c95325d42a7c03e655b056a960dd1a397695105e82127aec950242adc2ee5c6411ad55d84742a2d4634b96368f71c89371d0e996cce325b5c77e03adb2a863720754abb0e378e1419288e8d564ca99ec8a6fe80175f20d35f2061a4561f7c8942b32f5b297d05e8bdb09091a237b0b2a41c3926c8a3c7435276929aa7932cc4fb7506f6b6f6d4851f606bdf8e3adf883ae2c4752d2460a132acb3b65dd624c8aa62f1d145fe28e8b4028ca7a5e2297e24e08442ec51df13547f125ee50949d2fbe30755cde2f73e82cfb2bfbe90610776acaba155f6fddbabb2097e2ce8b3b34baa2405e3c30baa2248efe21624c2c42579d5b176574e582bd7f7684f696137bde5a31c98bb41495e41d38521823bb02ec29e6e49af4b035bdf80c6581633f7e1933697e2ac8f4faf7a563e3100989840e5e1c36c84dc1719d2887a280f0982e243cf2be28aadefbd14460fbeb764c49229717fb1d73e0644eda91eb2df295f3797780dcf102a1a89a031792f74553d55d3ae764ffd1becb58e4f2c22c0b74da22fc16f47a1ff48250eff4bc7f922576ef3ac65e57f260afad2fa35d68188da2359da2de35b4f4ca7ada026306f97a736e835699b77e491cacbb255d68f0e7dc9ff316462ed6fb7ac5e1fa252dd95e11401500b1a49a60fa98231303f3e2d27232b1ac94482a2928591c8942f0f370c75d5be96c15fde28954b741495f02a54d27f0b6ce594434128d4423d14834128d4423d14834128d26c624d1280c45a311281a8d442314d188741a8d5a44a3d30b4c8c8c8f248c99182e2da796164e2e2ea05234325e50cda859b9d984382c4dcf4fe472ba5747ce670e1f0c510ec65e8c181c07c2008091281447a391188a02808242591a39462a35aaf61b555b63341a8d5636bc412e8f6dc1ca90117ea36f54ed37aa96351a8d463108a07523c30066c8d57904406744001a346cbc481ce5308ba28b4407c5d168341285380588010bdaacb2eeac86bb85bda2dc0ba90b16c5a568b0c3f0957505317e30d7dcd7e7b803bf91080c6b1034df9d3b9bb93a4f65c211d714d589e9d9746aef7579b557dd25d10dee31891d343550cfd92fcc6ecd56c980a12db82aebeed4d4f4d72b36bb22a66d320e636cf76a7516514e87b1e739c62b95854b2c5e62c7333040315e5ac82da76a02a291b1f242e98a6e915266b1228ac84c451499c98a143193714538f2c64423ae41b1c930b43b8a0988444271132903808e62af203c57e4d206e189c17882c4603caf00b86a798300f2d2a15d1040f0184ef7bc8178e4dda111e2ca9a2158a3572c3086d0d295154018b6b08375cebc832f8872ba9ad92af0e63a91cbea9c7bd71b419528a7c336a4cdcbd0370fc008b66f170f243a07af91bfb3be3ddf9e4121fc749fb95aef46222207c71d1d0045e38dd570ec09c7ebaaa96b6a422eef6cc6a86292cb6ba41b6f8ca2aa0807eaadd33c375ed77879d014bd46baebf42f5946e0ad2cf5df8867a004082d655d97092897d7859a1662ccc098a17a41064d0a6533c234004bc05ea983798a994555649aaa36b4d6f453ebf519aed7ea36351dbc778a90b3d6369d747489007ba6b4b1dd2653a7667777fb539f497c52a0e4cbec9302d7731c28f64c5752eb9401d671a0a41d2bceda9b1ddc03f8bbedf5c00ed35dba9f527f92cb7cea960b0dd43ddfe1f3d041e7443e9df3976e8970f8b2a95bf33987e9d6c87538c14887f974cc0f8e32a3a73e1af9832301629e7a4ccc8394f6450dc371ba1e1c270ffe1b5d6898e1a9cf30c383ed82c9f92e1d69dfbe8fa5abcf08b9ec2402c836d8f8f8f4007bea2f4c1ad8a923008822ff397db0865dc2744d85222fb9071d7b492d890a498ee54b14cb97b87e8ef0864c125901f3e63a9d28ce45cf715ec6f0f4e5392f09d09c771c59723e3fec9d021630ff2331b9833fe7b3fb16e198f13af41759e0c6f9dd8fe46c88e977a40b0d640e8f2a0027b7cf0fa19ba41b4bce6fc99136f351943571a8dbd8a05ea8a27382cf8f9bcf0fa1158073e28093b4644780a43746705f70bb04b6b2cabedda4823cbdab8cb4a39f68f161099d20b009d90c804dc1a09e5ad091ef5a50912fafce7710ecbb16b4d3b5a01effc54f8a011715b51a15b4ef1a15b2a7a288177dd7a8e079c0cd8665b21f3a2f3b608e454144e8a7f7a88645edbb86c5ecf1770d0bd9770d0bd897a6af61e18247e1e165f82fb2171307c0f691874c1dac854f6893eaa383886d32ad0f2580402e67041d3e707708232f3a2e4914b08f1e1f3cf0ec131f46b28f213e78401f3f42956f1f170e44a1f824dc02bffc0085ecf343901d853ffcfc9024ff70c492aa80f243912629f88b9b4a15242f4929c589924ce5052c4f587ed8c9a78f052dd6c5be64418b971f5c3d9ccc7adca6733f3f4444c04388c93d9049e23d8ef43032653d8ae4d13ec92f326c022e01f7e0e17e76667afcc031749e88b00097b4e03d81ab4d61baf784e9e112c2fceda30304ccc3a6539bae33d3b98149b6f2eda3c383757ee8b8267e010d0fdacd3e711961137009403e3efc7c172f84b58ee6321f1f86f800c4871f4f632d27c8ed9382273e2970f258481605cd5819428d4d9802203a5f5c808592eebb860514f0f4be6b5800fd74eab79f1e4e2272d79c60fb12d79c50fb49bbef9a13a0f81189df3f3d64cffb41287cfbb400e8677db97a7efe7017e76a151529d74bee39c88932929c4559b74aefb9770bc53db749196fee78531a6f685056cbc9d8ac16934e79eec940e38519476909a578f7a6a0725248cf3e83a22bceafa75847e150525246dcf804249fbe9db31c478fec4c203c3438eab56e2d98ca92b9210333cab81d89c0380743736476ad238e2797a00be44157290e23e331ee3908ab2c77cf4fb56ec1d0c4d8deb31e33d2d86acaf394914666a4a9d594e74ef3f330230dada63cbf23ea6540313c01c9d69b235d68a8cff97c8e2c6d784b8a8cc8302ee3302ee35ed2cc2aab462dfbc82899b11554531e48e668dd6aca739523b28bae1a886646519e5f7b2fe7097946de037fbc070e79ef72966636e3713433baf26a74cb825ed608c20de89e832fa3f3a029cfbffb4351b78aaef1ae4d49ab384e542349ab3c07bbaf4145d7dc9dcf6d287ab0c4d19fddc5494fe973f9b98f73dfe1e36bd43c3bd60f6bcbebb9169ee74a3bcff9479b37f488e7bce4ea16ca73d7cb128fe74a3acfcd6681ae4e79ce713b9a4533037dbcfb14711fad5ba3ffbcfc7afef3eef2abfdf7d9fe2b45d77ffef39f8b4bfef3aedff77d8ebb95e29f7bdd42f1af1475fcf709e13f9ad90786a00b041d77abe4a07bdd5a7110c64119075f1c04dd87f79278d0654698f165046108c232d304cbccec3defe13aadcae1ae9af27c3c420675b4caf31209ba5ae53937763f23ab5103632e80a11ab51919ccc59f1c584e2c4728c7095dd160739a99e846f729debab5ea270b60a87d6034d4a8d5a859010cb5ca73cf225f4fa2c5a4551ee73bd08f41eb168dd1420b3fe8ea235d386fa0940be832dead5bb738eebbb25e3cc62100e332a409641cc66348132051838cc3b80962fcc5415765c9903c5240009c17d7993830ee913a13e7a575f3cad6cdcb9c5d2f26914b8e1718b7221cdc7fce8d29efeeeee10733e29ae2fc65045fc21390dc7dbb8a88445221b5b4b4c498c538923384a2bc1a4928caf37b39f003c12f043f0b7ea0b5addb8792032b813617217f9e8b906df989fca5e4276ad8b8b146ed7a59a3769d66f6f29e831e5976a5da7bde65098af73cc60c85e6896681ae8ac11a496ad86ad4eed862479283a3c8c551c55346222f29f8edc8c1151616300525b4a1d9d06008024390124acacac8736214e58d39b0967074c9a41c63a62222b9743f72100489bcb80d9a9292c19aa09a2614e579d843519e128af2bcc8b5dd1fe7415194ba0e5db98eb53689efad75dc2dcead7bddcac15d76741dcb834ce277a05ffad82a8f23bd559e25edb443eff9c0def3724616efd5a8bde7327af4cdd7a46b3cf79abce7a50c1fefc110e43d2f69a078efc8c7c537d1ab4f0a6d7315d97aae2297a0ebbdec44b65eb66ea08b9e9dc8e0e83a14e5b938ba8ba23c6ff121d3071d04759468ddfade73d0731b9a0dcd79d0d5c83d771dba02dd7377d195e8596f61d1ba75ca2353dc3a9832de9ff1da28caf3d31539c5394f713b66af11ba4ae88a2389bcb897e29edffe9615cdaa09a229cfbd9616f8af8db2308ee7f727654c412e7b0a25de73150f499f5702ec74abc5bd939b6acb4796d6f3d2cf97ee7acf5750fca3c2cd4785aef19c8be2cb185d7e5ebce765fdeb45a33cbfa7710996b1a48142468ff77c652c65ecbce725126953a328cf6d501b1a45793541b4f73cc551469706fad05d906b82de73d065ddcbe3cb6869aa73710c29aaf3d198471245752e1a9ba2c097901bbb07696419dae3b7224ea65bf48a4a56507e50fc15fdf53babf7e27bbb0fc7ee31371a21736479a3e3f97b5394b5caa399bd4780d97b34b36e91de731a5ab7e87b2e43a75be07b2ee3075dcd08ea16cb7b7e3dcf7370c773f0e539e8f29cf3ffae830eba286b3261037580d0158cae6e11ba6a1f1608bdd7a231614120f16508bede6b81eccb992f41178d2fc1d87ba00ce394e0ec3db0e5790b88ae6a91f7bc15d4126a797ee3f98dcecd0e5d75eef9cd8baeb0872d275d7cd97ae2e4cb99297c79f3e33d2e5ab7f7ea165fdef0bcd7331e89434f2153a139acac7bfad5d12b6c495a7a5babadf58351544e46924b8ca9add55251bdb3d67945383e1915dde89c13e120e239112caa3ee71567d4f3e627bbaf9e1487477e9374a9a1e2609f4f0493253801a884fcc59e5a51666489a73e4219dd9ec6c0255fecab813d53a284be039245ee02a3f42b0fbad050b1051e8b6ef8635117b9bc3bee655be6bcfc64dfb908fb8450af0f3684ae42effc8bd115e8dda9565930826aca48af62ac68d469895ec5dce849d6adeb9d9f6695352a4fb6ef4eb4ef3a1f8d38c68a5e755756e73137da097d77c9c6a4e754b480eba08b46cebf99c395997eba85bd3bc277a458ce0e23f7007e22a29f80e405d007491b541c7530cea827c3d4ead5767b9ee7d91b9e80e44fe439d885a3310688a6ba981b45c5dc628028aa136a5516600cd155f909c170d284ce300a822144579e77fe0975abed28c2546c24224830d210152188b0cbe34b1841f6f3ce3d5ab7a677fe05d1abef45513bddf2bcf3eed527a4519d9797c7dd51e27798a84f08aac9f7a22b54168deabcf36004c1086a5507fbaefc84bef36f8cb9b5aa730a63a7559d3b17b9736f6c21a855ddf4c81215e43b2fbdef30897ab5aaf320047d87121a01813d53c2087df513909c02f3ea1600beeed4916d49ae18468809317cd18f1ebbf8288f8b5c9df3182acb46c893ef105d3da12cd039175fddaa0147144d719ea3061b6ee09c23952f5fb66d86e35cbc22cf1c74d539e73574de79aeacea5d07f39ddfd80b4febc6eebbbe2834b860a80660cf943924ad4f9e5e6b0063686f7d5291b52293b5763e2ca85b01b09dc356964d571b16ba436f438ec9f356e4c96103454db2063ada4051d6a653d631b681d94c5191b77eefbd57146314d5cd39eac965db42206ca0ab7296d4861cd373d430e7a42e7bebed437af6d055d94f568e9ab2230af2f51c5d7f0e6f42c6224c845112862397e21031f6b624914c4059b405caf655871bb5d65afd76633f686b153776d789309106b61b6366220d628ec43401934577c385a1d3ac1b5f66968409eac812cfbee2405d1a4323855a352a2197241915dd8879d3ad5530540d2545af48318aaaa4231a55bd4425791786bad5790c4d241d21f29062742506e99114313417bcf8ea2549f615468df6d5ab0b435cd851f46a55ed4811f695bb512d8c24145561d860d452aec8d34b183594adf342043bf7e449fbaea26cfb85a2daed3843512f14d53ef382e3e5dbf690a3406102253e68d1420a2c78c20e9e180f328fd9143f3a4b2849c21354e8568322d4c0263af2f229b3667a114384b839098b0082c94e1341bcd0628633b30892832546f841041598a0036b7fc8d3ed4cc287e5210b7fe4e9d5c543c927d90eea30bf789b8540984fecc8b70f91a087e1db87889107b3d00a72f9d9747c36fae9c8b05655b7a3686b1508f3a05cc2362ace425ffd8e20accc447cf56edc61561d5fbda526007fe9ba646997a82521eb337b286c06a04f0d944cc7d3758d60328409cf778dc98f2f2f931e6e43f77294ba0d6834181ae28231e526b24bfddb3e63533d86ea5e1d559d04452ebdb2680f140d1b0aa8aef365f7c4e0eebc31ba2a5f5eb819eea228aaba4d41e25c1376aaf5cb7573ce7164227ba66f923ce0074573bc31ef8ee825f5d27a96d291e67bef1d71b8aef22daac1ba5ca3efeb730cbfc1077339dffbe93cdc691face12c31f54952afc49f12ce91b43fc91107b91d6c12c9924e3079b034ec61d493eb8a972ac9aa5c19cc5338f1f57a940ee34e07e7eeee1ef94004cad371776135f5328d3e9db656045e23b7885dd91a5a4c96b823b9fb5a59b0d6fe465eada14a1519773b3b8f33ee0e854b31853685ba5eab5a85ed088a3abda62acbc3dd5d533a98d6bae2d5da4f46515f2cf6b356d109797ab3b0a07c254b0bfc0c2478fdaea5b6d65a6b75a1dc4e84dc4e5a3bff7e932e94f19794f60eb5d639ce49daf6e9939ca40b0dd3a997d35da8f3f094e4e1797817cad49d0821a62897a6a826f19c27983c541abe6aadb57eb3acb556d18abcb25ed65a6bb518d7ae56cbd5aaf2f39ced463bc8d36dc5b4d6b63d797a0e4747f274ec83dca0907befbdf7de6badb5f6de6badb5d68a3c50a4d2626a89911961b4900ac1173e978979817189a1baf6c6712e2716936ac68c1a514ead993630dc6b597edce92ba21caed60a0508808a856a29ab8615d18d27ea8c00d41229f760adb596c6b528b73c3d8b720ff9e6dc1e68d45a6b541df9ba28e78a720fb9e6d41a2178bad4762048bb149629e3e0ac93fc564a2d2b64c9054690cd96a306aeda181c6889477a13f2ecbc69b09f12a3022305068ed17d0b5d67a3ee25c1dbdb42e8c2ac765ad9f5da36d2058ebc2e1fb7aa88726cd75abb5159c02814cca42a4a0b2929947befa5b1334f51947349162bf24c596b2d8d4813e2a07fc91c4e885cb9d6046019d716f3030852db8160a59613c1502cb99c5c649c0c675c7841d5752308839ca9f914308a0ee03230312fa8262fe49956f2b4066a03263b50761049bd032293fc22b2c1844b8b4994734f36180600e41dd9b200206c196250094200688496da1a2e1c656142b6dd6d82225fef1a169b4459874594636158555266592195546884b5565668e96a8e1e1399a509797a8a28efc8d7278ac80aad8d21b43c321d8972ae28ca3bb2cec71076b7c09108668201180291a74f4aaf4e530ad474d25a7dd44bbde03a3c3baeb2288e9d756b5aee36e54409b84ce89cd0e0e5021aec743bb269a896579ad0824c02829119d03829cce088ce8719b08073924959e88a9059b000229786d093453e588788990f114408414410d8474ef94296559a703d802da941c6df3e302546c0a2e85e39e5db07c64497856cbf7d604b703bd9fbf681c57260b021ae8b9cb30b0f165e2629662d3c5158010b12d789c72683952968261e1cc4a0b4c3c233040c48b5da0a4f0c7a50a1d54ad806881f2938e330fbe890300f0f142a6e2a5bb42043219422c4093fc41e1d142149f861e4835716e2f30211153aa210234184486c2321360002f4110911e2e3abf1d486845948103f7850bc40213c54807ff0f35541051d10605e164070496418a8872bc5ad4bf2b24008e29c6041eda15d6c73031d8a330e730f6035d598888f28864451c427063c3e7e10fb818ca6fa4b9c738610c28fb3e97efb0c110576c1093c24e76f9f217290c410b01864996f9f21747451c8ce846b926390e015e4931132c828df3e3208c20319b0a05b22b37cfb0871051b64f1db4788264372508e10371f217852be7d563083b7df3e42bcbe34d18a803dbdb5dedaa1c27c6f0ecc13e5d0ef9b9fa34cbe737544344c1c53cd7f305ae6314921979707c7cbabea50d37fb0a72ef31fcc883cf16cd5a5d8bdf002f1e5d569af95fa48dc22c8530f9b50160aac8a5edd0aa22b8b520342fb3113f14089854e506c20ec69d5516b328b5d8b02ab2cba24068422a34d5066d4094a8da336ae9b9dc561eec9b8d6aa5bbfa6f3c6bbb7d6ae73d05371ee7126f8d961b25bc5719db5af1b32efcd5a755dc5b6c5df7b516c7faf53259425c26abd9c5fb1f6f78ab4bf579cfdbda2ecef15637f2fd9c4163d6c5867ac3999c5ac371b693581156195d52d0112634d44991371f644a4611e624de7e3c8ee47a79ae072939bb74e128ce4038253d44abd697f17ce3965366cd09a5f58d35553d5e74ef566b5d76a6d083a4051d5e712ecd5e70e266ba0a9ea1d690388ced0b98b04fa3a6d93cc9169b9039545f2eaa16c62a8acce3fea514a76ad2f74a40db2248d2f24d3b475aa7a9d369cafcd965740ea285420e4ab1f80b2a62c5b92e6a1d0f0821d8aea9fb22854a0f3256e9cdcd5f42f94d6a7a5de147214b5d65a6bad956ee181dfbdf7de7bbff9b5a8b5a21cf1094575272073148728aaf33b8a4f1240ff8ed945511d26c5286bda40a87392ec085dd53a27290922e8bb936cc97724da77de32be24d9bebb5f927ebebb3825e9f69de3b92af18caecabb43a32b5b77eaf9cebb3c25f98e0a5fcedc1b58e81974300ea8e33bef964127061cd0cbbce33b179fb40ca03d19a1a9ee24eb4e328a3a1911874833ba2ac52192915b84ce00c64832ba1aea5637f8bd46353148af4498f8a281c8339242a401290623511826b193ec24ab30b7498a79578c4df10871e8249be329d6aacec5238abc18a3ab5311931423c55a35f4ddf7ba5decc512bbb325be2bb1e9a7559dc7c846a47befad76ba0d7ae9fda128db1599f3f2daaecda6e4fe0cd1d5134a7a750b86a77eef926bbbb63b6dbd3db7e7bafcb441b1142421cb03ec9952c6f5d4b3a5b58a8ede56db8daca770913bbfb579339f5af1260695a8977e501676ea31b16ed9b8fe084dad82e8aa0965dd2124f17667f745513cb02bf2a440b671ac75971cd831598289d3e174ce030e16e2265459a725ba20028b25478840010e7571a8b278a841126c48b0fd80040b36c0a12edea88b41b47b11c88a41a478f341a659c6c54d3185ec3d07fb042473de39a51da5dd8df9393be4583274b046921ab51a3690526abf8fe33e4a4990470dabe8c6fc1d72ae5b2fc94a4628eb25e673ec3d1086e237a51dbd5af1a157d02c06c0e03d260cd1bae1e894e72b6301fabbc67394d146ab3c77c70f56f004245b20d9c5fa7c971bdc5bb275a328cfe9a70454a00215b85811334a0a48526129b9bccca19aa20ee4e7e7c78993d96ca644090c0673b95c3c3c14b8dd4af0c4068d76c312771964e89797d74b367b89282999a402b2945c5e5e5c86289097393487845020a712cb8f1396f9539a3fd38949853453c24296d4c8ac3413a204242985c15e25cfb9e4257e92832a0e965e6585ec56914a64399f44826ee90ab41405a6f0cc219367ded02045a60cf22752a004f38606b9dd84f49357172f180f8b0eb961ded020466845684296bcba78c178288a0e9161ded0202e448657172f180fa5418c1479ea425e5e5dbc5c664a15c076dad3ad9439a7cf740bfb74d40b0750408e1cba3572d0a77b60ee744bf4e913085d655fa1f8f4696446572b3e7d1ea12b169f3e7fba65f25972924f9f4fba757298558c4fa73a2e2f3eb1d037f4d5e2e5fce259f3766b72737284be994f9ecc24d0286bd268359a8d89be994b96f8346bc6a8a8e2a74f1e3a83e89b3964480b7e7a0828766da06f260f1e52f8e93550d6016aaab68486beb9c0ac01ea1fc4c04275cff4187d638059832789357df6cdccaca13e2b8e6523b39f4760944579688a3ad7d56b7128f2c06f9451c415169512c9d4a29c989363110eee6360a88bbe288f8bf2b490f47522956e4f6eb72726b10a2c2bb425749649644965b4b944850a416bf0942211fb14152ae8100ad3193293cd21e2076660f2f0327f93c748141ee0027456fbba06e4d98b32000ad53d78c8486114456334356fa8105d439dce9e52191d62a69294a7556215727b497960660a1047b8b7c5822ddf27d3b33c1e4d4472876baa71684795141b86a3108f423b8a3e7c308776041f4409edf8596bed4a68adb51eb61d87834beb127e2c219737085f7bb637e90766adba3aadaa8e2f0c773018659d5c3123b424b2253b4a60b39e9acd4eba53cb0ec84ed72d2a14851f3dbe1d8aaf26b029b9c36ca07c7d7e7b73deb955a439de9d5689adaa7e8bdc2294a5b263849684aeeecee5b9b75be4f65cdb5572975ca07c875cd8e581312b4ec308812ed68a31ca0a8544997844ac894a9258621a12975c57125f88b1cfa504912f455a124dbe14937cf552b489b7af6e27350dd155299a9e549103acc8258c90501dfa601fec8b7c5f548c5dda09213104462867812c45990380728d9142240c4689159a2c06a3048c122dc69690abc3d82acb6432e56c82b17dd551b97dad24115fbd5461f2d5e784111a2261ad320d55168cac53d5672e9ace57989d8751a2848151e2ab93a268551dfa6a1aa2ac0b3bb97e9c5ea72174d53e4bf47c25d58ad8db14a6211f2484be3ced7cf541c2c897279eaf27d82976927df56b4935ba2a61846c745592a248526b1548b5395227854858b756be7a0b298a6e51af2e768bc270a1d4b8de7653d46edb75ddf55e8f4bc10fe2b0dba5e2295e5214d68b97580acdca2e9a1e2a6e5d8649dfa4b875192b7a85e2d665b06877cdc862b82a8b478bbbb8f5183aa9198d0ecd0e0d10badac103f845b74ef39a11eb56cc5b992f4a992a3ccd8f5413658c1e6fbd65091d6f3dbb2a4b74a18093fbd21424e764dfb9a996bb529d5d471906659401a24d53a54c5078ab2c995a4d59b7a54ced8659302b6eddfa0b5d95dcbacf6016b727b75e0ad2ab96261a655f2d4778de92a478eb24979dd398430107a0281601deda287e429ab2be3296c697d1674654abaca78ca9aeb18e32ca6894f597b1a653f53369a228eb9c3812817199241465394e94b15194cd1149991a455999daadb24427a213985107e3bc4cef17b7f8f689018fb72f53a32b2bd353cad4de96b8276c9f2040bfa2d5085f861387fdf98d1df8635292fb4bd1c95b97b9750b7495324119496e1f2036982f593fddba15baf596257af5fd5094ac5b22ff92d028eb658b91b74d38310197785b72220ed1d5138efb689f6727b2e8362a375ef19bdf9cf77ed72bade865cc3c3465330f45d9aecb2f8a2ac95a656584e8aa2cc9649a78407486979b4c90f592ccd611ffd0550b8da2be24f4aa05c9d704708971a605c90cd0d3e86a8649a3ac5b999bcc4de6d62a29ca922cbf5a65bd926aadb2ee5ce417796b950dc9999d565997b97d3add1a1b096f7f7272b4903be617382d48709945bc6da1d9928bcbd838dd58fa96b171badb75b7eb646e301cb4bbb7bb9c7bf77ef77ee115e19009ca308ab2416f5dbc1b89b4c0381197db75ee711e49ce08c964413b110e99a05659ef70f7f20243cadc6aca7af7e2f389bc902538018e8bcf91c88bccedad9760a5986d8264eb56975f6ffd25bf32ac5bd8ed8e13b8705a5a686f392f4bb2b75dcb78756acafbd9448d6b858e9e252759b10bc7608371075c33551de39c29aca6ba6c21a129ca0191e492ba76109b37d6452d0a5a55bdfcaadd71c457b7ae79737f660d0aba7591d0aaea7856f16557dbf1d5f1c875b5cae288d0a9b7754ed0c2c4599155bee46a5dedebbd41e13b5cc5bdcd1b0e0b5d83846e715fb4aa7a7dd22a2b72c93df9ea5cadb230ced96472d4531fcdf240a75cf346035db3a37de8d5f5a9c3f4e4a7972a5f52d7572d7e7a495190a3c8f42bce7c6efed8410672a0a82944713c988705d83ae4f63962c9abbe7d8cb0e28b0cf9d286e7a9d3904105496e9f22b62f6ddaa748eda9d3880187825d08d1a803ac5f17572be186d34a4032840f4db62802873a0c22b9716608e1348e754aa24c3e4584be7d8adcbeb4f131a2e76d60e8563b7d2a6a40e37044ee8e898344778aac81c4a1346c288a0a91fd9b5604203f9d52fb03bc3b3996a254c622649cc5cf959ff3ee68c045a989aeca6caa3e1950491c2669ea1c4e07a7d7da834c9f70e2c97434cb74fae4f1d3f693455d38d4f547e8dcda1187afd78db812874ce260bd62fcc468143f3014614c474472164521f875dec559f0465eaf15428a8fb093732ac2216a00c511396873143903397440e493a4b69f79a33643df3138f99e2fd0e2db35d03713c8aca12e09b038588ab275ab73ea2d75d6917586717e65dabca13cb3863a4f39818c230ac3b99c2f6aa33cf38626e9bca4744444f4164160e28864094e8033222d8cc22acb8664e934d3ccca6a8fed69f50845cd92cc9bda44d750a74fb48a7a479694ba88854c6d9555715a0114a7bff84a76abb83b86d8da40da7901365d85d69ba5070e30dff3e6e7f3bdf9bd40d2e500fd9fe3e81f4b0afce43ca79db7687a73f4c0b5ced949bd22817fda9c284d71b38c59798a538e9e7acf1b32c788231ad53fc91c2394e89afed276d76cb2934cbfaf1f98a71467458f214ce1a7dbc601da91fbf953347f5ed2f660ba7ae2c05a3af4650cde15beec9fefb2879e0a19f1022342bc8c10e2dbc7081b3c754c4352e824a3be7d8a8842114b9080b9db4ddd8ebbbd6d58980d02a08ea8c4ecf526452d192a9201000000f31400202814108ac542a14892059a9cec1d14800c73a64a70549a8b434990e3308a32c618420c20c018000021800c11cd080010fd36bd57fa28c5978b790163696b2eb4b1190dc517af206c1166d3d05088c32306f34e2568982f3299f44c0ffd6d89b9c9d2f19b5a2a7e934bcc55b9ca6e2108e1786ecca6dcc03f0457b2b7444b89dcd1f398830b712e587a3f39d67c8d0a3f3741ae04aeb24d71303d7dfc0f9a7e6584ec4ed576f1ee83f0d5c4c7facf0ab9401f082f6f68a5fb2abda4c833aa795c0962f03cebd00292ddd169887d509aaea92e55c75d980087f38f44c578c1e163cb83fd60202462a801ea0d93552c251a9644edc45270f703f73b80b3a167e853a987e6c6ff1a7a32b43d7976d70e4f35ab3b94f591777c95881da86aaa2de59fc4a13e32f1bb64ea4356c2030c328fae6fbe4b061ce0b111934169ef8a72e5ede0d335ce3b80739d5ff7b00d046508167906fca821837ff8e8ed5f5170b065c8260c04df7e6907431e5348ba9aae4c90cb9fd486786595038f25127df4480e3784a496235410813b90f3b670cd4488069d26cb82841e765ccdc1a8f2e59c68962da223e34d18acb3278063ed3b1eea0ce0b04bd0396ff77ebfc6754e54b11d9eaab33f4f7f91015e2e3432d0dc4911fce87ea8f0a90d6cff7236c0830fba51fcdde4cbecfaa9f69ab821d7f6c9d53b403688061acec7ddc5e4ac268da811adb49c1bbf54aa736693c266a152b46c9c01bf529803c573490f3c6acdcb854c884b9cf6413a47ab2e36ce75930adf8ca1f4f3d185b2dd5ab5e98c7d5e1cdd0fdb4a52771a10522227d09cd0c05c558e96b397b015f469570e428c08b95291abbc0a83ba5595faedf747006c41b5c569c0bfd813c5175cd1dc671561e1b96888e00587aa4aa11717544953365687fcd5e64fe41a62270e0c2258992095b901a678d6d94e56ce0e8cf48d953c688b5da82a811848456b750b136fab5cf2d5d001b18fefffdb4cbb382418d5259bab4ef8dc595b31b18e5277ae8bb17ff1b939eb29eff6f3a7e7521858f3bf8cd3cdb93a5d931c35cd5db9b69d3c108e71b865b581120e01992f61f9b3b194d845f89d219939578d00ed6a62abe12d7a11edc455d85a27693f6f32e0351d6ca121fdaa522ad53ec52b0c851df97eee5bcdafd44d915ee73f1d1f835b61c5ac1cb0ce86cda90d61586b510942d7638bfd0a5518d01a3be05e6d8f80f13e80f984176a5703ef364eefae203ce3e73446ffaf16a899df392ac9868f693271cc0fa0b1b1db3ab14299e44c2b2f6f23fa0789925efaf742f47ec316c4fc0df4777fc953d3464b5f957644ee9cf4ccf5cb7eebd2f6ee224ae3c07d92bbe62dd6c3e18c0d16f3b6d0c786aadc163845a7aef92ad1a437c67d445ed22441b4ea8a906972e0b1640f9203baea4f352994305a4dfab8e70eaa2a52646db84363f9aa218ad74257e44dc6785cc834048ff472516c1827b39ab81e6c7a089ac2781461dcd6106a45d95648e76d32a6b3baaec8c9f90269567b5dd1bfa5576db138f19ec7433dd6fb0b96d2efe4a69967e2cf74270914b991ab3d6fa17e6ca08d238583119bc2ae45490a27f6d6147067f3978cc5c561516e87cce2472b91a08d101f3b4cc5d67893bd7a30941a85219bf1a24dc5a9b8c7271e5360c5b8f23575bedf577c407710d8b2e3b974b8ad04bdccc2f0c1e073540838f5c83abbdff5e98e48da3c177a079e64cc2056826510135c9cf70622057abf873e69269fe38f4dfd4df36c420c613496631c8800d01bc573f48bf2cbda8a6d615f64737ad13d41224ebe6004ce72b8c7559029218afa96369b959ac3bfebe296964510cc9e314b9ca1690f57f54dac946967d7fd447128302216dd3bb7c6af9655d4f1da970581b17a150ab2b29c6033dc5ad3041f4e2edd452308d935e3f40c017db47481cc49c8c2b0b35e896e4f560fa4bb10775521693b3a958565d1a6ab8971198c3a84b1b204c4ea2675e90851d2287a9589d8b56a170d38f986dfe2b020ee1141a3c0e617b81bfb5d7552067157de6f84dda31d800e3b0cb86c6af688fdf94ced3dcbf6de4951321080000b5660f7a4e54db717804dcf95ee876f5ba3ac5bd0e8c38dff5f0c035f489cf1b65855a29edcf01d3c64970a161db6d1737429245818ae72330f1f80f6bd197a449538199f8bc2f0317725783e7ca7aaabf896dd1eb9cbb3ac7271f6a56e0d39652661aaa7a13d30615aca8e1aa5439164e8a0ec372102d064ad2dc7c4db0c6920aac185f78705971637bad805c60cddd26a0105a2779213533db3802b22f24511e7b33b7151fa8ef8784fc73e2e06dbef292ea8164a8ef856f06968952fca86732992678c288b2bddd1da5718bee41d6cf714af5530b87eccd5b7b903ac6bfd5a54d02c21a462c7a8f7fbe54c4609979bb8f5b3430c1386abce3f7c34a9b7e5af8fe9fa78c6b2cfec48f187e3f90df347100c0669826704ebb5816993ff82c326c002310abe85725bcc5d91827ebf6d0a004c5f2b1cd21e751f9905b18bf8df86a5932e94ce2a9d4b4b41b2ea4a382fb50203a86f0f2498645c81449ac4eebbc6fde9d53881e915ec03392320fa91df6b38793be396252c2e78f33576887ffca0d4fa9e35817ecee536272e008083d2fc51694b13cae478bfff8d92a9cc21c53bd855f111579f2e018e1cd50f4daf4c71e9453a4c6b251806e8d90eb695d9ee46e12a9e1df91ecc2baa0776b0e1c387def0ce55f7f3441112eef96eabb63a5250412ccc28b6fcf29709560f9cee64e560db6bc42358b2459a9dfaa245d78c290758e0c7bfd62f8d7b896c36e3d3d9a2c39ed0caa6c6c8c63052c049af92d47c9b15dc4a0b0c8fa5ae70c5407e8d614e29dc4a43336d614304d060e084ec4d0a02278b7a70a9468fc9442311b2522a5c75bb428a7e20cf481dc8bb80d8a9dd852f9d4e0fe83b0897b10eb9267228596c2753ea72356af8641006cc4aca6419112044b1f83b7469704909b3e02321f2bda1ae7be73409a2543b3fdd9e5d2c653275e25bf56070634adb27c000ed2ae1e73b3e209ccf30c1987ad9aa4b4c037cf18826d7363c0dc40a82a1e49736248535935167d7fb0a52b20c5d067557215066eebe1bb278647a41bd7e9934a9dd2d37aef69d1c589c1c2deea2fa89a20be42ec1a8f80d92c2fe58511ae33b9201f23fb68b1a84f719484bf4273bd0564712a2f1c6905314445c69299d9eb5b4dc36a487d2809fc6dccd5494aa9912d97ed175d8b23a1733f0df84a005b22baae334607db518c9275aa77a492ff8062f5f44e46b12a5dadca9338932307d25b10f725e0d5adaef571565c361ce0be82ba4afdc8145b8bff71bdf18948249a7fb700711743d11bdce91f77e1c030d975e2c5f43032c6f7f44b5a6a139c07175098b9921057d0af9a0c274e71832ddd872b0f9513805075e7533f77a8a6393c0d53df05b148dcb7cbaf3aaacf65091376582d5d7bca11d50ca532ef0067c3032ff7b6a195009a7b088e1e0364102b549b4ea37423968dc1daba14678ca156572cff635213b2ed23b1711f43f4aabfe2f127bafc009dfc7722d0ed78c91260e04446f53e28047cd2dfc11e88189c03d22aa6732702522273848014980a6a2c8149f1266aa12756ee7e5d6adc4cd0116d52b1a139f962a7400151061737eab43344778d72dc97d5adcf849c59d24a331f461373cdbe8d136185a48cae0eb2d3845bcce720c6dbce80250c57da4b29f9dbfd3e1080192e6c109c424e1c84ec1d01faf028952dc77d4a278e3cc8476e8379f94f79a57ca5218d8cca1f45641e56fa5a36de9597ae0610fc783a60ff59601526e53a634006bddad3abb8f5ee9297ee743c5bff5ff63883414d99d8a313988da821a1cd5c354aa803058e551921748ade9457c22088d0ebc7bc7f44ab646c8158b49e4bf1caae86d057ccafa5b8144f6b7eb3f28b965592d8ca0555b40dcd73c118f05ebf2a830e2270b21f5813da84e7361c3e8fbe7dd82f522680a5d09d2f3a03c231fcf14fb34f670507a2d066f53a6028458321167275a99a8cfeea5646941e1b50dafa8a5636287e6943f711fc7a02ca5e513ffa842e8da4dd41b502b9422ef80d0f40c41eeab6e1f072f717aec0e2abe457843907b1d83d793e304393adcf54d4f2c4766e52f8d8b0031c1d813dd816c3dfe031d838ba289f9449d2b8914518c9542aa4c1ebb7a9e1e1af8b1d3b0d144107c766ba3440798d1d700c662fccff0c8b3746d4c431b45f06e92e34de3db39c3f4c6973e6af2f11b401b4db3a980792f4042d45c2f7a2ab422bfb22263859c8e4a78126b3a02832e6197aa0c31b36c69cb5ec34445e3f6ff246ded13b13fb161679f88491e63daa054065989522052b3d084575b2f5aeff802bede46586c8c44f9dd41c0006ba5fd49e363fea1787f695b982182786ff7d328635005be94d5918a6eb051dc0b1089a6c54043c298b0d7b63040327667c7edd5880b4421e6f3ab73799100664a1b0e4cc5925ddabd738ed842e0373403902d638d89e8dca38bfe450f8477bec5dcf2e8cf3920d9436d48c1d1a8dfd9136b446913540411a79fb34e6943b78f143d7c222e7417b26f5e89ec68759a40cd77d3ce1fbb753b7098ff53fe2ada9f53b51994714e8bd5ef2e6f5ac480910d95b76ac9c249e40315cc3bdaf71f964dbc733b679340451a19e742b90d2ade744da7752176062f83a7bafe93ea63e64e2a99e4a9ead4689611f918c01c64234a6147983a7ce70c2e9b4667925bcb5a3a6913cbd1f43ac6af58d206816e59af9cf39403622cc7246a6399555a6ca19bb3a48936613019cbd399a80e7c36ae6e29aa8bf8cb12899666b74ffce661548435d1c6d0a6c6192afbc69432a058f855b719da10918013cf365fe776deb2f2b7ad898508e4c6fd6f820fe9d04c71c5945c5b5c1e16046000bf4ecfa8a8bb3f79deba0bc6093a828b8b47c110d32ac3b1b21e5c5223a20309c493449eed468df3507505347b37aeb4085425bba98a54ef19ef1d7e272abfa791700d9e54bfa3146551cd11ade8dfddca927886c83530c39b5ef07bc769b857d4689edc31952c657a3b66d53b0289caa300f980d2eff91f8dd1a3ee871568c5b22a760bb493c3916e10dc2490c2e8f90c5dde93bcb0eec05e2a9d70caf3768006df3d96c155f27a79c844237c1f1872d14854a251dc11112432f9ce50f25c3f7ca051b1bbe54f41adff86b3917ae7dd0b72e2012a988b293a87d44fb5affffcbabf5a81bcba227b7eed0dc012bc3ab147eea09150f51fcfcc540023788b0e20a573cb53032a9db1c573cd34ce955b40f322920e221eec26eff3a153176d408e07f7296e0eb8f4e3302c1236589ad32e294cd1f50e9764b9cd9ec30e488e74564a56b99253b87bbad2fa01471c2ac6c8b9f66aa620def3451b5fe9e3a18e17c59822eb62ede73d803c5beab04b1d7b68f74a87cfe1c278cc9ef2f3a05bab3e459ebb396b74d24da5f02811ddfe2b6b7203b9b15e4ae0b14d5b5512220b343a52aeeb75fa002e507588ed2d24090cf73b0fe0043866195c5026aa65f81033f1df83c3fa6351cf1a8bd8fb18fe7f06e0c8dbf26b40eb08b29ebacc979855e11b81e383b9765e7b5422842988fe9a84a05ef10c7ad8235547b77768ef3c3d50cf61b5cb31ed9c222124668bfef863d36fd673edd9d0057be02c4daa8bf541ec01057dbca451d346252d560a798d00f72df9976be42b234599b80314d2e76eee40013e9e06fa604d87e2e174d08a88c3af8a59e9753d3a769a3581df057c492aac553db409f2407209cd54152da5af0a52ec8052a42936f2b1891a3789288863256a7aa99479b9a86cd433c72cf930961049493bf61433b23031ec3845768caf37159ba3460c7245fadda37166b43ceac758b67813e423699209c6ac5c3a3eb123296f8502d66cad7a821f020a95921f2a089f0dd5e2c1adef061488fa5d64305772775a0c8b1df0c19b0975d823657d66bf0247dcabe26976378fd7986990cd77beed55ca55f1dc42cc05658567e5a7a8de11d76fc2e7e532f190536cab5d66609dec00eb33e6008754333333d8d8b902d54f424a5e1a3918cfc74388ffee9facc011e24badcd8e3c42fc8bdec9d61b212ecc17ab83470829082d65ce8d902d96cfb9f48b94ec6f1a9fa07a3f2342829715d949c08e8c7e8268506e1fb0e6cdb2f93cb9721647506290a04c81d608f593a0d910359fbc10f78e426f462922533cf56bdd5169568a67b6cc7e85fba278568bbb122599f32b89d57426343d60e7c921657d5360344ab3d24b42b01457bcc19641c8addbcbfdd1e6ade41e84658ed0607177a3a9e3fb0e70a71921984efadd7bc0c074489ef04625aeb1fb83c55d31c074e0aef5967e4de2d280e060713781130e0b98d06abc0115ecb459bd3039586e3fdf986c97ba8783c3f49111f6410abf3cb064cf1aba216d5a6bf225f251c7421dc9c73e8167173a79633f198c091059ec463c6ca9ce23f1379baba5908dc2eb61f9abe0773c6899f21bb349ccca4e326b43e65ef8281b1b5e272e58d1d8822b2b29ff834c059296cbc053bb5e84e04d84e32c2319d3273e1371c6d191a229e00addf609a964e690e1a22f7d55a60c161ab82df52b82a951af32aea94d13d6cc421ddbe2cbe205ee3821110808daaa8b439399e581c740884fa9f8a28bd764a30662f2ba2bfc5d30838ac655abb4f7b1171c495952c76fc1c720695783b8c0a62d8697ce9266bd34ef691a97c9553299360d3f65436c955b753a3d6d80b4b6fc2c134f844b93db09b6b75921dbe434f0bed31e904c41b1e38207c9d590ce59ff4e9cba8f2abb48324b7d807846e73c07a6595b4c8766a8b2b36f016512d1877502320501c9d7ae5bc297ccee0aacc7f2e557cf9c26f9707e20075fae0702c45dd1efe73c0ea9064351803e4c4db95b9bf16046d43e64ffe12a17ad0fb5fa7385d948f3c28599adef84f143ba35696279b70173ad34c92dba18426dc6935adfd48328bd7d06181fb4281c06fc8a02e3b349cfc1400eff946080ff25dd9f0b6ead40797fbc58e246073e4f0767ea8f2045f32076df2d05b0f577e59f11733220101b0788b736eba8bd219f3e6ada686b6610688b180e78e03ea305f933ce32e5feb86516043fb5aa0e9cc7bb6c75cb785807730d88fce4470347974bb1e9b34c348437c95e6c464502326a47fab5599f37b3fa184514f908d6d16438a91fcf4034b73ede40ee7135a4924bb39040a9a860adc64f942bcfad20c0c50f7775e2633bc69b5977b78ff0d3cdcf714e420de5f4cf4ff3646f7d3e5858b1659a8c8d7c8d34dbeb3a6431f1a8c93b1394e50e5b6b560124629eb654a8ea9f21739185e8f89144ca22ba018ecacc7d3d919ee2120b0e7a679a694258dcdf50a8bbeaf2695557846279d74c20f9d85e04a66ecd619849191d52d6f42a74172a348b70bd93633ac9c1592d72ef84a6957f27197a03dcb1bbdf51e56f69f87d5d8084e9e60a3a42fb16cee57590b771b7600fe22eb77056c5b3e00258c37e654e62a618c19f67a69caa43ce5d6cb84c3a9c8a84e551509d5d90029c6a519b70d653fb1eecf91ca9b4a67a370ff72e433982698ae436d36efbc23170668ac922c12f62614afb179a3b44f31eadb32b93093eef7a9d112fda05ab2d8a3cea5472df7bb3dd7d296539dd14d1f67b083697836969fb2827689d2ff4fa67029d7ff9fac233b496db479077b6c2adefab87741bec4d193f83f6c13c957681d434503958f38023f3470e54b882d29f518a5a6a04ca8d932bce3699093594a7a2c305bf7128bb8a16ab2686e330689701c66096212db314cc7205230bf2f236758c62196d70857c8cb21953ede69b94a8805e6dd183a1923d88f048eee3bb544d4c60847aae501e5506fcc4db207c9848a801548707e01fb9ce99583cce83dfe8193763fe803ea48af87f9aa8db7b2cc4ac60b41b1270554ae0f9296252fd2a3f9dc0129c17f910977c4adea4f4894cb747b88470855ce7f1143175251aea6fe61c29e4242b1762ab690ea83ebfcb4fb11be9e662d0fb0f85de6c1afd99f71a8fd09472d0f4491998f20ecc0a9f25c6e6aeb57ba2af9a0895e151a879a7b36e6b8876822ee569b6bf8b61b3ee2623097fbafa721772697d04eb42d697dedeef2da66d65633250656e25b94946e15687683cee8f458f6eadfb1717728549ef69a1cecff0e81d986cb3ffd00f7966023ef6d9ac6a6670831e25cfb653e06f242880c101e8064c179db6ccad16cc53f25522df00e303649166fd832d937d5f40ff8f369be45dbac92e77934f18e16d3c3fe2673fd2ca189e22719d09ebc7b47a02effa949f040d3a1caa8327e74180aa197d58a082d84c8196d9f21e32caaebf10f5ca7ffd26c7f344bdb60f047e5c93ecbcb8b13556f41f3adf6d06dda1f39f0a094922594732b6fc3a3d2de0febb9e4b4e00cfde042cb63119304082ca3eae983fdef369e14efb88b6494e2d9d9144bca849514bf787d9b74558acd5e94c011e3dd39726f58eee0f906081b5a5198195bee36573f87e1c8720585e97306172244cbab22a1dd877bdee4d7ed20103954597064f48b2c988b3c1355b31b4e49dc3a863f8f76ff51298a87838a53c21362b42b1ba5ecd1053b878633d3482b4574733218668101fbbe8b93b8482128a9a77b144c563f6c928d9527092bdd929d92e9bcb0f3a26969df31cba9dee0dc68ab46f65493445a901ef105cb0c7495738b924c0b67327012406fdb0f27bee92a2dce7724a698b44f486d53fd6f4af426a9009e2e876d5e7b31c34e61f10168a4b353ac76354cb3c93ed9b8d80f69fa6126d453fca1a30ab2fa2fb30800776284b0a1e40aa242aaae055d766526995909b91b90a286b7a3d3555b7b3d1dc9b82da37958af8ea93da1552175c281049ed809109176244d1b317a80fd64ebc130e52dedf7568686439f310ae59be203c1354c2a87eada2528c89ee5c1d68c7225c719e6032e43e8ca538b4ce795f6faee8931e09d4a0beab648231cc956c1a28605251c16e3737248d6887b4f38d82f4c04f874404fac4d70d83a5eaa6d8015754851a113c258fd199c24a8f3b42bcae72903204084dd804acfb572263be8d544bb24258c6d7c128e42b75041710d1ad1d5893da0d413e85a9ec0d2d876de29a3f6ded1fbd5f8e21f0b2946513148397c54ffc54dd12e84731e0b2444ec0ad1693eb015cd6e25f0ef9b6b4e3eec5effa7ca170ee0c4da0b2f2a22b1794d39d91d5bbe04215b1232e72f3bd3e42b5e0a504894e16e7a103619e04fb278c0208a7cf5c7e39fbc66333e3429abe78a8c7da0a32d642eb1029e0ef240cbd9f5de5bb3353e4ea91d00dde4caa18adbaaece64cfd254b8c812c75406e47d33f6319ce5a31eb40f90ab8a1e13d912777a4a6f143855aeec510610ec130b18679c6fa04823d426a990ed8032409c44461f9ad1213c8fc4ec3e1ba1ad45074a70f0ebc3702a2a0955684a13d7a4186a38e889ccf351906f9f57322c1e266e800fbaeadde7317ac05259d85cd40fe76a191b05c11ada486bfdd363ae81ec3bfb6739701da266c2c9edaa7b8c43dddc2e2fb3887cead3c8e221c5ce5ed7de8e13b7e9953ac5c3072d01664ff9c049c6b0343b5b281fee0ffa4599873f562a9b3680914db7289f6c7ddc0d0ad0bb8e8cfbdd1ef76d16d649480f0fa9f82f6ee0026821389254633efc349efa0d229cf174eb21f0464f7a14bb0f6a5604a06c5a35371e8ee219946e44d4420dcea1247a7454dc27f88c2f90595c25c6955e1c3eae8d349b81f478fe3ebda988dd239d49866a661a9cce6d0ec5d268118bf44d425dff7d1c2832170dfd4f261832c297bd48b1b9542273a8b521d822f2cd837a27567f11b63936e4fc79e81f4b628ed253ed3cfa6566b70ed3d71f9211c4c6f8eed98f66126303b1716428cf32e8aa834d6692e76b4208e6788121eeee17b808e9dc03d848f5828a28024835284dfbfefe59fb2b5c31a7514b2360ca3102c973d61815e421779937ef051c63b4b53df4b1a58740c4a16b1bdccc15779eda70397e40a0e08628104568488ae85f56175af598dee1a047d0cc6b50a48704808c22ca1435d8195d7987c798474843eda7b15796978da88c5bb389d15baee03b06f747e785a8e4305decd6e814d0a4b56c8be3368f5b39f456fe01e3177839a4510aa78cb7a18c34668a5551461fd4cdf065e2501a64b2f6812b031c756b4f3d1bf09f636c908cbd8878f8f9db200f0bba0183a0dc6b897494ac3c53685cbc54af765744f8c29a86a907b39e38a683e3b41d57378eedee9a0685ffde84b6952ec296c956a5bde099b7cdb518388cac1fb2340665ce803335840291907dca1d2514f43441181d4ac4fa6d99b0ef7095a1a681bf1f89fab31d8c932d07639869050ada023fd8aab91a14a6b76502a68c617d54b3f30614d40d57ce6d2b35e94a3371410cdbf6d30a4854ac2e25e4f9a232374a895f8496d9c83236fb43bd6cb9612abc10a1c600aefefe16f2e930dc03d5b812b2c080042de3676feacfbef0d95a60ac3cfc8c6d66c065a25817c20d56c7a3ec5ee830ba7b11d7846da6ab302944d54808855b5629221053e1bb483087ebcd1bd5e4a937862e6cd2315901a8592f247bf2ce52e908271f35172727b19c9c5f6076ef95b29ac002f05bf0a58ac5ae69ff911cb0335da31197aa82fe953238a212cb00cb45d7d1507d0c90875b992f8c426316a9b1aa4aa8ec99cbe103cfc43c57ec7d6c24c710bf1a2382029ab4eab28f21bc4a1c3232d12ffcf28834033f2494aee84a7e96c938b23202f1fa341a4cecdaa7271b67f6265babde73b453a13bbc536b32e595aa408743805fa9badbddb9e2a1c75869a4ecb3c7adf9646b17d4ee5541efed96cb1485de5f1ec89df0b352c39d9c4bc3fff6077644be46c3f187fcac97baf752dd7cb9c816024cb13222d3a2215c0bbb842e5f89687e56c244226b3da6e2a8b399cc31ffe09483e674010c2cd27a80c66a195cea428c21960b7b25cf0041772d438241913ce1e68fa9f53a32f68ddda7904ee4abb47a39bf56c3e0df071b38e3eddbf3be57388cd435a1990431e10af2b90579a3c9a56181b34b30e43a8130522a11aac902fb0c9bf9a5bd4ab91cb7fa344247e9071c9477f12211d3cb025d736d01e751e76f41eff48195f6098fdc05b4db41ba8b44885c50cfb46296f366382d81cbb99f2846729d5321c2cdc6f15fcef5eb67a58508f79e307c5fb3dfc46ad355417119525b1da28a534d5b3adafa3c6906ed60f066c81cba5b68bdd154c307617a578d7022156fcf15cdc98dd7cfaed34e611015427032780ba53c2d6dc62fac8102d188f2e969ba18628610cce13c58057174d2edf14f990727601b1bbce53169e3786e9a173ebaac5adae6a6f6416f283d611268d57e13f31b6ef9c2e84ecaedc38ed6f31467751a5d8b40bd869cba400a573abb39b89a352db4944d2262368eb316f157d873221bc9548ca50012a071f4351050af945e7168848f7ede197446c45b7cb48ab8f8dc125a5a16c7e95ec0591cae95799299f29b592f837e8f589bed8f81bd478bcdb4b7c1de5f7af3f565f0f712b7f9fe30d0bb68eb66a5d53f90ef47e17f237ce63aadff928083a4018114e666ff34c0f7abddacfa1be47ba46e5efd1af85dd2dd7c7f0df2fd2a6ea6be06fb7ea937571f0d7c471a276bbe12ae13832a3a90aba746c3439e60b109b5742984a1ccd46e7e7d0df03dd26eb6af06be478a9bf8d700dfab7273fb37e0fba5dd6c3f0d7c1769b7a9b7f80cfabd5269b3d648f83be8f92cec7a937f90d19bb25b97f332f669aa8a4b5d48b24b0382cab74354da9149e0587c560bc764749fa9483739a8e0895a27e68f4b55c11e72ca75cab3ee06adda61f2b1bc519c85bbca920ed7b3050e2424dcc6e1c1e87e4650461f823c27927a679578ec88ad5c6c92002e44b13caac1afa17a21fe8c3b28b61beb9a25a154be18789eede046e4453c2bc6a63708922b62a190abc814af5cf8e3a09f46e7d340de977a59184faee199297367ec989c9c7bccfbf9ef849555bacfc30c3da5900069b68ac1f0ae0ed56644137b79700184d909136557a81c2b359a1901bfc5395fc9ddae4ddfd61206eaad07b71a0b1ae831ec68a62032dde7ec2c1aa074e1c2872824544026e03eb96e97e79dbc5f65e7c24f36cc5ea0fe47b27edb1faad67d769736c496abddfb4d6b7d9dfacaa9b8b481727db5b6c73ea59ebc4d48479c253f4d2917944d7fe8f0948aa2945171fd8db27adb2b2894a353634efd687d1e62ebf4ffc029377e415e11ae2681c3152886760f31ad3410b9bf521b2f54725282a7f12a612185c83b8a382f694b502624d96a138fc6ce802056ce4b2648f19dc11167b07bc05fafd565974bbfbf849e97158b1621bd8883aef529d78e1a88c2cd42418c61fe89d13a4a6f96d35ec8e2d7e72cd68f0e5de9193a03e0689e408ce4a422e447dc50473a9e042ba795017f0ae27db3cac46e46c1163907f264c0a517d0f2ccc65212a0db08bd7a831eae2960f0fd1510c6fbe7f4ba087fc292588837eb054671f5d3024786207bca46d4612a4b0a9a6d954a0f9b4b4064918854a0d422b0f1c26f6214a91e4b0c5a990b6a7720a7479bb218e76aa6a4a7dc4b3be13cb7b10c931d175c63699fb1077394e72972012b7ce298221ba6ecbc14e5848cb54550015172c82c5475e4567e9317b699156225540d89cb6b71090bd7125acb4b5b4b98b7062ed34835488eec4184deb1690030f1af3382d697049be70db3dbdf15240beae7a6124caea59a9f007b608d437e0d0fe403b5a516607bd50a234e48df1e9148ac95bff456d102c8b54a70bc406411ad5657901ea2509e3d123693ad87584728584c012f30479e85c8aaa52152893c1a6e0bf71867b3110d7545ba838f3128721f6af287e01be192f8cafcac25238262aa003a0edfa284af9365e02cb6284a8b7a592110b1230f5b7666b5daa507429488808da2c7ac9348a61829f402fff928fc3a19db52ecfcebd999d0818ae36fd388b2cd41a4b3d0ae0f2528f2baa20646be88cc933513606f7c45e1829464a0baf7317b20173628cc2cfb4e785892d43520fe9bf4dae5592a33994e0e58adfe2419cbbdb3f323b7fadcf7a1436bbe09c45e297e2129da0e6c71a45d126b8ac1f5908becd7a8ea9b9839c970f9beef5be67f1eb545247fe5575a6c561694036e68a9498f251812fe006ff0a797e9e706d84444ec35e830a45f462a88d947f8f9bdf929d73d54b22164bcbb3c04ce867d79482f58ee0fa5817d22d461567b921a751748e77b19e4ae17aaa75caa46f06fa46efbe1f190049c1083b2d58051bca13b9e7eeffa6802d344f773cbdf90e58ce1c5f634579b4bf79e7e077f0d34eb4db7792622fff81153f3a290f108418175d00a7703d53d3914ae100a41ebf04e0b5f8789c42f3cf4eaa481f38330cb616464368408a35ba3af25b06b8737fee21bec98c16d60b817b97f258053170a05082a47b8eb5f3ed5c2ab0245feb97c9994d6941b502134622bbc3756304b73209d1ec10285ef558696c58c39f0a3826f12e217af14a1c4d22149a3cb31365112bf3e256b47e45fbe21a652666f94be3d4a83eac3037ae7e0422a0bcdd0cd486fdfc8226372f12d577419dbea72795db88d02e0628f5a51486b465e6c49b9e8e3eaa0d6ea954356da30722f32c233806e97635793a98c9cea603e93df44a0df0023f8d0662b6c74f2ce40fa4ba39317ca9b4c86524f90ceb7d6091b38921af608d41d554eed3a76904cd12618ca21376315bf354883bb96c5b179565c6588db3bf82d5d18a903b44f98fbf046828f17f0d898ac4de7f9a70bd86bb874effb090c97dc14fc8af195d8052a6281e121828ea2427e53bdcf69e1cb7e2f4618d2065be3a30db06e081c3f45db60d4f48ffd4a2bca2461995e46c0bd51e1ad00352b56a1851b5543cd170dcb762480e0a86df34905ad3b4d36950045417fc491fe2851495d640e3c9590d7d94052a3d7e718d067082986c773b70b0dbd1192dadbe9035b1b523e4f1e6dc215b8bac1c824d75dbc8c25cc82d8c17f634fe45410227b81059e9d37977e0dce39cc5a768c9a847b82c4ef89569ddf3fc7efa15d1158164133645089a97c29ffa0c6499d0eab9d65d4bedfc0703d137c93d2552d1dc243464daf2c2b93304e21d99de369a59fa18e9c0b40973f4250d0c6b3ecc49c46a5751a0d8122a01cef787653712889513627d78628ef2cd6ea69aedefa9862e7b6a7eff71bb559506c412017ccb171fb3f1f909ebf39ba5b44b3f6b85b27d5010d957948d003bc079d0549bf6fcabb5e69914d66ec76b30adbb75537be241fc9d1865b8c97ffff753893d3f5008bfa8547978f8ddf5620b99e9d55a7ad955ca873fa4b39009e7e30fdcadf6a9129ff5e3f488347886cfd4a0187d6bea6e708a301fa339eda27098c8693152268b099e92c9351ca08858bbc4e702c913557e642101d13e64f323ba02ce1317834a8122f8fb4f3b60e89d0357ef33e91c30d951c11a289a6b09e91c63334d27b2f384d6e7965a920ce3576f2b5c2a5ce1abb126ed47b8285dcc7fd52407d64c42d42321c5546a625bc3b40f06235f8e69e125d65df6854764f5cb9b9e82ca31afde2923f8e4b4800beab0e8df9c86278e810333862aed733a67234eb07e90984b2512f219b5b04592f7072f25329c54e64053d6bb1d27cdc0ea8c3c05df4c9f067f3240e0d58c60240b1bad51e37bf14d0dd072a34cb8e6d2becd68e8813930b56d15474424014762d759520e656c5dc2ab174d49971117e99b6a9f60035eb71a5140d88d278fd0bd44244245417c44ba57552d9a148368c4ac1d0301cee8ca990ca56f707b3bdbb27ec717934bb38656b741fa4e16ee856c4d0aa4ae0594d3042bdd866cd9760cf77a3120e766e3b40fcfbe11d4631dbc9648f63886ece6a2cd1c5c74e16b185917097dfd1e462f5d304d1a820a0f044fb6dcd2ccb4963263d39897767d586a422a5f34a91eacc74069b24d259678cb796bb324b4e0e0100551f98bb45e9450c2afb8ddef09f769b6a089c318e87bc64368b05123403dc1e5ea9351ca1a3cf97bb35f2d31002497579ea19a83126db1390e604fa7816b34fe93269f509fbb47b033b0e0a93344bf2959f990601fd7eccb36c7876189f1d2c1165d912f5a051c9986308afe71ca6c89d19ffd2001f48322ed31bad044b04599bec43606aa56d4ba7b65eb15c2fe1367fc26ebc106324119f05d1419981eb04671e41010f453b4d1de02765a5b5497146916f5aa82eab06024c86a8e52a082b12c319c8c5fe4f506503c460dbefb2e9d9764c48e58673eac025bf072cf927907d17fee2b728f39144848fd6c6ef200b50c4171af84cf6b04992d12a01f490428e99840753bcd2e7e2ed94f94a75a6ff470c91fa7600258de989e3f9ed4dd3a2a7ced4afb5a6ab47a228f92dd634f1d56ca7e49ec3fe2e07e435bbc53ce494a17bc7f6e83784b4abd3de55b6bb36fdbcd3ae6635cf6fb1e682d048fae8e2b49a1d748a5046213641105e0d4b9802805c6b75040a9295e165ece21f92f32d2a7b39cddb7bac4702361513ca369471fbe130fcd84ff1e56aa9b537e425342bd1d5560d3bda9d095cb1878d8af5b8f24cea95d7cffd73efb4c7bc02ec41efd63357c496ef58904d5f42e7720c6599b97f78919c0036325192dcafdf58942a92403ba78c070c16730a4366d7c6324acd6ade2d97d422a93bfecb18e0e07aca9e8afa2bdc9ed54ec792db18c2ebc6c7687b1c14be995c6f3175afbf161f2ac2571b4efb6af1929a14a10ecbc89f4e5b8389b079efdc0d9a36a064060b7d00b0d35b0a88c0ca2a7114ba3c85cb3fdeeefe4dbf2957c66b0ecc7cc78df49ff6e955089db276d2d45ee28ed313fa5decd894e511dcd26239ac358a25fbcf421deb9b1e5f642f94c00171698d024f74eabd4d1d1022b8a8b886540661a94dd4e7243b1cd957432556f576ec5cab204a757408e266a87fa9a2633035c5c5fc13cfd398c49855a44cccc1bdf80ad16aaf5779e176e190288bc6f99a444416cfad66c99ee845732e0648413f4105ff2ce5682f30091f4558edd75569f9699abf344d11bd98d88b89ed2e3cc53df01c41295929eba4417b7c94f5ff4f31e0165de85947c9d7a3924d998750deab9153be64d716c71d3f7410c37afaa269d64a6e0439c3376a1eb8e36dfe00f0d97b24fe2b25c6c8eecf844f82891830c5964639588ca4c45fc046001ce0dc2b83223bcb8f8584f1aa59ae774091f2daed8c326fa202683aa5b283a25d434d8040078f5207fcc4469b5b6796d8630372079cd733868048f282eefce2d3ac2b7603a67b223d385e1f670fec94fd921f6a5afbb314283ec42a770341e0e550089b6031717af0892d64c9e6f1252d049e9a843514074af231f601634f36453a815011fe149305945bb07a3d0510b13c487861a6a0b872aabf49a406343d2b0260aa33ab1a06ab2a58f4fa794dad717c9441badcbf8e14b8e2dafac6afb0ea1d8d4eab1261274e0cbc8e22d73fe8a6e0e41607aa2b4bdbdb1b3284413d7bfcd34fc352decd864f1d5dd7739dc5baafb9cb5221cf4d9fbdec2ec98bc59bbbb9a0f98ce8692f5dfaed4e47612ca7150b2b719371ed23fc8d67ca7d7d09cff62de3dfa31324fdc9a02156d810212184b91ddca708bae0019c0bff084dec70114b0c06a1e5e289d17f09b71d90629f6ed0542b97bed87179f6fcfd23adbf8e6c6a0d736b0314bca2b8a1663a41f09c7a0e799f8538fd3269b078b83d1871775a7b6438fe57c29984271f6938a623cc1431c679d2790d7a017a831a9144faf0e52bdb3aeb04fe7da10a190ac9784b77a5dc45e1e61f730f4879ad1e92f6b756bacfa52bcc42edcd93f97ac1899bae73400cbddd0b0a9a3d2051e9ab3eae798e476fa4a581e959606eb5e1cac620719f3dfcb248035df04969ceda27a19eb7440527e8c68e0cae7c17e7dff16a62817128d84b6c70a350c829ad15b9a13a1335544893efcdcf3273c85a4c7786ed337880e0abc7b27b8d7883ede6a6d674c8011db42f02e4e2159c7fa657a3a06a68d3119b669204e6b38d9556cb589c331a66763b9b16afca724ccb5e62222c7e792655fd7c4bc48ca501819b6a89da3f23df86ce2f35b554d214853acf70e512b8332a2e4a732e98f0b0209c317ab90362a53245987832152afa7135f3f44495b625c2a00fea666fe5a52869fd56add4669cd4cba10c05afd83d50d0b37dc538293b6a3c8bda0030e2b7ad1cfedecac0b5989fcecb821a9e1f2c4fd39cf3d9149bd835b7328420b5623fd17ad38e1cfb5e3895a5ad09980a59b63132fcd70f3479e550722e80e5855d808e919f5192367e9f2ddf448df0a11608c55f96b39512b4a1cdc6fc6e05c2475c24e9691d34a041b229e86e0634f53215af9b73743cdd9d52d22208a047152a02458ff86c8b30dc5cfcf81651de6a76a55507cda0b24aeaa45a2517f6397fc4211d368cce21443dfed5b4e96cb8a28424c226b4e9e7923f032e8d6086fd87d56847e4c4d95ea0e263219362e7887da3e474c30497b418c80f6914ae0d14144ac443b4f450ba7b452157b42954cdea20da74ae95b639a5cff576febd45633a50e58aa23c14e567e2da17f651b9e3835b2da98c456bf77a36f63fa1dc74d4b04466c1f452987a46ccb0f74cf0e3c4e83f906a5e67d7cd2aac5093f58333fe206ab10a968a7b02e70fb7ba8b2d44b0f21464cff168eca8e987b0d609e4d69c8cc9a7a2800b08d16e5e34252d435cb9c7dfd1e4cd6da0bdb02653f6048ec49260c8a723099788e353e098fbb1a42c9bf944996469be0ed36e342f1321485e2627122f93b65ab2859789e795457e179a8a81737a549c7491ad2792a09dabed1b0e0d1598c3a429148bbc0528f50295ac56715be24e8f405e3cd5fc0058e6101a67bd3f77138b5d5c5821b950dfb4513cb27439f4fadf1357ce580346d1ef234616e99764e49cfc2b1d08d07200136e21e41cdb506bc556f55a3371e880c30d27d35c7c9a348c450bb9056040a605174275bfa3497f386318292ca679a48e7488c6984c2b558c63321a6f850e8d29e4c707649639541dfdd21f7efd64457e1c43e0b5b97b5cc76ec4cc2cd23f0800ffd7a9b145b620e506f8c058353cc9ff3679ab0ac9514fbe9a4e3ab6ab5e51b1d825998bc4c1216d031f9367c7a5f71f6278efee74e9becde825b8a0e0d740524183bd1d94854904ec59dff1c7c4d5c0acb1df309761655b4f6c63fcc5dcc15b065d95b6042eaf8e556b4d8583516e981e949fd9f7f0578bfd236841b714d2d45ce81cb634c2851a724ebf6ec05de9aa7e0aca1a5d4c8900fb707b4e09903723891eaef6170bca2e17a8b01983314fd36198303fa25350fffa69f6d8d16b382c5297a090618a299e53311b958a032338f84d81d4396bce8123a9e0dc31c66adea66b91adc52f1abf669c678c41e50bc9293351969cfe40119489ebcd64a17e4969a934a4b0bd1d6f9ab42460700c4f0503fe9b5d47f0accfbc3beb915a65ec0b413cd3201aa1042e17ca5c3b613432bf7a792554739ac71d2784832522a51929508b2b7a8d6e9456cdc69cfb950958232ee1b08f7ee4ecbcf0559c07f8289c42271f522b70c364ee9211aa406cd014ccfbb6d3445268857e5e23842fe99aa8c17428a7d786a96384d10824c08c65068aa75eef316ec8a88dc1c369751669e861da1e2e99fd96dbb5f809d6d44e832eee20c838b5e1053e3857025bafada67342057fa63d669c12444bc0dacac8ab8e7e62d2920ce19ac759c6766b15944c6693e065112f4da299f9e2cb489db7f2557d7cac7bb7db13387c6dcc44b301f097b74eba1250b53ac264668f412fb6307040c5a2311349343f75b1d37645f5799250cc4ba7f92167a71b55ad9792e22042d853d8fa44e3efc759295a94784e11270012aae0f341c4a87b60cef09adb0588eca8ee43fdc79575526a41d1a1cf8969f069a8ee475e1c7000148a17ea0ea34c001e4b0bc3284c866aeeab768a049ec0178ad0cabcf1fb3f404898d9bbac31febe5298520918d39f2304223826e38fcd9d148f41b6c0f9b5d489413d4b666062fe80d9e3e3c34fcea6212172be3eeacf8174a1f6bceadcd6c460b8a80c998be3d721e876afe27795f18bcdafbab084ca31431e62639be7269f85cb3e812680fec3dd038728231f90fb4cc10b5bc540d4450be1ce736019410fb5939006b9c0b236f3268b776ca1af0fa450850f1efd04753040518b9981772ecbfd1d38839c1d01f42a3af7fc527e80c5d94432ac89bad29853bfcd24761a394371b5799e14df37f7fd8de2814b5a0109d743892bb09f2cca7223d7dbdcb9bbf115fd62c63151be50839ba001df9de3adbdb31c1dfa4e14994bc96ea1b7097c5b063d205564cfe659d253eef01e49b7c38afd22070b707e98009b7218eecfbf7af13905b887c8a3b99b2b5442723997428f4dd410afc71b82703735ef7b58c52786b10cc361e0c2037c50d84540de7b0fc0830206ff900555d70239298919fa2ca4457ef22d9e55491ba99672cf7c09c3729d691df32d6729d12acd5aa375c79b5c360eff330bde15c22784f3a3085131a6587d0056b99a2ce0d1b1362a15990bda11d47a7dea1dc3b046e87319d3c48791ebb1fc165bf63d16ff884d5e18149cc7feb76173ba4dda38cee83d061e7616aa452973a13867313e4c5f563546a7af13c5a261d0823fba4106818b8616f6150e01ebfa2ba11744239076ba2ddd1ecee6d153dff8642502020e4c70931f06bcc18820df3e8784675063a9cf219a24f7a08fd7b24e63f19e3f3caa35efeb302925c2a98878aea2b7354454a62692abb37108f8ba74551fcdee4824193155e9e4c5caf102ab7db976a6ec4978c3a7e30400ba14ba583ad12f71287c1d02f356b2e4f81559e6cf3afccf7fecd916ec68ab8877c21acebd055e631ea730e5c1c323809166fc30ecf3a4810713a19846e13f76cc581380ec6912dcd7cd8b52074c02f65b5ae3839051e1bb5cfacadf22d53ea60c72414c4e007c7ac4410812877cd726a62a187d9e0b4e492e976a271e1d981b22c240771dfae4ed2d5e42996bc4c3e66f07c760041e266e3b082a0d4d377b08fbebb72c99206ba66861097ce733dcd729e81fa4c5c585d0319bc66abf65ae68bdd9863f081ce206517fedc24f5eeedb8fef15c2d4ba14ea2cc373fee1c8b4a9afb42ca8ec046f4e0f76bbf94dc39ed4858b942299038b434ddee02f3c59ad9ad360515f842b7c7570198f1267616fab6db83e0810add95851c3df512c6c6eb4ced6bfce1d1be445379398bb4de32b216c4f54b9020053da45ca053b9e10cdd16b24183dfba497c269010c3988616f83934e456833a5dfabbfd62d8ead83d2c6fe50a000f386f906b341702705d29edb22db90544557c4618aae2ced221a0152c306322956bc8eb182874744fefd24eb8a0645103da1cff559e75d8743f6e9b4b22e1e18862f3c529c87fd2be09e5ed3ed4feedee64bf02bdcb4bb5812bf8c461e718b028900b1c2488970f91a18a2901b0b8c09dec00d4621aa49e6e861f6e633c2875882193e6caf1938f5aa5d9170352d1ad43c8ee35c9d67e02c9b984834e08ab23e32461ae905a7e38cebc688697c0c373c3863a63c702f01d5de286adb0e63f83f1adf44ffdc3041afd34daee954145333c055e7c52a68748321cea8697cf7318396afd2981d0344398fae403146455790bc5e52084451f7c35a48d04106ad59192d299cdf86094fd931b60f6ab7ea0f9bdfa40b71b0b1b12b3217d86953570c3fc469a1353e936f56058d83416f899401b0acea740f4ac0ec14b1e55820a1a5682ba419454237c6ad05bbdd6adf46cb28cb694d75809417c8bdcec116a9aec649004dbd495fc8c23cd7086a742c1dec0ac19f1182749623c1b88cc2a7a5616751f98f81f27db320c1cd71e761804c3f789dba8d06b06e439a8bdeb2fab5231577e44315e4ac71d889af648c1b2df6a8c740b076d3b3579df4d9f321e3fcf760ef40114db2869f43eefad8742e93428584cd1f878c10c1ad81c9ae9585a770493c05c3cd02f28b83c23b9448d79eab5e0a994f0895b807120aa793b00ab9a5c9dbcf876f4580be1cc1426d8452c0ce67dd73456b00ee70041e6f7c53a3c5c95565063b3972e419dc01878421d38ec14311cd60cf7ca7aacec0578a5b86a699ed0cf1c2298cc75ba950ad760ce56e8bf4537a72c1eeafb0d7eea901bc597ea94c5ce2b2c5b9a18f3f3b1daaf6a7799c80995ffa4bc18570030241616c420d856717ccfb55d58e23d6246b4347ed67aae11a117559ddc992a7a1da424b0a456b31e0c23cf20ad2c04fe8454a3a84057bc9f286a9eab937fa3003041b39734a55de1de4fc9106828b414f2484663efb16ef648ff902c5713c9a1a428922251592c949b9c40eb4883394e24c3e63f6ccd090d6886ff857ecb73a67d09983e34ca10ac2e4a6b87b2a7191d37fdc1030fc5d54fa8e8068a06338a982868d4a42333f697c4142f79491b3fd8888f901510354fe5cb136771299ea9e5f6d9cba1c6c5c76cce622e6263e6134172d1b54c151cc7148744438fb2ba4c3297cb0f2b561b282c71b6c6fef520994928c98b9e38a564fa77f8ed60a953def5e33ec2a1bbee76160ac3b1bb350cbda96c20bd738d8672948c01e61cfca6609354f0ab41296cc2d9b254c9834464411de7fe532e1405c8e3180f045c68cfa0623c1a940589f62a50e4f92244649649b0f82c95b006fc364719128c6eb3920b8a78e340a3cf93f1902b67964ae91b58a8d3f2ef7708956c3ba4dc64870584a8001124fc46922c181cb672c2a001fc18b7862db0b96d5de6935fcdb4f2d336f1a3573e340f88f259ac1e648eba9d7bd41ebd1661350d0b34856c73f395bbcfb04c6231c89b754cd1b4b3c224cf419e2483a19504522974d5b5f290e54e96febb6c5589c7273762cd0f7ed0c1a343c5248a9da67b0c65f2bb95bf7c3f8d13bc0811fe100b60368060d9e8ad919e60d6ed4a4e9426176228f811ab8683117b22617ddec846549b8868b6ce0c1f7c944e03eeedbf8c22887556a2161d92a2c9aaefd65d6ae5aff70bc1e08622f413084cca6f237c404d49850ce23e2c7aa8891eef3978bba4f3261457940c80266b15ffb10d01af0aa28d8f123bd5d23ef469e27e10bce72ceadaf9cfe500b2c4696c5fff6592c8b6ca706c16c09c5e70935a0008f0f8484b254fb7032ae0420e5dd1f4a2b1dc64584fbe4b7f50dbdd9878a7bebf5391bf8591d11f35cd7123e387072ab26a73a5001b868dbd194a627ca9a8a0864123fd1f16341310f3109e802d8fe7ea463e442073856f5a50e02601010c9ec331980405e37bce4fb1e4d6c89f9870d37389011557f6d848bba88b5d80379d9209a6f563a621a66e59a5f0fd1b2c44b7d1991792dbc62a34a482d220cf5f4d5adca89ccd2d722190100299a96f7fd398b41f515aa962ae93be67d79b03d54edf1fae8877021b9f6fe265e3fd4d44e36b5f46b2fc444f0e2d5a387de1c4d7f31faddb0cc5257bc0e8fe2f02bd68a4e7f386ad0bd844857804f5d01e22e936728c004dd37146da75c7da206e1ca8f3f64a9e3fa5252438bf5b5fdd047630024a6b878f7be017962581b5c20a4093acd49c68a25bc258a83ce56df8a1aeff6387fc79f4f8c682f2808c36200761bafa147fca96e70c67fc16eb24e7c06db4bf1fb4b1fd775116048c84fa9b63296eacee0ffd61237e3f9116e0905150f88da1217d62295ef638b0d9cc462b70c2ea5076c22b324fb2ddda029885f8da5133c68dc204e471c30d5ad4e93d566f003ce196b377da2f85bd80c6ac43547dd7f647ff0d79699ca22f8334a4a39ef2019b72584741c68c53ca68911bcf76d36358fbca95ff62b2041f8852d73caf221f1fbc4b3a48edcef1010337127675d1d58d8c9b26fe46b849a7e897d03e5d64f39d72c2ce41fb0f70d3890df7b40b9e7a61144490c0442f57517d2f2d87e15598c8c0c8beaaf6e53fe60a7400354172dd9660ec0551f054c997d38296da2e3b20059ae824aadde175d45778910d525dd3efda0bda21c648b611701531e47c79d9b209a330d7216b507b9545ccf8563b62ac5435fe26bf60d962a669c98ecdf1fe6beec3d209af6b2ba0704c6113e6f44b19868dc85bf95ef4b4a0c7bf85a884bc5febf820554d817193e2ecbf98561cb82dfb3418f8a31d03c1058a034fe53baaee4c53a1e9e039fa3538140747108ec4420c249ed1d83bf9d6848e688788b682627cc3dccaeee41cb6fc842e950a65cec9752b4603a3e66ed5dad9c9808e32307c5455a35b085f9d42f4a7497b6517db6bb3cc922af8b0e122105cf20c80b2dbccdc3b883b2bb6f868291c64b4a43397085fc2273abc9ee7c0ee6fa7ba0625f4cba653739a8199f4997146b6a65fb49c8a3f46d585bf66d7d5be5ad4d88051b815195dbbb7096e66fb128242d69a9301326dbf4e91f2f699986008bc036efee33ed83d459d28083311610824564b342c413e5d4565ab5b58acdc013788e112b34b02274302aa857bd9ef4cbb9646265269b14e3df1eb1d9620f5d70556930176844390c0598fa8e3d2de8ad92fc4663c9d94caa87ea5f339f58b42875e99a27814e2a858ae119a0b2164576c83fc03c308f0eefe3985873a571972d9107bec267dd63ebc3a37d0b856f5d981a7b40a7c35a8db69f5a684149d6387eaa84989c2f0cb1313810f3743c07a68fd61f773153fb0454a40ef321e09274389f801689c37d04bc48eab06c4c24e04ffd433e30dd296e7353c53198d88c2fbd6d525b48333c5d7a9852bdc22529171695d4274aadb45b96842859eaa502b521423f543c93eaebf0320b07ade8d01814678e933738341e8ac52bab717ddc9dc41de9d925f7a8e8d13a9cbe35b1b3c221266e40b0e4f4e935a06a703ae9ef33ba1a4d0092e5a897c550feb64a219c24ebcf9257db40fef11e78dbfa359ece808a8b1c7af4159df83060b56a2b256733f90724c69873a0da75650bd8dba494df53ae3db6c4be35a298c165123b56d2793dd34c8f00adee5c0cf961a79f43cd6ca2cc3d08732584b409b2a40373380a51e11abe372838723f61cb3ea041cd1f1066b76245cff405a299bc217db4326080621dc9ca13ccefb3e16165810b4a33b5f409d0138c2bec671267e061a9478d94d55938367cda09be11682023a26811634f9aca8a3c1c8f001b607b1f7cc20f5e51be272c531ca07cb5fd53e20df76b0a7f7c9d6af98c62e35af47ba2e518b4a98f5b791a7d40b1f343295fe284838ed63333f65d18c6d396b103223a0c031d30e056ff63a15eaab9df7aa57a2976ec6fbf6d87c435015e2470f5c73c5fd223d01e8e2f0015e18302629284618244203514c6725792e5a3b5ff224373a64e5edf928e0a7222b76f655fd010982b6f7d233d16555aef0d1f1a40c554901ba9724278694a37ae8e0e4221d9c6546b962cfeaf2010154b5a93f8aec80e51d12e861634d28ee7901cfa58a48346138d832bde037adc65bfbac08dcb46372e17cee5ae696da83a66fc69c04a5c0944034c5fd2627237423d17ff5d6d50b0d5680d59f1445cfaeba7d2e7b277c29dbc79537e1ccae4d927a55e45aec39a9020442972d6fb0a184766319d348f026c4b1b893aeb38a762d6286218064765f455a7774cae350c7a5fa55f843f9f93e9e84355199ee7a156814b8dc9cea6a783d244d4a4132207198f945c347acb755dac70d3179f55681324bc58bd7e3a4612c4c1c1cd0d4116c2d169587447d0d14979a81bcdd8f7cadc158b0a5e81544e0d5810c4ff2ccd51811a8bd963ff5c89e5a063d44622da3d9e33d4e105a21dc3a10bd7653194881e1355836b5db700e42c616b62acff95cbdfbb77ca996066060e0e5edb96d10b21e31c71a08e3018b8108f81eb55771b6af7edc4653278037557e2b838a85615f8324c36fd2af3ecbc7b51ccaa479341e1563e8f9785c9f5e122a6c691a38e135daf962352f2a81e1f8696a4f72d89a41650ff8d36c29367ceedbc674324b53ece9bcb0d3da8420a5b8fc33ecfcfc3b03fb5df5148951b5076f7753b7c69f5e44a2081aab06063f6c22a5d71d0c71f245b10b0477b1751e097600c609d022ec5252d5a1e54ff870af74e6664104766407fd04c3905a88200db27f9d256292450412c8487c5608dd68886936fcd7d6f50808727929a1c5e43c05598147e9abbaf6a628f6e2af831e5c141b0ec0613c80697e3b2892bddbc709274eeb4b2d05ba3c3352abcb3fc60c4d2683f6cc772aa3a8d60c97304c37d64d3e619d5a3a490182a350358d449e2a141f935194ef29388ac96e41e2f1753d38542a763631e8116679ed44cc1fd95dabaa9739188dc04113dabd3bc8a7b2c90282ea8393031641cc86e05cac52758e48ab6f0b95d4a58f59d8b06f546c2b814fb531e64259574feced95dbff2fa8f17746100c359eea8e32f8ba7463bb8c40904fdd646375c81682178b8cb53145d845f0f394563aed38aca03330669104ed642679f09bd2515d15c2091808d47c82c741e70560eaab1c25179d9c2b690cb1ad6f35a50f80ab4202571443270d74f653549c9f8aa55267130548081cdf575d24c860fd046fdcd8e224170d2ad0bcc5f6f227301757361a98d1ce38855781a36a3075220288918bdd004dc25912996529875da24ee3d3bec190c4c2f8dec4cbdc7012bf9895f3350dcf9ce741b0e4c7885c8202d248ce9fc328c69e0d110aedbb5c8421a729d78278dad99c7c9c55cecec5ecff3ded1400e76bd31b0ee3c28c65088b915ada4698ae402b9eefd66a36b0a6edd3c7ae80349ec752d72c6e42949d0c6341de647f80da5191131436d63596274567b9f67abbf8703af4eaa74b7713e5b44f709aba6713d66e05d2c7e6607be4cea68b70dad796f449c6375b321c4b40aa74d90c66dcf5cedddf09b4b4a99c46f96463d06a88cd22aa9f39567e7a43490e11ebf4df2ea1ede19818772135ba116a68328a354fdda9511f2992406fc6a45b0bf524ee311a985621abfef69a22f5288b11e403b361c4d96c76434ed3c37ebda47e7965138b59aaaea3393948174a94f9dcbe929c5365b69825c265d2aa8a1fb9d27eba4731b976e50846e4dc63c504092202bf5197b1887deca8e245e545c25a580d3ed3e8a685cb8baed90a98cec1c9a0a5a5afa2c82613dae1de966c3413ea3ab365ba56e24bc9ede4f10da4c3e36c551a4e44afdc8330d7c49442512d5f92a3dde31b5b50b1a7906c6863d638284e15cfc65b6dd0f90e60b070b365f8f243bb4488fdc1cddc8fc0dd3b7be77721169af978daf025d08833a015537af9fa064c818fc71c31a4fbc3f3e812baf6b762810ef27312fae3f4603f67eb4b57875427881a777869f3936d5b02e9e183a1576fa94a6b20f62bb792607fbd583dc651c1b3d13a5ff2df03833a7df160119754536f670332e685f16923a80a331960b24d3051fb9a0a266a328ae3ac0e08d11dac003d208fb4184724a9baae257234bd220d2621ac521321b98e2248a47e18939c807f186684162aa7efc5eab698afaf91cf334c3cc0f051e7c5904e0dcb143b11eedcb4d9f7ab86203678c2dc72002c121d4221c64977a89e0a446a9648a7f90a06183e28a2c0c144a9cf6cc914d196050c7ed8cb9f5042ee139f0655ee0421a2ca26ed2d500217d28ca6a90bd944b4f7e0a31563e966e80f4aa53cbc7019f8bf7dcf29be998ad1ca09761eb9c79f58d9dd625171985518cf3db50d65b8996c4fe8d2eb8529f3371a79d9f8895948facebd9a3b5cdd88ad06e85f526aab047f87708ef1e7e2ce067593f0c82291a66f4b84aa9302fae58b34e2976cac774a44faf544ea3926219e3f7c6881ee7959803d20d29111f88b43e44ed83bdab1ead5d0c500fa43b6f2d3349489a0a3294e1585f68ee401b1fe90bb139f12ac81a1bfa62d3a2f2c33894bd982ce6960179ca70895fb9d2439360274b86869860208531fd934963e6296e52003051bde51755eff71ac318e18ab146a418e3af4304a3d145c46865591e4e0923095ca8ea0b4853d5ef42339483b942f2a488922af87193839e56ca4aa7505aace10f00a7d8e1d200d065b5dbc7d72b960e6345fc3492b6a1d3be61d21d9c122d2bd00deb33b92a969cdda1c358ebf525aed47bcb33c051f7ffd4313696cbec30068bcc8a08068b1e0086c3d89637af00419c58e62641cf2894a60f62e80b63f20ba12617ec0b6319978df99da3141863d8f0b52244743ae5d452d02e62f6310f2bb114152c38e8328ce5824c919a392f45c1554aeb8d202bc998536e0f782a2c42aa4e69cad043d8ac712ce451732842b9331d7d7ef4454c9f5a1316913d564f83ce1069645032439e61c16d0c0586d2182697a569d79faf11f10b3d57f20313b97e0493f95d6943b6712767d03434da304a60e1fe0b75f7130d0ebbfe337cc23b326bca150e010bab1ebe15b10d94f7d8669dea3973245881fe1380f7d06191ea5574284d4e8e925e32458763a6698d995542f0982dc4b16af72788370a7e854ae100202464b2579685349d75c727d4cedbfbc0347268c3afc39a398a74cc559fef661b347d2ac084748c32bebf40f0b3a13297fcce3201e9beed780c1e34523627d8e34ebb84111f7a23a6a41afe61eed4a2c111e66f55c21cc80dfdd50a6ed94b8fb7397464fc9317a63eab84fb9da15bd73261ba95a6dcd7853e6f9bb7cfad218c38d8d0dac2f5e72686d39c8eea280dea3e53da44c6fd500abef8f00149c24ab6fbc85afe6267851b6ce039f2b677bf08b6345c6a8962ef14c31515c6e66bcf9171acf37c45b76aa61450f19a8e157e01bd6c848213f65eddc062608545ef78273b4421c14815fea338f1af204a7546b5a796040f5a9988226ac67a24d44d1ace7a1dc6ab07b1fb2821fee0d8bc41ddfe6269470c1928dcaf8dfd5118aaca94ccafc248e574451e04da91ecaecc63a402e626463153795dea2f0202ad662619ca869f8d033a4fc3587412aea64522eaf4b0ac5f10d1996fa99b548a9bd77813bfa30879eb92ed0fe41da28c377ad4c91a05ed137431002aea782c2f7f5c2eb7a155881241a66ed0e1861522a3c94ca7f506d1d3d6b7794182f151e5769646d590b76b71979444c50c728d614015782039236fc837d69e70473f948105bd32d0b0a19b80607ae1e320fe7a72fb07da692a6a3880628433510d6f1e4454dd8715f3df5d66c4a7067caff43fec174302a1125a077f08a078ca8324a9019cde67ab044fae08a384d36c0242a601f2326fcb800bae754c29612556f4606d13ab2993b92f1757459b31afc6723c606082aa1f84d7d44536da99677c192a160804ec50249d63fb1beced58c7e742ab7a630ee0c939168ee08acd7578d36e701b130798ebe45b3c090e201b26b120992859715ac8b653a5e5e7e5da26e76c4be23cfc5b4cdc4ed113fc0d5abd6fda26099f0e17f08645d137c622b9b53a42fccc11b39ae571226c683c0bbf1a41911b6c25e38aceb2347adaad81682ac0f303035e7806dcb849f9e822cfcc50086ae726cad351ac0c2d7bc2e6842bdba3cacf3aba48d8c607a3af5629c73afdc921c23c832c29333255ff55e435afa5bf96b51c09b6f2ce5eb83c2dd50ee07fed1bbb7dae1ab5f02e841fcf4b896ac84956983071f7bb1201b39e7584616b37c8f7c68386f07dab79f46eb9680f1ea76cdedf08714b2c6c25d569aebe9b82da7331ad22b24a1bb74d8f645b6ff5b6202bb4165a806c82041463030ae22296551058c9481d92c94baafdde08f1f6197c7842891a605fa621f684b0c8bcfa7372e0a52357293091689cecc1fd51bffe60dda2fe3994dba4eac3e87e89ee33edeb9923bd25782361cac1b5ae11b24bc8de5bca94920c2b098c090a094d5976ca4a6d847fcb9a9a9b93b019f80059494214a40043d65f43e4a492990ca07022cb14429882acbf46a866688b22287456fd80da379d9c61c759cfe333b670d103f14ea027b8a017874e1b5cd6e5332effcfb410f3e733a58fd2a685eb0ec6146396a145003edd590a4f3901dd2007d79ffa7b3f495cff90f543e5faff8fd1f51f714083eb4f43bbfe384386aebf9133ee04da620ad7bf061c5a70fd7390e27a0ea270fd79a072fd7946ebb90e94e5e83a10d00fae3f10175138eb38572a21df097a5d74f982063c4708c21062f084095484e00407542001842e5a9cbe415067891798518511da184211bc9059000c2550390a1222083990b9af71dd882ba9eb6fc41f499354e6202529187a255a72d648e336b7b9fb38d94272fad29fc4925b2365fb5c8f6fd70b69618b7b1d990b35711dd91045c295996ccaaef0118779ff395790f8839f730549e9fd73ae20f9bef4a298330409f82de6d038cc7b507431a724e6fc27facfff949534a59fb2f6fca7acc51627e2d0a3f7a6a22b645871456d3693e5e030ef4b6c847f4bffb99e9724ca0e948842118eca1872f2863498d07386135692900499f7fee3bd0779ef960787794cbb9ef74c1b7218927abbdefb7bfec3c96a1127e50bbb08f93f1d7a64ce61fe60d506b48c39efc8e77c9ee56c2ba7d5ef794f1273a6c33cf11de69fa323d361a59c08a9989a3fbc13bdeff73cafa76cf2cd7dbe39537a439abd396e82f3a320ed00d85a6b58ad507aacf558ad481182154558d69d5beb57212e15efbb296d006f87a763ddd7af424c2113d6d55affa44558bfdfebda44a41377a83db6b86aab4a7c21e09f2cbeb55d9c160694d0a53df2f56e37097577bf0b3fb7db8588d035202dba349016426d6ae7b6f30a418d707e15c2d29d405a04714b9a176461f4248b343c2cb23002a501ebbd520d6a204447d3238e4d8b38596469d8044396851824560d5c703d4fe679cff23ccff33c2a0d9b563c2c0d9b178b86cd5bb2faa11851b5e89c38a156d438356a8e854f6dc293bea2889ee1846d30e4b0e9d1a00c2852286a0c6f895a0e6e493354b3c2752710952556f095def4d1e37cd8fd71cb560c7785fb3173f7e83070dad2bd54bd012ea371582b06bef6f2b84c5d08ea739ce971fae0a6c1714acbbeac444829a594d249bb21973b8b9952cff1059dce82cef3ca03cab937d7b5d7d9be9eed39721d47ebfb7cdc4ebb12c92bd9d00a7974ce91be376d5a2b07821cb57d3b77e7c45929a5940b57a2a477da799de9086b07244aa2d4eb97bc39312475d8813170a297c30bdaee95d236463ad239368cbfa7153ff8c099c26df206ae95f8c0d4465efb68d2d5307e7675aedb953357b471bba7dd7b3cb8dd871d166864d133ee84a58b65fc738cb0f42e83975b5deee710977bca0159a1e55ee173399657291940b8a5eb9633318f7e28e5529f255c6a031c540134d2d9ac7b3a1b805780aa68e2767b3320628acf0b3d300c729d0b1361e9ad585c031cdc7edab19a36be52c97a3743a985de9768e89ec661a4671cb809cd85b6c0a4124e9172496fa4490f0d6f3e618d70882491e69cf554c5f4f4d2beff7eca482d1abaff3a1c2c309ff43c05d5338514e092fe024c7a1346fa70092c285cd24f9e5d2ee9394b337fd8e930ce248e0e234111fef8dd3943129384b35a45c72ef0e93911078775cf893938ac7b1d59199278e6e4d36a1dc3e9b69e4f8fddd7893cebf0b6652cdd7f27cb529e14a186d338b77b9550e85f7a27cb2d80c2884856556184dd908675ef7961d8c930a6e04a3f278eef648b06eeeb57314747c689efb0ae1444487adbdda6fcae825b125347843a321d597f592f3f7d7f8fbb4a9cacdf3d0ee534ba1d11bde0b7a9b4c30c35f4d83de98bf87f4f6fbdd3148377250a6e97c43999859009b34099dcf9ff7ddb24fde0936c0b0652d982a12be9752e35c1d0e29c233f28962888812f35bd406f3f35c140fd7ec9d2f748469acc1fdd774f6492fcc38475dfb95e5e4ca6ee87e822f437958c088b74debde785218bf5df3d8d9353d6751dcf7aec721071e8b1eb3afef9aaa0748c1176b78e3142dea1fb25dee5de6f7f01aeff57aab1ffd8a3531c920b4686786ed3428f2d1328862d1a4c0f9a4496ccc8901e15d0a42789495a317ca0e4e1927efeb00906d22589ad1892b46228fdf79f98847e499c2189e395a14777c11ee91b7fce9fc80ce238b59fe23839c461ee857efd43bf435ab0e9d106c5b171eb919b166c4dceb6e6d3b86d4dd690b0458f45534584fdf305f6f9ad2a435f5e41ed36f12236a85cfa3e705a505dfa2e1ca93dc12e7ce8b95dc5db38ba2d7ae19d5cb4c1e44ed30b3c2945e29b33336485dcb953caea719668613fdb4f9cb624aea808e77fcc3dbbbb338ac4e86e22a9e10631a61873ce793a9d4ccfb326e7126ab3d98c89952d4e0517b7042fef5081c57bd8763251a029b8f4151388063cd7697cdae0d0f4382d921ebd825fe9733c8ef73aaefde79734a527617fc3fcbd6e6f3244c8349e75119a40aba4471d72e8b1f2f0d570c32722297d5d92b3850b2a7563f534a44139596ec243c5720f5b71d2e74d85f4869388640bad01c512c3a74f7a4258f28c5a2437f4c83c1d3ba1ac742cf54ee36c4d5649c7544fdfb4529d2cca3215cb3d4ce324d32e0a87b24c62584e2d3974cc4441ef88f0758828a38725ce48a20a279e20739d2b435c0411842600413185cc9f67fe4cf3ef1e098ebfd28fe37564396cebc8cbbf88392c7b791d1937611a941eb9c63b96797ad88ae54c3c2b4921546909e79734acea97a1522d2cc3fe90e546fc478751ff77986db9f802bd38b724059596b0f4524580538877f0f57fbde389198871e777cca90a66977bb6ddfd9da48d42069778b40c43ea811e16be957a1dab262295ef0907ae9222acb5d64a1269d775f48d1092c4d29b73726db06353f4f9149c272ec2923d4a297b9198eb711176efdd338908e9698be78ff97cbdfb5af66d75af733bb1e42f0ab9ff1f84dc7fecb34f2506ae27d6fa3aa5f74521fd1f84f454320a396e82420841a7b336c7712619b8bb03ee3aeecbf99ed889b45c32271512ce1f94521aa64179ea901262757975993e81fa64ca62c9ccf468a80be93bf50ecb0d3242ae6ea9957e92a662f930a1e82223e4075b3ea4adf8ca597a5fb6f8bed40f67f3948e48431e969b65fe981cd7ea163a837ce67a602523d4f2f2a1c2940ac717a6502a1c6aa88103871a38546aac56ab1b3f553f552f375662c9f7c67c9a0a516a7c6a74df8a0621aca763dff7c3acc06c302c1df39f2e7ea15debfacf41efb37e4db68a8e775bc5b5a5a847dacb74ecb8f5d85af8fb18a4263bdada0a189cc1d34596c354e25c28d44bf9cf64329d2eea82360017480fecaa80f888406c3dba5ea686c854e2fa5746b5d660a9c1d231d3f7d7f8985c6f927953cc9b4c2613653ddde28c1e6830c1c749d7fbb833b3db2012547a4093b1e6185c6ac4a819aa11eab15f05147a9517f89d038fd5904eff63680a317d9099c5119a3ffa6b723063353f1deb5fc1d88c1afc611267663d66a38de6a48c381de6ef0a4387d17c6636a477dc76dcbc30dc71f341e87d5923f4b2aa11aa4cec8d9511aca732b9b57c8172fb53218a033fdb17c8cfed1fd2406c3d120182a547715a6a4638af03c9721b0816730671812c0738250d2aa03193b15e475623d43117a363a8a18e9d64f806ac0567c158f0156c05db807db80aae01d380b130153c039682af70141c03aec24e7013fc026682976025380966011fc12be02298081e8285e0270c04ffc03e30139d14a0c0042518810842f03b2c21010f27c85101cfb8076ec24e98c64130148ec2353682a53012bcc32de029ec02e6611830157e827b180ab6f2fd38434eb20cbe1fe7e624dbbe1f87c8499ee2fb718a708c643b33a4daadd971fbaf7a6daeb376a72033be8105c1cb7cc0033a24293b90030736a0810c3c536131f03c858d799e81bdc0b3cd8acf52580b3ccbc0ee78be627178b662679ea3b0157886c2f2788e81a5c0738f5de1b98a9dc0f313b6c7b313f686672a767c6ec24ae0190616f6fc026bc3338f05c033133602cf2eb0aee7256c0dcf536c009e95b010786e81f5f19c84a5e179c7fe7866817dc0331216c8f31116c9b3141be47905d601cf46589ae7226c039e6b5600cf4458063c47b103781ec21e7986626b9e85b0333c07616d9e9fd8053cd3eccd33105601cf4e6cecf9072bc373134b3efb606378eec1e23c33b109789e5902bc8e85e15560857c0aac91cfb12c3c0a6c913f816de14d605f781e6c01be0496c893c01ae047605df825f6002f028b80dfc10ef91058d9bfbdef16754d36007ec40d5683d17a84f5f00dac92672d2c089eb3b01f78c6c27ae0f90aabc3b31536c9b30d6cf9ec633bf05c85cde1b9069603cf34b01b78c66235f02f1bf34c85cdc0f314567c9e81c5c0b3cdee7896c25ee0590676e6f98ab5c0b315cbe3390a8bc333147685e718d80a3cf7d81ecf552c059e9fb0e3b3137602cf542cecb9097bc3330c2c009e5f6025f0cc635dcf4c581b9e5d6003f0bc848dc0f314ebe359095bc3730bec8fe7242c049e772c906716581a9e91b0419e8fb00f789662699e5760913c1b6105f05c8475c073cd0ee09908db80e728b6e67908cb806728d6e659087be439087bf3fcc4cef04cb3b16720ec029e9d58f2f907ab80e72616e7d9072bc3730f9600cf4c6c0ccf332be4756c025e0596854f8185e1736c0b8f026be44f600bf026b0459e076b802f817de149600ff023b0447e891df222b02efc0ef67e082c02feadec4d167661507a6c584d84d176fcdc7ed516a107d9e920b3204d82d4fcf4efb839f93b86760839f9aaf9b9dde64129212c61a894416657c983e03ff01ef8fe9a222775f8fe1a2327937cbfcdccc9f2fb6d684e76e0fb6d6a4ee6f0fd363b4e72e0fb6d789cdcc0f7dbf438a981efb7b1399981efb7f1711203df6ff3e3e405bedf26c8490b7cbf8d9093387cbfcd909315f87e9b9b9314f87e1b222727f0fd36454edef0fd36464e4ae0fb6f664edaf0fd37342723f0fd3735276bf8fe9b1d2721f0fd373c4ed2f0fd373d4e3ee0fb6f6c4e22f9fe1b1f271df0fd373f4e36e0fb6f829c64c0f7df083979e4fb6f869c9ce1fb6f6e4e2ee0fb6f889c54c0f7df143929c3f7df183919c3f7c7664e26e0fb63342761f8fe58cd4923df1fdb71b2c8f7c7789c7ce1fb633d4e12f9fe98cd4917be3fe6e32402be3ff6e3a4ecfb63414edeef8f093939e4fb63434e1ee0fb6337270df0fd3122270bf0fdb122275bf8fe9891932c7c3f397352c8f793342709f0fd64cd499cef27779c24bf9fe47132f6fd648f9337df4fda9cb4f97ed2c7c99aef277f9c1cc0f793414e0ae0fb49212769be9f1c7232c8f7933727817c3f49e4e48fef278b9cf4f1fda491930170d22536f181db905db1df8f43731200df8f537312f6fd383b4e8edf8fc3e3648fefc7e9717285efc7b139c9e3fb717c9c9cf97e9c1f27777c3f4e9093e2f7e3083919f3fd3054607afcf5ffeeee5e24e6ea6899fee51f6661fd4bcc99398052048f8cf56e91e478979833d1604296c3a4c4d608d50cd5dc6a886a8a6a8c6c6636349b9acd8e0d8f4d8f8dcdc6c7e6c726c846c866c8e66643645364637433bba1ddd46e766e786e7a6e6c373e373f37413742374337b71ba29ba21ba3d82c468bd5623b319e584fcc16f389fdc4826242b1a1d82d46142b8a1991339246d6c81d9287ec216da40ff943069142e410792389c822d208878653c3d9c1e1c1e9c1b1e1f8e0fce004e1085571bd1571660eebd7fd1a5462616c20b0303e1fb0303f1eb030413a5818a1241666a8b430b70e5818a21c2c4c11072c8cd1066c6ba601dba265c0b66a18b0ad9d0bd8168f056cab0707dbb255c0b67c28605b3f13b0ada01b6c4b4802b63564836ddd22605b4435d85611046ccb8806eb9a3dc0ba6848acabe600ebda698075f130c0ba7a8e58976d06ebf2598075fd28c0ba8264b02ea118ac6b2801d67583c1ba888c58575111eb327ac1be6644ec8be6827dd510605f3b32fbe2b9f6d533c4be6c07b02f1f03d8d74f01ec2ba805fb1262c1be8684d8d78d00f685635fa47dc56ccc8d8db1b131353666003646003686c6c604b1313e0eeb0762637e1cd6ffc3c604f9b03101b031430eeb07808d81d998d1c618f5b0322b58191e56a63663657664781cd62f5a999e26aef741053359cc5b3b67cdf74e6864730a00fc9823cc1b931873ab118a094d01744c680a317d3fce6c0a79ddfe174258c27a7cf4cc1ffde365616a6f6166306e61767a5c19c17a62ce2863cc98dd7e528d508973541280767b8b246e109edbafa32789b00462330262e358cfb9dec5b22d24ac77bd8be572b1accbba7e9a8a904146ad4d90b245901721eb4b5411aaa844c4b238430e2b11c9c4bc58a5a052d0ab14540a22239c406c4ed60835ac6b80d86acae8187d1d406c3565a87c107a73d37a947967c9c4bc587c5f9af4d8a2518fab231b5aef7a92c90698cf21b690e49863a021cbf13a32976d21713deb59620e23f1022a6632d7ebc83e1518a17f59636ef3c72df45bc2d8ee508f5d2334c473e0cc563be1cac8c9d7b356462ba3fb126b841ad6eff23c569843ac11ba355b546284f39635957bca72cc4ab21b2287f5c3d85949765323a4c3860d0b3c4371939c1c1e4f7ba88dfad029d40ac542850789ed918e8162a5355aa352e88e4849e08e2fb9599b660841f053431c14921427e96ce648f7e0d797a163a138c3e3bb194b69b4498f1da3b51ea508bd77fd8b23d176381eaea735e5568e0acc975c8d9372eb8b2028260127732e76cfc3f64f6769d8104be11a43a1b3193187d68e6a1da3b5e8ebbed5dff85a54ea6a11c9feefb0466262fe49e273b32984395ac7feeb7350266a9ea66992359086f458a5ecccbc9024be486bae2fb9d950496bdc131a0c4c8ba3c190c452e655f3c6d8795f365cc1e8b0bcc3cdb8d91ca2dc8cda925e954dd9257c43b106af28b1f44e62190eddfa469c04b9c47537b1c722a4b0e04a661fee198b23a0a01b50175c80bab88553743fb7be4e3130dd2622ffdfeb14b312cb317c8fe52fb1f47c4aaa3b3de8d62f61a610b739d9e3eb37cdc91e62bd951eeccbb064c1c49bc39ae6b03927dfd7ab3fee9be0e8248cf5377ebaea6196272c357fb00e6a422397d8017440c4d1fc3a902d5fb771339dd1c97a6b6ed6b193887a3da75e747d8d7989e2d7a7fadf0e29afd7eb5f5b3eb6af18f105fed7bf446a32322f9f7e8833f311664c7cd497d58c5b2b1aae2f6b135a5fd627c4525f5629dcbac6ad3d6c932baf77f2b21ead8ff9d37f2570c7a41e18ae58ae9fa91c18ae58ae9fdde95f7f3a75fb70b55aad96f84af2fa15335790ba5aa9d7c875e18af51d48c4b5f0f5164b9a5bea30f33a9d4e9f7a8ef9934802beaf5ffd90d6d263f55bc75e627912c5a8ef657cee3f84e528dad57f319463786571e6c88fa2ae56ea755365fc1e96f6b2f1bf708ab074a2eb443d56e6cf69883a765a892d5c7ed4cf1d5b168ccb9fb2738ea315e3f27b261974eeebe74b9c3d9efef42b1bbac3c9927002795174cb4a44b465027941746fad5bf8c52f3e3dbd27b154c19d3df29f5a5f6f4d3ac6e2cf29fe9ce115c53fd99648d3e34974317aac618fb5fef452e14fa02f66b774a21b91185b3a564bd76254d4313ab2563deef894add2e3457b5bc23746f432b4d01c563fbc219621cfadaf124b560ff1e56274ac3e8b15d2d8f4daf1fef1ec52618f586efd2a3d66fe9e17862cd6ff38eeb04237dc740044d17d3d8faf9f1dbee8eb5f3fa710efbe9e762ce65f3f4d445e7647135e8fb55672247bbc1339398adf50f86e22f2ef3666c1f5f57d8a2984bfbe5331633bbe7af7251412f325ebbe4cd8eb5f7e87f539bede65e70cf2fa18fbfa31c77d7d0fd47d3d5b53cc0fe9962d5befe2f19a01fa82cb453dbfd0e5fffba1c215565861058e078f5f616686134bbe9c8a79bd5e33a0fe2592806f8c58f29f3e894b7ceea4746cc7d7ef769aecf1f5737cbd692112adcbfaadc7fa3d60463dd65fc1f2110fdbb3b0a6a80f23058232317f280b28117446672e179db9e8cc652af27786cebceb7dc78e97a53dbe5eff97cee88c36a1b41871f6f8124b1dc093fd1950cf2209f885138eaf5b8a3af6e232e4b02aba2c17cd58e6d281effad3d777a9c01def127730094b96dfbc0c1538f680d52fab9330b19e3161f56b6d63679c42edf610d3a0dd7ae320f5cbbe1309f347fd7a7bbde7bdfef545fe32055f1ef3c2e97730094bd6d03d89494ebf842fea93f812be5e468ff599857967adaedfd2637dd6974d7bd916622cce90585de2d8637dd159c762de891c563f15746fbcea9dc845f4b2326f6162c47aebb186fc325f56d397f5566f554b25ea98cc161d3a7eb68eb7b489a5b41e6bc97473d26d0eabefc588a577125f371991cebcff2a1afc3cc3ebf9e9ad63315fbf6ae918517dce14c3ebd91563e7cb5212f0758965ebbd0b73a39765cb9905872d592f76876e654b7a4365cb558ace6efdd02ee18b125d3dd66755b1bec9dad0d89cf442b7b98dc78e8ddd8fd83226422e2197395372b43bbb7025f587f49037adde6e444445456c744b8ff2d0b08b104a8f5eebd19d367ff80c2da547efd92d290f035c56c55aa44658b6142aa5779ce3711f30a5ed8145f8667f5fc82cbad7eab53a0dad1cd7d5ca51cea320cff5ef56ab9075f33c0fec71b9584fc422f9cef5063d2fbd304bf881619630ec22acd54da169559f1514863dd23f816196f0f35033a8d1072a0c5329774a398ee338a72e963a70b6cbf1cb261ae19b33dd9f8008671d99e6fef0968675397a5c6e3f89893ca8c9cae3593a46f23c4bb5551eaf3d93acbca5c98a8524569b83f165b5f99ca4da89d5566dee59aa8fadda2a96ead379dc2de14bcd20240175f1e38379aac048483185b6c1d0388c0dff828eaf28dbd74d45faa2beb37d3f063fd47b8fb2dd45d1af826d2ae217c77bb67e67e9a3acdfdbc481871e43c792d2429412f9e653886d3e3d7e29ce964a31e14971362c3e3e58343798e26ca9d424024f8ab361f131c2c257b690a1988af8a752aa2e21e9556c842f70cf508cf4d8cfe1f8fed9b1d22be138d231771cd60651494bf1ae75ac6ffff0b3858d9ad03aa6ea9d265bd65fa90bb1188ca5c9edaea264499b88d47ae4a163ad18441efa6b15f966f20f6d0b86f069f83ab7e2f011494e085968a8c71bebf3293d86e09dd94fb5d62f0111e690822b391e46cc8106986f7d4bccd191c18838b0deaddfcf27b7e378bf385862ea88d0f5af2f4710c733955ffd4bb53844cf4958726d480d386ec3175b8c643043bcbe5823b5ee1bb556d53a25d6ae37d1ad47551721f73766a64a5851c30d2ff83dd263f70194a0f170a29225f3824618cb1127f9e6b07ecf33b158e37844c9c9c43e6c8369d130a44d34e07c9b90c49011852c46a47158fb35896508cea01de845d27a183187d500428b91ac258e0ef344ae31ee27fb7bbd43fad623518f5ba4d02a2d61c9362cb68ef9df8afad9a89f6fad181a86fc34d1801323e6f420420623d23892e9451722cc64303fa43f989c9c2420115424837997cd39c1195064adffb8f2ad4996a2635c7ad6507a0a49b9dd4d6e37ed76d76e57ea47fa91f4d7408595db30eeee34d49d28c85a3f4d487c0a1a55d464300ff353d67a99eb590e6b16abfff6cd99726e5174f96556b4325a1dbdcc3a76fa7e22a8ffa6a9c8e7b6acb52042ff2c5fb79e19f724bae6145a60c6cce463d883b0ac11c299e1084d21df376d1d3d302f5bcc6dce1f253d41d12dbdd7a1d6aee95405c7bb5808638a9fcf8910c77b5f23d4b17266767158182c0debf7ee3479228cadb4860e5b184f58c1c44a162f2cb0d30411c6f062065164105290424f95279ca0e25e99c0445cb8a860d0461bac92bb3be5bace6bef6ee642382ee949c85f76b392139250edb88e15c56975afac369490724a29a5eeed0aef0c39cb61b151a7a499ad39ca962e51dc7ddcc6cd6ac7755dad5d9c823cbeea708236f728c24a29a5d49da31c75ef2e51d4b055aeebda70ea1ec4711b570475e9d2a54b972e349572335d386fd1698ca01c89cbd2b07602edc2755cd0aa4bf863e43c9ed32ea8ebb82ed48b36acb4d16588cf796a1b2a26427e8fa406a9a446c9054b4c51a20549eca85810f223b1521d81a38b4a8a6a052a235445a86a2a225451427ed510323231930a1b6cb02ac7061421b041041b58a488d8c246c416518e88a094d6181c516ef2ac8e88705279e611115eb0f1051b457c717474747474548f2a1bf42913520c7e7a7e7a7e7a7e7a7e7a7eba2fa21cede00b31ca110f1b57d8887214e5288a4a881b6ca882604141f544455301a172a2fa41d544e583aa071513d5ecc651aa8d141ba92aa48e5254487549ad9132f2f03bc0fa71b27a15b7d471c3d6b2ca12620c5514ac345835ee87fbe17eb81f77a12a525970361297852a8a5a2ba555ee8724c4fd90846e5711e459d598509e66d528902a8a1b552847b7bd3c14af71b5971390935c6bacb1866b8d35d60082c7e572d9db216d922c65caed97e2b1c22a84cc47aa2868dc8f0ea4ac9c4789cf45e99c734ed7f567f9cfd10647e6ba4853851e526ab88eeb39c9aa02989242c85c87c37b19595108f9cb192fc52515851414524f4815a5d208f9534e483521b525c504cf756facf102a69610f2a7d0c801a68842fe993a23a584903f65464a4b2a0921bfeb44a36045f7b0802e680cc10a2e4e907146b7042178b32767dc7002842e5d8b403082d739f1921085f52c1f185d7b2710129a90842358b731d008a283020e2d094ed079c2b682283c342e4968c171d1d9a0993ce17a58e809d7048391831853840802e29942f3aa4c21743d004201549c0084208ce8a20554a07955340c82e8a820832743840c448914c6173621298c2e9a8454c61d5769c8b7c3e0a27f0285f173859ef04f7e2f4b18b63b81a0c0724b66e2f6af7027101832b81f8afb3973c36d09fd7075c3fc9c35e9bb3dd223cfa1cb39c04411ea180af945a6f5388e210b42da64294497da1df8ce9f3f406cb96e4ddcb508df9c29698e4c21df9d8f44cbedf0c790e59cc427c4723a6bb3aa28e1888e084e09b44e093ecc31969083217e80842bd2c0a2e3844788054984e1c3942cb4a0cc8842e85430420d0237c4c8fc71814586775dd7755dc7f5a0765dd7755dc7b16ef761b785195edceea9b74493db3da883c708ebc7983b81c0a881d1e4962c21541a1fd779a51e6822a1be534a1596fe6baf1de9f34c4470bc672ac2dc59a690ee20f40fe1ce39e79c73ce39e7f773cef98ce5e5e7eae79c73cef99d65ce39e79c73ce39e79c73ce39e79c73ce39e79c73ce39e79c73ce39e79c2f30b143e576eb58ab179f1fdb0f579acd7a6633277b8a97e3e765fd4b92d5e358fd0bebc65d7d0e31c9ea572bb105c3eae2f8d5c5d14dee93d85afdbc2f7fe37188495e7ef5a517b1c8bc2bb1a7a852342a3eb429341a7e28223f3589c31b841cde20e417206aa5473ddfdb12f4607b417c73a60cfd8f4aff16a59e83657b25f8843945ef858a9a1a9894fad35ac5d207f5b284a42f678886b8d4e07d834e67dc6b98adad9819fb69ba59ae671311d3ab5ef59fab7e822554b8fa1cc461573f4d2977ff22f3bad87a7979a13464af7f237c1abeca964a6ef8433c65c31ead3d51af2456d1478f4df26c6ebf8d0b483a569fc3696148c7e81fe91815c1172e41f1cd190f043d93093ca150a610f452299416d41150b78b2a82b1dc322eff2cfd4c21f596b25c2e0595c0f09250698896758755df0df006a5259e524f8fdd42d27d3d9075e274988e8c65236226f3c4ca53771cd69dd591dd88222c513d3d4da5c7fe26494595c7a766e91e306e572ceacf6dcaa89e8e95282a561a45a5636589875a1876844a544a3da8292506c21471f9c119a3cfcc2f4d2ebf40b9fcfc0c53bb3c63f5f9050797f961885866b5d383d00bc90b513840cfeb3ad42907e8d946a289346eb2cebacc907d2cd0b32db4861191ecd3017a56004998b103037ad6660a24845a6067bd4ecc41c18ecc133d87b9400fecbe1b2a1dd9f799aa8eec2b998abcaa78cfd9d294521273ec677a7ae199272128eccc1f4d0a12774841cc2a1311ca967f28f194a834ac79a86460fee89d291dab9f812984d69d697bd8b12913111a863124af8bf9aa74215424eb6c4b0a990d0817be04353b467a8f54622679d7e04bc0bc934b9d7b492492572bc93e3751ce779a18089fbbbb3b0ebb3365672ccccc234d934a9ce4aaa5ee4bd4f449a8f7a627bdce650ebbc1d2b3e56c99532a7994248e34b456a794ea904258bf1c29edb82fbbf7feeb2ccde8d4e97befd5cab9bd54e477cfc9cea5dfaceffd84b5bebb12b19c62148137a2f04b4fa5b2a1ed5b933834ac3e8704b3c097a33b200e19c841871b3ac63d1217489eb5f04e8622d71c563fac222d736e578af170bb5f9280794193e93ff63ccf9b7967395bf2f53fa148ae734928f04fb66ca10b7e07fe103781b3562e597eeaf5c899763c11526ec7131f4f8e525b49082c2ebd22ab47fa5e9610e752fa38b48a34bc58dc4a27652c4d8256300b7c6b636103861deb9efb12bcf3fb8e4bd0f3feabd6f312306f15c1eb9598e3d327f953b5dda75abb2bd8e30cc71e69c6ee7dd0d07c596bf7e5d875d3903c92a519bba7345dfde9f538e7eda7fec72c927e9d75d6d416613973ebcce8c329a544763c11d2ef7634c171ccd148e9e63e22b5bbd99480e6feda2d7e96f4b1d82a322f8badee93b07fd7a4ce4e36fd34559d5bdb0a0ef27ddb92b1dcef3d5b2a29ff7e2c96e78965fdd2dfcad15a39b7d7033be67df7a5579f56e0d627427a8f89a5ed3a0663b859b78988fd8f92405ae266ac074962a9470fab82b0470f7b45e4663dd6079b2d8396f461b8ca611a372be7510ecf3a76000ecaadff9dc05938fbbee466a4efa9e1861a6ee0984cb287b8275c1132b464793654bf4eb9f565c4927534d4477dbb35078b904aa9fd118be40993f9498222f3252745e6f340d2734c787c6d2ab68ef57b4fc2226ee5f12597c4ad5c0f67e5dadc929b812519b660097c90878c8ccc7389a399b819d724a545f83d578b6e7d93ccd7f5643f65b9350cc52a3dbea863fdb55aad56abc1c0c00c918842123fe9c18e318992c05a549ab977cc8392fee57990be233d25914824195bca7c470a4da715c615fc4422914814043ff543fa337533cf1d96ce27c70cadc1e8b1fe685ba861f53fd3299cf2a8f4ab367751ec18a2110000008022005315002020100a87c422e14094e5a1a2990f14800e7fae545c4e160964410cc32088420c32c6104000010010630c119a213202075cc1ad66ac77a0f508d54bc4eb36671b67a84af82206a4e67da7c365b725c37a3e8337cf8d6e4dcb2cad1022dbe9c540ef1cd4596c58a078a5724029d48d11b262251bba72dc9fcd663575f96497f92488694b7035946ab0fdbebe8b0a8b53aaad45c12302fefa10c798d6af62cf9665d88b0af0b55e08f2a7384bec4c17faeb4df790305149ee179b899f777c767b9b6a7046c84bd5828e6c5b42225946b24ab22bfb2b5980e6bb640f1c60b2e26c953acc638bd228fec9010262a2d3548c74515fb2f039e2fd4ebe0dde8c1bd878f458605cc139df102030511011a1bd0c73b446031a31977829c54183c711ce962e64527729813c90ec1a34f7309a564723cab372951bf6e99e3c29c4a036e7e28eae2a9a4361d60e92eb80e6ecfd65058a87685df79da51c44c648a920981c02ab70c937e26502b1715b10fe4f1067e4df62ba1a4c8cffca17ffe2bf402057631df4d4984591a1f87133429686a2088418f1b377c002ef05028872a881f0f79dceac8c7904af5ddae20651407d8ee646643464a4b53ddc21a7679e4a4f1efef2b9ec1c0239201f0d5e72e2ff7a93e367736eaf929e7d022df157f9060728ab39c932022bc7cfb5105947d9693d58cdde99d33ab8986ff85a06ae78833bf1d2be6258cab5c7eb276d74b4049a43fa87c1df91d640fe4c14b9b6467a02a28ce4edbcdc52668bb46be406f1a0abe1601a1d0e4066718ca7de8533fabbdbceee4c2ee7b9054770e0b54f553dc4ff1465a202005501e724f4e78a28cccb045ee30a42644cc817f7d03d49d23aa9e0406db74575d9cd6c6d870f76354ff2d72925aa0facfb23ab57b7c54c25296818204b06090297792d662a51f915a3902dd37245b6c816b70ae2173102fe1d46acc471d82d078ee9525633c9a01c004b3a96a41023068d9de9138bf52e1ff57fef9b623369a924f477535fbe01683c6f783b07af2e7974e0ec47f5ded542340ecc4c3b7899098b6f08066cd249ed15e552120a2874a79c88e0d910a3e91ca38c9037f5c23fc381de91f756d99fbb8ee2aa9930dc55c1cb68a0d40b960c9d536e8b9660b8d4ea08b853904b465582bb93654dc3fa8046091942e83b2bbbb2d21b8528baff25d02010591683a4002687b068906c8c477a2a92b8261d11953e1fef16193ac9e79df0b5db30a045ac010ab1c0c03247d353eb981b631f9461cab6198bfce30beb4ed78421e2b21fa605b3ef146dea7139659a960668e13c4ab926fe0536d05d68b10cc85fe0437a1776c1d361612ddbee13c587a337920b5290895b38d14d76cd16e5f53219e0e795c5f8d0824c094303dbc26a4949bafa8e3e6e31d345da25728178bab209d68ae64c7072d7551ad1829028ac0c0e124233fab9a8c6c268085cd1cf597fbe6478d7caa321cbb9fda93b99846c229bfc4660d6e92fe2995052dce320c071dcdf4e1c7f96d735798545ae155cf7901a4d864401a7c30aa4de601842d08988be659898cc22bdcd87fd553fb0eb512ad0f5b282923859828d3df151b529b2597fbd7d9b0339bf30d84b8a063c7e1cb789dc11f070eee70e0b01e92ee5f35a8fe549d314f3d05f84b29589018994af9de7a36bce4c9a62f79d955827e95673562034a0d234f7daf11f6aaba13684e9c5f2095f4624fa7cb1b6b3c00891724a9a9a5a081bf79da22aad03feec85db1b7f327ec30904c3940b0504112b9ba87293727cd5b09aa5698db37204b878882d3a67471799b36612e894b976b414d7f8e35a48bdc41b4750d4e043021f0807f61614961e516110121a3efcc50c166f654a545014017216011ad3b44e7f4be4f774b8c3f92a6fd2c57a1785368c6099b9ab8d4f8d3d8f2a7cd244e4b14f72ac354853fc7e11539599794fe59e6afcaac06158a9f4c1014b4552f39c782a6b5bedf5be7af120e5a1695a4bd2a38f95c820b0fe1db04b044f7c5b4e4a1e218c294abcead1f431f43d629672943a10fdc0278cb130643d6ad3b448e1dd969a90db3dc7c7a2fd6261eb936bd4402262ecfb8328148a9ca6d1171e7f118d86fc942f9c4af2098ee04533bd4a1f1c6450c038809730dd90e6d5c7df7ee228f351daee88779a766ad9c0ec659a46574012a7f49a484ed23f222d105f02a9cbfb31df02f1fe1724941a1f475c1547aeb577607d3848086ff269e7f7c241429bfdc11f8dc126f484547d1abc6bfcdfd4d26225f908006ed7d68325ce259628259fe7ea7644e0c1f6c75f6fe7120b50326875cde637a669b744a3a13583ba104685c751c8818b1d0cf04915825b194dd34870848e7947fc13d147495c6fd3b4ecc1e0e92c7804e1153cdde6f9b4ee16fc51cd0133a75fe563f0e034bab359cbc8971040bc4c8315deb9a0331f99c41e23731badd3000806b613cce81b40d3e7a94799ab7be648045951a85286ff2328e101ae07361e2bbf841ff33df27257f0e5d8e7b56e8eb127083aae60415d2a518a9e7ca74c1f671646a25855e3f0fbc868fb9e6b70d6e8a655990e1be2909ed7df2c39d4382e1079549833e593d7d90930cee0d13882883e1523139ad774a019b33f850919828996ab6806cdb2544c6624ce64eb611ad04a1920fd3a524a935f252e4f1e2a253e23d4920f27c3ec70f5bb98b3798d09e66eeaeca8b616cdb3a7de44632033e6901ba21f64784391d529d98f2ff1ee1dd43812876f8d42bfc68d5c93e85b08a98ed4b1d7daf41d8f94dbb4367d2470a4e430ee03ba0c9c452dd028a2c8056af4b6275694097375d14f59a1c8a35fbe8c462cadf2631f85cfdc8d5c028ee9eb147e5af291dff476abfc76f604093c943379c5c9f4e1a8bfd3e61d47708a5902b5cdccbe6ee65bc4de2d4246051c7159a67fe548ada72cd305df5298a13f68742c88a1c0b3211f9ec0b77916b1411781743f4e848693dd48ac5812036c89ea1d702b8ea68164a853ecd1b984861e99c81e1f54391204e0780247d93de349db7ccb61d073f041b01b6e9c5f8cf482196eb8f82d8545ef83a742e4bbe1f7d9b589de7260b5d44e7e8e70bea0fb368f885b84158dd4f1d487fa0ea0231a1e4b61e87420f7e80437192366e7e8b88a8cd1889fcbf07047b868438738e2b91d1bb50ee3701cf97189cb45ca68f4e3734736ae02b3fa2434fa6a514dddbe31dcee1dc90aa835caf1a4e48465ce4905841f66b14cc6a95650647c3fd7eef48284183d2a68133f80015871d810306e863050ccd993ea3e7f016b1280a41fb03e4192e220d8cab405c5fe210ebb066daa1747c88bd9f3c36e3853647d339d9fa3c6c2e8b561cb9425b95d2aa06f24ef4521ad267f269ca48a0be1034417dc71ee36e9efc0f80e0bbf78723e2f7eafa9860bd9a0686682e55db2f0a18e70b2c982f74fdd432e5aa382d370d96c628121602b18c2d26ebad9026706d3d80299449aad4c675a683b7d073524dc486bd158dd3c8d748a6f18948b23c9e05999d45ab56e60417b772d384ac7e0c1190329924a1f774ca44526692db71463a40e005605f5280b4a371ce311ad6af039774f8a6fbc3033ad6bab3c5cd14bb5f46d43fdb342a1c4256a4cdeb8153abdab409493ca2504a28d28db24013bbfcdd2342d8de6ae447a6b5e2a95fa425857d994f488850b428251094977a92359011061a4887eb2d7bf5b08085c25901bdaf5aa78e5fa78ac9711e1f6bccb7d49756c52b817f1546d1f66e742f93e66050621987def24fc2f95f0b5b2e5fd672c8204f01e744d5350d30f47dfaf46519cd8ee9f1315c4eac6a70bb3aa657d0ae02bef26cd03d616e6a0a1fe14d0bfd69a7fb19f7fa632ba0f0610001904ac2c6545cf1422bf7c8c940ff16acb595abdfd2106154d6a275d9454ebba69896c76d9efde2d3360e0325414a1bbcfd480cb687f0aa1873a0c1a30187fadb3e7737face438f6360ef7ae94a313b4365b043e294cf7bde33c3ab49d4f1a0cdf9734d9cccfd8312fe65504a71dedea86dbdb6634acfab7a043f052e60bdcffa65cc379a4ca5d4b323bbd000d06c1d0b1d4af1885c634c063b28afda71f5b82e2597b1c15926ea5730c4d36abdd6e3c428bed2f794de867dadb094544fb51718c7f06f279f606fc887b5469a549c526155b6ca8b2a1ca1634a8d052a34aa58676b4ba71fc410b8546f6242b68e261831b74075af0c22e3ba5a2088ed5fd70244a14d98f9834ad9fc83273a0606bc5aa0fe652b4625177a637915dc45a8bfb41afe9e2daff6246f0800de02d4f64503a0349166536e394fe529ff46dc827b2d92df888ad452289ec41636b4209b2a7eb9a8c853dfed592270a631553eca283e9d2648a6486de4ce01da229eb1dd1de8f890fa857301d6ffd0bbd79ce4a452c932d815aacdaa45a50349a451028c14db9caf45c4e1f82ed0ead0184a1c0a92916d3a7659d51990a96ef8c55afb30fdaae206e2d6d0c06ee61f4623a61a0b7adb5b176ca615ee20e3917e2e2b16dcc2ed0b731a08fdbd5c35f8d7d3ca0ef968be72909bb0b583dccb5953a7b8cd10f7415ccbeef088473fcd03c71a8892e5ca38e3e86658a44c70c82108190165d135d0415ee7e5ff4f6ade192f101605adec871ea3d8eb841c019ede1a5fc19a828c03be719d0a471ca23ef68f459e823ee6d0c24e1bd406e3ece2085edd124483a91df51907bfd8d4b1083b8c194c1eb7839b6474773bba03ca0114da4ead764b9a0a59f155c1c9fc55d36647a3e1ddaaa0ceb70ea453d21f941b2208e5414e3091f65663f7c6507b74b0e34ca1aa8a2be72f39d6df56c05e5105d954e2d761d8cf508696b1ac46d5ec2d32f17e9713eff1ac4bcb703dfbd0e4e2e4b92e2ba8fbbc9f781d26ec431a5f20b1d8f9664b93a7f0be650c33b17729bfd5197bb666311e5898819fbe4c09ece0a1fe708a3fc467a280682c9a07b715a6758aa6a030c40e46bc9f8e4f3375a15c149c56ab7c91a6bad073cfd1896364a85ba97c8bfbe8988601293bb63abda2549392836ced5cbb1c5db0400dfa891f64cb08be00b496eabd7670711e584a4df08f53d35431e0f4241873b06983136df1846a75df688cae04e13df149f4ef1273a060598e840b625c1df0b313eb727a6ffdba9e965ae1bbe7de57be0d4f8d044251dd411f6f89f063a74fbd974f4cd36d777b6adf84b64a33d1bc0fa9c2d4cb87811f39b022bd8b468123b48e4e939e2a106afa224561dbfa1444212c98326752a8017912a295eb1143c11da20472cffedbd530d47e4682835c61ac8a283758e4c8426365fa9481b9ba08d5b39fc4837d1e5d224e084b835f5441ed2e11f74b571db5f857ebaf82e712ef96c1e80bbabaa9153f62cc9f7f45589f83cb407cfc2e38935bd2cbec907db8d1c68b3c34855fd11e4f377a72861799a47eae97105adac3283feb938262cb02b17cb3c1aea019cf9cb35ffd0c9b3a9e5860f399e0ad003c97051335b3e2e204c3ce4f484307d12213161277dfbaac48be9bd949799396f55ceb0675f4f00f65b08a659c61d93489973ea244a2b32dbb0c80c4329f70d4a6c962bab0536292793955647f373b1a795a90162b51b97fb77a65301583915023bfbe05a576527cb8541340fd0a75dc6159571c56c01b5eef1c00de38e52a6fe29c0056672818b13ed0b74d652eb8588099de03197b18ac287937e0b265c05ced653c96121489ddc7859ac5f9c828920a8f2204227064c47caea9eec1a7fc4f69fe4a0931693096af84cb698f55ca110dc82ab6cb1c1b55f0a96690a430a1c59d942cc814eac6ca791e29d6b5a6b1987a96915107ff013e3f0f44d381c0237a396f35eb90194289698518db14c60d3c30d8581ed0dc788f8dc1a4a649a3d1129c34f26a5916ac0f544938a944c7671a94d24c78163c4fdbe128ac8b11ac7a5bd7fb19855b308f8714dd41bf5c6b70f5111d6c46d54ebf577cc5d5a1fff825d5988b1a70bf3a65b6ec79ecf4e9bf0b3c95e51542f5d37861de7734d5c66c088a2c11e0b509fed5701535a63db238b8b02b68de3152bb8a5435622f41dbb379cd6ccc2d6bd7ccd3023b706a7e2a5cbd9d3c1181ca22a0aa0077b25b498edd511fb851cb90cd91d313441100f8e12a220160530805093e734cc102a98d93f9926c2622392a4be3b4d0a4139ebb0bce70ebf9ad02d3c69ab9f9d1ed8f3aa8a6e69e000f2012de0a6f578db36ea69769d617e125865583b46b07327a0e63b9f80d5e5d18b8c2159e51e42e8b105512ca46fafe883cfc20c3538bca65b96bc2b336ec2b20cb8e1d569918ae4e26280703549b4389248752f63c675be5b28fff4819f7a59a6e36e64520c27c49e95ea0804e67e4752d6e6a7e80233267cc50a225a0b27b70d50dd86c890fe8d80073f537a67f05eb44048685e83372e4bd82492e20a5340b1ccb084027784e1d789e20ed63256613ad26efc37ca2ac26073b6855c6d68c02547073839945cdfd1df36344e65ec11c59d484fd92c861851e85bf37feaf560cb18a968ff792fb56db107d5253b696164b6e64220f3e9b9fd66241ce20c6487dc2a08464cbd322f6190a9882dea0d2f9076ef65b80412f101b706dbcd83912018263b5e1f17ffde3fd7cc817a2024894ae20314607a084295e41a4273f4937161de20c1fafc730ade803129a4c2f47ef924a1adcaf63a524e6f6b650012905fb759587336e8b590951444e5d2e16209aa7c7c6469dbc685acbc67dcb06b962dd9865c8cda666413d6b7e94fd5c13ad10480428cd5cdc58d3ace348c27156368df9edb74f60427291681b00e6ea39201d8e190bcd4b7110ee79e4c4a6ff36f4fc32ac03b4419b0133649b7e12a441e8bb3f0a99160178851a7d56c14fafc87a950740e48277da50b4517a35ff024185edc0ae400d29622fb7ecf36b1db057849c87809cf51ea34b6c630ef4fe92a4d75c6ef419caf60d3ccbaa377214d9c29703e126e67f9eae6778f400b4c1f51795cdcb700dcbfa0a031b76e76904bc0cb9514d92df84711932bcfa0d5b55a87a216d3f37f69f3efb536e85152aab877680a3e5824da8b1f265991c7ee9de29e8dae4c2cd81c80c2b8f6336abb0ed9367acf057b381b47b3b561bec8fbe14bc748d47341d90e2a0282a4a6ccb3aed9b520fa053ba718e857206d6f4d2475b452f269b0b39dd6d9e6c2956b3cdb61ebdf06d73fd3fa859705348699d0c10750c0f8273ae474d74e7970da0b86a5b8a113fadb860760df4fdc7e2fca2d977a84047bae149896129b675bf15ddd890f37792001931bf6c7b5168d5e5b30b7f6806e8dd0a5fcbd84c38250c7037aa30259ffcc8ddc1131e09dd3e00501205e642fa9129651b562e516d8c6081d36bb5a999f8dbacaa80e81e7775819b36586241af03a2d83b405fe850300d6b538f40dafe5dd6c7f932401c685c3489ff0308b76e072a4b300c37ff0d2d79b1b5ced9689bc7ed8f2565d6662c8c139a99a4a0158ff27b248f13399d91200eb6a4440aa2edb6eb552fc60fbae46c11941a1ba9c65704eb90042689db538921fadc1c3c1e919a42490b69ba1ddb7e702dc98fb340580f02c1b808658442bf1ca1bd222b39eff8eacda9066ba1370567fadcd65549d821deacd3355f1aabdb060d11bd4a1de31b57571c6fcf6f84fb8d063db9761ba25860671e459b309068abc37b8c3a126c49b822caba75648661bdc695f6248acdb22da30113441a64a91264c89217c12891aaa0185be68f7d70f7609a03440b40cb19572b0e403eaa042333ee96e656049d4a07bb9f00f922cc56b53252c937cf65032b9fd5a2587954d111e51191c6ad97a364dba14f6fd8b4d54736bd098b1347040e0f401ee210cc4a6d55d2f9aad3f8bc560947ca966133f736a411e23ae4dc40157786aa14ee48aefaca331117842be5c6649856ac3d6a68d790c9e3c33100fe7fd354223b0a83886830b96e4a9236479780a4b6da377cb24329d23054c24bff374cdf605d2f7c14dfa2054fc3169b76b11ab602c34ea0507347377b773869ee29a17380afea2991a208a5f84c095219376a5aaa23909a501dacbc7d430c5762e5a324250a90b3360bf7ee59ce70a2ff04704910d26b070507569c58bc9d37b242b7c309eec65382f1bdfb8eb7f7705d0e259dc94bdfeb2d7dee2fad3a3b0b79fba9b7df9689d95ec09b1ca8827ebdcc622f79a8ac3854f1e8a62e11c65c56c1e6732232d4133444306fb22d425a8de0ecf2827dcf074894c50661cdfdd7e2d6758c614651c412f100f87a54921b7eb71efd7b07d779bfe2e08ed2d82ce0376e059e8196b32940eb43ace3ecd45dbd87072251ad4dd8e56dc6dbdc7f02affb3d5a990dd4c6e9811e6d530436b79079a60b02bf1eb20d42ba1ed234881e10041b78dac4c04a0a1f2a7d4c01d9e47e988d749eba5bcb19a706f1423bb81df8b264ab42167accb4088969b0b3c4d284f110165f236e2832c437e25956e2f60fb77dc56eb30943482e8a0dc73ef7c79b6b3558bf07658c093d116d263ff5216923c7ef476fffbc7e73aee709dd7beb642e812dfe102ce099350053569fc52182126f1b897e8cf7584521b2286b47efa9bacbbcecefc980bd642299e971ea5900c4250d53b257c3560695ca1cf1c4aa8e8312d26ee25584cf25c0b0307f68f17b05c0428625b1fc01b4a70ff94d124422777e9119623959a4192be4ea100e348814368c57ccfec67634b2ba8f6c92bc34ca96f1da78979b9b0c4b9f9f4d576bc8fec0f9c3bafa62e96338242bbe1c003e599a5a42aa9b5709c34dcd822304202de9e7d7b7296c9dedad63a21eda4c9d3f1b5c0f4b2e3ae358e00b2c7bc1231b3cb0e37fae2814919585a9563fb0e9c8b39b5d150ed727758919541582164da5318a542a350580182d59edd52c01adc0c0a97311cd013fbb08b710892a248da8180b8b84a5e5a4f19c9b24189918576e6a5339f740deaa6f1bf95ab42bc607e62800044b714482ddf46cf32777e5234c0a7e3420d72851f47fa1a46de3e059277442f17c0bb22b8d78a8c868efe0d0ac095f3aac80b1420996fdc625784a5eb6296ec20a1ae0a8105a2dd47756da1810aacc0390ff5632112b20ee5f6f418294e78a8f24b85f7ba12747492169fef70d0bc91c668ce891f384119f65f92f8fa6c34cb99ab7ba7e074c9aaf7546def7acd86125f5400fd6179333e04d64aef170d812ea404259e13ec07a537cf3c9ad7482f1b0db8ce6413b94ba53512012ec5d8af0349d50698b879ee048cc63b094c4b50c0724106182d1eda3b6e60a0986b93733349d78e514274eb4248c7686272150e0fe1c581f9d96c61da004af640d353689447a1c96cbff154eed9c909eb89a945c02124b44ece515f0ddc35557cc4f97c9c4c4acadabf6482b82ae03bbc3c3c2519bf8241e8a9517de9909baa76fadfb06cd5cbdc25593399f534f9e155642a00f4d540e2fc9c2c93e9c7f82a16a46d190bbb10748b0946ab7d7c74c041f5c659cf8f81e1ac8732cff52369ec5a9e8c41f31f2d0dcc1abd9628af652858d69286a47b20ce2eaf32dde5fb67e683b59f6b2f2221602106edeb58dc54f9cce6ce3f56fe45246cd7661998f7e58200d6f1b42bc6febaefcaa96e53b3408ae5d6de0fb1fcd0c8d1626273e13e473eb1b804ea76fe83855cf5d877914a8f190d59854924d52c6ad4439518c694cdd06deeb25b9f15f1186112678c9ad36772ee66e79eb9ccfdfd5f0a266afaa0513deb61de15b81294291aade0f4b760fa7272c82b8bd6478141cc3336b01262c4e8ed20dabfb53111a7e784856805e41781e9dc943b3b7b0b8512137256019b33bb617e0bc0cee7d07e38a365562e0c38ea0799bdaed239c97c3e0ead1fd122937d11fcab5aee3a2bced546289f4574baca33cbe4bbf518442d452e907574c2f7c5e2fd6b5b085c62fed75aa6f6d92fcd975756e626cb81a93c4cc20c3960095b8568a77d764585fc8b0f8b362fd56f6f651fb106e41e7178f1903eca72ee355a26677f288f8039e8f21f673312819141520b736e66997d25b3526dc6b2f9725827b7584847433a85d6edd96499a458b9d4063e45325461c7c31ec82d0413e7fa70603b3a532196a572cf8a07353671aa312fef057dc22e10dfa83f054a9ca3ba8783f8bb281527bf6545355098bff90ff7aa07cbc279148f5e82a74a43b28a95b656e69338a71cbac6fc65bbf6827d0b493eee0cc078d409d2fd66a3b62fd43af10123dc76b2992f12003618b92050f34decc973bf523df4866e04d80d22df543382e1221fe72644c980369abf514be0524105bfb874bd424387e365193f61417eff36cb3602071594691f96848b67ee22c4afba757d40203d00764443c5070e551e36890110536ea09b83fdcfabaa85ffeaf01296dd08ace14e46fdc27a04aaaf852e2f970d1f98d4c3fdb081584c87a1cf526266550459a94f5e1d0420048b34c543acd0b28753e38c54c949f06246ac8df6f252acbdef26746912470f2b792532a49738f1a50b2c4f8fa6d883e399035fe5b92a99416c89f31d0785cd51574d9540e25b846aac4db0716c8ddc12ebc04fba30cc8535eba7064d512b80b172765ae71390d7fdb5e80c6df0b05be7db90b3e53cc2f9768d5c17225b492fd85fd6372e11d262003128d4a1655eae6ff45488c81ddbb05d8dc053393d0e3c647def0a5dc202f74b5877c2e25db419db06881e800e353a6651c6d8c88a3003048f0727f4d9f2e6cb6c05defc4bbcce26b0dc04ef6c372703e671319816014908425e383612c5a843403228f39526badeac114a5422685d6992ddd7ed90ab94894a9406e8380bd3bfa634961d638c0cb1e94e35398393bf871b9c82f9486d62ddd5579ef00b8118096e05392a3045cdf621368164438254a6463c190c373f21658c4a2c9bacf0f785f20e38bd6cd0356c81009a1e41fe907fca7d6102a2ac5ec6da8507ba3636a0db676e10edc010629c5ba2c17d9382ca00ed201b997054bfb06f6581198c56697707a681094b0891a41e65a1f00f17ce84388947fe061b544d0948578e0991a176e31caa9bd7dee68551baeed9334fe8504e450254525379d41f48c11727ff87569d15356d551b26adf1bf65be67e20cd80f8dd5d10ca14af3ca7353f8bb866a7a4255bf988a0b4d6fd52f95ec9fd8637b2e3e439d4022e62dc0e65faa5c7c103e1056f2218c62b63a918c2fb3b561fe9ff0bd430f8571e483f9d004253e43258c82df419293f3f977e040e35c49370cb96ea2c556f9455cb4de7f66fa419d1c0ce3fafe239ca3c6d56586e079613aa836ef0d0eb9854de1b6f5cff6a74b11b5682008b861ea2ccacb1f88d3955580169e939d2012b3f737bd18dc38483ecd3ec0b053f329b4d53479698a4fa026395dc46dff994b98f1e467f9c0a65c8797d26510c0633ccddf6ca6729bf8ae2497fbe0a34a39a0e04c4dccc571c9033757538e159158530e5039225c368bbe8262472d27b06536879756e54a0def6e466c94c181a3dd4bd6597d3d23223ad89fb1c9068d79db2a4014abb8088932bb0cb6b4503bc315a3917c4ece0f838440366096bd1beef6beed4b5012c17d22b003e83ab22afc5f45cf7737ebc97549df045cf44764d1f9f2aa023b37bb655ba9121edda2c163f192a48e2f979f5793b90f716d4d164b58453a5b4d96b7033b1e209ac3aa6dd47f309cde22273eb3ac1c54f582b63a3a89d96b9a58c833917ea1355a5799750eca8bd59bef8c7fe088349b42e957becf45b9f7f81dcb56cd0ad4cc65a4855a04530aab3e100d279c223a058a15007963a91f386ccd7f62092820407d636151b782a6d23a9f7109d1d83d4b0e118802e464cf26967ff6d131a730582d544d90da33ddc57ecd6089d2f0ef144f5c81f0638440813d93f2ef402940d27a051582b09201a3ec4d010fe40f1244d26c55c174a64d25a7991fc604ffd0a86b4141895576fd96c71820b83b04a9ceea34555a4671f3a0b2f2aec6ef43461925f6236192b4b7921d3171f79a6a456d20aebe367bf52b1ea410a9caefcf529c8809bb9451a9f15190c9d39196c9f73eb0e2809d9a452458db662d0cad2bd3c09d97d56e9a06eee6ba00d787e8fe2668bc168f0381175785a74540a88595c30f61415eda7cba32f8d98f70344cc8f9be75620dbd84f0565c8c0fc6eb5d8c0e7057bce9a0d1a966b9efd3ee15c2d97f340fde2d63d3394f1091449c7c4a7af82f9c570f16864f84acd50b41681dbddf03c3c87441c681a231ff46cfdc9c2dd95782cf57a39ebb1089f9db96cc750fa52e7e85dd9b6225d9bee41880734a6199fb5bfd542228de73c84d9072eef11cb27812de22a17f31424e9380412b57915c39d56f5b787a63b974d819f07310386650e69414151c1b8d3aebfc684df85937e686ab755a2637eef4bce78c12704c592332469adcb8b4f3d5f9e0749381faa901ea9b9a3f0e13b62fa1118b5d639d4085d7d5d884bae00114a6f894eeeffe0dbcdc61b9bf1e761f09a6a21ce19ed95b07bf4884c926c96bfaf7c1779b3236458e388dad75f304112d48add9843d673380fd7b36152c0e13db7b58c168aea795806d9bd4f50ba0d1ce819d4c031584ed08846f4bca04d9ac890f6d316919a798f30872e6f1eeda00a4350a350e1cddb36da94cfcb292da9f109ac0e9107c02777ee1fe5dd7ef25d5474ab70c80580bbeb3642f657637e2ec245314f48b284c48384e4c24899fc0966342d456f41123a0589710f1b66df86711ca3f82589f58125afcd97352a9bd61b7735862c830183f2a3bcca9390f023131e58e84d4174d1f7ce3f77fe2b85ae4220402c8a63fb9a7edfb3a3e5955f5e502b4c83a0b8f2e83d704488d57cf19872e61c4812305f94791d37c71a7370bc1e5d7628da716693df274819a63bc11025c269725edc25d295e83a04c2765152600fcea342f0fbf7d436554e0b90be32c84fc3ae26ab635a71475a68e8266b97e0d6c3d6630f1c6130dbb400ef388da9c47b8605cc90d4d5c1f7de05a809b4eaba22eb58959e3eaa8e9bcc2e1e66f810e3b071f1d6dc10d642be58bd4ea26cceaec7f390f78b3a350e801a4e19e6db9d6b61296104f680caa40d1bbf2e0ee7414d6213cd5ecb6ce0a6c5ff3454bf9b8d8927b02dfd4607c10337501342cd0d1c5158ceafee8fe75361b8c19cc0c980c1652e1fc365a041bcd49052170ab07b0b38ac96ed31b0030dd100c03a15c5db72725409df1dd660532b5dc00db06706ad85c39e461a90752d6175c0db393c3381ae08b9c690cc38162cb4b9c450160d1f4518c3e718c754c91066da4847e3ad7615ebfd1ba117028be2d076c09c770c8fd65d78e5aeb14e1b6c63dba1e8f9ab85c99330f5db34cf91a328427d568c474bbca246cff3eaadc37076043a092eaff57a79e309f6108ba6f93bb9dbe37aa39158758b9bfb34890877c27100c2ca3415fd907d37d0e61a1252a54077427a29fbcf9667c0d3a6da710818886f24616049ea760d0bbb560f11091b1bba7e1471bacf21dbc4df0dd82cdb0c8eb8b836f5338798b9818e9d7611142c2f52b6cf6a09eb4a96cdf9857fd0a5065348852d6c9ec1fbf2910a815927d02d8b4e4edb939ba663b67646153b1bbf545168232365b7bbf11ed03e15bfa68150b8d731420345d0d6a77c2ed31ec2411c89baece8e362fbc9d1ae258d3124c8d0228360e0ee3516879823f17055bc490dd04274ec11a588503e036486334f2f18fb7f3c6f015860c733c3686a002e0f68fb758d9f73d0d843fde7cf8e4445acf74eb396bafa79c77d9b79e90863cb4a1f015f3eb10ed9eb7167823f9144d913e5a2aee69e0836742b0c65f5022f6a25776c69cd298f471df409966305c72efa550208d00e300982cb71255f424ce675d4c94b36330c1ee36b26f40376fa1f00870cad68827f67d63eac400687a7626ba379fd9322abf3f02ac904388e24ce3aa204c6fa3c36260595e25c873bdeaab262455e390a338cf7b92aa8d961463469dd9cf319cc9c0439e01b89189403955efc0f64210674c933183b1416c5215a3e2edea8c2ac34600145bc16296ec286933178c3058384a171f48fc949b51661cc1501548da30ab09a910e300dc231ff268c08fbef9d5e87db50658b371e09ff51c3a38a09b0938afd2a9b70b6d8ca535155d987310c0ea4dfe0e6a9858d33465cad816ca473bede6273ca879b8de18b297d695e8522b9a21b198ec2c73bc45109433954dd1f61f9930b9d54f92ee266ef42b0135b3f8fb225329713087012588467d0cc022eea9855f5aa40661dc56a6149eb7b5b7bc842aa8fab29f45a915e3fce965e89369226413b35ba1b8478d392ba9735e87daff6da2bc84a84d4bf0514af529f287796c75e671e91a4ec3b66b5c8b5a2609e7a0efc0de30972f82440f691d6b6e9a54f3aba63d67dfaff88aa99d1b6bb77b9d331441681083a68e79a8f497e371e0e824e41f51549fae97a3a9e9ce2ab846bb0dcd18cf1107305031cb8fc17cc9e02fd967a20a55d0505a640382697ef4eb2364476f609ae1653142776da86c647639167694d20edcf6ea6cc6e362f8e9c7f5a4fc298c00c6674b5631e2958118bdb0613a06a48483931b425e5934afe89cdd6b27b389b8d8f6bbf2c543fd3e060c293db90977aa5bcc91329db3c6a9053bd95aa93e438917427fd5cf77aa6cbb77dc6bf560721ae13572df2df3dbe80b25b3ea07d30671957218a9faa6cfb299ba27b78fdcabf94821f38d725df9eb8a0d2e8b18a1ba96fd79b3a0e09a948ebd95ed1c2058d3d9759a9a36b540996c0922888c17d49e119a4e3d4b5f92825365afa66095d30c04f0c71f302bce9e0166e8e95227aab13cc60a975cb5a8b4ab46372fd39f6c04794d628e7325ad73be9d2315515b718e0c17d326a80ac22304555a65917f8720e7f7660dc63f0fb8072d236008d807cb4d762a1ab8b122774ab4cc9298bbcde36357a71b9cd1c2760ede4a6014e0fa6a567a710e22b35d624477e216ba1532a3260871ff8bf7e583c5cd25ebffda6dc1e6d8bfe976b07e0d38c15cbc91cf981c8ac4a75710626cf8f5e51eca1d87e967c36b8ebb184f45c1b188525f57a192a6f659310c050334cf8dd17237b5759ccb0d202609ab6a86c27a34323a1bff2aac5fdc8f635948fd2783f7388e5a6ad46f1213c3e7b071e8a38b874cdba92e354483c0743b89239dd1056ec04ddd34e27067c7b973af4278b74462a2daa23a2e7aef16fdfe66a9c594151e70ef949578f7e87868330b8be2b7d625583973250b3fab00b0598e399f1621e5b3bdc441f1464239e465da2f503be29cfe919ed1a873d480df0b8bf0fb4337d75ed11eaa5a6f29a18b0bee6154970956641108aa7854fce02961cd06d7cc8b4e15b22af65c173c57446f805325100479c8c36798dea59b011d0b6a6a30c17bb9f959ef2b62335cc4e56db27d55b8f71a967e4ea2c87bac7823676b16625e80994b96a970d027901b1c95d5da8c5afc358ddff1582da3bd968efc3ed6374cd0429c8d4d8867aac081ac3283251ca7365de509c6be9601a374a9ab1dec53dd7f3faec321e47d062257d6cc7c04dbf03b02f5914ab965b5be933f976579890aa613d6d963439f9fa04eaedda45d506a7ce42698f9648cec08b725ba6e91ba0d3ac235e37e8548798fe2453d35d90718a38132c55164aa7772388dab6a491908254a0c3b9e9ea01292a7237abb6ab8208c8a7b8414a4036d23895c9daa659f40cdf6b23eaf2b16e022620d76e114a537a9ecc6d2f63b1761b6d7c8eca74a7d2433e1bcbaeb41b46af3526c7b6df6d23cc4641ef38b0d14a3b76d9952ebdef805822aaf4488214fef8e248b2114e93a9aae3a089cb3af01fb406e494e0905292c3a6874b7558eb3a1c80e922b8d236220218738b76b0daf89284689c9d05a4172ef54784f33851a90accca1aee0faeecddf7d823dc837411889769447b38d916091350e7d745a1b912237cb0fb2f353356245f1ee8ce4572ce3e7957b2d94c406d60b08f4ddec60b9cf6b3f4127f2af2593eed47f1e6dadcc725a02f5f08033c4dba90f45ad15b0a9f798a0cc02c3a60c594dafacd567147a2cca248653c64ab166e866c5a12561383c5cc4fc73dd7a538beb6fe4604e3d78875bf8bddd2929aea2beb8fdf22d25a72071827fa93dd2e614aac2bb1a8391c44c3a1bb9f0b724322b7763cd4950a47efb044a2a155e2218536a21bb97fb89022b40365b1f130f3d0f09521f9275b0121bc99fa5e9378b3892bd0169abe949b2cf65cee2d295511f9476030e215bd7504b8e17580d625b31122274c4cac4a03af1e0a31f784bec48816c77c398b45135c765d0999b4934096eab854a02f8a21fad2c0940691fa5e6193aa23934ae7f3e4a1baa33998dceaced9eb487d1cbd3bf4cce2f30f5c51ff832fabd00492f1e949791f00285bb78805d66ac0bd4d2c587e6328b5cc01e172f87cb8cdf0247b7784d5b86600b00d6e275b54c4d5a0086163f9d650a66817859fc982c631c0b48c4e287b0cc012ca0ff8ae77865605d01892bbeb095816b85a110992c84d5a94521c52a702d343a2b3362052c57f102abcc5015b853c5eb4c6538a900282a5e80cad49f02c04ef16353a692150860c50f5719bb5540a62a7ea3ca9ca6020aa9783e2a038c0515b0e23abaa21eaf83af7021ed58dd2a50db48092180129a644612fd809aeab4a02312dd3c2b370e1b4c5c27b2e531dc344066d1738fa22b02a034d309b5f914d95d1febc51e28071f060593149036855e52fc415a131a288564430a124e818b4744b9a1793e4553b4beddef440b12d63732d0a3f332e8593dcab0691be5610f8f24d9c1f6c1887f75aac7781b57ce0c4bab812698edcb3298e8c1d1b9a369817de54791c07ea9554834621cf889d14275e123e7c1d40720d5e9f0f3d47c5d22928e204c53f96723bd56056ff8c9aafdc9bd6fa1b3d9310e479127e6b81dd58f6b3881b573705f5c02a490d40124433abe95bedc5afe84bb7351dbe0e944f7540f82f458f3a0700d64af6a801541e0603c1422bf944a59289abe270cba1ef9d95938d43b722b04beb9b14918e4fd7c56073a32b2a6c8f8dde84a863c67a6a651c8e7d8a91afe63248a10f1efd9b9147ac94b0c068d4feee1401728e6b463d48322a70155dcf502828ae7cc2b9855920717a1a61697bd84800239f30a6695e4c145a8a9c5652f21a040cebc8259257970116a6a71d94b08289033af6056491e5c849a5a5cf612020ae4cc2b9e1285f4dadc99caaef3ff484097a59534ffd2029bda9a867cf184d9c45bea15976ae743a2a9ba91d234ead57d1db885c3aa6e1ade3a4e796b39a09766adcdd5f6a0d26080ee2c684fbffe2ebb83f80b6d30c3b4488fa930f4db2fd500590b05bef64aa042fc96e6da750d5288fb2a359a874162761d32a41f91f01a921a810a23c2a9ff23fad40cf83a12a0ea96a8f3f20038f921f0d81da15c02d780021c29a41bc0e281d2b984e0e08bf2114be54ad28b2a2dac7e8f12ebd852c5bd009090d5aedc8158d7dd1a544bd88794510a687bc26e35f4cc6024dfc609b6d5b9257fa147343f29e3c6fefaae24003683c4534ff1ddac49aa22198384abf8cc66e55a6ccf159668093fbef64e2e9993b8f49e3b92f1c82b625c4684f10289e3a7449f4a7c5ee51b1f684ed73ff95df5291ba44ce5c8e17250b64f7d94571e804b68e56e48b47f6f2eb5f79278a6fe7234beb3a1eb6157324a63f8d7fee0ca492cb6e9c520b5439f24c4352fe009d758bf7623845545c1f7c5bc93d3fd0bb7d49373bf7cacc97b25387907d63d32333e24ba19baa9b99b36ad6507259a25005731f5c0a2d635146003cc5af7ef88591e084af6d0c901809a6bb25fa31a4a4c7f16932baa04e50e770a9b6c6f17e498b06bb1aace9f0be4cc12bf7ecafa76d3510af54f6ffed1ec9e2bab522cbc0f32f40aac22e544e1a2c680130bf00654dcce15dc7a584b74ae7f2a7a1e032cb5a3f6e60f3b1785c0cdb52b16632b04bdd1632ea27299c657cfc85f66f2e81bb8cc35034cc70fd6cc453c6ad115ce55613564c01f315a187deab80131220911541e6068d4aa177a642b52e06b87c885545decfe9b31785e992bef28f33a1660d6c61bdfcdc6df3c4587122427d591784534b638aaf1a5c7d9e10df5ed3abc3ce1c2ea2e2c10bc9279ec26b96b634e3db07ee481080b17e84a5847659ca1c74115d314743b2a446d3c5712eaa9c4ecdc268b660e7ebd3371d94c35371956820226e351c2049695c75d9ea2bcf2c34a80d7ca19ea3fbc4716b3f145bda7396355276a6399db61cca63350778977a23e12e227aa2f341bd126e9234258d668da61d95333c4215610bb1d2953fbb0265c321e049e0d0c43d548a80864db03cfdc11c7b059ffd3e5fe462ba6b4d459848d40e3921c430616900d58466f4e035a2d074ee9952cd72d08dfdfdace80b036f628c1fbdbde0173c5c4594670faf11feac470891a15bc0c834880b1621f8c7b87fa66c8262a4dc27d28d14b0a08f6f534a25898125a13ed515525c3428bca9828f8d552d5b49b49f2ad5eb99e03778654a081caa5608620c3d06ce17dc6ac11ee5672de017c78e204466b1afd0143fb4925bf219be2ab7cece19e4b84a9946ac7ee6dbaf50406a81217cefd9cd9bb6a72755871140b0d175cfcefd005911af53fb88a8c9fb1ee3f2c4711595d0e6f9d0ab1c66fc21254d892a923077a9e385b7678d110f4fc839bcf5b538af632bcf965c1d46ab130f8e1635614897f756b99ca55ba9151d93fe32b8ceed4b68f747ba8bdabe627f8245e796cdf573daca3ac7a47feaa110d227070d6c01bcd04943f5d1aef3624632305d9039173d7f564b721f0fc7c6e881b5637947546697a43865b5869abdba8ea1ca151c2095a7ae55a280b88d7a5921edfc426579fe97f17992a150a68ccecb3a9e7284c83fe34d45c31b8a38f1af2dc6fa8e3bbbf2fc196573ca345f404f6d2a3ddea5409e72ef8e2fcafa474cee6cfa8a406c48f292df731bece53c5d5e3692ced3c698664f5b46dc1b0665386ac8c1b8d60698e0f2109ca34306796669e79348868885ab3a8018e51e33e48eab693c585ec25dbddb447305db8959a55579f27c3200210dc1f1dabd657432261e4bc0000cc890368014614195e7b838f7e41c6fba3a4e5c91057bc62a874f67de9e23e5cb022e81a99278d59719203981d27cbef54c18ea53a9f5d637892ed8151af01f3dd5bde66ecc9a278c4e300b8f4c882de42b1e4a5cb87cc695d3eced8cd6a699090cfa17d68be76677ffda27f9a301628c71911083bdec2212a6fe2c758ec9e0e3273307be7e8880d0d6dcb78a29ef3af76282c3a2da08a65ddf94eff097d8dc8a41a80f74c925228ac21456acc22663e072cd06e8e5b29b0d72276603339d08f31c977a6a71a246031829210cc27555b353cd1a5e34751cd587d72a20f7d287659fbb26c22b79f06293c93d44f66ef11a23b60fd6000e4f61b5886da15c8059458711a5d453c59d6bbcd1de262e60da24c5ea336c3d5e8041120c476f2b54ff7cefdd3d96447bf5cc03db2fb060bc970dcb005957c868d07fb1368c8030816e67863b7d8b0f2fa640c7f9e384e7da9fc90e37d9fbd2882f85380772ef2eb6261981a81023ab34ef28117cd0d22e9e8d46290484f5e8c0f9d26134bdad0ea9bcf84a889ebd455e070ece16430603bb151d3c1a05c1dd193150538bc27a244f04e6a3db68cfd306ffeb3abd7e8f61d9371219b98a092c9d33875cc542abc5445c6f82a925112bcac23b3f135cad41552d420c3634269a820709bcafdd774cf6ef5d849979140017da63873c65f9b834efcb78f04ca748dc0371819d0a0dc38e98008780248288a4169342631d52e275646a1678972b5876f76a8c7d14beb98f240a9330a3aa546e88d4b4a8b87e89c13b9244d83996e80d1d3b961ceb875d48a12205ee0b3b4d0b647b8259565f559b90e0ad2db014f2d9a63b79bddbeab9a8d94c4aae14ff7ccd1cc9b40a94f10ac89c8db2d57a42e62fb035af7036ce7328bcaaf303a84b8b1515d345bd8f90a2937492279e49ac446e44c379eb584ac7a67d206cfb0cdbc1c73d7262376d82b0909ac5dfa065271fb0691722921717f803c844048a98b3c95d46dcda0a3611d00b14bf9b523009fecd05f913fbcd21305b7dedf05b12bc5c3f79debb0c23b5c244e9290c13ce4641b645dc55b46452bfd405d116d07b5709d28961438beaaeffb25975b26cab3c3288d07d1d6fc84413369e0cc90a0b0aa37d9f6aea0c1c3fa62b432a7b99c39c4a1779dc4d2a821632384db74e71ed7497502ad1b8f9eb213fc0bf7d90e84d17d0cf205f1762129c71ba456b7e5dd2d2997f676b86f545b7595d7927398e508f173301f67e0a965e05cb5be8fefab1bc49e874cdf014354dc9dd2fe8c4c50e94757b87dfc3582abc2daf71570daa0e56a47f9f42334fc519ee6fe4e85a3daf072b1b86d7e9c3a9d697047127f4ddc20396ec818caca1f5483aa86459f894211ac1fb6cd1f1809c6a70ba8ea0254dc63887bf5ebb0dd6c9b72d45f761870fd83a179dd4398ae5d001b36d0b7266279b70e5aa99807d94af855914c5c79c13a99b982bcc258909203b1ba4646e788051cc1b204fab41db3e5ec483abd4eb36a19f88216586ac0e766df4db32827c305f66e4ff22aee9b21646f239660b343dfbc2350ec5a4c793a685133aa4082d24da3fd2e157521cf479b6bbcf2895a7b06e924ea867621eefdeff1031da326338172e1c7b04de27d26458cd81d4befc60d2db91cdb3458c97f6fd5447194b242d37f4d3064a89665ee1e7afa1026ece0988639fd0bd90643189dcb3c468e9839bdc0df586401c9090d5476bd7e04804fdf11d04418281d90eef7f45258b6a3b643d0d032233e4d0efee6ed77dbf2cb4ce872e9e0dd30a85d270cda3a55cffa1b105b58deb261d7aa24927e22f7f28053cc14d2d7fe06f0c090be3003aa623cc15f8e161fa29d536e865cba77143b39597671f2a92f4de00c89c225b82152c7818a8621dccf22ae82b2e554f1f5261e17e26117ccc263b34db400a21143bb092a96a3b3f1a46048be465d9f307e2c7922f9c978c02b56b9f7641455e8065241e0a733179ab1c043c94770d77301560a815c811a499a7a89b7610e9a1350e2fbe222ac106cfdf6262a23bad1f2b216fbcdc739f6d960a810fd95711ed266c4969aba9fd915b16384c836861c0ea72941dbc88494984fabc0d0e283167f0ed97d4e2cf17d7787e037995ca144c4de90d5e084b7fd9d6094c4f62d3ba07f525683b49c383d8443e2698010b1100f32cb901327bcaa72cfb83dcbfc57da769d8f420c45398fe2d8d08626bf02ac7028a509674ce398218d3f4082465b8f732e31b007ee006efb43e4ac391931f51a266f908c19ac4df02d2f192f0ef815548f431ecbb0e228e61aa2206fe9f8ca197a81321b1035039478237f5eba319ac6d15cb71203e661100024708705905c6d1b7a814c9124d5e79469b7ce68a62c59abe726e6f50c31840254db3ba09476bbcd82865aa9665d27829d7704b9a9825ee35ee303942e8a70b9a878b492dc86431be5840615e10271a56cb06b372be5fec9972312ada4a6125b854aa83b13576c3594b83941384bfcfc52f656cf226611312a462bd9b7f4773976b06f54a537cda9e8710b380926475bfc03ddb1987080da585408dac40d6c83d9437ed81c954eb8cda7f3e0d71ceb4df83a49a0995f2baa2853e429b5b493008fa1aa4e33c70d7a949d7dff833b59ccc898cfc46dbd71cb98afb86ab8a4afe9ae81a82088190023ee2e81ac26587e813180e0c1c7f9e467fbf3ced02f238f3f9fce835566b2163f6a08e1ad1e3203049642b676aa63f763ba0354ef81228cc16f5949d71e333f953aad9cab040eb7754eebf3ba1fc576f2b25e0832c879f5485f429f1f57eb8b63ef750f386e7d42e39b654bc3db3a9610e12e5ee188b4e18047af9f16422c7ef9c58d68695136c17890c163bfbdb27080355a866cfce87bf9ff7d71e4d9892681a6c63ffde60b480784e368ee56c96f72bc482b0396360e44691255d37d80111f1aecf41130841821bc4ae6fc49d972627155248a97cacc0fff040374512c2684509aeaa8b926a0cc0b1c2caef1f110a4093e360f9002e0cf9404e105a90b918ffd6401a3d6ffeb15cadf66bcc0331ac8683c4d8bec3a8c1a8e2181851cd8815ab83a8224b6e0b5921456403358c540da44d0322a1dbccaf0a43946ad7ecedc26a6595a30f37d391c950d684c714349adabfe6a1eb2cc7de5a3bfd6241303f89c382a95d1ccfcf9ceb3da8b4e0feb9a2db29b68b13ab1d2efb4c972964a2fbafc0969b405aba6bdfe35528e6e08d3452e01119379259b1450b634604a974614caaa7e519e4c52d49aee431900d62397ef0222f0fcc390ace12507f0e3b4fa13d92946a5813c3e3dd7ba4ac9e590fc827ebed7d2bc5d3dd5c53f3f3cebe0316e330a89c42d094f397ca4a7a8433ba1f8642ebf6016f764bf5ccc6387b44e91e15f7f0eb4e45df93947376c5ec79593133e3344b2ec0b3c1ac99b34b10b3b977b0e94ffd1a75dbe872032ef2c5ac483d3dc943d50e2238c7b087744e8795dd78832427db39a814e7ca14fbe073b09ae48a8157c590399fb738183bd08f190e2a551ad36f18f31d201663dbd788231a44b3ca99708733d7b3b61e76fdb11e1eb0974454719adc10f26c79edf6f346ec82a0edfd3c587781b61db906f2ec1fe5143e87a9a16749d4b6afca5dfb57452307a80492870f25099d3b50977f02f5950079928724bb1c69e05e8aa58401763b012616bbcaf82b99eb4c95164728d6b0d093f273d5e1d18d4236bab124e72df96dde119aecd84e8cc21bfe69615d94476cba20f6e4bf88af7e98173a683a083b630875ec545253fdac1b6c90a6a42fede3a36bd698ea10705612fbfa7a9e986566035696e65e1724e0b97f6035a63e180b0df01a11f38d8531d1d91e37542a6b307d802e804949841c53fd1590a20f243506808807289e070942719f8aba94906d97067f8f419906e4a34be6833a305332893b66236d1de4e0d5b13e3d391ad0d1eb1cc5e665f1e4edf60d5478e76f337d27dd09146b29c16812b0b6419facb3b47660a77a795ea4309161001dab74f72a44bdd55dc348e60546803a071f332b60cffa3d4c4564041cab5e2ae2861e184d08cfaee2a9d683df0add2e4e9489a9ef5f96e96ff9cab71c0d09677881c2ba6e8b20fa4ea4624a96ba1ea457ddeec8e26d68405a773a73c73dbfabffc4f48e2529c490b057b286142a76bc8757984b1bf8ee3014d343f11d595969cd8276502b46e5fa6f15ae7b9d72c3fbc6ddd2a34fd04f9868585ca1ca2d476f427b4087148583f337d68af6234074f5047a1a93eaa104d3830a49349e1553f5383f39d5428f3502307ba1eb72d41e0ce53ee5664011ec086daee58267b0212697684d540fd3cb9ea9c32054ba6b15ff0e2c0fd63b232f789e0179387feeb84f20df5bb28e2063eb6f282a340d93cd5703236328a1cd9094872f8480a70ec9c3048d5780965969e1b1c380f5c6081b91ceefe3ab772be461df36843e6573564fcd835a50f41bb0ad3c26dca97dd8b84aff8671c0ec9c0cff0a106367c40f1936df0ac531ad7a3a371419aeadfa487ef759c5553bb095642e46fbd149fbd1e9be508841dc6ff56b896bcd7e414714e971bd96c3d83a3c1897e47034fb1427ccbb7157c17a2a667aef9f3f90c9808967060605be913af6734093738c6d3ccc51bf67fc038b5fc6d00416e831ae10d9b845e80748b7fa0e60bcccfa8435bbc6a02d5368385896864b6c42bbd9d7f3321c8ace8f5861419fcd196a9f95e72d54d62eb08739371c750d7293620320f4e2322fb0326b6180de712b1547b5f11a0dcd785bc9744232799df38a9d7b82f1d91714e43a2b2eca09d8bc3317f8b6b92fcbcc06299b5f403387a7c6d56baf20d35c0f49a67b17fb527bad293816deaf10e3f5ce89f3d93d6a9c0772d3dc3b2c40bdc2fe3ac71d1bb029fe83e3ae731ea600f05eb254c588efaf162bfa0d62c5c0c87be4e77afdbc41da681fd87f3ba6e4fc0e6593c177f043feb9e3caaeb9e3ee705c9dfb811d98cd90ad135b66b579b0038bed299c9a30e2060675c142d408e61480a22ac2c8cab88d9c887d3c71520ff18f708efe17dba8de139d5ed82147dd541529b89a44cf4c34fae71a3eccc41e5383dcd5edc0bfa2bc48f74cc60fe11dfd876d0bce208ec087a34515032ec6480ea6f9c45b1eabef8baf5f299d8113758e7100a5149464e1914475accda6f6fe6e25916439064ab5cd1968be3cb8918f21c22c1586411924522741a3f5ec711450d7637fd2c391cf131dd4146079806b4d17401a71d5cc6433d7ee61e6ed43a1eb4a85e30855b96429b7dc98e1a53e1fd5f88507b5837067d216288201d9ee8dd1e278307ada437895d7b0ca0e8993786ac3cf5f5ee5cc98a8cc7f8b1e96b513b12900a3a22d20bdc4d53374bfce341f9422861594793c326362f4f8441707e2ef8abb66be3784c359d7208caac09b4a3ac945c21acd0f1fb921c5f9d285c1718c0768d50252e0add516e6072b75f8197750b6237a5ca755f5af6f2041a2343f0de6d256b9485f3a126e2c76f040cfe167dd10b8aced8d5c0daceb48da98b7ef9f5fb4e9d62a9ebbd534c0e7b0dae0888ad47d9ce88fdb94c353b0f9551031368c926377b6f0dc3c89128d9d2614002bae91c73554d17e02ce53954f37ab47104d4525f6d6968d729227998f4de5e737eebbb81be50d1476075fedd84a500b14372f5eda5068d3917ddd197acb4637d1ed65d256586196526a3c78ca232e55ada4aafcb5914a5db46616fe9c8c14ba17e94b361dfd7332b75e85f0f1c1f42a92bdb9b479722eca3364069ede597c403bbb44400dddb2dc743f5c37bb786d70f5297c79bd809a908ddc8a80f726fd8b2e16c5ecf24b8948f7410284416d834d2e8ac70aa254408e255fdb95f9b6190edf9e69c338c1c1986c800aca249d0c232683d23568f70dbb2e1093787d11b2763fa33fe783db76afeb877445ba22a0420d00dbbfa90ccc447f1f1b8436cb62667a6133a96d90542fd07b04f1c5fe2c1bd607b4b672e12a7374cc82c761e74261c1a62d54d1fac482413a023aeedebfc1022be3651b05e6bceb7548704c48399fe101baa4ee59a1e89a5a5a76b30150f91104f53183ed0995c1635570788333dea3b8d8f365face8037e19f08146350e506406a0690178020e505bfc14966560dad4ea842e1b19d34506614513009a960fd71be067dee68dcdcb2474c37b3572dcdcdf0d3e8b5ad2750befe0bedc1df646b7453c60a056e3035401094667d3772f598d318e05bf73f0b0c199a0a6310b7abcb772faaed128758855ef097407188d8c7d6b42bdcc6a532725554b43d9d3f4dd65583260269f8afb27c5ab0896690ee5cd88d5b10a01b3104c4b03da511e7b5d308e329b0ea678fe376bc800c3410de0657e0e641731160d920bc980d935c8f87d6391e255c575403c5a394e000832447c7efc4838ebf9749f867da4f2ad17e5722e7cead8a9914b4c667fb38ffe336e2e7fcb62dbddf6de5bca94a40cae0731079407670f0db4469f7a9496a7f794923afe339d1eabd37376a5acbb842049eeeedd3dfedeeddded6d73f0070cfef7e37b24abcdefe9ca9fc4d5636acdd1e161e549b6322e54c38714850ff9a44a4fd94265dbae94edffccd354b632a357cbd184fa2c1a42477378df5de2362d76180dced6617587a64dfb3060b0143bd2da8b54ad0cabcd07b9c0fdf5a90d32d346473693513ad371f5b86432991299ac653654804518254bbfb71f73587f7dfaddbd51c674e89f31fab2178de9c474629494c5e8fbc774288de9501bf3696862343a329a190d8dc562984a2c46c5ff33528538e04ea7c9d37b1e6dba8f36dd963e3f9a7cfcf0f9d1f4631cc7f1878f8f261f3e3f7c7ef498c97a86545a050a2222a48995dd270b902c5984f4abfa348d63d348a58925d4c14016d39191e952154cee96ee3f97279bdd198fab747b787c331e4a3cbaaeda9e190feb331eb7d4a121636dc64888c578f4206faed5de3226847c6fa64b5680a85216cff3bc96cd64dddf8771777f9ec5546ef703ac23623a3a3db31e9d9e9e9eda4ca7e75a9d1ed9ad842049b5eeb6387376736b756ab5a52a5ad468cd13a25db259cf7828f5f7f0e8663ca852b63cfa65adb5cf63d6d3a653a59ef1e89ef1689d5adad0dc12722728091942a4938290d0a6bb009f36bbd2eba4503da0489851a5a52a9464ab54693cc02cc1a68dacca66b2ef4da8af33eb6433d9ac5fb6f4cf4707c9998eec5567b6825536ab5f19f34a9a1957902cbb6bf6a4e3f2a7fa32daf2975571842c93a0df7ed7bd4df7a70d03ea9bd07d577ad77dde40727d9b98cc6d649f6be9b2713adbd6e4d3dddeab4c97a07841f6f2c4364638cdf501b369efa9f5debe09f6636dbaedfeac6fd3a68c862aeb572dfd6536319a4f9b1036c8f6ab6d1b99f5ca1f9d4f9b3636a72d9f144bf6a740c5c1e19336d9fcc09d6efd4bf81c66636397aa64c9b63cf1d582dbf45cdf16c05fc8986342f02d5bb66cc9b6b441eb8ea6ddd206cde1ef2b10aef53ea4ed5e39d21cfe313bee2d6fb6234c0df7cf784fe990989c96ae3c59a292a4a22065ca519e329439c874c9892072bbd054046304ee7c7aa64b4d493252bfce0e4aead749a57c857cfa935ccf464a92a24b5372b97e3be957cdfd245722357ac04ee45d0e69536801f42bad4d279dd4486d561a4de00eea172d8d526842df7eb56dd6fa3c67901c8495fb2966f2fa486c3438e17023f3597f704d7242e45aab11b9fe8c5370fdfa130ea952432aadfed4ef5a33b5c0f8a2ca5252962a9ee4dce3a193ea9ae8a682cce49e36ebaccd25277448c1921331e4735c720289cd89233a362d353e211b1751e097293cdb1424ac1f6c295081ad081a6c2478c236c3e7836d85cf062fba242c5ee1c552134ff91ca5586aa289711c979a501a7f947920969ac8a1a98915bc29f01746c704b3b2e8428057517849e095ad074ca388ee0b2678c81e0eaf325d6262289fe3f8cdcc7a788c6f86992e318164b4852c205202141c69498ac2458d8708b088eaa2960213a4400527197e3bead953a45da41064436d891c6ad072be2089207e70f8820a1b1747e0b03f3631d9121329882c99a5256ef925d3a525bcc89ee9d212392852b0478eb8fd8e1c611db99656dba77caadda77ccaad4ff99475f7a9db15d5762daea5ddb5b816b7aec5b5582db7bbee39587b6f676d576b960186f77d9edbc0fab5e79dbdd752da39a547da524a29a5494255cea115afd8894e76f9669b435074b257b4cd1c8a258bf5b158a1e8a0e8f6fb557e6f43428a012383358386b3d65a4bddda183ff8c6bd44acf5a6d6666bad9d8025e2a49452cafaf961fdb07e46204624ac1f9728630c630c2e515847c618583f2e51583f2e5158476ad0a7b1e2a14f479728eeeed7258a1371248e64bf7e8d3ee0eab8bc722f0aee301bd794bd963a15de069f065ef7819ef56c8963a4f0dde82ea8ea020c55e8754c7583d6a0bb98cbe5b11bd94b1ce3c877236f20e2ef135d31996e90e987d66be1b5b712b5d9456011780412d930d7edd65e777b6f47d4f5077621b87259b9c48091c19a41e346db98986eedd44e5deba44efa27c776d2488d54724083c9d1d1cc8ca8db454dd444331d80451d8047b9bf830e40229009940232894300f8c08b038940b2875a48e8136d34f20bd30bb83ec92336951c70b0e2119b660200031249e5bc35839c06399188def8d313148e06c221b3326a5ad338306344e1703232311db430d42d26ccc5dc68b504308001d0c8d0fae4e474c34c92cf8b1341a28e6a5c95c2c474fd3e3d41414545352ef74daa4d3656d536be100d60003462539b5d6b75af5e5d74b211e085a84d1ad1f6357d4f50b9e9104ea97671e3978483598273d0bf3890ac4795e84bea17ee7bd2b097a72728a88bbbe50b5192b7fac71a2ba38a5491721080857c5e1ccd05b94122d116e60ae0026b10105012211faaaefad366a5b5590d70801ba4049c9013688e489b43c203d488325feee22e6e06ecd383da80c8ac8c7cc4549ae376cc01449825d8e6e2ae156d516051b71a249ae9bc10bdd86061169048b48144a20d24126d209168038962c21c51cc8a87eca8ce354eb4894d0d038b40221e20514f6863b3e2b1d7836b3f252917f793e9c57950a6b82fa9ab5d1178d4e6f51b2b1e97c53c103d58f1741edc970ab49deae26e962bd5e614081be45bde9c0df3d5b0180bc3621f881f582403125d1cee46354c6c126da22dfc408696c3430c5cafedbca04b72e5e72d7739c2de83a7aae6a332bf57df2be07efbe71844d52f13eedb1dd7eb5abb63b89c1bd8f1eea427274aabd46e2c21d40a73a5d65ed1171a8386d47b4aa9f894e2a7945210fc8a724d51b9cee42acb954a013f4a29a5f934926dfddb912b97171c4315d64b77b0adb5827da5609f1e3d7c7c805fc4e55d5efcd577d3efd7a137a0cb37ad55a1726c939e3427d630cd74c7a58ce9b1129ffe18866118866148c3cec78aa43b22066caeff7d638f27f1e6b5408390706d0f9f7e9bee878f1e9e4787c5daf59edf755d36e74cac08fe80738da15f33ed9bacd3230b067c4b0c43457d3ad3354ae89531f68dec78ef3fc4615d1963cb1e3f2d7f233b314d624d7cbe07fff39e48131ff0c3920838aacadcf93ddd0199ba32e6beea4fd32b636e19f300efc1f7e94abaf39531b6ec69d37b78cb5f1506764a12797b17def67687f4cb84ef3df08bac3e2cd2c467f5a10f71d8eafba9d39b2fb7cbaddfbc895030dd5995313dc48ff1095fa52a4d1072f3b7facea7affa8ff4beded348f6840c21229274e7d2ff3e8cc7f1df343f766d29c3a24f186c0f8c90be00ebcc7a78b85af57fcd362f0fb2879ce990336d66ec6fcb77daf7fe81d7a39fa804c7c02d329f363040dffbfb44a1c4952ac42025418c2d922582e2fafd49993afce0d75a49911ccdf0238dd054dfdd28a71ed407c998b7bcd5b52f45d94249094051a2a4a2aa0f200ebb654c8fef8b71c09740a5729fe02d20de6a82e98e8b12353499c10f4534dacef7de37691223c2fdef7dee7f259126f696f7bd92c8a53bf7cfef726014634b5518d8cb1f3eb12a9a1c8b9fe1ca0954cc14ff80c902578a5ba09586403d4aff1bfdba53ea9452ea14f441a9d625b5abb5a1dfbbe299a95d573b996aedbdf75e99995a3d06122cb6098345094b2b75588f0e85b9bc55ffbd55b1b7288c5ad23ae156813e0c14b882e01f9078daf75a7ef8c33720f813bf4fc41feefaf372fb0171d8f77ddf574d50737f78fc4c755cfe0521e1a350d5895acb5e61b47a575845aa2dff6eb2d6622e937e316fb9e92df7d1a64b6e25b8fee036f4c62a018588ec5ef5bcaec1a6e475f55a6bb5abef7dc58381eebf0f55482a15f815a9617506a424a57ed9e8520b7e6aed48f6722cf0403e2b5353967cd626f7a75e71d95f057ad5f33ccf7b9d3e47dc0f201dc520b0f8ab5f955cf6b76193e06fa4eae1305ce2d04573b8bf01284c04ea0a02d77cba5cd45602bdf1b2bf0f870dd11b5acbdefd49a5b21bd9f1371d2c631ea0faf07dc45f3df8ab924813505562f08dec80df87bdb2bbb9fb6f530bee689b9dd40933601e5f39bb82bb3ca1c7f985ef22199294b66a8f5aceb4d99546aac70eeb318ee7e7ba433b206dfa8b4ff625a76a62aefec4f4c6258b4f67a50ee8856bf5eefe3d2e8789ffb2560dcde17f7a99fea53806a0057015097ff545542f7effe9aae2abbec8eac32f22beea3b067c9ff057efa37ab12c1da0eaa0096d0b1139ebe141863baa5cea842ee05bd2cc4461f3da6710d6949eb49226ea21a9a92c4d4e3624274c6a5015aa40b828284a6b5486e67025423a7376b5ec5fc3efc3380b7c3a1308b8056cbffee94cdd11cde12df5fe8e14f324afd90802778e0493056e772427f446080a7325dc0923b23f652a9d09095ca44911f0bb2ff2bdf70e051769e2e3fdf745ba07bf88777e31f77d4a11c092ba4ff7de3be02b63443a281aa204443b5da9d31a2041b443779ac4001aa90fd11c7e0457182b35ef6bd475b75c894077c61d42976c5f2f66aeb15c458a290c7ffda73097afefa2300a537dadd4966ba6ab6acbe47bebd64c0cc0b9ebf2cd2308b02d59f54ff133e2b52fc959cff33cefafd7799ee795a777bdebddeede1809f5fbab40656f21dc66ba5c31578cc65c362e974dcc15a3b118062b2e97cd9fb8df596badb5d65a6baded6eeeee6efd5a7107718a2397cb7bc1e5d2124305206d8686c686a6b3e95777bb8edad0b868685c363436e6d39c544a2749791a1a1a974c97a008237bd9343b803ec4b05f3f1a8d46abd1eee9e7eeeeff5fa54af6cffd35fbf35de9b4e8b4f05a6b75afeeeeb5ceaa57af5e6bb561a94a5075c5dc633a1e731d59cc3f26d3e96e4ca76dda6c9afe9893cc4967e6546badb1584c95e912143264efd80cf59a30d7f9bdcb3dd62feff6d16d5cf65dee8ab5b5f5e897bfb52edaeaff5c9e1297cb6af93ea12c5aa072bb9f9a6e93806e0bf902b55392ff2079471e913774efbd57e8de4f9a3a1aaa79d4763d246621caf7e807292849a826de84a8fdb08c69c37a1a574c56cbf76d7d11f2ac00c24a62f9761395d46cf35e9a36bf7b5fc60c3ed2a4c996def4dfbf4917098b45170311f9be0735ccab79eb2601e19cdc983815e5ebd99478354f12be00897c5750f2fdb38be17e47ae704c9c98aa4b8ee6b82f06791d8eecd51cb652c2546463e294af937c7ff50497efdfa8e5f2fd5e09b92ca96aae5b81dc7f3b4c73d43f2d803dc61de7eeebf0f041c2937c1bca0c4af7b3cda0746568ba6ebbbbbbdfffbed4be3058c0f7dece4b1b99525d40539aeefd63a73f2dbdfb599b4d03191b41a9edfe2c682dd9d45baaeba4773da8b7f015c7d6da2f94c2a715ad9f375b51634a0c089d65680e7bded3de20a29756d81745118325702136d723369a9ad0b6f876b77d9aa356fb597b638693329c84c9f64551c4d65a7b59224bc4d75e1878878d63c0a7adf7daeb366687bfb5ef651059fe72105936927b05a1d82f6a6db562b562f5b26bb6228fd7fe1cbe9fc396565a8a78898512d219eb94ef51bf77ff3dddb19dfff745fa41eb80af88ff57d29d22b1223adebaff516f792ce6b0181ff0fb411d87c5f8b493a3b7eedf58c37020e9f0f041422ec7f2bd37bc7dbdceced0dc19ecb0fefba3c3bcd2be7eb1327d1fac0dadf5acf7dded69b3fb19483a0ee40490bc250ce957fdee898064accd0e74b5d9618fbcdddb6bcb1811fcfb7dfcbbdf471f15117f5589e94889bcb7ba57d5cfd5e5299e62a6a512b8a7eb1e48090ef39b94bb2e7d0c63be0f48c364682508c9dd921352ee6892e44ecc5dd7ed7cde1d65fdeade65d32ffb407448ddf89d90f705163c14b600b70721a5b5d26aa4d6136096502a325ec0b576f78a077fe8dead785c3eb4a2bdf7ae78561f76ddf7a1e7d5d15bf1a83efcecf759917e20287ea81a573c78c5135251f43e5c89325cc0e73dcaf5572e2ee1cb0bc62fd8658563c4c018635c2f594331fcc89ac3d0457c595d203ce2b6250ba15fb3cb2a043f7258e36ac43c7d1f72d88da7ef440eb3d132a066d3f718e8aba58868424deba88639cd85e88d533ff5ad5fe1cbe5e937ce8f5cf7a4c9e0aff03b34aecd5b8dbf1bc55054895fcd2a7145d6fc8522b8ea3a70068d7025be9034bc9632511ba1e6404cd4727f7741eca956325aa8b1e201df65a500fb223a09130a1d11943db0537d4f4f50ab122757aa4a1d351acde1e41ed11cf541f232e961090e190cb392b94100a71aa71613019c5a4c33be4b1ac9dc7286bc45e4adcea1e5004151f1e429e38845c5706da2009f38399c5c161ca97e752b4f87d29343d156dd0875d4666a1ed9aad11cfdf42496674341454565c9f2951b20dd6ea696fb0ed11069d01ae20bcd3280f059737bc937c817ce5b7d3b6af3c5e485f472f24afaa878e242ab9a5bcdcd5b35b89a5c4d969a299cdc13f085f4725273abb9959d433b7368fe93433b6b6ed97683e80add2012c7158ff8e34a01e17f46355ea73b24a68fe6106609767205924638647038e5f383a10f808462b8584e6a94a239947430e990a2c336a5a5294b6e9c9c3b4e4e36941b47ca7172de92d16440b22059925247cdfb6e15b750e5a4a8225f4e2fa257d1ebe8c5e4f594fb054513ade65673abc1d544d5647921cd68d400fd91617eba4109e51cd510faca6cfb29f8a44ad4684ad466563caa779282a0aaa68217b276304b70df7c83cc52346fe55cd2939a12539b343cbf40cae9434d388796f393135473abb9f5cb83ea97cab6d39f9bfac996673f41b99435b71c5a4d5973cba1bd9042a08fc4b1a886d5b89f476215eb43a0ef0200002b9e8b9373a31826294d4e6d3e512853598684a072683940426d76122546353a5a8893a56135fad5d570d241d228e647328756232628c907c206592c73806ac0e7bd616fd5af718fba919cec8e92343b592925af93358bd585ac199335bfb851cc83a4518dc764a5396accf879cc213a496b6a6e2800bfbba5fd5b00d1c91bf99246e383634983c42ed1491bf9924635de92e5e7adff0d36103758f1d440b5d9753f32e1ae0657a3c18a076774c2670e2d47a85fdd831d4e2eb4113d109d94912f6984e341d248e66f903b423b433476889038da01cab6dc949df253be793b2d64a8efcf9f1ab34089ba39b49ca19c9c229b08bd53e37368f406fcfe2cd5afce6132df9fa71a16cba151247e304522684cf24a3a862bfa6088094ececc1972d8084cde7a8de0d466d3d70856a8d93934b2c605b4d52f43d65c415bfd2358a1af9a2bd46ca77ed5dcda7401bd99f1fd355cd01b19df5fb305bd617d7f4d14bd81f9fe1a2d6ab2a0372fdf5f8305bdc1df5f83a337f6fb6bae6072d80837afc1426f5cbebfc68a1aa89a2b3555d09b900a7aa3a2371f534500d0679101b976c63f6bbec8fd35b9d631fefd3c38a9920eb97f849bc3948e723f92b520c8fdd886dcff7243ee8fa124f7c3e090fb5921c8fd3272c8fd3388b2d3b022673590b30fd01cfd97541a02c9ce1f398b81e6e857913319663390b32434477fcd33b011906be7c6cb208d80623b371e26c68db7f731a901ac8131dfd2e846499578c87d5225a3dc3fd3817ad0de7b59869c0d65af9c09c5700e7b3dc9fd4a3829b426a0d7d3eb83a19a5b57be9086c04a42b79b549194849c74c9973492794b9623dcbcc5c10eb871f9fc98d407341d39528714ce61319c7b0c87d3f1913a907438d19144ea7822031d51b95f0716d4690ed3a1a403ea9fc626ac43ca8793c3c9e148d91c863325fbc9fd3456208cd92b75d4fe889a9b2a2728e708bda1a2828c02c51981a91680360254c36a7cff08b71a244e96e6f94a1c14609c5ceecfa1e5fce400e124e1e03c69586ecaa1c57268b11c5a2c8716cba1c570b97368b819793563685ced685508e2194347a24a0913086e60cafdfd8c19392cb36d0a3eb150ee3f73683342d66a4767f0fe0da19adbd008b7be33e44aa9dc9c043f109dfcc21bd1492fd701cc705092d7d6a021f3ae2f3358326062b8c8b8d0a054585d0214ee033e58e2eec1e798ebd37ec72d94fbc9670bd924380a1e427374d7f9ed964f5c71385a9e3577e2f2ac52dd956e93d8247648b4441606322eb0adf03bd703207067cfd1683418da850a95cf4ab338601932e053ac341c4d015e1e6574c0f5a939451bb96092cf4aab9806d41ef4c79c00b3da6c5b844580cf4a735adb5073b97b889394524aabdf52081112e09366c9fef56916cc9431148bde6bad932e52281a398488101a4e64f9fe4facb95b435877e84c8d1eb058816a3efb670ba17c56a0b33d90fb2d0e628d27f069ebd387e18b7acae7e7bfc2efd877d1d49ef1680ffac5227c7e390139a26ed1238c34267dcd64ea16cd09c8c58a66b4906a527f85df7179d00fc600c7f8d34c1373cee4b6b95d7dc39216403046e0fe9ae9521645f9a7d23e8adb4e7d5bbf543176d4e014ee18921256b1917299e61d3438e91765e2c129d31d4352fa15e32fe5abf8621052a73efe069d825d227c81eaeeee4a7e944e093ffb15b364504a6917a108c3d7af76bff1aead97dddd416d6957d2eeee7e0abd6f37a5433397569f9696bc1687061a74b78b08c55a6badb5d65a6ba5558346a2371b7877c74237b6fddeddb5dba5cb9502ba5a6fe169e250b31f57fa8ab5097a534f000e68daea3e55ee34a0ca16a4adee714687c5a02d32db287317816ccb6c6f79b7587fe976dcf786c1930630a10d085d87d6bcc05dbb76db6e21dd8daef0cb9f232669b7914c7edf77f79ff85d589e637615489e9dc5f2aca7912792554455a802494de5709d8d367dd79dae7ad294e768bfff2e40247f9ebf8e3ccd8e6748f66a39a64a24456da799bb0b0cc9de9f1db880973ddbb96f5757dd539bedd7a4042a686a2a2aeae969e98a945ec1a9df47ff0fa86f476ba582a581ded05c832a254f9adc9d2e6bbb526b6dbee5d9815c817c7c9f933bf957bb00b97690abe33867d8e4a0383ee88a8262790689995e1838e420093e6b50ee1a44de12045b83fa659f8cb1df2198d9be2d5d357b6d7a2c46639596e747c9ee158fccc6a6cdeead48db6fbdcfc10bf8ac51b97bd3564bdb76a54e7300848d80be1dd59fdf91ba6547f53adda9dea65f34ddeafff037be3923087cc6784fffc6786508a6fdd2c96c551dc25a032ecaf497a49c645a0ae9a7a615413ba47c6d3e008aee58c2293d81f4c4d11339506f41208a174ca278118b7ac0141625328725a8a76af32f39a143c5ed382556a5e5763827d6b34df97041385a522e0a1c997c62112a4c82d00a222c4a714515bcb25247a3172e58aeb0d92b6a4d5cf12223d3a52b9848e12bbe184a302296ae29061820645c01242307d6948825eac3f284a56906ae080b0a3096232c435882ea17068da9dc5fc54a3d2b8b1a4f4aac6841be210ad2083e6d5649c1563c7192af3c2d59c1249fd6668346113766f010235a2b94e4a64432ac252ff67eb32fcce728f333e3cb38a1107a2b8cdfed853e14bd60821d92d0a08253d0758a6145bb402285a90e054c3a5a4567d6c3a3cbe74cec345d579c8c3f5ed161b47d3a00e1de0a33a8a7a1a9294634b1258514504082021350901409b17a02091c56892b2613596215577e08e94ced5a7d06cd5691a4ba4873fb5e9f61a9c0d1ebdd62d75d974d9bf44fb146ada9704271d0fa3ac34c6fc8b4db8eb71b1285719927a5dc27c8f459b94c8da85bf1ae78ec779d8d5abd1dc5a670ca27b5e1a0d76d6d52fb5dedbedebef73be780071c84956f791ac9e0bb9bacd163b8505d054c9fe64a25d3a529a4b2156d1edb90e9d214b64cdf4563997a0c219cbf107c8b0cf2e7226d9ca64d18f057c230e1d38afe21bdf1d2d21cfe5488677f2314468346df4687870f26998ab6262e4981a35228e573269f34b9bb3e3383804cc57c8aac3659c04f6514e6b980a3414a8988229cecd09f51d84799c2e94811558e9e76682e46caaded3a2f582170205bfbb58b90f68bd2efb258fe4940f162c826e1c41a224664239e1f14175001b3e48ec9ced14a52ee31d3252b445690d0ce87da514f7ac0c205a426a503401161b4050d47829040306405e88a504390521316846480010490b042b4c4110ba65852a9d0fd48c860cb5251cd88233625507201e926050a513e606ba8a205d8720a01d312535b90584202326891830b504a6004092a8e55a193f0ee7b90f41ae4e9f1d58e7eb5d5c0501282920411131ab0d0800a5a5091e48b21b434d919c203a1a5a12b4dc152152872ff27b2440064ba542588fc92e9529522251fc20d286089024912453b78922a38e006a8a034450811a460348211fc6287f66b611b562528c6cb62c1030d47564ec0c316456e67b0d9278b13d4b04511372d4abab3743718158a2b9f52a580144a48e1c11695040b76ced1ca50a958f95cb07444e5091f80942059c235db8f596b3abe54c0f8c1c202146d07308ec4b06484c90792b082e5052d555c819fc865b40229211bb658199af20919f1e5d2072827a884b1040ca49879ddb1097ccecc98ae1ceccd00932266c08592239618c23d9074b31230c860850c5fb0f0022962b7fa45b049feb2d8b997d40f1603b37dcc52959f4aa552952758b2a8579edf0eab6175c722a90f648721904889a28724244e764e97ff0083cdf63103be80c2c51038d4b434d1ddee8d858d4a9105125b10610224465590a86c366c70d282899fa0232b8c6fba624c3ab61e62401c790009d31095a21aa4240816524021c114a71008f1e1f15db47d0613d09880a1071c0ba020f1820c2a234514c1e4862d515cb1f2c57d7999c086255d2c81418820764e57b60f84de7cd68525285ef030b66f3a8c42cd00ea89125899e202931ddb9d82afb68bf676b5a558dad37ab7b4df019f2aa8d48c1846357568080000400083150020201008868382c160208c026df31d14000f6ba0466c5e361648831cc86118a50c22c610000800801063648686660402a83951c1c9ae87a05e62f374a8638cbc2c7ee89d06db23c06b2175756614da146debbdd907f479c0364f8726beb990490cc8913ac109cd9fb7ed0e3195f38dbb87cabcb9cdd6c52ae3d166d0ea0bf622379b881bc726b9c9a3278dbeb43964e058ccd434fd42606f7382ed919ce27f51ee3bb87690711b2b04c4ad59ada286b8f1cdfa613022127c91ee6e13f7741e2e1f4a033dcb250fe07e023a9f88379db8f4bc00452d1c16cd0c4583a6c9058d8314b172eb9507bc5298857277f876b0d5338ecfcf60d7612a2d76dd88dfccb9fda346ddcf19b348f2ce298c89ec575d0010ee05a2d1ee62d7e37886f2a79ceb7acc7bfac2ba994ee64e7a54d17253a878625e28b642ede3050ec0a10116646b714ad8ca82c0b5575e7450dd5a1e3891e95242a15afed539845fdc7b58e863eb179b5656d4ab2cbec6f63843b6bc3baf12d0c3f7586f12f74b897a4556aa8c89ce2eeadff8ab0256e4d45a993307ccb07b0877cd09837d268444246a17394050f6585f46aa0a4f2a59b1f81482b36a1887bacd0381784f08475f40a7ed34d6e4aa7c7ce365681c007b8f3b4b628f6d6cf789efba2ab7eb8a5fb2454641bbcc1ea87bd2ac4419027170db9670710adfe5530f9f6e9ac43b095eaccb85704602e354d875f7a8325809541fc9e69d231851840400744cf667e0810942b8fc8079254a304bbad3358bf7e3ca00aad02ebdeac77e7175940a064719283a2d4390e80a1caab6fcab09cf044a0cfbe82d2524f317ef98eb092faa46c7f8a0b72651864b0f39c74ca20afc90a312aae03243fa8de737b11958e9b0ab44d319cd09b31de62a1512ddec98c885e6bef4d4d0ed7d7a80f98ac7f5720344e00faeb3e29369a09c37099956de146d23150c9e7624e501881757361a7b54f40014c6589a18b98b00bbafe8fd31a6eb0deaa7b59da2e4dad24d395df6afc1a5a596a12828d46a691ac35aef470c00b90954a9bd1c339a54eed25d6a958a25131d164fcbb89f3cfb015b96214390648887510a14e5220c1e7797649dc5952d35814e162138df625a4669b990024a33bc36a63757e39578ace634b776d42a556351b0e32a34ef5418292454fc0cd0b6e735a4f0823e426e62543316c810b9dbc9cd3e82cf0bd726408b41ddf6b44ae238c9a0f33c28521f725083f0b61748a477c963226a709f8de6525c92a43cee62d204597d54679616b5275bc91d6ccb22ff28a2f85967737b2e9f8b3aae01db75fd12f5d3691819e1f13734a32370f4c25f189c1a1356e76e00ac2ab6834915a0ea01452f6410189b0b84b2ad31da847c0db4227af9323ad02756456e57cc8ccf5aa8b18e095538669e7040935057476d44d6978e497ef1dc1d2d1729656fdd29f48a3c10a50566cc6525c9fdbee85494c2975d46cde707e9bfdec270aeb19b261b57b51e048fbff28c34c28e8c76e73a94611512fd99366f2e8ec5bdda81a22645f2b714a24a60b82deb95611bd72b6cc5051868eb2488569ec7d945760a46520f8d65499912fe3b41fd904d935ed9d7122b5e9bf1e850d5a432ca7c22a85c0cb2d5b47a1dc7a8d5b625ac178a4e2b7af66dd0c4029acc471cde85b71e3d193283419370cdc0155ce2f8e32f37541cbbb9a3134098e39953d1996a01f62ddb786ebc560e14cb982defe056a701842853f60fb3c40033993ee9a55f7601fb7445b789a88e64e269d6f8dfde2e3d70109fda60eb5edf399da807ed50b2199cf000ce3271c5ae74c2c86079cd85f918412f90748d58be2062914e9cc4471e30b0f3e6ff9bd1092a65995912bd39885d083e02ce77af195d878063115a265b892c98123bb662e404d6834725ffe80711522a4cbbef4713bdf710951933272f5617f2984fc5dd1532a50d8572165db7a9415680ca24410c184b1354ef4618a5f9ac6643583719c60434bfdf3cadfcdf363807f12d226263bb4623110b1550dc35dba7a6cefb60ca9bebbc6b8464185ac08b28b2e1de0a6a29e16e7d8836af2014f2925b55e86da5a00bf373c0990f8653adbfc29abc9938a8af7cf9c8f1e4b3d2283f3cb4a3f4ecde552f432dcb77fa600446dc06c35f8ae5e17388c2e2df5aa98d9a7ebdb6845adf1a73b94005867543f7ea52798b65cb9f91b5e802b64518f34761a00015883e8e3242ce9dea0f605c8e8c8aae97edb5c606b5a29e02e1e74f3732f1ecf063a53fd6e9a1ba998d06cd6500fc15f26ac421dceca784e412883e2e7314584fb507621229401952a090f7bee1728842118f18894e8b4abcb95ebe06e9a453beae24c7677411bd55b48f2ef8019af82553d7ac8baf7b47014e6311c88553252cd6807ad0af5d0e09ca85395ad4c0dc6001107202bfa0215dd608a2bb7f027c20ece97eb8fc45e991fdad6084e5e8e32e36bb842f0c3926f2375f9ed14a3914809837de84b7b0bc55ac34eaccd45e72bdb1c6e4b0226d135a960db9872d91c834bfc1b9a606307275c8875b941825b9ccba65f4166f1a5d79d3752754ad8188b4e9ef9b2a05fa55f5ace91207f149f03a8d3e3c1c464fc8ea0b6a69c196d2360d367f951f3b3fde11834b6dfb9549f095b560584e0d15014878d5a48514c1e968a70ace65663ff3ebc763f618b413f131629ada2436f60b2367145a673eb18164daf19fbe865ff194c47186705eeee8986d665bbca84e5fb97278d7ba8aa05948f269612e3efce798bd7a015a17898155c36f28ae6326cf84590581ca718da2a38bf70adcf4e46f715493c9341a2468bf10d30a6c53f0c609bacf9e9d0c8455226f68e6304c2dab7e053a23f50ec141af4862742ef036845d778e4fb42932a4531f6e850e10388f6a6de91c01e32f88759a45209a13ff2fddb9a1ea2135bd9885d8a061118979855a453082432117f8e01144c9617d90568bd4b1b153a1dc59aacd526d2667a896f5eed5fedb6cf8d8021642d7fd7adca0a706c39b28b43bec36435219566457e810e684958464b056645ea113fb9600c5cd02abd41309b3454b2cb357b3329db2a843ca987fd09fd41fe8efb879d25d9ed9750d1b0cb2a76acb6b37b1cef83c13fe5f2bfa9104698b06a28a582065ede5e8f00c7954db9d9ed6ca075551912bbd3398e4665e6941a11179108653805e4f54d425dddb62865508b0c47d8278f320968f554a4ae8c5d9df8d0770462120350b2f996bc9709601b68a98b8a8f6b4a7d23879f0efdb49a60c39302e21fe79d6d67d1e71e6e431b98bb15bed3ec77d2ed0e22e5799013edbba0aee6078d1375b337ecc7f9137ff5f6a4daad13551d095c41134cfa20162a2e17ad48c02eeb229957145b5e6104cdbb2fced840c1552271317ae2d108e3e37685f1246f8b735865af9f5cceee4bbf20c6d87559d0a09cce3be1eed2dee386af11edcd648f5531de60db2c481385d970bc0706ebd06682da3641bd21ab2d7b9a08fee9220050fa98b29db0cd485de3835b2fe8d3abeef2a9101e51ebfb2650ab388b1091a82c0ede071b7d52c9cbfb115b02304d74267c16bd1a1547e26bde8b52ebb601711e7ae092425ba2d8040fc6ffa243c449eeaaa78b7eb26d39b329eb80ededf382b8117ac8689e1aad0c1d3ab616436259d931d1d154fe57a062fb0189e84eb239026859e659018d045851a6ad0a71d548a275167588429d8064be8165c69fbfd56261cce579a13b8c7552d2b705f15195c78597367559221685c556f7fa18cfa5e07f7bf01fc74a1c3cf90a187069a3a09bdea4ca7a9e99396a0f116086d0ba0b6deef40e7650acf3d3926b81a0d34c111f2874096fb3873230d9b034f0259c22745f1597db2da57e5d0a4544c166572142439f3066c3b387ef2008dafe2ba923a4e9e70bc19083430eaab4d13075d0780f3ac101ccfa038f1dacc1d0defd21514a77ca97fefa081b647aeb7aeed91d5a309443d354e74e93602a4fff8a064f7a66bc0f4f93e90c1be47c4940b48f0043b92af6abffc211479c664cbfe06ed6999f01a315c1a3c25abfb4f6a2355ee04d6e458b0c7ab256823b0ff49d978a437c4969897f987e377b266ccad4d9448a11f6cc8bbef736d8906eb87c679572c2ec2586a4eb0722466ef4115649622751111fd67253e7310fc1640e78a57c4c01fe073f5ca28c2688a64ae0d464d4dc9e099a8c16979303502e08478e8330779b5613daef3e1eea588f02b0697cc54e1617868c6d0c09b88bf05831345db934afddaf2a4088fec64814ce12fcf23a33bcc25b8ece0dd4b82de0a74219abc80c83605086af18a3a4e8c103c8a8ac5d915476405cbcdc2fb8f4deb68185a8254c14346bb115701fb8479f183942e3c9935debb8d161b287d82ba01ee2081812e77426e1fe2cc84f787225c00cb9be9ce05f65844605324d2d12c8df14372abc6154f539a47bce1a9eddb14f9d0545194c57332c0b890ad9905091063f8664e01743ebc6ce4d357d471275866c79692577c6e64c27aa8cb067dfa3d9a8564063c4a1d16a9671e3200e8224a787a33a205beb627d2f04710853ec4d12ce6f987c0067a2b00a0eaaa4cf45eeb69c997e3de847fb899fbc4997be9db168f73c4fded8b9ce5dd86b5a19ce6fe717ec85ad40fca11a35d28fbb3ca3e714f78b5ed76f6a14b0cea3049afe9697503137a6043f3c94e6fe52f2b60d930922d8b6288b7f924a4a4063c2742f1946f71a7d1bfa94f3e1951126d891b9b3650ba90ed414ae50495baf69c52484bce7d9a78a86632db0c1ab61d5d82c1052bc56aec14b73442580a3ebc3cab5053906601efdd82bd942f395fdadd5a774888bcd1893bb81f90157c4a8c21a44ff994131edf9b588bcdb404570c791d6857604f3e2025e84b2241594ab57b9711854c069036cae42eedac73e47e7b78a1979a92c0a3fc8771ceb79da9213c2baaaee669043a4578e213593d2a845b746e52064112719a47aa2977afa5b0b9902c887c2980bdb79cdfc013fe2e189f286859b59b4393cde058402d911abd650a9ae18c0b9a47f1fd2a1e94745816202cdaef7432b62f471aaf5e5d9dcf6e733a66925398a8c77706f6d014b4646b18432ff23193a4bc938a66329d78ea426094fdb635a30487f3cd165af792c8120e589b1269bf7a684744e2a818b8ab90246c6495ef07c6d722b2aa86e1601c7ed68723fe45060ba90f4558e9ab6bdc5166f58a8ecf70fe3e912e5a98efc3b77fd587435de24e1729cdf2c7df5ef70bf78090500cdfa5e9a0a2c8c53e2d3b3bdf4ab55c6db2e4d8556f092c4b1b06b83934870739a73b466f31b33cb517a94e70cc5870f76b40b885b8db27c76a69fd91863b114ff7ac673732b5a27618020bdf68dd0465927e8b77d4d3dd6f84815b83f1ec0cbee0da6385b61e35b2b5a159bfeec0810ed732301245215e38b7c6b43a45f6a88a88f91ea2c9a110173d2499f2ab41890c9dfb5a4f930ba6a1fec219292b74e81f3adde5cefe154388cbf2e237c39d69ea726cb3fe9bc5f40e53da56123a9ade5dfe23593299e39db04500f5a65169b38716a2813f92ea3b2d17717a76ffe5f9cd569668e1868c7713516685494391b37d68ebe3d26570b9e261a572183a047ed57d89c4d4539c73fe16d6a1cd65c0fa1e56418588378a8a29387faaccb0172b6cd10a338dace4c2debc630fd2ed3d1127b7fa1b111c2e97c66e73a0105195f4dce3bbfb864b753ad86fe3315a256d286092bfd0989309dbd558fb68845f62d3a0487d24da669937017da0f0bc6142b6789c563fda6ad04fb3ecbeb94969667e67eac48fbe0a002f4a6bbf986d2e272488d54553fb5f538e3a1dd8c5b62e35b22aa33604c5e00bba2aa4422c6e89999c630d85588c29561252d09c49ee700a7dd4b95836162e100fa340a7318bbe4745f43043e6808b3f799a4d4fe75998e8b18be5a5e2e314981bb613445c9cda1749423cd55be5c5f53a283b0480bf86f98634a152850d82d7ec2524dbe6cc2dc2dffc9468e2e7349d78ac149112a1a35a0290a1384e3c889b81fca11394180125e3f415066ca51b2b34b140cd1e53a9b12cd9a0fdb1ce98cc259276e0b6c1d0315f03a02ff96218137b900a90146d4cd5337e1e7bbcebcca88ab54a81b44cc207defe6fd1594a540aa261b919ac113509342c01528f745c45731ab4e48c46aad19e31c1bda90282b55aecf70a6147b3e2d84972f65d3dee829a779bd20705a4d509eb0d08cb482deccec079a3b919949119d5359617a679a3ca1a96180a254d2f423a74bd52b7b7519cba3329f834b20ffe8a772d828300d1f00ac9542481eab6d5ac55d94e9a3213e716346fe4481c342208841c4a6ca02640dd075042c81e410f788fdc539a1299ff30fed53350e62b81442da220f7aad3db28a73419423d23a26290f74f1af0b61f8d891663c6fe0a6ff720ef8bc2064f6f002587246a8a8efe8a0c22cc896dbfe1545b65c35ba7acaf4c28de85bb2cbb81a1ee7b97b1d208bd13faa6f8843e55bcd3a8bc32fc441aae53e5e41ea26fbb4dc8252cd46bb6edb354f8501589c8787a55c53430bb78a65b1137b05ac8fc65124250db2e28374a1e10a23b0aadecfae3f4c1771839e308adab1c8c57b7cd94130a12c7be598762d65af03488515ffaaf7bb902e06050764eaff4378d1a1c77265506cb2b43c14b2d0da2e27e0cc3ed2ff2b4918dd03654c56efb3757eba40f8ea97368b1c1c42d031bf89f522df9c6663a8f1ccc2a1b898a70a31fbe24219ff65d0f9022ae0bd10224491ab2742b8301edd839a0935b92b0ed3910de95b01fe02a2dc9e045a78bad10f89df66ece6f64f1be2422792377042631022c5153e748207551c98fdb1dea979df97d9748508e90ca9047729e5862ff0ae8c650261cc653b70881733c32212b272e3a855abc19120c69696f67d2344bcec52253fffec7850a7a52b1dfac8b707061410d2e1dc7e062e1cf5809a27f9c90645c15f7b5e0f8f1a81c95a64460e676556a4fb4dce0fa5688232909f9d93894f644c2f3097a5aae60a24093efd0eac91034ad2f8334a9f54069f06a4e14b52d9453eb25b2c1b11cc1b2ae40478f525f1e312db6a0293e1a9efc08c3e2edd4ca60134715e2426b39f60f46638e39bbf0266e2d54a515efd6a2658975b0adfe2740a0da2016c58f2675805e5b7185ca3a7bd585572e5924c23714e549291e6a5a971a05425120717c2b6468c04551fa2ef8fa8bf7d930536c3d2221b5171545b0f4ccecff640e6d94ae40a01a02d98ee1f1b976814f48f92dcfd1b101e5bc4c2734064a7fc2f424cf7be481a550566ffcb7228e9938b4d307b52d4dcb20fecbb204c0cd841c73f09263661786e21dd139f54af538b0208a166c656c29f6e741e34ad488f9cc48b470a1a22d198f6932d30493ef4cbc06db7c153012ce6fa38be984ef44799b2661723875af49d67747aab74f9a49308317bbe240bc7d5371e592720c0bd8cc4853155cd1413b24b60d8a2fc61c3965dd14441b9f393dd90bf6477d13d0274b56b06cf642b89ad11ea20d34af6b7c2ba56d99c25ab2844821d0b30307182d68dee73bb4b89e5866a2b5e606681165259063fd640f8dd58e324f35a12289e385f6ffb4b4d573ac63b50f8436a0a4d2ec19b97c8cdcada227c8e92c2a9a074be095e80560e89dbd2deeaabe7c329aa644a84fb0b3f82b1ef963a0a28d557d2d7f94e60855d5e2b5d25e4b3ac2692b63bca182f4292656c8b6e2142b168d226b017c37c458431f209af82dcb9ca78c107eb428ee64c2fbf4b53dba13e1dff43cc90491f788e9bed528f5f4181608f8203d953d1018ce8eef28f11db31c7b3cfe586c110d81ab40277bca2b0b68698f5267a70c7944600db7fa26ef51828800915e8b3d7c0f0723ba51763893183156665a113d5b93d2c3e3adf557295f59deea341cb5b84c8fad689fe4d8c2ac9b32bd9d5a5ebffd3789dac001868ec32610bfc10691752364c1b3c3a23e81568a792d43aa0f3bacb5ac1b6ecd0b9d92496331539b74076409fbc75e70a747a2804851d2ca34643b04105ba6574b98891b7613421ebc8f8065921d5d00c982574a3eb20aaa74392432073957070360e8cc23f6c3cb32eee4b875f602b4b61bd249b6219fa639ab67c526063b0c9bc824d52aaac574274d90eaedc165ff886853477a9e2aac5f610c2e3a695b6f2adaf2694d823efc4c79f5d4e2b6f419cfd6b97bf267c1d0649d94226de2646f72d20c8201fb41c324259f9cb5d5dc1098cfc150f0a1f64cc291330f5823d380890c4a404af9c44c9daef7bb346f09565aa59e11b23f75562fda1b26d7864581fb7a825b66aeb8007a9d44f5d8893f40b752f1dab17b917b714af2449f5bca22f8e9daa880a2531164082991b14c54867e6e7d95960fa726a1b06c2c3ce92d0df67bde806a73b4106d46a423ad8c655d64c14f0eab1592849f735c5ab16658d01a877181c837351db9b4861471579f33bd56eabbf0b0e269702371a8ba04caba2313a5e90fea55195d721713c6b09a50f33f445224437efa8dcc0cc07a95ada0e6089b9d3b2c0f6147117246586beccd5aa7afc4fe21b56e68258e541038620bcbd2316644807f6ab9e5e86fcabe0140784875f8a9107d131fa4de1f608c335a06ce4d9699a44296303661ea7dad0ec0cd42510bc2566a2d284dfe6f4d8a0c340959909204cb69428411a61085ea5cee3875d1d02adc27abd015111cfad9d6b99012226bfc1013b152d01270a716794420c8786f0ed7951886bf7883187cd53660d4af8725272547c5d8230d0b9b39e447bda7a1019b617bd6ac9a3a038640b7eceed4d4dbcc0189c4bcf247a779547736422b6020e31d9daee20074c86928639ea0e98ba806ff2a6df1a5dfca24d4a1c12ea8916721cde04cae639971a6f0b40725f185a8807404989c3f1ef4f43fdbfbd0d1a1f25e5c7c944d85982af986610a3788aa27beaf14a6c058144112b0bc872f25a901cf3903b187b6aa980cd7a64672c946cb555d91c1865408a088d5079c2ebdb77329c927e27ac2abecc3ad1bd7fb594834e969aafee9c9d23b76fde5543f2d73c544729b1e58c994fa0805521adba10b44e4ae57942d881623c19e8313fd4ec8e5464131230aa02eae461d5a284756f71efe4c70776061769f3716726a0c977161b7e89dd1cd228d0743ad8c189fd185a37839d2c9f1440f839d239e93f59a6fca05a5ca8c2f354c4a1d36bd31a5ee11849388a9c323881c0ecc6db534b4d71e12a3964d8a0f199710fa9e57e7d14860b8af5c3a2c11389dee61decf5898e4cc8a6c0c7c5d0058a69fbea3532ddd75663875743c1f37c7719e3832dbf49bf37efc2701e79ea401b2db23fa5d7f1c77264647384cd50547c63ef61e465d3d8a3803c4064c86909c1d95c02e324b1ad20f8a98aaf552619fbfedf938c3ec0a16bc8db3834c37df0b655c408557153cf5c9ecea0b4336f194c1370d91d0150de774e9ea434ac81c731fc85e4ce46acb99842ef24f0819eccca43cfc6598106fb35c8f24be374f6e1df2389d67da5c34148de073bd6cd770ec21cc070a6751f33408d7ae46ac315e985e823cabea754cb321419428692892e5aed353ff4f635a1f052eb15462965c94789ad332a59394a4b1b3d85d84c803bb49b55523d2be84d24557de12aad69e6976be7e526baff95822ac556b32918d69032bef0cdcae704ffc1f3d8fcdf5a4042f335acc9e7184d8ab384fc238e3b7662074ec3d2ff50dade69bb2845c7d72cc49ea06f38ac288f8485b5f4a0bc6fde6c8418c92fb01890da94ba8fce2ebdd0d7d186cff06d50d93c30f6478764cc567979bf6b453f218d548ffe9c23b773c0070d0a8dde0d74cea0279ab47fe65c37a0eb6e9903ffae3cc9a59f8e857a2a298ba9ec61f0c70886126297fc5040166a2eefee03c39db89c26a0d3fc7ff06062ffbc82d49229295ecb9d4653d9335294b122528405e2dec8815ae4539e2bb67309c6f6b1927f8c743d1d2db89ca501cdcfec1329b0d56f67314f632e973b07ae6f163725c186bf591699a23c245a34c15d05d6082eb4a2e8d02d1a9fa1a1702b2b1bbf608ce8c8029213e1026834cafea42b1887d6bb98f55a9426ee9bc0b1ee72d1a9c6682235c0f770d2715ba601d13e0f99482bd922d3478dd7db5d6d0d0aaa05eaf9784b6636a88346930ed0a61a9c17787b85be05ec54edc402a86e9e7a9e0bb754efd1714e18cd4b192a4d59a1e33424c63d0646acf4019f1c8b964421ab1a441233019b085465387db768c789174fa773c6fbd9a436bbfe569890d32327cc99295c5789e128cd12a893457fa4dbe60263a995423b5b5c778a13eeb755d19d1b31f2ee90f5157606aa7b3b6bed434820f99324feca398609e4e3ab1128e8a32faa93bad33183897c0ed7709c61e4b16d094c12b62b9d9438097d8583282ace52811e47985b807e716bbcfda4d69cc8e628cddeabf9683f238d09ee80a16f2a5c030baffc01228f02053c83bf600f8da5368595c46ecda9a6ca08da021c76bced0a21ea74d52e43c1483fdf4b269ce513681f959786bae38026518b0e5fbaf8444929a618448397f206168c28baffebef94956dd939188425489c49dae769088bcbb63282880c8c9411133c558c43f1d03eb9dd15189ca2ad9100b933ec2b50cef0aa5e934c8a674e5951d2a863132725295730e8a137b907c43d9362a384da7890f0f08225c06cbd144670971a4af2269d9b3f414c09b0ecae77094a8fb1ca832d8b0c8869ab74613411bcf3b118182590b4654ac294f85b9de73186f59ecc52d8db1aa02da405f9a6c37ade1776a0a3b9cd8f182f5ee1b1f120b0b4605ce885f80e03e742ef9da60750bfa51ef7daccf244ec21fbd1e1f5c044af62733c65aede7a03f99ca32067d6ca1a9b1d84520a179a8994a1aee3b430b7c6339c3ea59f0b9c8593089bf3dab8a15b72fccb38af5767d2593b0764612f6ddf86f1458666f1f70625d82d67b410ab26c6e85e01b3e47d58aaf95e1988edd041f4fa4c75c34c20de5981f14443a86305e23c1b07fb1313be28e3b03f3e1756338ba9150088ab454c0313fe8161f5982ebd5d99780b9c2e53aa8634d4fa95c6c176bb8f8147c24f6653f0c6923df2348a1387550889e11c7db6d3a167545f8841a627cba092dda16acc423e676982e80f4f5e8dda2908621fe645e2efa9a13217a738ae4cab0edf83d0d22dcfe8808ca56254998b5f7f1c7c36844564e5c9f9512f7a87883f19830665936b8ee87eb2b1dcab3ed895fbac7e711289a8eed4eb11c1226875e51f0979625c07c5c3dfc013dca563f306dbaaf0ea2fcef0f2b9b1ad9a0b0df6879abafb6d04fe6039ebf2e865154dd761bc522f274e80a3bf9420c8d60bb5c9eaf6e2682603e7ef1129557a8ba7e7668618259bd17167fe98a8201432411e63881ef850c99766637b5588229a5126e0d3329aba5ee8b115c47ef46bbca7c442be60047e3c3b4c3de2319951f7925d384f95b3a4c55ac4bcfd9d9fc208769bc185d42d4e6c337d06ee24ba4818b8ed0962b52b1860329d42cc58f0ef6167ab0b4f1100ba92019a60782b097d47b3916bfd18a552ad74e97f6890f0678ce7e33497de0009fb641c67e37f2fcc8ff2365b8860657be5f4c4a70092b662514a12b403fcd6990e92d9da2a66dd38a98a822acec8dec8bdde4ead097d86402ec0e6a56ee2a3dcdad24101696859c6a9e8ea1f60253fba9612c38454acad3709a699ca47d1274905fed65cb035aef0f2b57462b00e4735fd2a34fe245b15eaa674fb948b64e73e22ad0367d426ca637a103555eee3a3ad91cd4f19daec16b9f036b64fde67ae1667c967dd4a4ef2fa53cce37e868455cee16d83279a8d4f0282d9f0150796b651ba053ca0c6b454960aad16a864c641b26db99ac210ee1a2798916c7200f8b26db91d085a11c6c035312dfe7882c122201f1d72a425a3c1d6754ada6ba70aa6a50225f3a880a1275fccb2d623ee2ba8a1241b57f1bc488ab55d85b235196f339b3dcc509a938c5c98db55b5f635062fc23ce6523528b6fe308821c39e351789a252950fb0e3a221fc12f389bd69c080bf4a4c288b06c8eaa22961ee12b443dd264fc69541d26929384cb19f496fc0174a08838b725edfe722a9acc6c8ea0270f22c224e0ffc4e924a8ad18ada0b0cd8521c47d54a13563929b0e5aeee131d3dd00fb1c6ab81979df0ed73bab5fc7c3a952c17fe1f601ed095203cafbdba53c8cdc2b2f52e00bf3f549bd6eaea6f4683581f5da4a34b230256ac147b08589327e343889781a75e1d4db7527f7220dff9707007f093cdae61ef059934a1ed739c3a512ffc43c7aeb598da8ae6adce0ee12c40015ec55d2b70bb9ea19d5446b8f3f73e06e90a22844d9655ae432bfe76ce96403b7a9daa8d212242765b0c2fb3ed0204769313cb3582a0a1e05dd28c62cf703462a09460ffd565bd1cc8e92052bdb0777c6c0f08ef381d6c63d85a6b789fbdd904258d88e44d577062412dc444814ab6495dd7b0de24603961410a14dc6d1157d5b3e4fc97fc240be39e2efb0ebe618320fef83d61e9e513a080ae924d37a1dbc2c4dd1f4a4a184100044f42566e7146de84b4fa63e4f91960d94f6f88c9e9587e7dd4601e2ed81b2de2a81a831f8837694862e02a64f60f2cb8848b2fc12ba7961042b2a99343f6ac2884add5ce523070230a46fa12528cd792a4a254ee200d46f579d401a1350e9f99c3d3d16812687f10498992e1ba98ad47f4487ad2404108081c8030e9b9d9fe99ad0c519d57669b663034eb119126816e38ce35e7e5fedad15e893101d44bcf46f8d71cd65763a8a2eea930f9703dbdd48103370a4b8061ae60e48307b1460c31e5a58321e0efe7834d5b63d49e46139b547964193075abf9b2d97951d6cba698b0b4931ba93c6018a060ec163f83cafa60dabfd09707168189b519f3689461a0d45214c6995643798dfddc0a12bac90bcba2c94b09e439cc888aeba8110db89fe48d20e954a3bb3b4519b8f8b886001724c5eac78f81b714b9c7617cf754a41f2dfb6379764632a54785ad6e4dfc8be9f3213188bebbbe08e38dea075f9dd264e5f17de4f738dc2468364d56b968313265009132be56e1223c14ebf00e36271288c5efff2486801cf7eb2513c2d016960652e008c0e3074f7cade9665008034e06c26d532a7044838690ca85935ca987089c9323954d03467da58b00195756bb48ff857a398a38d3dc5f22351ce59f3085e293e24ead728fec23b89811b516af0b7aebcf44ee3cf674b414627e4e5b274fef83fa0a1673abda096e86c0006f847a63b9b13203c0385e0081ce9025078034712a89452848cc07d704129ac8f5cc90ce0ed0e17f5505e31bf6e1967f87a316e54951396b71aaf4a27604b7b823d935673243fd81dde9ff7c2e0150cf2e00382ca0ef4111fa1c94c12dde710d707400923676852f940f632bb667ca21c2b4c312b9d3daef6f86a21bd530747f4adcb2911ea9588513428aaac412405612b4a1e1cadea8946c0c494cc6b6bc20a183112604cfaa6660e0883d3d5483cc1d389da0842e9681605c0c316f027ea4efb4cb274a1a693d396e36ec02d17fd3ce8a89c2020002990ebcff9b1b64cb2eab707919a5c4adfcb581b0b8ee51dcd87c32295b5ced16ac8ca0a68c7577420ed4e3494e31eed509377aa34741a3cc0ee1defbb24c8a9e9202805aa03fe639031d32a127aa489719f932a68feab2d53a21a1582f864da552e858e3686cb2dbcfadb1a3a3e28e06b81914a10ee2b5c22f8bde5b8858dffd48949a5c41d88b68a67e1099c715f7eb04a5829bf0c26256e90a8c9f86e4a08a4bcbb178f27419515255af021debe4cec335cba344a37a3f6b18ead12cba3ea38355646306ed58ee8a0ebc6d1eeb494725dc6f2781859ba8766eb5c47e8b0e859845d5c2ed2c97c25edbc9d3926194224613fb939d93dfe3cc24ce3a8b1a07ec44187433a8691673a141b3eb06d83340dda759085965c1552a1ad23608c20628ee96195d3fed49246d6b0188fe63c9da399942325b3327135f2e0da1154e2bbdca6e30a1b93dc9274f4cac007d83407f8c3b9eaa71582e9599c90ba3b7d6fcc3da1806306710d7cad28e6dff8bb4dda4e11ccd2d1820e05c9a0719e8a1cba432554883ea6985074176624324a5ba1939022982ee9cd735b0521c31be08a64d75fa3dff69074b0d5cdede54890d959a02f5edf8fc4495004fe5494eaaa5e9036d5cc8fae38e1e383e31161140177e7e47bceb8194a282844ff323b13d27bd8da19786a58d754c62b13b193a2a79c4889c083c6280175757508ca8e57519a621d227b4cd3f6099893a23688e9dcd110780a37c8b8ba86cc927e248cc17b4aa24e8f79103718ae675006757dd6a34e6b90c57982bcc69c03d55aa5adda6a30c9b1b328df238cdf9db46937bbbda6cb39b6b7c314e0580cf2db01acd47c758d53ae5e3d0d5a2023169007d0b01f442675bb29e4b2c7868a1e4f14957dc960696907f2bde1e71beb4f675e5714c2354f9b3a36c23614b4e806a5c0f35ce9d62790925dbe23c7267094c1e9803673ff8e80f0fb274d07ce9ead74c1dfbf4162aaece27e909cbda6925d6c8671537363a6bff0a8d9a050888d62bc61130ec8562d9386fe3b95c352696f1954fc125a0d83dd2b7467d4142197ebda8146476e4370ac7cf6b918f0be66963216b0b88133e82faada517519197106d7111c70008741d9e41090a3f6559b2184bd01f48aaefae208ebd845d571cea94ff420506964da3dc459147b3df62fca22a305d24ef5f77577d90fd3786e361899eafe96f8a2edb23a5d3382bb6928957f47c2cf66ae53a957fa789dada0d717f0a0699a14a084f67cfc0aa53dcb9d48810164433b855678b407aeff64e493d7b018e7b96a19c82cf49c48ad06d7091a88248c8e34e0a71507aae4a36831dc26d3dd27b407421a93a6cbd2943090d0e60b3b872e56e6b04dc79d11e1eaaca6d75868f3410b645fe721350464930c03371fb52d34075e05151792e7bb9ccec444f6d9a42c709b34c4c166e64b4b9ce7d0dd07b63167ac737ddfa9206c503d5c5404e2e8baa2c7814d8ca3fb9092cbd49e0cf4be611ce8427f2f9c4dcfd6a8f2032bba12b8632ba77c3ad443bd6d2f94bf28b0ae759bea33c60138aca0114040dcea4c72b2e76f72e81c5b1e7bf16fe49768beccf16b6f81d28828d0181a69d60ab609b514d03883ad2b1d37e850a96afc3074ecc5935d1c4188037c627ba56a883c16a580d1039c29e42837df70c0f6d7f13c698abfae41f6d80bcf690d2bdcb830e0a9c0d239472cebe75b5008c3330df0ebe556a2e0280510e9b8814b43b3058888fe52165661ef31b31e8592a21da4f59be8955c49c015d69914eb457347499e20ff9a94c3042e465a46145b87242382bcc1bf1ef04531c36e1928c2013c35412944886090390131268a980125241aeb0e7557eada9316ce55794ae7ce829d67631bd07979fdf9a6b20d35b1e0acd3b68653c1cbe22032ff0a2904398802cb03436149bf195d75798dcee5a39e167a60a116466757f2e5758603a371b1efd7ffc69ba8b6ccc6f0e418c5bd50a4c95d7372d7052ea5bf4a014de0bdb6430643308e2ed3cc436eba80916ab5515fc48a3c617aa6ef6dcab32a357553ddf226463a7e704defb62f7db377f1e566b7c7da48db4b9422dfd72408b402f66950430be5589a929a535d4c851cc3a577284b0f2431830c791317cb976bf4b654ab031c2a85e2089c0eeacd36c0ae0e15e95b3083b5383f7254d384afd64182313ac9f3f5143ba40d45f5b10a1303370d0ac74ef9aca003ce1e935990b979551355f10b12c57826ace2dee0ac28bee28db6222470351e7042158307d1e34b81f4bc659373086bd84f2942846105f3fadb90f4774adbe62604733d9e39bb8a375cd63811429b26fd423286aaf8ec1c1f084dc8ce27a5d4771ea17629cc00f8feb5a2e79eaee3e42698acf4fcb275211bd23e9b37824a1dadc16ec43472335879be969672e41112268b7d6db29ceab7c54cedd541410361f8446d0b148797f3cfe005e5ee14e52003737a5a3d28ee0a85b9b902b5122b403fc26fd880ca6a1dcc046c2fa1f10a23a4f404bf7d9602ecdcda3c9f8490ac3375b70043ca3baeb6ed5f6a4813ff95239b7a55614a064dcbd89eca21e79c961a79ecd99eb466d15b700e4c508086c3a911c53b746191192a4118f8245d7556ea3821ef923b72667dd39db981b0c1a15b9cc58afc89487c9aefec317faefa144b8431030e5650fa3a40d86b38993e27ba46d970644c1a24ca61b18427d042aa4aa4e7a13c21c6fd9bced1a19ce9b47719c7a498be94726429c916f5ddd3c96d424ce044d151c1f1ae4cd34b80f4cb9a76f30aa8e418a26d5f57a8e29c1c48c8940d8439d93baaac18a36e758b3c455a94bb84a4b6d0eb53111c9117c8c2eae121d91aaacd796b8d11c20db94019ec3c5ca76ae61be4ea2829534f619fac164062e9bb61fda47a1e1086329ea704ca3a21d68a3c13f21704c01296086d4cfffe222831b10cb86a09a18cc455b586928bdb4bd0a0ab0ce683a41abf01cba07bd5eea3653c99b4fb622e510e9a837924021199009ae0a41ebd10d1dda4db5e8d7328926b70f41328bfe7d43ebd705b3360da622c1ca44d0edd10c067dd6e19b4697ec96f307587b261d564ab2f345521441dd2521a62efb60af56300a1de9d803e79b4873568260149ab608a1e17dd604b5e4e5851cc6b5df20f73cc32de96224b22236975d805c5a6c6630f7e417d425ddc70dd9ad3c0bb7425afd01fb297125a99ab5db530b433d42244b85f648878519f7dfb2fd311893011ba06fe1f702645e2fa39887b84e06b206d53312ec96c61567b59f14392fff1eaa51cea458dcc6fc9920e4b0cff5a24016ee7fa337504ef575562983d3690b06bc08acb2385d1b27d38497d7b6f4ee3718fb2ed3bdc48db36d2796aba9430f80bd1e057c5415ff84dccdaade9faceb8da83c55bc422c8a39e563240d3a56adb0f935bd5b478fe782d1d28204a65801ebe7ce1cbc836b89743f0af6b954f3d276a9e2d364ac52ad994e8614bac2fb338f6c0eb8061891bab86625c4998f2e4b4a0cabee530a7d07bc95a2df566ff703627b904bb2992849f0a6b2439dc17fb75b73d04c679aa42def0b1180ddd3b7ff8202ef6741ea6cb4ae4d1d0dc58d352b80451bedcddf6bc51c34f45f643b7d9b2e5ba05b36ab67cdb6f2d8c34350fa3a44d3531f40d7479174e1a64c5733114263940ccc01340db22279feaa51c98796ed2094700348e92b354ebb637c62b1434cc95ca53d534a691bc7607de71932b295413b0b4648836cab239ff8d91c2958c2b6d04ca0b2c2a341cb9c360c74d47addad0cafd436ed9c2456617a14c3ccd4affeae0b833b1c9d30219cefffe3745a15702eb6791543b29ccf4bb024dad8a35e4bc50053cda0506d3a0402b3ead8543e6db6c53adecaa518c8db8783c8fbaf652640fbf49575181f81ca5c9ba3c73cc557a67454782a14b1a04548ff6cf9c8983478436ef4e4eca16449822675fe3094baa10056563eae79d564a92827dcf9f0b73cbbaa9a525bc604a8fbbc1e3245b67332393dc7dda54d1238d758adb5a0eaf4841b64bcd2f153e388022be80173a1e942919fa9cab9b49644e11c7628996157bfcd5ba9cfb0da3d8e075ef99069c573b31ad12bdc6f6cbc13d5c8c73737b9e1511c46996e4b519bddb374ba866dfd61e7eb6108db073231f013dd7faf140289ff204fc5dd604049f5d15ec00f12ba80eeca7a4a9f0aed700146643467942eb71e4249d8757d46dd3ea3c51dc86a5384a58e384d20cc21be398768d30bac03f6b089b8b476349771afbf7ad9b5fb458c8dafca7b6b15e5662a0b8f7624bde342b7eac557fd18bed85b5a414dc727bf1b0fdfe7f56d34f83fdf067f54f3920d00a0dccc3b8a4ff67a0622a9a37879f3f14d9e68854426542cdabba1260031efce480d6bc6e7aa98dbba238fc40ae6e0e170255de8e98cec20996c2167ba4debf9ad2772907aa2dc01dec4c18421839cf343be836127d0c6ac5fcad05d483c68f2d4294c6802cc19076d425387e05b8d2f6cdc49609350499ed8313fb78f6f5486bea9d17242f9a16232e7aea00cd496efb9b6bd3788f1ad20046f99444fb988df990bd8f4cdad1a1fa3e20a12a8f4b12188e2ae4ae9e692dfb7b2fbda520e4560700e4dbd12a48608b6fdc4360423cde1e9a2207d02345e37206e92149ba7c1c8f4c18d090afded9569fb26adcfd1792cf47e518db1de3820eed1740ed4f9a36b5f030b1f70488c48dd31031d486a7d6f6e38b6d467fb85f8ed59f04695b4a474e9e6079e58832ad85ab3dc204f1641bbd2686bd40d5d048e905bf2b1f9836af5aeb368f8825f0f52913367e54044bc9bbda4dc3e962a303250a5615b600f0b74edccae34617e71012dcb60a2fbcc24f065769b0bf0bced295be68e2a09001f3d682431233f48e6daa45e4749b7b2e67f325bf775215038f84011e88da3e126ef78627344ee00d8f16f9eee5a14b71248e23f86e488277bdab0de85461a8a4592c439add9c6ba2e0e3303e7e0280ac3f7b348b1b6afd5797e7e254f0c3a31a1e667c31b7f264a08ae0a7153e1519f18bb661cc8c1623974f11ad9b1e9ced7077dab3562389a50eb38a716bef78a83806bb43aea5e50ee5cd9d2275c1269c6a6084b6699e4f56fdc3ed1e0ac84d539c437593a2e162ca54c6fc0ba3c2549538987d3bc404d695e9d70a1a32b70640ae49d3ae53e0bec1f63cd87c4866c6a09e0f39b4320be4a7f5aadc3cbe00e590695f5933ee54e5af3d72e7eced431b0fac8defb7f69cd485059fb1df93ee91f5d8bde3a5f023d3906e1f5288470fa9b5b272cd08ff0ecd785c511d77594d98dc31ca9229292bf3d6de9b23967696070c5234f092f2b2aafc972bef67f9bf983ea2ebb2475c57632ff74fc6a9ae069e76b2cc60c81b337eeec3bb46b58b83e2483f0f423c197fb87a7ff4d6ba8cc3e01d5262ea22c492539b70c1f0b68a1efa8c71bea080c76ea22388056a6a8d58d656942524903b65b003138d980a21b88ea1a956cc9ed5b686ab27bdb5e1a455803a50eadbf89f9981f311c8269166153208d251a34bd1d231cb3f69f96ff39e939b1c5f21e5251066bbd3add450c08772093d2e6fa17ccf31b89b61f1f69f530d6b6a73b9d7f7429ed5615629dcc79d5da38fa7604549c7c3936ccbc82fe470a83825426278abfd7aa3b183067d622d4bffa29adfe131e39c5c3975fedc46b4d8486240127964798d8448840a19b63586bbcd52f5950f3644ed156ff409b73db62f3651a5e1bdaa6ded6312d7495b7700e0321fd6c7429b1aa87778e8e16392faeee9babd3adfc36a0f1b928bef08a2180c7ca6bbf9990fffc887e6f864863f00a170212e44e8e389290f47d61cf4c2964139947d6e374582161a603a28482825fdb8785fe5906c82a261fb7685b2c288ac0f1f50fa06513029da95ff04252731170a90fafe3c8251292dad53a464459240f6105b4cb1a58faeade338454a9c51a21763a7b955ad46346bb2725bf217f1aecf3bd6236844be68428ea2977666cd50d595cae6463551f0584cb7675f89f13f1ac5e57d5273d3a6a5209cc5609ad9420ad0fbab4ec9d206cd5b6601e973adbc2801d068360c1bb2105f68d7542b550f3cb6d8e180ea599809bdd44e6450ede7983d7a19aa7e66fc3e178aca7d7d2d15bd6c48e7654b26e9d7f43326f0ee255e20cbf929e4c8e17e7095d964bd725e56f93c1cca2ce9e0359ffeaa09b4a4cd9cce1933353766e332bbea2d3789e25a21ebfbb3ccf5766f5d17e2418cf9ab90e2fd9f9cd4cacf130863fe48391c672b56d46eacd00e752e37692c3bca4ecbc58c6bbfaa16766ccc67e26fc6b8b69fdfec30488c5995e3ecc50ae8f40518f74f008ee523325b3f1486f797d3b4fd16973c1cdbf6cbf31e08e93e815fccfcc848e53032e3ee10052af06d1aacd043b24b8a186f19258313a693c07992010b0415f6a50780b991e6127844b80b95561291ea8e9f500c9d19936b883899876d4bcad4fd8eed3b36da809ad002865583692116914c0bbd13d2f0e3f9a41945b456b09bc02e471a6d166e9fcad7803b8450414b5bfa5026c3b6e7d8bb842ec989d27a191f523c0e92886d6596315bcf77b4fc2b5b3435c09e1662f6594bca4c5f0577420c87ca3cbcd8efedbc3dcf5a8971a216718878a75da34dc2d6318b0283eeba784c206eb38e9482c4461048f69b2c0599724160d76fa50c3cb69d57895861727c68f29612feb7266c21f6389f44df87f4a7aa1dd7bfb3971d3f59badc0f5d7a28fac4f9dd34ff5f4b02d7e3d44678c152a4b03ee89c5e178412d66682db29a4924fd25061c6045d6501616150d8943d9384a3c9ce94d109319cf894853c29f9bbea7bf031fa701928c84d0ed0c59d04c97252ec39eda492bdfc4e20ff0ee0cac680a83ba90e161f781a1b2c88a9b8ceac600b1f2c45deeb18568c7c6a27878089fea4b858f715a4279c45f1ec3fb2fc74023b19b57f4352aed19068896224a7f0a3273e8488a763437121b131b435825a79975370bd0d4a3e0901cad184af811c810b1f6b61af616914b090e9e090b617e6e5968bbaa01b1349beba97dda4ea559f19cd95369af163ba9908d135332da994d38f349ed4cbfc852c4e8f3b5f639a3f6688502c0c47626e305ce99bd8cc8e4510ff31bda9b66ca30f7c0de0642f973794452c384ecf20d0180a6c55dfae9907b00ee21eec2fb400074106004259f4e187906eeabff9e68d03684e2c81ad4a7d019d532d8491d537daac7c106ce66f5150c0596469c227ca575105b62fe8649cd02ed9049d6478c7b2e09ecec12a52951ac4f6e226002557f272699e83d5cbfb345b66dd1a936ed493db80a2048cc49ee49c8ff9191b5b26099713e97721315176d5ea6eb94a090d0a163fc64dd07544d37c8f3af7a0d14a3f92550a9818f54ea4c9c0c2cc90b543fab3b4a1cca1fc10d2d11eb4c41981f7db51db89c1d4c50a8d3eb50422da685925630843d488feb372049e031d3bdf29be2208262fd8506ca422ece31f5d7d665afaf0bd58ee0c3039dc32314fca57472aa3435d0bc6bb95775235b777d20af1ef0e1ccc4dce97a3bbdde09637bae154eb412ed52cef969b46eed276eff8d004a45def51f4c442ad1d9d1f6410bf2831fa3fa4d022f1ffa1d455e775fd6085df3c1ad5b05a02522e819f0dc0a13dff0bb27acbf7e75eecae5161b47a4b0555ec6eac2ba89842c97173e5b551e157ac2602b3dc8cd4642f7c1a29c4219969df06b1d5eeb83c25fdd3a22f9973223d284e053cf27ac1b4f6cee584d635719767ba0a6e6d105dfd72a0f567ea0df181293482be9009f82165bc519ee51fac338c29b3f51c56483cbf0449e09ba5873f478c11e9fcab25201033c62404eaf678f2b10c8eaf2c08e51a8aba3520e090f48ca6d10cb8ad80e13191634f73b9191a8f1a5f0cf2fa1790164668e781db1d855d78802a2d4fad2eb8c53a31a862e27fce24a3dfb961de606836e5e6475dbc00979fae5a7bb1fa9a2cadceade8458e7bf9bfb97fa4c5a994459b5bdacc9dd9b78270ff802781c54d936d9b173740eb7016dc16eaee914e6aab46473ef235a2f1d946518fc28be25babaf0f665ee373a26909494f2513e7191101212232a133e0bb55324f115f0b079c6c374611c88970aa8af5356c989688eb6cd68c49db4d72d667d7e19d4820b41944aa03f3200c887671d3138d99ad3aa78123bd3de753500e2ae7c0b33273a6731f2fbce96d64c6163fa8cf221c3ea9271dd24df4103424f6c125351657b1c11e092a07cf4212c54140a0f2116ccea23d7c8854c8cc11bec1f74c2a448dcf4572b910ddc70fd3932b7d88190aa991906d3a314c6a49c349a6f7a98e575da5c21f9b0ea616eab72e7cf33905456ba2f54f859f5a34a65b31380c07f75d936d48d231eee96fde7355a838743dd5c8ae88ba4f1bd1a27d87a8123c7d871bf748f74f97ba491889d28426b2d6eeb5fe2099608363800dc037478a736a3abad8e3001c44815fd811950bf3cd763a497f430878de4fffb2753bd28d2b237d4e020444836af284fa733cd1d8fe75baa43500521e89020b4e39da2efc6b0e60f403ed0571a932973672096a6662cf7135c8ee8712006e008e03551fdaa014826703fcd50a290290610456e32f3025c5d659ad1a3eaecea58b9203865bfa1d51ee0626bcf71651e2e571a9052968fb1ad359e539e540ef6aea406155646c342622f9e8bc65b58d8c03cb6f218ee3121b449a3b7832e710bed4e5d18f05289b9e1e55d4685642542a6224202d2b6d2bbb1a08b8ddec68c9bd60691671e103937f33630f76fb218bcc89f541c87c24ff15ba964dc422e43516ef8015179b0c57d2bd7a036b6a1c36517b20ac63977d07e6c0213ad8c70db16f770e938c5eca7d7107e0c718aaf7421a91a79b8f433a8613a2534ea6913f2e9f17528e26347684580b0586073139f5f32145f8259be9a4d226cf772745ce3e395dec4c3bc099e102cbdada925a358bc8cc8bd8fe8171866bc52bd1430cd03a500fe1fbe2f9018dede592a76ab673b704a028b03e54fc30f65d0a621da50f8391ea38703e624f0f7fe3e43e799f64a53c8c3d3aeb6abd3198b3a7ebc1eab7b067f6b4ba88789b8f7fc60fa0ea17b0d1ceeaaf8e64fe22662e5fd00d243c6acc6789a8280ff1283399bbdc5f1a007eb5348a9ab6fa084fe10bc4739c482e8be3efb6e2011a5faf3def2892dfbb914126b14e1d7595f5d13e35b0ad5551507cb43e1b2a992d29d148ad81b5d695ca6fe33b99de27c947e283b9f14678c56fb115ea16ee4c6d381386a070163eecc058c7fd39a0d9ad5be039cc741c0848eacaa592878697caf8a58633f3800f9850bb68b9a8afbc03f3d16761df15e00768089455ae8faeadfae16dfccbc9f75bd9639000dc9b70d7ffb40f5eac1bb418d00a7431ded4954b5e01d20766d967726b974bfa5d95556038bca8d9a16f4b93df9323180231f6d09bbaca0a74dec20ad74b172e2809b23a29105bc3229e24971390b1f35d2d222d4a503eaa3b0c913fa576af7f2b78f88e2994d21dcd12ea5886ddbdab0c2bb6bfec72e5c738c0e2753f847301fbc6037bfae55a9fcc7b182b91aab55fa60404428de1c261f5d3457e67e90d7d181f564740bcb02d032cc282f1d5c118c6f30e0d846916d4f2c29446509b01c1c77a55ae303d53558130909e6eda5d28f7b06235ed94b4520feebf24ce2090fabcb0c36b0670a37148e93ef3c941a5fe45a8cb38de05714404c327697e5f060a5030115e5591e79c2690dfacd3bd475de04690c390955b5eb2fea578497d098eafb459bc977645b3b260ccc912ed3effff0ad812bb7984dffd921427a89e6ffecba611ffc0055e833064291d88c229e16d066f1631596b5e5b59dea8d8627ff4debee28f5304ccd580b80206179ee117bd0f6f082c0793f7017edf4fc4a3d78db1ee1e017354cc8c0098a1608ce4ac129aa58625b811c46c2e8078ce66df12e14c67e66e0ac141a47b41aacf67419ac8f49b5852646d2c17b520374e832739b75528d3d9999b4290e98cccadaa810b96188247eb532bcf0155043a7af11c064e88a9505dcdf2694795e65f50ef673f88bd1690320f7416b25fb5088934d4bd8e2ffbdceb6c6cae456803dcb94597470e8394c88b1526772bcb258d5fa6800b9ecf6ac1b61d02fdb789f06b6ab8d970d76878931efe437f5febc616c705297f4de1261e0cd025dc1c2a9cba4fbc82dc2201391108a37eecc5d2580850c4e215a0ffb9c0e453ae63e5f0ed64bd7d002ec9f68f8249ab6417caa0ec64194b50a166547756fad760e7335ef1fc7af7d9ff7afb684d3550215189d1fa95f3c76480f99a89c6d788d83989263fa1427c7d4470433c4a85a620180893c90e1d46a0c9b0476f1c65a3717c1af5c8a106264bb95827a8040ec495a2d4a0cda746adbe713e06dc5031ea84cf73879f017bc3ee00e87d91572e5b7b17736990ca3b8dce443e76b96acbce867c61f9da4e78e8319de7114efea54f6eb420ea1b95da290697a8b904882bcdfdb9418cc60d2a27c23df63eaff831a3205f955693aeabb38d0b1d16b1535acd8a571a9b1b1c3ed84ad2f16d96c8d0c3ffde56e982ed41bfd055b9ae4aa027095f82587c3ecb9b9cb40bf5200bf0a2ef2090a0c222d025baa8b39e13648676550c3a1a18b7dec5f8778eedf1d6e225136d14e8591ea009e91df50456fd460155ff3c7ef91b609d5c0fb70a92eee01bb0681852cc42afb14f2a1a1f5792253a37a3793a8d571f494ce1cf18759f1a7ff952681dc3c5e44bf74bb874bfd84bd174c3d3e7fe743757acb8b32b9e9b5a4a9bb7f8cce9c58d3d70f2f02cd851df25b8f51e83f74b8ff172e28ec87003ec44c539aa4fdecb1ab0797691b8cede5689a08237e5e5747b86f819da6d955910b51ce782646900c0a65cde140e3afc5825938ad019663cfcd1e4267925f8fea8e318c0b93822257a3a938b7ec194594558ac0bbc11802c4a96150f4630eee2a6fdc95135d196232df42fc960e68821500680db0af16987cb9c0dca0f6cdb9c8535230ecc547055b66fe03f205a60633a6ada30f2f752532d6e233de7924762f8b70265d944712697915b57e4fc25b1781cbe699823913c80e184979b1f1cb37b073e81fb0e11642c0061aa8dbded77666f35c6b1f989ba63f7b82b1e34908c6bf407dcdcd7ea466b22b1b896d3711eca603d1ebb4f1ecb0d6fbdfd3ccfdb5abc9fd196c70b67b431dcbacc98bfd7846c12c4a8ac66ccdbee22fb738fb7ccc122bcc6ee229450359a13572ceb0e02363484019df2395bc83d09f7d4f5b8e7932d619e789a07e723c9f8b4762bb7e4097d1f193212ed80fd7ab3c20a470553b8f4f1f9752c26f8b3d436a542976a55185a1bb938b03e9f1800b8393e4c67d23cf56449784ba19efdfca771585e4977d963b18f889c8bc386150b56c10acf8a8da15db4927e0a16348ba0eba4d001b52dcc517de996a7145a1b8b28116f495bf1e3b2472e790cebe7051e705605c23eacce41376440021002126c0448ccf671d7c6748433cba1a5d6fb2c859daa8649fb41f81f9217435e07a3b44e61e333a896529c5e8221121c0e19db8710f2c9a525e287c75d9096638aec2ec8a84c2a7ea6312fe59758ca03c90b79a52f01335b0a87b718c2b8c5439694b5ccef2dfa6071b3f8103498cb06af1b54be59caaa5d61c1cc3f51ae76cea70c8936832ddaf5799568165719c3e414b8a4bb1d4078aa12ea040ab9a09a086e8daf6369aa66f240559b30b354499fa2c71807216179a03680756417d1df503e60620b3a27009f9ed32f2ab4162fc7be255bd45fb45f54c8eff52380924d733774227cb83e1960805d3255357d017186fabfd425a496a82bee68f3a53325e3b0799829097c513d76b5fc22e7b97f63e164c3cf945fba3e324359cc1fa0772df09db03daf1d4def1656ecee0068687f7434672e02375f8007347f187a37dba35a4087fceeb1fb06afe0b03457876ac605b7788a3186f9403cbe38a5c7d9bb24929723dae527f2e2f055bc3f211437b28765a7c19705bdb226fa178779ed62eecc83634c452237e77dd1749652cad3cf2f2779f0b11fa003a20e3f12c9968320eadcd474e59999ea6ab7aa32bfb25f2625809f43c3952e5d0a02b7ec4f6428ae3d06459c14af8fc1983deb8e2634abf4e87d9ce82f24e0094545abd02cac2407291e42a16ebc2f4866e01985ff1f60926786b85e32103d4c19d8e37257b4a3849c82d981e643b0f526f365da1d4033d728003e9e9640d10bb779d1b2ff77dacbc9458a4ce2bf855c38be9690b16b565f06b65313104b63d8c29def3ba1e096e3f423939a2887f6a52f8d883fdffff597e34f54f96d76a13de4afe8be2fe5435b9348202812f096407b1a6877928fb007db3e11ec6c35f2228a249e68b9d452e8420e5876a4064ba19139c792689fb5451f450712d020ed16e12d43c92f778d38b2cb61f145bdbea53b222b5cba7f1becbebc5dd7805fdf4070cdaa5e4b03a37df5d7cbe49d540abdfd0d922b3a5f19bb1a9119c95f8daf1d994ec6c1a159d3a951d61054bb4daeaeb447510255d496ccba9d57f9995e4c01b43e0234bb60f5a21e723061584f2411ee56d7ee8cc88232537d19b50a3f15590196ee23ce041240641f7174e9b4084f679b1320ff18a87f30ed1151c6546348d9d353d1a4aa2ca0a27d1874c23c32f34542e991b1301f4d4a797825011c28d6f55baa2f19abb447f762821a90ee7e2252a3e3c11103ed13e19d1e5a8bab347e86f47de098d4d9de6ee6f304c7b9c44509c537adae5f44248ea7e3629315aca807035728d5437a08d3d5cd279f8782b8444d7c22e5766758e6127ed99cf8ce7f585e85ec70b18f17e09a09b22976492496c6fda980bb3c63ec317379b938add2019e943399a47806577a41a35be67e882b65df8fb76702680dd4262b28495c2c1d8f54086f9208d9e47c12e61b2116ed6f0df792d877a1d52e52df55fdc7a1d9775acda4141443b73b44d76748f236db27e3e46d5792e6b808994fed30aa21b304fb88cf6e022b5caa84f66804b51499e485ed082517035301ee9e218a4efc76d3949e4064faa24146206bb87481e7fc963d7734d315026d1b1a5f6ef5e68241f79a546cff41e838c133b114426eb6fe61e3a9ff8deb0fab6f593f2f699739b9ae91c2c34bed8fd6858037684437690cac2b9003a94d72b45a13a97a289036206662d72f333b2c0604ea131ba058200e33930ea57f18833e84c46702da5456b6282a6cf9be462df67b051aba6e131daaf817e5d24a32bd97c455e6eef544010882b33379ac8fec30474f1b31d575b08de3b06d542e7fcbf81a0b3e24227befbde5965bca2453140a9309ca091688c5e69c57ee18948bf81b89e5eebbffb8dceebb973f3b706c2496eb0e0ffd65b326f6ed62703f8fb19ff941e6c7e6fbccaf4bf25f54e4bfe45ff9e1146d04b50447a281fc2461f6d13be4f4978e91d04f6233037a877c8f6a9801fd92f4ab102dfb57090229c133f571710432bb8464c7dfcb7fc9bff2c32ab4bbbbe7cc6772339106183329a420dfead04e642c557509e3f4f4456a8a4a8c555399a52c5a969a9a87d3b7d3b615fe4b47ccc7698be6e4efe4442ded3a7372af4139b71f352d8cf368539a962f3db20952d316e7692dca79a4b42a9ca7a1983c717653729e2a2d7bb80dc5442adbdfded3341068be043bd8e1df9626f4972cb2bdfd716be9f40e69dffe709e968e2d59aea0d453c4cd4e9822e3647f1e5ab2d7a92d65711e6ac49c73d65945a92d2d2d65bfb0ed27fea6368dfcd59f0a66d892737243cd20955fae204fc7775e5774d1774a1d0fb9e8bfba1ff2974f81967d7dc74f247b9f097b3d1221f9df53a06577c2ea7f7848e231047ff4d1642d63fd683bd1a53d081356358ca40699b04a2473ec12f2efdeb12b68e65d42dc7fcffdf752d661a61060b18fa5fb96b9341c54e4ef05797848cae4d8514176ce2967de1300a55a6b7d9985673681a9b5ce4d9b4eb3a9fed4526770d1cc5c729e86aa1245ae3fb3388f005c9ac78933efb927fafbde27ce66de629790fd99b77826d997322bd461282e4e39c9ccf42f66d2def39ec353898894712f65dc7b555ccfb5bdf72dabdddf273233835d9b09339b38c29109abdf89559e28674439633df893855d1bf8434f1b16eaa4d38455d113975cdb7f4f246b726ddd0b79dffdb661a1eebf0e4b230f73d8e2f9e4fe2511ebeeeeb6dfdfef23e3c42b7e5b6ee7faf6b99f40414516bb2887396eb414ff4c58155df4bb988b7ef744321f177d8a85ec77b672956b9a2bf7f60efa34bd83bec3e86b3b55facc4266772b75975c59b9512465a14e306a2dccb852840e5dbc50b546bb512506d40a94a8323be2a109a32aa899556ea8dc50b3259f017f64b17e0467debb8986fde8e56eddf0b8be3fc879c2ef17721e1c8f63b9ee51f32de5953b26a1233756497372e43c2776ce51c43eadf448cec1f967dee470c7960a12e1888823048205c2f737e23c383e4706576e129a5d3f26a1d97eeb5b3f9ffb16f7dadf16d7b23fced9778945ac105193a31cb2fd28bf653b93d06592d03c5dae3ebacf830c2a6d1481420a636e9011210183a2ab25379c84f145e66e67d074e5fc66dfced774e5c03978b4748699c3021040965524ce514b9445a250eff0af112b0026fbdf19cb6241f607b1c802a9c93451467f91fd3b1c44e54acd93e2a824cb0f6aa694a5945d480de65426ca21596f6c53503323a722d3c38c4c97a9ad0351aa747186154d98b0a2032e27aca04b952b4c20a9c0b990a794d243d439585c8bc5ddf2489b053d6710952b25c10c72b03f9fa67bba9a3ccee49993c71949d43be6cb2539dd444d1ebb4c3f9569e37e97c9f345983d764b0c5db2280335850fb2f923cc9e0fa4008289941464866043363f08842a27197f25f90de45ffe7a87fcd693db5fbb4bca1a8972ec8d143cd0c381a52a9be86f0fe8e0215f2a9630c092cc9261725add2891152e86c8b2746485194eaac0610d355e6095c4195f7049630b1b661b406ea8a22c72e7c5152e83941422bbfbd65f8edc5055b4b8a1c3ed30844261f6b57434c80d85c2156e70f994909ff38420cc45a66c766a5a5292486ee42f39cb524978640615a140048394232d8c4e60034a13998651e82f2e80819443174f634c91512cc284c91f9b2aff7811797c39e5b19f88c8634f0d91c7b612228fd2484b0e42ba808c185e34b5800c3064e37b10a50b325637c010c502d9e8b30697265eb6a81045081b6413ab6085263d8c81428d20648ec7aeea379e6003ca4a171ab4a0201be54ccb0bc29c20658523232b64a34c229a314951f9c205594c794236caa62c81d8409832cab872c60e3f4c911135354983072788f842831632f96153142a5e82a0a20919910e6a3c29030836be70814a26c9d090a508274ddef832840c491a4bca68a1aac8892b64f295cc9e9eb2a252224b93182f52c824912a292ab080810923ca90c90fa2306981062f9c686943269f663d12b72c6e2a81e94f6c9ab8ed2506555e6230e5250651f64bec033fedf33c24df6fef9580dbbe4f043116018d90eb9a00ebc10781057ed6fb4f2cfafe1681df13d6695f3dad03a20ec6302fe013996619fa894c5687d5a163e705ab9bbb5bd0fb3e91a9f3cd07af779828d3b6bd109abb7e0d4181d6e1229a90f470376c4809b2f623976d67a2ecd58ff3de6b5008f724c83279d3c48e89049fdc9d80eee5283f98dfe1517aded72010ed65de3871a4436c3af08359a6cca474f344268fe3dcbdd35816db7669655f91d4ed1acbe2123c6f9ba6f94b295ddb36189e87121183d73b3ed4aad5df86a020d7d7b4cfdb3e4d144267b3129c6e127fa04d0caee7f1fba40ffb23e7a0109aed6ba2cc1e67c5123c5bbbd59f4088905f11edb51fbf2d071dbf2c4408c5d65fd4cead4e979099b79f79fb8a84be58827f20cb640d57a981bfd719d4e8565f7b5bb3d7eee1a3b397e0990449663ac52eed3b6bbdc3bf3e2d525f7b593190ce1aa6da8d4111938cf9405dee8b3bc6720f7dfff0aa4a1ec307d08ec56c18eadcd6130fe1c746551ec398bc93ca30eef8b1e1bd74f864ef6f4bc7bbfe1a72e28eb7e5c61d7b0d185c4d714d1ca47d73c934f9c7ef84d15cb95249da209324d217f7ea5e6dc9e3e519251299fb5d25575722c9a22b8974258be455915113f635aaec1bf4d56dc25f26fd0c11c9468994ad287dec6b2f64b5e7f0101eb2d8ad4fec53ce820dbbd4f496795fdc515245758f19060c669e14dd637e6324322391ddfd528a3b764749aa89259597c41d3dcaa39ce74b53aafa820e8f2f0ff0b1f3fa0f2dd54f2f809239f0197d69bd9f7ebc6aba507ded2bb6cafe55fc78238cbd5e3e423e3f26135429294c1ea912cf4895a8c234de3c83cc99802c760f2ccba7e91e393920d934d9933fc5e692a918a4bde63e8d26fda177385d529ab0db44902feee84a54c95f34457cf4898a57a429c170479b69ac5c37f2974d72a435acf8486b8042812993531356c4a54a4f2fbb461e5f6397a133f4937c2947a839e38ed65a8bff9daaa5b424f46febd218ee68670f0774e23109cd1c84d11c78a03d9132b2ef2e4f79fc6c8360d109d21c843ba1ce17a11a46790c1f205b06717d62feb2d21e4b4b27b463aca5c728153da4f1c59d9cd248cad4c97946cac516aa97f3c8aed5d6be499059fab893bf9ea2ee7871f87047eae4347bfc8586f94f79b221eb90fd9db25f47ea1d926ac2c0dcd17e944a092b344c76a519bc49669156a46c9def775e311e3eb6e906fe3951dc917a67dcd195463a7b6492d2928e0e8ea93bb65aa137512c3f62682ce5d80c5421135776d504fa0707be813f4d0b774af9fa1f1e4c997fe407c99f98c7bc72c758def91c48770c431d2acd88ae6165453f8597c999dcb66ddbe6dca4ac5f9221dfc0290e26399b33af288597d5df1ec93748f20dfc713471c78b83873babb45283fe1c24a55fdd6cddb637ea1b56526b39ad75ed060251e9c3436243ea3c325e12b35b03fafdd56a5fe0815bed709873d2dfec9c9c56ab1b9a1bb3033053aed3342663bae9d14929dd404f893b5f7a9fa63119f36d4f15049ab235a034839ac6640c8bd2e95c51abcb4dd14dd14d51cba9e5d43ba3744da359fbaa6cb3f77dad2e977e4b1f6d67cff6f66bbfa8464196d69af9baa50f4a91c80e34d0db72e953a4eccd481f33f77f2010304b0c0210adcaad8109d37311eda50fd95b802043903ddb867f481ef9637791dd22fda8e1ac7ce2a8a8362d95544a4aa5a453bea6e1ef1dd48bcda969bf695ab5562bf394e57b728bbfe47b210bb7bfc1ee9e70e79444d839cd1e4e6a46ce23b311771774ee9c5a4e0e0201c0a81961e07694145df22b77541460648f7e2da7cb49f50ef9ddd207ed459e21f526f85b68da2c4b10e8b3b8131c81f6166f78ec8fea1df2db8886e42216ee3ba7d939d96c67e7e42ff963e46b4df23527f99a92b634f3c483d73b3753c47cfee5edbe3dd13425caddb7eeeeb64972917e235fb66febd7da4e20bd78fc7860ab789f2e5152d537fbdd24a92c3f9c02c5ea6cdbb635ee60e636f265ed4a4a43cce75f9b184243444243446d25a11c512265f6be885013e6536c8968f4fbb3dfecd367babbcf84f9f50fdbcedb3ba45336bcdee99b29ae945a3721359bcd96c83808721e99e55bc0791a4a4a962cbf27d2941e9aa2805125cba6b5a192b6e423a684c9f25fced35054923e1d595a31ee94781cca633ffd723fedd73a74987c29a54783fc20f2633e2e667bfade0cfd2afb7e73dce4defb2e4956c16d75c4daef594f831b3f7dfe7e7c657cad9db9170c4316fef0cf9463876711fa9b3843f89e857bc24200dfe2b15fcb6d24b63d0581f01344dcf1ceb727a6dcb43aedb4db9cd64afcbd636e16bbaaabbecd15ffd0279bd39351ffb6c579e4d62577bffdee7b5c8e5d13d89e7b22db731e9190f7dc7b8787868894803002ab83544555f5d4cc73ef342ee744977fdf61fcbd092ec73d6133efc3e2be85c09f6921d68378e8155afbddb797011627c27d874d6012a2f9ee4d9879ee899840f3ddb70c0c81f5a0cb674497e34eb4794eacf9d613c9ae74d28c2a1e924b494e4b4632a9256ee256d3198d3209bbe413c96e96b04be2a0229c0f9f4886e35b56f3a3749233dfd1e02126219a6fe121593561fd4c42334f8387e4548787383c24a3b8286eaa933435e21625b64bbefdef3dd1253fec92ef6117551659d6808152cd33095da6f9433d7b6221ef6bf0907bd897924637f23c69691a555d4da32abf0ac50d87b8e1dc883d6194f3ab6e9c46adf7fb434c4236ef193d4056d3c243ad6712baffe1a116f63b35e436380529abc1ee34835df38936a9dc3f7a14cdb78c06bb26763cda4c24db9ee6ef3309cdfcf7dff7342ff43dcde724f4fdc543f3c3d369c2fa67963a912e4d583f27ce240e734b2674d825c47a90c32e161e627205714f819611a957515c30c30c51b3996c464d58ff9091cbba4f01f72076f56750e5b66c4e4d586f692244145188e9b00929e0f04c0835a24613d6ef7205ddd92c63f1f0ac9ab0feeeb9fe1c50b701454fb9a1c8235da249d408c4bf39659a94fb3398e1b6cc4544caba97b2eee7d584f58fb32af7875d42dd6397e3a0ed4936ceabdcefcdee77ffa6d4bf2df56f485b52f763bdcafda3cb31bdf25737a5a24e39bcdc9675321a2552a909ebee8dfb6d75d54fa9fa69d5d622d23c078bcd91adfc1139a81c6765287de884b3e7675aa981bfb3726cf6744f7fe2ef1dfe2fb7d28718cba077d8dc3d7d0a7e405f06f197ffdbace11f1bba68292514f7392905815a4e577baa5573dab6eb1d725de79e273d277f6dc9fd4f5d47bb6e7a273bfa9f045bba539654eee79133c31d79644929edf7607027c6ae2c335126ca33c430e5af003cb1e33cf4f3913e3f1e8ec36ec30bfbe5bfe4df503eed6f82d3c3edf7c6cc91e6242ebfed95fc767717a51ca341a09e3e5fb879629710f726ca1da0628c0acae0d2c20eaf1e8a60228313269c80e14fb3477e83e0bb79e477b77fd8964a87cc81e28e3b3b2fefd121933af28f7f5e8cac967039f2e28509265546514e6414815942768feed1efee7f678fd64484d5194d9ebca08ae88a0a5ade98c10ca5324bb4f0babbfbdaffc0dca22a6a8872250a2382605206972f505190a2b02246e632647bf4fdaffe5b82e792df329762bf70fb353b9664dbf0bfc6118ceff93bcffcceb9e26e43b6b75fc522b3765d57f1b855ed37edfa0bcca4324cac889e404952e65102dd4366f9d2a5cfcb7f49f1b4591d042c24054290100ee2af234aacb070dfc3e1f774c4a836354eb3afcdd7fcb7d7b4ed7df3df7e03b2e3af3975e898dff3bd9c2b6e97471d1f1c993d563774b1e2316894ae10b8f77008f67bc23429bebf68f2a823ebe81edacfdfd13d2458e9901a3e62df04efb937a17bfbfe2670efbd09f6bba7ef12525da1bfe61f85f38f28a19708f7de13f1befb29066953cbb9e20665c76350adef750cca466299da7f59491d51a23978c394f2e79cfa7c8477534693a1e4f5f26c870173e5ff6bc2fcbd2d6a52cde629c672c789fdc4131748b34d745915ab13a557bafffed2e888bf1224ea1409afbe123a6258b8f762b158ac3efd6deba03e7d3a33a5fff58efae357a9bb83436a91fa9b0422cb584dfb0c72b849b45c0251a65f394c65300812f391daccb8579bda13776c31469ca7f308f4bf20ee97c7af7bb064cce715fb57f837ac9ed3c69def436cf2fcef5bf652d606a22954348181010d37dea801080b125e24911186962b222762c0d41046126a60b183cc044a2748a961852dda9092f9f78e6bd25af17a474747c7b71f0eb2dc7cfc35b170cfe13b75fc471d9d30ccdd733fbebcd6b458d6c4cbc2953addc37f3e00ba0703543ab7e5aff6a2cb31ff18cb288f2ca3bc89304253d94dfc8e8e28992fc2083f4f4f227c4b5cee3bafc1ed5d1c6312ecc08dc432e5f0cf93cd77f658d90495883042f5ee89d73b339fb577bc5f128825d2174a5df0fb3eacc45ff24946c926e984a5e68fccfffeb662390cefb5f35e895ff9e68f14013ff6e37e0f0e01ff3312cbe07b3958b8327f0db80d25c3519e4ff31e65652434df9c2beebc19aa8a95dc5032441d2037940c55b26c9a3d38fee6717eb4ad1f6fcd8f61b6718c636d0b4b24b083ef41d1c5faef5d43665ebe6c3147664fbb55e813a8799b2752f336f689b4fe065be7f9b0c7f23802a24cf35f23b6c49f3039f168249669dea301da3e28d3bfe2cc7722eb3f91467481ff3dcd6fa20b7c9963d7e66b3e041b5c83439811bf6775008a19e4505f7a184b8dc556345283659395f93778dfffe57ffd43aaeb2c20bc97d92d20e4af5828b59385b29158eba05ace1597e6db3d582351ae1e984af9ab4e100809a553feaa5f63c6752ba5c0ffbea3a6a8aaacb621d69b70c2f72cec22023e6be87b16be60d087995cf9e83ecda8d9546badb5d65a6badb5d65a6bad9522e55a6badb54a1fad59eef7eed13469f610c9ea7f22918c3a2151a54a9728d5f7467398e3388ee338cff33c1dc22036af8b155a3c2df57ad10991dd5f73c21a82426df111e133656039b9e7afec79273c15fe31ebff728c65cf0bbd0e7f1ca614886cb15cca5bc5a3d5309d787c7971834b8dcd9507d67039effdf585dfbd932265fa1e55a654b36a5acd2b3aa34673467fcea60ecd3359d0afa9d9a3e1d93461f4e98f56878e3cce99b576bbb786216e7d71a7a40fc7b3496a409fbe63d13d269e40f40e3aa77a07bde1ca97ae7ce6468ee449ae1415253545556525936492925c6a727aeaaa118e2879329248b3c9e72748902c005adcd166faf6863f5f3122197d97f2a5d9d332faee347ba88c3e7d8ab4cd0c748f8947c9244b1f12cba2d6c0bf9d0023fb919bc7b6935bc7e257c5636c7e98623c5e491b6671c05c893511668f2c6a98ff5115942a225849261d992bb358914cb27f0dd5ed3c4a2bb949abe22149b233ce74fdee89d8e7b009dc5beead09db6b6faba805690f82f63fda07d15e8241f5b59eacfd8ff7da1f993ddd5b7bafd6571f12777beeebdbeffa1b0b7d4a264c73cd13ab5cfd207635fefeef7b30c884693f13a621097b87bffd6e6a2e21f0bf97febdf71fb6fe2ff38f77e25b71eb069572c5b1096b2ae9d6499330392777549327f9f8476a50bf7e4df7702cb3f9a6f9576ebd9209b3c135d6d2dc1bd6af8d8fb4a25c8de33058c3d56ad0b8b2481a394f3d327bc0b7f6de30fcab6c5f740dd9fe7bcf334bb083ed9170dfe5257f55b1bed781f5ce9e1bde0fdfead51cd12cfc9ef57f26ac4eb9320b9656fa69024741f541a8ff533f888f0e892b9bb826476e40d2c2a8090531aa9488f203902c55c45022e349192e015882885896323b20b104d4143730d9246248a19582369028a3e80c1a6e2003a7873b86d977bc3177dcd979c59e68ec03353cb18a8189aa155480441b954808a41fc28821458932348c717574469dec2f9df71e2a13e3025a5c45f1c4094908e1c5161a6a8894c0585ad2050e4d45514e944a1531468d235440c653d323606002d6e0c21623c2a85a019949bd08ee45983e798a91e77c3be79c736e94d3b8ca8d76b3148fe16c798f7c1db6a54b931baa05171091c5d6c3bdb9a15a80c288ebe5866ae1a905a7165ab84638017d98e1c1850f0823d60a4930783f24812bb0d042d794f49569c265a1f2d830b23d347567186d4c535c18186a1624db440c1a0f4f9b104fa88c29a95a99b21eaa341b83e1851fa2a08c8a5c689252610d241f9efe7ed6da1b5a1c47e0d0869825eecdeda58d2a965c9bdb4b1b5fcab8addc5eda70c291db8b1b45deacb5d64a6987c9f4c7acffe3d347a3b5f2a0b5564a296d51efb2e362f539f106fc355dced95ca6686d18bad37c41c2ca08c88d25a5d4dd8520a904c812237179122dd3b72e4dd3342c44fed4a91949122dbb9ecb2eca0f09cd49b46cdd6320a594adda5d5fe2da3ce69cafa239e7b499e2cadf7c72ff8fdc41a406b355a43305d521a715402e529368b65b08cd13fff0573fd886e6b36eb6f33ed6370302d5db755d576fe326ed97e52c8747259bed3a4ffb74c2d063d178b652ed03b94d8aae7bcfd6cefbecbdc765cb79de07da0e7f1dd7bad7de5a6b2ad536aef3a4b84015e310c389327bd6beececdbcebec4230aacc7b5741687ed4fad6334afe6abb1a173fa501b0ae6e0f9f45937db79208b050269333aaaf679dba4985a2579eba6991bcadbd3ff36aa793a1e18861d7827c8519fbad9cefb5eff98a3f873d7799c6dddbbcd504a4367dd6ce77d3f513e3e38beb8f2bdae5f1c3796206bb25fdc6fdc533ca2206b42b496ceea3047df8a3f9f4666e65935ea53f3d9d88040d537ecb33dad3f3e4b3e64a8d20d2da553ad6e1d38736bec4da893439b970755ab7b82b4071bce0977fe716e70e87cff0a227dd0df623c7c7efc70f00569983f787163cee9dee0d4d0b46c74c270867503d0e56e3aa48fa9715fbba0205c141bc6d1822bdf8a1eb454102d2d9d55eb6f411d086431087650f1f5e06b7d76e3aae83c5f8e0a7244940741fed2709028f1fbe13c35f77b74ab4d9fb3bcd81bbbd205cf09942940b5306349253973e225fbc89bad5473226b6fb5bf476764ed888a16521ef1e9cba863893ce7b3e0459e4d70c8b3c91979ae40469eefb1ee1980104c2ddc4dd6267af6cd0da582982cbd23f9af1bc66cf02838a4887bad0fa473c519e47093685f82ccfe1a7d2a5eef8c2da46cdfd3ba99ff71af7f7c0a02cdbcd7eaf20508314b5150265866f20fdd13e4447379a1e9185f21d4e1dad0768ad1478db4d6b4b74faf664f7d6bb3b4a4b85666fb1a53fbe86c1fd061ace1310cbdedbb07587b281487d93f72986dd23bec8f19f8a02bb406f635497388b8328f2fb3d77df7700acbadcdb27db17b281a0db3dfbf7d4bdc0d0f3109c1d4c24cb6613b61d66a938a9ac95ac66496292363f2f7befebc56970be6f1a740a030dbcd0bd5bff91b3cb4810cb28a5fb34f24db4457754dfb1a1e27d5905c2189226040838e3941c6c43d91cc03bfb643ed650c2e5c644329e0aa9031dd4fc104f3868c89db4006d957e56a55d034cc3e96b7da926ce9986c5fd3e2375bedcbec3428b6cab5a26569d2ad1f290cd95219b2a53864fb3550c4eca4a12b512dd31fef965c9b1f7d6ab6f0686d0da646d88d2a50504f98cbe6ab72b5b76fe3d43d1e902dcd5bd6dba768740f35b29c945ce45fbc27c85aad0ab7da164d8b3dd2a06855c4498d66cf4483cea4cc31d9be0d9e80cb2a9e529ac8ca1e1877a4565cdc714a51abee21b3fdb982ee89e129755b906d2846b6d79726ccbe2bad004f90c8f6f46ac2a8d517d7abb42f8788eb797caf2581ef47fa5ef336a20e1280747ef9cbbe900fb7a2b8f229b6ef53fea2c1d60a088485a992e8e52e371895ad231df98bcab55fd3e58ed42ac8d68848643ed23dbcb71f64dfd2e0d1defef0187a55b347364c7bce2adbefa9d959b6ea1d961a39ccbeb5f786f6f3ec7f981af9cbfe48e9d11248d403813e2b3d2e170301b3278239367ba855c3ec773f865eecfbfbe452a323e701df3e85227df85b28d93eeb41911ef9cbbe58201056063135ea1df65b5feeb44fada4b492408bc95c0b490045e3275b4a392911577ee39113c7e7de8b80f4dabd1dbfca245a0629160fb7c3e49d523cd940589abbbbfbec963954aefc9e2d77778924d3316cbe994dd619eab0b303a5c2d41113a5096b9b3fefa152dbf66ab9961b4a85a51840c942caf5a4aa8cf1b265cc1615c6f810e66ab9bd8cd9a103159470727b21d303540a565ce171b9d65fedb2f289b2747520b3cd62a62f33162a7a6eec71b9b4ab7215ef7a4b682ea9db35aefc49dbe7f496b8f2a9fb78a941cb398992bc25baaa039b6dc372e3f6541c71a63fafd70a0e1133e53a6bdbe8a67852d2e9c7e59e3de44f988bbd83d27b6f531c36ddb3fd868f38cc5ddd59649ba93cb6d5a572a92b69515bcfae4e0fa8ba75b75148a0d0850c30b65471c4a56162cb920c6da9f52269c21ac88e717372436d71813b828d24dc629cdaea8496f6e682bdf6c9764a57475c382985f142182ba52c8eb8b8524a62062a29252a5a3cd9180d29b8bdf6bb5b5c71317358e7d15e2516a0b4a0a9063660d802e9ef67adbde10a5bcf2added66775e6a1455614151936ac60d7343315163dbe2dae48662425580dc50455a427b3fe6635f99d2f6219ec4104e691921469ef3ed3d22883c7f07049a61ad6189173ff8e0c60b4d608ca468526336461a6450279082a0a1d23ddc8823f27c9a818552464e115f80c1b71b8b275f72b84d1202f2f839511541449e2f8240f3a220babb3bcfd31f79fc58e064058a3c5f0020d074f70f5f780387bbbbf704e032808827793e006288e2a68780d2b10da54317493aa0f1459525526e0183174a7118450f950d21c3015ca1bbd3a816c8b8bb733cdc4c738b89cc0102392c8d3c3f870b18be847822cfc70102cd3086251c1f0a10c2853cbfb56891e7df841d121635c4c025862ba44030a20a1748650135c4123297b4891bb23f07eeee372fdc9b2bb434c9b30502cdb73ea590d8707777ad6ed6adc5a3bda10d08e431f769e93420082a41a8018416797e14b314be14ad4104982612a05cc0060c9a5c212305940b6fd034cdd73a00f5b737fc57030143f6bffd8229a438092207274d55cc20528430630d2b3ab0404536a7172857e0fcf0d70b3cb2ffb0941d8825d9ff86feefff8af9cff8886db8900519332ea698e41bd018024b1421961023bc7dc60b5d667c28c95210fde13888f3682ff10ed04bb9e35331eaf081860440f92045d30e79fe37b991e7b340a02982a919c468f2030e3ca04182159890a18a37a6d008a34b141458200844bf56486ff83d8491fdbfcf795a8c349e80510187ab35a2480088184ed812069817a82163228632c23ce79c73824054bab2c8a30e1e5a64b992c50da624a635b243f520050f51d9bffb3e28b39cec1fc4033a671379f290031779befdbe9e42a225e947edb7f9ec80254feb7489ec5170c8eeee0ea5411d64c83c749062072a79860da5081e533a002cc8a3ce0e9625ae589ab244840e48feb232268780a1e92688dbb9a50893c79d9c471d566090ddaf7cc90e75c58a1cac6099658f112d79b20405173298b022060150c2052b5ec081cc931b64fe22b873c91e8588ecaeeceeeef873128bf250b47060caf3e9b4a2429e56a6c8339ca28c134bac700163836cbc535a20a5882b3f54b9fa42369f90c0a089c5b294f7c6784ce9cc4c91fd6d0fd93ff41bb864c781061b8ab243e008aaec3fe593f4e12964ff6bd43d36c8fe7209d923951ae66f9fd0f078658845f6f7e8d669b5d65a7fe3b8ff718d04d6fbcba5a0a2fb334f24037f46944f2c514a693e13e6ff337f7fa8060fbd5878e8e2211bdeff96b18c5cdedb3c91ece5e1a0a299a7792299abc3ae10c067bdd07d1b3cc4d4fdfd0e0b81cf7a1691ac6535d835b1449a307723509434a27c12a7aadf9f7926f0ef0b81f5877a827804fcd4514a266cfe48b58f8243bed788be5cc712a487bfafa2a6d5fa9384211d797b8fe340a0f995ceac498066ee3bb964452985fbf3eb4ba9a728adca2ca764981bae7c924e1b91e777c98a677b2bb7e91ee8f01e994293832095ddaa86a9ee52c354f60f66ece7870e1dd6cac89b467ed059644e6a85c8af0f447ec5ed2fbb8975878718f39af887fe6dddcaeb9da114f85001104f3226fadbe7fa37f887fe6dfd7dbc561c4b4cba630099d26fd19f62c3fc61096040f8f53b32f7af7f58b1a59526dd98bf8f8d0a63c64ce65350c83293c5fc7dfcffe5deecc6c99d7956f7fddf16eb3daf63d9b870ff59ef48332331f9c9cb1d7d26357b5a8ba913725803082da42c9149021c51e503951704c182104f513d5249c9de1b86ffaf572c96479f75ef55fe92208e2e77f4273192aa049a3f1aac7243d14095716e281ab6649f394f271e3952962f8bfc25a9a418efa5acf21e9dcf79ef6f9c5c0feb3894ecb0d18f1ccc1502be87a598ce25a4bee702bf738df659ab455ad13d5ce27cf852762210d1d581670f9320cbe49af7ec5fab06b7bf6a7a5ae61daec14ffee4dd287147128ee40f1761fd7cd6b3e47b5d87c7ee7bd6cd35ee799ee7799fd81904df03710934d7e0f1482ed2bdf7e391ecdd7ccd8fdff7f3413c76cfaac149686e7d0bbb11aba885eb12329ffb895dde37beded16d3598d0a062ca4a8a551748a69081cc0d4f7898c105a924973e2c95bef8d32895f2d732e291347bed80cb7a9c87aa6196598ff3d37e372f956a5eb2fece1e57504e8e8b48ceeb888e24f68469205050114cbecebb9e4928c7e77c4eceebbc50ceebe44c2c94f32e3c14629f09939f23e7c73007bbe6b74c4a194580289e6cb1c30967fc008511952e61d810e3c88a0b2db1e6bf0fc01fbf3c7fb479bc79235ffec00f8f347f0ffe14c7d8388e63678111f2078a240c65d64df72cb1e6a7f87d38e7f79e48420a320e28922033cee7188d7c19e7bfbf796f8ade6f20d08de7d5d48035b808ceb3fec7f34df7dffb14e9c446bedcfa090e692b76b06287dc12bfaf69e1bc109c677da8022bce83f39f387f8243588f03621c31fc297adf89e327c4c32e21f3bdf7ba9b97a09010bbbc27ca386fff67e288321bf932eb3b716c659c9bc7113b5bec12f2f371fec733d8dd88bec55f4e4847db87f3d13cbfe59a2f76f69a74a25c924ad24a0a7747cc0d5b58a580c4140b4d6196d4e8f242952cc2b8717247795434c9c0ee552ec6c9e8aabaefb018bd2c07e789b2540271fccc7970f4e47c8d0dcecb77dfe23c37e3a579ef46740db9b9f9ce2dd135a4554456bd08f269c892fb2937d40c62e48947f097fc503412b284fcc463fbab9559efb5e75ff79f5864821f9021df7b0fe433f22383789c5f82ccdfd7bcf74438ff89383f672826f117ce4ff1480c77ec99f34c25e7e9ae8eaac835b22c8232a51508840347bc69d9d4887e247a91c3921c265fd260efe2d197b2fc4e8af11e7f9a30f9bd4eeba3fe347bbcc86172e65359cea4b2f4994765f9de92ee0255c49419ae88c20b26434b8230c3290a932b2e663724e57bd21d8dfcc80ec55f7e54e45bdcc991bcc85f33a0867dd6c44ad20d52a9fe9117f9cc5ff2a3dcdf80194a7c81e58c222f55c8641866a800ca55125daee820932f95a627c375a40300516566458832d848638c31b8cc80831426a064e148b347033c64814262d6460d5664f29fc84246175f50b1328a4126df676ee456a1f368e293d29e94ba196196f95269a7a5e15643eaaf69ed1ca385425bcf5d2249423396998b8894692f651a36fa60fd2e213379fe4cc672026dce6bbd6a5f2bae94b6368659d3344de3a0792acd94fed027aa5cdf9bc262fbd6bed617d797a40f892992d46087eee1983ee91df533ea1e4e455758a2a2a2a2a2b276a95d4aadb57e5f6911fdaa5fdfa790be0a56569da91e1e75581687c77beb86eb53a7de511fbc72e5952f5df9cc8d9cc73b427287e249d3953c8bf789345f2877f4a55cbf7bcfe2758243ec7301a325a864cd5595450b952a1a010080009314000020140c8785629148289cc982ac7c14000b7e94467456994aa45914c3380821638821c60040080122002344341108a21798b41a81c021032337bf5a6b195e2436b39f8d2d811e7011e5139b085b4dcc8c2610d7846b8261eb7d639554c7f0691a5e3a872783356e6d608e08e068f16ade07147614c14b5c872bb9cc54636102ce39567baf3913f130d56cec6785e9cf8a7bb53fb21991e1c565e100175806edd117f2a4bf83cbfdbdf07e01ed22294d46101101fe0de6a127bc6038f85ddd2fb370d22543e2e44cc9add2e0d919f0d6e804a0606f2d1e97bd3daca27c8c03d908079dcc76bbe4f4f46d42bf282b71230fd35ed500ffdf8ef047cd68e2d9acbb5586e981d309043083d12dd43dc79a790bfa9905db04f29c6362a58468e13d8b4f05bb8b9f7011be7026828f82652e47a9459d3c759ba0e5bce84cefabd6aae8825433f8625139d9069fccae475a9c7ddf05dc41793f6daafbcda6b69629379b7774eb502494f12b42e7703be9df8a45db121763e8bd42a4ac7cf32a3607ab735478c8779f8261f2691535711247155f594c476b27db8687b35e72fc8d5b63301bd894534df8c988bd44eb7c950a071cc130ae626112334b7c6a68a6d8371a9a358336951862a2187483c3772eebdfa3b5dbf2b3b8b0a7c4ded8c6f18df323209ed3a73de2e7bdfcf0a557e8802f212e96f311dc22170386708f5a0278d1cdf41a2025b7c4eac5c8c586b03191dfaf7dcc55a266cf8053d5d18d0512c827d172693f0cda0044ecb94fd59395785d2334e503b99d7230d12e362c238cfd28e0f3def7402e12b5d8fbd2dc441cd8f83a1a6ba3d5898a0b7dbfe1e3084241d449ac77558be757bf5bd8e77defe46e7bfa0c14536063a9bcdf45fe4a54b18c4760e35634fe37e61e50a91fef10cdc4e7e7ace1df837522e348bb4614b611a459650318f50a2336c450f15110638bfff38bf1b1354bfc598c4ac54058b1cfc1428d4001ccd8d0d46b0982861f5620dd64b28f59a1d45479abd28b7e78106a6d4968653a4c175e52c04eacba11caa39853ff48d3fba7dee04b1032a10f8443d54e984cef924847b32cff34543463627ce4e76b149c1de0b444afa911025b73c0e68b258cf74d3320d60d248da194e2adf597931ba7e0a3b24050b0b8c460b6be721e4a0eb3c5ddfece65ebbc9b0bbe4b9de1de06d1171f3e581516a0697859fe0869f0e0459f3083309279837b8b56bcc7606d5c0431cb3660bbddd1a7cacade363a8d44fbdb9a7f0366d1cd78d0abac94d5e551b020120fa6afe5657b89ca998091842c0a495e420bf7f3daa1fc70a2508bcbd8ace21fea46ac7b943abe1edcf232f203e13402cc3a0e26c58844746090d21170fe491846c70247bfe6fdd28bb1e77602705f99491cfd0e76cd1ad750af6962f13b034c68b224a5e68cbd54ebfab9d9e1f68f121275f00bdb4a67ff5d09cd04f4d0a075fc5d0698b8d04bd24b3c154af1e8435e6bcf6f31a0a4e5f202f2a10074481154dbfba92529b5998d1cad1281686aae02632bfd58c647fc1688388ad90ccd0de6eb0ab1c57cf944176c9ac060767405ae2f9dc3c71ac7f3980c3b329a2fd1343b456e20b608a3d038219e7f0666ad2ceca2fcb4bb256691a3d8d8759c7c60832fc1a30e2215a636b1a590bfc99adbac14cc9354a186958c020d2584b2a848f5acf4c5fd6ab0937e213e42b5989c21e3809db14abac36c64f139d773c47e6298d89563d2eed72984a0495a60ad6b3735043c5cb7fe937a1c5a4c832ff262e1a9367113db60dcb30e4f31075eb0440a260260e38b06e9459d5d379ade8d4b7df5a190cb05cfb95b183769c4909f109beb246db4071a87781021b7b63081fb39ba2268a9417e45e660ad0fae2ea19759b8aeebc051e078704126adca049235df051f594408dcf294199ca4e409dce4f846147fcc37b0471e739fe013ef330e3941423fab3914a02fa8ca0fef0848a4ade3cfd98456b1b243990781f7439fc65185accb042e8e918224d28500dae325b71d042dce74320886f006430a8cfda527065499dff13c7d0fb45ea84272e0322d2ed6157c768322e96e4bc987a94ff467bc364b4d72f1bb216f2506f19579d114e9aeeba94a15a89943e93981e2b98b18337e9458dbbb8e9d1f56c307bb9b0c119ecd3a496e4bec792da5587c262e49de2d2f53180f8ab9162e14cfb7e104865f68bf81113187301bb9d0e6213df4e4e4cf933229fb8e676fab419448e3ae94d9298cd3c6e321f0618c178febef62ebe0739237d9cdeaf4af7c8e46f4f0bfec821cae252152ee5a7f0bf93498bd7f4dd580ed4865cff67389caeaa78e1993ba646b5fee68114cef81010b3ff2a9277d45fc33d7b7c05c46fdc89d5651c597306c8cd4d9a09137e9bc9f276bf9826572d057e5831f95479ea58debc1fc1866d79c7d9c554a6c2b8f27cc86b1121d30f7588dfc833e83ff58628504402aada4743c03a18e2a842e1a7493119e835153cce857fa36e344b0836f420249959b73d150ca1e68fd01bdc97870a07167bb0525fe0ce1cc2298ad743146b1601188345c554a6c30f09c897437501d650711d9b848611a9ae97306c2cae41d910a1d49be121a88827f2c26f1fc177657f6c5d7d73bf73d1bb8a361fa326183a3b0f2a82280ef5e2e763184977584031b881dd32a490e75786b4c02b4f4eee67d15a442dba170c6d3d529f5c63249c0c5d74efbb33f34ffca23bf6d0d8fbddd99782ec9e5167c76ac3bca9f386bf936bd2261532d13808d15b2dd1dfd5da84f2c7b0591dc6a0d84b06de0ab7e19afe9a151d415d77ccb3fd4b7909b417b1e2850342ad957e4c970dce4e8effd6286fcba0f1df47fccf36ac27010bbce2d29e82813cf90cf4d81c6aaf06cfab58b9de49a981a25b1e32e69a2cb48fa6f00e21e595639a779d84210422233c25ed949dda9921dac3cd6400b7c08f75cad6bfcce50d9962c3b14421a61293853327a18e442dd16e67cc47d08d0bf9b4b0964bf33333774b597425b0bd932cc633a74ecb31923602db5c729f13c1db44d5b6e603a16200e44a4b659e02d98f9c3698a2adea07d468f934cbeca3f7ba0a6d90ba4c9aaca7ab67ef4a586def6beb2b729f4cb4e8298892d9b325be48e71f68cf7a444726d195d81f68c2a82df0bd68844874001a8bf8bce979ba823ab14d37aa81a339a22bff36b4943a8a176724889f5a890599e894000708f9a4883116669ad0220a8991e1f173e39abe3a34b3ee1d8b72f296cd59a1af89ac5055c13ae009a62fe02352f152d439bbe0ffd4293bdd886d9dd3fb0315658750eea56cdd2912a64e3cb5ffefb5febe7da0f716d19908d7e3fe1e67901d9f438a8425d6406e2ba09648d6a00a56fd135ceae45bf366b984d7a29c19517e7f839480fbba5cfc6aa6b24b40c03833a1129e69609bfa37d472c2ab39f7625fbbc39a1f4dbda0952ac37793db6ecad231402bc622da1859cdff26559672174412bcb7c2e4599ea192cc2e1121b5b6d3720ef2dfbff04a2ea1c397ccb0f158889842386db9e081bc4ca18ee7637cea3d6e78f25c995e1f393f3ba95f39dd9411f41c7a10814fb0a0af6dda443ac67bb634f9c685afb1cfdcbd89b2a4fe3e281687b82263b704223a0f492e1f240c476ba186a976cc4d5bb2ba18958114ee667f884baa4f8ee99094c84833962355a9d4243155c7e84df8eb93116ff618b1bb8775bc13dc04e9416101f052006a62c14dbc331ce75b54c2ba6c5d3d60f7c785c540a70dafc59dc2028c6c044db1a1079a1937290c5e74eb04a58a2d7a3eaff22168a318a6aa2968e5809a0bbac650e652b87f21cd599caa801142f79c088525750caaa1790961982e47711cdb5bc05a3462d485d5d51e764d6bb5507aeb0d358c71341a956fba10f072facedf962c84b3bc1e8995983a919892b919794c56173699bd0b7a88db9a45cabccef9ad46c84cc661f433e5aaed911926dca6f4660fd1b2eb6cb39090eae42f33c864e334560540a4df84d157c8cd2210534ae8bf3bd82356ed55c01c780a07a6b7aac968f1a7ca54a4281a9aa4dde1162908b9dfb4adae78793e5d74e96bd432ca5777646c6e0d0ce185e40d46cbb49059c1402986ea5842ab8f2394036842f8a885054053416ee8c0da68e3be34cd22a02e6b099eeae2fbfbbe982b2b95cf34b5e6175465e0def8da1f0a26e4b0797067f4853cf679b9726d2c9cb5af849213723b47780e302975065a75f709105e1ee74d4dddb8b31f43cbfa80c8ebea9e39804ab62e7677ee66a94f7d43e9d41c80aa50249374a4867d9997a803c539730bd5122cc19f500d9570d9e0de8416f7ed8cf0eafe954fe46526bb64edd1e3611e0ac10c5155682ad3f0d3c3de2134ab485656c18deb08cf6e22cbd20177d39d7f05abc4119080725dbb01687f9dc53101db365923065946b0f62b54db594fdea5d0546c2a352a08c088c72a96d851e1c3ca0716d524ba512d0618acdc10fc1879aa139a92e1663e24d99c0f03934ca26c083e9fcc5ccbe9970c9fb79d1055e0da7944c0ce112e297740b333880b7d8498f2f36683fb88617e8a4089838585a3dfe8ea53860649d9740cd218267f23033d119cd370626e4ed8fa029d93f3fed899458ab74105e5f2ec214d30665ec996a537460745b81ffa6058f13dc47ff0f1ed22f1aaad654d05b146bb1df55401bd94f8a417aa6acc650b8dd6640317e01e32356225be24970cebaf60e4352cb47ce01459a270a9d1e9033a04763e292a30028d2962eb330beed9d477d75016ebef2c6a045856fb6ecc2d6390adcf66370bf06595e18376674d5e1194a8b92de060f8c8c63a717459255e4949f68301176594dd41a68a1f5186834a32b9e4eccff5618c5821a8473e6d0496bfee0234582c092bb909b4a6a936a0cd20d1a15878a1a5fbf815458d95fdc9e864796cc05b65002da11c32f5deac11a5c0978cc89301c41e73cc5b7160c7b23026695a2a5409627b804e5a798f9c67c8d973ade50d6f03b0057fb5d9b17594a4090d538ee9c3552430660c9f64b58480456fb5dba80c6f33ee9f0da6ddc5d6ac8c7575643475f794b16aaf8289f94cd50e6153f65e56d6931baa001e950e1fb3499a66c15a38bf97a2fa6d1696f9ad705f1145a20114fd26d5e3521970c880870996b4cd213e07a8e18d414aed08a036d2333f3803ab33b817a0c1cabab90e9402c26459c3abcba2f0f9c126221ac4943e19cfb7dc18a6727d42674a5ca296aaa6be8512c84322034efcadc07dc3a4cbaff4ff6971ade68505445601d8423c7db849f6e740d9c485603b59eb1aa129830578dadbc2b8c5561e2e0c0b379d190e55c6ea328e856fdc716f2cd358e09ce9746bf04bb7a665665a008298091c5fdb3cdb026d59f962c7177d5cc29b25791dd32de4db2007675b52d2846dbae219f92ada5cbb08248dc094c2a0aa319a62d36f56ccf535bd4008be756663495ed8987ad66b59f9ce62a6257fd66a6dea5debc28fb7507800264678ddeccb61d896dd198759f8c206e817c99b896308b6c3e4247fd2b42f9992dc02d976169592c3d7a8ccb883c2f42119de4d66b4accc69711b9595bddeb63652d8d80c7425939b313cc42c2574a1636f8b168f2cb7f850ed8df1f2587a894594da67553b0d8ac05bb001dec34d7b5fc40d26e8e2be13898e87f81229cbc54b5aa1395fdd2d9a460d9f4ba8a26e13fa814d73321822b2d953156a600b220dd7cb447a23f272d5e5c2414d24b8dbbae542db542f74e1229d4e359fd03f7a863d3fa1fe615eff81c1b5fc7f887aa41541024c02b93979cd4969820108fb969f0e13b226a06a21f71a8a71e7de2d148b87cc44b406d21a6443f65b1cda1a35b2e3d382e9fc2e1421359e2bc5852347b3a43db5b3b1fef8118b88966c43fbe4df9bb41b34073133cb04b82a464f7ef5774cc3458c5cf614518dbcacf487e04ed967f32a85d4925df9b20c1108465e60a4006efa12db013c90d5d171a3cad91df4622ece25c95d516fed17dbb2c92bffb6983d1c7c21ca2ec6b346d86a170d11e51ebf3e03bbc6720d6becc5e82b87f8432aadc64c7b98725abd78fa00264733d8f70abdf9235763ecdb50df174bbea31a60b6ddcf05fd789bd8589e38b7974ab1a1950118655110c473c2cfc925b2a184677a242e077c6fa83aa28b454039e91c7240041112f8fa43b8c11176a51e2fc1b190589fbc25801931d75c7efc5968404baaa4b03e79782a54848729fa56951097578771cf0640d8b64223d460e42ba7021c535c74ba667d6847dde1666e07630d17f7f68aef5437eb099c5618422759ecf904c0a8439f6fd014b2e03eee3c35e746e50569c2ab68c8c4c0871c9a5bbf6e3b505f0e6ef40d3d87620cf7c415d9bbfc7bc16e4f9fed9d1055e2f311b29d2dce482a6c6b4e3221d48d08fd81e6b324aa52e62f7b68829451f4ca121f3ce1cae96c2b6c679b0e2027eac8523f7bb2a25f2c3b6bde88a870fd55055631ca5df99c46cb38b2f5e3a0af159d3f301f37ea4e707561df2ecb7a4a1884835fb5bcc64ad0a7d2d77e00e57c7d67fab9f85394f31cd0fad4252828c4c8c78babf9c02820989fabf8440a157c943cacc703e0e05080d4645220fbd9f2568d02f88756db36f688f96f4de12e51a2dcb3aca3573893b2d5621092a380198b57eb185fb17b975fa58a24e37623589460a5846b19d1b0fb3fa54d96db2fce34e13e7b928997fd5551a5b2d02b0147046276d1ed308c6e7ccd24f9c0ad764a5c664e3d123ddf265ec6c2fa4b68f02d263d4c8021cdb2a651a440b362dae61b1f404b13ebd0183500793cfbf90f632a5eb6271b4071b001f58a2c070eb6b93501949e6e89ec8a7b138f81ac0b90b20e8e2ecc1daa12a54835557462f93bc35c8ca691b68cc38e3c309d7510e7f4a19ab073d03e0d4c3302630f95a0ed61d8ce5f344457cb1ef6aabedfbf6507a2baf8c6d65fbb14ec344ce5b71a291151450fedae35cbf45dc486ce433255938bbc5b25f5dc8a2f110c24cd3b6475e5bff603fce9b530a9c231cc0ecc6773a2d5b3cef556c24780a745aad9a2edb1255258dc747203b56752c6003cc8e5890da3b0cf5e028b61e45164431c80add49678c10f31c19ceb5cd26d9541ac7d19b7d3a07e84ada5f244c65fd447ccdb6ef046ddda8ab48dcdf8891caecc1d832812cd0b43ad823f88d293c17a6d2275f390070a293672c3853e3003dea08069a1557e62376083039ace430d9fb11c88e9c7ceb0c8ddca3bfb746e2217b9f04ee75ba44e42f1b39c67395f0538f592732ec292bf159b278fe62838a77fc17f0a479628aacd9bf4c2c10213d7e4193c53b324ba6d195ed100a49d49c106ead402ffd42b29e3ab9a150a649c44ccd305a2e4af3023481024be78c5ffac4bc82df58d0b19d1713505e81234b3eeb2f6b0bb9dfd50ae9f6af002a41d22faff95b012c9405baa13ed811fad5f217106735fa92f48fc929181d3d60704c3b644a61aa5c9f2baa72b2b591704ed977346a35a804009ccfa7b82594928352ab6b1ffced3d5d6239922c68693b353142b45b8ceddcc6ce4d8f1fcb85a9fb05cf0ca13c6648bc2e145951fcc0b3f8984def03f3c426b04bee8223bd8e9915017e030aa4073e63d7da141f80786d02d331361cb6719962e87d341c8bab92a097d82fb3ab3194a6424f29d7647e89d36cad3a9332d8f0deaeaf7bcdc0bd66272ad7db5e53ccfd63719544454cbac67dc0d07df07bc086731d813cba488938be3b0d39d86ebcf304a0b7178e10abd18f920b52185611a76d217f0dcadee065f4f5a5c90417e43bd42a0fac228cdbd27c530b00de40e5b4842b06275a7f85d007f83a5be3d26541ec9e014e2a869e7b226bc5760f7e4e6a87afd5602e27c51f51fa847dc1cfb38b11697c9c475c5f662e72a4733e8771462f4947cd484165d003ea02eea70e5d145b71d2a3f59b58b6346b84898bc0a811bfcda6637a3a33c293b41865a86741f4eb25146c7698428ad299177c48599be6092c628c0638b45970c47e83ec4346145c60e2e6cf28cd8e619e5769f63531e912dabc382797a7f2f6f2e25979f49e264bf7bf7e9c792426b4ac9d300fe61b24142084ee1c7062c4a91a290c1c223708b042e3b5ef5568d9f62068c82789718885d599117f3264f10efdfa71f07412e066e3fccf90be4410c05350fbe8dbb089b1d580ff5d9c0836b8c11289abf31929400b67700a25389fae27f145246c50bb485d0d8a8c315d3844538e1c1533ec0d90a168ec9af71202754e0991eda94f5c09c5d0b1c1f8f394d7148b9ed582ac98144b6c77c9d407d846d92719e2fffdd6e9f782c9ba78d9280431b22837b22e409ccd5bec2586c898eed5099dff05baa51ea463c04c5101b31f804a562fb2b5b4b267682ba515b48b41d6d98c14ca8ca0aee921c2e513dbb19b7f16edd6266ac0bd86de02a3ed771233d98dcb3306b501f135daf048628d68882fe888290521465b0c99349098daec05e9d9a6d34a86aeab696092fc87a99a4d4ffa80ddcc20c8ea8ceb100d20f84db673f2a5e8a0d4d053a228d95c637dc15960086ec350abb5274ad22c3286b91b4380809ad01b6c74beb77c27c4dda35b1394287742826681a34706de8f8c7ba244dc99a7200a009ff6817fbf1726ad0c71f8f9d226ae55982a67c85deb407f1d16db3022c7ecf56e4ab8d0333da96e4a11951f9d1cd69f372b655f03dff2363753aac16f282ce486f3b2179f61eda482858ad5ac003ccda799e9e7d31be334c8b1e4d3270b3fb2c419b671460c6feb8dc49e2fabf13d8ed39af1605379c8d9175862d749e7b353e5ab19260696109e19e3eecfc997d3174f300a5d5c1b6490f7b95ad660e7f174798ab88c0c9a11233dc673ed02c623580dd6024fdd2eb2638cbc0fa196b573ed8b714a98d1838f648665d80b908e53c96c6e8bbfee30237a22664664d661e931d99aeef747ef0e50e1462b4ba007b8cf34d28f73e28059f4161e3637d679d4a2c31c4bcf6f255a55c89c3579b3276455aa16f291f1b047c6b2ea05b6d8d6d480c990d1030150b51554489e567d44ea821c515a9ab1bf02e00cee3ce25c6d53efa1c45d39c67573653955f9d526aea248dd74a5608c440fb3d96eeefb0fa238ca7cbdabcb0801dbbda12554909ea369db0f487d71f1a625d11c7e45eaabb67622a2778ea5d4eb51604ad2de3559d04c06d3457490463efc90463a1ecaacf00000983b308dbcc258b4e74e65a7932ffac32319e57deed285ec12689cce1fe2546ab4503091352e4a35feca7ea899c0d00409b16f1e1d240d909dafa332424a52bc4743dbe8f232688c8ce402fb57201ea4e1209f51f9c85012f293809c90b60647f7b4cc82451556eec2e222c333143391a2fdb74a6fff3a1b09feade437e744e3084afc83b3ca42f11bda142390fb327030bd07f518d045c1347a27512fea7da461698ff6f7f50936a556f7254a7f9937628b11ebf88857fe88104796e7acd13f34901cbe098f97a5844f3b5e57c4e4be3720016e88e12e9b452ec425c69713c217287c7e2e8ef9f9bb8c6903db95c2f66d5b59c4a494e3559649d82f00f689f7ea7090f56804fc3e1672ee7222a0d798ac54940105d3af4cc0dc52e4770f35ba910578ac98ce8d890016a10dc0606f5ac6b53202cc85af7226f78347360ccb8b11c4a8ffb832480958169470eaecab6e13126e0e1cf8e13a88a507b66c43ead1f0f99813f73dd5da9d7a572c283c9fd7ed0728632a8f8cffb90dd1623f5d1100b0eab67afd40fbe6c8895f5b7faf444d017a784da215f0f940011cbabfa187f5c334480696f9e36c6e761a7645a8d2f93fb6b8a4c14356d0f5bc134fcbc3c70c3a4cf8470f30024ddb40208aa807e347ba23c47e960937bda86e54106330ff479236525936d45daaee04b219b7122f6a4516321b0b64c509483d4e50627d18b981e4a0c6bbf6d2510c28466739ba19c675d1fed3a36f4888b634bebcdb7730fcda50dbc12de3bd31853b23bc9feba2b80bf1db8671442f20e439dbf1d7b98f1a6ae0ff7ef7e430841a5f1dede73d0e98728811c3a43c6d8f1f7781ec90b78f9a0c0d0c55f8f0bf946996f9d001efa15c4ff71f9ae4f1f374b20a98359022f6b622b686bc08c969a309cee7b5ae021a15298acafb815e076379d27aea2b1abf01494a2b32021d0af3d9d180eef907dbaec5b2443d6ae9091ec1eea026205a69cce4f4a0d68cf8136335cc4001f628b484aba5cab43065d0ddfaa0d7f5e530e3beeef86a3de302a61cdd9e2ef851dbbcc229be3357b509d783a4f5de66923c62dc5b3c4b96f549a2d73317df37c0e40c2cd09ed7f39b1079384a4bb1eed203198e44fada6e9f4876ed3f55b73f1172547faad21e45c851fdab4afb142107feab5a7b8b2c07feab5a7b8a2407ffaa5afb8a2c47ffa8ba3d8a2c47ffaababd896439788b5755ee5708393427a570ed21867038ad315ce555be0c3a17d11dd312e009ee6e2314330e0c297ab0d2fca7b22ce9f9a476a08eec3b500e2892346fdc127fefad071c4a8aae963e4b4d3ac4ef3b6941453aa00ffaa1f29557190fe4d39a43c6a5af74d8bca24874480360c0d287cd73e037b99ed04c428ff9d2bc0ec39ce1ce6f25d52f801a180a3820a806c201e5a13d76de870dca3e96dc38b3918103a4b9600dedb4ff4886a279010df4e88085b32a546bea257aee0263239950ef407ed187199d5a1ec93e8cadfd64850b36b276c6260ab39f58131c28b8a06e089afbef99ae0774d7e5e0192277e721b6a7ab10609ea696aac4172a9fe07da75f5fc233b001d08a42b268d8ebc2843f45e48a688bf5de238b1b8d1c768648fd22e8672a2ba80ba6792c160e6f854a6ee745f480fbff2acc3c5e5afe982f5e2d9e835af47aeb27d126fd7839ee2651a17846514e63331314a8e47227d233d70bb798f9e5dcb1d6982b39b88a5ab18f79ea8a9de5b947e2d5d044e01c3ea6d9665038e83194986334344bd03b93faec96047e03af2d6010214a7999ba7754e3d01fafe7052223062eb54ce9681a518954f7a99599b8eb120262d71ae72b3520865e4f9b9ffe428b32b0d2ee82294e676c4753322f52003df3d702fbd5587c3786cf70a0615e2842abb2b75fb6cae8d2544756afb5deccfc87c1ccbcddc1a78f001953032fe14828d9d08b597aceb01f1f51288d6beef198baf4c932cec27265287e4fc45af9b9674989215035db28dce983fcae7f68ea9e256237a78956944c778dcba498573d5367579ccbd83a0025865e95c8236f3c4644763cd58cd7eabace1a340b553fc4244b02ab1770ad11c3f3a65ee07c287bb5238a57db8c528634b7566d5e92bfed689f583e6c8534793bdabaaae253d3b44debe51d71e419565c471c486fcf852a8a57fee72de35b35e8b40d35e7350e246b1bebb03d42c6dc75aa6b803e6b9cb3f15ac2ea87f00e20780d194d559739ab9f423b2d163f0bc78015c7ebdd6f62de3a0d6144ed142cf614c179131024c2e65293b0878600164676948c9405ee1bb9036ab36b5aaec3692caaf99464ee652325971e2039f47f40885c923c88edc4296a06d5c7a37710236dcb06266d298cddb633f0036f3d384f10e5f1a4c169bfade071445f0f8a330b0cc5d763f53e30a19a4d1178c869e89565ad69dc8169cddceff0bde8c1cd4e4667d03e06f691a3c5623edbd56a1d685b91b3d2544b83554085b778cd309c23c7f7f15e908d0d51ab7fe17014d9ecd1d8fb3a541787e8c474bf2c67a4f32a3d4f9edeb93187aa16b84e3892b5e39568f3658eb05e81eb9f317553570344a1aa7257dfc30960f3d9937c507f0295f8af468374b0c99f7074e839fe649ac7d07a048f6a4f48518ed8cc606e506b9c3c313f5476bb01eb8a247ff19c3c753f1c5712229e6076e8b38f35d3a2c5289db141229f9848024da3fad6f0faf5561e70619cb3d68e9090861d61dbc88d7bd21ba542d04cc7347109744d911056db13c28559f84219b08f187523f43916b46f23ab21429431d2defa091d8a95ee5666f6873499ddb65a71a4b4de8860c3a5e283b190a7fcc15aef83d696934f804a27cae1eb45f8850f4bfbe82669c48533dd7c8023808b2b23aea455a3554d53d7a0cc1bc18c56d0bb5cbaf6faaf465b9669dbc497880e156150d848dc998b848152fbb3080512bbb724c6ea0afb4fa77b69d0c1d9b0ea92d96c9e81e1c63e55cdaf755891e736eb911b157ad03a60c71333c2288ec60ea5b4e01cfecca90a5179bef85e328f07ce52bf4292e334a84e1fc40c6de8fa704dde74e379bd27e44459c9b008415b2211c2674b100f04713db3d3c33a9c99f8fe20baaf224499f69c75c95cd0edb064a26f0253a649a924e33ab69d82c971541e8da499632fd54e86cb2a30360cf73ac00a31231d15d6c83c224e3147cf3b39275c71e029de1d0594009a0406f364b53a79819ed6885368b9daf995604dbb66eeead090196bbd837ee376e82da560e805a7172ec55354f6b5d91fa462ec2a8784dd4231200f590e824fd3025082a6eb50908198d7899b0de94c9a46b0e3c64e23a1790196096e1bb7d5d3757df94bec3320c365e39d72c5b6af248ec149769767d8205a136908a690656fa8e1ff45217277c64e54bc2bfbaf57503d9421737bc803800bc688a091f87acd18f5052158fdb1561266e5ad2bcd06633bc77dab8030baed68951a194e16af7ffc00e88ff65bee15a2d9305014c95eb0260af56ad4bccedd20f938fbe4400d45ac24a47b9e0933d788bebf9f740b2bacaf58dabf314ea287288649317fb85d8891fb00f6ac6cfeec64d72623d9f89fe03d40474cff6132a1eaebfa8f75eeef5c0efa15dd1a16eb10a773ca823dc704a1ee9f0741277742c58ab2e0ca5a8e7fb2e6a3465ef09e833de23ffd40a98415c5e30547cab530c5fc3ddfbc670a27058eafd023424284df2f9d01c218406afdbc0b218230651a3dd7f8abcabc69e0fba58c8c15a2e4e30badc07cdb1adc1ffaac3986ada7e68f9b9abb743e43d709c4adbfe03ead262e0e03bae51205eb80db115ca79014b251c702cd1aade0de019b9e3e71b18625fa6a108bfeaf49da72e8023616b280a15eb512064bf54d2a24f9eb0968e21fed285ddf4149dd66d86c0c0e622201718e2394f85170763e17797b04f5ec8a8d58b273a53a26f2f325486dd32b59618344a2a60750117c93e6bca057f5b9ac972b8d8b41a1005ad7bf48810e6cfdb91c259502561b2555016f4be119182ec6c49a223d29b3bb5775e990a889390149d080ae297e70d5db22b2ce431737f552b27a681f0e04508118ca2fe4b306fb789a2772383c0b11b4dd0881df56bd63884917fc861325f9cbecc0f50b8ae72e0afdcc79143cd97df59c87f457286ed7c3936b9a7bb6b280627d31aca38ac2296c7d7fb7279c662260c7d3bcbd7c76dc9fc3bc1d99d71bf136bdf3104d2fa35251f9ea47afa4ebbf28d2b9a559601e948f4b1a0fb385e44e9c35eefa1bb1068accebf0d5333b610a03463652817f9fe685be81699a785fb59c8b27ae8f34652e366d337213e41e0109f35f692c78f61912a0c43dbc284c8c51b3007e3f6ea44157ba6e0ead7a68c057f3d2c1f28169fa094f2fa8e034fa261e2777ed584aff9d685ab2ba64512bb2c45c96f2148b0ac3b3e33a448dc9c5fe18c674ed5b410ef5ea4ac6bd6594227d04333efbee5d92365a340610478c75f223bd4e4db031d0a783950730bacfb8e93b5fd670ce44f102489b80c29d9e61b1190f610bbb2acb117660c625c118130ce36477682a7db1527633a180c537a8cea108aca6c4846fe6ff484c2e012c28f8368c3e7f0309b52e160fe61bbc68b91b3d54090285ae1cea9345cac175e10a078a38231f4321b16491475a7e4accecc62e172bd8ee49613f5bbe78a74de08b84c36c3f468577ebcc744bd33a1c04c7cc7fd2dd3277d55d7566caa679098ba559a8eb162fef39eafe7f3c4de7d37f414682f6d087ab87efdcf66486a59adb3b337bcbaec2193fc396d831569a1e3505bcc66ee4532e05d0dd175e6f7c3b0492020442cf149ad85aec90d1113698cf6db048f2c36257d0c93ffe1077eb1872452dd8666c69964821c65f725b75b9010fca4aee2c8c9df69e49f0020862e21b5e9249eea83c5d23702fbde1c5ce5e519df9899c4b03da1adcb252a9413ce2fbad54b29bd567dc8e0ab854f270460be99cda127e4b1933eb66581deb24a9b4e0e379d3372d96aa3e09de8cd0f8ce44e7b4364de60a7f8eb1338a47cd1cdc7c391bdac24c569bcaf6edb786804deecfa551f60d77332ce1f116744ca6d664b95f78e8b73396426c074bc181d0ac6675909f38647042bd00bdc6703b29b64ada3c1d7ce112f6ab0688755cb3e93a1ee68dc1d4e0eaa70a4faf61669c918dc5570035fd3e912f86f7a9df3810825f261c1d117be11eae17f7911cca593999ac8823c6d438c25af43e24dfee469e5b97d992e848b6103fb256c8334503b942137127db62d4456a86fa8bb040f861c2a9e7dc74711be8c5c57eeddf240460c6b387be2eff4c4209e4d3c3132bba2650e6f9e4aa36136e62e5501c7b1e706f034ca64e9c0418b8f222bf7f431fa075c38cfeb0f34546165f1e83700bd7aeaefcc03ebbbc0142e2cee7a1cc6d68336b36c72dd32cf9e33f9583e44d8de202b70ee709b9a716d516838c66fa511da9d56ad6ce0d1b09ac1ae918d1c12438c8b8e6f4d7164aa4aca86cef5cac513fa23d13be41d576b449e4d141f67cb6b11b3cfca02e547f30ef570e4216c2d892ee6d5f0f271b4f6b4b2d1dee01cbc1673df015bcd831dd258ea26dcd2b242d212a1e231544fa919346cce189c24f65d0b32edb18a870620500c380216930ca6b4945e3688da5e50966132535a88c4f9a80b3034f3720fa8f9755452c71e18566142e39614ca3587ee491183e3b0d753dcf3d163205a20e6c9ea572bb419daf78ca548f88eaf395d1ecd5f7c8968749a5b193924cd45f018a43d392794f2c3b9d8c8e0933633956345535f6999b5453aa152c8fb2c98c19489875581aa4bfd68b40ea1f8c0227153c68d1ce205ab7a43480de0edb5585a1f45deeb4e8e09e505a02424f79d83bf486d920107db6c84ae37437bac8e0ed61fb253faa0e8bb4ad606475d4d12e892acb7bf2aa3fa3d854a68649d9531dbeb9dc02930c899337821c14dd450d198ad89ea122ee46b5f994dd643d366c53cb00d01af2f4e9f07ca165989e6baac6a646e8883e2b2b535257096f9deb54b83c22729501e368dec047579e93bc3cde1893c7957788021db8d04b4f6bc8b6344a6acabbf45d9327a1c4e980d7ea48674087b93a0c5ac4593aeb53aa8f3901e9492eda23fb9248053154b8c7c10f32161042aa1056f62cdd2c37ee5b499dbfb6156cec666fb3334f78b886b76eb6d6c042082b7b91b19737978be4db1ce3b683d45055b14a95fd405abb9bb47943b27e44f9343244508c8e8cd75dee753e2978cc532319942473cedc01c1313b2449e053a2f741c1c0f2006adf4c3683eba43565f55b71e79c9d23400a73a9f3e209ef1c0a8e509c20a004a6f38b0800b49d32a447681385a61932c78b73cd58606a1a3b45c4637680a0f6fefc518915b172d255e71778996e42c15fe8085f1c8901bf836aebd830647c6c194df14c90143fe07eba2703d7e2ae48c39cd0213001e7d813bd33de29bc626dd07360c80461bc28e09a10d2d567994c646f44574ec1c539154ca6102be88b450b1c3da7a279b945624b0e5d42a6e464b8feb2155f59d1883b87b1f07909f33e99e6ab87605818938658bd496a78e3b87bac4e8e156ffa751a790530e5fcfc35795226fdfd8f6a24d9d2e205715f40d91867da9e3b4201e9befbc2e78ddfcecc649130092ee8a05af33d83a5d5177d87c4a26b3cf883db34a0543c39f991cf98cfc8031e559afd18acaca2d4a7b39b15ceec10506a74b1388b923529e23605b1d0ae473095562444d795045da2ca514e32a78d33b8f1c2ac31dde86120ffdfd9b5e657af4ad3dfe5462668aa2ed2e8a0aeeea5a97415490c6296b642973f8648a7bc8b1d0fd4d53534a56e5623eaa693ad9754c8c62543befb51509cd753fa24212738731d8612acdd33523915509e239bcf89b56c77e8510123bcf77f1a9598bb7d3a4dd6196a24837e7aab1cbe0bc1b160edea868a48e3b82d2f08fb2eedc8144ed28d450d5ba4d179e2380c0da9006c6b7f401e120a8ed4f151e913733ea5f2dc5678caf4c6ed074117b40ae6163f68cf2d18a54b4b3804e0505f9246adfef50846c35a13fa170afc5e5a89e5e9d9e84d37571e3d38da21c517ba47a8af735b2ee665a98799b0e67e77ee6d9d8cbb3be1c783a9a05fd8f32e1ccf70130cc532956b1d8527afa0b07fe6a75ddf7ba02486771face552ae2dc1731776223dc99f415ab527c0423d666f64e631608d1b7ea2595a04c89055236558106bb04744c4c75e50f9747d077d4c71679f8d78c3431c9025fad8016fa33115a51c5a2fb3f5642ac31209d8147b854268b000e66dbeb2b366c70f1d85df8c065a62ec838c54e4268496ebeee53c0bdaabed150830130e450557c6579b28207921abfabde336bf46141dbfd29c999895ac1e0e98c24cfd1adf2b1e260b7b403756098b7332f4c9a116c5025e3f96a7ff406220fc6687c24a16f6cd145ef400cf0a2e0701d8b92ed4b2fef8dc7ab748fc584a447b29c325ad5f66ddce2cd49710dd7a5b206b8ef010d41964b6a065ccb96dbe36e91326148560fc16358de3416f23641dd8bedcba109ab7a5240802351a386f8467f99b9af0165145f376b1fc8fbc3bf8048381f1b248f6664b195b10934eea108f90082058a7316075516762585af681e72a0d321dcc62781db93fc6aeb716a838a7be03abf38b0f6dd46b77738d3f53da51407442cbc4cc230a72ecf26772ef2cf404329f189451208d00d2150164307e4cadf7b13d8862bcc4691f31ee184d2f80f253d607e08de293039326385e8126b1f842b770725d263e8ae2517d7818deaef8d719678243e01cbb7aa48eadd7cab3a21aee1609cedf275d4ccbb4317ac29c055ae1bfe569702fa568c118f28fbef0281dece25274454c630fbb002cff84d78b75ee1709a7f1d4fcd24903f2e27c8850146e0620dc8866168e03df9809621c30dabe42a3333074e6cfa635dd373fcbbabc9c9fea9e84dc0ee84efb2678812beac7cf42d8062b0d6b0424244cc96f2931a48fcfdafd733765f5b84df625569b414b5d0663b227dea9dd94c1e2c3bac9add2234ebcfef1be30e668384b15a616ff92e6cd50b01993b3eede1f61a502aac70b9f9d0cad5434e981d73cedb2fba8d8385513b5bdf3619383f2ac142da8c2295d206d9420b54ce9afd135574c73634f3b3bc3cdea8a426726b6512d66b38d8180a5c2ce5c3f4e1c67180ffed20e4634ef31c9acd799994ff80e9c2bbef0cd9b05d74334a7a53636be0a20a4840506f7ce31598d0b2e4d7077ee93b0356886e59892f2b34f810ae33ee1e83d21a11adb862259d1e7f441e5606e476ba68a5e3d87750f406472b7660ef00e2c18c893b9af22083cf09c45961f174c2fcb61434abb75d534debc3266f309c88971f466e7f47eeb839517ac81f67412d309bb1d5bc6e09bc62570a21686e526a8428f2bd21f9973e602cbfb0bac3b8514a00dfa3280638f6097a849c458196e7c342963ca5eeed6e84453c632651f3465e1589ec30d5baa4bf98f0b1bed2d861a6801b4b28ee3c07dda54de0a1446ea6306ebe0b34be8d26bfcccfbe434d480d8c5480dba31e4ce5d3fbba4e208a4a92a1af8628c2a43e0fb7046f4ae2fe90b82c40589db6c4062a3782079707041e2e91a34f00f8edfb5c80472106c9a8f711a6126d9cc8d6b517c3e030511a084c34b058473589540dd511a1ff6542244e46ad0dfe5078f9b91a809aaad43820096a3057768db910c1beb276ed3028cf0c9210cc00e435f0e515ba5e5c21e3285e4455c08d385212e84357e8ee46e66c7a961728ad0f3fa6dfd60f00cc70fefe80379990d83e5db1480ebe7e9922d1179295cf366ac7cc01d510f7af523ca9940d87e55f0952eeb2d2712e29e21b5d75a3c226ca6daf169061b7d532cff8da94bf36b8f8a03d306b35226890e42a9080d36b1db9a3be357b1389bd7ef20bbd7161c4c635f36fe56155fa380a79c97b63e52886eb76098380d2baa20ad68216d8d3b9778e903ee27774e03cd5e90b5c845902f858acdc039c1b8c4406b0af5f7233fc2178818851a863e9b9d023ed21a230458b360728c7f9f66e18f546d95d1033e857e438fef5af6095e5f3765af6b102fee4ad9eb7e698f97d273f5e171746c7d7678a5e2ed0827ff921a42c458d0f1c1c43db09f736cf032fb28067737c73f280b33fa46d8c065efd4c058fa88d30283deb6fc555a36b0505c00282d019cc1abe75d8aa9814477e918036b57e4446a5fdb18a83a8ec09e2d6c6f53e60f0fe93782d522ab8199a5c518161ed1ecd1e0382c90d3fdc9824150ebc26e7399b35fda3cc3d303f5206c8faa3ab9cdabb88ee7ce0ff387a511e0eab875913c105e4ec7d1002753eef49604868d75ca297e3b521a7b3ccae59e793b23e70afd46f71b53e694797381aec31578c659029c8aa060355f9471e496b23dca73d15c0670b50235f735320d526186120fecb6cf53833f4d501686c99e8f508080838785bc3e393f22296b80e21ec0af199a65a3f4b213017f30f62a93da4423d828c35f87587b790632367982457b2c4442ea5367bb8de6dd767ae7e93781572a8203fcd82ed116f2d571ce89aedfd21572452f6e232a22bc97bf5d08738f05848178df6dc991b147ed7298da05303199126da28118b55febf31d09a4930e53a453a65d7ef0a7e879cce7d6c81af1854f4655e46b32dcc51c15160caea20920ffd689db66ddd81b4ed5893e965159f68cee9fcd1b1d449b2d1b66d490cfb2f60f2476b111034f94db04102c1289fc102696c8d4daf3dbb8c5760fc6a6da447d8e98a5a3be56f45c66e0a5dff0b61e09aae3d05fe0b979eb010a5a478994ff2310176b67218fbac73d542cba3e1ee23a8910d2fd654975d67b5d6efdc691260beeec8dfb573846cd1b53c4678fe9d70abc5e5c05fa8e8c360fe9321516a8720c649ec34d24d2e88b271547cf6fb65daa90cbb7fbeb71728ef6f4bed3675e3d6956f6dadd05034b8aae61b862d979a467814a2ca24f49d9f3cfa369370961e591912d5fe80e2c2e208babe0943146ce5413dd45f69f50c3d7716e2c82e38bfbcf2cc04f7256bae9a4ff94b4d34656a476697378e6e2da06dff10f1890a55b594a1c7e090f5330494f94f9cbbd0ad0c83104147020001e213f003c0153d299a1248c77ea0b9dafccb188d26ef656fb495083c2a6346936264f79052bc981ec90214b681b012d3eecea94821ec146d8bc7dd53668f145a8864539ca67d81dbc69a133b01cbd7bf5b07ba9b2ab8efd4758794fa223b216dfdb7b51c25e4938c7c45aeace9e12ca797bacf02e497d87db8b61fa02216ad47f01456501a3f634b9bf4ae417c240aeb4d77f193ced8a8a27cb8bbe7c23c6dcfcb74806d126ef475c60b82852356d12d02e9e07bc79596d0cef7c87ab1f50beca61917087b5e1a9a3df057978ec68545f22d05da002f8d8f38c21e1d71a477fa6f6b299b714748e65fe6ce3628909ad795501f5e4546abf2f0f380f2e8c36e337934c31fd322b61a2951f8847afb140cc56e1644180475d356c6c2ec01ec4f3fc9141e8a005ced9a1e24014c13b1248f6741c1fb838fbf83d78c4d96e7f22984045533d62a918d7c0cea5922059381413f6a6209ce7c5bbb76a1af9eaf435f8ad6b5acbd8098d4c4b97d4be529f751757a305a8e3aacf08288afa3abfd5010c15ea6c486bc238d5381afc4a6156c869e190dcc8613aec4d6aa94c496322a209806c0ed4b96667d569d8d89a677c16118b697b29986a1f6bd5170844c2f5f034a8604b5b24f9c81e2aaa48417813aaa0376f8c9d794697f73ba6555db55a32142c46a0903e279265f406fb97cdf3dafb10cc980c92bf326c68dd2861521c1f6a92fc618e01814ba537c73d4418e2aadf4446afad4cb8a97c3f31a5c93ca1c33a90fbf00f386607c40470b8c967ccf8cf71c610d1d6431dbdaabbedf12e67e03a3a128b82b26a1cc7f3da678606b8393e4be541241b827acfccfd7275d3aa0d1c902a3c5b8c29799559fc6bd45c42f64dbc9b96d7814af1d80f82b03e2899ca104a5e880825f3381831efe1b956c6f4c0f05c92463ca3837ee0810e519c6fcf20813d0d6bfdd9b6cf5493ddfa35f802165ab7ed30f1faf230210119484c01a208385fa560dab0617238ae785f6c243dc0f1d2fb073b8b624e378a35ac6ea8409067440d599803f2a828974418aba295bed4bc5a24674c03f6fe8b9c5acbae3ffdbbd96e17d995a62b02001c3640064eec6711b066262b98f09d269540437a91891711c853047f4484127f7f4b8f84c735c8ac85ba6b6fc6f116b0df9a84c62b2269a585404fd93342825af1c0a95c3f980a08da79f35c5eb0a18168c96adaf2516d76370eda624791e9d8e217276a12d7420206aa452cd8f362c23e1256eac1d24aeb9ca2669b1e0036f8c8e787de55557b47e417812da6314de2b82d929394c22c8b063b05398fde33eb61150620a58ae3dab1704009b472139246b25a810d1830b001260b1de0e89639cb10e510d6d973a7448a4ce6e288de646183a51e74fdcafb77629b2036031436565dc5382726f11cefbf05d2ab907d3c18297007b9f11485ad88bfac0b878c2399f00051a87f4db71ff2a10aa3dee38cbe3e16b4f8ede32af0445ac2de709fdf03150b02722e3d5d1d947a5283e18a4e8e3eef750176867c46b29a703e75352187d52707c5210a98e85df21cac7cc43dbc7a9da81cb1fce988225ac3480ea114517e4c78639b15e5f511911dece30d4bb1e20a14d75ceff6c993773b19f4d8cfea2d1c4ead7ae014d766908f71bd90ed8ea4da42274250c8814453bb9eb8b21574a6013581d070dc76624afc1188ca74b8c779b870d07479e8d36390d10d26e93c26ce8f0d20c0e13feb398b044c4f0a288614ed26d31bd33b663874593b3c0f29d919da2fdf181eb3d67efdc8ffd9d38a56836d03ae9098e48a60b70448e65a365d9a450f7ffdc6e6798288c0a11185d155b2082cfc4bc2d0b1e674d340818ca78904fe6644dd0328da74e0ed1ea96e03799959aba1f6849c4ee1128995e2bb1917b3d7d98dcfea8e6cc11ce4dd82ba5513cd522049c46146497d079b36d8dcb6abaae15a681f5853640a9048124354605c5643b6e1449418a273951812dd8bf40b05acb70258b4c989f5e3adc63c0332071c4735066edcfa5a02abd4f2ca38003f8981931ad6a5ed4b621cca66335f50d8df4f61457e5ac0c0445dcbdd7d00e537c9e78b8416dfe31fb3a9020f528b319d9f3a9e54413003d07df10022398fb7f7e77a4e9305d7c1ebae2b18a2b7b4a43518031f109ecb43a72963a604da22f823c24a48943fab92aa0d2731015793e44c4aca90b232af6c27b8df88e6cc5b76f34ab7b3348dab459b02c22b2d5924a4d3d49c1ee067c1623f04bd0986ff89470650e728ac3b93f1d3c6b19c4a54b9d852e2690510727b0898f5b1aca828525ccdd4ae942f4119a734e853a116637c9558d335229fa020c1e261243e6521d00688daf5ecf3233a1a1a349ada9563c01ec33b427238e9c7b9f1180c55ac33d994ef656d9a1d3754e0dc45c7253e95228cbbe51e56616bfbb1e8f4b48cf242046b56d003370ce304b30f2858980f301c01508a17181a59d1ad6c4dad5c62e7684319058c35dc7cfe4ac084f9c8e6b6ffcbbbd4582300de2adf61194f513720c4b371f0e9ae1e6535d216e595802b79d19b8d0474e455787a1ef4bb0d29de08a0bb86afb0f799d58874dbeda0f046817d1e1ebd9f587f6853c3666dbdb8253c8b01206f112fae0a1f08d9c435c2126ed70a2d047d2538e4d12104cea939b42944402788902e53a092b62ee8b3087c61076268825d8a5da40e55dedde385b91b9b0997031c30384c702aff3023cdecb9f95d5cc62923119aa7d55e0dc8edb06d0407aa6fd1f01492cde0622bf2f23352192a55f1e2cffcfaecae7ea8042c4e0ee4fb2cab3cc048753326335693dcb358bf2b1e5161e365c12081fb1267a3704374332f855c41f11aa457790d62a319c328b121c86b0e8c2060f2aba6bc1a48bc5e501c90e7f6a0570a8b1f74e5cc3ab8077d55c7963649440d15775c7c0e70f0759daae40eb5c9dcec2c90a3f9a7c1cf24e3d6921f80c5af6c3af7f4b680c9211c65ca7289ea66b3863972d32f371239fead3e34a3d6a9ad8f7d22bab9c268e72325f99f6fde3f45100e4146cf9cbff53af26972dc39ca8086f70d2967c0fb3bdf31259564abf7bbd2e7146e312bc686b53d83d5c60faac32d38ed7fedd9409a86615af8b8045ced6616ff95ddf4151903180ac767f8e624d6a2d7d863ed437528659ebbd3cd7cf775aca4474498a99c2d7473a1801f87542d699820e33e2e42b49d8cb2892fe1d95541124a2132d6211a6fa1579dce56cbb4221ddcab1899533ec6e0b9afb9face6a8b7f0a39b836efa92b9c53eef2c30dd9b3501ceac449fada7e6ae72975650ea4e771e5c789fd3eb7edc08184f70aaf6c21bbfe4923db21a961ae847073ae2acdd701e5898b6c19da52b15986cd1aa5e30374d164a5338115ca4d63510bb71cd42c602ad21aede1473ccf7ea0586a79cfe3a388867126bf63911cbc3d25d06aece51f62b198aa0ec40fa6aed1760a23953e06ba6b4a0bd9837a83112efb516dcffa22f94e9685f23b32729b1d3595251dc2f0e5c4ce46c0c14a922180db1088615348968c1f4c945f03d485803a541320dac2cd5f93eaa6498ed6ec06ec550116145b630b378bcc6580049dadf9adc744b3f1c7d38cc61a6ca62a506d9b2ab1b8f446e46aae776f23dfdcc35fc6e3aaf5e915fa72db77c3461b3cc6b31f031ccd170af2b71090204247f48fc314c4bcc892228210fc457ef63bfb18e381c2ea5c93324374c5e971fa3d58b85f333ebc2e21d38a0bf30bfb8ce8b00b3e77ff868cfaf5f1208dec01e99146a8df1a7fb79dd753e302f639945b908d864789e79697d6f120c18d599276c552501197fee117a845baadb68a801a87eef5aa57430152ab195d2e29fb2e9c024ade53e1c9146e4bf798c7f4acd466a55bfd74b5f0300df1bd12c422ad2da181ff0dd6c5635d4f583511454fbf9e969905f94768e02902e2dc103dc6f0cc0ba2c1bf1b934bea28f681ff84279036403bc00d4c4313f4283aa5a2f18024c3c98371c9bfe770272e06e5b945e984adcbe3b68dd647342b029d5db50b1b9e233a1e8c4fc06e02df46447b308bc2af01af55e08380b78a38a1b80f2a0ef38507577fec4a4e476fc76d9a1a3428d9ff648d64e7f807a63e466b82835bc0190fca1a18b44ea3caa1958a18870abf9d728b446ce4d225059061064e46987feec205a712f5739d6261a2aef218bc3ff1eb46b1020fb44f658ba1f70cb79d676369a23f4236149da379abcb50b326df0559ec371fefcdf95ba18d4a5544a4f804ace96ba4e23acc772ffba0d24c47539ab9fee0bf7a15f7a4beb160b55491be602f4dbeccaf802fd346aea76abe0466e08141ecf1bbbeca28677d66d79ef8cbbd70bbb7f71832c08d361c4989820687caa8a97ad538df9d960a2ebed08b62e0aed5c840deb53223fd66d5ad20946be41cd45c48a9347d6f131b175a1c696a3802b360a320acba7fcf034ee2dbf15478862be58a3232133d0b6686145d7091f19ece7441ba06bdccb9fe3de83d88264b237f7c9c6021f9153db41266afd033eaa83f76ef5dddb54ba52441082a492562b6e328ba2ecd1172d975741048e95dc3e1f9f7a681117be12b82bd6a9790117efac2c6444054392bdd339a37404923d28bce2ab15bfd41c2744235c60cc83d306bde5cbcb589540231b73bee04f2e5bb93498fcd8de9e2b4f42830dc849b6df526cb5f94c5e26bdf3d8d03d1a12a280f10e9651e2109e8062fd8743398340461015684e94c75d932a7d94eeabe1f9f3d77ec668b232fa3499a1e604df1a850589681cf87c8f90c8ff8c032374481c526f30432be67b96017994a60b44e4ad558632f78d1e89097787580c1637c0cecc5b89bd1f922c98609845bc157f04a6dacc53fdc4419b36deaa8cd126a966553280a33b0ffb0ed66b32e10fac268eef47d3b8520b3a75431e45a8801e5cbbfcac35d16867be1a1a6ec727884b05717236abe09a916049bdfac3f5fa2229b3ed537d4d1a48bc179e2b3d39b3cd104baf288880cb1e873a1199259db9f0a73855993f01feb0e354f2cb88fbb45c69b982908969de5207354d0559feb291e530abbe4d4390097eea3d931428fe9e52bf1c0800794d40596a4042b2b123d9be4ba1888e9301e7be8ff1f4729e19a9136cf2268e1d4792a5e3fc263c494486f01928273a8189cdcdfbf44a38efe60deaa67b87cef04b9df77a04c0b818d181ba2dde831446190037f5a80e03bb478ac10469429dbc8b495b206b774119b17e7292282c2fd0690c07b57da07b1e61f2e27c7a30781dd3ea952416097edfeddb9e40fd8874d72e9510d374b691c811c6eec989300642aac8665e243ba16dcc3c7e5f34b783360505e003f88ae4f6f7cca3c335ca783ca7eb70182a3db873830cf23c21f1a51f8f29e99a5f9b9279a1264bd43a10ef5f62420e6a6421e154d9c04603b07d895d2476fe4a074989008129f909dd2fcca0f344052e80baac0571c5a6f4b803e0266e230154062e8dabaf931c0d618c96229d58ee00b686a1760762b1ddd7c5e0d26b8eb9a096bb37d0b6e8af9a14e8c370d0fe5cd9e71ccb32bf77a0114d9f9eeb5247a3570d7679d5504a6496c31b1b07abd68b5290edd6ead888dc0dab0e9a28b393a7e723dc0c87f8715b7062040d16d56bebcd0c35c601d2258a8e248ba13629d114e6341204f433cc0222dae2f7a813026c69d42e3ab94bde41bc74a03bacfd0d8c69d5ac47bbbc05a016ebbf30aa8ad2ad49fc9e8b5e1c3e76da577bf5b4a85b693f8cc3975182f092c21ce51d92586f9112e77a9721642141cebc305444c28265b0343d0367fef03895211ac0bc5777133a03e5189516d274aa9b60939b47afc75aa0127859ca7a75cdcdccf04d4421121ec41fc0048800f22e2c26950cf37777d69fe639adf45195b7bfa13d78048e9f951f96a2f37881cf6f497318f26bc3549386d5362daca6421f35fa46ec6f7139843bbbe07c8d334c779464e76f70ed75818e57ebb8e8ca2710b434a367f2481e4b3476bf5bb5cad016e2b5089f897c6b24d093b45b7bb8439988e1d1e4008dfe2d6de40b0b059794d87322e25b0827f7cb1e420bf0e8f7c5773cc2deced0ca4d12c02e3b54c73f6308994b400cae2e06c0b29f3ccc1ac00550437793dcfdd3751302d767e1c9ada61a9b2abfc1998f0779790234dbf39d0fc5d9b2f00d94ca0058412dafd65d1a3c6fdd9fe0f9468eb8312f78221ab3894c5e2f2cb8a2b4b0f4ae44aaf6da1f2573702cbd93d04264b9f2c80ebef1eec6f0f9add079fc68bb74e0c897280efdd1f941dc0670c62e53fd1856982889ed6d4774fe17f161ca25b1516215c1fe564a2bf8d994496bae4e7d07f3817ef2cc702ef51cfcfe94a6da5bd9df345b1010659ed14085a1894e56889a378f9fd2b0fb918b8039ff9cadca37df66abf010922e003db28657ce42530b0f6a9acad08a58967a91b91d3c13d34d90160beeaf5808a4541d74fb68af8899795fac006c0bf6caf99809cef60b2e2b96bdf52c063bc2da2328be2c816366e36fdd0e69d5113ac32eb61b74c0f107f98b66901b1e98f1ec8bb95a719a7177ea4128a73e099a572574fa7a06da9a1788265d9a0b1c4cb9eb25cbd3bc07eab9095081bf60e0c8b2af02da6eb143622d4a35d51661795ad711baa0d584b833421b691ad4b5c8bf1d52987f00c2307e69aafec3c50855e28e0d98356ba65ef29c2b9f0388a4f4731b1851ce7aa6970b6a31473001fd83577e640f9afefc34ccb56208e1a6c941c26a73b9e6926a5cf3c8cc8397c6a52a4db8a8ebf0eb59ff5ecd8326eb49f878e6b45b98c6e21ffe92f486091b438adb81b7d3490d296f18392261bcf38e6440e568ca9755f2ffb02a445c25277deaa8ebabb0ce94ce277410d52a4a77e90ce9b3d84a52868adc618eb9bb7d86e9b937c4e604bdb27d1c6fd18df7307661d4a24eda7c13191fef8613350caac7c601b36ce94280edfc172e11aa13726452b93af0e61e144ce76e981a54ff7ea1d7cd9b74f0e00342133b4ca51e8dddc2c0f5b0f4544d3b531fb497b6a9db5bcbef72133404e378d8134ebade8bdb97d5656afdd96905458585c35ee6034d8a7aaeb3d56511a05d6369941037f38d3efff73d9c699e4827f3b2af344e0d99b69f449a0174cfa1067d73c84232aa3c6c9caca7f5a0303ea2782128e59e551b2aac082465d2c884b3e466b1c8e7f512415e6c9fae2b415a8b71d04dbabe0ef6ea26bd4103f8c70f62e005b61e5ab08c5c00458a7539cc5b2e151e85a6d6a1705976766e1081930a183fcc5b5e023ce008ea2fbf5e3a415e8b3c6da66d7122fe2348e882587c4bcd91c5472789a17b7cf7deccb34f181e101aff491dc40fa482b54e573dcf1ccfe0b49942a46f025d5b6d6f63abe3a76f03ebbc52bb79f9f4c9ae2277c2a6088460034719181f9da5cec9a6e39d3c6f34e972d810f5817dd06efa06b9ac59d54525197c25956a3925f3c682b18988def47ccecd9ab42c9bdbe66c24c98452a6208bc79df15f609fb4f3538898f009121d8ea691afbdad310f1f0c64a40e765ec361c2a4cca3efb6c0c18ed5a35154d9e1ab35811f456f5924d1ea9674ff73f88155293557192ab57bef326af23c75fa0a95c2850821df076210593c84745a9d26213e3561c5bdfef1d3f81fc88102d45fffd45da83bbd58bd83f4fd15a3c6f636ec44d1e38e969635e761135978b75b3c73f3804cd6781bc7300616a61b194122e2e431785a449bfbff5d1b4010b880713498b223d0b6653b386d2157e65df65160a109f140403da4c64d822fb67a4d22c652b8c9ddaf0ddb6e4383191e637715602ac0ededabd8cc54b52a7899d4809d7b64bcde9350b185560b660c580ac95875d1777e40b686611be9e722bf3c72ed233678f840f50784d2d58d6f2a11ee5666f5f3c508411ec8e7ed43fb0ec4426d3738efe28c9a9be4edd33b356c7199ea89dd071f30cc0a6c6e6ca5e8e4354cca6e39a6f535ffe1658955d03b60ac986a617608ab2f72b606aff3ed7afcc9f6d52154df0dbd2ca290aaa3978e8aa6785537c316602cee268c140ed569db203edfa153197bc92e662cbff2b30f3261f05171759ab9e09484187b9132eb743dc135223314a8e1bac358908790c4ffba8029e2095ea544c81c42577cff6a984e2e6a1d5a9e0b8362ce2539ce0af423e4e43ed15516c4ad6016e140f42dfcc8bfa040c4224109bd625cd6c118cf104560b4edb0d11ddc702a060e435d7f93bc8bb9b165d3d6ce955f0914cb734802b7f20345ce2faa1bd545a46d738527f7fb9f4ef73f690c6dcc5090173b828141f93d44c82b14b48153a8f3c7941c3d44d5b6d89e19b40c7b59cbb34b1376e24c460b75e5f5c4a34b34a1574174a690c063a0ac76000c42a4fdc02247cad9ec1968dbad6e37cad100af57a271039796164c0547bc0ba7e966289dbf7fe2d962a5b2b694ab9c493cb04ee6e423ede9e964dbfde002ac42c3aae38553a9d7f60d9d0fd5331f1854de4780c1fc8a2c5cdc1ace9c6a2d3719450422cdbe2a454e72e01b46d996c5005cc23bc1e48eee825561d4d6526c046a1576658d2cc7f4dedecc7470ec68533263a2a27b4ce23d99e677547fefa911b9f1e5f472ef73b0008bb3392d25842bf69bd76e845e1ede58279678943a18383fff4f93f2ffffd1e8848df4a162f76e1d5e6a74897330b44c0eb7dc73bf68c30177e81055cef070b90b02010451613e06739f1256bd694eef5b38cabf564c1874939205603ef57088501127ba5966dcd7b6ea9f3a321045ac1bae72a1fc8c6f7403e9c67175cd52abe673755b95d6cdd0df6e070f2fbb5937b5ba720a89e0a1d364ba37f9538334a75ba33b4805289f4c2c9a27a6b5517d04ea4706e75daa4ad8ab468a0fa31f3b56f16cd1527f10c07303b5f4f03ccb8021ad826524858bdb9d069f5572efbe8b87fa9595493e0944950f359b0554c8af84c810cfa2a4dabea1bb9cbba627423de5706d7489739c32b733e9df0bce58732aeac44014d9df0247f22400e948e268092740f2329e0a17569ad04b72cf7b64f900b2af55120f905fd12e5706df170d01b1594973646dde31c6372dfa30ac663bf615c91b4b6cf312a3d06b42409215e717fa5f02f489701ba622b2b5336542d0b5ddc6815b78304ecfe960a0d8413efef75182255d2d3355c2b2e89ae9cb021419970836a29ac8259152650f338f88fac10d19587925387aa3c5465d011e6d938b14d2439b603897e39c65c1853a27bf23f09494ae645d6e9ac92bd1d100902e71f47312ef0ec263cff0b4fa3f8465e3859e9cdf98f4674f37fb53d09cc4009506b4dbdc165322ff92eda8b8e060f09eaf10a5d39d4420aa23baf870009e966050fcca80b10732262bdcf19549fa318bb376af8d84cd2a723b7e5e91bfaeda957556690bae0b6c03365dfa8ef50b26459850887a73233860a620b834978f2c8bf4c6bdf81601af1279cb3fb9bc84251662f96d49b7de0558254e4f61c1de853cc85832c020728136a95a2f24e8f84478e3baf0e4bc57fcc0c2c48b51fc548cb16d0d9cb6551ba19cd3f7fa9e321cb0fb1616ac424fc61352b1ed9dd6196d59be402697bb45d10b50e388bcc7f2f8bf6d1654c648bfb8fb09b4b88d34f6fd8a4792fb3534af3237a7b120bc188a7e4bf9baf406d40b82e4078083ef1a69fda8816de053d1d8bf2a6612f0c52912a48eea7e702f5349c2648e5bb53dc8f2c4d09363b418f2e682ccb14a40cc91a27a03729e2e4a9a1fa4d0cf51615a02dff1f36dc43e3d2381303f414d81ceba37dc6427e60c0db7ffd8675661e90c258c96b941fb8b8a1f9707c42e64b3f4ff1a52401b04800751044bb2fa7ef9b0f996479e78c24867f810419b6441a65bb26bb0dae7bef52e68d1a875ed4de9683dde9414af7228005af6572f780081a7e6be51c9e96163063b71d52297d4eb5c68dcef68308cc0bcf3ad7c15f78d531ab47d252683975fd7ee28bfcea3870a1ee4263d463975f5940886a560701b47612980a0a4c20ec33a4de85a17f2392f97e8a17ea6106938429156802ed8a8ac7a38899017be862e06a7d9e34c2eab09232cda000da798a4eb40b1479056c4dfccdc60aeb10093e97c602cbf349a98811282242e0d6625ad86ac6818cd98b90890a9e18527152e924ee394accdc323b35d2430218cc526d6e106bc2a345d5be1798877a56727a65cf6545f11398102eadd021ecc32a4542e16afa45b4e4209181bab0495df0f299fcc4e80aa92927622b7c39f1ddf70ef6305b9f82ab41f6be1f4e6117300bf90c6ab68c92135603ae3241425eeaf0fed4cad748be5881c14506520a25060a45720d5e525190155fcc6960225e00bd8fb6ad609d7dfcbb5399ee06083dee75a50bec02834b3c0aa1f04d7169177198c97f78465c1b230ca16b569d82a3e879f6ef66ba1e22ca78b7fd083d951f2c3f082ca2af591548f2b4bccc7717612d93b20285b98868141f2cdb293833a81f2bfa6dff4491b8fa1097b0e35b877a87a9c4f7a556d304075b30926469374db8e1c7a947fd60f8b32c535946d4ccc70ca8a84d51d9fd442ede63238c679316930683335c34d45a9b09677855b2fac7eeb40c10f656dedb37ee1287b6f4569241c488c5627a3719d55b532ccdbf649e370c2b6d3d8fa634ad3f3488659ecb825710058dc39aac59c6a32f437f7f2eecaa2e00c496ba8b3c8e42c6e5a4cc1a537d91cff5041d8ef565fbabd69b15c2c5cc7e1cf81e68f7e77d07171cc82b96a180106c7a4c9ec0fc6270f404189453ededfa3a8e3117797f04f0322ac7ea618e1ef726a92a7d2ab62a5fa69a6b951e82926e8f2d4474544a9a44468ce74c538f45fcc4465d8807ffc568106b5abe99934b9e7cce594e27bb31a013c484cc22746428829975354e2f168389c67325329ac09626b379a781c5281007a4c77372fddd47c51f6ef25a1a1a6db53c0a393a78b8a8d2abc275a71015d8b1acc750c37d576593659b277ffd24f7c4c3b0435e79bef8c15ec6634e445541393c6c0e286e68016015ea2e5751a417e35187dbc78062e904435bbe0aa092e756e0fe0a9b7912335fdb8d4f8321acd14f4cb85786821b1744c56dc1b44daed8a908b2dc1453063385e9633924638dbf1e7ca3f579376e60bbc3b787e84752b8927a29f02ffe3c7641e398bb97c661a6662ae31a74516c5b2c92f8587cbb16320787f3f6e00100a9f826c3387238573a070770f2471ac39229bc6134b2205072bbb0ccc7c297adea35ea1b4d141387695899b7c8dfdc315348021829240b03c60ae8715b8831f3a6da6da430de968dd910aeee198431b97f24cf90334274bea49318ffe7e74d7d724a520f7d9af1144b87a71291ce5578bb368b7e20c1e064ec336fd2b2a590b1151e992c9004050151fb17106ad7ca8d6c9396b78eb8678043abe863a2f7c727201829525d2955045ed4db50ed707aae60d348446bac3910fe51bdc866d103d6bdba0d72d52249fc9e567fcea9187393f75e8dffed4409a9647c41a9142f0fa474c0dfdd6376f88b1f0183bce279d7c67fa01f8e4b7ea406baeb1615b221e86670910d10fcad46f3504b1bfab84a0bcc09dc93d1c9c9ef4756191ed2117ba9a91b1d92ae1e1ba70be3f0713aebf51dbe4218fd3b322bb5eaf93095041ec1fd26c0ece47efb64e5e986c276ac6d1cbd51d92bf6f3a39b4fe916dab9acad8c324c58224c50981351ef46204e80f6def5325942fe8298037132aaa345b87c7e6f25bee5399718c7069ed63e3e1dbf9c6602b22027234ba797bdc93f235dbe207b6dd1e0a184ccc3851bd07b35fc916085b6e500996460e0024eaa3c776f8be362b15859dc96d8ca9c2e822ef58922a3b5a669f49d33863ece12b713ed44da56bd9ec0934c679646faffb3311c8a47a87ee89a3af56861d76af16c9b22ea59712262e5f4681a43081cb40b35ab1ef06cd4d185433fdf509587b50110410e1d42301e0edaae9457cdae57c66560efd1340629f9af035bf7a7df5396e55ed6208b123739e990e95078876111bdd2ebc501adce59d2b12bbc39040121d8f2eafe62994c936541185872a68497ccf389ecdd63d82a39e90469f6eb96204462b75c372b290ee5632598f51ef80bdd2d3693155ce7367b04b758999d7a122baa16a83ee3b54d1f377ba0d6954d03301ac74e1126459b46d11b24994344e5e4937d4468285f29efdecc10c2c73b4f35844ff3055c791a2103b55e8d3a3835b592094f09036ec0f02e0006bafb6e35f35dc134fabd5428cc3600310202fc28834cbbf61f049cf0aa16c59557862713e12ea5621b7cb568756778cace1403abb204573ff855d82eb9aeb1b82fb3aea3e51ce43d7d75a9034d30aaadf2600cc90aa4d80cf3250b239fb6fa5683d25ca18a218eae67bd31cd193470e7c8f097f4e149a51322108694b64d717e6729b0e6d5ee67cbd2edea847b86a31cb09ff202a90b67f6dffaa7d1d5c11d80045df5aa0a73a89cb0b7b153a8ef4a6074752e1997b942c9c8c8d5e41a63eb22b537954b442f342746fa2e59812be774e29656e5fedac8d5198fde7bc228196fe48a8419b6395c91b311bcb003daa6e68459309a59a5034983c0ff835e5bc0e5e1cc4dae5374b7d82dc05fc33c3bb0027d667643d82e597c880b7f356f945d5adffa5803b000c48e3f248939b1d4bd15628032842a373dd27b812fd854f18843eebde5de5b4a29a54c490694081808d207b8bbeb9ed591581b8127c31f23e80c20c39f221ce52864933fc31f2314652cbabcfdf972da2beb77c68023794a07c09cf1f0afcef2c3f3a72f7bc0c07704e61ceedde74f81f80ba11d0bfd491bb6c4e8e3f7abdc744f4e16f9f459e47b9945c2171e98e46a953cfc9bc53eac2f59ec7b5966d879dde765d8241e2ca4df7758c068e1e7efee2b79f3f81c61145813302835370c71c3cd0d3637d8c81c21839241c9a4925ca26bc51d729b6b85db5c2222222b8676b082688726b296b0766c8ecd49a25235c1d3844a8542f9104338aa9534acc1a09b6ab5ac6ad9ead3b909c579e0aa66e23c68264dbcc97593b76d9a0446a56a82a709950bacce103864edd81c6b498d4e1e40864ebe60844c79a899ba94ef3f70c8dab139d612d6126b899593465a6b1255e0010ba44044122c1805dd200548f8013ae205339043b8911d7e5e76182740d97f9c48f1e3a4e74e1938ca6f7c0847f58d0b864c2673caa4647072bf9441c91c21939249e5cc59e7ac937ef48f1dec1af39bf38fed980fd9bf391beef5b44182211783820d61433fcd247f43a68dbc0175c3cd0d36370c7103ea06144905243160c720ccb7929d5c95a4725562936b4fb62f331f2e59da97f6621863bd7d9bedb055faf0cc039106c8afb3d4b1ccee8797c3bd683b1df69758977559336ef0e73af17bd78131f5e37b0c608cf5427c498e8f591c0f5b9e15887df952888049b63f2b0f9d43901e3acf4e07f7fcc63df8d88d7d5d6adf91194660f9b28340344ad15a072a65120ef0c772bd7d96abfbe165fb30cbf82431584c6018490578ce3967942fbf90db0718e3d70718d3b9df06172416f1e1874b249e9ac65dbceb194960f9b387b47e0a9114e0fa1f348250e464ff207e8233b483098a39e27fcf421ffe407193df4d4fe3c7e7a8bec3c8e8d951e6a0bbd0165b84639f6c57a99ae0814db44ae593c221254ce1c0f103f895b35e5a6e7ecf29276c226b244b3881b4155d037eed60d7b03fb91ecab3dba1ade81af3ebcbc935516d221e6aae1da5332a7bc02ca19d3d7812a56d642be99bbe714232620303c98820be1bd9fb09252001e7439f0fb9238e7f038945740dd8357c28161171228e51c41972f7a0e04f060e4174f09721df87dc0423ceb501fefec780bfff219f253084fed8e7907be8f02507619610810a0934606c1491dd44cb40934a09244ddcae28c16756d23230cbef9b5c031c5f01d9210c22b0ffa06bb4410533f10738451850453346e40b963063dd867e0bc58d106e668cc42842ccd4298486683263440eb18599da41b7e1c80ce6d7daa002d8b144a0be65abad6f75f68dc82094702ce577d813787632dc6bb7e12b590e7325ee07f884123c4a668cc423cc89cb6eec091ca3806377c1b0933f4b030a3130c9fe77257bffa402c682fbe6ec9c9408423f48520522e4942d780290adb53e410114706830655a1c8b0e360121781234633b1b5da280a5c5eda08f6110be54fc6520d3e6e44f6e4829f74f2350418a991fac37e2499c20c10c13f18fcc60cd0d29e5f9328753161daced58acc55939a2956f7170661ac931fe57c2a280e7d36c871c52caf167db6c6336640222767ae71631041bd8060e1b18f7af7c0bcc91e404f60863609017050e7cb2ff0a908c96466225c39f238af0c44e864219fef408656c9bf02d0eb0fb86ac64fb99ed3ecf5eae2f87e44a2457cb83917c795c1c0f9defabdc247f3e0c89084c12ea25ee327f09a400863f3d3ed925c39f9e548fedbbfb70e4fee892bb2dee3a6b47f202eea694d2162d68f7376985b3d165fe5502cc52bf8182686866586a17a455d1657e6b9ffdfceb8a1d3421a443832b860086233610c109a4284145124cb0a28756bb6f25d38f218dc0242f603a9f6361f1db77961c0b8b978f1fa33f5bdc84b5f8f934b0169c673b5a3cd63e88f2f5d5c76c8ffaf18b7856e962115d03fb1cb1997cbd244f0fe3800fdced8059bb9fe59c78ea26ee327ffaece4f9ad2a01fe5c0514427084105a20018e0f666820f181179078a204152c9899fff3bdf9180ef0f7593b21e374e4e0de7c1840e0f9412640a4880486e8b0830532e0265a6b87f1bc97f7f871bdf53d2eacfbeaf760fd11ff8bf3af9deda8a414fe3e4f37d5cf81551ab593dfe2d918da9c85921e9b9ced062db4d65a6bad7debf431c638b14f80106666b4d6b21d2e65cbda203be4c0814511387e5f9d34027fd67eb42b22b38c5bc4b81f1a0b2bc802d08c118cc7044f9861423ef6524422e47823e6f825d4000a2756900229392062c60333a0c2d0124a8a5257ccc47f4f2a81c51f0c7fae98923f4f9de0881c1f66ffc1920c9fc8f0c789a2fc83a31c93e1cf0f9a6427729c48b1fcc8fe4256b80e025545cf4c8e23e15e8e7bf1bbf3173ef86b544a89955fe988b84b7ca30ddcc81f0e59c8fcec9b9bffe190b39f5df62421b07dac663dfab7af7e021873e347c098adeb1bf8d248c0da37118c51f9d8aae812adff68c89285c530be4a07e10b8ad42a8bd690bbfb2cf65bf7e19c23d290bf467da4fc7550d0901bf9120122e8573818051060403303b31b1bd538eec5c76ee4fe2ce58a04118191047f4384c8b72f1fb35e4a529e1fbf953cbb1e7223db95ae51321389273913618e0f135de2fff820287f1de4032015200c7f9c58e5af5126f8e384909b560dc54f70a6543232b2339240a1508d6a14910b134f18420c1de6095400ca3ae86b544efc46c5ef94f7e00de0409b00bec42a2511f0257eff88b56b22a017df336d147c892c3e62500f15c5efa05e29b102dd85033b64d742eec5200f023b13165e4a61da7f0f65b60f5f5acff219cb7d983116893b8c613769efbf42056ead83f16c0ce1c9bfb81b36dcf370e992f21e2ed9f770a987dac050028eaf1561960d707b160f6e0b134f4080f063530220440103d48c0192482289257850822e24090186992c7c187124f35c421270d37e1a604af1576a704d8c314697104228637413b44d6c524a0ebec0b7d6da1823e904b8df5a021fe17e184248689f33462b4cf1185978748e3cf4183a368ea5528c72ce18ad3045c6185530292a5d7dcbc9eeaff2e76c29bf62521ec1e9d953cad9d1dda74f29a78c81f7edfd7ec33d699aee36a4856f238c7b6d6310eecfe1306480fd3b27e56e93a77c7984fba5306167eff60527ca5f112f32f38541f819c9b4fb8e4cabf3d5d9b7b8f9988da86f5acbc14c230eb5d6d2afb5da4aa19521c37a4b96ddf40106a10ca491760d991965d780dd7c3a390bbe480b5ffc0945ae11ee95303efc1602670882c456dc246fa91d7e32220f890859c0a4b51697de638c30b48063b4534697682dc658e27c24bb436ff8229ff404f64426396a9f8d132cd2011c373608c464fb243fb3754c68ee9af65cadb5d65a3fe3646012df62dd67f1d57db8f4cda426d3f49423ce795cd57ddec4a5f4dd01c6f37ce52b5f39cfaa7bdc6547ed4854e0f9d49b583caa5211fe9ca70ae91f029329b64fdf79fc646110619867e72af722a57376d0a23faeaf8f75bc95fb8a741602dd132267679da748e7e94ddc731ef7627b16b07abb29eda8f5266e82de24f67c5a2fcbea58ac1732bfdfba3a1ff3fbeb1f71293b9ef0388f9bec4797e25e133ff991bbc4bf0103e379ff3cd18da6c09fdbe4f896497ff7801915a1a77c07c6edfb289eb6ce8d8e722cf551ecefa2c9f5b79428f1db0873588a25eb461d900074e9278a925b4afc58fa12b6273933a4c88d78f22cf817728c40e418479023eddc08bec427f9606994e3872393eb3256104208e10730d8f2d1a13c1fab75289e684f74a14f2dc69fd16e88c5bd2a7f91de05e9bab83f404479e5498f95e453f9148312b07f77f2fdebfeb5f2978acaafd86f298a50e5feed9fe86448840c7fa608ca18777b860ddeb2f6dd6d1803b1968ee3be95a7618619585a48a4d75ee545c9058c2f95de05f7c128bde03ab3644054544a1ccc2a2e545c904824920b181910d2bba801e6f0183060746ef1c2850bcffa8d4ac6c3332ca93cfd193658e5b58e8587ce2adf83cc2bcfc39657feba7ec56bdcabcf2203b2f2a4ae87ce2adf22e3a1d2ad7402b80d63ea8c10e0cf5101b8b4a754c2b862f555fc9342b9d6674203914f85dc1457120a8cc97ec8a7dfa287ce2dbaafc5abbc7ce2a6ef7aeb7e7d09e4269cfde82252d936c0fefdccc7f5f729267762dda93bb9fe9d7183b5771d3709b97e05c6b8f8fabe0218f382f4f5b18b2bfd0b8e872dff8b27715fe945e782eb9c654056fe5af9eb31bf2f38985d7cd73beac7ca5f9fc3492bdcc5f5d09954fffa54b0178c00d7bf643c3097db30a67ba87c91cea4ce6ddc53e9be955fd1b219404894104fa938aa2685b2be0a59c954fe663e56540a701bc6f010e237eed52fd2d96ddc9b01449c2102fc794daef55d0709377ddb5b5f856cdf5fff663fecd641f7ba73db304ead892edb35642ac347eaa1e82618739f769fd502a62f698c6aadf5b60507330b0e739f4592eb6bb6c64df1ebd7f72a914097fa42e4fa9f352257b982fa979335f0a5765887c435adce9118824372480e612cf4eb7fd846eeb79171add5dab75dfda12f32ca32471a1a949d73540c108d9e9d489964bff044e309c3b701add14e3c7591bbf85bb798a66493fd7786f2673310f9b3b93bbf090277864fb440c76fb2bf6cd2d324fbcb5494a9e8393c871f410e4960071d4842c0fd9853eb1807b821ec702e741b1a887b12b3745337907bed93029c919ee09a4a7da7b880fb71dc9bdd2763d8ef54a38cc04732ecdc2937e1ccbfd90e8b511c99dac8940695712dd740eecd7e3225cfbfba0f06c66b9f6f1f54fbf8fc29f007897ca08f053230844891d6c1bdf93708eba023889bece3e0a6f9ff0d8510aa6826b48f8f6603238e30e208a7d9115f68fafb9470e0d932ad85597c306624811f9b5dd3a854aa5229c618638c73555ad9d50a8662506484130387e687956c9ab66923a0cbfcc9442e658d035fe66331704e805737f37b157f5abccaad8ad666b25174d21d6612f29c4f63dac8b33429bdb680b9dcb99da685134c8272c06107f72613f29c5cc81302d0656634587e9c1f3ccaf3bb867ea3e0cc8451b02028fbf083eb781f1df4e7c7532399f36df7e1d935f0657a26f9607f1d60f3bb22eecd0ce3dea401432346aa3e0d162293889b60101bc486a0a00a694783e44323d7c009940c7d9e7892bfee69a32c612c90f4acc5f8a1cb4e877b41702c954a18bbbbbb774de39efc9e9e9e784202244450af7ec062982008e6201d82f4581d38f440d95d9078c23a104017f917126b0911d44918f4037c918fc530418c2230fc8122274bf9dd13adc5b854b216631fdc04a1e83822a59473b640f2e353943d3af42a8411f6f8ec45dad9702f76777737a7c32507103d3d60d64102f127e0447c7093c3dc201c2442870e1d26b6783f0d4ab016b0ee013394d90e786184df910657be4b9d1f201065f85045ba8dd6a36fb2d67770c76a40df765fcffad64bfcc38a1c42244bfb567bb6c372dd909b69d783fcf1812a96a82227cf4e48bfc30cd1444147b88123878e951dda0aa21c507171490c413d18f46f6904c6c2090b1fa9612c9e688149f9f22117640f965f0221299002183a094394fc193a0183915f316f7fb9aff3779fc54bab3ecddebeb4f6b5da7d6f653fae6c1f8394fe0e5a722fca78b892e3e36c078d399c5a306ba8fbf54d9ed8bdf8b667938c653bbcd301bebaef880f2aadf5d5028265ab6b255d63bee566c0003b36b31d963bed6c7d905449d798f3ad6cc7f4dfba0201dd641df31bad975db31ff56ba553fa7dd4318c610c572861f35d1fd2b7de5f6658ed6c87734a5c9d913bc384fd99f1b04fb37d961f93be7d98596ffecc533281c1efc8908b615c7dfa574a5213d8637f31920e70fc1ddf4a8610c2c4b73cdbd13c483ac0b29bfb8edc6caddb6fc8cdd8c4d703b9d9fec3bf388b63a1dd8f996df7dd442ee4a66ce550608cf6313b13e2b7c81a703fcb3a164dcb7e3ecc7cdcd7baecb3ce469675379eb829be07b949480572d3cd7e74f6347bfa978359cb7cd4a7b7dea7f7312c3f92e4d3b0699fd15aef6faf691990ec6ff6976a57cbb68bddbfeff987e663cb34874bcf1f085c9b6183619e1863eff045fe8c1b3c3f07fef83adc2464c30163587c7c04c098161c0f1bfe8d457d5aefc6d16fc1b1e060deb64e48fdfada63d98fece95f998f7a9f76770a26195a21c39f20f864960b5ffa61feb21cf367c4bdee9e7ecc9de56317bbac7ba766ade5dad67d20c8b5a39c8c74caa87d46a4a6ddcf6e57ca178e589465e7b86568a1470aa14cffe995614bdc93d25253f525ee31712f0b01fe9cc7e3e3606dbc598fcff47a49b36c87bd9d418875ad15bbea55affa554707dd4589fbf76fc6c3b3fd2884fee4c901b5e45f16ad9e722fba50e7515d3c30a6730063b026d8f595cb80cc97f3a50c42ab66bb163836f61b0492141c4219f99bb925fb5c01019f0ddf4b8610a821c3c9a39281a6ebe12b009eb687a713741c4f1135bd211232fc0740d30df732fc1ef0942302b54c0e310839887b32473cf9105de2e7d0326d933ff8245f1f0cea0ee371cfd371cfa1402f3e8cb96d2c97e245d025be1f197dde3fb9fbb407ccf3e9b7b5ee4980a6fe58ed092760eb1e7bdf7744d40b2560aee33b57ecd1b733dfd181972aba4a95677f3d27908bccdcb77938267eea1b7789590e30a7aedad35d7a6cfa9642c9f4baae2be238373376afebbaea3b37b37b1b19b5b79134f2369a3ee432fb103f5ade4d222aba44afc917f07c55d74d224aebbca8b33823ab28dbe15186dc8bff22f7c3ccc78bec440e05e37c750586ee5d5ffff35544bdc8f0278a28f9baec552f7a5df3ba7ef2d5759beb13402ffec6b50aa04b7ce7608600ac01f4219e1a068d136114727c26e488839e418ef108f812ff6b2539fe15534030309faf3ca23ecee831a28adc04e4a6a09f2856cdd34d704e2d3e5e9c04b0f81696c5977029be6802fefae68ba83c5d765f29065da7c10a0c66872d2ded790d5fda31d90e63104c14dc0fa56df1684c2818e6a3e69b65dc7784879ab1cf48aed6464a6ba5f0dd87e81af0bb21cc11e7b45fdf4d6e331d6529840f2947833929849d9476a52bedacad0a4a57c09fccd039082d8b3e8457377b727d735df6b2f43f0e482b79c8590edf821042cbe2e69cd93b8a0486e3a9fb88e4eb21673db5d5a594524a29adce7644aa4b29a59452c618638c31cacf87fc21b98cc88f31464ae927b931431fc90ff34bd1a5911c99a11d12fa51be77d006f8f407080f000b705d4f3b080b00bf250767e88febb187cf1981ab9d2b90081155210626667e882fdddddddddddda5949fe4c68cec90c48e89ab63c13a3fe246ac5f20449c2253e6a0c309e680fc6edce86e2ca23989456b634962deb1fca0efdf83fe90a1c53984b188aee144df0468630c8358d0fdf0bbdb3b5ce7b8172f74e7227cab03bb889bfa8ffe83535ac208613784088c09025ffae3432e07f73ac75de23fc691e3d3f30448a857a41c60961f33c3871d94dd877bc87b7a2127bbb1316cb00e1b724f568b83ba19c2f12d8cb11a65cdf9d94f77f7cb9239b7a50922f56f0eb3b9444768f2e73a48708ee3a827e0f88d8a1f6f88b0ffec7a045700652e432757e8646ceb23d60afc6d1b8c81d9b351e3ed1ff2b1ef211feb8ef47711cfb63340d7989dbb12b00effe00f677777f9f5ddeb4358737d58b3f7d7de354e47bbdfc4a794621886752cf785603fff1ec995fb6eae9c75af5a7f245bdc909b6d8c14ca20f86499efdfceba37df7ea5fb73de7baf04ee7db98374227de0c4fea16797b5369632efd25a6b8c9f7d7ced7217f7f990afb7dc4723dbc7eebde863dc917c59f46d8e5861a61562c4b0bafb4a6c0fad255966cc6f100c05fe304c3c4997ff72c5faeeb7b8f8d6926cbdd5b1de5a6d594bb6978f5724a7c35de47d293f878ec9a2bd90eceb675f5f7bfa15c99876b1cb1dc91837e4e6f9d67cb97132c37c0e81411bd8467d0b843f592ad9958e6eb20668191b3972f647bff53dfaadce8a935203740de89e0554964ee01bee7527abdd668896e9dced287f3bffad6f1c2e37a080ffbb11ef508f94de97f067576a70bc1129fd1a238c8c4118e2d8050cdbf00d48514851f00df00d341eb894124229a1dca1adb5d65ad68765cf3d39bb16f7fc1b4223cfefee2b12e105af6a7dac7442a9ecd9413a993eeef56c082ddb5d296b7b14496315288d45b10a344671af7d42784d61ce498a82e7370e247020812305385238528003091c48d490a480bfdb1bc03008b1f60b60edb15df36eebcc874b868f456fb66b12df00cb99f5e8dc42dbb5e611733f8450a4d4587cfc903b2ac109931cff7b7c8edd9b1428a38ccae0f88d03ccd2931041cb678d64a6024a864e32fca12295319210704771cfe6eebac806f7aff2f7e1ee6eada9367eb243b1d6dca2afd6647f3b14bbc84d3377d7d6a80b98bbd70c61c680235976d08fc46e244610815304f611fb883d8683fb63bd9845bfdf4511f87bf92c194bd6fdf0aef75b2b56adee2b45ce93eef6bfd66fa9d7e7d280f818cbf5998ff8d8f557e7f5d0f9ea68c419670881e9c314dceffb7da11118ba57ad0b23cf5082e74322f0f799b2682c5af7c3b38ffd67dd6733a55d735e8596850cf7acebe97f8b07bd63716940ff758e05f3fa6fc782753fbc8c3dd67918d6c1209ccb1942602a7dd01ee5bcf5ed655d78310f6606f1a28bbf45858d3542ef4a9f1e6f20a10d83bbd5b3a7ad563da47bfe37cbb2cfb28b3320d9bdf8b3c759f775beddbdd7e7fa003d31b40a024206e18b676dd24c2426cda499341389cbb22ccbb2ac7befdf6b3d04722d2bfbfbd9edbeb6acce56e7e8f40a727f93e6e9252db84353868686a660d65a6badb52ceb2dcb6a1910cbda6b755f5b3bc54e699a2fa41ad53661b0accef3d503a5a7a7070a95524a29a5b5f6ad950f8158295b4ab98250601552a21021c1da4e28e7c4532d8a2e4d5ac606e5e4787cacce39e79c534a29e74320724e2bbbafe7b4316ddc884140d5e8001006beb467ca79c606708b649c6a912d02cc8d9ea020cfb6bb8542677fcf80cccebafcf9324ff76a851cdf8508b07f51d037737f4b3caa45988102fc7999c62d793828e8aaf606ee29d522dba75ae42e51062a007afd36289e1660839890a758e558e3b6773666a000d7a21c8f54a0fb0842352e82489224499224499224499224494d4d4d0d12244890204182040912244890d4d4d4d4d4d4f03cf1c9387bb416c70b5f2274cf964ab65bbe9671864cdfa1fce9d78be09df59805dc34dd84dc3fa14c43e91af2494fc02c3c6ceeee2b52737b2c3eec7b532e462fb74069190ed6903f03bec8b763c0f1274dd3b46cd9dee3dbd9a10c49257d18a9cf8081fb9473ce9f3d54b7a0dc514e5aad756137d3b69e2c33c6a285ca0ac9c58b128c182c3264988106eedae8f4b3d77ec30f75d8c14f0378984aa94a36e2843231aebac654ad5a66ebb118afb28d77e7c6e642218135b69e9cbf22c8f3b79ebaaaf32b143fd1a8e1fe00b8ab7373dca37197f9b8ef8e5db2923c1b007edb6af80d5bad56abade537ece8689bf11ba652a9545bf71b2624b471bf61a96ddbb6ff0de3e1d968f8ed3a3a3a3ada66f80dc3d964f8ed5aad56abed7dbba448d9587ebb542a956a8bf1db2524b4c1f8ed4a6ddb56faede2e1d95efc661d1d1d1d6defdb85b36da4dfacd56ab5da567eb3a448d9547eb3549b4ab5b5f8cd12ea1a536863f19b95da7252dbf6db66f16c76b55aada46c56ca867f7b226eb27efb21300653a954db07f129b4bd0f286385b6546a7be8a9cda6b6ecb7f81bcf76b41d6d47dbf697e5d9b67ab46d1667db6ac8766c00b834ab1a4280b796d5d16ab53acaf3b9195a87a9843015a6c2544279fe73d963298c074b61292c85f1e4f934d0706738c2708e8e8e309c3c7f061930192b29abd54a4a9e2f03cb15e3525d429b4aa512caf365c0b04a57eae2d9aed475a5b42bc593e7b3bcb02eaca30b67b38e2eebe8e8c2c9f36390ea8ab5b2a458abcb5aada4e4f93054680b4b6509592a4b65a92ca13cbfc4220478e6af3eb152168f95b25256cae2e1b6efd2b66ddda7a1502b29abd54a8a670ce3b0b75e6018a61252a95442793ec679c622173f73116d8ac7a66ccaa6e25b52c4b1aebac67c8c23e6eeced5b936b7e6d2c0977b535748e489539590e79386f0678fec919de22701bc8e9f6a0d00f84ff204e03fd9246b2f73dce4bdf6720550a64a69f94fb6206b2f918031335e7b49e3a7ba236d503b3235c54dff0528538180c27004633a287eaa3636443651a4acdcc4550165aa8e0e1284600c0daf7d54f9891615c59e22a0a2a0ac7de471938cd73eda00cad49a8883ac7d6402636678ed238e9f2810900ed092ac7d44b94986d73e0a01652811512c41d63edec01816233fd19d239a9d6813c54d252a4019eae36385221813e3899fa88d900d140d06145086eae844e103635eecf8691615312952692bafbdbb00cad01a8741d6de73608c8bd7de6bfc348180fc06c87134d26b9388680c53608cca909fe6ce4ed18e91f60da5930065a64fd7983e4bc8daf70ac6b078edbb899fa68dcf932c94b56f959bb6d7be730065a6f6cd0363f06bb2a8a8738a768ab46fadc60459fb2602cacc9a227e9240d165be56938134ed35006524516bda0f813171a76867686a1fc4e7fb4c91b5f70165a44fd7986f83e3b391351bed718031f5b5f7dc645ffb0290b52f2a693559ab01ca489d1618235f7babbdf60d65644dd798af69ff22dba1f564afaeaa940074750580aeae6ae8eaaaa59392e7cf700104debe56a09d5a2b509eafd2695cadf56bad2d68c864d05a44696531c39581522a83528a59b012a53bef93e76f312e18d486ea509b12b5a1365427cfd75e582b45b4a668a5282ba235797ee6c292808834a015a00c8828cfbf2ab5c5dcf1d9d9d9f1c9f33116749b363ab3fb4addb4d1c9f32f3c2f59346b3a59248b64d1acc9f32d20b0cc5f7d22818880808088723f6675f76935796a353b3e3b3b3bb172f1af8dd991b4d1d1c9f32b27df5a3455ce2c4a00ee0720f3e192b1976eea8ba3d9b9ace8e2289e3d01d6982f3da6a664523228c097accb86e00b0dbe110acdc66543198ea7acc85de66b3419e308250e4522cff5c8e2d4a37a548f2c0e0cbbe16c293f09208b425474b9a6c13551fc58144ff628ca9a96c1a6f451d151113645d6e48939e76fb92ccaad398aa76be32e535ae602016bcc9f39791ed9237b94e743187383802ff33f4c0c79fe7569e0cb7c173458feb7f5e089b79ead273f71d3970d552137d5203771d9909beacfcf88fce4f2f3b32899512605ab51154fd9508c422d83bbc6fc7969a2cb7c8ce38c42d6629ccaf33597c7b2083dface55e8510cd3d215f2a4ff6545795ef766f7b1cbc58f32d307c06935ee321fe3341a9a78ca86dc65beb5d7b37b04fe9470f9faf5351b3741ef08edd4e2b700b85eb9cb7c1a2e5cc95de65bee5b32a3980dc5d3ca976cecf0a5a9f1534c5d9a7b5331e6e479cabedb6543eecdcf86f2fcdbe21ca8c1d0bd6fa7e8c9500819fe48419483c09371a6d9dfecaff6377b4abfa6b2bff569f63446c99252877bf6c2a48c87ccb2c351ebb2db3d099ba1047f9d4780956021453a0bc1666081517af182b4b292f9b0326c6d33630478deecc79669c6fef6e53c77966533bbf34ecf11f3e4ac0cf7725fb79c646499a5edbe21305a28baf755b21d17877b41080105a1d9a8642e95653deb14cd0c00009314000028140c07c42291503026543549f614800b849644764e9b8983518ee3208610851032c6000200024300040866a60600d4af085e142c10bdbcdbbbc8b84d8af6b23b2d2b1b8bd8b7ee3f4cc28aa88bb7e3534b133fcd442533837bea87f39e242735b1255efc59448c18749606eccfafb111f6d557057488a22944bd6640743af79af01382ee0f07a8805a6e422c24d0d0357a1315901972e6498a4221f859c5dfd41b6529ba6c3914857d6c728f28388e54083a619b8c41b673eac023926046a2e37c9ea647e52269c504640919d6edbfdda60885ffdf77305310a4c3e8ae495cf8d9558de2dbcf51e7d9ceb37b8bca0124a1d052cb28126ebb4bbf8e1e672271c5d6660ccacba336a29ccba97aa4da2f12fa8dbf562e6d6ff812568078d79d9b3160b7e405b6844364682444e0c59e2de54324cbf9088ed30f5c8c7da1daa6860fd2406d302982ff0b9083da2d1d0886864364ff53aec299b6ce651026a13d19c99c8ec1b6e56d07128dd5352d19ed6f957268304e2c23742de1eb0cb5fb82ca2a3cc570acc9c51252e95965a98f4195909c38e114a5ed958c0246e09624d5b52c1f93efa004957382918fcb9ad29c4b64458f44f8486fe1f93b13cf39292a444f9119311c3dad29103cfdcf18b49338d168dfb0e80320f43727cb2ca390d402815829342ecc7fde7a1a2a42366b62796000210567665236aa15fe46047768d5354ea480380c2b58a5da9986b8af114226e446636cf90c66402f89b680ac5c6b4dabd7dd89bb2237866680b250577423a32c5aef76aea4016ac72b7044aebbb6faea0547e05de31d32f63437ca1a32e8c7017c9777a12188ae3943b3e22942a8d09f98780c06afbb3a5436c903a843df214052a3523083c480f0824f20b9f94588f0ccad7a8f10dc7f4519736a154d1751d3891b9a059d992804658e716d8c1f62638ee0d1bb959361c52087a7aad9f755c1180b47a8e3cbb141a21808523f70516a59978564741ad9030bcaf4a29f5303f321d9399722af37de16584b64d2cd6c4f78098705391490946073422f41d4fa6061876c12a77a294c93767d13089e5fd08d8f5ece8dfb4c42741163168a8988552066a498823122c514c48c106b526c04f5744c8f23bd22d1fb71aa2f1833526c41ac08310ac5448c51282622768198916226c68e901e477a22a2575a7a27f07e0ae27e9a2effa6237e53a4829599dbc5934983ea70e23716d83188882d5033b6802db0e3f976ed343991cab168f299cf13cf338c67e6d6d89aa3a80e516c4e80a1ae6217cc9565bec671455b242db26edf5375d62872c6e9ccafa2a35c9eb9ce0f134ae167c980b5435b4ee89c79aacc0289846189e668b05239b8be5dff7a0a42a687691b7a220093177b0e720def3e217f919083ded9bb82d3340b611606193246e3d7d03da76b471704f90aaddf9d341368e4fdfccee6829ec6560abee53f688b433f4ee8ae06e1cdc9a4a252cc7359176085b391098ab601dc21dee19fc1079eb4c768d33e9730e323ff4d2357c0f074383dfc1f96941ccae3ac7587b5af695638d66b1e78e2c497e75a5ade651a98c82ec53776352bed9f4aff02c1fc8565f15ad0c73fb0dd8ab351b443c0936eeeea841812585b7b9fbacbad692824f5fbf1097ee5165a80fa471e4ad659e073f3501ce5d3386d47637cb89ab87572398d653071cd835aa5f63b64eef8fcd4e8b75a25cafa40b18faee6d5b2cb1f528a8f939ff6f619c0ac160e7c515de5bcf2f7ccf10cd2d6d3baad5e7784256ca3a1a6cc64181ca92d1234fd45744bf7d3902244dca81b1c2f5c775334b41b8d744ba35dd240171ad45d8db1ab5aafa1b493e0cd401ae88a4676afa1ae34a2bb1aef4a63db8db1463ade6eca6f048d4a9a2c7ff1fab1ef1b146719335e4d6cb216ec466a021855bc94658b111dc1ed5318ae5e56d1060018783648dd804711c4a813b712d504d9c441395ad7b27c45722ed253d7fbbd9487d6aced891ff82f009c57a0f7979b11080a2f62cdfb1192e6d38550b23ba55a6e2dfb027b5d08ca36242e2da390e714d371321ea3aa29b738cb100ff2793ba4e730075922dd6cb952cc305cd65b4adadbb4c533f8b6ed3bee8ef5af0df98ddbbe0c0ed50f072e844baf5e2b4e06942b9b6dab73ad183c5bb8ce992fde5c1ad5b53cb1e0cfcbf3d65ceaa308cfca4c5d87036427b95898b0c534be4971ac90a1611455f538339ad33773fe14f20d21d91cda62beb53753299d00c32c63323abcd3533cafe5ff9b1a7ffc66043db8ca14a6d8f02f47b79f4d2ebfbe1b3098ba9afc108d3bc214ddfb8f9ffb77caedcfdf18044ce9e61fb29bf7066f60052e648d1380310bf137504812a6d2ce5fe2023698bafa7e3271ffee72fdf9fb83614af77cbfaea9369964602a45f8e502fbf3d1f4e7e930a550892b4330c52eff8ea501c0946efe2129f4e389e96f0a05244c5dd79f236511a6e83e0ffec167fb6e68734835dd11814fa33698d2383f48a30d614a07fcd014feb1c4ecb739608a0c2c38b28bf0de0db12cd760caa0fab76fe2174afddffe38264ce9be9fa859e21db43e0e88bcfc8804f0cbc7c107a62ef2199371194c51d9870500dec8aa06e3875696c3914eb82098828983d6d490a10b8990ae8da1a2627ee3b094e180126430b57643e30753b44ffb7fe5ad5a00d8cc0aa62e037f421f03d06930958118c0653f4c31794e860b66c354128ecbd1dff03503a801df341da65277e7a8614af3242ec87767a49b21957b8d68348b110c052e5e4991c31440e93a8408c450aa9fa2c87523a101eba24fbc6eec53969aaa8e45a5a6a85c9a0c48b96f0aab2a533e28097ad316e8f128734d5bc33103081c53a665200a9afe0454b7d1a49633ab293872fd7f0c253a0af9d7642cf9a47040851018805e6219561b56c7b37533718d61907979483876093ac7c8c70c60fa6a820a619a20f623d07c86c7b96a0f550298d3f0157512008c79df8697b1be89908db719b1a76d8d55932af03ceb78718a7b290205b8008bc58600c4fe036200e223015a2568b64df4d59c969c7d5e1b60e1de5168c7954760f50b0a6f979f3aac3c7b173aeb9927f68d3a3ac26046596bbd4f2da7d0ad3a1377095d5aa6b413c6fe05a21a22ce4b4bcbaa5725b4dc0deaabd78300fb9a295f42c0221f9a1eb5477286a48a8d6610a812e342759df8839434a8aaa4ca0062c887bb3c7d6ea3982edb3350b60a582d0c10be06175614d40f3e6722141a680b9712ee767d33a9ac345ae54e617fc675029262ef69492c9c14ba9182254aabed007e70a4b09cf7031409fbf3bbcecb2fecbfbeeb3cf0f322c95528bb4a3869f331c09de3f7ffa57f1a8fe1f31c88d0bc1cbd40a0bcb3b7eedd6893797e8634558c1d5a83048dddfda1db8bbccf3e1b42c703ae8ebb77200789042273e0c4c73f5c19707b18cc25ec18d8004cc80f48bc81aae085df6e14f4ec6db6ec5095d0850b53745af5b6bd0532fe4c58a8a87ad14569fe9f75e37cf6bbe0a0c29b24d6849fc33ba011b01ab92cd0203df55e7f2d403041b84db91084589e82f8419c6c76eea43a2ff29b58f21e3581f3e55eee7b0b589bb72732ea8bf62fe805b68a11ef83e041dfda841e2932c273c0284e3822060fdc5d5867af7c3b1c97bde5c94ce9e83282f9bc0d1c2c68e376f90c338f819656d8959cf5df3f6cd04f8ee518527af6c73e32471346d51647ff670ed564a8262ca29dcd662418d3f32629b3c2d08b802ed64b2cde0ca61119368edb5e9ca3d54c6db8468094d65b189f4e088cd6bef3ee08aee694de2cf6376f34b4a435ffb79c77e4c5b3909a978a0bc6a385323caca61d94acfd055f722a966fc0c46efc189f04e20d8f23fde41e5d0b62e14f7fb08828ed0a53615e87e55050f2955f1d281586ff0649a0c2e74156268b20af44592a1dab74f107e21e8334251876d939cccd9a383f0f1300f425e8a0b5d1a4943157533870bdefe86224cf648140054f2452d13268b20e70078ed2366e7187749117ea57b7b4b50ed519faab3ce6c1c8a670c8611f0ac7e00d6c066da85421d604915eacc1fa880f6239bd633ac7553363ad03ba898cf80cb18fbf5c9db84102303bd7bab3d5da4464dd44c4a4fb44691d1039f0308b0b6b2ef2a9572b5b717d98cdd96f941dd0e7c826bafab4bdaa4fc5e32cd490e20761fd33e3836c08006d6a0129b0b495c084209feb25cb90002c6587e10c08c4484f69c284fab7181470740b216609245ec1d8d63b4c0aa598581106b764ce336c1b0d1fdd4baeb49949b98cb495190aa8299bfc8d519968ca23a84879cd248c380f46d8f4be374c7146506931d5432aa6a05f563915431807215749043183944771baaf44c89d98b0e4f838516309a9496cf337635b414ddd5a62bed1a9940d6c98ed75de825bd7d81b442489ce2676d8929633faf55209ec1b26a5fc253d4db7fb670487004213e44182d621b17704193928f3ad6500130209860751788ff36013cf8c2966afc8828290c64564c5bf34c91c482bc421f4b5594cd053e6794da374bf65f8ff82b905cbedad4df55c121b9b61ea8b1ee154ac2d8806655939c96f00ee120a87b516ad2aff93835327b073b6c4c9c996cff6b722e4950a297ff16a17d4f658469ed8cc2a6bd0ba3421b98521e093b2ac6e462521d732a879e033d62029469c35f0a8188f8cc1b258308656c72004cf71d18b5582910635b83ee9d2fa2366d1ab9910b5f6f05aa86fa0909585d24315d9d5b9c253f580f51d9e0f360dbf198e3e2d85547edfc3eb7110b5f06b1b3def7f55b9124e775f3d83c75b2501001e9dca9809f781f8e83c632dba6ceaedffc0c7ac2cabec4d45028f19f80a99ecbf077597fb3149dd080dd70ec1ad37e7e47b4497f4934c09e9de5e07290389c0d61396e192c4330a3856cd1c67b54257c347a22f88762ac5cb8e6f40b1cae82cd652c0064091dc0618329576f720cf3304b8136fb120d42d52eaf46813501d4cca23f733e08c138fc6059f6f24da96cd5046c78efa3caa75a1ad0620b45b208e6734de48583af4241c8ae946e5abdf20ea3b2ddd818745dca0f2c0a9ac6bc576ee3739f6de87c875fb3dee864481d9a8472e96e0e629792e9ca0d1298a7f4652e48a5c83c573ae30ba15d721955a69b71b176b8c4e7feb2bc138458567bcd14cbd1ac56a6fb3379c75ad1b41a80a4fa53301b94c48ec5f5e317690a18b4947ae84dd5e827d9fa79f5e43eaa0c8e38cd340d9c8f89125fbd4f2c5035ce877556ae57cdbae23a4149b404168b65343b75de640b790099f28e0e7dd8f8a808262b7812d3f93d855d974a3713268e3a799478de75cc2afa19eff05e004a1456ad79e511991216c0d4cce9de452063125a7f13c3e20ef956ea737e316b528b43d53ba1d35cf59807d8a7783440e199ec5f5fbf8427060058be7339fd13ab314647149cd8aa867c0fa42ee283f52da5d007ea7a46789468c0afae0661ba44f4b0d961bf7e6311be06bbc63f8cf8fc06c4b587182ee24efdf0e045997998a93f363692cc905914435b1e5f5a357b0270b0e0fbc71e9b87003a64de3e3554dcfd08c793408dac295848e49532eca253a2d259037b084a04e6e1ca34c40acea091e52a668d79035b97209e01c93859fced10b86433b588db6c5ee8ad1bc2315eb6b61996f12c1053bba2b7487bc515b1b8de9372fa109120a100bc52afa37e06af14edf429406ec1206453bc56a868d7b27712ba9ca07026fbd45ad978f0f18f16002415dcd0074dd3923e1dac52b5679b77eb4b072b5246570bd0762903ed46ebe12084a678978f163a5eb43bb8bdea7977832c68aa5f092d377f7eacce4cb429a2c288ae8c24b4eb80fc4edeedbe8f13483051edbe86d74824ce9224ac06a3a971c1eba901fcefa50e265d110dbc3a66a83e40698d5f16511a8d1842339a4b1a0053e851cba390c1c7a513e9a740602529b98875af36a79f47027e63c9147000d4c1717748f2cbdef4229716fa16a9db35512bf980dca59fa3589154c469c5da88f4f9b757a361ade3993214f903ad6bf6889efcc8dcac568cf201f5b0e39a42a542808b64e7179a05131136be6eb6a0aada49fed268b3c0af24fe974c800d178df49bd4bce5dc11dd0f690ca8560f316097b7a9bb55b26d9f10dedb2cfdc057e341e0d8ee5fe3d096dabdb65868592d33d016578c6238f5c030ec702fe06884abfa47e3fec2b28e0b8250255375f89a0efce478e0b8c50f1b7ef29d02266219ca1ca633453cc9f99cd360a57ccaabfe606e1c0d350937ac7daa33c4c2ae768879c45c6ba20d3b2981959fb375d53304f39a88a0b1dcefa93198235ebe067f8a27d2d9da87a3809403fb95579f7a4d0194732acb01425c4379f14ac965232301185c4e751a85c601c5d70e4e4dc03dee2a1ba3da0f0696c64d8554db25ee21545b584ec304561f83f7df69828223ca2815c643c5571fb78d2ce04000e210ac5acb9f4ae2684ae16c340d337210ad94624f1b89cf95502058a3a4d4f10c582e3abb08256e06037b0908b13acfb2b8e0f58f57393750e197c8996c21a8cbc7c08143a9564aa4320a0305e7d3ed54f30f9fc6f25384bc113ccbae0df0e0de74d9d9f2e227fe58dae42ff0a28e61ff11ba9352a591fb3c35aa813fd50825b2dc4bf8682c09240104b9157196fe20ad2ce305c6c2679e8c265fb0af0702180fa2fc297b14d5d423a22da9fe39f0ddc2821cd5404691e07a006aa62b4f5f0e99c78b9aa79b5710babc3d9fe3569ecad169bb21c955201e9f1efee72e0f6742207c8ad386fe01d1bcc2cc6631d0207fd0f1fa6158c8e93ebf5fc7e72b55e1d37d055ab984aec81e722ddbf87201f1d2267ecd245fdfef8da6be91816ab561ecd71e0996fa47d0b84acb6c43466a9f24a0a3216fd1e03f69d8ee639622cd18e3f1a7ed52c15c273354146968a261a35202c91890c4cbcfa3291af9cd0187c3d571cf14f09ca0d47a8547950c2e22c852f2e8fe7cb6da494b74cc0ac82233450865003830aee4d846da4d349238b9e6ab79bccf9d1fcc8f3ae2535747f0343cb25956b0863945caeb76371ca759854971de90544f1a4f228e821b13ca124fbfc83a5433dfc0486c3d63116eec9f319b1f259d85c6c3c23296f2d50bc7abc548c475cc5081c7a5cf21e57c9b3e26c7ad77c168e27784a55b9fb04144f8d9070f82d11f9e5c428a6152a15b5e4b34ae0ca2a627df419a6069f20e212b8b17520216450e90432313a2b99b5f0cd7e6df11c9a8e4f28136f619eacea49fb68c931111b48f62f4ac8b63a33a08507639f525a37962186d6d2fa630ae4525d8b95c982d8ab1cf1e4c87e7488f25ac7a188808afcbd7cd1931397345653aac0410100e05bc30b3a1ded718df391a6a9d19029c11f748dfb11142a61605a539dc27fbece8b063b34091168370f4f6dfcf10827a62ce8d09ab823a06246339ab9dd61263042d3fee45b3f844fc3ef956b55bc6b62de9ac58cdc225550282a0d6da3180147b3a30c0b562ec2c530ada5826d9add9a9ee024d938e4913c2499eb23bb247139d6934aaaad4f15181864d2f4d0e1e771b7a088ac1630212dbf3692b437fc8f7cd2927d30832c164d3af360a9a90c9d156cb278b1e4df590d6c2fde11ad3b24b416119455abb84c4ba3562b0d08d5162c7413fe3f779de98adf2e00106fb4ccae77464b824d6b5dc0fd2f23326ccbc31ee1aaf05baf1af6b77cfabc840cb717e89d0f6e56b802db0561b8ffdf4cf2bd2abc14a940c1abf3520f5153c6dfc501b9c15800dab0cc027ac417ed5450792f0294d8b979886b0d525b2ce51fdb8ebc568779902473b64df29419a84db2bba56b7dfa169fe6ce1bc1f5d2048089a86bee09548dc49ace0e3151f75c6b31abf5415a2c20da42ae4d7ea2df73228ac39b2b724fbfe7ad04891a15ea6b0f8ef6f984949ba218ea45e2c02e6070882726bfed09978fb5cfc531d78b92362da8de1169c443868200a946305fb2cacc015d154601649d424451c84d133c287657fa80eb1acebdfeba07328a98172f6c7a36f655b5168e402b218c907dd3cba88b95f2cfc578a7a8a7e02d6ad6594e5c78375aec77e1717a084cd96ab130d3bc3c06419a2c70cb6e2e211348e81b1c66f03e147ca9ef9077c8cb876791769160291e0eb16c160910ea087c9db077e8b82d4d8b15309be901c01559323acfc715b1e17f9b1500744cd250fa17d1ae67d0a096626d8d4e8ab0a3b5cdeade6ef56c5d198e6efdf8ff0e79f899320c0d4df7bf49d9855825f4ea5af1315a297e44ec55ac1aa6d7da2c8e9506ddb3683d650d8ff4c5c89082963a4256d179c48066af70d1bda50b29d9e26cfd8fdafab16408f3732c815ae8115400db6d36b912f2eb82d4802a8a393a4272ee005a15ed029792485cb55a6dd237c41123234dd27bde838010d0f28e47202ad5ccb259970b0c434ebf35b92c2d303dfb1b4e3606e9562d1c1e451907ae22fba88e00aa89e76d31528abce6e5992dea65d43500b63eea6893893bb65e05037990a16e7e7d6c2f215c740b7d3fbce44321f4be173e5293b198eefbd92b1e051c2b72254d1ab43092eabc58b0b271476b05b0dde078822ff159c1a4d609ca58a46bf422e5be8ea93db07c5409be18214cfbe8f83f672d598bfca62997087bd62a55cb022d4b10d4df48376766f989e1930ce527f12e3515110058b711149e9b4c16a4aa944f180f04bff66e04d3028941057c206849f77da9d35368a3888d1d185b37239afcef0bc6d8940883ad970b5967a38ba969b03f3d90ad93036aca923ed5a549bd44dcf056f02cdef22db2385d150c818002b43100a76b527e924e8414667fa9dc9ea9bceb55cac2f3f69b6fc003fde94e0e69fb9f150a9731e81fbec7a912a8f2725ac61e1ad1a1e2eebda2252266471140a0f9ef0d1047db4ce444ac3c291486b142115fe149d132098943d0b7d93d5b0f0c95b33ecc675184a797b4f633e771e50e70100d3e8da3a63dd9799ead12831983dcf55ca9a2a279033909d66e6a9e7b15a7ba7a51d7d65729d5748fe80ce35e8ee1a681d2adcdf8c4c0385365a67997242a2c8d4924da4460bd77daaf2c51c7ccc81ed0deace9ce4b5fbac7461b9dae8ab5f7d6e44a2119697fab2efc536342f4bba083466ad372526b270faefa3c9df0e7a649d6d3cbb56e10aa60063d514efd1f4e8dd44b40023f2b12f5ba25201f8070c22a4778d412f511245e960df0dc1df480f778fc2537f9be37ba4de3e0131ec812fc42859638cc00c18042351979c87fe321932e936ac0369460fafe1369d14ff6dcbc3023bc4a88f3128b10efeff82a16d623549012d5688711e2aa343c6dff93404d04ad924d3038d6ac00a5b5125572a377dbbbc54a11585655752615510f0157438fc40058a676282aa7c458ccc87a80200199428529b290100d98e9e9466f2484d8c94dd57e2315b03f29a8f9aef01c5a6afdc2cf231ed6c26b518ed8ca1700f0a4101ddcafb9ab3493a96a211d7e2849692b56adb5dab476a180dcc19585c8dbd292a9f8ce5f207f130d9a00f7abeb7a6ba6f72d78e51b1585d887708d260692acebae9eaf1c0dcecf1a823c666c9080c2b49a87c40e550316ef229b80cf461618eb8017aff3d2eaa6b9620861f04988114d14c66766ab0f6bba92054a8c4de79a845af2884b7c93ea51146fdc2fae550fd474d6fdc9460b26879e9019107644f235ea43291814a16b4c8228ca9aa7a8b8ef3d6880c4b27204c6b55cab87d013d1c610f74d61021bea2e1a96f64265337322d1be2e5a89bf2128a24f9795322cde7ee67c2006cc9f868a10ceb142343821a312f12ceedf9c5b528c7bfa69f627e9ae8c8792faf3a140780abb64c0f933235cab05b9e5a86b4de1f1449ec413a34013426cfa49c5343372e2764c24a3986c71d8fd962abe1efbf18a02e66de5bf1de93db653d0bdea28d39b93885648d9f9b9b6f239b96aa100d38a61f055b6598dad24b3f8a72b5a03293fd256b4f098787d22623d005d005889880e5cf62bf5b524c445a3aa976031106f83dc0f590d99bca870b3404defca9ea22fd344e42132c8b1791a1abbf2b5289c29874f223ff1165b435a28a81e25b2e5eb8154cba9994fa2bbccb6746a1e5c81afb0f23152483b5efe54b5163523d275c85c30c0802af3972da1b7aca64e728fb8c2a5b11c582f4588d24c5a734e34fbf1037f7d8083cc5e332eb3a9e2f0e67a2c42268f8c92e231a0e3eb79d995bd375f8d32d2162aa0a732efc3489af2316051136b4a736d0ee53a1833ab01bb3a3c03b8545c6fc42f5551fd1f8c45ee20ed2bbcabb9e6b485e2e560b6111346eb0381f0fee19163a5581b1985b702778890902b67eef4d21c47f0c7f2ecdbc0702a730a1d01ae8da1db3eebfa985794b04def695506da106dd500af328ebde50f2c2489168a11b7f618cf850dd682ff8d62458f9198268538ea85108b5823c0b81188e92f9cd7d88e1490bac8384989351579cab299bc5b5e2d5622087cd5e339a12613f3ec430331ac7691ef38458aa451a417055f0f904a74fc6f7c6155d57c09bc127ace3c1d9e9a67c378ed6c319147542b35c1f864611fa4b42d307a44e50b99829de5309a0fd6539008ade756524c591088f8e4b56f80927749cdc1db0eb735994eb1f2b1c5535bd94534f862d91751bd12786e01b5655f7d1330b9d8c298a7c5ed134e1b898f277de4e334c04051be1b35d74ef9cc7c21399410c7519a80d0098e0bb076ac894b220bd3504881e606c0f279ead097df14d44086c7974c7056fcc4d9f8f52e99707aa9190a6731459f997269691e977fec3d54385a583eaea2d6e4731a5735e8a013dc6541db45150c33ceacbfc0e078ff652c9ceb918c8be605fed5f7f72db28b65c838141a8a142d0bed1561127407b7aa4e733963838e5c3b79974a3c07b5270297ba8986781d081ee28b2538061d4d4a887fe51b385debee2016d1f3730c0f9bf11c2b5c548fba8c6c0042e47b490eae2718510b8912e806d16f0b7f53013ede5fbfde2eca18d69424004e21584f83b226bc34f152d521da1700f54a06507ba5238ae580a6dfd03ee800a6e1c69b55555ce1cef5602b4511e085d2f25f369e82128c59cf8aeab183fd8bcba95ef80559dcf4f0c00233b8cc85bc8b536e345825924768deb8b9de40c604acada8e827b575950cab4fd9c3adecaab9f49b2d465e98701b6f41a4bada62cc71b3f0b35eb93d5abed10e80e51f6d0c14faa9b22f15a01f35c2a9fa98de63aa018cb8ebf933815a115cb0412ca5f7df825c80ec8bea39c996437634d8b306e384a9af54c9340ec94fe225820fa549fe3f547109601f8f36e26e7cb6900bdac2fd2db4814dbfd08e37c0a14f1e8f0a12822922b4efb1506fa07ca79939df8ae5009c0d512e035600d0b4c625ccf6d1d293f29d6e9e88ab88c358015f921bba4b1b7206f52f4bec566086292ab1558b8fbed9a92d19806aacc55415ee307984d19702e70c38fa8cb4a6c866907715e012ad0088a9432de983e05e402af541d932ba6b0bf7d93c1f686a056a47cfc2c1c1038a876f90e452d30bd91cabb500f70d4bcffa064af3b3463b40bf5e8a7fb223e4d2b3352c7475d22110fbbd78279fc2e3265b56b720affde3eeb2d2f1423a53d9488cc8499ad9c34464b946afa4e3a1f20dcb1b393f8071145aec112fffa56de290987f90f6b42fd65e3a4deb08851c4cdf5ae44f09a2c73f0f2ff7a3886db891ba098991dccf8210bd254d4310c4b8e49db9c116b5b1c12082265b43105de8e6dcc9d8e9525688aca0884d57c1a6cc9cbc888017a2c6b9912e319a25ae6b83a4b28819ed09f950dc0750348d189be474255d60d14a4dc566657633c30bd6448068981462a322ede38f642c4f83f1104f81baeea47ad916d41a2685e07088ef5e6865c02bda2f2b6294152d135b23b1b1bbe6441d39c97006581d6ef05063e59e647b598c0c527558bc0706b848d70dd6bca40f83a0ae072b1c28943ce7a3c9a78a91ea2f2d148382848829c58d7339108831a9c8b1960105712616356639a021d2a422e32c074a44b1a95ca4d42738c89757959fca3f10088835bd88b1960011d1a68a34c6b22023625a31e35c1e04e24c2872ec6540438c9a488a90438fc9c5c4aa71954e486bf60bd5c37290721d8a0aa0175d5b3fee736715c21467691935168755ff21b005eff56e4df1a945ff39d711aacbe1ca20abd0caae77caea0645b0765d2cb54ef1a68b8143eed04711c477e673b6b800aa6fd5f0094e28a69d58cacc8e877b52d5ff2ec7da5bc8ee2613dd425d06ca14c50cb98d710b4e7109b23cfce0941edfd73164c03a368221345124b175fc99292bfeef3346d085533a7d6c2e07341b2a161449bb1041c93783fd27330545b8b195b113c96400aadfcdf37b13d452f4712cf0c379cc03f222dffdd0bc01a4750941d5e42c9b5053a24a26ff7d6cb8feb5c91b8621e38936a07c4386ffd300af8f44edea3c16547f2b2f95f4102fdb3bbfdeb4d429390996948ea1edab1fda453f4ffee9e01a3407507eae86a1da3170cb2fd4baa81381d22ad3ede3f96ddaa575b48269d47ff2de8af77a25f7fdebd65945e67e258cec71eeadb9b7462c7e2ca4486f6fb26106e04599346baa3f5b863e730229a86c9d752b9207020a2a7231a3a28f602ccf1beabd40fb5e1d306ea4da671d6401d5d51cb87b47879f972066d3ca92baa352f7fc32b3dcadde4473475cf122df8e558c0e39f33403ed23fdc07bdd2cd7bace5918e2144db4b5d3d6d450a92e7759711f0c6b1a946803148231361920fdc0ef2fe766ed9158bec2972ad02f0f7473aa873ec3ba65848914f6803d9102012d66cd6f84b8ed57aafae778276f555dcff15a179713cbe3e9f72d3e0367ae0d64ecdbbc0f4ab0ea28183c4406ac33b25ddd24ac7c8b493568e719172df7553b1f3a2fbfae8e9a77c35ee7ee437f67d9cc0d41267e087842f5f141fafa9fb2fa29bddf7f97899dd7716f943d6dead47d1d35429b7faab5f756bc8bd1faa78366260fee39118518ac6c3aa4b21811975532f921dbd7063a346fd9027649182c560e3634ffc1e4805fa80a4f9d3d947da4c0acd5cfede85de459cdadb580033ec10c084dac542217118ed221e7ccf8990da3798505f35675ea64b8f96c599f973ebed26f29d8234b932d68ab956649279a45aef6084c0c1d762e054dce93c6c8f601f626cfe5caac3d3610596dfeadf01f2deb55ad94522feee9b1bd7d483b41a3cf69fb409c268a42e6f5e5fc233c8a1847f61267ede54e92c6540439a674ecf103b8c26cd35c5d09326021099619d690f1a955ff80c1f86c0d30382ab210b558d72d6a3caa44d6a20a0317d92fc6446bd6a74224b11b1d0ce5421637111bd3f225026f5693e8512fee3461018aefdccfac1d2de5a286a15bfaa8be96c53aeb08b1bc54c10d810a77bcff18a17fc74f45f317dd9117e4c594e22b6d45be198edbd6d8c5e603e2300d2b1fa8f1d497b590696fb69b426d4eeb4cc4847fbddc01b82b3959cfa4df90d10c31ba28fb839ab42f7c2b8e6213ba9373ce8a0be87b2ba157cef1d5b0963c2d6670765e9efe3a7054835570dab5af7a1911d8df9e06df2bddb829b2c10815f4efccd0a7222291335ca6cd33a5174114c47ac9120a5d0025af344ba08d4a79144c808e1861ce2c655182e114bd89799ebf5bb232ab6effc39d607e08cd99b3806228664edb54f42e4aeaa04cbbc63ac7e138d16e9d2880183d58a88698413c9b724d98d30e76213b8b850c059647057c9a84ba40260ad8e4fe2610483dd8ac5394674d7a5ce76194001293fb3cdbfd396f5495be0b14dcef4cb32511c2fdab1c274b6b6bfb0e12ebbbd308253486d8c540b6542ad76c5369b6f7302cf8b779fa9efe338230114683b5f3800be4cced7e5b0978e68d4c20525e9b6200776ceea63e09b509c5afa579f67982b0a65caaa203441f36a44a98bad0f7750d2243b8def7f6024c45f2965003445842a36ed5e4a69b9fe12cb652da3fc9db0e404652858774bf1f3bad3545984ed2895f4a1b094721086364fc8425ca2396152961ca20ba873e38308ecf39e75029aee0ba491c5d0dfbb07ac3cd3807f2fcb68d88b319760df8f1662204487709248b0ff02f95311e110bb9a931ac640c9628b10887632de51f3b05e0cb8278ab449d9b1d31747d8c40816b375ca9478a9b4a4e615f920e6d858157392a20f163d809c94926fd49c43474bd3becb7cf22507dfda771c78031eb893402783f2366850d0512a7cfbfe6c4ef460b041b8b8b87af47015b53d8204cc2d828724bc871b97451d7e7935e42b9b96b10c1d5a66140c052ab0ca036c276db4b7f6da0018e1fdac8816f5e451122099cfa98b0162d615f2ab44adccae35d4b67fe2d2464d54c47fbcca3e347a6abc580c22264a3ab30ae7de5d8efcaccae884bd8ce5f272e83fc4f06996d2364de7f9b35a4a8b232638c9b2e1fc9829c1e4d053eae5c5d839e6ba4ba8ebcf8af0d3e74b2bf53e656f8c2aa165f15f68949ab7097adc958620e88ef1ec6ae9151c5d227f498cca0d9f19b3e789eb33fd6819c502b6aa9c1f9d627582ec03020598d3ad4ee7b7c17195177484f62667f25e39c2ef530c22e97c4e636a588fa06f60ea29d68dadfe27cd7528a8e05cb94573676acb76fc5eb7153d79fab3c13532e7396e2797d59b26519b13c7d54c0af67b64a4fdd53b5c6d5b3fbc39c9a833c796e3140bf1f21fe0390215c0375f8411dd374abd0426a9312b365cf3514f21392bf49dc9a723b14dd77bf396c6db4e94c857e694abe9db6e9a34d82ac73a4517370b0c2ad22bae7d7a9287223bec466e4fa4b91e4ead1eb06a0d7e54d2b73bb557b9cdb7f8bb6e7d42489dabf3e025b512ff39a1fd756524dd6ef85b0a8c1802abb97f70bc7f91834007a0df996a91c1d8c4e3132f7f5a92166b74f5aa9fcb1d1534995bfd09579fca1290f14b3704ebec63edbeca60fd0ba266e864b294e1244f90ea236edfa1e13a0448f21dda9ba428cd52844cb7119fa86fa19602fe7e7ad5b9c585cf11e454392e46d6818e46507d780928f10e7c0bd8dcb1d46d97d40169613fbd1b0b1d37afe01d016fec8c1c1132d6eb88213f967560df5010e3263d70e116427240c950fa12daeaf32c5c46a6a86cc8e3ad85de17d51ea50203c8b45ed563cc6d9496be14b4c75331f0b45e6c263a19e978db63e3b08f72206821297b36e206f42c53e48a61d6c799183738e478d3deb9a44a36a051f52b560eea6ca3357b2fd6cbd164e49189f0f5e2a426eda149b7d71535ee5d138e81d05c5879ca2f8ca289758ac3f001d9cc1502a582ce586a32d10e6f9c47f7b3f760414b3a917402d9471120b404402e7007cb0dfbb25066cc0730f389374ddc2305d9b745c684e12c7cdbecd475147d540e85ee4c208c3913e1eb9747231c01a94840bb0a4a56e027452767c6390d0bcb2178533f4fb32156c8f78817dae6555326cb1b111325a7d4a65d030adcd407e15f18e6d6de1a28b8124f3a4a6a6f1ba50254f66d8f09e760ef7e44ac738b7a1d701f5ba477ae82b69d1a7082f78021e4b05f362b345d6ad2700a23b7c6d77750bb66820562156e8446bd5826884118b7455ae4c24afd0773fed31473604a0ac2214ac2843d22badcf259b95ebe29e66ca806d6b353369d6b3129a531c4507140e762bd3af69516dd24334ebd2270d0341dd9a57b1b0ebe65c82d106004b74b653ab8ec82faee9c7a2230bd787db0ba45c3458cfe1c9bbd810d93169bc455375900e40ec9f0ea94510337fb2d6b0258988878c0d89d8faf4614de7f1172d0f5df175ef1af01dd56d6943a1d044a13591a7adc1d098d1ea03872b9b6efc957c2808b6cfe0d06747f72e46e5b01872bbdf083b899ecdf0eb660633bf547e87a3f242d48c0dd0c91aa0864f62a5e4a597982b8093a74037fbca3c7cd9dadd60f40bfed2d4b83b021475595d4ad6e1c1bd507907217cc823c3326930f912499556e10dbaaaab0e1eb710711c6cf112a596adc499b1943d8a12c9a8c9951fae6ba6c7c7f08cf0bd8c6612850df7d2cc9733009aa36a8ff7b1e0a121b378551198c158deba86a18d012018fc56d889549323e81d8afbfe89552eb06002cd927ace3f178801fb160e30309a5b46bad68e2e4a103c9c258154136a03a2ee6821f045d2d70536f4c89064010010cb3497160436d6a0428891f13f0faa96271f50d3e504c87d3a1d523fbf4d632a7fb5dc17d764b63a63f598f46151fc64cd692538c9a104b190a04af23d3ba49106689f41b1671c42e58584e0a8ef03263e4709db4102d2ab7aa19d4893565dd8a6133a37e5df6469b72e64f699effb2197a6d9d35c101c7dae332ebee174bfe715123e3f82f9c22659014d391e0b7844708ed941dd209597e12c836fac581726c9bbcd155f6b20e658d6b24b011a9bf8041e87998087ff5dd0ecab3e40925617717245eaf3109990c25d152ea1c6bc84884bc465f2bd85bd2ebdad900e81bf7a121420bddec148d55e089b056cae9630a181302772e35ce2431032663400323e85967b35a44812a2816aa47745c1f78ebb1e34c1f264dc99a8186b1cd91680148b65df14ab8ada262cc60c404d0fd354444dca1e296111b471886de4c71fe552c6b85722c757e1e5157051b1fc2b2ced10e27541e782612089d846420c98cea642887da150c08461450a1c9d38408388790c210d3db23ce2cf88e5dc8d1cd5d09aa0244843b06ea5dfe6fc4515b801a7d5315117adcab51c0d889710fde9008aadfe56cc00a27f04a5161e9c8af33bf470011c4661335bd5216863f36b289fb6011a96a773c2020ca105adf33d55c771c256329bbd32dc132c1834c8db11fb094dad69c09406adc4377076f45a63f6b5475664d2eec0a9b2e10d9102fc6b5eaab287b86e14188a11429367f6928f7026fe0f5a2111fe9350f0c58f2c7353ac38d59e196704fa2f145b4793e6e3c149280c103cfd46af58a71b5586f3de3547b3cb41df66350f27a72b0c243a4f2002508d61ed3c648c111f3b86063f3927820cea92f6fc57f2341247f860487db48630051c0c8919021e1937b01959efdb5830423ebadeaa5c5a24723813a6faeef16a3f5c21474dae685bfd58fba2966e763dc5707decf754b23646b19f927f177b86d0925c957c7ff0eb19445ea6d1fff0a22b981677a7261245be156f063f6edd982c547c2bb2fbb333ee32e607cd573331e69468b314db3c68fd6cda27146e60c0f8288510c937a19c07df06701666f0bfb5dd94880d4ff1e3226fe0969909abaeaa76a2fc2125f94ffc646848f83d340f55ab9c2d0b7babdccd14d848fd40f49c14249cbabf87115139d9953c7ca4e96ae8aa2974197113e6fe49e832b0c48c6e4e327408771885e7e36b41ba97081dd5b0197044cfdb4e04a1056d8829ceda8870263457ea9a7ca5dfc19ecf6b4409e4f00f91ed6b2254767f79797b448d72201707406a1b47e15b34f7ea23ba592ddbcf3a8b0abed1e8f86bfa60934fa1a092462589d3683281f6b5b0fcc22f4ce055fb6a1bc80c551c494abed479a6c3c4ee7d10dc3b6baa8b6d6c116f9f02a15e406d1c66c1bd4036768a414dc158e11cf06bfc0229620e23264ec6c83f0362e43f05e72d01bacbb630cd3108641129e723fb1da711def38418ff47a319d1a81350f59840fb33a34e40580783aaf27637df15c9239af9ffb50c9ec1c665e13c37591e30da7705985028d324c20a34a8c009c10ba28ea274a0d92da188bf4ba8b082b1b64982c1e10c41b7072e88ea622590ccd5497598621792ea34dfcb254d06670ac30700e5d6c001553f00d7eed676bc1de95b148b1129439bb0fb8d01cdffb4a78bd4356c8ca784d11a81cef08435542b94716656c7f55cc319cce42243cdc13dbd5a13f2c87835d03c8eec00cac9a4b5f9960dbf0519e3bca757f6c82c964e30852a9091512a31d7a094b9c7de5c408154d5ec4f972eac106bccb2ff84f34b6ba3f250ca81dfaae3eb26fcc69657e7480676cbd5d16fdb0917252ca3d4b44c087c2b47dc1c1d9e962c1104614c58a0cfb8163a2b474f9665452897eabcf612559b81ffba345baa13484ecb8882c9b054ee2c25bedd3bad80a5a48a1833e4c052e39180ddc64b99e6099f317a56403ae6d14b4328ace954a19f0deb90334563423a6ff4b7b43b41e9a68b4ee3285b1c3ad189813672c93ca427ccf4a9c45c03b7e7fbb2ee02a1d5e4efd4cbc78503c12d8c6f018806a4638859974b328d9454c5755575fb49b8892b68337e197448dabee301975ad1cb03dc4cd93d4488e04e7318f2ea470172a89cce3ea550ff0ad391f85dcd58f4e76faf6f40ddcec4fbb413b03f25372254992771eec08ab9bb441ca2236d826908a785d271aba72affbebf1adb34fab6969e1443e146d9427e8116f307e1ee9b3721a5cf395f9680feb11a7c7936a6004641818e09650b446d412fd5779ec1ea53ab8535e5a96d1cc2e102983dbb8dd28b3cffbdb319f0cc167399b80671d48d264897b9d5bc7f281c85b3f8279da6aa15c76c4eda15a101b096d63c5a9eaee75c574c138f9c70d71af9cbf5c123649c9664f208e1944426576d3c5904b77b02545318162da356657e510115f66899281e05b9417021d308edc5f75eae1a8df5372169b51f9fe9f462f963cfa78a099d72ddb191aff267c072fcdd653a570aebe210f4b369eab1b07f1c9498f930d5a9e123400555a845c3b909c737d20ce4dc9fa6897033d1e858749d87890a80d1513a4d31c80e2529772eab6c62cf34b5474d05fea2ad36211b22d494f7742bbf495cd4560fef73ae9ac6448b752980a0398ae50285b5da473c291b5cef8938099fadef9c34e79ad0aeab17d83b2f69d9e91cf2816a2613b696a0cabcef02fbcbf8440c469c67894762f42e4a561a5f8ca349ed5389ec0d3f88de34437dbc793b89ab1dc282c6584329d7f756009f09b5ff1cee6f1cf24a00c35527e5664288579da026f1ed176c016c4c9cb8ee6580cca073bb3e5b3e81d2a135c796d124827e4b818f4f99cd36ec261e2eb1d9ff854021dbf869e0e7f3538478ce83d328563f0d94a8dcc84c302950883e5f072a6bfe9488f641594bf0764e67e5e85c0fa033bc2a451151facc99840991728ccfa64a0f70fc6834f025b21c456500189f2a962c3e4a7581c33b319131ccb4e051bf880b41cc29984b3422a77089778c0ac4034031bdec126b8abbe59f812f8d241c27acbfbda2932a7c4ac957722ebd234f759d9a1a387cc3a16ee9d0d55d882ea1f88efab85ca2eb77b1ac22165593cd69c407a5c98300eadb3a257186297bd8a1014ab3f99a9aa7b18057546bf33cb1457135fd583d1a44c97d10bc451993ab891a6061cae305f2d0fda61be0cfbb6496a6f6542f4aa6a9a1ba32abe9393e913da26602d4f298e313ec86bea092e34374860ff6e1bfdc0af7d4703128d45124bf0a2c9abf6279ac41c478279df079d07445989e843cd70d849c697c992e37ea07386b3880f328ab679f28aeef318a824a8396c3359143bff9d92b1fd2e4996cdc828033fbef4d8ec75565e7e9d8aa82907b8de1e19ace1405364f1ea172eadac386699b14873f1c9e1e237222d2e9b4918188e018d9fa98440aa2e99f225a1eeacea10c41409d896e94874250cf3fa24db314578cdc107669182acaa272cb22b8a446a17c7f578b015a8fb27e96a1300a31dbfdcc52cef7ab39122c88fb91f35b8b1044a03c3e31a475cfe61a438415b96291e4d68feeb8b11ae22e05795c95b259cda20e8122c195a4da72c40a8bd189500ea4bc4bbd94e19472e1512a09bdd42d002c66d5e22b5a476fbce55e44f9cffb30bcd9547145654fabaf544f9c5ac22ed95895206a03d19d023b31041c84c89ca7729b55a3ce9ad1b78d340038b0f6c540c00c2142ecba420d12e4b306550d92bc2a7e9dc9639c7f36fd944eab295a2cf21aa43f1e0d18021a223ba93ecc435385e16cec226777e16bbefa1a7c353294ae99cac9eeddd7c61948eb098812034df6d069073fcc8a24b2b6db599afffa7d02086aa939f9644f07d94d14e8a6e1972483ccc8715546c6999487c79af3f1c170a3e3d1bd6102560100ea401092fc4f411e59179eebd2a743f1adc6b5da45eaa6ff83868c7a528b291a406aaa52575e62c9141f265ce82a126f1e03ca6c4012b0a4856a1f86536441b0e1b06668031422c72ef883988f41a927b45a2fc869ace55c9680b6eebe10d633e1bb9a2ee1042ef4ee7bdbecea527663af5edce8ab25af5ed928baa693648159002ade05fece178cdf8203f12c9053737a6e277ec39f690bcfbfd651210ee06949a8fdf8fac2b8b8bcecf90423b33cc1cd05600d86646c1de327473626fe6d6ad554e85c84ce193ca84cea49dd6d0ec7110330a3d5865ed5863e3986c7fd2d7a4152e5c6d4210d7f37977118a9bbb0f25757df440313438efae100df12ee17ec9829acf62096b26222870c24f55739d12187207d347b820d658548f8c0c9805cf2eea2ce224ef633ce3257c02a7771cd2ff733456bd0399024a35dc5596d08a495926ee00da4685f5b659c4400a0b100acea86c0d82ba9080f6802befbf51a8e2f837834ae99497c1064931d8939cee5d38d2dd86b2d192314208647a527da786fcbcb12e8787ef0465b708bcdf502981c98168b8bf5dbe921827a6c5fbbfc29c2f96df0f6f5ebdde18d2e0d41a387ce771d613530df208bb999988e7ba20ff2666a8a40becbd6d633f72232971476cdd54b7af0cd4af3a183fea0672953fa8342b09d2ddf7b1a150e06d4bf20b22304633897e9fdac9961ab7130b4c43e9303acab711aec3b4262c6bc30f3c701a6354e5a9e3e6e790f3c9ac165450ffb88547882140f8ce54b29042077ecee9f037a498efd88e0d12c3f0677de1c49ba5e912f393a47dbb4bddfc3bd7b918bafefb4bff5d82beda04385ca56f01ee3eb1279b292baaa5a062ceae0bc807bd87e09770a5b74518740346e9a6ddd6dddc9516d5c972a1a2c711a7af38fe0152be60879c6d63caac8e039ef0fc83299278c86b323383062ddc9cdde91535038b2b536bc4c57898ac785099bd1c1ee5414c67ea3b3b5486f50cb056e4c9fc7c9aa16bbe4c626a16bd823fb065317a373ab6f687ebb815419ee3280d3e47d24319e639aee0b0e5dffd68b7cc378fa82db7c7c8703516c684e4fbd8f91b13f916ba05ece75a4200639b849177f7dac3c646860c860d398ce9ba1fde8aafdb9a6411e8e4e2f593fd014d1ce7e5b02ed9b647e920e38b1b31c714f80c48f0e58415a47970412348db6fd35f0313f9e05809472403c92037cea3bb9b5e4eff76c984df4b4506c92e2434f950f548277654f4cc45b73cfbeb193f31267f2919d44c68ed0c632fa5f58c8b2643770a346b4ab9a5d2867812300d2fb20294cb561b8dd1e5e77984321492cade96c383503f7593a108c3c80310ad4496dd340fd80dd602b068e9abb276a8d11a7c2de648098f5cd79535574e5a7558b8e500d436b5586d46a3662f65ec9ac7c7935118cb3c024f76b9177891dfc3a5ba56c7fa2e9310117e7bd3bab759f3dfb5b5e7bfceb568a28da01b524585efdcc66ce3eab12b7a497fcfdc777f94b51458cefb45c6ceb2309b903fd83b263e8a307b02b0ea2de3fe587bf1421ed06db4b299261b843731b95002099ec0094c03d4eeb82519413678b3a0326347cba7a0fc99a52e895a09096570301d71d8a084b8104ab0d0d27046ef0a27aaac65556ce4ba12f59709a5d19396df49add57fcf01546211f11be8af9d2a6abd6eaaebcd3a4ba3d41cf90c28589d68e9dcce192505b75178f19f3b4c35cfb7bf25fbae3266419bd0eff3099ff0243278eddda86473d1c6d076f7abace895529c546118d5993025a188849de72a62ec1ec52ae20fc9669b88da2a01a56de2bd74caf055c416afb177d14ec0ab2120c7f10fd6524cb36a0d8b474274f39c728f58eb950798d93f2073ec64e140a3e9ef8686031a9c54fba2a143a6290ab71e469801449537a30bd9cbb860dc93b8fec53315b02179c4bc411c3dc0fb2e01505116e64fa71daa24cdfca7a0944c494bc3d837130bd2346653405783c5239e8f028eebae12959554b388c66e6f28b2370594a6b6e40ee6c43773dfceb63ab5de23ca7202fea074013185a2ddf21f97a2f620bc9afa537c9146f960da52c5854b947773aee3a7b6c9a216439cab30a5bd0c29c619b70166dfebbfb0a083009181b75817de4232f3acea5ce8e3fae3b2df8f9d8fa62549d20c76305b286a14f0da1fc008b085a1b4fc30fc38ef7d7004ac80000998233a240ec049534989c47ba9ad874d41fb43684a727c84c4b0e6ae579a50ca5d9310ca49c3148a8bc49a6ff340ba619142a08e3e6ed41ea1915adbce00672c23dfca0df1296f6955a3a98d8321bf8892ae2ac05c27e7ab34ae34c9e646b64424abcdfb5bc0698917ad6762586d7bef5ed3bd80474ed3ac9edc777cb3e84ddd2490d675b357405c81baba879aaa76eb669d3f5c2f805c76cce5489ebbb5b99d54004d04a84dc05b0755e5c541ba90ca2391cadfb767cf9dce380aa9ac0843f969584efc4922152639f8202f6d95ee72cd72a6cc661ebdc7f0f8a63ca0b38750e4220881a07fa6edc30de7b1afe4618becc94cf50280ddeabb63120862a0dbe6df181bd31dddd076968bf916a202662c200e24a690591a96608d6a5b53128866a4191fed139d53426bc1f8cdc5c69896f7ae2618eb56f85cf85d012c782b8a0588f070bab71e04f55558af7c609efb3d137511d76847f4e333cba8f93abdf0c9a1c3ed2c6842f9fa5851d2ca318e75eb0425a4d1cdba71a272b84a5d48fda54e7d388f0eba35184ed96f01177c3857858b07e568c76df33b132092b51697dd5344ba051eea1fdcd08c58ab065c6ae48893b2bc98ad12d62a1661a9c2f6a2320f68a7691502a83624e824684171f8e2cd29d52068a66ba030a2be4ad7a222e99d2aab854075747b411eea0ffcd166333d0fef586d9d831f0e9cad4835b015c9ad492bb1287da10ca29d588ee3f6def867ea2ff4dc3485fa0443d0f48e5e489f8818895f0b9c6f9270d81c6181d37159d4674c70f2385dd91363009a985815e2cc48cde695838e2112d458ad153b47ee788142b3b39f3a1425c019fac49940a75ff899d6aa970a93000b924d3683ccb0b790cfd923a90a3859b4684471f8db2f2d3b73be0627a30ffbf3d0d197ec637a48e5921fd026aeecbcc425656bdc865f2ecc1472aa6947ba99c6382ce024afb09f0414669251a71460c14d28a150de1f9a903c88cf2c73fa643631749aa063728e15f3ad4da8164342fb0029c264e8e1c05b1766a313bd85a809570f33fa46f36a8935c24720c798043cc401a4f2f275ffe49313a3eb6854c2b2001cb3912cff2937da58d5d54cc0d820586e17256addc123031482cb34c03b33be0d0e141acbcdff47da6c47a03f38276ac327e5f6c27c8077e08e9cd145001648911a350ac84a8add69f47f2b2c2af6367b158c4dd3e9ea1a2f4254157e37d156d9a0cf8d78509341e0f70745bbd903b67bef9922031588997454a5a908f4f8be8188e296ead04215bb240b0089e2e222c2e43629c032af00800f8f9cd3f060bc8cbca7c83ad24b0a7e60862226798cfb90d202d010919ac64e4b216aeea4f5f56fbba06c5135f0867029b995dec40329a115801a713e75010892a60c0c301afaa697e873cef23b6aaa519e9954abf958883138bcfc9c4ff20a714c0a3e3615b7730a19b6cc9214153a39224c9230dc6b8328458ddbf6e113ceb0a84e0a6023037a0cd50c0871f75ba4c06ebc46eacaa2925d3f37f3411bf6c4e0456076aab2d943580041fc333e329e3ff5e055694bf8e5834b1e3f508012b8d5af79c2c2ec96d550dcc250376af6dd52762fd6f86ec655f68d7078c1debb0e4b584fd0d077b09a90de01e532579274dc0e380ac827288adcece6655f68b81e24d385e1499498fbb9e5693e4d103a95d497e3d84b0660557264df0a49b15abc30fee7ea5f426feb8dcd336b5933ede035ffec0366d1b5bcdf5c82c4c4549db12255d9717caf62ecf77d281dd1cfc4b1d106c5b17f6c6235f0b74812ffe59df2bd3fcf8339463686d7f02709e4061b3e544068faf08aa3d97483cb9579f33fdd604406824402cf2101a8491e059619e1054a8c8153fc8028a4c5b0ea59f1a4303b50dd0411bb46b8ab06d429ecbf905d27d93d5e728254659f3aa4b671e3f8d5090ed6b7e9957d23f6edc72ccfbb05324a69c5e6c6c163e801cd8453f0b2d501fc4d3f13d0199ec5fe9aef37168308107ff8635d272d5ce3147700f7699d6224fa7ab6a9e44b02348a6a155c62a91685a1ad1517228dfd691cda54943adf32bc304f1d7886f1df7b51a1f2cd057348ea79e2be31af1c8d6127d80eaba7413a58d7398074cbeef396b88beccc314f9654eeb89c0b25233dd0baa32b3bd9e97f5b9702a8fc1ed5a621dd4525063d3c470c9895e02466c88033b827ff97d4deb333c703a453be7ef1f407c9ce5d1e8cdb936ad05fb11d7c478d1c521c211c5d1040c2099c1e227e2a5db61aad21c3f5be695348a716517c829ccee3b41e8832c8c286efab4c86e76b8a9ce5aa09280b42658c1f155d153ff363b9ba0dce45d743778647ca61147d8a283d40a5af793a8a65e0c436426bb0da51e1f81f990f3047481bf8bfe082e544bbe0903b450e6288884596a0718e0c0a28aa139e6137592253c396ae5c42c62cd9f08be32fee56fd81e640c6506678e0f48401cdb551b35a96ff7a5b6c5520f6aee18997e30df13a7f139efc32fce5fb33c684a2d3e71c0182afb7cd2b942178bb79ebec9a539932a97c380bb357bf1684f6e14188c461a20df5a278082c137aeb615a694c4e517b5a6ade3c0a9b286b35b2c47cc1450afca9cde3cda1eb6058f909ae55014338c29f25e346f3540e9c91479bd94ca2ec7b40e07ca14116efe5a0d62a45919efa8a273d38a2e96a0b1e4f3fd26b8aa62751272ee4eb8594d485a42773af223b3162e494abc78aa38dded4d71b9209a6102b62a9568e06fe741095b4dc4b67a918657ae865214f61b0bd0bfb65205c760bbce00622599d20a6ec42c2090cb6ea21f77ef34c4f64891502249c78e985addb2a428630f2782cbd5fa93a7cc22b0353c17ff21cf05188163023f1463e22f2eea25087a9eb6408180020c094950df7964e4687a44ab7b01855ffc7fd49f4407f53e0f8b237858215042cc8049b1256060d78f0b9f983eeb8ec9b9ac94bbdf8bf8ee6d5328a58278e36b57e128b25dace74dc4128b1ad7368e7439e893c8894db38b099e6473b2e55f375e66e9e019dc831cc4448c8ade224970572caebdaaedbc77da3bf1d4367fc74d5e51a858c73f39932a43c55d6bf8af87388c3eef661bc71948d4d2ed133704e458e0c199b9206cb22f1d658acdd85c6b931ab5732d888c5f679b83e29a3c77d482706a8252c5a920a254fba04a4ad9f2c3cfa46b198ad1c874556cf9308ebdc893d6dd48594d75efab104e2ad43ec18fbbd26aa03fc5f022041a5e6aa78bb28865b3d7b7540bdcc18058cef378d9d9b4a906b43741656a90f44450685539312dbc1a1908da7a4656430966a0cac960a36222b1dde623287913066f59bdb18a94c4fa9a52ec6d845c38bee9444549f52b7c57e4b7ad35951b9d881026b3ea26e557ec70466d7f7913b9b4495365f6efeb16eb84754fc40668b6c9e32ca0b11ad67ca9e4d8dbafefba01d834d1221370c0d763271fb66570992a253d33fe7cea31a38b4d1bb1b5eaf3fe3fa27f769a703d687d04f468117f27c3102f2079846fd9836569aa394871a36ba52c01664a665b4fbd5a435c9a937a5be7c65b6abaf2bb9088bc8e5b87b8c381dab193af3d0ded7b575584233ea5edddacc7b7f429a84b3a681fb9d9a86d687b16122f6e0dcc626a5c502e06a0248372c18fe5d068f0198c0fcef516d325b9c9bc88bbabedd90d63ef241ec937deece7f36243f83fd6d8afc11d188e91a8db6d5c1a7db7feb1bba0ad352cef9b653c75af2a0bf1eda81ee05b2d28238cbae90c66ff1f2e2f646011639cf3374b0f08d89d7a60568591c6f20c1cb6b9f9afe0fce30f02d5fec99fed38150d077557a79ff5ba1867d40b17a8fda214450663ebc1041ae2a978863d8251dce3f901f8dab8c12a4a62f6d910a6a3102037221b6b9902841fdda856a279fbee0e8b7c73962b0dbd5fcd5f0e5bfc6b760a83d872a045711666861305318a42fd720c2dc6ac38aa51284e1b8577055081feded106b844bf556b66e2d077a5dd13d270f82b7285d69ca509c48cadb07f25f33e3473a41e47fc258c16b54855fd3dc6d2814729a5c37fa1031cb4ab64f10fa348dd0080af6c9909f9088a75a22226f3c6094c56881d5448ecd7e84a16cb90162a26f5900558e0ab0b293aad473b5fd1c31b5ffd282e076124a490569e7d91edcc3550badc9a184d092530790e6378803fe364134bab78a61b5b0e00cf01a1e0c2fde15ec29da32259c238c038c708a77f2ae175a288d0abe46253236b082eba581491ea252318a3c6542aad1522487b88539fbf62aa8e92a7c377b594713418d459e8801efce69b1279293d6f46d91260f4f22df4d1d14399cde72c3f19c516193432b53c75ce64402bf0ff03d6f2ce334cde1c943f90b1a2851da4793996aa00ab786756d30647b94664271028889168c75963ee172854dd8c8ed03bc25c6d885874508e1a4f7b4f517ff2b0a685fd8f81f7bf99ff2d973c13acde272601b5a76905e5fa1d182a2708feec4a3783b279a14636199de28d438f65b3e0ece7d43160e8523b8ffb17a6e596bb02d81b93deaa5da65086baa30e2d7eb8d458583578783deb84b20ed3c3833d1fbf4f447316c3495a1b1f964a5c9b7401b7e9d5ab0acab49398ff099b708ad62f5bf16fa6885b485a4af88c608c23f6ae04ed8834ab5bfc5adbbe8e48edb6fd165e1aab644ab50b5e2e99e146c259a67c506f1cfc51a6094183641937ae1aac6223d837f3e1845b89fdc2f9d5b674aba114469d4e40516b00117b89d1b18fe1aadc8eb9d89a7e0e05fc349d587d29a9651f41b20da3a23e2182bb656675faa0a82981be1c3e0a65f42d80cc1e2f6b833d3161261c8ec94dc000ac98c62c4971750e0254ac40898ffe90948876b3dad2f4db0a8a403fcc53402ad9b22ccdb36bd1d19f5e12ee135019259e4152f7e65f0cf6477f1de85900308869b65592145450224f87790a93ac60af1c545266c7f278102cc16ff9084ddf3d56ad5992b8dd0c387466600b949af46e65bc9a1622b09e06727e190fbec75dc22c87663bb330b379ae03687cc07f41cdc616f29b5b1db5bb6160b07bcf3362ca69f983f0bfa320ece4dc603ca8b4322b3551a32c41b79d1ce5af8f36e86ab59c6c1897d0999aba6c38df6f3469647fb72d385d571db1aba34c7ef71a6b39e2102c5da08273baa84890bd7b22951119f2ea73296cf15848b3f91ab72546d45084c305ebb3eeec63bdd1d0eb7748380d45494b819eeee69ee1961245cbe18a0041f392cd2b1458ef3ada310f2ed21bcbc800e95017b38bd4d14fff2915648508049501c611c1ce33bf8fb8faddc5326e3fc1ab913b2aedc1e2de4287ccdbd06e94c8e1446cb35b2d0fbc41312be5934da864259a2a512db0366859823a7ba2194d12f8ee0e99f43f19c6dc14dababed63a9cf5c218562c38a5cfc011be5d7efa3c98f9517b13d17a6cfc607f961e1e17f4ba61b02791b911ede67d91d55673bc1c58dfbdb811dab4707f994eeff594cee7a802f92565ce193fe6ac6f11e4d5cca4f72864861f2d23e0ae7c46106dac9fb787e767e4e9f4fb573f2dfaab604707003130a861a73337800cd221bcce518f9b1ffbb2dbd37fd076212370b32d5976de259e99a1074691229d82edd9cd64d4b5db3ff654b572cec626fa9e6307364a1f547cc1f5c7231988824d21dfa085a2f0ab76bccefa8677058b35cf90300c27cc52ba353dba1ddcab31af6b073da80864eb1ec2ac7dbe81e8ba20a01b67c2bce4e99bb0fac32f4c845fea1bedec23f9205ca9d869afbcfcec0b04a61572df78a41581a33901ccc1556f7b5dd8b1adb4202f046847d1b4155eb8c0141083d70007ee00ad3815edaf2e22fc11463a4170eeba5be340f274bd834789de6b3d87cac439771e680e4d968fd69592dbcf882810b63a8ad6ab098c97a361a2ee89333f8195f3e4be0d45f2b54c62ed20d61031f5243a8904d4dffadff8e9889accfbee69f3b65ff5b63ec9bb53cd82b230f055160e78b97c46a57210ff61f72da25c721ddaca5e3bdb5cc16d8db515d7565cb12d68c6e4250ece3b73d0ffa872bea206a26c284a7d16948c79c54b1892f954f96ce2571ef9842fb9fe9d98843961a16de8661804eee86b3ef78a33a740285cc46cfbe533788a932ac9a6ba77f9111a9a99cf22742a8baaf23bbd4e51f98441a529bf74a3345df3a91aaffc5b408df3a11cf35d78313b6310d676de0716199937cdd37961f415d0ff0edf7be208d32e95b6453447f0f41c0f101997a77e185c43dbf32f2843d79ca0f50597a4675ede7b3392279bfc15c809151c2d35652deb0ac017128f928acbbb300f1ff6a5855407921a2f16036fdcb2308d4b419ed0d99fa61b362ed883737f418a283ef289fd1eab272f02dee1a7627c4ec0b2487a99937541f915cb90ce55ceef2a331eb8ceaf52632590dd410bfdf3b554432287edb0c04d5ecd1bd21572fde326844c522223d26607c7163c1618a39d51105d7e37e8eb7fb8bc7fad5f70ea09c12df88ea2164bc5621f511055f829f6df428865846d3c02514ee9c5adf59dc8e2266e915a7d9a8583475c07f836b0f5cd22dd46856f4c2f987b48afd06c1fb832022e944901476f62550ef020fae6850a4005d4dbf78620e12fa19f11745c5f7a35b008f86a3ba64e0b353ee5512b526f461fb47ed776f1f471781f753bbefa9da53c5cb2f9c3405749155fafb718dd981324af9f4219a4ab8697a7ef74bb6abd745fdc6a5257f69070d02f8bb21b4250c7bce9495ac50e2f590466ff833d36ef6c2a20153021ded403f2750609bcbb94754a263ffa03e736e5eece00d7975a993bd38d486a64f9170037790da0e9e6a5fa0ed12995fc761b1edbc3872f397f87dd7d4aba941f040106a302ca08a7e3137aa60a5f8b73f4377284661c681e161e496c70cfd0223f04c0b59b84147142c3605720eecb76652fead1fab24bb5e13c61f545d2349fe89ebe0c603d78171e85984966a2e8a0060d86abd874e316b0748d113af9f5898fd67abf0396fd4aac5f336a9cd8a202eb603c6d9f60c6400fa6695fb0b0b8e4826df89f038fe46f2442275617cab203eb0d43c20afb08d86f95e6005444c9b5d070590c15569e0c57505dd045ab82ae94f586ec043710bb5ba9fa512a5cb0a2f1fc5da2cb491ee5bb86541208af86bf2d331b01984d4d50e3581aed9272cb7956bd6f8e77fe2e71223c2cf0c4d81e83dea3d1042be8495940077820cebcba06469b541be5ca184fcef1c0ed56ddd34b87c2e0a146bf5728cda431211be839d06ab08470f3ef52e687b068e862ee913829ec68a4a6d0f950030efcb6fa91ff4e66deab99236456f6d8d19664cdd040018f4e4cf8894beaff3b42a41b3747b04c301c291d39b29a9c58b49bfad4d124633ccde33984b203fc77ee7951d342d0b8e4fbda940c7afcafa30d99575866e2aceaa1f9e4fab266504739eca0610856094a0c9696dcf88c97036e941e722e501d78e03200d0f283659509bcef47900d4cf65b24677d91eaa33f13bda5554e6f6ef229c1fe5fd1237d5404120c42fa3253c0591f680b7571a88fedb125587eb4dd007d2c4d8879f27cd325bcbfe9f16d6bca063ada4b989d6171dc23ae80851257582ec77328816235b1da9a0633fe85ff10c43a923f1d56800aad6cfbc484e6cf1926d4e2b666c903927c617e4938cf4e5e63b27a705e5abec621e625bf2d4c686ab335463fd4e77df0a6b6e2c69894f01af66a6f759600f075f10520a7a92d58e590773abb9090ecbd215111dc4f877e9906e5f101300ea4e264ce4a90c1b3aaf2135b289c43ecd95ec9729909603e7b192ec66dcbcfe5805bd3accffe783bc304b221aae7522427c53205eb905566699d56ba7766a63c43c2810516350a3f905bd2bb65895ad619cc6fba436d11d65c144b1d5f85761b0fae0644ce97800a964695d5f23ea3e5445143f931ddda48ac2183a3d5139685efe806745d538339498ee700ded0c78b862ca045367cc0da4fbf57b250cc112b9f8b3f6f5a99af17df27328cdacbb915c9dbd8a3a7450dedfee8209682c5471b9a5f3d1f7f749140ab1744d23721872ad53cd9661d2746f0c6d25a7293819e393995900810185316304aa9e0e9015250b20af5a57a132581276bab3576cd7657ecd4d12285467f55196d18a55039aacf2a61e45e165d0d37b8e9c5706a475e973bb5f8d76772bdaaa4437005a4b002aa5c56775c4096954d63958b27e9610d3a6ad03db522f7496b208b0bf3f062d847ba1ddc8b2a50fb884c2d5862c31eb54f983fdeb652d85e9ea4e423f6675a9e37d6f5c86a05c4847a90de9165766ca50cc2b2b216112d697befbda5dc524a2965e207200712077287caa7ca6ea9a373a4ede5ce6cb121466643d92f52764a4f2f725b3c2aa360e18bdf280d86289c8b994fe25819e688a7d2469cd99233c318e9b9ec4205dff693f9fdb8a954a6ca5e4b2094a5e256455882712a8ca850e2d9d58ab78bc679dbd0f891060e1a5385bd6af12777ad8c77def8aa63b827a03b8cfab60a85556ff8a1d214638c31a63a865b0211e71a1f990082913d901bc621a62afe9b2df43192130415e1abb5d65a6b95c2566b6fadb5d6d65a65586badb5d5da5b6bedabb5d6089fb5b7d65a6bad12b8a8b2a38c0f31bafe87793d7396330341a8020148d757557d0c19a3dc232b5474252f3d1957240db78bae31963ac2571f1f4345860f20b115a7a4548ad7ebf57abd5eafd7ebf57abd5eafd7ebf57abd5eafd7ebf57abd5eaf9786a3a9caef6ff89cff3f25e52828373139083e953a0af5d3e9df77cf7bd75dd38ef1eb2de7a28b31c6685340419efbc034755d1bc9421fe7b591ae1b8bd948ce441257f2273e30f0257ed1c518e30e34f5a12b6a6f2c629f9874615324892aa9a2aa5c29b458c1e89cf0d1fb1acd162766343dfeb944b32532e1048fa6bf45b3456abaef91578b1cd00006dc05a800a180046404843f1cc0002f800b1f0830801401b0e821000040e1a10590971d4c7eacf0d1430790c7c90e1d3952384a72c0e106945671c3861a4e348cd870b5be19485c582d5e8d1864a031a3d49964b0c0b0e2c20b31b40daf54305a78c139a0010c5800100a4800027e3880010ae003010620801e0200001e80bcecf0c3470f1d78ecd09103470e38dca06fd850030d365cad195c582d3568c810c30c192c30acc478c185950a460b2f54eebdf7de7b1f5f54ee7d7195bf5009e3bd3d2a59eadbe3d3049110d00f5ebce0c13e42f7deeb82f772c3df87f7e666c80a88ece4b0e05e25c23cb5caea3effc6c4bc2a604303b340ce303b3636363b2a21a1a12868d2515112fe2016796a17307676623600f2e1b9414a8a4e0b34343521c819a2c40850506656e4a95b04c562b1a01747474853c05e305130313152f1f1f971a26828e80910ec29c9539fb8183204a7053c319d2552a99bf0f592b9801235331940a16246f2d42a8262b158501e1a222a02836424c5e924b4636363b3f3588c080e64d04f4f0ea6266951536383840ece4d129e47c3022922c5a428851999983885a94d293f3f40501811090941d37c50bc178c65643268acf4108991a7a74464b934e0bb0e61c077cd59c0cc9f3d0031c3cf5798c8f24101dff59580ef0a43c09c417e98f33428b28c38c0371d32c0372d2ac04cf994333e4c163a91256908f04d6303f8a63c029853e6f430e7e94c64499d007cd31a007c53257898269ff207c85c61145912e8e57b22edf04d617e7cd32279e463f6449644eaf13d7f74f89e413c66ea73ceec982537913569747c4f9c1cdf5307c7447dce9c1ce6fc8c89aca983c3f794b9e17bcee879fa9c3f37be651692626b4428b226900ddf92a8866f6944c3fc3ee7918db9135913c9f52d89b4be65cf0cf35287ce4816ea322f7362abc4a234ac6f69d3f22d6f6ad09834274864d119df3129061964cc4320bae88fe9735e88d8da58be23110cdf5168e540228d31cf23bae8d1ea3b1271e1dbc60b31228b22d115dd115bdc55df30dec2a55189adec9788aea68763ba5016f66940c88005f4205d7708881fac8070e3040021200c225d57e887704f2328fd01420344a402841bbc413e847bea6b43009a01d008802647baee4e0fe19efac2044007003a3ce8fc48d7ad01f2a36926f402b403d00f79245d59928f9066b11e12490789c44322cd485716b423dc33b3d141938306074d8e74653b39e4e85056068343b8f10d3a3a94aeac46b2d0df08f7b442746503500d403484f348baacb531271265593a235dd6d21ce9b2aeb035916698482e33acb025dc5f8d90468ea687b135920588b2aa103d92ae9a2459e865d0894167868e8c9025dce00743b8bf9518e191a6a74894556334d25583aa4d8d74d51dc942ff42e84288b40a9154e19ef430c20d7e2d84fb7b11aa84359a9ec33e43d245917c7c7c28d250ce39e79cf3e34b98b3cac3ab84393fe7ec1366a973f5a93f14a93a518bea500d7a42cb6f5a054d1f4a218c855cfcffff9cf373fe0aef25ff2e9eef22ffff3fc44596fa43705ac013d35922e7d0459e3a8c05c562b1201629292929292929ffffa798782f4f49c9fff3c32d53525864a953eaabcad40b6879256a4d9da919f8c36bb3636363b3d302050505050505252525e5292928a0f7928282f2a7fc292828474141196a91a54619222a5261908ca44849116a91a76601736b2ecc85b9352b4c4c4c4c4c4c4c5050508e8262a2c27b4131314939ca5350c22db549686262125b91a5368911c141d04f4f0e505042a124a1a41310044110044d4c4c6e620296782f2620887293a39880e041103cc95283b486da502474706e68122626e1d42b6241b1582ca824954aa552a914088207c1d4e30b984a991cbc09984a3d954a219564a953484952a0325300c130b3d9b1b1b1d9518142a15028142a954a3d9542a1bc97140a053e753085421d8542fda8c852a37e80a030221212422ae5a3224f5d92a7e63298ac26ab19399d4ea7d3e98442a18e429d1e5f50a753eaa8a750a7d34fa713ce4896fa8493e3821e223b3040a142a1242121a12492effbbeeffb4ea7d3e97b7c397d1feaa7a34ee1f77d527f530337d366d2cc234ea790244f3d120b8ac5624125cff33ccff3beeffbf7798f2f9fe79dfefdf4855b6a2ff43c8f486a8fa82826e96809df174a9b1d1b1b9b1d53d7755dd7790177cb3b286bead0d5fd5c22cf1644967b9ba7ccd394e70b24cbbd96a70be2ca3d97e790b872dfe5791357aeadb6245b783d6a285fdbb6d1c05e3046d468cbdbb651236a448d36165e8f2cac78aab85cbfc9c89881f9b67b3ab2706ff7421c76d8bb90aab31361d2d927c7cd97840e04fa7c3c2c0993d8f479ef65aab877e7e62c6547c47b1e10f82401a40249a4b24308580e904cb2213289647066ad31e5140f0795313494afbd7ddea8fe2b61122661125692b09995648cd7633e0bb7166ec9ddcecbf6f52534df9e3f5911413e9db52c849b417b46a14fbc97edf367b698666cc51edbe77710230f2235c9e9b31765cd1b7cd2bca7328d425cb947653a4564b927c9f23592a5cc29dc187f9f1682f3dbb7e99b276354783de64dd468decc1b6a145b1d9d821e51a43a53696c57e73d4ea7838ac52b23cc02ad33665e60c6c4d6366366cc8c9931fa7e6e5b096f8ce2bd7461b7b77f1e8fd2b7203a2e943233942f1913335b4ee68ba8b5a71ee97b29335b2a4fc41f78550c1eccc3c9c0c52ce9d18cbe9f31865586aecb5773991ad1292814e891cd14a9c2eacc54d14cd50ecaa2493237e69ec394d27b5488080848dfbb50cab5be185146a4414f49bc178a69e9f8251c464a4b5d76dac5ec6535ba5b42f3653e110a4dc313cf6c89f8f37a74617d14225356f8a851f68a2d2ed4402603cb86b0baabb76730d0f73b468cf136b2b2575cddc76747441635a2ab3b832f01aae04b42df9d81a0465a691e41145a4064c908446ce19b98ec18a790aae78930e9f9edc753755ff25e4a9fe1478d60686484194ce6353357f7392e43f4fd96a1aad1f7b5d65a77adb6567b2c6b7501f3e1073db6327d6f874c56ec01897c3b36e7d2d0dbde7c43a02dd237f65c9bd495329ceea55088d45cb8f14be75c745bce76329d2c2767389996330fc4957b53ce3e205966a66a66215877616c076565357375cf837d3e20a18c285342df1c538be0eafb8a547b628bea99bde8ea7a3c9225dc42a87427c2a4bbe373261b36ce9d06976d4cf1713a8c802a91cf95713f632a60ca97d2f3315614e8fbedb12a0ae2ea6eb195bd70de4df76ee2c270471e2ecfbc69e87b22fafedefbca83f1f79d87f3b479e3f5e0ee8542a436bdb683e0166eab83d0c289c3a9ec1002960324936c884c22199c1f8a3435ce3f0e85485d7ae6e5289d3bf7a2eb72a64b19c73cced92b9381cdd5fd41f03bcd70f43d376fa64a8673887591c9c495fb9ab392117cd9bf5d1ee3a9a23a82289d7be9be0be7109c6fb69b135ca3ef5980336b50f17b53ae7165decbd488b254842a19af0af369a17be1e59861105d38834ae1040a5d54e0dbf367fe98c2222a3d029a2d27d84815345ba8d1bca11d467d28e0bcf7d4c805c73e1ed0e746fa9eabd195bc5cdf65abb91c44ea1ed7f61b4859d90b7f57a55d88e0dbd94bdf2d7b457d431a0a911a87df54dde3578de9efcd8c8214d94091238e28c211a5d3d229bd86809824d2f4f31546d773734e395fe4e38c6a7d0087b30993f1a44b38f0edf959348d66cbf62a89e8aafe7a0787280c4c288410f2339c3253b5294cac9eb3d4ce267ed097acfde4415fb2d4561c59331657f593e7fb7e1df596af329c335cdc7408edd984be4d8f82c8218a446566cbae316d271285116943b3a52b328aadd214b165fa6e32bdcbfb33851468aaeae6bd685ad41d9036a7100da23031730504137413cf3abd9e8b99de4c55fd29d321733563d3d34135050a9a2d5aa84ddabdc54193937e6953fbd4d2d3415970fa1c9a44b3c59ec2582cb645f10511446a8a4487aa0b0b7c9b1e451b6bd7d2338b3eccdd8e88c763a58ba872c854a9c84a6fe24abd145f10b4d6d398d912843ccc6c7969afa71b88adeea597c22efcbc977919f5d154554991684893a6aabe4403df9e4847babe9e1ec554483d545ad224da437d9288ab7a15e02574fd0c743d91225df78c8141dfcf9e3dbacacc1698f6aa35fa899454df6589233510dfc2043c7df25527d18c4d22535527cf06ebb92dcfa2a9da5e4f5ba01d1361e2ae6529e5753cd1aee170abaa8eaeb7afb8525f345bb630c6bcb9f96cb83f109caaaa7dde6af2b4dea8ecad5807d6b8fe98a73e7c4c95dc41a60ee284078d377c80507c3bc674dc56989b808b71460ca866cb8e4846649740f66757c96264a0cec0484fcf21471610baca9e65df33e86c86cee84a67d148674304e16cae31cc615fbf6d76fb0d3a4490d9129f3ddb1e73dde6dc686c210d2aa78d767bd55badb5d6da4d55f6884ff59189278af48e483893c03330db36ed9b16a2a62acbeefaeab37a6f155e3a782286ab2b2f9ed346a68e3147045c7410a793b8ecd0f391de6f40624bdec6738f31def418e34b9df79d662c3bfa994f37e552de9ff7e50dc38724448142b868fa1d536557da080983a2b71315ba80bbc4a11f17f3768ee3b82fc7771cc7e5792e172173e4ad12e30a7d9c337efb0d2ae34da779cf5008151d5ffa964f7a7c3afef37e634a9dd92277f2fe4197bc122e612f4b1d71b827a0a39643acc4d8c2d8f8b905b73616a3adb434d2d2c8a12c44f12180403d903a2526f8eab90b050106859156d19109287a34f649d25177e746ba118fc74a9b3e6485a6cac2b292243e99335bf0ad76fb6a839983c8923437882ddceda78e74e11ac9626f7188309fd03a5dad754b9d1fdc2b4729fd4e2e153ac976084dbe69113da249251ff9ae32a86f92e373980485af7938300ebfef04e38f6427c19909a8a224528cd2d9fdad7507517a10a94f7aa8b4e9a6a72e69eeed718d74491a1a7d5fa33f95ced3c165d7b4efe8a369d7de65a62e9bb4ec72a9cb5e97bb2e735ddebaac751977f97639ebb2ed72edbe50882ecf6e9391838cf881693b8f5252822fa2c456a6ed6f586be38fbddf2bdadeef1adae2d055b4b7f5bedeecdbd76998d3d7d3213b4deaececc0d0f83b468c9f9783a48b5cde37471dd2570815fde92c9bb4ac892bdb4d3acb25a492ceb2f793e50e27cb1c95e1749637a24d675923a2e92ce3698375966f52066473acce72d5111657b6aab34cb5107165fb8db983aac495ed374faea4ab546868b200506578f8ae3140be69d2cb373ddac10220ac38b4862a1ec20309c19730d215c90e61a42b5406d3b688ee440ca14bdfa96be7b45c7172cde9be7938342dc4a99c4f9e6867c10eaff944bbe955bb4a7f4f7d57e98a43593b845267aeec312adcf82309f7078e841b3c85fba129c4d1f6a9197cf5db4be1063b1ca4eaee54081fff5ebbef8aa874481622b5466fb40791eff2a680bee149f4eab58c6be48ca0411644f990a0ad6a5a6be516cac0997bd16139336cc363ca0f202195850cd47373da991d3655de8b9c33a33617cd793493c07a7cb3844597dc4064a92dd981b852b1a6f52516f8360d2d1f502311ae9930993964e6687c4b5edfa6519f6d4026b670b00c81aeb204baca154cd56ca14051f4705cc9844f908e4cf8f4e83d3ba0eb3f1d99f0d9d11236335552ca447a424d1555c97a7b02a76a88a9929f308d07092492901d47338fa39dccbcad74aea46ddbc671199648785ca7954a5ac7755cc7791c121ce7691ad7711cc7755c892b9538ae3395de691df792c9e3342ff34e6578e275971987a5b76d1bb7715ee4a8263d4ff38ebd63ef98fbacde39cd2b3dcbf55cccd929a695eb382d6aca51fa8e6a268d96348dbe640ab7895ec3b293b2e4555a65e5e4b67dddd76de7368e662f65eb614a354a9f7925aee3ba92c7759ef7cee354760801cb019249364426910cce0f45aa35252fa31ac799ba73b72b657b9aa3469da4f3344d3b8d7ca6128a64e4a47da692a67146d21591a42401e7711c1706d179b2e3f0d7b9be8ef3bc8ef33ccff338e9e260529280e3b24e22d1691ea779e73aae93994791d04a9ce795b4aeeb3aadd33aed25adeb4aa64e33692593a9f3bce3cccbf182ebacccac2401f78eebbc54c9ef4b5a49cae33a2e479d595d9a45e45449cf515927a52b3623c9825fef0365e150c6cc55e5d9b873186fdfa785314031f146a0185d6f31fe3e3db5ac51ced2b461c4a94fa034b6b8474a6194524a29a594524a29a594524aa9a5d88603264bcaa34b949f7c85c9e5411597f22ab32575d4493ed272fa4c2da5cbe7b0c307901e664b6585efbc1719dad8c12287a9923eb45c44caa9bcb979ddbc6e2ea5f5f3f293c1778f3d1d9202cf2dde65ed35b3c8eee5eda5ecdd944bffb2e9a7fc7d249f4e92478eca244f65d44b72ea2a72c9c1ace226194cc9444c00860899058df127796e50728b9f6494afc82737c92bce65a9c31ce302165fb1197d92e86a9f301fd2f7c4f9f78cc1ec99ab7bae878b73f66c95e6c23d63be674f0eb74aa7e4a83bce848821b86bde4b774a4dba94941679fe0005b1c854899bb9ba970ea8f33c772825e32e056b943c7ff28a3c83f2149aaa7b30cfa149749fcad368aae6d1544da49994290c8d99aa1795a1b0992c539a9aa9b209335562aeeebb4c87e8983ddb8762932786bedf7248df5ce39c7b15e34aadd59b3d53e553f36d3954b4a513f4d06c199244b2289c98464a4f26ea082e930582f3debba8b4847c7aaa62b07650ac6dd2658a9be9a5d24d9eb556b31ae76a547770a5523744047487c6660b2d2add4b7f688fbe8f9b12d117ff5ef5f398c2ca85e1169636eec7eb51fa160af1ba0f48d2a4c9ca646cccb432f71ee3ae843f8c5d4aa5d2718907638c317de15904cf227816c1b308be8dac5924aeee31778c4b8f2fa65249bbe95aa9743c8754323426e968167da573dfa6739f772e9c3f5e8fd24da1f7e26d9f4153753fe79c73ce39e79c734e1c737e0331fe3e9cfdf616d750a4236a54faccd90be601edbdd8cf195bb187fdac4264e5f1b291beaf4dc4562cdad547dfd71e1d9cc9c48dd0a3919aa9aa185f3bbea99e6edb7c779a6d9fdbe7468fb3e3eeb83b2e7dcadabd74ee1e77cf6788764147267c6074778c81989ed1d57c2ed277996a15974b99791eb636a66a1add8391258d62b538b6ba5b57d493c3d97b99a10d8c7d4c95e93361cde4993e431642a4fec2addd7b8af7826f0a85d4a8e1f158e97a941afa664f3527903282e0ecc0afa3210526b6d1f39c4c15f92a953a91c55ee54381dd1890102b83cdd5854555b5b9ab188b2c8eb65f4074dd1dc81d48a1ef814040745d26984882beff21b65afcbe00d1759b68e208fade87d8da7e2f80fb1e624bfb3d0f5108fa1e486c65bfff71ef23b6badff388ae0b74bf23b64cbfc7117da0ef7388add4ef75e481bebf115ba5dfd36083beb7115b23bf9fc1a5ef5d628be4f73558fa9e466ca17e3f43067d2f23b6541cb1e8fb95e8ba47482fe8fb55745da4fb17d17593ee7374619818b105fe5e155b26bf5789ad13949816fa3e25ba70ccbd4974e1978c0a7d9f8a2e2c737f8a2e0c4389ad94df83b1b5e2f7a82fb64e33267def45179ea1b9d7a20bd3dcdbe8c235d2febe8badef97c5f3a7f772eba515e3efbbafb7d27bde636ca185c70803c66374c185c7e8723d461b361e230d343cc61a6a788c36d8f0186fdc788c5a3fc61b6e788c38e0f01873c801c763c491e331e6d0f118753cc61d3b78e8d0c387ea7bea1f8f91c763d4e131f6788c3e1e55fff155e6b6dce25adeba9ca5b2e9a59cfa482ea9c828947cf294949c59fc47de92a686660626f38ac130494847464544434241403f3e3d4d30b18309646ba6ca9694e0933a190f5d09c9206d410dbb8065304b3355b6885ad3853d54ba7b175a2258c319ccf4755a667196c14c5fa76519cc66d85a9b591ecb636972802d4d5c599b44646531150f6e00cee05b42c75420755caea5b135b3e524cbc21e1afe3e10943a303e2f3059571a5956664457f655f6c81bc496bdb441745d19c9125babdb5f18fe40edb670d555cf8c286b025119e9b23392c548cf5c992c96c16e2c96c530fe3eae0ad1ee47f6917b641df2c6306dcf23efc83af2c631da3e47c69173c838e41bb2ce37b20db9864c43de3748dbdbc8aeec4286915bc8fb367199d87707da7eaa72112fe45d69a0ed63d8afe45d71a0ed61c8bbea40dbb3e45d7ba0ed65e45d9bd0f633f2ae4e68fb18f2ae50687b19f2ae43d0f634f2ae45d0f635f2ae5168fb96bc6b116dcfcabb2a41dbbbe45d99a0ed67c8bb3a41dbb7f2ae5368fb17795729ec4a855dafb06d05b6bdc0b61ad07603da6e0afc559fc577953aa00ed5c9196b3b235d196c46dbdb0d44d7ede9e9804c6c711a88aeebe373c42bb65a5c20baeecf4f06b4bdb5b71588ae6b2da05d21ba6e50501692622ba342745d21212b20c5562785e8ba434353388a2dd314d1758988a2a06dca09d1758b8a9ea0ed6b516c956e5f99105dd748b258a32668fb4a145b23b7af4ab04bd0f67528b6486e5f8b44d745922c16498ad842ddbe46115d37a908d1856186105d38068ae8c22f15b7af40b105debefec496c9edc99392a0618e1043849710b47d7522bab04c13d185613dd04174611a94db94db5722b1b5e2f635165b25977902f683191fe8ca03cde2f6750638883bb17572491ac9627568105d1726596c4e6c6197a5912cf639d0f506dad640db732bb20b2fc92b7eca25387f6791f1b9bc7a8bccbdf0428c182b2b30c0c0c22243c68c1931c420830c3468d4a8d1d2c262b9b8cc3043eb858a8b304cc92e1c25a798e49383d9e42a3278545671928cfa482649e5d24d39f52e9b9ee5ee5acebe65ed2c727d8bbc3920aeeeedfdb53e2fbc90c17a62c4e8f15959f1f98101861f201616a0201932828466cc101a8a218621221964202aa241a3c8a8460da3a396962324d659dff326b9dc2549db6398193e434cebf5424605e6227c2be6c54b4546bb8085c734f92d6832cd5b9c8605ac6eabef5be4e7ede9fb9cc3bc53fade4556c93b45dfbfc83bebfb56de2ff4fd0cd925ef157dcfca7b86be6fc9bb86beaf91f70cfa9e46de34e87b19ee63c83bf640dfcfc83b36a1ef65e41d9dd0f72c794728f43d0c79afe41d8ba0ef63e41da3d0f72fe41d8bbcc6568d2bf75fc671e5fe94bbb8725f92bfb872bf22a3e2cabd0b198c2bf7291925aedca3e4c795fb93ac1257ee4db22aaedc8339465cb9579165d070892bf723d9465cb92fe51b71e53e9573d8e123aedc6719480f71e57ecb3efc1057ee571988b87263d7759bc783ea3d013a84c399aa1c9c16d55bb8bd8cc5168cdb4b1dc49637820882d8c249170d82c140db170b223e010d82697bcf5daefed67a6f55d5c3c82d9c74f9a48b53a5a2433586267d3a522883516c0a37fe605a0debb56bf732114368de8ffa4e65df85dab550ca1d99d3c5d677fb1a83d832dd561d6dcf993aa9b37ad357e9cdc9490d5dbc3e215513218db4f62d75a42beaed57c87a2f9508a935215db741b1a3ca3a82261ac80303858ce6beeed62b659d59503d8326a71b2fe913aa67d084dec495e54e9788ac7984b8b277e1e2e48484446f7ac3e93d399cb9b297df2e5f0ce4f1c96027f44554bdb3199aeddc05ecbb301d5bdd6c913568b6986e5f7726cb08bab22f9d0efe7c3df6fb40f0dfaa20f068958e4c04c1467371c6286b695380e6c2e8cafee4b4c523cd8fd4c5237d51f20de3e048c509d2ecae57d0f6d587b2a8cac3ef2aa47f1c1aa396666e30e5fbab382fc28db18b707f61b8bf1c6ef0618b30c4bf342afaa2ac4973638f124aa20ba32c6983b8b23f09b76a45b80f73817128c026b4fd084c07b09db862cfd95b1a201c681b991ea8e46a9a0a93245433030000004000a316000038100a050322c1388bc24498f20114000d72a24c585438178bb31806338c414621060800040000303000000354220049dd88f78c7f0a0d0ac0b5b2e2b5c336b0d53a88e8631cad87b96e8963c8e4d3ed3f405bc762276bdbb6be4a11d1d9db079d20814681090b894501e0f18b08653c1fb217e43dd5df5eb83b125d729a78b54f4e9fff435104e811e6a0c9880515d48b1dd1174bfce5092730323484cbdaa3da1d2afece43cf9cb31d39d30a2a59a86cf96268cd7179733d109826f166dd3873f15ea97886126c5f404ac3a37730bacdac45cdd843d6474cccea2f53fe0db8630297fca0033e9dc09f2fe0fb12fc8fc05051c0020f9c0181d38780791658e580c76980ebc074c06e8bc00e41c141dbfdb3ec16242cb02d2876c760ff22365cc2ce3a44837c3be7290133924604e5e8739440824d0130b88804ff860eb0b445206e17a734253e0c2646e9bb563db321526fd2a8b5efa8f6fa46fea45811f73a0ac6ed38a2b98582e81c29271f15ad4375c39d0a35e5854b291e05eebd3b42b941019a228f706e4840a4d823ab7b128c29fcc8ea9e04638a40b2bac3f13185906eb27cbfe3ba5db48b3a19e31f23083b0382d375d4236dbe928723d3bb2eebe683f781a5f4981be1c7331af049642776cc16f914dbe53b0e21ef17a786458b8b0eb52ea64251769871076805482894b2edde5fb360d4970e33573a8defa8a12867b3edc533410477a7fc77cc6e1acf4ee8654fd35f623a97894c45cc83dbef100bd2e5c2d9fd61eee1571a07bd0bdd6986048857d1bc68d748edf7dea6016b4b250a242769c63f15d5e4b55461da2eac154c75455c47b78c94ec314616465e450c45b780a5ba2a08340ca705bfe05101d85f909662445705d240415a04f51c2adc9c045c6cf32235fd969961cc986821fae213e0d2aae256922ea2fc4096f4a08af000b98a93a31adeeb228d1708e37347249c0d6fa508109a6991551c038c28f8cb734dc55647bed0c35da547d4ac8b4b4fec43bb0fb9047a66beb07a688d32937b03d4d5bfa4b9ddc109d80c3b99d39e51a4e807c5a5d41ed16818294987d3e0294a185b355410b033517243f876a7372be0d8290fa5144ef4c67631d88c0ed8afd477b281e11bdd4166e15014b0fa3d2123ca34390f8340ebeacf1d22477478571a4c849bf64e976ea70f59f2305613e63244fe48ec908fccfde9ea90648be372990c3610d507bf882006a2f2cc37ee0077d00fa48e98a3d49750cd988934240a488b3d0de252568496ead9c9a39af133071213883694529cfdd928066fdf80fbd52b44913fa54a309db78bc8ee59904fe2919b2c037e36996f6dd784a65f814fabbc6c14c434495b22c72459a86371f7e46e4835aaacf64641812675e08a97cca53a08ceae127e897e5bdfef4ab5e63dab6f1eb93392fbc5dcd3abb352fdc71680e73b14253f6e8bebaaaf26b1398768702ac1271792e03a7b4322ee81cbc8323b34a8a4b5e29ebbcdd8e32a42d1c9fe5c1bab6293b570aec7d50e755bc175c517095724c91756cd278e9985674214d7d8c7f6e3d5441101b28731158719519ba11ee05da160a9bb2ef7d5ed6304449d779bab6fdec650d4e3c16bc96ec8da9d4f84bdd01e242e3a3e587b7887945e6a80aa43ab5da82bc48eab6a10f4c42b25ed3d18ebee008ed3fbc7494f2860a44fa7ddbe8bf715508086a0b14ecccdef51a32620a3edb152ea26b456ceca9ce85c325c955ed90179c8b1a5997736caf6c54ed65387dd8b4b835670f876221cf12dd2a3bc2afb8acb3d742516916c0f6979265ac5eca408c430eb87bf37c64704791843623fb4776f61d6ca5ce9f10b33b3968325f3bc7766fb57236b0108858c7ac1d51e59d5b27181d2820f3364e3ddeed0b9f257fcc9dfc79b1bc144da3cb32c889ac79c599b270615d4e7ec3e84acad48109940a54d24bd09af8716b60a0aa233b26bc731dcd0f681baee9068ddb8bd3224c8e21a6c65b70769946c1059b6917376407a0ad99378d21b8b9aca4ba7fcf30eeff2e4fe3f73a2c9f4c09d5305d6f520d6ef9d343713e8bcb75f563bbdfb846ef725d14a9893ef9f96ef5ce2df7611414800286660fd41a5ee9d22b69b1ea1c08241fc5c797ad8c59d2247a0d36b30c3f37b821f66d65c2a4a737c8dbaad720ee1d268908d4d9f150494c3ef3ade7cc22b094e963efa5059dacc03e5a9bf50e0f07204279e160580f64a52e3b4fbbf8b11133b02155e91cf5a54179d2653c38ab7d9449fe9ff8901835e99350b679fca2625690ae43ae748812d17a88ea531dae0189de501381af45dd907c736f1f6734c67d033413f6a46c9c77559a4b0f819e4ce2ea17b633db35609674821e227881d5b42e7b1c50b39a8823c8ba0e8a2ca037b7e886989e3e9636b7f36fcd47b29fc7ae6ee6480fe62bfede2fbbb7890d55b576dfd6b5fd03f81f3dacfd9320aecb5474bb583c1038053ceedc8e5f7eda93ce6dde985d3e9e4f2fff4e91c32fdf543d376e6d27fb77418f3ee19c4ec11b7806e550c52bcdf7444b41f80b8b6235d38f87c847064433be035892df9a4bd88292d1605504f447e69a8d052fb31a289ec678c2fceec33bacae9c2fbf63c28ae6129bdfef94262c2fa020aa9aa8f3955f1f630541855c108dd0c58d7d2f8408be1af45afbfcb1bf9377a9f637a997e4ddde0a6df38695431799f3d5f7b19559324ca1bcea12d43c62aaf1acaa1054728dd1057909bcec810a30d58e024095c3d57d3f2b3a547b3a725155a0c626d1d15daf8a6e6824b233dd8e02e671b149477fe4acfafd60645fcb4bada94321a623065fc35e03b6875a8a6c2b29c052d4291fc6733d175f12ba4c695205129b110b20965ce70fdb51db8e213f2fe997530cb4b17f501c015e718a37abc96055747b493fc5911bc624b0195e4c84bbbb8a471f8ac5a43c7aaea274273c46a74a492865df1ad44613f60fb5be76e5c046c0c817d6d7f0590c1cce675dc3e9d6b26d3df7e83cc059d2ffbee681845f901e6afc22f6710b187b30d14b7315c5542397067b631de6b86ab9badb4098cd82d39d633707b55234ae8a0332056030e1a2165bb300a0fca4feb484cb835eb0e8414d512c745c20b6894c1674c95942d8afa83cf29cec04c35d318261b4f65adcee0d3629db59586f04e47f15bdb48130d5228ed18a5c52baab5a5148be9383b63e3ffa7e162ca31b6b75d5faa4bb45142b55cdb0755d29455aca3c52562e34e489fce790653a9c1956474f194d1c66024133d53074b57b28da4f2b98884f415a2092e59273b798bdf8cc85994ba0c5c65203b59782a120ec1b134830fc50f22f01f00343a42168652d34a0400bd55139973651154306e9de645bf88907015f2e029938066fc3e0c03bbebbbfb31360d6d3053c912b9ec76d2c2c962fedcd72b10ddbfab8dc743e02f313b06d8a0827e576b12ab069c26d2d14fc528658a9018647f5a538cee29d9b83610bd95f0ee231f3ad5d69106bb14ba3ccefd4e8539c5b9416af8507d6620171090b148870aad370b10cf1abe96068d9ffd52e5a9a4db3545552ea7d9d6a39c898ca88c45291d7950937a6b14cb1c439e83a204dd8891d53642283a858c04e543b427ad7d78293b795795525ef563c428a02a16484927304851e1f20e2bd4c81b1026aa9365d43b427f1dda5b1651f6e0dc5091ca397bf6e38b55dbb062083bfeb7947e21d0936fc636e49db24c9a4da14b730ab70eca23a79193f70349bdf486207cf1e21777edf29100895631331e403185813d618f5bbfb8f3af1795e93fd82214ceec29faeaea8808f45c2e1c30451116ae269402948ff4969fcba990b72755149094d8bc7417c36112d1d05e9ebc46683950e9a40ea7cc0856371fa25ed401237f29d5dfb7551eb4ce2f405ae7d88126dd93b230950aedded361ce88d03134f40e6c9cc3d1b9af9465a1133a8728a2cabece51943646080e056d45ff831b55889668469d97a6b351ddc259153356b58dac2a807237eb1b749ffebb518ade2dfa34886a8fa15f33f496ff6d11fc196aaa76f16d6116b11f087a5fc861a12a925cb060d555e19404f8ae51f299aef343a9f47af156b36f22de22487cdb01aff059d3049430cd15db152ab28885855d2b5463ba1588e37607863f98d4eeac1906ff7ba0e3470d323cbda00bd2565efea0a0cf28acaf9eb7d7c9f46ea865a3871b3976002843171a2018cfea5910c23d604c2f6d96ec488394afc77416d77e3c69b2703884b7fd961ec98317a12128c774570a887c728984f61a30af952288b19c623513704b0815c4ffa18ad68802a8c899e3db134168e549f38293757efa98da21574cc5db5b071bea6008a6516641e6a147a5daf523ecffa1b3f8309ee28cb9b44c6c46658fe5c258cb7203298d011f8b3ae19ba2326624bb5b3dc2d3ae4d3c655058a55a41ad4377810f9ebd6b8057e2042e4bce705d963a47f1f9a605a53441c446dd98062c36a51a0a28f2eed0712ceaa6d92fae4546d6dede148752348071fe27bade361a30fd8143f680baafdf86cdedfafccb22c265514dd10509507f0e15680781502be739ac389462eeb2d5f9ab0254eec7f9c7a12c6a68df63ace5c5ce63f80665f77b39531ce2dc5a257b88c297bb30d7c1f2eab9f7bcd9ca07ff991ff43bc78f4a740dc3698c6fbb1dd5ead82621d5f324236d40f42a5c158965dbbb8a95cbac9adc0db65a229b2820d85c7167cfcaccedfd0db7540bb0f68350a70a142e260780860ba182f8d4a83f54478eba812b238b2c4445eef95a44cc39bf868001bb84b4e7740571f3d7022207fcfa119eecf2a1cda7ab870d5e8b4790373e0660c746e7ebf293e328171c1cbbc8ff6546cc37ae35951cb5186ea2964a7dd197a614afd399b09268cb29569eed260245c75a8990038610e10991808b7a6d78a38ecb2bb07db0dc149e42d224dc2295757d203644424a4ddb18b64320c744e4c3f9b868f15d1e85e75b0e6138838e01271016a05600551a57c67e6f888c63d0aaf2579635cb6d3646748a983a8a278636845c008893e63052819ef086962dad9111098563c6f70b9cab14fb0972b00a15d41e30dce2872182f949c8677111116884e01a34b8777c5902c6048e223fd5db8461d90af25808b2023829baf3af9aaa2874f556671928c0deab228b2768a09c6a811d147957f184f50a430e32d1bdb4bc47b484b804c5839654d674a04ba93953a79d9727052b63607f0200b2e8e27be29944177a8d83926b1f682421507abfe9d3f84476082b04dc10d9e7c8a9a7d7fec75164c1da8c17db461b491838467a2d351bf2bdd4338b27f3eda5fd3b94d06a6adebe3f53629cc47fde0e095dc2fa6b72d5781b18fdfdb27132ba86c6634146447e71b8de46a39def5ac5b9534a67a21281c830d73668f9037b706055df2edcd87aaaf38953299e12dc45cce2714a7fd785430caa9bd1b688848acf96e90bd0ab2a82913fcb04f32f1dc3e83e60bf125d60bb510926880e8aaa511f84e83f6106a382c790e3a15105fcd841e833a88e95f851fb07b96c63d6da48ae447973fca83b1443f351f1d5a1c98cd264a9f3b020975e82cff6605fbd7dee689be8d03f2678f105aa14892937dce01ea4aea19247cfd76f25d1b1fa319182204395e026eab550127f37e9b8a185fb30b2460162f161c0347b71e660f50ab40b5b99d4901a6824c47edd358a22a928f79cf854a7ef8bd83db9cfd72402f8d48f1992f48eb7a0fadffff5e300334f3da7882c5031085d6825995a7ab25e8a457ff56a4cb45bebdb20c73e920ac98b990f8a2efa339bb7f7670e64dd7a3a6250683aba7e5e0976339eeac2eb5a6b2f8c24d39adb608050cd8e7b3409a1700d933c01bf8c62bc19629099f3d2af9f89880f653a0be6d2c35b9c7531fc00bdb6e96e28eae7e2953a98455c26639f0fb6dfba52fa200eee9cc385785b658530aadc23a9a13f974c466f564b0f7c6e124758eb9dc05a176fc1c6bfdc33b320038874f8519e15a7e2ef28404fc119d103c165f468070e94102180d85559cd43a502e63fece4cce11a372810a8ff1cea07701ac044e7afc9433c005f100156139f7b87c8dccb439908ab01a6f3c893e224856b2e7399e0dbb2261522d303d1cc5b87e69d1124a0178bd8c5d168b7f5c2e6d754b99714aa34e28f95d429a1df2925812376e2ea3555adda974bbcc7088518a41cb1dd2b716c8c56ff8aa31af038c5135557bbab9a09d44506250ac5cd413e454a726ff7e6f794921558427bf978e7c1ddd2c7da4cf5dd96b0849aa9d924883d97dd542aaaf2fa970a9b6eb4f87a81a9e22f871e0de9214eb140ead78a2849fe3c9625a01f18f3e6dee1bd0a05d4b12f8494fa3930901ed7302e8c8967c528cb01c3f64c749d1cda990b2814c84e8bd2ccb51543017c17f4db0c747d02dea31a0bc433908a6e74114b29e4af25c2547be5760777ce3537df73612496e971bf70d73cfa767b327f9522eae7ae2ce7d072d2970c57c180f174bc30324c8f55dfc067072c09d106d7d4e425edfabe3084773226f9b1863bc67edff58293f133f7ec344b5cd3a81a1656aefd0bfa3919de34e2d1a78c592461c4876be2846d5f5765b143823b9c46028f334602d8f83c27a3e66649e5efe22d904c3d113acea92f4461cc4a4ce49b1c29c38a283420401f4eb8bd9b81a575a63c0224e4596086888715b31659a628f0ba199c5ece988824dbfee0727e0f2e8c0683bd637866feb545c610930af1b8e44894ec7ee966fc5de2947c72b693f647014b7ae28a343efac47a992a3c80472d4cbe5fd68dc0c46adb83255436a5f40fa6d11f5d04106261255f3f93a2460686f70b779ac61c00dc7dbd3ea3da69589b7be19886bf42776a08d244acbbd15f83a0b9f263a3f513c2dbf7dfc9231b575f9d1a7eada314453bee684fa082ec02ffe61b8f400333accb7d7dd0379fadcd0ab8c0a911b927c6a0fa8b789ddff607e54c3c26e6fe047248e975b08ee3e6aa21baf3da32ae1ab6d7b18128c84d33815b0eb150c666cbd308fe3ff18f43778cc528d0c4d4a5cb868912c60d353ba9ac513440c00d31e7c6df3856b67be1d2143e1ffac1e5d41bcef6f937327b4eda559e5fc722672cba0c1c7868130725fd1e379db1f4c6fe9473e4287cea551d2b119ae8cbec5111be3b27375c7f18f55b8ce7c5a4b37af360baf4ab4557446fdede79699c71e736bbce7fcee4905044a244778b5c1e6a669745cf072223a828e00fd09403f5ded0ebfbd603ee9b1ce22057eee0b7cabc0e0366892486b9db6fb2fc3dec471e72a57f5c71aac44a49079d8c981c02299a829af1688e53784ee830d6003481f6c5608baf498d5d1cc9a51a2aacc2986cc0011e10824d34115544ec61bf8cb42a595fce1bd906304e74b86da2acb9430f06237a37363e15133813a04e830e42876e6dac6c60b82a919cba7a35b3f4ecb1244154535a79501e3d3f65bcc4a6ac9b61d1d894f35753230dfd88b832c837452f4e9a01ff45fec4b2c5e478a9001f61da7b9b1a92ce29bd4d5f825bd1028066d2f4575aa5f80613fdeb839c02745ff501740f8b6f531d87bb0802f0aa57e7ed504b0887eab629a95d3955b917e0eaf07e22ffb583da1dfacbb040b4e6aacba4a8900d2368c9ce267e0344ea950a0f2d95780f01a96976d2bd7d4f7a74b39643b92a8b3807db6ad8eccf207d3cb1f3ffe02f956774ba98e9176c0f43b96ebfe16bd0ba14819d50e7274477920520a5538d4ceac0833f0a7cbb20e883967994b0caa1cdad349b73e104dadd322b217f86cbe5dcbed63882463345e4ce36c2d05467c4df350fef86382750db14cc4d62f2ff54ab8d16e3a177a3ccbdd3fe3b53c2dcc6dfbb4d8ac78b518abd9ee56afdee8504abca230357e6c9a56ee3caf566415f846719faebb0cf6b6517f0a53c7bce62bc89cea8cee332e6225740a2bfcd89610724c2d87c0f84f1db76ab2154cc3b892e38d0c40396d2cd0bcc5b62d69941d1beafd53a389bae49b1d5603cdcc0b8a2570c3e7f29c4ea459f1fa6db4c6d37cff65225138f47c4198a5a9211e0b92f2893d81f9b356d0b4297a5e0f25038c31e9c6deaca6865e51eddcd3be7065f14dd37ac4e3f65051b610a5259df2c62096980bdfddb721e5b02d19fc4c8b3249d57163982c8553c805cf712c36a5126e609f7a2e2d62d4d9dcc1eb5bbce2b51b6ca143c98711a26874a45d697e4335f9ef5d43b0a8c75aa9c738b176f8f421bca515ac3497a1023eed645ad6465bcfc9af050a69f8deb7a6c026fbe864ead93484eeb5c58ad930b0d36dd0c324c96ac07f5b40e7d1ca7728c197e50e375fb4fc0a3b1d4b8144978f3076dc43d151cb2eece46cd8366a6679e0798c9b80f4ae0ded9c1911d06db6dfe7aa84cf526549d27cb6983d174e394b83c3a728a30ed074c8b2199c559a4741936980b977c7f55f25052bf971b4081cb61baca129ed721777158c51b7e2eb7e04dc11263557cfc42e4cd936d0e71cbe2066ccd834f8134d5389524b1021d97cc1b39a8ac1404464570ad72cadc6e4bdd76f8e35497558be2ce9d842dab364bd3c713ed5905e68173af36d33456664cd53a26d9c76e7559e1864dac7791ceada78a0fa6e0068ff74787d199117d90290a7bcc18ab49797b2038c080b66b2f049c2cbddd2f9ac5ee5b6f88ec9db61e6367755746d508fe1767491b243294bf2e2a09b9631a9962df5731e8005f64cffad10795b253fd885243aa06fee610d269c3730297fc9fcbab4e0b5757ad208df28620b5c7961448c137c545469d547427232b678eaad519c18459a8c8a852b3eef82e15e8bba904ddcf196465cd17a4a2b3cc5a17473485c1c57b5fadfc4dfd4b347f85ad8a6bdc8765898f8ea594344e8820bd11aa204786b1286ba5e48ce0a6ce1a84ec6f1f3886edec8691f468ab3d13424778ba76684b7ed2670a7003c15e9f8e6e09c70f28c4400f344cfd65890848ec5ed75ead552ba86efbd233618be6d06f556dbd16adb2ee2030024c730ac33feb11c6de03c945cacf8e83851621b8b3639c57f7e6b23411304869ff55d9d27c42c2661f85992139d6f03049b25ecdd289cbe622bdef1797ad0a0fa95592c7389c11745d5e5af68dc489aa8d85d2ca70010b4604a7d010f1450a583b1cdad048011b6468224ae54581e9b7c15cce09645693d2040ccc6dce489172688c79860534eee5a80568b411a1b9a624d722c1a482b2dda04e51a1a45d0c3b12b86247c62d8e363eadbdd8a8e2e53e62dba628dff92502d60f111699ab1d5c948f0d109cbc0b085952f7be9df0b04e0534d78cb682c9428c0c88ad6686dba5ba41db33a77bea14f0201f5a015729d4a79c747097a2fadf97f741d2e345d65e83645919f8c995f9b85f0615b572a61a80f9e88d0d3da104d097f692ce66e79eec531202b84fb11f8bf467737a04db637d2dc6c9874436af5bc0a0e776cff48306692a77ba6ba15f45006a4b35e90d703f1d83d2c0e5da80d6120c04b60d4168d7a8eb97daef83a1ce51ace4fb2635445111e38e189cc844b6c0499b6bd5195a9c485f4f8f674038d06086d058a5875b93ab80c852c40c97d2668d6b5c7884aca211e57a9c1d6781499e2a02915c959da4357046031cf1d4d667667b29de9461a506d2e38937211442c5a789d4317ebda97f569e4d3c38ab9d5c444464e7c5403751f15470e0507c78163b3cdeaf4a125b2cde117258c0bf7351a25fb106ac7cd3adb8d6fa5cef6d5e83bbabab54aec1ea42c7df4f6756c7559b389528a24bfc92be09397f1f2c3b3b2222a8406f58262979d92566010f1a0c4e53c5872688512a80d43b46e3ca1089cbcf9fb61b609886784e3b10c834e4cacb636e61896e763a7e2f256289c588100422715fe844ac07b354c01d9b3ef89eb2e67a3473b28bc7940c06f37cf37e0c56832a80714fe8a3fecf6d19fafbc31818ddabab4b2ff940dd7f117a6b54fadfe78c0bb4da1fb799a497401620467c189142f9d4121c44d7e647a47c032d2fc9a03d4ed6a6c0f3555dba5b7897460cbbfb3c08c119738b069530ac4c1d8488eb567402cf2b0c290306a0f8433b7603dd1a8a4a4ff3edd86313ce02e80885595f699bb5469f668dd73dbcd4797c522f6b46cf901622e5bec33a2345a4c72dca52c34a1a784725cc89afd13080cc7bcbf33ed4b543234c8acb4835971c2d3df9da4bdf4aabb1b2bb6c5f09d1c8368d01a13de2a5e079a7bde6fa20b8d0e38fd5d7d9c60e3200c3f6942725bc3b05278057be44fcc6dbd6b0b8fb4ba0e37fa116fa6de2ac795f4164c8df4e2de005187fd1f41e89441e8f5116e437f809d02e9933527b4a5c7eb825b18952723405421b978abda003f6a18fcc95b5b85789ff1a7a3fe672fe3838b6017d0d53d2f43862a84aba4498a9e6767aa6b0330acd843fe0b7aff2f80e794e0c4e4c6dcbe3cb966eadb4386d59ec41a9f3673b0215c45c68b92c8fb045b589bdab79692698a1b846dfc4865f9e05ab7a1281866fab77fb69bfd918d05baa707648eab1b0c84a257b7c92853910f33b8b182c32800791808be6a8a7883140b95e93afcef40138df1b75b724812589c0096709026ddb4ffdc2fba8a9b223e690617ff777933abf7c59dae3f9065ed053b22aef3fd07384d78dc6d55075f8d3b42fd5589a82104a85a6250816ab87dfaad46ec003c2ac90f50713cfbd7e9e8cba09084a058d25be857195a21e9da093b562b3224a87d66aaac441574461d7d54ab03e549b922f554b03276cc9e9e436c2abc816db10417e0701903cddf4c1201126446bba6eefccba1e16ea65621da04d883fd8eba84907977901d51c17097fc40d1f3449bbde16733578261fb5b30d37ea72812c55c7c2464d1abc70cacc73e930e374d3238d57bd948a5d40f514864bbc2bc3c040a13cf6413a37600a1488e3be7ab77239d251799f115b499ff4a508ab87213e42db1cc19f1a814b0bf05ff82bf07f60571951a7461aa1fa96799d81e191082e145117320f884f9502a22162aec3905234218b2a6439611d89528d3837f38c6c6e6d90a0bdd12a1359c997f0d62a278240a12e626e0631884464a88d18612750b762ab19f98f327d9cb2e3dc7adabb1f70483ec8e8f5ff1667464020f2aa78cc8edd9808aeb1cc730dd5e263aa097de3463d5330261a2a5ccb59f10eb5b11468c4af56668c2723fd3dfff07b104154059d23487c53607608e055c1a9f74c12a2b31992f50c1b458ecaff84ff923f5aaead9732f296d8be34584cb5aeac6febdcb507cf3d6e6383994e04f09368ad5ff4b1b4ac75c7101dd9613a593058f2c82714ae5b042a9015fcd0889dd0e0381a5c2a1abacdf62576a4f6ecd7c25b998b15d272356c1ae8493377a61f8c6210ffeadedc98ce1618eade2c5392ab19e60b2932e68ea7d350e4fe2a59191c8a3a8d9c40d8286e5f350208f6c157e156ecb5fda193a15625521e048494f6bd41262d85a998ae9811894b23c272eef26f03c72cd0458938c098f02e45631de45514777273e6d27fc71685975ee1d76b7c68bbc9c817ab4ee02309907403901c9ab16df03f2c44f530549614271352959ecf5c78e24bde242ae479fa548820e6f6f44488dcaa21c3827ffff88f8e1a16ab042d4c56ba74cc373127f2259e458706db70548f81c13e0078aec3eeb45b02ec123fb0996c1092d748f2f37c61268a5a510fe19b5557865c1586e04f823d922e4521914226b3dc0717b3c18f623c2e9f6d8f6a023936cf0d54472ee4a0543e098f08591b8d969db4f52e2383af4254a6ec5264ca07132e71ce9746cab8933625cbd8b792a81292c25765bf043086208c1d4464d12ebce431589411d7f6a79c49acf7eda43c231ebcfcc965f5ad5e2caec257aaeb87b1266b109084a326500dd549d196ac406e841df09c4bc56f2e430d562942de57d8614c58662cdd19091b201d282c0688d386e559a8cdefa7684af0138a685c96b26e595b24d53008959978d1632691b46e85a561164ff36be840a8d95feda2efdbf0ea16b0c26072ce9c00154b0ecef3beaf4e5707463accd5ac36cefaae6c97fc2e99ff4e299c260c528a83c056106752cda62f1122680a261ab7add1ce3de36dbb50f6c6ead69d01180c36a787fe390c17cb911d34ff10f0999449e2f52abf917584d382622e4fe5c4ceed53a3159d9ce830f0770c7304978cb65f68814b846484f18ad6498368404794975246446b0e4d1568711157db420f04690159b77ed2a63926c40d2ab00f69437eec557d29a10605e19a130b837a6b22e8418aa3be536d3fc74c24b1078df18bf322ded64c415e0e8a2d1080466e6752630f41b0d815d49fe181d6908c2c80228ba0737e3432ace0e169148b3508973b2bb0b3708cbd9e4d022762a34c9b5c4abea7b3f3110a7b069b14f656b9b717afbe7b183941233901cb706a46f2c44aeff418c9c3b3f2063f5e66ec2e3ddc12d5538c73118fed0de3875b2247a3cbe620f802806f2e8c8f972332d80f736a8facf8b647a0e9a444726c4e98d6453fdde0118fc55f81ba5400710e47aeb24b185d4d8c5da13c3b3b82f8cbd2090e1730ae88e1cc78dd65e45bd2e561be61007ba21dec17b8e73bd9b6e535439b91d7d1ac661ee31d3bb1de318d70bcda630fd485c90d3dc42a30b28d235ac5d60bbecb68fca75affe6a7e166eef0aea5b23a029de2765271318f36db3b01633a081fa494691ce5a9b7719d37e0f507630eadfe95ec49014a5ae856f81258beb04d57ae60506f0b8af4a1ee4641af27360d7abfead70d695e44b2c62057d73d4055b0f43eb081ff24581ee684097d230df4247543183cddc01122408a0db5cd0013d3028d80d39a049b8cc5eb0ba9adcfc2a415cf1034d14deb02fef1be007738fab72cca8b114aa8cd5a666b5db306dc2293e441719a99f2d6e6d2fff168c2e110a2ec06cbb58243ec0cf0c059159629fcc2615cf61db6b532fd369bbae1bf5d71a18fc1cd949d46cced7c309d1742e2843c506b9d62a479e29dc6f38a63e5821c08613e473153b8829356f61351d48db9565279562cd4e0741ef09c6abbda08a6436fbd40d27bdc904f8708e86dda088c9fa6d7d9331e500123e32607f1c3e917b73cf24ca571244679662c44efa45f63a369e88a607636ea5cfa45242d7f8e0f8eabfb9aa5dd2d65cd1b793230e426acc44e390f63a21568b3cca4e8bf29a913419ed438b1fec95af71295187fdeaab7bd028c6b28cb618a1fd2ecf555f4ad8215bdacc7e8a767ef6ca577f0c6430985c345579931e3776644742d0866f3224af7c088e0d21cd391d48c8d61c64aa4c1062ba6e271602a6c6c0c80975a6277db84e62cd06f190cbbc8193541dd1029656b948cdc8a96cd7caa1cef068cd80b8d2a2f6e655f88522ce74213a77be10155bea4c25e89672543f3a015bfbe9bc25e9d7b08c4b393fa514c5514f6cf04d2af29ecc549945129845844d517ec11d15c606769d8e66897648cc1058f68038aa3dc334a901ffca029bc8eeec574288e8a3fb8f534dd0907089f70a341a1926de55e4d99b09e893b302a1bc44d847f7adccbc9368e30ec3516f98b15b962869a079864497973c48b14f7b1ae435406ebd0d49f956449f8db3aba1d35101db1763126f5ed5a97b580b9870d00a4e0283a0d23afc07687fb2914d29ca6fe56ed4ce266674fdbf7883442bb632a93eb08dfb44075d6b774d803af6aac448f25f0176a49067e52288eb194964daec87128780ff0793f3bf9c7a943871000ead6c7bfeac7a809ba9dcb87a7fb1c0fa9c015bae4098ecd10b727bda39dfdaf8b94914c56068aae0787c3bb48ccfba851c3319801aa631c32b6f5526a878866143689dd82cf5178a608824690bda1210db6b1ee762e83ab59edbc542e56a82bb2cce272e6a5e8edd4a7c867eae7e9b31abfc3150acd77f3d94d453d1e8f3e44835a0fa90e033303ae4520805cb72754122fe068c704cc6859f17803881f2810b3141dbd7d7993228f91a41a767fb67de2efe557e3e0f4e96ee23a866cf8a0d432381aed8e72096822ebc5242a1be28a40c82e42e52e46b7c3f617f0cc78b96182c5f0fb0d29ae24e7c5aba05c51973c527104ae01c1190bb1a5194e9b31be62962338ca800566f1e3abf841fd57e6e26658c400b28604a2419f7b65d19429a6a194349611de245ea78f435028f87c2aa05697033076e49263f34d12013da24ca4cf8b6c145e4368141fd1198e92ee542c8fb8dc8dd315fb9b866b88eebe7fff9dc463b43ac5456b2ff8da2110e91aaa03cde689b5bd7d9572d6095b2ba2525d572d79387586697dd8b67242a7984fa906a3ba7d3568e34267bd9949b36ec18d3c77d03eb68040eb6b03dac70749c16903402bb27897b445a62e1795c5b733a495ba81eb45ac5a5304c0c4dff93b913956812b86a84e6e3d1580afe74e595581ba9b44e9ce822171e22a2a1bc40a2e4314fbfa3174da49844ae6f7570f534e09305dcb386287e91c80001cd16951c2fedb65a291d5fb107f34410f3f19ef9d196e20990769282308f32318fe2bdf92e26ad7516c27ca3c608d19aea353709c9ed2da9b2971cad5dafb7981213522abbb58cff9a769d10bd28d237c5499e381597e9cd332a119fb59fb6fd2245fecdf287d3d1500891bc88801aeb9ab207b7f48229763d9da7ebe10d4e287fbec812fd3313c07cf2c6c1c75ed7254b637fdb44f6e9ccf7bb9bbf5d2cd16e79fdde1e89473047d7c5ad9cea780f73f837869a677d1c2da1830be36e8180659846e022b1684f6dd44854fd0367a132f49d063924a2b4e190b1c9db476ba6d49938fb7494cde990bfc4598ffffbba572791a0ebb96124e558461bab2889c7b54d165fdd178d647209a2400e51b3f258e9fd038b91bb691dbe3285aa6d0381221416543dc187aeafe8da220b2a03bdf6e68ce417486e623d7d7ca7fa2f1241166bbae28e6a3dd5ff6a6ad5e78ebc822c4b37c5bc58d1d1aa07c0b60a7fa8f45ccaceb6b5876a9ca99e1fb31bbdebf17e112562f707c2ee2742deb769e53500fc3594803c091e51d9606d165f5925514fe53080ea306d4a1e062d18cd1545d1b6c2665a78eb8eaf93cab61a493bab12a7cd1f14c4f6ca4f580edafe2770e101cb87ce952a76d05b1ea3574b7969a1821355d5e7caeb8cc9cac6c7a882fa7fbb164f58b2e4809be8a065d1e4bf0231cd095b716b59d3dfac5dace736dfb667d45ce0b57930550e2642ae05338256e42c69d8fcc4e893b84a7d9e3ea5956079b81a88e53a7f2a2cc8e9852c36d979a1e23541b7363b277f4aaab9b464703bd6ef0c7e7a481a95857392e18b9160a647608ebc4eb12ad57d6a662c462f77d2490b1aeb309b0804bb7228618a48466ab25eb71720154b244c6ba10b0ec60d66552107ee9ae531c9fafe9c2dd017d26e1649e24623c85869e9a43bd0097153ec0127e523cc1b3dd19fc9aca405a38da37ddd47d530c7c7f7b9044f4ff657b8137f6f06aaf38e37342e51384bc418ce1bd39c01453c2468811f2ef320dcb7a928ce8f29ae8fc326122dbef6bd317605783b72be557c6b2dc5017c56db898c9eb958456ff4c79a700a02b09770f03cc195de186b2da4c778113bbfb0c103a110b13fd2ff95eeaf8761d7755a7f31f92f559b5ae6a25a18902c1e5ccc3aae584eebae91eb9cbd7df220cd2fc3bc2c35b2b091a3969cf82fac28af9adc6c4227c952001a00b4496a0b25f90c854e7a65cd0705c000b0c04c42a963a508469d10ed4ccea39f9601b14bdb21c3ee3a880f16f875ec5e412501fb700c26fac82ccb6dafdf300ec654b2d490154840bd49aae2bbf8042f8a92e77290d3a1f9c796e4fc6ccff1860e0d4f9656c7971f2ce656ec7b847fd7dde3b7fb56f56617310aa7704d424c1bb52a4bfcf5cf7513d85c0adea14026fec10421957e56a591c89ea2eeb5bf2ca78579dd220b9fcf4f1a1f4a0be6ca857118926328cf1e00bc0a7a20482e4a7f561dc35f36578bac4c5429c00f39f1939b33ae3404ea0fb5748234ef26cfe886e79dc64b2ce720291971557df67f04324213185e20285bf84562920a1cd7f12dd33711a91c3c3b2af47b1e4931b51dcdb82235c24040f8cc559aa2db8dfd7488bb7577a29b065c264c4434645aa5e2b1e92556b55d37848e1612d4c02c7f364af288da4cecdbafa1d9cb510bf7e2e8f767ab339d225fe60ba122a36851154ac2d85f5bc443659d2bef6111d378ff34b26733b240fc8f3bc730b6ef485fd40ee7e4fe64c80f042ecb23f2a02396f21df0ef76b780919967051dd509bba28c314f90412c4167679f2a0b0becad46bd3ce03369912513b661695fc3447bdbec44984e177a185c04022ebfe8307803f72017e0c6c9dba9daf153aa4b2a067f2f7f9d729e3ad5cd9902c210ceb435d4c778ea563048ab11b26da13b475c40cb8f5dc11be7c6fd1a3f1e70089beaa3a7ad8d1fc3e8378da577aa2a28f3ba37b4652d7f9688f9c004ed0a06654a1366e951f6416c70e5f6430ec7ba47a18e0dd712eca7f1dba3b1e1082d4bb0619e1938c882215161be77a7b96613f78108482ac8995713183d7fcd3602f9da2b43c8e49b48f0c328a527c2a7b21c3cd6f2c2c7e330890de29e821e4112032921f08ade80655c16a259a16be5cbfdfd0dc10873db28e7806226b6a5311171e0c698a334a8e9d38eaa81320aa6ccf24c751852a8b9e6bd4471182bb4714f786ae5e5284ca2858b7f166a2949c4e2316e511737f82f4876daeb3240b6e835c27f64e01b9b4d444e378a1c48f33040f1142a1899eeabb0d6f4fe8f1013d27de7cd07ba2de1fb839b1f7033d4ebcfd40ef897a3eb87162ef07f4ea80ef37b87562cf07f49e78f383de13f57ce0f6c4de1fe839f1f6033d4ed4fbc1ed893d1fd0e3d1dd36d35a456a87e58a5c718b31c35d68cf75eb607a65a7f77c72fadb36e38903d429879282f08f70aaa162851eb1da23cbe39d06914893c82ad0e50c195deae03ece76d1e4eae94e05fa7d29bb97f014773aef78245ca7758a48225e1be81ae13d01e21e59f4b7b308fb2c661ca35eaf18e85680655aabbbcab43f68740b952cf03040d5c1d1378b1689705235f54db84df570a1c7f054ba46fa20c5bd44d5fa38c934fe5688e8abc94e36db2945be12ac44b9f14988f0bebbd37de0265ed745e2ba8319eee39acb9c8ee665940112ff2d91dc5ca77ae690b7aaf397ec9adcbfe699a1d1ee5f68dd2e819b708c7d2e16693ebaf7a932a272aa92cfbc479b12deef491ac8fa04c6c348249205b718abd29f90b3dbe9cd26e407ff5843a42338578a8cdac27611baabd641b3ed5367d3ac32197fee01e89d9a44337bd5b535013dc7989fefb89dcc929d1ce37fbb10091de73ba86162f49cdba584893d123e02b2c62801e914780d98b79baf4c739247848f40d6304a209d025e03f3e6e6ab698ee491f0119035460948a7c06bc0bcdd7c659ad3670afe44de2f72e41cd6bbb09469064f97ff0316302fc3a0f05f2380b7b147a077fdac82dffcd4c96af88fcfde3e696403fc03034d68ecf541a336e01f08e88566bf0f1ab101ff40812614fb7da6b10df80f0c749bc19e7e01f7f11b60bfe58a7f80fdfe04dce783e5c63fc09e7e02eef315e8b02e3142c7ed16a30ce2857d8bd17ba94d5fa95f649c32bf9808976b6bb8340ddd26ab3705a6163594c16ac290bbbf442e8014b960bb9062ee04f038252c9b16aef7d9356e2337972370d5a7770e30a519dd129f8c8de16f4e5ec7b971360bf86da194c69a2e83d0aba664fa74d32763ef9ff92c6d53210707825370e480cb5113eb21d6e7a4fb0b4a1dc75bd1bbec8525c3812a165e7272e54dbf90ab8d0a225aed4fb709a0bdb60c9aaaa8b2e9d2a74d88bd2f736b2ba7745c1e064d0bd00e47b64495d8e7a4bb0b4a21c75ad3bbed0a25c3c13a2da92d7652ecfb9f8e538f8b23586ece7788a405fe31c1ed5e41c869175a2ef62188107007bf5c06e9ee50699ab46926c4eacbe42c95131d178783d2026887910d7aaa0c4aaf9ab234a44d9b887d7fc6b45bdc617b669b420e4b3c72efdb0549d8621362dff8eb38755424c27aeb7c4166d382cb209f936eb5e11e52b2c20d564b523db3a9ab107292f1c86ee7349c6129995879edafe3d0519151ebedf30b896bc17c308c1b4b277f5713722a551a8e651d825f6b19f4612fb1373a292f66b025d21fd14b22b91633e8113588eb765b2e5cf2c809ea6021b2e5f30d4c8f460fe62d032582861019987071e00e448f583075c803b5b0eab01178c1d40fd0bfd1d85d2eb6b0b7103b8c89cfa14b600b41671a859d6a87403ada1b752cf0706504973d1649b3cbb3051bea673f6689b3e0c1209e3627418ac70cbf4a903d383cd16c04691c55138cebc8f89e97b31e419417c6e099434341b786b69cb251e0444a4318619c03cf9797fa9d68ef6afc556383c2e72bb8acb1252d16d4ddd95cbf31a6f800b3e0bdadf26b0b52f2ca020e98a59a2c803b2c6d4c4bb617ec42cf3c002965ae82b9aea3b7fd01aa2e4ee7fe2e0ca20aa4490c167df2a64698ebcf8b0c9031b80ea30f21b6d5815521740b134e2b46dac93583d437db52d068bc01c5943ce0c661585716788f157bf5cd2de57c468c0115779066d32235e13423c14af6339a98cef681b56a5dd1ca8f0c33bb72f563819f321fa0461373b72d69d42d7154e1a0855b54779dfc77037a2774a4dca76a6558014267777a6e0130952daab60610439521aa31cde796ffa3cd35224008e617335af196492fd884a5913bdbeee83d5b71df246c72a38da171d4b021253458582f13fbdf99da9b3ad07a20eca306071b096cb63f8b04dab404ad12b46c874913d12f408372939e5309a62e03647ba1c38d36cf5f8d04ee504003ff33aec9a711d4a0f4e0302018842011cba440f61dc501ad43003370e841c9138277502028b7948633fe17f1477dfd81133ab11c0f6a34e66095dba31388bc7af59a552be9099bfba043bfebdd66e2e3fc02e404ca057f875702b0dbd30f0448f160d4208aa1c25759371b816ba774ddc9f2518249a40372d116cedde6e14ef2e1b515f88419a3499f544980b49a7f3ed74d19309af6e229663e11ddb6d561e273d41052c38571d8cb9a6d7b504c13f99ab9b3c130188d5c3417c069b47f5e1d307fe7b3684f0d50364032d74630d513fa16f71b5fd7e1146f60881fdef2ec0b5eb2e3d73c7f978d5af9ef9f69995b1abcc37ae6e56b96170e167d3628abd7315a73b14b5d55caab1fb925e0b9c33cf4eb02b88a0e56fb88f84baf8e7bee2cfe764343875eabe56ef8a303461b8d1609adc0e2d9f4be9a30be3220b192017a5f1a19d448bda046e11625de3f890e7404b06d37f11461520b04e9e639894914d7a22e726495b9f74cc6dd656a84bd09d327a3996b4c9ae7c7be847a4e0b2f205d809f8d2bcb9b643438d85d2b583f16e332423b0a68116cb8f29cd520e23dcf674998adc94bd0e2c643af80d0e32b66c60647861ad00c819c762ea6da7014d6e15994a7933e05fc4c135488deca6e262f82961b0fd01185af482a2ba11568b010c04dbb8335f11a335f54273699d7884294b75bb79ff050156569a593843e1718a1636e39dacef464f588a7568980cf557c461c869c8c630e2c87be56e0229d1cd22528d3ab1d5fa95cec77dd6639e9ca6293a842dbf834252f7fe449bbc252ad52a95d3ce766abe6e1db0415ed104834c1eeae36320a45b0b819a66770dcb10a041be6699e04df9e3cc42d7ee4e835ac3db4021616491a290c322db319aa3c6d70c1f485b9ba2065ed903045a9f4e993619f3546c9c85bbf86a7d7472173e9ed5afca82aeab0bb69c54d542191b1cff1714b5c80afe18bf0f9e0a3c09cbf39015686478c2b4927ed04f8894ea8267eab6d903cc2167e5cf41aac3d5a41266a5004f441ed10c446af6e5d7c5e060db37819b35413de6612618a9759ea9527af2c6c892a685bcf636cc222a3caf63b964a25262e53f1f95018628ac086700a3434c175181b350aa8ed2849679a24f8630578257e8bd900500b97504617efbb4266605885c0c5603d8dd2aade9eb436a6f4dd51d6a4565f7eb76b932cfa7b11537c0882bd8c781e848be91a613af2116394a74b9b00fea0095445dfcab626dd3e8a90632256f5a29a0a329122bc173b2887bd6fa330dbe82c5148c207152d110b4c5822dc424ca4d2e31b1204ff96907269a64b843f170017e23307d50304e3024a0ad6675930da15a7036900a44ee43238410b58889043b6be4bc3fb78c0823be20f6bcf0ad62eeafb8831d84e5d9468806836b7f76c3006203b0092276e39ca02dd39f0871895485d6eccfb6850f6552cdfb65023bbdb967b4b99524a0139067b066c0644fce6918014f242ee0b39d2cc104d83acd50c7156924ed1f8ab44cee33d9d8aac1869e6a76dccf6fc2e8500be63297d355a7cd27c84e8e3937e993ca22fb27a30d2e0a987fa6f0d634e9d9141081ac69c4c9b3afda22999cf3149831c7b1af411b9878779d6857bc85849faa5077fed792af1243809483fbd10fb421eb9c79c06d93323f1c8101a729d9353f9c348a4f2c79c30263172643e8fabfa8a4df16f31bf40c5a8fc3c42544ed2acbdf74456e7849d9ff40b8f4894c343cfa472d8397e84b9d5a092061be4ef97ab78069be2d766893a0b0b80bf9d74bff017c62a030d45fd106bf62420d5ec8bd8f70373d5be1e9ccbbe2cf2b46a57fc9ab6b558a772c82dd3d639e79cbf33facf1ebb4bab8b72f0393df4982f17e10cd5c350798ccacf1f7622f878342847a197a21c2368908bdbc735ebc22a5a1ca3865c5d9ba141777fd7e6af8b026ec334d175e940bfa07cc8ea0f5e43aebf430f1ee2d36890e30f1915fa906b50a1251297d8184ec2baf0f3f6dcf6710d865db11caec18f3dd728d998d0cfc9ac7d40cc397c836bb8063f735fd8d5098f5e47d5be91271364258a2f84e86582ac441fbd1abe0185aa3d6f5fd821cf49d5be3008ab863eec4e3d81e8b7ba0ed1277acdcbb4772f44c14cf54c24449099164e0d8d10150431b35a419055e685b376122a73f255a3b743bfac134a5e3b34b8f1e541b81ec09122458a1451a44811458a30c2881bc9439a8706e53bcd46ee517c1ced39e6d7c0356ec7ed9147d40d31c2f46cf50efd2c6cd5f4bb383c254bb407d7907fba41fa9d25af59eb92e4094f5637e7a6b71b87995aac23492452a9f4a4d2934a4fca9e64327d347dfc4d853bf95093696b168b557aef1fd387ad4595df3e264e9483e949fd226d221c4c26d3579a1e44673a9a8e35cd89fec47939b827c5393b28180a5bc3c90e033558fad26f2b5cec9712973848d5dddd2f1984d0b0715ea649a9ab74f2bc6e2c2cdb290b346417bbd6e5c4d16e1c28fd9202e4e0bfcbe52d57cba753effc6b1cb439b16b5f5040e149a7e443e97c7a4e2c7e8252da949fe0cd05350e18ab5a39bde9b9d2896b9c525029a814540aa2a5a7255a2a957ebf68fad960e94db3f4994c4ffa4c2697cbe529d2f4fd8360c844386f615cecda18aff2bdc572970cfd895afaf635510ea527b53666712891bef403575637e9495fb83f2ba6d7ebd5da98acca772067329d5053d7e22d158ef372949e55494ffacdd44548626be8b09cf3b86e599d3678e5615d4a98f72804524b5f54ad6c4ce9b9a7bfe2f1a6a88bf4210be9c3520dd945fa50ab5c227dc9db7521919e04a44afaf643a21cb266b9766a4df33091d0af886e48d5ee91c1b94ff76c323892f7c3aca5a7ae72a7b2e4353ec4697e1a84d2836fb415425a5ef4159b852a4f5fbf7840b7bdb531984f20ea41ddccd380b1867aab2b795b7bda497426eb223d6fe184ece2a0d29b7efba5f405a978cd4aa2c32e8f9d6095f48427b6867c4fc96f254d4b4fa36be9c15d0d4a269f0c4150c9d55bfd8222bd8fd82f28d297f285dde3ea9766f1d029f93ca453f25bd687ba88b058ac1c52d5576c28ef701495cbc1f4d1c54e78c7f4f14f610fa7ffc1f50ad2cb6f2bf606e9e5bb10a7e99f5635cb53af8d29bdfcf6e917ca6a56f7aa5166a6c98b2bdcc99395cac7e1aa6675de924d4f7ffad39f3e04eb66f2bcd5a0bf0c41d01eb01e4c3e7e50cee3ca51fa657ea8f9dc4bd4fc4e9f8fe84c3e6ff984ebc3c3bac8cfbc2db468967bcb554c84a69b695610eb26871ee9644b861ca1621d89be0eac8b7caecc6463425f0ddaf783eb8c2c4a40675b1aeeddc72efbcebe37cd6bbb62774d777777777777777777777777777f00e8a6f19494d233d40c964ec6cac9a49252a2a49188db421ae64d4e940377b77c005adcf3e1dff24de3aa6e6a0400317377c7dcb1ccbbd8cd19809f00d8bcd0735cf62d6d444a1980ce63f13c37e2475a35995025493a3054c9a453f227a55dd74cfe0bddd502d6adf3b80aa0e545a21cba8fcf751fbbee450140cd60f11b9c4ec98f1b93b991f5a273bb8f6a6c5783f2515e3b99e1f58ed74f1a94df79cde3758fd7aff6e99f86d240411dc5675c88d3b8d73811cf3dcf6f3ce76b2644508f42e2101a206440a8b20351bc902d3fd3441560513369af5d6e84699a094b661f7a1235cbbeddc8e29065d9472319a71bc3be10c3b058d3d25dabc84d18fefb366c54caf580726d9849c4c6ddd01cb0bc369b8dc96a736f40a8fdbb9b8da9080db721751bb231fbee52c4fc5f555b0e36b51151fbc306d451f56fb33182f2174a9b6ab32efdbcd56c44b6219b4db80da9fd581056d4fe96af75e90fb2e9a2766b3144b5b1315d57fd6088b52e50e866535b675d9bcd663323d4844f3557d0c5e60d6c9eb001509540fd6d6af00059908cd22fdafb17f2f34fed33c658d3ac4033edb3d18fd148201914824b50ff61d6b83135aa7784bce1b4315d3dbac790c8fd93357c43eb1e55674609e43f2428751aec670183fadb2093481d20adfb864aa08dd16abf496763606a47069250a48f040aa5cfe87bd2aeb65c35fae6fcb825d00fc9b15881ca23b68fde11dc47f3abed932c4f7d53eab8a97a734e1e28349440d2a6416923817e4538f018aa9f6a6210ad45302801117e90c40d8e114630b1daef56b558b06c809098a289305ab0bf3842337561e6f6f79736d5ccfda1289486191a34c9d20d36086a706b475fd4bf23503be487d493c13e052a908f7d281d52807df6215961f29339683fe85b086d414518551031f10f14d0f3031f702106133056415ef0852b0b1610e104214598982205090e155e5e984253e212bd789af4dca049cf4c17ae29dd23976998268330fcb32871d040f58f5eb82d7f39e7fcc2f85974ff661894be068cd81d1dfd9d8b9ab625a4516d709807c48f1bca3a76c786771da5fd3dd6b907ac101246cd454e101a686232fa0c3034680d256c820139a93da36e132a8e5071c4173ca70fd54f5150cf075395d99c737eb4412dc36c541682865c8b697ecfd0ac9b3b57bdf000951fc3a2fbfb60aaf2b3279a00759bbc802a57b709153bd82c7647c0c094c0a70b6208c1063d50d23304301811832eb4605344161e7d32ced492aadbc40a1cd4516d51616be65ee6506b3e3bdc8fbe1bdbbfbf8861328bd3b50e31e7fe31a4cd6d14bfed9e442041394a0d61bc90e9cc2246bad811430c30d8810b6210250821301658866b12e32c26a15eb709152ec8c0a05db70915ad4ea3cc3c01b84249174dbce8c20bb040050b9a062da05df31774a68660f4c2365a0218362d4a506021e2adf07afe8a91134954fee59f4df6c915b0d8040cce8bf4655c1023c4051716058c7bbab0826d0917b880d98eab6127810950a08634602815402a2abea8fdb34915722aaa6e132aa850b1ba4da868d2ed845adb4a12e8fe66a1df57e2646a73da6c281d64780bac55e83380e24700d04a060140ab6d69845b0e59f050b1c40891268aac9a8931e000070a4a34618990556f175bdc6089283bc0410b80563dc40e12385f6881c516abfe9094624805eb36e1c94295e248dd2652dc5497ba4d788c50e9c6b00d1d9b2134610746908217abfef941eaee6cc2836477ea7a2a6bbf69d5f4c8fda8185d86eeee26553052bb9de5046dc60a585841a7b7273ad3e897706e132bb06aff77cb04f225b675958ce7c0498dcf4a06888d24404856f1818c5c5358b94a66a920c64a0688b78a1f927e16f8ca3f24fcfb409a6f2091314629638c31c618638c31c618638c31c6d821b94942bac7285dba7b8c1ea3c7e831babbc715349228de8d44088d94929993b02a7fe10fef1aee1a2464ff304bee9fee2cbadba7b3e89ffe01da5d6e777b7b7bd7d7b7777d7d7bd7d7b7777d7dbbdbfb421ff64b820b480881ee87119460d077afbffbddb7170eef8efe9bd69ea679ddb163c7eed9b363f7e46d329723c66fa646a6c1d1ad69214d0b69ee3fe7d653bbfbdd318ffed1c37e7add3d736a9c466ae4fa248410879ea07162517e1cde5cb3ed6e5c9633cca0001bab80ee197a0628b4d0c689b6a5ebb86dd4264ab71029621e06e6f20bc5d762dc6818a52d94d5605bba0e6b13a52e398b5836e57b64d66a00468c5ad8b85d6e4bd7616da2346643315ad860a79a93a99a373d5e97f899d7eb121ff3a2d3e0176972a3f7eeb286b54002d12fb3ebb28e3b20621145c0c06ca4923bde9d218b0f9b62e6ba4ee8b86ab85068a8f19d8606291168dc6165e4615de2afe0d010a672f41188a00020d81b20d7881fdf878dc13e76fe41a9f161564e3076b100354a21704083698318b6d8c77ea91c8631f6bbc3baf0d0010db9fadcfe1ce0a155301dd8c0ded8c135b0c7b08781f91d36302c863fdc2a54cc4467444ddbd78c0d62f237c6b9466611832a5ce0822bb8c0e7671ba9739cf07c98aa3efad0abcec2d5fd49decafc8ce521edbf8fa5cdaf7bbe7ed2a0d722399daa458e34b8d5370bbdc7a35041c3d88316462251257a7e57d22f9e24d3893644fa25f4fcf1a65f7036265de5f72a1442e948f9202b20ab5d8554545e7be754bcb852f1905c605729bf35a7e2f52a7a735dfc559eeb112a9f0c9055cab7f367fe745910da329e78e1d8c82a320c0b25c83936373820f84a829b0802020857c518e3bab014818e6a18310cc3a218b483e1547f375582a0214cbde1818155996053fd1bc4b3413c1bc40344f30e3d1a6c9808c0dc80c0bec4dd79024c94117b199f01c2dd7d6ada0c85329bb84140b4b6e89a9641b3cb551c5783c631269954ee188b4049295f50fed998f88de37b4679c01673bade53f33f64a01b34708d6d7fd645861f502635642139bc0d41395c1f76d260f38e4b0a1a6e4b041df0400f3e61e0386fb97b483269b0b52efcef2ae9721af8864cc2d6e0e761d944e50f1f509b5decda5a34e3ee73ce097a8bbf1e1bd32b9fdb9acfd4bff0a9d755162a506d5d88d09dbd218feed1b7f7e6bad8dce0e41869e19834d8964658a2638c44a675e9d167e2cf347f6351829a9e7b4e7b83a590b1318c8575e9675142c6190a294119635182661f9a72a45815b33685b33110a82dfa86a276d705d58275d329b59fa3b46a029beaef92f491ce9942e890dacb45d86562d98927d4fe1428a81c81f6f9d0200f5b651c1e368679d6e503ab6229982c131b365229cf63d91f1e29ca11fa74405b1aec0f7da606bb99c5aca634a021f3304ffbf08dcc3deef18f799c507e9e9939f67d43d7e51adae36890196490b12d14e24221ce9b59160a65a2904814ca3172a441661ee629cd908a9048da8732d4dd255218c216564024eb0bdf327a6dccb6e6ac5b8cd15b6483e6518fe3ace3178ba061573bc6a401ba882dc6db35690caf2a9cb9b523011c5d0df0321040b480ff7f3dd99c4ce00034d685ebfa10540d4a065b0cfbef9fdef4fb1d0b7c75fa90640fc45b993e24a1afce9b16bbfdcc606dcc2e995dec06466d2e88da34fa654472f92b7ff886fc4cec9f698b51be644f833c0df68f3cf9a44119c514e4931efee44e11a8d750eed4152ce8fc28dc128ae23f7d9095e94fbfc3f4a74f0609bf4ce94d9f0c921da6577999943f3d7f3b549e3efd64e8ab7c322a6ffa202be9d3a0fbdcb893277f656490ec389d3e14e97725737a148947e52fec61015eada756a2cd572b831a3c79bb32f987cd34d8f2c7e506457edbcf15947fc81ad2661aec2d4a83bdfd8476a5795ba9fcb620ff342151a6a0a1f49951a2a1f3933fd3b5314fec2b8ac905cf0f6faf065fae1a3db1a98ee2a78e78261755541f5cc3ed27ca3672ad8b10547e9bcfd6f383051a4a9f9eb8fdfcd4ee7e7e5035a22936ae5c41f793ac06a5912aa140d530aafead9a4f5bd6657e2d2d740a1493cc4aa263634726411a43f4dcef6fccdd501e1be31bf352fb47e0aa8e53fd3cc3a98d4e20c8aa5f8705287dee995340fad173a597490112faa138c8aa44b71ad0af5c121a2ecf10345c9e9a02243b464ffa7e1ea447f1af08c59f0544cfbd0ea26f9dd381f4f580f154ff9852ca186d18f9eed0200f26d0108651fca17470a26f3d85f57732a0f665be640610e5c8be9d97dd475a68dbb62dc4bd0ebde23e19202b69e3c91b1cc9c323b4c40464e2229c2b9df0b84c351bb34beacb55dab70caaae7972474a39bd2da84bee78aafd93ae142d98482612a736b72862316222ce5e875e653a2e179018dbd2084d2d5313a51b6e60d3e0d66e89d32fabf2da9802d496372f89f44bfc7682b288c5082a6f6c6c6c4c2d7f62c7a8ed4283cba6fa7788907077aa8e56eddfe1c40b5c752d305ffb09b84afb50b3c1fe19504d0b57cd8f7fbe68870c028056da4f309ef0a842cecb3601c349cf145d6057daf79eda78407bf4f07e1ebc5f070f1f36748c36bba3036badb5c922d579977954fdbffa4b9ba6dd4eff6d16e5603182fadbf45a51a3eb8040e3879defba8b7637a66bd7f9b061b116e5c8321f366c3d62be0ebd9abf735d6cbace07405cf8e6ec357b3e46f5c7acfe9b63367495369bb9673fcccadf8e067534d8cf2141e7dbb8b1bb0bd817ecfb55fb22f9eb1c54feb0396f63d1adf3fbc135a4eed4a9bb366768ced08c71ceb96d5362384a6cd8c8c6d82a76576a83eeed0d13d7e8a6ae928140cb07332b20d10848acb45f4268b5af79389a01fd5b8c1147831230f10d07c440605dfac315fe685842d7b936b36c7ae6a2ec375e910ebdd23e88ac99ebc22f3d69236f1ae4aec3625b1ae18cd68c26e6a4b4fbcd06b4d96cfc3fa41d8b15a856431bbed9b8aa570990c14a06080356d80319c04a7ed8c9b0144ac861622503248352b3c23e2440380a4758c90f092a262fd0d046863d40fbf6169457159f1262d9176fc1fef51a7a2d2c994425e841d962e948c9927247b25a055333333313c46a650f4eac51a2b1c478a28a61a486f2895743194a1f19e387c2a16b7c1bba461e16c862b15e55d8ba352d92288611605fb277859f8497316eb6ad6fb62fa177156e0b897a34ead148447a1d7a45f2e44dc893384a5a4c443dbfb0261510fcefbaed11c2826e4e4a71abe1bee6d4b42d8236ad9f4e9995020b7a84ac80605278b11251418c556b47c5866d38d53fe94e8a17348c3bac23f27887d99503f6a19db8d3e00578353dc55f466b88c355bbca5691c753fda1191a4616f7c0ef221b780c140e59f6853c431ec63aac7ec1ba3404ddbe909fd4f68dc9c1aab22436d5af45c83a7107a886acc33a3b590a100da394221deb29ed0b7f60529403b77c569db8135ff127ee441e5e2d1bb13bd822fb923db310aa28c7a6070e1e33d38008bac151d2621277e28e6946c58a520d680d5896313386f9fc15cd1b243014dc0cc7cdc4186314a540a121cfb010435ee60761a4553df886c806b598f59a114233d3430f0e78e0f58517cff0cccea604a0051c7181cbf35a269a8d81a9589c6152424318897df619c03efb509e81ec518ea361fa457ed9b74fafb5d32f795a2eecfb69c9966c6133d8fa61ba5fc6648f46ff0cd4e3f39b68e0bfd107b40adfff7f57d9b001821efa03b12b1e5f0c31c4132b20d8124c582141e1e0cfcf957fdf5500c5eae9ccc62cb12aaec9a27862ddfbca63042658152fb12488eaa2619d223464256a5889585137486a4205a12d5d836dbae11a66ae61aee1ea514a4c4a4c4a1d99d4d1a1af50181916328eb63d46d99dad5cc1a82f643859117ebd5efce2d76b4e4abb9530a80c83ca67973504c3a0fbc99c95126486728056b18f157b8501aa26ca817d6af4226e3e4c026a2faf386f579b87dac16dcf8d466b85d7635dfa33ef4783af8c5fddcbb7ec8b1f6f1eaf441e6ac7b67d32f20a41380149fc20476ca30f87a7dae33c1e9e6a7e5541436c0cd8183686a50f7fdb122a1f47bf6a888de1e503856ff48b4fc83ffc5a172734d42acbf4cb4c0cc588239dd9e3cdeb95e1907890d33b0dc5f66a3484fe011bfa100034d0c0ac429f00dea6413645a1a1297bec01daf7f39c73722884d33b5813e60f6ac7e9577ee59359f9d3176415cea0aacd006d2352a5dbc69e45d41edbb6edf95bf150292fe383ac4e1e2ab4712dd50edde5ae4df593e6fce9ed58f990b7e3f4dd27d3fde937199d0c0fb583e5653ccbd73528ed653ccb771e6ac78cef7e46f7a1b467d1baef646822952ec564ea52544a1cc7712aded62ea593f12a5c4ad7c91869cfcc5ef62592e78357567ee4aafd84dacfadaca0749c5656564e2b2b2b2b2ba7959595934a7742a4d4a0c0e1a926d550cb092cdaf5dd51c54122f574128d42e58d4d83363864135e339b5914300c04c15716a61d1314ffffdcc6f4ca1594bf7ef738162214554356fdb5ca11a15bf34b8186a156a83502222dd917a9d3608b8905bb3f1c75513b4a1c2624111ba378286aa802865c424482e4c2664072a904fdbab47ff1ff77bcd08200b784b6b410400032cc50a3bb6368dbb62dc4712d2dd80bb86bb7337b8bf8653082b29ca51b6cf053f99b0d62ef5f3f673ea7cfa9bd0ebdd2e6646d54091b6b438206a3698cc655dbd9b00182ffbd1da055ebad6a8ce683ac42cc06a309311cac26ba47ff5d2742596a088e31c353046d391811e62dc787e0ee2e7f5cb501f1f4429f79d86f5be669abd011f3d9db1c7583d7f85ce317f2a8fe385a0679caa7c11f09e461339e3240f54fbe8ca0b28707a37931c7c7685ab56368ddf4cb62497aaa904a33a7b841ed815243ec4857438c85e960f1058bdab2e70af9aabdb14437f04157d3c9c07f7e7e7e7e7e7e5c4a958fd22ffcb37b07a8364feda72a0fa459a08417ac90c80fbb94df11336d02f51abc10eccfe617e8d5e9574c2ba6959597b1b2f232dee4a176746fface2463258be8389af39f3929edbaff2cfb8d0509053b27a8aff67137f3676368ed97c1da9807702a1e6a878ae9553ec82ac543ed48f9d39f3e99d366f2bac633fdcad735a8f9a65ff99387da21e34f2fe36b9b0f357fe56b9d96eb40cdcf02bd3afde96b235fb3b440c3f9538342774da07ef141021ea3d2ef9f3fae3a7dfff44213e528cd93d72b77b96a4e978bdb7519bdb635fca7cbbb8ed29daeda735d9cc6d5c9f4d4fb61d6d0f6a1bb6683eea793697f4236527b97b0918d9921576dba8ab7ab94ec471efbb0616be8555e875ea9bc888da464afe2853e641f9a2ba8b48db6453dea14d108024000058314000028140a0643a2b15834268e13b5ed14800b7a9e4272529c0984598ec3280a4286286318010000420080cc90cc1007008dbd79295c44d20807a70f079b3639a8f7498a0108bdf681dc2da5a404f3eae43d04dcdee48b93bbc20a63a206ffb6c09587d2328d53ae0c40eb39a1cbe36a2594e5daf5e0e07c9c5b6d45f5b1a74463125703a08c267c1b3b633c47c1be0df41873baa9c92f2cdd9b6a6eae5f6a514569a3d12bbd64678979903b6f37af57386d6095875d6be545288a17287e23b9870b96f35a5937b541968baf57293d91df3e434db18c2afc1294224979277f03c1a3d2dfc06e6817913d66e171a8603377690414c1861bd49f87e16219b6b1e487618bd8ed5a0e6adf1e351ca6ac94b02c0eb8fb44582a61ab044c1fba2ccd758227b227419b72f8045b10a5977e11abac66e3ebd481d1cb103e433974d35c47fdae56e0736314c91ed19b59ba7b500df7b271ff5177094f297efda76a1492aa98d1ea4451a5917d455b9afa8a5ac564f9dccf825dc7a47579ace9ad75702e78d26f0c46cce6292772f9f49d476b022e5b568dd7a7a9769b95d236cd3b77daaac29d1d394e8fd29a1e8e3adbf74a9c7f22c7467cba77a0b7344fc74026104728e118cc1e2829ba051ffa9d14efec8108254a0ab1163586fcde861f0f33f0f061aac9e94d0eaa5b7bb7f2acf1b2dcae9c0031531655b623fcf702cdf05790bae690137ab57b4c08a0944759581e156b685623b7f6de971a4ba01e163960773420e786acd1bde6c6d90db9ce55458beed0b310f291fa03dc5a6846582249852cede00ad7584f74fef8b2e53086765610a186ca488c0304a1c67905f9aae292917d831f637e624c04654a9b3efb00db042eb042c0d6db9cb871a2f50ffdc8bd2519b0656ab43ac044ea104b30b638c6b9e9f158727a4af1c0f416294b3b2d8fa8d091a08091b969b3e52e3ec4ef8d904ecdb8dc7e6c7ead0658765c10024faaf4e562e4fc703d2f59468991160f7090bd083b3c6b789028bb6af74edb71e7905b8f206893e5362bf42c593d0304e5436228bad69c2b44672366101c5670d699f13392eee5178ee6f73b4de6baf5cec168abdcd93e020b4625f97ebc800fa871acbddec4c63d0aa286597222ff1a3bf525c2e85062e8451bee5220a2c67edaf54e44ec62270736aa01e11dce09ed57228b7ba9ae3ddcfb2932feda16ffd6a7511e6ae65a9c82b732625f1903d9d0408db6f81ab47ab62fc4a21e9c05a83ce045dec689d0925698b1630addd54a66a2bdd65bbf4be6a9a4da36d03bd73e50b215934eed2fec08d827c6e8b616fa735b5f91dcd6713aea7d26d189f649df61671f6a83980194401577a11bd70f401b6f343f90d70800413fa99b303c415d65e7c3e24d94cfcc13c62c83159361d6990898242d04d4618d7c8e77d6cbb3363f1099a35caeabacf2e3eb8bdd86d9f788dc6d3d7d4532c2dd57664a71d5339f52555a168d77dcb97e798b74299f48087c61304f47652e425019f4e2f7952c95ce92bab5caee1cd4f3c934d222d13dc0e31d83e9682478e069dedcc2b498f87c3678d2c49ed9b3c4cff22ce549a145b9b0f6d6f34cef27c87ec7f0b7f8f41daf8430f6bffd2265a6ec745b898cf25b438900c5134ab8ecca423481ce8169c93e0e59fc7995cec10d62c5e9017dfd2856d46f06c68181510cbe6f0db2865f453f31fddd3c30a6fa0b6cbaed9070fb7502f4b5462f73f9ecb2ee55da0bd61250e3a8fbec3cb22236e9d35f31066fe0a43d84f9f290cfb7ca41d16b84295c27c06ac4d9518852e79c25e152480d0e316f57c45e686cd51bcf738f8208bb47032705408328155036ec3ba4d8c47911d538b9637eb2ba6e975a062b70320a6b32dcd71e6295293442cbd157ae900eac7b385afb25b65f7e2b14d03a1301ba1907085ff4840ea3d05eebb267af15ab51dd4175a5ab672a06769d148ff7c347fe8c452216ae9f3fca37746ac3888a05bdc96c7f9e7648248202b1551f5cee5e8e98597b55391e76c6a9d784b3c271773695cc3b07143cd401e03bcea1a0b167ad39743e40d64b91a34a71e02203ae4d656d7e2ca63a630b17ceae4a18037280980396f880476c70f301dfc6d9902814586dbffbab0668b6b2c463a30ff044df15808346b7c212c7bb716848922b2e118af3b2589a5b9709e9373e7a9051f411ba524869c60f9a7f6a23e58c8ea4f1d81c98077dd0eae34dd773507d0ac42283a137e9197b33ebbc92e95ac7ddd5b398b5cf2295cd2e7c5dfbfc4e05582f248c9fe5604e0a73a62f1425050b8f1d29f1751e8df56ab733e7abc08eb8feb917dd7344b9ca2efa2a5255597a0ab0d873cc4c711f3a7f7ae3950d01342f4b599022c8ba716525eaceae80170896be6500a1471bb2f72a45bf66f043f46174ae7f7a15301c8f160003a9121cf70c4d43086b4c7cdc35088dd7e4f5dce7d7e5d0cf78e7b163c2ea0e56b81b517c0e3cdf4ae4f50234c2bf50bd81df4ac750eac554b900cfde5d20a04eeb85846babe35cf04ebcd1d844163822a1a86ebc3d61d418c81cad2750d3abd3b3f2ffa92b631387dec8209aa55730ec7537fcb20d5aef9c660762842859a69d54c130a7e273da6a24fa98a518061236b2aa8fbb5dedf29c2e695eb32d0c425f3d0daad8df5adfa1aa39debaf2353af7c5a5ffa214649f9070399b653d32bc83cf0c411c3525c61b5658647cbcc8806d4799eb8a0a44d2b8b7aa348a9cbc7654c8765dd39b467ad3d6933b73a91d055fd543e7840153cbc48d12b6c0e6d20f3cfdb92d6b6938cd37e8b93236b58fba21ceb2401e7a14bbe746ef487cedd70eda53fdfc8c4942293fbc6d7c909fc7547a94641871e39457c08633becfe6c68989a8825e1974ed3dbf89d1ff28f12b66c35f1557bf022e53e60443a7f7dc4d19904bee9cb333af51c1baf526d576869c225e8ad99a1d3b2f3a4192e6c921cff42b4349c00fad742c9e034a2dc073df97d00d3b1cae3099e8eaf2b687b9f3bfdf6c25a91b50eabcaad9cf7e035985919e663d738817aa80fef17a5c20440096812628c61891332051d9255957ae7f1897efc24d41ad9ad9a0b1c041e0b83df7f15a0e1081fd540cc47c1e3ab4ae2c5083ddb9a94411936459ab0a8c6d17dc65f0547b0543ee5d0dc1a5cb5e22200edddc58c805922d4a294c4c2358a5f67538e5523bea40df03798ade3f45adf9a4c9b5bd726d4449c02deb14f43b2b76b89e4f8f0bdd60f10bfa56910441c97d6b3fae598e35d378854b973e9a3682ffd6ba20c459f153a205578b94e55d2c71b3e86544d1c4d0fc1fcf5c7224166cfee13b15951c1583194e5adf0b5d36081c5851702e910691ed8ff12575036fe8bd2092dc266a70674f9d4dc1330e845ece2090a893838b5223084c3aa2289c62e5ea060df545680e20a1c6c0c1b5bb2b78400b9b97178161d55f2ee608215c5c736ee2f4a0c0af94613e9c2ee6597a2e8c6447faf6e3074306945c5fffbdbc1d8ee24afb3b6d1aa60fc2c2e2e8ad40b118fff6c0499cdad178f4e4bfca6253f2430f72958c928f271ef6002a2465f1e487af3bdf8e328f3ba27d06a9d0cb358ab70adc45522e7f851bc9a9985ba5d225dc269ea9c1aa159c0a44bc0564389ddedcd8b8b6db61ce721575076851adff494a7ca997e0aa0a9bf2e627110a7b1f2459c957100d853ab9e0365e2f4dc2beef4fa8c114f1e7b4f735527b21ddb227d53468a1d975100b537d3f7fcb681404244ab093438e80e2e93fb08f1651ccb49c1974d3f98e789669cdfa1cbe755b8e880d88fb024b8b57816432903e8b8b89a22b75cbc17196679a580a4cfb44f6caf1c9eb4cd09f635d24b8d44f3a61acc4fb2267b0c097bcd86d42aa04ff64a3b423a820409d95f3f8494205662cf7b145e0503c49c85867ea6342a9ee2b107efa5a239a3d5ce4b6c0048a108365b198c7418bb6dd8fb0b55c313a74420e4afb5bc76127318ccf2f1b5468f89c5633d6c21fe83fe1e5e73e87d33e7d8ffa5c8a8e3d06f2397b7bda5ae3e77c747efa895d2c4b06cae63bec11676a9a147229b3432a56191693152466fa42c8d1c4423b01d29dfa8d79486305df7021d62407d1e4707f49692a8b2cd4a92bcbe118488b10a2843b234466e68b2be6143faca4c77d8df96e816898e77bb19ea4cc8188e4d78ce7bcfce34de80459f51f7e94b102146be3ff42fea363c144f745f620444335a966832965fc55f7ace21c87d2781512766868efbabeb35807a553274a16403be6c158d4d88863d8d56ad34efb7739c4db9c1d1c91d44f0af8577c465c389b0be07d5527bd5b862032a1c4f48b71bbc3110e50cf7a016b4f90e7dc3c41c66176cb9eba4b8ab86fd98dd1861c6c9baa27a44635e8253bd858304581dddd73a971a9ea5b0a1f064bd121d02bf75b193d5eae33f8bb74c60f049308302827aef75220b76f4719e893093e9ee27bbe432258844aa229119d4f0d066ee9ad6fb57a8f3813bfe6da4d2843c98e01e1910281347883a5144530ba00251d35ead4729e2db262a9e2d9e3555c17562877d7fce54f96c1987cfacc62c4a2572b8cd65ddd5d3bfbd4a90bf2e0e63a46477e254c2821713851d3bc04b513f4607678607be5fa71c667ed831464a6856a06b008c71da338878171b04d5d8d14e10628c0b858b72681cf6278684174ce51c9dc7211d5064e6044c6f0a55d33ba35a1ed2b740223d6e9758b2147f048668e5f01c16b7c9804c164d76cd929a52a4d218cb0bd146ba698950626219accc3b387c3907482c527e34f0b904d45ecb1d40e6ae889dbfcae956faec98243b4b833fc54bb8f822172f5ebcd48278f3d77b6b99ea4c6f1833d9739f2c13b91210bb6f6a0342db6e1ba7122165c17c0904c293eb8a2a1d22bf1a637237fb3c4ee9515b67e27d567f5ddb262c0be63f65242328e5c08eb9082a6dd883ed533825751667f9c8b0d9e1201613970dd55da13d54f13a1208e14b23343b2df3120bf134a14ad04478b767415e4922dc300a3091124c8f388c7fb1e832e8382a0086061c59f3c2d133832abe2b0f0f5c0fa38965387d1b6dfc2e0261c8568aeefd8ca8382f47a9d9abfe54f5843bcc4d9e53e1855d988f822985eec8b00623a2697f2bf4355909091987508055751e8e196c6767a9aac65db2081667aac1bd4065943110144081ba38824a413c877f77f524a62b040908cd87a37145793ce0770af996d401a403145a8fa92085230d02fc10ae7b3ceb2321aa8f1439229ae68e59be34aa91d8d59bd18ed98b3f2bd555e8822308f1d1357298641a13153be6d91773b72427c8d0a6e490d1cfccf135f9e9ab8f08f0c6bcd5b15008c2e5ef1288a979d27c674055322c3680d978653aaf6c6ababd9c15ef53974e1ff7fdab3073c48e40dc0302ff95477307b3ef6585c5bd7fdd33650b00bd07ab7da8bb4f0778da7b65b15fbc4eaecb7c157e11b36fbd82c044ea07528a1fbb9010e04234851b9d5d14eae1a26972ceca39a56e285853b07e68a782f2921342156e6f67f995bdac232200468eca0946a6c9a918b3108ce5b8cb3f0fd90cbc32938adf8d96fefa3a0cb74317b668971eb4696d14a4dccceefcd6230057b696f4ce98c21d090cf6a387acbfc27efef1b2c9a770516dd588610c8558e570551a9bf2b27bb6a4927982dc76ac176d51376a5775d41e932a556d7b7188c8515228f4f8fc6974b0ab7f1eaabb641e3f8fe7c1d123b2fb430cc6c61865f28905086923a7c68d2c387594f5288008a23135f487492d58e437681617df65299efc22abe22f05ab4953e3c3bb86eede16d41eab8e6dc6e3f74a53ea6f50310c24010fad30a9411aad412356d2ffc10748980c9f0dcc0c20a516d3e16e67cf62e51e9c9502c09c61a079cb81928532d4bacc48e461828566ceff1f31cd1af2292affc5c08f6f465a09e416b816f15edfd5cbdaab93c7779e61474091e6e61e5b9d7c6193df28e41210e0107cf1c78eabfde6484c90d296f0b3b4189e6e09a329e5721f5a01b04afa8547fb8339e37ac0fd2d3c2bd1f6807257918621f746a143bad7dab0623abe8f460ca11f081f67bb137457703bda0580327da536e050e14eabea9ad5afdfce6b8fdad4b23979f914ed84b3bc56cba6891859e0a130cffd9d5f0526a636f80e3ddd75d32421d9aef53a296c9170840dc0c358d64664af0f67685d17096e5f4d82611b088e0b712c19d24419f9c16232b97582302f33cac3d8878f26ec59b314b11506a8530555cfec65271e5212a5dc78f704147b320076b652af4e7b2d158ddad1ed8eb9353bea4db24252a2c5cecab0ac147a579add83658407f59c5e4afffe4dc318e4078eb3077b040859f23933c4e0ed5c1c3da9160b01b4e694c892abb0e72155d018808b634af7bad596c650404b16afc11328161003c452a2727f1bbd5b12fe0a197c077daa8523cadbbbf3dd7ec9d3825ab27202b86d36a5916787002b9cae6378a07f15e8d8d8cfd1dcff5ad53488692c0fad9deb4b65c12ba7eb260ed018b827ac5dfab213fe9924399c3ee0005777015605277499e121c9ae767213b5d3c6828b85c43046fa16b40790ac84523920c7258300ab226302e931434f4c1b24881bde5866e9db1388b3bcbc01d054ba7608a1e9463151f06f17a000a4803b5e4ee37715efd5c1e1aeb945a065ff3c417eeacb0a9c9d776ced7c698257d72be762e8f6d48fc5ea54a792497c5bacefe0895c7c529e55999c757ed3e0662f429b482569cf3d9312a4af91667a303c9c02ba694c1c2eef05532192c1177641035b996963c6a3ac5c18fb9a829ced83ea96ea6cca9242b8a918c197423904a77e247cabe28ee73090d84698b44c9910b0a4c9001f19570a0e879126c828fc6272a8e579c15c107b1ad21197ec27b9fc78743a5cc00782600c51ea0d55c496d7f26e29d656686fc99c399dc4667bc4a20edbdd6bb3620a1cbfb866381583a017dac296727702a3c19c9cc416940dda6359a65a4b42c831d00a0434e6204d697563a5387181a240cd57a0ee53f62d9681d1ee57e171ac5128a0b15db9da93f948d3ca6261003b893b0f48698a6d1ec6b58f6f0ac8eb0f66784339e679de9b439c4e901db56bf9cba8141bbc5614ce6cd28b8f87310b32a2cf6c5c21ba680dd54c31da8522b1bce11c18f70437840965a59584dd27c8a09c4f72daab15df0fcdaeac1549eb8f85713c50769d3f5fe388923452568034f884e2fb4aa1b103596bf9f5b550088255ea0bc93bc4c0dac2a7107d929f142b867b6af271ac9283983f42bc589869327cc4b8c421a4ec24ed4589c8a373a118dc0111e15f287702955c63e51b8a22c45ec90a56b94cce85d3e86b142e230ae5e127ff90883ca5c9975782be9a382d0027fc4d16829ad048b51d7a6d78b9e8ce2c96b6f462046053203ae442ce8b07c9d99518621cee33ff8fa15e4df3f795daeb86f5dbaea04466756e77e6b73bb3f5ce39937c8524ae39213796679fb7edb091fcb3fa0a116af752a441e10b4264ea446839b4c06fb07bb6fadc1f12756085db8be440f82d5bd9dd7642f38cde49102ba04f7f469501f3bae4fb080ae7a01a124a83c6da67b98f22ac0e4bc64d58b223e0b9aa182d37e0f6e710b96971853e8603694a2196eb54d5eaa1d15a8aa007f10c62154c510723e9745b82a15d01f61de16239c8b31b3832a911ee402c9eed23209cd519c8d424c2e3ed809ac8c25fbce0f4834e2eea85079e6e5473c91d36b49f810da29a39b1d122f97c31e1c528d790a5719547771ae9b463a5058a50853c025eab00b6161bda8b4381a0f7cf370099c7fd52cbe5a10a986af00e0572a911451dec92479c08b86f922c47bb599524184718dd4eeba6444afa8e217b197a7f685cf269b802520d52c8727423e0783f5a0a81c9411593188367ddf785d29f2f57b67b8523c9ad387a097566105a10ec41b4749b32af7fd9dc1d45ea22af472e057fb342493c652ced039c6c031dc65f68872597407c2384b8dcb2588bebf9af625114d4480a0fed2f7e452d0eb7227fa21d3235d4498c68d035512bb9fe8e931056d404a4646bdbaeb15f5e1b96660e810f8a9a91e255310978b5ab15e1527fc90487db3c848bc092ad5a54b64546f257024f080ce4612668318eb462c9356423398bb28d9a3b446424bcc3e77760146153ceb5cb9048118ec948d5b6284848188a7571e748feddeb66db0a01cabe25b6b8dc19769138a5f19c48ea79d9184c636101d473e1b2df2fef15eb86d31c188e784ab56c0b619ab8c85c0254971080d3f06d3bde250074dd4edce54a8433ef787622eb9d22300db82d5a4bb2f72497e3aab4008f900a194983c8f27c52682065ac2c5d7c09bab646e602b2ed9b7fceb19dbb7ba6403f1faca23c410f0597849869006cac1a6b1406c9b1ef603359c39ad98c11e3254a4bd0d5008f456c369687fa997f5273f1ab01e913f3f56957ba8154b176ad7c6ada6e5c2713bb9492a1dd0bade4e6f808fdf80875a4a36b96358f3014a478a41c52053eeba847a233d46c92b582a212d5410e8db42d6696a10005c411033ca511a20614d9095ce176f59772c8f80273cc0a670234dc24e0e67638ff2e8c731b01e154a9d3c2b6140f141a123bd075f3338484da9f513c267a795966ee6d54f8065d246d45329e89045c64a074a0aa08a4912b5f621885546a5280e04434fa3b3462367efb548fa59529cc2446e122e46cca4ec78241644a813bdda734f0e4ea9303277e1d4cadb0181036f78b6103f9fc3fda09d8d18067ae7ab04f32a7dd29e8be69c508595bfaba747cc002f7da4c97e3e4e0413ace40515262fe261e2eef30d02eab4a177d046b364b7ca4313d3071151463d82c880a45fe19fb642b289b24a33306590da71ad88c32242db01723d3a105b443e4edb9d2b916b36b40225d76ab408d6d51b13aae2fd76f160dd890fd651c57fa03940922a6e306db24c9f90a53190fbef55a2d52b3e92d82f666890928e01f7ea6a25bd83ca28eb84de20ee1e42a015696c6b007bbbef731232f497ef2eb656b3081e4a47e7a0f188c161a7921f18b5582ccb03bc065c1b6139b018a7e874537b6f38ef6d568da98ebe078ad4b6cc327704038ae4c7a8f75d6fa5b625b34a90ba88870e80e3d9904181e185be3160e85dbdf70f4efb3367bfc8ac75bfe01286b77888211e60e55cd17a558394089ea519aefa37c112d793184d3ff1b5280c82f7e7927b80a1091d22d5f32e4e08474125f5c03d812bc3b13199c236f99b5d712afb8e67101cab9bdb4f1e79ce0e5fc7a5df1924c8f238224109eb952c2f52d02530c2caed251bbed8e3070fa541ad06f665f79ba36751411b3b1b05aa165dea7e42dcd23678a2b47b7ca8467b689646e1b57e89a10f795a703eba14113f2931b8d4ee0010075b32af2c54d2de927e8312772b5062ad4140a05d80eba645c71e05af70285bb286c29cdd7227de7319c1069899d4ff36a411dbe18730cb7d0c634f15f82852fd22caa730d87c7ecdca88e205bbbb02d96859604855c5666102ff863c2a103fb827fce12dc9d067360875b92f33e6eee9038da8e2bab4575d8a13f8f0d281313c75b4ef9c9d40d7c71637e8918380b15e44338a0c0bc63793352cee4a0024aba4e4f47542bc2fb8c41cb697f4973b8f90106b124b81e4cdb0469d92502c29846c448ade40217f0cbc22443386c4d9a1d4dc9f7ec5a159cf91cbc2ef1a549fa180befe1ca24977556a989fda59e7362134c8dd6ae038eb5f5500e203c10625d739a938812a36327a9d22507d93b398d0b2b42737e4f3857d0c4f9ebabb0e1187267b2a494050486b0f1d2e81e34ed2ced6a0075c9d003ded39077531b1e9b0d64cb6b8090fea708e1f06e6088c11d5a612051301729103eaf1925782977180bb091c7e7a4c408c3b32e5eec1cb2baf8d535253b82325b7ab5a01bb32c98ac49da11c1bff20189cf33b25563ce106324a755208e3a644057b011585543ccbb2574753f33521d6405218e92e1e7bc07af553617fd260c349eefb60e7b5aeb0073e55a28b89d9987a420ab3ea2d8169d029383e4b9b84c4a31138e98f8b9106bed444e91fb1ad25c592e443b49910856a73a1352b2579ca241d104792822c0331242449d422190746d206c6692436963f05d4a9898b8a6cceae30032ae85b19203fd130409e5dd421fb5be7513e6b80be4c617c729221a295c2bd0d69e1081e15f6024fb6f14ca6c7351a8b90e001d6e353619ac733518fe8a582c80009a64c629e1ddc6c59303168dd68a46c2be6590d382b4f5d3370259ad89935ad24a0840e54d9bd1bdb4e79c622043e8b649f7786f8dc7836223a3b23643e9fa06729a52b7fd9fc2754e9b337dc9b378a5d5d2affbbcabb826f3c628d754163109ba42e594796df5e2a82e53e982310640e8b657e51bf7786e222f07bb29492e083171f64c870944c37794dfda330e757ae57b028228edde2b6487478a3f7ef013fb20035f183706554d37014d38294f05c5e8dc1e1ed3ae0db179a7a20018ecc6e8ae75ddb60ad136f962fe1e298bc47aa4b6b54d6a8c23eb83b68df86d5cf39590ea8c5339844ac4952110417feb01cc2b5d9129da611438dbd44634d09f253955f406380107754dce97bf25b89a44a275ee9760dcd26c20cfeb1e92d9d229662270fda6dac324f3208e22c306f4ad67dea0a900b27eb31381b8c560f037e0a81647a83bff06270c639adce20694ea82ac7d45509814e984fb839ee81fe7ddb56c46802b236d67e385f943b645c8c59b8f60bff2f0550722822bd23eb64eddcfc9c4b2e5c2a00a09865bb6f1d52e92c2f0308c2d85a7916ae116a4d391267b60aed475c8c9b08dd8ce2acc795089d16f9230892708d5bdd57ca82fc0988b4e96835a5a4cf9c139d52f3c14fbbd27e95a61b8cc6096346c4c70f47659ed0048c8d6ecb176907e58da0296b1a2f46852709d1bc60c95f961ca35840d40b444f616d6c73b8ead334022b7b840477fae5a34b89dcca91a85f157cde11a92e7019dd5efda4f6d313fbcbebcbac122041ea4b905c7ccd79b7983b3ecd4b3681d822af1f61c197274e15bb7905aad26b5d116d71a7c84534d597eeeb4a80e48c5f36da3e6e60eee41e0f3121437946eb3740c829228c73bef5402fabe752b78b0297bc6f2172554f2ebb1a24065e1e9cbae1c87baf4d13bc7f6983d084ec0a2e6bfaf1ae727fdfb4786b99e8e0190b265232471f20f255eb36ae585947278c51b3c71ab41f05975ca5783145be5812523eed1badff8a5c7256fe78c7681ed513a664b9d95755d919270e19f446aa48a385b4891a02a5158b63dcbae363e777437fc601c4134b3850e4028155130100589bd713f3a0cc066616d9b3da6dd0be59fcd84606c8784af7e60589ee72d333dccd33632317f8ed5ea4fc5bfcd0ff5d90055f0f95bfca1364795b25daaaa61cc73f98bebbb964003989c07b7afcd34122ddc68bc774ed4d1ea754168e74d513a1c47861a1b161e58d510fc69d9a1573112cd32a892f36a1c9d326543b1e79fff716121b0f808afe5f67569a887e08e66db4eb6aae83f3460d33e923639ea851927acb5efd0d82003e2de16a0b0af39c8114fb56541d7f1bdae1281e4ba75e264c3d7a6f45fd20ff2b533872e07716bdbb8752f9e702802724482adc9cbcdaa7664712bf0b8215a91b746b96f49d05023962062be70c3311fe2e46bd3398d53e3fbefeeaac982428fd14b38a050701adde4c84993fdac587608439610980f155dca8fcd3a801eb0f82e1acb100966da9167ec838192bcfd8b4eed255031688d46a3a7e6abdd6335bd6e81c05b95f725dd4202762c2392feb6ce4fdb233ef830526de8d619240c8aab303d233526c1e600362d4bb38308049c9dae442dfa07ad0880d3871b49261db02cafa307306f2b0341d3f49ed415b852087b0bde7dabc932d918b8d066d18077223fdac611aa1773e5d93e9fd2ea6a74879920412636c799c2e29b08003401453969e775245159a86c61dcb53ad908fcd31192259e315d4d8c3befc7f966eea693882425cb34304c6a78ca6a558465746c2feb21450675b526366de01dc9f51813c5b9dddd8f23f68cac8ba48b5271b00a97480efc69f5ecf1f2e59e538ebe88adec37a14627baf4ca83fcbde14f47c55b8dfa7074700df122e85bc80f59a2cfeb822831c4824a0089f3e0aa0102553b0d991a3adcf6c3e3689dd1a2698c9f13646b8de7b872fe19d3d730d6de7556d2f14afcedebde5d565af71d6fd7f7fce844bcc8c616c51e0c54092bd3b36091734aa3d9e87a5dfeca7d48533c22af84a0512ed030328cf73b781d5af37b726f6aa1c9cdf23e785aba7012f08c650c7e164536553829c25ab274cfbdf382b03efe602315ff7e0b5ae3bca2d1f59ff7e683cc5f5572d747ad17b2671dcb889c83b10206409b4a8735fab69a19c0958632a7fcea834add733c404008652ef0df185aaf4ea2c6c13d32be1a02538a21256e9c033858d37b7d70ed125d9ef108b82f902c803c6840aedbc243423b1717f20aa9eb266d1181ff7bafe7d650bd499eba0efcdf45a7140987b126ce86d8969b1e08454edcce7ff4a0d880b3a9074a862808ac49e7c4d3264c8a202ead6b02f49b330f3ff39f5b720ccb194eedeaf44d6adbfaf200fe69e837c56c1f4f6d43e80f4146858140ecd348ec7c2f1cbf317553b1568af5551790f570a2d23b5425d1e65cb287cdc3ae1a3920e5995c2f97416ab18a686baaa641840c981919c25c14c895f128c4859d00616f38af19623229b27fb189f716c2b30b80d97da1ab39c2ed7bc948f7a0631f2a9f398a5dcab097b93e424d6f2a158a2c3b761fb6004ecf8b19f378cd6162c1ce8a084aef3edcc41b76d8985c890844f67cc3516102568432974a0dc8e5bebf83d5515ff3189b1beff30eafcee2fe2f6dd77c7ea2899531b3558de4bf7a9919027f97a667fa4232fc0b042e785dd90ed7d1c66cea06662b3e542a8b91a82111149092f4b54a4cb4a63e3e93719478cd95572e87798a26f03c4cf9a25662f7363571293a674a069b3a9166119ea648628a251050f8fb92f4c8db20e3b46d98f35ed009890b5b43c48d5661567519800069fb1c5676141bb9e27048434763c3ea85f8ea3b23bae259a6079c29c53358c325c536266406823e759e954451767f192c35ee83764348a2f9a4abf0f8d4e267dd0608fcec3aa300788917752151de86cdca5ed07ec58055568d4b4982af15b19251b61802a34644906051a23bd2e5654859cc8f01f30db5b7ef73c42fe508767c6ed11fb90684f0f488092ba488ec89de70bd803e68638a0be51ea258556e15793aca714536bbc228a995f10b4d015cc277b383bc9cf63550f8d3c2686f0b6603eaaacccfa7dc391fa5f2223647d3129ea680c777e58cab467ff0eeefedf87653a8fe6e6c50d1bea2e0ce9b263db84360d6e13c23873e8300b6d8183abd8de8643d75535702db1755559d18998ae2a4b0afa05727c0edfe0c1b8d6b0cdccdd7846c2d6c02d6176c4b9ebf47edac0e5770e47f36a002caa700b39d14c7046bf7d52bb04daaa9c01ba337fdd5b91dc30d3923318511ad85aea305a37a68b0a6bda1565fe806f28ac51237848f652d54140cd35aa73ba7fd0558d3a6c2f6f8ce6df39583285113030e49478fbe314e626e4eb846fe4d1c828f7632988a75ab24e61a1d0b0dcd5897013161fdfee5fcc9857f1a765d523b4ff9d81790741554b823e51850143e2ed4fb820cc369f608c2b5a85797c6f262f8b9a93f28fbc7f1b0003f24fd7c4c6e59f9cc73c25fa237fc8fcfae5286d6f88b5e971a4d9b9a8c2e5bb4187c2c3648dfaed80c41ca10e4e7cfb6045b9902feef265a50658a3209c2897aab83bc7660d324d118d84b59d7c1831c1a70d55ac786a960387b00405a0c5eaff740d8dc4ba4452ada8afc4e8dd4d046d4310d90cbf3c8c89958d74c318ead209fbd7d6522feb7937a2fa3fb285fd8cb7edfee9e0f3ef40f8521e97b264a5a153b30baa4f735b15054115b632f44217b9e20f38d330b330e304fb362d5957b626f159cbd2135341182dabb7da64a6f30d204c08b75d869946293592610f5415ba220c39fac409fb1e04f14d9dc489cd806ef219c406e2f15ad4a3e07aff1160fd37276396dcf46675437a4d0fef55450933d442f7aac62d935eaf17bb3537ab9b6961f2f1fed60aa092bda76e1467ceb53e6c533e6179d4b0b460e8021e103737ea139380c5473209204e03535f783a70df106f0d80c863bb562d8174645a96fdd1882b4d401637abf35c856aef127da5744b85ce361a0c2fff1f3de07a445e38feeadf624ecbd6b04873206c9a83728f7b236ffdd98b2b30d0d4a84430b14468dfc352fb7f9076304425a5fb150092b71e731d9c8ba7e0867fc92197d2ba92b894c5a7a04bc45abc594892b529d0a2ff4873e50a70df8d0493ae4097baa98aa9907bd2d7584ba73f111f35c74cea38b16d4a6adcd3d54b8907b414ad1cc6129013086999f4b4a0852e99b26b761ef749543a916946ddb8d2090a122db989266b995cd443a80f673749367d1b003d59fa9655fbcbf4d46c8328939715c9565a9dc6adc9a59faed0faac801ce14a680aed2ce0e50cecc2f0106193964f8e8508063cb1fc11c108eaca7f1f08f8d5774686b37af84a0c96a94cc6c4024059f895ee2d8f6cc65c6c115d0274d8ca11cad8c496e4d5f8ae3d5cb3ddd6f0ece8cd76d728621a1fea6ea93b65108424f6b066a534a06008377aea4ccd8f39fcc652509f9f245b2231c0786b0faef6e1dc1e9cb9dde957b4491436931cf8f771c60715a5008cd89354d5079f676ee267d8ff4848e159bc5b14e93fea3a777c0677f11fdeb98a0de8e4e158d591ce1df8d55e2b360db2fec82d74ba2d07bdc67ee80646c93ed3df8a90148b34b7bfc551e8199d62f72553762020ad4598ade47f6c43ea1ba6d9297bf26b0ddeefb05287b96c1aade29daa9c2abe85950fbbff9621b8ea8882f266d431f9ee46c84b778e31e0d1b9de67c7ecb798c8c63931864c63cd6d46ab1b24e69d7240d9ff5b0953b72385b7234f8879cddaa6ad6e4768177942cdd9bfa59100d1267605bee2507d3162618f1cb0d949eb35534af752551af1fab1cdbc9f46d7f3a8f025e0e498a0a5545282c413fe4fabccbf42cdc776a75626c7d02a9245587a881e67fde3c35e79eeff5baf871d0dd0d8cb47faa11b72905e94ea61db4c5057ff4efd323774d857306944589e9dcc2ffac7a170592f79a928283ddacefb901c54d7517a537c22a9a7d9ce2bc1fa25ee38f4fd8cb38788440d010c55d030a3a8ad3d12f56bf7d14ca3a81ac1103e085090d74d80b3a94172ef063045a31c9e58ba6781a0a18b8e18dbf9386b82b79fccd321325ae7234efb8912754c9655ae12e05696c5293611f98a3a566adf28c9d873047946ce5902b58d88fc21f89e36d39eb51008a8690739a1b9159bbee6509fcaeced52c4d39c598a5ee1c4afeef9e8a64b4d57f0cfed1f488d2746c00b82fd3abd5389cdc70614932e9386eafdfa290a2fe1585d02bd8b5e0bf432fe8777aa8b5b596487f531cec4ed300a127bf5e4f4c246bf754d506a6b07ecef3491f34775acca3b51786ab6728fa27b7ff75a1eb680092196e443ebe63c828fc028d23e0f59e8322f599d1d1124797ce805f8eac3e99a484c01cc0e368a8b2869a8941f04b2f31c03fa12bc66a9613505f2a7dcecf704e6b41bffe3c77ed400db196370197274214aa2cbbe2f3d4f3482f711a00566fa866c5aaf3288f56614e919936985b8fc031cc7fb70f828bf1f438000a234089b679a34d1a8ae4390ab6d51f20c7173bf68b6086ebd9806d60c7f3978ddcf35f74a4c1ce3ffd09e1c3cf5afc4062037e0a004faa2ce980174e5d5f07d613d23a281545fd109a4f124aa610e0300184dbbb23ccd65e50759e102a3a302085c9fbb1de86aa05fdf6566821a70472b82bca51ec407b659993dc2fdd6846b22507426ffae754b0816b8041d80b66eb30c33086610fbef52012452092d82e066e045402877c84cc273438b050083d3c6f2013d0fb027cfc5e2cbf94a93263d91aa54dafe332e1a81be00683f9d87944f6e0bfeef9872fd53e348cab8d1a035495a7a790e03e5153c35ae4393273017d046786f6d0c3c001b77eed0a48083ebb70624cdc43dfc56f16e1ddd9dab7ff8e36e76763c915dd02d3821e7cb91d7a964e3eb9991da248a7028647b62224e9a37102c7130cfb6eb036f49395a36e433e0bfd13db74e313e66e00bc9eef1efa275c05394d116f94c3a478f22e00bf8f70de68cc0b4ae36545a0352071a2896a844beb18bc92049144ee45872561409e4bed21d3c8c0ed903f2d98c93b994262588559aae9562d6babe1bc38c0aebf90b310930becccb441b73603c3776d040437d3aed8a13b926abda34618e8d05be0aacecf47d17f6637fd2677e3c23766c041f420611dc84e4ee70423ab5fffa6474469282adf1b052cf2bd506526b899084f96b947f8de1ac462530602b9a449796af8f45a00ebaa24ccf0f7e612057fd7bcd02035b211e73b22abc8c19a282139a39b7ca88e3867e99362cdf5184ce8d1933078e6b6c135fa2cd6216a28f02104d5139420b8bfc51b0b81785ceeb9961479d211b7ed342ff61fb70f8bca97f70633e319c97c9c160b8d5c0a2197fdeaf235d747557d034a7c043c154c4a5f3494f006b6f15257b869f6088e53f10d13e4162b4411c438d902ec4e8bf1c799d674e70e3c0c08ca4c83efcac73b6a14a2ac1938d8b405a64dee736aee784d4aafc4ace6b316dc90b3978436c0ad0ebf45f0707fc64e3547360617ee57047731f43cd158a793c8e95f39c6ef8e87862c3c5f2aabec646b35da7b71d110bcbb035baf4dea48d3c9b76a76c9dae32bace33b3216bc6c4234245cffe0f291e99fe543c028b7ab6e9b61c253bd156cf0e32e68597bb67f348e259c9f381e269e6b8721c5ac80aeede15c69366b3f1272ce135c3de44c0ffcc473dcab46712d00e30df117da60431509090babec5cb9dc427d80d91204146596d5ab335dd5aa9926f0621769ac5703e31b56c3f533edec6f5ef3b3bac4639a1097a0ab8d678d89b4a008f99dc60d8bbfd76491ff1e5fe12f883c5d44dd25320bb14cc31bac5ceb7b9e2a5b2b0b7063ac2dccf09ee943e6b0a7e1d34d0a938d19a0e8f94059387bec610dcd86798c13973e077ad3e7e74845446064d8b68bcac8d03ea9fa698d005de53e904cf314d09fe6bf21913afde2025e40e07fd115d55a60e70b808e87d8175999f638e48617435008e405f75b1038fe74ead308a7f118e49df1dc300ba17bc259e54012988b4ed57a6641a7b34c780dad005484ca64eec01977870679791fe8669b0566111817d5c8b7bd41602f663e1102424a1a7e23a695ffd511d4e1e28957bc043a15c1b5c459bb200eb30fff750b00ffe7ca10051e87f9973c14cd31944810498fcfd053cf40e214cbd8dfc80d666d80780282abcebd95e42b3ba4eb172d89704b50d3734dec1f33a180ee55fd39fc59198b34b7f9950701d817990e5bc9f4b123a4ba6aca38a80e6ee751ad7eb2c557019a0c9046836e2c530836fe67d7285059d8ced981f2b9738fd18c54ac7b2aab320cdea0bc1ac8fa5f8c7a6cf6eadc6006c8dd3c20b9419691180e3fbb603762eb2c092dcdbacd89b08400dc0c9e6674141e2010dcf1025015deaf069ed980a60c5ad2ce2d275eb5bce8010978d0a17725b44b88b4690e74071e351a6036d9f07a9cfb00df63ffd69e7fad94f142459a3b543c5ce3a3bc93947ca1e25b886a00147ea8649092135f56997fe50f552afb36a838a8149f04a60752445e8349a5556d279363d3336a3fe2f33d59bed21b8ee6f3ce051f77ff60541f330ec95310ca0512d005d8533aa0e3546a9708147ccbe239896d3f018da74e5869d0a23ba004f44da01491ca35146750f3a22da433dfd693b638eab5a3cb89f5e3be33738c40d4913812a8446198876dcb2d354696f82d55af6bd440d7555906f28af7560f3fa060dffa63f95b0aecbb3cd2098d95856c1aa74c62dad124df7e02fb34cad6b5e13734c9aae60dba897b9570ceb1b1109a79d4fc9ecf24ee2e1d61af686e5f1cfd2717396360f27ccad49c86a7d849863c61e16c2c517c7c1ad32a8dd9da5b3424ec50c067a08e57a320d931229452df5f75840d703925e84187a7a5704f01351aca4557d4aa1a6a760674f8db177fe215ac116cd19c7202d1f49ca10f39a78bafd656682b1d5491f626ee80960a4357e21bdb5826e9b0c25d47fa6b5de30021744921323c1173bd4b1c6fcdc33f614922ce28bb3b95c9f49c85b606888866ffe5f1ab4183519e9315375fccc12e5a318724c6422538928da33e518ef6298654594ba1797cf1ceab7846206180f87b3cf4143f5fe009d68e0e05084830f3e8bb8514c6842a51855dd3da2c21d1de57a4a4919a113fa0b28eb108fa4232abb16301e84aa976127ad02c29d1f2430879807530b3d521444885a328b2215802b700a14e9698fb12fd20d4a61cbb35e01c3f1164605be8e2ae3c68af08fb5166fec9f73c16a0961f4b80f1e8a309f3a29aebd8f244ab3de993cc9b62e114eebbaf78a41bf549a37e6e4d0df01b9efd79507d826f06d20913617f090cdb3e621cd10f252bfb9b25c0cf6906d79af52308fa386be9c6712795255ff9d43e0b793706d3323dd3c0e972041abe19f1452822acd69a3eb08e8c4435d16935049d49c439f2f5d2f9ca5d8740b44a3f7980d0342ca8f2f751580c1a686045cb2dcea61a08e7e4c49064a075ef3cb185b62d457fc155c350cb11b86e16186252062be194817cb65a8f2c493484619b9e508fbcfba67b1bc5ebd54713e4a62187ab7c342498f9c4fcdf9247964cda652aa9d38ae973a7fbdd54ba4b4e24a011d019950749cf51ed0c2a68d82b7adf99227be0ecc07312c7b6806f5283509a15ef6244939381a9ada211818faeaa52d49ea5b849d8e9bb70a9b4218a4981b73e4630f24d7fd2d1b1cfa1b2b21f140b0cc8680ddd93aa20ec82f307cd66f6a2df5a894c4cf9c0d29e11f431a6b176c2cf56fdd4cdcab1ec0f0ad4a003743070ebdd10d18f7e12ff80b3de288a82ad20168531596fcf0edac29e8464d435c83dcdd9a86d42b6442536ea198aa180001973d1e88973aebd7f70dc112cf5d489e6a1f7f920b507d6ad620add2b28f5308d6abab362b815ac4c44ae36f215efbd81dfd5c90e3f95939e856e5e4fc29393a52dc19a9b92bd606fb9ab98a3af016ce1c7d2bb15d582a070382ca014d344520d7768e6033bcb52725f55c9c214eb4bf4ce7b8f6047702f5d25e2d8386cf811dcd82a3ad099f1f6bf90fc674f4acdc3dae6a1c5ec41824d9872bb3560019a4368588471e24fccde8de7cf92643758aee3be0b0191f95107f50f435c605e858768220a3651b226a830bef62e96cb571d2233d68abeb921e883472b472bb0e2d9a096142b0b6705bf4e08edef2f86f382ddccaeeb7dff6cf05f88e1a4c9d9868eb44b328bd89e1f2979ce5534334cf26686f27b75cb43b4718f83962d28f74ff352e5a54ce2ea1b136445c865afc010bff7763a69c30204c4bd942b377c90a36aaeb196466866443b26ec18a17aeb28b0e5ec185fe434774d87054e03f1e761054256dcb1c25ecdba1991172c00c856393d8197ea85c914872c4c92aac7c70216b9725b4cbefb2e860621b7b1ee05073c01cf368249c70596519263fd7eaec94d7186f2f6293b4c2cc700e275048f1eba75c9c1180277f4fef5b28be1ca5f494e9863d95c745331ff29f45ab1e5aefeb5b855c69327b8e51bb9ee338f0c43b10d46dc70eb43fe475615abb6a9bf71716569d885953e1764057da83b8ee5a2c2aeb88ebfdd5894231bda0449405685f75bf1189ee4614705ebacccca0e730700b9e902f1aca5dd640950efe46b26807712f2f6d9f80b09af439226cc45a42556fd31fb93266aa75b4d4ac14a78aea37b5c1897f6bdf9c27b4426ccc40a24a5181066520de767345815ac4d303fce455fb2147456a205e75cc1d36cb6840b802046c941fbb0b1adf6808059be7d1e74bfdd2755973b30b583b5d8e50d58374512fbda54bfd36a01016254ba0f53cb409d5097aa43b00a2fa7eb6c74fbcf0ef087e5f8f9fa4f82bafd7b8f10b522f73677f0a7ac6400fe59f93ce225328096846a6ec3690e26853bf9633946d45671af5671078770214c97a48cbc36fa2d3b71514ea8d51cb94bd191e729b86843e85cf697bd5dc5202b3f71f47e51f1b11cc3a6efda04f25515559502b30b774e8e556fb224110d56e2617373f4a5d59419ca01deef382b14d93e430148bed7d5b279dfee741f2003c13bb3017bc5a42ff11dafe373846e1773cbc1a90907268b406b59b110038088351df85dd4c95f3ad811e13b859d6f7f67f72ce92d528c55e0d185f5377381b3ca377662aa3cdeb9266678a408c2a389ee599358916e64db51919d029c511a49acc8178edc77a235e70f75b7e4b9a3f14276459905927f8f4a2d1870339fa05a77c809368a021c98a32307682d534a193b4795baebeb70eefb4080e8f3a0da3f0ce6b4e35936fb0d28a42bbbecdb0e91e69ad2bcf016678154d4e0de6dd148fdceeb65c08aea91b8a2f48effd42583d0f28b6640bb718bd966c9acb48f18a5c606e2fc996c8c724778970041c944439dc41819031f8e7cb370b7e092a2688546acd931b960f7c4ec1c5bc7a9ac3f57fc8dd206b7c327675581c22fcf1a401dc5e5aefcee0a73fea0a26c948b43bab8c6f34b64e2ad19ed21542ec7cd623f8e0a15347cecf8765cccae8fc3d24b6bb08d1e4303fff088757e8c0014cdac2551711f782ef3ac212687fbcca04fc1e54be333b35cd7cf8a44553cdf89b7d8ec20f6b9223e677f856686a0fb1f9ece254d84646d7b8e41cd72e19ee1febd4dc0a00bc94481f7b71e6beb7812c8e4d7a03f6608c0e8f80257be1ccb6e39fd29a244e58f0772de6c4560b11bbf461b11bab052d94d7928baeb72d6547a5a06a066f10a56569604a92d05d960e55ad516caa6be3fa4e0d9a79b10ebd93033d07e7dd9e47820a3d37b2ed18c65e184f1e7fe1e1f3df128b3089831eb0ffd6712351373058e1b5d58314954360fea421787eca9964af410978d766a8d80126c5601327df2392e54cb6f4b9bcbf0f58d97f3eee887aa827bf06e6d7032cf510fcd4ee15d49f6c76a1cd053bd0a5dcf367d7a820cbd60b149bdd9b9b344b1163000720255b4629091a315db89a3c185b7418c4b38f961678c42237f85143b4432041d4ce9543b4e25dd0ba29f3682d6af1146b67350b9dea91546cf5e13f5d8774a2896979800d63f87751825448cbd02aacace2f5b80d159a662310dfb40f44a8452f5792894d96f5932855138d4b859beb39d0030d6f2904bc3c78061ecc23074e1f435061f9b2c2461a9c43cd1daddc44ae9ec229d2e786bf617ed94f5a85c6ab334a483d77e53246baa6992ea191d14de01008058f5fda48bcc0590cb23bfeff7756074d9acfa4462960d45fc2221886d07f6e64ae6d241d7ec952d845dd730a750074c1d1895228c1a50d8e4c64e9cdb20c17cb9e66c84589b3a6bb31871c2a48b6b7d0e7030479cf8693a1e0dd437c4f03a576dd24b6b252e797cab6499c42fc30562b9de717c2ded316af4da83591e1a9336080f8a9fd004ff3e2a4cdfd629515220610ff85efa1311871a24b38385fd80e58cf6244b225fb75634d1bbf47e08019d56d5fbe8e6447ca87b887be8a83dae6ab9da89fb09d81254f11441711dbc9e6749f370fa5d22d8538fc0b74751a2409189e9fd9464a7860ab02e618ebb15522f144f188559fb714f92f2cc130c79d52b42e6fb590f725e8fb8f74835d7b25529e56d2016cfd4a7735628a5a3a8ed75d9ea29e3dcbc927e0edae320f4c8cd0ead703839fec9bf3c0f6ce44ffabff094811a3c9c09734b57a2dee9a0b558f05b53817003b53df8ed626a5cab9ec6312345acb348420a343d7219226e6c6cedbc3e22af3ffb91a3788f5ce1f723c29bbeea910a17680d34db3e0af7183d19052ecbb39808e517182ae48ca8d819539dadfa8163440054047461129819a6f28239c914913f8de5c1e5d887846e4ebe1c7a54008e4ef029729169e07e1f8938ce59d77530a61661eb06d9c2b4410cf530dfd5b8c6e635d06d0b90cf537f0e3322720cf0e7212d62f797031ab9ce9621a57618fc964bdfe1a4212d8267a12852fbebe977be81e5253f1fca63095c7ec9f0b54e98f6f89f68b1751ef69cb2939500b5a553c9b3b64f25ad0f4bad68811e84d9ed4bef6257e2eb611af635e62a1aad81e6e3a7bda5a28c1c60c8575f20e5cac0514444c5b6376bae59c5cc05d2c64a034b432a7e999ddfb39b87935bb8ad76bc2293ec04f111277b7c150abb1bd3bcd4fd1fd6079d16feeef889596cd4280f756959f9ed725a031ffb47e501833789080a6f0028e2e183e1319b6923b25a3ea785f8effddc19d3d0e41478f17e9f514da363caa92c00a5dd60f77dcf2583059717389c375bd457549194f6956c9146f6c06aa82bbc51bb8303c8ad9582eab2f315ec9c48de763820393f6ec534de2543ef99922aefb00055851b1f90414588a61ad23ab01cb3a6163bf126fac232e122a2906f3ee97cf24f8af0a11d9e7016c02c74d4e0dbdccc1c4f8162a103b116f62bfeecf376ad519bef05fd95ead94ee07ae826735c04a4ed00db45d364919fa21f28a3e869fd8ab3700b4373045f865840705154d33b7258b9c404f5dacd1efd4c7fbc5047b9355f612d01407bc4dca3bd5505300a8911a9019501dc848f8583f12166af0bd989652c267917ff314dbc7b51f78e69098781ce007196c80d0751c43d14ff3055fa0dffab875a7334c383a1bfc4674f7c1f2269b51525f03e293fc3eb75e1c4bda93fe15cd22edcd76c34b8c8903dbeeb5a145ab9740d591ffa7ee5c3d81c46d0d4099b1d3b9d74b46c7337a2eb3c18f79c29ed9f39ece11bab43182f6484a3b217537c2051f5836b207790afdc4d167ba4f7a9edad40edd723d175bc827bf84dd811d3491e3a359748df7e98ea09b5d77dfbbb83b816f2e57fb6f20ef6bd62defd6cf3e57dfe0d845319301b88e16f180b338dd58b4bed0e048a0825d961c891b5247f30531045417dbd980727bb00ed3948f27ef05fcab2551a5b3d34ae7b134737e401e952c755b1f796fc12976fba1c17248be801a2fab232d4a4b8e22f8a4177eac5224b2d3e17604cbdc6359f61578bb27748e7c415538a5d1440a6f99851ab0571ea29c2cd5c3d882910d0f084316bd098e42f40292494efa016f3b451fa60221fc02b6958de4ae349019efc13590aeca088cab6f66ff11d9b39a2b1fe26761320ae08e705d01eaa7ccb7d43838d2a97a6da9d40bde3efbf8788550fe2e799058a29a1dc86ef54a0919a4036016c54a2dcd2294d2e09e8b80b709b37659dec025528900852d326242b3f24b964a8b36ec09da792d1f52755431334c233503569837a3267c818ffd4c280967b38f5dde0bad8ec1fd954fcabbd5a52f851e536d3b2cc77e6e375081f27489db78a7cd9af4471712ba623c0d319b9619796fd508efc82bbb51ce064bd6444ace8298a19db8eb07b668cffebdaa2ac441aed04dce3166762846b08ab4865aab61694d79ff085e9e1acb27d2e0cb4609439cd8240384730ecaabdb4a9052cd299c502e170c358236fddc6e22eb64ceb2db9564cacf7df3514c53ab983b379570b2dbbad63ebb4696f72761716ccdc97c34bbfdd50c118408bb4d0fbc08cc75dbe3a036745ab7b7fe3b6f5c0d6a7f2a04ea314eec7ce3bf56b5efa8b54dba7aac9d5017cffe32597dedb53f633bc4f603bacf16925a2010334e072e8c68c874be0062cc6a1ae26667c7f07d944fd18b88d525f61003ea1887e7917d23b7da263e41701853279e53b474015834425009e65a90a285058c9be168f5d58af7ca6d62f76ddb5e50db7bef2db79432252903f108e508240935f6656a08e96b2ced369227535e901a661589727777ef81f52247699a6b6ebd0756b35a6c962f6c96dc0f438b6dc1642a1b633599cac099b3d0c610c4be463984821c9added799e675ff645c3b50c16a556490a6f891d752fc626d37f10145c40c105f972eca84e391ec243558850e24b8a4865f245cac9c4d8877c286aaadc553eaef271958f8f6ad54d81bd1f7dad534aeef9040517eecf54f717bc790635ce0cb9efc0eb36dc73ef815ced6aff84acdaed2bb8d195ca8844d9387c563e2b9f958f8d75fe7ca66aaa542a4a69d775d2c7c7a7e52df195ceec4f7d0b3b4a2ff67e50efe160ae68621647b04cd341047e6c12dfc67e168e09c834d4c291012639bd1f976e946ef4b539b539b5cb714c88da90e99151d27f3afdf6ef1a3297c8a10d2a2922b60917a96d88df7025452401a92d7452847f66cf2cea21b2d64e4b860e78be23664fd1759b062256f49a45f2a687f8b368b29e2575668fbc6942f69b645896e3dc841e2dde9ff9d6dcf065167980276cc666d17ca920b5e42cac31b5b86ddb26d3733ba6073aaa350c1e65ac8646994c49721820e514b24a6ec0aa45262d78171d721ba9a18f1c93c964aa412322841e5da629703278a65606a7145b21884c57a0c8adb1b41fb769975628d9092245a462d122c5fd94231b20255332f5e3df31d17e74c0a48e5442a272a04c91fb4969602c5807ec2ea216894c36783f7a1bb8efbc1f3d0bdc77af29216dfab526726b41b9b51f79d33674cffd9853b7f8503a59e89efb163ab08551a8fd58a1d98267386a42d64aeed75a370447d97217b37b75f750c80c35673fc72927784121d3840c1ce776b72b64ce29ed682c120a996f835af41cd4626badec44d205cefbfe202c79d3401e0e5863693f2d6a3f4d42bf8c1578d47eb49fc691d929a51cc771da8ff663229241a2c42a31712fc626d3bfaba8ea7412c57f9309e397269ac7af79fc4a558e3a9da8ca3e7de9dd05962e4da488d41ed84879371c4de1f8aa1d1569e8e219aa72a44b154396cdc90569d1829fa50994286aa4a90e7da22a2ab0e836dcbd18137144a69cc9eeeedbe2b8992ce551099994de3fa1a36166fa1bfd19c4e5448d73dd25ba8d46a41105391489b264a8a44b255d54256fda16c99bf69883712f2de6b817202320d27daae0427fd682aac747c593939353adb59ee77954455525964c16ce5d4a97f28453083d260c2649df69286598ee188c02b8989614b93fc59d52dc8f02f07efbcbbd7c6e9b29b0c9f61c78af94a97baf37531cb8b383e453dd2339a5b8f738239284fe09723cf2462e60e48e64998091cb21f73b8aeb714e0729f637e7d3819d1a813540ba2f92e23a7023023797dbf44654333770db62b939559edc73e1f6eac20df6e2b660ff7103038fdc8a5b499d39b995087916200b20cf932ca1fe7c1d12b5b1be54027d1e6923b309487aa48dcce3fd311590a708f53796a32acb6e2cd6c6324d6ef5d3628a5b396abb17d31184dc2fa508db6b7be56cb0dcdf291ac09a153671f56db99fb9c9169ab815f67af8d9a4587d4df048bdae9aae681d52038f75655aad569b197724bba01bb24811a94798e4509ad3001246408d4680824739c29c736a9aa655b759615cc6cd02b833cb2964b4f20c6d9665d9bdf5def7951b91fb391c33f23a6efbe7b6cfaf8d1b755e8eb885cec361c195d216a44ea772a60c320e4986aa63b81e83bce9ef84c0f6afa6695af561b292b0187c755bdb62ce15c03a920c1e7d6129947edde6fe28545d2cc6a9fa18ecb7f673b6666bb698ac6aa5f9826bc7711ec7791cc78d469c0f93d50fd08475bd99712fc626d3bf287235489d4e809214cf14315a29225d132da9fb2366c5c4a44eced07d2c9a9e34095ee0ae06a9339fcca013c812661352846e3921e5c8fdcd4a02d36779e10d59c06e3359b33587e6acd6dab7d666d65a5b298bc5459105e9e53f7da98a29204b2a2a27b2c3709ee0cc3e539036fda3cd0c07a4f433ef2010d27f5cacc50693db676cba0ad65cb4e47e923b8806191c42f3a5ffc0213a9e1424e50c3c4ea19ae9605a1c390864e649eea5c5be433e3c6426d4f1332a0c438b2de2f7d0614f039ac2e071fa7c4c60a12b83634c9e90d0378357a368becba3c34c5bf0e8301a70a85172faf69f133c5216a5413bca281195881ac761fd326158c3700c47313c9d726ec0a30bf90d7cca4495b2e8c273e067646723f39090e594307364cad2be7389c8517eb1c9f4622e11e5ae207d4269206f9a3e316dfa73e0d3454f163c53a88ada2077d839c0a30bb9d0503f80e7534f28175ef227033cdfc13a9d66da32e2136639254c16180bd647f03883382360a818f1d28466d6278114933a2350991458f043f3fe354ba11ee0c81c0de85edaa69fc6613f5a61ace491b21ce6555096cff65112ca2a235396a31c46e50626595251bdf23883a6cc51459e418ea2540a951b5e546e286ab191258f9415d4935bb6d8e0c93da99412385313ecec200994296bb36abf66b6eb6694cce7e4e38fd697d64a8b73b66610abd538548a874f82841a67a86975f9f54ef09fe1018f549504c619697915526786de86bce913bcecb09def093c3aac71aa10532061040779742fb9ffe38259de38d5fb24ce8169ab451248834a20657dc1e30ca2ac9d3c5216cb6135db4b2dacece98f0ea3b058e3c81c43df0d0e8cdbc02365d524c11584a1c5aaa56de6572b6d339fcb0f9dd9ea07b3f22caaadc993eb101da22c1a448213da7a967996591289c532c0159c53772a0177028416619a642fbd0b64a1ca893f1127f3a70b99d67436c0fef36bec17c956ce69ede4ba29ad5670b2c768bfe059ab95424e89ba9eb3f255ce5cc5649a2fd87fe593893c7f72a764cb3187d65a6badd7c1d55cd996e5090a0ae251831cc58347108f201e1255a1d4201e154a0dfa545227a74e216b152d62e0357e3f5c1414f4b9518b2842eacc7f39e0d82287178cd17345ca71e08232aafcf045d04e0e724e39279d38ccac668ca0f982ed73fdc5da8e498d491d529e5fc17c2da9f3803cbff640a2a4db23798e36499e3cf266be9c3f63f2f42188dbcc51767094393470111ee56bd60f7d98c462332b26605dfcde91eca608ee518ac02245a4320125c571e008b5d67b4768b1dba63f015284fe05c89bee4e51300a3d8129b5c82c72cb2bedc5bd125fecee2b294211b855785a74227da7da5329de72a1fbb4feb8575f4d98a38aa4e8cf98b7aa771aa7e3f146a0d492928d5351ab54a7c46d2253287ec48fce573f60ead27d523a7241deb85090b75cca1367fd38ca576ef302892325fdba6a1caf2245fa943ef5217943ffd3f2c22e4f6e43a74bded0cfc2511665faa3a7f886237e0d55c0dd867e95225307fd2786fb475f21d122bdf7de9b65bef29f2e083cbaaf1a456b6ef655a6cfa2ef41f47d45df7fe8d7d111b793b5d65aa5ac347c03737286237cf2c711f2edd06406963fde2642be0e205c23b36985658f190a39756a60f9dc27056e653f81d88bdd66fe4846b6d8618d09fefe35590d0bdb6baf8536d8df5ea6647b3d8578589342a9bf3b145269e82cc45f0a1161c94dc15276500a11f1e4184a59fe06d6b0d0a52e58c382b5217baf05eeb3b00648a67d66c316b62e6c1616bfa76dae60ca38156e57516d1a07277b8c5d8f4ecc2c01abec95697b7525cf09739b51ee8ac0a36dc1a66bc21cc57d1cb284aa8414a1ff470e89aa4b489bfed3e9000700a166c2b22c038fd5955bae7ec0eada964bea8c1c555b5c5857ae32f0e86870540552075902fd7e7f49545db90d1a52a77e0f7a89c643541710d92a0c69bee0b17dc063d74e71b64bf09fd5354bf0b07fa608fd3dc38e81bce96ffa9de18136e6366dab9036fdab2bee16b93f8c58ab07a185b94d4bde4c2145e8ffc8c0de3f309828c26608734af4443de43633288f3fbe508b6d87a6c042382891c79ba9cb6d9afbff9edc3ffd835d19cb81c74e896dc5f0fcae476bfc052749c0aad3eca69452ea4ebbc3539d1267850f9c784288284c768802c427051e9b4beec2215c582415f345e6c7803de436b2252f171cc27741d4f483350e6b1108f7dd3b08a4eb7e471559a58b3cbf611dcbf33bd084e5c02350749bf95e97061e3fcf9729fa038424f028d7f8d3f79755b0012683697176911be6a563cde508fe155af0814237043e390c99beebe4be1dfe02f084b6bd56af3b0c5fee77144da9361eeec3a6b9a369f7de7b6f966de154f18029c34b1964c02651f69db95a268516140dc12096a5f7233c4d31434a1efdc78c279293a51b603945cb8f2acf2953ab3cfa4f1edd27cf9523d1381dc5c79fe4f9eed3a8eb01c882493003ce9ec31129c2fcf16ee1c993678b4a6ee0f8e5fb5aa83d67bbe9fdb036cbb2eb819004d6fe4a296aaf79274879733ffb0058c1f733efa96a71fed6e1e4c1abc6d942d37747e800c2f2bb15ceb20ca4e16621dd6f9f53e51b937d47deccd7b1041ea7efb436892ae0a92e9c4415ccc2b15d33dc4c5f820d98a14509d38225e389a768b192e7e46eab32094a30b31692607b133a6fa009336b52de68b7025a38f67b7f2d32c375076a713a6a1a31052153734e553b2bf49f16e77c52111e8bfc84d0a2fc18780bbbb85b24759f76b8c28e7ded8ba4324a9fbaa4ce4ca65f7f2a2bdf2c3dcaca3e7a0517dcc6df82354eb04cdd7702247b7bc321377b99ba0f42136c3f0b9b6caf016911cc711b7f0df40182439c00b19f85436417327a70a9523614ddc67f9b03b7b04219787efd1ac3056e10866d85ba42e3d4a4306b32cd9dfd5b4565f0049e734e77cfb22cc3c288973b084ab55ab3e8e8d1a1e4743a9d4ea7d3e9f57f52f1047154a6a5bdf8645ce8699e5ea7d7e914733abd9cd4d097af174d4c16bb3e8eb245de4b47ddf1b2eecf2af7937680c7114ffe806c684b38e02247655bcdbe9b02672db7e9b7560b3279a66af2481d1d242a2323d3c1f4a1fe78b26156145a57518fc2513465453814b1dcac284b56b4c2638625db22970dca591a673efe7c849c5396a95452c716c91b231265c9b04599ca160519e18f791670c8c2bb4d036172b5d837b345955e70848c66e129272bcab22cb345b6c816594a694c0ccd8ab2221d3da525a695c90897cbe572b95c2e4749d77fbb6868fa95dbd5b05136a7168e546659f5ecd7d7bc1ff66bad63119f2c041c8bf864fa36e8f82134e1912229d3cfbce9fb456f9a97a886e2adb8db4def047a63436c50438b9d948ebfb196d47940ee99dff13bc221a61d3540686a9ee68ba43813d8ddc36332fd075f03d600e1f135cf23ec9e9a0fc26605edf81d61affa874363c4d32e4d7563da8ed62e475dd7c8e5baaeebbaae769d81c71bebd52af3028ffdfa2edaf1fdad65db0176eac61c95c162192c8365b00cb683b4c37463a41d3b4cdc1606cc95d4d16e0da5bcb93e7c0694291d200d464071446af610d79d9319af3e056190d9a434343334343433f79a6e91527f52605d627aa4ce0879a8a5b45966efa572080598d0ca88582c168bc56273526a8add8bf17f7f8e6cc51cf51ffbd8c73e669724c9a215632821456a0811199b23e5647b22a720c68822e5e4fe7f2c2675bad5e325e98ae115ee5e58ba8d1498f4a59fd482c95436162b918090bef4f34ba5d20f8979525822954a5a09a4a5278543485f0a6bbc97a921a5aff12addb41269dbb69e1ac0c91373d12f24ca613032c2bc280f3118cc51da1764c45e61623cd81875d1d07ae1c225f7cf0ccc92643db1d8b5328f6c98f1b83cd00206380053c3e5e3732af5f7d136966dacfac89b586cd5b5cc931ec3bbbbdbc7e75e93e95f144f2714dac751a79328fe8ba2c8edb4f8433cc100871d48911a42a40173342122859fc88909155c524eba1f7396e0418ac847440a874efc65ff50ed0d4ab47214ee521fc1a32c9a49bca7a008a45016e2ef7d1b52b29cd206501621cb29303099c5ba933559dc095e129ac5108549288f04a41999863309cb6dfaf1bd9315643281d2c6df9d01d95bac2c64bdbce911380a004a46cd54bb90cd507327fa107d741ee590fb68514a49abf7837b510e898e923a12d5411cf193bb7d6c203d7e1b64bef4f36d28bdcc8fb2a8c69f05fc24e9d5785801fca407829f2423450a65525a6cb5d841198c49afda87c827784d200c5228538aa5c5061b086c96cf2af5335d442d1635d83e452e1415d1ab695996619cb54ffb148dfa831748297d945d3a8a01728a1b934303ecee5eab3b25ba42d343a364be5eafd7ebf53a51fb72d4e9248af8855f4db305a776f06283149153103c66a49c683f62fb9a61491d9585398af4f6857bb229f3b12fd25b6bb3f79af9a32f92f240d203f19ef4f349a41f8543464ffa21314f0a87c8bcf7433069e33a124822850158a60a4cf3f8b9cca3c0f7336fbd1466fefbe9a9f0fdcccccf843d5a741ab0c2fc3138b397fc7d72e04f47162c2b9716f163d01e91373b3ac2c08d832f563dc775edfdc0a71238762e7de5d2385fe3f87fa0942550c74b0fbf8fae63035115dd699c99f72f55c15cf20c9dbf1fed8edd913a8d2573333ac071e6123ea9baf7a73d8e92a98e0b47f1bb5ef317aef0fdcc8f76c7eed04e4748552d7a56e434fe9b0b7fa1103ce29ff991aa3ccf927151c6e108c3f492ef73f395f15322493226d293b10c44f2f7181c9d2873dffbe8cb853c1e851d3219639cc23fbd1ff84465a79525feef390cce8cfe03bd9f0147cfcd2ee6036f8b31e1d8e5988f792947930c08fe901de52451cd32ce0c1ca97fdda179b43b32e59ec13e22ae95a9e0c0caf3c50e410d43ba974e611dce17101e9b68be888ab8f7dc585c591ac7ebdebd6ddbb64d85e56af75e6edbb66ddb885af4223348f0385f93cb9016bd06e92f578bb3895c7ae92cd91b8bab9ba85b5b51c73083dc5ed332e99b36bb679117ecfed5a96b8147c925bbcfd044150a277b504a29d73f9952d5246a23d2d541f89069eb9029751adad590a3ec8fdbf8fb4889602fa221a2fe7117727d5aa5b4bc20bbcaaec2e71a5221bf2bb7f1c73cc02315cafea325ca930ad1212b97a8c80a4f8a31a8744da1f58089acfb78cc91c4eec043dec8f978ce2b8b784c6dfbec431ed35a5adbce1ace9a6b0a6ab595863d1a15011e3f862085204094812a5600d20204a82cda4282d4b919000066e4d73d12c9b6fecc71ff16dc1de4d1a89c1e59ea340f78cc29226ffa679260194616913a715c7aa9b440689d3d18408071c4370b426d94e5941e2c311165aefb85cbf4050c042ab401218a1862062b90c2c30e1d40a3063c643c713285cb1457e82b0433d258638935d068328309b09a10a28b2bc410c3872f921851f1c5138fa271e7e7e4d1847b0044960bc8720a98a27cb39c02c64506ee2ccb5cdecfb21866a86188e632967b6a699b79dbc0546a99af59a41d5134b9c48a5aa4c1c124b2c24dea3da594b27df0ceb89e3273ef5255f0a79496b2dcaebeedb42ccbb24d9b598f3cb37a7bb4383ff4f06dc0dd3b1ba7524a69a5b1f2d1f07bd8aff4eff77f405f05fad2521a82b8c5aedf55f0e65a6b28294d756bb986943e0d4d3db8c9b59742bbe7296f4251decc8f4263a5ab4274eeb93bf74cb30931997ea5999b5e0a3d3d1332d0b3f4a6bc91548e3cc933f4ec1e8d24c83494f2667ee79ed1df1fdff106200ab648f0f8cd8ec6600b7bc72f4f123cdc577c52eaef733e0d3dcfb06bb1ab6b66091e6947b30c43f2a51987e25c7ac31aca16a7bb97c1ddfe51fe955486340c49286d81e72f71779774f61728e8a82207861cd938ddb4ebaec1d95dbf6b8f3aacd53b618b0ebe5cb93c7c89e2d6e00beb0b3d828bd982a5bb87a38bde3de577cb147287a30572d02b8c1c7cf9313939ddd88f4765f2ccf9238f1e3cf218c20eb880909d074a78504676389e647f3196e4840058ea9231af18591bf10c47a88005c6114a767ca4cb073134da8d34dfaeb9689cdc7fb19729b9dfb48321bcf4e4fe7e1a4216217e28620933740083149d543205028e4c337d14263065caaff8c60bff10a58b3c9e9c10b25030ce72ca1b4f747823892bb68479e307eb0493b29cf286ca0c37dc28c231594e71c38c30dc70b941e4c6cf109c9401cb29b8bcb24c9653a811bbf796d050b1001f1123994144cc2a48260c9e111144f80c2e907845b862cea0d2437784cfe88c277ce08c88796728c1c35604ab3b8388241a1130ee0c1e7aae0bb6d396303d1cc1da02535244cf192b5896d5161cec6004eb9eace88b6f878df0711b79b750c1e382a02dac1f8a88b9b1ea36623562b4c2e8420dbc59d182372aae139c4589823d1974c13244f480b72ca78401c416611cc9aee06c8e0c66b56099315678a4c56501be594e01a38a0fb8cb720a1851e4f19483c05e9653c060e5996a0366add62d2fd691e5942c2cc834cb296d58c9a3a955d7e038cd6f4e7653d6b65e4aa95fefee9612656bcff69ff7ba3f1d4d3ebb7b9b690137ce3c5369cf6a6b4f9bd99e594d05668afecc32598645724e06bcdc652b7f825bb632c45a06333727ed3aebcfecfeeda1a9c598110629846b5a48dedc16c79ab9987166307338a627967574e58dfc99b9d1a8d670c8095234ec22def767e4757734842cb951d0ddeadb18180ec25343dd1fa594f7662158edd6ef0835b9c6049e2fdfbfdfc196b902cfbf2d8eba51109e3206484ceafe96c713a4a4dbc8c72329ac37adb6f346314f8080806a4c4c0c2ed5c754a6c7abfda1404042566c0c1c0ed4d3eab1f387064032a452edf118fcd0a7c14721db89b4e90f0cb086510c6ed31fb386db59c2742245e88f41eef73c136aa661126ff25c47692eb88df6040c41bebcbe19fa0408080808887a5f6668a88a7ea18919e9305115fd62daf1c11320a0bb06d0970f6ae8114cb1f783d63c0102020202a201100f4bbd14ea137d33b0d9d5a0d0346de3c18562db368e07170aae83a2eb3aaf8b06c58dc31bf99c718c62a0d0e288c137c481a714e94b2943ba210e52e9bb61a693c901fb68060a9a98d296d94e436f2a7399a366528efa52f2ebb66d5c49731429d555bb4c46782225049b27133b99845a2793f2bc1ff6bd5104fa5a919949882cbf013e18204b983e3952c7e5ac4096d2421762d8c013896984bc690f8778358c62ba1b3ef6947c0a66e07a0b318e1aa5e48700c45b81c3325ecee9749a408b28c874a93b49a5ed4d4db0112c963ae9df4c4a228199bc00cf60ef870c12ecef9dc5dd5134a914124c983c13266dd32f998c9ec0f3c7c924b7a36852f2b998cf0936e17bdb874b145d4e4f9e0d98f333108310792219e7eaa70b1ba33c4ea06b058b2bcf9f455db237e7cfbfb825876253c50a9a2f589e5de6c064ee290723c21fad226b5d96c8dafdccfb71e9d8e50c8b3c7e39fb22676b78c9191b58e46c8d214cd64a2a5caad40050b1724c02179eec3e00249e90c10ae8b1e93474f3f4809335b6680316c50a921c68500508a1151c43eca4babbe919b9bde4eeee6e3a3f8429bb710c90c72e8f3cb650e3063580b2a7c144f66f32a9f0e8a1831a204007afdc6ffa168778f5e07a9dd19809e6f1f294c70f0d160ca191834cbb2e9cec31d656a6d973f7354bb8a1afd2701774d91c9a2564e17c4d11ac903a1ece3438da9154db66af0c335bade5bd5f4d1dbe2ee52ca1becc529caf551589535738f5053236bb0c9037edc930730e2b87f6f82faf6921236f9aeb3456152d0090edca51dc0ff7b372ee67957f26f7f345959f558e71ad8177c81b53d753727444c3aa711dd0cfea678544a338a01ffaf3bb16bfb034296e33eaee1918fba3daf69a81716bad75eb96b3d65aea940ba5d26b7577bf708069a911e13a290d0229942c654cd25c79b4d845da2957351073149c5b132a74bea19437fe5e647a5e95d89ab09ca5d4524b2d081a905ee431068a123c16ab81677bae36d84bb3ebd2aa381ed54ea3b8241c0f8f4eedd17698edb4fe754929a594524abdd24ca936034e925032b582f6320369556a7beca85216925d7007494e4a0bb3bfd64773962727757f037790dcd47d9e9c94f61ca5d57ad637d448dba67996cbec94a94c866d7a2a64b904313264d9432135ccec9f207b6c6776dd260479c0f3e5d3ce94e032ba75dd6fd9775cb7719da65d1e11e0de68b85dd7753768e10db9ad2bb5d656a734c96dad4a8ccd268f54223925590b9a1c8fdbb406a5069caac52858753f66b469b7e3de0190db64ea4dbbd90edaed4aadd41fa953a94bea580dca17595a9eadb5056d432df66f5748710b72d446e436438db315b57885c4d9cc90627f502757d8f14eb03b486e8afb8dc851dbcb6d8a1a678bb56886c4d9660ed2a67f03a712998093dbc4e490381387ed35974c166412fa4f8ee25a206d3823944c15a7e2549c8a53f554b9ca515c76a7aa716e26c58c03a7129903678d64dca6b5bcd23c2000f254994c18bbf039a6898e61a9404525566d5abcf3c81bd9e2f84195b5d65a29a5943ea5943ea5c9feb5d6a6943ea594eac81e3611169f73ce39e7a41ebe787c9c265b0b4660f62cf11e936b3651e3f05c93b7ba86b5e83aaa6af9eac5c405f778cf12da53647d5e48f07c9a3ca947a06d7cf8e4f6691c7f942ff11e6ad2565d3493f3481d2c8dfa2ca29613979cd0334147f6b0c25aac5e901862b2242749ee9d0ae683ac7324aeaf2a2c94c95863e1d9f6279b40936fcc94c30f4da66e42a6234b9b5ec1fe0035ca91f0951ba6f06a2c27f65f00d5dddd7d4a517e4fcecafaf429fd8e64b986d2bdc516e788cafb4f16b3346146fe46e4d9d5b20b469b16e62deaadd99a13e657d21832add286be14354dd38cf8ccb276332348a0ccd97db5ed6a716c19c6557eb6cf75b7914490bd1470b62d6d361ab2df6c5b5a1464ff69b76ddb6ed8b47b43a53c99958c95fb630d68d1b403e689350e8d0ebd8fe4a6341e4b64c390620fe158578b1968e190368c4c40bf1db2b016c39038f60d29160d5938a864af42a2b225bf92d9922b722f79038f902d397dd9c976723f92534aca048c1992dc9fa99a04298b1ce55e4819e64aeeef222da8638ef2a1ea69502ccc51de721bad0616d638de6ad1d3a2e04e7b1b46a2b4efb77048cda4d1b0d6fa3c3775c3ccbb657b4c39e0f9a3b772672c2bdc29a5340e5afd069556df8146c7fafef62dbd19cd28ad5f36ae6ba239e79c73d6215b390a86933d4627e2c45fce64ff0a82f002ecd59dfacb0914f1b09b59b268d1c2c5db0beea22b9aa871687a9a489c9cc6919e79fdc69138b44793eeb58ddbb850c8f6343ccd4073e338adee79cdfa7b88f682d43ea5210d345f13ec7b591842e3d8f0d4e3cea0c4458f1340542982e7065f747491a38a9623716081410884bc914518306f84c1c318340eaf420b319af0224a14372892831a4432086ab28233d28861c08d295138f184183efc20064c7544a502a02e5850381c3044152c7c60a38d1afcbc30b708827a40182db83285922baa7801828e4108e6132f6091440915396051836584f260078b9f2baf282f58c224c807b8e022092f45acd1c31c740738d8d203c7134954b1b28217a008921382e6f24296014c95c317246684f122c3fc1085164ee8400b94243e4490242a08a30c31d650410ea6bc6182377ac062e88a18726cf102dd218893204fe0704590133129b4ac9a091a64e084c80730604aa85e88428a315cd0f3841a4978dc1801134968f982ca182f262f3811aaf123469631e0c882441ba0175a7880920510515411021c565f70a8020d2d4ee0a04110196e708111a2055478c822f6421124a2f8b08226529a68a105f6820a868c4461c171c60b5a0f4b5c4132049434d8e8264210070e2e1e28110a420b8b76a14011592c99838da02ea6cc27a8b44443b65c8b27f27c39ff66a067071c70d1c10e37b0a2c70f71986144cac111aa487133684805f28a14266293053c3d6e14c008d54b8dba45923296582669cc91e2b224b69822c5dd8e82b2e5430494e2342b8ea0c186f4228a4f15aea32001c2e0828c34ba8e82430820c78f0f5d52f41da4384f505ea15aad9172507221470a8c55e642e2111536509d9172f0a322e549f8947ee58d0d688f399b68710dd29830537e919e342079f5cf9f32bc5c142c5fc272c03926073c5ffec03f787e5e9161b703962ea58f9ed38bf43caf34bf2f1c61985ee9bfeffbbeaf54fa6f96de476fb3f47d5f2afd57fa8ff425d2974834df47f22fe6f3beef2b7da5d257fabeeffbbe8ff47de9332f8552a9f4a5d257fa4abf7d69bb23de66fe2b3de9ad9702e94ba527919e449a012b8c869949e1045aa4de09f5e97fdff76ddff76d5fe9f3beefb9edfbbeeffb1ee35209ec5aa4fd3218a4f9af2b914a9c47a2c1df68e495b652e9493476c6decf46239a906a33a550c8f7a52785e3f72415be2fbd8fe63e5249b648c37e1f3ef23a6ed36e66bff92da1726427f7c892ca4e5126ca32cb6cbf9681c79bedcdeea8293485b467426769713303dfc699b9c55cc3ee1c5b50887d53f6fe3cecfb7dff01481dedfd39ad7ef61b78ed57fb15a461661acad9b64e5947e08e2ae5a4650b0c575bf2dd6632b3f4336bdd3a08496e953af7af37fd9b39083c78be5a945376d73a6a72e29664996709ad7ab9a791fbc7d714a13dfc315bdea6295f4e25b7bbbbb7bc0a89a2f26606adc611f27eb8fdbc13b0055fd8737d5d9a6b922942fd7a04899c3d7d8ac3982994644bd2a56bc553a2e6eba5d4b9f5a48636dfc8ce85736606d8feacb2471b4882a9cd9605b3b4189369385f2dce56f66f9ce994eea39148eed188e0640f4e66f1a7b2c3caf8bfff1e7f8f7fe63f1fce76164707062dcf0c98167d47c632194f2ce6ef6b164f051c562d617db5e8426892169da7451076c042be9f6166fc1f4893509e1675c0e3b7d71155b53852950935631e45327e97a9025b5558632dfaf52880fffbcc4be1fbef3f3c013130fe0fbcff81334b895a41daf85f991f03a410a864edb64541eb14d508000000c314000020100a0644229158382015f464f914000d7b8c407260321688b32088611832861863940140008008c8080d698402020b2ba1ed1ec9d590690b964f3591e8eb276b3525451ae6f376b814be5ee644bb0a8989d3b75811637262373ff2254e2e75444af19c3adb172ceb58cc67d41815a5be2abe2e30ce4be0a04084a1af55663c2c327de7180d298e1afe2db169d7ac1a9730a460275f908684f4053d7f593cd4174b5ebf9825c5ed52b37c73bf59dcd905543ce86407ce6ed0be9ffb22b9c16d8a7217c4df0205225dae499f97041ad7c2b53b5a5a0b8bc966f3c0eb5db0fee2b00cb91e3adca9d075c6b6684ddad537b41ab71dcd516d60d59860e3522c00bf204bbf55f2b6312e2a48717149b49989d66eef123a1b023acf0869e7bb1aaaba34cb4bb2675870eeaeb4b2d566fea89cff74cf7f09827d92ab0caaf8b734a60f969ac44c3ef1ad77a2441870e71b01dd7b2f5d230c5d122e3f38105bc32e55e0903a80611395b58f5ce410b2696037b2978668ce61801bb30fc66c7ea7bb6f31ced86b39d6e35a65343571b2d1fde9f56fd920a6f1195d9a91244997082919173fd36082604ee896ba08b22dea35320bd06c3c99d309a160b0ecd825d020376f99fe164b1f9a3f08bda67b2c32371d6c864be99d73c29132c3f61a6cf10352953c9d744e671f80de89a9fc77b4206b6aaaca74cddfdc81df386d52fffcd3724dc6c9444f8230dc4ba89de3e06f83ed402515b205942b1ff4b968e26937f22250ecf170db168e69f1b924f5a2b9282a8fcd25bc02eeac4f1f1c1fdbfde352397a67165835dca144348001cf328b76d06e782cfda1548fbe7d78753e409fea45a0e713fba5d8d287b0a71846806b064f99834944d6a5424d00f13088445060438be9940f9e152ee3a5c1973b33aa2a8d2c9debcba9afab989f83dc01495b0e8281970af051a6da0c72e7d08fe5871658f4c010685211641dd08c8f25346b33bbe066d21a3c385205777f21059956363b3d79bb6ecc68f210e618020dde621d03b7ec4b42899aeec9df81dc84aee9cf38857b887589df8c26cde5fa541054c08ac13f95f135d504b7f4f0758138e52a1e71d44346e910f1a8f49e2326725b9014e94ed3cf52f42c3e9bcd798ca9026388568dc94b555bbd9755125e64ef2f06e42f546b0c537780bb20a2826d9ee7200ec310369a8fd042440bf1b674db90dd5c902f3aa36b66d09b688331dd146bde947babad8b22813029387b4b9bb93bcd3621f0c198fd40bd8484d4e532235dd940a0b9881cf89191acd00288b7eca915145065753e8965150cd1e2a20923b139a258da7445c6555c89a7823040ce44aa898984251811fa244deb74937867e20b093e6010681e42fb6b898853ab4829b553f30aed5167d29038213f852e446cab1fc2efa94d27eaf58f3e0bf8955b13937f7107f3b6aa0c85b58cbcb3126dcefecb94c122422f8d98c124a6384a38d90fc184ed808322edeafa4839da8e503b9ab805a926095ca180a0f16f8498293356478db8d906776531e039b7ec9854767c57a399e715ff3d11c8f766566efc77360326d31275e48e76dd4244ab3aa4302d527b7d3839caf28bd72c25d091e6c953c5ce9f1194b4872e57a599fbe4e2b0ee1da69fa7cbce644260ade0d895c3ba178379b453cb531feb2ddd54100e25508ca205a32990c1465120e6917f3938d7f1f9f435ae92b49fc5f4e9d546b554fd03e0016bdb74617a2e1d9623ba4da8d865a14741c8b979e6e450d1522649db2f62d5362d042c682c3183b1c16d2f86b0e8fc542c3ebc0fc2b595f26898bf12aa2ef54050b0cb34af6a8e47b4e696ee67fdd2f0b5e8f657d0a43f50471c24816413f28c02412bf47d0f7222048dffbe7291ed2728c8f6065db3cc31b20b3739cb2ef01f5ebacd1d93a9897254f88248b991d04a49a65755da9f145d091c52c9d0fa5f8f8306bc39e5e9bd6bd4da8687d33b7b5ae4bdc5476875fb9c79ef66bf1305b2cfe8d91a1997f36e0b27abb5cb093e963c5ccf744fc2ea063f47c1908f9dcfdddbe16f0a2e9812ef465545bc9e8b3d03716bed85c4d8bd02bd4b1e36f97e1e959f572e13915287180f91a3a3a67f2d3be5a96269608de3101de10bd4dc2e3aa120e4ef62b0235241cbd3828a497aedeb81798216defa0a8e5a116c2c557321c2732f8acdf08fef33b620814d3db15dc2bf3fa9720eda97d7758abdd6fd9eceec79e8d4d996f1fd96faa499ee3bbde2478e2741c0b7576a88237493de66b1ea4ac5b67b3e3427be6f0532bb4da224ada4c93fd23663833d540be4a3d78ec3da0c469c7b7664a9846847ed73e7b67b10da0f8103bd39219ab2209a447f2de522b40296c249582a7f42a125672ce6f2dac6b4e25a8140eb6bce2966946355946a4994cc31edcf375e22285b2535077329d2fc16e2eecceb9568fe1dd720ec0de71df430378cf3f1c921f735bd976fb24ce4fc6ebae8b369d749f90cba6179c6b10b9e66eedb2112137bac0a13ebd061b7e9aec596519f17aa06485d1cda89fd3589518428717b2d689836248d3b6d470668b566b37875a5a0af592014b757b8cc82d272aec9bfebeec736e949251144547b3e2409be3f26624e8ae4d0dc2abf15b62178ae5345a6c6b27315683b27b2baf37d84ecaf647567dd95a385ba8b2cc3725c1cd40d4a09d8f6e1746949b404274a0bae9a06277b872e53e7f83b45c22dcdbe284c7a58df265e794c713ee1b6d1768f35cda10a7e5e628fa9c88c306443a2614d176ce8f8b9ca31a950a97164b5bda0d26d9b3ac25efbe2f6d817c781e3cff2156d7de2c425865549af41ce85219e0c3a875fce9bc82be43cb90f8290af14e68eb8d50061adbe934baeeacd447ee5deb82ebc963e5f2df74a1c087229d9f0ff440675666aa395e4300e7a8a97dd5b46d2e504c860f4b273fdd89473143881fa5c3c0245382735baecc0a412a07fc2df46b1acae1923eb7db4211241ac9433078a33553eee00ef9371c63db5938825b506c9ea4cdb7317f191307beda69f04d0faf1d81d22dc5bbd826ef9432574cd01ae026b4b7ceb1e93824ddb6eaf8dfd6b93af216e7dd601904ea16e0059cb1a7baff93dde1f1d402486170ce9227a2bf036cb2a5980483be08bd0d7d882031fdc9542a2b33c9116ee300cd9ab68fd2ccc668cfeec38fb381eda7d8d75e1b50631685d9865b3556017660c6fc0d28285135c985d211b4de884dd1fa47be4591cf707d91f9a353b046e2ebed276c8207040fa0cd86f425748b5853ccf1568228c985feb07cae0ae25049d1fcfac05ea65eb3376b23d82699eea4e37173f81f56d6465e9904c6be6228203de0815a821bd204b1c2400c8dc3888875c47fb210dd4a4ea32a6b28ebad43a20e4884995d0f3dd25fdb4d365f402e21d7a7b09c2de2c0fb2ca092dbb5725aec6e07e68686e58ac97327f421d0822a7084552d9ed188e4e47cfa2d66c32ed1fc4d6076a60b0f1455e6d286c5fca38f020364e73b52a9c89cbfebf687cef737c6861b78fb7cb80d639057dcbc6a808ec91994b60ad352b1d13642c20d0a432adb55c591c4d37273a2b5e12a27d110481a6c0b6e487cd14a9a5f5009c08e70327fa6122f79327a2f6cd8e88d589a6bc90e09f88bf9a7c961b071befb74cb20ee517ec9c1cd22723527e97a191f2a4eebba486d7c1753dcf001dd0979131238a02483d599421833a5310fbeb8dcef64f6a5d4f57851c683715ea26e4a9229d9c605de3ab9074cf2f646398d9ad9ff5468827286ecff5aebe9f42178539209dacc91925ea18b7cca3fe219f0485ab6f6d5590212a8b854985b7f01c8c04064bd943329eb8067c5cd668d7ef561fab35fad9eb9a204075db6d20fe568b7c283e1b598de63460d197589da814d9f8f5aad61d4c139840d5dc800f1cadb30d3abfa45313399866f572f0ade766a284cd3ad711e525474e7ac6e1f66ddd5b7b9a5a58116fe9bdc84799c368197dffe4cc6303ee185de521c8725023c3198bd28e35ab653a0efcb91fa13367893dc3d387c835d567195b4aa2b8a3ca46663f211b5d90114d7b87e63afff83efc1050f47c2bda17a706f60a40dc18f231191bf9f1a8b5e2140db2a88e2febb0c0398fc7dcd709500a9f382a7d1ee3ed9b3a626517b82976feb445bbc8d6a263538b26dfe71d3a7e9808d24ccbd46881573988b15a3f24bcacccb2fad49bbd08a3198fcbedcfe3745a42428f0f0b92cf06e2868857096dd2b729f77071e7d439007a751ff5310e5517ce865f815d5e8f9bb34f0682014b4d81323e24effea7a21071c43f303513d97126771ccb6b68435f3e96d0929bbbe40df4126bd9c1f9392dce73c07d23d5722fe84fc562fc94782ec94c0255cc2e23399750b113e05542c5579cf91f824624122d9c80a875402128448b8924c9938a117166fbeb4b0152af4c5fc199fa4a279ce955fe7eaa902fd0c02b7e875b6bbf4c10c126bb7455fae0ce57adbf9c39a9f97ada5f4c0ddf0558e3a8d6387263f71d89bdceb056c485939e09c0f5c2218890f27fbcf4c913a6c209313ac66ad916e1f551c44694b3dae7f10324b114a28a5b26828a3ffe9b8db5516164bd1b6c250519d1c289839e922609b0225da752874f3f0616a2a4b8ab90f80fa543654ef1a4ef1a1a1d55a47bc3f8221442886a8651167bdb344ffb0fa10a49bc4d9a72dfd8da51fec0277d8dc8ae39c45da21cedb152fdd20f199e3d0d2c8df087a614a48d0a230096e5c2fa1dd7dc4a265bbf8fbff549e92cdc6f19e0ce627483b225646934c7e937a9830c2b799d941af16e7d021c25dc90cbc1f6d8c07344103d0cdb99d403b734e7ad412b190e1f7702be4dccdaa24d99d0ee4808097d24787c252ec51d0e398817a5a49eeea971aea95da161f6afd5d2459d4660b5aacd9a7548f2b184d3ad076edf742ddcdad853e3efed083e294bce0fc3013b2b0ecab163bd3eacfde715725dff81a709283799e7b0df3ebaf2d1fd16c226a12cdb9da4d90f1f7163ef9a3422276826934b3f8ff897b097dbea1c6c5d275bfc9b52aadf3427457f7f652afeb5c536a660a6272433007a36cea7b91d91c73c3989eb221c57de15b39eff06dfbd6f4639e9bc8524afc140ebba24aa1e865c128452c1a505ca551fc503846f6ac1fa2f4a2e5b06e2a97bf568e6359f61f4284ccbce338e2fc5acf5614a462e7a4a2bf082d8855bf2dfd16f022ed1653f29203d8730f174cedfd89a10a6051c6d530afeaee56cba7685a956ce78d9c831058d1a3f7b98a810a32fba2951dd582021394f59c6c22218f32a639bcd6a11af4ac0b4c3a370b508edcedaa99ea03e1863d1558109e4ff843be513cb5455ce416a1005c9e93991862a0048559b62f82e95f9441e77c40025a1548f6bc48004db7158bd21a5473a65e87c346533168a520c67a7d31a6cef9774dd5c270937d89e5541ab795421f7375a1a555959c6e7bc9da778f831a26469d3f2304246ed0ca995a59bcc6a887910090503bdf940152a0c05f303c3080d21f9bcb2b758393329e4d3ca884d259d423c08371da36deb17bbe5a1a4a96d7bae0a92ac416dc5df8e1771e80c25e45c5d3bfdc91fb67ded1be92a0b88edd5ce3d5c7ce429289b9b0c8f888c64817a4348bef2a1a5d7c6f0a49e72bc99ae52e7073c561067cac966430a4e5085fdba12de78f3d695628b3279c2e97485d1e874f9c3cc91c1419242301583e2800a0d7557e83c757512a51feca4cfc32f45e4b885b0137c12be14f16027c83f7fde66b9e0e136706d52e040f35e54b8b4b44cf15b5c164e38b1ad04595793fe75fb582d9c6a0d2baeaf994ac728853694fe50bf488482f4a76a2920ce3f3ad5c3163a5db0325ae378a3b6ee23f04ac171f6a663b1bbbedff1cb36e403ccb13a0af7462f0f933cb8cd0a1778a3461674175ca8c8be7b4f4febea6eee5a0a12c75d03906e7484827afa694629b713180346c1c93e3fe1a2ad5edc6ab8a6e118fa8b0011dedb9ad3abbfa1b1e6880d22908ebbb2c53b5c87ceff3e818c49faab229ce4877f20151a52dc9f741141410f1184922459a7f61769baf13b463cacbe32e001103fe56e65fd66c78f3696e0065eda99cdb5285bcc8d8b8418462c10228d29664f427008e9440439f5041d37e292039299f6a8daa0ba4e4bc016fe89042557d5ed1f708963c1412b378707a5f379bc9718a217b2383e38315f95f74543c50558e6508a1ccbbfee7b09050ab08b1d0f27baaf38650195f1e9faf3a393702e079d850014e3197476c58798631b5285f2c2d013fc967051e6220b6916339af3813eabf57cb2d6bc54b5caa0cb432f6157e80a77d1caa41abce762c2185dc78b22ba06ed5167b91d459b77c73020ae42db380634a6e47a74ae14da40a811b3475d670842cb34440b4a06a7c8365a3f9444d1c4289d402d9fa380d29b667f7665fc851aac9154425442ba7eac4e2a4e08f1cf8a465dd3a1184daa47f6a651dc0b0793420587323cb3e9f25060c3eae70d3512558163feecd1c11ed16edb0b2823971cc6ea28a457376eccc46e3ad6f916d46bb1720194271291cb30f8e37b2c8b3e01dbb51bc619d6a11fd1318a6781552fcf645b8502b4cf951f606870472b8e5d284eeda971fd297e0869fe02cd6206cde512929d05a9f4220d9369933c9e9856a7025f97474e4fccf43dc328d2038933caf210057aa7b37e6698ef8587d811a12c72b8a299a73376986ebd509e0ec0d42434ff0d9844a9cf737ea499997c8e9d1c60b5365a3b15f43d2fd2f7a7fa2c5bc89082e2ce30b5e2e0c5cf8c7d59d16083a20ec026413db82c0b94c5a547db0663d1d9c937143a6c4f8543bdb8c835e890122b8ab9d194968b8f61d22c0cec6664157dadc9452acd0fcb486ae6299daa3096087d4bca22816cce4c8f20ab1246c605730df81ce073fbe65e3f5b6315508deea199685134953fa3b6c2a47091e63a5d2cdd09e5b288f37fad737698c1396b42117c155003dd0ffd8f9c3f297574f48841f3e7da635f1d92b42051771012353ac867ced851a0fb8f341d22c03a42b8a77a6d388d67b3ab85c2031dec5d2bb6f531a80dbed4d7e80605158002b4da802de5fa20d5ee24936c451fd5c8e479cc240ea37fea259ec655774e3f6131185b9a92b816c251f259ef46f615e06295ca2b5186d6b20ed813d8f90f5f877d8f550ee067a7c89c00769b0cb6d533f707fda7e1c2c2cc6a6fcee4e248414ec3b75d1587c5b835a69176e4d32e27957648e4624f18b49234a03364978fe607a083cdddad06499444eb252426d4da7f271f6d5c10e0575e1e9bf9840828409ecf2d03482b578997af1b46430365f9372ce76eae5a2840f6e17111aec98a45355366989dfd12d9c096252d0d23bad82ed4e63ffe27b1c65dfe2c5b1e1b31381054a6a8e6afb182c406078434b530fba6d487a1f3172af91f482112ca0ea0ab4704a2e503df8f7e97fd131528dd80618ed0ba9b89a2efa8b8d68809462e39eaed327909ee2e92105c095a211d14afceea340c455511fb24811101307734e93124fea012eaa968dbb22aac9a049f158e141b55eea6c48b7100feb1b8002aed693987aa95563fcabe8a2b011d6cdd3f3bd3bcf37f0042b67ae11fb347567e7b290ef3375887830686144113f8d308215140b977466f67a10cd142505cca490a05d8f8e20e7f68c54e3121cf1df7e4df6b3027e3e0c715842ee1b9e05cfe60819b4e6bfa7b921b7068b7496d26f4b4f4c036267db08b358441e4a28a9b985ab0b9467b82c99ff08570205f7e1147baa278a0c7b677fba0abd9410d58f630e5c7c255d890be081086b22eb8f28944d16a0c0260bc81a0db87691880515be9ab6bf44d37a276619bc5fdd48e7dd757f673a5cf90cf4e9907af1b17c0ce5723b568030776dc41671dd778f46cbb2f9524adfec0c02d951bf0373a9adea73f766d8dd4c57cbad804af4299c80acb2aef225b1aa75f84f9461c0b31b5221e7e0bccb06734106c176c0ad97970ed93920aa57ef4518e5d95c9d9ae192487b21e1e090562e47e1a1b5f80b67dd15e448547159229787468e783324fe010ea84f714044d86027a042a65df841c229365af231d46d21b14f2443e80205914f2e12029aca9b16112b5d078fe3bbaa75a453161c2e1230b7f9b20e7b2103df04abd3b558d1f00032f125d84bc525f31c2ab18ed03e699c204716820c04c1bc43e03327c5ce72beb4cf3df2bdb72b509dc771231a3b478891d0cc0222dc40c190f12b3a0cfcec8a59910861c3f946b3c1f9df74e2743bf35e64de82f430f48c97b7bdf9928c20f07e9853be5ae634b36a96d14675679748b07792fef742fc161f709abdc42c9cae71339186c9ff815fa59b97793b64d4fb27a0a745f7f2d399a4c2d0661c39a5ad7de4336e77ff28e700cb310bf8d05c41d80eead6afc4e5de501f99408ed1cba251fba45538975919b198075652f225ad7cfb64926229c53251988d30453f0635052b4c26d93b2c6d9c78cc1c81cc450870de73b4cb3805d0ca459dc8c8c4dbacc1eb0808460cfaf17d138f84c55a6620793fff76196ac8cd676e52b797fafd19fd102e95ca1006468ef7b346232dc14f14526f2d3f404dd209bee35c180a6115879de91d54618f223a793d720dd920b06df1f408acbf2d5cf1ebea080da71701ae4a718eb57bc943739576e2a5218e7a9235defc9e4225173795382596fe08f7fc8278cab647ae35822bef35bc5457915de441c48dba1ad9a3bca46c44fb8141e7ace65730f59ed4ff443644e00a273f6da8d08047ea90f65f61ac3d38498eee39087f55b9946288a6cfa2375fbc0bef0bf8cf05722285fabb40b9bc0a77da318a55d278002d1b880ffb4dce55397d7ad9bcc34098a26d941eba1a11053cc6770dfd2791211ea7598f76cdd81e5daedff56d85d47391373228c29651bcc94c47ea725c737546d9419115b11148bd8e786261be0bacb8ab80abfa99dfbb67d224af03d15987ba7664ecda4aa6a9861c9d5901d71faff704ffacc5ee41ea935d88d1b5cf0905eb75196948cfa891bce36e194eb427d7f842caa37f1c3f7566f831e2f42de987c5cd058d00fe5e3a85c2bac2f356958bbd27ff8d8e062a84dabfb0b2333aa7cc07d10a9d558e60686ad2f860dbb713269eae705581b617d2869fcfb34c7ef6de1003764febb7196abdf930980919c262b18f0c343219e2c12e2fbfce144ae31919a55e80ba5af9036198687d3279a796ddd8552d5559d83087424fa27ac0f0c369fbbb6089840deff620563b4c82ba42356820b94c2bc3b555e1636f959ae0f81032306999657fdbcafa9c87472a5daf4e9a959b4408e21b7791043517cbdc7881bbed31a2004411c27579caea7f4a6fed906ae543bfcb4ad3366ab6c85f12748ed4b2ab99885073e839e491e3543830fbdc4c282cc2db54b86b28e30e124c3a280fa5e45d6d1a151948fa35ae7857af6a8d6dd2e50ae6131414724281d1ad72c6fc63d09e09c17d41f721164b1e8e0dbf4a821c9d412800406b717deddf7540641963dcd3e06ee1d1617b630d103a7edf3ba33ec19376e213e708e5cb7e38ae0cc3a71290bb4b592528c3321c9b7b7a5590817e620dea95b06b309fd31ebd3642bc5e88448e549cff02195f414b029aa755a75872cfea0c51907ec18082105ba47c8a7619e099491156e428c3bdb689ad20786404c8a11483c3acb662b75451adebe1ecb42e8d22b542cf3ff178985db0bd1340946f421eaf19953ae8ca42d79c0be7028f629e6673d453c01446712ddb0ceb959b641e36cb3ac4a02206387b454dbd7e4f9e040f5376ccef7df186078a00944915610e73523abcce1ba50e7e478b3832c96461031792a0aff91462272c680787cc32e533ae073341f25afcd090751996e8269ca53c84dc851d59101cc56903b20e3f4b6e2c0d374cd84f68260fac567501c48a305706714abb394b7cbc59dd80947b0646648d172cd9ea510b1889a53bd45c4baf24c9859372c6d22d6404bb10f9abc778b8432a7fa19bcde5b845b68c0d7f339388e42fbd8d2cd33b0cb4299d21267eadfbb2b0e1843ed7ff2ffed75c98f1824ad50a5c18f547f4ea554c32f7512557757a13202beb71fcefea2f48ab80a572627e4882cf043f1f600817676c10697d55cea35150cd888a56bd26f23722d00be303144dbdcf8e3a56eef0ff959d398474101af2615eb4a9a0db9d96261cb1c2831f4def782c6dcaf29c51b6b6204cb283dc38883df52ba92bb7f1119ce4513e7355a3e8ae48290f4c114934ab2e4cb548f5d8875c4cce848f0df870e4894c2f6b62be3f408226c49b8422bdc688dc11a76d19e38ca3d9e2f3cc77153c0394617270be46a1aa634b31d9fd1d0876699c823cbf06f8aad2c18986eb1b8f1b914a42e36bce06b0f5a108a9d10af5c52135d70d417125b8374649e46bfb6c85cc34e93beb88117c1653a0f92d3f17cfece3765091f749a92569a9a06199bc2d5e4431c5073edc4e068bfa16c1424a0908265e9bef893eba42d1c711c771b8f71cd2b16f41636f7f293cc377d2112e5d298eec775f4dc4693c584598883ec51285145f62626e99b510b1070c56932338817cc6177cad6c445fd9e7220dbc12f9741cd11f5bbe9d1fd3cbf88c87f1c75db842524b57feeb6bf393f2ec0c18a3ec5b48a21a0f16e68debcc1f0e3352c0992c3821593b82fba8cf64e426ada7b52be782545f00b6bfd98811df975ad2312a4cfd51d43dd9bbd6dc247fcadb79d49f625be6544fcf8c9cd066ef3efe50bfb50ba33c1992ea7a405bc27c33fb8f9437b43d51d8d868f1c6ebf1ecdc5f90c26e571e592a8b30aa5945d503fc24dc0d0c910c54e6184fd6868eb75a90240c2e8aa941b99ef8bfab7926db10c2e0100204629b396d6531142bca13243268f3528244247ae09506fcc88cb9ce40e077712f46649b217bdc99cbf61cf208d0af18c9d556f4c47315fa5be92424f3c07e4c105be69b4c5558e11ed7d4a5a4d81ea86535975e289171aa895d396b3c5e22dc580b7ce43be1ca8f884a8be7a5bf57a4da1ac9567f7443de9113b5ff18f8cf47838f0ced600a4752651dcdc523f8a05c25573bae0817c33e2218b363ee70e18f39d2c44291dd62e3ee7905102678e210b196619923d4725760e39caabf00623d41595009008914cf41041052ec3b2ee23fb8680601a9c8a1440ac4156b242a7f6d0ea0bf63a23f6c72808ed5512b4ebb17976ae064157d336bb4a4ac09a742d9347a05e4efb09ac042a56ded82a236dcce3d51d79735a8031d6b6922578fb413fb2413135ed1bd42938331b4a4d633edc57238e367d19f2e8984f8661e471fa4747c458792aae47569cf6a862db09010599f27067aa1d61c6184343a9ed608ed856299dd5be349f5d969854dd35a25f83f2a2017ce832c7f4498f00c10a08700057e8adaee2eec99553edc8ee894e4fd1fcc07dee3376fbea537b372e96525dc71e8610c098d5dddc5d2ff0b93e12b8c4cb66ecf70e73079aa1c2d197c87f6c6f4939ba68337593c17a03ba11d3bff42654e78158dd04679f8f7f440bd621745c90dd19c629a788190c77fb2ae893075ca5f3585adbf0d2c0e0d15b99654a8b085cc0f9911be21800a6a329abc32da14b3dbcb97b9d96bd4f8b282a9dff613c22f4245bfab5c95cc74de6a93477f79b7e0ee2bdc4a2b52489b44ea5a23fc8ee82241c41798e2682e049f11426a5ed2f6c1d98bcfaa6870d0819a123f0b6570936571c9a276da1d0f69f065052160306adfd02e6bcc294c4a1c26441d6bd89f56d4532ad764a8fafc2caf33a52a07c8bac5385f063f460044f1fcc333fa4d07637b567e46c9c097050e61fe74038a5fda20c67359b5164a76e26b1dd6362ac556a23d7bb428e3dd75cc641bf53c9eb3979a168b6cc67162ea1b160634cb4dc499390ab176b896053dca299df33ac815ee43c1492eacc54d687de98d0a34d6960db0c9a1c480e29c4158acb606a7d1753d25c9ffeca7b953a7182637462e1a1a0630c1807b37785cb138d91186ebb94d8b326b1f5a160f59b9ecb65131138f5c83af339e78b9488c2e30a71222e079f83e1fdad87aacbac7b4e25e5bcab54e640cc90c46f3cbc18c4df4b4158f1b54828bc29ca83f0a3ddc61f47b4d7eb7bffddf7f64105192bbe4ae37407cc195006ae2d499e8d136bae7b52b51fa8aae187431c5c36c4c16a26622e5bb30fa38aea33c4a9de27ed0498fcb3b208bd0284fe1e6a486330ebc018c2daab25a7713f94f855ebacdc8f68af76f3b1b36b3124f8742c53046c0bc8169a0eeda00b0a2936ba8791c0e6cea39b5c1146ac6df618788eb0d1e575fc6e833c29d74f3b92ec1ece50514f1914e3e910e7efd8a56f965aea70ae8046a568c36e17ad3716a319c414d58949df8b1ae784a5e4852ecea072acbd13cc30766a019712fb4a0d693039c8671eb5e71cb1f2ca3dd4d0b8c71c5b121c62f10b34d1ecf668d8b4ca2ea809969e4d9f34caff8c425859ad9ebd1ec07a0f4e8bdd496bca60a07b1d3e2faa3727981a4a20f6c85a49ed63a06124f9aedbefbaf4ac9995d10288f0a276d3202cf287708a90712b3979128ebb5b1d23e52b6201be1ef737012d34020290907ada0017d1482e2fb9d0275580c065335f998f9f454695e484aaec065d3f9ac866d98fa609548cb65662001d1dd52fb46f6603579e98651dae9b48d74f6e1d482952954a35a53ea5d95926cf64391e21ad440058a5851f6689e09ad821db4d8c3b70f4201d477f3fea9bfc1eba52c8a53e31f8cb9c73eaef701295d6d36a70d0e8773fbcc5ee05d0f297fa9f770206e5412de5d96be7cc4f941dd7d3ba376ce114b68e2c348538d8640bbfac65a4253ff873f3d81aa7223c653cb777deca91e856fc2a7b1110704ef6b8e63c3f387098481ce006a144d0af5dd68dbe1d148eaae590250514279c8f00d0a0b6675a0df4a8e89438631ca5f69272ef13650bc4f889f0e8ed2767fad48aadaa5b9c9faa1c293e1805e618022ac2e5d14d34b86c9b49999960cd116a04da79c220dfa24cff2ee69996176ee6bbd2354234445967a24ab81cd31376f14b1d7c120a3ce9a1e83e9b1b78e54361af361548caa17cfdd9bcc0881105edcf2681222d946c8fcd0c84f2a1b07e6d2a509441c9fab25981102f0adb9f4d0295a6a516f0d1004aba0d099895f62bf74152f40ed9099f83ec6eba00c84537ec22fc47c90df608ff29b95d2d00123137d8c02c51e63431860d705ba7247d151cae6b224c4b6eb22f1b9125954c24ffee33552d825996c645df7ba01112e1cc4b7e21773da09ac92ee51998abff23df9e72135232282794901171d7eb05f582c97e15ee512f0edacc4a31108b32b62600a43f090442b49254532e9c3674175f8335b3d0a4b6e4021d0633141daee2efabb136f0c4d6d5cb21793623d88f6c03c4bf1eb9f9db7bce84baa4979d9cda2725665267dc422cc2b27d2f339f3e8c9e6fc1fe7a68726a949d027dfda1fa1fc5358b3c841e6e791b50cb90d0a633624f1a88829bed5253983b57dade49a1e15f44df587ae10cafdd10b6d1b9ed0321e06eef7e53357a7ec3baf5fd099af7a346b1d79c28b0f0cbfd3bc3b85564918c1eccc669dd1e411404aad31464ee364b9440f2d59b41904845857e198bff39112e242a73caac55bf04495d0b4ac115a1ffe086243291159cc86c82481f3d0e3e482b3d2c19abeedd62dc31e9b962311f3eda936e708b5b952421749ac789a3a49591ea73a125cbbcdbd24d5f84b0348edde1c16ecd5815e71bbb6379ab7bac19750f428ab439a23442a8f508bd4270c63c5705318324adbbbcb602be264b367237cd47d3b4e0793ad0d1f21f331d8334f3fb92d602b4e65bd3e06d6e64fe002139d906c9f1d95f3ffe25329bb624a3cb9d1576f5452120f76857817f4e9544beb5d19ab28a7bb1fbce5adbf605c3354e8f57fbcf007559bb570421472734552b3d4f30efd64aa1664d482cd6aab8a353c1a91217648025030fd09dc0b20102ea8f9c016ef1fa58f064cc1d7e04a05594019e6d97cb0c44f2ba43e50aa7bae2fcc41505b8038b448fde57105faad3afaa5f07b098c6640db7d5d78f4ed58f6cffa3468e6c6d7ec1a6a34d295b51f4a9d594bb38a995e84cacb7adfd9b79d32cb0e2d33dc4080cb53b6c3d432647aac7e68c43f7b1620178759c6f8c03479723a1bc11a75b3d381730553ffcb5949d57dab8cd89f22e68e84f967515fd5063375caa35281eb30e6e2be1672a7aede954bfa3294dc0b67d85e2b5c0ce03e85bb16bdc0f62ba1ee336eb8e55c0ed4180f61b1c0ebf26ad366bf9d28854496806f6d648f27d32c3e71a7b24605d42020996227c7c0e1133aeeb7dc5890a3a541723e2333587747a837d6f151009a32602df018d848fc56067b80d12cb68a4e178d4c5c0e1437908b24a6893da05d06bcd3d858f29a0db83cb7c4841e5e4fd74e54f804252226f9041e6377b2d283f06d203190c5a018f78b4bf2854bc800df5785785fe000a1b089ab6a00e58ff2967f13bf0a220ea58b6a8f0cf70a8f3404a6aa0f1ff7ff9a4524eb96841504727e0811010d14f0d06f4672807cb489d72ddbdc923b4bd5f20dd49f88df218b29e898671257e2053585810480063210d314cdfaed7f802462e1f8a9e421041fce69274ec07181f3bb33915187967840fdffa3473507d5cd62964915123a16dbf14bf558e130dc5c1ea6405ef7a495771ed385165295cad6c7d9111270ddc979f9dd9dc0a556ebc0632e806d633b79ecee03d1813ac9f2e14116bf501e83e4cda7aeb58f3da1e3b4af59cc7f2a2bc2e742225c944f3d43b8b6b73e805cd32cf8d532a4f80c2651c224cc0a2982388dbbf9e62f664891597d204b24f47ba444bb0417956af01c0339ddc64b18a9656ec22a6a329790959c10a2785ed259510f33c6f843a4021faf99d7b9b9dd96775eb2cd080e3373a9085779459260d42461bd0eb988d29ba15b5790abe4aff0abeaf5f94110b63db0b8a094639659a90cc39cac51bd6a3fe7bb0b9e7148b77a112293b81ce11c4f33c04de08dfeeeea711dd55b82e5ecc4d544370568c4449ddb9a05d27ccbf7463b9119e8ad9119c807cbd0cc8cef60ffa5cd98ece2eb1083addc56c63b4bfd856b9d8048385d1c3085fb0679da2fb0824e1daea397544aae67c59ef6af34910264361925d24e6f55c2b587cb915c9fb509832ef48639d1a524f53da3644dbf32173c1f70b018f57de551219bb83f652c2d88b8ac2e26e6feaf798230fc3be6f082da6436db1f2bf87022d8735335cb7187a2d37b70450a004b4a12bdaa8eaf6fba7c8384403c7bac80a23da90e7462aa50c0c2cd384c30aec48cdfe35a865f6e87996af43ca67fe77e7723132f3ec40449d80f87a0fa21504dd841407c4e0dc490190eed617050e5f79a6893c202650733d5c39690b6a2923cfdca9e8f694c96bfa1d70154a9fa5f921c608b0676a7e44af58dd06c6251bb73da42d830c5ec330abf281acfa7c7fc95c36a964277aa62b6c4b60cea9de9a1486ebf8f75537748319f1172ec19c8c0140980ac2856b1ee3274989bb947f80f3d5b265ba45e68a9a32aeaad5e7d681fefac047d75517864a29ed723335205de72a2037e8b3d6c5d5691e2f2d09a70b20a9479f6f673033be41a6b3840870f98f1995d4f40849ced46268feac59c926be0cca67fe2531e494de2b02609de86205d8097f05152bd1f01fb6ea367f2a267e190e29a2a8ab89d0e9e4c469f8fa17bbea5c4b92f68be7dc703092c8035d30cae60bdfa351da269eb6ac651ac5037a9a0ae7907c22d64f72e2ab6b5b8173153f97ef29b22316b4277e2d2043971faa2e2602381d7967123668b6e27ab9ecf50361a22384dc6405fc64afdfe1b0644fc58407c10b0a51dee1d0d7a65dd43dd9543b33ba18011477e5839ac5ecd4a73a86b5dbf887282060ed64af238e2599250ab993c694ef3d47e0fb93f79561251a4611c5eb89ab68d16d5083660e7a7ca6d2146549c09c0bd6bf13bf66102ccc2b96951c770d7f73d727e44972786a853ab5d0e97a38eaac548b60fd9deb1a9538320f03981109819942530d2ae6740b3149f21416f2a4a796a6e417ae57b901662f12ba9fbe11563816c2fa97f83359d4332bcb8c5a17b3e358dfe12ba1c02e94ff13b5a5ad35a0417f215482f5de2d21522ae548dd785f94b075abfef2deb3e0eddef64b7553e3ca0a0df05edd4ede25a1b65d0bbf8a4c6ba9234917e545ef14cd225aa3d5e8c88133438eab68f0aa4f046ba1b028ccf3c42a6907009f06df32ebade9ad6d53d0b7b8a5fc85d906d9583e41cec26ac310b06d830bb64fb14fa6d4eb5e5bc7aaf6859fce0b279d82539ac88cead959541dac7b967615ae587d92a738b846e3e599b0f77f8a7cd03585d468e6804fd144eeee8f2d55267debb6ab492acafe3694a7b2eca307553d8ee46c9063c7b0ea9fa0c11c484fc6bc99f3ac3b89515c8b4ad19eae175cdcc4d22b57ff779c7e85d5eb5f3b1b0de0e27ab3107aca0475da3cd8a4272bac8c2f673deaff85069cfe1c7b93315731eb0494545263fddbc6750b99e6d8b674026187f5fc073bc69ccf7ab41e9ea7096f8327cb194c2caf5c00931f1a2d41c6458321da33487138bb7a56f1797f7ac1293d8b705d209cc8f5a5f6b47a91ceb58983741f7379ba9df9c1e6f3437c848cd3065e0e81e023406c59cc612777eb5ffe1cfaccd987aa7f7ac8609ac92afff6fa740709ea4992fcf8f2929c03b35ad4ae3ffe91944f8f6f89ba183ab9492ed1d408ee199e16537c005899ee45a152e9661a1dfe11daa040ea97effcb399b2293c32f11d8adc5870fe26262ea8f9863a67317717e78180abfd682c5d3117df2e17eaa5593f218d188b3fc0b2c5114fa2cfb0721e77f6ed74b4a5e832289c03554a86a6e559cd93927b6359575a6f38927c118335da2cb45800cbe41301ccef8ca47d270ab952b53cb3af6676308687cbcbfa082468795e6290e5d1c85b5118a54c59b1dcaa6763779727e6bcb59ea564f7898549d9dd8690eb253ae8a5ae7497180a39e0fe7af09e470f5c515552b5eb3d5e492d2d528b7c0af973edf1d9b02e326deefe12050ced45c967c0c6c4e981fcd24df86c84c50148947b809141f7b57ecc8bb1fbff29d2c063c0ecc9dab6cdb0a3bcc91bbb68f27ee2214011973bc9e8673a396f001e690c8636ec92797c10e661b35a72f2db50f6b4fbcd940e8907d5f87c37f9a9ce2f9d5e2425c25c4a2b8b8f163ab848b98c3d6cc7fdf2056789001f25b5805e55a13cf912e234b51b5b39bd9a8dae66a322328330453753213043ffdb8d08224e883b243ab8f54cb06e9d9759d1e01a41b88014149165ca4d5e7f8f6d7ea50775ce73f03466e5d5468132be8d7a5566111df2308b7831bac2da30be93172bdc0fc53f0bdf1e3f6f4b1a61d3a842bd5a2ff6f985e953126a04696e0771fcf67849634e3b3d104fc287148ceb6e4aeea78aef8349cee864725548878ef0bff90821f7513ade168f02365182b77e9de2ccc4ef73fd5d5ba3519c1a62f5958c8e962ad9452725e11d4b6549b070c4e4d98061d90d789392b2ad8b773cb8dac21b37da4a39bb053f00058e425c2c39c729d6cbcca49a699524cef4caf6b8a445254835a3b9c088e68a084cdb8a3f491f441594a700adaed0477fdf279e564d539dc7a6ccc8e08d18773a12400a2d54a06b9841d205840adc27c2132a5fa16b607dc2ab15b73f8b3b505bc3101f181ccbfb51f1ab9c293b643515f6a4b42017adbb67dc1c88131272e82a48310b06632cc90dec845142dbaa446d00f445c3647a2247b9e524c0097e734c75bd5bad1424a5a0b4640449615c009750e2d0beb964457c3d8e6270d2da2e3e604057319847214c637dc0b6ca75dd8fd4fb1fe1baa7e5b40a4f192f785f1de03e2b49510fac442d710fce59c884a63afbe25a2b83d76be368b1d95622d4b6a93f5026744d72ae8a8a0a816f59417674f579dd9421a432a8535c1c66f0054eca219d36ad26a9430d16e468260dd84abc85c32a3d63b9c1d0bec08629d385f70aeed2981676d459ab9614c4662d04ba1a15ac0a0537162372729b9bbfbd618d193db75b9ac6a24b3730251d0874ff534631f901a1d6e41f62f8dc82681200548309927814c52e1a7db3e1957b51976a742a97f99f7daef6a0bcb137d385a1ff453b43d5c1c090860f63340b75a3ef79d115a35b6218d6035b98ae1c43634f40b02b64c82abdf7018f387b80c586d5286f3b2b3941aab49b3be25c14a0030be34abfcb3f672c05eafcc91fddb4c4856a693c319dff8ce271458b66f1721b966366bdb71395d19bb45beb94c24d6ca98e42a000d8055222d67e1f16e3edd03908c23c3464598db36f9777762e2e6011ee300627019b55881139147778e56bb1dcb0ae55108bfe3067d3180d1028dbc3e1502aabe17b9cc353a331f374973205a5dbdddaf24d3dfab4ee34bd6ffa0fd7c1dddf68c2bd4ba0c33f87590a61f3d2d27a352f522ac272c683bdc8ad40717eb85b1323e4175b922d63c87ad14474fc76ae93a105434af3b87c934ef3aa31e043daa55fd017f078834c18336d85e8953fbcf06f4280d198466750ff42176a7a55c02c06cb75c78efbc63830af48d9567526262fb46ca3e945b3807203d9030c2bbcc799ba5901312c86e1cce0303232311f0b3d4422b5577f231de85982c55fb72db2188226c19b8014d1989d103c266fa6663b163f1a45f7847838698fbbcb9286a349a8f5cccf0464ff4724b9f18b9cc1fa487066527ea87d93c4827cf0c2be509d460dc212f224da2026f06e65e5a5ffaf5a334428dcd1db44d805bec5f1e88270028eb20f5e08a129fcaf9ee08302372b69fae3e8c6cbb89599f114857d995b96282321da8810477e73d3de6e9dd5a6009f1cff9769e31a3ddeedd191f9bb9f35590e3eb8ed7a65da4bc3ab0f542c604883e89eba37f786bd1b5fd9016792e7bfa1ccca4973f3cad23b9e8f112d71083119cb26553f7de9dfc3dc2fe0301246ba567c74fcadc284e86f01ed5100e01152f6ab7612875474a0accc0ceca5c5607e1a196d321de78d3d19bc23ae03ef336f3a8eb8cb848062d5b6519f4aad507d2093a52703097fbb1c9275c23e608e94968a114d1ff888969a3e9447ee348c955208e894a2d2a8df87dc57b28534816f0a78259229ad2c01bd7b07618d232bcd77583a972501ee5dae4e195915f1f27b9cc642db64dbf76fe784269e32b43ae0f44535af80760ae9cb37ab8ec12a82db2afb29cd8b8893adef5b3277278926836d6746126322026c411c4c845a2a6dd588c09584d8885074e387c7dfb3251e7afbd170530f939b5e463332ab1876ec7a285a04801d5a3772a8c5c2b8e2acd78a3165ab724f0491285e08dd4ad16e618a8061bda2cf28e08e7d596523de51515d596048112030c6483d3fbe51f7113c7da2a00848c6759a3299ac70cb3d9f7eed158193b16359a35f7fda5cb96332b5dfd9fb3575ed88503179c02753bb83caaa55dd442e3bdc24ba78d300a8a4638914b829c2613a061ebaa1144d9da4778fa371baa4067ad75c0e03551d392739e354f5b9172ee105d491f052019a25c8dd642af9fec26b1c326e621ce1393bacd6368e27e4aacb7673d828dc07d9e90a0941c2479f48c345046902766e0477dae13116b5d732477682536001d625c187ecea9be6d4a0af83700bf6411853779678047123ecbf0549b877ed50eae3c796df2b190b6d56032224dbadf3575ef5595abffeb80e3397798ef13710a2fc221012cf888019a183a4e5203ce4dca00bf218ac7498a47edb1b1f1a0b3a29f374e6994278d1c7d9259c926891ed6a8e610357316c73e169b98230dbd91167c7fe03d1a1bfeebf79673277a8f9c1ec73761f32c50967f0f873a02f0535c18f3ef0b616ed1bae5a53fba536dab682c64f984d59f03926540ce2949dcb54fd5da8f0eaf1ad4e16c918a75f54169c12a5c3e5160f07b2907c2b6796a3f427c4d67cd94e94f05f34793b9c32dc5a694efe359c0136360a9a332e5eb290ba3d995068ccc2d62407fe1651890b505c5573decd5ce0c846c6db78ea660edc7d734ec48673c66e743847b1f9af60aefe18ceda847beb303d66f71a4d7d661e60110fc61fe335f265ccbb865ae2ad4058220481091f70d500af257f0d6c6924d294926f660b49517093d028a5e45339165ecf56a9f1c9f4fc967211b0bfc8d87591409e5274537f31e0fc6e06303933441011938cda8fbbd5bb4816eea0412e948512c6436892705502b2c01d73b9e3419fd8cf4f71c312b8b4d38cdee15e950c74aefd06519bd5169cb3edd88b81a5e8892ba978e1efac28018c7c20496ad6b807ef760cc026ae1a96434ebb634ea3b221009ac16e43434ffabee711aec80c06124eb7628eaf997d189e7abfbe683a60b63b458a7647c300fbbdfffa49021d9c480b7b80f2ef4f06d167891191ae5b8272ce0a5b0c741a2d402a2d3a723a619d7ec3c6d8c53321ff0db9b65efe55bc0a8f68bf75c4a1296f1d524474db97f08b2b4b7587111f16aacbe484d9788aa7a08dafe9fb2b49386a708c5bffb247cc070050391825f199b14b9fc535f23c30e37d2ea78ba816cc66230495ab57bb6c423d30be1a6645fa9efd5adc03e21d062d793469d82a9ef3167a09c9047ba8b2c04d957f08657e12378fba487f65fbd82df5787998d3243979f86fd1b75f27f2e044218a6a51a8f2af576cfc6766d3d3b41a384771b98736d691c94710cd66ca8c231f4c8ef139d5525d4fe757543682c8b4b0b501387d1227dc5ef736d8c2a64b0ed5512dd759ccb40615c62f85ae35a08567ec5a0b9a018b48304fe1ff88ad59b5bad600c6c8709a8f80935e9a238040ffd6ade414c719ef1c236db50284ef198497f1fcb6a6ae746b33685215d32233da666af1467e721609704a9be00880f08e66bde3085cdaac1262044f2b4edde21623c0752bfafc32496777da4e7086ac7238973876cad51401b918159ee8e44c874cbec2ab52153b7d22c01ff9cf662fb51ff8e11c8a79b79b03c1847e91de32770f48b608041d2e28964630b7fc19665d0e4f1dbfab8abc3a0504e227d01b5800ecb40ed8b9a4027100878e3a616298420c30b464cd9cc34630e9e09fb0dd123fab2b0e40868d195cca3ab7b7ca1c08a8d528154e54052eab52b1693dba1cebdf1d91fd63349c953b3c9f3af6beaccb809be2fea9fa4fc168d49aa134d855b86b5f0573f3ebe60b071201217a55e5cb9746accbc825df62d9c357fb54c704574b8e6f7d5078024cd574757cf6e591a8d6ac2afd08904791b9ffb83b28a326866650100f4de6c903faf901d2c00f44bf45571016f2d4ef1d6bf32776517423f53ef5d38d0ce126c4dae7a2482855db5ab5fcdf2a4ef947acedeba1898e4d59d5a346ee3078a2e63c655c3966255406060f4e0d9adab6347da5b66f3bb0bb8823c9b9e75ecc89dc69bc1755d1ce111932c1fa0ae2d6207f2a3aee4ba42d541af1544af3690ddc05d526df2a5611f3e752ec2d46c769fe43d960efb01a494006006df5af45d4bc0edaddc5ab65dadc21e1c68edbef2e3e6535284a89394862863486e1194cc618ccb6e0c5404ebefc02ba67b6fcbb1f4cd4dadc6b197418aff0daedb5fdefc3452a0255403163c123d58073449a9f39b5e81498eabe6939d7c58da7cb7179587fc22e503c3eb8598c9d6c1ebedbdee78d7c623b9401b190bbab8b23621bdba34f611757ecb57812fe56e47a63e7f805b2487323ec4c544df37963d384e6a61646bd91f771d7766d6d2159552b804e76e6d6ed5ff4273212bcb1c2044336229c16e99a7212bd3cffe0ad8e1e3b47c2d3cd55e8bc74c9c78df84a990c37699ac245d4f77f93734b9b4b17e183669c6c751ac48d67ecaadc0415944012bee20e4458f03f3fd151abcb09e2be021b341c9e1faf67d5fad7cd787d6e463f85b4141b3a3581fbfb2a56a31b0b392c9fc3d71e125aa8dad8eed0f0a51757bce272a514accfd0c80f6c004e691de05c1ad29fab598273f6cc41e41eb58608945346c88bd900412594ef3b402a79e11d47e8645368353d58ecb6b06d0d78fb9d5d7fae9248df9ed55702aa325b153a58c8347bbe9e1bf3fda6921f199ea4eec4dff01097b0d1fb8da2d95099e15b22bd1a0c29a041f02de1221a2524c1d4ccf5f2ee29f04bb8ec95781e4b38f53bbb62a9c5a2198c1b399bbea76035677054409770007d25987fe3660f350fcdb3b2acb4da6b7ecbc909f429aa848bad737575e743e8d59aad845a36e223e5b079f9c63060250a54c5371c2626fc2073da4d09e743e3c236977ca8983e53224b5e1cc2c3a7eac235fc44c0527147c78402ec3ac00c3139ef5b3ea039319f6dc39af37423dc14def9ab78448ac7ed8eb71aa562989024462b221819e7e8229167c8c4882f3b0c8ab5ffaa249ec3080cd84f888c3bcd334e61785349b9cb2592e6d55516ca686575098480984cb4193f4c7707657b91debb04b0e8fd5c083e467eb42489d2c4125572328b34d8dcc0c52c3004d56060194237f082750114f5ed09073056b80e7e4f60ba6f13da7e143ecf07b1a738486592f7b8bd01b60c7b7cfc163bafae1c19dcd009b7e2f91339d03727ff0d301220b5e62e6d5c385bee0f5024a372428e77b83a18071a307d4afbb54ff2c71ba5289565e57b66850751f40638c02689b284b176717a1606d6ddc55786a3e019e2db50fb52a91f7cf8ff72a6637eea7537ef5d063ebd610ec4b7f12c448e4351693f2854d2aee080308c9d3018a3f931a9d89210e89c1d8233dc628f2542b96f25597f5ea8f05cbd907978c21cb17d3135bd5a47eb8c66602ad80d5df20f48a2d308ecacce01635ee5077e0163f160651bb7cf322ea3f699a9c910647305e965082780787a9bce3d0820053f721190bcb436e034169c228cfdf65762bb4403d8ddadc91e65fff61443ebde3113f54bf8f998586d403727c76cc12138bd32a76ddaee4afbceee5cdea89d15659d3413466231f17431f334f5ede59f18a2e9110a51dde29b270075d8d38ed261c177b8032c9a7595e098dd30f84ea8963c2aed9592583b7e7c445b6a539e1a66bdac1d776ef0acd219d0e36e2d21619113df0872b9fcbda8f7fa4c465fc2536b903e9138ae9cd782c668430b48f781168cf5ca97633f30c57b51e6e73e6b2ef33b3b893dcd6ab0ee0e3492896b04fffb6c7ff9b831ff6100289611e5980016ed1d94ac769dfb62099714ab232db001ae6f871f4214cb9d190ae080fc2f8d2261f2cc451027a2808d105189d7d0d4dd0d37dca7f262c1a9c30d37f58bf104cb37c87a900f42842962b8419f1bb001f4a85d2ac06b14cad7f8b3ea2cd2766c5aeec50cfe012ab5c486758139ec733a5d519764ed56dc2d3a4db667042b72ed9e8a252c3749a907843b131e283d490d80823c1ff8e47efc14e804584d2cc107b809d05f15e54865ffb799a9bc43ab676050af0e55dabc7f0e1b9efa1e8cad474f601ccb9ba6e73ee9333258fafb07ecbd98b06d5821f194cdaafc2ac72deefe7f9d3f27eb8e96f4301856c831e37f4b2c24dbe7dbecebaf165fd44d1a91cb585689a2ef9c22dd62196c2d7ccbd1c3dd2b8022aa628862c4269b47c40074f9ffb7064c618beb2c506ad9d61a50bcd9f252b86512b0193559652f02096764fd722903e0550aaf6521f28801096a670e820a6ca1dcdcf7cbd2b551d4e0cee7057081e28fd85413575a8124a1f5b64dcdc590f263aa45d1e0e97bae6ddecd347c1304d7cb019d706866e11667b2aedc4401df239ddbc0fcb0ed444ced2adb96a9f3fcbffcb3e96526a5e46c4a2325c8575a88be84c1a9110eab0af7699d78a0f5a87fb1a6c188c6bd5157803bba2e622f929eb7c004bd4bd4cd7902e6e6488820244f3f9096c4e16f532b7805fac98ce036c12836ab41887a77795afe9ba2366acc117012acb92094c7d11d3f50e91cddc1a088f81caeb3798222831a48ad7501aed11d4f3a419f96440fc399cfc37115903033ec3b8cead43dcd43bd3aae596a2eaebf1a687d7841ffcff64802f780c8cf827f22cd897cf53ad99330b7bdab927bd050fd224783c51f7d9b03c0e9ab0443a522d40352e3f7e7dca443639928c9d4d8606d51a4a303a910cd2b3556acdd0844a3f2abe982e18638c203448a9f555912f0b765570589d666ac5825eb274b9eb60d5ee6029e3331bfa8e952fecaee1fb64bb9c06887a12b9eb04beca9785d28c2c7f5c50f9a6a5cef6aae13e3285d96a46c32fe0014deac1adb53a2b611616cffe3cad07f39cdf0ae47ffb84d8976d8eb9de338712ff70f381b7ba3360559a964ab60b43754b8c4db2033d23183e9fa90344a86d827a019595bc825daba0a46f7b1c1ca46aaf6b08c97a3ab4b245bc36727bfc19fcc603d15818e80522304014c828e298bb0d06f66d691ecfe695de346466d180e82814a7a132481f2ccfdc20888b40661d5a5eb1752b487e3b1dee218ac0f2c0de46bbf07b6548e784065ca0bd61ba823873dd576b8187ddea0e6fdb1b2f9474a1925cf39249048258ad102cd7e6710733327c7b45b5694a0248fc83a2479e49eb65c0c4eb08bdb9f7292f420f543a5c7c13e306059bbe7cb39005198bf3b5cb40a86d6cc18e94682a57c3398671d83681809e5c72b3a24620762a751056b57c68c2a19f3b86ce77bf6aa5e34b5fa1a3a7ed2e7de89aecb661366fd949f804153e90bbdbc42d4fec58010da89300f015e3d40b942a7568a02b2c2f71d1fdbfa5eaca21d394ffb0a6d30c0a3351b22ddc3930e5264b97da2327907f9e3b40173b3f6ff181976c423f51e5093f1d708b0fa38c00c9a7586b8060db19060cb44719d1d04439f3f916b6d989a1640312f04483dd3f0b11a57c63182c3eb19b202a879567736aefa011d6477de3e6d6c26771cfe8639307607a35ac16dc760851b9997063af920d7c8ebd0d6299c3db6393fc0873df62160f7c5a174a0d3e209a2998c33fd212309d5a8f0268d9ec5e39d5d00784a0f3e30e0883bbefcecbf99e7c4c345001ac0e3e5486bba6e1e4a0694507647c69d49f689328e47a52c03922ea7d096b2403e467fe6df269897d97308c1178c5bc447063489656e6f5138e3be8afa6688905200e586d77685b20682d20c9062a2982ed3aee4f12ad8e2174070e04cf8fa9cda67a6ce10783b578ed3b215f92fde8a65272c03e54dd61c1d386828e65faa906a521cd851d08044a65e5a0ac10e39861aa3979204803326f1e7d553c990b49ca5dd2828325c72f56e14ae6af62b25d2c787ce3c8e8736c6ac2eb027c2379dd4054c3cecd8faa75ba5bbdc843d49076483e5d1c5b6c5bcad0ab47c7bc56af2a3ee5733e266ea86ca916621a660b1cac85450b78c9354ac54b4428c4c96b54792934013e870b29c67ee612e5c4c40769dc2ab2122bfc4a9440780644a7109f4a98e1e29212fbdcc078f543236d45ae8e4d6c45d929906b4eb181b27b029e01837c881447ecce5bb65ab9ae8b6e508850fc712e98bdd1f0bd10ccb32e8894bba609eabebe579133686c11326d03cb31ca24e7e2c374fe123607ddfa974483928fb483d28018e03117c8b00111d02196a88fef885a5b6040e37f8765790ce63dcba31f5e73f94f5c4165b0c335480683bc8e32d73300df80d12b21b13aec5712be78c82c431d8810e0c75ed13de953c7478e56f82f4761c9962884d32ae73e48a772571dc3d4adec529f71b31f7c9c0814ca2c7ff06f4475a8eaba24a3a660e1a7c8af694bf03ca3445cad7036e3e57e317929a8b0153073c2129a4912f8a5e0bd9eccccc4521c924f1197b280dd035874850894edc2dc43f94ea764517543a75431a137b97f9b5aeb49f3bd213758ebae6bd81820174cfa2e472e0a1a4a444d4b307fbf3f9795dc0898f6f35241fcfe486bb681a3e895a88e45302822badfe1b337b603968506bd66a5dcaee1e65d368462ec41a39a6941f4516e20c3efa31c6fc5e14102597e6da980f083f7ea6e1da1f781e65f52d64102ed706190006cdff9d23568c88e122821a669af61fc436adf92acf4bcfe25d0f6bfeaf8057c355cd4165ed311588adf3895bca1425d16273e9bc4d1ca8ca8815b2b9fe4de990caea67a07478870fdc4c5712ea4e504a6834afaa1e06287c623db558eaa142c528196f11a2e27f088485fadc5d9fb2796948084865afbab4816814895e16a617e08aec99ff934658fab810b898adf219727911feea9d1c16ccf0c01d662a7ed17bca6139555833f43c892f705137bd8398130ba5856cefca49f953ffd82bce369123d85531a53d2ed7cf68d8e007ae7c6f2bbda105b93043d9c061ffe39c60c6ecd713cd1bea46fe67efa52b45008d23f436272077a425f8bb5f710021d5c04696dcd3b3d298c75b71df98477c47b6c23e9b327d81421037d3d603951e6924ccd5a79d13dc09efb2009c9e0b4ba3258123444de3952ace15beb6ec467fd1ab5cda3f6fdd86e554e7732d8660677511ef8820fd31132189805ac0cae68305dd50939455096690af06d213ae9e1cb7ab5827c04896b42dac2295ae36890de60307c840343de7512c1565fbf9ee438c7864e9c6698cf8a8855f636ae3223f0bf0f4b3c964bae1c861a3417c21aec5a4295340d2f5082da1fd07b6ccb338234b20c5f863f32365d802b9246d4c26924a0b0a71bfb33bd1dc7b9d4c62f99c74082f87af496c59f2c0d0461ce36008ef7e065645c1b256ab9f9def840da435bad03152a16094ac6d51565535a22d2a1e297e27da2d82718e6c94168c134d7cf4c0621fcb2a438bbadf0038eaa21655443e6107fe42c87864498733a7f7022e8e298fe41a3e46d9807566130d25fa7e0050e6cac18f4c6b46e512ddbf2cbc8e744f66243069795ede915021ed33d06b4902265ffc6617f00891bec7b455beb0f27a50ae9f279a6b026939c3a5cab8db15251ebed50cb05235c4e09277e182808f68e59e03cd0262a67b2eaa5e30801e6babd33dab5c3507b9869795f4df4240ceca05fedc5576d133c464535ec461e88762ca95e60b0e4a8b6daaf78cb44db546378bc07212bd27858207822ac7a9ee1f3897a3cc8319d59dc192f9ddd16f6ca79f8872f989588b6dd02159a7b99194f27582fcbc4f4c3a14051d8919e35e2923545a03f2382b3f0324e6dd3a7acb067f4048f1281d080ed755cff33601e6ce5551d22d826791a1ae7fe359a375ddb5f53c1437d1fe3048ec125a4f45d3f1c402b9d9aba4d85dc52a094492a45133799f3653431f047cd82c7c98d0bb17dee14bfe8545f516a5976e0f5a724570c164657b6b1002d519eb8867cbba6d5f0a98605db90537527cfc673d31ab4162c0f01c8f6dc28e1ffe876177954b9d26107bbd2b13b131ae8d3b1a9be02737cc8a647bf384ca6ae8b39014fc7b6fec3dc9055ef6465e180ad7beef0faa580b73d44a348b32f4890a5c6cb58258d25124e5b0c096d5f5d5ba034e99716d40cc7336ae48802df85d90c5d8717b4db64512ae8818ce6f89d42018e5a20f5126e222a77b83bc970973ab20a1ee4486731e3a8b4366f4462d332838de5a8d37a7cff3e5ccf85318de5b3473c102a840baa044ebdfe911e820d035d2f82d356f4fee2dc7b80e975c3dd8f1515d4581699491fe836cfcc6b9148fea733e48e20d38b18a0149f3c3370ffcf123f12a229e15bdd60ec34486d9ee853022cd661d429effc41e2aee43c6ee8cea7043820f7ffe8376bcac18644e879260259039e81a125cfef4960fed0f934e91c97b837d45a21c5a6548891f6a1cdb6c11ed67396fbf326260dbe1a85fa25c25f0d58fd80bfdad313f2748c522c87deff74f84350730f1a38e544acb39598287c1b3a98f2d649af7bae6d35a878d431c6286d119a302b69d56127e3ab55952df8f2c12d2b4197193ceedd1b52de461d3670030343fdff06ef0f07a674b7f34b3e0ab3da2b17db2ef26988c3902c0993bb931f6f46e6ef80234d9a121e30e807d2ec6968c7abeee64b7174d984b0609ec73aa34b4f59fd6482f9512ff368e5d7ae397ba56f833ce5feac84e0711fabee5d5f8a6308335b2edb9000cd5cf2af0d013cacc1486e86e2e9fd95670ca066acebb9c7631bafb44c9bbb03a3effc61ff48edead378176f0587f041a8f36b087af2509b85e7544cb73ccc08eef84c2feba8f77ca63809ff000642c5788a3b2a7e5280416f78caa6d115b4f475cc9afcc8c3e3e42fc3f551af73dde766699f54f76e708e1f87388ac90f7da073816397970e7dcee581a2713594f9f74a31587dc2db679569f295cd02cedddab0095aa77f78b0d89005415b80e510d3d70f81fc4cacc8032428ea12661881333a417f17b389f72307029f9416c94499b921f45ac406bfbea074a1ae89289fe517cfcb5928607d26804382066e82a434f7ad6678df121b9ee5829dc4aadfa03a08c61474e96da94e6c18631c9727b22301fb79dedae8b2136d75e6a0f19de4956d629c543185d074960a102d0f9d2cc671d5151975f3c1b3ea04406966a6ff2cb8939afe5948fa865dfa50f63172a5c2534c22e4bed368259f315e8296a00ad0202aae0de42e1b864a918a3df16ff8d60dfd52ed2dc9de376a916b34973e3a7486391d942b0486eebf7865214528f99146784621a4b6e19586f8c510c0eb252ea0689086f602033947ff11bc743c66e67714b64a186c8d31185b3c9b6f9f7e4c545dae52c52683a59e11ac6430ec9c42ea2dcacb84d984e46b16cc474c5d57e11644d5e307b0f9f06f2e0560fbe91ef008d27a671a79a0fec3eae9bb943e6c35fb65245800c197891a19cc2078e09027299d6215aadfff342d05a5524d058ba7188b41daf8c58b51b049399597495fb66081785d2b9c574c507a8082eae4f7daa303c07963c93cb022221652d765078dca376103a3814c370827fd1b9103a71c3b0806375347af2c6d04a67cb77e3a2bf4396b483f02e04a821f9d5f4e180e9f8f5f881e8236ca77586e66d3607643887ae2b7a9a44aa117c742f8a80eff15f42eec3ac081e792582f57cfb0ed6b58732a0fb72d3adf030cad87881ca2bdd175673265e5c4dd73267947d40567b8c5fff7fedf60991a21330014ddd78b8909104d25e091bedfdcda8f218e4362e1d14609079af167f465c278f28a5238e53d7cce60d47a5dbbcefc35502d879718e1b3e5e8b2df25d9bfe61d7a69ef99ba65e11a914fbd9cfa66dd2741ccf68989e3a80957440d27c4dcff5ba39c898c2e9b130cef1ebab17b7de78f3c417e154951b13bd2960dc1b67ef2243c4e5c232e6ca3321eeb50d0480244315724b3ca3744ea42d50dfd74430de42b8fb0c1cbe724a21bef8bab9638b62cc74d8a0fcdab60bebaa38ea42de741fee961807e76dabf587980b49d366c58b56e7d116faa968c58acd35a539be10c5f6d9695b541a5fd8e72d3b3a0b12195345d10c0b9545d68eb65795a813b885ca08649518f061e947aebadb8f5a30badd8ef583a0182b4162d8af49eefdad20f844e7a3b84df47b6089389c0ff416d8ea841d71d940470726054ce54c1f9f1212683cdfcb0e0567b5b1d910cad2229ea6f98264652832af2b51a415c655ecfc192ff707c209ecdca8809065cf95ee6b47cd8425970809e0f766dcb4716653a965dcf6bf6a863cd24b45888b6ae2b5e2cdc468a0300803fe0d00ba92465ccb46e5e48404762741cf7938f3ed54323e0a044a4e77d1c8d332cfb2d0d2a67d6404461e80579a8e2f8d61dda0842f95422a013c2fb16f95f308799caa5d8d25259a52133b2233178fb11f5159923f488ad18ea01ab6814316a9c83fee5277f6503c8adfde9521ddc6308ca541ba52e7a63294ce11059e2b5982f59a41e2773c811bcaba42a8a004fdecd49037b98005a1a42943c1701391394e4c3e2dfb946ca990b6a96f379cd6887ef267bc0b356e2d288b2093f29f46867f1ab55a0836fbdaaacc8539cc69e00424953c0a7d0829889f231f3cdb0aff35a71b1fed748b8d80e0b4a91780262345ee9eee36a907bfd87053484c710704a084c22eb7534c419b3521797f4c8196c974b3f1d4af18eff705dc7e7ae503ae230cc322a70de89ec88022da50f497b77d253f460bd4844c4aea7039e8c5b03840d3cba2ff0a15c19effaafa3027fd93cd7b3b08ffadb13e4dea1e4e9bf43625f44ebe0ce2c9df6d78bb0ef894b6599e9edca69806e55fac2cac6185e3395d3e067be26a97b6a758851d722c0867823f5b115db31b8850e74f4218e3f53b620b705c38aad973905d0730ff8ddabde60b8c646a54a353dfb8499dda0659a2df7d1623e5592a8129082e1c48f523f2212389ff8cb38ae081332f15e0ffb83096eb71e10797a0ecc1a0fb0bc182a1c81b4b3418cefe6b9d466b39c069eee8705d761370051a1682074a668eee7fe370f230856a0f330e04747c858f929686e3410e9a3700e5cbb9246e5c6eedb7334b319cc76d5d30c8ded6b626d27aec214b364eaa8fbd32846601acdc51e3ff84f3283a0abb315b66173d737314c200f8805ec202eb5a66073e0336d58eaac8dcd308ace2eafc5f50a6dd899358073f2bc4f91fb2310d0e1b58ee435177fce238f16f6e69f15cf23a7c30892aa8547624b14f9a120c00fe7bc1f7505255d92a65cfb1e9b00d522214cc32b7f0b14355125f92d21ee0d6f0f65da33c320cf23a082ca2e3dc39264eaf7f3b6dc45004c686fda8be58c0e1209e6247ff32979f5e738e4214cfec5a478a6e5a92c8c436c60174842eb08dca07b14001287d344b1c96c51e34309610a003036c88c8b97605884cba58ed33e4bf70d1131803d1137437da762ca3ad9d9b14efec02c2b2d38000b36e23faa6104d512de939588fbad7e5ad84748736852ad024a6a9ea6c187ed77bb80a6c6aa095e27f5fcf2e5314198901428fcda430f4c57c1965e89a53ee37370288fbb97b15f4fe4087a4a715d274dc720bbea41691942b8f1c9841a8dca7b4d55e9bf3899f5e44826d30a10e58997498ecb2e45ad32b794740505618a0fa703e5962c6684bd4c6513cd485cb6868c7cd8fc651ee6c8a22adb0b3ec99677b8ded06353e7e9917a00d4b16d5c2e2daf1584ef449cfbd15839860583a501494bd779e935f370cbb40b676e5b097565d344349efa4773ef2f75d1c6de71fe142d294ad21130e88c90ce195a2a0e096608056e3f72e253067d6edace99352a3953bb3640a10ae66cee7c6230016b59468840627a9d7dbf8e03cacd28c0054e3a2a008c417363e4ee0300079265d3bfc41539e9c17d1df4c3bb9ea50eb20a6a5a116a6e5de29d5c9c9ba67a620a38745ebd2fdbfad4479b878591a35bdc65f7cba1497a7b12a7409789f3a4ce32b9ae4c8b34243f49569b03dcbceabb5ea482f4f1cdaa65d4c1ceb349873a1e2165e0633e1a335f4128b12c8ede6c95303daecee286c0856935a7414ab4465ac337c404479c3b3f0b02511e0468033256a9e51021b2f9c6bf3b05a443e608be58fb9456c42e20e4c4be5b46d7187f6d2120ec1ba28d8d5dac56356bba95b431c5565ef325af6c558d18cd8d68292ccbca72914695071bf6929c458d866272da1df54fc0b5420735404ddc50193577b3759456b6e81a81cbf64948e498de5db5b27799365b226392d754d10652a86c44aa807ace821334cbbb117f4e8973e4496f66f672dc630e9ac74c34bc237bee07128bf4c72148f36d22f86db456fac2bdd8cafbb533c280fc80e586f30f99d147562078c47ce2f03b4f20e4be597fe4084eaa8e320291c17a9be6c564df1c1e19ff161b334abb592358cd42f8873f52bf0f2c62aaf41d919c6bedc527a8123628faabaa008598da32d798157ead0b5103c7fae5f11d076fae426e512a66053fa3c82487ec3fd087788fbd231386e8a4b1115e0bfea24660be26cc64038c9263bb34fe45877dfc1e71da8a07fceacf8f688e5b377f508f1ef853be18d2be5bf4abfccdbc0ed5e54cf8e7f3e89eb2182d5b272b23f1931a2b73532c8e1825aa5606a072457a48f848460bd3ce9268524d793545fe08ce0cbe47ebecc1cefff61993707cc8b7937bb88667cbd7db43971adcc2aba56636599f8876ba5c07434f939d844138f5ae9002a0f01f029969508f19b0c795f33afa027acb53d0a56ca3728bdb96b689655c798b22a655fc866c1f3532275310cec5ab7469526f1500989314122ac00e7a297ef80f266d59835d093e34ac27cf618b1ef1cb4a9f729758a96560dd995d9849dbd428c97af653756775169340777bc5fb496058219e87860884dc342dbb2a3c8d8a2644e23bbbd4cf66de020a761c717bac7f67a0dc4747dd97363d62ce5972cba676752378eb05ff8e64e189b96a3d97136e946efc7613bfe2d1f3198d30be6b5f9418e22670dbbd40dd334f2d8e31f8ec0fabd8e1178c5980c64d4d15e5d59b60566f88cab9d2dd51025dbf9a1602c3be5154bafa6e820ec06d0082ce035f7f556a67ab599f2523ceeb2fc55a9bbfc181e03640704da928a8059305656a503016676f00f7686e37c00c5ca32438a933bffe3d4aeed85014d7bd040951a2d42b451a5fbe239ba5b9f2b613a2c0a086640bca012b48452ff8868f3c17f0e0af937fb5a3a14354e8d2f09d97bef2da59452a69402c207b707280831cf97bf6b4eafb172326919d7d59b9b8f2e593a07bd72bb0181fe8898f20fd0f9f6197ab54344007d3b0dfb0425b72e086686265680011ec264392cc8df1a9d79cb4f5c3763e23a55462f6eb995a1032f7d83fca47085e91186a9000014549c5e6ea90a0088a2e2f4c7c7715cc3e32207a49dbd06208fcb7220a1f20862feed746ce5ee7b4c69addd7a0b30c07678c8d497eba44b293d569f1cf4c8c19bd4f60e638f43f5aa61061f7bb764e61bc085bb9043edee2e8470771709ab1083bb6fbe587daea7de83915b4fea622749173b3fbf5decf0fcbaf6db859033fefaed4248d2b3672e5a0d8c51ca49b3497963522303fcb864755c186f5ad5e8db5dde4ea78cb754d570f096b71a35babb9b99512c2c376ef08d686ab191137846f1c6c2db0d1c2c3870e040d9a88103c74ac58103c7098749c38103c700ae305e1bf1148c9b79b79beb1dbf1d13a1a43003aabbbc946674c9529a69359a5683aaad624f1951e92e6f5d396d77bfd7af5fbfe55d790206bb290d58aabbdfebd7ef08c358abb98470b0cc1903f50ac528b51a54abd6bb6b6a535b748a8b0a535cd42efb1daa292eb800eb340d9f50edb2d40d529b7252b9f7d62baac77befbdf7fabdf71eb42cad06fa7bdbbbde6b21b06d0cc33818e1c2850b1742b80b17a68ca81ba38492c20ca8ce99eaa2524a33ba24f5f3d0535dd48e6629232a866529232a9665a92dea7aa6c5a0fd42586b8c35e529232a46218cb0d695951a357677771746086b0cc1b8f9bd97d2a2b6c3a1a221a25fa2a12643301852c156854889880a9114a2329e9dae0e1ea2783185c80ba45f222fa0fc2f911760fcf54be4851753888a90a0d05fa2221db451ab96bb21b20121269750078c64d090293732e89fe714f178b1c4442cb192fd816808e9bb8c6828caf33685de655e008d1c210f41c6c8d49f43486de0c7be3f27e4c9cc3d39a58412be252b56caa7d0bb678acbbd3c305f138d906a5bb661dbb5c1d511dd929bc60f0a6c73b0e68c31ce6dfe906e39d56ca65b5cf72005d241872eb51fcfa7cfe85a8d8c6750082195ce3ee99c51b3d1d6a5ac8930c22aa92d5cb8308cbb1caa30a4f25f7e394d439e7b6dfcf4dbea5684587941e54106ed12d56879b87cd46430c05f590811f3ccb50899513b01e808bd00745cfe329297116d915c165d088a69c4a49f9df9154dd1637adbd7b6e823661eb51a8b99ee93793e989d9fb90e874ff9e88d5f53415d1feb43ba4728314a3c6abf8131cb472109a43409687ee282c0dcc451edf28ce3adb6ea867a394d2bc19ca6236b94a3fe60e6a40f663ab6d54ec09c4d331deb2dc6217607bf371023cac78f4453668845f3066120fd7407cc2dfa19a7d8fc186d2ba0de5a4dbb6835d3a555d39999d4f6e9343d8956c77c40afba4844e3d367e855fb741a7a45e3f4d5ac6d868d86564d9a56996850a7cf98f49a3ac1c3cbcd4b1110f2f00244c48942001157d3a3a8d2a1bf9739f59b9957410475fa66acd900043f731c0f332f3920d02397b5ea8893641fecec98cf19bd7dc600e99c5489d52c83121ef7d132102ab13c6e1c6c1898ead5e4b85321e09cd9cf08eba2df5c422a0ca91c0f97d0430ec8e32890e63ee084e80ca5ef68cac55fe43a7466396b3c39e5a473ce07e18565fbe08b3166d93e2d5b0cc6c8bd971fe77720f8c8d5d57131c6615716e4a1e5432a83927a0724a5d4a7a42694dc5a26cf4cc73c1574b9d198f2211d3bc96d52e926e9d22daaddc0539b493db1fb44e5187a453b01841042d82f430969182da63d9f8431c2d74c2a3b7c961985f0410821f44d4218a9430851281b33ef3dd40e360321dd94092a3bbfeb6344095971a227ca775d0fcb349349cbb0cb0939237c74cae8f0e90d6b3b2071f7d20c4b446feb31b33403b7201fc0e9e1bd37b9986305c2b5dea57afe84707e2c26086360b61c16ea0665d12963a64578bd29d02923d44c0fc21815846cd129afe704b66c9958dec6d289e5c65273b33cc812513586a785acaabdcb56ad134453d2031af1c529e37ccf12b2d23ad2e37b906339e58b904e592556790fabc42ab04aacc21fabf0dc58070821bb7adc4dab76e855454a610d96540e6a495fcd86fbe796082a0f6649e5a82bd45aa1488592279440dda0e89430b2a8607c4be5d0599de521cb2d53a1e49b8fa031258c8fc5284867895472bace936123a3d6316a1da3d63172231decd96875b4dbd0011b9d588258a0c0723e8328961b5d8c0ac6b7548e952039419692cbf9c8372bf1ed3cc483aee71b38321c6fe36964d91720fcb9e580c30574a041f6193d666876c468a21c0676d8827c605790c3e91b5a0f38f828d5bc7d9922ca06cbf2a8b1c223fa6e2c28ed4705a6bf6933fd4d2c47b6d6afa624f560503a2a9c9e591e6b71a142314a5b8e196b0594f603080a65a306cbcaf6622cb7b64a8fb80a57ae3769a715867c7ba7fad649e5d89518ad860ae4e828e503f88e8306c0414b008911c3f5930b82a4723c9930163096b771460b2cb373f400db28b9df7b90a39452f2a47cc88da7fa881eb518e62f07c47b251d882e371eea233ad4965a17c6190ca482296a674a1823dca5ef3d19fade7befbdf7dedbee2906f77bef4d0146f8faba7c7969901c2bcc0f5b2472cea74f862e6fd7db48a35e323bd5ba32d56ae2920316cd7679e4605e93b6d7632b9796c598213fbef6deefb803c022f1deeb6ee7e617457c4220841036afc718638c11c61863e4f9b80b3d107d22845b044dba5af08ff55c9006d07ce08f89a9014a7437c4b4641c64da70e015328390f9253981d9b11d4305fa98f9aabdd27c5be692d2e4c998b80b4ac3b4373542ed2ea28be82242f5aa350835cd57d35c989db7a7009ebeb6888969d5838fbb8e5a7541e92a946e47fd20a2f9a64328d764fa644ebf707b9ef3eb24867d6915bfd0775169c708e239e174548a4af4b4c59e85816efa79189d83a0406fbfca8063c0a0d50161e4224f0c7aa91395a8a82f35888597dc518a252829eb1394373bc875fc1bb6a51ae6591e2faed6d0a27614487bcd04638a97deecedde32c02436b1a865190f330f84677e66dedd442d06cb69a6f9cc771ad7cdbce63a3ef33579b7e333d4672c9fadf059009e25e33acd3167d9509b8d154ea6ca759ac3cb07f0ed9866c34c238d3498f0513ab6c1bf280f331f39205ced5844eaf22ec843ae7b29fed9cd9994124a38537fa55ca85321cb3aa2a296fa6caba10fb609a8d319cb629e35446d999ef3f3c53c8deb525589e6f9cbed07f8b45b4ae7e47ec90559895c0df2646e6898e7cf9fa752f4c9aedcd0aae72b90cb9e30d08f8b8b132f8fcee8e2adea9dd4697a723f621097e74dd5dd2a177f7954ce8e91ca88aa1c7380ed8e5a2bcc762a3f9c10bee4ba2a3a85f7801b6668558c3d7670e4c817c8a17694192587ee5a76f468557bcb0c37a07eb59aaeb2435a6520bc41bde43a26c2fbe7ef1fd7b5bcb4cc00011f08f778117a457140c05f0e0874c8bd97f7e24eafa83865cc57e84343a58638e100fedb5c703ec807f16cc10c85446d61cf79ee96a65596cfd0aa6607c8909a0ee0195ad50ef05e35e5a433472e48e7dfeed2dd6c59d32dcbb29ef51ecc79c843ea813c6f6f157cbe2f74a331728bf35d4b74e837a9974eb7a535d09f13465405dcf3f297673088875c77f13f884928556c4169b9ea3348334aebaae76b56ad3a392b879fceaad67eb4f094e3207e3ac39f1c6b001f3bc10dd5e104f1cf97ebe011959f9d8a3ad9bfbd5e4edd29a5db4bc334734e455dad869ede1b31a85d0a0796164041354c6744d44ae338e460c9987aba71974a45d81c4cb54c6ac21401c098028c7f5ccb8f56b1df8841e5d419b55b2899744e0796161c9981612d9ae7acafc6272c66dad662d3995cf39cc74c268f6e7a8cb30bcbb6e7d86bce074ec32ddfc76036b79e971c3282e873fc0e1571f4589665dbf32b8699695b27c33e909b76cda36b1c0fedd133ad267aa6d548bff6724d93017254becfb61f7060d1df20892b7eebe5d2815c1e6ba26b9767cb83f6538bd3781802219e3a53877479585d08fef24cc7d334964fc0b01969de6e0e23957f4e0cb60d3e9c3e7ac64ed3743257c13a47e7a3e764f1d07fa0f9e839ab638144aec586010f9d010f1deeee7639fc587016be9d0518a0e9db7fa8bf5c0bd177b7fe4ee37beb4220844d4def73f82090961f0cf8f61f3898c6ef4c428bf42861af380a959d7a47dfd5820c2db470c550df074e8ac1df073e7aeafc025b4260d42fc734194d119e6a887ef9db2cbfe0e59435cd8608c3aff6237a07c353ce07189ef2d50f9a34d00f849c92fb412d966360390f699d2eb910b448807d48671f92e3c97c4ce7813e76a41341a1431f932342c8c987f4f671ea1a62800fe85e3b74d80d4464459197def2437a74f93aea96633548b73a4ee3691a6f71d2e976fab9ed0fc9d1d343ce8713cb802aa18933a4581a4115cb89a529c2e8a74b48b919331754e840e4463a39bafddd4da7dcce8d1aa93d6d902e6b1aefed2e845b734260ccdddd5d82541198c83ac99664605cc1fc72392597c7c8600cb87cb91d1a869de90e44a8dd42c1e1399467c73299f5c13ea74569ce5b960ff3ad285b33177a357db7e95bf3eca045edb2df9956b1c7c4f09c1b6d155d8ebda2989fd33cc8ac1391b0bb4b01e6eeedf7208c35b2cab0c20bcd1a638c316ed2654bc90dc3b28cb3785d291c440c8318f61a630cc7ca47aeb3005d1d1b2d1ac01db63bfa10c098b9615e86d662e886dfefbdee6eae2506fabe8f61cf0c60dcba1e1f57bc33400def606ca0bccb515dcbae2eb55e833b6da68ddfdd531ac5b66bdb563d8f395efadc6e7ac01e2b3c4ea080f009cbf218d94d1108337171c983e99e8f28884b68f0ec71494b8f418f72d47e30165a6041a31014929dfc54b1557133d7c52d736b7b8fed0a0028a8999f9cbdd9351a723ee3b62eabb1e5716126ad5ed5a461d7e95a1e976b3cb0939bb49aec74f2d56a4edcf67c31379f47d4063fa27e20a089a222fc737862490466661f28e6fcf0b153ab5ac66439ede4cb766d0040c175519a614e1d428cf2a7de8dea41f8bc2d7cf057ebac9f16f4b1d3e34a83dab14beff99c61642dc677097119394c440670b2214537990ece4324f65091405fc2893857506623b5b1d74ca880722461e5e82a18353acddb78b8848ad44e0a49a1e5117309ad20a9b8845c9e391c41ab6348ed56c011f42b1cc5bc145a1d2d857004a9806416183f06b3776a6af94accf2c93197010aa9fc27efe0d399981adcb3d2165737dbcd6a340ae5366cb80dae06d7f37685d3bc725ab7522f3595a48b738b4b323232e22d88ee2e8661338f614d69ad95b999ef6ab6429f39c6b516dd450775ca7178476bcf778ac341e90d2e76d2d3b1d1d91940422e2e352ed0eda599e665de51772152f9a18c754df91cbaf06febd1a9a24c8d288f40bf03d7396b3bbcd7d3d3aad67a2a2a8b8e7b9ca712ac5002c90a2590e875093d10ef2ea11ef5393fdfe61fda799faf03790d380171ace3cc079713eaf68c541b4b3d191b1e69cac656635bd976ab4fd98631698c1454a94f8f9ae652ab69cda4b5d65a866d526b8b097649e9daa4d4b36c1ba3d896f3f464795b9e65da6a1ae637a9d7fcd26a340cfb8b52934f9c5d9210b39ce65d8d6a9511b57dcaeec1fa4694872b23ec9e9eef225b26297773b5b6bc7ed9a3be6b87ea3297940b2eccecd897563d74e9cf177a479f7cc5aff315cf4ed65b3681696354ab9d050a159572a1ce539660cca25643358799065dcb79d39c73d215c73ce7a5ac2b529e7cb558b79c8f27cda5e6340f896bcb3fbf8e49fa2895353cdb6827e0f9f42825a53d24845edd8575540a4a87324253cf1360b24866978526d4ccd925bfbff4aa5f7a46e99c73cee9cf4dccd499d217a94491a0df2126a63011e577680453be83013bc9f0d23dfdf3eb5d3f591efde497258a4ac37bc0ea6089a276a9d47b61242e0e39fe6176b2f4ebadb33a164951945814a344d9d54db16eb4db4d26cd6f5226aea5db5bd34e94d2a7693eb72bcbe4c9fbe4dae93a71342dad0d7b26c74e0ec434fdd45b97e1fc1e9db6556959ce6798f496402f69b3f4028baef5000845518aa29cbe73fe6935d776ab2cfe271344e62b27ed04581e2b7d6c3dcfe179e937a9962925c48e2e871e637cef01795e1f7b8ef90e1511fa9c9f5b97e1bcb5f4127bd80fe4d6f1ce430eea4a650a51154bbf442f98f2f597e80551b431aa0cea06d122b59856ad8fc87902daa5c738678f1dad7a3bde63b0e8c2bdf46a695ab57e84112441c1110a96c01c895a60c1f366208564524b9091094920d6b19450b194a001808e824e6b5ad3064accb08eb0be484da774d26073ce25407049921b4cc6ecbe9e75164ab7446bb4c41632343a2ca1039dd3efd012552cc1e48985d2067a84f045e62f964002851428800ef0baa88748c9e882c2ca1356e21018127809b3f305a37cd2b2fa07326666c7e426951ed2d78e991e93ca15496cf1051464407144ab62908678e08a2a8ca63083093b6364a88cfe0e297194094924507a5ab20316ec5021e50b22184d312611507091861311b4c0c788153f9044c0a28b235d9051c4d01652ba08a638c4048af093c4072df8220a3b50028c1c2881845d52cb63fa941c9f1ffd8eaa2e8b49c7095d72fbeb1ebfc0dd2c451245579c60c98d1676f77517dd15d81c93594fde676aae7f8e36e8b7956c9491b4eb1d63a38ccabebd44bf046c5f7cec9389eb5dccd32d5555ee33313133d008e1f000f661038d236e567a81fd362e4d9820e5c56229e8501243763254269950e5ef5012423c3b1a3b2faa1c4a605b3df88b2124a864a8ccfa1d42c28cc88418585c606808a191052f19d58a6f1cbf43483cf9fa3b848493c905b62fbe426380adefcb83b0176a10883ef6c1300684dac5279e9d3d023db13c6093a0e7e012be83f97df13db8c59e08ac0f29b92042105d4044e9043d404a4be90c4390483105511a53f86981b442c69d224d141162f403329674ac1ad8e0dbb39e42e6440e809c50c4839f21943089af48ce114514e184218440c4094de099184cc10a15f4f47bef71c7ee9b997fde38ef6d6a24e982899f810e9d1fb3189605042b844860032d80c08416918b2b0a591f24a18a2e888842118c14617134749ba1554ba40c68ea85c000da40080b88b888504207377e879468f2d877a9ef524768e1a200a02fbdfa81483022944bb5caa50967604d3802b536b738f56468de1056139a4069304a69ea9d904474021332d007d7ddf0f745a40471880850f63b444489c77e8788ec5c37f0ca95fa53cbda3d059d9644017befbdf7de0a3a846f210ed6bbf7b4f8b7420fe43d0821e4a7fa17f30f3a148261399a005b2dbee31f3958d8c066b590d1ea6d5f0106f8e59c2c3e3a847e0169de67e28d0c9f80edf2d0326cf7dab56877777777b7dc8d90f66abdbbf6ebeedddd355950a0fcad280f32eca92db06d15f3cb86503bd47b47579b7269e13590d3cee1f0171df1f33b7404152f7e878e58f22897d494dfa1bee343a022ff9e08fac7e1f46f20f55d101d1d9dc749bde95b78ecf24e7b1f5e1a69fc0f3f44bf365e1d4fc77308b31796a346ea7bfef78a1ed4b1a276a9eee5aba3bc472d02422bab8f7bbce2d1351dde8957385e3239cd832f7fda4c4728a6b2022ab17bf4e831e77cf9e1d2840943f8c8b5fcf8c8b544cff9684565ef1146edde0e1599edb15c073ff668223a44ef08395e0115a843b110ca32175a25f31cee68988e6955cd0b0c2e50081f17d32a1788c0f0ed422a845876490bf2400a210e5c96503e8712f598d318ba2a0bc782efa915e4824d82f07b2d36d3e3e41c90c3c6ccfb7ab45753f3f61ebd6aad67941947c339a0557406413db675fba4072928ad35959a99b192ac24ab07cb4215a1c506b6d8c4071255ad62ca3dc4a076a9981dabf9e48b356bb0785c8a9a3146044e08a16559944a8108b609a8312814ec32c9d98542bd54b6ad802d9f96a41256a98fa152f0ba681a887571eb588d65319d935bf781a75c5e82625c794e8410e5e920f975228427dfde4b4c7332519694592ecd0a873957b9dc0407d92fb0132e40fbccd809b3536637b1b364d628951cbfd4c32ddbe6d6f51384b84b1175b7a5a4545bc98a568c41ad9442a3765cd4ab7d12e531522bb154a9493a49ab98f492961ff1fb09fb020edc549647cc7e9170e01720b00578fbc50d8bc33e6075ecd147a44fc2848d5ac571e58c8b2c43d12bcb90c8ae9a6d2e0dd318979a5261abfcba1c7235f5b2c6cd2565a4760588813cd8eea8314e297bed55639a3f15782ac79069db0a38738845c722c41e1677d6a7dbdc9621cdde7b2894bf25273c3afff2eb644894a75d57a59ab93cb3c0ea78ce3c9c71bc53e3079586d2d75076e31c7103111f3ec1f68566bdca387608c509ab6adf554ce20c068fc378efbdf7b8c978efbdf7b8c3e8f7de7b8ffbbd202cb4c822680c558ea22254a1822d468f151e2728e821c6d1cd1e5d604c1146184c053671e408a63286ac528c181d8580268a8c708312e335155530f182c6a0145297479f9de26091ac294a5cb0483892a54dd5d1d17932e9c4891ec588618911e3b1ce832283808ca4904163ac93d3902d84b04ec6883d3c64849dd833064eb74e67604c01860a6eb21401c098228c54af70200e8472096d10b618f2ec3be87eec40401b1f22f860ccb34c01c614cf39cd7c04061b3b3d8ebe5ac326622384934a3939d9abc83ddff5daaa2765dcb8cbb5d8c42698400a132338112505462908e2ed862fad5a52f3bc5b1ec745e934ddd2c3b7f783de1e9799b09c516fc0a0b26fbf97758a5f500c17402ebf434df094a0e777a8043adf594b186a22c93ba1f33a7e8790187dd21009903a2a0d91c0c9f70e35e1a48bcc60f25d94d18c24cf9ddcb1fa3d66cad556f584f2ed30095cf2fd923c26487e2091d71e84d5c17284ca8254bb26fa1692d2aa6ea4ef242655ec149992c3f753be6f7364ff86efb37812294796a820a902e5fb367cbf86efaff87e557ad3cf674e24ca942452769814790cca5b406f63e4e8a7cedbf82c79f6fd192c11cf3146d586ea7661e48aa752bebda9532adf4ea5f4aaa350be7bb5432508fa760aa5575d548ad2abae858ef805251d9efd017a4b829eccfa68974d90b40cf4d14e8d9647cf5c9a3fce7574a705aea3442c701d2d5a81eb66926f17ae9b412d5c37a9a8c07553e9db6d8e2ce95534c1efe7d86c8e2c61c224a857d189df4f6d364782aaa842a75711c9efe3d86c8ee8ecec1ce9e9552cc1efdfd86c8ef41c2972a40852af22097e9f65b3f1419a32c527a957b189df476d363e493e547ca81c01ea55fcf97d1b9bcd11a023498e24f139ea553cf2fb35361b9f231f293e527e7a157d7e7f65b339f28304c9119e5e4523bf5f379b233c47881c21e2a3d4ab58e4f74f9b8d8f92cf92cf9291a45e45267edfb4d918493242c508959f5ec511fcbeb6d9f8fc204112d4abb8c4ef679b8d4f501555f8f0f42af6fc3eb6d9f8f0f810f12102a5575189dfbf361b2350a2443182d4ab98c4ef5b9b8d112423538c4cf101ea5544e2f7e566e303e493c427c951af2291df879b8d912329528c28f52a1ef1fb73b331a26464c9c8924eafa211363e3a3b3b4b7a158b789f254c98d8f8f4f42af2fc3e6f363e457e351b9f22ab639fa65f94203c92efa2920cebfc380182d27792cab7cb27dd4d8a829c7c2fb922554565f2cd9384469152bea77c4b6845661e1ddee1793251a961bad654ca9ba7a312cf529d5c17f352d42e2abd538f4aaf67087466101f7db508e0d0df79fafc42a49d10b550ab6eeca076b585965a2642e9980844d2793211e9e954bfd103bab2adda2e9bf2924a232d217551292a217d2b396955e328aa5d0bc12a642539c3d4e04769ca1296a4287aa240c2c21124499292187170f7bdf738caad43c89199b31e40382d792d5d96b5afc8b90e4f3d2e075b15535ba9bcaecc310969cce596ead5fae3037f5d1ee79c5c37ddba72b89c351bae1f156868c3f40fbc6cc955aec21360aa554539a9679a0b37fc7b51f94b0edae6e22e17f8878aafa26efe65b5877f9ee17c0cb2be1c04d4182261bd94913d193ae9a424c8f18299211b6430a52c90c11394d0c248952251884115592c1108d08385154954a1810faad019e32e29fa42e38019689889f1e981cf173e34f0496225c16c7c81aa196d1e3cc8e203b56c7574f23b9cf7cfa9103048024893fc3cc76bd65e8d7a67791721a5d4b2fcc130166394b23e187eef750073eb175b0cabb00cb91b5cd58bbbc008217ca956ad207c7005613bed158c542a01774e29a5e46236d3aa4769ad73d22d73595fd295b9dce23ae994cbe6263959e1cbf703fcd8f5f8c8e1c48f51409aedd2aad900812c5759a0017c1deac57d7949801042286526a53479669232cba8dfa43e6b9194c6986559e6cf35efeb724ab5ecda6eb2b738ec071b9db162d369af34306ad6aa884acdee76b9a355d1e7a43e2d8beb7aecd8f1313a2afa8baa5773caf8ca6025e89c049da9c0ec1fd04322e638a991a81deba4d0a8dd4679e83998a818864d97b2059dcafc23bea42995cf7d2f50b6d1d236eae91de940bcf38820e995e460aff67f2495ed39dc04d1abf93a5c60871e7082f44a725d44d42a38a107f192644f51a953a4c0a424a19e1c96931e0cf4759f229f80df212340788c7b340cf48ed6754229ad359552753149bdd430d08ba488d4b703f73de949176b35ee118ae54df464baa761749e0c27350c74a3182295a762aa8a52aea342b06b22ad8c9ae4a143a409f4440a9222a32847939354c14eac8d23b7840937e12be893975cb74e1e9012b63b9e598842853e7f878c40f9ad52a3ef772fd137761eb51aa8d1c05056b52f83913256b5dfbd7fdb4bec249a10f5d149fabe748fbfeb9dac8fba0c439ad22aa6459ea8555c54a55a7ec305b5637696a4daf5d1e42290352895596661f67a328f9378b6c1debaf91767512972e442855c6420fe91dc2f66dc47494fa757f0c952af1e3315a5d742530a18f47dd19ed4e91495babce543656deac6302ceb18638c2ea39fdcea70f84d7edad6f44c5bce3f0d738865d84f8c926594347b3b94ec903d60d7a882af8b60afc85101b41aa86962ec3ca754282e460d4add4703935a0fe87bafd9c4f267592b8a5214e5caaeb836b81aa9d44aad943669d284d25a1fb71d394aabe29539142da8a2b82cc62853a9de151b1f21e66ecd5b4a2d321292124fafb4662abddae955f3144ee2a5d6e91c4d2a9426d465ca3439ba9d7552931f38eb187d535d54e8dd5279f299bfe84182d076da63a41eb52c4372a40713919e4ceac1c4a6fba8348eb744b564680600000000b3140000201008870402a15844a0a99a5e3e14800c86904872589bcab32888619831c8188288310000000400448846230008d9e1576b798a722338b150b323ef2f255feb28a2c76520351a52ea0f078b75a4c8e6c5165b11260573478417548d4e75c83456e12ad5624f8385dbbe18f4ca4749c2b20c93385c2c75ca67b067468862a656f83cf39007fbc638c1424fe04d0e3dc70719bd1299bbe25a6a4b330c8b1ed13c3192b658d644ed23667c38997b377df5fcc311bb76f97c023f568a68fa7d188cba174bc9e905e106105229127a89bc6444af6ce88c96e18344bfa72d8736cb1f9114a55a1e2117b2b5901ffa46f6cb35eb6a47d29ef19f287464382f9d948ff5d78ad632fa707add957c97f6d8cc6d2114fc0c9c67c9c2b740163b8955d48ed8722f2eba99881404b8cade5c44da42085b8a8c94e8b77d9448232496926e25225164fbf50aa5250b7dc85d27af4df91f2f27c9f44152227abb9f4a2f057d594420e37e9fa51979d245d253f6f282c41aebd5770f59657b6932bd81e49d2a35550a70a68ed13bd128e34cdc8b505e783313ca64b83437539074536b82a430ca632bc128d8bb3968adae8cbac92c0da6a46eaa7c88faa35ec11dfeb81ad27138ee5189de0165eb7bd348bf6b1ca4164da004db5980498e5c96e8f3c527e64c31879d074a44b3d487071ee19f72359a0334e1c8aebd156d24d59dfdda798d38186372bda8e8e69e4f144a30a04df6f6cee7798c41884dc9bcdf65abf5476c06ddd78655654ca8d25ae7733c647d8875e5a336a9b61b72fdc1ba634c3071573fe4e64cf759d5900bfb51de3ab661ddd0ac8f943b9e51b96a3ecefac4ac2cf9290d53cbed9917a8ec46f755aa94c74518c5f419e5b219ff751760d754c382c08ec31a5b68d34d146c51c2604b00431d192a3ee5cb105ea0a8450aac91a688a531e357c2d5272c1c1680d15095c9c611f3e3813b250eb981ac5c2d86e27a61d4795d8c47b55b160a7871ded410ef97228009a493913c997dc8c7564468f1ac3d3b6b1e2d1b821cff2088fc33dff1071e6444b4527c05fd39fa64b6291334e6b8058d63135d98ec4ca5c162342639459394ba9e8f865962651c9400f1a03000635268df04329a6a12af8541cb523ff957a31002843937cd70e8985e5dffb908290ecbd8c58d1850f5476829643c3b859e640b11a44452ecaf8e40e7795cb6464df970028cd57fdbad779ae43dac0a1d55e71072d333a66fa423a5b06f1fa036121904786374e6b786fa7c2ca53e58c135ccb1ec829a0f74b12b33a214a7c8159dc37c7f86919698454fbfc679340c3994b513414105161b9a53a6a082466b3ad5135150519c6ca93e1b7c9b0f5a5809eda6f641ed7c5aba46b5b9096c3d3616d2a0cd76c257d822a2a35534ce0d34ec5dedcfec48d0f6d0de6cec1f200b30476d19c1b8fee9b1c9c514062bcdf01426961ecbc8b605db93cace8f67e6a5758ba5d4e6944049aec007d7ada1b3e610d7b83c991d0095c6a01e9add39aee71847a26f77711bb8c467be4c9da93fb63dfd4254f85542a9918dd748b0a5a7e195b068f70949f80e6a2ac9455697a14ad703cd1157e0c13b5b0d233e2bd01f9d9d486bb123e286bd78fe7a2c5a6b0f088b07a53636bb717cc9cad9dee75420d68a2c9583047cec041f5884af8ee12b10bf158da567c15eb606ee7333bc9e8f1ea0930705ac02f9c0b9670c451fbfc1a531a19d58bc069b40e73df0e43544a0351257dba4bf353e67d59af1b20d7b83128d96e78b9efa90f83eaabaa1008f74e9860b266ecab8f1e36a99bb38b74f9f6b962d76b1128d2a130a007488c53f3372ae2731fb3d0e9158fe9e3c20a0e37500894346ebd4852ac827375e31b6ab77e17a379ff4938c4250d6ab2a9616ebf6590382e66aee68a6b6b339b15ecbe47ed28717aec650cbea58d02d44864aadee55dc21d2628e43e40667203aa4723537710ba2963b0111577a87c810e2d500b45ded4b9d4364f0ddea5ae426445ce1186242cb57d322671252da1484da529005520dca83900e607f53dd7bd84ecf396107a763b3331c57d9b4238ec809945001166cc894650028b40ca6e7d1ccd0d6420c2af2a939e08befe7e3c9b25750ffa7482db3f71c6468a41ca5935e33a30742e48c3843b9dba7c780a56ca83df5e95368cede34e20071309841440be10535866611e80878e916fba27881942321b6380d648c847e164788e7c542eb5e93868a2d581133e0323de955162b9b407a0b67aaf20623a27dcce93cd7fe6b740977d68a25bfd06581f1ebfdb04bf86f5d3ec933f565ad43cb7ae2c1ada00d03af23f4edde8346e24f206e3de0414399811b54e58f1d72b4a4c5caca3b081c6f20c4fce986a77113660e9b619917addabbc14da2db4c2d32633b8f0083ed06c78f1918d6ba0d55bf838402467ac8c34afdb2a8a79cf5b2d731f5e7bb65c999fadfc90d3024c448e0a2a01046f0e1340baf1046ade959ba722de4df7c0fbe35f2e960320501d42f5da2a6b942d22bff9d9c264be23866e48aac8fb997bb73f6902cb88180d41d72a3d4f7ee504c638cbd38ccc220281d84f83614499f9d9899ec8c3b24c4f083573067365f899b4be8eb62d399d804fbeab9290de1892fa2d9caddf75c9486602217bb11d9d8384dff22b182b851fe5908c8519f28b395390a629571c46e227bb194b06684ba34de9a37403a79f7b3203d47c8dd9777a6929a87d0c5ca5a838a88e5f389a31f2af630387b37b91bd0ae10e2e066ec0ea59297d800480513ca8e5983c54d96ed7a5fdc312a13f075514cecb9d87eb6e4d45a0e726fe061c3153bf32231acd7b3ef77641b9f9431b4513502b7df5d7934e63bb599b8c33079a6bd24f81e79e6b140a40c2bc8ca33e705c60a03cfaa37de08f6744fb5922a5db9b66c8de8a3b4adb7c55aeb4669915e7ac5605b5b123d50d813d1d9a668dfcdfa261e4623901b52d1e4806dc6ea23398d5884c4beea4e14b22bb19e02a0c6229a7117a303288a0778cacae0dda979df080334e7b440d08afb383e64bcd36f60b6192d55be8dda70664e82e40f49e1b06151759f2f6aba824c731d746cab8c4050d040771c301999d04f3984552decd3919df52005f4da71132a39752e09645f2097fba9fa2a7f059287102a706f17c84c18ebdab06887619d70f613a7649842f9bae75c3e02921cf011a2aaef29f27917d9c7d086d09a83a4a28d679de26c83a0b741aec54f205c5ae1efc657bce014b755642119b9f96b23ce04220ccf4253c23d4a4e3ea9fcdc44c048080c46ae2f780d622588d36006192f881747a3e0697b778d3ae1e4c436d4130a6703884f82edd1d671c39b773f7d6dfec81a95a71d102a3270d410f5f760c76ac1978ef60d25e609fa37095f4b1aa48d5446e98f8955c1f6bb81ce72ab7f36d50850f0d07f6c10c2eb91543ff32a4481012acd4addc21856eb6198192ee4afd454e7a99ec0c43a66e3b4a245b7049e8d7fd565c0d198e8e1dccb88c8ee2466c983412db6d9760d481949a3b38063366e1a480ab10ee271a38ae92834661fe1546325fded9db2942e221bfabb6b2fd2a1f57c236ef07077f2f27d2a7548f62c2ef1a6bcb338d1380adfd8fd5ea0a8e85d4c90a6f889e22bcaf4c6acc50e07969b5eee04f9eb6977ed78f6bb1de5768175bf090930bded085a69b5587c8f4647f92ada6522d1bdf917fe8a0914ca461fce5a393c47675fec9b8516d9120cdca5eb29418bbdd66c108a8fd1a229cff260eed2c1bb41716480a28870b6b0c8b7bfb129d99c62ae09c9e540fcd83d989b814e433616674d42b2fe396f9a0cfce43de37b51370b7c9bb1f27addadc3cd22c7a26352c4956ba835ab02c0f9374b527f7635c5b01de0611aeb6d16dea130601530d32d012c685703c687b2836de80be934efbea446662be7ddb08ac935d1cd1ba5abc0bda9615526703c60a68df17cd7b26157980f3147051ee8e919a1b59893dc3835c57da2571f89150ec43c05a5102ca202649e57bbdc624a6785670e224cb1dd332163ddf598053109ac42d402cc76a6692ff36344e43d0db22ce2043be2b513a152c0e71b038b68cd2ac62c2ee86fd26c977c835754883cad5de4718fc4d4001af6ad0cdd61128efb6e3ded8973a1f6f8eef3f5cfdd86c4438fc7cd660bfd08d45a8ac723c21bf275617a2c6d42ef68205f540d314cb8961cbb9340bf6df362b4ccd2edf2f2b8d38c82837a3425929c3c56769a0fbac1445cb4ceef710c23088c0b435ee05c52b229341a2a538ccc31c7478625a2e3c291a13d17af6587757b6b59be684e2b363de0d4bc32c21c5e3934b2d3e16be0d94a3f3dd720ffe18f68c4518f7f964adbf7413439df4687c66a271efa649a31b731338065b74928ca44ce6e006ed7198d3cee7f762c2950435eb4e6ed5e24dd4898bfcecdcff020ddc0acdf7ac7cf6b682750af3a05a5a8de0017425a4c86337a461df36c7558e3430f8866f5026d857661614c8e018a37b825048cff5bd72cc0903793ad33b4bc7f03dc3363444c3143bcf8b2712bb1882139ac6b0fdce061ad182728792097e08a760f911e5ac998c7da08c8c192179f507437c86061182682a657b941511d03e498f0011688b21ec0ff752420ffa762938efa7993345459a62adef36d906f0ae454e84022736d9611b6432f3f3a401cd8823108919566a499d197f974edb06d8c121d650683a059aaac2648754f1e88cc0a25d7d8b6ea85b644d7c7d2a93e9de7911ca70cbaa09d9c59f7c22c5f151638362dc6541c8c2457efbf5483427494603fff3b00bca1146430e90cfdc599ea5bf8959f6edb863ab5b523a8f8cd4c0fb3c1686e0b1e8026150185eec2a33c4ef81ab6d6e3717237970d8680c35fc5764a9919de498a957c1a6e24a5b34252dccaf74849b2f662f677c7dc2817675f3190d6a6b1f5eef0d79cf4fd6c7de2833c0518badce2c27b20413bd882df63db4f8ff01b55c1b153dc0c0dac161c7a067f7b2274a17448632d04538a8269c808a583b0d4e13c058e398bfb896431d8c3d6016fca0063ce68cd2b5fca531880958f701d1a0de45fe64ac431621aacd955044a606f41e75b341636f7a6c6265817ff1862af729b59aa6e53849ccdd2b07c6e1ee3b7a206fb697cb6c74775a1ab046f7ddc157c6158a27c9a51436bf9a3104c20831f19987bf0d3d00d4ef23f17660d3a53569ad028a72b3f6b22ae2f89e8545f4c5943d7d667640c5710bcff6ac04d85191e8b922f7ee3acfc2becb964d41f8bf289414388616288cd30240f2d3197a0c2e52cf13194b82826ef17b507fe3119174a7ebabfb86af9ffef2683f8cbc16d9722387f0d83359c1a958da717c7e949b56c1de96b2091e03766de7fa081a45a0750d310496ddb0389a304b323d3ba980ba21568c70e51d9be3237badc9bad620462dd3332712756bead4e5eae1b7e1f26bbb796056a71de62e954cc56bad0d7cec3274690238900082697e5f0f3d3ed0240b89fb9f0215bf19d21f915444c964ca19777d1437e97d54c891710d4d0e961265208d20518a585a19bed5da17d42bc44302b6c2eda0d510c0be8fde8a322e44116d2b2888eca986b7e60ffc5a57eea13d24671c05be87956917757cfa31f7603f960811d01de8076261232d083d0d3497c3a09751d8cdc4dad0693218d920e040d243e16a27a91f67eb63a72da24d38ec0907c7f8e6c7f25004a016d56ff6b4906c89e20ce81627e25ad4d56da3cbf2b3a801d97cb80e1906896aac1d30a30a66e11993aef9fa76f2714ae8b1272c3d9066354eda853043ed0ef75a21ff335528c91b43a7104bb04917328cd535ce52630d5261582134b43e2801a416f0a3d766b5104efecc05ad7d518fefd07ceba492889d529737fe21b05436f26e6028782d0eb0b9d3d408a556ce69d64d4aba4a2bfee8991cb01f47ab47c912aa3f1ca1b1dbe2c87802403bed0bbc30277f1ba35efc77e203cf6a040252fb2438a451df5d6c8c38230833dd220b2783a0dc3d62d3ccde43e98feb79d6f7cdc2854e31059ad1ff8ebb7d94894c6e780397be8dc7c2f7940d25d742f75fdc8cee9fdb08b9c1158221d998d9c8559ce30e261493c40afb70eaae76cda610cfd101e6cd938a13ddd0c4c6e847c2b7e991fb90db4c2d57904446c6d04258443c2f04fb6181f360f924842d9fdf06ac681796a793985ed7a194a498a804a9da426e455dc858baea67cc524f4b0f6d34f6c8fd21b84c8da476cb0eb779fe1ceb5ed4c2028c8275fd57b8515d66e9531fade373161b10b1979eb4a579a797fdd3098202a51c4a2baef59f28cf8d0f545ca0762b869f6b66327daf910024c561f732e938841c7a73d3aa745b28e0cd89d5fe53387a5aa1055acc41413e7b9df8a0e4525c879a85c7209b11025ff0c44b5c97942a1c1f186b4fd64ca90cd6702e4a5c010734d5ab05ae414515dde0284201f1e5cfbd535079427c4875455338b0f103ee7e419006e5e6b291719d43f7b7cd2a9d284be8b02c395db3ff169bf77ee55dd214872ee87c7cd6879c909ca9e473621085f0ab616db247c94b51a738edda09e17060e02952b656cfac5c809ab97dd45912630b8ff6c659945337ed70e0ad7aacd23b664107310b0b12e47cb00249d30bebe20690558f6e112f627ab293bd75ebd4627fe3c55f4c9e6e2fad9c63af74aad22cae1debf8fd68fa0c678fe69632430f501194da25330f23ac63adcb795fe4f4d51d0ffd689f1613c0721bc3c23bb7a3bd53eb7224ce9022ca6d44f489892ce10fcf4fd526c3d53532ec7e90d2ae88f7ed7b43eadcacc6ec84a87bd345cfd30adb7974e666915e7569320704e3a0450dd7595a9ff495879867a1b4b290317a9ccaf7b49c6e22df96e91a87c62f31b8e3f96350e74ae342e400a7e407af4e03b4a4c878061abd8d0502648ff73db626a6fc40919d645e257a35bbdcb87dc7b8575fe77cccd29376fced78511811b630e08651fafd33ff680b9e9ac6a57bb3bd01db85d7de6d1bc9023454080a6da7b15fb51150077e6d1d34aae8597f27aecae8adde0f3b97ee40b9fa4dbda9442027f7ab326303a2ac541a4eee06f69878358a1044eef014d5582ca34a0802d504e6f221ee4559045b4bd2a19c4525b608428f132980d10d46dc84ba0b774ad1048c9dafd3f932a9a0f1a65f421c00a121f64fc59b670f6fb9829d375f8308869a8d824ee9f169a3f082fb6076d456cdbe60171e425251d412dcff22383a523026f0a613ab9e12dd074d5d9b2e8c84c0c8f170f0fd28a25be05bfacfdee135d24234ed8ff68972a27aa0046a90b2f266a49c97e5488cf1080acfb6852c773b00e2ed5b305dd620a5e27ec3a1acdaab66422420836f8686e8d4d59df802ede1afc9403a43a402a9ea0222831701b234c026cc0030a02d1d07ce5c06211986cbcac0190425ad300d990ad8ef9b43d4581eba26275d69d4608b0ce2588109de0f18c782451e5abe0bf130cc1b35364dfbb74d662d1baf8840c490f23591c3fdaf4f04f66e0a2d1da2fdc3926c0da3e6bb6dea547b5c298a1eea82394e946efadfa31ce788fb909853aa804b414577587c51c025023afdf3b41c574fe11f8b2946520b734adef2727e5b6361784f0cba5634f0f02a0dff362a53344b0c9ac284d781ba5a2d08e760ac3507333dda592dd0e7e64d2b59bfb9cf3e1a97040b9569f74c0b7edf258bc7b02f732cff9cd8c1c2079e8fe03b185409c6e0adff87f8335780697a636ba4b525b4dbcedbeb08d8e3707fe2c92a022c81ade33fb0c139eefafafc3504cca6a469e2170f669343f33f263515773f869d77495707ae2c4bbcd5c385816ff16a99e5584c7ca08757e26cd1f46923e4ac44ae13a5563996647237781c8393232b7b3a518d77926d80ce179ff68525a735105aea784ac56e66a23d2104497345fcc2edef23014b0ce84c55162e2959271522cbdd4360d76c9c722692b3f67c4ecd6a1d778fecf10afe3f4f35b99bb0c2a1c8c8faa3e95aec8d865fe01eecae863773995978fb0805320b319c351cf7f91031d1cee90e4e0ca36792693aa9a26d6fe4888fcf036b4b9ff1c106b3044b7b2fe2a6351d452800e85a94722684ebe9964d16d6100543bd538b2b9b480241d006e0fdec8c840086e46ec5607f58d5dc547116616ea2bc4504d439def87aa216fd58cd89fb271c1701176bdb62a679ebbe58f8ddb091d5371c4ae5ed34c9f99d4366f234ea65556a10697d9bc9f3595249009919b327f3e284aa4eb5f83e36dc7bdc0b3dd272a16856d49f4216a9e05d2aaec17365497b6a5a3d765e9465e3a1a4d8da449fdc524d42f1aa36973ac547c7003c8a2da44749c13fcda908e4722e7e88fcac982ceffff3b223416b958a2ca86807f716e5689aa31639e77946d9377044237a6d182517ee2fa4a1d04a2185b0b48164c4de6e52e3e1bbf3c05eb99203f8e862ac94d27ea7a232a7e6a86514a000f7bb4b01e7021e19b62be79ab9b1a4bae0e3627008b915657d4e2bddd87f07ed33de19a39a34ebfe6f09a07b4caa43a7380ae9d13e5de041ba136a0661234b483cce2be45e4ee0cf435a1d68949d4e67140fe90b3b08c63b319f1e69e4cc53819be18f6560a9030da414efd5419f545dc310092fe09c98edb553f551f3c046c0482416ccdd6d6de4b397aa4e0fc692d88cf5f80a76f3df39bfb203ed98922b840fefc77935f326bf692b341143db4ebf8d14a85917a73829f153203400a513798c447211f94859b2625e58d180fd4418c80ce64f58f42fd5598acbbccad2648834561c6904384b6215d8aceae3772c1851d46464bcb312c7a96ee332e2cd5aecc6921cbdaf7242834252ad106b43ba13d2143053831c3a4267e50b290a051db3e70f5e2228121ca4ae3019ab0c884c9e484876df7225df15d7c35a7e45bf1a8034d98503e9c235dd9dc7e53dc474d6cf070ce37e9821f0f9b28ed557852c520ad9c005802deabe07b9a438d70e8b5b6ca15728816a3cefc19245976c5a772028aa4cb912870342ba0b61f2e71c2221d4d5f56d8953ae88aea6fa5203e7578882551242675b567bbafcbbba14c342028e7517a3ce2bf523a5cf7236a78dcfc2530abbf19b5d6ab66b75be3f087172033da51f91201cba15c825fe90a24a558f06c0175596326debb37dc86243cc59107e117f7636787155a8baa883f2c8371409590a0c9269ac906cef1ca13c126c6d7cb1c568160f6ca4b2084c2702d425fb4d9ad25c53c0ae47964c7309ebb0827dfa3b8ec7bf1836ab889a500714cc8cba0fc903d17d65e04d6a3fa37105126c7547b50753e8a12360335c02805a3f218a1bf173f7fdb0792daef7923781eadf8d8fe501225500b7264045dafed40327ee34c3321d0b96f8a463536283fab12f0041584093083a184c5766050f10a1a7c4d5a8b3928a1da656310ae6310bca76baf69c44503de2c8477626c63819549c88dee87186a1cc219b1e1e92fc6b8975a877867c08a42b23730f30a39699d38c4905a5f1b4914dae7627c8612f716ac351a12f6e0b90a5d91b0d56649c84aab77c7d0bd0510c1620af85493cac08fbd10c648d027777d5f15291f19d47be3068519dc0ac44d97058377186fbb4bde273cbf2d71b892c24ac22060c5d0259c4a2423548f11d7759e0dd65cd9a806c71732180898e2380482f969a6bab10d6b9550aadcf0ccc0819cf63e355ad99114b3713972d33e3ac687ebf904246f2d2f1cf0d62b869da2f0f949ebe8ace2029d56f3e3588495c3d2871609071405fe6bc2eb95048a083ea34d7004b3e1507711b6420db4f3ac9d993c4c51fe7bbfd616df4b5c3a20077fb01750f1f27c3274b2c0b761bafb8f2cbe5a0c88a0c05e3d9215327cf40fc8162be892bc30f3697bdd64d1cb027e4764a2b142b66b1296d43996a50f983b69578049c221963d4c1ad40c738d32deb8eea65139f145baa6fd7d035d3fc8d15ea9f0ec709b133c931ba1cb547fc3b938f1b911612757b6ebde6fe340397ed8c4d382c87636327528e520e6fe206143a36b9a5bf5279ea942da146b43ee079214ec192638f9c3d54886f74a7a08859edbf8f51ca442175b603db7939e67009412f05760c3cf627072830829f1c65de89f3039d48542b8bc5224dd8b74047c37b438f3f9d714afdea739386aef912f1729ae6462759381f0c8c33ad8a460b36bbb40451932295c0d0ab6d86cd763878c10b8490af7029df2707fd8f87a0f982c3d02d4467134d86022a4ee5679b1550ccaa1a20795d7a567b2ecbc21ad680925ebf9664bc8af393fd163af23ac60b3e9870ba35a9b70168af4ce330ad709bf4b17f7a9237f6d141bd28f009a7d649195286d686c6fd059a01bdfe471fe24e3b2092fe172925e2db138c1d3ac02cc898107e8ee1cd47310a9a2284018d541f45d87c6d9c476b3f0b12d9cc4a3f175b7697822178f817d6ada97cd1f5d46f83a63a7a2dec8d9b8ba1e8109c50d857d288648d4b6117709a0ca3ab32af0de5058c24b40931857fa7b2be9ad5690c37b70e736a23ff484e7c883e0dd352907235bf78bf3b51540f0bfa9325443e8a0c3b1227e892e476389cd8975a9ad90310c3f10df4a9cd8af6935e2207eaa21700394196d01e6e254d99c2d392ef59f6689de016f625a64e948b6ed5425edda128ce83d98dadbe0e9f5976c4e9beda4416bcb7ea74bf5772e104471d4c0a0f9fe2234b8bfc0b49de76574443a4a976fa123b3e5fb7d71a35852ec3fe2a52bf40c01edd9c584881911dc1a832e2eda34aca054a8c62e8267671fecd6287bd223d2750d424c2a211d7dc3a103f2959088f848401fc33efb429e5494813b298d53e2483161e3e8c0b71bff40436c9ff8355bbeeca85f2a0e2f2d117ce25651e10f44fbae02f6375f1f7511f9d1fb640b9fc8c81c55cb56d00a45dc3ff2891e72158065805b7af73c96e8480ed4e70e340427c20801eda68bbcf50cbd5a42cdaa02356c0adaa482e05107c007eb195c6cedcff2cbf4238730f157ce9798bc620b560a61d0d974d2003169dfe1b7aa299df501a8ef5604e3acb443a13bef486dfb67f6f61bf30e117807dc9861a4e2f4c3b9cfed7a4e825cfb2b5892b6290806ba021ab9daec389567b83146fd7f579b8d84a68f01b6e7c4a2a4fc994653f07e6b536c0708a5ff320bbc8e23784e6c44d483b49a41f664d1cffdb49280f3708f9a59a1977fb2cea427bbf9555a6ab103af1aa1a94f8d7003de3b65404de68a479e9d4e0667e810fd4004802b312555cec8d1f8f3a73dc79356e6beb9e7c91b077baa07eadf17824eb7ff490acef0899c79568ba4d41a193083793221855591b206475e1b5d8ff0830e68a42dd3f53db1e0008a284a8d5e96e9a3ac03cb52182683f504e08457d2b0cc613f0c6efeb158d7cfa819547baf6b34882bc6aee7cb7365b44eaaed08208567e9261aa05ee27a370de7e6078010c876b7df2b1e07ad1f595ee2901b3a612dbece4a5ceb7532891be149b751b2c2ec11392be2c1c4416ac6cb1581c5648d12416f85d79609d0cacafb6ae0a97ce22d4469d169e4b182025648595544908fc3949dec06896d62ab49ad7e0336bd99f2d1f8790e83efe7d1a2da9c1e180a83276700d37d2b93e9d1a2797c18b9f5145ceec0d8d42a792031c182f33bf5ac562f881ec075c6dd3fe3e7723dcd7f121cfa6a5bf5bfa520921cc45cc2c6558c6d8693b0006fbefa9dfc05af042660dbfe0fe9650f1f878f4dcf4a815d74f3570785e70a342426bea8fab1576006d3acded4af1d2ec116dd1a5688aaa8a1e3b1f2094b4179e7ca38a29e03c4e9cd97c101cd49ef245ba851091dbf4aaa92cc09b064a6fe9577d7f3fc432a73a40458b8350915a336110f29680f4bc5ed519384426297db25aad63c64eea887b93e6ac0cca1527eff1e522054f2eba12945dcb1fae7143b4fb573a431a9060370980cdcf763b5bca9779d2e50c38dae89c4b4db009b0d98ed2e15cbbe695bd7aafec7bd41f214258e729a3750732d56eaaeff4727d7d9d430b654b21a29c9c1a86523580a81b2d62b1a08592314f3bc97b6c485ce2f138aac53ac9f902f5947e58c1cfc3ddac5dffce8a9c0ceb578908d1cfd76ba9ed57d10ddf96d07c05f0c103829628dd3295e5e161548801a480ae78f62fc2f95c2f5e3f032b868928d2202b12a9ed408864bb580c3a2b2e0ada1da37c7cddada7001871a48979e966f24c26da617bc9b2749981cb756b98e766e7421a9c10b2e1a146e058d59fa7550fe1c7b228f8734c2f11f2a28070ccaf111946d630e3961058d524d03947800f37d23413f3a68089b4b80e295379933e8855a03e2536798dfbf5384a75a168e000553802d460f118e3430db7e4d201c4d56b3dabf0ccccb09e11106b12f258bfa210b11126398a48b05a397d715bb4589b63a5154afebf4ba3eee13b4c9ebba0a9d472998c0e30e8868ee3c66286e94af3df9113fb0bebff0fd6b2227d98c493b3055428f78a8905c298a020037991476d29c987316f6fc9692fe4d016dbcfaf96b8616f3cef05395a57b500081b42c9afa04b2b58184e339831699ae69907234042f880f3b5ac921fb70556228936631273e23e6010ec8755ed8be7d0a2dd1ad4d561baacb0c248f07915339d44d968d816b69d974aee51d5ab0c8142a258cacfeaeda7395a4b6780e8ac1f3bb7351923aa11427346301f8b51f26ca26c5f70a85ff8234098eac17014eaa75072a7c0cd4be4692e51ae4a4df45d7118fb659a43116ed4a8ace0727531f4d89f0931985ab5f92b4725347107c36d9931c0755b9a645590ae7c772ecf682bf5fe9bc8af1534f373fa0fbd43be107401d813ba6e3fd8683b4278360cd9c58eae05a30c73688c4d00a572f7c48822c3958e1f24f86340810ba0dacf6240be4edb0d9de712ef002892c09a5d53d5848f4d644d6406f7bc4eab342c727cad233073e1bb445fcf57207adbf921594bb40f5b650ebf6e28171079c8f67f53b6e1f1464691c983ad01268b8a122b523db82ced2db50e1427885eca64fd043b05939fc4dc42c850b8659e2f8820b09d30576f5deddabf8f04320e99cf3d0d7d76170fbd80d89c41956af3d01742d1b96ddc2408516c7da6379988c961415c3cb5b3a4f18257d6bd9f78983d587a22b571d1bf28d6135a40c7f450efdec8f723f1bd269f25334d2846c78b9d0d7a0fcd89a4491c11da949f8fa25c31ec854c6e58ccee99cebf392ad55a8db5298ee3fdb48d7ce2c3dd79d9e6cf6d3c5062feb5dc345ec445e964098e98eea2d6b73ea84d74d5ceb2d1c7528f3d781d23ac39bc0035832beea25a305728e0981309c8d2e80b9fe3e1cdb0e2c93838afbd74e2f622681c1f3547df891ce08940758aa087accb8d01291062ac099dd45e6a8d8c5c98ef158bed34df1e5d8749ee5cb1f0a1a6f33a13ddc20f849a6ec97f0a1abe680bdba22ddea919f8ad7e2938861f0b6603f488a01c2456063b8b88bed35d2d91385d73516d616178944c6085739db9b9882c70f69a47981b80df720d6e827d021aa0b37337207784676786832afc119e9ba78ba0ea0ab8158b6bb99a06d7e5cd5faaebfdb32bb8e1dc0227eb7480ba4b7de9466c36ac664d496dd00ead8326ce5cdd363121647cb3060d2ce3c5971e21e4fe044aa3521b3368869f0148dafcd5fc7ccdb3c7714cbb02cfa3d32dff30dc0944064b3eeca25acea3133afe71913f0ddc79fcc2242086db7e44ed180bfdfc4137b33d7588c741ff66d8d8b859278b13b4666fe0e42ada00cdb47cf2a60003af029fdbfe3ea90d6f5caa938c4cddc1f87ffec6c71a83f1a2eaacbdfe4137b9e91aeab506b647e3e34c628219aa60ffb7c4602b6d7b0e619be8cfc7d18cf7034ddab0c12c566eb9ca2444c8147498ccd8bc9c6170371910f0d2b9b047157a8d2ac835894f332687ea79c77442f6e4069770abd8faeb7484c4950403711699c96943b0f0c54049fcd526a4a20337a50c9d36ceab620e81c9c62ba9ed26f42e923b84805b161169266408eb53e421fbb4bcc965c8d950139a9cb848479b056a403bafc80b6bb1433860c80f46a5ede415eb4efda32af3d2af78994ecb52e4ca143b0fd7f90d88354a74082434721743a6cbbee476f47209ad495b686c1e9dc982f20466ae35719f56952d700fa5824e66f115847d96a84bb6fa1c7ce01267e8261881df283ec18234da04c564af44c4e5f0ffacafdd11cbb77d9107dd7ea3b71c0764f9b8422e9b961ee098eac7b9394a39c3fb0496a4432c0d41bcfa9d1f9db33f4803e0b4291751e0d54f643b39d3087e0b03612f33cf026b63844757a2dfe8e8b8416df163a3e235d78d97551804ed1b3402da79628e201fb8fcbf37f89e67b83720508c87cd1dca7e18a3dcdcca77c39e1335ac893aeca75ec32430ea66947d2b8f33a8a83f42f054d68c69ef0fb97175f5e9fa021cac2d26fc55041844b36569802066799c28f9eda66ad327caf3afca7f36b374c89107e804d73a526215e336407093cbddd049b20af61e87cf4de8db012e715afc64b789458f5ced4eeac13a4843901a5f307374cd4c65715d3966426e22ab9cba052d21bf7d9e3394899390800674676e57543055ecf39bbaa26f23b64698d1c6ce8b6f8b8f4e49ebd2356b0d73796be5e2b3f8f94c636efe05f8610c938fea898e00d8de89f684950e5d8e111660c9a34e64f294a8354c79300234b8851a66d3421bb30cc7fff679ee09a1fb193a14191f5469f4c4f2e8e44a24712ef49b1d62d5ddad019bcbc41debbdd2adb6d76ae3388edb7c5edc4ca735ff8e3ad420a81afc1735dca4137fb686bc46063246625ee858f100c1b061af0a9b42e5f514f1f4f5ac57716d035d09bd3fb36441cc45f2063b9823dfeb5c1104d1e8018455aec96ad637f3268f3215a3588c04784d4ef9c62f2c15aabf04c003096115bdc4e6b0f8f52359a2c80064cc2fcb2addda6da3cd74609fa6ff203bbd83f6de18370896db19f1856f45f5ad38222c1f26833432403110cd9e87b1bd40e15c104e7085be3611e9b22af1b4b44264f55f18b9b4fc99062c9acf7ef9fd8d32e81b04c1adb8e6c8856b974cc58ca8849c663c8dd77f8dbe3dba21019bf93ce798937c1fd8cbf4b83a907cc4aaff5eab5b8be97da735adcf8f336d58933bd64666aa10ce053e3b1351f8d9db19c8f579b43ce03afa1bfc8257ecabe779963189bd0b1af410e1bb3be64785d70c96c9c243f3f1a0a3202a7d1a9950f374ec356ae08950b92355ecc1790edc23a9376367fb75ddbff9dc5525da430b404927698c70b4b345e363a4727aac8ba398d15e6b011ae2e9b0021a7059654cb1731d067d68f811b6fa3247fe1e96205fb7949abe558e2338060f0073a3d3f6836934401d020843c88ef238b4d88d5a5c866debf9b87a9e8e79639ee38025871d1470c032b98e915fcbc67055a096faa52a7bc021116e6d5ab0592c3731e094cfa2873e955d609fd769d15d00360242e0ce60e18ee76559834a39abb0e45ed56607c853306b1c5956a6a48cb689c86cfe27e706b404a619936be8eb590db66082d45b157c138e2425c5cd7edabdf800fcf94c8591708b7900e680a0a4e9a14ed42bbcad7018ccb7bd0229a258234e3dd9e846346dcac58e8781ccf5fe02b45ed1faafce4d1d442946748dc8d1f4236ffd1966ec16f588753f383fc57cfbd575b1a98f184f43d66c35a98fae12b3324ddad9909eafaf4952b4042037a0609376a0164100ccec77f44360135090617547e331059530c939f59df054c4f7e69486939a41b26a744f6a114241a44576b2621b043b97ed71181493d58920b6d22f35750f0dbb28b709aad6603b19e51d5e90a8b1cb51fd5c14958ac9ee4e1ac1ae7ea51d9545da7f4ecac3e7dbcd4534538636c8877a252e10693d10a7d4f4e870ce49abdd70267b55b44c5a94882ccd83ff7f619c87670a35824ccb8170a21b8f522c9bd10600070c8e60b369edf48983aa7a20c94d1c84cdf849abb07d2ac774340889652a7fa93f10fa3915b8b5d87a09e7f21fdb6a44254116db6845fe72263bb3e5b32a3f7124584295656a64309272b4f96026be9021bbfb85383f2ea6ba9ea62bc29d90bbed57b6e0263787a380fc83cfe95549e275da2e49afcba1e22a425094e4f2829e639ffb0334589089c539f14c0d844a34672b41ca24b2a47b903e5d9dd55e7800a981f0f56084e80586e022e9a4e67962ce1095c9c7888efae508e597a35daf101883829709393bf90bf46c30a1009de2e4d8fb7337271a280f71833dcd90ba56786233e2c3b2406e848fdbd34bac20592160e2af215318b28dfd4f331c6dfac51d24f8a8bd9b1bcd8298179b8f0707386839d314b458b0210f7192f0396932d236d44395b089619fae55ba8ee17199eeea8c00e429eb83221081e933bc974d59544a4a6964c225b75ac7a00c3b5614dfffb84adbb8465a1631c2f015b8bb8f1a2c506580a4d5235ed15fc6351182686afc22d1635c45fa06c113e60e3d21a42aee15c4cb5fa8e0a7d54a9ad9bd903cbd8b21744d7b1ccd22800209216468a8ab3deabe36c5614d5358401268ae084414528a5761fbb02f0eb780202f4fff22ca9962e8a5fc2e98626a7c3dd24fcc6af35e07830f0cefd6c83f215512a43a0600a095e24d7f49639a38ab97124ca14e18734f1c8cc9627c91e4066dc1ad0a5c982841adaa022eec294296703401a3ef2844e3f1da98a47179eb2a1cd1a0abe8e55e72310b87b842249081d1ddfe285dcd535756546e80e4eea289291a89f7287dff283b85c03b1af593387d70b5226b4f5cf67b32d96f547165a85214266554a8e29f813e69b92a62fb50677a13ebc90e306ec37ce0cad6dc840ab6039adaf0d102b0fd3e996c1db4859a381a803fd3b559d784ccd1a874f3c26001570d67b20c6b0f29dd9d73decc867c9605a3e0522f5bca98674f08ac6d8c51e9684ba962d17158aff6258f492e2fc9c8b4e63335c8bfee73cb6061769e7ff58de2d9f4230e9280a4e413334adccd90e232f30e050c5fb14983831e56d1a986d91b40a818118ecd6859ad055194d32edecbab20949e71f3429ed8f19040170ea9606d729155bc3ef1ef0c930a4f22ac1914d5aab6db19cfc33413f5f3fb7a4355455440ae800f07b1996c0fd2e733a3c1cd311288c17e041cb7b7d4c7e0a688091960ed722e2bf5360269b3da2bd3c1e5002c961cbd0c857c4b073b4e5d81f9e0776957e18343df868369465a18db26e8dbb88b34489e9943db5643d1641bfbf736c5414db186eeee88523d01c97f062c1c001128083b67a268c71825f9005a2726cd44a28d664e972508b3f82c422b81340e89c80083e28e1d1b8062cee477178780e7957700cd2b5ed7d414d4a942588850a4b2fafec5e1305f89c375ea485e27f0e4cbeb68ecc244257999f84a06c77971e1a5c0eb10ed63777123365b7583f15a5b1fda6c12418e3d588f143804e98c12b157ecd431afc5ebf16bc3453a551983de9306fea8d033dccae7af2cb622efa7635df0ed1b1b9c8073073f11f2e68ca6032dd30a0b2e1f28b46c8e06d0cf7de943a96d24cc2d7a3fd732a28d6e394e20145b19c5459e2a38ab33f81114fbb0cae78269ef0345c4f8ab713fd8f1138e659e59ae061c48d6ef8ae0c8d3a33d468706303006e7c89c9f2361a3b1ff6bbe8b6ab57cac7ef633c2a779726280c9ef1572a7a3fc0660176a85c3d32bb5408ac7f22adf743cfad62b365260f35d2d78d358f9dfbeb069e44f05f5bb52c8360466bcc989f810b071e23ac7ea248cc8f6af1cd31925c3dc02028ca912cc0a4f4d380a6a1e42129ea9ec32acff5a1a81091414204492d519e9c775f7832f200563353838c342e58e0340f3de74a3006421bffa8b65f41900b5f73df19b9c79df9f8a5c725734e3168d5805eea963b6e5373aa09405e995d7734a3c06cd79676d92e8191b1a162b66a9cc5e165e70887d7ae60501f5700452490a27016a6d453632981eb43dea08c2b8fa2a0ab86672c7739bd89753bb147c6ee05918221ed5bf0335191103abe0d0c89603aa15cdb5b6c406fd865dc7c4d2d11b98542a0cfd1b0ebab400d24e83e858cb0489f192579e306c7cc9ca05dfd64e2b8b1048b3d9d1b48489fa6113e687fc12d4b2ce0c5185febc55444c080ef27253a0068d59d8026a69e42e658b69aaf739208af5ceb9dc40d7fa9ab86a6cdb2b90a5bf1c7507fba4ce7d0c6ef8f39304cac2ea1242f98d820b8c32fa55bca27172b10612da1c32c716e4164b8e974bf41709b44db43d48f58caa1b08ea5df9194a1c7d4b98249414c5d17477964976cf97e80ee07f2451ba16e9d95e919a973aaa7d465c4af61823a255e743d13960e8329106e11338f1eda62bb4c4f58558332d2a0f82ce4fd162896817c4209116993473ba69bb5c875a383f82f3f15c758736867484869f6ed82fdb27729d6b7493b81a4ebcdc4fee3f452b5b6700259767f51319656967f5881949c6b123659da583497c014acccdf4628356085fbba3552d6a70e95f78fb122d1c534c16e83c82eae7dfd74e89ae8a6ef216315840cc46c8bb8a4a8a6cc6c8ba083d780dc3ffdf83c40a0d478e8e070b9184e2d061eb600273e5dd3c6f0bbabaad397104e4dc24461724430580416a252b8ecc912449c9aaca34a0c144d800de442caf24ff6e6bb5e330274bb420dcee0d23aa9581323fea7c6949d120dbacb902752d7924134c9be40fc602be986e54acebf6483d1c9372d4d729d02c9b643ef5ed1da27132cf2778b8485b09571da7642c64fc176c20afa2e3f6d0ab54cc161ba81b4e48837f0f2cccf17210fbce27d5dfbb7547aab56e0ebcdc46f60f6358ac44ce68b69416c46cdafe55f8b7cbdc6b9a7ae0f3bf413c57740075cd81dac8ab242d3638595bf31703e7c12df9d18dedaa50ef2832583bcd6a8ddd0dfb04f994577377a886d84e26fc217be950d7571060aac903ebb91a3d4a8a76c934340f7e953f5a336ab2c388e1c0d74bea71dd945927350f04d69682851c5b8d98ec1a0f2ce23b2567f878cf4959dd6e66461bae324ee67204ef0095a63ec4af32a5298a91698128f7fce043af6c1a9a13d9f0467e54d676c26c93490a86d1a350b8425459fb2264197fadb5fcbfe832d739969c211ec18a7fbe4ccb5e01ad2ce97bb26d0809a3ee6d0e2b07d24f6f7d311babfd05ff5fb54d17848c9a8e100b2b5f8fb119d0f98561bb68e53bd440ff0af1793b0bcc013e37219dd617df3160e0f5120ca8b47f806c165362b2dde6ec745be20d81838950af92ab1e0c551c964b2f24c41544edc72cb157b04cd6612dbece8a423122e8dc4087f1f506323743e24c48a8074ef61768f84a244c0477cc8357ed331ef14b93d094219a27a01606c92dee8b4858c2e94aa552da1fa0cdd7c60085eb183ba93e69ac0eaa1e5252dd720b8771b31bfc8f8e60182424f9001be0031406dfb77dc1e564e54dd9ebc03de41fc00d392df0b38098f70156b9bfe0468e5b550be6ce20be039b3ce089e86e6eb7de0ea0c0055d2616e54f4b4ef4b8f3324a726fd3241e3a0669b535c1c790502e684ca0b74d20b67bb97bce548ba17c59ce34e5c4703471a0e1134caf08ff435102ff511f1452fb88f6ec7970273a5fa4d00ae86264ce0cbb110dc4012b38829a64442bf041679c2662d466c84dfd11b075d7fa00f25e4c26d47af34e518849a4bafa24cfc9ccb4282c00b1c8b17246abc0250089367d87d4848f4a6dd02c55d0200ae687d249ec12b92c28c25f662800f2e98a174918f82c4099a73002c0670ca82cea87d6cfbd83f31ca2929976d24f8b76c9a30feba69e98649c71e92d9a9bc26a1fe00b92eb5b3678a34865407836371eac2acdb95c01797999b52f41a04aa4d03a4dce48218a5876725106feae704800af3ac5ac1a8c560b257bacfd6f48874ac1589139c72843e56f9a9a2e05a36518902420cc2e8b3fd8392166290604774f9262c86a97f334bbd19a69f004b9de235f8509b38da70df740b3309d18c9d61015c755431586de144aefcdf61c112332fbf57ed9f1440a313ab0d0d203dfa3d6e9aab6302b4b30bb193a3a81dc507a8f8d8d5afa6d93ec9bb9a9206a5264a1e6829d76795966da7c52207b557814ec44fb7ef9402556e00dd7e8b77e912a91e9b4f81d58c2d8f92fce7137d14c7e5378a87137fd6476305a5bfe706026464767d3c95e13c90f12a213bb6df4f24f4ae0b86d340400ec579df32649beda57eca8f51ea1cdebef146441385734ec261b248ccd34e9dcf31d7ecaa00d232b20c32109feddad2b9f8a44a4edeb4592cea91fad4354880b44f0f7ce331926ea901034dd14dc4aa4d0249e9cfad04c1b967fc69e98ee91ea3e0b9f579b659ecb17f0bad0e86a4b43674f53078c635bd95ba867eba559e8701e5197777fe700f763e9e6c872c69ed277ea3273f62a44d6eeaa34ec59deb760ec1d3f87274eae7e9dd5166b7ba5e0bb3ec55e60e7e1b1badb3a55b85e75c7968aaa9074e18f1974ccbebb7b9878606f58f6b768c297dbf43c81e1b9a79566cea520ccf1643aa7fdd3c36e8008f7a4cd3ffb2713590d86a01db54c4a64303225bb16a3f112a079c6923573a0cebb6cdacd9518e050d4e0e63501f6a5e7b1ff3f1fa5132e28d7a86952fdf0cd08f567b484be74daa7def0b3877cb178657f88a8ebe6f7983580ca78f16a566f3bf63b1ae1f2f91feb74cc281f63fd8a251762846f9650a8b6a6bae4367e657b05763f975de6cfffb9f2f446052e97d9750b77b1b51006a7398647f5032db8bee244831731ee37ef923b6b4780771bb43bfffe46ddd02497929281e51fa7d6f7a81aa5c436d571d8c55d77cd5145b140c54f9bb64f1c57bd3b07b4316afea79cca3e8c93b4b88365a4fc1f7ce8ad25de48ef40d37dcb0a7e90eae4b3744593090e3c6df0fa30d6d7bdf8eadc3fca6fd2b1819db3d18384c3c19f18c54b8c58bf3f09b631a32da10fd1bee1cc697f84752d53c2847a6d6d6372a90243de0507c823266b1b19170dbe3a5689f1119b0ccb7f2b5a4cb94a9c94bc44cee28ee8c821ff042b623d38b9bd59f8232a839657a2befb2696e0a0ef29806a4fff8002e04d3080d7da522603ce48a281c8cc37ce0d2e6099cbcec55023d16a2d11491735faf87d4c17faaa1f57a6a1d640d5363160b9ac2bd85e40707fe5668e5ba35dc7caa61a33ffbb2b07bb8061ab1c58fcac48ae4e9e31bdf1f54b364826a4fcebaa18c18c5dac9143c27477e393b833c6734cecce468dedc3b37e58d225041b69282a2686bd32a4fd29b629f59a52182f30adec4a552e81e26eef97c6cc140b9b93e6c1b6ad604de586cb66bf450050b4e66fac9ca101139f319a191d1e141049bfb2cebb450fff47630eef3321e3f4a9c4af56ba09f14bc0bd6a4c47e10f3c767f7d5d10e4287302ae1c1a2fd8ba022cd4ab2c927185498b02897e81f1c9737039b7db96cd411e481a4f32fb9a1ef35e157c20fec25d11785f004f189977e255a51e314946806da863d7d0b266b6353b5b4c601047f5e738a47f6572deecbcd964534ba1450e8e003b98453072d0901b9605f93d208ed6252841950c4f92f6e3c4b168542b12c13055341fafdcabd2618b64dfeb72dc78760b8751322384f9ab327f13ba7bcbc0153a9289482db50157814f853703e63ca342da2968f3001f74a5bf7486911d636ebc8fb73a976e1474157a0a1ae5edbc0096fc0168102c6fd942b5892f8e3eab07a1a91280cf3ca39fe4b0d5ac52b35accb0f3d33421f59e089fab9ddd5532a65387f3ff840234bde1b60c491f32d84ed4072e34fc1a0ac3821300317bdffa394d5061bf7b4db922d068d76686778c9c153601dbf0839c46166931e173ad2fd0adaad64d7b96f144ba989f75f976235abc6a8fea1b4fe68625bf4302eb20e25c0b5485334935a462c9f2cb614569b9ad17223d29b7b65e3beebffc9f7a0cdde86cf36c96a6038dbd9261a3a5c5bde54ee320ee35df3e9dace6576a64ed2df3ba2cd2c4075f2663c7e470e2020a4418f4523cc112867bda7c821539c4bd3128746a434dedd3661a1065d0c9e25fa89a7a602b4af9af96b53aaf282e570a08314bef3a27362027b9a38933468cc47e6ee7e53d0398767df534d1733028aaa60706b1f9a3b6f93afcdef7482870a9fda22bc47f6f790b15b3f25a62862657b39c70059aee7487c463f5d1124362c5eafcf4e772556befbeecd0071a7bd3b79e2f1ae9a4a5749c5dff6d6bb3af66e32752c8f2384102fe7e6dc20234442dbcd831b4ba86dec34d06e48d2319312d790b1247bce2f4f91bf06bf7cdf9b7376e21a21276a505e97c1f333d99cd07a4a783d2151b544c4e90f04cd9e047410a8a9b05a68b4853754603289f1859d68f36b47f040d458eb5baca63c9588000956483f8920fa09d479824a0fb1303c7442afda9ccc15b2d37dc7b21b31821c2c050b139ea5789af4565222f4b41ba8701da51242e39d5d88e233b830c3834d1a19b34b20cf107a021014ceb03c63b42230b5463101d64039cb5c8498a634ffc37959f208b0065ae4c69aa257ab8fc51f254054826a8b231087a47a5859b8b10e9db81a28264e118c1a0366e09715d3b306c315f50f9dbdcbb75cf8f20a69be39bf3de7f7dd09a04bc1a06a72c8487cfb1f2495765d9f300238c072b786620a251620c056df492b8d30d7c697f1bf11fcff2c60ceeaace1bd9d9b3b9220ce74ca788ceb1f1bbf8b49151b1ad098a2b9725b77c7d97b70175d157ce04cef56d300d2323a2f013b3cf3f286e2e30fa9861339401f4bea1fc3e2ce2a906da63e16ab3a771789335db2168493bb3a661ace86f4a325fbeb6f8a2985abd50cfc439ea1951051755224be8addc4b391087f9b2d2bdd90fefe63f8ea3a3748fb4d033ac741e80c00c4086cd9fb4fb162496cc39f1f9eab967a411e4df91f95b1344c9703f4a9a5a1b0fd8f4140b9796a7b1d30e6347a3ff84b32ba40b0ef3b06c3ea2ee1f436fc7607b1e32ab0f641dbdefded14fa3121be0c24f816c560e0c869fe03ea852243f0e41f1801085c9e7ca4fba21145663582bd1366d13c94aa60a4b3a91fe6bf8c35539fb6ce7bf2bae45a18d40a69710b581f80234e42200a6c48598ba5adef8b2b5019abe6f54f0371f42bdfe713bdc3f5fb0e5b04e3fd3cbfc27dd3abce00470ed7e85d3ee88ccbc2834762db9492ec653b0ce0200829f30fe17c530843c8baafb71d3277566960a42fe12a4af46b07ce567bb9676942727b58b3bf6d50b682da657d1e6b0c2d0e60a87dfa9c54c9609bde9c12f80bf0054675926e36334b325b43c3278e904a635c69c906ef7644f88b4e1fb8d71530b1fab4169bd3ddcb18a760d68ba4d53004034ff9d65b17dedbb0ae41d0e361af521e23d002c8a5461b4b055f627f9edf46691c644f406fe9fa384deec3c4e25b39f2c8cd1067c8995cb49f17111cc13c5f941e852044359242f141096a6cb457949bf4fe39a01c6033fecb899d6edb888dca93c745ea2b8e794a0404978e23b0f2007df433dd2e08045385a097987ee247ffac35ab803b84ce60c0f0451636ed9a117a1cb63e801e60055624e577cc3134fb20605eb2330d75c59c03229f298cff9063ec555b94f443f8e85d3aedaf701265059e7b79b0f5da3e887d700e7a6c526f6e6e13fb137d4bb3715a6d35199c166e8b54b0d35b35d4d31ab709802ef5c9fce1f8468678383188322d3fa0b653b9cc92b40a6615294b8e691503c1eb978f22f6078fc74971dc42096cd69ce91cb63a05d474132bf84a4fb8a25544468433dc4c40da737c7f6c7887e044f49030f3a1f331eee233adb0275e68eb4d04e9381b25ef4a306234464c152ab1f5f2943b3b3ff9907057c216dfdb90fe5217160bd416db5d07306e251227adcd2a55211d4e46899add495c144081d597adfbc6903bb2d37665fe4228d0ba046805a7b91a268fed4890b13e3617bada7bc5e7b1243d58ee3f8c30969469efe387a9a0c6f0518c08d5434fca2242d45dff0e8ae06e3bc86088f0906f5ba64bfa8a97d856c5e4d9c6673242d0090de394cbcd96383b228a38da131cfedcc260bce6fa0568176c79667e6bd06e05674a57b5df1f326421a44677c03abe9e6f699fb277476b82edc23598e72016bd45ff79395b03b90dc2c59883c2e9842d3bdf87d261503f2f6d6a02f34105206749fd2694e30b46832bdac18f99807b211551053d63217f17904ee1ee1ddfd3b2092fa1fc5d5eb00be060b1e1d5f5ef620158554ba4bdb08a66ad8903611a6052e16cc05b44ed716049148bb06620da51c5b993d2764a08c255409ba7fcc351baaa0f4312bff980be38048dee8bdaac6642a19512f59a6447aa79d40134027919ea650370a010690b8aa2d3d994f6ee5ac17770650c6c424ee55f87d03e07674b0f1c883571ab75fd537c626a0864e33a3db0dfc9a2b0508962a50ded875c61309ddd3fd25c2a4ad2f535794bbb497dc76a980a9f3a0abf1c10b464032f1d29b95ce48f59fb9613d43c638dc8a2c83de47ec64ceb549a49ad8d7afc5e1a4cf9edcdb08df892a53144d3d01b8bd446990f191c9a10fc27fb07363653b740ef5a9fe49d0ba098e0d6d0843288c186825dfeae34c986e02fa89a741766186b64873c8186c7a26b2262ab6b424e37138a73be71868bd4bc9665e93337e9739e260a60ecc77b5734ea53cc06edccffeb2c5362ca7afd97dae8152b91ed17450108f34cc0e8c507fc74ac50a24e81020ddadefed949a61b97feee16ce03c01d90cfd62659c0441c8509051ec265c8761e04846108025fad206a985cc213aedb81a1968e7a32ed7dfa3a519f2462a0055ab830c015b01a392966b74bedf6c82f87e53e6abda3761af1d57d9ec24dc0b9696ffeebcc0da33bdffa5df959e614b515b8d038aa1b75652e4b4ff70dcaf6432d2234b23743edf5915fb0f1b66d46b410d0c807bfe1e879af8ef8cf5968709cb36b8bf6040ca5592c56261c99695ef0ab3aabbe635465a9092980dbb0c561529e6afafad974c6bf8b8d7fbfdda434a940fe4c4b7cceaa5c1e59b9a9019c1eebdec9dd35107b87b9c879fe398012fdc8d75bee1daadcceeea70a9268ff9d8584206c8087565a8e9a100ffa38e5c6a36b216af856f7bd87b8f2d692f52cd496116a946d93469454c58c4aeb21e70a9c03de426141bb231090022d8a9fa45850bc566ee66c6079ebd8fbf0ad607a095e606bcf6985952d766c83f004684e21aaabb3e1e2860e2b5ef8aab5d3a82e3902301da98635f14c86e42e0ac6fcdbd9fa68d36302ef1dde09428f09700888410a1e87697760739a1c051f1b3d1287fad4cf0a896865ce1e45f0d938bb866723a60368080c500a4e4ef9745038ca35f84666b61745dd968f77b303b38943d123e718f273a86917adcea4ae46c9592cc12eb7c87af1e0403a8184c26a7551640369a9531b266d427f6e7e7bf6bb5360ddbf02ac4e269a9f4cd8291353b476b47a2c7a542d9d0a0ff5fc8241eae51fc041514bda13c942fc8dbddc2907553c4fad4979e40e087fc5308831bd6dd493098120d48ed233c51734c9bafe46bd43f73bd00e6087da07ce0c027cae06c1be6801ecd4ec1482dce0b4ee0d622603c1e7a68fe19927353162b6990d3965178592029ea7a230a32b4669c0ae4f523b7d946f9032a13ea9371f407294fb27c6c755a2fd13c763c7107d7a902a06c317b1787a3a250e185ab17772a9777cac248aa24b257c40215ac600447e91419b9df34b3b33d5617860eb47e9e8f43a2f8bbbe108f831e840678303810d0dfc65aca39d3eb7a15d0b2218cb4253b056ae576b02eb9871f0522596c3c4810da3d05a7480575ae6c0de56de1be8eee131b79b48df80007e5ff3c4d060c122cc9dd83614efb9329cb81349b7e3c7747999dc77b7a2d74136c6a01aae7bcc58e1249eb857dc330044bfdd9376d2ea0e1f0e9908ab617e1b991bb20880b390031ef98b5cd81cd4da398389a19d0bab1d2cd091183894c4cdd6d81ad3366266d132d71308050c28cc953994a0e3c72250e795f447f952f82d2d5548fa91aeee4709dc45b0a1cd83c14a6c40c31b592cd79ceba786f87534aadeab60fbf76e5671067a9eab4f4b7b514edb0b1abb220460e144c5f9f596181a22a83c38125465de84b9c1ac75a728f5c71069c4d86e13648df7081e2e61abd8fb9364f295a9a8ac8a9c780e70eeb99e6bb4972e2c9d45fa5be786870c261a1cd47ef83755ea8dfd5dd61ccc50a0f3d1a5a2756af3e4e3e16b4f0d7cbe852cbcd52b297cbce48ec4c71800904912cd3812d5358d010dfcd4b2a31ff06a6734c8ba0e6b2eb4b3bc84d1928d6629798c797f53b84b71cac80b753a725d7c3629564e2c96a7351efab080f5790e287af4332371622f8c65ae8444e6c9369f2621078e32c97232acbfb12c3019f47918456c6ba11acaf1f62736ebbc922197a439552806199a16d63d337c8f299b9c4b18fd7f98ea936807aa046c24b3b376ae11d010c74c9d05dcddda98760e2d1a25ea8d7fb9dd7c8beeacc3b1dbf572450ac2880d5da5050552895ff1e68b43b7083c55ae759bfd089f5b8776ff4de85c1b7a8eba80da1fbb76e5fa6eea2515bd705900f30008e2c06a3df32a51aa03caf920c692b80f2a11be700fde256851b0b2663ce407312136f68cf271fb5a44685ea0f1665c87c61c846505897e5b8bbcd365008f12868a0d3d72b39f57027e803046040b90e03e854cef90eae07401b2732ab6b1088c33958231d03170bab1376375ec0ea36432807864528c5193b315ce37cfd8ab6c094b565b28a38f1d108b13fd86ea6f631a5f0ddf9a0b8bfa9d7aeb1b437cf5e7b500bacaf122d1f75ecd0e10a254f310d12e76a09026492c713b913345e08f17750d3fea818e3e25ef7c8f98d2a346522b8c86421fc731ab8943888c1a8331fa3ecc93ac54e2721499431ad0fc7fc07782042b72029ff1f471d0133472a604be2b7793a0ff053d31f86fb165477431a823ce2c2085bfa73f76d8d0fdd132be8b029753790b5d76a8578a6608c205632a8404a813ac50682572199c57019dd8e51eae29b47e201a0114fd37a71ced0199f01e082a2f5da1a5774dca3f06735e65a451f451b6992ab55810c08119bc2f703a5aff66cb34f7487fbae4e850586060b75b4ba512bc58e8d7f0922366d358b99c8221848d4ceece19fa63b1a15083139f9b7585c7ec3591e490ad1b969ce807d26bab92447c4db0a336877906a5638b10684156dadf90eaa67b207ef0dc43b702cacdfc9716604e54db9da5e1303f98b4edd26e71edf70a59c440c35c16fa9f287409074b5e044878c8bcda86117e69efe98335a520b3868c4281c1552d69e90ba7303148d9e5961aa4be6f416da3ee7a4cb3b5fee69c589a19eb9c205e49df03bb3a39c2cc4d9da5beb2a382b9b1bcae92a186abfb87644bd317f76162d91714d8cc4de5439f16e97ae87253e2cb5b01860242f16b8451480cf631267c27e4d5ab73f7c10b03bdff95fa27933a934214554aca4dd8818c39ed52ee32e6f74f5bb663029f3ee70c6f4bb914c200e8c7f26f51432c9cf5b6e6b1b98d1756372f448bcc5a6580a9471a79a0fcef9f8ae422014c2106668fddc9673bf5f00bdc83cfac4801c68062a24347e7c15dd32d2f23e76ebc70a9033dc829abba897367599279c3e53007260c545edee6adaae4bf00ef5c2a862fc4d8f4296a4fdbc13848d696053b2e5c3b2ed72555c5b933a18645d02ccbf38cebaa2770ef1466e2764ac9adb82118d857a62a8b285a4811a8170ceebda4461a0afee8dc9678c1208aca04d76cad5d17017cdd982919c0d14af104340fc3a9c53fa4bc57e66f2307465b166d63f1668b3ab077a208dd6a71ca349a8b9385998d010e915f70998b6ef24c3122068972628c43b848b0dc3f8be20196565b25744ae714d1d108b2dc756a91aae99610ba5ff09d28d007800384a388778a431a3091ae48ca713756b51c0c76edc88e4828f48c8f59f578bc9e7dca472c1c307d75b7fbcf52eda0ee39bc528a61d1cc1a7080b63771de9817c76f63f6315b3fc81b46b5f9ff472ba2f3448c0880611e4fa4b59c6db981594abdc6235a01c71797a7edb1dba5d949a79111d94bb64474e8385f2b93037c51bd4b32481665352e0488f9dee1a20807cc74b68d97f9f3a0cbeab15bc291db844bfbcec4d3c2551b514b41d2f9fbd953e2e7d29a60b6e7a974e2892d2d9da894422f08ae8fb354e6c46b1d6c7916eb523b21682d18b3e1401119704c5048b98f84510b8998e15a15edb060d57af746e06688f7f0137ad8d1e0206dca105fbb59ef01325ca6f6b026d95a2b5041d95a3d6ca5d99d2c05024333e0b8abd9e5112e314da0c5f7d1f872e284815bf73fe0a12f163c0655560e7e06afd29cfe61c14ea8d0bd13483d0a825b5af774d694c1b207f52f9c07a2949db70cbd846c1d4a74b1ffc0310fbdcefef018c7d1fd07ba86d3812f583a6c07aadf5432b2f8b5794a81db4eaa12b94c5523251bd485574315360cb6e3a1a0b57772024ff68e06933578629d84a49b37c340b57b2f943918c64de73d6b10c52f806ab53f66c505fa4a0e5e3277b42fb7c6ad660dd9065576d103c0a8186b3d048ab2fcb1502a6f5872f054de2e83f1dba75dc47cd547da58a534365c4c0e9c316b5a5366ab01205fc16ea2a1df6e7f68893e3517339d8c1b6dbbaaa9e8f772c46e3ce0eec93ae3451639c92e45b938ff6e25a106293d722ebbd5c607ac91cc414923651e79896eeb80ec8634c1c8b1622bdef0be61fdf290f8a427e0724e929c10981a3ccadfdcbb324460d898d69b180739dcf3f8a604ae8884f2466e8c12fc7692b442e146149985247110ffaf6522b562ef36b8e951bc9d37f0a59a7caad89ca70aba61f843d91bf619a86356a1dcd3e54fdfb77c3458e92723cd19e1df9bf0af10097877365304fc8bd06b23adc7ba659134fb4a3e2764a652fd48a5f4706d404f200e127f6aee18089e8fb79acf967a539496f70858dabd6e3d222c7ded0d659f0b31f5de65c08e57403fbcc0e053796d471ac0dc67d097dd97d951941f3989f44bec62581192796ca8ee70e32ec11bf840b5c03d08a90d1613bd5dbe1420400e116c328133c685623c9b90a3e0ea6f3221bc83153d6b33b27a3fca31d6ef9db207a0fe8ce2a7f096a027e47bf61a001ec0824de78f16904338e69f40e80bca36739a33e0f9e4a38d25367a6b707c9852673978979f6edd0355c21a4c86333d76f1da0534c02f49d69c095ec8f0c3bbe69fc81ab4456be575177098e6541f95f6a45fa9b08e6cb35db217fc9b9fcbf8df2836c7761917728aefd2980c4ef3f5c4b7e162c119e7122d7a2b3b100b661b6c07d5d0de68178b36843940e844555523584d947baa9f1755aafcd479a9b31ba0150a2ea5df05f1ecf1150adfad1391d2da02d0701df7c46dec36f038b2374268fb816c859303a17117cae6c514c89b868fd14799f07a4e196cdf7f2916600653b4ab85c2194928fc22c7f787bb37248411e2c618b46b1ca891b3b529859960c3f18de3da2d69c319324406d743db6fce82377bac3f6a5aac9f76d36079e97e733eed6029fcbe9091b70229c0c0c9d8509ad098d2510e2b68eb0f8e0d8825e3ca221f192190e15c15e490ed850184bb1fa2fd34516fe4571844f4fd1cc07525c980f9b5a1485d7c8a26639989a221c43495788b68edfa9f39cdd2ac3707b233be416d94296941cb9810694b37d6236b5a76917d30f0dc01dad1a2215fae87de5492c00f2d512841033bb183bd40f4563aa57948ed7cd514b9f41095acf40c7ea5afd9e708bd4faeee1c4325bbb8467d0976aab8fe338df5a7f9585a6cf89a3411f9bfa8b804e4c84a093a36d432cb7797d40d1e42240a48688d9028e49500d16a6311fa73d023d8cf663f9725dab6013516181cf4c38ffe29501ec43b7a206dddde65195e31c3f808901f5c1ccec93619f4aef8f070a357aea741a7212f4c3184c403a1bd260734732b2b5631dc0bd5e944d58449df2afb7c1d3930f361638e60e768c68b4968f70138d7f1fcf881be73ac6bd8763df69899cf9aee67384013043a71ff9afc1ecb24c2019d0cd05a1fac33a7a1a7bbc1e4ec9f0db16cd0a7fbd55c810029405263baa72f523f92856327fbf0ca5aaafcbf05dbbd8549b583c0fcc839fe83c11104532768e12c0e730f4c636d13429b8472d271252479a6d9431906cc70b3f6d436208ed4e41be2a2f8ac9f24a22b42c9772f633694368ddc787bf52825c61eaf252caeaa4666b6ac678f0be2ddfe7b3a942d98c11b7a5329de6ebb15513c5ba8b8a78c9632278af1a69e4dd61a8e0fb6b87ec400afa5419c28e42bef576260d320d29abfddddc1cd5bfbaf0dc2dbdab6829032818842edb4cbb637a914666b16ab6d9fb3abb3676bafd62649263858e34c7f587922e14da4be2293223d01502904bb08bc9ed08dac5d75451fd15d5b5e6c9b52264af0b72df06c13bdf2e7ec4b3a85377ef2e78115262b4e3715d3646cdff41dd07603247ffb663c0e1c8c643867f017decf76cc8926d64a74c7b4749d1231ff2773243f8638f2a8d4a6a644169c5d620918e72f1242895ba80a6b77075ddce1ce14b7ea3f59c6bbbd69ec93b60a046cc671324d4938e399b44295e953e507687cc6638169495826fd200d9ba1a58bd7764c0b40076fca205d9e30b6b489767d9edb40d3154c180d2c9f8d1b9de6bfc45677f6049041857e6860bd87a02da63e52477f249d4008fd5a8eb8111d061e13cca731a60bd252c8230979ca035521aeabe88425d96652a7584535070871ae57e4298cd48f637accf345364497a7af25e854a7af40e753d5dcb0e6ba4cd44223ee9122305058ece4bcaa28ca5f3a689cf357800040acb5cb70929230a42359684ec3425980b2a3604d7718e2c3c7ab1df7896a5aea448b608019f5d05244fb3b94c32a56d2ac9e242c71e1f3ba2438682142156ae128e5445234cee77c72546087f25a12fd6d5734ae165ef03dd6ac739dbae8a86c87852db8cdb9f3d5e41a8cab007d157a88585b638f165ab369a3aa4ef5ba55756c557ac9613ed6ae025f1915441319beb6b834150929e3ef9b53d319386f32c066bbc21fdf64e5823f951363d5b8ac6487aba4c51ea69f05cacb1a7bd5902e41c4ca60a40190ede1eb8f40395f7befb96368d1c6385797202a1d950382a30090e45763cb80b171e752c21a95115f229eeaf53364712723d0c43882445ed5727949406ddb748eee54b58aa12ca1266d6d64335325ca8a41ca5ebf53636b0d8b3406623ab64dd3dcd03e170811c2d240e2b7450a41959e0c5d511fa021eed3f2b6595f26533bdea8fde954e429da466d57c083ce60e6a37c45aa73b09ce4a7a5db3631cfb035d062172d29999d152b8c18d95f14b0a06cf2973a2409aaddd33e7419a95aaddfb24b474a47b938085cd05d30e39488c58ec4cde115a22adb53c73eb8aa639a0e0899546924b60b0ed17ef900ee71d1714dcf0369a1d88673aa2ef91b3d6e51f176c538e0f9d6b704e9c28b41f74aed38847d24c41fb29e15e74ad07115820bbeac442fef730eeb2773b4491d89f107dfcb035a615e21ae35a44672f5c8a32f6b998d69cbeffec5aa44faf83bb3cb920b83c15999ec72aa74d97ac8aab60acb75b03b55a60a9a4700d676cfdcaccec6de6207ceb69683aae664fc3417ebc859f6267414721ba5a060a35309816873251be2e427ce84a56b885fc0532122e15e97fd8c0b50ba9fa841b22c32317153511fed57225f5e226c94ad7df0cd19a27057c73d8c3b30c28f188c023b559988bb622921d614fa39d44ce9a99fb50999b638b68f406b5191a09852ad12084c0a81abe73ee05641914f1c79c09e8e5ceecae053508f89ad8dc16e86d6467cd725734aab7af6a1418f878ef5dd07f62e4e56c7d90ae1b53c85f34c1240dc4d481836d760f7339d82d195242f8e02cb549c91306c473ceac77e2757d273d4113925008d37d26c7122dd2b84137af7fd0c2b413cfddd059a198990dd48c829200041c0b198454d4855e96c6b80124b8c2fc8bf3fe4012d2c8a66aff10a3ffc5ce749db3d375255006dfd3595c9bd047a1284b949a088567e90f71934f93f26d52ce4d885d3901b6892fb98dc545c0069235d673fdb8a234ab25630db8b0bd09208c058767301ef4d1daa3c5937894f1dfce6e64e04a44a102c6a7405040a7d1abb86de9e3a4671e3a9a41c3d15d6560bb0ec57bb935d94e2c1ac9665f64d5f16d870de40f1590faf5e00b6c9101a5aefdef8345c2460562196263a12f84414759b59b11f53638cb5ba6d16e7117b6c214b2dd8c00284f82db58479fb39e5f55916aee598ca5a919378ae223eb551a221719f8bba997362383a3d02cc8713a83af6891bd6a97a377598d7fa3bfa6c383f932f205e94ae870db4d77c5fd50e2aa98fa3255077a5b6570f5f89faae1b94f8b94348e527105a0500a130b01ab4cd41a118dc062949d504f39f69c75b11c60253d77eb8489d126fa3d56feca0910af86b8102934d204e1660e6b9abef805b706c2ee4d4f61916c79546ad879dd89fa6768062bc54df3808e2193d6068246ba347f628d491558901d7134b1cf1bcc14efdf173935a25e50f329ee9ee268c6dd77ccc4d30754ad52750857e48c00aa2359542a743335982bab029a86b114286093d35e4438d6a06092fe954c453ea513687f20b5c15777ea0aa6334f88dc5b6e2db7663d68a7d2ccd2df25492440b4afde985aad51ff4613096e31f2c56ac3947cc30316b6aa8a5067f190aae45b8d794fda0f68af00652c1b4571897505a12192c9c2432f1fcc38b7728fe91374325282e2a975166e8fae850dfcb57325d1d1ab0b59c51fa21b9324ff3502e9a28e99f5655ba6084d0b7178a36e9054e8380417780398ef287cfbf1f9b3fb7e794b11aef72d3674fd5643660cb26f56f670c9334c4858cb2e568197188dce2f173548f630c731e13e6b06cb024f73c24a83428a50f4dfeac2e8ec01a5ed6f810c84ee4074f4a197076931971826f52e017e85955b9b4d00865cab472eabcf95017c6a7eae3c95c48ef85a2cd25b60c19967faa17f8e6bf771b945f8b512b491b33445155fb1f1cb27650953e90f0b142e73be4f9499f19354ba17cb7130768e6a1b031ba2b139791d26d2e93fbc27c3eeb5094b26164914069187e972a329eeda93f1e021ca283fad918281c823a1c8a6b47668dc27c3507f77f65f2dba585edf950ed6cc744071e939b33235961fe6c2924a61d18cef8b81bc203ea17960e0604063e849f90c4b4b63b00bd7ff0c198f6f23c68745938b0553b860cb8b4540063491141d3de3c6251ba2e8b1b9932c32db5e6508ac45b2337a71e78c9d5a163d62892b7c8ff22290e0f791a988f79827cf89122fdf1f3022d8cac9a48896be0f04e789121fa3399fe357045798c83194087273a59264696345a8ec2c9b9007e3a2766768117ad673625e11718e3093f95fdae9d3e0ab9bfc3d7d718c8bbe80952c2118494b6ef6bc00c2b5c63c4b30886566252527a23182f18cf41071082308ec2c4b59c906e416ac2615f639a8c204baaad56d10b5b6d3cbddffa53e965d47372a8829f6e29063f557a4b70b11087ac0de85bd016f504d982c17e28e2ef64b53c32d5c2827bb146c17496c79c968be472d2d9205f35c93c97ffd58c5033c7ac56964ad74f04e44c87ff036242ae0e5815f3d96142048460146963e2beb4c268174e0c7536519ef62f3e3101f34345ac81d5ca68ffd780fbf7dc0682270e244b6364a59b82f1de05f2a1010fc328597b57a1881ba56062004dc3b8039951eee9d22c917f8a7a091799e3bca6e7cb3dcfc969f22c9c0b00dd3be8cf32705b32f707ffe4ca93b9d6c2e0b206437e85671ea2d23396f4de114279884ba9969b858c5649deb5e8fe857893d05e8036e789b04cd38175427b502074c60479d135ed8023074b79d3604497c35450f127c2e105c2a780a90865bcb7cffe0a92523ce88c42b0cd352224ad810349bc38900e9d76d23589428557bdf92251c358d1797e4b7c9fa3022ae54dc6fb211a4a0f8b524b4d9416f2856118896f1d90fca643833cbbe56c94c36e92b60580dda94448d013b097f6e0d5e9680ddb2c0f7ee0cea0560488c60d436e4c30bab270148bc7815a62887da6bdc825a48458ff0a315e63484621f6b6d8c637ff3e9ec8bd2ca773516a20bcb29d76e251028113606f8d22dc54bc4af502511c7ffb4d63d774f993fcf982f3d8dffed11158d647007dd80a339c6e7538c4a3b3a08e42f3a1bf2701df21eb14db10a71a025b9e9655debd9b1c07714a4b8e9c743548d318cc4f81cc5dae5085f17838e1aed5d702b3419c78eb0ab7cbb34075bc0a7b7be0b3ed2ebd11404083c87e6e217689cb3cbd95b25b96e26090a6d91af0c1793244a123a9fc7f6408dd4b4453322e1a7bcf8383bdaeb7cecf928af280688b4f5c259a12dd905390092a36deed350a154aa77e57be69c9464f9f0f560db8dc98479132bbb4b644033924e834a46121bc03ed448677179569cd98a68fd1347bd51d5401b40412070d5ead5f419fbbf86155d4b6282941b211d2a11489f35b08993c31ccdb5f88f11884b1c936ed08ad722856069491242b0ad1725ab4124bf548a2522d21451e2d653bb46c1bde318b7b1b414d9a1c91e598062b09dd5bdb01089cac2c8a6982c8193615a32e15c14b42b35d35ba49239930723b1be748368c176afa8b9290b121c870a52e25c22603988895ec2ea7a93993cc94419a0576720634b689368cdef64aad2a059ffc3d2d80b0dbf585f90510efbb792c1c347f033a9fb684593092324a1b554423385c021ae1b80a39c71aa2c5e5cc0b713e0349b395305ef7446283de4d253c0b185365743e2037540001288239e2ccd5937e051d5a8c51f8e333ab2790ce3669db58d16a03fddf766b442491c8eeee4d3b0608cb075e088e75b9f58e62a8c3f6f29da7bd3cf3f6cc66d6b5519a67edcc4c4e612c409e960273648f1eab953b0a75afb43e57f0f124df56f0b1e97ce78bab2684e4ac9a35a75a91ec492ea75d7291a3a53d6f2bf878eba5bce944315d02c9bae6348a397adc532acd514cf79819a7bd063320f3feaea544192baff3aeb504935722cc13e05dab8a97269f3de6d5ad70b102e59738fad5bbd612466f65e8edb783f93a4d6edbb3ac54511ef366491a11ecaba609b9b6db7a470d88cdceadadd563b4de54aa471f68599ac3f0d5d5da3524d730b7eef33a8c2e217ab348aed114c1f2f65e739abcbdf69aacb9adbe0175ad31d7de3a47a12018aadd94b8b7f281156f3de637ea98551d866fbcc1b74fb28e751824f0b72eb2bdb773a218c9b7cc6324e598372d03bdef1c698ca4cc6aaf1ead539a38a47aed1a01ad499eaa713bc4bb4b68b758f796c3a96f0da6a409c1bc33ab5d7352ec2d47beb1623657d38454676159aded510392f1f05d43c23dd7bb07d5845cb74e71fb09674e834bfeb08d438cbad87d5331997c06a730b7ee5e6b53b7660aa34ba074037a1bd0e5d5ad53c81381ea3157c803fd45c0e4a4bc61534e614efd7a87d12554a7dacd2404718180e2939c7ae6287cefd655be9d452a927d57d73cf3a692b9cf323011bb70cfad43ecd7dc61740f9a4d6f068d1b586145332121bdb9e26e5976caaa1825c1e5b6aa70f91873f0310b2dbd6b2581c4c777ad24b6786058e7b0f3d77a07f7fa2e9657e1e09f675aef70379da7f2cf5b4964691e6ebbcf7b4be0a4ee870afd5008218413a79ecb1f8a532f9fe0944ce9f339bcb885f607218cde427c483c773f507b8090d00fc4423f4940414df9d842c2e8a39f62aa7dba922022143a9fe0943c773f164e7faea1e07e96a4882ef4e72444713f442ce92dc81c8211bebd8d2c810f08eba494b4da6aabad165a7736b382e4137cd7a31785f1d9f8766a9d1b66ad6fef65bfcd12fe16bd05a18748e0cbcc82fe84b09e2a704ff4f47c71eab16244d363a5ca085f07e05dcb882f8cc892458b0d4c5d2cf1a6e8068996112d29aec35c918f034e80801151b48cb8f23ed81b2c77f3e1a3c784d89662d066f844839a6d2796e6991b31e50d6141bf3cf3d6aadb6cab2cea18acd49d96796bd433cc6ab7d4354c3dc3983bada186a16731be156a5ad92d196839023384baa45ee7cd9b748987b0a653c99a4e314bba365970ae5183183fa0eae969a2d69e2b3d374ba8b858a2657df0c9497dbc555f4129755ac50c71ca081fa9092014d1b89e36190a4ef7793745946e54455b44559e524aa9f39eec8433f3ae4504c46faa2208c7141ad42951645b4ca1824db9a6ec70a79880540410329a772da21b301ed836e155382d18586949b1c1cd1312185a62c5872d2730420c05c660a2cc14547e18030d2e9e3e2de28ca7334fb5780255440b524554b16e642d54576c501ea5c6e704540c70c881724a671c3394d249a93b1f684f61e0c5537a63e5c60994afa668791def5a53da289d61f39c5ea7dfb7737a38aa1b26ea9d32677e63e5ba8ffe5cd0fa39dfbb969429aa20bd6b4959e2033dbff5bc7c2e429efa13c5cb9bdeb58838427d4b0a959f338b9fbed2b9336f32afd0f3a71b29ab18e5e873deb5a4d410258e4ce7591197d0e03f441b02ae8fd3e9eac0e06e19f4299f4bf920bc81f0d433bb2778e35bcca72debdb3556af34c79c1a126756bd95933bb27f4e6db0ceedc4085f09cf25e9077aaf819ef3e8e073ceb9d31ad660617529a5cb9b18b477f75bf5e0264a8fc4d1b5c853ab98cb01f7033ef41374ab6add4dc5c568f572a08e514777a897c3b37a396174095f3eeaa0701c741d0ea8beacc0812977533df421730e1ac0f85e66e1ad9e3b7509fdd0abfca276de80ea6338733401f3fb8131fc0342b571dd6f28303a06d5977faa530e282f7a4e38b9aef504ca5f3b6cd7b59ed8f0aee5a48c6b3959430354887b1d8bc20ebed52c8aa7af57e775714d515c18a78c625013965b63837179bd301314577aa5d5b18c55bf2e778f61d755a91c43e774daa1723f5db7461d2d28356d117a06dd65f5b618ea937a459d28bc71d3eb745a2975dbf3452e5ce29cae2b53a3bf1b183111e6abd36a8a35eb126ae3e88efa958750af17ed3036be1d57b328d9e5ef510b08fd64d6ad2dc1a67aebdbe96d55bd1d216ec7dbb9dc5aeb3ede8e1087c0db896e7bde9af0d63aa3b76ead75a7b2fdde193208210411526cc0dc6ed7665a3de6627ca57a5dfe30c9afe6f256d873ccdbcadbb9727fb15086eba618afcf33e120a19f7bf3f5882f9e53def68b6d782bcc6193b7c29c85b7c2302cf31c435c1bbfb48b72339f72ca29a79cd01fe63960702fc7fcad204ed2b2ca63de38497379a09e8279b1dbbb21e2a6825bca5b61ae4386db5e20f62e4a62aef376846018561d13a2c9633c3cb6c566f27630f7691b30e7c0e3893f18141ae6b63ce61673611e1bf35899c75c1006c330bf10c3b0acc232eb35d17630c410308852eb45b9abb369c232987c06c26c72f73148e8c7643239c44d82a18f6e32cd5931f056d5c7013d655ccc730871abad9239ccdb45e2f65fa7987473c9edd3bc945bca5b55da4bdc0feab594bb8adb9672636fcf05894f7353713caae720e2665eba5ce2244d5ab2e4ab4f9ca461d05bd5ea96e852a95e1de21ec22fbc55751d43776b2a54eabd28940b711fab5737c6cb753ffa2b4ffca96ee4ed3caf3a708e095f6b759243357d75a7aa99d55e3236ac75ef6520eb5410782be800d7793b6f27aa563d26c4a8920e1d9613e05b41949f50384e0b24424208216c87b09f17104208a30e56271d082184ed10b6aa0b082184ed10f6d30184104208fbbdec05ca0360deb5ae90f9edbebc42c5df539533465c6fc4b8eead56116e40b07376d3c5dd6e0a5d42bf74153820e5152c7fe483752fb2481956e70cf29d1bb9c9e276cd4053e9ee0ea3bd34950ea3dd3b7aef81b939d07834e794524631f168c8c2ec3d4cba732e73383ff3a6723b7ace39a74e472d778b1f375476ba317321cfb3b8f9f89961d3c75f398ae91e52eaac30a5b0d6cb55f5f97b4d6743573d1c17ba5a2e11a275a54aab8913f88861a29878148f22e6587658978ba9b0b89b2a27fab65ac1e858de50abae541e5b005c0013ff790b781ea5cf0693a55213805ef20a3c27390aee67c90c50f3199e93b2d05bbcc5b78df9ac7e3595c78022f662199bcdd3258e935e9da6d61b2deeb6e3a55f52ba8f9ecc675cba0919ce7c26a3c1eee594705671cdf2e61e66aee8a591376ab7a3770e0903bcf4fc26d4e4e195616665cea25eb79e18b72c6f3d9f393579a39c4e8fc337605ceb9a0fe79757e7accb5b96d56dc76fb5e68c62ed45306840a6341d230132fd42b201cc48cd9be30185fac24ffccd0b3d79e85710c78387f95d2d08bd94603e7a8a4834fae99ad760d6f41a9fc1dbf4191a70f9e817bd683c62a1b72fb3ee1c8f0c6fb248842e85de69f00262e33eaf3aec0b5ed59d36a4627ee119af4670ded350703f3838588694d3d03f9726e442d50d3aaae417d6713995daa515996eb17b5bdd0a99f12272fae5574e11b1d507de78ead2b294fbbcaa09b95c4a4761568dbbcf701294e770a705117a7b39751d7823b974142e12fdcadb2c125d66cd7da00d46d23f643a8de748e1cad268f226f49be6d44d78137a2cf7e0126691f2d4324e057158322b33b7496c26ddca16eae512b716a462ee10cfccf1a835c77e3a48dcf7aed504936f7730c32d2815c4f9fbbcd690bcb02486120cbd731270efdc8ee810cf0dbaec08b4c7cc720e3392a0dfe0bb761d2fd3a2ae56b75e14ecd5c329bfddd5ec27457d94b523ee7701fef6c20341ec7dbd26861fdf02e0fbf8766ec078d1a1a700793287ae42862beebfd942d5d8fd8d1670859e8f296040050fbc9de7b2fb28068f3dd66af8d459662dc935c9316c65f3b682ea33d72ef7569aa5aec234a7ddf8f45631b693a4f6ceb707777363fef50f8f47057813c6753ea3bcee6324cc62187603c6ddba94d3a8e8d8cc47de8ae7042d36fc7dab4ac67530477bb50d18df47e9ba463aa1705cb5daa183b9c96184cfe38b6fc22b6b4b98ced7e45f1b6f30d72ebf3420daa5e1f858c634225d82245cc2ef359a9570e7a06625128e38807effc9195c5fcee5ad0579ae65fe80e2672fbecc632631e6ed178e8fd5f8e2df79066cd9058410c2863af0223e2f22e4d259191176f7a693c20e8ca856417a3ebb29e36e3a3a3a3a3a3ba4cc79739a65962948297b6684a862052978b9386ff5ca905e5475cb0ea8ea894f77d3b95ea46cb2e5567fae8a19e78b9beaa1542f79383edfcb6a0613697c2cbcbc1128bef489658e5bee569bc42775ca0d087e3b0bc3f0d02f6db74ef3d63e81e047d6d67f61249dcd96de324874c88ab9be2ee2c7f8957471dcfd4079e76d05d5bdaac6d5a90624abb3469fd14fa67c6fad3634396a6674f8c951d7351d383ad580a06aad5507768fc2f16d72d49c6866bce43ed084497eb59256f212c927295aec2e5c5fca15502dd3f819efe96dc59ce4251c5d6a404811fef5a81171b7145fc3d90948be576ab8820fa8309f9735ee13be21f06d9b5aec72e93ea07af73763dc0c0671f3e5aa6acf96d35b23a2248e38e2301212ddcbe937c403ea43b1cf5b45cfdc8f166e86a8f0d0690659d1b3119a3dbc41160f07f8bc95f421ee07c9fde8e7f2d45344daa977dea0bd3255c4316a3161e52f8fa4c6bce6199755034272ac9dc69de38161926fd549183e79115291ab625bb3975be831684486fed9843e5ecc22f9e527bc911c731abc917cfa0cde842240f2cb6d29a343a8435745dfa09bfc3ac49be67056ad08f59ab72297635a91e896e45608e6995684fac92bdea04f3fe51411eb24b74e72d705f38cab64e81f26345ee35a11ea5be6dbe5d0555198386780adfaf41a8b4b4e83b799bc093d509b308be4fd17b334bf4af9f66845a88f2c67ee47770cae6b310106b6d0af3d40e80953d69a9008df6943eed7fe1e42d2717c1224ee6868e88166de3a04cade3a0b5f9130e09fe37139d0fc249803cd222a7cf5119030e0dbf1b8dc690f10da71e52dfa04123d3a84b949291e1de43d84a185689e86654209e523c98f3ece644e7dc687104258047de43eedcc79946940a6064407be3e4f3d90c7a152ee20cf0d8e08feb420b5f3e6306fab9f79ebf1d2adb55996b19e4d963984d0ad7b67363aaccf115c471e216fefed168fbe5d84bcf5f01242de565de0e4cdb7dce40d55452a4381ca73ce6d051f5966597f3e3d9b9992848260e84d492cf31bc9811e0b3a0c3fdbceac3d8b637e03a2d09b9439c9ad6f98d3bcc5a327f9739d1cacc5d4d4a9d39ae786655786172f5d70d95205750978ea4efa6680b983ca40ef2709e533473179e2cd33d0db6e5a0a56b5923b58e39e6308f4e9d3db85e912a677f6819f6d384ef253364f4ef23c4216217b0839955f6e27f90d0941c0e729df7032d0fbe77392a66b9a10e8ac97af6710de1cd36ba697a66bd3ebcca9bce93cc9310d0885821bb7949e82bbe74e4872d73da826e4e4999330741fa8035f476193db60ea27ec3e07de7afcd652b6d56f2d45c318863da49e95dbd97afcd63369269ef1d684d477d2677aacb0bcadfc1db92339e33438f54d9af16a4c81250b32c6b840992b5e9005125a04a103368060e30aa3072c528ce952e518a39ac2d2c346166c64f12146bc7a39cd0615bfa9acb0118335e8bb161b4fb071c498357620c4022ec000c289d6125856c0860c23f84008882b7c300326a6e8620671a48cea983063e0c862e4c491911366bce99d91135d7c7bc600cf604c4df1a4ec0205085c11083c665be284f2adc1830fa2a05eca35ae78f9d25d4ad7b932e72c55e5be9c35aefc165fbe27c53ad57b5a12ddddfd2050bf144f14b57cd84c8d2c475da000820c6944b9a1045798f88087521a42558a9c10230a16217e48e22765841a5d5e00ef5a6aa8f1f35d4b8d3364d043a38318568279c92d564274042bb992871bf3e847308ff948e63007b567ae39c9498872f3bd3087ba977cbbcfc64d36ee4144477274bbf523edd61e41792907951c958dc01cda394807e65037b94d36e5209fd612f47290c31cea397211e610674ec24144473a3ae6472e0fba1efdca47a06739a8f3cd412c60587e39a8876013a223ed2f0705111d79de3948f397558039d42bcd8c0e8dbb1fe7a5c6dd0f7512a25cf77372f7d3353888c8c82907f5cf7593d36025d6319fc14a888ed8dc50600e75cc95587973538139d44970c1cd4a828850703fd2a7bb1f2c2b91ee7eb6a652c23f5a86dd4fa741258da2478a9232321d05f733dde7fd38152d09c14795b0d1c5fc2026cbeb78d71243e59f0684b582f3e90e339cab7ad97516b09ff903cea53fec03d8438875d0c0f2cf7d98c05a017a0f1a564cf8f7811806d1d0bb3c45a5222246552a4a4a8a4c05c1452a082e5c0a063d3db475c4a52725443d8561f237ef5a680ca131252b8a3c344a85c2f123a334ba481581e32a94cf2e2a78676cc1447586152650a586883a8ea34ac5e00494afb477ad337ef0a577ad33c2fca6a325086694f92dfb67c61833c2fc7dd732a3cb05ac7bb6b118fa96124209217c18897bf0c5ec3d24b0768f7607e1835774cfb9f7eeb9f90f429f58163d8b0e352011c2e8608c2ec6189d938e04bed48840cfff5ebed689dbbabb5b23021d86e9e79c73ce39e79c736f8b7d197c6434f9e8af4be812b676a0f8dbf40da83e75a0f858908ee31be2372bacee26f658cf9f949e49e80d65dc821e529f299abaa4a76a6aca089fec9a413ce3789ac1749153424a446b0c0c0382cd49e9a494d249dfcb7a524adb0ec9edbabc1eb0c64c6253db3067c5eb62c1bdfcb1acc72cbeed1463cc38fec946236514a34aa5876ee326746568e85b806ee8694e6234f4d181302d438f413243bfb9a2a18f3947f780dedaa97b40776cc49a93e391fa01f3d87f723f30876ecae8cc0908118c26a338e5c3b579e8d3391ef53431fc9a530e8b9d30875e738724e6a7534f9c6a6c06a52ae6299bba304f496cce8e33522c528f60b28081f2ad1511bad264e85b107a82ca50106865e82395a18f19092433f45826750fe83e2feb1eb087db5a3ea38127e878509797cfeea4b7de7baf8bdd7bedd56e764947489b067eab4f4729d618312c46c7b068b14935207dc4c5b0fc7ace3935221990d91ae3e851997b3b71c628b521d263de6e36ebcee2aac3c5dcfa7396cd9548968ad3b1d474ef032946022d96ba52b27aaa2b8624e863860416919e613988ebf2d6b1bc75c53cb6c880f2365fefa38438070b61edc7640c2a0ffd49978f31f56dfabb52354553b39104458c04c2fc5690ca2195430a05f7f99309885e21019c07b55043a12d3968b1e19d293e40e78b756fbbedae85c598df321e76e59e1455fe3d7426b8ee528c87573479e8198d3630c2427d966276796a4af8aa3cf49a2dbec6b52f4fe3360efd09f126bcf59bae9ff0852716581e3a8d437f6e54c568c9db2c83585aa91181f4a409b94068a8e92b086c40a011a1711bc7b49ec18dbe69fe846c9a3f4d2352e39a63936572e87d9de44f13725dd2d0e4ed72e9d0266fa6c79cf4271308fec29b09055fc20719e4408c1a5001e5876a436abfa59696a097f076fd26dd946bb0ed9f98451dfad32060b74b88083ef3ed7a4c048fe52d7af4eb3e106b79bb5e7a6441967411fc6b6d119dba748ae533bf5f3ef3d91af343a86b6e6b70f48873b88659395c738e87c927a641a25fbfb420316e9248c96dbce4366ea51681a03ce2cc35cc9ace2ab9561d8b3c2eef227093ace8d1339f3985ca41849ee4a921355ef21a2f79c9a7d7e0acdeb80daeb1c1d3b3e83a5ce29959994ba7f14b2b72721f685f66833377da04dccf8dd093b00c3a9c06e70cd03f3a72d4ac5899bba7c1acccad29f7e01491cc4b9e79296b45322bd3723f40e809ed0142421ff3262120f4842604a786c4a057f2eef28861f84be8a176f98b9875a09939d07c24b47a2953826484bf9e780bc3572c8700f540a8bf84be5a6aabebbc55c346e25eef5a3760f21af56e105a548ce92fa8f8f2ae450593e779d79a42cbebf878abb743d512469196a2e1e2705d6b0a2bbfb92277848375a8eda2c0f8e77e831ffefdcbb2ff6d478a86db59fb60b31ce1bc6b65d9220b14599250bd6b65b96187183edeb5ac30a265850f0bd8c18d1434544840d820071b30818314a60b1a2a321ae878c1cdbb561535a4deb58cc2b40e17f5ae65b4c54d6a05b77d8b0e2e613377dab1eedf7b875bf64f870b8bb49762c185ee3e3b7a24f45d98d14a9a0b33733f92b497772123b91f497ae89130e0db8786befd0e7d7b36e4eda0ca288ca0f0f2f6452f47ffb2975ea2745ee2cf0f7f82eef0768a3c88828b144dfe398e7c2498e30a6ceb704d3a3a5c2eaf084a8950349165e611fd52b7b8ae6052ec13434539645f14d9d01ace18d20eb824a04202946497fba0b0827b875baff4e2df133ffc73a699ab06db45e41cb68b80c135d9ae413b715db8ed3ddc6ec1017eb8aee5c49113609ce0c209230c3861650772f1d009290f550fa1cec3f7e506b26a20c8c545e138f4585f1332a8b71329a5a71b2e1785a302e58007ba847eea2c00bd4087a6d4204e5c198e0c774614474fa06041101a4a9827318627330c3de17182058d2e4f1c0e88c64c61f458f4900391143eb851022128374421c68b0e454618118421e61152a68e93183c79e2c27063a4e0c96552822ba89079030c1b5050410e76f822cb11519cf113c7113f279528ad46cfa0cc132fa81080931e3c5139f9e274d08227683ca971d286ebe287131fcd83eca48627ad270a7002e6c901a2133380789200273db801195e3cc1e289d322f3939edd87f376dc0ff9524a29b32aa8115edf2a4edfaa90ec248160e5a59c327829e5e9f4d14f278754a49c502080f929a56f70453c9cb40c8cdc0efa0cc78327570cc0490f4f7a9c1821460c119470658850e589edeeeeeea6dddddddd4d73ce2015364a29bb65cb39bb674f299f0bf4593c3df4f00f94c2c78e1daa6723a51052082184105219678f51e2361398a3820782dc8fe8cf53a00e59b8dc9ef095d21ea2f985b70a5ae27860cec8bd157468e4edc0a11d9cc725ee668296190fc101e02698540e711c92e0d0df10e4c90e57beb9a2946fdef3383fdc6dc743efd11c738c8439742390073bf414baca0990276725008701b8fc49793b97c3558e1a38c57df3117cebf9ad79a078859e5fa1e7ad5ff6ba2ed019c4ddae0edf7ac8ca2128b79e0001234df1cd1ceac89bcc40f4699e1946e115f649818517827aa8975069a3b76a2fe1f68291b41cbcc23a30a75d003800580500a870438139ed24e0b60273da336e2d30a71d6307731c3b98330276304704ec604e083852be8bb8fcd10e302a2f385c38f076260ab6d8008d772eced9dd4db312f7f21bc7f1adb5f498101c4e7fde603acc433f61e6157ae8741c1feeb6638746bf8f7287197ae106f5124ca6cbbc557b0818073793d764a49cf3bdf7de7bb7ccf70b6fd561705c705f27f907c315b279252bbe7c09c240bb0770602be4594244bb7479a7e5c8e339f24e8025ebce470597e18bc279abcc4b380ac9278ec2c47f489af451c1f1687f18062864dfcb0106deaa33d72c0bee4790e3e1b6b8f1edea68236f27c349b973abe13a29751297afbe9df0a4ade7a9c9dde399a1a909c16d50eede7411b07b39a81c02762fc726e7c0eead6af209bbb7a2d199c91bce57d5571a35bc91729665236fd58e836bca5e375807863c8ed3024ac778c0e64d2e62745a9c73ce1979abe99c73ae4a77f41ea01008eb82ccfcbaaab5d63e9daf0fc8253117e417b55be96f9d6297e2f470b11e13ee5b59b7feac7d39d6b3eaf555710a3a7184b85beda148e651384eeed64dba49042293c43f5147e6052c40e030f48ddd57c883f949488e0bf435795b58d2a7acd1dd03fa4da7a762e896f6ec783c269f9796f9747741fef40a79aebb0993f08e88c22a5c5f4e7515de6e3603c9b7be7aabead9afade76ba6d2698639835f58c9450691d552bc39306f5d4ac77972b1fb19c5db3d552f1007dbfe832cef5a7080f9adf4ce7dbc6bc191c43b6dc87c2401b88e01160057e89d3b6c552438376576a3cb27a3d0ebf2ad190553625cb9550703fb5d4214a5e7f85ecc235cd8005b63ad7e42b99a553fd51a6794225cea4b88e4f41b4290524a29a59438ae5aed90f3419cab83021ba43f95a2eff456d42b76291fdc53f59aa35c30e69bbb8448fa7549592f395dca2a2bcd2c8734581d3994b1f22f7afcd145e0779670fa9b1a110d7c7ee84f1b824b0d1f540103febdeb6f6523765f5fcf5c7277a8fe494fc98ca41f7a927ee8394ac37e59a05436efbd97e388cb79b9e616e0e42caa33cd5d42943d04408765dce7576abd77f3dfb08798cbc11c0fa883c3e46e3bb087be43c7478f0933454ad820fda60bbdc6deeba22ddd25440fbe053c9e7e9904437702ac765db473ba132ad583bb65d93da192f447f7171fccaef4254430bacf60716ab8d80dd27fd5eba2fc96737af656d27d7065c4b1d3bd67ee4733bd4b88a053bffd5adc0fb7137dba7c2f63e75d42d49906ffd9a13402336a44a053f9d1a994ef85a6aba6213a64704cf9fed4d1ddee370bde4f382d74026ebb834388ef6ec246789dbb696f1929ef5a657828c0bbd60fc03cc4499971371c57ad76e024fdcfc17c9109c6fccb51a647ec5a3fe8128589ffccfcaece2b81edbb84c8b53b92751880a55418b77eb9ed9148943104f6768a8cd418a931e614b284a89fbbec664f763e492965778a8c7b7afd1cbe1e58878177dfce7c5b24a20d892fe57bf23d6735155e98a001961417b739a31e074c7c33186be8c186285b8890d0025bd0022c3fd061861e7260c50f9c257808211811abbae168227f00070e0e0793196ca475c237822e8ee80288284e8e78a305470c2fdfe8217b68a060846ed8d50931c628651a2fdf58233a2e108c0ab3cee95deb0d2f7c2053c58d297468b24397188660638b237e36247ebe3103000041004ea2f8220b1340314616308878a3872cde60f20dc4752d322d3264de39e95d8b0c984786cbbb16192cdf36c091c30f5e076499df56ef7e7ef0edaebd26e08a142828e2cb12547820e1106ac10d586c10e204584079e28a50b6289302881ebc685169020b1a411072c10d9c2c9183319ac841882fb40d37aefce08cb0b4c1c40da2b7ef5a6e007167deb5dc68f2edc6d0b3ef5a6db0a18189dabb561b5eb491a58d2b8f7ad76ae305df9e391ebeddd6366eb848ae7b382fc3ba771136edabbbdf69ad05f244283d3a346f2b2d7b9994ddca332f0f7a8402795e8f0ecd9bce4a66d4bd11ca43a19f07b9b0da7be8dd6fed411e4f1051672dd2877aa8837ae8c707e6408740f467ea790ffda33f330bc8cb485ca0fff22654c3cbbc39a3873c3df403dff876facf6fdef8e742da60d2060adccafde6ac78d846240071dd1bef7e73583c3463c91b59e260811b2b30fa814d247186162e44c4e08a267e4c58e28a1823c6687154c40f7414e4111a220a10a20c41660c1a6afcb82d35e480051c69f430c3961fe8430c3ac0218a2edee0f2e407ba0ee419018a369478420734c071c60ff4e228892070f0814c146ffc40f7a94758f75aad960f07e796fa8637ca982f2ac618638c1175ef8e5598306c94b9d049153d3d36a8b5478a6d8b15019eb6a884cd5595450b95a219010000004314002020100a8744229150301e17ee7afa14000c96aa486a4e1688931c46519031880002080184000080010400cc949815ec08497c1cd2c5718f8ed1db7108bd68bb15333bd6df315d1cf4ecd01ed7907c988e848beb02844f578af84d2bb6442e1d7fb097e65cc94819345617ac7490db0e92ef69c646e4da714fc7bd3be8edb007cf35da4d3770722837c7c11e0e0811eb8a899a9e8cfc4d13bb2cae8e43ec45c33521531ce8eb68744eb4ff31e5b8b010f3b0c58a208fd3771c106d1bf4d96d5016c92a0e7bab2321df68c52c71d5742b238383487db45652cafa45eb31c8c85c34dd8a19737c7d1d24d2d1a46b214206da55b2ac3a4af386466c814b0d77a465e4209b1eadd2846fad1811cdcd51766f5a732de79b41a3ab0b912db4828e90859b865dcb1acfa4b59a446b1c23df696296c5d581ac3d68d44d46cc446bb564b5c31b1ddf769c9b2151cc4ae57225b642b28453b2dcb86b23247e6b3661b808b13ac5a3c079b80b308789c711182c8ccf6bd5d4a8596e6f0a6781e5878d461d5330e0158fa1695af8c0bb9f4a0ca8579a6fd82dbd831d5b12d430325f9331d695ba18b264e36ba9751036ff274437f48a38b4c20beab213cbbbcb28247edefb56fa321614aaef8f11649d79b7a069f4fb6c9845d5fe2bd27b272365a6a515f2f65a39f361130637f62f3029ee502271d77499fc4c0e22eba75d3af2a3c31b737813c7be3507c9f734638ae5c641c45e5a722f869c4993abc8c8561a74656e1db2b74622ae72e754660e68764e29c76b60d19d13ef19797674764e45ddf45d9d5391b97adc16411edcd2162933a439d77a4709bfe104b2463c86e9a4d31debbf486cfc3ac9f5b1623e2cbb9723c755aa5f7960015f31bdffe50fc5b889527a2e6fc2ac0a69940da9f9fc9de9f0c35c43c717b6bb10b94fc1b8b426305e89b17c31411bb18559af9fd12680e68d80b05c03ea0f8cf57b6b30cabd195a3a550882bd496df2015b0b0324bc9ff95774a73323c82e0cd14a2185cf10199697cbe8723b90301e3d0c5aead0b75b0d1d1e5231ee29e2c36bfece82462d92af7429e6865352dc4d8515f24411df952add10508229c623f8c7618d65bbd1855f7fbe383730650f3b66e502abe682f76717757d5678396787bab929bb1620160f30b56bb7edce8095c108d982b0d90d254a1c56162a0b1d41e8e2ceb6b56fcc409e2bed9e74a22c902786444e28bea850dcc4756b1a15bb465f732b0c6d04ad60cb1350e883e5be81fb788652d79bb8064041b61374423f697688c0c10f040dbf5a48fba3379c3a46305cc0962042946f45d061c3b24caca97d2f9eaf764455e57f24313e77df16f9748b5f139a44b24eef1c2530aa8f9578f15b6fab244fe31f8eaaed70ef6b07f9c7f5f990102552a9c58736e36f85b7edf0db6e25e438356dbee3828f61bbf3bd9e9e48ba66a4a89791fc59e4acbe0f0cda49e6342d02f71c5eb800ba2488b3eb49add1f58877d8064f9ae6c6912e314a555c0284a37efd47d93c147b8fc2d584ecac7f4b9cdf07875d1b7b63c9f8d67666c89ccfda2b10a419a3bffd14dd2475d950c44778775a418e9582438a9ecdfb7b2f4f425d81cfee8a565fbb288513f9266ad2d4de6399c87a15dfef33cec485f5206ff6bf7f254650efb488d47c36cd3b2b94c78156594f0a6c93c7256debf7678b73a39b705043b25fd1762751736e4ec1814c05ca64a3a4b7515ff4274f80c3241a51937aa66ffbeaeda3d51d396a4803e26c9f1430fd2a44f4b96c84fa408915fd0ad5817e143cc095041122ef9bd37afed4e0b6d67d0e6ef28392eef7f5ee69ee505e6cc3ae4364f02419818cb72c2ba87f79fcebdd0537236b2125364f91a519150de33e7476d854607409471aaed4027cc02920651badb076fd16aff58852156d415547c953466493cc06b250c0e4e4426a0891e78d8708f0ea7edf286e05188f3f2a6e49321b933103b68cc92a82ac8389d33fac4231274105fe02dffb0e35cc3a2c2c5c280bc321343cacaae10e3e5346fb129034d8f30573d9b9442c477cd95eee2e8d0195525390710506146b8593168f76f1bb154f65ca86164f2424df4c97aca3a925a63b096f95ae711028709359fb9c9eb133ffeee9232b25d22c730f0943f60c36d6a24448d1134f9f5009bf56b4019bb027a46dec16dee0081c0d14cd7e770923f13773338900757e2f01146dcb85e6b16556f06d33ed6d3aa7c94c9a3cc833c03c51de3323fbaf0140929171ccdaac86c3aa403a903d3d20c2501043a09ed2000bb768285567078a847b8467119f3bb5d6e6f84da0240c63e9e570bad2b8634acd8156d39954095ec69cdf11e12a655f5c01f72373bdfe14086d76fbf2eb9d313480d7a58c17be4327c1176381acbe45ae2366aeb200c320770fafc95eb2dd41947002a86b187e25318ac2fabc6eec88fe3e0ff4a1e8b42e3e91c29c59f7b1a0433e25023a72a5252b3296b0bfec776d830104a0a9ffc1aaa64ebad00df9aa24a6e83c798193b4af30ba169a834b6e8a4076fdb2378e0ddf5214400af7d31782f4cc71d3b9d212512447b2dfa2bddd9166b2f57878721fd05f418ed7ccbef36427b35bf3ad6700f8532d91c26676e9e5f10a5ab05b28fc4e7f34a17618d0288ad8eb71a0e5004ba0b8bedc30bdda7898613c112ef5cf41669faeb898e19517ec8afe5378b408e225f8f555ce8c781456ec48d394bd33f63f84b3bd4cf928c631bcb9583cba8e6faec3be10322ccb3b0cf1ec0b23f20bd6941a078103cb5932f0ebb678d33b874d11b6866a628b2a23a18d03b054c23c554c26ebc1fdfb61b263d4ff90282484b038b9812c7343391f1004290013aa7838c7220f55870efed056982ecd949cbbb3e142ccdab4293e7d2d43bbd641916ec0cb4e2aa821d05ce80533bbd2621adf683c59fa3968d3b8818160fe93bc42b1e7de1c90cdbea47402f0d4c63c50056af019aad96c46db6b70507fbcf46f7ace60614a2ff056542289f55eba64f8fe9f895b454913a433f88c0ee18b00186b9a399a9e1dcfad4fc919987d8273edf2b02b765994a1d4c3415afca08854d32e4e29d46d76e832288954f523e69cb94609a67d2ec26aa6514b745204d2d137ccd2041a34cd350b4158306617b73b3dd0bae3e721493f64cbdb9d0a4fcc7b82518177d0304f9d7df7f85a36103c5ccb01b2a3933f917a1e1e21dc645145dd3a0ce520aa9478727e9ee6204ca2fe6c1f20f4c930aa94039033d816819657c71a30262585c87a6613ed0db230ea9780ae64f139aad337bd6bf58c263ad687d59f425daca12c1a5be4e5044b3e313261414c3f024a88c5e4033d07e968f1d0d82569d71b5aad930117af9deeaffc28403ea7929907aaad71257e7ceac1cfa65f066abf5e18b0b7abe5a63973e81cd9602dcaf89cb48c76093660b0b3732abdec65cda5cd28dd18c4f69c1d5c2816bda303077d951935551360d9c41c3b0e42933f10d535de725085fbb601d6af19d38eeb1909ea5fbe78abbd0a37aee864c7c10c26aad1d2062ffbe65377c6ddea0bea0a4d493c492742ff9453b2a5fe82473bf5affa9ff80ef211c8a3fb1b021941916dc84f20e0bc9d76079827d1bd4f5a31b2af30946db3248cd4e5ed2dbd7aad2c46b44fb6e3ea857464675645bcebebec4cf3094929a4c398fd1620aeb96d989aa7ee936a7d96db61b1462d78285e204dbdb0e431272d1fe19faabe3a2a05a6f04c26c252bb436e8dbe02d0a83280e7bbd1c1a1d1de2df4a052f229395fe8bb1075788d94e5458faa3fcfa6513b4f62104999cdaeab806a5a0aaf21daaa996b9db0e1ebb596b5bd159aea59e65428495b2ae89bdfac01bba9b3ded0e55780d4db34c7e8b079a13bf9acd0e0fb144b2ca4385a56ef01c192e9aef65abb4c305c09c4477fbd478e7215e5fc732a778c45dd36239c221d7427b4b93583e2521d661391cfe75fd4f9f3575957d137913cd9d801e5bf2b91064a59447029142200a1ad92235e282cee8c1c49266c850608f2d23265150ce56a864a99d14360de1a44431d38f3784e7724425719e3de3a0f1eb82f1560f98a690745e8f3c5ca2bd8184dd361ee2d7a61a262e5357c3ee999c3a95329b8a1c105f1672e42e8034940fc8a51a4ebded62c3f68aa82f03e2209afc9f646c108284a647348b6966799f623e9e2c7d8138ece7cf566412f4c2c4176854c2472c28c58ef9b48daf0cba72a3c118d3af6942a5d7fa189b18e089d4c3c8fb5a1fe84365f179254c57a31ce6eeb1f50922a7219620f5dcd202cae6fa47ce55a1387e128ed14743e206874052aefda55c761938d8b508075f0df4c412bcdb2b0e41f44ab33ab5924e4c47cd910c8856ecb1386119e9ef5f233d01a12e840da3d2ad05a0101cb358335f5c02b6b5bb663f8447d2c188555f5610ab477669c8f1c3862dc301987260d45cfdcd029709a3860307bde9f3fae6abdabd0f23b7080460d966667dd6e5eb98f841e26cd21a4da17abdfb08b7cce390e46c98cd7814c0c52558b338faf7ee09158166b03420ed92540f731a1917113f158f94f8f3e49089bf3b0da5ea5bd94eef8371a5b5cf63a6948c813e0faef07da5acd9a24a260e219576548f4b7aeb63391b6fd48c5341bd0c8be0a439e24abe9f7ef02da67d96a7ab7ee304d681e9741c89635a3fb067459f47e40dd7cb14340af7a82f349783b6564d436a43b9cbe6be68f8031bab1e0664fae70ce2252896c8c9bcde3c90e3c65503bdf015125428413b7718eedf757eb7ec4013e76bd02ac61a829caa1232c1deeb91f4e923025843ba4619e4ed16e9a2e950d3ddd85019e1982d7ca5fd5db9878b4f352785375d6227418e1071d958977f6bebaa190729a20c0e440970fa0b7970826e3c0b18f31fa3e177b915231364421fc5cd191999b1edd045a3166e6718f143e2c400eb30c3633a0e6df56b6200a56b9b88ad69f24619624059271405a544e4bc16f48b2eca60a8f77a75633db16ed8d4e43c419f3372c91364138f5aa55a2bdc80d7c7a64dc4d664998a2e147a5c052387df30d28e11e9ce5d397b773670ce25f0e4ce4189d488e150eff7feca6d6b66f67890d6644b7c2d20b04d950ed0763dbbaecd604b47c72fb0fecfc1e00a2a50a9800ceaa9b3e5315240626599810ba5e433e9a94f473e9707b6692b2d90aa0be1a583e005761b1d974f903d1537b476067d982d19452994897fca6d37e675c515d09480d574663def48b45ec6a2c76fc9d30c5e35a9e3f3c35e3e917c17c2b2e3b563f1d4b97275bca542cff8427cf767e3935410341892c4099df698d1be4571d9513e5314b1e2f5ce176584662b74b81c3829b54e5d695e84cece141b1fc839142c8601e5f110818d7650a14be8f6b28e1d3dc5f8befb3494eef146d0a0712065cf6a3a11de548cf0984e60a6effd152e1693d712c2e9407c37d6f865c170fc732920926ce06e822472bbb8146334bf22aa8ae6585137654d5f9c6bf6000e88b329418b5d165fed8243aed29c76b9709e61cac911cb57a8464c07a5cced521136fa4899f42c924ddebad6f11fe916c934010f472a9613da887bcf590b951e4d494dbb32174fe29c7247c37e4fc2ab1a43922984210a5ac0d39b96dd2a988e4ab82d2697fc5617aae2dd9f0dde1c11b31b34fde95c6a054c3a9c3f88621dbae34f745ebb947ead29a2968747d6f2e6160de1ac8d9d5ea40132d53e3cf7c5ad6f68d372613552834fcdc77cf26d512c64dbfaaa4acea6edf8df0be5f74c1e6be16efb80d6cce3cc088b9791f9128ea1bd6e8436997852e44a1823cd787b2a47f06df6375e058ac0958f5de314c858b1cb118f8ccda9040b7dc2bfcf2592a8f055acce0fcc319221c00e25e55774fcf508a780c11fc0cb94157fe8027283507f48bf45dbd0a65e475f7c2f934be1504f598447443a0a792eacdeea73b04f74bf52f5a18d8f7a8e440ee80eb959ab4082e28e23f730f878235520014f6f7507ee19b2e553d861b893e2fa31c6c4f5b6a478fd93579af791ff2931ea911ef8f294b6a09878d8be8a2094ba9c749fb13eb22df5d97328d2c566c4db93697142941bed7d384009fb592baa65d2f1ecd64f6080d343eba2c191fe84712283e09fab3daf610a344f2bd9b6fb250f7a3b91022ff2e6349dd12413a298fdcbf186fb507086238e0750a82757da5254f653bb87689e2e3a045ce0ef9680856401988f82b729e45baccd86da6379d04f904edfd6e70d04227e61dbdd566c665b731631299f171ea02792f242651a9b6074d30f25ee304fe20eaebff4cd02a2e39799e90206c5d80ba56fbd5639a08c050353c7e87a2f720606b05e975e94ad7ffc19d956996a0f339dc77a9c2daad456fb2e8113ac7e3cea8573d9c6652d309548c595f9495f3060bd10bb2ea4a38fb37a3d3fcb57a811b7ec6bb94cef21c0a1cda0090dd0f5e77be15fd51f83e08bfbb535e997ac56103e60195ba7c4251613c79f5dd7a132aa1975171af9d08d4d3ed4cfe6435ff052088f31d5954f05b05ed245ec572d19e9ac64fa9d4ef7f746293e0ddf792d53c358775a2529d832a53321f369f1f434b8bb020c3f2b1996eeea216b5cbce4503410c98125f7395277ad284ca68a0b9544d326b39041138a421111465a47762850b6f07003dd62fdcbc27c4b40d57c9d6ea60f6e6d866dc63b684a0f8a106d42ad0650e679eb7ce0bb20f2d5271c663de0a26a9a12a74648834c2439bff5199e5c8994709a0f3949c825b8b590b9b0a8ccc8965a1081e092740adac9a6a8747fad864878f2bd504ea39d3f976fb253afd49cf6b1c2814e64308ebeb9658dc6d426f7cb47372c3878a68e74d12d4c8dd0ba746b140ae87fcef9572de3358398b3f5f69ffe6029553a2eaf8e4daaca2450cf22988cdd68ace8cc979113101724940a360468cc7f9bc31a71e62a3d326f645d5c8ad8e225ad9141a7eee17638975eb4c802ccf9ae7ce1a088dd406e8c5ea9509766916fc96a07562c6ee69e858c6c0f604798df30b90680b93321f36cddc8f73a65794443578a8aed6def6867b6553c1104b584837fff70453cf96b61edb119f56fc63499e7a79d825c62f1ef3af67f7affbee8113f311fbf4e87ab10be0d18af44a89cefba50539546f029754f6b3864cf9647e2fe1b54458e7854624c25ccce17e87a63cbf5539644e58addde652a0e677ee7899237e61f160fa8fd8a97f08243159655f58852b9d9b4ae908f0a5887bb96966c035c388be3d36e0e6e6ca7d06429f978f77588d77f30cdf0b336eaf54bf461fd687c2d054c91faa91b6895eda84a09258640d01427f17b745bbdf3f4d39a15e696fd07532c89583d66ee7e8ad8f366f6a12537123ce3f3f96d5e47882ee2f3f7b2720d58e4ea3f0bcf2ff8d64fc6eec620d82b663211fc0ac39ff6f067708f1a0737ca0a9da42810eac26a06b5611ea0f03fe4c90f86915e5af4e5d6f77db3ce47a2049911b042129ab77789b34f57674ec1034093e7136555a99e546bfa8d4531fb4eec0634d17223256fd17be48a56fed19d576bfc864215306dacb7b40478bf83abae8410f1b95884a55d5e3e6165dcc9c3a227581b557318817b29a5595c6dc530703fd5663907b04ee6960d9f97f730e1dce079d23005df3f0809eac0c5229e59c3217a420005adca3531536fc1436aa6a211406e3ec15077a4fdbe847a54e15a548092ad2d1daf20b2a1c1e6046d3c4f47080ea930ec054a871a0bd2e1a1c10c0965e366eca6757bd561c2111e013eed45890e002941386b0ef359eb53e5f84bd57fe610ad1897ef9a20f55dfd6b9978ffd712fca85b628111989debf4da118204f5d9e8f1b84bc159e2a4bb9b54407edb80f064983204cfe0b7c4294ac2d34b3bb455ff0eca2c6520d6a66a15b8578fd417d6a582b7fba139c2b6b9ba1dd16c61eb5f2a644612d28da342646b078ff141a89e0c565943619e8260a68061af452a34c7101e2b5218b76c8e4ec4b74927497c0f13728a431d872941d6b39f32793cb2a489c560e6052c30992ccd9dd97edad6f7c282fa0a074a0e2a7b69650aebe6a35942defbfdaaad29025d9a47cc3f6c82da49aff112a7276c64d28674b75f96bc1d8c47149638a4160c67a0fb3514c08fe92cbec7f38d5ffe2a27694472afb87804772ac29a20b3088cb2a6fa79ee719fdae35d2962cb988a5db8931615491c5a206a8f0a568501d6d98ae164ff32d0c1c24c94bdd28e6e6d3731964f7a7635448b459749a25126a1ac91fa59d0adecb06cc57df8eca68db905e33b6c5fe59a9c9eca5c76d1f916ce89a2afb1be882a6cb28566c8cabdb29e9ffd38dc8dea7dc859f0d5b8aac226cc2e3d612828df802f2962877b1027421cadf7b4e44cdd0d0bf2ac0bf1e329f571fb6d67dcba27d291d6f5b0cc189b015f8ac695ff310c8a0018e18cb87f802eb05405ea02f87c74b66332e6fa1db0413cddd4449515d2f79b6de6402355cc04be4a44c36ef945e5286a3df6b69c7dae5477822f37c2157d6cbbdcf69f4ba9d3ccbf7e9f05e35e5f68ea7fc7536f60979bb3f00057da80370dff447c9cd75c23b2bf2fbba02f290b7d03b91780d797bf78d49ee6e62e56a43e0cb975f6dc8435cd9f56084b860f8ad77d528c906447b24a8d8e185f0bd81bd3332b78548fcd8ade6d073c7d65d92c4877d2596913a4ba2c1f87444040ae2ef616004a0f2142da24aaf9720936cbee4ddf24aa9428c1b83c8abc697b26a2a15a2dafc43e22ea736bd9c264e4e2220355edf6a1c94345c7fe4df19536b8737a599b0528f3e2f62de1d9662fc7740e84af7710670947b01df7861e99086d9684f02f220c836530d339af8948f415ccc773eccbae644349a874f95bc1036770da5296e95b5a5c3b949c782d21238bb97e5daacb82ceaa552bcb5e7e9609cc933cda79edc4be9f7c55115fce67e6b01aeda8a55817fb7f9274d9892a586387aa4d34e12fa500e3612f0d29b2f896dd39100744db1200acd1a4ce4146ee84c1493301fc07b99f17044172d102010f91eeb4b2aeab342a3f442ab2e2002ae1c4700451f4fad2da26df3c173d3acd71893685f5441ce44d142bc5eb712a77a0828a741dc3ea83f36273f22166f9101a1a2a228caf7ce8d9ffab5835b2f5d0ae81d9822d3b4e1f33822b9c48b8c4e5ca2ac26da3471f96149756c8c52315a383d943d6064a577faf7b9fcd7de90c44e9efd4be11a28ea46ec657a9f111d49c5ed23844ad982bb22a2b34fa85ba148f86824cdf2ae356a0fe3f141ec7d6ecf0a3a503028d4509f7823721d8da75fc32936d9703e4e1c08d0cfd259be839cd38a15d7d3120c758e908b3a63a1984a932fde5d6eef05f7b1caf3480c1f9956b1bca2084b2b873b4afa23a732feb93222d131559c77ad7175f2e56d505079bb475029d2496e9821af6a3f84fb65b2812255c2a6a1303669b0037b9223e1c1c5fd5912cd15da42b0b0dd5720f5b840c1c979ceedf7305c521f7ea160e20ba6f6a56319cd4709702aa131569281ce681621be4d34e8267344504cbf70db0c3439d6b84dc2c6a64a5feda36c064c1ef6c548608a5024681963a67a79cf5e826975e29aba9a86582cd053c91be9ff26db00be364a1d3a18015bb9bf5253cd0230a8114c0c9a0bd97e1bad1ee13be6a1a5031656eb1c5d26c1c6e8343451181c63ea5763b73ebd80fce06922146ef3da3eb998108e810fb850642820fde90d134fbd0c661028b6cf07fe90b67d35bcf7763fb550c29aca277e9495f458a02c5fdee65d29cc27e141daab6d12bd5eb8eeeda14d8d2b9eb675074089cb5fcccca73af34483dc6f02fddc3c80549bd7e4c1084c2d5976cb5fce2fa9fd1869774c091d130c6e418d9b99df0cf7df1dd7bf07b7bf1dc7bf0597f65bf59b379da945daaf89d425137efe8b39a92d31bfb26e312246591ed2c4d3986e2e0b34c19e219bb12c2026250ce1b36dbd9fcf90283cb67c7a04e288b8aeba71b3b789c93bcf6aef5d4c40fe2a02e6fd1031147a03dd4d6237175ca3661c66bcba2b925924cbe73014b9707efe38104166d0631b5713d6006195747e5a101b7f9d542eb9609c59e4262f60a1983bade73a9ec649cb3454fd7425ad09d0cc4e7555118cb4a78b4c0b231e45bcb7681821727919bab3c594c7c30e2a5011cad00e6f2846adaf1f9d9a1a21460320dadd69fe170fe3f777197a0c6a0c6160326159cbc714b2dd53a51c02ace377f0fffa791dc8b354f544335d1d0f24e75614ee82b02e1296c584d2080bbf4189e6472f0e36672e7b71ba6d3db203ad74ec6343b6291ae391b33d09506893df0b781d285920c416d0f43ef1e3c1df80be7b04e65334c99078bad32fc388be83ef05ac834df49d0fd2ca0f95aaeb13b006bd5127a8a6e83428894e0a67d7d5ca69a5dc1494072deb1cdc9776aad8eed1850f4736843f6f1dec10c2abac24f1a5b64e7ca1e8c3544ddc2ab40061c0f2e663ac1a1f5c99eb93f5cfebc1360ced9cb9f0bc676befc86850e2d31612abc4c17c3b64df1f0de96ad9f247f4900aa158e70de9005251ee35f58e04a287e49cad010d9cff65088f5df4c2a4beadaff737b076687df0711cf42eed553c2b69a1cac921d420baba017a15bf3a2f48d043cda7b9b11e95797d6459721a5acdcf7a82e2a1465e1f44b2424330e972d84197c64b0b80e0c435106a5fd379f7d5e99bd4d9e12b461825a5d193d00cf2b891eda3de1b612bac00042684f409b06f051159879f58dee3b723221b90d8bfc0824c5d567d4b5f4ba6a3b7509e08cb78ed99047ce756972a370eff9b32bd8ed4c77a97a0a2f2b6e02e15b0b919c21f20d10a9def30f3fc9484bb817e7275ae18a5eed82854d6d4fcaaf1ecc4616d9ef75d05a62d519c16925f2f974f9142870f5ace4b671c4688394ba402777a2240f7d6db4d1c0d3dae482f53ec42de284b3777c93c0c05d5d543797c5015bb08d6e86000636fc775c885bfc09cc122e1f5613e7e685886453138803cfcfb0032b8ea3cc3c641128241b5319b080ce5d05b5a1207a9c46712dcbac1439fd38e9278c59d8f2ef09811b52c67e9a6b5cb24db1a3cda299baa37db3f174868fa01602559da5e3aa7a299c89bff3a28e3afea14a867f73ae217ae2a184ed5381853f7e1649dfe2e9ec589693a3826d6433271e285a5cfca71c325d44e090e983941bcb86288e40857729579b97a60de94c9c8e0b6c312e59ab773d87e0faa294d08e0c3de699d0a2db25c9d879d13be4f14036c1e6feb1e1eee57b0cbbb1826068bb1b9c0625abb4ce1e99cc0dae9318bc7396b4a135c6656e1f7dc708b70c1ec994f64ab5de7f168d32612bd34fb9b016d0c0939ae34088a42a04c451d736ba2225793f908f7ba2c91b24910c5d3f7b81840cdbf580842f74f8b21b45820e8b7843d50ea0f4e3d7f7ced821beb0685bac4a3fb6dac1d6a6b5777d8ce11506378b91ac4aab5888e005ac9e9b08eb13b5dd3323ac40e1bfd54f3947d5018b34c6102a97fd41ec5786d6e05d62a40e6811b839b1aa54175e4b08e1049312eda50922b9cac22111163ca78bd11125b9311a81aec06f62b0649d42b4bd84928c7eaa2168ecfddc1100b1b5260909f29964f42618d6fcd297665d82aada099f791ad73b058360fe8d1a08209d8f0ccf2ea467e9fdcc9f10bdc945bfec76124f681d60bfc5c318891fe2c78cb4a4cb6638b3d20577985bd6968204fc032c0c6ca604537c0f60fb7d82fb2746786493221705aaeed8f686273e9110c5778fcc0578ea74dad776fa16581ad7433d42335edefa0f6be59264d3511a13c4962921a15947e9cd360a98d73c810e0fafa1f27b8e27e6b12947755430b6f2d4aeab45e8f8c49a0269c3934f29cd8c14c9ec6701394d5632c515f0007eaf86e3f4ecd0c8bb05c6e17978803c6a352ea06f71c2304832274397959e2c848cfe10e81587505afbc2617a708428a9ab7d6bdc854c453068caa321d7da92dd5e7f3917b3744aac9df12eefce446ea60da9bffda4d61488e557fd43703f25213a5908451214fdaaa840bbc0781c293df6ab70d0c6e86e09d623a6e55d2ab71d21aab0fbe212106dc88cd059943e4d9c4c27c4e13f796e846e0c634ad2ef3d633b47894924b664825dd145d806e14947bc0e361943a82fe91d5eee3bcc605d2f618a651e92308b612ee21d050803719db4c14b74d399cb649db42e96ac5538b42a151d090317e83bde0bd4025779f722087cb6b444f633d585586899ff1a444cf8e9ea7f9a2a0f678a80e8b7aab3b19976cb45fe113366d6f16be17d463d817e59d8712f260d4ac3d886826881bb10b5ce55538e7dfc4f0e9aa8ff7c4c79db5a70ff07efc91694ce2199bde44e9fb16fdca4e81c6849f20a5fde75d5b6e559a1edc667b83e83afe117278e91562335d680174fb0116a83237f394216e8e00eb3a672e5062de26c67b7bbc2190c1bafbdf4d543b7c097a42232743d2a4ee5f1d5195f4f7235e3e2f8258b137436974f36a45de44d745f9339e8a0d1b5f20be57f6f1d4405c02baa1bd006d79664c9fa648d87fbcbb52e53214f84a0e51ca2899ebc77a86f54d2f5586fb03aea6d5c1b91065e44d48a29a8530fc79d1d28550f2521f206aa57501c5c5dfca47c46c1f65bb526912170f5e83a8608604e9546df2ddd2f8a0e2a44b8fa85585b812f9f5f56ce99b198f026552544e12ea418bccfb3c44e434cc97b01c689d42bd4f4980b94073da813ddc74cf93ea47354480f4293686e3119dbab11e3e8c2837988b7b3807c12c3634d001574c1f72b64e22c3f1002a03d3874816d85f055e943f6697618496e39255862f932039fbae754fe9403a72337441946976e40c6a03cebca93f4e2b8e0825ba3486d890b978693153e529cd87d88b6bb027cf8fa98626d23138c1934d6e47b7a7c28e174da161433854cd522da934e1eec3f275b37a1d597e3df74f17b2fafa59721d595f5756af3febd763b0de7a69fcc1b54e31d344237271b4b3af0f3cd7a12e299858d756b163029f681e5b5864e6fd5d1ea627a385e1c710d4e0cfdf8d5e8d092b2260a748d304afcfa937f71f5a52a3769cdf0445214f92c0517feec5144757857045b4516f088e79658051c4f453419a50efd4d166f52d49510433b5965f7cf3caf9f6450bcb5c392cd1ce48ca3e14b266887f44d4b4108647a11d2af6012b4c82f19b644eda671ed5e2e7760edea1996e109ac63a39d0a5329353eec5114d60304b45844f82f003f49433d4b2002dc1b220db0cd25030b347df360206d1a2f33062d74ec28bd607fffc5030fae1d1487016ca971a1f1f917b96530433f1025a7067845da050c23f7ca71804b6191ba0a98882b06bc92aa00e3f691b38e62800d008cf12b4fd8f89f0281b451488eee597c04e79c626316732b2b4464a89e048fe2890984d33e2a8137c2f7037845960362e4490602500f4bb59bc891cec6f12907bf332e30c14ed4f1e9c31e2570e735fcc185a3750e51aea2bad7e3a24d63875b2bd29387bb9c6791b4685c51269488dac7164de29cf281fd2958f06d3dd8290235beb1833fdb088ffdb079b2f6b635460f071ab984549870810620e21ce5bd22cfdb31dad13db13af3a71570c262a0c0579439a0c75121a3736258b61d215d04f9b96593dfe2f175aae297045c2eb76c4abb6118ae4891d6be3ee34fdca82de64f76ffefba7adf7cdb804a5af6129e17e43effffff51a1d3cfd10ee87158cb1ea0cd1330236766f96e026465e54893b4f6d561a5404ccad234254fb1c6212fe021fed4bfa97cbfb989281f625682a49ca57460a240223ed202ce949096496cd1406a3e72f81ebd325b3ba65fca54c2248fb0689fc5f77d83540f33d81767989277c7c68959ab19173303c0e3a06511e447d5a54728591f3fe724c7799cfa51837d444c833b6e95f1ac21b3d399d9021c20f59e8440dd5fdb4509b4e75308ed1f3dd38a63170ffcb8eb461c2a1b9cf8d84536c78f851a3e1071a0b073394ba0cff9894b3950ca2e7614b4b56cb7d784140ac536e43467e9521e20d8dde1b9c010b4955bc184d460aac13dace8ba30d7e4cd8981f1ce08306f3c357d4b62f5920e72b21a4786d7057de7d3a466fcd8c7285640b2d1a51454b9b1302995edce618e450af9028589e30274c1c57e2bca739bc0fbeb210b3fe9ac0a9d670d075ba323413e58f145c0416112264623b4062c74a45ddc3a924c5b2a7e56231e1315296e62acb3bb5758eb2a8609917c9b32dc07244f9f65a31cc06fa1261fcb63814724e020a7a5f24ab3d452cc384abb2b4dc8873322d37a78a0f1c2c872c12156750265ef8f823edbbaa7b87d0da134d2a8a8b6eb4c5144fa006770e69bf6660f00c3def96b2d58c0114f85ce6756c9a80161585c3fafd469c0bd32de60c659b597b192d75e7c3be7f9e69730626142408f632addb2ecdd8b3f2124e70c771ffe7d44d6f108c5d88cf2b4933f98067eab42b963b4e345432702ab6c789aed8c7612bdde717fa4ae4d0c39989474e00f061515bd75f3167ab217a0debed3f86cca78e4094cc8ab8f11b8d48d5d88060e29b91f583e071e76115682174d30ccc4112623c772977413a89d6d32dfeafe6592cc5b8e94090ec434db7f863c098f1c557441c4986ea62fbcf762dcfb31305825e3197b1b99920df4f935f0602a8069c2bee2e9997fa13cfe8546ad5a44ed7645661a8379d00cc8e2f08813b0e37c32a2e0552cdc26ab1e814ba1ae44bc5acfe910502f2dde2385c7cfba4f90cf50325da267c0ded1689f7ed783e03146c43e52d8988c3de016a3b2b0e3f71855da316233f2f0c3b143d7710eac718e41c5c1e2c0cd8bb4a1e098ca8c06496a8f252a528ea0796107f7005e40c07f4853c0e5e1c9aa16c8b83372a8672aa9d56518210398f3bba8c143519f79a11189cbd21b5c89f6a2414e9ad24d09c4e8f8db081a75e681419f3857bc5626930dabb44a3b8144fe9377646f3a2dc37b756dad756fe81a992af47c950cb9f08622758d26925841ff882df7414c8ca4b7ab1241a0f71ab912d515dc710fb0fc68f69635d98991a884194bb6c2867824a2cc2a5c25ab240e95c4e0c2278741bef8d4c02798d95ddcefe8698afc9eb20a2b4087e4ebf7699e063fd81f9a343b8ff9d203764288800964cbe35c70c4d683fa4efb6d10948eaa707f844ec79c5eedfceb2dba26143bb18abfc0732f1166f2af2d61ecea36ba52919e1d9d3f73934c458cf675e8ba4f61f4d937256490b20b9b4420f375268a444ea3be528a68598f8f9ba2257464aa5b6ff40b4500f6c6c5a817622af11ebee33ba38033b097e7d590c1c0fdcedd997a107f814b1346a5e03729364ecc36eb5ca00dc8803e59cb26efa42c6f28986374c78d63066b76553a9cad5cdbe17db709382727c8d3151ffb540c3c8d05bd661b4c4a82f54b8e9fbf736adc34d5f67dce537ee39dd5c4dc4c35e3060ae656abc7f3ac2ef9e8f1893e1e01900ddb2a1920dda38dadc6d0eb79d52a4ebd99cf070fe2ca18279ddf1e5fe7320229ebcb15ac613b9867e846e52d1d20d38bbd96401970ebef340ae7b4102257453b5ca08f1f8e712cecf18df84380b4bc1330f447b719cb9119c1a8b1106160e2ccadea40af93cdd7132ef718e7ed0bd428f18139a28382ea1d72bc24bd717ff8fb180450d64131fc72e96358945a793579015b11820a66a06a8109bd29ae226d9d8a7a04466933d773d13cca50d5fc3d1ef7780a801e102c8028dd7ec1cd31f2a0e0f8879a432fa4bb384b575e7988674a4101e9bbd389f489e91cdce09d5249ac0602a141537e9e7881546efb7be69c5cc808bc5a483328215407826fee19656322c660ad1cd395fc34a47ad58df2b3c29ba9f3051d0245e550259ac2570f4f9eff65e39ae2070f888ed6ad1dfdc7fb1a03945fe26ae348444547ef16c8ce2c80611a8e5790b3e80cf048b87eb8a8c76307aea93cc0a3a0e0f48edab2ed9c27ad05402f8ffc9a84dd825bca45db8b6dbd134b9670acc3c24bcf8a938477fda94bfcfa509f730e0c93d1a23e88e2825d66d7374b18343573534b912ded6c9c88e8049deebd74a540c4bd64634c9a537b414e0b34ac8580674680152a794ac01e62d40b5b568b4a5159be8274d9927157e67c1a36d8468a1f64b9f5774f28f6ade1236894f680ad00210031d21ed0a84fb501d859f25e4d9a076c7926809f0400b5c3662f699a45656639b3a0614f45e8433b8753cd1f84a99e45c3941a473bb3d080b56bfbd28dfe00843c10ed5e5d69a894af8f8303d4718498d07ed44fbb391eb88cda310181fbd58bf18c910d98b07262052b426f24f2ee325a6d641dde9c2f2d0ee93ce4ba53c7153cfcd35eb98ec7505cd7a6cb1e1918ada128602fd1849df93ad9cf321935cc3ed543d07c7ef4bb1fff848f1120c93dd96302b8d0973830ede87caa0a1e81b61c8865eb7808f339b9310cbb40ced42e0458491ac377859066594b06707275096c51b294f9d725890b90b3ce7279635fdcc94809a96e5e495af7a5e6de55698618c6be88f2cf7f306f12c5a7fe3a1dbc67e49583cb4ec6d1a533b29f806e18b083c83497a506777588ca9855c6cbd7faa22c06a81304055079ab49bee78982c7e735de210a0da9c7244b6fb8a7252afacb576bc304c65c63c717994032d8452acb92db97824cc4c0a22c69980c77989d2775233a4d1193e09498b53b40c7f27c1e9ac15a87180626e4b5e4241cab6f6e1ac6de87c4476b259a37d0b9fabf2a6ec8a9068ed1922ab660da2a07ff01401ef73144f60ff3492845029473eebadfb0492a74b56c2a570d04dce8a284bfb2aacfc5b5dff9383e4caa2ca34b8b98ba45290eee9cfa78a800a81ab7dca54b8274e8098bbb2d17777419e88b573da9eb641c09a6d167c0c283609be2d3803642a95887ca32f445e70bdade830c5effff23ac01d312f7bb53dc0f88710271305e2d6bd081744066a31a3b5e8b25509bcb544a1aeed6de3fe4d9527caacf5c39410359cb395acafcc34560b81a44ff4867635ebe99bea831db014fbc6c053e99a66cecc0bc8818fb96bbf0c0613e7c778d357d1b88fae6d15b4f6a0cca8b4fe024d96bafa28f2375f2607acbc423574a798e78a6d99e9474af68af02d43f707889e9ddc1a27ca1ddfed373bfcab7f8cdf5fd2b739cff97727fb0dcdaf5ef3b702bf6a0a01b64b8ed15c8e0cd0afd0f6a4a4f6813184f61036fe23f3191691b451af77a17c26c4e30c9d78ee9bc105e172d66dff34dac39c6980a8a0badd1d79261cafad5d397d95aee43f20aaea378f7ea943bd249f65b6582cc2b30f943e83a4bc93279db0e04f56b34e07d9f7600a4daeabeb72b59ee421daaa9d15a09d779b711063b18670e6ffd0afda8ac63f7ab45cc23f9e4baf07f546627856354f0aa85ffac5146a0a147206254cb07ee8224ae122b00fc321673fdf9f5889d1646da93b004ce3c7c19e5f089c7c8180ef80a7a8862f98e89d98fc0917fdf38a3c49586e7f30bdc52323169cfeb1832b26af2e8111bc8fa855b3bcbe272a189a8ecc3ae5288ee2fb88565fc222898bfa53d86311ce9223688d64e53ee12c2db3255c699c663db42a4e7ed7b9f8be9f1ec135773c043c6be012628810ecf23724a06abe33c8ae00ca94bb25f7c6fc36c5b08a1e093670c7ab9748804844d6ef13eec61ae3248a456ece9947387127991629b463116bd730580abbb68f8c98b876f33dffbb7663495cc57781db210a4c3bd6ed32b920dfd0c841ad9cbf9425567647fa13d8db50665ad7f0db9c1d481053917ab716978770a5f72e2d1e026556e1f73c6617a2ac8da780f78cb6c21dfe55d6efccbc80b331dd613301223dd1316de82e65eb3c10678561b72b8ffaa6c3bd802e20d13add675ebfb7dc8d8134538b34e47d13a05682cf28d8044df20070bbd45d8ec49de31954489b8f03553476f04bcc48e5642c2ecf16d23c31c37b676e3af9adefe3b1a859b318a8405737c8678ad11a6ce23e84a4dfb3dea30ece1650eba8e4a5ae5f67213727fc2d47f4d8abc8ab4f5529404833f44dc7022609be02da7d30cfb7d0bee592c2395abeb5ff9eb8d2c0f48275ae1ad71b4adf17bd69972c52baa07f0046142ffe6f3ca164133c6b6b3328adb14fcd6e649ce1017758f5fa680fccc52b5bd40a6f99f0ef3321ee9be8061d1052609b084d184788cc0ada9b9d88fc53a12b1fc931edfe98a433c4af65ba0cf9e1a379b720eec3e68ff9c3aa5d86f4f02efff08f50755def32aee9209b23b61fce2cd4dfda19bb59721259b23bc8cf8b5e7b4c94be92f548fc2a49042b3de06cdf237f5fe0b653a90add29b044b5e1a400a5981a4ed93d973c533a8ade7175dffe071ffa115b4c2ef9a1bb23c87591fdf29cb49a9edb032bba7224bf32305244139334caf04002f781ebf5c1f3e950dc0416a006ea6263727ae1472003761e5337911ecf35a28ec98af6b1214d441b175a3318bd210c975774c70707bb2d0f76bf3156823990d6bcaa68d575c0645d5594186d94b3ef615deacf34378566624298fa10438bef394c046236e491b426426087aa15d8efd94bdf6eaf2b595a56b8775841738eee7869b94206a5e7bbcd4668e58345d979b5c193b654b2bd5c825e22cbbca3bb9c9c2b623fd09f90dba189b4d196bc0b6b0ebceaeadd31dcbe9a7f3e99f09bb23136b4c969a9b926c8bf50ade45ead1b2d9af51ef82c47d49b296584c1540a15d5bc4c49dfd536baeb8502d38e96d18fe158907595dd4e3bb65bad87e50c8fb7aa814085cca5d0bb9b491895861baaa9162918fd503e567061f3ca52f2b2edf44f76949a0b8c8ca24595a3fb488f993bd4a9c5fc2c5960a4255cdf541cc7ed8269c48b3d04b0e11388bf1684bc9a16d26ee23140ca0af875442aae40e42cb20d09f1b1f1f49a1429469c4d71b32486fe8f2f1c6101834d93d2d4ea3436b96277c02b4ab3452975f2f82daf35dc77e25c2ec2a5d816d32d08e8b088e90fccca105bc89ba5cc52c9b902e5b8afec8f2032449b8e0a8256a9a191eb672f4033be5ba5454e2b6cc37748554a0d3b6449c23c4fc963da43e08612f66d12ae0b7065a1d190240d95e1d1832438b142a91d67f7926779de173d5e605e0265f5defa47fd7da1c024ee006326e9249df8ad7e42fd1d5c7789edd09762748120542294614f5741701c0761fd31e703dd8c441730d849859ab4c0b7f46311a0b71ba268ebb285e8f2e84ce02982d81914bf0201ed6f841624ffb54f5f277951210772d59cd417028c02aeabe63f6986d5a31d48fb8fd8298451f7af956c4d94d88cba1c2d08cbaefe0dc00745457b260eacf5b430077c2a23d9990050f48cc63088dd853d0b737c2e76e3618cd7792a3b5abd6691f3ef07c5bd4e08d5884b3a92c570bc81968a2d4d69a384a41573a190118926fd3bd558f06fb89ddd858040b7b287530a315900c56a3ab968af2e3daca79ab5ae2a56d72b0ab7594b996c7271b305ba0616a2337e6042c94772b191b6dafd076d754546f1b3a9bf5e590da61b7313887a7b3344f1c46a599676c4be8765b910b89cc1005f463aa08e33a0090330d2029caa66c928bcddd71bf7cf81a8505bba4f444f1e48d7e8757300948c1a4ed160b4840ffe912f3fcc4d84f977677614f817a4adf46b165cd74d5ff970b8edf1ecddeee05e1de154eb378e3fdc44df8304851c7163580ca95232f501042e170ad07ddfa69619bf2f1cae6a7f7e752513b5410d8aa170e139335f120437e2b17f7be67ebcd17b836fc64a39485b8e6b67485952a844e89bcbe41e7383644cc5101a8218839a878021c469efef01a833d4d65efd7e2ece54050380a07e4bdb3753e6a91ccf36d56fab37e44902465b106718e09496f84593e15024491689a0142b710bb47a5e5f9a41f6e66ce7a08ed4069b5749b63895db6ab628d63fe550b38f6e983520c25dd9026936754b0ba62330b44e22c0e4584aff060ad013ca325c162932a0d933baa3f4c5620cb0c2169d9da5c8096a6bdb25378ea76c47ff322b4c4ad9bc7d21285541d798bad6407c6749aafcd174eb09c4abfe33e9df7e516547a1503722879eaa802144367af92fb7644847873eba563312cc18220ea7bc9a55a0aec410b675c3ac95d8dae92ccb6bab41e3d4473bdac001332b5f11c6215b22ebfb8179d51c946b668b7a18b98a15d9e211ab3e24ee9b1b5b117ff48a7f223a94c7413913d19112d33f02d2f5ad55ff9d2aa7d33744d71f1d04087e32e3d23ba161d9389cd42f26ccdf2b697c5cc81a1e239a1f76acf0cfe8d82daef57b1fa47ed533fdc25d99eff926e0036d17cf6c0b5c74b6edbedeef3645b284158bd426b08b48e06947573e7078f0cc9742dd8241d24adcc94443abfb477837adede58e87872bc14506cb6d04b3c5fd8dd23dae98dee24e412800d9e54cf138fcfce8526063ffb90e637fec17cafaf52e3771f1f8fcf385d16f324a188f5301f97a287ca4a6f8c275d74881ddc3f154078e488fda3073ad4f9126b4c92de94b2e19629724a697c4d9af0e21db8249ae010be1737eaea44256594ba524380082822d7aaccb242daca5ee9a72bc4e02d3b3a7e4b8076ac8ec77b67af8f96e3d438cdebe401cecc261adc5069849fff746316f6fcc6233b3b5edaae92220b66514eaf65f02c8dd000cedaf60670696a17f15a0a1bd09c79176b43ccd33cbfa3996609927481b87d88e0c68b390eed69a33c090b560d6a077dfab7d71949287679aebd634aae832c954777459d44a879b6faf245516a879b30e2a1d2b852ed92e85006d0541e518a256503f5b0440f2b9d4ca9cfea8cc06f90055ca6802a898ac3c4b194babf89972793a810b4600c17d9720d705fd7176f403157b8b8d7be35254fa46a27f64cb8cedf195ba8228e98dafd91003b622cbcbc8feff8dfe499e76fd63a25217283215c61a2892b4102200fbb2605f6f80bb9ee61cb2539b2f493bf6d5aebf2277633b575227878355a092f144d4096e5d7949f54b1bed5894ebdde22cea661a4e3125634b97a4da589eb638410e346c146917bd6129c7e3b871417e184e72399b5be794aa66f9b86734406f6f085b0bee623596cc586ce7f1c853124ac28013eeb3c644db83161f5eb3107e3ed34cfa9d45167621d88b622d571775dff6dfb307a409df12fbe330b0f2d7b9d94dab151ca7b9493e74d334744ad33194aed93ba662421a261ab12bc82a26f4f7c6d9ea2fce1eb07e2d6be7a4e705dd483e9eae5f14193f50b01c5d9d60499d109a835ed36c6b3e1270ea94aa75905458ba6904d468315bc975b6db77319064cd943a194070c7061f2b9ae70c998d8f8cdc80d513b23b228e5e563760ed08dc688b58e55d702a06a08264b25a90283ba9a52b492b16575105e39c6b2ab8ca70461bc15a5a5d0110bb93b12e195cd5a1f8de55c1d4022861361ed5b4fe0d00e38b8473de1d13c4cb058628dcdf1a35ae1010de34ce91dfc90bf9d6f908e78cc6aa9f65561981ed09a0ec8a90014ad8d22dd2e76097dbb6d5fecd1103bc7197fd77eb6d4e4d4797550a8907a06f24172a04d677d6ba5e41f02bc69e07582e8b0c33c084c7c59edfa2dda1d51a2200131949739084733164a38febad34bfd778cb6cd5619bdbc07831b20f8bfa2f29d913aa24eaf26520ba1b7beabf9e622f03dfc641e24dbfeeeefa8830c465766ab1c01413eb7b3942e7070c8d594ab204d2bda3dfe45e756437337a95afb9d668051e09f46ea142c6800915fa0deb54c20be57e63d1ae7dbb39697c2b791634d71671285fc460b2dc14f6783f27ee295b7eb01b2eb44de22002712e0905ad2899015d2739feec6e408663d305ddeb7c1e726eebee2c0b204fb0bfa5fd35ce809e6a9a7cfe37d47718113f31b360d8bc157d8bfa2b004c713c288659c86166ed5f4a62ba40410eb7b13a6bc2a81171bbce1d052bd05d206b97e86ceac9a20738a5fa8f039aec6fa2dc468f00cded9f5ade5a9972d3ae44bfae3ecc487f9a09d5a3f3ce97ad801046e6d5dded461bd7f58461eef8cc84e68a85099d76ea007155506f1b07189f62dbbb84b7f11eb700c851aa75e7faf748716bfa5613915256c2e793cb61fa37d32a2cfe64378b68d97e0ae5f2e7bec78d365290a8df5d3527a5c3f76e6ce6f6d8368a8fe4533ed31cb0fbfd834cc688e66cac249cae3be78005cbb562214c1a3107b036e780ad9a9fd038b7a00697510bc89af47ef4549c6d61478f56b4e7c184f9b246a6f16bffbb5b30774e1ce03d23af944805c028313ce4015492cbfa99004ab4e2efe333001af9834143d9f3f68925ff9fc1a6ea188545b686e246f919a9d1b7ca3aa57526aca0094e9bbd86ed5f689a9f87dfbe6209a54823b02977e6db0976c463d60b537bc3ab2dfbad348a3e0cfea25416ccf8a6f53aa58731d44f4f5cfa5bf7503cd179582df248d9044034f92756dd8405398a9ba6b9b7f8c8177bb7fae81b87303f1e2e910988bcfc46e02e8bd19564f48e1bc73042aaed6406b2728ff80c080f3ee8408269f20048748866a6ce32868ed6285b04d252ff2a48a8eb3ccffb0774e6998da9d7e65e68929abc9897820c35b520f5abb2001406145b511805871a5b5ece5313534bdfda24500c8ee0cf09436c5e56f5820ef9038362f18658d7b748d01a046cb632b7ba3f009019eccb9f2f8d4f4d0450741697798b62bdf02ded8c021f026168b880a04720060994fe42fda22d0342e707815340d6f6d559bb111070db00134e4a5589f885b11667da3a91931fbfc05921c24060e7e665b06369c77c484bbb01dd5092a98fb406913939faa00fc7025872b526e17b0629d7a4250b84b698d8cddaab4604b6df6ca81959077a18dca65177268ba0afa52f158d2d9af8f9c211a877ababc904abb090bf4bf30e8b8e4de7cdf411b69be6ce55b190495ffb459079c702e2b04a8b96c26369a1bcb8bbaba45bfa415ae3127b5548bf37b116415f726bbd794764260c111a3342343cc9f9feb87e4384561e08a701a299d50e96e9c961520fd8d3eb28f84a863fc57c48697a90530d2bd4c1bfa769ea8d4e683918e3abdca3409554827a359323bbc1fd3d6f92adb01ef39d82991a706f29b1ced99f9aa64ee4c0c3615df3c8c81674d0ff60f46a937d6e84177be7e187d00b8c49be99709c2cd52a170822190f7ce98f8ce5bfb1d53a8e01d44b880ff749ec1b33f9869dcfa6c4b242935e621486ffcda79472ff4824ec1592845f2726dcc766ab71a615f418ac5d812db31ae546634ce06a9e5e96d5092e794327e09579f73eb2d290efcb60ce6711cac3312dfff8dfa757b579d34f6d45f0041ee06f5d27d78b217197208b18863483f410e50b69b275141296b7f1adea2a36822173a819097dd41dc993af0ef19c022f61166dd5c681df2a9a32bf7ae2ca91f65a345ec38c5612b886148de48c269530122e556408da3a671a1bc1589714e32b097c480acfed8aa36125971be91ece551d70fb5f0fceb2ebe1e0c50e67b0419218e7c291e27430226e9ec0804b70d3c01e4db5a5e3f7a357f05f6c72468ae5fedbd3bfc31e6ca0dd05e4c22a11791db7d92bb1aaf601603179b1e00b721e720d770f1183d6546c352d9aca1b433588d1ed964e0cd8acd2019f874fe7000d6af2e4db53572de40f58a91f723ec92191b1985e85a1135e5758824eb4477683c09b393412702cb4270cb25ccaad918a291bdf4e3324222612286a8fa3eadf91a95132e7abd75c84760cfa1351862cadf178547b1ad4d731e34f161ac29cf32f65bd50de4de4ada217621d000b7f0662edd11a1ac46cbedc22d33f88cb335e4be51c9d4f6505a695b32552552597b773d87fdae0c462ff8bef4b7cfb5536d06b550176107293bbcc3b65367736d647cf294316b77eb63b8c3f0946e378c8e51cf3b3e93a2baf294fb0694a582ba2338c851059f53fc887c259c59f298eb4ed5014a2d80b1617fa67cad7e37c1ec1986a81244fc375285b539fd712648c00c8443e60a74600e0d0ef36f6a2b5d0f1143629c8028bac271235fd1d39eb059d4eca815b02e630f5c7123dc1bf63b541e4d088ee818652f8a46e11688817c11f95d0e60be9219eeb7601cad2ee7d9e760f32a4b0c448c4023a15ad1552716878b075f89e9b9f8e0b23939f7df686dae6ca2e37daa1e859a93be5434ead5ff4d67d1aeca5c387dfe9ee103c10ea59ba27f11b1d045bfaf19c949c6466c542c342f59dbe29424cef38e42c6b00b4a868f7da278721554ce8cd65d19ec22ab341e5bbd11dbb7021687329b94e3fa54bf7f31b0dc5009a131ce7ebed716f34da379bf59be310f9fa90b04a21c3629ea98e2698be66e865176d31b64e611e2ae6af9d0923edddb8b3a33640b8683e314605fa62f0a69cdf48cc3f548a1415e2564d33b467472977324133070b8f7435ccfe0424830ad82f913507bba94ec93015fc3e5e0ce7c4f24bc01f7172bff47055d33d0042dc76899bbf3042091c8a249fc64eb8cfb11ccf3c8067ccaac7762bd4fa102565cc97b774e185c3cf6cf4afaaaa89d0571ce7abf26bafecba66315156e6d8d923676a8bd55be97a8382fc19a3f8dd9a08d21846272c2d9fffd1352c2e7814670937404303852f1e235856f5b0404a812ce943ba20f92dd1011318b7de792b7d84aa5ccaeaff87d7ae855f0d0b465ff19f9bd74fdb548ae5273bd7b88e5828707b3d36696c2c3ed0b483570134794ad09346ed83005d290ea3c63d58c3508b24bdf4ede5a6395ab9e158cb2ecd2ecc9b84306727f831b4248f84d2641e2b37aaf8190c4bd25b5160381b11e47263290d0cd48f76f91c0818d4f85eaff72cdf1b63ec26ac1ca29913d4223368e4fe17ec84a2bcd81b36b49d2b64fb035db96ddeb06e1e8830e9f9c5e21f4cba95fbc24d70ce1f69325a9e2b861fe7bdf15576eeaee1e6c8d0a35fc4a0e9cb77b4017bc4030ee28022d6b3b64876b3ea0135dfb027b3b4fdb328f58d16e75714365a0ff17dac645f0d99fac4919d8d8028d18349b8483cfe9bb9eeb688c776e71fa846fa4737faa769ce55d3c225ebcea0cccd8fb0a94ffd13bfd284a863fe7b4c0cf444474fa92d9132454cc9a123425de96e0bf3b92064e0e1074a06295e38ca5589069005cb33b48f130b570a2919e5922884bb4d7b105ef811dfaf8640fc6e5cb6df2093119f029bde950620380d6067331913c85beb8bb48e6822b10cbb0ffcec2c84256ac799b12269c6068de2d4426d8743ed5cd1e74fc9eb93d18c0dbe20bbe671123f2a38ee3347d9eca0c2d36ee0a045a9615913f0c92421a6bd081fa1f3704726d00ed658755e4e68373c0c2a56174a10190081d7b85c7be2a4412b0ecdb15a728fa35bf5aec02ad6f6c460a2b3cc33a8b83bc607e89eff7405ab09eaca0e16c3380307bd733988f3dfb1e58c1b082f3a17c0489b289574b288054e37dbc907c817623c113066f262cb0d845ffb01ca7712dd83d1460d1dd55f2567e8a5a90de39c8142154df7b10f0ba70832a08236c3effc16d6c4b1e0522e4f3b2f18c431b1abd4266d660e12ab0a9bf098f04c5f48e17eb91959ccd309d08a44ef596423b48b6c385a7e9e56b80637971aa537eb4ed4043c7416298a4956a4b11425ed3e7bfd8b2380bc517c233da779efc6cba7c447effc80651527323734b4b924d5fb328995c12269bf0747e2c6405dd1b8f952976a464de668e4a1d08c11a5cfc1873f60bfc1eb24012b89457a9c8c714534ad1cf0596d9424764be2b4f7d501b324bda23644a1868489fbacd8c5d8b88570da309593b9e771a97b0448e40541e0321ce19b4ece353222cc8c6f4379d3766ecb6a490cf676b339eec7868397bc3379fbe0f58711bc6ec843dcbe6f92faabeabe8ffe992fe8a4daa8fa34929d5e88c3ff4bbe4e24ab036c63d86e9989d802ff1abea8153e9c02225a526994c29a2681d90c1591c92f2f700ffb6927f9081f9ebf2fa104c1afc87b2d2b8759843a4b861e3d7f65730deadc5c05ff3467a706b3bf74654099037657123bf92120418989908900e0a540b141d3eb22ae054b405510daf65211229a7c70e29865b0c217612c1ba4334e28e7eaa7cf56e776566558ac7dc367d2843d106e45d30183204102efb5e89851d384484266783fb57f0d6941a350e47e19ab3ab9463214eb9729866e81469edd13469e49be20500f9fc8028978c3c4086b0f91d0b29c23f500acc3dde1d98e0feac0142051406f6e91e8d0662cf31e474ef72864d61208feeccdf58db68d510eeb441c9a9e11bbb9697cadc5ffc7ecf85226005673df90161ac486f98fd1e6b66e5035fa2d0a849b3d0edf97d6aaddaec626237fb6bf912f8484aa1a10585b0cc292e954f7a1dabfa79aaf14b168c2999ef795feb7329bfb1cb37a0c1f778af060744943e653ca419feb622fc227b7cc796ea36bd571789e0a52fa1446325a0de7891635ebca79a64b06403ed1fed8463ee257dd290f63e955b056a1467908701c28f3ccf9491488f336956c26e5f0a3249ad0e2b0ce341f6b20cb40c0bccc35afd8090f08923185e33deabf188c0be719bb294be797ada74d0a6d8d6eb58e54adade678bef4f186a66eec8fb84c0a105f110405fd8d59042628b2c4475d54c9f175c82bb0cee70ce4c6db68ed21268f8217888e4306f7a8aae9baee10f7f6b46d6c54754e48e7dee340f0e6d256894f084916b8b266e298fcdf4bb902d3876219f5c50aaa3eb3e5af6246cf07a6f4bcf5882c4de8a6c9f7fcafb8d40d88ae8f610d95a900cc941a61350b51f80bb2a5b9e52372b27d4bb3f8e76e14a20c63d204ac167ae5b15d56511d5b2f79ef44f58ce41762d9d143f5cd89247048df1a1c8b66765735a31ccd4195e8e8dbf5fa4f208dd5d49f48c4ebf287c9fd3398d288daefce185acd29fb58ab39bc5d37c8b69219fa5547a6919c0f1d034fe56915a632dfc76fd64c6cc9f1df4638d21299d1b766cf85374d4b3a7cd723fe354928d5d744679f8290b40c15e17b08e0fe15f913ea2eaceac3040f61fda36d0c8a6afb16c13a2c3c703951941a52a01e8ae08a6ab260b2109aaadc122c4f588bcb7c699b459e8e86b3cb50a72b43c9459c182ab5ed83af0301c3a38b63b3fc3dbafaee47d4acf54bf719831ca9767825abe7afd81a69feab0d2b2b8f11289a8c8e5f7f418eddba2654823e4705bae7b1443c9cf5a37aaff53112b4f74b4fc538a5c32e8f4ca3753229283a69dfa986776b07824e1ba27727770eb243bd1e7a878afdd470d835328d63d5ce768e86522ba914b2db0648b519ceb641baef43cf4114ad24b26180bbd2d346445e40164af4b7b17fc31ac4dcb0e8a839612cf775bb37351c38dbfa38d0f3a8e7db0f92d0d349f83cb7bdf67e08e6322696d56c50190d0ffa5e16924c3fc8fe6fe70bfb9c9ff09775074bca01236b90d5d3ebb892b29737288e43f7c2207b81f108c6b35b89af5f02abdf24927fa9b41a67c754d96b2f97fb7d36e680d113567ab408f7b37bf65da3a4c9e1e3a264cbc90a3a211e3bf5782ec12ceea352778cfc049b8234abf5d148d9691c6cf8c51b0970c40d2a0f52f1ace776117566d5f9561cab5781a582ca0f523f1b58551c84df19c27786891b36583b8bad4a9289d701081222d4dc5bf535f3ce84edf5db86a9bc1681201f0c9472d67abb0b5032435d2242cab2c9759f4ad0190e5bff6b44b6f1b29aa4d5efd6185ccf42fbdd5f72f14e055729dd2890bfa44101968a89d2d347496fdb86b60eef15ed18570e14025afa2738f6cc23a6272af56f637701c7de09af0d9818117d64a091bcfc999cd7f2831e51dcdb1debd5ba5c1977e35db4c1459bea64d5c1ac3662b29707ac51c6014e61a6c9956307c2efd28bd87101783ba631c1f3b06be5662aaac1a9d6805e753173213c05f282267ce425478d1e3c06e28c4f12f2495d6e9c12e2f2a4fcbfe3f0d4261c9d14622adb747279db72b63a498330b383d46abb92b0adb808e1ebe9e381b131b0a73a2c2b6caa06a5a488bd107bca103ea1cb7b8e7c6e7d670fdabb651cd187db2cc7c07957300cc2a80d70b41038a932de608a2494a5a36787467f5a54be0475d226ab5a42088f07458660001cad8749bb81eb8abfe2e409d197f78a3ab6b767a79fb3ab9e42242d5c808722e48a0cd633dcbe9b94e5c9ad4dab72b7f950ea02708bb07d97a372f561bb45072ef34d22814b3b9e44bf097939eb81657d0209dcee6d8bb8b1686a389019d558cff9e7d8451908de60b993e3d90bec3685cd809705984a8bafe07409c34d1bf4e66b02e52bb47325547c746248fa974a0576854826ed8de7c8bfe8e54e11ca33f840052c799d3c840bfe4d2db4d816aacbd966e147d216a4c1013a533d4c5740cca0d601cc582a305e8ea7e3f5e129256b69756b01abaab66a756caf9a1219dd8e7eabb45ecdffb2fc49899dd87f6b3fb5cb5c1c21353e5e44f24e001f8a8781ebe7147afb74a4327cbc2e5c3fa4dc72cb94a44c29a5d404a2045b0434a49430b57d477b40ec909f1d133f35567ded989e181d9b2507d7e632adb53ccc5a3a319788cbadb96a8f522c98c68e7000b1733e3b467c6a5cf429d1bba263ade4dab9b636c91a2b66e64a89b5615c655731a458282696eea8dd01e42295d861df12352c585f4ba607838e85936ba9da8aacb12dccda2fb1145cac8a2b5748aa65c2c4b21db922808e7a766ef4d4b8387dac0c3d2d3ad74aae9d696bb1d6dc2a33f7468c75c1d5da5cb535a45c154c2e89233b20b606891d1a246a74fa907a2d1b1d8e9c4bd536b5d6b6993589b940ebc9655ccf2b966faa85933b746cbb8874f8b0499e9c368747841bd5f7d9b39dbd5ff4d9e7bd53f7b72fb74fb570855804e1f231fe450fb7c1abd38303d4a121711ef1e94276780edc0d1b4ff9f2ec9c2e9e9caa9c241f1da15fb4a096de6517971c133deacec1d9499de8048d39682bb7b66e6b71a5c55b8d3e3e9c1b6d764cbdf753aef84ef449eb66cb79795ad87858f12f3734bf68414d9df1e698c8c1413f7e8d4e8c7b732a9b39866a71239431a9bf469ff335da0055f6d0391c1f65f0c561fb79f8e2bc1f474be3b4f8d9a7fb08a7e8c5e1e1a1e0e3170769e4f7bfb5dfbbdcefbd779854c822a1a9ad1cc8b2b2ab7005ec67c5fa6c8f15df3db1f68fdf9ba7bfa2c1cb8a70655d3cac2b9e26e806e9a6e7175fd4ee3678fbdedc2f9e6e1fbf3767ffe3f766ec073f7e6fb67ef6290682796865c13efdfdb3e01787e7e3170783a457e775931f149978b1f4c34651d44c8b3db5a1252772239ca8954ed85278978bc53f7e697a96826799ae64cd7a0e9a8877166a0c7b7fa1e6586fd3ec69a981e6a976d8256a02833c18d42a1f88e0f03bc3f7b19a808c5fb2cf18553be45fa2ec4dbcca705ac006c0195c74fa75b9e167ef7ead450b193881f283f1b1aa5d3097ad5df63b03c4489f7a08a3db11abe9f6622d77b0782bf0e37726edb34056b2ef72c1decaf2f13ba36226e91757b65e309ff8d4e62e73ce5968fa7267e216f6a9d7e95d759004d8820bef8c0fcf3b639c80fbd5e36ab95b6e160b0d187df6ec9292c8ec6cf856862c16228e40c0e670b8616e3ba73d605cdc2ba18b7be5fb906d764b59a283f460451f99200570446203a9a1305a0b240a6407372ff2b874a08a0449fe719991c93de998738217d482bac149e090073802e078814fc6159ada580b2627d4d48a6079219981e459524e482ea419f29841fe0b1e8f209ffabe9077c80ac7b2b0231286151203f6b8850349230047dc44468e73822433611d7279ec250feff8e08873f440bac86f481fe4cad492bc203688d0b092393a294935a148624309dfe7fc05940f6405c7a333a41e720047255752d809120147382f25aba7b31f474419d0bbca322ef95bc3fb53c25d40652d13c834646e42037981186e473a46a22c3ebc63051221133f6e748400712ca9b3021264633874eade4c6ccd2c9d50f11303881e084f46f02b28f5a887ac81c470348f7e4825a4cab10e087e0bb267b4c0ac4a78ec42ea40d2b01500dfc03636f420bd341872c68f33900438160d8f982f8f107331185e3b8f3790398883231e12e558938395e1c89078090f647a84ca40f82faf5170c465399224799079479ecb44f2cf930c2433c16cbac586050d1935ac6adcacd6d0944c85594db9f8135bb91594588a8cd444849c424ed8e87a8cba8073ce39e767c939e75c8a0fa9b6836c3966c54066bc3c640488217e020ffa75e5f3946011444ec939abc498d3a33e252e6fe03cf314c56b9d1255148fa2a2688aefc4624e21b2003df76a50d13775d5de268afdb05f51f37c959876d40ff528c4a2e6f9dc1773511cea55621a9739e03eed9a7b6d4ce73470a8b186ba2a8ddb7015f092523441c17d0b1fbf50553f45d017c0c7ef9351eba75fe875f297af8a9937ea7da38a5ea8bc370a2a88811ef52ae7dcf4c318cd839c9bdc54b3d7daa77b53558921f4cf41628c5755d563f5833aec3ac87d9067ad8929ea08e8d7d9a3a81d52bcea4b8d01ebac8a90937c98e24f151f0c66af66af6ab56882a246fac510ba0f63847fd546cd933768df7590ba12bbefc91b549f2bf0f90b7d0545edf389c5f3138bab267e61ea85be0862a528e444164d84a1c0e33d416bed33f79a87f75e0ca18bdaa7987f26c6649f52ccaaaf8042f6a657750faa1db48fe944a147b51652901cc278c041bf941e66cdbe08f321f8f5a97648f1dc9bc3ecd761d0eba199929a66575595687a156be3cee051f20962e5c79c9e7b94740414220bd09b3efb9d0166ef522516cfaf7bf206ee4d9f872b5ff5a60ffa534d7d87517da98babca758f0f7a6dd43d5c152188c278303c3951f7640e4c6239214fa82b6db45e7d712db25f5ff020f3195f7b56bf8c05f3c7e5eb54d58283718a9a7f8a35682b9c8481e97f26fe8e7eef49804f843058db0e06eb460f2e03068bd8bbc759bf3ff99a300306ebf4b07efc360dada801c99a7a8c4d39364d22705656fc0bd311368ec948eb83498eb8ae2b7ee5e397c9cc4710b3acec2a5ce9bc5f8069e2c0a405b4324df198e5d6ebbae2994efce28b39c5f493832e3d01022e21e13959aca5baa5b69f251a3f4b61c6a518364b59374b55384b532350207dfff1bbc4a3c467132c5924709ec473bf600d2468df017fecf231b00427f62e2e9d757161d9cfbd997e13c69a7789a053915353f2ebb7a9ee6b999c4b68826ac282c36a0f8800ce10c2d660e336acf6000a7800f3000950a002ac500f35d018ca7f61e5e3178588bf3f7e91dc2025bf15b26b9fccb13ada5c9f1b3565ed8f245096bb828a881312529b06d41a41d2719f906878304982e744c8930f34b63cb31561ecd716db55d512a5f03ab230845ab5239ea2a31ad689efef481b4404ea073b23477ba4467b37e6b2e062b7acf4a29c928c88daf7440f8a1336ee083f197a6d92912a20aed38e56449a960c562a06cb851543aa3d5b6adf8c5c1e231f56ce0887eb893b9324455ddb44aef5e9e1eed860f7dea32fb7c48be40af649535b765464c2cd29ca716d8a66dab825ecdf1dbb230812b7366aad1d42c33582b94b5aad198b144f6c150a36a8dd21da11422482fdd1e426af651ad29678737f70b846672d09313f185e2d5a1c50ec1124fb36e4ea0c9170958646b43d7d6d1d1236aa089b06d76ee96879d0583f3256af8bc5d5920a204aed50519e50892ba11b30276cdb5e7b828e26ce9de2d1aa506bd1669079b94817acdd54fb8249eac45dd0cf8c2063dd9f921216895d1b642e475b8b1b6d56994b9374a1b2da272a3327f788c406016a7b00e93801a2714d306997e0b52b84b83d3e8ab0b56b664bc2fab6d6aac2523439321172e3b161a286af8ff5a1d7dea07351c84db5b536d6a8cc8888e5e062d5aed82a4432ac7834d54f0bf87281a97e5c545c4941187c0719e613a26bf27bd1e466b88e1f46bb25a9226272458eb87c602c7d6eae6b59962d4865994326c50ba31c7a389482ca6028c910f5a4a5c94071a344dffef885710cdb2d3e6ed6dd990b2544f06c32c0c1d5f344861130241ff4d53aa182a3e5a7828f5f18c69f7efc6ef901b500f168018269217ab5fcde2d9f576b26af65a8a568cd25a8bbd63846a7660bd1ce8a4bdf62622d962ad6c0f2417bee4be81e28c41a50124e50a62a5843d09725dec0ff738880df87eec7c97f0ef1dfefc30ff636f1be487a5d589d9db3fdbdf72616794bd0b9f6bed07a5f54719969f6beacf04daf83ce239c01fec5140f2e787006a699b356f898033f9769859fb77e61fc3a6fbc9b96112d34ba85668769be5767af15d8955be7de258358a73c6b8bec93be7ead8abef6a9efe097a49afaf9b78858b32f86d0e7067e9125a3fa058853a0cf44ec2659f3077a137ba0c72cd8778f626fb260cce4971f0844b10838fbecd1a1fbb7a21efbd48348ff69c1ec40f4343fea51e2cb49f46e99cd6e2de6aeae9ccc631d4575099a66aaae163c5653afaaaaea851a03ea55357fd577550455ab6abaa27814ab1952bce9f30933f4804308d9f42ede5afae209f42843d4aba907450bdf447dd0771425a6176050a0e71a08240683689fdd266b7779d14063e02650b3df9f67590281406d01468a1a3757d235e39ce1c5bfec0c1c74266ecfc1019818b3b3e71ecabdf7c644e1cbce70e1c205576fbdf0f54a066549c4ebf947bc54792f95da4b85f4f14bc5f3ae002282aebbc97d8cf6e53bc5e46b9f5b6cd698eeb5ef2e93b558ae679aff026472d58a5f167e1fd881be7b16753d6f2821ff107ac51aca55632841ff6dfe550563387d5681de543bb00089e7f901271dd0872cbffcb8f74e0ce61c02fd7b099dfb102b1fe30d4af54369aa1fca99998c5fb837d51148d8bfbb4c56cc2288fe1d247ad4c2b6807fd102102743f0c061033956f1e7b03328817e527bdbe54583d26bf5034a4cf58b778fac9b985a3887ab70256f2dba14d35f16d70f937fc7a0c15780879c6a7501f8b3a0a7474f6ffad3739d354af74133971aa5bf5255bf7c55ac183cad67a976307530ab0918ba941d2da87709f431a67f5a81390375f98b668c490491feede582187b5da66c201018e2dca5c7aa29f3fbb01c06dff0364be7d238995f3c51bf5355fbe0191ca2e9b003fe280d20a2f8d2a3108b419fbde93968aca2dca3dc7b991ff440af0e51cf61e7957f1275cfee672913ccda6d5583d2393325a88d693a97f68ea6e99cc680f6a02a025a6e7f8126aada7734fbae7de7b0d1105a1dc650f027f81a4fd03a4f50d3b8bca1fb5c0ca1550a28e95c91820f769db5d69d1883e229788da2689af78b1cd5fe043fa3dba3295cde807a3525c2fb2ed1342e9dfbdc777f01064e6b27f6befbee28c4189482debb5735a6404c512df4dcf79dc2a1aa9aa673296a8795824759bbca7ed79d75854e44559458cca9aeb0fd7eb74fe37a05c4178436a66a1085611eea2a14ac7a3ecc013b49f7cb7a50a7479d32d88ee01e418e1874498cfe8cb2be9c7ee825c10212fab9e3ea2b70e824614fa8c96b43c59327e8934ddd96510951ddc9fb58c8d652142929f1aae04336bd8d28f2037467a4dd389fbec3e1d1e6b6c2890d2362383888c8b656f4a089b561c09b443199505b0e882c612665e5a743878cb1450b23693594484c8dfd48c96552bdf7253a3941cc9abcf08c6ea8110da12112a6e50542ef3d8533c1328a701ccb98980479d231180ddc91ae1443dc7840e8bdf725bec4eb80c58d3bb716444b4d6ae84071846fc8949b1c0a5702e415f856da7bae2d4ff5ada059c2234b2a93b911c183089491b4a12a9e84fb93869f404a23529bea3ca2b2a79aa669a6679269cb91981a71e306c82b87022232826ce0d13802ea622254f81ea77ada636a62d66473c66104945d8f1d3e5cc4e8f27ad9481fd9751f609edf3b38e7fc2c3947fafceaae2389d239279f696e0d434ea4ae7ca29aa436d5910f4588b4a5a9b8d3c2a17286fcf2c903e283444ef701e6e9d016501bb2971462b246a672f7935304c7a2c6505894102f850be7db97669a02e7bc0c6b326ff69c19a6649ac2ce7918dfe75bce2afb983393e1a4c3868f14047a1429facb2a2bb3039343b9d32a8d98a669a6a729667464678a01f1e48bee81254c9e3c3ab91d145a90a43a271a4e7f4e63682a990aea662eca344dd334cdf4f4795bf2ba5146e73543e6e96ead8610323b22b0a96f8295a5f03a1836224c985c19d568192de15bba4a61c3ce0bcca9d32ddd24f1e8f281978476c159d185a580e2d340c7b42f1c24ca8c6c75260c601451c322c7e9859b5669448a73cecff2cd85535c1ab2098997054954c937bcb02da4df5904ca344dd3344dd34c4fb0124640cc7c0ca17de1572d4d870f92b5b523086632ee9b49212727f2c1181c8f1a5f75482c3cd821d1ba76a8ae849246df4cbaf1217ef318d185e027af8f1bb22f15463d4a27720c91aa19d1440d7233379563e2ca848c1dbdfd555970c2cdee46cd16581691998f84fd70dc43b8c5cead2b10632dec2b2a2fcd299f49b951c101d974653e8fa2a0c0e90c4ec6dbb4034969aa0618101756643bd94bc5e63cc6e7fc2909b5e5a0b211a19f157463c63399292abd9b125e36425860459ff3b85547ed12cdf7de7befbdf73ed4597bdfab7e595985789bdc976bb97fdab25ea0b071f303b46314cb692a9274f186e570209c884b3fe459f1ca91043fecbf2732293a100702bf0ffa1743c0a5b5d639e7ac75d65a1700a52803051cfbd8e3b3b48f7d56138065e47d8c9114c142ba3ef63f906f7d42b8b0dbd4c73cde30da16ae918679f878e3cb6f564710c278ebe047073aa6d9518a1fc894700d340ed0fe0b12625ccbd3cb910b6cd054885a9c44200183cdd0fc10dae7afd511845f138b1e602b2da0143ff0a53284e12d58f7718ead51942208d4badcc77eab09e0421dcc131fab0ae041278edd5496bb2ccb5dee5d967befb22c7799d1508a7f677dec53921f6bf89888330743fc6574ee485c5d64af5712bf5e551ffbf38801c92714841d5d69374424afc030dadad91a178c1a424b201c9dbcc7df7bc7783f858f5faf9b3f332288bd068b41e46b9f16d38f5d34095fc919d88ca1d555c6665ab8a05f4a93586e2fb5bfb717d3df2bcccb6e69da5d9f5d6f178c272d4c5fc919209454aa6f9a21e0247ebb7a266cc8b9a1ea61d7f7378737236e87ce14535a57cd37df2e1c1e4b52ba749b3a0290a5a8b42b19514aa70c2501000853170020180c08084402498ea420a0b3ed0114000859cc789c8444201b4a02611805210883300c000100023000003100c3201487422ae7001c476589e2a666b441ca03c20922b520c4bf202792e30f05e9ddcf6146674c60352afe5d189b47a61c63436e1924298a9f0b4a7b36225291085866ee6190d429c48a498068c1eaea8a0f623e826f38c145147e905500bf360df90bc8ac014cc5f30845198007e682627530c22aa91dd9d20ed0634ae4d2913bf0cf4eae741f89a809f3dc4850cccb2991725a4650242779fd32c79793319dbe7f641c03b8e55815918f152f49f961de1aa40dc84d479d64329c09ded4f23440830b0c3c416e983638b83d448b73123773823250f5c284a8d2b7f5b0685c41bec7a496017994304c568015d0263049f14a860961e59314007bcb31d9fb8cadafe27e1fdc2e42deb8cacb43b2266917b11b9f6e9d419a58de2ce140c8d551efb9676a8491f5ec814461b828a098a1e14d9b0e40f5a70c7df91fb041e664e3bb885ad62ec9ebd32d3821e7207f0eb4d4c86529b4b1d0784ecc0fe623f99702de6f575216ff2ac046f22f3878fe3e6f258553f1d284738c3072722883928a12db22621dfc92e07de858713b885d85c57078fdd6445a6da4fb5f692c071f5b4919d09c36e1c2cd981d20b34f587c46f83411e8c105f6e7929d8b064db9e3ed691712e1bd0dec37974af363bda92c0b4e82f09183906feeef5c34dd6639e70dd76840ba3841d8c5460542d49b9e24ce06ba57426097f4a23af5e919a001411c0bf95a13bf25c009a8abf9915f94b2c12341f3f829fed322c1213311bc6bbc6acb03e10fe45eff92eb7eb9ed5709907ed9e1060a277c17d91a6e2e0fa2c8777167be15a93f5a9cc6237acfe9297f8bb3c00d4788255b4bd61164e1d7b856ea79a5307cf54104111ddc076004e12689388f9d0a6ad8b5f11314b2632a8802a5dc0ad03050c6be3b0b6fc5788540e665594870f32c079a8bbec0d337a1da8e4dd097819294afb66900455730059b2e68a75b8347c5eee911a8f12797e3bdbda262364fa64766eba97b88595125478b29becc10f0150380a5726fc6c0248a8ee1237b42729664956c26ab5185ff319455785f8f374b9d5425fe17d2cf88682eae1405e89c347d82edafc615daa49c0a74ad5aad0fe0750d00e7aa78bd32fda92c93650e1b91b17b4a943350d2ca895c974ea3fc94cf6b76e23783eb514b22f420334c56e5006b16b48801ffed3856a9e4073848e682764578f807d1f8b7c3bb5d4c5d2ecbb352c5672514fe36865ee316724a01a28ccde29863e516ee0c068b2245b111b341ab53cb0ff3d495c0770161980812a16f952f158dc26872ba4a15d069f789d8b7945f7681149f33a24ca6c889e236d44d2b4cf197075b2642280ed68b5d1fa992d953fcbba349a6d276f36b49609753822b18f49e768b5a6b2e53f111b44024fa3d6cd059953ce44c2cdc5e223f844d66d79a7c00a737b09b2276466022018d8a11804785041ef00a839327923761cf2c81fd96d37a99ee91fc5eb002ec3628716fb0920187a85a46a4aa38f604b6ce9838c1dff826efa116397a905a392bc664844a0017595ac83196f99d498b2925e06e8b61e67c6eca819088178bdfac0777525a9008558fa108d1fc14159b7a575650b3509d4c0e328da6588eb6b2c85b4237f6abcf2f864393c4e22659dda9f1ba55fc3e42fc0477ab746958c0ef7208eb2424d1b326a7f73cc62332edbdd1d5d274037b2485f25e4d9776699c87192c4d20d591916e7788b41ebf7c0b5bc04ada138c217d2ea359e0b789644a042c77ba70007088ed2039ae746f2ce6a600576b914ffa229ef5cf23c7ad0f0cd7a9bf5749be3337f41f55e83d328a725cc00c3a02ccb0ca3ec5f49071440edd3395b6f5801ae08d93a7e8801e12d46a13de0ce6fefdc641027d635bb2430dfb92bf43c60859ff8cdd71ec369212a4f9a89d0447c3419b9bf1b9c9c7175c719ee91bb0899d1f8088db3b1bd21f7e09ec05dc35a3240f1b09d864113b9be514892cb6caa0d09bc34297589bea8a319984bb1e318b484631b71d0b52f6f95f65b9ef83aa7113eb614e40aaba6d80708fa9d4c49b092dbc8442b626a444094297abde00f1c2f9a1f0165bceff8b6147bc5401bed5d39a633d3d6f1d6d986a320e275b30046f0fba5ae98b63ce5c2b44866e52c1f98e0b92606e54a940ac2ddf28c9f3327fd1c2a61c889439a95d3d78f0c9759781b24a2ff09c5a2bc36090b4ac9cc1fa330a1f9105aeb6eff67b1482f9f0e80b36fd7ea9c5117b7bcfa5ab6dff5b0e19d4f2acd87683787348a9635015ef427aa5b32520c68a5957fc38b738a64f94875103c1f566c0e24c88a86ad991bdb6a9bc352d08d35bc4c3ec5c4cd7c709c19751cfebf1d4478bebd629ffe459644dac18d13f469dfc9538032a928f5f3f448f6bfceb80cb7ad28dc60bbba522a957edbfb247488e6bdcbee83ea550a4dcfe26342e7d42946e304283093612259b46fd367aee7e00eff5cd2b8b7caae7f9d662ee6b26e3c9a6088df2787b7dafcee746102134bed21394e28e6c6a8050509c17c0138548132773a3b12322228276b6f682cb8d899f0dc81390694311a9c977c0e3fc6fbf9ce79b8a4fdaae15ca2b2ad6e9fa0f84f2902106458f48e99d5e632052b60b31d886229cc9ae411435e257e74723eadba02801f28b286f72582485181e7206f47e561c2e7de66bb2c8a1ce17cc312872834e65a35cc3a2b121cca238aae51874358b2acf363acc1e8d8cd8c88d9cf07f664a8e6dee7314592614c30409c56809bb800e5b2dc2caa04a4a3ace41f4c05e6ed62d311d152831dd72d73df18fc634cf46cfcd503537cc8079ca49409344602a08a89c2f49217e1becef389e70027ae17527447c92138b48e2baae581d687b9e19232bc7d459e3625cb8bb93fe3106f8263fb6cb26d719d65f7e0e499cce0db6754f92b9866a3656e5db64f5cc1ff6cc800a4fc6ec069b9d6833f4c91ddf1c84033ee53313cc0fda9d7a4554e02a6e54b00057a6f36daed14fb60149f0ab2e50afb201b78b5258688072101bde7616872fe0a076818d48747e7203f034f947474c560cf8034a070b5289462803a2d30fb0aa4228a3516773aed0533eebcb5992d725db67998ec681c9b17004dec9ae1ca92f4fe0f608ff4ae0b9706a2c2ced31a66f2e52c8c18d7b9714d7fde96f1a65fa029c62cc23ad4d2c2bec6ee6f7a37a4bf4fe30d647997b8052cb4f49fe94d262bddd60992460095be4f9b700aa0b94f40209cda02cb4b75f34e82026cc6d266d9fc67b80def505d23bbd29b5834083ff0298ed48f6810681f88c50cea205fba6975dc22f7820a81bf140447b40d36eafc503f1cc0ef5e9fb3f00851883698e608037a202a27503b38191e795e15fa99353709a021b65af92d48e9668f61fd38cf72f06deaeb289fa2cfb76a1c450d8ca52a27f2c718de1af454f36b651516d1442508f9d6ff57656984b40853327d307fe92d2ff22c0ba688e5f5918f6b1ba781509bf18cbbbf28c8f34278dc740386ddd02832de6307da018b510db1fadc5dae4adaaf9caf892cc2e5e53b18b13460212337e0e1301e2911c692d160d71167cb05a403c5af09815cce0d45b8ca45f620e1296be0349154cf729cc56819ac0ab51629efa0d2c30922962bb4a65a46ce5e76402b454d305b60dfe58107ec9a7a41e02d0d447b6a35d86b6f832aaf4ef3e1c9e524ec749d1966b8bb31b28cf0510951e02658411a9c97d0d15d13f5187d6c5e89573d6d053fb4e8e6413fc712bfe96226242bb102fd8d1c98d5dd049150e3e4efa382af49e90a63c7ce73571db1cce518f8535cd7bc1cda2de04f7807307c7d3141b9ba68a925ed61326eb04c13344117c1131e0625b47e9c4a5179d7503f45cd55a1824c3cb1f5327ec810eba6b986b9f1b06db0b66491e23a1fae69be4225fc3af15b29f2aa1fda0ae56eaa961a8645a3f6671a046738419bc9f698bf37583e732e8c3e4fd18659a70e109a7bcc2766124c60db3e7422ae0a6af5527c65686ba90bcd8488f349b89c8bcb814ddb4960e549a02f50503b3eb02bd99c9121088635b6e3eba7746664812bb64a55caf4877c731c025f6cf4cad0bc6480b3bb7262386f20199f8a627a10e5bf0bbfbeac2cdcc2d188960cc2629507799c1a26835305231daa10b8611ed0f1259641f635c6cba75d2b36ea87a9c0e0e34f9254ae5ad5f4db6af7b72cb01ca17c6b7f79444c5cc4b31d1a7616e66bb0cee39d99811917c9201e353b538adbf426c6c1bed68c66a6f797483feee617557a3afd24b29fc1514759703106b4b8327823e7c7e6b10ca8b0c6a2e0090781e16763efdddcec44c2a32846e5368c261eb72a866abb4d08d3318c7e8d8a272c89473879b226315396f944461d66f8291ee18c9464a309fd131d9561e1129b615eca6b963c7493211bea523b9fe6663c9f9b2ee3886e1b0b6a4541069edefe46a514a23c49a1f3a22e9eddcc0aeb82b6924a7d6b2f1af2009f3f01538f3a959ed435bb3cb8dba6f0338f076ca6027b4482705550c649191aa14eedba81a1346ddf070aff53fdf1da55b3b8cd4a6d19ea3ded11b16fb2353c5afb0639b3db84d2cfbffb940570097ac41a3651b99955190333b891fea91e499748ce9a48519645c6449113521b500164092a5f78e2f0bcacdc5d6bd6e7c60047ee8973c41dc7a6ce531f3f1cbdf6e09dae5e0918f9c50e123bb46ff454820679d90ed4ce4f46f147b1621c39792ff1f0d7c3b82b5017a1029f39b31e89ed694dfcc7967cedda7e36800b4a506157e712ea873da9dc425630ddafc764cd377f042256307e8447df91a331191f169701e1f0b961a7cf3dc0e782d91f4718b3dcd847a8d8e096bf3d9a5447a5decec71a3c01eac6a9cf74486c2dcd9152ea8449fddd5520eee46103cac03e721f4ef1cb580648baf574e6470355741f88e798584d7aaf8e4b5f8b5b0298b1c3345bff0bbe2e6d1f220e4c5d0c40c5120aef92ac9295c990a92a59b4a5a0603ad165891d5583f07067c79d06c2565032bf6a4a598ef98ab6ba01dc13be0236fb71e720f43007d54c2c7353e5a6c38242206f286e5122476ba9a39b6ee5858903836493dc63cefb174ada9d92a4dde5c66c39e5ef88742c5412a4841f7ecc1e8612761df721179ef0475391b51027bd0c7e6b996d90e1e758d40616d2dfa0ec51f63a8b1b0f44a97b1713b715e5ba661b8352f42f27668eec5358086b28bef919c560262cc311179f09b3648943f5e98cc3614a66f71449d68184f21c234c2a94c8cc582d3c19cde8d5feff0266ff64811d9729c046f06527b8f932250572498ad1596d21975f2537bb62cb94ae1a68b92d9d3a2eeb6bdecb80a39d05159a2a5fc82cb18a21f68c1fd836539aa6e27648c9223c11104c785281ba66ad695e0011fa2fc6369413ff9581cbbf56909a3435b26c49b7586967a076a863634cfebb1259c122585895a74a78bfcaf0109d4a24f28d3e2401f50b947be82fca32f6141e1ea411e68ffa1a0e0fbe84eb683f2a046b5525243a2e572503ee6accded1cb02b5ded2234bbd465d9088f5897c94ca9123958ec5321cb472bac6f51407bedc106dd510365fa0cca4d165bd2ca7201f356a80cab04e80d25efed0c3eac801582d43c76fddd4b7700818bec44bd10661e1ebb6611d66a38ddd09d421e047a50ab702e1172d6474c18dd874475357c877422924ae12ff1058208dc4cd026869452732e517a63563a875fd6557fe6640d0fa572b9bf92482dc07e0d02f0185b1bfa174decc0b42efdc4fee8d6fbaf8f5e087a918176c1d74118d195e5729c20bf6dae6dfa53a73f348acfed797b3b57e760c4efdb8b9cf345ff29fd5a9df0b37178c91b2aa0e8aba3c84e015c92ebe5949e170d65978110ce5328c9421183248160a7212a6667c04fbc5f4cee99c081f8e6176b9e211f328334d5620de2913adbea6b5278639b53ba6a065b95b464e8dbef9da5642ed9be61b313faebc22085099bf7c5fc3ce04f221f3e2912a0230a603a238403124a20c45f7a1e26218e37e3954d54871afe706489087006e437eeb1ffd7c93dcfafedb89517c3ea07c48746c76deacdf8d68ecfb81b0b470367b0dab193d2c8bdfae15c0409f46cb06919a892e47481c6481d371f7d502e8e1cdea0fa61add56f0a77c7163a26be92b14113345b3830760dff17d16096d38fb1d221aa3e6f88e169b2d8d977d38b0c183fa42c6291d33da2dcde1aa43b4b8bf0204a0c2b15989d7bd8ecc00ac0eec39d9d01eba4c967a34d862a5cb690ff968ab4854aad47cc1e9c0edbcdc7762922f5e361af50ef12be9ee637b55e0a5197e0b7b40405226ff11561cb21b29af7b81200e6ec72567a8de5024350e85afde85912ea225cc413ba8c20e1a8d96b457c88cc579a4d60b9a09acf35fde77297542fd7b478d481eec97c217dfe5a992e53261cd4973e6c8e8f35ada0f8412a85e6142cfc76114ce97c889c7c622180edbe73b0208c0e4b768b12f5cb975de4a1d5add8f4e3c4bd1af9ed995b50336f88857605d9aafec5c9410c76b6a03108c8018ba160a12256b86dd3d58b8a0d8c87e05edcaa54aeeceaf5502bee74dc8d5bea1508c188985ad00688b9b877f18d42b9564b5470ab21ac545ad474cfd25c66f6e4e1456e38cd6397990ae630794e61fae9e882372b92c460a84430984d30c8b6d7834c339a6ae0b6595e8fc38059ea5168d0ead0042a0088091b49166e3710e31b77f8b17278c4bd389f88fcb06c9687c5174d0fcd1422bbe7a21780910684c4e24f3e2232bde520ae45f8e025fa4e1ead817ad1d5986121c2988857ba6d63612b7d96f6e1af6aea63b96c58cfc97742945bfd1a4257e53f71bfc6bdfc071e6fe3544fbf05e4e577189ffa62eab1b27aae46d1823bb9888d12a64b3322d3e2561c9e599082bc09552f51ef6079560fa4a35d39e2cdc696bf22ebf0df170b8f96d7709ad2f2228b0625230029f391f1e14bea7835c0847c886a5dca3ed458581882dad2d556838f2aeec99c8fc68c389ada6c1ea4b4a2a4f424b8f36949441d5eece13d3f5fae899af88959c7216a002763d56b50ab35af39faa1181d9c9e227a12317eb00b8752274a99396aad66348f5a44263f04642f195ebd90edb0311659a424b70a619913793d8c32c895c3a243c474e1f5d7f25c4a72702531f588641e2287f4c7910e8e3cd235f012693509afa0044708c97559f683df5526bcbf625a484be08c64daac443fb330e3b41d98cb1de01b20aa5750862e897e7e1011cca75fa8856616d58452c60c050574115826c528b9a565f252e7d01de1683aa06ecd40c956a5f95da87cd1cd420dcf74736a880b96f34289457e02f90eb4be442b2dbef01239eae5272a5388c502e871b830a3c813da719e1a64ff3708b9a9b5544c1d76b83cbdebf67607ec588b873479910f11cb239c62f14c44f711be6c4417a4d6194905aa58ed5a0eda29ca3e1c1ce04d581b99d58962752f74f9d9f97f34c2a677ffee8aac0501c1387b3dc22e1c7089201563e41eed19c6ea052ba02d44c30449b1ef9925638997d2b386118c4faf19d1b8d14076efbff7ce4b56143fbb8fd815ae6c16152c632dabed8195eec26e3fb3f6745c120326f7358740d16ce1d142cc915a2ebf8880c8780a960cdb940a82b2e03559876e3c69c81910e035ff854f2c592aab2a5892a546e9de4cedc5e41828896cb2b4935ebe89cc4e9fbabfd18b1a89f83662e6f1d1f3f641884bbc8508cdf45cbf1b0cf0c2d8557f0858a4613e82431f25eb122bf275bfb6c5942b1f059f9dc7ae100f3347de7c0c8f14dc46575cf16285f5fd9f489e4f950d85c3dc98205e64ab7461057a6629ad864a6e73eda74304f2e038174b666f81c0a033ad7460cb732313abe67cd6c12610623873a8954736ccd8cdfe29befa0f97330c1ff14280ddf57942c764decba34c2c5ff5227e165a9f4e1b2afd7b0e01a8bfc5cb6462c981ac4103b40e143c10384e090d4543060a2fa44778a9cf3a5088f6f70e80513648b81b30c729ae8fdce65307495bfd554af9ed73c2d066cb73c8698e21fd7c79ca29e9a419939188f4963fd24ca61f2f3daa1564804991ea9ce0f0e8296e689c1af4b629d662b156cd4e966a8a95f47c14967aae2ebe4f816f2a029f53739a9403e7fe1fa52418b6d388615f1ccd87244d9db24b8721f114a4662b22fea582545c223f2385a4aa34d68dc1e8562fb11ab59c8d3776ca780e2eeb96b58cf901bf898a16e750515763d56dd81da23f6494e919ce945895a919056f75171d7b888a789247f87af559e526b8bfc974130a4706d5e02e7204b79017c9689d96064cd10a497c1a9aef915036335e0c6dac5e841dc0290e76600ffdc2ec9eaf91814c570aaec6ec8eda4ee074d77e10c8a7ce7e8e6de521d20e1f9a0b3f4c0f83d98a08fe26b0f027d91503b19ccd8fc2bb0fe71109170c44ff2bc562833082ece3b0532cb8d001999d62d90a4b8f7974644bde432f93be2712b4f2022273c452d2d9245db329a3fe064c3255309d1e90f3dd6e59893f2dcaec37eb22a24d2e8acc8543cee929d0d24408f353887a6527b2e2fdd28f1d3dfe21288cc115ab81ec8a5d7ea9547e599ede01d3b6354aa9884e857481c1d8183a9aca8a205a6b1b4fa38f195f7d2f083ba78dc9bf1af8c63a00961a9055518f73dda79e4bc6f1f3d83cb10877e679121cd1b45cd6f363206b34fe4b48a0c16cc228a93476ba91fede887bd007be9135f944008075c4b91e257c77c623e4f61793608dbcdc3a02ce26c1ebbeddc8cae23e396294720426cc11394639562848d201def80c7cb0d81ea391fe102bc38d481cdb3f059d4a31750aa3934cc87e041d00c3d76f03197e6901b77b27712c90774fa207f9f64648aa48761567d07fc1b7baca474df19fbf52026ce1c28406b2d925f90fb4f658f4bb8cedb593e8ed236d24e2436589490bdc160cd8f360466fa2930311ea37be2c7cf4f78bd3e119b828a839cbef9bcaf9bce43b44c22fb148e551643e085b10675a60d8036aaf16fae6c9e40e8b852d5032f6196cc3ee3b1ce39d3fc28ab50904af519a36e81e293cdcc9fa25b8299d080f6c7116cae3caee977947def65801405376a645c149e58a0e416d1ca65c2ccca660a2d080d5a92c162e73ac0e7039a68b97d4db1ffda1d6da92906b98163ba30dec52351b05a165246f40d106b453eacdbacc7e445905e511dda185b9a26a33545e7c9115a90700849cd2c146d0897f7a382e3ec167ab0429a6991b093ec193c025fe0491f7ce6ca6fe2d859519192475cf38d8c8c7a5f6670b263932c9af2ecb67276e7a5218c633068f20de1275bd371bf31e3da12fded34080f3cf4bde96058268dd44338e80ebda5406546bab25b60f998a3253feaa400f48b94462884f872417c02ee7b285f9cc443a01e2ec867b577f536c2bf477857357f5a4bf0eec721f91c2293be9244dfad69ebac1f01899c01b802757b24dcafe08dd8d8e0ec7276f09d3d618916dea9ab09341d17ecb9cfc9ffa784dd1c9691d5edf04a66776b314a30850ab29911f7ae9021eb249aef8028b543b6f779967e4c895465bfeb8a94825af2848821a307e451f9726734ec22ce2731cfffb0c9a131f2428903c099a4ee6f46b85f96ca4619c678b4039467bb15a709bad946aec0bf51a813708357d5302cf8805276ac9d6cc419bffb2d8e910da1bc6edb18bdc20efb08cef0008dbb263e494221c503d2406502e94c0ec1813e11469abea57b49b9741258e79ab0e6883bc98b4612d34a296715c096592379c4d157edd06adc808acd8301d9b484990f362d96ea72b71723b2a27d2205f2269580b9dac410be54319e50de222b99b341abba1040b539762fc946852e7161b05b6869394ca3d3db788504de430c100d798e8ea7312eb16866c2c542401ee0c2d69892de3669ba28eb89f1c2893bc56553e2b4d1b2700c1557563e40283f59c27d3f2e86808825f13505e56b4c878009ed9426662342c2dca556074d35d5c50bb25a029c72e1433845b0477355425a058da2efb9652b9c4217f108a180df9573632488d0c9c200032de280e292015e91e28ddfa69a06a71e33a962c40d12e12306ba3edf4368796da8f3c9891fd56411e3592c5776000e521428314d48dc90635a3328b8916a51b939607081aea84231aebab2ec01217b15cad6426a3810b69f904127a802a93eb2402f10d838e0e0298332bda64c2cc0241966614a9f441424112bcb258bb4666d91443355c97414f4f2550ac62a0697d218108cf2b298ad96a6886928a6fe0c65cc806f6d4993bd42c8bcaf013cb8c3dde437abd48567f452a86f51c94ee1976315e4d359a4e5b6e1cef75af9c83d18f3aa639d0b227700973f24d08e7831df9b2db0b80b741137d4e9eea498f6ff980a9cc40a026c8ca31faf4e9031f9d796f79acc478a5ea44fce144e8b407cbc4cd51003c35be86088307758e325baa8bd5010a5cd2640f5ff92f03c5f0741bf5d4ea6f058e322f57114d6c518a82d0af0bce6c08747677e211fe7c149e52c19218872553870fc563a1ff2a020f769cdd4e2624807668bc738192a80f0436cafc442da1a5068a8d83803ef1b594227713c3f990b1429e088f2220117c74a1fa1d0a70b35ae4ea234ee8915cb8cdce94377d36a63d3ab83324b4b225d5c5c376ac9bb8a9f1893703b3f62298dc9bfd16c68a1f610f7b4e562f8415fd416187f665de670bf9075981c62a11f3afd9d554b0b3a76dc4cf66b33d7a6d5a178f5ed88cfc1ba4d46045dddb36d979c248919935a60264d229334a1091ef264534b932d55770189a282888709d051f0854009472800e6f218905b4cd13e5e8ffa1dddaedb3124b862085356f1359e033ea4281e9dac14363a8a65901f85203ed810b472a7fcd721428df6b9416d046fa0058a3aeefa3a79586edf4813d3b4fe7a3b012789f250f8198dd207d481748a8b9f287815da07755e05fa2f0e1761c31a08640ec8f471f0e3d2b414b8eb9b11ec3a16c14ec2de9823da9e2891425a48f270676b3b76efae065ef8efceca66c91b94640c74f4c82605fa436f59b20abfbaae22aa6eab97c509900be46c0fb8019798de7b13ef95653f14224288401d727679849dc21610b7be132dc2766f3fd1d01645ef692c5a856cdad9059e7846c25b4cb2e7a4c4477ab939106cad99ae8954543487323cb174ded8c872663f49af1384a259134486dfdbbcb596ee75bc5817e63225c743211d90c3c14ff719623f48431a2e061c0370159d83eea6a4cfd3881d1ac737769b0e94eefd92d7ec7ca0018cf38a050e759e5687bb4a32629c69310d2ca91f23fb98a359d5ab6b2c32e3357b56d8e58b984f9b910e1b713698a1e723291d9b81cb568a2dc4dd7646c1cbb8a8e113e952cecc89a3380a9a34cc0cf7f3fd8c0d5e69c3428dc22db887e0bc44fff97c5c72e9a10d9f9f5c407525d9ac21450c2767d3182bbc7a69b66666eb4010f38075576922effba2be6beade0c0c9bac33c3c1779e37745b55c2cf6d073a10f4747dc6200f33160add97b22056aba6e896681421c6ac5d2b3e68f40b26faf5845d83446052653872419b8650578f6cd37e3a3d7512b481b85755e6fa4c5128fa1cfdc1bd919b6e0f192701a0f405bcec3f8805ff25a44b80747b00f4d5edc380e5e8bc7d0d66341e364394276f3f4ab5ac98eaf5266ea7d27d31b78104e7c262ab62843dee47de487b4d0d5f48621f9af6e1acf02a0b2715d13f396484410a2c42e5c20841cfd7481547ba638ee91c5537e24680e5d328744bc9efc21fb9eeba46b397d66674a3ee5ab126c4f0f0175f28d898d9c2656534a34533755a495c8c745a2b68c74a9c450d39b00418517727b0583bd1efb8c876375ff3a244389db1adbcc56c7b0793ee977b1b11dfd11eec919702c1b9b8507a0140550fa14fc6f1bbfa338048148d50abf8da876a78a1215d6318808111fa23e3b5e84063fc7912c08d6d1bb42b98296cad1bfd584aeb915b4af7cc7ab8d852e29fdcd33fdd325a141936a50568e1a339113505f5789f02010155036354d46c03932c4ef0d396876fff4b3f59d26fb1e9a2e2e10b43596573c0ea0945b4226f9ba94cee16264f974562827b3a1131b9da4cd24e12e50aa7f76484fe1cf072183b4c703e89c20acbaaa604fb56be1b0e33b3f68c72db79a62359246150613de70fb981c2341499688037b7c02cb3b1d1ab7ccfccfb3744807ee4f55e8e6a353ac7480a15447e22ace49183a4e348bc6936039dc1c3b1d94b8c3fc3f4d419cad36a44d5e39c61d832dd6cc8cc02ca10b6c5e3468c9c80b5a5bd6a503129db41be90e3d225e2c2c82ede842e7752de66cc5235db46b319eaaf676069da615288ea310e2a0711dd3ba69a621233969a9128ab0d1d8fc64935879c246f8403ca735fb2c2444348f9742146809574a23d0002f3401c5b438519803c43888bcd17e530ee1d254a5ad83391da74da38da0b0da4803213262a00dca51c7ce761471a3dd94e07414a240239143738c58d0c065d53a4e1b4be38a03731079a56d229d8ee51c893b7c3a947310e7f0ad2d854d0e6e0e54871938cecd51768f564a2aa5a38885062a74394cc4454b3050529c58d09293444b7350db54f9890f060d06edc5100e1a2c64a48dd628af1d94e790fd1e8c158964d2a04c46d2b4d392eb80ea9899233b1c2409342124494aa3415339b52d1e6862f3d0f5dc3f7ca01cea0154cbd18d2104d03b8a5c681f2addd2d060912374f8688ce67869900c0a76dc08abb9e422b39a0ad1e5ec815834c5f85e5c7bb2ab236b52769af6de422282f66f213b42fb271919a1bd43ca8ea4d55b4e13a1c1b330f6082d9d646484f616511dfe1c0b1d886bef32d2e1e358ec20eef01f4759459a930b498a66cd0afa399abde875e039e8e5f8c341c111443a8ef5d394d29683d39152232861e0203293f65d310d98061d32124cebcb02e128eba2dd48bab525c2b6a3cb818243060e727394d5a15d722141d14e92cae52082a2e1b0a46f4033211969a00d9643876c872b8ed2eb28424c73212cda51d687765532c2466b945738b871a46b4209193988c8a0ed27c11def0e9d8e25ea20f9d31649db1c3870a4e198e970c9b19b83680e1f8772a4878ac211e31a950da5e875e0e6a8ebe0eb082547facc799e22111a2d4616708871f09b636487562e280eb6accdf6d0fbee4a644854b2dbb2019f9b62d4b4bb11feda9b0aa007a4855c33ce818b6ad9e8e0702992a63d95c3ef289ba6fd808c1cd086c58c1d2432683c64901cae0ede731842489641b90834ef02ba2fae705c40522a6e0ef2645e0237b4aa2ec9a50ac7f6ba9aa23d415ce9ae162bb9ae4cb4e2ad2e3d91d394256b712ecb8f26989eb92f1177f627747784cd64a61c2d581d1e85b2711ef9a322141ec2b661ff0dadad6d0b2d2d2d6d22a59449cad8060007fa064e9cfca895d47b4e99db8215fb5557a532852944650df6796dd08cf068645c1b361757e337578df97e6a4b7bd77ca508886f1f35328cfcf8fd7ca5e82b6bcd74b99bcee66a94ab51add3a8af747d3ba86a9832caf7f349a1f73565ca4b837617e4d1d2f086905ceb6d8ddcf41ae69047f0078cb990275372ba540f99e4f1d6bc095e3f5dab9963dbead668e24752cfb6d557c76e8de37b7bc59d784cbf9e9a3caa5f4f55bfde83d2ee2aa6ac5f1eb667ecac4dad3d5dbfa65a35edf6bdf7deee2ce391ba23b0f1d76bb79db4bfb147f65299f552f68ae174b95e0a9f288039761c34eca56e8fc7bc949d33d3b66de3346dab2e60628e1cb545db2e6732712f60f8769a76ef5679b45fee5a6b6fdb3b5da8cfc96d5e7b0d398c7639779e0b98e3ce7b0113b3da525b6c6ac7fcebd53a677b669ff55232d02995c7756f66db66486d74caf657dc6a9812bb2ef366346f66def65d71fb2b8e2278dba2edac028e03a73883a74b7bf516640cdb313f73cd371f2d8fcfd47028a594b6cf777b7777d7eca6d66a31d7b78f6dedfdb9d893010bfd2667ae75980701ec3be7b28fc76398879d67dfa53ae7bcc6b8d57c8b23e6792b96e0f531dcd6374735273850c70d2299524a29a52c6060eda93ddddd7555575547adb5c9a7d36f595a6baf0effe15ecaa22c1d99ff90692ad5d5b3af29db9aa9f12d3a3ec246f9dda41a102c29a56099044ac12f26aa419f46b5ab842b1727071365a7b5a20d55e0d330d748835fb467f292e3b0e22ade39d839e802cb11b3a525c572c444b5937698a8b1c787423e4fb7149eae78a240c955fc8592abf87515b1861b5cf10515378935acb88ad760f292f768008b0e7f41de9ce434e49cb3e0b090356625e463ed1ce4a49054435ad518156ff1fb8698a89e13e682a49a3183a56825cc660b75537873106a183ab2b8bec7fc235886809a3c520dcb11cff262e979c5705b147fbd434c9839514d55c26cb6602f85f83a16da1cf2680309df9e75f65ab7518e9a2b82b3d6cfa897f60064559ef9f209ae4020600d78d3a8de58305bda55c20d043261b61b26aa6f1a6653358a055b0fdb0a361f9b0a361eb61db69a2943f2f64d879a1a73555b0e1b0e1bcd76c394c9bc7d4bc166c3a69a32b7823536e3f6826fdf56bd8092b77359c5411507854412f651280a47607a2c1651112f93d9c2d52b26aa994c5497ee93ef4b846fbf3d9d428ba4f0f24c97f651789b841708378bf03a09af16d32508d3650beb8577a70bef92f062115e26d3e5be6e15d78a7b05c63ecc5768fc2ae16532ef16b3a53171de2d66e6713aafea65c31a7f5f3566dbee76b7bb61988f9baa272622b9aa4df5791879537d530759a3e67cc0b5cfea6d3265586b5af59ed974711ae4d1be48bfc7534f4783c6992ae694a8dbdb8a61d85e0a9439e63878270a648ef90b19b689596da95e2aa7280f2a52b1c11c37f5b990bd908939c41cb5058f9997a23e1d9b9897e226e6cd8cbebb5f5e344ff41e32f552a1f655a4d9367bfbac5b115f51063a651b45f0934e7914d81eb7b12e384fdd4c7dce6c4e5badf552b7f2a8d941c7e17b21bf2066b52595c29e6d6fc74629a59452da02c9d64cefeeeec66ac5a9383fbdd65a2b7ecec7c75aae6ffae65eeca52cc618f35215c3c4cc4bb50ddd076d1b31ce9c13b1678f3107761e8fcec8cfd478eb23ea5133ccd4f8cc676abc155335700d4c1c2dcf74b9e268797e3ad71805b607d71d0da7a2dfd6a9e85d8d9f408db95996b3c954bdfa785557cc3424f4aa5e5a8bf6ab51d4cbe0b853662a8531b3a59d143260b6b4672f8dea03581be2e781bf3a0316a08029037abb0a53267b7b02a60cc8db65a64cc8db11306544de9e63ca8cbc3d06260514a64ce7ed07304001a64c8d99407d993219a9493e4e271640f207c322352f456a7234a09441251f692e0a47905ff3503802d36b62919298d516d04c813a47ef7d12e9a94a0a13c077240a714f5df2073e752f57fa1d758c654fb1fec7f762ecab5e0a49e1acd4459d79c1b980b9f002163331ab2d531e3ced98dfe20d224fb9ec6ba17a837386d4f6d553db3707d2293fbdd4563b4441f7a8dd411aca13ba83e93412499e7ad7c4902682d82672c872cc78ea4be09c071ab85c3f5d2e9c1fe94fd71157901f33d7caa5fad166f7a7eb89253c75fbc4cf53a75038d7c19de0f9267c389193e11cd9734ee4fc7439a15304d7766c0914635c848b7b6fc6451318639c598c31c64584b84d62d0408e008ad284de20c306d6af16b401428821248822a06471c3141a701bd0a10a1510171141a879e949c20b6a504345cd0f46f80c4b041353fc40085608114607821802902ec81f2e40c2c41901c06614a1f75ef0e7de8b8d716b3b3e42b901c98e709778d2e5f800944491cb82174c8cd0c2c6860a1b9d27c8b8019227acf8420739433eea6384626170f8032c6badb59696657e28232da38c9462caba432eebb22eeb7ab6b451385b6ab6cc6c89d912dbf216a02b404743030c31c0916f3f801114ba03a0d0d170bc49be3d8556a3528081a94d61aebf1a8694f50be56e327536a17e6cd626de57086ce8c57d75dd684483060e1c3f5ed60927cc15fafb7ed598bbd32ded4e784a293fde5ff1bebcc834d33eef71064a6e36d733ab1da5e258c30f47f02027c35961e6e8bc2866c4535fe185cc51e2380105155844324ef274d46e721a384e404185b2d6601641da212dbaba42c6979f38983d380897143e7e1e79ea199ba2a790c153cfd9142fc0703897a2025ae42fb28e941f51404822a3a05344876c4521240a203a3701e8c10a32ac580110543d4c307a7e28814209428070850b4465165cec409902c6cea8c80f3a7c411e2903079b2f7274231a5420c99c1024a200c2915072921c854d143ea0900245942372567203051250348142e74754879366a9192ec8a7a2a935fd42e1fba77ffaa77f502ff5488dd95139a979b28272f3ed49698e66f35c6e449dd5965ee5b17093d22deddb4f1279bce526a56c98280d63c54fa5c39d7654bf9eaab5a646a3ee66ad745a3aeb74c16ac56ece59a6994cb525c3f5f2b8b5e67cbda6e657af298f47fbccf4eaa959316f26d3be2b9e7868356c43608c611c87711837a2b05fce8f28fd0e32278e9877d238d738cf44cc396ef36ece397f28a5943686797777d77bf3b5561f1c6b2f86f9bd78b4359ce84970a127f179e26986f73ecffe13c71940ffbc7a3c40ccf3987f18e789fdf39863238f6195e7b11a5e1f436d7d756bc3caad3a26a3611299f8014cfef89442e3c326ab41e6919ff3060f816fb091fa4385c16c69c7434c98fa63a2daebaa513f541ad419d420154895418d41bda930c0373506b7ea0baa0baa4dfd517da82da8ab29136ae19b3aa412f9f6caea0594401924dd1f89b096611bf7795d09b75a1f0265f0492311d6326ce33eaf0b8132481a89701602757f0643fa9fd7719b966125fcaf52c2174aa641d9e4a82bb28ab7c78dc823aa31b91521e7ae620a984cb6ebea68948d46378864db299bb213a0c1c1625d073aa97936d5eda572d6a646bbda8b31edbb58142d121c4e92694da3ac8f4679923cd69ab797a751d8c77e959452ca0256fa90ddddd6db87acb5fa906fadc559fdbdd7d3512b1e274f751ee4acab271ed95f9fe131d7c471061d378864ead34bd16ec6c5faf4aa679838b63843faeb35a5bfa2784348ae354fbd318bc3ce81ae441eed578c6bed6a9dad610d6723af3ade71afadf69a4cb5653ac65ec5f8e2eb94729857bd56eca5ae7787311cd229d739b0052dfb9a6954fbaccfb712c05a0ddf3c27eb3088378864dad5fae528c6a173cea9d771188661d8e9facd1c7b86c2fc524a296dc173b9babbd65aaba5d6da8b4371eec5b4a60663e3e4e1c1c9d6b1c538736d86c7beb9b6913ef31912e9499f8938fcc130adbb21b72cfdec397be6e9bdd331f304d2b3dc1092fdc55187754bbbda8bb14cdbb8cefbc00c0a8946a4928a698565d471c5d374a14e63bad01a26d8982ed4dbaf4e7677b213d31354ce8f277c19a57f2e6945be356e890537db93e4f912454b08f50c045100f9e98a424814514011048a1b286aa050b59252894f55c2a3e46595904a70ae12234a80c04a6e1e6b219c13a1d3d211e26ba84e91a7de2f1a9ac862b8b2c83f5d4a6af0a60521ff2087919ff8b9614736b94b8a1f5140c05ac9074aac56d05282111d6e78f8026767065d1cc1a601180f301b52b8d94f8e1c11e0a1073ea4944f70d1a447ab872a8cc0c5164474e881080e53e5f091c34796a31bd1a8024fc93b19fbe97a624890279e48c1530f38a1435f723891836198cdd18d68389104a7dc8f19272391ade684cf8f2820bc7263d70f4ad70f543e860d2532f604851e644cc7081927b141451eb30d2c728dc95896655996614e46ce26a73f5d4ef8f8d34f9713367022c88fa8ab83cfc067e0331001d682b33e27a5606759db99a26ee7ec212b4cb197bd35b364b83a4b86e7aaf15908f25c350614f25ca0d2824aebee23a8d44a2d4aa36cf33c75dc3b184fef3cf58c76d75a33abdd0d73f66e98c3baccc3baccd3be0dcc36e7da346bdf0672b90359ea5cee405ee8138dec68549b8ebad090234f5d64242779eaa4d6db9f28527ea2344dab4a578e8e2b67e745d21b6a4383d01b6a438750165df593ea339f442935904385a7d75af12545bbabbdb736bd5dedc517e3da1477f662acc358a6659a569b6a58a6691bd775b569c7751bd775de0782b52938f381331914028542b56948c54b894c2b5e8ac4722a9d4eb5e9a9037933d443dd0c455e8afeec44de0cfd19924aa452a9362d65df898776c595ec3bcdf0d6338c69fd4618424fa75bda3d97e76a54ebb8406548d530e305955140a0db793aacadb5ba19b9d62ca5f265a33a8ac7237c2b6a3fa50ee4b940656dc1c4124b2bcbae9c2e6dc99c8ee91d9a4a23454a942850a07435abbe215b38a19e504fa827d413ea09f5b068666838c8b6a0657cbb46c94de7dbb366c6b7831a0ebe9d665b90ae174f8f0f49922449ae56abd5cad4d5e856b215a6040ea395647495adbefdc394f8f6150c87419faee80d65b57048922449f24f346ad430c1041b363cb461589b86a6c742be7728367bb0107c77a8fb64659e3f2695a344658d79c94651292a4751292abf47a3d168341a8da85371a4f238f8588b80c797b7e2c561c4aa312f9545b65c382f72f2b8be9db3d1955e658d5851893e32f57145f5bdf2ba00111de4255a6e030ec03852861050e429f219998a335e39cff2d3f5d2e2b5635bb4a7ebaa3669cb4b59a20f799c2fd107d18731908004243c37f6e8a9ab264bca9aaf90860781518d134b7f23094c605931d56f2c810d934a8964bfd1044e1a8942a0fb8d3584a00c7e5e87bff10422f68d2878ee86987dd4ad0f68d053b3d4156bbae20d21d98a5374524f9a37f509b094a48a53af3d53a6e494f499c857e73aef03332894f978b5b03d4403872722627c755aca62d0f07c04e57cf55601e59c3e1f433fbe7a35fd6001ddae8484b092fde42ce1751ae128426202f9c8b1b01a9e7d8d6b43e9698423c75279eaa2ed355d469b6aba3894cd49ce124e20a4ace9427d25a4e574a16e0a9b0c6b29ac3da3d7b855f1d543218802f1148cb195186b0bc6cac553e7bada96865d063a450b39d66bca681ac7faea1c8b623b3ad10d0a8e8a9e1249e3b2bc36542e7aa60ba5710a593a5cc15d87269567e93a2c3d9216af6ab3816aca785ec5e95e8d9fceb5603bb15e1bbed674a9b5822a2ff2381abda68ce735f3c290e6234bc9c29a2e95c47a9f3cb294acaf6e833565ae872c2315e9bb703e076e2ce5b300f1d547af4d355a24a4ab9a2e36386a6bb88963b4346cabe9a9a759baae34d9d654f655f9a6acd69429fd0d21d98e747a8bf4d3b696781581820a3347c7b628d67aea2b948de3041454a83d2f1c8cda4d250d1caf9b17cdaad6e04893768810e5156284b27010af9b97cdeb45f34a0115673c6582f32ebae8a191a9f0e247540cf6d9f4b39f5131a62dd5c3246e0b63e7aab574ce7befbdd3f68b55826402094f7664934fb133451354ec8c2a067d9d3d35ad8289aa5e6d98305dd3a8eab471a4b4a21881c27a526bfc05726faecff5b93ed7e7fa5c9f86b9ab4655980baade2a9830d88f89aa5eb155a3aa57eca6b654cfb29c4d26c76ebe8e4d86e00583dc55c38031f894782cefa6f3a9822564e4fa843a0495d88fd0106cd5302120b01b8cb4c170b016c6baa28781afe8d1ce078817e46f1ac68bc1eca0d8ac3c1f1e0d567552ba283e350614a55baa83a49434efe36b0dd97cada1205f7dc4abaf232682dc8a6c43f066ba549faeede62b1699faf55235deb6a60bad235697c38dfd7dbb6ba8835cbd7a33a8a7f6b648c599ed7fdf9e0e19aeb70c2c2a95eaa748037512fe10d869edd7e28987edc05317fa07d7026ba145596aa1850c740a0e4e9c3869e7bada7aadc5f75e8c31c63c79ece6294b92e4c994056d663709f77a8d9ac5128548105dadf29c3de0f7d39d49bf1ac61b6778bbd364e2a0b7a3f1d4de98515bdc19ebc62e8f4cd85e7b2faeb35e4e4775ec45a0c75faee3e8b598184edb2ded214d1e47188b79bb945e4f47d5aa9d3276ba509f3fadd665de0c27ea6cc3d846cdec8722e4313f3182270911458cd16a653332933cc50b68b49fae2978b0c4cd76d0830d4d58af2692d0c14a0a1e2834410871fd644ba8347a0425c0780ccbd18d6848e1f326fc48c1bd68b3baaca4a5ab3b7b4e3c7a7c082587507208254f2a9e785c289c8ab6adf6dadbd55e8c590cab4db19f288dead14af9c9c2f1d25c95bd1663d766561bad2b47c7a585a3dd79615866b5ed5a8ee39ce3c2d1de589b20f6860b473bc4b238aeb3de772de8f3048a4f947245969f6bcdb783687ca4688fd5e6db477545b224526d4aeac68a83c4b7374ea39afee65cedba70ac39df9bd79eb658e33c30342aad9cc211c8a23a73026548c7bcc4f491248dc44bce8bce4f6f168dd2311a90d2d334eda3a76dbaa4391d43339dbc6372f2507e663e9dda740c25491a84a443487a844cc2818ea119941cc52485e6a7d395061a06bb13df31e9e499334f701c28744cb36acbd65dd7755de763967dcc6fa2d5b63850063faf721a89cc2149921cad6c56abd54a547b425babd56aa954342a954a7542179aa081d943aebaaeebbaeee5e5f52f2f5cedd1c0cf1b6995139139642539920cad1a06bb57392d0375ad564dd26ab55a2d9700e008454f57abd56a45721cc7719c06401fb3cf9b3dddeca9b347ababccc1cfeb2a28d332994392a44682dcca66b55aad56f549eda93db5a7f60c40002da1a7244992a4a6699aa6ad56abd52a6b12f3ba0a6265a69139244992e4ca66b55aad560470013d2d4b5496655996596badb594f4c8ce49122bb17b5de54ef80f67762373489224c9978e009dbf32abb2582c3104f6c71b4b8eb0ddda61851d988d1fe4d1b40406347687c95161fcf89279413f278d2da99914965be21ef174090604902cd396c0e0290ba836060e1c3539d4971c2f4b5435dd8d301b3e59dce9e2061c3c582d4737a2b1a4871f7190988725354fb39fae25aa9d72c7e7a9dde9e26f18e286bac28e9d2076d8f161b5e3230793c9513b48ec60b1a3f3e30ba662a2c3c4c94f9186a63e0130bb2e634f87b5b6da1a765d96cdd634aaddef0a40076d14f574c840cf58c294a7c13a7d0f0224cdd381b9e6cd08c0c6b6d5cd7ed7376f46006f730d4d782c9ca8b79e8559b734c67076457bfa1b70b34f08f180826cd03318f2d38585cd8ff627162df8eca70b8b1d96b0b0a05962c6929fa74170e18f2c9ad45a6ba59d4558c3a44958c3e40a293f809fae2b74ac73190bbd8f6f08c9d745c0fa713a193de0c411ea90e9b3409fbeae5059515a31e4b916a86bf44355e4252fad38c947a6cf3bee0b3de742907a6785cd77ae62054d1551be7a6653858faf6e6b05c53106d0b1d742e7dfe7dce7a07f0e3a97dd0b47904f7fc08a7b5f987d7a12a0bfe29f7fceb965c1f3cebfcfb1c702e7e009e49d389e5274ca679f0f8ae30924ced0299fc5712cc1eb3b9f5f82d783fe8d20c7d9afb783fe8a7be20d21b91363b82dac78166158714f8441c53b5fa141610cb7357e2bce892a3edd14560f02d43b6f8f878a681b55124792381b3572dba8110b221644beb9281c51f01be8f5376761fcbcd3c073f5371646d03f91389ee037dfc2fe0df44fe4c4f13a0df5b7d136aa739086fa2131e437248ef437071d1447ee86a083f537bf34d0df5259a8433e41803ee8f441ef4418bcc5130fea9d6fcf5d81c49ff0d375c5ea61e05c730e9c9c6b8e01ea9aab8a27af3997c5b1c767d00d21f973d0f7859e77a13602faa05b8f473fe8d4830075d03571e41cf4f0736e7a29eaa56698bd769ec571850a768e7d0e869e8fb7f59eff27c2c0b9c7899acf2ccc8f4dc7e15882d755fd08e8536ffdbcd14385764d300cc330cc4443b3d75e7bad268a59b7439e9f3141cab21b8eb505f2b11ea1c106a71a64ac3663f561c3c74a6364c5555ec41b0e58a1e4a18fd9bbf852636e8815479cb5c5d5a886a951649909e298bf86389a6888a39fc4111586d5c35a71ea2b8a0953af98289c107fbd62c294bcbd32993059cc52c94f278ad1136dd4fd59db7e7d555a4b61fdfa2a85fdf5550ae95726738ba9c29c0518f3f7f40214a042c839fc9dbc540ab13f89932524f94a4822f98aaba890482a24d139daed704dd7744d97f60aeb4e58795642ccba21977cf370e4a2f69530f4e10d9eaf84209c95307f7843067d25043fbc218f936725fc3ebc21937cac2a9ebd8a38cef02aeebd29541167a34ae2d83f4fba3e0aabdfb18ef1b22ddb73579764bd86c4505b2422890f5f2b7e99d060123e30da6f0ba068505f1d85ec91e0abd2cf1eda44dbb66ddbb665079d037bc8f4b3afd0f9eb4421954ad698d9e226e6903ead478604b1f1684caefd23baa8a703243f67d9d489a329d7fae36aa9bce695ac64252b59c9b192df9d268237de833ce2b29c321a119fdd120443742bb9896364e9f9c61c3b46223f0b7d9041505b8f9dcb32bfe10cf6ccbfef8e3dfe9ac0c85f1f4d50e4afc86d610b8234aa37d6b753a7e276335db24bd62ccb7992a38d1f2f09eab297bd2ff5087ce674ace1f55916b36d87f742101921a045c03d9e0de62b7416e25093dfdcf24c19ea9b4f236ce45b263f5e721a81d4a4d42ac27b4a664b7b1564138f0b9f6f1f33d173b1208fdb0d88d4a4556a99f05404fdacf2187ad571bb09bdbeddbb4e93f9c87de4af387a363f7f7ddc6eb2d83f8daaadbf1d4b0f57440d3549ed61737b2061c88f5d17827005397284ab2ccb810347c8026b719ca00c1e96305132410636c48f246ed073b3844a0545f4102288223c41c511677c814397bca818c3e60a22a89081103d7e40224508248030c2135ed01d8061848f3194c0c2228732565edfded16a6fbd18b35e8a647d5a8c65dac5e5c5326dc3a21566ad889c9e86691bd7919ef5bcdad46b655a4729a5745a4a31d634158d8f6fef6a5436dffead1ad556d5a8f6164e1224705a39642b45fa8b613ea12750423e34d43343514265a887ae6e6c82dcac86b05622972847a4237289482bda11bd44a21f51149114d18fa8a451894a3b6977add6729ac53495cefbaed309173fbdf6d0215af073a365b4123fbdc929a3b51230ca2993dd00f1139b26242a4250f951ca218941223262e27d3b562d154d48be1dfba822846fbf55e5c777e66329e7dbed4612a392887c7be3976cc4e4dbb32c6793a95fad56abd56aa9542a954a9541a1906844c2308d892d8d47f29d85907f80399f181f91cb350b84240b21fff876dc9f181f91661969e1902e922449925cb55aad56ab452a4d152f451f9b56ecca4a6dba82e7db67e2d57447705e7040ec567a4cbebd7a35dfdedd11dfce79c101297f5ad5019cb7a8a42db606390c11d10c0010245316000028180e0984424112c3619a26d30314000b6d8044645e389709a3a12889811cc318c38c21c0100000010246866caa50009203f840a43a2e5418d123764ebb2ed6133b44e4069e1ecb4d2cbcba1a98c13213f2d0e1e0a4123c8e7cb7e613c036657988f5ee3b0d9168dc801884fca1092d6a72a36b5111cab34c8c28981c3045eadb07cde1631d62a5daaccca6b24ccd55816d8ecd38ca29e9dc089b303d23423224c1f244f561049e8874fbdddff2671c78b284b1b9ed0e6e568d40fa113d670a5720f76ebf4a6a741395806438a8576435e8324b4ae8c8669612035684eb75f86cb3d1b159a4240e2e219e5f5bccfe183c4cee0bdaa8354a817c93398b8aaf6d7da078a492d42150342a4e7203d425bc44d235ca20060220a00375d1aa854340bb8aa125345c7c75f5dd3af9a95edee625e085ac966e8c4d61f4ea826f1b11979b9e502a653999f704b1f0a76bf63b38e77f822c81ae263050674ac830240b4360281421ddfb736d0cb6c53a46936df812caff7b4f3da30bd5d4e628e062eecf20a5eac19555ac46d697b82d2d2890a2dcd0c85f5e3947016f587a0eb46b36583b3e5c86bb39efdf3f69c99d971e329b8c29f8d8feb77f31c2cdd3bccef42fb904333d69d94132af247da393586567246a869bce14bf4015dc72f367b32f6f29a5c54b4c847b9b8e14d38440ac6c87e0f70d3877930a260be9727e4397d7953912694d013a3e6f9f371426088b5f411200bdeb0287d130f6f0869952f5126bae5e2a9cd64b5eb0b041212ad6bf1a82e427e45acf2e019761d895363f4262980d7fbee1fb1e2d5554134d239244636187c04cbf583b858d67a1085e3df07b018f4308e8188c8672f88e8bab6f1c038cb3ad924efda414a328a2ae83ea17dae5441110953073375dd08f8235e1c0e8b59acab5957966c28b7a7c98316b8b4a0a66980db2f9f18f322c9f3d9beaa76c428fc38d5531da4fc6b051caca152b9bba39938c06f5eeeb74f09d20348cffe5e78b37201328f41f40330b7ce82f50cc223d32fb7f60dcc0b50595e034591822090afb4c660a7842c83ae618fa1234d32960ee50628c4bcdd0393672f43f013ec8461b248b579cb4cc3da8f055fea791d117f4421decb11d53227695da80cac8c10c67244e1046e87efdd48304a49020f3b2ae7ab51c45e5443dc177b0f1050490ef10404b182f77abd30b8c6d92302bbff33f76c703c073dd1350ed34c7e635ea9602fa2ea537c4b1f387aa087e38df2b1c9352f4971cf5b0e40504444cc7c1d112ffae17de1665b2a07ec1ed4452ca5f32067a11f5ee6689cf98ac43daec4fe1a4a0573e28dcd40bb8b6080a728e1ab5641d64bba34895ce6d9542c7e62f080df78d1c30f5bc30d9957785aa091d81b679569226e6464f5e5f6930625e35d8073a7381f72657c547d6d6957b8a86a02625ccad4184064c17e72d2a7d93a12839ac2507aae8948a12b674c6ae9af30a974d06a01a98e946e99eb349af08fd9a8092e0ab6edb11c695218f683ff547b9c542e21d8aae32116973aa83bbbd896ae671452a2380280e371a37fdd5359ed664d0535df89f16abd28ce5ed8ce594c54e706a942f10de3ae421a26828fa0a236a39dd0fdffaf0066bcc0d9cf787417c13be5e0afa90ddec76a33953f911b703af8b272ade478d53e9365d2eaa442fad3469c07cd159ac8273b77d66641fdd112c4edeb9402527ab8fb708925fb8746d6688ca5396a8a4615b711bdbb0617525a683a2dc26f4b28d2433b4d0206a9a1c991b16ba8461768f9946c58f8b64ddea956564347e2ee9146162049abe528e154587967fc5dd90d6563e810418b12cbcd7faf268897a2091f5311c30dd00bc5be818af3f1ad943940c47ed31ad5089a9b97f52b8bfd40359a89cfd91bb91b3a8e306341854762d412cc30bee39f1da03c39fc041a325149ebb20853af3ef839e8a04fb99edd3a44e91d1928ef3f80b5ec7aa1a273fa960349b52c1674a43c9ff43fc5e39ce2edc44347faa1b61845924a4c0d18890d2670294a10e1f8015a33bc7dd20acc446d6e8d989ce4c2c7794d2eeca2838001f8b1e87f8bba56e929be94db202df243f0faf076d54ec71c70ff7e2a8c7095a5e11d6d07fcbab06d562076828dc0fa236a4265f40c2ff5732438193cc2c649819ff43b2ad94d2a576c51d26f032618cecf2d0eb51b064294ead26c4da83af18436e7910c442d6da530ed698f6887c518bd929424989b4dad1c9c4c1fec45820224e1b7168dc810a0d23504000693c321d9eb8943e73f0e52d02f9509b88cdff7326e034b5814cbe89bbb77c96d834b209f81bc50298f14d2b249779b2dea154469364b36624556b8293e0f342dde97fac0fdfefad666d78b885a8d25a7ad0b5a90e794f2c41f4a732f005e120098f3587621b127ff0daa69a930fab2606c4adb08958ee32c8a029c51f0d6ec53c55ca3b7731966ee2da938e4ca1935602b8b9fe4e349fe4fad048a07341a1842361c6db9dbb1e93490a0c77d9285e01f40b9d1f20ad041697467c099325c102d5a25d5b100bf3f4738a400638c18cb90b1eaa62eb4b60e209f843daad01a21bf7f6501ae4e8213061644fb4beed44db704fa9dfb124c69650d89a1a5ec4bb06b993eaf99764cb58b045c484c3d84706d03e02998a56d448987f4045358d2c1085f764512d222e26cd4c97e7c758592532825aa8203bc48786b0c6f093d186d2700aeb06d2e3a524a42ab11d3f810f7998ea5b0e92cd3b2241135754025fc74309000acce0d7737d5cb7884c3e779689647ae97c781eccabeb8f0ca3da243e70b3cfaaae87d1604a2972524a6f269795844a3ada47bd9f60d511e2b8c56cc0d94ff322e352eb640d072b17db1d8c43145656a9cf0f83d6f9e5ef8530404c3535b5f72b5c0281e17e2625a3aaad1e51eb81874b58407221a8547c8701178f5779927416d4c60da5019cd6ed397d4253a2749c4b5d306d372526301cb03871a12d955354f81163753d4a352ee3fd1ad53876a9214335b9b0dda1c10b2ffe10b10a6be79af58dd5c8da9c535948970e2f48771025421ae691e2b0847ebf2548cd9fd9205e633613bee968f475665b76288d9a51cd817d72671660944bb2e21565fb3dfe23ea6912821445f9904a0b7a2697f844f0cfa160ce3d79aaec2eb03b2b9d026412da0290fcc6585c5f0fa280b13d0729befcc39fa97984f223cbab062ad812eb963d3b8b41c39f19b4bea3f92e20195abe7720c1298be58da6081df3da9aac6c05341dd3c8d359f0dc14dc1347e96d0cee4bf6b19c27b9b82294d0a2cac3230685063707860a93975ba1e9712d15495d1a8f3a6516dde3f8a87465529349cf97ec8c93be7728a0a54495684718ec99982d4d8fdf980cd0d462186290d2b9164eeb126390f73bb1bb6e98507871d39369183ccc92cd88b96de6a2d72e80a04bb830e058fcb2da0433309c8fe10c96e0ca14079a5e7eb2a12ce1365264c3b5a91fe2f58bf9dab035d18256f0291e3b4fe7c59897067f79cc14a18837fcd582d14a2ef22346824b22379f26dfeaa4086461e82bb72aa888c80369cda88fb79a5caa83a590d545052b9273558672a61973f178bcc9f7f7044d673a8935d373dc48bafe362193e56d1b7432fae1a0b90d2404d7638d224561911d59b1ce53cb8464ed61d1034307d51e0e650c2deab49fb6242535f3c7cc4af33e1e8aca2f7d5bd6a6558a4616e436f1c8a1e01a6a721d456a3157e597f824a3b864f591c4b8bdb7ad2f53497aef0d113a0f0a8d4eab27731ebc51571dc62c7bd2c4ad18e607b3da2d6601341e487e047605231075f22e76c28315aeb86ba18a636abcefe41ef028d2409c438c96e0bd055ed545ee709ad6da97967cc01052d199ec00639d85c8b4b7f1c06af27536a5992ae33553cfaf6a08e2e9f0e0397a93217397076f273a873befc11b9aacc304ed1c909822ad5e1fd9b85ef120cf01156c5fff2318237811ac507aaae086f1fa1dc102e20f11a58c143bee8cd52d5d777a920420bd105f0bce75196d66074fe95a5558801c58dd9245b7252209b280cae0fbb59b74d31f622d34e4fd0247a6e86e55681203489e49b25bc4c1860a7f7a7dbda1282ef3607d909bf52d5d18e35dc18c5ac762beca6fb55486de05298c23a1bf4514b01dd4617fda19c6dba4298c84b76e0ddd022abf2f39b2bac505637e78626f0dc6aff58533e5933684c3e50416d032818a5899158264fd4c0f8b8548195ed0621bd3b9adca51447f3fb688f6072bd5ac6f4116d418da63b0de90a21b5f8d8c0259e2687adf9d224e85466d8033f469c030a60fe05132e06650c14a0938342d71047a035369057571421dacd888c3899bf878ba672b12f8966ee4b281f6f711eff2330ce51a76020fce52438e07e96feddee56b81f596d05827d1397138df4b403cd26368c5050832a0d5f2ebde7ee567d66b982b95539de4792386072f60cd25f4a1c68e62ca89f37b3b8f2ea2bb08d7eb0697ff38c98895b14ed48c28b8a2bfa78b1632d0b2a678824d4f7c1aa13ee29d3d4059a9905b890986ea3077cabe26ae22bf4e4198b8b75b33684616d1bddf20a86a93bb89909792104d98880608a955fd7c114da7d16c49994664065281ae3f1d1fdd77add20e97b72a819e8688018f58ef03e2e100bd69a892f6c66a942e954bd20818b3c3a82ecfb74d80ed9aa3070544ec53228a272e95b960b2ce14b71bcc6215a78e8211f3b71609e86f6a0628e64acfef37fda23907c8699de4e4548a55ee18659a7a810598a8b279a21e883a731a636c24b82ed42d9b697d1c92d07e2f10923a7ef0e0775884c850af59c82f3923c69d063e47d43ca0a10ffe9ea348320521db4173227069c8a34db2d6229f08d2373d0de4ce1af1d4c50a8650e5ec2a8937ac26f42aa410d6a409a8ffd546ad09a3c62ed3c4d3596c8bba4047237f4ebc8ec52665038d981b176226759c5f14b8b91510db9ed87a629393fa5eb79eb4ce97495264f677158c401ef1040fd5f9993a6570ed00d285f022ab282a136352317a445cb46a18925a5129711746a85bc940b9a6a2acc6f3e646f67ea527ce2e3f717f23b9223ab7c1c1610778f2a8504139af8a6c609efa218b4c4f72b260ff34012dc959657b81aa83f70d4ede39307999e473a9b74657a28b41d36aded93ab09f9a97c4987a3ba1a2d23130b3ae03e20d83564ae849d54c2e0490da92838528547cb37987c244b40a4e3af171bcd844068cdb2785efc1e492f3446b3d05d3b7938480af95e0741f0d63cd19a2db471b523460549cc0649c6e0d890b74c9ea5b847d373ef0f1ff7802b9ac4013a00abde28350ce364c9679dc9b91a78d94ab1eea988420733ffc80b4ebf74e0cb700c6a9a7626f7f10a23f0a4da181c7c6a06e22f5308356677e7b226da73b99456ceb829824fa663ac0b928768d0e2aa55f164e3beec43bd09ccb9d82b8c67298d978f4707c0461580f2384ba8530e6be65a05b5f1f8e91ffc1be2dfbe9f0703752b5175b747aae90f429360a3d2056632e33c9a0dd3a75cb810da755bd87ad1cf947e0599726ea2ea4104c03cdb2fc7203cfe8ab909c87a4acfe1808b16990fd049a8addc1bc96fae0dacbe4fdf57a52ad4753baa7c3069ff85af02c0f4af7a3abc7eac5006814a4430c794a76e4a6afbd64ef258bf4c6e084319c3ff01a898106d93bb264ce6f24718792823011f6e7f6c678580b80c4b3a4cb81254f1396d71778e6101e85d40d045493367e6487efad55d3c3f8606567198209cd30c4ff16641f030cd9b1678bf1139d1136750fd9214e2afa815a0b900f8b292a84ced49da7194ae9fea5cde6ec9a131dd21910978936ffc60b0ace15f2f0242acc776f99d2042348ce66e9f9dc969275fa3966d5c30132ac1aebe3445ae2a90bd019038c2a0f04e538741a03b476795c50f6688b9631251fbf76add1f2e3074197d1a5b79f78e66f7e3843a6cbc59ff2be5e82e1e2b0fef131691a2d831070494d0325770b3319a4d434edbc709088fe6827e4416d82927d1a7f40691a08385dbb323d15f43ac99d249c11d41bfa63a6f6799fa57d9aef2d56793c26ba01ef8b678ed1f6ee6d09649d770eae1d60d97248996e37b99431dd1954866ed9d2594b8f7cb8f7faa809abc47ec4a12f780a8119cdf4843ec07435c71da99b03df07ae2fdbb7f9b01119445f69bdd4b126c65e0fcc7fc816152b3ec5cd04e7e66cd1c8441b1fd2b1e8f278a45c1fce5d1e8def1f6d4c735cfc6cab643b46d9e7711ab7d998b8299c320daec0a3c80282c926fd1c0225d1c8c5b7cd846236c3da5c98de9d60e36886b0f436adc73ea7e73e262ae4bc2884812e012fcef6588dd2cef5a745883372c36a955e50bb47be2b394912f9c553efc58208ebd2c1aefe3d4f99fbb4fca6aebfa3345c61baa7aca577ca3079c11daf4aa8c4bc6c9556d70c91cb522657d174c69919ff9e2fca264625de7e8e8a35c8f008e38b39355a3fc78ee4104425ba63f19229528ea0e9a993ad943e47a333a51c6a9a8661f20138ea7faf3e9957e597544aaa48b25060ac0cff5233d98e53d2b556240d98a8a0c3612136f97ab801f7e12d8761202349164ea670e5dc3c636d75f383a18c3d3c1cbecb45d2854528a7b38681b13cc8860c9e5fc9e0bb327acb1d06a9770b9cfac7064aee223e40b7be194cfafd889023cfc68d46ba38e54105af548e96a5fc9c8ae92fa22176af23e3eb96d9f4323aa3d0a238cc7cc6604650fd5d82c2a42728ea522e60fad4036f1280114cba0a3a95c11a61763f0de6a6b1aa48b0fd9126f59da027f9c59549d5a4900c1a82be9a88b0d708037f70f33b9465a2b6a716300aa2933ea45cc95d8a00e99ec2257b1072da5187ab53b00e3b5fc5b4397fb4344a73bf85c586ded7989b8481f76fed966453347cb1fd61def8e68dd0ba9da0218fe656d6013a6e44d479b98470e0fbbacbd76871cfb04bdb081c63befda622cd6f5e5ef302e88ad9b6ca32c3b68766945603bb52de5ed9f60106679f395752f7dc0d0cdb0d855b4cd902027548ba3bfcbd4e402d9969fab6852cea2e382ab6f370c8cca416743fe7cd9367cad0f6b54c79086f01c1b61554d0d052bfa956e132ee0aee524842a77182050d42cfb510d84410c156774f3e2888608f4aa9980b91e4e202b3f2535e96a9c5890be5b40935f79a03334ee6c8ad3f6e97d5cf4df45926d2486b2badbd1a321da44cb45534fa2c23057df5bf6018c3fa53c789f16a18d6dd1288865498e034086bd0a03e4d3d53b1a07a730f10d7d445b30150fa7e8337bd7549d2c0267f260d490d2aee7542a8ba508e301715074508fc39b03d7083bdc9ac5d998242296f4e1d2169c5a1087459ba358524a905172e4f95abbcd35a30f5af797b9110e7af27221862703e419e3218f770f5f22eb058c8921b4b00447c9d9d0809181c65a9e9097411f50a4e184a0b9207891e04d20123db8e68b1da0cb59c1c50ce909835e7a188372c4bd1298468af08264661095c014d83dadfef47e18747334ce98a9d593aa1953512ba9605b87f1d9ec309483e49a3d121daed70358496877228655fc5b96d1ef5c469fd0c610ef613fb72cbfcf85ee30405ceb1a097731bb66f0f65c051a44a19981bc9069d0f4b9cbf067d04301d442c0e4a35d60c239d8d9964149a3e541c754b669699734b843cebdccfacef3af0cbfe01ce850c1a3dd266829b4d2397d5a055b3b12104d7663cd08c30c3a3cc8beca5785de40856d8fc5c15e1195586621d844fe37431ce37860842af9989131492c8d31c640f7dce08934512051dfe13f3aa86c8c594d76725d71074f2bb3d7e4bb0944cb626b9a74773d69412a10bbde34027c80cce79ef39ae82d84b4ce47e3f867c10e74c8c426d9870670e5378b4e0e8d6044de6bd49f0672f36aab5cf1819524e255f1a4c0b9b3f7af370130457d93f6dd65c0eaf19bdc47e211b3c4e8c3267a5dc0968fb87969aa2d7ae45882b0ac60824f49cf12d57d628de8bc5ed011280350e5b64ac34fe39e1322d3ca7e7ea13f0027cc353a9c2f24916417935010309532cb7ebdd217a43d59405d9f00f0c11684a5e993d982b32b2c98d1c84ddc4959de286fa93f41bc04f8d16c3142bfbf0d0684ed7a6efeb0cd99981214861f761f269843c2f3c1d60d823da378c0b312cf5aabedef1ac125b0272cb6b8b1bf045daf52a68d894d5079c4e6e85621d5208f566810acf4b7be63eccba472111328932dcc2529a967b2956340affff93c8475741bf9785ee2cfc95383cbfb558d351bb7a70cec0ff8008d8ab5401788dc95f5a2b9cba486c32ff8ae013b7dac5de583a3e412a420a6ce39b50180db4ab970fbc72321790572f43f5c5aaff153548cd6ed9a41529670d6015629497fdf9bcc22c591aa9bcb1362e848eb4cb6b610f23828ee15aa368510fe9cc4cbbc3350ddcc6a939404e03ec5937b89e0b4040c8d1df7c408689176ac3ee42669481ddbbc637bfaa60c8a7af05e292aeaba0a7bf81e3b1fe03496d2e0639abdec92af16b8a592845d3e3bb178ca292909a59ff07b62868051fe9c022a88e08219357a8a1d449e92ba4e9af7997b883cc125af9203a47a624c7431d1a06da226eaddfc0740ecb79a0eb6cb342c06f56936d4654ee8466334271ddb525a0843768e881b367c8887eae56389cc557b166f5e5e3930062dac789c60c9865da3eeae38d0ca98bc6462472c8e02ce41db880089a13411ec88dbf6b9d135bcddca30fc881cc8216287d6c908657268706ff536976aba4f1b9ab6b41a39db0969960786063f509cb0f9f4e12a87327a6d4f8402de3995192327fc8bbe5d91894cb56f940626c91cd936ccb6fc59e8fff1f65f7cc7217e880d9bcdfdf95ae2a6f6a60efe99115d7ffabbc8e0096a747f5c8a06480f9ee87eb04115a49f38f030135de04246d0f461ffdb5ac0440b6fc648232b11d5d34053e417a9cae4e613e3241bcf054dd36b201e06dd4e11a449067ff55743becc50deb2190b0cd413cc0cc53359ac991039def6833fa72bb4b45448dd4db94e14c20eed35545831e8d00234f036f54bd9351b76419c09b502e204bbc5dcc3ec1e061a906df13d003098857f8db7c6d0c6fd0c98ce176fd57e8d265cc38c2f8308f73dd92e48a509f9cf69630ebdd2d660458a032c275e2bb30d4ae097cb2c79e03d9b6c566e8804ff6a123cb540f6271ad2f08fe0249f40340d5a96edab7720bb6b0c0d0215bc79256eeb11a2e55df4d967b2fd730af666fa054eac26fe6cd2c8835b362684e9589377a42ab86935e8251a6a9dfb7319554ebfe176a0dc6832fe5081475d631ec44449de385a7d8b4d7581bd389d64112ca6912e28308969dfe59ef37422eec345199cfa565016ad5960f071fad8c322be3d651f94d40ffb9b4834017cbb352400fa5e63d9033bf075526f7522fd1c827fa58c2916e33d26a2b08f70d06bf86d51be1f2c386001c383b07fbdec6da28dba57a8fa8debee6302a7b586029cf84278b602b94f426d6f9bb7d68cd2d211cba297d71101fdba9f2ddf06e063ece03353d9d86ee4a967bf613f12888039a01ad151ecacb02f98a93a138ce646a03c4d62c15bc47d9e6d7c788f6a61ac1366346d8ae423276979bcb6571caf4feda95a714a01893a0dddc095ff45fcff9ef21accf42ff12ffc49446d0d519a8386235a0ef83b07fe84fb47359177fab0efb95dd4c61d9ed8a634bc35ca753eaa0d1851af5f310528ad1a9278a94de7ae9069faddaa0d1e2c36bcb8334effc39d0b6084dec32cf59c1fa4e47a16d7e29a4b625f6891f17d5dae01d850cf655873f2e74e7e02cb88054423fab0385ab3dead6759c856962dbef6b33214f2a1113563d419624e07bedf5af1fb76c7ed67b4cce188000cf299073de4a07e52c0e85bbf3b80ea027891117a9fca202b85f9438c74b77ac4eea0fef130ca558e3cf07fbd09dc4518a9c7f816732c17b0c25a3bdcc791143685426409b23a106428d56d93e237165c00cc624fda8c9239dd4440b81f6ef2d6c88e089f6f15006924ca45355c58bce1d584733a9d38416259d1578598b2294097da3401088c7fd0290fab20edd36a62bcb3d61c8679982af51baebed844b885291960e12c760eb50d5929ee8be64a61ba5c7e01031bb4f022e03f7524c93f49a3e34c001759963744349335eff76b2fecc10dee58290040541c5ea20f7b180c9637e891563d3e0c861ee4895e06742e94d65c47c4395539d6cf9aca3f2215808db36d6e1d241e960c2c1868a53ea63ed868461745e9ba9ea0ee969ca7ad8507c20c51110c4fc56dce05f2a42f89f9a6ffc1e92b98535268d15104d22496f384a1c01dc2292eb918061069a847d6569dd33aa3aa24a27bd949b0d8700e225953e30eee338cadfad19efdecf6b57c00bc877f4b6d8fcb60dd0b4f0c22614580c6635c8415205acbf1488a2f1617f3a99804f7f5bda7cf93dbfced85ce114a2cda35d5b6f4312d6ae7d3555c26d77bb291a8d5d66383cdc2a5d482adfa04ead337fcde43e6c55b71d3539704a4b0e6c7b0697d18e94173ee1849506e989de8a0604124039ab1ee117a41951c7c7aeb019df7edbae6d9c00dba6ba858948e45f3fbcb19f4f76c66077b7bfe5ea11704d18d1ad308ef535e8ed076e6302d94eeacac1b2525fe8160dd6112fa6d15ab2819fbedfa3b6b80d0a81cf62d42bdb009d1f448f0173747416ada8c8500a60bf56ec71d8fbb2fb36442ad8d22e3e3462469a999dfe6ba92529376ef2eab2c1a980b58d6894852b69c6da3a01589ce9fdea3d54c9c6f3913fbfdf030ee116877f4287fa1d35c1143f6aa2d80198de6b559e094283941851a9ff520fe0c3bf93a3c991298f353da362e0c338ec70feb32bbc6c0a0caa04a6301710d846d0c946872423f31cf84b730ae468ea220d64b382e4a5ad92db104cb2fdd8c5060b30bff06a5eaada4749d2ce4ef01ddc9233f9cfe264bd929c9dd0d15368ca5756642a95d836583b96323af0f52042012d0505b19c2a4c35300a621811738d80624441601cf879c0650e3dc60f478578361fd6311ce7ba876d09f1cc2ac903e965ae6fe4e64cae7aee264c2dfbeec899896a9563db045b2c9b9ec4eb9a50008e6b746cfe20c965612d204cae8b75c21a6ab5eccb16b55cd5bacd8fa84c0cb9568844fdae312567a2783a17b21b1c76df14923d80aa8759993ecc35ca1e768a425bb1ba121389c0b6a61d618d6c34a02a900855db77b3ca86c624d2f99f51a349dee4505440b583f3549dea426cc1e3581f1833560e5180d1e068e69ddd3a421253fdd19c4a320d63643f1778152d42b60022b8489da49d781a20631009622298fa41ec04e0da42cb4e1bb016e5c48fb39290fd90e4e44076a0f73281933c80ca48627eb93d2602c6d46c29bdd8d3a6737390062ff315033e342a24947c597fb42e68319970a85da0d837b4ec8075c37c630bda0708ac5948a8904045268845365ebf1aa5ec1ca2e2977a587bc7edd955680c57234d1682a7099548e98372e2d99c8df4af171d7965e9ff68656071a5ce8c89d4cba55ca5328334a880411e91e4f935eba99e5bf15e04bb7cbbf0cd6fd6aaaa378e9fe3b2f6ff3122195bc85fa32928441eb52ca3c8479105d3ebd105dc6a7cca4a78dfad9ae1bb67770157844dfc52dd9812acd8156252fe34a4c049a3b8ad7efc24dd00d931e4515054da02f551c96940ad4cf606203a9fe81aa59ade50238f88d0a41e279604065218df4819fe1d407ff4940901802ae87df67c103e1d9a0a5af5bd84f576febe2c89dd1f6da5f43257d87c59da459a3605f4311dc84c13eab3c9f7cac311995e21fd08b195181acdc8601d9212c69482a5851bb11d9d9265e0d0211c43263b595114fd200577d638e97f8bde693b89d17aea3b28aed264a76ffe19842c0aaf8086633420128e0ae63e0784b1bede39fbf3170d26d802e73c58f5b4493395a7e9b1f896343dba2d61dca5476c008318e306f19c481a0af6c13ae3301bde049fd1458bf6e0be6c8fa7873af40ba707652f4bd3035080315e808fd18cba88efa916998aabc7a818e0578a0c11427275663c974c02bde01c2caf5810c9a4f2dffc0392255c52af0a7c317c2291ab6cd3d9dfe6a6c742754417005f9fdd6d0bda5ab2df2ae000c90924cd4da542ce878b75f9b8e8190e5a55bf37e90914dfbb0c8bc021a8a2c2d5fd4d33848a617f223a0ed4aef0b2c665866ec81ba5c85ba81cf4a5a59beeecc50a38ab61f8fbee1510a5280619379baaaf863b8f9eae3f03312cd232352b4dbca84475fe4f2ea36cfc2104da6df6418e6873a51ee316dc1f10115a7de23fd1d9cdf4fd1cbc30618b0dafc478ed273587d7b4e1a1d2ace91a3c98f08a903789ce9bf96d27b3fe989d93bfb5ba0925272152b030f7ede0066ba537dc8e9e512a601901fc5caed0623e23f201e8676ea1515b4f34d3994e8950ec70603c61301f34c1558a008a66f171f33a302ee0126fa72babb2521cdb9d77f95fb7584adff740795de5e225b0c325823abd74d52a23681b0abdd778cc2d96bc2708fb569450dc4fcc04e29c33265dee5b6032e908eab8eecae2e77cfa7db107a8f71d9476f883b758d5fb580a2159873da95840eda943036b614f0db273a0949ec9adeb68cc58721b9c707deb815aa49a009a441da97f80a00807276988c469028db81d04b58e4e28cbdd0c4e436469a57d0dc0f7281ce1906f1ab16225806cea4b6f548548856c3e9304429b26a5a85188c9c1ad147bf6c03641294bf85bee0dd690153b616964ba1ebc5188f523e8832bd8e00f04ea2010e80e18048441280402c046a64ac2ab5bcc2447466dda499236a3b5fc5f20ed9dcf16254ca6b83a246a90e9d1ee144d4abd054b84a200dca3a9f44f775f3c1340fd40e694f7212931a022bbd5d2b8ba080b35e10358b6bd268019a3022fb8d4645e6e4477f61db88858095beab5188f26d53fc2825f7ddd430b6f50f1516eee1d9821bc91e7a55b34ac354a7f4d40e34cb1a589aa33e5fe9e404cf6d23d046c116248cbe6a74b82131c2b6586150a024bf758272c28be4c87e528bf8980227061de2a7c8da0709dbc1f9fd0417a1c903f9adee81974f00861c28be0dea8addd12835bf357baecd9f225c7157a1ce799810c6413a12ffaa6bbd96001dcc5026dda7f40be8f209a354b0648ccb601ca0a6913a4f2b12cf097af6a222e37aea7ce65402757db521a219e5a43a7c7591763a05d1a68c5d47f88bbf356c9606c8969313f2a782af6a4365634c1e4ad5565083a3f2015c5096544c40dd1a2e26ef7c7b11aa4bcd880449df77d1114011ec3af984148bf1157315af80fb55ae92a418f6426dfc02dbff9be153e7e5b81e6821af73fd5a1d392d0fcc9c4c9d9be5ced4b4ec4aac8822c69897fa560046d770d2d5c8a460ad27f46d420cc04e4eaaa745b0c8b1bc71e0aa0c07236f2af1ace148b1c675076f64636d72339f49831273924afe4dd2fb95a234c7e0c272760202741f67f2c5aaf26b156fa760be6c981264d16bc7beb6b82b57c5fc505fcfcc910ccb82aaf9a4456f761fb4020b724c0861ed76429b0798a731284f6b8cd5bfb581897c300953dbcdaed2a2192384730acb7e49a246e0587b06e34aebb43ba57b7be2db7b316b125db699c361cd212565069516dde8c4e803e86fc6c8c179fda71ec92f11a87976477a16985822ef463365efb26a8389c9a3dc1bbef30ab7d65ba26b2666e069e16661c0e60cbca7810211c1c0179a7fc6e67d6a2c4e1441de882dd6b85fd60a277a1380e4f48e142fded85cb166c061256a3f67138f3c06f04db862e947f5a96c31f87474a90a31d4b599d0ea9c361a57c51035a5a62eb535dbbb11156807514be4108f102a84247119f1d1e655708900c61f20ee239d6ec3c8f63bd033e1ce156dd844fd2f4fc047050f73a3a65014d2e1ba222b5cdc2e653e15ecf7d7e51a2d68cc9031fdf1be51e5ad4135560cc773aa4eedd31598c644dbc4d96e4151d88b275e892dce908c48a633ae43b9311cf348938f01ed534801b03c40c6b0288c51c2de84eedef91867287e5216a4182c7a94649bd87809f40b8a7c9237f4da57333b09e97c01d7b01fdda0cb8ef58f2f0fb5e405c4095f8bb67fabb8d6f22f071371fdb803f165f9c420c8adf4f408c40f28d9cbad3a8bc87496855cd570cd49f645cbb4b7a7fbb04ad6e14b0efd839218da9012ea846586c1ae64c812d986440a182e525b8b9bdc79482a45d822fed4c890091ffc82db342a4abf6da8c3e6efeb9ba413630d6a16ff903b6931b64fde5c30ddc7642b1b670995260cf092871a472d50329787bce31d9ab6700eaf2d42ddadb4e97bbfb1935e64f727651803f832ad03d6bdd6273d2853326be50d6e2842bc04ce87c392321068273c818080716c6013cfa1beb1e0640e5e1ab081d327805892c1d01f59de276fd8f8c75349437b3de98d88129e0c0e6634fa79b552cbd0e482a203b8133792436c17c6e9a6be7b40b0e3cfba7db499f19d4a72771b8956331208e6aab0ecdf0ad3bb776810c3b02192ae368ce0223d520a04461dbcc565d359b085d52931881241fdb3bb4ba09196adfbf4bab0d49e473a58ed30d5c261256b8775ce05ded7fe6124d200c5dd8d0c635c10b4deb885eafdc01d6281f6631f0336852b4183751fa9e86464beb34a06d8d61c4e99a70d49c3caa0ead62b9bae240b9b51ca53a0afd88a8b1d8e9b1fc4b5a58538ec2704551c0a256f244ca256a62bbf4bdeb23a373512170df23c88750c45e66641ea3a5060c91ae6b4a16c95091afa1a2cb1504ce272bc73a0f07ca05935837b33e2d7f6f535603ace76a1d1c4f7534c3e38ebfa94962c24b2c36a5e92fbccb51b8d7ba9099588f29d6d31223620d53a62125e334e27c613fee78aaf14a4814c08715eb9ed38485666f46f61e026bfccbd1f55ce45251aaf0fdf14e8162ae615afae907219b9fe87185043650a14e0866b4fb44f420d96e845e5b2da0c09421fa8b86c6bc44666ab9c9226d8cae27372da0d014737fd86ef34a447bc2853b677cc16bc3c0daaee302de5f2e94dc1fb0d431a3bd83f4ab54c8f9cfcd6a0cf2dd37eb60214bd3523cfd29a8b49bde9364c41e127163afe19617e96f5c42bd474d488f47b36c7eef059b6164d000c692db9916b9d23cd12efcbce3cb7d96aeb0929bfa90b1d76b724f3b85bb25613ce5790093b8cf5db70d4eb36bf4c6838523c1bcfce73f648a6c55d4ddcac1e7aff3256b5647a8c34f97f3239b411037b34b280561a473cc83572b7f4d43e100287db588577b3d44a3d5a6fac77dc3e60fc984e4b60d143d318abb90b8e63772a0e0792fa1ef2d552e3ee8505b10ff11abe7f850512a061acc1b3b7d44341d852eb1e99ee3b3918c8e4ed0d7cec476630c256d503266f61bae2a47ee3ed6c7efb7e657377597978123d55f56a2bd1aa099b1632e690975d8751ba82b65b63da4eee89c356e5be8c125f216368380ed39ffecb269765d377a48d72789bb0e46ce17309230881ed30db184a7eb6aeaf941fab458b5ad345a80b9e2a57440f4c6d716c56f17fcfaecbcc43e68e194ae44ed1a98c5b21fdffaf2a5517e08d0a49554bf1b532f53736e33403b21d4f6a96ad61dc86a37b7f9282b5e815aa7e2eb19f0c3a22205b0ad67873fcfdf777285b85e4e93bf32c016e97a9bdd1b05affb79afef71cb3d21f76240925a3ad02b0f6e0d0f4cbfdb754e6521712ee5d15e87b8f649b78424c6b86b431011dadd6448c2ded2875d79453a6bf8eeb9b98ac1416f577d51c91c6113fb72c09e852df60d124d5a4b5ffe3c878b5bcfb4a5d29269a3fb2c6c6628f7941fbca5d7ca3f3fa19ac32141fd100398d4ae051fd8f68ed3dbbd1f02b2c9b64a0eb72ff83d00815b3410e6d42ad50a0a773eb089cd47b0821e2c0c40855caae27e8391e9f604fa64867d3928be95ff49513f287e6a7a34a3e28464cb90062b9f486c0961b0d2a9849610062b9e94ccec999e4552c3cba45a3f4877a062d9abaf711bbcfb0c3267704079e3d0deaaf6edab8b9763bc323843a75a868ffdff7ba4f4eb542ba73a137a9401616686f96c4a66321ee41d01e9207cbb59d3a4e3e15a68bbb8929b54440ea1cd7016a5c1d75a9cc5b9e69d8e63edb639ba5688972f6f5c678f3146d165000e8c32ef29b6a5ef713f6efe8396c86d35c5c7b414d075d1c4bf67f3a7ee343d9e94c73e0f4cec7401c95144f2a08be34d1b9797303aef299f2fe18f36114bbef4b72800bec489752f8a8cad67005a490678eeb358e1cfa23c009a61c5bd1601e1cfccc550c9ea821dd9bc65aca3730b4d7aa19fc03ec955f140d45d5afa8fa362dedb11dad978d36b44516e89fea108da34e9a903a50de82a0012dd47298cd878f7506a8cd016d8e542a39d816eca1680cd35f8329780635fe92046150146b50800846e737711779070f40a8be965d6f00f308483db4160cc199bc56fe639c6c4659e5e8335b0d33ec34760b8651cdcaeb1744e1754c15638f5f0a265315035413d5fdd6d0d632780b3f34c6435c965592547e6e03613d37b620383876b91d7268a7b3a01b8ee390e0c17a930eb7fd28bb60e71a6cb61bc9552e1b34b44a176888faeb66b9a7ed3781cf6416502325860c5700ea9be30784e130a6c4fc9dd3c478bc0624a2fdec9af089b7b3b5ee48b6f65922ddf4499a6065d9a3ec0781e0147452180fd3c469009d31fa7c467d3a6ec809b9bd6a51cc70bd7d291093c1a01e5854cb2ee8e055951869cfc4a91d8449c9264a2db8619075071eedbe5193e0e4132e64f2036c68c657c23df8a7bec0780399db09794a4d5807de771e5c0b1a7572e22922435eff53a4977829189b782043c82562769b532ff9a9fc76d6c6077d6eb83a770d83e0b066b5855343630fe3518cd1743a6306b8c3076ccc42183849478be7cd4b43192d93b728bf42af20f93c560b8c8b07ffca2957e2df8a20146ea13a50170c27c575f30e6851749507d72c39f767c8c83459f730294890d670d4629de9293ce069edf5b226738b5a8fe3edca0bb4816027481670561648044337329149d562aae6e56b7f029eb71add5911a81490654b5a01f1dea525ac780aa322ddcd33f764d2265fadb33724aaad3da2254914046b5a28f93fc326615136ebc1075b1c76d089c38bb7580a15c8e97c27866c77cd0adc6c6771f3b31c417745fba357663a33629e3fd6b4491f59d1226f8b5b84096146c4a9f05c6efc1efc43050de687d53c1906cecef161c384fe7c1c4e77fd20df5b798b8ceb21c8f5d28120c9598d95376c09c68823f1252f57751d7cd2fca2feacdab6dbc3f48a43b849f26b9fc17b8a89d023cfdf93dcdf94fffffd9b6b89562cb085e9b51dd4a2d17e2fa130c7a234753da83621833830b862c0da5c5b788eb8600fed921806f21592215a571a2d1c525617e814045a0b6562cb3ad74bdaa441883ff40ad5b450aba502b4fdbe10caffcb5ee8475e7ac21d0b9e1230f9e1a9f30de7b52322162802bad41419b6955cbbfa43a80e0cf251a601d614ebe225696453ade66fd0e8b184df4150df2c34a0634565c112fd9b104c229369a8866d55452bd23674aa84c5c424063f4a1eaef3c28837c202556420aff06f36598740b2bc01aafefc0fceda1b37e4c4d7e91952c949bfd1d1655ccca3aa75929b5aac22ec67d2f9686038e6ed1a2919c18c6ffcc9363446588b2fa84d34a9608ff8a05b7a34a40430df10274c01fb41128cc0881936a7b1e3f487b905a25e77966991b99cbf483148b122965d159ded288521afa1a4942ce39427a19fd2b3dae9390955c30cc83824640be4e6b46a67b308df52bba2b54dd1fb2973eb575f5dd7ef8cf28dced38d2c1eb608a0cd87a5ff7c1cae04bd8ef5e87a521d79f4156abf5e344fbfd0e4fc9188529f2a0981b29770d54fd8ff8f8a40e2085b36dd2f74433461ec69ed5425d32bc4f7c3543de6d46d7ac8dd3650cfd1c9844514bcfd81033e238b63a86511129183d4f53327dca6335fc64518855c6ca40626773d875be818a8d80886ec2c5648cc4eabba98899763c22363f21430e4ed3d06bf534dc195fcebda6796795396c4f7c64505f86b89a15c6a1259496bf11574278d47eb47114e69a00956a7ced77f2ada2e6258e1a36b00e050a6d53102b66900bfa68eaa1e16813101461da9d0298a83908642adc924d5dfe30b29e9f12b287157d80bc05328c0f5dccada710d51c0f790c4062114382d11ab19ac1347d0054d19669a8b5695fc17b39a60097eca8274e531a4c2573bb2e504e6893ed3f5f3261c58f71d61ff53e1da65432a71b77919977e9e55909bcd0dd9624cd49f6d2853eb3036c91927e7c26e6b83ed31dda6ee6d93ce1c2156a8a9377d8046c46616848dec8420981a027e6e9b235ce8e96193c7caaa23fc7711b1f11a23d58c6415c8281288890c8d27e3a59d922e0edd1278e6de95a4266c49c08d440a0b2b9b285266768340165a60e6844f2389a72fcb7868d9a86fbe6815d408dd3dddda7470ed380c6ac0dc8756581cd2422c09fe3357bc5131e22effa9e4069b42439b4c8670463c56b8250ec0b8d2d11e26abc8e21d5e59d79932bc523d5e629beb1061b463d6a0f56db1cca33cb490fce953a0b5778f4a9d7108a539081f47ea84d39bcd53f12f6670f5f4d53f567faab0defe420550e6bda0bda82f932029ced430fb04402885d40c2f2a89a92171649dc25ef0fd3f1d8c595229934a19bfae2101d7746c6d9dd13d806a8b1826dd154deb9489adeb87405190dd9b538453125071101fea57d28a7a27a3546db8ba2a68aeb71169fb6d28a7bcb03471db1c9edf5846f35a61f0bf6a79ccd36da9e8d6cd49ca63738459c857bc449ecce67e70c13673bdb38157cdf91b0df870c1dca28381e5a7e798790b158451897e8a0176280dc66ae11331de06c386f3fcb7a80bc820007de24bb15d76a93180a0bb5c9c2845020b4e2a4aab18e89354cd0af3a70cdc98be4abc35d0f3ac0bdbe6e785f839b5c9ab303709fdd36c8b953588dba7a1d1a88d8bd08fef868577c7d9c0092287f03885c8558295656ee983bafe9eebafc2c8411c6171cbea25fc0c31ce0eef3b772c904970ab28ba2ee81ef238660d6cc02fb512c9ad6cb513410ee62a9d140a5748d9d5b2242db00a2e4806b3f32e333e00ec6ca978194c0a123919d903b00cdbf306bc7d310031d8005d9fc4a1a26409a76f7e359e7064746179c715d7380f370adda84ef1d52a57669a6665fa801a899c65a9f883bc773718de5cb4d2cabbd68b84733e9b84cd0d2d3c556d0749b3b4316c73fb6d71cfc170ca45002ce42f26209c498fcfed037991121abfe51598e38b98b29938d2840ccc9c69cf481f862c8fcce0b64ff1867a9c9bbca3a483e3e658063585c06068e9c4d38c665f50a547e04c49fa37bb5dcc9b275f7d8d3f22289248e826690affd784f7424cace37bf5c65790291bd8ed575607647a92912e75aa9e79bbb9db16b0528dc1dbfe73233872b8347c2816532e609e177ff9ecb84967dc1a4b0453c076559f41ebff351b2771d1cdbd40136c8d926ea8e5ff1729df70843f13dd540a4ccac115ebaa2ed8ff1b914e78e4b733d55b6360840c8d825998c25b474b7d3f8a97c3d27ae780ca7eff70a6c45e6d0fdf249a97138b6535d0cca5b186e907abd8cb9938a1575556ee99bf6bb6a152fe9491793df6e42e8477b1e16f97a0e39c5798a7b468ea98107425db82481e3a3a0255c709af2a20b2027076bc4c178eff3b0130e0916219380f0faed4d8722c918b981e038e01a8e3ae2dcbc9cebc35e35d1e5e9c0cf25cbaac088c1439c92831672c77173a4e1988adf746e4582998c7cc695aaaa8bd2dafd7222ed4965fea514fdf0a32aa7f7599e44ec403c0071dd600be8b6287217a097f767e2fe8bd46af8b7f4a6aea55912f0d3464815acb9ea92f6a3e6a50691ddddc75e09905caf97178b76c43e163c027645337ed71a4861c3ac756591047172a4a3490ed52a12a82c65d3f989fe7eb2685dd8b7c443537dc08538c04234b7a9cf2f5749632eb62fd5f1b87c5a25f4e4ea9fad880bc9d7ee7dd9e76fdcaa448eab8a28eae2036eeedef757d61f85f68e2d6a4a883d8a688006486354223f537b79b54a84cf3c73e74e4a5182ecd77e97b9eafdd70e603d574e995ed60074d70968737a7588e28da5ccea333b54804779c01a4f9d620b4f2dd449225f7dd1efab65cc58060b99e8c274b2ae713e93badfc42a6905f3dad321bce4ad9578ab1ac91d6ad0d15031f7c051ca0fc1464bfba467ce3740df478c030b39ca55c3a51c25e27e492db22bb7ca5e23ba1e647beab622798bb2e1e5b94831a53d9c1ffb9d84416e77000c4fcd639a8b4785020673166ce802a94b6236efac3a5b2c7b8d57c095613ca2ccc92e1c9e65325315d85ff6b1bbdb29235d21a34b1b7079f831f6de4c9fcde8a48c79e08f050caf64acdf7d418c0a9a734a2a784e2fcf405a7baac50d9d7ebebca5f69a7a0d72ac0c454e8ad2cd9e314a00996038933aa7bcbba86781862a2093476dd4d8a64790d5a97eccdeb2d10e9213332f140f2a5a8f40a5e82fe5b72c490b525112f00ca363526cf0f1e7f71a225d9a7a3326d5a2cf33e341e29ec19f862aeca52299f3928a6b347c4cb6209c1ac507baaeacf299786273e3dd75eccac05b04a9b5faeb90bc12f73713f1eae10093bea4a8ecc25885f963d018fb50b4dea04cf4abb01d1e6a11ba48883eecd064b9cbf05f590657a6e8fa34b35cd7f23d84f95e2fabcc2feee602255b073d6b4898c1f840e879343aaa52f5eb84e652a7bf275cca32e0a147a61f8afb35ccca0ae9751eac18b2abd09955e8a52ab49c2a7436157aa252a1e9e56c914ec5051d0f05d5848206bf1de85e11549022c489bfb3df6fe3f54fd0df66055d26485459276e8792b98a1fe8b14c4cbfb52fa4f2bb73992130ccdf638a877834d49d29683c33083bae34bc4b276298b65fdd8525e96a1fe98393d9a384d9195649a3d806e15ff230a554e1e7aa8e63384910489957ceda5048a8c60f6ba0a6587a77f7584473f79409c87705a73aa26daa73c68409a9c6c3cac571d566bbec82fe9d1628dc7c41e773b594eee24598d9cd1f05c39ae50ed186ee97fcb0e44174c17cc9309eca53de902637ade604d71c19cdd36b7e125a5b64cc0d3aa9fb293a0e752714e6da8883554cc076957c2eb4fe19f6240e56f11eee8212c88b7dbc17d623fb71a18a9e4d2625e976b3d304df8a77ac6f97c48779802ece0e5233ec971b89099cb626d21c7c3bab6ca2e9d3cb05c3704393ec094436d27c170415de1561d23c334368bcb115b43ee3225b575fd4cfddfd3e10b61bb0d6b9822bf35ca09e5ccd570a543ea718e90a776fdf14a489382ff837fb22be6bcd172b5f5561f223c6f52cca10f0b2e5efac775f9815b5b8ef6d74515530b91f5a94b96719f51405a8c9944f257d27af23f8624b93fb2d3c4f0f76d026051ab48d81a02908dd730293441662968ec1a867ed04bf092ef4563c7040142253625c1fb5574be57e2cc9acc5a17457c70dd19199f0d893a5ada2611a85057cd06d481c60d66df81912b0c2997bfcc7e5629592faa0652eebf6fe45a2427fc3846359689da7e969b460830837f110fc99c5394ef8244c8e2ce6210847099b3514d4cf25e716279404a379f7c8219ac1c02083becf50cec628fdf45b2611750a424c1924a0d53dba07f7f73d753cca9f48a49825f419505becda0fd8b0e7e0f8297134a7dece31cf55870650e5ad5e816aecba3a656751d064449e466f7ddb5af25e460af5a237b7594f816f800922e06eed8b6b52e0a5b759b6e4989da77d908104a3d9ffa14e6bfe4db401d0c9d80aea141f9e76e53e48f80a2b23fdafe07142e1da399f21bc7cca8890508f5bb3d6c36f6e0aa26fcfc98fb022e0c6c5e01b4713ca479efbd8ab4ea92564fc621b0557e9af1629acca6189f0a4942eea376ccb5576fd73b31126fa3536061d53591e298b12f172a8bf0cbb64e8bfcdb1adbe1a8439f950e2748a27a36873eec26cb9f810f24589fdba59e7520cb2c4d6e66e810597b89637fed9fd96666b32a4e50bd3ecf5a14abb1de3eec350d6e5ebe59c4cc915242b9c359d455397f329052223b96407b7dbcc9afd3725acc6840d4855dea0a2a3be159aa098291c4d8539c0c21029a768e933b8beca91e2edef57e856664a79fcfdbcbb8a48520d733f95e6bd80f9340fa4f7513a4d52c2e0cf79e4fa28b031c112a0970f7e5f60e695b5055c83c044978209e8ab569e356cac11282a139c0127da59e49871f007498b2d72999ebb476ca05989a1c4e978cd6cd740bd0a2829f80a94ae2df4b2918b5d4e87cfdf30f5ffeb2177982e0c153e99d73d7266242ab3c25562a9bf4a9d34edb7749382a52be2e8d8dcafd3acb7800f8a3d50bf0667d8efe1ea86fbfb2cfd9b9c34840f11cf15cd6b2f55879d812c40237d0f37478b27be22beb122379c27090a11168070452f96f58ed959cd3601cf079a38df88d276bc8964f70458102cb5400e4c3ec40b3b39bca254076ab4126cdb17e82395494c3cf4022ce9250a7bff240031f9d2dffb78c77c2a7498d5956326d98a3275642f4559bd914d6e87b283f65307c0047c49277fcb5efc6245ee176c9dd998ff527cf105c5108030e2d03d9a5d6cb4f9b1d71d71ee859bb90aa418fb47679774f546621151a19d8aefc5e637bf981d088e6c036c85e7680bb32becb3bb189a73045de5ae902f45a1359c7a599e7510a8f9eb9348290f9c2e93efbd83588bccbf4aa622ad8229423db85a753160d3c3303dbd6dede4881f448f6fe0cf9ca44888bf1f4d92b805ef218fe0e09516d125218dec3c7fb545dff4d9759ddb3794250a297477286dd8e40dd7f0964d1f1fa6c23055cd80eb51138a36c7ab1868a26ab8445deb905f5c951bdb8e8a3400d3d560bbcb36ae4f1bbc0753311a4cb448b136e07972cb14c706674c8d7a6a3b249c12fed34475d961d1988eebf6004c10b4c3ece7fecfc90e39731768d5940a7692b43d0cb3505ca67d871c29dbccbd9f215b340c9e21605262350f5da2563c738ba8cf400bd490299106d7232def45e8bf92867b5c101ac568e8ca6d06494c6a195c065ffbea55b329864218ee04aef83c44d099950c31ad380f5a7d961d7be398814d48509ba5d01905cea0447bbcf0c7f170ece701f1b6dd096f6e493892db479a9c1ee6b1f61382368acb87bcbd4043c5074e9fb62ba5c8c84663ff81f27b124162d5c409a3a4273782567cff88d8cb417ce68b33a830a1ac4ae69ee5c71422b1400c28edbda5f0a635e11dbc363fd36e8e94a25e5553d2a18e304c6b2aa9bb4d0934003276af123d5cbe04b14713ac0be707d20d2a7e816a841118c98ff27ed2bf11f008b4c8913729ae4d662688ee6381114b56c87b5fb4fa1fdacad3a00c97d1bf3d6cdcc382e0b164002acf2a88cd93f051a891254d02544ca2325533e6ffa529335c0c9395a1c8ce8d4d894a233be96306029dc1bd02d82b796c9d20938b18ab6a558e55d944f01477c155cc46d95898b2d1fb92583aff8b3bab795910cf97681549ea250c317a32c924cb5433d320d341f64b12d24ec88084cc8c036a92be855d30d4594d1b5a48507ce93cfd308e29ec50d280fd76c4ad6edde6e7e779ea8ee6be80e586f99879f5edb1b23ba4878718e3e38a0e26dae00080491f225327e04390a850b70f9d90ef404665968ac2eac7171e6f9758229248647777f70ee708c9071208f8da4a7d0821f3819092242a9f84143fc714a5294653964c9975389b1224654a1072ca90293f1dcea6bcfab73b9c82439fb213a994252948550a13294aa29572a488941f665c293f1dcea448d9618614294a4d4a5252d09490e80f7967a1e3734a3f50ba81d2910e674a43947c50e2214a4cc947290725d71542442847a00c41011412d81c28941ba0ec3cb1e2c9117a7892d4e1ec49d1931f74dbe1ec89921e1f6b4f8ef48f3e81c1107957f10488272f28a1c3d9931f494c26f03da29042802890804441a506109831638824ee1d02087808225c27ae12235d8c412af5ab287ea488a898a23f289b422fd150e82a3fa0a88203144a501871118a255008c1c91b34813c18142e2876b827aaa858b00fe8b287ddb449a7c518174137e92792dca075ea9f98a20436cd9871c444aab1c29d978889b483251329499ec1339372e8a1870f3b24d9e0860a8c600a52131dc860891feca0871df8d0ef9dc1c367f0e054ea574f189922a7acd65a27b4b5d65a5b8456a2a124054137a189d036d0b8d229915c1da6c319d20f12cc898a85d983fe688733cec83f1ab98695be07eaa3baa492ca8aa74de41f4c9f7aea504ae98dd871bc11bbfcdd552c7c75f2af847eefc5d4052674f9f57fdcbb7d646067676727c77ea650ca97d3fc9cbb614edc28f48873c2aacf0e47cc8437f2238d2dda94d30532e8cce5d8ddae491b1b3e67862c40b479cfd841cc097330b76f6cb2cf57dd987d72d961c7fbc7f6367c9405989c06313f4388735f060ea43a84287c2e3dc68ece799a5c6fda962a16bed3ffd4863751eb31d0b0d3d54ca7c4d7466d03f9adb447c810da4421643e7022c909a40e674e30e99fee70c809596c1b42a7133efde3664eb88ad0744aa2b56832a1dcacc50655231f2ec2901e8be0d33fae08af0e6745606a42493761d44411d349de4da8405ba4a227807a94292dbf8583f5ef659e70f50f46ffb8268cfa37a3882788fa879f983d91a447978bb883838f5294224a6045141f18810a2096c090f0983111a5c90c1e8c678e2c20c36d085a0ab0948bc48aa0264181387547f0467ef7f23819bc919f9750f907deac6c3b495a6b82345cb4b4b8bc0604696c2f8f8b200dadc56317a481537f83208d2b9174f9306f93200d1bf3160669d49749d4590c105dbeccd3a61d48c3c5c39fdb69037dd3f0b5f5e9678cb5d3cce33eb3fd74b165b60cf18344c4ec2ffaf0452952fb93495aec6feaf0cd265cf6478bb47cb449860889883e48f1c92453878e935cf280439847538714cc17bc8949a44899144896a20f22e8f22b1149bc006f22105a152f9c03737691961fb5201ae35a10bca1d2d5e96fafc8820c617c1b7fc1025d775e499f5e76504e4a3d8fd61b1cf638952b1c10ae3e94d7dd8072b582ef6978439fb3b1e10dfd177ed45043be5ced6e64ccd94edb72d6b4ed7630cc9836f4f3d651ef73e6620783f7997bae6300e779a8f77eeb6e6c1dc57346791cc31b88e10d4ea1e78e6a18f4e78ee3beeb18f0794628f1497baf3f7737b6eef1cc71b1bbb1ade8d7ba1b79c37743fd0a87de6fa06b0ebdc7dd3bf197a27574fa4b7d5a87df8c9ec2e41bd14683a3a40e67473e01e870c6c451d74b90c6fde943bef9a1e8cb63238234eec6a3f2a8b85a6dc33526a15ffe51cabfcaa34b17a4aa05f9f72f875d76375cbafe8137336a1f53636afade166212fa675fd5c2c5b86baa16f06baf711d97d71dc9a9cb52115e8aa6738ab65f6367c35af875bf143d3fe2f862a71cc220728cabe803ca88380e2e0e24de40488996ed3011eb5bfc2884cc074dd470d4c48101241902081741902a840523e0499aa2831e4030a40a1e0ca1070ea2f0c11582810c5e2ec5e91629a59433d9ce6e81314580190660220672c6840cbec319133d4cfcc030744b12f497ca5d7e918ca44b59974159c62372fee8f4670c9ab24aa74f278fecde7befbdf7ea485aedc514e32923a6f6620d6b5bc61bcd5cb7e5cc51dad12ffea0f44f3f4e4ca26b09a59089fc814ce490222944128147309660505929d1df21dba1a40348966420aae0d3e9cf15220ffdfa428d2ea18e4f975bfa48241d981154d2f9f9745e5d7e9473525aa39c93d25a2dadd6de8bb176b1a66d5bcedc9639aeeb4e278fb3dbd39ab32814675758280bcb949185d2fda5405d5c38fad2224553a92963aaa238bb3f1a90badd2c48ddee96248ebe8b0b47ff8586a5de82b66831656c716da5341c7509f94c618816fcfaab6869690165a83095d0ccfaf1bfc60cba0d5045d3d4c068a9d35c6194d4bf961699144ec0d78afe9d2099f217f7a681feb08a0549030d3fc6971a853242084822e439e794f3b73a27c79ed6b38432fe404937c0c801194a218f012438623a96ab25112092fa29e2790c2c6124e7124b288b11ea123828b2c40f4b08596287257872169c93295a3a9c3961c2c9122732edc408cac90a56585a5c5e5aa4606254322e66687e732739bc70c2034609353162d49400e305df4f33e3424615b33add11e41dc4aca84a93292260848268e42363932a4c10315322095662069a122ed894e821cf94f0e15e3a9c259145e7d2e3e7d34a136fa6930872e97096c40a50b3244ab0324bc206160d8b96981ee30c891bb440c287d40c091f0e091e98981365cafb0548582a8ce4409260567ceb534ba945421326025cda648a4e29a5f484958c6c720419184d948a900046de90927925488084132740a2081d8c8880a9e216813f60a208233f5260c4e3053aafa61fc870104204074eb0b42f249d942e61a4430c231490a0c6c8e7064a29a5940241af743833ead16b28610412bcc0410f2f82c3fe81e78500a15962071c6696e0b1c145163d32538840c5844fcc1212c03891f1a49c18e969e16405af1719ca7fa64494c9044f0b112c495e2b33e841b980472bd1030e9e123e404e5904e99e94806bb2439e8d605b4109b4244a90034ec286115c24b000629de45082ea84070f4d3d1237e894524a29a534e5034ca69ed2e99303a514099e4e9f524aa93542d25b74385b428ad1921844518af8d10810019aa8004896d56006fa83322afad3bfa38f60f2a389099cbc9aec781dce8e5892471cf58f1e51d423378f60d2e35ba063233ed09f4e420f69226d44530d5aa77e0995227e9063b98a53f619390c6204149711463d4618718311417019318408023bd3a6fecd7f39a51ff9be37480b463b1bd1dab054e24c4ae9b76012c706bdb9f59a4bbd7ee628d03aecd78ea48a9f5ebb5692383a49e2bca622716e3cd24b12a749e220ddbfdba8d347449ad6ac925d1ba72a49bfdd9932726cdad4f7ec4eaf16a857cd55b018fefad1d42f6f972459dd7ef28f66dba04ad6ab2aa9d7e754747d9727bdbef6e9a3aee2a1cfe7bdb6824414e853ba7402a263f174b57e67b9addbbaaddb3a0ee3adeb3aeeb9cdd6e7b8e75fe43cbe7d17c0787619bb583dac1e560faba7de1e38596b955bc7779f3e0df5d62a25e631cc7eedd4b6df3a295baf968fecb68e0c4fddb77cba563ce5fc5876b8dbece464c6db4bfcf3f3a661fe75d116f132edbaaeab74eb3a4abbdb82b560dc77fa2fa51dedf4bdb77b7d5f77945eaa6ff731d5fbeac5baa7b71524a2d071f9b682b482b482d4d8f551c5ab9bd0e1ac09a93731e951870e674c325a55f261d639e7ace3dbde6e397f8c75d68f760d2b20f6ee6b4856cfd53a6bcd12f2b0c79cf3d53c86d9f54743d711fff4b073e1f4f96bc898173fe8cfefeda0bd7a8fa70c96f7627466f17e65c369e36954f34f033a9f0deab8fe6973d86d1abb1672cffcdb34de326fcb73167792d70873deaeb35d77bbdb75f759aeee593c9d907bef65b9583e5dd7b15eb7ebba6f07c5ddfcf2d52ea5f7f57d14ffee89771c97ef7d6fc3b9f11db46bac9e160ef740c291697f87ec4850428212a6581740873324549973fe9d7fedfc3b2dfe1b3a1d4b79e5bdf7def914c6d64b3e6d09a1f0a195ffe2076db3c4a143f22f6e79d36e2b480b072546611042c82ffc0abfceafdff2815ffbdd3a629801de164c6bc1eebd33b6bddc1b9753bbc06c0569056905915aa446a002888a9dfaa2938aa31ea3c319154818d207d0e18c8aa50e678433c219e18c8f79a75b470c3374fcb0c3592beb0569df21bfc8e7dbce06b6811f76f8f163fedd9fffda638c7f6577d5d53defeb384abf6081befcb33f39be7de69fced4b4fa5347fcfbf62567717205e9e4af93b42eb24e3fd7d68c6bc13aeef9c4b55edbafd41863508ca78f5d0b5b8743d57ab5605b67a346fc33fbf455f52e364c0b97fa2c284e5a6b71d51d0bb373d6dad730c77554ddb9b03db6bf436a120f0168d6a9ac321ea4945cac1f351e7b859ae59fee34f22fd569e51f4de59f565fd3bee5535f6b0de99f7d1a7a8d2e5adcb77c5a42341ddce7995690d8d2de0557eb4c7e9a168ce5bf0ae4f25ff5a1c54398af40a08c5abfba208d99af3c739f3f66de0a42f3f8e5476e3beade7b2d53f9d77ab57c62abbed534db82713aecabba8c49bdc87c0b7e19f3e3fa5be65fd4f4abbe4c7d5ddfabdf551c25c6b3aeda345b23d1b2fa9f0ec25f5b3ebdbef678669fdec5e65eb56197d97a77bbf5aab129633b82e11feebc05afb117eec26bac85b3f0582de2a0c4a9bf925b416c8d7165d78dda8ea60cfd9a36f4f5fcb6a3ede85bbd5cd92a1c3fd4c3ae8588e22afd9a326ad1b4a18f3dfe615df4d2af4ebfece276acc6b63fedea82379c0b5ce72a10681381987c58e221897f176805892d2eb75ead202d98a683e40a895cd1bf3aa853cb5b41220ad5452613618ef063a9e9084a8ee0d397928ce004a873fdf42c59c75496a80451714d71d4a9c07aeed17ee6b8e75abcd426baacfc765d0b5b8f1d8ed3cba72c170b5fd64be2e0df5b6703f3ed5bb6cffb1451d15b8245de65e9e8204bcef73defe696cb82bdef76c8eed2c23fd9bb77e19fecded790717fac57e739df1833d7e17d972777f947e3a633030d113feb6309e9dff63ba48ef834f4bbbfd971f71e6f9ff167964fff36e9c2277b7c9c7ff39ef5eadb3fbe1f5fd2f952762cc48f5ff4f817632dddce5ce5f2dbcbf7962eff58887f5d887f9fe59238f2f1b378626b87ccf73fd6c77a75f927dde138fde53aee77efc9ed2596f284f9173bfc9fc703c677db3a1b1ceb6e6fc9a3e235ddffbca5b83d8be7f4f9b71df5cf16cfb2bd3f9d3664b9361d80745b74e4f1b0e960512754f7a878eafec4ea89915fe9711dda77819aa3972587fa4ef33e8f876ebf2d097b7f9fabaeeafa62ac73df62bf6c38bd2ea689675f7b2e560fab87c5eab1ac97b7e45159eaf6672cb17a5a7eb46c9194a1bc01d690a30d18de20a7acd65a232da4a70cb1d6da1d682548509418a189a03f5d859e52658afcc51eb73aa50d8637fb25a3e4b2d72e75d8fa1eb08fea94566a5f3440d3ad6df172809e356dc3e915bbf48f523a63cb9e63eed1f618ebec26f43ca58c733bc5e71d7637b61e39e6f501d07127774dc71dcbfda2678d939bf71ff49ce794306fa7f943f4dbddd876cf9893b86321ca8ea5d52ac552874a6b85924bc9288a155194a23c11c5499422a20c45917d29293a0a0e4a3da258114529ca13519c442922ca50145914a028b0283d518b82438f23b0d6421142041a942322c03dd05072b0d6de60438d15ac85b27343eaadb5c2865963052badb5d65abba46998d0a9d4afa0144191024a52ff5220824f033ffcd48c32b6b4efb8fd23081964d8a177e0ae3d9777ccc11bc29bbbe5943973ffb0e1735ce00036aadffd1ba220dfee177025bfdb31a08d7c0e051908c05fff7b6c3b1b14d35bb59c6cb9bc71cecdc998cbdbe6648dcbbbe6e48dcb9be6e4cce53d733277b9ed94c3d18ec3dd9e3979e3ba2d73728e50667aa2a7293b1bdd94b0a3a76e6f395c6ada7478f6ec651da1d474eb79eb9778eedcadb75d6da54319967805dea9e3f2a6ed49042168665cc8a86260522d5e5c5a585650da3b755cdeb4b025bc3f9d12b67dd8e5af21e77cec49bb75baf4f2ce2157f405b9a22ff451fb7fe00dbd0f63abaa6c55d35651912bfa7bab96e48a4afe4df086fede3bd3865a2434cb7f13a4b13365d8acdebe26ff70f70157f47f69da50bbd3fd975f78da74dd5b1f10676947e244b8ea9e76afb7fffdcd4ec3554b98feccb8f8f6cfa77bccfe60f65743a4d34fed4ff7162f32fdb23f5ac4657fdf5bf6f7453a7d96fd711b5105887c94806a69ffa896f64f4c56e50963ade7949d0c37ab669006877a082594ef45202fb24e254def5eef2f15b76aa8d39fae937575eab2300b6479eccbfa5821f6c70ee1f8111a4e9baf26d6e9d7004d9b19fdc64c2f8188085a86ab5aea32566f9313df6673d266b5a1b421aa5f0364addd3f92e3b623b2b60576fc086df32b16f07f15f8ee4b208234b8a7361b4e1bfeede0e606922bdaed1f4e84fe544b9dbe6a69e72571b86d5554544daa2a323f645c323c124772ca45191480ffb31cdf0801b9a27b0810917d64076d2412c7f21cf0051962b77cffc01bfadc07dffee9f46d27a39c929eec670863a4a7c8f517208054430443c6f0e1a8d3b87de5a1fe81cb2bbb65cf97e199262aea73dee8f24665dea8b474a36207f5a63a36bc0e47f7f8b27c8e16be7d8e956923f7575d1c065a7ea0a947d4c32e46948e75fddbfe32d0f5d7987a6befed530cc2ce06de346f54c6bc5119e50788baac31b98acf5fa0e35763f127c775fd6dd6d88dda69ae234f724a88a2c0c9297d15381150c9f322f4a73bd5049027d06b2ba53bfaa8cbcf3198fc729176e5a26c74247190244ed3940125fff291189bdc231189c4991f63ec31c624ce911c24719034d98a208dfb1627668f34c9eebdd7c9891d7f8fcf1044f73378aff98773a050b9dbf4f1b61f2f116dfac9455df2263a8683b42c3523eadbfe74faf699763860a0bfba7aec1e3f17593d73c318895bf4d32d50972978fa884826a2dd8a885a639c9333d1947f5c8fdc081da1dc81a63f7f7b9d1c95e52a1834cdfe0c39b4df7ee333685c27a70ea1e9cf97912bc987a01fc610f4b74a8004202071e6bf90a3be9cb102015448c1004f975c598543fe940f5fc5352039bfe122499224499224393aaa4996966c92a5a59b2449129ce46a49b6243ae28852c6680517820bc185e0427021b88ccbb88c1fa1eb5b5c254bd1963a11411af4e7c652046fe6ff131dffab1e509f33783339acdbd5678c0732578ee14d74ecbdd794515dd346feeb0583fdfc74385cf4dd443f4b12a4513fa847575010bc89ff4ff4fc36578fb4bae28e7283a0a0205e248a0d3aee4fcfbdfeccedfc3a9f9ed340d4bc887ecd7dee3e739b3b71faf4284ebff71cf7278f7f9c17d11f87dd7bd4d79828eef4f9c475cf711ddde74e6b6d035e24c68bf0222f917b0116322c5e3fb07b93601526ed5798042382f11012121212121212121212121212121212121212121212121212121212121212121212121af2c369e053454995235724a1567e7b97d4b780f9bcbdf85c51e7fe65d67245902eead38a1698f73a18ccfebad4c3a46092545d52f77d202929a94bc1c052afb98ed4c3701d2fcf5da0c2522eb0fef2f05bb0bcb8acb4b0b0acacacacaca0502814a701163b55985c01c47db84fee4fa7ff7087c160fc080c064b82fd20793762125e533c3940d323fc1c70da3cadb7f2eaaa2e297fe2802bb83062c488112377ce39e7a494524a6badb55a6bedbd176323921b9193cfd9ddd87c7019f01870f05b30c6b2cafa34722877109fc7628c3146175c8e8ea44c26a5bc73ce6929a57569a9561a7f7eecbc3cc6633a3ed45890f32baf96d79d29e59497e984737aefb3c7b9dded2c7fc6a9a9a4d8db3860f7be762bc0ee5520bd7bfab6e5515f03cbafbced5430b43cea73b4f01c2c1c4e9b6fe52fb6afbfbeb73587f0e6abaede710e03ddf18ffbd3de1e765f63dea837e68d585df066fecaabcf47c1fa04d2e7d340753a39ad8051499fd6978bf5d22865f1b07a82641568da542435e69ab580d5d3828d884adb2343185f7ef5f9b9c6ea914e29a7b45a7bab94947e1f51905ff4e934f24a548b26778196ffb5a4a48c196cf89c56903880f83f67e033c68f6fc3d2d0eda7135da01fd38d73104bb17a2448835448cc4230f7a3bf4a8451a075685fef5664748494b4b55e1a6f055152674bf01215d02a84d696101568fbb12a59820222222645464712072325491cdc0ad2821115291131316a05c1ad176e0589e95690256c45863060f1ab6bca387d7df598929963ae87986fe49afba0bf1a83fc045a07fe9aafc6e51a2bc73f1dd8e5f8f5c61668c7bcc6acbc0ed91548ae880c913814a812913816d21a39de03ad3e9da740dbd81022fc043ac62a922aab4a24ce4ce26ccff52ff64f67368590fed5585dd2e7e3c0d9143eb163f544142267b96ad44e1dd5ea7d8cf9b51ccb55aa126d529bd1d3e974e3bdf8dacedacb72b178583c97d543133b81d7c4eaf9b1c3c37a794dae975785d5a3c46b22c26bfae9628050ed74fbbe144f7acd33590c6cdad42b058c6ce6b2b3fd1703440b10bca94daa23e8fa9fd7c4ed2fe6e77371b500e1f28249d26b124d56826e8e6ebb3f9dce3dec2ac73dcb45bfebba59ade5b402d14464f5d4c972b1787a5835468e435a592e564fad91d5c3712c17c742a6ef9d369c36b9fbaf02d1effd96a37e4fa075d4affd56ceea91381fefbd96da3d5f76fc0a5dffdb6237663a95411af3af3754778e62a8df9fb5c6faf7b99f7ba6c30e07f7f5740469ec173f6818459f8fabb6d158acdfc715d6dde068ba0cd2a0a13278733f6eecc96e927e2f10ebc5ea6939e292ccf92d18d4a9b97d8c31c61af3820555d65a638c3156d17356d9b66424e79cdf7ad177817240291f340fd70670b5e21e0698f3a306a01aeacf6bda709f25b641b9dac10081401beeb39511d259719cbee331c424f02bb4f75c0c9c73ce9f27cee3b8cef6bbbd93c7bf1a3b6dfbf7391acc61e6b8afb1b951eedefbf9fe16efe3f8b773150669dc1e7f7f787fa9fed1c09bed888aac81d8391658c41863c4424a7925c76269694e3bb1a095d64a3b1cb462312dc742c7c721391617dfb06103efd0721413a3d405e602fb8a44fcc9e553ba848e3dff579190cdf4c85b621b955a05cc2c365185cb8f5c65a2aa6517980b1589b3f1af2e0102020202024275799fc6b8b52d4751ec34b9c066fae42d3124fa738165a29d2e3fe667cae05e5a9819a4a13d8cd33077f9f96280bafcea02db718111e102238a89e11f1e047f82137122e09257e42253c938d8e596da9435ee44c7ce35d5a6da549b6a13244283732c362ffff4cc451c118993f95795ba9cd5cd6e77c35b6afe264b4d5a634a97241ce8efe5a582cdaff3351e209c7fe7f6f2e92f45d32b7f79e997975cc5ff5e5e5125cb3c9040051554c0902e1de863fa1fbfbee46b1be650799a1fa99615df6dbb1560c7f271f7dcd7907ffbdbc1389e236f1cb380798dc51c3e85ae40b620782329520c0929160b3252b248350849d3b6a53b84898989898989898989898989898989898989898989898989898989898989898989898909da48a3e8375af939f73485d666f046564e633f947ecc868452fe33b71f293f66a6c4652ddf90c89594db91fa7304cb6e90a1cc1148c7e768665cc8a86260522d5e5c5a866a88e13054c34cc9500db2dac2020d69dc2e6b8bd7407f9589ce71934ea552a9d491a432f46336f40349c71d0efd386280211f4ec4211f490cf9201af2213bd2e1908f21433e7ae8b6c3211f2618f2c153877a54e9f1b36dd1e1508f277afc7c877a1481877ae860a84750bf7df28f03fd87a11e40433d4e30d4c32587785499433ca84c0aec10e54f18e3a454a7cf875d17250789f04fc07860640a183722d266feb4e7e8693bf1daf1d6ab15a44bc9cc1c9fc6dfaa362bde1c5642df164caee4d38ff4023526638fb11584a866c1838914542e07fbe9f37e4ff7aa5f7217779a7fd1762d6cfdd60ec795b0e52187daa9538c71386f2c71582e89b17cbc6d9b84d6380b94df1d34c6ae6ce842eef8d22fca5ae5db26386c6dc120a48137f261058237f23990fe688e68200d2853499ced9c888e5fb9841d299fba2070cc6c9f73f6763dc9b8c9e9c21fdb8878d0dfd190ed6863b21dc5fdd30a0204d1c644e2cc29437bf91bd02c9564bbc15664752be6376c8fa1bafeee8d8aedb6a9cab6245744f492a4e9b2a97f1a52cc591d66e4e886399b0ba63fa0231b50afbfc1b68da7d70d1671ddd9b66ddb5c1bcf6bcae8be6a5aeca87edd9138dcd7af3ff2d7af3c1247fb1c3865d09f36f3b72d731fb7ca75db86cf09227fce315becd560e7078d8188c48e04219129992d21625264748494a4c4ead941015f81ce9148644a6c5c4254642471b423a4242589a3711cb05b2ab5a956817dbed4b468b18cf0a3cd0b360551df1dcea620c27271d6ebc29bf91c08fddd23d75e4803ce5c8edb6ebe407551997c42f221fa93e9f2bfff132a8ca6cf40cf3a842ebf732bf4f73f77280a9a5941c4084e8094d458cba7f56a0569c15ab09dd94e12eb95049e2cae9865a1a48a31b8405533dab52ff911bae663d81833da9531464da39d8d997befb594aa54da9781191b5a37c4032909427ad636a85dbb753624e742d031c6c8ebd192dda94a556a52a5529b26e55cc0ffe538c24ecb3f08fa4305cdcc11e550327102e46ad62322f4870aaa31a5c43f274a6289b90a1225ebf3b9125abe94810a9234094de50a42890a9a157594122612c72291a196a088248efd6925ad91370e7638b6d7788caff9af1e6d2f4883e6bb7f5195624d8c9734fb5ff0d7a479f91739491fd5a3971823c6d7d47c0d9fa1e669e88b0ca6bdef25a9e555b097a417a597a5172ada7572d598afc28c51f3d2c5a679fe2293381f94bd289138f66589c429e167d6c12509d270f13309152471687e3e0a89c4f99f8f92499cfdf3514a240effe9d2a1cf2f27e1afc15c05438caff91c31be86cf1004fe196a3e468ed5c7f8187c8618bfa279bcb78b23579fa8a097249d12ee9c99510115f4227b994d1931522f0fd302e65bd4d899fde9f499cf9783318363bcd6c5c30e874e77a182ad51b35532c65649ae82a1e6637c8e9a8ff1351fe3b5a7d1b4d7fe85f65b7bbe352dc6aed9d6f21a7235e7bbd8db0bdecc8eefaab46bd2a6d9f548aee696046fe6c7d8dbd2b4995fb3e1b49179ad4305bd407ff528e6b5ce46ccc32903a5527dbaab1e4e95ea635efc800ad2f0446953a282663694ab9977b13f9deee27367c305a5945edd2d4da4999979bbbf0cf4199677b157feee6fd5b5df3a1b2cdacbecafc254fbabae1898fd5520a9162f2e2f492f492b1f2de2a1825ef6a7b97ab46d8daea05a7a215f20a944907bef6be8fef42108427e08b8f7fe767f52c1c0bdf739b8f7788eee4fbc86d4806ce148682e1634bf628c5fdb583dd3e21aa24e3fd3ffb8961756bee35fbef913fe7b91bd5ef1849b9752ca189a07fdd23ce8a568b37a9bcfb17a9b9b5fad4ef895dd2f1eeffd8a316f6cf9cf2529e622c323e392f921b32357b466c3ee851f377fc2675ea43f6b1f02ab07c043c0e64d084110394e78133e04375c351f00bf7a00bc3c81ab2657590e03007ef53900b0fa1c6ff326709c6d781cc7bddd1fb7390cb4fd2f4bd4eb7499f797014ff21a20988ef9d5dbfcf7226bf1314ba97f91bd287999bd2c714982790ae392f4420eba7a29e50bb95ff297305eca1aa01a221207d71c913825bccbabd357a15ee6f78fc4d94f9fff0b184f5d925e2f32d7ea7572a4cdaf3e87cdaf566fc3b1096ff3367c069b3781ebe4c8fd76bf406997a44e5f6435b129c3e65db8f8669f7948f3335f0da22da8b4add56635756a660400080000d315002030100c88c322b14814258226b90714800c83945062489acac35194a3208831d018a3900100000000c8cccccc08004d764550068090cac4e5272e174690914cb74fbad6e4d3508e5c5cf3f8dcaa5edd4ce3b878f7ecbfbc0d77caba119284b4321f5fad0cced96919b9e3067219bcc27b3f67cf109c0d7832d8bd0772fede90c140009c299d9e1b8a89d394eeeb6b0baf176c15b0bfefd97c288811aa3ae3cc953e70d61d0b2389f1de83f0dd8db4ac579ad26d9a7ead9abb49e838002fa0909c5b225af2e0b4d02d6659cec0c12959e58bff517e132082415d1273d0cf15c277dbc5bcb1432783fbc4389d938192527d6e919cf27882a875916188702f070e8fe3096a2d8f98a2516b392d9f000bc64a7b2976a155108b294a8a1f22522fcf7adfdc0982591683a22de8afc080c85f12ca8725ab5677365f594461ec8ace32875a3350da748fbed8824bf9e141c5f5631341c9609e0dd26a863e6cb5e60f5f5664030312a9815a0ab187f6652aedd04f4377a675e1cacadb106e320bfd11e32a7afe7dd459f9a350fa88ff3449653debecb5393c894a39b77c9749b5ee03f24c72b74a9a530cb43a19c0ea8773a98e1773f940a5d37ba45563ea78f7b0930a3e6a5af128eb4081a36a0288929d8792ebd67053ab0f19881a15c80d3b0e9354dccfd2e724cad29550b9a72c90d66345882e0fe1a0162effd7b79e2c160dd58bb71d7b43c3cdfa736f1d14d48efd33808a9d0f094d605d479f50033bb6bb26574b819d80c0320fdcf262e3608af82eb7ee0752a3ffdb0170daa431c5e13c29fc85150b3e688c90311bc78acdc18eb17bf8ed84b87aeb852d418711605074049bd09a908f2a1a4307d091a10d58167607126e04684c7d5b093ecfa0093c12d1659edeaf7d3ce35ea901569b86f32d8eef9766be6b3ecddcf6cfe01e38c4663ec92adf8fc5070a298af1d51d032ca0b283c3e523bd34ce0c479875a6828cf0d1b033ddf23ebdce9372ac3b4d8be0fba16376d23faf1e78cc7a759b5ef1274c2d57298b584b0bd0538de0f32fe970d0723c374cc9f4ce583f898f8ef12ec33a6059421cc71f932125421fa95c17edbf96006816c46090d8ef10b95022d97fe4ddd8285683d7f266e1f0c582e6bcdaf3f7d6a4c25f9c4af7cb482ea7cadfb48a74bceb786445fa358fa1ce0429bdc2994af9b7b2703866f855e4f11b6a8d721d0fe4c43f9bb7556529e3c1f1253bcc2a00b029fa89a38bbb7b56b045b51079e281465469b7c927ff8777f0118b82718b3091d6f4399cc2bca8e9e8879ab9fea11c80a8355be86b820cabfa648d192c660e0fa06bfa7e6bf4d7aadd5f518bbf693b87ea11c2cd799c204401dc26a40a1206bfb55e7f30aca9bc6367f24724ae2e154a3387f11f8b1ac29cab336739a93a3797d3095068293c973a276752dd3902dcb1e8a29cca262da4f58f20a8a383f46713fa30486c8014d76909f0584a06829ae885452eee068f8fa56d30272c33ac9a8a37627b0cb6e605f98633d447d62a030332aac25ab8ca87b8470104f2a8ebe1ec035af03a9f0ea0d50d2b6951a0f143444fee6609a1bdbc12056b74bbd988da1480567882751ed1f73b9ac9e2c9a027be4e4a55c2f90b041cb738c68ab00e97a41ff8915122a595c9f206e67cd716c085d0a3230fbe3bc6e570f5d3c9a0c19ea0848947c2ef2859e0e3760143bc4b43da66ad13e1cf3cc5f20b84eb1816ab63f45e691fa01755ecb79c07f3f8d6b663e72066db7a41d9be2636c0376ab7ce885e0157c6bccc298679b0a545c5e564d8edb9d6b579a57e20a9609615f407d23701d603b048915d375bc1948f327948e4873b0b8eb5a0595f1c80e598fc4426dae47401ec38f4f5db55e0b8a91250fc541b17f590836cf550a17ea161e2ae0e3d5c94be5834ba399570249d3864f2d8bb35ae1ba43df43679fd94d65156f12e50d6f4a572d69ce013aaadbe1c460fe5fee9734112e042a6a343cb9eda0755e6246727209af1caea7cdfe801af90f680ac2488a23b7a6e44a190e5927f81da30ab7dacb9602acfc33b9a2403d73cdd7339a33783c84c8110e6c622307dd81c45762dd43e00b90b5598a1182acb0f0928dee8d01bb97e332a2e932bb4ac49706bfa16f2e3fcbe7d1da2d2064147ea35f5d342a81305da9181bfee18959688005ced48b9b65e9a107572c531e5cacb3b280e8bbc02901ceabd217927072ce17c3e352a74163691a0f49602a8a658a5f74e0957bc279532a84dd45ca84e8d7d4490726ca75010ec47a21642064c2a334854c7151bded885d5306320dd813bf425bb1b414d5c270afdd5ec6fe40caff9508d593cc4624db177ecbb8c66f66c9192f3c8fb65e32b76ac5a1b16b695f5181e94458f30489539e9bbd3adf0ee7872f16e3d0be956220566f052e9d33484d1ba82061da9a60242e60a1913bc63b3313fbaf22decdf6bc8247fa8fe7d2e164d45b2733807531296780213fcce6d27e45b804042fd47b0e96608a2b5d92586d78f2528dec2452a009a73c3f59e376f7de3dd37de78ffeddb9f64563bcbe47015a7078b1dc16cfa42b4dc5e2e8fa7e42c88f0107af3379295bb32b2dca8e8a6c24d6ca6782fb9943ea3e56cbdc07b3a33066d32a7374c864965a861364460315ff5e0a8f4c565aef3e8facd914b1e409a425b920bdf2c26d1ec493111caa831cb88636eca6c29a06b3408e3cbd663e0f6a98c463b206dd23c6abae92e0e7dca682cba2266c46d1753d53e6d4bba744bb7a2fad8935971aa945120232aa8fe44b5bb1904b5b2088ae5b428b07c64868b0a9753bb9c7b5fca8b8ad72824a57756e621f0647087b3b0af07477a085039b948298f8d5642575ebc60f6a0c837164d8e94ec2a413e72173c706a37493e825670c29a36ea46cdc7304efd5d2a3c424e048c714dff00508ace5825908b85222f72fbcf05e992c4af874416b41abcd4918a191a89117c833738fc001eeecd54a1e7967fcf9caf8887a42b3b7832187fdf8bfc94b3e33c93957a132909c797ed2a15e1fae20f974632ddd0d003eba16e6fe5e4ffc4b911c14a5db25e83c088aa78accaeb93d89c16a504f34138258dfeebd3abe0cdbba5adcd06f862f5b31527d3818831288cf6e48c7b8f8ecadb8749c6ce4549a640fb21285c23104192ce0f20bcba45b96151bb031933c64112d1041bc0d2222b0cb2e3d5b6acbf60f25dbaae9eec4e85c195fb2dc5a626d210ea281d2d31427894b3fde5d0893f5bc124ae72c0e410856fc24ea7a0cae8684676c292d9bc498ea61d72517c0deae6ebf4659fd16b9f5e1e5abd9fb1434d9a122c6754f5cd316709688a0c663acdf49a4ec455e0342c1fda82bed7a80119cca53645bee283f47becc0454a961b70426cddd17a49fb0dc5e21299855caed0ce6b1e97b2428c038c824f36ffd1186f36ab40039775a8c8a0c25cb921e70425fd72e6791bcc69559ee827d01ad3da9e1aaeb754fcb2515d76c929f6f529101b31b61f88ece5b0af34796eceaaafd979094dc4e65ed50c1fb5d85940575c3a53e635d04f34a3a1eed53b2f0be9aa8a44720609b2b9b03d1865050c176bc6249033769645a1a56aa92a45036579d96581d080d3361111b903ce7f8ed046981d23de24c0e7e776342788c60b630d100c1cf1dfaa05222fdc0a58e7872df20c67e99347877404a96ab091221941e5b7d023dbc919f71e97a0b326c4cb530cd8c0b88a6f6484fa8d49f3c5e84db67ddfa4e939f5803729749323bee9c6acf2460c858944c2853542a925d0419f8d07d2c9679ad9aa5ba00741788263d407f3770b822eea793ac0c90b0a0fbe5d98012ade6dd2cab2b7284413f82e919e210b25e5858bd6e093fb600aa80b1eff9d563c4ee61432eb90d3e2a4287e0b832a2741a0b07bcde6613c31d0a6894537de97866d5a26cf4969e297398e545c060e6c6f22dc34859ac709b38bcdd65cce6d484c7ec685b3eb0042113751a9d9e4619b88e0ae7691d0e3264220723cc6b5a1752b91a40600d6bcc298eed195d31bb44eb46da38e284907f658825e88cba1eb6de7216de26fcec7590b0cdc0b66e14de4f80a23360b063785186621756552bcedcb1448439bafa2cd3f9faed5b03f14e099372cc38a336a4a0ceadd364d1cd572360d93f9f040d04ff2d9ad2813cfbc439717052a9e5e1890df6615861d368de8c03e116f5e7948a5e41a50a0d4651d70a2ac24783a3014d109c3992d0d679ef5183a3a9c8b3e306c3d9c9b486a93a3c110730f974ecf93f32b7d457a867d5380f51a8c8cecc9024abc7077599b126078ae48a5489ace5d1525f1ec0ba75f79695c2232d4fafc0634967fc1200bb7892964648bbf19b307ae844a9f6ee18497821dd6165158f2ee8fab200c6c0ff4be08aa0b25139286fef5385d5d09b06d0348bce59c8a000796baf472f79ce104953ff03cec5dcf4c805dc5632cb4b784571afca8234a54996c25b25da6880cc3791640cf909205169a9b2e8f1d731e7ed8353eef09a9cc33732eaa4653f83934aee19e2d5f8e52b5d0ffa6fbb8a8b45b31ca766200b8cb24cecfa29f4731e6aa3e309c5f8d402cbb13016512307ee84331d38cf957226f1b0c99fd6ea6a95e6619e6f2d0b054905ac94ae7735fcd99a02640d9474affb92cc69ac50d82db2e1764aebf9907357585b1478cd76441bce3a25654945062386c7c78f8f58845dcb943aae9d35e0c38106825d46dc0121af8e8fba7584396d6b8f832ea5869ad802bc0fc551722600ca27f55fbce6c7b2f8ef417ae2ce23483b5d85555e97102542fe92fab13eb7b35ddda44f26d597ed55e8abf2d57f3aa781c8e36f96d60a4c76a3226bec55703369db2d93c916ef2ecaa651375c8acdc1496a63e3d961ca8c4d00fa2aa616f8aa11fca40be6619a2d158a7c0b733a9fd4e39ec88ede3b04fbdbce3f164d4647ac8f6f21bf777ae5a1ad76d1f2e7a70dd4ebae5f51f1970c0f086b59e10f60a6ec23f70b51f3b95b11cbd0ff495ea26267570cc09dcd447e6c2c3c36a522637b870360b8f8c18129cfda5ad18235e8bbc39210e42c125b1cc0422642e4e95f8ab1a2163d6c869035cc49dd0754cc18998f5a09a400e3fc49d95b22e490c322568488357842a7fed4934117ed2bba9f437b6b00fcd2dbc71551136c48780911826f67f8ec635b697e22dfb12ebc92b7ff67da460e94f951364755fd3cd9a322a538d71ff1ff4eb2ca43f61cdec4243bd67153034455b3f488c08492c332b82bee5bd0d24b61e96d94852587dbe1ca920b556b7ff97e7cc02917bd12e631b28c79d659ab28e834862d0151fe721c3893a2e006bf645ebd300560bbb7d8981bec3e2f6e3a4144c84e8804a266cf31fea71dd23727d586c2a6087c82cfc4731a9c43f4bbc48a6c99c29d0cce315bfcb3f5b5041abc79b0716485c27ca185f9a1a4c23f0904836961f84325e4e9251e7970d36995d5f5f95837a19bf8e2a6473924767022813229fa084a0af8443398108a3127ffc75997436b9750006db83cd1fa47c8cca8ef725b41bda04303d042fc95f3ee460dd62a00b2ec078380d70f815bcc3227804d859db99444520212fab832dafaf4751005c52ea2e03631b25c7ec6aae833efc0c2adbf25d15234468ca03232d09440686d6f0fae449588eb180da07621118a119db0d2cf60720658ede61ca4b65585404c3976561ea455b42a198879d75f126b44f513455902f03d242d283179746ce31f27e67645a37aa65d83566fc5195fb287a8876b7437e548477fa79ded5bd3b3f873b4968a86cc0ff075a4948e3bbb5c5c951291e89d32f678b94028c4cbfe0c5a930b84ebf0e73adb228a19355c3249f253b9ec4443d6262bbf313544f969d989f71d65a2f066146601eb9084acb9d885b262286952f025eadee19d91dd41923685994f097b5cca5aeda6cbb94c6cb1c6873b7ea2556138820e711ccbc86e0ef99f522c2ef39058eb838f1f66f5d800a02233b01f2f89d50ccfe008bc1e7fef1333a81fb3f0b3ff364c8d0a0241805d1dd12bf70686c6d8ccd1663dd6a722d6408b5cc476b45d5dbb881094a538ef40a7fabd836c7540b6a8887e499271da8b1a0c1d159bedc0a1ce45a7926c552e12cafdf1634a69b3bd0b72d1af8a17036e224e0d9135ff203e3e9574e4af3b2cf995f5756a1b72a534833df154450614719478f0b2a0c0f925d4c80d67d1ee3e9e9417496e58758f4857f2dc789a34d51421c379c8b8bc45f41062854a18bd5eaac2f5fcc2e20d5ad40fc2636ad462b52565384e812bf9ba6cd33a8bb4317b10e8edfd446ef6703dc93e5d08243962604329993505f7e5e42498b09dc8ff98c8da68374eef98fdeccfa8f2292bd3eba307f8b7db45eec4f0b237dbd741860627b7673bd58699b398df0c729b74271cc84afca457e8a8f421a33b3b4b18389e78847a5568cbdd4ea3312d4ec16840a898d5ab7b5f8cf4f5470f6f3ba34a8fccb6db69921388b7b8edd500dd1f1604208c46135996b041eee3a390e11984043dd89f5465368847e16e3d99d1c1b1f6b0dce8f7c8c0c18ef3e142a4e5be47c43f337e0552470f06a7b751750c6b9e6a6600f69b9f7d1a23a223f5f9f8a7605d07589380746fbfed11f0efba741a16586f15a11b1544b054197a0f513cdc9533111840cfe4f3dee09b87f0af2758b903608a41cf9ee438a935de36dd08994bb15c326e5d7696b7b2641621f7f1143eb3389797ab0400ec986a4e031fb372f7faa9f5b7b2227c61ca85d9eff6412b443d979acd663894da760f50d63a7a85d747dffa68cc4ec868e678e2a8e8e80b42208f782a73f30f6f37e4135ceb16124bd3ca9e1e35e5b60447b30545c490387f246d7dcc6d13c9ea0c1ff8cdebb487d3c2b7b16cb0179465e66543e4f00e3e54bea4e10550a10a3df707b90f7e6b265093b5c2bb33431e8010e3b6589dd256675fbf09695e0fce68a92caa1959e257a5d2089553bcc549b982b081bdd51d57741dbd7dab6cd1152c469ef6839f6a67eb19616c1104aa14e80e91034cb41b63294c6793e44100267155674b1d35de3ce2d68680a7ff4f0cea1d65049f6a0b528632e6ca659a2edf121852c865131e0cab63291bc0a50d93ad902f675a9239de3a9f23276de6e93d815c3929accdb7d31a8243a233fa007ac2aa832273f9ac7ae5e4c193d005fd911be9034dbcc23731c2f6a1755371ee4f7bedf4d300f95d8cabc1abdf6ec25576fcbf8bd289eddf40b8987e0b6a88a1584c83f093e6415eeffb38000b861c72ac268454914d9d81292cb3879d888832a1d24451fc2baee581d9330fd2ed82af294412506c90d1b45c2992d35c1baf1c2ebdfa0cc52d9571875dbb8468e99ca14a87a93e5c820d654556e831e941c5b839a81340a2ebf0b27903ee3a92cac174e1c3676e4d8436f0b322ece8800fca4d4d6806912d804a61489f0d726ddd515eef354598053e4c544d38449e4d3cb9ccc402bac3d13a825f72955c9ffd5335eecfe718f512018f75f04dc80155a5dca045321e8701c9db57f0ad6f2bd33e2f8f158255f93d71e43bdcbdae458ea2cf4ba037c453b02d51a12d41f178cd9f95ea5192fce56d664897fb1b05433483325ab61b3d7c0a4300c4e00d6708b73424485c9e6566e2b38c413564fe151c8bf5eb64eb818cf37c4b9d6c11d09b94fa50598bdd12e5d440c6ddd0f734e566202d7457420673feec9995c6e2f8ca30b6176294916457b0bfac9fa0a714f1dc4d622cc1b8a7d7e158ce2bad464a976234e8377c697325f7a801cd6e3ba004f434ed293b124788f0e9f3db2dc7e7ca2625b7851f30c36c96af405b31a63f65483a0e8335594ffcedbe19aa52281df3ae3772581fbaf0412a9a9e5635002dd70a7746f0adccffeafac27835465f58c47deed9b480496f5a4e9bc0abd57729542545d8681f0ba633cc909339732856537a5ffd618dcd12433c6243140364b04ec425e047fcf14959601d8aaa6b70223bfb1f703ee4e4618b7d3b7b160084868357e46da9ea5eec5fac8ae4416713bce9ac787eb349a780596121eb2f96aee61284b4fcd9063ec1ad49f292555ac5820c61e22210b04744b76827dc1123c33c8ee44a70c81b73c0c419c839dcd159b15e8da3b1a640a71349683ae6f85568442f0bf58b7ccdbcd3d3ceb4342159d310dc907c4a80da8656493370293b6b0fdf21a32d9b1d9258bb104a1a8f1b243cee0efe79c244eab3e50ae2b7cbd08bc2420ed66933c667f8c6b6102e0748bdaa9bfa474fc6843800522838d0bf5182a85caf3cb45f518b8dda852ccfb0c07e0aac078ada6efbd09fd5df0d6c163c4cf8d9848158fdbc17ab28321a280a3978fff6cd5a69ec7a252627b1ec6f2b5d3cb2be83d1406b43b76c634cccdc82b70959032eb6d847326e586057550987d871a3ff7937bfdc8fb693c960e59e728044877d7a06653d9c14163d61d422d3fa989522889190ac99ce267b2af3323833bb75065c241d448aaa549a2e8cfd9638e2771691b33cd219657f32be764abe9b7cdae366d63226f1e222b582cf928b25860d83efdaf2296cb02bb049d7af4342ad672abcc05c825e27cb5b6ddc48c6dab92ad362e67464259f3209f40b307356402140a451cf394e45908a4b867071d006e9fa9d38f78642094be8ae55e2c132692c5bc210ecd64d80570598cdd4b4957c24099a6b7c8d11b301f12aa70df428406e594afb77dda20f2e5bea61c7738ba61a8c5c68c127984b5cb7f97d5b0109fa37f1dab3745f4e8c24b35c32ba08ab6d6300c51e4f65fbdf4584015e0b3e35c3f68d5030404f4c8205194555d032fe6d61516e70cac3ab81701d2ae1511a849ce3094812c83948b19887d1ea6142aa831ba0ebbe3b1deb5637eeabb41ba48a1914517bdaa0fb5bb5f9d7e5e01388892792907a5a4e190746aa7d0793dc2af6ddfc139d797abbf52e7af62e960ab6d2f580147b12ebc80bcd0f9c4518773d76e7451bf8568f67a6e498e9ae5b8a81681ebd3bfffde40343f723d778bd5c07392284bde265e9280105d348c25a6e18f1e10f29e2737a5baf3fe602d5111d3cbfed867976b2bed28b81e75b05dd75cda60b63cef8c524eb329bf02108070343bb8ae1188468e6b299bc3680b1f33640f5f0346b35548ff9de4a1655ed8646a25ecb6ec0014d8eea1caa28e972c6631438d8d395aa831939e4d725f25ca17799a365b604fe46e5cb4c52096e1427176e26705e93c13c01f6d0441132685deb36e0630021c4eac3f7c181c9fc22f107b5f888e1fa88c61f3d06d7d4cbe304097b0bcdc6f901f7c892523d2fe75d5f3c67af2b0a5bde06c95d5102fa80f484c511043ab4bfc177783a4552a98b0e1dd9df5399aa2112df249f6e207195fe6e2cb6684d997283f07a867d484f4634d8c0e2276b7096b1ec33eeb3db2fef0cfc004ae7d2f3d519eec7d063d51d47bea170080ee0cfef9d540787d2d693817911145b1174ad027144987a0d6060ba34947c863a172bcfe99490859712854219bdb249eabfb0093f1e3006413d9b0a4c067a73982042455b02b6a89b9294b68f53a10baefa7c6e81707f73317cf9558fd5d1a65d327810add756c01b956ac292ef51618bca98ff4910db15e8cfcd4f0bc07a3b70d6aef62136ea9d09ee5176b80c23ae3d068a65a5fd3fe8cc63dedde72da4dd50bd79c2b6af510706bf4a7ee17aeaea88727f171c1caefa927cd048265d50c482d04a2f41bc91d1b37010e2a42a4c9af2d7e87661a3a36334fd1b1dbc885a193f5c3328b08de1fd270c413a8d7f00554afe2fd56bd5b3904e5d9fa43958ad873177b0a050e2a0cfbedcc13c59b79c359acd477abff6a10742b5d335bfdbddd3b12a91ec8946768916312b656d0e8a9d375b3be8edb79a3f02dcf1424c8ba0ac092087be73d214e33bc23f65256e6d2621317690a715daebae09673b76e060f6123091d3223e1454fd02033440aa1d91ffb39a3b901fcde55838e9062e86c036dc730ce580852a66d14ba643b43b0be84701385392686d875a99d0af9459dbc0afc2c7331f99701e69b3d67c61619b2f72650519972d23430c1f78edc97835a6e048c64f493b2c90643a5ac421616d938bd5d467a39e22fe2b02b5cc43d19f48598f34f27f04b8bb988097838ac51219f05d57eae41677f64b0caabcef34f14434c920c448f3a37716ae60769c486b2ae840e2ecb3c0190879475027206eb4aeec2acb991e3e22da458d4be2f906503be4f5f163f45ab39e3e2c0e5d801d729978aa0f87f8f68ac94b82005257c2da8e186dae5841bac65efde576274de8ab7da2f427c6b3482cc43f2740fe611fcda113b4ead11102f703836c298d1a5642026b7f10c3324799bd7cb06607c0ab6d8f8d64f7713fcf6777b5e81f49e8996d9170c8603f0ae73614f5d3fb62514546f6e038a5a62a1c51261bb2af86ed52145574d23ad459fa2863ab25cd50f60b069a3cbad82380b5e9e70c4ad5c2aec30d2a1b1a4169882f5e1091ee5eb2f233e24bc0c401d0ba6d6857616270bc22acba48e07e385e5f51b4e4bd3e42a7fa4fd83842bab3a3ceb0c5ebb016356f8170610f7c29129e4bc3230324805bf83053f6f4a0784e74bc631e39ce4ba397578849ea63e484b86de937b741e3313493c76b7603a3dc25e14107e68de23fafccd502367a948dc70644de12b008eb39278442e123b45a0a096f5bcd9c2983c00dfa32c3fd34c1bd138fef61cfac66950e82550040a0861f40f024d450129711ba4af2e6e1d2d00c42e8eb5fce406c81005f75760ceff5e5052102be0d0a043cea7dbfc22a9ba9105db6f1f83fba8d7d458103f23225541d268d4bc05503f570564ab1cee8e924460ec869753149ad2d2f3d44a7c45f2806e32bdc5e1dba731242f18e8f7b91a728f4b9e9c86c276f70ae75f4c32505dfa85c74006cf6de0305ca420906d1f44c8c6bfee34c4ff8987ee2d0284639675e305166a9ea4f9d7696ecd377d3681a237f4ff8677e224b1e3d05a3dd1d361b87d2325f6b5d840b8c1badd426b1ccb5d9f457bb05aaeb12e9a315b17c0b370c1684ad829c53f8801d9330fd77ccd9565e3a95373d12e3bf43fa898b91b8e0846ab2e8450c2a641218c2629c22f6b7f05e09e075f6296c37cbd67053dbe8d76840ec099d1f4f85f82685849dda20bcbd19e504a34435d706cce1f5cfbbc461e1646af45a9fe100dba44d248cfcf468bc8471a1ef9dd41f496a76ac44dd0d1021f8647c329191df135bbb9edff229adfc4476374bc8f2ba59a6157cd4cbb4be42b5f86c985654f2ff63a6598286b3fa81e2f830af6c83411788917af92a176e934ab926136e77d6fff66d7e7b20f676ab511e644a5261d9a113a4ead1522a05739a1ac8930f0eb1c50d4a0473b42e72e3aa3b0729907c4e060c58189a9faec210e1de87de02411f897d975d3fb4f4bb691b04fbb5508cfece2f1f7b87bcf011d4e4bb04f965d206a2f044ab1f0c54b389c80df30d935e6e99d3cd995e8b4cbbe96290db07d7bad3b3e2efbbaaf899325bc6cc3c8c121d85898ec627beeeb9634b651362970ea30eb9f4889fe60c93858aaeca3d5b07fd027bd25cb2c52a260b28bb92b21e87f20004ead209f494f5fbe868e02881349e1d0f152ac3721bbe79fc6b381cee18e5d79f3025ecd6dd5ff4a709dde9d1cc5e45397f323f9555083f46ff288e1c265f56eadcec40b43c975f5b7e177b5b5e9bac24590860b708b843cdef11ab8908f460f47eba457ab20f7388f4a0398844ffc44c53be9ebdf383cb392d1838d90b173605b0da0ac17f45503336e371fad1b288d23fa35cea9431bbc646a36e29a8c2237408254faa10ed68488439add508733138e3d48866b41d04602aa010479cf6cc15827e8b99e02ff6c1f9d210752cc74ba3347e8ca84518dbde9478d76e3b046d330f0cffad5734ca1f12a6954d529eca7c6b044dbf30817356e1e1f10288359841eb50357a8179dd3acd358ae3878a83594db1784615a37308e86a0b92943b004c0dc9cbaebb1d791885a65ff8d5280e7d5d3a374bb03ef3437f2e088e2393aa2c6d4f8521ebb5617143b0ba9ca603e9b27b161da2aa48a2b786c017a558031862bdeed1b5d03d9e454b7ba60ca0fed15c05b3033b454d95011f473a8cc21f366c6ddea6f4fdd673668af3025d5c72f4dee40b4f264a77c58d20904de412daf531a6c40e30e57b4286a47187890145577e4e1f6434d25301048b41f31b8e3e6dbd7b8ecac2ad01d4d93ccad11cc9d1900b9d2915437e27687f72d0530c62c771ad7a709f340e2767b589117e58e4ae3b894f01dbc3d083049ee60abcb6dd8c4a1d2c1e93717323a6310dbd0161b16b5a5ce4b3f0807c6292cc4f836305876bd94afec72ec43b7dd323ab858851506ae382011ac4739f4a76e9433950679ab2b79523fe489f8c58b2bb4ac9ae0ddba0148a75e7dbbd9a11cc9fb3e44a4bb23bdd09622a75b0a418c41a4dfe93dfdc637fa35e3170fec82a561ff6b898af20c71ebfee6a98ad5303fd6dc6f776015ff5d74d0dde46981c1269b82659c699d01a944f67e124bebb5b9131bfd63408f11f9dfddcfb52ab37e1f20b425b5cd123dcf237a686b289fcf06bee548051196e7166ea8c518e5b9439c93b2c43ba5fc9d2c8dcf6916a3a6a49c653efc39b1cdb1b6e3417b1f23316aeaaf8bda6c0da2ed657e079804fbf4fe254c1702bd8e2c744ca02a785f1745d10c719dd133d724bed31aa0db05b73dd00f2fe5ce85a04a487edc5dc7f21843f498a795c62ab83119c025d962d27d9a8588bbbc0b930e8365470874f2333823ebaaa3272da429da2b7926932a32f1daaabb7df1cfb6b98a76a52425de8287f105dca46f5560a60ae98d02cafac3457a83181986d4ea0ef3c83b4a31c043c6494c68da927c51d6dabcf0fd2b52907fa8a9be5f2ee2b16d4a7605d09e7d9e0c7858748e3101364e8f34a840e2c2bd146cd158bb6cb0bc8dbdc1733819355851d6308b89c546484e520d924911e4fa2f2fa3766762d212fb1e9bd0dd0d9db241b8445509b553d8659f09b95759c80704742675fdb5e5890410f2c0e8a8ef1a0f563eaa1664898f6eb5d3f77fd4fb22e308bfe541fe91c81fb812fdcfbd2149dfa5905a264f2dee89af99d4ddf0c185439554dfb82aaf82e0707a2e9380897955abc11ca3a4252971d691ece2d992712f44af444682e6f543b0f7a473ac5dfb2e993438d82ac18025268bb1a1c0e4cb4a4c5abcd56d2f557325880d64fb2c47f896d1b7e7072e6fa75dd768394e0cf8a9449037021cbad12479e08f0ae9b799eb628a6e224bbfcca0846e466673fdd466870748bfdad39c6229e77f6af5dcd5186094dc2337c5a3ed37442a92d7aae0a7726342cf4dd10dcf04f996005dd7d5419ff83b80a6ad68d187d8d72e322e86029596c658000c04e7aeaf798c8d5c6e34b4d13042804e86e1a88bf8431658ace3c9c7700371850a203560b8121ec30c05806252885462125875863fcdecb595db7f680babd532387124594c4b098ef6c970decbe1310e24f7f9c4c6db1996c77d30d5c337ab08aeb2303dc28a85902451f059edf5ebbf9e6ddd358f89a09f84e349f03a8a11fc72535f9080a393c9de66807f6efd879cdf0ed5624713ea9f843e9aecdd8e323d3f88a73ee7baa57fa04b68e8bbf1ff1ae448fe2b0eba8c9f372bc944cf45b2abc9159a5e07bf725e72396597b02f91b66f452ed64f7c02ee49ef2d654cc932dedb1f83891558bbd293cacaf3bec640cc999a14c69462a356c408cb998206560c26c3be11a4e537284d239b7680b90482e4e01687851b16e73514107806d19e38cd237edbb9a0f8272e0229b41d2bd47c7cc2a6ec3312fd7108de86c5a2a5d113459e235fa6228203f9925faf051e365164dabc07a9230b3b8268736886b4e7707d81dba46db84202e8050c4c3fbaf5cbc6d1d20513a8687c451181a370f0ff24d8ab626d193086b052544781024a83b7582dca493c1a7b721b841905b01e676b070392a70893223b48c6ead14f7062ee99486632de4af155efcf97e633c53da22365273d2399dab13a3acba4ea86e2067d0fb062309961498725bb788a868834ac0143f9ae2559f21bcaaf95546b6b16e2c02f1b59fb9529b8a1f35e895e1ce4a745b443b4764a6aa15f3ce0278f04c863e4c5f12e2212445ab9d9c2535cdac03935460077b26878d9f5fb8070d3ca341ca1321ede5f3ba8594a21de255cb361a292c651c69f013a132c0286853d62f797c7b966a61d673a3b86c2c014fd4516e5f160fbc7901b3de4c74872f3e3ecdc124a6308fea2c1ee616c82a639f5f2a0b733fe1ea551eb2e65d0fff0400a5a1afedd2dfbd7a159fec1454b8945e542088cf0b7272c8495f23aa292904a6ee7a67dfe5ec4e8d95e2a49363f8a006efd1911a4d510d494f6c599face891405e9f04246f50122a0bd66cafd7e8c9c4563bc6a1d8aae49938a7302703b51907859891ad5ff2219a5920f6b8cbc1a6089b4006998420f7e9a5aa99a0814ac626be4a5e5cc43888ebe46eea0c4bf3c7390bed64cbbc41621e29e251313e3a93003a474aed799a81318376e44b87312e7cf22c3eef6b111f42bb48038053b658361cf28462e8e21253db7320776805cfafb63c2f0af313d810879a0ba042a420eb972bc057fcd2579a4f5699895cfd9610d2cc98f18a4d478ebca67637224740dcce3ff181b1f99fd25372b3a6bd9235f39b7b56322be3276a01a51cef5bd05920efbfc68476578154ff5a57f394bea3e0d27f5b99c981d3f1fd42561b808eb004571c3c3d64da346e8ee5d27d3d51e2097532b0a72f30d62a458d5caf62567917a57ad1b6a30ffef9c73ab4a36928370f85847f4d79c5bb21a281dd117062ee858ea08bd801ea741b160bd68dc67b488d2f13344de86a0a7eced8749ed340eab6e13b7402f57c6a7352db2a8455eefa386dfaf36a7016fdd7473a5c6c79ccde111f0a8127f697e1fb1a843fb4deaf981ce0df485e44f4658292cadf480a3ed499f61ed5c180e90b2aff1d821859b22fa1d75ee2779c55b473e8e31a0c5e1b0867552e0e8c92590c8908848a1d0751ad47c09a159be22e275597ed35fc1e7b54582e7918437f49179f4a65a312317ccdbb4340ea226e8b669b2cdc08d08803b8d778015d1f364c8715fbbc772bb859ec7bf6f8d0df1bc44e92b1a0b0935cbf4f53d1fe628de8ad8a2ee4267f8cd846976046cab4ab3bc16370bc0676f4ec3bf08e3f501cea1cf9b04c86cf1e2f581373035ade611d7f5a794ca4583e53aa4062ff01440908511771e2740f74806ea4815d9325b15a899d10bba1f30d48f2968106e56d5f6989cf767f5b97f0ca4060cc0ac26827679a8f72f8a3bb89d8571bbbb7d75d47bfa0ea734879a60d2ef25cb5d28a20b2789f725ba716067e290ef49c6819459d3666629bc4df416c77e9832f6ac75c968ca7430d7a5a64543b606c6bcc45baac345d1a98b2f7a431eb59441e392c9e6ca94c891eb1861d7db4ffbcac352a44a8996d5b03df8415d533ecab2f7331441d54ae9351324dffd5d7146305aefb5bfbc456fae630aaff18165c3f745e9c99ec98b4e6feed1d30baa636c338f4f7d0bdd4e2c54bd4c7e146babb7ecb27079a3affc18d0b0b0c8a113f696a4db11e42e87a2bb24a87060e858e59d8896b020aea84d129c8ad24a6d127f7695eee8748f66c29f3664348e4e9d04177bbddfff465276d1ee778d343287e577e4936a09c24402ec890d2c8d55b882431229e3df9644c8385cf13dc20be159e820676ab630af20982ec617ce4d97bf46c01d2ea658c6e87317aa41b1bc9c6352a79fbfccb9deab1e493debc8ff8622a9d3c197919aee31b6e1c979a59b7c4f480a90113737ed3c9cf58a0d3fbd180b7ba54333fa1edbfa7200f6c7b430f0bb4b2460a615828c07c1b08d0e9f41fcdf6c050d82c3380019cec778b7be4f65ffd2c886b81e622519bda74c8b11bab74af915852dec09488d658a10a3be62bde8f27bc33b8ceb580112658e3c0782b83ba0f551e7ec21de8245b46380f62f8db16b83f67cfcefd93368422a34fa0054e662c40e056202e7cde6fb259760eabd16f0c3ed58dc655fd85ff540a653406a3805b4bf8f852d2ccf05c47986b3ff56e54f1cc5ab67a92d9ae54def0d79edc4d57186571651fd2d899fbe74f94d4e013684230eba04085f8cbc0bb4637edfa33c1a3aeda46b7768e17b793f352c401d011aa0841aa796ae56c002c9275af2684af9d45f8d6188e62549565bdccfc5bee793cb9151563cb6c028e4a1889f310388819baa47a8361e1d6210f74072e026abfe0a3ad5bd029a2bb2692a092f8b5a28a0a9e90f586162986478e3abea4cddf1ecdc1227c842bc5d69362797d9e6e9ecebab7ba9aa47bc7d4d5f4be8cdf9ce177417075e85aad0fdd144e2fe3aae9ade2b0d69588669bb08798f0fbc889ffe9a63921dda5331cea8aa3f4e0765d4539a5c3fb247f970ebbced7ed6256a85922bf988b7a0925ef6548fd81d7529b40030482297f04eec79d30a75f0be9c2e62922d2717f007e4ecdebbaa0d171d03e2441e37b43e5062ffa02930e9e5e3a6778b6665474671f2182557781e6ac080e41f5479abe6a967db4bd88668686ef83db165da98a37d61a9b3fbbb70460fc0ee7a14a800b43ae40724a45e081318a1399ec11a118b2afa2819d522b7d2a001ffa28425a9270ff6188b85d21ae2c0a411baaba4e6a1979d0d31e04d54dc808307a3ca6a2a1883d8831c586d874b42cada8351a422e2097adcb2e152bd246e6cbbd1ad4c385407f0166975afe36d492fa0d709da4b4000fc095e62db3ee17b714a1015a38a9c632f316b83b9730c02b3d907a27852eb1ac78d0ec88e4ae097f9db688327e991b4e96d9736ddc0f4d9583ea2e8e76829e15d572bc0854c125aab0f3442845dc09ce55d23899326fd8182322d67e9031fc3be203831f1ffad4a50098aee20d28779c1b68fc2931640a9994d9c346d643ab674e0cae5435af873ce38aa1a0c088851890fd05941cf1eaae996d7dc6918464c4a529c8f0589d204fa0784401d414140878e0ce9cb5267661a761cd60c7d10367026651944952c0104125784ce08533afd1f0350b5ec4e75d86bc11c9dcba5666bb110116004d6c7f7be55782723269f6656e75fdbbb0b6f06bbd706ad25105ca24d4e05768e8e6b4bcf26425e98d5997322787a5e1febacc6528a0afd6db7b63f5918e902eea55bdeb2b319fa07966384e5d527b5d0d50902b69a42090ce45404c1808248bccce933d07b0b8ba9078046aa1041abfd940fd89ee950fcaa31b4cd15f0c1c2ed77550543d8733502863c3057a0d47ee1c0e147479ec67119ddca55c8a790ff6f5e7f3fdbe11687116c1a72b37f34e7f78602e8ef802b1f87414f2d5cfd7b83c9273311000a60b6ed5875099a06e7733a3aad7a2548ac2efd3f3b6888c5b4b49047e9a793d674153812eb1dcf6ea0bf22fca9b389ac787782d9454ccd9fe60e6b2b738a792bfe28966736f0da6fd02ec5fdc6e2af0f1908cac239508651b2bb8842b7670374478187b6fa4f9df70a3ed355c158a1ee677190cd477d93d17b334d193b564f7e96254d193a97389caff103db0f774ef1bc8015878eff18355d45946ca9fba0bbfe33d8aab9af9d70b0a92c530cbc1050da47e5b864fb2092435828543110da5cc0d878d5da1e316e76f5f6ac49c6f59ce489e74ef5725eda2062496b70f65d98d314fa8eeb209858391eaaef87a9a5986a5279497c2034f0e69b46a11e1945c73254a52eae324a2412d0032335bd487b3bb2f01a4db4833d8cb65604ebce38f00821cf1c2587d93ce18dd6fe865db62859d31eebd173310c369e2a182b1ffeeb5d96abddf6b25677333a67e80e48bd0cb8d8394bdb6d6eebf0041b7f3d9e7b9cd76228954575122f502dad4011f9109e2100dbe367ebb097644619703da927c526adf5a11e022fe4e9b10083b915ad8c5d20d3f60ebb8318e323bc8e2eec933108a8058c66cecae02a2d23ade581c8e5ea583c9a531f1cc9b51bd831a70fa11d2037f1601c8b356632d3047fb7cc4923ad3e5a5d200bbfeafdb3155e89668f168e3466a8640e83252c4a234d04029dc5633742cab37fa2ca5cb4101014a47c18c6f2d73691c4e4d4a791be7447556a74ed72e9cd600c8c9f0c67e06ec6e756aaa10aa7e7f6c06044487de606260d5f906aaf54df82932688b4ece368318a84248548edcf548455c037d21a27985da09ab1274b5594f62b19b15e3917514b0742b2367f49abb2b23cc6c9c328a5aa97c9267f32c663148383af3067927b4c5692d2488f41f2606497a131c7b951614ea8b3fdd5a32b97cdb682b208a7adfaba2097d74de7de64df9cdd1da9f09e47e7322ec0b3d197ad38df54a629e79d9d1e7dc8a447034299cef28b5e6171924ce3098f263879a20181de12a3e15a63da2838029cf15f46785c01b9f53b3aea4186134fc886ddd7237e14721146f4d79ffd281dc74b1e386c9f4e8ce94eb99f4618f57a29b22809eca2d574425f81fd0acfedb8d3a5c7e8443f811aad4cb94c50cb8d407698113a8ea3aaa46c3e86c2685be8765fe03f224990e8c13b84e8aaf633dc0fcb9988d9e4bfb5a3628701fbffbba26bc74c4831697db3b60a61c17f33cb607037de8e7d63203ac9ebd79b2ca6a396f425a8f94d3d5d307ba8f733521b9da9ae1051e6a36eb477421fd3483b0dce759e55b4580516855c26c01943df6c0ee716157dc1c62499052c50090810cc103b15545d35b31e4f239be6558e653f712a9cb80397350443c5fe6f508165a29b73f3a0138460afe9b8243ecfb4840428137d50c78459a0705e8c1a4b5fd491bfedab3a7c49e64cbbc30cd00053c36e9d560b3799a5923a424b7b87991400ff2d034c9e9de4e47fecf95bd2334c5cf904478ca1952e95d50e09fbba11829b726c0e0c7ed2a9b4ba913137ecc8459b54e0533cc9c8ace9d9395eea3386ef6980342bfe170f269ce7bed65b54e024e4960e2a5fa5325b44f1b187015434e96f6b316c0476b7ac2312653464761030e8292b921e3f9034d0beb57e06836fa70586dc87d19abf8c966ea76e49b87c6149645760f7e2a7d70bf55a335a96c59d7972f99f0398fe13c667cac645f4a8c0926174cbce37e7ceecc73d8a444565b617517f1847f2286b9fd4ef4ad34ad28185b596dcaddcd0fa96c3a88bd92e2fd0c3be14ef04f76eb73b5925916948d7dea9235b4ef6c0b5e1102830932652268b36dee8b9c9aaf404dcd2b79fec018eb46bead6dc91e02e88b0e71fa22f82f1a598272cf58729ce69a6b851a7936282b85a8a5bed855f140e2a744e6228c49928d7700243ce97949caf42bf0bd87ce55b8f97cc238a79557e8fc402cf0f9fade5ecb69f9009fcce78705f77daa3e83260667d26c414ba0b25215d3e7aa232f6bd73a374ad97229a165d1055d3ae2f6011fdfb3eaac73d8f0298a776f5ea878abf692eef0da8db3d0b073bf8b93aedf2ee86f0a403efc506e9f70bba247e63d630eb1143d69241876032f269c99c51694eb973d33d4bc4cd4e54eb3f5cecc71b948fd379ec2494e4ceb12b8cc9b4019eac324b138421b94f970ad8d32f242ba895ac8af87f6a068f3497a5ac8b927481bc7f2a086b42f81eba9f455f9ffb815603d126538998b6010a9430b039ec8d0709b07628ce49338a0039158d07c13a2631dce700d1de6dcf8fbcbe9fd2cc63bebd1f499a96ce8eee47da3a8ed28231df26a846b48773d20781486eaa405233d8a08dfc910c410a918c810ad7ab5bd5b385f92341e508763dfabcf1ca8f4f2e059331c6f5b8eb7584847ea4e623ccaf98c0ab1c4d933f417ecb22c5d1d7479a03153276f1d1c69a73c2abcb283fdd1f59b7a165382fb02b43cb96fe8416b14a5f56c9fd85110fe6c388d10b7ee655eb8c29a8efed308f5450d62ceb24e35bc3a54cedf2c8e4964726feee2188fa10180a0394470e81d86beab13a7592135c83413940ceffd245dfd4031ee39039695c3d155ee6212711b817ba95d6e943609f4d6a64a8b8c258c2dfbc4809ab8cb792d3721c382dab3d422df2531976364c3dc490ef75fb896ad19cf1d60046d9d9388c61466960ed304758e41bc38de4eeb442fd3dc81eb54c1b29d9a09481b265c60e808f1c533c7b4435654ef31f1f6b1c88217f2e0df23115ccb83b3dc986ef297cc204bbbc8138973eb088fceb3f525fba3ed02cd4d874ba6f63fb3a1410eb7febc7edf0009010ec99a80f3d290e4461cba62bbfabb3b1bf6c5084fc6b0d28fb3b2d1ebb72c652a4a5ae93beab36e05f3f83855278b6caeb76aec0bce1d15ef42ae8f3b5568bbcce73a655749b3d34feed0285ba1737a6f855daf3139450c09e9a0114e4275a40ccc7ed808e823d9a28f4d836b78a22a58062ff405a13d1a728a54aa76bbc5deb39f2d119956c2ab6028fd2b017ad1d29af58f734294f96c50c131981d72cf3bccac479cdb69ab3a1fe30399014901ce08dfc5b951037d7f344427d4c1a10554e45f177c0707f7d440b4056fa169000584cb2dff459e86460ad77174bcfd805dee045ff003d3e8ba5a9b879a72eb2af89617dbd071f789738ccec592640f16ef11c623dd46a348a157c7da9f0c2843c1567d186c81313803e585cbcfa58fde22a0275f585ea28393bf0c522e008cc90f4caaa7299180eae65d2c72930c1d12c006870bd1f350eba26054db4405b5ad3d1f8b71d8455f2dc2640d3c31ba423588f01b48571798886b898340cdb95f31b86039f5758d14687554da8f7606c71e3a45c6444ea5d3b09985b23f1fd8b51ec35e8fe17a3bedb60e38da8df16294a17ba3007e6cbf546199f034f0ab8c76c42fad5c9fcd7efe7a59527e7308f259ce0b8d72d130c2f18ec6ca08336597c2e235fce01c1f8f1da88d519a627ac1239895422ea13780309c887895f81ff9175d402166ace37b853d7ca7859f484352d35f345edf4c931e373533034424cf8c7dc69206911ea6040cbfa50b00298ded2b29e9e8dacc1919559a37004f3f22f8340cbb1bcbe1a3237055848e0c4c96d602dbdda3099a284c9a1db2de75346aacec9598986affb2d03f94772de624007918c172325c5547ca815408451f7df2e023b91340e2de86f6c6c58586c6a585968c306fa44e7e842ceebe42379394e7483c37cae398d20e76aff812bb0774c6560d0c2e1da6d3a2bca3cfb26daf606b0aa4d7feaed1f3f11565470402ca7aa076a5916848d2b0c2c6db466e5384755b240d82504c524bd3789b7300ebf45ab1fe1b0e526f8eb16fbdb5307f48a4ae37a8bb61239d1f0eb2c3c472ee414da584b824d3c78e07ae39bb78c9fc34466f8469d688307c6d405dfd2410770dcee74b17e1c9408d02504e25843117bd9a19096b9717bf7fdf7de7be39bf7bc7dfffdb7df7be3bdefdef3feedf7df7ddb9b7c94309ea5acc4e4df1c1827bf89bbaabfa3198717f9ce9a38607cb7b759ab80e7b556a094cc5ae26f395b0971794fd47dc4ce118b94a286a9e108c4258a3abb93bf7e06261689672d099c40f0250ac4f4756108d368b1d363064ca4596b8bf53c1091370a3625aa8c9debcc0429beeac064fec5bfe066acacdf0d44c65fed3414fce5190da7ea44f4d94c8daf136504133a636e6935c4c17a7906eebc2b7fedc181061ac88d78f6cd8a2b58b9cf525aaaecf16903aa37f881313c793ffcc55ab74f3517164d33ac7bb105130a74e6af719d2c4eb41d95f224681131b881ba44039d385a95dc1e42107ae4965a85531ae8b488248c98d3861bc861c8d8a13ea89e0d6869e03dd344cd22ee9c066e64f0ac1e5244839e29f5c8f2a3c60a35fafe79e7f2a0acbeae784dcdd6b0534b2401acd4e74604820c86591e54de90580ffbe9326fca0ecb3efaca37311254687a9cf7479af2e758fc29d9085390d947dae29d62eb9da1002c65c864d3c9cbb82b034d4df28aa6b0f94d1a7407c93563b3244db4c52be15e92f2559a6fa57e0e48afa171a72836818ce90a4e409740574a9c89b67e17dce06dbb0f6fffbac6e2d955a04df5f1fc604a322e503f15f1b644a3e2d911ef41fa0a0be0f7544c4225840c97c58cf62c0e7296f34ac577068b09f3b0166648f247c41a7f67f42a390ed944f2ae7eb8bd9c8aa65063cf6c498e30da823a7b01fdda18e3bf7f4c4b294c3651b59852070a0b4b3f49a03758ac2537e01afc39ca3374f09a0d1d137b303e092abe448272f535b85864cd9760df65f1d80be7694a931210f93387d0497cae9bd341094514f14f87b2297fc0a082d6fb55a454885dae8f5bbb773a66b110b0a7a2e2f47bae235125d7f899401530467ad0e8ec7928a05562fac493ed5a4cacca3a22191fb425059c9c931b509f0f1c5ea1622b51332696af31c01bd21fa2ba83c6814a435e606456ee6a62acc1f7f32b0f90252f9a3c46d985a79da6c52f36269ec8f88b4573c2c9010efe6318c1db6e2c1ad05c6c75b298a5cc0ad9a938415e35f9612c247c51b4eba7647326c58dad3bc1d006726359a109b7b1d8a349ea0258145377cd00e0cbe98c260d2c143823d85e401f8f23be89476cedf60b68c5cc1445dd7e54cc5c7c4fd4eff67e2d18c85550368ae722fded4d4f824328772489884c225d7db0367097fc490498a23730ac6a18bdd165176123201a8e4a95e071fee5c85982dd5ba26620020937f32c4c20323e45d00a2d52c48ec7e4f0d23080735b29ab7f147529d7158b3db9c06bc2a80930573282a4e891190174e597c22ebcf40229a68d38380b7f4903b10852250d4081461bdf7d231ffb460e0240b7fc06451ac1deb211f5a05df0f4d4acadf6c274c95b1b1d44d582539ef8870244da014862cee3a998869cbdad0a3474718c4f05e5a6e0710dfb045d18018467b87d0952025b0e0aab78c0dcad587469d85587fcf49a8c2774fc17f8dcb0bf939d18b6343eb2434e098a415e4d29a6f917819cc293424d843c6b2aed9244a1f3a29e72d177140afa03d831b89b63cd9c2308c92eb44b003a1e6050f5576b0e834a5aa6b662d112dfcacdd33cc5f08a34385a7b3eae81024e66f0f6b6d8d9dd0a78ed64ca6481e01e0447ab93450f1fe8a1d2844e7e24b2fad5dd00c4ec741fe93ba5f5d3ee4dda5e31086713a8cc74fb6949290c495dc15f441c5d9eea41ab9048a309244d1bd4b766cb5d2e5b4e4b5141978099bcbaf2c011881560c5203bcce381ff2a4ca0389aa344c6f76afff96760b84f7010b8db1556110fa73367e047c3a9a6f2d81934a581d3c82659902279f4192c8bc48d459fa1da9c1037f4d5ec504f1a80e22e8f04a72e5848bb01b7cf7978795ec36b52170dab1ba6d55d19ea01e2aac8a7dd2da549dac30d6b6b892a2c5e7a9623e451a659dc5c670dd1952633b861420e9da4b0a50d25eafe0bf1cb5ada2969e271c76ea52dc22d7433db4de73905984f99ef1d6895068b0e3e464179a207568e0f6474d45e8922996003f9fe2c5237f38712d65a062fb69fabad9839f0cc9d79fdf04ca86b644f905e8c5d16a8fa00f5e7b8b3197f5629fc1755d54decb44ac14b64485956c88ebf2bf0e2914627a9505ea5947296bbfbfd4a4d32947819d20ba34a055a956a1c85c334ea4d9321d40feed6c7867e40b8b783b45b5bde9fa8d67d2daf7d40c300a3a5f0d36d65e0adf5b336dc4be9029a430fe1bf0174717df526445900cb094fff80f9dadbe3d429b59a3673e4440f6daff05c6520aafdf997a8dda423f948b87b43a4fa328e1578dc7c7611819fafdfb8071e36924210f2667a651b136899d00f2af4f4fe3d0b34bda6a61838251ff7ac7d19c333f2414c56eacfac5e52a5583d7fb5dc2a88edbb3647e6a4ed757909e9248db0c1909935eec8664248cf3ef7c77e79617126150dbcd53032f5a17659bc61e22b5e4dc7e4ec210225411843b220a1a186093eba22834727bccaa48e8dc64c95da74142ecee5927420201370f5833697360de49d2a48e32cc26040fe4659a75fda1e04a1935fecf4fc8f79706e2050b288686b88ff98942f87b8cafb23de0757d6feaa27fa09b724339e6add3609d221a5f32e46584d09446002b6af3f5af7a06dc155cf71d13c9349ad2ba9b748a9f771d873cccc1335b571af4b5684b38c2be1124336eefa163dcd8ac21b648baa82ce509026b37fcea1a95de8b2d730e981981490d1f354c13fde5849b4f20c1f3fd4089fc6f794f08bc5d5457e11ff1e1471da52422d0b1b788189f0fc9ea9014cf88290113b88687d49c520b9b4e7e77d875261cf8141db33f042e0e8d0083e1f25a189256a11fce1301f08217e6a1fdd218e822c309da8c233f04e139d9fb47c3022e5868298bc00989118dd48c062f0f7e78ad8ed1d125d8141452a5ec41db687666b13e7400c6185099d0922de30c414f9cc1f7521cf18184420ff9fe2bdfc98f36efa70fb100a343b839da50ffc6cb678f812c12f2fab12f82f70743bf87f22c29d69b58c268169a6c2205433665571eed611ff520f19a1f6e0b279910380c4082cb7a0248d0f092e0f6d30e6cb99668d4124af63e31699f5449106c0ce221dae7aaac1f6834136c5a76f126564eef4a4d8d4ee74d5a68768203c5bb01f518f6e069735066eaa606b2055996c49061c63f8d220d487033de384ac13ac65122b9592ee2bb17b237c049a5fe04e956685d5cba0769b1e2f3d0069e18304e5f2c295988e28c42c60026bfed07f5cf660d6c1c65ed160645451b76bf8d098a3b332f2f9579dc9937ffba8dda86c5823ec5f903cea840550dc2683e3d920a23074a89f37961c3c13cfbc586ade19c0d75290b44a1937ac7aa14e17d91f6297ab1d0b5e08a6aa11b1c7b1ff12debeae3dcc0fa6906a6720ddee4607d020d64df15cd4571d9564a32c3a32d0fefd555341440dc2a702ff2c313d12b2ccc8c932e5d2a691f0982f8183ea34fec4a7f1c009545b9aa051821135b4739e837c3d8abf9e48ef6a53a02915112a166534b58509bea7f2707b771920c7255cf984730073128a28a72041f7d80442489dea42eeb53ccbf6635869494dedef4b3fe4f5e5d90889100933b0de886720d93aedd5638f17d946f8d5d65cb5d8ef4a81b575b70d6741c0aefd558307b92701c4160a40dd3778fd02af82808eda0c2a5fb44d26f857c022aac777fc8a2b8b385979c38020c0d43e613cb43e16fa189cc8b30eb256a58675431da6d44626a3fe6e8064601c71b34e7b37a81ffe49faead33010fc1d986cc24aef2e5722c2d4769066d36b3b0be1d1a0425a6270d8f48816bb02c801e07320010363ff6acf02efeafcb9eeb18e32db13e3906145805a60d0fe181a33cd7d86faa63d5bba0bb26579e58527459331ee6128b8d5bc7e2758d230e18566f00132824757333e3403f60a38f9cd09f6498e4440b9273053019a1ac34dc684f7fe48c372aba03712adda85fe5077fa7aa03a4375be06689f684bbed0e56e3cd6da5b3b81de98c200616097e9485ced4843f105b433cb073e1fa39108f9492b4d8a59c0af981548478755452269037f5aa88d731e2081fcd9c14558a2912f8d51584e3fc9843b1bf0b6be99d8f1ae87771b59fea874539cadd48aa1e6c1908719caa9549da00f167d633b6ba5c29ecc56637705f29b00ffb8587e4ddad6fe4eb4850fd16873a238599af6fbec3f2d8929eb6435c3fbbee4caed452092df5b6acf247b2fe2f41e2965bd8a9f5643e9c643e09af8e3949a2e5440c5697592b1bd3540838418ef0f4088347191ea67a3439924a3d2f629ad1fd60657aaa0fffbe240b3c804b0f69c02b105a64aea0e84fa31adc4d8aa40f522d7a1ee2aa294d42356ee0791b600019a2ffa84a48c185a52fd835cf17f1592372bad62c0c3d27c378acd76b0eb415992aee98898ab2294ee45c8490205cbe459dc35fc5507b3110ae07f2fd44abb81f3d549f3a7056e619915071488752a98ec0384c34855d524446834445bd410a9d96d7481c9adeaa78f0366602600871bd69137f08b4da32c17844f4e77614390d02abef23585410cd82cae59cbd494033e9f828e096c7da198582986d5721156bcaea7ede247a4c6c69956b1cd043a364ea4c7f28937c42a6205a21bd9cd4a878b009c829ad8990398257be01e069e6c270cf2bfdf9f02d524cc0cc075cadcd72579c3b0b284a74da3f8d06a50cbf602667e2bf1465ae1b72061619265f4a0362ff0098d6889e4ecc43bb8acb91a6d00b79fa519b33e600a0a352b7bb05cd607ab0a17e614b9d7921405a4b5fea1fe4c9f3df9623c90ee2adef3e62254fedac3fe100ec500d950238d341ebbac2dd1c4110d6cd3707968a0e2059e4ccd1e782d6e5f70cd53461b56ca842fcb9147ebf57ddde475a81b7bc0e235bc7e569b09b1c03b26d8185b6cce0c29bed64d32c6e9ded281358b63adb7d0148c6dbdd470a8a83d9a89b212f895077092bed0d55b723f43a1a2f7a8d00cb1228677a9fd798d2a8c99d3162f308ceef4b42b628f39adb0bce3f6edcab2a3add94dde087518a8bd8cb0c2fe8cc42115e48ba4c620150800936832bf14816d0003af474667e568c8698586c940b4d96aa7ea3b7ff0f2152dd915c430b6d92afcb373ef7c4820b6669f4984c42352c8b61f2450ab7dc922455e7822a47b0f11c0a2a165102c13c678e1489724d633debe3f0354bbbb6903143cbb15ca2dc7c660881b97e5bdcbae0bd4cf4c251b7c2412b56d0994923e163c731f32e22d303558ba966636cef82e0b6564be0c793d0d4b4cf78118ff00c2a17fd2a28172bc88409fe959101b9075b49d34a7b3b4123c92dabe61cc86e4d273a02fdb41735c7982f21646d9ca5cfafaaf993fd1a9a4f7ecb1736dc6c114d76674b70ed6e7b4fe9ef1f10b6e4637197a19468f9c101b61629b369694581736a312015adbf2eec35c6df1858111b230e6fb9c7cec8244878e1f98d162082ec3479633461f3b0ca29d6b435a633b667f7b6bfb06943caab7d216f871615131d687df9229480d636a890a9a01ffab0ce4818967e1c5541ff6bdc2389b89d6fddcc38574c1538548d6b41fa6d414875d7addb9e3fcfd9734304b053ea76a2fd63456969e5dfccf9ca64bf8b9033b22be3c12d46d9a62cf88c0b8a8975179e0374a82232606a9709b5c37291a0df0e373b11aabc26479ed63e23170477e8b81d34209ad8e5b458faf35ebe6dde877e318953de5faa094dd0f44ced33208b7ae5e2671ce06ab830432338d9243c30fcc46010469b00ef82c185dc57be20219a42948a2f4a1a337c76d05aadea57dff215085aa8b4b6cc6f3278a9eb8ecebef123fe10c62c230849c83161a7dc3c409d1cf0884c00e027e790e02491d93530975578d6d03e9d32321f056e8b736983db1e5f3304c6cb5440f98d07ccc24ac2c8de7670889438c841aa4f7241ac2495b25cd1ea61c466f035c77b7a73531f3ffc9bde5cb1e81e269720b41bfc49ab81586a6e0930a6605ec3045ab7122eac1ca9b135a05df210c7a97a69279354bd4aff30d5f34201d47c368c5f4495333084710ecc7ce110ebb168af5a2cc41a309c8c8e1e787b0a1676fc5e1090903ee25fdaf92f04a0bfa11cd0e84b66a041d6be337b51c046e14e5c8aadbb3b489dd70d6ac82760b539d2e5ddbd174816c9e3378e61859fd70d73ff12d1231a5f9bda13f49de80ada4feb94458bdfdf645a9d7869433e546980a526a0dbbd9eabdc85ca2f033443f942e99b061a35c94a64a5079c5f8275e3cc2370a5f5887de8d9746881abe8792d705184f13acee6d7a15c2198dbd172bdee68305e16463714c7694b5395d863c0f51652cabae272ea2d2b003c2d064787953d76158f0f05a56e5a7ba74ee131285190eefcc1622b73a92356dd307cdaa71ad57338c8edb3dd7034f29674b846a12ca25de31f90a930318acf5a87ba08e778e69d4c710ab9d943a02cfafe2bf114e126e6e8b442979347272e2cbba9bdc41af44c836334c924c9b7c703d123758ef4e526984d4059494c101360436cf34c929565c86fddb3d192839a1bcef4b87a78f871e6bb43889d06bd1d50068880968d00aa4d8172f108ddb031fd342d5f649cee1f9484a55de97bb87e5a3a854a5fd23cee17dca8b2adb973c87f1392955b95fee0f13f8b0af56bd03e1afcdf31999a0f59d99f4bb31fc11eb22ea9c3498ccfb9fd2b1ea1dd937c9621fb5f8d767b0227915841a8bc077612f8eb8b2f190cf4829dca3ae001b18a1f1a00fed3faccfaf32d5ee2f3986ed132e5675bfe618ae8fa880eafdb57ff83eb13215ee237986ebc35b58f57e67deb0fafc14503dfba7df62d8763f5cfeada47d41713c2ab9a3f92faa9c2e76bb29cf4d58733c4999f440a62303d15541db60a7287ace8fce8bdefe09d0b63bc72ca4c26cdf22a64ad742b2800baf7c421db31c6300c6792215f7004dec035481549ed337b6efe61721c34bb1ee86b61b46c2ffa396d9e3309616421112fec8fc7822f75d9cf01b689b4df36b910b4f554dccb1072b7473c9430cd41b5e9984d9becef0ab12becfef7083c59dcadfb0a1ee35b635628082635701dfc03bfa506d3137cae116e3e5903754048694a24a26ef870e01faabb2ca6e2a53a6724b45593b9281f88815f28db47e7fbeed1854cf066a6baf0eb2a0751c3c3f2cd0f88214cb5f214156c3cbf2c15553e4ce05fdf82fb606889082af420d8d1034a542a93f0245f05cd52e86482cd0472b0be9335e30e317a97d154a3977ec7e717f3b1ddb82f5629aa798c475ca7784c9af613da41b040f2a7c0724f8ebad80d62dac3de96fa59f5bf747e5ad283cb0d16ed351808224d04458dcebbe59f3af40eac112cb33d1fe5581d8261d9bf7c436712ca7c2014d30135e87789f55c8f254b6052e9605bb12551048ab8a3ac07fa6f4ae2a9a09cc04263ea351d24d6016fe022ed04bf0023fed5e3214c07cfb5b4ad62d926b2e242deda6440f6e9aef3f1e0b7bf171ceeda6619acff57788167e44000f5576721b1041b6d6ee9d02db143c12a41157783b9fce29c703636e4e2f9c5c84143e13bc20ab124e24784050237822bc00e0c78f530be543a6478b47093224c49800e37a59b154ab4fa54aa54e5eabb2c0b0c081a6d5cbea05d5835564f5723a4146a987221a568d0a86d58392f1e1a164543294eec4e3e442b1f143134daa1edfea05f5e27142cf029a60a2c888a8578f1ebe21415250509e2a49069a943c0972fdf0a160504f6c7ad0f4021f5ce0d2839782b95258d2c3872ae174437a333ea91744d0a452a5709425041f3f409c62e821004d24bc4891014106042c4221902c0cc383a624f92586d911add5cb89470a8712c0103db0503d5427783e787a8081142f2e8c200b6b0e257a7c31a925aed5119493b7a10b1f0090aa81118269414505e5c2ea880f128822061fb2204284564e161ee193018cd11453d610f0038f1d1f5e14134e48562414e90166754405c3ea71323214c3e90418211e34c1ac867824b19a04612204f3d24426494c2281a61150af22302a180078a8606298d0dc6045130cab090a34219a52a756ca53cda082492151b9e0f31353be08613551c1ac48e011f4b202aae86504104c68a104115c60bde004a9851e6058e08a87078f91a1a3950c6a55420a762af2228312e24b562f2b18144eca09aa6789970a729a498990f3c20a4f47982001c28211e1c5480f404531435835a815502ba8b26872a1072a28f5420a8597155026f8d0399de0431388e39d6aa71bd4298503cd0d06b080ad0c58001731ba604016540c80071d9830aef6e1ec062a354c890225e9e8890c4d603d3c352db0a082a3ca20a34b1c3480010c3e2cd09440c26a8b073a708515333081017642083231aa31c2980017585c41c514516c79024a8d101c10014d282575a94307b41ae2b0c10564d6750411b4e683046685851145187929011b0ac00276a4c80820c4c0b0562604890004a8bc685424c3901013d8101d9b1fae1e3c500928800002f0c30d221560c002b2e0414a142345808080fa00971c44f15152e465a5f222880934408a240c20040e50242001441815f9201122e3d171fac137074a0eb7c107070a06df0a526e7826f848f08de04504326b7c1ff8d4f8c2f8bc3831e0c3a1ac782b7829b04e4899c083846f842f040f041700523f3e97d742f5f8625230df0b8bf5ad56a90fe59d3c4fd5305d428b8421ba47dacc955e12e7451bd25a7a2712664d420ea60ee40e203f6801a141f7cc6d95fe4de736ae2489d72849e295da9e06448cee56750bc8045a401ad00232440b480fdd3d9b79cdba8dd7b8bf4871a58ea967ea487677de790b7d52cf3b5a1510046d104315919ad44f0b88ccfd9c278973336ed4e96baf25021a227c5169c62fba675b1dbf15dda6e6c35b5a2c42122234b5583f4fc722ccc4fa2d1140114cf05bb6d51fbd66fd433a62bfb67667c6feb63aef0b082f41bebcf9f1386bab325260750add2936727ee4eec6e9be91c1111df7f17bcbd08523477a8e183952e4089123438ef01cd939a27324e7c8919e9e1e233d457a88f40ce9e1e9d9e9d1e9c9e93962a4c7881123458c103132c4088f911d233a46728c1c29d253c4489122458814195284a7c84e119d2239458e10e921628448112244880c21c2436487880e911c224786f40c3132a4c8102243860ce119b233446748ce90233c3d3c46788af010e119c2c3c3b3c3a3c393c37364a767c7c84e911d223b437678767676747672768ee8f4e818d129a2434467880e8fce8e8e8e4e8ece919c9e1c2339457288e40cc9e1c9d9c9d1c9c9c9e9a6dd1da45b2018c9959529a74a77bf605e3035353ab80e302f181cdc5f8e83bbbb77f70bdded4277db0801801b0efb828a6e87b500e00300702d00d8d00e837158aefde80e33cb371bbdeeb9f6e30cff2dcc33a764468992eeae110200135a3feae8764c734973c7f46fb9bb5b60a11b06e679baf8b890d6498a61032c9744d7decb4467efb53f3f88e86e10fc316bfd88a1f563892a89cdc743fd9169e6726a9516cda2176ec2a840770ba19223840acd7dbc4a8e0db5926681ee56a15b2e7108ce7792600ed80119babf38be16b481022f05dff815f9789034b1814eed6005dd4b24d1d43e7e96b417c4966e21adee131cdd2d7a3635bb4ce65e8629582b69335f6dd1ccaba599345240165a6cc1c5021860a353c49324719d1a4fe2fe822fe161ef63f11dcd5fa44b54749b3d93b9cf797a303a7437d82d1fac12d36b7b82f23183242e5027a0025d09824e3b4800092738e28b16045140929309d6e019e1092786002336e42446016c4ee0dc10d48588d7a98a0bccbcb1e4b4050a6e563809d114e4e4062c57a801840927728b1a2f010d890e6c40384181410b017444e184cc13322724086851e1821818a163e3a14ece2585385a5648c9f2aae3a412428b02c40181254e94a0836f0614587af2e40a2a825a34f8b8d081801c4a40c5154149def8208045093e9044a5050e48a28d0f012cd8f2803694482107b6c6d7c31222d490031c669254d081afd6014f030121a0c254c518df132d75e460041cd0c45810c6a71381362e90a414030ba4f1c527020fca68e24eb1041454b6f0eaa80201191872822343b04085b782140841510126b6c85ae08467c6015cf882ca0f94d8e20024bc2dce209244c6194954513284774410360471840d08202303593cdd174a6f44b14301105d0e1e151cbc30e1f0850e3820b2f723456e0a269a884327c3e80931816703b104920032103d1e4710d19715416030a51b07635439c1073f574e6842a9d9f8c10c56014ad0e24fd05d812e52f03d439cc10516412d450d422974d618830e21495a0b1446425a18a1091a26433a270210f450a1450c9a6eaf4e2262879d3470900115b2bb470c25d2c0018d55080ee846a107188e30cd81c44b96ee13174c3320630b9a4c1738e058a38a5697349c58524717077c2002234c610109ffd24117268608a3032ff6484b0768d06587305cc0128f7095308337ba847604e00138f8a137d0a38d2e4359acb00213141f118235ba806f50698de1c20b48541de802021330b0a00c2e38f0b0c51877f8c0035db000e575742010c61d2a18004b8e392ee02304dc17778c218120d2004460810035b6b84301732840a68696ac031254dc4184152aa8001460b8000c229cb823abc007ba15489b1d2a80c41d35245104c410464ca0052843dc01031a6174990dc1404e52963b5808004d961a739041881cee8079c003b8c0228b2e4d60643be2c8010be630400a34708316463b44308516b5293c6426e08168c7044eb0c5b8820eb42ab250b1638b017050a4410116d04842c90e20c8404190901242e081093cb10397e58c355400823260401264c751037a6c74b840a40105486207913886c02c31820b5bb860881d41b604a1860794b880123a78d9d124c8407080051f6066ac50c70b8a484206b6a7c9124626d4c1810cb49028424447142320d4e1850f497eecaa40200d29327524b1800e0c19b1842929d70555070e32708246a7820d84e0401d75cc27ae6c41041756a0f1001dd421148219a8d4e84069e2071ad4f122009714b82882873a92bc5187cb02518c8823861b814c1b74f0a08bce8b3a2c10461b466bd0d18616e41d2398d144191be8eebea3037460e00525a8715252021315c0c4c8f0f07a784ebcffa1bd15babd2be552a5ba1cf7715c8e24d34882628d28ce9d4dcde72c96610adae0b2d21c28d6d04a2c131f17fe2d04739d39506c2c494a43310c05c962184a924d8911b9121fb7a9a93f82b592e679fd030c74374eb7565b1a5fb05adbbc22cecef679de8c71c21777f2584b25f540d6461c69e8a0d6a08da636cce80194306a70f03e8863840e40c162845d947a24f909410d27845064052ecaa875d14203ae54111c800d1f6ac850495c0a8ecaf811024e00d8280114d7022108800d4b803978fd15c52085164e56f0f04042181ee8c20463a0da6085408d1dd04085fc068e8f107aec38a9808917f0003e5e03313ac500061fe8c00457285183da5303f1025652f01a65839b5ccc0620b688a3071582c081c540b78e08121d33830cb4a773d38d4296a63ef158d25de4dd2b2edd7dc6f724c795f8f8cce38bef303c8bba7ba65baa249da71d6bb21d15717265c5dd0da55b2911d0e898afa5cd31ba9b4a2b75eba29b898aee9c25baf310dd974a5377a592cadd4dd34addba6968dd24740f75a35ca8537708dd00e876794ea09ab4505ba0ba7018166b69695eb39e4beb36cb9424f1ee6e75b78feeeed1f88243409d1bfc7977a2419f46d0e3387349d62addafd5ca1f8ff4b274b7946e9d8e1a5ff0451bbe98031201736e7a88601a4e4d27278788cea4d1767644233ab522379682f8f3bc21b8bb1953db5f1c6bbb330471de5ac1f99cbde1a0ba63ba99f4d432949cbd42dd0dc3e2f9d6e84c4712fb2ccf9908ddfabcbb7f74ebc3a27b9c4b36f737b5e533d2fa8a74f708ddfa6cdd0d42b7bea46e254c2f567a1f87bf64e398d678fdd193f8d35c1c4b7bc36ed3dd3bdd5eed6e12bae5e9a0bbf105c3bac32f5f8e73c967f73299799d5eadcf6c6ac87975b584c1f258e2479ab9f8e338c3eef6ee8fd6dd40bae515812f98733556777bbdea6bef7dafd3c5afb7cc7f73fddc8f648e7aa6f366b7559af3cc5d5bf3394401babb846eb51b2dcf477787d0adfe81f8239d35c79f7734f79af56a699ebebb36f7397cc14f84ee36a15bbd4477bbbad55f74b7ce8eb5fb4bd6779986939c21be60f84b32ddbca11dc7d9dd3cba3d22ddeda45b5dd3dd32dd6adcd876a78b749c4b95e20b8a36879373359cf0629cbf36c4d9dd796974c4e1e1a9d5864c9d9c223a61cf14738c180973728aec1ca14d233a46881039d2536488388b1409439c30e3f2e274b7aabb532754777f2f074022a6c5686a8af5e9650939626258272339e4b0c3e727dfc17394e7c085d2ca613c872c5afc27b5c38bb3bc83f09f144d0e3bbcd068f11f9a1d54cea2d1e23f275fd1eca0a249d19cbc7d079557635488028a20bc205059b4781e048a468504a8b0a5f5794c0c2ee5a8140d0f27cf494ca352232b8b0f3d7cfea1bc07c4340f38cfcaeaca098542a154be7a41a14ece62b977b272f23c479d4e5f0e563c7f710f95c3d2e7ac7c7296b34eac1c562c9a4fb5c2a96870a92527d6e73815cd95538ae5a5ba8869cffbfcf4794c4ceac53b457333ca55344b9fabdc51335780c4702aef180ccd951c622ffecd5c011253d1e453132fc63ac55e68aca0dca3b992436c4583f3189a2bedcdc3898fd8e71960b50a08f8bc7f6264663e979139a15e5eb2a05ce6e52706664645134468e52adc8ae68adde72a9a2b76278721d63fdfa78271cf6150a82c2c1d62dc43c9b07888990902869f93c3cc64d1e2fd9c3c08187e50289771a5d3cff7a158344d595e5c8bffc0386b264b8c07e13f30eec5d0349db2e8b0c3c961689a4e593e1e35c8cce8b0c3c95f689a4efe390fa5937f30335abc1f187f99d1e2fdbc78cc4c962060f881712dde4f8ca37830093203ca65bc86937b343ac4646149e1e1478646072e9462dc731d60fcf39996cabd1f15a8685de92e31150dee8adde757ec50de3afadce311640694e7ac2394bb8a8918cf9bd1c2c51518b4a0b26841d17071058620b8b802430c77f28e7952bed5cc8b4c8ac57a59ad7c06b77214ca4a4c8ae5decc0a2f30ce52792befd1a3c74c1095d1cbc9656678784ccc8b9595af5ce52fa9192b32aef21eee390f8fb1b2a2f1a1f26c65e5a9988f191c0f97712b34ddc37bf80a5fcd57f3d5f0a051799015cd93afe65bc1ca0ade938f95722b2bc4be550d0ae68898fed040a229d668180009348e80038d036441038937545082c58a399dc6f88aaccee0e1c463398f212fc59249d1a0542af754eeadb888816acf73e29d911af2603ccf83a1697d359e8cb73a61b1049593afd888ad56ce4ab9caf5c3e5f2154c1023b6a2b1226305154ba568acc4cc64e1c24acab9c0b57838f19c35d3311f3c8652ae4ad15859b9f7c56480ac9093a489d26c64ca528413587c3194c7801013c2c7436609991796083229ffac38f1ce889d888658adafc6630da968501feae4f597eae189c1c307423c089d3e161a466c116b348c702266c5071a45c89142d2fadc6bd2b1af0a22b8c4da3d3162ed5d10e103d50d5b0a82f220289a196f66e53de3c48b7919156b6fd40b0f221a1ebe180ae67929efa4e241a4f2f6572aa388acf01064d51fca4375b38c3c3fc9a0e52847cd9cba3b9582a1619d5433ac99d50cee4474f202347d5f8dca83a46a787835caca0adf690a2d3c57414bebe48d4bb90a43a0520d7b7194b3702a5ff94cc7be978e792acfbd1f08a1658ed8ca5970c43ac6f2356228c41a0d24be88652f767219b7b25abd04f1bc95877a89f118d64cca5732303c98ac564156ac99202b57ad6456ac189815ca57a797d3122a46c4f2154d108fc65b79ce62e13c5f79105610168d939ad4e9e4ed2f8f2688951a15b4b4aef8887972bcaab0115bf9ea8c58c73a36003054306e058502e1abf93c9a56cb53cd04f13cc6559ed7c45e1ce5bd380f57f16022d3c3476c0915637946c55226b080008989a17878caeb01bb7dc34366e68a17b3b2a20992a279f197b602a372140c0a8572d40bab061504e51eaa0645f3f2d511029823d6312f945ba9899d3c8887f2134d108fc6494dcc778879be5a79cefa505652982688939a98e71ecd152f969af9685e5f4d9f0600478c26d66808608c588c8f18da5b42c5aef888f98bb7c764b5f2dc0a2b88cabd202a4fd5c458fe920a8272cf573c348d9520281a2735b118ea44f36241cceb858600be88c1628d8696396248501173c51a0d248a885dcfbb6f4e6e25c8a9e6945131cfada8522915946879b12029ef20294fd138a989a1686a62a857dfb47f0ce88fe531acbe189a4605e31ecd29c628e5fd751016cd8a06a7c29d3e8f8e171fa71921958a078fef8a176305e1f1e230eecdb4f398b9e211bd9c7818a17c45b3e49d689ca8bc69ac78312f86d7f781989316386231ce42790b652fe6b90a3db4aca062a7af4628c80bcb617cd5dd2e73c52362d12c35cd8946a883bcc0d0d478f662ad8f0c37d008c0154f8ecf6b583bf9baf081fa8ae0641af67ddd8098fe8ae04e5fa7bccf08e527d4cc12038a889d1c1580a6d8290895af1c0d21e688f1714a396ee543ad18fe3c266615e3c34acab3873ad1e066acc40ca162fcf398d4151f317c323a197d1ee3334b5ecc63f9c7238618cf7bf12057bc58fb122ae6f9151f31cf611cc5c348e52b9a25cf28e51ecd92176b1a2ba7537f35343894672f4693a241095df162301eca0a2a285fb94105e52c4723082edda9204e6a623156092a18d1bae2c53e3f9d50b15311949f7c06c5448552f130e231a4f2934caa51eed178334e50fed12c794c501e0dce0a6a48e52c3ff1b8e22d7d4b5e2c854bd1b05270f8408100820926ac10eb7e3959c2c01d77dce101b990e699b3b99c75facd56da7bcbf3a634ceba4172deec757a3847326793babba75b238f91076e0c9b1dcdbf5e4babf14cb1125863382270b037bac16ac972dafcf2d7fd3c47c795ce9cbdc2c4ca00ac0ce96e10dbd071a6394caba595c6c04c5dfc6babbdbd0ecf9b1514fd00cda1c1719ce1a43e70b46e483438b3f19738e42f5b33fb5be6a579ab65ed4bd19f8664368e1368e653ace5ad861b0ae30f433c6f14147f09d32b2e2ed10fffe26a77f7cb196c65b46c6483baaf7eaf8de66c76f149d2de5b385d9cb798ad66a952f145ba642fe9b399520d8e2ea2bbff73d766ea7fcb229d6479e5af52abd6d3dd36bbbd7937ba1bac5d7b0bebbcf90bf46074830fc537b1b9667d37758ee96e1ce7fdfa367fe1a9f319ba25c281ff6b5614c500737dec4f139768b05222a0293eced03e69894799bec457e7bf61b5e14db555447d01da10014db914bf48fd924cef4fcb14b4815f1392a177d33e9c24f69a755c38479f8ec979bb7f04e6c75ea9dbd82acda5bde083b4c6bfc4987ece62c753a7d4a29d01566b6f98ea7c67338eb3c6abcefe4d895644f8d7ffa6446bd2dda0584b5bab96c47fcbb86c737f69adae34773fbf183a1632d900abf57cbfeaacff4d696ae9d273f6d6dca7e379f34cfdc34ab1cf9a6ef1b1efeaccb9b54ab3391abc9f475aab96baff4d69b6e5da9a8dfefd258b69cd6b38bd49b76647a0f8f92ff934b7597c5cfaccffa6d492eda0415c68efe7ca71a419dfbf657f5ccef0692efe876189dd71a11d6be97f534ac2647f466b69d8c7c7a6c6c7671c27908fe3e94a4992e4c2293e311fda6ee672e1149aa34f643b3c65ee3395fdd7327ed147fc284998eccfee4e1ad2dad7a7ddb0c40db7be61c90dacb19cb517d9c8d7923f7e06d2ad2a608055669fcbf099be55a549267e95a35cc8d4aae2609519ce8ff194ddafb5a8b8d1ddbdabd16cabec69f4869856e25aca3ebcb646458cee06abccc4fa18063b9ad9e0ff49e18b16c8e3a24525090b36ac6183056c78a2db95247187cd669ef124fdc33a97c43ac327348f25910d335d03530d398fab25f123e5c229ddcdc5165a9c50acd3775a7d2bd5a58185a7cec771861e6b4d0123866e4db9cd9b4faf34f799fa8fb64ab1c75a5372ba1bc425ad250507ddddb68a3b3ca514084899e038be0e4f7fd55fa236b755ea35eb0eeec6b1ac792852d1f17bcd3a8e892f94fb3c94fb3c846f994af991cc59a0cf75e816e6f913450523cde5bd4c70464c94f258e228423b516a4c274aae9fdb4d52f678fef848509a68283d4a326830e3b7d94aecf966a3397f7297e7dff2eb6fb97eaeb4dde97fcb2ffecdf1bcb9ebbe2849f7454a0ee89af55c59df6733ff9b12c68f73fd25264a2fec32cdf5452a2b4264e7ffde9470330cdf4911223bf3965484c88ed5293d6e8e3f3b3cba89a4c3a39b48393cba8974644737917a767413c9c88e6e2215d9d14d24223bba89346447379178767413696747379172767413e9888e6e22f5e8e82692111ddd442aa2a39b484474741369888e6e22f1e8e826d28e8e6e22e9e8e826d211dd44ead14d2423ba895444379188e826d210dd44e2d14da41ddd44d2d14da41cdd44fa6a8b90dc402291945ed0b3a35362db1c85e6cd4c4cc63116624af42f849fdc65180cd364b85a3c1f69061dd791178d2f48c929fb3c97e82565b21d7008987363b3e3df32cfaff90cd752b6849b893fd2667d7a6f768feb6e20ba3b4b77ffe0430d466bb46ede1d904707ccb9a93a7b69373c6f465d34e9961115b64a6f4e9291f873b302c1604b3b3ca58fec3ec934739769e67c9230cddccb1e4f9acf0e4f998469e67256a91601dd3fc230d813ef8b16d190ee1cfebd36f46c2b76af51677ac7d4ffa6e44866b26b6533f16f98565af3fbe248cb1f7c41dc43777b4dddb6568790329e4f68a675080b1d67a54221c595deccc4643792640ccfdbd1fda38e29a1f564099296132e197f95ddcf5496b3b7260b9fc438e12f39117fe93e7ea4ff2b14629a83c1707d9ccd659e39e9c33ac7f9d3f882e36cc9808006415048fef195e75f9b675be420f671ceb10cc719da2a156b091b7fe947190ce786e7ad9630180c365483d6d00c8648d03d73d8ccf37417ff86e76de8009dafbd61b736c31edf5ffa3b842f78c3f386b3542dc5f7a3747799bbc5f1290df7978cc4af503259de6b8184c4f90383e16bef6572646b75e8da3cc53a89c6799f341a67eeda22182c5f4b9225967d6ede1adecda3b645f869c0bb79f45f93e1dd24319e2310c6730c6340436889d00a5b98986046900ddd373c9b543a6f403e3e3e49c28f9204833dbd5946e299a7486533cfa05b1db2e15c509eb25c1fd7a12271fead894cb6644919d3ccc56ad0454d8a2cc16033cf20f133a6f8fe5114274a33cf20717e93225c68c79f1d9ed2e7450b1425894f92f0a3f84049127e145bab43e36881c4f937dc9db9fb79ea6464ee569d1565e263fca1bd64b554a6fb3ace5c2d167aed0d7f4e26dea9234b71e8ef37f93c6d7f6db6d8fd5b36b2d11f6b95806cd13896423e3d6592f0a3c060e12fc16062c63212cf3c457148f6d786b22773b7090c478cb3ac54c6347332321732ed66f8a2ecca745274b2cf95f82f69afb8c3538aa3bde1bfb72cc3732ca253ca32beb4365a4bcb9832bd0c8fb3da28cef52949c3bf3e3334be600fa803e6dcdc84bf24c3cdd7c160b2cfd15ccbabc48796921b40f173f824fefba40db157ead7e6f0975cfc01dcd0ddb56e252193b8d1ddd8dec7f2a3387f749b1d674af35c9f86b4562bb18b9f6bf486c349e66c5804e4b9b9b9a10a95ee10c91605207204ac8e9e79e291cefc41642e8dc417eb93b84cc219b5add291469360b05cc854a98d5ea32319b86591eac43a7fc4c750da477c92a43763580e4f5d928e6326d627c939f35ba63abf4fc73bdfc5f7fa4f732ca499e8ee29ddeac1025f30d7cfd91ecbc417cb31acb496b93efe4be232e74ee6eecdc5bf730c5fcc3447c7271acb9539ba5bb4a1ec455bf12fd14c73f49238b4129b000e23397412d2102d23ad561130ba7b061f79fdd7e5a7f9e3f937acd477a37b0e1a074592d0c4a737cf706454d4dd444fdec7467c9b482f2d569324fc28389451d9975f5e9189373c9bc060e2fc9b2cbc92935dc9898f85e2ebf3798a24147f8943f3cea324b64aad2d975646e6ee4d46e66464ae948d33dbbcc353ca6c38d780214c5a1c6999a303eedcd85aa5373fce108b5f6d14e379cbf3c808143f679acbd9d09301c4859366eb0c3dcf5bf689ebbcd9eb93d66d91c7a3459c7f3bfa789e74dfa7e5caaaea16d22d1e991652f15bd1b3b5d7df36afcd78929eb3b344e30be2e0423bd2649fe70d0ec6c1c189f8265b71e2464be2ec32bd9304f3639a29d33b93ee76d2dd32307500ba9b866ee9dca03d141a86eef6814eee6e29be113e1a725c802ff879dae8d2ac519c9093e8ff2afd20a085163cc795cc787e5cabd9540b2db4e04a7c5cac9f3212a51b45011417a800a0804ee846fda0628d1ad2c2e9b916e3b4704ce8a1ee36a165dd02b7f89146a3f5e3d2026fdd0ed340b76e9ce85d9d5ee72de7faf76b352afaf45f9a37b7d9b1f85ffd16d29bce5f6e73a5e2b4a3f8392c6fc6d586be1bab754cc1e9357bc3a5ef682ebe3fcdb3ad5e67d80d04c24efc2b8e24e7e9334fd1f16eeac6e9e2637acb2ed6e9373c6f3e675f8e330a0c267ed519bd68abf416ced0ff4e7f29ddfdd3ddb125dd42af211a5f902c71d68e3d3b60ce0d4dbc797a73eb85ebd6ebbbf59aa9727d4c8b05d5acbd47e2fc26f3cea3ee56d2cd84ccdd264c2fd6a1f16b9d37208cffdaea1099bb4dc4f94dc22b44577241365aab1688de8c1f499c7f8bd9185e9cd74642c9764c1aa7381fa9bb9320e9ddcd9589381fe916e699c394285b8b94f479e6245ba5b689f113657bc3e4ac58f679662cdbcdf12f0c96fb8c775856e9bc85f34e52967f1c2729c3e558e6ca10c85669a533f7485f7e39c32dcc93c4346837c747aa4115006843043048110317a081450992d810828a07d603605c0f50c308a70096afe600022600d1023058f001c41326668ae0b1738027bef8e206074092009286081410b403089406a02405aa1915ba8184dd7261d6f882bbc7c9c6195a2b8874b74d956ed970e921a00ea87333567be952fd213ce2fb6ea4cd5ce67c27cebfa3f745baaf2904e850a9bc5e4a7c94b80d93486b72ed9fc090ae51aefd1377f74a05076712a9ec6de2cb70e1bc59c552bda88ea0a12489bfb0815c4b1bba121faf3fca72ed479938da940f4e2840b58172626542c6a22b51125e4cf301a2a45b2d7877bf68ab3bec451bfa8fb4790be7df5abaf8f7737d878db3decf953aa1e337b5f1b12b51e2f966a37f03df26fe1622badb866eb120561a948680624731204fe24c229d756b8535f0057737d7c711ea5e35d1dd35746b052bf882e4cce1fcdf4cc3c1d5d21cfe38dab07bc746c7f95828cea5ddcd272d47d3ac57b955a31aa5c4ebd5164f4cb9bc55fbf05222783d3cd60eca489f9040a1b0fa58ac14eae4793dc207f6d7de0c2818bc5e2149b50f95d79ee7a55243be98af3dcf3b7d4d3c6fe57d9e775261f9bccf5b7d2220799eca5bf5e7f1004f9f4a5503e31eeafb50457828cffb60bc1d7cde4ba73cd4777acfb3f279dec782f205f9bc4f85fabc197c9ea7fabc19bc113ceff4b134903aad7a78221cf942609dbc27bccf537d9ef79d64de87827919f2c9783e2c2fb5c24989b7fa3e94ce09e6fb3c1b1f453c1c503a3142a7a3af51fd55e1a14e35a8d4e79d3a75008f055e7fdd6ab5da6b0fe57d9e0d3cd6e782e77da9ef3b791e8f87e3b13c99effb3e159027e4fb509f977302634860b5e0f1f851c2a78497fa48f050dec9ebefe873180fd51f55b5cf3c029c7a46035e2f29e33b792a0fb5f27878a725be8f053b793d27effb50fec9bcd47829cf5be5a07452c8f13e1815eb5b791eccfbbe139c54decb873a2d79345fe979a71bef25e6f3582bef5bf2a1f0a1f09d70ea537b3e3cd5f7793c50ad13ea23e1fb3e4fe5a16adecb0a5e4ceaf3525e0f2341bea155cccbe7d15832abcf9bc16379dee9f3505e13ef84efc867c217f3adbe9477f23eeff360de095fccb74279a7d4c9f38c7827afc67bf1643ccf43e2a1f0c19c561e0be57d9e07f33c95081f081eeaf35228efc817e39d3e14bcd3e9fb501fca3bf27d5e091f8cf7e2b1509fe77930ef840f6675f2502c94e77946dc03e2022bc9e9859477f25e3c1410efe50516634310143c1550def7a9bed57bad1072629a78dee77d9ee7ddf4aac9ae81074f0e1a6cd04e43147070a161e60d1a48992c58009415b8d14a3326e8a4283ef049538d468a228c279066acd10c515891e3680e59f2240a1472d0649a9073240a203847660f2d8cac80c70a466660bc222bf0ec2832eb9280227e4783333a50b89961f1bddcb0c2be3cc78517b6bce24861e63229f8083f7a0b00aaf42c65443bea87ee5377b78ecc661959caba3ba755f89c4dfa6a8b72dcc7efdfb21de2491c676aa322cdd6f6b6e86e14ba95021b364ac3c995b59b960216dd8d4349055ff0c919e2afbd18d2e6911e2345880ce1d9d1c9a1d27dd44ae1085f70e629ca78f838053959a009458026d413950beead76d043cb8aa6544a66d582097a4045a1831a41860a2d540368423d791101c604203f34bdd080aae184424c56c9b084583d2a9813122030290e34b1c06802814a0f2f464e4fe04046054da92e4d29991246d02493692cd0f402a4c7b74292c24921a12584181294f0013544938f191f33a71b170e0b88ab8b0fa917583dab24271fa7242c2a9a4e443a382a18d5164da7185509a8578ccec943c9a05e3042a9175634a84a50c1a8acc8802003c20b90171156349cecf04155c2a90b1f526734b160059573190b27a060323e542e9477ba3901a18e6446507d2b29ab20aba254083d3c55cc298592399d4edf6975629d5e604c409d5650563f7c1cc1b856aa95775aa186a070501e8b8453901e5e524869d1d4638b1e5c2a541056900f2815f84023f3ee72070c4ac0c607b8a07146694b32a208263f302831626b1c36c011d2f2c15ad9508351519734d600410a44e42ca1c4922654400235ccb840041870050ed84212652602df1ddc408e3644b006190fe061871ba8d430c5a82806a114501841843028c0030316b0830eb2134cb035851e2a48c1955c53973b7ac0032a368c20828b04669481810b4400025e10510001c86ea0418a51d1901a6994e1810a2cd1e4042650c30c322e60012ba81002881f6e2007094470010b84d1802c4d2f0e3171f190c3056fa8000d322830812f146004015e94dd40c50629434c90c06c5c3cd448038d2710604496176f90614888099276c11b6aa4b181322830812fbc50c01105c8524586212548604686e8d8fc70a1ba8b0bde48c106d028830c0a4cc00b051c61440108908505b22a5460c001eba0e389131f3d50604211430831454a8e14041062c7c4c54b97d31d9f1d293abe1fb0b44065f129e00bdd33b891c47577aebf24521b05a88e1d743d38aa83ac435687943a64a803491d44ba5b1c6d133ae4e8592ec919143a0ed05fad0d5f427420d161d36da38e69aeaf1086838371702e642a6b7528366f198be5c2294042747b031040b7a7a5db0b401040747b59bc1f3c1f7af87a3044778fa0bbbd1ee4d0ed8d208e184820011d197474f747a34aec0d5a60001974f7890612490b1180d02507dd8dc2420a051c0180026718e96e0f86236c302a42004f84d1dd9e103348c1e6a69268d1dddf132630b840082142f4a0bb4f2110c1c5064a2c110608ba5bd5c401e6f0d680ddb1a4bbbf377660440e7528d10223dd8d42c06cc5c48d035654d0ddde1ab41d32a810e00a0aba6fc4fa19bf4ef623699f9cb79c2011389be19aa75869cd6df62a339c34b3c15fb33c67fedc5f0b0426cdfe5a20f0c10729191bc70904e692ac74f62f649566642eff6bb65629f8b59753327674cb369b65b2ffdaee8e99a9a464ecc36a8bc0bf2981b39af58fc1664792c9c06b6baecb232d6913c8efe79a92f836db54027f473f4773eedada7d12533c9b61fcf596d81f3773a5a54d17bddef9a3b5e4e3ec52a5f696ff9d29dfbf399c36e7b19caf7ae4b714df8e6eb3e77236fc3be42f3cd25973cf25e9629de358d65ef45d9d5e2db602fe9dcd7ce6a177b14e9aebccb8d2e918cf66404ec9d8bc650c9cb7b4187ff8d5878e622ecb76c4a0f8b8c47996f9b51be72d637e6d4d04331da7e8949c3e9b615cf837200cdaecbb3b9740210731c55f272563528c404a4ebf8fbb5627abd52c88c333d76a490e5272ee1ee72fb86e5e3ae2dde3643630a423ad245d74264f624049d586480e629ff5d4723973918e4f13ffc149975c7c6c49a6f7dde31e8fe3b4353bfd730c2efe631d5c0006171614b960143f97994a71410dae3a5b9dbcd1463759a1641ad2916462f286132d0ee1584849ab943fe92abda1d4229d47e32ffd13d22abd11024ed2d9718cb5408716e0d0021bbe20ceb5cf0224ba618ef124f1056f7221134e2e64c2b1556a9b19e3fbf4de49cbc10a5cb00211ac200cfc34df27ed25fde5307f390cbf1c0624e5715369055b3a174ec94c4ce62da7add5a1a41578e3236ee8c049b3d01d4547419b793b24de12cfc60d960e987393adbd374f6ff666284fe655a132c58629354ca1618a142f0aca8b11010ada40c19802b2bbc1b0c8611e946e4fa9db4beaf69030cde1604c73287880d02b05794ab0ec98744b65c6f70a696b0e6785de6cb51743daac81862952a240514a429ae1a888e88913199ac420c42408e8278603debcbabce0824d4d972e5dbad4da18b299dcddd0003378476da0bafb8d3ec119b31340514477635b5fe50978206733c7347782a4130475bf1c76d46d6482319a0c1a28f18cbc0c48a003de073c2e25b040b74d4dab045794404bb72771077f14a9ac5abfb66654022a58bc5367841025f0ee243642d00de279f35c27bd18681c2750ae9f144e618309112926ce1f367cbac16bef659a44609519990ba7cc6c78b156b3372fce9b7d377136272747a7c6adbd0139f821cdb6e6d2e6b7f96ee6e8ace1af338f658e629affd71e4f9acdb3868980a6b8ad52fa37290e863437eb4eb437571be21a73107ba65347fdcb9bada5f9ef32bd9978865e2975245fade7e995fab5350789f0102152c456d7d96b739c2ba538389bf90c67349b75d6bf657fbdd5e52107ad673c47172bb5559ab3e1d3bc662bf59b6aebfd719c39fcfa3c6fee2f59b14e9dadb83b73b7b03ecda3d823181325a32207adffb5b5bf33f1676ea71db3c5bbc7dd271d8b23a99b9193a89671a5b3718c39080213ba1bc907d8e86e1b36fac0169e0d1a975690ccf0032f2e73f42d6b8e0489f85c38c0e50bd05629124c9d4b96aab31557a17079828bb898d0158a1a34107f14ebbcd59266c71f35b668507c248fb397e6b9f93763a76ae46e87898fa1388881a678fd3e8564a43a0d1df40c0c752efdf848b3fcb634c2b8a9141643d15011524c4a1a4374f7db2659f334c8eea434a074f7db2639d3f2401d444053dc7734dfdd5fa2e38b8f0ba99207b874dbd4e06c2e646aa1c656692e646ad06fe17cafd6a13888c5afd979e9241d9c7dcd6951ecd1381fd7e8fd25b7591ceda5aff35cd2f0744b75d85f9733bd7fbd529f8e7fe97e9277e04737e6c14062b53f43d9bbe264034b747380ec2ec9f937876d400e7c0b3fe76c08e2e0c03099f3cdf375d291887fdf66a337dff29728ae5f7bd1e7065240c6190ebbc159fbf35868d2519252f84b30d8ee71dd5e111a1be8eef15d2706ffdac4dd1e11cf87f5cb2b8f7d767b4f76fcb1503c9265f6398306abf105ef93e3df64f76598e2af6ff39c80e25f711077adce6d766cc56df6fbf88c2cbadb61454649329c5a67b8c3de66df7577ac5b634c61c618dd30cc66665ea9dbaabd3af7177e3a91ca98195d343893553b7b0cb2c00c1066def086bc26dd1d639a44309812c63fe6c7651401beadda6a1b9ab79cb79c65d0508691ee0e6b79b3bf32a66366fa4a061bde16329898653b2601cdec7d2c16d3a55ba61ece800ef396f386cc854c99e96f32d3cbe62de718565a1ad881065cd020c5f46fb9f6a2db9a5f74dd17791545402147b7178327d428221ac5440668d093a303e6803a37d5622bb217efe3c7e3fcf28e63396f39e72de74d068674b75f0b84132cd0c1c0186d81271528228c3bbac36b65b9fe52aebf846522b5516030986b89a0e4c229642e9cf249d792b999f1e7a8928fbf92925c2b34d2e6384e20180c46865f94d517457a935172ca480c83d5c6c730984f48475a79449231ab0483ade078fabc652cc9bce514af0d311569e52d53dbfd9ca92ebf6de6a8cf7d5ba535196923473a73cf446f9e39daebc669fb7137471253f14a4ef4b9e1d924575659ab014bba416fc048925e6cb9d3c59617b7f71b2f6a402fba0b30bc8b29f4662fd9c52d33b6370688d10d8abb11535bc4002d0ca00c0002d6f2bacd23d561ea47b63b47a7d991e6988e0b3883b4551a5b005383b5bc4e47922cf10264e806dd16c92113eb6399154b2ec01065399cf5b9d032f314f3632ea474cb3e971317fe2df419a7ccda64a24f9379274993898fcb2df21628f48ef6faaff98ca47956b3fe9afdd766fe5f8bfdd764e3a4f94ef2c7ff9af8199756c4f95ff3f9171afaafc9aaa598a49969e6c46a69baaf5a900d569969b1440b2059c021cb028cb62396655144ae54f64bf3c72c66f971163978cab25881556632519c32b15a1a15472b538016afd3773405dcac1557c092560010dd1761214763c10516531acc8fb18378f7b81dc642ac58b0babb6357c011bba20b5cafd0d2e01553fa8a9acebf8b62c51c0ddeacb062092b96fcb582f54faae8229ce48ff4a6739d1dabb889d5d27c17565a54454f152d2ad8682abae8fb752c97ea90572a9aa8c8196779e5c529d8e83c452ad619663b62c74270934eb1a5a7207b8a256095d9142d592e6492a28d96ddf0bc49b104e8d8673d22426ae23526c5ada500d218675a6d9893a2a0418337a5289aa2c86970a6fb3af3f16f8eb7c801ceec4d37a39558ac5bced82245835566b2c759527c5ccab61cb56d925bdca1100397353ebb7626be786788a90885134450f8008538daea949c0968a397ee63ffb2d25c6d7dcfb6260087042cb9f9eb3bda6ee63e47739e3ec34cc53a27593e310758e9b43d31c6134b3cf1f30490ee066d95ee6efe5b3afea5f1716e69b42ff13fd7796769f36ceb2d2c936ae9bb91de792d99fbec983ae1c69735c7d49d78806d1e3d169a048329bd6d926f9ba4134756e6040856995da6af444b7fc9c742f1dbe69158dfc7274911bea5a5dd6cf4ab6c27cebf3e3e8f8526f9ebb1d024727e93243b3c506cae43feea29c9f9b78ce7f8586852fea426ce689008684a13553491bbab50f15713549a4852858a8bd46da00212014dc9f57396080653d2d9da84abfbb1add27164a20b50fc9189a6069938ea2e6d4cb4aafd9cc5b125b8e8eca8535a624b836ef3d7e66a7cf7758929b6c696f0719c404a9cd1ddadc49606aff51d25254870e6a9444febbe96841bee988ed5a8bb8d742b892d0dda4a94c46d544a024883bba9bb2fd6d246f1effce5b6e80c9a6721b5d299ab6d1d0087dddfb223b92f5eeb7f53c24faf95f9f8f82825b956288fe30c916003092cba658f04938e0c0927348f654e86a74f925ca9253f4795eadf743eb1712ed94b92f3da4a67ce004918e0e896f3a4374ff2af01fa6fed082e383c8fd832ef0e4fdd1153ba1bbca195f8889e16e711acbf3123ce18b1115afc25be114bbaf1384eaff17c6dcc0837c2a75b4580d10dfad7e9f89661688bd80216c1143454c494eeb645ad229634a6fe2f5444ff8d0830bafbda9c08e4202622620bd38b4c8868cacd4ac4ac418c692526a207fb7db11201a41bf4bf2915600edfe1429a0bc04677834a055800587596ded0ca24dd579f9967900f8681c17cee91e309832925f9afc998668e56621f9b996790bf6a6825b6fd2500160468eaceb4bc4280a36e02d450597e4c00165865f65f93e5c743b8d1600c5104adc4b2fc7888db9589e2bcf3c77008200d5699c9c60feb0ce5a87f85e00256998953082c682596fd9215028bccd6ead02edb5aa53e986912f9cbc627890cfebaf3fe609b585a11c7a742e21016c7a7b5ff9acd398b65ffb736802d3d8026507cddbce501cc40b1350020a0cdb57469de9e86694e0070e44a7302e8a21b1480961dcdf3c7047024809cee6e26ddd2e246c64f6ba6162db41761ddd2b2a4db662d3e022006b6a3e7d27ab555fa0a62e23a3b3ecd7349c3f6a60bc0d8a048a3e2dfd05fb399ef682ee2a91b67b64aad00a81004177297b158c56ac3c71e041641dc409bbfb51a0f0248833640c0413b0304020b507c3c754030758333212cffb70644939bbfe40f10de3fad2c6efc588a7f0bf192c7b274d1dd2d8eb68938da5b96a6066df4e6b628599a748333cc3489664cef62cd7a96177d9c34d7b7d97576fc81cb38529cce71947e20629c3853919657e8e8ffb726d37df581c1947c9492d48c9ed89bee8716f6010e1fc0e81ea78cfcc7f9a0a5bb65a50f533acf1765321f721aac32f361d560959938749fd68670a17d22d25c4b9b9b17dbe658fbbfb5fa58ecadf5e0437b119dd207c3604a788e3364b23f72dc32d53571c1a2a96989be28c3b369ca384ed92dcc93d694339b8286c4221ed8d83d0e8907304027e90db77868c254b4452d1e5ebd7b9c7f9e34b418cf1c752c2453b7d85fbf44c7c7be7b2778f74e6030a59ab597dc618eeece8f77f84077ef1e271ba792120ca624dba149397bd186b0d90e40babb7590a3bbfba65aaf463a7069af311db008633a6821a72ed6d2e10928fe38ce1ce6c8cdea7f53ca618bed96a4db2a7d9ae7ecad6fef63b9a9ad1c943e536c6faaad2fd290964938f4a0854318dd0dceaccfae059ab92da44cc27933d3bbcd8ec3017060d2dde0dff2c5d7d9719ce1933ebbc7edde0913adbdcfee9de43e53bc7b1cadc458dc68b0ca0cbf6d923272fe4d961f6301a3b114d1586660951996e5d2e6c7589634586586a525c3dd99fb7b42b77670ec34d060951913adfd2565e348714c72fda5f751226d7e3c6f334ff1c36a2bceb5b440b547c2775e261f565b048329f9d8f86b87a7acd1cd2bde32d5c932b572ff5a2b53ac1427ab5337cefcb63bf3e766bd8f0bed280e15e1aed5e5af32bc688168bb49746da53999acd29cccd62a95e5c229b656877e2c459b132b7542eeb20c33cd1cd3cc31f99156daa0719c61c63627cb5326f44bd4762dbd2fd6c7438a944c33970b99f2e3429a654c33e7532de5594a920ba7c0603b4b622ec91b9e4119bf8d8a3e4dee8bf36f557678aae4ec38929ed20631b6f4d2b970cab5f7be110c96f1e739c260b990e97336cca51d6799c389ff6b3e36354972e1145ba5bb49fac87aca5c3845a4327148a4b28c6d5884c84e931b9eb7accb6e2ba6fe77267bdccc33dccc3b71b6f01862fd16ae02536910e3d2316933ce53ca8de32ed197a9c15c1fc7aec0d1ddf7e9fdf2ca952fba413c75d36b9649eb4abe820207481c5a648d5da341f1c5ff4ab397744cbdde5fb2362207c791ea76238d626c49ff5bc6a5bd6fab53b4c9a5b5d9afa59714e75f5ba55e534bc714dc8db8b474e92f79a45bb6c9ba50d918cbfc36b1cc9539ca34ef63ea758a5a949ba3c15cda7cadbff20ce94896a24f9aa9bfee2f7db5553a9fe6bb39fd16e699cb6db199e5c22962fda4d9e79aada9f7758eff857237f173748e61ae66228d2f1897a0b9fed2fd5cd61940bb3a89ac556a27a87c3366c474b545d95a2451379160325991d15012129328322631c4908c94926432d897573e2357193dcd0469e619646b75e883418185621afe1b90914a630c1f7ca631d7184cbd42630c13bc267ce8e16b9a8107011e76d0e1cb0187263450d31a68fcddddf2bc9f42f397dcd1a460c1d703035cba7eb9d18501a6b6550782815707f51c7d3231b0687fd9a22f63f976f0cc9872811edcdab0cb0252e0c279959ac41a062e0b80d0ae0ac8ba1bd7f222c13ece34734261bcd1ab309cf05e5c611069ec9364473b0271b599be461ac5f5f1b53aaf8fed2df45b5a1a1cc4b8ccf34e929c2eb870a76efaff8896de27fdebd08e366925f66ac9d2675fde3c739b1f895626892f8a31a0fc4912b801c30e30b878547cb8eef63e8a6925c6b64a5f35a62207734c93c8f1df2741bf41432ea4466925febcfb01ef9321c5f3c77e698033b7a14db534db9c8f34ace56e7c1c1d6bdc463de397520c0bc9f38533ddd1d04a4c33de274bec076862813b31ba99622445c9c13ce441d70ad1caa46c8b985efc251a4391f82f442b8bf4688078c353840600e9eee92e84171d680378314433e1c513507c047431c72fd12e3640cebfc1725d4061801b0ce0d2f7c5f94df2b544b8f06f400b1841f7028816c0a4dbb958417e2cd2c7b4126fd1460ba951f259e96eefa33e59b8d1bd1b9572c899718e662d7ab458418b15ba1d960512edca0248027c9c9ca14cf79549942972e8fec2af7eb35546dc304595436bd4c7aaaa016dd55e9d7fce2639886925be8575de1fd5153f4e28f49046e9c056e9cc37bbbf196b7524da2a43f727ebfe6ef8aa747f548cb6b8c284595ff75058e146a563a551bc0958e144b7154ae097318f8a12239d372319a7cdd53a2d57ded0a7e3176d95d95ca9ccf3c19b001eeb9dfe4b9676edd08bb6e827e8e955aa1406a3e5ca0b44c548e72c97b999f8bf24e47554e46e4bc5a9613071a4b710d6fdd9d0fdd5d03d3a3aa0ce4df84b3c74a450814d4dfd5149121769ee9bf2197d52c29042065ff0c3fa18bf2ccaa7d4fd25757f48dddf0cdddfd167d40b704551b66d0b9732d78d32c3a606673d071b99bf704d0b39f80bd7ec1e27dbd1643250a54489df324469a184ce3bc9d4100eebdffc3575291a2872ba5335b812e04677db9aca494012dd494131a128e04c96fd3fc96bd669a1c71cd320ff5bb679eae6adbce98e88a0e4df79ae187410878e2776b1ce69c79b38afe7c6bf393bdde2196803df5f2fa53a1dac4dcf8f33bd653acefbb9bf9134e7332c457babcc66367cce26cd1cd31a83c1ef4b71f0e9cdf6c12ab3990d357b535e09b1d57dadc224c80808261bc7d7c16024b6a18a0dfeb7d7f9cb6faccdf12f515bccc1c7b9d2a9fb8ac97f5c9519ceda2698ded06cb6d9ff4ef15a9dcf5ca758ff898bd556e92ddb2231dba258b645bb1ff18f301145743f171fd1f7a4db81f44ca52ea4fbeb52805c77e39c6208c0463be96ed62743ae9febee16ae5d04f0a521de00714643b0d18db3ae21a674eb8608ea6e971063e87046778b33cfa0fa4f704871a5a31432779b04e9bee897680e671dc2bb7722ea6cd18f24bd4af82863fae4457aef2f1991b9704a66faa29ccdb80412efd49150f0a541e2dbee1f85b5b4b5c6329e4f922a94a17166abb4c303c52ac5ec980494b16d82875eb440f993441a8483c8dc6d0264a3d815000074e3a7738747f4fb249e3fe00ecfee71331b9b574dcdbee04366e314a7d7398eb33e6975f689659a44b66aaf149b6d511dba2f5ea3a4225b243e111ec71fb8f881061988c771d24abc2347d1e6faabb63265a50fabad321494ee6ed2ae1e907aa0400f4d789e6ef3e5ee71353dc0b4e7c9f4b5bda6a6130478e8b15229ce19e1e1d1a178879b543c18c1430f3bd4a0fb65328785496fbb4c4a3acce1ca21c8a543530e2fc053862ff8c38517fa870b34fdc3851ffdc3059917150e72dcda854353503b0c07563b0ccb1a0e73c2615844876179753b6c57473b6c7746b7c3764538ccb553da3d6ee70e93b998de60eac2619889c96178b68b49a6bb756c384c6c976e74e986386c89cbd212bd24763b6ca95de512ddde0aca972b8f01ee32997b7c3f7f6e5698387fc6b1f4e488e3d3f972f07fed97a80de703d978729765dfcdf7fa5ef85cb0a9f98478df020b2ba84033f3b997822f850f05ea44b7add5a17fa17f217c9f9272747fb536728c8689bfc3329f900720996c803cdb5ae341641398adc2c4275b364a8389efb2371bc44677df582fba1d360391db2c7e0e067359172c0a15070d3ab6e19cbfea93ee4ac5f993eb406e0294c9616f9b4718e3a749f9b14cfc8ce7133cce3c836a46985626e1dd3bc94c5f74bfea8c76ef44e85f28085f2b5433aa190969d7d8a4551881e074d0edaf92068361205ba5184a7707b50b97040e071c897bd2ed305bab432e9ccc7c310d979521ddb714436ab34f1860c5a3306887512dd876a7032895eec6a27ba6a7b88d60469c3b3513d4d438cde0aa2975cf663098eb91f84edddfd7c5f5495c22f979dd5f7b53b8c2b02d05b1cd24a523999bb39948e64a9ae7b7d924076724cd168f375c22b179c191dca723f942ee82bfe0ff35598d2b71926659fe11890d49734d38ce50a6c43dff78ad90e3e0f82be3f2ce663307499a69feb22169aef19bdd78e74873b5bc37b9da3b9b799d9ff33ce420ae96dafe7aad96a4d9e7cc34fb5f9b2dcd667ea9b53424cd972ed178389b3dfd9ac71c5f301732c9786420b4bd426f9b474c8ec0dd38c30f83e1d2ee76e353db8fa20dad71a524a649048abf7b8d33a437af7f3fac460ed6199636b866f1cc18ac32ab19d5679a44331b7c47c3733762c7749c742ecd4b4b6b6d1ef31c7ddbb45937dda6e6088ad2912d7adb3cb245ae1ab0a896d6d0442b0ea98625ddad9b89f39b24cd6a90196ff8af100d26e816612e1a72e806df66d7943a5c53e0285aa2db6153d6687168ca969e34ca94b17bca911d1e31a9a7c4743b6c89e659846317c4c15260c8f882d586b2284d4469ea769858290e97f7c93209c7da88674617265186e4627041a14177673be2eeeef1a45d508ac017c4597b93e112d7c7d586d6b31de7df5a7733ddd1dd49250c1652f12b14250c283da9aea439789670c28bede86e567b752415190d29011541914136254674d31ed210d211725e9d6b8630c879756ef30c55b4f8781ee17fa10a056986914e21a224a0c78f9b4a8fef8ba20d7f277ed14e9cf59362467674771b75a01b8bf571d1134a43408fa1d421b1965628db225c689fe427cab608ff0b25659d7d924ba36c2bcd1689f367fe3cd28f349aef078db459a10889f593a03cd1413f19c1132edd1d820c2bfcd76e2194a13adc15c3175cb886baa85376c310d29093212430ec2f2b3669a349089a9061812611e8762691defcd7fcf5727ff9cb659f6d753581920b996e5c318c9e1c4431b88480741c9e0d6ad0edd1e073b37a33e8f6641083dcedc1e14100ffd76050a7ee97a8addb7b810bdee8f65a308e33648158294eecf6be71f656d0f7a91bdd9e0ababd14747b28587201b15c3f58743fbdb9862e254ddd5e1b27304109d820417b59d87b999433e8ec93cf33a866944b23d1da187ea44d3a8ffe856cad0e554bb33834e9f8a225c2ff42f9937ea4cdcfb60817da277fed38f1fd255aa130a9b7fc819244e6e81c8198682c7fd26df2494948bbf2a7491e626282f44177fe08340265f2c33086549f3402d27d1199bb4d62e22b8de304e25982c172e1149e283b5172e114256e281141e742a69c9d1d1edd441287985eac13e3bfa2186bd70e28d0ae1d50d1ae1d0c31c28f2fd63f3e11fa87e746fff024d03f3c28fa87c743fff06afdc3c3e91f5e8ffed13ee8ee992225749330d35d88f4839206f8d88ea13365fca58d8ad5864e5a2be50506a4bd0bbdc08058576b3ece4943150f58daf4dd1cdb531a4df84ac881f7f2803c3a3c150a36b083826eaf034c5c2f0c98c1810d7473008d33ba9fc4948a8c6a1842326ae233222845322631c492929810c9829062528ea0c8a6c48866b636a0e78a6ecf8c0bf488ddddddaa76f500f520e931c1667f39ece5301d74b791365c46ce6887d99bce5f46aa68fca2e7d21a593232bb1d96e74de72f599d21feafd9b88c946084e52a5287c37ce66498bac36a7f650efbaf1569a31d86648484c4c467666680b4ab881245922892435fd90bc761b5bf38b81cc95b62d94b56648a2b51a264c81c45bcbb89d080c80a5c44c268d9381d9699fee5305ba5955ea52b2e174422b9ee19257cc1cfe414a76c173a6c081c0e1b7201d7102f8658e11a92c5a6c64187cd544bff4796a9f8b25cc8c433031e3778d870582873d86bea80ab31b9788c74db8a2f98995ef6793ebd79678976d867ea95d1ed91d1ed8dd1ed692003dd1e06ba3d31ba1b75816eaf024e747b6174774fb7f7e09dd7d65e2f2f2f2f3075feecf2a5a20dffce4cafce630070e9d480f80625c00b0a40608a9c125f303f0e7e9bf8f605a65a8be7787fc9c86bacbd1e170e12f882627d5c3869b91b174e7fe902977814b8710314c5e9e28fb11b305c37437437f8619d37f76fa2b86e9e74b7fbcd911b13dcc71dc6c4444926c260af1fba3ba65d2fa6ee5cc8f4a2d2f88238301886bd0046b71d2210d70badeec671b970816e50a4e53e0fe56caef3762493390c5f3087a72e9cb51b9d19a41974bc2f3a80033756e0b231410a2baa88228a6e8f8a6e6f8a6e4f8a6e2f0a7c411c3c92392ca407876171a8568770494862b53f62b53f40ba2f0ad27d9128be28c6745f04eec6cf938a9fcb51dfcd1c5f1b8acf44851cac32b341a4410eeef07ce2a0f8bb31d70fffe61d2dc4d32bc5f49798beccf9d36618cf1cc436e2bf7699d63297b3618df8d5de27fd15e2a1fcb63b95c46a75f689b54a397b859032a64facd250b645d916655b847fa4511b1d99e85ec85a25241a17b041c3816e178d4e77afd02e1a1e9d849b2f05ac5977d7cc015c3363b70a9ea77bee319eb624dd4d45e6f2361a5f50f6f466a5fa58ec15121f8af82f561ae2471a12917e8892a420552862fe8ced938ccb20f17556ac4c5c29c0d1ae142ad043ae1414d0dd18ac4f982611582df55afd99af36d35bdaa559f3e9b5f1b10d72d8573a7acee66c7f1ca47ecbfcb6ddcce1d2ee861c4cb241eed3c9d2eb931686c3f4ded2ee3c4fb7d8ad787fe975b68983e2cbfe96e1e34a675e67f8b2f7b1b80bbb719c7f5df0d2eebc36e43346484c6af0a25813254762a2146382148333f971a52428440ed627ad78dac08ce790838bef4a7c3c871cdca6c6dec7f2b766bdc841f1454bc298963372123d2e67bb3b5fa4d856ed387d3673fcc2b59acdfd38389b9596069fcd66ae83fbcc33c85fa2bf92e4e82d899c446f9b4adcdd71f06b6b3098bbadb3d98c89abe036e726d38b399c2f5aaf5910675a4b1f0106ddeda45d2338d1dda010210e13a9ec856b7f7d572791b54af383926c95d2a6589f64625287909eb8449003ef1ee712610c70f7b8177c260e3db953dabd93dde3a6d7ec9c553bcb6fbb85773ef6dd9d95d230bde974d833f9b85ff21f722ce4319622d21b0d69ce561bfe785facb808efde892ddabd1331481c8ad92217004290ed75016085eef620184c26131f49fc71a44e745ff4a2054a72fdf820edfaa18489cb0547771ff510494a02690de7e08e46a88708c634de432429c9c5cfa2105a1088679ea2cdb56c92f1a5e5253de317475be3e43f2ee70ee2423b8218d6823b782367fff7961ddb5aad51b7a9f1c7e3147270b6c353ce669ea7a8349bcdaecd490e666c475cdeb2db6ac3d958adce6b7466c3f4621d7af92825b956a86676c37f3f7fcd31a675de427ab3e3b7d55ffa918ee14dbed9e8e838a419d39092b1245fb3b3c67dda2a25c949e4331fa52438f7b75cb3374cf6c7c19b4a7d46b14763ad527f4c7543ee168fd35f0e5a0767b324076db0905c8d3b88c949f4b2d9ecb924c769832bad71ec60d0d09d63198a3f8e13c8deafa1da22a0a06a43ab346495b0f85f14257c32e973b3287c3229c5833b5870cb4deca22d82c3b50201191a70adba70ada670ad9c70ad0ce05aede05ae5e0e56ed2ba0d0b35386ec382fb8b058791d65f2cd4b8c3fc85bd8a6b35e45ae138cca66692f6e6fab27973a5303a5caa333e6f0b14a72e58b854526c0e5f3097b3218ea772a56e78fee8795610ecc04177a3d0ae944e8358e642e9d0607eec36e3d25fb3fbb65927d1cc77b46b6dd10a66f0ee7115f09648801aa7253923b883c7f5e9a0672a759dc74baeaf04ae4f747d4a0da372a9542a352a342a54a8d050b18135d32c5015e36a17743756aaa20dd025073738e3386517a4ddb104d313dd8dd39d6221a9c7a8b4302926c21e069942cecc80400000003311002040281a0fc70332c994b84e570f14800274b868964e9b8ab3248929859421c40010800100100010990903a026056c24c73aa8ebe0c067b5dc16621b892e1d6fb1e8b65ce1398559feda0c8ad9b043e018c43b63051c7ff4cbdb8ffdf665e4f8e23bac1b81fe2b27a497493ba5985fda3c590fda30f5dd7b15ab7f3ebae3b18be314d07c23270ebb33f36d2081740514cc931981d79b77653ad2d83ff839a9d842ec8ca03c11e618d4f380181da273149cf5846530f88fb6f235dad86ee6f6aafd3fadf26a8383d46bb51043b8c810077ab7bdd8f30449e139e48a97f1c2fc26a9cfa36d06db4fe6213aa79b2d32b9ea8e06a4144d1ab0867dbb3b4dbf692385feeb2da4e5721c6da25f5da9705c33d82e6a6fff650e455e908e58fa95ba963373a825ffc07b06fb0bfcfbdca125cb08eabf0be8266ecd52af3cfe34786a73488b5c2528883319ba7630296af345ea60e1596f315e9cc727f5c478c799a162621a6fa788a9e16020e7ae3032174a1cd328751b9b9639b671a3d196b2be023de52c4aa008bd456a771dbb89a455fa45dfac3ac5bc4e6fbca6e11c3493af248aaafc54ccb76303fb88086f2a53225b88c3b96928393d0356a4bef2935cee47bf74ae934ff1d7600fe2eedcb11756184990d9d7c0401ed72e25411d6b78ecd000f0d94abd02f68bc284b2f7e424ddf64fbb25f6b84e491826529cd8ab274f181f175d3684ad2decdd0c0759015cc7560d2af6de9ffe51da534fe1381d50331f84e2749e5596dea5e6b6ba811309ba748d59fddb4b5c9f0e40b40bddfd7aafb206b489dc2d22342f05a15eccbc1d94dcfa2f97a3075e6d5c5a0cf938767c2b51f5fa7c47a7afc79f4062cb6cc2e18ccb056fbbe0d65769182ef88dfa928af57784277183ffcaf308493addbfe843afa41e70cc3248c63b33025c297a53a3d84d73e48da5ce9e463e3df81ee75c079756accc4ee02b834f61b7c4fe9d86952677e6c4d53c1932638571193e55a052c9a0634dc997bc02d4086c2fa2ac6b8d39cf4f45c9a348116c12c18d01a4b3c8852841dcf17bfc32c6392c3b5c60c61c6bb7f2722f5ba12445831f6547747e055cfaa08532dd10f482937d7cb90bc873bc64168e23d4566c32dba880f91af0a2fca8c0834ac07a56b648aa1ba10c74a412eb40ff0de8e49ad008ff681fd1d8743c22d6bdcfa42e254d4a9c39710791e2359a5a9ed04e79ce8470d547506e8e655ddc51d47023c18770e37164736e2465ec69f7bccba40d1db82980b097b739de34e9765ad6fc9d2c7340020faecf861d9213a3849a93e8ab01f1b02e09e92a7235511dd2d887522a923ec61bb4cb64600e8f210eb43ee557917f1ae400eb9853a4e5371b4e2106724b18f703d61eb6fdd8811f38802e909527bf0dbf98170ef7a1b293fc06336c4ab7ec0fdc1dfb2dd53892e295f4d37fd3df6422847312efc306aef687f624fb7e3fc44b45caab703afec59a65cf6cc35f5530c1990679a39f3cf392851958f2bdef997c048fa27cc361a95c9c8795a0904e9c870045eae5b1d8c0d7ff48e302993b3f6cccc3ee6ecb4bd39508c68fa9c99ac84d942d4f5ccdf75b8e81396a50ae952838efcf62593c6a524073bc25f6e87bab511d1097ba781dc4b233f88a3aa51af4f9302304606187fea29299f32d2b73de4984a852a5e5e7cae0c85ca6c6b7e1cc9581a4596e8658ddf616096f8fd248908130c42cd55c0688cf87c355e792808d542693c5369a0e5dfaee001ca8523e693a3350d38d8b1e35d24ac2a67357355dd4b47f6c9854e732d99e07cdccdb592f6cc5054187294e2bec78f5fe88c2084fc849101d80d4c79585c9a59c954b0d982dfd5cdd7156885d9b1b3183297773ffc3ab52d1be82faf66bc066fffcf9260bcf83935d807ac2bf8b3798f0776e6810ac9fd01ef47bf80b7004ddc6201b3ee26eda192b6e20317927dfc276c7c22bdecb740f1dceee20101343697c64d6477fcdd3435fd455cc33489b8040c64a3afd83c8df43b2d241238df5debee5768964044a40ac51858a1552aee76f3d381b2879a6a0ee63cfa410dcd7997d9ff2fe0d729901be8fad3124acb02b4ab8d10575767dd20cfdecf01fa4f51cc551fd4b0f6e08dc06fb8475f22d2ac17593d6576e96aef4f045908d57412332f04cff7e5cb6ff05ad63617a272be76b4c1405287ad30458f81f52bdda2ca083dd998a35f667710924a31922731d8790000f699875101bc4103923f08f54eacc017f152e7fe45153c83c118010904f6ee5d6f81ae59cac83ef050913cf014ff8d75cd8d7fd078a8327ba06d5466b74d64a521e77af05fc57539853f68ed40fa912043b985e0abde8a6ad079250510583caf626f78ddc3152f9f7e3e33faf7af79f17e9ef29196a040f2668c73faf61647675552cd5c599bf5b3338bfdec3299ee1bb7a4e7f79fe7d2c62e6d8923c85a3754aa8ee00652295010c7f0e2419fff0d564576b9e785eb1b37983867450d93c0027e9331b907a680c2f43ff23e21de25eb8de014a31a07eaf29cc24f54ce13771faa5c1b465637c5b2234da84b9e8ce8f7c2f29df9979ee0c7831b76e0637112c6078f078748691b5c949f2a597668af5ddc04303cb5143b4fbed0bebfc95d9be991ca90d7445e15acaa480cb5038b2c9745fd663246b5fe2b69d9de37f3a898bc23288b17d406b9159b99c6c4b3dc5e2bba12a3f8e84d259bf6c0efd6a0717e58032d1ba49fec9e3c7d6bc7ef73e3d8470cd0ce7fbb18da35c9f1058f635e5c87d63c502b0084ce7c1824d873fe36db30751637e8f1d73f0acb2a7fc505da49706c136849b1535374e8dff13651fa91ae19b76277aee68915acc02a7cab61868791f417aac8209d15c61595408afe2f2a4cf828223d98bc55c16e4caa5beac871d09b3cde1e1289cb6782aad0c5e66717039de01d41fabf179db5989ecb17c9a3be6fcdb723e5a6c429950c1d0997a9c674c89d36feb92de921e0df476aaf2d349e2ab87c0d041af691b96c9dd8f3b5cabf524f9bb0e5e19442a3df4672e7ba81ec831cc89af39b08635a1f717de3981ff9f4226bb8b904df6e47088ed86ef050ed30d25c09d943d3e3a5cbfc89d082f494cc29db1eacac8cdb8ad9dc5faaaf288dbbbfe717616e2d9cf667665bfc6bbb3fa116b698379a08583143a770a2770565351bf89c7df49ba6ce30ebfa6163bc6eb76665fd42b105c7c4e640a428d3d893da32f4489f372f09292dbbed4e5f1f1125513392fd01b4e0dd419823dc7509f94f8f1a3554d88cdd8e907342033d47b7d263092ad12e6d65a775ad0187c0c8114d09714c89136c3459591edb09f1dfda60ecd0d997b96e91eb8d0b74fe66179a73a8fae061b4ae7108bb3a3733d5ed76a2ac053988eafef7a25325c9d3f5d32bfab7d9e2d2e6587ea329139496c4a1ad61d00d5d0cc75d11a781d2e50cd1e888a8a5d038e04feea82d9bdd08de6f7e3d397af362d6a763a57060ca68a75b53323e38648e780ef09a2e73f9162383de6f691fbea5dc4245dc385db486c30451f01b6908dec89af913b60ed8c052b7a6e2fa645789e7237a1c03eeb54171302d247278a481b91173df0010584555d90367217aaa88325dac7f382c05668e2a212df34326415c665475f9ce7b0156767c2b20bcc32a412284c167ec781fa14dc6c2a929b7c3ffa58ccf1e3172a305ba6641d050fab5fb44d1a5005917f8a0ec6a080cf61fea868287c01759448353edab886088c3064d0e38b81b06b25e26c7fb64a14f3058e073e630e20967064ffc769ce0d08c398707a391b13145777d50ba125aed78de42eb7c65bc0b763b3301440415a3047872dbb9bfab5edbe3042ab04459f9db838896636e9856290e341d2c5d0b1b4f16d080d4ab888a8060a9be92d18b28f7f41bd9e056b63e7060c30d5802c3eddc4be893abcfb0ab64e4467f4b0a379fafbfcc9f1648fa5a4d8c9a12a79e889f54b118d65316d968cb7a9525807ab51f8c80661b85a99b8bdd98f023bf42d3ed766595af629fdc90e7249a797a9548c39c6aad966a5b41e35144c6e905d113ed5f40be06a048b0ea88ad124cc931df464f4898bed026c64b63ff4373e81e5b7eb9e4beaa6b16f3ed32a062b005bacca640d135b4fc9659acc61fe432ad668163bb12412eb8b6271a75da9124527f7735f9d8b0c70c8f50eecf952c2df603c9f7dfc94a104a4f579ee2b760aa512e4eff4fcddac58140efcdb30a719662cf917d1f3d72e9c8435c9e7ad98c85176e016a99c0054321cd72f39821571a595062b917723bf61d1443174e5091c31ca4a0d3ec26d6ebb5d5705c02884241bd92e7c1cbaf89ebf3223aa31876d30eb8694b749960aee1b54d3752760bd69d7adb36948bd8dbd13581a92c2e2daa48fa50e29908a11bfc051a4cd19d01299d1ff2a441db8129f4259c38b10aaed35eaec18fb5e9e338505455df8589fb1b8389c020e36442f52bf95ff20e67d8d49784261c5644702a528a9f7e95fc9f4a021ffd40758d36a9c762220841c80ebc05f33f056bf9bd83f5d3147b62c3adb3ab53633150f29b655bcfecc4828c42e73c4e97c3d8ef98d6613511596786413e5013e5bf5c6f15694a4b1ac9a3b28e552fba1c242c2e82db7ab08981666e477b50630b1e5c20beff611579c1bdf3d18b00f68604b227754966a42e614505ed2cb4244b1ff79759291fc6d9db6f0216eb973e9f6dea48919100e6161502a8c65293f57aee31e761576d1ec9e3e224fbaff73bab8555d88b68923b91af9cbf94fce076003f28e03c03184349a672108ba0d7e322fc9659ce8571c4044ede011e4a9f5b49cdaf2e384e876a1c0a4b004fc3e817fa589e48757a589721791ecc3d3f7b9bcc530a88672826bad026d5eb3f2d7201afadd36431a2bd83673924c6a68c3505c9ffb3339cd25a77cc3d647d8c6b5ac44f062b4fb5d1bd76e46e04381fa6c28f3ac8308ff1adfb319c754f48ca9518b6322f5e708c1372ea51386b7fd51d0feadc382758893599f49789cb9d054c5c50146fbd4933fe81bd4f7c2cbcd200684a0dfe0ef5d617fb07464383e40b735f1fba4583c77ccb8dddabefeb9d0c1b2ed77a92d776d71e40aceeee4b3f7c0a98178cfae7c4eaad7c08a9ef97b009d6fa3505adb7609cb31dc52c814897a6bf359a97741c0eaa91a4e2a874b5cf9eafd6f5f055f4d7e051bf1262c43182771528f8a0e63169377adea435036b8c9fffaae848a47ec1ff5820dedd2981a573588ea80e702f49011618c9fe28fb230d07fe73d43673d21228cf4c62716b7e08a5b9f0ffd44f2a9f5e7af3197216e21e927b8c2e9a881c6c3772cccfdde0a0b8dcef025663d6db91cbe2cc134a219b6e44fe961cefe01d2f750c0df5f82c3817d1a60fa0de54bce0b05369c78e8de796c7d6075cf13e63508ea3861fbf6b8d4d4f744339ff6cbbe0330051d77ff9e64555cf9a2b55e8173ec6fc26a7f60c913fcda28241ce76e53b6e85a0f611bdd1c85d208a388e85af6d32d9e42cf994a513fe21e90fd5446f607cd82da0ec8106526c734e72728dfccdd4e9a3426139167dcb445290c4903fa9e8676d399889e6e6cbf8deea66f7b6ab1a40f7048691486da3f01329222d4029440c7c75540e36188a901f32e4d10c575a3b879c122673c50c389a32b06208731f4763e944821ad5edcf00de058b1476d3234c00d0f18dd2833bf90b73fdcf490aae2f694238d64c82bcfb26d3b313e80141bb91c516339d7ccd1dacec01dc63e968a5400faa13994746ba8eb8d50149dee259354f27a280ff6c8c284483b12ae6dcc20ab0d9b9642c15862c9bbedcf9360764603da910ca730602d5bb34a82731c6747eaa005f1949e003cc37f7b45248d17bb15bb53a4fa08a657d0a52da3f9d1a2733105837471c69e2f26ef10bb6f80f794e1d6c9a5c045d2c21fd7e30205ddf506d14ba0fe939e88be5336954888d5b2c9fa7b96063e50e5f0bed8c0391e3a2892452d0ba2b6f5a1e38a3fd58426aaf5b80343580cfd9934d5d3ac2620d538bd3c2616dc11350d04a44db8e3bca1517fa83b2207dc36ed4ea796364a0602a485acfaa8e67b4ac4dd14183d1eeaf999591d17fa6f58f37cbc71acc13f239b69ee74e6cb6df10e6baa7d65610bec2ea47ceeadcbec61d3a3d5c99e2d1d8ab4a4ef528bb6a57d5f5ea10bfd9311ba43955b2ff82c16ea12232e508185e7aa18e4b1c5941c51eb05af458964b4208ab095726ddba72177024e08a1c1647b5a8d0276986f959538ac4f84621fadcc91a14d3c0a746432a35323a3cd43321cd2e185a29d3b216ad164157a6107239f164614a825bbac777ff03d8c75f03d56122b59fc85247c511c7b13688ef51740bc5fb3a695e2094d7d4ba4feae3f7550030f16126780e5382673afdfbbcb1cccc7f3271647821b192fea027f317100793af8a376dbb4718044f78ebdb003d43957e4840e3ce16dd9e3f350c8e1c6fd78c06d5bf70ddc6075d6f9844326e48de44f88f03ae6f437165201f1b20c351a286a5220e6cc3115902cf322897367df84a9be8bdd57a21edefe0c366ac095d947c924c722a16f0f96517d28682e1707901961e4365c1871dcd9feee87a268d0002cbca9ef3643d431c0e1e394f61bf8c554f3df1f59b04fbd025568334d585cdd24af04b607d05b166c52f8f55ee8277bebf7a0f5855e19e181adc2b1138ffa6bf352866fb6ed2b3f8efa3bff44b00f1e1e46f0aa80b7ed1082292ac69c19652c0933506d35c7fea001a43ef2670d7916d4b32f131e594ee1a2d98737e91f8a873783b92eed04e308c3fd006d9c00afa4b8eef8e32acec09042def02950b5fc2c69bf3fb600e2c32bbdfa20bdf96cbc82ff4e640fa280e76ab4be5f799ec77bf206c5ceb3028bc008dc799c546484ac101a32902b2274a69e9f1e395ec24f5c7c1dd316ace9cd09072a2a51032161145a5a150f7debb5e1dadd4ba01de5f7d830304f66701c60f276316e7f7a4f103bc441a84ff6bc416944ba1efa0b46cfeb6c252c9589180c52b4077e8a3d43bc997cbf544124b76752376a67f6a7127786632cd344b906c77ae79f2c86224ba6735d2b24e5d70394b344d3a520b222cddd421809ad126f39224718b3ed0dab28180d4cf714a8715b9c31e61fc0a0db4b968d699cdb9a9ba1d74d3e5a53abccdd5172e4ab4d21723febec99a6386f5865e12c20a0b41d2676dd8e0d3a975dfd345178c896ac777b1e5320f42cf09742ba8a1968ad7672b536e36d739b48cd10959f961ff333587e4d3c36f5660b1d113006f945d0f080bb3b58249d5714b99d78966774a8ea381c858ba8d60de70197cbc08c6b396f91238b5b53b508bafaf6f5b8cfc88f8def496445f6f21ee6e67162678ceb1ee946f17768f2cf317a78045b4e25e1a790c8d78144d5af80a9559bcbb4bf8235e45cc297c4db51c03ef61ff4ba997fa8788ebea322966590c226f7d5b07577aaba4c13fdf1552e1cf0e263d4870dc3167f9ab7b1a79469293b0e845a3f2a1ff4508c87dcf99f7f817d4baecd8d970f1fb62dbf76d30261c4617276c4363e1f2ce5feff01eee66a6a3c03f6a128d15b4c183310bd5caf9a123d8053293c7f26fb3ed77b5c844c26cdd5aff42f5830bde80a7efc4d7b33e58933b94b56f5edb6a88e6019a4e955d611a50b925fc911f57f54cb8045df996eead97ca22174cb6f6dcf225fa9b846810cc0c2ef8c6b0b0432d43551ea9e444853db1ab61eb4bada806a972868addbc0168bc6373c8a17390ef10013dcc26ea8d00f5edbe4324efefa5beb36d30d16f8b2e419e4cc6d9b96b46d24ad4aed3dec455c442863a452ac0377a6241afb6f05add841783d744cb4a2b0384cea6bb1f0470ec5558a6904932c2a630c7214b6cb4bcbf2f8fb0aefd64016dfeabc5af4e2b4d90d7978ace0a4988e898a993ff0b5c7925a9c9a143115267da57ea5ab69344cc3a72ee820e12359f3aaca32db184c5b4176e3c1aaeff9e5fbb84abe50a07e28e1800459a0946d635f3b84c656a2ef23af501f49a28258d65c0a37aa82c1193f5d1d68139201e9b66b777a0b09b2f88280abb0ae1b498400470ed614fd1c8bc82ba9aaf522b256545d6adf2f545534e9694913673b4618aa10754f3ad7b927a7f7e6a27a65e3000409d5246b5ab30b261271596f4a11fc86f69a306a2d8068db908d39720d1a27f60dc466cb3c1feed281d1fc1dcc1521d3d3d6576b3727d27813b7e9b54039ce0a997482adf67b928d6cf9c4b22ab1490ebd378d04579cbe8e7f0534f036bb12cb37c6ae2e7ac8c6ad5007d8f6a3f596d26417ce57bc524c8c0ca340d6dcbcb269c116962990e99fa3fab61c1174ac1d037b0507b40c9923851df2c821345c377c4f8c0bbf938b40debbe83b05b142ef2df8f9ad011dbb96dc0d2ba6443037f946d0288382f1a30b4b1f3719799f3564fe323ea563c28669a405bf9f40a45d471daf13e7261aff9aa84fa344c3abe5dcbb8ca30c8e4ca8708416393b24ba6b1e756391b7da5e31cc2121a667a8bd1f818db5ab34bcf584b162b58603972b408edd04f5148ad573a0bb761be6c88225d4d7c8abb98c0c0b8ae3801682576cb4a2da5704e7106b100eef6dccb2e279a54919f83de6f27b2b3168b3deda4753402364b7a8df7c42e44d7755989bcc396ff7dfdb44842280138fe8de7a56fc31be667d21abfa197bb86135a0704dcc2b8cce57709f6a0961a717516601033383733400c8afadd84359e99ca2c379c0dbff3044928611290a4be2742bec869e1160dd998a3f1ce078bb81795c77e04ff015b817ea8ce2fecf2d59443f389a7a3285be5f12d51cae860583290be3179b3e27a34af85d39ae14697570b5a0e68b9181f3cfc1a98a4195daa3fe1185f0f3d3a2b5fe024b831df4c51e204f3b5b0e6dd80ad0310a66b8493f2850825919d50b42d76cbb7d07c5af57e90a86435f142af2c9b89426771f043a56b9d2c6ba86f31a7f95029fede43bf7fb0b7a45115d0094b182bd904130209de3b66edd086fff994bb653a5d6079fa9eba7056721ddbf7dbe40600a0b427c44fee53e7bc7c6097af14ca349e121534a56ce4fe4d40fce39dddfb11d867b1c99e79a186681500dbb31bb98c52cc71f9c0bd3900c1a132b7e3d6dba5b5375ef2a3f9a556bd965e23c2c973b5a14ebd1df00d2a55a10d0f7c2b0675450eb2865ebe0743a00ba89ee1d718d87f15af0c7b9cd180678daef640bbd8cd4b69bba1a17c8fc24a3718a77b774f0fdcfe91b1c19d32d46e9618db01ef35a4f6bd2cfac94a194840c4cef9b7c70e45e793da65c4108b5fedc9cbee84f35a20e463e80be73f1d929e0fbade6695fde2ce5851fb649b2f1c44b82d57ec115d80f2405a2c8eace68e27d7ca91e736678e8eb570fd532120d7cc5f8f2b6deb9c1cadc91d57b33cf74b38a12840400c10f081c0110a0b8a084125b7cf810387d874bc2f0a0b68918d890a0b7bc8d2767839fa2963a98c333bbf4d636cd487cf52f4567b9f2e292ebdb0bcf6e945ee72f45de74a278873bd7bf2c229cdac7c13ae40c76f2d70f0a9fcbc1f2efd87ce849bcf48dfb560aef8c1617eedb1fc8cee42cb7ca4373dddbaf55523cdd1b390b3d4ddadfde0ee6be2a988ba6ac98301b8515fd969f7eac2d9865cdf2734d9b5d5d0b929e618cf0794295d1601aa3dca771b368507df922d3920cf23a31b115d472ca0fe837f475609d0ecf79c79e4d9d287538d9f33a9b9ca16698b304308768bb8ca0d8bbe7721a69f041513f609bef19e7c0cec32211e66398a43c2fd9c6c10d31fadcfeb8ce263dcd4be16c7ff00aed58f4cbdb4d86c2ca1366d5790e319118d209d51623dd4dcc8e5e79d4ce2b764dc49a81b21ddce616a3374cd91508e97e6490492a3d2ed4492810b99e894584c7ade51f10314297e6ccc03590383121841d93a76a5c073a3025a4f3d2e148065440b7313bebee06341ff6229d747ae67f3acd0dde100e94610b8d03582124fcaee5f373beec1d2671d8a71403a7f8eaa61fbd229aa4688f1bfd83cc9c6b24fdcde9ff147e4a6372bd52e909c8629c4e77924ef55500fbd4a15ded09539285f17b27bfd9a80f5724ca849cdeb0f8494632cdd46b74bb58b53bc4adad57a6d9af9fc04c439ec42c70b23da87f39e6ccdf33b385a1f28736e3bbb83df189909ad821a964b2e651ca8d12a63709335695f9e9b2f0e9f713471e2116269626d31a7f665dae985bff5c92d987bdc598d527a4f5f1ade7877fc39bf93b8b2833cca5872fe44e8ecf22008737f8925fb9cbfdf0d0f9d6cd0fabed79c7652e898c7116dd46eeb3acab963207c9a49f5757e5ad48cb1a8fc698791ab3bab3bee78b1c808f32718ed967213644205044049959dd11f37d7f598b169965895a1ca563458fc1659aa1b04d855b8610b64170f1605b0ba4c799ca0cee72c9355b22c9f0912e2ba2f596eed16f43e07cd1fcf5df7e129a69cbaff0d61ef3d37d848e42f105f77ad1969db8e468a605742b9141f581a4cb9e6695529b43046af29e26db633eac9074ae984816fb132e712b86bc936b5055b989cc32f01c7c2325648707c8e2407a5182334613aad23369a9066fc539df63fd19cdaffced02a5e935b3ab431977e7948790e184573d68c5cb293437241c40ab20854f96038bdceac70aafa14a41b823590e17e48b2803b0fe2dd1798a58ab60055df7b6b7dc18e203cc9a22c8ff456eaec2cdfa378abd41ccd33201fbbeec88164d84a27d09725397c0bd4d6689b02de3f4c5f6e95d6e187d09aff4a8ef7f1ce2852e680fb2a6e27421e7ac4b58f72854bc53c790c3aefe315448bdc5b2e783d2baf4a0f1acb7c956470b7bf10301dca9d5ad2c868f10ab75a0a97094594ac617c8225eaf3cd61428772d71edb87035edf6f741dad3caed48290307cda31f1fc5c09017a9270d5a399570d362222f38afda2fecee5a6838ce126217bcf6b42b5debdff9777c3c26a13c77e9477450eab4fabe81fd699f09664a267c4d57d3d3ff9509bfacc4ade1c36184e14e056dd3c38feaa89b33054698ff3ea95df401e9fb83062ef148054b02d0e93e71643c3d9dd1a57339545e0738394d1e9bdf89a5aed4fd295518c15a272600288a7d12aff9a9ec6d52b23724dcce7c1c7ee56f78889d49c37c23f14b22e86e2ace876ee7e2bfe42ef9211863984fe37e86867943f21f02a55de4bc53c04b56f137d8e51c29afe505abf2eaf6870b40f71c3360fc496c851208e9b53f9a357bdc25be695ea0e14335f671de8db7aee24b0df9e8d2593295eb0661266d0eea9eec3e75693f561b4ef4047188aac62ab646b23b1e2bad429cbec141c63cde48df863fc727de5ec9b798fda598444dc99783a8fdb47b73dd7652c5fc653c8585b5afdbdbd4276ff9c705418dc4323ac23722a63d1a8f776efb8943b551b802a91f0700a9e95011b6f325756f5b31d97578de69be5b12569c2cf4257ba334301c97709c1a18e4b0befc268734b5f4103781851762c62c15e4e707efee6a47c23d3be5afa43e17760c3717731c2cc96f547e9676a05298f668357849f860f99feebb8fd2b86052079258fb9010661c59b49dda3295b3a0fa2022fdf71a4bd42546423a043870e35a541ead7c40f00aa6c1f9e005e9c630d6435f7eb15b6b8c5f05d2abcad031f69230b5b1eb61072bcf436071a7015ed18b7065597650cd8f8706bbb9cf773087ded67eb1fcadcd263ace89b4c8a9c08ad1b399d2ad69e520a8962c5c4c7d42f7fb89ef942a51029213648e87c6a99b93426d481e0ed33e54d880ddf9621ce1094d86e8b718030f9e2ac03cb9fcaf72ed414030ec2f4b8291aeb166d959c554841967681aa634d5a6d967f0ccce33bdeb39300ed7054b813cef29b452a0ef107590969bfd06c071a68e90313ff3dff54d84b80f803f402e7a48acc808fad213ba4e1b60003f0eff4093abcf5feab757807fc6092466a2fa62392f3133cfc1ab47096ccd145cbc33bf2c518843b755082b4099f42c088c5bb661101ccd2fca0ab54eaf73042d529572c46bab47ccb01ee7ac182ba62bbe2469f0a49d09e42c448853b0bf0906ea674a809d9f978c878c0d12536e5fd2f87bf35755e51645af8c2288edb1c21af7f2112652dd7d5aa8efda0d20301c366fe071bb3493f1a730a64c9a7c0abec91f762ae949237556a50938a37e87c55d82b3ae9a82ec91caf6d8991d49054259e26ac22db40b93dff968b97da17f6278e668f4832a836c30e50703cc570d6e4909a4f29a599ecdc2054a0c3eb72707400dfbb397a786a7f8ebe140d9a77f1af56469aa027c8cce4a603aa266e1387acb2439b2fc9c03b6a0fe328a9750f62c77ab1b104d580ff179c881392b434a9d97539b48d3f2ec5e8dcb973f1abf0ce9a0de5b60b8e2fc84ce9fa4af7f94fa02865fd9059ccc4e105567149b801b5feaccc0d65b6e09b55452ef8225420731ad380125d791577b586d96ccf4ecbc13dc4e2094f9f79d1d90cf51ccc22d4125495014224b01b0cc004f5980ae0511da2813a2e0c5169d1835fba96ab00e761023d2d61c01bb7cf34adafc843759edf2392eb468a31ce8000d5b02f87e0de8fd8ad338363afcc977158efe03f9f88df85610a1c37804f1f006ec520c078f6d502599ac116ccdcc2eaf26d43d4e2dc9053c575805f52fa10d41fd4190373a2c46fa0f654421f7e043cbee510bd8a3f856c33b4c9dfbe39a5e50b27d7aea3cf274ac2e693c9b4639ae88db8cdc8d316e7636ee68302b0941947f585823b00ffe4780db10a73ca6784754787f66a03485dfa159415a10bdc001f54a5022982aaa8674f7c8ffe1eb3de1d9ad3f4d87e90687d2704b56da68e5459a5153b06c2474a575c0c9ec6ccb105f521d9f3c049f6fe74a09cf2dfdfc7ba074241f3df3c262e75972d14896dcfa13a2843fe488f3d3ac5e3d6164d81fb655a0175762c7430851f417b2d937d6d7d467c849b731a9669486060f373d1f6ef827f4c33d1933f293bd37b4e191bba4615e7713d0b161e91b2fab7d245a50757ca3505b8925fb2bd065f37ac6eac07a38e372bbacf41f667c9a4a76967a768edd8e93bc8e62becc4859fc220fba2ec865a9936879cbfeab13392375ecfaa6d00c0b1e81386094db0de1b6e8b451aa5f82f4e1f8effb3712a0a7017215601c4ae71486264b53a23509236ae052c0265873601bbd29ee713968317556d8fc4ea9b2e095c0107417d23c876c49f3866b44b42ef643d308a900c2f3085721855cc24824042ee49c2e8b9b4191018c4057ee75a31321329cfc740bb1100636fe23c62e3dec6c384e7db8324e669ed5ebecbb55d402b5dc212935a163d4e7749a7bf1014244967f0fb5b3e82ee6d91b04e598eb4df603aab026e075fed377051007ca8f70513699c01539741f20d07cb5ddb8fffc1db528d5962a22dd5b373775a938bdbf69e5d40d898b61f98a86f968025aafe1dbd6e5bab9d19b8621dc0a47eaadc32b0e77b0c0ad102020efbc6a063832687c37464fb9a0d18b1ded437891e1ad9112316b82501af2bf016ec089fae25427d0fffe1371041366ba7a0a1d0d8478c8ee236633c2109cbfa128642744b4055f33f4065f6353ef135e4b0cd8a1fb82be7084e7d3df8d2f021f705a4733024a67d9d85e1c51679acb5677598395acd3cc8682011624766b40c356a42de3fd10b550186424b060f6387274fc8681c947ef02f6a55a8f72f90d043f03648cd85ec4d38063ce8234bcb331057a53294f08dd4d5f15b4ad5976214f8149d16b7ef98a47984ec03a7a7b8dce52a1f12cd12a83fa28e91a1dc09cb1b15edfcfd04cc06d397c675735b8cc133b86054fc966df7460c380982fd20b07241472235862b12c52c4a4cea520c993e818e8233e55e7d496f358b466a9dae1ae6eb2c36ef2ecdbac7f126d7ffa9f710e8f3150e1ae8e023b29b29d17e39be2e9e2736aaec7876af9fbce7a955994c69c956e5a472458acc9bbf92613cab7d25e5170126c9396a434ba8242055785201aab27e539441500161bcc073fa2440bdace0023529e0282119061706fd7da158a98149f9572405661192e4fb120994ac2f57a3df80e19210879572647737f0128a072e4531b50d5dc8884b6d9827ab05d3708ebe6127c1ad61c77d7fd15f639fc3365601587ae1576e99ec8dbcea42c764389d19fdb5a18c8cc005bfba34cb3e0124456f2b3470422148f963693e0088a76750dbad93765b8338d0b9ba47b1f86b13fb2bca63abe50347d28b26d067716837062d0f2e5d2e888a8e63b6b6387aa9ba3e32fa92cd09adcfa28a8dc1c19620c64275b0c7e0a2b95d7a424c57d3e780c7e807cdb112f7754fa49308a59d47092f673b72d4eec0ae6f1836785b52f1be1fdc930b25d1c19fda49fbf26ea6361c51ec3f5ec5c52c2b0d8898ec3c2e7e02ccaee01a644474fe50dc4d846f5d405fa0c08f42925248d552df57c3105100668cb7380087015cb56f182e99b298f48c5f5c913f809dbff1980c94a5aa0b83c42b64584607d6e7da3c9e511808b7376e3c2622e466a337e3542e0c80e72a7a86d028506ae43a557db3d90e03f0e80af12a1076e676ca2d2ddfdf81a828382334ca6edb43c5cef3887205cd83d506fe05d37eb4ddab2695b8cb394adb5d97acc3c6cf812553c0ea3588056958f093244297abec1cf5f034ead12ac28cf48f16572513a1707ea360862fbd20de47dc13327d0e387308918aafcfa96ff20faab27deab3aa6e15ce657f36f46da5afc1fa434acb60647cd6b47f5170530868351fecbe579796bf7421bbcc0c2699c50d9ea6648a1c626422fdcae213c57daba0858df41024a4dc84035d2133b60091c1535715c252979fd80f98b80d04207ed3cf1a57f2ade634d3ccd01ac10da2037fe92e425fadc08c315aa184d0588fba78773b178e0f77a49582c40131e11cfc7dfa6bfb8b115f7b4b59ea15522a7cf3ce4ca646e066fd32cb6e68dfca8878cbd30c352470825806b9101d4a7a4acdc4f5aa34a233d74c53820d45c67faafe3a67b0f6d1960b10ba5aad8288b822642b184c212f6b75c98afe51a8aec93dafa030fcaa9c727fd734ecdf655cd0e324e6f81097b821359d97ac3dbaeda5222010053d7d976a83754f23a5fcb24d0f46d4f220ecb3dd3ad90c5a4eb82f860555a07e86f320bc806f49c1f00eb020120b080a011b0f39fc1545e53724044cc402b170aa589432fe94d425bea28990626aefb5365519b49c13dd36c9f6d85953949bb693031113c14170dc626c04c993c785fcdaf951b2b19b23c7f937500ad746ca3d2210ab9771bb8bde5e367e574c7ea9122031df858fd622856ca14cf72eafcf4371c008da6181d9d651ee4bd8df8d3e0737f7d3128a50dd9751b289414192f15b947426df9f2beef4ff2f07d573b9daf199936b05a9aeb83c4f85352bffae00f7459a2a7ba4286614b0c78bdb5a54448e7110fb49386bc5034da6d8c498cbc95fcb6e766b451f0b21d149c6a2c94b02d4927a50450c10eb67230d4b98ffedf175cebfeb4696ba8e69eef14e5b86ad890e7eb7c3d3db6a809d466c19f434ad2744f0ebae8ec7b8bcb58d1e52ec1e1e71293511226453482a71cf1aca47d1edc5c0c4ed485d737b34ef3ba2f109a8df74b87d1e88a826f8c433e3e5da4499b9579221f5f3b176349bb8f466c26323e65b15a3e6dac65de39a3f7838c0718cf570334ee75d9f0f8448b40f577ad53c3506ddef4ed3b505e5028641061ba053d897437abe66f90a00b19224fb006090279cba9bcaf2de667ee97e70935caae9e1a978cd835d2dc653c19d9fda2b8a4504fe1fe44bf8d6e77249c3ca773d7cc7b57ecaa49229539ab37a1ab393bce39afe8c57b9e0872dee6f95d2a1397d9615b550bc07261bb32f5f6f261bbd5263c596a70bae221a18988b778ed4cca22de56f490ce9a38171da139e26fcff5abafa4275b1c8603cbdf094de0a0f7dde10f25e882ad01624494ac4ad22805663d1b1221e10fd4c7a34accea2082db8e504f0ad436fc1ce1839bb00b26e83dcdfc27bd711578fae4e3a743cfe71ab3de3d2b0dbeebf3ec7405c3eb53f30a12f10eacc6d80020456a6e6cecefe6a63478e61b043c25edef334e790634f8fca9e1fe1887c880758726a47c48871900d7dbaefc7950fec378c02210b68a9b07f15a55679298243d830a98a560e0d1a9a03ff92b60fcc1301282447c0251214548be0e7ebb537fecaedf8e2614ee271c525b78d6a70bace5ed263d0bbc1cbcf320bc0b0b139760f26948cb7c393e0ccef2b76502b2eb4185d441aa3cb91257adb9b4a5972ae7d1692d9bba54b9b3f76d3a76230903c0b62f2e1f075378131e6256140d7431ce9499851dbc465017932b7001e5fdb99db629de8cd2ef10299e91af284db7ee24806612c3960d04ba27a855929bd1295846f6eb2affcdb1014db915e75aac24e9bd3fe00f53cb3dc35990263fdb75e8558f964423e533a713093b8ae9da46074815a3926829b1e423f60a012ba932cff6f3ed67c1ddcf0fcf5971ec49030f1dc24651a5af919a28a6dc41982e337f90f80f4893f4f678aae529745244b8207937a49ac41d00a608cef91d7b57c05f21c1f0b2590d6f904f145882bf0a67f4fe634b404494ff49bd16bf9d72cdff482b66dd4d86b1f7f0b292e1377e1bba1c2cef7fc268be3eea3b6b83cbfc098038828e9991ee2fdfafd947470203e7e3da90ab9a0a8b3c4a0ef36a2dec75ec5d20a54de37f664d6653cdfb1070cc92313d0e1517d9668762f68964f5d252f91e8109623817a84eb37f2e9743a7f5efe0421560b6617032e07cee828c823d430147da5fa2538ca04b15f14f706cbce56a4533804a2d34a9f091d63742d86d2876ea94248a98373992cfc0e5cdbe11f3a8fe79a8e1482d41795da8743369ecb78ae5233994cd258c106ee5d8e0ff1fb867319230be9c2e10b0aa224d6ee71d043711580879e9289abd525e4a0920edae5185bc3afbad3cb2606d9013b8772d00e0563c2bae0add1ce1a7bf07191d2a3b8f6a5bddc481739cd95756a961035f75de5010284b7627835346aee32a6e63ca5f0bac075773a0e84a260c6d831745fb089fe07b9d7b9e01e78f50377b3156b337f9b3ab4c97648f040ac3d80e173eb65914f789660ec3d311d0a2ff83c3ea79f7faf353b182c6d38250a0ede02a93151c1774028e6b3ef0c96bcc2fe7eab1c2b15d8a27b509a9308b070f99e6c155fac6ea4e4ef724f8237b968d1fe753c117b7211247efca00a8ad12e4f24043046e8a5ca5ebb7e1989037d5964af311925e0a076f6abd143540fc25059551d8ae2c8b851962632f1147e0e98d04bc352c68c2a1ff952152630615084f01fec04163536c53439aa683a33707acb746c9157d7f58538b40b808d4d3214516c0803d90172e50c94d2a533ed5674881480884af1d0bf62562300319e43026e297a19999e67bb4d17eed82011891bce1f155f06b06bd54ca6f8849faf8819ad0ca353a7ccc1996b1234ed3b7a5fb5f331450a5d45664933430fa41a30f81a42773f6999cf7588310c962f31e843a02bb6a8615d940458400df13373d5a13245c628d8731212bcde882c8b3519a07347168d19be29c4aebab840cee6bd97308e5b7609e0b9da755c7c350635b1ce8c903c18e1553b79922d828e868b6e9ed4bf88f5c25cdb20a6bc26d1d59ecaee7aff6c7a81c6e7b013ac45dac4ed66cd499662733b4231257d1926a1148ef592ae6f77db9f5499988735aa659a5d8ce13ac237b40ddb21e92d9ddc76662103900950be151a61be4bf3c2042596e5b137d0fb7b4e1f9f50386890a7745b343fd3136aa5d95dd8c7d185f90459a6e1bbea7dbd81122f171b223eae993bbf5445e47670a1ba3edea97c52e424c13b1643d0acea72a0fb13e24208b12fd07e6d2aee72b73666819d92c81cd37e73e0e506a2504679b35818497a32b9bc58b2266efd03809e11a33a8971c354b04e7380104de0fea1e008ee9fa33ae64cba166fe7670bed1ed1c68d6858eb0ef3894d6822b8c7ff174ee3e1d232797ac7294285bea962b3c3b44544076b0932d299f4756a2b43f41b1e9a0043f4a5d3867783e8544499c2a536fe36f9a7b2c87716f10b8c9ce77c38669204bb296875e851d7fb0c53d254ed2eaccc0cad1bc91ad30ef261c98abb9387b55b64f4dd215a09120d6a24405000889d6369038ded1745f0c88d19c60f55e94227ea44804acfe9de8f5a2b4431a2dfa270b192f1b20551d55c277b0b961d488f5a778aa6ad066027efe050f624adff3d0fc1ef6f8a2a0f81623daca510348bb616c4c5a3e5ef6137ace1db93b0cd5085fd89941c6f3e0e65520224163002d99ff7a4714dd10adfc152ac9c1ae8b9a2c2c8b4cc71cc89fd9026e86a3c86d32537fa8b0aa3a5920e9229019fde28bed028122b4e750b99f45223fd5ac04272733303c5f62c9646683a63df97170681da772f0810e7bdc56c7280f3156cd59d97237381dda8706891fe5118a2c985caa41a45ca9adc0a1687e4d1152ff3602d42185aa168ba8fab38e26c509b69376e19605155890fa499b173b49f381ddc8f08078c6cd5b49566e0b8197222b62df6d4084a3a7def5ada793ac93b20d447dada4f0833277af65d6088fa0b8b9740d77b43fa4c05941a326d1f5d3432d0f72b8ca4db72b32299c7339904b738af6d5af21062215d9c8f992507b02096073dad41c1cf29e62550d373f3419f988ed1caf62f55937c6bb47002ab5452febebd2672181ed30c84fc4430e57af806b57a50cebdabdba80609697c4807be198bb00703ccfecac32165a7857d2463089bf6d71dd339e1cc55ede10ddf0f5b20a16b772a1e995e256d48ea38bdaf4ad90568cf2387fa3f88839e9da74073e317c70275135434634ff1d657a2724e6721d465de04d5b6c0579390c09c7865dfa88249ca3856f05eb17938737979c870d2ead8f70d73d0cf830a387ab5bc3096e3441b9d3eba07e7cf9a8b591ba5ad2b7da7e5d8c36b5ecd3fe812c0389a7668f9fdaadffb3fed4479c8ff29743bcb3d8d699d1eab9b1e47fd2dad33a471b091fabac0670bb03dd602958c4bfa88638eb04aada6e3be5989cff05017767ff49a3ff7d2da879e9a30f4b4b2d1ace2379f1976e381e28ddfe23866685b9469501ce08b9cd622102294deb64fb4823c955aaf4df0bb30a4eff853dea52e66e1e43217db05d7a3f649947462ea45915e0b3dbe9c26cc473be380ee6b23eb0ba5846db361807a0db0b4eafcc39f11b56263b3a6728e6f9398e4e9edbeefeae5504783fae9e5c6d39b295ca0cdbb6d92404e65999cd28828f6f180fd8891cff0b73a38894a10f0970a66dc6b31aa1b45676a4de928af73018edf6a4818f4ff2fc796d65c0ef76c3901cc827e7659ba8dac8801d486c6a31762cf5bb2824b0ee9b84654135753b11c484f94dd1f4af26b9ccff4a09092a89a6b15efd186a1a132b461aeb0e0327a8478fd1bffe9d07dbf0a87b514c2409d91b32cf506fcbe72999439dd24e3ae67a8dbc811b299659073e001f3b95b83566e27629d4c79b5a677e68293b210e9693921712ed0d94d2215f1fcd1c660d4e10a6bd03e7014065a961bd5e23506503a66710a9669f334bb9e5a34105435008aa1be67574b9b7423ecdad1c341269a3b32cbdc0bef87cb21c7af4b0b472f1c4facee8de91a10f3c113a6ef0ee98da8a2655cdb21707dc6480c9ac7418d7fd7bc15bd229d839002849517578c0a608c11178a79b02cb0c85d986c7a1203ef5aea58467c94b85757896906b1e6ddb0a4258724f2e316390e18cbd7ee58209b1cce42db905dd8bb5de57f07330db1e2bf0f7a801610d164cd11c3c42b2249e58a2727356cc331f89518867d934898ecb44335e88912df9c2907e87dd1212680cb3be79baa98e8e8cef3312d2b6ffb72f93bd6d3c46b76f66310c22472fed70c8ccd32adc0c62c672d82660337039640a5f91d9ae30f1a7dd2261bc09e1387cb5214f63d119d9a6ac84333412348fc13fd3dd3810dbeba1578cd149a3653d69a43f2fbd39940fbdf92d3848b254f97b3ca5e2210ff67d8ad0ce23f138fb2e111a294523c54d5b1144ce3777666e49a33f2aca05b3f25d997aa0491a6f90e96c390a8edf5eb74102846556f225bf79b3e710a5afdd365c26aa86f4aa960f23b9feb1c23f76887ee2e1259089053fb1b79e587cfa34f64a3e28763a3009de5302b782d7b024e38b88c1212968bcd2a9eeb50001d8d8c74f9d5384b81bb0c7d7741ce76e6d73311ac703595fbbeda027cd318daf12c15a7e289784efad75f531c40053b001fa787dccaefb1a0c1127ecde4f346318f97298fceaeb9a463758803211e0befe1257430237394c6bc70752483a73587ae24237d937c53e864bb228dd0f88ac3c61b943fbef098281e6b52c095536580587630b828881c160fbc15db6463b7c3ff74dd2a7c573c6b29fbc2613365265abaa9873da0f4a4aa416ff967930e82d140462cd4726b241ddeaebba4e611593024aa28e58fe3c99335a9d0760fba6a5cd8c9b9aca027db235d761b76f76185dec2bec5e82782d7ee1db86e2a1b84c18bc9e13688c559bd8a79a4083074b1cf73acd3e46f5081cb589253da27485d1d432e88104730cea6ee8b59af3f71ba71618becc1f78271e00cdda5caea311f5cc0237afc3b4508124574e9d9b8299f77ebef7696bcb9fd60be9214b991700293737f236c6b30c6794af4bb374dd7321f296226ff36c3f7b297741ff394d8161fa6673486ad7c8f6d6d2fb3fecf23edc7719f6bbd2b47f0d8699abb958653041dd79e5996ec877be7420eebd818b867bfe187f422fa3f6d4481fc9d93c4a1e115eebd4f9c7c24f621ca7d66c8587e7c9233a0182d9d1743824a275e6291cca4f83312c42d9c70965c3b635eb68c0999ec6f337d9ee24e895eab53a93de5a445357a0b5736f76c4eea7f09f841585565dc3c80b49a9dd719f671111c62828e1e9d2cfbe98412d3d3babab033360d33f0630b9c39de84404aae0444a5f4cf5a591fd6d617c35f45f9403c914767743be3f1dfad26ee0df59f123e5c0ee14f08ee01c62c628a3054f88a1204170f29f25e72ef9f6eb4d8d8624b68ab71519086cfb1b3908045d1a54a9fd7b5202c4ceff07187f60fe0f482f557e8cb47d166b97cabac50143c465e9f3574ece39cf7b1bd886c4d8cb59f2888f906960109f1ca4463c13aef793e5cd3f0f498c21cf8acef800cadf56af491cb2474532c701afd7c9e4c3fa809dc4820cecf16072620ba6548c52f2217d1292451ab02fab0c97cbda4a432c9352db26581537b22a6a531b2a95fa90c78a37d94f37e1e105d3d182197989d162f9f7e88361c55693357760921b5e7ceae5968538dd8c5e75b1ebb54f0267e38418ba7cdd94d006fb6e850c0dc4c7c0dcce8433f5193a0798821656a23a315f694abfdbb8d29dccda6f79040b033c584842b4f8f86e3dc1d346f91e43d551a68197c31401ffb7c4c042004d2c6980ecb04f083e88a7893ebc41a32b892c9683266787dca474540ec9c1ad101d0d7a188ae98050f1836a68960ea490204ace17deaba30b0f1089ee5bbdc993791530da2c9457f17a500603b9a0a39b98298789793b4cf02a627432322b205e6931f05788bc3ac410fe141d5f04fcea8ce29514e5df0bdddbe403284117693fbb9bcce44d3f395acd49363adac72bee0a2994045ebd97e6665c3a9ae79f4140cb69bc1d556f2653869af47c7d7ad4644659d39cbb6a9aab73de7fde7d85870e46c352b7a6d0faaf161f8ed9a5afb26774efafe2f80931d62c47db6546ab56db46f6c3faeb91c70873660b0d620f214c454c5c60066c72d04b78fcdf975657eabef3d69376c0c596f8af45ea823d2f988839843d66f7df0b9e6b803489f7d26bd440560a99f7efc31e34c97b4867245a65dac4b94acb4a42d5b5e7bcc728637da8509b290432314fc56ec103ce66055ffbeeafb0357c2ac72a18bb482086dcbfe8f0e2a4474a470b16af2f5a39503c84503b4ced6022f79a934342bd5ec09bf98bd95126c2965d71f9e572fec7e065359c151b719d8551df1aee683cc1412168fdacdc49d0eb35a008dc2457cc05730d5182f0b50fe4e6e91166b411fa350f722c0539eb22b6cec211a94eabb4585e1896a89950321e362732209e99d12ac1c01a745be7881184abfd0dfc71c46d2bbea2b25e97f88c25969059a4cdbe769ca207868dc8b4c24262c7ca23f7f388748e8f6e94ded705bb6d95c05a315d6356fa707b5dd06aa60b51d867c81e55e189d999067385eeaa17adb8ed78cca63817f82f358f682dd36280fff4fdcc581a8f6a92b5445fb898fdf2e872a1c8b950fe3f4733b1deee6153f4177578003df2c2f03d5c5e2b69bab0c3c9c22c997521ad2be6b370391253001a485dd1ac4bed59e416a4c506d05c4a6560ab9af5edcd278bf383067ca243b8db57c9894e233b217dc6fa10a54577abe4ce4d2d2ec3272487d62ab0cacd375221df08a2328424f3c8ac1af4f633f45f50308a8ec8abe315ba51c4227151217ff3ffb1a9256d60a604663cbe2c0cff3d6eebfcfd9fe29296818ec66bac9162729256e8e52d751ba972aa1235102adb9a7ba4a07b31013afeda09e587d4757bdbde77a73f7a56cd1bc7ae8e3281191bd752aa8e3fa5f390b0611384345a6224e03ac1f5db30a87941ff8d96215cb8b1dde7e10a082459993dc6e311b0fcc271121c25cb3c4042779cfc3c5cac0707eaf17a79c96cdbf8f561968e68bb11cb22839a02c7368ed1f8f75c3cd6944be6b91e5e7a69fb492569a3296fffb2a3ae9c4156523ef9904241b803daaae0120ca8e69c63ba3d81b7535f621fe8d2a4ee6646de537024caf3ca5de1b4adbcf789c2a37f38adc92e18a1cf91dda85284d653faff567727808134282c43a3f04822ec6c95ce70246487a3e2a48e17afced2e139ea673ed1ab0df22a576aef90199b4e084b8e58d3547856bc31ed1ad1d2157003af8044d1e28d224ee43c534b347db44f8e48f6e3b7405b4e2c05cd1ab8d578598f10897a539c528fca2642976aaa4775f7be655fc4cc622de308fb2c64f879243f2f6fb006f5172475ee2fd69a5e52d8b41ee13905c11e628bbccdd467c47dd0c8505fb14732925d4022e9ddd2ca1b618d0553e9d92dae9e0446cacdf64f385e6d104d3b7e89b22b1216c6ced8f862ebe2a0651d8cac9eec4894f8c5aae1a3ffa8ff30fe917753b0570ea7ae279cfdf1a9c88f46f98ef8b7895930830a60fc8867c13800986c0dc7b22c2a970379bcb0e200493587326f92abd886f899201d3b3cbb9574f2701c1e8cab9928bfa3fd268ae0e18cc09c11f73abcc362565016dfb6b871a7f8a75f572651a97c3e7edf98c77adb8da1d32835e6f580e73b222ed766cdd22be632cf95acdd0167a46590af0b01f8aa5663aeb7cdf4335e8ede416c0df81c8b5e771fa7ed2b12c9f816a1523820e6aa6bc3ba1f58c64652c39dc5fa470f86185fc9073b971b9205e09d7a07a058141c34c9deed39aa25f5a556e399dfad0bc725069c7d6b68d0132355c20cd4829e9e9f463e2ce45989657ce2db7b37baddb9cc4b87a1b028d08564635a34d0cbb1b42e3c67ddcd5e749e289d6099b5b0ccfe48850b17139cefbf0643badb7606b7b49fd48b3eabe4467270462d074594555c006b39a0cca1c32437f3500b6579dad5090592a7645a9b6b0174b723fa2fa82cffd5dd705543190810e742ff2b5b776f32d0a675afada6436e8c85e915d114aa1c1065ad820e2bf155df6436222a069c6218d22db7f509313692578d390f3438b9e25dccdd08ade0dfaf918b02192c4716f35288950dea5d72d168cacec54177308f16b9de94197cb19a5d35d9459dc28db9bb09b63d88f495aa5ea75bd566208b769fbf8b6d467d1d83c985ad79608c6f58937b98d8c08bcb654da05237d8cb1003d5102aacc9d184deacd59958f2663f16685bd2743a14681c59dd9af702dda9ec16100a52f9b30fc1694c850fe8898ba81a054b393e5c960c723a430e33e54bb024583607460794aa02e75041fb1242965d580d94255fa2a2e1be50cad251bd1ebd9d144f9d2209d7b505e3efe04d40da6c2e5bd6b2d046c647608a96271a7471f3f1afb95fac942fc1f68b65faa4309ef3634e89f73ed4bcc428bf7d5c4ab12645b5cf3b3c1bdb229569ba6a464f38acc89b55b37d5d30467d5e197efe37ae8437d562083191e655b2a99301a07ab9cff92130f67cd1d82fdf33478e3dfd2b0e37973265f58d9025bc12f3cca3bd41924ba3a1d433e8fd4fc014ea184da868bcfbb16efaa90f5e4d6588864aa90fc6dfd324e2809520fcfbe885d8edeafa11fcedacad47d572938fc83a54b8ad53a49323827d05ffaa28a7cf7c49e8c0555136d81b356c506c1dda003b5b51c08b1a8c019810d7851b98a6bf0b5c37d4d9028899222be9d09f4b214a887a4c0eddae8318c32aae6e239a6ee853fabf75d28db6e645f7d1d021955b21681dded600794f709cf39640df29127849eaf4a0ff06b2153c4d27a6189ba2223145aeca6140cac0b46689d81a042edbc38dbbd5ea14619775623bebf31f9ee2b8fa3befeaf0f13c0bdfaeaf3aac5de58c62e908020c1de4bd31a3605ea486b7487ea801b2a061e77c7e866a8041a611ad1ded711ff0567794a56676f4b65d1584fffd627329c488c150ab9bad8e6cc9c738b0a9d130d529d97961f2c676d2571b3f86461b00b55c6fbfe2de277d1473466f539892bd539f5b3838ee8a73d114b1c43c7c7f89f997a61110fb459ab137e39c306d785d1051ea1e62f1d4b046e96d806812d83feafbb6fcc94ac37642d554364791e9e7c5ed42e52215de614b2671a4b8234948e7544b4e7696ac5658d44b8ed864c38ca74636e409aa8594ee1ea8add1e7ba25515ee5a663810e7bbb603b2e38695bd506a6138cf6ae51188c5915ca34707cb02baa725ccf4257afd65dbdb0040f57c4d5908c28cd447754770b60514681fc73eb39b245687b88b2c1d2346513eb75d0259f8a65e78eee713f90a0c4c4eaa77c181ff125301d90f96440dbf1fa6c7c926d624b97b42060cf84ad9eaf072c98d1dd58cac2efbf8fa8361c1de100f7b4cd17a204b0732d0cb4a14a72a68848b012386b145f6dc95816352dbe7112d04b80ad5d8315f9184de28a6f6227f8ddf27d43399618f08dbbab70ea31486e9400e5f1c96a44bb10e49e45a312b9be340426800b2eb45107e846669078d3846be1f2738d964a8d4734f9084ca50930be3cd8f87fd6f1662a5cd0a1e944ad56c977d4a6af93eef3ed3734ddf245c580cd3e96df1556bb7a4d4f104fd5047a43633a127c2cb37e5298cb17544799186b69510b7db4910a331d5328ec6e0e39fec7b68cfb44de200a7d2161c58740ed7e569b36d73f72d84d8216dae259193417ac1d253538882217f75665a506d2203ea339c67e422717bb0944205d11735cd421b3431785fa69c0788af6356440a3298d0b1430563625b667a95effa6cc90591492d90ad353feb1f46a58710d88f7925607b6da3cbad12a93b2c3d8e928f287cbd47e0a72cf7d13b64d14197cc49402751a36b529a06ba01e8ef850cd2221251025c8624793063d3f7c7dbeb9c7638a823f84ea9cefa2185e8b45dad288c11981b3717b7753110c4b7be6ef5124a5e15732ca26cab73676dbc2ca7bf29ad7370d86979531dad75f2412ebb58a6d105793500b0c9b21540378b74c9edacacffa9d3b8f0229a2f795e72bebacaf9b1dc05a4fbc620f4105cc62dfbc13a025d52158d0916063d9e204418801cd6db9761ac16b36f315ed3b4933e547f63a4fcdf5dacb907213a5e3c08d5acbe29e360ceb6225ce6a985ca20c84d8615ffbe21f43c118c88c96dc4dfa1e85398a730a52632c1a8e101618811274cd6bfdc41cf02105a29992e1a1c54514059c3a5b031c5fcb43fa735129f8ac51bb016793bd45e24da7036367a0f609409242a575e458262fed4e7b316ce42277812735cea8dea54725c14953547842d3d024e5d2422918ba051248504a75116329510978de9fabc899ba354e60cd5f5691f0f322e5f3e8f47d561091b978d0bd908d715995e0cec7855f1210027a31543aa2a4561a8d1b0b66a991154a1cb638af1b9fd6ef5cd569957cf8d40eb43acedc885a1b9bd4aa7c79c5a3e4d3151b26657e5510d984bc88c6a292787ff2d730b851ccd4347eaed4f08ffc2c98836fdf459a80dcf7cf1b2d29cf5e3b06761ce3b80081d8c5a034274d0ac94ed959384a7e0498fa2b30c1dddae9a59b2f7bb9d3992181a299f73e85745ad355f6f6521bf0f6d7202297716c2641981d2499d3b8b20620bbbcb447014cc5521da00650eb6484b86a06ecd7b226417d5b025695e0182cf877097dbfccd7cc61d84eb459251fe05c04ca0141cf911a95477406395f1af81a5618dadb21513490d8c8989b215bbd8fda752630a7dd8472ef1c6e57b45f80a1c26838bd8018f4779b183b0732f6e1575ff0b2ccb82b91dac642c396c214dd2f8470c4fa71e4b70d05356cbc039172d2c6621e0f4155f20823898105930189b82d44e5062601ebe498570f983dce12690ef54d89d48566c535a8bef7429446a68dc6c3f14a7f38e15a8bdcd5cfbd2a7965f660ff58cb2fcf4b36ccb4583708ece76667b81d9efcadbf753c0e0a6c38b1587a978d15c0a8dc4c322d4d9ce28c56ecaeb2d8ace48109129962badd94f0eb01652f5c6560349185ee93088d48fdb2ccf9205779f45b7f27009196aac563a87482e9d00386c302c9958b2947263c96201cd9d17a168de3a29731802d3f93299fdcdebaeb311dc94aedc5a53504ce4d6d5125cc2ee2c80b73c88a443f51d32e6fc4e78e1954041c96a04e37ce65517ec4307d62ce4bc98368960e1d58d8ee80e9a12699991ae54b681dedb610b11bad766a10c567aafc9b503276eafca564f984b38f5d93d9b18e242bacf7f1e84a4bebea1052cf469d7fe092f4b89fa4cbfefa66734754996135567aee88b41113b7cc7e020c0623181d524eb20a736d6a03d97e7cf9d022545614fef3a4355bc151ddc755252b325be0b86a8709b9c5caf31a2b18dcd4879fe56ac1a9201d80692d6473cdea87bed19af2d652cf60c06ba93f2e3cb0db9cc4583229311bb1deb98385fdf6aeb88eeb3f1fd5bda586f14a4da443ff90490e4047d6e61e9996e3b358eeedadcf4ab9be6c1b77a9a762d09e11b77fef79cdc5381d2df0de63970ccb5eff0c178af02a09fa9d07798f02f8ec8a4a9dc1e8c6b17355ccb7e6a7f8131aa1da40192eba8f4f27f1d12d2502745a91fe60b198fc56100ebfa6553c57f4dbd580e0c5608877104041eb125ba6e20a7174f00e5658e044208a1cb9bc3304815891e9e01013dcd3a6fa51e01f5ba2b3602deefcc40506fba6e64979c0aa1f0b11876a3f2f6506e801052568bf3a884f48a88dfb6db60616fa23105424b63410f6681f8e4480ad13ab0eb0485daf8d88cddd8599c6fa07dfcf17efebfd4f9c515bc935da284a5b518d5fe2777738ec4e0135345e369466fcbbdd1274808b593e5a50d29b78c8f747df81c2872b6806303aae44c92d97729501e3685ddeb7293b7339548c472a7701e26d6a06651e69f239711e26e46e2e0f3dba31eddd0becdff0e252e1e7ffd3cd957e936ef05b8ba3006d299915ea44c8399c56dfb6b62b8b12c82eef02bc61f8fecad8ef6787ba833a18c741170ac317d779c6daa0d4d911a6c4bfb729490dfd7bc1dd380ff367db2cfaae5a5ef176cfc1becec65238a674db299f6dc4c6c1d066aab0c23681654dc610a1587410d210f497f0233bab3c8df28bb0de6c7c13316b215e1101255c75f76ca791d3aa754c60110b0f18c8a8a202239a627f4642cd141107d434f4efa3efaeec8c7f818055cebd6a9043ee3e2fa290e60204c50243a11945778c42024bc1e0e3671f54ada794c59d1ecf2ff9926a3c9eef1ad0dd3c4a6dade0e664553a178ef1b9a1ed70ab1d4ac4d6f6c9c510304464b4679e0b62aee4e8041df6a1b55daaed2c44880f20f857a749a4a2d12b0471389938a83e7b996564ff58539c57d4238df84125f637dd6fdf68a819faa686caf8f3254b36d105543285fbd0d74e6319bd927d111b497870e59f5fef03dbbe2ebc0c72c079b5e6af6ad74921d782f036a2b525a1fc33864d9e38db910a0d8d930a92388cbcce91d7d30861acea08d5571fa3b7a52c1c308faf11725d269cbd73b5d5cdcae30dbf43c981a16d2e6674d8f06eaa09f989e37b8ce3c5401d27f2b9460b86d265be660afdcb191ca0d5927ddcfb5796acff59915f3ee63e27922591ae105e415d03f0767efa66812bfef5db2418bc58b6a979d06ed24394c4ed9ab6d2ba26ee563c0deaaa861e9dc6b9afe807185832d594cdda38bc51a8ca9e0e3c2b312cc4a0a998bd9201ec8b769bdb696034e0f08901ed786b9f9c2076308f676a78b968f3e122f5581b55fbf8bb79e08137dfe87ffa46ab5a1d7b9db18bc305a202813b68687078feb52be7f490bdf9b6bccc68a4c00ca136f7fd96b6cfb69ed52db86151bf582b488004858ade456d3649814312548187f1d46691d4ef51b602b0e6623476438b2d08a8b61aeef92a47474ed634bb9a99464d954bc5170d4562a080ba81eef81c1e290010c60e2792e903a98ab9810425a1dd9219ee9b49bb4060ba6b222a382b89bb833d0f91ba041bb41bf5043c234edf47cbfc90d267840d36f4a5a5903d73bfb4f551fb3621faa3dfcea05c7d5141e9a18698468ebde4148d2306a62190df4849472e5c1b3340e140b24c91015700f9b5a27331f0733d1260c0de7027be1dad60daa8a27651f0579179713f053b053a0383b7e63b8bb7c2b84098f211bc4cf7292a640a55742bd5932ed5916a18905bfd9f933cfb4163aefb3e5f6c66d1f4639a28a70f130e59ce01a03de4ec6ebc3ddb9601609c671528a0351cf07936170d1c4fc877aee45911a6a2eca1f344865978030675ac7138e8934ddcac7d0c04755e1074aeca68a4ff70f98b90dc05231523efca31ef737d74b2aa18b79aa6c74bfef36bd1adc0ad2bc4c97c323626866257a9118616c396cc9bf4f4e108dfed7d68c1b31e9593711e79aa854c41e19ee940f237c1e59734c91c0650be098caa036f47960e531d2185df4e2c05aafac87f3a020bd6f79855f22e2ca66c7792a67ff64fe839e560bfad685bc79b3d65dc9188298836a4d57bccb1afe2bb0f1a94c21068ceff84f88b9354e6863023e62956b8dac9dc6110ebf58d42ff19157070bd9247f075374d10fb14972c038a631d5ef2ada8cacd3ba5ea9bef818242273e332cccf89e47d54e115d41fa02eb3182e31753a45f87bdc012a2e434abbd8e0da9da5c6d2eb9edd8a13b5076c65ed8e946201076cbd9e6efef7c77dae11a4bbb1b07b078e10977c64865e5cd124d85040d3e39c81160716d80474186fb70958c08a61c1ab69e935948aa4c305b52e04844e2514711e9be7c4afcc0d4a362fd113d8dd21b95f66e56c03c18aea439860fec321c606d6b896a28c167fea27eb2665c04086602717e135a40e34fd9198b64863319cdd7b5274ea2455b65eaae687d00132a61c8a3d36da203e9254ba6370d3a151eab977cad05e2a0264e8ab2cfc4a48555d4a456596dc53f8c23877a9b8703455ad214e69ba0d37b8674438a720bf768f7b664cdd76de924cd1340b42c31da85526836618f72459055016ad489633bd3a93adbc4c9b62ecddb9b55326a10967c0c20e5aec12e9602ad12d5b29d3b02106a2bf0555dd9a3fc876d243fd5aad440261e4f546fa4f912f0ffedd54ff0154aa11ba1aa0f2318a2d3bf978b0f64c830ae2ba2af532314337833739e798168f9ff1d598ff8bf54b33c0696d7922373789523cb313c8aa41570785212d4b26e9b4ff71678202f69518e2f37f8f0dff4ab96f49f3008a727988e64bf886cad23c9aaa9e6082e67f5ff4e46a7527497b87d0338e38b55d8f76b68cce60e0a3dd6e4d9767123b879980e45e210b694ba2441910db3b069f357a0e491d0f79cfb2e872357b6eabaa67b17e31d8bfe608f44f640953c8009e0655d065f7e2c1661078dc96dd554a2dd8c427ad178d64f74b0f5b8f8a0ae7de7853e04c242ffb310f1b1c002eba40abe814d8d2d4c416e963fa9f3297de128f7beb347268fb7edab3f4e923ec7fa1b7e77cadf3e0d8f256068d5b3fbeb5d26a7c56907ba232cffbb410af60642ce216f66573b0ae9af5698230b484118bfa39d74918f85fb1aa371989ce9e8ce163903ab8cc1e538f2c090e69d6137422fbf3ec08b0aea89c6335477955a3e1d0e33d445e86ebdc99ae6b91a591466eff9e36214b321b0d3fd968f11b197b46fe74d0bf95f2e84675e5e731de92ca0df4b1ccbc4a1e08224dafe62c11d31afc7b8bc603061458ce3c1cd2bffbbbe1e75654b1abcd1233452851cf4570187e595960215ca3d2eeaddb992c5c9a17756699fabb06787c3ec5be409005f5b910d92d317cb6f88d5312259623cbf02f4aada78a8fbb81b4ada9b7134ab454d427d92a0a0e0ae33b860a0963a844b93f3a22398844e8f49c2f4e0e5221bec59b711e8bad25d567a7ffb0d853c3c130a9e0ea3a5438f1bf90465de47f92a5023f5e66ee08c01e91a6abca5c8b091197cf703175d14d7b8af4f9af62f53a55854a11b72ba0681985d617f8fa3372f788efdfd713d094102c2536537d35350af7fc5c0e0ff4fd98cf00dc41c5b87111d5e42325c994ee1a65b02b41531cad782aafbe2671292c14e6323926f77902b14fcb82433d7fe369ba3bbe322c82df0af27bb62807d8f2a59ed30a417364a18bdf522700dd51c6c2abfd97ecf47c1f65e426513defd99b0615262e58a4960d7d3a689610c443626dfe1f1d05f620d19c83be91c5cccb27d41c8b9a61360621d742e8fa1762c7b0c715de92c87b71a0ef6ff5ede0d8479e9eef11e7239f32d4e067b70cbc805d325668a5d74cf8f7fdb1b0d416b4c75877c05e1942561369ccde1cec2de180787d4b5c939f2cf969ca8bd442fc83e146eebe898d61ae3283a12f497f2dac3d742745c54ff8e3fb2e5c0223fd6a1a2cecbba3320074798f62f557c4555f0aea418d896f6ef24e609ba0ca0e20a1fee3261df366b057fc076579b51d6065effd64b269b12654ad503399c7419059d5c6879adbffb4fd644fbf7eacedd7adf6ff261e96317434ecd6efb694f9b3cefc0a2e818e14cb207d069b4c78615388dd869fdfe63c30b53ce4e28a02199571d795a4f3babe748480cd032eb90bb8723c787961b5a3185c4c839d959dfefd1236e1a04493bb8160a42ffc2e6ca1ef5d6ed80cfaf0f0ef764733f3ad39ea3def07ee4489c827ab019f7b50e46e668da8ffbdb13e223d6c0b8a46d8ef40eb17ad00c8a41837492d8ca920c4b7418038aa6d78171a4f642236c9edfa4a393c530ff883f969b9e4ce4526b3bc6c758f5640248f74501e9294d596cad1be34da8e6bb387f83d822f9ac63bc6cf04e14004a05c35d06fa2bed6422c22a44d046407dbdb960d71ce5beb7f15f31a7f420bddfa7d56c16065d098d24ba2f82e9bfdeaf46819411273e119d62a620269e2bfdb24cfcbda89fc585f7710f97f727b2dde73c15e29316f77db03ca749915dda2cad26242c6bea86b13ee8dd273a3020459c2ccad6a23cec8b45e2ae6de0a0629f6e8f417e54df7dc4e7eae1ff43b831c3ab449c0c1ff3ce0db527001ef98ec43d9948779ec0cf4d3fa56d0e733a2d2be7a3281cb38e02488fd81b1412c545c690f5a85ef221d38e48b323f9964632d1b6b928d8d49ef3137c28f00c18a69759ff20f98da06279aeabff93f579a0f6d9d5691fcb314ace49626bd790d74881499fffefc503203f03686dadc2898b9bda665f0ce6daf6b2c4dc3c0f72790a1280546da4d63ca9b521580679f445ff51b7217f219adcbe1fa27825880a48843610ac9b181027f7a708f55eeaefa13fac34f76b95ed27d0fe6ff8eac55b0fc6b50f635dfb1d7c7f814dc99f264df538b967bb1c7669c6d4b09ad2eb2a122761860f9b10bd1c13f52d63b005f6ad72b829823b5d7e9ceb4f5c5efce8b4d16b0368536b75d4fe5d10dc6cf75c0304c27f1c7dfdbbf284b85cbc51fe38e4f8acdda4c1badff3c1562bcecdde2fc1afaacef95efd79a026543fea2a84a74399591596a8a5bb23454304099534eec75f70d0abedb0cec50ae801a1ddbd2773c3a0c380a32262a8fe8b80ee6983e4d3807805147e41e063e7be3d0d639d05e287eb62c5f9fa0a02fbde2c107038f0ed550774f0bd5da7fb3717ab9af14938545fdfac561a3e1de8d1d673b087d4bb1c91161b27363f4c889369e2bd23d6f3d7292c0efaf42341f08ca1f9bd4a9b081e429ed7290e97822f82f646b73508dabbd1afcd4523a91ffbcd7bfb6890ecc6ad74d19958b780fdd68318a9faf3b8bdea2cf8c6333f20efe4185ca310bc75e3232eb6919ff26eaac43f0285ff830c0d8619732d863151982e93f588fc3e5d17424766c5cd0ebbf9ccd2bdb756b0d11a27dc8718a489ee8b1eb3d134f638072b3c72474ed594a6628654182477bd6073ccc95729cfb5f6fe37f1df1e0361ed806e8efa7c19beeb7f46beadc2d868f86171817282984509304c8c54b0688fe45c594bebe1daa7df587bcbd98628c64b3f03e9cb4251e13d7c95cf14d77f358d9513bd0da7fdaf634f30624e55fe89aea3f4ed9b8819cdfca4f270a3e6accd4c4d57364b28d63e7a598bcd0f949a98021ff5cafcb05211d35f515a62f0e925455c7d7689c4ea479695d8fcc15211133f66e90e1b7d30b9bb4de8014a513cfe98951bd571d19b64e243624a6e6306321e9cede3cb4b0c3fb5a4c4e5cf2c8158fdc8b216db1f5a2a62f2ab4b4b8c3ea524898bcf2cb158fba8b2109b3e50aa629a7c942bf3c3a52e267d55a90d44781544f2ceca3da6184a67003d57f54c5e943c602fd7dc7b18dfbce2f645b6c3f6163f8c1c8d127ea3d62459071551b7cb1ba7ae9e8893632f03f4b0d426d7be9ec00a2f4577780372ce5c67acc997091fcafd23af9ffaf6fcc57ea2aed9bd1b5698fa67c104c2b5eb9d266ceff314272c210b1050506348be375ddd3dbfc32c15a3eadb862d3cebb2d4946b6e4891d9ff27fd9746e7afb3c0e45a6add0daae74cfe42fcef1d1961fe5106eb4861afda3d93cbe453daee85c6d9a32e1e17c7d99322cdfe9f606390cedce75e9e378a4bf28e1d9433ff3055ef602b17fe894e0ecce4b35e3f4e1b9a97fd36fa17fe16db5f552f2fc33fdce92281f296141e2a3039de8d48a1356900e56f70beee3dfbbd057ebd28138673d2d413a53417b1be14563bbf44b0c0328a138416f4a0daddaf6876cd267ec14a94480508755bde469eae2bc5bf5c9b32000b052008e1ccea06440493a8da6cfa1340cc72c031b431e4a81b99630109b178bff0a674a2634d918cedb2de358132791fcfbd516ab12dfe582cec3d8c0f56402f9a7655f276f9c4fb1ec1fcdade20d5f6741ab82f37f3070dd6db93e37e4f83f057e49f2d0418c0406b95f1042a0a1e94633946adc6255fed64319529882319a50a16f40c467363ab6fb54e6f6091231d9c8c30d44588cc27084eba0d9755dbaf2072287e435086a3eada0cf2dc4b620c18791937440a707e6215ead0004fa0e2ad9280aef310e64154fc2bcaf53928d1d677e626f9a43e39bbb019186dc44b334051e9d1cb3c9aa64b1f454759e13df0bc2d29ad72bb11b50b9a7057de6ee5685f181aade9506fd19096e7099cbcac9fc15096b71e83968a154df885e8c7fdac9adf767a7c8a9170972955206183a56b922e52222dd4477222a45451e59cce099bab0fc810f1ddf9504a91f289918324a865ab3d982b24bc72e7b6f4c1db4ed397bc59fbc70407e775f2e65871a833c7726955eeb0e2696719764f0a32d9604a731b7f930e5683b0bf006a55af18a63c0ee098b24c06d8b10add4b9701d809743b7b6a8e19f181104831646ca31640eeb0422cb2146cf8cc130b0803463e0a18ccc8a2bcd3949894859610bfea537d960760e5baf00fd8273b04878a0a539b29d7ba1f175f8a2097f6794d5d7f830bf7612c05a0a10088556194e8befa690f4e1ab499041a9bb0375020cb085d724f806fca6aed62f8f03de3603a5930b00e1caa8bd7a7de9f13818494586b2aaf4e7ef0d2d64b58db0b21020b8f6e827508a45c3106acd4c4abbb71231ff927a4d8a2db83a79aa9c348299f468a2b97540e16f8752ee97a81953323cc00e1acf9333f60c946b511ccbdc6d18cccf13c0b5bd4a6ebe7fe527cd819e0c1d4690004eff77f2d1ee9c8ed8e1496c7769c119edb73b3c3d7bd5af7f94fd36f6b6da4b3469fdf02e654d00506e0ddf3f7bbd3e1161a3996b37ac290d0e9dd832a416ead74a045db2004501ab550e88e51035ba3f156b8c9c187c377f6990597955d31507657d3ccb2e98e47397636458eda8be6d835d7ebbcd2a16cef33a225df0d041e8267d285bde3233362927ce26acb15b4eaaf70df7f773fdc79c157f416bd948590f69cc2940395e41cd8f269a323893e1c927af7a75f16c9b34f31236c378cc3b1ef117e80a6c58b4d911d713f7c490a3f15392a2efae7e944f8aa4997099c71a137884aa989bfdf4cbedb811dff85c234433432528a33a7209a28b14cbb93a5766efa7ed510ad887defb7ea9cf0a923f61157d8574d57c651ebc4bc391c0a20930072b124562b56b8d3519e6cee47ad3b565db6efaf91117abdcf8bdf440855ce9a1fe7d24e87bb36b5f987330302cbd45055beee21ca59d916c024be97e0fdd1d0e83c3f1a371a999f373973475a8af8aff03833274d7662754ab5877f592657edde0b9dd37ce3a333d051ccc754aee201caffb0c9dcb8fa1a2a02995a26446ec3424f75bfa4867e094646a7895a17f830555e669640bc520a5efe653ec1c8e8e9e4b0ba0c80c6a96cb9b549c96997eb7028d423436a1434feb1d0ab2fab8576eeeed6059916890cfda6294065d884d695674045bbdcf9c040afd2723596112b08c13a8cc69ff374879938b19b0bf867158d67cc06a056f123c262366a3798343c88ed4a91628fe12df01f64324e5eb12ccb8f6b178c886c81415c978a7c1e6fc8fb4cddc84833b3ae0b9bc94293936976451fd0909ba10bc720ea7ce8225c009239be3740cea28b2cf4f5280e0e39d77c56aec9e1e98590ad434b03400d2e126538e45ad217f25b415a9fb05637dc0ed51d78d11f8f61f2ee85c2a58f2fca21e2120eaa5443bfeb0faa5383093a61d46b1a1b43984110eacd9740ea4a57b311503a498becb00326554933fbc347f5b2f07a26c8d1b8b94e960923755921503c28220178908dc0c6a8780f7c094270c5f43afca7ae43e71372b3d4c98a0d4f01eb42c68b15555bc44c3479a21737a956f85abb7671b1c54c31e440a270558e18737d56769abd979a9b24223af31452b34a5c2bd29b68f62b33c5d76d04da156ffeeca0ff8217214b5340e9d2de52abfc1b6bd488e8e30e9ad64fee90224a377dc9331b4637c921058d1c4532bac8c4d2ea6127502479b7aca7e1c2239129ae0c3d6c4fdc8d800d4498dc17003484d3e664a5f38b516eb692e0a681bcab82d977f0cd9424e52fc69c93cb763216e0ea4c0abf91a5da615d8703ca7183b975686879a21b33d6addc2e23062918525c2667ab780839095821c5b3af93a2586e0387695d3402e4bab849bb7fb29fd117e6f7ba11c370fdaf89631e2b745c5eae0a9db0440aa83c89b12508ce71cbdbbca0b1c45684c55414644019eac9a126d2b1eabf5cc36ae9fb200aef292ec4eb7d5af3e0ffe688c20925ccc20e9ac122ba1d4d5d509c59da5de73a80fa061b13ed851eadf6ff3b28892544d45c0292fc042c646a5d37473c89591c894d5ecf23948c9ec3c40b95180c8559ce316acb87ea2e9003453609e22b945a4e5c61c7951944f7e7e31b3d809e3efa4396f2a74e0532621ca335b008d83cf694c86ae8b01ec9b09b22977d37e9a330baa5f4d185fb19900c45332804ceed2eab798050447a338a5d6f3de6938f0649550e8b4ccb23aa01e0b239a044fcc40d4156d4c54bdf4b174ac88a225e9bc283a6d484499ee19393008c4a4a58cebb0113f03cf4039bfa146ef91ee705a3587269a810970b0a33c9155b2e1df18ba226c21c050b59f7ead9a3b83ef177c6970fe382eb37c178e9d639984de94276338b3be3c5a6b8c1556a1deae2792bb350c8a1e63596183642dc7428fe3889babcc63d97f3062da7abdb31dd88141b8e2c5c37bad8177b3f3264fb25feae938734092c30286064e48ed1870c3b3e88a5c5ba40b6eae130fa4b4e800898f135a3d743899e945dfa6392ab6d414bd23a5bd946b2346a415754d5719d36d2be2e556136c0e49eea36c1780c178701468e6e0da0030cb0e645e0b4199492906d16357c81b82f7a2634c38dfe43b4f1bf7f1b71beb64f41ddad4c05381d8ffe11e38e216af32a4e6c7ff3194d9863f5a76a94e404a504ee03385848632da00b050d19c41af2b95902a32a56fad9b057d59cd6d6fb41286b1cfaf10b4d6797f2637ae2c1849b6de5a68b2fc9e56c86db337437c90f056023cd0cbd9bc12bfdfc1bc0d2dc3e45d1a31a4dc00531066393dd4210e1208acc1fd4c9882259d6e00621fa2e414f9495bc7bf21e025834f7132f6c9a97bc187f1512d8c10d6bb717d9331572864bb8851442d7d744962655d115f4fbeec2a965a199ca7416a041cb95705c9dcf6d891c7f16c3e4ddc88b0b9d9833f00de370bfad5bc9adf87a36619c8522e27abed3889735c1e832d107999ffd3401c0ec5e719562498ada78e9e5a7c2fc13598b8c113640b0912f7a0d52539a17dd5920defa8df58f5fbc55319037564840e7ce2c440c239514e10a69668bb8dca12ef7a8a9eb74584d35d0f7a49e7f4fa7d7e30507702e49c725d29067156734205c76c3dec5941c8a1f55e7f6689eb3d8318b9c9773a08338489b1719fb650614f77e0d5d69795c7914c8976732814377af1f211b83be1d7669cd198f67e09e8abc1b6603e978d0c649ddc019310e7b7657d3ece20a67c72eb2ff75994a4051f74219be26835a6afeea53331b6b8252bab6800d3c4c28a2874641c65813d9f6da3865c861c9fde9bbd32887bd18429598a9bf622e5dfbbd531560654ea46df3dd20ab8b7f56992ec987579ce139a24cb9ded431509719f0dc22a806d12b12c8ff366a96e1bb099a414d91f0f47d569b73d09fbdb197dfd2e443aea125cc320a35c3dd305d8b2941ee853034d2b41f27612211c9f7a044e78f6b26f6bfd6000822f03681f901cdee07792a2a5f178889e347eabd3484ba2f518ca66b0af19b36ccd8b6106d8dc18641e42203afe20022967dae91e2a03a5b6dcd33185bbb0db191c4d4750c0d053edd5516700357f9d734a43e6775dc09cbd2289a775b8990e893eaf5797a4e78a8d0524bae24634e35c11879026c4afc8c4ccfcd82eaa2b540b1c3f8a1f969cd71285b41d67dd602efbf55df3872dd238d3d834cf38bf8d46834923e29a5df7c96a3a07b59ea74dc3e064ca41b96f77a0e879deb5a9dd986aa832481e3fd08944a2d02c373a6e4c1753615147d123435f7f47421f3247d90e0e0aa52ba6fa584057a471dc769b86511c19c24e19b7066876fdffad9f9509d053a14605a453eda1b1b490baaa2f23a1771fa33d14f05197ec5ab028c00e01350a1b5c12688d74297efbe801f1e43c8d9835c02ff27172393e5324cc2368b12ed0af68d73abea029f11a89a2ef152b8f07228e2daa2324e0e87ea6ec288446ba32ef4b1c6a9a1d55a110b8818537b6c75f3c7c1369dd589d80cc0517bcddc220116e42440fe2a2ef4268d3cd859bcecda48a672fcdb497d8cc9ed731ca2ffa4164eaa541e30426322e74204ecdd6dd4ff72498bd6dd1e9fba51b58bf81ef7c678f7f330c14942e1911412728d40664a158dc8ae879f8a974673b3e03e011b10b9c820e32844fe507a9f0ec304147cd51b268c616d594bba70835a2f11879c21534d375142732e0b487d8c50322357b579def49024e65d036df8b82542dd97c7d7191eaa17bc3b932aea9533c21f7cab6446165ff31d9dcb1d0ac362c766278cf60d929b6e30d1a055d2382bd641b755d8ada09dbadc059cdb5c9c1d7349a7cf5d97b1833b1a465f729311399479487a2f78159b72092079882e90d6165f4c36fd38450d64af5b491355eaafcb7d07ab9d1eb6668971f6d33ce06722f8b1a5258bd44301cab1d943e82887619278b24f1e48b008d74aaf37aaeb6234a04342dd300746c2409819ba58c87a2ee8c759d49ec8b78312a14eab19c14386a20ba03b2d46dcd88b789c46ae09540d2a132b6a025451f2f1bdd18d5d38f7b2548876eca8fd57830d81a38af84d10111c8e8d145b304e483b1c0875f4bb52f6ddc32c07b7800e857877e08f11e064651417cc3b137dee640a10c401df418ce5941c75f03b2881925854a6e98eb894f1361776917960b2e2e043d1fec33cfc79bcc124a03ad017b631b63cec695be73103d5a65cad474bb74644a1dd03d78058c7bf60b647fcb37bfd98dbfb9710796191ccd15c425e6d0fcd9e7b43622e0d70f1785da723567185a6a9d01133443aa43a38853c849924450fcd2933f52c5f1a59a301a1f7e9a1f4c5b41026db128ea49657dca8142bb114f5b237ecb7d50597bcdb7d034d6ff8a88b22ecef22a4a82ca7c46231b833759729b47fbfe1ba1424a902558026bae869a228dfa7be4c99ac7d191f616bb92e4515ec0128cbfa83eed26325c831b438c51be85c76367f841b2ca5776393ba08f400043e3e460e13491040af266d0dd0349e04100f40161825b6300403658d4d0fc08246a20af62cc66f9bda6e0bffd6922befb6f82e67ec7c309c968d07213757f6cef29ba53af576def4c5481bf15bfb24d31957119310210800840f3c084014007400e50687132f572a11bce870e6468d0f2a3c38300595aa0347b680a07a42039b19b8e00d1b37b4b851e580030f5cd0c103b4e0645144278b22a74fd51395aaaaae20910503422491458a0851aee860e1020023c07225009d543ad28a2db4a8aa2c90d0521da12575eaa9ba5499a51e291268290d90527a9fd2fb5455d55fe95ca9ccbc90c925151995197c05144fd45079a1804e15422ad44974834d38d9a4aa6e3429a3aaaa28379554d54d269754d58d0d2adb735349e5e5b13c99d32459a9aa9b1a585249ea64a2840695e9c74727063414b8a3ba99810caaaa82a2aa2a59e9506084aa9aa4aaaa28379254644aa989fa323335f2992fdcf0c20426b0874e0cc3c513d00a18c54a0cf088a4aa6e2079c46752934f96aaba71c490460c99a969abea8691450c310406882862c88d9aeaf4657a4aa62ea99e921827c6c9f053d19050f34f262ba51e534df554a9aa9b337e82a40da66aaaa62fb6f429d4db50553789205255654e262c69aa54d50d1269aa800953553787185255376ebca0aa5c5055d54d2137845495ed190d5259f9a93754d50d0a6e0469c1182da8aa9b400061411d52d411b402d3fdc38faabae9e34b97d6d22fe874d4e1aefe6796fa8637d923759a405575a3471e55750af2f1627d7a48566ec848f3331851553778ac49f36556a7f919ce680fcddb121295eda9aa9b3b6eeca8aa3a2a2f74bc31871c3a6be7268eaaba8143055575938237aaeac68d9b3658993a53605050bd0f9d25315e4c3c3ef3af9878d048eb1364b2e17fa6f4f109c2d266a64c1189443f158d89470cd03c8579333d2893290cea1f0b99520fcffff44c1f2b41a653494cea6402faa1070ccafa98b4bc0f9d29134f55ddac610ae3e31384e5942a892989a9aa9b13984009244aa0461a4fa07173867dfb25313766944c5bf8f804f1942629cc9f4c271390e9e425859acf2545a5aa6ecaf831954e5852a5a73fdfe56b8fa98634a720d4fc539892a9a7a7d4f363a9bccfeca93d3648061f540f99e7e2336b4f89543fcc9be94905d57f22d55312337f262a68861b32c6a8aa2a4d894ab3105910fd54343a2a4ca1a3c2990ad5c39429cccc94292a50408556dd8451552310010a049d073851750d0ff0f20059fd5434ac0614bcc16f7837b81bda0dec86bea1aa6e42c037fce9b5b40318710021607c7132f5dc80e0035edc74c1c5165a78808a2ca8c0a2aaaa28371da86ccf15567403bc012d54414d3e55a8a0820a2aa8a836607d7a6ca8aa1b29fe4a55dd4401857d1a7c7c9eb0efe3e3c4a5c1c7878a8f0f95aaba69025555374c94826e55dd2c914455dd68a0b23d5b94a8aa9b244a269ef7493d0ac5cce8a400001d06e0e006896619787c045453b534f364441155490caa99992953da0c0ca65bda82da0243e9b99c4ca59e9f93a987f90343e9b9fccfe44133bbfccf2ccdd4b430d82db667747a6ab74c99f2632abdfd31954ea6d349a25028ebd363030c13a85f430f9952109652d0b55bea96c7b0a54ed34b1a6baa923a4d20bb258d35558101866613682626852a99acc0e6201894e6cbb417647b9a05c1a0a380286e78187daae774c6ce3f55d58d0576a8aa1b1d6e72682fa8cd8c74508044078542745058b38294293f3da9d1fd930a288ca95040281894aa5f03aa07880aaa07689229f900fdf4a012c0c29c315919a110d141c00874100081aa9a00eaada9a4730208b2c0a073424c3d181d13e61882880b0051020eaaaa9a29d4cd179d127caad203d160e2d12901842b6de81c20890a069130848e0192a8aa50bda900047c2a1d0380803a89ec088d4e01e0a84c3a05f0e2820b3a0510a1aad094a60e01e8d0210023a1a6161d9d4aaaeac64b55ddd05055373c5daaea86cbcd0c5575234355dd6cd14245478417543a2274a0d2110187aaaa48a81c5091107544a852e90c000795ce00e2a87406e045a533003495ce00be543a036095ce001050e9848049a513821b954e08595439981852e56012489583891e517cb6801163e239d959c5ce2a28142975eaa96267953f05a5827c7ca69534a99e5210991e144a023d22d47c3a7d52a71e5a4b534a89ae70464446f42aa4296d99a79f27e99c73ceb9d65a6badb5d618638c31c618ebeeeeeeee66666666665ebd7af5ead5ab57af5ebd3ac618638c3146082184104208dddddddddddf7befbdf7de73ce39e79c73aeb5d65a6bad35c618638c31c6babbbbbbbb99999999d75a6badb5d6e218638c31c61821841042082174777777777fefbdf7de7bcf39e79c73ceb9d65a6badb5d618638c31c618ebeeeeeeee66666666e6c511fa738d35ff6cc141070a505555f3f42ed49e1394102a1d2836950e8e25950ece23950e8e22950e4e20950ece9a4a07c78d4a07e78c4a07870b017c00827d1f138ff5316929fd0f674c3e5f258d4f890631b2aa6ee4cd951b2b15ea4b153bab54d58d04aa34938b89e74baae7a7874b55dd5089a1baa1004e55ddc070f34255551365ab04235326d3974fa1822609cdff17148f95590528a88c0955ea993f2629a9208a7afb676e8fc562bf746602a14e9f66fa48f1993e33c807eb331fcc9fbcfc7c6acb8d04a65ca1c10a8f1c8d2417315768e832ba814a9729533e35c94c20d309888b99275332f9c0406686f1f2654c617c82aca90b0c82e1e7535bc8987c6080415bbed443a6243f99610515aaaa42e37312812768e808859a40370cb85940354b3d3f3da78aeab13fa879e6e4c94e55dddcdc84aaaa861950239f999ab78c0905839416263053d3a28050f6abaa425355a11c7c5255a814aa078dec449066f6643a83424d2ff653261e526af6dcff09428536d1a4aa2ae85060ecac02dda366153babc82f5ea00303a6aaec9faacaf6986af8d307f9308168d8a1bd1de4982d604657e4982d5ca86cf922c18ce4173161a8f064d90266a26cfd6a8746832b29930f98f682aa2a64492529930f184e60558d8080e69429919deb136aca9411d0263f952692d090a3890e3d14368f5015005ec8648f1c4d4e6800ea24428d4e0f9449266b5455059bc544e12293285535654a26378c805054c6a4a922a664ea41f598e9b952a2720aaad514a2c10caacae77492d5e4e34385861b30600839c0a605958d1f7ad8d8d1450dbccc3f0901833d6c70c4246bb810628c0b28600263a4981066d63892470a50ac2044952915281551081b42088085131ac179020a0c0c12861104fc71720106bc0883061962c861110cfc1c324318d5066e30e08d4c20892a280b0cdc20c0937885266704d1c7146b745881092e415871a6833316f08207415429cac06142151208c2052f635c282cd904084e0450c31aa84bee00820e0fc4b0630e162010504451a28c1f616e00040e21a882e500486402c4ce117d68f14307a30b5452e603127402b95c808d2b8918018126b05ce0889b47424abcc0820b78f1631237a58a175cc08447e40234c1c1023f387204ce092d6411e20712f80322059fffe1024b6880074886e9072c0190c01011b081891f72b8c0c1d5c01840690c69777870e6872e69c080620b0948b1e685342701707141045c709a092c42002152ac88340038a1ca1e3a6462838605403820192c40068d073690441a61ac2fd09019c19415c2d8600d343d83350b10410e4ece7cb225860689163a9c5933e58a3964808133ce6c808e90c51bed8033a39b3011e8c408a0332af861660917b21863c6068540c00b268228801915c491480f3fcc36cc2841c6111aace171c14c183028dcc0050c4c98915205036470f9449020496e3c5964843c2c0952c38f4f78ce448123680830fe03297ec804c9f0814012f162c6074105a0e11021502a98400a062090a0e5c8414d899185084956608516a92016f42126f5c3015254827c3824933523a43ea0040154d80046065082dcc0881869bee0a0ba50c4040cb823f507caa7036fe09cc210817a8bac3f7230c3072ac4d3040a88d107273e64b8c0243760314e5594f050628a4b9438511500a00b2b9904728ac027272cb6b0048c0f9a7c2287014a68c2101fe6e886c80f8330e283132660c393287028e3c30d52b8c05446a8c1871444d08038aa437280284199b06853c40008052b38a00073841106488d9449ae64918415202f2688f92388e807500973b831c41a1d8430359205157cfc18600fd31941481f76745e30fd40a394a00323a630c913a6b050260b332611169982066e04d142e905380b08e2063391d2175940524527440851f241862f89e080cc1525098481028bc0e98952070b20811c1a9003849f15a8e18493401f403f598431401b5230f2c8cf1d81187854a161929f5e400d53b040a5e0e3492805283659c37dee683188c10e4eecf091020a363a00ef5881cf0e6aec3087132014e1f3803930f03e78c195b141480f0b982c0b6552d003229e08d141186592102304779936ca803963c5252ad4b0ca28a0017164008c4ab8f410c92436f088263ce8210d4a5a041c04517a10c211295a70e800d5c316352500f24399277a18a1a78c2a6b6a00a14791304b90b8b822484f18521211001f532ce9494172804106a1637a6258439131c6e031a3c78338c8fc40860c2420b580cc119dbcd18231a42e14a005fde48a165299cfc33d992200929b244a0b794c3108c92609406c8872860064f60801054b42b03309192a7c40638c0c12a0049979891366a4204320645a60230847a05cc9c0cda4932a24e9c103f0ca4113a1411b6770729be821078d8c8878e2da90c41e2640a30f102e0300116493273e78e169a080148cc1009af96b94f005604e227923b2a811e1923b64f03c8400c2130635c21f808c2042ac3c61c532f286268a3c109e35830a1cae1b8ad460d3c811beac34d0d82b6e25650339ecb022b4e0345981b4452d44911a6ea812c327150469a0c1820599ae404f6ca08c1947c451a708f1453ae2851f154a8bc02589e40bfa0726604694485143b160000a3970a40a84be1a8e5ca1a61a01e51dd4fcf04785c4ec640d209aa4d14098764cb1d2c2133a0832a358e3dea0401068a60e2825447a7472c974801c8134c084833978a88133a306872a423cbcc1001ba6a8608907784082670c11120f20010f5fbea861892dbe5cc243025a6083d4e304331841724822650230b2649406098e5032258d078c30c0c4070eb0c324a79116a022d234e2460e230234e1445ea830c3028968116300486c10c20223e8200c3428d0d9c30229286222c0c30b04b1400c385776ba0021860502c0c54f078b4c9d1d0219c2065802138276e0e28e11811dcaa063871e5e50440b071af9d9a17dd2a50344bcd8b043a507100b6640a5d1218f444c9044e74b0e3a7040082d6d507901103acce682037d6c593a40404d63002322e8924326373a446202292fe41047163280a1e3912a72602202565020010f98c8a1060d6431850b12f8400e0c881284951b7050c41819b88042c921025a8c3941014e7020763030a688335a385909e8315d9608012625aca1610c095ec8808e11b8a0000e8b44f2464f1825ec814319545c18809927c8c0014d6bc0179b9c2cc1c18a0e924c120115e2c021844e72d068a1e26e20648d0bece0a2b170c3070059040eb1421b379850d0734955a58e1be25c0014952b73034e1735506c074a6cf8038615309183044cd870852703a0c40391286283cd03e500126630840dab0b4cd620c0ceade10659b881c31a535ea8a10e1956163ba6f8a48628a238600b1688a0470d39c4f0c21e46f0e8d4d0803d3e79c1111282184b80f4b010200005c4b401891880a041210f3119f84289213c1cc00b311578810d0c90069648c42060032868600d1f50611e31e400254e2ed1210c1a5bc868c01473041126882a657881c416a23059484b9420726940181d3602b0c31d402880392493204a481a154c0836d921123274a0010c2a0224ccc0862040000343194c945183490698284b7c40052af0ec7c01c48b183c0a0849c0972dca0c20002be070c7971e069c7ed828237e69273891029125777ca90cf0811e37c4e153013cdc48448c38dc0f1598a28a126a682caca9000f6860903387989f0ab090838d09a088b980174c0ad0814d70ae502f702052800d3c0f9ce0450338a0a402957432f222a68a06bce0012e08e16501f2048b1ca1822b6898c40b15fcd1821ce44083094ed82304395718800622cc104406218c904303172e4b10600b0a4a4083013ee04550205344c1b3080288d0e4102b21e019e3063d4c702082c07346c4862087dcf1024f9525d688d1c81696470063a4b04cb1628b2e83bcb1c20ad6fc5042172f3c692384d849962e254a07234f6c72ea0269b889010538c1a4cbcda907893ba3e0e2470282be00cae2042e5634628104d8e08c0270a93168a411396c70858b0b867451c259e367064e82e862890778b061063a2c0c631ae9428019a0f0c28b78796104338c2921063d9480032a33ecc000892446c0a30f192a51c3c7e790120c32b0c14696113810c492e188c90233877802870c153821843a30603b20c30916c040943ca63cb1c51147988b2ed6a0b69040cd03d250830b1db600d1c1173208c3ecd882a5cc092ab1a283165b7228b103073f82e0a2c5103404c9e4006bd268010313347428c2c5d472dae1066e4209906879a1ae60c91c3a7ca1050045207149163224200b0bfa008405037441822c5a90b086151b7a4ec842d2e1c48f345218c9c2aaccd31d5d8ac0f2c91f58484208103758d680c10803b0e09105960dac5182124029918065d404254944396307cb0a30e010b960421279092b72834706598084e30190b8a0001d22a41285f8d0c8276a42320c19979ca06f9c94b2040b2da8108ae28a2468aca429c4036a5c2941044277c040864cae0c51891f1d74698114576630a1114116a1c4cb950298910034256022062b30b8a1111ea278a1b222461c3f6478d65456cc341b8e20848bca0a9539d2b82243545640288389035a555511c40d3a5080a2aaaa78b1b2702486aaaaf263c2145eb816339154555525c4c5480a1f7c7c1583a8a93a7f5011a91962931ee648e28918708861870295e844d2502791a9272483aa0a4d52552149626093490d62b0880d22905cc981c401901ce0914aaaaaf2f1092a4999f24069528fecf1881c6c3ca24655552b4899d2420b2a3c12c523524a3f413ea62a45ca977a82ea9f50f3e7c784e649644ca75310aa64f259e1967a22e00204a49c4c5278268f9494898c0a523ed553eab952509f32a5f9322b60e1b5827488c05a6b05e9a082141f130f0c086287167898c2831429f57ba02629a5799a405868904b20b242498534a7393a4d52f579d4271d78c0482a00593072800a75124589a44ae3730592aa0a3d525521471aa974083adda0528a06350b8281155525a505182451c180c443144614a1017c7b7ad4af51e48caa52c48a4a8d22687e824aaf884f05347f14d141912b5575e64b8a2c45105055a99e5250224928825349492492549da749aa89ace1414aaad4631aa3aa2a1ea49c9ecca74a3d89609188143cf020a534dfc764a269e6e934432e20a4ea0245225110b9529dc6209244853a8948a909e4429a542184a04e2954d01729a4d40492e2e34365ca94434a90c269934d36d904c743b00028691842c2c9828b9c1720c0054b141283e75a4b2167147246555528346b8942bca04ea2917d343db7f6a4fe8794ea394d17720a69a1aaaa1e5a8023495792470e10b040212c6d5ca0068014e0051ef410e4901fb07801124c6280630a2d1c998013639c3c8844051ea8238c287450224417105c40490a6c00c317141486bc70b282094daa14385a00c2c308e9ac44d27efca4206089161cae00a00e141c507c6881046760528227e0059b3e3a50071859d8408192068ac801171e4c0004ad011450aa08a01b04b8e20b1db810400f536050c0a803463c4ee208440183cc466c58c10d36d0801642001a41849501470cf1e346082998cc61e60a228ebc40430e9c2064053d5c68c0044e98a28b1fa838608f43bedc88217a637de0031f53a6543983f0902348253982b4207532512fcf4c554d00e5a54a2da5415141fd9029f5d4521ad44c337dde96ce98ac8fc95447a39fa0d2c89a4aef334a731a350b22a580de0692030bb25bde9aace400424455553950a0a972a02053e54091439503050c550e143b550e14285439507850e53ca1090823ecf054393b3054393b2c54393b2654393b36554e0a975439290c52e5a4e04695930218295451e5a4a0a6ca4901a8ca49c156392984a9725278a1ca49a105112a110470020923e4ec814295b3470855ce1e559593c3ab727240a1cac901842a27870eaa9c31995439636650e58c81a4ca19634855551f88f0418e1a36aa1c356254396aaca872d468a0ca51234495a3e64c95a3c654e5a8d1a1ca5193a5ca51e3aa1c353b558e1a0254396a70aa1c232ef9406700690c51e5a451ab9c3472a872d21053e5a491a5ca49e3553969ac50e5a491802a270d01543968e4a0ca41a3922a078d47aa1c340ca972d060419583461e550e1a725439689c51559501a28420001106e04114129ca8724828a2ca210155e59040aa7248a8409543c2952a8784ae7248504095438207558e017050555508032041a70023c450e58c30a5ca19210255ce0806a87246f0a00312a26c52e5448941951345902a270a0aaa9c285b543951a0a8aa0a04025426f00451e5f094aa1c1e2f550ecfab72781450e5f09850e5f08450e5f0e054395d2ca972ba3852e574794195d3a58e2aa78b1a554e1730aa9c2e5854395da2a872baa8a972ba9ca972baf454395d6c95d3854b95d3654a95d3a5ab9c2e0fa872ba2060002640f100040384e08100a0e87c50d928d24555d9d4aaaaa2aca0aaaa901f7d4409f111d2a3aa42795455088faa0aada9aad01d88f40185263cf010b2a3aa42755455888eaa0acd51552139aa2a14475585e0a8aa900aaa2a9482aa0abd51552137aa2ad4465585d8a8aa100aaa2ab44655854e505521135455a804551552a3aa42695455088daa0a91a0aa42675455c88caa0a9551552132aa2a34465585c4a8aa501855151a415585445055a1105455088caa0a7d515521105455e8035515f2a20b1eaa8a86c447988a849a6672f650648f135495e8b2b0470bd500f418a300555561a972f4085355537818d5a1072187d8f42149aaf47fa2040f20aaaae2830ba04f957a804c61de608490353720b1a683999a57a8f8cced01e92ed29ff145978574ef0e5e76f032e767c742c6381fe44af92ec7d63620d3e98a4804643ad91879c68c6c880875c0e36bb71c5b6b31d6ce2dd7f845669d2db7f1766b96e41c841ab12882d0159242b7eb42dbdfd7b6bf5ebe78e1b2b31386cb18212b247cb479aef97cba8ecd5876acdc2da9cacd5684aa9071bdeb4e7f42a6ae4eb7588b1015125edb6d577d0dcefaeca8343f0307e4fae9ded8c136e382ce4a22a0f903d712a12964dffbe084d7c666ab358f4aa61ed7a10dc8cbac7a7c8ff1aef7e5241f2d4e9d4ca8169242d2f55fa7bfcbeaaf652514857ccaf063af5a2d6c8b35fc094121576d36d245dd79837c6d99d01392ff3dc6e5683387d435c9f971979013f2237d2d3ec61abbfa6f929ced97ce9846769a7c44a2d493118976c264198976ac700d229148748345a809199ba3b17a6decfea28bfe290865f2a923d823a0a0511993c9c77b274c969d0aec58d9e1b21386cb4ea4d679c68ccc849890955b5dac5fb5fc2db2b784bccb42d63152e76cd36624e71deb413b3f3d2494c8cc0ef5a09dd5342099ed75fb353a2dc9d9c767d656c2d22125247f6cf0ef5bf49fbfbd9167cc0803a1246484afb219dfad3036e47b480809d9e87bb65ab7ee2b6c6d452291a8f1882509654046beadb1db2cf3ee764a721e313b227484ece6dabbbf5d6b738b1dc919161152235d8574b57b1bb4ec7d3ac99905113242728df5b67ae99c8bda3549cea3d83646848a908d297cac55c6567cedced5a41011f2275ff7d664f67af356434348672d8b9555c8baf29d6cf16a663c6346636c72202363b7a9adb4454bffda2d229148f44e29206bf389acef8e3a7d7823df5fd413d9b3ade99efddadfdc5d1cc8eaeb29b5d021a573c6ef44ce77ec0ceb756ccef749728e3b61b2ec9852a52d614e58ea038111899c91617303b92c63c7d6fa3b99c7fb2467d32dc53022917367baa59ec53c63463643d87022e943587fbac9dcddf87a13c9beb827b3cfaedf3a939c4bef33aa6f26b21b41d6e479bbc7edb16b2d46efd8dcfa36aef03ad88d17e4d64e29a04c24d74ae1a3d54d47a35b1713b9f8793abd975dea8fd64be4fc6abbbdeaac27df586d202953a6f471dff56b455a03c962b3b766bbd0dd63534be47caefedcb78b6d977b25f2616ce6e7556d83ee8f12091d5afad8795e7e6c1d0d647c0d273b7dabe1737433900c1d3257296595bdb34d06d29d2d5f303277dfcf6d12692bad97d2ebaeddca964922fb3dcfe8166cee41373b06b2bd3fda2f2e8e44beffc9d87cceb13d3e24f22be3cb2c4ffa17be7d442ea7b79b9df741d63f1d910c29846ced6b35d6161b91d32ee66c8bf1b5661132229939cf76d3d782eedc223993523d67da4e982c697e06e7c87811499b41f89e19ff5b8b4e18486729d76b637cdaff1ec4c14611d9a25f1b5bbc717aa37d13913d618bded88aed2fa411115963857f6757be91697d874867c6eadff7496de3a686c8f7b13fbee3799972a967f4a9c92f68cd9d35ec0623636cadb89c6f377d5f994d6e18a18d0be4abd7b5cade64d8f7d626399b2903df0b6c0a91f417df45dda18b8e9a2933baf37d468d6b98c1351f3684c8fbed7effb3d5ad372b8d3eb34483fdd2191aa0f3b3c9c46610c918fd592f33db7b5d3fc97964b25010f9b1d57f38d933bded1ac9f9c9d83ffd8f6b934d0b64bced2364decdd148dfb5094436db1e73f7f36bb4b5fb3e239ff929d4a88c4f100dc3652785e653a5d880c8c66cd9eb1c64b7fcfe6481746f19d6ae8c4c69c44fc6caf95cacecd4b0636567861d2b3ba9a02e22d1e9cb9ce6cffd2f6f4d3c229148245adca12c6c562023add07dadd0c1a6eeda3fa46beab732aed3d6d8aaf3435e3b39ce06df7be60ca148d41ecf98d10e367dc8169d79ab94bf55bba8e32376abbe66bcefd79b6c0febecaf369fd77e7b5b367ac8e68bfeaf5e4f695c9d87a4333e67b5fb51f67e2d3c248597d1b81aadf05dd3e878c68cbed8ac91afb2bfb996850cfb710dba43b2fafe62a38d5ad63e4e3be4ad95427790d978d77c3675c8d9f03e4337ad651b3a569bb6d7c777b7fa754f726ecf817e7ad8169b39245fe675be77d7bc2065724806e16aec686bb795d61687f49e37ceeadae96d953938e46d0b19be18a1b73a79a9407a3b658f6fb58d416e9e02799975f771748cd1e620bf21fbc24afdbd670a21e4e986accf17f469efb2abf6758fdb9071b9d7981bbff86e9b8180c4b021dde3b3689fe3e77eddef41f35a4e7fc6c4c502362890d3457eebed854c2974dadee5c1660dc9eee3b56e51a63cd9634cb23981b4f7bda714be35a37de720981fd3098b4824129d52a8f713542263630259ddc7bbe8bcf1d9ba58132312994eff43c95412897e824a8f67cc88da944032b5cc58b74b7b45d8d6a9211f5ccdffdd9efefed91b45763669c879d7b5fc9cbf66d98a15cc290586d94f2954b44143568776c63a1d3f830e6f2a28a252f0944231664302e9bebda53f1dad17b2d7a3d2fb388f7e4ca73b4a0364aacebaa09d303bd405edc47e9b33e463efce0563e5476763dc31d898216d735bf131d7abebf5fbaed89421195bd5b2834ce18d8d1f1972bebd7fadabae355f704dd218d2c16ad9bfddb7353ea3366248db16d7ea58ecf5ec793e3ea55061c8c6b8b2d5ce42677ae74ba14620a3adbfee74d877be17db64a222900c2ebfb7d667f45df4d6e3b33804b2d974b4dd05e183ecb1860243cec7a8b3e7d79bbd8eefbe908e67e5dae67bcd4deaaf81407ecff9587b73b6d7dc75ec03922384ab51db209dee8bb51732daebb736f7e8756abdb9ee425ecb1c832fc65e8c1f739233b3db7021fbde5b5b9b90edadcc366a0b69a9db5e8b5e067d5e0799169255d76873ab95bae97cdb0312c2e99c6de7a8ebb7dc1b8d5e67215d848f757bbbf745e826c9b9b1908cbabaec5aaedd37b81e0828a803b2b179fbb1ba384eb6ba919cd13c6934e22be4e3b6932d86edbe3bab24e7b74242167bc16a9f6d6c6db45548fb1cf96363874c69bf6643856cd35116dfb436b6d9969b8a0d07646bbaea73703d63f1b20934856476bac8da2d5b6fad3720a95df4a98dfcced2664db6b13ba550cf460ae9fcb677976b1fe3b36f24e7335f62229b28648b0ea963ee699bfe7250c8eb9a6bdb137adb60f3847cbf7c426691455eeb4231364e48e6f119b37032f6e71cb46942321ba9fb7b0ed95d18d9061b2664bb3959edbfb7b9bae23cf512f036aff49dc7e866842467d81c344afd5c68a3014999b3b1da3679797597c26636b25182dad7ac9baf7b6babadbda0d1a34e13a8f14f508975b14942424addf39eede884feaf99161b24e447b6cd6f6ce7be685792f3c87e6a642750e4d3a722056c32203f36f7eb0767d36b7bf9cc9f9ed84eda1c21e9f416638c73c1b61d670ad5c325daa891cf6fb9eba87becba7331f510da18f197be7e0b2b6377ff246777fa52694b189b22249dcdd9d720f3779d55b86c88906e677b2bde192f5bd6dafb000585593643488eded1317bd9b4765d4a727e2f08219b42b695e975d73e73487276609861eae7320c48ebacfbe70bd2ea5edf45c54e2f2211eaf4f0f18c199109425277949d99efa29651c8f835101246ebf17e5ccfb3d7eae878c68c6eb8007bf77d4b238bbe98f1f0037bfae6b5d75775ae7b929c194f1a591d53667f358e73c2fb91d1c835ebd3c6d431e338e1b5a59e33a52053e98c64cd6fb3dbb4cdd7ee3ad04f0fa366e4fbd7fb6cb3f4f6bcb6996e694bed294d2f2291e9967a46ce33667483e4c7e7206cb82cb3969fad14a3fe313ae1f36a1d7b137e6b3c6346f42461fcf6ec748c6fed9ecff8b50f921d9cb5d6ebec72b1da26f908d5d31c81246d8e45b675b5fdf5ce49cecf8ee6898ce36637c9e52c6cd7dbdfb2de662339a7d0fc68f426a9517e9aa4dac094e47c1e5dc76f08df4fd785e9f023993d9bf7c657794d6e2e12f9f87cc5c147dab898b16fabd61897632467db337aa03429df099365274d898a4894a63419cf98912c239dc348698dec7acecb4e7276a99feb801e2a9c74be3a3bc6bfdf5ab315d4236fb3e9188dace37dce158ddd42a634bf884422110ac83462e71933b224697fd978e1b46ea76babebdb91293572960019c9b61f840f2e77f6c64549ceb614643a8dd2341cae6c0e36fdbecb39dbf7efbd742f423aaf3b663e9d4267256ba6cbcd05adfbb71e906914d971a9d29dfd08ddebe209a7ad13cd63a1d2ad6571dad5d4adbaee2239bb16a6a49523a4b43ee6fbf032c9b961e441b2055f7bb3e56a43662bc939857ac75b46725ab7de5885375a7b473e413f8b5743d38c4c4f15f8266001e98b5dadaee16cd6b58e2467d4083299524f99b8836490b21a1dbbd1d17921243997dec7967ed4da391da47d355a58575cff2cf446725e7cc60434f209fa890ffa4f50a94a0eb23a6f3e99d7756d64beb28c61de2064fcde73b8165cfde0cfbbae8bb44d86cd5246f2d3a7b6581189ecf70099aa48841261f9b2d38b4f29201b2f7090eec6cbee82cb1d36ff5a32c5af251a4a581e440199a6dc201963cf9b3266ddac702e9273ea64a233051b245dd77ea5aeeb5acdce78ff8b3f3241f4ad4bfd5c0654439b2dbeaff6d8aa8df11631acddc8114e769fe93b92339b214cc3767ff9db83efb335cb004642e6b5b95ead5568e99ad69a22c32f92216b67ceed5dd0bd9d24676b9a5201b96875d87332acef31376b4d2b7a918c9fbbf13aeaaf2d78df8a34c8e5d1b9d76ab9cdda3e403f3d23fba7494241e791ac76bc8eda9fac55a7df2d812ed2df9b55a6ccfac1cbe019938fcf24a1fc71911352c6bcad9ff5ba67d1f4633a01714f9941466b6784de605b4fe773246720d3c9f29241cefaeab74b59c3c74c17c94d29c6bd45cea697c6485ffbb696e351ed49cd14aa99b548185dc70759847def5c8fe40cab649190fe7cad5546fbd6cacc452462ee9402b2018b0cf2b9e5d82337f4175d8b0e36d826ec5eb13a48ad65776775900fd04f8ffb092ab13357e4bdeb6b7c56bf4157d91289a043d1e778c68cc45891943ebc94d7a575b6481fc999f94187a28d67cc685591fcda73a4ff28fcf6f7929ce19f4c564eb306da8d1fcf989153918ed2d6f5adebfa26751c8374cdf836c7ce5f8d6e35f778c68c2c4001c978d5f5de63eb0e36cbee358d22171824639721b4b131b7d3757b41bef7cb6b8d8caef76ec4f83dae6f866d9980746cae8eec2dbfcc1e4e92f3a89e66b35a4a836a572420977337b276d0c50b298524675732f9581189be64f2a9229148f478c68c729822a3a3b327ad14fe6c2d5692f3a8f9a57e2e7b51b665b6ff3bc2e75eab90e4bcf8ada9d41c3315f863328d7cec69340a804b7be99b6cbb3567f7da48cea9138ce149e635d2b62e7d4fffb948721e3974b2b976d77467db4d27646f125e1bafb34c9b655ce122399f319dc88cb819b338fff19cf6cd56bf929c4f29545bf6b5f565cc1ec3f6d1c4b2b5b5af5e76f3fd6391919c6d69723b0e4bcef6d52cb6d77ecf9449ce245410d0e864ba8fca8e959d30ee78c68cb8b840ddc6e9b6d95b5764d4919c177faae764830da9a09fe578c68c7c10c9f7d5e07ddb0e4ec6b0ee84c9b203ebd72012d5372312bde625023dab77e4f52fc606dd49cece660bf7c6c91e75b6eb51071fc979274c969dffa10715b41386cbcea8d43302329deceb530aa80608ace88e3dc6f8d85b8b19748f453f667c7c44d29fdbc2db5ebb6f9db324677e282a31f573d99f4c75061664bbf7bde5ffeacf36695c41c215dbbdd63a84d0dde848cea99fcb76c264d9211344ff8a4894fab922d19f4c1535775607ed84d9c1f26567270c979d51379e31a32c2a8c5041a7d1c88407a0993f0a70008f4c3e644c3e253440ca0e0352b03f7aae5960001bad053c408a0a0a5001851612f00004b070c232618512b8bd041c008de94c0a05129e6b2906681ef597993e7444a6d443424d929402f4298511460d2040ff98eae8f4664cf54fa3119779ae81eaa35c27cd689442ce03444095308036994e268450a64eeae36362410076fec9041050f880474fa6040f50080800ab10a5190080133a80c23f28e08c4ea6d444c00d03423c82371594001b1e3d6934aaa89e9f510acd23a04a41045216d9c2e67f660947ca222df8a0c2c38a35546e30e123022d40808515547880031ab093821405a09000049c6042090720c10023104027478401046c04347f9cd340a805070f19e183f455fa626c8bf55a237dc659efb3575ff79af60ef99546ebbc5fbdffcc720ac70ec9fe70fd7d8efd9ccf661df2216cadc6660f1b9bcbd1215b6c1b195cb3ceb6dc6c0e1967b3b9da5c8ddb476e39e4b20ffa73abe98d5d6bdbd27148fb207d1e1763eee5cddac1219dce66f5ef628eeda3ce3915c8c6cf5de69e675df13e9802d93ebaf7e86c1b9f327ee7dc1bb25dedd6d863745d567b3a2603c70dd9da7c2dbee6befe2f5f6d48f645df6270be57597ddf050e1bd2adad33325bfbab7bab3a14c8be97bdbd8debce35b9ad21dd678b915a6e91ebbcd3b913c8e69e9935d86cebfa80d8c9e425cda9081c13c8bbee852f7ad39e5ebd1bd700b959c129817cccdad65ead15ae479d4d734a956453433a4ad95bd723e546a3a53869c8ebdeba8bae7eefc2f68d79c48dcd3034e47beb413aa1531ae785b44b0f1015c7661c9b6167e09040f2c31b29bb775a6f3e2dce19d2395ccfbcb277215f6799e09821577c8c99bbdc6e6b8b3111386548b8668d95dec9d5be792d18a020fb57ec0305d9b7386448f77ec5386d74b0ed7b8e3306fb481fb2575bf95e27399329f5a4b18b5d03cd1f86c211435af67cdefadeaab5e17c91080c9c30e49b953df7945d582feb2b12a19e17382390add67b9f838b615dab7614382290905d1bddf2ba22ebb99e9734299168c469528d054e08dcebe5dc7b8dbdf716b3d7715136d94e66ee033860c8f9911f7bd67aadcebe2e9c2fe4b35dddbc8dd13b2f74fb2211ffb411e08040d67f6e0f79f28a743a1a3f205f8571d9fec76e9daf5d2fa45fdab8eb75677bba8b5d48ff7f87ed9ca333dafb70b890b1deb6edec5cd1dd6e6e0bd911be776d3adb72af510bb9e67d66bfae73ed46d6b68c81e301b920fbd3d8e06cde62731c70b278cd1c9b411721f3089d3be8f7c1ee785bbc74da1971b090f55a5819ba79e772be1c4e07e46c9572ec76595bcbc28b734573ab796c2c2e5e90d9c586ebde5baddf0adf46b717c70ac9dc8bcdacd176d545ea168fd6c0a942beebea31c2d6a863d45e91c8c60d1c2ae4e555fd59d6dedf6669243903fd9c4823e652cf24393be31933b2000e07245f7759a57dddefb7baa00970a690cf6efd6a2bbea5ae2ddc09c365070d9c0dc815f9c66ae17cd6fee2c291222ee7f0318b6fc1e7b0577baeb2061f3ee4d7044e1492ad7dcfd365e040212f74d15b838e99ce081de709f9f6fe64b666f3c6cc3921a37deb51d8e8743fdb5a4dc85e3cdf35e6979faffa4c48379f8d17b21aff3e769f16384bc8f79847af971d65e6188e0624d7ae93daf51edf9b3d8e12b2c5095d5cb3b91527732d095eee3d66f65e7316e38bdcdc7c4eebe03fb8629d0f719090cc229dcf0d9963cdb55ff0089c0cc8daaebd375f7596d677f408497badd6ae6977fcd7a61a592ba36cd1ea6c2985d6e11821d7d7d778b9764e2d74d44a15384548cb16379bb43e17fff21389e28819173844c865ef5a91fa65fb8e7ded84e1b2d3c2c019425ab878f9b517d2169f7324672c35385fb9c981ec3b2f5dad5158dd5f245a7dc5cd27f26b65bbde9cd5464fa463f6427899dee5d1632ce30607926bbceb639bb1cdafd3919cdd290574d389f49e4ed9efe5b52664113562c67d03b91a3f165b74eb23b3586f389196de777e19a34f241289dacc2872e06613591d8d903667fb5ad8dcbaa589eca68c9d3e7cb6df61cb44becbf6b69d71c6fada2926f2ab9bef41cab0bec56223717389fc09abbf45e153b760db40b60519fa73f4afc37e785303b938f6ed472dab6d29642467c6cf12d9903dd65ae3c6ec851632568974bf1e64b6d4597bef3546899ccc3e75e8afa75b76349076f9abedcecdf5abd0312e6e66202d57bfaf3563adfb45efe2460692d9fb9ef96d4f2d6d94c511c39e44ae489783dcea7cfeceb52432ba63b6bb39dbf89feb18c8681f7bebb8ff7d3ecb3791c8b66cb5adeb64efd0dd4022216d14c6b7ecfb4521756dcbcd23f256c6f14dc81a6bbaae7544b6bbd3a34ffb16f5f8d64d23f22fbdcfb9b6f0f564d73122a9856bd687dcabb246e1fab26365675560c70b971df701fae979bc887cd6743977ee329b7159c6602021fb5bcd315febbbddca9822f21bdff9d4f9d60bdfb589c8bb626cb4b2badcb2479f314424d7878d46f771aef89c317688fc4adba20ea95fc76aad22111b716486c8ebd82ffa62a52dfabc972df6819b17c8d596fadb660befb2cd5dd030b666c8aed95b9179f1e2e55a8bcfcd5b750ed2663edc1422bd593b3b195cf1d96f5c6f108998cd143784c8fae09bd4f96a8696febc1944b2a3be98afe9d1c245ab193782483a97bf86cb5ae7a2d717c7b86981f41badc3659f6dcc5a6e23b8094436cabc2dc6a8737739dc0022abb591f257e72e3f8dbf78c40dc60d0b24c7456bfccbecfac5b6a2076e56202b73f51fbafbe766e5268dfe871ed44ccd2b22d113e3e60ff934be68bd52d8ecab76b11ff272637eadc11be35b6d8a44aefb90b34276af276d7e1d83970ff9f0bdf78296fa5f56e31eb2af63765abe2db6e994cddce821a183afdd465b7dae467721cf9811ea260ff991badadafac81e5d5ff190f5cd09ad4fdb66a5feaebe19e618c7cd1ab91e6cfa37f675ee2da46044a23b64bc973db3b0cdfa7355bae213377648cb5e6d8c8ee9e5eaec4edcd421d91d83cf1aad93f2ac4f24ea0847dc4bdcd0215775acb2b8b8bdfa62bd90899b39a4fd586143ff2f6ee490f1b2db228d5cedc7d93771c85a6774f70917377374c1215d84b6fe858e9fbdaf3215c8f7d07afbfb1865dfb0a640cee9d657f3840fdd63ed0df9d61dacd3d1cbb4e37a37e475decfd7848dbac82a6b43b60a5fe3c7efcd8f94211b92d537afb5b7fe5cebb54681bc16baaf963ac7a6b5f4ad21db636cb56df5c6d7d6f509e47afebfb8d6fbdeba852690d3e3fb072d3373f54e2e81f4c8bc5b8dbebc39eda7866c91b5fdd97339afb56c1ad2e9f2b60cd9d1b70d1f1a7251ee465b3b6bfde6a52490b0b63b5b75ffb1b57be719d25ec7ccf65be8d863becc90713175963b4e66a12b43de67ee9fb7699f6d1046386ec8900cfea5d1a15d2dbe6a21f388db8b9b31645b165f2fb7ecb3aebb41712386e4e6d6a5ceeb5a8fd62dd38d4ddc842121e37fd1f2f40a2733a54a528b9b1148bba2a595fdabd139489b08a49b8f529fd1293b5ad70a81ece9167a6dfeeed87d074332c77696f55ab63a777f216d9bef33ced9de8ccf3e10c8ba6c65cc8fb2736d8b7e40b6c8e66d2fde37a36b6ebd906fd6cbb799fb63f7c1d9858c6eb6376c8f6973f72017f2c6e7f7c5ce2eb576b92de4ad6bbdf9eedfa075d8b490f0b6bf4c9bb6ab143ae701f96d5dd6f8d139d7a56fb39017b278ffd9c6209cec2d2c64bb705a1b27bbef8d3b7640faebd7d89d8dcd1557df2b24df55efadf6ad68e9bcce0ad98cab5387b63d776b7d55c88f97bd47295b2a24dff8eddf6e9b9356c638201d6bbd9ad9b76cadbf3685bcb5aed69599b5cb45d71b905c9fd9bf6bc2f6b5c62a857c70f58aabcd086b7b6c45211985b1d516e964c7b83228a4ed1b61fb8f95d97c979f90f3aecab7ddebecdacc9d90be6065ea9a3dfae08add848cee5a5c14b2792753169990d7755ccea6b37aeb6a5f42b6bfad69b5ad39fad8631a90cc9b6dcad1b9b51ee9544232f8e6a2fcededbfc638090967749ecf18ebbe4f2f12f2c63917bbecebb9afdc32207df67b77ed7d16ceafef08d9e6e4877c696d6ecf5935f24d6e91fd39369985b5a1e0c608e9dcd1a75dff6c55e6d3675a193133d38cc54d11f2515ecf177dfef5ed7d22e4b72f9ff545f771ddd560e96608e9dcadedcd9f576ee634077252eb335e5e1eddb7e59fc486973db3bd5e27bfc53c916e1bb5de9e1dbbd7ad2612a51e859a211c5ca6904e78b92b84b5e38e172eee0111ea04325bcdb8c505575c1c19b2fa8d575b07ad9d5e5d241289da8c48d4ef06d29fe5c5ee8ccf95616b2467122a0828d2f03891fea643e6da7cb43efb7e13c90faea6f1d908e1f455439ac8eefbf0cd371d6393690b6522d9ae17fbb566f619396222ff1d2ff79cfe43bff0852e914f99b9d9ea6cf27c71e110b2815c8c7673ae5d1b6d84b306923e5ff452f76b8974e88bb9d8f1dd4a248c3c99b5fa2ae4679da5445e7b5b7bb61ce137ba280d647ccecccc2b7d97391a6720ef73ecd96ab9d2868db90ca483ce6c7b97321b9df19ba4b97bfeda756bcfbbb9617fa4949fe7fbe931d23a434812c9da5acd5ebed4be3b1f3595463190eeec75eda63cdbf37a2391dccb3518e36a5eacb68744ce75bb7174915617e77d4432f6d44ebb2cdb67cfd611c91ad3e7eb46bfcfb28fa146a4438f6e46dacdd9e962432c214624e317fbfebfdb0eaefb22914804470cf47e2a1ac881d022b2b2d69aae59e7756aebc340dee5ee11d66e8fefce185244fa77adce45dbd1b19b2f9488a4cefabc713da7b3a96522d1332312318ff899e9184244f25c6ef162feb76cbe3f445eca4ee3b25edb2fb5b1ca8e951d2a3b5eb8b4a09021d245183bfafb151fb4f6bd40bafadc5d8bad9b527aaff31f2117c8d9e2b717a9f5d816846d5488ac2daee76cad472d2f4ac5884422d16831132142a48b94fdd77b2b8536348874b5f5848c3aedffc98cc418d29020f232fbc96e3efdc7ae73f5adc9ca5b134f5c3c81500b249b8c6d7c6edfe5aeefdb96502032ba735e69bdac7af4fb80c849d9d7754fa365816cce103a3be36adefc7b0512da76e9a4bebcfaa0e289ca63f7878b6b75335efc5e3773ee58fb7b1f7e83dd2af4ae21e48784eeb5529f707e7bcfb70fee09f1c1a252680f69ddfe7c1bdd7315c2b548ced6c77447694e29f865c7cace965210094ced794d84f490d5d9bccd8b591aeb7d3290cbe4928774abde6f96568e75b975f190ee2fc7e60eda6e66b6ad9176ba7e6cd9da60637472e80ed7b0bd16bb9b83eecc166cbc9e83bcd673735663733b647defbd9db9d9fc552c5f7660c310aa4342d61c5df4b2faaffe7b3ae4a23dbbfdbcb72dea960dc36547b432109a43f2c3f75edd6aac313624f94e982c3b57442291e8413964abafbe66e1ecd75efb1f7a50a77f6b2a710cc521dd64b6c5c9ce1bdbd81a1cb25dbb775784b355ebdf2467d63e84542099657d276bd76debfcc55220ad6db7eba4df7cc5f6de1bf256f6da5d2b2ee8868ccc46eb9cba7faf0d39fb5ada1d5983bc5ad39e3291b121dfb357235ded5b63cddc3f845020ffcec9d179a4af57bb8e5a43d6bb18b239793ada6bda1348569d83f5bac7ebeffe3281bcbe165bb5ddf667ac17c999d3844a209fd64969b76a2d65ec569233bb40480d0923744bd9393ba7d33a92f36268426948cbfa6fac8b3df85a6b8ce4cc6d0aa121a165b339cec8aec6f84e22817cf82c742d46682b9daf929c5da34267485a9db3733ed75b269319f27e2f5e3fe9aaf7f94292332c43be5df13d5c3f5d74349221637c5e0d1ffb74ecd62333865cb5694368a1658cf637d4eb2124867ce776de3be95adc18eb3fa14c24e730a46b4ea98df1ff31da33356d974c3da9d9b8f1293402e92c33bf66dbfd606c4d72fe319dae162d221164c64e8390086aede61a56b615c2ea24e727d56945241a5921a1a6162b5dd29c4c3fffe36f8c5008e4776d585fdbdb5a6ceb2130e68d74b16db71677bd24671848e80bc6d6f3c8d873e71c3386919fdf5aad4f4be15bec47080412c2779fc3f8e6d7f7d73e192d24d4d442424d926c68843e209b23ac3def74beea5b4672c66f4d3c0d86bc9090f273ebbd6bbdde559d29e5984aa80bb99e31b668afe75b2f37c9d97d425cc8492debc720474ad74348f2c79405ed88448bf117a12d166ce65a83ad9b376e7ede1c8dcfddbae6bdad99919c9f6b2d22d14e182eec5a48dbcf3687f3b1572f7c8ce4ec5a445676acec68d9b1b203a6f465eaac221205ce9d5be639618dcf0bd95fdf5d6b5eecdd055f1792b9dae8c7e65ce37efeb89070ce6add8c90b98dadbd2d64dfc5f4676cfddfac3d2d64f47e46e3832dce8eec794072630f32eb5e570b69bf2c248b6f42672116b27e63f599adfc96aeee80740b7efddbcbd16ef40a495b7473dec9ec8deed80a39db31f7b42e76f87abd2a24d3c9daf209db3147a990ab5ffdb61febb23e39205f657e8dfaaa6e2e3885bcd7dd7a1d7cf3697d7703322e4bfb565a215b5e2f858490da5a3b32bcbc6c14d22d3b59b594afb317a190acbac7755eb70c277c423a5c94b1d8d49bc3659d9034ae66913606dbf99b9015aecb94b553f65a2b13d2bdf7d04deb77c26ae912b2b27fcbcec65cfb7f0dc8cb91f14fef66cfee2921dde5d656fbf9cfff5c12b251fb9a3fec4bdf1f09c97aaeb6d6ec65e9736740d2baacc3fee7fa6f3d423acaf83564f8da3155235fadf7c2fad74d5a1f3b23a4adf49fb51a79c53a8b90cc77c287ff666c2b1221ed47589dc77aed5d0f0043c8d8bf2e85fdfc6c743707b2adc9d8d51bdb198d9f48fab8bde5a6fb661f7a22db7c9475ec7b977b8703d94fff767df43b91cfba52be6df60d6463d7e8b22ef6fbd52a2792dd79f73b4a1b645c379116d21a9f35e7dc7da49a48782b37a57edfac8ed14c64b511b6635adbd9fb89899cf39b2ff77ded743e2f9176b28bac17ab8b39461bb06ff1d115abc71a48ba6e5dfeec2f5eaf424ba45b94d95c0d328b7ebd12f914fa3facb0726b764a247dc8ec62d3d917bd8e06b2db5d7ce75a6deba69b818cfd3e59eb674d0672b95bcdcfb0bd2fcada2492fb277b4e218d907e3749e4bb91b6fb775d8b8174733663f15d868fc56e91c8c51cdad6d046f6133e24f2ba85ed1d6fb48cad7f4442bf97be47b68bbeb78e48e7737acf8eacb99fb611791933fbb87e652e3acb88fcc5b72b5dcf23b4ab2e225d9c93de1be3a25f27858164668b5636ebe3579b2a226f631dd774adc6ca982622d9640fdbad451191ef685dedcd1999a79d87c8d8707274773b5a56a721d256cae8eacb7cba65f305f2a74346dbb4f12da7d00592ebeae8d17a845c272c44429fd4bd3986b7f27a8448d76e3debbe9e5b7c8e0d22f9719c75715cec9b734c10f95c5d3fdbe262ae56c65a201bf3efea5e6d7c59642c10c933cecb9af5f2b9663340a44746678cef6b84f499b140da399d9befc2beff20b31548365b8bedcdfbdc7477b13fe4edc80fdeb822fbfcc5fc90712ee7cc5cfb9096fa6a6feba5d3b13f1f324618dbd2e5d199a3dd432e379b85ff4dfdfbea211f2f7ef674717c6df39095ce77ade95a6e5a5af1900e2e766e296cdeda5d23b941af1f2bac7effef900dd7ebf55e5dde9ad921ff3a8d2b4ea675486bd92d67eb930ef998bb7523edd9fcdd3887bcfd6cfbb94539a4338bb6b2381b9b5f611cb21d9bfedde07cab358743fa6b97d972b4616cefa940d60519d7175b651da94b81f40869b58cf95f7b5d7b435e661f5367cc5a776b6ec8052f9b75ce47bb0d492153d6d6fd6b6e2d6b36a4d7c77d1ffbb7f14dd62890152e7bbfc1da6674b67b0d096becebdc3336a6b4fb04d2bd7ff3397b6d02d9d7c6c5e87a5ff4599740ae0bdfcd69e363cdb9d590feb359bdd1597b21e54e43dac5b45b6df0df7373351ad23dc2f5d6f2db34aed5249077b1dab76764f5bef867c84a57a3b05e169ff3b766c868696cd1b967d14eb7654838d975b5aefa6e5bcc9221239c75b9afb4d9ea6e1d43be4b698bb6a36d7dbd8a21bfe75df031abee4648c390b1dd360a1b56d8f1e70824fd5a3b52be2dfa8b510472de5be7cf49dd3daf180219177de61c73eefb168221ab6b6fd97deefeb706bf909519def91cce7e7a1d04b2bada10fa830bb67bfe0149dddfc547d96347e75ec405fb5d756c3dee427ab5ebbde6dfd865e8980b199bddebff2c755c6fe32d648393d97eb59716d2b1e9b37ddefb75b2c61e90b6dda6fce06b8bbec7380bd9959f656e3dff5eab190bc96ec1f5e2631f7fbec51d90cccf16747c5d8dcfff0a39b99b7b9317fbfbd85b2117737ca94367fda8ad55c8db8bbd5b917d85ee552a64afcabe57ec07ed37ca01491f9dac1f52e83ce19c422edbefeaba90ceb93a6e40deeb6ea533ae288584fdb0427769377c7f5148f7d57acfd95ca51ea190f16ff43927bcf11f734fc8bfd7ba6ee89c8dce3227243bbdcbdd5a57fd689b900cd7a390b1beac276442be3ba797c2f91fd97b09f9ded6376c66eacf58039252675bbfa36f7d9d6b75a084fc782b3768e79b1d2421fbf6fdc7bc359c6d61778084bc70f964f1c5afaebae548cecf3bc880bcec2ad31bdb5376ca604b0501757084643442ba68adebbfbe918f77690bea1464a50335f2d2ff7fddb52e58e90d8a1d18f1bcd56f8b32b8deff4f1d14c17a357317dd8bd01bb7765fbf16756ed9f95f5b07447430846c8dbafaaaaf4bf93de39d3059feaf48644b9f42fd1991084a0ea465b65ed92b3be75e4733df76c264d9f1993d3fa6521a1f93977f2cb03f91ab5117ddf43bd7bc75b127f2c677d339bb56ffaf7e3890ebd963b1e38b7efd2977c21c8b8d41c73136d6ae21734fafad95b6ed8f8dc17a03491df5daaf3257a9b3b7a070229f6b535abff2b3774edf44da785b9b3c576d76d9a7503491d142f7932d6857f409b91b4a26b2cdd99c6deb5c64d8dc30918fd646db64b345ebb6b14be4c3d96d4d7637dd3f08c50611b6e6c8227ceef1b9d7ba9923a3eeedde7f5b0d0c283590f0bdfb6e8d7d6f7daf39144b64832cb6e63a67abb1457787528984d04158d964dc5dd7ab5028918ba75b9063ed3757b5100a0de47cc7beedb374397fcea1cc403e07f9e76cfa9831760f6180220349d7b4cd9c85cf3566cb27918f2ddaa2ad4c191449daabce2b83cd20e3113f3fa0c4403218eb6b0f617bd15e5e55a04422db8b0d2de477e78a0e211448e4bfeec99cb1ab9076838c3d2257fbcb608b0d2ec7aebd08c5110967d357dd6c933265af36229ff562db6c1933227b7a7d95ad5adbbbee6f11f9bcb669ed9cf72b6c74c240bed868b58ee7f4f690ad2ba02822d7a3efd67bad39e36e522452024a22b2c5761dad77bac7ccaa7d0d051119fbd55ae7aa94c28ecc0e91f7794d4a699b74d9cbd11069b9b675ef7adae62c7b2f90d341b79ee56eae7045e7027963bbb69c99eb59ed6a85c85ff4e98391add7d9b4adc6041442e44f372ffbb6ee16f37d129441e475e72664b7d736cb8ced84c90279c68c4e500469911d3a6bad1d63e82bf263f0d1fb5ea32dd6b9d616505a201b9d75568f3e2383d106221febb9e2bff6262092eb7b46bd5d5821eb1959d08bb1f75e6b10b6e5202fd8b032669b8b364259816414be673b46c76f417bff907f61f77decfa852dceeb879c3e9f85ac3a7ba7a3f1f62179f165c8fc391fd2c5cabe324a6bb7bad8dd43cef5cee07594e363ccbd1ed2b15bacef57c8b0dbcd43c2fa91d68f94f97bfe78c8cad35d3f5d3fe1b3b646faaaed41f81ee3efdb77c8be91b17364e88df2b276c809dff46fe696daaeaf0eb95eabd451566ff7b2acd2219d8d8f56e8ced85c11d239e46d8eae5addc565fbfd9443bed8ec4f7d5587f7bdc721237dead8e207e7df7be1900bd65af9ce37efad6c5520a1ed9fecaa6d5f94a6405a7863b38ca7d34839be21e1bbd3312fdb6f3dbae7869c8cbad6ae1b56a7cfb6211bc3e7acd2faec74381d1bd299d77bb3b431579d6d2890cdba692bb70557b5ceae2139b6bbb1295bebdfe30924a36eb97767d7aeb4ba09e4622ddedadad5c6fabe12c8c60edd8c70354bef33a686fc16a7f7bbae1ff56e9d867c74c5d6ee37e6757fa22157ab2fd649ed7bab9f3109e4f3e71e72bb0fe983bc781806a09cb1208373aecaf15e33a47b1a699d1ce79deecd5b8684f6f92f7fdff7ecf32743c6ffdadecc6a6cb7d88f21ababf745f7ce5beb5f2f865c94dd647abb61b48bda30e4fb177bf5758bdf3166472069b7c75cc34ad9dfb2550412b667f7ad9eee165f5a43206bb58f9f2e38fbfb69054352fa96593b6b8cdf93eb17d2b9d99e6b7472b3ae3e0a02195fb30fe9fdf7ab35a31f9077c1da5cadce1cb3ddd40be9f72d8fef5948d9ae45bb90acb545b919feedae7572215db5ecffc147d7b3d7c12da4ad2d467795597db70b6a211d2fe8cdfeba07e4531a19be0bebad6f5dcf4256776ff5cb1c7bd616752c645d8e2d579f7dcc3a485d07a437ebfc2ec3d6de65d35d2127bbfb58858c759dcf392b248c6bc1a6b5527ad96c57856c6d19bae9eea990ffeefe31b4d1c5c58f03d2b9876d6d57e8fc57b72924736f4168db69ab916e40ced9fab947597dbea014f27683f7ce6f2cbaca8e4521df47bf0cefe445db2d1492a185cc2e74ace9e3f984b4ec97a37ee16c7759e884ec5ad76366eb1a73e7dd84b4cc42fbae5186d3dd3321637d96bec6faf563952e284b486f2ef2630be7ac91db85a201e96237e7fdefe6f5f7108a1292d568b952477db9b78ea12421ed64af75ce77d74501050949bfd76597d5e5aadb08452291088e18f5406952ce41c9807c35babfc7d4bbf9be1ea039623c634622284748bbdc7caef9f19a934de7739d0c50d4487bbf321b593beaaa5b91e44cc6e4c3a018217bb9f7f9f52d77ff6b24395b3771e102a5088731c2e7dd5aaf0517ec5ef3ef74eae633467db9932163e20264e21189c8987cd829050485080957bd3146179ddb6a7da10c21d9fe8bced0c557dffc98031997ab8fe7ba90a3ab2c7e222d37f3cb18bdd0b1f53c71ed3974af31c7188cecac396577f3b176b13a66170ee474af51e68eecc50b9b76225b3bb8a07db4a36defba1bc8d5b4c2c5de70b2f68e1359d7abb4f162b5d959176316389bc8d87cb6a5abd74b81a389bcb43d667aff358c777626b255c8ee5a7fb5732eae241c4ca4fb5e8dbb2d8494bbb511ce25f261f48eb1bb36635d2d29b60da4d3552965f82664b15626394354f3eb1a745b8c3db7fc39e8dd6eb5afaed4d2b79032660e75329d4e52149d25d23e77e7a2a530d6ea7a5622a9edb5dcf4677a9db74789b42d56562fa4713575978944ad011c1a487fcb962375d6ae9bf43d6a92bc88443ee2343833908bdd5bdbb9c52e64b63e19c8d61c75134e5e6cf55b168926918b299b6dfef3d96adb187124916e1b9cd6d10ad76d1f6320ebadee26df3b9b37f85824725e3abfe9fd7eec35562191ecb2e911fe7593369e0fe71169dfcddb16d37f6f0c9d23929d7fbae7cefd643eab4854513d3f225145f5fcb4c71a91d65e6bdd820d2b33c8d69e6650169fc988fcf777abb148197d9f93e47c328d524fa6315c44d65f9739643f179b917b4a3da3d1e342a50a0d5cb2bcd1631848ff7899b3df356d74edf18c19f980a3886cb5f9b3ef5de67c75bf8093885ceeb67d5d97b10997bd88c8c5ac9bf0bddecab7d67888b4ac5f9d96b585dc973243e4bfcada9b75b58d31421b5f202f6df3ad3961e47a97339108059f0ba4cfe7fcaea713be8e0b7200a710d9f69f7bef3dfa33a613357dac442a700891eebdd8dc3f7d5ded5d8f4a33bd884422d188211b44327ce7d7d639eff5eb82c8ff3a636c9669a58f326f81bc1d2d8434b67f0ad7728148baa09d0cbfbdd5fed580c8d90f3abd5d69e5e65e5920effac6eedde4fbec1b5d8163c79adf72e8edd83564ac7f3ac708197bd7d5b23f24a4dfecb3f6b3e97e4d1c3f24f47f8b323779c566f6e2f421d9f93e5bdd7dedf5eac7e143fe9df0fafb455b65f321ce1e92fdb9d6b646d698a371c6114f81a387a43fe95cceb8fd6a5b2bc9f95100270fc91a9babf262dcccd60c9461a8e48d6b3579288ea2188a610084415a9f150090001314003030201e8e4683f180a82adb071400043f6c6892382c2a1308838140200c05611003411003000c40310cc42018848710a503849ba820a8843e9142f02d1d1faecef7a293fd96a224c17842f889144598132a873a232ff207f1282968704c281f2a8c54c9afc34fa368c26c5041d4915cc40bc42ba4663036e8227a1012858a5ff75e2bceed089f4e4378f0ba681e4a8fe4e3cbe1dd617dad261bc82090e7cc33e9857cfd72c95dc3be794fcb1cb5414aeb0431797e2d09fd6bedf3287a10df5aae74d7dfc39fa3d03186d81c23900603cf25ebc2797d7a395f552e724b974a530f941f5547b152544a81523209caddea0255cc7ddd350da288729ec57a87f98b5c472a428bfa59e822bab4074cc72eaa1bbd40745b5c70fa7c9738581db46e9d17936666faac774a682f5d4f9150d3caba65c9442473fe733b9a55929e5459a6385f9d7e9d354fa627f1a9e54c77fe3dfd390b9d0c4f8aa7e693e9b0f86bfe060a2927a542d4d5a0a315132918758da824b817440fe523cbf1eef0f7a873c868824e5fa843384e61134bf6dde5d7aa8311ca145eca30e59fa50d74c0cf835cf8aa99b8bd4894ae07bdaf0ae6aa401e2c101e92e64bbf7950285884b5d3c573e6858495b4e4771055e521a43ff378964bc8237a807ac77e13f09c5f3e3d5fd7bef7f3ce56781aec55a4b8c38f0907aa9f1a6fc6bed883dbd97399c9614086c930ae4eab39a242d980a5b7fc3b841a331639fc7eee31fb37722984ca2865c4ce80d4c2d4870f908bc8086eb78d77f042aad20f093ddcb6716a6f77060c18a5448a60b7bafaf72ac767e6c9ea556978840d3a64534a457f5e56bf37bb412203fbce7a68b612f3089340465a66f810878aede8649dc6d3e4f96eee56fe38c066e24069e0e61b285dc272238d9d1c6096c8fc7ce0a3612efb7eade431a53b35ef29687ec958cc111d4825840f12cad63b399d1461e5fd42e96f68c2c5e11edab4c52602d0433832807108df25df10c56196efdf9c1914a37952940e6ddcb46d7c01cfb331b160c7789886bc65580dff94734c087341d83675b944f973e33d0eff2e35258ebc838d437c231d79c5e4e9aab65a82eedb4a94d34c3abd768e3477a70f5ce1714499b64ac6e9eed1104b5e7a841860935d88b37c9cf05611419f09b65b3808ec03590443a639f954215fdcf4e175df9989b2ac7da94f8f227498204a2bef731894003444dd42d8e7454af314ee0eb6d0ce885d2df7db68ad241fb5e0c67a13da0704690cfa6b316906dd5562bae2e52285f5c8fe4db7542707ba7f362ac146b563118d5774a3179bf1288a1a02ccf7949de7d98190fcb73aab8d10dd41e81b7d1bb350063da2cece285dd78b261c7d42c3293bad48423312e1be99f13c0c5666115e9586006b624c4d0e0335f73b2abbac3909f6d43227de9ccae6e436a7d39c58e624cdc93127c59c8a39c1cce96c4e4873829d53684e2c73a2e6849813cd9cd6e6343727ba3951734acc89674ed3e4f4180133e2329befe50a7c692539ee10b2e0df828c8072196d9b6c4425c523c8084d224b3c107e8932c140d0083d2295f8121e8862824d4841f42efa6a46d78457a24ab350444a8d308720fe0f6553d4b89d76658a20a681242b9e1e9e8f2a8345218529ad9c3f2dc7093463932a2332242d2094fbf591fa3ef738aabd0ac56237a9289dea955633732d7982633964f39ee1fba044a0b1770f801582574754b7b152277ae2bb8e012d2993c2c6abac59c96b711511b6cc584d1c646019c0ef911eb6dd6953ac87f12a93fe993665bb803962ca1f65976d4ee07775f74709d2404991fc844d17db065e96eec53d7625b8fe92d3c08f62f2d81f52436b92b6d036ae4926ef48da1cf23238ea73dddc4ecc3e40493c3b51370ec19f1655aaa543f6e7339267768824027e44b739d924ae502e4852e4d805bca39073e62c0666a8b2cc957090a285ab80deee03c829758984f979cd0dc8d5b045ea5efb28fc58d57c5ca290468b5dad84fe81e4179785b73da256b979f0049c1e82e1b4ed1687c656e3dcb22b38a5f9fe55d32b703f19228ad23c11f48862e2c50410c64823a6a62d5edac79bad3848d45d3569e259aea26e8c46e31304fd9d1c9251354ebd2a711c5cb39fb95edf6c1e76b45c1d19185202eec6f5f671250988deb88d8204d57139447148d1b9a13ee2d0b8ef4637e2507661c5bfd326d1663d1c16605225bf1e97c57dc10015b03e9a44b71e01d45ac3ae6cde62df8f532e6a7f9c21b9ea54e52a4c74371dd9db4de017a230faa3624511fb74ac100e95fd46e13689af008a6aadde097c07646f1ab2e95e1c3018da2977513e78641f18ed020e2f0f6439d00356bd09226db125dbbda11f94c05a0813a69286a6b541fd89471996d0e207051342558d36a7b01c38590b5aff626f9a2b1b4799d18771b066cc21fa10316cb0269058e84275b46013f94bf814ee18624e9458e94aa9fc9ce8dc290e3153a0238e6c873a94f73712abea1a14dc8f3f00f8a63386ed962fb9a02de4949f77ac39ea3487e3d6816ff7590d4ea9891849935e24d9fe33ba8295736422159b3e405070abad3d460acf98152e9e8a3458137002e8b4a461611128e44e896b6794c0014f8b0b2969e9d33a464246b12d2b1e4a422f3884b92a626d09ea52546c816b1e0d4a5488e842266510ecb56057c51611d50de278d79238c3f4e71e6ef8391d941df90f8d804c2db5be13b5ef4db50600c014b0c6335294e10f0a1580b543548680a2de6c6b8be176400730e0c069b2d8b710f844a3226cad140207a36c7434090320a38bb11278cfd653b7269b58a092d8226060a719dc7a61d48302cb1d68bbaea2141ff40ea4059e5cc3f49ef4ed06ea5a22cbad2a66b530ef1223aead0c96c63d748299e7114bc9343187e35156d5e96bfc4fa9945dab1201f1670b338d77d849a6fd1271a4b7a6ec521107a9714d1358396a78217ab33af1ed8d98946d455111ebb2372e579518236e63d56f9719c4d9faa13ffe33680b05411a84c1da67cc22d69b05371ece5d173db5c20bba40752929acf89034bb092237505c98c4a759b8516bb83fc8259904d58f635b858f360cae4b4c08285edddd4450e6b8240676114ae39ba7e1c22cad1f147da277fec1201e6861afc105cbcaa6f782c4f14e763043ad8a8d4db455031e1dc154b76467ca5e172425351bb6fe8226d6bb4f961712cb213031d20cdd800ad6e3e60c69194994e85b0295d0e650c443ac5496c5fb9047c16da59df7ceca65511bab3c9604d873820fbbadc55f48c617970c64d17a73aee2a10ad262dce32b0ac582d0b282a5191a2efa396c648d79b9784c82554d22e4593a0d9d1eccee1ecda989a092797d4b14eff4e890ff04e93117e71b650f8844fc4629423098f5f298302f6f1d040f242a377ef08b2862337a6d66d5947bfa008d47988b7021fc59e04b1915fd730fccb5867ae2e1592241ecb3275b18e814b724d5b122052293e6d9194d7a0b7cbc68b09bdf5b3ab63e1f0abb4cefa7fa35444feb1b345c62593920503c182d588b9ac84adccb301fcd1a2e25655786365162fe37259c3285a307c29f61da96341631bd5913d17bef8c71f4ffbc21d054672e7f778084c752322d9c68d50e030af414850cd6e63f00802f4a516dc9201109fdc274201dfe3908254ccbc3045a67f9ff9637285490b1f0dde61dd4c268fc115d0b3d27a9162d4bdd5c5d2420f5b3a4e0825c3de1c09b0dcede3e18ee807a619abb65959d1f876a67506aa99fc3caf67440808e0518d4b24e004629206ad20093700facf40eb0d8214bc08a15a279d4138e0b587c8b65e24fccec4f0938c8e5b5c49bf1d1e0a1c114b0bb39a09fcf7ab361af2ada15ca289439aaad565f3d490d96f8d8411decbadca7393de628581e4014e12202ae4d0ad2a49c68eea7fbc5717e96717b1e55dff06922c23313721e53b4252e0eaf2a26d3c10a039a2b71b80d932dc1fe72f7b57af6fbc3c9a4872c2f3002a5561622c569be5b10d0fcce82a286c85fa8d405ad4d14f520ba962419ca2ff681e8dbe7e08792fb614dfd7ad4f634aedbc88409792186599786da782b9a64ea406a09ec9f2e5146c4b14933475a4cd5252796aef2439fc0751fcf620332278826db00d913e6750f7c81f9b5a01fc7fb0ab43ec36d1536b31b3b36ec82a3daa17026debbde7878268e0d8a5f8a6203a72fe803caa69a120fef77a5cf39ad698d3601a153bddd75b7ae530291ff1f55421d421a2615fb7da1de17ea52a5cca578d5952ca0cb6c127aca39a5ed36b65ad97ba46412d4d0d92861ff1deac62cec66bbaf9e6ce4d5c4265570905db4ec21cd2860b571313d564d395511867bb9ad88620ae4541c74717a015c464a51815ae18fd7440007f7955c6dc1c6429866060272086c8e75080d1367983934a2beb2080703580d1010e7d12840380c72d9289cd13692893ca790130d7608efe7fcc254d75bdacb6d569dc31b570430a96d45c21ed81b83c7d111d64532450085ada6e8ee610c7f611e59e8654a12376bbb3c1360bd9094d588b4180c0f6ea27ab3752c6153ee1dd536f4ba5e49db4f061aee8df379d25fd551ee1f9f9299b4230ea61bcc181b113c349e72bed4e316528182850bce220ed4312b8477f74257ae9ae7edd2e7ba919d0ec3b459a34f727204abc56cbb4b837460f6f72b1c082f7b209fde8c2adf6c6aa0d666df5660c6c205503c15b13e904c355adc3df40851daa228816a7c213386d641da61403a7fc55840389bb2a8274034028bd1a8064af616d5578e6f1c22cc6fc8fdfe0a64b867c0228a53e643d65d217490cf4194806b8220ad2cc27ff9d64bff3c439bdf57631a5dddaf5f05d903f504867c1744f7893c45d2ec29ee67eef1878c66867a4026d98b32f912dcdfdf222ae4fcbb06024b0ecb73260d4e9cfec097cd900ed999dac287c7df72d887aa56dfcb5ea4d575828f97b82a68cb2bd86a9f0d09e77e63a1afd43fef037016575fe91417c157b8cf38802585d031b29310d889ac7a18c5dfdeb702928e9e3a30883b645c22df404c1aafe87a498357347b45db2b3abca2eb15fd5ed1e2155dafe8f08aa657f47b458b5774bda2c12b7abda28d57a229763cfa4227e59caa1478989f87d3cd07150eb95230055c831e1496fdcd9a9812538c69c4427e04b3cea88ed71dce7df5de149e5ecb8ff324baf30e5b287a87a25728fa42d103143d43d11b8a3ea0e80b45ff50f402455f28fa80a22714fd43d10b147da1b0079482592622bff352d185927ea868818a2e54744045132afaa1a2052aba50d10015bd50d1868a06a8e841451f54b44245172ad100053c3a430a8a54107df72e55a18fc9f968c09204a9dd36e245c8598a400fe88f51849dc6b4a9bc4802ff29b22097965189e4d8edd317351a8d33c6f3d08f691d4f2bdd8fca5f8fa09c1a69d08185f8562dac8635e9c7e8fa4557dfff6409ba103b90fb371cae86df7fb10d0c193d57cc6fd4b40fc1db0aca12f48103e78fc89ddee0c32c8cd3d7e7dc21dc90d70eb67b9838b46ebcb97b6ebab2df755fb5b427e60504b133d749dd25050accc8d1338cd01280364b7440b04c3c9a249106c2e90741a37dd83bea7e1ecada4349aba6b0f62210539980285f2363c531939ad4fdd823ddead3b01e4d0f3c2148fe5c92d29b212be5320e32f81c5292e8244d9713ab8d952de384fcdf2ef4707f611bce9834c7e53c31008f3fa7128c4cff91d08b22d6dbee59440523ad7d2d5108015be83657e11dec915423280291c77133361ff90b841b4c2c3b57497f2ac78099235b32191f437ba1ba855c4a2f5e6afaff810a87693cef5f65601bd6171b29fdde5a9bd1d4deb214af27220f5b172cbeec03904ff872198c0d0b8937bf19a83ea95b55135a8eac46d5182c9cd7f140acda2ca0b9016e901e4411f123817ad4a61ce320cec44a1bb6d514506bc38558265216767be86c353105b63abce86240ea50bcc850226cf60d20edce62c90714931330f7322f1e37ad2d73ce276198a1196db9305914caa0db56188c4120dcedfd64088f939b1f8f46019bc746f71e332d6f316d5a125378921e9b12d27b7c55f8279d139c4a8fbd451f91c247b7b8d63c29e2cc4dd9ce4f42840b4146d77a9ad18a7919572bc291479d4551aa22e250210cfa58afb3337aacae158da7400c7436deb1f4fbe90ad2a7fb06fba32b0cedcd61ddf89cba81c1dc2c1d18b0caedee225fe4c52a0238b666bee25f54d0ffe06523930d5050481517e45b34b5de2e01a6680a442eb2ac87bf08faad1cfa49fa7f1e364c19e1df0ac7a7dad1ad028341d05b819feeeca179a271a9534c1dd60e493c2b32eacec2eb1ba2b674d45e839c7b5440ffd93d7ff09127548f8e89c9d6924608154f04f7b39a23d895407ca2cd5467b78b0fc4f9d22ea032479db036ce3a0560ccabbbd5fbaf18f30d2e0f9bf02ae27536b5f7e5a3a29f9c3c96bfcfdb620d3fb6a4d918f678f97943044d1e198163a55e7e2812895561f5bbb52ca32e8a7b5f08d509b5cbe00dfa0ca5055b3a706534075a8e11b24f642ecf3a3a19c153bad983ce0a1d5115d7c83a003deb4b907eb299682ec54800532c24eaa64fb1213bcc132b72bfac656969be0f9a1143f6c154422851cd3bc65e9f8038658675906c4ad08103f6c32d13864091521643b9213142496bb01f9fd6948bfc8039b44dee4d9217b967d64fc499c520382b4d5a83c778bf09f92e092e72815d7f9d6d1bc46714e8b3b1524bdd5d973aaf3ccbd139d26057ccc95dc8a9bd0aedc3c5b100755bee46be1c1be1a215df9383b25d2004280b53033d7fe737bd67365f4d80c9e858a45061527704035605972e739770763cc0dfb0ad9e049457c23aa8b21ddd90b3ab33d1c0ac5b0538dfdfa22f016e38b493f48bc881f74faef7a080953439284960cbae838327763b15cfa56118356be80a37af10d6bba9ea4b0572ca7aebe665e19ca0f6a49b19cb4a117d03621c3df23b30e1030b4cc7a7f3bd06a92c58a0bb0fe1108ff520221686d4cd63ab3084d1f1eb1448f4ea39a1039322c3f9fb78409c8e9064aeab2c7be400ecfc549d4a1b3327f2ca50bb6acc128f976d6609c00284c43ef7f3445083be51f3a3bfaa6e334fbd3e75fd41fd03c15303f94b45151c5954d7d672d0cd27ce41a7841034290ffc04b340abc712f239719b406288eb9b20f0cf4eec5852402c9f221f38e8d5113e8fb98783ee5e08a1ba003393087147087f7224c7c7de0386e0105a899e4627d6d92419e62bd948810e40d1792965138368ec65c0f8cd3dc153d09fd16dc317b1aba610023e91a9698dcb9843e2f901138074b29dae95c21cb2ab84bea2d5688eaaebe293154c5bd265a01c200d43da295a900e5713020bfeb52629833cafcd783c75aed5459c0588ba169c4a615a9ff7997df8b16a90acbcdf9885661368043f566260ab4085128352efc0f49e27ee698a810acbda76508e89b57d01a656935f5732e1afd801ed0d927b3a98388d7cbc2eb0d9ef9a656b99fc6de16554c64497b1b36b3431935f120a476cdda18908c2ac081b35dd39328989be6349c1304364626b8e115c3dd11eccf67633517f80d25788c469c76ac2f63199bc277a62dfa6b7d24bf6923f8179bdd64f214ffdd74920f0f9b7830a5c433f70f3fb6a76ec506bbbc9e6e75e9cb1f1dd1e88583ecfe1ef1c763c3a1e72e9baf02610da548d1ad1503587a6db4fb843846a47615cd76a12f8289ceff2435c1456764b5e8df36c937453e0a9c32ead898176235f797b00767fe2970fdfea8211fe6a9b33d551fa2d6d04196855181d6d102a1fb0b7c8b86edeb215459dc03569b64cfae2b7c6c7394b62d0b4ddf61d01412d744e0d1c280699cc70d96bbe80e371748c2a93651e18cf4c99e160a88cfabbd823f9e912dd36fd89bf295fba47bcdb9d7ebf8fc245e2397df7da64f95ecb466aecd67d1a3815d7cc1877f22e491a16052c6cce8d997a68935efb6985b13ab0ddade94e39e7864d35ceaae6a5d259a1973fc64050375e110ca86fb9e3dea3ea25544e9347f5683342d4c9638f11b15b1f89b90259233cc51870f850e85b1f07fd4d2d6113a1f5acfba2c25ee124be205a8a98bf26cd0ca440bfd122a3836e4b50a05e35fc42201f791390b28d3f251aef5fa814d32b601f0328d9e08e01fc518f0653ac3e7bb8f57c451f32e9773c551646366be2b562e0075d3d40ad994994c9dd8aec2ab0b49f34db394a8b7dabe74b6bc7f4a8edb5c554cca86698685771b45fd07f89d298158f73c7a0250051fc837334baacbcb5c6cdec84510cf50c41aa610310ca7513ecc44b8b67d4bca5750a826088b909ec601eaf92253cc5aff7abcd1706667c6b9611d4f0879c890a9a77661584939aa38e4ce1b405c697136da83382319b1d2dc9240b0087dc14048a2eaf66dd966020477945cd4874552b2b2ae0c8fc57dac81b312a7b0e70a4808664f4b13f520aec46e421cb8aeadf6c1625eff42ff1607722d9f79dee30e0f012c6a09a15752c418649f0a42b70aceff6ca71b041b5ca26212264cdf45bc80b1c28df5df81bef682f9af358d5732245529e1b529235d2b808fb497e0abfa2ffcd0550623dbd77af4df2a4a7926a7e0a7bac377a65e3c1d0f1737578d7d116b53158f22006aa5f0deb35119bd0b24bfe81aab3f848460cb4783b5c1b150498b88ac5e8eaaeaba57e9758296635fb66491c8311d8bcb23e5260524eabbd94d404b55279b1807e3d923827162932396b23abaf4d6f591b07b7e00de7bd1fa6bcd95397c531ccc0af0b460ff967f4024c202b024ec1f87841d74687a8c086967a159615070bdda386c6d9225cec3dc10977622a11ff8a3d2f8978e6458cb836293cf4f5a6bf13bd03de82c4f6317113a43f301cae807b50e6d22fa616aada0899cee27b08db7480cc6c37babca89a2c8856edf700d76f26497ae47ba19dd8540e25c63ae088419d1af06c95738e91bab66e35a693e4c6db0734a1f46958b089885547ce55da335acb7f3f7e40a31ddc4a5ec2c56535fa86ee7c16bbc5967149ac5233e5fc4575086967505f1e62dfb718b4305972e11c9252b45b42a7a76ad7c54174751e7de3d8e30dac82aa8295e791700c4b9c0a06aac13258c04783b7286286649b38f60c0c2559122fec2a426e0d52ad3d198710757d4bc1eb8b926830ca96f5e51915f1928bcc959eae949a312d33833ea16ac0d0804efcfa433f01756f1c56199d1193acba24a8c4a9f3373795a034d1b1786cbf6409618153da70422b5caf013dcec5dcb8c669ec8e7ae9649577a32e46d168ce5dd7f01e51ec81feae5bd6d5711a46c1c99f97fff4d2d5333c270f8405ea18cca47f246606caefd9e0521282163683382e2cf605f170bfcba8338715309cf81d894ddfad30eaf202ff9bacd81e9567e5de053266a4398b928d9255e0660c510ac204b45f3a4903468eae9950e0475e6226a4ffed717175f7601ab426ad9f29ec5293fbac41e0c86320fcb459b28e70710bf0200976b4aefed02d50c07cb1f7d91bd9f8da39a5084cec790afaa02d35833753549d528684c3b2201c534ec0c2025b2446393273e37465a4bbfd0f68183de2c7f8325eacd36ed6683f1761d6c08a98f0e83ca58a02d62dcc15e302581b73915ce5031e6775da2857a5f0fba4728dd03d1061fabb49c591b45222105ffc66e63da523cc320f9b8574b8f5dcdc035f5c40605a03b0564f14123fb2c500611a86b378c5cf0aa26a690073b768109d510721f1751c8f46658343fbd9e4f1ae4fe84e6bb783439a0af04b091eec3787d7889c3e823f0b69a42c0d125e1b978ab3fadd69cbce5367ce630619edd1f72727cd93cdb1b142bb3b08435eb091e132f00007ebe28a71275b6fc667a0ba31fed0861c6ca6eac6bbc2b4f92b3233b00a84a332b241fa579d3d8386e02671444c67394dc8ccd220562204c959086525ff27ad84c3133e15ab4378acdf4bdb495e4e11398a9ea360fd680ff7dc351c8219b7dd7df833550fbde59d9752fa4c1c84396a25775a3359b6d528c63c6dec96ead62567a261a7d1ad1d872b07144806a3d5b29159ce03c841bf2b1ec665df797e39944b3000559f0dcf84eff2ff65fb8056e20325d25fd69bc08409fb2d07d4d36b72949c030bc59286eda18eb74b60100d010d42712719dfcfafa99c5fa0cd8f06e14eeb5b5b45593956f74d8c4b42dfb58f6c2c214b6832f88a624a3daa9996f0cd37e3b04a96cb61a687c2c3002a711e30b58030b9334b0a124790b741a3ac54a44171b4e3384cc1f4920c6e7a110d6f67f11fd0d7f4f8098fab2a5c5598423d6f57abe54ac3181febb849138a8ababfe09f170af462815c5d199fb18d46d055227aff96ece7f1bc5004c673427adc0f977af9e074bda5ca153a9aa60145f54a7a81ba8947cd08280f4d1e3f2eb1ce8310912fb4821cf9af23c6b40545484661261340003d3b9f42095aa3a922a135f024f3e99ef718bcd729f5c30fef5cfd8b0b4791bb95f2f437319bc997a7845f7db63ad8357ac1c6ef1fd951f63f20be1740426fe0b96c619b37954c137c3453801b94739c7c05a25f363b703978e2fccf9ea0fdb342f33414cf01c6e3f66f8c2a90426cf80cad681c20963a09ce52b58e8544b3073a1223692c39c6b2f4b5a56342bd810a14b71ce04963a23b262018705d4316227c5425045fbfc190d315affdc687b8847857cd00a8ea50f7156b14a04f486329805107a0a628e104977021d03fbd2b48ec8011d9163efa455afde6bdcc4b7a9cf678af4eda653cd291784f98f64166578dc343085e6a2c301853eb07e69fa7a8c0a7e76156fc7c932a13717fb248f168dc4c59be48c374567cd7860146603ead5dbb5454a0c1b50c615c7b68ef37e4a0a6ef1c605e5dfc27f60b0b975a3bb600fd1d684de0922d3774c1c708c2a7bb104e161acdf4468e83a629f017e94a664278454ff2d628336db7a4ec1f7228a3634ad25a4239a7513ad75e9ad12c916d28cd6896c8369466344b641b4a339a25b20da519cd12d986743a8cfc4acc21c4568ed6e20ad72d9fd4f4fd0f249a9e0a4d33686f336842fe8a314e7de5b904841553d4828f15bc5f5278ed6bbcb8606674a206f7f646498fb7be1c8797d770fe6a2cd17f6301b20f650f14e5b03590c11ddfb32ec8f30cc7e83b9bf943bdf916937590a4266e4902ecf5c8969f8f884b148d5811727d52fca5a1f42c92f372a43ef3d1bfa06716d3a597c30e56d5c2645a4fd3d1bf82b2412247f573b078d625f665a83cd86f6210de2dd00de181cac35cbe4fa59ffccef53b9430189ab1d75d401a8e1b039585ab24c91fb9f3307d4ba16f62c5e0a654eed9b467dc0c79b6eff8f3a6f428523fcc08ad12d156dcdd6ddf51e2c1e7f6139ad1509abb4e181ca22bdef7f79a26d213cf333af2a38d1c96c72b8278ba9708698987aaa3d887170b1b43b344cf5005f3c64c82c8f220ea3a9be51614b687b50b810cb5b57e767c0eef5d21f45ed5cf8ea9fe64eab42fdd27b0f0eeb98baf867681db26dc4c60a05f371c1a812a20d97ea0015ee0f303607b7f8fb21584c3fe75f187ff174a5f01a2cda8c3185544373a13716f93f6eac90a1fcac6260c308b1e01371301bc6acc1752a15f01c38c009fff96fe3eadd4d6463d0d1250e320ad917ba821c1e4a193ef318b85f65a9813e4419a5ba221fde708736c571e7dfe3277fa83edfe92fd1416a00537d16492de278dcdc929edb55e1d7414ac68b833b989e799f0194cbc8bb87f528af3559c137f2351cd59f8efbe99740ab508be6243be5f7e6e964f6421cda6de3f244d1012f0540d5d798e291b90e960610f118a63a32bff1da09282b27d6fcbc37c41924e2765ee07eab9de4bcfde63220e79e1aeb3bedb9c5297d29df37033abbebf5ec0ab57c92dbdc7809b097d717c5063063de8b1433f840ec55e5364340e1dae49c7809deaf8a7f750436de65fb36d1b767c9e0263e43629e2af0337d9ff9230b462a81c3d8bf60b50f8d7597238065c7ab592746ae5be627582182cabf59115e21a89ca1acc10eedf8cb0c8cefab1ca645179a165627666a5efa301525b4fe67d5132a8daddd2c7938caee6ad844d686478bc194ba4934fe895d54099da3ae58dbd91378dc40ca44df743ef200b5507951063bfa74e724481472587e7e43788ec25247f9615a093edb7c13d46af30ca73c7cc9831117f5ceb63f7464221abcf4ee0c7b24840fc818f79fd9b9bc5701c76d71bfdda322e7365a6f8994e39f4ab447a480c401005be50ae6e67331ccd6aa1f3ada4d2a37b7d29c3e48bb615104f8214d887b4cc65886f194bf100ff8a3a6683c38c8f895b95f9039f716a4b879db59dff38905d7d80918d0168fd4a28d11590605c3322bf1f0ae3a73e5780805529d5ebe4a7064db1e3bf1ef7a88da1213fbea544d8da1cbf5dd068485a3ca8f24b6019a6887c0829e6caf4e4aed6c294546c0081f98eaa30177188fe14c90b57ac7e509d8b1ac33e737b56b6395adc3c3eadc4cab2e00358962e669ff3fb3bbb69fb9d77edb567d1b60acc55b07d7d1622c2779e8792619c21009f0731cfa3c62ebf705e067943cb6e021432805efe0ecfcaad9c0f4ad3342a73c230d4dce0335a78d44d4647ff1653aea38c5120404316a7e9276c8009b7c3281472541272264de6affc29178a34df210bebd377cd46e1c829b9da918b8c54cf2aaef61428e06d500a74dbb4ad9ba2a854030e2520942bc0ffa9b6cbe98dba4ae12ee5c51b58f70169d4420b10355ede9b6f083cf02d96c407e797669f120c9f8dfc5bde3bd86b3361645c327aba53fe520ef1b76b25137ee26022001a220c4f3e3e6099a19c7bf54533787f983cd0acfe03a173888a8b6bf9dfef0026769e245c31bcfcbc41c752912e1280fa2fa8510fff01ed8c5b45ac356d0c796a909a294e2e5783588c3409349d36123fe630b3d64e5cd31182452b7a4babd5ebe079d7903f03882cb3f4bf8f629fa177e794b011e1a02e9a1819fdfe876257f907494842023a15c14f0abbd48a4463e93df3e54a7c0f6b1b596d3845e258f03bd2236bde3ef938fb30fe0c95699fedf5c06f2456dacbb1e830b7c191747dbd2218d9dfe4d14f0756166177d707cf2e5b82394386a0d1f8dc0512977245427a5f9989f635719dcb73ebb1730fb0dd56f24d1447801f6338c57bc3ce0cb5ada3edafe495583832809001ba5b4b4e179cf3ac8d1ee11a1eb54c919fc85be2bdb05b2dea4feec4bca6465b7dc2747f2c5e99b170b84c21f2c58bdcdc0f4bfeb0d6c391372bbb7e154abe1cfe805df36a6cab922f6fd777e059218d073eb8495a970c45440adfeafed9129416fdd6228f0acc3f56c33ca612682c7a81352a8e88b2563bbb279c3f2c4a0620f5082a2df3c4f9a1857261448776651dee0ab065d331ba69ce3cf9fb287b6557c359cc4acc63784d2bdf3e90fd9afbb2385b7597952a0c859a08884a16cb3687befb83eb566166f4c48cc75d74cdb05db2e4e6f88fa048902983ae9ab6b0662b54ea809870c6dd62d461c673e49e445d2cfd8f845ada56b0c54f59ddc1b352e8ca04d9405d1bd49cda0dc454fc1d924ef20cd8ea7d351ec096b09d31c8838406017801208f2a7c7769831ac0ba604d3e384c256c72ccfc49db4ddb9638f3255c80c01ca7de979c70832ade98f3149bbb5e0e0501a321a1ff4952d05cb399397ff4d40b67f7caa6debef8ba067fcc0174baa45c11628af150bcda1502beba1998968a4aaf01c23cb4c01f70f110edaa753499904f5bce4f66cea2f3fd803693c39e94cc4ae3d3e21caac7c318cf254fdb146883ccbae6a8ddf2b7f6e5b2a3d2953dd252038359a46585f33cccf1e8ec75c1ccd5dae7e60aa5e6a2abfe2352bd5d71eae954bbc6eccf1b43bba5ae74914f6ca16e47ac927cb5f6796a6a59befe56cd4a341e174da932144115509f669460ed319e5539386a5f67b09f0e5c35d198d294917093a6dd73641f6b665445368f041ea990f93169cdd1f8335944a75f77079ef28865cc1637fe82adc34d3accc9f3f3ab5657f1b9daa7b76be7e1fa3c505b8b747e2dd0f1199f1b05b613e05d2ced6ddc0b1cded3ae731dafeb6b6d07df3fac23b63696bb433ccc98ea1fd14eb7555831f681904b59c3d06439b34f2135f74f10357bbcf2cdf9d925faef1f37cff338d34667760d10daf697fdf3d73ba5561d854a643a5fbe2377f73b92ecb5352c07fbfc203856b2bbe178578ef3c40ec2bdbfee7cb9a109c13559929ba8a80ea45762ad61154f2f8063a5dd28ce56dc1336746b2e98ab47609bf2cffec67c4cfe12e2968d74ef680707fd83f21d13ff51b5eef62ec9d9cf1439b35b4d791f60e95dfde370a0299e09d02933f91505ef07a14bee39d220e5110e1091e1f3aa8490b72c150ca7fa29710c3d4626d542989e689beae4684b643a645742f5100dcb6816c3543be85bb3d4a5e3463ea01e8979a285f3f6e586b30ef006cfe3cf5f0bf8a81c7743fd948610b37c904db1215afadc6041f9737fb330084770a57e6b9ecde38598f4c84e76cc0a25030e4ebd96f30bd50b6aab55acb53de1eca128b01df93723ae4130bed8f5e5b5453746462679a4d2cf098e2c492ea5253dc69cf36291a570a50e5a6143d3e9c2bbb2c737a73db275219593d7abf5ebc9ace85e832391e7e4bb1783c7e1b69a129f3e0daff54a2016ed54d2fe1a66c6babb4f6b77a39d096f0b126b49b49739f840da564be79284cec3643049d8044c0697864f43657059d83c2403998548c093d079980c26099b80c9e0d2f0d5e1b28655653175bb7b2a5515185bee3a0f9d82e560b3f0094c1236019143a6e133b00c64162203cb41e7a153b01c6c163e8149c2262072c8347c069681cc42646039e83c740a9683cdc2273049d804440e9986cfc0329059880c643b5c5ca2d4b2076e1a6fbba46df96c68b1f5e39a466b3754db881a2cbcfb890683c4a6a104834102c34082c120816120c16090c03090603048601848301824300c24180c121806120c06090c0309068304868104834102c34082c120816120c16090c030906030486070983a91d888764030f1bc717a683861d658e0387ca9311379c0493898b266cb2dc9742a72164ac480455fa50c98a3f17042381e63eb3f5174ea43e0fd9220bbbeeac095a407f20ce0f149083c1cbaba4f2d86db6367f48ff5500a9792f1b2608a01792071d3909d00bb65a826786040d00b694cec1448830d945fe732d7c9c95e4479817932c298b1a514ca4cee1c0c31ace6691ae4d04f50e0bb3ba1223bc71502463a6999f39761bdc67aa28e0241ce8f2d5eff36e20f70a43a6d4aa863ad5aca8221633dd5847159d44a31a2f53acd54a34cc3ff89d5c36d1772d499cdf3478544c9cffbdf42afa5fc91a1e8da342c555b0ded67acc22fd1a26d9e83d34bc58ff1afc51d0ed672e124e4dcbb85fead180ce9fdd6b438fd9c14730123e64b8af6e50639d441890308a1d25f151c126d15c08e84a457ac1af430bbf7fce5eca85a3dc5eb26573b2cec24bb2710e6c454d9ff8d12986ee7b7858bd619320148ae8fc66dd30d3a832b5f62bbca5b32a6324cd04510bf92b993b4851013b8b422458ea9730f4641be90e366cda57fb6aa9551a91c91499421e3d6e23f5f36a8b30ffd4374f15bdebe58a24ca781a833bd0ae7f5909332806c0ee6006c28d3a54338ffc5c4f97ae68565172d5f250919245d4c25e931882ae017134ebdfc1541ad944b1800a78f4980c0170304088232c1ab9e578794b97a1ca901014f0e90a3863edb97016e849aeebc70f23c60b5ebfb7a94b97a6ae29653950943e742bc69cfc84433eac203d23d163f3e96cfc6e25fa6e2d7d597ce311337b77127fee47b5e1989c00f85b28569c72fa6899f5e9ddffa93288589e554a2cea25651dbad03a5dbc1de42c0b2f2e69c6d2181b21222201fb3ba0e591b606f6a11bc2f268fc57db69600c2c679db7da47217443634c7a3d31439db03307ba1f24c80e48a9dfd98afa2d17d0c67918b693466eb1131ca48341fbb42b42896166e5a3c036bd1dce8fd96f7035608b16b54e7f90ec39bf61bd93ba9f0df753dc344166765ee93065bdd96c0cf1a70b5c2a036b825f95e06e94b6ec0ff7d661df42ed048b092b403744a76130700116fd664395eadcf61df46e2ebe23c943398607bc29b4559cb4138e9a8801fef3f55baee3a5a445a3c11101f7e04154d2bdee4c86f46e06e7582c754bca1ae5cc2015c5cffe4b26fa649611646c8f4b9fe6ef550115ed16bce0efd6ba79b2ee3f787df333dc69357ec83823ead7cfecfcd02688a1095b374424a998f628dc72fdd557799bc4066060a1c0ae1c76d45571d1b8f1a9df94642382b0b2e1a5b9579445019dbec919ef129b8d14210cba2955fac6d72281a0db8e30042590e73a2ae8e8f8cf85e649858b4034657d85eff5720b822a3d0939e27d35e9d61de3df67a8d57fc7015dcdcaf26e965505eafd734d7b354dbf8115c70a613a0e8b0640c6652e91a0de087d9b2b9281c78a7c3c7c0f04c8c175320812660000ed81778f72debe725565b09d8c66ca9c42b91f4e3567ff78d3a44b27790319d9912358610f42b22d758fe59955f41a35504840a8e1633739171848bc5b80cee786099d997dd56c5b3b09448ed47077ed7d179d5c056465e9f2646aaffb6032ef9c485d7cea96cb9b67cef28a3966bb38af2879664746096755994bace39dacc11c6af8a2c16e0b950f03fef52ebd9bf097a058277040b3d4c38b820e80ba3e76850bbf4a77b50656eef5ffece58a916aafd9a85d19d2e3bc14480a9cf2b5d28a6c013b99517af20d15f78de6a691f270d6ea49a15cfe671872fe249582fc74f23822586ada8ce07a507ea6acbef5b0222f583787ab6ccba7f87587e18606f2c6d5f8f27a7bfe8b8a62fa15db792ac22bf41a711f2070d91d57e39ccda4b46e17ad8f7c3c138c8b8e2dd40c91a6b20df26c66791fdcf741ca7887566b10456f8a6d4a27201268e6aaac20bc501a0d059337d6125c9f0e91c010ec82450104c3ffc87a64d3fc84a9794db3bbcb1ca5abe892f0e9e77f563ab2877236c04808774e5719630b9a734899b007ff9c14cb0cd6f075f127a265f5c4ccb1bd05479dec5e97a50b1b2db11554358ccbd6c41da345b78ea6f67faa924135cb2bdf9c3a7f01d90d413a834cae56780af7d5c380ae6bfabbf33b91ec4fa8fe737ee865531db656f5ac15b7fb2b5f1699a553896a0bc373d5f11a3a6dff7feb51d44ed5947e6fa8235db03ab5744338636b6a420ceaae4d9f99584a84f59bc6eab49e1a49fbb8ef86ca48a7ebfcb9efcd9bbfd4a235d5f4b091e83b4f04496753d537324eab6b6817ec377f39614a0a477cae59b4c2280977387aba4002051c3f27946329232ee91584667cc5db4451d9de79861cc0d85b45bded65d0a872c779acab0439076520f69eb647156e0945460b7367fcbe5af901dc4e71939f43b161a29f7b6a6a4cd33e1f57232584d6fd0bbb2cbfd68dace15f9e7dd8183aac2fc8d099f77aaaa3ee18962871a38e3006bd04d7fae315cd23f702f7a4a1d1188913b1a790cfff0586547a64d8a4142294dd13a9bbf8698bb0478c091c75dd818bf30ca9f18329a0783324d7a8a2f443d991c021de1badb9f0b42d13687109fb21b42ddbcda4f60a56f1810a18831651eb3fc0d30c08f80e9194de74de9d9929c465bf69d56828e8970cf50bc915cf9e9c6d00ea91307d10e3dea825d8a8ac8e1f1b2a3c5378955cc5e6e660c43c660fb5c8220758c19864045f2294490b7757919861f1b87e1fbda45a750fbcd46861073cc3364ba95001e71b2fdf485d0162ba8f04c0237790dd368db394ac731f65d8246fddd57ebc86d7af7ddf2072991ad29711faa4c977d54f6b1395645e7a77b942d1a428986ba79c2ee5ba7dc5dc61fc172ed9db353b983f11436fa4a3277caf36db70bc57767f73f3b07a6a58133c7bd2d139c39afad21b3f1afe94bf732961d9c0bdd380eb437e6144bf12593ae49989795bc9440f62f5af728d7bf22bd43e23957ffc5a5214af8cf94a32eefa8fe36e6e60987c706b491ce7da9fbcdbee147281cd9d05b4f133a9dfc6396b0336dd89f1772cdf686fc27aca120def5d4736b3298bd3266f23ca51ca161f53e8559252b65dcfceee68a3cc87030bcc8a4e1cdcc3fa6390b3f421ab994dcec8a31648f77b0a499e4c1e74690d30564b26fa71e2d7433fd1d8785620a704f447d182799a2ff4c5b207ecc9c0c570b8b492fa4ebe1484d33cf9f4165b015ff36e7195717a065979004146f436de6d91499ed17809c40c7772f715001c42ae45c63a1adf0a7330fde895095641185971f12a7a20e8afb747311506439f873dfaa0c879d7b5962fc74112d70f8fc4cd52fe3da837dc7e562225130174f27e7ae9d61f85608154cf8eef7abe3d27c106fb00652854c3e3377fecbeb7c0e6b548d84f359f7c5f2a98a4a23f1b46760f0921140b19a8f48cd2f8ee4687508c0b522c51dc24c5f9adde1fa971c4f5ca2a0e2f74b6f3675a37b0e0af9661ac475e0456bf1aaea92321270df6b3ee8be48ded6503bbf28aa1a263564e94e6117474e16c0c36e011cab028ec384310c3660b46439330f0f0f0f0f0f0f0f8f3121b52563d8354929498dc4d913fa419e524a29a594343878177a3a33f1e9cc7490904d5a8206017e0b5f0c890cc7e58fa56637e6aed1020ea4ddf8ed8b2767352b6f20c8d978c568e94e9ddc40fe52a3de49d3d4a9dd06c227554b79a37c8774b9021fa071430b361083c97c41c65afa035aac81a0f5926b4cb3a1f4a3b96a20e80aff41c80b4a77e38729d0220de468172654df75bd6a1e50adc00768d0d0020d84cfe0d59764fabf2a9d81a483c9f4e875416ec9b5300341a67e7adb0c6a510662fa0a2a7ef8359552189574c335015a90816c4a69aca73825d5320652ea8831259f2a5477c4408c1d74f475d6383d2a6120c8d6fbf46716fc531c0c24d9faff4b667f81341bbb414dd7a8ca9617485a64c6244f65b44dfa2e10ae62b63fb94efbf6b9400a3d4ac4e6dcf5a4fa2d1073ce7dc6a0e4d39db440d4cc0c7aaee3fb7a521608164d5c5a524995cc090b24ed9a43f896bd9a9cae40d0abb14766902fd1252b9045655097eeb93664a90a041d4de6d4f7e4a20551819c569e7ee5543f85d11408a3baf2e65e6d778aa4801a8bf99c3d87a2402ed7184fe7ff3185a0406eadd2ff1854d0f1739e4052d9cf3deb6bef84c7092475a1762d7a27dda32690e6b4b4a62c324c20ddba7a32bf6f8dbb59025936745eb5d4288198b161747a8c89f24b1248a6f226dbafc7af549040b4b1dc9aab92feb8942390faec83d22d9f62a5c508c4ca95b91df4d5d72a4520665ecef6ad0a11c8f6f954dcd790dd7e0804d1d9124a08f117354220ad9cf014e4a8f49c83409241577d52a2f467e54020ddeb7afe547f39867f40d2d75c9bb24ace5c1f102bd384098f1afe19f7805c25ffb5aebc457b1e90abae4a5ace77b24f3b20c7ff2cabb13ecdbb0ec857c137c70d3b0b770ec89fcbefd226570b1c1064a79c27c2672b78abc50d08f23aeca9e03d1ab4d5c206c450ad11331b937db65ad480a062ce1de15135a8916a41038277ba7dff65ceedd15990b53c6cbc30137ea3ca82ac9664ce4d7955ef692c886a2955ae1dc182682335f58633d9babf827ce2d228f3d0173eea0a824ae5b521aa9488d80a92ffcfa9ac088d1f4b5610e4981cf1aeacb931ab2009edd1e3e8a8cca555418aefba799376d56c622a089bc4b267af924b2d2a482abb67ce937b1ff34e4192ae9b6216d5dfe79b821432e55eef4aa59f540a92ede7dc1f3eba8b0e29c83a26f3e51cc7b6534641f24c5f33dd4bbbbb2848669e935bce497edca120260f1bc62c73e878060a629e9353aab222c027481e2a54b0937aea2ad50002788218640a71395dd0071b8d2e0a07121104e80439a55ca5bc62e91ff1738220360671edd579ad4d9b206ba510e9b1e38a9a34410c4208219e7443663b2f9804366ab48001d7015004013241d24cfe3bcaa26cde0613441d3d7ade84d2dc1fa66196be68011769004804012e41ce6f62e4cebbc54bb104496e564e3fab50b97f2508b6d9a3aec345b9cd7b1f41004a10f584d0d2d93f194a6912c4370f4abc627eb40f4982acede15afec26a4e21402488791764e94df265fa040972fa7bc645cd234839d655ced4f7aad9e40892ec90b93557744d336a04c9453b8719d161ef7146102f676ff95c5a0439691ba552bdab08f25a7fe5d3557abd4f022482acd92aae5d67c6b11c4410bb3dc4e2448a30d10f41d2ab1aff34ba696749004310f6a3494b42a485205f8fbe6be72ce266128218e2f3979053f2544a7941804190749ccb6d759d20086a45f43655e9a462200857ba73e42adda775f6090008724a9edb63c6f3ed11fa0329c83629e63b522f5d3f90a2dd7d0691b9317d4a803e903277e5a98c273e903b9d8fb61c9772a3680f44b3a046687daccca4d103412b2f8a4aa755632a7920de9cbeab9c8e07928ac94a9d07a139e9fb0e2413fe9db474ccbf9bda81b42d1742bec65c5294752009953954576be698e840f05031580e33ce81943347b3bfd9532b1d01e4400a9ea56290fbf33713200e440b5de2b2f5fde8121cc8b39ae2e63e466ee9df40181167a7ce3c3e3cef06e2451d4f7993307dfddb40def351c945aa65ac9f0d64cdad1d629543a8f9d740f6cbbcdc76131ae3570331ce56fae72d65e77e1a089bfd99e2fa4163f4d1405ad12d4ae6dfdb9e7f06926a56b8d5a5bf2fdf0c84b7145db24d964ae39781b8f93bedad25b3cb9e0c04f5afe449dfd4c8d48f8118975a6d9da7c3fd622075c79c3da508617e4a612087a6cc71d4b7c39e1218c89e7447abe89fc442e90bc49474533e15edb24df202514685ea7650556ba72e10f369fece57791becc405829f9d4973f5d4cea62d90b6840ea6f30653329ab440f29aef11532bf369ca02d12cc93f7dd522d64c582055d6565c5bfb5066ba0229f3f6a50a62b2023989b7ad20df496496aa4076d5116d5d494386a840ded6d82a11d19d3f5320f6a84e2bfac34669a440fe0b91d1c3620a61890271837866cf34ebbe4381e8c1f3e8e9f47332fe0472b967899ddb14bb3b81147374b4b45a41297513c86da6a277d5092d6a2610b4458495dccdca69b40492be7c977683262b1b2981ac41b5f9a9889240f2117a42e920bdce434820c69cfd3ba85cf59d4247205cea136b7b0fe5163202c1335bbd6f3fedfe4520c92599e49626b9f01381a05216153cf64320b85fcc22b392a8242304927c128bf3a4f9671304e275cef82c7127bc060249ed6ae766964b22fe01b9bd5eb4fdcf62907d404cea42a3555ea64af680e06ff24d6deebc3379408e39ce1d902fe6e97071d995d10179dc6490aae9aa37cb014105af1871d721000ec89f292c7bca9a721811e00644eda4942975992b89086003824e594dc676fcff87003520bb09f52484ced7b163084003b2c80561a34e3f556366414c2fbbc993eaa493c5c882bcba961746b4e9e82616e4d45acd9bfaaf2a37b020c70815299e7e05b13283c66469e7fd7505f92f5777901fba2ed90a92f8b4b69652b8b3a46105a9f453524dae6d9634ab205d25f17999d9e94da30a92891f1ddb477e16a149052963274feaf2672695410569b39edae7553ab5cc29887f9b532ebd4147faa620f86aeeac6a73fba752906474e9946afc623c91827c1e7bf9f553f44ba320cda7f412f726a72251103ebfdeca7c4241d860711a9a29e7784041d4cd1be3cd49df8af90431ab85f8d2992752e309f207f3243a8c8e21339d206aa5a8793d293bcf0b27882784caeccecb2608aa3c6dfaba9626bb6882b849084f2ad6c54ce2920992be4aa2f4f5d827b76082a4b12b7fa5cf4989b35c821484ca4eff75dab52c9620084fa6515b543e152c9520e9dc4a7b7993c8e0154a90552c356c8ad137599904f1352699f9fcaf74154910e39877fc184f85592512e472f1a4ea7ffea6870459bf2ce49eea8f2005d1a13c7d54c409b923885d77c9de84fe4b236f44daa3fbe534c40852ce2c117555fba0b3085286b5b2a4d747c71845103399acb64f2995691241d4d3dd3b553a98b6382248d67aaae3821e15753f0439e898e810cf69ee764310cbe35f26738f57b61782144a0625f5acd44c764210dccf349cf8cab2591f04c1b3564a163b2a967541104d5752397452b1d1f44090455510223fb6594607042988675e1475b199f91f4876712df3694fd5e57e20593e99fbefa37d20de5cb0ad2c9f9e793e103b838cf16f6da6fe3d90a37b67d4b82767427a2059258da384675341280f047b1bf59b4c5b5d0c1e48b3417a8c21f4dd66ee402cb3d29d2eee7c753b10a3d6c91effd822d375206cf7ae05d59acd331d4841586c7ad60ab3770ea47ce19a2ac990764a3910840eed39691807726e1d2584c84eabb0e19069391b9d84d76f20478dadd41697295bbb81242b881342498d9f54dd0662ca67b15e152cdd6703e12e2e5ac9d01a88716d83de319dc23f6a207a5a8b31acaf85f5a481182d3d4ce9f6243c8306e26b1af7a839c794e467205f66887667340f72339052b4cc9e6a7b3dc6cb40fad92f65a72603e97cd73ac77a1c4b8f81ecf92bc796a56f8e8a81a449ece53d25878168b162f64f6aa2a2c960206fe5877c1ded17883129a53ee98fa24cc75e20468b33f215b71b33ee022996c60c16eae763121788a554a53f5561b44a5b20c5c8b7b433ea62425a20a8e63b8f1bb459207a4c9647dca26653592c90e5e398c75e59d3cb5e8118effb5e1699510903a9828e0e993e0915d7020692757b36dda2c209e17d81947f329e09bbad18b617c89e3146669c27d5b80b7f7cadeb346771819831c8a829fa05e5c92d105feb4f6d9021df542e861648bad51ff305b3b3d1626481bc3d975163f63fd852031e37147023d9b0e1e181c3c3a30e31b0408efd4c4255927dfeff1588db7945c65df11496b70241bdb2bd47c5fe93bf0ae4cf952e1ac4e33bfb5420d79f8e49795b6ef8690a44db2aa1d9eeebda495220bacf9b6cd8f930738a02298c87eb982fbb4d9aa040fad9fc29a9cf72ea4c4f20e7eca43fe9aad3922527904aa5558db2414d20fde5ca5b5d397ba58809840ff671dfa33d93be04821e9d0d9529c5ceb012089b64ccb1729da6742709a4ac0f325bd642a8dc4102713b848e49740462e56b92a365fba3698c409cef74cd92972210c6468788408cae1633d32190b46906e1633208190a81e0395a8be5de3c9d0b0259637385785b8da50181705a19e4b3b377b0fc07a4dc614ebf643bd4d23e20bc56540db6f116ef01b1838fca8d317a4c211e90d2a9ff4b9ee13547de017163dcb2dbdbc61dad0ec849cd4f5b35e6bc8fe68020746345989041748f0372e7ddeb48cd0dc8298712a69296316c40ce9a9adcce4c67cc32460d88a763dedb61d47889316840ca70396bcc4235e57016a4d0a996cc4486d4fcc982b0a692860bd9797dbe58904e2955f55432b6650f16049372daf7a77d05b1b3bb7e89470da3e40a5267c76f452faf246a05e9ed2c85aedc5fcf610569eda3789ccdf08ada2a4861d7938fb7faddaf0ad2e80a5bbf7fdd4e2ac87de66f4153f691511d00062a48a97a3fbc79386d3deac1380529a9bb3c23568427b97fb0a51a377294a51a377278053e40c300304c41f2985dbf12fabee674238d0b53b85841c980dd0aca8d09c0280539bc2c76da5dd11eef072fe003477940df17e504e815f8008d08c02005c12a57ded177e135c5d22bf0011a2f80310ac27fbe18d3e75814a4a4c9f37b65abfcb1120ac285bbf50bb74141cccc24bbfa9b4d59f413e4371565e6fccf447d9e20c7caf60a5ea937f6ea044108212b06d9fd539a7fb01da68013e41c77a3c56416aab76d82343adcc48617f929d69a205ebc6a502ba3d9b665827c4205e52274c6115b618224ff55c3fad26d87dc2f41ea4ca95977d2f7b3640952fa94e436578e1743a612049569f929884f1da34c0972b2d42905b1b0b7ea26419229dc2c878aad29641f6c8886f3008624483964c44698362917cff21bc08804417b3cadcda537552a0309725c8cee399e8c6e766000e3112473cbc933a589939ff3c1b6826483860d2fd21250648b0b4c608b19c07004d1332b790e32ae3b80d1085252fd9b446cd486d37fb0d9285d7c4103188c20473f25e6961d45e76d2180b108d246df1a953dad8b755a71e0a061ad3834e09b6e70053e400301301441ce5e6f9bba34fce79e08820a9e4f664c9ed2b38408521c59ad196584926fc238042969eb137332d8e8fa188298fa5db372f7b73da610e451317fb6a082e8c948086234212ac6ed2897416510a4746ff9ad4d8b4abb0541ce20cfc743a60341b29675fb9446575ccb079b59d200031a1004a5d2baaeb6e9cb961f6c673870a473128082a4016f187f20b5a6074f91cbebbc2ac3f003e1ff52dcca296c3d993ed87261f481606f6632e528c2774d7c208ae97f70b1b078a9f9e013ecc164a62c8a8e39ad853ed8762bf0011a2b80a107f298ec302a49539a6242a715f8000d859107625c913f3f6a3b9ab878209dc68d15673aac74ee4076d7d39a8d7e2756b503e98385a6eae62ff997348116b8a04c40d90830ea40124257b8560afbd94b7420f5c866b8d22b1aefce816cb92cc536353b0d170c3958e5fec95407999f0d8c037fa74ec7b88bcffd075b0b0c8db2be9172d4483890e35c8dfa87ecd8f1f0f0f0f0308f018c37a0b14a7de7bc91e38b13c07083d13a07d38d158d96d684d1866a837d26e1279e290d1b5e78787031810b64e00213d8c2638b056c718820e0e1e1b1c50526b0459202061bf6dc1dc4662db595af4430d6401cf3203a65d6a4c30d38362c60a3011e1e1e1e387e00430d30d26030d040f86cb9961f9ab2c6e4071b0d2f72d8a80181bb07c03803a92aee76650c9a35a96605c30c04d37731d7fe4c94ac0ca4ee4c29995fe938554a08c020032906d34ba1eda49dcc8f8160253e6cac6f99d2be187839d32b2d3d858178792bb98fd096972960209dc69cff6af74179fd05725cce6134d3c51ceef502294e687f8d41e73c25ed02498610cbbd5c4de37281a44c2fe50aa55483985b206dea11bf3aa22a8f500bc4afb1ac8cea29e7dc65816839853e2fcd234c5430b0c0b767aba998dee4690430ae40ae0d55252fed2ebfc70a04e9e1c1937ced956daa40d0acec522353812c1a55f3e7db0a9d845320fbe79316e3f669b60d8614c8bedf16be54eaa499741e0818512079c9cbdb6954bc54fab6030c289074d5c60b21f46b59f7c1865607184f20772cf51bfc2c69cd491f6c5c811b0995f4801a6fc38b2e10046c5880038006184e20eda7f79196f31a4cf5028c261037e53e5932758a2a331b60308198e1ed6fe1c52fdeb434c0580239e9fc9bf0f41c64a772d8482a500249666d8cd9b2dd3c0406184920ada7643d979f9f5405470e1be5120c2490bc744ab7940302184720fb8ea88976d84f49f8c1f6050d1c35dcc3a34d15308c403cfbf0a21e2aa59c8d84c33607308a404eb12bc5c84c7a8467c38b35082412d8b061010f8f52c02002a9d25bfed1ef15a5bad10818432087d81f199332cbe8e5071b0e1ac90425c7ddf101861088de39bb3a9ba4fac8c700230804ebdce1f35be6c5df3fd8780b2e1c80060308a4f694e2596dd099d6f401183f20488b7d2ded7e71742fbea091a3d0b02b307c40d0515b2d777a40ba4cfde99e0760f080d41eecda47b6cc92f9450d13e0d801413587ce12fd9846fa1f6c3970dca8f1657c1c80a1038257c56c3532a673751860e480e8196e4a9dde890518382069911bcbf3b36b33df828b096c8157807103720aa63f7da8cd160bd822b9a086061209ca053c3cea60d880d83677298b0edad2686b40d412cf4cb17c35a3d1821b39caf044008306c4df14367d480d1b2b7675d06216e44bddead9636facce6541ecb422b25f63aab33216c4f8eb49f3a560413e8b39996bb28e22bb57103b894dd76afba182e60af2ff5c0eaf39a5dc0af25aa97b9b0c9ab5295610b35d098da167d292b80ac27f6de83133935d15a4fc2e426598af24bc4b05b173d0bab2c946b454a820a7e865ddea4d67ca3e05c1dd934e265b74bfc4a6208992a175a5fa5290d30665ba62d57b525290334c5787df585b268ee24c77919e7e99c21605512bfee52f8856b8f10254d0221464cdc1edd6d30505b9c45b4cb99edcdabd0f361a092ddd48010e1be43e410e4a965fe8bbfefc244f90628bdfaca86421e3a613245de29da176369ebe30d380da6a400b4e90925ccca1c4ad1f6c769b209f4cf2bf63fd6bd6d4b605170ef0f048c8c3430b4d90bb65b3cc4666c5851f6c677799205652d22c4ff34d08fb4c0b4c10afc472f8d1d4b5d99c697109d27f6ad5558c2d41ca7e9f358adc18bb7d0b2e1c80baa891821c2c4834a0a04525082a9892ad6729c4c7e11af0f0b89170787850829ca6af4a9a7689bd7b1264fd5426e77a7b839a922059701f7db0ada945829863509e76b3a6b95e214152f1fdf45988e9feec830d211b351a50ceb47884e541466378322f51cba08523cebe789bedfc939b6868d108620ed2b3b2ed09ad0bd28211a42bd75dddcf182bda071b0e1b5ed4e8a28b42c3af8b2e12e0e181c3045e78f161a6c5228e224f25119e2a43fbc18623d5c851e36e0b2e1ca0e58610b45004f1ac3306dd981bd4b88920a577ca7b2ae7d0cc4944903b88efee12224d9547042d0e41962de566eaa3e2f46f089285cb9945594a9bb633418b4210b32eefb86fd60f32891004f529734da968de59074138afadae2d4f9f4ba7852048662a8e9c8b5b9be57fb0a120e10804d16537075d2df259733ed8be2827a0816c24265a0082a04cc6777be590e9c70f361b5e74e1c5a1f18774b3dfe69255290d16d4f833d50e68e187b366bcb3cce4445bbd466cd989dbf7838d060d13a4f40597408b3e90cfb387d69ab1ce102207b4e00329bcdf27f95bae29bc5a012df640ce16e3e757ff9cdfa21e8895eded42e8f049f525810d2fba680c689107a29e86388d9a4e55b23ed86e243c104de6890fe3a5738877b7012dee40ecffd10b1aa63c06d1071b0b921d8817a6a97167f65368723f29a0451d48192cadf34679ab243a418d93104e400b3a907f9476aaa7b93eb53fd8cc186097d045408b391093f8f3abd754955d4783167220adc56c9d742e7fcc6b110712784c1a3ba73095f3833c0e329a40560bb622d62f6df6984052fad49f694ad348c8f00a329640927183c8a06c4557d0b7c0d0a8bbe1450e0d9044e30b1c0ad862015b3c8028815823c752ae0b9f95f249d8d7c53ae4de3d8804b25667ae7ca72e28db1c81143afadc7b4e8b22c44678b652c5afcc3bd6a1414611881f5dfb74a8f5478d1241af354bd1c9d453d207a33341c61088a964791ed11cefd20b81245ae3967f8fc74f3308e4ac5db67eb23ca51908e46e8f412ec595f103eb3ddc643cd7f2acdaeeaeb25f738b105f65f880d89a2db77b2601327aa0a9755f919fba1ec8e00179b3d6ca6ffb9410ea1d90825f1a1d54c532744092bdd2cafd77f97a0e64e4809444cd8f3ed90f9f313270408cf59e82dfb585b293c60d2f68aca0dc88808c1b90a408299b44d6c2b465a6b60c906103c2d679de88d0f532fa1a90e2c758f70ded54b765d08038ea9fc9b7a3757a7f16a492ef975b61d7164eb220770cde396350baeb37b120c88759264daa39f90816249d1bc3a7a4afe292fc15049fb73d65625f9b7457103b86bd78bcbb15a44f62d59ec2c9b0a0b2825cbe6fdd55f9534a7115241393bb55d6269f570569bbc3883c9d358ba9307f12b2e2654eb597de4838b00315a4f59039a952298fec94da17850287808e53908288c60aca63c4c2fcc1346ee4f8a22ce52839bcb8b11da6209db85dcdafa1e393ea83edb81458dfa7efb414df997790829ce27d0a59e7dadf053a4641ce693c468b39a8431404b9f84e13ed9d4acc8e5090f4261d33959292d3d88605dad0010a92bb7e5e355db515ea079b990b6ad8b040a7a1e313840d9fa1bbeb9b39a778e8f004d1638cd92d162fde468dce424727089b3cc7b4ab1b95ccff600f8f2d1690c346ba512ee005171e1e8e850e4e105d84f650f7601577f9606b333333b3326f5e4dbc1600153a36619c4bf5f76d5e9a41746882b0f1edd2e9d3e515f74247260822554347cb9c1e3a30411ca5a9f6e356d07211b6a1e31298f2ccefebcb6143872508f229769a8c4d2548bddde9b9a4a5d9a8942078e806a53ac76ce5310d1d9320df49536229fa72de5612e4fe2c212d9708bf4c764482d8179466ebd1163b8d3a2041ce3ab3a7f3a86c49848fe8780459d4cac76cd7373a478be87004f12d9f26cf9fb91164cf2a7a6974ab63b83c3cd830101d8c20e68cc15396126a94c976e85804b1721a39ff14b662cc0e459054d887acbbb8b255e00334b8e8480439895a379d8309d322c3870e44905e2cec7c7ce7d48c7651d77108621c3f5df9b1d5632d482670447418829c195ac6a2eca8b7d20d2ff6101d85207697ceaf25f5a466100d1c25d5b8c18587c70aa28310c43993e9a1e3c52054350892a8468f0f959ec7cf27740882ac1e7f39961c05825c26eaae5a661e2f0610e41883b4338ba94f56c65de8f803d9739059329edcf85e7e20a78a9afe2b6d8f2e15173afa404c31dc5305694afda7f9401429eaf206695184ce7b207f0855dbcc3af14dea81e8ad172a56a59219d32940344860a3c609da74e48120173d88acb2983f6d1a1d78206a6e4e79c46fd3e91ce8b803b962cc83bc98d4944ce8b003494e7fed6b63e73005ee848e3a904e469af4a83965f0dab3d04107e29cd2316ff892ea5f7db0d1f8c051bac091a90b538e0a1d7320e8b10edf97c1d248cde540dc1c2afb6c8f598ea7c7db820b07d8b0c0062cb0c502b658c0165c4cc0c343ffd01107f2fc57061fcd24dfcf0fb60ec00d3ae0408a225ba63f880d7f1e4f42c71b0832cfdd947fdc48e87003c94a8a0c6571b2433d9f8e399e685bb5d940d48b3194988fcb0d13063ad6407a1f25b4ad3759c9d2071b0d2f10a2a0430da474d153b6a857bee17b81cc8b8e3410633eb5eecf921fe976a081b459630e9196fcaa6dc1f1f03020749c81a0bea64c938c3ed88605ce52e0680692bd9dd28da29f9b37396adc5801221b1b40247494813c4ae5317d9a99b9d5075b1726c7495f78781c5a0092d04106f29eb6c6c94a69d24e394a8e145060f9bb630ce49c5338156b4f2f2f1303317f522debe00903c1f2e69fffa81eeae46020dfe8b324735d5f20870e4206196eea94e7bd4030a5cb93d0ed4e61cc2e18c48c8ada186113a1830bc41c1934f6cf59c87cb7400a3542caae6d6a0a4253e8d002a9f4950a2aed075332c18d7282746319d09105f2e5dc59d994c7e6ef1d5820df08e9233dbe720eba073aae40ccfaf3bd5fdaf2ee63810e2ba4947ecea9b926414715083a7283b8985fd3a79c0f361cc9820e2a54c71488379b4a9fe8d0079b17364e051d522066a64ea372faa748f383ad230aa7ea98957438d1262764d7010592a65ef453cb6f3a2f1f6c3472241ce9c613486a376c879af78c9ffb601be55c171d4e20c9b65ab58d490b97f4c1a625e86802313b8e680b5afd928eef49a18309e414f745297d9a7e539a091d4b2078f0eeccbbb1e72b550229264fe24dfd9804b2dea8aba6bb9ad08104c28f2915eecc362bf4472026bdeb6d59467a58931108736ea9371ee53bee452027cd2b0f72b14a291b0a1d44206e8a1927359a18193d1f3852f04545c01dd03104f2a65469badd42de8a84401c916df75c2959e80802d17d636c73f38de1030472a70a65efa5f90149e97abf6e0a224305add0e10352906154cad72d6b490a0108902055e004353c3c3cb607e4fa1a21644c64df3f5b4274f0a070d9bceb4ed58bcdb2ed35fd23ba9929caf8c196a640e8d801c9c3b4c6dca3d334251da14307c49c0f6716af75eabe8e1c902cbaa894c92cc9a6a42db898c01642e8c001514ee64da571ea5c7694be280747db8d84030fd07103925f8b384bda6e83daca06e48a9a6f3a2b8c9650b9133a6a40fcd0ec194ccef6ead3410372894c733ebf17ac2eb320bfc5681af941d34dc34e1624933d7e31dc86eb9c8f05d164935036e379437a82e3010a78c43093692f2147d7e783cd86176d5b70e1802d6c58c05e41d0e16399e7f1ceda2357903f6999ccbc79e4bedf0a72b017add9478a1ee9c5600531c7b8fdb2ee2a88f562d9b4e6699e5eaa20d9b96dba0b313ba7549046db7fd97bccf95aad100315a4d37ce9ae4d7c2b9aa3068e1a2af02db870408e1a386a7080060d0f0f0f0f0f0f1a768918a720fb5dc8e81a79f62fae29c8ae4947a9a5521d84eb4d88510ab2283f0b66619933341f6c7635be284e88410a82080db7be202e33fe079b5a3a2ce08205393c3c3c702ca0051e1e5fe346e2000570e0483710da8087c78787c7a9b11ce8e22444e30b1c1c6308314641186d0db929753ed8727481878386094efa386b2c201e1e0070420c5110a39a3aa9f16df4c6145a28487539bda53539359e040569f5538c31da9b42e67c82349ec5b266e9b8a1d11b420c4f903ca3d58bde775bbc9d28556ca6ea330ba5f960bb5183861983200627885eb9efe1357f2f0e1ce58b16181a773636e0e15185189b208b0e55974578a9a0623ed805313441ca41a8a670ee9b5a7334722412b0e5480ec804597ee584107175594e3725c4c00429b508e5a752884f4a6c4288710952d220da4733a78bf179228625d498d4fe7a264b5abe2062548218264a955f705dcf3121c6f936875d52a9edb122c6240872ec533e88f320da1892205efad07ab639890d73e620462488497fbac84d591946048962bc4d5a175db4e0468e479066f6f38cd418257bfa60bb9172241c5a84188e484795a5ee85334da746581de77a4a638bcad9210623889b938a295ef21741d07bfa42293bb377f783ad0c08311441eaa4ff7d367cef27935e05622482f49f398b109f722da640804672c00c622082a0827aebbf5957687c8f10e310a4b0d5281ea48884188620d5a7efb021b3c00b057878a0c4022f8c358e188520864a31a577c768e579787c200621eae0fe71d344bb893fd806e1a62f7952fb32d3e883ad8b2e0a0d0f1a08150f8f1ae506175e180052c410c49b72f2d3544c27f0e2c67b78d88d1c5f20003e112310a60b9ee293b8e8a50c2058efd8325eabd6297f30ab5f4db98a56cde90774ef2ec9ccc9e2553762f4e1b837ab793766e5149ca073a48002361aa01788c187945b68eb20eb2984408c3d1065e74e43dc966bc77a20556d69d4fccfc1548b9187adccacb4f5dddd555d4c2f25ad660762e081dc794f5755fad7d1d9187720652ccb4a0fe75f971d881934c90ab631c5949d0a31ea40ec9ca7f1fed47cf63c1dc87ac2e2799ad31cc841541072c13305cf243910e3348cb4ba98ca63250ee4d826ac747d0a7d2d194062c0811cc4e9ec97b3c938295f8c371083e5ac59fa96e6d2c60da44ac966fd648793d1d406e286ce32fae3c774aa670339c7cdd8e11ebf3a366b205f7fe5c5a07c64dd470de4a465ba99274e03e92a3cc99c673ba85ad040cc0d2f2ae50aea418e6720f6f9a969be3aed509981202c25d3d9e632103e89a83da17b250341ef5bbcebf54e97c23190638e7d7c9791995a1703413635014f20e9fe30e549e804f265e7d3a0e33ee79e9b40d2355177ee1b261056ffe2ec72ea8e0a5a02496c10f1396b9229e9aa04826a0cd9e17e96f7c9241083f8dbd8a4546c7e0d0904bd77791dc22310a367f4ccf065aac2c708245da5f7f2dfdfefc12210848dca75a777a2512602292ca5b1cae02663ce87402e15ab998296dbbc8c104ea22b567a91a920902c27111f4fcbaa7310104825b32a5f1d96469a3f20e864495f8ab41d8bb10fc8c9aa636dd7a707849d11daa259c98a9ef2807051e67a4bbf1d10c532adc7ebd31ef7d201e16344545aeed89fcc1c1063e7abb3d30a07c4b4a2e9b7fadd805c5d513fd5cee8c506e41715938c124f49752d400d88964307211ebfdd172b000d48b2db5a474be7c9066741dc76dfdcfdd956499605d17c3d6d8eb4634190a7aedc6773d031b0205fac7b0b9dfb15243d313df3ebb362af2b88ae99cb35c785d3226c05e9b47bcb8c320fbb8d15a4bd74773945efb8a75a05c184d624448e5441daa4dab28b8ca582586947fe7be75041ce2f2372dc83ea5b780a62c8dd27fda34d6675a620a8a5e4e26d27f3c75c2948694fdf33a85299e1918278a674d38cca25e4894641fedc96a3f3c7478db228c8f956547835992bc984829cf9f12a6765a8a06150907b4c84de461fd39ffc0469f67bd63e43eee6d613240d9d4f9e39f7f5bc4e9046d3e7125dd90b257382d8663a17c5a2555e6b1364cfb3a7216f7984b69a2055ea98fda464837b9c09b27b0cda4f4434940c63826cf1a25f290b96298d2e4192f3b1fa8fffd5b1b604496b86509a6d3ce6182b41be4c3f71d3942d880a25084a6f52f154aa6a4e6d1224b1b9a2566de5b4eb4a82e079f66d1f3fc6fa2a1284d3e19ebe458e7d4e43826071f2bac55ebd83fa0872f6d2a995b3e90872d0289abef6d1edb34690d2928e5b671fc446c70882f854ff324d194dd522489f42fb62bdf55f5a11a4a4e19e44907793c80c73b55317238278157a693e646bce7d08827bcf95754cb18f9d2108e2bc32c5ac1d164f2f04a9463ec5735995d06e0621889d52bddc29ef09330661a95dd1e49d37cc100439c94b2998d8b7fe240a04316ab7b86d8c17d33f409094b835cf24f74ce7fd0762fc4d9b333387656e3fd866f881b4162b8ce8d2bafe4d1f08aac34e8cc991192fc707f255aad14c0d9ae22b6298b10782ba183a55ced3962caf0792ab766fc6eef50b33f240fa4b9129fc35eddb08071f61061e08f2ef3c97f83d2532e90e444ff993451bbb0833ec40be91a562315d0cb31ecea883ad57e6699dfba15e95d96d173c2f37830e841319baa7393407f2ebc688f2a4fb62d37220e73a7d717f1697712385197120c6a8e4fabea7368d100e249916b3e74a9defad7f03e18416a9596273a8164161861bc8561ab4c5a927a53c6dc18d1cd7821b5c2861461bc8313daae9b2cff639ac87196c20f7afb7ae5f8ca584d21ac8d9a407331d213590f2ce45edf4e8531d4bbcc38c34902cbdb43d87c9dcd65890908db336cc40033928d5102264ce1988b94ce5300b5d5e2a6306e2877eca8aa62e03f16435fa7e9ce724ef29cc2003416677a6f81a35b8d563207b1067767a945cf4c5403ccf41de52f30819e53090640cd9f4a36f31bc0a06a205215b2a9478f1b87c81ac56956df72aa678e30c2f9084e7d42626844e7a341c33ba40ca954dc9a5abffd039db811cc901c705b26ca869be5fb8090633b64036a16354ddef52ca7dc10c2d90f3c81c7567a376d65fd45841b66046164866a7a24853f7a515241bc9300933b040d2a5b46e78d07fd3b88d30e30a84cd516ebd5e3d2adb1261861588af69af3f7bbcae9ca902296455d26ff7769e440552fdbfc957c93fd8520e1b85047a43983105928bfe678b9dbf27b9144862a1a63cdfe6ab960784195120e6ab2454fca01a9f9e84030ae439954cf76d4adafcadf3c18c27106b4475d41c369e3cefc10c279084b6d9b8b9ad3e2b7db0358158ba45db4e87178b231388da213f4356b619d32f8168d97327d1b51ee6f2cd83194a209f255d239f57ea6cfb604b0271dfe7abcdea664eac83194820dddf6a540d2aee453e024129ed71292be5f2661f6c8983194620fce694d20525e32802296ca55516a16bf74b1f6ca774f1051188f71f742b94a9951bd5e822e5a8f1310472ed6c76566f4cbf19fa0d6608c10e9aaf5e83a70481247bb5e3958c4dc2738040140b225394523ffa93ce06337e400a69ea17b293bf89bc6830c307c43215bf64fe5ce1e5adc08b057878acc08b1b375030a307a49863f4d89917d353cc03e26cc7130f7616d3ad193b20c5a8a9951a6ebba1c315f8008d1a337440744f714ceb8572408eb6a174ae70620bca8d1b4567e080bca5538867cf419a657c6f601e336ca0c72a21dac2667567d48094accd2c9f9869e8940560a31566d0809b9376393fd316a02db898c0160a60004aa77ca1811624091c42c62c487d3a9ced05d33b9dfd602b830c599c9f7ba54b7b5aa83e580e326241b0ce973588ca1a6d5719b020d5c6d239c9682390f10a529b6812b9127e316f64b8822c17cc92c9cb1b2bf6090119ad207d8eddaa397dd2edb382b0234466b7d31d2ac6ab208eea0c4a8573d90e3219aa2096f86f8ad60d2f9e061a8ee301b697910a7212261ee3c71f99628292a35141f2e44169888ca719b43c850c5310e52e28b7b079625a2f0b828c5290624a1ffeb5ea74d3f7c1e9e0f0f0c0812387c7021660a346f9588087878d1ae5e3a40ea00e324841bc68a7d5c457b457c81805418c8a07db542a49f93ed85c862848a6e599eba735e496110ab2d5dd8e1edbb477c2842341414ecd41c97b1761b9b9911c01323e419259d466f492cffea30fa6b187647882d826d22f633548cdf00564748254f9b26f7251da838e1e199c20a7b1e8d5c9520a36322b6313c57aede52848282017f0f0f8e204876568825cd2b252740da73b0f818c4c104b68879136d6b5fe7eb0e1482748010e93021ce90119982076d2bb172b4ae98c460b6ee4380ec8b804e9f733a8fe0e9ae51b28a0e1450e4b90828ae13db52db4e8c6858c4a90927e8c92d3234c058f0c4a102dee3daf6eed9edfac6743c624886332b21faffc607319c890c41e54c6154f31a9d2638b056c9163015b2c8046d9c9880451e3456932d1d2d3386695900109d2a7742fb1ae24b2471f9c825700f304643c82686de177dd34737dfcc14623478d13d4e8426f2d070b12ae238879aae7c36650eef626198d202733b1a4e455cd7e8911047d633fb6de1574b62db87080e690b108927bbed14d1d5f54db3213c8500441e68c9963b8b212adf9606bc1d7405e9c60d32023112425744afba93588604c74c9dbdc2e2ae28d1c36081e0c641c82d47fb621d74ac3e76fa48f15d802506a8195391b00de20c3108415f191317fcec8ba1f6c4e0119852009cdf114842a3fd858023208418ca3da4d59990a1f4a1a374aeae2a003640ce2cd32ef9777435b224310a42c7a773507e129fb409047680a52cc72ca68794090ed94ec1669ca3f08a13f10e6cf4db3847a91173f103c9ec7cab3cf24c3a70fa42cb9900dfdf381686ae46cf986388fcd1e08de9f5b73b3a52493520f24eba4b97fdbd40555c9035183858ce587f090a8c5d77720c679fc66bc1b3927db8160392ce795af1da1761d081663c5e6202ab2a9d2817cfe9e9b84a5660cea1c081b42f588a7cd3e7fe540be11a35183d05bed691c0856faf1ebf72d360e07c26e5e0d9d3d1533cc37102bb5d976f43f31dd0dc4f8b8b9a4b9a5dfc6369037cca8587ec9b715d940f63bd7902df2a2487d0da4706954162193984b9e1a481964eb5bf447828c349034738852df4103d9f4650ca3a79d8194cdf46628135e4aa66498811ce64d53502ea654251942461948eb965fd5f794cc5c92820c3210cb5f47be52ecc7e8d9582ec81803e14c9d968e52b18479675890210662dcdab71773d9dc51184851db3fcb92a5d2a503840c3010455ed8ce0e234cf3f7c1c6e704c703c98b131c0f4042c6174896629525acd3dcb81f6c7627381e48a40c55701890e1059210723a27fd1d65b4bb0fc8e802f1840c4286d2bb4ceff1f048eb820c2e90ce4aa59c2c76fee4e21e646c81acad49c7aca64d43787a90a105525fce27cf52f34bce4b9091057e5330f95229a73ed8ee7420030ba852b962e67e16f30a249daabe82997be5cb55418615645481b4b5a12dc75cf69f465f208a820c2adceac9d34e37bea0e10552ab9b818c291057cb42c51699e4de23410d1c5220688ef7b15316a39c9876901105f2e58c71935fdcab07eb20030aa47497223c5f89ad31e720e309e4244b783e0ff7190e7302098ceda8746f6503591c100602a14030140404ccf79e01a3130000001018140663d1603852d5f501140004513628562e281c241c16181809c4024130140a854161302010088541a140302c10334231503b00e90b0718da21948d6c14edbb0527e450b7a1a402d5132a7944c55161776956ea10284c500e50bc42ed3ed43d94caae3b8232012a0714e340f52178e05503400548281d8a00024939285a50a26628e08f6d9af81ba563d7ac1eef19d42f15dc27d39f70416d56507dcf92b1bb8050181a54f7d41b4c4b42b9019512547e5040cc05eacb511c08cdc102961b43745f87a06a066123f9fc05750c542ea856a1baa12c40916ed4ae94f8504440e9826a09aa03ca3a1409507ba0c484220aa51faa75a82e50d6a04840ed8512038a62a268bb41c11004503750ab42e96114b19aa2ed0cee91c5ea310c4a1ed4225078a1b40005c44b9df83eb99380236c9a5ce57b3170478e66d611201bbb90bc11870715790f1643c35cc20727c442128b29ef4f5856aed4871a53e6d3904535b1fdd069ee2c8373df6d6f5b950276a9702fc6f37879d1f47be17b6e05b7be7a78d996eeaac5578325c5ed7ba352d976827b82c477c1f8d60c52b994abf2f0f964549d58011e4056884aa7ad3cc7085d96d8fd322e912466300043344b2f082182b863ba655bb844791c470d03434016bc5bafd361a0b01f1fcd1f298586bc31ab7b02099e8779e14b4d0d1a2e242fef1534400c0752dc5200f83db59a90af9e4fe3c5d5059068d6a329f82e8378b02c465e54ae3c1d42b1b430e2591698e75678fd5609537042ac037ed8631a997fd826c02431e1c9b40aaf9b33c715e7468701a5e3e21c00fc9dd3df55a933d995af5699d23868af7a24533acc6ebfc59a8119589175b24ea03a9bf62d02b460cd3d1d0c7284b955db9dfad42c28f667ee60166d76dbc9721a41d034ed769afc338310703d6d80d21dbb33ce7a656058b26338681c9af2802e49012d3cb8999eb3656c8dd85ea909e996caa4c0947fc8c374919d7a8db4fb0dee12e2eb2ac686baa32d4aaa59e529d1d7b89b9582890e0668cb7f6b78f96ad574844019887573ec7812aa565cbbf6bba41c82c7a48b411e57df223ae071f6910c1c5bd6fe59f1d61176b2371d233b7a95910da6cc731b9b67dc12108c6f0ac55f3af3fe8becac216f69bb0a18f7a92ccee5193a9849e095cb0661d98069f08f25065e523ba69891d89b0b8c1fe38312c322261e21541a3ac2bcf70efbf887e10546c35a4964e489c04504bbc81180de3948c92d4bddf93f72ce6acef74807c4a351b13ffe344bdc1a8f326c255af0915c473288862891fe1beb79195fc8000a9a27ad89866b2b2001d12f9c05a922307b73140b0e71ba9413b47ca05e011109c1fc3e0216178abce671964d08850c0588a54256474328e63a1e703592e19b59fbba6d910f08a8a347a52995c866212b3491c848cd5f79667f10ebd3aa8bb45cd3587b8df022d0dbf152112080d2fc8887e6d0b1fcb6e5f62a91ba6c707b06d8f73a928e4f4f47e6f5505a449ac49254440d92c47573a455eeee5d4f453eed2ca95d8c3e21e7179cbff05cbeea825797741ffd546fd4396ebb26fb4eefd3ad6711cefdde6bd9ec49d9653360c89b29cd6f952c68363da5ee94542a9e6bcbbbd8f28cd2d5eb81aa0635b4c2553c1ef2b6c4c2f489d9dbaf9f45336ec5bd9ec513325c5aab682c994122db71c313c715c006733e59bc45ea3549dfbebb956a3380dc3cdbb5e0f01601a0d52da4b743033201fddded1405e23449f5ba22ef63952077a3b196d4bf6876fc07b8636028ac41493b28f0718dc5279508e1837590c034316ba91acdd87c0f2ec97f4ac348948079ab70249b7198bcdb72b1b7e5b38189a3cf41cd9ce44ed0c73d5e0d250b98a5dab44348189c4d0fdc7816ff673af4a7c72cb3d675073a6c54826690f87a0f429333e0299e0c2eb0e4989a4ade18fa80b1a4fc4787c5dfc938d0759f318a473a6ed78c4c58333442a65bc765b7ff4706c3be28a4c98b546a152860413ba1a034ba9028385834475bdbf4410b8126875b7fc15ca3074c3456e936da2104d69a6f16f0314b30710049a1153ecd4df8883943e2830e2b98ac7b6d5791c36cfd4b5eba2d07f2720d8a0e1e936ecdb8fadf0e5f04ab72e9e28eb27f67c47e2a4828f460565172008004a91cae5bfbb64092207413557842a2f0a3f2f755be23b93d397839a636d97ef0da0c5e0ab37dc47d590d01e0e95a66935fc77ab010338e9d615c84556eacae788b7976dee841d9bd8bf667b723b57a83775c6e45108f720e35a2d8f3107b4e144310b075c7f2f4035cfdedd7715b33bec6d371856e7023ac5554f47e581e4f69a86f4130eedb40cfea0c76ee2985eef67a99a53b685c21ef692fd68988b3f371daafb536a41d70949d8f9fcb8faeda2d614aa33b3bb5595d1a129b1dcb907b244a6389a7e071581f08b9d35b5805d842ef58faccecff909f034ce3c3440846c143798efe23f0e9a55da0fc452c24ce6621135e875da2561fed15093a34d47d846fc78e26d0aea84995d5d97553553aca6bc334f6d38e913bde7b93380aa44446c5373a498a70374272d8adc1f79c09b0af8c068a63970371ae0ae64be7fd20738843ca775a139b427db5bf2874257f29765d290f8ed16e6a495c07db94f4405c47894f893904106b55827500690b9bd01b1bad88f40dc303f843d0d85f30e51f8238c9b0720865771eeb1fbfc477f77f8c700fd6f10ab92ac81c4dd554b5338d4f8dd2c14db053e8b63401e8b207d13d69923fcac532e25bf52e0236427e0eacbbfdb4aed7e513ea8aba8f0826f0501605bc0a8453880e14bd277dacbc71845024a23805fe9979d9b0a6866288865fac158a439607806f0e1a55b9f07123c125c420213097e426e751c72c6aeeb1b9bd0ed01dc0b2f9ac3a67e14cccd4182cf3a6707008d1303f88a10a7a55a59930666444ceb2418cf659c20f570a03a076faa7c7db19ddb97e8e91e0540613729b697d71605c917b917ff4c158661392f5790e24ef9c826ace7076142cb78b574b5a8513d7fe4560dd4d87e0eb7535d9801be02b85818451a74fd277d0d415ff6c2f6b800d09133c0e8993d2ec288e4228fc07f043e43b2796624d3b5ccdf85abf941f4a4e30789d41e533d025a2f7aaf88fd7024e941fb9bad84f58e5c1de5d48aae10c24910a908b025bb2ef12f3eb91722f64653e61d21782a00f83dcc01c7b45fda4b943c951110be8fc5efa147d0e0471533d6d04848019ada2ab20b6a5b9102550bccbabeb7129777830784d62a057e93d8940579ad2818efe51500d132890ef102ef3639c3298d6eaddab3a0444fa9637e244a8bd05c857e7169f50ecdfac8ff5daf1cf684bf5dff07793b3b879232be8e9a04dd9d9c853e913721991ee22e2406687f22bddc56bc30889b457e8d13b9d334b0e66e3c046f3376d509369c451f720eb99d41ee5247cd6cd87c32cb671b3c9a9670f99c6c5791fb3f97b5ded33e3a0cc5e6db4a7084472f354925b6ea3a4ccc27db4cdca8fee1b522c653bfb7a1722a051199464434fdd0f92bc4771ec62847ee65e190a24aeb0938e96b02fc3087148ec27b8393c8f6bc5eb76d31e7f9ec4d81c2f867231f0042e63c71e66f73ab8ef48d86c1740ef8b8285cae27bc4fc5cd99370ca2d89b34d1da4ccecd72e2ae5c46c7082c39398a2deadd84c4379815085eae6794d7d95bc14b85b41b08fa06bc7ca4c94d36c8f5dd1f82a1e55e942d585cd85c93f19d57a9af271608a82c00c01be45f3ab1a662c28c18dd7b3d3d5de4c40a1fc911ab85a135c4b48410a2bd2f5f7bf9df9dff6c921766d01854a938141d9c670d0b369a8126968f98015af2ea64e0394f74f6e41d0da6df604405bf13631a4804d4e9e074b891f4af2f3618a78ed2bed63f8d43d2918de733e44781b5198168a9a41182a744c196332e11b6fce68a8d9567129f3a85d412b08b2e664069c86839eb0dbaceb2ec0abbec4b69ca8c08c96b2c9b32f31481a8a8c4d8804ccc2f998e92e9a9d1955bae2dc8d410b1682c16127992745fb7c08b1f2be9be29e599b65a469a3023c3162839786a26bf3b367c3b37eacc29f3d3cca3d043b460b8892fd95ad95eb42e2f24fc5b9ceafe8918b47460112a7f4fba2dd4318b024b0df55554977c906181fc61ac03458b61dc22853dc12d6feddfc858390928032a2c1506ed5ea31c31619768498f6f649fb21f9da9acbd9e1baaba8b91adf7c076c76da65841b4502e32a8a529960fb32fd3ed2b3f6af24c9472d6bb21c4a5a5a27ab745779f9dc1ff353b21a40fb2c15ed83bbf9e49fbcb1cd8c4bf7be7438ef54e7d3669d42102ab2a47aa7aaad5df53dab1d39f25b4d8f5adf89d578c37fb887e548c17d0174fe7aba2f24128137865569706ffc80d0410466423d8346a894bc8d55470d42f73c9c080dc9b554e9874c172479c35f5521f7a9fbc2e0121d6ecf937aae7af4bd03c51bf2e91d275036c4c9603b5d0a9b2bac7295c854bc2a550ea2aeedb4fd4d14a974da0938ebfc7e6db63f9ce4b7dd19d33f350224a145e890c56f697f73fab10ed5db8e0d2cb0c955bb01f009d1bcaa557c32c9505d9394321f5340f2eb6c3c2ba0831a02458472b3c8d801438d39ff60f945341fe5ade48f0ad28600e0eb33abb7dcf6f337050ea1e4e600ee1ae0b7f0c820ea0c10dd2dc048938bc423d69adb0e5c0f1327a19f08042d14d5853b1b61c5077d1628cc7efcd45b3b63cbed6674ed4a46e5378d6ce1c0072752459f67b238252d5f550359275d2322de106be9359c1d2948add345e5d91cececa7d0bd8f1cb3a7e2baf67c7c6454bcba57b0f1e7ea52c0617f5044ea120b13227420ea8438f0e34721c462cb11c4ab19ea728030c14626d1d0de9e5a7f6dec2109d94684ead8cac61fa88096563513484201764cdba1ca1c56328995efae7c9b4140ec82ecadabf114d032b627e968e6af50a410524d71878f4bc66e693bd9bddcbe708992243746494e008a614793165794c9fffae63bcb513b24a192d9b9a8020ea216c09700662299ab6bf016bac777afd7e7adb87e34df70519122f9d36829af4706288ba0945320310722a58c9925ba9a9f47cc9dcf228f0cae849898ac8b163a5a402443b4a2f6cb7dab1955524988c2ee410bb9de423f4556bfad90acb92f5e3639a3bc8bbf183082e3caf1aabf8031ca08b92e6448779eb378b108765c51ee57173ace5394755058b560a99f59aedd8cb8fb825930a55bac56a4ae502364fae0e10466270be9ccf2dc594ca535787a58be1518c062d1582e2dc70e433a5a7f204e82c48322913083f6fa2bbd9280e2700479d769a6970b8bf334c218fde8fd49283aa63a173f6c4e6d4ec73d8e695a061c5428be834d0ccd7b0c4d53efe4fcceeccf8714ea628deb53a4167b2c4e8f82d9e2a7e8f1737b7211b3ebcdf47f32647579eb68687c4bd42e849a8627a273f7fd29a323435af2539ba9d3174401c321ddb25b6e604782cbe1c4ddd1d0718f6864625a4923f31df2ca62e329192236c5cdee3e58c47375ca4876e28bf8a024f95d4a00e212cb45e0663c4ca76e63e013e281948157f811a26e960cd8301d362036a61122660f9f165127cacbbf1830ef17e533fc3b0fdb2a2633484981444a35f9a9906e8f4a7ecf428e4415d4df370e55c756bb23f250f16463d6a9bbe62510fbb37d6a76200613eff418546398c003371d28caed9e1d55799537bafcff481d45d62e633ee730bf5f82512d23b0d2e91eb3a14c112f618cd78c177085c31d99dc56d5e77e311f70b337f623c32975f470bc8f2debbea6306e9159e508179c822a2a09bd59e48745f99558cce348c67a10c48ba900685280b3b7eeee8f0ac98a7256f92c618b9908f17eb23c2fa79c7bd5cc11980f078211db81cc421218fecd59f8dbe5d0657c52ba6315dc681e1bb2d818ae7e83e1c36515ee98944886f082b9c8aade48ef75db04a6b35d33a42003105fd856f19816336807f4a014a0fde471513e3c0379e3a6a8926154033e5655b5f5a72480d1bc0739f16f4c6bb3fb7f5461a1e38e7fa39804e07c22ed0711ab2439718ff5aa989abeae3e3dc2c92cce8e84053866332f238c81f24ffca788a438345a86ee7f39241d63e3dc6b57c391ecc719849b46dc1b8dd0ea76bc4b5e4b653489d6d512645ae027eb0f21be58cc617ad0c0ca444ee0141fee5a76842b337b9681a814646ab4c578be17333e93e6bec3ab92310af1538a38ddb61754cabeb21860d1c02889a535b3882f420001c228c62d0c0f0448e04f27e9799fa2c062b339c667fc91298733c33fc96171c142a52c463b52019be60d03023540d615b638d471d462bf67dad6cd98ff270656ba31716054d495c26a68d424017b9c25aadff14a4c2fbc24650c3510b948ca04e71cd638231908b075f79525c98f6a904b0645af4d1aab58f4e6dd409fb237df1a699ddbb608c1fffcc6a923f46cc07a45d15be4cc7de8bae70c5c3cba6147de727db1a58794c1eb13eb664cee0dd0666e10c7444a66787c8424845fa20279a2a1284758c30d092c1e7011213b39e01748c89ed1225ccd4a1916f002f1f13217516e020e5fac9a5f4a27d7f92834a1569f68fa7c3989e2cf871d2e436af24d750dd7023bb951183172f26f93642a7875dba5d015a8b0c0c163eec1eb8f85ae06e6c5326785ee7ab0fdd295bc203c1824529f5e5ad5baba8563b464730c61f03c2f562106601e0adb7ebee020b4e300cec0d7ab624647e5cdb9eed45559124c3a4aa17f4d036bdd07cd66c0ecb0085101f7127fbb70170b082da5684de81b53a334c58dd1b841b2cf42f4c118a7b6b856e7292312363b9e3f46c7423cf2a8c7d8d8afa0f468495046b73819ef6918fb9c9409026f1602b4af06c3bdf0e54b31cda94ba68acd0aa4dbcf3a4faf422adcc883532244339a06c5176043098cf23bca61a615d144f66cf4ba9653293b8350bcfb45e7b4becb8284add89e5e7679cb11fa199fa5c186342bab4979985d2bd00b7e15826aeb8256cfb5d835c770379a42aaf35c1233711c103cf44cac21028d0db7595e9e58c560e3f94f4e3932f9db3bcfd86b3643ff486aa68aa8a0aaf9e207a94dd359c920c3d7b106bbbc7f75e2b365283550b065f04d6b111bef6ff9d0688cd08aeda409853f2a1e63c334836c9927b1fe9c66127a33e7f549cf5eedf9f067b20643a43d69c2f0b08333c27097bf926e8776dc7acea9c15134096393053404d34f2f6873855b454eff7c6ecba979270d846d2beee2740baa7b3f3da1d9b9aaa9e98ac06f7b152feaead7e23cdd803c140736bb24eaeeba6041036fa4081ccdbe36037bf6d6556aafa2b37a21c2e48469f9158a89ae4a84c3ea264a5880a6fa09b5bff8dab575365cffeeb3d9415dfafd64731f7372dea6c197063a58030b6066ccc552b2abba47ded72ee5441ee9f521fae70631dea14709630a3dc8d07ee91cd20c3c5171a810accb5bf1885de015d48453ed1e1406ad51fe566831deac512a217669ce3ecf38b941da0a77a194a82ed1d7563baec3fb06bd096726446dd478f0a33724b2e1f79c643ec4a674b77e9b793ab7916b8a18d95ae876d5ec98434fd299d8ebbd9046d3a380b1f43c4d60b510238faee9624e4d970ae615c597c0e6922d617bf3757f0a91a969498ba41d3d8d5de1275ff645cc030cdf62115df7a5e6dc15bb938d1820792dd02a450d1eca93100346906c0d5ecdd6562c87b7b1026965abd86971f8b39d155676a17d1dcd7f1b7350072d1cef5b1fbb97200d3d90ebd85870bee6972703aae7a8ab154a076516e7c90a0ced30eccf6bff180861ff688a69d2d3bb040dedc22d7f24f969411a7dabd5600cb0d8bcabbf05f051960b1a90537c18a9086e1ad5f9288c209175d0b59166a583b158522b9808cbb2930954bfde185d50e7b07b5e7551f467ad3f06fdf043c7fb8da0300fc020f2b885ffda05139f716f76500498a3c3b02cf0a6a3fd4ac2b3e468f9ce2417c717c46aa9eb059f39ef44b09322d9db11f59ec0606d868a555d9684d8cb471ba61515c149532b31944775364b973da7e9abf0859aa41d814bbec8005d353a17d058a9d29c3e92cafd0d1531e06a9fd07069b4025427bb423b75b32d2d892239914a7cddadcf56a49be11f3805d87f16448f713532b2d4d09f72f432b604e078595dfd452a93365309ed55c157eab2f157343e56d5f15a2f657016fa3d1d72f96ed4ac6e2932abab78e0baef1c83fd49ae5c5b6d778f4da23f9e573764ef1cded9d612bbc90c31c9d0852a25591fa27ac7949123348a4357fec37f65709883fc640a6754f84f8d030b42ebf4fd11c1c5a0e3064ebc5fffe7fc7b611e305cd601b5c9336e531b52ec04940b338c1fbc212b8c736fe0c2089e96b9f3a543a74e41b66edb8c4a6ae05a95021c4682903ac42246038b621998d5a0894cc3d839268b75479e228539c7b6c5b2b8d98fd68306a747f37a8bc56e494f2e18c97ec2606308503952030d064dd76d31e7008b341389882c1de4ab988e5f7cd915c9663b2447408e5d8a4563ab12498e85177009a09b02813c7e7429fe1c4f001d1418a09c3e023a9f85fede18806d9f189a0a37f89579225dc33f8531046ec6f78f9f7827558b74d26421046a23e3a43815fcb701726d2e1ce1b55decf343ae93dd2db5501dd4dc597b2d8516fff02925832689b6e9d5b1bd5a6aa9b28537df82d933a01fa82431481b48c08584aca2302aa5a33badbf65095dcbba55d03032794595fa01036366317ed52d68946d93c7d602f51a124612a02d92ad3b9509d52afc24dd708a2105aca456955eec4452574bd81d49cc403d49405ab41a509df0830d03a620955528ec4a425105ab1d88ab8a6357ac6359c9920a4f4c18f20ea09611d77058135931f40811078741471426efd66f9e9bf73cf4bb8f7648ea308176f21b6027212f441f8158a00e041a846bebdf14f9d06d073d888850e0a1618a77b2bd3741e67e992d3b09e0c9612eb776df13df07e42fe47495236520c81ca30c9e7aa75c9f7bd8ea601dbc8fb54ebaf19a42fb85248b9e852e94e452e6dae5665fdc07a229788a4e7408ebf066c59c8fa3cdb02e3ddc9ec696ecae75cd5f8e6c5c224c689a6eed74c59ea7faf6282646f3882b7f63754b0e19adcde9ba074d417eb759145a673d33e1c32981b811f8fcb23a885abb3517706b67b3f4e66f09ae76d1230751f0f479d1e156d62b10e7c9f474b2c61f3b7f4ce2494a011ee14528468997155dbfa81891103456fee1666a04732e3109bdcb836a0ca2510611ed8e829bf12f0675e1729cde58f04d0342cda36b4a2bfd29c6db03d4f3c21fcb48ef2470b3a6870d8d710dcc99365deb993bd7402abddc68c86a9630aa3b592e264d45b6bbb802770fa96946d6101b201d9dd869c0fa3b440e03d6925b9efa866009447ff127e57d8282c7de6165cf19c0792129004b6ec03141be15c8b46023d05516d55d555e920e46f99fe3aaf2cca04087784f42954e6043b89370006d1e74799830d8905407c1696f267ff4dfdc7d9964e56db885c29ddd5fd456ac95813c809f9988daa45310488e8b3eeb4817c0ea4c589ec7442ff7ec1e5b09f10e7118cc7a50bcda40c960fd19283dd1b0dc618328e751961a86e9e310dee49ae0e4b12e2a2d1a93d5e92a8e999c5b3fe97e1619dc6342b3d412381f2e8dd4bfc4fbe78569d65eee350b759892ea185583a29f18f5594f653f6ba7cfad00fcd33fcaf992e399be9d3df4124ceddc9654bf4b8726b612542bb11a1d01c3ecf0fb8509438a64a7138a1196cab24b7b580acbcb1a71dea816be659ec597dbe848706183036d8181ed50008b0a67bae2135d5ef9880968c66490649874bdd83d84ef630ae1a153648b2e0d840370a15d0a2f76e018b02a0cb6e0d363634c1692abfb1273aa91306d8d4c77d96159e14dba5d526bfeb6fcec58050d85c9c253669d746c43a3256babe63fe0eaa603cd13bf4910b33ad75c1a6553b9822a2acbda745f8625929fa1907f2f73ee84c428cfcaa55c652cc7ef2143ad2f5d77bc7db51ec0ce87786288bca5a39ad06a8e460af61fe296829292ff14fd008e089d70834ac191425c43b3a34c10f19f00ccdb639541c1cd51e6b21db33b70f5bcb898e707ce2f9bbf5d0ee5acba5bea6249707dcf77075ddbc0f4b6353bbadb2600ffcea58f1f09f4cd402c4afd59ebffa0bed18dc3953772cdd689c2c4635bdb3d35f768b795960a0c98083847b9b135d1921c5d039c15458c7dd82be1e5adc2e61da6fefc311fa43c0638c83875b32898cbf41acc11f44d94b0cf6ef4b2d0e08373cab80e059e0fbcecf592780ee264be7ff33dce50e5756f104ef45e87540f8f5e1a78f9772c9660efd591feee60acaa103c39a7bba4476a3fc27363904915280082ec008cf020abfddb1effcb30501aa9b4d646899419a5819453f8952fc348a88eeb4a5a0382f72944e22ef166d09d5e8c06fc8fb9808b487cac3a84ac4555179c66d3186238ac0c20c2bb0a1537a95dc0437cae92e58df547754a3cbdd2abaf32ee9e12e41c8094b053eb2ea4a75c00b1f2de4ea24f356cb87deacbaf436a3e07d098d138965aac0dfe985aa8b3f7eca8c47b6bb36fa9e154af9e7cafb2ecbdb0a51eb653d2f2327b0d0a110a7f5d2e2ce2393852f6b28e9d77aaa2fe6f83a967aae95443b8299aedbf0264b14fac4af5e2276ed287a40788358950cfc95c8d1378bdb4239b91bb9af1f0bf200bc07af2ed4395051a44a5a20d7e8d205dc11fcd9800416f4e2a060d4b98c549e217c72bd47557a0723edd7ecb1a8b1d1c5e8c780f1ef9c49b085c6e5fd82bf4ce799639107f051a214da0d03a261fbd56f990077440db3c353a32c79778bcf64d2fd09a1e53e9d77bb7e2515a9bfa60fa0d30d84a180246cac0d1b8cac9740052b046d66214b24cbbbb1931a872e5596f0f2aa89db24769a332f651649454fc0d0e06e086796bdaeeb8f1465c2e18d42d5d202b2ceb9150331f0f9308ce51f497f3c02edf6a17fe43c5de4965ac5f0b3476e682c5365add9f714c72dc4ae92862602c322a1aaad2ac0f4dce08f67b315438a4873a39b78782956b53c831e0da4339b95e42f014930b0e78ad2114e2ad0ae45b4c1d8d6c3eb819e91bb56272a13e3d9fbdcc10a8a6a07666373dcfbf97eeafa94c0f2c667f17a5f677dba5dc7bac1297bd8234d2b178dfff60aa7c1dddcfb53180aebf1a2e2c20a7767b955a28e695a5646093f4aaa4df153cad65270ad3ec7aeebd5aa66692e06c6118b79a50180157b253cbba36d7db8cbe858473d7ac274321b9748daa7db990c88596bc87df3c2072e036d69519610de93a85b2e9f394d5c07a9bad16c99529daf3721e70464786323c141780484374096d326107622c54ddc89d3a6808aee543205b225109e28efd9675dd6e36ae99558672b9aac44afa300ffc194062c223fec844d7080feb4e7ca5e8203408f81fbebd86530c59a64c8dcdda4ff8bec827235e7f6adadd76c70c4d6c1ce55771ed874281ec6bfed27a866c380298170d73fb4a1b62c4b1ce47b5f31e998c4aa097c6dc54aa474f0f779c0be2f7dee957c27904d46160f0b9c0bfb4c34f38f63cdbe153b5db0980874777a26f740d0179081ca472506380df689cdbe8d75cbd6ae9f07f2ee94dadbc0d18fed21d4057a2479f8709438968a0e9d95faa3c1a75d47ce8337dfe7b5150ee43f5684a6850dea066181e57a9ff34798676d027aafa9eac41a7289b6b1c069a57eaaf274b0e4a8a6c870f97dbc094c1a6854b5e5bf5b6f79c00e89485f9fdd0184fe934a1f7e4385dcc104b470acfac92016b787c0cf2c6612f52c0ef9ac1b0e1259b9bca1c2e5ebef16a1954a87cd706b236381790bcac74481cb3067ab540074b027805ce718093e4b385d8e3a1a1a73d8bbee4700d914cbce5399d83400c3d0299c116741dbd5cc000860c8bcd37d4f48a3ac323e6b5d42149f13096c5ec2075895577bab85d453d2ae09aedaaf79de4f6c06b5501f3f262c5140eeb01ca84344546cfb4ecffcc3056702ff12ad995f94460942e11f40a252339dac224ec41796441c2c1dbd15911b941a3b06c663d5bc1b25ec131da7999eb6099a858f80799d014b1710ff12d1eab1bafb2c76dc82668d719ff2a95b2b97295b674acaa2aa34751a41b1e978bbce4553f7524c1dd13b9816988d5f7f7991de8c66ba2acc826a8e9a4af8b524f16c21ab6796e6caba2ac1c329565f4e41da67011dd6e79e130ea293ea51990dd55bd46d9ca8150fef2488b3fecee29526f16518f8cbaba0b6bef851455da6fbcc0a6af2551d231620e4df5b33fb60602c98792387b1b778b4bc199b09e94b3d6ccfc15910b938e6f19c001dcdd266364da6b8ebf8c282ad584dc6049baf9c7b4d185a5ec819298f6ae0ce73f5af6304acf88edaa9169d701172f38ac96119b3c2263e00ecfa44f1e2af798a77630f6a5bc5e31af8ff6319fa39c51996754eedbbd36753298fbb90662539cca7d5f92bb8b296991d48eaa8ffac1d71e909accd5d652d70767676f2651abe22f4bd59dac4db107a6e94d701764188db0dbacce61c9ccd312eb224bc1c2372c74ab85b8412c8c3687a89908b2b01e16a2d302bdbdb07b06c3c855630f07a385916fa1a01b2d64b9758d9ca8d3160247122aa51c2443687441528980ecac44eb415244443b249e10c80a255291ec13d3c973fe9d2052401f55fc4bfb2a3c458ec0ddeca43cbe9d8c1529fda1560d0b072e72a1239275317b7ae176146faefce26239e72fd08bff941c756e25c356b8a5b1387ae7203b99d93c533ce918f291774aa16c151953a2402fa470aaf2a78e7393fd9ebd49c34af2544495c84120ad89a790c3e124bb50bed6a9d3f2a7fbee790cce8f83603ba5abe8692330aa8be04889aa2981cc890ead911e82a534f905541e3537d0669a2015d5d38979226f6aa7c430c99dd2290bc91181ae92060243721421e82a71d058b0347f518ffcbbe4b473a09c3c57e4f273528e758bb8a8ba702cc3767dd03aab3d89da49541594d14f38ff64a6ddd1e3fe3939706e96d39d61079db7a4268efb0bb78ba014f9ac317d1e6a656f7b15a7db94b2fa79114e645832f5436fcb498b46a3b205fc08e462022af87fa43850b2a4d001c33f3f3f3f3f3f3f3f9f73d3906d1684b620939469a31446b2dc0b4a29a5b4654a6a0b8000087c70c012421ae91e000000c0053a0a0d0a4a0a5692bda881c2f8423d6c61b698f1dc1ea21b6a235e50a0101eb530ed5fd64a723eb1a2dd1b6a365a9023470566b003c7c9f1c58700bd0c704c80060d1a1eb43047135b53eab20ec68331526304e58840e2c01f1c3942308605b20f1eb3309ca724daa710656150516ff2480b8a854979479df5d8f20e1eb0302825cc48bbf495454d268081911a2315e057188d1678b8c2345b1d4eac57ea3a8d46a2078f56987594492ddd38f1ef345263a4460d5618942a7d4ff9a35f586e1526c1b39c9ef7fcaad8390f5518dea4b29c27b63778a4c22ccad389a7c412f478fcae0d1ea830899e97d3aa67b1924e61188fa19572125398fb54ca106d9d9defd82869f02885497850394eca16742d6a5648610e57c9e2292f1bd3ee183c46619245b5874a96ed5ea5284c3acc6762b40e1184c2d8b11e7f7b43a030f77eae3b51bf94f24b058f4f9893f4ab2d492f4f18b5440f591b3ac76dd1143c3a61cacaa5ef832c75da8438615ecb23b45ebad096ea4d18d73f89f0ee9cfc4c85828726cca94ab0cc8f2b61629509d39dae30a24b18136653bad44cd6bcbcfb92e07109a3e598854b3f3be5314b18c3c3453cf74a8a1fc24a18cd948fbe142b99291ac18312c6d91a95b3432cb5741b62f09884f1728cc927ddafbeb22f18717c41073cd0810e64e0a4e02109f38cec6ee8b06ca27507871839bcf817b800471820b8b103870868d060824724a2e00109d6a424ee7868c5e7571ee1e10853529e2774c8fb24996836c224f5a5d8d9f487f724fc82e4767830c2643a8c68bd7815bfc41d39c2b071b70873d0a25437c5bfa18625071e8a306f5d579e94939c52ab47228c7dde79f24605d596bea196032d228cb1a36b22f3c215781cc2a03a6891267d4ef3110d1e8630ba9ffc0c11954cb49c1d6324e50c1e853089d7f5270d935f2c7667060f4298644ea71339aa1b6a2b0803c7ef20cc1f97ea56dc1ee3053b7ac7078a87203c0261343ce001085387af5adbfebf9ca80d8f3f78f8a17052a5879c286bdad57af4c134ea65aa12060768d00823071f8c9fd331c4c8a14302601c1990c1630fc6f3242f6a563b87986de0a1079330259d5c9ee9b6b91e79306a997ccb0d255c9aece2c114e48b88f7512b39c32778dcc114fff36887b7556aec6107d3494f5151265907b328e1de25e496085379d0c1ac713f42897fc14b9273430d061e73306a56ece8a7116323bea12607637e7acdbe3861e4ef37d46c84816305ef67235e50008c7e1d3b3eb08112d87081471c4c699d82e9fc92ca7409181e7030877d339df469cb9d72e5f10683ff9d5467799212eb2d1e6e30cc57c9163c3caba9bd0d26e95de9b3b4e820666980071bcc593d2d5e92d4bedb084be0b10683360d79154faa9c530dc6f5b3aad9ba5ecf92172335464030d2810c70c0230d8ba7df4aa2eedfbe1bba4ef040c3bdc0e30c0625de26e938c94b0cbd194c628b580fd6965554be0c861127c7b1da50a67e440653e82489e75eac53623406f3a72b1d15b4459d50c2020f31982f334c99b5a8b40c85c114e792ec78c817131b0ce624d77ca58e6e11d22f184cca9b269ea45cb4097bc12084342bb13fcde2dd059334a6735469cb857d43eea8b17c6ec16cd248b1642a295582a805c349a32d5d2a65c15c29edafc9de61b2775830959e376d592a5f59f3b8029fc39909e332ea15f3b082c1dfb3ca272bd5584f158c96f4857e471396b753c170d71f46291fd9d0de01c2630a066dc9b4748aa717f40a8587144c9fef24534a679cd48e0638c0c0b1430c0e2466c3131e5130e7243c8eea38553fe9b2f38082f9bf4c8aa72c0908c4c8a143022f013f783cc1a817ca763b5f0f2718d34aa73dd94d4d288ee99cced275269862dc0815abea62b467a4f0588229d55e9493e4ab0483be20e656abcf464912cc3b52abfd94ce45916076cba1da7495144bcb2398c43b7d77dd69646bc508e6faf441848d5684cecb824942474430e83b25ecde760e7616053c86609c535aabb2f267955f08a64ad263b7e550108cb12bda9682a9e07e03c1a0e663d465b5f98cf407a624feae9c68dd1f46e803936bdde99482ad8939e981d9ff3df9d58b9435151e98cfa38a4e9d5d46d73b30ed7e1ae5c1729c309e870ecce5313b09ff988c5c98e52ca8a873bf94838a0b532831e13a254f7dd3b420e316a6d8a593eac83a313f6e0bc38ff7e54f9596a4b56b61cad1e2a74eefd1c23457d9ecf2094aeda566613a33a522c254ee5c235998c35f8793739e58986b5f940e965627561816266da29aaa645b62ac2ee315c678916b4f51e20a9358f31f36f2bab1a70d848c5618ed4e99ab0591dd49ca488d52f82083154653a5e4de6f11a593882c3052630479800e325661fcd25e4fa9ddd9aa3f830c5518f7f3c439498dea8c522a4c72477d5d25e9ff9f4485e9f6aaf2bda7b59f1332c83885d1c013c8308549f9ff9bd2292e853955b6f38e7c13534b37d464902279ba674a56d0f10d3519a330565b5b2ed13f89d325566488c220d5643debb96484c2306e37ae9e344f7e5506288c63a3345dbc3dd49d7020ad20e313a615e9beb5565d52be504186270c26db85964e6e172bbd04199d308a696ee8b55c495ae284d96564eda9ec24d9853761cee1d4588533718bf19020431366d1731d17de4dc99dcf84b172f8e4255c4fb2b862c2d8d152b5cff79730872841459a6026fed996308e96e9afb0fbf3701e4146254ce2730efa83288b126450c220769d4bfdd574947012e6187572cac944be691321c89084a9c4bf3655b28268bd6544c2d469a17c3d3ff5854c0624cc9526a85277ddfb94c6828c4718e72b33fcda449a9c3bc224e7646ff596f3e6d708831eb954517682b09362845144ecd2a81295b1087389962e28f9be935fb8c850c4f1f5e1bc543c11663fc1b20595538bdd21c2a424d1df73c7fdab3d1dc234eaee2c77a67912840c616a4bd3fffde3332a5c0893e86e574ac7d49fb811c258414db8d1a12b2be74198d7837e096df191274710a6ec9fd4f7f9ba5ba98130a73e6d79e6dfc4a40a08a3451595e2c2c4a80bff60560bbfac1e3ff4a8ee075390ab9d53ef66e6f27d30a8b8b0f5d92b7c3028a5269d6cdd72c1de3d183f874a9d640b1ee4757a30c876b7dac898fcf7c98349124ab4a0a3cb7830e91f5d37692c5e9e7c07735a92daf9fb53e68d7630bbdd97ca4942e47d570793fe4f92b5657c499da683e964fbf4d93b37428c73306dafc9222bcb09cd530e26b9d7935a119f79dfe260b8fcd1847bea7cd0110ea6501dfb1f84495782fa0683b6d59a9d0acb9f6c37188405d73db92a0811b30d26f5b3732b25c506a3e53873955d465d4d6b30f7892ea9b34735985bec92458f9d7fada6c178aa4dcabf1f4383d9ef44a9cddbff68266730ac28754fc287b5dd69065354535f327fff3bf232982a2dd4698b9f0ca6a4965f1ef74cb42e63308c109f67495cb89c5531184b0a577749468e4ae93018e647bd8efa0706737d50e3252d2ee30be6d2f4cf27a813d6b423c30bc6ba500f7aedde714b6474c1a85ea74acfb899b6900c2e186bb44cd679cb4a1f93b105d3a9534a4b3625794ab60c2d1894496e15e3b4475429230be6d8d21a26c2a449bacac08249eb4de6553449484bcbb882297fbd59c9a95630493ac9bb322144239eb2b31ff96ee325ae1c0d13429e54c269894e504205a9fa95934952893e8b12be4ff2f650a2b99c5afbb4d27793b8c48ae6c9d14eb824815c9243464fff697b22613c71e52cbda5bf8f224820f6044f1dd44798732ac92f3cfcf6c58f23caaa547f41a52a259bd1088350927a8bfc10aa74d5f13b7098edb000c36106234c9225d96a3d278b1f428b305dac919e93cc1176ad224ce9bf4fbafb13ff3f9a0893d0a7f49c143ee394bc000c4418944a3f6fb2440b61e943984cedf396ca314318cde3e26b6d8cac4e298449e9d85f96e8ce9e9a186610c27872794bbc68279db7a07750e030305263c43030e2450646c0306310063da2b38d89b39d59da3143106f5fe85f5c4ac21f884209d323ae69e71f0744924a4a4e3b7e49fafb0f880927a7cb59eb2dc47ed852c3f25c57b799b40fbf9850594aac382f1e1fea68e29f94d9af4c8c06a3cc60c61ef43319bbad756215a3c128d3916347b31ecc37c2bab39669f3fbbf2813a3359033f2605a0b2ac9f15a4bd45d66e0c166dcc1e862b29b7cae797dfa865af930ccb08329cfe5ec4348954b691d0c97c47e4b6cc7bf731b85197430957095458ff0e76014a53ba9fde8413f5d3998627ada0f3a85fe9f340933e26058afebf0ab16e4870b0e065382d8ecce396f3096124f5ab9b51bcc96b6e418323227294b1b4c52b9a6f5a82496c3891a61061bcc27c5e5c24b751c21a44398b10663fec553f2ca3e9dac1a0c5e276b74d0ae9e7288841969307550b2b2c6e899caa5196830e759c9cfee9dc1f049b89c4dc53643b2a9799aa8a56571a2cd2883f1b593a42441f5b4795784196430c69e97281ee43b29e131982b941efbe07ad25a540c2659d47f12a4e90b3acb30185354f65d91bf7ad903065312e47e90e2c94299a42f984a79ce980c6997b4c70ba64a3925bb601272a653b908cf15b960d2396a2d9ad4a93d680bc6d6ebd45542e7e036d282f94f7c92c4bc245df7cc82d1e4f0b2160fe2d36d58308d9dd2d94914cbe7f1154cad6226727c74929d640583aa09fb3995309ef556c11c3bbf429d4a579532154cf2fcecfeab5738154ec17449d259d5c2da6f65a560d21e174b3caf90b12e0a0625842c414bfee5111628187bcd757d4daabc579f6050e2a5e8514de84e49ca0926f1144a4d305e34e16fe2dfc4540b134c52a7a0cb949e97603a153bf32dc6a53da1124c26eebfa45082b0e4952418643c577ac5a970ca4382b1a4937b32445c7aab47307d5cad785dd90d352ecc3042dac450e579612b8249e4c931c353b54ec44430a7bd789ef2ec3fc9d5104cd797155fdaf4a71421984f68ebf3cf5e9d044f100cfef326cd53d2e9ad0582c1a39c20647be489af7e601c25c593f4455c77587d607e2dfb1af559269feb8139ade4d2b279f3c0a04d0e572697366307c6f89cf3c9d26a2a2f9ba103a3aa7fd6932f95db2c17c6d32faf1c6d8252fa820b935abe3bb1d3a90fafdca28b71a5c5ee4b6c613c25f797607e5a43c8b53027e9f9354f8a6f1a262d4c628429ad6072d4da6761d44ff1f47ea7997b2e0b5318a91a2aedb1309b9494ca509edf9470020b93ac54db2ea61ed7e52b4c71719e7de27fde4fbac2a0bf252ddfffe7e7582b8c2774e7c688aad34f6185c9cf529fa7cff952c45598e2d849f1b2a85449645598debe4b684fda5498dc46e7efabd4517ea3c2604a344fced693349dc21cd722a74baaf6e0a6290ca3ebd25950b6ebd92e85714bd22f59af839ffc93c25c2da72d9a9d4893ad5198d6c36de7131a9fbf1585c982ce49a1f208eb7828cc35722f36b5745d8c4161fcfdd01f3e96f8a4eb270ceae7edd2a7a825e8bc27ccb9fd5663d924f33ff9e884d9bf2fa84bdb79255a37d43e3861f834e7494cdeac313761160bd10ee2b3d4a892268cf9e917be25de5c9a09b39a1c5cd4e2e4d32b73f8c08439c8958ff2329ed5f29730bac979a11a224b98435c4eefc184fa73bd1206e9255650173725cc69afcec4caebdccf24cca692144f8e73af9d9384f13dbfd8e928ae65244c5bf29df88ad038298684e9fbad3cbd5ab5347d84d9b37c6af736419a071d61bcf9fd3111e25feaa41106b7245c979cf6b5748e1146b70a9b227416a53dfb5884c1c41725d856929374e95484003e12610abe22f6f249a62d3444983e457c8cad249a49265df83884d972d0ceb93e3584497e67adb494dee5ad10e6ef586a4e644774a5720d1f8430668e854913468f38e14ffd81e46310a654e741e88ae93752bea196638c30721cb33cde40096c5ce04310e6adf13d154a7e0739f90884417968ef1b2d3f0061124f28a957cbbdd376fb0793b4fc9bbaa3444bfd60b6def334f29f3e18f4973a0bdaba3e9afc0d35305e63f0c107e3b7d909f293e4c71e8c2798d875a2c50acf272fc6f8d08339abc4dc7d74b94afac88349fe93ad454ddefdd3f9c0835167f76d4c522622b78f3b98a4ec175bc3dfffc4ff610773e8da5267e2258faa9e59e0a30e4683051f7430796ae94a5d3d413ce8869ade88171418d981030c1c5fd8c80d94c0860c3ee6d09c5473c13c5e8cf021872d2761e429f14285350e66ffe8494a8227197b824379c1c71b92644b774db020c423c6871bd2a15ed37464c4246fa8e30b3eda60d06a2758864eb2c1343e4a756f553ed66050274c8e8a1d37542af9508349526337da44933f73b68f3498f2a7e09677b1e48ee2071a4ce2bfe491275fa520ca8f3398c35858aa14bed327e112e2c30c265d52fae91cf5e3c89cf5f05106936a5551d1367c90c12c3bf273d0e9d2c9cb661d3ec6601ccfda270959e29df0a5184c42eca39e78fd4952f14c1f6130fd8baf5dcd8eda5e28f800831d7ff345a834a3927b432d06ad033fbe600effebe9a480f0e105832a939e45291f2558359af0d1055336b1a495d8881c95d281a33bf0638c5190f0c105738a9854492f3b058bdf160c5b495a58972ae976d282393b7405d99f710b1f59309767bbcfdb41ce5c89b5f08105e3680fdd61ce3a35ce2b98a4184a27cb173bf3fba6e1c30a269327cf9be859c2e382868f2a9872c4c4b4764a39be4f05932027e458e568dab333059390117692f460424c56860f29183b95cea24b0eabe0230aa650a5a48a61af083ea060fc12b5237217b572cef1c50c5a8c12848f2798f4c97e920997dd50b3fbc187134c2509df52958d1ce86cf0d1047350c9ebd34e1a33372bf1c184fa4596a531a5622307da25984b38d1443dad27fe1f86a141638c3d0050e243090661daa27858139f3bcdaff8488241c34f0ef249d4011f4830e57a1172820e1376848e604ef52746f627b7a01d239844bcde8cabc71f4530c595d055f6997a212782e94227c1e47c4aad657f0cc1dca16a720a1f84ee10d1d9043e84608e26091b42e477495110cca3f35e52139408a1461f4030c84951f5ff232e7dfff88139468559b0915b2afb58f8f081f104b120be25dd5bf27b60f4fea4af2a9a101df2c0206444b68bb828d98255f8d88161cbe3354c2e0b4aec9ef8d0813997c926e8e90515b435e2450646ac141eb930f5259df5ecdac77b1ea931e245064668142b3c70610c9dfd6af93e2f0531310e8c789181bb854955d3ace6ef5c8b302933bb2ce39f5fcd6382104598a44eb6973f73ece7304212615262c99d276d5b28d3bcf84008220c6264e53779a2ba738e8e1723877e117208737afa609e63a227e9fd1d3a728c91dc881714401c8418c29c5458b2f0b53ac973420a6132493ce1a4d2f6d6bc4308617a93472c08edccfb4ec8204ce25759b6783d4186270853785c391153b910120873a5dc90f649ab78d00184f1746ad1e35919a7db3f1c8d103f98837ad8e5934b274f5e1642fa600e96e4202a56f69df97c309d24fd5c87d6865e680fc64ba9bf53e69fca62ebc194daf2fb7dccba2cd93c985b84127d592d4d2e291e4c49daf2ad933b98f3e5b4d809cb0ee6a09da4b5b3bed8a73a9854091723266a217430a9ee242e7bbe7cc2a5e69098b2156339642e8657d68e062172309bdcf1ab726ef5aa1d07533ad57d964e9c54bb32040e460dbb24560ad25e4be90da614b7f6254229498cc90da67c5253f6c4d2aa9d6f83e95a4f92f4e79c6a68d960fc5241849a7431ccd7351843c8924acafa76e1a36a30e513f44c4b6c9a70c134987cc499fe68133418b48bdda593c4ebcb9617881172067338cb3a2323ee1fd42166302751e7e5774ff546b7849032182be86855ad2f36ea93c138963fb61ab69f3b34069350eb14e5a4f068412d0693ea9f984b955ed2e7301884d696bc718fa5c4048329c7efe4b026cd4952f805831a91b73337f1824989a899934d922e98334b689b1454bafc142e98f52a69352d233a3db70563c8c84ffa4a9c128442b460aa93f4cd49d25287d530240bc63f71be2ebde6eb9bb060ea51f24349dba19d84ae60128bcd132ec86cb3fa5ff0459f5520c40ae6f4a673bf9cd6cdbfe610520573cefac9f2e38750c17872b674aa3d0573ba249c3a29c459ad468346181c302998828d72318fa75b17954248144c953dfc770c2fdd2cb94208140ca74e16cb1efd2d744643c8130cdf9f44b914444fbe2437d46c3cda881714187984030616e204d3a9eca732278bd8169d21a409a6122b9a7c4a9e383a486fa8d9086182c9e4ed53ef5cfd6b9603415e206409e6301d33f750799f829460548f32cadf4d50333949309c52975f117769a6448249c597eef7d2edd4b927841cc1ec29eac9c70ba6b39b0d5b448418c1a426bf6ad25629889022982db72729a7bad8d7cde810420453afe791a54cc786902198627779fe271dede4620789102198b7548ac56eea955a2a305263840266a4c6880482608a4bd331fba48529750e210408e60e2aea79b0f2af6df108213f30750942abc5c927965d7c604a29c6afe46c921821a407e6341654c9b9b2a8103a0f4c266a49b172aaee9c951d98a2e51897a399078fef8210a203937faddbcac9299494940b93d8b3b4255efb64890b837c09e2448589329525790b8385cd95fc7a3d9bbb2dccf29f154c3f86362907a416068f6976a25c9816e6b0781916947752cfcec230bff2ee41ca8b0e155998647b50524bb64062410010589c1190572c00c41505d28a1c290c1c3658b10a10552800241536bc4000082a708801813f611800e414070031858d04809442c7b740478e1824008414361600320a518c8100905010000414332800c827c6180088270a00d2890f104ee01001d9c40c104d04002413202098c02106045ac70b2020027209538b6fe9166d2a88f22d61f4aa3e417b754b3a2b610a9df114379e6dc243098330ebdcd9654e49e23e0953271b2da21d4bc2f0bfebc1c2b5913058eef473425b6b68151226f5207795fe93bc9f7c84a984effc9eacc411c61394b9bf054ff17b69847994f6c60725b3c130006184c92de9d43bbad935fe224cf973bac79ea07fe15584a9dae5527efea3cc9a08c3edbdc80a56e22f4922c2a89fe5c14b5299d749c6003984e947f6e4ec1babf59921ccf12ea5d1eaf9d179d9002984399b989356a468932d08210c2696e80ffb792604e3bff8ffc280f15ffc064a60a3410661ea3cdd2927f4e4fa2441185636ad645d9a5d1c05c2f066e7a2abdab6b20710e6b7dc3b33e69ef35b903f184d649da03227d57912c40fe6cbbf554956fcffa082207d309ec99dafa49f437435d3b1438c2580f0c12044bba7139fabd5d91ecceff5bf26d496a065ed8e1768400f26932577b6af0e9d3b79308978d0fb16dae39b070f06a1e6545a8b634a1ecf1d4c6228e93f73327492dbc1b0f5bfa7a6e7e5f3ae83a924f932cf613784dd743055103b25bd5f5a74770e06b558413fb69583c1c4cfde6a72ec78521a078310a526de5b0807b37a474b9d3ce50de690133a998ef7fdf0b9c1b0bd319fe3e28cea7810206d30e77c25c7ca57ca59942c0e206c307bf22dff2c9d8286c3c6d3a0bfc81180acc1a44a7da68cb88d93aa1a8c2e968352a624f97b2776004983f9e29ca0f3454fa2fa07418341896342ef46889294a43318de6fedc6bbbbb319fc8198219de48925680da14bb51e8094c11c3c75bc92cd3129ab36d4fe004206632751dbfd2a8589158dc1a44aca8ae5051dfd1d31182b49a9ca93beaf9b74183e258eccfecc0c0693f85bc9a1f3963ec55f3077182f61df7bc1a064df24f1e43b3f71bb60369dce6d4e5a5d102b170c5a9547afc9e5168edab6f59ff4450b2615ca36ecdd2c18c496f8076531bed7c3824912a774baee2dd1e4573067bb9ba04496cd57cc0aa6a44b070b564a7c4ea9648c30383052630485810303233546466a8ccce03170638cae00a302a40a6631a53adb3a890ae65ad1a293dd9f54629a8229ee7cca1fb62df24b5230f69b7512e6727de54f144cd16a334e1c3514cc157d4d2cd967c3d4fb04c39fdeaa52634a1a779d6058d3f712bd67134c953b5f97dac80b422618dc3f8a49e9625ac8106409c6341d4f3e3df2aba207a204534ecdab2a49ee20b603498249d07dae95fb5f95d70db5028204e35eb894f3b98752cb74d418f99f400e2f2c017204936aed569c08dbb2f48b2fbac6881719b8b1038708fc0062043c2045002182f144256992588ad5d9a58e1d62800cc168241021987d4cf4b6ab94ab7328710348102aa1eb33adc472718081e38b1d638481a368a0c6880846bcc8c04829c943000182a9c4fbe4a95392e474f70fcc9dce4bd64fa17c7b1f184ea88b62aa712ef7c024feee527e1162ae531e182e98bbb98d12901d98c3e79f754e4fc2281f440706e563f79e4ee78a32ca854137dcb4dd09c285b956d6bf5216152694b7305bd6969492dadef0a42dcc973de2938bca7215d6c2bcf5c94dff4f6861ca49785fdd2ab525bd5998bf33547f10113a3a938529c96dd2768e297629150b63c99f16bac4d2f92c09166657598f37d6f75ff15798564dd6541e6dc2b8eb0a9328c13fc74d28bf58d20a9318622eb8cfac29e16385d992b460616e3961c62a30953b49aa30954a41998ef76e9ff45418db44f760a52aea312e61062a4c67528c7df414fffe572dcc388549b84e722244982408dd1406e1bd39b2b7dfccd4a56094744a92f7f2e5741b75235e6460a4c6c89ebdc032318314e674fd29a7f4c934391e857994dc666287afff8da230496a26e7385bf9c4a588d1609429cc0805265e9bec3e2789df82e22c27ce9ad87fe20fb9e2d94c0aaa52ef894efd651dddefabf97422933d78bab05852cc3951dd9f94d7a44f5951de849f4a7c3df96a22fddf1956c2681365c23d3d9dae84e74831f11e09952ed060eacad559b5675a533d83417596ce722a89194c92f423c47c89f2de170d1a37e8a20ce6bebc9e7d7e82cc3f7940176430e8c8be87966479923c06c3d8cd863629bbc56262307d8cab8f669b5f95c260b6e4dbe5f216c485e571e8f022d9d105188cdd3946d69f58497fce174cf529479cd611ae79d940096c84d185174c964349a67c3c34c4d405b36ce787c9b9604ced64a64d8f8eb4f3bbd882294df78b4e9fa205c399608216656a829d290be660a2c794b1a4629e410e1d3bc678a41978946303755830274910ea2a67699f4719e0487c05839b9ec893b4071f936405539c962426759e9b94628d2eaa504eaadb849587fc5ea860d450929752aa640ae6f8a3c4939b56674aca17396cbc0eed401752c874d9855171666a1bac822ea260fae8b14d5fe84b3a7a386c70a00b28643a25d5a9b3827a9e6079091e679e138c35f2d3add7e4ac53dde8a209ffa8f9a04b92a4cedf32a1d49754db4b8d49ed74b104f375f8517932eacf829460aadf1adf18257a89ce0aba4882795b3b2c9bb250e2e74830688df83ec1b37504738815252398d547caff99dbe6092a82412cc7d36eb3fbf72482a9746c487bb1ae2e9384025d0cc158a28fc92a3371755d08a6133d651332bd6a4f368c18e4400b741104f39c0955aad5723ab980601cad7e4aba28f563e90f4ca3a6a2bc2c5b73543e30e8a45edf244da08b1e9883dc0f1db4e4bcd4100f4c2a6d9708cdd39fce455decc060a3247dd1548d0aa7ebc86123e94207a633492565b9275d4b557261d6b4ab347ae2ba2ee5861a18c53e20820b737a915d17dfe6e3b203076f40e4162695a4a7d03a0f51a7dd50b39163c759ca914347076adc05446c610c559fa6625d0513fe1588d4c2f0e6712b3a28d1c2d4154eef8e78be5c498ec82c0c424e322956c74f11fa8d31fa460a446461d62ed96b67a32ed48b857994b23f653a45e7cbeed0456061529b9d5d79dd57183dcf82d2772989f3a72bcc22e4a52959435543d80ac3ce472b4b6d66164aac3049ad1335fc24adc25c254cba47b54f4bc2aa309868e5a75e2b4f8e925418f5ded39ed4fa9dcd4220820aa3899af9d8ff113985fe40c41422a5c84b1274cc6ad0a0918890c2a44a5a3ff96ad409931b8529e9370ba1c4a7f3bf446134bc20120a83aa4b1f84b90814bd772addedbf1142e413c61a61a2bcbfc5e7ad2d6710f18448270c5b7a7f4c5b488413c64fc953b65ff05492706d22f7137f2a5a9a30404413c6cf9da396a2a98b6366c2587f4979875262c2e81e6bda4bfa91a6532297485491a7fa72a524552ce1299d4c3aa1632dce56895cb3d7939c2499b1aa062294a8f2c424afb14b93b3359e84b904f93671f424516549c2602509a27238ab9cf68984e1e285cfef93858441c73c3968f97c25e8e600914798839c1137a724ffb35fc4110695fa95cddcba547a6c10698441e9d2559653e952da8411860d1d7b3c08cfa9d2c71110598439e73b214e6b4ba82fa208c386de916dc2941810498441ff469f9c7efa92b71b6a31681d0b860822dc9dcf50aad6ebe4863e0e1d3b12af0234683c0e1d5e1822440e613a1db73cbb87ceae05ff632422863028933a679317cf43e50a8814c218cafe3fd53d1b8810c218a3b42741b8797ad80761509f249d61ca32434510a6f4135696b7f4775b198804c2e8f1ad338608208c7ae147a499d2d0aaeb10f9437af34e5d9434795f1996ba2188f8c1283a9b257953cf3d593a88f4c1f4d597dfa2d26d25a53788f0c1645264bbb53bf8e73c6983c81e4cda762b7d862939e4c8c6185d360604340d227a3009a9f9274a8cca259ef2603abdd82559bfa6a5133c98b6e2ccef53ca1dcc71cc44fb3e499b18391944ec603aeb8cddcaea60ea9483529f468a9a94d1c1a8eb26af495275893753640ee6924eac14d44ddc8965eb30f8051139b0ed49f2cfb92a993a0c227130db0895e3ef55ca256e0f108183c92441741e95f61b30cf13b48e6c936bb5dd40096c9040a47492ba6a91a12637d4d00e0bcca075e880c00e19982fbe68303e4083061844da608e57fbf9f5475cac09073c80bec0f10230aa20c206ceb35e83bff9d9845bf411175343a23e88790f97da94863e4d49f3b12d5e8e066c84583d9dcb84dcfa0c8f8e16b5a2dd49db31332037eca42ccbe077f5aa7d920c2525fb1ec3972f99d2d1d3c736931812ceb4bb8eb643240c26e5327b49f86c518208188cf17be28e47d90bcdbf60fc94640bb3fcde3851c7efb08088174c21469ae89d5e5b111f41a40be6f0275a52b9a4b863d25810e182c964536e15d472fa28da8261ab82ce1ed4e9d84eb560109b96a7d784790c6516cc6362887d91cb182509164c4aec97d47bd23ccc7405e3cd5dbc6b5b4e97735610a98269548d76d9bafad2fec6a03d90b72254309998ae75aa2d41cd5c813166f018a04183082253483239bc52b67997c68675fb598a10e91f5ead1744a460740f59a9fbcbd2c7350a06e5b95bff3614cc15f6b292ce79bb045111449e60fcab60c9da6f54c98a8813cc9f83b8dc279c9a60304963eb829f283915269854da2d392825b329b2259856c72abd24933546ae0473ce3da7739dc397b09360102243554e72d3549b48307d34b3dfea34fe6a1139c26f5a232784d4cd20620483f852ea7b8252cfaa2641a40886afd24fb92c7afead20418408e68b3fa3b5d25352c243307be930bdcdb7ba244230cd47ddd70b25be542808060f3a3d7550192a98c90db519e8d861b63a7e078e444580604cd379ea7dbe259c24d681c80f12111f18c48ef0bc1e2b1bb65e13447a607e57972b8bad080f8c76a56942a428b2038309ed7b3135c2bf4d37d4700c2295baa5d31dba8d52c210920b93b020b428f7306e3abca16603bdcfa0c1e02e84e0c21c3f69aaa8d0de503b2b84dcc2b0a659a57278c515955d15426c61d01a136e7b26ff21a41626ad12c4c7f7c985d00f21b430e920d2f3fc5cc5ab330b53ec53dda1323b8fecb2307e5a4b7a4f123b4993b53d84c4c2509eeb82102ac3c220f5bbfe459b72087985c1c4704f319e56d28d71087185c1efc4a5a47bbb9dcf9056987e3cc7facbc60a73ac0b319673106ee50b76f48e31f61021abe0dc93fb4939276dc40b0ae4483b9e0285085145413d44b4935a2c503650021b007844482a0c9b21bf429c6ce565595e44082a8cf399dba5e485b3b0140071083985492c2bb1a5acfbe2e60e08318539aea9385b2fa6fd0929854958f0ce6792c956824c0a83a996f0562d5e9f5b8d91e2c0488d91dac0488d91d2c0488d91cac0488d91ba43c8288cef776a2e696f2749e7869a284c9fa3a955fe9752ae26424261fa31d972ee9362878a1050986afeccc40b6d95a7410347c8274c26659c24d263443fe80983692ba9429db4667db2a1a408e98439b625ed24c27e4e1e4111c2098390a1c34e94deeca53f11b20993a0a4b1dc659289559326ccea23a39fdfcf84299d9b502baf948477306176ad301fab720983121fd7fd946e1f155bc21c3b28bdd2bfb99fb6488454c2187fa694bb6bbffa08c7404a982c9630c974651226dfac933f595478eb1885104918d6625c30f17fffb6040a2191308d3ca1ad7bb5632d5abe100209e3a5772a2d2a7e8d0e3dc2e01ee3a4e538d3e99e17421c6138258b8b5b12c3b3ed4698bbb6a497aaa44c2931c294d74d32f1c18c10a8b4508532591c148602a160280cc5c080b70173130000000c16124642b1683018cb7b3f1400044b322246363220202412141816094862602814080604014028100c838281503820240684543ea13ae222ac01009ae59fb935089128a895448466bad1d34d45ffade2588b16472b32e15e456b790a46719921baaf2ca65935ba7294f176f1c4c3b2c5107a48b737d530ee7ee3053c2cf8c530a651b9b8465837dcef354cdd38a1df74c50f7d6a835be779d5e88d766d48fadbb32a1b364ac55e6a43f06f76d89e4d7159da9c09f42f6fbdcb6a141aff0fc456684ec037fc3027cdcf929de97e38b0e99e9344af695f0f9d1b54f1f32ef0228feb08d385bd735f3411a626b5ea3cbc929672be961d2606963eb04d04c01b7f83f94383d31045601a7cc96109c22290065175aac3f0249cb9c78648cb0d182f1238525b0e7068228154d7b0e6875312ed4bbca119c4ca1953eda039c25caa2ef087fe0e6e307a658be3025c6c6b331077efae75988547de14acaea53fa6cd5d60e7a431f5a4b6505782e10f8ab4cca46d736257d0b822991ec14bba0c3efaa8112725f5a6367311b569fa9113f3853597a5dbe23e287298415d7a2d063141c1d2d529cbfdc2592ab200fa42d9fc1d07eb06aab5f0a8ea548d6470e238819a45fced0513bd683df53bca75051a54281d20ffcbb2a9ede1bb9042eee42f9ebba4480605245143a47325e40d9a4465bd344e102e64772d2c7961a10243917d41e0fbfa49a32632f6846846ec0cd0baec90f451c422fa34c91439bd7fe8337112d748149d9a8edb84968e667158cb6a5226f40458249f1c94c6b2189ca394d08b21ee06fc1d51960dec54faa0262f1f23b82d276a161e58bf88d41c6e413c20bcf982550e192d496c333d6d88b15143c34589bfec4217ff17cd6a3bb2be476e14b7064af36d9a464d247965ee43350411013784b159d8a0e948d0d1dc5a4ca1cc2bc981f925c8963fe7f3633979a94e48c6908f076882c66ec2668f9b7e502e3d2c4882ca71fcaee5f9eaf2ee5927a6ecabe290286d0d664118c2086ff44569b5ff4229e33562bb072274e5d2fb97a1c4832f6325806a0530ce9de5bdd3356e11398590a435e8b3e9048284357cd107c1fa78c63cf8cc470d4613b1301e500e753130c8af851221081b22605e12a14a401e1ed3a4549190517dfa2cca4eccb98b40936828e89a5f1406bf20f67b0215409d1ae25c520b03d34eca26ef9a134d39692abc525e5ec40a2d7e843ce554ecbcbf7d7af9c86ba145199703896f17e5655e3bcabac75fa821536e835181a3126f8b8599367112ac6c3a8a106d406d28d0cb52c73daf9691f668d53882ec83a7839a10b768c3f650419458ee50333c76b172580a89a16a64cfd8aeb7de040761febfae1369a3974e8951096fc9291d8c98085b5cc6ae6593b866a34a2a62b13efdecdef82bfd7975bf2fd4ea62e09fb09e8f296999fd34efbe3b199f12c7778a94407e91c6fc517937662555a9e444596030568ab4733b52ba37eb7e9930e340f4f85474282b4f50400a1e723858461dc90f900581a09e71778ed4a5490a3cfd1336320446f50290442aa21f24eec4b0dfaa6cb9fad951303623d1cd4ce3de392b858dc0ad290949d816b0c33b5ce9b4fc91bfc3968064edd321aa9c70bcd2a9cec05560f9e31651ff5c8430b1e504731528c8b348f7106b8ab8cef2ff3e3c84c9d26053a1dac623f12a583dbb79936482443bc146bc06a705469ce7bd05ba376a7c5a74d819b7fd5724eceb3623e25449380d55884a7651369b894f17a80294bcb1016e124a99e1a236c3a6fc43f57113223d648ab1c0b045fb8bf1403a2eb6b6aa3b29c535dab4abef8feb4ca939247d8d2a5ed4b9bf6597fd2e17e63d7f613644516e5552c4819643e13464b70eb2f5412f9d4d1cd7b3cd91e7d1b0b49a8c724e165e71da3cb699524812b4256444241c8c4bd97fb82dc2e95dbebd51423935e559d02839676261d24f17840281de9cb90804ce4da0dd21d60b9c4c30a377c6cd3f226df243d4a886f6e4dfc9fa4b3d6ebf5e4b2a67b6e0ccc594619ce867aeb21961ada2ef4df91f9799950a6ef4ca1fa46b4e6cdb763ebe280e66a1269ccc2ca770f47cdf5423a89891ed801bcab99f274c056d511ada5f2620e2a032a7dca2d88c6075fbc9577ed3e9d2dfb2e4f639841fce15e7acbe0d5a22d368e27d38034797e185aa0f94b91459ccb99c87626d2bcc37ab43153f4b51fd9b6dfa7737ab7e3368ec630af498f611f60801d2f90b209ec5a43b8112a1dbe8c89bd25b2e2887a3537ec96560c456af3aa26392002eb3e9a8ca860ab89b8d4de075363839e8d9f50002b73d7b56f6acd1486550cbfb0a74281807d4f48f948195b444ab7419e8cfbf33a4b97f33d37cec76320002a3dc0b4aaa8f6b2cfc2157ccfc0b91ba5a9ca4178af3e519ab8104c72514c3c2a26bb3818745c98ae5ff211a9df56033bba2709f3f5427433bfcc4ca1004fb0bdd506b7aea8cf42cc7813b139b755c443dd7030c5628e918d02c13a3b7b31561b3ca2c8497b45365d35ff2a4a3082b1c1f2d121b9ed0b194512ee61bccaf1e1515674d9321a04ea1b45042e5dff0289e1863cb93477853255282418f6f96cb0f4ca6116f93b4a49a4f8ea342b08b06cb2118b2ede239ef1046514765495a61b39a159f6773f6c06ce98d8dcc2156a7f24ffc4ce8c6bddad71cb5965fbe390b7c13202dd9b1cb5df5d804835f6b5fcdd8fa1c83c9140c9f02c77cab7806b9f61ab041f2aa55a9410eaa19fff118c6caafdde68a7fd3d153e945bea2c3a30559f8a5af32b4baa84d2427962e6b86ac55b89bc1166884049828d14357cc628398eaaa9fdb791e323113409de2de70818b8b3c088911f963381246021661444ad1330bbd03845de337602558339d39012b4762fb823ed19bbd03b8e0ef44872f4c9bb5583ed4e3b615a5fbd41238eb00a5aaca4af54d2aee73f3b1c6334b584457d8201ffb921923a78099b70ca8084aab25ddd492a3c2084de6c78578ae63f11fe06da241ef842849d83b4e0f605cc40b8769bf05bb78a1eeced314a8e845443541fcba84689a4c35975e170496a559e0725a2ea818f7e4dc2b5584dbae7109db574cb098f5d82603975bed85e38566213b3486ab24e518348cb95174bc7dc338c51a7339832837c8511d466f71761851d36ab46bf4c58b0a2c34c69a058ad8050c9f2743c0d3c92ae785ce21744b37b9f7d11eaac1225d2112056ea3b308245a73c0b4ea54c84bcac8249a2e794de7573ab3f3570f7930b9f485bfb30bc1e5007254f8d1e2d2800f3d1675070e1a749bba4281dd69a1a2123280b503946b515ccf4b40256f7258297164adf45291fdd6753f247a11d433f14dcede4fd1ee3c535598f4c8a5d3b041f1e30c8d23a9224259e9fde7e2de54f765038a16ee6803246952d7e9d4c8960cf091e3c50694a6dc1d016556bd35ac4068901361569a5c0e78a226708d7fb1a4c86e19193997fae4057080aac377d4c3e242e6e41df1dab51b9af8bafae824cac688096a74894b8dd4cb10b2bfcb1216b97e5c4865966a90d0cb24b6e4ae3a0fcd04e1303d674741f7e8ef7cc0e155f8cd0bb3b1dfd6ef7694355f085427918d1a6562d8503d6ebfc11eb6a021ddc0d660b401bd01276ab059c72e7b159507333f586b180eec22c24604414a4c2aca20d13de3dd02f3bc1ae333981e707ae4d94db1570507e4dd28788578b99b1236d8d839747deb0254a0b6bd85e3a74e633a1dc017001b00910035800716d032ee4946a70328972a198c74870668b99ab2afae8ba74857028228c43684f2101a10a75204a8e6801aa009e28ef209e1a342ac85c02362760192d474a5b60da0371509771673838eb49f989d8004213d881cdd8e79027304ef821dc04b46f0fe90bcab4c7b6d7e7e582af5c1b263ca2dc26c8c5459efc01e35adccff40143619fd3585e94a9e0dec3410922272d4948edc54655058cf5e22a9153e669b024def4b8e2a60a0c089810312dda90ceef7021ec07d68ec83027c2a164dc7ebbb8b9d54dbcb649e765164cf2a0b02995d08a8df48d8b92a4e8361428d5dba3fc1f171ab5a47ca2d9c0aaaa9ee390b840b5c10773af367933175087df26c4fbda125641edee95497b6d711a0a41519e946890eb3a4e23e17b851118b24480f6e2c0fa438a6d31163e47408dd98324b8b442a4706253ad99b0353011d39231b3d0c0ba6bccbcb29849a8a910efe38d9a07646b4a1faec7799954f8dd23ec64d69d2752fad9e10ae104083c06165abcff37c315b4ef0556305b4d16d3c1f47950279f9e942d920508873635bd71e01c4b3cfe535d984dd6fa325e0f4236d6b227309212e58493c4d064b8c12225ad2ed36812cb16f558bde95159a7e88dc1ed3d01c96687fc84ea92a774cbc6d1a617e4e41fcb42a5ca91930b3a79c1e71cbbc879880c6a071c2b54ebff6b7a24f834cdb2192d7c8ecf762a1c9bd71595983c4b5a0e5d2741d35cb0643acebff447ca3426eeae815c957689400d7acde27d34551211f03237bc6fa13e2d2c7dc4faabb84b8281958401c2201c1d96cb38e579ac1337cf0f45b184babc979fadf56883589379e8ce68e3321ee5155580a8185e13d14e83a99faa31f670961751c15e65c1b4b56fcefc4a2a6003049ad26f78b6afac8aacfe9b9313518693a3d2c97e5974a6a060d1c7c06c6e999e4a82b22a50bda114fa2488bd6914c8a5ca25f756c2a5a9478653209cf1182f51d1d52ec48b49c5d18491fdad9514eb1c37a35352c7491324723d661c973243a56d67fbfec391cf92886152495c3162dd2aafeccb719b723e034537b14354a59310fd016e7cd513f0371dac1d550282e016996be45db59720c437454e1d65f2acdba63e51552f791d615e3badb4df474947aecbe97d161679b69d8b9e9b5f623ed05dba78834d2019f162a5e6cefcb17317b260c29fc4fd85028210073c273cf712d4983b8a57df74ff090b711a84aea84686f5e26c8a396f033272927ec35713fbf6f8af6a6552cac2b042fbc86905f0bfe010cda14056e5e973071a4b3334fe48e489cd2ea194f295114971b9066d99db2190647a42c881485ba426e8fbbf9a2da8b544ae99699f5de9d8198eee88edb8318be291a80887969f7d03f67a32726b44ff6608885cf1a6ba6a27ada31276ce147910cbff2927e210572aaa7af90c38125764c5bb2e4e78c741bfd3ff462402c0f54d22b4e6df8a250dc966f538b7b4db6683304f09d204089a44f25e83a4e5fcc44e1ab3f95c934ede406268e01870c57d19d8cc17ee202546639fd87fec44563d3b4e2f4f2840f63cb820064f000ea8fba5c18ad86f3ff2d35266a0f0f8ab165ac4e6d969c76f36a2901f45baa90b1d7d2e018e6f023cc7e050516ac541c117ad8087a31fbf37c525bae1caf4996e132c4f7c78b2e94eed6d6e041c244a6fbd5acfe9a787ab7c7fb4601e687ad82ff20fb71a89380254f47d3b0890f0649c8e80c087860f896c6ae0982aa3cb92cf613ddd18c62dd3dbadaee9e53c851f7b66eacba9b0d534f4808ef07dde5b85b1fba13de5675eb9104632404a6bb9c955241788b6c779e57f3ba75fb309626399ac4f961aa4660093efb0084f958dd36a5672b444416dd70533a541d7c44151cf894d8314b73288791a60912be384301ac7f9f5de208cbafea144e23d9a623a921584b9222d4894351c989dc4d944dc2579ea80e6d4a9408fef65ab0d85c690d4131b95a941809bf9961d96fe3d96261ed8c9b39807661bd1332e28a3e72503618fd170d43144aa0bc73d02416f42dba1cb6aa35f2e679eaecac5415e67fda7b79940a993b9a0f0e535acae7f0135a44714da2de7357f4f0de2aded370d0b983e53ceafce44c1ac2abfead903571a7841745cd7a8220613cd4b9acbcd0478333f1417abe9474b6ede0d2390fca5764b4553e9f638b1f46fdaa8aaafff82ff6230162a7da2e7f297ed0a9af8329f81a83d639c286f5d6a5b0dbf7699526119057ecfc33008ddbd672f32f91a21f9f49304c2bde86057ea8fb350911fb7a8005026905b066b0a16af8fa7f107763662c38501c8c79312d73c8e0a9c16c03da3f58a6e44ba06d0d680c3ed99c333d39f1f204a18b35d0333831c03560fd079bd9455baaa80e5b579aa9342c5ae38014171e02f00c0066bced0c65f3841111c83541173538f735dd799ea44088bc418030e8d2f012d6637429c2f301521a7ee7c3eb5bd1bb28252fb130a8c8f955ed9f636717daa38ff9e0f72ec483980f02a4c84691e0170a85034a240e9cac1a693e1fd0a3fae1d41eb050975f6afe10c47f0d7bcc9176d3646e8d08a3abc9fe9d4e8b8878d537bdcb8ec388ee36ea36a6e5e45c78cea904652e54ed01e20729a098f68b58341e11f9aa9fc2dea2fe23e442b2fee450c7a17f487a020d8cf1eacf9a814a09482a51f0b129320b4151ccae1f861be32b5108d3e5097e3c8963da4ea7c36e26c3083384fd5a152abce115adb7ae316d172e5d5e53f5df0ab7636bf3a960c77224685db6c89a70955c24ebf252eea071495b7e9767d2b730f38839a9c27171962ff6fe094bd0e8ff9f5c788759f63257b76aa4dacfc80796d7eb41a725262422301ebaf51f30d136a173970d8dc480077008e246c504865a232252706bf85ad1ff9a089fc0ce6fd68e4e71fa8a0b3ad51de4bd9a1c441e105d14576999245f3ef167a6dbb365dacf8304a6a7f30eb181a9b992d0349cac92decae1bcc8e163dd0451ece0f3954d88b58b9c00896f0f134acf8a24e000537e16842ae28d7f0af15d47c50126e15bc22710500123c50d975f12815eae3bc07b90b25cadb43d32b6c64c24d5b4adbbd57b5cc0d281454b2c40193ccf21a68e1d28b755d9104bd32c5b47c45b6cd7209198c28cb4f82982e922d63f4fb742b8025a0ce6d980bdedffbb9a54e4f52caea9045da5a1bfb29e22ac036b82402ab9695a81d39207c8919b705ae25655ee294326e79ccc09d26a65def2a88320c3b843c6fdc1e82e86eb604307a5e2c3a7129735af086a6de68903182e1d718b7f40b0b6c80a3a31c9ae3a4df0a5b0200eb7a4d3c4d720917a224f14552f353b4b5e19355b6e44fa90edf5de6bc30bca8b5bfa3a2022aa9ccf433d78c891b66785b19f24ff4e5ec578d17901f582f31af112eb65de6bc20b85170daf045e5ff95a5c2a096371531b08787d05bdaedffa980dc80b8a178e578c17b7e5ab71a7fbe886ef18279573bdbd6af28ac1d737d8bc17582fd25ee4bd80f8eb681d0a96a9675ec70b58c6bdefba7491f5baf7528aafeb9a700707acbda8bc80e00b0e36f0fa2ad0a9f5852791e49f1a2f1caf775e585e24bd32793df76b26bc529cccdb5e377dbd04fbf562ec45df8b851796bee060dbbdc47ae9d9eb68beb888010fcbaa8eab5e16eb23aa8d9132baa82625962e0208491ebaac45f025c37766d515977011ec9fec126ed30893d10a0e1718b1040a90a1d4ac58be088021c58b95e4a88cb09750e1a14ed0bb28c2a38c6a9ced4fd3e22c7b596c7d4dbae488a17322ff182d9d14cf9c39fc08e6df79a13b5c4e91fc054e883cac7d40ad4a99486220333e3715a13bbcb1a71c700b576a9f27c8c033c509e143284e97a286676e05c2ad96556aedce4360b89d663be7b255bc1c91fd0be626feb52950ad6dcb306bef78cc3359da6be6a8d9c009bf32fa5ae2d22906194da3764668a3d29e5c6831a51209a455e154d9871cc1f6b0101bd6b82ca8958e02c74a980472e5d359eee4a65201f9cbd557dd0c8f57851a47baa3cf85521914b9cf602d8f90c85b3e7ee87d606f2676b20904f0e8477e338c3a835dc2611b9e377bb9b63a00eea4890e5192970ec72ed7e0c28f2bd28a3022ce4b2bab7171d7a473481c32e29ede2fe81a4ee381677a61cb282851bdff430c64f10fb34feb607d680f250ae825138ae8627ae4d20acdbb81e49f785f476f965f6925e73a086610a32afbec3ba998acf29870d64824a52e0418aeba14d6bb3fe0b9b36f06bf730bb2cda7e6b36cf15cea0554f41d1c1e877bedf1ffcac7012dde54f66046822b4ac635a07292274459d13b0b046e07ea24229efe517dc3dcca4f35119deaf184c20b8925cfcab4022da89e185b00661f5926e872642ebf1781626671652445d7475b71ac90624d0894db7ff94c712c0868789306d4acacbc53552397813db2326a92a62b260c8de841160e079be8134f47dc5113ff512d83041d4eaa182da97380cc494bf57de1f2b8c48d214a644f8c27b47fe9ace6b0cb7e4b928f7502b73b442d6bc9a805df848326e6d63e4b9dfb9c7e6d03460b81e397b42b2cdc2ccce9089f3e76d132e8a373958752a5606658efc09de3f842056a35348e67bc04b99e7d48cf0818b4bbd5e876b2724151151e37c90ff8514dbbe63402c837416f8a7fca73f1cae390048c9f7039f6e16b029038e665e957f3d52826d45208092a9e5529c868cd54a0a6a801f382d452c9539ccce897f611cc5e5f1871a939fbc1b7af252584e3ea133f7c2440ab3f7c450a40f6aa303d19f4dd461d21b0672c112d6d71f08856dcf405ba751da74ae7545317a3dd46aa0744577d2251d003f8715153abaa54f04f120512af1797aa010168ab44df3bc4e7d7e6067de125129b722b178bb766b8a0a498f09661da40524e6913dc4693291a597b97e1cb6041d2444283a1e88917908c6280c6f46349d6d0e46d10e406c3960c518ddcdbf3fb7e429d9860b0d300b0e547f09b30261e3af39886f569f01215f8f722077eadc920946ed51258ae1b14858688800adf138b83415add4874a8b11f00c8356cd435b76bf396a20190fe6c4a7072ffd0b6255e6378b38f74ed3dc04bd8f712b0fc4353006e7bef51df9b889019db12530546024548cf7eb3fe9ca739b6fd8521225bef807f7736722d192693d09cbdf5894d6a4c2e457eba47fddeb1a8926d724fed8f6f4b9937e0cf3a23cf27fe6b74ae93596b20400bd2130334382e2f0d88b4adb08a4c97e347a0a6c637fd6bd3dab51ef4d8caaa35e0c0202bea3f5a22ecf9a9bd32f06171f531e9f9c93bc2047bda013bb68b32fa9192e4680372722b98c0296535de642c02148509332effd740286881a3565ba8c4afcd050cd78abc2c449d5562cd0ccaff45a47f4c6808f501e4e102b6785f2c790efd31c625f98004e64dda306c4b4411b04bfaf6aa401902fcdb9b5beee789a55268a697c54b3c0aef92272f0c6422ae36c29f1db3bc1a37fbde38a5a6a0a3f6e10c5c1e73315301ba3564b50ea83afbb5b8ad4d4fe2c547246b79c0b88c813ae345734262d3d2b66aaca6e7e98d650615e34a03a69e51c43dcfd14f402752cb38ba3077e40b5966e8d004ed86f57e9c33b50f042b48d585c25874fd7b7584b3a88b5243a5ae7271f7bccdaef1bd1ac6c12e36f30575d62b12862c988eedf97fe20c4e0c54eec059d3222764d3c4f9c6c05e5bd386678de0858c24da29ce29b33868d11032767a0fc49e508c012302deccda0dd2a3ec094b48faa94d3d157fd6d01326140cd97ef7f04f0360a664c5570d2ba112c5104dd17937485844abeb6b6a3cb98fa13bc74a6354b058e2509f46517d79db46d0f1557c904b0616b540214e5aa2f1a96a4f4abaf846023cdb9af2bffc5edb16163bc840da6e4495b9688fe708e1642d30cceda38e0b1be0473537ba2a0dff66321dcbb89c9a9f1006454eb8a9285a31b1ca55b768691a2ea82e726d8a0b0eba3388e8a91c8c2ab48396947e65cbfb8aa7281f330c7defc0fe4f05d238601fa0dbbccb8100741698fc66c58e1c871027221e9dff629e0178c9b7781db1d11920228b5277dcdc8f415fc4780c7c67ea63b37cf51c01f9d888d32095e3c0cd64bca72b3cff8d58545250151b906c61f9357bc43bf63e7d6f94d25925287e4ba856f7e9c5466b844652c0481e9ba647541eb7c02b7229680e3b68e15c7fdf877d1b065541f45107f0f4071d81c3fb98a64bf61a1e7fa506c32b942a33f810f0436feea1918fa9ec6843d4801eacec92ee393c8c8376e0c623597006fd4409051db2d031b43117fc1a307e014818a08c7fb1d7a4b084c259a470b1cd58a3e38fce49c3a1fba582b79c074910bc5faac140da2df73d3845bd25db4d0000284519364e992b31cab6c3fc27af2c19d45e053fa77bd0f1924f561345dcf74dc45e57a9d825e180fa22ea01717335884c8ebd39aa5bf20d1d14733900d5f8276c30e2db3aa1aec8940661e386d533fb8d77f82541815b4812419a3748bf2ffaf96a109b5917dc8d0f4995f56cf1bc3c493fa0c23cefba03215166f1d5e9aa353c61a7dbcdb7fa5b7189ef96725cfebedf49ba281200668681c7f63177651fe3c24429642b6da8d0fd5ca51646d86faca40023a65865844eaeb48dd993531393eca3f1044485586fdb7583812cdc14c9f5c92f8c5b03dbdb44c6e8fe03c6c0e4aec5a2ceac4e334ee48ba30895535c7f18d1640047b808edc44d6cdaea9ea6d9501159afcb4733d6f60b5cf0fe8da9a1d140f563e586d94287843686bde54acab1ce078d534873ea58d934555e25d058613fc66c0877d58b1ede1cba54347ba7630c2afab0d7388e80cc713d7a89923070353fa65f51b92848f0013bf3d1e4595a76550da8e8ea342f0b93ba3ff2357064d9a5f3a14df75f5651731feb9a583aed00f97df819825e1f0ddaa9b086b015a611f54201c4211347374d60764dd75992a3d5f83f53ab707ce7baa5ead8848351e11a62506f68b7995048c596036ecf9dee6fad9bc3b10b06f25908db388e2d27908b87315d48a175d14c1cb8bdcfb81ea3edd4ae5399d86e643dc8dc884926ad1b57393a9d9ebdc4ed4ca5a1b26d7d197c8fe8fe5b3bca7737438909ad11039d1211e48f3c4fe479e1337bb7124c422042f13541566bb0d009f05966e1380c3a015b94d74689c6634c7d67362d317d9ad6e4ae49302628f30bc761294f0242d99044fd304fadd186fe8f1d86ed62541d82d3531aafde6cc8bc5ed208636736ca10c6356c13cd4aad7029d07ba12f118c6975065d52075f12ef7569d6c1af19e60354ff81da4286ed72d7222572e22a6cbf80a3f724bf8aabde964fb8932df2ce8afd9c49b87b1c2d3de06ba1038f994a20a9d281c8390890bee80a916d08b8664253f96b3dac9942836a0938c28928d45da01af7be58c29d1e844239826c6d51014b3b269dabcea3f58053bf5e35e3d910f005502ec22f72bae2d1c4ed517957c864500094084a112a4e95aef9aabcb45e6d327fd35cb3e19d454f73f87e67c0b51c213793f24d6a9a7bf9428ccf13eb38752fbef00ea1e8a5d18665f21b071c3015a086a73aaa36b5586aaa359d1c18b7e33baef6fb52d49674c3ccac36e236ce97000b4c0225ee59b02205c8a787561a1b3715540f7d4788d1b1708fddc2b9dffa4e2b6b639d1ea48d0159f12220ce71ff9c9349bdda08ec382c25948e124fbad046af5ae98f2394284ced153e1b3acfea8ef1dc36f1f2c19e6152c02b519311e78bac086bd319ae839f7678f43c1730ea137ee698621dd76af874971ab2e8c366413d5ee23c9befc4d3ae8cb5edac2460ea2706408c6f6dea2a51ef85ebef314ba8cdbe103ae3d73aa6b56d2247fb7810cfdc0c390f9a599743dee3bca1739fda6db7088b436a4f2b9e31e2b6cbc5ba41303c24deb7fff368275eb9eeb4d9965b32d8de86ba7d04dab939848a36880a961f88373724723eb041347b0d77e385056023e88e42a887967d4c397e5b3da481dde3e44ecbf212a3ec6b405da3348914c31da25122ab8605753a2802ec0573a209885900473d979dce5012c174cbf804f140b24729d067f86e7eef99f28953a38f94943c81126457747dff2e8211e101b55d88a35ec211b2c61c9b48b0a4a8712e702a5a9c3ce0824bed09240e052d995b8c79323865cde64b236c2e423c21622aa142dbfd1519c66a9ea87f6a21962e03689918abd7111322414c33edb4899cee9ef14a0df36c04fdc76928af649229a8e91ba49b5ea9d499670717d6bbeb4458e2d1c5b594b46b867fd4822dddccd496edd78d5db279565ad525718ebe9186873737ce36d83f319d99c45880790f0dd05e14a288819a0d0565ee53772c5caf3ccb83639bc3eb83dfba93e2feada8a14473c119d71001583946a61560427bdaba0f91818cf849e255183cd2d3cde21c1a19a7a4256246c91270893af4f40ae1aad472130fdf7cbdbd92dc35634813e05f944a2d2bf4f1796bb1e06c540235ac7e61c7a785535ebf925e49da4dcac78554f923680b78a7864f62a07be8a0dd1d3000653593486898d25995e1771f0fc86baff949ecfda156796c2729e7fa8d588f3158f06624c7920d2666bd1a7e0ae4d7a9dfa05bf44b15a2d495ab01644201db2340734e2b5c138a29dd35d05b7829450135006a820214141928725090a5c8860e2a0395148af714b0cc1481ba975e6f2cb650b650c0a03809f50d20249bb412d43ed414501a502fa030a0484165819a83fa0a05074591517d660e476112d4d35f54df8d2d08d1a0005fa87bc9f71e59034a138a0d8a9a8dba375a4d3fc2a1d042e141a57028605b17f29572a380662ef9017b4affb4f184e089d5539aa7bba7b74ff0bb4457e680958e0088021638bd04b5d7a6012a011cf1027e72c5b90d3460f0547230333333333333333333e3ad6a6e49f84bd2def7a9998e84029699999939f38bb4d94beb655b372f1c45daf017690702cc0dc40d940d4ef28f42d595050aaf4264fee41f7dc2190def8e43eff0841b7cae320767f313974eb83957b868b13f8a9d279c70faca6f3c8548a79437e15d9eb434d7a16af2a4269c89e01921e3c1cdcd84df9d3d68a4e8c4d82d5d60c23109d6677561aae2bf84ebd926de03f9143c4e5bc2abcadca9aeff3c74b4125ecaf6b6f38d8d8d2625bc9437fd93856ef3cd26e1479133a3fb87ce814c49822e24e1c747aef4d1c48e52965d44c2f72f5fad9cc2c76f030957dd43f4b01e6aa5451ee1a58d7512dcc27910d38ef03c7bc24ffd6a8467d1ed9207161aa00b46f83fbf2e3984a670392cc65603ba5884f3d6616cf14b69e1dd158c41cef83208015d28e28ecc23ddd7c6b42db6e019609e0365ef8216fc09c3fc0b7a8c2e12e14b5d881e3dfcc7901a4478a556b5393e574b98747108bf264a148fa3ef4ef676a00b4338c9caa317974b21fc784436a6433e39b5c3e88210feaf4ca86ca9a447a35d0ce2046147178128a5d565855f5b6b5d00c2cd8c0ca3992a44cbf71f120c1774e1076f324a900e729458bd19bd2de8a20f4e853cf5a1854849528e185bcb7ce8620f5b8ea5af53428cd51bbad0839b6d5716a326c777d9451e1ccd1c85cc610ea63552d5842ef0e0c4ce71acace64f3976eee079a0e51ecd6bbef4113b78b1d2fe24a69c33365d07cf345db8b8b9fb29990e8ed6a5b44c399e831b39f2782c73a889dacac14ff31eae39735e89641c5c0beb29658b0907377d8e51a33f67a70cdfe07fd82c7d1e846ef02a664ff340720c39ceb5c1b5ac315e366c70b263a3844f69e363cb015dacc1798fe6ed1617fd3c58015da8c1efaf89350fb13e6bd9451afc30295baa6b5e0de94183933a8346aab98ec38eeee20cbe4de58e3dd903e94d1766f0ebcb424d7af77d304da18b323ca10b327892993ce56421cfc63ec7e0c73e1f5279b7e4cf2a8b001a7080190b5081f18089011860b432a20b317841a673eaf33058b24918dc6493efd3dba74f6c607052a84d1f4f298daa54862ebee044ca3e9f428cbcc1a3c0d08517fc5837d144aed2c009c33c0bcce88217a4736b773c29d9a6b9e0e624a65ea2aa1e6a320b5d6cc1f530df88a0115739ad0527d867bac8b1c71624ce82e31195d171ec369f2d2b7481054762e81439cc41f6e8ff0ade6a49eafe30a262262bf85107f6f1b547a3feb92ab89d46bddf6a3c524f61a10b2a78c93baaeaf8627a201e53704a255b5270436d698a4926471a3651f0ee439a1c7cccd5e751eea0e0584cd1a8123e16f1c0bb27781f2c26c663db095ec44bb86af97d3c6e13fcb9f590af2ac7517ac904b72747fda9836e094e8c9c635d148f4ed4ba538257e9c72383e47ff1b38b2438dd653d6b1e8c0427d53433bf473942dd2378d21f4cca2a2136876864e8c208ce6955cc1c6a0ed2a518862e8ae056081d44cfa167124d21829b4782677664e9a05343b05c25ee5b324e5a32de2e84e0f8797f4835953c3e9d17ba08821ff487e7e95831c7ca4070e5fc2cc974ac1d3af9033f96eef01963d7c739455df8c08d0f36bc7f1cb48133480a1a0006182bf833ce202938b092d0450f1c4d1125d3ee61ee781ef8ada91d994ca45e7f076eccc1cf46ed1c3af0d63cb4289194a6e1d1450e3cf1685dd7a136a4fc2e70e09d9aa5930f1a363be716aee60ac164836bc4ead8c24d53e757579f24696ae1ab7f90d523adaecc185a2c91414e6a2e330bd7e358c2a7befa238f220b276b5af228078985779f37c4b01ae1810516ba7be8b22185fd0a377d882977fed815fee5a9dc1f5f7f66785be1a6cc6178c946787858e19ac428ddea51ab70c6729cb4238baaf0acdac7645294efe854781f6b4afec993736451e1876055e359abc325ef145e44184b1d6ddd9d318593e655227914be3ea570263ad5d4c49ab1a491c20b51a36ee4e3d99469149ebd7475850d89c28d93578f8376044b9b5078dde331f38590223e9838e002147e664c72e73996978871f109d73a5a7dfe62f8b9983e02179e705cebb38ac7e1514e7d275c0f39790739c7548f0e27bcd451660a396c92df66137e6de8f71c246af64f6bc24f1bc3db853467c2b56cc127ad0313fe5fb97d071506f52c908106ca7816b08094d1012e2ee17aba9aeef49e6a730e4b389d51a4c73dc7e3279706b8a884e31b2c9d471f917146186298e102166007b8a0841f475dfe793a9c7b749531092756cabbfc45626ca151391792f036540e5a425aa443978b48b819c5e3bbf0e61b3984845fd3614a1edb7698b57a84ff762947ee0ee2c211f8d77ab4a7b86884133376850837000304b85b00178cf03ce610362507ad983e30c0a003178bf0e350e3718ebfb28cda27b85084d7a6319b99bcdbe5342127b8488463967924a79c64099925b840841f2babad63d824c1c521bc0b6d1b1ee591cdc87261085fa3736c92257b6667e1c045217c5f9f681d965680a2810b427893831c73e79acdc0c520dccc1d79d8a9d7334178b3a5113da7856c9523107e2a4dad491e20dc52bf9833765ce6e03f78afe12b9ae31c8d6ac70f6e8b75b0da4c1fda07177d58ad32cc7bec52d907b8e083971dfb7bebbc3c0a6930c0e0ca04177b70cc524ea9d4cd6d43940b3d7897c2870d15157b4b9307378b771c8be40f1de588afc0051efce8debe233476b0b9ac021777f06e2d5bf4cd15f35a90c7c0851dbccd1937ed41f8ba8f2a14b8a883eb51cc1b19a7392c3a11704107e6a3f70e2ee6e0d75ffe38e778e2420ece79e841f8c03ab0f9302ee2e0fbcbcc048bb269b97602177070abc3ce21875025fd31f7064f3c984c31d26ef0b3c5fa3bee0f176df03c8814573168ea103d5cb0c1cf41a61c5a697298cd70b10627450a39667a9834393a0b5ca8c1f3682c4f66e9709106274fe8d8680d8fc66218e0020d7eea731b8f91b56db23070710647739c34757ce972f81431b6cce0475e9fed3604eb9443710b5c94618fe9b52224830c313e05670cb33e704106bf53481d8696e8ebf08bb195c9052ec6e075ac21bd3d84caa376810b31b896fde31cc52593467201629c314607cc48410a124080051080000b20c01931f8335640c60208b0800510200304d0c00408e048f52f1823b90883ffe7e9fb73b6e5b0138619a30c167019643440010458c018655c2005640c5fc19b11860a4c0c8a0b30f8315295437d44598e2f381726c7d51df55dacbde05ccc77a72fb975f1e8825f1eb947073765e13ab8e05b4b8e739a756cc18f7cd391e4554b62d1829b56e917ded2461f3f0b7e501922741e1f0bae7d0ecb7feb7e952b78ddc1e6cea7395670d4db83a8c70a59f361077051057f55724e619d1d9d395470c345b1f2b699ed28650aae76109682932e74ace46d1f476f89827392ed63b2fa4c9b2c50702da264bb8f1d8429cb13fccf93a1f69672187338c1db60d29f69a19ef24d70d35a6f757433c1f719f1c8435fc4b44b70346272a89c27b8a84a703b799ab0312649f053368b30f113bc3d8204a734794c9d3dd53f468ee0d4655f0cad1123f891879bbde7dbf01229829b27e5cf692385334d13c1dbd851cc933e7b90b91e82e7a1728a79d090b2d44270aeae2fe32d69c89f20f8f241cae3d00204efbfa388c935c4a4f40fbc580d2e73397fb9cc3e70d625f5a50f3afc9cdc036724f7678fda36b9c83cf0d73b70c9a9e21df8229552dc4435445407ced69fc5c758cdc1b73970523e9e90a3d92a8fc3050efc0b714dc912bd85ff81e59042b63a0aa7dac28b97187712d3ffe3b4167eda0c29c7a4ce19734a0b3f6bc887e5289d852cdc70ae96a3af1cd84c1a0b5faa3bff65a6b9ef13167e4e5e1fc4a444bb395fe18693d8e639b694344e573841bd358d5f67b1146c851f4b060ffee642d00ab2c2d94a7641ab3d478be22afcdf943326b190e632a70a3798c9c999784c725f2a7c8b61d2bc735e51e14c4a65a9ad7d53ea53381a8207b9a333bf7a4de1a6acb9490cbd9ad52b8537c136949a87612c4d0a27e2633b7ca4bc63148ec61cb3bde1d6412c0a3f65adecb5fb963843e1867590183771d59681c21ff1f1305bb693e0f1093f8ef1f71ced092fc5146b1224b77d02d0093ff048963ef05862ccc5893302b0097ff3782ed17ce943ac09274bc708b1322b4f32136ec9e58d09db794bc4849349b3a6aa14dab1750937d43f8e973a8958c27b171b3fcd66314255093f7eb625dc336dc750c20fd3c2674789da379984db9fe597d1b3e68b25e17ad429c94fbc338991f03f96c96cefffb11089b1a595027290705322acdd58d0907a92017884b79e03f310fbca1651001ce1e4ce93151bb33404a0114e85b3cae492257b8e9d21008cf0e38d39da7acd09c0229c8cd4f19b47693704401184d4a8d398245a262202900867eaa67dd3b804584018190044f8d1a76217f3188043381ed5849fb05ce1210086f0b4437e2244d9184b3f04a010cccb5ba5c684d74ca45ba9745f85ee8ab9c928110042f8b1c478c88e323ba2c720bc081ed5c6b84710cee4f40c9dbba335ad8170ae2f5a8aeea0efe30484573669da8374fcc10db78868ae397cbaef0747b34ab8e9504135c7e983173a08121ea60f3dc761f8e0c7bd21ccd7781c7396f7e07ba609b54c550f7e9f6a6d8dc6ca95ca839b29789aa40d21aa9478f065ed56be3f87c8aee920007770366f5cd87c07c00ebe791cf47647e126a55597c810803a3897fc835af4f3944d544100e8e055968d9837e68e3643023007cf82dfb4cd95f647b6185b888400c8c10feaf3558e2dbd32ff626c350134e080c38c3128007170c5df3b0839d0981cc2626c5d1140030ea84504000e6e6e93cd5c952c94bd6ff0f3062f2df3f84ff7b9c189413586c89bacb276b4c15fdf3c9a266f8c1cf96cf0e527a4d0fc231ad3b206bf2a741ce4f5df9cb2ac06d2cb379c06ff52565353e7c03d7fa0c10929c792c9357cf0e99dc11b6db9e920d20597ab87d67a646677da4f6af2ca1ab2c104bf5b73d02b6126bdb665bc1965900b58fd3105d858829fef8350a6e94b9259c818c38612bc1c7beacaa1526c24c1b989cf082a3fe75322c1fff86d24af68c56adbc611bc0e53248f94d21a5d2423f8d96b62a247a22a49421b457024e4f8c27f458bf4171b4470337db486346a7f1bdab131045f2d85b6ac3e0a880aa8d286104ecf88f16caf958ab3120fbe0391f4311b41f026cd3d5b2eedec9606810d20f861471a43b77d6cfcc02bf16c123cf81c7f4e59800d1f38593ee5515f5a8c2d32c630b3d10347fbfb42d6e492f3983c021b3cf0b24dc207e13e5c671c868d1df891781052941c43d810611b3af04296fc8b844659cb88b1b58231ca38230338011b39f0e394980927de79e6df73800d1cf8611aa3ee7357475416f815584003356ee18d5d26ad9a94557a5eb485ebb16a760d13d297b60dd4a885ff71986287e654c122430befa2872e2161663687d49885b7a515e52de4d490859f352695d5d2aa62522316ae6d57cc9148d6bd5f03168b59a87c16244c6abcc24b0debe13bf2f7ce71410abe0c162cd770859faa9ed6dc3abacdae185b61c0e057a0a5801aadf0cb6b72c7eb41aa8e6231ce20174031ce202c40199c61588315877a8badbb5b88a7d40761fe63f80c720130c010e38c5c85d31da7a4fc21988d9bcd821aaaf0fecdc247993a47972e158ed89b4f4b8a0a377fdedc1e655596b3a77025e7f130fc3e3e660f05354ce185db0ea23eb255b1bc13d428c521849a91ec20250564905152508314be04f1701a72a94c79d41885ef1f460d26a127cdfa3544e18547217914634e8d502051611e296eda9bc33c63a7cc4cc5d82a838c068001860aca20e300030c50b87e19a173a8c85e66d7f884ebd9ebce62637b903a659011c656195f811a9e70635467359f3be1494dca1c326798ef38e1779a2fb5d0c1d2d57c98e18232c230630c2e335230c6192e38408d4df85913249ae638827bf0f10cd08417af12c3bb43658f7a199c719970ad42e6b85286ecde6f0d4cf8729b56cd3d85d4d65cc291b99690c39e1471d7125edde4f08d3d55c2e9cd181e445fbf0829258c8ab68cfa50116b91ab0f43a87faff73441ac31092f3a7cf491d7520cc9918477e9c34a8da423e1e510ee626378486d6148386d39e44d9762ea0c3fc2e9186ca4b2c6432bd5115ece71a68be54952c4ae4623bc0d27f1f12d295af28c70d2866f740b32e699d658841d9175aa361e45f89f2f85ee502b11dec6b668672f21dfdb88704453e6de505be1aed53884e317dd112a326e29437857175b65a3596b570ae18f786873551a21f8d80cb19bd1f44889eb4e19d669c341f81f53e7cf51e5b5f6e808d4108493392d7ca0aef5a1e76a04c2cfa176d22cdf6f180588ac64cb426a32e22a33daee42c4bc3ebcc7b2c61ffc13f31cdc56b2cd39c60f5ea52c1b3b6977fc9b453b630563907101adaaabd10727c6fcef591d6e2a830908420d3e38ea5f92de3cf2941da900b3021998910030c03839d4d8832f7f36c93ca21a7a70226896584b39fd84dd831a7970cdae354505ed68e4c7835b21ad5531e53b38d9962e781063a96559c30eae7f14d5e3d59e1ce751073f4ad024f55f19a434745b3a8b22e6cec19b10ee83741da59bc7cac1b1f9a0ad2b1707c7ea2553ac1c0787a4e53daa4bb3adb2d42d844acb99e3bca3f46ff03ea276ea0935dce07d494471918e25e67a0a35dae0e794daa5a5720ec1552ad460831b729a54b9653b1ef5b750630dce57455f657faf670a036aa8c18f51d63c3efee0b27d8d34b812f35c8c07cb71f55c030d5e900f75139652962545438d33b821a4ea106f99834c1f64d43083f7e957ee3de33ed971c85800d7a146195c1bb5ed6c2149a407bda10619ca1e527bc8191c8305240c15984160c014a83106b752badc586b35c4e0c68e3a3b72d8ca6ff9aa11065f536ffa345536967e302c33615d3212f7713755697e5ed9b9a3865af50b7e1cacc40e3aea053fa5cdb0aa31637550a30bc99f8459a688cc39a8c10567c6ba6386479ed8ac0d6a6cc1cf3f6de176359eea3da38616fccebed661dc6b7759b2e0987dca72f5090635b0e0a86994689f109e79bb821bfd33ac9a6a6a58c1931c8794b975d4ea780d54c14f92a6b73c76d4a0421b2259aaf3b04f428d29185276874819e96422d490821762de1e4ba714c0801a51707cee82977509053f86edd5d2ee094ef020944568e7386dec043f8e15a1a3df8c0bcb36c1ffeed43f1629a9e5a84c6b30c18f3cc418c25d78095eb0cdebde7da1421ec5d80a839c91823f493594e0a624ee2e217860000c304c195c2309de845df977d89896836a20c1894c173b8e7304bfbc2787152c4731d9c7085e96dc13e1ee7637972278a1616b2de657d9112278b31ec548be1891243a047f42944b17ae0ac1e90a611a3bf7795b32084e9bc71e5ffed6ea0e81e0879c86cf1f450a23f98117cd73fc294ae7032f851cab56eb1eb8ee216bf4bc9525a78c07ae9fc9c44b6bca61d9819333e50d1d6d687f68e9c09b2977b3b3f4f48bca3e5023076e76209ed52e24cd81470d1cb8d129f269f8e87b2e7f0b2707f2a926958393f56de1c710e3530b3f753afb10738e1291166e9edc1d6d5acd2c5ce930d77d8745166e97e48e34ab120befb2751c2bd64fd42c81852326c927a5b70f197e855bb13b24658fbcaeb62bfc74b5699d3963f850b7c2738ff249dbc1acf0357b2ef896460f9757e158f2cc9c3e7055e1c774b0091f7f9ea8662a7cc9a89946421449a14485d39b2782dd079ed28ca7f0c27a8e825bfad89e4553f8fd99952f47e54a31570a6f4366b9604126852bf7692a75bc298875a370530ef3471f6dca1d96260abf23597fe9c80a859f25b468cce6dedd83c2b3f0fd71e43433b33fe184f41fa9ba4a343ce17d501ac246a64e97121a9df0b3e7fdbaddeaf347d3e00469f27a982112a0b10957ade3f0b8eb3acc9a86266864c2cdc1c496ec71473930a0d4000d4c3c6f31f3078d4be829a63bed3888f3ce023016342c31071a95f03b0c21ade63d0cb1694a7829071d73c797f25694694cc2f74052eaa808cb5b1f4e040d4978e2a163598e7b31160c308a093422e16687e1c2e598555247291a90f073b0f9228f64887fd023dcd614f6615b88cb36b93ed07084d3397bec20c2e4276c8df0253d69f0b0a753ce25231cb5ccb8cf39b566f88b7073149dcd6db3254b570183030d45f879a39798e43091361a89f02f58a6b4d13285bc160d44381dac47b12724b7981931d0388497e1c3dc99b6e3653b0ce149f0cfe1734af956430ae1a42f95ee1a9106219cb4f59fa3ddd58436082f3e4514845b5ddda1e6489b881c8d40f89f83570eb34d1b060d401ca2778879b3792e504118ef8216d0f8832f16afb6c957d25dc6a915d0f0836fe781f726bfea20b43ef896e3983adea26434f8e064bca4d4ca20712ba680c61edc18357b649d77b2b0e8c19f8f267c1c570e3378e4c1098f23c3a4c5f0eb260d3cf869a9d6912d2a56a7185b7770a346d80c2e727139e60434ece078347fdd61d8d668769030caf833740c1a75702e5c2a89aaed2c2927c656197fc60a9e0efe5dc851cebe9ce38aeda0310757b53b4c0ead392e4d1a72b836eb5de4d6d35b4ce3a2dfaeaa2a2ae6cc018d38f4f9536fce146d33d20e0d38f8b32e96332b5bee99dee0a876e5094f1d76574ac30d7e0e5bf31c2e34c11866d8cd81461b9c8be62aad3de973c4d06083e72b95e1520eaec1b1e81da4b19443ca31a50d34d4e089e5b092c93143dbef061a69702e57f4e82c7858df281abcadf0e1cc2684cf351d8d3338656a17b67bd682e44cc00cdec7f84b159ee1ff7194c18f2185909aae72061a64703444670e2a63684999061a63f0d306f1ac911e7d90927966a021062f761c4f57aa0e0d2d41038d303817cc7258193a6880c1d13c295372d65f707bb52fe36254d707312ed0f0821bfc4a3d5233ed281e5d7093680c5d1552bf64070d2eb839b887d5e0317498533240630b64cb2eb1a256df63a0a1052f07a9262e9f26028d2cb821a846897196b5659e000d2cf876f239d0caac1ed19116685cc18916a29f87f2c8a8c04d818615fc481fe4e83b96183c4327800626400029d0a882e7b3d531845a8b116343a04105bf2378cc81c60acf6102028d29f83db1b5cef36736bf8440430afe8b0719cba222997944c1cf1f59318764e4141d28f8618896cd12121a4f70734fde905e3d884e89ba808613bca81e3d1dc77b10420c8d26f8d95dac364b3ac6e22fd0608293ddd63f0ed36309fe250bcfc1d9848ecb43094e16719f354bd3213a92e078103d0c21765162f491e064f24d51c5430937cf11dc4a211d958731467052e542b3e4384b074b119c24e92fbb5f8c878810c1f7b794cc53d4437033c79aabacf6659115822b31237dac9cbeaa09821f5ff6112b39cdbe81e069746a8d4152494eeb0f9ceb605369eca0b93ef5819f2aa668d5f1d8859d3d702e759453e4aa2429973c7033c4233c4777ea0fdc811ff4998ba7909f8e431d942a67f672e07b6ce6d19626a6974603076e92fee80315edb49aba85a3e51f440f25fa58c7166ebc85ba2c3f3363710fbaa885f3231b62d2d2b07e1a5ab8a1628ee9510804fa075dccc20f7fc93654f2f7f25a168ec45691eeac21759074110b7ffed4273b76df54bf0c07030c52c677010b373dc6d439d4d09ea1d2c52bbc13d7ced6e8e10a37749c4dd383dc2ebf69855ba73671f1352bbcce5335ff4172155ef434122ca3df48c85815ae6dec283c974a089768c056d0452a9c9082fc9b7a45cbb44185f3a13f96495a2eff9ec251cb59613a4e2d996d0ab7e663beb273f8f0d15238d1963247467b099223851f5bf8c8a1a310267246e197e6b3efe4611d9e89c249f181a7c47b0c998422ca7b4a64a8458c115e48218957f8c71b528bf0378878a8b8b4084b11fe8438df98a88ef389705d3b484c163e0c394410e15998930f9b92248dc8219cf4d28ec3fa30841b215f070f973a4447219c2cb351dd7a42382292a31c49e8b9cb0cc249167294d63e27bf8920fcd8390a117290c3c41d083789871d992db1260a08afc2570ecbdee15afec1cb8c92e9364927393fb81d84af1c84f496d3d787c32ceb9c42f4f8e0d49d8bc7ce6016de8313ab6342f8ad0f9ae9c16fcd31a4ac2c0f8e6b6644fc6b8da71a0f5e957bb81a8f3bb829729833468e1d3c7915ed71ff20544c1d5c89390eabb359ab6ce8e0ffd685f00e42c7393307d725c494ee9e6388ac1cbc4bfd8166b5fca9de387839ec0e9be34bbfeac2c1a90ceb617491ed70dfe0c672add14af37daa1bbcb0792d66a40d6e58ef7b6dcbf923d9e0d455697c079b3c2ad7e0e438af77488e5139d4e09c87f19525f2771c4c835f1e3d6ac76bbd39d0e057280f420e3f315fcee0679648a3da99c18db0d9255365193c49fe75f51993c189f2d3c1e39c3d3dc6e07bd8982667983b8b183ced8cf0b151eeeb0f83ab61738c48b339730a189cb77ca972660d19a25f7072b67c95ba3b5528bde086af146f1d76aba60b7e247fd6e98266bf70c1bfcd1da5becf9d43710b7e70a3217f471e243d2d3829ca2ca9240be51c4434aa5c58f0b6cdb248ca15fc9842b3a369ade08516cd31345305b7da3ab2e81eb33f0a15bcb38a141f85e8305ba6e0ca2409b1c3889d7f22056fc37b8bc734a22912053762b6ca81ad50f073b09fe4edc195974ff046baf387b835cda113bcf114fbac72f6b45d13fcb6892fad0813fc9839d4b6492dc1cd88a16426e55357aa043f8ca1533eae8ffa264d829b7ee31db7d9078f14094e4eb1a3cade71043f764819fe2fa4cf792378533dad52a572f12982eb1a96952c44702be70d391e49922e64084ed218657216de6f2204ef6724a98731a53a49101ce9ca689eb2e5df08108c9855738edcfe811b93b53ff4853c37fbc0d31c84f330074ddab13d7065d39a5abe0d0fe1816b351b21d91df8d7aea1eef3474ca20edc4eadf9274b01e4c08994ff24f8898a6a29001c385be9f739c7d44e2b6fe15ba4b0cdeec186b4d2164e853ef1f14a39da2a6be15cbc5ce8c083165e948914f9e4ebb463166ef694520e92a93dea90851f76fd31529c98e763e15fced159924d2acfc3c21fbb0ffac7535a735ee15bbada9ce963c6deb8c2954e1d59e7b2ca7eb7c28fca397a489a156eecafff1ca7bb4ef22abcec090d49abbd93aa0a37489b57eee47292a6c20def20c71ff96fe71315ce895fec146e4796fbf3473fe54134853f3e1e580c0f3b3387a570225745370f22e7d84252b86d6ab964b35138e993e7f84ffbb05f145e14bfcdceec9867130a5f3efabda5f0a1a1018593d324e6f8a7d25be6137ea86429bd3bca31da9ef04b7367ebbe134e466e890f54db5de6841b52a99a8c5d6cbd0947ea4d634e9fdd2dd584bfd271ceecc0cb846ba9dad91b1f26fc28751c9792624509dd253cf38e723db329f38725bc8f7d5a3d22fd9fa3127ea7fc516fc943778e2f43224810fb9884376d775d963662f992f0839968d2e18984ff31886aec8fe4810512cee7601f8670ed223fc28f19a37cc6791859e208afcb6ee2c3758e8d34c28959c9dec63db69e117e241f72e5ca399ada8b70435eb7d7ec9339d58af03f9d97ade5add89108ff4a36a5d8d8136546841ba53b42b828cd8a0fe1068fb5e7225c8db58670b254f650e999294721fc38c698d19295684709e17f78f4e8cfdc37ad83f0e338cefcd5118413a6dcc2b8f97a9b81f04d7e6343c800b1e51c39f3e20face5f48e79cf0f7ec5e46f9f36a50f6eb9c7a7249152c4ccf8e0c44bb2f6e8b23d381ef3a50ea969e371e8c1514b1e6242a50ee19107df3c739c79f27870e4d723447adc15f93b3831774a8fb3b7839b56e93de7c8d1cba50e4e08974c8f363ef0990e5ef20d89721e84e4780e7e902f47ed37ef105939389335c47aa271f0536e8d315364b40ae1e0a74ed2ee1f79b2bf37382155100f65565d9d1b9cca8eeae01ab5c1adb41041da2c89858a0dde8f898a048f3578e1aed681c7281d7b35f87134b15250f118ba92062fcdcda4ceb0a9d1468377173c0ec931e6ca195c0f9289c49609d9b019dcf45179dc1e7d56cae0d9780897e092c18f3647da6138c7e077aa89da4a92464531f86a1ead434d4cff716170bc2a759072728b1b0c7eb6f14c4b8bc8cebee045929822dbbdbc2c2f78f371bc214c4d5e74c10b1bcadcfffd523adb0b2ef88147c719f3b5a4e89ba00c320ebbb2de821fe5ea0da1038bc90b2db89ee9d34b5bf0380c95f4220bae8460b379d5cec482f729c7e595535bb94610f7e0c515bc4e6963e43847c10004b05e70658c11060bccc0f2c20adebf870e226d2ddd442faae0648f2b2267e68d123e15fc4aed392245efec1c998257a9f5516d21e630a4a5e0648d395c5a999adf4b062fa2e0894a0729479adfe35a025e40c1cd51fc73f41a09fbce8b27b8124b2cd705d7095ea84e5f09a392efc5f2a209ce7b2459f3d9115ea3185b676394710632c14bda41be985e8b9cb304ff2248fa918a194a703a6448d91cabbba431094edc040969c4c637077981845bc264f1142a1ff0e2087e0c154cfe5390cdc9c30b2338e9354c642f4f07bc288273151dfda5d13c3124811744f0dbcb72a8f1ad8c035e0c012fc92969f3420847878a9aabb559060db38d75e97be34510bc8f24bec25d6ebd00829fd5bf235c8ab9ac9e2280061cc002154040060a30c30c7201191430c0b082173f703aa634d9b57931b65017025ef8c0cd646b124453b5e6350664c0e00c8e80173d703aecae5193e0e6bf8ab1a5693cf0dac2ab3665483689152d05bcd8819fe6a2c22dbd86ccc15ee8c0df889499c34fcaab85012f7290cfdf47b90dab185b78c70b1c3899993922e70561605dc0c62ddc0ab3317b248509a9d9d2800d5b78d56eb6216466d4c2bb1c15468375b88c9f164e872495d28376ab9466e1865493f3d68821d5cac2fb50fa5652f82ee92c16c5749782ba79b80d58783e9ef29647751ce67d85e739ea8e4da3ba8fe4708557b63139998769859bc26bb899c588b964856b2954a848491fa78957e188a7e9388e1252a82805291843026080a10a00d848051d6e19ef1ed56a716a559aac2269b458cb508c4d5434b1a3b6626ca9404fe1cffda64806ef98a09671609bc2f14eef402d4b7a2e2d60a3147eec71f0165db367ac20023648e1fd8bb7668a0791331746182b28c3c818230c163cc0c628bc181dc253cc8d07294714de5bce083ee2397cbe6d84c2c95831d9b0f8cdca01851f17394a540a0d17d7277c491355c248cc9b2ce7093f6ef51c894a6c0d1175c28b39426984ef1063856c70c293742b091b34b29f658ce3400834a00160801186d9d88457671e54c8c7d9d0849b3f34875566c9842252deb61eefe66d212a980761e2a042c5186b25535ea297ccd2d09637b535d70c1b96263ecbb77b58c22bd79462e80aa61a5d25fc641eb5fbaf74eaae6d50c20b0bf9b36afe806063129e54a749a8a412dd912609ef43f540d3078b8d48f8f2edb9e3e8524ab90609377c2789aa122d9464361ee1c9c59628b11929c56cc3116e7a8ec127b26a841f24acfa849b30420de2710a9b356363114d5776b7cbc77dd9b95549d7e738ca6c28c2736d8f6692c354f7f2fc55036c24c27bdff490aea11e86ba39b081084f4d3d4c125353bffa61d4217cd3a82d1e3954486e1ac2b5febb30e9d042386aeb5a9d24feef7c4e33cc602d800d42389d4a563388bac72c18609c415450061947186698f165c880d38c5b1b83f02be483f4d06a2d875e104696de50b9eb04c2ed4e8fd131c60e3e870171c4884c69447d349d21c7c61f9c6c96e5df638d1fdca4ea8107dfbf39e663a30f9e4799b726bae7831fd887b61c7eb2e435f7e07b1c67e728abdfa59c62430f7e77f0c19df6753429c73bb091073f65f62821fbe3cbc0810d3cb896e9132248f6a4349e31c8e080aac0c61d881811ca6af20718607c1961d4976107275c7f1039de2018606c1845cc38e6f30636eae047d5e77118eadf2ffb7470b2fc848a313104d89883e3514e2ae271e6aceecbc18f73a4192c498e33a79c38b8924388dce790b2276b030e779ca84adc9bcc9587974d47fddb51f2b5020b051b6f7023e5d198d62736dce05498945e3e2e8cf499820c8001c68651669c41460acc601ed86883df31acfa47ba8fe3726cf0375485c860af8d3598293b0eca27cc856c6ae852ac652c53d4ad42e49eecae9c7d1b69f083e59444345aaa766da0c1ad7022ffb15ba58bfe0c864b978cdb55847bab8494bd956206c7eea358390889417ec118e718d06cf529282e20e33456c04619fcace963588b1d07793a639432fe02608001c692c1cb0e4290df943f0af9b03106dfaa4f83fd7aa8cc121b62f02eddcc896c481f87d808831f87a6da933a0e45f20718fcd3a8f80b6e7f209211112f7819c3721c1f644739d205af7e2cf484dcc185d2554c5ca5e4d42da5d9c77e1dd5d982671a9ed5a31c0c061851b0a105dfc31c73a4bbcbdf1e08061861d838650c7d1716dc38d39451cc64335a0ed8b882e3ff35dbea3f72bdb161055f2a5c7d5d4a110a6c54c1cf15aa3deeb052cc41c68751061955547053df848d218d09868d2978d99384d4df1b392c062f461936a4e0a41c65ea0e19a2a568cd2883b0a0c7b01105dfa3d4126b2eacccba5a810d2838773147b79ef3d0de330134e000f2187833460a32000618877c1962d87882dbb12146af34da7082f3b19f04ebdfba0b898d26a055d6650420730101cc6082e351e84df31a6a1e6707b004a7377ed2afb3c3a465004a70636968caf5f17f48ae090690043f57796c9f599a150680042f4cce410cf748ed1db2011cc18d9a7f3a4372e87892626cb14005e6cab0c00806608424df7747e62531032802ed12437f94a5830c2bb506032042dda1f6764816cb9e318021f86a152386701af1174ec10084e06f8ed954a35d96af8f20789a4dd383a5dfa5f681e0bc59bacde49b0a06f0832bea83e4d8f9a22fc707d9ac5596a64a5d87498f372479cb9f29c1007ae065799062cd253db0200f1cdbce73e125b4fba606b0033f4e9ad35523f5a68b0ebccdeb296bfce7fbc80072e074bbf484d7f898ed0070e0751052ba5cc1e3166e8b66872d9c8e3eb00b627697f9af85dfe9c46333f3b4f063bc2bcc88a7fae0cfc20d61b639b6f0b9ee230b57462b3e53675bb5c4c24923c95d3c082cbc9eceb166e3657cf20a5f3b0e1f7cf814b2ddaef04a365bfe8f83b095b6c259b118b5c364852729e4284c5a93dbe05985e329580a612b1ef77554e1f8cc06afeba4c24de371aca221b6dc6f50e14721c64c9bb3f8dbc79cc2ede052e68ea318537897b244f44b7f26cf94c295bbaacdb6395b4449e187ca54913a0e9398965138e59f51734e1ef74716517841c387d9710efd1f24144e8ebbaad3d20414aea7785f781c32934c3ee15c88c827617ac28bb1ec22843c9d93453ae1c590a98f439a04cf73c2d11c868a7e1bb375bc09a7ccb7d3a2d99a70becdf3a59423134ef43807bbca21a4f460c28d9d1e6b46c7b674b9841f152679b2ca5f58c20f9952daa4e42754fc4525bcb7b9d71c5296e489bfa004ee9f59ade1d949385721d2e38b5949f81f8d5a85b01069341b0937446ea6a43da5cb2c24fc58525996e41cf866f711ae7d94cd93a73dee381ce1a435af1c3d62b4e4a18df07dedc2c5e86084973f47d172f068d2e74578d93bca7110219ee92ac291489b3f8ea276863211be86e793cd41f00e9322c2492107971e5fa7a17208ff03f328bbd5107e90ec1ca5690be1c7710e1661f24f0e427831246b10bec7610e6e53ca2f04e1c4ce1b3a5ec9379bc62f02e17ac6fc9d83cc1eb2865f00c29138f5208779e623c77df1073fe4e03bc895fac11f4b4935fb93f445fae05859844c9bdd52c8f2818c9a1a1963720f4e889c3dbeb5b27ca21e1c6bf9e8e3cb83771e758707dfb2e5ae8aa1bd8317694d32e4628e52d6ece07f86f41ea705af8b591d3cc91c937a881dca07191d7c5f0fdb3c152ea25f73f03d8d76b8ff208df82507dfd2e2eac39c61b25271703a8e67728e0c0f9a2e3838bed59d34a5dfe05afe0fb7922b468b1b3c8bda5b31fba266ad0dbea7c674c694d7de2a3638e153c75a9664ad3fd6e06f0e21bd4f44ac9c5783373149d37fbe75cfa6c1f5a8a9534c8c2987221a5cb954a9d9c2bf5a8abe384319735c4aa92116861963b4de176620c7395c487a4dd66895a1080b9390b195ea08190f1e39f4e45e1355972fc8e0b5a95f888885f1c518fc286d3a9fedef14e1c343f8420c6ea7741d4c724fcde67e11862606993bf005184e8b1973103ecd79f08b2f7026b2355ab61a1d9b591b39a7cf99f482d71da592d4c4c58c1b7cd1054ff2b5cb854b45463e56adca63db701e15dc82671662ca2146f960bdf285165ce90d972e3177c9c64df8220b5e4c7b93580d356b1e58705cfeb455d3927bc95f5cc1938e0fe3ff245f58c18fa393d68cafef8e48155ccd418a091b53e5c8325458d4b66e5eebee55b44d7de3ce829984c9d1640a8e4a1e57498b78075f48c1cfb2d6a89cea35d47c904146191738c820a30c162ce18b28381d562873ef6c1fb58782976ce46e62f204276788293e4a9346744ef03d186d0fd2d5d4b9e78b26f869425f6887d9327c30a1ad0b5b97f80a0b9792efe8a116b20427edbf3aa6cbfce00b25f8eeb14990141eb66a4e12fcb035e4c3c6c57f982cc31748703b48962cd2225c4ce12f8ee0b94dd0f860ab4345fc85119c90a23d3ab79473ce413e05c5822f8a5075d7cbc64aa6588958d5799484cdc49c65436cf882085ee84d99ddf19dc4241211be1882973cc6345136ac2ae4bf0c16909171ac000227056388b1805ec01742b0244ff020a2c7903d667c1184bbcadce3db355ca5ebe4bd73ea0808d9ac46e8d4af267ef103352dd2abebec2233ab5dd3bf860d91d57e1fb859b36bc518930df8a2077e201f7dec1593c7aacb173c70fcabd2bdf6a6394fbfd8811f59423a59f1cb11db173a48ac63c335b2322ce3224db4b72df38b1cb8a1de2f3eae9828d97d8103a78324f1586d4a2a57376eb1865689a55474d59ca967895631b9791879dd1bb6703c5c8e31ccbcc71353376ae15b8c8b10df8e2c5ac70d5a38f9a256925b6d8c508301060f6eccc28fdeadadc205cff074df90853fb7d937397914b1fa462cbc9164d121e59fe9ef61e15f5bda089bec2ea668fc0aaf523e0d293629db55127075460cfe1670c3154eda4811f7b0e3462b8c6ad1aa13938e98e7a536345678d92b36c9a791378d29838c30388cab0adc58853f79a53afe94230dfeae80941186095630c60a56405860461866bc09ce877190a713c50d5578e9dbe7e253e23cceb080052e48859f3e458f4ad559de260f03325260a63750e1791c1dd779ce8cb2fbc629fc50b2a3d1508be621bd610a5fec52d88a991c13fe52b8d59d42064de906297ccf68295669d60a39e8821ba370f25d0e724b8a549abdbf210a272b4aaa7bc3f974e44628fc544b27ef9d92b8454c7003147e147ce342232b7dd8def884a7b2f92cc7c41c6b466e78c2e9f9d88d4ee4931e689ae67ed5500a6e706297bbceaeb62acb9a90ea28df7aac594dfa4a6e6cc28f551ea5c7329fe49726fcedd20cc16cb31b99f0c31c91ef36dcc0846f2184b58c35b192b715c0808c15a060051bb88457174246ccd239c30d4bd839b65fc118452be17ae451e87083126ece68dff3d34dc2fbf659c7b8210937ea53b8f5794c9f236f063722e1788e33f1e8422d3a8e0d6e40c2bbfc51df4d4fea20d6a68f70fe3e0e9529774ccf961b8e704e4342774a210d6e34c2ad08b973c458f2c99e1105c62dc20fcacbeed332ce60c10d45f849bbf379846d8f27cc8d21b89108b7a3cfe50d5b561261447c1962deec7c1dc2edce7cf2390a1d2e2543b8eee9a71ec275546a1c46a9136e14c2ff3092e74acde18216bc0b5ae028302fc6026e10e28ec1b55368ac987163108e5908cd18423e8b8a81168493d26415b5ff46207c4b6e29a67828b1c6bc32ce60c1dd0084d7da4166dfcca179d8100237fee0fd24cfe74166ced251fce05fcaaf51bc25544eec832bff91d2c71bd9617c37f8e068e71e0f32cca3f38e1b7bf023bf8e8ed98e1b7af0c3bce6c9e2c32da6fe461efcca20a341b286e4d0dcc08363913f8e37a6d364b937eee0a498917e3a6f07bfbffc53073b0eb1d364ccba41073f664d215434871af56fccc17f15cb51f6402d5d856fc8c1b3ec1fe683280f128337e2e0e414f992ab8cfaf476030e5e4c21db4b8a7c9d66fbc08d37783592ed3ffebfadd0bac1cd717cd21d5d42c6a50dde6a754c1d8b76830d968aac4447457648bd8aa96d750851dd35d61b6b70ae7e52bae4a106a72fdfc4ca173647471a7c7b8dc1a39985923c1a9c093241247458ff943378c12cbc57e71c4ed26670824f999ddc4719dc942b3ec57d3be8fa2083d721e42cc5e41f72f818833f97daa3d2d7ede6430c7eb84e7533f2110627fffcbc79eca0347a80c18de077d94304518b1d5ff0ba3a0533bffcded7e105ffa3d0a13f3cf0d0e8e8821f6694f5bf681b97830b9eb94b65d8589ef66fc1f1918e32e61c728e395a70b225f885e920eb62b2e065c9152c789243edf4ca21a7985cc1ef9463d3983a6bf6d40afe4de4c9d1a7e419c52a78b131e357c36b50910a7e76106345f4a6e09da7ac49fd72ea2852f026e5682b485970cfa2e0e7383ba414cbfa721414fcf7101f783cc1cf74611ddff44e702a45098f52fa26782147e4184d153d929e09dec76c8e616a2d5dc712bc943ffdbf42f7a65e09dec9948bf85852cb4982631a4473146c24f86b7fd16112abed8fe0ca8711e627aacdc746f03e32979accf8582e825bafd61dc6fc1ec725111ccf23f2d291835a7008de668f2b86905e720bc18b29e52e8f2d17d50b827f9e6a65cc629c66407024c71ee7b7fb4afd0ffcdc13620afdd183b97ce0b544c8e9816f61512ee483074eb5dd84d4f91db831739c5bc3d781d371645ddb86d69c1cf8e539e68e32e7060edc980fb25c0ed272ccdcc257d3f2b87c23f729b6705eddb5a254768e2db5f0e62fa57f18ebce675a78e95ae32ded2c1cb5f3348f6763bb2a0b6f3692496c32164e8a64cd07a38185973a550a3144e6155e988f66cb8397aa0f57f849f247f9c6d30a2756fa9c32327c3e58e17898a27be668f7f8b20a2f72e0f93d54e1e58999ca369d0ab762ccd162d9a8f02acab4848d72f2c1a770a2e3cd29fc8c7d4ce1fc67f478ed3b53524be16d47e9c53e2ef33149e1c797e93a626f0ead8dc24fa9c2984449fe5389c2cdd89c35ca580a1fa1f0838f37334d4d0e3f28fcb83a75ca1e87d07fc2394d1e686fae78c271c9818590233be1aba8faaffd86ac1e9cf063b7e8386a280feab1093723484c1e826c5aaf09af3d8e33aff68cc49c4cb8ea1dcbfdf548cf0713cee4bfb0da64111173092f726861dc3a77a48a25fcdbec90aa57b363520927663199f01452294209c77bd62dd6fbd7cf93f09268ba91ccab926149b8a1cf35246623e1a7c7867d9c2c4b6421e14525b77ce93c97451fe17998a33fee54399ea823dcde48fd219d8d70b3018db7a804cee4e2d15828188804c280280c0829f2362314080018401e8b452291581aaaba3e1400045b262038362220221c14121216128a44a15020100684c26030200c088502a1904808ade85407de25c0311b74c85744aa3c58b1d5158ce9e7a6c0634ab186c1f473211481443168cf2f9587d4b92fa547c4e4745239baed65beacc14b12d0d5302a26a8797cea2b5bc911af584bd35820a23bf32108ea300da470916a8c046138a8575392f3cf06d4fbfe86b568ae31434e218c35108e4004a79f8dee43f34e2280492d317c962c39f76fc6999d33d9003d9bcc4af01c3adbe2875014a99d3940a506e1cb4ab1b738f93bc3a9711290666d306462a0ac67a03f5189ed5ba5ee2721b453daa8441dfccc8dcad25d8f8bb9ac73089770c00e0babf38639293ee8908f2ea3e658d84a05fe83ad8edaddda900ce5b8ef0e49f45684c049e6975311674905413a341d4786a23e6ed35475102928f0f711fb58d5689cbd8775978eee0d5b7bab2ac04d99769eb00c9d7b906baaa5ca4eadd83ef8e623a50566c7845c0c671149e747a50910d007bce6f3b16ec695fa70c89476ccc9ae0385e5f7681c72913db8678a3b6923a50776584d556ddcd61bb5c21a6a5a82a4299ba897b7556b6a0595adfdf4d0aef51158da8209530c257fa8b0c8912f433ec25ab40abee6c6b7f43235334dc91738f07963345d43d4e91378bc713407d445bcbab9dcbea32c53a07f5226322acbb0cdc2e0a146654a3bc0e7611950009d133a8d1339a153edd40e9bf606f99a5b6ad8d8c2ba41b7ff02314585228ef7ef8579b9e2f392fd1c9a94431a1d6f34bec350841b6692a17234b46e27dd8e00745a222b04163150b1c3c3d5c052f370f0813d132d60a12b92325bf5a755faf1cec5e14d6be06a511255d07d9b8540fcfbb09eacc68b2770681df8ae2ce24e7764e28bc91a41f0598ab5ccf7cafd82b07a0662281a2d129197df06129151da7c4a802d444d8a4f07cee549e6a3528977e97a4334ea2fbb728015c75ea0b9e832ed3166f2390b1be26192d0c919a8a8090021b96c057a85b06e35b76567e21483710eb7cd509e83b939a7e6b12e53ba130b04cec57056858fd63e0ef72d948a7fc29983e0b05cc1aa4b0190d3be08e4b430c154b487a4c542a6832433fb429c639c6fe5218e83c085c2b25e04dd8974b3d0f23afdf1bbb0b3efcca1fef470fecdc2fb38b0e19021ee8b1f139bd5c07df8db15a06f99d4a0880f0736de5f824d5a41ed9bd589227360536aa31d93c1a59afc6e9ee2d07cedcb8c27ee35de40f86728c9eef8096630563daa0bc15dbe26b65df5b1264178087ed4d2591946fdfecffbd9331e0232c5c770532b4c294bd529265eebb0b500dab03b90c09df7dab0d143890d8a8229a4092446782dc36bead278dcf4e02effc6aaff4bf93cc39edde52be25165bddc510913f2420ecb4b4d6ab3a649813dc38e2fad83163ca35c7e37c7d8336cf21654897bf6e2e2375d13eccfe20147340871422189eac7469900b1bd5e1b4ded5bc921391ad94df12c96de29022f29a33e16ca9ce5820763cab56468baac54317e235f51522dde46bd770cac0d58f7b84c83c2a3457af7b34567f6e57807f98727377a03e7bc0960179f7767902a48632ed862688aa092a37bf07cebca1baf3a73a4effa826b821b217ddb7fdade0199388fa82ecd185459f79fbe093317db59803de5d1c9439c19dbfdfc09358d8b30fbde4960f0a06ccb8fd733d8550c0aeb8140199dbab2407ee9c0f61d17553812c62640a90c3d6482a38108d4a465ca2c979a87141dee6ff8ede982c89271651ab02507088fae332377fce7450f801104d4a1ed7c0eb3173781998570ea85112755e15b96bf8a97d738f12a2c9fcdfbc8db74efebffa14f980904786959c132b26d3ccccac375bb4a2fb230926fd03e54ad159877ed0f1fa0198c990bb7ca97c51bd596729683e840c422701acaf687166a2b0c30b9068a638b0f8826ee74e9a6baa4fe705eb8246f09f3cccc23b8f58b976d48611e71002a9376c68775799bc52a7cf8ca9618639e941c104c9079db0c53bbb043edfb419a8d140e8f83006ab3effe265943eee3662424967b0ecf1b977f511164e220555b7f0fd970492061b1430e88643d97325a5fb7fa6de3aa8692ab80286a96b9f7c295bc680e18b7586520412df5b7d06ea6b5c8076a9b430f046bb7001bfe01c284bb6425dc87ae0764102c2fc063a1f1c320569ba06d5a8f6afb6d5118a2c3bb26ee727bdf4037f5e76295441edb54712d078482a4f7fa5fd5437fd96bda143c8ff86191af441a8fd8c8f80629f810ddcb0acfdeb88454c08016877a32333d163102cbc14cdbedf0568e02c840d8b662b12569524ed47eda9bdccb4d530cacadf8b1da989365a71e8eb407091a2c42c0bf374ad20d814b8980753502fd32f1bfbdface079e8f8e280c122cf50871c7b0cb59c39bf4f0d1c97a869d40724b2a6f104c34ab9a90730a71444e2bf4de0bc5242dc0a566aeb043ff2a0f4c4e71810d8020d603bf08d5a5e1cb36343ce1ac775c8c67c128b3c11892ab22b6edb4883a6a5f4e87dc275c429e9fd821034fc0314183a66c58417d581d1eb72c8f1990e0902a91f714e1301e1faad802ad56c7891ae80008a6fb67fca098d8624f686d35fd7f5c24a3b19426f7f8fe32a84da98d15ce12f39f408074166da2c80b05a1dfbaeaadd13410c2d55db7906ee8ba715add240bb874e2553bce3b78d1d4709f3a9e70bd77b83ef4985cad23adc7e194e16637ce4de7760eb18b175b8f4b4f3269caf8fa89533845330f0c2617b3d47227ceeb48dd3ebc8f672682465104b1d3ee2d41a0cd449c3905d33121d370113f94d7769036336a3a55ba3ad6620ee518dfb183caf7814b051871e62f31dc604d8924290212a912b08563f42599fd143adf58922cc677e1987a107baa4b0aaf11e522039e070ecd8067c9a359ebbc2053a09351ee8532c69252e79e05baf49445d5a1cb908b78c0eea3d3ea6c2a600fe84589208ff69adf055804aa4e4c511ea39dd212c2c45e38e5d7754400424576cb31a0755dc961c5ee380800539d0034e53b56a3806495e9fc0c706f968c08214a899b4edb59caf7e1b08e9279c70ca080ae22adf1285f572767fbaa137e3a2fec4cdfc723ba4f47fe502eec41fc3e280f4b83fc4dbefcc71a8d1e37d8a6f8bfe4c7f2ce0c1519a8722b629b299272dd58d88e4169dfc4dda13b838bddf283796f77ed6135df5c4488a5ce06b6c86568bfeae67529893976596127889012ebb25eded1be8f877594aeff71ae611b7d2de1e6a916a1129139cf0053c3a54385d66c431b14a7f4c48f960682a8d6dc6a18a9382648b13b7e286fcc4823c20c3a08698a05b1fbff50d1bbff464e67ca96b1a9fc46a59f074388c265f608928d06e772946fdaf1f27dac579e873eb776a06f824c09e9d9cdceee23c6b7510433a104e27dc24ae95ecec771dd3235b3407d0129aa2bba5427e056b48f4894f144bfa8c36553c0889e5419f948503b4566c27aa519d9a4111cd5867658fd855c8d237e286fec481fc20b3a0839335614d9da3e4c47fd3e1c7bed636051c62bc7744b00b4410448ade251664a17fd521edb495f15da076031fa1b49da3a26464ca96383c0502db32a0b240d086811dda20386249fd998a334c742799d72997ea50d613e1d21439f2d276bc9f3c1c1dd727b99b163b58b08ae987f6e46f453fa96c0ba36653deee1fcf40f54157491d69538b088d28f271c5906c262c75915862a7725b0c892e117cf79626366b274d72078e08fe8161defdfc7b44838f81ee7db7684fc22b53a2cd04830103dd86be6c8fb7147c7ab76b29c719cb84a0a24c24cec5ad1d5cb6ee044aea8214b815791a64cc8524c98c358d67818c36ea874319a8fc8cd40ba26ce8061452bad81404eee7be798e2fa46179124ca22da404c690103e07aac78db4cd1c0d3424220cb3cd8eacbf5e89d0aa50bde8625f58d20d1299ce4fd0c4d983e14fc2b8b755ccecc9ef72ea3ee756c2bb7d438df4e42b8c9a7ddfd11c322c6b61c03326f2d03ec58f4a5d586be36ebd666c677851b2b1a8274a8c15765b6142e15d9a606e3da6029228c599a1b6341397d1f0dc196560531269567850f05152917c03eed0c08c3eaba84a65f76b82c904a321e1b923225b77bbd76148fd2055442916bd10ca4231729dd58e13e1adf0eb420708b77818a695e24345498daf710743b9fe6a1b5e69229bdbe113d8b3e1ffe427738dee4ed5c54fa7c17e5ed998b7b69dc6761263b9327bb00966e4e5fd3bec295389ff63c759e8d45a8b138b8cd70bc841245b19a022f46f0c9dc6c9425bb82f5912d0e262e04c703081ede1c1685193513303add3b4921d4f181f7a9fe6be8017e22c130d132d25bf4a6cbada32b5304916641c449c319084ea41a7ea7656b3c1558d962331ab307243d36c774c4b0864524b256eb10e4ccffdb2473d19c5a82a1ce5369dc1c3b059235d35b7404abd76d5c5848d95e5528619dbdd95802b4729509ba049ecb398cea580a6e2e42a47a3ce68b264c1622649fccfb864ab3195e66f87a7c82e8f9fdf175078295ff88d60628ffdc33662b74ea5368342d12326ecfc1c5f938c6e02b95a1d5cfa31a30cce696f9624918b7b7c12f763c8ade9f14140337eb7bbbeac5ffce178f7f66312cbaecde92da6f4b111cef5534675de1481835df7baf2665655045fb281ebc33316674a9286eb8b99abf63bc7e4310b768545f19c498ea8bd47100ed574a39a85339b72a87dd0cb4c5d0fd8e5fd1236d26244f8148b397988a4b5c3af8ef4764a35379aad33a9da8f2ca6d9905b5271e35aeb27c9b9fd81cb8ad9bc4f7ee29e45aafac624cd2910a5a6c9d3540566915542a54d51c9eb46d7a1b2666db77ea54c635b1e96c690e1a124e5c016dd93b7766e9d5323a56e48d1297a778761b7f9d82fe52665278e1f36d57f868bb3659c76874127ae4b7097faaa24ce015371102b55f1d13dc491c723628f26dafa1a8b0a84d8aa68152394b8909b93e7e9d0a0b7dfbe78e9c02c32a752feeb3c9793be380d6e2c709337f5aea24135281a7a6319402717a2118a470ae0e61f81df989009b1238b83709734efc55e1c55718f7fe0e9bd9c643e9c6caafbcb3d5b5c46b682240591f42a379e2cbd2746682e7be77fd765586a5ab04fdc23939acb66f8f9ba56de8ec9bdc6fc7c863f12891336f14f31fc3e0fcdc0d1d3a49783c40d724ad9af6521d6fb0b0ce4e37b4d653d5826788bc315a8cbd1ec830ce57c53c551bc24ca91d15bc2a208f9ef43312b65b76d52e829e8578cce4a745a3324ec6949818e24f1a72b889da8c8c20a08ad1d30411a6754ed48b06c99b7954afad7f91bed2e29e3fa345051b9775686bc64b16544c529eecee6bc6e2cd03c4419e325775c87be91ff671de6ed43db43f123fce3bbcd3860aaaa6db994c48ec19d1dc28172b2905a0b2ab4f8895c6e2385538347783e3ab84d2f978528a7f224bdd77c0bc39a918cd81f21c44f6841122fce852441d670397dab659e71506017b3b35dcc6c1aad92a9d8063e91d4a03410e9dc723c21850b9409612fc51fdf107eb8a4610981bc466ca9bbf7599d8b4032d68f65a3bc3c7c35ac0409bd10f4cb07d60041ece35dfb81b2672ad0d0e5ab89beacc1d73326e0aa4896f6509700dabf20e12eb137f75fe6620d7450a968cc597fa83ca39af250812302eb700480961a7015042f9a665cf81c15a52ab0a5e95ee2f6a02deb2926e024da4e75512231337a9b9f0f7ec9b23f3ee5a18afc13d1488dc38af28f055e7908d8c6579241d108b194a07cdd59623ab6e342f288deb70a7ebfc6c5c14ea46441731886464c35c21fd1b787e2dc764b4c08eb6c786f540ae3dfa254252958ea87cb9fb9bfadb94fb1c7e06f7bc0f3509895808fed4f4ee6b069287a53f2618c24d5a5e7710a9e0a49b3c5e1cca7127487d57ba4942c8b2316a0a6533c957894dbeaacaa87fdc66710a5f5499189474fe75ab1feb7b75373ea4004c33a71be705cf9b267c564efa503db36979e0650a13c30d86dd495e0820e7c63a8858361253c496d4d15f54f9e1e840169d4c43e120e79245d18d0f21259f8a118116419a61417d790714f954311d88734274f12b58dc584a35454582c096c989e4f83c8b0b6a5079ebe782497084814d8da2b9f4a471938817e84665d4b044ad8c31ca4a135f8379d14718c8027f45a81a6bfc3c482bfa262716686433f5077822ce4d9d6f4f6506850649f8278803efd3f35ce395d3320dbcafce5f6d810c749b2e5cf0ce13294feae3a194ff64325e02d7002921195e101b449de49b70e79563e03c89a7b2a6ffb5ab3684dc1c5639c4165d22cd7e8ca77c5f903e57a26833d77e2053da22bf7eb5810b1960141751b73b63096a21f45c95445f4ee36098344911fecffecef8392b3d555aa2cfc74b5a335857137ed36b34c1945c55980e870936509c536199ca7e6efdd50de1744269cef330ad3b540f8b0380bfc57765b84febb15f993fae4300870c6a61a4287afed32683e63ff89886db275297bca9e9da6f937b09a6cbcc231339243e36f5f55f7c18a25a8584709e28554b5ab584da7f471e67c0d6fc7c0eedcfd435dfe05d23b926e509aa5078abb49093ff82bb2e641e9997facf76b3d05684b756854400674780247a3c2e220869f1d51e6b56d58ce84662c7455ad58f3a2654b46e53280dfe19a5e688629087a76cc82f1d224f1f15cfbebad9a3a852cc4523e21be7286e9eecdf2a31016e63e8c4cb43bb7418feda9c4892a0c5243897e11042408ddc5d36466299b114e1faa9ef3f449fe956ab66e7d7f3b8465c18d27cd036a421262914d6459d285a13d0d1f07d5a1d6dbc93c49b6b79c626e41bfc83ec50a5720d348139201621a3f0162fecac94360140a22506f66386ce222d762e091935539f94c967886f60851ad6401b9330e65821b97dd48e0d081113b40a6ba08fd3bc56893801240f52d6ea0683628262adc8183ac22369c0ced82579d548689dcd051a1183f5d8d5d42965263619245fb4ce467855d57d2c76af3a294e21307739282f18e096fc5d52d1a8e72ae4f63fe518906a5b67cbaf9bb1dac29b04a0cae02fced56e3373f46bccefd03c1a47fc9613583fdec791661b49e862bd9f5b2d8ce07f292c3b33feea141a75bb2104d3074009df3eee3524254b11cebb0015e894421960056d335b1579594e862ca301653c62b18fd31f8b7f109d0ce203b90f833cc5408df34bea5768de4b46ea03fa1e95a6669bbaa48424e926cd55665c5064c72a0aa01e919179d8201b945d7e694bf9f83651f88b43a438e9bf21e7d809bea5a40ad11898b80396efd5ca3b86821cb29bb067ffca13711810f044d17f01ca6e0ade7d70fb3a42398f48089ef6749c16863c7d252f0192d5e501b3c464898c05ce9ce13834a924d99c647168ade7c615208d4bbdeac412351d7cce724f84a23209d01e11598321ca821eca0402173be7e0f6b9fabf1b41d849e4a84e3d86c1aedb88a87f1602da4ffc05f348bbb467ef673b235527384273b457a2bb49f535097963ccd16a5cf6bd271a24caac9ed47f1f4af233c049e2d35e7058c9cf68733bd9ae336d53002840149379089266b128833e7452934d9c2ce9843b4a1e0662d09c8f3bd343a45b664acae3ee202c896400e5df52c8e2df486bb1e21322c73567b8fdf4a89cad58ba8bb65c236dc757459554cdac33133e3342be02428fedb387bcb0c0823db3655375403755920a930f8032ffb1649fa31baa8e082cea4dea1b4bd79de04bd3e982a4a8b8c69d48f9faf292c4d8d0fee1244efc44114c803621adcefe47c98987af4a0e03da87c426fbc3b2b6dc3d7f57134748fe554aad3309d861476466d48f7d7836f1132ca9b839a96e84eb60b2f223ba6cfd6dfdb86deb1d2c354d670318e08f10f8c691405c5fd61aa70417bd8d380de6b1c6b3208432a41f9db626f8e263bee521401e31346d7d84946f3c86e093ea197886bec3cbf1dbae54c0e2b8e40a1960b901544463ee39a5778464ac9c86e4f8cb1039cbc91de7c6b461238936aa1fba3d316bcc6c85606e176a93b6375f750044603d2031083bb18060c73fd2edec0b593bef0b8c7fe82a55c8676c8410506c2197fac425963f370954bae0637ae5e2398547b6352a255f97abdc9a1b89a4276c83fb00f356f5e8eb63a9afe8c216b6a352b0aacc6a9aff54a0ebb94a4e25b792034aba39ab6fe500bdd3d9edec91bbf06beb120d1af6e626d4cd300ab88b87031c37f7c50db732b2f5eda3d3301bc94bcf4c20709f42b8bd6539ef983bb4a6f4938c58f9786125e987401d413d39660d98700d4d505e183bfa3e1472b212c5e5a8e254dd3e377204275287ae1020f484d887047ffed78e200008cc2938dca14e04bc22bebaefa45df79991629093f09cb6300233d5aaf8787a408e90c7f3043be2468d32b3b1266d01472e9be23426975347fd450dbe7f81d63644a8379fa8d3df921ef11852f27dca304afd6adcb95dbe33efcc026e66ba8f86ca54a9b359c2280ffd609d4575886710d711f13b389d0feef48cced3f4554570fdce011dd8ee08819e7498f0e12ae8268348384d35c3873b4b4f26d4304e9f36894846a7b6684bd7fd53b28a6390c4d33de2b5ea1c3d738ac0c78665b0e6cc481f6eb4fb0a8ddfc281fe21d6120e2a40c41b552f56e8a4b08e3793f857afec1b4474461802d62f2d2d0e8479b18ec8d4dc276cc2ccd4b6bc9717803f6923a78bbfba4c50c6b8888f9ed612e28a97a8c60f7e3a5e872912c63022889de6187f8aa741ef1cecf4a3458bc2eb127e096122080caab9c75ab42c4a2bcc1c49e7a83327df2c4553699c157cfd1434b4110b8ed4574bf5172af274acc9bbc079784a5bf9d608e5e22e47c34a48b536a038698dc49df401c1ba36416b43ac18c0f988190a036f689218bca737dced5073067a3b70da3d0e0586372123a43fe74113c35d606bda493e2a6f31136ed76389619a8feb316ebc45d2b85c03a38083beb1dcb468b82ce269fd67dca62b66d1ccc762ade23bb8f0e9cdc41bc3a078c3b909eaf7e28fbfa1e02f821e0a368977fc74b2cda45a8dee60b0cf5ea8ab0e887d31f23d56c53b7e2f23c3f3bdd8de56cfc8529016f9da2932efd99b89587332fb260f5ceb1bc2071df4c695e7159cc118f4e09e820202a517db5303ef23417f2f5891ad1c3a053a0b72073dbdf3a85cffaf4f5c189a66b30260a0542d059a77c00ecb105d9e538203d485863ca4217b1bcca33247101fca7a4161b02700a37f7dfc0363c3b601cf302175460a187d5e67b2304a214808896ee3c4e22f9126af05fad51bd0ca5336993ca85b0e2be555c3e7f6ed43b4973301ea83131d6e742da3255bcb5206d89baf8354791a4a55a4e6ac775575493526aba379f33584247b5950e5b1a4d7db92e754634e587adbe6978f154038414ee03af7ca1155862065e3114d1ce69fdf75a675d29637d08e5d67879f9e82537c8a9dca970b7bfee8c3e7e446f0d8d4586ccd73c431f0f3b4a79b8dea9330d118071bfae830586b10f249593742d3383529d76946dc1c400ce95d313492d9bf99bbba6dd090db51895f7652136b595f43ea0e43d6cbbe6d1b8b71e28e4bf320954bd5dc5821b9bce3fa695278ecde63a952ee04043a35164782108d622838603b3e0590f8b12203e55c60f85e24dc4cbd3dc831a7bd8b06dd2b51b91b79e09ed6cbfdca99ec554f97c104c98939ccc4625f631cb586b5a8f4ebdf53f46c0983bdc2a9c5a756c3cf90e20c300a9b0bf7c77eef9024065b1c15b5009e37699f91aa4b5a791c266f5975a4d91c132139e8738510ca0d111ad0087ed611ef36cead1458f11c0821415cbcd9031c8b778bc71dac43aedea97c08bb0388ac968a9e8030b822d33916594fe0c30b8e83b294630ddbfb15747cfd7ca2b5e85e3ad231cccc081ce6c6b9edafc37822b8e974e7ac93523621193427bea933a1b5e57643ae5038d53050d886da0fef5c9dff043dd22eeaa355efeb0258c8314f1ebdb0d1f707850fe3faaa617680ea63889e519a505ea84168dd8a7a2279fdbe3b5139d06e28ed6a978f88704535a63d5b51502543b3a1bea1aba190a16f4b2bf64c2704fd377bf0a12b9d124dcbb432d64b689985467e211754009a1eb1c2a8da835eb753de580771cc82aca97ae1356b6d4d11c692814b3e107b415e631fac31b706a280d04f73fc05d26fb2584bf159355982b89a8c760bd7cdd643c1112c0d5cfff6f38c4f83ac0e71b070a2ec70c7a6506c6924563b655d870c884b33300d3a3100ed91315dc7c692f128a6cf98b3104fba1549322f9fe2724144176d151016949885a65868551b566ea02111255ffa8764a0d2fa93e485ae260d08f3a4f1caa0183a2eab995151584e5c7d1c5127962fcd7a48c206689a73c8a34093a0910010411d03689840edf0ed801fe293e5b079988eb9c45fe22f715c62525d832d97293f91624e7c0e7a0023ea88f13695b721f7dfccea416e0291dea628360b5046b49a24fe328089f10e852ea72202f4cf254c8d949470230fae4607fd9a6df2c1f00443a6a9ee2a9d5804007c033572b5d98fe7309f0b319902c1b978a937f68ea58c4c5266be40f9c0d32539b9625c509658b4719775dbd0b1914a12afe353ca5a4a5a0a992602c94b9855babedf8f93b78ed0a71b1d8674ae340d625cf81693409fce7bcab989441bc08a62db7f5577c03ff31b2e9681380f3cc2a0d1b9d9753a145f731c77a22dda93b13521f37aa4b57f5927ae183cbaf1514a04685a8e0e1be96c58d194b3d4ed1fc62613c302f422a791dbcf30860cc9b6d618aa8bc931ac6a2dc8e7e5f9f810eb99aa29c06c18a9f295488d53f4d28bb6eb7114d794e98517b22ca5512ab5f1cb1d8372951b0657062f6bd0802aafe49d9e6478ee075a0ad17a25a65bc192fad75f3e1d516b5180b79935ec822bc53d4002cf475d446b1c96c9a550ca217b67170525eaefd632d4b6e06d4bc32200b0dc843261e8a810dd2f84fcbdd6c75b8e827873fdf52e05addd4dd02b54ddc938f7028b835738b4a384d2b6c89825fbdf8b4e3d8d69380cad3be38532b48f38341a9d505eaaaed2c7fd110498178633006f849b75e2e09e9dd5c1eac5a32077036b76b2f1bf748558af3fb096d00fa9fb93a6e438d17a8c3b4cdc65948bf8742e20287dd51ce7c1dbf48c4b45a3b9d028fd7bd2479be6b1734c8e0391160103b52651995bea8314d79553dbb3a843768f93a023a67ed34864fa74328538b18df5d8f0e4a3102bd139eae288221c0a733c5c5b9b31e28ebd63a6c0da0c12eb78720bf7269b710806665ca593df07be435c9bc99596f1960a1e4ba5652caf01e45de9602d63e6ed0e2c21268c27c7c437a36b9556b1d9f236b3ebf6feefa1a8c7fb9f65268ea8a0d2f9333439e406994734b73a3b9b555a88ae4a0aeb255e098283359ff8a2295dd969a34b498a16896a1575ffe687e7331afa01906ac7a197cc2970a87cdd96525fba4bdd3137f5fbef31d764b0ad67cac2961db830c0c063935e725d6c1d3e2fbccf24d8dabf85bafb0659e4496bbe057ea4ecb3df0fa7e08111bb5a5a237b8fd8b76b2fc013fb87f30f0fba81e747f03edface72d03beb84327c0db7ebcc003c5dbf70eba9edea01db5cd9f9e9a8dffbd0d22f413d3f56ef346211615cd2e1045672cf61f74fcb43f2ca01779480767cc244cd9cdf5c75c70246f1162e7c276794d8a0374f1cc198f8ca56555192c443b3b11a6e0029332310684970532b2a55969675b6bc72c2a6a5c0f9fd3bd63af451e44ec087e1189a77047a2a37cd4bf9bb5b268ecbefd57a4a4c626f4902fc12be88546a9107469a3b689ca64ac6af9de45efa1350d62883c536577224f8d7dfac04b35d8f29d1550b447986935b4987ec5f81893704f852a9aa7f2b7d35ea6fcb003cc739b627f567ddc47f3b03a6188d1f94222dd5ee1819aabcd2b472c28dbc3eb8577e33e58ae4aa36d5581e6b622d60958037979469622482a21ff5bf7446860abec1230dd3b74be3ff614db67b0b82aaf7cfd5af19a9455527987bb2fac40fd495914918b748b2ed2411c90ee52d97b5aa5bee77d96ea2140ab9763bf55a5fcebf99299cf4a36a20792bf16cce440ec08251b71a6663b30bd83de86353dc4cb7314b66fca846c5ca14cff18afd1590b71392e47aadb5482f09a22ddd80184e4d6cdc5e5ac5f52f3a5957e9a5592852b9a0582886df194607479b6bdabf7ecbe0d47463cd2636f49c12438eea0166909b5030a5f2cb26fef8ab24551157ee53b55c43e879481fab2c89497b9b9eb639a76b2b4d81773d5a3d6aa7c441b8564adc41605b16a206db6d408234386cc6e353da09831e3987a81147ac59e7c1973a536b67b12360611aaf06c9abced02486e052bf10870ee5998b9bacce2002071b082371df6a8041e897327b4e4a0322c6f09dde51293f30055cf5ee22426ebd2e7f6678edd71fbcefa1e2c13c301b03f6a41563a559b5200cbdc0bd0eb14e0fbefacc47287153624a910d4062d83d78ba8d4150f354a1612b17068d8d1e039cd6875a16b579b47301715acafca4e8685528b85e577161d941ba9a17c2afa2cf7948d30c7ec3a44002b3ee372b1afaa01193e9d021be822ce71c6908e331d1c98b205eb0b979694581ff96899e0059ff9ec0a93d44e55c155c0d620a5da3eb544d8089ee3bf2e399faa7fe00667f46879190430385f260f3a7af9e50fb338f8da48e741636dacff56dd2bf9a4f7edbeb2f82d13e071d6cf613945ae68b4618d8e2282a6819d8a9715807ea5fd6218749140621725017c18493daf402e1b400fb8959dba7dd0d119371db934af398b5102fb9ed5417a629d1c6863bac178550b3ba167d2b837b5b029c05f07be45589046aaba28fb5eb98e00c7df0b217fa24928f4eb85ae55ceaf280d11d6ee691db7753eeb7a5650ab120ae8e8bbddae3a3e5e1babd13a5b79dead1d77beb4ef43375a16f3aaeb2a5777693847b590dc7ec648ef90d32a9e72828b54ccf43825de753d9fcde372eabcaffefd5d3ddea1b8e21e569753636a8f4a532bea80ca50f7d41369450a10fcda188998651addd1145b15263fc0f1982326563f396f75d8e20d8c9dfe3d36513c77f91157555d97da82fb0e596847a9030758e7df09cddde796b3ae89b4eacbb09c33dfaf6b6af93aa34364651a2ce5196f173cef9eb16f125a527f0bcd0e98b877ee1234a45647bb9a94cf8d38c619e5db3f92ae33670a90904e65e9bba850b5287fcc62c28a3f20febf1f02995d1a4ad1207359171d1c8a9974c30102838a9e749970684613b8be8d254d27830e85605a4b05527eba04d44958132ab10433d91420115d572797be3a787647d5c535ae13db3661d6f4836b9076912e0742381d87bd5eaa73dbbc577b2cc702f26e89da6b24cfc6db2eef26adb963bd2d1e61208b9106628dd013612925b50ce1489d6316c057ace4cf4a48a929b4c1f1c2720888f63ffcf4442247943569c4814b61a7a4ee6e50d056574df2192f9e759dd851592c024633c9980b5ca506f3919acac5c2b9ad304c732b1963e7b341dfaa05bb570e39c144a61864dc5711746483ae3d6ded929a823e2ead0a4ce088578dd54b787cab33a12c1a77dcee3b522eb0b2c310fa9fa7c466fd18fd4cd6682f93afc7038075faee02b166b1b748b058db8b955c74f2a1cea35c645bc5c4bd0395fe6b2802b9f8791a0e474248474cdf98eda3ea2a26d65090c43ddb04e5eb906ab14c365115fbd120544c50279daa98c82db58616760d58ca426e10c3e84b64288e5b8246223e8725795771c4f4ced3ec7e212d42f4e3d0f68e65cc7847586fa7176268d294e8fe5eb7c1ed87e9be2aa7faba9f8892035d2ce3f7b3bdeea61c673198cb89a620e269d11142bbf4d1524ecf39f2e4b2c633bb0e1cc5a61e16961b72ee3afff796d90a6ca9e6191353bc2ca2d75cebaa0ff5c855b1da2900df2fda4af9c83b888ad0e313d2161c0413042f370d2ea7f7092523f85c0fb33d6e801027171f4eeafd82dbfc92efd320c287f0ea0d13017ab121473750b224c301c33f3f3f3f3f3f3f3fffa8692d69b5b55640a45999a4243314ce0ed714a494644a29251545dd41b2b7875b002e0c23bc606d3e043c045104c523b230ea64e2f9855774a1bd33446261d8f7ae6471f353dd0b166695faff2bcc26bbecb58e922b4ce15f59f0bacbea31a483482b8c99b29ffa4c4cd6e8b0c21c45bcfe5514465661565d9deb96c2bbf61a5185a68223a830faaad3af841032a274b0029153183dbd7486f2ba78f1731c8898c2944c9dbadf336d5167197c6078d0f89011f241835258763aab7a714333ef2bcaa99097a6934ba943e36580886183496178a59d578573a153374e88477a20320ae3abccf6af6a414e181e211f61d800118531757ee9242bba44da9150989347a12f5fed5ec92f4161ce73daedebae53fadc274cf1ee4f46778df00e79c2a46deef34d5f0542a413e6fc613ae31e2edfaa396116a3164f958a37619432bef42fe9ad2b170d229a30ab2056e5ab8a15b17c2413114c64c725d212d77d14f35268ad948e54627977f7e223db4dec0825ae6312d7819230baf49c95b02054cb133512978ba977a5dc9e5eba83bfcc55239030d7ea99365591b64ac57c84e1dc472a55967516af76845929579d2bfb836857d110698451fe438c289d75d276618429ebfca46b0b31b208839639295676922375c98288223a1ff1d9c48768d3092289487737c6d25e4e75313b820853fc686f59e9fdd5e1d58730bcf8f03efbf95b7d94218ca1b5dd8812b69565a810661d2d49f1f2262221ccfdb9c7654b31e2204c23b45fb7948f280853742507c21c3aae1063ae856deb110161f44afa3a2ac3723221fec158f2548ab75311fd60962fa3772f85d80773cbef5b1277a35d4b21f2c1d82f4f9ffef0bf7bf1c81e4c962dcae90f97e4bc54d183c93d47c90f4a563c1d27e6c1e4ad82bebe7796e11dc48371d4b3e5cddc4e091dbc8349df64976807730ce5fa51eb2cb10e46252ad74773c988d0c1f0298da5152b96c147a3060d0f908f3d431244e660da96b7113fb197f7a21ccc9d2bc57b8a2f8c83397bb7b6e787f8d339897058b40a5aebcfb5147c837133fbe64f28b1e3522c2ae2865c7a4a42e997ae1bb6e1ac2acfd5581ef15db1c1e47272e777c7bc5f8351a5b73bf7bad5f2d56a30befda7d95fd55715846930091d5e85f816d9ed190da658a74de56aa9ea757a06c6335b44eb452cb9beb97a9442673d9ac13822e582181d54b610298339e8afacb30955f355d12c44c8603c172f94fed62e79b931985dab9da60e2a42fb1b118349aba82e2af34f2f7a56211206a39fd2ff2f4bc52fdd296030a8a855e98ede0f2b622944be60ee98723aa7bdd668ad8817cc5297526a55ecafd4978d74c1349fb3a3d8bc254fd108170cfedd2e43ceeb3ea17b44b6609627e4847ecbead26d695ac04816cc9ef7355ce675695f61013b6410b982b13643bf7da758337f0670f110b18229ab0911d352c357a43052058312a62d8a14ca0d64840ae69679ff51db721cf9770722533097cacb3b26f7b0710712918259961af91cc50f39e9230c04b91744a260fcec12ea1f364d5e1c8182f1e4bce992f97bf2ef1b224f309c12526f9532f5b97509f164e22e0b9f5dd92e7a1a1fddeefdf6235509268c1dbe4a8dee65f1a6de417209c3287dd9d20795d254ce9458c2b42a6fcab2eeced9534925cc59b6a2fcdcfe3df45220a184b1ebf2deab49259330ff2b151542780b3917488b40220993daae887de56fd8c01348226190afa232b5fecf9087a271542081445aee7cbacc6e924718efb390235f8915ba7d481cc1eb9c6b54ec4e069fa411d7216184b19536294d564402c922248a409424e278312f3b970b971009220c9636a529f5f2a274d6210c9552ae1c93bd210caec385a595a74218e4b928add9b7625e228439a9ea3cae957a1046e921ae26a599a9930bc298af6bae6fbf4b287120cca7ae9f84563f204ce9a268ad44a8fcc1f441d6b4b3455915f283315e79f2532ea4d87dfb70d0944afbc92cf960b82852be07a3ae24636749bf48b9ebc15c1b5fe2bd57491e0cfefe2d9a1ef55beb588287b2ca9e767e968c67fd9cd75c32d8f80ea6d83d72dea5155be7edd0293b351f97d37530b95659940ed9d2c19cfb54cceed072a7a57330997dd0ed621f0e2472300891a71ec5e8f8a37212247130bb0a32be7e71c5ac8e040ea62865fd25b95bf206a334535afdee05a1a2921b0c7641ac78adf9594124694305246c30fd47a53d4ea51c44bf06b34eb184504953987a971acc2a8991ae32326568531acca375be86ecec24f64183e99552ae5e55980baa936730e78607a1e3c5b77f6e06939251ef39c98ba2ba2c834935b5d6d8b6300c2464304a57af6b3a6a25fec231984709bdf2fea55652480c4653b31fbf39255f7b188c16f3846ec99bf7457f200183418a08b515ab3d2e5710bf60d84a5a083b9de597e205e3a6aa0be3a63c82a40be63fd9b236f32a6787122e98ecb4abd83115462921f781640bc673a5d4b378fbbc1e2d18bd3d25d1d15cddbb9405e3e6564ee5aecad3c8cb0e245830fe8f9748905cc1e06a955499dade2fa8680e24563078bae75e5541d89dde0149150ca79438e977daefb5621e48a860ded4fa63c9f2345a79922918b3db4c8ea6087d158463600f245230fac7d6d4d21f54580e8d0f303e6e8c401205b386ea2cab53adfae40b4102854eb5644ce52e5c924f4aa97bed4a5525834ff284eb9038c1a0845c91f292fcdc6a499a6098d55a793115a2bc9430c13ce63ba755ccffd859827174e69abaa7bf8a1f259883d0d25fedeb4930c8ced183f4fc22c1f0d16f4cf4642b901cc1ac7a3dc5be20a4da9a8d60d8d1f13a77880f252a453088cfce2acea9209010c1fca7a23335fdc3e7970cc1d1d478cbb5da15fc5ba40999953c8f1e9008c1bc5a3ae50b4a9220187f3d7756ffa3432aa10408a613e1fbb65bd9e4fe3f3099e5f7af3bd507d7813290f4c03052bddaaf4bf2e93d090f0cfa62be2b53df4172615e75d471890e8c2a6b8b4c177371ab8fe4c2b4522a21846835e1591cc185b35e9645de2d7db730fb8bcecb7a5fc8b9245b1885bb0ccfa6a21811d5c230dee9430b8390adcb69379a85e9b4c347d103a64f295c14e2d213441874f6962af37b3c4765720883a95a77bf57e14cca2686300a2d42748adbd61dd449214c2aaeb930178d8f1969810921cca774ef44c47e504162801c072683b83dacb42cf2b46e197c280873d84da983a7f59c931a04934098fb343bc52e55213b450313401845d6bf92e7f273cc2a838f3330f983b15fe94c3152c8e74b0229e503133ffcdab7f7a3af3fea1c61d287091f700f3bd1834ef260ba64f1a49dbadcca2e37426c4cf05090d50adf257366e64a755da7543d2e197c323828e8e800a1c1e40ee691e2b95babcba23e696207d3fb2ab9e43a175b85933a201d700ed7319183d943878fb5e952bcee3898f644fa856f3d1ccceeda65a99454c7d64dde30718351099d35731796d49293365c071bcc51ed968afa7ba4bdd793355c871aae639206a3cfc570a9c338418339e5fda50a42278fa29a9cc1a094978d1ef398e1bc3896cc2b6dba87788b5a55eeafa4ebb8190e26653009f912a6b75adcb936218329b9e77f0c261d1d7d46485da9c4440c8691e7afe6cf0e8329c713272ee9285ea8dc212660307d168f429e8aeb79f505e35f56eff4d525abf68229e8177e9edf35e982b16b4bc7ace76b7870c205f389b8a877b43cb4306dc19862b25a51a7d1ad822e9868c1b0a29d1bba4fb26010997246efbc64feac31c182c176fcc28fc9cf98d5150c73dbcae5cddcad7e6f9435b182c19312d2c5e8a8273d5c05a312e63de3ae9d50c164a3b7af4a4e6b2d7d0a86fdced962983991c25e77fb96728e85ad31771205e388dc8f2b2b6a8ada5030bec828efd5d1271885472de555c8264e3087155a57d6efe84aa89b601aa13fd63bc7b8453513ccbdf1e23c9b32274b306a9cabe0299c52aae399132578765aca5c4d5b993049824986d79aca1fe54488264830a8d4aaa7a65345c7d3e408e61c3b1dcc89118cfa6db4aa8a56118ce5f1b267538fccf310c1b4953d4449570fc16072d5a513effefd2913215c87092641c8b4cef669f304082898fce004131f24c260d2031b63c2839cec60a20393be6e6f8ddc97d04e2e4c958b1f5c18e3e5a7a79b974b5a7d0ba3ecf9c7ca2d17d7d91686cf612e46436b955db316aa5854cba5733762592c57b4efec5ac8486d91d0c25c2f2bac8e98329764162655f2fb71f585dd306561d422a793c4c218aba269d97161618e5952f6dec4c87095cc57983fa48aa6b42bed5eaf7485d1354544e9746d70e3c528c11241d20af38ec719a1fccf6485b1939217e3aae5ac12e72a4c39cdd9797c07d9e0842008125598de84cad4d94b5b9a325361101d477d88caf7dc9a2b418539b5755a1d462ce7739d203985f1947819cab4ac0a264b4c611a6dfda85e7b0e2b35cc52986fa53a73ffdeecf42129cc23568a123b634ad35124536bad6355982b43220ac368d7612245f8e814c9e09384e2b497b3709381822fcf1fed7f7ecc0d98a001cd06c9270c3a07b9d51c75e2e743e341f0338e085a8c3b26483c21e90472c2f02eaa5c980795c47dc9260c4aaeb614d74a4bfd5e13e69cf3d44e8b5d052135f82f6880f101620008807c21c68c04400000207f438c90f3cb230111e8e201695fd87d9168187140c43a923b8e0103f0c206e80b0474110222860904e0c58371c40083c609c3000000b9f1490c55e3868d038400e4c3c641801757e8c28b2ebae802005f74022ed0050808ea1000004ec8511d03f0e2841c55e3464701ba08c0020e70e33d64904e0888874702baf0420105480f037084c1c60c301480e30bf91112860c90e3e171000e2fd8c046ea42c883ccf81904e0e08259eed7552a21e585f5b66018a1a3445d9f5a30abafae3c71c6cfe0193f230b46bb983ad665031b69c6cf28337ec67260213f42c6f85057c88f10556386181e1e07e0b082b92ddb89c8ea20a5ae6570e3898137e36f788cf1a13cd4dfe0238cf391de06885f088d8f04a1f11172834f042cf028014715f223e4860c90303c3c0ec041856e64546d9a011280a0018ce0984216d44b2ca58bb1b9dee569455cde4f54455d0ac64aea95f210ad725d98230ac63b29b2ba17941c5030aaa4252f8cffaebb8bc6098304af6a88a05fd5a0a1c9f1046385cf6f5a65f5964ac6e184e635f6335d37d456f7e4688259b44811afb4e8ec9d87d80003617030c1f0297e0b359f3c845ec9e05b1f32401cc4460d0f9b00c7124cabc48e7afc10b97a75e78543096c96ede7c9ced86aad65b936389260fe16c272f8b6911e320e2498b4353ca6962ab84a4d069f87a271c238983ae03882416aa9edf7f5a8cbbe1f7a34388c600ea6c266671d2a67b17a8e22183e9e2a53a6ddb5f411e48411030e2218f69594974e5f70d1460d1b89388660bc943374501697c1977e0ce71082516d952a75ba5ee9d7ab1b23e0088241eace925dcfe031bd0ac8c001847472edbbda4d3f06c80fcc25a597ec3eb542c88f72f8c07c26ecb51a1c3d30e9ca9aa3aac46af9673f387860ca49c87e8efb924aaf346acc985123e5dde0d881e957e3b3c38d6ec8732f844307660d6d3a2a6eed990ad508114147c75dc945c1c5dec2b4162e4b137d9ad8e28ae5eaa12297ecc5927a145feac5a7816e6346dac0a416a65842bca82cb6f383162d8ca6574d87536aaab26a1606d319a9d47bf6071359642c1216f80a934a325a5b7e76cbca7185b97729eea515e6fc41a9b6545177bdabc1d3d80ed0e80018373e0489373ee4a305135618b43e19aac2c8f29c421498acc2744abed2ec285598cf946987d1a734950aa38e9dd4fc6f74cbd1a3c2786b265b6b5b3454ea14a6fc79c4659fd1e61a9bc2acb9aae3eb7ce523af0c3e2b85296ee7755bdb24302185b9b2966779c56a7a544e4661fe58426ef8b628ad6247c70d26a230cdba8c1b393a90f326f8df4047c70c8fff35098559e8cb7ab070724fb4d64e4061b44fafd3649d1a4bf14f205fa8a7d1796d434f14c58951ae63e284a79de08441685678d1966e4239cb1916cfe5b279aaabf739d18469fba396daf339c984e1725e78ad3b880983ce2a5cdb681da4aa6e7209f4e63645dd35f682134b9c3ba4b4ac45e507a95289c5434df364b870420973149e5fbda6d6240c9fa3947cad724918cf2fc5cef67f5a6c1b09a36ae9f27233db632224cce15d7b4815eb47183be9553a2764eb124e1c6114b9325fc656701f39de36c29cb252e51a739a30c2fcf8715465db8bd217b1ade625b36d4b5e26ef266cf777eb4f8f268a30ac921e1fc2579344048594a893075a16e42888a220640c2288c6d201e31248201038248e05c30181485055f10313c0008b02d17024120bc48180401cc97110c4201403210c03210c43510429cca8520fc90cb000edcc24ebace102efea271d18451c3cac2a269153b5e3d0305a8746d1e516a62b57bc12c4db15088b6b196d28599fa5b333c1c904375f0b233acf2b3888f3b6ce4cb90d76d32ebe406f81dda968e356f632cadc5ff44f7a652dcac48a78ffd128d2ea17926ff869762db4eadb98d484692c4de2567850fc01893bcc0705d5711b6f9eda350d52d3d3ba2b920a6e7fd95e92c138942e5be734e0e3721cf1ee7621faf7ba750a07b55c8cf21bd06f14d1297590b420bb5097e6d3c4a1c427ddd21b1c4d1bc3a1e0522cb30d30ab21e7a275be727a1e6939a3e6021dcb28ec200328ccb6c5c2d725f6052b95c92b01260d7704aee97127d55b2ce52185f3271e696db3783318e9c2c4be91b60262a6787b847d6164bd8e949d5ae69822c7329c92681d697c266e4f2030942b14c401a9215c8573cce7578ea2e933cb77e590bc924fea71abc4e365da3535e4ed8bd43e9e5e82c730ba9edec1caed0e8c56b0d8c1c2322b4b71d15d5c992bdc48dca6415374aa7b57fe7568adb91840c322d43c2921a512f19f11b8d40f172af52fa621b417a676e5611fc083c7c66e3ccfcf906eb03663367f2748963a07914f4f4e8bf361ad0a0878fda3a9b1e6ebdbe10c628376c4ece27e2fcb970cc7ef8a44018e99f5619fe3087f0b672d932be4c21866c7d8d150850d4993c107347e36be6e5b034e2ecb5c83d55e42c3d8480b1f66a469d20754b821a782e45fb9fa2ce8a810abf9b627a7c72babdf8fa1da1dfaeb113b58d6f69a9eb1b4aba5093cb988116ce2dd6ce6a8758b228bd134aeabcfb4f98897a3bbdc2f170c34d116d4458532e87ac4ad769e981449861afad730b73a23d31029665fb8d845cc2852cac53de46d5155d1f0dd909757a76228fcb706d6d25d0849fe1ec836bd8f49783b43649e51b97aa8c56a0329ee350166ffe7e89301351bde93f69ac9f1c2e8ecb03a568ec7f023ffc5459d76422cd2a2bbcb61d2e75e093235a9a6196c0182e7b54a70ca7873bcf63594e21b93754531052aad3d29229a2f2a678d528061148bfe088436d1fc645bfde84ca409655fc9888223440bf0c4882e3b259d10228f6c760fe5405ba1553ee8f2d6f6b98baf85cf517b3cfc2100e27d8e64e494e227c31385fa6a281aed2e9ee08c601db4d44f3b3b005008fd966049d111566142214d85e31f0cf4827a672982389aa5b801da21b271c011a8ddf7011a07185a819bb58e6781df2d4b31aa54f169573773c9f1f6dd45962524863b9a8f36b99b33c08595a32027aab11a0bfc01852c4dad85bd11e2042b23ccb38e938fc9721659899316b4c6bda927e50d61a0f48ff829b4375e30b0938e1b4a2606917f77f2d78417fb554afba5beed5a3c3c0273ac59936b70ca8ac95fa61931742fc780d54e2fa781a686b09ea727c11d3b8f0422bf7455ce54a979fb8885efe74c8c6f6d175fef1af3a95070bb2d8a3e1fab8b1ec9909c99431ef38b7a2f03d4b1a992535cf6591979b00674480b62f0e7c07fbc324159d8469452581db709743992109551d026412b12546e62b2c47c1e92da27210a390dd25c23040e0f9b603ebeac8e0449e99c92c377396495d8c9855124bad2251b1143697aa76ba1dbc4a176ec107775035a76a2039dc061d777d96bf666a1d0ea3ff5d9e31c2fda3b06a93593f0f8226b4fa8cb82211ccafac6858b4a94bc8ebf60d19459371680a19e9578856c58f845c286bae3bcac77e2d7e3ee96f22b3656f006cd11bc9ba25cd785282089a4a41c5cc8c46b237522687bdb3db1c646f6af49376839214e5cff3f67a1faacee881680578bf3c499db5eab988bc4e6d171fab344e0085696e8f51638aae09342543923d57554776010bbf65cd0c76d44bcda98a11e47f578f8be96da423b9cd1a452ac1fd0431d20e5cc5526d84d463aa024e6754d7a0762208eb27ca48b81aad0c3394340e2a142970ec2deb7eba36057d1bcb460ee9be4e4dc8426e762b2f78d72b1e37b6d74b72a68bdf2b6b784375b30fa68e48a4f11fb50a48fb11c09b23c6556e2c952d2a44aa38f34b72e8c4cab687a02aa02eb6c75b343c2c96d0788e9b4bf24708e79cb324d8c099c1f32db29c707c497ea3837b0a246f77c296b910bd49c9e946b9e6cb3605b5788ea99548827c0496cb5fab37b9848c802c4135fec02ac1673f1e15ebfa682e3e68398f6e74ad93528c88c057d93e96770fec4c0ce8a03b0a9adeafbf5d9a982ed32bbde70fecb141b50d899084564ce84ed6c33d390169b03e8407a2add3a7a1d76709d258dc68df93be011fb7377028f652b2b553702f0795e37a72576341b58936bd35d8d1b8dbe68ac0abba7376dc75c9e53dcedb325d84bea35ad6d5eebb8c2d3daef96bc3f0046fe45aa4dc6a8a028073e3c4c70bc0371b640bc6be7c49f1c2d7301b77dbeaf93ef0a075c1b045ce706f08bd16a1d579e3b8c10a5eaa29e29c36bf11066a4a9474b56e422f2380d93748dc393b707fbdf858a44d432437cb6129b5bfcaf449cebf94719d25560ebb892f1fe2a99f96d9a04938620f5144bddf8e98d6b03a67016adf0f2670fc5248a7de42536648a81493b21835dc91e9fe693fd4f08e76e67538e6b9ff1fe1e142486cd37c12f6b3959eabc14032fbd995cd863968d49f64d896e2663080ddec31fe4bdb8408fc88a12a8ff047580634648d92a1004d90761c0527ac0561a04236b1a761280ece013c154404dff7e37d00308b3f3e9bc6332bd36c9f7d5f46c00774510845a237a2a35e32f12f468f62510fa3a56c7ae327ca31db07489013c28e2c49b4a051db98be2b46c40fe015d0ddbf58d22f6160ff26f15c91f76623480d6767b85d562c32a4b7bf66b14481b7666fdae20c9ab1d353f94c62151fd2bba7850a7eebfceb8a983cc9a425fc852f9293134e291d9c0d66f3219126f685433af660444cd8dd358d3621c04c77cb1e9200a5fbcbe4af9ef2aee9828a7bd99f7d0ab19461be80d8be6249872587e04887101d86c45e0e6f63cfaf12bdf9c10b49e3a645948d0503d4d733c5c2df8bc94a2223be91c79685d32e758345f015398283ebe2207af8b4c4c8c87eecc600d4df2f952a64167e0eaeb761c9b332511ef727d1f291494c9223eaab844d3d154b2f047e0ab3f0ae0fa0e20f0a36fb70e9d571048af004735f84d74b6a05c4a5e2ca2218ba6f7675e58dd478008dfb93d4adaa8881f6b933129e0393d7a39fd8b310ee850a861bc271e6d55ce544ba8cd72d6a920b5e1c17a77256a5881d84fdab4af95e9fe69b32a5c4967e1e70055af5f448e76a0bc9d14634e11784611a4bf5247a78bf3b3b4a04d5ae05cc20ee614e5bc2a3d21e264077b0ca9cbe22d74187f2067b5628434bd47755c65057a0f0253b5180a1023ec21ceceacd5b30693a5442ae95b3ae408d13eb48659e3dcd102f60579136c7e54946513aa253dd594900eb8179c014c611b668e7d01f3d3a5ed0bcb8d8b882dad8423dd2a3ee3fa44161661003734552296a8d114da16147d98a80dcf2acce5343cac6fcf8eb6fb25ecf4a683c1edb23a4a8d359411ba19da8f89d8548ef0b012f00ba4d82e8909c2d07ab4a002cebdc0d6f600ed11a436b817dff8d00c4903b2a44842a558c8a716040150901951a88987487366e6a77fe0e121adede23f04da64ed4bd8dffe26c54a97163730200824bb158e864c06082691e628296c8a72230fbecb4bc6e6e80074a69f95a82c03629a1f70e4f99b9099fc11aa83e508624065040611d4de55dc2355c178fc873f877fc6e6cf2363e0e50009ea7bab406402ae47fe76abbe878d0483b8e183552fe5a936c6eeeef3d7de151658aad3e467d1826524a9ae28654d71ae0081a34805de4057febe4c13759d8f70df2e022ae37fdc370d50aee69147638cdc4d90c492528628ae9258a203f3072544176c695ab6f7ceedde5f94e3219c7038d8e2e703e91a5d9d6b4b52adeca4c2ce3f36405dc3de2f771eac9749a4d56b0a1d102b6b35ab2ef1325befb4e8f7551aeb89d21a263d7bd7da0e59e892bf2cab16bbc349ead58598e851cdd01ee0c6165de36f6fa167ae302320a8db4e116e2852769b4a6eb7b89a4e690918af731c0eed92da296cfce669952a4e0e4fca3b50ae7614ba15216ddec10bf7abaced1d5299e27d0e0d079dad11caf98fafc6c9f7e6bf679c5dd9d341b129d0d8f011d5b2697ffffe063e19c851600acf2dd245f99fc6ffb23ae79a4c47d5fb09efdb5afabe0e0dc3fba1a279daa4dcc519c752f58a126b4e52055bdc9ab4e373a2ee00593dd089dc545a9358d136a062fd847012bb6616c1a5fe6418dae976dd2333d82db8404209fc04062e189b41a6b176506ff2452fc6492f8a39c8dbec16d351c9ec029817a9b9ad119c096ca34e9492a09dd1ca8003dfff02c356d0ed910dae36c170353febbd24cc64a744410e35ac5f6d15cd03301057b5b37c727a135c9144124804e4547c10285d016fba10484db12c3dd6bb5810c070049adf7e3fe438f840388d104d3e89f16278db9b9893f24311199d80774b500ad4a4bb89d945c95f9b031f98f84966a569a08a31819c03b6a4e80fe94ce9ca25c7fcaf38a88572278e7ff7b1b5417b8444486418a2a76ae0e6c85710746290337b294850e266236fa08e0a85ce047f4d434608b9994ba923e4edbdb935d3172bcf4e78577aa493f7e3d88f54d0bea3c13c2cf389263b728b0e5c62369fedd0507653456c0e7dde35f45060b122c6694292f180fcd583843ea563241d2683c2381dd03822b3b5345a178a3d72e67b88e689d6b3ecc2d9cbd9616387ed82439242b354c933ad73fa8105dbea65ef4072a32a2bc22846dd5fed3a70dd11846d08cb82381f1423f81110c8a4661b567226990d7e0e7a9cce76d825d5687c7ab55a9ff7c74334b39c44ca51f31ba787e2a56d6d90124dea9aa882be2ec9d06c57be8d9dc661c31d460941f99ef2501497f7b094c85a88c98856f8a84392b9551929906bb9279468ac412d7415b63d408a3b4fa78ca32d3aab2c3698758d82823afa27070565942e3b47cf699d69f83204636cd15cc8aaee04eb6bec7d8e7fc86b20a6d3f3daf157217f381ef6cd7b6a2b312e336f01c7637d3e090d45c10cb423c4bb9f68f8d1a1336034bc7b1c25f8afd011f41e6566a4853cc10bbc180fc02171a8f69eaa4d08f50eb42bec5b13aee986cf85d27bedca118bd3c72460af27a959a2cd5648e34234fd453ce1aa37a807a6c85657f4af83499a6228aad6367ed406e998732b19b63345601f7f003105ede7296fbe4c798a73645fbda8559bec5157e5c22a67709a4a81a0dab2016a453c97cd02ccf0f300a35ce4958e4b26190fc86f73b7ee6a0b9a066aaa0d14af062f1f84dc41c6b89feeb7a7749817275672e9f8e0ec91e982b3b56e3ba1e39f2c9820278462e66f8dbaa55007d96029c4646cbe75114266fcd994e2ced893544a8ba22ffa3a9947f5bcd6210c535879351af37db52bd1d317cb46ae94e856be88c247523482219d94bf37d44ba2e534b3389029dd554724196b0b224a101292edd8366ce1f3f0f50bffc5191a1571f4e77f19d99bd7d68a2f5c0111a7fbaa075131d93cd9d39c488bb50c4e2ea0c581936eb23d26618de9bf303aab51c90e7baa1203cd8fdc97ad299e811e982e274912333d74eaf79ab6ec16188ac61a5da15da2f859d2cbe6b009512585f04eb68393256da1dcd9d0aa6d9dcd3b8a731d2aa98ebd1434d76dfbf0d980d38abf41b045330ed1d0c24387b34eb388b0c509a7dacd1fb1027d74fc69bb39cdb6dcb7dc941886f69500484fc8158ef03c7a1b08b4ace28d246b4b33457b5cd30b2ffbab9a96ea3b32412e4854be1ee31c41fca79c10", + "0x3a65787472696e7369635f696e646578": "0x00000000", + "0x3c311d57d4daf52904616cf69648081e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x3c311d57d4daf52904616cf69648081e5e0621c4869aa60c02be9adcc98a0d1d": "0x100845a5993b29977c58c9ef36aad0e09946f8a10b2ad30956dec1207beda8014a6ea1de453086c8ecafdcb8c05c2ffc5b31dca333e27af61595e11a6dc88f744876aad3978bef6ce80e5b7bb80e9ae9e1fb23fa1133088fa9e0555d6d96f1151bf8465e78528188a1511df15027568a300d1319d346dc7ddde5bc33dc8c27fa5f", + "0x3f1467a096bcd71a5b6a0c8155e208104e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x45323df7cc47150b3930e2666b0aa3134e7b9012096b41c4eb3aaf947f6ea429": "0x0200", + "0x57f8dc2f5ab09467896f47300f0424384e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x57f8dc2f5ab09467896f47300f0424385e0621c4869aa60c02be9adcc98a0d1d": "0x100845a5993b29977c58c9ef36aad0e09946f8a10b2ad30956dec1207beda8014a6ea1de453086c8ecafdcb8c05c2ffc5b31dca333e27af61595e11a6dc88f744876aad3978bef6ce80e5b7bb80e9ae9e1fb23fa1133088fa9e0555d6d96f1151bf8465e78528188a1511df15027568a300d1319d346dc7ddde5bc33dc8c27fa5f", + "0x6dd12b3ae7975bb95f841f4505bc193c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x7474449cca95dc5d0c00e71735a6d17d4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", + "0x79e2fe5d327165001f8232643023ed8b4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x7b3237373ffdfeb1cab4222e3b520d6b4e7b9012096b41c4eb3aaf947f6ea429": "0x0300", + "0xb8753e9383841da95f7b8871e5de32694e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xc2261276cc9d1f8598ea4b6a74b15c2f4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", + "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x00000000000000000000000000000000", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb328a22616a0e689030845a5993b29977c58c9ef36aad0e09946f8a10b2ad30956dec1207beda8014a": "0x0845a5993b29977c58c9ef36aad0e09946f8a10b2ad30956dec1207beda8014a", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3295d097b09a3ea2c76aad3978bef6ce80e5b7bb80e9ae9e1fb23fa1133088fa9e0555d6d96f1151b": "0x76aad3978bef6ce80e5b7bb80e9ae9e1fb23fa1133088fa9e0555d6d96f1151b", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb329ce21f6fa898c6a6ea1de453086c8ecafdcb8c05c2ffc5b31dca333e27af61595e11a6dc88f7448": "0x6ea1de453086c8ecafdcb8c05c2ffc5b31dca333e27af61595e11a6dc88f7448", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3bd4d99ad2324a061f8465e78528188a1511df15027568a300d1319d346dc7ddde5bc33dc8c27fa5f": "0xf8465e78528188a1511df15027568a300d1319d346dc7ddde5bc33dc8c27fa5f", + "0xcec5070d609dd3497f72bde07fc96ba04e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195026e3d4ba592e973c617572618076aad3978bef6ce80e5b7bb80e9ae9e1fb23fa1133088fa9e0555d6d96f1151b": "0x76aad3978bef6ce80e5b7bb80e9ae9e1fb23fa1133088fa9e0555d6d96f1151b", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195045f1ca6ffcd6f95461757261800845a5993b29977c58c9ef36aad0e09946f8a10b2ad30956dec1207beda8014a": "0x0845a5993b29977c58c9ef36aad0e09946f8a10b2ad30956dec1207beda8014a", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509ec5a66bfda48ac661757261806ea1de453086c8ecafdcb8c05c2ffc5b31dca333e27af61595e11a6dc88f7448": "0x6ea1de453086c8ecafdcb8c05c2ffc5b31dca333e27af61595e11a6dc88f7448", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950ab6c705e19963ee06175726180f8465e78528188a1511df15027568a300d1319d346dc7ddde5bc33dc8c27fa5f": "0xf8465e78528188a1511df15027568a300d1319d346dc7ddde5bc33dc8c27fa5f", + "0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903": "0x100845a5993b29977c58c9ef36aad0e09946f8a10b2ad30956dec1207beda8014a6ea1de453086c8ecafdcb8c05c2ffc5b31dca333e27af61595e11a6dc88f744876aad3978bef6ce80e5b7bb80e9ae9e1fb23fa1133088fa9e0555d6d96f1151bf8465e78528188a1511df15027568a300d1319d346dc7ddde5bc33dc8c27fa5f", + "0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x100845a5993b29977c58c9ef36aad0e09946f8a10b2ad30956dec1207beda8014a0845a5993b29977c58c9ef36aad0e09946f8a10b2ad30956dec1207beda8014a6ea1de453086c8ecafdcb8c05c2ffc5b31dca333e27af61595e11a6dc88f74486ea1de453086c8ecafdcb8c05c2ffc5b31dca333e27af61595e11a6dc88f744876aad3978bef6ce80e5b7bb80e9ae9e1fb23fa1133088fa9e0555d6d96f1151b76aad3978bef6ce80e5b7bb80e9ae9e1fb23fa1133088fa9e0555d6d96f1151bf8465e78528188a1511df15027568a300d1319d346dc7ddde5bc33dc8c27fa5ff8465e78528188a1511df15027568a300d1319d346dc7ddde5bc33dc8c27fa5f", + "0xd57bce545fb382c34570e5dfbf338f5e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xd5e1a2fa16732ce6906189438c0a82c64e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xe38f185207498abb5c213d0fb059b3d84e7b9012096b41c4eb3aaf947f6ea429": "0x0100", + "0xe38f185207498abb5c213d0fb059b3d86323ae84c43568be0d1394d5d0d522c4": "0x03000000", + "0xf0c365c3cf59d671eb72da0e7a4113c44e7b9012096b41c4eb3aaf947f6ea429": "0x0000" + }, + "childrenDefault": {} + } + } +} \ No newline at end of file diff --git a/cumulus/parachains/common/Cargo.toml b/cumulus/parachains/common/Cargo.toml index dcaea40d2da..61ac91aeb06 100644 --- a/cumulus/parachains/common/Cargo.toml +++ b/cumulus/parachains/common/Cargo.toml @@ -34,12 +34,14 @@ sp-runtime = { path = "../../../substrate/primitives/runtime", default-features sp-std = { path = "../../../substrate/primitives/std", default-features = false } # Polkadot +pallet-xcm = { path = "../../../polkadot/xcm/pallet-xcm", default-features = false } rococo-runtime-constants = { path = "../../../polkadot/runtime/rococo/constants", default-features = false } westend-runtime-constants = { path = "../../../polkadot/runtime/westend/constants", default-features = false } polkadot-core-primitives = { path = "../../../polkadot/core-primitives", default-features = false } polkadot-primitives = { path = "../../../polkadot/primitives", default-features = false } xcm = { package = "staging-xcm", path = "../../../polkadot/xcm", default-features = false } xcm-builder = { package = "staging-xcm-builder", path = "../../../polkadot/xcm/xcm-builder", default-features = false } +xcm-executor = { package = "staging-xcm-executor", path = "../../../polkadot/xcm/xcm-executor", default-features = false } # Cumulus pallet-collator-selection = { path = "../../pallets/collator-selection", default-features = false } @@ -70,6 +72,7 @@ std = [ "pallet-balances/std", "pallet-collator-selection/std", "pallet-message-queue/std", + "pallet-xcm/std", "parachain-info/std", "polkadot-core-primitives/std", "polkadot-primitives/std", @@ -82,6 +85,7 @@ std = [ "sp-std/std", "westend-runtime-constants/std", "xcm-builder/std", + "xcm-executor/std", "xcm/std", ] @@ -95,7 +99,9 @@ runtime-benchmarks = [ "pallet-balances/runtime-benchmarks", "pallet-collator-selection/runtime-benchmarks", "pallet-message-queue/runtime-benchmarks", + "pallet-xcm/runtime-benchmarks", "polkadot-primitives/runtime-benchmarks", "sp-runtime/runtime-benchmarks", "xcm-builder/runtime-benchmarks", + "xcm-executor/runtime-benchmarks", ] diff --git a/cumulus/parachains/common/src/impls.rs b/cumulus/parachains/common/src/impls.rs index 50cb1c7f3e8..beb655134ad 100644 --- a/cumulus/parachains/common/src/impls.rs +++ b/cumulus/parachains/common/src/impls.rs @@ -18,12 +18,16 @@ use frame_support::traits::{ fungibles::{self, Balanced, Credit}, - Contains, ContainsPair, Currency, Get, Imbalance, OnUnbalanced, + Contains, ContainsPair, Currency, Get, Imbalance, OnUnbalanced, OriginTrait, }; use pallet_asset_tx_payment::HandleCredit; use sp_runtime::traits::Zero; -use sp_std::marker::PhantomData; -use xcm::latest::{AssetId, Fungibility::Fungible, MultiAsset, MultiLocation}; +use sp_std::{marker::PhantomData, prelude::*}; +use xcm::latest::{ + AssetId, Fungibility, Fungibility::Fungible, Junction, Junctions::Here, MultiAsset, + MultiLocation, Parent, WeightLimit, +}; +use xcm_executor::traits::ConvertLocation; /// Type alias to conveniently refer to the `Currency::NegativeImbalance` associated type. pub type NegativeImbalance = as Currency< @@ -118,6 +122,64 @@ impl> ContainsPair for AssetsFr } } +/// Type alias to conveniently refer to the `Currency::Balance` associated type. +pub type BalanceOf = + as Currency<::AccountId>>::Balance; + +/// Implements `OnUnbalanced::on_unbalanced` to teleport slashed assets to relay chain treasury +/// account. +pub struct ToParentTreasury( + PhantomData<(TreasuryAccount, AccountIdConverter, T)>, +); + +impl OnUnbalanced> + for ToParentTreasury +where + T: pallet_balances::Config + pallet_xcm::Config + frame_system::Config, + <::RuntimeOrigin as OriginTrait>::AccountId: From>, + [u8; 32]: From<::AccountId>, + TreasuryAccount: Get>, + AccountIdConverter: ConvertLocation>, + BalanceOf: Into, +{ + fn on_unbalanced(amount: NegativeImbalance) { + let amount = match amount.drop_zero() { + Ok(..) => return, + Err(amount) => amount, + }; + let imbalance = amount.peek(); + let root_location: MultiLocation = Here.into(); + let root_account: AccountIdOf = + match AccountIdConverter::convert_location(&root_location) { + Some(a) => a, + None => { + log::warn!("Failed to convert root origin into account id"); + return + }, + }; + let treasury_account: AccountIdOf = TreasuryAccount::get(); + + >::resolve_creating(&root_account, amount); + + let result = >::limited_teleport_assets( + <::RuntimeOrigin>::root(), + Box::new(Parent.into()), + Box::new( + Junction::AccountId32 { network: None, id: treasury_account.into() } + .into_location() + .into(), + ), + Box::new((Parent, imbalance).into()), + 0, + WeightLimit::Unlimited, + ); + + if let Err(err) = result { + log::warn!("Failed to teleport slashed assets: {:?}", err); + } + } +} + #[cfg(test)] mod tests { use super::*; diff --git a/cumulus/parachains/common/src/polkadot.rs b/cumulus/parachains/common/src/polkadot.rs index ca413830342..48b502b9888 100644 --- a/cumulus/parachains/common/src/polkadot.rs +++ b/cumulus/parachains/common/src/polkadot.rs @@ -20,17 +20,17 @@ pub mod account { /// Polkadot treasury pallet id, used to convert into AccountId pub const POLKADOT_TREASURY_PALLET_ID: PalletId = PalletId(*b"py/trsry"); /// Alliance pallet ID. - /// It is used as a temporarily place to deposit a slashed imbalance - /// before the teleport to the Treasury. + /// Used as a temporary place to deposit a slashed imbalance before teleporting to the Treasury. pub const ALLIANCE_PALLET_ID: PalletId = PalletId(*b"py/allia"); /// Referenda pallet ID. - /// It is used as a temporarily place to deposit a slashed imbalance - /// before the teleport to the Treasury. + /// Used as a temporary place to deposit a slashed imbalance before teleporting to the Treasury. pub const REFERENDA_PALLET_ID: PalletId = PalletId(*b"py/refer"); /// Ambassador Referenda pallet ID. - /// It is used as a temporarily place to deposit a slashed imbalance - /// before the teleport to the Treasury. + /// Used as a temporary place to deposit a slashed imbalance before teleporting to the Treasury. pub const AMBASSADOR_REFERENDA_PALLET_ID: PalletId = PalletId(*b"py/amref"); + /// Identity pallet ID. + /// Used as a temporary place to deposit a slashed imbalance before teleporting to the Treasury. + pub const IDENTITY_PALLET_ID: PalletId = PalletId(*b"py/ident"); /// Fellowship treasury pallet ID pub const FELLOWSHIP_TREASURY_PALLET_ID: PalletId = PalletId(*b"py/feltr"); } diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/Cargo.toml new file mode 100644 index 00000000000..36fef849ddb --- /dev/null +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "people-rococo-emulated-chain" +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license = "Apache-2.0" +description = "People Rococo emulated chain" +publish = false + +[dependencies] +serde_json = "1.0.104" + +# Substrate +sp-core = { path = "../../../../../../../../substrate/primitives/core", default-features = false } +sp-runtime = { path = "../../../../../../../../substrate/primitives/runtime", default-features = false } +frame-support = { path = "../../../../../../../../substrate/frame/support", default-features = false } + +# Polakadot +parachains-common = { path = "../../../../../../../parachains/common" } + +# Cumulus +cumulus-primitives-core = { path = "../../../../../../../primitives/core", default-features = false } +emulated-integration-tests-common = { path = "../../../../common", default-features = false } +people-rococo-runtime = { path = "../../../../../../runtimes/people/people-rococo" } +rococo-emulated-chain = { path = "../../../relays/rococo" } diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/src/genesis.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/src/genesis.rs new file mode 100644 index 00000000000..27d5531a0c7 --- /dev/null +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/src/genesis.rs @@ -0,0 +1,62 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Substrate +use sp_core::storage::Storage; + +// Cumulus +use cumulus_primitives_core::ParaId; +use emulated_integration_tests_common::{build_genesis_storage, collators, SAFE_XCM_VERSION}; +use parachains_common::Balance; + +pub const PARA_ID: u32 = 1004; +pub const ED: Balance = parachains_common::rococo::currency::EXISTENTIAL_DEPOSIT; + +pub fn genesis() -> Storage { + let genesis_config = people_rococo_runtime::RuntimeGenesisConfig { + system: people_rococo_runtime::SystemConfig::default(), + parachain_info: people_rococo_runtime::ParachainInfoConfig { + parachain_id: ParaId::from(PARA_ID), + ..Default::default() + }, + collator_selection: people_rococo_runtime::CollatorSelectionConfig { + invulnerables: collators::invulnerables().iter().cloned().map(|(acc, _)| acc).collect(), + candidacy_bond: ED * 16, + ..Default::default() + }, + session: people_rococo_runtime::SessionConfig { + keys: collators::invulnerables() + .into_iter() + .map(|(acc, aura)| { + ( + acc.clone(), // account id + acc, // validator id + people_rococo_runtime::SessionKeys { aura }, // session keys + ) + }) + .collect(), + }, + polkadot_xcm: people_rococo_runtime::PolkadotXcmConfig { + safe_xcm_version: Some(SAFE_XCM_VERSION), + ..Default::default() + }, + ..Default::default() + }; + + build_genesis_storage( + &genesis_config, + people_rococo_runtime::WASM_BINARY.expect("WASM binary was not built, please build it!"), + ) +} diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/src/lib.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/src/lib.rs new file mode 100644 index 00000000000..fa818bf81bf --- /dev/null +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/src/lib.rs @@ -0,0 +1,52 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +pub mod genesis; + +// Substrate +use frame_support::traits::OnInitialize; + +// Cumulus +use emulated_integration_tests_common::{ + impl_accounts_helpers_for_parachain, impl_assert_events_helpers_for_parachain, + impls::Parachain, xcm_emulator::decl_test_parachains, +}; + +// PeopleRococo Parachain declaration +decl_test_parachains! { + pub struct PeopleRococo { + genesis = genesis::genesis(), + on_init = { + people_rococo_runtime::AuraExt::on_initialize(1); + }, + runtime = people_rococo_runtime, + core = { + XcmpMessageHandler: people_rococo_runtime::XcmpQueue, + LocationToAccountId: people_rococo_runtime::xcm_config::LocationToAccountId, + ParachainInfo: people_rococo_runtime::ParachainInfo, + MessageOrigin: cumulus_primitives_core::AggregateMessageOrigin, + }, + pallets = { + PolkadotXcm: people_rococo_runtime::PolkadotXcm, + Balances: people_rococo_runtime::Balances, + Identity: people_rococo_runtime::Identity, + IdentityMigrator: people_rococo_runtime::IdentityMigrator, + } + }, +} + +// PeopleRococo implementation +impl_accounts_helpers_for_parachain!(PeopleRococo); +impl_assert_events_helpers_for_parachain!(PeopleRococo); diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/Cargo.toml new file mode 100644 index 00000000000..9a01a545c31 --- /dev/null +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "people-westend-emulated-chain" +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license = "Apache-2.0" +description = "People Westend emulated chain" +publish = false + +[dependencies] +serde_json = "1.0.104" + +# Substrate +sp-core = { path = "../../../../../../../../substrate/primitives/core", default-features = false } +sp-runtime = { path = "../../../../../../../../substrate/primitives/runtime", default-features = false } +frame-support = { path = "../../../../../../../../substrate/frame/support", default-features = false } + +# Polakadot +parachains-common = { path = "../../../../../../../parachains/common" } + +# Cumulus +cumulus-primitives-core = { path = "../../../../../../../primitives/core", default-features = false } +emulated-integration-tests-common = { path = "../../../../common", default-features = false } +people-westend-runtime = { path = "../../../../../../runtimes/people/people-westend" } +westend-emulated-chain = { path = "../../../relays/westend" } diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/src/genesis.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/src/genesis.rs new file mode 100644 index 00000000000..612580c2b16 --- /dev/null +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/src/genesis.rs @@ -0,0 +1,62 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Substrate +use sp_core::storage::Storage; + +// Cumulus +use cumulus_primitives_core::ParaId; +use emulated_integration_tests_common::{build_genesis_storage, collators, SAFE_XCM_VERSION}; +use parachains_common::Balance; + +pub const PARA_ID: u32 = 1004; +pub const ED: Balance = parachains_common::westend::currency::EXISTENTIAL_DEPOSIT; + +pub fn genesis() -> Storage { + let genesis_config = people_westend_runtime::RuntimeGenesisConfig { + system: people_westend_runtime::SystemConfig::default(), + parachain_info: people_westend_runtime::ParachainInfoConfig { + parachain_id: ParaId::from(PARA_ID), + ..Default::default() + }, + collator_selection: people_westend_runtime::CollatorSelectionConfig { + invulnerables: collators::invulnerables().iter().cloned().map(|(acc, _)| acc).collect(), + candidacy_bond: ED * 16, + ..Default::default() + }, + session: people_westend_runtime::SessionConfig { + keys: collators::invulnerables() + .into_iter() + .map(|(acc, aura)| { + ( + acc.clone(), // account id + acc, // validator id + people_westend_runtime::SessionKeys { aura }, // session keys + ) + }) + .collect(), + }, + polkadot_xcm: people_westend_runtime::PolkadotXcmConfig { + safe_xcm_version: Some(SAFE_XCM_VERSION), + ..Default::default() + }, + ..Default::default() + }; + + build_genesis_storage( + &genesis_config, + people_westend_runtime::WASM_BINARY.expect("WASM binary was not built, please build it!"), + ) +} diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/src/lib.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/src/lib.rs new file mode 100644 index 00000000000..775b89ac208 --- /dev/null +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/src/lib.rs @@ -0,0 +1,52 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +pub mod genesis; + +// Substrate +use frame_support::traits::OnInitialize; + +// Cumulus +use emulated_integration_tests_common::{ + impl_accounts_helpers_for_parachain, impl_assert_events_helpers_for_parachain, + impls::Parachain, xcm_emulator::decl_test_parachains, +}; + +// PeopleWestend Parachain declaration +decl_test_parachains! { + pub struct PeopleWestend { + genesis = genesis::genesis(), + on_init = { + people_westend_runtime::AuraExt::on_initialize(1); + }, + runtime = people_westend_runtime, + core = { + XcmpMessageHandler: people_westend_runtime::XcmpQueue, + LocationToAccountId: people_westend_runtime::xcm_config::LocationToAccountId, + ParachainInfo: people_westend_runtime::ParachainInfo, + MessageOrigin: cumulus_primitives_core::AggregateMessageOrigin, + }, + pallets = { + PolkadotXcm: people_westend_runtime::PolkadotXcm, + Balances: people_westend_runtime::Balances, + Identity: people_westend_runtime::Identity, + IdentityMigrator: people_westend_runtime::IdentityMigrator, + } + }, +} + +// PeopleWestend implementation +impl_accounts_helpers_for_parachain!(PeopleWestend); +impl_assert_events_helpers_for_parachain!(PeopleWestend); diff --git a/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/src/lib.rs b/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/src/lib.rs index 0791f63235f..e0d37302120 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/src/lib.rs @@ -37,6 +37,8 @@ decl_test_relay_chains! { Sudo: rococo_runtime::Sudo, Balances: rococo_runtime::Balances, Hrmp: rococo_runtime::Hrmp, + Identity: rococo_runtime::Identity, + IdentityMigrator: rococo_runtime::IdentityMigrator, } }, } diff --git a/cumulus/parachains/integration-tests/emulated/chains/relays/westend/src/lib.rs b/cumulus/parachains/integration-tests/emulated/chains/relays/westend/src/lib.rs index 8a5d4bbf808..4d29a8024d1 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/relays/westend/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/relays/westend/src/lib.rs @@ -39,6 +39,8 @@ decl_test_relay_chains! { Treasury: westend_runtime::Treasury, AssetRate: westend_runtime::AssetRate, Hrmp: westend_runtime::Hrmp, + Identity: westend_runtime::Identity, + IdentityMigrator: westend_runtime::IdentityMigrator, } }, } diff --git a/cumulus/parachains/integration-tests/emulated/common/src/impls.rs b/cumulus/parachains/integration-tests/emulated/common/src/impls.rs index 42b5847d17c..aa3ec214f8c 100644 --- a/cumulus/parachains/integration-tests/emulated/common/src/impls.rs +++ b/cumulus/parachains/integration-tests/emulated/common/src/impls.rs @@ -244,7 +244,7 @@ macro_rules! impl_assert_events_helpers_for_relay_chain { ); } - /// Asserts a XCM message is sent + /// Asserts an XCM program is sent. pub fn assert_xcm_pallet_sent() { $crate::impls::assert_expected_events!( Self, @@ -254,7 +254,8 @@ macro_rules! impl_assert_events_helpers_for_relay_chain { ); } - /// Asserts a XCM from System Parachain is succesfully received and proccessed + /// Asserts an XCM program from a System Parachain is successfully received and + /// processed within expectations. pub fn assert_ump_queue_processed( expected_success: bool, expected_id: Option<$crate::impls::ParaId>, diff --git a/cumulus/parachains/integration-tests/emulated/common/src/lib.rs b/cumulus/parachains/integration-tests/emulated/common/src/lib.rs index 58222f622c2..48ee1a3b780 100644 --- a/cumulus/parachains/integration-tests/emulated/common/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/common/src/lib.rs @@ -32,7 +32,6 @@ use sp_runtime::{ // Polakdot use parachains_common::BlockNumber; use polkadot_runtime_parachains::configuration::HostConfiguration; -use xcm; // Cumulus use parachains_common::{AccountId, AssetHubPolkadotAuraId, AuraId}; diff --git a/cumulus/parachains/integration-tests/emulated/networks/rococo-system/Cargo.toml b/cumulus/parachains/integration-tests/emulated/networks/rococo-system/Cargo.toml index bb31f8e467d..eb0a8a850d0 100644 --- a/cumulus/parachains/integration-tests/emulated/networks/rococo-system/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/networks/rococo-system/Cargo.toml @@ -16,4 +16,5 @@ emulated-integration-tests-common = { path = "../../common", default-features = rococo-emulated-chain = { path = "../../chains/relays/rococo" } asset-hub-rococo-emulated-chain = { path = "../../chains/parachains/assets/asset-hub-rococo" } bridge-hub-rococo-emulated-chain = { path = "../../chains/parachains/bridges/bridge-hub-rococo" } +people-rococo-emulated-chain = { path = "../../chains/parachains/people/people-rococo" } penpal-emulated-chain = { path = "../../chains/parachains/testing/penpal" } diff --git a/cumulus/parachains/integration-tests/emulated/networks/rococo-system/src/lib.rs b/cumulus/parachains/integration-tests/emulated/networks/rococo-system/src/lib.rs index ad22185fa70..70f23ef8260 100644 --- a/cumulus/parachains/integration-tests/emulated/networks/rococo-system/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/networks/rococo-system/src/lib.rs @@ -16,11 +16,13 @@ pub use asset_hub_rococo_emulated_chain; pub use bridge_hub_rococo_emulated_chain; pub use penpal_emulated_chain; +pub use people_rococo_emulated_chain; pub use rococo_emulated_chain; use asset_hub_rococo_emulated_chain::AssetHubRococo; use bridge_hub_rococo_emulated_chain::BridgeHubRococo; use penpal_emulated_chain::{PenpalA, PenpalB}; +use people_rococo_emulated_chain::PeopleRococo; use rococo_emulated_chain::Rococo; // Cumulus @@ -37,6 +39,7 @@ decl_test_networks! { BridgeHubRococo, PenpalA, PenpalB, + PeopleRococo, ], bridge = () }, @@ -47,5 +50,6 @@ decl_test_sender_receiver_accounts_parameter_types! { AssetHubRococoPara { sender: ALICE, receiver: BOB }, BridgeHubRococoPara { sender: ALICE, receiver: BOB }, PenpalAPara { sender: ALICE, receiver: BOB }, - PenpalBPara { sender: ALICE, receiver: BOB } + PenpalBPara { sender: ALICE, receiver: BOB }, + PeopleRococoPara { sender: ALICE, receiver: BOB } } diff --git a/cumulus/parachains/integration-tests/emulated/networks/westend-system/Cargo.toml b/cumulus/parachains/integration-tests/emulated/networks/westend-system/Cargo.toml index 80ffb9cfd6c..64bc91f442d 100644 --- a/cumulus/parachains/integration-tests/emulated/networks/westend-system/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/networks/westend-system/Cargo.toml @@ -18,3 +18,4 @@ asset-hub-westend-emulated-chain = { path = "../../chains/parachains/assets/asse bridge-hub-westend-emulated-chain = { path = "../../chains/parachains/bridges/bridge-hub-westend" } collectives-westend-emulated-chain = { path = "../../chains/parachains/collectives/collectives-westend" } penpal-emulated-chain = { path = "../../chains/parachains/testing/penpal" } +people-westend-emulated-chain = { path = "../../chains/parachains/people/people-westend" } diff --git a/cumulus/parachains/integration-tests/emulated/networks/westend-system/src/lib.rs b/cumulus/parachains/integration-tests/emulated/networks/westend-system/src/lib.rs index 26cd5c7e860..9fbc773bc50 100644 --- a/cumulus/parachains/integration-tests/emulated/networks/westend-system/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/networks/westend-system/src/lib.rs @@ -17,12 +17,14 @@ pub use asset_hub_westend_emulated_chain; pub use bridge_hub_westend_emulated_chain; pub use collectives_westend_emulated_chain; pub use penpal_emulated_chain; +pub use people_westend_emulated_chain; pub use westend_emulated_chain; use asset_hub_westend_emulated_chain::AssetHubWestend; use bridge_hub_westend_emulated_chain::BridgeHubWestend; use collectives_westend_emulated_chain::CollectivesWestend; use penpal_emulated_chain::{PenpalA, PenpalB}; +use people_westend_emulated_chain::PeopleWestend; use westend_emulated_chain::Westend; // Cumulus @@ -38,6 +40,7 @@ decl_test_networks! { AssetHubWestend, BridgeHubWestend, CollectivesWestend, + PeopleWestend, PenpalA, PenpalB, ], @@ -50,6 +53,7 @@ decl_test_sender_receiver_accounts_parameter_types! { AssetHubWestendPara { sender: ALICE, receiver: BOB }, BridgeHubWestendPara { sender: ALICE, receiver: BOB }, CollectivesWestendPara { sender: ALICE, receiver: BOB }, + PeopleWestendPara { sender: ALICE, receiver: BOB }, PenpalAPara { sender: ALICE, receiver: BOB }, PenpalBPara { sender: ALICE, receiver: BOB } } diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/lib.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/lib.rs index 3ff8c37c646..721f8b511ea 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/lib.rs @@ -66,42 +66,5 @@ pub type SystemParaToRelayTest = Test; pub type SystemParaToParaTest = Test; pub type ParaToSystemParaTest = Test; -/// Returns a `TestArgs` instance to be used for the Relay Chain across integration tests -pub fn relay_test_args( - dest: MultiLocation, - beneficiary_id: AccountId32, - amount: Balance, -) -> TestArgs { - TestArgs { - dest, - beneficiary: AccountId32Junction { network: None, id: beneficiary_id.into() }.into(), - amount, - assets: (Here, amount).into(), - asset_id: None, - fee_asset_item: 0, - weight_limit: WeightLimit::Unlimited, - } -} - -/// Returns a `TestArgs` instance to be used by parachains across integration tests -pub fn para_test_args( - dest: MultiLocation, - beneficiary_id: AccountId32, - amount: Balance, - assets: MultiAssets, - asset_id: Option, - fee_asset_item: u32, -) -> TestArgs { - TestArgs { - dest, - beneficiary: AccountId32Junction { network: None, id: beneficiary_id.into() }.into(), - amount, - assets, - asset_id, - fee_asset_item, - weight_limit: WeightLimit::Unlimited, - } -} - #[cfg(test)] mod tests; diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/reserve_transfer.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/reserve_transfer.rs index e6142e29b7c..24a71d3fb45 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/reserve_transfer.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/reserve_transfer.rs @@ -265,7 +265,7 @@ fn reserve_transfer_native_asset_from_relay_to_para() { let test_args = TestContext { sender: RococoSender::get(), receiver: PenpalAReceiver::get(), - args: relay_test_args(destination, beneficiary_id, amount_to_send), + args: TestArgs::new_relay(destination, beneficiary_id, amount_to_send), }; let mut test = RelayToParaTest::new(test_args); @@ -309,7 +309,7 @@ fn reserve_transfer_native_asset_from_system_para_to_para() { let test_args = TestContext { sender: AssetHubRococoSender::get(), receiver: PenpalAReceiver::get(), - args: para_test_args(destination, beneficiary_id, amount_to_send, assets, None, 0), + args: TestArgs::new_para(destination, beneficiary_id, amount_to_send, assets, None, 0), }; let mut test = SystemParaToParaTest::new(test_args); @@ -353,7 +353,7 @@ fn reserve_transfer_native_asset_from_para_to_system_para() { let test_args = TestContext { sender: PenpalASender::get(), receiver: AssetHubRococoReceiver::get(), - args: para_test_args(destination, beneficiary_id, amount_to_send, assets, None, 0), + args: TestArgs::new_para(destination, beneficiary_id, amount_to_send, assets, None, 0), }; let mut test = ParaToSystemParaTest::new(test_args); @@ -433,7 +433,7 @@ fn reserve_transfer_assets_from_system_para_to_para() { let para_test_args = TestContext { sender: AssetHubRococoSender::get(), receiver: PenpalAReceiver::get(), - args: para_test_args( + args: TestArgs::new_para( destination, beneficiary_id, asset_amount_to_send, diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/teleport.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/teleport.rs index e64c02f5258..a07463cec50 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/teleport.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/teleport.rs @@ -303,7 +303,7 @@ fn limited_teleport_native_assets_from_relay_to_system_para_works() { let test_args = TestContext { sender: RococoSender::get(), receiver: AssetHubRococoReceiver::get(), - args: relay_test_args(dest, beneficiary_id, amount_to_send), + args: TestArgs::new_relay(dest, beneficiary_id, amount_to_send), }; let mut test = RelayToSystemParaTest::new(test_args); @@ -347,7 +347,7 @@ fn limited_teleport_native_assets_back_from_system_para_to_relay_works() { let test_args = TestContext { sender: AssetHubRococoSender::get(), receiver: RococoReceiver::get(), - args: para_test_args(destination, beneficiary_id, amount_to_send, assets, None, 0), + args: TestArgs::new_para(destination, beneficiary_id, amount_to_send, assets, None, 0), }; let mut test = SystemParaToRelayTest::new(test_args); @@ -388,7 +388,7 @@ fn limited_teleport_native_assets_from_system_para_to_relay_fails() { let test_args = TestContext { sender: AssetHubRococoSender::get(), receiver: RococoReceiver::get(), - args: para_test_args(destination, beneficiary_id, amount_to_send, assets, None, 0), + args: TestArgs::new_para(destination, beneficiary_id, amount_to_send, assets, None, 0), }; let mut test = SystemParaToRelayTest::new(test_args); @@ -426,7 +426,7 @@ fn teleport_native_assets_from_relay_to_system_para_works() { let test_args = TestContext { sender: RococoSender::get(), receiver: AssetHubRococoReceiver::get(), - args: relay_test_args(dest, beneficiary_id, amount_to_send), + args: TestArgs::new_relay(dest, beneficiary_id, amount_to_send), }; let mut test = RelayToSystemParaTest::new(test_args); @@ -470,7 +470,7 @@ fn teleport_native_assets_back_from_system_para_to_relay_works() { let test_args = TestContext { sender: AssetHubRococoSender::get(), receiver: RococoReceiver::get(), - args: para_test_args(destination, beneficiary_id, amount_to_send, assets, None, 0), + args: TestArgs::new_para(destination, beneficiary_id, amount_to_send, assets, None, 0), }; let mut test = SystemParaToRelayTest::new(test_args); @@ -511,7 +511,7 @@ fn teleport_native_assets_from_system_para_to_relay_fails() { let test_args = TestContext { sender: AssetHubRococoSender::get(), receiver: RococoReceiver::get(), - args: para_test_args(destination, beneficiary_id, amount_to_send, assets, None, 0), + args: TestArgs::new_para(destination, beneficiary_id, amount_to_send, assets, None, 0), }; let mut test = SystemParaToRelayTest::new(test_args); @@ -595,7 +595,7 @@ fn bidirectional_teleport_foreign_assets_between_para_and_asset_hub() { let penpal_to_ah_test_args = TestContext { sender: PenpalASender::get(), receiver: AssetHubRococoReceiver::get(), - args: para_test_args( + args: TestArgs::new_para( ah_as_seen_by_penpal, penpal_to_ah_beneficiary_id, asset_amount_to_send, @@ -687,7 +687,7 @@ fn bidirectional_teleport_foreign_assets_between_para_and_asset_hub() { let ah_to_penpal_test_args = TestContext { sender: AssetHubRococoSender::get(), receiver: PenpalAReceiver::get(), - args: para_test_args( + args: TestArgs::new_para( penpal_as_seen_by_ah, ah_to_penpal_beneficiary_id, asset_amount_to_send, diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/lib.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/lib.rs index e9c7a59faaf..fbeb08649e7 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/lib.rs @@ -73,42 +73,5 @@ pub type SystemParaToRelayTest = Test; pub type SystemParaToParaTest = Test; pub type ParaToSystemParaTest = Test; -/// Returns a `TestArgs` instance to be used for the Relay Chain across integration tests -pub fn relay_test_args( - dest: MultiLocation, - beneficiary_id: AccountId32, - amount: Balance, -) -> TestArgs { - TestArgs { - dest, - beneficiary: AccountId32Junction { network: None, id: beneficiary_id.into() }.into(), - amount, - assets: (Here, amount).into(), - asset_id: None, - fee_asset_item: 0, - weight_limit: WeightLimit::Unlimited, - } -} - -/// Returns a `TestArgs` instance to be used by parachains across integration tests -pub fn para_test_args( - dest: MultiLocation, - beneficiary_id: AccountId32, - amount: Balance, - assets: MultiAssets, - asset_id: Option, - fee_asset_item: u32, -) -> TestArgs { - TestArgs { - dest, - beneficiary: AccountId32Junction { network: None, id: beneficiary_id.into() }.into(), - amount, - assets, - asset_id, - fee_asset_item, - weight_limit: WeightLimit::Unlimited, - } -} - #[cfg(test)] mod tests; diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/reserve_transfer.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/reserve_transfer.rs index 7472445c4ba..3cce6c4417e 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/reserve_transfer.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/reserve_transfer.rs @@ -274,7 +274,7 @@ fn reserve_transfer_native_asset_from_relay_to_para() { let test_args = TestContext { sender: WestendSender::get(), receiver: PenpalBReceiver::get(), - args: relay_test_args(destination, beneficiary_id, amount_to_send), + args: TestArgs::new_relay(destination, beneficiary_id, amount_to_send), }; let mut test = RelayToParaTest::new(test_args); @@ -318,7 +318,7 @@ fn reserve_transfer_native_asset_from_system_para_to_para() { let test_args = TestContext { sender: AssetHubWestendSender::get(), receiver: PenpalBReceiver::get(), - args: para_test_args(destination, beneficiary_id, amount_to_send, assets, None, 0), + args: TestArgs::new_para(destination, beneficiary_id, amount_to_send, assets, None, 0), }; let mut test = SystemParaToParaTest::new(test_args); @@ -362,7 +362,7 @@ fn reserve_transfer_native_asset_from_para_to_system_para() { let test_args = TestContext { sender: PenpalBSender::get(), receiver: AssetHubWestendReceiver::get(), - args: para_test_args(destination, beneficiary_id, amount_to_send, assets, None, 0), + args: TestArgs::new_para(destination, beneficiary_id, amount_to_send, assets, None, 0), }; let mut test = ParaToSystemParaTest::new(test_args); @@ -443,7 +443,7 @@ fn reserve_transfer_assets_from_system_para_to_para() { let para_test_args = TestContext { sender: AssetHubWestendSender::get(), receiver: PenpalBReceiver::get(), - args: para_test_args( + args: TestArgs::new_para( destination, beneficiary_id, asset_amount_to_send, diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/teleport.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/teleport.rs index 2dd68ae3a83..27a6e7aaaf4 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/teleport.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/teleport.rs @@ -303,7 +303,7 @@ fn limited_teleport_native_assets_from_relay_to_system_para_works() { let test_args = TestContext { sender: WestendSender::get(), receiver: beneficiary.clone(), - args: relay_test_args(dest, beneficiary, amount_to_send), + args: TestArgs::new_relay(dest, beneficiary, amount_to_send), }; let mut test = RelayToSystemParaTest::new(test_args); @@ -347,7 +347,7 @@ fn limited_teleport_native_assets_back_from_system_para_to_relay_works() { let test_args = TestContext { sender: AssetHubWestendSender::get(), receiver: WestendReceiver::get(), - args: para_test_args(destination, beneficiary_id, amount_to_send, assets, None, 0), + args: TestArgs::new_para(destination, beneficiary_id, amount_to_send, assets, None, 0), }; let mut test = SystemParaToRelayTest::new(test_args); @@ -388,7 +388,7 @@ fn limited_teleport_native_assets_from_system_para_to_relay_fails() { let test_args = TestContext { sender: AssetHubWestendSender::get(), receiver: WestendReceiver::get(), - args: para_test_args(destination, beneficiary_id, amount_to_send, assets, None, 0), + args: TestArgs::new_para(destination, beneficiary_id, amount_to_send, assets, None, 0), }; let mut test = SystemParaToRelayTest::new(test_args); @@ -426,7 +426,7 @@ fn teleport_native_assets_from_relay_to_system_para_works() { let test_args = TestContext { sender: WestendSender::get(), receiver: beneficiary.clone(), - args: relay_test_args(dest, beneficiary, amount_to_send), + args: TestArgs::new_relay(dest, beneficiary, amount_to_send), }; let mut test = RelayToSystemParaTest::new(test_args); @@ -470,7 +470,7 @@ fn teleport_native_assets_back_from_system_para_to_relay_works() { let test_args = TestContext { sender: AssetHubWestendSender::get(), receiver: WestendReceiver::get(), - args: para_test_args(destination, beneficiary_id, amount_to_send, assets, None, 0), + args: TestArgs::new_para(destination, beneficiary_id, amount_to_send, assets, None, 0), }; let mut test = SystemParaToRelayTest::new(test_args); @@ -511,7 +511,7 @@ fn teleport_native_assets_from_system_para_to_relay_fails() { let test_args = TestContext { sender: AssetHubWestendSender::get(), receiver: WestendReceiver::get(), - args: para_test_args(destination, beneficiary_id, amount_to_send, assets, None, 0), + args: TestArgs::new_para(destination, beneficiary_id, amount_to_send, assets, None, 0), }; let mut test = SystemParaToRelayTest::new(test_args); @@ -595,7 +595,7 @@ fn bidirectional_teleport_foreign_assets_between_para_and_asset_hub() { let penpal_to_ah_test_args = TestContext { sender: PenpalBSender::get(), receiver: AssetHubWestendReceiver::get(), - args: para_test_args( + args: TestArgs::new_para( ah_as_seen_by_penpal, penpal_to_ah_beneficiary_id, asset_amount_to_send, @@ -687,7 +687,7 @@ fn bidirectional_teleport_foreign_assets_between_para_and_asset_hub() { let ah_to_penpal_test_args = TestContext { sender: AssetHubWestendSender::get(), receiver: PenpalBReceiver::get(), - args: para_test_args( + args: TestArgs::new_para( penpal_as_seen_by_ah, ah_to_penpal_beneficiary_id, asset_amount_to_send, diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/Cargo.toml new file mode 100644 index 00000000000..f6f1e24c550 --- /dev/null +++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/Cargo.toml @@ -0,0 +1,38 @@ +[package] +name = "people-rococo-integration-tests" +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license = "Apache-2.0" +description = "People Rococo runtime integration tests with xcm-emulator" +publish = false + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.4.0", default-features = false } +assert_matches = "1.5.0" + +# Substrate +sp-runtime = { path = "../../../../../../../substrate/primitives/runtime", default-features = false } +frame-support = { path = "../../../../../../../substrate/frame/support", default-features = false } +pallet-balances = { path = "../../../../../../../substrate/frame/balances", default-features = false } +pallet-assets = { path = "../../../../../../../substrate/frame/assets", default-features = false } +pallet-asset-conversion = { path = "../../../../../../../substrate/frame/asset-conversion", default-features = false } +pallet-message-queue = { path = "../../../../../../../substrate/frame/message-queue", default-features = false } +pallet-identity = { path = "../../../../../../../substrate/frame/identity", default-features = false } + +# Polkadot +xcm = { package = "staging-xcm", path = "../../../../../../../polkadot/xcm", default-features = false } +pallet-xcm = { path = "../../../../../../../polkadot/xcm/pallet-xcm", default-features = false } +xcm-executor = { package = "staging-xcm-executor", path = "../../../../../../../polkadot/xcm/xcm-executor", default-features = false } +rococo-runtime = { path = "../../../../../../../polkadot/runtime/rococo" } +rococo-runtime-constants = { path = "../../../../../../../polkadot/runtime/rococo/constants" } +polkadot-primitives = { path = "../../../../../../../polkadot/primitives" } +polkadot-runtime-common = { path = "../../../../../../../polkadot/runtime/common" } + +# Cumulus +asset-test-utils = { path = "../../../../../runtimes/assets/test-utils" } +parachains-common = { path = "../../../../../../parachains/common" } +people-rococo-runtime = { path = "../../../../../runtimes/people/people-rococo" } +emulated-integration-tests-common = { path = "../../../common", default-features = false } +penpal-runtime = { path = "../../../../../runtimes/testing/penpal" } +rococo-system-emulated-network = { path = "../../../networks/rococo-system" } diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/lib.rs b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/lib.rs new file mode 100644 index 00000000000..6f2f1409135 --- /dev/null +++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/lib.rs @@ -0,0 +1,64 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +pub use codec::Encode; + +// Substrate +pub use frame_support::{ + assert_err, assert_ok, + pallet_prelude::Weight, + sp_runtime::{AccountId32, DispatchError, DispatchResult}, + traits::fungibles::Inspect, +}; + +// Polkadot +pub use xcm::{ + prelude::{AccountId32 as AccountId32Junction, *}, + v3::{Error, NetworkId::Rococo as RococoId}, +}; + +// Cumulus +pub use asset_test_utils::xcm_helpers; +pub use emulated_integration_tests_common::{ + test_parachain_is_trusted_teleporter, + xcm_emulator::{ + assert_expected_events, bx, helpers::weight_within_threshold, Chain, Parachain as Para, + RelayChain as Relay, Test, TestArgs, TestContext, TestExt, + }, + xcm_helpers::{xcm_transact_paid_execution, xcm_transact_unpaid_execution}, + PROOF_SIZE_THRESHOLD, REF_TIME_THRESHOLD, XCM_V3, +}; +pub use parachains_common::{AccountId, Balance}; +pub use rococo_system_emulated_network::{ + people_rococo_emulated_chain::{ + genesis::ED as PEOPLE_ROCOCO_ED, PeopleRococoParaPallet as PeopleRococoPallet, + }, + rococo_emulated_chain::{genesis::ED as ROCOCO_ED, RococoRelayPallet as RococoPallet}, + PenpalAPara as PenpalA, PeopleRococoPara as PeopleRococo, + PeopleRococoParaReceiver as PeopleRococoReceiver, PeopleRococoParaSender as PeopleRococoSender, + RococoRelay as Rococo, RococoRelayReceiver as RococoReceiver, + RococoRelaySender as RococoSender, +}; + +// pub const ASSET_ID: u32 = 1; +// pub const ASSET_MIN_BALANCE: u128 = 1000; +pub type RelayToSystemParaTest = Test; +pub type RelayToParaTest = Test; +pub type SystemParaToRelayTest = Test; +pub type SystemParaToParaTest = Test; +pub type ParaToSystemParaTest = Test; + +#[cfg(test)] +mod tests; diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/mod.rs b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/mod.rs new file mode 100644 index 00000000000..80c00021ca5 --- /dev/null +++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/mod.rs @@ -0,0 +1,17 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +mod reap_identity; +mod teleport; diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/reap_identity.rs b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/reap_identity.rs new file mode 100644 index 00000000000..31144588ef4 --- /dev/null +++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/reap_identity.rs @@ -0,0 +1,549 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! # OnReapIdentity Tests +//! +//! This file contains the test cases for migrating Identity data away from the Rococo Relay +//! chain and to the PeopleRococo parachain. This migration is part of the broader Minimal Relay +//! effort: +//! https://github.com/polkadot-fellows/RFCs/blob/main/text/0032-minimal-relay.md +//! +//! ## Overview +//! +//! The tests validate the robustness and correctness of the `OnReapIdentityHandler` +//! ensuring that it behaves as expected in various scenarios. Key aspects tested include: +//! +//! - **Deposit Handling**: Confirming that deposits are correctly migrated from the Relay Chain to +//! the People parachain in various scenarios (different `IdentityInfo` fields and different +//! numbers of sub-accounts). +//! +//! ### Test Scenarios +//! +//! The tests are categorized into several scenarios, each resulting in different deposits required +//! on the destination parachain. The tests ensure: +//! +//! - Reserved deposits on the Relay Chain are fully released; +//! - The freed deposit from the Relay Chain is sufficient for the parachain deposit; and +//! - The account will exist on the parachain. + +use crate::*; +use frame_support::BoundedVec; +use pallet_balances::Event as BalancesEvent; +use pallet_identity::{legacy::IdentityInfo, Data, Event as IdentityEvent}; +use people_rococo_runtime::people::{ + BasicDeposit as BasicDepositParachain, ByteDeposit as ByteDepositParachain, + IdentityInfo as IdentityInfoParachain, SubAccountDeposit as SubAccountDepositParachain, +}; +use rococo_runtime::{ + BasicDeposit, ByteDeposit, MaxAdditionalFields, MaxSubAccounts, RuntimeOrigin as RococoOrigin, + SubAccountDeposit, +}; +use rococo_runtime_constants::currency::*; +use rococo_system_emulated_network::{ + rococo_emulated_chain::RococoRelayPallet, RococoRelay, RococoRelaySender, +}; + +type Balance = u128; +type RococoIdentity = ::Identity; +type RococoBalances = ::Balances; +type RococoIdentityMigrator = ::IdentityMigrator; +type PeopleRococoIdentity = ::Identity; +type PeopleRococoBalances = ::Balances; + +#[derive(Clone, Debug)] +struct Identity { + relay: IdentityInfo, + para: IdentityInfoParachain, + subs: Subs, +} + +impl Identity { + fn new( + full: bool, + additional: Option>, + subs: Subs, + ) -> Self { + let pgp_fingerprint = [ + 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, + 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, + ]; + let make_data = |data: &[u8], full: bool| -> Data { + if full { + Data::Raw(data.to_vec().try_into().unwrap()) + } else { + Data::None + } + }; + let (github, discord) = additional + .as_ref() + .and_then(|vec| vec.get(0)) + .map(|(g, d)| (g.clone(), d.clone())) + .unwrap_or((Data::None, Data::None)); + Self { + relay: IdentityInfo { + display: make_data(b"xcm-test", full), + legal: make_data(b"The Xcm Test, Esq.", full), + web: make_data(b"https://xcm-test.io", full), + riot: make_data(b"xcm-riot", full), + email: make_data(b"xcm-test@gmail.com", full), + pgp_fingerprint: Some(pgp_fingerprint), + image: make_data(b"xcm-test.png", full), + twitter: make_data(b"@xcm-test", full), + additional: additional.unwrap_or_default(), + }, + para: IdentityInfoParachain { + display: make_data(b"xcm-test", full), + legal: make_data(b"The Xcm Test, Esq.", full), + web: make_data(b"https://xcm-test.io", full), + matrix: make_data(b"xcm-matrix@server", full), + email: make_data(b"xcm-test@gmail.com", full), + pgp_fingerprint: Some(pgp_fingerprint), + image: make_data(b"xcm-test.png", full), + twitter: make_data(b"@xcm-test", full), + github, + discord, + }, + subs, + } + } +} + +#[derive(Clone, Debug)] +enum Subs { + Zero, + Many(u32), +} + +enum IdentityOn<'a> { + Relay(&'a IdentityInfo), + Para(&'a IdentityInfoParachain), +} + +impl IdentityOn<'_> { + fn calculate_deposit(self) -> Balance { + match self { + IdentityOn::Relay(id) => { + let base_deposit = BasicDeposit::get(); + let byte_deposit = + ByteDeposit::get() * TryInto::::try_into(id.encoded_size()).unwrap(); + base_deposit + byte_deposit + }, + IdentityOn::Para(id) => { + let base_deposit = BasicDepositParachain::get(); + let byte_deposit = ByteDepositParachain::get() * + TryInto::::try_into(id.encoded_size()).unwrap(); + base_deposit + byte_deposit + }, + } + } +} + +/// Generate an `AccountId32` from a `u32`. +/// This creates a 32-byte array, initially filled with `255`, and then repeatedly fills it +/// with the 4-byte little-endian representation of the `u32` value, until the array is full. +/// +/// **Example**: +/// +/// `account_from_u32(5)` will return an `AccountId32` with the bytes +/// `[0, 5, 0, 0, 0, 0, 0, 0, 0, 5 ... ]` +fn account_from_u32(id: u32) -> AccountId32 { + let mut buffer = [255u8; 32]; + let id_bytes = id.to_le_bytes(); + let id_size = id_bytes.len(); + for chunk in buffer.chunks_mut(id_size) { + chunk.clone_from_slice(&id_bytes); + } + AccountId32::new(buffer) +} + +// Set up the Relay Chain with an identity. +fn set_id_relay(id: &Identity) -> Balance { + let mut total_deposit: Balance = 0; + + // Set identity and Subs on Relay Chain + RococoRelay::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + + assert_ok!(RococoIdentity::set_identity( + RococoOrigin::signed(RococoRelaySender::get()), + Box::new(id.relay.clone()) + )); + + if let Subs::Many(n) = id.subs { + let subs: Vec<_> = (0..n) + .map(|i| (account_from_u32(i), Data::Raw(b"name".to_vec().try_into().unwrap()))) + .collect(); + + assert_ok!(RococoIdentity::set_subs( + RococoOrigin::signed(RococoRelaySender::get()), + subs, + )); + } + + let reserved_balance = RococoBalances::reserved_balance(RococoRelaySender::get()); + let id_deposit = IdentityOn::Relay(&id.relay).calculate_deposit(); + + let total_deposit = match id.subs { + Subs::Zero => { + total_deposit = id_deposit; // No subs + assert_expected_events!( + RococoRelay, + vec![ + RuntimeEvent::Identity(IdentityEvent::IdentitySet { .. }) => {}, + RuntimeEvent::Balances(BalancesEvent::Reserved { who, amount }) => { + who: *who == RococoRelaySender::get(), + amount: *amount == id_deposit, + }, + ] + ); + total_deposit + }, + Subs::Many(n) => { + let sub_account_deposit = n as Balance * SubAccountDeposit::get(); + total_deposit = + sub_account_deposit + IdentityOn::Relay(&id.relay).calculate_deposit(); + assert_expected_events!( + RococoRelay, + vec![ + RuntimeEvent::Identity(IdentityEvent::IdentitySet { .. }) => {}, + RuntimeEvent::Balances(BalancesEvent::Reserved { who, amount }) => { + who: *who == RococoRelaySender::get(), + amount: *amount == id_deposit, + }, + RuntimeEvent::Balances(BalancesEvent::Reserved { who, amount }) => { + who: *who == RococoRelaySender::get(), + amount: *amount == sub_account_deposit, + }, + ] + ); + total_deposit + }, + }; + + assert_eq!(reserved_balance, total_deposit); + }); + total_deposit +} + +// Set up the parachain with an identity and (maybe) sub accounts, but with zero deposits. +fn assert_set_id_parachain(id: &Identity) { + // Set identity and Subs on Parachain with zero deposit + PeopleRococo::execute_with(|| { + let free_bal = PeopleRococoBalances::free_balance(PeopleRococoSender::get()); + let reserved_balance = PeopleRococoBalances::reserved_balance(PeopleRococoSender::get()); + + // total balance at Genesis should be zero + assert_eq!(reserved_balance + free_bal, 0); + + assert_ok!(PeopleRococoIdentity::set_identity_no_deposit( + &PeopleRococoSender::get(), + id.para.clone(), + )); + + match id.subs { + Subs::Zero => {}, + Subs::Many(n) => { + let subs: Vec<_> = (0..n) + .map(|ii| { + (account_from_u32(ii), Data::Raw(b"name".to_vec().try_into().unwrap())) + }) + .collect(); + assert_ok!(PeopleRococoIdentity::set_subs_no_deposit( + &PeopleRococoSender::get(), + subs, + )); + }, + } + + // No amount should be reserved as deposit amounts are set to 0. + let reserved_balance = PeopleRococoBalances::reserved_balance(PeopleRococoSender::get()); + assert_eq!(reserved_balance, 0); + assert!(PeopleRococoIdentity::identity(PeopleRococoSender::get()).is_some()); + + let (_, sub_accounts) = PeopleRococoIdentity::subs_of(PeopleRococoSender::get()); + + match id.subs { + Subs::Zero => assert_eq!(sub_accounts.len(), 0), + Subs::Many(n) => assert_eq!(sub_accounts.len(), n as usize), + } + }); +} + +// Reap the identity on the Relay Chain and assert that the correct things happen there. +fn assert_reap_id_relay(total_deposit: Balance, id: &Identity) { + RococoRelay::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + let free_bal_before_reap = RococoBalances::free_balance(RococoRelaySender::get()); + let reserved_balance = RococoBalances::reserved_balance(RococoRelaySender::get()); + + assert_eq!(reserved_balance, total_deposit); + + assert_ok!(RococoIdentityMigrator::reap_identity( + RococoOrigin::root(), + RococoRelaySender::get() + )); + + let remote_deposit = match id.subs { + Subs::Zero => calculate_remote_deposit(id.relay.encoded_size() as u32, 0), + Subs::Many(n) => calculate_remote_deposit(id.relay.encoded_size() as u32, n), + }; + + assert_expected_events!( + RococoRelay, + vec![ + // `reap_identity` sums the identity and subs deposits and unreserves them in one + // call. Therefore, we only expect one `Unreserved` event. + RuntimeEvent::Balances(BalancesEvent::Unreserved { who, amount }) => { + who: *who == RococoRelaySender::get(), + amount: *amount == total_deposit, + }, + RuntimeEvent::IdentityMigrator( + polkadot_runtime_common::identity_migrator::Event::IdentityReaped { + who, + }) => { + who: *who == PeopleRococoSender::get(), + }, + ] + ); + // Identity should be gone. + assert!(PeopleRococoIdentity::identity(RococoRelaySender::get()).is_none()); + + // Subs should be gone. + let (_, sub_accounts) = RococoIdentity::subs_of(RococoRelaySender::get()); + assert_eq!(sub_accounts.len(), 0); + + let reserved_balance = RococoBalances::reserved_balance(RococoRelaySender::get()); + assert_eq!(reserved_balance, 0); + + // Free balance should be greater (i.e. the teleport should work even if 100% of an + // account's balance is reserved for Identity). + let free_bal_after_reap = RococoBalances::free_balance(RococoRelaySender::get()); + assert!(free_bal_after_reap > free_bal_before_reap); + + // Implicit: total_deposit > remote_deposit. As in, accounts should always have enough + // reserved for the parachain deposit. + assert_eq!(free_bal_after_reap, free_bal_before_reap + total_deposit - remote_deposit); + }); +} + +// Reaping the identity on the Relay Chain will have sent an XCM program to the parachain. Ensure +// that everything happens as expected. +fn assert_reap_parachain(id: &Identity) { + PeopleRococo::execute_with(|| { + let reserved_balance = PeopleRococoBalances::reserved_balance(PeopleRococoSender::get()); + let id_deposit = IdentityOn::Para(&id.para).calculate_deposit(); + let total_deposit = match id.subs { + Subs::Zero => id_deposit, + Subs::Many(n) => id_deposit + n as Balance * SubAccountDepositParachain::get(), + }; + assert_reap_events(id_deposit, id); + assert_eq!(reserved_balance, total_deposit); + + // Should have at least one ED after in free balance after the reap. + assert!(PeopleRococoBalances::free_balance(PeopleRococoSender::get()) >= PEOPLE_ROCOCO_ED); + }); +} + +// Assert the events that should happen on the parachain upon reaping an identity on the Relay +// Chain. +fn assert_reap_events(id_deposit: Balance, id: &Identity) { + type RuntimeEvent = ::RuntimeEvent; + match id.subs { + Subs::Zero => { + assert_expected_events!( + PeopleRococo, + vec![ + // Deposit and Endowed from teleport + RuntimeEvent::Balances(BalancesEvent::Deposit { .. }) => {}, + RuntimeEvent::Balances(BalancesEvent::Endowed { .. }) => {}, + // Amount reserved for identity info + RuntimeEvent::Balances(BalancesEvent::Reserved { who, amount }) => { + who: *who == PeopleRococoSender::get(), + amount: *amount == id_deposit, + }, + // Confirmation from Migrator with individual identity and subs deposits + RuntimeEvent::IdentityMigrator( + polkadot_runtime_common::identity_migrator::Event::DepositUpdated { + who, identity, subs + }) => { + who: *who == PeopleRococoSender::get(), + identity: *identity == id_deposit, + subs: *subs == 0, + }, + RuntimeEvent::MessageQueue(pallet_message_queue::Event::Processed { .. }) => {}, + ] + ); + }, + Subs::Many(n) => { + let subs_deposit = n as Balance * SubAccountDepositParachain::get(); + assert_expected_events!( + PeopleRococo, + vec![ + // Deposit and Endowed from teleport + RuntimeEvent::Balances(BalancesEvent::Deposit { .. }) => {}, + RuntimeEvent::Balances(BalancesEvent::Endowed { .. }) => {}, + // Amount reserved for identity info + RuntimeEvent::Balances(BalancesEvent::Reserved { who, amount }) => { + who: *who == PeopleRococoSender::get(), + amount: *amount == id_deposit, + }, + // Amount reserved for subs + RuntimeEvent::Balances(BalancesEvent::Reserved { who, amount }) => { + who: *who == PeopleRococoSender::get(), + amount: *amount == subs_deposit, + }, + // Confirmation from Migrator with individual identity and subs deposits + RuntimeEvent::IdentityMigrator( + polkadot_runtime_common::identity_migrator::Event::DepositUpdated { + who, identity, subs + }) => { + who: *who == PeopleRococoSender::get(), + identity: *identity == id_deposit, + subs: *subs == subs_deposit, + }, + RuntimeEvent::MessageQueue(pallet_message_queue::Event::Processed { .. }) => {}, + ] + ); + }, + }; +} + +/// Duplicate of the impl of `ToParachainIdentityReaper` in the Rococo runtime. +fn calculate_remote_deposit(bytes: u32, subs: u32) -> Balance { + // Note: These `deposit` functions and `EXISTENTIAL_DEPOSIT` correspond to the Relay Chain's. + // Pulled in: use rococo_runtime_constants::currency::*; + let para_basic_deposit = deposit(1, 17) / 100; + let para_byte_deposit = deposit(0, 1) / 100; + let para_sub_account_deposit = deposit(1, 53) / 100; + let para_existential_deposit = EXISTENTIAL_DEPOSIT / 10; + + // pallet deposits + let id_deposit = + para_basic_deposit.saturating_add(para_byte_deposit.saturating_mul(bytes as Balance)); + let subs_deposit = para_sub_account_deposit.saturating_mul(subs as Balance); + + id_deposit + .saturating_add(subs_deposit) + .saturating_add(para_existential_deposit.saturating_mul(2)) +} + +// Represent some `additional` data that would not be migrated to the parachain. The encoded size, +// and thus the byte deposit, should decrease. +fn nonsensical_additional() -> BoundedVec<(Data, Data), MaxAdditionalFields> { + BoundedVec::try_from(vec![( + Data::Raw(b"fOo".to_vec().try_into().unwrap()), + Data::Raw(b"baR".to_vec().try_into().unwrap()), + )]) + .unwrap() +} + +// Represent some `additional` data that will be migrated to the parachain as first-class fields. +fn meaningful_additional() -> BoundedVec<(Data, Data), MaxAdditionalFields> { + BoundedVec::try_from(vec![ + ( + Data::Raw(b"github".to_vec().try_into().unwrap()), + Data::Raw(b"niels-username".to_vec().try_into().unwrap()), + ), + ( + Data::Raw(b"discord".to_vec().try_into().unwrap()), + Data::Raw(b"bohr-username".to_vec().try_into().unwrap()), + ), + ]) + .unwrap() +} + +// Execute a single test case. +fn assert_relay_para_flow(id: &Identity) { + let total_deposit = set_id_relay(id); + assert_set_id_parachain(id); + assert_reap_id_relay(total_deposit, id); + assert_reap_parachain(id); +} + +// Tests with empty `IdentityInfo`. + +#[test] +fn on_reap_identity_works_for_minimal_identity_with_zero_subs() { + assert_relay_para_flow(&Identity::new(false, None, Subs::Zero)); +} + +#[test] +fn on_reap_identity_works_for_minimal_identity() { + assert_relay_para_flow(&Identity::new(false, None, Subs::Many(1))); +} + +#[test] +fn on_reap_identity_works_for_minimal_identity_with_max_subs() { + assert_relay_para_flow(&Identity::new(false, None, Subs::Many(MaxSubAccounts::get()))); +} + +// Tests with full `IdentityInfo`. + +#[test] +fn on_reap_identity_works_for_full_identity_no_additional_zero_subs() { + assert_relay_para_flow(&Identity::new(true, None, Subs::Zero)); +} + +#[test] +fn on_reap_identity_works_for_full_identity_no_additional() { + assert_relay_para_flow(&Identity::new(true, None, Subs::Many(1))); +} + +#[test] +fn on_reap_identity_works_for_full_identity_no_additional_max_subs() { + assert_relay_para_flow(&Identity::new(true, None, Subs::Many(MaxSubAccounts::get()))); +} + +// Tests with full `IdentityInfo` and `additional` fields that will _not_ be migrated. + +#[test] +fn on_reap_identity_works_for_full_identity_nonsense_additional_zero_subs() { + assert_relay_para_flow(&Identity::new(true, Some(nonsensical_additional()), Subs::Zero)); +} + +#[test] +fn on_reap_identity_works_for_full_identity_nonsense_additional() { + assert_relay_para_flow(&Identity::new(true, Some(nonsensical_additional()), Subs::Many(1))); +} + +#[test] +fn on_reap_identity_works_for_full_identity_nonsense_additional_max_subs() { + assert_relay_para_flow(&Identity::new( + true, + Some(nonsensical_additional()), + Subs::Many(MaxSubAccounts::get()), + )); +} + +// Tests with full `IdentityInfo` and `additional` fields that will be migrated. + +#[test] +fn on_reap_identity_works_for_full_identity_meaningful_additional_zero_subs() { + assert_relay_para_flow(&Identity::new(true, Some(meaningful_additional()), Subs::Zero)); +} + +#[test] +fn on_reap_identity_works_for_full_identity_meaningful_additional() { + assert_relay_para_flow(&Identity::new(true, Some(meaningful_additional()), Subs::Many(1))); +} + +#[test] +fn on_reap_identity_works_for_full_identity_meaningful_additional_max_subs() { + assert_relay_para_flow(&Identity::new( + true, + Some(meaningful_additional()), + Subs::Many(MaxSubAccounts::get()), + )); +} diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/teleport.rs b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/teleport.rs new file mode 100644 index 00000000000..42c7e310b26 --- /dev/null +++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/teleport.rs @@ -0,0 +1,260 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use crate::*; +use people_rococo_runtime::xcm_config::XcmConfig as PeopleRococoXcmConfig; +use rococo_runtime::xcm_config::XcmConfig as RococoXcmConfig; + +fn relay_origin_assertions(t: RelayToSystemParaTest) { + type RuntimeEvent = ::RuntimeEvent; + Rococo::assert_xcm_pallet_attempted_complete(Some(Weight::from_parts(627_959_000, 7_200))); + + assert_expected_events!( + Rococo, + vec![ + // Amount to teleport is withdrawn from Sender + RuntimeEvent::Balances(pallet_balances::Event::Withdraw { who, amount }) => { + who: *who == t.sender.account_id, + amount: *amount == t.args.amount, + }, + // Amount to teleport is deposited in Relay's `CheckAccount` + RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, amount }) => { + who: *who == ::XcmPallet::check_account(), + amount: *amount == t.args.amount, + }, + ] + ); +} + +fn relay_dest_assertions(t: SystemParaToRelayTest) { + type RuntimeEvent = ::RuntimeEvent; + + Rococo::assert_ump_queue_processed( + true, + Some(PeopleRococo::para_id()), + Some(Weight::from_parts(304_266_000, 7_186)), + ); + + assert_expected_events!( + Rococo, + vec![ + // Amount is withdrawn from Relay Chain's `CheckAccount` + RuntimeEvent::Balances(pallet_balances::Event::Withdraw { who, amount }) => { + who: *who == ::XcmPallet::check_account(), + amount: *amount == t.args.amount, + }, + // Amount minus fees are deposited in Receiver's account + RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, .. }) => { + who: *who == t.receiver.account_id, + }, + ] + ); +} + +fn relay_dest_assertions_fail(_t: SystemParaToRelayTest) { + Rococo::assert_ump_queue_processed( + false, + Some(PeopleRococo::para_id()), + Some(Weight::from_parts(157_718_000, 3_593)), + ); +} + +fn para_origin_assertions(t: SystemParaToRelayTest) { + type RuntimeEvent = ::RuntimeEvent; + + PeopleRococo::assert_xcm_pallet_attempted_complete(Some(Weight::from_parts( + 600_000_000, + 7_000, + ))); + + PeopleRococo::assert_parachain_system_ump_sent(); + + assert_expected_events!( + PeopleRococo, + vec![ + // Amount is withdrawn from Sender's account + RuntimeEvent::Balances(pallet_balances::Event::Withdraw { who, amount }) => { + who: *who == t.sender.account_id, + amount: *amount == t.args.amount, + }, + ] + ); +} + +fn para_dest_assertions(t: RelayToSystemParaTest) { + type RuntimeEvent = ::RuntimeEvent; + + PeopleRococo::assert_dmp_queue_complete(Some(Weight::from_parts(162_456_000, 0))); + + assert_expected_events!( + PeopleRococo, + vec![ + // Amount minus fees are deposited in Receiver's account + RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, .. }) => { + who: *who == t.receiver.account_id, + }, + ] + ); +} + +fn relay_limited_teleport_assets(t: RelayToSystemParaTest) -> DispatchResult { + ::XcmPallet::limited_teleport_assets( + t.signed_origin, + bx!(t.args.dest.into()), + bx!(t.args.beneficiary.into()), + bx!(t.args.assets.into()), + t.args.fee_asset_item, + t.args.weight_limit, + ) +} + +fn system_para_limited_teleport_assets(t: SystemParaToRelayTest) -> DispatchResult { + ::PolkadotXcm::limited_teleport_assets( + t.signed_origin, + bx!(t.args.dest.into()), + bx!(t.args.beneficiary.into()), + bx!(t.args.assets.into()), + t.args.fee_asset_item, + t.args.weight_limit, + ) +} + +/// Limited Teleport of native asset from Relay Chain to the System Parachain should work +#[test] +fn limited_teleport_native_assets_from_relay_to_system_para_works() { + // Init values for Relay Chain + let amount_to_send: Balance = ROCOCO_ED * 1000; + let dest = Rococo::child_location_of(PeopleRococo::para_id()); + let beneficiary_id = PeopleRococoReceiver::get(); + let test_args = TestContext { + sender: RococoSender::get(), + receiver: PeopleRococoReceiver::get(), + args: TestArgs::new_relay(dest, beneficiary_id, amount_to_send), + }; + + let mut test = RelayToSystemParaTest::new(test_args); + + let sender_balance_before = test.sender.balance; + let receiver_balance_before = test.receiver.balance; + + test.set_assertion::(relay_origin_assertions); + test.set_assertion::(para_dest_assertions); + test.set_dispatchable::(relay_limited_teleport_assets); + test.assert(); + + let delivery_fees = Rococo::execute_with(|| { + xcm_helpers::transfer_assets_delivery_fees::< + ::XcmSender, + >(test.args.assets.clone(), 0, test.args.weight_limit, test.args.beneficiary, test.args.dest) + }); + + let sender_balance_after = test.sender.balance; + let receiver_balance_after = test.receiver.balance; + + // Sender's balance is reduced + assert_eq!(sender_balance_before - amount_to_send - delivery_fees, sender_balance_after); + // Receiver's balance is increased + assert!(receiver_balance_after > receiver_balance_before); +} + +/// Limited Teleport of native asset from System Parachain to Relay Chain +/// should work when there is enough balance in Relay Chain's `CheckAccount` +#[test] +fn limited_teleport_native_assets_back_from_system_para_to_relay_works() { + // Dependency - Relay Chain's `CheckAccount` should have enough balance + limited_teleport_native_assets_from_relay_to_system_para_works(); + + let amount_to_send: Balance = PEOPLE_ROCOCO_ED * 1000; + let destination = PeopleRococo::parent_location(); + let beneficiary_id = RococoReceiver::get(); + let assets = (Parent, amount_to_send).into(); + + // Fund a sender + PeopleRococo::fund_accounts(vec![(PeopleRococoSender::get(), ROCOCO_ED * 2_000u128)]); + + let test_args = TestContext { + sender: PeopleRococoSender::get(), + receiver: RococoReceiver::get(), + args: TestArgs::new_para(destination, beneficiary_id, amount_to_send, assets, None, 0), + }; + + let mut test = SystemParaToRelayTest::new(test_args); + + let sender_balance_before = test.sender.balance; + let receiver_balance_before = test.receiver.balance; + + test.set_assertion::(para_origin_assertions); + test.set_assertion::(relay_dest_assertions); + test.set_dispatchable::(system_para_limited_teleport_assets); + test.assert(); + + let sender_balance_after = test.sender.balance; + let receiver_balance_after = test.receiver.balance; + + let delivery_fees = PeopleRococo::execute_with(|| { + xcm_helpers::transfer_assets_delivery_fees::< + ::XcmSender, + >(test.args.assets.clone(), 0, test.args.weight_limit, test.args.beneficiary, test.args.dest) + }); + + // Sender's balance is reduced + assert_eq!(sender_balance_before - amount_to_send - delivery_fees, sender_balance_after); + // Receiver's balance is increased + assert!(receiver_balance_after > receiver_balance_before); +} + +/// Limited Teleport of native asset from System Parachain to Relay Chain +/// should't work when there is not enough balance in Relay Chain's `CheckAccount` +#[test] +fn limited_teleport_native_assets_from_system_para_to_relay_fails() { + // Init values for Relay Chain + let amount_to_send: Balance = ROCOCO_ED * 1000; + let destination = PeopleRococo::parent_location(); + let beneficiary_id = RococoReceiver::get(); + let assets = (Parent, amount_to_send).into(); + + // Fund a sender + PeopleRococo::fund_accounts(vec![(PeopleRococoSender::get(), ROCOCO_ED * 2_000u128)]); + + let test_args = TestContext { + sender: PeopleRococoSender::get(), + receiver: RococoReceiver::get(), + args: TestArgs::new_para(destination, beneficiary_id, amount_to_send, assets, None, 0), + }; + + let mut test = SystemParaToRelayTest::new(test_args); + + let sender_balance_before = test.sender.balance; + let receiver_balance_before = test.receiver.balance; + + test.set_assertion::(para_origin_assertions); + test.set_assertion::(relay_dest_assertions_fail); + test.set_dispatchable::(system_para_limited_teleport_assets); + test.assert(); + + let sender_balance_after = test.sender.balance; + let receiver_balance_after = test.receiver.balance; + + let delivery_fees = PeopleRococo::execute_with(|| { + xcm_helpers::transfer_assets_delivery_fees::< + ::XcmSender, + >(test.args.assets.clone(), 0, test.args.weight_limit, test.args.beneficiary, test.args.dest) + }); + + // Sender's balance is reduced + assert_eq!(sender_balance_before - amount_to_send - delivery_fees, sender_balance_after); + // Receiver's balance does not change + assert_eq!(receiver_balance_after, receiver_balance_before); +} diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/Cargo.toml new file mode 100644 index 00000000000..a5d9d6c0e30 --- /dev/null +++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/Cargo.toml @@ -0,0 +1,38 @@ +[package] +name = "people-westend-integration-tests" +version = "0.1.0" +authors.workspace = true +edition.workspace = true +license = "Apache-2.0" +description = "People Westend runtime integration tests with xcm-emulator" +publish = false + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.4.0", default-features = false } +assert_matches = "1.5.0" + +# Substrate +sp-runtime = { path = "../../../../../../../substrate/primitives/runtime", default-features = false } +frame-support = { path = "../../../../../../../substrate/frame/support", default-features = false } +pallet-balances = { path = "../../../../../../../substrate/frame/balances", default-features = false } +pallet-assets = { path = "../../../../../../../substrate/frame/assets", default-features = false } +pallet-asset-conversion = { path = "../../../../../../../substrate/frame/asset-conversion", default-features = false } +pallet-message-queue = { path = "../../../../../../../substrate/frame/message-queue", default-features = false } +pallet-identity = { path = "../../../../../../../substrate/frame/identity", default-features = false } + +# Polkadot +xcm = { package = "staging-xcm", path = "../../../../../../../polkadot/xcm", default-features = false } +pallet-xcm = { path = "../../../../../../../polkadot/xcm/pallet-xcm", default-features = false } +xcm-executor = { package = "staging-xcm-executor", path = "../../../../../../../polkadot/xcm/xcm-executor", default-features = false } +westend-runtime = { path = "../../../../../../../polkadot/runtime/westend" } +westend-runtime-constants = { path = "../../../../../../../polkadot/runtime/westend/constants" } +polkadot-primitives = { path = "../../../../../../../polkadot/primitives" } +polkadot-runtime-common = { path = "../../../../../../../polkadot/runtime/common" } + +# Cumulus +asset-test-utils = { path = "../../../../../runtimes/assets/test-utils" } +parachains-common = { path = "../../../../../../parachains/common" } +people-westend-runtime = { path = "../../../../../runtimes/people/people-westend" } +emulated-integration-tests-common = { path = "../../../common", default-features = false } +penpal-runtime = { path = "../../../../../runtimes/testing/penpal" } +westend-system-emulated-network = { path = "../../../networks/westend-system" } diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/lib.rs b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/lib.rs new file mode 100644 index 00000000000..59cec36030b --- /dev/null +++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/lib.rs @@ -0,0 +1,64 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +pub use codec::Encode; + +// Substrate +pub use frame_support::{ + assert_err, assert_ok, + pallet_prelude::Weight, + sp_runtime::{AccountId32, DispatchError, DispatchResult}, + traits::fungibles::Inspect, +}; + +// Polkadot +pub use xcm::{ + prelude::{AccountId32 as AccountId32Junction, *}, + v3::{Error, NetworkId::Westend as WestendId}, +}; + +// Cumulus +pub use asset_test_utils::xcm_helpers; +pub use emulated_integration_tests_common::{ + test_parachain_is_trusted_teleporter, + xcm_emulator::{ + assert_expected_events, bx, helpers::weight_within_threshold, Chain, Parachain as Para, + RelayChain as Relay, Test, TestArgs, TestContext, TestExt, + }, + xcm_helpers::{xcm_transact_paid_execution, xcm_transact_unpaid_execution}, + PROOF_SIZE_THRESHOLD, REF_TIME_THRESHOLD, XCM_V3, +}; +pub use parachains_common::{AccountId, Balance}; +pub use westend_system_emulated_network::{ + people_westend_emulated_chain::{ + genesis::ED as PEOPLE_WESTEND_ED, PeopleWestendParaPallet as PeopleWestendPallet, + }, + westend_emulated_chain::{genesis::ED as WESTEND_ED, WestendRelayPallet as WestendPallet}, + PenpalAPara as PenpalA, PeopleWestendPara as PeopleWestend, + PeopleWestendParaReceiver as PeopleWestendReceiver, + PeopleWestendParaSender as PeopleWestendSender, WestendRelay as Westend, + WestendRelayReceiver as WestendReceiver, WestendRelaySender as WestendSender, +}; + +// pub const ASSET_ID: u32 = 1; +// pub const ASSET_MIN_BALANCE: u128 = 1000; +pub type RelayToSystemParaTest = Test; +pub type RelayToParaTest = Test; +pub type SystemParaToRelayTest = Test; +pub type SystemParaToParaTest = Test; +pub type ParaToSystemParaTest = Test; + +#[cfg(test)] +mod tests; diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/mod.rs b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/mod.rs new file mode 100644 index 00000000000..80c00021ca5 --- /dev/null +++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/mod.rs @@ -0,0 +1,17 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +mod reap_identity; +mod teleport; diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/reap_identity.rs b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/reap_identity.rs new file mode 100644 index 00000000000..c704af281b3 --- /dev/null +++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/reap_identity.rs @@ -0,0 +1,551 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! # OnReapIdentity Tests +//! +//! This file contains the test cases for migrating Identity data away from the Westend Relay +//! chain and to the PeopleWestend parachain. This migration is part of the broader Minimal Relay +//! effort: +//! https://github.com/polkadot-fellows/RFCs/blob/main/text/0032-minimal-relay.md +//! +//! ## Overview +//! +//! The tests validate the robustness and correctness of the `OnReapIdentityHandler` +//! ensuring that it behaves as expected in various scenarios. Key aspects tested include: +//! +//! - **Deposit Handling**: Confirming that deposits are correctly migrated from the Relay Chain to +//! the People parachain in various scenarios (different `IdentityInfo` fields and different +//! numbers of sub-accounts). +//! +//! ### Test Scenarios +//! +//! The tests are categorized into several scenarios, each resulting in different deposits required +//! on the destination parachain. The tests ensure: +//! +//! - Reserved deposits on the Relay Chain are fully released; +//! - The freed deposit from the Relay Chain is sufficient for the parachain deposit; and +//! - The account will exist on the parachain. + +use crate::*; +use frame_support::BoundedVec; +use pallet_balances::Event as BalancesEvent; +use pallet_identity::{legacy::IdentityInfo, Data, Event as IdentityEvent}; +use people_westend_runtime::people::{ + BasicDeposit as BasicDepositParachain, ByteDeposit as ByteDepositParachain, + IdentityInfo as IdentityInfoParachain, SubAccountDeposit as SubAccountDepositParachain, +}; +use westend_runtime::{ + BasicDeposit, ByteDeposit, MaxAdditionalFields, MaxSubAccounts, RuntimeOrigin as WestendOrigin, + SubAccountDeposit, +}; +use westend_runtime_constants::currency::*; +use westend_system_emulated_network::{ + westend_emulated_chain::WestendRelayPallet, WestendRelay, WestendRelaySender, +}; + +type Balance = u128; +type WestendIdentity = ::Identity; +type WestendBalances = ::Balances; +type WestendIdentityMigrator = ::IdentityMigrator; +type PeopleWestendIdentity = ::Identity; +type PeopleWestendBalances = ::Balances; + +#[derive(Clone, Debug)] +struct Identity { + relay: IdentityInfo, + para: IdentityInfoParachain, + subs: Subs, +} + +impl Identity { + fn new( + full: bool, + additional: Option>, + subs: Subs, + ) -> Self { + let pgp_fingerprint = [ + 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, + 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, + ]; + let make_data = |data: &[u8], full: bool| -> Data { + if full { + Data::Raw(data.to_vec().try_into().unwrap()) + } else { + Data::None + } + }; + let (github, discord) = additional + .as_ref() + .and_then(|vec| vec.get(0)) + .map(|(g, d)| (g.clone(), d.clone())) + .unwrap_or((Data::None, Data::None)); + Self { + relay: IdentityInfo { + display: make_data(b"xcm-test", full), + legal: make_data(b"The Xcm Test, Esq.", full), + web: make_data(b"https://xcm-test.io", full), + riot: make_data(b"xcm-riot", full), + email: make_data(b"xcm-test@gmail.com", full), + pgp_fingerprint: Some(pgp_fingerprint), + image: make_data(b"xcm-test.png", full), + twitter: make_data(b"@xcm-test", full), + additional: additional.unwrap_or_default(), + }, + para: IdentityInfoParachain { + display: make_data(b"xcm-test", full), + legal: make_data(b"The Xcm Test, Esq.", full), + web: make_data(b"https://xcm-test.io", full), + matrix: make_data(b"xcm-matrix@server", full), + email: make_data(b"xcm-test@gmail.com", full), + pgp_fingerprint: Some(pgp_fingerprint), + image: make_data(b"xcm-test.png", full), + twitter: make_data(b"@xcm-test", full), + github, + discord, + }, + subs, + } + } +} + +#[derive(Clone, Debug)] +enum Subs { + Zero, + Many(u32), +} + +enum IdentityOn<'a> { + Relay(&'a IdentityInfo), + Para(&'a IdentityInfoParachain), +} + +impl IdentityOn<'_> { + fn calculate_deposit(self) -> Balance { + match self { + IdentityOn::Relay(id) => { + let base_deposit = BasicDeposit::get(); + let byte_deposit = + ByteDeposit::get() * TryInto::::try_into(id.encoded_size()).unwrap(); + base_deposit + byte_deposit + }, + IdentityOn::Para(id) => { + let base_deposit = BasicDepositParachain::get(); + let byte_deposit = ByteDepositParachain::get() * + TryInto::::try_into(id.encoded_size()).unwrap(); + base_deposit + byte_deposit + }, + } + } +} + +/// Generate an `AccountId32` from a `u32`. +/// This creates a 32-byte array, initially filled with `255`, and then repeatedly fills it +/// with the 4-byte little-endian representation of the `u32` value, until the array is full. +/// +/// **Example**: +/// +/// `account_from_u32(5)` will return an `AccountId32` with the bytes +/// `[0, 5, 0, 0, 0, 0, 0, 0, 0, 5 ... ]` +fn account_from_u32(id: u32) -> AccountId32 { + let mut buffer = [255u8; 32]; + let id_bytes = id.to_le_bytes(); + let id_size = id_bytes.len(); + for chunk in buffer.chunks_mut(id_size) { + chunk.clone_from_slice(&id_bytes); + } + AccountId32::new(buffer) +} + +// Set up the Relay Chain with an identity. +fn set_id_relay(id: &Identity) -> Balance { + let mut total_deposit: Balance = 0; + + // Set identity and Subs on Relay Chain + WestendRelay::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + + assert_ok!(WestendIdentity::set_identity( + WestendOrigin::signed(WestendRelaySender::get()), + Box::new(id.relay.clone()) + )); + + if let Subs::Many(n) = id.subs { + let subs: Vec<_> = (0..n) + .map(|i| (account_from_u32(i), Data::Raw(b"name".to_vec().try_into().unwrap()))) + .collect(); + + assert_ok!(WestendIdentity::set_subs( + WestendOrigin::signed(WestendRelaySender::get()), + subs, + )); + } + + let reserved_balance = WestendBalances::reserved_balance(WestendRelaySender::get()); + let id_deposit = IdentityOn::Relay(&id.relay).calculate_deposit(); + + let total_deposit = match id.subs { + Subs::Zero => { + total_deposit = id_deposit; // No subs + assert_expected_events!( + WestendRelay, + vec![ + RuntimeEvent::Identity(IdentityEvent::IdentitySet { .. }) => {}, + RuntimeEvent::Balances(BalancesEvent::Reserved { who, amount }) => { + who: *who == WestendRelaySender::get(), + amount: *amount == id_deposit, + }, + ] + ); + total_deposit + }, + Subs::Many(n) => { + let sub_account_deposit = n as Balance * SubAccountDeposit::get(); + total_deposit = + sub_account_deposit + IdentityOn::Relay(&id.relay).calculate_deposit(); + assert_expected_events!( + WestendRelay, + vec![ + RuntimeEvent::Identity(IdentityEvent::IdentitySet { .. }) => {}, + RuntimeEvent::Balances(BalancesEvent::Reserved { who, amount }) => { + who: *who == WestendRelaySender::get(), + amount: *amount == id_deposit, + }, + RuntimeEvent::Balances(BalancesEvent::Reserved { who, amount }) => { + who: *who == WestendRelaySender::get(), + amount: *amount == sub_account_deposit, + }, + ] + ); + total_deposit + }, + }; + + assert_eq!(reserved_balance, total_deposit); + }); + total_deposit +} + +// Set up the parachain with an identity and (maybe) sub accounts, but with zero deposits. +fn assert_set_id_parachain(id: &Identity) { + // Set identity and Subs on Parachain with zero deposit + PeopleWestend::execute_with(|| { + let free_bal = PeopleWestendBalances::free_balance(PeopleWestendSender::get()); + let reserved_balance = PeopleWestendBalances::reserved_balance(PeopleWestendSender::get()); + + // total balance at Genesis should be zero + assert_eq!(reserved_balance + free_bal, 0); + + assert_ok!(PeopleWestendIdentity::set_identity_no_deposit( + &PeopleWestendSender::get(), + id.para.clone(), + )); + + match id.subs { + Subs::Zero => {}, + Subs::Many(n) => { + let subs: Vec<_> = (0..n) + .map(|ii| { + (account_from_u32(ii), Data::Raw(b"name".to_vec().try_into().unwrap())) + }) + .collect(); + assert_ok!(PeopleWestendIdentity::set_subs_no_deposit( + &PeopleWestendSender::get(), + subs, + )); + }, + } + + // No amount should be reserved as deposit amounts are set to 0. + let reserved_balance = PeopleWestendBalances::reserved_balance(PeopleWestendSender::get()); + assert_eq!(reserved_balance, 0); + assert!(PeopleWestendIdentity::identity(PeopleWestendSender::get()).is_some()); + + let (_, sub_accounts) = PeopleWestendIdentity::subs_of(PeopleWestendSender::get()); + + match id.subs { + Subs::Zero => assert_eq!(sub_accounts.len(), 0), + Subs::Many(n) => assert_eq!(sub_accounts.len(), n as usize), + } + }); +} + +// Reap the identity on the Relay Chain and assert that the correct things happen there. +fn assert_reap_id_relay(total_deposit: Balance, id: &Identity) { + WestendRelay::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + let free_bal_before_reap = WestendBalances::free_balance(WestendRelaySender::get()); + let reserved_balance = WestendBalances::reserved_balance(WestendRelaySender::get()); + + assert_eq!(reserved_balance, total_deposit); + + assert_ok!(WestendIdentityMigrator::reap_identity( + WestendOrigin::root(), + WestendRelaySender::get() + )); + + let remote_deposit = match id.subs { + Subs::Zero => calculate_remote_deposit(id.relay.encoded_size() as u32, 0), + Subs::Many(n) => calculate_remote_deposit(id.relay.encoded_size() as u32, n), + }; + + assert_expected_events!( + WestendRelay, + vec![ + // `reap_identity` sums the identity and subs deposits and unreserves them in one + // call. Therefore, we only expect one `Unreserved` event. + RuntimeEvent::Balances(BalancesEvent::Unreserved { who, amount }) => { + who: *who == WestendRelaySender::get(), + amount: *amount == total_deposit, + }, + RuntimeEvent::IdentityMigrator( + polkadot_runtime_common::identity_migrator::Event::IdentityReaped { + who, + }) => { + who: *who == PeopleWestendSender::get(), + }, + ] + ); + // Identity should be gone. + assert!(PeopleWestendIdentity::identity(WestendRelaySender::get()).is_none()); + + // Subs should be gone. + let (_, sub_accounts) = WestendIdentity::subs_of(WestendRelaySender::get()); + assert_eq!(sub_accounts.len(), 0); + + let reserved_balance = WestendBalances::reserved_balance(WestendRelaySender::get()); + assert_eq!(reserved_balance, 0); + + // Free balance should be greater (i.e. the teleport should work even if 100% of an + // account's balance is reserved for Identity). + let free_bal_after_reap = WestendBalances::free_balance(WestendRelaySender::get()); + assert!(free_bal_after_reap > free_bal_before_reap); + + // Implicit: total_deposit > remote_deposit. As in, accounts should always have enough + // reserved for the parachain deposit. + assert_eq!(free_bal_after_reap, free_bal_before_reap + total_deposit - remote_deposit); + }); +} + +// Reaping the identity on the Relay Chain will have sent an XCM program to the parachain. Ensure +// that everything happens as expected. +fn assert_reap_parachain(id: &Identity) { + PeopleWestend::execute_with(|| { + let reserved_balance = PeopleWestendBalances::reserved_balance(PeopleWestendSender::get()); + let id_deposit = IdentityOn::Para(&id.para).calculate_deposit(); + let total_deposit = match id.subs { + Subs::Zero => id_deposit, + Subs::Many(n) => id_deposit + n as Balance * SubAccountDepositParachain::get(), + }; + assert_reap_events(id_deposit, id); + assert_eq!(reserved_balance, total_deposit); + + // Should have at least one ED after in free balance after the reap. + assert!( + PeopleWestendBalances::free_balance(PeopleWestendSender::get()) >= PEOPLE_WESTEND_ED + ); + }); +} + +// Assert the events that should happen on the parachain upon reaping an identity on the Relay +// Chain. +fn assert_reap_events(id_deposit: Balance, id: &Identity) { + type RuntimeEvent = ::RuntimeEvent; + match id.subs { + Subs::Zero => { + assert_expected_events!( + PeopleWestend, + vec![ + // Deposit and Endowed from teleport + RuntimeEvent::Balances(BalancesEvent::Deposit { .. }) => {}, + RuntimeEvent::Balances(BalancesEvent::Endowed { .. }) => {}, + // Amount reserved for identity info + RuntimeEvent::Balances(BalancesEvent::Reserved { who, amount }) => { + who: *who == PeopleWestendSender::get(), + amount: *amount == id_deposit, + }, + // Confirmation from Migrator with individual identity and subs deposits + RuntimeEvent::IdentityMigrator( + polkadot_runtime_common::identity_migrator::Event::DepositUpdated { + who, identity, subs + }) => { + who: *who == PeopleWestendSender::get(), + identity: *identity == id_deposit, + subs: *subs == 0, + }, + RuntimeEvent::MessageQueue(pallet_message_queue::Event::Processed { .. }) => {}, + ] + ); + }, + Subs::Many(n) => { + let subs_deposit = n as Balance * SubAccountDepositParachain::get(); + assert_expected_events!( + PeopleWestend, + vec![ + // Deposit and Endowed from teleport + RuntimeEvent::Balances(BalancesEvent::Deposit { .. }) => {}, + RuntimeEvent::Balances(BalancesEvent::Endowed { .. }) => {}, + // Amount reserved for identity info + RuntimeEvent::Balances(BalancesEvent::Reserved { who, amount }) => { + who: *who == PeopleWestendSender::get(), + amount: *amount == id_deposit, + }, + // Amount reserved for subs + RuntimeEvent::Balances(BalancesEvent::Reserved { who, amount }) => { + who: *who == PeopleWestendSender::get(), + amount: *amount == subs_deposit, + }, + // Confirmation from Migrator with individual identity and subs deposits + RuntimeEvent::IdentityMigrator( + polkadot_runtime_common::identity_migrator::Event::DepositUpdated { + who, identity, subs + }) => { + who: *who == PeopleWestendSender::get(), + identity: *identity == id_deposit, + subs: *subs == subs_deposit, + }, + RuntimeEvent::MessageQueue(pallet_message_queue::Event::Processed { .. }) => {}, + ] + ); + }, + }; +} + +/// Duplicate of the impl of `ToParachainIdentityReaper` in the Westend runtime. +fn calculate_remote_deposit(bytes: u32, subs: u32) -> Balance { + // Note: These `deposit` functions and `EXISTENTIAL_DEPOSIT` correspond to the Relay Chain's. + // Pulled in: use westend_runtime_constants::currency::*; + let para_basic_deposit = deposit(1, 17) / 100; + let para_byte_deposit = deposit(0, 1) / 100; + let para_sub_account_deposit = deposit(1, 53) / 100; + let para_existential_deposit = EXISTENTIAL_DEPOSIT / 10; + + // pallet deposits + let id_deposit = + para_basic_deposit.saturating_add(para_byte_deposit.saturating_mul(bytes as Balance)); + let subs_deposit = para_sub_account_deposit.saturating_mul(subs as Balance); + + id_deposit + .saturating_add(subs_deposit) + .saturating_add(para_existential_deposit.saturating_mul(2)) +} + +// Represent some `additional` data that would not be migrated to the parachain. The encoded size, +// and thus the byte deposit, should decrease. +fn nonsensical_additional() -> BoundedVec<(Data, Data), MaxAdditionalFields> { + BoundedVec::try_from(vec![( + Data::Raw(b"fOo".to_vec().try_into().unwrap()), + Data::Raw(b"baR".to_vec().try_into().unwrap()), + )]) + .unwrap() +} + +// Represent some `additional` data that will be migrated to the parachain as first-class fields. +fn meaningful_additional() -> BoundedVec<(Data, Data), MaxAdditionalFields> { + BoundedVec::try_from(vec![ + ( + Data::Raw(b"github".to_vec().try_into().unwrap()), + Data::Raw(b"niels-username".to_vec().try_into().unwrap()), + ), + ( + Data::Raw(b"discord".to_vec().try_into().unwrap()), + Data::Raw(b"bohr-username".to_vec().try_into().unwrap()), + ), + ]) + .unwrap() +} + +// Execute a single test case. +fn assert_relay_para_flow(id: &Identity) { + let total_deposit = set_id_relay(id); + assert_set_id_parachain(id); + assert_reap_id_relay(total_deposit, id); + assert_reap_parachain(id); +} + +// Tests with empty `IdentityInfo`. + +#[test] +fn on_reap_identity_works_for_minimal_identity_with_zero_subs() { + assert_relay_para_flow(&Identity::new(false, None, Subs::Zero)); +} + +#[test] +fn on_reap_identity_works_for_minimal_identity() { + assert_relay_para_flow(&Identity::new(false, None, Subs::Many(1))); +} + +#[test] +fn on_reap_identity_works_for_minimal_identity_with_max_subs() { + assert_relay_para_flow(&Identity::new(false, None, Subs::Many(MaxSubAccounts::get()))); +} + +// Tests with full `IdentityInfo`. + +#[test] +fn on_reap_identity_works_for_full_identity_no_additional_zero_subs() { + assert_relay_para_flow(&Identity::new(true, None, Subs::Zero)); +} + +#[test] +fn on_reap_identity_works_for_full_identity_no_additional() { + assert_relay_para_flow(&Identity::new(true, None, Subs::Many(1))); +} + +#[test] +fn on_reap_identity_works_for_full_identity_no_additional_max_subs() { + assert_relay_para_flow(&Identity::new(true, None, Subs::Many(MaxSubAccounts::get()))); +} + +// Tests with full `IdentityInfo` and `additional` fields that will _not_ be migrated. + +#[test] +fn on_reap_identity_works_for_full_identity_nonsense_additional_zero_subs() { + assert_relay_para_flow(&Identity::new(true, Some(nonsensical_additional()), Subs::Zero)); +} + +#[test] +fn on_reap_identity_works_for_full_identity_nonsense_additional() { + assert_relay_para_flow(&Identity::new(true, Some(nonsensical_additional()), Subs::Many(1))); +} + +#[test] +fn on_reap_identity_works_for_full_identity_nonsense_additional_max_subs() { + assert_relay_para_flow(&Identity::new( + true, + Some(nonsensical_additional()), + Subs::Many(MaxSubAccounts::get()), + )); +} + +// Tests with full `IdentityInfo` and `additional` fields that will be migrated. + +#[test] +fn on_reap_identity_works_for_full_identity_meaningful_additional_zero_subs() { + assert_relay_para_flow(&Identity::new(true, Some(meaningful_additional()), Subs::Zero)); +} + +#[test] +fn on_reap_identity_works_for_full_identity_meaningful_additional() { + assert_relay_para_flow(&Identity::new(true, Some(meaningful_additional()), Subs::Many(1))); +} + +#[test] +fn on_reap_identity_works_for_full_identity_meaningful_additional_max_subs() { + assert_relay_para_flow(&Identity::new( + true, + Some(meaningful_additional()), + Subs::Many(MaxSubAccounts::get()), + )); +} diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/teleport.rs b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/teleport.rs new file mode 100644 index 00000000000..e9f0158efbf --- /dev/null +++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/teleport.rs @@ -0,0 +1,260 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use crate::*; +use people_westend_runtime::xcm_config::XcmConfig as PeopleWestendXcmConfig; +use westend_runtime::xcm_config::XcmConfig as WestendXcmConfig; + +fn relay_origin_assertions(t: RelayToSystemParaTest) { + type RuntimeEvent = ::RuntimeEvent; + Westend::assert_xcm_pallet_attempted_complete(Some(Weight::from_parts(627_959_000, 7_200))); + + assert_expected_events!( + Westend, + vec![ + // Amount to teleport is withdrawn from Sender + RuntimeEvent::Balances(pallet_balances::Event::Withdraw { who, amount }) => { + who: *who == t.sender.account_id, + amount: *amount == t.args.amount, + }, + // Amount to teleport is deposited in Relay's `CheckAccount` + RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, amount }) => { + who: *who == ::XcmPallet::check_account(), + amount: *amount == t.args.amount, + }, + ] + ); +} + +fn relay_dest_assertions(t: SystemParaToRelayTest) { + type RuntimeEvent = ::RuntimeEvent; + + Westend::assert_ump_queue_processed( + true, + Some(PeopleWestend::para_id()), + Some(Weight::from_parts(304_266_000, 7_186)), + ); + + assert_expected_events!( + Westend, + vec![ + // Amount is withdrawn from Relay Chain's `CheckAccount` + RuntimeEvent::Balances(pallet_balances::Event::Withdraw { who, amount }) => { + who: *who == ::XcmPallet::check_account(), + amount: *amount == t.args.amount, + }, + // Amount minus fees are deposited in Receiver's account + RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, .. }) => { + who: *who == t.receiver.account_id, + }, + ] + ); +} + +fn relay_dest_assertions_fail(_t: SystemParaToRelayTest) { + Westend::assert_ump_queue_processed( + false, + Some(PeopleWestend::para_id()), + Some(Weight::from_parts(157_718_000, 3_593)), + ); +} + +fn para_origin_assertions(t: SystemParaToRelayTest) { + type RuntimeEvent = ::RuntimeEvent; + + PeopleWestend::assert_xcm_pallet_attempted_complete(Some(Weight::from_parts( + 351_425_000, + 3_593, + ))); + + PeopleWestend::assert_parachain_system_ump_sent(); + + assert_expected_events!( + PeopleWestend, + vec![ + // Amount is withdrawn from Sender's account + RuntimeEvent::Balances(pallet_balances::Event::Withdraw { who, amount }) => { + who: *who == t.sender.account_id, + amount: *amount == t.args.amount, + }, + ] + ); +} + +fn para_dest_assertions(t: RelayToSystemParaTest) { + type RuntimeEvent = ::RuntimeEvent; + + PeopleWestend::assert_dmp_queue_complete(Some(Weight::from_parts(162_456_000, 0))); + + assert_expected_events!( + PeopleWestend, + vec![ + // Amount minus fees are deposited in Receiver's account + RuntimeEvent::Balances(pallet_balances::Event::Deposit { who, .. }) => { + who: *who == t.receiver.account_id, + }, + ] + ); +} + +fn relay_limited_teleport_assets(t: RelayToSystemParaTest) -> DispatchResult { + ::XcmPallet::limited_teleport_assets( + t.signed_origin, + bx!(t.args.dest.into()), + bx!(t.args.beneficiary.into()), + bx!(t.args.assets.into()), + t.args.fee_asset_item, + t.args.weight_limit, + ) +} + +fn system_para_limited_teleport_assets(t: SystemParaToRelayTest) -> DispatchResult { + ::PolkadotXcm::limited_teleport_assets( + t.signed_origin, + bx!(t.args.dest.into()), + bx!(t.args.beneficiary.into()), + bx!(t.args.assets.into()), + t.args.fee_asset_item, + t.args.weight_limit, + ) +} + +/// Limited Teleport of native asset from Relay Chain to the System Parachain should work +#[test] +fn limited_teleport_native_assets_from_relay_to_system_para_works() { + // Init values for Relay Chain + let amount_to_send: Balance = WESTEND_ED * 1000; + let dest = Westend::child_location_of(PeopleWestend::para_id()); + let beneficiary_id = PeopleWestendReceiver::get(); + let test_args = TestContext { + sender: WestendSender::get(), + receiver: PeopleWestendReceiver::get(), + args: TestArgs::new_relay(dest, beneficiary_id, amount_to_send), + }; + + let mut test = RelayToSystemParaTest::new(test_args); + + let sender_balance_before = test.sender.balance; + let receiver_balance_before = test.receiver.balance; + + test.set_assertion::(relay_origin_assertions); + test.set_assertion::(para_dest_assertions); + test.set_dispatchable::(relay_limited_teleport_assets); + test.assert(); + + let delivery_fees = Westend::execute_with(|| { + xcm_helpers::transfer_assets_delivery_fees::< + ::XcmSender, + >(test.args.assets.clone(), 0, test.args.weight_limit, test.args.beneficiary, test.args.dest) + }); + + let sender_balance_after = test.sender.balance; + let receiver_balance_after = test.receiver.balance; + + // Sender's balance is reduced + assert_eq!(sender_balance_before - amount_to_send - delivery_fees, sender_balance_after); + // Receiver's balance is increased + assert!(receiver_balance_after > receiver_balance_before); +} + +/// Limited Teleport of native asset from System Parachain to Relay Chain +/// should work when there is enough balance in Relay Chain's `CheckAccount` +#[test] +fn limited_teleport_native_assets_back_from_system_para_to_relay_works() { + // Dependency - Relay Chain's `CheckAccount` should have enough balance + limited_teleport_native_assets_from_relay_to_system_para_works(); + + let amount_to_send: Balance = PEOPLE_WESTEND_ED * 1000; + let destination = PeopleWestend::parent_location(); + let beneficiary_id = WestendReceiver::get(); + let assets = (Parent, amount_to_send).into(); + + // Fund a sender + PeopleWestend::fund_accounts(vec![(PeopleWestendSender::get(), WESTEND_ED * 2_000u128)]); + + let test_args = TestContext { + sender: PeopleWestendSender::get(), + receiver: WestendReceiver::get(), + args: TestArgs::new_para(destination, beneficiary_id, amount_to_send, assets, None, 0), + }; + + let mut test = SystemParaToRelayTest::new(test_args); + + let sender_balance_before = test.sender.balance; + let receiver_balance_before = test.receiver.balance; + + test.set_assertion::(para_origin_assertions); + test.set_assertion::(relay_dest_assertions); + test.set_dispatchable::(system_para_limited_teleport_assets); + test.assert(); + + let sender_balance_after = test.sender.balance; + let receiver_balance_after = test.receiver.balance; + + let delivery_fees = PeopleWestend::execute_with(|| { + xcm_helpers::transfer_assets_delivery_fees::< + ::XcmSender, + >(test.args.assets.clone(), 0, test.args.weight_limit, test.args.beneficiary, test.args.dest) + }); + + // Sender's balance is reduced + assert_eq!(sender_balance_before - amount_to_send - delivery_fees, sender_balance_after); + // Receiver's balance is increased + assert!(receiver_balance_after > receiver_balance_before); +} + +/// Limited Teleport of native asset from System Parachain to Relay Chain +/// should't work when there is not enough balance in Relay Chain's `CheckAccount` +#[test] +fn limited_teleport_native_assets_from_system_para_to_relay_fails() { + // Init values for Relay Chain + let amount_to_send: Balance = WESTEND_ED * 1000; + let destination = PeopleWestend::parent_location(); + let beneficiary_id = WestendReceiver::get(); + let assets = (Parent, amount_to_send).into(); + + // Fund a sender + PeopleWestend::fund_accounts(vec![(PeopleWestendSender::get(), WESTEND_ED * 2_000u128)]); + + let test_args = TestContext { + sender: PeopleWestendSender::get(), + receiver: WestendReceiver::get(), + args: TestArgs::new_para(destination, beneficiary_id, amount_to_send, assets, None, 0), + }; + + let mut test = SystemParaToRelayTest::new(test_args); + + let sender_balance_before = test.sender.balance; + let receiver_balance_before = test.receiver.balance; + + test.set_assertion::(para_origin_assertions); + test.set_assertion::(relay_dest_assertions_fail); + test.set_dispatchable::(system_para_limited_teleport_assets); + test.assert(); + + let sender_balance_after = test.sender.balance; + let receiver_balance_after = test.receiver.balance; + + let delivery_fees = PeopleWestend::execute_with(|| { + xcm_helpers::transfer_assets_delivery_fees::< + ::XcmSender, + >(test.args.assets.clone(), 0, test.args.weight_limit, test.args.beneficiary, test.args.dest) + }); + + // Sender's balance is reduced + assert_eq!(sender_balance_before - amount_to_send - delivery_fees, sender_balance_after); + // Receiver's balance does not change + assert_eq!(receiver_balance_after, receiver_balance_before); +} diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/ambassador/mod.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/ambassador/mod.rs index 18c1466bf36..9f6378de53a 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/ambassador/mod.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/ambassador/mod.rs @@ -32,13 +32,12 @@ pub mod origins; mod tracks; use super::*; -use crate::xcm_config::{FellowshipAdminBodyId, WndAssetHub}; +use crate::xcm_config::{FellowshipAdminBodyId, LocationToAccountId, WndAssetHub}; use frame_support::traits::{EitherOf, MapSuccess, TryMapSuccess}; pub use origins::pallet_origins as pallet_ambassador_origins; use origins::pallet_origins::{ EnsureAmbassadorsVoice, EnsureAmbassadorsVoiceFrom, EnsureHeadAmbassadorsVoice, Origin, }; -use parachains_common::polkadot::account; use sp_core::ConstU128; use sp_runtime::traits::{CheckedReduceBy, ConstU16, ConvertToValue, Replace}; use xcm::prelude::*; @@ -114,9 +113,6 @@ parameter_types! { pub const AlarmInterval: BlockNumber = 1; pub const SubmissionDeposit: Balance = 0; pub const UndecidingTimeout: BlockNumber = 7 * DAYS; - // The Ambassador Referenda pallet account, used as a temporary place to deposit a slashed - // imbalance before teleport to the treasury. - pub AmbassadorPalletAccount: AccountId = account::AMBASSADOR_REFERENDA_PALLET_ID.into_account_truncating(); } pub type AmbassadorReferendaInstance = pallet_referenda::Instance2; @@ -136,7 +132,7 @@ impl pallet_referenda::Config for Runtime { >; type CancelOrigin = EitherOf, EnsureHeadAmbassadorsVoice>; type KillOrigin = EitherOf, EnsureHeadAmbassadorsVoice>; - type Slash = ToParentTreasury; + type Slash = ToParentTreasury; type Votes = pallet_ranked_collective::Votes; type Tally = pallet_ranked_collective::TallyOf; type SubmissionDeposit = SubmissionDeposit; diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/fellowship/mod.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/fellowship/mod.rs index 3fd108c0a5c..f49306bf8e3 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/fellowship/mod.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/fellowship/mod.rs @@ -19,9 +19,8 @@ mod origins; mod tracks; use crate::{ - impls::ToParentTreasury, weights, - xcm_config::{FellowshipAdminBodyId, TreasurerBodyId, UsdtAssetHub}, + xcm_config::{FellowshipAdminBodyId, LocationToAccountId, TreasurerBodyId, UsdtAssetHub}, AccountId, AssetRate, Balance, Balances, FellowshipReferenda, GovernanceLocation, Preimage, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, Scheduler, WestendTreasuryAccount, DAYS, }; @@ -39,15 +38,16 @@ pub use origins::{ }; use pallet_ranked_collective::EnsureOfRank; use pallet_xcm::{EnsureXcm, IsVoiceOfBody}; -use parachains_common::westend::{account, currency::GRAND}; +use parachains_common::{ + impls::ToParentTreasury, + westend::{account, currency::GRAND}, +}; use polkadot_runtime_common::impls::{ LocatableAssetConverter, VersionedLocatableAsset, VersionedMultiLocationConverter, }; use sp_arithmetic::Permill; use sp_core::{ConstU128, ConstU32}; -use sp_runtime::traits::{ - AccountIdConversion, ConstU16, ConvertToValue, IdentityLookup, Replace, TakeFirst, -}; +use sp_runtime::traits::{ConstU16, ConvertToValue, IdentityLookup, Replace, TakeFirst}; use westend_runtime_constants::time::HOURS; use xcm::prelude::*; use xcm_builder::{AliasesIntoAccountId32, PayOverXcm}; @@ -72,11 +72,6 @@ pub mod ranks { pub const DAN_9: Rank = 9; } -parameter_types! { - // Referenda pallet account, used to temporarily deposit slashed imbalance before teleporting. - pub ReferendaPalletAccount: AccountId = account::REFERENDA_PALLET_ID.into_account_truncating(); -} - impl pallet_fellowship_origins::Config for Runtime {} pub type FellowshipReferendaInstance = pallet_referenda::Instance1; @@ -103,7 +98,7 @@ impl pallet_referenda::Config for Runtime { >; type CancelOrigin = Architects; type KillOrigin = Masters; - type Slash = ToParentTreasury; + type Slash = ToParentTreasury; type Votes = pallet_ranked_collective::Votes; type Tally = pallet_ranked_collective::TallyOf; type SubmissionDeposit = ConstU128<0>; diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/impls.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/impls.rs index 9f4c2a6a4c9..caf0cddec66 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/impls.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/impls.rs @@ -16,15 +16,12 @@ use crate::OriginCaller; use frame_support::{ dispatch::DispatchResultWithPostInfo, - traits::{Currency, Get, Imbalance, OnUnbalanced, OriginTrait, PrivilegeCmp}, + traits::{Currency, PrivilegeCmp}, weights::Weight, }; -use log; use pallet_alliance::{ProposalIndex, ProposalProvider}; -use parachains_common::impls::NegativeImbalance; use sp_runtime::DispatchError; use sp_std::{cmp::Ordering, marker::PhantomData, prelude::*}; -use xcm::latest::{Fungibility, Junction, Parent}; type AccountIdOf = ::AccountId; @@ -36,51 +33,6 @@ type HashOf = ::Hash; pub type BalanceOf = as Currency<::AccountId>>::Balance; -/// Implements `OnUnbalanced::on_unbalanced` to teleport slashed assets to relay chain treasury -/// account. -pub struct ToParentTreasury( - PhantomData<(TreasuryAccount, PalletAccount, T)>, -); - -impl OnUnbalanced> - for ToParentTreasury -where - T: pallet_balances::Config + pallet_xcm::Config + frame_system::Config, - <::RuntimeOrigin as OriginTrait>::AccountId: From>, - [u8; 32]: From<::AccountId>, - TreasuryAccount: Get>, - PalletAccount: Get>, - BalanceOf: Into, -{ - fn on_unbalanced(amount: NegativeImbalance) { - let amount = match amount.drop_zero() { - Ok(..) => return, - Err(amount) => amount, - }; - let imbalance = amount.peek(); - let pallet_acc: AccountIdOf = PalletAccount::get(); - let treasury_acc: AccountIdOf = TreasuryAccount::get(); - - >::resolve_creating(&pallet_acc, amount); - - let result = >::teleport_assets( - <::RuntimeOrigin>::signed(pallet_acc.into()), - Box::new(Parent.into()), - Box::new( - Junction::AccountId32 { network: None, id: treasury_acc.into() } - .into_location() - .into(), - ), - Box::new((Parent, imbalance).into()), - 0, - ); - - if let Err(err) = result { - log::warn!("Failed to teleport slashed assets: {:?}", err); - } - } -} - /// Proposal provider for alliance pallet. /// Adapter from collective pallet to alliance proposal provider trait. pub struct AllianceProposalProvider(PhantomData<(T, I)>); @@ -157,6 +109,7 @@ pub mod benchmarks { use frame_support::traits::{ fungible, tokens::{Pay, PaymentStatus}, + Get, }; use pallet_ranked_collective::Rank; use parachains_common::{AccountId, Balance}; diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs index 9074323fe31..6cb8e096e4b 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs @@ -46,7 +46,7 @@ pub use ambassador::pallet_ambassador_origins; use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; use fellowship::{pallet_fellowship_origins, Fellows}; -use impls::{AllianceProposalProvider, EqualOrGreatestRootCmp, ToParentTreasury}; +use impls::{AllianceProposalProvider, EqualOrGreatestRootCmp}; use sp_api::impl_runtime_apis; use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; use sp_runtime::{ @@ -81,7 +81,7 @@ use frame_system::{ }; pub use parachains_common as common; use parachains_common::{ - impls::DealWithFees, + impls::{DealWithFees, ToParentTreasury}, message_queue::*, westend::{account::*, consensus::*, currency::*, fee::WeightToFee}, AccountId, AuraId, Balance, BlockNumber, Hash, Header, Nonce, Signature, @@ -89,7 +89,9 @@ use parachains_common::{ SLOT_DURATION, }; use sp_runtime::RuntimeDebug; -use xcm_config::{GovernanceLocation, TreasurerBodyId, XcmOriginToTransactDispatchOrigin}; +use xcm_config::{ + GovernanceLocation, LocationToAccountId, TreasurerBodyId, XcmOriginToTransactDispatchOrigin, +}; #[cfg(any(feature = "std", test))] pub use sp_runtime::BuildStorage; @@ -537,9 +539,6 @@ pub const MAX_ALLIES: u32 = 100; parameter_types! { pub const AllyDeposit: Balance = 1_000 * UNITS; // 1,000 WND bond to join as an Ally - // The Alliance pallet account, used as a temporary place to deposit a slashed imbalance - // before the teleport to the Treasury. - pub AlliancePalletAccount: AccountId = ALLIANCE_PALLET_ID.into_account_truncating(); pub WestendTreasuryAccount: AccountId = WESTEND_TREASURY_PALLET_ID.into_account_truncating(); // The number of blocks a member must wait between giving a retirement notice and retiring. // Supposed to be greater than time required to `kick_member` with alliance motion. @@ -553,7 +552,7 @@ impl pallet_alliance::Config for Runtime { type MembershipManager = RootOrAllianceTwoThirdsMajority; type AnnouncementOrigin = RootOrAllianceTwoThirdsMajority; type Currency = Balances; - type Slashed = ToParentTreasury; + type Slashed = ToParentTreasury; type InitializeMembers = AllianceMotion; type MembershipChanged = AllianceMotion; type RetirementPeriod = AllianceRetirementPeriod; diff --git a/cumulus/parachains/runtimes/people/README.md b/cumulus/parachains/runtimes/people/README.md new file mode 100644 index 00000000000..cc196513e2f --- /dev/null +++ b/cumulus/parachains/runtimes/people/README.md @@ -0,0 +1,5 @@ +# People System Chain + +The People Chain is a parachain to host the Identity pallet and serve as a location to which to +migrate identity-related information from the Relay Chain. It is part of the implementation of +[Fellowship RFC 32](https://github.com/polkadot-fellows/RFCs/blob/main/text/0032-minimal-relay.md). diff --git a/cumulus/parachains/runtimes/people/people-rococo/Cargo.toml b/cumulus/parachains/runtimes/people/people-rococo/Cargo.toml new file mode 100644 index 00000000000..81f6ed936c8 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-rococo/Cargo.toml @@ -0,0 +1,195 @@ +[package] +name = "people-rococo-runtime" +version = "0.1.0" +authors.workspace = true +edition.workspace = true +description = "Rococo's People parachain runtime" +license = "Apache-2.0" + +[build-dependencies] +substrate-wasm-builder = { path = "../../../../../substrate/utils/wasm-builder", optional = true } + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } +enumflags2 = { version = "0.7.7" } +hex-literal = { version = "0.4.1" } +log = { version = "0.4.20", default-features = false } +scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } +serde = { version = "1.0.171", optional = true, features = ["derive"] } +smallvec = "1.11.0" + +# Substrate +frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking", default-features = false, optional = true } +frame-executive = { path = "../../../../../substrate/frame/executive", default-features = false } +frame-support = { path = "../../../../../substrate/frame/support", default-features = false } +frame-system = { path = "../../../../../substrate/frame/system", default-features = false } +frame-system-benchmarking = { path = "../../../../../substrate/frame/system/benchmarking", default-features = false, optional = true } +frame-system-rpc-runtime-api = { path = "../../../../../substrate/frame/system/rpc/runtime-api", default-features = false } +frame-try-runtime = { path = "../../../../../substrate/frame/try-runtime", default-features = false, optional = true } +pallet-aura = { path = "../../../../../substrate/frame/aura", default-features = false } +pallet-authorship = { path = "../../../../../substrate/frame/authorship", default-features = false } +pallet-balances = { path = "../../../../../substrate/frame/balances", default-features = false } +pallet-identity = { path = "../../../../../substrate/frame/identity", default-features = false } +pallet-message-queue = { path = "../../../../../substrate/frame/message-queue", default-features = false } +pallet-multisig = { path = "../../../../../substrate/frame/multisig", default-features = false } +pallet-session = { path = "../../../../../substrate/frame/session", default-features = false } +pallet-timestamp = { path = "../../../../../substrate/frame/timestamp", default-features = false } +pallet-transaction-payment = { path = "../../../../../substrate/frame/transaction-payment", default-features = false } +pallet-transaction-payment-rpc-runtime-api = { path = "../../../../../substrate/frame/transaction-payment/rpc/runtime-api", default-features = false } +pallet-utility = { path = "../../../../../substrate/frame/utility", default-features = false } +sp-api = { path = "../../../../../substrate/primitives/api", default-features = false } +sp-block-builder = { path = "../../../../../substrate/primitives/block-builder", default-features = false } +sp-consensus-aura = { path = "../../../../../substrate/primitives/consensus/aura", default-features = false } +sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } +sp-genesis-builder = { path = "../../../../../substrate/primitives/genesis-builder", default-features = false } +sp-inherents = { path = "../../../../../substrate/primitives/inherents", default-features = false } +sp-offchain = { path = "../../../../../substrate/primitives/offchain", default-features = false } +sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-features = false } +sp-session = { path = "../../../../../substrate/primitives/session", default-features = false } +sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } +sp-storage = { path = "../../../../../substrate/primitives/storage", default-features = false } +sp-transaction-pool = { path = "../../../../../substrate/primitives/transaction-pool", default-features = false } +sp-version = { path = "../../../../../substrate/primitives/version", default-features = false } + +# Polkadot +pallet-xcm = { path = "../../../../../polkadot/xcm/pallet-xcm", default-features = false } +pallet-xcm-benchmarks = { path = "../../../../../polkadot/xcm/pallet-xcm-benchmarks", default-features = false, optional = true } +polkadot-core-primitives = { path = "../../../../../polkadot/core-primitives", default-features = false } +polkadot-parachain-primitives = { path = "../../../../../polkadot/parachain", default-features = false } +polkadot-runtime-common = { path = "../../../../../polkadot/runtime/common", default-features = false } +rococo-runtime-constants = { path = "../../../../../polkadot/runtime/rococo/constants", default-features = false } +xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } +xcm-builder = { package = "staging-xcm-builder", path = "../../../../../polkadot/xcm/xcm-builder", default-features = false } +xcm-executor = { package = "staging-xcm-executor", path = "../../../../../polkadot/xcm/xcm-executor", default-features = false } + +# Cumulus +cumulus-pallet-aura-ext = { path = "../../../../pallets/aura-ext", default-features = false } +cumulus-pallet-dmp-queue = { path = "../../../../pallets/dmp-queue", default-features = false } +cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false, features = ["parameterized-consensus-hook"] } +cumulus-pallet-session-benchmarking = { path = "../../../../pallets/session-benchmarking", default-features = false } +cumulus-pallet-xcm = { path = "../../../../pallets/xcm", default-features = false } +cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-features = false } +cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } +cumulus-primitives-utility = { path = "../../../../primitives/utility", default-features = false } +pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } +parachain-info = { package = "staging-parachain-info", path = "../../../pallets/parachain-info", default-features = false } +parachains-common = { path = "../../../common", default-features = false } + +[features] +default = ["std"] +std = [ + "codec/std", + "cumulus-pallet-aura-ext/std", + "cumulus-pallet-dmp-queue/std", + "cumulus-pallet-parachain-system/std", + "cumulus-pallet-session-benchmarking/std", + "cumulus-pallet-xcm/std", + "cumulus-pallet-xcmp-queue/std", + "cumulus-primitives-core/std", + "cumulus-primitives-utility/std", + "enumflags2/std", + "frame-benchmarking?/std", + "frame-executive/std", + "frame-support/std", + "frame-system-benchmarking?/std", + "frame-system-rpc-runtime-api/std", + "frame-system/std", + "frame-try-runtime?/std", + "log/std", + "pallet-aura/std", + "pallet-authorship/std", + "pallet-balances/std", + "pallet-collator-selection/std", + "pallet-identity/std", + "pallet-message-queue/std", + "pallet-multisig/std", + "pallet-session/std", + "pallet-timestamp/std", + "pallet-transaction-payment-rpc-runtime-api/std", + "pallet-transaction-payment/std", + "pallet-utility/std", + "pallet-xcm-benchmarks?/std", + "pallet-xcm/std", + "parachain-info/std", + "parachains-common/std", + "polkadot-core-primitives/std", + "polkadot-parachain-primitives/std", + "polkadot-runtime-common/std", + "rococo-runtime-constants/std", + "scale-info/std", + "serde", + "sp-api/std", + "sp-block-builder/std", + "sp-consensus-aura/std", + "sp-core/std", + "sp-genesis-builder/std", + "sp-inherents/std", + "sp-offchain/std", + "sp-runtime/std", + "sp-session/std", + "sp-std/std", + "sp-storage/std", + "sp-transaction-pool/std", + "sp-version/std", + "substrate-wasm-builder", + "xcm-builder/std", + "xcm-executor/std", + "xcm/std", +] + +runtime-benchmarks = [ + "cumulus-pallet-dmp-queue/runtime-benchmarks", + "cumulus-pallet-parachain-system/runtime-benchmarks", + "cumulus-pallet-session-benchmarking/runtime-benchmarks", + "cumulus-pallet-xcmp-queue/runtime-benchmarks", + "cumulus-primitives-core/runtime-benchmarks", + "cumulus-primitives-utility/runtime-benchmarks", + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system-benchmarking/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "pallet-balances/runtime-benchmarks", + "pallet-collator-selection/runtime-benchmarks", + "pallet-identity/runtime-benchmarks", + "pallet-message-queue/runtime-benchmarks", + "pallet-multisig/runtime-benchmarks", + "pallet-timestamp/runtime-benchmarks", + "pallet-utility/runtime-benchmarks", + "pallet-xcm-benchmarks/runtime-benchmarks", + "pallet-xcm/runtime-benchmarks", + "parachains-common/runtime-benchmarks", + "polkadot-parachain-primitives/runtime-benchmarks", + "polkadot-runtime-common/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", + "xcm-builder/runtime-benchmarks", + "xcm-executor/runtime-benchmarks", +] + +try-runtime = [ + "cumulus-pallet-aura-ext/try-runtime", + "cumulus-pallet-dmp-queue/try-runtime", + "cumulus-pallet-parachain-system/try-runtime", + "cumulus-pallet-xcm/try-runtime", + "cumulus-pallet-xcmp-queue/try-runtime", + "frame-executive/try-runtime", + "frame-support/try-runtime", + "frame-system/try-runtime", + "frame-try-runtime/try-runtime", + "pallet-aura/try-runtime", + "pallet-authorship/try-runtime", + "pallet-balances/try-runtime", + "pallet-collator-selection/try-runtime", + "pallet-identity/try-runtime", + "pallet-message-queue/try-runtime", + "pallet-multisig/try-runtime", + "pallet-session/try-runtime", + "pallet-timestamp/try-runtime", + "pallet-transaction-payment/try-runtime", + "pallet-utility/try-runtime", + "pallet-xcm/try-runtime", + "parachain-info/try-runtime", + "polkadot-runtime-common/try-runtime", + "sp-runtime/try-runtime", +] + +experimental = ["pallet-aura/experimental"] diff --git a/cumulus/parachains/runtimes/people/people-rococo/build.rs b/cumulus/parachains/runtimes/people/people-rococo/build.rs new file mode 100644 index 00000000000..60f8a125129 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-rococo/build.rs @@ -0,0 +1,26 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#[cfg(feature = "std")] +fn main() { + substrate_wasm_builder::WasmBuilder::new() + .with_current_project() + .export_heap_base() + .import_memory() + .build() +} + +#[cfg(not(feature = "std"))] +fn main() {} diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs b/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs new file mode 100644 index 00000000000..7805e0ad982 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs @@ -0,0 +1,845 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![cfg_attr(not(feature = "std"), no_std)] +#![recursion_limit = "256"] +#[cfg(feature = "std")] +include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); + +pub mod people; +mod weights; +pub mod xcm_config; + +use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; +use cumulus_primitives_core::{AggregateMessageOrigin, ParaId}; +use frame_support::{ + construct_runtime, derive_impl, + dispatch::DispatchClass, + genesis_builder_helper::{build_config, create_default_config}, + parameter_types, + traits::{ + ConstBool, ConstU32, ConstU64, ConstU8, Contains, EitherOfDiverse, EverythingBut, + TransformOrigin, + }, + weights::{ConstantMultiplier, Weight}, + PalletId, +}; +use frame_system::{ + limits::{BlockLength, BlockWeights}, + EnsureRoot, +}; +use pallet_xcm::{EnsureXcm, IsVoiceOfBody}; +use parachains_common::{ + impls::DealWithFees, + message_queue::{NarrowOriginToSibling, ParaIdToSibling}, + rococo::{consensus::*, currency::*, fee::WeightToFee}, + AccountId, Balance, BlockNumber, Hash, Header, Nonce, Signature, AVERAGE_ON_INITIALIZE_RATIO, + HOURS, MAXIMUM_BLOCK_WEIGHT, NORMAL_DISPATCH_RATIO, SLOT_DURATION, +}; +use polkadot_runtime_common::{identity_migrator, BlockHashCount, SlowAdjustingFeeUpdate}; +use sp_api::impl_runtime_apis; +pub use sp_consensus_aura::sr25519::AuthorityId as AuraId; +use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; +#[cfg(any(feature = "std", test))] +pub use sp_runtime::BuildStorage; +use sp_runtime::{ + create_runtime_str, generic, impl_opaque_keys, + traits::Block as BlockT, + transaction_validity::{TransactionSource, TransactionValidity}, + ApplyExtrinsicResult, +}; +pub use sp_runtime::{MultiAddress, Perbill, Permill}; +use sp_std::prelude::*; +#[cfg(feature = "std")] +use sp_version::NativeVersion; +use sp_version::RuntimeVersion; +use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; +use xcm::latest::prelude::BodyId; +use xcm_config::{ + FellowshipLocation, GovernanceLocation, PriceForSiblingParachainDelivery, XcmConfig, + XcmOriginToTransactDispatchOrigin, +}; + +/// The address format for describing accounts. +pub type Address = MultiAddress; + +/// Block type as expected by this runtime. +pub type Block = generic::Block; + +/// A Block signed with an [`sp_runtime::Justification`]. +pub type SignedBlock = generic::SignedBlock; + +/// BlockId type as expected by this runtime. +pub type BlockId = generic::BlockId; + +/// The SignedExtension to the basic transaction logic. +pub type SignedExtra = ( + frame_system::CheckNonZeroSender, + frame_system::CheckSpecVersion, + frame_system::CheckTxVersion, + frame_system::CheckGenesis, + frame_system::CheckEra, + frame_system::CheckNonce, + frame_system::CheckWeight, + pallet_transaction_payment::ChargeTransactionPayment, +); + +/// Unchecked extrinsic type as expected by this runtime. +pub type UncheckedExtrinsic = + generic::UncheckedExtrinsic; + +/// Migrations to apply on runtime upgrade. +pub type Migrations = (); + +/// Executive: handles dispatch to the various modules. +pub type Executive = frame_executive::Executive< + Runtime, + Block, + frame_system::ChainContext, + Runtime, + AllPalletsWithSystem, + Migrations, +>; + +impl_opaque_keys! { + pub struct SessionKeys { + pub aura: Aura, + } +} + +#[sp_version::runtime_version] +pub const VERSION: RuntimeVersion = RuntimeVersion { + spec_name: create_runtime_str!("people-rococo"), + impl_name: create_runtime_str!("people-rococo"), + authoring_version: 1, + spec_version: 1_000, + impl_version: 0, + apis: RUNTIME_API_VERSIONS, + transaction_version: 0, + state_version: 1, +}; + +/// The version information used to identify this runtime when compiled natively. +#[cfg(feature = "std")] +pub fn native_version() -> NativeVersion { + NativeVersion { runtime_version: VERSION, can_author_with: Default::default() } +} + +parameter_types! { + pub const Version: RuntimeVersion = VERSION; + pub RuntimeBlockLength: BlockLength = + BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO); + pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder() + .base_block(BlockExecutionWeight::get()) + .for_class(DispatchClass::all(), |weights| { + weights.base_extrinsic = ExtrinsicBaseWeight::get(); + }) + .for_class(DispatchClass::Normal, |weights| { + weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT); + }) + .for_class(DispatchClass::Operational, |weights| { + weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT); + // Operational transactions have some extra reserved space, so that they + // are included even if block reached `MAXIMUM_BLOCK_WEIGHT`. + weights.reserved = Some( + MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT + ); + }) + .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO) + .build_or_panic(); + pub const SS58Prefix: u8 = 42; +} + +pub struct IdentityCalls; +impl Contains for IdentityCalls { + fn contains(c: &RuntimeCall) -> bool { + matches!(c, RuntimeCall::Identity(_)) + } +} + +#[derive_impl(frame_system::config_preludes::ParaChainDefaultConfig as frame_system::DefaultConfig)] +impl frame_system::Config for Runtime { + type BaseCallFilter = EverythingBut; + type BlockWeights = RuntimeBlockWeights; + type BlockLength = RuntimeBlockLength; + type AccountId = AccountId; + type Nonce = Nonce; + type Hash = Hash; + type Block = Block; + type BlockHashCount = BlockHashCount; + type DbWeight = RocksDbWeight; + type Version = Version; + type AccountData = pallet_balances::AccountData; + type SystemWeightInfo = weights::frame_system::WeightInfo; + type SS58Prefix = SS58Prefix; + type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode; + type MaxConsumers = ConstU32<16>; +} + +impl pallet_timestamp::Config for Runtime { + /// A timestamp: milliseconds since the unix epoch. + type Moment = u64; + type OnTimestampSet = Aura; + type MinimumPeriod = ConstU64<{ SLOT_DURATION / 2 }>; + type WeightInfo = weights::pallet_timestamp::WeightInfo; +} + +impl pallet_authorship::Config for Runtime { + type FindAuthor = pallet_session::FindAccountFromAuthorIndex; + type EventHandler = (CollatorSelection,); +} + +parameter_types! { + pub const ExistentialDeposit: Balance = EXISTENTIAL_DEPOSIT; +} + +impl pallet_balances::Config for Runtime { + type Balance = Balance; + type DustRemoval = (); + type RuntimeEvent = RuntimeEvent; + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type WeightInfo = weights::pallet_balances::WeightInfo; + type MaxLocks = ConstU32<50>; + type MaxReserves = ConstU32<50>; + type ReserveIdentifier = [u8; 8]; + type RuntimeFreezeReason = RuntimeFreezeReason; + type RuntimeHoldReason = RuntimeHoldReason; + type FreezeIdentifier = (); + type MaxHolds = ConstU32<0>; + type MaxFreezes = ConstU32<0>; +} + +parameter_types! { + /// Relay Chain `TransactionByteFee` / 10. + pub const TransactionByteFee: Balance = MILLICENTS; +} + +impl pallet_transaction_payment::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type OnChargeTransaction = + pallet_transaction_payment::CurrencyAdapter>; + type OperationalFeeMultiplier = ConstU8<5>; + type WeightToFee = WeightToFee; + type LengthToFee = ConstantMultiplier; + type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; +} + +parameter_types! { + pub const ReservedXcmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); + pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); + pub const RelayOrigin: AggregateMessageOrigin = AggregateMessageOrigin::Parent; +} + +impl cumulus_pallet_parachain_system::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type OnSystemEvent = (); + type SelfParaId = parachain_info::Pallet; + type OutboundXcmpMessageSource = XcmpQueue; + type DmpQueue = frame_support::traits::EnqueueWithOrigin; + type ReservedDmpWeight = ReservedDmpWeight; + type XcmpMessageHandler = XcmpQueue; + type ReservedXcmpWeight = ReservedXcmpWeight; + type CheckAssociatedRelayNumber = RelayNumberStrictlyIncreases; + type ConsensusHook = cumulus_pallet_aura_ext::FixedVelocityConsensusHook< + Runtime, + RELAY_CHAIN_SLOT_DURATION_MILLIS, + BLOCK_PROCESSING_VELOCITY, + UNINCLUDED_SEGMENT_CAPACITY, + >; + type WeightInfo = weights::cumulus_pallet_parachain_system::WeightInfo; +} + +parameter_types! { + pub MessageQueueServiceWeight: Weight = + Perbill::from_percent(35) * RuntimeBlockWeights::get().max_block; +} + +impl pallet_message_queue::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + #[cfg(feature = "runtime-benchmarks")] + type MessageProcessor = pallet_message_queue::mock_helpers::NoopMessageProcessor< + cumulus_primitives_core::AggregateMessageOrigin, + >; + #[cfg(not(feature = "runtime-benchmarks"))] + type MessageProcessor = xcm_builder::ProcessXcmMessage< + AggregateMessageOrigin, + xcm_executor::XcmExecutor, + RuntimeCall, + >; + type Size = u32; + // The XCMP queue pallet is only ever able to handle the `Sibling(ParaId)` origin: + type QueueChangeHandler = NarrowOriginToSibling; + type QueuePausedQuery = NarrowOriginToSibling; + type HeapSize = sp_core::ConstU32<{ 64 * 1024 }>; + type MaxStale = sp_core::ConstU32<8>; + type ServiceWeight = MessageQueueServiceWeight; + type WeightInfo = weights::pallet_message_queue::WeightInfo; +} + +impl parachain_info::Config for Runtime {} + +impl cumulus_pallet_aura_ext::Config for Runtime {} + +parameter_types! { + // Fellows pluralistic body. + pub const FellowsBodyId: BodyId = BodyId::Technical; +} + +/// Privileged origin that represents Root or Fellows pluralistic body. +pub type RootOrFellows = EitherOfDiverse< + EnsureRoot, + EnsureXcm>, +>; + +impl cumulus_pallet_xcmp_queue::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type ChannelInfo = ParachainSystem; + type VersionWrapper = PolkadotXcm; + type XcmpQueue = TransformOrigin; + type MaxInboundSuspended = sp_core::ConstU32<1_000>; + type ControllerOrigin = RootOrFellows; + type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin; + type PriceForSiblingDelivery = PriceForSiblingParachainDelivery; + type WeightInfo = weights::cumulus_pallet_xcmp_queue::WeightInfo; +} + +pub const PERIOD: u32 = 6 * HOURS; +pub const OFFSET: u32 = 0; + +impl pallet_session::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type ValidatorId = ::AccountId; + // we don't have stash and controller, thus we don't need the convert as well. + type ValidatorIdOf = pallet_collator_selection::IdentityCollator; + type ShouldEndSession = pallet_session::PeriodicSessions, ConstU32>; + type NextSessionRotation = pallet_session::PeriodicSessions, ConstU32>; + type SessionManager = CollatorSelection; + // Essentially just Aura, but let's be pedantic. + type SessionHandler = ::KeyTypeIdProviders; + type Keys = SessionKeys; + type WeightInfo = weights::pallet_session::WeightInfo; +} + +impl pallet_aura::Config for Runtime { + type AuthorityId = AuraId; + type DisabledValidators = (); + type MaxAuthorities = ConstU32<100_000>; + type AllowMultipleBlocksPerSlot = ConstBool; + #[cfg(feature = "experimental")] + type SlotDuration = pallet_aura::MinimumPeriodTimesTwo; +} + +parameter_types! { + pub const PotId: PalletId = PalletId(*b"PotStake"); + pub const SessionLength: BlockNumber = 6 * HOURS; + // StakingAdmin pluralistic body. + pub const StakingAdminBodyId: BodyId = BodyId::Defense; +} + +/// We allow Root and the `StakingAdmin` to execute privileged collator selection operations. +pub type CollatorSelectionUpdateOrigin = EitherOfDiverse< + EnsureRoot, + EnsureXcm>, +>; + +impl pallet_collator_selection::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Currency = Balances; + type UpdateOrigin = CollatorSelectionUpdateOrigin; + type PotId = PotId; + type MaxCandidates = ConstU32<100>; + type MinEligibleCollators = ConstU32<4>; + type MaxInvulnerables = ConstU32<20>; + // should be a multiple of session or things will get inconsistent + type KickThreshold = ConstU32; + type ValidatorId = ::AccountId; + type ValidatorIdOf = pallet_collator_selection::IdentityCollator; + type ValidatorRegistration = Session; + type WeightInfo = weights::pallet_collator_selection::WeightInfo; +} + +parameter_types! { + // One storage item; key size is 32; value is size 4+4+16+32 bytes = 56 bytes. + pub const DepositBase: Balance = deposit(1, 88); + // Additional storage item size of 32 bytes. + pub const DepositFactor: Balance = deposit(0, 32); +} + +impl pallet_multisig::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; + type Currency = Balances; + type DepositBase = DepositBase; + type DepositFactor = DepositFactor; + type MaxSignatories = ConstU32<100>; + type WeightInfo = weights::pallet_multisig::WeightInfo; +} + +impl pallet_utility::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; + type PalletsOrigin = OriginCaller; + type WeightInfo = weights::pallet_utility::WeightInfo; +} + +// To be removed after migration is complete. +impl identity_migrator::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Reaper = EnsureRoot; + type ReapIdentityHandler = (); + type WeightInfo = weights::polkadot_runtime_common_identity_migrator::WeightInfo; +} + +// Create the runtime by composing the FRAME pallets that were previously configured. +construct_runtime!( + pub enum Runtime + { + // System support stuff. + System: frame_system::{Pallet, Call, Config, Storage, Event} = 0, + ParachainSystem: cumulus_pallet_parachain_system::{ + Pallet, Call, Config, Storage, Inherent, Event, ValidateUnsigned, + } = 1, + Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent} = 2, + ParachainInfo: parachain_info::{Pallet, Storage, Config} = 3, + + // Monetary stuff. + Balances: pallet_balances::{Pallet, Call, Storage, Config, Event} = 10, + TransactionPayment: pallet_transaction_payment::{Pallet, Storage, Event} = 11, + + // Collator support. The order of these 5 are important and shall not change. + Authorship: pallet_authorship::{Pallet, Storage} = 20, + CollatorSelection: pallet_collator_selection::{Pallet, Call, Storage, Event, Config} = 21, + Session: pallet_session::{Pallet, Call, Storage, Event, Config} = 22, + Aura: pallet_aura::{Pallet, Storage, Config} = 23, + AuraExt: cumulus_pallet_aura_ext::{Pallet, Storage, Config} = 24, + + // XCM & related + XcmpQueue: cumulus_pallet_xcmp_queue::{Pallet, Call, Storage, Event} = 30, + PolkadotXcm: pallet_xcm::{Pallet, Call, Event, Origin, Config} = 31, + CumulusXcm: cumulus_pallet_xcm::{Pallet, Event, Origin} = 32, + MessageQueue: pallet_message_queue::{Pallet, Call, Storage, Event} = 34, + + // Handy utilities. + Utility: pallet_utility::{Pallet, Call, Event} = 40, + Multisig: pallet_multisig::{Pallet, Call, Storage, Event} = 41, + + // The main stage. + Identity: pallet_identity::{Pallet, Call, Storage, Event} = 50, + + // To migrate deposits + IdentityMigrator: identity_migrator::{Pallet, Call, Event} = 248, + } +); + +#[cfg(feature = "runtime-benchmarks")] +#[macro_use] +extern crate frame_benchmarking; + +#[cfg(feature = "runtime-benchmarks")] +mod benches { + define_benchmarks!( + // Substrate + [frame_system, SystemBench::] + [pallet_balances, Balances] + [pallet_identity, Identity] + [pallet_multisig, Multisig] + [pallet_session, SessionBench::] + [pallet_utility, Utility] + [pallet_timestamp, Timestamp] + // Polkadot + [polkadot_runtime_common::identity_migrator, IdentityMigrator] + // Cumulus + [cumulus_pallet_xcmp_queue, XcmpQueue] + [pallet_collator_selection, CollatorSelection] + // XCM + [pallet_xcm, PalletXcmExtrinsiscsBenchmark::] + [pallet_xcm_benchmarks::fungible, XcmBalances] + [pallet_xcm_benchmarks::generic, XcmGeneric] + ); +} + +impl_runtime_apis! { + impl sp_consensus_aura::AuraApi for Runtime { + fn slot_duration() -> sp_consensus_aura::SlotDuration { + sp_consensus_aura::SlotDuration::from_millis(Aura::slot_duration()) + } + + fn authorities() -> Vec { + Aura::authorities().into_inner() + } + } + + impl sp_api::Core for Runtime { + fn version() -> RuntimeVersion { + VERSION + } + + fn execute_block(block: Block) { + Executive::execute_block(block) + } + + fn initialize_block(header: &::Header) { + Executive::initialize_block(header) + } + } + + impl sp_api::Metadata for Runtime { + fn metadata() -> OpaqueMetadata { + OpaqueMetadata::new(Runtime::metadata().into()) + } + + fn metadata_at_version(version: u32) -> Option { + Runtime::metadata_at_version(version) + } + + fn metadata_versions() -> sp_std::vec::Vec { + Runtime::metadata_versions() + } + } + + impl sp_block_builder::BlockBuilder for Runtime { + fn apply_extrinsic(extrinsic: ::Extrinsic) -> ApplyExtrinsicResult { + Executive::apply_extrinsic(extrinsic) + } + + fn finalize_block() -> ::Header { + Executive::finalize_block() + } + + fn inherent_extrinsics(data: sp_inherents::InherentData) -> Vec<::Extrinsic> { + data.create_extrinsics() + } + + fn check_inherents( + block: Block, + data: sp_inherents::InherentData, + ) -> sp_inherents::CheckInherentsResult { + data.check_extrinsics(&block) + } + } + + impl sp_transaction_pool::runtime_api::TaggedTransactionQueue for Runtime { + fn validate_transaction( + source: TransactionSource, + tx: ::Extrinsic, + block_hash: ::Hash, + ) -> TransactionValidity { + Executive::validate_transaction(source, tx, block_hash) + } + } + + impl sp_offchain::OffchainWorkerApi for Runtime { + fn offchain_worker(header: &::Header) { + Executive::offchain_worker(header) + } + } + + impl sp_session::SessionKeys for Runtime { + fn generate_session_keys(seed: Option>) -> Vec { + SessionKeys::generate(seed) + } + + fn decode_session_keys( + encoded: Vec, + ) -> Option, KeyTypeId)>> { + SessionKeys::decode_into_raw_public_keys(&encoded) + } + } + + impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime { + fn account_nonce(account: AccountId) -> Nonce { + System::account_nonce(account) + } + } + + impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi for Runtime { + fn query_info( + uxt: ::Extrinsic, + len: u32, + ) -> pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo { + TransactionPayment::query_info(uxt, len) + } + fn query_fee_details( + uxt: ::Extrinsic, + len: u32, + ) -> pallet_transaction_payment::FeeDetails { + TransactionPayment::query_fee_details(uxt, len) + } + fn query_weight_to_fee(weight: Weight) -> Balance { + TransactionPayment::weight_to_fee(weight) + } + fn query_length_to_fee(length: u32) -> Balance { + TransactionPayment::length_to_fee(length) + } + } + + impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentCallApi + for Runtime + { + fn query_call_info( + call: RuntimeCall, + len: u32, + ) -> pallet_transaction_payment::RuntimeDispatchInfo { + TransactionPayment::query_call_info(call, len) + } + fn query_call_fee_details( + call: RuntimeCall, + len: u32, + ) -> pallet_transaction_payment::FeeDetails { + TransactionPayment::query_call_fee_details(call, len) + } + fn query_weight_to_fee(weight: Weight) -> Balance { + TransactionPayment::weight_to_fee(weight) + } + fn query_length_to_fee(length: u32) -> Balance { + TransactionPayment::length_to_fee(length) + } + } + + impl cumulus_primitives_core::CollectCollationInfo for Runtime { + fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { + ParachainSystem::collect_collation_info(header) + } + } + + #[cfg(feature = "try-runtime")] + impl frame_try_runtime::TryRuntime for Runtime { + fn on_runtime_upgrade(checks: frame_try_runtime::UpgradeCheckSelect) -> (Weight, Weight) { + let weight = Executive::try_runtime_upgrade(checks).unwrap(); + (weight, RuntimeBlockWeights::get().max_block) + } + + fn execute_block( + block: Block, + state_root_check: bool, + signature_check: bool, + select: frame_try_runtime::TryStateSelect, + ) -> Weight { + // NOTE: intentional unwrap: we don't want to propagate the error backwards, and want to + // have a backtrace here. + Executive::try_execute_block(block, state_root_check, signature_check, select).unwrap() + } + } + + #[cfg(feature = "runtime-benchmarks")] + impl frame_benchmarking::Benchmark for Runtime { + fn benchmark_metadata(extra: bool) -> ( + Vec, + Vec, + ) { + use frame_benchmarking::{Benchmarking, BenchmarkList}; + use frame_support::traits::StorageInfoTrait; + use frame_system_benchmarking::Pallet as SystemBench; + use cumulus_pallet_session_benchmarking::Pallet as SessionBench; + use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsiscsBenchmark; + + // This is defined once again in dispatch_benchmark, because list_benchmarks! + // and add_benchmarks! are macros exported by define_benchmarks! macros and those types + // are referenced in that call. + type XcmBalances = pallet_xcm_benchmarks::fungible::Pallet::; + type XcmGeneric = pallet_xcm_benchmarks::generic::Pallet::; + + let mut list = Vec::::new(); + list_benchmarks!(list, extra); + + let storage_info = AllPalletsWithSystem::storage_info(); + (list, storage_info) + } + + fn dispatch_benchmark( + config: frame_benchmarking::BenchmarkConfig + ) -> Result, sp_runtime::RuntimeString> { + use frame_benchmarking::{Benchmarking, BenchmarkBatch, BenchmarkError}; + use sp_storage::TrackedStorageKey; + + use frame_system_benchmarking::Pallet as SystemBench; + impl frame_system_benchmarking::Config for Runtime { + fn setup_set_code_requirements(code: &sp_std::vec::Vec) -> Result<(), BenchmarkError> { + ParachainSystem::initialize_for_set_code_benchmark(code.len() as u32); + Ok(()) + } + + fn verify_set_code() { + System::assert_last_event(cumulus_pallet_parachain_system::Event::::ValidationFunctionStored.into()); + } + } + + use cumulus_pallet_session_benchmarking::Pallet as SessionBench; + impl cumulus_pallet_session_benchmarking::Config for Runtime {} + + use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsiscsBenchmark; + impl pallet_xcm::benchmarking::Config for Runtime { + fn reachable_dest() -> Option { + Some(Parent.into()) + } + + fn teleportable_asset_and_dest() -> Option<(MultiAsset, MultiLocation)> { + // Relay/native token can be teleported between People and Relay. + Some(( + MultiAsset { + fun: Fungible(EXISTENTIAL_DEPOSIT), + id: Concrete(Parent.into()) + }, + Parent.into(), + )) + } + + fn reserve_transferable_asset_and_dest() -> Option<(MultiAsset, MultiLocation)> { + None + } + } + + use xcm::latest::prelude::*; + use xcm_config::{PriceForParentDelivery, RelayLocation}; + + parameter_types! { + pub ExistentialDepositMultiAsset: Option = Some(( + RelayLocation::get(), + ExistentialDeposit::get() + ).into()); + } + + impl pallet_xcm_benchmarks::Config for Runtime { + type XcmConfig = XcmConfig; + type AccountIdConverter = xcm_config::LocationToAccountId; + type DeliveryHelper = cumulus_primitives_utility::ToParentDeliveryHelper< + XcmConfig, + ExistentialDepositMultiAsset, + PriceForParentDelivery, + >; + fn valid_destination() -> Result { + Ok(RelayLocation::get()) + } + fn worst_case_holding(_depositable_count: u32) -> MultiAssets { + // just concrete assets according to relay chain. + let assets: Vec = vec![ + MultiAsset { + id: Concrete(RelayLocation::get()), + fun: Fungible(1_000_000 * UNITS), + } + ]; + assets.into() + } + } + + parameter_types! { + pub const TrustedTeleporter: Option<(MultiLocation, MultiAsset)> = Some(( + RelayLocation::get(), + MultiAsset { fun: Fungible(UNITS), id: Concrete(RelayLocation::get()) }, + )); + pub const CheckedAccount: Option<(AccountId, xcm_builder::MintLocation)> = None; + pub const TrustedReserve: Option<(MultiLocation, MultiAsset)> = None; + } + + impl pallet_xcm_benchmarks::fungible::Config for Runtime { + type TransactAsset = Balances; + + type CheckedAccount = CheckedAccount; + type TrustedTeleporter = TrustedTeleporter; + type TrustedReserve = TrustedReserve; + + fn get_multi_asset() -> MultiAsset { + MultiAsset { + id: Concrete(RelayLocation::get()), + fun: Fungible(UNITS), + } + } + } + + impl pallet_xcm_benchmarks::generic::Config for Runtime { + type RuntimeCall = RuntimeCall; + type TransactAsset = Balances; + + fn worst_case_response() -> (u64, Response) { + (0u64, Response::Version(Default::default())) + } + + fn worst_case_asset_exchange() -> Result<(MultiAssets, MultiAssets), BenchmarkError> { + Err(BenchmarkError::Skip) + } + + fn universal_alias() -> Result<(MultiLocation, Junction), BenchmarkError> { + Err(BenchmarkError::Skip) + } + + fn transact_origin_and_runtime_call() -> Result<(MultiLocation, RuntimeCall), BenchmarkError> { + Ok((RelayLocation::get(), frame_system::Call::remark_with_event { remark: vec![] }.into())) + } + + fn subscribe_origin() -> Result { + Ok(RelayLocation::get()) + } + + fn claimable_asset() -> Result<(MultiLocation, MultiLocation, MultiAssets), BenchmarkError> { + let origin = RelayLocation::get(); + let assets: MultiAssets = (Concrete(RelayLocation::get()), 1_000 * UNITS).into(); + let ticket = MultiLocation { parents: 0, interior: Here }; + Ok((origin, ticket, assets)) + } + + fn unlockable_asset() -> Result<(MultiLocation, MultiLocation, MultiAsset), BenchmarkError> { + Err(BenchmarkError::Skip) + } + + fn export_message_origin_and_destination( + ) -> Result<(MultiLocation, NetworkId, InteriorMultiLocation), BenchmarkError> { + Err(BenchmarkError::Skip) + } + + fn alias_origin() -> Result<(MultiLocation, MultiLocation), BenchmarkError> { + Err(BenchmarkError::Skip) + } + } + + type XcmBalances = pallet_xcm_benchmarks::fungible::Pallet::; + type XcmGeneric = pallet_xcm_benchmarks::generic::Pallet::; + + let whitelist: Vec = vec![ + // Block Number + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac").to_vec().into(), + // Total Issuance + hex_literal::hex!("c2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80").to_vec().into(), + // Execution Phase + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7ff553b5a9862a516939d82b3d3d8661a").to_vec().into(), + // Event Count + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef70a98fdbe9ce6c55837576c60c7af3850").to_vec().into(), + // System Events + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7").to_vec().into(), + ]; + + let mut batches = Vec::::new(); + let params = (&config, &whitelist); + add_benchmarks!(params, batches); + + Ok(batches) + } + } + + impl sp_genesis_builder::GenesisBuilder for Runtime { + fn create_default_config() -> Vec { + create_default_config::() + } + + fn build_config(config: Vec) -> sp_genesis_builder::Result { + build_config::(config) + } + } +} + +cumulus_pallet_parachain_system::register_validate_block! { + Runtime = Runtime, + BlockExecutor = cumulus_pallet_aura_ext::BlockExecutor::, +} diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/people.rs b/cumulus/parachains/runtimes/people/people-rococo/src/people.rs new file mode 100644 index 00000000000..95b14a544d5 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-rococo/src/people.rs @@ -0,0 +1,204 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use super::*; +use crate::xcm_config::LocationToAccountId; +use codec::{Decode, Encode, MaxEncodedLen}; +use enumflags2::{bitflags, BitFlags}; +use frame_support::{ + parameter_types, traits::ConstU32, CloneNoBound, EqNoBound, PartialEqNoBound, + RuntimeDebugNoBound, +}; +use pallet_identity::{Data, IdentityInformationProvider}; +use parachains_common::impls::ToParentTreasury; +use scale_info::TypeInfo; +use sp_runtime::{traits::AccountIdConversion, RuntimeDebug}; +use sp_std::prelude::*; + +parameter_types! { + // 27 | Min encoded size of `Registration` + // - 10 | Min encoded size of `IdentityInfo` + // -----| + // 17 | Min size without `IdentityInfo` (accounted for in byte deposit) + pub const BasicDeposit: Balance = deposit(1, 17); + pub const ByteDeposit: Balance = deposit(0, 1); + pub const SubAccountDeposit: Balance = deposit(1, 53); + pub RelayTreasuryAccount: AccountId = + parachains_common::polkadot::account::POLKADOT_TREASURY_PALLET_ID.into_account_truncating(); +} + +impl pallet_identity::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Currency = Balances; + type BasicDeposit = BasicDeposit; + type ByteDeposit = ByteDeposit; + type SubAccountDeposit = SubAccountDeposit; + type MaxSubAccounts = ConstU32<100>; + type IdentityInformation = IdentityInfo; + type MaxRegistrars = ConstU32<20>; + type Slashed = ToParentTreasury; + type ForceOrigin = EnsureRoot; + type RegistrarOrigin = EnsureRoot; + type WeightInfo = weights::pallet_identity::WeightInfo; +} + +/// The fields that we use to identify the owner of an account with. Each corresponds to a field +/// in the `IdentityInfo` struct. +#[bitflags] +#[repr(u64)] +#[derive(Clone, Copy, PartialEq, Eq, RuntimeDebug)] +pub enum IdentityField { + Display, + Legal, + Web, + Matrix, + Email, + PgpFingerprint, + Image, + Twitter, + GitHub, + Discord, +} + +/// Information concerning the identity of the controller of an account. +#[derive( + CloneNoBound, + Encode, + Decode, + EqNoBound, + MaxEncodedLen, + PartialEqNoBound, + RuntimeDebugNoBound, + TypeInfo, +)] +#[codec(mel_bound())] +#[cfg_attr(test, derive(frame_support::DefaultNoBound))] +pub struct IdentityInfo { + /// A reasonable display name for the controller of the account. This should be whatever the + /// account is typically known as and should not be confusable with other entities, given + /// reasonable context. + /// + /// Stored as UTF-8. + pub display: Data, + + /// The full legal name in the local jurisdiction of the entity. This might be a bit + /// long-winded. + /// + /// Stored as UTF-8. + pub legal: Data, + + /// A representative website held by the controller of the account. + /// + /// NOTE: `https://` is automatically prepended. + /// + /// Stored as UTF-8. + pub web: Data, + + /// The Matrix (e.g. for Element) handle held by the controller of the account. Previously, + /// this was called `riot`. + /// + /// Stored as UTF-8. + pub matrix: Data, + + /// The email address of the controller of the account. + /// + /// Stored as UTF-8. + pub email: Data, + + /// The PGP/GPG public key of the controller of the account. + pub pgp_fingerprint: Option<[u8; 20]>, + + /// A graphic image representing the controller of the account. Should be a company, + /// organization or project logo or a headshot in the case of a human. + pub image: Data, + + /// The Twitter identity. The leading `@` character may be elided. + pub twitter: Data, + + /// The GitHub username of the controller of the account. + pub github: Data, + + /// The Discord username of the controller of the account. + pub discord: Data, +} + +impl IdentityInformationProvider for IdentityInfo { + type FieldsIdentifier = u64; + + fn has_identity(&self, fields: Self::FieldsIdentifier) -> bool { + self.fields().bits() & fields == fields + } + + #[cfg(feature = "runtime-benchmarks")] + fn create_identity_info() -> Self { + let data = Data::Raw(vec![0; 32].try_into().unwrap()); + + IdentityInfo { + display: data.clone(), + legal: data.clone(), + web: data.clone(), + matrix: data.clone(), + email: data.clone(), + pgp_fingerprint: Some([0; 20]), + image: data.clone(), + twitter: data.clone(), + github: data.clone(), + discord: data, + } + } + + #[cfg(feature = "runtime-benchmarks")] + fn all_fields() -> Self::FieldsIdentifier { + use enumflags2::BitFlag; + IdentityField::all().bits() + } +} + +impl IdentityInfo { + pub(crate) fn fields(&self) -> BitFlags { + let mut res = >::empty(); + if !self.display.is_none() { + res.insert(IdentityField::Display); + } + if !self.legal.is_none() { + res.insert(IdentityField::Legal); + } + if !self.web.is_none() { + res.insert(IdentityField::Web); + } + if !self.matrix.is_none() { + res.insert(IdentityField::Matrix); + } + if !self.email.is_none() { + res.insert(IdentityField::Email); + } + if self.pgp_fingerprint.is_some() { + res.insert(IdentityField::PgpFingerprint); + } + if !self.image.is_none() { + res.insert(IdentityField::Image); + } + if !self.twitter.is_none() { + res.insert(IdentityField::Twitter); + } + if !self.github.is_none() { + res.insert(IdentityField::GitHub); + } + if !self.discord.is_none() { + res.insert(IdentityField::Discord); + } + res + } +} diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/weights/block_weights.rs b/cumulus/parachains/runtimes/people/people-rococo/src/weights/block_weights.rs new file mode 100644 index 00000000000..b2092d875c8 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-rococo/src/weights/block_weights.rs @@ -0,0 +1,53 @@ +// This file is part of Substrate. + +// Copyright (C) 2022 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +pub mod constants { + use frame_support::{ + parameter_types, + weights::{constants, Weight}, + }; + + parameter_types! { + /// Importing a block with 0 Extrinsics. + pub const BlockExecutionWeight: Weight = + Weight::from_parts(constants::WEIGHT_REF_TIME_PER_NANOS.saturating_mul(5_000_000), 0); + } + + #[cfg(test)] + mod test_weights { + use frame_support::weights::constants; + + /// Checks that the weight exists and is sane. + // NOTE: If this test fails but you are sure that the generated values are fine, + // you can delete it. + #[test] + fn sane() { + let w = super::constants::BlockExecutionWeight::get(); + + // At least 100 µs. + assert!( + w.ref_time() >= 100u64 * constants::WEIGHT_REF_TIME_PER_MICROS, + "Weight should be at least 100 µs." + ); + // At most 50 ms. + assert!( + w.ref_time() <= 50u64 * constants::WEIGHT_REF_TIME_PER_MILLIS, + "Weight should be at most 50 ms." + ); + } + } +} diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/weights/cumulus_pallet_parachain_system.rs b/cumulus/parachains/runtimes/people/people-rococo/src/weights/cumulus_pallet_parachain_system.rs new file mode 100644 index 00000000000..fcea5fd1bf6 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-rococo/src/weights/cumulus_pallet_parachain_system.rs @@ -0,0 +1,53 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Need to rerun + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for `cumulus_pallet_parachain_system`. +pub struct WeightInfo(PhantomData); +impl cumulus_pallet_parachain_system::WeightInfo for WeightInfo { + /// Storage: ParachainSystem LastDmqMqcHead (r:1 w:1) + /// Proof Skipped: ParachainSystem LastDmqMqcHead (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem ReservedDmpWeightOverride (r:1 w:0) + /// Proof Skipped: ParachainSystem ReservedDmpWeightOverride (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: MessageQueue BookStateFor (r:1 w:1) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: MessageQueue ServiceHead (r:1 w:1) + /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(5), added: 500, mode: MaxEncodedLen) + /// Storage: ParachainSystem ProcessedDownwardMessages (r:0 w:1) + /// Proof Skipped: ParachainSystem ProcessedDownwardMessages (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: MessageQueue Pages (r:0 w:16) + /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + /// The range of component `n` is `[0, 1000]`. + fn enqueue_inbound_downward_messages(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `12` + // Estimated: `8013` + // Minimum execution time: 1_622_000 picoseconds. + Weight::from_parts(1_709_000, 0) + .saturating_add(Weight::from_parts(0, 8013)) + // Standard Error: 22_138 + .saturating_add(Weight::from_parts(23_923_169, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(4)) + } +} diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/weights/cumulus_pallet_xcmp_queue.rs b/cumulus/parachains/runtimes/people/people-rococo/src/weights/cumulus_pallet_xcmp_queue.rs new file mode 100644 index 00000000000..71ac6ef5180 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-rococo/src/weights/cumulus_pallet_xcmp_queue.rs @@ -0,0 +1,129 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Need to rerun + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `cumulus_pallet_xcmp_queue`. +pub struct WeightInfo(PhantomData); +impl cumulus_pallet_xcmp_queue::WeightInfo for WeightInfo { + /// Storage: `XcmpQueue::QueueConfig` (r:1 w:1) + /// Proof: `XcmpQueue::QueueConfig` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn set_config_with_u32() -> Weight { + // Proof Size summary in bytes: + // Measured: `76` + // Estimated: `1561` + // Minimum execution time: 5_000_000 picoseconds. + Weight::from_parts(6_000_000, 0) + .saturating_add(Weight::from_parts(0, 1561)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `XcmpQueue::QueueConfig` (r:1 w:0) + /// Proof: `XcmpQueue::QueueConfig` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `MessageQueue::BookStateFor` (r:1 w:1) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + /// Storage: `MessageQueue::ServiceHead` (r:1 w:1) + /// Proof: `MessageQueue::ServiceHead` (`max_values`: Some(1), `max_size`: Some(5), added: 500, mode: `MaxEncodedLen`) + /// Storage: `XcmpQueue::InboundXcmpSuspended` (r:1 w:0) + /// Proof: `XcmpQueue::InboundXcmpSuspended` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `MessageQueue::Pages` (r:0 w:1) + /// Proof: `MessageQueue::Pages` (`max_values`: None, `max_size`: Some(65585), added: 68060, mode: `MaxEncodedLen`) + fn enqueue_xcmp_message() -> Weight { + // Proof Size summary in bytes: + // Measured: `82` + // Estimated: `3517` + // Minimum execution time: 14_000_000 picoseconds. + Weight::from_parts(15_000_000, 0) + .saturating_add(Weight::from_parts(0, 3517)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:1) + /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn suspend_channel() -> Weight { + // Proof Size summary in bytes: + // Measured: `76` + // Estimated: `1561` + // Minimum execution time: 3_000_000 picoseconds. + Weight::from_parts(3_000_000, 0) + .saturating_add(Weight::from_parts(0, 1561)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:1) + /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn resume_channel() -> Weight { + // Proof Size summary in bytes: + // Measured: `111` + // Estimated: `1596` + // Minimum execution time: 4_000_000 picoseconds. + Weight::from_parts(4_000_000, 0) + .saturating_add(Weight::from_parts(0, 1596)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + fn take_first_concatenated_xcm() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 44_000_000 picoseconds. + Weight::from_parts(45_000_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + /// Storage: UNKNOWN KEY `0x7b3237373ffdfeb1cab4222e3b520d6b345d8e88afa015075c945637c07e8f20` (r:1 w:1) + /// Proof: UNKNOWN KEY `0x7b3237373ffdfeb1cab4222e3b520d6b345d8e88afa015075c945637c07e8f20` (r:1 w:1) + /// Storage: `XcmpQueue::InboundXcmpMessages` (r:1 w:1) + /// Proof: `XcmpQueue::InboundXcmpMessages` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `MessageQueue::BookStateFor` (r:1 w:1) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + /// Storage: `MessageQueue::ServiceHead` (r:1 w:1) + /// Proof: `MessageQueue::ServiceHead` (`max_values`: Some(1), `max_size`: Some(5), added: 500, mode: `MaxEncodedLen`) + /// Storage: `XcmpQueue::QueueConfig` (r:1 w:0) + /// Proof: `XcmpQueue::QueueConfig` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `XcmpQueue::InboundXcmpSuspended` (r:1 w:0) + /// Proof: `XcmpQueue::InboundXcmpSuspended` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `MessageQueue::Pages` (r:0 w:1) + /// Proof: `MessageQueue::Pages` (`max_values`: None, `max_size`: Some(65585), added: 68060, mode: `MaxEncodedLen`) + fn on_idle_good_msg() -> Weight { + // Proof Size summary in bytes: + // Measured: `65711` + // Estimated: `69176` + // Minimum execution time: 67_000_000 picoseconds. + Weight::from_parts(73_000_000, 0) + .saturating_add(Weight::from_parts(0, 69176)) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(5)) + } + /// Storage: UNKNOWN KEY `0x7b3237373ffdfeb1cab4222e3b520d6b345d8e88afa015075c945637c07e8f20` (r:1 w:1) + /// Proof: UNKNOWN KEY `0x7b3237373ffdfeb1cab4222e3b520d6b345d8e88afa015075c945637c07e8f20` (r:1 w:1) + fn on_idle_large_msg() -> Weight { + // Proof Size summary in bytes: + // Measured: `65710` + // Estimated: `69175` + // Minimum execution time: 49_000_000 picoseconds. + Weight::from_parts(55_000_000, 0) + .saturating_add(Weight::from_parts(0, 69175)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } +} diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/weights/extrinsic_weights.rs b/cumulus/parachains/runtimes/people/people-rococo/src/weights/extrinsic_weights.rs new file mode 100644 index 00000000000..332c3b324bb --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-rococo/src/weights/extrinsic_weights.rs @@ -0,0 +1,53 @@ +// This file is part of Substrate. + +// Copyright (C) 2022 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +pub mod constants { + use frame_support::{ + parameter_types, + weights::{constants, Weight}, + }; + + parameter_types! { + /// Executing a NO-OP `System::remarks` Extrinsic. + pub const ExtrinsicBaseWeight: Weight = + Weight::from_parts(constants::WEIGHT_REF_TIME_PER_NANOS.saturating_mul(125_000), 0); + } + + #[cfg(test)] + mod test_weights { + use frame_support::weights::constants; + + /// Checks that the weight exists and is sane. + // NOTE: If this test fails but you are sure that the generated values are fine, + // you can delete it. + #[test] + fn sane() { + let w = super::constants::ExtrinsicBaseWeight::get(); + + // At least 10 µs. + assert!( + w.ref_time() >= 10u64 * constants::WEIGHT_REF_TIME_PER_MICROS, + "Weight should be at least 10 µs." + ); + // At most 1 ms. + assert!( + w.ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, + "Weight should be at most 1 ms." + ); + } + } +} diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/weights/frame_system.rs b/cumulus/parachains/runtimes/people/people-rococo/src/weights/frame_system.rs new file mode 100644 index 00000000000..495903a4669 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-rococo/src/weights/frame_system.rs @@ -0,0 +1,160 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Autogenerated weights for `frame_system` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("people-kusama-dev"), DB CACHE: 1024 + +// Executed Command: +// ./artifacts/polkadot-parachain +// benchmark +// pallet +// --chain=people-kusama-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=frame_system +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json +// --header=./file_header.txt +// --output=./cumulus/parachains/runtimes/people/people-kusama/src/weights/frame_system.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `frame_system`. +pub struct WeightInfo(PhantomData); +impl frame_system::WeightInfo for WeightInfo { + /// The range of component `b` is `[0, 3932160]`. + fn remark(b: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_356_000 picoseconds. + Weight::from_parts(1_100_689, 0) + .saturating_add(Weight::from_parts(0, 0)) + // Standard Error: 0 + .saturating_add(Weight::from_parts(412, 0).saturating_mul(b.into())) + } + /// The range of component `b` is `[0, 3932160]`. + fn remark_with_event(b: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 7_879_000 picoseconds. + Weight::from_parts(8_041_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + // Standard Error: 0 + .saturating_add(Weight::from_parts(1_451, 0).saturating_mul(b.into())) + } + fn set_code() -> Weight { + Weight::from_parts(1_000_000, 0) + } + /// Storage: System Digest (r:1 w:1) + /// Proof Skipped: System Digest (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: unknown `0x3a686561707061676573` (r:0 w:1) + /// Proof Skipped: unknown `0x3a686561707061676573` (r:0 w:1) + fn set_heap_pages() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `1485` + // Minimum execution time: 4_358_000 picoseconds. + Weight::from_parts(4_537_000, 0) + .saturating_add(Weight::from_parts(0, 1485)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: Skipped Metadata (r:0 w:0) + /// Proof Skipped: Skipped Metadata (max_values: None, max_size: None, mode: Measured) + /// The range of component `i` is `[0, 1000]`. + fn set_storage(i: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_373_000 picoseconds. + Weight::from_parts(2_395_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + // Standard Error: 1_727 + .saturating_add(Weight::from_parts(690_266, 0).saturating_mul(i.into())) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) + } + /// Storage: Skipped Metadata (r:0 w:0) + /// Proof Skipped: Skipped Metadata (max_values: None, max_size: None, mode: Measured) + /// The range of component `i` is `[0, 1000]`. + fn kill_storage(i: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_513_000 picoseconds. + Weight::from_parts(2_540_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + // Standard Error: 815 + .saturating_add(Weight::from_parts(505_090, 0).saturating_mul(i.into())) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) + } + /// Storage: Skipped Metadata (r:0 w:0) + /// Proof Skipped: Skipped Metadata (max_values: None, max_size: None, mode: Measured) + /// The range of component `p` is `[0, 1000]`. + fn kill_prefix(p: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `68 + p * (69 ±0)` + // Estimated: `66 + p * (70 ±0)` + // Minimum execution time: 4_242_000 picoseconds. + Weight::from_parts(4_308_000, 0) + .saturating_add(Weight::from_parts(0, 66)) + // Standard Error: 1_130 + .saturating_add(Weight::from_parts(1_032_054, 0).saturating_mul(p.into())) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(p.into()))) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) + .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) + } + /// Storage: `System::AuthorizedUpgrade` (r:0 w:1) + /// Proof: `System::AuthorizedUpgrade` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + fn authorize_upgrade() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 33_027_000 picoseconds. + Weight::from_parts(33_027_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `System::AuthorizedUpgrade` (r:1 w:1) + /// Proof: `System::AuthorizedUpgrade` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + /// Storage: `System::Digest` (r:1 w:1) + /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) + /// Proof: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) + fn apply_authorized_upgrade() -> Weight { + // Proof Size summary in bytes: + // Measured: `22` + // Estimated: `1518` + // Minimum execution time: 118_101_992_000 picoseconds. + Weight::from_parts(118_101_992_000, 0) + .saturating_add(Weight::from_parts(0, 1518)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(3)) + } +} diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/weights/mod.rs b/cumulus/parachains/runtimes/people/people-rococo/src/weights/mod.rs new file mode 100644 index 00000000000..67e203cfaf5 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-rococo/src/weights/mod.rs @@ -0,0 +1,40 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Expose the auto generated weight files. + +pub mod block_weights; +pub mod cumulus_pallet_parachain_system; +pub mod cumulus_pallet_xcmp_queue; +pub mod extrinsic_weights; +pub mod frame_system; +pub mod pallet_balances; +pub mod pallet_collator_selection; +pub mod pallet_identity; +pub mod pallet_message_queue; +pub mod pallet_multisig; +pub mod pallet_session; +pub mod pallet_timestamp; +pub mod pallet_utility; +pub mod pallet_xcm; +pub mod paritydb_weights; +pub mod polkadot_runtime_common_identity_migrator; +pub mod rocksdb_weights; +pub mod xcm; + +pub use block_weights::constants::BlockExecutionWeight; +pub use extrinsic_weights::constants::ExtrinsicBaseWeight; +pub use paritydb_weights::constants::ParityDbWeight; +pub use rocksdb_weights::constants::RocksDbWeight; diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_balances.rs b/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_balances.rs new file mode 100644 index 00000000000..64d6cf4ece8 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_balances.rs @@ -0,0 +1,150 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Autogenerated weights for `pallet_balances` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("people-kusama-dev"), DB CACHE: 1024 + +// Executed Command: +// ./artifacts/polkadot-parachain +// benchmark +// pallet +// --chain=people-kusama-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_balances +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json +// --header=./file_header.txt +// --output=./cumulus/parachains/runtimes/people/people-kusama/src/weights/pallet_balances.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_balances`. +pub struct WeightInfo(PhantomData); +impl pallet_balances::WeightInfo for WeightInfo { + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + fn transfer_allow_death() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `3593` + // Minimum execution time: 63_775_000 picoseconds. + Weight::from_parts(64_181_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + fn transfer_keep_alive() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `3593` + // Minimum execution time: 47_986_000 picoseconds. + Weight::from_parts(48_308_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + fn force_set_balance_creating() -> Weight { + // Proof Size summary in bytes: + // Measured: `174` + // Estimated: `3593` + // Minimum execution time: 18_083_000 picoseconds. + Weight::from_parts(18_380_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + fn force_set_balance_killing() -> Weight { + // Proof Size summary in bytes: + // Measured: `174` + // Estimated: `3593` + // Minimum execution time: 26_341_000 picoseconds. + Weight::from_parts(26_703_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: System Account (r:2 w:2) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + fn force_transfer() -> Weight { + // Proof Size summary in bytes: + // Measured: `103` + // Estimated: `6196` + // Minimum execution time: 66_227_000 picoseconds. + Weight::from_parts(67_321_000, 0) + .saturating_add(Weight::from_parts(0, 6196)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + fn transfer_all() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `3593` + // Minimum execution time: 59_472_000 picoseconds. + Weight::from_parts(60_842_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + fn force_unreserve() -> Weight { + // Proof Size summary in bytes: + // Measured: `174` + // Estimated: `3593` + // Minimum execution time: 21_497_000 picoseconds. + Weight::from_parts(21_684_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: System Account (r:999 w:999) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// The range of component `u` is `[1, 1000]`. + fn upgrade_accounts(u: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0 + u * (136 ±0)` + // Estimated: `990 + u * (2603 ±0)` + // Minimum execution time: 20_385_000 picoseconds. + Weight::from_parts(20_587_000, 0) + .saturating_add(Weight::from_parts(0, 990)) + // Standard Error: 10_001 + .saturating_add(Weight::from_parts(16_801_557, 0).saturating_mul(u.into())) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) + .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) + } +} diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_collator_selection.rs b/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_collator_selection.rs new file mode 100644 index 00000000000..e6c0f5ffebd --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_collator_selection.rs @@ -0,0 +1,242 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Autogenerated weights for `pallet_collator_selection` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("people-kusama-dev"), DB CACHE: 1024 + +// Executed Command: +// ./artifacts/polkadot-parachain +// benchmark +// pallet +// --chain=people-kusama-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_collator_selection +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json +// --header=./file_header.txt +// --output=./cumulus/parachains/runtimes/people/people-kusama/src/weights/pallet_collator_selection.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_collator_selection`. +pub struct WeightInfo(PhantomData); +impl pallet_collator_selection::WeightInfo for WeightInfo { + /// Storage: Session NextKeys (r:100 w:0) + /// Proof Skipped: Session NextKeys (max_values: None, max_size: None, mode: Measured) + /// Storage: CollatorSelection Invulnerables (r:0 w:1) + /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) + /// The range of component `b` is `[1, 100]`. + fn set_invulnerables(b: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `214 + b * (78 ±0)` + // Estimated: `1203 + b * (2554 ±0)` + // Minimum execution time: 14_702_000 picoseconds. + Weight::from_parts(14_995_989, 0) + .saturating_add(Weight::from_parts(0, 1203)) + // Standard Error: 2_975 + .saturating_add(Weight::from_parts(2_630_139, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b.into()))) + .saturating_add(T::DbWeight::get().writes(1)) + .saturating_add(Weight::from_parts(0, 2554).saturating_mul(b.into())) + } + /// Storage: CollatorSelection DesiredCandidates (r:0 w:1) + /// Proof: CollatorSelection DesiredCandidates (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + fn set_desired_candidates() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 6_916_000 picoseconds. + Weight::from_parts(7_224_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `CollatorSelection::CandidacyBond` (r:0 w:1) + /// Proof: `CollatorSelection::CandidacyBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + fn set_candidacy_bond(_c: u32, _k: u32) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 7_388_000 picoseconds. + Weight::from_parts(7_677_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: CollatorSelection Candidates (r:1 w:1) + /// Proof: CollatorSelection Candidates (max_values: Some(1), max_size: Some(48002), added: 48497, mode: MaxEncodedLen) + /// Storage: CollatorSelection DesiredCandidates (r:1 w:0) + /// Proof: CollatorSelection DesiredCandidates (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: CollatorSelection Invulnerables (r:1 w:0) + /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) + /// Storage: Session NextKeys (r:1 w:0) + /// Proof Skipped: Session NextKeys (max_values: None, max_size: None, mode: Measured) + /// Storage: CollatorSelection CandidacyBond (r:1 w:0) + /// Proof: CollatorSelection CandidacyBond (max_values: Some(1), max_size: Some(16), added: 511, mode: MaxEncodedLen) + /// Storage: CollatorSelection LastAuthoredBlock (r:0 w:1) + /// Proof: CollatorSelection LastAuthoredBlock (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) + /// The range of component `c` is `[1, 999]`. + fn register_as_candidate(c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `1104 + c * (48 ±0)` + // Estimated: `49487 + c * (49 ±0)` + // Minimum execution time: 42_377_000 picoseconds. + Weight::from_parts(34_785_115, 0) + .saturating_add(Weight::from_parts(0, 49487)) + // Standard Error: 1_226 + .saturating_add(Weight::from_parts(101_867, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(2)) + .saturating_add(Weight::from_parts(0, 49).saturating_mul(c.into())) + } + /// Storage: CollatorSelection Candidates (r:1 w:1) + /// Proof: CollatorSelection Candidates (max_values: Some(1), max_size: Some(48002), added: 48497, mode: MaxEncodedLen) + /// Storage: CollatorSelection LastAuthoredBlock (r:0 w:1) + /// Proof: CollatorSelection LastAuthoredBlock (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) + /// The range of component `c` is `[6, 1000]`. + fn leave_intent(c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `428 + c * (48 ±0)` + // Estimated: `49487` + // Minimum execution time: 33_648_000 picoseconds. + Weight::from_parts(24_533_176, 0) + .saturating_add(Weight::from_parts(0, 49487)) + // Standard Error: 1_388 + .saturating_add(Weight::from_parts(103_733, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: System Account (r:2 w:2) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: System BlockWeight (r:1 w:1) + /// Proof: System BlockWeight (max_values: Some(1), max_size: Some(48), added: 543, mode: MaxEncodedLen) + /// Storage: CollatorSelection LastAuthoredBlock (r:0 w:1) + /// Proof: CollatorSelection LastAuthoredBlock (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) + fn note_author() -> Weight { + // Proof Size summary in bytes: + // Measured: `155` + // Estimated: `6196` + // Minimum execution time: 44_705_000 picoseconds. + Weight::from_parts(45_288_000, 0) + .saturating_add(Weight::from_parts(0, 6196)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(4)) + } + /// Storage: Session NextKeys (r:1 w:0) + /// Proof Skipped: Session NextKeys (max_values: None, max_size: None, mode: Measured) + /// Storage: CollatorSelection Invulnerables (r:1 w:1) + /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(641), added: 1136, mode: MaxEncodedLen) + /// Storage: CollatorSelection Candidates (r:1 w:1) + /// Proof: CollatorSelection Candidates (max_values: Some(1), max_size: Some(4802), added: 5297, mode: MaxEncodedLen) + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// The range of component `b` is `[1, 19]`. + /// The range of component `c` is `[1, 99]`. + fn add_invulnerable(b: u32, c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `757 + b * (32 ±0) + c * (53 ±0)` + // Estimated: `6287 + b * (37 ±0) + c * (53 ±0)` + // Minimum execution time: 52_720_000 picoseconds. + Weight::from_parts(56_102_459, 0) + .saturating_add(Weight::from_parts(0, 6287)) + // Standard Error: 12_957 + .saturating_add(Weight::from_parts(26_422, 0).saturating_mul(b.into())) + // Standard Error: 2_456 + .saturating_add(Weight::from_parts(128_528, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(3)) + .saturating_add(Weight::from_parts(0, 37).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(0, 53).saturating_mul(c.into())) + } + fn update_bond(c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `306 + c * (50 ±0)` + // Estimated: `6287` + // Minimum execution time: 34_814_000 picoseconds. + Weight::from_parts(36_371_520, 0) + .saturating_add(Weight::from_parts(0, 6287)) + // Standard Error: 2_391 + .saturating_add(Weight::from_parts(201_700, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + fn take_candidate_slot(c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `306 + c * (50 ±0)` + // Estimated: `6287` + // Minimum execution time: 34_814_000 picoseconds. + Weight::from_parts(36_371_520, 0) + .saturating_add(Weight::from_parts(0, 6287)) + // Standard Error: 2_391 + .saturating_add(Weight::from_parts(201_700, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: CollatorSelection Invulnerables (r:1 w:1) + /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) + /// The range of component `b` is `[1, 100]`. + fn remove_invulnerable(b: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `119 + b * (32 ±0)` + // Estimated: `4687` + // Minimum execution time: 183_054_000 picoseconds. + Weight::from_parts(197_205_427, 0) + .saturating_add(Weight::from_parts(0, 4687)) + // Standard Error: 13_533 + .saturating_add(Weight::from_parts(376_231, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: CollatorSelection Candidates (r:1 w:0) + /// Proof: CollatorSelection Candidates (max_values: Some(1), max_size: Some(48002), added: 48497, mode: MaxEncodedLen) + /// Storage: CollatorSelection LastAuthoredBlock (r:999 w:0) + /// Proof: CollatorSelection LastAuthoredBlock (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) + /// Storage: CollatorSelection Invulnerables (r:1 w:0) + /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) + /// Storage: System BlockWeight (r:1 w:1) + /// Proof: System BlockWeight (max_values: Some(1), max_size: Some(48), added: 543, mode: MaxEncodedLen) + /// Storage: System Account (r:995 w:995) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// The range of component `r` is `[1, 1000]`. + /// The range of component `c` is `[1, 1000]`. + fn new_session(r: u32, c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `22815 + c * (97 ±0) + r * (116 ±0)` + // Estimated: `49487 + c * (2519 ±0) + r * (2602 ±0)` + // Minimum execution time: 16_845_000 picoseconds. + Weight::from_parts(16_962_000, 0) + .saturating_add(Weight::from_parts(0, 49487)) + // Standard Error: 858_960 + .saturating_add(Weight::from_parts(30_464_644, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into()))) + .saturating_add(T::DbWeight::get().writes(1)) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(c.into()))) + .saturating_add(Weight::from_parts(0, 2519).saturating_mul(c.into())) + .saturating_add(Weight::from_parts(0, 2602).saturating_mul(r.into())) + } +} diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_identity.rs b/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_identity.rs new file mode 100644 index 00000000000..65cac7875ba --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_identity.rs @@ -0,0 +1,315 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Taken from Rococo Relay Chain. Needs to rerun. + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_identity`. +pub struct WeightInfo(PhantomData); +impl pallet_identity::WeightInfo for WeightInfo { + /// Storage: Identity Registrars (r:1 w:1) + /// Proof: Identity Registrars (max_values: Some(1), max_size: Some(1141), added: 1636, mode: MaxEncodedLen) + /// The range of component `r` is `[1, 19]`. + fn add_registrar(r: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `32 + r * (57 ±0)` + // Estimated: `2626` + // Minimum execution time: 12_290_000 picoseconds. + Weight::from_parts(12_664_362, 0) + .saturating_add(Weight::from_parts(0, 2626)) + // Standard Error: 1_347 + .saturating_add(Weight::from_parts(88_179, 0).saturating_mul(r.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Identity IdentityOf (r:1 w:1) + /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) + /// The range of component `r` is `[1, 20]`. + fn set_identity(r: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `442 + r * (5 ±0)` + // Estimated: `11003` + // Minimum execution time: 31_373_000 picoseconds. + Weight::from_parts(30_435_545, 0) + .saturating_add(Weight::from_parts(0, 11003)) + // Standard Error: 2_307 + .saturating_add(Weight::from_parts(92_753, 0).saturating_mul(r.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Identity IdentityOf (r:1 w:0) + /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) + /// Storage: Identity SubsOf (r:1 w:1) + /// Proof: Identity SubsOf (max_values: None, max_size: Some(3258), added: 5733, mode: MaxEncodedLen) + /// Storage: Identity SuperOf (r:100 w:100) + /// Proof: Identity SuperOf (max_values: None, max_size: Some(114), added: 2589, mode: MaxEncodedLen) + /// The range of component `s` is `[0, 100]`. + fn set_subs_new(s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `101` + // Estimated: `11003 + s * (2589 ±0)` + // Minimum execution time: 9_251_000 picoseconds. + Weight::from_parts(22_039_210, 0) + .saturating_add(Weight::from_parts(0, 11003)) + // Standard Error: 40_779 + .saturating_add(Weight::from_parts(2_898_525, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(s.into()))) + .saturating_add(T::DbWeight::get().writes(1)) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(s.into()))) + .saturating_add(Weight::from_parts(0, 2589).saturating_mul(s.into())) + } + /// Storage: Identity IdentityOf (r:1 w:0) + /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) + /// Storage: Identity SubsOf (r:1 w:1) + /// Proof: Identity SubsOf (max_values: None, max_size: Some(3258), added: 5733, mode: MaxEncodedLen) + /// Storage: Identity SuperOf (r:0 w:100) + /// Proof: Identity SuperOf (max_values: None, max_size: Some(114), added: 2589, mode: MaxEncodedLen) + /// The range of component `p` is `[0, 100]`. + fn set_subs_old(p: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `194 + p * (32 ±0)` + // Estimated: `11003` + // Minimum execution time: 9_329_000 picoseconds. + Weight::from_parts(24_055_061, 0) + .saturating_add(Weight::from_parts(0, 11003)) + // Standard Error: 3_428 + .saturating_add(Weight::from_parts(1_130_604, 0).saturating_mul(p.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) + } + /// Storage: Identity SubsOf (r:1 w:1) + /// Proof: Identity SubsOf (max_values: None, max_size: Some(3258), added: 5733, mode: MaxEncodedLen) + /// Storage: Identity IdentityOf (r:1 w:1) + /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) + /// Storage: Identity SuperOf (r:0 w:100) + /// Proof: Identity SuperOf (max_values: None, max_size: Some(114), added: 2589, mode: MaxEncodedLen) + /// The range of component `r` is `[1, 20]`. + /// The range of component `s` is `[0, 100]`. + fn clear_identity(_r: u32, s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `469 + r * (5 ±0) + s * (32 ±0) + x * (66 ±0)` + // Estimated: `11003` + // Minimum execution time: 53_365_000 picoseconds. + Weight::from_parts(35_391_422, 0) + .saturating_add(Weight::from_parts(0, 11003)) + // Standard Error: 1_353 + .saturating_add(Weight::from_parts(1_074_019, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(s.into()))) + } + /// Storage: Identity Registrars (r:1 w:0) + /// Proof: Identity Registrars (max_values: Some(1), max_size: Some(1141), added: 1636, mode: MaxEncodedLen) + /// Storage: Identity IdentityOf (r:1 w:1) + /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) + /// The range of component `r` is `[1, 20]`. + fn request_judgement(r: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `367 + r * (57 ±0) + x * (66 ±0)` + // Estimated: `11003` + // Minimum execution time: 32_509_000 picoseconds. + Weight::from_parts(31_745_585, 0) + .saturating_add(Weight::from_parts(0, 11003)) + // Standard Error: 2_214 + .saturating_add(Weight::from_parts(83_822, 0).saturating_mul(r.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Identity IdentityOf (r:1 w:1) + /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) + /// The range of component `r` is `[1, 20]`. + fn cancel_request(r: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `398 + x * (66 ±0)` + // Estimated: `11003` + // Minimum execution time: 29_609_000 picoseconds. + Weight::from_parts(28_572_602, 0) + .saturating_add(Weight::from_parts(0, 11003)) + // Standard Error: 2_528 + .saturating_add(Weight::from_parts(85_593, 0).saturating_mul(r.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Identity Registrars (r:1 w:1) + /// Proof: Identity Registrars (max_values: Some(1), max_size: Some(1141), added: 1636, mode: MaxEncodedLen) + /// The range of component `r` is `[1, 19]`. + fn set_fee(r: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `89 + r * (57 ±0)` + // Estimated: `2626` + // Minimum execution time: 7_793_000 picoseconds. + Weight::from_parts(8_173_888, 0) + .saturating_add(Weight::from_parts(0, 2626)) + // Standard Error: 1_569 + .saturating_add(Weight::from_parts(72_367, 0).saturating_mul(r.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Identity Registrars (r:1 w:1) + /// Proof: Identity Registrars (max_values: Some(1), max_size: Some(1141), added: 1636, mode: MaxEncodedLen) + /// The range of component `r` is `[1, 19]`. + fn set_account_id(r: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `89 + r * (57 ±0)` + // Estimated: `2626` + // Minimum execution time: 7_708_000 picoseconds. + Weight::from_parts(8_091_149, 0) + .saturating_add(Weight::from_parts(0, 2626)) + // Standard Error: 869 + .saturating_add(Weight::from_parts(87_993, 0).saturating_mul(r.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Identity Registrars (r:1 w:1) + /// Proof: Identity Registrars (max_values: Some(1), max_size: Some(1141), added: 1636, mode: MaxEncodedLen) + /// The range of component `r` is `[1, 19]`. + fn set_fields(r: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `89 + r * (57 ±0)` + // Estimated: `2626` + // Minimum execution time: 7_601_000 picoseconds. + Weight::from_parts(8_038_414, 0) + .saturating_add(Weight::from_parts(0, 2626)) + // Standard Error: 1_041 + .saturating_add(Weight::from_parts(82_588, 0).saturating_mul(r.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Identity Registrars (r:1 w:0) + /// Proof: Identity Registrars (max_values: Some(1), max_size: Some(1141), added: 1636, mode: MaxEncodedLen) + /// Storage: Identity IdentityOf (r:1 w:1) + /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) + /// The range of component `r` is `[1, 19]`. + fn provide_judgement(r: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `445 + r * (57 ±0) + x * (66 ±0)` + // Estimated: `11003` + // Minimum execution time: 23_114_000 picoseconds. + Weight::from_parts(22_076_548, 0) + .saturating_add(Weight::from_parts(0, 11003)) + // Standard Error: 2_881 + .saturating_add(Weight::from_parts(109_812, 0).saturating_mul(r.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Identity SubsOf (r:1 w:1) + /// Proof: Identity SubsOf (max_values: None, max_size: Some(3258), added: 5733, mode: MaxEncodedLen) + /// Storage: Identity IdentityOf (r:1 w:1) + /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: Identity SuperOf (r:0 w:100) + /// Proof: Identity SuperOf (max_values: None, max_size: Some(114), added: 2589, mode: MaxEncodedLen) + /// The range of component `r` is `[1, 20]`. + /// The range of component `s` is `[0, 100]`. + fn kill_identity(r: u32, s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `676 + r * (5 ±0) + s * (32 ±0) + x * (66 ±0)` + // Estimated: `11003` + // Minimum execution time: 70_007_000 picoseconds. + Weight::from_parts(50_186_495, 0) + .saturating_add(Weight::from_parts(0, 11003)) + // Standard Error: 6_533 + .saturating_add(Weight::from_parts(15_486, 0).saturating_mul(r.into())) + // Standard Error: 1_275 + .saturating_add(Weight::from_parts(1_085_117, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(3)) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(s.into()))) + } + /// Storage: Identity IdentityOf (r:1 w:0) + /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) + /// Storage: Identity SuperOf (r:1 w:1) + /// Proof: Identity SuperOf (max_values: None, max_size: Some(114), added: 2589, mode: MaxEncodedLen) + /// Storage: Identity SubsOf (r:1 w:1) + /// Proof: Identity SubsOf (max_values: None, max_size: Some(3258), added: 5733, mode: MaxEncodedLen) + /// The range of component `s` is `[0, 99]`. + fn add_sub(s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `475 + s * (36 ±0)` + // Estimated: `11003` + // Minimum execution time: 28_453_000 picoseconds. + Weight::from_parts(33_165_934, 0) + .saturating_add(Weight::from_parts(0, 11003)) + // Standard Error: 1_217 + .saturating_add(Weight::from_parts(65_401, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: Identity IdentityOf (r:1 w:0) + /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) + /// Storage: Identity SuperOf (r:1 w:1) + /// Proof: Identity SuperOf (max_values: None, max_size: Some(114), added: 2589, mode: MaxEncodedLen) + /// The range of component `s` is `[1, 100]`. + fn rename_sub(s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `591 + s * (3 ±0)` + // Estimated: `11003` + // Minimum execution time: 12_846_000 picoseconds. + Weight::from_parts(14_710_284, 0) + .saturating_add(Weight::from_parts(0, 11003)) + // Standard Error: 496 + .saturating_add(Weight::from_parts(19_539, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Identity IdentityOf (r:1 w:0) + /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) + /// Storage: Identity SuperOf (r:1 w:1) + /// Proof: Identity SuperOf (max_values: None, max_size: Some(114), added: 2589, mode: MaxEncodedLen) + /// Storage: Identity SubsOf (r:1 w:1) + /// Proof: Identity SubsOf (max_values: None, max_size: Some(3258), added: 5733, mode: MaxEncodedLen) + /// The range of component `s` is `[1, 100]`. + fn remove_sub(s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `638 + s * (35 ±0)` + // Estimated: `11003` + // Minimum execution time: 32_183_000 picoseconds. + Weight::from_parts(35_296_731, 0) + .saturating_add(Weight::from_parts(0, 11003)) + // Standard Error: 854 + .saturating_add(Weight::from_parts(52_028, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: Identity SuperOf (r:1 w:1) + /// Proof: Identity SuperOf (max_values: None, max_size: Some(114), added: 2589, mode: MaxEncodedLen) + /// Storage: Identity SubsOf (r:1 w:1) + /// Proof: Identity SubsOf (max_values: None, max_size: Some(3258), added: 5733, mode: MaxEncodedLen) + /// Storage: System Account (r:1 w:0) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// The range of component `s` is `[0, 99]`. + fn quit_sub(s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `704 + s * (37 ±0)` + // Estimated: `6723` + // Minimum execution time: 24_941_000 picoseconds. + Weight::from_parts(27_433_059, 0) + .saturating_add(Weight::from_parts(0, 6723)) + // Standard Error: 856 + .saturating_add(Weight::from_parts(57_463, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(2)) + } +} diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_message_queue.rs b/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_message_queue.rs new file mode 100644 index 00000000000..fe1911b77a7 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_message_queue.rs @@ -0,0 +1,156 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Need to rerun + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for `pallet_message_queue`. +pub struct WeightInfo(PhantomData); +impl pallet_message_queue::WeightInfo for WeightInfo { + /// Storage: MessageQueue ServiceHead (r:1 w:0) + /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(5), added: 500, mode: MaxEncodedLen) + /// Storage: MessageQueue BookStateFor (r:2 w:2) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + fn ready_ring_knit() -> Weight { + // Proof Size summary in bytes: + // Measured: `189` + // Estimated: `7534` + // Minimum execution time: 13_668_000 picoseconds. + Weight::from_parts(13_668_000, 0) + .saturating_add(Weight::from_parts(0, 7534)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: MessageQueue BookStateFor (r:2 w:2) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: MessageQueue ServiceHead (r:1 w:1) + /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(5), added: 500, mode: MaxEncodedLen) + fn ready_ring_unknit() -> Weight { + // Proof Size summary in bytes: + // Measured: `184` + // Estimated: `7534` + // Minimum execution time: 11_106_000 picoseconds. + Weight::from_parts(11_106_000, 0) + .saturating_add(Weight::from_parts(0, 7534)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: MessageQueue BookStateFor (r:1 w:1) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + fn service_queue_base() -> Weight { + // Proof Size summary in bytes: + // Measured: `6` + // Estimated: `3517` + // Minimum execution time: 4_921_000 picoseconds. + Weight::from_parts(4_921_000, 0) + .saturating_add(Weight::from_parts(0, 3517)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: MessageQueue Pages (r:1 w:1) + /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + fn service_page_base_completion() -> Weight { + // Proof Size summary in bytes: + // Measured: `72` + // Estimated: `69050` + // Minimum execution time: 6_879_000 picoseconds. + Weight::from_parts(6_879_000, 0) + .saturating_add(Weight::from_parts(0, 69050)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: MessageQueue Pages (r:1 w:1) + /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + fn service_page_base_no_completion() -> Weight { + // Proof Size summary in bytes: + // Measured: `72` + // Estimated: `69050` + // Minimum execution time: 7_564_000 picoseconds. + Weight::from_parts(7_564_000, 0) + .saturating_add(Weight::from_parts(0, 69050)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + fn service_page_item() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 59_963_000 picoseconds. + Weight::from_parts(59_963_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + /// Storage: MessageQueue ServiceHead (r:1 w:1) + /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(5), added: 500, mode: MaxEncodedLen) + /// Storage: MessageQueue BookStateFor (r:1 w:0) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + fn bump_service_head() -> Weight { + // Proof Size summary in bytes: + // Measured: `99` + // Estimated: `5007` + // Minimum execution time: 7_200_000 picoseconds. + Weight::from_parts(7_200_000, 0) + .saturating_add(Weight::from_parts(0, 5007)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: MessageQueue BookStateFor (r:1 w:1) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: MessageQueue Pages (r:1 w:1) + /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + fn reap_page() -> Weight { + // Proof Size summary in bytes: + // Measured: `65667` + // Estimated: `72567` + // Minimum execution time: 41_366_000 picoseconds. + Weight::from_parts(41_366_000, 0) + .saturating_add(Weight::from_parts(0, 72567)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: MessageQueue BookStateFor (r:1 w:1) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: MessageQueue Pages (r:1 w:1) + /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + fn execute_overweight_page_removed() -> Weight { + // Proof Size summary in bytes: + // Measured: `65667` + // Estimated: `72567` + // Minimum execution time: 60_538_000 picoseconds. + Weight::from_parts(60_538_000, 0) + .saturating_add(Weight::from_parts(0, 72567)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: MessageQueue BookStateFor (r:1 w:1) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: MessageQueue Pages (r:1 w:1) + /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + fn execute_overweight_page_updated() -> Weight { + // Proof Size summary in bytes: + // Measured: `65667` + // Estimated: `72567` + // Minimum execution time: 73_665_000 picoseconds. + Weight::from_parts(73_665_000, 0) + .saturating_add(Weight::from_parts(0, 72567)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } +} diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_multisig.rs b/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_multisig.rs new file mode 100644 index 00000000000..73abb62b048 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_multisig.rs @@ -0,0 +1,162 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Autogenerated weights for `pallet_multisig` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("people-kusama-dev"), DB CACHE: 1024 + +// Executed Command: +// ./artifacts/polkadot-parachain +// benchmark +// pallet +// --chain=people-kusama-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_multisig +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json +// --header=./file_header.txt +// --output=./cumulus/parachains/runtimes/people/people-kusama/src/weights/pallet_multisig.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_multisig`. +pub struct WeightInfo(PhantomData); +impl pallet_multisig::WeightInfo for WeightInfo { + /// The range of component `z` is `[0, 10000]`. + fn as_multi_threshold_1(z: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 11_056_000 picoseconds. + Weight::from_parts(11_510_137, 0) + .saturating_add(Weight::from_parts(0, 0)) + // Standard Error: 1 + .saturating_add(Weight::from_parts(528, 0).saturating_mul(z.into())) + } + /// Storage: Multisig Multisigs (r:1 w:1) + /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) + /// The range of component `s` is `[2, 100]`. + /// The range of component `z` is `[0, 10000]`. + fn as_multi_create(s: u32, z: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `263 + s * (2 ±0)` + // Estimated: `6811` + // Minimum execution time: 41_105_000 picoseconds. + Weight::from_parts(34_947_072, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 499 + .saturating_add(Weight::from_parts(67_375, 0).saturating_mul(s.into())) + // Standard Error: 4 + .saturating_add(Weight::from_parts(1_227, 0).saturating_mul(z.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Multisig Multisigs (r:1 w:1) + /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) + /// The range of component `s` is `[3, 100]`. + /// The range of component `z` is `[0, 10000]`. + fn as_multi_approve(s: u32, z: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `282` + // Estimated: `6811` + // Minimum execution time: 26_640_000 picoseconds. + Weight::from_parts(21_515_344, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 943 + .saturating_add(Weight::from_parts(58_769, 0).saturating_mul(s.into())) + // Standard Error: 9 + .saturating_add(Weight::from_parts(1_233, 0).saturating_mul(z.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Multisig Multisigs (r:1 w:1) + /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// The range of component `s` is `[2, 100]`. + /// The range of component `z` is `[0, 10000]`. + fn as_multi_complete(s: u32, z: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `388 + s * (33 ±0)` + // Estimated: `6811` + // Minimum execution time: 45_875_000 picoseconds. + Weight::from_parts(38_052_994, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 507 + .saturating_add(Weight::from_parts(82_957, 0).saturating_mul(s.into())) + // Standard Error: 4 + .saturating_add(Weight::from_parts(1_277, 0).saturating_mul(z.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: Multisig Multisigs (r:1 w:1) + /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) + /// The range of component `s` is `[2, 100]`. + fn approve_as_multi_create(s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `263 + s * (2 ±0)` + // Estimated: `6811` + // Minimum execution time: 32_359_000 picoseconds. + Weight::from_parts(33_845_761, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 623 + .saturating_add(Weight::from_parts(69_809, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Multisig Multisigs (r:1 w:1) + /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) + /// The range of component `s` is `[2, 100]`. + fn approve_as_multi_approve(s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `282` + // Estimated: `6811` + // Minimum execution time: 18_791_000 picoseconds. + Weight::from_parts(20_017_375, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 466 + .saturating_add(Weight::from_parts(64_780, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Multisig Multisigs (r:1 w:1) + /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) + /// The range of component `s` is `[2, 100]`. + fn cancel_as_multi(s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `454 + s * (1 ±0)` + // Estimated: `6811` + // Minimum execution time: 33_132_000 picoseconds. + Weight::from_parts(34_485_734, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 601 + .saturating_add(Weight::from_parts(70_191, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } +} diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_session.rs b/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_session.rs new file mode 100644 index 00000000000..a6b715e6e6e --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_session.rs @@ -0,0 +1,78 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Autogenerated weights for `pallet_session` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("people-kusama-dev"), DB CACHE: 1024 + +// Executed Command: +// ./artifacts/polkadot-parachain +// benchmark +// pallet +// --chain=people-kusama-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_session +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json +// --header=./file_header.txt +// --output=./cumulus/parachains/runtimes/people/people-kusama/src/weights/pallet_session.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_session`. +pub struct WeightInfo(PhantomData); +impl pallet_session::WeightInfo for WeightInfo { + /// Storage: Session NextKeys (r:1 w:1) + /// Proof Skipped: Session NextKeys (max_values: None, max_size: None, mode: Measured) + /// Storage: Session KeyOwner (r:1 w:1) + /// Proof Skipped: Session KeyOwner (max_values: None, max_size: None, mode: Measured) + fn set_keys() -> Weight { + // Proof Size summary in bytes: + // Measured: `297` + // Estimated: `3762` + // Minimum execution time: 17_809_000 picoseconds. + Weight::from_parts(18_215_000, 0) + .saturating_add(Weight::from_parts(0, 3762)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: Session NextKeys (r:1 w:1) + /// Proof Skipped: Session NextKeys (max_values: None, max_size: None, mode: Measured) + /// Storage: Session KeyOwner (r:0 w:1) + /// Proof Skipped: Session KeyOwner (max_values: None, max_size: None, mode: Measured) + fn purge_keys() -> Weight { + // Proof Size summary in bytes: + // Measured: `279` + // Estimated: `3744` + // Minimum execution time: 13_565_000 picoseconds. + Weight::from_parts(13_841_000, 0) + .saturating_add(Weight::from_parts(0, 3744)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(2)) + } +} diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_timestamp.rs b/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_timestamp.rs new file mode 100644 index 00000000000..c85e7fb8c32 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_timestamp.rs @@ -0,0 +1,72 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Autogenerated weights for `pallet_timestamp` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("people-kusama-dev"), DB CACHE: 1024 + +// Executed Command: +// ./artifacts/polkadot-parachain +// benchmark +// pallet +// --chain=people-kusama-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_timestamp +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json +// --header=./file_header.txt +// --output=./cumulus/parachains/runtimes/people/people-kusama/src/weights/pallet_timestamp.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_timestamp`. +pub struct WeightInfo(PhantomData); +impl pallet_timestamp::WeightInfo for WeightInfo { + /// Storage: Timestamp Now (r:1 w:1) + /// Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + /// Storage: Aura CurrentSlot (r:1 w:0) + /// Proof: Aura CurrentSlot (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + fn set() -> Weight { + // Proof Size summary in bytes: + // Measured: `49` + // Estimated: `1493` + // Minimum execution time: 7_796_000 picoseconds. + Weight::from_parts(8_128_000, 0) + .saturating_add(Weight::from_parts(0, 1493)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + fn on_finalize() -> Weight { + // Proof Size summary in bytes: + // Measured: `57` + // Estimated: `0` + // Minimum execution time: 3_268_000 picoseconds. + Weight::from_parts(3_351_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } +} diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_utility.rs b/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_utility.rs new file mode 100644 index 00000000000..134bd1fbbc5 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_utility.rs @@ -0,0 +1,99 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Autogenerated weights for `pallet_utility` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("people-kusama-dev"), DB CACHE: 1024 + +// Executed Command: +// ./artifacts/polkadot-parachain +// benchmark +// pallet +// --chain=people-kusama-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_utility +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json +// --header=./file_header.txt +// --output=./cumulus/parachains/runtimes/people/people-kusama/src/weights/pallet_utility.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_utility`. +pub struct WeightInfo(PhantomData); +impl pallet_utility::WeightInfo for WeightInfo { + /// The range of component `c` is `[0, 1000]`. + fn batch(c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 7_032_000 picoseconds. + Weight::from_parts(7_713_695, 0) + .saturating_add(Weight::from_parts(0, 0)) + // Standard Error: 2_526 + .saturating_add(Weight::from_parts(4_329_716, 0).saturating_mul(c.into())) + } + fn as_derivative() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 4_961_000 picoseconds. + Weight::from_parts(5_064_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + /// The range of component `c` is `[0, 1000]`. + fn batch_all(c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 6_955_000 picoseconds. + Weight::from_parts(17_856_282, 0) + .saturating_add(Weight::from_parts(0, 0)) + // Standard Error: 3_463 + .saturating_add(Weight::from_parts(4_554_734, 0).saturating_mul(c.into())) + } + fn dispatch_as() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 8_841_000 picoseconds. + Weight::from_parts(9_004_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + /// The range of component `c` is `[0, 1000]`. + fn force_batch(c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 6_737_000 picoseconds. + Weight::from_parts(7_653_355, 0) + .saturating_add(Weight::from_parts(0, 0)) + // Standard Error: 3_915 + .saturating_add(Weight::from_parts(4_372_646, 0).saturating_mul(c.into())) + } +} diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_xcm.rs b/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_xcm.rs new file mode 100644 index 00000000000..0f793524de9 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_xcm.rs @@ -0,0 +1,342 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Autogenerated weights for `pallet_xcm` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("people-kusama-dev"), DB CACHE: 1024 + +// Executed Command: +// ./artifacts/polkadot-parachain +// benchmark +// pallet +// --chain=people-kusama-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_xcm +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json +// --header=./file_header.txt +// --output=./cumulus/parachains/runtimes/people/people-kusama/src/weights/pallet_xcm.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_xcm`. +pub struct WeightInfo(PhantomData); +impl pallet_xcm::WeightInfo for WeightInfo { + /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem HostConfiguration (r:1 w:0) + /// Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + fn send() -> Weight { + // Proof Size summary in bytes: + // Measured: `38` + // Estimated: `3503` + // Minimum execution time: 25_931_000 picoseconds. + Weight::from_parts(26_340_000, 0) + .saturating_add(Weight::from_parts(0, 3503)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: ParachainInfo ParachainId (r:1 w:0) + /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + fn teleport_assets() -> Weight { + // Proof Size summary in bytes: + // Measured: `32` + // Estimated: `1489` + // Minimum execution time: 25_691_000 picoseconds. + Weight::from_parts(25_971_000, 0) + .saturating_add(Weight::from_parts(0, 1489)) + .saturating_add(T::DbWeight::get().reads(1)) + } + /// Storage: Benchmark Override (r:0 w:0) + /// Proof Skipped: Benchmark Override (max_values: None, max_size: None, mode: Measured) + fn reserve_transfer_assets() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. + Weight::from_parts(18_446_744_073_709_551_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) + /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Account` (r:2 w:2) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:2 w:2) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) + /// Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn transfer_assets() -> Weight { + // Proof Size summary in bytes: + // Measured: `496` + // Estimated: `6208` + // Minimum execution time: 146_932_000 picoseconds. + Weight::from_parts(153_200_000, 0) + .saturating_add(Weight::from_parts(0, 6208)) + .saturating_add(T::DbWeight::get().reads(12)) + .saturating_add(T::DbWeight::get().writes(7)) + } + /// Storage: Benchmark Override (r:0 w:0) + /// Proof Skipped: Benchmark Override (max_values: None, max_size: None, mode: Measured) + fn execute() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. + Weight::from_parts(18_446_744_073_709_551_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + /// Storage: PolkadotXcm SupportedVersion (r:0 w:1) + /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + fn force_xcm_version() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_572_000 picoseconds. + Weight::from_parts(9_924_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: PolkadotXcm SafeXcmVersion (r:0 w:1) + /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + fn force_default_xcm_version() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_997_000 picoseconds. + Weight::from_parts(3_136_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: PolkadotXcm VersionNotifiers (r:1 w:1) + /// Proof Skipped: PolkadotXcm VersionNotifiers (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm QueryCounter (r:1 w:1) + /// Proof Skipped: PolkadotXcm QueryCounter (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem HostConfiguration (r:1 w:0) + /// Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: PolkadotXcm Queries (r:0 w:1) + /// Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) + fn force_subscribe_version_notify() -> Weight { + // Proof Size summary in bytes: + // Measured: `38` + // Estimated: `3503` + // Minimum execution time: 30_271_000 picoseconds. + Weight::from_parts(30_819_000, 0) + .saturating_add(Weight::from_parts(0, 3503)) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(5)) + } + /// Storage: PolkadotXcm VersionNotifiers (r:1 w:1) + /// Proof Skipped: PolkadotXcm VersionNotifiers (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem HostConfiguration (r:1 w:0) + /// Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: PolkadotXcm Queries (r:0 w:1) + /// Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) + fn force_unsubscribe_version_notify() -> Weight { + // Proof Size summary in bytes: + // Measured: `220` + // Estimated: `3685` + // Minimum execution time: 32_302_000 picoseconds. + Weight::from_parts(32_807_000, 0) + .saturating_add(Weight::from_parts(0, 3685)) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(4)) + } + /// Storage: PolkadotXcm XcmExecutionSuspended (r:0 w:1) + /// Proof Skipped: PolkadotXcm XcmExecutionSuspended (max_values: Some(1), max_size: None, mode: Measured) + fn force_suspension() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_960_000 picoseconds. + Weight::from_parts(3_094_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: PolkadotXcm SupportedVersion (r:4 w:2) + /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + fn migrate_supported_version() -> Weight { + // Proof Size summary in bytes: + // Measured: `95` + // Estimated: `10985` + // Minimum execution time: 14_877_000 picoseconds. + Weight::from_parts(15_296_000, 0) + .saturating_add(Weight::from_parts(0, 10985)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: PolkadotXcm VersionNotifiers (r:4 w:2) + /// Proof Skipped: PolkadotXcm VersionNotifiers (max_values: None, max_size: None, mode: Measured) + fn migrate_version_notifiers() -> Weight { + // Proof Size summary in bytes: + // Measured: `99` + // Estimated: `10989` + // Minimum execution time: 14_835_000 picoseconds. + Weight::from_parts(15_115_000, 0) + .saturating_add(Weight::from_parts(0, 10989)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: PolkadotXcm VersionNotifyTargets (r:5 w:0) + /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) + fn already_notified_target() -> Weight { + // Proof Size summary in bytes: + // Measured: `106` + // Estimated: `13471` + // Minimum execution time: 15_368_000 picoseconds. + Weight::from_parts(15_596_000, 0) + .saturating_add(Weight::from_parts(0, 13471)) + .saturating_add(T::DbWeight::get().reads(5)) + } + /// Storage: PolkadotXcm VersionNotifyTargets (r:2 w:1) + /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem HostConfiguration (r:1 w:0) + /// Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + fn notify_current_targets() -> Weight { + // Proof Size summary in bytes: + // Measured: `106` + // Estimated: `6046` + // Minimum execution time: 28_025_000 picoseconds. + Weight::from_parts(28_524_000, 0) + .saturating_add(Weight::from_parts(0, 6046)) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: PolkadotXcm VersionNotifyTargets (r:3 w:0) + /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) + fn notify_target_migration_fail() -> Weight { + // Proof Size summary in bytes: + // Measured: `136` + // Estimated: `8551` + // Minimum execution time: 8_166_000 picoseconds. + Weight::from_parts(8_314_000, 0) + .saturating_add(Weight::from_parts(0, 8551)) + .saturating_add(T::DbWeight::get().reads(3)) + } + /// Storage: PolkadotXcm VersionNotifyTargets (r:4 w:2) + /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) + fn migrate_version_notify_targets() -> Weight { + // Proof Size summary in bytes: + // Measured: `106` + // Estimated: `10996` + // Minimum execution time: 14_871_000 picoseconds. + Weight::from_parts(15_374_000, 0) + .saturating_add(Weight::from_parts(0, 10996)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: PolkadotXcm VersionNotifyTargets (r:4 w:2) + /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem HostConfiguration (r:1 w:0) + /// Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + fn migrate_and_notify_old_targets() -> Weight { + // Proof Size summary in bytes: + // Measured: `112` + // Estimated: `11002` + // Minimum execution time: 33_611_000 picoseconds. + Weight::from_parts(34_008_000, 0) + .saturating_add(Weight::from_parts(0, 11002)) + .saturating_add(T::DbWeight::get().reads(9)) + .saturating_add(T::DbWeight::get().writes(4)) + } + /// Storage: `PolkadotXcm::QueryCounter` (r:1 w:1) + /// Proof: `PolkadotXcm::QueryCounter` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::Queries` (r:0 w:1) + /// Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn new_query() -> Weight { + // Proof Size summary in bytes: + // Measured: `103` + // Estimated: `1588` + // Minimum execution time: 5_496_000 picoseconds. + Weight::from_parts(5_652_000, 0) + .saturating_add(Weight::from_parts(0, 1588)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `PolkadotXcm::Queries` (r:1 w:1) + /// Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn take_response() -> Weight { + // Proof Size summary in bytes: + // Measured: `7740` + // Estimated: `11205` + // Minimum execution time: 26_140_000 picoseconds. + Weight::from_parts(26_824_000, 0) + .saturating_add(Weight::from_parts(0, 11205)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } +} diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/weights/paritydb_weights.rs b/cumulus/parachains/runtimes/people/people-rococo/src/weights/paritydb_weights.rs new file mode 100644 index 00000000000..4338d928d80 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-rococo/src/weights/paritydb_weights.rs @@ -0,0 +1,63 @@ +// This file is part of Substrate. + +// Copyright (C) 2022 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +pub mod constants { + use frame_support::{ + parameter_types, + weights::{constants, RuntimeDbWeight}, + }; + + parameter_types! { + /// `ParityDB` can be enabled with a feature flag, but is still experimental. These weights + /// are available for brave runtime engineers who may want to try this out as default. + pub const ParityDbWeight: RuntimeDbWeight = RuntimeDbWeight { + read: 8_000 * constants::WEIGHT_REF_TIME_PER_NANOS, + write: 50_000 * constants::WEIGHT_REF_TIME_PER_NANOS, + }; + } + + #[cfg(test)] + mod test_db_weights { + use super::constants::ParityDbWeight as W; + use frame_support::weights::constants; + + /// Checks that all weights exist and have sane values. + // NOTE: If this test fails but you are sure that the generated values are fine, + // you can delete it. + #[test] + fn sane() { + // At least 1 µs. + assert!( + W::get().reads(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, + "Read weight should be at least 1 µs." + ); + assert!( + W::get().writes(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, + "Write weight should be at least 1 µs." + ); + // At most 1 ms. + assert!( + W::get().reads(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, + "Read weight should be at most 1 ms." + ); + assert!( + W::get().writes(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, + "Write weight should be at most 1 ms." + ); + } + } +} diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/weights/polkadot_runtime_common_identity_migrator.rs b/cumulus/parachains/runtimes/people/people-rococo/src/weights/polkadot_runtime_common_identity_migrator.rs new file mode 100644 index 00000000000..4449c8f2b02 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-rococo/src/weights/polkadot_runtime_common_identity_migrator.rs @@ -0,0 +1,97 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Autogenerated weights for `polkadot_runtime_common::identity_migrator` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-11-07, STEPS: `2`, REPEAT: `1`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `sbtb`, CPU: `13th Gen Intel(R) Core(TM) i7-1365U` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("rococo-dev")`, DB CACHE: 1024 + +// Executed Command: +// ./target/release/polkadot +// benchmark +// pallet +// --chain=rococo-dev +// --steps=2 +// --repeat=1 +// --pallet=polkadot_runtime_common::identity_migrator +// --extrinsic=* +// --output=./migrator-release.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `polkadot_runtime_common::identity_migrator`. +pub struct WeightInfo(PhantomData); +impl polkadot_runtime_common::identity_migrator::WeightInfo for WeightInfo { + /// Storage: `Identity::IdentityOf` (r:1 w:1) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7538), added: 10013, mode: `MaxEncodedLen`) + /// Storage: `Identity::SubsOf` (r:1 w:1) + /// Proof: `Identity::SubsOf` (`max_values`: None, `max_size`: Some(3258), added: 5733, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:2 w:2) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Dmp::DeliveryFeeFactor` (r:1 w:0) + /// Proof: `Dmp::DeliveryFeeFactor` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `XcmPallet::SupportedVersion` (r:1 w:0) + /// Proof: `XcmPallet::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueues` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueueHeads` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueueHeads` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Identity::SuperOf` (r:0 w:100) + /// Proof: `Identity::SuperOf` (`max_values`: None, `max_size`: Some(114), added: 2589, mode: `MaxEncodedLen`) + /// The range of component `r` is `[0, 20]`. + /// The range of component `s` is `[0, 100]`. + fn reap_identity(r: u32, s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `7292 + r * (8 ±0) + s * (32 ±0)` + // Estimated: `11003 + r * (8 ±0) + s * (33 ±0)` + // Minimum execution time: 163_756_000 picoseconds. + Weight::from_parts(158_982_500, 0) + .saturating_add(Weight::from_parts(0, 11003)) + // Standard Error: 1_143_629 + .saturating_add(Weight::from_parts(238_675, 0).saturating_mul(r.into())) + // Standard Error: 228_725 + .saturating_add(Weight::from_parts(1_529_645, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(8)) + .saturating_add(T::DbWeight::get().writes(5)) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(s.into()))) + .saturating_add(Weight::from_parts(0, 8).saturating_mul(r.into())) + .saturating_add(Weight::from_parts(0, 33).saturating_mul(s.into())) + } + /// Storage: `Identity::IdentityOf` (r:1 w:1) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7538), added: 10013, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Identity::SubsOf` (r:1 w:1) + /// Proof: `Identity::SubsOf` (`max_values`: None, `max_size`: Some(3258), added: 5733, mode: `MaxEncodedLen`) + fn poke_deposit() -> Weight { + // Proof Size summary in bytes: + // Measured: `7229` + // Estimated: `11003` + // Minimum execution time: 137_570_000 picoseconds. + Weight::from_parts(137_570_000, 0) + .saturating_add(Weight::from_parts(0, 11003)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(3)) + } +} diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/weights/rocksdb_weights.rs b/cumulus/parachains/runtimes/people/people-rococo/src/weights/rocksdb_weights.rs new file mode 100644 index 00000000000..1d115d963fa --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-rococo/src/weights/rocksdb_weights.rs @@ -0,0 +1,63 @@ +// This file is part of Substrate. + +// Copyright (C) 2022 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +pub mod constants { + use frame_support::{ + parameter_types, + weights::{constants, RuntimeDbWeight}, + }; + + parameter_types! { + /// By default, Substrate uses `RocksDB`, so this will be the weight used throughout + /// the runtime. + pub const RocksDbWeight: RuntimeDbWeight = RuntimeDbWeight { + read: 25_000 * constants::WEIGHT_REF_TIME_PER_NANOS, + write: 100_000 * constants::WEIGHT_REF_TIME_PER_NANOS, + }; + } + + #[cfg(test)] + mod test_db_weights { + use super::constants::RocksDbWeight as W; + use frame_support::weights::constants; + + /// Checks that all weights exist and have sane values. + // NOTE: If this test fails but you are sure that the generated values are fine, + // you can delete it. + #[test] + fn sane() { + // At least 1 µs. + assert!( + W::get().reads(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, + "Read weight should be at least 1 µs." + ); + assert!( + W::get().writes(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, + "Write weight should be at least 1 µs." + ); + // At most 1 ms. + assert!( + W::get().reads(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, + "Read weight should be at most 1 ms." + ); + assert!( + W::get().writes(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, + "Write weight should be at most 1 ms." + ); + } + } +} diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/weights/xcm/mod.rs b/cumulus/parachains/runtimes/people/people-rococo/src/weights/xcm/mod.rs new file mode 100644 index 00000000000..c90a96c7f82 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-rococo/src/weights/xcm/mod.rs @@ -0,0 +1,249 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +mod pallet_xcm_benchmarks_fungible; +mod pallet_xcm_benchmarks_generic; + +use crate::{xcm_config::MaxAssetsIntoHolding, Runtime}; +use frame_support::weights::Weight; +use pallet_xcm_benchmarks_fungible::WeightInfo as XcmFungibleWeight; +use pallet_xcm_benchmarks_generic::WeightInfo as XcmGeneric; +use sp_std::prelude::*; +use xcm::{latest::prelude::*, DoubleEncoded}; + +trait WeighMultiAssets { + fn weigh_multi_assets(&self, weight: Weight) -> Weight; +} + +const MAX_ASSETS: u64 = 100; + +impl WeighMultiAssets for MultiAssetFilter { + fn weigh_multi_assets(&self, weight: Weight) -> Weight { + match self { + Self::Definite(assets) => weight.saturating_mul(assets.inner().iter().count() as u64), + Self::Wild(asset) => match asset { + All => weight.saturating_mul(MAX_ASSETS), + AllOf { fun, .. } => match fun { + WildFungibility::Fungible => weight, + // Magic number 2 has to do with the fact that we could have up to 2 times + // MaxAssetsIntoHolding in the worst-case scenario. + WildFungibility::NonFungible => + weight.saturating_mul((MaxAssetsIntoHolding::get() * 2) as u64), + }, + AllCounted(count) => weight.saturating_mul(MAX_ASSETS.min(*count as u64)), + AllOfCounted { count, .. } => weight.saturating_mul(MAX_ASSETS.min(*count as u64)), + }, + } + } +} + +impl WeighMultiAssets for MultiAssets { + fn weigh_multi_assets(&self, weight: Weight) -> Weight { + weight.saturating_mul(self.inner().iter().count() as u64) + } +} + +pub struct PeopleRococoXcmWeight(core::marker::PhantomData); +impl XcmWeightInfo for PeopleRococoXcmWeight { + fn withdraw_asset(assets: &MultiAssets) -> Weight { + assets.weigh_multi_assets(XcmFungibleWeight::::withdraw_asset()) + } + // Currently there is no trusted reserve + fn reserve_asset_deposited(_assets: &MultiAssets) -> Weight { + // TODO: hardcoded - fix https://github.com/paritytech/cumulus/issues/1974 + Weight::from_parts(1_000_000_000_u64, 0) + } + fn receive_teleported_asset(assets: &MultiAssets) -> Weight { + assets.weigh_multi_assets(XcmFungibleWeight::::receive_teleported_asset()) + } + fn query_response( + _query_id: &u64, + _response: &Response, + _max_weight: &Weight, + _querier: &Option, + ) -> Weight { + XcmGeneric::::query_response() + } + fn transfer_asset(assets: &MultiAssets, _dest: &MultiLocation) -> Weight { + assets.weigh_multi_assets(XcmFungibleWeight::::transfer_asset()) + } + fn transfer_reserve_asset( + assets: &MultiAssets, + _dest: &MultiLocation, + _xcm: &Xcm<()>, + ) -> Weight { + assets.weigh_multi_assets(XcmFungibleWeight::::transfer_reserve_asset()) + } + fn transact( + _origin_type: &OriginKind, + _require_weight_at_most: &Weight, + _call: &DoubleEncoded, + ) -> Weight { + XcmGeneric::::transact() + } + fn hrmp_new_channel_open_request( + _sender: &u32, + _max_message_size: &u32, + _max_capacity: &u32, + ) -> Weight { + // XCM Executor does not currently support HRMP channel operations + Weight::MAX + } + fn hrmp_channel_accepted(_recipient: &u32) -> Weight { + // XCM Executor does not currently support HRMP channel operations + Weight::MAX + } + fn hrmp_channel_closing(_initiator: &u32, _sender: &u32, _recipient: &u32) -> Weight { + // XCM Executor does not currently support HRMP channel operations + Weight::MAX + } + fn clear_origin() -> Weight { + XcmGeneric::::clear_origin() + } + fn descend_origin(_who: &InteriorMultiLocation) -> Weight { + XcmGeneric::::descend_origin() + } + fn report_error(_query_response_info: &QueryResponseInfo) -> Weight { + XcmGeneric::::report_error() + } + + fn deposit_asset(assets: &MultiAssetFilter, _dest: &MultiLocation) -> Weight { + // Hardcoded till the XCM pallet is fixed + let hardcoded_weight = Weight::from_parts(1_000_000_000_u64, 0); + let weight = assets.weigh_multi_assets(XcmFungibleWeight::::deposit_asset()); + hardcoded_weight.min(weight) + } + fn deposit_reserve_asset( + assets: &MultiAssetFilter, + _dest: &MultiLocation, + _xcm: &Xcm<()>, + ) -> Weight { + assets.weigh_multi_assets(XcmFungibleWeight::::deposit_reserve_asset()) + } + fn exchange_asset(_give: &MultiAssetFilter, _receive: &MultiAssets, _maximal: &bool) -> Weight { + Weight::MAX + } + fn initiate_reserve_withdraw( + assets: &MultiAssetFilter, + _reserve: &MultiLocation, + _xcm: &Xcm<()>, + ) -> Weight { + assets.weigh_multi_assets(XcmGeneric::::initiate_reserve_withdraw()) + } + fn initiate_teleport( + assets: &MultiAssetFilter, + _dest: &MultiLocation, + _xcm: &Xcm<()>, + ) -> Weight { + assets.weigh_multi_assets(XcmFungibleWeight::::initiate_teleport()) + } + fn report_holding(_response_info: &QueryResponseInfo, _assets: &MultiAssetFilter) -> Weight { + XcmGeneric::::report_holding() + } + fn buy_execution(_fees: &MultiAsset, _weight_limit: &WeightLimit) -> Weight { + XcmGeneric::::buy_execution() + } + fn refund_surplus() -> Weight { + XcmGeneric::::refund_surplus() + } + fn set_error_handler(_xcm: &Xcm) -> Weight { + XcmGeneric::::set_error_handler() + } + fn set_appendix(_xcm: &Xcm) -> Weight { + XcmGeneric::::set_appendix() + } + fn clear_error() -> Weight { + XcmGeneric::::clear_error() + } + fn claim_asset(_assets: &MultiAssets, _ticket: &MultiLocation) -> Weight { + XcmGeneric::::claim_asset() + } + fn trap(_code: &u64) -> Weight { + XcmGeneric::::trap() + } + fn subscribe_version(_query_id: &QueryId, _max_response_weight: &Weight) -> Weight { + XcmGeneric::::subscribe_version() + } + fn unsubscribe_version() -> Weight { + XcmGeneric::::unsubscribe_version() + } + fn burn_asset(assets: &MultiAssets) -> Weight { + assets.weigh_multi_assets(XcmGeneric::::burn_asset()) + } + fn expect_asset(assets: &MultiAssets) -> Weight { + assets.weigh_multi_assets(XcmGeneric::::expect_asset()) + } + fn expect_origin(_origin: &Option) -> Weight { + XcmGeneric::::expect_origin() + } + fn expect_error(_error: &Option<(u32, XcmError)>) -> Weight { + XcmGeneric::::expect_error() + } + fn expect_transact_status(_transact_status: &MaybeErrorCode) -> Weight { + XcmGeneric::::expect_transact_status() + } + fn query_pallet(_module_name: &Vec, _response_info: &QueryResponseInfo) -> Weight { + XcmGeneric::::query_pallet() + } + fn expect_pallet( + _index: &u32, + _name: &Vec, + _module_name: &Vec, + _crate_major: &u32, + _min_crate_minor: &u32, + ) -> Weight { + XcmGeneric::::expect_pallet() + } + fn report_transact_status(_response_info: &QueryResponseInfo) -> Weight { + XcmGeneric::::report_transact_status() + } + fn clear_transact_status() -> Weight { + XcmGeneric::::clear_transact_status() + } + fn universal_origin(_: &Junction) -> Weight { + Weight::MAX + } + fn export_message(_: &NetworkId, _: &Junctions, _: &Xcm<()>) -> Weight { + Weight::MAX + } + fn lock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { + Weight::MAX + } + fn unlock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { + Weight::MAX + } + fn note_unlockable(_: &MultiAsset, _: &MultiLocation) -> Weight { + Weight::MAX + } + fn request_unlock(_: &MultiAsset, _: &MultiLocation) -> Weight { + Weight::MAX + } + fn set_fees_mode(_: &bool) -> Weight { + XcmGeneric::::set_fees_mode() + } + fn set_topic(_topic: &[u8; 32]) -> Weight { + XcmGeneric::::set_topic() + } + fn clear_topic() -> Weight { + XcmGeneric::::clear_topic() + } + fn alias_origin(_: &MultiLocation) -> Weight { + // XCM Executor does not currently support alias origin operations + Weight::MAX + } + fn unpaid_execution(_: &WeightLimit, _: &Option) -> Weight { + XcmGeneric::::unpaid_execution() + } +} diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/cumulus/parachains/runtimes/people/people-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs new file mode 100644 index 00000000000..b279399e7a9 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs @@ -0,0 +1,157 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Autogenerated weights for `pallet_xcm_benchmarks::fungible` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("people-kusama-dev"), DB CACHE: 1024 + +// Executed Command: +// ./artifacts/polkadot-parachain +// benchmark +// pallet +// --template=./templates/xcm-bench-template.hbs +// --chain=people-kusama-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_xcm_benchmarks::fungible +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json +// --header=./file_header.txt +// --output=./cumulus/parachains/runtimes/people/people-kusama/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weights for `pallet_xcm_benchmarks::fungible`. +pub struct WeightInfo(PhantomData); +impl WeightInfo { + // Storage: System Account (r:1 w:1) + // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + pub fn withdraw_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `101` + // Estimated: `3593` + // Minimum execution time: 23_309_000 picoseconds. + Weight::from_parts(23_777_000, 3593) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + // Storage: System Account (r:2 w:2) + // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + pub fn transfer_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `153` + // Estimated: `6196` + // Minimum execution time: 48_808_000 picoseconds. + Weight::from_parts(49_427_000, 6196) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + // Storage: System Account (r:2 w:2) + // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + // Storage: ParachainInfo ParachainId (r:1 w:0) + // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: PolkadotXcm SupportedVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + // Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + // Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem HostConfiguration (r:1 w:0) + // Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + pub fn transfer_reserve_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `223` + // Estimated: `6196` + // Minimum execution time: 71_204_000 picoseconds. + Weight::from_parts(72_121_000, 6196) + .saturating_add(T::DbWeight::get().reads(8)) + .saturating_add(T::DbWeight::get().writes(4)) + } + pub fn receive_teleported_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 3_559_000 picoseconds. + Weight::from_parts(3_616_000, 0) + } + // Storage: System Account (r:1 w:1) + // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + pub fn deposit_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `52` + // Estimated: `3593` + // Minimum execution time: 25_042_000 picoseconds. + Weight::from_parts(25_630_000, 3593) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + // Storage: System Account (r:1 w:1) + // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + // Storage: ParachainInfo ParachainId (r:1 w:0) + // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: PolkadotXcm SupportedVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + // Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + // Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem HostConfiguration (r:1 w:0) + // Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + pub fn deposit_reserve_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `122` + // Estimated: `3593` + // Minimum execution time: 49_030_000 picoseconds. + Weight::from_parts(49_828_000, 3593) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) + } + // Storage: ParachainInfo ParachainId (r:1 w:0) + // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: PolkadotXcm SupportedVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + // Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + // Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem HostConfiguration (r:1 w:0) + // Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + pub fn initiate_teleport() -> Weight { + // Proof Size summary in bytes: + // Measured: `70` + // Estimated: `3535` + // Minimum execution time: 27_142_000 picoseconds. + Weight::from_parts(27_416_000, 3535) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(2)) + } +} diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/cumulus/parachains/runtimes/people/people-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs new file mode 100644 index 00000000000..e2be324ee2d --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -0,0 +1,347 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Autogenerated weights for `pallet_xcm_benchmarks::generic` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("people-kusama-dev"), DB CACHE: 1024 + +// Executed Command: +// ./artifacts/polkadot-parachain +// benchmark +// pallet +// --template=./templates/xcm-bench-template.hbs +// --chain=people-kusama-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_xcm_benchmarks::generic +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json +// --header=./file_header.txt +// --output=./cumulus/parachains/runtimes/people/people-kusama/src/weights/xcm/pallet_xcm_benchmarks_generic.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weights for `pallet_xcm_benchmarks::generic`. +pub struct WeightInfo(PhantomData); +impl WeightInfo { + // Storage: ParachainInfo ParachainId (r:1 w:0) + // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: PolkadotXcm SupportedVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + // Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + // Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem HostConfiguration (r:1 w:0) + // Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + pub fn report_holding() -> Weight { + // Proof Size summary in bytes: + // Measured: `70` + // Estimated: `3535` + // Minimum execution time: 30_210_000 picoseconds. + Weight::from_parts(30_864_000, 3535) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(2)) + } + pub fn buy_execution() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_808_000 picoseconds. + Weight::from_parts(2_848_000, 0) + } + // Storage: PolkadotXcm Queries (r:1 w:0) + // Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) + pub fn query_response() -> Weight { + // Proof Size summary in bytes: + // Measured: `32` + // Estimated: `3497` + // Minimum execution time: 10_353_000 picoseconds. + Weight::from_parts(10_569_000, 3497) + .saturating_add(T::DbWeight::get().reads(1)) + } + pub fn transact() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 12_074_000 picoseconds. + Weight::from_parts(12_280_000, 0) + } + pub fn refund_surplus() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 3_080_000 picoseconds. + Weight::from_parts(3_161_000, 0) + } + pub fn set_error_handler() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_649_000 picoseconds. + Weight::from_parts(2_732_000, 0) + } + pub fn set_appendix() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_652_000 picoseconds. + Weight::from_parts(2_749_000, 0) + } + pub fn clear_error() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_642_000 picoseconds. + Weight::from_parts(2_704_000, 0) + } + pub fn descend_origin() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 3_438_000 picoseconds. + Weight::from_parts(3_508_000, 0) + } + pub fn clear_origin() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_626_000 picoseconds. + Weight::from_parts(2_701_000, 0) + } + // Storage: ParachainInfo ParachainId (r:1 w:0) + // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: PolkadotXcm SupportedVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + // Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + // Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem HostConfiguration (r:1 w:0) + // Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + pub fn report_error() -> Weight { + // Proof Size summary in bytes: + // Measured: `70` + // Estimated: `3535` + // Minimum execution time: 24_737_000 picoseconds. + Weight::from_parts(25_106_000, 3535) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(2)) + } + // Storage: PolkadotXcm AssetTraps (r:1 w:1) + // Proof Skipped: PolkadotXcm AssetTraps (max_values: None, max_size: None, mode: Measured) + pub fn claim_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `90` + // Estimated: `3555` + // Minimum execution time: 14_712_000 picoseconds. + Weight::from_parts(14_976_000, 3555) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + pub fn trap() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_689_000 picoseconds. + Weight::from_parts(2_739_000, 0) + } + // Storage: PolkadotXcm VersionNotifyTargets (r:1 w:1) + // Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) + // Storage: PolkadotXcm SupportedVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + // Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + // Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem HostConfiguration (r:1 w:0) + // Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + pub fn subscribe_version() -> Weight { + // Proof Size summary in bytes: + // Measured: `38` + // Estimated: `3503` + // Minimum execution time: 26_478_000 picoseconds. + Weight::from_parts(26_695_000, 3503) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(3)) + } + // Storage: PolkadotXcm VersionNotifyTargets (r:0 w:1) + // Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) + pub fn unsubscribe_version() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 4_811_000 picoseconds. + Weight::from_parts(5_062_000, 0) + .saturating_add(T::DbWeight::get().writes(1)) + } + // Storage: ParachainInfo ParachainId (r:1 w:0) + // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: PolkadotXcm SupportedVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + // Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + // Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem HostConfiguration (r:1 w:0) + // Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + pub fn initiate_reserve_withdraw() -> Weight { + // Proof Size summary in bytes: + // Measured: `70` + // Estimated: `3535` + // Minimum execution time: 26_945_000 picoseconds. + Weight::from_parts(28_093_000, 3535) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(2)) + } + pub fn burn_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 4_144_000 picoseconds. + Weight::from_parts(4_217_000, 0) + } + pub fn expect_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_726_000 picoseconds. + Weight::from_parts(2_802_000, 0) + } + pub fn expect_origin() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_719_000 picoseconds. + Weight::from_parts(2_790_000, 0) + } + pub fn expect_error() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_660_000 picoseconds. + Weight::from_parts(2_742_000, 0) + } + pub fn expect_transact_status() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_874_000 picoseconds. + Weight::from_parts(2_940_000, 0) + } + // Storage: ParachainInfo ParachainId (r:1 w:0) + // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: PolkadotXcm SupportedVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + // Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + // Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem HostConfiguration (r:1 w:0) + // Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + pub fn query_pallet() -> Weight { + // Proof Size summary in bytes: + // Measured: `70` + // Estimated: `3535` + // Minimum execution time: 27_235_000 picoseconds. + Weight::from_parts(27_811_000, 3535) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(2)) + } + pub fn expect_pallet() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 4_807_000 picoseconds. + Weight::from_parts(4_918_000, 0) + } + // Storage: ParachainInfo ParachainId (r:1 w:0) + // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: PolkadotXcm SupportedVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + // Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + // Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem HostConfiguration (r:1 w:0) + // Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + pub fn report_transact_status() -> Weight { + // Proof Size summary in bytes: + // Measured: `70` + // Estimated: `3535` + // Minimum execution time: 24_698_000 picoseconds. + Weight::from_parts(25_077_000, 3535) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(2)) + } + pub fn clear_transact_status() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_613_000 picoseconds. + Weight::from_parts(2_703_000, 0) + } + pub fn set_topic() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_602_000 picoseconds. + Weight::from_parts(2_661_000, 0) + } + pub fn clear_topic() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_557_000 picoseconds. + Weight::from_parts(2_655_000, 0) + } + pub fn set_fees_mode() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_724_000 picoseconds. + Weight::from_parts(2_760_000, 0) + } + pub fn unpaid_execution() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_764_000 picoseconds. + Weight::from_parts(2_872_000, 0) + } +} diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/people/people-rococo/src/xcm_config.rs new file mode 100644 index 00000000000..7a2f28aa813 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-rococo/src/xcm_config.rs @@ -0,0 +1,320 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use super::{ + AccountId, AllPalletsWithSystem, Balances, ParachainInfo, ParachainSystem, PolkadotXcm, + Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, WeightToFee, XcmpQueue, +}; +use crate::{TransactionByteFee, CENTS}; +use frame_support::{ + match_types, parameter_types, + traits::{ConstU32, Contains, Equals, Everything, Nothing}, +}; +use frame_system::EnsureRoot; +use pallet_xcm::XcmPassthrough; +use parachains_common::{ + impls::ToStakingPot, + xcm_config::{ + AllSiblingSystemParachains, ConcreteAssetFromSystem, RelayOrOtherSystemParachains, + }, + TREASURY_PALLET_ID, +}; +use polkadot_parachain_primitives::primitives::Sibling; +use sp_runtime::traits::AccountIdConversion; +use xcm::latest::prelude::*; +#[allow(deprecated)] +use xcm_builder::CurrencyAdapter; +use xcm_builder::{ + AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, + AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, DenyReserveTransferToRelayChain, + DenyThenTry, DescribeTerminus, EnsureXcmOrigin, HashedDescription, IsConcrete, + ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, + SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, + SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, + WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, XcmFeeManagerFromComponents, + XcmFeeToAccount, +}; +use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; + +parameter_types! { + pub const RootLocation: MultiLocation = MultiLocation::here(); + pub const RelayLocation: MultiLocation = MultiLocation::parent(); + pub const RelayNetwork: Option = Some(NetworkId::Rococo); + pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); + pub UniversalLocation: InteriorMultiLocation = + X2(GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(ParachainInfo::parachain_id().into())); + pub const MaxInstructions: u32 = 100; + pub const MaxAssetsIntoHolding: u32 = 64; + pub const GovernanceLocation: MultiLocation = MultiLocation::parent(); + pub const FellowshipLocation: MultiLocation = MultiLocation::parent(); + /// The asset ID for the asset that we use to pay for message delivery fees. Just ROC. + pub FeeAssetId: AssetId = Concrete(RelayLocation::get()); + /// The base fee for the message delivery fees. + pub const BaseDeliveryFee: u128 = CENTS.saturating_mul(3); + pub TreasuryAccount: AccountId = TREASURY_PALLET_ID.into_account_truncating(); + pub RelayTreasuryLocation: MultiLocation = + (Parent, PalletInstance(rococo_runtime_constants::TREASURY_PALLET_ID)).into(); +} + +pub type PriceForParentDelivery = polkadot_runtime_common::xcm_sender::ExponentialPrice< + FeeAssetId, + BaseDeliveryFee, + TransactionByteFee, + ParachainSystem, +>; + +pub type PriceForSiblingParachainDelivery = polkadot_runtime_common::xcm_sender::ExponentialPrice< + FeeAssetId, + BaseDeliveryFee, + TransactionByteFee, + XcmpQueue, +>; + +/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used +/// when determining ownership of accounts for asset transacting and when attempting to use XCM +/// `Transact` in order to determine the dispatch Origin. +pub type LocationToAccountId = ( + // The parent (Relay-chain) origin converts to the parent `AccountId`. + ParentIsPreset, + // Sibling parachain origins convert to AccountId via the `ParaId::into`. + SiblingParachainConvertsVia, + // Straight up local `AccountId32` origins just alias directly to `AccountId`. + AccountId32Aliases, + // Here/local root location to `AccountId`. + HashedDescription, +); + +/// Means for transacting the native currency on this chain. +#[allow(deprecated)] +pub type CurrencyTransactor = CurrencyAdapter< + // Use this currency: + Balances, + // Use this currency when it is a fungible asset matching the given location or name: + IsConcrete, + // Do a simple punn to convert an `AccountId32` `MultiLocation` into a native chain + // `AccountId`: + LocationToAccountId, + // Our chain's `AccountId` type (we can't get away without mentioning it explicitly): + AccountId, + // We don't track any teleports of `Balances`. + (), +>; + +/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, +/// ready for dispatching a transaction with XCM's `Transact`. There is an `OriginKind` that can +/// bias the kind of local `Origin` it will become. +pub type XcmOriginToTransactDispatchOrigin = ( + // Sovereign account converter; this attempts to derive an `AccountId` from the origin location + // using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for + // foreign chains who want to have a local sovereign account on this chain that they control. + SovereignSignedViaLocation, + // Native converter for Relay-chain (Parent) location; will convert to a `Relay` origin when + // recognized. + RelayChainAsNative, + // Native converter for sibling Parachains; will convert to a `SiblingPara` origin when + // recognized. + SiblingParachainAsNative, + // Superuser converter for the Relay-chain (Parent) location. This will allow it to issue a + // transaction from the Root origin. + ParentAsSuperuser, + // Native signed account converter; this just converts an `AccountId32` origin into a normal + // `RuntimeOrigin::Signed` origin of the same 32-byte value. + SignedAccountId32AsNative, + // XCM origins can be represented natively under the XCM pallet's `Xcm` origin. + XcmPassthrough, +); + +match_types! { + pub type LocalPlurality: impl Contains = { + MultiLocation { parents: 0, interior: X1(Plurality { .. }) } + }; + pub type ParentOrParentsPlurality: impl Contains = { + MultiLocation { parents: 1, interior: Here } | + MultiLocation { parents: 1, interior: X1(Plurality { .. }) } + }; + pub type ParentOrSiblings: impl Contains = { + MultiLocation { parents: 1, interior: Here } | + MultiLocation { parents: 1, interior: X1(Parachain(_)) } + }; +} + +/// A call filter for the XCM Transact instruction. This is a temporary measure until we properly +/// account for proof size weights. +/// +/// Calls that are allowed through this filter must: +/// 1. Have a fixed weight; +/// 2. Cannot lead to another call being made; +/// 3. Have a defined proof size weight, e.g. no unbounded vecs in call parameters. +pub struct SafeCallFilter; +impl Contains for SafeCallFilter { + fn contains(call: &RuntimeCall) -> bool { + #[cfg(feature = "runtime-benchmarks")] + { + if matches!(call, RuntimeCall::System(frame_system::Call::remark_with_event { .. })) { + return true + } + } + + matches!( + call, + RuntimeCall::PolkadotXcm(pallet_xcm::Call::force_xcm_version { .. }) | + RuntimeCall::System( + frame_system::Call::set_heap_pages { .. } | + frame_system::Call::set_code { .. } | + frame_system::Call::set_code_without_checks { .. } | + frame_system::Call::kill_prefix { .. }, + ) | RuntimeCall::ParachainSystem(..) | + RuntimeCall::Timestamp(..) | + RuntimeCall::Balances(..) | + RuntimeCall::CollatorSelection( + pallet_collator_selection::Call::set_desired_candidates { .. } | + pallet_collator_selection::Call::set_candidacy_bond { .. } | + pallet_collator_selection::Call::register_as_candidate { .. } | + pallet_collator_selection::Call::leave_intent { .. } | + pallet_collator_selection::Call::set_invulnerables { .. } | + pallet_collator_selection::Call::add_invulnerable { .. } | + pallet_collator_selection::Call::remove_invulnerable { .. }, + ) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | + RuntimeCall::XcmpQueue(..) | + RuntimeCall::MessageQueue(..) | + RuntimeCall::Identity(..) | + RuntimeCall::IdentityMigrator(..) + ) + } +} + +pub type Barrier = TrailingSetTopicAsId< + DenyThenTry< + DenyReserveTransferToRelayChain, + ( + // Allow local users to buy weight credit. + TakeWeightCredit, + // Expected responses are OK. + AllowKnownQueryResponses, + WithComputedOrigin< + ( + // If the message is one that immediately attemps to pay for execution, then + // allow it. + AllowTopLevelPaidExecutionFrom, + // Parent and its pluralities (i.e. governance bodies) get free execution. + AllowExplicitUnpaidExecutionFrom, + // Subscriptions for version tracking are OK. + AllowSubscriptionsFrom, + ), + UniversalLocation, + ConstU32<8>, + >, + ), + >, +>; + +/// Locations that will not be charged fees in the executor, neither for execution nor delivery. We +/// only waive fees for system functions, which these locations represent. +pub type WaivedLocations = ( + RelayOrOtherSystemParachains, + Equals, + Equals, + LocalPlurality, +); + +pub struct XcmConfig; +impl xcm_executor::Config for XcmConfig { + type RuntimeCall = RuntimeCall; + type XcmSender = XcmRouter; + type AssetTransactor = CurrencyTransactor; + type OriginConverter = XcmOriginToTransactDispatchOrigin; + // People chain does not recognize a reserve location for any asset. Users must teleport ROC + // where allowed (e.g. with the Relay Chain). + type IsReserve = (); + /// Only allow teleportation of ROC. + type IsTeleporter = ConcreteAssetFromSystem; + type UniversalLocation = UniversalLocation; + type Barrier = Barrier; + type Weigher = WeightInfoBounds< + crate::weights::xcm::PeopleRococoXcmWeight, + RuntimeCall, + MaxInstructions, + >; + type Trader = + UsingComponents>; + type ResponseHandler = PolkadotXcm; + type AssetTrap = PolkadotXcm; + type AssetClaims = PolkadotXcm; + type SubscriptionService = PolkadotXcm; + type PalletInstancesInfo = AllPalletsWithSystem; + type MaxAssetsIntoHolding = MaxAssetsIntoHolding; + type AssetLocker = (); + type AssetExchanger = (); + type FeeManager = XcmFeeManagerFromComponents< + WaivedLocations, + XcmFeeToAccount, + >; + type MessageExporter = (); + type UniversalAliases = Nothing; + type CallDispatcher = WithOriginFilter; + type SafeCallFilter = SafeCallFilter; + type Aliasers = Nothing; +} + +/// Converts a local signed origin into an XCM multilocation. Forms the basis for local origins +/// sending/executing XCMs. +pub type LocalOriginToLocation = SignedToAccountId32; + +/// The means for routing XCM messages which are not for local execution into the right message +/// queues. +pub type XcmRouter = WithUniqueTopic<( + // Two routers - use UMP to communicate with the relay chain: + cumulus_primitives_utility::ParentAsUmp, + // ..and XCMP to communicate with the sibling chains. + XcmpQueue, +)>; + +impl pallet_xcm::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + // We want to disallow users sending (arbitrary) XCM programs from this chain. + type SendXcmOrigin = EnsureXcmOrigin; + type XcmRouter = XcmRouter; + // We support local origins dispatching XCM executions in principle... + type ExecuteXcmOrigin = EnsureXcmOrigin; + // ... but disallow generic XCM execution. As a result only teleports are allowed. + type XcmExecuteFilter = Nothing; + type XcmExecutor = XcmExecutor; + type XcmTeleportFilter = Everything; + type XcmReserveTransferFilter = Nothing; // This parachain is not meant as a reserve location. + type Weigher = WeightInfoBounds< + crate::weights::xcm::PeopleRococoXcmWeight, + RuntimeCall, + MaxInstructions, + >; + type UniversalLocation = UniversalLocation; + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100; + type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion; + type Currency = Balances; + type CurrencyMatcher = (); + type TrustedLockers = (); + type SovereignAccountOf = LocationToAccountId; + type MaxLockers = ConstU32<8>; + type WeightInfo = crate::weights::pallet_xcm::WeightInfo; + type AdminOrigin = EnsureRoot; + type MaxRemoteLockConsumers = ConstU32<0>; + type RemoteLockConsumerIdentifier = (); +} + +impl cumulus_pallet_xcm::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type XcmExecutor = XcmExecutor; +} diff --git a/cumulus/parachains/runtimes/people/people-westend/Cargo.toml b/cumulus/parachains/runtimes/people/people-westend/Cargo.toml new file mode 100644 index 00000000000..d9e002ba5ed --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-westend/Cargo.toml @@ -0,0 +1,195 @@ +[package] +name = "people-westend-runtime" +version = "0.1.0" +authors.workspace = true +edition.workspace = true +description = "Westend's People parachain runtime" +license = "Apache-2.0" + +[build-dependencies] +substrate-wasm-builder = { path = "../../../../../substrate/utils/wasm-builder", optional = true } + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } +enumflags2 = { version = "0.7.7" } +hex-literal = { version = "0.4.1" } +log = { version = "0.4.20", default-features = false } +scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } +serde = { version = "1.0.188", optional = true, features = ["derive"] } +smallvec = "1.11.0" + +# Substrate +frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking", default-features = false, optional = true } +frame-executive = { path = "../../../../../substrate/frame/executive", default-features = false } +frame-support = { path = "../../../../../substrate/frame/support", default-features = false } +frame-system = { path = "../../../../../substrate/frame/system", default-features = false } +frame-system-benchmarking = { path = "../../../../../substrate/frame/system/benchmarking", default-features = false, optional = true } +frame-system-rpc-runtime-api = { path = "../../../../../substrate/frame/system/rpc/runtime-api", default-features = false } +frame-try-runtime = { path = "../../../../../substrate/frame/try-runtime", default-features = false, optional = true } +pallet-aura = { path = "../../../../../substrate/frame/aura", default-features = false } +pallet-authorship = { path = "../../../../../substrate/frame/authorship", default-features = false } +pallet-balances = { path = "../../../../../substrate/frame/balances", default-features = false } +pallet-identity = { path = "../../../../../substrate/frame/identity", default-features = false } +pallet-message-queue = { path = "../../../../../substrate/frame/message-queue", default-features = false } +pallet-multisig = { path = "../../../../../substrate/frame/multisig", default-features = false } +pallet-session = { path = "../../../../../substrate/frame/session", default-features = false } +pallet-timestamp = { path = "../../../../../substrate/frame/timestamp", default-features = false } +pallet-transaction-payment = { path = "../../../../../substrate/frame/transaction-payment", default-features = false } +pallet-transaction-payment-rpc-runtime-api = { path = "../../../../../substrate/frame/transaction-payment/rpc/runtime-api", default-features = false } +pallet-utility = { path = "../../../../../substrate/frame/utility", default-features = false } +sp-api = { path = "../../../../../substrate/primitives/api", default-features = false } +sp-block-builder = { path = "../../../../../substrate/primitives/block-builder", default-features = false } +sp-consensus-aura = { path = "../../../../../substrate/primitives/consensus/aura", default-features = false } +sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } +sp-genesis-builder = { path = "../../../../../substrate/primitives/genesis-builder", default-features = false } +sp-inherents = { path = "../../../../../substrate/primitives/inherents", default-features = false } +sp-offchain = { path = "../../../../../substrate/primitives/offchain", default-features = false } +sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-features = false } +sp-session = { path = "../../../../../substrate/primitives/session", default-features = false } +sp-std = { path = "../../../../../substrate/primitives/std", default-features = false } +sp-storage = { path = "../../../../../substrate/primitives/storage", default-features = false } +sp-transaction-pool = { path = "../../../../../substrate/primitives/transaction-pool", default-features = false } +sp-version = { path = "../../../../../substrate/primitives/version", default-features = false } + +# Polkadot +pallet-xcm = { path = "../../../../../polkadot/xcm/pallet-xcm", default-features = false } +pallet-xcm-benchmarks = { path = "../../../../../polkadot/xcm/pallet-xcm-benchmarks", default-features = false, optional = true } +polkadot-core-primitives = { path = "../../../../../polkadot/core-primitives", default-features = false } +polkadot-parachain-primitives = { path = "../../../../../polkadot/parachain", default-features = false } +polkadot-runtime-common = { path = "../../../../../polkadot/runtime/common", default-features = false } +westend-runtime-constants = { path = "../../../../../polkadot/runtime/westend/constants", default-features = false } +xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } +xcm-builder = { package = "staging-xcm-builder", path = "../../../../../polkadot/xcm/xcm-builder", default-features = false } +xcm-executor = { package = "staging-xcm-executor", path = "../../../../../polkadot/xcm/xcm-executor", default-features = false } + +# Cumulus +cumulus-pallet-aura-ext = { path = "../../../../pallets/aura-ext", default-features = false } +cumulus-pallet-dmp-queue = { path = "../../../../pallets/dmp-queue", default-features = false } +cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system", default-features = false, features = ["parameterized-consensus-hook"] } +cumulus-pallet-session-benchmarking = { path = "../../../../pallets/session-benchmarking", default-features = false } +cumulus-pallet-xcm = { path = "../../../../pallets/xcm", default-features = false } +cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-features = false } +cumulus-primitives-core = { path = "../../../../primitives/core", default-features = false } +cumulus-primitives-utility = { path = "../../../../primitives/utility", default-features = false } +pallet-collator-selection = { path = "../../../../pallets/collator-selection", default-features = false } +parachain-info = { package = "staging-parachain-info", path = "../../../pallets/parachain-info", default-features = false } +parachains-common = { path = "../../../common", default-features = false } + +[features] +default = ["std"] +std = [ + "codec/std", + "cumulus-pallet-aura-ext/std", + "cumulus-pallet-dmp-queue/std", + "cumulus-pallet-parachain-system/std", + "cumulus-pallet-session-benchmarking/std", + "cumulus-pallet-xcm/std", + "cumulus-pallet-xcmp-queue/std", + "cumulus-primitives-core/std", + "cumulus-primitives-utility/std", + "enumflags2/std", + "frame-benchmarking?/std", + "frame-executive/std", + "frame-support/std", + "frame-system-benchmarking?/std", + "frame-system-rpc-runtime-api/std", + "frame-system/std", + "frame-try-runtime?/std", + "log/std", + "pallet-aura/std", + "pallet-authorship/std", + "pallet-balances/std", + "pallet-collator-selection/std", + "pallet-identity/std", + "pallet-message-queue/std", + "pallet-multisig/std", + "pallet-session/std", + "pallet-timestamp/std", + "pallet-transaction-payment-rpc-runtime-api/std", + "pallet-transaction-payment/std", + "pallet-utility/std", + "pallet-xcm-benchmarks?/std", + "pallet-xcm/std", + "parachain-info/std", + "parachains-common/std", + "polkadot-core-primitives/std", + "polkadot-parachain-primitives/std", + "polkadot-runtime-common/std", + "scale-info/std", + "serde", + "sp-api/std", + "sp-block-builder/std", + "sp-consensus-aura/std", + "sp-core/std", + "sp-genesis-builder/std", + "sp-inherents/std", + "sp-offchain/std", + "sp-runtime/std", + "sp-session/std", + "sp-std/std", + "sp-storage/std", + "sp-transaction-pool/std", + "sp-version/std", + "substrate-wasm-builder", + "westend-runtime-constants/std", + "xcm-builder/std", + "xcm-executor/std", + "xcm/std", +] + +runtime-benchmarks = [ + "cumulus-pallet-dmp-queue/runtime-benchmarks", + "cumulus-pallet-parachain-system/runtime-benchmarks", + "cumulus-pallet-session-benchmarking/runtime-benchmarks", + "cumulus-pallet-xcmp-queue/runtime-benchmarks", + "cumulus-primitives-core/runtime-benchmarks", + "cumulus-primitives-utility/runtime-benchmarks", + "frame-benchmarking/runtime-benchmarks", + "frame-support/runtime-benchmarks", + "frame-system-benchmarking/runtime-benchmarks", + "frame-system/runtime-benchmarks", + "pallet-balances/runtime-benchmarks", + "pallet-collator-selection/runtime-benchmarks", + "pallet-identity/runtime-benchmarks", + "pallet-message-queue/runtime-benchmarks", + "pallet-multisig/runtime-benchmarks", + "pallet-timestamp/runtime-benchmarks", + "pallet-utility/runtime-benchmarks", + "pallet-xcm-benchmarks/runtime-benchmarks", + "pallet-xcm/runtime-benchmarks", + "parachains-common/runtime-benchmarks", + "polkadot-parachain-primitives/runtime-benchmarks", + "polkadot-runtime-common/runtime-benchmarks", + "sp-runtime/runtime-benchmarks", + "xcm-builder/runtime-benchmarks", + "xcm-executor/runtime-benchmarks", +] + +try-runtime = [ + "cumulus-pallet-aura-ext/try-runtime", + "cumulus-pallet-dmp-queue/try-runtime", + "cumulus-pallet-parachain-system/try-runtime", + "cumulus-pallet-xcm/try-runtime", + "cumulus-pallet-xcmp-queue/try-runtime", + "frame-executive/try-runtime", + "frame-support/try-runtime", + "frame-system/try-runtime", + "frame-try-runtime/try-runtime", + "pallet-aura/try-runtime", + "pallet-authorship/try-runtime", + "pallet-balances/try-runtime", + "pallet-collator-selection/try-runtime", + "pallet-identity/try-runtime", + "pallet-message-queue/try-runtime", + "pallet-multisig/try-runtime", + "pallet-session/try-runtime", + "pallet-timestamp/try-runtime", + "pallet-transaction-payment/try-runtime", + "pallet-utility/try-runtime", + "pallet-xcm/try-runtime", + "parachain-info/try-runtime", + "polkadot-runtime-common/try-runtime", + "sp-runtime/try-runtime", +] + +experimental = ["pallet-aura/experimental"] diff --git a/cumulus/parachains/runtimes/people/people-westend/build.rs b/cumulus/parachains/runtimes/people/people-westend/build.rs new file mode 100644 index 00000000000..60f8a125129 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-westend/build.rs @@ -0,0 +1,26 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#[cfg(feature = "std")] +fn main() { + substrate_wasm_builder::WasmBuilder::new() + .with_current_project() + .export_heap_base() + .import_memory() + .build() +} + +#[cfg(not(feature = "std"))] +fn main() {} diff --git a/cumulus/parachains/runtimes/people/people-westend/src/lib.rs b/cumulus/parachains/runtimes/people/people-westend/src/lib.rs new file mode 100644 index 00000000000..8ea29c8aa21 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-westend/src/lib.rs @@ -0,0 +1,845 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![cfg_attr(not(feature = "std"), no_std)] +#![recursion_limit = "256"] +#[cfg(feature = "std")] +include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); + +pub mod people; +mod weights; +pub mod xcm_config; + +use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; +use cumulus_primitives_core::{AggregateMessageOrigin, ParaId}; +use frame_support::{ + construct_runtime, derive_impl, + dispatch::DispatchClass, + genesis_builder_helper::{build_config, create_default_config}, + parameter_types, + traits::{ + ConstBool, ConstU32, ConstU64, ConstU8, Contains, EitherOfDiverse, EverythingBut, + TransformOrigin, + }, + weights::{ConstantMultiplier, Weight}, + PalletId, +}; +use frame_system::{ + limits::{BlockLength, BlockWeights}, + EnsureRoot, +}; +use pallet_xcm::{EnsureXcm, IsVoiceOfBody}; +use parachains_common::{ + impls::DealWithFees, + message_queue::{NarrowOriginToSibling, ParaIdToSibling}, + westend::{consensus::*, currency::*, fee::WeightToFee}, + AccountId, Balance, BlockNumber, Hash, Header, Nonce, Signature, AVERAGE_ON_INITIALIZE_RATIO, + HOURS, MAXIMUM_BLOCK_WEIGHT, NORMAL_DISPATCH_RATIO, SLOT_DURATION, +}; +use polkadot_runtime_common::{identity_migrator, BlockHashCount, SlowAdjustingFeeUpdate}; +use sp_api::impl_runtime_apis; +pub use sp_consensus_aura::sr25519::AuthorityId as AuraId; +use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; +#[cfg(any(feature = "std", test))] +pub use sp_runtime::BuildStorage; +use sp_runtime::{ + create_runtime_str, generic, impl_opaque_keys, + traits::Block as BlockT, + transaction_validity::{TransactionSource, TransactionValidity}, + ApplyExtrinsicResult, +}; +pub use sp_runtime::{MultiAddress, Perbill, Permill}; +use sp_std::prelude::*; +#[cfg(feature = "std")] +use sp_version::NativeVersion; +use sp_version::RuntimeVersion; +use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; +use xcm::latest::prelude::BodyId; +use xcm_config::{ + FellowshipLocation, GovernanceLocation, PriceForSiblingParachainDelivery, XcmConfig, + XcmOriginToTransactDispatchOrigin, +}; + +/// The address format for describing accounts. +pub type Address = MultiAddress; + +/// Block type as expected by this runtime. +pub type Block = generic::Block; + +/// A Block signed with an [`sp_runtime::Justification`]. +pub type SignedBlock = generic::SignedBlock; + +/// BlockId type as expected by this runtime. +pub type BlockId = generic::BlockId; + +/// The SignedExtension to the basic transaction logic. +pub type SignedExtra = ( + frame_system::CheckNonZeroSender, + frame_system::CheckSpecVersion, + frame_system::CheckTxVersion, + frame_system::CheckGenesis, + frame_system::CheckEra, + frame_system::CheckNonce, + frame_system::CheckWeight, + pallet_transaction_payment::ChargeTransactionPayment, +); + +/// Unchecked extrinsic type as expected by this runtime. +pub type UncheckedExtrinsic = + generic::UncheckedExtrinsic; + +/// Migrations to apply on runtime upgrade. +pub type Migrations = (); + +/// Executive: handles dispatch to the various modules. +pub type Executive = frame_executive::Executive< + Runtime, + Block, + frame_system::ChainContext, + Runtime, + AllPalletsWithSystem, + Migrations, +>; + +impl_opaque_keys! { + pub struct SessionKeys { + pub aura: Aura, + } +} + +#[sp_version::runtime_version] +pub const VERSION: RuntimeVersion = RuntimeVersion { + spec_name: create_runtime_str!("people-westend"), + impl_name: create_runtime_str!("people-westend"), + authoring_version: 1, + spec_version: 1_000, + impl_version: 0, + apis: RUNTIME_API_VERSIONS, + transaction_version: 0, + state_version: 1, +}; + +/// The version information used to identify this runtime when compiled natively. +#[cfg(feature = "std")] +pub fn native_version() -> NativeVersion { + NativeVersion { runtime_version: VERSION, can_author_with: Default::default() } +} + +parameter_types! { + pub const Version: RuntimeVersion = VERSION; + pub RuntimeBlockLength: BlockLength = + BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO); + pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder() + .base_block(BlockExecutionWeight::get()) + .for_class(DispatchClass::all(), |weights| { + weights.base_extrinsic = ExtrinsicBaseWeight::get(); + }) + .for_class(DispatchClass::Normal, |weights| { + weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT); + }) + .for_class(DispatchClass::Operational, |weights| { + weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT); + // Operational transactions have some extra reserved space, so that they + // are included even if block reached `MAXIMUM_BLOCK_WEIGHT`. + weights.reserved = Some( + MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT + ); + }) + .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO) + .build_or_panic(); + pub const SS58Prefix: u8 = 42; +} + +pub struct IdentityCalls; +impl Contains for IdentityCalls { + fn contains(c: &RuntimeCall) -> bool { + matches!(c, RuntimeCall::Identity(_)) + } +} + +#[derive_impl(frame_system::config_preludes::ParaChainDefaultConfig as frame_system::DefaultConfig)] +impl frame_system::Config for Runtime { + type BaseCallFilter = EverythingBut; + type BlockWeights = RuntimeBlockWeights; + type BlockLength = RuntimeBlockLength; + type AccountId = AccountId; + type Nonce = Nonce; + type Hash = Hash; + type Block = Block; + type BlockHashCount = BlockHashCount; + type DbWeight = RocksDbWeight; + type Version = Version; + type AccountData = pallet_balances::AccountData; + type SystemWeightInfo = weights::frame_system::WeightInfo; + type SS58Prefix = SS58Prefix; + type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode; + type MaxConsumers = ConstU32<16>; +} + +impl pallet_timestamp::Config for Runtime { + /// A timestamp: milliseconds since the unix epoch. + type Moment = u64; + type OnTimestampSet = Aura; + type MinimumPeriod = ConstU64<{ SLOT_DURATION / 2 }>; + type WeightInfo = weights::pallet_timestamp::WeightInfo; +} + +impl pallet_authorship::Config for Runtime { + type FindAuthor = pallet_session::FindAccountFromAuthorIndex; + type EventHandler = (CollatorSelection,); +} + +parameter_types! { + pub const ExistentialDeposit: Balance = EXISTENTIAL_DEPOSIT; +} + +impl pallet_balances::Config for Runtime { + type Balance = Balance; + type DustRemoval = (); + type RuntimeEvent = RuntimeEvent; + type ExistentialDeposit = ExistentialDeposit; + type AccountStore = System; + type WeightInfo = weights::pallet_balances::WeightInfo; + type MaxLocks = ConstU32<50>; + type MaxReserves = ConstU32<50>; + type ReserveIdentifier = [u8; 8]; + type RuntimeFreezeReason = RuntimeFreezeReason; + type RuntimeHoldReason = RuntimeHoldReason; + type FreezeIdentifier = (); + type MaxHolds = ConstU32<0>; + type MaxFreezes = ConstU32<0>; +} + +parameter_types! { + /// Relay Chain `TransactionByteFee` / 10. + pub const TransactionByteFee: Balance = MILLICENTS; +} + +impl pallet_transaction_payment::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type OnChargeTransaction = + pallet_transaction_payment::CurrencyAdapter>; + type OperationalFeeMultiplier = ConstU8<5>; + type WeightToFee = WeightToFee; + type LengthToFee = ConstantMultiplier; + type FeeMultiplierUpdate = SlowAdjustingFeeUpdate; +} + +parameter_types! { + pub const ReservedXcmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); + pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); + pub const RelayOrigin: AggregateMessageOrigin = AggregateMessageOrigin::Parent; +} + +impl cumulus_pallet_parachain_system::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type OnSystemEvent = (); + type SelfParaId = parachain_info::Pallet; + type OutboundXcmpMessageSource = XcmpQueue; + type DmpQueue = frame_support::traits::EnqueueWithOrigin; + type ReservedDmpWeight = ReservedDmpWeight; + type XcmpMessageHandler = XcmpQueue; + type ReservedXcmpWeight = ReservedXcmpWeight; + type CheckAssociatedRelayNumber = RelayNumberStrictlyIncreases; + type ConsensusHook = cumulus_pallet_aura_ext::FixedVelocityConsensusHook< + Runtime, + RELAY_CHAIN_SLOT_DURATION_MILLIS, + BLOCK_PROCESSING_VELOCITY, + UNINCLUDED_SEGMENT_CAPACITY, + >; + type WeightInfo = weights::cumulus_pallet_parachain_system::WeightInfo; +} + +parameter_types! { + pub MessageQueueServiceWeight: Weight = + Perbill::from_percent(35) * RuntimeBlockWeights::get().max_block; +} + +impl pallet_message_queue::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + #[cfg(feature = "runtime-benchmarks")] + type MessageProcessor = pallet_message_queue::mock_helpers::NoopMessageProcessor< + cumulus_primitives_core::AggregateMessageOrigin, + >; + #[cfg(not(feature = "runtime-benchmarks"))] + type MessageProcessor = xcm_builder::ProcessXcmMessage< + AggregateMessageOrigin, + xcm_executor::XcmExecutor, + RuntimeCall, + >; + type Size = u32; + // The XCMP queue pallet is only ever able to handle the `Sibling(ParaId)` origin: + type QueueChangeHandler = NarrowOriginToSibling; + type QueuePausedQuery = NarrowOriginToSibling; + type HeapSize = sp_core::ConstU32<{ 64 * 1024 }>; + type MaxStale = sp_core::ConstU32<8>; + type ServiceWeight = MessageQueueServiceWeight; + type WeightInfo = weights::pallet_message_queue::WeightInfo; +} + +impl parachain_info::Config for Runtime {} + +impl cumulus_pallet_aura_ext::Config for Runtime {} + +parameter_types! { + // Fellows pluralistic body. + pub const FellowsBodyId: BodyId = BodyId::Technical; +} + +/// Privileged origin that represents Root or Fellows. +pub type RootOrFellows = EitherOfDiverse< + EnsureRoot, + EnsureXcm>, +>; + +impl cumulus_pallet_xcmp_queue::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type ChannelInfo = ParachainSystem; + type VersionWrapper = PolkadotXcm; + type XcmpQueue = TransformOrigin; + type MaxInboundSuspended = sp_core::ConstU32<1_000>; + type ControllerOrigin = RootOrFellows; + type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin; + type WeightInfo = weights::cumulus_pallet_xcmp_queue::WeightInfo; + type PriceForSiblingDelivery = PriceForSiblingParachainDelivery; +} + +pub const PERIOD: u32 = 6 * HOURS; +pub const OFFSET: u32 = 0; + +impl pallet_session::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type ValidatorId = ::AccountId; + // we don't have stash and controller, thus we don't need the convert as well. + type ValidatorIdOf = pallet_collator_selection::IdentityCollator; + type ShouldEndSession = pallet_session::PeriodicSessions, ConstU32>; + type NextSessionRotation = pallet_session::PeriodicSessions, ConstU32>; + type SessionManager = CollatorSelection; + // Essentially just Aura, but let's be pedantic. + type SessionHandler = ::KeyTypeIdProviders; + type Keys = SessionKeys; + type WeightInfo = weights::pallet_session::WeightInfo; +} + +impl pallet_aura::Config for Runtime { + type AuthorityId = AuraId; + type DisabledValidators = (); + type MaxAuthorities = ConstU32<100_000>; + type AllowMultipleBlocksPerSlot = ConstBool; + #[cfg(feature = "experimental")] + type SlotDuration = pallet_aura::MinimumPeriodTimesTwo; +} + +parameter_types! { + pub const PotId: PalletId = PalletId(*b"PotStake"); + pub const SessionLength: BlockNumber = 6 * HOURS; + // StakingAdmin pluralistic body. + pub const StakingAdminBodyId: BodyId = BodyId::Defense; +} + +/// We allow Root and the `StakingAdmi` to execute privileged collator selection operations. +pub type CollatorSelectionUpdateOrigin = EitherOfDiverse< + EnsureRoot, + EnsureXcm>, +>; + +impl pallet_collator_selection::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Currency = Balances; + type UpdateOrigin = CollatorSelectionUpdateOrigin; + type PotId = PotId; + type MaxCandidates = ConstU32<100>; + type MinEligibleCollators = ConstU32<4>; + type MaxInvulnerables = ConstU32<20>; + // should be a multiple of session or things will get inconsistent + type KickThreshold = ConstU32; + type ValidatorId = ::AccountId; + type ValidatorIdOf = pallet_collator_selection::IdentityCollator; + type ValidatorRegistration = Session; + type WeightInfo = weights::pallet_collator_selection::WeightInfo; +} + +parameter_types! { + // One storage item; key size is 32; value is size 4+4+16+32 bytes = 56 bytes. + pub const DepositBase: Balance = deposit(1, 88); + // Additional storage item size of 32 bytes. + pub const DepositFactor: Balance = deposit(0, 32); +} + +impl pallet_multisig::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; + type Currency = Balances; + type DepositBase = DepositBase; + type DepositFactor = DepositFactor; + type MaxSignatories = ConstU32<100>; + type WeightInfo = weights::pallet_multisig::WeightInfo; +} + +impl pallet_utility::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type RuntimeCall = RuntimeCall; + type PalletsOrigin = OriginCaller; + type WeightInfo = weights::pallet_utility::WeightInfo; +} + +// To be removed after migration is complete. +impl identity_migrator::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Reaper = EnsureRoot; + type ReapIdentityHandler = (); + type WeightInfo = weights::polkadot_runtime_common_identity_migrator::WeightInfo; +} + +// Create the runtime by composing the FRAME pallets that were previously configured. +construct_runtime!( + pub enum Runtime + { + // System support stuff. + System: frame_system::{Pallet, Call, Config, Storage, Event} = 0, + ParachainSystem: cumulus_pallet_parachain_system::{ + Pallet, Call, Config, Storage, Inherent, Event, ValidateUnsigned, + } = 1, + Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent} = 2, + ParachainInfo: parachain_info::{Pallet, Storage, Config} = 3, + + // Monetary stuff. + Balances: pallet_balances::{Pallet, Call, Storage, Config, Event} = 10, + TransactionPayment: pallet_transaction_payment::{Pallet, Storage, Event} = 11, + + // Collator support. The order of these 5 are important and shall not change. + Authorship: pallet_authorship::{Pallet, Storage} = 20, + CollatorSelection: pallet_collator_selection::{Pallet, Call, Storage, Event, Config} = 21, + Session: pallet_session::{Pallet, Call, Storage, Event, Config} = 22, + Aura: pallet_aura::{Pallet, Storage, Config} = 23, + AuraExt: cumulus_pallet_aura_ext::{Pallet, Storage, Config} = 24, + + // XCM helpers. + XcmpQueue: cumulus_pallet_xcmp_queue::{Pallet, Call, Storage, Event} = 30, + PolkadotXcm: pallet_xcm::{Pallet, Call, Event, Origin, Config} = 31, + CumulusXcm: cumulus_pallet_xcm::{Pallet, Event, Origin} = 32, + MessageQueue: pallet_message_queue::{Pallet, Call, Storage, Event} = 34, + + // Handy utilities. + Utility: pallet_utility::{Pallet, Call, Event} = 40, + Multisig: pallet_multisig::{Pallet, Call, Storage, Event} = 41, + + // The main stage. + Identity: pallet_identity::{Pallet, Call, Storage, Event} = 50, + + // To migrate deposits + IdentityMigrator: identity_migrator::{Pallet, Call, Event} = 248, + } +); + +#[cfg(feature = "runtime-benchmarks")] +#[macro_use] +extern crate frame_benchmarking; + +#[cfg(feature = "runtime-benchmarks")] +mod benches { + define_benchmarks!( + // Substrate + [frame_system, SystemBench::] + [pallet_balances, Balances] + [pallet_identity, Identity] + [pallet_multisig, Multisig] + [pallet_session, SessionBench::] + [pallet_utility, Utility] + [pallet_timestamp, Timestamp] + // Polkadot + [polkadot_runtime_common::identity_migrator, IdentityMigrator] + // Cumulus + [cumulus_pallet_xcmp_queue, XcmpQueue] + [pallet_collator_selection, CollatorSelection] + // XCM + [pallet_xcm, PalletXcmExtrinsiscsBenchmark::] + [pallet_xcm_benchmarks::fungible, XcmBalances] + [pallet_xcm_benchmarks::generic, XcmGeneric] + ); +} + +impl_runtime_apis! { + impl sp_consensus_aura::AuraApi for Runtime { + fn slot_duration() -> sp_consensus_aura::SlotDuration { + sp_consensus_aura::SlotDuration::from_millis(Aura::slot_duration()) + } + + fn authorities() -> Vec { + Aura::authorities().into_inner() + } + } + + impl sp_api::Core for Runtime { + fn version() -> RuntimeVersion { + VERSION + } + + fn execute_block(block: Block) { + Executive::execute_block(block) + } + + fn initialize_block(header: &::Header) { + Executive::initialize_block(header) + } + } + + impl sp_api::Metadata for Runtime { + fn metadata() -> OpaqueMetadata { + OpaqueMetadata::new(Runtime::metadata().into()) + } + + fn metadata_at_version(version: u32) -> Option { + Runtime::metadata_at_version(version) + } + + fn metadata_versions() -> sp_std::vec::Vec { + Runtime::metadata_versions() + } + } + + impl sp_block_builder::BlockBuilder for Runtime { + fn apply_extrinsic(extrinsic: ::Extrinsic) -> ApplyExtrinsicResult { + Executive::apply_extrinsic(extrinsic) + } + + fn finalize_block() -> ::Header { + Executive::finalize_block() + } + + fn inherent_extrinsics(data: sp_inherents::InherentData) -> Vec<::Extrinsic> { + data.create_extrinsics() + } + + fn check_inherents( + block: Block, + data: sp_inherents::InherentData, + ) -> sp_inherents::CheckInherentsResult { + data.check_extrinsics(&block) + } + } + + impl sp_transaction_pool::runtime_api::TaggedTransactionQueue for Runtime { + fn validate_transaction( + source: TransactionSource, + tx: ::Extrinsic, + block_hash: ::Hash, + ) -> TransactionValidity { + Executive::validate_transaction(source, tx, block_hash) + } + } + + impl sp_offchain::OffchainWorkerApi for Runtime { + fn offchain_worker(header: &::Header) { + Executive::offchain_worker(header) + } + } + + impl sp_session::SessionKeys for Runtime { + fn generate_session_keys(seed: Option>) -> Vec { + SessionKeys::generate(seed) + } + + fn decode_session_keys( + encoded: Vec, + ) -> Option, KeyTypeId)>> { + SessionKeys::decode_into_raw_public_keys(&encoded) + } + } + + impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime { + fn account_nonce(account: AccountId) -> Nonce { + System::account_nonce(account) + } + } + + impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi for Runtime { + fn query_info( + uxt: ::Extrinsic, + len: u32, + ) -> pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo { + TransactionPayment::query_info(uxt, len) + } + fn query_fee_details( + uxt: ::Extrinsic, + len: u32, + ) -> pallet_transaction_payment::FeeDetails { + TransactionPayment::query_fee_details(uxt, len) + } + fn query_weight_to_fee(weight: Weight) -> Balance { + TransactionPayment::weight_to_fee(weight) + } + fn query_length_to_fee(length: u32) -> Balance { + TransactionPayment::length_to_fee(length) + } + } + + impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentCallApi + for Runtime + { + fn query_call_info( + call: RuntimeCall, + len: u32, + ) -> pallet_transaction_payment::RuntimeDispatchInfo { + TransactionPayment::query_call_info(call, len) + } + fn query_call_fee_details( + call: RuntimeCall, + len: u32, + ) -> pallet_transaction_payment::FeeDetails { + TransactionPayment::query_call_fee_details(call, len) + } + fn query_weight_to_fee(weight: Weight) -> Balance { + TransactionPayment::weight_to_fee(weight) + } + fn query_length_to_fee(length: u32) -> Balance { + TransactionPayment::length_to_fee(length) + } + } + + impl cumulus_primitives_core::CollectCollationInfo for Runtime { + fn collect_collation_info(header: &::Header) -> cumulus_primitives_core::CollationInfo { + ParachainSystem::collect_collation_info(header) + } + } + + #[cfg(feature = "try-runtime")] + impl frame_try_runtime::TryRuntime for Runtime { + fn on_runtime_upgrade(checks: frame_try_runtime::UpgradeCheckSelect) -> (Weight, Weight) { + let weight = Executive::try_runtime_upgrade(checks).unwrap(); + (weight, RuntimeBlockWeights::get().max_block) + } + + fn execute_block( + block: Block, + state_root_check: bool, + signature_check: bool, + select: frame_try_runtime::TryStateSelect, + ) -> Weight { + // NOTE: intentional unwrap: we don't want to propagate the error backwards, and want to + // have a backtrace here. + Executive::try_execute_block(block, state_root_check, signature_check, select).unwrap() + } + } + + #[cfg(feature = "runtime-benchmarks")] + impl frame_benchmarking::Benchmark for Runtime { + fn benchmark_metadata(extra: bool) -> ( + Vec, + Vec, + ) { + use frame_benchmarking::{Benchmarking, BenchmarkList}; + use frame_support::traits::StorageInfoTrait; + use frame_system_benchmarking::Pallet as SystemBench; + use cumulus_pallet_session_benchmarking::Pallet as SessionBench; + use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsiscsBenchmark; + + // This is defined once again in dispatch_benchmark, because list_benchmarks! + // and add_benchmarks! are macros exported by define_benchmarks! macros and those types + // are referenced in that call. + type XcmBalances = pallet_xcm_benchmarks::fungible::Pallet::; + type XcmGeneric = pallet_xcm_benchmarks::generic::Pallet::; + + let mut list = Vec::::new(); + list_benchmarks!(list, extra); + + let storage_info = AllPalletsWithSystem::storage_info(); + (list, storage_info) + } + + fn dispatch_benchmark( + config: frame_benchmarking::BenchmarkConfig + ) -> Result, sp_runtime::RuntimeString> { + use frame_benchmarking::{Benchmarking, BenchmarkBatch, BenchmarkError}; + use sp_storage::TrackedStorageKey; + + use frame_system_benchmarking::Pallet as SystemBench; + impl frame_system_benchmarking::Config for Runtime { + fn setup_set_code_requirements(code: &sp_std::vec::Vec) -> Result<(), BenchmarkError> { + ParachainSystem::initialize_for_set_code_benchmark(code.len() as u32); + Ok(()) + } + + fn verify_set_code() { + System::assert_last_event(cumulus_pallet_parachain_system::Event::::ValidationFunctionStored.into()); + } + } + + use cumulus_pallet_session_benchmarking::Pallet as SessionBench; + impl cumulus_pallet_session_benchmarking::Config for Runtime {} + + use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsiscsBenchmark; + impl pallet_xcm::benchmarking::Config for Runtime { + fn reachable_dest() -> Option { + Some(Parent.into()) + } + + fn teleportable_asset_and_dest() -> Option<(MultiAsset, MultiLocation)> { + // Relay/native token can be teleported between People and Relay. + Some(( + MultiAsset { + fun: Fungible(EXISTENTIAL_DEPOSIT), + id: Concrete(Parent.into()) + }, + Parent.into(), + )) + } + + fn reserve_transferable_asset_and_dest() -> Option<(MultiAsset, MultiLocation)> { + None + } + } + + use xcm::latest::prelude::*; + use xcm_config::{PriceForParentDelivery, RelayLocation}; + + parameter_types! { + pub ExistentialDepositMultiAsset: Option = Some(( + RelayLocation::get(), + ExistentialDeposit::get() + ).into()); + } + + impl pallet_xcm_benchmarks::Config for Runtime { + type XcmConfig = XcmConfig; + type AccountIdConverter = xcm_config::LocationToAccountId; + type DeliveryHelper = cumulus_primitives_utility::ToParentDeliveryHelper< + XcmConfig, + ExistentialDepositMultiAsset, + PriceForParentDelivery, + >; + fn valid_destination() -> Result { + Ok(RelayLocation::get()) + } + fn worst_case_holding(_depositable_count: u32) -> MultiAssets { + // just concrete assets according to relay chain. + let assets: Vec = vec![ + MultiAsset { + id: Concrete(RelayLocation::get()), + fun: Fungible(1_000_000 * UNITS), + } + ]; + assets.into() + } + } + + parameter_types! { + pub const TrustedTeleporter: Option<(MultiLocation, MultiAsset)> = Some(( + RelayLocation::get(), + MultiAsset { fun: Fungible(UNITS), id: Concrete(RelayLocation::get()) }, + )); + pub const CheckedAccount: Option<(AccountId, xcm_builder::MintLocation)> = None; + pub const TrustedReserve: Option<(MultiLocation, MultiAsset)> = None; + } + + impl pallet_xcm_benchmarks::fungible::Config for Runtime { + type TransactAsset = Balances; + + type CheckedAccount = CheckedAccount; + type TrustedTeleporter = TrustedTeleporter; + type TrustedReserve = TrustedReserve; + + fn get_multi_asset() -> MultiAsset { + MultiAsset { + id: Concrete(RelayLocation::get()), + fun: Fungible(UNITS), + } + } + } + + impl pallet_xcm_benchmarks::generic::Config for Runtime { + type RuntimeCall = RuntimeCall; + type TransactAsset = Balances; + + fn worst_case_response() -> (u64, Response) { + (0u64, Response::Version(Default::default())) + } + + fn worst_case_asset_exchange() -> Result<(MultiAssets, MultiAssets), BenchmarkError> { + Err(BenchmarkError::Skip) + } + + fn universal_alias() -> Result<(MultiLocation, Junction), BenchmarkError> { + Err(BenchmarkError::Skip) + } + + fn transact_origin_and_runtime_call() -> Result<(MultiLocation, RuntimeCall), BenchmarkError> { + Ok((RelayLocation::get(), frame_system::Call::remark_with_event { remark: vec![] }.into())) + } + + fn subscribe_origin() -> Result { + Ok(RelayLocation::get()) + } + + fn claimable_asset() -> Result<(MultiLocation, MultiLocation, MultiAssets), BenchmarkError> { + let origin = RelayLocation::get(); + let assets: MultiAssets = (Concrete(RelayLocation::get()), 1_000 * UNITS).into(); + let ticket = MultiLocation { parents: 0, interior: Here }; + Ok((origin, ticket, assets)) + } + + fn unlockable_asset() -> Result<(MultiLocation, MultiLocation, MultiAsset), BenchmarkError> { + Err(BenchmarkError::Skip) + } + + fn export_message_origin_and_destination( + ) -> Result<(MultiLocation, NetworkId, InteriorMultiLocation), BenchmarkError> { + Err(BenchmarkError::Skip) + } + + fn alias_origin() -> Result<(MultiLocation, MultiLocation), BenchmarkError> { + Err(BenchmarkError::Skip) + } + } + + type XcmBalances = pallet_xcm_benchmarks::fungible::Pallet::; + type XcmGeneric = pallet_xcm_benchmarks::generic::Pallet::; + + let whitelist: Vec = vec![ + // Block Number + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac").to_vec().into(), + // Total Issuance + hex_literal::hex!("c2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80").to_vec().into(), + // Execution Phase + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7ff553b5a9862a516939d82b3d3d8661a").to_vec().into(), + // Event Count + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef70a98fdbe9ce6c55837576c60c7af3850").to_vec().into(), + // System Events + hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7").to_vec().into(), + ]; + + let mut batches = Vec::::new(); + let params = (&config, &whitelist); + add_benchmarks!(params, batches); + + Ok(batches) + } + } + + impl sp_genesis_builder::GenesisBuilder for Runtime { + fn create_default_config() -> Vec { + create_default_config::() + } + + fn build_config(config: Vec) -> sp_genesis_builder::Result { + build_config::(config) + } + } +} + +cumulus_pallet_parachain_system::register_validate_block! { + Runtime = Runtime, + BlockExecutor = cumulus_pallet_aura_ext::BlockExecutor::, +} diff --git a/cumulus/parachains/runtimes/people/people-westend/src/people.rs b/cumulus/parachains/runtimes/people/people-westend/src/people.rs new file mode 100644 index 00000000000..202e85bb62b --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-westend/src/people.rs @@ -0,0 +1,204 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use super::*; +use crate::xcm_config::LocationToAccountId; +use codec::{Decode, Encode, MaxEncodedLen}; +use enumflags2::{bitflags, BitFlags}; +use frame_support::{ + parameter_types, traits::ConstU32, CloneNoBound, EqNoBound, PartialEqNoBound, + RuntimeDebugNoBound, +}; +use pallet_identity::{Data, IdentityInformationProvider}; +use parachains_common::impls::ToParentTreasury; +use scale_info::TypeInfo; +use sp_runtime::{traits::AccountIdConversion, RuntimeDebug}; +use sp_std::prelude::*; + +parameter_types! { + // 27 | Min encoded size of `Registration` + // - 10 | Min encoded size of `IdentityInfo` + // -----| + // 17 | Min size without `IdentityInfo` (accounted for in byte deposit) + pub const BasicDeposit: Balance = deposit(1, 17); + pub const ByteDeposit: Balance = deposit(0, 1); + pub const SubAccountDeposit: Balance = deposit(1, 53); + pub RelayTreasuryAccount: AccountId = + parachains_common::polkadot::account::POLKADOT_TREASURY_PALLET_ID.into_account_truncating(); +} + +impl pallet_identity::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type Currency = Balances; + type BasicDeposit = BasicDeposit; + type ByteDeposit = ByteDeposit; + type SubAccountDeposit = SubAccountDeposit; + type MaxSubAccounts = ConstU32<100>; + type IdentityInformation = IdentityInfo; + type MaxRegistrars = ConstU32<20>; + type Slashed = ToParentTreasury; + type ForceOrigin = EnsureRoot; + type RegistrarOrigin = EnsureRoot; + type WeightInfo = weights::pallet_identity::WeightInfo; +} + +/// The fields that we use to identify the owner of an account with. Each corresponds to a field +/// in the `IdentityInfo` struct. +#[bitflags] +#[repr(u64)] +#[derive(Clone, Copy, PartialEq, Eq, RuntimeDebug)] +pub enum IdentityField { + Display, + Legal, + Web, + Matrix, + Email, + PgpFingerprint, + Image, + Twitter, + GitHub, + Discord, +} + +/// Information concerning the identity of the controller of an account. +#[derive( + CloneNoBound, + Encode, + Decode, + EqNoBound, + MaxEncodedLen, + PartialEqNoBound, + RuntimeDebugNoBound, + TypeInfo, +)] +#[codec(mel_bound())] +#[cfg_attr(test, derive(frame_support::DefaultNoBound))] +pub struct IdentityInfo { + /// A reasonable display name for the controller of the account. This should be whatever it is + /// that it is typically known as and should not be confusable with other entities, given + /// reasonable context. + /// + /// Stored as UTF-8. + pub display: Data, + + /// The full legal name in the local jurisdiction of the entity. This might be a bit + /// long-winded. + /// + /// Stored as UTF-8. + pub legal: Data, + + /// A representative website held by the controller of the account. + /// + /// NOTE: `https://` is automatically prepended. + /// + /// Stored as UTF-8. + pub web: Data, + + /// The Matrix (e.g. for Element) handle held by the controller of the account. Previously, + /// this was called `riot`. + /// + /// Stored as UTF-8. + pub matrix: Data, + + /// The email address of the controller of the account. + /// + /// Stored as UTF-8. + pub email: Data, + + /// The PGP/GPG public key of the controller of the account. + pub pgp_fingerprint: Option<[u8; 20]>, + + /// A graphic image representing the controller of the account. Should be a company, + /// organization or project logo or a headshot in the case of a human. + pub image: Data, + + /// The Twitter identity. The leading `@` character may be elided. + pub twitter: Data, + + /// The GitHub username of the controller of the account. + pub github: Data, + + /// The Discord username of the controller of the account. + pub discord: Data, +} + +impl IdentityInformationProvider for IdentityInfo { + type FieldsIdentifier = u64; + + fn has_identity(&self, fields: Self::FieldsIdentifier) -> bool { + self.fields().bits() & fields == fields + } + + #[cfg(feature = "runtime-benchmarks")] + fn create_identity_info() -> Self { + let data = Data::Raw(vec![0; 32].try_into().unwrap()); + + IdentityInfo { + display: data.clone(), + legal: data.clone(), + web: data.clone(), + matrix: data.clone(), + email: data.clone(), + pgp_fingerprint: Some([0; 20]), + image: data.clone(), + twitter: data.clone(), + github: data.clone(), + discord: data, + } + } + + #[cfg(feature = "runtime-benchmarks")] + fn all_fields() -> Self::FieldsIdentifier { + use enumflags2::BitFlag; + IdentityField::all().bits() + } +} + +impl IdentityInfo { + pub(crate) fn fields(&self) -> BitFlags { + let mut res = >::empty(); + if !self.display.is_none() { + res.insert(IdentityField::Display); + } + if !self.legal.is_none() { + res.insert(IdentityField::Legal); + } + if !self.web.is_none() { + res.insert(IdentityField::Web); + } + if !self.matrix.is_none() { + res.insert(IdentityField::Matrix); + } + if !self.email.is_none() { + res.insert(IdentityField::Email); + } + if self.pgp_fingerprint.is_some() { + res.insert(IdentityField::PgpFingerprint); + } + if !self.image.is_none() { + res.insert(IdentityField::Image); + } + if !self.twitter.is_none() { + res.insert(IdentityField::Twitter); + } + if !self.github.is_none() { + res.insert(IdentityField::GitHub); + } + if !self.discord.is_none() { + res.insert(IdentityField::Discord); + } + res + } +} diff --git a/cumulus/parachains/runtimes/people/people-westend/src/weights/block_weights.rs b/cumulus/parachains/runtimes/people/people-westend/src/weights/block_weights.rs new file mode 100644 index 00000000000..2bd7975bf98 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-westend/src/weights/block_weights.rs @@ -0,0 +1,53 @@ +// This file is part of Substrate. + +// Copyright (C) 2023 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +pub mod constants { + use frame_support::{ + parameter_types, + weights::{constants, Weight}, + }; + + parameter_types! { + /// Importing a block with 0 Extrinsics. + pub const BlockExecutionWeight: Weight = + Weight::from_parts(constants::WEIGHT_REF_TIME_PER_NANOS.saturating_mul(5_000_000), 0); + } + + #[cfg(test)] + mod test_weights { + use frame_support::weights::constants; + + /// Checks that the weight exists and is sane. + // NOTE: If this test fails but you are sure that the generated values are fine, + // you can delete it. + #[test] + fn sane() { + let w = super::constants::BlockExecutionWeight::get(); + + // At least 100 µs. + assert!( + w.ref_time() >= 100u64 * constants::WEIGHT_REF_TIME_PER_MICROS, + "Weight should be at least 100 µs." + ); + // At most 50 ms. + assert!( + w.ref_time() <= 50u64 * constants::WEIGHT_REF_TIME_PER_MILLIS, + "Weight should be at most 50 ms." + ); + } + } +} diff --git a/cumulus/parachains/runtimes/people/people-westend/src/weights/cumulus_pallet_parachain_system.rs b/cumulus/parachains/runtimes/people/people-westend/src/weights/cumulus_pallet_parachain_system.rs new file mode 100644 index 00000000000..fcea5fd1bf6 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-westend/src/weights/cumulus_pallet_parachain_system.rs @@ -0,0 +1,53 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Need to rerun + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for `cumulus_pallet_parachain_system`. +pub struct WeightInfo(PhantomData); +impl cumulus_pallet_parachain_system::WeightInfo for WeightInfo { + /// Storage: ParachainSystem LastDmqMqcHead (r:1 w:1) + /// Proof Skipped: ParachainSystem LastDmqMqcHead (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem ReservedDmpWeightOverride (r:1 w:0) + /// Proof Skipped: ParachainSystem ReservedDmpWeightOverride (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: MessageQueue BookStateFor (r:1 w:1) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: MessageQueue ServiceHead (r:1 w:1) + /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(5), added: 500, mode: MaxEncodedLen) + /// Storage: ParachainSystem ProcessedDownwardMessages (r:0 w:1) + /// Proof Skipped: ParachainSystem ProcessedDownwardMessages (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: MessageQueue Pages (r:0 w:16) + /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + /// The range of component `n` is `[0, 1000]`. + fn enqueue_inbound_downward_messages(n: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `12` + // Estimated: `8013` + // Minimum execution time: 1_622_000 picoseconds. + Weight::from_parts(1_709_000, 0) + .saturating_add(Weight::from_parts(0, 8013)) + // Standard Error: 22_138 + .saturating_add(Weight::from_parts(23_923_169, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(4)) + } +} diff --git a/cumulus/parachains/runtimes/people/people-westend/src/weights/cumulus_pallet_xcmp_queue.rs b/cumulus/parachains/runtimes/people/people-westend/src/weights/cumulus_pallet_xcmp_queue.rs new file mode 100644 index 00000000000..71ac6ef5180 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-westend/src/weights/cumulus_pallet_xcmp_queue.rs @@ -0,0 +1,129 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Need to rerun + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `cumulus_pallet_xcmp_queue`. +pub struct WeightInfo(PhantomData); +impl cumulus_pallet_xcmp_queue::WeightInfo for WeightInfo { + /// Storage: `XcmpQueue::QueueConfig` (r:1 w:1) + /// Proof: `XcmpQueue::QueueConfig` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn set_config_with_u32() -> Weight { + // Proof Size summary in bytes: + // Measured: `76` + // Estimated: `1561` + // Minimum execution time: 5_000_000 picoseconds. + Weight::from_parts(6_000_000, 0) + .saturating_add(Weight::from_parts(0, 1561)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `XcmpQueue::QueueConfig` (r:1 w:0) + /// Proof: `XcmpQueue::QueueConfig` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `MessageQueue::BookStateFor` (r:1 w:1) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + /// Storage: `MessageQueue::ServiceHead` (r:1 w:1) + /// Proof: `MessageQueue::ServiceHead` (`max_values`: Some(1), `max_size`: Some(5), added: 500, mode: `MaxEncodedLen`) + /// Storage: `XcmpQueue::InboundXcmpSuspended` (r:1 w:0) + /// Proof: `XcmpQueue::InboundXcmpSuspended` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `MessageQueue::Pages` (r:0 w:1) + /// Proof: `MessageQueue::Pages` (`max_values`: None, `max_size`: Some(65585), added: 68060, mode: `MaxEncodedLen`) + fn enqueue_xcmp_message() -> Weight { + // Proof Size summary in bytes: + // Measured: `82` + // Estimated: `3517` + // Minimum execution time: 14_000_000 picoseconds. + Weight::from_parts(15_000_000, 0) + .saturating_add(Weight::from_parts(0, 3517)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:1) + /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn suspend_channel() -> Weight { + // Proof Size summary in bytes: + // Measured: `76` + // Estimated: `1561` + // Minimum execution time: 3_000_000 picoseconds. + Weight::from_parts(3_000_000, 0) + .saturating_add(Weight::from_parts(0, 1561)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `XcmpQueue::OutboundXcmpStatus` (r:1 w:1) + /// Proof: `XcmpQueue::OutboundXcmpStatus` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn resume_channel() -> Weight { + // Proof Size summary in bytes: + // Measured: `111` + // Estimated: `1596` + // Minimum execution time: 4_000_000 picoseconds. + Weight::from_parts(4_000_000, 0) + .saturating_add(Weight::from_parts(0, 1596)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + fn take_first_concatenated_xcm() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 44_000_000 picoseconds. + Weight::from_parts(45_000_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + /// Storage: UNKNOWN KEY `0x7b3237373ffdfeb1cab4222e3b520d6b345d8e88afa015075c945637c07e8f20` (r:1 w:1) + /// Proof: UNKNOWN KEY `0x7b3237373ffdfeb1cab4222e3b520d6b345d8e88afa015075c945637c07e8f20` (r:1 w:1) + /// Storage: `XcmpQueue::InboundXcmpMessages` (r:1 w:1) + /// Proof: `XcmpQueue::InboundXcmpMessages` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `MessageQueue::BookStateFor` (r:1 w:1) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + /// Storage: `MessageQueue::ServiceHead` (r:1 w:1) + /// Proof: `MessageQueue::ServiceHead` (`max_values`: Some(1), `max_size`: Some(5), added: 500, mode: `MaxEncodedLen`) + /// Storage: `XcmpQueue::QueueConfig` (r:1 w:0) + /// Proof: `XcmpQueue::QueueConfig` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `XcmpQueue::InboundXcmpSuspended` (r:1 w:0) + /// Proof: `XcmpQueue::InboundXcmpSuspended` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `MessageQueue::Pages` (r:0 w:1) + /// Proof: `MessageQueue::Pages` (`max_values`: None, `max_size`: Some(65585), added: 68060, mode: `MaxEncodedLen`) + fn on_idle_good_msg() -> Weight { + // Proof Size summary in bytes: + // Measured: `65711` + // Estimated: `69176` + // Minimum execution time: 67_000_000 picoseconds. + Weight::from_parts(73_000_000, 0) + .saturating_add(Weight::from_parts(0, 69176)) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(5)) + } + /// Storage: UNKNOWN KEY `0x7b3237373ffdfeb1cab4222e3b520d6b345d8e88afa015075c945637c07e8f20` (r:1 w:1) + /// Proof: UNKNOWN KEY `0x7b3237373ffdfeb1cab4222e3b520d6b345d8e88afa015075c945637c07e8f20` (r:1 w:1) + fn on_idle_large_msg() -> Weight { + // Proof Size summary in bytes: + // Measured: `65710` + // Estimated: `69175` + // Minimum execution time: 49_000_000 picoseconds. + Weight::from_parts(55_000_000, 0) + .saturating_add(Weight::from_parts(0, 69175)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } +} diff --git a/cumulus/parachains/runtimes/people/people-westend/src/weights/extrinsic_weights.rs b/cumulus/parachains/runtimes/people/people-westend/src/weights/extrinsic_weights.rs new file mode 100644 index 00000000000..898d72ec5b1 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-westend/src/weights/extrinsic_weights.rs @@ -0,0 +1,53 @@ +// This file is part of Substrate. + +// Copyright (C) 2023 Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +pub mod constants { + use frame_support::{ + parameter_types, + weights::{constants, Weight}, + }; + + parameter_types! { + /// Executing a NO-OP `System::remarks` Extrinsic. + pub const ExtrinsicBaseWeight: Weight = + Weight::from_parts(constants::WEIGHT_REF_TIME_PER_NANOS.saturating_mul(125_000), 0); + } + + #[cfg(test)] + mod test_weights { + use frame_support::weights::constants; + + /// Checks that the weight exists and is sane. + // NOTE: If this test fails but you are sure that the generated values are fine, + // you can delete it. + #[test] + fn sane() { + let w = super::constants::ExtrinsicBaseWeight::get(); + + // At least 10 µs. + assert!( + w.ref_time() >= 10u64 * constants::WEIGHT_REF_TIME_PER_MICROS, + "Weight should be at least 10 µs." + ); + // At most 1 ms. + assert!( + w.ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, + "Weight should be at most 1 ms." + ); + } + } +} diff --git a/cumulus/parachains/runtimes/people/people-westend/src/weights/frame_system.rs b/cumulus/parachains/runtimes/people/people-westend/src/weights/frame_system.rs new file mode 100644 index 00000000000..d763fe1c426 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-westend/src/weights/frame_system.rs @@ -0,0 +1,160 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Autogenerated weights for `frame_system` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-05, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("people-polkadot-dev"), DB CACHE: 1024 + +// Executed Command: +// ./artifacts/polkadot-parachain +// benchmark +// pallet +// --chain=people-polkadot-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=frame_system +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json +// --header=./file_header.txt +// --output=./cumulus/parachains/runtimes/people/people-polkadot/src/weights/frame_system.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `frame_system`. +pub struct WeightInfo(PhantomData); +impl frame_system::WeightInfo for WeightInfo { + /// The range of component `b` is `[0, 3932160]`. + fn remark(b: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_432_000 picoseconds. + Weight::from_parts(2_458_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + // Standard Error: 0 + .saturating_add(Weight::from_parts(367, 0).saturating_mul(b.into())) + } + /// The range of component `b` is `[0, 3932160]`. + fn remark_with_event(b: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 7_911_000 picoseconds. + Weight::from_parts(8_031_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + // Standard Error: 0 + .saturating_add(Weight::from_parts(1_405, 0).saturating_mul(b.into())) + } + /// Storage: System Digest (r:1 w:1) + /// Proof Skipped: System Digest (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: unknown `0x3a686561707061676573` (r:0 w:1) + /// Proof Skipped: unknown `0x3a686561707061676573` (r:0 w:1) + fn set_heap_pages() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `1485` + // Minimum execution time: 4_304_000 picoseconds. + Weight::from_parts(4_553_000, 0) + .saturating_add(Weight::from_parts(0, 1485)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(2)) + } + fn set_code() -> Weight { + Weight::from_parts(1_000_000, 0) + } + /// Storage: Skipped Metadata (r:0 w:0) + /// Proof Skipped: Skipped Metadata (max_values: None, max_size: None, mode: Measured) + /// The range of component `i` is `[0, 1000]`. + fn set_storage(i: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_493_000 picoseconds. + Weight::from_parts(2_523_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + // Standard Error: 1_594 + .saturating_add(Weight::from_parts(663_439, 0).saturating_mul(i.into())) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) + } + /// Storage: Skipped Metadata (r:0 w:0) + /// Proof Skipped: Skipped Metadata (max_values: None, max_size: None, mode: Measured) + /// The range of component `i` is `[0, 1000]`. + fn kill_storage(i: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_492_000 picoseconds. + Weight::from_parts(2_526_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + // Standard Error: 784 + .saturating_add(Weight::from_parts(493_844, 0).saturating_mul(i.into())) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) + } + /// Storage: Skipped Metadata (r:0 w:0) + /// Proof Skipped: Skipped Metadata (max_values: None, max_size: None, mode: Measured) + /// The range of component `p` is `[0, 1000]`. + fn kill_prefix(p: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `68 + p * (69 ±0)` + // Estimated: `66 + p * (70 ±0)` + // Minimum execution time: 4_200_000 picoseconds. + Weight::from_parts(4_288_000, 0) + .saturating_add(Weight::from_parts(0, 66)) + // Standard Error: 1_195 + .saturating_add(Weight::from_parts(1_021_563, 0).saturating_mul(p.into())) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(p.into()))) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) + .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) + } + /// Storage: `System::AuthorizedUpgrade` (r:0 w:1) + /// Proof: `System::AuthorizedUpgrade` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + fn authorize_upgrade() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 33_027_000 picoseconds. + Weight::from_parts(33_027_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `System::AuthorizedUpgrade` (r:1 w:1) + /// Proof: `System::AuthorizedUpgrade` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) + /// Storage: `System::Digest` (r:1 w:1) + /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) + /// Proof: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) + fn apply_authorized_upgrade() -> Weight { + // Proof Size summary in bytes: + // Measured: `22` + // Estimated: `1518` + // Minimum execution time: 118_101_992_000 picoseconds. + Weight::from_parts(118_101_992_000, 0) + .saturating_add(Weight::from_parts(0, 1518)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(3)) + } +} diff --git a/cumulus/parachains/runtimes/people/people-westend/src/weights/mod.rs b/cumulus/parachains/runtimes/people/people-westend/src/weights/mod.rs new file mode 100644 index 00000000000..67e203cfaf5 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-westend/src/weights/mod.rs @@ -0,0 +1,40 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Expose the auto generated weight files. + +pub mod block_weights; +pub mod cumulus_pallet_parachain_system; +pub mod cumulus_pallet_xcmp_queue; +pub mod extrinsic_weights; +pub mod frame_system; +pub mod pallet_balances; +pub mod pallet_collator_selection; +pub mod pallet_identity; +pub mod pallet_message_queue; +pub mod pallet_multisig; +pub mod pallet_session; +pub mod pallet_timestamp; +pub mod pallet_utility; +pub mod pallet_xcm; +pub mod paritydb_weights; +pub mod polkadot_runtime_common_identity_migrator; +pub mod rocksdb_weights; +pub mod xcm; + +pub use block_weights::constants::BlockExecutionWeight; +pub use extrinsic_weights::constants::ExtrinsicBaseWeight; +pub use paritydb_weights::constants::ParityDbWeight; +pub use rocksdb_weights::constants::RocksDbWeight; diff --git a/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_balances.rs b/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_balances.rs new file mode 100644 index 00000000000..e53c8878dd1 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_balances.rs @@ -0,0 +1,150 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Autogenerated weights for `pallet_balances` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("people-polkadot-dev"), DB CACHE: 1024 + +// Executed Command: +// ./artifacts/polkadot-parachain +// benchmark +// pallet +// --chain=people-polkadot-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_balances +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json +// --header=./file_header.txt +// --output=./cumulus/parachains/runtimes/people/people-polkadot/src/weights/pallet_balances.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_balances`. +pub struct WeightInfo(PhantomData); +impl pallet_balances::WeightInfo for WeightInfo { + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + fn transfer_allow_death() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `3593` + // Minimum execution time: 59_580_000 picoseconds. + Weight::from_parts(60_317_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + fn transfer_keep_alive() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `3593` + // Minimum execution time: 45_490_000 picoseconds. + Weight::from_parts(45_910_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + fn force_set_balance_creating() -> Weight { + // Proof Size summary in bytes: + // Measured: `174` + // Estimated: `3593` + // Minimum execution time: 17_353_000 picoseconds. + Weight::from_parts(17_676_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + fn force_set_balance_killing() -> Weight { + // Proof Size summary in bytes: + // Measured: `174` + // Estimated: `3593` + // Minimum execution time: 25_017_000 picoseconds. + Weight::from_parts(25_542_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: System Account (r:2 w:2) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + fn force_transfer() -> Weight { + // Proof Size summary in bytes: + // Measured: `103` + // Estimated: `6196` + // Minimum execution time: 61_161_000 picoseconds. + Weight::from_parts(61_665_000, 0) + .saturating_add(Weight::from_parts(0, 6196)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + fn transfer_all() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `3593` + // Minimum execution time: 55_422_000 picoseconds. + Weight::from_parts(55_880_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + fn force_unreserve() -> Weight { + // Proof Size summary in bytes: + // Measured: `174` + // Estimated: `3593` + // Minimum execution time: 20_477_000 picoseconds. + Weight::from_parts(20_871_000, 0) + .saturating_add(Weight::from_parts(0, 3593)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: System Account (r:999 w:999) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// The range of component `u` is `[1, 1000]`. + fn upgrade_accounts(u: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0 + u * (136 ±0)` + // Estimated: `990 + u * (2603 ±0)` + // Minimum execution time: 19_501_000 picoseconds. + Weight::from_parts(19_726_000, 0) + .saturating_add(Weight::from_parts(0, 990)) + // Standard Error: 9_495 + .saturating_add(Weight::from_parts(15_658_957, 0).saturating_mul(u.into())) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) + .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) + } +} diff --git a/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_collator_selection.rs b/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_collator_selection.rs new file mode 100644 index 00000000000..811e2b7ad87 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_collator_selection.rs @@ -0,0 +1,242 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Autogenerated weights for `pallet_collator_selection` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("people-polkadot-dev"), DB CACHE: 1024 + +// Executed Command: +// ./artifacts/polkadot-parachain +// benchmark +// pallet +// --chain=people-polkadot-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_collator_selection +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json +// --header=./file_header.txt +// --output=./cumulus/parachains/runtimes/people/people-polkadot/src/weights/pallet_collator_selection.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_collator_selection`. +pub struct WeightInfo(PhantomData); +impl pallet_collator_selection::WeightInfo for WeightInfo { + /// Storage: Session NextKeys (r:100 w:0) + /// Proof Skipped: Session NextKeys (max_values: None, max_size: None, mode: Measured) + /// Storage: CollatorSelection Invulnerables (r:0 w:1) + /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) + /// The range of component `b` is `[1, 100]`. + fn set_invulnerables(b: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `214 + b * (78 ±0)` + // Estimated: `1203 + b * (2554 ±0)` + // Minimum execution time: 14_426_000 picoseconds. + Weight::from_parts(14_971_974, 0) + .saturating_add(Weight::from_parts(0, 1203)) + // Standard Error: 2_914 + .saturating_add(Weight::from_parts(2_604_699, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b.into()))) + .saturating_add(T::DbWeight::get().writes(1)) + .saturating_add(Weight::from_parts(0, 2554).saturating_mul(b.into())) + } + /// Storage: CollatorSelection DesiredCandidates (r:0 w:1) + /// Proof: CollatorSelection DesiredCandidates (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + fn set_desired_candidates() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 6_977_000 picoseconds. + Weight::from_parts(7_246_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `CollatorSelection::CandidacyBond` (r:0 w:1) + /// Proof: `CollatorSelection::CandidacyBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) + fn set_candidacy_bond(_c: u32, _k: u32) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 7_388_000 picoseconds. + Weight::from_parts(7_677_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: CollatorSelection Candidates (r:1 w:1) + /// Proof: CollatorSelection Candidates (max_values: Some(1), max_size: Some(48002), added: 48497, mode: MaxEncodedLen) + /// Storage: CollatorSelection DesiredCandidates (r:1 w:0) + /// Proof: CollatorSelection DesiredCandidates (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Storage: CollatorSelection Invulnerables (r:1 w:0) + /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) + /// Storage: Session NextKeys (r:1 w:0) + /// Proof Skipped: Session NextKeys (max_values: None, max_size: None, mode: Measured) + /// Storage: CollatorSelection CandidacyBond (r:1 w:0) + /// Proof: CollatorSelection CandidacyBond (max_values: Some(1), max_size: Some(16), added: 511, mode: MaxEncodedLen) + /// Storage: CollatorSelection LastAuthoredBlock (r:0 w:1) + /// Proof: CollatorSelection LastAuthoredBlock (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) + /// The range of component `c` is `[1, 999]`. + fn register_as_candidate(c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `1104 + c * (48 ±0)` + // Estimated: `49487 + c * (49 ±0)` + // Minimum execution time: 42_275_000 picoseconds. + Weight::from_parts(33_742_215, 0) + .saturating_add(Weight::from_parts(0, 49487)) + // Standard Error: 1_291 + .saturating_add(Weight::from_parts(103_381, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(2)) + .saturating_add(Weight::from_parts(0, 49).saturating_mul(c.into())) + } + /// Storage: CollatorSelection Candidates (r:1 w:1) + /// Proof: CollatorSelection Candidates (max_values: Some(1), max_size: Some(48002), added: 48497, mode: MaxEncodedLen) + /// Storage: CollatorSelection LastAuthoredBlock (r:0 w:1) + /// Proof: CollatorSelection LastAuthoredBlock (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) + /// The range of component `c` is `[6, 1000]`. + fn leave_intent(c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `428 + c * (48 ±0)` + // Estimated: `49487` + // Minimum execution time: 33_404_000 picoseconds. + Weight::from_parts(22_612_617, 0) + .saturating_add(Weight::from_parts(0, 49487)) + // Standard Error: 1_341 + .saturating_add(Weight::from_parts(105_669, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: System Account (r:2 w:2) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: System BlockWeight (r:1 w:1) + /// Proof: System BlockWeight (max_values: Some(1), max_size: Some(48), added: 543, mode: MaxEncodedLen) + /// Storage: CollatorSelection LastAuthoredBlock (r:0 w:1) + /// Proof: CollatorSelection LastAuthoredBlock (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) + fn note_author() -> Weight { + // Proof Size summary in bytes: + // Measured: `155` + // Estimated: `6196` + // Minimum execution time: 44_415_000 picoseconds. + Weight::from_parts(44_732_000, 0) + .saturating_add(Weight::from_parts(0, 6196)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(4)) + } + /// Storage: Session NextKeys (r:1 w:0) + /// Proof Skipped: Session NextKeys (max_values: None, max_size: None, mode: Measured) + /// Storage: CollatorSelection Invulnerables (r:1 w:1) + /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(641), added: 1136, mode: MaxEncodedLen) + /// Storage: CollatorSelection Candidates (r:1 w:1) + /// Proof: CollatorSelection Candidates (max_values: Some(1), max_size: Some(4802), added: 5297, mode: MaxEncodedLen) + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// The range of component `b` is `[1, 19]`. + /// The range of component `c` is `[1, 99]`. + fn add_invulnerable(b: u32, c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `757 + b * (32 ±0) + c * (53 ±0)` + // Estimated: `6287 + b * (37 ±0) + c * (53 ±0)` + // Minimum execution time: 52_720_000 picoseconds. + Weight::from_parts(56_102_459, 0) + .saturating_add(Weight::from_parts(0, 6287)) + // Standard Error: 12_957 + .saturating_add(Weight::from_parts(26_422, 0).saturating_mul(b.into())) + // Standard Error: 2_456 + .saturating_add(Weight::from_parts(128_528, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(3)) + .saturating_add(Weight::from_parts(0, 37).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(0, 53).saturating_mul(c.into())) + } + fn update_bond(c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `306 + c * (50 ±0)` + // Estimated: `6287` + // Minimum execution time: 34_814_000 picoseconds. + Weight::from_parts(36_371_520, 0) + .saturating_add(Weight::from_parts(0, 6287)) + // Standard Error: 2_391 + .saturating_add(Weight::from_parts(201_700, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + fn take_candidate_slot(c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `306 + c * (50 ±0)` + // Estimated: `6287` + // Minimum execution time: 34_814_000 picoseconds. + Weight::from_parts(36_371_520, 0) + .saturating_add(Weight::from_parts(0, 6287)) + // Standard Error: 2_391 + .saturating_add(Weight::from_parts(201_700, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: CollatorSelection Invulnerables (r:1 w:1) + /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) + /// The range of component `b` is `[1, 100]`. + fn remove_invulnerable(b: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `119 + b * (32 ±0)` + // Estimated: `4687` + // Minimum execution time: 183_054_000 picoseconds. + Weight::from_parts(197_205_427, 0) + .saturating_add(Weight::from_parts(0, 4687)) + // Standard Error: 13_533 + .saturating_add(Weight::from_parts(376_231, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: CollatorSelection Candidates (r:1 w:0) + /// Proof: CollatorSelection Candidates (max_values: Some(1), max_size: Some(48002), added: 48497, mode: MaxEncodedLen) + /// Storage: CollatorSelection LastAuthoredBlock (r:999 w:0) + /// Proof: CollatorSelection LastAuthoredBlock (max_values: None, max_size: Some(44), added: 2519, mode: MaxEncodedLen) + /// Storage: CollatorSelection Invulnerables (r:1 w:0) + /// Proof: CollatorSelection Invulnerables (max_values: Some(1), max_size: Some(3202), added: 3697, mode: MaxEncodedLen) + /// Storage: System BlockWeight (r:1 w:1) + /// Proof: System BlockWeight (max_values: Some(1), max_size: Some(48), added: 543, mode: MaxEncodedLen) + /// Storage: System Account (r:995 w:995) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// The range of component `r` is `[1, 1000]`. + /// The range of component `c` is `[1, 1000]`. + fn new_session(r: u32, c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `22815 + c * (97 ±0) + r * (116 ±0)` + // Estimated: `49487 + c * (2519 ±0) + r * (2602 ±0)` + // Minimum execution time: 16_765_000 picoseconds. + Weight::from_parts(16_997_000, 0) + .saturating_add(Weight::from_parts(0, 49487)) + // Standard Error: 860_677 + .saturating_add(Weight::from_parts(30_463_094, 0).saturating_mul(c.into())) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into()))) + .saturating_add(T::DbWeight::get().writes(1)) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(c.into()))) + .saturating_add(Weight::from_parts(0, 2519).saturating_mul(c.into())) + .saturating_add(Weight::from_parts(0, 2602).saturating_mul(r.into())) + } +} diff --git a/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_identity.rs b/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_identity.rs new file mode 100644 index 00000000000..65cac7875ba --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_identity.rs @@ -0,0 +1,315 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Taken from Rococo Relay Chain. Needs to rerun. + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_identity`. +pub struct WeightInfo(PhantomData); +impl pallet_identity::WeightInfo for WeightInfo { + /// Storage: Identity Registrars (r:1 w:1) + /// Proof: Identity Registrars (max_values: Some(1), max_size: Some(1141), added: 1636, mode: MaxEncodedLen) + /// The range of component `r` is `[1, 19]`. + fn add_registrar(r: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `32 + r * (57 ±0)` + // Estimated: `2626` + // Minimum execution time: 12_290_000 picoseconds. + Weight::from_parts(12_664_362, 0) + .saturating_add(Weight::from_parts(0, 2626)) + // Standard Error: 1_347 + .saturating_add(Weight::from_parts(88_179, 0).saturating_mul(r.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Identity IdentityOf (r:1 w:1) + /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) + /// The range of component `r` is `[1, 20]`. + fn set_identity(r: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `442 + r * (5 ±0)` + // Estimated: `11003` + // Minimum execution time: 31_373_000 picoseconds. + Weight::from_parts(30_435_545, 0) + .saturating_add(Weight::from_parts(0, 11003)) + // Standard Error: 2_307 + .saturating_add(Weight::from_parts(92_753, 0).saturating_mul(r.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Identity IdentityOf (r:1 w:0) + /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) + /// Storage: Identity SubsOf (r:1 w:1) + /// Proof: Identity SubsOf (max_values: None, max_size: Some(3258), added: 5733, mode: MaxEncodedLen) + /// Storage: Identity SuperOf (r:100 w:100) + /// Proof: Identity SuperOf (max_values: None, max_size: Some(114), added: 2589, mode: MaxEncodedLen) + /// The range of component `s` is `[0, 100]`. + fn set_subs_new(s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `101` + // Estimated: `11003 + s * (2589 ±0)` + // Minimum execution time: 9_251_000 picoseconds. + Weight::from_parts(22_039_210, 0) + .saturating_add(Weight::from_parts(0, 11003)) + // Standard Error: 40_779 + .saturating_add(Weight::from_parts(2_898_525, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(s.into()))) + .saturating_add(T::DbWeight::get().writes(1)) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(s.into()))) + .saturating_add(Weight::from_parts(0, 2589).saturating_mul(s.into())) + } + /// Storage: Identity IdentityOf (r:1 w:0) + /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) + /// Storage: Identity SubsOf (r:1 w:1) + /// Proof: Identity SubsOf (max_values: None, max_size: Some(3258), added: 5733, mode: MaxEncodedLen) + /// Storage: Identity SuperOf (r:0 w:100) + /// Proof: Identity SuperOf (max_values: None, max_size: Some(114), added: 2589, mode: MaxEncodedLen) + /// The range of component `p` is `[0, 100]`. + fn set_subs_old(p: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `194 + p * (32 ±0)` + // Estimated: `11003` + // Minimum execution time: 9_329_000 picoseconds. + Weight::from_parts(24_055_061, 0) + .saturating_add(Weight::from_parts(0, 11003)) + // Standard Error: 3_428 + .saturating_add(Weight::from_parts(1_130_604, 0).saturating_mul(p.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) + } + /// Storage: Identity SubsOf (r:1 w:1) + /// Proof: Identity SubsOf (max_values: None, max_size: Some(3258), added: 5733, mode: MaxEncodedLen) + /// Storage: Identity IdentityOf (r:1 w:1) + /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) + /// Storage: Identity SuperOf (r:0 w:100) + /// Proof: Identity SuperOf (max_values: None, max_size: Some(114), added: 2589, mode: MaxEncodedLen) + /// The range of component `r` is `[1, 20]`. + /// The range of component `s` is `[0, 100]`. + fn clear_identity(_r: u32, s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `469 + r * (5 ±0) + s * (32 ±0) + x * (66 ±0)` + // Estimated: `11003` + // Minimum execution time: 53_365_000 picoseconds. + Weight::from_parts(35_391_422, 0) + .saturating_add(Weight::from_parts(0, 11003)) + // Standard Error: 1_353 + .saturating_add(Weight::from_parts(1_074_019, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(s.into()))) + } + /// Storage: Identity Registrars (r:1 w:0) + /// Proof: Identity Registrars (max_values: Some(1), max_size: Some(1141), added: 1636, mode: MaxEncodedLen) + /// Storage: Identity IdentityOf (r:1 w:1) + /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) + /// The range of component `r` is `[1, 20]`. + fn request_judgement(r: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `367 + r * (57 ±0) + x * (66 ±0)` + // Estimated: `11003` + // Minimum execution time: 32_509_000 picoseconds. + Weight::from_parts(31_745_585, 0) + .saturating_add(Weight::from_parts(0, 11003)) + // Standard Error: 2_214 + .saturating_add(Weight::from_parts(83_822, 0).saturating_mul(r.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Identity IdentityOf (r:1 w:1) + /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) + /// The range of component `r` is `[1, 20]`. + fn cancel_request(r: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `398 + x * (66 ±0)` + // Estimated: `11003` + // Minimum execution time: 29_609_000 picoseconds. + Weight::from_parts(28_572_602, 0) + .saturating_add(Weight::from_parts(0, 11003)) + // Standard Error: 2_528 + .saturating_add(Weight::from_parts(85_593, 0).saturating_mul(r.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Identity Registrars (r:1 w:1) + /// Proof: Identity Registrars (max_values: Some(1), max_size: Some(1141), added: 1636, mode: MaxEncodedLen) + /// The range of component `r` is `[1, 19]`. + fn set_fee(r: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `89 + r * (57 ±0)` + // Estimated: `2626` + // Minimum execution time: 7_793_000 picoseconds. + Weight::from_parts(8_173_888, 0) + .saturating_add(Weight::from_parts(0, 2626)) + // Standard Error: 1_569 + .saturating_add(Weight::from_parts(72_367, 0).saturating_mul(r.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Identity Registrars (r:1 w:1) + /// Proof: Identity Registrars (max_values: Some(1), max_size: Some(1141), added: 1636, mode: MaxEncodedLen) + /// The range of component `r` is `[1, 19]`. + fn set_account_id(r: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `89 + r * (57 ±0)` + // Estimated: `2626` + // Minimum execution time: 7_708_000 picoseconds. + Weight::from_parts(8_091_149, 0) + .saturating_add(Weight::from_parts(0, 2626)) + // Standard Error: 869 + .saturating_add(Weight::from_parts(87_993, 0).saturating_mul(r.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Identity Registrars (r:1 w:1) + /// Proof: Identity Registrars (max_values: Some(1), max_size: Some(1141), added: 1636, mode: MaxEncodedLen) + /// The range of component `r` is `[1, 19]`. + fn set_fields(r: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `89 + r * (57 ±0)` + // Estimated: `2626` + // Minimum execution time: 7_601_000 picoseconds. + Weight::from_parts(8_038_414, 0) + .saturating_add(Weight::from_parts(0, 2626)) + // Standard Error: 1_041 + .saturating_add(Weight::from_parts(82_588, 0).saturating_mul(r.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Identity Registrars (r:1 w:0) + /// Proof: Identity Registrars (max_values: Some(1), max_size: Some(1141), added: 1636, mode: MaxEncodedLen) + /// Storage: Identity IdentityOf (r:1 w:1) + /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) + /// The range of component `r` is `[1, 19]`. + fn provide_judgement(r: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `445 + r * (57 ±0) + x * (66 ±0)` + // Estimated: `11003` + // Minimum execution time: 23_114_000 picoseconds. + Weight::from_parts(22_076_548, 0) + .saturating_add(Weight::from_parts(0, 11003)) + // Standard Error: 2_881 + .saturating_add(Weight::from_parts(109_812, 0).saturating_mul(r.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Identity SubsOf (r:1 w:1) + /// Proof: Identity SubsOf (max_values: None, max_size: Some(3258), added: 5733, mode: MaxEncodedLen) + /// Storage: Identity IdentityOf (r:1 w:1) + /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// Storage: Identity SuperOf (r:0 w:100) + /// Proof: Identity SuperOf (max_values: None, max_size: Some(114), added: 2589, mode: MaxEncodedLen) + /// The range of component `r` is `[1, 20]`. + /// The range of component `s` is `[0, 100]`. + fn kill_identity(r: u32, s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `676 + r * (5 ±0) + s * (32 ±0) + x * (66 ±0)` + // Estimated: `11003` + // Minimum execution time: 70_007_000 picoseconds. + Weight::from_parts(50_186_495, 0) + .saturating_add(Weight::from_parts(0, 11003)) + // Standard Error: 6_533 + .saturating_add(Weight::from_parts(15_486, 0).saturating_mul(r.into())) + // Standard Error: 1_275 + .saturating_add(Weight::from_parts(1_085_117, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(3)) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(s.into()))) + } + /// Storage: Identity IdentityOf (r:1 w:0) + /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) + /// Storage: Identity SuperOf (r:1 w:1) + /// Proof: Identity SuperOf (max_values: None, max_size: Some(114), added: 2589, mode: MaxEncodedLen) + /// Storage: Identity SubsOf (r:1 w:1) + /// Proof: Identity SubsOf (max_values: None, max_size: Some(3258), added: 5733, mode: MaxEncodedLen) + /// The range of component `s` is `[0, 99]`. + fn add_sub(s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `475 + s * (36 ±0)` + // Estimated: `11003` + // Minimum execution time: 28_453_000 picoseconds. + Weight::from_parts(33_165_934, 0) + .saturating_add(Weight::from_parts(0, 11003)) + // Standard Error: 1_217 + .saturating_add(Weight::from_parts(65_401, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: Identity IdentityOf (r:1 w:0) + /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) + /// Storage: Identity SuperOf (r:1 w:1) + /// Proof: Identity SuperOf (max_values: None, max_size: Some(114), added: 2589, mode: MaxEncodedLen) + /// The range of component `s` is `[1, 100]`. + fn rename_sub(s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `591 + s * (3 ±0)` + // Estimated: `11003` + // Minimum execution time: 12_846_000 picoseconds. + Weight::from_parts(14_710_284, 0) + .saturating_add(Weight::from_parts(0, 11003)) + // Standard Error: 496 + .saturating_add(Weight::from_parts(19_539, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Identity IdentityOf (r:1 w:0) + /// Proof: Identity IdentityOf (max_values: None, max_size: Some(7538), added: 10013, mode: MaxEncodedLen) + /// Storage: Identity SuperOf (r:1 w:1) + /// Proof: Identity SuperOf (max_values: None, max_size: Some(114), added: 2589, mode: MaxEncodedLen) + /// Storage: Identity SubsOf (r:1 w:1) + /// Proof: Identity SubsOf (max_values: None, max_size: Some(3258), added: 5733, mode: MaxEncodedLen) + /// The range of component `s` is `[1, 100]`. + fn remove_sub(s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `638 + s * (35 ±0)` + // Estimated: `11003` + // Minimum execution time: 32_183_000 picoseconds. + Weight::from_parts(35_296_731, 0) + .saturating_add(Weight::from_parts(0, 11003)) + // Standard Error: 854 + .saturating_add(Weight::from_parts(52_028, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: Identity SuperOf (r:1 w:1) + /// Proof: Identity SuperOf (max_values: None, max_size: Some(114), added: 2589, mode: MaxEncodedLen) + /// Storage: Identity SubsOf (r:1 w:1) + /// Proof: Identity SubsOf (max_values: None, max_size: Some(3258), added: 5733, mode: MaxEncodedLen) + /// Storage: System Account (r:1 w:0) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// The range of component `s` is `[0, 99]`. + fn quit_sub(s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `704 + s * (37 ±0)` + // Estimated: `6723` + // Minimum execution time: 24_941_000 picoseconds. + Weight::from_parts(27_433_059, 0) + .saturating_add(Weight::from_parts(0, 6723)) + // Standard Error: 856 + .saturating_add(Weight::from_parts(57_463, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(2)) + } +} diff --git a/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_message_queue.rs b/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_message_queue.rs new file mode 100644 index 00000000000..fe1911b77a7 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_message_queue.rs @@ -0,0 +1,156 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Need to rerun + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weight functions for `pallet_message_queue`. +pub struct WeightInfo(PhantomData); +impl pallet_message_queue::WeightInfo for WeightInfo { + /// Storage: MessageQueue ServiceHead (r:1 w:0) + /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(5), added: 500, mode: MaxEncodedLen) + /// Storage: MessageQueue BookStateFor (r:2 w:2) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + fn ready_ring_knit() -> Weight { + // Proof Size summary in bytes: + // Measured: `189` + // Estimated: `7534` + // Minimum execution time: 13_668_000 picoseconds. + Weight::from_parts(13_668_000, 0) + .saturating_add(Weight::from_parts(0, 7534)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: MessageQueue BookStateFor (r:2 w:2) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: MessageQueue ServiceHead (r:1 w:1) + /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(5), added: 500, mode: MaxEncodedLen) + fn ready_ring_unknit() -> Weight { + // Proof Size summary in bytes: + // Measured: `184` + // Estimated: `7534` + // Minimum execution time: 11_106_000 picoseconds. + Weight::from_parts(11_106_000, 0) + .saturating_add(Weight::from_parts(0, 7534)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: MessageQueue BookStateFor (r:1 w:1) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + fn service_queue_base() -> Weight { + // Proof Size summary in bytes: + // Measured: `6` + // Estimated: `3517` + // Minimum execution time: 4_921_000 picoseconds. + Weight::from_parts(4_921_000, 0) + .saturating_add(Weight::from_parts(0, 3517)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: MessageQueue Pages (r:1 w:1) + /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + fn service_page_base_completion() -> Weight { + // Proof Size summary in bytes: + // Measured: `72` + // Estimated: `69050` + // Minimum execution time: 6_879_000 picoseconds. + Weight::from_parts(6_879_000, 0) + .saturating_add(Weight::from_parts(0, 69050)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: MessageQueue Pages (r:1 w:1) + /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + fn service_page_base_no_completion() -> Weight { + // Proof Size summary in bytes: + // Measured: `72` + // Estimated: `69050` + // Minimum execution time: 7_564_000 picoseconds. + Weight::from_parts(7_564_000, 0) + .saturating_add(Weight::from_parts(0, 69050)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + fn service_page_item() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 59_963_000 picoseconds. + Weight::from_parts(59_963_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + /// Storage: MessageQueue ServiceHead (r:1 w:1) + /// Proof: MessageQueue ServiceHead (max_values: Some(1), max_size: Some(5), added: 500, mode: MaxEncodedLen) + /// Storage: MessageQueue BookStateFor (r:1 w:0) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + fn bump_service_head() -> Weight { + // Proof Size summary in bytes: + // Measured: `99` + // Estimated: `5007` + // Minimum execution time: 7_200_000 picoseconds. + Weight::from_parts(7_200_000, 0) + .saturating_add(Weight::from_parts(0, 5007)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: MessageQueue BookStateFor (r:1 w:1) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: MessageQueue Pages (r:1 w:1) + /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + fn reap_page() -> Weight { + // Proof Size summary in bytes: + // Measured: `65667` + // Estimated: `72567` + // Minimum execution time: 41_366_000 picoseconds. + Weight::from_parts(41_366_000, 0) + .saturating_add(Weight::from_parts(0, 72567)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: MessageQueue BookStateFor (r:1 w:1) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: MessageQueue Pages (r:1 w:1) + /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + fn execute_overweight_page_removed() -> Weight { + // Proof Size summary in bytes: + // Measured: `65667` + // Estimated: `72567` + // Minimum execution time: 60_538_000 picoseconds. + Weight::from_parts(60_538_000, 0) + .saturating_add(Weight::from_parts(0, 72567)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: MessageQueue BookStateFor (r:1 w:1) + /// Proof: MessageQueue BookStateFor (max_values: None, max_size: Some(52), added: 2527, mode: MaxEncodedLen) + /// Storage: MessageQueue Pages (r:1 w:1) + /// Proof: MessageQueue Pages (max_values: None, max_size: Some(65585), added: 68060, mode: MaxEncodedLen) + fn execute_overweight_page_updated() -> Weight { + // Proof Size summary in bytes: + // Measured: `65667` + // Estimated: `72567` + // Minimum execution time: 73_665_000 picoseconds. + Weight::from_parts(73_665_000, 0) + .saturating_add(Weight::from_parts(0, 72567)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } +} diff --git a/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_multisig.rs b/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_multisig.rs new file mode 100644 index 00000000000..70809dea236 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_multisig.rs @@ -0,0 +1,162 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Autogenerated weights for `pallet_multisig` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("people-polkadot-dev"), DB CACHE: 1024 + +// Executed Command: +// ./artifacts/polkadot-parachain +// benchmark +// pallet +// --chain=people-polkadot-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_multisig +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json +// --header=./file_header.txt +// --output=./cumulus/parachains/runtimes/people/people-polkadot/src/weights/pallet_multisig.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_multisig`. +pub struct WeightInfo(PhantomData); +impl pallet_multisig::WeightInfo for WeightInfo { + /// The range of component `z` is `[0, 10000]`. + fn as_multi_threshold_1(z: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 11_337_000 picoseconds. + Weight::from_parts(11_960_522, 0) + .saturating_add(Weight::from_parts(0, 0)) + // Standard Error: 9 + .saturating_add(Weight::from_parts(504, 0).saturating_mul(z.into())) + } + /// Storage: Multisig Multisigs (r:1 w:1) + /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) + /// The range of component `s` is `[2, 100]`. + /// The range of component `z` is `[0, 10000]`. + fn as_multi_create(s: u32, z: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `263 + s * (2 ±0)` + // Estimated: `6811` + // Minimum execution time: 41_128_000 picoseconds. + Weight::from_parts(35_215_592, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 429 + .saturating_add(Weight::from_parts(65_959, 0).saturating_mul(s.into())) + // Standard Error: 4 + .saturating_add(Weight::from_parts(1_230, 0).saturating_mul(z.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Multisig Multisigs (r:1 w:1) + /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) + /// The range of component `s` is `[3, 100]`. + /// The range of component `z` is `[0, 10000]`. + fn as_multi_approve(s: u32, z: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `282` + // Estimated: `6811` + // Minimum execution time: 26_878_000 picoseconds. + Weight::from_parts(21_448_577, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 354 + .saturating_add(Weight::from_parts(60_286, 0).saturating_mul(s.into())) + // Standard Error: 3 + .saturating_add(Weight::from_parts(1_236, 0).saturating_mul(z.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Multisig Multisigs (r:1 w:1) + /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) + /// Storage: System Account (r:1 w:1) + /// Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + /// The range of component `s` is `[2, 100]`. + /// The range of component `z` is `[0, 10000]`. + fn as_multi_complete(s: u32, z: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `388 + s * (33 ±0)` + // Estimated: `6811` + // Minimum execution time: 45_716_000 picoseconds. + Weight::from_parts(38_332_947, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 554 + .saturating_add(Weight::from_parts(81_026, 0).saturating_mul(s.into())) + // Standard Error: 5 + .saturating_add(Weight::from_parts(1_265, 0).saturating_mul(z.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: Multisig Multisigs (r:1 w:1) + /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) + /// The range of component `s` is `[2, 100]`. + fn approve_as_multi_create(s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `263 + s * (2 ±0)` + // Estimated: `6811` + // Minimum execution time: 32_089_000 picoseconds. + Weight::from_parts(33_664_508, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 487 + .saturating_add(Weight::from_parts(67_443, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Multisig Multisigs (r:1 w:1) + /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) + /// The range of component `s` is `[2, 100]`. + fn approve_as_multi_approve(s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `282` + // Estimated: `6811` + // Minimum execution time: 18_631_000 picoseconds. + Weight::from_parts(19_909_964, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 434 + .saturating_add(Weight::from_parts(62_989, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: Multisig Multisigs (r:1 w:1) + /// Proof: Multisig Multisigs (max_values: None, max_size: Some(3346), added: 5821, mode: MaxEncodedLen) + /// The range of component `s` is `[2, 100]`. + fn cancel_as_multi(s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `454 + s * (1 ±0)` + // Estimated: `6811` + // Minimum execution time: 32_486_000 picoseconds. + Weight::from_parts(34_303_784, 0) + .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 585 + .saturating_add(Weight::from_parts(69_979, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } +} diff --git a/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_session.rs b/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_session.rs new file mode 100644 index 00000000000..872d3f13736 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_session.rs @@ -0,0 +1,78 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Autogenerated weights for `pallet_session` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("people-polkadot-dev"), DB CACHE: 1024 + +// Executed Command: +// ./artifacts/polkadot-parachain +// benchmark +// pallet +// --chain=people-polkadot-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_session +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json +// --header=./file_header.txt +// --output=./cumulus/parachains/runtimes/people/people-polkadot/src/weights/pallet_session.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_session`. +pub struct WeightInfo(PhantomData); +impl pallet_session::WeightInfo for WeightInfo { + /// Storage: Session NextKeys (r:1 w:1) + /// Proof Skipped: Session NextKeys (max_values: None, max_size: None, mode: Measured) + /// Storage: Session KeyOwner (r:1 w:1) + /// Proof Skipped: Session KeyOwner (max_values: None, max_size: None, mode: Measured) + fn set_keys() -> Weight { + // Proof Size summary in bytes: + // Measured: `297` + // Estimated: `3762` + // Minimum execution time: 17_353_000 picoseconds. + Weight::from_parts(18_005_000, 0) + .saturating_add(Weight::from_parts(0, 3762)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: Session NextKeys (r:1 w:1) + /// Proof Skipped: Session NextKeys (max_values: None, max_size: None, mode: Measured) + /// Storage: Session KeyOwner (r:0 w:1) + /// Proof Skipped: Session KeyOwner (max_values: None, max_size: None, mode: Measured) + fn purge_keys() -> Weight { + // Proof Size summary in bytes: + // Measured: `279` + // Estimated: `3744` + // Minimum execution time: 13_039_000 picoseconds. + Weight::from_parts(13_341_000, 0) + .saturating_add(Weight::from_parts(0, 3744)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(2)) + } +} diff --git a/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_timestamp.rs b/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_timestamp.rs new file mode 100644 index 00000000000..2eb3173099d --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_timestamp.rs @@ -0,0 +1,72 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Autogenerated weights for `pallet_timestamp` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("people-polkadot-dev"), DB CACHE: 1024 + +// Executed Command: +// ./artifacts/polkadot-parachain +// benchmark +// pallet +// --chain=people-polkadot-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_timestamp +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json +// --header=./file_header.txt +// --output=./cumulus/parachains/runtimes/people/people-polkadot/src/weights/pallet_timestamp.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_timestamp`. +pub struct WeightInfo(PhantomData); +impl pallet_timestamp::WeightInfo for WeightInfo { + /// Storage: Timestamp Now (r:1 w:1) + /// Proof: Timestamp Now (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + /// Storage: Aura CurrentSlot (r:1 w:0) + /// Proof: Aura CurrentSlot (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) + fn set() -> Weight { + // Proof Size summary in bytes: + // Measured: `49` + // Estimated: `1493` + // Minimum execution time: 7_986_000 picoseconds. + Weight::from_parts(8_134_000, 0) + .saturating_add(Weight::from_parts(0, 1493)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + fn on_finalize() -> Weight { + // Proof Size summary in bytes: + // Measured: `57` + // Estimated: `0` + // Minimum execution time: 3_257_000 picoseconds. + Weight::from_parts(3_366_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } +} diff --git a/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_utility.rs b/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_utility.rs new file mode 100644 index 00000000000..782b0ad6de8 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_utility.rs @@ -0,0 +1,99 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Autogenerated weights for `pallet_utility` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("people-polkadot-dev"), DB CACHE: 1024 + +// Executed Command: +// ./artifacts/polkadot-parachain +// benchmark +// pallet +// --chain=people-polkadot-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_utility +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json +// --header=./file_header.txt +// --output=./cumulus/parachains/runtimes/people/people-polkadot/src/weights/pallet_utility.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_utility`. +pub struct WeightInfo(PhantomData); +impl pallet_utility::WeightInfo for WeightInfo { + /// The range of component `c` is `[0, 1000]`. + fn batch(c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 6_697_000 picoseconds. + Weight::from_parts(11_859_145, 0) + .saturating_add(Weight::from_parts(0, 0)) + // Standard Error: 3_146 + .saturating_add(Weight::from_parts(4_300_555, 0).saturating_mul(c.into())) + } + fn as_derivative() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 4_979_000 picoseconds. + Weight::from_parts(5_066_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + /// The range of component `c` is `[0, 1000]`. + fn batch_all(c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 6_741_000 picoseconds. + Weight::from_parts(15_928_547, 0) + .saturating_add(Weight::from_parts(0, 0)) + // Standard Error: 3_310 + .saturating_add(Weight::from_parts(4_527_996, 0).saturating_mul(c.into())) + } + fn dispatch_as() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 8_717_000 picoseconds. + Weight::from_parts(8_909_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + /// The range of component `c` is `[0, 1000]`. + fn force_batch(c: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 6_814_000 picoseconds. + Weight::from_parts(13_920_831, 0) + .saturating_add(Weight::from_parts(0, 0)) + // Standard Error: 7_605 + .saturating_add(Weight::from_parts(4_306_193, 0).saturating_mul(c.into())) + } +} diff --git a/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_xcm.rs b/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_xcm.rs new file mode 100644 index 00000000000..d3b60471b85 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_xcm.rs @@ -0,0 +1,342 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Autogenerated weights for `pallet_xcm` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("people-polkadot-dev"), DB CACHE: 1024 + +// Executed Command: +// ./artifacts/polkadot-parachain +// benchmark +// pallet +// --chain=people-polkadot-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_xcm +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json +// --header=./file_header.txt +// --output=./cumulus/parachains/runtimes/people/people-polkadot/src/weights/pallet_xcm.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `pallet_xcm`. +pub struct WeightInfo(PhantomData); +impl pallet_xcm::WeightInfo for WeightInfo { + /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem HostConfiguration (r:1 w:0) + /// Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + fn send() -> Weight { + // Proof Size summary in bytes: + // Measured: `38` + // Estimated: `3503` + // Minimum execution time: 25_783_000 picoseconds. + Weight::from_parts(26_398_000, 0) + .saturating_add(Weight::from_parts(0, 3503)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: ParachainInfo ParachainId (r:1 w:0) + /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + fn teleport_assets() -> Weight { + // Proof Size summary in bytes: + // Measured: `32` + // Estimated: `1489` + // Minimum execution time: 25_511_000 picoseconds. + Weight::from_parts(26_120_000, 0) + .saturating_add(Weight::from_parts(0, 1489)) + .saturating_add(T::DbWeight::get().reads(1)) + } + /// Storage: Benchmark Override (r:0 w:0) + /// Proof Skipped: Benchmark Override (max_values: None, max_size: None, mode: Measured) + fn reserve_transfer_assets() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. + Weight::from_parts(18_446_744_073_709_551_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + /// Storage: `ParachainInfo::ParachainId` (r:1 w:0) + /// Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + /// Storage: `Assets::Asset` (r:1 w:1) + /// Proof: `Assets::Asset` (`max_values`: None, `max_size`: Some(210), added: 2685, mode: `MaxEncodedLen`) + /// Storage: `Assets::Account` (r:2 w:2) + /// Proof: `Assets::Account` (`max_values`: None, `max_size`: Some(134), added: 2609, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:2 w:2) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) + /// Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) + /// Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) + /// Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) + /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + fn transfer_assets() -> Weight { + // Proof Size summary in bytes: + // Measured: `496` + // Estimated: `6208` + // Minimum execution time: 146_932_000 picoseconds. + Weight::from_parts(153_200_000, 0) + .saturating_add(Weight::from_parts(0, 6208)) + .saturating_add(T::DbWeight::get().reads(12)) + .saturating_add(T::DbWeight::get().writes(7)) + } + /// Storage: Benchmark Override (r:0 w:0) + /// Proof Skipped: Benchmark Override (max_values: None, max_size: None, mode: Measured) + fn execute() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. + Weight::from_parts(18_446_744_073_709_551_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + } + /// Storage: PolkadotXcm SupportedVersion (r:0 w:1) + /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + fn force_xcm_version() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 9_707_000 picoseconds. + Weight::from_parts(9_874_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: PolkadotXcm SafeXcmVersion (r:0 w:1) + /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + fn force_default_xcm_version() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 3_073_000 picoseconds. + Weight::from_parts(3_183_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: PolkadotXcm VersionNotifiers (r:1 w:1) + /// Proof Skipped: PolkadotXcm VersionNotifiers (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm QueryCounter (r:1 w:1) + /// Proof Skipped: PolkadotXcm QueryCounter (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem HostConfiguration (r:1 w:0) + /// Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: PolkadotXcm Queries (r:0 w:1) + /// Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) + fn force_subscribe_version_notify() -> Weight { + // Proof Size summary in bytes: + // Measured: `38` + // Estimated: `3503` + // Minimum execution time: 30_999_000 picoseconds. + Weight::from_parts(31_641_000, 0) + .saturating_add(Weight::from_parts(0, 3503)) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(5)) + } + /// Storage: PolkadotXcm VersionNotifiers (r:1 w:1) + /// Proof Skipped: PolkadotXcm VersionNotifiers (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem HostConfiguration (r:1 w:0) + /// Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: PolkadotXcm Queries (r:0 w:1) + /// Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) + fn force_unsubscribe_version_notify() -> Weight { + // Proof Size summary in bytes: + // Measured: `220` + // Estimated: `3685` + // Minimum execution time: 33_036_000 picoseconds. + Weight::from_parts(33_596_000, 0) + .saturating_add(Weight::from_parts(0, 3685)) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(4)) + } + /// Storage: PolkadotXcm XcmExecutionSuspended (r:0 w:1) + /// Proof Skipped: PolkadotXcm XcmExecutionSuspended (max_values: Some(1), max_size: None, mode: Measured) + fn force_suspension() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 3_035_000 picoseconds. + Weight::from_parts(3_154_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: PolkadotXcm SupportedVersion (r:4 w:2) + /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + fn migrate_supported_version() -> Weight { + // Proof Size summary in bytes: + // Measured: `95` + // Estimated: `10985` + // Minimum execution time: 14_805_000 picoseconds. + Weight::from_parts(15_120_000, 0) + .saturating_add(Weight::from_parts(0, 10985)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: PolkadotXcm VersionNotifiers (r:4 w:2) + /// Proof Skipped: PolkadotXcm VersionNotifiers (max_values: None, max_size: None, mode: Measured) + fn migrate_version_notifiers() -> Weight { + // Proof Size summary in bytes: + // Measured: `99` + // Estimated: `10989` + // Minimum execution time: 14_572_000 picoseconds. + Weight::from_parts(14_909_000, 0) + .saturating_add(Weight::from_parts(0, 10989)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: PolkadotXcm VersionNotifyTargets (r:5 w:0) + /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) + fn already_notified_target() -> Weight { + // Proof Size summary in bytes: + // Measured: `106` + // Estimated: `13471` + // Minimum execution time: 15_341_000 picoseconds. + Weight::from_parts(15_708_000, 0) + .saturating_add(Weight::from_parts(0, 13471)) + .saturating_add(T::DbWeight::get().reads(5)) + } + /// Storage: PolkadotXcm VersionNotifyTargets (r:2 w:1) + /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem HostConfiguration (r:1 w:0) + /// Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + fn notify_current_targets() -> Weight { + // Proof Size summary in bytes: + // Measured: `106` + // Estimated: `6046` + // Minimum execution time: 27_840_000 picoseconds. + Weight::from_parts(28_248_000, 0) + .saturating_add(Weight::from_parts(0, 6046)) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: PolkadotXcm VersionNotifyTargets (r:3 w:0) + /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) + fn notify_target_migration_fail() -> Weight { + // Proof Size summary in bytes: + // Measured: `136` + // Estimated: `8551` + // Minimum execution time: 8_245_000 picoseconds. + Weight::from_parts(8_523_000, 0) + .saturating_add(Weight::from_parts(0, 8551)) + .saturating_add(T::DbWeight::get().reads(3)) + } + /// Storage: PolkadotXcm VersionNotifyTargets (r:4 w:2) + /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) + fn migrate_version_notify_targets() -> Weight { + // Proof Size summary in bytes: + // Measured: `106` + // Estimated: `10996` + // Minimum execution time: 14_780_000 picoseconds. + Weight::from_parts(15_173_000, 0) + .saturating_add(Weight::from_parts(0, 10996)) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: PolkadotXcm VersionNotifyTargets (r:4 w:2) + /// Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm SupportedVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + /// Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + /// Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + /// Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem HostConfiguration (r:1 w:0) + /// Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + /// Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + /// Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + fn migrate_and_notify_old_targets() -> Weight { + // Proof Size summary in bytes: + // Measured: `112` + // Estimated: `11002` + // Minimum execution time: 33_422_000 picoseconds. + Weight::from_parts(34_076_000, 0) + .saturating_add(Weight::from_parts(0, 11002)) + .saturating_add(T::DbWeight::get().reads(9)) + .saturating_add(T::DbWeight::get().writes(4)) + } + /// Storage: `PolkadotXcm::QueryCounter` (r:1 w:1) + /// Proof: `PolkadotXcm::QueryCounter` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `PolkadotXcm::Queries` (r:0 w:1) + /// Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn new_query() -> Weight { + // Proof Size summary in bytes: + // Measured: `103` + // Estimated: `1588` + // Minimum execution time: 5_496_000 picoseconds. + Weight::from_parts(5_652_000, 0) + .saturating_add(Weight::from_parts(0, 1588)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(2)) + } + /// Storage: `PolkadotXcm::Queries` (r:1 w:1) + /// Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn take_response() -> Weight { + // Proof Size summary in bytes: + // Measured: `7740` + // Estimated: `11205` + // Minimum execution time: 26_140_000 picoseconds. + Weight::from_parts(26_824_000, 0) + .saturating_add(Weight::from_parts(0, 11205)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } +} diff --git a/cumulus/parachains/runtimes/people/people-westend/src/weights/paritydb_weights.rs b/cumulus/parachains/runtimes/people/people-westend/src/weights/paritydb_weights.rs new file mode 100644 index 00000000000..2699f3abbb1 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-westend/src/weights/paritydb_weights.rs @@ -0,0 +1,61 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +pub mod constants { + use frame_support::{ + parameter_types, + weights::{constants, RuntimeDbWeight}, + }; + + parameter_types! { + /// `ParityDB` can be enabled with a feature flag, but is still experimental. These weights + /// are available for brave runtime engineers who may want to try this out as default. + pub const ParityDbWeight: RuntimeDbWeight = RuntimeDbWeight { + read: 8_000 * constants::WEIGHT_REF_TIME_PER_NANOS, + write: 50_000 * constants::WEIGHT_REF_TIME_PER_NANOS, + }; + } + + #[cfg(test)] + mod test_db_weights { + use super::constants::ParityDbWeight as W; + use frame_support::weights::constants; + + /// Checks that all weights exist and have sane values. + // NOTE: If this test fails but you are sure that the generated values are fine, + // you can delete it. + #[test] + fn sane() { + // At least 1 µs. + assert!( + W::get().reads(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, + "Read weight should be at least 1 µs." + ); + assert!( + W::get().writes(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, + "Write weight should be at least 1 µs." + ); + // At most 1 ms. + assert!( + W::get().reads(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, + "Read weight should be at most 1 ms." + ); + assert!( + W::get().writes(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, + "Write weight should be at most 1 ms." + ); + } + } +} diff --git a/cumulus/parachains/runtimes/people/people-westend/src/weights/polkadot_runtime_common_identity_migrator.rs b/cumulus/parachains/runtimes/people/people-westend/src/weights/polkadot_runtime_common_identity_migrator.rs new file mode 100644 index 00000000000..4449c8f2b02 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-westend/src/weights/polkadot_runtime_common_identity_migrator.rs @@ -0,0 +1,97 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Autogenerated weights for `polkadot_runtime_common::identity_migrator` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-11-07, STEPS: `2`, REPEAT: `1`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `sbtb`, CPU: `13th Gen Intel(R) Core(TM) i7-1365U` +//! WASM-EXECUTION: `Compiled`, CHAIN: `Some("rococo-dev")`, DB CACHE: 1024 + +// Executed Command: +// ./target/release/polkadot +// benchmark +// pallet +// --chain=rococo-dev +// --steps=2 +// --repeat=1 +// --pallet=polkadot_runtime_common::identity_migrator +// --extrinsic=* +// --output=./migrator-release.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] +#![allow(missing_docs)] + +use frame_support::{traits::Get, weights::Weight}; +use core::marker::PhantomData; + +/// Weight functions for `polkadot_runtime_common::identity_migrator`. +pub struct WeightInfo(PhantomData); +impl polkadot_runtime_common::identity_migrator::WeightInfo for WeightInfo { + /// Storage: `Identity::IdentityOf` (r:1 w:1) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7538), added: 10013, mode: `MaxEncodedLen`) + /// Storage: `Identity::SubsOf` (r:1 w:1) + /// Proof: `Identity::SubsOf` (`max_values`: None, `max_size`: Some(3258), added: 5733, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:2 w:2) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Dmp::DeliveryFeeFactor` (r:1 w:0) + /// Proof: `Dmp::DeliveryFeeFactor` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `XcmPallet::SupportedVersion` (r:1 w:0) + /// Proof: `XcmPallet::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueues` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueues` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Dmp::DownwardMessageQueueHeads` (r:1 w:1) + /// Proof: `Dmp::DownwardMessageQueueHeads` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Identity::SuperOf` (r:0 w:100) + /// Proof: `Identity::SuperOf` (`max_values`: None, `max_size`: Some(114), added: 2589, mode: `MaxEncodedLen`) + /// The range of component `r` is `[0, 20]`. + /// The range of component `s` is `[0, 100]`. + fn reap_identity(r: u32, s: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `7292 + r * (8 ±0) + s * (32 ±0)` + // Estimated: `11003 + r * (8 ±0) + s * (33 ±0)` + // Minimum execution time: 163_756_000 picoseconds. + Weight::from_parts(158_982_500, 0) + .saturating_add(Weight::from_parts(0, 11003)) + // Standard Error: 1_143_629 + .saturating_add(Weight::from_parts(238_675, 0).saturating_mul(r.into())) + // Standard Error: 228_725 + .saturating_add(Weight::from_parts(1_529_645, 0).saturating_mul(s.into())) + .saturating_add(T::DbWeight::get().reads(8)) + .saturating_add(T::DbWeight::get().writes(5)) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(s.into()))) + .saturating_add(Weight::from_parts(0, 8).saturating_mul(r.into())) + .saturating_add(Weight::from_parts(0, 33).saturating_mul(s.into())) + } + /// Storage: `Identity::IdentityOf` (r:1 w:1) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7538), added: 10013, mode: `MaxEncodedLen`) + /// Storage: `System::Account` (r:1 w:1) + /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) + /// Storage: `Identity::SubsOf` (r:1 w:1) + /// Proof: `Identity::SubsOf` (`max_values`: None, `max_size`: Some(3258), added: 5733, mode: `MaxEncodedLen`) + fn poke_deposit() -> Weight { + // Proof Size summary in bytes: + // Measured: `7229` + // Estimated: `11003` + // Minimum execution time: 137_570_000 picoseconds. + Weight::from_parts(137_570_000, 0) + .saturating_add(Weight::from_parts(0, 11003)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(3)) + } +} diff --git a/cumulus/parachains/runtimes/people/people-westend/src/weights/rocksdb_weights.rs b/cumulus/parachains/runtimes/people/people-westend/src/weights/rocksdb_weights.rs new file mode 100644 index 00000000000..61b48fb2350 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-westend/src/weights/rocksdb_weights.rs @@ -0,0 +1,61 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +pub mod constants { + use frame_support::{ + parameter_types, + weights::{constants, RuntimeDbWeight}, + }; + + parameter_types! { + /// By default, Substrate uses `RocksDB`, so this will be the weight used throughout + /// the runtime. + pub const RocksDbWeight: RuntimeDbWeight = RuntimeDbWeight { + read: 25_000 * constants::WEIGHT_REF_TIME_PER_NANOS, + write: 100_000 * constants::WEIGHT_REF_TIME_PER_NANOS, + }; + } + + #[cfg(test)] + mod test_db_weights { + use super::constants::RocksDbWeight as W; + use frame_support::weights::constants; + + /// Checks that all weights exist and have sane values. + // NOTE: If this test fails but you are sure that the generated values are fine, + // you can delete it. + #[test] + fn sane() { + // At least 1 µs. + assert!( + W::get().reads(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, + "Read weight should be at least 1 µs." + ); + assert!( + W::get().writes(1).ref_time() >= constants::WEIGHT_REF_TIME_PER_MICROS, + "Write weight should be at least 1 µs." + ); + // At most 1 ms. + assert!( + W::get().reads(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, + "Read weight should be at most 1 ms." + ); + assert!( + W::get().writes(1).ref_time() <= constants::WEIGHT_REF_TIME_PER_MILLIS, + "Write weight should be at most 1 ms." + ); + } + } +} diff --git a/cumulus/parachains/runtimes/people/people-westend/src/weights/xcm/mod.rs b/cumulus/parachains/runtimes/people/people-westend/src/weights/xcm/mod.rs new file mode 100644 index 00000000000..5d6f90e9f1b --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-westend/src/weights/xcm/mod.rs @@ -0,0 +1,252 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +mod pallet_xcm_benchmarks_fungible; +mod pallet_xcm_benchmarks_generic; + +use crate::{xcm_config::MaxAssetsIntoHolding, Runtime}; +use frame_support::weights::Weight; +use pallet_xcm_benchmarks_fungible::WeightInfo as XcmFungibleWeight; +use pallet_xcm_benchmarks_generic::WeightInfo as XcmGeneric; +use sp_std::prelude::*; +use xcm::{latest::prelude::*, DoubleEncoded}; + +trait WeighMultiAssets { + fn weigh_multi_assets(&self, weight: Weight) -> Weight; +} + +const MAX_ASSETS: u64 = 100; + +impl WeighMultiAssets for MultiAssetFilter { + fn weigh_multi_assets(&self, weight: Weight) -> Weight { + match self { + Self::Definite(assets) => weight.saturating_mul(assets.inner().iter().count() as u64), + Self::Wild(asset) => match asset { + All => weight.saturating_mul(MAX_ASSETS), + AllOf { fun, .. } => match fun { + WildFungibility::Fungible => weight, + // Magic number 2 has to do with the fact that we could have up to 2 times + // MaxAssetsIntoHolding in the worst-case scenario. + WildFungibility::NonFungible => + weight.saturating_mul((MaxAssetsIntoHolding::get() * 2) as u64), + }, + AllCounted(count) => weight.saturating_mul(MAX_ASSETS.min(*count as u64)), + AllOfCounted { count, .. } => weight.saturating_mul(MAX_ASSETS.min(*count as u64)), + }, + } + } +} + +impl WeighMultiAssets for MultiAssets { + fn weigh_multi_assets(&self, weight: Weight) -> Weight { + weight.saturating_mul(self.inner().iter().count() as u64) + } +} + +pub struct PeopleWestendXcmWeight(core::marker::PhantomData); +impl XcmWeightInfo for PeopleWestendXcmWeight { + fn withdraw_asset(assets: &MultiAssets) -> Weight { + assets.weigh_multi_assets(XcmFungibleWeight::::withdraw_asset()) + } + // Currently there is no trusted reserve + fn reserve_asset_deposited(_assets: &MultiAssets) -> Weight { + // TODO: hardcoded - fix https://github.com/paritytech/cumulus/issues/1974 + Weight::from_parts(1_000_000_000_u64, 0) + } + fn receive_teleported_asset(assets: &MultiAssets) -> Weight { + assets.weigh_multi_assets(XcmFungibleWeight::::receive_teleported_asset()) + } + fn query_response( + _query_id: &u64, + _response: &Response, + _max_weight: &Weight, + _querier: &Option, + ) -> Weight { + XcmGeneric::::query_response() + } + fn transfer_asset(assets: &MultiAssets, _dest: &MultiLocation) -> Weight { + assets.weigh_multi_assets(XcmFungibleWeight::::transfer_asset()) + } + fn transfer_reserve_asset( + assets: &MultiAssets, + _dest: &MultiLocation, + _xcm: &Xcm<()>, + ) -> Weight { + assets.weigh_multi_assets(XcmFungibleWeight::::transfer_reserve_asset()) + } + fn transact( + _origin_type: &OriginKind, + _require_weight_at_most: &Weight, + _call: &DoubleEncoded, + ) -> Weight { + XcmGeneric::::transact() + } + fn hrmp_new_channel_open_request( + _sender: &u32, + _max_message_size: &u32, + _max_capacity: &u32, + ) -> Weight { + // XCM Executor does not currently support HRMP channel operations + Weight::MAX + } + fn hrmp_channel_accepted(_recipient: &u32) -> Weight { + // XCM Executor does not currently support HRMP channel operations + Weight::MAX + } + fn hrmp_channel_closing(_initiator: &u32, _sender: &u32, _recipient: &u32) -> Weight { + // XCM Executor does not currently support HRMP channel operations + Weight::MAX + } + fn clear_origin() -> Weight { + XcmGeneric::::clear_origin() + } + fn descend_origin(_who: &InteriorMultiLocation) -> Weight { + XcmGeneric::::descend_origin() + } + fn report_error(_query_response_info: &QueryResponseInfo) -> Weight { + XcmGeneric::::report_error() + } + + fn deposit_asset(assets: &MultiAssetFilter, _dest: &MultiLocation) -> Weight { + // Hardcoded till the XCM pallet is fixed + let hardcoded_weight = Weight::from_parts(1_000_000_000_u64, 0); + let weight = assets.weigh_multi_assets(XcmFungibleWeight::::deposit_asset()); + hardcoded_weight.min(weight) + } + fn deposit_reserve_asset( + assets: &MultiAssetFilter, + _dest: &MultiLocation, + _xcm: &Xcm<()>, + ) -> Weight { + assets.weigh_multi_assets(XcmFungibleWeight::::deposit_reserve_asset()) + } + fn exchange_asset(_give: &MultiAssetFilter, _receive: &MultiAssets, _maximal: &bool) -> Weight { + Weight::MAX + } + fn initiate_reserve_withdraw( + assets: &MultiAssetFilter, + _reserve: &MultiLocation, + _xcm: &Xcm<()>, + ) -> Weight { + assets.weigh_multi_assets(XcmGeneric::::initiate_reserve_withdraw()) + } + fn initiate_teleport( + assets: &MultiAssetFilter, + _dest: &MultiLocation, + _xcm: &Xcm<()>, + ) -> Weight { + // Hardcoded till the XCM pallet is fixed + let hardcoded_weight = Weight::from_parts(200_000_000_u64, 0); + let weight = assets.weigh_multi_assets(XcmFungibleWeight::::initiate_teleport()); + hardcoded_weight.min(weight) + } + fn report_holding(_response_info: &QueryResponseInfo, _assets: &MultiAssetFilter) -> Weight { + XcmGeneric::::report_holding() + } + fn buy_execution(_fees: &MultiAsset, _weight_limit: &WeightLimit) -> Weight { + XcmGeneric::::buy_execution() + } + fn refund_surplus() -> Weight { + XcmGeneric::::refund_surplus() + } + fn set_error_handler(_xcm: &Xcm) -> Weight { + XcmGeneric::::set_error_handler() + } + fn set_appendix(_xcm: &Xcm) -> Weight { + XcmGeneric::::set_appendix() + } + fn clear_error() -> Weight { + XcmGeneric::::clear_error() + } + fn claim_asset(_assets: &MultiAssets, _ticket: &MultiLocation) -> Weight { + XcmGeneric::::claim_asset() + } + fn trap(_code: &u64) -> Weight { + XcmGeneric::::trap() + } + fn subscribe_version(_query_id: &QueryId, _max_response_weight: &Weight) -> Weight { + XcmGeneric::::subscribe_version() + } + fn unsubscribe_version() -> Weight { + XcmGeneric::::unsubscribe_version() + } + fn burn_asset(assets: &MultiAssets) -> Weight { + assets.weigh_multi_assets(XcmGeneric::::burn_asset()) + } + fn expect_asset(assets: &MultiAssets) -> Weight { + assets.weigh_multi_assets(XcmGeneric::::expect_asset()) + } + fn expect_origin(_origin: &Option) -> Weight { + XcmGeneric::::expect_origin() + } + fn expect_error(_error: &Option<(u32, XcmError)>) -> Weight { + XcmGeneric::::expect_error() + } + fn expect_transact_status(_transact_status: &MaybeErrorCode) -> Weight { + XcmGeneric::::expect_transact_status() + } + fn query_pallet(_module_name: &Vec, _response_info: &QueryResponseInfo) -> Weight { + XcmGeneric::::query_pallet() + } + fn expect_pallet( + _index: &u32, + _name: &Vec, + _module_name: &Vec, + _crate_major: &u32, + _min_crate_minor: &u32, + ) -> Weight { + XcmGeneric::::expect_pallet() + } + fn report_transact_status(_response_info: &QueryResponseInfo) -> Weight { + XcmGeneric::::report_transact_status() + } + fn clear_transact_status() -> Weight { + XcmGeneric::::clear_transact_status() + } + fn universal_origin(_: &Junction) -> Weight { + Weight::MAX + } + fn export_message(_: &NetworkId, _: &Junctions, _: &Xcm<()>) -> Weight { + Weight::MAX + } + fn lock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { + Weight::MAX + } + fn unlock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { + Weight::MAX + } + fn note_unlockable(_: &MultiAsset, _: &MultiLocation) -> Weight { + Weight::MAX + } + fn request_unlock(_: &MultiAsset, _: &MultiLocation) -> Weight { + Weight::MAX + } + fn set_fees_mode(_: &bool) -> Weight { + XcmGeneric::::set_fees_mode() + } + fn set_topic(_topic: &[u8; 32]) -> Weight { + XcmGeneric::::set_topic() + } + fn clear_topic() -> Weight { + XcmGeneric::::clear_topic() + } + fn alias_origin(_: &MultiLocation) -> Weight { + // XCM Executor does not currently support alias origin operations + Weight::MAX + } + fn unpaid_execution(_: &WeightLimit, _: &Option) -> Weight { + XcmGeneric::::unpaid_execution() + } +} diff --git a/cumulus/parachains/runtimes/people/people-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/cumulus/parachains/runtimes/people/people-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs new file mode 100644 index 00000000000..efffd318817 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-westend/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs @@ -0,0 +1,157 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Autogenerated weights for `pallet_xcm_benchmarks::fungible` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("people-polkadot-dev"), DB CACHE: 1024 + +// Executed Command: +// ./artifacts/polkadot-parachain +// benchmark +// pallet +// --template=./templates/xcm-bench-template.hbs +// --chain=people-polkadot-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_xcm_benchmarks::fungible +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json +// --header=./file_header.txt +// --output=./cumulus/parachains/runtimes/people/people-polkadot/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weights for `pallet_xcm_benchmarks::fungible`. +pub struct WeightInfo(PhantomData); +impl WeightInfo { + // Storage: System Account (r:1 w:1) + // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + pub fn withdraw_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `101` + // Estimated: `3593` + // Minimum execution time: 23_363_000 picoseconds. + Weight::from_parts(23_663_000, 3593) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + // Storage: System Account (r:2 w:2) + // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + pub fn transfer_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `153` + // Estimated: `6196` + // Minimum execution time: 49_093_000 picoseconds. + Weight::from_parts(49_719_000, 6196) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(2)) + } + // Storage: System Account (r:2 w:2) + // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + // Storage: ParachainInfo ParachainId (r:1 w:0) + // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: PolkadotXcm SupportedVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + // Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + // Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem HostConfiguration (r:1 w:0) + // Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + pub fn transfer_reserve_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `223` + // Estimated: `6196` + // Minimum execution time: 74_134_000 picoseconds. + Weight::from_parts(74_719_000, 6196) + .saturating_add(T::DbWeight::get().reads(8)) + .saturating_add(T::DbWeight::get().writes(4)) + } + pub fn receive_teleported_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 3_726_000 picoseconds. + Weight::from_parts(3_881_000, 0) + } + // Storage: System Account (r:1 w:1) + // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + pub fn deposit_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `52` + // Estimated: `3593` + // Minimum execution time: 25_903_000 picoseconds. + Weight::from_parts(26_150_000, 3593) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + // Storage: System Account (r:1 w:1) + // Proof: System Account (max_values: None, max_size: Some(128), added: 2603, mode: MaxEncodedLen) + // Storage: ParachainInfo ParachainId (r:1 w:0) + // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: PolkadotXcm SupportedVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + // Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + // Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem HostConfiguration (r:1 w:0) + // Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + pub fn deposit_reserve_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `122` + // Estimated: `3593` + // Minimum execution time: 51_084_000 picoseconds. + Weight::from_parts(51_859_000, 3593) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) + } + // Storage: ParachainInfo ParachainId (r:1 w:0) + // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: PolkadotXcm SupportedVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + // Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + // Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem HostConfiguration (r:1 w:0) + // Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + pub fn initiate_teleport() -> Weight { + // Proof Size summary in bytes: + // Measured: `70` + // Estimated: `3535` + // Minimum execution time: 28_038_000 picoseconds. + Weight::from_parts(28_438_000, 3535) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(2)) + } +} diff --git a/cumulus/parachains/runtimes/people/people-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/cumulus/parachains/runtimes/people/people-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs new file mode 100644 index 00000000000..d7b10f95c79 --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-westend/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -0,0 +1,347 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Autogenerated weights for `pallet_xcm_benchmarks::generic` +//! +//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev +//! DATE: 2023-05-31, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! WORST CASE MAP SIZE: `1000000` +//! HOSTNAME: `bm4`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("people-polkadot-dev"), DB CACHE: 1024 + +// Executed Command: +// ./artifacts/polkadot-parachain +// benchmark +// pallet +// --template=./templates/xcm-bench-template.hbs +// --chain=people-polkadot-dev +// --execution=wasm +// --wasm-execution=compiled +// --pallet=pallet_xcm_benchmarks::generic +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json +// --header=./file_header.txt +// --output=./cumulus/parachains/runtimes/people/people-polkadot/src/weights/xcm/pallet_xcm_benchmarks_generic.rs + +#![cfg_attr(rustfmt, rustfmt_skip)] +#![allow(unused_parens)] +#![allow(unused_imports)] + +use frame_support::{traits::Get, weights::Weight}; +use sp_std::marker::PhantomData; + +/// Weights for `pallet_xcm_benchmarks::generic`. +pub struct WeightInfo(PhantomData); +impl WeightInfo { + // Storage: ParachainInfo ParachainId (r:1 w:0) + // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: PolkadotXcm SupportedVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + // Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + // Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem HostConfiguration (r:1 w:0) + // Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + pub fn report_holding() -> Weight { + // Proof Size summary in bytes: + // Measured: `70` + // Estimated: `3535` + // Minimum execution time: 30_819_000 picoseconds. + Weight::from_parts(31_157_000, 3535) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(2)) + } + pub fn buy_execution() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_869_000 picoseconds. + Weight::from_parts(2_920_000, 0) + } + // Storage: PolkadotXcm Queries (r:1 w:0) + // Proof Skipped: PolkadotXcm Queries (max_values: None, max_size: None, mode: Measured) + pub fn query_response() -> Weight { + // Proof Size summary in bytes: + // Measured: `32` + // Estimated: `3497` + // Minimum execution time: 10_268_000 picoseconds. + Weight::from_parts(10_496_000, 3497) + .saturating_add(T::DbWeight::get().reads(1)) + } + pub fn transact() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 11_990_000 picoseconds. + Weight::from_parts(12_206_000, 0) + } + pub fn refund_surplus() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 3_170_000 picoseconds. + Weight::from_parts(3_308_000, 0) + } + pub fn set_error_handler() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_650_000 picoseconds. + Weight::from_parts(2_783_000, 0) + } + pub fn set_appendix() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_681_000 picoseconds. + Weight::from_parts(2_829_000, 0) + } + pub fn clear_error() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_622_000 picoseconds. + Weight::from_parts(2_688_000, 0) + } + pub fn descend_origin() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 3_385_000 picoseconds. + Weight::from_parts(3_538_000, 0) + } + pub fn clear_origin() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_630_000 picoseconds. + Weight::from_parts(2_720_000, 0) + } + // Storage: ParachainInfo ParachainId (r:1 w:0) + // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: PolkadotXcm SupportedVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + // Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + // Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem HostConfiguration (r:1 w:0) + // Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + pub fn report_error() -> Weight { + // Proof Size summary in bytes: + // Measured: `70` + // Estimated: `3535` + // Minimum execution time: 24_446_000 picoseconds. + Weight::from_parts(24_854_000, 3535) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(2)) + } + // Storage: PolkadotXcm AssetTraps (r:1 w:1) + // Proof Skipped: PolkadotXcm AssetTraps (max_values: None, max_size: None, mode: Measured) + pub fn claim_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `90` + // Estimated: `3555` + // Minimum execution time: 14_713_000 picoseconds. + Weight::from_parts(15_010_000, 3555) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + pub fn trap() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_702_000 picoseconds. + Weight::from_parts(2_744_000, 0) + } + // Storage: PolkadotXcm VersionNotifyTargets (r:1 w:1) + // Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) + // Storage: PolkadotXcm SupportedVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + // Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + // Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem HostConfiguration (r:1 w:0) + // Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + pub fn subscribe_version() -> Weight { + // Proof Size summary in bytes: + // Measured: `38` + // Estimated: `3503` + // Minimum execution time: 25_955_000 picoseconds. + Weight::from_parts(26_632_000, 3503) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(3)) + } + // Storage: PolkadotXcm VersionNotifyTargets (r:0 w:1) + // Proof Skipped: PolkadotXcm VersionNotifyTargets (max_values: None, max_size: None, mode: Measured) + pub fn unsubscribe_version() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 4_965_000 picoseconds. + Weight::from_parts(5_168_000, 0) + .saturating_add(T::DbWeight::get().writes(1)) + } + // Storage: ParachainInfo ParachainId (r:1 w:0) + // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: PolkadotXcm SupportedVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + // Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + // Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem HostConfiguration (r:1 w:0) + // Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + pub fn initiate_reserve_withdraw() -> Weight { + // Proof Size summary in bytes: + // Measured: `70` + // Estimated: `3535` + // Minimum execution time: 27_707_000 picoseconds. + Weight::from_parts(28_081_000, 3535) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(2)) + } + pub fn burn_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 4_215_000 picoseconds. + Weight::from_parts(4_362_000, 0) + } + pub fn expect_asset() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_843_000 picoseconds. + Weight::from_parts(2_957_000, 0) + } + pub fn expect_origin() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_751_000 picoseconds. + Weight::from_parts(2_809_000, 0) + } + pub fn expect_error() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_674_000 picoseconds. + Weight::from_parts(2_737_000, 0) + } + pub fn expect_transact_status() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_891_000 picoseconds. + Weight::from_parts(2_952_000, 0) + } + // Storage: ParachainInfo ParachainId (r:1 w:0) + // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: PolkadotXcm SupportedVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + // Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + // Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem HostConfiguration (r:1 w:0) + // Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + pub fn query_pallet() -> Weight { + // Proof Size summary in bytes: + // Measured: `70` + // Estimated: `3535` + // Minimum execution time: 28_600_000 picoseconds. + Weight::from_parts(29_001_000, 3535) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(2)) + } + pub fn expect_pallet() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 4_748_000 picoseconds. + Weight::from_parts(4_813_000, 0) + } + // Storage: ParachainInfo ParachainId (r:1 w:0) + // Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + // Storage: PolkadotXcm SupportedVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SupportedVersion (max_values: None, max_size: None, mode: Measured) + // Storage: PolkadotXcm VersionDiscoveryQueue (r:1 w:1) + // Proof Skipped: PolkadotXcm VersionDiscoveryQueue (max_values: Some(1), max_size: None, mode: Measured) + // Storage: PolkadotXcm SafeXcmVersion (r:1 w:0) + // Proof Skipped: PolkadotXcm SafeXcmVersion (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem HostConfiguration (r:1 w:0) + // Proof Skipped: ParachainSystem HostConfiguration (max_values: Some(1), max_size: None, mode: Measured) + // Storage: ParachainSystem PendingUpwardMessages (r:1 w:1) + // Proof Skipped: ParachainSystem PendingUpwardMessages (max_values: Some(1), max_size: None, mode: Measured) + pub fn report_transact_status() -> Weight { + // Proof Size summary in bytes: + // Measured: `70` + // Estimated: `3535` + // Minimum execution time: 25_483_000 picoseconds. + Weight::from_parts(25_737_000, 3535) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(2)) + } + pub fn clear_transact_status() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_755_000 picoseconds. + Weight::from_parts(2_817_000, 0) + } + pub fn set_topic() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_700_000 picoseconds. + Weight::from_parts(2_773_000, 0) + } + pub fn clear_topic() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_670_000 picoseconds. + Weight::from_parts(2_711_000, 0) + } + pub fn set_fees_mode() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_710_000 picoseconds. + Weight::from_parts(2_762_000, 0) + } + pub fn unpaid_execution() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_839_000 picoseconds. + Weight::from_parts(2_931_000, 0) + } +} diff --git a/cumulus/parachains/runtimes/people/people-westend/src/xcm_config.rs b/cumulus/parachains/runtimes/people/people-westend/src/xcm_config.rs new file mode 100644 index 00000000000..0a51cf72d5b --- /dev/null +++ b/cumulus/parachains/runtimes/people/people-westend/src/xcm_config.rs @@ -0,0 +1,324 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use super::{ + AccountId, AllPalletsWithSystem, Balances, ParachainInfo, ParachainSystem, PolkadotXcm, + Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, WeightToFee, XcmpQueue, +}; +use crate::{TransactionByteFee, CENTS}; +use frame_support::{ + match_types, parameter_types, + traits::{ConstU32, Contains, Equals, Everything, Nothing}, +}; +use frame_system::EnsureRoot; +use pallet_xcm::XcmPassthrough; +use parachains_common::{ + impls::ToStakingPot, + xcm_config::{ + AllSiblingSystemParachains, ConcreteAssetFromSystem, RelayOrOtherSystemParachains, + }, + TREASURY_PALLET_ID, +}; +use polkadot_parachain_primitives::primitives::Sibling; +use sp_runtime::traits::AccountIdConversion; +use xcm::latest::prelude::*; +#[allow(deprecated)] +use xcm_builder::CurrencyAdapter; +use xcm_builder::{ + AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, + AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, DenyReserveTransferToRelayChain, + DenyThenTry, DescribeTerminus, EnsureXcmOrigin, HashedDescription, IsConcrete, + ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, + SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, + SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, + WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, XcmFeeManagerFromComponents, + XcmFeeToAccount, +}; +use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; + +parameter_types! { + pub const RootLocation: MultiLocation = MultiLocation::here(); + pub const RelayLocation: MultiLocation = MultiLocation::parent(); + pub const RelayNetwork: Option = Some(NetworkId::Westend); + pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); + pub UniversalLocation: InteriorMultiLocation = + X2(GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(ParachainInfo::parachain_id().into())); + pub const MaxInstructions: u32 = 100; + pub const MaxAssetsIntoHolding: u32 = 64; + pub FellowshipLocation: MultiLocation = MultiLocation::new(1, Parachain(1001)); + pub const GovernanceLocation: MultiLocation = MultiLocation::parent(); + /// The asset ID for the asset that we use to pay for message delivery fees. Just WND. + pub FeeAssetId: AssetId = Concrete(RelayLocation::get()); + /// The base fee for the message delivery fees. + pub const BaseDeliveryFee: u128 = CENTS.saturating_mul(3); + pub TreasuryAccount: AccountId = TREASURY_PALLET_ID.into_account_truncating(); + pub RelayTreasuryLocation: MultiLocation = + (Parent, PalletInstance(westend_runtime_constants::TREASURY_PALLET_ID)).into(); +} + +pub type PriceForParentDelivery = polkadot_runtime_common::xcm_sender::ExponentialPrice< + FeeAssetId, + BaseDeliveryFee, + TransactionByteFee, + ParachainSystem, +>; + +pub type PriceForSiblingParachainDelivery = polkadot_runtime_common::xcm_sender::ExponentialPrice< + FeeAssetId, + BaseDeliveryFee, + TransactionByteFee, + XcmpQueue, +>; + +/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used +/// when determining ownership of accounts for asset transacting and when attempting to use XCM +/// `Transact` in order to determine the dispatch Origin. +pub type LocationToAccountId = ( + // The parent (Relay-chain) origin converts to the parent `AccountId`. + ParentIsPreset, + // Sibling parachain origins convert to AccountId via the `ParaId::into`. + SiblingParachainConvertsVia, + // Straight up local `AccountId32` origins just alias directly to `AccountId`. + AccountId32Aliases, + // Here/local root location to `AccountId`. + HashedDescription, +); + +/// Means for transacting the native currency on this chain. +#[allow(deprecated)] +pub type CurrencyTransactor = CurrencyAdapter< + // Use this currency: + Balances, + // Use this currency when it is a fungible asset matching the given location or name: + IsConcrete, + // Do a simple punn to convert an `AccountId32` `MultiLocation` into a native chain + // `AccountId`: + LocationToAccountId, + // Our chain's account ID type (we can't get away without mentioning it explicitly): + AccountId, + // We don't track any teleports of `Balances`. + (), +>; + +/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, +/// ready for dispatching a transaction with XCM's `Transact`. There is an `OriginKind` that can +/// bias the kind of local `Origin` it will become. +pub type XcmOriginToTransactDispatchOrigin = ( + // Sovereign account converter; this attempts to derive an `AccountId` from the origin location + // using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for + // foreign chains who want to have a local sovereign account on this chain that they control. + SovereignSignedViaLocation, + // Native converter for Relay-chain (Parent) location; will convert to a `Relay` origin when + // recognized. + RelayChainAsNative, + // Native converter for sibling Parachains; will convert to a `SiblingPara` origin when + // recognized. + SiblingParachainAsNative, + // Superuser converter for the Relay-chain (Parent) location. This will allow it to issue a + // transaction from the Root origin. + ParentAsSuperuser, + // Native signed account converter; this just converts an `AccountId32` origin into a normal + // `RuntimeOrigin::Signed` origin of the same 32-byte value. + SignedAccountId32AsNative, + // XCM origins can be represented natively under the XCM pallet's `Xcm` origin. + XcmPassthrough, +); + +match_types! { + pub type LocalPlurality: impl Contains = { + MultiLocation { parents: 0, interior: X1(Plurality { .. }) } + }; + pub type ParentOrParentsPlurality: impl Contains = { + MultiLocation { parents: 1, interior: Here } | + MultiLocation { parents: 1, interior: X1(Plurality { .. }) } + }; + pub type ParentOrSiblings: impl Contains = { + MultiLocation { parents: 1, interior: Here } | + MultiLocation { parents: 1, interior: X1(Parachain(_)) } + }; + pub type FellowsPlurality: impl Contains = { + MultiLocation { parents: 1, interior: X2(Parachain(1001), Plurality { id: BodyId::Technical, ..}) } + }; +} + +/// A call filter for the XCM Transact instruction. This is a temporary measure until we properly +/// account for proof size weights. +/// +/// Calls that are allowed through this filter must: +/// 1. Have a fixed weight; +/// 2. Cannot lead to another call being made; +/// 3. Have a defined proof size weight, e.g. no unbounded vecs in call parameters. +pub struct SafeCallFilter; +impl Contains for SafeCallFilter { + fn contains(call: &RuntimeCall) -> bool { + #[cfg(feature = "runtime-benchmarks")] + { + if matches!(call, RuntimeCall::System(frame_system::Call::remark_with_event { .. })) { + return true + } + } + + matches!( + call, + RuntimeCall::PolkadotXcm(pallet_xcm::Call::force_xcm_version { .. }) | + RuntimeCall::System( + frame_system::Call::set_heap_pages { .. } | + frame_system::Call::set_code { .. } | + frame_system::Call::set_code_without_checks { .. } | + frame_system::Call::kill_prefix { .. }, + ) | RuntimeCall::ParachainSystem(..) | + RuntimeCall::Timestamp(..) | + RuntimeCall::Balances(..) | + RuntimeCall::CollatorSelection( + pallet_collator_selection::Call::set_desired_candidates { .. } | + pallet_collator_selection::Call::set_candidacy_bond { .. } | + pallet_collator_selection::Call::register_as_candidate { .. } | + pallet_collator_selection::Call::leave_intent { .. } | + pallet_collator_selection::Call::set_invulnerables { .. } | + pallet_collator_selection::Call::add_invulnerable { .. } | + pallet_collator_selection::Call::remove_invulnerable { .. }, + ) | RuntimeCall::Session(pallet_session::Call::purge_keys { .. }) | + RuntimeCall::XcmpQueue(..) | + RuntimeCall::MessageQueue(..) | + RuntimeCall::Identity(..) | + RuntimeCall::IdentityMigrator(..) + ) + } +} + +pub type Barrier = TrailingSetTopicAsId< + DenyThenTry< + DenyReserveTransferToRelayChain, + ( + // Allow local users to buy weight credit. + TakeWeightCredit, + // Expected responses are OK. + AllowKnownQueryResponses, + WithComputedOrigin< + ( + // If the message is one that immediately attemps to pay for execution, then + // allow it. + AllowTopLevelPaidExecutionFrom, + // Parent, its pluralities (i.e. governance bodies), and the Fellows plurality + // get free execution. + AllowExplicitUnpaidExecutionFrom<(ParentOrParentsPlurality, FellowsPlurality)>, + // Subscriptions for version tracking are OK. + AllowSubscriptionsFrom, + ), + UniversalLocation, + ConstU32<8>, + >, + ), + >, +>; + +/// Locations that will not be charged fees in the executor, neither for execution nor delivery. We +/// only waive fees for system functions, which these locations represent. +pub type WaivedLocations = ( + RelayOrOtherSystemParachains, + Equals, + Equals, + LocalPlurality, +); + +pub struct XcmConfig; +impl xcm_executor::Config for XcmConfig { + type RuntimeCall = RuntimeCall; + type XcmSender = XcmRouter; + type AssetTransactor = CurrencyTransactor; + type OriginConverter = XcmOriginToTransactDispatchOrigin; + // People does not recognize a reserve location for any asset. Users must teleport WND + // where allowed (e.g. with the Relay Chain). + type IsReserve = (); + /// Only allow teleportation of WND amongst the system. + type IsTeleporter = ConcreteAssetFromSystem; + type UniversalLocation = UniversalLocation; + type Barrier = Barrier; + type Weigher = WeightInfoBounds< + crate::weights::xcm::PeopleWestendXcmWeight, + RuntimeCall, + MaxInstructions, + >; + type Trader = + UsingComponents>; + type ResponseHandler = PolkadotXcm; + type AssetTrap = PolkadotXcm; + type AssetClaims = PolkadotXcm; + type SubscriptionService = PolkadotXcm; + type PalletInstancesInfo = AllPalletsWithSystem; + type MaxAssetsIntoHolding = MaxAssetsIntoHolding; + type AssetLocker = (); + type AssetExchanger = (); + type FeeManager = XcmFeeManagerFromComponents< + WaivedLocations, + XcmFeeToAccount, + >; + type MessageExporter = (); + type UniversalAliases = Nothing; + type CallDispatcher = WithOriginFilter; + type SafeCallFilter = SafeCallFilter; + type Aliasers = Nothing; +} + +/// Converts a local signed origin into an XCM multilocation. Forms the basis for local origins +/// sending/executing XCMs. +pub type LocalOriginToLocation = SignedToAccountId32; + +/// The means for routing XCM messages which are not for local execution into the right message +/// queues. +pub type XcmRouter = WithUniqueTopic<( + // Two routers - use UMP to communicate with the relay chain: + cumulus_primitives_utility::ParentAsUmp, + // ..and XCMP to communicate with the sibling chains. + XcmpQueue, +)>; + +impl pallet_xcm::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + // We want to disallow users sending (arbitrary) XCMs from this chain. + type SendXcmOrigin = EnsureXcmOrigin; + type XcmRouter = XcmRouter; + // We support local origins dispatching XCM executions in principle... + type ExecuteXcmOrigin = EnsureXcmOrigin; + // ... but disallow generic XCM execution. As a result only teleports are allowed. + type XcmExecuteFilter = Nothing; + type XcmExecutor = XcmExecutor; + type XcmTeleportFilter = Everything; + type XcmReserveTransferFilter = Nothing; // This parachain is not meant as a reserve location. + type Weigher = WeightInfoBounds< + crate::weights::xcm::PeopleWestendXcmWeight, + RuntimeCall, + MaxInstructions, + >; + type UniversalLocation = UniversalLocation; + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100; + type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion; + type Currency = Balances; + type CurrencyMatcher = (); + type TrustedLockers = (); + type SovereignAccountOf = LocationToAccountId; + type MaxLockers = ConstU32<8>; + type WeightInfo = crate::weights::pallet_xcm::WeightInfo; + type AdminOrigin = EnsureRoot; + type MaxRemoteLockConsumers = ConstU32<0>; + type RemoteLockConsumerIdentifier = (); +} + +impl cumulus_pallet_xcm::Config for Runtime { + type RuntimeEvent = RuntimeEvent; + type XcmExecutor = XcmExecutor; +} diff --git a/cumulus/polkadot-parachain/Cargo.toml b/cumulus/polkadot-parachain/Cargo.toml index 1c055f6b2dd..c2b3b92b23f 100644 --- a/cumulus/polkadot-parachain/Cargo.toml +++ b/cumulus/polkadot-parachain/Cargo.toml @@ -38,6 +38,8 @@ coretime-rococo-runtime = { path = "../parachains/runtimes/coretime/coretime-roc coretime-westend-runtime = { path = "../parachains/runtimes/coretime/coretime-westend" } bridge-hub-westend-runtime = { path = "../parachains/runtimes/bridge-hubs/bridge-hub-westend" } penpal-runtime = { path = "../parachains/runtimes/testing/penpal" } +people-rococo-runtime = { path = "../parachains/runtimes/people/people-rococo" } +people-westend-runtime = { path = "../parachains/runtimes/people/people-westend" } jsonrpsee = { version = "0.16.2", features = ["server"] } parachains-common = { path = "../parachains/common" } @@ -135,6 +137,8 @@ runtime-benchmarks = [ "glutton-westend-runtime/runtime-benchmarks", "parachains-common/runtime-benchmarks", "penpal-runtime/runtime-benchmarks", + "people-rococo-runtime/runtime-benchmarks", + "people-westend-runtime/runtime-benchmarks", "polkadot-cli/runtime-benchmarks", "polkadot-primitives/runtime-benchmarks", "polkadot-service/runtime-benchmarks", @@ -156,6 +160,8 @@ try-runtime = [ "glutton-westend-runtime/try-runtime", "pallet-transaction-payment/try-runtime", "penpal-runtime/try-runtime", + "people-rococo-runtime/try-runtime", + "people-westend-runtime/try-runtime", "polkadot-cli/try-runtime", "polkadot-service/try-runtime", "shell-runtime/try-runtime", diff --git a/cumulus/polkadot-parachain/chain-specs/people-rococo.json b/cumulus/polkadot-parachain/chain-specs/people-rococo.json new file mode 120000 index 00000000000..2e88dafed48 --- /dev/null +++ b/cumulus/polkadot-parachain/chain-specs/people-rococo.json @@ -0,0 +1 @@ +../../parachains/chain-specs/people-rococo.json \ No newline at end of file diff --git a/cumulus/polkadot-parachain/chain-specs/people-westend.json b/cumulus/polkadot-parachain/chain-specs/people-westend.json new file mode 120000 index 00000000000..3eb6c240aea --- /dev/null +++ b/cumulus/polkadot-parachain/chain-specs/people-westend.json @@ -0,0 +1 @@ +../../parachains/chain-specs/people-westend.json \ No newline at end of file diff --git a/cumulus/polkadot-parachain/src/chain_spec/mod.rs b/cumulus/polkadot-parachain/src/chain_spec/mod.rs index 6c0670d24b8..bbda334e4c6 100644 --- a/cumulus/polkadot-parachain/src/chain_spec/mod.rs +++ b/cumulus/polkadot-parachain/src/chain_spec/mod.rs @@ -27,6 +27,7 @@ pub mod contracts; pub mod coretime; pub mod glutton; pub mod penpal; +pub mod people; pub mod rococo_parachain; pub mod seedling; pub mod shell; diff --git a/cumulus/polkadot-parachain/src/chain_spec/people.rs b/cumulus/polkadot-parachain/src/chain_spec/people.rs new file mode 100644 index 00000000000..aa78bfdb76f --- /dev/null +++ b/cumulus/polkadot-parachain/src/chain_spec/people.rs @@ -0,0 +1,320 @@ +// Copyright Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +use crate::chain_spec::GenericChainSpec; +use cumulus_primitives_core::ParaId; +use parachains_common::Balance as PeopleBalance; +use sc_chain_spec::ChainSpec; +use std::str::FromStr; + +/// Collects all supported People configurations. +#[derive(Debug, PartialEq)] +pub enum PeopleRuntimeType { + Rococo, + RococoLocal, + RococoDevelopment, + Westend, + WestendLocal, + WestendDevelopment, +} + +impl FromStr for PeopleRuntimeType { + type Err = String; + + fn from_str(value: &str) -> Result { + match value { + rococo::PEOPLE_ROCOCO => Ok(PeopleRuntimeType::Rococo), + rococo::PEOPLE_ROCOCO_LOCAL => Ok(PeopleRuntimeType::RococoLocal), + rococo::PEOPLE_ROCOCO_DEVELOPMENT => Ok(PeopleRuntimeType::RococoDevelopment), + westend::PEOPLE_WESTEND => Ok(PeopleRuntimeType::Westend), + westend::PEOPLE_WESTEND_LOCAL => Ok(PeopleRuntimeType::WestendLocal), + westend::PEOPLE_WESTEND_DEVELOPMENT => Ok(PeopleRuntimeType::WestendDevelopment), + _ => Err(format!("Value '{}' is not configured yet", value)), + } + } +} + +impl PeopleRuntimeType { + pub const ID_PREFIX: &'static str = "people"; + + pub fn load_config(&self) -> Result, String> { + match self { + PeopleRuntimeType::Rococo => Ok(Box::new(GenericChainSpec::from_json_bytes( + &include_bytes!("../../chain-specs/people-rococo.json")[..], + )?)), + PeopleRuntimeType::RococoLocal => Ok(Box::new(rococo::local_config( + rococo::PEOPLE_ROCOCO_LOCAL, + "Rococo People Local", + "rococo-local", + ParaId::new(1004), + ))), + PeopleRuntimeType::RococoDevelopment => Ok(Box::new(rococo::local_config( + rococo::PEOPLE_ROCOCO_DEVELOPMENT, + "Rococo People Development", + "rococo-development", + ParaId::new(1004), + ))), + PeopleRuntimeType::Westend => Ok(Box::new(GenericChainSpec::from_json_bytes( + &include_bytes!("../../chain-specs/people-westend.json")[..], + )?)), + PeopleRuntimeType::WestendLocal => Ok(Box::new(westend::local_config( + westend::PEOPLE_WESTEND_LOCAL, + "Westend People Local", + "westend-local", + ParaId::new(1004), + ))), + PeopleRuntimeType::WestendDevelopment => Ok(Box::new(westend::local_config( + westend::PEOPLE_WESTEND_DEVELOPMENT, + "Westend People Development", + "westend-development", + ParaId::new(1004), + ))), + } + } +} + +/// Check if `id` satisfies People-like format. +fn ensure_id(id: &str) -> Result<&str, String> { + if id.starts_with(PeopleRuntimeType::ID_PREFIX) { + Ok(id) + } else { + Err(format!( + "Invalid 'id' attribute ({}), should start with prefix: {}", + id, + PeopleRuntimeType::ID_PREFIX + )) + } +} + +/// Sub-module for Rococo setup. +pub mod rococo { + use super::{ParaId, PeopleBalance}; + use crate::chain_spec::{ + get_account_id_from_seed, get_collator_keys_from_seed, Extensions, GenericChainSpec, + SAFE_XCM_VERSION, + }; + use parachains_common::{rococo::currency::EXISTENTIAL_DEPOSIT, AccountId, AuraId}; + use sc_chain_spec::ChainType; + use sp_core::sr25519; + + pub(crate) const PEOPLE_ROCOCO: &str = "people-rococo"; + pub(crate) const PEOPLE_ROCOCO_LOCAL: &str = "people-rococo-local"; + pub(crate) const PEOPLE_ROCOCO_DEVELOPMENT: &str = "people-rococo-development"; + const PEOPLE_ROCOCO_ED: PeopleBalance = EXISTENTIAL_DEPOSIT; + + pub fn local_config( + id: &str, + chain_name: &str, + relay_chain: &str, + para_id: ParaId, + ) -> GenericChainSpec { + let mut properties = sc_chain_spec::Properties::new(); + properties.insert("ss58Format".into(), 42.into()); + properties.insert("tokenSymbol".into(), "ROC".into()); + properties.insert("tokenDecimals".into(), 12.into()); + + GenericChainSpec::builder( + people_rococo_runtime::WASM_BINARY + .expect("WASM binary was not built, please build it!"), + Extensions { relay_chain: relay_chain.to_string(), para_id: para_id.into() }, + ) + .with_name(chain_name) + .with_id(super::ensure_id(id).expect("invalid id")) + .with_chain_type(ChainType::Local) + .with_genesis_config_patch(genesis( + // initial collators. + vec![ + ( + get_account_id_from_seed::("Alice"), + get_collator_keys_from_seed::("Alice"), + ), + ( + get_account_id_from_seed::("Bob"), + get_collator_keys_from_seed::("Bob"), + ), + ], + vec![ + get_account_id_from_seed::("Alice"), + get_account_id_from_seed::("Bob"), + get_account_id_from_seed::("Charlie"), + get_account_id_from_seed::("Dave"), + get_account_id_from_seed::("Eve"), + get_account_id_from_seed::("Ferdie"), + get_account_id_from_seed::("Alice//stash"), + get_account_id_from_seed::("Bob//stash"), + get_account_id_from_seed::("Charlie//stash"), + get_account_id_from_seed::("Dave//stash"), + get_account_id_from_seed::("Eve//stash"), + get_account_id_from_seed::("Ferdie//stash"), + ], + para_id, + )) + .with_properties(properties) + .build() + } + + fn genesis( + invulnerables: Vec<(AccountId, AuraId)>, + endowed_accounts: Vec, + id: ParaId, + ) -> serde_json::Value { + serde_json::json!({ + "balances": { + "balances": endowed_accounts + .iter() + .cloned() + .map(|k| (k, PEOPLE_ROCOCO_ED * 524_288)) + .collect::>(), + }, + "parachainInfo": { + "parachainId": id, + }, + "collatorSelection": { + "invulnerables": invulnerables + .iter() + .cloned() + .map(|(acc, _)| acc) + .collect::>(), + "candidacyBond": PEOPLE_ROCOCO_ED * 16, + }, + "session": { + "keys": invulnerables + .into_iter() + .map(|(acc, aura)| { + ( + acc.clone(), // account id + acc, // validator id + people_rococo_runtime::SessionKeys { aura }, // session keys + ) + }) + .collect::>(), + }, + "polkadotXcm": { + "safeXcmVersion": Some(SAFE_XCM_VERSION), + } + }) + } +} + +/// Sub-module for Westend setup. +pub mod westend { + use super::{ParaId, PeopleBalance}; + use crate::chain_spec::{ + get_account_id_from_seed, get_collator_keys_from_seed, Extensions, GenericChainSpec, + SAFE_XCM_VERSION, + }; + use parachains_common::{westend::currency::EXISTENTIAL_DEPOSIT, AccountId, AuraId}; + use sc_chain_spec::ChainType; + use sp_core::sr25519; + + pub(crate) const PEOPLE_WESTEND: &str = "people-westend"; + pub(crate) const PEOPLE_WESTEND_LOCAL: &str = "people-westend-local"; + pub(crate) const PEOPLE_WESTEND_DEVELOPMENT: &str = "people-westend-development"; + const PEOPLE_WESTEND_ED: PeopleBalance = EXISTENTIAL_DEPOSIT; + + pub fn local_config( + id: &str, + chain_name: &str, + relay_chain: &str, + para_id: ParaId, + ) -> GenericChainSpec { + let mut properties = sc_chain_spec::Properties::new(); + properties.insert("ss58Format".into(), 42.into()); + properties.insert("tokenSymbol".into(), "WND".into()); + properties.insert("tokenDecimals".into(), 12.into()); + + GenericChainSpec::builder( + people_westend_runtime::WASM_BINARY + .expect("WASM binary was not built, please build it!"), + Extensions { relay_chain: relay_chain.to_string(), para_id: para_id.into() }, + ) + .with_name(chain_name) + .with_id(super::ensure_id(id).expect("invalid id")) + .with_chain_type(ChainType::Local) + .with_genesis_config_patch(genesis( + // initial collators. + vec![ + ( + get_account_id_from_seed::("Alice"), + get_collator_keys_from_seed::("Alice"), + ), + ( + get_account_id_from_seed::("Bob"), + get_collator_keys_from_seed::("Bob"), + ), + ], + vec![ + get_account_id_from_seed::("Alice"), + get_account_id_from_seed::("Bob"), + get_account_id_from_seed::("Charlie"), + get_account_id_from_seed::("Dave"), + get_account_id_from_seed::("Eve"), + get_account_id_from_seed::("Ferdie"), + get_account_id_from_seed::("Alice//stash"), + get_account_id_from_seed::("Bob//stash"), + get_account_id_from_seed::("Charlie//stash"), + get_account_id_from_seed::("Dave//stash"), + get_account_id_from_seed::("Eve//stash"), + get_account_id_from_seed::("Ferdie//stash"), + ], + para_id, + )) + .with_properties(properties) + .build() + } + + fn genesis( + invulnerables: Vec<(AccountId, AuraId)>, + endowed_accounts: Vec, + id: ParaId, + ) -> serde_json::Value { + serde_json::json!({ + "balances": { + "balances": endowed_accounts + .iter() + .cloned() + .map(|k| (k, PEOPLE_WESTEND_ED * 524_288)) + .collect::>(), + }, + "parachainInfo": { + "parachainId": id, + }, + "collatorSelection": { + "invulnerables": invulnerables + .iter() + .cloned() + .map(|(acc, _)| acc) + .collect::>(), + "candidacyBond": PEOPLE_WESTEND_ED * 16, + }, + "session": { + "keys": invulnerables + .into_iter() + .map(|(acc, aura)| { + ( + acc.clone(), // account id + acc, // validator id + people_westend_runtime::SessionKeys { aura }, // session keys + ) + }) + .collect::>(), + }, + "polkadotXcm": { + "safeXcmVersion": Some(SAFE_XCM_VERSION), + } + }) + } +} diff --git a/cumulus/polkadot-parachain/src/command.rs b/cumulus/polkadot-parachain/src/command.rs index ea56e277112..516bdb76852 100644 --- a/cumulus/polkadot-parachain/src/command.rs +++ b/cumulus/polkadot-parachain/src/command.rs @@ -56,6 +56,7 @@ enum Runtime { GluttonWestend, BridgeHub(chain_spec::bridge_hubs::BridgeHubRuntimeType), Coretime(chain_spec::coretime::CoretimeRuntimeType), + People(chain_spec::people::PeopleRuntimeType), } trait RuntimeResolver { @@ -122,6 +123,8 @@ fn runtime(id: &str) -> Runtime { Runtime::GluttonWestend } else if id.starts_with("glutton") { Runtime::Glutton + } else if id.starts_with(chain_spec::people::PeopleRuntimeType::ID_PREFIX) { + Runtime::People(id.parse::().expect("Invalid value")) } else { log::warn!("No specific runtime was recognized for ChainSpec's id: '{}', so Runtime::default() will be used", id); Runtime::default() @@ -247,6 +250,14 @@ fn load_spec(id: &str) -> std::result::Result, String> { para_id.expect("Must specify parachain id"), )), + // -- People + people_like_id + if people_like_id.starts_with(chain_spec::people::PeopleRuntimeType::ID_PREFIX) => + people_like_id + .parse::() + .expect("invalid value") + .load_config()?, + // -- Fallback (generic chainspec) "" => { log::warn!("No ChainSpec.id specified, so using default one, based on rococo-parachain runtime"); @@ -397,7 +408,8 @@ macro_rules! construct_partials { Runtime::BridgeHub(_) | Runtime::CollectivesPolkadot | Runtime::CollectivesWestend | - Runtime::Coretime(_) => { + Runtime::Coretime(_) | + Runtime::People(_) => { let $partials = new_partial::( &$config, crate::service::aura_build_import_queue::<_, AuraId>, @@ -449,7 +461,8 @@ macro_rules! construct_async_run { Runtime::BridgeHub(_) | Runtime::CollectivesPolkadot | Runtime::CollectivesWestend | - Runtime::Coretime(_) => { + Runtime::Coretime(_) | + Runtime::People(_) => { runner.async_run(|$config| { let $components = new_partial::( &$config, @@ -501,6 +514,7 @@ macro_rules! construct_async_run { /// Parse command line arguments into service configuration. pub fn run() -> Result<()> { + use Runtime::*; let cli = Cli::from_args(); match &cli.subcommand { @@ -673,43 +687,26 @@ pub fn run() -> Result<()> { info!("Is collating: {}", if config.role.is_authority() { "yes" } else { "no" }); match config.chain_spec.runtime() { - Runtime::AssetHubPolkadot => crate::service::start_asset_hub_node::< + AssetHubPolkadot => crate::service::start_asset_hub_node::< AssetHubPolkadotRuntimeApi, AssetHubPolkadotAuraId, >(config, polkadot_config, collator_options, id, hwbench) .await .map(|r| r.0) .map_err(Into::into), - Runtime::AssetHubKusama => crate::service::start_asset_hub_node::< - RuntimeApi, - AuraId, - >(config, polkadot_config, collator_options, id, hwbench) - .await - .map(|r| r.0) - .map_err(Into::into), - Runtime::AssetHubRococo => crate::service::start_asset_hub_node::< - RuntimeApi, - AuraId, - >(config, polkadot_config, collator_options, id, hwbench) - .await - .map(|r| r.0) - .map_err(Into::into), - Runtime::AssetHubWestend => crate::service::start_asset_hub_node::< - RuntimeApi, - AuraId, - >(config, polkadot_config, collator_options, id, hwbench) - .await - .map(|r| r.0) - .map_err(Into::into), - Runtime::CollectivesPolkadot => - crate::service::start_generic_aura_node::< + + AssetHubKusama | + AssetHubRococo | + AssetHubWestend => + crate::service::start_asset_hub_node::< RuntimeApi, AuraId, >(config, polkadot_config, collator_options, id, hwbench) .await .map(|r| r.0) .map_err(Into::into), - Runtime::CollectivesWestend => + + CollectivesPolkadot | CollectivesWestend => crate::service::start_generic_aura_node::< RuntimeApi, AuraId, @@ -717,7 +714,8 @@ pub fn run() -> Result<()> { .await .map(|r| r.0) .map_err(Into::into), - Runtime::Shell => + + Seedling | Shell => crate::service::start_shell_node::( config, polkadot_config, @@ -728,18 +726,8 @@ pub fn run() -> Result<()> { .await .map(|r| r.0) .map_err(Into::into), - Runtime::Seedling => - crate::service::start_shell_node::( - config, - polkadot_config, - collator_options, - id, - hwbench - ) - .await - .map(|r| r.0) - .map_err(Into::into), - Runtime::ContractsRococo => crate::service::start_contracts_rococo_node( + + ContractsRococo => crate::service::start_contracts_rococo_node( config, polkadot_config, collator_options, @@ -750,7 +738,7 @@ pub fn run() -> Result<()> { .map(|r| r.0) .map_err(Into::into), - Runtime::BridgeHub(bridge_hub_runtime_type) => match bridge_hub_runtime_type { + BridgeHub(bridge_hub_runtime_type) => match bridge_hub_runtime_type { chain_spec::bridge_hubs::BridgeHubRuntimeType::Polkadot => crate::service::start_generic_aura_node::< RuntimeApi, @@ -786,7 +774,7 @@ pub fn run() -> Result<()> { } .map_err(Into::into), - Runtime::Coretime(coretime_runtime_type) => match coretime_runtime_type { + Coretime(coretime_runtime_type) => match coretime_runtime_type { chain_spec::coretime::CoretimeRuntimeType::Rococo | chain_spec::coretime::CoretimeRuntimeType::RococoLocal | chain_spec::coretime::CoretimeRuntimeType::RococoDevelopment | @@ -801,7 +789,7 @@ pub fn run() -> Result<()> { } .map_err(Into::into), - Runtime::Penpal(_) | Runtime::Default => + Penpal(_) | Default => crate::service::start_rococo_parachain_node( config, polkadot_config, @@ -812,15 +800,8 @@ pub fn run() -> Result<()> { .await .map(|r| r.0) .map_err(Into::into), - Runtime::GluttonWestend => - crate::service::start_basic_lookahead_node::< - RuntimeApi, - AuraId, - >(config, polkadot_config, collator_options, id, hwbench) - .await - .map(|r| r.0) - .map_err(Into::into), - Runtime::Glutton => + + Glutton | GluttonWestend => crate::service::start_basic_lookahead_node::< RuntimeApi, AuraId, @@ -828,6 +809,22 @@ pub fn run() -> Result<()> { .await .map(|r| r.0) .map_err(Into::into), + + People(people_runtime_type) => match people_runtime_type { + chain_spec::people::PeopleRuntimeType::Rococo | + chain_spec::people::PeopleRuntimeType::RococoLocal | + chain_spec::people::PeopleRuntimeType::RococoDevelopment | + chain_spec::people::PeopleRuntimeType::Westend | + chain_spec::people::PeopleRuntimeType::WestendLocal | + chain_spec::people::PeopleRuntimeType::WestendDevelopment => + crate::service::start_generic_aura_node::< + RuntimeApi, + AuraId, + >(config, polkadot_config, collator_options, id, hwbench) + .await + .map(|r| r.0), + } + .map_err(Into::into), } }) }, diff --git a/cumulus/polkadot-parachain/src/service.rs b/cumulus/polkadot-parachain/src/service.rs index dff5881108c..77978a49f56 100644 --- a/cumulus/polkadot-parachain/src/service.rs +++ b/cumulus/polkadot-parachain/src/service.rs @@ -98,7 +98,6 @@ impl sc_executor::NativeExecutionDispatch for ShellRuntimeExecutor { /// Native Asset Hub Westend (Westmint) executor instance. pub struct AssetHubWestendExecutor; - impl sc_executor::NativeExecutionDispatch for AssetHubWestendExecutor { type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; @@ -128,7 +127,6 @@ impl sc_executor::NativeExecutionDispatch for CollectivesWestendRuntimeExecutor /// Native BridgeHubRococo executor instance. pub struct BridgeHubRococoRuntimeExecutor; - impl sc_executor::NativeExecutionDispatch for BridgeHubRococoRuntimeExecutor { type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; @@ -167,7 +165,6 @@ impl sc_executor::NativeExecutionDispatch for CoretimeWestendRuntimeExecutor { /// Native contracts executor instance. pub struct ContractsRococoRuntimeExecutor; - impl sc_executor::NativeExecutionDispatch for ContractsRococoRuntimeExecutor { type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; @@ -195,6 +192,30 @@ impl sc_executor::NativeExecutionDispatch for GluttonWestendRuntimeExecutor { } } +/// Native `PeopleWestend` executor instance. +pub struct PeopleWestendRuntimeExecutor; +impl sc_executor::NativeExecutionDispatch for PeopleWestendRuntimeExecutor { + type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; + fn dispatch(method: &str, data: &[u8]) -> Option> { + people_westend_runtime::api::dispatch(method, data) + } + fn native_version() -> sc_executor::NativeVersion { + people_westend_runtime::native_version() + } +} + +/// Native `PeopleRococo` executor instance. +pub struct PeopleRococoRuntimeExecutor; +impl sc_executor::NativeExecutionDispatch for PeopleRococoRuntimeExecutor { + type ExtendHostFunctions = frame_benchmarking::benchmarking::HostFunctions; + fn dispatch(method: &str, data: &[u8]) -> Option> { + people_rococo_runtime::api::dispatch(method, data) + } + fn native_version() -> sc_executor::NativeVersion { + people_rococo_runtime::native_version() + } +} + /// Starts a `ServiceBuilder` for a full service. /// /// Use this macro if you don't actually need the full service, but just the builder in order to diff --git a/cumulus/scripts/create_people_rococo_spec.sh b/cumulus/scripts/create_people_rococo_spec.sh new file mode 100755 index 00000000000..264408b20bc --- /dev/null +++ b/cumulus/scripts/create_people_rococo_spec.sh @@ -0,0 +1,105 @@ +#!/usr/bin/env bash + +usage() { + echo Usage: + echo "$1 " + echo "$2 " + echo "e.g.: ./cumulus/scripts/create_people_rococo_spec.sh ./target/release/wbuild/people-rococo-runtime/people_rococo_runtime.compact.compressed.wasm 1004" + exit 1 +} + +if [ -z "$1" ]; then + usage +fi + +if [ -z "$2" ]; then + usage +fi + +set -e + +rt_path=$1 +para_id=$2 + +echo "Generating chain spec for runtime: $rt_path and para_id: $para_id" + +binary="./target/release/polkadot-parachain" + +# build the chain spec we'll manipulate +$binary build-spec --chain people-rococo-local > chain-spec-plain.json + +# convert runtime to hex +cat $rt_path | od -A n -v -t x1 | tr -d ' \n' > rt-hex.txt + +# replace the runtime in the spec with the given runtime and set some values to production +# Boot nodes, invulnerables, and session keys from https://github.com/paritytech/devops/issues/2847 +# +# Note: This is a testnet runtime. Each invulnerable's Aura key is also used as its AccountId. This +# is not recommended in value-bearing networks. +cat chain-spec-plain.json | jq --rawfile code rt-hex.txt '.genesis.runtimeGenesis.code = ("0x" + $code)' \ + | jq '.name = "Rococo People"' \ + | jq '.id = "people-rococo"' \ + | jq '.chainType = "Live"' \ + | jq '.bootNodes = [ + "/dns/rococo-people-collator-node-0.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWDZg5jMYhKXTu6RU491V5sxsFnP4oaEmZJEUfcRkYzps5", + "/dns/rococo-people-collator-node-0.parity-testnet.parity.io/tcp/443/wss/p2p/12D3KooWDZg5jMYhKXTu6RU491V5sxsFnP4oaEmZJEUfcRkYzps5", + "/dns/rococo-people-collator-node-1.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWGGR5i6qQqfo7iDNp7vjDRKPWuDk53idGV6nFLwS12X5H", + "/dns/rococo-people-collator-node-1.parity-testnet.parity.io/tcp/443/wss/p2p/12D3KooWGGR5i6qQqfo7iDNp7vjDRKPWuDk53idGV6nFLwS12X5H", + "/dns/rococo-people-collator-node-2.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWBvA9BmBfrsVMcAcqVXGYFCpMTvkSk2igNXpmoareYbeT", + "/dns/rococo-people-collator-node-2.parity-testnet.parity.io/tcp/443/wss/p2p/12D3KooWBvA9BmBfrsVMcAcqVXGYFCpMTvkSk2igNXpmoareYbeT", + "/dns/rococo-people-collator-node-3.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWQ7Q9jLcJTPXy7KEp5hSZ8YMY9pHx9CnQVz3T8TKQ81UG", + "/dns/rococo-people-collator-node-3.parity-testnet.parity.io/tcp/443/wss/p2p/12D3KooWQ7Q9jLcJTPXy7KEp5hSZ8YMY9pHx9CnQVz3T8TKQ81UG" + ]' \ + | jq '.relay_chain = "rococo"' \ + | jq --argjson para_id $para_id '.para_id = $para_id' \ + | jq --argjson para_id $para_id '.genesis.runtimeGenesis.patch.parachainInfo.parachainId = $para_id' \ + | jq '.genesis.runtimeGenesis.patch.balances.balances = []' \ + | jq '.genesis.runtimeGenesis.patch.collatorSelection.invulnerables = [ + "5Gnjmw1iuF2kV4PecFgetJed7B8quBKfLiRM99ELcXvFH9Vn", + "5FLZRxyeRPhG69zo4ZPqCJSYboSKaRBUjBvQc1nkuWoBpZ5P", + "5DNnmPH2MT6SXpfqbJZbTz4eERmuZegssfxc4ysL8PWrHaNN", + "5DkKcSP5MboNMpXScW1CyRqaktKMXH8QLP4Mn49TwS5vhL6k" + ]' \ + | jq '.genesis.runtimeGenesis.patch.session.keys = [ + [ + "5Gnjmw1iuF2kV4PecFgetJed7B8quBKfLiRM99ELcXvFH9Vn", + "5Gnjmw1iuF2kV4PecFgetJed7B8quBKfLiRM99ELcXvFH9Vn", + { + "aura": "5Gnjmw1iuF2kV4PecFgetJed7B8quBKfLiRM99ELcXvFH9Vn" + } + ], + [ + "5FLZRxyeRPhG69zo4ZPqCJSYboSKaRBUjBvQc1nkuWoBpZ5P", + "5FLZRxyeRPhG69zo4ZPqCJSYboSKaRBUjBvQc1nkuWoBpZ5P", + { + "aura": "5FLZRxyeRPhG69zo4ZPqCJSYboSKaRBUjBvQc1nkuWoBpZ5P" + } + ], + [ + "5DNnmPH2MT6SXpfqbJZbTz4eERmuZegssfxc4ysL8PWrHaNN", + "5DNnmPH2MT6SXpfqbJZbTz4eERmuZegssfxc4ysL8PWrHaNN", + { + "aura": "5DNnmPH2MT6SXpfqbJZbTz4eERmuZegssfxc4ysL8PWrHaNN" + } + ], + [ + "5DkKcSP5MboNMpXScW1CyRqaktKMXH8QLP4Mn49TwS5vhL6k", + "5DkKcSP5MboNMpXScW1CyRqaktKMXH8QLP4Mn49TwS5vhL6k", + { + "aura": "5DkKcSP5MboNMpXScW1CyRqaktKMXH8QLP4Mn49TwS5vhL6k" + } + ] + ]' \ + > edited-chain-spec-plain.json + +# build a raw spec +$binary build-spec --chain edited-chain-spec-plain.json --raw > chain-spec-raw.json +cp edited-chain-spec-plain.json people-rococo-spec.json +cp chain-spec-raw.json ./cumulus/parachains/chain-specs/people-rococo.json +cp chain-spec-raw.json people-rococo-spec-raw.json + +# build genesis data +$binary export-genesis-state --chain chain-spec-raw.json > people-rococo-genesis-head-data + +# build genesis wasm +$binary export-genesis-wasm --chain chain-spec-raw.json > people-rococo-wasm diff --git a/cumulus/scripts/create_people_westend_spec.sh b/cumulus/scripts/create_people_westend_spec.sh new file mode 100755 index 00000000000..f9c3694d61e --- /dev/null +++ b/cumulus/scripts/create_people_westend_spec.sh @@ -0,0 +1,105 @@ +#!/usr/bin/env bash + +usage() { + echo Usage: + echo "$1 " + echo "$2 " + echo "e.g.: ./cumulus/scripts/create_people_westend_spec.sh ./target/release/wbuild/people-westend-runtime/people_westend_runtime.compact.compressed.wasm 1004" + exit 1 +} + +if [ -z "$1" ]; then + usage +fi + +if [ -z "$2" ]; then + usage +fi + +set -e + +rt_path=$1 +para_id=$2 + +echo "Generating chain spec for runtime: $rt_path and para_id: $para_id" + +binary="./target/release/polkadot-parachain" + +# build the chain spec we'll manipulate +$binary build-spec --chain people-westend-local > chain-spec-plain.json + +# convert runtime to hex +cat $rt_path | od -A n -v -t x1 | tr -d ' \n' > rt-hex.txt + +# replace the runtime in the spec with the given runtime and set some values to production +# Boot nodes, invulnerables, and session keys from https://github.com/paritytech/devops/issues/2847 +# +# Note: This is a testnet runtime. Each invulnerable's Aura key is also used as its AccountId. This +# is not recommended in value-bearing networks. +cat chain-spec-plain.json | jq --rawfile code rt-hex.txt '.genesis.runtimeGenesis.code = ("0x" + $code)' \ + | jq '.name = "Westend People"' \ + | jq '.id = "people-westend"' \ + | jq '.chainType = "Live"' \ + | jq '.bootNodes = [ + "/dns/westend-people-collator-node-0.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWDcLjDLTu9fNhmas9DTWtqdv8eUbFMWQzVwvXRK7QcjHD", + "/dns/westend-people-collator-node-0.parity-testnet.parity.io/tcp/443/wss/p2p/12D3KooWDcLjDLTu9fNhmas9DTWtqdv8eUbFMWQzVwvXRK7QcjHD", + "/dns/westend-people-collator-node-1.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWM56JbKWAXsDyWh313z73aKYVMp1Hj2nSnAKY3q6MnoC9", + "/dns/westend-people-collator-node-1.parity-testnet.parity.io/tcp/443/wss/p2p/12D3KooWM56JbKWAXsDyWh313z73aKYVMp1Hj2nSnAKY3q6MnoC9", + "/dns/westend-people-collator-node-2.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWGVYTVKW7tYe51JvetvGvVLDPXzqQX1mueJgz14FgkmHG", + "/dns/westend-people-collator-node-2.parity-testnet.parity.io/tcp/443/wss/p2p/12D3KooWGVYTVKW7tYe51JvetvGvVLDPXzqQX1mueJgz14FgkmHG", + "/dns/westend-people-collator-node-3.parity-testnet.parity.io/tcp/30333/p2p/12D3KooWCF1eA2Gap69zgXD7Df3e9DqDUsGoByocggTGejoHjK23", + "/dns/westend-people-collator-node-3.parity-testnet.parity.io/tcp/443/wss/p2p/12D3KooWCF1eA2Gap69zgXD7Df3e9DqDUsGoByocggTGejoHjK23" + ]' \ + | jq '.relay_chain = "westend"' \ + | jq --argjson para_id $para_id '.para_id = $para_id' \ + | jq --argjson para_id $para_id '.genesis.runtimeGenesis.patch.parachainInfo.parachainId = $para_id' \ + | jq '.genesis.runtimeGenesis.patch.balances.balances = []' \ + | jq '.genesis.runtimeGenesis.patch.collatorSelection.invulnerables = [ + "5CFYvshLff1dHmT33jUcBc7mEKbVRJKbA9HzPqmLfjksHah6", + "5HgEdsYyVGVsyNmbE1sUxeDLrxTLJXnAKCNa2HJ9QXXEir1B", + "5EZmD6eA9wm1Y2Dy2wefLCsFJJcC7o8bVfWm7Mfbuanc8JYo", + "5EkJFfUtbo258dCaqgYSvajN1tNtXhT3SrybW8ZhygoMP3kE" + ]' \ + | jq '.genesis.runtimeGenesis.patch.session.keys = [ + [ + "5CFYvshLff1dHmT33jUcBc7mEKbVRJKbA9HzPqmLfjksHah6", + "5CFYvshLff1dHmT33jUcBc7mEKbVRJKbA9HzPqmLfjksHah6", + { + "aura": "5CFYvshLff1dHmT33jUcBc7mEKbVRJKbA9HzPqmLfjksHah6" + } + ], + [ + "5HgEdsYyVGVsyNmbE1sUxeDLrxTLJXnAKCNa2HJ9QXXEir1B", + "5HgEdsYyVGVsyNmbE1sUxeDLrxTLJXnAKCNa2HJ9QXXEir1B", + { + "aura": "5HgEdsYyVGVsyNmbE1sUxeDLrxTLJXnAKCNa2HJ9QXXEir1B" + } + ], + [ + "5EZmD6eA9wm1Y2Dy2wefLCsFJJcC7o8bVfWm7Mfbuanc8JYo", + "5EZmD6eA9wm1Y2Dy2wefLCsFJJcC7o8bVfWm7Mfbuanc8JYo", + { + "aura": "5EZmD6eA9wm1Y2Dy2wefLCsFJJcC7o8bVfWm7Mfbuanc8JYo" + } + ], + [ + "5EkJFfUtbo258dCaqgYSvajN1tNtXhT3SrybW8ZhygoMP3kE", + "5EkJFfUtbo258dCaqgYSvajN1tNtXhT3SrybW8ZhygoMP3kE", + { + "aura": "5EkJFfUtbo258dCaqgYSvajN1tNtXhT3SrybW8ZhygoMP3kE" + } + ] + ]' \ + > edited-chain-spec-plain.json + +# build a raw spec +$binary build-spec --chain edited-chain-spec-plain.json --raw > chain-spec-raw.json +cp edited-chain-spec-plain.json people-westend-spec.json +cp chain-spec-raw.json ./cumulus/parachains/chain-specs/people-westend.json +cp chain-spec-raw.json people-westend-spec-raw.json + +# build genesis data +$binary export-genesis-state --chain chain-spec-raw.json > people-westend-genesis-head-data + +# build genesis wasm +$binary export-genesis-wasm --chain chain-spec-raw.json > people-westend-wasm diff --git a/cumulus/xcm/xcm-emulator/src/lib.rs b/cumulus/xcm/xcm-emulator/src/lib.rs index f5c6b88adce..c9e4de21d43 100644 --- a/cumulus/xcm/xcm-emulator/src/lib.rs +++ b/cumulus/xcm/xcm-emulator/src/lib.rs @@ -59,9 +59,13 @@ pub use polkadot_runtime_parachains::inclusion::{AggregateMessageOrigin, UmpQueu // Polkadot pub use polkadot_parachain_primitives::primitives::RelayChainBlockNumber; -pub use xcm::v3::prelude::{ - Ancestor, MultiAssets, MultiLocation, Parachain as ParachainJunction, Parent, WeightLimit, - XcmHash, X1, +use sp_core::crypto::AccountId32; +pub use xcm::{ + prelude::{AccountId32 as AccountId32Junction, Here}, + v3::prelude::{ + Ancestor, MultiAssets, MultiLocation, Parachain as ParachainJunction, Parent, WeightLimit, + XcmHash, X1, + }, }; pub use xcm_executor::traits::ConvertLocation; @@ -1437,6 +1441,41 @@ pub struct TestArgs { pub weight_limit: WeightLimit, } +impl TestArgs { + /// Returns a [`TestArgs`] instance to be used for the Relay Chain across integration tests. + pub fn new_relay(dest: MultiLocation, beneficiary_id: AccountId32, amount: Balance) -> Self { + Self { + dest, + beneficiary: AccountId32Junction { network: None, id: beneficiary_id.into() }.into(), + amount, + assets: (Here, amount).into(), + asset_id: None, + fee_asset_item: 0, + weight_limit: WeightLimit::Unlimited, + } + } + + /// Returns a [`TestArgs`] instance to be used for parachains across integration tests. + pub fn new_para( + dest: MultiLocation, + beneficiary_id: AccountId32, + amount: Balance, + assets: MultiAssets, + asset_id: Option, + fee_asset_item: u32, + ) -> Self { + Self { + dest, + beneficiary: AccountId32Junction { network: None, id: beneficiary_id.into() }.into(), + amount, + assets, + asset_id, + fee_asset_item, + weight_limit: WeightLimit::Unlimited, + } + } +} + /// Auxiliar struct to help creating a new `Test` instance pub struct TestContext { pub sender: AccountIdOf, diff --git a/polkadot/runtime/common/src/identity_migrator.rs b/polkadot/runtime/common/src/identity_migrator.rs index cc2c3ce7773..0dfb03b06ba 100644 --- a/polkadot/runtime/common/src/identity_migrator.rs +++ b/polkadot/runtime/common/src/identity_migrator.rs @@ -271,7 +271,8 @@ mod benchmarks { let _ = Identity::::set_identity_no_deposit(&target, info.clone()); let sub_account: T::AccountId = account("sub", 0, SEED); - let _ = Identity::::set_sub_no_deposit(&target, sub_account.clone()); + let name = Data::Raw(b"benchsub".to_vec().try_into().unwrap()); + let _ = Identity::::set_subs_no_deposit(&target, vec![(sub_account.clone(), name)]); // expected deposits let expected_id_deposit = ::BasicDeposit::get() diff --git a/polkadot/runtime/rococo/src/xcm_config.rs b/polkadot/runtime/rococo/src/xcm_config.rs index 4f9ab0d6611..f3a2ca6f3a6 100644 --- a/polkadot/runtime/rococo/src/xcm_config.rs +++ b/polkadot/runtime/rococo/src/xcm_config.rs @@ -25,7 +25,7 @@ use crate::governance::StakingAdmin; use frame_support::{ match_types, parameter_types, - traits::{Everything, Nothing}, + traits::{Equals, Everything, Nothing}, weights::Weight, }; use frame_system::EnsureRoot; @@ -50,6 +50,7 @@ use xcm_builder::{ use xcm_executor::XcmExecutor; parameter_types! { + pub const RootLocation: MultiLocation = MultiLocation::here(); pub const TokenLocation: MultiLocation = Here.into_location(); pub const ThisNetwork: NetworkId = NetworkId::Rococo; pub UniversalLocation: InteriorMultiLocation = ThisNetwork::get().into(); @@ -120,6 +121,7 @@ parameter_types! { pub const Contracts: MultiLocation = Parachain(CONTRACTS_ID).into_location(); pub const Encointer: MultiLocation = Parachain(ENCOINTER_ID).into_location(); pub const BridgeHub: MultiLocation = Parachain(BRIDGE_HUB_ID).into_location(); + pub const People: MultiLocation = Parachain(PEOPLE_ID).into_location(); pub const Broker: MultiLocation = Parachain(BROKER_ID).into_location(); pub const Tick: MultiLocation = Parachain(100).into_location(); pub const Trick: MultiLocation = Parachain(110).into_location(); @@ -131,6 +133,7 @@ parameter_types! { pub const RocForContracts: (MultiAssetFilter, MultiLocation) = (Roc::get(), Contracts::get()); pub const RocForEncointer: (MultiAssetFilter, MultiLocation) = (Roc::get(), Encointer::get()); pub const RocForBridgeHub: (MultiAssetFilter, MultiLocation) = (Roc::get(), BridgeHub::get()); + pub const RocForPeople: (MultiAssetFilter, MultiLocation) = (Roc::get(), People::get()); pub const RocForBroker: (MultiAssetFilter, MultiLocation) = (Roc::get(), Broker::get()); pub const MaxInstructions: u32 = 100; pub const MaxAssetsIntoHolding: u32 = 64; @@ -143,6 +146,7 @@ pub type TrustedTeleporters = ( xcm_builder::Case, xcm_builder::Case, xcm_builder::Case, + xcm_builder::Case, xcm_builder::Case, ); @@ -150,6 +154,9 @@ match_types! { pub type OnlyParachains: impl Contains = { MultiLocation { parents: 0, interior: X1(Parachain(_)) } }; + pub type LocalPlurality: impl Contains = { + MultiLocation { parents: 0, interior: X1(Plurality { .. }) } + }; } /// The barriers one of which must be passed for an XCM message to be executed. @@ -172,6 +179,10 @@ pub type Barrier = TrailingSetTopicAsId<( >, )>; +/// Locations that will not be charged fees in the executor, neither for execution nor delivery. +/// We only waive fees for system functions, which these locations represent. +pub type WaivedLocations = (SystemParachains, Equals, LocalPlurality); + pub struct XcmConfig; impl xcm_executor::Config for XcmConfig { type RuntimeCall = RuntimeCall; @@ -198,7 +209,7 @@ impl xcm_executor::Config for XcmConfig { type PalletInstancesInfo = AllPalletsWithSystem; type MaxAssetsIntoHolding = MaxAssetsIntoHolding; type FeeManager = XcmFeeManagerFromComponents< - SystemParachains, + WaivedLocations, XcmFeeToAccount, >; type MessageExporter = (); diff --git a/polkadot/runtime/westend/constants/src/lib.rs b/polkadot/runtime/westend/constants/src/lib.rs index 3b44684c203..848cccd559d 100644 --- a/polkadot/runtime/westend/constants/src/lib.rs +++ b/polkadot/runtime/westend/constants/src/lib.rs @@ -107,6 +107,8 @@ pub mod system_parachain { pub const COLLECTIVES_ID: u32 = 1001; /// BridgeHub parachain ID. pub const BRIDGE_HUB_ID: u32 = 1002; + /// People Chain parachain ID. + pub const PEOPLE_ID: u32 = 1004; /// Brokerage parachain ID. pub const BROKER_ID: u32 = 1005; diff --git a/polkadot/runtime/westend/src/xcm_config.rs b/polkadot/runtime/westend/src/xcm_config.rs index 506df3025fd..e4b4f50f663 100644 --- a/polkadot/runtime/westend/src/xcm_config.rs +++ b/polkadot/runtime/westend/src/xcm_config.rs @@ -24,7 +24,7 @@ use super::{ use crate::governance::pallet_custom_origins::Treasurer; use frame_support::{ match_types, parameter_types, - traits::{Everything, Nothing}, + traits::{Equals, Everything, Nothing}, }; use frame_system::EnsureRoot; use pallet_xcm::XcmPassthrough; @@ -53,6 +53,7 @@ use xcm_builder::{ use xcm_executor::XcmExecutor; parameter_types! { + pub const RootLocation: MultiLocation = MultiLocation::here(); pub const TokenLocation: MultiLocation = Here.into_location(); pub const ThisNetwork: NetworkId = Westend; pub const UniversalLocation: InteriorMultiLocation = X1(GlobalConsensus(ThisNetwork::get())); @@ -116,10 +117,12 @@ parameter_types! { pub const AssetHub: MultiLocation = Parachain(ASSET_HUB_ID).into_location(); pub const Collectives: MultiLocation = Parachain(COLLECTIVES_ID).into_location(); pub const BridgeHub: MultiLocation = Parachain(BRIDGE_HUB_ID).into_location(); + pub const People: MultiLocation = Parachain(PEOPLE_ID).into_location(); pub const Wnd: MultiAssetFilter = Wild(AllOf { fun: WildFungible, id: Concrete(TokenLocation::get()) }); pub const WndForAssetHub: (MultiAssetFilter, MultiLocation) = (Wnd::get(), AssetHub::get()); pub const WndForCollectives: (MultiAssetFilter, MultiLocation) = (Wnd::get(), Collectives::get()); pub const WndForBridgeHub: (MultiAssetFilter, MultiLocation) = (Wnd::get(), BridgeHub::get()); + pub const WndForPeople: (MultiAssetFilter, MultiLocation) = (Wnd::get(), People::get()); pub const MaxInstructions: u32 = 100; pub const MaxAssetsIntoHolding: u32 = 64; } @@ -128,6 +131,7 @@ pub type TrustedTeleporters = ( xcm_builder::Case, xcm_builder::Case, xcm_builder::Case, + xcm_builder::Case, ); match_types! { @@ -138,6 +142,9 @@ match_types! { MultiLocation { parents: 0, interior: X1(Parachain(COLLECTIVES_ID)) } | MultiLocation { parents: 0, interior: X2(Parachain(COLLECTIVES_ID), Plurality { id: BodyId::Technical, .. }) } }; + pub type LocalPlurality: impl Contains = { + MultiLocation { parents: 0, interior: X1(Plurality { .. }) } + }; } /// The barriers one of which must be passed for an XCM message to be executed. @@ -160,6 +167,10 @@ pub type Barrier = TrailingSetTopicAsId<( >, )>; +/// Locations that will not be charged fees in the executor, neither for execution nor delivery. +/// We only waive fees for system functions, which these locations represent. +pub type WaivedLocations = (SystemParachains, Equals, LocalPlurality); + pub struct XcmConfig; impl xcm_executor::Config for XcmConfig { type RuntimeCall = RuntimeCall; @@ -186,7 +197,7 @@ impl xcm_executor::Config for XcmConfig { type PalletInstancesInfo = AllPalletsWithSystem; type MaxAssetsIntoHolding = MaxAssetsIntoHolding; type FeeManager = XcmFeeManagerFromComponents< - SystemParachains, + WaivedLocations, XcmFeeToAccount, >; type MessageExporter = (); diff --git a/prdoc/pr_2281.prdoc b/prdoc/pr_2281.prdoc new file mode 100644 index 00000000000..c5453a08f2a --- /dev/null +++ b/prdoc/pr_2281.prdoc @@ -0,0 +1,12 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Rococo and Westend People Chain Runtimes + +doc: + - audience: Runtime User + description: | + Rococo and Westend runtimes for the "People Chain". This chain contains the Identity pallet + with plans to migrate all related data from the Relay Chain. Changes `IdentityInfo` fields. + +crates: [ ] diff --git a/substrate/frame/identity/Cargo.toml b/substrate/frame/identity/Cargo.toml index a562d7607b4..78f966c0535 100644 --- a/substrate/frame/identity/Cargo.toml +++ b/substrate/frame/identity/Cargo.toml @@ -32,6 +32,7 @@ sp-core = { path = "../../primitives/core" } [features] default = ["std"] + std = [ "codec/std", "enumflags2/std", diff --git a/substrate/frame/identity/src/lib.rs b/substrate/frame/identity/src/lib.rs index 133f9eeb4be..8588612cd5b 100644 --- a/substrate/frame/identity/src/lib.rs +++ b/substrate/frame/identity/src/lib.rs @@ -1005,8 +1005,9 @@ impl Pallet { Ok((new_id_deposit, new_subs_deposit)) } - /// Set an identity with zero deposit. Only used for benchmarking that involves `rejig_deposit`. - #[cfg(feature = "runtime-benchmarks")] + /// Set an identity with zero deposit. Used for benchmarking and XCM emulator tests that involve + /// `rejig_deposit`. + #[cfg(any(feature = "runtime-benchmarks", feature = "std"))] pub fn set_identity_no_deposit( who: &T::AccountId, info: T::IdentityInformation, @@ -1022,15 +1023,25 @@ impl Pallet { Ok(()) } - /// Set subs with zero deposit. Only used for benchmarking that involves `rejig_deposit`. - #[cfg(feature = "runtime-benchmarks")] - pub fn set_sub_no_deposit(who: &T::AccountId, sub: T::AccountId) -> DispatchResult { + /// Set subs with zero deposit and default name. Only used for benchmarks that involve + /// `rejig_deposit`. + #[cfg(any(feature = "runtime-benchmarks", feature = "std"))] + pub fn set_subs_no_deposit( + who: &T::AccountId, + subs: Vec<(T::AccountId, Data)>, + ) -> DispatchResult { use frame_support::BoundedVec; - let subs = BoundedVec::<_, T::MaxSubAccounts>::try_from(vec![sub]).unwrap(); + let mut sub_accounts = BoundedVec::::default(); + for (sub, name) in subs { + >::insert(&sub, (who.clone(), name)); + sub_accounts + .try_push(sub) + .expect("benchmark should not pass more than T::MaxSubAccounts"); + } SubsOf::::insert::< &T::AccountId, (BalanceOf, BoundedVec), - >(&who, (Zero::zero(), subs)); + >(&who, (Zero::zero(), sub_accounts)); Ok(()) } } -- GitLab From 753967ab489685cc7d4015990ca5750f4f8d7279 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Fri, 22 Dec 2023 21:41:35 +0100 Subject: [PATCH 086/191] Coretime: Use `Superuser` for sending the transact calls (#2793) --- polkadot/runtime/parachains/src/coretime/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/polkadot/runtime/parachains/src/coretime/mod.rs b/polkadot/runtime/parachains/src/coretime/mod.rs index d5b044c0631..b0e40a13233 100644 --- a/polkadot/runtime/parachains/src/coretime/mod.rs +++ b/polkadot/runtime/parachains/src/coretime/mod.rs @@ -244,7 +244,7 @@ impl OnNewSession> for Pallet { fn mk_coretime_call(call: crate::coretime::CoretimeCalls) -> Instruction<()> { Instruction::Transact { - origin_kind: OriginKind::Native, + origin_kind: OriginKind::Superuser, require_weight_at_most: Weight::from_parts(1000000000, 200000), call: BrokerRuntimePallets::Broker(call).encode().into(), } -- GitLab From 8acd63003c1ec76738d5ad48123ecb80063ab848 Mon Sep 17 00:00:00 2001 From: Liam Aharon Date: Sat, 23 Dec 2023 11:58:44 +0400 Subject: [PATCH 087/191] Improve `TryDecodeEntireState` output (#2724) Found some areas for improvement while working on https://github.com/polkadot-fellows/runtimes/pull/122. ## Improvements - If multiple keys in a storage item (e.g. a map) are undecodable, return all the undecodable keys rather than only the first one found - Include the key of the undecodable storage in the INFO log - Write output as hex string where appropriate - Write INFO log on successful decoding --- substrate/frame/executive/src/lib.rs | 5 +- .../traits/try_runtime/decode_entire_state.rs | 50 +++++++++++++++---- 2 files changed, 42 insertions(+), 13 deletions(-) diff --git a/substrate/frame/executive/src/lib.rs b/substrate/frame/executive/src/lib.rs index b351819f612..f2cc3b63168 100644 --- a/substrate/frame/executive/src/lib.rs +++ b/substrate/frame/executive/src/lib.rs @@ -409,9 +409,10 @@ where ) -> Result<(), TryRuntimeError> { match res { Ok(bytes) => { - log::debug!( + log::info!( target: LOG_TARGET, - "decoded the entire state ({bytes} bytes)", + "✅ Entire runtime state decodes without error. {} bytes total.", + bytes ); Ok(()) diff --git a/substrate/frame/support/src/traits/try_runtime/decode_entire_state.rs b/substrate/frame/support/src/traits/try_runtime/decode_entire_state.rs index afbf291a0bb..d5dc93fcf28 100644 --- a/substrate/frame/support/src/traits/try_runtime/decode_entire_state.rs +++ b/substrate/frame/support/src/traits/try_runtime/decode_entire_state.rs @@ -67,7 +67,7 @@ impl TryDecodeEntireStorage for Tuple { } /// A value could not be decoded. -#[derive(Debug, Clone, PartialEq, Eq)] +#[derive(Clone, PartialEq, Eq)] pub struct TryDecodeEntireStorageError { /// The key of the undecodable value. pub key: Vec, @@ -81,9 +81,22 @@ impl core::fmt::Display for TryDecodeEntireStorageError { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { write!( f, - "Failed to decode storage item `{}::{}`", + "`{}::{}` key `{}` is undecodable", &sp_std::str::from_utf8(&self.info.pallet_name).unwrap_or(""), &sp_std::str::from_utf8(&self.info.storage_name).unwrap_or(""), + array_bytes::bytes2hex("0x", &self.key) + ) + } +} + +impl core::fmt::Debug for TryDecodeEntireStorageError { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + write!( + f, + "key: {} value: {} info: {:?}", + array_bytes::bytes2hex("0x", &self.key), + array_bytes::bytes2hex("0x", self.raw.clone().unwrap_or_default()), + self.info ) } } @@ -96,7 +109,6 @@ impl core::fmt::Display for TryDecodeEntireStorageError { fn decode_storage_info( info: StorageInfo, ) -> Result> { - let mut next_key = info.prefix.clone(); let mut decoded = 0; let decode_key = |key: &[u8]| match sp_io::storage::get(key) { @@ -104,29 +116,39 @@ fn decode_storage_info( Some(bytes) => { let len = bytes.len(); let _ = ::decode_all(&mut bytes.as_ref()).map_err(|_| { - vec![TryDecodeEntireStorageError { + TryDecodeEntireStorageError { key: key.to_vec(), raw: Some(bytes.to_vec()), info: info.clone(), - }] + } })?; - Ok::>(len) + Ok::(len) }, }; - decoded += decode_key(&next_key)?; + let mut errors = vec![]; + let mut next_key = Some(info.prefix.clone()); loop { - match sp_io::storage::next_key(&next_key) { + match next_key { Some(key) if key.starts_with(&info.prefix) => { - decoded += decode_key(&key)?; - next_key = key; + match decode_key(&key) { + Ok(bytes) => { + decoded += bytes; + }, + Err(e) => errors.push(e), + }; + next_key = sp_io::storage::next_key(&key); }, _ => break, } } - Ok(decoded) + if errors.is_empty() { + Ok(decoded) + } else { + Err(errors) + } } impl TryDecodeEntireStorage @@ -353,6 +375,12 @@ mod tests { // two bytes, cannot be decoded into u32. sp_io::storage::set(&Map::hashed_key_for(2), &[0u8, 1]); assert!(Map::try_decode_entire_state().is_err()); + assert_eq!(Map::try_decode_entire_state().unwrap_err().len(), 1); + + // multiple errs in the same map are be detected + sp_io::storage::set(&Map::hashed_key_for(3), &[0u8, 1]); + assert!(Map::try_decode_entire_state().is_err()); + assert_eq!(Map::try_decode_entire_state().unwrap_err().len(), 2); }) } -- GitLab From b4c816665bd094b6ad703f1d11291c49bf66408f Mon Sep 17 00:00:00 2001 From: Juan Girini Date: Sun, 24 Dec 2023 09:03:37 +0100 Subject: [PATCH 088/191] Remove rustdocs allowances (#2797) Closes https://github.com/paritytech/polkadot-sdk-docs/issues/65 --- docs/sdk/src/lib.rs | 2 -- docs/sdk/src/polkadot_sdk/polkadot.rs | 6 +++--- docs/sdk/src/polkadot_sdk/smart_contracts.rs | 4 ++-- docs/sdk/src/polkadot_sdk/substrate.rs | 2 +- docs/sdk/src/polkadot_sdk/xcm.rs | 2 +- docs/sdk/src/reference_docs/frame_benchmarking_weight.rs | 2 +- docs/sdk/src/reference_docs/frame_currency.rs | 2 +- docs/sdk/src/reference_docs/light_nodes.rs | 4 ++-- 8 files changed, 11 insertions(+), 13 deletions(-) diff --git a/docs/sdk/src/lib.rs b/docs/sdk/src/lib.rs index b0abb50b52d..075d9ddaffe 100644 --- a/docs/sdk/src/lib.rs +++ b/docs/sdk/src/lib.rs @@ -23,8 +23,6 @@ //! //! This section paints a picture over the high-level information architecture of this crate. #![doc = simple_mermaid::mermaid!("../../mermaid/IA.mmd")] -#![allow(rustdoc::invalid_html_tags)] // TODO: remove later. https://github.com/paritytech/polkadot-sdk-docs/issues/65 -#![allow(rustdoc::bare_urls)] // TODO: remove later. https://github.com/paritytech/polkadot-sdk-docs/issues/65 #![warn(rustdoc::broken_intra_doc_links)] #![warn(rustdoc::private_intra_doc_links)] diff --git a/docs/sdk/src/polkadot_sdk/polkadot.rs b/docs/sdk/src/polkadot_sdk/polkadot.rs index d157a660e56..056d7dd1cca 100644 --- a/docs/sdk/src/polkadot_sdk/polkadot.rs +++ b/docs/sdk/src/polkadot_sdk/polkadot.rs @@ -50,7 +50,7 @@ //! correct execution of all parachain, without having all of its validators re-execute all //! parachain blocks. When seen from this perspective, the fact that Polkadot executes different //! parachains means it is a platform that has fully delivered (the holy grail of) "Full Execution -//! Sharding". TODO: link to approval checking article. https://github.com/paritytech/polkadot-sdk-docs/issues/66 +//! Sharding". TODO: link to approval checking article. //! * A framework to build blockchains: In order to materialize the ecosystem of parachains, an easy //! blockchain framework must exist. This is [Substrate](crate::polkadot_sdk::substrate), //! [FRAME](crate::polkadot_sdk::frame_runtime) and [Cumulus](crate::polkadot_sdk::cumulus). @@ -60,7 +60,7 @@ //! //! > Note that the interoperability promised by Polkadot is unparalleled in that any two parachains //! > connected to Polkadot have the same security and can have much better guarantees about the -//! > security of the recipient of any message. TODO: weakest link in bridges systems. https://github.com/paritytech/polkadot-sdk-docs/issues/66 +//! > security of the recipient of any message. TODO: weakest link in bridges systems. //! //! Polkadot delivers the above vision, alongside a flexible means for parachains to schedule //! themselves with the Relay Chain. To achieve this, Polkadot has been developed with an @@ -84,4 +84,4 @@ //! - RFC#5: [Coretime-interface](https://github.com/polkadot-fellows/RFCs/blob/main/text/0005-coretime-interface.md): //! Interface for manipulating the usage of cores on the Polkadot Ubiquitous Computer. // TODO: add more context and explanations about Polkadot as the Ubiquitous Computer and related -// tech. https://github.com/paritytech/polkadot-sdk-docs/issues/66 +// tech. diff --git a/docs/sdk/src/polkadot_sdk/smart_contracts.rs b/docs/sdk/src/polkadot_sdk/smart_contracts.rs index a4916f9c921..4052c785f41 100644 --- a/docs/sdk/src/polkadot_sdk/smart_contracts.rs +++ b/docs/sdk/src/polkadot_sdk/smart_contracts.rs @@ -1,9 +1,9 @@ //! # Smart Contracts //! -//! TODO: @cmichi https://github.com/paritytech/polkadot-sdk-docs/issues/56 +//! TODO: @cmichi //! //! - WASM and EVM based, pallet-contracts and pallet-evm. //! - single-daap-chain, transition from ink! to FRAME. //! - Link to `use.ink` //! - Link to [`crate::reference_docs::runtime_vs_smart_contract`]. -//! - https://use.ink/migrate-ink-contracts-to-polkadot-frame-parachain/ +//! - diff --git a/docs/sdk/src/polkadot_sdk/substrate.rs b/docs/sdk/src/polkadot_sdk/substrate.rs index fd172f71469..5021c55e581 100644 --- a/docs/sdk/src/polkadot_sdk/substrate.rs +++ b/docs/sdk/src/polkadot_sdk/substrate.rs @@ -143,7 +143,7 @@ //! - [`sc_consensus_aura`] //! - [`sc_consensus_babe`] //! - [`sc_consensus_grandpa`] -//! - [`sc_consensus_beefy`] (TODO: @adrian, add some high level docs https://github.com/paritytech/polkadot-sdk-docs/issues/57) +//! - [`sc_consensus_beefy`] (TODO: @adrian, add some high level docs ) //! - [`sc_consensus_manual_seal`] //! - [`sc_consensus_pow`] diff --git a/docs/sdk/src/polkadot_sdk/xcm.rs b/docs/sdk/src/polkadot_sdk/xcm.rs index 0d600f751c8..fd4d7f62aa7 100644 --- a/docs/sdk/src/polkadot_sdk/xcm.rs +++ b/docs/sdk/src/polkadot_sdk/xcm.rs @@ -2,4 +2,4 @@ //! //! @KiChjang @franciscoaguirre //! TODO: RFCs, xcm-spec, the future of the repo, minimal example perhaps, forward to where actual -//! docs are hosted. https://github.com/paritytech/polkadot-sdk-docs/issues/58 +//! docs are hosted. diff --git a/docs/sdk/src/reference_docs/frame_benchmarking_weight.rs b/docs/sdk/src/reference_docs/frame_benchmarking_weight.rs index f65f4174ec6..7ebad37ecad 100644 --- a/docs/sdk/src/reference_docs/frame_benchmarking_weight.rs +++ b/docs/sdk/src/reference_docs/frame_benchmarking_weight.rs @@ -20,4 +20,4 @@ //! - how to write benchmarks, how you must think of worst case. //! - how to run benchmarks. //! -//! - https://www.shawntabrizi.com/substrate/substrate-storage-deep-dive/ +//! - diff --git a/docs/sdk/src/reference_docs/frame_currency.rs b/docs/sdk/src/reference_docs/frame_currency.rs index ba181373062..6987d51aec8 100644 --- a/docs/sdk/src/reference_docs/frame_currency.rs +++ b/docs/sdk/src/reference_docs/frame_currency.rs @@ -5,4 +5,4 @@ //! - History, `Currency` trait. //! - `Hold` and `Freeze` with diagram. //! - `HoldReason` and `FreezeReason` -//! - This footgun: https://github.com/paritytech/polkadot-sdk/pull/1900#discussion_r1363783609 +//! - This footgun: diff --git a/docs/sdk/src/reference_docs/light_nodes.rs b/docs/sdk/src/reference_docs/light_nodes.rs index a6a0a828ef5..d6670bf03ab 100644 --- a/docs/sdk/src/reference_docs/light_nodes.rs +++ b/docs/sdk/src/reference_docs/light_nodes.rs @@ -3,5 +3,5 @@ //! //! Notes: should contain only high level information about light clients, then link to how to set //! it up in PAPI and SubXT -//! https://docs.substrate.io/learn/light-clients-in-substrate-connect/ -//! https://github.com/substrate-developer-hub/substrate-front-end-template/pull/277 +//! +//! -- GitLab From ac14d36514d9157121bffeb1ee4791c07d79c606 Mon Sep 17 00:00:00 2001 From: Anwesh Date: Tue, 26 Dec 2023 02:43:29 +0530 Subject: [PATCH 089/191] Update rust docs link in README.md (#2794) Co-authored-by: Liam Aharon --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1f255823b5b..b94376b35ab 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ currently contains runtimes for the Polkadot, Kusama, Westend, and Rococo networ relocated to the [`runtimes`](https://github.com/polkadot-fellows/runtimes/) repository. ## [Substrate](./substrate/) - [![SubstrateRustDocs](https://img.shields.io/badge/Rust_Docs-Substrate-24CC85?logo=rust)](https://paritytech.github.io/substrate/master/substrate/index.html) + [![SubstrateRustDocs](https://img.shields.io/badge/Rust_Docs-Substrate-24CC85?logo=rust)](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/polkadot_sdk/substrate/index.html) [![Substrate-license](https://img.shields.io/badge/License-GPL3%2FApache2.0-blue)](./substrate/README.md#LICENSE) Substrate is the primary blockchain SDK used by developers to create the parachains that make up the Polkadot network. @@ -30,7 +30,7 @@ Additionally, it allows for the development of self-sovereign blockchains that o Polkadot. ## [Cumulus](./cumulus/) -[![CumulusRustDocs](https://img.shields.io/badge/Rust_Docs-Cumulus-222222?logo=rust)](https://paritytech.github.io/cumulus/cumulus_client_collator/index.html) +[![CumulusRustDocs](https://img.shields.io/badge/Rust_Docs-Cumulus-222222?logo=rust)](https://paritytech.github.io/polkadot-sdk/master/polkadot_sdk_docs/polkadot_sdk/cumulus/index.html) [![Cumulus-license](https://img.shields.io/badge/License-GPL3-blue)](./cumulus/LICENSE) Cumulus is a set of tools for writing Substrate-based Polkadot parachains. -- GitLab From 56849c37b54d9b6cca8f569080b201b36a7630e3 Mon Sep 17 00:00:00 2001 From: cuteolaf Date: Tue, 26 Dec 2023 14:28:01 -0800 Subject: [PATCH 090/191] Fix typo in comments (#2807) fix typos in the comments of `pallet-broker` --- substrate/frame/broker/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/substrate/frame/broker/src/lib.rs b/substrate/frame/broker/src/lib.rs index 38a50490054..a669463aa02 100644 --- a/substrate/frame/broker/src/lib.rs +++ b/substrate/frame/broker/src/lib.rs @@ -627,7 +627,7 @@ pub mod pallet { /// - `origin`: Must be a Signed origin of the account which owns the Region `region_id`. /// - `region_id`: The Region which should become two interlaced Regions of incomplete /// regularity. - /// - `pivot`: The interlace mask of on of the two new regions (the other it its partial + /// - `pivot`: The interlace mask of one of the two new regions (the other is its partial /// complement). #[pallet::call_index(9)] pub fn interlace( -- GitLab From 7070b65d76ba7e99ea17b5506b4f1aa1d7545e4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Tue, 26 Dec 2023 23:28:29 +0100 Subject: [PATCH 091/191] xcm: Improve debuggability (#2799) Adds more logging to the XCM execution for better debugging. --- Cargo.lock | 1 + .../coretime/coretime-rococo/src/lib.rs | 2 +- polkadot/xcm/Cargo.toml | 1 + polkadot/xcm/src/double_encoded.rs | 2 +- .../xcm-builder/src/process_xcm_message.rs | 72 +++- polkadot/xcm/xcm-builder/src/tests/mock.rs | 1 + polkadot/xcm/xcm-executor/src/lib.rs | 381 ++++++++++-------- prdoc/pr_2799.prdoc | 10 + substrate/primitives/runtime/src/traits.rs | 2 +- 9 files changed, 292 insertions(+), 180 deletions(-) create mode 100644 prdoc/pr_2799.prdoc diff --git a/Cargo.lock b/Cargo.lock index f56868d72d2..01a67a8031d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -19143,6 +19143,7 @@ version = "1.0.0" name = "staging-xcm" version = "1.0.0" dependencies = [ + "array-bytes 6.1.0", "bounded-collections", "derivative", "environmental", diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs index 2e7889ca012..2d50a17c3f1 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs @@ -121,7 +121,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("coretime-rococo"), impl_name: create_runtime_str!("coretime-rococo"), authoring_version: 1, - spec_version: 1_005_002, + spec_version: 1_005_003, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 0, diff --git a/polkadot/xcm/Cargo.toml b/polkadot/xcm/Cargo.toml index 235a4b204c9..024e788b871 100644 --- a/polkadot/xcm/Cargo.toml +++ b/polkadot/xcm/Cargo.toml @@ -10,6 +10,7 @@ license.workspace = true workspace = true [dependencies] +array-bytes = "6.1" bounded-collections = { version = "0.1.9", default-features = false, features = ["serde"] } derivative = { version = "2.2.0", default-features = false, features = ["use_core"] } impl-trait-for-tuples = "0.2.2" diff --git a/polkadot/xcm/src/double_encoded.rs b/polkadot/xcm/src/double_encoded.rs index 45856f657d1..320cccf9b1f 100644 --- a/polkadot/xcm/src/double_encoded.rs +++ b/polkadot/xcm/src/double_encoded.rs @@ -47,7 +47,7 @@ impl Eq for DoubleEncoded {} impl core::fmt::Debug for DoubleEncoded { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { - self.encoded.fmt(f) + array_bytes::bytes2hex("0x", &self.encoded).fmt(f) } } diff --git a/polkadot/xcm/xcm-builder/src/process_xcm_message.rs b/polkadot/xcm/xcm-builder/src/process_xcm_message.rs index 330ff40aac0..7334bcd2010 100644 --- a/polkadot/xcm/xcm-builder/src/process_xcm_message.rs +++ b/polkadot/xcm/xcm-builder/src/process_xcm_message.rs @@ -16,16 +16,15 @@ //! Implementation of `ProcessMessage` for an `ExecuteXcm` implementation. -use frame_support::{ - ensure, - traits::{ProcessMessage, ProcessMessageError}, -}; +use frame_support::traits::{ProcessMessage, ProcessMessageError}; use parity_scale_codec::{Decode, FullCodec, MaxEncodedLen}; use scale_info::TypeInfo; use sp_std::{fmt::Debug, marker::PhantomData}; use sp_weights::{Weight, WeightMeter}; use xcm::prelude::*; +const LOG_TARGET: &str = "xcm::process-message"; + /// A message processor that delegates execution to an `XcmExecutor`. pub struct ProcessXcmMessage( PhantomData<(MessageOrigin, XcmExecutor, Call)>, @@ -45,21 +44,68 @@ impl< meter: &mut WeightMeter, id: &mut XcmHash, ) -> Result { - let versioned_message = VersionedXcm::::decode(&mut &message[..]) - .map_err(|_| ProcessMessageError::Corrupt)?; - let message = Xcm::::try_from(versioned_message) - .map_err(|_| ProcessMessageError::Unsupported)?; - let pre = XcmExecutor::prepare(message).map_err(|_| ProcessMessageError::Unsupported)?; + let versioned_message = VersionedXcm::::decode(&mut &message[..]).map_err(|e| { + log::trace!( + target: LOG_TARGET, + "`VersionedXcm` failed to decode: {e:?}", + ); + + ProcessMessageError::Corrupt + })?; + let message = Xcm::::try_from(versioned_message).map_err(|_| { + log::trace!( + target: LOG_TARGET, + "Failed to convert `VersionedXcm` into `XcmV3`.", + ); + + ProcessMessageError::Unsupported + })?; + let pre = XcmExecutor::prepare(message).map_err(|_| { + log::trace!( + target: LOG_TARGET, + "Failed to prepare message.", + ); + + ProcessMessageError::Unsupported + })?; // The worst-case weight: let required = pre.weight_of(); - ensure!(meter.can_consume(required), ProcessMessageError::Overweight(required)); + if !meter.can_consume(required) { + log::trace!( + target: LOG_TARGET, + "Xcm required {required} more than remaining {}", + meter.remaining(), + ); + + return Err(ProcessMessageError::Overweight(required)) + } let (consumed, result) = match XcmExecutor::execute(origin.into(), pre, id, Weight::zero()) { - Outcome::Complete(w) => (w, Ok(true)), - Outcome::Incomplete(w, _) => (w, Ok(false)), + Outcome::Complete(w) => { + log::trace!( + target: LOG_TARGET, + "XCM message execution complete, used weight: {w}", + ); + (w, Ok(true)) + }, + Outcome::Incomplete(w, e) => { + log::trace!( + target: LOG_TARGET, + "XCM message execution incomplete, used weight: {w}, error: {e:?}", + ); + + (w, Ok(false)) + }, // In the error-case we assume the worst case and consume all possible weight. - Outcome::Error(_) => (required, Err(ProcessMessageError::Unsupported)), + Outcome::Error(e) => { + log::trace!( + target: LOG_TARGET, + "XCM message execution error: {e:?}", + ); + + (required, Err(ProcessMessageError::Unsupported)) + }, }; meter.consume(consumed); result diff --git a/polkadot/xcm/xcm-builder/src/tests/mock.rs b/polkadot/xcm/xcm-builder/src/tests/mock.rs index 843c39bbfeb..c1b3f0cf224 100644 --- a/polkadot/xcm/xcm-builder/src/tests/mock.rs +++ b/polkadot/xcm/xcm-builder/src/tests/mock.rs @@ -48,6 +48,7 @@ pub use xcm_executor::{ Assets, Config, }; +#[derive(Debug)] pub enum TestOrigin { Root, Relay, diff --git a/polkadot/xcm/xcm-executor/src/lib.rs b/polkadot/xcm/xcm-executor/src/lib.rs index ac256ea1489..665b051c130 100644 --- a/polkadot/xcm/xcm-executor/src/lib.rs +++ b/polkadot/xcm/xcm-executor/src/lib.rs @@ -24,7 +24,7 @@ use frame_support::{ use parity_scale_codec::{Decode, Encode}; use sp_core::defer; use sp_io::hashing::blake2_128; -use sp_std::{marker::PhantomData, prelude::*}; +use sp_std::{fmt::Debug, marker::PhantomData, prelude::*}; use sp_weights::Weight; use xcm::latest::prelude::*; @@ -199,10 +199,7 @@ impl ExecuteXcm for XcmExecutor ExecuteXcm for XcmExecutor ExecuteXcm for XcmExecutor XcmExecutor { } } - #[cfg(feature = "runtime-benchmarks")] - pub fn bench_process(&mut self, xcm: Xcm) -> Result<(), ExecutorError> { - self.process(xcm) - } - - fn process(&mut self, xcm: Xcm) -> Result<(), ExecutorError> { - log::trace!( - target: "xcm::process", - "origin: {:?}, total_surplus/refunded: {:?}/{:?}, error_handler_weight: {:?}", - self.origin_ref(), - self.total_surplus, - self.total_refunded, - self.error_handler_weight, - ); - let mut result = Ok(()); - for (i, instr) in xcm.0.into_iter().enumerate() { - match &mut result { - r @ Ok(()) => { - // Initialize the recursion count only the first time we hit this code in our - // potential recursive execution. - let inst_res = recursion_count::using_once(&mut 1, || { - recursion_count::with(|count| { - if *count > RECURSION_LIMIT { - return Err(XcmError::ExceedsStackLimit) - } - *count = count.saturating_add(1); - Ok(()) - }) - // This should always return `Some`, but let's play it safe. - .unwrap_or(Ok(()))?; - - // Ensure that we always decrement the counter whenever we finish processing - // the instruction. - defer! { - recursion_count::with(|count| { - *count = count.saturating_sub(1); - }); - } - - self.process_instruction(instr) - }); - if let Err(e) = inst_res { - log::trace!(target: "xcm::execute", "!!! ERROR: {:?}", e); - *r = Err(ExecutorError { - index: i as u32, - xcm_error: e, - weight: Weight::zero(), - }); - } - }, - Err(ref mut error) => - if let Ok(x) = Config::Weigher::instr_weight(&instr) { - error.weight.saturating_accrue(x) - }, - } - } - result - } - /// Execute any final operations after having executed the XCM message. /// This includes refunding surplus weight, trapping extra holding funds, and returning any /// errors during execution. @@ -468,6 +403,154 @@ impl XcmExecutor { Ok(()) } + fn take_fee(&mut self, fee: MultiAssets, reason: FeeReason) -> XcmResult { + if Config::FeeManager::is_waived(self.origin_ref(), reason) { + return Ok(()) + } + log::trace!( + target: "xcm::fees", + "taking fee: {:?} from origin_ref: {:?} in fees_mode: {:?} for a reason: {:?}", + fee, + self.origin_ref(), + self.fees_mode, + reason, + ); + let paid = if self.fees_mode.jit_withdraw { + let origin = self.origin_ref().ok_or(XcmError::BadOrigin)?; + for asset in fee.inner() { + Config::AssetTransactor::withdraw_asset(&asset, origin, Some(&self.context))?; + } + fee + } else { + self.holding.try_take(fee.into()).map_err(|_| XcmError::NotHoldingFees)?.into() + }; + Config::FeeManager::handle_fee(paid, Some(&self.context), reason); + Ok(()) + } + + /// Calculates what `local_querier` would be from the perspective of `destination`. + fn to_querier( + local_querier: Option, + destination: &MultiLocation, + ) -> Result, XcmError> { + Ok(match local_querier { + None => None, + Some(q) => Some( + q.reanchored(&destination, Config::UniversalLocation::get()) + .map_err(|_| XcmError::ReanchorFailed)?, + ), + }) + } + + /// Send a bare `QueryResponse` message containing `response` informed by the given `info`. + /// + /// The `local_querier` argument is the querier (if any) specified from the *local* perspective. + fn respond( + &mut self, + local_querier: Option, + response: Response, + info: QueryResponseInfo, + fee_reason: FeeReason, + ) -> Result { + let querier = Self::to_querier(local_querier, &info.destination)?; + let QueryResponseInfo { destination, query_id, max_weight } = info; + let instruction = QueryResponse { query_id, response, max_weight, querier }; + let message = Xcm(vec![instruction]); + self.send(destination, message, fee_reason) + } + + fn try_reanchor( + asset: MultiAsset, + destination: &MultiLocation, + ) -> Result<(MultiAsset, InteriorMultiLocation), XcmError> { + let reanchor_context = Config::UniversalLocation::get(); + let asset = asset + .reanchored(&destination, reanchor_context) + .map_err(|()| XcmError::ReanchorFailed)?; + Ok((asset, reanchor_context)) + } + + fn try_reanchor_multilocation( + location: MultiLocation, + destination: &MultiLocation, + ) -> Result<(MultiLocation, InteriorMultiLocation), XcmError> { + let reanchor_context = Config::UniversalLocation::get(); + let location = location + .reanchored(&destination, reanchor_context) + .map_err(|_| XcmError::ReanchorFailed)?; + Ok((location, reanchor_context)) + } + + /// NOTE: Any assets which were unable to be reanchored are introduced into `failed_bin`. + fn reanchored( + mut assets: Assets, + dest: &MultiLocation, + maybe_failed_bin: Option<&mut Assets>, + ) -> MultiAssets { + let reanchor_context = Config::UniversalLocation::get(); + assets.reanchor(dest, reanchor_context, maybe_failed_bin); + assets.into_assets_iter().collect::>().into() + } + + #[cfg(feature = "runtime-benchmarks")] + pub fn bench_process(&mut self, xcm: Xcm) -> Result<(), ExecutorError> { + self.process(xcm) + } + + fn process(&mut self, xcm: Xcm) -> Result<(), ExecutorError> { + log::trace!( + target: "xcm::process", + "origin: {:?}, total_surplus/refunded: {:?}/{:?}, error_handler_weight: {:?}", + self.origin_ref(), + self.total_surplus, + self.total_refunded, + self.error_handler_weight, + ); + let mut result = Ok(()); + for (i, instr) in xcm.0.into_iter().enumerate() { + match &mut result { + r @ Ok(()) => { + // Initialize the recursion count only the first time we hit this code in our + // potential recursive execution. + let inst_res = recursion_count::using_once(&mut 1, || { + recursion_count::with(|count| { + if *count > RECURSION_LIMIT { + return Err(XcmError::ExceedsStackLimit) + } + *count = count.saturating_add(1); + Ok(()) + }) + // This should always return `Some`, but let's play it safe. + .unwrap_or(Ok(()))?; + + // Ensure that we always decrement the counter whenever we finish processing + // the instruction. + defer! { + recursion_count::with(|count| { + *count = count.saturating_sub(1); + }); + } + + self.process_instruction(instr) + }); + if let Err(e) = inst_res { + log::trace!(target: "xcm::execute", "!!! ERROR: {:?}", e); + *r = Err(ExecutorError { + index: i as u32, + xcm_error: e, + weight: Weight::zero(), + }); + } + }, + Err(ref mut error) => + if let Ok(x) = Config::Weigher::instr_weight(&instr) { + error.weight.saturating_accrue(x) + }, + } + } + result + } + /// Process a single XCM instruction, mutating the state of the XCM virtual machine. fn process_instruction( &mut self, @@ -551,22 +634,81 @@ impl XcmExecutor { }, Transact { origin_kind, require_weight_at_most, mut call } => { // We assume that the Relay-chain is allowed to use transact on this parachain. - let origin = *self.origin_ref().ok_or(XcmError::BadOrigin)?; + let origin = *self.origin_ref().ok_or_else(|| { + log::trace!( + target: "xcm::process_instruction::transact", + "No origin provided", + ); + + XcmError::BadOrigin + })?; // TODO: #2841 #TRANSACTFILTER allow the trait to issue filters for the relay-chain - let message_call = call.take_decoded().map_err(|_| XcmError::FailedToDecode)?; - ensure!(Config::SafeCallFilter::contains(&message_call), XcmError::NoPermission); + let message_call = call.take_decoded().map_err(|_| { + log::trace!( + target: "xcm::process_instruction::transact", + "Failed to decode call", + ); + + XcmError::FailedToDecode + })?; + + log::trace!( + target: "xcm::process_instruction::transact", + "Processing call: {message_call:?}", + ); + + if !Config::SafeCallFilter::contains(&message_call) { + log::trace!( + target: "xcm::process_instruction::transact", + "Call filtered by `SafeCallFilter`", + ); + + return Err(XcmError::NoPermission) + } + let dispatch_origin = Config::OriginConverter::convert_origin(origin, origin_kind) - .map_err(|_| XcmError::BadOrigin)?; + .map_err(|_| { + log::trace!( + target: "xcm::process_instruction::transact", + "Failed to convert origin {origin:?} and origin kind {origin_kind:?} to a local origin." + ); + + XcmError::BadOrigin + })?; + + log::trace!( + target: "xcm::process_instruction::transact", + "Dispatching with origin: {dispatch_origin:?}", + ); + let weight = message_call.get_dispatch_info().weight; - ensure!(weight.all_lte(require_weight_at_most), XcmError::MaxWeightInvalid); + + if !weight.all_lte(require_weight_at_most) { + log::trace!( + target: "xcm::process_instruction::transact", + "Max {weight} bigger than require at most {require_weight_at_most}", + ); + + return Err(XcmError::MaxWeightInvalid) + } + let maybe_actual_weight = match Config::CallDispatcher::dispatch(message_call, dispatch_origin) { Ok(post_info) => { + log::trace!( + target: "xcm::process_instruction::transact", + "Dispatch successful: {post_info:?}" + ); self.transact_status = MaybeErrorCode::Success; post_info.actual_weight }, Err(error_and_info) => { + log::trace!( + target: "xcm::process_instruction::transact", + "Dispatch failed {error_and_info:?}" + ); + self.transact_status = error_and_info.error.encode().into(); error_and_info.post_info.actual_weight }, @@ -946,93 +1088,4 @@ impl XcmExecutor { HrmpChannelClosing { .. } => Err(XcmError::Unimplemented), } } - - fn take_fee(&mut self, fee: MultiAssets, reason: FeeReason) -> XcmResult { - if Config::FeeManager::is_waived(self.origin_ref(), reason) { - return Ok(()) - } - log::trace!( - target: "xcm::fees", - "taking fee: {:?} from origin_ref: {:?} in fees_mode: {:?} for a reason: {:?}", - fee, - self.origin_ref(), - self.fees_mode, - reason, - ); - let paid = if self.fees_mode.jit_withdraw { - let origin = self.origin_ref().ok_or(XcmError::BadOrigin)?; - for asset in fee.inner() { - Config::AssetTransactor::withdraw_asset(&asset, origin, Some(&self.context))?; - } - fee - } else { - self.holding.try_take(fee.into()).map_err(|_| XcmError::NotHoldingFees)?.into() - }; - Config::FeeManager::handle_fee(paid, Some(&self.context), reason); - Ok(()) - } - - /// Calculates what `local_querier` would be from the perspective of `destination`. - fn to_querier( - local_querier: Option, - destination: &MultiLocation, - ) -> Result, XcmError> { - Ok(match local_querier { - None => None, - Some(q) => Some( - q.reanchored(&destination, Config::UniversalLocation::get()) - .map_err(|_| XcmError::ReanchorFailed)?, - ), - }) - } - - /// Send a bare `QueryResponse` message containing `response` informed by the given `info`. - /// - /// The `local_querier` argument is the querier (if any) specified from the *local* perspective. - fn respond( - &mut self, - local_querier: Option, - response: Response, - info: QueryResponseInfo, - fee_reason: FeeReason, - ) -> Result { - let querier = Self::to_querier(local_querier, &info.destination)?; - let QueryResponseInfo { destination, query_id, max_weight } = info; - let instruction = QueryResponse { query_id, response, max_weight, querier }; - let message = Xcm(vec![instruction]); - self.send(destination, message, fee_reason) - } - - fn try_reanchor( - asset: MultiAsset, - destination: &MultiLocation, - ) -> Result<(MultiAsset, InteriorMultiLocation), XcmError> { - let reanchor_context = Config::UniversalLocation::get(); - let asset = asset - .reanchored(&destination, reanchor_context) - .map_err(|()| XcmError::ReanchorFailed)?; - Ok((asset, reanchor_context)) - } - - fn try_reanchor_multilocation( - location: MultiLocation, - destination: &MultiLocation, - ) -> Result<(MultiLocation, InteriorMultiLocation), XcmError> { - let reanchor_context = Config::UniversalLocation::get(); - let location = location - .reanchored(&destination, reanchor_context) - .map_err(|_| XcmError::ReanchorFailed)?; - Ok((location, reanchor_context)) - } - - /// NOTE: Any assets which were unable to be reanchored are introduced into `failed_bin`. - fn reanchored( - mut assets: Assets, - dest: &MultiLocation, - maybe_failed_bin: Option<&mut Assets>, - ) -> MultiAssets { - let reanchor_context = Config::UniversalLocation::get(); - assets.reanchor(dest, reanchor_context, maybe_failed_bin); - assets.into_assets_iter().collect::>().into() - } } diff --git a/prdoc/pr_2799.prdoc b/prdoc/pr_2799.prdoc new file mode 100644 index 00000000000..436dea643e2 --- /dev/null +++ b/prdoc/pr_2799.prdoc @@ -0,0 +1,10 @@ +title: Improve XCM debuggability + +doc: + - audience: Runtime User + description: | + Adds more logging to XCM execution to improve its debuggability. + +crates: + - name: "staging-xcm-builder" + - name: "staging-xcm-executor" diff --git a/substrate/primitives/runtime/src/traits.rs b/substrate/primitives/runtime/src/traits.rs index 2ac4047a80b..ad82419cb8b 100644 --- a/substrate/primitives/runtime/src/traits.rs +++ b/substrate/primitives/runtime/src/traits.rs @@ -1438,7 +1438,7 @@ pub trait Dispatchable { /// Every function call from your runtime has an origin, which specifies where the extrinsic was /// generated from. In the case of a signed extrinsic (transaction), the origin contains an /// identifier for the caller. The origin can be empty in the case of an inherent extrinsic. - type RuntimeOrigin; + type RuntimeOrigin: Debug; /// ... type Config; /// An opaque set of information attached to the transaction. This could be constructed anywhere -- GitLab From dcbc36a1c4debf8a4a2714fb5dcf0454dfa31249 Mon Sep 17 00:00:00 2001 From: eskimor Date: Wed, 27 Dec 2023 14:17:59 +0100 Subject: [PATCH 092/191] Saner weights + lease calcuation fix. (#2778) And have proper benchmarks. --------- Co-authored-by: eskimor Co-authored-by: command-bot <> Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> --- .../coretime/coretime-rococo/src/lib.rs | 2 +- .../src/weights/pallet_broker.rs | 256 ++++++++++-------- polkadot/runtime/common/src/slots/mod.rs | 20 +- .../runtime/parachains/src/coretime/mod.rs | 4 +- polkadot/runtime/rococo/src/lib.rs | 39 +-- substrate/frame/broker/src/benchmarking.rs | 11 + 6 files changed, 175 insertions(+), 157 deletions(-) diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs index 2d50a17c3f1..95709117578 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs @@ -121,7 +121,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("coretime-rococo"), impl_name: create_runtime_str!("coretime-rococo"), authoring_version: 1, - spec_version: 1_005_003, + spec_version: 1_005_004, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 0, diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_broker.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_broker.rs index 3cc51a247f7..665b84e32cc 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_broker.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_broker.rs @@ -17,22 +17,23 @@ //! Autogenerated weights for `pallet_broker` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-12-07, STEPS: `2`, REPEAT: `1`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-12-22, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `dagda.local`, CPU: `` +//! HOSTNAME: `runner-q7z7ruxr-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-rococo-dev")`, DB CACHE: 1024 // Executed Command: -// target/release/polkadot-parachain +// target/production/polkadot-parachain // benchmark // pallet -// --chain=coretime-rococo-dev +// --steps=50 +// --repeat=20 +// --extrinsic=* // --wasm-execution=compiled +// --heap-pages=4096 +// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json // --pallet=pallet_broker -// --extrinsic=* -// --steps=2 -// --repeat=1 -// --json +// --chain=coretime-rococo-dev // --header=./cumulus/file_header.txt // --output=./cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/ @@ -53,71 +54,77 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_000_000 picoseconds. - Weight::from_parts(4_000_000, 0) + // Minimum execution time: 2_403_000 picoseconds. + Weight::from_parts(2_504_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: `Broker::Reservations` (r:1 w:1) - /// Proof: `Broker::Reservations` (`max_values`: Some(1), `max_size`: Some(6011), added: 6506, mode: `MaxEncodedLen`) + /// Proof: `Broker::Reservations` (`max_values`: Some(1), `max_size`: Some(12021), added: 12516, mode: `MaxEncodedLen`) fn reserve() -> Weight { // Proof Size summary in bytes: - // Measured: `4878` - // Estimated: `7496` - // Minimum execution time: 31_000_000 picoseconds. - Weight::from_parts(31_000_000, 0) - .saturating_add(Weight::from_parts(0, 7496)) + // Measured: `10888` + // Estimated: `13506` + // Minimum execution time: 22_025_000 picoseconds. + Weight::from_parts(22_799_000, 0) + .saturating_add(Weight::from_parts(0, 13506)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: `Broker::Reservations` (r:1 w:1) - /// Proof: `Broker::Reservations` (`max_values`: Some(1), `max_size`: Some(6011), added: 6506, mode: `MaxEncodedLen`) + /// Proof: `Broker::Reservations` (`max_values`: Some(1), `max_size`: Some(12021), added: 12516, mode: `MaxEncodedLen`) fn unreserve() -> Weight { // Proof Size summary in bytes: - // Measured: `6080` - // Estimated: `7496` - // Minimum execution time: 24_000_000 picoseconds. - Weight::from_parts(24_000_000, 0) - .saturating_add(Weight::from_parts(0, 7496)) + // Measured: `12090` + // Estimated: `13506` + // Minimum execution time: 21_012_000 picoseconds. + Weight::from_parts(21_567_000, 0) + .saturating_add(Weight::from_parts(0, 13506)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: `Broker::Leases` (r:1 w:1) - /// Proof: `Broker::Leases` (`max_values`: Some(1), `max_size`: Some(41), added: 536, mode: `MaxEncodedLen`) + /// Proof: `Broker::Leases` (`max_values`: Some(1), `max_size`: Some(401), added: 896, mode: `MaxEncodedLen`) + /// Storage: `ParachainSystem::ValidationData` (r:1 w:0) + /// Proof: `ParachainSystem::ValidationData` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn set_lease() -> Weight { // Proof Size summary in bytes: - // Measured: `101` - // Estimated: `1526` - // Minimum execution time: 12_000_000 picoseconds. - Weight::from_parts(12_000_000, 0) - .saturating_add(Weight::from_parts(0, 1526)) - .saturating_add(T::DbWeight::get().reads(1)) + // Measured: `466` + // Estimated: `1951` + // Minimum execution time: 10_767_000 picoseconds. + Weight::from_parts(11_364_000, 0) + .saturating_add(Weight::from_parts(0, 1951)) + .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: `Broker::Configuration` (r:1 w:0) /// Proof: `Broker::Configuration` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`) + /// Storage: `ParachainSystem::ValidationData` (r:1 w:0) + /// Proof: `ParachainSystem::ValidationData` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// Storage: `Broker::InstaPoolIo` (r:3 w:3) /// Proof: `Broker::InstaPoolIo` (`max_values`: None, `max_size`: Some(28), added: 2503, mode: `MaxEncodedLen`) /// Storage: `Broker::Reservations` (r:1 w:0) - /// Proof: `Broker::Reservations` (`max_values`: Some(1), `max_size`: Some(6011), added: 6506, mode: `MaxEncodedLen`) + /// Proof: `Broker::Reservations` (`max_values`: Some(1), `max_size`: Some(12021), added: 12516, mode: `MaxEncodedLen`) /// Storage: `Broker::Leases` (r:1 w:1) - /// Proof: `Broker::Leases` (`max_values`: Some(1), `max_size`: Some(41), added: 536, mode: `MaxEncodedLen`) + /// Proof: `Broker::Leases` (`max_values`: Some(1), `max_size`: Some(401), added: 896, mode: `MaxEncodedLen`) /// Storage: `Broker::SaleInfo` (r:0 w:1) /// Proof: `Broker::SaleInfo` (`max_values`: Some(1), `max_size`: Some(57), added: 552, mode: `MaxEncodedLen`) /// Storage: `Broker::Status` (r:0 w:1) /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) - /// Storage: `Broker::Workplan` (r:0 w:10) + /// Storage: `Broker::Workplan` (r:0 w:60) /// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 1000]`. - fn start_sales(_n: u32, ) -> Weight { + fn start_sales(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `6192` - // Estimated: `8499` - // Minimum execution time: 55_000_000 picoseconds. - Weight::from_parts(57_000_000, 0) - .saturating_add(Weight::from_parts(0, 8499)) - .saturating_add(T::DbWeight::get().reads(6)) - .saturating_add(T::DbWeight::get().writes(16)) + // Measured: `12567` + // Estimated: `14052` + // Minimum execution time: 112_187_000 picoseconds. + Weight::from_parts(115_233_014, 0) + .saturating_add(Weight::from_parts(0, 14052)) + // Standard Error: 162 + .saturating_add(Weight::from_parts(539, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(66)) } /// Storage: `Broker::Status` (r:1 w:0) /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) @@ -131,8 +138,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `316` // Estimated: `3593` - // Minimum execution time: 40_000_000 picoseconds. - Weight::from_parts(40_000_000, 0) + // Minimum execution time: 32_469_000 picoseconds. + Weight::from_parts(33_443_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) @@ -153,8 +160,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `434` // Estimated: `4698` - // Minimum execution time: 58_000_000 picoseconds. - Weight::from_parts(58_000_000, 0) + // Minimum execution time: 59_488_000 picoseconds. + Weight::from_parts(64_711_000, 0) .saturating_add(Weight::from_parts(0, 4698)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(4)) @@ -165,8 +172,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `357` // Estimated: `3550` - // Minimum execution time: 19_000_000 picoseconds. - Weight::from_parts(19_000_000, 0) + // Minimum execution time: 13_370_000 picoseconds. + Weight::from_parts(13_938_000, 0) .saturating_add(Weight::from_parts(0, 3550)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -177,8 +184,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `357` // Estimated: `3550` - // Minimum execution time: 15_000_000 picoseconds. - Weight::from_parts(15_000_000, 0) + // Minimum execution time: 14_592_000 picoseconds. + Weight::from_parts(15_235_000, 0) .saturating_add(Weight::from_parts(0, 3550)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -189,8 +196,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `357` // Estimated: `3550` - // Minimum execution time: 15_000_000 picoseconds. - Weight::from_parts(15_000_000, 0) + // Minimum execution time: 14_880_000 picoseconds. + Weight::from_parts(15_274_000, 0) .saturating_add(Weight::from_parts(0, 3550)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -205,10 +212,10 @@ impl pallet_broker::WeightInfo for WeightInfo { /// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`) fn assign() -> Weight { // Proof Size summary in bytes: - // Measured: `602` + // Measured: `936` // Estimated: `4681` - // Minimum execution time: 25_000_000 picoseconds. - Weight::from_parts(25_000_000, 0) + // Minimum execution time: 24_786_000 picoseconds. + Weight::from_parts(26_047_000, 0) .saturating_add(Weight::from_parts(0, 4681)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -225,10 +232,10 @@ impl pallet_broker::WeightInfo for WeightInfo { /// Proof: `Broker::InstaPoolContribution` (`max_values`: None, `max_size`: Some(68), added: 2543, mode: `MaxEncodedLen`) fn pool() -> Weight { // Proof Size summary in bytes: - // Measured: `637` + // Measured: `1002` // Estimated: `5996` - // Minimum execution time: 38_000_000 picoseconds. - Weight::from_parts(38_000_000, 0) + // Minimum execution time: 31_159_000 picoseconds. + Weight::from_parts(31_770_000, 0) .saturating_add(Weight::from_parts(0, 5996)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(5)) @@ -240,15 +247,19 @@ impl pallet_broker::WeightInfo for WeightInfo { /// Storage: `System::Account` (r:2 w:2) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// The range of component `m` is `[1, 3]`. - fn claim_revenue(_m: u32, ) -> Weight { + fn claim_revenue(m: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `721` - // Estimated: `8550` - // Minimum execution time: 65_000_000 picoseconds. - Weight::from_parts(67_000_000, 0) - .saturating_add(Weight::from_parts(0, 8550)) - .saturating_add(T::DbWeight::get().reads(6)) + // Measured: `652` + // Estimated: `6196 + m * (2520 ±0)` + // Minimum execution time: 56_524_000 picoseconds. + Weight::from_parts(58_065_019, 0) + .saturating_add(Weight::from_parts(0, 6196)) + // Standard Error: 41_840 + .saturating_add(Weight::from_parts(1_322_201, 0).saturating_mul(m.into())) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(m.into()))) .saturating_add(T::DbWeight::get().writes(5)) + .saturating_add(Weight::from_parts(0, 2520).saturating_mul(m.into())) } /// Storage: `System::Account` (r:1 w:1) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) @@ -264,11 +275,11 @@ impl pallet_broker::WeightInfo for WeightInfo { /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn purchase_credit() -> Weight { // Proof Size summary in bytes: - // Measured: `284` - // Estimated: `3749` - // Minimum execution time: 64_000_000 picoseconds. - Weight::from_parts(64_000_000, 0) - .saturating_add(Weight::from_parts(0, 3749)) + // Measured: `215` + // Estimated: `3680` + // Minimum execution time: 60_923_000 picoseconds. + Weight::from_parts(62_721_000, 0) + .saturating_add(Weight::from_parts(0, 3680)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(3)) } @@ -280,8 +291,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `465` // Estimated: `3550` - // Minimum execution time: 34_000_000 picoseconds. - Weight::from_parts(34_000_000, 0) + // Minimum execution time: 39_683_000 picoseconds. + Weight::from_parts(55_799_000, 0) .saturating_add(Weight::from_parts(0, 3550)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -296,8 +307,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `463` // Estimated: `3533` - // Minimum execution time: 47_000_000 picoseconds. - Weight::from_parts(47_000_000, 0) + // Minimum execution time: 90_833_000 picoseconds. + Weight::from_parts(97_249_000, 0) .saturating_add(Weight::from_parts(0, 3533)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) @@ -312,10 +323,10 @@ impl pallet_broker::WeightInfo for WeightInfo { /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn drop_history() -> Weight { // Proof Size summary in bytes: - // Measured: `692` + // Measured: `857` // Estimated: `3593` - // Minimum execution time: 40_000_000 picoseconds. - Weight::from_parts(40_000_000, 0) + // Minimum execution time: 93_311_000 picoseconds. + Weight::from_parts(105_496_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(1)) @@ -326,10 +337,10 @@ impl pallet_broker::WeightInfo for WeightInfo { /// Proof: `Broker::AllowedRenewals` (`max_values`: None, `max_size`: Some(1233), added: 3708, mode: `MaxEncodedLen`) fn drop_renewal() -> Weight { // Proof Size summary in bytes: - // Measured: `387` + // Measured: `957` // Estimated: `4698` - // Minimum execution time: 24_000_000 picoseconds. - Weight::from_parts(24_000_000, 0) + // Minimum execution time: 44_597_000 picoseconds. + Weight::from_parts(48_739_000, 0) .saturating_add(Weight::from_parts(0, 4698)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -345,26 +356,28 @@ impl pallet_broker::WeightInfo for WeightInfo { /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `n` is `[0, 1000]`. - fn request_core_count(_n: u32, ) -> Weight { + fn request_core_count(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `74` // Estimated: `3539` - // Minimum execution time: 26_000_000 picoseconds. - Weight::from_parts(27_000_000, 0) + // Minimum execution time: 22_114_000 picoseconds. + Weight::from_parts(23_031_633, 0) .saturating_add(Weight::from_parts(0, 3539)) + // Standard Error: 60 + .saturating_add(Weight::from_parts(60, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: UNKNOWN KEY `0x18194fcb5c1fcace44d2d0a004272614` (r:1 w:1) - /// Proof: UNKNOWN KEY `0x18194fcb5c1fcace44d2d0a004272614` (r:1 w:1) + /// Storage: `Broker::CoreCountInbox` (r:1 w:1) + /// Proof: `Broker::CoreCountInbox` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 1000]`. fn process_core_count(_n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `26` - // Estimated: `3491` - // Minimum execution time: 6_000_000 picoseconds. - Weight::from_parts(9_000_000, 0) - .saturating_add(Weight::from_parts(0, 3491)) + // Measured: `266` + // Estimated: `1487` + // Minimum execution time: 6_020_000 picoseconds. + Weight::from_parts(6_540_421, 0) + .saturating_add(Weight::from_parts(0, 1487)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -376,10 +389,10 @@ impl pallet_broker::WeightInfo for WeightInfo { /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) fn process_revenue() -> Weight { // Proof Size summary in bytes: - // Measured: `515` + // Measured: `447` // Estimated: `6196` - // Minimum execution time: 49_000_000 picoseconds. - Weight::from_parts(49_000_000, 0) + // Minimum execution time: 38_744_000 picoseconds. + Weight::from_parts(40_572_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(3)) @@ -387,23 +400,23 @@ impl pallet_broker::WeightInfo for WeightInfo { /// Storage: `Broker::InstaPoolIo` (r:3 w:3) /// Proof: `Broker::InstaPoolIo` (`max_values`: None, `max_size`: Some(28), added: 2503, mode: `MaxEncodedLen`) /// Storage: `Broker::Reservations` (r:1 w:0) - /// Proof: `Broker::Reservations` (`max_values`: Some(1), `max_size`: Some(6011), added: 6506, mode: `MaxEncodedLen`) + /// Proof: `Broker::Reservations` (`max_values`: Some(1), `max_size`: Some(12021), added: 12516, mode: `MaxEncodedLen`) /// Storage: `Broker::Leases` (r:1 w:1) - /// Proof: `Broker::Leases` (`max_values`: Some(1), `max_size`: Some(41), added: 536, mode: `MaxEncodedLen`) + /// Proof: `Broker::Leases` (`max_values`: Some(1), `max_size`: Some(401), added: 896, mode: `MaxEncodedLen`) /// Storage: `Broker::SaleInfo` (r:0 w:1) /// Proof: `Broker::SaleInfo` (`max_values`: Some(1), `max_size`: Some(57), added: 552, mode: `MaxEncodedLen`) - /// Storage: `Broker::Workplan` (r:0 w:10) + /// Storage: `Broker::Workplan` (r:0 w:60) /// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 1000]`. fn rotate_sale(_n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `6143` - // Estimated: `8499` - // Minimum execution time: 44_000_000 picoseconds. - Weight::from_parts(47_000_000, 0) - .saturating_add(Weight::from_parts(0, 8499)) + // Measured: `12514` + // Estimated: `13506` + // Minimum execution time: 94_727_000 picoseconds. + Weight::from_parts(97_766_746, 0) + .saturating_add(Weight::from_parts(0, 13506)) .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(T::DbWeight::get().writes(15)) + .saturating_add(T::DbWeight::get().writes(65)) } /// Storage: `Broker::InstaPoolIo` (r:1 w:0) /// Proof: `Broker::InstaPoolIo` (`max_values`: None, `max_size`: Some(28), added: 2503, mode: `MaxEncodedLen`) @@ -413,8 +426,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `42` // Estimated: `3493` - // Minimum execution time: 7_000_000 picoseconds. - Weight::from_parts(7_000_000, 0) + // Minimum execution time: 6_496_000 picoseconds. + Weight::from_parts(6_757_000, 0) .saturating_add(Weight::from_parts(0, 3493)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -437,8 +450,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `1321` // Estimated: `4786` - // Minimum execution time: 40_000_000 picoseconds. - Weight::from_parts(40_000_000, 0) + // Minimum execution time: 33_164_000 picoseconds. + Weight::from_parts(33_800_000, 0) .saturating_add(Weight::from_parts(0, 4786)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(4)) @@ -457,31 +470,42 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `74` // Estimated: `3539` - // Minimum execution time: 19_000_000 picoseconds. - Weight::from_parts(19_000_000, 0) + // Minimum execution time: 16_884_000 picoseconds. + Weight::from_parts(17_315_000, 0) .saturating_add(Weight::from_parts(0, 3539)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } + /// Storage: `Broker::CoreCountInbox` (r:0 w:1) + /// Proof: `Broker::CoreCountInbox` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) + /// The range of component `n` is `[0, 1000]`. fn notify_core_count() -> Weight { - T::DbWeight::get().reads_writes(1, 1) + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 2_017_000 picoseconds. + Weight::from_parts(2_210_693, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: `Broker::Status` (r:1 w:1) /// Proof: `Broker::Status` (`max_values`: Some(1), `max_size`: Some(18), added: 513, mode: `MaxEncodedLen`) /// Storage: `Broker::Configuration` (r:1 w:0) /// Proof: `Broker::Configuration` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`) - /// Storage: UNKNOWN KEY `0x18194fcb5c1fcace44d2d0a004272614` (r:1 w:1) - /// Proof: UNKNOWN KEY `0x18194fcb5c1fcace44d2d0a004272614` (r:1 w:1) + /// Storage: `Broker::CoreCountInbox` (r:1 w:0) + /// Proof: `Broker::CoreCountInbox` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) /// Storage: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1) /// Proof: UNKNOWN KEY `0xf308d869daf021a7724e69c557dd8dbe` (r:1 w:1) + /// Storage: `ParachainSystem::ValidationData` (r:1 w:0) + /// Proof: `ParachainSystem::ValidationData` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn do_tick_base() -> Weight { // Proof Size summary in bytes: - // Measured: `351` - // Estimated: `3816` - // Minimum execution time: 12_000_000 picoseconds. - Weight::from_parts(12_000_000, 0) - .saturating_add(Weight::from_parts(0, 3816)) - .saturating_add(T::DbWeight::get().reads(4)) - .saturating_add(T::DbWeight::get().writes(3)) + // Measured: `398` + // Estimated: `3863` + // Minimum execution time: 12_118_000 picoseconds. + Weight::from_parts(12_541_000, 0) + .saturating_add(Weight::from_parts(0, 3863)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(2)) } } diff --git a/polkadot/runtime/common/src/slots/mod.rs b/polkadot/runtime/common/src/slots/mod.rs index 6a8cddd8d91..58bd1d53aed 100644 --- a/polkadot/runtime/common/src/slots/mod.rs +++ b/polkadot/runtime/common/src/slots/mod.rs @@ -326,18 +326,6 @@ impl Pallet { tracker.into_iter().collect() } - - /// Current lease index and how many blocks we are already in. - pub fn lease_period_index_plus_progress( - b: BlockNumberFor, - ) -> Option<(>>::LeasePeriod, BlockNumberFor)> { - // Note that blocks before `LeaseOffset` do not count as any lease period. - let offset_block_now = b.checked_sub(&T::LeaseOffset::get())?; - let lease_period = offset_block_now / T::LeasePeriod::get(); - let in_lease = offset_block_now % T::LeasePeriod::get(); - - Some((lease_period, in_lease)) - } } impl crate::traits::OnSwap for Pallet { @@ -461,8 +449,12 @@ impl Leaser> for Pallet { } fn lease_period_index(b: BlockNumberFor) -> Option<(Self::LeasePeriod, bool)> { - Self::lease_period_index_plus_progress(b) - .map(|(period, progress)| (period, progress.is_zero())) + // Note that blocks before `LeaseOffset` do not count as any lease period. + let offset_block_now = b.checked_sub(&T::LeaseOffset::get())?; + let lease_period = offset_block_now / T::LeasePeriod::get(); + let at_begin = (offset_block_now % T::LeasePeriod::get()).is_zero(); + + Some((lease_period, at_begin)) } fn already_leased( diff --git a/polkadot/runtime/parachains/src/coretime/mod.rs b/polkadot/runtime/parachains/src/coretime/mod.rs index b0e40a13233..8da6ccf07ca 100644 --- a/polkadot/runtime/parachains/src/coretime/mod.rs +++ b/polkadot/runtime/parachains/src/coretime/mod.rs @@ -245,7 +245,9 @@ impl OnNewSession> for Pallet { fn mk_coretime_call(call: crate::coretime::CoretimeCalls) -> Instruction<()> { Instruction::Transact { origin_kind: OriginKind::Superuser, - require_weight_at_most: Weight::from_parts(1000000000, 200000), + // Largest call is set_lease with 1526 byte: + // Longest call is reserve() with 31_000_000 + require_weight_at_most: Weight::from_parts(100_000_000, 20_000), call: BrokerRuntimePallets::Broker(call).encode().into(), } } diff --git a/polkadot/runtime/rococo/src/lib.rs b/polkadot/runtime/rococo/src/lib.rs index a15911c21f6..4d0e537f6db 100644 --- a/polkadot/runtime/rococo/src/lib.rs +++ b/polkadot/runtime/rococo/src/lib.rs @@ -37,8 +37,9 @@ use runtime_common::{ impls::{ LocatableAssetConverter, ToAuthor, VersionedLocatableAsset, VersionedMultiLocationConverter, }, - paras_registrar, paras_sudo_wrapper, prod_or_fast, slots, BlockHashCount, BlockLength, - SlowAdjustingFeeUpdate, + paras_registrar, paras_sudo_wrapper, prod_or_fast, slots, + traits::Leaser, + BlockHashCount, BlockLength, SlowAdjustingFeeUpdate, }; use scale_info::TypeInfo; use sp_std::{cmp::Ordering, collections::btree_map::BTreeMap, prelude::*}; @@ -1494,7 +1495,6 @@ pub mod migrations { use frame_support::traits::LockIdentifier; use frame_system::pallet_prelude::BlockNumberFor; - use sp_arithmetic::traits::Zero; #[cfg(feature = "try-runtime")] use sp_core::crypto::ByteArray; @@ -1502,28 +1502,17 @@ pub mod migrations { impl coretime::migration::GetLegacyLease for GetLegacyLeaseImpl { fn get_parachain_lease_in_blocks(para: ParaId) -> Option { let now = frame_system::Pallet::::block_number(); - let mut leases = slots::Pallet::::lease(para).into_iter(); - let initial_sum = if let Some(Some(_)) = leases.next() { - let (_, progress) = - slots::Pallet::::lease_period_index_plus_progress(now)?; - LeasePeriod::get().saturating_sub(progress) - } else { - // The parachain lease did not yet start - Zero::zero() - }; - log::trace!( - target: "coretime-migration", - "Getting lease info for para {:?}:\n LEASE_PERIOD: {:?}, initial_sum: {:?}, number of leases: {:?}", - para, - LeasePeriod::get(), - initial_sum, - slots::Pallet::::lease(para).len(), - ); - - Some(leases.into_iter().fold(initial_sum, |sum, lease| { - // If the parachain lease did not yet start, we ignore them by multiplying by `0`. - sum + LeasePeriod::get() * lease.map_or(0, |_| 1) - })) + let lease = slots::Pallet::::lease(para); + if lease.is_empty() { + return None + } + // Lease not yet started, ignore: + if lease.iter().any(Option::is_none) { + return None + } + let (index, _) = + as Leaser>::lease_period_index(now)?; + Some(index.saturating_add(lease.len() as u32).saturating_mul(LeasePeriod::get())) } } diff --git a/substrate/frame/broker/src/benchmarking.rs b/substrate/frame/broker/src/benchmarking.rs index c57c4ccb8ce..70f488e998c 100644 --- a/substrate/frame/broker/src/benchmarking.rs +++ b/substrate/frame/broker/src/benchmarking.rs @@ -885,6 +885,17 @@ mod benches { T::Coretime::request_revenue_info_at(rc_block); } } + #[benchmark] + fn notify_core_count() -> Result<(), BenchmarkError> { + let admin_origin = + T::AdminOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; + + #[extrinsic_call] + _(admin_origin as T::RuntimeOrigin, 100); + + assert!(CoreCountInbox::::take().is_some()); + Ok(()) + } #[benchmark] fn do_tick_base() -> Result<(), BenchmarkError> { -- GitLab From 5c0b8e0bb59f79acaf16012d428b81b06f0cefc1 Mon Sep 17 00:00:00 2001 From: Serban Iorga Date: Wed, 27 Dec 2023 18:18:33 +0100 Subject: [PATCH 093/191] BEEFY: Support compatibility with Warp Sync - Allow Warp Sync for Validators (#2689) Resolves https://github.com/paritytech/polkadot-sdk/issues/2627 Initializes voter _after_ headers sync finishes in the background. This enables the BEEFY gadget to work with `--sync warp` (GRANDPA warp sync). Co-authored-by: Adrian Catangiu --- polkadot/cli/src/command.rs | 19 +-- prdoc/pr_2689.prdoc | 13 ++ substrate/client/consensus/beefy/Cargo.toml | 3 +- .../beefy/src/communication/gossip.rs | 6 +- .../client/consensus/beefy/src/import.rs | 10 ++ substrate/client/consensus/beefy/src/lib.rs | 128 +++++++++++++----- substrate/client/consensus/beefy/src/round.rs | 8 +- substrate/client/consensus/beefy/src/tests.rs | 23 ++-- .../client/consensus/beefy/src/worker.rs | 14 +- 9 files changed, 152 insertions(+), 72 deletions(-) create mode 100644 prdoc/pr_2689.prdoc diff --git a/polkadot/cli/src/command.rs b/polkadot/cli/src/command.rs index 018400fbcf8..9290ec584e4 100644 --- a/polkadot/cli/src/command.rs +++ b/polkadot/cli/src/command.rs @@ -17,7 +17,7 @@ use crate::cli::{Cli, Subcommand, NODE_VERSION}; use frame_benchmarking_cli::{BenchmarkCmd, ExtrinsicFactory, SUBSTRATE_REFERENCE_HARDWARE}; use futures::future::TryFutureExt; -use log::{info, warn}; +use log::info; use sc_cli::SubstrateCli; use service::{ self, @@ -196,22 +196,7 @@ where let chain_spec = &runner.config().chain_spec; // By default, enable BEEFY on all networks, unless explicitly disabled through CLI. - let mut enable_beefy = !cli.run.no_beefy; - // BEEFY doesn't (yet) support warp sync: - // Until we implement https://github.com/paritytech/substrate/issues/14756 - // - disallow warp sync for validators, - // - disable BEEFY when warp sync for non-validators. - if enable_beefy && runner.config().network.sync_mode.is_warp() { - if runner.config().role.is_authority() { - return Err(Error::Other( - "Warp sync not supported for validator nodes running BEEFY.".into(), - )) - } else { - // disable BEEFY for non-validator nodes that are warp syncing - warn!("🥩 BEEFY not supported when warp syncing. Disabling BEEFY."); - enable_beefy = false; - } - } + let enable_beefy = !cli.run.no_beefy; set_default_ss58_version(chain_spec); diff --git a/prdoc/pr_2689.prdoc b/prdoc/pr_2689.prdoc new file mode 100644 index 00000000000..847c3e8026c --- /dev/null +++ b/prdoc/pr_2689.prdoc @@ -0,0 +1,13 @@ +# Schema: Parity PR Documentation Schema (prdoc) +# See doc at https://github.com/paritytech/prdoc + +title: BEEFY: Support compatibility with Warp Sync - Allow Warp Sync for Validators + +doc: + - audience: Node Operator + description: | + BEEFY can now sync itself even when using Warp Sync to sync the node. This removes the limitation of not + being able to run BEEFY when warp syncing. Validators are now again able to warp sync. + +crates: + - name: sc-consensus-beefy diff --git a/substrate/client/consensus/beefy/Cargo.toml b/substrate/client/consensus/beefy/Cargo.toml index 1736929e9b4..1570dc744ed 100644 --- a/substrate/client/consensus/beefy/Cargo.toml +++ b/substrate/client/consensus/beefy/Cargo.toml @@ -39,11 +39,12 @@ sp-core = { path = "../../../primitives/core" } sp-keystore = { path = "../../../primitives/keystore" } sp-mmr-primitives = { path = "../../../primitives/merkle-mountain-range" } sp-runtime = { path = "../../../primitives/runtime" } +tokio = "1.22.0" + [dev-dependencies] serde = "1.0.193" tempfile = "3.1.0" -tokio = "1.22.0" sc-block-builder = { path = "../../block-builder" } sc-network-test = { path = "../../network/test" } sp-consensus-grandpa = { path = "../../../primitives/consensus/grandpa" } diff --git a/substrate/client/consensus/beefy/src/communication/gossip.rs b/substrate/client/consensus/beefy/src/communication/gossip.rs index 342cd0511a5..645a10b2a1d 100644 --- a/substrate/client/consensus/beefy/src/communication/gossip.rs +++ b/substrate/client/consensus/beefy/src/communication/gossip.rs @@ -260,7 +260,11 @@ where /// /// Only votes for `set_id` and rounds `start <= round <= end` will be accepted. pub(crate) fn update_filter(&self, filter: GossipFilterCfg) { - debug!(target: LOG_TARGET, "🥩 New gossip filter {:?}", filter); + debug!( + target: LOG_TARGET, + "🥩 New gossip filter: start {:?}, end {:?}, validator set id {:?}", + filter.start, filter.end, filter.validator_set.id() + ); self.gossip_filter.write().update(filter); } diff --git a/substrate/client/consensus/beefy/src/import.rs b/substrate/client/consensus/beefy/src/import.rs index 5b2abb20ace..5bbf07fba70 100644 --- a/substrate/client/consensus/beefy/src/import.rs +++ b/substrate/client/consensus/beefy/src/import.rs @@ -142,6 +142,16 @@ where // Run inner block import. let inner_import_result = self.inner.import_block(block).await?; + match self.backend.state_at(hash) { + Ok(_) => {}, + Err(_) => { + // The block is imported as part of some chain sync. + // The voter doesn't need to process it now. + // It will be detected and processed as part of the voter state init. + return Ok(inner_import_result); + }, + } + match (beefy_encoded, &inner_import_result) { (Some(encoded), ImportResult::Imported(_)) => { match self.decode_and_verify(&encoded, number, hash) { diff --git a/substrate/client/consensus/beefy/src/lib.rs b/substrate/client/consensus/beefy/src/lib.rs index e6224cbf3e9..51e82b6a811 100644 --- a/substrate/client/consensus/beefy/src/lib.rs +++ b/substrate/client/consensus/beefy/src/lib.rs @@ -33,7 +33,7 @@ use crate::{ worker::PersistedState, }; use futures::{stream::Fuse, StreamExt}; -use log::{debug, error, info}; +use log::{debug, error, info, warn}; use parking_lot::Mutex; use prometheus::Registry; use sc_client_api::{Backend, BlockBackend, BlockchainEvents, FinalityNotifications, Finalizer}; @@ -56,6 +56,7 @@ use std::{ collections::{BTreeMap, VecDeque}, marker::PhantomData, sync::Arc, + time::Duration, }; mod aux_schema; @@ -78,6 +79,8 @@ mod tests; const LOG_TARGET: &str = "beefy"; +const HEADER_SYNC_DELAY: Duration = Duration::from_secs(60); + /// A convenience BEEFY client trait that defines all the type bounds a BEEFY client /// has to satisfy. Ideally that should actually be a trait alias. Unfortunately as /// of today, Rust does not allow a type alias to be used as a trait bound. Tracking @@ -292,21 +295,29 @@ pub async fn start_beefy_gadget( // select recoverable errors. loop { // Wait for BEEFY pallet to be active before starting voter. - let persisted_state = match wait_for_runtime_pallet( + let (beefy_genesis, best_grandpa) = match wait_for_runtime_pallet( &*runtime, &mut beefy_comms.gossip_engine, &mut finality_notifications, ) .await - .and_then(|(beefy_genesis, best_grandpa)| { - load_or_init_voter_state( - &*backend, - &*runtime, - beefy_genesis, - best_grandpa, - min_block_delta, - ) - }) { + { + Ok(res) => res, + Err(e) => { + error!(target: LOG_TARGET, "Error: {:?}. Terminating.", e); + return + }, + }; + + let persisted_state = match load_or_init_voter_state( + &*backend, + &*runtime, + beefy_genesis, + best_grandpa, + min_block_delta, + ) + .await + { Ok(state) => state, Err(e) => { error!(target: LOG_TARGET, "Error: {:?}. Terminating.", e); @@ -357,7 +368,7 @@ pub async fn start_beefy_gadget( } } -fn load_or_init_voter_state( +async fn load_or_init_voter_state( backend: &BE, runtime: &R, beefy_genesis: NumberFor, @@ -371,28 +382,70 @@ where R::Api: BeefyApi, { // Initialize voter state from AUX DB if compatible. - crate::aux_schema::load_persistent(backend)? + if let Some(mut state) = crate::aux_schema::load_persistent(backend)? // Verify state pallet genesis matches runtime. .filter(|state| state.pallet_genesis() == beefy_genesis) - .and_then(|mut state| { - // Overwrite persisted state with current best GRANDPA block. - state.set_best_grandpa(best_grandpa.clone()); - // Overwrite persisted data with newly provided `min_block_delta`. - state.set_min_block_delta(min_block_delta); - info!(target: LOG_TARGET, "🥩 Loading BEEFY voter state from db: {:?}.", state); - Some(Ok(state)) - }) - // No valid voter-state persisted, re-initialize from pallet genesis. - .unwrap_or_else(|| { - initialize_voter_state(backend, runtime, beefy_genesis, best_grandpa, min_block_delta) - }) + { + // Overwrite persisted state with current best GRANDPA block. + state.set_best_grandpa(best_grandpa.clone()); + // Overwrite persisted data with newly provided `min_block_delta`. + state.set_min_block_delta(min_block_delta); + info!(target: LOG_TARGET, "🥩 Loading BEEFY voter state from db: {:?}.", state); + + // Make sure that all the headers that we need have been synced. + let mut header = best_grandpa.clone(); + while *header.number() > state.best_beefy() { + header = + wait_for_parent_header(backend.blockchain(), header, HEADER_SYNC_DELAY).await?; + } + return Ok(state); + } + + // No valid voter-state persisted, re-initialize from pallet genesis. + initialize_voter_state(backend, runtime, beefy_genesis, best_grandpa, min_block_delta).await +} + +/// Waits until the parent header of `current` is available and returns it. +/// +/// When the node uses GRANDPA warp sync it initially downloads only the mandatory GRANDPA headers. +/// The rest of the headers (gap sync) are lazily downloaded later. But the BEEFY voter also needs +/// the headers in range `[beefy_genesis..=best_grandpa]` to be available. This helper method +/// enables us to wait until these headers have been synced. +async fn wait_for_parent_header( + blockchain: &BC, + current: ::Header, + delay: Duration, +) -> ClientResult<::Header> +where + B: Block, + BC: BlockchainBackend, +{ + if *current.number() == Zero::zero() { + let msg = format!("header {} is Genesis, there is no parent for it", current.hash()); + warn!(target: LOG_TARGET, "{}", msg); + return Err(ClientError::UnknownBlock(msg)) + } + loop { + match blockchain.header(*current.parent_hash())? { + Some(parent) => return Ok(parent), + None => { + info!( + target: LOG_TARGET, + "🥩 Parent of header number {} not found. \ + BEEFY gadget waiting for header sync to finish ...", + current.number() + ); + tokio::time::sleep(delay).await; + }, + } + } } // If no persisted state present, walk back the chain from first GRANDPA notification to either: // - latest BEEFY finalized block, or if none found on the way, // - BEEFY pallet genesis; // Enqueue any BEEFY mandatory blocks (session boundaries) found on the way, for voter to finalize. -fn initialize_voter_state( +async fn initialize_voter_state( backend: &BE, runtime: &R, beefy_genesis: NumberFor, @@ -405,6 +458,8 @@ where R: ProvideRuntimeApi, R::Api: BeefyApi, { + let blockchain = backend.blockchain(); + let beefy_genesis = runtime .runtime_api() .beefy_genesis(best_grandpa.hash()) @@ -414,7 +469,6 @@ where .ok_or_else(|| ClientError::Backend("BEEFY pallet expected to be active.".into()))?; // Walk back the imported blocks and initialize voter either, at the last block with // a BEEFY justification, or at pallet genesis block; voter will resume from there. - let blockchain = backend.blockchain(); let mut sessions = VecDeque::new(); let mut header = best_grandpa.clone(); let state = loop { @@ -432,7 +486,7 @@ where let best_beefy = *header.number(); // If no session boundaries detected so far, just initialize new rounds here. if sessions.is_empty() { - let active_set = expect_validator_set(runtime, backend, &header)?; + let active_set = expect_validator_set(runtime, backend, &header).await?; let mut rounds = Rounds::new(best_beefy, active_set); // Mark the round as already finalized. rounds.conclude(best_beefy); @@ -451,7 +505,7 @@ where if *header.number() == beefy_genesis { // We've reached BEEFY genesis, initialize voter here. - let genesis_set = expect_validator_set(runtime, backend, &header)?; + let genesis_set = expect_validator_set(runtime, backend, &header).await?; info!( target: LOG_TARGET, "🥩 Loading BEEFY voter state from genesis on what appears to be first startup. \ @@ -481,7 +535,7 @@ where } // Move up the chain. - header = blockchain.expect_header(*header.parent_hash())?; + header = wait_for_parent_header(blockchain, header, HEADER_SYNC_DELAY).await?; }; aux_schema::write_current_version(backend)?; @@ -532,7 +586,12 @@ where Err(ClientError::Backend(err_msg)) } -fn expect_validator_set( +/// Provides validator set active `at_header`. It tries to get it from state, otherwise falls +/// back to walk up the chain looking the validator set enactment in header digests. +/// +/// Note: function will `async::sleep()` when walking back the chain if some needed header hasn't +/// been synced yet (as it happens when warp syncing when headers are synced in the background). +async fn expect_validator_set( runtime: &R, backend: &BE, at_header: &B::Header, @@ -550,15 +609,16 @@ where debug!(target: LOG_TARGET, "🥩 Trying to find validator set active at header: {:?}", at_header); let mut header = at_header.clone(); loop { + debug!(target: LOG_TARGET, "🥩 Looking for auth set change at block number: {:?}", *header.number()); if let Ok(Some(active)) = runtime.runtime_api().validator_set(header.hash()) { return Ok(active) } else { - debug!(target: LOG_TARGET, "🥩 Looking for auth set change at block number: {:?}", *header.number()); match worker::find_authorities_change::(&header) { Some(active) => return Ok(active), // Move up the chain. Ultimately we'll get it from chain genesis state, or error out - // here. - None => header = blockchain.expect_header(*header.parent_hash())?, + // there. + None => + header = wait_for_parent_header(blockchain, header, HEADER_SYNC_DELAY).await?, } } } diff --git a/substrate/client/consensus/beefy/src/round.rs b/substrate/client/consensus/beefy/src/round.rs index 6f400ce4784..47414c60fdb 100644 --- a/substrate/client/consensus/beefy/src/round.rs +++ b/substrate/client/consensus/beefy/src/round.rs @@ -19,7 +19,7 @@ use crate::LOG_TARGET; use codec::{Decode, Encode}; -use log::debug; +use log::{debug, info}; use sp_consensus_beefy::{ ecdsa_crypto::{AuthorityId, Signature}, Commitment, EquivocationProof, SignedCommitment, ValidatorSet, ValidatorSetId, VoteMessage, @@ -194,7 +194,11 @@ where self.previous_votes.retain(|&(_, number), _| number > round_num); self.mandatory_done = self.mandatory_done || round_num == self.session_start; self.best_done = self.best_done.max(Some(round_num)); - debug!(target: LOG_TARGET, "🥩 Concluded round #{}", round_num); + if round_num == self.session_start { + info!(target: LOG_TARGET, "🥩 Concluded mandatory round #{}", round_num); + } else { + debug!(target: LOG_TARGET, "🥩 Concluded optional round #{}", round_num); + } } } diff --git a/substrate/client/consensus/beefy/src/tests.rs b/substrate/client/consensus/beefy/src/tests.rs index 3f800166e26..17065432564 100644 --- a/substrate/client/consensus/beefy/src/tests.rs +++ b/substrate/client/consensus/beefy/src/tests.rs @@ -378,7 +378,7 @@ async fn voter_init_setup( ); let (beefy_genesis, best_grandpa) = wait_for_runtime_pallet(api, &mut gossip_engine, finality).await.unwrap(); - load_or_init_voter_state(&*backend, api, beefy_genesis, best_grandpa, 1) + load_or_init_voter_state(&*backend, api, beefy_genesis, best_grandpa, 1).await } // Spawns beefy voters. Returns a future to spawn on the runtime. @@ -1026,7 +1026,7 @@ async fn should_initialize_voter_at_genesis() { assert_eq!(rounds.validator_set_id(), validator_set.id()); // verify next vote target is mandatory block 1 - assert_eq!(persisted_state.best_beefy_block(), 0); + assert_eq!(persisted_state.best_beefy(), 0); assert_eq!(persisted_state.best_grandpa_number(), 13); assert_eq!(persisted_state.voting_oracle().voting_target(), Some(1)); @@ -1072,8 +1072,9 @@ async fn should_initialize_voter_at_custom_genesis() { ); let (beefy_genesis, best_grandpa) = wait_for_runtime_pallet(&api, &mut gossip_engine, &mut finality).await.unwrap(); - let persisted_state = - load_or_init_voter_state(&*backend, &api, beefy_genesis, best_grandpa, 1).unwrap(); + let persisted_state = load_or_init_voter_state(&*backend, &api, beefy_genesis, best_grandpa, 1) + .await + .unwrap(); // Test initialization at session boundary. // verify voter initialized with single session starting at block `custom_pallet_genesis` (7) @@ -1085,7 +1086,7 @@ async fn should_initialize_voter_at_custom_genesis() { assert_eq!(rounds.validator_set_id(), validator_set.id()); // verify next vote target is mandatory block 7 - assert_eq!(persisted_state.best_beefy_block(), 0); + assert_eq!(persisted_state.best_beefy(), 0); assert_eq!(persisted_state.best_grandpa_number(), 8); assert_eq!(persisted_state.voting_oracle().voting_target(), Some(custom_pallet_genesis)); @@ -1107,7 +1108,9 @@ async fn should_initialize_voter_at_custom_genesis() { let (beefy_genesis, best_grandpa) = wait_for_runtime_pallet(&api, &mut gossip_engine, &mut finality).await.unwrap(); let new_persisted_state = - load_or_init_voter_state(&*backend, &api, beefy_genesis, best_grandpa, 1).unwrap(); + load_or_init_voter_state(&*backend, &api, beefy_genesis, best_grandpa, 1) + .await + .unwrap(); // verify voter initialized with single session starting at block `new_pallet_genesis` (10) let sessions = new_persisted_state.voting_oracle().sessions(); @@ -1118,7 +1121,7 @@ async fn should_initialize_voter_at_custom_genesis() { assert_eq!(rounds.validator_set_id(), new_validator_set.id()); // verify next vote target is mandatory block 10 - assert_eq!(new_persisted_state.best_beefy_block(), 0); + assert_eq!(new_persisted_state.best_beefy(), 0); assert_eq!(new_persisted_state.best_grandpa_number(), 10); assert_eq!(new_persisted_state.voting_oracle().voting_target(), Some(new_pallet_genesis)); @@ -1171,7 +1174,7 @@ async fn should_initialize_voter_when_last_final_is_session_boundary() { assert_eq!(rounds.validator_set_id(), validator_set.id()); // verify block 10 is correctly marked as finalized - assert_eq!(persisted_state.best_beefy_block(), 10); + assert_eq!(persisted_state.best_beefy(), 10); assert_eq!(persisted_state.best_grandpa_number(), 13); // verify next vote target is diff-power-of-two block 12 assert_eq!(persisted_state.voting_oracle().voting_target(), Some(12)); @@ -1224,7 +1227,7 @@ async fn should_initialize_voter_at_latest_finalized() { assert_eq!(rounds.validator_set_id(), validator_set.id()); // verify next vote target is 13 - assert_eq!(persisted_state.best_beefy_block(), 12); + assert_eq!(persisted_state.best_beefy(), 12); assert_eq!(persisted_state.best_grandpa_number(), 13); assert_eq!(persisted_state.voting_oracle().voting_target(), Some(13)); @@ -1272,7 +1275,7 @@ async fn should_initialize_voter_at_custom_genesis_when_state_unavailable() { assert_eq!(rounds.validator_set_id(), validator_set.id()); // verify next vote target is mandatory block 7 (genesis) - assert_eq!(persisted_state.best_beefy_block(), 0); + assert_eq!(persisted_state.best_beefy(), 0); assert_eq!(persisted_state.best_grandpa_number(), 30); assert_eq!(persisted_state.voting_oracle().voting_target(), Some(custom_pallet_genesis)); diff --git a/substrate/client/consensus/beefy/src/worker.rs b/substrate/client/consensus/beefy/src/worker.rs index da73a0d17d7..26f940f05f1 100644 --- a/substrate/client/consensus/beefy/src/worker.rs +++ b/substrate/client/consensus/beefy/src/worker.rs @@ -298,6 +298,10 @@ impl PersistedState { self.voting_oracle.min_block_delta = min_block_delta.max(1); } + pub fn best_beefy(&self) -> NumberFor { + self.voting_oracle.best_beefy_block + } + pub(crate) fn set_best_beefy(&mut self, best_beefy: NumberFor) { self.voting_oracle.best_beefy_block = best_beefy; } @@ -1094,10 +1098,6 @@ pub(crate) mod tests { self.voting_oracle.active_rounds() } - pub fn best_beefy_block(&self) -> NumberFor { - self.voting_oracle.best_beefy_block - } - pub fn best_grandpa_number(&self) -> NumberFor { *self.voting_oracle.best_grandpa_block_header.number() } @@ -1511,7 +1511,7 @@ pub(crate) mod tests { }; // no 'best beefy block' or finality proofs - assert_eq!(worker.persisted_state.best_beefy_block(), 0); + assert_eq!(worker.persisted_state.best_beefy(), 0); poll_fn(move |cx| { assert_eq!(best_block_stream.poll_next_unpin(cx), Poll::Pending); assert_eq!(finality_proof.poll_next_unpin(cx), Poll::Pending); @@ -1534,7 +1534,7 @@ pub(crate) mod tests { // try to finalize block #1 worker.finalize(justif.clone()).unwrap(); // verify block finalized - assert_eq!(worker.persisted_state.best_beefy_block(), 1); + assert_eq!(worker.persisted_state.best_beefy(), 1); poll_fn(move |cx| { // expect Some(hash-of-block-1) match best_block_stream.poll_next_unpin(cx) { @@ -1571,7 +1571,7 @@ pub(crate) mod tests { // new session starting at #2 is in front assert_eq!(worker.active_rounds().unwrap().session_start(), 2); // verify block finalized - assert_eq!(worker.persisted_state.best_beefy_block(), 2); + assert_eq!(worker.persisted_state.best_beefy(), 2); poll_fn(move |cx| { match best_block_stream.poll_next_unpin(cx) { // expect Some(hash-of-block-2) -- GitLab From 201ec44ae43f9dc718434b186a43216d05c632ba Mon Sep 17 00:00:00 2001 From: Sophia Gold Date: Thu, 28 Dec 2023 08:54:36 -0500 Subject: [PATCH 094/191] Fix slot_duration divide by zero panic in rococo-parachain runtime (#2612) Adds the fix in https://github.com/paritytech/polkadot-sdk/pull/2039 to the rococo-parachain runtime. --- .../parachains/runtimes/testing/rococo-parachain/src/lib.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs b/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs index 206e4970bae..7faee4258f6 100644 --- a/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs +++ b/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs @@ -229,6 +229,9 @@ impl pallet_timestamp::Config for Runtime { /// A timestamp: milliseconds since the unix epoch. type Moment = u64; type OnTimestampSet = Aura; + #[cfg(feature = "experimental")] + type MinimumPeriod = ConstU64<0>; + #[cfg(not(feature = "experimental"))] type MinimumPeriod = ConstU64<{ SLOT_DURATION / 2 }>; type WeightInfo = (); } @@ -757,7 +760,7 @@ impl_runtime_apis! { impl sp_consensus_aura::AuraApi for Runtime { fn slot_duration() -> sp_consensus_aura::SlotDuration { - sp_consensus_aura::SlotDuration::from_millis(SLOT_DURATION) + sp_consensus_aura::SlotDuration::from_millis(Aura::slot_duration()) } fn authorities() -> Vec { -- GitLab From 00cb41b94919816b9f185a747ced3f97b3613d49 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 28 Dec 2023 21:45:00 +0100 Subject: [PATCH 095/191] Bump the known_good_semver group with 2 updates (#2810) Bumps the known_good_semver group with 2 updates: [syn](https://github.com/dtolnay/syn) and [serde_yaml](https://github.com/dtolnay/serde-yaml). Updates `syn` from 2.0.41 to 2.0.43
Release notes

Sourced from syn's releases.

2.0.43

  • Insert trailing comma if not already present when printing a 1-tuple in pattern position (#1553)

2.0.42

  • Documentation improvements
Commits
  • 95ee052 Release 2.0.43
  • 7383e81 Merge pull request #1559 from dtolnay/pattuple
  • 712fde5 Fix ToTokens for PatTuple to insert trailing comma
  • ed9b94e Merge pull request #1558 from dtolnay/tupletests
  • ec8517b Add tuple comma tests
  • 3cf16c7 Merge pull request #1557 from dtolnay/snapshotparsequote
  • 553549f Generalize snapshot parsing to types that do not implement Parse
  • f9ad833 Merge pull request #1556 from dtolnay/punctuatedsnapshot
  • 131b40b Debug impl for punctuated::Pairs superseded by Punctuated
  • 3f12d65 Include punctuation tokens in snapshot tests containing Punctuated
  • Additional commits viewable in compare view

Updates `serde_yaml` from 0.9.27 to 0.9.29
Release notes

Sourced from serde_yaml's releases.

0.9.29

  • Turn on deny(unsafe_op_in_unsafe_fn) lint

0.9.28

  • Update unsafe-libyaml dependency to pull in unaligned write fix
Commits
  • b957d2b Release 0.9.29
  • 007fc2d Merge pull request #401 from dtolnay/unsafeop
  • 5bac247 Fill in unsafe blocks inside unsafe functions
  • 0f6dba1 Turn on deny(unsafe_op_in_unsafe_fn)
  • 1b6e448 Release 0.9.28
  • ec1a314 Force unsafe-libyaml version that contains unaligned write fix
  • a6b2dc0 Update name of blocks_in_if_conditions clippy lint
  • See full diff in compare view

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 112 +++++++++--------- .../parachain-system/proc-macro/Cargo.toml | 2 +- polkadot/node/gum/proc-macro/Cargo.toml | 2 +- polkadot/xcm/procedural/Cargo.toml | 2 +- substrate/client/chain-spec/derive/Cargo.toml | 2 +- .../client/tracing/proc-macro/Cargo.toml | 2 +- .../frame/contracts/proc-macro/Cargo.toml | 2 +- .../solution-type/Cargo.toml | 2 +- .../frame/staking/reward-curve/Cargo.toml | 2 +- substrate/frame/support/procedural/Cargo.toml | 2 +- .../frame/support/procedural/tools/Cargo.toml | 2 +- .../procedural/tools/derive/Cargo.toml | 2 +- .../primitives/api/proc-macro/Cargo.toml | 2 +- .../core/hashing/proc-macro/Cargo.toml | 2 +- substrate/primitives/debug-derive/Cargo.toml | 2 +- .../runtime-interface/proc-macro/Cargo.toml | 2 +- .../primitives/version/proc-macro/Cargo.toml | 2 +- 17 files changed, 72 insertions(+), 72 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 01a67a8031d..bce297e1468 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -190,7 +190,7 @@ checksum = "c0391754c09fab4eae3404d19d0d297aa1c670c1775ab51d8a5312afeca23157" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -205,7 +205,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", "syn-solidity", "tiny-keccak", ] @@ -1226,7 +1226,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -1243,7 +1243,7 @@ checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -1425,7 +1425,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -2699,7 +2699,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -3909,7 +3909,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -4420,7 +4420,7 @@ checksum = "83fdaf97f4804dcebfa5862639bc9ce4121e82140bec2a987ac5140294865b5b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -4460,7 +4460,7 @@ dependencies = [ "proc-macro2", "quote", "scratch", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -4477,7 +4477,7 @@ checksum = "50c49547d73ba8dcfd4ad7325d64c6d5391ff4224d498fc39a6f3f49825a530d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -4685,7 +4685,7 @@ checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -4746,7 +4746,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.41", + "syn 2.0.43", "termcolor", "toml 0.7.8", "walkdir", @@ -4974,7 +4974,7 @@ checksum = "5e9a1f9f7d83e59740248a6e14ecf93929ade55027844dfcea78beafccc15745" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -4985,7 +4985,7 @@ checksum = "c2ad8cef1d801a4686bfd8919f0b30eac4c8e48968c437a6405ded4fb5272d2b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -5153,7 +5153,7 @@ dependencies = [ "fs-err", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -5541,7 +5541,7 @@ dependencies = [ "quote", "scale-info", "sp-arithmetic", - "syn 2.0.41", + "syn 2.0.43", "trybuild", ] @@ -5694,7 +5694,7 @@ dependencies = [ "quote", "regex", "sp-core-hashing", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -5705,7 +5705,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -5714,7 +5714,7 @@ version = "3.0.0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -5947,7 +5947,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -7884,7 +7884,7 @@ dependencies = [ "macro_magic_core", "macro_magic_macros", "quote", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -7898,7 +7898,7 @@ dependencies = [ "macro_magic_core_macros", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -7909,7 +7909,7 @@ checksum = "9ea73aa640dc01d62a590d48c0c3521ed739d53b27f919b25c3551e233481654" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -7920,7 +7920,7 @@ checksum = "ef9d79ae96aaba821963320eb2b6e34d17df1e5a83d8a1985c29cc5be59577b3" dependencies = [ "macro_magic_core", "quote", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -9659,7 +9659,7 @@ version = "4.0.0-dev" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -10819,7 +10819,7 @@ dependencies = [ "proc-macro2", "quote", "sp-runtime", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -11930,7 +11930,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -11971,7 +11971,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -13937,7 +13937,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c64d9ba0963cdcea2e1b2230fbae2bab30eb25a174be395c41e764bfb65dd62" dependencies = [ "proc-macro2", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -14029,7 +14029,7 @@ checksum = "9b698b0b09d40e9b7c1a47b132d66a8b54bcd20583d9b6d06e4535e383b4405c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -14101,7 +14101,7 @@ checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -14519,7 +14519,7 @@ checksum = "7f7473c2cfcf90008193dd0e3e16599455cb601a9fce322b5bb55de799664925" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -15354,7 +15354,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -16610,7 +16610,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -17028,7 +17028,7 @@ checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -17085,9 +17085,9 @@ dependencies = [ [[package]] name = "serde_yaml" -version = "0.9.27" +version = "0.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cc7a1570e38322cfe4154732e5110f887ea57e22b76f4bfd32b5bdd3368666c" +checksum = "a15e0ef66bf939a7c890a0bf6d5a733c70202225f9888a89ed5c62298b019129" dependencies = [ "indexmap 2.0.0", "itoa", @@ -17118,7 +17118,7 @@ checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -17908,7 +17908,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -18243,7 +18243,7 @@ version = "9.0.0" dependencies = [ "quote", "sp-core-hashing", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -18301,7 +18301,7 @@ version = "8.0.0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -18311,7 +18311,7 @@ source = "git+https://github.com/paritytech/polkadot-sdk#82912acb33a9030c0ef3bf5 dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -18584,7 +18584,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -18596,7 +18596,7 @@ dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -18867,7 +18867,7 @@ dependencies = [ "proc-macro2", "quote", "sp-version", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -19702,9 +19702,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.41" +version = "2.0.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c8b28c477cc3bf0e7966561e3460130e1255f7a1cf71931075f1c5e7a7e269" +checksum = "ee659fb5f3d355364e1f3e5bc10fb82068efbf824a1e9d1c9504244a6469ad53" dependencies = [ "proc-macro2", "quote", @@ -19720,7 +19720,7 @@ dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -19971,7 +19971,7 @@ checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -20132,7 +20132,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -20338,7 +20338,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -20380,7 +20380,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] @@ -20910,7 +20910,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", "wasm-bindgen-shared", ] @@ -20944,7 +20944,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -21912,7 +21912,7 @@ dependencies = [ "proc-macro2", "quote", "staging-xcm", - "syn 2.0.41", + "syn 2.0.43", "trybuild", ] @@ -22032,7 +22032,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.43", ] [[package]] diff --git a/cumulus/pallets/parachain-system/proc-macro/Cargo.toml b/cumulus/pallets/parachain-system/proc-macro/Cargo.toml index 676f333e065..cdc5514122e 100644 --- a/cumulus/pallets/parachain-system/proc-macro/Cargo.toml +++ b/cumulus/pallets/parachain-system/proc-macro/Cargo.toml @@ -13,7 +13,7 @@ workspace = true proc-macro = true [dependencies] -syn = "2.0.41" +syn = "2.0.43" proc-macro2 = "1.0.64" quote = "1.0.33" proc-macro-crate = "2.0.1" diff --git a/polkadot/node/gum/proc-macro/Cargo.toml b/polkadot/node/gum/proc-macro/Cargo.toml index 3f1c2fd6475..e9a21914d56 100644 --- a/polkadot/node/gum/proc-macro/Cargo.toml +++ b/polkadot/node/gum/proc-macro/Cargo.toml @@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"] proc-macro = true [dependencies] -syn = { version = "2.0.41", features = ["extra-traits", "full"] } +syn = { version = "2.0.43", features = ["extra-traits", "full"] } quote = "1.0.28" proc-macro2 = "1.0.56" proc-macro-crate = "2.0.1" diff --git a/polkadot/xcm/procedural/Cargo.toml b/polkadot/xcm/procedural/Cargo.toml index c5f837a001d..6ebae40f4a3 100644 --- a/polkadot/xcm/procedural/Cargo.toml +++ b/polkadot/xcm/procedural/Cargo.toml @@ -16,7 +16,7 @@ proc-macro = true [dependencies] proc-macro2 = "1.0.56" quote = "1.0.28" -syn = "2.0.41" +syn = "2.0.43" Inflector = "0.11.4" [dev-dependencies] diff --git a/substrate/client/chain-spec/derive/Cargo.toml b/substrate/client/chain-spec/derive/Cargo.toml index a63520ffb31..b8dcd5e5665 100644 --- a/substrate/client/chain-spec/derive/Cargo.toml +++ b/substrate/client/chain-spec/derive/Cargo.toml @@ -21,4 +21,4 @@ proc-macro = true proc-macro-crate = "2.0.1" proc-macro2 = "1.0.56" quote = "1.0.28" -syn = "2.0.41" +syn = "2.0.43" diff --git a/substrate/client/tracing/proc-macro/Cargo.toml b/substrate/client/tracing/proc-macro/Cargo.toml index 3d862a021b3..d6fd53fe1db 100644 --- a/substrate/client/tracing/proc-macro/Cargo.toml +++ b/substrate/client/tracing/proc-macro/Cargo.toml @@ -21,4 +21,4 @@ proc-macro = true proc-macro-crate = "2.0.1" proc-macro2 = "1.0.56" quote = { version = "1.0.28", features = ["proc-macro"] } -syn = { version = "2.0.41", features = ["extra-traits", "full", "parsing", "proc-macro"] } +syn = { version = "2.0.43", features = ["extra-traits", "full", "parsing", "proc-macro"] } diff --git a/substrate/frame/contracts/proc-macro/Cargo.toml b/substrate/frame/contracts/proc-macro/Cargo.toml index 972b23c373e..14733256466 100644 --- a/substrate/frame/contracts/proc-macro/Cargo.toml +++ b/substrate/frame/contracts/proc-macro/Cargo.toml @@ -20,7 +20,7 @@ proc-macro = true [dependencies] proc-macro2 = "1.0.56" quote = "1.0.28" -syn = { version = "2.0.41", features = ["full"] } +syn = { version = "2.0.43", features = ["full"] } [dev-dependencies] diff --git a/substrate/frame/election-provider-support/solution-type/Cargo.toml b/substrate/frame/election-provider-support/solution-type/Cargo.toml index 601355fdb7a..212ce2e4f15 100644 --- a/substrate/frame/election-provider-support/solution-type/Cargo.toml +++ b/substrate/frame/election-provider-support/solution-type/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] proc-macro = true [dependencies] -syn = { version = "2.0.41", features = ["full", "visit"] } +syn = { version = "2.0.43", features = ["full", "visit"] } quote = "1.0.28" proc-macro2 = "1.0.56" proc-macro-crate = "2.0.1" diff --git a/substrate/frame/staking/reward-curve/Cargo.toml b/substrate/frame/staking/reward-curve/Cargo.toml index c21b79bc2e5..fcf2faeee53 100644 --- a/substrate/frame/staking/reward-curve/Cargo.toml +++ b/substrate/frame/staking/reward-curve/Cargo.toml @@ -21,7 +21,7 @@ proc-macro = true proc-macro-crate = "2.0.1" proc-macro2 = "1.0.56" quote = "1.0.28" -syn = { version = "2.0.41", features = ["full", "visit"] } +syn = { version = "2.0.43", features = ["full", "visit"] } [dev-dependencies] sp-runtime = { path = "../../../primitives/runtime" } diff --git a/substrate/frame/support/procedural/Cargo.toml b/substrate/frame/support/procedural/Cargo.toml index dd75f6b4ac1..7c8b3f009d7 100644 --- a/substrate/frame/support/procedural/Cargo.toml +++ b/substrate/frame/support/procedural/Cargo.toml @@ -24,7 +24,7 @@ cfg-expr = "0.15.5" itertools = "0.10.3" proc-macro2 = "1.0.56" quote = "1.0.28" -syn = { version = "2.0.41", features = ["full"] } +syn = { version = "2.0.43", features = ["full"] } frame-support-procedural-tools = { path = "tools" } macro_magic = { version = "0.5.0", features = ["proc_support"] } proc-macro-warning = { version = "1.0.0", default-features = false } diff --git a/substrate/frame/support/procedural/tools/Cargo.toml b/substrate/frame/support/procedural/tools/Cargo.toml index a5d0f4cc17a..4b75088c314 100644 --- a/substrate/frame/support/procedural/tools/Cargo.toml +++ b/substrate/frame/support/procedural/tools/Cargo.toml @@ -18,5 +18,5 @@ targets = ["x86_64-unknown-linux-gnu"] proc-macro-crate = "2.0.1" proc-macro2 = "1.0.56" quote = "1.0.28" -syn = { version = "2.0.41", features = ["extra-traits", "full", "visit"] } +syn = { version = "2.0.43", features = ["extra-traits", "full", "visit"] } frame-support-procedural-tools-derive = { path = "derive" } diff --git a/substrate/frame/support/procedural/tools/derive/Cargo.toml b/substrate/frame/support/procedural/tools/derive/Cargo.toml index 0ccb02a3329..eeaeab9b829 100644 --- a/substrate/frame/support/procedural/tools/derive/Cargo.toml +++ b/substrate/frame/support/procedural/tools/derive/Cargo.toml @@ -20,4 +20,4 @@ proc-macro = true [dependencies] proc-macro2 = "1.0.56" quote = { version = "1.0.28", features = ["proc-macro"] } -syn = { version = "2.0.41", features = ["extra-traits", "full", "parsing", "proc-macro"] } +syn = { version = "2.0.43", features = ["extra-traits", "full", "parsing", "proc-macro"] } diff --git a/substrate/primitives/api/proc-macro/Cargo.toml b/substrate/primitives/api/proc-macro/Cargo.toml index ae46b45ccbf..84c93aecd2e 100644 --- a/substrate/primitives/api/proc-macro/Cargo.toml +++ b/substrate/primitives/api/proc-macro/Cargo.toml @@ -20,7 +20,7 @@ proc-macro = true [dependencies] quote = "1.0.28" -syn = { version = "2.0.41", features = ["extra-traits", "fold", "full", "visit"] } +syn = { version = "2.0.43", features = ["extra-traits", "fold", "full", "visit"] } proc-macro2 = "1.0.56" blake2 = { version = "0.10.4", default-features = false } proc-macro-crate = "2.0.1" diff --git a/substrate/primitives/core/hashing/proc-macro/Cargo.toml b/substrate/primitives/core/hashing/proc-macro/Cargo.toml index d379fc38ffb..1ffbb4d1aaf 100644 --- a/substrate/primitives/core/hashing/proc-macro/Cargo.toml +++ b/substrate/primitives/core/hashing/proc-macro/Cargo.toml @@ -20,5 +20,5 @@ proc-macro = true [dependencies] quote = "1.0.28" -syn = { version = "2.0.41", features = ["full", "parsing"] } +syn = { version = "2.0.43", features = ["full", "parsing"] } sp-core-hashing = { path = "..", default-features = false } diff --git a/substrate/primitives/debug-derive/Cargo.toml b/substrate/primitives/debug-derive/Cargo.toml index d23e311ee0b..bd1e0d12d6e 100644 --- a/substrate/primitives/debug-derive/Cargo.toml +++ b/substrate/primitives/debug-derive/Cargo.toml @@ -20,7 +20,7 @@ proc-macro = true [dependencies] quote = "1.0.28" -syn = "2.0.41" +syn = "2.0.43" proc-macro2 = "1.0.56" [features] diff --git a/substrate/primitives/runtime-interface/proc-macro/Cargo.toml b/substrate/primitives/runtime-interface/proc-macro/Cargo.toml index 190ccd51ecf..0b0291b1bd3 100644 --- a/substrate/primitives/runtime-interface/proc-macro/Cargo.toml +++ b/substrate/primitives/runtime-interface/proc-macro/Cargo.toml @@ -24,4 +24,4 @@ proc-macro-crate = "2.0.1" proc-macro2 = "1.0.56" quote = "1.0.28" expander = "2.0.0" -syn = { version = "2.0.41", features = ["extra-traits", "fold", "full", "visit"] } +syn = { version = "2.0.43", features = ["extra-traits", "fold", "full", "visit"] } diff --git a/substrate/primitives/version/proc-macro/Cargo.toml b/substrate/primitives/version/proc-macro/Cargo.toml index 413a1e9940a..a71dce56eec 100644 --- a/substrate/primitives/version/proc-macro/Cargo.toml +++ b/substrate/primitives/version/proc-macro/Cargo.toml @@ -22,7 +22,7 @@ proc-macro = true codec = { package = "parity-scale-codec", version = "3.6.1", features = ["derive"] } proc-macro2 = "1.0.56" quote = "1.0.28" -syn = { version = "2.0.41", features = ["extra-traits", "fold", "full", "visit"] } +syn = { version = "2.0.43", features = ["extra-traits", "fold", "full", "visit"] } [dev-dependencies] sp-version = { path = ".." } -- GitLab From a813e4da8ff2e4248044c21ad524885ec9379c01 Mon Sep 17 00:00:00 2001 From: Jun Jiang Date: Fri, 29 Dec 2023 06:00:28 +0800 Subject: [PATCH 096/191] Remove unused pallet-contracts-primitives (#2806) --- .../frame/contracts/primitives/Cargo.toml | 36 ------------------- 1 file changed, 36 deletions(-) delete mode 100644 substrate/frame/contracts/primitives/Cargo.toml diff --git a/substrate/frame/contracts/primitives/Cargo.toml b/substrate/frame/contracts/primitives/Cargo.toml deleted file mode 100644 index d1db766ce81..00000000000 --- a/substrate/frame/contracts/primitives/Cargo.toml +++ /dev/null @@ -1,36 +0,0 @@ -[package] -name = "pallet-contracts-primitives" -version = "24.0.0" -authors.workspace = true -edition.workspace = true -license = "Apache-2.0" -homepage = "https://substrate.io" -repository.workspace = true -description = "A crate that hosts a common definitions that are relevant for the pallet-contracts." -readme = "README.md" - -[lints] -workspace = true - -[package.metadata.docs.rs] -targets = ["x86_64-unknown-linux-gnu"] - -[dependencies] -bitflags = "1.0" -scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } - -# Substrate Dependencies (This crate should not rely on frame) -sp-std = { path = "../../../primitives/std", default-features = false } -sp-runtime = { path = "../../../primitives/runtime", default-features = false } -sp-weights = { path = "../../../primitives/weights", default-features = false } - -[features] -default = ["std"] -std = [ - "codec/std", - "scale-info/std", - "sp-runtime/std", - "sp-std/std", - "sp-weights/std", -] -- GitLab From ae14e6da6a3b2a729365f9581211d07033719c1a Mon Sep 17 00:00:00 2001 From: Sergej Sakac <73715684+Szegoo@users.noreply.github.com> Date: Fri, 29 Dec 2023 08:04:53 +0100 Subject: [PATCH 097/191] Broker pallet: fix interlacing (#2811) With the current code, when a user interlaces their region, the end result will be three regions in the state: - the non-interlaced region - first part of the interlaced region - second part of the interlaced region The existing implementation retains the non-interlaced region in the state, leading to a problematic scenario: 1. User 1 acquires a region from the market. 2. User 1 then interlaces this region. 3. Subsequently, User 1 transfers one part of the interlaced regions to User 2. Despite this transfer, User 1 retains the ability to assign the entire original non-interlaced region, which is inconsistent with the fact that they no longer own one of the interlaced parts. This PR resolves the issue by removing the original region, ensuring that only the two new interlaced regions remain in the state. --- prdoc/pr_2811.prdoc | 13 +++++++ .../frame/broker/src/dispatchable_impls.rs | 3 ++ substrate/frame/broker/src/tests.rs | 37 +++++++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 prdoc/pr_2811.prdoc diff --git a/prdoc/pr_2811.prdoc b/prdoc/pr_2811.prdoc new file mode 100644 index 00000000000..647fb4c8ccd --- /dev/null +++ b/prdoc/pr_2811.prdoc @@ -0,0 +1,13 @@ +title: "Interlacing removes the region on which it is performed." + +doc: + - audience: Runtime User + description: | + The current implementation of the broker pallet does not remove + the region on which the interlacing is performed. This can create + a vulnerability, as the original region owner is still allowed to + assign a task to the region even after transferring an interlaced + part of it. + +crates: + - name: "pallet-broker" diff --git a/substrate/frame/broker/src/dispatchable_impls.rs b/substrate/frame/broker/src/dispatchable_impls.rs index b04e15b169b..f2451013251 100644 --- a/substrate/frame/broker/src/dispatchable_impls.rs +++ b/substrate/frame/broker/src/dispatchable_impls.rs @@ -234,6 +234,9 @@ impl Pallet { ensure!(!pivot.is_void(), Error::::VoidPivot); ensure!(pivot != region_id.mask, Error::::CompletePivot); + // The old region should be removed. + Regions::::remove(®ion_id); + let one = RegionId { mask: pivot, ..region_id }; Regions::::insert(&one, ®ion); let other = RegionId { mask: region_id.mask ^ pivot, ..region_id }; diff --git a/substrate/frame/broker/src/tests.rs b/substrate/frame/broker/src/tests.rs index e1b489bbe6e..6aa9ca84fc4 100644 --- a/substrate/frame/broker/src/tests.rs +++ b/substrate/frame/broker/src/tests.rs @@ -602,6 +602,43 @@ fn interlace_works() { }); } +#[test] +fn cant_assign_unowned_region() { + TestExt::new().endow(1, 1000).execute_with(|| { + assert_ok!(Broker::do_start_sales(100, 1)); + advance_to(2); + let region = Broker::do_purchase(1, u64::max_value()).unwrap(); + let (region1, region2) = + Broker::do_interlace(region, Some(1), CoreMask::from_chunk(0, 30)).unwrap(); + + // Transfer the interlaced region to account 2. + assert_ok!(Broker::do_transfer(region2, Some(1), 2)); + + // The initial owner should not be able to assign the non-interlaced region, since they have + // just transferred an interlaced part of it to account 2. + assert_noop!(Broker::do_assign(region, Some(1), 1001, Final), Error::::UnknownRegion); + + // Account 1 can assign only the interlaced region that they did not transfer. + assert_ok!(Broker::do_assign(region1, Some(1), 1001, Final)); + // Account 2 can assign the region they received. + assert_ok!(Broker::do_assign(region2, Some(2), 1002, Final)); + + advance_to(10); + assert_eq!( + CoretimeTrace::get(), + vec![( + 6, + AssignCore { + core: 0, + begin: 8, + assignment: vec![(Task(1001), 21600), (Task(1002), 36000)], + end_hint: None + } + ),] + ); + }); +} + #[test] fn interlace_then_partition_works() { TestExt::new().endow(1, 1000).execute_with(|| { -- GitLab From 45f4d9a2b91771d8fad6c51ad9858b324ec664a4 Mon Sep 17 00:00:00 2001 From: Liam Aharon Date: Fri, 29 Dec 2023 16:24:26 +0400 Subject: [PATCH 098/191] Development Environment Advice Reference Doc (#2759) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes https://github.com/paritytech/polkadot-sdk-docs/issues/63 --------- Co-authored-by: Dónal Murray Co-authored-by: PG Herveou Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> --- .../development_environment_advice.rs | 113 ++++++++++++++++++ docs/sdk/src/reference_docs/mod.rs | 3 + 2 files changed, 116 insertions(+) create mode 100644 docs/sdk/src/reference_docs/development_environment_advice.rs diff --git a/docs/sdk/src/reference_docs/development_environment_advice.rs b/docs/sdk/src/reference_docs/development_environment_advice.rs new file mode 100644 index 00000000000..27dd4638604 --- /dev/null +++ b/docs/sdk/src/reference_docs/development_environment_advice.rs @@ -0,0 +1,113 @@ +//! # Development Environment Advice +//! +//! Large Rust projects are known for sometimes long compile times and sluggish dev tooling, and +//! polkadot-sdk is no exception. +//! +//! This page contains some advice to improve your workflow when using common tooling. +//! +//! ## Rust Analyzer Configuration +//! +//! [Rust Analyzer](https://rust-analyzer.github.io/) is the defacto [LSP](https://langserver.org/) for Rust. Its default +//! settings are fine for smaller projects, but not well optimised for polkadot-sdk. +//! +//! Below is a suggested configuration for VSCode: +//! +//! ```json +//! { +//! // Use a separate target dir for Rust Analyzer. Helpful if you want to use Rust +//! // Analyzer and cargo on the command line at the same time. +//! "rust-analyzer.rust.analyzerTargetDir": "target/vscode-rust-analyzer", +//! // Improve stability +//! "rust-analyzer.server.extraEnv": { +//! "CHALK_OVERFLOW_DEPTH": "100000000", +//! "CHALK_SOLVER_MAX_SIZE": "10000000" +//! }, +//! // Check feature-gated code +//! "rust-analyzer.cargo.features": "all", +//! "rust-analyzer.cargo.extraEnv": { +//! // Skip building WASM, there is never need for it here +//! "SKIP_WASM_BUILD": "1" +//! }, +//! // Don't expand some problematic proc_macros +//! "rust-analyzer.procMacro.ignored": { +//! "async-trait": ["async_trait"], +//! "napi-derive": ["napi"], +//! "async-recursion": ["async_recursion"], +//! "async-std": ["async_std"] +//! }, +//! // Use nightly formatting. +//! // See the polkadot-sdk CI job that checks formatting for the current version used in +//! // polkadot-sdk. +//! "rust-analyzer.rustfmt.extraArgs": ["+nightly-2023-11-01"], +//! } +//! ``` +//! +//! and the same in Lua for `neovim/nvim-lspconfig`: +//! +//! ```lua +//! ["rust-analyzer"] = { +//! rust = { +//! # Use a separate target dir for Rust Analyzer. Helpful if you want to use Rust +//! # Analyzer and cargo on the command line at the same time. +//! analyzerTargetDir = "target/nvim-rust-analyzer", +//! }, +//! server = { +//! # Improve stability +//! extraEnv = { +//! ["CHALK_OVERFLOW_DEPTH"] = "100000000", +//! ["CHALK_SOLVER_MAX_SIZE"] = "100000000", +//! }, +//! }, +//! cargo = { +//! # Check feature-gated code +//! features = "all", +//! extraEnv = { +//! # Skip building WASM, there is never need for it here +//! ["SKIP_WASM_BUILD"] = "1", +//! }, +//! }, +//! procMacro = { +//! # Don't expand some problematic proc_macros +//! ignored = { +//! ["async-trait"] = { "async_trait" }, +//! ["napi-derive"] = { "napi" }, +//! ["async-recursion"] = { "async_recursion" }, +//! ["async-std"] = { "async_std" }, +//! }, +//! }, +//! rustfmt = { +//! # Use nightly formatting. +//! # See the polkadot-sdk CI job that checks formatting for the current version used in +//! # polkadot-sdk. +//! extraArgs = { "+nightly-2023-11-01" }, +//! }, +//! }, +//! ``` +//! +//! For the full set of configuration options see . +//! +//! ## Cargo Usage +//! +//! ### Using `--package` (a.k.a. `-p`) +//! +//! polkadot-sdk is a monorepo containing many crates. When you run a cargo command without +//! `-p`, you will almost certainly compile crates outside of the scope you are working. +//! +//! Instead, you should identify the name of the crate you are working on by checking the `name` +//! field in the closest `Cargo.toml` file. Then, use `-p` with your cargo commands to only compile +//! that crate. +//! +//! ### `SKIP_WASM_BUILD=1` environment variable +//! +//! When cargo touches a runtime crate, by default it will also compile the WASM binary, +//! approximately doubling the compilation time. +//! +//! The WASM binary is usually not needed, especially when running `check` or `test`. To skip the +//! WASM build, set the `SKIP_WASM_BUILD` environment variable to `1`. For example: +//! `SKIP_WASM_BUILD=1 cargo check -p frame-support`. +//! +//! ### Cargo Remote +//! +//! If you have a powerful remote server available, you may consider using +//! [cargo-remote](https://github.com/sgeisler/cargo-remote) to execute cargo commands on it, +//! freeing up local resources for other tasks like `rust-analyzer`. diff --git a/docs/sdk/src/reference_docs/mod.rs b/docs/sdk/src/reference_docs/mod.rs index 44284394000..c16122ee428 100644 --- a/docs/sdk/src/reference_docs/mod.rs +++ b/docs/sdk/src/reference_docs/mod.rs @@ -69,6 +69,9 @@ pub mod frame_system_accounts; /// Learn about the currency-related abstractions provided in FRAME. pub mod frame_currency; +/// Advice for configuring your development environment for Substrate development. +pub mod development_environment_advice; + /// Learn about benchmarking and weight. // TODO: @shawntabrizi @ggwpez https://github.com/paritytech/polkadot-sdk-docs/issues/50 pub mod frame_benchmarking_weight; -- GitLab From 8bf5a1c0b31a3bfa4751c50a374e3ce3d4cfda1d Mon Sep 17 00:00:00 2001 From: Marcin S Date: Fri, 29 Dec 2023 16:27:18 +0100 Subject: [PATCH 099/191] PVF: ensure job processes are cleaned up, add tests (#2643) Fixes a potential memory leak. `PR_SET_PDEATHSIG` is used to terminate children when the parent dies. Note that this is subject to a race. There seems to be a raceless alternative [here](https://stackoverflow.com/a/42498370/6085242), but the concern is small enough that a bit more complexity doesn't seem worth it. Left a bit more info in the code comment. --- polkadot/node/core/pvf/common/src/execute.rs | 2 + .../node/core/pvf/execute-worker/src/lib.rs | 9 + .../node/core/pvf/prepare-worker/src/lib.rs | 9 + .../node/core/pvf/src/worker_interface.rs | 6 +- polkadot/node/core/pvf/tests/it/process.rs | 155 +++++++++--------- 5 files changed, 101 insertions(+), 80 deletions(-) diff --git a/polkadot/node/core/pvf/common/src/execute.rs b/polkadot/node/core/pvf/common/src/execute.rs index aa1c1c53968..5ba5b443e6a 100644 --- a/polkadot/node/core/pvf/common/src/execute.rs +++ b/polkadot/node/core/pvf/common/src/execute.rs @@ -96,4 +96,6 @@ pub enum JobError { CouldNotSpawnThread(String), #[error("An error occurred in the CPU time monitor thread: {0}")] CpuTimeMonitorThread(String), + #[error("Could not set pdeathsig: {0}")] + CouldNotSetPdeathsig(String), } diff --git a/polkadot/node/core/pvf/execute-worker/src/lib.rs b/polkadot/node/core/pvf/execute-worker/src/lib.rs index b33a9d5069d..cff6e0ac13a 100644 --- a/polkadot/node/core/pvf/execute-worker/src/lib.rs +++ b/polkadot/node/core/pvf/execute-worker/src/lib.rs @@ -277,6 +277,15 @@ fn handle_child_process( params: Vec, execution_timeout: Duration, ) -> ! { + // Terminate if the parent thread dies. Parent thread == worker process (it is single-threaded). + // + // RACE: the worker may die before we install the death signal. In practice this is unlikely, + // and most of the time the job process should terminate on its own when it completes. + #[cfg(target_os = "linux")] + nix::sys::prctl::set_pdeathsig(nix::sys::signal::Signal::SIGTERM).unwrap_or_else(|err| { + send_child_response(&mut pipe_write, Err(JobError::CouldNotSetPdeathsig(err.to_string()))) + }); + gum::debug!( target: LOG_TARGET, worker_job_pid = %process::id(), diff --git a/polkadot/node/core/pvf/prepare-worker/src/lib.rs b/polkadot/node/core/pvf/prepare-worker/src/lib.rs index af5ac8c5974..f77eed871ec 100644 --- a/polkadot/node/core/pvf/prepare-worker/src/lib.rs +++ b/polkadot/node/core/pvf/prepare-worker/src/lib.rs @@ -334,6 +334,15 @@ fn handle_child_process( prepare_job_kind: PrepareJobKind, executor_params: Arc, ) -> ! { + // Terminate if the parent thread dies. Parent thread == worker process (it is single-threaded). + // + // RACE: the worker may die before we install the death signal. In practice this is unlikely, + // and most of the time the job process should terminate on its own when it completes. + #[cfg(target_os = "linux")] + nix::sys::prctl::set_pdeathsig(nix::sys::signal::Signal::SIGTERM).unwrap_or_else(|err| { + send_child_response(&mut pipe_write, Err(PrepareError::IoErr(err.to_string()))) + }); + let worker_job_pid = process::id(); gum::debug!( target: LOG_TARGET, diff --git a/polkadot/node/core/pvf/src/worker_interface.rs b/polkadot/node/core/pvf/src/worker_interface.rs index c68ff92b06e..456c20bd27b 100644 --- a/polkadot/node/core/pvf/src/worker_interface.rs +++ b/polkadot/node/core/pvf/src/worker_interface.rs @@ -105,9 +105,9 @@ pub async fn spawn_with_program_path( gum::warn!( target: LOG_TARGET, %debug_id, - ?program_path_clone, - ?extra_args_clone, - ?worker_dir_clone, + program_path = ?program_path_clone, + extra_args = ?extra_args_clone, + worker_dir = ?worker_dir_clone, "error spawning worker: {}", err, ); diff --git a/polkadot/node/core/pvf/tests/it/process.rs b/polkadot/node/core/pvf/tests/it/process.rs index b742acb15d0..3ea03339a83 100644 --- a/polkadot/node/core/pvf/tests/it/process.rs +++ b/polkadot/node/core/pvf/tests/it/process.rs @@ -18,14 +18,18 @@ //! spawned by the host) and job processes (spawned by the workers to securely perform PVF jobs). use super::TestHost; +use adder::{hash_state, BlockData, HeadData}; use assert_matches::assert_matches; +use parity_scale_codec::Encode; use polkadot_node_core_pvf::{ InvalidCandidate, PossiblyInvalidError, PrepareError, ValidationError, }; -use polkadot_parachain_primitives::primitives::{BlockData, ValidationParams}; +use polkadot_parachain_primitives::primitives::{ + BlockData as GenericBlockData, HeadData as GenericHeadData, ValidationParams, +}; use procfs::process; use rusty_fork::rusty_fork_test; -use std::time::Duration; +use std::{future::Future, sync::Arc, time::Duration}; const PREPARE_PROCESS_NAME: &'static str = "polkadot-prepare-worker"; const EXECUTE_PROCESS_NAME: &'static str = "polkadot-execute-worker"; @@ -39,11 +43,13 @@ fn send_signal_by_sid_and_name( is_direct_child: bool, signal: i32, ) { - let process = find_process_by_sid_and_name(sid, exe_name, is_direct_child); + let process = find_process_by_sid_and_name(sid, exe_name, is_direct_child) + .expect("Should have found the expected process"); assert_eq!(unsafe { libc::kill(process.pid(), signal) }, 0); } fn get_num_threads_by_sid_and_name(sid: i32, exe_name: &'static str, is_direct_child: bool) -> i64 { - let process = find_process_by_sid_and_name(sid, exe_name, is_direct_child); + let process = find_process_by_sid_and_name(sid, exe_name, is_direct_child) + .expect("Should have found the expected process"); process.stat().unwrap().num_threads } @@ -51,7 +57,7 @@ fn find_process_by_sid_and_name( sid: i32, exe_name: &'static str, is_direct_child: bool, -) -> process::Process { +) -> Option { let all_processes: Vec = process::all_processes() .expect("Can't read /proc") .filter_map(|p| match p { @@ -68,7 +74,7 @@ fn find_process_by_sid_and_name( let mut found = None; for process in all_processes { - let stat = process.stat().unwrap(); + let stat = process.stat().expect("/proc existed above. Potential race occurred"); if stat.session != sid || !process.exe().unwrap().to_str().unwrap().contains(exe_name) { continue @@ -85,24 +91,68 @@ fn find_process_by_sid_and_name( } found = Some(process); } - found.expect("Should have found the expected process") + found +} + +/// Sets up the test and makes sure everything gets cleaned up after. +/// +/// We run the runtime manually because `#[tokio::test]` doesn't work in `rusty_fork_test!`. +fn test_wrapper(f: F) +where + F: FnOnce(Arc, i32) -> Fut, + Fut: Future, +{ + let rt = tokio::runtime::Runtime::new().unwrap(); + rt.block_on(async { + let host = Arc::new(TestHost::new().await); + + // Create a new session and get the session ID. + let sid = unsafe { libc::setsid() }; + assert!(sid > 0); + + // Pass a clone of the host so that it does not get dropped after. + f(host.clone(), sid).await; + + // Sleep to give processes a chance to get cleaned up, preventing races in the next step. + tokio::time::sleep(Duration::from_millis(500)).await; + + // Make sure job processes got cleaned up. Pass `is_direct_child: false` to target the + // job processes. + assert!(find_process_by_sid_and_name(sid, PREPARE_PROCESS_NAME, false).is_none()); + assert!(find_process_by_sid_and_name(sid, EXECUTE_PROCESS_NAME, false).is_none()); + }); } // Run these tests in their own processes with rusty-fork. They work by each creating a new session, -// then doing something with the child process that matches the session ID and expected process -// name. +// then finding the child process that matches the session ID and expected process name and doing +// something with that child. rusty_fork_test! { + // Everything succeeded. All created subprocesses for jobs should get cleaned up, to avoid memory leaks. + #[test] + fn successful_prepare_and_validate() { + test_wrapper(|host, _sid| async move { + let parent_head = HeadData { number: 0, parent_hash: [0; 32], post_state: hash_state(0) }; + let block_data = BlockData { state: 0, add: 512 }; + host + .validate_candidate( + adder::wasm_binary_unwrap(), + ValidationParams { + parent_head: GenericHeadData(parent_head.encode()), + block_data: GenericBlockData(block_data.encode()), + relay_parent_number: 1, + relay_parent_storage_root: Default::default(), + }, + Default::default(), + ) + .await + .unwrap(); + }) + } + // What happens when the prepare worker (not the job) times out? #[test] fn prepare_worker_timeout() { - let rt = tokio::runtime::Runtime::new().unwrap(); - rt.block_on(async { - let host = TestHost::new().await; - - // Create a new session and get the session ID. - let sid = unsafe { libc::setsid() }; - assert!(sid > 0); - + test_wrapper(|host, sid| async move { let (result, _) = futures::join!( // Choose a job that would normally take the entire timeout. host.precheck_pvf(rococo_runtime::WASM_BINARY.unwrap(), Default::default()), @@ -120,14 +170,7 @@ rusty_fork_test! { // What happens when the execute worker (not the job) times out? #[test] fn execute_worker_timeout() { - let rt = tokio::runtime::Runtime::new().unwrap(); - rt.block_on(async { - let host = TestHost::new().await; - - // Create a new session and get the session ID. - let sid = unsafe { libc::setsid() }; - assert!(sid > 0); - + test_wrapper(|host, sid| async move { // Prepare the artifact ahead of time. let binary = halt::wasm_binary_unwrap(); host.precheck_pvf(binary, Default::default()).await.unwrap(); @@ -137,7 +180,7 @@ rusty_fork_test! { host.validate_candidate( binary, ValidationParams { - block_data: BlockData(Vec::new()), + block_data: GenericBlockData(Vec::new()), parent_head: Default::default(), relay_parent_number: 1, relay_parent_storage_root: Default::default(), @@ -161,14 +204,7 @@ rusty_fork_test! { // What happens when the prepare worker dies in the middle of a job? #[test] fn prepare_worker_killed_during_job() { - let rt = tokio::runtime::Runtime::new().unwrap(); - rt.block_on(async { - let host = TestHost::new().await; - - // Create a new session and get the session ID. - let sid = unsafe { libc::setsid() }; - assert!(sid > 0); - + test_wrapper(|host, sid| async move { let (result, _) = futures::join!( // Choose a job that would normally take the entire timeout. host.precheck_pvf(rococo_runtime::WASM_BINARY.unwrap(), Default::default()), @@ -186,14 +222,7 @@ rusty_fork_test! { // What happens when the execute worker dies in the middle of a job? #[test] fn execute_worker_killed_during_job() { - let rt = tokio::runtime::Runtime::new().unwrap(); - rt.block_on(async { - let host = TestHost::new().await; - - // Create a new session and get the session ID. - let sid = unsafe { libc::setsid() }; - assert!(sid > 0); - + test_wrapper(|host, sid| async move { // Prepare the artifact ahead of time. let binary = halt::wasm_binary_unwrap(); host.precheck_pvf(binary, Default::default()).await.unwrap(); @@ -203,7 +232,7 @@ rusty_fork_test! { host.validate_candidate( binary, ValidationParams { - block_data: BlockData(Vec::new()), + block_data: GenericBlockData(Vec::new()), parent_head: Default::default(), relay_parent_number: 1, relay_parent_storage_root: Default::default(), @@ -227,14 +256,7 @@ rusty_fork_test! { // What happens when the forked prepare job dies in the middle of its job? #[test] fn forked_prepare_job_killed_during_job() { - let rt = tokio::runtime::Runtime::new().unwrap(); - rt.block_on(async { - let host = TestHost::new().await; - - // Create a new session and get the session ID. - let sid = unsafe { libc::setsid() }; - assert!(sid > 0); - + test_wrapper(|host, sid| async move { let (result, _) = futures::join!( // Choose a job that would normally take the entire timeout. host.precheck_pvf(rococo_runtime::WASM_BINARY.unwrap(), Default::default()), @@ -256,14 +278,7 @@ rusty_fork_test! { // What happens when the forked execute job dies in the middle of its job? #[test] fn forked_execute_job_killed_during_job() { - let rt = tokio::runtime::Runtime::new().unwrap(); - rt.block_on(async { - let host = TestHost::new().await; - - // Create a new session and get the session ID. - let sid = unsafe { libc::setsid() }; - assert!(sid > 0); - + test_wrapper(|host, sid| async move { // Prepare the artifact ahead of time. let binary = halt::wasm_binary_unwrap(); host.precheck_pvf(binary, Default::default()).await.unwrap(); @@ -273,7 +288,7 @@ rusty_fork_test! { host.validate_candidate( binary, ValidationParams { - block_data: BlockData(Vec::new()), + block_data: GenericBlockData(Vec::new()), parent_head: Default::default(), relay_parent_number: 1, relay_parent_storage_root: Default::default(), @@ -301,14 +316,7 @@ rusty_fork_test! { // See `run_worker` for why we need this invariant. #[test] fn ensure_prepare_processes_have_correct_num_threads() { - let rt = tokio::runtime::Runtime::new().unwrap(); - rt.block_on(async { - let host = TestHost::new().await; - - // Create a new session and get the session ID. - let sid = unsafe { libc::setsid() }; - assert!(sid > 0); - + test_wrapper(|host, sid| async move { let _ = futures::join!( // Choose a job that would normally take the entire timeout. host.precheck_pvf(rococo_runtime::WASM_BINARY.unwrap(), Default::default()), @@ -338,14 +346,7 @@ rusty_fork_test! { // See `run_worker` for why we need this invariant. #[test] fn ensure_execute_processes_have_correct_num_threads() { - let rt = tokio::runtime::Runtime::new().unwrap(); - rt.block_on(async { - let host = TestHost::new().await; - - // Create a new session and get the session ID. - let sid = unsafe { libc::setsid() }; - assert!(sid > 0); - + test_wrapper(|host, sid| async move { // Prepare the artifact ahead of time. let binary = halt::wasm_binary_unwrap(); host.precheck_pvf(binary, Default::default()).await.unwrap(); @@ -355,7 +356,7 @@ rusty_fork_test! { host.validate_candidate( binary, ValidationParams { - block_data: BlockData(Vec::new()), + block_data: GenericBlockData(Vec::new()), parent_head: Default::default(), relay_parent_number: 1, relay_parent_storage_root: Default::default(), -- GitLab From 9a27b53e8e0523e0c01df11abd492fc16af5a5bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Silva?= <123550+andresilva@users.noreply.github.com> Date: Sun, 31 Dec 2023 18:12:36 +0000 Subject: [PATCH 100/191] core-fellowship: allow infinite demotion period (#2828) --- .gitlab/pipeline/test.yml | 7 +++--- .../frame/core-fellowship/src/benchmarking.rs | 17 ++++++++++++++ substrate/frame/core-fellowship/src/lib.rs | 5 +++++ substrate/frame/core-fellowship/src/tests.rs | 22 +++++++++++++++++++ 4 files changed, 47 insertions(+), 4 deletions(-) diff --git a/.gitlab/pipeline/test.yml b/.gitlab/pipeline/test.yml index bbe9b612bc3..359d5b4dbcd 100644 --- a/.gitlab/pipeline/test.yml +++ b/.gitlab/pipeline/test.yml @@ -238,6 +238,8 @@ test-deterministic-wasm: cargo-check-benches: stage: test + artifacts: + expire_in: 10 days variables: CI_JOB_NAME: "cargo-check-benches" extends: @@ -303,13 +305,10 @@ node-bench-regression-guard: artifacts: true variables: CI_IMAGE: "paritytech/node-bench-regression-guard:latest" - # current git limit is 20, set to 100 to avoid failures (gitlab removes old artifacts) - GIT_DEPTH: 100 - GIT_STRATEGY: fetch before_script: [""] script: - if [ $(ls -la artifacts/benches/ | grep master | wc -l) == 0 ]; then - echo "Couldn't find master artifacts, consider increasing GIT_LIMIT variable"; + echo "Couldn't find master artifacts"; exit 1; fi - echo "------- IMPORTANT -------" diff --git a/substrate/frame/core-fellowship/src/benchmarking.rs b/substrate/frame/core-fellowship/src/benchmarking.rs index ea0b5c6d449..a3c410fac0a 100644 --- a/substrate/frame/core-fellowship/src/benchmarking.rs +++ b/substrate/frame/core-fellowship/src/benchmarking.rs @@ -53,6 +53,19 @@ mod benchmarks { Ok(member) } + fn set_benchmark_params, I: 'static>() -> Result<(), BenchmarkError> { + let params = ParamsType { + active_salary: [100u32.into(); 9], + passive_salary: [10u32.into(); 9], + demotion_period: [100u32.into(); 9], + min_promotion_period: [100u32.into(); 9], + offboard_timeout: 1u32.into(), + }; + + CoreFellowship::::set_params(RawOrigin::Root.into(), Box::new(params))?; + Ok(()) + } + #[benchmark] fn set_params() -> Result<(), BenchmarkError> { let params = ParamsType { @@ -72,6 +85,8 @@ mod benchmarks { #[benchmark] fn bump_offboard() -> Result<(), BenchmarkError> { + set_benchmark_params::()?; + let member = make_member::(0)?; // Set it to the max value to ensure that any possible auto-demotion period has passed. @@ -89,6 +104,8 @@ mod benchmarks { #[benchmark] fn bump_demote() -> Result<(), BenchmarkError> { + set_benchmark_params::()?; + let member = make_member::(2)?; // Set it to the max value to ensure that any possible auto-demotion period has passed. diff --git a/substrate/frame/core-fellowship/src/lib.rs b/substrate/frame/core-fellowship/src/lib.rs index 1aa53cf08d1..2042f68e714 100644 --- a/substrate/frame/core-fellowship/src/lib.rs +++ b/substrate/frame/core-fellowship/src/lib.rs @@ -298,6 +298,11 @@ pub mod pallet { let rank_index = Self::rank_to_index(rank).ok_or(Error::::InvalidRank)?; params.demotion_period[rank_index] }; + + if demotion_period.is_zero() { + return Err(Error::::NothingDoing.into()) + } + let demotion_block = member.last_proof.saturating_add(demotion_period); // Ensure enough time has passed. diff --git a/substrate/frame/core-fellowship/src/tests.rs b/substrate/frame/core-fellowship/src/tests.rs index 9ac381ab7f5..c9098f2171f 100644 --- a/substrate/frame/core-fellowship/src/tests.rs +++ b/substrate/frame/core-fellowship/src/tests.rs @@ -306,6 +306,28 @@ fn offboard_works() { }); } +#[test] +fn infinite_demotion_period_works() { + new_test_ext().execute_with(|| { + let params = ParamsType { + active_salary: [10; 9], + passive_salary: [10; 9], + min_promotion_period: [10; 9], + demotion_period: [0; 9], + offboard_timeout: 0, + }; + assert_ok!(CoreFellowship::set_params(signed(1), Box::new(params))); + + set_rank(0, 0); + assert_ok!(CoreFellowship::import(signed(0))); + set_rank(1, 1); + assert_ok!(CoreFellowship::import(signed(1))); + + assert_noop!(CoreFellowship::bump(signed(0), 0), Error::::NothingDoing); + assert_noop!(CoreFellowship::bump(signed(0), 1), Error::::NothingDoing); + }); +} + #[test] fn proof_postpones_auto_demote() { new_test_ext().execute_with(|| { -- GitLab From 1dd1a16066ace5cdb91bcd65f89faad8ea64e12d Mon Sep 17 00:00:00 2001 From: Squirrel Date: Mon, 1 Jan 2024 22:46:44 +0000 Subject: [PATCH 101/191] Extract PartialComponents into a type alias (#2767) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pulling PartialComponents into a named `Service` type stops clippy complaining about type complexity and also makes the type signatures a little less scary to read. There's two instances where we can't pull it out into a type because a nightly feature has not yet been stabilised (E.g. the `imp Fn` isn't stabilised in a type alias context here: https://github.com/paritytech/polkadot-sdk/blob/d84e135bbfc366a17bb6b72d0fc9d09ee781ab8d/polkadot/node/service/src/lib.rs#L477 ). --------- Co-authored-by: Bastian Köcher --- .../parachain-template/node/src/service.rs | 24 ++++++------ cumulus/polkadot-parachain/src/service.rs | 22 +++++------ cumulus/test/service/src/lib.rs | 22 +++++------ prdoc/pr_2767.prdoc | 17 +++++++++ substrate/bin/minimal/node/src/service.rs | 24 ++++++------ .../bin/node-template/node/src/service.rs | 37 +++++++------------ 6 files changed, 75 insertions(+), 71 deletions(-) create mode 100644 prdoc/pr_2767.prdoc diff --git a/cumulus/parachain-template/node/src/service.rs b/cumulus/parachain-template/node/src/service.rs index 43d16ee0d5b..830b6e82f96 100644 --- a/cumulus/parachain-template/node/src/service.rs +++ b/cumulus/parachain-template/node/src/service.rs @@ -59,23 +59,21 @@ type ParachainBackend = TFullBackend; type ParachainBlockImport = TParachainBlockImport, ParachainBackend>; +/// Assembly of PartialComponents (enough to run chain ops subcommands) +pub type Service = PartialComponents< + ParachainClient, + ParachainBackend, + (), + sc_consensus::DefaultImportQueue, + sc_transaction_pool::FullPool, + (ParachainBlockImport, Option, Option), +>; + /// Starts a `ServiceBuilder` for a full service. /// /// Use this macro if you don't actually need the full service, but just the builder in order to /// be able to perform chain operations. -pub fn new_partial( - config: &Configuration, -) -> Result< - PartialComponents< - ParachainClient, - ParachainBackend, - (), - sc_consensus::DefaultImportQueue, - sc_transaction_pool::FullPool, - (ParachainBlockImport, Option, Option), - >, - sc_service::Error, -> { +pub fn new_partial(config: &Configuration) -> Result { let telemetry = config .telemetry_endpoints .clone() diff --git a/cumulus/polkadot-parachain/src/service.rs b/cumulus/polkadot-parachain/src/service.rs index 77978a49f56..d5c12017859 100644 --- a/cumulus/polkadot-parachain/src/service.rs +++ b/cumulus/polkadot-parachain/src/service.rs @@ -216,6 +216,16 @@ impl sc_executor::NativeExecutionDispatch for PeopleRococoRuntimeExecutor { } } +/// Assembly of PartialComponents (enough to run chain ops subcommands) +pub type Service = PartialComponents< + ParachainClient, + ParachainBackend, + (), + sc_consensus::DefaultImportQueue, + sc_transaction_pool::FullPool>, + (ParachainBlockImport, Option, Option), +>; + /// Starts a `ServiceBuilder` for a full service. /// /// Use this macro if you don't actually need the full service, but just the builder in order to @@ -223,17 +233,7 @@ impl sc_executor::NativeExecutionDispatch for PeopleRococoRuntimeExecutor { pub fn new_partial( config: &Configuration, build_import_queue: BIQ, -) -> Result< - PartialComponents< - ParachainClient, - ParachainBackend, - (), - sc_consensus::DefaultImportQueue, - sc_transaction_pool::FullPool>, - (ParachainBlockImport, Option, Option), - >, - sc_service::Error, -> +) -> Result, sc_service::Error> where RuntimeApi: ConstructRuntimeApi> + Send + Sync + 'static, RuntimeApi::RuntimeApi: sp_transaction_pool::runtime_api::TaggedTransactionQueue diff --git a/cumulus/test/service/src/lib.rs b/cumulus/test/service/src/lib.rs index 586c4603c76..eca65dd4ca0 100644 --- a/cumulus/test/service/src/lib.rs +++ b/cumulus/test/service/src/lib.rs @@ -183,6 +183,16 @@ impl RecoveryHandle for FailingRecoveryHandle { } } +/// Assembly of PartialComponents (enough to run chain ops subcommands) +pub type Service = PartialComponents< + Client, + Backend, + (), + sc_consensus::import_queue::BasicQueue, + sc_transaction_pool::FullPool, + ParachainBlockImport, +>; + /// Starts a `ServiceBuilder` for a full service. /// /// Use this macro if you don't actually need the full service, but just the builder in order to @@ -190,17 +200,7 @@ impl RecoveryHandle for FailingRecoveryHandle { pub fn new_partial( config: &mut Configuration, enable_import_proof_record: bool, -) -> Result< - PartialComponents< - Client, - Backend, - (), - sc_consensus::import_queue::BasicQueue, - sc_transaction_pool::FullPool, - ParachainBlockImport, - >, - sc_service::Error, -> { +) -> Result { let heap_pages = config .default_heap_pages .map_or(DEFAULT_HEAP_ALLOC_STRATEGY, |h| HeapAllocStrategy::Static { extra_pages: h as _ }); diff --git a/prdoc/pr_2767.prdoc b/prdoc/pr_2767.prdoc new file mode 100644 index 00000000000..c2cd466c009 --- /dev/null +++ b/prdoc/pr_2767.prdoc @@ -0,0 +1,17 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Extract PartialComponents into type alias `Service` + +doc: + - audience: Node Dev + description: | + Simplifies service definitions by extraction of a complicated type into a type alias. No breaking changes. + +crates: + - name: "sc-service" + - name: "node-template" + - name: "minimal-node" + - name: "cumulus-test-service" + - name: "polkadot-parachain-bin" + - name: "parachain-template-node" diff --git a/substrate/bin/minimal/node/src/service.rs b/substrate/bin/minimal/node/src/service.rs index b6369c44dda..08db8b59361 100644 --- a/substrate/bin/minimal/node/src/service.rs +++ b/substrate/bin/minimal/node/src/service.rs @@ -38,19 +38,17 @@ pub(crate) type FullClient = type FullBackend = sc_service::TFullBackend; type FullSelectChain = sc_consensus::LongestChain; -pub fn new_partial( - config: &Configuration, -) -> Result< - sc_service::PartialComponents< - FullClient, - FullBackend, - FullSelectChain, - sc_consensus::DefaultImportQueue, - sc_transaction_pool::FullPool, - Option, - >, - ServiceError, -> { +/// Assembly of PartialComponents (enough to run chain ops subcommands) +pub type Service = sc_service::PartialComponents< + FullClient, + FullBackend, + FullSelectChain, + sc_consensus::DefaultImportQueue, + sc_transaction_pool::FullPool, + Option, +>; + +pub fn new_partial(config: &Configuration) -> Result { let telemetry = config .telemetry_endpoints .clone() diff --git a/substrate/bin/node-template/node/src/service.rs b/substrate/bin/node-template/node/src/service.rs index c4a2b2f39d2..25cd6511784 100644 --- a/substrate/bin/node-template/node/src/service.rs +++ b/substrate/bin/node-template/node/src/service.rs @@ -23,29 +23,20 @@ type FullSelectChain = sc_consensus::LongestChain; /// imported and generated. const GRANDPA_JUSTIFICATION_PERIOD: u32 = 512; -#[allow(clippy::type_complexity)] -pub fn new_partial( - config: &Configuration, -) -> Result< - sc_service::PartialComponents< - FullClient, - FullBackend, - FullSelectChain, - sc_consensus::DefaultImportQueue, - sc_transaction_pool::FullPool, - ( - sc_consensus_grandpa::GrandpaBlockImport< - FullBackend, - Block, - FullClient, - FullSelectChain, - >, - sc_consensus_grandpa::LinkHalf, - Option, - ), - >, - ServiceError, -> { +pub type Service = sc_service::PartialComponents< + FullClient, + FullBackend, + FullSelectChain, + sc_consensus::DefaultImportQueue, + sc_transaction_pool::FullPool, + ( + sc_consensus_grandpa::GrandpaBlockImport, + sc_consensus_grandpa::LinkHalf, + Option, + ), +>; + +pub fn new_partial(config: &Configuration) -> Result { let telemetry = config .telemetry_endpoints .clone() -- GitLab From 909c1e494549068a8ad386bb81cd801e1564e78d Mon Sep 17 00:00:00 2001 From: ordian Date: Tue, 2 Jan 2024 11:13:16 +0100 Subject: [PATCH 102/191] malus: use spawn_blocking (#2804) Looks like using `spawn` instead of `spawn_blocking` in malus is leading to a deadlock somehow. I'm not sure why exactly, but switching to `spawn_blocking` fixes https://github.com/paritytech/disabling-e2e-tests/issues/1, at least for `suggest-garbage-candidate` (didn't check other variants). Maybe my assumption here was wrong: https://github.com/paritytech/polkadot-sdk/pull/2184#discussion_r1403587674. --------- Co-authored-by: Tsvetomir Dimitrov --- polkadot/node/malus/src/variants/common.rs | 2 +- .../malus/src/variants/dispute_finalized_candidates.rs | 2 +- .../node/malus/src/variants/suggest_garbage_candidate.rs | 2 +- prdoc/pr_2804.prdoc | 9 +++++++++ 4 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 prdoc/pr_2804.prdoc diff --git a/polkadot/node/malus/src/variants/common.rs b/polkadot/node/malus/src/variants/common.rs index 92264cd653d..011fcc80e37 100644 --- a/polkadot/node/malus/src/variants/common.rs +++ b/polkadot/node/malus/src/variants/common.rs @@ -188,7 +188,7 @@ where let _candidate_descriptor = candidate_descriptor.clone(); let mut subsystem_sender = subsystem_sender.clone(); let (sender, receiver) = std::sync::mpsc::channel(); - self.spawner.spawn( + self.spawner.spawn_blocking( "malus-get-validation-data", Some("malus"), Box::pin(async move { diff --git a/polkadot/node/malus/src/variants/dispute_finalized_candidates.rs b/polkadot/node/malus/src/variants/dispute_finalized_candidates.rs index 113ab026879..7f83c386090 100644 --- a/polkadot/node/malus/src/variants/dispute_finalized_candidates.rs +++ b/polkadot/node/malus/src/variants/dispute_finalized_candidates.rs @@ -95,7 +95,7 @@ where let dispute_offset = self.dispute_offset; let mut sender = subsystem_sender.clone(); - self.spawner.spawn( + self.spawner.spawn_blocking( "malus-dispute-finalized-block", Some("malus"), Box::pin(async move { diff --git a/polkadot/node/malus/src/variants/suggest_garbage_candidate.rs b/polkadot/node/malus/src/variants/suggest_garbage_candidate.rs index 817afb58437..cf0ff5f809d 100644 --- a/polkadot/node/malus/src/variants/suggest_garbage_candidate.rs +++ b/polkadot/node/malus/src/variants/suggest_garbage_candidate.rs @@ -113,7 +113,7 @@ where let (sender, receiver) = std::sync::mpsc::channel(); let mut new_sender = subsystem_sender.clone(); let _candidate = candidate.clone(); - self.spawner.spawn( + self.spawner.spawn_blocking( "malus-get-validation-data", Some("malus"), Box::pin(async move { diff --git a/prdoc/pr_2804.prdoc b/prdoc/pr_2804.prdoc new file mode 100644 index 00000000000..456120741d9 --- /dev/null +++ b/prdoc/pr_2804.prdoc @@ -0,0 +1,9 @@ +title: Fix malus implementation. + +doc: + - audience: Node Dev + description: | + The malus implementation is used to test security of Polkadot. + It was broken. This fixes it. + +crates: [ ] -- GitLab From d842966484ff2dc5d5c56ccd93476ebf1a85f9ad Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Tue, 2 Jan 2024 11:46:49 +0100 Subject: [PATCH 103/191] Implement only sending one notification at a time as per RFC 56 (#2813) cc https://github.com/paritytech/polkadot-sdk/issues/2812 cc https://github.com/polkadot-fellows/RFCs/pull/56 Since this is a one line of code change, and for the sake of this not taking six months to be done, I've opted to open a PR myself. --------- Co-authored-by: Aaro Altonen <48052676+altonen@users.noreply.github.com> --- prdoc/pr_2813.prdoc | 11 +++++++++++ substrate/client/network/transactions/src/lib.rs | 15 ++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 prdoc/pr_2813.prdoc diff --git a/prdoc/pr_2813.prdoc b/prdoc/pr_2813.prdoc new file mode 100644 index 00000000000..ff6e5cf5cf6 --- /dev/null +++ b/prdoc/pr_2813.prdoc @@ -0,0 +1,11 @@ +title: "Implement only sending one notification at a time as per RFC 56" + +doc: + - audience: Node Dev + description: | + Transactions are now gossiped one at a time instead of as batches, as per RFC 56. This + allows decoding notifications without knowing how to decode individual transactions, and + allows for a more fine grained backpressure. + +crates: + - name: "sc-network-transactions" diff --git a/substrate/client/network/transactions/src/lib.rs b/substrate/client/network/transactions/src/lib.rs index 9758ea4c4fc..b2299667448 100644 --- a/substrate/client/network/transactions/src/lib.rs +++ b/substrate/client/network/transactions/src/lib.rs @@ -475,7 +475,20 @@ where propagated_to.entry(hash).or_default().push(who.to_base58()); } trace!(target: "sync", "Sending {} transactions to {}", to_send.len(), who); - let _ = self.notification_service.send_sync_notification(who, to_send.encode()); + // Historically, the format of a notification of the transactions protocol + // consisted in a (SCALE-encoded) `Vec`. + // After RFC 56, the format was modified in a backwards-compatible way to be + // a (SCALE-encoded) tuple `(Compact(1), Transaction)`, which is the same encoding + // as a `Vec` of length one. This is no coincidence, as the change was + // intentionally done in a backwards-compatible way. + // In other words, the `Vec` that is sent below **must** always have only a single + // element in it. + // See + for to_send in to_send { + let _ = self + .notification_service + .send_sync_notification(who, vec![to_send].encode()); + } } } -- GitLab From cad947951d9e4b2b4b9308db987c0153506f853e Mon Sep 17 00:00:00 2001 From: Juan Girini Date: Tue, 2 Jan 2024 20:39:51 +0100 Subject: [PATCH 104/191] Finish up polkadot doc (#2798) Closes https://github.com/paritytech/polkadot-sdk-docs/issues/66 --- docs/sdk/src/polkadot_sdk/polkadot.rs | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/docs/sdk/src/polkadot_sdk/polkadot.rs b/docs/sdk/src/polkadot_sdk/polkadot.rs index 056d7dd1cca..61a6877696c 100644 --- a/docs/sdk/src/polkadot_sdk/polkadot.rs +++ b/docs/sdk/src/polkadot_sdk/polkadot.rs @@ -23,7 +23,7 @@ //! //! ## Platform //! -//! In this section, we examine what what platform Polkadot exactly provides to developers. +//! In this section, we examine what platform Polkadot exactly provides to developers. //! //! ### Polkadot White Paper //! @@ -47,10 +47,12 @@ //! Chain*"). //! * (heterogenous) Sharded Execution: Yet, each parachain is free to have its own execution logic //! (runtime), which also encompasses governance and sovereignty. Moreover, Polkadot ensures the -//! correct execution of all parachain, without having all of its validators re-execute all -//! parachain blocks. When seen from this perspective, the fact that Polkadot executes different -//! parachains means it is a platform that has fully delivered (the holy grail of) "Full Execution -//! Sharding". TODO: link to approval checking article. +//! correct execution of all parachains, without having all of its validators re-execute all +//! parachain blocks. When seen from this perspective, Polkadot achieves the ability to verify +//! the validity of the block execution of multiple parachains using the same set of validators as +//! the Relay Chain. In practice, this means that the shards (parachains) share the same economic +//! security as the Relay Chain. +//! Learn about this process called [Approval Checking](https://polkadot.network/blog/polkadot-v1-0-sharding-and-economic-security#approval-checking-and-finality). //! * A framework to build blockchains: In order to materialize the ecosystem of parachains, an easy //! blockchain framework must exist. This is [Substrate](crate::polkadot_sdk::substrate), //! [FRAME](crate::polkadot_sdk::frame_runtime) and [Cumulus](crate::polkadot_sdk::cumulus). @@ -60,7 +62,12 @@ //! //! > Note that the interoperability promised by Polkadot is unparalleled in that any two parachains //! > connected to Polkadot have the same security and can have much better guarantees about the -//! > security of the recipient of any message. TODO: weakest link in bridges systems. +//! > security of the recipient of any message. +//! > Bridges enable transaction and information flow between different consensus systems, crucial +//! > for Polkadot's multi-chain architecture. However, they can become the network's most +//! > vulnerable points. If a bridge's security measures are weaker than those of the connected +//! > blockchains, it poses a significant risk. Attackers might exploit these weaknesses to launch +//! > attacks such as theft or disruption of services. //! //! Polkadot delivers the above vision, alongside a flexible means for parachains to schedule //! themselves with the Relay Chain. To achieve this, Polkadot has been developed with an @@ -83,5 +90,5 @@ //! Agile periodic-sale-based model for assigning Coretime on the Polkadot Ubiquitous Computer. //! - RFC#5: [Coretime-interface](https://github.com/polkadot-fellows/RFCs/blob/main/text/0005-coretime-interface.md): //! Interface for manipulating the usage of cores on the Polkadot Ubiquitous Computer. -// TODO: add more context and explanations about Polkadot as the Ubiquitous Computer and related -// tech. +//! +//! Learn more about [Polkadot as a Computational Resource](https://wiki.polkadot.network/docs/polkadot-direction#polkadot-as-a-computational-resource). -- GitLab From 73942e01384b29bf336b41f11eb6b8443ed27fa6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Jan 2024 10:51:35 +0100 Subject: [PATCH 105/191] Bump chevdor/srtool-actions from 0.9.1 to 0.9.2 (#2840) Bumps [chevdor/srtool-actions](https://github.com/chevdor/srtool-actions) from 0.9.1 to 0.9.2.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=chevdor/srtool-actions&package-manager=github_actions&previous-version=0.9.1&new-version=0.9.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-and-attach-release-runtimes.yml | 2 +- .github/workflows/srtool.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-and-attach-release-runtimes.yml b/.github/workflows/build-and-attach-release-runtimes.yml index f7003379cf0..680a9ecffd3 100644 --- a/.github/workflows/build-and-attach-release-runtimes.yml +++ b/.github/workflows/build-and-attach-release-runtimes.yml @@ -35,7 +35,7 @@ jobs: - name: Build ${{ matrix.runtime.name }} ${{ matrix.build_config.type }} id: srtool_build - uses: chevdor/srtool-actions@v0.9.1 + uses: chevdor/srtool-actions@v0.9.2 env: BUILD_OPTS: ${{ matrix.build_config.opts }} with: diff --git a/.github/workflows/srtool.yml b/.github/workflows/srtool.yml index 89659399fc6..eb15538f559 100644 --- a/.github/workflows/srtool.yml +++ b/.github/workflows/srtool.yml @@ -73,7 +73,7 @@ jobs: - name: Srtool build id: srtool_build - uses: chevdor/srtool-actions@v0.9.1 + uses: chevdor/srtool-actions@v0.9.2 with: chain: ${{ matrix.chain }} runtime_dir: ${{ matrix.runtime_dir }} -- GitLab From ac7352efd3cdc12ca9ab1fbde071e8613f477c8b Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Wed, 3 Jan 2024 14:27:35 +0300 Subject: [PATCH 106/191] Upgrade @polkadot/api and @polkadot/util package version to latest (#2821) Otherwise I'm getting this error: https://github.com/polkadot-js/api/pull/4952/files#diff-4cab1e3a83a624e52dc0c30047addb28184fdceac6acb930787af9c3aac50706L668 when running `./cumulus/scripts/bridges_rococo_westend.sh init-bridge-hub-rococo-local` - guess it is related to recent Snowbridge merge? --- .../package-lock.json | 1422 ++++++----------- .../generate_hex_encoded_call/package.json | 4 +- 2 files changed, 486 insertions(+), 940 deletions(-) diff --git a/cumulus/scripts/generate_hex_encoded_call/package-lock.json b/cumulus/scripts/generate_hex_encoded_call/package-lock.json index 3383265e779..b2dddaa19ed 100644 --- a/cumulus/scripts/generate_hex_encoded_call/package-lock.json +++ b/cumulus/scripts/generate_hex_encoded_call/package-lock.json @@ -9,1204 +9,750 @@ "version": "y", "license": "MIT", "dependencies": { - "@polkadot/api": "^6.5.2", - "@polkadot/util": "^7.6.1" + "@polkadot/api": "^10.11", + "@polkadot/util": "^12.6" } }, - "node_modules/@babel/runtime": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", - "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", + "node_modules/@noble/curves": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.3.0.tgz", + "integrity": "sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==", "dependencies": { - "regenerator-runtime": "^0.13.11" + "@noble/hashes": "1.3.3" }, - "engines": { - "node": ">=6.9.0" + "funding": { + "url": "https://paulmillr.com/funding/" } }, "node_modules/@noble/hashes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.0.0.tgz", - "integrity": "sha512-DZVbtY62kc3kkBtMHqwCOfXrT/hnoORy5BJ4+HU1IR59X0KWAOqsfzQPcUl/lQLlG7qXbe/fZ3r/emxtAl+sqg==" - }, - "node_modules/@noble/secp256k1": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.5.5.tgz", - "integrity": "sha512-sZ1W6gQzYnu45wPrWx8D3kwI2/U29VYTx9OjbDAd7jwRItJ0cSTMPRL/C8AWZFn9kWFLQGqEXVEE86w4Z8LpIQ==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, - "node_modules/@polkadot/api": { - "version": "6.12.1", - "resolved": "https://registry.npmjs.org/@polkadot/api/-/api-6.12.1.tgz", - "integrity": "sha512-RVdTiA2WaEvproM3i6E9TKS1bfXpPd9Ly9lUG/kVLaspjKoIot9DJUDTl97TJ+7xr8LXGbXqm448Ud0hsEBV8Q==", - "dependencies": { - "@babel/runtime": "^7.16.3", - "@polkadot/api-derive": "6.12.1", - "@polkadot/keyring": "^8.1.2", - "@polkadot/rpc-core": "6.12.1", - "@polkadot/rpc-provider": "6.12.1", - "@polkadot/types": "6.12.1", - "@polkadot/types-known": "6.12.1", - "@polkadot/util": "^8.1.2", - "@polkadot/util-crypto": "^8.1.2", - "eventemitter3": "^4.0.7", - "rxjs": "^7.4.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/api-derive": { - "version": "6.12.1", - "resolved": "https://registry.npmjs.org/@polkadot/api-derive/-/api-derive-6.12.1.tgz", - "integrity": "sha512-5LOVlG5EBCT+ytY6aHmQ4RdEWZovZQqRoc6DLd5BLhkR7BFTHKSkLQW+89so8jd0zEtmSXBVPPnsrXS8joM35Q==", - "dependencies": { - "@babel/runtime": "^7.16.3", - "@polkadot/api": "6.12.1", - "@polkadot/rpc-core": "6.12.1", - "@polkadot/types": "6.12.1", - "@polkadot/util": "^8.1.2", - "@polkadot/util-crypto": "^8.1.2", - "rxjs": "^7.4.0" - }, + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", + "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/api-derive/node_modules/@polkadot/util": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-8.7.1.tgz", - "integrity": "sha512-XjY1bTo7V6OvOCe4yn8H2vifeuBciCy0gq0k5P1tlGUQLI/Yt0hvDmxcA0FEPtqg8CL+rYRG7WXGPVNjkrNvyQ==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-bigint": "8.7.1", - "@polkadot/x-global": "8.7.1", - "@polkadot/x-textdecoder": "8.7.1", - "@polkadot/x-textencoder": "8.7.1", - "@types/bn.js": "^5.1.0", - "bn.js": "^5.2.0", - "ip-regex": "^4.3.0" + "node": ">= 16" }, - "engines": { - "node": ">=14.0.0" + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@polkadot/api-derive/node_modules/@polkadot/x-textdecoder": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-8.7.1.tgz", - "integrity": "sha512-ia0Ie2zi4VdQdNVD2GE2FZzBMfX//hEL4w546RMJfZM2LqDS674LofHmcyrsv5zscLnnRyCxZC1+J2dt+6MDIA==", + "node_modules/@polkadot/api": { + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/@polkadot/api/-/api-10.11.2.tgz", + "integrity": "sha512-AorCZxCWCoTtdbl4DPUZh+ACe/pbLIS1BkdQY0AFJuZllm0x/yWzjgampcPd5jQAA/O3iKShRBkZqj6Mk9yG/A==", "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" + "@polkadot/api-augment": "10.11.2", + "@polkadot/api-base": "10.11.2", + "@polkadot/api-derive": "10.11.2", + "@polkadot/keyring": "^12.6.2", + "@polkadot/rpc-augment": "10.11.2", + "@polkadot/rpc-core": "10.11.2", + "@polkadot/rpc-provider": "10.11.2", + "@polkadot/types": "10.11.2", + "@polkadot/types-augment": "10.11.2", + "@polkadot/types-codec": "10.11.2", + "@polkadot/types-create": "10.11.2", + "@polkadot/types-known": "10.11.2", + "@polkadot/util": "^12.6.2", + "@polkadot/util-crypto": "^12.6.2", + "eventemitter3": "^5.0.1", + "rxjs": "^7.8.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18" } }, - "node_modules/@polkadot/api-derive/node_modules/@polkadot/x-textencoder": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-8.7.1.tgz", - "integrity": "sha512-XDO0A27Xy+eJCKSxENroB8Dcnl+UclGG4ZBei+P/BqZ9rsjskUyd2Vsl6peMXAcsxwOE7g0uTvujoGM8jpKOXw==", + "node_modules/@polkadot/api-augment": { + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/@polkadot/api-augment/-/api-augment-10.11.2.tgz", + "integrity": "sha512-PTpnqpezc75qBqUtgrc0GYB8h9UHjfbHSRZamAbecIVAJ2/zc6CqtnldeaBlIu1IKTgBzi3FFtTyYu+ZGbNT2Q==", "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" + "@polkadot/api-base": "10.11.2", + "@polkadot/rpc-augment": "10.11.2", + "@polkadot/types": "10.11.2", + "@polkadot/types-augment": "10.11.2", + "@polkadot/types-codec": "10.11.2", + "@polkadot/util": "^12.6.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18" } }, - "node_modules/@polkadot/api-derive/node_modules/@types/bn.js": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", - "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", + "node_modules/@polkadot/api-base": { + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/@polkadot/api-base/-/api-base-10.11.2.tgz", + "integrity": "sha512-4LIjaUfO9nOzilxo7XqzYKCNMtmUypdk8oHPdrRnSjKEsnK7vDsNi+979z2KXNXd2KFSCFHENmI523fYnMnReg==", "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@polkadot/api-derive/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "node_modules/@polkadot/api/node_modules/@polkadot/util": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-8.7.1.tgz", - "integrity": "sha512-XjY1bTo7V6OvOCe4yn8H2vifeuBciCy0gq0k5P1tlGUQLI/Yt0hvDmxcA0FEPtqg8CL+rYRG7WXGPVNjkrNvyQ==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-bigint": "8.7.1", - "@polkadot/x-global": "8.7.1", - "@polkadot/x-textdecoder": "8.7.1", - "@polkadot/x-textencoder": "8.7.1", - "@types/bn.js": "^5.1.0", - "bn.js": "^5.2.0", - "ip-regex": "^4.3.0" + "@polkadot/rpc-core": "10.11.2", + "@polkadot/types": "10.11.2", + "@polkadot/util": "^12.6.2", + "rxjs": "^7.8.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18" } }, - "node_modules/@polkadot/api/node_modules/@polkadot/x-textdecoder": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-8.7.1.tgz", - "integrity": "sha512-ia0Ie2zi4VdQdNVD2GE2FZzBMfX//hEL4w546RMJfZM2LqDS674LofHmcyrsv5zscLnnRyCxZC1+J2dt+6MDIA==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/api/node_modules/@polkadot/x-textencoder": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-8.7.1.tgz", - "integrity": "sha512-XDO0A27Xy+eJCKSxENroB8Dcnl+UclGG4ZBei+P/BqZ9rsjskUyd2Vsl6peMXAcsxwOE7g0uTvujoGM8jpKOXw==", + "node_modules/@polkadot/api-derive": { + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/@polkadot/api-derive/-/api-derive-10.11.2.tgz", + "integrity": "sha512-m3BQbPionkd1iSlknddxnL2hDtolPIsT+aRyrtn4zgMRPoLjHFmTmovvg8RaUyYofJtZeYrnjMw0mdxiSXx7eA==", "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" + "@polkadot/api": "10.11.2", + "@polkadot/api-augment": "10.11.2", + "@polkadot/api-base": "10.11.2", + "@polkadot/rpc-core": "10.11.2", + "@polkadot/types": "10.11.2", + "@polkadot/types-codec": "10.11.2", + "@polkadot/util": "^12.6.2", + "@polkadot/util-crypto": "^12.6.2", + "rxjs": "^7.8.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18" } }, - "node_modules/@polkadot/api/node_modules/@types/bn.js": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", - "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@polkadot/api/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, "node_modules/@polkadot/keyring": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/keyring/-/keyring-8.7.1.tgz", - "integrity": "sha512-t6ZgQVC+nQT7XwbWtEhkDpiAzxKVJw8Xd/gWdww6xIrawHu7jo3SGB4QNdPgkf8TvDHYAAJiupzVQYAlOIq3GA==", + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/keyring/-/keyring-12.6.2.tgz", + "integrity": "sha512-O3Q7GVmRYm8q7HuB3S0+Yf/q/EB2egKRRU3fv9b3B7V+A52tKzA+vIwEmNVaD1g5FKW9oB97rmpggs0zaKFqHw==", "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/util": "8.7.1", - "@polkadot/util-crypto": "8.7.1" + "@polkadot/util": "12.6.2", + "@polkadot/util-crypto": "12.6.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18" }, "peerDependencies": { - "@polkadot/util": "8.7.1", - "@polkadot/util-crypto": "8.7.1" - } - }, - "node_modules/@polkadot/keyring/node_modules/@polkadot/util": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-8.7.1.tgz", - "integrity": "sha512-XjY1bTo7V6OvOCe4yn8H2vifeuBciCy0gq0k5P1tlGUQLI/Yt0hvDmxcA0FEPtqg8CL+rYRG7WXGPVNjkrNvyQ==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-bigint": "8.7.1", - "@polkadot/x-global": "8.7.1", - "@polkadot/x-textdecoder": "8.7.1", - "@polkadot/x-textencoder": "8.7.1", - "@types/bn.js": "^5.1.0", - "bn.js": "^5.2.0", - "ip-regex": "^4.3.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/keyring/node_modules/@polkadot/x-textdecoder": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-8.7.1.tgz", - "integrity": "sha512-ia0Ie2zi4VdQdNVD2GE2FZzBMfX//hEL4w546RMJfZM2LqDS674LofHmcyrsv5zscLnnRyCxZC1+J2dt+6MDIA==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/keyring/node_modules/@polkadot/x-textencoder": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-8.7.1.tgz", - "integrity": "sha512-XDO0A27Xy+eJCKSxENroB8Dcnl+UclGG4ZBei+P/BqZ9rsjskUyd2Vsl6peMXAcsxwOE7g0uTvujoGM8jpKOXw==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/keyring/node_modules/@types/bn.js": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", - "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", - "dependencies": { - "@types/node": "*" + "@polkadot/util": "12.6.2", + "@polkadot/util-crypto": "12.6.2" } }, - "node_modules/@polkadot/keyring/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, "node_modules/@polkadot/networks": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/networks/-/networks-8.7.1.tgz", - "integrity": "sha512-8xAmhDW0ry5EKcEjp6VTuwoTm0DdDo/zHsmx88P6sVL87gupuFsL+B6TrsYLl8GcaqxujwrOlKB+CKTUg7qFKg==", + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/networks/-/networks-12.6.2.tgz", + "integrity": "sha512-1oWtZm1IvPWqvMrldVH6NI2gBoCndl5GEwx7lAuQWGr7eNL+6Bdc5K3Z9T0MzFvDGoi2/CBqjX9dRKo39pDC/w==", "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/util": "8.7.1", - "@substrate/ss58-registry": "^1.17.0" + "@polkadot/util": "12.6.2", + "@substrate/ss58-registry": "^1.44.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18" } }, - "node_modules/@polkadot/networks/node_modules/@polkadot/util": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-8.7.1.tgz", - "integrity": "sha512-XjY1bTo7V6OvOCe4yn8H2vifeuBciCy0gq0k5P1tlGUQLI/Yt0hvDmxcA0FEPtqg8CL+rYRG7WXGPVNjkrNvyQ==", + "node_modules/@polkadot/rpc-augment": { + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/@polkadot/rpc-augment/-/rpc-augment-10.11.2.tgz", + "integrity": "sha512-9AhT0WW81/8jYbRcAC6PRmuxXqNhJje8OYiulBQHbG1DTCcjAfz+6VQBke9BwTStzPq7d526+yyBKD17O3zlAA==", "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-bigint": "8.7.1", - "@polkadot/x-global": "8.7.1", - "@polkadot/x-textdecoder": "8.7.1", - "@polkadot/x-textencoder": "8.7.1", - "@types/bn.js": "^5.1.0", - "bn.js": "^5.2.0", - "ip-regex": "^4.3.0" + "@polkadot/rpc-core": "10.11.2", + "@polkadot/types": "10.11.2", + "@polkadot/types-codec": "10.11.2", + "@polkadot/util": "^12.6.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18" } }, - "node_modules/@polkadot/networks/node_modules/@polkadot/x-textdecoder": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-8.7.1.tgz", - "integrity": "sha512-ia0Ie2zi4VdQdNVD2GE2FZzBMfX//hEL4w546RMJfZM2LqDS674LofHmcyrsv5zscLnnRyCxZC1+J2dt+6MDIA==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/networks/node_modules/@polkadot/x-textencoder": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-8.7.1.tgz", - "integrity": "sha512-XDO0A27Xy+eJCKSxENroB8Dcnl+UclGG4ZBei+P/BqZ9rsjskUyd2Vsl6peMXAcsxwOE7g0uTvujoGM8jpKOXw==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/networks/node_modules/@types/bn.js": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", - "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@polkadot/networks/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, "node_modules/@polkadot/rpc-core": { - "version": "6.12.1", - "resolved": "https://registry.npmjs.org/@polkadot/rpc-core/-/rpc-core-6.12.1.tgz", - "integrity": "sha512-Hb08D9zho3SB1UNlUCmG5q0gdgbOx25JKGLDfSYpD/wtD0Y1Sf2X5cfgtMoSYE3USWiRdCu4BxQkXTiRjPjzJg==", - "dependencies": { - "@babel/runtime": "^7.16.3", - "@polkadot/rpc-provider": "6.12.1", - "@polkadot/types": "6.12.1", - "@polkadot/util": "^8.1.2", - "rxjs": "^7.4.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/rpc-core/node_modules/@polkadot/util": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-8.7.1.tgz", - "integrity": "sha512-XjY1bTo7V6OvOCe4yn8H2vifeuBciCy0gq0k5P1tlGUQLI/Yt0hvDmxcA0FEPtqg8CL+rYRG7WXGPVNjkrNvyQ==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-bigint": "8.7.1", - "@polkadot/x-global": "8.7.1", - "@polkadot/x-textdecoder": "8.7.1", - "@polkadot/x-textencoder": "8.7.1", - "@types/bn.js": "^5.1.0", - "bn.js": "^5.2.0", - "ip-regex": "^4.3.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/rpc-core/node_modules/@polkadot/x-textdecoder": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-8.7.1.tgz", - "integrity": "sha512-ia0Ie2zi4VdQdNVD2GE2FZzBMfX//hEL4w546RMJfZM2LqDS674LofHmcyrsv5zscLnnRyCxZC1+J2dt+6MDIA==", + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/@polkadot/rpc-core/-/rpc-core-10.11.2.tgz", + "integrity": "sha512-Ot0CFLWx8sZhLZog20WDuniPA01Bk2StNDsdAQgcFKPwZw6ShPaZQCHuKLQK6I6DodOrem9FXX7c1hvoKJP5Ww==", "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" + "@polkadot/rpc-augment": "10.11.2", + "@polkadot/rpc-provider": "10.11.2", + "@polkadot/types": "10.11.2", + "@polkadot/util": "^12.6.2", + "rxjs": "^7.8.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18" } }, - "node_modules/@polkadot/rpc-core/node_modules/@polkadot/x-textencoder": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-8.7.1.tgz", - "integrity": "sha512-XDO0A27Xy+eJCKSxENroB8Dcnl+UclGG4ZBei+P/BqZ9rsjskUyd2Vsl6peMXAcsxwOE7g0uTvujoGM8jpKOXw==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/rpc-core/node_modules/@types/bn.js": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", - "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@polkadot/rpc-core/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, "node_modules/@polkadot/rpc-provider": { - "version": "6.12.1", - "resolved": "https://registry.npmjs.org/@polkadot/rpc-provider/-/rpc-provider-6.12.1.tgz", - "integrity": "sha512-uUHD3fLTOeZYWJoc6DQlhz+MJR33rVelasV+OxFY2nSD9MSNXRwQh+9UKDQBnyxw5B4BZ2QaEGfucDeavXmVDw==", - "dependencies": { - "@babel/runtime": "^7.16.3", - "@polkadot/types": "6.12.1", - "@polkadot/util": "^8.1.2", - "@polkadot/util-crypto": "^8.1.2", - "@polkadot/x-fetch": "^8.1.2", - "@polkadot/x-global": "^8.1.2", - "@polkadot/x-ws": "^8.1.2", - "eventemitter3": "^4.0.7" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/rpc-provider/node_modules/@polkadot/util": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-8.7.1.tgz", - "integrity": "sha512-XjY1bTo7V6OvOCe4yn8H2vifeuBciCy0gq0k5P1tlGUQLI/Yt0hvDmxcA0FEPtqg8CL+rYRG7WXGPVNjkrNvyQ==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-bigint": "8.7.1", - "@polkadot/x-global": "8.7.1", - "@polkadot/x-textdecoder": "8.7.1", - "@polkadot/x-textencoder": "8.7.1", - "@types/bn.js": "^5.1.0", - "bn.js": "^5.2.0", - "ip-regex": "^4.3.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/rpc-provider/node_modules/@polkadot/x-textdecoder": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-8.7.1.tgz", - "integrity": "sha512-ia0Ie2zi4VdQdNVD2GE2FZzBMfX//hEL4w546RMJfZM2LqDS674LofHmcyrsv5zscLnnRyCxZC1+J2dt+6MDIA==", + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/@polkadot/rpc-provider/-/rpc-provider-10.11.2.tgz", + "integrity": "sha512-he5jWMpDJp7e+vUzTZDzpkB7ps3H8psRally+/ZvZZScPvFEjfczT7I1WWY9h58s8+ImeVP/lkXjL9h/gUOt3Q==", "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" + "@polkadot/keyring": "^12.6.2", + "@polkadot/types": "10.11.2", + "@polkadot/types-support": "10.11.2", + "@polkadot/util": "^12.6.2", + "@polkadot/util-crypto": "^12.6.2", + "@polkadot/x-fetch": "^12.6.2", + "@polkadot/x-global": "^12.6.2", + "@polkadot/x-ws": "^12.6.2", + "eventemitter3": "^5.0.1", + "mock-socket": "^9.3.1", + "nock": "^13.4.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/rpc-provider/node_modules/@polkadot/x-textencoder": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-8.7.1.tgz", - "integrity": "sha512-XDO0A27Xy+eJCKSxENroB8Dcnl+UclGG4ZBei+P/BqZ9rsjskUyd2Vsl6peMXAcsxwOE7g0uTvujoGM8jpKOXw==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" + "node": ">=18" }, - "engines": { - "node": ">=14.0.0" + "optionalDependencies": { + "@substrate/connect": "0.7.35" } }, - "node_modules/@polkadot/rpc-provider/node_modules/@types/bn.js": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", - "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@polkadot/rpc-provider/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, "node_modules/@polkadot/types": { - "version": "6.12.1", - "resolved": "https://registry.npmjs.org/@polkadot/types/-/types-6.12.1.tgz", - "integrity": "sha512-O37cAGUL0xiXTuO3ySweVh0OuFUD6asrd0TfuzGsEp3jAISWdElEHV5QDiftWq8J9Vf8BMgTcP2QLFbmSusxqA==", - "dependencies": { - "@babel/runtime": "^7.16.3", - "@polkadot/types-known": "6.12.1", - "@polkadot/util": "^8.1.2", - "@polkadot/util-crypto": "^8.1.2", - "rxjs": "^7.4.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/types-known": { - "version": "6.12.1", - "resolved": "https://registry.npmjs.org/@polkadot/types-known/-/types-known-6.12.1.tgz", - "integrity": "sha512-Z8bHpPQy+mqUm0uR1tai6ra0bQIoPmgRcGFYUM+rJtW1kx/6kZLh10HAICjLpPeA1cwLRzaxHRDqH5MCU6OgXw==", + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/@polkadot/types/-/types-10.11.2.tgz", + "integrity": "sha512-d52j3xXni+C8GdYZVTSfu8ROAnzXFMlyRvXtor0PudUc8UQHOaC4+mYAkTBGA2gKdmL8MHSfRSbhcxHhsikY6Q==", "dependencies": { - "@babel/runtime": "^7.16.3", - "@polkadot/networks": "^8.1.2", - "@polkadot/types": "6.12.1", - "@polkadot/util": "^8.1.2" + "@polkadot/keyring": "^12.6.2", + "@polkadot/types-augment": "10.11.2", + "@polkadot/types-codec": "10.11.2", + "@polkadot/types-create": "10.11.2", + "@polkadot/util": "^12.6.2", + "@polkadot/util-crypto": "^12.6.2", + "rxjs": "^7.8.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18" } }, - "node_modules/@polkadot/types-known/node_modules/@polkadot/util": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-8.7.1.tgz", - "integrity": "sha512-XjY1bTo7V6OvOCe4yn8H2vifeuBciCy0gq0k5P1tlGUQLI/Yt0hvDmxcA0FEPtqg8CL+rYRG7WXGPVNjkrNvyQ==", + "node_modules/@polkadot/types-augment": { + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/@polkadot/types-augment/-/types-augment-10.11.2.tgz", + "integrity": "sha512-8eB8ew04wZiE5GnmFvEFW1euJWmF62SGxb1O+8wL3zoUtB9Xgo1vB6w6xbTrd+HLV6jNSeXXnbbF1BEUvi9cNg==", "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-bigint": "8.7.1", - "@polkadot/x-global": "8.7.1", - "@polkadot/x-textdecoder": "8.7.1", - "@polkadot/x-textencoder": "8.7.1", - "@types/bn.js": "^5.1.0", - "bn.js": "^5.2.0", - "ip-regex": "^4.3.0" + "@polkadot/types": "10.11.2", + "@polkadot/types-codec": "10.11.2", + "@polkadot/util": "^12.6.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18" } }, - "node_modules/@polkadot/types-known/node_modules/@polkadot/x-textdecoder": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-8.7.1.tgz", - "integrity": "sha512-ia0Ie2zi4VdQdNVD2GE2FZzBMfX//hEL4w546RMJfZM2LqDS674LofHmcyrsv5zscLnnRyCxZC1+J2dt+6MDIA==", + "node_modules/@polkadot/types-codec": { + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/@polkadot/types-codec/-/types-codec-10.11.2.tgz", + "integrity": "sha512-3xjOQL+LOOMzYqlgP9ROL0FQnzU8lGflgYewzau7AsDlFziSEtb49a9BpYo6zil4koC+QB8zQ9OHGFumG08T8w==", "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" + "@polkadot/util": "^12.6.2", + "@polkadot/x-bigint": "^12.6.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18" } }, - "node_modules/@polkadot/types-known/node_modules/@polkadot/x-textencoder": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-8.7.1.tgz", - "integrity": "sha512-XDO0A27Xy+eJCKSxENroB8Dcnl+UclGG4ZBei+P/BqZ9rsjskUyd2Vsl6peMXAcsxwOE7g0uTvujoGM8jpKOXw==", + "node_modules/@polkadot/types-create": { + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/@polkadot/types-create/-/types-create-10.11.2.tgz", + "integrity": "sha512-SJt23NxYvefRxVZZm6mT9ed1pR6FDoIGQ3xUpbjhTLfU2wuhpKjekMVorYQ6z/gK2JLMu2kV92Ardsz+6GX5XQ==", "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" + "@polkadot/types-codec": "10.11.2", + "@polkadot/util": "^12.6.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/types-known/node_modules/@types/bn.js": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", - "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", - "dependencies": { - "@types/node": "*" + "node": ">=18" } }, - "node_modules/@polkadot/types-known/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "node_modules/@polkadot/types/node_modules/@polkadot/util": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-8.7.1.tgz", - "integrity": "sha512-XjY1bTo7V6OvOCe4yn8H2vifeuBciCy0gq0k5P1tlGUQLI/Yt0hvDmxcA0FEPtqg8CL+rYRG7WXGPVNjkrNvyQ==", - "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-bigint": "8.7.1", - "@polkadot/x-global": "8.7.1", - "@polkadot/x-textdecoder": "8.7.1", - "@polkadot/x-textencoder": "8.7.1", - "@types/bn.js": "^5.1.0", - "bn.js": "^5.2.0", - "ip-regex": "^4.3.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/types/node_modules/@polkadot/x-textdecoder": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-8.7.1.tgz", - "integrity": "sha512-ia0Ie2zi4VdQdNVD2GE2FZzBMfX//hEL4w546RMJfZM2LqDS674LofHmcyrsv5zscLnnRyCxZC1+J2dt+6MDIA==", + "node_modules/@polkadot/types-known": { + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/@polkadot/types-known/-/types-known-10.11.2.tgz", + "integrity": "sha512-kbEIX7NUQFxpDB0FFGNyXX/odY7jbp56RGD+Z4A731fW2xh/DgAQrI994xTzuh0c0EqPE26oQm3kATSpseqo9w==", "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" + "@polkadot/networks": "^12.6.2", + "@polkadot/types": "10.11.2", + "@polkadot/types-codec": "10.11.2", + "@polkadot/types-create": "10.11.2", + "@polkadot/util": "^12.6.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18" } }, - "node_modules/@polkadot/types/node_modules/@polkadot/x-textencoder": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-8.7.1.tgz", - "integrity": "sha512-XDO0A27Xy+eJCKSxENroB8Dcnl+UclGG4ZBei+P/BqZ9rsjskUyd2Vsl6peMXAcsxwOE7g0uTvujoGM8jpKOXw==", + "node_modules/@polkadot/types-support": { + "version": "10.11.2", + "resolved": "https://registry.npmjs.org/@polkadot/types-support/-/types-support-10.11.2.tgz", + "integrity": "sha512-X11hoykFYv/3efg4coZy2hUOUc97JhjQMJLzDhHniFwGLlYU8MeLnPdCVGkXx0xDDjTo4/ptS1XpZ5HYcg+gRw==", "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" + "@polkadot/util": "^12.6.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18" } }, - "node_modules/@polkadot/types/node_modules/@types/bn.js": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", - "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@polkadot/types/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, "node_modules/@polkadot/util": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-7.9.2.tgz", - "integrity": "sha512-6ABY6ErgkCsM4C6+X+AJSY4pBGwbKlHZmUtHftaiTvbaj4XuA4nTo3GU28jw8wY0Jh2cJZJvt6/BJ5GVkm5tBA==", + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-12.6.2.tgz", + "integrity": "sha512-l8TubR7CLEY47240uki0TQzFvtnxFIO7uI/0GoWzpYD/O62EIAMRsuY01N4DuwgKq2ZWD59WhzsLYmA5K6ksdw==", "dependencies": { - "@babel/runtime": "^7.16.3", - "@polkadot/x-textdecoder": "7.9.2", - "@polkadot/x-textencoder": "7.9.2", - "@types/bn.js": "^4.11.6", - "bn.js": "^4.12.0", - "camelcase": "^6.2.1", - "ip-regex": "^4.3.0" + "@polkadot/x-bigint": "12.6.2", + "@polkadot/x-global": "12.6.2", + "@polkadot/x-textdecoder": "12.6.2", + "@polkadot/x-textencoder": "12.6.2", + "@types/bn.js": "^5.1.5", + "bn.js": "^5.2.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18" } }, "node_modules/@polkadot/util-crypto": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/util-crypto/-/util-crypto-8.7.1.tgz", - "integrity": "sha512-TaSuJ2aNrB5sYK7YXszkEv24nYJKRFqjF2OrggoMg6uYxUAECvTkldFnhtgeizMweRMxJIBu6bMHlSIutbWgjw==", + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/util-crypto/-/util-crypto-12.6.2.tgz", + "integrity": "sha512-FEWI/dJ7wDMNN1WOzZAjQoIcCP/3vz3wvAp5QQm+lOrzOLj0iDmaIGIcBkz8HVm3ErfSe/uKP0KS4jgV/ib+Mg==", "dependencies": { - "@babel/runtime": "^7.17.8", - "@noble/hashes": "1.0.0", - "@noble/secp256k1": "1.5.5", - "@polkadot/networks": "8.7.1", - "@polkadot/util": "8.7.1", - "@polkadot/wasm-crypto": "^5.1.1", - "@polkadot/x-bigint": "8.7.1", - "@polkadot/x-randomvalues": "8.7.1", - "@scure/base": "1.0.0", - "ed2curve": "^0.3.0", - "tweetnacl": "^1.0.3" + "@noble/curves": "^1.3.0", + "@noble/hashes": "^1.3.3", + "@polkadot/networks": "12.6.2", + "@polkadot/util": "12.6.2", + "@polkadot/wasm-crypto": "^7.3.2", + "@polkadot/wasm-util": "^7.3.2", + "@polkadot/x-bigint": "12.6.2", + "@polkadot/x-randomvalues": "12.6.2", + "@scure/base": "^1.1.5", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18" }, "peerDependencies": { - "@polkadot/util": "8.7.1" + "@polkadot/util": "12.6.2" } }, - "node_modules/@polkadot/util-crypto/node_modules/@polkadot/util": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-8.7.1.tgz", - "integrity": "sha512-XjY1bTo7V6OvOCe4yn8H2vifeuBciCy0gq0k5P1tlGUQLI/Yt0hvDmxcA0FEPtqg8CL+rYRG7WXGPVNjkrNvyQ==", + "node_modules/@polkadot/wasm-bridge": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-bridge/-/wasm-bridge-7.3.2.tgz", + "integrity": "sha512-AJEXChcf/nKXd5Q/YLEV5dXQMle3UNT7jcXYmIffZAo/KI394a+/24PaISyQjoNC0fkzS1Q8T5pnGGHmXiVz2g==", "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-bigint": "8.7.1", - "@polkadot/x-global": "8.7.1", - "@polkadot/x-textdecoder": "8.7.1", - "@polkadot/x-textencoder": "8.7.1", - "@types/bn.js": "^5.1.0", - "bn.js": "^5.2.0", - "ip-regex": "^4.3.0" + "@polkadot/wasm-util": "7.3.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18" + }, + "peerDependencies": { + "@polkadot/util": "*", + "@polkadot/x-randomvalues": "*" } }, - "node_modules/@polkadot/util-crypto/node_modules/@polkadot/x-textdecoder": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-8.7.1.tgz", - "integrity": "sha512-ia0Ie2zi4VdQdNVD2GE2FZzBMfX//hEL4w546RMJfZM2LqDS674LofHmcyrsv5zscLnnRyCxZC1+J2dt+6MDIA==", + "node_modules/@polkadot/wasm-crypto": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto/-/wasm-crypto-7.3.2.tgz", + "integrity": "sha512-+neIDLSJ6jjVXsjyZ5oLSv16oIpwp+PxFqTUaZdZDoA2EyFRQB8pP7+qLsMNk+WJuhuJ4qXil/7XiOnZYZ+wxw==", "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" + "@polkadot/wasm-bridge": "7.3.2", + "@polkadot/wasm-crypto-asmjs": "7.3.2", + "@polkadot/wasm-crypto-init": "7.3.2", + "@polkadot/wasm-crypto-wasm": "7.3.2", + "@polkadot/wasm-util": "7.3.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18" + }, + "peerDependencies": { + "@polkadot/util": "*", + "@polkadot/x-randomvalues": "*" } }, - "node_modules/@polkadot/util-crypto/node_modules/@polkadot/x-textencoder": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-8.7.1.tgz", - "integrity": "sha512-XDO0A27Xy+eJCKSxENroB8Dcnl+UclGG4ZBei+P/BqZ9rsjskUyd2Vsl6peMXAcsxwOE7g0uTvujoGM8jpKOXw==", + "node_modules/@polkadot/wasm-crypto-asmjs": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto-asmjs/-/wasm-crypto-asmjs-7.3.2.tgz", + "integrity": "sha512-QP5eiUqUFur/2UoF2KKKYJcesc71fXhQFLT3D4ZjG28Mfk2ZPI0QNRUfpcxVQmIUpV5USHg4geCBNuCYsMm20Q==", "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@polkadot/util-crypto/node_modules/@types/bn.js": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", - "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", - "dependencies": { - "@types/node": "*" + "node": ">=18" + }, + "peerDependencies": { + "@polkadot/util": "*" } }, - "node_modules/@polkadot/util-crypto/node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "node_modules/@polkadot/wasm-crypto": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto/-/wasm-crypto-5.1.1.tgz", - "integrity": "sha512-JCcAVfH8DhYuEyd4oX1ouByxhou0TvpErKn8kHjtzt7+tRoFi0nzWlmK4z49vszsV3JJgXxV81i10C0BYlwTcQ==", + "node_modules/@polkadot/wasm-crypto-init": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto-init/-/wasm-crypto-init-7.3.2.tgz", + "integrity": "sha512-FPq73zGmvZtnuJaFV44brze3Lkrki3b4PebxCy9Fplw8nTmisKo9Xxtfew08r0njyYh+uiJRAxPCXadkC9sc8g==", "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/wasm-crypto-asmjs": "^5.1.1", - "@polkadot/wasm-crypto-wasm": "^5.1.1" + "@polkadot/wasm-bridge": "7.3.2", + "@polkadot/wasm-crypto-asmjs": "7.3.2", + "@polkadot/wasm-crypto-wasm": "7.3.2", + "@polkadot/wasm-util": "7.3.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18" }, "peerDependencies": { "@polkadot/util": "*", "@polkadot/x-randomvalues": "*" } }, - "node_modules/@polkadot/wasm-crypto-asmjs": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto-asmjs/-/wasm-crypto-asmjs-5.1.1.tgz", - "integrity": "sha512-1WBwc2G3pZMKW1T01uXzKE30Sg22MXmF3RbbZiWWk3H2d/Er4jZQRpjumxO5YGWan+xOb7HQQdwnrUnrPgbDhg==", + "node_modules/@polkadot/wasm-crypto-wasm": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto-wasm/-/wasm-crypto-wasm-7.3.2.tgz", + "integrity": "sha512-15wd0EMv9IXs5Abp1ZKpKKAVyZPhATIAHfKsyoWCEFDLSOA0/K0QGOxzrAlsrdUkiKZOq7uzSIgIDgW8okx2Mw==", "dependencies": { - "@babel/runtime": "^7.17.8" + "@polkadot/wasm-util": "7.3.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18" }, "peerDependencies": { "@polkadot/util": "*" } }, - "node_modules/@polkadot/wasm-crypto-wasm": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto-wasm/-/wasm-crypto-wasm-5.1.1.tgz", - "integrity": "sha512-F9PZ30J2S8vUNl2oY7Myow5Xsx5z5uNVpnNlJwlmY8IXBvyucvyQ4HSdhJsrbs4W1BfFc0mHghxgp0FbBCnf/Q==", + "node_modules/@polkadot/wasm-util": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/@polkadot/wasm-util/-/wasm-util-7.3.2.tgz", + "integrity": "sha512-bmD+Dxo1lTZyZNxbyPE380wd82QsX+43mgCm40boyKrRppXEyQmWT98v/Poc7chLuskYb6X8IQ6lvvK2bGR4Tg==", "dependencies": { - "@babel/runtime": "^7.17.8" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18" }, "peerDependencies": { "@polkadot/util": "*" } }, "node_modules/@polkadot/x-bigint": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-bigint/-/x-bigint-8.7.1.tgz", - "integrity": "sha512-ClkhgdB/KqcAKk3zA6Qw8wBL6Wz67pYTPkrAtImpvoPJmR+l4RARauv+MH34JXMUNlNb3aUwqN6lq2Z1zN+mJg==", + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/x-bigint/-/x-bigint-12.6.2.tgz", + "integrity": "sha512-HSIk60uFPX4GOFZSnIF7VYJz7WZA7tpFJsne7SzxOooRwMTWEtw3fUpFy5cYYOeLh17/kHH1Y7SVcuxzVLc74Q==", "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" + "@polkadot/x-global": "12.6.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18" } }, "node_modules/@polkadot/x-fetch": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-fetch/-/x-fetch-8.7.1.tgz", - "integrity": "sha512-ygNparcalYFGbspXtdtZOHvNXZBkNgmNO+um9C0JYq74K5OY9/be93uyfJKJ8JcRJtOqBfVDsJpbiRkuJ1PRfg==", + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/x-fetch/-/x-fetch-12.6.2.tgz", + "integrity": "sha512-8wM/Z9JJPWN1pzSpU7XxTI1ldj/AfC8hKioBlUahZ8gUiJaOF7K9XEFCrCDLis/A1BoOu7Ne6WMx/vsJJIbDWw==", "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1", - "@types/node-fetch": "^2.6.1", - "node-fetch": "^2.6.7" + "@polkadot/x-global": "12.6.2", + "node-fetch": "^3.3.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18" } }, "node_modules/@polkadot/x-global": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-global/-/x-global-8.7.1.tgz", - "integrity": "sha512-WOgUor16IihgNVdiTVGAWksYLUAlqjmODmIK1cuWrLOZtV1VBomWcb3obkO9sh5P6iWziAvCB/i+L0vnTN9ZCA==", + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/x-global/-/x-global-12.6.2.tgz", + "integrity": "sha512-a8d6m+PW98jmsYDtAWp88qS4dl8DyqUBsd0S+WgyfSMtpEXu6v9nXDgPZgwF5xdDvXhm+P0ZfVkVTnIGrScb5g==", "dependencies": { - "@babel/runtime": "^7.17.8" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18" } }, "node_modules/@polkadot/x-randomvalues": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-randomvalues/-/x-randomvalues-8.7.1.tgz", - "integrity": "sha512-njt17MlfN6yNyNEti7fL12lr5qM6A1aSGkWKVuqzc7XwSBesifJuW4km5u6r2gwhXjH2eHDv9SoQ7WXu8vrrkg==", + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/x-randomvalues/-/x-randomvalues-12.6.2.tgz", + "integrity": "sha512-Vr8uG7rH2IcNJwtyf5ebdODMcr0XjoCpUbI91Zv6AlKVYOGKZlKLYJHIwpTaKKB+7KPWyQrk4Mlym/rS7v9feg==", "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1" + "@polkadot/x-global": "12.6.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18" + }, + "peerDependencies": { + "@polkadot/util": "12.6.2", + "@polkadot/wasm-util": "*" } }, "node_modules/@polkadot/x-textdecoder": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-7.9.2.tgz", - "integrity": "sha512-wfwbSHXPhrOAl12QvlIOGNkMH/N/h8PId2ytIjvM/8zPPFB5Il6DWSFLtVapOGEpIFjEWbd5t8Td4pHBVXIEbg==", + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-12.6.2.tgz", + "integrity": "sha512-M1Bir7tYvNappfpFWXOJcnxUhBUFWkUFIdJSyH0zs5LmFtFdbKAeiDXxSp2Swp5ddOZdZgPac294/o2TnQKN1w==", "dependencies": { - "@babel/runtime": "^7.16.3", - "@polkadot/x-global": "7.9.2" + "@polkadot/x-global": "12.6.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18" } }, - "node_modules/@polkadot/x-textdecoder/node_modules/@polkadot/x-global": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@polkadot/x-global/-/x-global-7.9.2.tgz", - "integrity": "sha512-JX5CrGWckHf1P9xKXq4vQCAuMUbL81l2hOWX7xeP8nv4caHEpmf5T1wD1iMdQBL5PFifo6Pg0V6/oZBB+bts7A==", + "node_modules/@polkadot/x-textencoder": { + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-12.6.2.tgz", + "integrity": "sha512-4N+3UVCpI489tUJ6cv3uf0PjOHvgGp9Dl+SZRLgFGt9mvxnvpW/7+XBADRMtlG4xi5gaRK7bgl5bmY6OMDsNdw==", "dependencies": { - "@babel/runtime": "^7.16.3" + "@polkadot/x-global": "12.6.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18" } }, - "node_modules/@polkadot/x-textencoder": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-7.9.2.tgz", - "integrity": "sha512-A19wwYINuZwU2dUyQ/mMzB0ISjyfc4cISfL4zCMUAVgj7xVoXMYV2GfjNdMpA8Wsjch3su6pxLbtJ2wU03sRTQ==", + "node_modules/@polkadot/x-ws": { + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/@polkadot/x-ws/-/x-ws-12.6.2.tgz", + "integrity": "sha512-cGZWo7K5eRRQCRl2LrcyCYsrc3lRbTlixZh3AzgU8uX4wASVGRlNWi/Hf4TtHNe1ExCDmxabJzdIsABIfrr7xw==", "dependencies": { - "@babel/runtime": "^7.16.3", - "@polkadot/x-global": "7.9.2" + "@polkadot/x-global": "12.6.2", + "tslib": "^2.6.2", + "ws": "^8.15.1" }, "engines": { - "node": ">=14.0.0" + "node": ">=18" } }, - "node_modules/@polkadot/x-textencoder/node_modules/@polkadot/x-global": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/@polkadot/x-global/-/x-global-7.9.2.tgz", - "integrity": "sha512-JX5CrGWckHf1P9xKXq4vQCAuMUbL81l2hOWX7xeP8nv4caHEpmf5T1wD1iMdQBL5PFifo6Pg0V6/oZBB+bts7A==", - "dependencies": { - "@babel/runtime": "^7.16.3" - }, - "engines": { - "node": ">=14.0.0" + "node_modules/@scure/base": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.5.tgz", + "integrity": "sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ==", + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@polkadot/x-ws": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/@polkadot/x-ws/-/x-ws-8.7.1.tgz", - "integrity": "sha512-Mt0tcNzGXyKnN3DQ06alkv+JLtTfXWu6zSypFrrKHSQe3u79xMQ1nSicmpT3gWLhIa8YF+8CYJXMrqaXgCnDhw==", + "node_modules/@substrate/connect": { + "version": "0.7.35", + "resolved": "https://registry.npmjs.org/@substrate/connect/-/connect-0.7.35.tgz", + "integrity": "sha512-Io8vkalbwaye+7yXfG1Nj52tOOoJln2bMlc7Q9Yy3vEWqZEVkgKmcPVzbwV0CWL3QD+KMPDA2Dnw/X7EdwgoLw==", + "hasInstallScript": true, + "optional": true, "dependencies": { - "@babel/runtime": "^7.17.8", - "@polkadot/x-global": "8.7.1", - "@types/websocket": "^1.0.5", - "websocket": "^1.0.34" - }, - "engines": { - "node": ">=14.0.0" + "@substrate/connect-extension-protocol": "^1.0.1", + "smoldot": "2.0.7" } }, - "node_modules/@scure/base": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.0.0.tgz", - "integrity": "sha512-gIVaYhUsy+9s58m/ETjSJVKHhKTBMmcRb9cEV5/5dwvfDlfORjKrFsDeDHWRrm6RjcPvCLZFwGJjAjLj1gg4HA==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] + "node_modules/@substrate/connect-extension-protocol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@substrate/connect-extension-protocol/-/connect-extension-protocol-1.0.1.tgz", + "integrity": "sha512-161JhCC1csjH3GE5mPLEd7HbWtwNSPJBg3p1Ksz9SFlTzj/bgEwudiRN2y5i0MoLGCIJRYKyKGMxVnd29PzNjg==", + "optional": true }, "node_modules/@substrate/ss58-registry": { - "version": "1.38.0", - "resolved": "https://registry.npmjs.org/@substrate/ss58-registry/-/ss58-registry-1.38.0.tgz", - "integrity": "sha512-sHiVRWekGMRZAjPukN9/W166NM6D5wtHcK6RVyLy66kg3CHNZ1BXfpXcjOiXSwhbd7guQFDEwnOVaDrbk1XL1g==" + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/@substrate/ss58-registry/-/ss58-registry-1.44.0.tgz", + "integrity": "sha512-7lQ/7mMCzVNSEfDS4BCqnRnKCFKpcOaPrxMeGTXHX1YQzM/m2BBHjbK2C3dJvjv7GYxMiaTq/HdWQj1xS6ss+A==" }, "node_modules/@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.5.tgz", + "integrity": "sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/node": { - "version": "18.11.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", - "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==" - }, - "node_modules/@types/node-fetch": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", - "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", + "version": "20.10.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz", + "integrity": "sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==", "dependencies": { - "@types/node": "*", - "form-data": "^3.0.0" - } - }, - "node_modules/@types/websocket": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/websocket/-/websocket-1.0.5.tgz", - "integrity": "sha512-NbsqiNX9CnEfC1Z0Vf4mE1SgAJ07JnRYcNex7AJ9zAVzmiGHmjKFEk7O4TJIsgv2B1sLEb6owKFZrACwdYngsQ==", - "dependencies": { - "@types/node": "*" + "undici-types": "~5.26.4" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, "node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" }, - "node_modules/bufferutil": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", - "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", - "hasInstallScript": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", "engines": { - "node": ">=6.14.2" + "node": ">= 12" } }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "delayed-stream": "~1.0.0" + "ms": "2.1.2" }, "engines": { - "node": ">= 0.8" - } - }, - "node_modules/d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, "engines": { - "node": ">=0.4.0" + "node": "^12.20 || >= 14.13" } }, - "node_modules/ed2curve": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/ed2curve/-/ed2curve-0.3.0.tgz", - "integrity": "sha512-8w2fmmq3hv9rCrcI7g9hms2pMunQr1JINfcjwR9tAyZqhtyaMN991lF/ZfHfr5tzZQ8c7y7aBgZbjfbd0fjFwQ==", + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", "dependencies": { - "tweetnacl": "1.x.x" - } - }, - "node_modules/es5-ext": { - "version": "0.10.62", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", - "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", - "hasInstallScript": true, - "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "next-tick": "^1.1.0" + "fetch-blob": "^3.1.2" }, "engines": { - "node": ">=0.10" - } - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" + "node": ">=12.20.0" } }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" - } + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "node_modules/ext": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", - "dependencies": { - "type": "^2.7.2" + "node_modules/mock-socket": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/mock-socket/-/mock-socket-9.3.1.tgz", + "integrity": "sha512-qxBgB7Qa2sEQgHFjj0dSigq7fX4k6Saisd5Nelwp2q8mlbAFh5dHV9JTTlF8viYJLSSWgMCZFUom8PJcMNBoJw==", + "engines": { + "node": ">= 8" } }, - "node_modules/ext/node_modules/type": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "node_modules/nock": { + "version": "13.4.0", + "resolved": "https://registry.npmjs.org/nock/-/nock-13.4.0.tgz", + "integrity": "sha512-W8NVHjO/LCTNA64yxAPHV/K47LpGYcVzgKd3Q0n6owhwvD0Dgoterc25R4rnZbckJEb6Loxz1f5QMuJpJnbSyQ==", "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "debug": "^4.1.0", + "json-stringify-safe": "^5.0.1", + "propagate": "^2.0.0" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/ip-regex": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", - "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", - "engines": { - "node": ">=8" + "node": ">= 10.13" } }, - "node_modules/is-typedarray": { + "node_modules/node-domexception": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], "engines": { - "node": ">= 0.6" + "node": ">=10.5.0" } }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" - }, "node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", "dependencies": { - "whatwg-url": "^5.0.0" + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" }, "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" } }, - "node_modules/node-gyp-build": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", - "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" + "node_modules/propagate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", + "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", + "engines": { + "node": ">= 8" } }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, "node_modules/rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dependencies": { "tslib": "^2.1.0" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" - }, - "node_modules/tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" - }, - "node_modules/type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "node_modules/smoldot": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/smoldot/-/smoldot-2.0.7.tgz", + "integrity": "sha512-VAOBqEen6vises36/zgrmAT1GWk2qE3X8AGnO7lmQFdskbKx8EovnwS22rtPAG+Y1Rk23/S22kDJUdPANyPkBA==", + "optional": true, "dependencies": { - "is-typedarray": "^1.0.0" + "ws": "^8.8.1" } }, - "node_modules/utf-8-validate": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", - "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", - "hasInstallScript": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, - "node_modules/websocket": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", - "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", - "dependencies": { - "bufferutil": "^4.0.1", - "debug": "^2.2.0", - "es5-ext": "^0.10.50", - "typedarray-to-buffer": "^3.1.5", - "utf-8-validate": "^5.0.2", - "yaeti": "^0.0.6" - }, + "node_modules/web-streams-polyfill": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", "engines": { - "node": ">=4.0.0" + "node": ">= 8" } }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/yaeti": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", - "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==", + "node_modules/ws": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", "engines": { - "node": ">=0.10.32" + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } } } diff --git a/cumulus/scripts/generate_hex_encoded_call/package.json b/cumulus/scripts/generate_hex_encoded_call/package.json index 1c68924db24..ecf0a2483db 100644 --- a/cumulus/scripts/generate_hex_encoded_call/package.json +++ b/cumulus/scripts/generate_hex_encoded_call/package.json @@ -5,7 +5,7 @@ "main": "index.js", "license": "MIT", "dependencies": { - "@polkadot/api": "^6.5.2", - "@polkadot/util": "^7.6.1" + "@polkadot/api": "^10.11", + "@polkadot/util": "^12.6" } } -- GitLab From 88e7b49c1d818e7882fa6878dafd3d566228c5d7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Jan 2024 10:32:09 +0100 Subject: [PATCH 107/191] Bump the known_good_semver group with 4 updates (#2845) Bumps the known_good_semver group with 4 updates: [serde](https://github.com/serde-rs/serde), [serde_json](https://github.com/serde-rs/json), [clap](https://github.com/clap-rs/clap) and [serde_yaml](https://github.com/dtolnay/serde-yaml). Updates `serde` from 1.0.193 to 1.0.194
Release notes

Sourced from serde's releases.

v1.0.194

  • Update proc-macro2 to fix caching issue when using a rustc-wrapper such as sccache
Commits
  • d2d977a Release 1.0.194
  • a9a6ee9 Pull in proc-macro2 sccache fix
  • 28c5d21 Merge pull request #2669 from dtolnay/optionifletelse
  • 3d6a789 Remove option_if_let_else clippy suppression
  • a0e6869 Work around doc_link_with_quotes pedantic clippy lint
  • See full diff in compare view

Updates `serde_json` from 1.0.108 to 1.0.110
Release notes

Sourced from serde_json's releases.

v1.0.109

  • Documentation improvements
Commits
  • df5cf21 Release 1.0.110
  • c35856a Pull in proc-macro2 sccache fix
  • f88bf1f Release 1.0.109
  • bb62c73 Merge pull request #1097 from serde-rs/doccfg
  • df36d10 Restore doc cfg on re-exports
  • c367091 Merge pull request #1095 from dtolnay/hashtest
  • b328ee7 Eliminate hash closure in favor of calling hash_one directly
  • b9bcbad Use BuildHasher::hash_one
  • 7ff6c9e Use random hasher state for number hashing test
  • fe031cd Delete trace_macros! functionality from test
  • Additional commits viewable in compare view

Updates `clap` from 4.4.11 to 4.4.12
Release notes

Sourced from clap's releases.

v4.4.12

[4.4.12] - 2023-12-28

Performance

  • Only ask TypedValueParser for possible values if needed
Changelog

Sourced from clap's changelog.

[4.4.12] - 2023-12-28

Performance

  • Only ask TypedValueParser for possible values if needed
Commits
  • 6d601e6 chore: Release
  • 048e7f0 docs: Update changelog
  • 53f5b82 Merge pull request #5267 from vermiculus/sa/avoid-pv-expansion-in-help
  • 05cd057 perf: Avoid retrieving possible_values unless used
  • 2920808 test: Update snapshots
  • 28763eb chore: Release
  • ace7bb5 docs(complete): Update changelog
  • 76beca4 docs(complete): Polish API reference for dynamic
  • 3630e58 Merge pull request #5273 from epage/docsrs
  • 3724b9e docs: Include more content on docs.rs
  • See full diff in compare view

Updates `serde_yaml` from 0.9.29 to 0.9.30
Release notes

Sourced from serde_yaml's releases.

0.9.30

  • Update proc-macro2 to fix caching issue when using a rustc-wrapper such as sccache
Commits

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 198 +++++++++--------- .../pallets/ethereum-beacon-client/Cargo.toml | 8 +- .../pallets/inbound-queue/Cargo.toml | 2 +- .../pallets/outbound-queue/Cargo.toml | 2 +- .../parachain/primitives/beacon/Cargo.toml | 2 +- .../parachain/primitives/core/Cargo.toml | 2 +- .../parachain/primitives/ethereum/Cargo.toml | 4 +- .../parachain/primitives/router/Cargo.toml | 2 +- .../parachain/runtime/tests/Cargo.toml | 2 +- cumulus/client/cli/Cargo.toml | 2 +- .../relay-chain-rpc-interface/Cargo.toml | 4 +- cumulus/parachain-template/node/Cargo.toml | 6 +- .../pallets/template/Cargo.toml | 2 +- .../assets/asset-hub-rococo/Cargo.toml | 2 +- .../assets/asset-hub-westend/Cargo.toml | 2 +- .../bridges/bridge-hub-rococo/Cargo.toml | 2 +- .../bridges/bridge-hub-westend/Cargo.toml | 2 +- .../collectives-westend/Cargo.toml | 2 +- .../people/people-rococo/Cargo.toml | 2 +- .../people/people-westend/Cargo.toml | 2 +- .../parachains/testing/penpal/Cargo.toml | 2 +- .../emulated/chains/relays/rococo/Cargo.toml | 2 +- .../emulated/chains/relays/westend/Cargo.toml | 2 +- .../emulated/common/Cargo.toml | 2 +- .../bridge-hubs/bridge-hub-rococo/Cargo.toml | 2 +- .../bridge-hubs/bridge-hub-westend/Cargo.toml | 2 +- .../coretime/coretime-rococo/Cargo.toml | 2 +- .../coretime/coretime-westend/Cargo.toml | 2 +- .../runtimes/people/people-rococo/Cargo.toml | 2 +- .../runtimes/people/people-westend/Cargo.toml | 2 +- cumulus/polkadot-parachain/Cargo.toml | 6 +- cumulus/test/service/Cargo.toml | 6 +- polkadot/cli/Cargo.toml | 2 +- polkadot/node/malus/Cargo.toml | 2 +- polkadot/node/primitives/Cargo.toml | 2 +- polkadot/node/service/Cargo.toml | 4 +- polkadot/node/subsystem-bench/Cargo.toml | 4 +- polkadot/node/test/service/Cargo.toml | 2 +- .../node/zombienet-backchannel/Cargo.toml | 2 +- polkadot/parachain/Cargo.toml | 2 +- .../test-parachains/adder/collator/Cargo.toml | 2 +- .../undying/collator/Cargo.toml | 2 +- polkadot/primitives/Cargo.toml | 2 +- polkadot/runtime/common/Cargo.toml | 4 +- polkadot/runtime/parachains/Cargo.toml | 4 +- polkadot/runtime/rococo/Cargo.toml | 4 +- polkadot/runtime/test-runtime/Cargo.toml | 4 +- polkadot/runtime/westend/Cargo.toml | 4 +- polkadot/utils/generate-bags/Cargo.toml | 2 +- .../remote-ext-tests/bags-list/Cargo.toml | 2 +- polkadot/xcm/Cargo.toml | 2 +- polkadot/xcm/pallet-xcm/Cargo.toml | 2 +- substrate/bin/minimal/node/Cargo.toml | 4 +- substrate/bin/node-template/node/Cargo.toml | 4 +- .../bin/node-template/runtime/Cargo.toml | 2 +- substrate/bin/node/bench/Cargo.toml | 6 +- substrate/bin/node/cli/Cargo.toml | 10 +- substrate/bin/node/inspect/Cargo.toml | 2 +- substrate/bin/node/runtime/Cargo.toml | 2 +- .../bin/utils/chain-spec-builder/Cargo.toml | 4 +- substrate/bin/utils/subkey/Cargo.toml | 2 +- substrate/client/chain-spec/Cargo.toml | 4 +- substrate/client/cli/Cargo.toml | 6 +- .../client/consensus/babe/rpc/Cargo.toml | 4 +- substrate/client/consensus/beefy/Cargo.toml | 2 +- .../client/consensus/beefy/rpc/Cargo.toml | 4 +- substrate/client/consensus/grandpa/Cargo.toml | 4 +- .../client/consensus/grandpa/rpc/Cargo.toml | 2 +- substrate/client/keystore/Cargo.toml | 2 +- .../merkle-mountain-range/rpc/Cargo.toml | 4 +- substrate/client/network/Cargo.toml | 4 +- substrate/client/rpc-api/Cargo.toml | 4 +- substrate/client/rpc-servers/Cargo.toml | 2 +- substrate/client/rpc-spec-v2/Cargo.toml | 2 +- substrate/client/rpc/Cargo.toml | 2 +- substrate/client/service/Cargo.toml | 4 +- substrate/client/storage-monitor/Cargo.toml | 2 +- substrate/client/sync-state-rpc/Cargo.toml | 4 +- substrate/client/sysinfo/Cargo.toml | 4 +- substrate/client/telemetry/Cargo.toml | 4 +- substrate/client/tracing/Cargo.toml | 2 +- substrate/client/transaction-pool/Cargo.toml | 2 +- .../client/transaction-pool/api/Cargo.toml | 4 +- substrate/frame/beefy-mmr/Cargo.toml | 2 +- substrate/frame/beefy/Cargo.toml | 2 +- substrate/frame/benchmarking/Cargo.toml | 2 +- substrate/frame/conviction-voting/Cargo.toml | 2 +- substrate/frame/democracy/Cargo.toml | 2 +- .../solution-type/fuzzer/Cargo.toml | 2 +- substrate/frame/message-queue/Cargo.toml | 2 +- substrate/frame/mixnet/Cargo.toml | 2 +- substrate/frame/offences/Cargo.toml | 2 +- substrate/frame/referenda/Cargo.toml | 2 +- substrate/frame/remark/Cargo.toml | 2 +- substrate/frame/staking/Cargo.toml | 2 +- .../frame/state-trie-migration/Cargo.toml | 2 +- substrate/frame/support/Cargo.toml | 4 +- substrate/frame/support/test/Cargo.toml | 2 +- .../frame/support/test/pallet/Cargo.toml | 2 +- substrate/frame/system/Cargo.toml | 2 +- substrate/frame/tips/Cargo.toml | 2 +- .../frame/transaction-payment/Cargo.toml | 4 +- .../asset-tx-payment/Cargo.toml | 4 +- .../frame/transaction-storage/Cargo.toml | 2 +- substrate/frame/treasury/Cargo.toml | 2 +- .../primitives/application-crypto/Cargo.toml | 2 +- substrate/primitives/arithmetic/Cargo.toml | 2 +- .../primitives/consensus/babe/Cargo.toml | 2 +- .../primitives/consensus/beefy/Cargo.toml | 2 +- .../primitives/consensus/grandpa/Cargo.toml | 2 +- .../primitives/consensus/sassafras/Cargo.toml | 2 +- substrate/primitives/core/Cargo.toml | 4 +- .../primitives/genesis-builder/Cargo.toml | 2 +- .../merkle-mountain-range/Cargo.toml | 2 +- .../primitives/npos-elections/Cargo.toml | 2 +- .../npos-elections/fuzzer/Cargo.toml | 2 +- substrate/primitives/rpc/Cargo.toml | 4 +- substrate/primitives/runtime/Cargo.toml | 4 +- substrate/primitives/staking/Cargo.toml | 2 +- substrate/primitives/storage/Cargo.toml | 2 +- .../primitives/test-primitives/Cargo.toml | 2 +- substrate/primitives/version/Cargo.toml | 2 +- substrate/primitives/weights/Cargo.toml | 2 +- .../ci/node-template-release/Cargo.toml | 2 +- substrate/test-utils/client/Cargo.toml | 4 +- substrate/test-utils/runtime/Cargo.toml | 4 +- .../utils/frame/benchmarking-cli/Cargo.toml | 6 +- .../frame/frame-utilities-cli/Cargo.toml | 2 +- .../generate-bags/node-runtime/Cargo.toml | 2 +- .../frame/remote-externalities/Cargo.toml | 2 +- .../rpc/state-trie-migration-rpc/Cargo.toml | 2 +- .../utils/frame/try-runtime/cli/Cargo.toml | 6 +- 132 files changed, 283 insertions(+), 283 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bce297e1468..966b1820fff 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -190,7 +190,7 @@ checksum = "c0391754c09fab4eae3404d19d0d297aa1c670c1775ab51d8a5312afeca23157" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -205,7 +205,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", "syn-solidity", "tiny-keccak", ] @@ -1226,7 +1226,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -1243,7 +1243,7 @@ checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -1425,7 +1425,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -2638,9 +2638,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.11" +version = "4.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfaff671f6b22ca62406885ece523383b9b64022e341e53e009a62ebc47a45f2" +checksum = "dcfab8ba68f3668e89f6ff60f5b205cea56aa7b769451a59f34b8682f51c056d" dependencies = [ "clap_builder", "clap_derive 4.4.7", @@ -2657,9 +2657,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.11" +version = "4.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a216b506622bb1d316cd51328dce24e07bdff4a6128a47c7e7fad11878d5adbb" +checksum = "fb7fb5e4e979aec3be7791562fcba452f94ad85e954da024396433e0e25a79e9" dependencies = [ "anstream", "anstyle", @@ -2674,7 +2674,7 @@ version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "586a385f7ef2f8b4d86bddaa0c094794e7ccbfe5ffef1f434fe928143fc783a5" dependencies = [ - "clap 4.4.11", + "clap 4.4.12", ] [[package]] @@ -2699,7 +2699,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -3412,7 +3412,7 @@ dependencies = [ "anes", "cast", "ciborium", - "clap 4.4.11", + "clap 4.4.12", "criterion-plot", "futures", "is-terminal", @@ -3575,7 +3575,7 @@ dependencies = [ name = "cumulus-client-cli" version = "0.1.0" dependencies = [ - "clap 4.4.11", + "clap 4.4.12", "parity-scale-codec", "sc-chain-spec", "sc-cli", @@ -3909,7 +3909,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -4297,7 +4297,7 @@ name = "cumulus-test-service" version = "0.1.0" dependencies = [ "async-trait", - "clap 4.4.11", + "clap 4.4.12", "criterion 0.5.1", "cumulus-client-cli", "cumulus-client-consensus-common", @@ -4420,7 +4420,7 @@ checksum = "83fdaf97f4804dcebfa5862639bc9ce4121e82140bec2a987ac5140294865b5b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -4460,7 +4460,7 @@ dependencies = [ "proc-macro2", "quote", "scratch", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -4477,7 +4477,7 @@ checksum = "50c49547d73ba8dcfd4ad7325d64c6d5391ff4224d498fc39a6f3f49825a530d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -4685,7 +4685,7 @@ checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -4746,7 +4746,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.43", + "syn 2.0.47", "termcolor", "toml 0.7.8", "walkdir", @@ -4974,7 +4974,7 @@ checksum = "5e9a1f9f7d83e59740248a6e14ecf93929ade55027844dfcea78beafccc15745" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -4985,7 +4985,7 @@ checksum = "c2ad8cef1d801a4686bfd8919f0b30eac4c8e48968c437a6405ded4fb5272d2b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -5153,7 +5153,7 @@ dependencies = [ "fs-err", "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -5475,7 +5475,7 @@ dependencies = [ "Inflector", "array-bytes 6.1.0", "chrono", - "clap 4.4.11", + "clap 4.4.12", "comfy-table", "frame-benchmarking", "frame-support", @@ -5541,7 +5541,7 @@ dependencies = [ "quote", "scale-info", "sp-arithmetic", - "syn 2.0.43", + "syn 2.0.47", "trybuild", ] @@ -5567,7 +5567,7 @@ dependencies = [ name = "frame-election-solution-type-fuzzer" version = "2.0.0-alpha.5" dependencies = [ - "clap 4.4.11", + "clap 4.4.12", "frame-election-provider-solution-type", "frame-election-provider-support", "frame-support", @@ -5694,7 +5694,7 @@ dependencies = [ "quote", "regex", "sp-core-hashing", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -5705,7 +5705,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -5714,7 +5714,7 @@ version = "3.0.0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -5947,7 +5947,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -7884,7 +7884,7 @@ dependencies = [ "macro_magic_core", "macro_magic_macros", "quote", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -7898,7 +7898,7 @@ dependencies = [ "macro_magic_core_macros", "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -7909,7 +7909,7 @@ checksum = "9ea73aa640dc01d62a590d48c0c3521ed739d53b27f919b25c3551e233481654" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -7920,7 +7920,7 @@ checksum = "ef9d79ae96aaba821963320eb2b6e34d17df1e5a83d8a1985c29cc5be59577b3" dependencies = [ "macro_magic_core", "quote", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -8085,7 +8085,7 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" name = "minimal-node" version = "4.0.0-dev" dependencies = [ - "clap 4.4.11", + "clap 4.4.12", "frame", "futures", "futures-timer", @@ -8549,7 +8549,7 @@ name = "node-bench" version = "0.9.0-dev" dependencies = [ "array-bytes 6.1.0", - "clap 4.4.11", + "clap 4.4.12", "derive_more", "fs_extra", "futures", @@ -8624,7 +8624,7 @@ dependencies = [ name = "node-runtime-generate-bags" version = "3.0.0" dependencies = [ - "clap 4.4.11", + "clap 4.4.12", "generate-bags", "kitchensink-runtime", ] @@ -8633,7 +8633,7 @@ dependencies = [ name = "node-template" version = "4.0.0-dev" dependencies = [ - "clap 4.4.11", + "clap 4.4.12", "frame-benchmarking", "frame-benchmarking-cli", "frame-system", @@ -8677,7 +8677,7 @@ dependencies = [ name = "node-template-release" version = "3.0.0" dependencies = [ - "clap 4.4.11", + "clap 4.4.12", "flate2", "fs_extra", "glob", @@ -9659,7 +9659,7 @@ version = "4.0.0-dev" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -10819,7 +10819,7 @@ dependencies = [ "proc-macro2", "quote", "sp-runtime", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -11225,7 +11225,7 @@ dependencies = [ name = "parachain-template-node" version = "0.1.0" dependencies = [ - "clap 4.4.11", + "clap 4.4.12", "color-print", "cumulus-client-cli", "cumulus-client-collator", @@ -11930,7 +11930,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -11971,7 +11971,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -12184,7 +12184,7 @@ name = "polkadot-cli" version = "1.1.0" dependencies = [ "cfg-if", - "clap 4.4.11", + "clap 4.4.12", "frame-benchmarking-cli", "futures", "log", @@ -13025,7 +13025,7 @@ dependencies = [ "async-trait", "bridge-hub-rococo-runtime", "bridge-hub-westend-runtime", - "clap 4.4.11", + "clap 4.4.12", "collectives-westend-runtime", "color-print", "contracts-rococo-runtime", @@ -13535,7 +13535,7 @@ version = "1.0.0" dependencies = [ "assert_matches", "async-trait", - "clap 4.4.11", + "clap 4.4.12", "clap-num", "color-eyre", "colored", @@ -13612,7 +13612,7 @@ version = "1.0.0" dependencies = [ "assert_matches", "async-trait", - "clap 4.4.11", + "clap 4.4.12", "color-eyre", "futures", "futures-timer", @@ -13759,7 +13759,7 @@ dependencies = [ name = "polkadot-voter-bags" version = "1.0.0" dependencies = [ - "clap 4.4.11", + "clap 4.4.12", "generate-bags", "sp-io", "westend-runtime", @@ -13937,7 +13937,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c64d9ba0963cdcea2e1b2230fbae2bab30eb25a174be395c41e764bfb65dd62" dependencies = [ "proc-macro2", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -14029,14 +14029,14 @@ checksum = "9b698b0b09d40e9b7c1a47b132d66a8b54bcd20583d9b6d06e4535e383b4405c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] name = "proc-macro2" -version = "1.0.69" +version = "1.0.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +checksum = "907a61bd0f64c2f29cd1cf1dc34d05176426a3f504a78010f08416ddb7b13708" dependencies = [ "unicode-ident", ] @@ -14101,7 +14101,7 @@ checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -14299,9 +14299,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.33" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] @@ -14519,7 +14519,7 @@ checksum = "7f7473c2cfcf90008193dd0e3e16599455cb601a9fce322b5bb55de799664925" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -14588,7 +14588,7 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" name = "remote-ext-tests-bags-list" version = "1.0.0" dependencies = [ - "clap 4.4.11", + "clap 4.4.12", "frame-system", "log", "pallet-bags-list-remote-tests", @@ -15354,7 +15354,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -15364,7 +15364,7 @@ dependencies = [ "array-bytes 6.1.0", "bip39", "chrono", - "clap 4.4.11", + "clap 4.4.12", "fdlimit", "futures", "futures-timer", @@ -16508,7 +16508,7 @@ dependencies = [ name = "sc-storage-monitor" version = "0.1.0" dependencies = [ - "clap 4.4.11", + "clap 4.4.12", "fs4", "log", "sc-client-db", @@ -16610,7 +16610,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -16995,9 +16995,9 @@ checksum = "f97841a747eef040fcd2e7b3b9a220a7205926e60488e673d9e4926d27772ce5" [[package]] name = "serde" -version = "1.0.193" +version = "1.0.194" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +checksum = "0b114498256798c94a0689e1a15fec6005dee8ac1f41de56404b67afc2a4b773" dependencies = [ "serde_derive", ] @@ -17022,13 +17022,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.193" +version = "1.0.194" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +checksum = "a3385e45322e8f9931410f01b3031ec534c3947d0e94c18049af4d9f9907d4e0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -17053,9 +17053,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.108" +version = "1.0.110" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +checksum = "6fbd975230bada99c8bb618e0c365c2eefa219158d5c6c29610fd09ff1833257" dependencies = [ "itoa", "ryu", @@ -17085,9 +17085,9 @@ dependencies = [ [[package]] name = "serde_yaml" -version = "0.9.29" +version = "0.9.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15e0ef66bf939a7c890a0bf6d5a733c70202225f9888a89ed5c62298b019129" +checksum = "b1bf28c79a99f70ee1f1d83d10c875d2e70618417fda01ad1785e027579d9d38" dependencies = [ "indexmap 2.0.0", "itoa", @@ -17118,7 +17118,7 @@ checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -17908,7 +17908,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -18243,7 +18243,7 @@ version = "9.0.0" dependencies = [ "quote", "sp-core-hashing", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -18301,7 +18301,7 @@ version = "8.0.0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -18311,7 +18311,7 @@ source = "git+https://github.com/paritytech/polkadot-sdk#82912acb33a9030c0ef3bf5 dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -18470,7 +18470,7 @@ dependencies = [ name = "sp-npos-elections-fuzzer" version = "2.0.0-alpha.5" dependencies = [ - "clap 4.4.11", + "clap 4.4.12", "honggfuzz", "rand 0.8.5", "sp-npos-elections", @@ -18584,7 +18584,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -18596,7 +18596,7 @@ dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -18867,7 +18867,7 @@ dependencies = [ "proc-macro2", "quote", "sp-version", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -18991,7 +18991,7 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" name = "staging-chain-spec-builder" version = "2.0.0" dependencies = [ - "clap 4.4.11", + "clap 4.4.12", "log", "sc-chain-spec", "serde_json", @@ -19004,7 +19004,7 @@ version = "3.0.0-dev" dependencies = [ "array-bytes 6.1.0", "assert_cmd", - "clap 4.4.11", + "clap 4.4.12", "clap_complete", "criterion 0.4.0", "frame-benchmarking", @@ -19109,7 +19109,7 @@ dependencies = [ name = "staging-node-inspect" version = "0.9.0-dev" dependencies = [ - "clap 4.4.11", + "clap 4.4.12", "parity-scale-codec", "sc-cli", "sc-client-api", @@ -19314,7 +19314,7 @@ dependencies = [ name = "subkey" version = "3.0.0" dependencies = [ - "clap 4.4.11", + "clap 4.4.12", "sc-cli", ] @@ -19356,7 +19356,7 @@ dependencies = [ name = "substrate-frame-cli" version = "4.0.0-dev" dependencies = [ - "clap 4.4.11", + "clap 4.4.12", "frame-support", "frame-system", "sc-cli", @@ -19702,9 +19702,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.43" +version = "2.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee659fb5f3d355364e1f3e5bc10fb82068efbf824a1e9d1c9504244a6469ad53" +checksum = "1726efe18f42ae774cc644f330953a5e7b3c3003d3edcecf18850fe9d4dd9afb" dependencies = [ "proc-macro2", "quote", @@ -19720,7 +19720,7 @@ dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -19834,7 +19834,7 @@ dependencies = [ name = "test-parachain-adder-collator" version = "1.0.0" dependencies = [ - "clap 4.4.11", + "clap 4.4.12", "futures", "futures-timer", "log", @@ -19882,7 +19882,7 @@ dependencies = [ name = "test-parachain-undying-collator" version = "1.0.0" dependencies = [ - "clap 4.4.11", + "clap 4.4.12", "futures", "futures-timer", "log", @@ -19971,7 +19971,7 @@ checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -20132,7 +20132,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -20338,7 +20338,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -20380,7 +20380,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] @@ -20533,7 +20533,7 @@ version = "0.10.0-dev" dependencies = [ "assert_cmd", "async-trait", - "clap 4.4.11", + "clap 4.4.12", "frame-remote-externalities", "frame-try-runtime", "hex", @@ -20910,7 +20910,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", "wasm-bindgen-shared", ] @@ -20944,7 +20944,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -21912,7 +21912,7 @@ dependencies = [ "proc-macro2", "quote", "staging-xcm", - "syn 2.0.43", + "syn 2.0.47", "trybuild", ] @@ -22032,7 +22032,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.43", + "syn 2.0.47", ] [[package]] diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/Cargo.toml b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/Cargo.toml index 5c4acda13d8..2f6eb2c91c0 100644 --- a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/Cargo.toml +++ b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/Cargo.toml @@ -11,8 +11,8 @@ license = "Apache-2.0" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -serde = { version = "1.0.188", optional = true } -serde_json = { version = "1.0.96", optional = true } +serde = { version = "1.0.194", optional = true } +serde_json = { version = "1.0.110", optional = true } codec = { version = "3.6.1", package = "parity-scale-codec", default-features = false, features = ["derive"] } scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } ssz_rs = { version = "0.9.0", default-features = false } @@ -40,11 +40,11 @@ pallet-timestamp = { path = "../../../../../substrate/frame/timestamp", default- [dev-dependencies] rand = "0.8.5" sp-keyring = { path = "../../../../../substrate/primitives/keyring" } -serde_json = "1.0.96" +serde_json = "1.0.110" hex-literal = "0.4.1" pallet-timestamp = { path = "../../../../../substrate/frame/timestamp" } sp-io = { path = "../../../../../substrate/primitives/io" } -serde = "1.0.188" +serde = "1.0.194" [features] default = ["std"] diff --git a/bridges/snowbridge/parachain/pallets/inbound-queue/Cargo.toml b/bridges/snowbridge/parachain/pallets/inbound-queue/Cargo.toml index f9e4d20be0f..91a773f4471 100644 --- a/bridges/snowbridge/parachain/pallets/inbound-queue/Cargo.toml +++ b/bridges/snowbridge/parachain/pallets/inbound-queue/Cargo.toml @@ -11,7 +11,7 @@ license = "Apache-2.0" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -serde = { version = "1.0.188", optional = true } +serde = { version = "1.0.194", optional = true } codec = { version = "3.6.1", package = "parity-scale-codec", default-features = false, features = ["derive"] } scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.4.1", optional = true } diff --git a/bridges/snowbridge/parachain/pallets/outbound-queue/Cargo.toml b/bridges/snowbridge/parachain/pallets/outbound-queue/Cargo.toml index 66dd1d838e7..90a45745f4a 100644 --- a/bridges/snowbridge/parachain/pallets/outbound-queue/Cargo.toml +++ b/bridges/snowbridge/parachain/pallets/outbound-queue/Cargo.toml @@ -11,7 +11,7 @@ license = "Apache-2.0" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -serde = { version = "1.0.188", features = ["alloc", "derive"], default-features = false } +serde = { version = "1.0.194", features = ["alloc", "derive"], default-features = false } codec = { version = "3.6.1", package = "parity-scale-codec", default-features = false, features = ["derive"] } scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.4.1", optional = true } diff --git a/bridges/snowbridge/parachain/primitives/beacon/Cargo.toml b/bridges/snowbridge/parachain/primitives/beacon/Cargo.toml index e81e0208ba1..f0a00f51229 100644 --- a/bridges/snowbridge/parachain/primitives/beacon/Cargo.toml +++ b/bridges/snowbridge/parachain/primitives/beacon/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" license = "Apache-2.0" [dependencies] -serde = { version = "1.0.188", optional = true, features = ["derive"] } +serde = { version = "1.0.194", optional = true, features = ["derive"] } hex = { version = "0.4", default-features = false } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } diff --git a/bridges/snowbridge/parachain/primitives/core/Cargo.toml b/bridges/snowbridge/parachain/primitives/core/Cargo.toml index 262fc60b0cb..f8cdfb1f1e9 100644 --- a/bridges/snowbridge/parachain/primitives/core/Cargo.toml +++ b/bridges/snowbridge/parachain/primitives/core/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" license = "Apache-2.0" [dependencies] -serde = { version = "1.0.188", optional = true, features = ["alloc", "derive"], default-features = false } +serde = { version = "1.0.194", optional = true, features = ["alloc", "derive"], default-features = false } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.4.1" } diff --git a/bridges/snowbridge/parachain/primitives/ethereum/Cargo.toml b/bridges/snowbridge/parachain/primitives/ethereum/Cargo.toml index 1eff2632b09..d957b589aca 100644 --- a/bridges/snowbridge/parachain/primitives/ethereum/Cargo.toml +++ b/bridges/snowbridge/parachain/primitives/ethereum/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" license = "Apache-2.0" [dependencies] -serde = { version = "1.0.188", optional = true, features = ["derive"] } +serde = { version = "1.0.194", optional = true, features = ["derive"] } serde-big-array = { version = "0.3.2", optional = true, features = ["const-generics"] } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } @@ -28,7 +28,7 @@ ethabi = { git = "https://github.com/snowfork/ethabi-decode.git", package = "eth [dev-dependencies] wasm-bindgen-test = "0.3.19" rand = "0.8.5" -serde_json = "1.0.96" +serde_json = "1.0.110" [features] default = ["std"] diff --git a/bridges/snowbridge/parachain/primitives/router/Cargo.toml b/bridges/snowbridge/parachain/primitives/router/Cargo.toml index 7badfebb606..0ee6fd9bd3d 100644 --- a/bridges/snowbridge/parachain/primitives/router/Cargo.toml +++ b/bridges/snowbridge/parachain/primitives/router/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" license = "Apache-2.0" [dependencies] -serde = { version = "1.0.188", optional = true, features = ["derive"] } +serde = { version = "1.0.194", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } log = { version = "0.4.20", default-features = false } diff --git a/bridges/snowbridge/parachain/runtime/tests/Cargo.toml b/bridges/snowbridge/parachain/runtime/tests/Cargo.toml index da1fe878d93..7002feae24a 100644 --- a/bridges/snowbridge/parachain/runtime/tests/Cargo.toml +++ b/bridges/snowbridge/parachain/runtime/tests/Cargo.toml @@ -11,7 +11,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0", default-features = hex-literal = { version = "0.4.1" } log = { version = "0.4.20", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.188", optional = true, features = ["derive"] } +serde = { version = "1.0.194", optional = true, features = ["derive"] } smallvec = "1.11.0" # Substrate diff --git a/cumulus/client/cli/Cargo.toml b/cumulus/client/cli/Cargo.toml index e57e7a44a56..3a4eed54f3f 100644 --- a/cumulus/client/cli/Cargo.toml +++ b/cumulus/client/cli/Cargo.toml @@ -10,7 +10,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" workspace = true [dependencies] -clap = { version = "4.4.11", features = ["derive"] } +clap = { version = "4.4.12", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } url = "2.4.0" diff --git a/cumulus/client/relay-chain-rpc-interface/Cargo.toml b/cumulus/client/relay-chain-rpc-interface/Cargo.toml index 2295bffddcf..9caf1f6b5e4 100644 --- a/cumulus/client/relay-chain-rpc-interface/Cargo.toml +++ b/cumulus/client/relay-chain-rpc-interface/Cargo.toml @@ -37,8 +37,8 @@ jsonrpsee = { version = "0.16.2", features = ["ws-client"] } tracing = "0.1.37" async-trait = "0.1.74" url = "2.4.0" -serde_json = "1.0.108" -serde = "1.0.193" +serde_json = "1.0.110" +serde = "1.0.194" schnellru = "0.2.1" smoldot = { version = "0.11.0", default_features = false, features = ["std"] } smoldot-light = { version = "0.9.0", default_features = false, features = ["std"] } diff --git a/cumulus/parachain-template/node/Cargo.toml b/cumulus/parachain-template/node/Cargo.toml index 4be848f4d2d..865f310cd12 100644 --- a/cumulus/parachain-template/node/Cargo.toml +++ b/cumulus/parachain-template/node/Cargo.toml @@ -14,13 +14,13 @@ publish = false workspace = true [dependencies] -clap = { version = "4.4.11", features = ["derive"] } +clap = { version = "4.4.12", features = ["derive"] } log = "0.4.20" codec = { package = "parity-scale-codec", version = "3.0.0" } -serde = { version = "1.0.193", features = ["derive"] } +serde = { version = "1.0.194", features = ["derive"] } jsonrpsee = { version = "0.16.2", features = ["server"] } futures = "0.3.28" -serde_json = "1.0.108" +serde_json = "1.0.110" # Local parachain-template-runtime = { path = "../runtime" } diff --git a/cumulus/parachain-template/pallets/template/Cargo.toml b/cumulus/parachain-template/pallets/template/Cargo.toml index bd7f926d039..64464257dd1 100644 --- a/cumulus/parachain-template/pallets/template/Cargo.toml +++ b/cumulus/parachain-template/pallets/template/Cargo.toml @@ -24,7 +24,7 @@ frame-support = { path = "../../../../substrate/frame/support", default-features frame-system = { path = "../../../../substrate/frame/system", default-features = false } [dev-dependencies] -serde = { version = "1.0.193" } +serde = { version = "1.0.194" } # Substrate sp-core = { path = "../../../../substrate/primitives/core", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/Cargo.toml index 1596169efbe..4993eafb641 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/Cargo.toml @@ -11,7 +11,7 @@ publish = false workspace = true [dependencies] -serde_json = "1.0.104" +serde_json = "1.0.110" # Substrate sp-core = { path = "../../../../../../../../substrate/primitives/core", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/Cargo.toml index ff5a70628db..73c69ecaa0b 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/Cargo.toml @@ -11,7 +11,7 @@ publish = false workspace = true [dependencies] -serde_json = "1.0.104" +serde_json = "1.0.110" # Substrate sp-core = { path = "../../../../../../../../substrate/primitives/core", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/Cargo.toml index d0c498b54b4..5e5448864ff 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/Cargo.toml @@ -11,7 +11,7 @@ publish = false workspace = true [dependencies] -serde_json = "1.0.104" +serde_json = "1.0.110" # Substrate sp-core = { path = "../../../../../../../../substrate/primitives/core", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/Cargo.toml index 3d5a7e1071d..62bd17c3b43 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/Cargo.toml @@ -11,7 +11,7 @@ publish = false workspace = true [dependencies] -serde_json = "1.0.104" +serde_json = "1.0.110" # Substrate sp-core = { path = "../../../../../../../../substrate/primitives/core", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/collectives/collectives-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/collectives/collectives-westend/Cargo.toml index 54d2d9b6b98..91b45f00f8f 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/collectives/collectives-westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/collectives/collectives-westend/Cargo.toml @@ -11,7 +11,7 @@ publish = false workspace = true [dependencies] -serde_json = "1.0.104" +serde_json = "1.0.110" # Substrate sp-core = { path = "../../../../../../../../substrate/primitives/core", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/Cargo.toml index 36fef849ddb..a4aeab3651e 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/Cargo.toml @@ -8,7 +8,7 @@ description = "People Rococo emulated chain" publish = false [dependencies] -serde_json = "1.0.104" +serde_json = "1.0.110" # Substrate sp-core = { path = "../../../../../../../../substrate/primitives/core", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/Cargo.toml index 9a01a545c31..57d102edd6e 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/Cargo.toml @@ -8,7 +8,7 @@ description = "People Westend emulated chain" publish = false [dependencies] -serde_json = "1.0.104" +serde_json = "1.0.110" # Substrate sp-core = { path = "../../../../../../../../substrate/primitives/core", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/Cargo.toml index d325b78fa66..a9f031a2318 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/Cargo.toml @@ -11,7 +11,7 @@ publish = false workspace = true [dependencies] -serde_json = "1.0.104" +serde_json = "1.0.110" # Substrate sp-core = { path = "../../../../../../../../substrate/primitives/core", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/Cargo.toml index d2e54367de2..f906c6672e0 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/Cargo.toml @@ -11,7 +11,7 @@ publish = false workspace = true [dependencies] -serde_json = "1.0.104" +serde_json = "1.0.110" # Substrate sp-core = { path = "../../../../../../../substrate/primitives/core", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/chains/relays/westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/relays/westend/Cargo.toml index b073bbb94f9..9abbfc4c559 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/relays/westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/relays/westend/Cargo.toml @@ -11,7 +11,7 @@ publish = false workspace = true [dependencies] -serde_json = "1.0.104" +serde_json = "1.0.110" # Substrate sp-core = { path = "../../../../../../../substrate/primitives/core", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/common/Cargo.toml b/cumulus/parachains/integration-tests/emulated/common/Cargo.toml index f2e799df810..75cd6ea700c 100644 --- a/cumulus/parachains/integration-tests/emulated/common/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/common/Cargo.toml @@ -12,7 +12,7 @@ workspace = true [dependencies] codec = { package = "parity-scale-codec", version = "3.4.0", default-features = false } paste = "1.0.14" -serde_json = "1.0.108" +serde_json = "1.0.110" # Substrate grandpa = { package = "sc-consensus-grandpa", path = "../../../../../substrate/client/consensus/grandpa" } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml index d362c5f12a6..b03dee2b9d4 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml @@ -21,7 +21,7 @@ log = { version = "0.4.20", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = [ "derive", ] } -serde = { version = "1.0.193", optional = true, features = ["derive"] } +serde = { version = "1.0.194", optional = true, features = ["derive"] } smallvec = "1.11.0" # Substrate diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml index 94e29fb90ac..64e1967af92 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml @@ -17,7 +17,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0", default-features = hex-literal = { version = "0.4.1" } log = { version = "0.4.20", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.193", optional = true, features = ["derive"] } +serde = { version = "1.0.194", optional = true, features = ["derive"] } smallvec = "1.11.0" # Substrate diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml b/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml index 5f7654fecae..3e830db2276 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml @@ -17,7 +17,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0", default-features = hex-literal = "0.4.1" log = { version = "0.4.20", default-features = false } scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.171", optional = true, features = ["derive"] } +serde = { version = "1.0.194", optional = true, features = ["derive"] } smallvec = "1.11.0" # Substrate diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml b/cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml index d68a98790f7..ea5eed062f7 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml @@ -17,7 +17,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0", default-features = hex-literal = "0.4.1" log = { version = "0.4.20", default-features = false } scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.171", optional = true, features = ["derive"] } +serde = { version = "1.0.194", optional = true, features = ["derive"] } smallvec = "1.11.0" # Substrate diff --git a/cumulus/parachains/runtimes/people/people-rococo/Cargo.toml b/cumulus/parachains/runtimes/people/people-rococo/Cargo.toml index 81f6ed936c8..a79f355e606 100644 --- a/cumulus/parachains/runtimes/people/people-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/people/people-rococo/Cargo.toml @@ -15,7 +15,7 @@ enumflags2 = { version = "0.7.7" } hex-literal = { version = "0.4.1" } log = { version = "0.4.20", default-features = false } scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.171", optional = true, features = ["derive"] } +serde = { version = "1.0.194", optional = true, features = ["derive"] } smallvec = "1.11.0" # Substrate diff --git a/cumulus/parachains/runtimes/people/people-westend/Cargo.toml b/cumulus/parachains/runtimes/people/people-westend/Cargo.toml index d9e002ba5ed..78642059753 100644 --- a/cumulus/parachains/runtimes/people/people-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/people/people-westend/Cargo.toml @@ -15,7 +15,7 @@ enumflags2 = { version = "0.7.7" } hex-literal = { version = "0.4.1" } log = { version = "0.4.20", default-features = false } scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.188", optional = true, features = ["derive"] } +serde = { version = "1.0.194", optional = true, features = ["derive"] } smallvec = "1.11.0" # Substrate diff --git a/cumulus/polkadot-parachain/Cargo.toml b/cumulus/polkadot-parachain/Cargo.toml index c2b3b92b23f..34243f473e8 100644 --- a/cumulus/polkadot-parachain/Cargo.toml +++ b/cumulus/polkadot-parachain/Cargo.toml @@ -16,13 +16,13 @@ path = "src/main.rs" [dependencies] async-trait = "0.1.74" -clap = { version = "4.4.11", features = ["derive"] } +clap = { version = "4.4.12", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } futures = "0.3.28" hex-literal = "0.4.1" log = "0.4.20" -serde = { version = "1.0.193", features = ["derive"] } -serde_json = "1.0.108" +serde = { version = "1.0.194", features = ["derive"] } +serde_json = "1.0.110" # Local rococo-parachain-runtime = { path = "../parachains/runtimes/testing/rococo-parachain" } diff --git a/cumulus/test/service/Cargo.toml b/cumulus/test/service/Cargo.toml index c6d82191a9e..03040e7a2b6 100644 --- a/cumulus/test/service/Cargo.toml +++ b/cumulus/test/service/Cargo.toml @@ -14,13 +14,13 @@ path = "src/main.rs" [dependencies] async-trait = "0.1.74" -clap = { version = "4.4.11", features = ["derive"] } +clap = { version = "4.4.12", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } criterion = { version = "0.5.1", features = ["async_tokio"] } jsonrpsee = { version = "0.16.2", features = ["server"] } rand = "0.8.5" -serde = { version = "1.0.193", features = ["derive"] } -serde_json = "1.0.108" +serde = { version = "1.0.194", features = ["derive"] } +serde_json = "1.0.110" tokio = { version = "1.32.0", features = ["macros"] } tracing = "0.1.37" url = "2.4.0" diff --git a/polkadot/cli/Cargo.toml b/polkadot/cli/Cargo.toml index ed90b2d58a4..3244608af2a 100644 --- a/polkadot/cli/Cargo.toml +++ b/polkadot/cli/Cargo.toml @@ -19,7 +19,7 @@ crate-type = ["cdylib", "rlib"] [dependencies] cfg-if = "1.0" -clap = { version = "4.4.11", features = ["derive"], optional = true } +clap = { version = "4.4.12", features = ["derive"], optional = true } log = "0.4.17" thiserror = "1.0.48" futures = "0.3.21" diff --git a/polkadot/node/malus/Cargo.toml b/polkadot/node/malus/Cargo.toml index 659c6eb8cd8..64657afc51a 100644 --- a/polkadot/node/malus/Cargo.toml +++ b/polkadot/node/malus/Cargo.toml @@ -43,7 +43,7 @@ assert_matches = "1.5" async-trait = "0.1.74" sp-keystore = { path = "../../../substrate/primitives/keystore" } sp-core = { path = "../../../substrate/primitives/core" } -clap = { version = "4.4.11", features = ["derive"] } +clap = { version = "4.4.12", features = ["derive"] } futures = "0.3.21" futures-timer = "3.0.2" gum = { package = "tracing-gum", path = "../gum" } diff --git a/polkadot/node/primitives/Cargo.toml b/polkadot/node/primitives/Cargo.toml index 09817ed1cf3..924d56c5bba 100644 --- a/polkadot/node/primitives/Cargo.toml +++ b/polkadot/node/primitives/Cargo.toml @@ -24,7 +24,7 @@ polkadot-parachain-primitives = { path = "../../parachain", default-features = f schnorrkel = "0.11.4" thiserror = "1.0.48" bitvec = { version = "1.0.0", default-features = false, features = ["alloc"] } -serde = { version = "1.0.193", features = ["derive"] } +serde = { version = "1.0.194", features = ["derive"] } [target.'cfg(not(target_os = "unknown"))'.dependencies] zstd = { version = "0.12.4", default-features = false } diff --git a/polkadot/node/service/Cargo.toml b/polkadot/node/service/Cargo.toml index 0671b912120..2f440abeb11 100644 --- a/polkadot/node/service/Cargo.toml +++ b/polkadot/node/service/Cargo.toml @@ -85,8 +85,8 @@ is_executable = "1.0.1" gum = { package = "tracing-gum", path = "../gum" } log = "0.4.17" schnellru = "0.2.1" -serde = { version = "1.0.193", features = ["derive"] } -serde_json = "1.0.108" +serde = { version = "1.0.194", features = ["derive"] } +serde_json = "1.0.110" thiserror = "1.0.48" kvdb = "0.13.0" kvdb-rocksdb = { version = "0.19.0", optional = true } diff --git a/polkadot/node/subsystem-bench/Cargo.toml b/polkadot/node/subsystem-bench/Cargo.toml index 6504c8f714d..d9e68b901e3 100644 --- a/polkadot/node/subsystem-bench/Cargo.toml +++ b/polkadot/node/subsystem-bench/Cargo.toml @@ -31,7 +31,7 @@ async-trait = "0.1.74" sp-keystore = { path = "../../../substrate/primitives/keystore" } sc-keystore = { path = "../../../substrate/client/keystore" } sp-core = { path = "../../../substrate/primitives/core" } -clap = { version = "4.4.6", features = ["derive"] } +clap = { version = "4.4.12", features = ["derive"] } futures = "0.3.21" futures-timer = "3.0.2" gum = { package = "tracing-gum", path = "../gum" } @@ -52,7 +52,7 @@ itertools = "0.11.0" polkadot-primitives-test-helpers = { path = "../../primitives/test-helpers" } prometheus_endpoint = { package = "substrate-prometheus-endpoint", path = "../../../substrate/utils/prometheus" } prometheus = { version = "0.13.0", default-features = false } -serde = "1.0.192" +serde = "1.0.194" serde_yaml = "0.9" paste = "1.0.14" orchestra = { version = "0.3.3", default-features = false, features = ["futures_channel"] } diff --git a/polkadot/node/test/service/Cargo.toml b/polkadot/node/test/service/Cargo.toml index 3199dc262bb..f8c35900dbe 100644 --- a/polkadot/node/test/service/Cargo.toml +++ b/polkadot/node/test/service/Cargo.toml @@ -14,7 +14,7 @@ futures = "0.3.21" hex = "0.4.3" gum = { package = "tracing-gum", path = "../../gum" } rand = "0.8.5" -serde_json = "1.0.108" +serde_json = "1.0.110" tempfile = "3.2.0" tokio = "1.24.2" diff --git a/polkadot/node/zombienet-backchannel/Cargo.toml b/polkadot/node/zombienet-backchannel/Cargo.toml index e81ab2db14b..7f44a98b6a9 100644 --- a/polkadot/node/zombienet-backchannel/Cargo.toml +++ b/polkadot/node/zombienet-backchannel/Cargo.toml @@ -22,4 +22,4 @@ reqwest = { version = "0.11", features = ["rustls-tls"], default-features = fals thiserror = "1.0.48" gum = { package = "tracing-gum", path = "../gum" } serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0.108" +serde_json = "1.0.110" diff --git a/polkadot/parachain/Cargo.toml b/polkadot/parachain/Cargo.toml index 0521af3bf2d..52858d3ed70 100644 --- a/polkadot/parachain/Cargo.toml +++ b/polkadot/parachain/Cargo.toml @@ -24,7 +24,7 @@ derive_more = "0.99.11" bounded-collections = { version = "0.1.8", default-features = false, features = ["serde"] } # all optional crates. -serde = { version = "1.0.193", default-features = false, features = ["alloc", "derive"] } +serde = { version = "1.0.194", default-features = false, features = ["alloc", "derive"] } [features] default = ["std"] diff --git a/polkadot/parachain/test-parachains/adder/collator/Cargo.toml b/polkadot/parachain/test-parachains/adder/collator/Cargo.toml index b8f0c579b8b..f7ba527f6b4 100644 --- a/polkadot/parachain/test-parachains/adder/collator/Cargo.toml +++ b/polkadot/parachain/test-parachains/adder/collator/Cargo.toml @@ -16,7 +16,7 @@ path = "src/main.rs" [dependencies] parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive"] } -clap = { version = "4.4.11", features = ["derive"] } +clap = { version = "4.4.12", features = ["derive"] } futures = "0.3.21" futures-timer = "3.0.2" log = "0.4.17" diff --git a/polkadot/parachain/test-parachains/undying/collator/Cargo.toml b/polkadot/parachain/test-parachains/undying/collator/Cargo.toml index 4ef24ca83dc..a9f6e366cd6 100644 --- a/polkadot/parachain/test-parachains/undying/collator/Cargo.toml +++ b/polkadot/parachain/test-parachains/undying/collator/Cargo.toml @@ -16,7 +16,7 @@ path = "src/main.rs" [dependencies] parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive"] } -clap = { version = "4.4.11", features = ["derive"] } +clap = { version = "4.4.12", features = ["derive"] } futures = "0.3.21" futures-timer = "3.0.2" log = "0.4.17" diff --git a/polkadot/primitives/Cargo.toml b/polkadot/primitives/Cargo.toml index de6df85051a..56fa14bcb7d 100644 --- a/polkadot/primitives/Cargo.toml +++ b/polkadot/primitives/Cargo.toml @@ -14,7 +14,7 @@ bitvec = { version = "1.0.0", default-features = false, features = ["alloc", "se hex-literal = "0.4.1" parity-scale-codec = { version = "3.6.1", default-features = false, features = ["bit-vec", "derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["bit-vec", "derive", "serde"] } -serde = { version = "1.0.193", default-features = false, features = ["alloc", "derive"] } +serde = { version = "1.0.194", default-features = false, features = ["alloc", "derive"] } application-crypto = { package = "sp-application-crypto", path = "../../substrate/primitives/application-crypto", default-features = false, features = ["serde"] } inherents = { package = "sp-inherents", path = "../../substrate/primitives/inherents", default-features = false } diff --git a/polkadot/runtime/common/Cargo.toml b/polkadot/runtime/common/Cargo.toml index c841c0847c0..fc2f3e2eb5a 100644 --- a/polkadot/runtime/common/Cargo.toml +++ b/polkadot/runtime/common/Cargo.toml @@ -16,7 +16,7 @@ parity-scale-codec = { version = "3.6.1", default-features = false, features = [ log = { version = "0.4.17", default-features = false } rustc-hex = { version = "2.1.0", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.193", default-features = false, features = ["alloc"] } +serde = { version = "1.0.194", default-features = false, features = ["alloc"] } serde_derive = { version = "1.0.117" } static_assertions = "1.1.0" @@ -69,7 +69,7 @@ pallet-babe = { path = "../../../substrate/frame/babe" } pallet-treasury = { path = "../../../substrate/frame/treasury" } sp-keystore = { path = "../../../substrate/primitives/keystore" } sp-keyring = { path = "../../../substrate/primitives/keyring" } -serde_json = "1.0.108" +serde_json = "1.0.110" libsecp256k1 = "0.7.0" test-helpers = { package = "polkadot-primitives-test-helpers", path = "../../primitives/test-helpers" } diff --git a/polkadot/runtime/parachains/Cargo.toml b/polkadot/runtime/parachains/Cargo.toml index 1f381400cf5..65e76ccce31 100644 --- a/polkadot/runtime/parachains/Cargo.toml +++ b/polkadot/runtime/parachains/Cargo.toml @@ -16,7 +16,7 @@ parity-scale-codec = { version = "3.6.1", default-features = false, features = [ log = { version = "0.4.17", default-features = false } rustc-hex = { version = "2.1.0", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.193", default-features = false, features = ["alloc", "derive"] } +serde = { version = "1.0.194", default-features = false, features = ["alloc", "derive"] } derive_more = "0.99.17" bitflags = "1.3.2" @@ -68,7 +68,7 @@ test-helpers = { package = "polkadot-primitives-test-helpers", path = "../../pri sp-tracing = { path = "../../../substrate/primitives/tracing" } thousands = "0.2.0" assert_matches = "1" -serde_json = "1.0.108" +serde_json = "1.0.110" [features] default = ["std"] diff --git a/polkadot/runtime/rococo/Cargo.toml b/polkadot/runtime/rococo/Cargo.toml index c7236572ed7..cdedf965f9a 100644 --- a/polkadot/runtime/rococo/Cargo.toml +++ b/polkadot/runtime/rococo/Cargo.toml @@ -14,7 +14,7 @@ workspace = true parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive", "max-encoded-len"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } log = { version = "0.4.17", default-features = false } -serde = { version = "1.0.193", default-features = false } +serde = { version = "1.0.194", default-features = false } serde_derive = { version = "1.0.117", optional = true } static_assertions = "1.1.0" smallvec = "1.8.0" @@ -111,7 +111,7 @@ keyring = { package = "sp-keyring", path = "../../../substrate/primitives/keyrin remote-externalities = { package = "frame-remote-externalities", path = "../../../substrate/utils/frame/remote-externalities" } sp-trie = { path = "../../../substrate/primitives/trie" } separator = "0.4.1" -serde_json = "1.0.108" +serde_json = "1.0.110" sp-tracing = { path = "../../../substrate/primitives/tracing", default-features = false } tokio = { version = "1.24.2", features = ["macros"] } diff --git a/polkadot/runtime/test-runtime/Cargo.toml b/polkadot/runtime/test-runtime/Cargo.toml index 585f16ac86f..582124fe3ea 100644 --- a/polkadot/runtime/test-runtime/Cargo.toml +++ b/polkadot/runtime/test-runtime/Cargo.toml @@ -16,7 +16,7 @@ parity-scale-codec = { version = "3.6.1", default-features = false, features = [ log = { version = "0.4.17", default-features = false } rustc-hex = { version = "2.1.0", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.193", default-features = false } +serde = { version = "1.0.194", default-features = false } serde_derive = { version = "1.0.117", optional = true } smallvec = "1.8.0" @@ -74,7 +74,7 @@ hex-literal = "0.4.1" tiny-keccak = { version = "2.0.2", features = ["keccak"] } keyring = { package = "sp-keyring", path = "../../../substrate/primitives/keyring" } sp-trie = { path = "../../../substrate/primitives/trie" } -serde_json = "1.0.108" +serde_json = "1.0.110" [build-dependencies] substrate-wasm-builder = { path = "../../../substrate/utils/wasm-builder" } diff --git a/polkadot/runtime/westend/Cargo.toml b/polkadot/runtime/westend/Cargo.toml index 335ac14d47a..02db976e28a 100644 --- a/polkadot/runtime/westend/Cargo.toml +++ b/polkadot/runtime/westend/Cargo.toml @@ -16,7 +16,7 @@ parity-scale-codec = { version = "3.6.1", default-features = false, features = [ scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } log = { version = "0.4.17", default-features = false } rustc-hex = { version = "2.1.0", default-features = false } -serde = { version = "1.0.193", default-features = false } +serde = { version = "1.0.194", default-features = false } serde_derive = { version = "1.0.117", optional = true } smallvec = "1.8.0" @@ -119,7 +119,7 @@ xcm-builder = { package = "staging-xcm-builder", path = "../../xcm/xcm-builder", hex-literal = "0.4.1" tiny-keccak = { version = "2.0.2", features = ["keccak"] } keyring = { package = "sp-keyring", path = "../../../substrate/primitives/keyring" } -serde_json = "1.0.108" +serde_json = "1.0.110" remote-externalities = { package = "frame-remote-externalities", path = "../../../substrate/utils/frame/remote-externalities" } tokio = { version = "1.24.2", features = ["macros"] } sp-tracing = { path = "../../../substrate/primitives/tracing", default-features = false } diff --git a/polkadot/utils/generate-bags/Cargo.toml b/polkadot/utils/generate-bags/Cargo.toml index 97f15f02e35..179be5c4ac1 100644 --- a/polkadot/utils/generate-bags/Cargo.toml +++ b/polkadot/utils/generate-bags/Cargo.toml @@ -10,7 +10,7 @@ description = "CLI to generate voter bags for Polkadot runtimes" workspace = true [dependencies] -clap = { version = "4.4.11", features = ["derive"] } +clap = { version = "4.4.12", features = ["derive"] } generate-bags = { path = "../../../substrate/utils/frame/generate-bags" } sp-io = { path = "../../../substrate/primitives/io" } diff --git a/polkadot/utils/remote-ext-tests/bags-list/Cargo.toml b/polkadot/utils/remote-ext-tests/bags-list/Cargo.toml index 6b8c4be38a1..a4ffed0a5ce 100644 --- a/polkadot/utils/remote-ext-tests/bags-list/Cargo.toml +++ b/polkadot/utils/remote-ext-tests/bags-list/Cargo.toml @@ -18,6 +18,6 @@ sp-tracing = { path = "../../../../substrate/primitives/tracing" } frame-system = { path = "../../../../substrate/frame/system" } sp-core = { path = "../../../../substrate/primitives/core" } -clap = { version = "4.4.11", features = ["derive"] } +clap = { version = "4.4.12", features = ["derive"] } log = "0.4.17" tokio = { version = "1.24.2", features = ["macros"] } diff --git a/polkadot/xcm/Cargo.toml b/polkadot/xcm/Cargo.toml index 024e788b871..4d04a002fe0 100644 --- a/polkadot/xcm/Cargo.toml +++ b/polkadot/xcm/Cargo.toml @@ -18,7 +18,7 @@ log = { version = "0.4.17", default-features = false } parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive", "max-encoded-len"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive", "serde"] } sp-weights = { path = "../../substrate/primitives/weights", default-features = false, features = ["serde"] } -serde = { version = "1.0.193", default-features = false, features = ["alloc", "derive"] } +serde = { version = "1.0.194", default-features = false, features = ["alloc", "derive"] } schemars = { version = "0.8.13", default-features = true, optional = true } xcm-procedural = { path = "procedural" } environmental = { version = "1.1.4", default-features = false } diff --git a/polkadot/xcm/pallet-xcm/Cargo.toml b/polkadot/xcm/pallet-xcm/Cargo.toml index 220aad01398..a4d0bb01b2b 100644 --- a/polkadot/xcm/pallet-xcm/Cargo.toml +++ b/polkadot/xcm/pallet-xcm/Cargo.toml @@ -13,7 +13,7 @@ workspace = true bounded-collections = { version = "0.1.8", default-features = false } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.193", optional = true, features = ["derive"] } +serde = { version = "1.0.194", optional = true, features = ["derive"] } log = { version = "0.4.17", default-features = false } frame-support = { path = "../../../substrate/frame/support", default-features = false } diff --git a/substrate/bin/minimal/node/Cargo.toml b/substrate/bin/minimal/node/Cargo.toml index 532cded68de..64851d5b352 100644 --- a/substrate/bin/minimal/node/Cargo.toml +++ b/substrate/bin/minimal/node/Cargo.toml @@ -20,11 +20,11 @@ targets = ["x86_64-unknown-linux-gnu"] name = "minimal-node" [dependencies] -clap = { version = "4.4.11", features = ["derive"] } +clap = { version = "4.4.12", features = ["derive"] } futures = { version = "0.3.21", features = ["thread-pool"] } futures-timer = "3.0.1" jsonrpsee = { version = "0.16.2", features = ["server"] } -serde_json = "1.0.108" +serde_json = "1.0.110" sc-cli = { path = "../../../client/cli" } sc-executor = { path = "../../../client/executor" } diff --git a/substrate/bin/node-template/node/Cargo.toml b/substrate/bin/node-template/node/Cargo.toml index 9d8c4430c21..30468a2093c 100644 --- a/substrate/bin/node-template/node/Cargo.toml +++ b/substrate/bin/node-template/node/Cargo.toml @@ -20,9 +20,9 @@ targets = ["x86_64-unknown-linux-gnu"] name = "node-template" [dependencies] -clap = { version = "4.4.11", features = ["derive"] } +clap = { version = "4.4.12", features = ["derive"] } futures = { version = "0.3.21", features = ["thread-pool"] } -serde_json = "1.0.108" +serde_json = "1.0.110" sc-cli = { path = "../../../client/cli" } sp-core = { path = "../../../primitives/core" } diff --git a/substrate/bin/node-template/runtime/Cargo.toml b/substrate/bin/node-template/runtime/Cargo.toml index 14a64948c0b..d274eaa7a09 100644 --- a/substrate/bin/node-template/runtime/Cargo.toml +++ b/substrate/bin/node-template/runtime/Cargo.toml @@ -42,7 +42,7 @@ sp-std = { path = "../../../primitives/std", default-features = false } sp-storage = { path = "../../../primitives/storage", default-features = false } sp-transaction-pool = { path = "../../../primitives/transaction-pool", default-features = false } sp-version = { path = "../../../primitives/version", default-features = false, features = ["serde"] } -serde_json = { version = "1.0.108", default-features = false, features = ["alloc"] } +serde_json = { version = "1.0.110", default-features = false, features = ["alloc"] } sp-genesis-builder = { default-features = false, path = "../../../primitives/genesis-builder" } # Used for the node template's RPCs diff --git a/substrate/bin/node/bench/Cargo.toml b/substrate/bin/node/bench/Cargo.toml index 48b3ef1b67e..52b2d94453d 100644 --- a/substrate/bin/node/bench/Cargo.toml +++ b/substrate/bin/node/bench/Cargo.toml @@ -16,7 +16,7 @@ workspace = true [dependencies] array-bytes = "6.1" -clap = { version = "4.4.11", features = ["derive"] } +clap = { version = "4.4.12", features = ["derive"] } log = "0.4.17" node-primitives = { path = "../primitives" } node-testing = { path = "../testing" } @@ -24,8 +24,8 @@ kitchensink-runtime = { path = "../runtime" } sc-client-api = { path = "../../../client/api" } sp-runtime = { path = "../../../primitives/runtime" } sp-state-machine = { path = "../../../primitives/state-machine" } -serde = "1.0.193" -serde_json = "1.0.108" +serde = "1.0.194" +serde_json = "1.0.110" derive_more = { version = "0.99.17", default-features = false, features = ["display"] } kvdb = "0.13.0" kvdb-rocksdb = "0.19.0" diff --git a/substrate/bin/node/cli/Cargo.toml b/substrate/bin/node/cli/Cargo.toml index 4f78bd65e8f..a01c35a3b63 100644 --- a/substrate/bin/node/cli/Cargo.toml +++ b/substrate/bin/node/cli/Cargo.toml @@ -41,9 +41,9 @@ crate-type = ["cdylib", "rlib"] [dependencies] # third-party dependencies array-bytes = "6.1" -clap = { version = "4.4.11", features = ["derive"], optional = true } +clap = { version = "4.4.12", features = ["derive"], optional = true } codec = { package = "parity-scale-codec", version = "3.6.1" } -serde = { version = "1.0.193", features = ["derive"] } +serde = { version = "1.0.194", features = ["derive"] } jsonrpsee = { version = "0.16.2", features = ["server"] } futures = "0.3.21" log = "0.4.17" @@ -112,7 +112,7 @@ sc-cli = { path = "../../../client/cli", optional = true } frame-benchmarking-cli = { path = "../../../utils/frame/benchmarking-cli", optional = true } node-inspect = { package = "staging-node-inspect", path = "../inspect", optional = true } try-runtime-cli = { path = "../../../utils/frame/try-runtime/cli", optional = true } -serde_json = "1.0.108" +serde_json = "1.0.110" [dev-dependencies] sc-keystore = { path = "../../../client/keystore" } @@ -154,13 +154,13 @@ sp-consensus-babe = { path = "../../../primitives/consensus/babe" } sp-externalities = { path = "../../../primitives/externalities" } sp-keyring = { path = "../../../primitives/keyring" } sp-runtime = { path = "../../../primitives/runtime" } -serde_json = "1.0.108" +serde_json = "1.0.110" scale-info = { version = "2.10.0", features = ["derive", "serde"] } sp-trie = { path = "../../../primitives/trie" } sp-state-machine = { path = "../../../primitives/state-machine" } [build-dependencies] -clap = { version = "4.4.11", optional = true } +clap = { version = "4.4.12", optional = true } clap_complete = { version = "4.0.2", optional = true } node-inspect = { package = "staging-node-inspect", path = "../inspect", optional = true } frame-benchmarking-cli = { path = "../../../utils/frame/benchmarking-cli", optional = true } diff --git a/substrate/bin/node/inspect/Cargo.toml b/substrate/bin/node/inspect/Cargo.toml index 44de013483e..f3f531a4db1 100644 --- a/substrate/bin/node/inspect/Cargo.toml +++ b/substrate/bin/node/inspect/Cargo.toml @@ -15,7 +15,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -clap = { version = "4.4.11", features = ["derive"] } +clap = { version = "4.4.12", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.6.1" } thiserror = "1.0" sc-cli = { path = "../../../client/cli" } diff --git a/substrate/bin/node/runtime/Cargo.toml b/substrate/bin/node/runtime/Cargo.toml index 693fd673da5..5f77f72af49 100644 --- a/substrate/bin/node/runtime/Cargo.toml +++ b/substrate/bin/node/runtime/Cargo.toml @@ -26,7 +26,7 @@ codec = { package = "parity-scale-codec", version = "3.6.1", default-features = scale-info = { version = "2.10.0", default-features = false, features = ["derive", "serde"] } static_assertions = "1.1.0" log = { version = "0.4.17", default-features = false } -serde_json = { version = "1.0.108", default-features = false, features = ["alloc", "arbitrary_precision"] } +serde_json = { version = "1.0.110", default-features = false, features = ["alloc", "arbitrary_precision"] } # pallet-asset-conversion: turn on "num-traits" feature primitive-types = { version = "0.12.0", default-features = false, features = ["codec", "num-traits", "scale-info"] } diff --git a/substrate/bin/utils/chain-spec-builder/Cargo.toml b/substrate/bin/utils/chain-spec-builder/Cargo.toml index dcbe26f6a8f..0a1b1345a15 100644 --- a/substrate/bin/utils/chain-spec-builder/Cargo.toml +++ b/substrate/bin/utils/chain-spec-builder/Cargo.toml @@ -23,8 +23,8 @@ name = "chain-spec-builder" crate-type = ["rlib"] [dependencies] -clap = { version = "4.4.11", features = ["derive"] } +clap = { version = "4.4.12", features = ["derive"] } log = "0.4.17" sc-chain-spec = { path = "../../../client/chain-spec" } -serde_json = "1.0.108" +serde_json = "1.0.110" sp-tracing = { version = "10.0.0", path = "../../../primitives/tracing" } diff --git a/substrate/bin/utils/subkey/Cargo.toml b/substrate/bin/utils/subkey/Cargo.toml index 58aa036a631..57613cb718c 100644 --- a/substrate/bin/utils/subkey/Cargo.toml +++ b/substrate/bin/utils/subkey/Cargo.toml @@ -20,5 +20,5 @@ path = "src/main.rs" name = "subkey" [dependencies] -clap = { version = "4.4.11", features = ["derive"] } +clap = { version = "4.4.12", features = ["derive"] } sc-cli = { path = "../../../client/cli" } diff --git a/substrate/client/chain-spec/Cargo.toml b/substrate/client/chain-spec/Cargo.toml index c870ff19b2a..6943c5d94ac 100644 --- a/substrate/client/chain-spec/Cargo.toml +++ b/substrate/client/chain-spec/Cargo.toml @@ -18,8 +18,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } memmap2 = "0.5.0" -serde = { version = "1.0.193", features = ["derive"] } -serde_json = "1.0.108" +serde = { version = "1.0.194", features = ["derive"] } +serde_json = "1.0.110" sc-client-api = { path = "../api" } sc-chain-spec-derive = { path = "derive" } sc-executor = { path = "../executor" } diff --git a/substrate/client/cli/Cargo.toml b/substrate/client/cli/Cargo.toml index 80d3815fbc6..56bc0dd2504 100644 --- a/substrate/client/cli/Cargo.toml +++ b/substrate/client/cli/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] array-bytes = "6.1" chrono = "0.4.31" -clap = { version = "4.4.11", features = ["derive", "string", "wrap_help"] } +clap = { version = "4.4.12", features = ["derive", "string", "wrap_help"] } fdlimit = "0.3.0" futures = "0.3.21" itertools = "0.10.3" @@ -29,8 +29,8 @@ parity-scale-codec = "3.6.1" rand = "0.8.5" regex = "1.6.0" rpassword = "7.0.0" -serde = "1.0.193" -serde_json = "1.0.108" +serde = "1.0.194" +serde_json = "1.0.110" thiserror = "1.0.48" bip39 = "2.0.0" tokio = { version = "1.22.0", features = ["parking_lot", "rt-multi-thread", "signal"] } diff --git a/substrate/client/consensus/babe/rpc/Cargo.toml b/substrate/client/consensus/babe/rpc/Cargo.toml index b23f3f81d43..ef053a0ab26 100644 --- a/substrate/client/consensus/babe/rpc/Cargo.toml +++ b/substrate/client/consensus/babe/rpc/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] jsonrpsee = { version = "0.16.2", features = ["client-core", "macros", "server"] } futures = "0.3.21" -serde = { version = "1.0.193", features = ["derive"] } +serde = { version = "1.0.194", features = ["derive"] } thiserror = "1.0" sc-consensus-babe = { path = ".." } sc-consensus-epochs = { path = "../../epochs" } @@ -33,7 +33,7 @@ sp-keystore = { path = "../../../../primitives/keystore" } sp-runtime = { path = "../../../../primitives/runtime" } [dev-dependencies] -serde_json = "1.0.108" +serde_json = "1.0.110" tokio = "1.22.0" sc-consensus = { path = "../../common" } sc-keystore = { path = "../../../keystore" } diff --git a/substrate/client/consensus/beefy/Cargo.toml b/substrate/client/consensus/beefy/Cargo.toml index 1570dc744ed..77c1baa053a 100644 --- a/substrate/client/consensus/beefy/Cargo.toml +++ b/substrate/client/consensus/beefy/Cargo.toml @@ -43,7 +43,7 @@ tokio = "1.22.0" [dev-dependencies] -serde = "1.0.193" +serde = "1.0.194" tempfile = "3.1.0" sc-block-builder = { path = "../../block-builder" } sc-network-test = { path = "../../network/test" } diff --git a/substrate/client/consensus/beefy/rpc/Cargo.toml b/substrate/client/consensus/beefy/rpc/Cargo.toml index 157b0cc87fc..921ced61cca 100644 --- a/substrate/client/consensus/beefy/rpc/Cargo.toml +++ b/substrate/client/consensus/beefy/rpc/Cargo.toml @@ -17,7 +17,7 @@ futures = "0.3.21" jsonrpsee = { version = "0.16.2", features = ["client-core", "macros", "server"] } log = "0.4" parking_lot = "0.12.1" -serde = { version = "1.0.193", features = ["derive"] } +serde = { version = "1.0.194", features = ["derive"] } thiserror = "1.0" sc-consensus-beefy = { path = ".." } sp-consensus-beefy = { path = "../../../../primitives/consensus/beefy" } @@ -26,7 +26,7 @@ sp-core = { path = "../../../../primitives/core" } sp-runtime = { path = "../../../../primitives/runtime" } [dev-dependencies] -serde_json = "1.0.108" +serde_json = "1.0.110" sc-rpc = { path = "../../../rpc", features = ["test-helpers"] } substrate-test-runtime-client = { path = "../../../../test-utils/runtime/client" } tokio = { version = "1.22.0", features = ["macros"] } diff --git a/substrate/client/consensus/grandpa/Cargo.toml b/substrate/client/consensus/grandpa/Cargo.toml index 2adedb5b3b5..d0c024f64fa 100644 --- a/substrate/client/consensus/grandpa/Cargo.toml +++ b/substrate/client/consensus/grandpa/Cargo.toml @@ -28,7 +28,7 @@ log = "0.4.17" parity-scale-codec = { version = "3.6.1", features = ["derive"] } parking_lot = "0.12.1" rand = "0.8.5" -serde_json = "1.0.108" +serde_json = "1.0.110" thiserror = "1.0" fork-tree = { path = "../../../utils/fork-tree" } prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus" } @@ -56,7 +56,7 @@ sp-runtime = { path = "../../../primitives/runtime" } [dev-dependencies] assert_matches = "1.3.0" finality-grandpa = { version = "0.16.2", features = ["derive-codec", "test-helpers"] } -serde = "1.0.193" +serde = "1.0.194" tokio = "1.22.0" sc-network = { path = "../../network" } sc-network-test = { path = "../../network/test" } diff --git a/substrate/client/consensus/grandpa/rpc/Cargo.toml b/substrate/client/consensus/grandpa/rpc/Cargo.toml index 983f7a4339b..a6d0f39c0cd 100644 --- a/substrate/client/consensus/grandpa/rpc/Cargo.toml +++ b/substrate/client/consensus/grandpa/rpc/Cargo.toml @@ -18,7 +18,7 @@ futures = "0.3.16" jsonrpsee = { version = "0.16.2", features = ["client-core", "macros", "server"] } log = "0.4.8" parity-scale-codec = { version = "3.6.1", features = ["derive"] } -serde = { version = "1.0.193", features = ["derive"] } +serde = { version = "1.0.194", features = ["derive"] } thiserror = "1.0" sc-client-api = { path = "../../../api" } sc-consensus-grandpa = { path = ".." } diff --git a/substrate/client/keystore/Cargo.toml b/substrate/client/keystore/Cargo.toml index 7671aac0bd7..45c7f774e2e 100644 --- a/substrate/client/keystore/Cargo.toml +++ b/substrate/client/keystore/Cargo.toml @@ -19,7 +19,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] array-bytes = "6.1" parking_lot = "0.12.1" -serde_json = "1.0.108" +serde_json = "1.0.110" thiserror = "1.0" sp-application-crypto = { path = "../../primitives/application-crypto" } sp-core = { path = "../../primitives/core" } diff --git a/substrate/client/merkle-mountain-range/rpc/Cargo.toml b/substrate/client/merkle-mountain-range/rpc/Cargo.toml index d4ee0b48522..e38ef061a71 100644 --- a/substrate/client/merkle-mountain-range/rpc/Cargo.toml +++ b/substrate/client/merkle-mountain-range/rpc/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1" } jsonrpsee = { version = "0.16.2", features = ["client-core", "macros", "server"] } -serde = { version = "1.0.193", features = ["derive"] } +serde = { version = "1.0.194", features = ["derive"] } sp-api = { path = "../../../primitives/api" } sp-blockchain = { path = "../../../primitives/blockchain" } sp-core = { path = "../../../primitives/core" } @@ -26,4 +26,4 @@ sp-runtime = { path = "../../../primitives/runtime" } anyhow = "1" [dev-dependencies] -serde_json = "1.0.108" +serde_json = "1.0.110" diff --git a/substrate/client/network/Cargo.toml b/substrate/client/network/Cargo.toml index 6fa88457e98..ab2d02fd80e 100644 --- a/substrate/client/network/Cargo.toml +++ b/substrate/client/network/Cargo.toml @@ -36,8 +36,8 @@ parking_lot = "0.12.1" partial_sort = "0.2.0" pin-project = "1.0.12" rand = "0.8.5" -serde = { version = "1.0.193", features = ["derive"] } -serde_json = "1.0.108" +serde = { version = "1.0.194", features = ["derive"] } +serde_json = "1.0.110" smallvec = "1.11.0" thiserror = "1.0" tokio = { version = "1.22.0", features = ["macros", "sync"] } diff --git a/substrate/client/rpc-api/Cargo.toml b/substrate/client/rpc-api/Cargo.toml index 6b1270fc370..7978148c3c8 100644 --- a/substrate/client/rpc-api/Cargo.toml +++ b/substrate/client/rpc-api/Cargo.toml @@ -18,8 +18,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1" } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.193", features = ["derive"] } -serde_json = "1.0.108" +serde = { version = "1.0.194", features = ["derive"] } +serde_json = "1.0.110" thiserror = "1.0" sc-chain-spec = { path = "../chain-spec" } sc-mixnet = { path = "../mixnet" } diff --git a/substrate/client/rpc-servers/Cargo.toml b/substrate/client/rpc-servers/Cargo.toml index 5bb7317264c..addbbab92d4 100644 --- a/substrate/client/rpc-servers/Cargo.toml +++ b/substrate/client/rpc-servers/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] jsonrpsee = { version = "0.16.2", features = ["server"] } log = "0.4.17" -serde_json = "1.0.108" +serde_json = "1.0.110" tokio = { version = "1.22.0", features = ["parking_lot"] } prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus" } tower-http = { version = "0.4.0", features = ["cors"] } diff --git a/substrate/client/rpc-spec-v2/Cargo.toml b/substrate/client/rpc-spec-v2/Cargo.toml index b5fb8b5b204..9ee18b59489 100644 --- a/substrate/client/rpc-spec-v2/Cargo.toml +++ b/substrate/client/rpc-spec-v2/Cargo.toml @@ -42,7 +42,7 @@ log = "0.4.17" futures-util = { version = "0.3.19", default-features = false } [dev-dependencies] -serde_json = "1.0.108" +serde_json = "1.0.110" tokio = { version = "1.22.0", features = ["macros"] } substrate-test-runtime-client = { path = "../../test-utils/runtime/client" } substrate-test-runtime = { path = "../../test-utils/runtime" } diff --git a/substrate/client/rpc/Cargo.toml b/substrate/client/rpc/Cargo.toml index 361d98a6b10..5da79442544 100644 --- a/substrate/client/rpc/Cargo.toml +++ b/substrate/client/rpc/Cargo.toml @@ -21,7 +21,7 @@ futures = "0.3.21" jsonrpsee = { version = "0.16.2", features = ["server"] } log = "0.4.17" parking_lot = "0.12.1" -serde_json = "1.0.108" +serde_json = "1.0.110" sc-block-builder = { path = "../block-builder" } sc-chain-spec = { path = "../chain-spec" } sc-client-api = { path = "../api" } diff --git a/substrate/client/service/Cargo.toml b/substrate/client/service/Cargo.toml index 0dd6db75332..adfd8d45b24 100644 --- a/substrate/client/service/Cargo.toml +++ b/substrate/client/service/Cargo.toml @@ -37,8 +37,8 @@ log = "0.4.17" futures-timer = "3.0.1" exit-future = "0.2.0" pin-project = "1.0.12" -serde = "1.0.193" -serde_json = "1.0.108" +serde = "1.0.194" +serde_json = "1.0.110" sc-keystore = { path = "../keystore" } sp-runtime = { path = "../../primitives/runtime" } sp-trie = { path = "../../primitives/trie" } diff --git a/substrate/client/storage-monitor/Cargo.toml b/substrate/client/storage-monitor/Cargo.toml index 1c4a136ade6..8019682f3f1 100644 --- a/substrate/client/storage-monitor/Cargo.toml +++ b/substrate/client/storage-monitor/Cargo.toml @@ -12,7 +12,7 @@ homepage = "https://substrate.io" workspace = true [dependencies] -clap = { version = "4.4.11", features = ["derive", "string"] } +clap = { version = "4.4.12", features = ["derive", "string"] } log = "0.4.17" fs4 = "0.7.0" sc-client-db = { path = "../db", default-features = false } diff --git a/substrate/client/sync-state-rpc/Cargo.toml b/substrate/client/sync-state-rpc/Cargo.toml index c839a4210e4..6c78ff7e5e1 100644 --- a/substrate/client/sync-state-rpc/Cargo.toml +++ b/substrate/client/sync-state-rpc/Cargo.toml @@ -17,8 +17,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1" } jsonrpsee = { version = "0.16.2", features = ["client-core", "macros", "server"] } -serde = { version = "1.0.193", features = ["derive"] } -serde_json = "1.0.108" +serde = { version = "1.0.194", features = ["derive"] } +serde_json = "1.0.110" thiserror = "1.0.48" sc-chain-spec = { path = "../chain-spec" } sc-client-api = { path = "../api" } diff --git a/substrate/client/sysinfo/Cargo.toml b/substrate/client/sysinfo/Cargo.toml index e5d5987c90e..9dfb44f6ab2 100644 --- a/substrate/client/sysinfo/Cargo.toml +++ b/substrate/client/sysinfo/Cargo.toml @@ -24,8 +24,8 @@ rand = "0.8.5" rand_pcg = "0.3.1" derive_more = "0.99" regex = "1" -serde = { version = "1.0.193", features = ["derive"] } -serde_json = "1.0.108" +serde = { version = "1.0.194", features = ["derive"] } +serde_json = "1.0.110" sc-telemetry = { path = "../telemetry" } sp-core = { path = "../../primitives/core" } sp-io = { path = "../../primitives/io" } diff --git a/substrate/client/telemetry/Cargo.toml b/substrate/client/telemetry/Cargo.toml index f4c73dec67e..096ed71fb47 100644 --- a/substrate/client/telemetry/Cargo.toml +++ b/substrate/client/telemetry/Cargo.toml @@ -25,7 +25,7 @@ parking_lot = "0.12.1" pin-project = "1.0.12" sc-utils = { path = "../utils" } rand = "0.8.5" -serde = { version = "1.0.193", features = ["derive"] } -serde_json = "1.0.108" +serde = { version = "1.0.194", features = ["derive"] } +serde_json = "1.0.110" thiserror = "1.0.48" wasm-timer = "0.2.5" diff --git a/substrate/client/tracing/Cargo.toml b/substrate/client/tracing/Cargo.toml index c5d57834604..fef7cc11157 100644 --- a/substrate/client/tracing/Cargo.toml +++ b/substrate/client/tracing/Cargo.toml @@ -26,7 +26,7 @@ log = { version = "0.4.17" } parking_lot = "0.12.1" regex = "1.6.0" rustc-hash = "1.1.0" -serde = "1.0.193" +serde = "1.0.194" thiserror = "1.0.48" tracing = "0.1.29" tracing-log = "0.1.3" diff --git a/substrate/client/transaction-pool/Cargo.toml b/substrate/client/transaction-pool/Cargo.toml index 2eeeb69d5cf..a3608c4ee39 100644 --- a/substrate/client/transaction-pool/Cargo.toml +++ b/substrate/client/transaction-pool/Cargo.toml @@ -23,7 +23,7 @@ futures-timer = "3.0.2" linked-hash-map = "0.5.4" log = "0.4.17" parking_lot = "0.12.1" -serde = { version = "1.0.193", features = ["derive"] } +serde = { version = "1.0.194", features = ["derive"] } thiserror = "1.0.48" prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus" } sc-client-api = { path = "../api" } diff --git a/substrate/client/transaction-pool/api/Cargo.toml b/substrate/client/transaction-pool/api/Cargo.toml index c7325dc2bb6..93ee1a708bb 100644 --- a/substrate/client/transaction-pool/api/Cargo.toml +++ b/substrate/client/transaction-pool/api/Cargo.toml @@ -16,11 +16,11 @@ async-trait = "0.1.74" codec = { package = "parity-scale-codec", version = "3.6.1" } futures = "0.3.21" log = "0.4.17" -serde = { version = "1.0.193", features = ["derive"] } +serde = { version = "1.0.194", features = ["derive"] } thiserror = "1.0.48" sp-blockchain = { path = "../../../primitives/blockchain" } sp-core = { path = "../../../primitives/core", default-features = false } sp-runtime = { path = "../../../primitives/runtime", default-features = false } [dev-dependencies] -serde_json = "1.0.108" +serde_json = "1.0.110" diff --git a/substrate/frame/beefy-mmr/Cargo.toml b/substrate/frame/beefy-mmr/Cargo.toml index 7f647305456..cc240a05b65 100644 --- a/substrate/frame/beefy-mmr/Cargo.toml +++ b/substrate/frame/beefy-mmr/Cargo.toml @@ -16,7 +16,7 @@ array-bytes = { version = "6.1", optional = true } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.193", optional = true } +serde = { version = "1.0.194", optional = true } binary-merkle-tree = { path = "../../utils/binary-merkle-tree", default-features = false } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/beefy/Cargo.toml b/substrate/frame/beefy/Cargo.toml index 185e5487414..07e3d0d7e10 100644 --- a/substrate/frame/beefy/Cargo.toml +++ b/substrate/frame/beefy/Cargo.toml @@ -15,7 +15,7 @@ workspace = true codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive", "serde"] } -serde = { version = "1.0.193", optional = true } +serde = { version = "1.0.194", optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } pallet-authorship = { path = "../authorship", default-features = false } diff --git a/substrate/frame/benchmarking/Cargo.toml b/substrate/frame/benchmarking/Cargo.toml index 980f70a5774..6fc49c2ec1e 100644 --- a/substrate/frame/benchmarking/Cargo.toml +++ b/substrate/frame/benchmarking/Cargo.toml @@ -21,7 +21,7 @@ linregress = { version = "0.5.1", optional = true } log = { version = "0.4.17", default-features = false } paste = "1.0" scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.193", optional = true } +serde = { version = "1.0.194", optional = true } frame-support = { path = "../support", default-features = false } frame-support-procedural = { path = "../support/procedural", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/conviction-voting/Cargo.toml b/substrate/frame/conviction-voting/Cargo.toml index 6d96dde1aaa..7cd25562435 100644 --- a/substrate/frame/conviction-voting/Cargo.toml +++ b/substrate/frame/conviction-voting/Cargo.toml @@ -22,7 +22,7 @@ codec = { package = "parity-scale-codec", version = "3.6.1", default-features = "max-encoded-len", ] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.193", features = ["derive"], optional = true } +serde = { version = "1.0.194", features = ["derive"], optional = true } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/democracy/Cargo.toml b/substrate/frame/democracy/Cargo.toml index 7bfc8c6903b..d17aba0d424 100644 --- a/substrate/frame/democracy/Cargo.toml +++ b/substrate/frame/democracy/Cargo.toml @@ -20,7 +20,7 @@ codec = { package = "parity-scale-codec", version = "3.6.1", default-features = "derive", ] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.193", features = ["derive"], optional = true } +serde = { version = "1.0.194", features = ["derive"], optional = true } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/election-provider-support/solution-type/fuzzer/Cargo.toml b/substrate/frame/election-provider-support/solution-type/fuzzer/Cargo.toml index a7a84b91dba..4de44889382 100644 --- a/substrate/frame/election-provider-support/solution-type/fuzzer/Cargo.toml +++ b/substrate/frame/election-provider-support/solution-type/fuzzer/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -clap = { version = "4.4.11", features = ["derive"] } +clap = { version = "4.4.12", features = ["derive"] } honggfuzz = "0.5" rand = { version = "0.8", features = ["small_rng", "std"] } diff --git a/substrate/frame/message-queue/Cargo.toml b/substrate/frame/message-queue/Cargo.toml index b5162d70ccb..4b9215f6657 100644 --- a/substrate/frame/message-queue/Cargo.toml +++ b/substrate/frame/message-queue/Cargo.toml @@ -14,7 +14,7 @@ workspace = true [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.193", optional = true, features = ["derive"] } +serde = { version = "1.0.194", optional = true, features = ["derive"] } log = { version = "0.4.17", default-features = false } environmental = { version = "1.1.4", default-features = false } diff --git a/substrate/frame/mixnet/Cargo.toml b/substrate/frame/mixnet/Cargo.toml index 949003864a2..b562c5cc056 100644 --- a/substrate/frame/mixnet/Cargo.toml +++ b/substrate/frame/mixnet/Cargo.toml @@ -22,7 +22,7 @@ frame-support = { default-features = false, path = "../support" } frame-system = { default-features = false, path = "../system" } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.193", default-features = false, features = ["derive"] } +serde = { version = "1.0.194", default-features = false, features = ["derive"] } sp-application-crypto = { default-features = false, path = "../../primitives/application-crypto" } sp-arithmetic = { default-features = false, path = "../../primitives/arithmetic" } sp-io = { default-features = false, path = "../../primitives/io" } diff --git a/substrate/frame/offences/Cargo.toml b/substrate/frame/offences/Cargo.toml index df0fb015e95..46e9757a97c 100644 --- a/substrate/frame/offences/Cargo.toml +++ b/substrate/frame/offences/Cargo.toml @@ -19,7 +19,7 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.193", optional = true } +serde = { version = "1.0.194", optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } pallet-balances = { path = "../balances", default-features = false } diff --git a/substrate/frame/referenda/Cargo.toml b/substrate/frame/referenda/Cargo.toml index f76dbece303..8edced5c520 100644 --- a/substrate/frame/referenda/Cargo.toml +++ b/substrate/frame/referenda/Cargo.toml @@ -21,7 +21,7 @@ codec = { package = "parity-scale-codec", version = "3.6.1", default-features = "derive", ] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.193", features = ["derive"], optional = true } +serde = { version = "1.0.194", features = ["derive"], optional = true } sp-arithmetic = { path = "../../primitives/arithmetic", default-features = false } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } diff --git a/substrate/frame/remark/Cargo.toml b/substrate/frame/remark/Cargo.toml index 646563bdb08..e1899bac2aa 100644 --- a/substrate/frame/remark/Cargo.toml +++ b/substrate/frame/remark/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.193", optional = true } +serde = { version = "1.0.194", optional = true } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/staking/Cargo.toml b/substrate/frame/staking/Cargo.toml index 31831fd7ed2..7e1ad492aa0 100644 --- a/substrate/frame/staking/Cargo.toml +++ b/substrate/frame/staking/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -serde = { version = "1.0.193", default-features = false, features = ["alloc", "derive"] } +serde = { version = "1.0.194", default-features = false, features = ["alloc", "derive"] } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = [ "derive", ] } diff --git a/substrate/frame/state-trie-migration/Cargo.toml b/substrate/frame/state-trie-migration/Cargo.toml index 46f86d203c3..4f4960e05c4 100644 --- a/substrate/frame/state-trie-migration/Cargo.toml +++ b/substrate/frame/state-trie-migration/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.193", optional = true } +serde = { version = "1.0.194", optional = true } thousands = { version = "0.2.0", optional = true } zstd = { version = "0.12.4", default-features = false, optional = true } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } diff --git a/substrate/frame/support/Cargo.toml b/substrate/frame/support/Cargo.toml index 07f9075c82b..20a2c2e93e0 100644 --- a/substrate/frame/support/Cargo.toml +++ b/substrate/frame/support/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] array-bytes = { version = "6.1", default-features = false } -serde = { version = "1.0.193", default-features = false, features = ["alloc", "derive"] } +serde = { version = "1.0.194", default-features = false, features = ["alloc", "derive"] } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive", "max-encoded-len"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } frame-metadata = { version = "16.0.0", default-features = false, features = ["current"] } @@ -46,7 +46,7 @@ sp-core-hashing-proc-macro = { path = "../../primitives/core/hashing/proc-macro" k256 = { version = "0.13.1", default-features = false, features = ["ecdsa"] } environmental = { version = "1.1.4", default-features = false } sp-genesis-builder = { path = "../../primitives/genesis-builder", default-features = false } -serde_json = { version = "1.0.108", default-features = false, features = ["alloc"] } +serde_json = { version = "1.0.110", default-features = false, features = ["alloc"] } docify = "0.2.6" static_assertions = "1.1.0" diff --git a/substrate/frame/support/test/Cargo.toml b/substrate/frame/support/test/Cargo.toml index e0c263fb4a1..bdc3622ad97 100644 --- a/substrate/frame/support/test/Cargo.toml +++ b/substrate/frame/support/test/Cargo.toml @@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] static_assertions = "1.1.0" -serde = { version = "1.0.193", default-features = false, features = ["derive"] } +serde = { version = "1.0.194", default-features = false, features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } frame-metadata = { version = "16.0.0", default-features = false, features = ["current"] } diff --git a/substrate/frame/support/test/pallet/Cargo.toml b/substrate/frame/support/test/pallet/Cargo.toml index 493c305cb20..26628fb2bbe 100644 --- a/substrate/frame/support/test/pallet/Cargo.toml +++ b/substrate/frame/support/test/pallet/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.193", default-features = false, features = ["derive"] } +serde = { version = "1.0.194", default-features = false, features = ["derive"] } frame-support = { path = "../..", default-features = false } frame-system = { path = "../../../system", default-features = false } sp-runtime = { path = "../../../../primitives/runtime", default-features = false } diff --git a/substrate/frame/system/Cargo.toml b/substrate/frame/system/Cargo.toml index c64c32b4575..adc7b0faeb0 100644 --- a/substrate/frame/system/Cargo.toml +++ b/substrate/frame/system/Cargo.toml @@ -20,7 +20,7 @@ cfg-if = "1.0" codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive", "serde"] } -serde = { version = "1.0.193", default-features = false, features = ["alloc", "derive"] } +serde = { version = "1.0.194", default-features = false, features = ["alloc", "derive"] } frame-support = { path = "../support", default-features = false } sp-core = { path = "../../primitives/core", default-features = false, features = ["serde"] } sp-io = { path = "../../primitives/io", default-features = false } diff --git a/substrate/frame/tips/Cargo.toml b/substrate/frame/tips/Cargo.toml index fbd6404d785..1d86c3d098b 100644 --- a/substrate/frame/tips/Cargo.toml +++ b/substrate/frame/tips/Cargo.toml @@ -19,7 +19,7 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.193", features = ["derive"], optional = true } +serde = { version = "1.0.194", features = ["derive"], optional = true } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/transaction-payment/Cargo.toml b/substrate/frame/transaction-payment/Cargo.toml index 5ebaa8c98ad..923b1d30a92 100644 --- a/substrate/frame/transaction-payment/Cargo.toml +++ b/substrate/frame/transaction-payment/Cargo.toml @@ -20,7 +20,7 @@ codec = { package = "parity-scale-codec", version = "3.6.1", default-features = "derive", ] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.193", optional = true } +serde = { version = "1.0.194", optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } sp-core = { path = "../../primitives/core", default-features = false } @@ -29,7 +29,7 @@ sp-runtime = { path = "../../primitives/runtime", default-features = false } sp-std = { path = "../../primitives/std", default-features = false } [dev-dependencies] -serde_json = "1.0.108" +serde_json = "1.0.110" pallet-balances = { path = "../balances" } [features] diff --git a/substrate/frame/transaction-payment/asset-tx-payment/Cargo.toml b/substrate/frame/transaction-payment/asset-tx-payment/Cargo.toml index be1bd36231c..324ae27dac7 100644 --- a/substrate/frame/transaction-payment/asset-tx-payment/Cargo.toml +++ b/substrate/frame/transaction-payment/asset-tx-payment/Cargo.toml @@ -30,10 +30,10 @@ frame-benchmarking = { path = "../../benchmarking", default-features = false, op # Other dependencies codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.193", optional = true } +serde = { version = "1.0.194", optional = true } [dev-dependencies] -serde_json = "1.0.108" +serde_json = "1.0.110" sp-storage = { path = "../../../primitives/storage", default-features = false } diff --git a/substrate/frame/transaction-storage/Cargo.toml b/substrate/frame/transaction-storage/Cargo.toml index f2c65e3b8a5..faa9189ec63 100644 --- a/substrate/frame/transaction-storage/Cargo.toml +++ b/substrate/frame/transaction-storage/Cargo.toml @@ -19,7 +19,7 @@ targets = ["x86_64-unknown-linux-gnu"] array-bytes = { version = "6.1", optional = true } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.193", optional = true } +serde = { version = "1.0.194", optional = true } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/treasury/Cargo.toml b/substrate/frame/treasury/Cargo.toml index 3286f4d7f34..120955c6f3b 100644 --- a/substrate/frame/treasury/Cargo.toml +++ b/substrate/frame/treasury/Cargo.toml @@ -23,7 +23,7 @@ codec = { package = "parity-scale-codec", version = "3.6.1", default-features = docify = "0.2.0" impl-trait-for-tuples = "0.2.2" scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.193", features = ["derive"], optional = true } +serde = { version = "1.0.194", features = ["derive"], optional = true } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/primitives/application-crypto/Cargo.toml b/substrate/primitives/application-crypto/Cargo.toml index 33bc22ed84f..b4491a98476 100644 --- a/substrate/primitives/application-crypto/Cargo.toml +++ b/substrate/primitives/application-crypto/Cargo.toml @@ -21,7 +21,7 @@ targets = ["x86_64-unknown-linux-gnu"] sp-core = { path = "../core", default-features = false } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.193", default-features = false, optional = true, features = ["alloc", "derive"] } +serde = { version = "1.0.194", default-features = false, optional = true, features = ["alloc", "derive"] } sp-std = { path = "../std", default-features = false } sp-io = { path = "../io", default-features = false } diff --git a/substrate/primitives/arithmetic/Cargo.toml b/substrate/primitives/arithmetic/Cargo.toml index f7f1da6a913..3f44fe6594f 100644 --- a/substrate/primitives/arithmetic/Cargo.toml +++ b/substrate/primitives/arithmetic/Cargo.toml @@ -24,7 +24,7 @@ codec = { package = "parity-scale-codec", version = "3.6.1", default-features = integer-sqrt = "0.1.2" num-traits = { version = "0.2.17", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.193", default-features = false, features = ["alloc", "derive"], optional = true } +serde = { version = "1.0.194", default-features = false, features = ["alloc", "derive"], optional = true } static_assertions = "1.1.0" sp-std = { path = "../std", default-features = false } diff --git a/substrate/primitives/consensus/babe/Cargo.toml b/substrate/primitives/consensus/babe/Cargo.toml index 8690c73e34c..751866f035f 100644 --- a/substrate/primitives/consensus/babe/Cargo.toml +++ b/substrate/primitives/consensus/babe/Cargo.toml @@ -19,7 +19,7 @@ targets = ["x86_64-unknown-linux-gnu"] async-trait = { version = "0.1.74", optional = true } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.193", default-features = false, features = ["alloc", "derive"], optional = true } +serde = { version = "1.0.194", default-features = false, features = ["alloc", "derive"], optional = true } sp-api = { path = "../../api", default-features = false } sp-application-crypto = { path = "../../application-crypto", default-features = false } sp-consensus-slots = { path = "../slots", default-features = false } diff --git a/substrate/primitives/consensus/beefy/Cargo.toml b/substrate/primitives/consensus/beefy/Cargo.toml index 42383cf14a8..68e0db2f5f6 100644 --- a/substrate/primitives/consensus/beefy/Cargo.toml +++ b/substrate/primitives/consensus/beefy/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.193", default-features = false, optional = true, features = ["alloc", "derive"] } +serde = { version = "1.0.194", default-features = false, optional = true, features = ["alloc", "derive"] } sp-api = { path = "../../api", default-features = false } sp-application-crypto = { path = "../../application-crypto", default-features = false } sp-core = { path = "../../core", default-features = false } diff --git a/substrate/primitives/consensus/grandpa/Cargo.toml b/substrate/primitives/consensus/grandpa/Cargo.toml index 238c9868664..495a37aef69 100644 --- a/substrate/primitives/consensus/grandpa/Cargo.toml +++ b/substrate/primitives/consensus/grandpa/Cargo.toml @@ -21,7 +21,7 @@ codec = { package = "parity-scale-codec", version = "3.6.1", default-features = grandpa = { package = "finality-grandpa", version = "0.16.2", default-features = false, features = ["derive-codec"] } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.193", features = ["alloc", "derive"], default-features = false, optional = true } +serde = { version = "1.0.194", features = ["alloc", "derive"], default-features = false, optional = true } sp-api = { path = "../../api", default-features = false } sp-application-crypto = { path = "../../application-crypto", default-features = false } sp-core = { path = "../../core", default-features = false } diff --git a/substrate/primitives/consensus/sassafras/Cargo.toml b/substrate/primitives/consensus/sassafras/Cargo.toml index 41385e9d1e9..3db7bdbcee1 100644 --- a/substrate/primitives/consensus/sassafras/Cargo.toml +++ b/substrate/primitives/consensus/sassafras/Cargo.toml @@ -20,7 +20,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] scale-codec = { package = "parity-scale-codec", version = "3.2.2", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.193", default-features = false, features = ["derive"], optional = true } +serde = { version = "1.0.194", default-features = false, features = ["derive"], optional = true } sp-api = { path = "../../api", default-features = false } sp-application-crypto = { path = "../../application-crypto", default-features = false, features = ["bandersnatch-experimental"] } sp-consensus-slots = { path = "../slots", default-features = false } diff --git a/substrate/primitives/core/Cargo.toml b/substrate/primitives/core/Cargo.toml index b4d3c843928..1dbb5761ea8 100644 --- a/substrate/primitives/core/Cargo.toml +++ b/substrate/primitives/core/Cargo.toml @@ -19,7 +19,7 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive", "max-encoded-len"] } scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } log = { version = "0.4.17", default-features = false } -serde = { version = "1.0.193", optional = true, default-features = false, features = ["alloc", "derive"] } +serde = { version = "1.0.194", optional = true, default-features = false, features = ["alloc", "derive"] } bounded-collections = { version = "0.1.8", default-features = false } primitive-types = { version = "0.12.0", default-features = false, features = ["codec", "scale-info"] } impl-serde = { version = "0.4.0", default-features = false, optional = true } @@ -63,7 +63,7 @@ bandersnatch_vrfs = { git = "https://github.com/w3f/ring-vrf", rev = "e9782f9", [dev-dependencies] criterion = "0.4.0" -serde_json = "1.0.108" +serde_json = "1.0.110" lazy_static = "1.4.0" regex = "1.6.0" sp-core-hashing-proc-macro = { path = "hashing/proc-macro" } diff --git a/substrate/primitives/genesis-builder/Cargo.toml b/substrate/primitives/genesis-builder/Cargo.toml index b376055d605..886ddb4ffd3 100644 --- a/substrate/primitives/genesis-builder/Cargo.toml +++ b/substrate/primitives/genesis-builder/Cargo.toml @@ -19,7 +19,7 @@ targets = ["x86_64-unknown-linux-gnu"] sp-api = { path = "../api", default-features = false } sp-runtime = { path = "../runtime", default-features = false } sp-std = { path = "../std", default-features = false } -serde_json = { version = "1.0.108", default-features = false, features = ["alloc"] } +serde_json = { version = "1.0.110", default-features = false, features = ["alloc"] } [features] default = ["std"] diff --git a/substrate/primitives/merkle-mountain-range/Cargo.toml b/substrate/primitives/merkle-mountain-range/Cargo.toml index dec55a5c8f3..e6143ff6c42 100644 --- a/substrate/primitives/merkle-mountain-range/Cargo.toml +++ b/substrate/primitives/merkle-mountain-range/Cargo.toml @@ -19,7 +19,7 @@ codec = { package = "parity-scale-codec", version = "3.6.1", default-features = scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } log = { version = "0.4.17", default-features = false } mmr-lib = { package = "ckb-merkle-mountain-range", version = "0.5.2", default-features = false } -serde = { version = "1.0.193", features = ["alloc", "derive"], default-features = false, optional = true } +serde = { version = "1.0.194", features = ["alloc", "derive"], default-features = false, optional = true } sp-api = { path = "../api", default-features = false } sp-core = { path = "../core", default-features = false } sp-debug-derive = { path = "../debug-derive", default-features = false } diff --git a/substrate/primitives/npos-elections/Cargo.toml b/substrate/primitives/npos-elections/Cargo.toml index dcd03e7e5e0..04c4a475b7a 100644 --- a/substrate/primitives/npos-elections/Cargo.toml +++ b/substrate/primitives/npos-elections/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.193", default-features = false, features = ["alloc", "derive"], optional = true } +serde = { version = "1.0.194", default-features = false, features = ["alloc", "derive"], optional = true } sp-arithmetic = { path = "../arithmetic", default-features = false } sp-core = { path = "../core", default-features = false } sp-runtime = { path = "../runtime", default-features = false } diff --git a/substrate/primitives/npos-elections/fuzzer/Cargo.toml b/substrate/primitives/npos-elections/fuzzer/Cargo.toml index 37eaeea2b82..9ea80d5030e 100644 --- a/substrate/primitives/npos-elections/fuzzer/Cargo.toml +++ b/substrate/primitives/npos-elections/fuzzer/Cargo.toml @@ -17,7 +17,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -clap = { version = "4.4.11", features = ["derive"] } +clap = { version = "4.4.12", features = ["derive"] } honggfuzz = "0.5" rand = { version = "0.8", features = ["small_rng", "std"] } sp-npos-elections = { path = ".." } diff --git a/substrate/primitives/rpc/Cargo.toml b/substrate/primitives/rpc/Cargo.toml index a542b65cdc9..5ff2db981da 100644 --- a/substrate/primitives/rpc/Cargo.toml +++ b/substrate/primitives/rpc/Cargo.toml @@ -17,8 +17,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] rustc-hash = "1.1.0" -serde = { version = "1.0.193", features = ["derive"] } +serde = { version = "1.0.194", features = ["derive"] } sp-core = { path = "../core" } [dev-dependencies] -serde_json = "1.0.108" +serde_json = "1.0.110" diff --git a/substrate/primitives/runtime/Cargo.toml b/substrate/primitives/runtime/Cargo.toml index a95efbd6ddd..988a98a2df0 100644 --- a/substrate/primitives/runtime/Cargo.toml +++ b/substrate/primitives/runtime/Cargo.toml @@ -25,7 +25,7 @@ log = { version = "0.4.17", default-features = false } paste = "1.0" rand = { version = "0.8.5", optional = true } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.193", default-features = false, features = ["alloc", "derive"], optional = true } +serde = { version = "1.0.194", default-features = false, features = ["alloc", "derive"], optional = true } sp-application-crypto = { path = "../application-crypto", default-features = false } sp-arithmetic = { path = "../arithmetic", default-features = false } sp-core = { path = "../core", default-features = false } @@ -38,7 +38,7 @@ simple-mermaid = { git = "https://github.com/kianenigma/simple-mermaid.git", rev [dev-dependencies] rand = "0.8.5" -serde_json = "1.0.108" +serde_json = "1.0.110" zstd = { version = "0.12.4", default-features = false } sp-api = { path = "../api" } sp-state-machine = { path = "../state-machine" } diff --git a/substrate/primitives/staking/Cargo.toml b/substrate/primitives/staking/Cargo.toml index 2c721265142..c10dd00a730 100644 --- a/substrate/primitives/staking/Cargo.toml +++ b/substrate/primitives/staking/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -serde = { version = "1.0.193", default-features = false, features = ["alloc", "derive"], optional = true } +serde = { version = "1.0.194", default-features = false, features = ["alloc", "derive"], optional = true } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } impl-trait-for-tuples = "0.2.2" diff --git a/substrate/primitives/storage/Cargo.toml b/substrate/primitives/storage/Cargo.toml index 429c17fde50..1689c874aba 100644 --- a/substrate/primitives/storage/Cargo.toml +++ b/substrate/primitives/storage/Cargo.toml @@ -20,7 +20,7 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } impl-serde = { version = "0.4.0", optional = true, default-features = false } ref-cast = "1.0.0" -serde = { version = "1.0.193", default-features = false, features = ["alloc", "derive"], optional = true } +serde = { version = "1.0.194", default-features = false, features = ["alloc", "derive"], optional = true } sp-debug-derive = { path = "../debug-derive", default-features = false } sp-std = { path = "../std", default-features = false } diff --git a/substrate/primitives/test-primitives/Cargo.toml b/substrate/primitives/test-primitives/Cargo.toml index 536cca334dd..48aa27a68b2 100644 --- a/substrate/primitives/test-primitives/Cargo.toml +++ b/substrate/primitives/test-primitives/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.193", default-features = false, features = ["derive"], optional = true } +serde = { version = "1.0.194", default-features = false, features = ["derive"], optional = true } sp-application-crypto = { path = "../application-crypto", default-features = false } sp-core = { path = "../core", default-features = false } sp-runtime = { path = "../runtime", default-features = false } diff --git a/substrate/primitives/version/Cargo.toml b/substrate/primitives/version/Cargo.toml index ed056f7ac36..8d49d974d83 100644 --- a/substrate/primitives/version/Cargo.toml +++ b/substrate/primitives/version/Cargo.toml @@ -21,7 +21,7 @@ codec = { package = "parity-scale-codec", version = "3.6.1", default-features = impl-serde = { version = "0.4.0", default-features = false, optional = true } parity-wasm = { version = "0.45", optional = true } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.193", default-features = false, features = ["alloc", "derive"], optional = true } +serde = { version = "1.0.194", default-features = false, features = ["alloc", "derive"], optional = true } thiserror = { version = "1.0.48", optional = true } sp-core-hashing-proc-macro = { path = "../core/hashing/proc-macro" } sp-runtime = { path = "../runtime", default-features = false } diff --git a/substrate/primitives/weights/Cargo.toml b/substrate/primitives/weights/Cargo.toml index c01e1a5a07f..45c15fb3b9b 100644 --- a/substrate/primitives/weights/Cargo.toml +++ b/substrate/primitives/weights/Cargo.toml @@ -19,7 +19,7 @@ targets = ["x86_64-unknown-linux-gnu"] bounded-collections = { version = "0.1.4", default-features = false } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.193", default-features = false, optional = true, features = ["alloc", "derive"] } +serde = { version = "1.0.194", default-features = false, optional = true, features = ["alloc", "derive"] } smallvec = "1.11.0" sp-arithmetic = { path = "../arithmetic", default-features = false } sp-debug-derive = { path = "../debug-derive", default-features = false } diff --git a/substrate/scripts/ci/node-template-release/Cargo.toml b/substrate/scripts/ci/node-template-release/Cargo.toml index ca9759d5963..7ca84c17005 100644 --- a/substrate/scripts/ci/node-template-release/Cargo.toml +++ b/substrate/scripts/ci/node-template-release/Cargo.toml @@ -14,7 +14,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -clap = { version = "4.4.11", features = ["derive"] } +clap = { version = "4.4.12", features = ["derive"] } flate2 = "1.0" fs_extra = "1.3" glob = "0.3" diff --git a/substrate/test-utils/client/Cargo.toml b/substrate/test-utils/client/Cargo.toml index 2e343f4155b..71f2c6a136e 100644 --- a/substrate/test-utils/client/Cargo.toml +++ b/substrate/test-utils/client/Cargo.toml @@ -20,8 +20,8 @@ array-bytes = "6.1" async-trait = "0.1.74" codec = { package = "parity-scale-codec", version = "3.6.1" } futures = "0.3.21" -serde = "1.0.193" -serde_json = "1.0.108" +serde = "1.0.194" +serde_json = "1.0.110" sc-client-api = { path = "../../client/api" } sc-client-db = { path = "../../client/db", default-features = false, features = [ "test-helpers", diff --git a/substrate/test-utils/runtime/Cargo.toml b/substrate/test-utils/runtime/Cargo.toml index 881a77f1f92..294d3b7aa62 100644 --- a/substrate/test-utils/runtime/Cargo.toml +++ b/substrate/test-utils/runtime/Cargo.toml @@ -61,8 +61,8 @@ sp-consensus = { path = "../../primitives/consensus/common" } substrate-test-runtime-client = { path = "client" } sp-tracing = { path = "../../primitives/tracing" } json-patch = { version = "1.0.0", default-features = false } -serde = { version = "1.0.193", features = ["alloc", "derive"], default-features = false } -serde_json = { version = "1.0.108", default-features = false, features = ["alloc"] } +serde = { version = "1.0.194", features = ["alloc", "derive"], default-features = false } +serde_json = { version = "1.0.110", default-features = false, features = ["alloc"] } [build-dependencies] substrate-wasm-builder = { path = "../../utils/wasm-builder", optional = true } diff --git a/substrate/utils/frame/benchmarking-cli/Cargo.toml b/substrate/utils/frame/benchmarking-cli/Cargo.toml index b9495fa46c2..aea4789b82f 100644 --- a/substrate/utils/frame/benchmarking-cli/Cargo.toml +++ b/substrate/utils/frame/benchmarking-cli/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] array-bytes = "6.1" chrono = "0.4" -clap = { version = "4.4.11", features = ["derive"] } +clap = { version = "4.4.12", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.6.1" } comfy-table = { version = "7.0.1", default-features = false } handlebars = "4.2.2" @@ -29,8 +29,8 @@ linked-hash-map = "0.5.4" log = "0.4.17" rand = { version = "0.8.5", features = ["small_rng"] } rand_pcg = "0.3.1" -serde = "1.0.193" -serde_json = "1.0.108" +serde = "1.0.194" +serde_json = "1.0.110" thiserror = "1.0.48" thousands = "0.2.0" frame-benchmarking = { path = "../../../frame/benchmarking" } diff --git a/substrate/utils/frame/frame-utilities-cli/Cargo.toml b/substrate/utils/frame/frame-utilities-cli/Cargo.toml index 7e0c0241947..d6297f890a4 100644 --- a/substrate/utils/frame/frame-utilities-cli/Cargo.toml +++ b/substrate/utils/frame/frame-utilities-cli/Cargo.toml @@ -14,7 +14,7 @@ readme = "README.md" workspace = true [dependencies] -clap = { version = "4.4.11", features = ["derive"] } +clap = { version = "4.4.12", features = ["derive"] } frame-support = { path = "../../../frame/support" } frame-system = { path = "../../../frame/system" } sc-cli = { path = "../../../client/cli" } diff --git a/substrate/utils/frame/generate-bags/node-runtime/Cargo.toml b/substrate/utils/frame/generate-bags/node-runtime/Cargo.toml index 4614caa7f7b..747f25fecec 100644 --- a/substrate/utils/frame/generate-bags/node-runtime/Cargo.toml +++ b/substrate/utils/frame/generate-bags/node-runtime/Cargo.toml @@ -17,4 +17,4 @@ kitchensink-runtime = { path = "../../../../bin/node/runtime" } generate-bags = { path = ".." } # third-party -clap = { version = "4.4.11", features = ["derive"] } +clap = { version = "4.4.12", features = ["derive"] } diff --git a/substrate/utils/frame/remote-externalities/Cargo.toml b/substrate/utils/frame/remote-externalities/Cargo.toml index bd5a51eeec6..c7af146fc3d 100644 --- a/substrate/utils/frame/remote-externalities/Cargo.toml +++ b/substrate/utils/frame/remote-externalities/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] jsonrpsee = { version = "0.16.2", features = ["http-client"] } codec = { package = "parity-scale-codec", version = "3.6.1" } log = "0.4.17" -serde = "1.0.193" +serde = "1.0.194" sp-core = { path = "../../../primitives/core" } sp-state-machine = { path = "../../../primitives/state-machine" } sp-io = { path = "../../../primitives/io" } diff --git a/substrate/utils/frame/rpc/state-trie-migration-rpc/Cargo.toml b/substrate/utils/frame/rpc/state-trie-migration-rpc/Cargo.toml index 368273d609f..c387bc47842 100644 --- a/substrate/utils/frame/rpc/state-trie-migration-rpc/Cargo.toml +++ b/substrate/utils/frame/rpc/state-trie-migration-rpc/Cargo.toml @@ -32,4 +32,4 @@ sc-rpc-api = { path = "../../../../client/rpc-api" } sp-runtime = { path = "../../../../primitives/runtime" } [dev-dependencies] -serde_json = "1.0.108" +serde_json = "1.0.110" diff --git a/substrate/utils/frame/try-runtime/cli/Cargo.toml b/substrate/utils/frame/try-runtime/cli/Cargo.toml index e7ae9a6d3db..f90cdd1af8e 100644 --- a/substrate/utils/frame/try-runtime/cli/Cargo.toml +++ b/substrate/utils/frame/try-runtime/cli/Cargo.toml @@ -38,12 +38,12 @@ frame-try-runtime = { path = "../../../../frame/try-runtime", optional = true } substrate-rpc-client = { path = "../../rpc/client" } async-trait = "0.1.74" -clap = { version = "4.4.11", features = ["derive"] } +clap = { version = "4.4.12", features = ["derive"] } hex = { version = "0.4.3", default-features = false } log = "0.4.17" parity-scale-codec = "3.6.1" -serde = "1.0.193" -serde_json = "1.0.108" +serde = "1.0.194" +serde_json = "1.0.110" zstd = { version = "0.12.4", default-features = false } [dev-dependencies] -- GitLab From 924089ff33e35739a21fa57f294297b01e617c00 Mon Sep 17 00:00:00 2001 From: Lauro Gripa Date: Thu, 4 Jan 2024 08:37:34 -0300 Subject: [PATCH 108/191] Fix vote weights of ranked members in the Society pallet (#2758) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR fixes a bug in the tally accrual of approvals/rejections for Candidates and Defender. The issue happened because: - The `match maybe_old` is reducing `weight` from the tally: ``` Some(Vote { approve: true, weight }) => tally.approvals.saturating_reduce(weight), Some(Vote { approve: false, weight }) => tally.rejections.saturating_reduce(weight), ``` - But `match approval` is accruing only `1` to the tally: ``` true => tally.approvals.saturating_accrue(1), false => tally.rejections.saturating_accrue(1), ``` This way, if a member is rank 1 his vote is going to have weight 1 when accruing but weight 4 when reducing from the tally. For example, let's say: - There's a Candidate with 0 approvals and 12 rejections; - A ranked Member votes against the Candidate; - The tally changes to 0 approvals and 13 rejections (should be 16); - The Member changes his vote to an approval; - Now tally changes to 1 approvals and 9 rejections, removing the accrued approvals from other Members; - If the Member keeps changing his vote, it wipes the tally clean. So this PR changes `match approval` to accrue `weight` instead of just `1` and changes the tests: - Fixes `challenges_work`. This test started failing after the fix. The reason is that the test assumes that all Members have equal weights to their votes, but Member 10 is ranked, so his vote should have weight 4 against the Defender. So instead of using Member 10, I added Member 50 of rank 0 to keep the same logic; - Improves `votes_are_working`. Added some assertions to check if the tally is correct even after a ranked Member changes his vote a couple times; - Fixes `waive_repay_works`. Unrelated to the bug, but this test was yielding a false positive. The test is ranking up Member 20, but asserting the rank of Member 10, which is already ranked up. --------- Co-authored-by: Bastian Köcher Co-authored-by: command-bot <> --- prdoc/pr_2758.prdoc | 10 ++++ substrate/frame/society/src/lib.rs | 4 +- substrate/frame/society/src/tests.rs | 83 +++++++++++++++++++--------- 3 files changed, 68 insertions(+), 29 deletions(-) create mode 100644 prdoc/pr_2758.prdoc diff --git a/prdoc/pr_2758.prdoc b/prdoc/pr_2758.prdoc new file mode 100644 index 00000000000..d8cb0557e9b --- /dev/null +++ b/prdoc/pr_2758.prdoc @@ -0,0 +1,10 @@ +title: Fix vote weights of ranked members in the Society pallet + +doc: + - audience: Runtime User + description: | + Fixes a bug in the tally accrual of approvals/rejections when + ranked members vote for Candidates and Defender in the Society pallet. + +crates: + - name: pallet-society diff --git a/substrate/frame/society/src/lib.rs b/substrate/frame/society/src/lib.rs index ca8d96e193c..99dd580a403 100644 --- a/substrate/frame/society/src/lib.rs +++ b/substrate/frame/society/src/lib.rs @@ -1433,8 +1433,8 @@ impl, I: 'static> Pallet { let weight_root = rank + 1; let weight = weight_root * weight_root; match approve { - true => tally.approvals.saturating_accrue(1), - false => tally.rejections.saturating_accrue(1), + true => tally.approvals.saturating_accrue(weight), + false => tally.rejections.saturating_accrue(weight), } Vote { approve, weight } } diff --git a/substrate/frame/society/src/tests.rs b/substrate/frame/society/src/tests.rs index ea2afef3b32..2163575a860 100644 --- a/substrate/frame/society/src/tests.rs +++ b/substrate/frame/society/src/tests.rs @@ -720,7 +720,7 @@ fn unvouch_works() { // But their pick doesn't resign (yet). conclude_intake(false, None); // Voting still happening and voucher cannot unvouch. - assert_eq!(candidacies(), vec![(20, candidacy(1, 100, Vouch(10, 0), 0, 1))]); + assert_eq!(candidacies(), vec![(20, candidacy(1, 100, Vouch(10, 0), 0, 4))]); assert_eq!(Members::::get(10).unwrap().vouching, Some(VouchingStatus::Vouching)); // Candidate gives in and resigns. @@ -836,72 +836,72 @@ fn founder_and_head_cannot_be_removed() { fn challenges_work() { EnvBuilder::new().execute(|| { // Add some members - place_members([20, 30, 40]); + place_members([20, 30, 40, 50]); // Votes are empty - assert_eq!(DefenderVotes::::get(0, 10), None); assert_eq!(DefenderVotes::::get(0, 20), None); assert_eq!(DefenderVotes::::get(0, 30), None); assert_eq!(DefenderVotes::::get(0, 40), None); + assert_eq!(DefenderVotes::::get(0, 50), None); // Check starting point - assert_eq!(members(), vec![10, 20, 30, 40]); + assert_eq!(members(), vec![10, 20, 30, 40, 50]); assert_eq!(Defending::::get(), None); - // 30 will be challenged during the challenge rotation + // 40 will be challenged during the challenge rotation next_challenge(); - assert_eq!(Defending::::get().unwrap().0, 30); + assert_eq!(Defending::::get().unwrap().0, 40); // They can always free vote for themselves - assert_ok!(Society::defender_vote(Origin::signed(30), true)); + assert_ok!(Society::defender_vote(Origin::signed(40), true)); // If no one else votes, nothing happens next_challenge(); - assert_eq!(members(), vec![10, 20, 30, 40]); + assert_eq!(members(), vec![10, 20, 30, 40, 50]); // Reset votes for last challenge assert_ok!(Society::cleanup_challenge(Origin::signed(0), 0, 10)); - // New challenge period - assert_eq!(Defending::::get().unwrap().0, 30); + // New challenge period, 20 is challenged + assert_eq!(Defending::::get().unwrap().0, 20); // Non-member cannot vote assert_noop!(Society::defender_vote(Origin::signed(1), true), Error::::NotMember); // 3 people say accept, 1 reject - assert_ok!(Society::defender_vote(Origin::signed(10), true)); assert_ok!(Society::defender_vote(Origin::signed(20), true)); assert_ok!(Society::defender_vote(Origin::signed(30), true)); - assert_ok!(Society::defender_vote(Origin::signed(40), false)); + assert_ok!(Society::defender_vote(Origin::signed(40), true)); + assert_ok!(Society::defender_vote(Origin::signed(50), false)); next_challenge(); - // 30 survives - assert_eq!(members(), vec![10, 20, 30, 40]); + // 20 survives + assert_eq!(members(), vec![10, 20, 30, 40, 50]); // Reset votes for last challenge assert_ok!(Society::cleanup_challenge(Origin::signed(0), 1, 10)); // Votes are reset - assert_eq!(DefenderVotes::::get(0, 10), None); assert_eq!(DefenderVotes::::get(0, 20), None); assert_eq!(DefenderVotes::::get(0, 30), None); assert_eq!(DefenderVotes::::get(0, 40), None); + assert_eq!(DefenderVotes::::get(0, 50), None); - // One more time - assert_eq!(Defending::::get().unwrap().0, 30); + // One more time, 40 is challenged + assert_eq!(Defending::::get().unwrap().0, 40); // 2 people say accept, 2 reject - assert_ok!(Society::defender_vote(Origin::signed(10), true)); assert_ok!(Society::defender_vote(Origin::signed(20), true)); - assert_ok!(Society::defender_vote(Origin::signed(30), false)); + assert_ok!(Society::defender_vote(Origin::signed(30), true)); assert_ok!(Society::defender_vote(Origin::signed(40), false)); + assert_ok!(Society::defender_vote(Origin::signed(50), false)); next_challenge(); - // 30 is suspended - assert_eq!(members(), vec![10, 20, 40]); + // 40 is suspended + assert_eq!(members(), vec![10, 20, 30, 50]); assert_eq!( - SuspendedMembers::::get(30), - Some(MemberRecord { rank: 0, strikes: 0, vouching: None, index: 2 }) + SuspendedMembers::::get(40), + Some(MemberRecord { rank: 0, strikes: 0, vouching: None, index: 3 }) ); // Reset votes for last challenge assert_ok!(Society::cleanup_challenge(Origin::signed(0), 2, 10)); - // New defender is chosen - assert_eq!(Defending::::get().unwrap().0, 20); + // New defender is chosen, 30 is challenged + assert_eq!(Defending::::get().unwrap().0, 30); // Votes are reset - assert_eq!(DefenderVotes::::get(0, 10), None); assert_eq!(DefenderVotes::::get(0, 20), None); assert_eq!(DefenderVotes::::get(0, 30), None); assert_eq!(DefenderVotes::::get(0, 40), None); + assert_eq!(DefenderVotes::::get(0, 50), None); }); } @@ -1044,6 +1044,9 @@ fn vouching_handles_removed_member_with_candidate() { fn votes_are_working() { EnvBuilder::new().execute(|| { place_members([20]); + // Member 10 is rank 1 and Member 20 is rank 0 + assert_eq!(Members::::get(10).unwrap().rank, 1); + assert_eq!(Members::::get(20).unwrap().rank, 0); // Users make bids of various amounts assert_ok!(Society::bid(RuntimeOrigin::signed(50), 500)); assert_ok!(Society::bid(RuntimeOrigin::signed(40), 400)); @@ -1061,6 +1064,32 @@ fn votes_are_working() { assert_eq!(Votes::::get(30, 20), Some(Vote { approve: true, weight: 1 })); assert_eq!(Votes::::get(40, 10), Some(Vote { approve: true, weight: 4 })); assert_eq!(Votes::::get(50, 10), None); + + // Votes have correct weights on the tally + assert_eq!( + Candidates::::get(30).unwrap().tally, + Tally { approvals: 5, rejections: 0 } + ); + assert_eq!( + Candidates::::get(40).unwrap().tally, + Tally { approvals: 4, rejections: 0 } + ); + // Member 10 changes his vote for Candidate 30 + assert_ok!(Society::vote(Origin::signed(10), 30, false)); + // Assert the tally calculation is correct + assert_eq!( + Candidates::::get(30).unwrap().tally, + Tally { approvals: 1, rejections: 4 } + ); + // Member 10 changes his vote again + assert_ok!(Society::vote(Origin::signed(10), 30, true)); + // Assert the tally is still correct + assert_eq!( + Candidates::::get(30).unwrap().tally, + Tally { approvals: 5, rejections: 0 } + ); + + // Finish intake conclude_intake(false, None); // Cleanup the candidacy assert_ok!(Society::cleanup_candidacy(Origin::signed(0), 30, 10)); @@ -1240,7 +1269,7 @@ fn waive_repay_works() { Payouts::::get(20), PayoutRecord { paid: 0, payouts: vec![].try_into().unwrap() } ); - assert_eq!(Members::::get(10).unwrap().rank, 1); + assert_eq!(Members::::get(20).unwrap().rank, 1); assert_eq!(Balances::free_balance(20), 50); }); } -- GitLab From 5b9e69d37d056f77a2585de1df8bfb624ce372b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Thu, 4 Jan 2024 13:25:07 +0100 Subject: [PATCH 109/191] Remove `dotgraph` feature (#2848) Apparently the implementation is broken and is generating warnings in the build. Not sure this was used any way by anyone. Closes: https://github.com/paritytech/polkadot-sdk/issues/2836 --- Cargo.lock | 12 ------------ polkadot/node/overseer/Cargo.toml | 1 - 2 files changed, 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 966b1820fff..dadfd97ed79 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7165,15 +7165,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "layout-rs" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1164ef87cb9607c2d887216eca79f0fc92895affe1789bba805dd38d829584e0" -dependencies = [ - "log", -] - [[package]] name = "lazy_static" version = "1.4.0" @@ -8983,12 +8974,9 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d035b1f968d91a826f2e34a9d6d02cb2af5aa7ca39ebd27922d850ab4b2dd2c6" dependencies = [ - "anyhow", "expander 2.0.0", - "fs-err", "indexmap 2.0.0", "itertools 0.11.0", - "layout-rs", "petgraph", "proc-macro-crate 1.3.1", "proc-macro2", diff --git a/polkadot/node/overseer/Cargo.toml b/polkadot/node/overseer/Cargo.toml index 40df8d3514a..132a2ed4832 100644 --- a/polkadot/node/overseer/Cargo.toml +++ b/polkadot/node/overseer/Cargo.toml @@ -40,7 +40,6 @@ tikv-jemalloc-ctl = "0.5.0" [features] default = ["futures_channel"] -dotgraph = ["orchestra/dotgraph"] expand = ["orchestra/expand"] futures_channel = ["metered/futures_channel", "orchestra/futures_channel"] jemalloc-allocator = ["dep:tikv-jemalloc-ctl"] -- GitLab From b0a8746aec3a2fbd48bccf1d84eb0d88979a8150 Mon Sep 17 00:00:00 2001 From: ordian Date: Thu, 4 Jan 2024 13:59:12 +0100 Subject: [PATCH 110/191] malus: add new variant SupportDisabled (#2835) This variant pretends that nobody is disabled onchain. --- polkadot/node/malus/src/malus.rs | 7 ++ polkadot/node/malus/src/variants/mod.rs | 2 + .../malus/src/variants/support_disabled.rs | 98 +++++++++++++++++++ prdoc/pr_2835.prdoc | 9 ++ 4 files changed, 116 insertions(+) create mode 100644 polkadot/node/malus/src/variants/support_disabled.rs create mode 100644 prdoc/pr_2835.prdoc diff --git a/polkadot/node/malus/src/malus.rs b/polkadot/node/malus/src/malus.rs index b8a83e54d4f..7a9e320e273 100644 --- a/polkadot/node/malus/src/malus.rs +++ b/polkadot/node/malus/src/malus.rs @@ -32,6 +32,8 @@ use variants::*; enum NemesisVariant { /// Suggest a candidate with an invalid proof of validity. SuggestGarbageCandidate(SuggestGarbageCandidateOptions), + /// Support disabled validators in backing and statement distribution. + SupportDisabled(SupportDisabledOptions), /// Back a candidate with a specifically crafted proof of validity. BackGarbageCandidate(BackGarbageCandidateOptions), /// Delayed disputing of ancestors that are perfectly fine. @@ -68,6 +70,11 @@ impl MalusCli { finality_delay, )? }, + NemesisVariant::SupportDisabled(opts) => { + let SupportDisabledOptions { cli } = opts; + + polkadot_cli::run_node(cli, SupportDisabled, finality_delay)? + }, NemesisVariant::DisputeAncestor(opts) => { let DisputeAncestorOptions { fake_validation, diff --git a/polkadot/node/malus/src/variants/mod.rs b/polkadot/node/malus/src/variants/mod.rs index bb4971c145c..3ca1bf4b469 100644 --- a/polkadot/node/malus/src/variants/mod.rs +++ b/polkadot/node/malus/src/variants/mod.rs @@ -21,11 +21,13 @@ mod common; mod dispute_finalized_candidates; mod dispute_valid_candidates; mod suggest_garbage_candidate; +mod support_disabled; pub(crate) use self::{ back_garbage_candidate::{BackGarbageCandidateOptions, BackGarbageCandidates}, dispute_finalized_candidates::{DisputeFinalizedCandidates, DisputeFinalizedCandidatesOptions}, dispute_valid_candidates::{DisputeAncestorOptions, DisputeValidCandidates}, suggest_garbage_candidate::{SuggestGarbageCandidateOptions, SuggestGarbageCandidates}, + support_disabled::{SupportDisabled, SupportDisabledOptions}, }; pub(crate) use common::*; diff --git a/polkadot/node/malus/src/variants/support_disabled.rs b/polkadot/node/malus/src/variants/support_disabled.rs new file mode 100644 index 00000000000..5fb53be7774 --- /dev/null +++ b/polkadot/node/malus/src/variants/support_disabled.rs @@ -0,0 +1,98 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! This variant of Malus overrides the `disabled_validators` runtime API +//! to always return an empty set of disabled validators. + +use polkadot_cli::{ + prepared_overseer_builder, + service::{ + AuthorityDiscoveryApi, AuxStore, BabeApi, Block, Error, HeaderBackend, Overseer, + OverseerConnector, OverseerGen, OverseerGenArgs, OverseerHandle, ParachainHost, + ProvideRuntimeApi, + }, + Cli, +}; +use polkadot_node_subsystem::SpawnGlue; +use polkadot_node_subsystem_types::DefaultSubsystemClient; +use sp_core::traits::SpawnNamed; + +use crate::interceptor::*; + +use std::sync::Arc; + +#[derive(Debug, clap::Parser)] +#[clap(rename_all = "kebab-case")] +#[allow(missing_docs)] +pub struct SupportDisabledOptions { + #[clap(flatten)] + pub cli: Cli, +} + +/// Generates an overseer with a custom runtime API subsystem. +pub(crate) struct SupportDisabled; + +impl OverseerGen for SupportDisabled { + fn generate( + &self, + connector: OverseerConnector, + args: OverseerGenArgs<'_, Spawner, RuntimeClient>, + ) -> Result< + (Overseer, Arc>>, OverseerHandle), + Error, + > + where + RuntimeClient: 'static + ProvideRuntimeApi + HeaderBackend + AuxStore, + RuntimeClient::Api: ParachainHost + BabeApi + AuthorityDiscoveryApi, + Spawner: 'static + SpawnNamed + Clone + Unpin, + { + prepared_overseer_builder(args)? + .replace_runtime_api(move |ra_subsystem| { + InterceptedSubsystem::new(ra_subsystem, IgnoreDisabled) + }) + .build_with_connector(connector) + .map_err(|e| e.into()) + } +} + +#[derive(Clone)] +struct IgnoreDisabled; + +impl MessageInterceptor for IgnoreDisabled +where + Sender: overseer::RuntimeApiSenderTrait + Clone + Send + 'static, +{ + type Message = RuntimeApiMessage; + + /// Intercept incoming runtime api requests. + fn intercept_incoming( + &self, + _subsystem_sender: &mut Sender, + msg: FromOrchestra, + ) -> Option> { + match msg { + FromOrchestra::Communication { + msg: + RuntimeApiMessage::Request(_relay_parent, RuntimeApiRequest::DisabledValidators(tx)), + } => { + let _ = tx.send(Ok(Vec::new())); + None + }, + FromOrchestra::Communication { msg } => Some(FromOrchestra::Communication { msg }), + FromOrchestra::Signal(signal) => Some(FromOrchestra::Signal(signal)), + } + } +} diff --git a/prdoc/pr_2835.prdoc b/prdoc/pr_2835.prdoc new file mode 100644 index 00000000000..037e9b8ec77 --- /dev/null +++ b/prdoc/pr_2835.prdoc @@ -0,0 +1,9 @@ +title: New malus variant `support-disabled` + +doc: + - audience: Node Dev + description: | + A new malicious flavor added to pretend that nobody + is disabled onchain. + +crates: [ ] -- GitLab From 6f9b1f61ec759723bb8e86ae6db60c94841cf4c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=B3nal=20Murray?= Date: Thu, 4 Jan 2024 13:57:35 +0000 Subject: [PATCH 111/191] Remove kusama and polkadot SP constants from parachains-common (#2666) --- cumulus/parachains/common/src/kusama.rs | 122 --------------- cumulus/parachains/common/src/lib.rs | 2 - cumulus/parachains/common/src/polkadot.rs | 144 ------------------ .../people/people-rococo/src/people.rs | 2 +- .../people/people-westend/src/people.rs | 2 +- prdoc/pr_2666.prdoc | 14 ++ 6 files changed, 16 insertions(+), 270 deletions(-) delete mode 100644 cumulus/parachains/common/src/kusama.rs delete mode 100644 cumulus/parachains/common/src/polkadot.rs create mode 100644 prdoc/pr_2666.prdoc diff --git a/cumulus/parachains/common/src/kusama.rs b/cumulus/parachains/common/src/kusama.rs deleted file mode 100644 index 073971a7075..00000000000 --- a/cumulus/parachains/common/src/kusama.rs +++ /dev/null @@ -1,122 +0,0 @@ -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/// Consensus-related. -pub mod consensus { - /// Maximum number of blocks simultaneously accepted by the Runtime, not yet included - /// into the relay chain. - pub const UNINCLUDED_SEGMENT_CAPACITY: u32 = 1; - /// How many parachain blocks are processed by the relay chain per parent. Limits the - /// number of blocks authored per slot. - pub const BLOCK_PROCESSING_VELOCITY: u32 = 1; - /// Relay chain slot duration, in milliseconds. - pub const RELAY_CHAIN_SLOT_DURATION_MILLIS: u32 = 6000; -} - -/// Constants relating to KSM. -pub mod currency { - use polkadot_core_primitives::Balance; - - /// The existential deposit. Set to 1/10 of its parent Relay Chain. - pub const EXISTENTIAL_DEPOSIT: Balance = 1 * CENTS / 10; - - pub const UNITS: Balance = 1_000_000_000_000; - pub const QUID: Balance = UNITS / 30; - pub const CENTS: Balance = QUID / 100; - pub const GRAND: Balance = QUID * 1_000; - pub const MILLICENTS: Balance = CENTS / 1_000; - - pub const fn deposit(items: u32, bytes: u32) -> Balance { - // map to 1/100 of what the kusama relay chain charges (v9020) - (items as Balance * 2_000 * CENTS + (bytes as Balance) * 100 * MILLICENTS) / 100 - } -} - -/// Constants related to Kusama fee payment. -pub mod fee { - use frame_support::{ - pallet_prelude::Weight, - weights::{ - constants::ExtrinsicBaseWeight, FeePolynomial, WeightToFeeCoefficient, - WeightToFeeCoefficients, WeightToFeePolynomial, - }, - }; - use polkadot_core_primitives::Balance; - use smallvec::smallvec; - pub use sp_runtime::Perbill; - - /// The block saturation level. Fees will be updates based on this value. - pub const TARGET_BLOCK_FULLNESS: Perbill = Perbill::from_percent(25); - - /// Handles converting a weight scalar to a fee value, based on the scale and granularity of the - /// node's balance type. - /// - /// This should typically create a mapping between the following ranges: - /// - [0, MAXIMUM_BLOCK_WEIGHT] - /// - [Balance::min, Balance::max] - /// - /// Yet, it can be used for any other sort of change to weight-fee. Some examples being: - /// - Setting it to `0` will essentially disable the weight fee. - /// - Setting it to `1` will cause the literal `#[weight = x]` values to be charged. - pub struct WeightToFee; - impl frame_support::weights::WeightToFee for WeightToFee { - type Balance = Balance; - - fn weight_to_fee(weight: &Weight) -> Self::Balance { - let time_poly: FeePolynomial = RefTimeToFee::polynomial().into(); - let proof_poly: FeePolynomial = ProofSizeToFee::polynomial().into(); - - // Take the maximum instead of the sum to charge by the more scarce resource. - time_poly.eval(weight.ref_time()).max(proof_poly.eval(weight.proof_size())) - } - } - - /// Maps the reference time component of `Weight` to a fee. - pub struct RefTimeToFee; - impl WeightToFeePolynomial for RefTimeToFee { - type Balance = Balance; - fn polynomial() -> WeightToFeeCoefficients { - // In Kusama, extrinsic base weight (smallest non-zero weight) is mapped to 1/10 CENT: - // The standard system parachain configuration is 1/10 of that, as in 1/100 CENT. - let p = super::currency::CENTS; - let q = 100 * Balance::from(ExtrinsicBaseWeight::get().ref_time()); - - smallvec![WeightToFeeCoefficient { - degree: 1, - negative: false, - coeff_frac: Perbill::from_rational(p % q, q), - coeff_integer: p / q, - }] - } - } - - /// Maps the proof size component of `Weight` to a fee. - pub struct ProofSizeToFee; - impl WeightToFeePolynomial for ProofSizeToFee { - type Balance = Balance; - fn polynomial() -> WeightToFeeCoefficients { - // Map 10kb proof to 1 CENT. - let p = super::currency::CENTS; - let q = 10_000; - - smallvec![WeightToFeeCoefficient { - degree: 1, - negative: false, - coeff_frac: Perbill::from_rational(p % q, q), - coeff_integer: p / q, - }] - } - } -} diff --git a/cumulus/parachains/common/src/lib.rs b/cumulus/parachains/common/src/lib.rs index 68425a00b35..eab5d7f4577 100644 --- a/cumulus/parachains/common/src/lib.rs +++ b/cumulus/parachains/common/src/lib.rs @@ -16,9 +16,7 @@ #![cfg_attr(not(feature = "std"), no_std)] pub mod impls; -pub mod kusama; pub mod message_queue; -pub mod polkadot; pub mod rococo; pub mod westend; pub mod wococo; diff --git a/cumulus/parachains/common/src/polkadot.rs b/cumulus/parachains/common/src/polkadot.rs deleted file mode 100644 index 48b502b9888..00000000000 --- a/cumulus/parachains/common/src/polkadot.rs +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: Apache-2.0 - -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -/// Universally recognized accounts. -pub mod account { - use frame_support::PalletId; - - /// Polkadot treasury pallet id, used to convert into AccountId - pub const POLKADOT_TREASURY_PALLET_ID: PalletId = PalletId(*b"py/trsry"); - /// Alliance pallet ID. - /// Used as a temporary place to deposit a slashed imbalance before teleporting to the Treasury. - pub const ALLIANCE_PALLET_ID: PalletId = PalletId(*b"py/allia"); - /// Referenda pallet ID. - /// Used as a temporary place to deposit a slashed imbalance before teleporting to the Treasury. - pub const REFERENDA_PALLET_ID: PalletId = PalletId(*b"py/refer"); - /// Ambassador Referenda pallet ID. - /// Used as a temporary place to deposit a slashed imbalance before teleporting to the Treasury. - pub const AMBASSADOR_REFERENDA_PALLET_ID: PalletId = PalletId(*b"py/amref"); - /// Identity pallet ID. - /// Used as a temporary place to deposit a slashed imbalance before teleporting to the Treasury. - pub const IDENTITY_PALLET_ID: PalletId = PalletId(*b"py/ident"); - /// Fellowship treasury pallet ID - pub const FELLOWSHIP_TREASURY_PALLET_ID: PalletId = PalletId(*b"py/feltr"); -} - -/// Consensus-related. -pub mod consensus { - /// Maximum number of blocks simultaneously accepted by the Runtime, not yet included - /// into the relay chain. - pub const UNINCLUDED_SEGMENT_CAPACITY: u32 = 1; - /// How many parachain blocks are processed by the relay chain per parent. Limits the - /// number of blocks authored per slot. - pub const BLOCK_PROCESSING_VELOCITY: u32 = 1; - /// Relay chain slot duration, in milliseconds. - pub const RELAY_CHAIN_SLOT_DURATION_MILLIS: u32 = 6000; -} - -/// Constants relating to DOT. -pub mod currency { - use polkadot_core_primitives::Balance; - - /// The existential deposit. Set to 1/10 of its parent Relay Chain. - pub const EXISTENTIAL_DEPOSIT: Balance = 100 * CENTS / 10; - - pub const UNITS: Balance = 10_000_000_000; - pub const DOLLARS: Balance = UNITS; // 10_000_000_000 - pub const GRAND: Balance = DOLLARS * 1_000; // 10_000_000_000_000 - pub const CENTS: Balance = DOLLARS / 100; // 100_000_000 - pub const MILLICENTS: Balance = CENTS / 1_000; // 100_000 - - pub const fn deposit(items: u32, bytes: u32) -> Balance { - // 1/100 of Polkadot - (items as Balance * 20 * DOLLARS + (bytes as Balance) * 100 * MILLICENTS) / 100 - } -} - -/// Constants related to Polkadot fee payment. -pub mod fee { - use frame_support::{ - pallet_prelude::Weight, - weights::{ - constants::ExtrinsicBaseWeight, FeePolynomial, WeightToFeeCoefficient, - WeightToFeeCoefficients, WeightToFeePolynomial, - }, - }; - use polkadot_core_primitives::Balance; - use smallvec::smallvec; - pub use sp_runtime::Perbill; - - /// The block saturation level. Fees will be updates based on this value. - pub const TARGET_BLOCK_FULLNESS: Perbill = Perbill::from_percent(25); - - /// Handles converting a weight scalar to a fee value, based on the scale and granularity of the - /// node's balance type. - /// - /// This should typically create a mapping between the following ranges: - /// - [0, MAXIMUM_BLOCK_WEIGHT] - /// - [Balance::min, Balance::max] - /// - /// Yet, it can be used for any other sort of change to weight-fee. Some examples being: - /// - Setting it to `0` will essentially disable the weight fee. - /// - Setting it to `1` will cause the literal `#[weight = x]` values to be charged. - pub struct WeightToFee; - impl frame_support::weights::WeightToFee for WeightToFee { - type Balance = Balance; - - fn weight_to_fee(weight: &Weight) -> Self::Balance { - let time_poly: FeePolynomial = RefTimeToFee::polynomial().into(); - let proof_poly: FeePolynomial = ProofSizeToFee::polynomial().into(); - - // Take the maximum instead of the sum to charge by the more scarce resource. - time_poly.eval(weight.ref_time()).max(proof_poly.eval(weight.proof_size())) - } - } - - /// Maps the reference time component of `Weight` to a fee. - pub struct RefTimeToFee; - impl WeightToFeePolynomial for RefTimeToFee { - type Balance = Balance; - fn polynomial() -> WeightToFeeCoefficients { - // In Polkadot, extrinsic base weight (smallest non-zero weight) is mapped to 1/10 CENT: - // The standard system parachain configuration is 1/10 of that, as in 1/100 CENT. - let p = super::currency::CENTS; - let q = 100 * Balance::from(ExtrinsicBaseWeight::get().ref_time()); - - smallvec![WeightToFeeCoefficient { - degree: 1, - negative: false, - coeff_frac: Perbill::from_rational(p % q, q), - coeff_integer: p / q, - }] - } - } - - /// Maps the proof size component of `Weight` to a fee. - pub struct ProofSizeToFee; - impl WeightToFeePolynomial for ProofSizeToFee { - type Balance = Balance; - fn polynomial() -> WeightToFeeCoefficients { - // Map 10kb proof to 1 CENT. - let p = super::currency::CENTS; - let q = 10_000; - - smallvec![WeightToFeeCoefficient { - degree: 1, - negative: false, - coeff_frac: Perbill::from_rational(p % q, q), - coeff_integer: p / q, - }] - } - } -} diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/people.rs b/cumulus/parachains/runtimes/people/people-rococo/src/people.rs index 95b14a544d5..9ff249318d9 100644 --- a/cumulus/parachains/runtimes/people/people-rococo/src/people.rs +++ b/cumulus/parachains/runtimes/people/people-rococo/src/people.rs @@ -36,7 +36,7 @@ parameter_types! { pub const ByteDeposit: Balance = deposit(0, 1); pub const SubAccountDeposit: Balance = deposit(1, 53); pub RelayTreasuryAccount: AccountId = - parachains_common::polkadot::account::POLKADOT_TREASURY_PALLET_ID.into_account_truncating(); + parachains_common::TREASURY_PALLET_ID.into_account_truncating(); } impl pallet_identity::Config for Runtime { diff --git a/cumulus/parachains/runtimes/people/people-westend/src/people.rs b/cumulus/parachains/runtimes/people/people-westend/src/people.rs index 202e85bb62b..d279be65110 100644 --- a/cumulus/parachains/runtimes/people/people-westend/src/people.rs +++ b/cumulus/parachains/runtimes/people/people-westend/src/people.rs @@ -36,7 +36,7 @@ parameter_types! { pub const ByteDeposit: Balance = deposit(0, 1); pub const SubAccountDeposit: Balance = deposit(1, 53); pub RelayTreasuryAccount: AccountId = - parachains_common::polkadot::account::POLKADOT_TREASURY_PALLET_ID.into_account_truncating(); + parachains_common::TREASURY_PALLET_ID.into_account_truncating(); } impl pallet_identity::Config for Runtime { diff --git a/prdoc/pr_2666.prdoc b/prdoc/pr_2666.prdoc new file mode 100644 index 00000000000..d7fbbda5108 --- /dev/null +++ b/prdoc/pr_2666.prdoc @@ -0,0 +1,14 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Remove kusama and polkadot SP constants from parachains-common + +doc: + - audience: Runtime Dev + description: | + The constants for System Parachains in Kusama and Polkadot are now added to a new package in + the fellowship repo. This PR removes them from Polkadot-SDK. They are now accessible from the + `system-parachains-constants` package. + +crates: + - name: parachains-common -- GitLab From f82c297728373b9aa09893d15c2c8f9c01ba8cf3 Mon Sep 17 00:00:00 2001 From: PG Herveou Date: Thu, 4 Jan 2024 15:49:42 +0100 Subject: [PATCH 112/191] Contracts build risc-v fixtures (#2554) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Follow up from #2347 this time to verify that fixtures build to RISC-V --------- Co-authored-by: alvicsam Co-authored-by: Alexander Samusev <41779041+alvicsam@users.noreply.github.com> Co-authored-by: Alexander Theißen --- Cargo.lock | 126 ++++++-- Cargo.toml | 1 - substrate/frame/contracts/fixtures/Cargo.toml | 2 +- substrate/frame/contracts/fixtures/build.rs | 157 +++++++--- .../frame/contracts/fixtures/build/Cargo.toml | 18 ++ .../fixtures/build/riscv_memory_layout.ld | 4 + .../contracts/fixtures/contracts/call.rs | 2 + .../fixtures/contracts/common/Cargo.toml | 3 - .../contracts/fixtures/contracts/dummy.rs | 2 + substrate/frame/contracts/uapi/Cargo.toml | 8 +- substrate/frame/contracts/uapi/src/host.rs | 36 ++- .../frame/contracts/uapi/src/host/riscv32.rs | 293 ++++++++++++++++++ .../frame/contracts/uapi/src/host/wasm32.rs | 150 +++++---- substrate/frame/contracts/uapi/src/lib.rs | 3 +- 14 files changed, 651 insertions(+), 154 deletions(-) create mode 100644 substrate/frame/contracts/fixtures/build/Cargo.toml create mode 100644 substrate/frame/contracts/fixtures/build/riscv_memory_layout.ld diff --git a/Cargo.lock b/Cargo.lock index dadfd97ed79..64ccb3e4767 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -125,14 +125,15 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.3" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" dependencies = [ "cfg-if", "getrandom 0.2.10", "once_cell", "version_check", + "zerocopy", ] [[package]] @@ -1311,7 +1312,7 @@ dependencies = [ "cfg-if", "libc", "miniz_oxide", - "object 0.32.0", + "object 0.32.2", "rustc-demangle", ] @@ -4487,7 +4488,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edd72493923899c6f10c641bdbdeddc7183d6396641d99c1a0d1597f37f92e28" dependencies = [ "cfg-if", - "hashbrown 0.14.0", + "hashbrown 0.14.3", "lock_api", "once_cell", "parking_lot_core 0.9.8", @@ -4864,7 +4865,7 @@ checksum = "7d9ce6874da5d4415896cd45ffbc4d1cfc0c4f9c079427bd870742c30f2f65a9" dependencies = [ "curve25519-dalek 4.1.1", "ed25519", - "hashbrown 0.14.0", + "hashbrown 0.14.3", "hex", "rand_core 0.6.4", "sha2 0.10.7", @@ -5178,6 +5179,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" +[[package]] +name = "fallible-iterator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" + [[package]] name = "fastrand" version = "1.9.0" @@ -6107,7 +6114,7 @@ version = "0.27.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" dependencies = [ - "fallible-iterator", + "fallible-iterator 0.2.0", "indexmap 1.9.3", "stable_deref_trait", ] @@ -6117,6 +6124,10 @@ name = "gimli" version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +dependencies = [ + "fallible-iterator 0.3.0", + "stable_deref_trait", +] [[package]] name = "glob" @@ -6262,16 +6273,16 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash 0.8.3", + "ahash 0.8.7", ] [[package]] name = "hashbrown" -version = "0.14.0" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" dependencies = [ - "ahash 0.8.3", + "ahash 0.8.7", "allocator-api2", "serde", ] @@ -6282,7 +6293,7 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" dependencies = [ - "hashbrown 0.14.0", + "hashbrown 0.14.3", ] [[package]] @@ -6642,7 +6653,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" dependencies = [ "equivalent", - "hashbrown 0.14.0", + "hashbrown 0.14.3", ] [[package]] @@ -8899,9 +8910,9 @@ dependencies = [ [[package]] name = "object" -version = "0.32.0" +version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ac5bbd07aea88c60a577a1ce218075ffd59208b2d7ca97adf9bfc5aeb21ebe" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" dependencies = [ "memchr", ] @@ -9589,9 +9600,9 @@ name = "pallet-contracts-fixtures" version = "1.0.0" dependencies = [ "anyhow", - "cfg-if", "frame-system", "parity-wasm", + "polkavm-linker", "sp-runtime", "tempfile", "toml 0.8.2", @@ -9599,10 +9610,6 @@ dependencies = [ "wat", ] -[[package]] -name = "pallet-contracts-fixtures-common" -version = "1.0.0" - [[package]] name = "pallet-contracts-mock-network" version = "1.0.0" @@ -9657,6 +9664,7 @@ dependencies = [ "bitflags 1.3.2", "parity-scale-codec", "paste", + "polkavm-derive", "scale-info", ] @@ -13753,6 +13761,54 @@ dependencies = [ "westend-runtime", ] +[[package]] +name = "polkavm-common" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01363cf0a778e8d93eff31e8a03bc59992cba35faa419ea4f3e80146b69195ba" + +[[package]] +name = "polkavm-common" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88e869d66a254db6c7069992f240626416aba8e87d65c00e4be443135babfe82" + +[[package]] +name = "polkavm-derive" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26501292b2cb980cbeaac3304f0fc4480ff1bac2473045453d7333d775658b6a" +dependencies = [ + "polkavm-derive-impl", + "syn 2.0.47", +] + +[[package]] +name = "polkavm-derive-impl" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "903e16ad3ed768f35e6f40acff2e8aaf6afb9f2889b0a8982dd43dcbee29db2d" +dependencies = [ + "polkavm-common 0.2.0", + "proc-macro2", + "quote", + "syn 2.0.47", +] + +[[package]] +name = "polkavm-linker" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f8719d37effca6df1cecf5c816d84ab09b7d18e960511f61c254a7581fa50c3" +dependencies = [ + "gimli 0.28.0", + "hashbrown 0.14.3", + "log", + "object 0.32.2", + "polkavm-common 0.3.0", + "rustc-demangle", +] + [[package]] name = "polling" version = "2.8.0" @@ -15661,7 +15717,7 @@ dependencies = [ name = "sc-consensus-grandpa" version = "0.10.0-dev" dependencies = [ - "ahash 0.8.3", + "ahash 0.8.7", "array-bytes 6.1.0", "assert_matches", "async-trait", @@ -16045,7 +16101,7 @@ dependencies = [ name = "sc-network-gossip" version = "0.10.0-dev" dependencies = [ - "ahash 0.8.3", + "ahash 0.8.7", "async-trait", "futures", "futures-timer", @@ -16730,7 +16786,7 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "772575a524feeb803e5b0fcbc6dd9f367e579488197c94c6e4023aad2305774d" dependencies = [ - "ahash 0.8.3", + "ahash 0.8.7", "cfg-if", "hashbrown 0.13.2", ] @@ -17384,7 +17440,7 @@ dependencies = [ "fnv", "futures-lite", "futures-util", - "hashbrown 0.14.0", + "hashbrown 0.14.3", "hex", "hmac 0.12.1", "itertools 0.11.0", @@ -17433,7 +17489,7 @@ dependencies = [ "futures-channel", "futures-lite", "futures-util", - "hashbrown 0.14.0", + "hashbrown 0.14.3", "hex", "itertools 0.11.0", "log", @@ -18807,7 +18863,7 @@ dependencies = [ name = "sp-trie" version = "22.0.0" dependencies = [ - "ahash 0.8.3", + "ahash 0.8.7", "array-bytes 6.1.0", "criterion 0.4.0", "hash-db", @@ -22003,6 +22059,26 @@ dependencies = [ "time", ] +[[package]] +name = "zerocopy" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.47", +] + [[package]] name = "zeroize" version = "1.6.0" diff --git a/Cargo.toml b/Cargo.toml index 55958b0d83e..a1983a5efd5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -310,7 +310,6 @@ members = [ "substrate/frame/collective", "substrate/frame/contracts", "substrate/frame/contracts/fixtures", - "substrate/frame/contracts/fixtures/contracts/common", "substrate/frame/contracts/mock-network", "substrate/frame/contracts/proc-macro", "substrate/frame/contracts/uapi", diff --git a/substrate/frame/contracts/fixtures/Cargo.toml b/substrate/frame/contracts/fixtures/Cargo.toml index 97606479f25..565adc6f6e8 100644 --- a/substrate/frame/contracts/fixtures/Cargo.toml +++ b/substrate/frame/contracts/fixtures/Cargo.toml @@ -21,5 +21,5 @@ parity-wasm = "0.45.0" tempfile = "3.8.1" toml = "0.8.2" twox-hash = "1.6.3" +polkavm-linker = "0.3.0" anyhow = "1.0.0" -cfg-if = { version = "1.0", default-features = false } diff --git a/substrate/frame/contracts/fixtures/build.rs b/substrate/frame/contracts/fixtures/build.rs index 49deb94a7fa..de95d199b44 100644 --- a/substrate/frame/contracts/fixtures/build.rs +++ b/substrate/frame/contracts/fixtures/build.rs @@ -16,7 +16,7 @@ // limitations under the License. //! Compile contracts to wasm and RISC-V binaries. -use anyhow::Result; +use anyhow::{bail, format_err, Context, Result}; use parity_wasm::elements::{deserialize_file, serialize_to_file, Internal}; use std::{ env, fs, @@ -65,16 +65,41 @@ impl Entry { .expect("name is valid unicode; qed") } + /// Return whether the contract has already been compiled. + fn is_cached(&self, out_dir: &Path) -> bool { + out_dir.join(self.name()).join(&self.hash).exists() + } + + /// Update the cache file for the contract. + fn update_cache(&self, out_dir: &Path) -> Result<()> { + let cache_dir = out_dir.join(self.name()); + + // clear the cache dir if it exists + if cache_dir.exists() { + fs::remove_dir_all(&cache_dir)?; + } + + // re-populate the cache dir with the new hash + fs::create_dir_all(&cache_dir)?; + fs::write(out_dir.join(&self.hash), "")?; + Ok(()) + } + /// Return the name of the output wasm file. fn out_wasm_filename(&self) -> String { format!("{}.wasm", self.name()) } + + /// Return the name of the RISC-V polkavm file. + fn out_riscv_filename(&self) -> String { + format!("{}.polkavm", self.name()) + } } /// Collect all contract entries from the given source directory. /// Contracts that have already been compiled are filtered out. fn collect_entries(contracts_dir: &Path, out_dir: &Path) -> Vec { - fs::read_dir(&contracts_dir) + fs::read_dir(contracts_dir) .expect("src dir exists; qed") .filter_map(|file| { let path = file.expect("file exists; qed").path(); @@ -83,7 +108,7 @@ fn collect_entries(contracts_dir: &Path, out_dir: &Path) -> Vec { } let entry = Entry::new(path); - if out_dir.join(&entry.hash).exists() { + if entry.is_cached(out_dir) { None } else { Some(entry) @@ -98,41 +123,29 @@ fn create_cargo_toml<'a>( entries: impl Iterator, output_dir: &Path, ) -> Result<()> { - let uapi_path = fixtures_dir.join("../uapi").canonicalize()?; - let common_path = fixtures_dir.join("./contracts/common").canonicalize()?; - let mut cargo_toml: toml::Value = toml::from_str(&format!( - " -[package] -name = 'contracts' -version = '0.1.0' -edition = '2021' - -# Binary targets are injected below. -[[bin]] - -[dependencies] -uapi = {{ package = 'pallet-contracts-uapi', default-features = false, path = {uapi_path:?}}} -common = {{ package = 'pallet-contracts-fixtures-common', path = {common_path:?}}} - -[profile.release] -opt-level = 3 -lto = true -codegen-units = 1 -" - ))?; - - let binaries = entries - .map(|entry| { - let name = entry.name(); - let path = entry.path(); - toml::Value::Table(toml::toml! { - name = name - path = path + let mut cargo_toml: toml::Value = toml::from_str(include_str!("./build/Cargo.toml"))?; + let mut set_dep = |name, path| -> Result<()> { + cargo_toml["dependencies"][name]["path"] = toml::Value::String( + fixtures_dir.join(path).canonicalize()?.to_str().unwrap().to_string(), + ); + Ok(()) + }; + set_dep("uapi", "../uapi")?; + set_dep("common", "./contracts/common")?; + + cargo_toml["bin"] = toml::Value::Array( + entries + .map(|entry| { + let name = entry.name(); + let path = entry.path(); + toml::Value::Table(toml::toml! { + name = name + path = path + }) }) - }) - .collect::>(); + .collect::>(), + ); - cargo_toml["bin"] = toml::Value::Array(binaries); let cargo_toml = toml::to_string_pretty(&cargo_toml)?; fs::write(output_dir.join("Cargo.toml"), cargo_toml).map_err(Into::into) } @@ -145,7 +158,7 @@ fn invoke_cargo_fmt<'a>( ) -> Result<()> { // If rustfmt is not installed, skip the check. if !Command::new("rustup") - .args(&["run", "nightly", "rustfmt", "--version"]) + .args(["run", "nightly", "rustfmt", "--version"]) .output() .map_or(false, |o| o.status.success()) { @@ -153,7 +166,7 @@ fn invoke_cargo_fmt<'a>( } let fmt_res = Command::new("rustup") - .args(&["run", "nightly", "rustfmt", "--check", "--config-path"]) + .args(["run", "nightly", "rustfmt", "--check", "--config-path"]) .arg(config_path) .args(files) .output() @@ -176,8 +189,8 @@ fn invoke_cargo_fmt<'a>( anyhow::bail!("Fixtures files are not formatted") } -/// Invoke `cargo build` to compile the contracts. -fn invoke_build(current_dir: &Path) -> Result<()> { +/// Build contracts for wasm. +fn invoke_wasm_build(current_dir: &Path) -> Result<()> { let encoded_rustflags = [ "-Clink-arg=-zstack-size=65536", "-Clink-arg=--import-memory", @@ -190,7 +203,7 @@ fn invoke_build(current_dir: &Path) -> Result<()> { let build_res = Command::new(env::var("CARGO")?) .current_dir(current_dir) .env("CARGO_ENCODED_RUSTFLAGS", encoded_rustflags) - .args(&["build", "--release", "--target=wasm32-unknown-unknown"]) + .args(["build", "--release", "--target=wasm32-unknown-unknown"]) .output() .expect("failed to execute process"); @@ -200,12 +213,13 @@ fn invoke_build(current_dir: &Path) -> Result<()> { let stderr = String::from_utf8_lossy(&build_res.stderr); eprintln!("{}", stderr); - anyhow::bail!("Failed to build contracts"); + bail!("Failed to build wasm contracts"); } /// Post-process the compiled wasm contracts. fn post_process_wasm(input_path: &Path, output_path: &Path) -> Result<()> { - let mut module = deserialize_file(input_path)?; + let mut module = + deserialize_file(input_path).with_context(|| format!("Failed to read {:?}", input_path))?; if let Some(section) = module.export_section_mut() { section.entries_mut().retain(|entry| { matches!(entry.internal(), Internal::Function(_)) && @@ -216,6 +230,50 @@ fn post_process_wasm(input_path: &Path, output_path: &Path) -> Result<()> { serialize_to_file(output_path, module).map_err(Into::into) } +/// Build contracts for RISC-V. +fn invoke_riscv_build(current_dir: &Path) -> Result<()> { + let encoded_rustflags = + ["-Crelocation-model=pie", "-Clink-arg=--emit-relocs", "-Clink-arg=-Tmemory.ld"] + .join("\x1f"); + + fs::write(current_dir.join("memory.ld"), include_bytes!("./build/riscv_memory_layout.ld"))?; + + let build_res = Command::new(env::var("CARGO")?) + .current_dir(current_dir) + .env_clear() + .env("PATH", env::var("PATH").unwrap()) + .env("CARGO_ENCODED_RUSTFLAGS", encoded_rustflags) + .env("RUSTUP_TOOLCHAIN", "rve-nightly") + .env("RUSTUP_HOME", env::var("RUSTUP_HOME").unwrap()) + .args(["build", "--release", "--target=riscv32em-unknown-none-elf"]) + .output() + .expect("failed to execute process"); + + if build_res.status.success() { + return Ok(()) + } + + let stderr = String::from_utf8_lossy(&build_res.stderr); + + if stderr.contains("'rve-nightly' is not installed") { + eprintln!("RISC-V toolchain is not installed.\nDownload and install toolchain from https://github.com/paritytech/rustc-rv32e-toolchain."); + eprintln!("{}", stderr); + } else { + eprintln!("{}", stderr); + } + + bail!("Failed to build contracts"); +} +/// Post-process the compiled wasm contracts. +fn post_process_riscv(input_path: &Path, output_path: &Path) -> Result<()> { + let mut config = polkavm_linker::Config::default(); + config.set_strip(true); + let orig = fs::read(input_path).with_context(|| format!("Failed to read {:?}", input_path))?; + let linked = polkavm_linker::program_from_elf(config, orig.as_ref()) + .map_err(|err| format_err!("Failed to link polkavm program: {}", err))?; + fs::write(output_path, linked.as_bytes()).map_err(Into::into) +} + /// Write the compiled contracts to the given output directory. fn write_output(build_dir: &Path, out_dir: &Path, entries: Vec) -> Result<()> { for entry in entries { @@ -224,7 +282,13 @@ fn write_output(build_dir: &Path, out_dir: &Path, entries: Vec) -> Result &build_dir.join("target/wasm32-unknown-unknown/release").join(&wasm_output), &out_dir.join(&wasm_output), )?; - fs::write(out_dir.join(&entry.hash), "")?; + + post_process_riscv( + &build_dir.join("target/riscv32em-unknown-none-elf/release").join(entry.name()), + &out_dir.join(entry.out_riscv_filename()), + )?; + + entry.update_cache(out_dir)?; } Ok(()) @@ -270,8 +334,9 @@ fn main() -> Result<()> { &contracts_dir, )?; - invoke_build(tmp_dir_path)?; - write_output(tmp_dir_path, &out_dir, entries)?; + invoke_wasm_build(tmp_dir_path)?; + invoke_riscv_build(tmp_dir_path)?; + write_output(tmp_dir_path, &out_dir, entries)?; Ok(()) } diff --git a/substrate/frame/contracts/fixtures/build/Cargo.toml b/substrate/frame/contracts/fixtures/build/Cargo.toml new file mode 100644 index 00000000000..7fd42b887e7 --- /dev/null +++ b/substrate/frame/contracts/fixtures/build/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "contracts" +version = "0.1.0" +edition = "2021" + +# Binary targets are injected dynamically by the build script. +[[bin]] + +# local path are injected dynamically by the build script. +[dependencies] +uapi = { package = 'pallet-contracts-uapi', path = "", default-features = false } +common = { package = 'pallet-contracts-fixtures-common', path = "" } +polkavm-derive = '0.2.0' + +[profile.release] +opt-level = 3 +lto = true +codegen-units = 1 diff --git a/substrate/frame/contracts/fixtures/build/riscv_memory_layout.ld b/substrate/frame/contracts/fixtures/build/riscv_memory_layout.ld new file mode 100644 index 00000000000..89084263ada --- /dev/null +++ b/substrate/frame/contracts/fixtures/build/riscv_memory_layout.ld @@ -0,0 +1,4 @@ +SECTIONS { + .text : { KEEP(*(.text.polkavm_export)) } +} + diff --git a/substrate/frame/contracts/fixtures/contracts/call.rs b/substrate/frame/contracts/fixtures/contracts/call.rs index 396b71d5e96..0e5f4fbd2dd 100644 --- a/substrate/frame/contracts/fixtures/contracts/call.rs +++ b/substrate/frame/contracts/fixtures/contracts/call.rs @@ -23,9 +23,11 @@ extern crate common; use uapi::{CallFlags, HostFn, HostFnImpl as api}; #[no_mangle] +#[polkavm_derive::polkavm_export] pub extern "C" fn deploy() {} #[no_mangle] +#[polkavm_derive::polkavm_export] pub extern "C" fn call() { let mut buffer = [0u8; 40]; let callee_input = 0..4; diff --git a/substrate/frame/contracts/fixtures/contracts/common/Cargo.toml b/substrate/frame/contracts/fixtures/contracts/common/Cargo.toml index 377e8bc9dd5..127bb575088 100644 --- a/substrate/frame/contracts/fixtures/contracts/common/Cargo.toml +++ b/substrate/frame/contracts/fixtures/contracts/common/Cargo.toml @@ -6,6 +6,3 @@ authors.workspace = true edition.workspace = true license.workspace = true description = "Common utilities for pallet-contracts-fixtures." - -[lints] -workspace = true diff --git a/substrate/frame/contracts/fixtures/contracts/dummy.rs b/substrate/frame/contracts/fixtures/contracts/dummy.rs index 98b9d494bbc..bde0d15e2f6 100644 --- a/substrate/frame/contracts/fixtures/contracts/dummy.rs +++ b/substrate/frame/contracts/fixtures/contracts/dummy.rs @@ -20,7 +20,9 @@ extern crate common; #[no_mangle] +#[polkavm_derive::polkavm_export] pub extern "C" fn deploy() {} #[no_mangle] +#[polkavm_derive::polkavm_export] pub extern "C" fn call() {} diff --git a/substrate/frame/contracts/uapi/Cargo.toml b/substrate/frame/contracts/uapi/Cargo.toml index f2901427282..d3f6fc06269 100644 --- a/substrate/frame/contracts/uapi/Cargo.toml +++ b/substrate/frame/contracts/uapi/Cargo.toml @@ -8,8 +8,9 @@ homepage = "https://substrate.io" repository.workspace = true description = "Exposes all the host functions that a contract can import." -[lints] -workspace = true +# [lints] +# TODO: uncomment when rve toolchain is updated to rust 1.74 or greater. +# workspace = true [dependencies] paste = { version = "1.0", default-features = false } @@ -20,6 +21,9 @@ scale = { package = "parity-scale-codec", version = "3.6.1", default-features = "max-encoded-len", ], optional = true } +[target.'cfg(target_arch = "riscv32")'.dependencies] +polkavm-derive = '0.2.0' + [features] default = ["scale"] scale = ["dep:scale", "scale-info"] diff --git a/substrate/frame/contracts/uapi/src/host.rs b/substrate/frame/contracts/uapi/src/host.rs index f8b55d3822e..8f76b21ec9f 100644 --- a/substrate/frame/contracts/uapi/src/host.rs +++ b/substrate/frame/contracts/uapi/src/host.rs @@ -11,7 +11,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -use crate::{CallFlags, Result, ReturnFlags, SENTINEL}; +use crate::{CallFlags, Result, ReturnFlags}; use paste::paste; #[cfg(target_arch = "wasm32")] @@ -36,23 +36,27 @@ macro_rules! hash_fn { }; } +// TODO remove cfg once used by all targets +#[cfg(target_arch = "wasm32")] fn extract_from_slice(output: &mut &mut [u8], new_len: usize) { debug_assert!(new_len <= output.len()); let tmp = core::mem::take(output); *output = &mut tmp[..new_len]; } +#[cfg(target_arch = "wasm32")] fn ptr_len_or_sentinel(data: &mut Option<&mut [u8]>) -> (*mut u8, u32) { match data { Some(ref mut data) => (data.as_mut_ptr(), data.len() as _), - None => (SENTINEL as _, 0), + None => (crate::SENTINEL as _, 0), } } +#[cfg(target_arch = "wasm32")] fn ptr_or_sentinel(data: &Option<&[u8]>) -> *const u8 { match data { Some(ref data) => data.as_ptr(), - None => SENTINEL as _, + None => crate::SENTINEL as _, } } @@ -201,12 +205,13 @@ pub trait HostFn { /// /// - `func_id`: The function id of the chain extension. /// - `input`: The input data buffer. - /// - `output`: A reference to the output data buffer to write the output data. + /// - `output`: A reference to the output data buffer to write the call output buffer. If `None` + /// is provided then the output buffer is not copied. /// /// # Return /// /// The chain extension returned value, if executed successfully. - fn call_chain_extension(func_id: u32, input: &[u8], output: &mut &mut [u8]) -> u32; + fn call_chain_extension(func_id: u32, input: &[u8], output: Option<&mut [u8]>) -> u32; /// Call some dispatchable of the runtime. /// @@ -324,6 +329,25 @@ pub trait HostFn { /// Returns the size of the pre-existing value at the specified key if any. fn contains_storage_v1(key: &[u8]) -> Option; + /// Emit a custom debug message. + /// + /// No newlines are added to the supplied message. + /// Specifying invalid UTF-8 just drops the message with no trap. + /// + /// This is a no-op if debug message recording is disabled which is always the case + /// when the code is executing on-chain. The message is interpreted as UTF-8 and + /// appended to the debug buffer which is then supplied to the calling RPC client. + /// + /// # Note + /// + /// Even though no action is taken when debug message recording is disabled there is still + /// a non trivial overhead (and weight cost) associated with calling this function. Contract + /// languages should remove calls to this function (either at runtime or compile time) when + /// not being executed as an RPC. For example, they could allow users to disable logging + /// through compile time flags (cargo features) for on-chain deployment. Additionally, the + /// return value of this function can be cached in order to prevent further calls at runtime. + fn debug_message(str: &[u8]) -> Result; + /// Execute code in the context (storage, caller, value) of the current contract. /// /// Reentrancy protection is always disabled since the callee is allowed @@ -789,5 +813,5 @@ pub trait HostFn { #[deprecated( note = "Unstable function. Behaviour can change without further notice. Use only for testing." )] - fn xcm_send(dest: &[u8], msg: &[u8], output: &mut &mut [u8]) -> Result; + fn xcm_send(dest: &[u8], msg: &[u8], output: &mut [u8; 32]) -> Result; } diff --git a/substrate/frame/contracts/uapi/src/host/riscv32.rs b/substrate/frame/contracts/uapi/src/host/riscv32.rs index f58b8831f06..4132768abc2 100644 --- a/substrate/frame/contracts/uapi/src/host/riscv32.rs +++ b/substrate/frame/contracts/uapi/src/host/riscv32.rs @@ -1,3 +1,4 @@ +#![allow(unused_variables, unused_mut)] // Copyright (C) Parity Technologies (UK) Ltd. // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,3 +13,295 @@ // See the License for the specific language governing permissions and // limitations under the License. // TODO: bring up to date with wasm32.rs + +use super::{CallFlags, HostFn, HostFnImpl, Result}; +use crate::ReturnFlags; + +/// A macro to implement all Host functions with a signature of `fn(&mut &mut [u8])`. +/// +/// Example: +/// ```nocompile +// impl_wrapper_for! { +// () => [gas_left], +// (v1) => [gas_left], +// } +// ``` +// +// Expands to: +// ```nocompile +// fn gas_left(output: &mut &mut [u8]) { +// unsafe { sys::gas_left(...); } +// } +// fn gas_left_v1(output: &mut &mut [u8]) { +// unsafe { sys::v1::gas_left(...); } +// } +// ``` +macro_rules! impl_wrapper_for { + (@impl_fn $( $mod:ident )::*, $suffix_sep: literal, $suffix:tt, $name:ident) => { + paste::paste! { + fn [<$name $suffix_sep $suffix>](output: &mut &mut [u8]) { + todo!() + } + } + }; + + () => {}; + + (($mod:ident) => [$( $name:ident),*], $($tail:tt)*) => { + $(impl_wrapper_for!(@impl_fn sys::$mod, "_", $mod, $name);)* + impl_wrapper_for!($($tail)*); + }; + + (() => [$( $name:ident),*], $($tail:tt)*) => { + $(impl_wrapper_for!(@impl_fn sys, "", "", $name);)* + impl_wrapper_for!($($tail)*); + }; +} + +/// A macro to implement all the hash functions Apis. +macro_rules! impl_hash_fn { + ( $name:ident, $bytes_result:literal ) => { + paste::item! { + fn [](input: &[u8], output: &mut [u8; $bytes_result]) { + todo!() + } + } + }; +} + +/// A macro to implement the get_storage functions. +macro_rules! impl_get_storage { + ($fn_name:ident, $sys_get_storage:path) => { + fn $fn_name(key: &[u8], output: &mut &mut [u8]) -> Result { + todo!() + } + }; +} + +impl HostFn for HostFnImpl { + fn instantiate_v1( + code_hash: &[u8], + gas: u64, + value: &[u8], + input: &[u8], + mut address: Option<&mut [u8]>, + mut output: Option<&mut [u8]>, + salt: &[u8], + ) -> Result { + todo!() + } + + fn instantiate_v2( + code_hash: &[u8], + ref_time_limit: u64, + proof_size_limit: u64, + deposit: Option<&[u8]>, + value: &[u8], + input: &[u8], + mut address: Option<&mut [u8]>, + mut output: Option<&mut [u8]>, + salt: &[u8], + ) -> Result { + todo!() + } + + fn call( + callee: &[u8], + gas: u64, + value: &[u8], + input_data: &[u8], + mut output: Option<&mut [u8]>, + ) -> Result { + todo!() + } + + fn call_v1( + flags: CallFlags, + callee: &[u8], + gas: u64, + value: &[u8], + input_data: &[u8], + mut output: Option<&mut [u8]>, + ) -> Result { + todo!() + } + + fn call_v2( + flags: CallFlags, + callee: &[u8], + ref_time_limit: u64, + proof_time_limit: u64, + deposit: Option<&[u8]>, + value: &[u8], + input_data: &[u8], + mut output: Option<&mut [u8]>, + ) -> Result { + todo!() + } + + fn caller_is_root() -> u32 { + todo!() + } + + fn delegate_call( + flags: CallFlags, + code_hash: &[u8], + input: &[u8], + mut output: Option<&mut [u8]>, + ) -> Result { + todo!() + } + + fn transfer(account_id: &[u8], value: &[u8]) -> Result { + todo!() + } + + fn deposit_event(topics: &[u8], data: &[u8]) { + todo!() + } + + fn set_storage(key: &[u8], value: &[u8]) { + todo!() + } + + fn set_storage_v1(key: &[u8], encoded_value: &[u8]) -> Option { + todo!() + } + + fn set_storage_v2(key: &[u8], encoded_value: &[u8]) -> Option { + todo!() + } + + fn clear_storage(key: &[u8]) { + todo!() + } + + fn clear_storage_v1(key: &[u8]) -> Option { + todo!() + } + + impl_get_storage!(get_storage, sys::get_storage); + impl_get_storage!(get_storage_v1, sys::v1::get_storage); + + fn take_storage(key: &[u8], output: &mut &mut [u8]) -> Result { + todo!() + } + + fn contains_storage(key: &[u8]) -> Option { + todo!() + } + + fn contains_storage_v1(key: &[u8]) -> Option { + todo!() + } + + fn terminate(beneficiary: &[u8]) -> ! { + todo!() + } + + fn terminate_v1(beneficiary: &[u8]) -> ! { + todo!() + } + + fn call_chain_extension(func_id: u32, input: &[u8], output: Option<&mut [u8]>) -> u32 { + todo!() + } + + fn input(output: &mut &mut [u8]) { + todo!() + } + + fn return_value(flags: ReturnFlags, return_value: &[u8]) -> ! { + todo!() + } + + fn call_runtime(call: &[u8]) -> Result { + todo!() + } + + fn debug_message(str: &[u8]) -> Result { + todo!() + } + + impl_wrapper_for! { + () => [caller, block_number, address, balance, gas_left, value_transferred, now, minimum_balance], + (v1) => [gas_left], + } + + fn weight_to_fee(gas: u64, output: &mut &mut [u8]) { + todo!() + } + + fn weight_to_fee_v1(ref_time_limit: u64, proof_size_limit: u64, output: &mut &mut [u8]) { + todo!() + } + + impl_hash_fn!(sha2_256, 32); + impl_hash_fn!(keccak_256, 32); + impl_hash_fn!(blake2_256, 32); + impl_hash_fn!(blake2_128, 16); + + fn ecdsa_recover( + signature: &[u8; 65], + message_hash: &[u8; 32], + output: &mut [u8; 33], + ) -> Result { + todo!() + } + + fn ecdsa_to_eth_address(pubkey: &[u8; 33], output: &mut [u8; 20]) -> Result { + todo!() + } + + fn sr25519_verify(signature: &[u8; 64], message: &[u8], pub_key: &[u8; 32]) -> Result { + todo!() + } + + fn is_contract(account_id: &[u8]) -> bool { + todo!() + } + + fn caller_is_origin() -> bool { + todo!() + } + + fn set_code_hash(code_hash: &[u8]) -> Result { + todo!() + } + + fn code_hash(account_id: &[u8], output: &mut [u8]) -> Result { + todo!() + } + + fn own_code_hash(output: &mut [u8]) { + todo!() + } + + fn account_reentrance_count(account: &[u8]) -> u32 { + todo!() + } + + fn add_delegate_dependency(code_hash: &[u8]) { + todo!() + } + + fn remove_delegate_dependency(code_hash: &[u8]) { + todo!() + } + + fn instantiation_nonce() -> u64 { + todo!() + } + + fn reentrance_count() -> u32 { + todo!() + } + + fn xcm_execute(msg: &[u8], output: &mut &mut [u8]) -> Result { + todo!() + } + + fn xcm_send(dest: &[u8], msg: &[u8], output: &mut [u8; 32]) -> Result { + todo!() + } +} diff --git a/substrate/frame/contracts/uapi/src/host/wasm32.rs b/substrate/frame/contracts/uapi/src/host/wasm32.rs index d30058daf3d..29fa1706a84 100644 --- a/substrate/frame/contracts/uapi/src/host/wasm32.rs +++ b/substrate/frame/contracts/uapi/src/host/wasm32.rs @@ -69,6 +69,8 @@ mod sys { pub fn contains_storage(key_ptr: *const u8, key_len: u32) -> ReturnCode; + pub fn debug_message(str_ptr: *const u8, str_len: u32) -> ReturnCode; + pub fn delegate_call( flags: u32, code_hash_ptr: *const u8, @@ -97,7 +99,6 @@ mod sys { pub fn get_storage( key_ptr: *const u8, - key_len: u32, out_ptr: *mut u8, out_len_ptr: *mut u32, ) -> ReturnCode; @@ -130,12 +131,7 @@ mod sys { pub fn set_code_hash(code_hash_ptr: *const u8) -> ReturnCode; - pub fn set_storage( - key_ptr: *const u8, - key_len: u32, - value_ptr: *const u8, - value_len: u32, - ) -> ReturnCode; + pub fn set_storage(key_ptr: *const u8, value_ptr: *const u8, value_len: u32); pub fn sr25519_verify( signature_ptr: *const u8, @@ -219,7 +215,6 @@ mod sys { pub fn set_storage( key_ptr: *const u8, - key_len: u32, value_ptr: *const u8, value_len: u32, ) -> ReturnCode; @@ -280,29 +275,47 @@ mod sys { } /// A macro to implement all Host functions with a signature of `fn(&mut &mut [u8])`. +/// +/// Example: +/// ```nocompile +// impl_wrapper_for! { +// () => [gas_left], +// (v1) => [gas_left], +// } +// ``` +// +// Expands to: +// ```nocompile +// fn gas_left(output: &mut &mut [u8]) { +// unsafe { sys::gas_left(...); } +// } +// fn gas_left_v1(output: &mut &mut [u8]) { +// unsafe { sys::v1::gas_left(...); } +// } +// ``` macro_rules! impl_wrapper_for { - (@impl_fn $( $mod:ident )::*, $suffix:literal, $name:ident) => { - paste::paste! { - fn [<$name $suffix>](output: &mut &mut [u8]) { - let mut output_len = output.len() as u32; - unsafe { - $( $mod )::*::$name(output.as_mut_ptr(), &mut output_len); - } - } - } - }; - - () => {}; - - (($mod:ident, $suffix:literal) => [$( $name:ident),*], $($tail:tt)*) => { - $(impl_wrapper_for!(@impl_fn sys::$mod, $suffix, $name);)* - impl_wrapper_for!($($tail)*); - }; - - (() => [$( $name:ident),*], $($tail:tt)*) => { - $(impl_wrapper_for!(@impl_fn sys, "", $name);)* - impl_wrapper_for!($($tail)*); - }; + (@impl_fn $( $mod:ident )::*, $suffix_sep: literal, $suffix:tt, $name:ident) => { + paste::paste! { + fn [<$name $suffix_sep $suffix>](output: &mut &mut [u8]) { + let mut output_len = output.len() as u32; + unsafe { + $( $mod )::*::$name(output.as_mut_ptr(), &mut output_len); + } + } + } + }; + + () => {}; + + (($mod:ident) => [$( $name:ident),*], $($tail:tt)*) => { + $(impl_wrapper_for!(@impl_fn sys::$mod, "_", $mod, $name);)* + impl_wrapper_for!($($tail)*); + }; + + (() => [$( $name:ident),*], $($tail:tt)*) => { + $(impl_wrapper_for!(@impl_fn sys, "", "", $name);)* + impl_wrapper_for!($($tail)*); + }; } /// A macro to implement all the hash functions Apis. @@ -322,27 +335,6 @@ macro_rules! impl_hash_fn { }; } -/// A macro to implement the get_storage functions. -macro_rules! impl_get_storage { - ($fn_name:ident, $sys_get_storage:path) => { - fn $fn_name(key: &[u8], output: &mut &mut [u8]) -> Result { - let mut output_len = output.len() as u32; - let ret_code = { - unsafe { - $sys_get_storage( - key.as_ptr(), - key.len() as u32, - output.as_mut_ptr(), - &mut output_len, - ) - } - }; - extract_from_slice(output, output_len as usize); - ret_code.into() - } - }; -} - impl HostFn for HostFnImpl { fn instantiate_v1( code_hash: &[u8], @@ -579,19 +571,12 @@ impl HostFn for HostFnImpl { } fn set_storage(key: &[u8], value: &[u8]) { - unsafe { - sys::set_storage(key.as_ptr(), key.len() as u32, value.as_ptr(), value.len() as u32) - }; + unsafe { sys::set_storage(key.as_ptr(), value.as_ptr(), value.len() as u32) }; } fn set_storage_v1(key: &[u8], encoded_value: &[u8]) -> Option { let ret_code = unsafe { - sys::v1::set_storage( - key.as_ptr(), - key.len() as u32, - encoded_value.as_ptr(), - encoded_value.len() as u32, - ) + sys::v1::set_storage(key.as_ptr(), encoded_value.as_ptr(), encoded_value.len() as u32) }; ret_code.into() } @@ -617,8 +602,29 @@ impl HostFn for HostFnImpl { ret_code.into() } - impl_get_storage!(get_storage, sys::get_storage); - impl_get_storage!(get_storage_v1, sys::v1::get_storage); + fn get_storage(key: &[u8], output: &mut &mut [u8]) -> Result { + let mut output_len = output.len() as u32; + let ret_code = + { unsafe { sys::get_storage(key.as_ptr(), output.as_mut_ptr(), &mut output_len) } }; + extract_from_slice(output, output_len as usize); + ret_code.into() + } + + fn get_storage_v1(key: &[u8], output: &mut &mut [u8]) -> Result { + let mut output_len = output.len() as u32; + let ret_code = { + unsafe { + sys::v1::get_storage( + key.as_ptr(), + key.len() as u32, + output.as_mut_ptr(), + &mut output_len, + ) + } + }; + extract_from_slice(output, output_len as usize); + ret_code.into() + } fn take_storage(key: &[u8], output: &mut &mut [u8]) -> Result { let mut output_len = output.len() as u32; @@ -636,6 +642,11 @@ impl HostFn for HostFnImpl { ret_code.into() } + fn debug_message(str: &[u8]) -> Result { + let ret_code = unsafe { sys::debug_message(str.as_ptr(), str.len() as u32) }; + ret_code.into() + } + fn contains_storage(key: &[u8]) -> Option { let ret_code = unsafe { sys::contains_storage(key.as_ptr(), key.len() as u32) }; ret_code.into() @@ -654,20 +665,23 @@ impl HostFn for HostFnImpl { unsafe { sys::v1::terminate(beneficiary.as_ptr()) } } - fn call_chain_extension(func_id: u32, input: &[u8], output: &mut &mut [u8]) -> u32 { - let mut output_len = output.len() as u32; + fn call_chain_extension(func_id: u32, input: &[u8], mut output: Option<&mut [u8]>) -> u32 { + let (output_ptr, mut output_len) = ptr_len_or_sentinel(&mut output); let ret_code = { unsafe { sys::call_chain_extension( func_id, input.as_ptr(), input.len() as u32, - output.as_mut_ptr(), + output_ptr, &mut output_len, ) } }; - extract_from_slice(output, output_len as usize); + + if let Some(ref mut output) = output { + extract_from_slice(output, output_len as usize); + } ret_code.into_u32() } @@ -690,7 +704,7 @@ impl HostFn for HostFnImpl { impl_wrapper_for! { () => [caller, block_number, address, balance, gas_left, value_transferred, now, minimum_balance], - (v1, "_v1") => [gas_left], + (v1) => [gas_left], } fn weight_to_fee(gas: u64, output: &mut &mut [u8]) { @@ -802,7 +816,7 @@ impl HostFn for HostFnImpl { ret_code.into() } - fn xcm_send(dest: &[u8], msg: &[u8], output: &mut &mut [u8]) -> Result { + fn xcm_send(dest: &[u8], msg: &[u8], output: &mut [u8; 32]) -> Result { let ret_code = unsafe { sys::xcm_send(dest.as_ptr(), msg.as_ptr(), msg.len() as _, output.as_mut_ptr()) }; diff --git a/substrate/frame/contracts/uapi/src/lib.rs b/substrate/frame/contracts/uapi/src/lib.rs index 3d384bbb85d..99d77f504ed 100644 --- a/substrate/frame/contracts/uapi/src/lib.rs +++ b/substrate/frame/contracts/uapi/src/lib.rs @@ -35,7 +35,7 @@ macro_rules! define_error_codes { )* ) => { /// Every error that can be returned to a contract when it calls any of the host functions. - #[derive(Debug)] + #[derive(Debug, PartialEq, Eq)] #[repr(u32)] pub enum ReturnErrorCode { /// API call successful. @@ -49,7 +49,6 @@ macro_rules! define_error_codes { } impl From for Result { - #[inline] fn from(return_code: ReturnCode) -> Self { match return_code.0 { 0 => Ok(()), -- GitLab From 99290fd9326dfaa13f592f98a646fd7f522dccb4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Jan 2024 16:59:33 +0100 Subject: [PATCH 113/191] Bump webpki from 0.22.0 to 0.22.4 (#2849) Bumps [webpki](https://github.com/briansmith/webpki) from 0.22.0 to 0.22.4.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=webpki&package-manager=cargo&previous-version=0.22.0&new-version=0.22.4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/paritytech/polkadot-sdk/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 64ccb3e4767..466fa26d434 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14728,11 +14728,25 @@ dependencies = [ "libc", "once_cell", "spin 0.5.2", - "untrusted", + "untrusted 0.7.1", "web-sys", "winapi", ] +[[package]] +name = "ring" +version = "0.17.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" +dependencies = [ + "cc", + "getrandom 0.2.10", + "libc", + "spin 0.9.8", + "untrusted 0.9.0", + "windows-sys 0.48.0", +] + [[package]] name = "ripemd" version = "0.1.3" @@ -15195,7 +15209,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e98ff011474fa39949b7e5c0428f9b4937eda7da7848bbb947786b7be0b27dab" dependencies = [ "ring 0.16.20", - "untrusted", + "untrusted 0.7.1", ] [[package]] @@ -15205,7 +15219,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d93931baf2d282fff8d3a532bbfd7653f734643161b87e3e01e59a04439bf0d" dependencies = [ "ring 0.16.20", - "untrusted", + "untrusted 0.7.1", ] [[package]] @@ -16869,7 +16883,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" dependencies = [ "ring 0.16.20", - "untrusted", + "untrusted 0.7.1", ] [[package]] @@ -20772,6 +20786,12 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + [[package]] name = "url" version = "2.4.0" @@ -21383,12 +21403,12 @@ dependencies = [ [[package]] name = "webpki" -version = "0.22.0" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" +checksum = "ed63aea5ce73d0ff405984102c42de94fc55a6b75765d621c65262469b3c9b53" dependencies = [ - "ring 0.16.20", - "untrusted", + "ring 0.17.7", + "untrusted 0.9.0", ] [[package]] -- GitLab From e07476e34e7b1d1461315e3e232d2a2ef958811f Mon Sep 17 00:00:00 2001 From: Marcin S Date: Thu, 4 Jan 2024 18:51:37 +0100 Subject: [PATCH 114/191] Update missing worker binaries error (#2853) Please let me know if this would be a better UX. Should we have specific links in the error message? --- .github/workflows/check-markdown.yml | 1 + polkadot/README.md | 8 +++++--- polkadot/node/service/src/lib.rs | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.github/workflows/check-markdown.yml b/.github/workflows/check-markdown.yml index dc02970a173..2b8a66db35b 100644 --- a/.github/workflows/check-markdown.yml +++ b/.github/workflows/check-markdown.yml @@ -31,4 +31,5 @@ jobs: env: CONFIG: .github/.markdownlint.yaml run: | + echo "Checking markdown formatting. More info: docs/contributor/markdown_linting.md" markdownlint --config "$CONFIG" --ignore target . diff --git a/polkadot/README.md b/polkadot/README.md index f27fc86df27..d7435f27b94 100644 --- a/polkadot/README.md +++ b/polkadot/README.md @@ -9,9 +9,11 @@ guides, like how to run a validator node, see the [Polkadot Wiki](https://wiki.p ### Using a pre-compiled binary -If you just wish to run a Polkadot node without compiling it yourself, you may either run the latest -binary from our [releases](https://github.com/paritytech/polkadot-sdk/releases) page, or install -Polkadot from one of our package repositories. +If you just wish to run a Polkadot node without compiling it yourself, you may either: + +- run the latest binary from our [releases](https://github.com/paritytech/polkadot-sdk/releases) page (make sure to also + download all the `worker` binaries and put them in the same directory as `polkadot`), or +- install Polkadot from one of our package repositories. ### Debian-based (Debian, Ubuntu) diff --git a/polkadot/node/service/src/lib.rs b/polkadot/node/service/src/lib.rs index e92e15fc0e0..ff70dbde734 100644 --- a/polkadot/node/service/src/lib.rs +++ b/polkadot/node/service/src/lib.rs @@ -239,7 +239,7 @@ pub enum Error { InvalidWorkerBinaries { prep_worker_path: PathBuf, exec_worker_path: PathBuf }, #[cfg(feature = "full-node")] - #[error("Worker binaries could not be found, make sure polkadot was built/installed correctly. If you ran with `cargo run`, please run `cargo build` first. Searched given workers path ({given_workers_path:?}), polkadot binary path ({current_exe_path:?}), and lib path (/usr/lib/polkadot), workers names: {workers_names:?}")] + #[error("Worker binaries could not be found, make sure polkadot was built and installed correctly. Please see the readme for the latest instructions (https://github.com/paritytech/polkadot-sdk/tree/master/polkadot). If you ran with `cargo run`, please run `cargo build` first. Searched given workers path ({given_workers_path:?}), polkadot binary path ({current_exe_path:?}), and lib path (/usr/lib/polkadot), workers names: {workers_names:?}")] MissingWorkerBinaries { given_workers_path: Option, current_exe_path: PathBuf, -- GitLab From 19de1c96607f80ea1f55584c42e7050df08cb3e2 Mon Sep 17 00:00:00 2001 From: asynchronous rob Date: Thu, 4 Jan 2024 10:57:10 -0800 Subject: [PATCH 115/191] proposer: return optional block (#2834) This opens up the proposer to only optionally create blocks. Nodes may only make blocks when there are transactions or the chain is scheduled. --------- Co-authored-by: command-bot <> --- cumulus/client/consensus/aura/src/collator.rs | 15 +++++++++++---- .../client/consensus/aura/src/collators/basic.rs | 12 +++++++++--- .../consensus/aura/src/collators/lookahead.rs | 6 +++++- cumulus/client/consensus/proposer/src/lib.rs | 5 +++-- prdoc/pr_2834.prdoc | 13 +++++++++++++ 5 files changed, 41 insertions(+), 10 deletions(-) create mode 100644 prdoc/pr_2834.prdoc diff --git a/cumulus/client/consensus/aura/src/collator.rs b/cumulus/client/consensus/aura/src/collator.rs index b00c3952e2b..83f82aff96b 100644 --- a/cumulus/client/consensus/aura/src/collator.rs +++ b/cumulus/client/consensus/aura/src/collator.rs @@ -172,12 +172,14 @@ where inherent_data: (ParachainInherentData, InherentData), proposal_duration: Duration, max_pov_size: usize, - ) -> Result<(Collation, ParachainBlockData, Block::Hash), Box> - { + ) -> Result< + Option<(Collation, ParachainBlockData, Block::Hash)>, + Box, + > { let mut digest = additional_pre_digest.into().unwrap_or_default(); digest.push(slot_claim.pre_digest.clone()); - let proposal = self + let maybe_proposal = self .proposer .propose( &parent_header, @@ -190,6 +192,11 @@ where .await .map_err(|e| Box::new(e) as Box)?; + let proposal = match maybe_proposal { + None => return Ok(None), + Some(p) => p, + }; + let sealed_importable = seal::<_, P>( proposal.block, proposal.storage_changes, @@ -234,7 +241,7 @@ where ); } - Ok((collation, block_data, post_hash)) + Ok(Some((collation, block_data, post_hash))) } else { Err(Box::::from("Unable to produce collation") as Box) diff --git a/cumulus/client/consensus/aura/src/collators/basic.rs b/cumulus/client/consensus/aura/src/collators/basic.rs index dc0078b0d6a..78f6b726aff 100644 --- a/cumulus/client/consensus/aura/src/collators/basic.rs +++ b/cumulus/client/consensus/aura/src/collators/basic.rs @@ -203,7 +203,7 @@ where .await ); - let (collation, _, post_hash) = try_request!( + let maybe_collation = try_request!( collator .collate( &parent_header, @@ -220,8 +220,14 @@ where .await ); - let result_sender = Some(collator.collator_service().announce_with_barrier(post_hash)); - request.complete(Some(CollationResult { collation, result_sender })); + if let Some((collation, _, post_hash)) = maybe_collation { + let result_sender = + Some(collator.collator_service().announce_with_barrier(post_hash)); + request.complete(Some(CollationResult { collation, result_sender })); + } else { + request.complete(None); + tracing::debug!(target: crate::LOG_TARGET, "No block proposal"); + } } } } diff --git a/cumulus/client/consensus/aura/src/collators/lookahead.rs b/cumulus/client/consensus/aura/src/collators/lookahead.rs index 57cd646fbcd..5d62094e4aa 100644 --- a/cumulus/client/consensus/aura/src/collators/lookahead.rs +++ b/cumulus/client/consensus/aura/src/collators/lookahead.rs @@ -359,7 +359,7 @@ where ) .await { - Ok((collation, block_data, new_block_hash)) => { + Ok(Some((collation, block_data, new_block_hash))) => { // Here we are assuming that the import logic protects against equivocations // and provides sybil-resistance, as it should. collator.collator_service().announce_block(new_block_hash, None); @@ -387,6 +387,10 @@ where parent_hash = new_block_hash; parent_header = block_data.into_header(); }, + Ok(None) => { + tracing::debug!(target: crate::LOG_TARGET, "No block proposal"); + break + }, Err(err) => { tracing::error!(target: crate::LOG_TARGET, ?err); break diff --git a/cumulus/client/consensus/proposer/src/lib.rs b/cumulus/client/consensus/proposer/src/lib.rs index 7404651bcd9..7eb90a5ac02 100644 --- a/cumulus/client/consensus/proposer/src/lib.rs +++ b/cumulus/client/consensus/proposer/src/lib.rs @@ -76,7 +76,7 @@ pub trait ProposerInterface { inherent_digests: Digest, max_duration: Duration, block_size_limit: Option, - ) -> Result, Error>; + ) -> Result>, Error>; } /// A simple wrapper around a Substrate proposer for creating collations. @@ -109,7 +109,7 @@ where inherent_digests: Digest, max_duration: Duration, block_size_limit: Option, - ) -> Result, Error> { + ) -> Result>, Error> { let proposer = self .inner .init(parent_header) @@ -127,6 +127,7 @@ where proposer .propose(inherent_data, inherent_digests, max_duration, block_size_limit) .await + .map(Some) .map_err(|e| Error::proposing(anyhow::Error::new(e)).into()) } } diff --git a/prdoc/pr_2834.prdoc b/prdoc/pr_2834.prdoc new file mode 100644 index 00000000000..3a5881659de --- /dev/null +++ b/prdoc/pr_2834.prdoc @@ -0,0 +1,13 @@ +title: "proposer: return optional block" + +doc: + - audience: Node Dev + description: | + The `ProposerInterface` trait now returns an optional `Proposal`, allowing + for no block to be created. This is a breaking change that only impacts custom + `ProposerInterface` implementations. The change allows more flexibility in choosing + when to create blocks. + +crates: + - name: "cumulus-client-consensus-aura" + - name: "cumulus-client-consensus-proposer" -- GitLab From 1c95310a66a7ffc832062a5cae4fa4cafc94d1d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Fri, 5 Jan 2024 19:55:32 +0100 Subject: [PATCH 116/191] `fungible::Unbalanced::decrease_balance`: Handle `precision` properly (#2823) --- prdoc/pr_2823.prdoc | 11 ++++++++ .../balances/src/tests/fungible_tests.rs | 27 ++++++++++++++++++- .../src/traits/tokens/fungible/regular.rs | 11 ++++++-- 3 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 prdoc/pr_2823.prdoc diff --git a/prdoc/pr_2823.prdoc b/prdoc/pr_2823.prdoc new file mode 100644 index 00000000000..64a309969ef --- /dev/null +++ b/prdoc/pr_2823.prdoc @@ -0,0 +1,11 @@ +title: "`fungible::Unbalanced::decrease_balance`: Handle `precision` properly" + +doc: + - audience: Runtime Dev + description: | + `fungible::Unbalanced::decrease_balance` will now handle `precision` properly. This means when + passing `Exact`, it will ensure that the available balance is bigger or equal to the `amount` + that should be deducted. + +crates: + - name: "frame-support" diff --git a/substrate/frame/balances/src/tests/fungible_tests.rs b/substrate/frame/balances/src/tests/fungible_tests.rs index 8bf0509d8f7..52fbe10bede 100644 --- a/substrate/frame/balances/src/tests/fungible_tests.rs +++ b/substrate/frame/balances/src/tests/fungible_tests.rs @@ -146,7 +146,7 @@ fn unbalanced_trait_decrease_balance_works_2() { assert_eq!(Balances::total_balance_on_hold(&1337), 60); assert_noop!( Balances::decrease_balance(&1337, 40, Exact, Expendable, Polite), - Error::::InsufficientBalance + TokenError::FundsUnavailable ); assert_eq!(Balances::decrease_balance(&1337, 39, Exact, Expendable, Polite), Ok(39)); assert_eq!(>::balance(&1337), 1); @@ -468,3 +468,28 @@ fn emit_events_with_changing_freezes() { assert_eq!(events(), [RuntimeEvent::Balances(crate::Event::Thawed { who: 1, amount: 15 })]); }); } + +#[test] +fn withdraw_precision_exact_works() { + ExtBuilder::default() + .existential_deposit(1) + .monied(true) + .build_and_execute_with(|| { + assert_ok!(Balances::set_freeze(&TestId::Foo, &1, 10)); + assert_eq!(Balances::account(&1).free, 10); + assert_eq!(Balances::account(&1).frozen, 10); + + // `BestEffort` will not reduce anything + assert_ok!(>::withdraw( + &1, 5, BestEffort, Preserve, Polite + )); + + assert_eq!(Balances::account(&1).free, 10); + assert_eq!(Balances::account(&1).frozen, 10); + + assert_noop!( + >::withdraw(&1, 5, Exact, Preserve, Polite), + TokenError::FundsUnavailable + ); + }); +} diff --git a/substrate/frame/support/src/traits/tokens/fungible/regular.rs b/substrate/frame/support/src/traits/tokens/fungible/regular.rs index aece73777d2..87c6ef68d77 100644 --- a/substrate/frame/support/src/traits/tokens/fungible/regular.rs +++ b/substrate/frame/support/src/traits/tokens/fungible/regular.rs @@ -181,9 +181,16 @@ pub trait Unbalanced: Inspect { ) -> Result { let old_balance = Self::balance(who); let free = Self::reducible_balance(who, preservation, force); - if let BestEffort = precision { - amount = amount.min(free); + match precision { + BestEffort => { + amount = amount.min(free); + }, + Exact => + if free < amount { + return Err(TokenError::FundsUnavailable.into()) + }, } + let new_balance = old_balance.checked_sub(&amount).ok_or(TokenError::FundsUnavailable)?; if let Some(dust) = Self::write_balance(who, new_balance)? { Self::handle_dust(Dust(dust)); -- GitLab From cea7024de18fcc9e8e56ea19f704f1309724f015 Mon Sep 17 00:00:00 2001 From: Tsvetomir Dimitrov Date: Fri, 5 Jan 2024 21:31:56 +0200 Subject: [PATCH 117/191] Fix clippy warnings (#2861) Fix some issues reported by clippy --- .../parachain/pallets/outbound-queue/src/test.rs | 4 ++-- bridges/snowbridge/parachain/pallets/system/src/lib.rs | 2 -- .../snowbridge/parachain/runtime/tests/src/test_cases.rs | 8 ++++---- .../tests/people/people-rococo/src/tests/reap_identity.rs | 2 +- .../people/people-westend/src/tests/reap_identity.rs | 2 +- .../runtimes/coretime/coretime-rococo/src/weights/mod.rs | 1 - .../runtimes/coretime/coretime-westend/src/weights/mod.rs | 1 - .../runtimes/people/people-rococo/src/weights/mod.rs | 1 - .../runtimes/people/people-westend/src/weights/mod.rs | 1 - polkadot/node/subsystem-bench/src/core/keyring.rs | 1 - polkadot/node/subsystem-bench/src/core/mock/mod.rs | 1 - 11 files changed, 8 insertions(+), 16 deletions(-) diff --git a/bridges/snowbridge/parachain/pallets/outbound-queue/src/test.rs b/bridges/snowbridge/parachain/pallets/outbound-queue/src/test.rs index 0028d75e7b7..454a91d5df5 100644 --- a/bridges/snowbridge/parachain/pallets/outbound-queue/src/test.rs +++ b/bridges/snowbridge/parachain/pallets/outbound-queue/src/test.rs @@ -110,7 +110,7 @@ fn process_message_fails_on_max_nonce_reached() { channel_id, command: mock_message(sibling_id).command, }; - let versioned_queued_message: VersionedQueuedMessage = message.try_into().unwrap(); + let versioned_queued_message: VersionedQueuedMessage = message.into(); let encoded = versioned_queued_message.encode(); let mut meter = WeightMeter::with_limit(Weight::MAX); @@ -134,7 +134,7 @@ fn process_message_fails_on_overweight_message() { channel_id, command: mock_message(sibling_id).command, }; - let versioned_queued_message: VersionedQueuedMessage = message.try_into().unwrap(); + let versioned_queued_message: VersionedQueuedMessage = message.into(); let encoded = versioned_queued_message.encode(); let mut meter = WeightMeter::with_limit(Weight::from_parts(1, 1)); assert_noop!( diff --git a/bridges/snowbridge/parachain/pallets/system/src/lib.rs b/bridges/snowbridge/parachain/pallets/system/src/lib.rs index 0042093ee66..e5077abd921 100644 --- a/bridges/snowbridge/parachain/pallets/system/src/lib.rs +++ b/bridges/snowbridge/parachain/pallets/system/src/lib.rs @@ -79,8 +79,6 @@ use xcm_executor::traits::ConvertLocation; #[cfg(feature = "runtime-benchmarks")] use frame_support::traits::OriginTrait; -pub use pallet::*; - pub type BalanceOf = <::Token as Inspect<::AccountId>>::Balance; pub type AccountIdOf = ::AccountId; diff --git a/bridges/snowbridge/parachain/runtime/tests/src/test_cases.rs b/bridges/snowbridge/parachain/runtime/tests/src/test_cases.rs index 19e45f7a15a..e5a45cdc92b 100644 --- a/bridges/snowbridge/parachain/runtime/tests/src/test_cases.rs +++ b/bridges/snowbridge/parachain/runtime/tests/src/test_cases.rs @@ -12,11 +12,11 @@ use parachains_runtimes_test_utils::{ }; use sp_core::H160; use sp_runtime::SaturatedConversion; -use xcm::latest::prelude::*; +use xcm::{ + latest::prelude::*, + v3::Error::{self, Barrier}, +}; use xcm_executor::XcmExecutor; -// Re-export test_case from `parachains-runtimes-test-utils` -pub use parachains_runtimes_test_utils::test_cases::change_storage_constant_by_governance_works; -use xcm::v3::Error::{self, Barrier}; type RuntimeHelper = parachains_runtimes_test_utils::RuntimeHelper; diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/reap_identity.rs b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/reap_identity.rs index 31144588ef4..81bd7620e46 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/reap_identity.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/reap_identity.rs @@ -88,7 +88,7 @@ impl Identity { }; let (github, discord) = additional .as_ref() - .and_then(|vec| vec.get(0)) + .and_then(|vec| vec.first()) .map(|(g, d)| (g.clone(), d.clone())) .unwrap_or((Data::None, Data::None)); Self { diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/reap_identity.rs b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/reap_identity.rs index c704af281b3..6de2562b278 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/reap_identity.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/reap_identity.rs @@ -88,7 +88,7 @@ impl Identity { }; let (github, discord) = additional .as_ref() - .and_then(|vec| vec.get(0)) + .and_then(|vec| vec.first()) .map(|(g, d)| (g.clone(), d.clone())) .unwrap_or((Data::None, Data::None)); Self { diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/mod.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/mod.rs index 7b17d84ac34..f1050b3ae63 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/mod.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/mod.rs @@ -37,5 +37,4 @@ pub mod xcm; pub use block_weights::constants::BlockExecutionWeight; pub use extrinsic_weights::constants::ExtrinsicBaseWeight; -pub use paritydb_weights::constants::ParityDbWeight; pub use rocksdb_weights::constants::RocksDbWeight; diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/mod.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/mod.rs index 6bc733844e6..28e708f0e2a 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/mod.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/mod.rs @@ -36,5 +36,4 @@ pub mod xcm; pub use block_weights::constants::BlockExecutionWeight; pub use extrinsic_weights::constants::ExtrinsicBaseWeight; -pub use paritydb_weights::constants::ParityDbWeight; pub use rocksdb_weights::constants::RocksDbWeight; diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/weights/mod.rs b/cumulus/parachains/runtimes/people/people-rococo/src/weights/mod.rs index 67e203cfaf5..3396a8caea0 100644 --- a/cumulus/parachains/runtimes/people/people-rococo/src/weights/mod.rs +++ b/cumulus/parachains/runtimes/people/people-rococo/src/weights/mod.rs @@ -36,5 +36,4 @@ pub mod xcm; pub use block_weights::constants::BlockExecutionWeight; pub use extrinsic_weights::constants::ExtrinsicBaseWeight; -pub use paritydb_weights::constants::ParityDbWeight; pub use rocksdb_weights::constants::RocksDbWeight; diff --git a/cumulus/parachains/runtimes/people/people-westend/src/weights/mod.rs b/cumulus/parachains/runtimes/people/people-westend/src/weights/mod.rs index 67e203cfaf5..3396a8caea0 100644 --- a/cumulus/parachains/runtimes/people/people-westend/src/weights/mod.rs +++ b/cumulus/parachains/runtimes/people/people-westend/src/weights/mod.rs @@ -36,5 +36,4 @@ pub mod xcm; pub use block_weights::constants::BlockExecutionWeight; pub use extrinsic_weights::constants::ExtrinsicBaseWeight; -pub use paritydb_weights::constants::ParityDbWeight; pub use rocksdb_weights::constants::RocksDbWeight; diff --git a/polkadot/node/subsystem-bench/src/core/keyring.rs b/polkadot/node/subsystem-bench/src/core/keyring.rs index 2d9aa348a92..68e78069a91 100644 --- a/polkadot/node/subsystem-bench/src/core/keyring.rs +++ b/polkadot/node/subsystem-bench/src/core/keyring.rs @@ -14,7 +14,6 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -pub use sp_core::sr25519; use sp_core::{ sr25519::{Pair, Public}, Pair as PairT, diff --git a/polkadot/node/subsystem-bench/src/core/mock/mod.rs b/polkadot/node/subsystem-bench/src/core/mock/mod.rs index d59642e9605..76fd581c3fb 100644 --- a/polkadot/node/subsystem-bench/src/core/mock/mod.rs +++ b/polkadot/node/subsystem-bench/src/core/mock/mod.rs @@ -23,7 +23,6 @@ pub mod network_bridge; pub mod runtime_api; pub use av_store::*; -pub use network_bridge::*; pub use runtime_api::*; pub struct AlwaysSupportsParachains {} -- GitLab From 930c1519281ac7ec54dba2224f5cdea1d3959b5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Fri, 5 Jan 2024 21:43:26 +0100 Subject: [PATCH 118/191] `cumulus-primitives-parachain-inherent`: Split into two crates (#2803) This splits `cumulus-primitives-parachain-inherent` into two crates, the previous `cumulus-primitives-parachain-inherent` and a new `cumulus-client-parachain-inherent`. The idea behind this is to move the `create_at` logic into the client crate. This removes quite a lot of unrelated dependencies from the runtime std build and thus, makes the compilation faster. On my Laptop the compilation is goes down by one minute for `asset-hub-rococo-runtime`. I also assume that the full build of the entire workspace probably can be speed-up a little bit, because more stuff can be compiled in parallel. --------- Co-authored-by: command-bot <> --- Cargo.lock | 35 +++++++++++++----- Cargo.toml | 1 + cumulus/client/consensus/aura/Cargo.toml | 2 +- cumulus/client/consensus/aura/src/collator.rs | 4 +- cumulus/client/parachain-inherent/Cargo.toml | 30 +++++++++++++++ .../parachain-inherent/src/lib.rs} | 28 ++++---------- .../parachain-inherent/src/mock.rs | 5 ++- cumulus/polkadot-parachain/Cargo.toml | 2 +- cumulus/polkadot-parachain/src/service.rs | 2 +- .../primitives/parachain-inherent/Cargo.toml | 14 ------- .../primitives/parachain-inherent/src/lib.rs | 37 ++++++++++++++----- cumulus/test/service/Cargo.toml | 2 +- cumulus/test/service/src/bench_utils.rs | 2 +- cumulus/test/service/src/lib.rs | 2 +- prdoc/pr_2803.prdoc | 19 ++++++++++ 15 files changed, 122 insertions(+), 63 deletions(-) create mode 100644 cumulus/client/parachain-inherent/Cargo.toml rename cumulus/{primitives/parachain-inherent/src/client_side.rs => client/parachain-inherent/src/lib.rs} (91%) rename cumulus/{primitives => client}/parachain-inherent/src/mock.rs (97%) create mode 100644 prdoc/pr_2803.prdoc diff --git a/Cargo.lock b/Cargo.lock index 466fa26d434..bc80c77ae60 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3626,9 +3626,9 @@ dependencies = [ "cumulus-client-collator", "cumulus-client-consensus-common", "cumulus-client-consensus-proposer", + "cumulus-client-parachain-inherent", "cumulus-primitives-aura", "cumulus-primitives-core", - "cumulus-primitives-parachain-inherent", "cumulus-relay-chain-interface", "futures", "parity-scale-codec", @@ -3760,6 +3760,29 @@ dependencies = [ "url", ] +[[package]] +name = "cumulus-client-parachain-inherent" +version = "0.1.0" +dependencies = [ + "async-trait", + "cumulus-primitives-core", + "cumulus-primitives-parachain-inherent", + "cumulus-relay-chain-interface", + "cumulus-test-relay-sproof-builder", + "parity-scale-codec", + "sc-client-api", + "scale-info", + "sp-api", + "sp-core", + "sp-inherents", + "sp-runtime", + "sp-state-machine", + "sp-std 8.0.0", + "sp-storage 13.0.0", + "sp-trie", + "tracing", +] + [[package]] name = "cumulus-client-pov-recovery" version = "0.1.0" @@ -4033,20 +4056,14 @@ version = "0.1.0" dependencies = [ "async-trait", "cumulus-primitives-core", - "cumulus-relay-chain-interface", - "cumulus-test-relay-sproof-builder", "parity-scale-codec", - "sc-client-api", "scale-info", - "sp-api", "sp-core", "sp-inherents", "sp-runtime", "sp-state-machine", "sp-std 8.0.0", - "sp-storage 13.0.0", "sp-trie", - "tracing", ] [[package]] @@ -4303,11 +4320,11 @@ dependencies = [ "cumulus-client-cli", "cumulus-client-consensus-common", "cumulus-client-consensus-relay-chain", + "cumulus-client-parachain-inherent", "cumulus-client-pov-recovery", "cumulus-client-service", "cumulus-pallet-parachain-system", "cumulus-primitives-core", - "cumulus-primitives-parachain-inherent", "cumulus-relay-chain-inprocess-interface", "cumulus-relay-chain-interface", "cumulus-relay-chain-minimal-node", @@ -13033,10 +13050,10 @@ dependencies = [ "cumulus-client-consensus-common", "cumulus-client-consensus-proposer", "cumulus-client-consensus-relay-chain", + "cumulus-client-parachain-inherent", "cumulus-client-service", "cumulus-primitives-aura", "cumulus-primitives-core", - "cumulus-primitives-parachain-inherent", "cumulus-relay-chain-interface", "frame-benchmarking", "frame-benchmarking-cli", diff --git a/Cargo.toml b/Cargo.toml index a1983a5efd5..231aab8dee9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -57,6 +57,7 @@ members = [ "cumulus/client/consensus/proposer", "cumulus/client/consensus/relay-chain", "cumulus/client/network", + "cumulus/client/parachain-inherent", "cumulus/client/pov-recovery", "cumulus/client/relay-chain-inprocess-interface", "cumulus/client/relay-chain-interface", diff --git a/cumulus/client/consensus/aura/Cargo.toml b/cumulus/client/consensus/aura/Cargo.toml index 4c20911c645..d022fe4df7e 100644 --- a/cumulus/client/consensus/aura/Cargo.toml +++ b/cumulus/client/consensus/aura/Cargo.toml @@ -41,9 +41,9 @@ substrate-prometheus-endpoint = { path = "../../../../substrate/utils/prometheus cumulus-client-consensus-common = { path = "../common" } cumulus-relay-chain-interface = { path = "../../relay-chain-interface" } cumulus-client-consensus-proposer = { path = "../proposer" } +cumulus-client-parachain-inherent = { path = "../../../client/parachain-inherent" } cumulus-primitives-aura = { path = "../../../primitives/aura" } cumulus-primitives-core = { path = "../../../primitives/core" } -cumulus-primitives-parachain-inherent = { path = "../../../primitives/parachain-inherent" } cumulus-client-collator = { path = "../../collator" } # Polkadot diff --git a/cumulus/client/consensus/aura/src/collator.rs b/cumulus/client/consensus/aura/src/collator.rs index 83f82aff96b..db0799235bc 100644 --- a/cumulus/client/consensus/aura/src/collator.rs +++ b/cumulus/client/consensus/aura/src/collator.rs @@ -30,10 +30,10 @@ use cumulus_client_consensus_common::{ self as consensus_common, ParachainBlockImportMarker, ParachainCandidate, }; use cumulus_client_consensus_proposer::ProposerInterface; +use cumulus_client_parachain_inherent::{ParachainInherentData, ParachainInherentDataProvider}; use cumulus_primitives_core::{ relay_chain::Hash as PHash, DigestItem, ParachainBlockData, PersistedValidationData, }; -use cumulus_primitives_parachain_inherent::ParachainInherentData; use cumulus_relay_chain_interface::RelayChainInterface; use polkadot_node_primitives::{Collation, MaybeCompressedPoV}; @@ -124,7 +124,7 @@ where parent_hash: Block::Hash, timestamp: impl Into>, ) -> Result<(ParachainInherentData, InherentData), Box> { - let paras_inherent_data = ParachainInherentData::create_at( + let paras_inherent_data = ParachainInherentDataProvider::create_at( relay_parent, &self.relay_client, validation_data, diff --git a/cumulus/client/parachain-inherent/Cargo.toml b/cumulus/client/parachain-inherent/Cargo.toml new file mode 100644 index 00000000000..b6d477519ec --- /dev/null +++ b/cumulus/client/parachain-inherent/Cargo.toml @@ -0,0 +1,30 @@ +[package] +name = "cumulus-client-parachain-inherent" +version = "0.1.0" +authors.workspace = true +edition.workspace = true +description = "Inherent that needs to be present in every parachain block. Contains messages and a relay chain storage-proof." +license = "Apache-2.0" + +[dependencies] +async-trait = "0.1.73" +codec = { package = "parity-scale-codec", version = "3.0.0", features = ["derive"] } +scale-info = { version = "2.10.0", features = ["derive"] } +tracing = { version = "0.1.37" } + +# Substrate +sc-client-api = { path = "../../../substrate/client/api" } +sp-api = { path = "../../../substrate/primitives/api" } +sp-core = { path = "../../../substrate/primitives/core" } +sp-inherents = { path = "../../../substrate/primitives/inherents" } +sp-runtime = { path = "../../../substrate/primitives/runtime" } +sp-state-machine = { path = "../../../substrate/primitives/state-machine" } +sp-std = { path = "../../../substrate/primitives/std" } +sp-storage = { path = "../../../substrate/primitives/storage" } +sp-trie = { path = "../../../substrate/primitives/trie" } + +# Cumulus +cumulus-primitives-core = { path = "../../primitives/core" } +cumulus-primitives-parachain-inherent = { path = "../../primitives/parachain-inherent" } +cumulus-relay-chain-interface = { path = "../relay-chain-interface" } +cumulus-test-relay-sproof-builder = { path = "../../test/relay-sproof-builder" } diff --git a/cumulus/primitives/parachain-inherent/src/client_side.rs b/cumulus/client/parachain-inherent/src/lib.rs similarity index 91% rename from cumulus/primitives/parachain-inherent/src/client_side.rs rename to cumulus/client/parachain-inherent/src/lib.rs index 52987d2da44..57353638e19 100644 --- a/cumulus/primitives/parachain-inherent/src/client_side.rs +++ b/cumulus/client/parachain-inherent/src/lib.rs @@ -16,7 +16,6 @@ //! Client side code for generating the parachain inherent. -use crate::ParachainInherentData; use codec::Decode; use cumulus_primitives_core::{ relay_chain::{self, Hash as PHash, HrmpChannelId}, @@ -24,6 +23,11 @@ use cumulus_primitives_core::{ }; use cumulus_relay_chain_interface::RelayChainInterface; +mod mock; + +pub use cumulus_primitives_parachain_inherent::{ParachainInherentData, INHERENT_IDENTIFIER}; +pub use mock::{MockValidationDataInherentDataProvider, MockXcmConfig}; + const LOG_TARGET: &str = "parachain-inherent"; /// Collect the relevant relay chain state in form of a proof for putting it into the validation @@ -132,7 +136,9 @@ async fn collect_relay_storage_proof( .ok() } -impl ParachainInherentData { +pub struct ParachainInherentDataProvider; + +impl ParachainInherentDataProvider { /// Create the [`ParachainInherentData`] at the given `relay_parent`. /// /// Returns `None` if the creation failed. @@ -178,21 +184,3 @@ impl ParachainInherentData { }) } } - -#[async_trait::async_trait] -impl sp_inherents::InherentDataProvider for ParachainInherentData { - async fn provide_inherent_data( - &self, - inherent_data: &mut sp_inherents::InherentData, - ) -> Result<(), sp_inherents::Error> { - inherent_data.put_data(crate::INHERENT_IDENTIFIER, &self) - } - - async fn try_handle_error( - &self, - _: &sp_inherents::InherentIdentifier, - _: &[u8], - ) -> Option> { - None - } -} diff --git a/cumulus/primitives/parachain-inherent/src/mock.rs b/cumulus/client/parachain-inherent/src/mock.rs similarity index 97% rename from cumulus/primitives/parachain-inherent/src/mock.rs rename to cumulus/client/parachain-inherent/src/mock.rs index e40cb49acdd..7af10a661e0 100644 --- a/cumulus/primitives/parachain-inherent/src/mock.rs +++ b/cumulus/client/parachain-inherent/src/mock.rs @@ -19,6 +19,7 @@ use codec::Decode; use cumulus_primitives_core::{ relay_chain, InboundDownwardMessage, InboundHrmpMessage, ParaId, PersistedValidationData, }; +use cumulus_primitives_parachain_inherent::MessageQueueChain; use sc_client_api::{Backend, StorageProvider}; use sp_core::twox_128; use sp_inherents::{InherentData, InherentDataProvider}; @@ -168,7 +169,7 @@ impl> InherentDataProvider // Process the downward messages and set up the correct head let mut downward_messages = Vec::new(); - let mut dmq_mqc = crate::MessageQueueChain(self.xcm_config.starting_dmq_mqc_head); + let mut dmq_mqc = MessageQueueChain::new(self.xcm_config.starting_dmq_mqc_head); for msg in &self.raw_downward_messages { let wrapped = InboundDownwardMessage { sent_at: relay_parent_number, msg: msg.clone() }; @@ -188,7 +189,7 @@ impl> InherentDataProvider // Now iterate again, updating the heads as we go for (para_id, messages) in &horizontal_messages { - let mut channel_mqc = crate::MessageQueueChain( + let mut channel_mqc = MessageQueueChain::new( *self .xcm_config .starting_hrmp_mqc_heads diff --git a/cumulus/polkadot-parachain/Cargo.toml b/cumulus/polkadot-parachain/Cargo.toml index 34243f473e8..02d53486710 100644 --- a/cumulus/polkadot-parachain/Cargo.toml +++ b/cumulus/polkadot-parachain/Cargo.toml @@ -102,10 +102,10 @@ cumulus-client-consensus-aura = { path = "../client/consensus/aura" } cumulus-client-consensus-relay-chain = { path = "../client/consensus/relay-chain" } cumulus-client-consensus-common = { path = "../client/consensus/common" } cumulus-client-consensus-proposer = { path = "../client/consensus/proposer" } +cumulus-client-parachain-inherent = { path = "../client/parachain-inherent" } cumulus-client-service = { path = "../client/service" } cumulus-primitives-aura = { path = "../primitives/aura" } cumulus-primitives-core = { path = "../primitives/core" } -cumulus-primitives-parachain-inherent = { path = "../primitives/parachain-inherent" } cumulus-relay-chain-interface = { path = "../client/relay-chain-interface" } color-print = "0.3.4" diff --git a/cumulus/polkadot-parachain/src/service.rs b/cumulus/polkadot-parachain/src/service.rs index d5c12017859..81d0c9d3980 100644 --- a/cumulus/polkadot-parachain/src/service.rs +++ b/cumulus/polkadot-parachain/src/service.rs @@ -1085,7 +1085,7 @@ where let relay_chain_interface = relay_chain_interface.clone(); async move { let parachain_inherent = - cumulus_primitives_parachain_inherent::ParachainInherentData::create_at( + cumulus_client_parachain_inherent::ParachainInherentDataProvider::create_at( relay_parent, &relay_chain_interface, &validation_data, diff --git a/cumulus/primitives/parachain-inherent/Cargo.toml b/cumulus/primitives/parachain-inherent/Cargo.toml index f914af11751..42a425ea176 100644 --- a/cumulus/primitives/parachain-inherent/Cargo.toml +++ b/cumulus/primitives/parachain-inherent/Cargo.toml @@ -13,23 +13,17 @@ workspace = true async-trait = { version = "0.1.74", optional = true } codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -tracing = { version = "0.1.37", optional = true } # Substrate -sc-client-api = { path = "../../../substrate/client/api", optional = true } -sp-api = { path = "../../../substrate/primitives/api", optional = true } sp-core = { path = "../../../substrate/primitives/core", default-features = false } sp-inherents = { path = "../../../substrate/primitives/inherents", default-features = false } sp-runtime = { path = "../../../substrate/primitives/runtime", optional = true } sp-state-machine = { path = "../../../substrate/primitives/state-machine", optional = true } sp-std = { path = "../../../substrate/primitives/std", default-features = false } -sp-storage = { path = "../../../substrate/primitives/storage", optional = true } sp-trie = { path = "../../../substrate/primitives/trie", default-features = false } # Cumulus cumulus-primitives-core = { path = "../core", default-features = false } -cumulus-relay-chain-interface = { path = "../../client/relay-chain-interface", optional = true } -cumulus-test-relay-sproof-builder = { path = "../../test/relay-sproof-builder", optional = true } [features] default = ["std"] @@ -37,17 +31,9 @@ std = [ "async-trait", "codec/std", "cumulus-primitives-core/std", - "cumulus-relay-chain-interface", - "cumulus-test-relay-sproof-builder", - "sc-client-api", "scale-info/std", - "sp-api", "sp-core/std", "sp-inherents/std", - "sp-runtime", - "sp-state-machine", "sp-std/std", - "sp-storage", "sp-trie/std", - "tracing", ] diff --git a/cumulus/primitives/parachain-inherent/src/lib.rs b/cumulus/primitives/parachain-inherent/src/lib.rs index f98c748e82f..75a56693958 100644 --- a/cumulus/primitives/parachain-inherent/src/lib.rs +++ b/cumulus/primitives/parachain-inherent/src/lib.rs @@ -19,11 +19,11 @@ //! The [`ParachainInherentData`] is the data that is passed by the collator to the parachain //! runtime. The runtime will use this data to execute messages from other parachains/the relay //! chain or to read data from the relay chain state. When the parachain is validated by a parachain -//! validator on the relay chain, this data is checked for correctnes. If the data passed by the +//! validator on the relay chain, this data is checked for correctness. If the data passed by the //! collator to the runtime isn't correct, the parachain candidate is considered invalid. //! -//! Use [`ParachainInherentData::create_at`] to create the [`ParachainInherentData`] at a given -//! relay chain block to include it in a parachain block. +//! To create a [`ParachainInherentData`] for a specific relay chain block, there exists the +//! `ParachainInherentDataExt` trait in `cumulus-client-parachain-inherent` that helps with this. #![cfg_attr(not(feature = "std"), no_std)] @@ -36,13 +36,6 @@ use scale_info::TypeInfo; use sp_inherents::InherentIdentifier; use sp_std::{collections::btree_map::BTreeMap, vec::Vec}; -#[cfg(feature = "std")] -mod client_side; -#[cfg(feature = "std")] -mod mock; -#[cfg(feature = "std")] -pub use mock::{MockValidationDataInherentDataProvider, MockXcmConfig}; - /// The identifier for the parachain inherent. pub const INHERENT_IDENTIFIER: InherentIdentifier = *b"sysi1337"; @@ -68,6 +61,25 @@ pub struct ParachainInherentData { pub horizontal_messages: BTreeMap>, } +#[cfg(feature = "std")] +#[async_trait::async_trait] +impl sp_inherents::InherentDataProvider for ParachainInherentData { + async fn provide_inherent_data( + &self, + inherent_data: &mut sp_inherents::InherentData, + ) -> Result<(), sp_inherents::Error> { + inherent_data.put_data(INHERENT_IDENTIFIER, &self) + } + + async fn try_handle_error( + &self, + _: &sp_inherents::InherentIdentifier, + _: &[u8], + ) -> Option> { + None + } +} + /// This struct provides ability to extend a message queue chain (MQC) and compute a new head. /// /// MQC is an instance of a [hash chain] applied to a message queue. Using a hash chain it's @@ -84,6 +96,11 @@ pub struct ParachainInherentData { pub struct MessageQueueChain(RelayHash); impl MessageQueueChain { + /// Create a new instance initialized to `hash`. + pub fn new(hash: RelayHash) -> Self { + Self(hash) + } + /// Extend the hash chain with an HRMP message. This method should be used only when /// this chain is tracking HRMP. pub fn extend_hrmp(&mut self, horizontal_message: &InboundHrmpMessage) -> &mut Self { diff --git a/cumulus/test/service/Cargo.toml b/cumulus/test/service/Cargo.toml index 03040e7a2b6..09403ef1853 100644 --- a/cumulus/test/service/Cargo.toml +++ b/cumulus/test/service/Cargo.toml @@ -71,9 +71,9 @@ cumulus-client-cli = { path = "../../client/cli" } parachains-common = { path = "../../parachains/common" } cumulus-client-consensus-common = { path = "../../client/consensus/common" } cumulus-client-consensus-relay-chain = { path = "../../client/consensus/relay-chain" } +cumulus-client-parachain-inherent = { path = "../../client/parachain-inherent" } cumulus-client-service = { path = "../../client/service" } cumulus-primitives-core = { path = "../../primitives/core" } -cumulus-primitives-parachain-inherent = { path = "../../primitives/parachain-inherent" } cumulus-relay-chain-inprocess-interface = { path = "../../client/relay-chain-inprocess-interface" } cumulus-relay-chain-interface = { path = "../../client/relay-chain-interface" } cumulus-test-runtime = { path = "../runtime" } diff --git a/cumulus/test/service/src/bench_utils.rs b/cumulus/test/service/src/bench_utils.rs index 1894835caec..4ace894b392 100644 --- a/cumulus/test/service/src/bench_utils.rs +++ b/cumulus/test/service/src/bench_utils.rs @@ -19,8 +19,8 @@ use codec::Encode; use sc_block_builder::BlockBuilderBuilder; use crate::{construct_extrinsic, Client as TestClient}; +use cumulus_client_parachain_inherent::ParachainInherentData; use cumulus_primitives_core::{relay_chain::AccountId, PersistedValidationData}; -use cumulus_primitives_parachain_inherent::ParachainInherentData; use cumulus_test_relay_sproof_builder::RelayStateSproofBuilder; use cumulus_test_runtime::{ BalancesCall, GluttonCall, NodeBlock, SudoCall, UncheckedExtrinsic, WASM_BINARY, diff --git a/cumulus/test/service/src/lib.rs b/cumulus/test/service/src/lib.rs index eca65dd4ca0..1de3af1bc9d 100644 --- a/cumulus/test/service/src/lib.rs +++ b/cumulus/test/service/src/lib.rs @@ -447,7 +447,7 @@ where let relay_chain_interface = relay_chain_interface_for_closure.clone(); async move { let parachain_inherent = - cumulus_primitives_parachain_inherent::ParachainInherentData::create_at( + cumulus_client_parachain_inherent::ParachainInherentDataProvider::create_at( relay_parent, &relay_chain_interface, &validation_data, diff --git a/prdoc/pr_2803.prdoc b/prdoc/pr_2803.prdoc new file mode 100644 index 00000000000..1ddd3dd677a --- /dev/null +++ b/prdoc/pr_2803.prdoc @@ -0,0 +1,19 @@ +title: "cumulus-primitives-parachain-inherent: Split into two crates" + +doc: + - audience: Node Dev + description: | + This splits `cumulus-primitives-parachain-inherent` into two crates. The new crate is called + `cumulus-client-parachain-inherent`. This is done to improve the compile time for runtimes, + as they are not required anymore to pull in half of the node side at compile time. + + To migrate your code you need to change + `cumulus_primitives_parachain_inherent::ParachainInherentData::create_at` to + `cumulus_client_parachain_inherent::ParachainInherentDataProvider::create_at`. + Any other code should be compatible. The mocking code also moved to the new client crate and + you may need to adapt your imports accordingly. Generally, replacing the old crate with the new + crate fix most compile errors resulting from this pull request. + +crates: + - name: "cumulus-primitives-parachain-inherent" + - name: "cumulus-client-parachain-inherent" -- GitLab From 2e4b8996c4924fc39f85198019039cf0987f89ec Mon Sep 17 00:00:00 2001 From: Serban Iorga Date: Sat, 6 Jan 2024 12:18:38 +0100 Subject: [PATCH 119/191] Kitchensink chain: Add BEEFY support (#2856) Related to https://github.com/paritytech/polkadot-sdk/issues/2787 Adding BEEFY support to the kitchensink chain in order to be able to extend the current warp sync zombienet tests with BEEFY enabled --- Cargo.lock | 9 + polkadot/runtime/rococo/src/lib.rs | 13 -- polkadot/runtime/westend/src/lib.rs | 13 -- substrate/bin/node/cli/Cargo.toml | 4 + substrate/bin/node/cli/src/chain_spec.rs | 54 +++++- substrate/bin/node/cli/src/service.rs | 167 ++++++++++++++---- .../cli/tests/res/default_genesis_config.json | 4 + substrate/bin/node/rpc/Cargo.toml | 2 + substrate/bin/node/rpc/src/lib.rs | 28 ++- substrate/bin/node/runtime/Cargo.toml | 8 + substrate/bin/node/runtime/src/lib.rs | 76 +++++++- substrate/bin/node/testing/src/genesis.rs | 13 +- substrate/bin/node/testing/src/keyring.rs | 20 +-- .../primitives/consensus/beefy/src/mmr.rs | 2 +- 14 files changed, 320 insertions(+), 93 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bc80c77ae60..23a0bf8fd35 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7048,6 +7048,8 @@ dependencies = [ "pallet-babe", "pallet-bags-list", "pallet-balances", + "pallet-beefy", + "pallet-beefy-mmr", "pallet-bounties", "pallet-broker", "pallet-child-bounties", @@ -7121,6 +7123,7 @@ dependencies = [ "sp-authority-discovery", "sp-block-builder", "sp-consensus-babe", + "sp-consensus-beefy", "sp-consensus-grandpa", "sp-core", "sp-genesis-builder", @@ -8619,6 +8622,8 @@ dependencies = [ "sc-client-api", "sc-consensus-babe", "sc-consensus-babe-rpc", + "sc-consensus-beefy", + "sc-consensus-beefy-rpc", "sc-consensus-grandpa", "sc-consensus-grandpa-rpc", "sc-mixnet", @@ -19091,6 +19096,7 @@ dependencies = [ "jsonrpsee", "kitchensink-runtime", "log", + "mmr-gadget", "nix 0.26.2", "node-primitives", "node-rpc", @@ -19121,6 +19127,7 @@ dependencies = [ "sc-client-db", "sc-consensus", "sc-consensus-babe", + "sc-consensus-beefy", "sc-consensus-epochs", "sc-consensus-grandpa", "sc-consensus-slots", @@ -19152,6 +19159,7 @@ dependencies = [ "sp-blockchain", "sp-consensus", "sp-consensus-babe", + "sp-consensus-beefy", "sp-consensus-grandpa", "sp-core", "sp-externalities 0.19.0", @@ -19160,6 +19168,7 @@ dependencies = [ "sp-keyring", "sp-keystore", "sp-mixnet", + "sp-mmr-primitives", "sp-runtime", "sp-state-machine", "sp-statement-store", diff --git a/polkadot/runtime/rococo/src/lib.rs b/polkadot/runtime/rococo/src/lib.rs index 4d0e537f6db..67caa347bc3 100644 --- a/polkadot/runtime/rococo/src/lib.rs +++ b/polkadot/runtime/rococo/src/lib.rs @@ -1237,19 +1237,6 @@ impl pallet_mmr::Config for Runtime { } parameter_types! { - /// Version of the produced MMR leaf. - /// - /// The version consists of two parts; - /// - `major` (3 bits) - /// - `minor` (5 bits) - /// - /// `major` should be updated only if decoding the previous MMR Leaf format from the payload - /// is not possible (i.e. backward incompatible change). - /// `minor` should be updated if fields are added to the previous MMR Leaf, which given SCALE - /// encoding does not prevent old leafs from being decoded. - /// - /// Hence we expect `major` to be changed really rarely (think never). - /// See [`MmrLeafVersion`] type documentation for more details. pub LeafVersion: MmrLeafVersion = MmrLeafVersion::new(0, 0); } diff --git a/polkadot/runtime/westend/src/lib.rs b/polkadot/runtime/westend/src/lib.rs index fb54bec509b..e0b9fd0fb53 100644 --- a/polkadot/runtime/westend/src/lib.rs +++ b/polkadot/runtime/westend/src/lib.rs @@ -342,19 +342,6 @@ mod mmr { } parameter_types! { - /// Version of the produced MMR leaf. - /// - /// The version consists of two parts; - /// - `major` (3 bits) - /// - `minor` (5 bits) - /// - /// `major` should be updated only if decoding the previous MMR Leaf format from the payload - /// is not possible (i.e. backward incompatible change). - /// `minor` should be updated if fields are added to the previous MMR Leaf, which given SCALE - /// encoding does not prevent old leafs from being decoded. - /// - /// Hence we expect `major` to be changed really rarely (think never). - /// See [`MmrLeafVersion`] type documentation for more details. pub LeafVersion: MmrLeafVersion = MmrLeafVersion::new(0, 0); } diff --git a/substrate/bin/node/cli/Cargo.toml b/substrate/bin/node/cli/Cargo.toml index a01c35a3b63..35d632865ee 100644 --- a/substrate/bin/node/cli/Cargo.toml +++ b/substrate/bin/node/cli/Cargo.toml @@ -52,6 +52,7 @@ rand = "0.8" # primitives sp-authority-discovery = { path = "../../../primitives/authority-discovery" } sp-consensus-babe = { path = "../../../primitives/consensus/babe" } +beefy-primitives = { package = "sp-consensus-beefy", path = "../../../primitives/consensus/beefy" } grandpa-primitives = { package = "sp-consensus-grandpa", path = "../../../primitives/consensus/grandpa" } sp-api = { path = "../../../primitives/api" } sp-core = { path = "../../../primitives/core" } @@ -64,6 +65,7 @@ sp-consensus = { path = "../../../primitives/consensus/common" } sp-transaction-storage-proof = { path = "../../../primitives/transaction-storage-proof" } sp-io = { path = "../../../primitives/io" } sp-mixnet = { path = "../../../primitives/mixnet" } +sp-mmr-primitives = { path = "../../../primitives/merkle-mountain-range" } sp-statement-store = { path = "../../../primitives/statement-store" } # client dependencies @@ -79,7 +81,9 @@ sc-network-sync = { path = "../../../client/network/sync" } sc-network-statement = { path = "../../../client/network/statement" } sc-consensus-slots = { path = "../../../client/consensus/slots" } sc-consensus-babe = { path = "../../../client/consensus/babe" } +beefy = { package = "sc-consensus-beefy", path = "../../../client/consensus/beefy" } grandpa = { package = "sc-consensus-grandpa", path = "../../../client/consensus/grandpa" } +mmr-gadget = { path = "../../../client/merkle-mountain-range" } sc-rpc = { path = "../../../client/rpc" } sc-basic-authorship = { path = "../../../client/basic-authorship" } sc-service = { path = "../../../client/service", default-features = false } diff --git a/substrate/bin/node/cli/src/chain_spec.rs b/substrate/bin/node/cli/src/chain_spec.rs index 3559348d188..b6e8fb8a14e 100644 --- a/substrate/bin/node/cli/src/chain_spec.rs +++ b/substrate/bin/node/cli/src/chain_spec.rs @@ -18,6 +18,7 @@ //! Substrate chain configurations. +use beefy_primitives::ecdsa_crypto::AuthorityId as BeefyId; use grandpa_primitives::AuthorityId as GrandpaId; use kitchensink_runtime::{ constants::currency::*, wasm_binary_unwrap, Block, MaxNominations, SessionKeys, StakerStatus, @@ -73,23 +74,37 @@ fn session_keys( im_online: ImOnlineId, authority_discovery: AuthorityDiscoveryId, mixnet: MixnetId, + beefy: BeefyId, ) -> SessionKeys { - SessionKeys { grandpa, babe, im_online, authority_discovery, mixnet } + SessionKeys { grandpa, babe, im_online, authority_discovery, mixnet, beefy } } fn configure_accounts_for_staging_testnet() -> ( - Vec<(AccountId, AccountId, GrandpaId, BabeId, ImOnlineId, AuthorityDiscoveryId, MixnetId)>, + Vec<( + AccountId, + AccountId, + GrandpaId, + BabeId, + ImOnlineId, + AuthorityDiscoveryId, + MixnetId, + BeefyId, + )>, AccountId, Vec, ) { #[rustfmt::skip] - // stash, controller, session-key + // stash, controller, session-key, beefy id // generated with secret: // for i in 1 2 3 4 ; do for j in stash controller; do subkey inspect "$secret"/fir/$j/$i; done; done // // and // - // for i in 1 2 3 4 ; do for j in session; do subkey --ed25519 inspect "$secret"//fir//$j//$i; done; done + // for i in 1 2 3 4 ; do for j in session; do subkey inspect --scheme ed25519 "$secret"//fir//$j//$i; done; done + // + // and + // + // for i in 1 2 3 4 ; do for j in session; do subkey inspect --scheme ecdsa "$secret"//fir//$j//$i; done; done let initial_authorities: Vec<( AccountId, @@ -99,6 +114,7 @@ fn configure_accounts_for_staging_testnet() -> ( ImOnlineId, AuthorityDiscoveryId, MixnetId, + BeefyId, )> = vec![ ( // 5Fbsd6WXDGiLTxunqeK5BATNiocfCqu9bS1yArVjCgeBLkVy @@ -120,6 +136,9 @@ fn configure_accounts_for_staging_testnet() -> ( // 5EZaeQ8djPcq9pheJUhgerXQZt9YaHnMJpiHMRhwQeinqUW8 array_bytes::hex2array_unchecked("6e7e4eb42cbd2e0ab4cae8708ce5509580b8c04d11f6758dbf686d50fe9f9106") .unchecked_into(), + // 5DMLFcDdLLQbw696YfHaWBpQR99HwR456ycSCfr6L7KXGYK8 + array_bytes::hex2array_unchecked("035560fafa241739869360aa4b32bc98953172ceb41a19c6cc1a27962fb3d1ecec") + .unchecked_into(), ), ( // 5ERawXCzCWkjVq3xz1W5KGNtVx2VdefvZ62Bw1FEuZW4Vny2 @@ -141,6 +160,9 @@ fn configure_accounts_for_staging_testnet() -> ( // 5DhLtiaQd1L1LU9jaNeeu9HJkP6eyg3BwXA7iNMzKm7qqruQ array_bytes::hex2array_unchecked("482dbd7297a39fa145c570552249c2ca9dd47e281f0c500c971b59c9dcdcd82e") .unchecked_into(), + // 5FYk11kNtB4178wLKJ2RNoUzzcjgRUciFe3SJDVZXhqX4dzG + array_bytes::hex2array_unchecked("02da1ab255ed888ee3e19b73d335fc13160b3eb10456c2d17c6a8ea7de403d2445") + .unchecked_into(), ), ( // 5DyVtKWPidondEu8iHZgi6Ffv9yrJJ1NDNLom3X9cTDi98qp @@ -162,6 +184,9 @@ fn configure_accounts_for_staging_testnet() -> ( // 5DhKqkHRkndJu8vq7pi2Q5S3DfftWJHGxbEUNH43b46qNspH array_bytes::hex2array_unchecked("482a3389a6cf42d8ed83888cfd920fec738ea30f97e44699ada7323f08c3380a") .unchecked_into(), + // 5GQx4FToRBPqfani6o7owFJE1UstiviqbPP7HPWyvtXWWukn + array_bytes::hex2array_unchecked("036a818b3f59579c5fbbe4fede64f49dbf090ba883eb2a175d5ca90e5adb5f0b3e") + .unchecked_into(), ), ( // 5HYZnKWe5FVZQ33ZRJK1rG3WaLMztxWrrNDb1JRwaHHVWyP9 @@ -183,6 +208,9 @@ fn configure_accounts_for_staging_testnet() -> ( // 5C4vDQxA8LTck2xJEy4Yg1hM9qjDt4LvTQaMo4Y8ne43aU6x array_bytes::hex2array_unchecked("00299981a2b92f878baaf5dbeba5c18d4e70f2a1fcd9c61b32ea18daf38f4378") .unchecked_into(), + // 5FCu2pY928VVHPgnNVJssvxFJZECyNe1CyH3WTG79Wisx58B + array_bytes::hex2array_unchecked("020ce02b963548f9f8ade8765f7a4a06638c17819c78422a1cc35b647873583eef") + .unchecked_into(), ), ]; @@ -234,7 +262,8 @@ where /// Helper function to generate stash, controller and session key from seed. pub fn authority_keys_from_seed( seed: &str, -) -> (AccountId, AccountId, GrandpaId, BabeId, ImOnlineId, AuthorityDiscoveryId, MixnetId) { +) -> (AccountId, AccountId, GrandpaId, BabeId, ImOnlineId, AuthorityDiscoveryId, MixnetId, BeefyId) +{ ( get_account_id_from_seed::(&format!("{}//stash", seed)), get_account_id_from_seed::(seed), @@ -243,6 +272,7 @@ pub fn authority_keys_from_seed( get_from_seed::(seed), get_from_seed::(seed), get_from_seed::(seed), + get_from_seed::(seed), ) } @@ -255,12 +285,22 @@ fn configure_accounts( ImOnlineId, AuthorityDiscoveryId, MixnetId, + BeefyId, )>, initial_nominators: Vec, endowed_accounts: Option>, stash: Balance, ) -> ( - Vec<(AccountId, AccountId, GrandpaId, BabeId, ImOnlineId, AuthorityDiscoveryId, MixnetId)>, + Vec<( + AccountId, + AccountId, + GrandpaId, + BabeId, + ImOnlineId, + AuthorityDiscoveryId, + MixnetId, + BeefyId, + )>, Vec, usize, Vec<(AccountId, AccountId, Balance, StakerStatus)>, @@ -326,6 +366,7 @@ pub fn testnet_genesis( ImOnlineId, AuthorityDiscoveryId, MixnetId, + BeefyId, )>, initial_nominators: Vec, root_key: AccountId, @@ -351,6 +392,7 @@ pub fn testnet_genesis( x.4.clone(), x.5.clone(), x.6.clone(), + x.7.clone(), ), ) }) diff --git a/substrate/bin/node/cli/src/service.rs b/substrate/bin/node/cli/src/service.rs index 4f8c6198cdc..5e6e794f732 100644 --- a/substrate/bin/node/cli/src/service.rs +++ b/substrate/bin/node/cli/src/service.rs @@ -63,6 +63,8 @@ type FullBackend = sc_service::TFullBackend; type FullSelectChain = sc_consensus::LongestChain; type FullGrandpaBlockImport = grandpa::GrandpaBlockImport; +type FullBeefyBlockImport = + beefy::import::BeefyBlockImport; /// The transaction pool type definition. pub type TransactionPool = sc_transaction_pool::FullPool; @@ -165,9 +167,14 @@ pub fn new_partial( sc_rpc::SubscriptionTaskExecutor, ) -> Result, sc_service::Error>, ( - sc_consensus_babe::BabeBlockImport, + sc_consensus_babe::BabeBlockImport< + Block, + FullClient, + FullBeefyBlockImport, + >, grandpa::LinkHalf, sc_consensus_babe::BabeLink, + beefy::BeefyVoterLinks, ), grandpa::SharedVoterState, Option, @@ -222,9 +229,17 @@ pub fn new_partial( )?; let justification_import = grandpa_block_import.clone(); + let (beefy_block_import, beefy_voter_links, beefy_rpc_links) = + beefy::beefy_block_import_and_links( + grandpa_block_import, + backend.clone(), + client.clone(), + config.prometheus_registry().cloned(), + ); + let (block_import, babe_link) = sc_consensus_babe::block_import( sc_consensus_babe::configuration(&*client)?, - grandpa_block_import, + beefy_block_import, client.clone(), )?; @@ -253,7 +268,7 @@ pub fn new_partial( offchain_tx_pool_factory: OffchainTransactionPoolFactory::new(transaction_pool.clone()), })?; - let import_setup = (block_import, grandpa_link, babe_link); + let import_setup = (block_import, grandpa_link, babe_link, beefy_voter_links); let statement_store = sc_statement_store::Store::new_shared( &config.data_path, @@ -268,7 +283,7 @@ pub fn new_partial( let (mixnet_api, mixnet_api_backend) = mixnet_config.map(sc_mixnet::Api::new).unzip(); let (rpc_extensions_builder, rpc_setup) = { - let (_, grandpa_link, _) = &import_setup; + let (_, grandpa_link, _, _) = &import_setup; let justification_stream = grandpa_link.justification_stream(); let shared_authority_set = grandpa_link.shared_authority_set().clone(); @@ -288,31 +303,41 @@ pub fn new_partial( let rpc_backend = backend.clone(); let rpc_statement_store = statement_store.clone(); - let rpc_extensions_builder = move |deny_unsafe, subscription_executor| { - let deps = node_rpc::FullDeps { - client: client.clone(), - pool: pool.clone(), - select_chain: select_chain.clone(), - chain_spec: chain_spec.cloned_box(), - deny_unsafe, - babe: node_rpc::BabeDeps { - keystore: keystore.clone(), - babe_worker_handle: babe_worker_handle.clone(), - }, - grandpa: node_rpc::GrandpaDeps { - shared_voter_state: shared_voter_state.clone(), - shared_authority_set: shared_authority_set.clone(), - justification_stream: justification_stream.clone(), - subscription_executor, - finality_provider: finality_proof_provider.clone(), - }, - statement_store: rpc_statement_store.clone(), - backend: rpc_backend.clone(), - mixnet_api: mixnet_api.as_ref().cloned(), - }; + let rpc_extensions_builder = + move |deny_unsafe, subscription_executor: node_rpc::SubscriptionTaskExecutor| { + let deps = node_rpc::FullDeps { + client: client.clone(), + pool: pool.clone(), + select_chain: select_chain.clone(), + chain_spec: chain_spec.cloned_box(), + deny_unsafe, + babe: node_rpc::BabeDeps { + keystore: keystore.clone(), + babe_worker_handle: babe_worker_handle.clone(), + }, + grandpa: node_rpc::GrandpaDeps { + shared_voter_state: shared_voter_state.clone(), + shared_authority_set: shared_authority_set.clone(), + justification_stream: justification_stream.clone(), + subscription_executor: subscription_executor.clone(), + finality_provider: finality_proof_provider.clone(), + }, + beefy: node_rpc::BeefyDeps { + beefy_finality_proof_stream: beefy_rpc_links + .from_voter_justif_stream + .clone(), + beefy_best_block_stream: beefy_rpc_links + .from_voter_best_beefy_stream + .clone(), + subscription_executor, + }, + statement_store: rpc_statement_store.clone(), + backend: rpc_backend.clone(), + mixnet_api: mixnet_api.as_ref().cloned(), + }; - node_rpc::create_full(deps).map_err(Into::into) - }; + node_rpc::create_full(deps).map_err(Into::into) + }; (rpc_extensions_builder, shared_voter_state2) }; @@ -358,10 +383,24 @@ pub fn new_full_base( mixnet_config: Option, disable_hardware_benchmarks: bool, with_startup_data: impl FnOnce( - &sc_consensus_babe::BabeBlockImport, + &sc_consensus_babe::BabeBlockImport< + Block, + FullClient, + FullBeefyBlockImport, + >, &sc_consensus_babe::BabeLink, ), ) -> Result { + let is_offchain_indexing_enabled = config.offchain_worker.indexing_enabled; + let role = config.role.clone(); + let force_authoring = config.force_authoring; + let backoff_authoring_blocks = + Some(sc_consensus_slots::BackoffAuthoringOnFinalizedHeadLagging::default()); + let name = config.network.node_name.clone(); + let enable_grandpa = !config.disable_grandpa; + let prometheus_registry = config.prometheus_registry().cloned(); + let enable_offchain_worker = config.offchain_worker.enabled; + let hwbench = (!disable_hardware_benchmarks) .then_some(config.database.path().map(|database_path| { let _ = std::fs::create_dir_all(&database_path); @@ -391,6 +430,24 @@ pub fn new_full_base( grandpa::grandpa_peers_set_config(grandpa_protocol_name.clone()); net_config.add_notification_protocol(grandpa_protocol_config); + let beefy_gossip_proto_name = + beefy::gossip_protocol_name(&genesis_hash, config.chain_spec.fork_id()); + // `beefy_on_demand_justifications_handler` is given to `beefy-gadget` task to be run, + // while `beefy_req_resp_cfg` is added to `config.network.request_response_protocols`. + let (beefy_on_demand_justifications_handler, beefy_req_resp_cfg) = + beefy::communication::request_response::BeefyJustifsRequestHandler::new( + &genesis_hash, + config.chain_spec.fork_id(), + client.clone(), + prometheus_registry.clone(), + ); + + let (beefy_notification_config, beefy_notification_service) = + beefy::communication::beefy_peers_set_config(beefy_gossip_proto_name.clone()); + + net_config.add_notification_protocol(beefy_notification_config); + net_config.add_request_response_protocol(beefy_req_resp_cfg); + let (statement_handler_proto, statement_config) = sc_network_statement::StatementHandlerPrototype::new( genesis_hash, @@ -442,15 +499,6 @@ pub fn new_full_base( task_manager.spawn_handle().spawn("mixnet", None, mixnet); } - let role = config.role.clone(); - let force_authoring = config.force_authoring; - let backoff_authoring_blocks = - Some(sc_consensus_slots::BackoffAuthoringOnFinalizedHeadLagging::default()); - let name = config.network.node_name.clone(); - let enable_grandpa = !config.disable_grandpa; - let prometheus_registry = config.prometheus_registry().cloned(); - let enable_offchain_worker = config.offchain_worker.enabled; - let rpc_handlers = sc_service::spawn_tasks(sc_service::SpawnTasksParams { config, backend: backend.clone(), @@ -488,7 +536,7 @@ pub fn new_full_base( } } - let (block_import, grandpa_link, babe_link) = import_setup; + let (block_import, grandpa_link, babe_link, beefy_links) = import_setup; (with_startup_data)(&block_import, &babe_link); @@ -582,6 +630,47 @@ pub fn new_full_base( // need a keystore, regardless of which protocol we use below. let keystore = if role.is_authority() { Some(keystore_container.keystore()) } else { None }; + // beefy is enabled if its notification service exists + let network_params = beefy::BeefyNetworkParams { + network: network.clone(), + sync: sync_service.clone(), + gossip_protocol_name: beefy_gossip_proto_name, + justifications_protocol_name: beefy_on_demand_justifications_handler.protocol_name(), + notification_service: beefy_notification_service, + _phantom: core::marker::PhantomData::, + }; + let beefy_params = beefy::BeefyParams { + client: client.clone(), + backend: backend.clone(), + payload_provider: beefy_primitives::mmr::MmrRootProvider::new(client.clone()), + runtime: client.clone(), + key_store: keystore.clone(), + network_params, + min_block_delta: 8, + prometheus_registry: prometheus_registry.clone(), + links: beefy_links, + on_demand_justifications_handler: beefy_on_demand_justifications_handler, + }; + + let beefy_gadget = beefy::start_beefy_gadget::<_, _, _, _, _, _, _>(beefy_params); + // BEEFY is part of consensus, if it fails we'll bring the node down with it to make sure it + // is noticed. + task_manager + .spawn_essential_handle() + .spawn_blocking("beefy-gadget", None, beefy_gadget); + // When offchain indexing is enabled, MMR gadget should also run. + if is_offchain_indexing_enabled { + task_manager.spawn_essential_handle().spawn_blocking( + "mmr-gadget", + None, + mmr_gadget::MmrGadget::start( + client.clone(), + backend.clone(), + sp_mmr_primitives::INDEXING_PREFIX.to_vec(), + ), + ); + } + let grandpa_config = grandpa::Config { // FIXME #1578 make this available through chainspec gossip_duration: std::time::Duration::from_millis(333), diff --git a/substrate/bin/node/cli/tests/res/default_genesis_config.json b/substrate/bin/node/cli/tests/res/default_genesis_config.json index caf12a443d3..1465a6497ca 100644 --- a/substrate/bin/node/cli/tests/res/default_genesis_config.json +++ b/substrate/bin/node/cli/tests/res/default_genesis_config.json @@ -45,6 +45,10 @@ "grandpa": { "authorities": [] }, + "beefy": { + "authorities": [], + "genesisBlock": 1 + }, "treasury": {}, "sudo": { "key": null diff --git a/substrate/bin/node/rpc/Cargo.toml b/substrate/bin/node/rpc/Cargo.toml index a4a361fadbc..66bd6e9a0a5 100644 --- a/substrate/bin/node/rpc/Cargo.toml +++ b/substrate/bin/node/rpc/Cargo.toml @@ -24,6 +24,8 @@ sc-chain-spec = { path = "../../../client/chain-spec" } sc-client-api = { path = "../../../client/api" } sc-consensus-babe = { path = "../../../client/consensus/babe" } sc-consensus-babe-rpc = { path = "../../../client/consensus/babe/rpc" } +sc-consensus-beefy = { path = "../../../client/consensus/beefy" } +sc-consensus-beefy-rpc = { path = "../../../client/consensus/beefy/rpc" } sc-consensus-grandpa = { path = "../../../client/consensus/grandpa" } sc-consensus-grandpa-rpc = { path = "../../../client/consensus/grandpa/rpc" } sc-mixnet = { path = "../../../client/mixnet" } diff --git a/substrate/bin/node/rpc/src/lib.rs b/substrate/bin/node/rpc/src/lib.rs index acc58777e91..4646524a25b 100644 --- a/substrate/bin/node/rpc/src/lib.rs +++ b/substrate/bin/node/rpc/src/lib.rs @@ -37,10 +37,13 @@ use jsonrpsee::RpcModule; use node_primitives::{AccountId, Balance, Block, BlockNumber, Hash, Nonce}; use sc_client_api::AuxStore; use sc_consensus_babe::BabeWorkerHandle; +use sc_consensus_beefy::communication::notification::{ + BeefyBestBlockStream, BeefyVersionedFinalityProofStream, +}; use sc_consensus_grandpa::{ FinalityProofProvider, GrandpaJustificationStream, SharedAuthoritySet, SharedVoterState, }; -use sc_rpc::SubscriptionTaskExecutor; +pub use sc_rpc::SubscriptionTaskExecutor; pub use sc_rpc_api::DenyUnsafe; use sc_transaction_pool_api::TransactionPool; use sp_api::ProvideRuntimeApi; @@ -72,6 +75,16 @@ pub struct GrandpaDeps { pub finality_provider: Arc>, } +/// Dependencies for BEEFY +pub struct BeefyDeps { + /// Receives notifications about finality proof events from BEEFY. + pub beefy_finality_proof_stream: BeefyVersionedFinalityProofStream, + /// Receives notifications about best block events from BEEFY. + pub beefy_best_block_stream: BeefyBestBlockStream, + /// Executor to drive the subscription manager in the BEEFY RPC handler. + pub subscription_executor: SubscriptionTaskExecutor, +} + /// Full client dependencies. pub struct FullDeps { /// The client instance to use. @@ -88,6 +101,8 @@ pub struct FullDeps { pub babe: BabeDeps, /// GRANDPA specific dependencies. pub grandpa: GrandpaDeps, + /// BEEFY specific dependencies. + pub beefy: BeefyDeps, /// Shared statement store reference. pub statement_store: Arc, /// The backend used by the node. @@ -106,6 +121,7 @@ pub fn create_full( deny_unsafe, babe, grandpa, + beefy, statement_store, backend, mixnet_api, @@ -133,6 +149,7 @@ where use mmr_rpc::{Mmr, MmrApiServer}; use pallet_transaction_payment_rpc::{TransactionPayment, TransactionPaymentApiServer}; use sc_consensus_babe_rpc::{Babe, BabeApiServer}; + use sc_consensus_beefy_rpc::{Beefy, BeefyApiServer}; use sc_consensus_grandpa_rpc::{Grandpa, GrandpaApiServer}; use sc_rpc::{ dev::{Dev, DevApiServer}, @@ -205,5 +222,14 @@ where io.merge(mixnet)?; } + io.merge( + Beefy::::new( + beefy.beefy_finality_proof_stream, + beefy.beefy_best_block_stream, + beefy.subscription_executor, + )? + .into_rpc(), + )?; + Ok(io) } diff --git a/substrate/bin/node/runtime/Cargo.toml b/substrate/bin/node/runtime/Cargo.toml index 5f77f72af49..93695912c52 100644 --- a/substrate/bin/node/runtime/Cargo.toml +++ b/substrate/bin/node/runtime/Cargo.toml @@ -34,6 +34,7 @@ primitive-types = { version = "0.12.0", default-features = false, features = ["c # primitives sp-authority-discovery = { path = "../../../primitives/authority-discovery", default-features = false, features = ["serde"] } sp-consensus-babe = { path = "../../../primitives/consensus/babe", default-features = false, features = ["serde"] } +sp-consensus-beefy = { path = "../../../primitives/consensus/beefy", default-features = false } sp-consensus-grandpa = { path = "../../../primitives/consensus/grandpa", default-features = false, features = ["serde"] } sp-block-builder = { path = "../../../primitives/block-builder", default-features = false } sp-genesis-builder = { default-features = false, path = "../../../primitives/genesis-builder" } @@ -72,6 +73,8 @@ pallet-authorship = { path = "../../../frame/authorship", default-features = fal pallet-babe = { path = "../../../frame/babe", default-features = false } pallet-bags-list = { path = "../../../frame/bags-list", default-features = false } pallet-balances = { path = "../../../frame/balances", default-features = false } +pallet-beefy = { path = "../../../frame/beefy", default-features = false } +pallet-beefy-mmr = { path = "../../../frame/beefy-mmr", default-features = false } pallet-bounties = { path = "../../../frame/bounties", default-features = false } pallet-broker = { path = "../../../frame/broker", default-features = false } pallet-child-bounties = { path = "../../../frame/child-bounties", default-features = false } @@ -170,6 +173,8 @@ std = [ "pallet-babe/std", "pallet-bags-list/std", "pallet-balances/std", + "pallet-beefy-mmr/std", + "pallet-beefy/std", "pallet-bounties/std", "pallet-broker/std", "pallet-child-bounties/std", @@ -241,6 +246,7 @@ std = [ "sp-authority-discovery/std", "sp-block-builder/std", "sp-consensus-babe/std", + "sp-consensus-beefy/std", "sp-consensus-grandpa/std", "sp-core/std", "sp-genesis-builder/std", @@ -349,6 +355,8 @@ try-runtime = [ "pallet-babe/try-runtime", "pallet-bags-list/try-runtime", "pallet-balances/try-runtime", + "pallet-beefy-mmr/try-runtime", + "pallet-beefy/try-runtime", "pallet-bounties/try-runtime", "pallet-broker/try-runtime", "pallet-child-bounties/try-runtime", diff --git a/substrate/bin/node/runtime/src/lib.rs b/substrate/bin/node/runtime/src/lib.rs index 4d409a791ba..6e7bfb4f4b4 100644 --- a/substrate/bin/node/runtime/src/lib.rs +++ b/substrate/bin/node/runtime/src/lib.rs @@ -75,6 +75,10 @@ use pallet_transaction_payment::{FeeDetails, RuntimeDispatchInfo}; use pallet_tx_pause::RuntimeCallNameOf; use sp_api::impl_runtime_apis; use sp_authority_discovery::AuthorityId as AuthorityDiscoveryId; +use sp_consensus_beefy::{ + ecdsa_crypto::{AuthorityId as BeefyId, Signature as BeefySignature}, + mmr::MmrLeafVersion, +}; use sp_consensus_grandpa::AuthorityId as GrandpaId; use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; use sp_inherents::{CheckInherentsResult, InherentData}; @@ -131,7 +135,7 @@ include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); /// Max size for serialized extrinsic params for this testing runtime. /// This is a quite arbitrary but empirically battle tested value. #[cfg(test)] -pub const CALL_PARAMS_MAX_SIZE: usize = 208; +pub const CALL_PARAMS_MAX_SIZE: usize = 244; /// Wasm binary unwrapped. If built with `SKIP_WASM_BUILD`, the function panics. #[cfg(feature = "std")] @@ -602,6 +606,7 @@ impl_opaque_keys! { pub im_online: ImOnline, pub authority_discovery: AuthorityDiscovery, pub mixnet: Mixnet, + pub beefy: Beefy, } } @@ -1573,6 +1578,17 @@ impl pallet_mmr::Config for Runtime { type WeightInfo = (); } +parameter_types! { + pub LeafVersion: MmrLeafVersion = MmrLeafVersion::new(0, 0); +} + +impl pallet_beefy_mmr::Config for Runtime { + type LeafVersion = LeafVersion; + type BeefyAuthorityToMerkleLeaf = pallet_beefy_mmr::BeefyEcdsaToEthereum; + type LeafExtra = Vec; + type BeefyDataProvider = (); +} + parameter_types! { pub const LotteryPalletId: PalletId = PalletId(*b"py/lotto"); pub const MaxCalls: u32 = 10; @@ -2077,6 +2093,11 @@ construct_runtime!( AssetConversionTxPayment: pallet_asset_conversion_tx_payment, ElectionProviderMultiPhase: pallet_election_provider_multi_phase, Staking: pallet_staking, + Beefy: pallet_beefy::{Pallet, Call, Storage, Config, ValidateUnsigned}, + // MMR leaf construction must be before session in order to have leaf contents + // refer to block consistently. see substrate issue #11797 for details. + Mmr: pallet_mmr::{Pallet, Storage}, + MmrLeaf: pallet_beefy_mmr::{Pallet, Storage}, Session: pallet_session, Democracy: pallet_democracy, Council: pallet_collective::, @@ -2106,7 +2127,6 @@ construct_runtime!( Tips: pallet_tips, Assets: pallet_assets::, PoolAssets: pallet_assets::, - Mmr: pallet_mmr, Lottery: pallet_lottery, Nis: pallet_nis, Uniques: pallet_uniques, @@ -2202,6 +2222,22 @@ type EventRecord = frame_system::EventRecord< ::Hash, >; +parameter_types! { + pub const BeefySetIdSessionEntries: u32 = BondingDuration::get() * SessionsPerEra::get(); +} + +impl pallet_beefy::Config for Runtime { + type BeefyId = BeefyId; + type MaxAuthorities = MaxAuthorities; + type MaxNominators = ConstU32<0>; + type MaxSetIdSessionEntries = BeefySetIdSessionEntries; + type OnNewValidatorSet = MmrLeaf; + type WeightInfo = (); + type KeyOwnerProof = >::Proof; + type EquivocationReportSystem = + pallet_beefy::EquivocationReportSystem; +} + /// MMR helper types. mod mmr { use super::Runtime; @@ -2656,6 +2692,42 @@ impl_runtime_apis! { } } + #[api_version(3)] + impl sp_consensus_beefy::BeefyApi for Runtime { + fn beefy_genesis() -> Option { + Beefy::genesis_block() + } + + fn validator_set() -> Option> { + Beefy::validator_set() + } + + fn submit_report_equivocation_unsigned_extrinsic( + equivocation_proof: sp_consensus_beefy::EquivocationProof< + BlockNumber, + BeefyId, + BeefySignature, + >, + key_owner_proof: sp_consensus_beefy::OpaqueKeyOwnershipProof, + ) -> Option<()> { + let key_owner_proof = key_owner_proof.decode()?; + + Beefy::submit_unsigned_equivocation_report( + equivocation_proof, + key_owner_proof, + ) + } + + fn generate_key_ownership_proof( + _set_id: sp_consensus_beefy::ValidatorSetId, + authority_id: BeefyId, + ) -> Option { + Historical::prove((sp_consensus_beefy::KEY_TYPE, authority_id)) + .map(|p| p.encode()) + .map(sp_consensus_beefy::OpaqueKeyOwnershipProof::new) + } + } + impl pallet_mmr::primitives::MmrApi< Block, mmr::Hash, diff --git a/substrate/bin/node/testing/src/genesis.rs b/substrate/bin/node/testing/src/genesis.rs index eecbf64775b..6ec21fbe093 100644 --- a/substrate/bin/node/testing/src/genesis.rs +++ b/substrate/bin/node/testing/src/genesis.rs @@ -24,7 +24,7 @@ use kitchensink_runtime::{ GrandpaConfig, IndicesConfig, RuntimeGenesisConfig, SessionConfig, SocietyConfig, StakerStatus, StakingConfig, BABE_GENESIS_EPOCH_CONFIG, }; -use sp_keyring::{Ed25519Keyring, Sr25519Keyring}; +use sp_keyring::Ed25519Keyring; use sp_runtime::Perbill; /// Create genesis runtime configuration for tests. @@ -52,13 +52,9 @@ pub fn config_endowed(extra_endowed: Vec) -> RuntimeGenesisConfig { balances: BalancesConfig { balances: endowed }, session: SessionConfig { keys: vec![ - (alice(), dave(), to_session_keys(&Ed25519Keyring::Alice, &Sr25519Keyring::Alice)), - (bob(), eve(), to_session_keys(&Ed25519Keyring::Bob, &Sr25519Keyring::Bob)), - ( - charlie(), - ferdie(), - to_session_keys(&Ed25519Keyring::Charlie, &Sr25519Keyring::Charlie), - ), + (alice(), dave(), session_keys_from_seed(Ed25519Keyring::Alice.into())), + (bob(), eve(), session_keys_from_seed(Ed25519Keyring::Bob.into())), + (charlie(), ferdie(), session_keys_from_seed(Ed25519Keyring::Charlie.into())), ], }, staking: StakingConfig { @@ -79,6 +75,7 @@ pub fn config_endowed(extra_endowed: Vec) -> RuntimeGenesisConfig { ..Default::default() }, grandpa: GrandpaConfig { authorities: vec![], _config: Default::default() }, + beefy: Default::default(), im_online: Default::default(), authority_discovery: Default::default(), democracy: Default::default(), diff --git a/substrate/bin/node/testing/src/keyring.rs b/substrate/bin/node/testing/src/keyring.rs index 9940077c9da..6c885cc039a 100644 --- a/substrate/bin/node/testing/src/keyring.rs +++ b/substrate/bin/node/testing/src/keyring.rs @@ -20,8 +20,10 @@ use codec::Encode; use kitchensink_runtime::{CheckedExtrinsic, SessionKeys, SignedExtra, UncheckedExtrinsic}; +use node_cli::chain_spec::get_from_seed; use node_primitives::{AccountId, Balance, Nonce}; -use sp_keyring::{AccountKeyring, Ed25519Keyring, Sr25519Keyring}; +use sp_core::{ecdsa, ed25519, sr25519}; +use sp_keyring::AccountKeyring; use sp_runtime::generic::Era; /// Alice's account id. @@ -55,16 +57,14 @@ pub fn ferdie() -> AccountId { } /// Convert keyrings into `SessionKeys`. -pub fn to_session_keys( - ed25519_keyring: &Ed25519Keyring, - sr25519_keyring: &Sr25519Keyring, -) -> SessionKeys { +pub fn session_keys_from_seed(seed: &str) -> SessionKeys { SessionKeys { - grandpa: ed25519_keyring.to_owned().public().into(), - babe: sr25519_keyring.to_owned().public().into(), - im_online: sr25519_keyring.to_owned().public().into(), - authority_discovery: sr25519_keyring.to_owned().public().into(), - mixnet: sr25519_keyring.to_owned().public().into(), + grandpa: get_from_seed::(seed).into(), + babe: get_from_seed::(seed).into(), + im_online: get_from_seed::(seed).into(), + authority_discovery: get_from_seed::(seed).into(), + mixnet: get_from_seed::(seed).into(), + beefy: get_from_seed::(seed).into(), } } diff --git a/substrate/primitives/consensus/beefy/src/mmr.rs b/substrate/primitives/consensus/beefy/src/mmr.rs index 9ac1624ca75..1b9a45f8687 100644 --- a/substrate/primitives/consensus/beefy/src/mmr.rs +++ b/substrate/primitives/consensus/beefy/src/mmr.rs @@ -66,7 +66,7 @@ pub struct MmrLeaf { /// An MMR leaf versioning scheme. /// -/// Version is a single byte that constist of two components: +/// Version is a single byte that consists of two components: /// - `major` - 3 bits /// - `minor` - 5 bits /// -- GitLab From 204fe7ffd7be54cdefb24db69be1f830acc47031 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 7 Jan 2024 11:42:37 +0100 Subject: [PATCH 120/191] Bump the known_good_semver group with 4 updates (#2865) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the known_good_semver group with 4 updates: [serde](https://github.com/serde-rs/serde), [serde_json](https://github.com/serde-rs/json), [clap](https://github.com/clap-rs/clap) and [syn](https://github.com/dtolnay/syn). Updates `serde` from 1.0.194 to 1.0.195
Release notes

Sourced from serde's releases.

v1.0.195

  • Prevent remote definitions of tuple struct or tuple variant from triggering dead_code warning (#2671)
Commits
  • 03eec42 Release 1.0.195
  • 196f311 Merge pull request #2671 from dtolnay/deadremote
  • 38d9e0b Revert "Add FIXME to fix dead_code warning when using serde(remote)"
  • 6502b31 Fix new dead_code warning in tuple struct and tuple variant remote defs
  • 6f1a8c3 Add FIXME to fix dead_code warning when using serde(remote)
  • d883c94 Work around dead_code warning in tests
  • 961fa59 Merge pull request #2670 from serde-rs/exhaustive
  • 8bc71de Fill in omitted patterns for GenericArguments match
  • 7c65a9d Pick up changes to non_exhaustive_omitted_patterns lint
  • See full diff in compare view

Updates `serde_json` from 1.0.110 to 1.0.111
Release notes

Sourced from serde_json's releases.

v1.0.111

  • Improve floating point parsing performance on loongarch64 (#1100, thanks @​heiher)
Commits

Updates `clap` from 4.4.12 to 4.4.13
Release notes

Sourced from clap's releases.

v4.4.13

[4.4.13] - 2024-01-04

Documentation

  • Fix link to structopt migration guide
Changelog

Sourced from clap's changelog.

[4.4.13] - 2024-01-04

Documentation

  • Fix link to structopt migration guide
Commits
  • 2ab48b2 chore: Release
  • 7a06a8c docs: Update changelog
  • cca190e docs: Correct link to StructOpt migration guide
  • 5c31f45 Merge pull request #5281 from Manishearth/safety-docs
  • ddae7e6 Correct safety docs
  • 48d28aa chore: Release
  • 748ce18 docs: Update changelog
  • adbe6ec Merge pull request #5278 from henry-hsieh/fix-nosort
  • 2b48858 fix: Skip nosort option below bash 4.4
  • 777b744 Merge pull request #5277 from clap-rs/renovate/actions-setup-python-5.x
  • Additional commits viewable in compare view

Updates `syn` from 2.0.47 to 2.0.48
Release notes

Sourced from syn's releases.

2.0.48

  • Improve error message on unexpected token after else (#1578)
Commits
  • 5e16fc2 Release 2.0.48
  • dc40084 Merge pull request #1578 from dtolnay/elseblock
  • 82fcefc Fix error message on unexpected token after 'else'
  • e8a5c68 Merge pull request #1576 from dtolnay/exhaustive
  • 97b1df6 Pick up changes to non_exhaustive_omitted_patterns lint
  • See full diff in compare view

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 188 +++++++++--------- .../pallets/ethereum-beacon-client/Cargo.toml | 8 +- .../pallets/inbound-queue/Cargo.toml | 2 +- .../pallets/outbound-queue/Cargo.toml | 2 +- .../parachain/primitives/beacon/Cargo.toml | 2 +- .../parachain/primitives/core/Cargo.toml | 2 +- .../parachain/primitives/ethereum/Cargo.toml | 4 +- .../parachain/primitives/router/Cargo.toml | 2 +- .../parachain/runtime/tests/Cargo.toml | 2 +- cumulus/client/cli/Cargo.toml | 2 +- .../relay-chain-rpc-interface/Cargo.toml | 4 +- .../parachain-system/proc-macro/Cargo.toml | 2 +- cumulus/parachain-template/node/Cargo.toml | 6 +- .../pallets/template/Cargo.toml | 2 +- .../assets/asset-hub-rococo/Cargo.toml | 2 +- .../assets/asset-hub-westend/Cargo.toml | 2 +- .../bridges/bridge-hub-rococo/Cargo.toml | 2 +- .../bridges/bridge-hub-westend/Cargo.toml | 2 +- .../collectives-westend/Cargo.toml | 2 +- .../people/people-rococo/Cargo.toml | 2 +- .../people/people-westend/Cargo.toml | 2 +- .../parachains/testing/penpal/Cargo.toml | 2 +- .../emulated/chains/relays/rococo/Cargo.toml | 2 +- .../emulated/chains/relays/westend/Cargo.toml | 2 +- .../emulated/common/Cargo.toml | 2 +- .../bridge-hubs/bridge-hub-rococo/Cargo.toml | 2 +- .../bridge-hubs/bridge-hub-westend/Cargo.toml | 2 +- .../coretime/coretime-rococo/Cargo.toml | 2 +- .../coretime/coretime-westend/Cargo.toml | 2 +- .../runtimes/people/people-rococo/Cargo.toml | 2 +- .../runtimes/people/people-westend/Cargo.toml | 2 +- cumulus/polkadot-parachain/Cargo.toml | 6 +- cumulus/test/service/Cargo.toml | 6 +- polkadot/cli/Cargo.toml | 2 +- polkadot/node/gum/proc-macro/Cargo.toml | 2 +- polkadot/node/malus/Cargo.toml | 2 +- polkadot/node/primitives/Cargo.toml | 2 +- polkadot/node/service/Cargo.toml | 4 +- polkadot/node/subsystem-bench/Cargo.toml | 4 +- polkadot/node/test/service/Cargo.toml | 2 +- .../node/zombienet-backchannel/Cargo.toml | 2 +- polkadot/parachain/Cargo.toml | 2 +- .../test-parachains/adder/collator/Cargo.toml | 2 +- .../undying/collator/Cargo.toml | 2 +- polkadot/primitives/Cargo.toml | 2 +- polkadot/runtime/common/Cargo.toml | 4 +- polkadot/runtime/parachains/Cargo.toml | 4 +- polkadot/runtime/rococo/Cargo.toml | 4 +- polkadot/runtime/test-runtime/Cargo.toml | 4 +- polkadot/runtime/westend/Cargo.toml | 4 +- polkadot/utils/generate-bags/Cargo.toml | 2 +- .../remote-ext-tests/bags-list/Cargo.toml | 2 +- polkadot/xcm/Cargo.toml | 2 +- polkadot/xcm/pallet-xcm/Cargo.toml | 2 +- polkadot/xcm/procedural/Cargo.toml | 2 +- substrate/bin/minimal/node/Cargo.toml | 4 +- substrate/bin/node-template/node/Cargo.toml | 4 +- .../bin/node-template/runtime/Cargo.toml | 2 +- substrate/bin/node/bench/Cargo.toml | 6 +- substrate/bin/node/cli/Cargo.toml | 10 +- substrate/bin/node/inspect/Cargo.toml | 2 +- substrate/bin/node/runtime/Cargo.toml | 2 +- .../bin/utils/chain-spec-builder/Cargo.toml | 4 +- substrate/bin/utils/subkey/Cargo.toml | 2 +- substrate/client/chain-spec/Cargo.toml | 4 +- substrate/client/chain-spec/derive/Cargo.toml | 2 +- substrate/client/cli/Cargo.toml | 6 +- .../client/consensus/babe/rpc/Cargo.toml | 4 +- substrate/client/consensus/beefy/Cargo.toml | 2 +- .../client/consensus/beefy/rpc/Cargo.toml | 4 +- substrate/client/consensus/grandpa/Cargo.toml | 4 +- .../client/consensus/grandpa/rpc/Cargo.toml | 2 +- substrate/client/keystore/Cargo.toml | 2 +- .../merkle-mountain-range/rpc/Cargo.toml | 4 +- substrate/client/network/Cargo.toml | 4 +- substrate/client/rpc-api/Cargo.toml | 4 +- substrate/client/rpc-servers/Cargo.toml | 2 +- substrate/client/rpc-spec-v2/Cargo.toml | 2 +- substrate/client/rpc/Cargo.toml | 2 +- substrate/client/service/Cargo.toml | 4 +- substrate/client/storage-monitor/Cargo.toml | 2 +- substrate/client/sync-state-rpc/Cargo.toml | 4 +- substrate/client/sysinfo/Cargo.toml | 4 +- substrate/client/telemetry/Cargo.toml | 4 +- substrate/client/tracing/Cargo.toml | 2 +- .../client/tracing/proc-macro/Cargo.toml | 2 +- substrate/client/transaction-pool/Cargo.toml | 2 +- .../client/transaction-pool/api/Cargo.toml | 4 +- substrate/frame/beefy-mmr/Cargo.toml | 2 +- substrate/frame/beefy/Cargo.toml | 2 +- substrate/frame/benchmarking/Cargo.toml | 2 +- .../frame/contracts/proc-macro/Cargo.toml | 2 +- substrate/frame/conviction-voting/Cargo.toml | 2 +- substrate/frame/democracy/Cargo.toml | 2 +- .../solution-type/Cargo.toml | 2 +- .../solution-type/fuzzer/Cargo.toml | 2 +- substrate/frame/message-queue/Cargo.toml | 2 +- substrate/frame/mixnet/Cargo.toml | 2 +- substrate/frame/offences/Cargo.toml | 2 +- substrate/frame/referenda/Cargo.toml | 2 +- substrate/frame/remark/Cargo.toml | 2 +- substrate/frame/staking/Cargo.toml | 2 +- .../frame/staking/reward-curve/Cargo.toml | 2 +- .../frame/state-trie-migration/Cargo.toml | 2 +- substrate/frame/support/Cargo.toml | 4 +- substrate/frame/support/procedural/Cargo.toml | 2 +- .../frame/support/procedural/tools/Cargo.toml | 2 +- .../procedural/tools/derive/Cargo.toml | 2 +- substrate/frame/support/test/Cargo.toml | 2 +- .../frame/support/test/pallet/Cargo.toml | 2 +- substrate/frame/system/Cargo.toml | 2 +- substrate/frame/tips/Cargo.toml | 2 +- .../frame/transaction-payment/Cargo.toml | 4 +- .../asset-tx-payment/Cargo.toml | 4 +- .../frame/transaction-storage/Cargo.toml | 2 +- substrate/frame/treasury/Cargo.toml | 2 +- .../primitives/api/proc-macro/Cargo.toml | 2 +- .../primitives/application-crypto/Cargo.toml | 2 +- substrate/primitives/arithmetic/Cargo.toml | 2 +- .../primitives/consensus/babe/Cargo.toml | 2 +- .../primitives/consensus/beefy/Cargo.toml | 2 +- .../primitives/consensus/grandpa/Cargo.toml | 2 +- .../primitives/consensus/sassafras/Cargo.toml | 2 +- substrate/primitives/core/Cargo.toml | 4 +- .../core/hashing/proc-macro/Cargo.toml | 2 +- substrate/primitives/debug-derive/Cargo.toml | 2 +- .../primitives/genesis-builder/Cargo.toml | 2 +- .../merkle-mountain-range/Cargo.toml | 2 +- .../primitives/npos-elections/Cargo.toml | 2 +- .../npos-elections/fuzzer/Cargo.toml | 2 +- substrate/primitives/rpc/Cargo.toml | 4 +- .../runtime-interface/proc-macro/Cargo.toml | 2 +- substrate/primitives/runtime/Cargo.toml | 4 +- substrate/primitives/staking/Cargo.toml | 2 +- substrate/primitives/storage/Cargo.toml | 2 +- .../primitives/test-primitives/Cargo.toml | 2 +- substrate/primitives/version/Cargo.toml | 2 +- .../primitives/version/proc-macro/Cargo.toml | 2 +- substrate/primitives/weights/Cargo.toml | 2 +- .../ci/node-template-release/Cargo.toml | 2 +- substrate/test-utils/client/Cargo.toml | 4 +- substrate/test-utils/runtime/Cargo.toml | 4 +- .../utils/frame/benchmarking-cli/Cargo.toml | 6 +- .../frame/frame-utilities-cli/Cargo.toml | 2 +- .../generate-bags/node-runtime/Cargo.toml | 2 +- .../frame/remote-externalities/Cargo.toml | 2 +- .../rpc/state-trie-migration-rpc/Cargo.toml | 2 +- .../utils/frame/try-runtime/cli/Cargo.toml | 6 +- 148 files changed, 294 insertions(+), 294 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 23a0bf8fd35..2e2e1dfdb0e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -191,7 +191,7 @@ checksum = "c0391754c09fab4eae3404d19d0d297aa1c670c1775ab51d8a5312afeca23157" dependencies = [ "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -206,7 +206,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", "syn-solidity", "tiny-keccak", ] @@ -1227,7 +1227,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -1244,7 +1244,7 @@ checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -1426,7 +1426,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -2639,9 +2639,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.12" +version = "4.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcfab8ba68f3668e89f6ff60f5b205cea56aa7b769451a59f34b8682f51c056d" +checksum = "52bdc885e4cacc7f7c9eedc1ef6da641603180c783c41a15c264944deeaab642" dependencies = [ "clap_builder", "clap_derive 4.4.7", @@ -2675,7 +2675,7 @@ version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "586a385f7ef2f8b4d86bddaa0c094794e7ccbfe5ffef1f434fe928143fc783a5" dependencies = [ - "clap 4.4.12", + "clap 4.4.13", ] [[package]] @@ -2700,7 +2700,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -3413,7 +3413,7 @@ dependencies = [ "anes", "cast", "ciborium", - "clap 4.4.12", + "clap 4.4.13", "criterion-plot", "futures", "is-terminal", @@ -3576,7 +3576,7 @@ dependencies = [ name = "cumulus-client-cli" version = "0.1.0" dependencies = [ - "clap 4.4.12", + "clap 4.4.13", "parity-scale-codec", "sc-chain-spec", "sc-cli", @@ -3933,7 +3933,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -4315,7 +4315,7 @@ name = "cumulus-test-service" version = "0.1.0" dependencies = [ "async-trait", - "clap 4.4.12", + "clap 4.4.13", "criterion 0.5.1", "cumulus-client-cli", "cumulus-client-consensus-common", @@ -4438,7 +4438,7 @@ checksum = "83fdaf97f4804dcebfa5862639bc9ce4121e82140bec2a987ac5140294865b5b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -4478,7 +4478,7 @@ dependencies = [ "proc-macro2", "quote", "scratch", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -4495,7 +4495,7 @@ checksum = "50c49547d73ba8dcfd4ad7325d64c6d5391ff4224d498fc39a6f3f49825a530d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -4703,7 +4703,7 @@ checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -4764,7 +4764,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.47", + "syn 2.0.48", "termcolor", "toml 0.7.8", "walkdir", @@ -4992,7 +4992,7 @@ checksum = "5e9a1f9f7d83e59740248a6e14ecf93929ade55027844dfcea78beafccc15745" dependencies = [ "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -5003,7 +5003,7 @@ checksum = "c2ad8cef1d801a4686bfd8919f0b30eac4c8e48968c437a6405ded4fb5272d2b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -5171,7 +5171,7 @@ dependencies = [ "fs-err", "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -5499,7 +5499,7 @@ dependencies = [ "Inflector", "array-bytes 6.1.0", "chrono", - "clap 4.4.12", + "clap 4.4.13", "comfy-table", "frame-benchmarking", "frame-support", @@ -5565,7 +5565,7 @@ dependencies = [ "quote", "scale-info", "sp-arithmetic", - "syn 2.0.47", + "syn 2.0.48", "trybuild", ] @@ -5591,7 +5591,7 @@ dependencies = [ name = "frame-election-solution-type-fuzzer" version = "2.0.0-alpha.5" dependencies = [ - "clap 4.4.12", + "clap 4.4.13", "frame-election-provider-solution-type", "frame-election-provider-support", "frame-support", @@ -5718,7 +5718,7 @@ dependencies = [ "quote", "regex", "sp-core-hashing", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -5729,7 +5729,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -5738,7 +5738,7 @@ version = "3.0.0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -5971,7 +5971,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -7906,7 +7906,7 @@ dependencies = [ "macro_magic_core", "macro_magic_macros", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -7920,7 +7920,7 @@ dependencies = [ "macro_magic_core_macros", "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -7931,7 +7931,7 @@ checksum = "9ea73aa640dc01d62a590d48c0c3521ed739d53b27f919b25c3551e233481654" dependencies = [ "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -7942,7 +7942,7 @@ checksum = "ef9d79ae96aaba821963320eb2b6e34d17df1e5a83d8a1985c29cc5be59577b3" dependencies = [ "macro_magic_core", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -8107,7 +8107,7 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" name = "minimal-node" version = "4.0.0-dev" dependencies = [ - "clap 4.4.12", + "clap 4.4.13", "frame", "futures", "futures-timer", @@ -8571,7 +8571,7 @@ name = "node-bench" version = "0.9.0-dev" dependencies = [ "array-bytes 6.1.0", - "clap 4.4.12", + "clap 4.4.13", "derive_more", "fs_extra", "futures", @@ -8648,7 +8648,7 @@ dependencies = [ name = "node-runtime-generate-bags" version = "3.0.0" dependencies = [ - "clap 4.4.12", + "clap 4.4.13", "generate-bags", "kitchensink-runtime", ] @@ -8657,7 +8657,7 @@ dependencies = [ name = "node-template" version = "4.0.0-dev" dependencies = [ - "clap 4.4.12", + "clap 4.4.13", "frame-benchmarking", "frame-benchmarking-cli", "frame-system", @@ -8701,7 +8701,7 @@ dependencies = [ name = "node-template-release" version = "3.0.0" dependencies = [ - "clap 4.4.12", + "clap 4.4.13", "flate2", "fs_extra", "glob", @@ -9676,7 +9676,7 @@ version = "4.0.0-dev" dependencies = [ "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -10837,7 +10837,7 @@ dependencies = [ "proc-macro2", "quote", "sp-runtime", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -11243,7 +11243,7 @@ dependencies = [ name = "parachain-template-node" version = "0.1.0" dependencies = [ - "clap 4.4.12", + "clap 4.4.13", "color-print", "cumulus-client-cli", "cumulus-client-collator", @@ -11948,7 +11948,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -11989,7 +11989,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -12202,7 +12202,7 @@ name = "polkadot-cli" version = "1.1.0" dependencies = [ "cfg-if", - "clap 4.4.12", + "clap 4.4.13", "frame-benchmarking-cli", "futures", "log", @@ -13043,7 +13043,7 @@ dependencies = [ "async-trait", "bridge-hub-rococo-runtime", "bridge-hub-westend-runtime", - "clap 4.4.12", + "clap 4.4.13", "collectives-westend-runtime", "color-print", "contracts-rococo-runtime", @@ -13553,7 +13553,7 @@ version = "1.0.0" dependencies = [ "assert_matches", "async-trait", - "clap 4.4.12", + "clap 4.4.13", "clap-num", "color-eyre", "colored", @@ -13630,7 +13630,7 @@ version = "1.0.0" dependencies = [ "assert_matches", "async-trait", - "clap 4.4.12", + "clap 4.4.13", "color-eyre", "futures", "futures-timer", @@ -13777,7 +13777,7 @@ dependencies = [ name = "polkadot-voter-bags" version = "1.0.0" dependencies = [ - "clap 4.4.12", + "clap 4.4.13", "generate-bags", "sp-io", "westend-runtime", @@ -13802,7 +13802,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26501292b2cb980cbeaac3304f0fc4480ff1bac2473045453d7333d775658b6a" dependencies = [ "polkavm-derive-impl", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -13814,7 +13814,7 @@ dependencies = [ "polkavm-common 0.2.0", "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -14003,7 +14003,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c64d9ba0963cdcea2e1b2230fbae2bab30eb25a174be395c41e764bfb65dd62" dependencies = [ "proc-macro2", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -14095,7 +14095,7 @@ checksum = "9b698b0b09d40e9b7c1a47b132d66a8b54bcd20583d9b6d06e4535e383b4405c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -14167,7 +14167,7 @@ checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -14585,7 +14585,7 @@ checksum = "7f7473c2cfcf90008193dd0e3e16599455cb601a9fce322b5bb55de799664925" dependencies = [ "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -14654,7 +14654,7 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" name = "remote-ext-tests-bags-list" version = "1.0.0" dependencies = [ - "clap 4.4.12", + "clap 4.4.13", "frame-system", "log", "pallet-bags-list-remote-tests", @@ -15434,7 +15434,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -15444,7 +15444,7 @@ dependencies = [ "array-bytes 6.1.0", "bip39", "chrono", - "clap 4.4.12", + "clap 4.4.13", "fdlimit", "futures", "futures-timer", @@ -16588,7 +16588,7 @@ dependencies = [ name = "sc-storage-monitor" version = "0.1.0" dependencies = [ - "clap 4.4.12", + "clap 4.4.13", "fs4", "log", "sc-client-db", @@ -16690,7 +16690,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -17075,9 +17075,9 @@ checksum = "f97841a747eef040fcd2e7b3b9a220a7205926e60488e673d9e4926d27772ce5" [[package]] name = "serde" -version = "1.0.194" +version = "1.0.195" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b114498256798c94a0689e1a15fec6005dee8ac1f41de56404b67afc2a4b773" +checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02" dependencies = [ "serde_derive", ] @@ -17102,13 +17102,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.194" +version = "1.0.195" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3385e45322e8f9931410f01b3031ec534c3947d0e94c18049af4d9f9907d4e0" +checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -17133,9 +17133,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.110" +version = "1.0.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fbd975230bada99c8bb618e0c365c2eefa219158d5c6c29610fd09ff1833257" +checksum = "176e46fa42316f18edd598015a5166857fc835ec732f5215eac6b7bdbf0a84f4" dependencies = [ "itoa", "ryu", @@ -17198,7 +17198,7 @@ checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -17988,7 +17988,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -18323,7 +18323,7 @@ version = "9.0.0" dependencies = [ "quote", "sp-core-hashing", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -18381,7 +18381,7 @@ version = "8.0.0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -18391,7 +18391,7 @@ source = "git+https://github.com/paritytech/polkadot-sdk#82912acb33a9030c0ef3bf5 dependencies = [ "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -18550,7 +18550,7 @@ dependencies = [ name = "sp-npos-elections-fuzzer" version = "2.0.0-alpha.5" dependencies = [ - "clap 4.4.12", + "clap 4.4.13", "honggfuzz", "rand 0.8.5", "sp-npos-elections", @@ -18664,7 +18664,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -18676,7 +18676,7 @@ dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -18947,7 +18947,7 @@ dependencies = [ "proc-macro2", "quote", "sp-version", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -19071,7 +19071,7 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" name = "staging-chain-spec-builder" version = "2.0.0" dependencies = [ - "clap 4.4.12", + "clap 4.4.13", "log", "sc-chain-spec", "serde_json", @@ -19084,7 +19084,7 @@ version = "3.0.0-dev" dependencies = [ "array-bytes 6.1.0", "assert_cmd", - "clap 4.4.12", + "clap 4.4.13", "clap_complete", "criterion 0.4.0", "frame-benchmarking", @@ -19193,7 +19193,7 @@ dependencies = [ name = "staging-node-inspect" version = "0.9.0-dev" dependencies = [ - "clap 4.4.12", + "clap 4.4.13", "parity-scale-codec", "sc-cli", "sc-client-api", @@ -19398,7 +19398,7 @@ dependencies = [ name = "subkey" version = "3.0.0" dependencies = [ - "clap 4.4.12", + "clap 4.4.13", "sc-cli", ] @@ -19440,7 +19440,7 @@ dependencies = [ name = "substrate-frame-cli" version = "4.0.0-dev" dependencies = [ - "clap 4.4.12", + "clap 4.4.13", "frame-support", "frame-system", "sc-cli", @@ -19786,9 +19786,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.47" +version = "2.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1726efe18f42ae774cc644f330953a5e7b3c3003d3edcecf18850fe9d4dd9afb" +checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" dependencies = [ "proc-macro2", "quote", @@ -19804,7 +19804,7 @@ dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -19918,7 +19918,7 @@ dependencies = [ name = "test-parachain-adder-collator" version = "1.0.0" dependencies = [ - "clap 4.4.12", + "clap 4.4.13", "futures", "futures-timer", "log", @@ -19966,7 +19966,7 @@ dependencies = [ name = "test-parachain-undying-collator" version = "1.0.0" dependencies = [ - "clap 4.4.12", + "clap 4.4.13", "futures", "futures-timer", "log", @@ -20055,7 +20055,7 @@ checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -20216,7 +20216,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -20422,7 +20422,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -20464,7 +20464,7 @@ dependencies = [ "proc-macro-crate 2.0.1", "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -20617,7 +20617,7 @@ version = "0.10.0-dev" dependencies = [ "assert_cmd", "async-trait", - "clap 4.4.12", + "clap 4.4.13", "frame-remote-externalities", "frame-try-runtime", "hex", @@ -21000,7 +21000,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", "wasm-bindgen-shared", ] @@ -21034,7 +21034,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -22002,7 +22002,7 @@ dependencies = [ "proc-macro2", "quote", "staging-xcm", - "syn 2.0.47", + "syn 2.0.48", "trybuild", ] @@ -22122,7 +22122,7 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] @@ -22142,7 +22142,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.47", + "syn 2.0.48", ] [[package]] diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/Cargo.toml b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/Cargo.toml index 2f6eb2c91c0..db3be5f91b8 100644 --- a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/Cargo.toml +++ b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/Cargo.toml @@ -11,8 +11,8 @@ license = "Apache-2.0" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -serde = { version = "1.0.194", optional = true } -serde_json = { version = "1.0.110", optional = true } +serde = { version = "1.0.195", optional = true } +serde_json = { version = "1.0.111", optional = true } codec = { version = "3.6.1", package = "parity-scale-codec", default-features = false, features = ["derive"] } scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } ssz_rs = { version = "0.9.0", default-features = false } @@ -40,11 +40,11 @@ pallet-timestamp = { path = "../../../../../substrate/frame/timestamp", default- [dev-dependencies] rand = "0.8.5" sp-keyring = { path = "../../../../../substrate/primitives/keyring" } -serde_json = "1.0.110" +serde_json = "1.0.111" hex-literal = "0.4.1" pallet-timestamp = { path = "../../../../../substrate/frame/timestamp" } sp-io = { path = "../../../../../substrate/primitives/io" } -serde = "1.0.194" +serde = "1.0.195" [features] default = ["std"] diff --git a/bridges/snowbridge/parachain/pallets/inbound-queue/Cargo.toml b/bridges/snowbridge/parachain/pallets/inbound-queue/Cargo.toml index 91a773f4471..6a5ea6f8222 100644 --- a/bridges/snowbridge/parachain/pallets/inbound-queue/Cargo.toml +++ b/bridges/snowbridge/parachain/pallets/inbound-queue/Cargo.toml @@ -11,7 +11,7 @@ license = "Apache-2.0" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -serde = { version = "1.0.194", optional = true } +serde = { version = "1.0.195", optional = true } codec = { version = "3.6.1", package = "parity-scale-codec", default-features = false, features = ["derive"] } scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.4.1", optional = true } diff --git a/bridges/snowbridge/parachain/pallets/outbound-queue/Cargo.toml b/bridges/snowbridge/parachain/pallets/outbound-queue/Cargo.toml index 90a45745f4a..f99fcc72e19 100644 --- a/bridges/snowbridge/parachain/pallets/outbound-queue/Cargo.toml +++ b/bridges/snowbridge/parachain/pallets/outbound-queue/Cargo.toml @@ -11,7 +11,7 @@ license = "Apache-2.0" targets = ["x86_64-unknown-linux-gnu"] [dependencies] -serde = { version = "1.0.194", features = ["alloc", "derive"], default-features = false } +serde = { version = "1.0.195", features = ["alloc", "derive"], default-features = false } codec = { version = "3.6.1", package = "parity-scale-codec", default-features = false, features = ["derive"] } scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.4.1", optional = true } diff --git a/bridges/snowbridge/parachain/primitives/beacon/Cargo.toml b/bridges/snowbridge/parachain/primitives/beacon/Cargo.toml index f0a00f51229..eb717325e8a 100644 --- a/bridges/snowbridge/parachain/primitives/beacon/Cargo.toml +++ b/bridges/snowbridge/parachain/primitives/beacon/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" license = "Apache-2.0" [dependencies] -serde = { version = "1.0.194", optional = true, features = ["derive"] } +serde = { version = "1.0.195", optional = true, features = ["derive"] } hex = { version = "0.4", default-features = false } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } diff --git a/bridges/snowbridge/parachain/primitives/core/Cargo.toml b/bridges/snowbridge/parachain/primitives/core/Cargo.toml index f8cdfb1f1e9..706c508363d 100644 --- a/bridges/snowbridge/parachain/primitives/core/Cargo.toml +++ b/bridges/snowbridge/parachain/primitives/core/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" license = "Apache-2.0" [dependencies] -serde = { version = "1.0.194", optional = true, features = ["alloc", "derive"], default-features = false } +serde = { version = "1.0.195", optional = true, features = ["alloc", "derive"], default-features = false } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } hex-literal = { version = "0.4.1" } diff --git a/bridges/snowbridge/parachain/primitives/ethereum/Cargo.toml b/bridges/snowbridge/parachain/primitives/ethereum/Cargo.toml index d957b589aca..3624044f86a 100644 --- a/bridges/snowbridge/parachain/primitives/ethereum/Cargo.toml +++ b/bridges/snowbridge/parachain/primitives/ethereum/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" license = "Apache-2.0" [dependencies] -serde = { version = "1.0.194", optional = true, features = ["derive"] } +serde = { version = "1.0.195", optional = true, features = ["derive"] } serde-big-array = { version = "0.3.2", optional = true, features = ["const-generics"] } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } @@ -28,7 +28,7 @@ ethabi = { git = "https://github.com/snowfork/ethabi-decode.git", package = "eth [dev-dependencies] wasm-bindgen-test = "0.3.19" rand = "0.8.5" -serde_json = "1.0.110" +serde_json = "1.0.111" [features] default = ["std"] diff --git a/bridges/snowbridge/parachain/primitives/router/Cargo.toml b/bridges/snowbridge/parachain/primitives/router/Cargo.toml index 0ee6fd9bd3d..40ae12920e7 100644 --- a/bridges/snowbridge/parachain/primitives/router/Cargo.toml +++ b/bridges/snowbridge/parachain/primitives/router/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" license = "Apache-2.0" [dependencies] -serde = { version = "1.0.194", optional = true, features = ["derive"] } +serde = { version = "1.0.195", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } log = { version = "0.4.20", default-features = false } diff --git a/bridges/snowbridge/parachain/runtime/tests/Cargo.toml b/bridges/snowbridge/parachain/runtime/tests/Cargo.toml index 7002feae24a..9b5000b56cd 100644 --- a/bridges/snowbridge/parachain/runtime/tests/Cargo.toml +++ b/bridges/snowbridge/parachain/runtime/tests/Cargo.toml @@ -11,7 +11,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0", default-features = hex-literal = { version = "0.4.1" } log = { version = "0.4.20", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.194", optional = true, features = ["derive"] } +serde = { version = "1.0.195", optional = true, features = ["derive"] } smallvec = "1.11.0" # Substrate diff --git a/cumulus/client/cli/Cargo.toml b/cumulus/client/cli/Cargo.toml index 3a4eed54f3f..1bf25f3963a 100644 --- a/cumulus/client/cli/Cargo.toml +++ b/cumulus/client/cli/Cargo.toml @@ -10,7 +10,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" workspace = true [dependencies] -clap = { version = "4.4.12", features = ["derive"] } +clap = { version = "4.4.13", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } url = "2.4.0" diff --git a/cumulus/client/relay-chain-rpc-interface/Cargo.toml b/cumulus/client/relay-chain-rpc-interface/Cargo.toml index 9caf1f6b5e4..515c8ead32a 100644 --- a/cumulus/client/relay-chain-rpc-interface/Cargo.toml +++ b/cumulus/client/relay-chain-rpc-interface/Cargo.toml @@ -37,8 +37,8 @@ jsonrpsee = { version = "0.16.2", features = ["ws-client"] } tracing = "0.1.37" async-trait = "0.1.74" url = "2.4.0" -serde_json = "1.0.110" -serde = "1.0.194" +serde_json = "1.0.111" +serde = "1.0.195" schnellru = "0.2.1" smoldot = { version = "0.11.0", default_features = false, features = ["std"] } smoldot-light = { version = "0.9.0", default_features = false, features = ["std"] } diff --git a/cumulus/pallets/parachain-system/proc-macro/Cargo.toml b/cumulus/pallets/parachain-system/proc-macro/Cargo.toml index cdc5514122e..2861a51d13c 100644 --- a/cumulus/pallets/parachain-system/proc-macro/Cargo.toml +++ b/cumulus/pallets/parachain-system/proc-macro/Cargo.toml @@ -13,7 +13,7 @@ workspace = true proc-macro = true [dependencies] -syn = "2.0.43" +syn = "2.0.48" proc-macro2 = "1.0.64" quote = "1.0.33" proc-macro-crate = "2.0.1" diff --git a/cumulus/parachain-template/node/Cargo.toml b/cumulus/parachain-template/node/Cargo.toml index 865f310cd12..52c6ee7050d 100644 --- a/cumulus/parachain-template/node/Cargo.toml +++ b/cumulus/parachain-template/node/Cargo.toml @@ -14,13 +14,13 @@ publish = false workspace = true [dependencies] -clap = { version = "4.4.12", features = ["derive"] } +clap = { version = "4.4.13", features = ["derive"] } log = "0.4.20" codec = { package = "parity-scale-codec", version = "3.0.0" } -serde = { version = "1.0.194", features = ["derive"] } +serde = { version = "1.0.195", features = ["derive"] } jsonrpsee = { version = "0.16.2", features = ["server"] } futures = "0.3.28" -serde_json = "1.0.110" +serde_json = "1.0.111" # Local parachain-template-runtime = { path = "../runtime" } diff --git a/cumulus/parachain-template/pallets/template/Cargo.toml b/cumulus/parachain-template/pallets/template/Cargo.toml index 64464257dd1..b8d95b5cf78 100644 --- a/cumulus/parachain-template/pallets/template/Cargo.toml +++ b/cumulus/parachain-template/pallets/template/Cargo.toml @@ -24,7 +24,7 @@ frame-support = { path = "../../../../substrate/frame/support", default-features frame-system = { path = "../../../../substrate/frame/system", default-features = false } [dev-dependencies] -serde = { version = "1.0.194" } +serde = { version = "1.0.195" } # Substrate sp-core = { path = "../../../../substrate/primitives/core", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/Cargo.toml index 4993eafb641..ecd0059057a 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo/Cargo.toml @@ -11,7 +11,7 @@ publish = false workspace = true [dependencies] -serde_json = "1.0.110" +serde_json = "1.0.111" # Substrate sp-core = { path = "../../../../../../../../substrate/primitives/core", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/Cargo.toml index 73c69ecaa0b..b49b16bf855 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend/Cargo.toml @@ -11,7 +11,7 @@ publish = false workspace = true [dependencies] -serde_json = "1.0.110" +serde_json = "1.0.111" # Substrate sp-core = { path = "../../../../../../../../substrate/primitives/core", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/Cargo.toml index 5e5448864ff..d923f7388a2 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/Cargo.toml @@ -11,7 +11,7 @@ publish = false workspace = true [dependencies] -serde_json = "1.0.110" +serde_json = "1.0.111" # Substrate sp-core = { path = "../../../../../../../../substrate/primitives/core", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/Cargo.toml index 62bd17c3b43..8fcf4fe5e80 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend/Cargo.toml @@ -11,7 +11,7 @@ publish = false workspace = true [dependencies] -serde_json = "1.0.110" +serde_json = "1.0.111" # Substrate sp-core = { path = "../../../../../../../../substrate/primitives/core", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/collectives/collectives-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/collectives/collectives-westend/Cargo.toml index 91b45f00f8f..f3fd5da3cfc 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/collectives/collectives-westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/collectives/collectives-westend/Cargo.toml @@ -11,7 +11,7 @@ publish = false workspace = true [dependencies] -serde_json = "1.0.110" +serde_json = "1.0.111" # Substrate sp-core = { path = "../../../../../../../../substrate/primitives/core", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/Cargo.toml index a4aeab3651e..2f22d9b7a84 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-rococo/Cargo.toml @@ -8,7 +8,7 @@ description = "People Rococo emulated chain" publish = false [dependencies] -serde_json = "1.0.110" +serde_json = "1.0.111" # Substrate sp-core = { path = "../../../../../../../../substrate/primitives/core", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/Cargo.toml index 57d102edd6e..dba6e6f6d4d 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/people/people-westend/Cargo.toml @@ -8,7 +8,7 @@ description = "People Westend emulated chain" publish = false [dependencies] -serde_json = "1.0.110" +serde_json = "1.0.111" # Substrate sp-core = { path = "../../../../../../../../substrate/primitives/core", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/Cargo.toml index a9f031a2318..170d0b1a0b4 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/Cargo.toml @@ -11,7 +11,7 @@ publish = false workspace = true [dependencies] -serde_json = "1.0.110" +serde_json = "1.0.111" # Substrate sp-core = { path = "../../../../../../../../substrate/primitives/core", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/Cargo.toml index f906c6672e0..2e8ea60efd6 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/relays/rococo/Cargo.toml @@ -11,7 +11,7 @@ publish = false workspace = true [dependencies] -serde_json = "1.0.110" +serde_json = "1.0.111" # Substrate sp-core = { path = "../../../../../../../substrate/primitives/core", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/chains/relays/westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/relays/westend/Cargo.toml index 9abbfc4c559..61174e2751b 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/relays/westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/relays/westend/Cargo.toml @@ -11,7 +11,7 @@ publish = false workspace = true [dependencies] -serde_json = "1.0.110" +serde_json = "1.0.111" # Substrate sp-core = { path = "../../../../../../../substrate/primitives/core", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/common/Cargo.toml b/cumulus/parachains/integration-tests/emulated/common/Cargo.toml index 75cd6ea700c..8277b3d734f 100644 --- a/cumulus/parachains/integration-tests/emulated/common/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/common/Cargo.toml @@ -12,7 +12,7 @@ workspace = true [dependencies] codec = { package = "parity-scale-codec", version = "3.4.0", default-features = false } paste = "1.0.14" -serde_json = "1.0.110" +serde_json = "1.0.111" # Substrate grandpa = { package = "sc-consensus-grandpa", path = "../../../../../substrate/client/consensus/grandpa" } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml index b03dee2b9d4..6bb20b5ee35 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml @@ -21,7 +21,7 @@ log = { version = "0.4.20", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = [ "derive", ] } -serde = { version = "1.0.194", optional = true, features = ["derive"] } +serde = { version = "1.0.195", optional = true, features = ["derive"] } smallvec = "1.11.0" # Substrate diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml index 64e1967af92..dd02faefc1c 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/Cargo.toml @@ -17,7 +17,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0", default-features = hex-literal = { version = "0.4.1" } log = { version = "0.4.20", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.194", optional = true, features = ["derive"] } +serde = { version = "1.0.195", optional = true, features = ["derive"] } smallvec = "1.11.0" # Substrate diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml b/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml index 3e830db2276..0af44045da4 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml @@ -17,7 +17,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0", default-features = hex-literal = "0.4.1" log = { version = "0.4.20", default-features = false } scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.194", optional = true, features = ["derive"] } +serde = { version = "1.0.195", optional = true, features = ["derive"] } smallvec = "1.11.0" # Substrate diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml b/cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml index ea5eed062f7..02e130613f9 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/Cargo.toml @@ -17,7 +17,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0", default-features = hex-literal = "0.4.1" log = { version = "0.4.20", default-features = false } scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.194", optional = true, features = ["derive"] } +serde = { version = "1.0.195", optional = true, features = ["derive"] } smallvec = "1.11.0" # Substrate diff --git a/cumulus/parachains/runtimes/people/people-rococo/Cargo.toml b/cumulus/parachains/runtimes/people/people-rococo/Cargo.toml index a79f355e606..5086697b0f1 100644 --- a/cumulus/parachains/runtimes/people/people-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/people/people-rococo/Cargo.toml @@ -15,7 +15,7 @@ enumflags2 = { version = "0.7.7" } hex-literal = { version = "0.4.1" } log = { version = "0.4.20", default-features = false } scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.194", optional = true, features = ["derive"] } +serde = { version = "1.0.195", optional = true, features = ["derive"] } smallvec = "1.11.0" # Substrate diff --git a/cumulus/parachains/runtimes/people/people-westend/Cargo.toml b/cumulus/parachains/runtimes/people/people-westend/Cargo.toml index 78642059753..38386779a0e 100644 --- a/cumulus/parachains/runtimes/people/people-westend/Cargo.toml +++ b/cumulus/parachains/runtimes/people/people-westend/Cargo.toml @@ -15,7 +15,7 @@ enumflags2 = { version = "0.7.7" } hex-literal = { version = "0.4.1" } log = { version = "0.4.20", default-features = false } scale-info = { version = "2.9.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.194", optional = true, features = ["derive"] } +serde = { version = "1.0.195", optional = true, features = ["derive"] } smallvec = "1.11.0" # Substrate diff --git a/cumulus/polkadot-parachain/Cargo.toml b/cumulus/polkadot-parachain/Cargo.toml index 02d53486710..a9b48a7984b 100644 --- a/cumulus/polkadot-parachain/Cargo.toml +++ b/cumulus/polkadot-parachain/Cargo.toml @@ -16,13 +16,13 @@ path = "src/main.rs" [dependencies] async-trait = "0.1.74" -clap = { version = "4.4.12", features = ["derive"] } +clap = { version = "4.4.13", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } futures = "0.3.28" hex-literal = "0.4.1" log = "0.4.20" -serde = { version = "1.0.194", features = ["derive"] } -serde_json = "1.0.110" +serde = { version = "1.0.195", features = ["derive"] } +serde_json = "1.0.111" # Local rococo-parachain-runtime = { path = "../parachains/runtimes/testing/rococo-parachain" } diff --git a/cumulus/test/service/Cargo.toml b/cumulus/test/service/Cargo.toml index 09403ef1853..b5294ec038a 100644 --- a/cumulus/test/service/Cargo.toml +++ b/cumulus/test/service/Cargo.toml @@ -14,13 +14,13 @@ path = "src/main.rs" [dependencies] async-trait = "0.1.74" -clap = { version = "4.4.12", features = ["derive"] } +clap = { version = "4.4.13", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } criterion = { version = "0.5.1", features = ["async_tokio"] } jsonrpsee = { version = "0.16.2", features = ["server"] } rand = "0.8.5" -serde = { version = "1.0.194", features = ["derive"] } -serde_json = "1.0.110" +serde = { version = "1.0.195", features = ["derive"] } +serde_json = "1.0.111" tokio = { version = "1.32.0", features = ["macros"] } tracing = "0.1.37" url = "2.4.0" diff --git a/polkadot/cli/Cargo.toml b/polkadot/cli/Cargo.toml index 3244608af2a..0b47da4d45c 100644 --- a/polkadot/cli/Cargo.toml +++ b/polkadot/cli/Cargo.toml @@ -19,7 +19,7 @@ crate-type = ["cdylib", "rlib"] [dependencies] cfg-if = "1.0" -clap = { version = "4.4.12", features = ["derive"], optional = true } +clap = { version = "4.4.13", features = ["derive"], optional = true } log = "0.4.17" thiserror = "1.0.48" futures = "0.3.21" diff --git a/polkadot/node/gum/proc-macro/Cargo.toml b/polkadot/node/gum/proc-macro/Cargo.toml index e9a21914d56..174077f480a 100644 --- a/polkadot/node/gum/proc-macro/Cargo.toml +++ b/polkadot/node/gum/proc-macro/Cargo.toml @@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"] proc-macro = true [dependencies] -syn = { version = "2.0.43", features = ["extra-traits", "full"] } +syn = { version = "2.0.48", features = ["extra-traits", "full"] } quote = "1.0.28" proc-macro2 = "1.0.56" proc-macro-crate = "2.0.1" diff --git a/polkadot/node/malus/Cargo.toml b/polkadot/node/malus/Cargo.toml index 64657afc51a..f555cbd5dac 100644 --- a/polkadot/node/malus/Cargo.toml +++ b/polkadot/node/malus/Cargo.toml @@ -43,7 +43,7 @@ assert_matches = "1.5" async-trait = "0.1.74" sp-keystore = { path = "../../../substrate/primitives/keystore" } sp-core = { path = "../../../substrate/primitives/core" } -clap = { version = "4.4.12", features = ["derive"] } +clap = { version = "4.4.13", features = ["derive"] } futures = "0.3.21" futures-timer = "3.0.2" gum = { package = "tracing-gum", path = "../gum" } diff --git a/polkadot/node/primitives/Cargo.toml b/polkadot/node/primitives/Cargo.toml index 924d56c5bba..74152b5b7da 100644 --- a/polkadot/node/primitives/Cargo.toml +++ b/polkadot/node/primitives/Cargo.toml @@ -24,7 +24,7 @@ polkadot-parachain-primitives = { path = "../../parachain", default-features = f schnorrkel = "0.11.4" thiserror = "1.0.48" bitvec = { version = "1.0.0", default-features = false, features = ["alloc"] } -serde = { version = "1.0.194", features = ["derive"] } +serde = { version = "1.0.195", features = ["derive"] } [target.'cfg(not(target_os = "unknown"))'.dependencies] zstd = { version = "0.12.4", default-features = false } diff --git a/polkadot/node/service/Cargo.toml b/polkadot/node/service/Cargo.toml index 2f440abeb11..da3f0319377 100644 --- a/polkadot/node/service/Cargo.toml +++ b/polkadot/node/service/Cargo.toml @@ -85,8 +85,8 @@ is_executable = "1.0.1" gum = { package = "tracing-gum", path = "../gum" } log = "0.4.17" schnellru = "0.2.1" -serde = { version = "1.0.194", features = ["derive"] } -serde_json = "1.0.110" +serde = { version = "1.0.195", features = ["derive"] } +serde_json = "1.0.111" thiserror = "1.0.48" kvdb = "0.13.0" kvdb-rocksdb = { version = "0.19.0", optional = true } diff --git a/polkadot/node/subsystem-bench/Cargo.toml b/polkadot/node/subsystem-bench/Cargo.toml index d9e68b901e3..73405a3bc3b 100644 --- a/polkadot/node/subsystem-bench/Cargo.toml +++ b/polkadot/node/subsystem-bench/Cargo.toml @@ -31,7 +31,7 @@ async-trait = "0.1.74" sp-keystore = { path = "../../../substrate/primitives/keystore" } sc-keystore = { path = "../../../substrate/client/keystore" } sp-core = { path = "../../../substrate/primitives/core" } -clap = { version = "4.4.12", features = ["derive"] } +clap = { version = "4.4.13", features = ["derive"] } futures = "0.3.21" futures-timer = "3.0.2" gum = { package = "tracing-gum", path = "../gum" } @@ -52,7 +52,7 @@ itertools = "0.11.0" polkadot-primitives-test-helpers = { path = "../../primitives/test-helpers" } prometheus_endpoint = { package = "substrate-prometheus-endpoint", path = "../../../substrate/utils/prometheus" } prometheus = { version = "0.13.0", default-features = false } -serde = "1.0.194" +serde = "1.0.195" serde_yaml = "0.9" paste = "1.0.14" orchestra = { version = "0.3.3", default-features = false, features = ["futures_channel"] } diff --git a/polkadot/node/test/service/Cargo.toml b/polkadot/node/test/service/Cargo.toml index f8c35900dbe..f0410853799 100644 --- a/polkadot/node/test/service/Cargo.toml +++ b/polkadot/node/test/service/Cargo.toml @@ -14,7 +14,7 @@ futures = "0.3.21" hex = "0.4.3" gum = { package = "tracing-gum", path = "../../gum" } rand = "0.8.5" -serde_json = "1.0.110" +serde_json = "1.0.111" tempfile = "3.2.0" tokio = "1.24.2" diff --git a/polkadot/node/zombienet-backchannel/Cargo.toml b/polkadot/node/zombienet-backchannel/Cargo.toml index 7f44a98b6a9..82c6f2532ca 100644 --- a/polkadot/node/zombienet-backchannel/Cargo.toml +++ b/polkadot/node/zombienet-backchannel/Cargo.toml @@ -22,4 +22,4 @@ reqwest = { version = "0.11", features = ["rustls-tls"], default-features = fals thiserror = "1.0.48" gum = { package = "tracing-gum", path = "../gum" } serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0.110" +serde_json = "1.0.111" diff --git a/polkadot/parachain/Cargo.toml b/polkadot/parachain/Cargo.toml index 52858d3ed70..418fe0e6117 100644 --- a/polkadot/parachain/Cargo.toml +++ b/polkadot/parachain/Cargo.toml @@ -24,7 +24,7 @@ derive_more = "0.99.11" bounded-collections = { version = "0.1.8", default-features = false, features = ["serde"] } # all optional crates. -serde = { version = "1.0.194", default-features = false, features = ["alloc", "derive"] } +serde = { version = "1.0.195", default-features = false, features = ["alloc", "derive"] } [features] default = ["std"] diff --git a/polkadot/parachain/test-parachains/adder/collator/Cargo.toml b/polkadot/parachain/test-parachains/adder/collator/Cargo.toml index f7ba527f6b4..a6517608b26 100644 --- a/polkadot/parachain/test-parachains/adder/collator/Cargo.toml +++ b/polkadot/parachain/test-parachains/adder/collator/Cargo.toml @@ -16,7 +16,7 @@ path = "src/main.rs" [dependencies] parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive"] } -clap = { version = "4.4.12", features = ["derive"] } +clap = { version = "4.4.13", features = ["derive"] } futures = "0.3.21" futures-timer = "3.0.2" log = "0.4.17" diff --git a/polkadot/parachain/test-parachains/undying/collator/Cargo.toml b/polkadot/parachain/test-parachains/undying/collator/Cargo.toml index a9f6e366cd6..d34a855ab9d 100644 --- a/polkadot/parachain/test-parachains/undying/collator/Cargo.toml +++ b/polkadot/parachain/test-parachains/undying/collator/Cargo.toml @@ -16,7 +16,7 @@ path = "src/main.rs" [dependencies] parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive"] } -clap = { version = "4.4.12", features = ["derive"] } +clap = { version = "4.4.13", features = ["derive"] } futures = "0.3.21" futures-timer = "3.0.2" log = "0.4.17" diff --git a/polkadot/primitives/Cargo.toml b/polkadot/primitives/Cargo.toml index 56fa14bcb7d..2552b9abc40 100644 --- a/polkadot/primitives/Cargo.toml +++ b/polkadot/primitives/Cargo.toml @@ -14,7 +14,7 @@ bitvec = { version = "1.0.0", default-features = false, features = ["alloc", "se hex-literal = "0.4.1" parity-scale-codec = { version = "3.6.1", default-features = false, features = ["bit-vec", "derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["bit-vec", "derive", "serde"] } -serde = { version = "1.0.194", default-features = false, features = ["alloc", "derive"] } +serde = { version = "1.0.195", default-features = false, features = ["alloc", "derive"] } application-crypto = { package = "sp-application-crypto", path = "../../substrate/primitives/application-crypto", default-features = false, features = ["serde"] } inherents = { package = "sp-inherents", path = "../../substrate/primitives/inherents", default-features = false } diff --git a/polkadot/runtime/common/Cargo.toml b/polkadot/runtime/common/Cargo.toml index fc2f3e2eb5a..f05963091dd 100644 --- a/polkadot/runtime/common/Cargo.toml +++ b/polkadot/runtime/common/Cargo.toml @@ -16,7 +16,7 @@ parity-scale-codec = { version = "3.6.1", default-features = false, features = [ log = { version = "0.4.17", default-features = false } rustc-hex = { version = "2.1.0", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.194", default-features = false, features = ["alloc"] } +serde = { version = "1.0.195", default-features = false, features = ["alloc"] } serde_derive = { version = "1.0.117" } static_assertions = "1.1.0" @@ -69,7 +69,7 @@ pallet-babe = { path = "../../../substrate/frame/babe" } pallet-treasury = { path = "../../../substrate/frame/treasury" } sp-keystore = { path = "../../../substrate/primitives/keystore" } sp-keyring = { path = "../../../substrate/primitives/keyring" } -serde_json = "1.0.110" +serde_json = "1.0.111" libsecp256k1 = "0.7.0" test-helpers = { package = "polkadot-primitives-test-helpers", path = "../../primitives/test-helpers" } diff --git a/polkadot/runtime/parachains/Cargo.toml b/polkadot/runtime/parachains/Cargo.toml index 65e76ccce31..dcfb7108dd2 100644 --- a/polkadot/runtime/parachains/Cargo.toml +++ b/polkadot/runtime/parachains/Cargo.toml @@ -16,7 +16,7 @@ parity-scale-codec = { version = "3.6.1", default-features = false, features = [ log = { version = "0.4.17", default-features = false } rustc-hex = { version = "2.1.0", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.194", default-features = false, features = ["alloc", "derive"] } +serde = { version = "1.0.195", default-features = false, features = ["alloc", "derive"] } derive_more = "0.99.17" bitflags = "1.3.2" @@ -68,7 +68,7 @@ test-helpers = { package = "polkadot-primitives-test-helpers", path = "../../pri sp-tracing = { path = "../../../substrate/primitives/tracing" } thousands = "0.2.0" assert_matches = "1" -serde_json = "1.0.110" +serde_json = "1.0.111" [features] default = ["std"] diff --git a/polkadot/runtime/rococo/Cargo.toml b/polkadot/runtime/rococo/Cargo.toml index cdedf965f9a..992cc0b708a 100644 --- a/polkadot/runtime/rococo/Cargo.toml +++ b/polkadot/runtime/rococo/Cargo.toml @@ -14,7 +14,7 @@ workspace = true parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive", "max-encoded-len"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } log = { version = "0.4.17", default-features = false } -serde = { version = "1.0.194", default-features = false } +serde = { version = "1.0.195", default-features = false } serde_derive = { version = "1.0.117", optional = true } static_assertions = "1.1.0" smallvec = "1.8.0" @@ -111,7 +111,7 @@ keyring = { package = "sp-keyring", path = "../../../substrate/primitives/keyrin remote-externalities = { package = "frame-remote-externalities", path = "../../../substrate/utils/frame/remote-externalities" } sp-trie = { path = "../../../substrate/primitives/trie" } separator = "0.4.1" -serde_json = "1.0.110" +serde_json = "1.0.111" sp-tracing = { path = "../../../substrate/primitives/tracing", default-features = false } tokio = { version = "1.24.2", features = ["macros"] } diff --git a/polkadot/runtime/test-runtime/Cargo.toml b/polkadot/runtime/test-runtime/Cargo.toml index 582124fe3ea..9778ff82439 100644 --- a/polkadot/runtime/test-runtime/Cargo.toml +++ b/polkadot/runtime/test-runtime/Cargo.toml @@ -16,7 +16,7 @@ parity-scale-codec = { version = "3.6.1", default-features = false, features = [ log = { version = "0.4.17", default-features = false } rustc-hex = { version = "2.1.0", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.194", default-features = false } +serde = { version = "1.0.195", default-features = false } serde_derive = { version = "1.0.117", optional = true } smallvec = "1.8.0" @@ -74,7 +74,7 @@ hex-literal = "0.4.1" tiny-keccak = { version = "2.0.2", features = ["keccak"] } keyring = { package = "sp-keyring", path = "../../../substrate/primitives/keyring" } sp-trie = { path = "../../../substrate/primitives/trie" } -serde_json = "1.0.110" +serde_json = "1.0.111" [build-dependencies] substrate-wasm-builder = { path = "../../../substrate/utils/wasm-builder" } diff --git a/polkadot/runtime/westend/Cargo.toml b/polkadot/runtime/westend/Cargo.toml index 02db976e28a..8e442d0f853 100644 --- a/polkadot/runtime/westend/Cargo.toml +++ b/polkadot/runtime/westend/Cargo.toml @@ -16,7 +16,7 @@ parity-scale-codec = { version = "3.6.1", default-features = false, features = [ scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } log = { version = "0.4.17", default-features = false } rustc-hex = { version = "2.1.0", default-features = false } -serde = { version = "1.0.194", default-features = false } +serde = { version = "1.0.195", default-features = false } serde_derive = { version = "1.0.117", optional = true } smallvec = "1.8.0" @@ -119,7 +119,7 @@ xcm-builder = { package = "staging-xcm-builder", path = "../../xcm/xcm-builder", hex-literal = "0.4.1" tiny-keccak = { version = "2.0.2", features = ["keccak"] } keyring = { package = "sp-keyring", path = "../../../substrate/primitives/keyring" } -serde_json = "1.0.110" +serde_json = "1.0.111" remote-externalities = { package = "frame-remote-externalities", path = "../../../substrate/utils/frame/remote-externalities" } tokio = { version = "1.24.2", features = ["macros"] } sp-tracing = { path = "../../../substrate/primitives/tracing", default-features = false } diff --git a/polkadot/utils/generate-bags/Cargo.toml b/polkadot/utils/generate-bags/Cargo.toml index 179be5c4ac1..8ec828ba072 100644 --- a/polkadot/utils/generate-bags/Cargo.toml +++ b/polkadot/utils/generate-bags/Cargo.toml @@ -10,7 +10,7 @@ description = "CLI to generate voter bags for Polkadot runtimes" workspace = true [dependencies] -clap = { version = "4.4.12", features = ["derive"] } +clap = { version = "4.4.13", features = ["derive"] } generate-bags = { path = "../../../substrate/utils/frame/generate-bags" } sp-io = { path = "../../../substrate/primitives/io" } diff --git a/polkadot/utils/remote-ext-tests/bags-list/Cargo.toml b/polkadot/utils/remote-ext-tests/bags-list/Cargo.toml index a4ffed0a5ce..8ee277e64b5 100644 --- a/polkadot/utils/remote-ext-tests/bags-list/Cargo.toml +++ b/polkadot/utils/remote-ext-tests/bags-list/Cargo.toml @@ -18,6 +18,6 @@ sp-tracing = { path = "../../../../substrate/primitives/tracing" } frame-system = { path = "../../../../substrate/frame/system" } sp-core = { path = "../../../../substrate/primitives/core" } -clap = { version = "4.4.12", features = ["derive"] } +clap = { version = "4.4.13", features = ["derive"] } log = "0.4.17" tokio = { version = "1.24.2", features = ["macros"] } diff --git a/polkadot/xcm/Cargo.toml b/polkadot/xcm/Cargo.toml index 4d04a002fe0..89e3728a361 100644 --- a/polkadot/xcm/Cargo.toml +++ b/polkadot/xcm/Cargo.toml @@ -18,7 +18,7 @@ log = { version = "0.4.17", default-features = false } parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive", "max-encoded-len"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive", "serde"] } sp-weights = { path = "../../substrate/primitives/weights", default-features = false, features = ["serde"] } -serde = { version = "1.0.194", default-features = false, features = ["alloc", "derive"] } +serde = { version = "1.0.195", default-features = false, features = ["alloc", "derive"] } schemars = { version = "0.8.13", default-features = true, optional = true } xcm-procedural = { path = "procedural" } environmental = { version = "1.1.4", default-features = false } diff --git a/polkadot/xcm/pallet-xcm/Cargo.toml b/polkadot/xcm/pallet-xcm/Cargo.toml index a4d0bb01b2b..b3e57d1d091 100644 --- a/polkadot/xcm/pallet-xcm/Cargo.toml +++ b/polkadot/xcm/pallet-xcm/Cargo.toml @@ -13,7 +13,7 @@ workspace = true bounded-collections = { version = "0.1.8", default-features = false } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.194", optional = true, features = ["derive"] } +serde = { version = "1.0.195", optional = true, features = ["derive"] } log = { version = "0.4.17", default-features = false } frame-support = { path = "../../../substrate/frame/support", default-features = false } diff --git a/polkadot/xcm/procedural/Cargo.toml b/polkadot/xcm/procedural/Cargo.toml index 6ebae40f4a3..74990f873ab 100644 --- a/polkadot/xcm/procedural/Cargo.toml +++ b/polkadot/xcm/procedural/Cargo.toml @@ -16,7 +16,7 @@ proc-macro = true [dependencies] proc-macro2 = "1.0.56" quote = "1.0.28" -syn = "2.0.43" +syn = "2.0.48" Inflector = "0.11.4" [dev-dependencies] diff --git a/substrate/bin/minimal/node/Cargo.toml b/substrate/bin/minimal/node/Cargo.toml index 64851d5b352..42eced506c4 100644 --- a/substrate/bin/minimal/node/Cargo.toml +++ b/substrate/bin/minimal/node/Cargo.toml @@ -20,11 +20,11 @@ targets = ["x86_64-unknown-linux-gnu"] name = "minimal-node" [dependencies] -clap = { version = "4.4.12", features = ["derive"] } +clap = { version = "4.4.13", features = ["derive"] } futures = { version = "0.3.21", features = ["thread-pool"] } futures-timer = "3.0.1" jsonrpsee = { version = "0.16.2", features = ["server"] } -serde_json = "1.0.110" +serde_json = "1.0.111" sc-cli = { path = "../../../client/cli" } sc-executor = { path = "../../../client/executor" } diff --git a/substrate/bin/node-template/node/Cargo.toml b/substrate/bin/node-template/node/Cargo.toml index 30468a2093c..6a600364c4d 100644 --- a/substrate/bin/node-template/node/Cargo.toml +++ b/substrate/bin/node-template/node/Cargo.toml @@ -20,9 +20,9 @@ targets = ["x86_64-unknown-linux-gnu"] name = "node-template" [dependencies] -clap = { version = "4.4.12", features = ["derive"] } +clap = { version = "4.4.13", features = ["derive"] } futures = { version = "0.3.21", features = ["thread-pool"] } -serde_json = "1.0.110" +serde_json = "1.0.111" sc-cli = { path = "../../../client/cli" } sp-core = { path = "../../../primitives/core" } diff --git a/substrate/bin/node-template/runtime/Cargo.toml b/substrate/bin/node-template/runtime/Cargo.toml index d274eaa7a09..a7b93a230ca 100644 --- a/substrate/bin/node-template/runtime/Cargo.toml +++ b/substrate/bin/node-template/runtime/Cargo.toml @@ -42,7 +42,7 @@ sp-std = { path = "../../../primitives/std", default-features = false } sp-storage = { path = "../../../primitives/storage", default-features = false } sp-transaction-pool = { path = "../../../primitives/transaction-pool", default-features = false } sp-version = { path = "../../../primitives/version", default-features = false, features = ["serde"] } -serde_json = { version = "1.0.110", default-features = false, features = ["alloc"] } +serde_json = { version = "1.0.111", default-features = false, features = ["alloc"] } sp-genesis-builder = { default-features = false, path = "../../../primitives/genesis-builder" } # Used for the node template's RPCs diff --git a/substrate/bin/node/bench/Cargo.toml b/substrate/bin/node/bench/Cargo.toml index 52b2d94453d..e90b7070396 100644 --- a/substrate/bin/node/bench/Cargo.toml +++ b/substrate/bin/node/bench/Cargo.toml @@ -16,7 +16,7 @@ workspace = true [dependencies] array-bytes = "6.1" -clap = { version = "4.4.12", features = ["derive"] } +clap = { version = "4.4.13", features = ["derive"] } log = "0.4.17" node-primitives = { path = "../primitives" } node-testing = { path = "../testing" } @@ -24,8 +24,8 @@ kitchensink-runtime = { path = "../runtime" } sc-client-api = { path = "../../../client/api" } sp-runtime = { path = "../../../primitives/runtime" } sp-state-machine = { path = "../../../primitives/state-machine" } -serde = "1.0.194" -serde_json = "1.0.110" +serde = "1.0.195" +serde_json = "1.0.111" derive_more = { version = "0.99.17", default-features = false, features = ["display"] } kvdb = "0.13.0" kvdb-rocksdb = "0.19.0" diff --git a/substrate/bin/node/cli/Cargo.toml b/substrate/bin/node/cli/Cargo.toml index 35d632865ee..3a80dc4e0cc 100644 --- a/substrate/bin/node/cli/Cargo.toml +++ b/substrate/bin/node/cli/Cargo.toml @@ -41,9 +41,9 @@ crate-type = ["cdylib", "rlib"] [dependencies] # third-party dependencies array-bytes = "6.1" -clap = { version = "4.4.12", features = ["derive"], optional = true } +clap = { version = "4.4.13", features = ["derive"], optional = true } codec = { package = "parity-scale-codec", version = "3.6.1" } -serde = { version = "1.0.194", features = ["derive"] } +serde = { version = "1.0.195", features = ["derive"] } jsonrpsee = { version = "0.16.2", features = ["server"] } futures = "0.3.21" log = "0.4.17" @@ -116,7 +116,7 @@ sc-cli = { path = "../../../client/cli", optional = true } frame-benchmarking-cli = { path = "../../../utils/frame/benchmarking-cli", optional = true } node-inspect = { package = "staging-node-inspect", path = "../inspect", optional = true } try-runtime-cli = { path = "../../../utils/frame/try-runtime/cli", optional = true } -serde_json = "1.0.110" +serde_json = "1.0.111" [dev-dependencies] sc-keystore = { path = "../../../client/keystore" } @@ -158,13 +158,13 @@ sp-consensus-babe = { path = "../../../primitives/consensus/babe" } sp-externalities = { path = "../../../primitives/externalities" } sp-keyring = { path = "../../../primitives/keyring" } sp-runtime = { path = "../../../primitives/runtime" } -serde_json = "1.0.110" +serde_json = "1.0.111" scale-info = { version = "2.10.0", features = ["derive", "serde"] } sp-trie = { path = "../../../primitives/trie" } sp-state-machine = { path = "../../../primitives/state-machine" } [build-dependencies] -clap = { version = "4.4.12", optional = true } +clap = { version = "4.4.13", optional = true } clap_complete = { version = "4.0.2", optional = true } node-inspect = { package = "staging-node-inspect", path = "../inspect", optional = true } frame-benchmarking-cli = { path = "../../../utils/frame/benchmarking-cli", optional = true } diff --git a/substrate/bin/node/inspect/Cargo.toml b/substrate/bin/node/inspect/Cargo.toml index f3f531a4db1..d14cc8ff760 100644 --- a/substrate/bin/node/inspect/Cargo.toml +++ b/substrate/bin/node/inspect/Cargo.toml @@ -15,7 +15,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -clap = { version = "4.4.12", features = ["derive"] } +clap = { version = "4.4.13", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.6.1" } thiserror = "1.0" sc-cli = { path = "../../../client/cli" } diff --git a/substrate/bin/node/runtime/Cargo.toml b/substrate/bin/node/runtime/Cargo.toml index 93695912c52..4bb5fed2b09 100644 --- a/substrate/bin/node/runtime/Cargo.toml +++ b/substrate/bin/node/runtime/Cargo.toml @@ -26,7 +26,7 @@ codec = { package = "parity-scale-codec", version = "3.6.1", default-features = scale-info = { version = "2.10.0", default-features = false, features = ["derive", "serde"] } static_assertions = "1.1.0" log = { version = "0.4.17", default-features = false } -serde_json = { version = "1.0.110", default-features = false, features = ["alloc", "arbitrary_precision"] } +serde_json = { version = "1.0.111", default-features = false, features = ["alloc", "arbitrary_precision"] } # pallet-asset-conversion: turn on "num-traits" feature primitive-types = { version = "0.12.0", default-features = false, features = ["codec", "num-traits", "scale-info"] } diff --git a/substrate/bin/utils/chain-spec-builder/Cargo.toml b/substrate/bin/utils/chain-spec-builder/Cargo.toml index 0a1b1345a15..3848ef91588 100644 --- a/substrate/bin/utils/chain-spec-builder/Cargo.toml +++ b/substrate/bin/utils/chain-spec-builder/Cargo.toml @@ -23,8 +23,8 @@ name = "chain-spec-builder" crate-type = ["rlib"] [dependencies] -clap = { version = "4.4.12", features = ["derive"] } +clap = { version = "4.4.13", features = ["derive"] } log = "0.4.17" sc-chain-spec = { path = "../../../client/chain-spec" } -serde_json = "1.0.110" +serde_json = "1.0.111" sp-tracing = { version = "10.0.0", path = "../../../primitives/tracing" } diff --git a/substrate/bin/utils/subkey/Cargo.toml b/substrate/bin/utils/subkey/Cargo.toml index 57613cb718c..d4ecfda3735 100644 --- a/substrate/bin/utils/subkey/Cargo.toml +++ b/substrate/bin/utils/subkey/Cargo.toml @@ -20,5 +20,5 @@ path = "src/main.rs" name = "subkey" [dependencies] -clap = { version = "4.4.12", features = ["derive"] } +clap = { version = "4.4.13", features = ["derive"] } sc-cli = { path = "../../../client/cli" } diff --git a/substrate/client/chain-spec/Cargo.toml b/substrate/client/chain-spec/Cargo.toml index 6943c5d94ac..8af9e1b4758 100644 --- a/substrate/client/chain-spec/Cargo.toml +++ b/substrate/client/chain-spec/Cargo.toml @@ -18,8 +18,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } memmap2 = "0.5.0" -serde = { version = "1.0.194", features = ["derive"] } -serde_json = "1.0.110" +serde = { version = "1.0.195", features = ["derive"] } +serde_json = "1.0.111" sc-client-api = { path = "../api" } sc-chain-spec-derive = { path = "derive" } sc-executor = { path = "../executor" } diff --git a/substrate/client/chain-spec/derive/Cargo.toml b/substrate/client/chain-spec/derive/Cargo.toml index b8dcd5e5665..8f8c2c0de2d 100644 --- a/substrate/client/chain-spec/derive/Cargo.toml +++ b/substrate/client/chain-spec/derive/Cargo.toml @@ -21,4 +21,4 @@ proc-macro = true proc-macro-crate = "2.0.1" proc-macro2 = "1.0.56" quote = "1.0.28" -syn = "2.0.43" +syn = "2.0.48" diff --git a/substrate/client/cli/Cargo.toml b/substrate/client/cli/Cargo.toml index 56bc0dd2504..526db17fa32 100644 --- a/substrate/client/cli/Cargo.toml +++ b/substrate/client/cli/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] array-bytes = "6.1" chrono = "0.4.31" -clap = { version = "4.4.12", features = ["derive", "string", "wrap_help"] } +clap = { version = "4.4.13", features = ["derive", "string", "wrap_help"] } fdlimit = "0.3.0" futures = "0.3.21" itertools = "0.10.3" @@ -29,8 +29,8 @@ parity-scale-codec = "3.6.1" rand = "0.8.5" regex = "1.6.0" rpassword = "7.0.0" -serde = "1.0.194" -serde_json = "1.0.110" +serde = "1.0.195" +serde_json = "1.0.111" thiserror = "1.0.48" bip39 = "2.0.0" tokio = { version = "1.22.0", features = ["parking_lot", "rt-multi-thread", "signal"] } diff --git a/substrate/client/consensus/babe/rpc/Cargo.toml b/substrate/client/consensus/babe/rpc/Cargo.toml index ef053a0ab26..753f8fbc821 100644 --- a/substrate/client/consensus/babe/rpc/Cargo.toml +++ b/substrate/client/consensus/babe/rpc/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] jsonrpsee = { version = "0.16.2", features = ["client-core", "macros", "server"] } futures = "0.3.21" -serde = { version = "1.0.194", features = ["derive"] } +serde = { version = "1.0.195", features = ["derive"] } thiserror = "1.0" sc-consensus-babe = { path = ".." } sc-consensus-epochs = { path = "../../epochs" } @@ -33,7 +33,7 @@ sp-keystore = { path = "../../../../primitives/keystore" } sp-runtime = { path = "../../../../primitives/runtime" } [dev-dependencies] -serde_json = "1.0.110" +serde_json = "1.0.111" tokio = "1.22.0" sc-consensus = { path = "../../common" } sc-keystore = { path = "../../../keystore" } diff --git a/substrate/client/consensus/beefy/Cargo.toml b/substrate/client/consensus/beefy/Cargo.toml index 77c1baa053a..c54452faebe 100644 --- a/substrate/client/consensus/beefy/Cargo.toml +++ b/substrate/client/consensus/beefy/Cargo.toml @@ -43,7 +43,7 @@ tokio = "1.22.0" [dev-dependencies] -serde = "1.0.194" +serde = "1.0.195" tempfile = "3.1.0" sc-block-builder = { path = "../../block-builder" } sc-network-test = { path = "../../network/test" } diff --git a/substrate/client/consensus/beefy/rpc/Cargo.toml b/substrate/client/consensus/beefy/rpc/Cargo.toml index 921ced61cca..198d3d81642 100644 --- a/substrate/client/consensus/beefy/rpc/Cargo.toml +++ b/substrate/client/consensus/beefy/rpc/Cargo.toml @@ -17,7 +17,7 @@ futures = "0.3.21" jsonrpsee = { version = "0.16.2", features = ["client-core", "macros", "server"] } log = "0.4" parking_lot = "0.12.1" -serde = { version = "1.0.194", features = ["derive"] } +serde = { version = "1.0.195", features = ["derive"] } thiserror = "1.0" sc-consensus-beefy = { path = ".." } sp-consensus-beefy = { path = "../../../../primitives/consensus/beefy" } @@ -26,7 +26,7 @@ sp-core = { path = "../../../../primitives/core" } sp-runtime = { path = "../../../../primitives/runtime" } [dev-dependencies] -serde_json = "1.0.110" +serde_json = "1.0.111" sc-rpc = { path = "../../../rpc", features = ["test-helpers"] } substrate-test-runtime-client = { path = "../../../../test-utils/runtime/client" } tokio = { version = "1.22.0", features = ["macros"] } diff --git a/substrate/client/consensus/grandpa/Cargo.toml b/substrate/client/consensus/grandpa/Cargo.toml index d0c024f64fa..a6aacd56485 100644 --- a/substrate/client/consensus/grandpa/Cargo.toml +++ b/substrate/client/consensus/grandpa/Cargo.toml @@ -28,7 +28,7 @@ log = "0.4.17" parity-scale-codec = { version = "3.6.1", features = ["derive"] } parking_lot = "0.12.1" rand = "0.8.5" -serde_json = "1.0.110" +serde_json = "1.0.111" thiserror = "1.0" fork-tree = { path = "../../../utils/fork-tree" } prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../../utils/prometheus" } @@ -56,7 +56,7 @@ sp-runtime = { path = "../../../primitives/runtime" } [dev-dependencies] assert_matches = "1.3.0" finality-grandpa = { version = "0.16.2", features = ["derive-codec", "test-helpers"] } -serde = "1.0.194" +serde = "1.0.195" tokio = "1.22.0" sc-network = { path = "../../network" } sc-network-test = { path = "../../network/test" } diff --git a/substrate/client/consensus/grandpa/rpc/Cargo.toml b/substrate/client/consensus/grandpa/rpc/Cargo.toml index a6d0f39c0cd..9cfc9616cbc 100644 --- a/substrate/client/consensus/grandpa/rpc/Cargo.toml +++ b/substrate/client/consensus/grandpa/rpc/Cargo.toml @@ -18,7 +18,7 @@ futures = "0.3.16" jsonrpsee = { version = "0.16.2", features = ["client-core", "macros", "server"] } log = "0.4.8" parity-scale-codec = { version = "3.6.1", features = ["derive"] } -serde = { version = "1.0.194", features = ["derive"] } +serde = { version = "1.0.195", features = ["derive"] } thiserror = "1.0" sc-client-api = { path = "../../../api" } sc-consensus-grandpa = { path = ".." } diff --git a/substrate/client/keystore/Cargo.toml b/substrate/client/keystore/Cargo.toml index 45c7f774e2e..8fa6221ff19 100644 --- a/substrate/client/keystore/Cargo.toml +++ b/substrate/client/keystore/Cargo.toml @@ -19,7 +19,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] array-bytes = "6.1" parking_lot = "0.12.1" -serde_json = "1.0.110" +serde_json = "1.0.111" thiserror = "1.0" sp-application-crypto = { path = "../../primitives/application-crypto" } sp-core = { path = "../../primitives/core" } diff --git a/substrate/client/merkle-mountain-range/rpc/Cargo.toml b/substrate/client/merkle-mountain-range/rpc/Cargo.toml index e38ef061a71..8eb48d65f81 100644 --- a/substrate/client/merkle-mountain-range/rpc/Cargo.toml +++ b/substrate/client/merkle-mountain-range/rpc/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1" } jsonrpsee = { version = "0.16.2", features = ["client-core", "macros", "server"] } -serde = { version = "1.0.194", features = ["derive"] } +serde = { version = "1.0.195", features = ["derive"] } sp-api = { path = "../../../primitives/api" } sp-blockchain = { path = "../../../primitives/blockchain" } sp-core = { path = "../../../primitives/core" } @@ -26,4 +26,4 @@ sp-runtime = { path = "../../../primitives/runtime" } anyhow = "1" [dev-dependencies] -serde_json = "1.0.110" +serde_json = "1.0.111" diff --git a/substrate/client/network/Cargo.toml b/substrate/client/network/Cargo.toml index ab2d02fd80e..f2e6f54547b 100644 --- a/substrate/client/network/Cargo.toml +++ b/substrate/client/network/Cargo.toml @@ -36,8 +36,8 @@ parking_lot = "0.12.1" partial_sort = "0.2.0" pin-project = "1.0.12" rand = "0.8.5" -serde = { version = "1.0.194", features = ["derive"] } -serde_json = "1.0.110" +serde = { version = "1.0.195", features = ["derive"] } +serde_json = "1.0.111" smallvec = "1.11.0" thiserror = "1.0" tokio = { version = "1.22.0", features = ["macros", "sync"] } diff --git a/substrate/client/rpc-api/Cargo.toml b/substrate/client/rpc-api/Cargo.toml index 7978148c3c8..062d25408a1 100644 --- a/substrate/client/rpc-api/Cargo.toml +++ b/substrate/client/rpc-api/Cargo.toml @@ -18,8 +18,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1" } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.194", features = ["derive"] } -serde_json = "1.0.110" +serde = { version = "1.0.195", features = ["derive"] } +serde_json = "1.0.111" thiserror = "1.0" sc-chain-spec = { path = "../chain-spec" } sc-mixnet = { path = "../mixnet" } diff --git a/substrate/client/rpc-servers/Cargo.toml b/substrate/client/rpc-servers/Cargo.toml index addbbab92d4..60d999863ca 100644 --- a/substrate/client/rpc-servers/Cargo.toml +++ b/substrate/client/rpc-servers/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] jsonrpsee = { version = "0.16.2", features = ["server"] } log = "0.4.17" -serde_json = "1.0.110" +serde_json = "1.0.111" tokio = { version = "1.22.0", features = ["parking_lot"] } prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus" } tower-http = { version = "0.4.0", features = ["cors"] } diff --git a/substrate/client/rpc-spec-v2/Cargo.toml b/substrate/client/rpc-spec-v2/Cargo.toml index 9ee18b59489..ba32308e678 100644 --- a/substrate/client/rpc-spec-v2/Cargo.toml +++ b/substrate/client/rpc-spec-v2/Cargo.toml @@ -42,7 +42,7 @@ log = "0.4.17" futures-util = { version = "0.3.19", default-features = false } [dev-dependencies] -serde_json = "1.0.110" +serde_json = "1.0.111" tokio = { version = "1.22.0", features = ["macros"] } substrate-test-runtime-client = { path = "../../test-utils/runtime/client" } substrate-test-runtime = { path = "../../test-utils/runtime" } diff --git a/substrate/client/rpc/Cargo.toml b/substrate/client/rpc/Cargo.toml index 5da79442544..47425c6d354 100644 --- a/substrate/client/rpc/Cargo.toml +++ b/substrate/client/rpc/Cargo.toml @@ -21,7 +21,7 @@ futures = "0.3.21" jsonrpsee = { version = "0.16.2", features = ["server"] } log = "0.4.17" parking_lot = "0.12.1" -serde_json = "1.0.110" +serde_json = "1.0.111" sc-block-builder = { path = "../block-builder" } sc-chain-spec = { path = "../chain-spec" } sc-client-api = { path = "../api" } diff --git a/substrate/client/service/Cargo.toml b/substrate/client/service/Cargo.toml index adfd8d45b24..576a8aac8e4 100644 --- a/substrate/client/service/Cargo.toml +++ b/substrate/client/service/Cargo.toml @@ -37,8 +37,8 @@ log = "0.4.17" futures-timer = "3.0.1" exit-future = "0.2.0" pin-project = "1.0.12" -serde = "1.0.194" -serde_json = "1.0.110" +serde = "1.0.195" +serde_json = "1.0.111" sc-keystore = { path = "../keystore" } sp-runtime = { path = "../../primitives/runtime" } sp-trie = { path = "../../primitives/trie" } diff --git a/substrate/client/storage-monitor/Cargo.toml b/substrate/client/storage-monitor/Cargo.toml index 8019682f3f1..37259b9234a 100644 --- a/substrate/client/storage-monitor/Cargo.toml +++ b/substrate/client/storage-monitor/Cargo.toml @@ -12,7 +12,7 @@ homepage = "https://substrate.io" workspace = true [dependencies] -clap = { version = "4.4.12", features = ["derive", "string"] } +clap = { version = "4.4.13", features = ["derive", "string"] } log = "0.4.17" fs4 = "0.7.0" sc-client-db = { path = "../db", default-features = false } diff --git a/substrate/client/sync-state-rpc/Cargo.toml b/substrate/client/sync-state-rpc/Cargo.toml index 6c78ff7e5e1..b3de9585ab4 100644 --- a/substrate/client/sync-state-rpc/Cargo.toml +++ b/substrate/client/sync-state-rpc/Cargo.toml @@ -17,8 +17,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1" } jsonrpsee = { version = "0.16.2", features = ["client-core", "macros", "server"] } -serde = { version = "1.0.194", features = ["derive"] } -serde_json = "1.0.110" +serde = { version = "1.0.195", features = ["derive"] } +serde_json = "1.0.111" thiserror = "1.0.48" sc-chain-spec = { path = "../chain-spec" } sc-client-api = { path = "../api" } diff --git a/substrate/client/sysinfo/Cargo.toml b/substrate/client/sysinfo/Cargo.toml index 9dfb44f6ab2..18ac161f1ee 100644 --- a/substrate/client/sysinfo/Cargo.toml +++ b/substrate/client/sysinfo/Cargo.toml @@ -24,8 +24,8 @@ rand = "0.8.5" rand_pcg = "0.3.1" derive_more = "0.99" regex = "1" -serde = { version = "1.0.194", features = ["derive"] } -serde_json = "1.0.110" +serde = { version = "1.0.195", features = ["derive"] } +serde_json = "1.0.111" sc-telemetry = { path = "../telemetry" } sp-core = { path = "../../primitives/core" } sp-io = { path = "../../primitives/io" } diff --git a/substrate/client/telemetry/Cargo.toml b/substrate/client/telemetry/Cargo.toml index 096ed71fb47..ba597ef898e 100644 --- a/substrate/client/telemetry/Cargo.toml +++ b/substrate/client/telemetry/Cargo.toml @@ -25,7 +25,7 @@ parking_lot = "0.12.1" pin-project = "1.0.12" sc-utils = { path = "../utils" } rand = "0.8.5" -serde = { version = "1.0.194", features = ["derive"] } -serde_json = "1.0.110" +serde = { version = "1.0.195", features = ["derive"] } +serde_json = "1.0.111" thiserror = "1.0.48" wasm-timer = "0.2.5" diff --git a/substrate/client/tracing/Cargo.toml b/substrate/client/tracing/Cargo.toml index fef7cc11157..fe288474ac9 100644 --- a/substrate/client/tracing/Cargo.toml +++ b/substrate/client/tracing/Cargo.toml @@ -26,7 +26,7 @@ log = { version = "0.4.17" } parking_lot = "0.12.1" regex = "1.6.0" rustc-hash = "1.1.0" -serde = "1.0.194" +serde = "1.0.195" thiserror = "1.0.48" tracing = "0.1.29" tracing-log = "0.1.3" diff --git a/substrate/client/tracing/proc-macro/Cargo.toml b/substrate/client/tracing/proc-macro/Cargo.toml index d6fd53fe1db..ff43f1ccb90 100644 --- a/substrate/client/tracing/proc-macro/Cargo.toml +++ b/substrate/client/tracing/proc-macro/Cargo.toml @@ -21,4 +21,4 @@ proc-macro = true proc-macro-crate = "2.0.1" proc-macro2 = "1.0.56" quote = { version = "1.0.28", features = ["proc-macro"] } -syn = { version = "2.0.43", features = ["extra-traits", "full", "parsing", "proc-macro"] } +syn = { version = "2.0.48", features = ["extra-traits", "full", "parsing", "proc-macro"] } diff --git a/substrate/client/transaction-pool/Cargo.toml b/substrate/client/transaction-pool/Cargo.toml index a3608c4ee39..8832c0bf508 100644 --- a/substrate/client/transaction-pool/Cargo.toml +++ b/substrate/client/transaction-pool/Cargo.toml @@ -23,7 +23,7 @@ futures-timer = "3.0.2" linked-hash-map = "0.5.4" log = "0.4.17" parking_lot = "0.12.1" -serde = { version = "1.0.194", features = ["derive"] } +serde = { version = "1.0.195", features = ["derive"] } thiserror = "1.0.48" prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus" } sc-client-api = { path = "../api" } diff --git a/substrate/client/transaction-pool/api/Cargo.toml b/substrate/client/transaction-pool/api/Cargo.toml index 93ee1a708bb..2522739cf88 100644 --- a/substrate/client/transaction-pool/api/Cargo.toml +++ b/substrate/client/transaction-pool/api/Cargo.toml @@ -16,11 +16,11 @@ async-trait = "0.1.74" codec = { package = "parity-scale-codec", version = "3.6.1" } futures = "0.3.21" log = "0.4.17" -serde = { version = "1.0.194", features = ["derive"] } +serde = { version = "1.0.195", features = ["derive"] } thiserror = "1.0.48" sp-blockchain = { path = "../../../primitives/blockchain" } sp-core = { path = "../../../primitives/core", default-features = false } sp-runtime = { path = "../../../primitives/runtime", default-features = false } [dev-dependencies] -serde_json = "1.0.110" +serde_json = "1.0.111" diff --git a/substrate/frame/beefy-mmr/Cargo.toml b/substrate/frame/beefy-mmr/Cargo.toml index cc240a05b65..f43e12d3ee7 100644 --- a/substrate/frame/beefy-mmr/Cargo.toml +++ b/substrate/frame/beefy-mmr/Cargo.toml @@ -16,7 +16,7 @@ array-bytes = { version = "6.1", optional = true } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.194", optional = true } +serde = { version = "1.0.195", optional = true } binary-merkle-tree = { path = "../../utils/binary-merkle-tree", default-features = false } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/beefy/Cargo.toml b/substrate/frame/beefy/Cargo.toml index 07e3d0d7e10..999e32ab450 100644 --- a/substrate/frame/beefy/Cargo.toml +++ b/substrate/frame/beefy/Cargo.toml @@ -15,7 +15,7 @@ workspace = true codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive", "serde"] } -serde = { version = "1.0.194", optional = true } +serde = { version = "1.0.195", optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } pallet-authorship = { path = "../authorship", default-features = false } diff --git a/substrate/frame/benchmarking/Cargo.toml b/substrate/frame/benchmarking/Cargo.toml index 6fc49c2ec1e..42001c2d08c 100644 --- a/substrate/frame/benchmarking/Cargo.toml +++ b/substrate/frame/benchmarking/Cargo.toml @@ -21,7 +21,7 @@ linregress = { version = "0.5.1", optional = true } log = { version = "0.4.17", default-features = false } paste = "1.0" scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.194", optional = true } +serde = { version = "1.0.195", optional = true } frame-support = { path = "../support", default-features = false } frame-support-procedural = { path = "../support/procedural", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/contracts/proc-macro/Cargo.toml b/substrate/frame/contracts/proc-macro/Cargo.toml index 14733256466..1c9802f6fde 100644 --- a/substrate/frame/contracts/proc-macro/Cargo.toml +++ b/substrate/frame/contracts/proc-macro/Cargo.toml @@ -20,7 +20,7 @@ proc-macro = true [dependencies] proc-macro2 = "1.0.56" quote = "1.0.28" -syn = { version = "2.0.43", features = ["full"] } +syn = { version = "2.0.48", features = ["full"] } [dev-dependencies] diff --git a/substrate/frame/conviction-voting/Cargo.toml b/substrate/frame/conviction-voting/Cargo.toml index 7cd25562435..78f524e3e66 100644 --- a/substrate/frame/conviction-voting/Cargo.toml +++ b/substrate/frame/conviction-voting/Cargo.toml @@ -22,7 +22,7 @@ codec = { package = "parity-scale-codec", version = "3.6.1", default-features = "max-encoded-len", ] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.194", features = ["derive"], optional = true } +serde = { version = "1.0.195", features = ["derive"], optional = true } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/democracy/Cargo.toml b/substrate/frame/democracy/Cargo.toml index d17aba0d424..cecb1df60d7 100644 --- a/substrate/frame/democracy/Cargo.toml +++ b/substrate/frame/democracy/Cargo.toml @@ -20,7 +20,7 @@ codec = { package = "parity-scale-codec", version = "3.6.1", default-features = "derive", ] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.194", features = ["derive"], optional = true } +serde = { version = "1.0.195", features = ["derive"], optional = true } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/election-provider-support/solution-type/Cargo.toml b/substrate/frame/election-provider-support/solution-type/Cargo.toml index 212ce2e4f15..74f43310418 100644 --- a/substrate/frame/election-provider-support/solution-type/Cargo.toml +++ b/substrate/frame/election-provider-support/solution-type/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] proc-macro = true [dependencies] -syn = { version = "2.0.43", features = ["full", "visit"] } +syn = { version = "2.0.48", features = ["full", "visit"] } quote = "1.0.28" proc-macro2 = "1.0.56" proc-macro-crate = "2.0.1" diff --git a/substrate/frame/election-provider-support/solution-type/fuzzer/Cargo.toml b/substrate/frame/election-provider-support/solution-type/fuzzer/Cargo.toml index 4de44889382..e21b9536727 100644 --- a/substrate/frame/election-provider-support/solution-type/fuzzer/Cargo.toml +++ b/substrate/frame/election-provider-support/solution-type/fuzzer/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -clap = { version = "4.4.12", features = ["derive"] } +clap = { version = "4.4.13", features = ["derive"] } honggfuzz = "0.5" rand = { version = "0.8", features = ["small_rng", "std"] } diff --git a/substrate/frame/message-queue/Cargo.toml b/substrate/frame/message-queue/Cargo.toml index 4b9215f6657..e3ab370727e 100644 --- a/substrate/frame/message-queue/Cargo.toml +++ b/substrate/frame/message-queue/Cargo.toml @@ -14,7 +14,7 @@ workspace = true [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.194", optional = true, features = ["derive"] } +serde = { version = "1.0.195", optional = true, features = ["derive"] } log = { version = "0.4.17", default-features = false } environmental = { version = "1.1.4", default-features = false } diff --git a/substrate/frame/mixnet/Cargo.toml b/substrate/frame/mixnet/Cargo.toml index b562c5cc056..ea8b1b00e49 100644 --- a/substrate/frame/mixnet/Cargo.toml +++ b/substrate/frame/mixnet/Cargo.toml @@ -22,7 +22,7 @@ frame-support = { default-features = false, path = "../support" } frame-system = { default-features = false, path = "../system" } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.194", default-features = false, features = ["derive"] } +serde = { version = "1.0.195", default-features = false, features = ["derive"] } sp-application-crypto = { default-features = false, path = "../../primitives/application-crypto" } sp-arithmetic = { default-features = false, path = "../../primitives/arithmetic" } sp-io = { default-features = false, path = "../../primitives/io" } diff --git a/substrate/frame/offences/Cargo.toml b/substrate/frame/offences/Cargo.toml index 46e9757a97c..cda247325ef 100644 --- a/substrate/frame/offences/Cargo.toml +++ b/substrate/frame/offences/Cargo.toml @@ -19,7 +19,7 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.194", optional = true } +serde = { version = "1.0.195", optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } pallet-balances = { path = "../balances", default-features = false } diff --git a/substrate/frame/referenda/Cargo.toml b/substrate/frame/referenda/Cargo.toml index 8edced5c520..d38be0d283e 100644 --- a/substrate/frame/referenda/Cargo.toml +++ b/substrate/frame/referenda/Cargo.toml @@ -21,7 +21,7 @@ codec = { package = "parity-scale-codec", version = "3.6.1", default-features = "derive", ] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.194", features = ["derive"], optional = true } +serde = { version = "1.0.195", features = ["derive"], optional = true } sp-arithmetic = { path = "../../primitives/arithmetic", default-features = false } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } diff --git a/substrate/frame/remark/Cargo.toml b/substrate/frame/remark/Cargo.toml index e1899bac2aa..1570d2dba27 100644 --- a/substrate/frame/remark/Cargo.toml +++ b/substrate/frame/remark/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.194", optional = true } +serde = { version = "1.0.195", optional = true } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/staking/Cargo.toml b/substrate/frame/staking/Cargo.toml index 7e1ad492aa0..7e933ed951e 100644 --- a/substrate/frame/staking/Cargo.toml +++ b/substrate/frame/staking/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -serde = { version = "1.0.194", default-features = false, features = ["alloc", "derive"] } +serde = { version = "1.0.195", default-features = false, features = ["alloc", "derive"] } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = [ "derive", ] } diff --git a/substrate/frame/staking/reward-curve/Cargo.toml b/substrate/frame/staking/reward-curve/Cargo.toml index fcf2faeee53..0e13d4550f4 100644 --- a/substrate/frame/staking/reward-curve/Cargo.toml +++ b/substrate/frame/staking/reward-curve/Cargo.toml @@ -21,7 +21,7 @@ proc-macro = true proc-macro-crate = "2.0.1" proc-macro2 = "1.0.56" quote = "1.0.28" -syn = { version = "2.0.43", features = ["full", "visit"] } +syn = { version = "2.0.48", features = ["full", "visit"] } [dev-dependencies] sp-runtime = { path = "../../../primitives/runtime" } diff --git a/substrate/frame/state-trie-migration/Cargo.toml b/substrate/frame/state-trie-migration/Cargo.toml index 4f4960e05c4..e27d4c46926 100644 --- a/substrate/frame/state-trie-migration/Cargo.toml +++ b/substrate/frame/state-trie-migration/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.194", optional = true } +serde = { version = "1.0.195", optional = true } thousands = { version = "0.2.0", optional = true } zstd = { version = "0.12.4", default-features = false, optional = true } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } diff --git a/substrate/frame/support/Cargo.toml b/substrate/frame/support/Cargo.toml index 20a2c2e93e0..5c0c4091468 100644 --- a/substrate/frame/support/Cargo.toml +++ b/substrate/frame/support/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] array-bytes = { version = "6.1", default-features = false } -serde = { version = "1.0.194", default-features = false, features = ["alloc", "derive"] } +serde = { version = "1.0.195", default-features = false, features = ["alloc", "derive"] } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive", "max-encoded-len"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } frame-metadata = { version = "16.0.0", default-features = false, features = ["current"] } @@ -46,7 +46,7 @@ sp-core-hashing-proc-macro = { path = "../../primitives/core/hashing/proc-macro" k256 = { version = "0.13.1", default-features = false, features = ["ecdsa"] } environmental = { version = "1.1.4", default-features = false } sp-genesis-builder = { path = "../../primitives/genesis-builder", default-features = false } -serde_json = { version = "1.0.110", default-features = false, features = ["alloc"] } +serde_json = { version = "1.0.111", default-features = false, features = ["alloc"] } docify = "0.2.6" static_assertions = "1.1.0" diff --git a/substrate/frame/support/procedural/Cargo.toml b/substrate/frame/support/procedural/Cargo.toml index 7c8b3f009d7..5e47f0dfeb0 100644 --- a/substrate/frame/support/procedural/Cargo.toml +++ b/substrate/frame/support/procedural/Cargo.toml @@ -24,7 +24,7 @@ cfg-expr = "0.15.5" itertools = "0.10.3" proc-macro2 = "1.0.56" quote = "1.0.28" -syn = { version = "2.0.43", features = ["full"] } +syn = { version = "2.0.48", features = ["full"] } frame-support-procedural-tools = { path = "tools" } macro_magic = { version = "0.5.0", features = ["proc_support"] } proc-macro-warning = { version = "1.0.0", default-features = false } diff --git a/substrate/frame/support/procedural/tools/Cargo.toml b/substrate/frame/support/procedural/tools/Cargo.toml index 4b75088c314..3305f2f5d51 100644 --- a/substrate/frame/support/procedural/tools/Cargo.toml +++ b/substrate/frame/support/procedural/tools/Cargo.toml @@ -18,5 +18,5 @@ targets = ["x86_64-unknown-linux-gnu"] proc-macro-crate = "2.0.1" proc-macro2 = "1.0.56" quote = "1.0.28" -syn = { version = "2.0.43", features = ["extra-traits", "full", "visit"] } +syn = { version = "2.0.48", features = ["extra-traits", "full", "visit"] } frame-support-procedural-tools-derive = { path = "derive" } diff --git a/substrate/frame/support/procedural/tools/derive/Cargo.toml b/substrate/frame/support/procedural/tools/derive/Cargo.toml index eeaeab9b829..d2d34d47714 100644 --- a/substrate/frame/support/procedural/tools/derive/Cargo.toml +++ b/substrate/frame/support/procedural/tools/derive/Cargo.toml @@ -20,4 +20,4 @@ proc-macro = true [dependencies] proc-macro2 = "1.0.56" quote = { version = "1.0.28", features = ["proc-macro"] } -syn = { version = "2.0.43", features = ["extra-traits", "full", "parsing", "proc-macro"] } +syn = { version = "2.0.48", features = ["extra-traits", "full", "parsing", "proc-macro"] } diff --git a/substrate/frame/support/test/Cargo.toml b/substrate/frame/support/test/Cargo.toml index bdc3622ad97..eac2dafbf00 100644 --- a/substrate/frame/support/test/Cargo.toml +++ b/substrate/frame/support/test/Cargo.toml @@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] static_assertions = "1.1.0" -serde = { version = "1.0.194", default-features = false, features = ["derive"] } +serde = { version = "1.0.195", default-features = false, features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } frame-metadata = { version = "16.0.0", default-features = false, features = ["current"] } diff --git a/substrate/frame/support/test/pallet/Cargo.toml b/substrate/frame/support/test/pallet/Cargo.toml index 26628fb2bbe..48adbcab582 100644 --- a/substrate/frame/support/test/pallet/Cargo.toml +++ b/substrate/frame/support/test/pallet/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.194", default-features = false, features = ["derive"] } +serde = { version = "1.0.195", default-features = false, features = ["derive"] } frame-support = { path = "../..", default-features = false } frame-system = { path = "../../../system", default-features = false } sp-runtime = { path = "../../../../primitives/runtime", default-features = false } diff --git a/substrate/frame/system/Cargo.toml b/substrate/frame/system/Cargo.toml index adc7b0faeb0..b0bab4ec756 100644 --- a/substrate/frame/system/Cargo.toml +++ b/substrate/frame/system/Cargo.toml @@ -20,7 +20,7 @@ cfg-if = "1.0" codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive", "serde"] } -serde = { version = "1.0.194", default-features = false, features = ["alloc", "derive"] } +serde = { version = "1.0.195", default-features = false, features = ["alloc", "derive"] } frame-support = { path = "../support", default-features = false } sp-core = { path = "../../primitives/core", default-features = false, features = ["serde"] } sp-io = { path = "../../primitives/io", default-features = false } diff --git a/substrate/frame/tips/Cargo.toml b/substrate/frame/tips/Cargo.toml index 1d86c3d098b..2516e0e993d 100644 --- a/substrate/frame/tips/Cargo.toml +++ b/substrate/frame/tips/Cargo.toml @@ -19,7 +19,7 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.194", features = ["derive"], optional = true } +serde = { version = "1.0.195", features = ["derive"], optional = true } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/transaction-payment/Cargo.toml b/substrate/frame/transaction-payment/Cargo.toml index 923b1d30a92..d52e8e11c82 100644 --- a/substrate/frame/transaction-payment/Cargo.toml +++ b/substrate/frame/transaction-payment/Cargo.toml @@ -20,7 +20,7 @@ codec = { package = "parity-scale-codec", version = "3.6.1", default-features = "derive", ] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.194", optional = true } +serde = { version = "1.0.195", optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } sp-core = { path = "../../primitives/core", default-features = false } @@ -29,7 +29,7 @@ sp-runtime = { path = "../../primitives/runtime", default-features = false } sp-std = { path = "../../primitives/std", default-features = false } [dev-dependencies] -serde_json = "1.0.110" +serde_json = "1.0.111" pallet-balances = { path = "../balances" } [features] diff --git a/substrate/frame/transaction-payment/asset-tx-payment/Cargo.toml b/substrate/frame/transaction-payment/asset-tx-payment/Cargo.toml index 324ae27dac7..0cd0cea59e6 100644 --- a/substrate/frame/transaction-payment/asset-tx-payment/Cargo.toml +++ b/substrate/frame/transaction-payment/asset-tx-payment/Cargo.toml @@ -30,10 +30,10 @@ frame-benchmarking = { path = "../../benchmarking", default-features = false, op # Other dependencies codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.194", optional = true } +serde = { version = "1.0.195", optional = true } [dev-dependencies] -serde_json = "1.0.110" +serde_json = "1.0.111" sp-storage = { path = "../../../primitives/storage", default-features = false } diff --git a/substrate/frame/transaction-storage/Cargo.toml b/substrate/frame/transaction-storage/Cargo.toml index faa9189ec63..26f9f64fe35 100644 --- a/substrate/frame/transaction-storage/Cargo.toml +++ b/substrate/frame/transaction-storage/Cargo.toml @@ -19,7 +19,7 @@ targets = ["x86_64-unknown-linux-gnu"] array-bytes = { version = "6.1", optional = true } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.194", optional = true } +serde = { version = "1.0.195", optional = true } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/frame/treasury/Cargo.toml b/substrate/frame/treasury/Cargo.toml index 120955c6f3b..01eb7c55a0a 100644 --- a/substrate/frame/treasury/Cargo.toml +++ b/substrate/frame/treasury/Cargo.toml @@ -23,7 +23,7 @@ codec = { package = "parity-scale-codec", version = "3.6.1", default-features = docify = "0.2.0" impl-trait-for-tuples = "0.2.2" scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.194", features = ["derive"], optional = true } +serde = { version = "1.0.195", features = ["derive"], optional = true } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } frame-system = { path = "../system", default-features = false } diff --git a/substrate/primitives/api/proc-macro/Cargo.toml b/substrate/primitives/api/proc-macro/Cargo.toml index 84c93aecd2e..e16f4fb7bf5 100644 --- a/substrate/primitives/api/proc-macro/Cargo.toml +++ b/substrate/primitives/api/proc-macro/Cargo.toml @@ -20,7 +20,7 @@ proc-macro = true [dependencies] quote = "1.0.28" -syn = { version = "2.0.43", features = ["extra-traits", "fold", "full", "visit"] } +syn = { version = "2.0.48", features = ["extra-traits", "fold", "full", "visit"] } proc-macro2 = "1.0.56" blake2 = { version = "0.10.4", default-features = false } proc-macro-crate = "2.0.1" diff --git a/substrate/primitives/application-crypto/Cargo.toml b/substrate/primitives/application-crypto/Cargo.toml index b4491a98476..d8aa2689aa2 100644 --- a/substrate/primitives/application-crypto/Cargo.toml +++ b/substrate/primitives/application-crypto/Cargo.toml @@ -21,7 +21,7 @@ targets = ["x86_64-unknown-linux-gnu"] sp-core = { path = "../core", default-features = false } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.194", default-features = false, optional = true, features = ["alloc", "derive"] } +serde = { version = "1.0.195", default-features = false, optional = true, features = ["alloc", "derive"] } sp-std = { path = "../std", default-features = false } sp-io = { path = "../io", default-features = false } diff --git a/substrate/primitives/arithmetic/Cargo.toml b/substrate/primitives/arithmetic/Cargo.toml index 3f44fe6594f..47d2902e267 100644 --- a/substrate/primitives/arithmetic/Cargo.toml +++ b/substrate/primitives/arithmetic/Cargo.toml @@ -24,7 +24,7 @@ codec = { package = "parity-scale-codec", version = "3.6.1", default-features = integer-sqrt = "0.1.2" num-traits = { version = "0.2.17", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.194", default-features = false, features = ["alloc", "derive"], optional = true } +serde = { version = "1.0.195", default-features = false, features = ["alloc", "derive"], optional = true } static_assertions = "1.1.0" sp-std = { path = "../std", default-features = false } diff --git a/substrate/primitives/consensus/babe/Cargo.toml b/substrate/primitives/consensus/babe/Cargo.toml index 751866f035f..e48b4b4817b 100644 --- a/substrate/primitives/consensus/babe/Cargo.toml +++ b/substrate/primitives/consensus/babe/Cargo.toml @@ -19,7 +19,7 @@ targets = ["x86_64-unknown-linux-gnu"] async-trait = { version = "0.1.74", optional = true } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.194", default-features = false, features = ["alloc", "derive"], optional = true } +serde = { version = "1.0.195", default-features = false, features = ["alloc", "derive"], optional = true } sp-api = { path = "../../api", default-features = false } sp-application-crypto = { path = "../../application-crypto", default-features = false } sp-consensus-slots = { path = "../slots", default-features = false } diff --git a/substrate/primitives/consensus/beefy/Cargo.toml b/substrate/primitives/consensus/beefy/Cargo.toml index 68e0db2f5f6..93a9be17747 100644 --- a/substrate/primitives/consensus/beefy/Cargo.toml +++ b/substrate/primitives/consensus/beefy/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.194", default-features = false, optional = true, features = ["alloc", "derive"] } +serde = { version = "1.0.195", default-features = false, optional = true, features = ["alloc", "derive"] } sp-api = { path = "../../api", default-features = false } sp-application-crypto = { path = "../../application-crypto", default-features = false } sp-core = { path = "../../core", default-features = false } diff --git a/substrate/primitives/consensus/grandpa/Cargo.toml b/substrate/primitives/consensus/grandpa/Cargo.toml index 495a37aef69..be22f5b23df 100644 --- a/substrate/primitives/consensus/grandpa/Cargo.toml +++ b/substrate/primitives/consensus/grandpa/Cargo.toml @@ -21,7 +21,7 @@ codec = { package = "parity-scale-codec", version = "3.6.1", default-features = grandpa = { package = "finality-grandpa", version = "0.16.2", default-features = false, features = ["derive-codec"] } log = { version = "0.4.17", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.194", features = ["alloc", "derive"], default-features = false, optional = true } +serde = { version = "1.0.195", features = ["alloc", "derive"], default-features = false, optional = true } sp-api = { path = "../../api", default-features = false } sp-application-crypto = { path = "../../application-crypto", default-features = false } sp-core = { path = "../../core", default-features = false } diff --git a/substrate/primitives/consensus/sassafras/Cargo.toml b/substrate/primitives/consensus/sassafras/Cargo.toml index 3db7bdbcee1..6d44bc6c5a8 100644 --- a/substrate/primitives/consensus/sassafras/Cargo.toml +++ b/substrate/primitives/consensus/sassafras/Cargo.toml @@ -20,7 +20,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] scale-codec = { package = "parity-scale-codec", version = "3.2.2", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.194", default-features = false, features = ["derive"], optional = true } +serde = { version = "1.0.195", default-features = false, features = ["derive"], optional = true } sp-api = { path = "../../api", default-features = false } sp-application-crypto = { path = "../../application-crypto", default-features = false, features = ["bandersnatch-experimental"] } sp-consensus-slots = { path = "../slots", default-features = false } diff --git a/substrate/primitives/core/Cargo.toml b/substrate/primitives/core/Cargo.toml index 1dbb5761ea8..73de8057d80 100644 --- a/substrate/primitives/core/Cargo.toml +++ b/substrate/primitives/core/Cargo.toml @@ -19,7 +19,7 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive", "max-encoded-len"] } scale-info = { version = "2.5.0", default-features = false, features = ["derive"] } log = { version = "0.4.17", default-features = false } -serde = { version = "1.0.194", optional = true, default-features = false, features = ["alloc", "derive"] } +serde = { version = "1.0.195", optional = true, default-features = false, features = ["alloc", "derive"] } bounded-collections = { version = "0.1.8", default-features = false } primitive-types = { version = "0.12.0", default-features = false, features = ["codec", "scale-info"] } impl-serde = { version = "0.4.0", default-features = false, optional = true } @@ -63,7 +63,7 @@ bandersnatch_vrfs = { git = "https://github.com/w3f/ring-vrf", rev = "e9782f9", [dev-dependencies] criterion = "0.4.0" -serde_json = "1.0.110" +serde_json = "1.0.111" lazy_static = "1.4.0" regex = "1.6.0" sp-core-hashing-proc-macro = { path = "hashing/proc-macro" } diff --git a/substrate/primitives/core/hashing/proc-macro/Cargo.toml b/substrate/primitives/core/hashing/proc-macro/Cargo.toml index 1ffbb4d1aaf..5c215bc7799 100644 --- a/substrate/primitives/core/hashing/proc-macro/Cargo.toml +++ b/substrate/primitives/core/hashing/proc-macro/Cargo.toml @@ -20,5 +20,5 @@ proc-macro = true [dependencies] quote = "1.0.28" -syn = { version = "2.0.43", features = ["full", "parsing"] } +syn = { version = "2.0.48", features = ["full", "parsing"] } sp-core-hashing = { path = "..", default-features = false } diff --git a/substrate/primitives/debug-derive/Cargo.toml b/substrate/primitives/debug-derive/Cargo.toml index bd1e0d12d6e..b7a65d658cf 100644 --- a/substrate/primitives/debug-derive/Cargo.toml +++ b/substrate/primitives/debug-derive/Cargo.toml @@ -20,7 +20,7 @@ proc-macro = true [dependencies] quote = "1.0.28" -syn = "2.0.43" +syn = "2.0.48" proc-macro2 = "1.0.56" [features] diff --git a/substrate/primitives/genesis-builder/Cargo.toml b/substrate/primitives/genesis-builder/Cargo.toml index 886ddb4ffd3..42d6c8c3d65 100644 --- a/substrate/primitives/genesis-builder/Cargo.toml +++ b/substrate/primitives/genesis-builder/Cargo.toml @@ -19,7 +19,7 @@ targets = ["x86_64-unknown-linux-gnu"] sp-api = { path = "../api", default-features = false } sp-runtime = { path = "../runtime", default-features = false } sp-std = { path = "../std", default-features = false } -serde_json = { version = "1.0.110", default-features = false, features = ["alloc"] } +serde_json = { version = "1.0.111", default-features = false, features = ["alloc"] } [features] default = ["std"] diff --git a/substrate/primitives/merkle-mountain-range/Cargo.toml b/substrate/primitives/merkle-mountain-range/Cargo.toml index e6143ff6c42..c0d69a2c4f5 100644 --- a/substrate/primitives/merkle-mountain-range/Cargo.toml +++ b/substrate/primitives/merkle-mountain-range/Cargo.toml @@ -19,7 +19,7 @@ codec = { package = "parity-scale-codec", version = "3.6.1", default-features = scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } log = { version = "0.4.17", default-features = false } mmr-lib = { package = "ckb-merkle-mountain-range", version = "0.5.2", default-features = false } -serde = { version = "1.0.194", features = ["alloc", "derive"], default-features = false, optional = true } +serde = { version = "1.0.195", features = ["alloc", "derive"], default-features = false, optional = true } sp-api = { path = "../api", default-features = false } sp-core = { path = "../core", default-features = false } sp-debug-derive = { path = "../debug-derive", default-features = false } diff --git a/substrate/primitives/npos-elections/Cargo.toml b/substrate/primitives/npos-elections/Cargo.toml index 04c4a475b7a..5d7e8704f4c 100644 --- a/substrate/primitives/npos-elections/Cargo.toml +++ b/substrate/primitives/npos-elections/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.194", default-features = false, features = ["alloc", "derive"], optional = true } +serde = { version = "1.0.195", default-features = false, features = ["alloc", "derive"], optional = true } sp-arithmetic = { path = "../arithmetic", default-features = false } sp-core = { path = "../core", default-features = false } sp-runtime = { path = "../runtime", default-features = false } diff --git a/substrate/primitives/npos-elections/fuzzer/Cargo.toml b/substrate/primitives/npos-elections/fuzzer/Cargo.toml index 9ea80d5030e..29dfa809fbe 100644 --- a/substrate/primitives/npos-elections/fuzzer/Cargo.toml +++ b/substrate/primitives/npos-elections/fuzzer/Cargo.toml @@ -17,7 +17,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -clap = { version = "4.4.12", features = ["derive"] } +clap = { version = "4.4.13", features = ["derive"] } honggfuzz = "0.5" rand = { version = "0.8", features = ["small_rng", "std"] } sp-npos-elections = { path = ".." } diff --git a/substrate/primitives/rpc/Cargo.toml b/substrate/primitives/rpc/Cargo.toml index 5ff2db981da..07bb3bf7293 100644 --- a/substrate/primitives/rpc/Cargo.toml +++ b/substrate/primitives/rpc/Cargo.toml @@ -17,8 +17,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] rustc-hash = "1.1.0" -serde = { version = "1.0.194", features = ["derive"] } +serde = { version = "1.0.195", features = ["derive"] } sp-core = { path = "../core" } [dev-dependencies] -serde_json = "1.0.110" +serde_json = "1.0.111" diff --git a/substrate/primitives/runtime-interface/proc-macro/Cargo.toml b/substrate/primitives/runtime-interface/proc-macro/Cargo.toml index 0b0291b1bd3..b58e6a7b725 100644 --- a/substrate/primitives/runtime-interface/proc-macro/Cargo.toml +++ b/substrate/primitives/runtime-interface/proc-macro/Cargo.toml @@ -24,4 +24,4 @@ proc-macro-crate = "2.0.1" proc-macro2 = "1.0.56" quote = "1.0.28" expander = "2.0.0" -syn = { version = "2.0.43", features = ["extra-traits", "fold", "full", "visit"] } +syn = { version = "2.0.48", features = ["extra-traits", "fold", "full", "visit"] } diff --git a/substrate/primitives/runtime/Cargo.toml b/substrate/primitives/runtime/Cargo.toml index 988a98a2df0..448aad39ec9 100644 --- a/substrate/primitives/runtime/Cargo.toml +++ b/substrate/primitives/runtime/Cargo.toml @@ -25,7 +25,7 @@ log = { version = "0.4.17", default-features = false } paste = "1.0" rand = { version = "0.8.5", optional = true } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.194", default-features = false, features = ["alloc", "derive"], optional = true } +serde = { version = "1.0.195", default-features = false, features = ["alloc", "derive"], optional = true } sp-application-crypto = { path = "../application-crypto", default-features = false } sp-arithmetic = { path = "../arithmetic", default-features = false } sp-core = { path = "../core", default-features = false } @@ -38,7 +38,7 @@ simple-mermaid = { git = "https://github.com/kianenigma/simple-mermaid.git", rev [dev-dependencies] rand = "0.8.5" -serde_json = "1.0.110" +serde_json = "1.0.111" zstd = { version = "0.12.4", default-features = false } sp-api = { path = "../api" } sp-state-machine = { path = "../state-machine" } diff --git a/substrate/primitives/staking/Cargo.toml b/substrate/primitives/staking/Cargo.toml index c10dd00a730..5ffe6fbeaf5 100644 --- a/substrate/primitives/staking/Cargo.toml +++ b/substrate/primitives/staking/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -serde = { version = "1.0.194", default-features = false, features = ["alloc", "derive"], optional = true } +serde = { version = "1.0.195", default-features = false, features = ["alloc", "derive"], optional = true } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } impl-trait-for-tuples = "0.2.2" diff --git a/substrate/primitives/storage/Cargo.toml b/substrate/primitives/storage/Cargo.toml index 1689c874aba..32f59b04a12 100644 --- a/substrate/primitives/storage/Cargo.toml +++ b/substrate/primitives/storage/Cargo.toml @@ -20,7 +20,7 @@ targets = ["x86_64-unknown-linux-gnu"] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } impl-serde = { version = "0.4.0", optional = true, default-features = false } ref-cast = "1.0.0" -serde = { version = "1.0.194", default-features = false, features = ["alloc", "derive"], optional = true } +serde = { version = "1.0.195", default-features = false, features = ["alloc", "derive"], optional = true } sp-debug-derive = { path = "../debug-derive", default-features = false } sp-std = { path = "../std", default-features = false } diff --git a/substrate/primitives/test-primitives/Cargo.toml b/substrate/primitives/test-primitives/Cargo.toml index 48aa27a68b2..3649217cf74 100644 --- a/substrate/primitives/test-primitives/Cargo.toml +++ b/substrate/primitives/test-primitives/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.194", default-features = false, features = ["derive"], optional = true } +serde = { version = "1.0.195", default-features = false, features = ["derive"], optional = true } sp-application-crypto = { path = "../application-crypto", default-features = false } sp-core = { path = "../core", default-features = false } sp-runtime = { path = "../runtime", default-features = false } diff --git a/substrate/primitives/version/Cargo.toml b/substrate/primitives/version/Cargo.toml index 8d49d974d83..1ceda4e700f 100644 --- a/substrate/primitives/version/Cargo.toml +++ b/substrate/primitives/version/Cargo.toml @@ -21,7 +21,7 @@ codec = { package = "parity-scale-codec", version = "3.6.1", default-features = impl-serde = { version = "0.4.0", default-features = false, optional = true } parity-wasm = { version = "0.45", optional = true } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.194", default-features = false, features = ["alloc", "derive"], optional = true } +serde = { version = "1.0.195", default-features = false, features = ["alloc", "derive"], optional = true } thiserror = { version = "1.0.48", optional = true } sp-core-hashing-proc-macro = { path = "../core/hashing/proc-macro" } sp-runtime = { path = "../runtime", default-features = false } diff --git a/substrate/primitives/version/proc-macro/Cargo.toml b/substrate/primitives/version/proc-macro/Cargo.toml index a71dce56eec..adf70dbd166 100644 --- a/substrate/primitives/version/proc-macro/Cargo.toml +++ b/substrate/primitives/version/proc-macro/Cargo.toml @@ -22,7 +22,7 @@ proc-macro = true codec = { package = "parity-scale-codec", version = "3.6.1", features = ["derive"] } proc-macro2 = "1.0.56" quote = "1.0.28" -syn = { version = "2.0.43", features = ["extra-traits", "fold", "full", "visit"] } +syn = { version = "2.0.48", features = ["extra-traits", "fold", "full", "visit"] } [dev-dependencies] sp-version = { path = ".." } diff --git a/substrate/primitives/weights/Cargo.toml b/substrate/primitives/weights/Cargo.toml index 45c15fb3b9b..d89182b6642 100644 --- a/substrate/primitives/weights/Cargo.toml +++ b/substrate/primitives/weights/Cargo.toml @@ -19,7 +19,7 @@ targets = ["x86_64-unknown-linux-gnu"] bounded-collections = { version = "0.1.4", default-features = false } codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } -serde = { version = "1.0.194", default-features = false, optional = true, features = ["alloc", "derive"] } +serde = { version = "1.0.195", default-features = false, optional = true, features = ["alloc", "derive"] } smallvec = "1.11.0" sp-arithmetic = { path = "../arithmetic", default-features = false } sp-debug-derive = { path = "../debug-derive", default-features = false } diff --git a/substrate/scripts/ci/node-template-release/Cargo.toml b/substrate/scripts/ci/node-template-release/Cargo.toml index 7ca84c17005..32210de73e6 100644 --- a/substrate/scripts/ci/node-template-release/Cargo.toml +++ b/substrate/scripts/ci/node-template-release/Cargo.toml @@ -14,7 +14,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -clap = { version = "4.4.12", features = ["derive"] } +clap = { version = "4.4.13", features = ["derive"] } flate2 = "1.0" fs_extra = "1.3" glob = "0.3" diff --git a/substrate/test-utils/client/Cargo.toml b/substrate/test-utils/client/Cargo.toml index 71f2c6a136e..79071e19e28 100644 --- a/substrate/test-utils/client/Cargo.toml +++ b/substrate/test-utils/client/Cargo.toml @@ -20,8 +20,8 @@ array-bytes = "6.1" async-trait = "0.1.74" codec = { package = "parity-scale-codec", version = "3.6.1" } futures = "0.3.21" -serde = "1.0.194" -serde_json = "1.0.110" +serde = "1.0.195" +serde_json = "1.0.111" sc-client-api = { path = "../../client/api" } sc-client-db = { path = "../../client/db", default-features = false, features = [ "test-helpers", diff --git a/substrate/test-utils/runtime/Cargo.toml b/substrate/test-utils/runtime/Cargo.toml index 294d3b7aa62..1eb50771a2c 100644 --- a/substrate/test-utils/runtime/Cargo.toml +++ b/substrate/test-utils/runtime/Cargo.toml @@ -61,8 +61,8 @@ sp-consensus = { path = "../../primitives/consensus/common" } substrate-test-runtime-client = { path = "client" } sp-tracing = { path = "../../primitives/tracing" } json-patch = { version = "1.0.0", default-features = false } -serde = { version = "1.0.194", features = ["alloc", "derive"], default-features = false } -serde_json = { version = "1.0.110", default-features = false, features = ["alloc"] } +serde = { version = "1.0.195", features = ["alloc", "derive"], default-features = false } +serde_json = { version = "1.0.111", default-features = false, features = ["alloc"] } [build-dependencies] substrate-wasm-builder = { path = "../../utils/wasm-builder", optional = true } diff --git a/substrate/utils/frame/benchmarking-cli/Cargo.toml b/substrate/utils/frame/benchmarking-cli/Cargo.toml index aea4789b82f..02cb6ebc303 100644 --- a/substrate/utils/frame/benchmarking-cli/Cargo.toml +++ b/substrate/utils/frame/benchmarking-cli/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] array-bytes = "6.1" chrono = "0.4" -clap = { version = "4.4.12", features = ["derive"] } +clap = { version = "4.4.13", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.6.1" } comfy-table = { version = "7.0.1", default-features = false } handlebars = "4.2.2" @@ -29,8 +29,8 @@ linked-hash-map = "0.5.4" log = "0.4.17" rand = { version = "0.8.5", features = ["small_rng"] } rand_pcg = "0.3.1" -serde = "1.0.194" -serde_json = "1.0.110" +serde = "1.0.195" +serde_json = "1.0.111" thiserror = "1.0.48" thousands = "0.2.0" frame-benchmarking = { path = "../../../frame/benchmarking" } diff --git a/substrate/utils/frame/frame-utilities-cli/Cargo.toml b/substrate/utils/frame/frame-utilities-cli/Cargo.toml index d6297f890a4..96c43aee070 100644 --- a/substrate/utils/frame/frame-utilities-cli/Cargo.toml +++ b/substrate/utils/frame/frame-utilities-cli/Cargo.toml @@ -14,7 +14,7 @@ readme = "README.md" workspace = true [dependencies] -clap = { version = "4.4.12", features = ["derive"] } +clap = { version = "4.4.13", features = ["derive"] } frame-support = { path = "../../../frame/support" } frame-system = { path = "../../../frame/system" } sc-cli = { path = "../../../client/cli" } diff --git a/substrate/utils/frame/generate-bags/node-runtime/Cargo.toml b/substrate/utils/frame/generate-bags/node-runtime/Cargo.toml index 747f25fecec..07e74a59a6b 100644 --- a/substrate/utils/frame/generate-bags/node-runtime/Cargo.toml +++ b/substrate/utils/frame/generate-bags/node-runtime/Cargo.toml @@ -17,4 +17,4 @@ kitchensink-runtime = { path = "../../../../bin/node/runtime" } generate-bags = { path = ".." } # third-party -clap = { version = "4.4.12", features = ["derive"] } +clap = { version = "4.4.13", features = ["derive"] } diff --git a/substrate/utils/frame/remote-externalities/Cargo.toml b/substrate/utils/frame/remote-externalities/Cargo.toml index c7af146fc3d..ba0e8e869cc 100644 --- a/substrate/utils/frame/remote-externalities/Cargo.toml +++ b/substrate/utils/frame/remote-externalities/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] jsonrpsee = { version = "0.16.2", features = ["http-client"] } codec = { package = "parity-scale-codec", version = "3.6.1" } log = "0.4.17" -serde = "1.0.194" +serde = "1.0.195" sp-core = { path = "../../../primitives/core" } sp-state-machine = { path = "../../../primitives/state-machine" } sp-io = { path = "../../../primitives/io" } diff --git a/substrate/utils/frame/rpc/state-trie-migration-rpc/Cargo.toml b/substrate/utils/frame/rpc/state-trie-migration-rpc/Cargo.toml index c387bc47842..6cd99e5a6fe 100644 --- a/substrate/utils/frame/rpc/state-trie-migration-rpc/Cargo.toml +++ b/substrate/utils/frame/rpc/state-trie-migration-rpc/Cargo.toml @@ -32,4 +32,4 @@ sc-rpc-api = { path = "../../../../client/rpc-api" } sp-runtime = { path = "../../../../primitives/runtime" } [dev-dependencies] -serde_json = "1.0.110" +serde_json = "1.0.111" diff --git a/substrate/utils/frame/try-runtime/cli/Cargo.toml b/substrate/utils/frame/try-runtime/cli/Cargo.toml index f90cdd1af8e..4f09a34fae7 100644 --- a/substrate/utils/frame/try-runtime/cli/Cargo.toml +++ b/substrate/utils/frame/try-runtime/cli/Cargo.toml @@ -38,12 +38,12 @@ frame-try-runtime = { path = "../../../../frame/try-runtime", optional = true } substrate-rpc-client = { path = "../../rpc/client" } async-trait = "0.1.74" -clap = { version = "4.4.12", features = ["derive"] } +clap = { version = "4.4.13", features = ["derive"] } hex = { version = "0.4.3", default-features = false } log = "0.4.17" parity-scale-codec = "3.6.1" -serde = "1.0.194" -serde_json = "1.0.110" +serde = "1.0.195" +serde_json = "1.0.111" zstd = { version = "0.12.4", default-features = false } [dev-dependencies] -- GitLab From 745c02c59a6c0e828752286b411e80043d9436ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Sun, 7 Jan 2024 16:49:34 +0100 Subject: [PATCH 121/191] pallet-contracts-fixtures: Only build RISCV when the feature is enabled (#2870) This disables building the RISCV fixtures by default. They still require a custom build rustc version. When there are actual tests for RISCV, the feature can be enabled in CI. Also fixes some unwraps that assume again that people are using rustup... --- substrate/frame/contracts/fixtures/Cargo.toml | 4 ++++ substrate/frame/contracts/fixtures/build.rs | 14 ++++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/substrate/frame/contracts/fixtures/Cargo.toml b/substrate/frame/contracts/fixtures/Cargo.toml index 565adc6f6e8..58f20f0b8f5 100644 --- a/substrate/frame/contracts/fixtures/Cargo.toml +++ b/substrate/frame/contracts/fixtures/Cargo.toml @@ -23,3 +23,7 @@ toml = "0.8.2" twox-hash = "1.6.3" polkavm-linker = "0.3.0" anyhow = "1.0.0" + +[features] +# Enable experimental RISCV fixtures build +riscv-experimental = [] diff --git a/substrate/frame/contracts/fixtures/build.rs b/substrate/frame/contracts/fixtures/build.rs index de95d199b44..84eb4219c25 100644 --- a/substrate/frame/contracts/fixtures/build.rs +++ b/substrate/frame/contracts/fixtures/build.rs @@ -16,7 +16,7 @@ // limitations under the License. //! Compile contracts to wasm and RISC-V binaries. -use anyhow::{bail, format_err, Context, Result}; +use anyhow::{bail, Context, Result}; use parity_wasm::elements::{deserialize_file, serialize_to_file, Internal}; use std::{ env, fs, @@ -91,6 +91,7 @@ impl Entry { } /// Return the name of the RISC-V polkavm file. + #[cfg(feature = "riscv-experimental")] fn out_riscv_filename(&self) -> String { format!("{}.polkavm", self.name()) } @@ -231,6 +232,7 @@ fn post_process_wasm(input_path: &Path, output_path: &Path) -> Result<()> { } /// Build contracts for RISC-V. +#[cfg(feature = "riscv-experimental")] fn invoke_riscv_build(current_dir: &Path) -> Result<()> { let encoded_rustflags = ["-Crelocation-model=pie", "-Clink-arg=--emit-relocs", "-Clink-arg=-Tmemory.ld"] @@ -241,10 +243,10 @@ fn invoke_riscv_build(current_dir: &Path) -> Result<()> { let build_res = Command::new(env::var("CARGO")?) .current_dir(current_dir) .env_clear() - .env("PATH", env::var("PATH").unwrap()) + .env("PATH", env::var("PATH").unwrap_or_default()) .env("CARGO_ENCODED_RUSTFLAGS", encoded_rustflags) .env("RUSTUP_TOOLCHAIN", "rve-nightly") - .env("RUSTUP_HOME", env::var("RUSTUP_HOME").unwrap()) + .env("RUSTUP_HOME", env::var("RUSTUP_HOME").unwrap_or_default()) .args(["build", "--release", "--target=riscv32em-unknown-none-elf"]) .output() .expect("failed to execute process"); @@ -265,12 +267,13 @@ fn invoke_riscv_build(current_dir: &Path) -> Result<()> { bail!("Failed to build contracts"); } /// Post-process the compiled wasm contracts. +#[cfg(feature = "riscv-experimental")] fn post_process_riscv(input_path: &Path, output_path: &Path) -> Result<()> { let mut config = polkavm_linker::Config::default(); config.set_strip(true); let orig = fs::read(input_path).with_context(|| format!("Failed to read {:?}", input_path))?; let linked = polkavm_linker::program_from_elf(config, orig.as_ref()) - .map_err(|err| format_err!("Failed to link polkavm program: {}", err))?; + .map_err(|err| anyhow::format_err!("Failed to link polkavm program: {}", err))?; fs::write(output_path, linked.as_bytes()).map_err(Into::into) } @@ -283,6 +286,7 @@ fn write_output(build_dir: &Path, out_dir: &Path, entries: Vec) -> Result &out_dir.join(&wasm_output), )?; + #[cfg(feature = "riscv-experimental")] post_process_riscv( &build_dir.join("target/riscv32em-unknown-none-elf/release").join(entry.name()), &out_dir.join(entry.out_riscv_filename()), @@ -335,6 +339,8 @@ fn main() -> Result<()> { )?; invoke_wasm_build(tmp_dir_path)?; + + #[cfg(feature = "riscv-experimental")] invoke_riscv_build(tmp_dir_path)?; write_output(tmp_dir_path, &out_dir, entries)?; -- GitLab From 82327494bc9e73f35ca024750e41ac6749d2b498 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Jan 2024 12:31:19 +0000 Subject: [PATCH 122/191] Bump proc-macro-crate from 2.0.1 to 3.0.0 (#2876) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [proc-macro-crate](https://github.com/bkchr/proc-macro-crate) from 2.0.1 to 3.0.0.
Release notes

Sourced from proc-macro-crate's releases.

v3.0.0

What's Changed

Full Changelog: https://github.com/bkchr/proc-macro-crate/compare/v2.0.1...v3.0.0

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=proc-macro-crate&package-manager=cargo&previous-version=2.0.1&new-version=3.0.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 40 ++++++++++++------- .../parachain-system/proc-macro/Cargo.toml | 2 +- polkadot/node/gum/proc-macro/Cargo.toml | 2 +- substrate/client/chain-spec/derive/Cargo.toml | 2 +- .../client/tracing/proc-macro/Cargo.toml | 2 +- .../solution-type/Cargo.toml | 2 +- .../frame/staking/reward-curve/Cargo.toml | 2 +- .../frame/support/procedural/tools/Cargo.toml | 2 +- .../primitives/api/proc-macro/Cargo.toml | 2 +- .../runtime-interface/proc-macro/Cargo.toml | 2 +- 10 files changed, 34 insertions(+), 24 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2e2e1dfdb0e..7a718610bd3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3930,7 +3930,7 @@ dependencies = [ name = "cumulus-pallet-parachain-system-proc-macro" version = "0.1.0" dependencies = [ - "proc-macro-crate 2.0.1", + "proc-macro-crate 3.0.0", "proc-macro2", "quote", "syn 2.0.48", @@ -5560,7 +5560,7 @@ dependencies = [ "frame-election-provider-support", "frame-support", "parity-scale-codec", - "proc-macro-crate 2.0.1", + "proc-macro-crate 3.0.0", "proc-macro2", "quote", "scale-info", @@ -5726,7 +5726,7 @@ name = "frame-support-procedural-tools" version = "4.0.0-dev" dependencies = [ "frame-support-procedural-tools-derive", - "proc-macro-crate 2.0.1", + "proc-macro-crate 3.0.0", "proc-macro2", "quote", "syn 2.0.48", @@ -10833,7 +10833,7 @@ dependencies = [ name = "pallet-staking-reward-curve" version = "4.0.0-dev" dependencies = [ - "proc-macro-crate 2.0.1", + "proc-macro-crate 3.0.0", "proc-macro2", "quote", "sp-runtime", @@ -14049,12 +14049,11 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "2.0.1" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97dc5fea232fc28d2f597b37c4876b348a40e33f3b02cc975c8d006d78d94b1a" +checksum = "6b2685dd208a3771337d8d386a89840f0f43cd68be8dae90a5f8c2384effc9cd" dependencies = [ - "toml_datetime", - "toml_edit 0.20.2", + "toml_edit 0.21.0", ] [[package]] @@ -15431,7 +15430,7 @@ dependencies = [ name = "sc-chain-spec-derive" version = "4.0.0-dev" dependencies = [ - "proc-macro-crate 2.0.1", + "proc-macro-crate 3.0.0", "proc-macro2", "quote", "syn 2.0.48", @@ -16687,7 +16686,7 @@ dependencies = [ name = "sc-tracing-proc-macro" version = "4.0.0-dev" dependencies = [ - "proc-macro-crate 2.0.1", + "proc-macro-crate 3.0.0", "proc-macro2", "quote", "syn 2.0.48", @@ -17985,7 +17984,7 @@ dependencies = [ "assert_matches", "blake2 0.10.6", "expander 2.0.0", - "proc-macro-crate 2.0.1", + "proc-macro-crate 3.0.0", "proc-macro2", "quote", "syn 2.0.48", @@ -18661,7 +18660,7 @@ version = "11.0.0" dependencies = [ "Inflector", "expander 2.0.0", - "proc-macro-crate 2.0.1", + "proc-macro-crate 3.0.0", "proc-macro2", "quote", "syn 2.0.48", @@ -20327,9 +20326,9 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.3" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" dependencies = [ "serde", ] @@ -20360,6 +20359,17 @@ dependencies = [ "winnow", ] +[[package]] +name = "toml_edit" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" +dependencies = [ + "indexmap 2.0.0", + "toml_datetime", + "winnow", +] + [[package]] name = "tower" version = "0.4.13" @@ -20461,7 +20471,7 @@ version = "1.0.0" dependencies = [ "assert_matches", "expander 2.0.0", - "proc-macro-crate 2.0.1", + "proc-macro-crate 3.0.0", "proc-macro2", "quote", "syn 2.0.48", diff --git a/cumulus/pallets/parachain-system/proc-macro/Cargo.toml b/cumulus/pallets/parachain-system/proc-macro/Cargo.toml index 2861a51d13c..bbef5d05579 100644 --- a/cumulus/pallets/parachain-system/proc-macro/Cargo.toml +++ b/cumulus/pallets/parachain-system/proc-macro/Cargo.toml @@ -16,7 +16,7 @@ proc-macro = true syn = "2.0.48" proc-macro2 = "1.0.64" quote = "1.0.33" -proc-macro-crate = "2.0.1" +proc-macro-crate = "3.0.0" [features] default = ["std"] diff --git a/polkadot/node/gum/proc-macro/Cargo.toml b/polkadot/node/gum/proc-macro/Cargo.toml index 174077f480a..1f9c5b1b918 100644 --- a/polkadot/node/gum/proc-macro/Cargo.toml +++ b/polkadot/node/gum/proc-macro/Cargo.toml @@ -19,7 +19,7 @@ proc-macro = true syn = { version = "2.0.48", features = ["extra-traits", "full"] } quote = "1.0.28" proc-macro2 = "1.0.56" -proc-macro-crate = "2.0.1" +proc-macro-crate = "3.0.0" expander = "2.0.0" [dev-dependencies] diff --git a/substrate/client/chain-spec/derive/Cargo.toml b/substrate/client/chain-spec/derive/Cargo.toml index 8f8c2c0de2d..f9e291f897c 100644 --- a/substrate/client/chain-spec/derive/Cargo.toml +++ b/substrate/client/chain-spec/derive/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] proc-macro = true [dependencies] -proc-macro-crate = "2.0.1" +proc-macro-crate = "3.0.0" proc-macro2 = "1.0.56" quote = "1.0.28" syn = "2.0.48" diff --git a/substrate/client/tracing/proc-macro/Cargo.toml b/substrate/client/tracing/proc-macro/Cargo.toml index ff43f1ccb90..c293c1834e8 100644 --- a/substrate/client/tracing/proc-macro/Cargo.toml +++ b/substrate/client/tracing/proc-macro/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] proc-macro = true [dependencies] -proc-macro-crate = "2.0.1" +proc-macro-crate = "3.0.0" proc-macro2 = "1.0.56" quote = { version = "1.0.28", features = ["proc-macro"] } syn = { version = "2.0.48", features = ["extra-traits", "full", "parsing", "proc-macro"] } diff --git a/substrate/frame/election-provider-support/solution-type/Cargo.toml b/substrate/frame/election-provider-support/solution-type/Cargo.toml index 74f43310418..04400147790 100644 --- a/substrate/frame/election-provider-support/solution-type/Cargo.toml +++ b/substrate/frame/election-provider-support/solution-type/Cargo.toml @@ -21,7 +21,7 @@ proc-macro = true syn = { version = "2.0.48", features = ["full", "visit"] } quote = "1.0.28" proc-macro2 = "1.0.56" -proc-macro-crate = "2.0.1" +proc-macro-crate = "3.0.0" [dev-dependencies] parity-scale-codec = "3.6.1" diff --git a/substrate/frame/staking/reward-curve/Cargo.toml b/substrate/frame/staking/reward-curve/Cargo.toml index 0e13d4550f4..35bf240907a 100644 --- a/substrate/frame/staking/reward-curve/Cargo.toml +++ b/substrate/frame/staking/reward-curve/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] proc-macro = true [dependencies] -proc-macro-crate = "2.0.1" +proc-macro-crate = "3.0.0" proc-macro2 = "1.0.56" quote = "1.0.28" syn = { version = "2.0.48", features = ["full", "visit"] } diff --git a/substrate/frame/support/procedural/tools/Cargo.toml b/substrate/frame/support/procedural/tools/Cargo.toml index 3305f2f5d51..6d1b9507797 100644 --- a/substrate/frame/support/procedural/tools/Cargo.toml +++ b/substrate/frame/support/procedural/tools/Cargo.toml @@ -15,7 +15,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -proc-macro-crate = "2.0.1" +proc-macro-crate = "3.0.0" proc-macro2 = "1.0.56" quote = "1.0.28" syn = { version = "2.0.48", features = ["extra-traits", "full", "visit"] } diff --git a/substrate/primitives/api/proc-macro/Cargo.toml b/substrate/primitives/api/proc-macro/Cargo.toml index e16f4fb7bf5..eff66d3fb29 100644 --- a/substrate/primitives/api/proc-macro/Cargo.toml +++ b/substrate/primitives/api/proc-macro/Cargo.toml @@ -23,7 +23,7 @@ quote = "1.0.28" syn = { version = "2.0.48", features = ["extra-traits", "fold", "full", "visit"] } proc-macro2 = "1.0.56" blake2 = { version = "0.10.4", default-features = false } -proc-macro-crate = "2.0.1" +proc-macro-crate = "3.0.0" expander = "2.0.0" Inflector = "0.11.4" diff --git a/substrate/primitives/runtime-interface/proc-macro/Cargo.toml b/substrate/primitives/runtime-interface/proc-macro/Cargo.toml index b58e6a7b725..869cad06e56 100644 --- a/substrate/primitives/runtime-interface/proc-macro/Cargo.toml +++ b/substrate/primitives/runtime-interface/proc-macro/Cargo.toml @@ -20,7 +20,7 @@ proc-macro = true [dependencies] Inflector = "0.11.4" -proc-macro-crate = "2.0.1" +proc-macro-crate = "3.0.0" proc-macro2 = "1.0.56" quote = "1.0.28" expander = "2.0.0" -- GitLab From a97a6f2095bd35eb9d7e5f11d04f62e065386c78 Mon Sep 17 00:00:00 2001 From: Niklas Adolfsson Date: Mon, 8 Jan 2024 13:35:12 +0100 Subject: [PATCH 123/191] rpc: add `rpc v2 chainSpec` to polkadot (#2859) The [chainSpec RPC API from the v2 spec](https://paritytech.github.io/json-rpc-interface-spec/api/chainSpec.html) was only added to substrate-node and should be added to polkadot as well /cc @lexnv --- Cargo.lock | 1 + .../runtime_vs_smart_contract.rs | 21 ++++++++++++------- .../node/core/candidate-validation/src/lib.rs | 6 +++--- .../core/candidate-validation/src/tests.rs | 2 +- polkadot/rpc/Cargo.toml | 1 + polkadot/rpc/src/lib.rs | 6 ++++++ substrate/bin/node-template/node/src/rpc.rs | 7 +++++++ .../client/consensus/beefy/src/import.rs | 2 +- substrate/client/consensus/beefy/src/lib.rs | 2 +- .../src/protocol/notifications/behaviour.rs | 2 +- substrate/frame/contracts/fixtures/build.rs | 6 +++--- .../src/construct_runtime/expand/task.rs | 2 +- substrate/frame/system/src/tests.rs | 2 +- substrate/primitives/core/src/address_uri.rs | 2 +- substrate/primitives/core/src/crypto.rs | 4 ++-- .../utils/wasm-builder/src/wasm_project.rs | 2 +- 16 files changed, 45 insertions(+), 23 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7a718610bd3..5fba3e62037 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13200,6 +13200,7 @@ dependencies = [ "sc-consensus-grandpa", "sc-consensus-grandpa-rpc", "sc-rpc", + "sc-rpc-spec-v2", "sc-sync-state-rpc", "sc-transaction-pool-api", "sp-api", diff --git a/docs/sdk/src/reference_docs/runtime_vs_smart_contract.rs b/docs/sdk/src/reference_docs/runtime_vs_smart_contract.rs index 16db44d8be4..099512cf4ee 100644 --- a/docs/sdk/src/reference_docs/runtime_vs_smart_contract.rs +++ b/docs/sdk/src/reference_docs/runtime_vs_smart_contract.rs @@ -32,14 +32,21 @@ //! //! ## Comparative Table //! -//! | Aspect | Runtime | Smart Contracts | +//! | Aspect | Runtime +//! | Smart Contracts | //! |-----------------------|-------------------------------------------------------------------------|----------------------------------------------------------------------| -//! | **Design Philosophy** | Core logic of a blockchain, allowing broad and deep customization. | Designed for DApps deployed on the blockchain runtime.| -//! | **Development Complexity** | Requires in-depth knowledge of Rust and Substrate. Suitable for complex blockchain architectures. | Easier to develop with knowledge of Smart Contract languages like Solidity or [ink!](https://use.ink/). | -//! | **Upgradeability and Flexibility** | Offers comprehensive upgradeability with migration logic and on-chain governance, allowing modifications to the entire blockchain logic without hard forks. | Less flexible in upgrade migrations but offers more straightforward deployment and iteration. | -//! | **Performance and Efficiency** | More efficient, optimized for specific needs of the blockchain. | Can be less efficient due to its generic nature (e.g. the overhead of a virtual machine). | -//! | **Security Considerations** | Security flaws can affect the entire blockchain. | Security risks usually localized to the individual contract. | -//! | **Weighing and Metering** | Operations can be weighed, allowing for precise benchmarking. | Execution is metered, allowing for measurement of resource consumption. | +//! | **Design Philosophy** | Core logic of a blockchain, allowing broad and deep customization. +//! | Designed for DApps deployed on the blockchain runtime.| | **Development Complexity** | Requires in-depth knowledge of Rust and Substrate. Suitable for complex blockchain architectures. | Easier to develop with knowledge of Smart Contract languages like Solidity or [ink!](https://use.ink/). | +//! | **Upgradeability and Flexibility** | Offers comprehensive upgradeability with migration logic +//! and on-chain governance, allowing modifications to the entire blockchain logic without hard +//! forks. | Less flexible in upgrade migrations but offers more straightforward deployment and +//! iteration. | | **Performance and Efficiency** | More efficient, optimized for specific needs of +//! the blockchain. | Can be less efficient due to its generic nature (e.g. the overhead of a +//! virtual machine). | | **Security Considerations** | Security flaws can affect the entire +//! blockchain. | Security risks usually localized to the individual +//! contract. | | **Weighing and Metering** | Operations can be weighed, allowing for precise +//! benchmarking. | Execution is metered, allowing for measurement of resource +//! consumption. | //! //! We will now explore these differences in more detail. //! diff --git a/polkadot/node/core/candidate-validation/src/lib.rs b/polkadot/node/core/candidate-validation/src/lib.rs index 5c4e449b2c9..18c27968915 100644 --- a/polkadot/node/core/candidate-validation/src/lib.rs +++ b/polkadot/node/core/candidate-validation/src/lib.rs @@ -773,21 +773,21 @@ trait ValidationBackend { if num_death_retries_left > 0 { num_death_retries_left -= 1; } else { - break; + break }, Err(ValidationError::PossiblyInvalid(PossiblyInvalidError::JobError(_))) => if num_job_error_retries_left > 0 { num_job_error_retries_left -= 1; } else { - break; + break }, Err(ValidationError::Internal(_)) => if num_internal_retries_left > 0 { num_internal_retries_left -= 1; } else { - break; + break }, Ok(_) | Err(ValidationError::Invalid(_) | ValidationError::Preparation(_)) => break, diff --git a/polkadot/node/core/candidate-validation/src/tests.rs b/polkadot/node/core/candidate-validation/src/tests.rs index 11078580465..f646f853549 100644 --- a/polkadot/node/core/candidate-validation/src/tests.rs +++ b/polkadot/node/core/candidate-validation/src/tests.rs @@ -726,7 +726,7 @@ fn candidate_validation_retry_on_error_helper( ExecutorParams::default(), exec_kind, &Default::default(), - )); + )) } #[test] diff --git a/polkadot/rpc/Cargo.toml b/polkadot/rpc/Cargo.toml index 8c582c623ba..dcb7a13f6f3 100644 --- a/polkadot/rpc/Cargo.toml +++ b/polkadot/rpc/Cargo.toml @@ -21,6 +21,7 @@ sp-consensus = { path = "../../substrate/primitives/consensus/common" } sp-consensus-babe = { path = "../../substrate/primitives/consensus/babe" } sc-chain-spec = { path = "../../substrate/client/chain-spec" } sc-rpc = { path = "../../substrate/client/rpc" } +sc-rpc-spec-v2 = { path = "../../substrate/client/rpc-spec-v2" } sc-consensus-babe = { path = "../../substrate/client/consensus/babe" } sc-consensus-babe-rpc = { path = "../../substrate/client/consensus/babe/rpc" } sc-consensus-beefy = { path = "../../substrate/client/consensus/beefy" } diff --git a/polkadot/rpc/src/lib.rs b/polkadot/rpc/src/lib.rs index bf9daddba50..4455efd3b53 100644 --- a/polkadot/rpc/src/lib.rs +++ b/polkadot/rpc/src/lib.rs @@ -121,6 +121,7 @@ where use sc_consensus_babe_rpc::{Babe, BabeApiServer}; use sc_consensus_beefy_rpc::{Beefy, BeefyApiServer}; use sc_consensus_grandpa_rpc::{Grandpa, GrandpaApiServer}; + use sc_rpc_spec_v2::chain_spec::{ChainSpec, ChainSpecApiServer}; use sc_sync_state_rpc::{SyncState, SyncStateApiServer}; use substrate_state_trie_migration_rpc::{StateMigration, StateMigrationApiServer}; @@ -134,6 +135,11 @@ where finality_provider, } = grandpa; + let chain_name = chain_spec.name().to_string(); + let genesis_hash = client.hash(0).ok().flatten().expect("Genesis block exists; qed"); + let properties = chain_spec.properties(); + + io.merge(ChainSpec::new(chain_name, genesis_hash, properties).into_rpc())?; io.merge(StateMigration::new(client.clone(), backend.clone(), deny_unsafe).into_rpc())?; io.merge(System::new(client.clone(), pool.clone(), deny_unsafe).into_rpc())?; io.merge(TransactionPayment::new(client.clone()).into_rpc())?; diff --git a/substrate/bin/node-template/node/src/rpc.rs b/substrate/bin/node-template/node/src/rpc.rs index f4f1540f732..246391adcbb 100644 --- a/substrate/bin/node-template/node/src/rpc.rs +++ b/substrate/bin/node-template/node/src/rpc.rs @@ -53,5 +53,12 @@ where // to call into the runtime. // `module.merge(YourRpcTrait::into_rpc(YourRpcStruct::new(ReferenceToClient, ...)))?;` + // You probably want to enable the `rpc v2 chainSpec` API as well + // + // let chain_name = chain_spec.name().to_string(); + // let genesis_hash = client.block_hash(0).ok().flatten().expect("Genesis block exists; qed"); + // let properties = chain_spec.properties(); + // module.merge(ChainSpec::new(chain_name, genesis_hash, properties).into_rpc())?; + Ok(module) } diff --git a/substrate/client/consensus/beefy/src/import.rs b/substrate/client/consensus/beefy/src/import.rs index 5bbf07fba70..6eced17b58f 100644 --- a/substrate/client/consensus/beefy/src/import.rs +++ b/substrate/client/consensus/beefy/src/import.rs @@ -148,7 +148,7 @@ where // The block is imported as part of some chain sync. // The voter doesn't need to process it now. // It will be detected and processed as part of the voter state init. - return Ok(inner_import_result); + return Ok(inner_import_result) }, } diff --git a/substrate/client/consensus/beefy/src/lib.rs b/substrate/client/consensus/beefy/src/lib.rs index 51e82b6a811..2e2e22288e3 100644 --- a/substrate/client/consensus/beefy/src/lib.rs +++ b/substrate/client/consensus/beefy/src/lib.rs @@ -398,7 +398,7 @@ where header = wait_for_parent_header(backend.blockchain(), header, HEADER_SYNC_DELAY).await?; } - return Ok(state); + return Ok(state) } // No valid voter-state persisted, re-initialize from pallet genesis. diff --git a/substrate/client/network/src/protocol/notifications/behaviour.rs b/substrate/client/network/src/protocol/notifications/behaviour.rs index cdbf2a71b93..9ad41e376e8 100644 --- a/substrate/client/network/src/protocol/notifications/behaviour.rs +++ b/substrate/client/network/src/protocol/notifications/behaviour.rs @@ -1037,7 +1037,7 @@ impl Notifications { peerset_rejected, incoming_index, }; - return self.report_reject(index).map_or((), |_| ()); + return self.report_reject(index).map_or((), |_| ()) } trace!( diff --git a/substrate/frame/contracts/fixtures/build.rs b/substrate/frame/contracts/fixtures/build.rs index 84eb4219c25..34e44c5db11 100644 --- a/substrate/frame/contracts/fixtures/build.rs +++ b/substrate/frame/contracts/fixtures/build.rs @@ -105,7 +105,7 @@ fn collect_entries(contracts_dir: &Path, out_dir: &Path) -> Vec { .filter_map(|file| { let path = file.expect("file exists; qed").path(); if path.extension().map_or(true, |ext| ext != "rs") { - return None; + return None } let entry = Entry::new(path); @@ -307,7 +307,7 @@ fn find_workspace_root(current_dir: &Path) -> Option { let cargo_toml_contents = std::fs::read_to_string(current_dir.join("Cargo.toml")).ok()?; if cargo_toml_contents.contains("[workspace]") { - return Some(current_dir); + return Some(current_dir) } } @@ -325,7 +325,7 @@ fn main() -> Result<()> { let entries = collect_entries(&contracts_dir, &out_dir); if entries.is_empty() { - return Ok(()); + return Ok(()) } let tmp_dir = tempfile::tempdir()?; diff --git a/substrate/frame/support/procedural/src/construct_runtime/expand/task.rs b/substrate/frame/support/procedural/src/construct_runtime/expand/task.rs index bd952202bbb..6531c0e9e07 100644 --- a/substrate/frame/support/procedural/src/construct_runtime/expand/task.rs +++ b/substrate/frame/support/procedural/src/construct_runtime/expand/task.rs @@ -31,7 +31,7 @@ pub fn expand_outer_task( let mut task_paths = Vec::new(); for decl in pallet_decls { if decl.find_part("Task").is_none() { - continue; + continue } let variant_name = &decl.name; diff --git a/substrate/frame/system/src/tests.rs b/substrate/frame/system/src/tests.rs index 053cec24f89..e437e7f9f39 100644 --- a/substrate/frame/system/src/tests.rs +++ b/substrate/frame/system/src/tests.rs @@ -828,7 +828,7 @@ fn last_runtime_upgrade_spec_version_usage() { // a runtime upgrade in the pipeline of being applied, you should use the spec version // of this upgrade. if System::last_runtime_upgrade_spec_version() > 1337 { - return Weight::zero(); + return Weight::zero() } // Do the migration. diff --git a/substrate/primitives/core/src/address_uri.rs b/substrate/primitives/core/src/address_uri.rs index 862747c9a4b..211d47c0093 100644 --- a/substrate/primitives/core/src/address_uri.rs +++ b/substrate/primitives/core/src/address_uri.rs @@ -184,7 +184,7 @@ impl<'a> AddressUri<'a> { Error::in_pass(initial_input, initial_input_len - input.len()) } else { Error::in_phrase(initial_input, initial_input_len - input.len()) - }); + }) } } diff --git a/substrate/primitives/core/src/crypto.rs b/substrate/primitives/core/src/crypto.rs index 1f3ae744533..2da38d44be4 100644 --- a/substrate/primitives/core/src/crypto.rs +++ b/substrate/primitives/core/src/crypto.rs @@ -434,7 +434,7 @@ impl + AsRef<[u8]> + Public + Derive> Ss58Codec for T { fn from_string(s: &str) -> Result { let cap = AddressUri::parse(s)?; if cap.pass.is_some() { - return Err(PublicError::PasswordNotAllowed); + return Err(PublicError::PasswordNotAllowed) } let s = cap.phrase.unwrap_or(DEV_ADDRESS); let addr = if let Some(stripped) = s.strip_prefix("0x") { @@ -454,7 +454,7 @@ impl + AsRef<[u8]> + Public + Derive> Ss58Codec for T { fn from_string_with_version(s: &str) -> Result<(Self, Ss58AddressFormat), PublicError> { let cap = AddressUri::parse(s)?; if cap.pass.is_some() { - return Err(PublicError::PasswordNotAllowed); + return Err(PublicError::PasswordNotAllowed) } let (addr, v) = Self::from_ss58check_with_version(cap.phrase.unwrap_or(DEV_ADDRESS))?; if cap.paths.is_empty() { diff --git a/substrate/utils/wasm-builder/src/wasm_project.rs b/substrate/utils/wasm-builder/src/wasm_project.rs index 5bf44c2c9b2..2126a49bd7f 100644 --- a/substrate/utils/wasm-builder/src/wasm_project.rs +++ b/substrate/utils/wasm-builder/src/wasm_project.rs @@ -935,7 +935,7 @@ fn generate_rerun_if_changed_instructions( while let Some(dependency) = dependencies.pop() { // Ignore all dev dependencies if dependency.kind == DependencyKind::Development { - continue; + continue } let path_or_git_dep = -- GitLab From dbff87c268f18bdd8ef01a09f61ce910f2a5ab33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Mon, 8 Jan 2024 12:45:17 +0000 Subject: [PATCH 124/191] Return latest known relay chain block number in `on_initialize` etc (#2862) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This changes `RelaychainDataProvider` to return the latest known relay chain block number in `on_initialize` et all, aka when the `validation_data` wasn't yet set by the inherent. --------- Co-authored-by: Dónal Murray --- cumulus/pallets/parachain-system/src/lib.rs | 53 +++++++-------------- prdoc/pr_2862.prdoc | 11 +++++ 2 files changed, 29 insertions(+), 35 deletions(-) create mode 100644 prdoc/pr_2862.prdoc diff --git a/cumulus/pallets/parachain-system/src/lib.rs b/cumulus/pallets/parachain-system/src/lib.rs index ba8aff0e369..5a0fa57fb17 100644 --- a/cumulus/pallets/parachain-system/src/lib.rs +++ b/cumulus/pallets/parachain-system/src/lib.rs @@ -1683,20 +1683,33 @@ pub trait RelaychainStateProvider { } /// Implements [`BlockNumberProvider`] that returns relay chain block number fetched from validation -/// data. When validation data is not available (e.g. within on_initialize), 0 will be returned. +/// data. +/// +/// When validation data is not available (e.g. within `on_initialize`), it will fallback to use +/// [`Pallet::last_relay_block_number()`]. /// /// **NOTE**: This has been deprecated, please use [`RelaychainDataProvider`] #[deprecated = "Use `RelaychainDataProvider` instead"] -pub struct RelaychainBlockNumberProvider(sp_std::marker::PhantomData); +pub type RelaychainBlockNumberProvider = RelaychainDataProvider; -#[allow(deprecated)] -impl BlockNumberProvider for RelaychainBlockNumberProvider { +/// Implements [`BlockNumberProvider`] and [`RelaychainStateProvider`] that returns relevant relay +/// data fetched from validation data. +/// +/// NOTE: When validation data is not available (e.g. within `on_initialize`): +/// +/// - [`current_relay_chain_state`](Self::current_relay_chain_state): Will return the default value +/// of [`RelayChainState`]. +/// - [`current_block_number`](Self::current_block_number): Will return +/// [`Pallet::last_relay_block_number()`]. +pub struct RelaychainDataProvider(sp_std::marker::PhantomData); + +impl BlockNumberProvider for RelaychainDataProvider { type BlockNumber = relay_chain::BlockNumber; fn current_block_number() -> relay_chain::BlockNumber { Pallet::::validation_data() .map(|d| d.relay_parent_number) - .unwrap_or_default() + .unwrap_or_else(|| Pallet::::last_relay_block_number()) } #[cfg(feature = "runtime-benchmarks")] @@ -1739,33 +1752,3 @@ impl RelaychainStateProvider for RelaychainDataProvider { ValidationData::::put(validation_data) } } - -/// Implements [`BlockNumberProvider`] and [`RelaychainStateProvider`] that returns relevant relay -/// data fetched from validation data. -/// NOTE: When validation data is not available (e.g. within on_initialize), default values will be -/// returned. -pub struct RelaychainDataProvider(sp_std::marker::PhantomData); - -impl BlockNumberProvider for RelaychainDataProvider { - type BlockNumber = relay_chain::BlockNumber; - - fn current_block_number() -> relay_chain::BlockNumber { - Pallet::::validation_data() - .map(|d| d.relay_parent_number) - .unwrap_or_default() - } - - #[cfg(feature = "runtime-benchmarks")] - fn set_block_number(block: Self::BlockNumber) { - let mut validation_data = Pallet::::validation_data().unwrap_or_else(|| - // PersistedValidationData does not impl default in non-std - PersistedValidationData { - parent_head: vec![].into(), - relay_parent_number: Default::default(), - max_pov_size: Default::default(), - relay_parent_storage_root: Default::default(), - }); - validation_data.relay_parent_number = block; - ValidationData::::put(validation_data) - } -} diff --git a/prdoc/pr_2862.prdoc b/prdoc/pr_2862.prdoc new file mode 100644 index 00000000000..fa136b5d98a --- /dev/null +++ b/prdoc/pr_2862.prdoc @@ -0,0 +1,11 @@ +title: Return latest known relay chain block number in `on_initialize` etc. + +doc: + - audience: Runtime Dev + description: | + `RelaychainDataProvider` and `RelaychainBlockNumberProvider` will now return the latest known + relay chain block number in `on_initialize`, aka when `validation_data` wasn't yet set by + the inherent. + +crates: + - name: "cumulus-pallet-parachain-system" -- GitLab From 5daef5d086b16a02fcff5873898c42249ecd5d33 Mon Sep 17 00:00:00 2001 From: PG Herveou Date: Mon, 8 Jan 2024 14:11:31 +0100 Subject: [PATCH 125/191] Contracts rename riscv-experimental and enable ci tests (#2879) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Keep feature name short s/riscv-experimental/riscv - Add to feature to CI build --------- Co-authored-by: Bastian Köcher --- .gitlab/pipeline/test.yml | 2 +- substrate/frame/contracts/fixtures/Cargo.toml | 5 ++--- substrate/frame/contracts/fixtures/build.rs | 10 +++++----- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/.gitlab/pipeline/test.yml b/.gitlab/pipeline/test.yml index 359d5b4dbcd..00d2b22c810 100644 --- a/.gitlab/pipeline/test.yml +++ b/.gitlab/pipeline/test.yml @@ -29,7 +29,7 @@ test-linux-stable: --locked \ --release \ --no-fail-fast \ - --features try-runtime,experimental,ci-only-tests \ + --features try-runtime,experimental,riscv,ci-only-tests \ --partition count:${CI_NODE_INDEX}/${CI_NODE_TOTAL} # Upload tests results to Elasticsearch - echo "Upload test results to Elasticsearch" diff --git a/substrate/frame/contracts/fixtures/Cargo.toml b/substrate/frame/contracts/fixtures/Cargo.toml index 58f20f0b8f5..36bc3974f5e 100644 --- a/substrate/frame/contracts/fixtures/Cargo.toml +++ b/substrate/frame/contracts/fixtures/Cargo.toml @@ -21,9 +21,8 @@ parity-wasm = "0.45.0" tempfile = "3.8.1" toml = "0.8.2" twox-hash = "1.6.3" -polkavm-linker = "0.3.0" +polkavm-linker = { version = "0.3.0", optional = true } anyhow = "1.0.0" [features] -# Enable experimental RISCV fixtures build -riscv-experimental = [] +riscv = ["polkavm-linker"] diff --git a/substrate/frame/contracts/fixtures/build.rs b/substrate/frame/contracts/fixtures/build.rs index 34e44c5db11..125ee7f3722 100644 --- a/substrate/frame/contracts/fixtures/build.rs +++ b/substrate/frame/contracts/fixtures/build.rs @@ -91,7 +91,7 @@ impl Entry { } /// Return the name of the RISC-V polkavm file. - #[cfg(feature = "riscv-experimental")] + #[cfg(feature = "riscv")] fn out_riscv_filename(&self) -> String { format!("{}.polkavm", self.name()) } @@ -232,7 +232,7 @@ fn post_process_wasm(input_path: &Path, output_path: &Path) -> Result<()> { } /// Build contracts for RISC-V. -#[cfg(feature = "riscv-experimental")] +#[cfg(feature = "riscv")] fn invoke_riscv_build(current_dir: &Path) -> Result<()> { let encoded_rustflags = ["-Crelocation-model=pie", "-Clink-arg=--emit-relocs", "-Clink-arg=-Tmemory.ld"] @@ -267,7 +267,7 @@ fn invoke_riscv_build(current_dir: &Path) -> Result<()> { bail!("Failed to build contracts"); } /// Post-process the compiled wasm contracts. -#[cfg(feature = "riscv-experimental")] +#[cfg(feature = "riscv")] fn post_process_riscv(input_path: &Path, output_path: &Path) -> Result<()> { let mut config = polkavm_linker::Config::default(); config.set_strip(true); @@ -286,7 +286,7 @@ fn write_output(build_dir: &Path, out_dir: &Path, entries: Vec) -> Result &out_dir.join(&wasm_output), )?; - #[cfg(feature = "riscv-experimental")] + #[cfg(feature = "riscv")] post_process_riscv( &build_dir.join("target/riscv32em-unknown-none-elf/release").join(entry.name()), &out_dir.join(entry.out_riscv_filename()), @@ -340,7 +340,7 @@ fn main() -> Result<()> { invoke_wasm_build(tmp_dir_path)?; - #[cfg(feature = "riscv-experimental")] + #[cfg(feature = "riscv")] invoke_riscv_build(tmp_dir_path)?; write_output(tmp_dir_path, &out_dir, entries)?; -- GitLab From 1914775bd4a2254dd3f70d8de1d70c1635e83489 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Mon, 8 Jan 2024 15:45:15 +0000 Subject: [PATCH 126/191] Make `simple-mermaid` optional (#2878) This prevents it leaking `std` into `no_std` builds. Closes: https://github.com/paritytech/polkadot-sdk/issues/2866 --- substrate/frame/Cargo.toml | 3 ++- substrate/primitives/runtime/Cargo.toml | 3 ++- .../primitives/runtime/src/generic/unchecked_extrinsic.rs | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/substrate/frame/Cargo.toml b/substrate/frame/Cargo.toml index 083d098b22a..81642ce14a1 100644 --- a/substrate/frame/Cargo.toml +++ b/substrate/frame/Cargo.toml @@ -48,7 +48,7 @@ frame-executive = { default-features = false, path = "../frame/executive", optio frame-system-rpc-runtime-api = { default-features = false, path = "../frame/system/rpc/runtime-api", optional = true } docify = "0.2.0" -simple-mermaid = { git = "https://github.com/kianenigma/simple-mermaid.git", rev = "e48b187bcfd5cc75111acd9d241f1bd36604344b" } +simple-mermaid = { git = "https://github.com/kianenigma/simple-mermaid.git", rev = "e48b187bcfd5cc75111acd9d241f1bd36604344b", optional = true } log = { version = "0.4.20", default-features = false } [dev-dependencies] @@ -78,6 +78,7 @@ std = [ "log/std", "parity-scale-codec/std", "scale-info/std", + "simple-mermaid", "sp-api?/std", "sp-arithmetic/std", "sp-block-builder?/std", diff --git a/substrate/primitives/runtime/Cargo.toml b/substrate/primitives/runtime/Cargo.toml index 448aad39ec9..f347a6cfe6d 100644 --- a/substrate/primitives/runtime/Cargo.toml +++ b/substrate/primitives/runtime/Cargo.toml @@ -34,7 +34,7 @@ sp-std = { path = "../std", default-features = false } sp-weights = { path = "../weights", default-features = false } docify = { version = "0.2.6" } -simple-mermaid = { git = "https://github.com/kianenigma/simple-mermaid.git", rev = "e48b187bcfd5cc75111acd9d241f1bd36604344b" } +simple-mermaid = { git = "https://github.com/kianenigma/simple-mermaid.git", rev = "e48b187bcfd5cc75111acd9d241f1bd36604344b", optional = true } [dev-dependencies] rand = "0.8.5" @@ -57,6 +57,7 @@ std = [ "rand", "scale-info/std", "serde/std", + "simple-mermaid", "sp-api/std", "sp-application-crypto/std", "sp-arithmetic/std", diff --git a/substrate/primitives/runtime/src/generic/unchecked_extrinsic.rs b/substrate/primitives/runtime/src/generic/unchecked_extrinsic.rs index 6ac381babee..f066de2323d 100644 --- a/substrate/primitives/runtime/src/generic/unchecked_extrinsic.rs +++ b/substrate/primitives/runtime/src/generic/unchecked_extrinsic.rs @@ -57,7 +57,7 @@ type UncheckedSignaturePayload = (Address, Signature, /// could in principle be any other interaction. Transactions are either signed or unsigned. A /// sensible transaction pool should ensure that only transactions that are worthwhile are /// considered for block-building. -#[doc = simple_mermaid::mermaid!("../../../../../docs/mermaid/extrinsics.mmd")] +#[cfg_attr(feature = "std", doc = simple_mermaid::mermaid!("../../../../../docs/mermaid/extrinsics.mmd"))] /// This type is by no means enforced within Substrate, but given its genericness, it is highly /// likely that for most use-cases it will suffice. Thus, the encoding of this type will dictate /// exactly what bytes should be sent to a runtime to transact with it. -- GitLab From 4fdab499c487c7762425dd7e4e888e7ba71a4990 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Mon, 8 Jan 2024 18:41:02 +0000 Subject: [PATCH 127/191] Coretime Zombienet test (#2867) This adds a Zombienet test for Coretime. Requires: https://github.com/paritytech/polkadot-sdk/pull/2862 --------- Co-authored-by: Javier Viola Co-authored-by: Javier Viola <363911+pepoviola@users.noreply.github.com> --- .gitlab/pipeline/zombienet/polkadot.yml | 8 +++++ .../coretime/coretime-rococo/Cargo.toml | 2 ++ .../coretime/coretime-rococo/build.rs | 10 +++++- .../coretime/coretime-rococo/src/coretime.rs | 15 ++++++-- .../coretime/coretime-rococo/src/lib.rs | 8 +++++ .../src/chain_spec/coretime.rs | 34 ++++++++++++------- .../runtime/parachains/src/coretime/mod.rs | 15 +++++--- .../smoke/0004-configure-broker.js | 33 +++++++++--------- .../smoke/0004-configure-relay.js | 23 +++++++++++-- .../smoke/0004-coretime-smoke-test.toml | 33 +++++------------- .../smoke/0004-coretime-smoke-test.zndsl | 8 ++--- 11 files changed, 118 insertions(+), 71 deletions(-) diff --git a/.gitlab/pipeline/zombienet/polkadot.yml b/.gitlab/pipeline/zombienet/polkadot.yml index 6b89648c4e3..c246d98a048 100644 --- a/.gitlab/pipeline/zombienet/polkadot.yml +++ b/.gitlab/pipeline/zombienet/polkadot.yml @@ -185,6 +185,14 @@ zombienet-polkadot-smoke-0003-deregister-register-validator: --local-dir="${LOCAL_DIR}/smoke" --test="0003-deregister-register-validator-smoke.zndsl" +zombienet-polkadot-smoke-0004-coretime-smoke-test: + extends: + - .zombienet-polkadot-common + script: + - /home/nonroot/zombie-net/scripts/ci/run-test-local-env-manager.sh + --local-dir="${LOCAL_DIR}/smoke" + --test="0004-coretime-smoke-test.zndsl" + zombienet-polkadot-misc-0001-parachains-paritydb: extends: - .zombienet-polkadot-common diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml b/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml index 0af44045da4..c4544f525a2 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/Cargo.toml @@ -194,3 +194,5 @@ try-runtime = [ ] experimental = ["pallet-aura/experimental"] + +fast-runtime = [] diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/build.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/build.rs index 60f8a125129..28dacd20cf3 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/build.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/build.rs @@ -19,7 +19,15 @@ fn main() { .with_current_project() .export_heap_base() .import_memory() - .build() + .build(); + + substrate_wasm_builder::WasmBuilder::new() + .with_current_project() + .set_file_name("fast_runtime_binary.rs") + .enable_feature("fast-runtime") + .import_memory() + .export_heap_base() + .build(); } #[cfg(not(feature = "std"))] diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/coretime.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/coretime.rs index a85d67f7b4c..f8a5dc6398a 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/coretime.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/coretime.rs @@ -17,6 +17,7 @@ use crate::*; use codec::{Decode, Encode}; use cumulus_pallet_parachain_system::RelaychainDataProvider; +use cumulus_primitives_core::relay_chain; use frame_support::{ parameter_types, traits::{ @@ -51,11 +52,16 @@ enum CoretimeProviderCalls { #[codec(index = 1)] RequestCoreCount(CoreIndex), #[codec(index = 2)] - RequestRevenueInfoAt(BlockNumber), + RequestRevenueInfoAt(relay_chain::BlockNumber), #[codec(index = 3)] CreditAccount(AccountId, Balance), #[codec(index = 4)] - AssignCore(CoreIndex, BlockNumber, Vec<(CoreAssignment, PartsOf57600)>, Option), + AssignCore( + CoreIndex, + relay_chain::BlockNumber, + Vec<(CoreAssignment, PartsOf57600)>, + Option, + ), } parameter_types! { @@ -181,7 +187,7 @@ impl CoretimeInterface for CoretimeAllocator { }, Instruction::Transact { origin_kind: OriginKind::Native, - require_weight_at_most: Weight::from_parts(1000000000, 200000), + require_weight_at_most: Weight::from_parts(1_000_000_000, 200000), call: assign_core_call.encode().into(), }, ]); @@ -215,6 +221,9 @@ impl pallet_broker::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Currency = Balances; type OnRevenue = CreditToCollatorPot; + #[cfg(feature = "fast-runtime")] + type TimeslicePeriod = ConstU32<10>; + #[cfg(not(feature = "fast-runtime"))] type TimeslicePeriod = ConstU32<80>; type MaxLeasedCores = ConstU32<50>; type MaxReservedCores = ConstU32<10>; diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs index 95709117578..0f01c2d7416 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs @@ -21,6 +21,14 @@ #[cfg(feature = "std")] include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); +/// Provides the `WASM_BINARY` build with `fast-runtime` feature enabled. +/// +/// This is for example useful for local test chains. +#[cfg(feature = "std")] +pub mod fast_runtime_binary { + include!(concat!(env!("OUT_DIR"), "/fast_runtime_binary.rs")); +} + mod coretime; mod weights; pub mod xcm_config; diff --git a/cumulus/polkadot-parachain/src/chain_spec/coretime.rs b/cumulus/polkadot-parachain/src/chain_spec/coretime.rs index 958336c03b5..fbce4e5bc21 100644 --- a/cumulus/polkadot-parachain/src/chain_spec/coretime.rs +++ b/cumulus/polkadot-parachain/src/chain_spec/coretime.rs @@ -20,7 +20,7 @@ use sc_chain_spec::{ChainSpec, ChainType}; use std::{borrow::Cow, str::FromStr}; /// Collects all supported Coretime configurations. -#[derive(Debug, PartialEq, Clone)] +#[derive(Debug, PartialEq, Clone, Copy)] pub enum CoretimeRuntimeType { // Live Rococo, @@ -85,13 +85,13 @@ impl CoretimeRuntimeType { &include_bytes!("../../../parachains/chain-specs/coretime-rococo.json")[..], )?)), CoretimeRuntimeType::RococoLocal => - Ok(Box::new(rococo::local_config(self, "rococo-local"))), + Ok(Box::new(rococo::local_config(*self, "rococo-local"))), CoretimeRuntimeType::RococoDevelopment => - Ok(Box::new(rococo::local_config(self, "rococo-dev"))), + Ok(Box::new(rococo::local_config(*self, "rococo-dev"))), CoretimeRuntimeType::WestendLocal => - Ok(Box::new(westend::local_config(self, "westend-local"))), + Ok(Box::new(westend::local_config(*self, "westend-local"))), CoretimeRuntimeType::WestendDevelopment => - Ok(Box::new(westend::local_config(self, "westend-dev"))), + Ok(Box::new(westend::local_config(*self, "westend-dev"))), } } } @@ -114,6 +114,7 @@ pub mod rococo { get_account_id_from_seed, get_collator_keys_from_seed, Extensions, SAFE_XCM_VERSION, }; use parachains_common::{AccountId, AuraId, Balance}; + use sc_chain_spec::ChainType; use sp_core::sr25519; pub(crate) const CORETIME_ROCOCO: &str = "coretime-rococo"; @@ -121,24 +122,31 @@ pub mod rococo { pub(crate) const CORETIME_ROCOCO_DEVELOPMENT: &str = "coretime-rococo-dev"; const CORETIME_ROCOCO_ED: Balance = parachains_common::rococo::currency::EXISTENTIAL_DEPOSIT; - pub fn local_config(runtime_type: &CoretimeRuntimeType, relay_chain: &str) -> GenericChainSpec { + pub fn local_config(runtime_type: CoretimeRuntimeType, relay_chain: &str) -> GenericChainSpec { // Rococo defaults let mut properties = sc_chain_spec::Properties::new(); properties.insert("ss58Format".into(), 42.into()); properties.insert("tokenSymbol".into(), "ROC".into()); properties.insert("tokenDecimals".into(), 12.into()); - let chain_type = runtime_type.clone().into(); + let chain_type = runtime_type.into(); let chain_name = format!("Coretime Rococo {}", chain_type_name(&chain_type)); let para_id = super::CORETIME_PARA_ID; - GenericChainSpec::builder( + let wasm_binary = if matches!(chain_type, ChainType::Local | ChainType::Development) { + coretime_rococo_runtime::fast_runtime_binary::WASM_BINARY + .expect("WASM binary was not built, please build it!") + } else { coretime_rococo_runtime::WASM_BINARY - .expect("WASM binary was not built, please build it!"), + .expect("WASM binary was not built, please build it!") + }; + + GenericChainSpec::builder( + wasm_binary, Extensions { relay_chain: relay_chain.to_string(), para_id: para_id.into() }, ) .with_name(&chain_name) - .with_id(runtime_type.clone().into()) + .with_id(runtime_type.into()) .with_chain_type(chain_type) .with_genesis_config_patch(genesis( // initial collators. @@ -209,14 +217,14 @@ pub mod westend { pub(crate) const CORETIME_WESTEND_DEVELOPMENT: &str = "coretime-westend-dev"; const CORETIME_WESTEND_ED: Balance = parachains_common::westend::currency::EXISTENTIAL_DEPOSIT; - pub fn local_config(runtime_type: &CoretimeRuntimeType, relay_chain: &str) -> GenericChainSpec { + pub fn local_config(runtime_type: CoretimeRuntimeType, relay_chain: &str) -> GenericChainSpec { // westend defaults let mut properties = sc_chain_spec::Properties::new(); properties.insert("ss58Format".into(), 42.into()); properties.insert("tokenSymbol".into(), "WND".into()); properties.insert("tokenDecimals".into(), 12.into()); - let chain_type = runtime_type.clone().into(); + let chain_type = runtime_type.into(); let chain_name = format!("Coretime Westend {}", chain_type_name(&chain_type)); let para_id = super::CORETIME_PARA_ID; @@ -226,7 +234,7 @@ pub mod westend { Extensions { relay_chain: relay_chain.to_string(), para_id: para_id.into() }, ) .with_name(&chain_name) - .with_id(runtime_type.clone().into()) + .with_id(runtime_type.into()) .with_chain_type(chain_type) .with_genesis_config_patch(genesis( // initial collators. diff --git a/polkadot/runtime/parachains/src/coretime/mod.rs b/polkadot/runtime/parachains/src/coretime/mod.rs index 8da6ccf07ca..60bd8f81193 100644 --- a/polkadot/runtime/parachains/src/coretime/mod.rs +++ b/polkadot/runtime/parachains/src/coretime/mod.rs @@ -27,7 +27,8 @@ use pallet_broker::{CoreAssignment, CoreIndex as BrokerCoreIndex}; use primitives::{CoreIndex, Id as ParaId}; use sp_arithmetic::traits::SaturatedConversion; use xcm::v3::{ - send_xcm, Instruction, Junction, Junctions, MultiLocation, OriginKind, SendXcm, Xcm, + send_xcm, Instruction, Junction, Junctions, MultiLocation, OriginKind, SendXcm, WeightLimit, + Xcm, }; use crate::{ @@ -220,9 +221,13 @@ impl Pallet { let new_core_count = notification.new_config.coretime_cores; if new_core_count != old_core_count { let core_count: u16 = new_core_count.saturated_into(); - let message = Xcm(vec![mk_coretime_call( - crate::coretime::CoretimeCalls::NotifyCoreCount(core_count), - )]); + let message = Xcm(vec![ + Instruction::UnpaidExecution { + weight_limit: WeightLimit::Unlimited, + check_origin: None, + }, + mk_coretime_call(crate::coretime::CoretimeCalls::NotifyCoreCount(core_count)), + ]); if let Err(err) = send_xcm::( MultiLocation { parents: 0, @@ -247,7 +252,7 @@ fn mk_coretime_call(call: crate::coretime::CoretimeCalls) -> Instruction<()> { origin_kind: OriginKind::Superuser, // Largest call is set_lease with 1526 byte: // Longest call is reserve() with 31_000_000 - require_weight_at_most: Weight::from_parts(100_000_000, 20_000), + require_weight_at_most: Weight::from_parts(110_000_000, 20_000), call: BrokerRuntimePallets::Broker(call).encode().into(), } } diff --git a/polkadot/zombienet_tests/smoke/0004-configure-broker.js b/polkadot/zombienet_tests/smoke/0004-configure-broker.js index a4939ffe1cb..889861f5c52 100644 --- a/polkadot/zombienet_tests/smoke/0004-configure-broker.js +++ b/polkadot/zombienet_tests/smoke/0004-configure-broker.js @@ -13,29 +13,30 @@ async function run(nodeName, networkInfo, _jsArgs) { const calls = [ // Default broker configuration api.tx.broker.configure({ - advanceNotice: 2, + advanceNotice: 5, interludeLength: 1, leadinLength: 1, - regionLength: 3, + regionLength: 1, idealBulkProportion: 100, limitCoresOffered: null, renewalBump: 10, contributionTimeout: 5, }), - // Make reservation for ParaId 100 (adder-a) every other block - // and ParaId 101 (adder-b) every other block. - api.tx.broker.reserve([ - { - mask: [255, 0, 255, 0, 255, 0, 255, 0, 255, 0], - assignment: { Task: 100 }, - }, - { - mask: [0, 255, 0, 255, 0, 255, 0, 255, 0, 255], - assignment: { Task: 101 }, - }, - ]), - // Start sale with 1 core starting at 1 planck - api.tx.broker.startSales(1, 1), + // We need MOARE cores. + api.tx.broker.requestCoreCount(2), + // Set a lease for the broker chain itself. + api.tx.broker.setLease( + 1005, + 1000, + ), + // Set a lease for parachain 100 + api.tx.broker.setLease( + 100, + 1000, + ), + // Start sale to make the broker "work", but we don't offer any cores + // as we have fixed leases only anyway. + api.tx.broker.startSales(1, 0), ]; const sudo_batch = api.tx.sudo.sudo(api.tx.utility.batch(calls)); diff --git a/polkadot/zombienet_tests/smoke/0004-configure-relay.js b/polkadot/zombienet_tests/smoke/0004-configure-relay.js index 9ca23d86a56..724d1b537a3 100644 --- a/polkadot/zombienet_tests/smoke/0004-configure-relay.js +++ b/polkadot/zombienet_tests/smoke/0004-configure-relay.js @@ -1,18 +1,37 @@ const assert = require("assert"); async function run(nodeName, networkInfo, _jsArgs) { - const { wsUri, userDefinedTypes } = networkInfo.nodesByName[nodeName]; + const init = networkInfo.nodesByName[nodeName]; + let wsUri = init.wsUri; + let userDefinedTypes = init.userDefinedTypes; const api = await zombie.connect(wsUri, userDefinedTypes); + const sec = networkInfo.nodesByName["collator-para-100"]; + wsUri = sec.wsUri; + userDefinedTypes = sec.userDefinedTypes; + + const api_collator = await zombie.connect(wsUri, userDefinedTypes); + await zombie.util.cryptoWaitReady(); + // Get the genesis header and the validation code of parachain 100 + const genesis_header = await api_collator.rpc.chain.getHeader(); + const validation_code = await api_collator.rpc.state.getStorage("0x3A636F6465"); + // account to submit tx const keyring = new zombie.Keyring({ type: "sr25519" }); const alice = keyring.addFromUri("//Alice"); const calls = [ api.tx.configuration.setCoretimeCores({ new: 1 }), - api.tx.coretime.assignCore(0, 20,[[ { task: 1005 }, 57600 ]], null) + api.tx.coretime.assignCore(0, 20,[[ { task: 1005 }, 57600 ]], null), + api.tx.registrar.forceRegister( + alice.address, + 0, + 100, + genesis_header.toHex(), + validation_code.toHex(), + ) ]; const sudo_batch = api.tx.sudo.sudo(api.tx.utility.batch(calls)); diff --git a/polkadot/zombienet_tests/smoke/0004-coretime-smoke-test.toml b/polkadot/zombienet_tests/smoke/0004-coretime-smoke-test.toml index 3bcd0bee3c7..0bdb58fa1ef 100644 --- a/polkadot/zombienet_tests/smoke/0004-coretime-smoke-test.toml +++ b/polkadot/zombienet_tests/smoke/0004-coretime-smoke-test.toml @@ -8,7 +8,7 @@ command = "polkadot" [[relaychain.nodes]] name = "alice" - args = ["-lruntime=debug,parachain=trace" ] + args = ["-lruntime=debug,xcm=trace" ] [[relaychain.nodes]] name = "bob" @@ -24,35 +24,18 @@ chain = "coretime-rococo-local" [parachains.collator] name = "coretime-collator" - image = "{{COL_IMAGE}}" + image = "{{CUMULUS_IMAGE}}" command = "polkadot-parachain" - args = [ "-lruntime=debug,parachain=trace" ] + args = [ "-lruntime=debug,xcm=trace" ] [[parachains]] id = 100 add_to_genesis = false -register_para = true -onboard_as_parachain = false - - [parachains.collator] - name = "adder-a" - image = "{{COL_IMAGE}}" - command = "adder-collator" - args = [ "-lruntime=debug,parachain=trace" ] - -[[parachains]] -id = 101 -add_to_genesis = false -register_para = true +register_para = false onboard_as_parachain = false [parachains.collator] - name = "adder-b" - image = "{{COL_IMAGE}}" - command = "adder-collator" - args = [ "-lruntime=debug,parachain=trace" ] - -[types.Header] -number = "u64" -parent_hash = "Hash" -post_state = "Hash" + name = "collator-para-100" + image = "{{CUMULUS_IMAGE}}" + command = "polkadot-parachain" + args = ["-lruntime=debug,parachain=trace,aura=trace", "--force-authoring"] diff --git a/polkadot/zombienet_tests/smoke/0004-coretime-smoke-test.zndsl b/polkadot/zombienet_tests/smoke/0004-coretime-smoke-test.zndsl index 45e000e0bf8..cfb1ce7d982 100644 --- a/polkadot/zombienet_tests/smoke/0004-coretime-smoke-test.zndsl +++ b/polkadot/zombienet_tests/smoke/0004-coretime-smoke-test.zndsl @@ -5,15 +5,11 @@ Creds: config alice: is up coretime-collator: is up -alice: reports block height is at least 3 within 30 seconds # configure relay chain alice: js-script ./0004-configure-relay.js with "" return is 0 within 600 secs -# Wait 2 sessions. The parachain doesn't start block production immediately. -alice: log line contains "New session detected session_index=2" within 600 seconds - # configure broker chain coretime-collator: js-script ./0004-configure-broker.js with "" return is 0 within 600 secs -# TODO: Fix this -# alice: parachain 100 block height is at least 10 within 600 seconds +# Ensure that parachain 100 got onboarded +alice: parachain 100 block height is at least 5 within 900 seconds -- GitLab From a02b53475b9fe2567ae05ad4e03c81f4f3d6b463 Mon Sep 17 00:00:00 2001 From: ordian Date: Mon, 8 Jan 2024 20:58:30 +0100 Subject: [PATCH 128/191] backport to master: Handling of disabled validators in backing subsystem (#1259) (#2764) #1259 was merged into a feature branch, but we've decided to merge node-side changes for disabling straight into master. This is a dependency of #1841 and #2637. --------- Co-authored-by: Tsvetomir Dimitrov --- polkadot/node/core/backing/src/lib.rs | 87 ++++- polkadot/node/core/backing/src/tests/mod.rs | 329 +++++++++++++++++- .../src/tests/prospective_parachains.rs | 20 ++ polkadot/node/core/provisioner/src/lib.rs | 59 +--- polkadot/node/subsystem-util/src/lib.rs | 80 ++++- polkadot/node/subsystem-util/src/vstaging.rs | 56 +++ prdoc/pr_2764.prdoc | 16 + 7 files changed, 574 insertions(+), 73 deletions(-) create mode 100644 polkadot/node/subsystem-util/src/vstaging.rs create mode 100644 prdoc/pr_2764.prdoc diff --git a/polkadot/node/core/backing/src/lib.rs b/polkadot/node/core/backing/src/lib.rs index 434051f1b00..ba25ebb192e 100644 --- a/polkadot/node/core/backing/src/lib.rs +++ b/polkadot/node/core/backing/src/lib.rs @@ -118,6 +118,7 @@ use statement_table::{ }, Config as TableConfig, Context as TableContextTrait, Table, }; +use util::vstaging::get_disabled_validators_with_fallback; mod error; @@ -383,6 +384,21 @@ struct TableContext { validator: Option, groups: HashMap>, validators: Vec, + disabled_validators: Vec, +} + +impl TableContext { + // Returns `true` if the provided `ValidatorIndex` is in the disabled validators list + pub fn validator_is_disabled(&self, validator_idx: &ValidatorIndex) -> bool { + self.disabled_validators + .iter() + .any(|disabled_val_idx| *disabled_val_idx == *validator_idx) + } + + // Returns `true` if the local validator is in the disabled validators list + pub fn local_validator_is_disabled(&self) -> Option { + self.validator.as_ref().map(|v| v.disabled()) + } } impl TableContextTrait for TableContext { @@ -1010,21 +1026,33 @@ async fn construct_per_relay_parent_state( let minimum_backing_votes = try_runtime_api!(request_min_backing_votes(parent, session_index, ctx.sender()).await); + // TODO: https://github.com/paritytech/polkadot-sdk/issues/1940 + // Once runtime ver `DISABLED_VALIDATORS_RUNTIME_REQUIREMENT` is released remove this call to + // `get_disabled_validators_with_fallback`, add `request_disabled_validators` call to the + // `try_join!` above and use `try_runtime_api!` to get `disabled_validators` + let disabled_validators = get_disabled_validators_with_fallback(ctx.sender(), parent) + .await + .map_err(Error::UtilError)?; + let signing_context = SigningContext { parent_hash: parent, session_index }; - let validator = - match Validator::construct(&validators, signing_context.clone(), keystore.clone()) { - Ok(v) => Some(v), - Err(util::Error::NotAValidator) => None, - Err(e) => { - gum::warn!( - target: LOG_TARGET, - err = ?e, - "Cannot participate in candidate backing", - ); + let validator = match Validator::construct( + &validators, + &disabled_validators, + signing_context.clone(), + keystore.clone(), + ) { + Ok(v) => Some(v), + Err(util::Error::NotAValidator) => None, + Err(e) => { + gum::warn!( + target: LOG_TARGET, + err = ?e, + "Cannot participate in candidate backing", + ); - return Ok(None) - }, - }; + return Ok(None) + }, + }; let mut groups = HashMap::new(); let n_cores = cores.len(); @@ -1054,7 +1082,7 @@ async fn construct_per_relay_parent_state( } } - let table_context = TableContext { groups, validators, validator }; + let table_context = TableContext { validator, groups, validators, disabled_validators }; let table_config = TableConfig { allow_multiple_seconded: match mode { ProspectiveParachainsMode::Enabled { .. } => true, @@ -1726,6 +1754,19 @@ async fn kick_off_validation_work( background_validation_tx: &mpsc::Sender<(Hash, ValidatedCandidateCommand)>, attesting: AttestingData, ) -> Result<(), Error> { + // Do nothing if the local validator is disabled or not a validator at all + match rp_state.table_context.local_validator_is_disabled() { + Some(true) => { + gum::info!(target: LOG_TARGET, "We are disabled - don't kick off validation"); + return Ok(()) + }, + Some(false) => {}, // we are not disabled - move on + None => { + gum::debug!(target: LOG_TARGET, "We are not a validator - don't kick off validation"); + return Ok(()) + }, + } + let candidate_hash = attesting.candidate.hash(); if rp_state.issued_statements.contains(&candidate_hash) { return Ok(()) @@ -1783,6 +1824,16 @@ async fn maybe_validate_and_import( }, }; + // Don't import statement if the sender is disabled + if rp_state.table_context.validator_is_disabled(&statement.validator_index()) { + gum::debug!( + target: LOG_TARGET, + sender_validator_idx = ?statement.validator_index(), + "Not importing statement because the sender is disabled" + ); + return Ok(()) + } + let res = import_statement(ctx, rp_state, &mut state.per_candidate, &statement).await; // if we get an Error::RejectedByProspectiveParachains, @@ -1944,6 +1995,13 @@ async fn handle_second_message( Some(r) => r, }; + // Just return if the local validator is disabled. If we are here the local node should be a + // validator but defensively use `unwrap_or(false)` to continue processing in this case. + if rp_state.table_context.local_validator_is_disabled().unwrap_or(false) { + gum::warn!(target: LOG_TARGET, "Local validator is disabled. Don't validate and second"); + return Ok(()) + } + // Sanity check that candidate is from our assignment. if Some(candidate.descriptor().para_id) != rp_state.assignment { gum::debug!( @@ -1990,6 +2048,7 @@ async fn handle_statement_message( ) -> Result<(), Error> { let _timer = metrics.time_process_statement(); + // Validator disabling is handled in `maybe_validate_and_import` match maybe_validate_and_import(ctx, state, relay_parent, statement).await { Err(Error::ValidationFailed(_)) => Ok(()), Err(e) => Err(e), diff --git a/polkadot/node/core/backing/src/tests/mod.rs b/polkadot/node/core/backing/src/tests/mod.rs index c12be72556e..1957f4e19c5 100644 --- a/polkadot/node/core/backing/src/tests/mod.rs +++ b/polkadot/node/core/backing/src/tests/mod.rs @@ -41,7 +41,7 @@ use sp_keyring::Sr25519Keyring; use sp_keystore::Keystore; use sp_tracing as _; use statement_table::v2::Misbehavior; -use std::collections::HashMap; +use std::{collections::HashMap, time::Duration}; mod prospective_parachains; @@ -77,6 +77,7 @@ struct TestState { signing_context: SigningContext, relay_parent: Hash, minimum_backing_votes: u32, + disabled_validators: Vec, } impl TestState { @@ -148,6 +149,7 @@ impl Default for TestState { signing_context, relay_parent, minimum_backing_votes: LEGACY_MIN_BACKING_VOTES, + disabled_validators: Vec::new(), } } } @@ -293,6 +295,26 @@ async fn test_startup(virtual_overseer: &mut VirtualOverseer, test_state: &TestS tx.send(Ok(test_state.minimum_backing_votes)).unwrap(); } ); + + // Check that subsystem job issues a request for the runtime version. + assert_matches!( + virtual_overseer.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(parent, RuntimeApiRequest::Version(tx)) + ) if parent == test_state.relay_parent => { + tx.send(Ok(RuntimeApiRequest::DISABLED_VALIDATORS_RUNTIME_REQUIREMENT)).unwrap(); + } + ); + + // Check that subsystem job issues a request for the disabled validators. + assert_matches!( + virtual_overseer.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(parent, RuntimeApiRequest::DisabledValidators(tx)) + ) if parent == test_state.relay_parent => { + tx.send(Ok(test_state.disabled_validators.clone())).unwrap(); + } + ); } async fn assert_validation_requests( @@ -1420,6 +1442,7 @@ fn candidate_backing_reorders_votes() { let table_context = TableContext { validator: None, + disabled_validators: Vec::new(), groups: validator_groups, validators: validator_public.clone(), }; @@ -1957,3 +1980,307 @@ fn new_leaf_view_doesnt_clobber_old() { virtual_overseer }); } + +// Test that a disabled local validator doesn't do any work on `CandidateBackingMessage::Second` +#[test] +fn disabled_validator_doesnt_distribute_statement_on_receiving_second() { + let mut test_state = TestState::default(); + test_state.disabled_validators.push(ValidatorIndex(0)); + + test_harness(test_state.keystore.clone(), |mut virtual_overseer| async move { + test_startup(&mut virtual_overseer, &test_state).await; + + let pov = PoV { block_data: BlockData(vec![42, 43, 44]) }; + let pvd = dummy_pvd(); + let validation_code = ValidationCode(vec![1, 2, 3]); + + let expected_head_data = test_state.head_data.get(&test_state.chain_ids[0]).unwrap(); + + let pov_hash = pov.hash(); + let candidate = TestCandidateBuilder { + para_id: test_state.chain_ids[0], + relay_parent: test_state.relay_parent, + pov_hash, + head_data: expected_head_data.clone(), + erasure_root: make_erasure_root(&test_state, pov.clone(), pvd.clone()), + persisted_validation_data_hash: pvd.hash(), + validation_code: validation_code.0.clone(), + } + .build(); + + let second = CandidateBackingMessage::Second( + test_state.relay_parent, + candidate.to_plain(), + pvd.clone(), + pov.clone(), + ); + + virtual_overseer.send(FromOrchestra::Communication { msg: second }).await; + + // Ensure backing subsystem is not doing any work + assert_matches!(virtual_overseer.recv().timeout(Duration::from_secs(1)).await, None); + + virtual_overseer + .send(FromOrchestra::Signal(OverseerSignal::ActiveLeaves( + ActiveLeavesUpdate::stop_work(test_state.relay_parent), + ))) + .await; + virtual_overseer + }); +} + +// Test that a disabled local validator doesn't do any work on `CandidateBackingMessage::Statement` +#[test] +fn disabled_validator_doesnt_distribute_statement_on_receiving_statement() { + let mut test_state = TestState::default(); + test_state.disabled_validators.push(ValidatorIndex(0)); + + test_harness(test_state.keystore.clone(), |mut virtual_overseer| async move { + test_startup(&mut virtual_overseer, &test_state).await; + + let pov = PoV { block_data: BlockData(vec![42, 43, 44]) }; + let pvd = dummy_pvd(); + let validation_code = ValidationCode(vec![1, 2, 3]); + + let expected_head_data = test_state.head_data.get(&test_state.chain_ids[0]).unwrap(); + + let pov_hash = pov.hash(); + let candidate = TestCandidateBuilder { + para_id: test_state.chain_ids[0], + relay_parent: test_state.relay_parent, + pov_hash, + head_data: expected_head_data.clone(), + erasure_root: make_erasure_root(&test_state, pov.clone(), pvd.clone()), + persisted_validation_data_hash: pvd.hash(), + validation_code: validation_code.0.clone(), + } + .build(); + + let public2 = Keystore::sr25519_generate_new( + &*test_state.keystore, + ValidatorId::ID, + Some(&test_state.validators[2].to_seed()), + ) + .expect("Insert key into keystore"); + + let signed = SignedFullStatementWithPVD::sign( + &test_state.keystore, + StatementWithPVD::Seconded(candidate.clone(), pvd.clone()), + &test_state.signing_context, + ValidatorIndex(2), + &public2.into(), + ) + .ok() + .flatten() + .expect("should be signed"); + + let statement = CandidateBackingMessage::Statement(test_state.relay_parent, signed.clone()); + + virtual_overseer.send(FromOrchestra::Communication { msg: statement }).await; + + // Ensure backing subsystem is not doing any work + assert_matches!(virtual_overseer.recv().timeout(Duration::from_secs(1)).await, None); + + virtual_overseer + .send(FromOrchestra::Signal(OverseerSignal::ActiveLeaves( + ActiveLeavesUpdate::stop_work(test_state.relay_parent), + ))) + .await; + virtual_overseer + }); +} + +// Test that a validator doesn't do any work on receiving a `CandidateBackingMessage::Statement` +// from a disabled validator +#[test] +fn validator_ignores_statements_from_disabled_validators() { + let mut test_state = TestState::default(); + test_state.disabled_validators.push(ValidatorIndex(2)); + + test_harness(test_state.keystore.clone(), |mut virtual_overseer| async move { + test_startup(&mut virtual_overseer, &test_state).await; + + let pov = PoV { block_data: BlockData(vec![42, 43, 44]) }; + let pvd = dummy_pvd(); + let validation_code = ValidationCode(vec![1, 2, 3]); + + let expected_head_data = test_state.head_data.get(&test_state.chain_ids[0]).unwrap(); + + let pov_hash = pov.hash(); + let candidate = TestCandidateBuilder { + para_id: test_state.chain_ids[0], + relay_parent: test_state.relay_parent, + pov_hash, + head_data: expected_head_data.clone(), + erasure_root: make_erasure_root(&test_state, pov.clone(), pvd.clone()), + persisted_validation_data_hash: pvd.hash(), + validation_code: validation_code.0.clone(), + } + .build(); + let candidate_commitments_hash = candidate.commitments.hash(); + + let public2 = Keystore::sr25519_generate_new( + &*test_state.keystore, + ValidatorId::ID, + Some(&test_state.validators[2].to_seed()), + ) + .expect("Insert key into keystore"); + + let signed_2 = SignedFullStatementWithPVD::sign( + &test_state.keystore, + StatementWithPVD::Seconded(candidate.clone(), pvd.clone()), + &test_state.signing_context, + ValidatorIndex(2), + &public2.into(), + ) + .ok() + .flatten() + .expect("should be signed"); + + let statement_2 = + CandidateBackingMessage::Statement(test_state.relay_parent, signed_2.clone()); + + virtual_overseer.send(FromOrchestra::Communication { msg: statement_2 }).await; + + // Ensure backing subsystem is not doing any work + assert_matches!(virtual_overseer.recv().timeout(Duration::from_secs(1)).await, None); + + // Now send a statement from a honest validator and make sure it gets processed + let public3 = Keystore::sr25519_generate_new( + &*test_state.keystore, + ValidatorId::ID, + Some(&test_state.validators[3].to_seed()), + ) + .expect("Insert key into keystore"); + + let signed_3 = SignedFullStatementWithPVD::sign( + &test_state.keystore, + StatementWithPVD::Seconded(candidate.clone(), pvd.clone()), + &test_state.signing_context, + ValidatorIndex(3), + &public3.into(), + ) + .ok() + .flatten() + .expect("should be signed"); + + let statement_3 = + CandidateBackingMessage::Statement(test_state.relay_parent, signed_3.clone()); + + virtual_overseer.send(FromOrchestra::Communication { msg: statement_3 }).await; + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(_, RuntimeApiRequest::ValidationCodeByHash(hash, tx)) + ) if hash == validation_code.hash() => { + tx.send(Ok(Some(validation_code.clone()))).unwrap(); + } + ); + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(_, RuntimeApiRequest::SessionIndexForChild(tx)) + ) => { + tx.send(Ok(1u32.into())).unwrap(); + } + ); + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(_, RuntimeApiRequest::SessionExecutorParams(sess_idx, tx)) + ) if sess_idx == 1 => { + tx.send(Ok(Some(ExecutorParams::default()))).unwrap(); + } + ); + + // Sending a `Statement::Seconded` for our assignment will start + // validation process. The first thing requested is the PoV. + assert_matches!( + virtual_overseer.recv().await, + AllMessages::AvailabilityDistribution( + AvailabilityDistributionMessage::FetchPoV { + relay_parent, + tx, + .. + } + ) if relay_parent == test_state.relay_parent => { + tx.send(pov.clone()).unwrap(); + } + ); + + // The next step is the actual request to Validation subsystem + // to validate the `Seconded` candidate. + let expected_pov = pov; + let expected_validation_code = validation_code; + assert_matches!( + virtual_overseer.recv().await, + AllMessages::CandidateValidation( + CandidateValidationMessage::ValidateFromExhaustive { + validation_data, + validation_code, + candidate_receipt, + pov, + executor_params: _, + exec_kind, + response_sender, + } + ) if validation_data == pvd && + validation_code == expected_validation_code && + *pov == expected_pov && &candidate_receipt.descriptor == candidate.descriptor() && + exec_kind == PvfExecKind::Backing && + candidate_commitments_hash == candidate_receipt.commitments_hash => + { + response_sender.send(Ok( + ValidationResult::Valid(CandidateCommitments { + head_data: expected_head_data.clone(), + upward_messages: Default::default(), + horizontal_messages: Default::default(), + new_validation_code: None, + processed_downward_messages: 0, + hrmp_watermark: 0, + }, test_state.validation_data.clone()), + )).unwrap(); + } + ); + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::AvailabilityStore( + AvailabilityStoreMessage::StoreAvailableData { candidate_hash, tx, .. } + ) if candidate_hash == candidate.hash() => { + tx.send(Ok(())).unwrap(); + } + ); + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::StatementDistribution( + StatementDistributionMessage::Share(hash, _stmt) + ) => { + assert_eq!(test_state.relay_parent, hash); + } + ); + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::Provisioner( + ProvisionerMessage::ProvisionableData( + _, + ProvisionableData::BackedCandidate(candidate_receipt) + ) + ) => { + assert_eq!(candidate_receipt, candidate.to_plain()); + } + ); + + virtual_overseer + .send(FromOrchestra::Signal(OverseerSignal::ActiveLeaves( + ActiveLeavesUpdate::stop_work(test_state.relay_parent), + ))) + .await; + virtual_overseer + }); +} diff --git a/polkadot/node/core/backing/src/tests/prospective_parachains.rs b/polkadot/node/core/backing/src/tests/prospective_parachains.rs index e7c29e11bb4..578f21bef66 100644 --- a/polkadot/node/core/backing/src/tests/prospective_parachains.rs +++ b/polkadot/node/core/backing/src/tests/prospective_parachains.rs @@ -195,6 +195,26 @@ async fn activate_leaf( tx.send(Ok(test_state.minimum_backing_votes)).unwrap(); } ); + + // Check that subsystem job issues a request for the runtime version. + assert_matches!( + virtual_overseer.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(parent, RuntimeApiRequest::Version(tx)) + ) if parent == hash => { + tx.send(Ok(RuntimeApiRequest::DISABLED_VALIDATORS_RUNTIME_REQUIREMENT)).unwrap(); + } + ); + + // Check that the subsystem job issues a request for the disabled validators. + assert_matches!( + virtual_overseer.recv().await, + AllMessages::RuntimeApi( + RuntimeApiMessage::Request(parent, RuntimeApiRequest::DisabledValidators(tx)) + ) if parent == hash => { + tx.send(Ok(Vec::new())).unwrap(); + } + ); } } diff --git a/polkadot/node/core/provisioner/src/lib.rs b/polkadot/node/core/provisioner/src/lib.rs index 8893bdc6549..3970b857261 100644 --- a/polkadot/node/core/provisioner/src/lib.rs +++ b/polkadot/node/core/provisioner/src/lib.rs @@ -29,13 +29,13 @@ use polkadot_node_subsystem::{ jaeger, messages::{ CandidateBackingMessage, ChainApiMessage, ProspectiveParachainsMessage, ProvisionableData, - ProvisionerInherentData, ProvisionerMessage, RuntimeApiMessage, RuntimeApiRequest, + ProvisionerInherentData, ProvisionerMessage, RuntimeApiRequest, }, overseer, ActivatedLeaf, ActiveLeavesUpdate, FromOrchestra, OverseerSignal, PerLeafSpan, - RuntimeApiError, SpawnedSubsystem, SubsystemError, + SpawnedSubsystem, SubsystemError, }; use polkadot_node_subsystem_util::{ - request_availability_cores, request_persisted_validation_data, + has_required_runtime, request_availability_cores, request_persisted_validation_data, runtime::{prospective_parachains_mode, ProspectiveParachainsMode}, TimeoutExt, }; @@ -856,56 +856,3 @@ fn bitfields_indicate_availability( 3 * availability.count_ones() >= 2 * availability.len() } - -// If we have to be absolutely precise here, this method gets the version of the `ParachainHost` -// api. For brevity we'll just call it 'runtime version'. -async fn has_required_runtime( - sender: &mut impl overseer::ProvisionerSenderTrait, - relay_parent: Hash, - required_runtime_version: u32, -) -> bool { - gum::trace!(target: LOG_TARGET, ?relay_parent, "Fetching ParachainHost runtime api version"); - - let (tx, rx) = oneshot::channel(); - sender - .send_message(RuntimeApiMessage::Request(relay_parent, RuntimeApiRequest::Version(tx))) - .await; - - match rx.await { - Result::Ok(Ok(runtime_version)) => { - gum::trace!( - target: LOG_TARGET, - ?relay_parent, - ?runtime_version, - ?required_runtime_version, - "Fetched ParachainHost runtime api version" - ); - runtime_version >= required_runtime_version - }, - Result::Ok(Err(RuntimeApiError::Execution { source: error, .. })) => { - gum::trace!( - target: LOG_TARGET, - ?relay_parent, - ?error, - "Execution error while fetching ParachainHost runtime api version" - ); - false - }, - Result::Ok(Err(RuntimeApiError::NotSupported { .. })) => { - gum::trace!( - target: LOG_TARGET, - ?relay_parent, - "NotSupported error while fetching ParachainHost runtime api version" - ); - false - }, - Result::Err(_) => { - gum::trace!( - target: LOG_TARGET, - ?relay_parent, - "Cancelled error while fetching ParachainHost runtime api version" - ); - false - }, - } -} diff --git a/polkadot/node/subsystem-util/src/lib.rs b/polkadot/node/subsystem-util/src/lib.rs index a5f3e9d4a0c..1fe52767df6 100644 --- a/polkadot/node/subsystem-util/src/lib.rs +++ b/polkadot/node/subsystem-util/src/lib.rs @@ -55,6 +55,7 @@ use sp_core::ByteArray; use sp_keystore::{Error as KeystoreError, KeystorePtr}; use std::time::Duration; use thiserror::Error; +use vstaging::get_disabled_validators_with_fallback; pub use metered; pub use polkadot_node_network_protocol::MIN_GOSSIP_PEERS; @@ -79,6 +80,9 @@ pub mod inclusion_emulator; /// Convenient and efficient runtime info access. pub mod runtime; +/// Helpers for working with unreleased runtime calls +pub mod vstaging; + /// Nested message sending /// /// Useful for having mostly synchronous code, with submodules spawning short lived asynchronous @@ -92,6 +96,8 @@ mod determine_new_blocks; #[cfg(test)] mod tests; +const LOG_TARGET: &'static str = "parachain::subsystem-util"; + /// Duration a job will wait after sending a stop signal before hard-aborting. pub const JOB_GRACEFUL_STOP_DURATION: Duration = Duration::from_secs(1); /// Capacity of channels to and from individual jobs @@ -157,6 +163,62 @@ where rx } +/// Verifies if `ParachainHost` runtime api is at least at version `required_runtime_version`. This +/// method is used to determine if a given runtime call is supported by the runtime. +pub async fn has_required_runtime( + sender: &mut Sender, + relay_parent: Hash, + required_runtime_version: u32, +) -> bool +where + Sender: SubsystemSender, +{ + gum::trace!(target: LOG_TARGET, ?relay_parent, "Fetching ParachainHost runtime api version"); + + let (tx, rx) = oneshot::channel(); + sender + .send_message(RuntimeApiMessage::Request(relay_parent, RuntimeApiRequest::Version(tx))) + .await; + + match rx.await { + Result::Ok(Ok(runtime_version)) => { + gum::trace!( + target: LOG_TARGET, + ?relay_parent, + ?runtime_version, + ?required_runtime_version, + "Fetched ParachainHost runtime api version" + ); + runtime_version >= required_runtime_version + }, + Result::Ok(Err(RuntimeApiError::Execution { source: error, .. })) => { + gum::trace!( + target: LOG_TARGET, + ?relay_parent, + ?error, + "Execution error while fetching ParachainHost runtime api version" + ); + false + }, + Result::Ok(Err(RuntimeApiError::NotSupported { .. })) => { + gum::trace!( + target: LOG_TARGET, + ?relay_parent, + "NotSupported error while fetching ParachainHost runtime api version" + ); + false + }, + Result::Err(_) => { + gum::trace!( + target: LOG_TARGET, + ?relay_parent, + "Cancelled error while fetching ParachainHost runtime api version" + ); + false + }, + } +} + /// Construct specialized request functions for the runtime. /// /// These would otherwise get pretty repetitive. @@ -378,6 +440,7 @@ pub struct Validator { signing_context: SigningContext, key: ValidatorId, index: ValidatorIndex, + disabled: bool, } impl Validator { @@ -399,7 +462,12 @@ impl Validator { let validators = validators?; - Self::construct(&validators, signing_context, keystore) + // TODO: https://github.com/paritytech/polkadot-sdk/issues/1940 + // When `DisabledValidators` is released remove this and add a + // `request_disabled_validators` call here + let disabled_validators = get_disabled_validators_with_fallback(sender, parent).await?; + + Self::construct(&validators, &disabled_validators, signing_context, keystore) } /// Construct a validator instance without performing runtime fetches. @@ -407,13 +475,16 @@ impl Validator { /// This can be useful if external code also needs the same data. pub fn construct( validators: &[ValidatorId], + disabled_validators: &[ValidatorIndex], signing_context: SigningContext, keystore: KeystorePtr, ) -> Result { let (key, index) = signing_key_and_index(validators, &keystore).ok_or(Error::NotAValidator)?; - Ok(Validator { signing_context, key, index }) + let disabled = disabled_validators.iter().any(|d: &ValidatorIndex| *d == index); + + Ok(Validator { signing_context, key, index, disabled }) } /// Get this validator's id. @@ -426,6 +497,11 @@ impl Validator { self.index } + /// Get the enabled/disabled state of this validator + pub fn disabled(&self) -> bool { + self.disabled + } + /// Get the current signing context. pub fn signing_context(&self) -> &SigningContext { &self.signing_context diff --git a/polkadot/node/subsystem-util/src/vstaging.rs b/polkadot/node/subsystem-util/src/vstaging.rs new file mode 100644 index 00000000000..3efd3b61f93 --- /dev/null +++ b/polkadot/node/subsystem-util/src/vstaging.rs @@ -0,0 +1,56 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Contains helpers for staging runtime calls. +//! +//! This module is intended to contain common boiler plate code handling unreleased runtime API +//! calls. + +use polkadot_node_subsystem_types::messages::{RuntimeApiMessage, RuntimeApiRequest}; +use polkadot_overseer::SubsystemSender; +use polkadot_primitives::{Hash, ValidatorIndex}; + +use crate::{has_required_runtime, request_disabled_validators, Error}; + +const LOG_TARGET: &'static str = "parachain::subsystem-util-vstaging"; + +// TODO: https://github.com/paritytech/polkadot-sdk/issues/1940 +/// Returns disabled validators list if the runtime supports it. Otherwise logs a debug messages and +/// returns an empty vec. +/// Once runtime ver `DISABLED_VALIDATORS_RUNTIME_REQUIREMENT` is released remove this function and +/// replace all usages with `request_disabled_validators` +pub async fn get_disabled_validators_with_fallback>( + sender: &mut Sender, + relay_parent: Hash, +) -> Result, Error> { + let disabled_validators = if has_required_runtime( + sender, + relay_parent, + RuntimeApiRequest::DISABLED_VALIDATORS_RUNTIME_REQUIREMENT, + ) + .await + { + request_disabled_validators(relay_parent, sender) + .await + .await + .map_err(Error::Oneshot)?? + } else { + gum::debug!(target: LOG_TARGET, "Runtime doesn't support `DisabledValidators` - continuing with an empty disabled validators set"); + vec![] + }; + + Ok(disabled_validators) +} diff --git a/prdoc/pr_2764.prdoc b/prdoc/pr_2764.prdoc new file mode 100644 index 00000000000..adfa4f47c93 --- /dev/null +++ b/prdoc/pr_2764.prdoc @@ -0,0 +1,16 @@ +title: Validator disabling in Backing. + +doc: + - audience: Node Operator + description: | + Once a validator has been disabled for misbehavior, it will no longer + sign backing statements in the current era. + +migrations: + db: [] + runtime: [] + +crates: + - name: polkadot-node-core-backing + +host_functions: [] -- GitLab From 0ff3f4d3af0036bbae624011b720bfd5e93ce91b Mon Sep 17 00:00:00 2001 From: ordian Date: Tue, 9 Jan 2024 07:44:19 +0100 Subject: [PATCH 129/191] dispute-coordinator: disabling in participation (#2637) Closes #2225. - [x] tests - [x] fix todos - [x] fix duplicates - [x] make the check part of `potential_spam` - [x] fix a bug with votes insertion - [x] guide changes - [x] docs --------- Co-authored-by: Tsvetomir Dimitrov --- polkadot/node/core/backing/src/lib.rs | 7 +- .../core/dispute-coordinator/src/import.rs | 27 +- .../dispute-coordinator/src/initialized.rs | 155 ++- .../node/core/dispute-coordinator/src/lib.rs | 15 +- .../src/participation/tests.rs | 1 - .../core/dispute-coordinator/src/tests.rs | 987 +++++++++++++++--- polkadot/node/subsystem-util/src/lib.rs | 18 +- .../node/subsystem-util/src/runtime/mod.rs | 28 +- polkadot/node/subsystem-util/src/vstaging.rs | 6 +- polkadot/primitives/src/v6/mod.rs | 21 +- .../src/node/disputes/dispute-coordinator.md | 22 + prdoc/pr_2637.prdoc | 18 + 12 files changed, 1135 insertions(+), 170 deletions(-) create mode 100644 prdoc/pr_2637.prdoc diff --git a/polkadot/node/core/backing/src/lib.rs b/polkadot/node/core/backing/src/lib.rs index ba25ebb192e..98bbd6232ad 100644 --- a/polkadot/node/core/backing/src/lib.rs +++ b/polkadot/node/core/backing/src/lib.rs @@ -1030,9 +1030,10 @@ async fn construct_per_relay_parent_state( // Once runtime ver `DISABLED_VALIDATORS_RUNTIME_REQUIREMENT` is released remove this call to // `get_disabled_validators_with_fallback`, add `request_disabled_validators` call to the // `try_join!` above and use `try_runtime_api!` to get `disabled_validators` - let disabled_validators = get_disabled_validators_with_fallback(ctx.sender(), parent) - .await - .map_err(Error::UtilError)?; + let disabled_validators = + get_disabled_validators_with_fallback(ctx.sender(), parent).await.map_err(|e| { + Error::UtilError(TryFrom::try_from(e).expect("the conversion is infallible; qed")) + })?; let signing_context = SigningContext { parent_hash: parent, session_index }; let validator = match Validator::construct( diff --git a/polkadot/node/core/dispute-coordinator/src/import.rs b/polkadot/node/core/dispute-coordinator/src/import.rs index 98c12bd509b..278561d5d00 100644 --- a/polkadot/node/core/dispute-coordinator/src/import.rs +++ b/polkadot/node/core/dispute-coordinator/src/import.rs @@ -52,6 +52,8 @@ pub struct CandidateEnvironment<'a> { executor_params: &'a ExecutorParams, /// Validator indices controlled by this node. controlled_indices: HashSet, + /// Indices of disabled validators at the `relay_parent`. + disabled_indices: HashSet, } #[overseer::contextbounds(DisputeCoordinator, prefix = self::overseer)] @@ -66,6 +68,16 @@ impl<'a> CandidateEnvironment<'a> { session_index: SessionIndex, relay_parent: Hash, ) -> Option> { + let disabled_indices = runtime_info + .get_disabled_validators(ctx.sender(), relay_parent) + .await + .unwrap_or_else(|err| { + gum::info!(target: LOG_TARGET, ?err, "Failed to get disabled validators"); + Vec::new() + }) + .into_iter() + .collect(); + let (session, executor_params) = match runtime_info .get_session_info_by_index(ctx.sender(), relay_parent, session_index) .await @@ -76,7 +88,7 @@ impl<'a> CandidateEnvironment<'a> { }; let controlled_indices = find_controlled_validator_indices(keystore, &session.validators); - Some(Self { session_index, session, executor_params, controlled_indices }) + Some(Self { session_index, session, executor_params, controlled_indices, disabled_indices }) } /// Validators in the candidate's session. @@ -103,6 +115,11 @@ impl<'a> CandidateEnvironment<'a> { pub fn controlled_indices(&'a self) -> &'a HashSet { &self.controlled_indices } + + /// Indices of disabled validators at the `relay_parent`. + pub fn disabled_indices(&'a self) -> &'a HashSet { + &self.disabled_indices + } } /// Whether or not we already issued some statement about a candidate. @@ -344,6 +361,14 @@ impl CandidateVoteState { &self.votes.candidate_receipt } + /// Returns true if all the invalid votes are from disabled validators. + pub fn invalid_votes_all_disabled( + &self, + mut is_disabled: impl FnMut(&ValidatorIndex) -> bool, + ) -> bool { + self.votes.invalid.keys().all(|i| is_disabled(i)) + } + /// Extract `CandidateVotes` for handling import of new statements. fn into_old_state(self) -> (CandidateVotes, CandidateVoteState<()>) { let CandidateVoteState { votes, own_vote, dispute_status, byzantine_threshold_against } = diff --git a/polkadot/node/core/dispute-coordinator/src/initialized.rs b/polkadot/node/core/dispute-coordinator/src/initialized.rs index d9cd4e39d3c..a1bcc1f0170 100644 --- a/polkadot/node/core/dispute-coordinator/src/initialized.rs +++ b/polkadot/node/core/dispute-coordinator/src/initialized.rs @@ -17,7 +17,7 @@ //! Dispute coordinator subsystem in initialized state (after first active leaf is received). use std::{ - collections::{BTreeMap, VecDeque}, + collections::{BTreeMap, HashSet, VecDeque}, sync::Arc, }; @@ -47,6 +47,7 @@ use polkadot_primitives::{ DisputeStatementSet, Hash, ScrapedOnChainVotes, SessionIndex, ValidDisputeStatementKind, ValidatorId, ValidatorIndex, }; +use schnellru::{LruMap, UnlimitedCompact}; use crate::{ db, @@ -92,6 +93,9 @@ pub struct InitialData { pub(crate) struct Initialized { keystore: Arc, runtime_info: RuntimeInfo, + /// We have the onchain state of disabled validators as well as the offchain + /// state that is based on the lost disputes. + offchain_disabled_validators: OffchainDisabledValidators, /// This is the highest `SessionIndex` seen via `ActiveLeavesUpdate`. It doesn't matter if it /// was cached successfully or not. It is used to detect ancient disputes. highest_session_seen: SessionIndex, @@ -130,10 +134,12 @@ impl Initialized { let (participation_sender, participation_receiver) = mpsc::channel(1); let participation = Participation::new(participation_sender, metrics.clone()); + let offchain_disabled_validators = OffchainDisabledValidators::default(); Self { keystore, runtime_info, + offchain_disabled_validators, highest_session_seen, gaps_in_cache, spam_slots, @@ -319,13 +325,16 @@ impl Initialized { self.runtime_info.pin_block(session_idx, new_leaf.unpin_handle); // Fetch the last `DISPUTE_WINDOW` number of sessions unless there are no gaps // in cache and we are not missing too many `SessionInfo`s - let mut lower_bound = session_idx.saturating_sub(DISPUTE_WINDOW.get() - 1); - if !self.gaps_in_cache && self.highest_session_seen > lower_bound { - lower_bound = self.highest_session_seen + 1 - } + let prune_up_to = session_idx.saturating_sub(DISPUTE_WINDOW.get() - 1); + let fetch_lower_bound = + if !self.gaps_in_cache && self.highest_session_seen > prune_up_to { + self.highest_session_seen + 1 + } else { + prune_up_to + }; // There is a new session. Perform a dummy fetch to cache it. - for idx in lower_bound..=session_idx { + for idx in fetch_lower_bound..=session_idx { if let Err(err) = self .runtime_info .get_session_info_by_index(ctx.sender(), new_leaf.hash, idx) @@ -344,11 +353,9 @@ impl Initialized { self.highest_session_seen = session_idx; - db::v1::note_earliest_session( - overlay_db, - session_idx.saturating_sub(DISPUTE_WINDOW.get() - 1), - )?; - self.spam_slots.prune_old(session_idx.saturating_sub(DISPUTE_WINDOW.get() - 1)); + db::v1::note_earliest_session(overlay_db, prune_up_to)?; + self.spam_slots.prune_old(prune_up_to); + self.offchain_disabled_validators.prune_old(prune_up_to); }, Ok(_) => { /* no new session => nothing to cache */ }, Err(err) => { @@ -978,11 +985,13 @@ impl Initialized { Some(env) => env, }; + let n_validators = env.validators().len(); + gum::trace!( target: LOG_TARGET, ?candidate_hash, ?session, - num_validators = ?env.session_info().validators.len(), + ?n_validators, "Number of validators" ); @@ -1084,18 +1093,42 @@ impl Initialized { target: LOG_TARGET, ?candidate_hash, ?session, - num_validators = ?env.session_info().validators.len(), + ?n_validators, "Import result ready" ); + let new_state = import_result.new_state(); + let byzantine_threshold = polkadot_primitives::byzantine_threshold(n_validators); + // combine on-chain with off-chain disabled validators + // process disabled validators in the following order: + // - on-chain disabled validators + // - prioritized order of off-chain disabled validators + // deduplicate the list and take at most `byzantine_threshold` validators + let disabled_validators = { + let mut d: HashSet = HashSet::new(); + for v in env + .disabled_indices() + .iter() + .cloned() + .chain(self.offchain_disabled_validators.iter(session)) + { + if d.len() == byzantine_threshold { + break + } + d.insert(v); + } + d + }; + let is_included = self.scraper.is_candidate_included(&candidate_hash); let is_backed = self.scraper.is_candidate_backed(&candidate_hash); let own_vote_missing = new_state.own_vote_missing(); let is_disputed = new_state.is_disputed(); let is_confirmed = new_state.is_confirmed(); - let potential_spam = is_potential_spam(&self.scraper, &new_state, &candidate_hash); - // We participate only in disputes which are not potential spam. + let potential_spam = is_potential_spam(&self.scraper, &new_state, &candidate_hash, |v| { + disabled_validators.contains(v) + }); let allow_participation = !potential_spam; gum::trace!( @@ -1106,6 +1139,7 @@ impl Initialized { ?candidate_hash, confirmed = ?new_state.is_confirmed(), has_invalid_voters = ?!import_result.new_invalid_voters().is_empty(), + n_disabled_validators = ?disabled_validators.len(), "Is spam?" ); @@ -1337,6 +1371,10 @@ impl Initialized { ); } } + for validator_index in new_state.votes().invalid.keys() { + self.offchain_disabled_validators + .insert_against_valid(session, *validator_index); + } self.metrics.on_concluded_valid(); } if import_result.is_freshly_concluded_against() { @@ -1356,6 +1394,14 @@ impl Initialized { ); } } + for (validator_index, (kind, _sig)) in new_state.votes().valid.raw() { + let is_backer = kind.is_backing(); + self.offchain_disabled_validators.insert_for_invalid( + session, + *validator_index, + is_backer, + ); + } self.metrics.on_concluded_invalid(); } @@ -1591,3 +1637,82 @@ fn determine_undisputed_chain( Ok(last) } + +#[derive(Default)] +struct OffchainDisabledValidators { + // Ideally, we want to use the top `byzantine_threshold` offenders here based on the amount of + // stake slashed. However, given that slashing might be applied with a delay, we want to have + // some list of offenders as soon as disputes conclude offchain. This list only approximates + // the top offenders and only accounts for lost disputes. But that should be good enough to + // prevent spam attacks. + per_session: BTreeMap, +} + +struct LostSessionDisputes { + // We separate lost disputes to prioritize "for invalid" offenders. And among those, we + // prioritize backing votes the most. There's no need to limit the size of these sets, as they + // are already limited by the number of validators in the session. We use `LruMap` to ensure + // the iteration order prioritizes most recently disputes lost over older ones in case we reach + // the limit. + backers_for_invalid: LruMap, + for_invalid: LruMap, + against_valid: LruMap, +} + +impl Default for LostSessionDisputes { + fn default() -> Self { + Self { + backers_for_invalid: LruMap::new(UnlimitedCompact), + for_invalid: LruMap::new(UnlimitedCompact), + against_valid: LruMap::new(UnlimitedCompact), + } + } +} + +impl OffchainDisabledValidators { + fn prune_old(&mut self, up_to_excluding: SessionIndex) { + // split_off returns everything after the given key, including the key. + let mut relevant = self.per_session.split_off(&up_to_excluding); + std::mem::swap(&mut relevant, &mut self.per_session); + } + + fn insert_for_invalid( + &mut self, + session_index: SessionIndex, + validator_index: ValidatorIndex, + is_backer: bool, + ) { + let entry = self.per_session.entry(session_index).or_default(); + if is_backer { + entry.backers_for_invalid.insert(validator_index, ()); + } else { + entry.for_invalid.insert(validator_index, ()); + } + } + + fn insert_against_valid( + &mut self, + session_index: SessionIndex, + validator_index: ValidatorIndex, + ) { + self.per_session + .entry(session_index) + .or_default() + .against_valid + .insert(validator_index, ()); + } + + /// Iterate over all validators that are offchain disabled. + /// The order of iteration prioritizes `for_invalid` offenders (and backers among those) over + /// `against_valid` offenders. And most recently lost disputes over older ones. + /// NOTE: the iterator might contain duplicates. + fn iter(&self, session_index: SessionIndex) -> impl Iterator + '_ { + self.per_session.get(&session_index).into_iter().flat_map(|e| { + e.backers_for_invalid + .iter() + .chain(e.for_invalid.iter()) + .chain(e.against_valid.iter()) + .map(|(i, _)| *i) + }) + } +} diff --git a/polkadot/node/core/dispute-coordinator/src/lib.rs b/polkadot/node/core/dispute-coordinator/src/lib.rs index 5067d3673da..c3038fc0953 100644 --- a/polkadot/node/core/dispute-coordinator/src/lib.rs +++ b/polkadot/node/core/dispute-coordinator/src/lib.rs @@ -370,8 +370,10 @@ impl DisputeCoordinatorSubsystem { }, }; let vote_state = CandidateVoteState::new(votes, &env, now); - - let potential_spam = is_potential_spam(&scraper, &vote_state, candidate_hash); + let onchain_disabled = env.disabled_indices(); + let potential_spam = is_potential_spam(&scraper, &vote_state, candidate_hash, |v| { + onchain_disabled.contains(v) + }); let is_included = scraper.is_candidate_included(&vote_state.votes().candidate_receipt.hash()); @@ -462,17 +464,20 @@ async fn wait_for_first_leaf(ctx: &mut Context) -> Result( +pub fn is_potential_spam( scraper: &ChainScraper, - vote_state: &CandidateVoteState, + vote_state: &CandidateVoteState, candidate_hash: &CandidateHash, + is_disabled: impl FnMut(&ValidatorIndex) -> bool, ) -> bool { let is_disputed = vote_state.is_disputed(); let is_included = scraper.is_candidate_included(candidate_hash); let is_backed = scraper.is_candidate_backed(candidate_hash); let is_confirmed = vote_state.is_confirmed(); + let all_invalid_votes_disabled = vote_state.invalid_votes_all_disabled(is_disabled); + let ignore_disabled = !is_confirmed && all_invalid_votes_disabled; - is_disputed && !is_included && !is_backed && !is_confirmed + (is_disputed && !is_included && !is_backed && !is_confirmed) || ignore_disabled } /// Tell dispute-distribution to send all our votes. diff --git a/polkadot/node/core/dispute-coordinator/src/participation/tests.rs b/polkadot/node/core/dispute-coordinator/src/participation/tests.rs index 012df51d0cd..367454115f0 100644 --- a/polkadot/node/core/dispute-coordinator/src/participation/tests.rs +++ b/polkadot/node/core/dispute-coordinator/src/participation/tests.rs @@ -372,7 +372,6 @@ fn cannot_participate_if_cannot_recover_validation_code() { let mut participation = Participation::new(sender, Metrics::default()); activate_leaf(&mut ctx, &mut participation, 10).await.unwrap(); participate(&mut ctx, &mut participation).await.unwrap(); - recover_available_data(&mut ctx_handle).await; assert_matches!( diff --git a/polkadot/node/core/dispute-coordinator/src/tests.rs b/polkadot/node/core/dispute-coordinator/src/tests.rs index da449773fe8..af384256c4f 100644 --- a/polkadot/node/core/dispute-coordinator/src/tests.rs +++ b/polkadot/node/core/dispute-coordinator/src/tests.rs @@ -257,7 +257,7 @@ impl TestState { session: SessionIndex, block_number: BlockNumber, candidate_events: Vec, - ) { + ) -> Hash { assert!(block_number > 0); let block_header = Header { @@ -282,6 +282,8 @@ impl TestState { self.handle_sync_queries(virtual_overseer, block_hash, session, candidate_events) .await; + + block_hash } /// Returns any sent `DisputeMessage`s. @@ -406,6 +408,19 @@ impl TestState { )) => { tx.send(Ok(Vec::new())).unwrap(); }, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + _new_leaf, + RuntimeApiRequest::Version(tx), + )) => { + tx.send(Ok(RuntimeApiRequest::DISABLED_VALIDATORS_RUNTIME_REQUIREMENT)) + .unwrap(); + }, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + _new_leaf, + RuntimeApiRequest::DisabledValidators(tx), + )) => { + tx.send(Ok(Vec::new())).unwrap(); + }, AllMessages::ChainApi(ChainApiMessage::Ancestors { hash, k, response_channel }) => { let target_header = self .headers @@ -628,15 +643,19 @@ async fn participation_with_distribution( } fn make_valid_candidate_receipt() -> CandidateReceipt { - let mut candidate_receipt = dummy_candidate_receipt_bad_sig(dummy_hash(), dummy_hash()); - candidate_receipt.commitments_hash = CandidateCommitments::default().hash(); - candidate_receipt + make_another_valid_candidate_receipt(dummy_hash()) } fn make_invalid_candidate_receipt() -> CandidateReceipt { dummy_candidate_receipt_bad_sig(Default::default(), Some(Default::default())) } +fn make_another_valid_candidate_receipt(relay_parent: Hash) -> CandidateReceipt { + let mut candidate_receipt = dummy_candidate_receipt_bad_sig(relay_parent, dummy_hash()); + candidate_receipt.commitments_hash = CandidateCommitments::default().hash(); + candidate_receipt +} + // Generate a `CandidateBacked` event from a `CandidateReceipt`. The rest is dummy data. fn make_candidate_backed_event(candidate_receipt: CandidateReceipt) -> CandidateEvent { CandidateEvent::CandidateBacked( @@ -740,6 +759,7 @@ fn too_many_unconfirmed_statements_are_considered_spam() { .await; gum::trace!("After sending `ImportStatements`"); + handle_disabled_validators_queries(&mut virtual_overseer, Vec::new()).await; handle_approval_vote_request(&mut virtual_overseer, &candidate_hash1, HashMap::new()) .await; @@ -875,6 +895,7 @@ fn approval_vote_import_works() { .into_iter() .collect(); + handle_disabled_validators_queries(&mut virtual_overseer, Vec::new()).await; handle_approval_vote_request(&mut virtual_overseer, &candidate_hash1, approval_votes) .await; @@ -982,6 +1003,7 @@ fn dispute_gets_confirmed_via_participation() { }) .await; gum::debug!("After First import!"); + handle_disabled_validators_queries(&mut virtual_overseer, Vec::new()).await; handle_approval_vote_request(&mut virtual_overseer, &candidate_hash1, HashMap::new()) .await; @@ -1131,6 +1153,7 @@ fn dispute_gets_confirmed_at_byzantine_threshold() { }, }) .await; + handle_disabled_validators_queries(&mut virtual_overseer, Vec::new()).await; handle_approval_vote_request(&mut virtual_overseer, &candidate_hash1, HashMap::new()) .await; @@ -1255,6 +1278,7 @@ fn backing_statements_import_works_and_no_spam() { }, }) .await; + handle_disabled_validators_queries(&mut virtual_overseer, Vec::new()).await; assert_matches!(confirmation_rx.await, Ok(ImportStatementsResult::ValidImport)); { @@ -1387,6 +1411,7 @@ fn conflicting_votes_lead_to_dispute_participation() { }, }) .await; + handle_disabled_validators_queries(&mut virtual_overseer, Vec::new()).await; handle_approval_vote_request(&mut virtual_overseer, &candidate_hash, HashMap::new()) .await; @@ -1506,6 +1531,7 @@ fn positive_votes_dont_trigger_participation() { }, }) .await; + handle_disabled_validators_queries(&mut virtual_overseer, Vec::new()).await; { let (tx, rx) = oneshot::channel(); @@ -1616,6 +1642,7 @@ fn wrong_validator_index_is_ignored() { }, }) .await; + handle_disabled_validators_queries(&mut virtual_overseer, Vec::new()).await; { let (tx, rx) = oneshot::channel(); @@ -1693,6 +1720,7 @@ fn finality_votes_ignore_disputed_candidates() { }, }) .await; + handle_disabled_validators_queries(&mut virtual_overseer, Vec::new()).await; handle_approval_vote_request(&mut virtual_overseer, &candidate_hash, HashMap::new()) .await; @@ -1769,14 +1797,10 @@ fn supermajority_valid_dispute_may_be_finalized() { let candidate_receipt = make_valid_candidate_receipt(); let candidate_hash = candidate_receipt.hash(); + let candidate_events = vec![make_candidate_backed_event(candidate_receipt.clone())]; test_state - .activate_leaf_at_session( - &mut virtual_overseer, - session, - 1, - vec![make_candidate_backed_event(candidate_receipt.clone())], - ) + .activate_leaf_at_session(&mut virtual_overseer, session, 1, candidate_events) .await; let supermajority_threshold = @@ -1805,6 +1829,7 @@ fn supermajority_valid_dispute_may_be_finalized() { }, }) .await; + handle_disabled_validators_queries(&mut virtual_overseer, Vec::new()).await; handle_approval_vote_request(&mut virtual_overseer, &candidate_hash, HashMap::new()) .await; @@ -1942,6 +1967,7 @@ fn concluded_supermajority_for_non_active_after_time() { }, }) .await; + handle_disabled_validators_queries(&mut virtual_overseer, Vec::new()).await; handle_approval_vote_request(&mut virtual_overseer, &candidate_hash, HashMap::new()) .await; @@ -2058,6 +2084,7 @@ fn concluded_supermajority_against_non_active_after_time() { }, }) .await; + handle_disabled_validators_queries(&mut virtual_overseer, Vec::new()).await; handle_approval_vote_request(&mut virtual_overseer, &candidate_hash, HashMap::new()) .await; assert_matches!(confirmation_rx.await.unwrap(), @@ -2173,6 +2200,7 @@ fn resume_dispute_without_local_statement() { }, }) .await; + handle_disabled_validators_queries(&mut virtual_overseer, Vec::new()).await; handle_approval_vote_request(&mut virtual_overseer, &candidate_hash, HashMap::new()) .await; @@ -2217,13 +2245,23 @@ fn resume_dispute_without_local_statement() { let candidate_receipt = make_valid_candidate_receipt(); let candidate_hash = candidate_receipt.hash(); - participation_with_distribution( + participation_full_happy_path( &mut virtual_overseer, - &candidate_hash, candidate_receipt.commitments_hash, ) .await; + handle_disabled_validators_queries(&mut virtual_overseer, Vec::new()).await; + + assert_matches!( + virtual_overseer.recv().await, + AllMessages::DisputeDistribution( + DisputeDistributionMessage::SendDispute(msg) + ) => { + assert_eq!(msg.candidate_receipt().hash(), candidate_hash); + } + ); + let mut statements = Vec::new(); // Getting votes for supermajority. Should already have two valid votes. for i in vec![3, 4, 5, 6, 7] { @@ -2328,6 +2366,7 @@ fn resume_dispute_with_local_statement() { }) .await; + handle_disabled_validators_queries(&mut virtual_overseer, Vec::new()).await; handle_approval_vote_request(&mut virtual_overseer, &candidate_hash, HashMap::new()) .await; @@ -2425,6 +2464,7 @@ fn resume_dispute_without_local_statement_or_local_key() { }, }) .await; + handle_disabled_validators_queries(&mut virtual_overseer, Vec::new()).await; handle_approval_vote_request( &mut virtual_overseer, &candidate_hash, @@ -2516,6 +2556,7 @@ fn issue_local_statement_does_cause_distribution_but_not_duplicate_participation }) .await; + handle_disabled_validators_queries(&mut virtual_overseer, Vec::new()).await; assert_eq!(confirmation_rx.await, Ok(ImportStatementsResult::ValidImport)); // Initiate dispute locally: @@ -2556,7 +2597,7 @@ fn issue_local_statement_does_cause_distribution_but_not_duplicate_participation } #[test] -fn own_approval_vote_gets_distributed_on_dispute() { +fn participation_with_onchain_disabling_unconfirmed() { test_harness(|mut test_state, mut virtual_overseer| { Box::pin(async move { let session = 1; @@ -2565,126 +2606,116 @@ fn own_approval_vote_gets_distributed_on_dispute() { let candidate_receipt = make_valid_candidate_receipt(); let candidate_hash = candidate_receipt.hash(); + let events = vec![make_candidate_included_event(candidate_receipt.clone())]; test_state - .activate_leaf_at_session(&mut virtual_overseer, session, 1, Vec::new()) + .activate_leaf_at_session(&mut virtual_overseer, session, 1, events) .await; - let statement = test_state.issue_approval_vote_with_index( - ValidatorIndex(0), - candidate_hash, - session, - ); - - // Import our approval vote: - virtual_overseer - .send(FromOrchestra::Communication { - msg: DisputeCoordinatorMessage::ImportStatements { - candidate_receipt: candidate_receipt.clone(), - session, - statements: vec![(statement, ValidatorIndex(0))], - pending_confirmation: None, - }, - }) - .await; + let backer_index = ValidatorIndex(1); + let disabled_index = ValidatorIndex(2); - // Trigger dispute: let (valid_vote, invalid_vote) = generate_opposing_votes_pair( &test_state, - ValidatorIndex(2), - ValidatorIndex(1), + backer_index, + disabled_index, candidate_hash, session, - VoteType::Explicit, + VoteType::Backing, ) .await; let (pending_confirmation, confirmation_rx) = oneshot::channel(); + let pending_confirmation = Some(pending_confirmation); + + // Scenario 1: unconfirmed dispute with onchain disabled validator against. + // Expectation: we import the vote, but do not participate. virtual_overseer .send(FromOrchestra::Communication { msg: DisputeCoordinatorMessage::ImportStatements { candidate_receipt: candidate_receipt.clone(), session, statements: vec![ - (invalid_vote, ValidatorIndex(1)), - (valid_vote, ValidatorIndex(2)), + (valid_vote, backer_index), + (invalid_vote, disabled_index), ], - pending_confirmation: Some(pending_confirmation), + pending_confirmation, }, }) .await; + + handle_disabled_validators_queries(&mut virtual_overseer, vec![disabled_index]).await; handle_approval_vote_request(&mut virtual_overseer, &candidate_hash, HashMap::new()) .await; assert_eq!(confirmation_rx.await, Ok(ImportStatementsResult::ValidImport)); - // Dispute distribution should get notified now (without participation, as we already - // have an approval vote): - assert_matches!( - overseer_recv(&mut virtual_overseer).await, - AllMessages::DisputeDistribution( - DisputeDistributionMessage::SendDispute(msg) - ) => { - assert_eq!(msg.session_index(), session); - assert_eq!(msg.candidate_receipt(), &candidate_receipt); - } - ); - - // No participation should occur: - assert_matches!(virtual_overseer.recv().timeout(TEST_TIMEOUT).await, None); - - virtual_overseer.send(FromOrchestra::Signal(OverseerSignal::Conclude)).await; - assert!(virtual_overseer.try_recv().await.is_none()); - - test_state - }) - }); -} - -#[test] -fn negative_issue_local_statement_only_triggers_import() { - test_harness(|mut test_state, mut virtual_overseer| { - Box::pin(async move { - let session = 1; - - test_state.handle_resume_sync(&mut virtual_overseer, session).await; + // we should not participate due to disabled indices on chain + assert!(virtual_overseer.recv().timeout(TEST_TIMEOUT).await.is_none()); - let candidate_receipt = make_invalid_candidate_receipt(); - let candidate_hash = candidate_receipt.hash(); + // Scenario 2: unconfirmed dispute with non-disabled validator against. + // Expectation: even if the dispute is unconfirmed, we should participate + // once we receive an invalid vote from a non-disabled validator. + let non_disabled_index = ValidatorIndex(3); + let vote = test_state.issue_explicit_statement_with_index( + non_disabled_index, + candidate_hash, + session, + false, + ); + let statements = vec![(vote, non_disabled_index)]; - test_state - .activate_leaf_at_session(&mut virtual_overseer, session, 1, Vec::new()) - .await; + let (pending_confirmation, confirmation_rx) = oneshot::channel(); + let pending_confirmation = Some(pending_confirmation); virtual_overseer .send(FromOrchestra::Communication { - msg: DisputeCoordinatorMessage::IssueLocalStatement( + msg: DisputeCoordinatorMessage::ImportStatements { + candidate_receipt: candidate_receipt.clone(), session, - candidate_hash, - candidate_receipt.clone(), - false, - ), + statements, + pending_confirmation, + }, }) .await; - // Assert that subsystem is not participating. - assert!(virtual_overseer.recv().timeout(TEST_TIMEOUT).await.is_none()); + assert_eq!(confirmation_rx.await, Ok(ImportStatementsResult::ValidImport)); - virtual_overseer.send(FromOrchestra::Signal(OverseerSignal::Conclude)).await; - assert!(virtual_overseer.try_recv().await.is_none()); + participation_with_distribution( + &mut virtual_overseer, + &candidate_hash, + candidate_receipt.commitments_hash, + ) + .await; - let backend = DbBackend::new( - test_state.db.clone(), - test_state.config.column_config(), - Metrics::default(), - ); + { + let (tx, rx) = oneshot::channel(); + virtual_overseer + .send(FromOrchestra::Communication { + msg: DisputeCoordinatorMessage::ActiveDisputes(tx), + }) + .await; - let votes = backend.load_candidate_votes(session, &candidate_hash).unwrap().unwrap(); - assert_eq!(votes.invalid.len(), 1); - assert_eq!(votes.valid.len(), 0); + assert_eq!(rx.await.unwrap().len(), 1); - let disputes = backend.load_recent_disputes().unwrap(); - assert_eq!(disputes, None); + // check if we have participated (cast a vote) + let (tx, rx) = oneshot::channel(); + virtual_overseer + .send(FromOrchestra::Communication { + msg: DisputeCoordinatorMessage::QueryCandidateVotes( + vec![(session, candidate_hash)], + tx, + ), + }) + .await; + + let (_, _, votes) = rx.await.unwrap().get(0).unwrap().clone(); + assert_eq!(votes.valid.raw().len(), 2); // 3+1 => we have participated + assert_eq!(votes.invalid.len(), 2); + } + + virtual_overseer.send(FromOrchestra::Signal(OverseerSignal::Conclude)).await; + assert!(virtual_overseer.try_recv().await.is_none()); test_state }) @@ -2692,7 +2723,7 @@ fn negative_issue_local_statement_only_triggers_import() { } #[test] -fn redundant_votes_ignored() { +fn participation_with_onchain_disabling_confirmed() { test_harness(|mut test_state, mut virtual_overseer| { Box::pin(async move { let session = 1; @@ -2701,63 +2732,95 @@ fn redundant_votes_ignored() { let candidate_receipt = make_valid_candidate_receipt(); let candidate_hash = candidate_receipt.hash(); + let events = vec![make_candidate_included_event(candidate_receipt.clone())]; test_state - .activate_leaf_at_session(&mut virtual_overseer, session, 1, Vec::new()) + .activate_leaf_at_session(&mut virtual_overseer, session, 1, events) .await; - let valid_vote = test_state.issue_backing_statement_with_index( - ValidatorIndex(1), - candidate_hash, - session, - ); + let backer_index = ValidatorIndex(1); + let disabled_index = ValidatorIndex(2); - let valid_vote_2 = test_state.issue_backing_statement_with_index( - ValidatorIndex(1), + // Scenario 1: confirmed dispute with disabled validator + // Expectation: we import the vote and participate. + let mut statements = Vec::new(); + + let (valid_vote, invalid_vote) = generate_opposing_votes_pair( + &test_state, + backer_index, + disabled_index, candidate_hash, session, - ); + VoteType::Backing, + ) + .await; - assert!(valid_vote.validator_signature() != valid_vote_2.validator_signature()); + statements.push((valid_vote, backer_index)); + statements.push((invalid_vote, disabled_index)); - let (tx, rx) = oneshot::channel(); - virtual_overseer - .send(FromOrchestra::Communication { - msg: DisputeCoordinatorMessage::ImportStatements { - candidate_receipt: candidate_receipt.clone(), - session, - statements: vec![(valid_vote.clone(), ValidatorIndex(1))], - pending_confirmation: Some(tx), - }, - }) - .await; + // now import enough votes for dispute confirmation + for i in vec![3, 4] { + let vote = test_state.issue_explicit_statement_with_index( + ValidatorIndex(i), + candidate_hash, + session, + true, + ); - rx.await.unwrap(); + statements.push((vote, ValidatorIndex(i as _))); + } + + let (pending_confirmation, confirmation_rx) = oneshot::channel(); + let pending_confirmation = Some(pending_confirmation); - let (tx, rx) = oneshot::channel(); virtual_overseer .send(FromOrchestra::Communication { msg: DisputeCoordinatorMessage::ImportStatements { candidate_receipt: candidate_receipt.clone(), session, - statements: vec![(valid_vote_2, ValidatorIndex(1))], - pending_confirmation: Some(tx), + statements, + pending_confirmation, }, }) .await; - rx.await.unwrap(); + handle_disabled_validators_queries(&mut virtual_overseer, vec![]).await; + handle_approval_vote_request(&mut virtual_overseer, &candidate_hash, HashMap::new()) + .await; + assert_eq!(confirmation_rx.await, Ok(ImportStatementsResult::ValidImport)); - let backend = DbBackend::new( - test_state.db.clone(), - test_state.config.column_config(), - Metrics::default(), - ); + participation_with_distribution( + &mut virtual_overseer, + &candidate_hash, + candidate_receipt.commitments_hash, + ) + .await; - let votes = backend.load_candidate_votes(session, &candidate_hash).unwrap().unwrap(); - assert_eq!(votes.invalid.len(), 0); - assert_eq!(votes.valid.len(), 1); - assert_eq!(&votes.valid[0].2, valid_vote.validator_signature()); + { + let (tx, rx) = oneshot::channel(); + virtual_overseer + .send(FromOrchestra::Communication { + msg: DisputeCoordinatorMessage::ActiveDisputes(tx), + }) + .await; + + assert_eq!(rx.await.unwrap().len(), 1); + + // check if we have participated (cast a vote) + let (tx, rx) = oneshot::channel(); + virtual_overseer + .send(FromOrchestra::Communication { + msg: DisputeCoordinatorMessage::QueryCandidateVotes( + vec![(session, candidate_hash)], + tx, + ), + }) + .await; + + let (_, _, votes) = rx.await.unwrap().get(0).unwrap().clone(); + assert_eq!(votes.valid.raw().len(), 4); // 3+1 => we have participated + assert_eq!(votes.invalid.len(), 1); + } virtual_overseer.send(FromOrchestra::Signal(OverseerSignal::Conclude)).await; assert!(virtual_overseer.try_recv().await.is_none()); @@ -2768,9 +2831,7 @@ fn redundant_votes_ignored() { } #[test] -/// Make sure no disputes are recorded when there are no opposing votes, even if we reached -/// supermajority. -fn no_onesided_disputes() { +fn participation_with_offchain_disabling() { test_harness(|mut test_state, mut virtual_overseer| { Box::pin(async move { let session = 1; @@ -2779,13 +2840,641 @@ fn no_onesided_disputes() { let candidate_receipt = make_valid_candidate_receipt(); let candidate_hash = candidate_receipt.hash(); + let events = vec![make_candidate_included_event(candidate_receipt.clone())]; + + let block_hash = test_state + .activate_leaf_at_session(&mut virtual_overseer, session, 3, events) + .await; + + let another_candidate_receipt = make_another_valid_candidate_receipt(block_hash); + let another_candidate_hash = another_candidate_receipt.hash(); + let another_events = + vec![make_candidate_included_event(another_candidate_receipt.clone())]; + test_state - .activate_leaf_at_session(&mut virtual_overseer, session, 1, Vec::new()) + .activate_leaf_at_session(&mut virtual_overseer, session, 4, another_events) .await; + // import enough votes for supermajority to conclude the dispute let mut statements = Vec::new(); - for index in 1..10 { - statements.push(( + let (valid_vote, invalid_vote) = generate_opposing_votes_pair( + &test_state, + ValidatorIndex(1), + ValidatorIndex(2), + candidate_hash, + session, + VoteType::Backing, + ) + .await; + + statements.push((valid_vote, ValidatorIndex(1))); + statements.push((invalid_vote, ValidatorIndex(2))); + + for i in vec![3, 4, 5, 6, 7, 8] { + let vote = test_state.issue_explicit_statement_with_index( + ValidatorIndex(i), + candidate_hash, + session, + true, + ); + + statements.push((vote, ValidatorIndex(i as _))); + } + + let (pending_confirmation, confirmation_rx) = oneshot::channel(); + let pending_confirmation = Some(pending_confirmation); + + virtual_overseer + .send(FromOrchestra::Communication { + msg: DisputeCoordinatorMessage::ImportStatements { + candidate_receipt: candidate_receipt.clone(), + session, + statements, + pending_confirmation, + }, + }) + .await; + + handle_disabled_validators_queries(&mut virtual_overseer, vec![]).await; + handle_approval_vote_request(&mut virtual_overseer, &candidate_hash, HashMap::new()) + .await; + + assert_eq!(confirmation_rx.await, Ok(ImportStatementsResult::ValidImport)); + + participation_with_distribution( + &mut virtual_overseer, + &candidate_hash, + candidate_receipt.commitments_hash, + ) + .await; + + { + let (tx, rx) = oneshot::channel(); + virtual_overseer + .send(FromOrchestra::Communication { + msg: DisputeCoordinatorMessage::ActiveDisputes(tx), + }) + .await; + + assert_eq!(rx.await.unwrap().len(), 1); + + // check if we have participated (cast a vote) + let (tx, rx) = oneshot::channel(); + virtual_overseer + .send(FromOrchestra::Communication { + msg: DisputeCoordinatorMessage::QueryCandidateVotes( + vec![(session, candidate_hash)], + tx, + ), + }) + .await; + + let (_, _, votes) = rx.await.unwrap().get(0).unwrap().clone(); + assert_eq!(votes.valid.raw().len(), 8); // 8 => we have participated + assert_eq!(votes.invalid.len(), 1); + } + + // now create another dispute + // Validator 2 should be disabled offchain now + + let mut statements = Vec::new(); + let (valid_vote, invalid_vote) = generate_opposing_votes_pair( + &test_state, + ValidatorIndex(1), + ValidatorIndex(2), + another_candidate_hash, + session, + VoteType::Backing, + ) + .await; + + statements.push((valid_vote, ValidatorIndex(1))); + statements.push((invalid_vote, ValidatorIndex(2))); + + let (pending_confirmation, confirmation_rx) = oneshot::channel(); + let pending_confirmation = Some(pending_confirmation); + + virtual_overseer + .send(FromOrchestra::Communication { + msg: DisputeCoordinatorMessage::ImportStatements { + candidate_receipt: another_candidate_receipt.clone(), + session, + statements, + pending_confirmation, + }, + }) + .await; + + // let's disable validators 3, 4 on chain, but this should not affect this import + let disabled_validators = vec![ValidatorIndex(3), ValidatorIndex(4)]; + handle_disabled_validators_queries(&mut virtual_overseer, disabled_validators).await; + handle_approval_vote_request( + &mut virtual_overseer, + &another_candidate_hash, + HashMap::new(), + ) + .await; + assert_eq!(confirmation_rx.await, Ok(ImportStatementsResult::ValidImport)); + + // we should not participate since due to offchain disabling + assert!(virtual_overseer.recv().timeout(TEST_TIMEOUT).await.is_none()); + + // now import enough votes for dispute confirmation + // even though all of these votes are from (on chain) disabled validators + let mut statements = Vec::new(); + for i in vec![3, 4] { + let vote = test_state.issue_explicit_statement_with_index( + ValidatorIndex(i), + another_candidate_hash, + session, + true, + ); + + statements.push((vote, ValidatorIndex(i as _))); + } + + let (pending_confirmation, confirmation_rx) = oneshot::channel(); + let pending_confirmation = Some(pending_confirmation); + + virtual_overseer + .send(FromOrchestra::Communication { + msg: DisputeCoordinatorMessage::ImportStatements { + candidate_receipt: another_candidate_receipt.clone(), + session, + statements, + pending_confirmation, + }, + }) + .await; + + assert_eq!(confirmation_rx.await, Ok(ImportStatementsResult::ValidImport)); + + participation_with_distribution( + &mut virtual_overseer, + &another_candidate_hash, + another_candidate_receipt.commitments_hash, + ) + .await; + + { + let (tx, rx) = oneshot::channel(); + virtual_overseer + .send(FromOrchestra::Communication { + msg: DisputeCoordinatorMessage::ActiveDisputes(tx), + }) + .await; + + assert_eq!(rx.await.unwrap().len(), 2); + + // check if we have participated (cast a vote) + let (tx, rx) = oneshot::channel(); + virtual_overseer + .send(FromOrchestra::Communication { + msg: DisputeCoordinatorMessage::QueryCandidateVotes( + vec![(session, another_candidate_hash)], + tx, + ), + }) + .await; + + let (_, _, votes) = rx.await.unwrap().get(0).unwrap().clone(); + assert_eq!(votes.valid.raw().len(), 4); // 3+1 => we have participated + assert_eq!(votes.invalid.len(), 1); + } + + virtual_overseer.send(FromOrchestra::Signal(OverseerSignal::Conclude)).await; + assert!(virtual_overseer.try_recv().await.is_none()); + + test_state + }) + }); +} + +// Once the onchain disabling reaches the byzantine threshold, +// offchain disabling will no longer take any effect. +#[test] +fn participation_with_disabling_limits() { + test_harness(|mut test_state, mut virtual_overseer| { + Box::pin(async move { + let session = 1; + + test_state.handle_resume_sync(&mut virtual_overseer, session).await; + + let candidate_receipt = make_valid_candidate_receipt(); + let candidate_hash = candidate_receipt.hash(); + let events = vec![make_candidate_included_event(candidate_receipt.clone())]; + + let block_hash = test_state + .activate_leaf_at_session(&mut virtual_overseer, session, 3, events) + .await; + + let another_candidate_receipt = make_another_valid_candidate_receipt(block_hash); + let another_candidate_hash = another_candidate_receipt.hash(); + let another_events = + vec![make_candidate_included_event(another_candidate_receipt.clone())]; + + test_state + .activate_leaf_at_session(&mut virtual_overseer, session, 4, another_events) + .await; + + // import enough votes for supermajority to conclude the dispute + let mut statements = Vec::new(); + let (valid_vote, invalid_vote) = generate_opposing_votes_pair( + &test_state, + ValidatorIndex(1), + ValidatorIndex(2), + candidate_hash, + session, + VoteType::Backing, + ) + .await; + + statements.push((valid_vote, ValidatorIndex(1))); + statements.push((invalid_vote, ValidatorIndex(2))); + + for i in vec![3, 4, 5, 6, 7, 8] { + let vote = test_state.issue_explicit_statement_with_index( + ValidatorIndex(i), + candidate_hash, + session, + true, + ); + + statements.push((vote, ValidatorIndex(i as _))); + } + + let (pending_confirmation, confirmation_rx) = oneshot::channel(); + let pending_confirmation = Some(pending_confirmation); + + virtual_overseer + .send(FromOrchestra::Communication { + msg: DisputeCoordinatorMessage::ImportStatements { + candidate_receipt: candidate_receipt.clone(), + session, + statements, + pending_confirmation, + }, + }) + .await; + + handle_disabled_validators_queries(&mut virtual_overseer, vec![]).await; + handle_approval_vote_request(&mut virtual_overseer, &candidate_hash, HashMap::new()) + .await; + + assert_eq!(confirmation_rx.await, Ok(ImportStatementsResult::ValidImport)); + + participation_with_distribution( + &mut virtual_overseer, + &candidate_hash, + candidate_receipt.commitments_hash, + ) + .await; + + { + let (tx, rx) = oneshot::channel(); + virtual_overseer + .send(FromOrchestra::Communication { + msg: DisputeCoordinatorMessage::ActiveDisputes(tx), + }) + .await; + + assert_eq!(rx.await.unwrap().len(), 1); + + // check if we have participated (cast a vote) + let (tx, rx) = oneshot::channel(); + virtual_overseer + .send(FromOrchestra::Communication { + msg: DisputeCoordinatorMessage::QueryCandidateVotes( + vec![(session, candidate_hash)], + tx, + ), + }) + .await; + + let (_, _, votes) = rx.await.unwrap().get(0).unwrap().clone(); + assert_eq!(votes.valid.raw().len(), 8); // 8 => we have participated + assert_eq!(votes.invalid.len(), 1); + } + + // now create another dispute + // validator 2 should be disabled offchain now + // but due to the byzantine threshold of onchain disabling + // this validator will be considered enabled + + let mut statements = Vec::new(); + let (valid_vote, invalid_vote) = generate_opposing_votes_pair( + &test_state, + ValidatorIndex(1), + ValidatorIndex(2), + another_candidate_hash, + session, + VoteType::Backing, + ) + .await; + + statements.push((valid_vote, ValidatorIndex(1))); + statements.push((invalid_vote, ValidatorIndex(2))); + + let (pending_confirmation, confirmation_rx) = oneshot::channel(); + let pending_confirmation = Some(pending_confirmation); + + virtual_overseer + .send(FromOrchestra::Communication { + msg: DisputeCoordinatorMessage::ImportStatements { + candidate_receipt: another_candidate_receipt.clone(), + session, + statements, + pending_confirmation, + }, + }) + .await; + + // let's disable validators 3, 4, 5 on chain, reaching the byzantine threshold + let disabled_validators = vec![ValidatorIndex(3), ValidatorIndex(4), ValidatorIndex(5)]; + handle_disabled_validators_queries(&mut virtual_overseer, disabled_validators).await; + handle_approval_vote_request( + &mut virtual_overseer, + &another_candidate_hash, + HashMap::new(), + ) + .await; + assert_eq!(confirmation_rx.await, Ok(ImportStatementsResult::ValidImport)); + + participation_with_distribution( + &mut virtual_overseer, + &another_candidate_hash, + another_candidate_receipt.commitments_hash, + ) + .await; + + { + let (tx, rx) = oneshot::channel(); + virtual_overseer + .send(FromOrchestra::Communication { + msg: DisputeCoordinatorMessage::ActiveDisputes(tx), + }) + .await; + + assert_eq!(rx.await.unwrap().len(), 2); + + // check if we have participated (cast a vote) + let (tx, rx) = oneshot::channel(); + virtual_overseer + .send(FromOrchestra::Communication { + msg: DisputeCoordinatorMessage::QueryCandidateVotes( + vec![(session, another_candidate_hash)], + tx, + ), + }) + .await; + + let (_, _, votes) = rx.await.unwrap().get(0).unwrap().clone(); + assert_eq!(votes.valid.raw().len(), 2); // 2 => we have participated + assert_eq!(votes.invalid.len(), 1); + } + + virtual_overseer.send(FromOrchestra::Signal(OverseerSignal::Conclude)).await; + assert!(virtual_overseer.try_recv().await.is_none()); + + test_state + }) + }); +} + +#[test] +fn own_approval_vote_gets_distributed_on_dispute() { + test_harness(|mut test_state, mut virtual_overseer| { + Box::pin(async move { + let session = 1; + + test_state.handle_resume_sync(&mut virtual_overseer, session).await; + + let candidate_receipt = make_valid_candidate_receipt(); + let candidate_hash = candidate_receipt.hash(); + + test_state + .activate_leaf_at_session(&mut virtual_overseer, session, 1, Vec::new()) + .await; + + let statement = test_state.issue_approval_vote_with_index( + ValidatorIndex(0), + candidate_hash, + session, + ); + + // Import our approval vote: + virtual_overseer + .send(FromOrchestra::Communication { + msg: DisputeCoordinatorMessage::ImportStatements { + candidate_receipt: candidate_receipt.clone(), + session, + statements: vec![(statement, ValidatorIndex(0))], + pending_confirmation: None, + }, + }) + .await; + + // Trigger dispute: + let (valid_vote, invalid_vote) = generate_opposing_votes_pair( + &test_state, + ValidatorIndex(2), + ValidatorIndex(1), + candidate_hash, + session, + VoteType::Explicit, + ) + .await; + + let (pending_confirmation, confirmation_rx) = oneshot::channel(); + virtual_overseer + .send(FromOrchestra::Communication { + msg: DisputeCoordinatorMessage::ImportStatements { + candidate_receipt: candidate_receipt.clone(), + session, + statements: vec![ + (invalid_vote, ValidatorIndex(1)), + (valid_vote, ValidatorIndex(2)), + ], + pending_confirmation: Some(pending_confirmation), + }, + }) + .await; + handle_disabled_validators_queries(&mut virtual_overseer, Vec::new()).await; + handle_approval_vote_request(&mut virtual_overseer, &candidate_hash, HashMap::new()) + .await; + + assert_eq!(confirmation_rx.await, Ok(ImportStatementsResult::ValidImport)); + + // Dispute distribution should get notified now (without participation, as we already + // have an approval vote): + assert_matches!( + overseer_recv(&mut virtual_overseer).await, + AllMessages::DisputeDistribution( + DisputeDistributionMessage::SendDispute(msg) + ) => { + assert_eq!(msg.session_index(), session); + assert_eq!(msg.candidate_receipt(), &candidate_receipt); + } + ); + + // No participation should occur: + assert_matches!(virtual_overseer.recv().timeout(TEST_TIMEOUT).await, None); + + virtual_overseer.send(FromOrchestra::Signal(OverseerSignal::Conclude)).await; + assert!(virtual_overseer.try_recv().await.is_none()); + + test_state + }) + }); +} + +#[test] +fn negative_issue_local_statement_only_triggers_import() { + test_harness(|mut test_state, mut virtual_overseer| { + Box::pin(async move { + let session = 1; + + test_state.handle_resume_sync(&mut virtual_overseer, session).await; + + let candidate_receipt = make_invalid_candidate_receipt(); + let candidate_hash = candidate_receipt.hash(); + + test_state + .activate_leaf_at_session(&mut virtual_overseer, session, 1, Vec::new()) + .await; + + virtual_overseer + .send(FromOrchestra::Communication { + msg: DisputeCoordinatorMessage::IssueLocalStatement( + session, + candidate_hash, + candidate_receipt.clone(), + false, + ), + }) + .await; + + handle_disabled_validators_queries(&mut virtual_overseer, Vec::new()).await; + // Assert that subsystem is not participating. + assert!(virtual_overseer.recv().timeout(TEST_TIMEOUT).await.is_none()); + + virtual_overseer.send(FromOrchestra::Signal(OverseerSignal::Conclude)).await; + assert!(virtual_overseer.try_recv().await.is_none()); + + let backend = DbBackend::new( + test_state.db.clone(), + test_state.config.column_config(), + Metrics::default(), + ); + + let votes = backend.load_candidate_votes(session, &candidate_hash).unwrap().unwrap(); + assert_eq!(votes.invalid.len(), 1); + assert_eq!(votes.valid.len(), 0); + + let disputes = backend.load_recent_disputes().unwrap(); + assert_eq!(disputes, None); + + test_state + }) + }); +} + +#[test] +fn redundant_votes_ignored() { + test_harness(|mut test_state, mut virtual_overseer| { + Box::pin(async move { + let session = 1; + + test_state.handle_resume_sync(&mut virtual_overseer, session).await; + + let candidate_receipt = make_valid_candidate_receipt(); + let candidate_hash = candidate_receipt.hash(); + + test_state + .activate_leaf_at_session(&mut virtual_overseer, session, 1, Vec::new()) + .await; + + let valid_vote = test_state.issue_backing_statement_with_index( + ValidatorIndex(1), + candidate_hash, + session, + ); + + let valid_vote_2 = test_state.issue_backing_statement_with_index( + ValidatorIndex(1), + candidate_hash, + session, + ); + + assert!(valid_vote.validator_signature() != valid_vote_2.validator_signature()); + + let (tx, rx) = oneshot::channel(); + virtual_overseer + .send(FromOrchestra::Communication { + msg: DisputeCoordinatorMessage::ImportStatements { + candidate_receipt: candidate_receipt.clone(), + session, + statements: vec![(valid_vote.clone(), ValidatorIndex(1))], + pending_confirmation: Some(tx), + }, + }) + .await; + + handle_disabled_validators_queries(&mut virtual_overseer, Vec::new()).await; + rx.await.unwrap(); + + let (tx, rx) = oneshot::channel(); + virtual_overseer + .send(FromOrchestra::Communication { + msg: DisputeCoordinatorMessage::ImportStatements { + candidate_receipt: candidate_receipt.clone(), + session, + statements: vec![(valid_vote_2, ValidatorIndex(1))], + pending_confirmation: Some(tx), + }, + }) + .await; + + rx.await.unwrap(); + + let backend = DbBackend::new( + test_state.db.clone(), + test_state.config.column_config(), + Metrics::default(), + ); + + let votes = backend.load_candidate_votes(session, &candidate_hash).unwrap().unwrap(); + assert_eq!(votes.invalid.len(), 0); + assert_eq!(votes.valid.len(), 1); + assert_eq!(&votes.valid[0].2, valid_vote.validator_signature()); + + virtual_overseer.send(FromOrchestra::Signal(OverseerSignal::Conclude)).await; + assert!(virtual_overseer.try_recv().await.is_none()); + + test_state + }) + }); +} + +#[test] +/// Make sure no disputes are recorded when there are no opposing votes, even if we reached +/// supermajority. +fn no_onesided_disputes() { + test_harness(|mut test_state, mut virtual_overseer| { + Box::pin(async move { + let session = 1; + + test_state.handle_resume_sync(&mut virtual_overseer, session).await; + + let candidate_receipt = make_valid_candidate_receipt(); + let candidate_hash = candidate_receipt.hash(); + test_state + .activate_leaf_at_session(&mut virtual_overseer, session, 1, Vec::new()) + .await; + + let mut statements = Vec::new(); + for index in 1..10 { + statements.push(( test_state.issue_backing_statement_with_index( ValidatorIndex(index), candidate_hash, @@ -2806,6 +3495,7 @@ fn no_onesided_disputes() { }, }) .await; + handle_disabled_validators_queries(&mut virtual_overseer, Vec::new()).await; assert_matches!(confirmation_rx.await, Ok(ImportStatementsResult::ValidImport)); // We should not have any active disputes now. @@ -2869,6 +3559,7 @@ fn refrain_from_participation() { }) .await; + handle_disabled_validators_queries(&mut virtual_overseer, Vec::new()).await; handle_approval_vote_request(&mut virtual_overseer, &candidate_hash, HashMap::new()) .await; @@ -2961,6 +3652,7 @@ fn participation_for_included_candidates() { }) .await; + handle_disabled_validators_queries(&mut virtual_overseer, Vec::new()).await; handle_approval_vote_request(&mut virtual_overseer, &candidate_hash, HashMap::new()) .await; @@ -3049,6 +3741,7 @@ fn local_participation_in_dispute_for_backed_candidate() { }) .await; + handle_disabled_validators_queries(&mut virtual_overseer, Vec::new()).await; handle_approval_vote_request(&mut virtual_overseer, &candidate_hash, HashMap::new()) .await; @@ -3190,6 +3883,7 @@ fn participation_requests_reprioritized_for_newly_included() { }) .await; + handle_disabled_validators_queries(&mut virtual_overseer, Vec::new()).await; // Handle corresponding messages to unblock import // we need to handle `ApprovalVotingMessage::GetApprovalSignaturesForCandidate` for // import @@ -3343,6 +4037,7 @@ fn informs_chain_selection_when_dispute_concluded_against() { }, }) .await; + handle_disabled_validators_queries(&mut virtual_overseer, Vec::new()).await; handle_approval_vote_request(&mut virtual_overseer, &candidate_hash, HashMap::new()) .await; assert_matches!(confirmation_rx.await.unwrap(), @@ -3655,3 +4350,27 @@ fn session_info_small_jump_works() { }) }); } + +async fn handle_disabled_validators_queries( + virtual_overseer: &mut VirtualOverseer, + disabled_validators: Vec, +) { + assert_matches!( + virtual_overseer.recv().await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + _new_leaf, + RuntimeApiRequest::Version(tx), + )) => { + tx.send(Ok(RuntimeApiRequest::DISABLED_VALIDATORS_RUNTIME_REQUIREMENT)).unwrap(); + } + ); + assert_matches!( + virtual_overseer.recv().await, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + _new_leaf, + RuntimeApiRequest::DisabledValidators(tx), + )) => { + tx.send(Ok(disabled_validators)).unwrap(); + } + ); +} diff --git a/polkadot/node/subsystem-util/src/lib.rs b/polkadot/node/subsystem-util/src/lib.rs index 1fe52767df6..f13beb3502f 100644 --- a/polkadot/node/subsystem-util/src/lib.rs +++ b/polkadot/node/subsystem-util/src/lib.rs @@ -141,6 +141,20 @@ impl From for Error { } } +impl TryFrom for Error { + type Error = (); + + fn try_from(e: crate::runtime::Error) -> Result { + use crate::runtime::Error; + + match e { + Error::RuntimeRequestCanceled(e) => Ok(Self::Oneshot(e)), + Error::RuntimeRequest(e) => Ok(Self::RuntimeApi(e)), + Error::NoSuchSession(_) | Error::NoExecutorParams(_) => Err(()), + } + } +} + /// A type alias for Runtime API receivers. pub type RuntimeApiReceiver = oneshot::Receiver>; @@ -465,7 +479,9 @@ impl Validator { // TODO: https://github.com/paritytech/polkadot-sdk/issues/1940 // When `DisabledValidators` is released remove this and add a // `request_disabled_validators` call here - let disabled_validators = get_disabled_validators_with_fallback(sender, parent).await?; + let disabled_validators = get_disabled_validators_with_fallback(sender, parent) + .await + .map_err(|e| Error::try_from(e).expect("the conversion is infallible; qed"))?; Self::construct(&validators, &disabled_validators, signing_context, keystore) } diff --git a/polkadot/node/subsystem-util/src/runtime/mod.rs b/polkadot/node/subsystem-util/src/runtime/mod.rs index 0e44423b4e3..481625acb32 100644 --- a/polkadot/node/subsystem-util/src/runtime/mod.rs +++ b/polkadot/node/subsystem-util/src/runtime/mod.rs @@ -43,7 +43,7 @@ use crate::{ request_from_runtime, request_key_ownership_proof, request_on_chain_votes, request_session_executor_params, request_session_index_for_child, request_session_info, request_submit_report_dispute_lost, request_unapplied_slashes, request_validation_code_by_hash, - request_validator_groups, + request_validator_groups, vstaging::get_disabled_validators_with_fallback, }; /// Errors that can happen on runtime fetches. @@ -75,6 +75,11 @@ pub struct RuntimeInfo { /// overseer seems sensible. session_index_cache: LruMap, + /// In the happy case, we do not query disabled validators at all. In the worst case, we can + /// query it order of `n_cores` times `n_validators` per block, so caching it here seems + /// sensible. + disabled_validators_cache: LruMap>, + /// Look up cached sessions by `SessionIndex`. session_info_cache: LruMap, @@ -129,6 +134,7 @@ impl RuntimeInfo { Self { session_index_cache: LruMap::new(ByLength::new(cfg.session_cache_lru_size.max(10))), session_info_cache: LruMap::new(ByLength::new(cfg.session_cache_lru_size)), + disabled_validators_cache: LruMap::new(ByLength::new(100)), pinned_blocks: LruMap::new(ByLength::new(cfg.session_cache_lru_size)), keystore: cfg.keystore, } @@ -180,6 +186,26 @@ impl RuntimeInfo { self.get_session_info_by_index(sender, relay_parent, session_index).await } + /// Get the list of disabled validators at the relay parent. + pub async fn get_disabled_validators( + &mut self, + sender: &mut Sender, + relay_parent: Hash, + ) -> Result> + where + Sender: SubsystemSender, + { + match self.disabled_validators_cache.get(&relay_parent).cloned() { + Some(result) => Ok(result), + None => { + let disabled_validators = + get_disabled_validators_with_fallback(sender, relay_parent).await?; + self.disabled_validators_cache.insert(relay_parent, disabled_validators.clone()); + Ok(disabled_validators) + }, + } + } + /// Get `ExtendedSessionInfo` by session index. /// /// `request_session_info` still requires the parent to be passed in, so we take the parent diff --git a/polkadot/node/subsystem-util/src/vstaging.rs b/polkadot/node/subsystem-util/src/vstaging.rs index 3efd3b61f93..3e807eff538 100644 --- a/polkadot/node/subsystem-util/src/vstaging.rs +++ b/polkadot/node/subsystem-util/src/vstaging.rs @@ -23,7 +23,7 @@ use polkadot_node_subsystem_types::messages::{RuntimeApiMessage, RuntimeApiReque use polkadot_overseer::SubsystemSender; use polkadot_primitives::{Hash, ValidatorIndex}; -use crate::{has_required_runtime, request_disabled_validators, Error}; +use crate::{has_required_runtime, request_disabled_validators, runtime}; const LOG_TARGET: &'static str = "parachain::subsystem-util-vstaging"; @@ -35,7 +35,7 @@ const LOG_TARGET: &'static str = "parachain::subsystem-util-vstaging"; pub async fn get_disabled_validators_with_fallback>( sender: &mut Sender, relay_parent: Hash, -) -> Result, Error> { +) -> Result, runtime::Error> { let disabled_validators = if has_required_runtime( sender, relay_parent, @@ -46,7 +46,7 @@ pub async fn get_disabled_validators_with_fallback bool { - match *self { - Self::Valid(ValidDisputeStatementKind::BackingSeconded(_)) | - Self::Valid(ValidDisputeStatementKind::BackingValid(_)) => true, - Self::Valid(ValidDisputeStatementKind::Explicit) | - Self::Valid(ValidDisputeStatementKind::ApprovalChecking) | - Self::Valid(ValidDisputeStatementKind::ApprovalCheckingMultipleCandidates(_)) | + match self { + Self::Valid(s) => s.is_backing(), Self::Invalid(_) => false, } } @@ -1374,6 +1370,19 @@ pub enum ValidDisputeStatementKind { ApprovalCheckingMultipleCandidates(Vec), } +impl ValidDisputeStatementKind { + /// Whether the statement is from the backing phase. + pub fn is_backing(&self) -> bool { + match self { + ValidDisputeStatementKind::BackingSeconded(_) | + ValidDisputeStatementKind::BackingValid(_) => true, + ValidDisputeStatementKind::Explicit | + ValidDisputeStatementKind::ApprovalChecking | + ValidDisputeStatementKind::ApprovalCheckingMultipleCandidates(_) => false, + } + } +} + /// Different kinds of statements of invalidity on a candidate. #[derive(Encode, Decode, Copy, Clone, PartialEq, RuntimeDebug, TypeInfo)] pub enum InvalidDisputeStatementKind { diff --git a/polkadot/roadmap/implementers-guide/src/node/disputes/dispute-coordinator.md b/polkadot/roadmap/implementers-guide/src/node/disputes/dispute-coordinator.md index a9cb2741b08..e0738e219d1 100644 --- a/polkadot/roadmap/implementers-guide/src/node/disputes/dispute-coordinator.md +++ b/polkadot/roadmap/implementers-guide/src/node/disputes/dispute-coordinator.md @@ -13,6 +13,7 @@ In particular the dispute-coordinator is responsible for: - Ensuring backing votes will never get overridden by explicit votes. - Coordinating actual participation in a dispute, ensuring that the node participates in any justified dispute in a way that ensures resolution of disputes on the network even in the case of many disputes raised (flood/DoS scenario). +- Ensuring disabled validators are not able to spam disputes. - Ensuring disputes resolve, even for candidates on abandoned forks as much as reasonably possible, to rule out "free tries" and thus guarantee our gambler's ruin property. - Providing an API for chain selection, so we can prevent finalization of any chain which has included candidates for @@ -243,6 +244,9 @@ if any of the following holds true: - The dispute is already confirmed: Meaning that 1/3+1 nodes already participated, as this suggests in our threat model that there was at least one honest node that already voted, so the dispute must be genuine. +In addition to that, we only participate in a non-confirmed dispute if at least one vote against the candidate is from +a non-disabled validator. + Note: A node might be out of sync with the chain and we might only learn about a block, including a candidate, after we learned about the dispute. This means, we have to re-evaluate participation decisions on block import! @@ -301,6 +305,7 @@ conditions are satisfied: - the candidate under dispute was not seen included nor backed on any chain - the dispute is not confirmed - we haven't cast a vote for the dispute +- at least one vote against the candidate is from a non-disabled validator Whenever any vote on a dispute is imported these conditions are checked. If the dispute is found not to be potential spam, then spam slots for the disputed candidate hash are cleared. This decrements the spam count for every validator @@ -318,6 +323,23 @@ approval-voting), but we also don't import them until a dispute already conclude opposing votes, so there must be an explicit `invalid` vote in the import. Only a third of the validators can be malicious, so spam disk usage is limited to `2*vote_size*n/3*NUM_SPAM_SLOTS`, with `n` being the number of validators. +### Disabling + +Once a validator has committed an offence (e.g. losing a dispute), it is considered disabled for the rest of the era. +In addition to using the on-chain state of disabled validators, we also keep track of validators who lost a dispute +off-chain. The reason for this is a dispute can be raised for a candidate in a previous era, which means that a +validator that is going to be slashed for it might not even be in the current active set. That means it can't be +disabled on-chain. We need a way to prevent someone from disputing all valid candidates in the previous era. We do this +by keeping track of the validators who lost a dispute in the past few sessions and use that list in addition to the +on-chain disabled validators state. In addition to past session misbehavior, this also heps in case a slash is delayed. + +When we receive a dispute statements set, we do the following: +1. Take the on-chain state of disabled validators at the relay parent block. +1. Take a list of those who lost a dispute in that session in the order that prioritizes the biggest and newest offence. +1. Combine the two lists and take the first byzantine threshold validators from it. +1. If the dispute is unconfimed, check if all votes against the candidate are from disabled validators. +If so, we don't participate in the dispute, but record the votes. + ### Backing Votes Backing votes are in some way special. For starters they are the only valid votes that are guaranteed to exist for any diff --git a/prdoc/pr_2637.prdoc b/prdoc/pr_2637.prdoc new file mode 100644 index 00000000000..a7ab4f93222 --- /dev/null +++ b/prdoc/pr_2637.prdoc @@ -0,0 +1,18 @@ +title: Validator disabling in Dispute Participation. + +doc: + - audience: Node Operator + description: | + Once a validator has been disabled for misbehavior, other validators + should no longer participate in disputes initiated by it. + This feature is needed to ensure robust spam protection against + malicious actors. + +migrations: + db: [] + runtime: [] + +crates: + - name: polkadot-node-core-dispute-coordinator + +host_functions: [] -- GitLab From d288c81b968d9d375168eb2a0dde68b1f6ebc8a8 Mon Sep 17 00:00:00 2001 From: Muharem Date: Tue, 9 Jan 2024 19:36:39 +0800 Subject: [PATCH 130/191] pallet-core-fellowship: import an unimported member on approve (#2883) To align with the documentation of the approve call, we import an unimported member on approval. No changes have been made to the benchmarks as they already cover the worst-case scenario. --- prdoc/pr_2883.prdoc | 9 +++++++ substrate/frame/core-fellowship/src/lib.rs | 26 ++++++++++++++------ substrate/frame/core-fellowship/src/tests.rs | 8 ++++++ 3 files changed, 35 insertions(+), 8 deletions(-) create mode 100644 prdoc/pr_2883.prdoc diff --git a/prdoc/pr_2883.prdoc b/prdoc/pr_2883.prdoc new file mode 100644 index 00000000000..e2817d16a03 --- /dev/null +++ b/prdoc/pr_2883.prdoc @@ -0,0 +1,9 @@ +title: "pallet-core-fellowship: import an unimported on approve" + +doc: + - audience: Runtime User + description: | + To align with the documentation of the approve call, we import an untracked member on approval. + +crates: + - name: "pallet-core-fellowship" diff --git a/substrate/frame/core-fellowship/src/lib.rs b/substrate/frame/core-fellowship/src/lib.rs index 2042f68e714..ee16ae07ce6 100644 --- a/substrate/frame/core-fellowship/src/lib.rs +++ b/substrate/frame/core-fellowship/src/lib.rs @@ -382,7 +382,11 @@ pub mod pallet { ensure!(at_rank > 0, Error::::InvalidRank); let rank = T::Members::rank_of(&who).ok_or(Error::::Unranked)?; ensure!(rank == at_rank, Error::::UnexpectedRank); - let mut member = Member::::get(&who).ok_or(Error::::NotTracked)?; + let mut member = if let Some(m) = Member::::get(&who) { + m + } else { + Self::import_member(who.clone(), rank) + }; member.last_proof = frame_system::Pallet::::block_number(); Member::::insert(&who, &member); @@ -518,13 +522,7 @@ pub mod pallet { let who = ensure_signed(origin)?; ensure!(!Member::::contains_key(&who), Error::::AlreadyInducted); let rank = T::Members::rank_of(&who).ok_or(Error::::Unranked)?; - - let now = frame_system::Pallet::::block_number(); - Member::::insert( - &who, - MemberStatus { is_active: true, last_promotion: 0u32.into(), last_proof: now }, - ); - Self::deposit_event(Event::::Imported { who, rank }); + let _ = Self::import_member(who, rank); Ok(Pays::No.into()) } @@ -548,6 +546,18 @@ pub mod pallet { Self::deposit_event(e); } } + + fn import_member(who: T::AccountId, rank: RankOf) -> MemberStatusOf { + let now = frame_system::Pallet::::block_number(); + let status = MemberStatus { + is_active: true, + last_promotion: BlockNumberFor::::zero(), + last_proof: now, + }; + Member::::insert(&who, status.clone()); + Self::deposit_event(Event::::Imported { who, rank }); + status + } } impl, I: 'static> GetSalary, T::AccountId, T::Balance> for Pallet { diff --git a/substrate/frame/core-fellowship/src/tests.rs b/substrate/frame/core-fellowship/src/tests.rs index c9098f2171f..6d9cebbf921 100644 --- a/substrate/frame/core-fellowship/src/tests.rs +++ b/substrate/frame/core-fellowship/src/tests.rs @@ -378,3 +378,11 @@ fn active_changing_get_salary_works() { } }); } + +#[test] +fn approve_imports_not_tracked_member() { + new_test_ext().execute_with(|| { + set_rank(10, 5); + assert_ok!(CoreFellowship::approve(signed(5), 10, 5)); + }); +} -- GitLab From 06fa111f58b0172c9f4ba7c209c8b6945787faeb Mon Sep 17 00:00:00 2001 From: PG Herveou Date: Tue, 9 Jan 2024 12:43:53 +0100 Subject: [PATCH 131/191] Contracts: Bump polkavm (#2884) bump polkavm-x deps to 0.4.0 --- .gitlab-ci.yml | 2 +- Cargo.lock | 26 +++++++------------ substrate/frame/contracts/fixtures/Cargo.toml | 2 +- .../frame/contracts/fixtures/build/Cargo.toml | 2 +- substrate/frame/contracts/uapi/Cargo.toml | 7 +++-- 5 files changed, 16 insertions(+), 23 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index dc4b3cf162e..2289341a357 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -21,7 +21,7 @@ workflow: - if: $CI_COMMIT_BRANCH variables: - CI_IMAGE: !reference [.ci-unified, variables, CI_IMAGE] + CI_IMAGE: "docker.io/paritytech/ci-unified:bullseye-1.74.0-2023-11-01-v20240108" # BUILDAH_IMAGE is defined in group variables BUILDAH_COMMAND: "buildah --storage-driver overlay2" RELENG_SCRIPTS_BRANCH: "master" diff --git a/Cargo.lock b/Cargo.lock index 5fba3e62037..d4d3b2f6404 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13786,21 +13786,15 @@ dependencies = [ [[package]] name = "polkavm-common" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01363cf0a778e8d93eff31e8a03bc59992cba35faa419ea4f3e80146b69195ba" - -[[package]] -name = "polkavm-common" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88e869d66a254db6c7069992f240626416aba8e87d65c00e4be443135babfe82" +checksum = "fecd2caacfc4a7ee34243758dd7348859e6dec73f5e5df059890f5742ee46f0e" [[package]] name = "polkavm-derive" -version = "0.2.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26501292b2cb980cbeaac3304f0fc4480ff1bac2473045453d7333d775658b6a" +checksum = "db65a500d4adf574893c726ae365e37e4fbb7f2cbd403f6eaa1b665457456adc" dependencies = [ "polkavm-derive-impl", "syn 2.0.48", @@ -13808,11 +13802,11 @@ dependencies = [ [[package]] name = "polkavm-derive-impl" -version = "0.2.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "903e16ad3ed768f35e6f40acff2e8aaf6afb9f2889b0a8982dd43dcbee29db2d" +checksum = "c99f4e7a9ff434ef9c885b874c99d824c3a5693bf5e3e8569bb1d2245a8c1b7f" dependencies = [ - "polkavm-common 0.2.0", + "polkavm-common", "proc-macro2", "quote", "syn 2.0.48", @@ -13820,15 +13814,15 @@ dependencies = [ [[package]] name = "polkavm-linker" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f8719d37effca6df1cecf5c816d84ab09b7d18e960511f61c254a7581fa50c3" +checksum = "550738c1b49b9279fa19d8ebed81f551b911b869227a20a190f85f6db45d5d0e" dependencies = [ "gimli 0.28.0", "hashbrown 0.14.3", "log", "object 0.32.2", - "polkavm-common 0.3.0", + "polkavm-common", "rustc-demangle", ] diff --git a/substrate/frame/contracts/fixtures/Cargo.toml b/substrate/frame/contracts/fixtures/Cargo.toml index 36bc3974f5e..5ffac43d9de 100644 --- a/substrate/frame/contracts/fixtures/Cargo.toml +++ b/substrate/frame/contracts/fixtures/Cargo.toml @@ -21,7 +21,7 @@ parity-wasm = "0.45.0" tempfile = "3.8.1" toml = "0.8.2" twox-hash = "1.6.3" -polkavm-linker = { version = "0.3.0", optional = true } +polkavm-linker = { version = "0.4.0", optional = true } anyhow = "1.0.0" [features] diff --git a/substrate/frame/contracts/fixtures/build/Cargo.toml b/substrate/frame/contracts/fixtures/build/Cargo.toml index 7fd42b887e7..70bf0ba94fe 100644 --- a/substrate/frame/contracts/fixtures/build/Cargo.toml +++ b/substrate/frame/contracts/fixtures/build/Cargo.toml @@ -10,7 +10,7 @@ edition = "2021" [dependencies] uapi = { package = 'pallet-contracts-uapi', path = "", default-features = false } common = { package = 'pallet-contracts-fixtures-common', path = "" } -polkavm-derive = '0.2.0' +polkavm-derive = '0.4.0' [profile.release] opt-level = 3 diff --git a/substrate/frame/contracts/uapi/Cargo.toml b/substrate/frame/contracts/uapi/Cargo.toml index d3f6fc06269..eb12c4361f1 100644 --- a/substrate/frame/contracts/uapi/Cargo.toml +++ b/substrate/frame/contracts/uapi/Cargo.toml @@ -8,9 +8,8 @@ homepage = "https://substrate.io" repository.workspace = true description = "Exposes all the host functions that a contract can import." -# [lints] -# TODO: uncomment when rve toolchain is updated to rust 1.74 or greater. -# workspace = true +[lints] +workspace = true [dependencies] paste = { version = "1.0", default-features = false } @@ -22,7 +21,7 @@ scale = { package = "parity-scale-codec", version = "3.6.1", default-features = ], optional = true } [target.'cfg(target_arch = "riscv32")'.dependencies] -polkavm-derive = '0.2.0' +polkavm-derive = '0.4.0' [features] default = ["scale"] -- GitLab From 69e2ae6df0df48ba6e65fa6d186d702f5b999ef2 Mon Sep 17 00:00:00 2001 From: Alexander Samusev <41779041+alvicsam@users.noreply.github.com> Date: Tue, 9 Jan 2024 16:01:26 +0100 Subject: [PATCH 132/191] [ci] Revert reference to ci image (#2890) --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2289341a357..dc4b3cf162e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -21,7 +21,7 @@ workflow: - if: $CI_COMMIT_BRANCH variables: - CI_IMAGE: "docker.io/paritytech/ci-unified:bullseye-1.74.0-2023-11-01-v20240108" + CI_IMAGE: !reference [.ci-unified, variables, CI_IMAGE] # BUILDAH_IMAGE is defined in group variables BUILDAH_COMMAND: "buildah --storage-driver overlay2" RELENG_SCRIPTS_BRANCH: "master" -- GitLab From 3811629a698482116281295c0d440e0355144a76 Mon Sep 17 00:00:00 2001 From: Clara van Staden Date: Tue, 9 Jan 2024 17:37:46 +0200 Subject: [PATCH 133/191] Snowbridge Rococo deployment updates (#2792) - Includes the introduction of the `fast-runtime` feature, which cleans up our features - Updates beacon client fork versions config to Sepolia's versions - Cleanup of AgentIdOf --------- Co-authored-by: Ron Co-authored-by: claravanstaden --- bridges/snowbridge/parachain/README.md | 192 ++- .../pallets/ethereum-beacon-client/Cargo.toml | 4 +- .../src/benchmarking/fixtures.rs | 1215 ----------------- .../src/benchmarking/fixtures_mainnet.rs | 1215 +++++++++++++++++ .../src/benchmarking/fixtures_minimal.rs | 248 ++++ .../src/benchmarking/mod.rs | 22 +- .../ethereum-beacon-client/src/config/mod.rs | 4 +- .../pallets/ethereum-beacon-client/src/lib.rs | 2 +- .../ethereum-beacon-client/src/mock.rs | 216 +-- .../ethereum-beacon-client/src/tests.rs | 29 +- .../execution-header-update.mainnet.json | 50 + .../finalized-header-update.mainnet.json | 38 + .../fixtures/initial-checkpoint.mainnet.json | 542 ++++++++ .../next-finalized-header-update.mainnet.json | 38 + .../next-sync-committee-update.mainnet.json | 563 ++++++++ .../sync-committee-update.mainnet.json | 563 ++++++++ .../pallets/outbound-queue/src/lib.rs | 11 +- .../pallets/outbound-queue/src/types.rs | 46 +- .../parachain/runtime/tests/Cargo.toml | 4 +- .../parachain/scripts/verify-pallets-build.sh | 3 + .../assets/asset-hub-rococo/src/lib.rs | 1 + .../bridge-hubs/bridge-hub-rococo/Cargo.toml | 7 +- .../src/bridge_to_ethereum_config.rs | 7 +- .../bridge-hubs/bridge-hub-rococo/src/lib.rs | 30 +- .../bridge-hub-rococo/src/xcm_config.rs | 18 +- cumulus/polkadot-parachain/Cargo.toml | 3 + 26 files changed, 3544 insertions(+), 1527 deletions(-) delete mode 100644 bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/benchmarking/fixtures.rs create mode 100644 bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/benchmarking/fixtures_mainnet.rs create mode 100755 bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/benchmarking/fixtures_minimal.rs create mode 100755 bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/execution-header-update.mainnet.json create mode 100755 bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/finalized-header-update.mainnet.json create mode 100755 bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/initial-checkpoint.mainnet.json create mode 100755 bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/next-finalized-header-update.mainnet.json create mode 100755 bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/next-sync-committee-update.mainnet.json create mode 100755 bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/sync-committee-update.mainnet.json diff --git a/bridges/snowbridge/parachain/README.md b/bridges/snowbridge/parachain/README.md index ddcbedab0c6..a38910da316 100644 --- a/bridges/snowbridge/parachain/README.md +++ b/bridges/snowbridge/parachain/README.md @@ -1,155 +1,127 @@ -# Parachain modules +# Snowbridge · +[![codecov](https://codecov.io/gh/Snowfork/snowbridge/branch/main/graph/badge.svg?token=9hvgSws4rN)] +(https://codecov.io/gh/Snowfork/snowbridge) +![GitHub](https://img.shields.io/github/license/Snowfork/snowbridge) -## Configuration +Snowbridge is a trustless bridge between Polkadot and Ethereum. For documentation, visit https://docs.snowbridge.network. -Note: This section is not necessary for local development, as there are scripts to auto-configure the parachain in the -[test directory](https://github.com/Snowfork/snowbridge/blob/main/web/packages/test). +## Components -For a fully operational chain, further configuration of the initial chain spec is required. The specific configuration will -depend heavily on your environment, so this guide will remain high-level. +### Parachain -After completing a release build of the parachain, build an initial spec for the snowbase runtime: +Polkadot parachain and our pallets. See [parachain/README.md](https://github.com/Snowfork/snowbridge/blob/main/parachain/README.md). -```bash -target/release/snowbridge build-spec --chain snowbase --disable-default-bootnode > spec.json -``` +### Contracts -Now edit the spec and configure the following: -1. Recently finalized ethereum header and difficulty for the ethereum light client -2. Contract addresses for the Ether, Erc20, and Dot apps. -3. Authorized principal for the basic channel +Ethereum contracts and unit tests. See [contracts/README.md](https://github.com/Snowfork/snowbridge/blob/main/contracts/README.md) -For an example configuration, consult the [setup script](https://github.com/Snowfork/snowbridge/blob/main/web/packages/test/scripts/start-services.sh) -for our local development stack. Specifically the `start_polkadot_launch` bash function. +### Relayer -## Tests +Off-chain relayer services for relaying messages between Polkadot and Ethereum. See +[relayer/README.md](https://github.com/Snowfork/snowbridge/blob/main/relayer/README.md) -To run the parachain tests locally, use `cargo test --workspace`. For the full suite of tests, use -`cargo test --workspace --features runtime-benchmarks`. +### Local Testnet -Optionally exclude the top-level and runtime crates: +Scripts to provision a local testnet, running the above services to bridge between local deployments of Polkadot and +Ethereum. See [web/packages/test/README.md](https://github.com/Snowfork/snowbridge/blob/main/web/packages/test/README.md). -```bash -cargo test --workspace \ - --features runtime-benchmarks \ - --exclude snowbridge \ - --exclude snowbridge-runtime \ - --exclude snowblink-runtime \ - --exclude snowbase-runtime -``` +### Smoke Tests -### Updating test data for inbound channel unit tests +Integration tests for our local testnet. See [smoketest/README.md](https://github.com/Snowfork/snowbridge/blob/main/smoketest/README.md). -To regenerate the test data, use a test with multiple `submit` calls in `ethereum/test/test_basic_outbound_channel.js`, eg. -"should increment nonces correctly". +## Development -Add the following preamble: +We use the Nix package manager to provide a reproducible and maintainable developer environment. -```javascript -const rlp = require("rlp"); -const contract = BasicOutboundChannel; -const signature = 'Message(address,address,uint64,uint64,bytes)'; -``` +After [installing nix](https://nixos.org/download.html) Nix, enable [flakes](https://nixos.wiki/wiki/Flakes): -For each encoded log you want to create, find a transaction object `tx` returned from a `submit` call and run this: - -```javascript -const rawLog = tx.receipt.rawLogs[0]; -const encodedLog = rlp.encode([rawLog.address, rawLog.topics, rawLog.data]).toString("hex"); -console.log(`encodedLog: ${encodedLog}`); -const iface = new ethers.utils.Interface(contract.abi); -const decodedEventLog = iface.decodeEventLog( - signature, - rawLog.data, - rawLog.topics, -); -console.log(`decoded rawLog.data: ${JSON.stringify(decodedEventLog)}`); +```sh +mkdir -p ~/.config/nix +echo 'experimental-features = nix-command flakes' >> ~/.config/nix/nix.conf ``` -Place the `encodedLog` string in the `message.data` field in the test data. Use the `decoded rawLog.data` field to -update the comments with the decoded log data. - -## Generating pallet weights from benchmarks +Then activate a developer shell in the root of our repo, where +[`flake.nix`](https://github.com/Snowfork/snowbridge/blob/main/flake.nix) is located: -Build the parachain with the runtime benchmark flags for the chosen runtime: +```sh +nix develop +``` -```bash -runtime=snowbase -cargo build \ - --release \ - --no-default-features \ - --features "$runtime-native,rococo-native,runtime-benchmarks,$runtime-runtime-benchmarks" \ - --bin snowbridge +Also make sure to run this initialization script once: +```sh +scripts/init.sh ``` -List available pallets and their benchmarks: +### Support for code editors -```bash -./target/release/snowbridge benchmark pallet --chain $runtime --list -``` +To ensure your code editor (such as VS Code) can execute tools in the nix shell, startup your editor within the +interactive shell. -Run a benchmark for a pallet, generating weights: - -```bash -target/release/snowbridge benchmark pallet \ - --chain=$runtime \ - --execution=wasm \ - --wasm-execution=compiled \ - --pallet=basic_channel_inbound \ - --extra \ - --extrinsic=* \ - --repeat=20 \ - --steps=50 \ - --output=pallets/basic-channel/src/inbound/weights.rs \ - --template=templates/module-weight-template.hbs -``` +Example for VS Code: -## Generating beacon test fixtures and benchmarking data +```sh +nix develop +code . +``` -### Minimal Spec +### Custom shells -To generate `minimal` test data and benchmarking data, make sure to start the local E2E setup to spin up a local beacon -node instance to connect to: +The developer shell is bash by default. To preserve your existing shell: -```bash -cd web/packages/test -./scripts/start-services.sh +```sh +nix develop --command $SHELL ``` -Wait for output `Testnet has been initialized`. +### Automatic developer shells -In a separate terminal, from the `snowbridge` directory, run: +To automatically enter the developer shell whenever you open the project, install +[`direnv`](https://direnv.net/docs/installation.html) and use the template `.envrc`: -```bash -mage -d relayer build && relayer/build/snowbridge-relay generate-beacon-data --spec "minimal" && cd parachain && -cargo +nightly fmt -- --config-path rustfmt.toml && cd - +```sh +cp .envrc.example .envrc +direnv allow ``` -### Mainnet Spec +### Upgrading the Rust toolchain + +Sometimes we would like to upgrade rust toolchain. First update `parachain/rust-toolchain.toml` as required and then +update `flake.lock` running +```sh +nix flake lock --update-input rust-overlay +``` -We only use the mainnet spec for generating fixtures for pallet weight benchmarks. +## Troubleshooting -To generate the data we can connect to the Lodestar Goerli public node. The script already connects to the Lodestar node, -so no need to start up additional services. In the event of the Lodestar node not being available, you can start up your -own stack with these commands: +Check the contents of all `.envrc` files. -```bash -cd web/packages/test -./scripts/start-goerli.sh +Remove untracked files: +```sh +git clean -idx ``` -From the `snowbridge` directory, run: +Ensure that the current Rust toolchain is the one selected in `scripts/init.sh`. -```bash -mage -d relayer build && relayer/build/snowbridge-relay generate-beacon-data --spec "mainnet" && cd parachain && -cargo +nightly fmt -- --config-path rustfmt.toml && cd - +Ensure submodules are up-to-date: +```sh +git submodule update ``` -### Benchmarking tests +Check untracked files & directories: +```sh +git clean -ndx | awk '{print $3}' +``` +After removing `node_modules` directories (eg. with `git clean above`), clear the pnpm cache: +```sh +pnpm store prune +``` -To run the benchmark tests +Check Nix config in `~/.config/nix/nix.conf`. -```bash -cd parachain/pallets/ethereum-beacon-client -cargo test --release --features runtime-benchmarks +Run a pure developer shell (note that this removes access to your local tools): +```sh +nix develop -i --pure-eval ``` + +## Security + +The security policy and procedures can be found in SECURITY.md. diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/Cargo.toml b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/Cargo.toml index db3be5f91b8..9f8749c89da 100644 --- a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/Cargo.toml +++ b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/Cargo.toml @@ -77,7 +77,6 @@ std = [ 'frame-benchmarking/std', ] runtime-benchmarks = [ - "beacon-spec-mainnet", "frame-benchmarking/runtime-benchmarks", "frame-support/runtime-benchmarks", "frame-system/runtime-benchmarks", @@ -92,4 +91,5 @@ try-runtime = [ "pallet-timestamp?/try-runtime", "sp-runtime/try-runtime", ] -beacon-spec-mainnet = [] +beacon-spec-minimal = [] +fast-runtime = ["beacon-spec-minimal"] diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/benchmarking/fixtures.rs b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/benchmarking/fixtures.rs deleted file mode 100644 index b50be81360a..00000000000 --- a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/benchmarking/fixtures.rs +++ /dev/null @@ -1,1215 +0,0 @@ -// Generated, do not edit! -// See README.md for instructions to generate -use crate::{CheckpointUpdate, ExecutionHeaderUpdate, Update}; -use hex_literal::hex; -use primitives::{ - updates::AncestryProof, BeaconHeader, ExecutionPayloadHeader, NextSyncCommitteeUpdate, - SyncAggregate, SyncCommittee, -}; -use sp_core::U256; -use sp_std::{boxed::Box, vec}; - -pub fn make_checkpoint() -> Box { - Box::new(CheckpointUpdate { - header: BeaconHeader { - slot: 5809344, - proposer_index: 101696, - parent_root: hex!("ea7ce4ad810829cf37a2235b1126c82aecfc5955a1647ec83640cf3f7db91bd2").into(), - state_root: hex!("56f6363d3604e61a907c774edf0bddf6477a8d410f026414bc420f751de1f092").into(), - body_root: hex!("8c799aeef815cbc4499e0b46723623105afb177a5c522ecda3415ad9fb259e6c").into(), - }, - current_sync_committee: SyncCommittee { - pubkeys: [ - hex!("adf5a4907639db7bdcbecbc295b57d8950b0abe34ab17798686643427023c4f3983550d1496f81a27e52b070e4f4e6ee").into(), - hex!("91b036b30405531cacebf5d4f7e939b44438bb9942123ee55b44453e32febfbf2c846e0e4fb08190b01a000d072dcaa7").into(), - hex!("a86e70f00161ec6c4b780b4fc631c8dbae979f1e6c9ed037dd0745833ed6e3e18831478eb4753861f339293c0508f4d4").into(), - hex!("84196b1f39fba1fb7570074e7dd2768ed5c28db7f91a6374e413c8fc82f97738af771f90496526088bfa1ee2c01ee299").into(), - hex!("b9a230fc12d85281cbfcc7f5e6b13ab17b3dcbf0adf256d031c01acb30734d061683d40fd62175da73a621440bb04367").into(), - hex!("80b8be5a3d6f39aa7362c5feee9f89b75d1e5c2b485ea9a776c60fd60dba611e9bf5ca8b2528f42651b3dad212acfe77").into(), - hex!("ac8fcfc40028d04bdbea87b4b335781e35e10f881bfeb07b94c538eb37a43b18b1a04aad3dbe80bbff6e128017251f2e").into(), - hex!("b0b2136cc729b7de8868c02de6247ff2a68694296c78f088ce967219f08cfb7be9e1830e2630b10ca650c715d85d89f3").into(), - hex!("a70627c99777970eb9bf3268bac06bdc41c2ead41b1b76d30e7fd2aefe83319461d03aaf7ab93150343be9fbd2e48e7d").into(), - hex!("9599aae109d31ddc9028c428a148ea9ebffdb5ab6a684895dbd3772c1baf947c8a255e4c7ebaedae2a9e046219d80d76").into(), - hex!("8652e099adb88b2a25ab64fb01314e24cf26dbc4ae110d7fd73d74a0e0a4fea2ce2ce87cb1ddb7c0b9fb50cc6afa2153").into(), - hex!("83ba74c6e31073865eaed3c38a8e885ee715f03cfd6e36929655b6aa790d8f676c4ac4ae27f963e311d00923357eb087").into(), - hex!("86b05425d880027fbde9be3ea526283c5b958ccb31eff997d9d7b5e3b70e2d011ed95f891248082e870d55704a471deb").into(), - hex!("a4eeb958121bc5be5b1a68b73faa83b19272ef2f2cb627431be08e9844ef9d4548b4208670754d0954e5b012e3933859").into(), - hex!("87b0119e4c54aa2b4f8260f9ace7722788578bc6d822361d011e751caf13be5ca94b7d5842df5c16e52bfb4d658a405a").into(), - hex!("b696ec7f5dc82655cf027f5827fff3ce39195c1ee4ea9fba1808880cdea16d6086fb583edfbf66608e4f33211ddf9f27").into(), - hex!("a69bafcb3af59786acf009cc31e245009156a7e4fd2af98cdf2b7e63c39aff2baba08a338cdac93e94f6132b2cfe7a7c").into(), - hex!("8aa0aebb24b8c62168b255b6041474e8abf0d589a7467bc4712d910a9c2d470432d251e336a80dded27c0e9eea43aebd").into(), - hex!("a08d6976d3579411080957dfa2ca9487b1c4d8dbcdf640c1fea0a46f2c0228c2ddadf0553781c3e0dc5c7503b1bf29a0").into(), - hex!("a4abccfcfce6754e4d6c5c8bbad6668a55dc555ba99189936385e4dafa0435b323b813ce69f76e24299b5842c244139a").into(), - hex!("b89e4fd2dfb46c2af6df73f7185693ac535b67ab31f2805b1c24f400e0068cb32aff164b53668512f5895883189f7c02").into(), - hex!("b7c221a5884d10048bf9dd8611fb5231ce444fb756e59dd60d18a2332e889c014b27d739ed6012ff86056c04f36a87f1").into(), - hex!("a82875d66a4da52d6eac9dcd9ba9c728332253ad4b83acf1601a34efdd0c398eaad4acd1a948203d1bbd4a17d01a7b56").into(), - hex!("8c0a8ec162b3d48ee6a0f39620432cd67a1eb33a6d6f7bf1aada4f24c7498cf2e2b2476898f14c875f5efcf439aa0bce").into(), - hex!("a4b5d6451ae5baba3984bfbd5eef59543bf7c923662ea182cec6bb29aded9afd4c89e618ff756b5290506e0bf5a7e690").into(), - hex!("80664b43e3bd2f6e8eeb81a46cdca4f571499f3f0c77eb007ceb33c5b3dc18348a68cedc19d9967117f21a6c1ea29060").into(), - hex!("9174e46939c6915c757e793c9a02e46ed49d869216b720d0924b9697d94098182cad2cc6d4caf4cf140445377f1b4c80").into(), - hex!("b6e25cc134e089d306c648228d84aeee9516c8a276a2d37b54b458314b8f8980d49614550e821aac31000a5e7d518fca").into(), - hex!("ab1ab623a70f1e33cdbee356530a6f8fd9d00b2f9d8f94c0854816e5dd2bb8b258b5fb7a89ebc0725d8ebb74395847b6").into(), - hex!("8e75ea6f0678abfe1a7a9201c9fde992451327d61290fd803b3a1cdf2f7537fd7c23e0e06af5bb886a28928d0baba1c5").into(), - hex!("b41f4d4421de7b94eb9bc61602d08d77dc3f5f5d025e04f44c1426f14e8f707031b9e1d3a6e92c200f54166b2040f0a0").into(), - hex!("a8fa0c61435b851f9bda4da8dae0d544984ba5c0fef338eb6896b9c08306c3e2aec0a6c2028da319f210387320df4f73").into(), - hex!("a884af449df4cbd39e161de10f9d1f645eedfae0d259ddd84347733836fded047ca079916d365ef3d93fb354c8c795a6").into(), - hex!("936970bdeffc92f32915d141ccd8334df7966a3cafecb6d33fab9f477c389179f612cd6e368b615a98112d71756756aa").into(), - hex!("88dfe631c1e16ec3634e06a83a857ce9c909cb5b05d40490e6d02e553dd3bf213f0e178d31b4d913a4796b7226ab3ba2").into(), - hex!("a0c8357b4fb9c4431bc88e6336c2218590a7cb351ef4405a80aa6d352912f0b3110f3a09eef337bfe98da6b0841c6214").into(), - hex!("a7def54e08e2cea7def767d1108bc5c24d64e2dbdea9d07f0c8c63e60eec2db4e095b4a84bf6a4822103560b0497d1e7").into(), - hex!("80991c4f933985d9662d2e047187f244dcbb79606410aeb66ab250b2fdb9bd9daa392339e9b16d0d07648e847b02f942").into(), - hex!("b63fe559e2b4580238a0b0ce52ab8258838c2b64c1922c56b64cd65be2f88c140cb4e6ce96932e92f1ae06b20ee9e613").into(), - hex!("926ece3480c5c1f24f03d8289dcac7d3b202fcda277dd4453294dffc2953d91c842653a9e272b76fe2cebe1de3aba63d").into(), - hex!("930d29990821d26a748018bb6998488d5de811c8ed506c213c0ba346c8011e2d7c2235aa427a320129c1d016948eabf1").into(), - hex!("ae4e3fcd6c99a8f320dd4d160704db6baaae9aaa885f5d792212ea03cf06a459eb4a2730da9161ddd72a5e6544744e81").into(), - hex!("a01ae9d4f0008efdc5203abfdd0807ee7cc58c49cc5946d0b991ea2e069a224f0d99ea714b4d5cc464deb57372790660").into(), - hex!("ab17902ab255c575a133ed47fbafd62f898748ef6fc33455a2adcb2d4ea72c31255a9cd0c545d2ad8007a5a694f13371").into(), - hex!("86e2384e0469ab8ea9c5628d619d10336b3c0f334969dbc3335dfd72ed9899639fccfb5d1d9d6667a0dba20651584100").into(), - hex!("88ededd6ef3502be7c3c1b018cd814d4a8f98a7cf9521fe9cce6faaa6056315e22828397435b57d15e996fd15d7d700a").into(), - hex!("affa898a30a0dd2ccbe8d46c5a69dc1a8696b311094ac00e8ef6d398f6f132edb2d823004bc7895ac53bc09b6fb1059c").into(), - hex!("ac9f5bc3e2045a1eb356d88f2a62781fdb5775349c9bbdd9417b7bb7a9132a1cd42bf4986fcdc706eabbce45ab9f1cc9").into(), - hex!("986e3813ade7b9533ccfdcd76ea17490bc3dc62c8a596c8d07b246c28d7dea465c4dadda05111d2793d72d317c7c2833").into(), - hex!("ad4fbc51581cd520bcd0b88379ec0482c94b2ac344ce48a5facc1cf3e026edb088ce5cba5113f2c31f630a1fb37c5214").into(), - hex!("b499bfe19a22900c46bc0af1925887bfdd62455a3b85144e44b9a0a3756548c72b4f5c61f21c15f5e70b627d9f53a9c4").into(), - hex!("a5f40fcbe99b494c6acdd65ec3516d5a4a784ffc501e686764bf655c1f2f4bf784bac6b85e961d6a5ae513555a638323").into(), - hex!("a44c695e5490bca1cdc6b69fa80d6540239e42ae1765bff39285d1798696574c409e27c288b3b57196cf7c1753366969").into(), - hex!("a1ec5d9b8e55803477fbdc454d9c5cc605ead24147e5b04a03f80558a14f1e08bd6557f3fd11dab06a2816d32138cd43").into(), - hex!("98957c2e0a82210e2329b60dac05dd8b219ca00b18206227b725d011bb2f8b0dc1a79149a7d49a9a5505301b1b3847c5").into(), - hex!("ac8df8b1b596039c24c185108c89ef4da384e92c957c84bdefdab923e4be7c0e9480d837e1ff2e6269828b86b0b9f6c2").into(), - hex!("9358e3a48d4938b189059c3696169d31339851a1f4205dfe4de423ad4b96e7015c0dccb8bcebb64c1c357b65d5da6914").into(), - hex!("af1ab721df52d8b106449aaed05761b637c38f4c5513062afa55a09b94c8b088fe98cf430be4633b4f2f818da545b37e").into(), - hex!("8b8c063568a13f6522fc66285ab116a06d5e226a72f5a00fb321dd9b7d0bdb53a6b46ac17a1c9faf468c19b128c84488").into(), - hex!("b537f79bf008cd16711390c188c52d8dcf23cc41990c82005de2b0ff1fa09de85d3c34328ad9124e108ec252ec667f70").into(), - hex!("b9e8cf06d584197093d4b4b1e1f745786bb1f9772c0a771b321ae2dccac167ea79632138d60d8ed6dbbba2accd0a3c11").into(), - hex!("a674106b2c965c708b98a9f28a3f511f5dd8dfe7b2b9ca64a29152c7fd8de428316638d5091412e22e50406c372d9950").into(), - hex!("900a4953af5a28ca5b6f789a0dab9a03e3e5b9a0e866465d371b871fc59ecba31b524b0fc414eb7467d4384ca1e4ab5c").into(), - hex!("8b12a6114f8e0947995d72fee19e9204a4b552a85743d5320c1942bd2294d52a2d6d346f5e930ed788fc929069733297").into(), - hex!("a118f4b631a0bfc00df74a94930d69075b83be0bfec2affdf5e1ca4762d40592132108a7d2088891e7fe078c84ea9d9c").into(), - hex!("b074d18f84787d245018a2dabe2f0a51bf2f3786a802317122982a598f7f953339468e0392665c3f3a6b8fb17cd8f72c").into(), - hex!("8e6230b8186009b765ae6b176eb7dbcf503139472c0c2c5574e3d608a49932f0b852e744d2e215c58512ed2b4e8178da").into(), - hex!("98cd13f8400ecc9db458cb81840ed6467795f54f25680931881808909cc661230716fcf8b3fc2b18f4c12d30c32d9e20").into(), - hex!("b861f89275776bd640bc7d0d347df31e784292fa14ec468a6b0e8d64a9b077b6bdae1bdbc56385bf8f5676ba62002606").into(), - hex!("80ac9088ce82fd7a90c91b24e5e91636ed76844303a3b1105bc284b4e9a860acca3207d1804200a55eeb3ef45ba97558").into(), - hex!("940bc07a53373f075128b6c12f59120bc7368289d5a960c55d52abb68e8444f6f830b07850d31a9ed137f5357b38406c").into(), - hex!("b8c5919657811270976eb45b9f3f09be798fbcf6b34ce7443fb36207816b6a84d2b945a6e6522480c2feed12ca980df9").into(), - hex!("8294e6ce7d7d3b77bf48252eb97cca47a5b9dff1b8c97f8b7af8034b938864f38bad932bfe44a9bf4df81e394aee7ef2").into(), - hex!("8d9075a2c42c1cf51e082ab1a57a66670f0e81af2a651aacac5aaaf3876711aabbc0c96e44d883e6ad8a91a81be22940").into(), - hex!("882aea71e4512d5c41b5fd6509ede0fa35a49fff9648d277b531364613342711b2c7520a5f8d58ff31b7fc9407f968fc").into(), - hex!("8a34a824cbac06cd99fc68f36ae09c6adf2d472fcbd378cda61b838c29ca9750a7f7d63d9b61d1f30deda1ce048ffd42").into(), - hex!("a4f027b5466de4fd633cba98d2c8c78db10f91c8bee76c32ca5a80c5e87ffaf19df84e675f31bb6c14ee733ac3d4a33b").into(), - hex!("b990db2d743b389132d4d8281701b348bfc52f707e6553f309e4f59706871142e6b8e3d081057a5c43243911148318bc").into(), - hex!("a4500c88a58971460c33a404a65260a9e21c4a345601d1686ecc352ab088b2bd93d30930383901fd2d042dd037286761").into(), - hex!("a4de9078286cde237b4ff2da52a0fc1b8fe7b931ac35b3033dca0b87b5c86e58bec951a66a7308fc951ebb70fd0d0bfd").into(), - hex!("a9adb6dbff69b115be1cb37d5ee3a95d8c9f466f059128b6ab197d4119f6c0f87d1cf4d14d4beb2a43f7913700c1d909").into(), - hex!("a8a33f167e473eb2ace3bedc1cac2281bc9f522a0fdf6a9eb365859b9116067e07b7c380e8ea4dd33a4fbe23e2412be5").into(), - hex!("88c3785f853a192c50c38040ed52c413084dd069729cb14d806223f8a51aef40c21648d1e03bbbca031ce811e1b708ce").into(), - hex!("a7db446f88ef0d018675c0e7be0e9655d098529ce4b4c92ad809ed9f588c3f6c6dd98267ae0efb1659dc16a29e1feac0").into(), - hex!("916fb4b864ef46a2f8f570364cdf02c93d8432d8155e7ad1a15777d7f5d5fab94797257d0943aed5f16033528a4290b9").into(), - hex!("b9b7ae2ec02b0694d7828a69bbd1fd6e9070cc217319dc4e8fc854e48f5ce6e133fb0d5492e2f87e7cb8d3d557f17037").into(), - hex!("8cc36ade2b8039ffd41459272091d9cc4c46a49a187e18e9e3b283136831724313ee6eb5954c34acf9ecf7d79c30dcfe").into(), - hex!("b89a28db91eb06f191731a927445ca64cb685a206f4d77f335f510eab3a4973eb1d199525aa12df17f97cb4e079bc35a").into(), - hex!("87fb2881b92d5d9a2555080afe033512fd93306bd25f4a841d034c0fd9685ae09ecd29d27523e8f18664cdf2127ae6bc").into(), - hex!("aaf63cd83256de5b8558bdfd7f5fa44b3b3cd767983484ee482241286f82c6f51c1de99e2c03c8c99e6d4a27b7379cc1").into(), - hex!("89b52eb17e1c2868a3da6727e6f122046739c99cbb6aa7e30f65d7e649d09540b7ba77ea3efad77be597e48f7abe7643").into(), - hex!("88d097674b763a770872f17266f38200a4034347756c5ece6f11fb841e82447a75f6f3279ba8ab54e668b2072c6596ef").into(), - hex!("8de58933f07ac60ae919adb4be0becfb5e6f7330708a39cbc4c988c79033f0ffb365ae2a6308c234c218f0e45ec1ce6b").into(), - hex!("a4ec080db7716a0eae593b0ca91a16273abf534b8d153232e4b7d613c9fd21081bc8442d6e57a6e8e026c66c93bf0289").into(), - hex!("b680857b566466d1fb92d78a09b75d93753c275249dd05a17702e48560e4df5c7f9ca68370847250fd001433972c8b0e").into(), - hex!("84ec67623fc58128f4504b071b53e3c0fc60ed07318febc8d450035567691e2e58468b6799e5f3d93536100bb4b5f3f0").into(), - hex!("b22ce364b11e164d3df52050d59085c29c398556617277349637290b193727e3942064693ba1d7bda313905908a071d5").into(), - hex!("876198b5734f1ab5f7ec0231110e9cbe59d116ccc410678d5e0108fae42bab5dcc7cd15df200bc71f471ecbeb0e80d68").into(), - hex!("b081fc87056c34a8a78cc34f308502c5b6509adb0b344e83227b997aade90d6f0f1b8e5302601ca3217ecf9dcfa24ddb").into(), - hex!("8fe71e517db52831a0c4adb83fc6524817b9a358fc6bf58c03c91d4125482921936391e54c767ad2f13071e0e5ea266d").into(), - hex!("91212d83807ca11b030e5ab72ec85a8d13d468c714fc97c20b5d0569c382ee270d2ca486c88354994ee54f02dacbea50").into(), - hex!("b022bf24d2ea893125f3a89186f444aa5f301333f0667eb5862586a5eea8233c90202064eaf9363f7b367a6dda15d45b").into(), - hex!("b1f45fa596a32d3fe267c830eb042432eec6b79efcd5c84ea835d7108bd4290fb64749ebdf7e7e51e6138fedb3cd2eb8").into(), - hex!("8567d2366c584d975bea34d4f9e2ce62a62765125326c5e56b5cda08fd2f2e7f769db47eb514d2d9324b645879c82a66").into(), - hex!("b4816fa77c76e1f75e6fa903a4c0c031ac7a5f5ccb5f553b4eed83bb34067480804c0f6f308f8d0fd723dbe2198b0608").into(), - hex!("a9ceeea8878d799fbb6d52dc4112ae712429b9213f72b284698d68ea6827432f34e51daae1727b5402916a836567f611").into(), - hex!("984c8ca226df18ec574e0fabd6dc9ab3a2e1b319c4b6ab5b19872239833dcf447ee5d720305b2385d65facd297704809").into(), - hex!("b02fc16b3530532a2373776e2512421d6d2e42f3fd3c3e71393706d74ef9324571c8c1ba7b9caf65dedfff2bad946d71").into(), - hex!("849faa2060a75d08850b54e06376f252d9cb4add3e740225ee37d23e29f80cb9f98188a7eaf6a381af4b4bcc9874b792").into(), - hex!("b5331ab6646a8be3bc37c5fec56a597b914683402828dd4098b189f245c638e063c933a542c0122f063f98a9468687b7").into(), - hex!("868d8214f26e14e71ae0bd514275ae9442760af72269790228e733005293019984d3d463c2bb82936193dfae8c267fa3").into(), - hex!("a88c6c4af4b9d285997c9b5cca7e22ab9b8e5873ff36455bab6a6dd4518e966079524f8c35391811f16eca421f588694").into(), - hex!("a6f508524a938fb49a7da70251fc8300192882a3fe784f0bc51027ef2193d90c75d0d0720f2f5be634d81f38f3d85b8b").into(), - hex!("80a923acf2aa0349b4852f47edec37cd47bd74447f2f91c110ed092d015887a6625d5f1fd1f5d00c994edbff1435956c").into(), - hex!("84ed9f1ee0db4c9ae55492fd07fdd44851a6d0209da5b521435229b1b45d57c3b835af627122756ad0e63e915c15909c").into(), - hex!("b4c4c1e6fdc418bd29cbe8082fd774f678dc28a51896a51349c888ec98124b7a522baf70b820ae0729696624f3695af0").into(), - hex!("a8cdde029503aa3e23776a67952b2bc954fc0dc06f07a78bc94e6408edf381bdadc29efe4e5340a9b7efe99a3f3b3687").into(), - hex!("ab02a92f5ee21035e6e3e40a026d8d5680f98afdbf82dc037dfa30a87a1c101387a0085da8474989b24196ff494aa618").into(), - hex!("986c88a5d0bc6ff4127e34e0a5fefc1290936ec88d1765e776e199601f9660a8425c1fc6defff07fb81576461d0ed7bc").into(), - hex!("abe2259e880aa8b587ac9a31f794895bb18ff1bbed378a70fa09388e5a6a7343c072401c856bdd92fc2f60ca11056aea").into(), - hex!("8c04c98815c0c1f281c8783ff8098b0d806039a39fb2f4642a08f821c02506bc7c80ba7a1f4b225ecda9971ee3a22121").into(), - hex!("87b7bb0cce6244aa1a540941f0ff5ae4126fd4c62bd98d34993380a35e1c9a9f43b561506e5eafc1ddb8aef131403590").into(), - hex!("93cdf5f956e8b40ca0e31cf559937b997897c137a411930ca28075899abb6c08dd6aad5b2bfd5c09f07613a6854b3be5").into(), - hex!("83ebb284e03b4414694522caedabb391062ba9ec373e94427feff071644df91635ef498dcd9351ae259c5b15d6edbb38").into(), - hex!("80747223ba06d6465e26a354b79c42ec0624d33cdf015da7bcfb31f7009d92aaf6321f4a921f6b38e0a394a412edcefa").into(), - hex!("967b4b10a341abc5c01ffd413103c6468e3efa32c8ddc7e8622fd3ab2a765a420e0be3c81e1da05679becc5bd03e59f6").into(), - hex!("8a01b90d551f26c265b9987c67b641d15bd3b8e5af5c25472037645da05d9d54c0e59bab32578eeb3c1c5889f4fd9aa1").into(), - hex!("b6b38e40e3fbb31b257ecc18dcfff2fd850a41c2cfa5a642b0c383cc1a86b2b9adbcb22130665f544f1d9fdf87e92dd2").into(), - hex!("b490529e0da56e7e4d4cb2f79b704576c8b6569e9960dafef059dac0144b29ec337f4beb515465a57414d8965268a3dd").into(), - hex!("8a3b14616bb721543bfe007f1a042e76ef068a6e4f8964d68dbb7a733ea92dfe4e51f4008aabaa01a8a3566b00d083ae").into(), - hex!("8b82dbd0d0592d45d6309c795beb42274b74d844cfc393b34cb6992e3b25ea8f62f777124584eedf482949bb999ca5c3").into(), - hex!("918226266d7f02b2081edba64ca4b70339b7a63ef9194cd77a214620bc25618495cb4335c0c3621c75f821e685af3f1e").into(), - hex!("a61f56310689b9f383b45e8c8c647bd7150fc6dc3be96afb464b0c67c6f8c73ac9941bc8a5b0e2093255c204646c94af").into(), - hex!("abe204f55b8dd101bbd554561c1a7b50c01b31c967f6cea18dc898a10021eadca3c314f6b7afcc2251682717540d2100").into(), - hex!("a0cc3fbc4a05e3b5f93f4df85b92c1bed221f21700d8faaf84e99954cf6994d0052c8ba8ab894503b5515bdd1460ac5b").into(), - hex!("a5e5e175726b31163e13447e360f835ca64c3883901fb1fdc275b487106b39fdf43b83ee8f3985dc85157b94aaf8c389").into(), - hex!("b34106e71862b290f7bb47e5492417b07b541fdba23ed474f29d666cfb50bb5a3ea137ab717a41ff769af53ab385a3d6").into(), - hex!("aab726a0317c365aa15ef9527e5101b1a90cdd60888b733cdbd61dffac3374f995206abd154d099b2dfa03dbe666d503").into(), - hex!("b3fe9956454604b2aa1d51480ae96182ad1a8af64e80adbba1034619090c23d0d7ddb4163f400399d5946babada2f5a1").into(), - hex!("831a0d4008865576d9d0200dbe80eeafa7e6e6d442a46ebf949f39e32ad311995535a261795a7e27f2b23a6d506b7a33").into(), - hex!("8d7fe284c9ea1a2dce6ac70e3f225994f65ba9791520fecf5359b80f7c32c1e45e75b8b787ccf24b83c79301e046bb4d").into(), - hex!("b00df7ea640dcdaec66317924090f49380edc5c669ef1249ec8a24a3436b4bb41be0edd4cb0d04bc6ffd540ac8efad18").into(), - hex!("aa55d72470c024627edff24f9a19ae958d6b382bab6a24581183f762d736ac10f189ec3f34a7a41516f81696352f16c8").into(), - hex!("99e172cdb14a23161b5e8aa80121d98e69506ae0ab956912eb2ed959b73ee901852f263cb65798554ec0ee35089b4c03").into(), - hex!("84ce8ec6a7debf3cb2e53afff7d1f68bf75b7b209938192c7675286b17489d7996ecd9514c5233af0a17390b9982d805").into(), - hex!("943cddf3f5a6dc04f425aaca25be44438aabc7a661476761de596fcef5746f9d83c361da3fe1f21227ee5b9bf9a3ac76").into(), - hex!("aa81e66cb01e77c5db882792e9d896c83aa418b12c3b5201e1937ba5b74bf5fda974c82f6f40e3ca48bae72ed93437db").into(), - hex!("83bee12657fb462a5988ee26e2d0ef8b11e5fcec108724f6135e95913d7f4ec338031b697b24fd7a650cbeb088b26733").into(), - hex!("ac0070705c447e635b8df509de9ae03ea9b0314fc58b3befe14c316cb7b70ceaed081aad115a2126ecaef630c6bbab0f").into(), - hex!("a1c9c3b6f28c14ba91cf063153c50253d82440b81dd8ef938e181ef4116ede0b0ec62844e1d7e8b387668ddb8644852c").into(), - hex!("b41811ee8e385836fd709081a9a65a33ae1571bf943937615e97d49aeec3289624882915a5f5b6ee98601e752bac1212").into(), - hex!("a59cfa6d60f5c3b62197d3058a9b42c66bb841ee5d67ae34ad452dc70974de0a56a770c4ee5905c0d214c3d81a5269fd").into(), - hex!("ac47ff714d42056df3962cb4494019c977fb6200cdeabfa3ba85ec7d7d70c7d3ff4aa05e26aeae6ec6a3afa460244ea7").into(), - hex!("83c0ff348f1d018485c18417037016ec592c249830fa649b27754dfa70b94a549a42eada20ab1c4de2a5a513d742186c").into(), - hex!("ac5ddeddc94d18cbbad0e1889a2b64e91b3f927d3eb666ba018807f1e4e1451a43498ebacf12fd370b62c5386e36fedc").into(), - hex!("91606f0315fadbc42b1b27ff35b5601196a7a8beec3d5c76643e38ef28f0aef0aba9123bac7ceff0b297ca53727edbd5").into(), - hex!("af9cd077736f17c89ab4fd21fa2cee63b16f67277e9c5d54663f6d5a7abc3141f3045558899da70419b1e92ce88eba86").into(), - hex!("ab0757213aa3fcdc326925e0dadc2206f43c53f7abaf34a077f1cb29427261b4bd9981dbd1e33fedbd77fe00bbdaf8bd").into(), - hex!("8c97d256f9d4e0f309522f3899c5f74fd7e8c4dab6adf4886e7b058b323e294229fafce28871fd39e5c43f28c670b8a0").into(), - hex!("86eb85ad6fb7a3d5cd9aa5b22fd648fe9db688fe663c835abec75a6bfb67af0df0421d24203083aeb8ccda06dfb230c9").into(), - hex!("afa2dd3712eb94c9097135a69573c1f373ee0d7916f4ccec5a62445726aa4c1548bca45038e1a44ab7c8b7e3ea22dd6a").into(), - hex!("91e82407c442937af665ff8952d8b7ce3d68ebf807166aaf0fd710b76c65b39283e511b3314297ab0f2a9c8a2d76ffbe").into(), - hex!("a52cdd05f6e254c6da7a00c9210e33a49658f035b78bc7f15b527fce20c3893d3f7dc27a616eb3e107da060df251b082").into(), - hex!("81e6ddbaad6a18404832d2923697ea8df8dc3b39e53390269f197b976b5edbad074639e1e7bb25ae87b00681973fa021").into(), - hex!("a776979b38184661cc36ae9bf99b98cfb64babe37b16ed7e16e33e2187af71d9f62af4fab2bf0671baf3172727741d79").into(), - hex!("9395a004323f4ae604518224292a1fdb359fe9d4ec2a2262f13fb33d90a9dc50040d03fa6315a5ab2db043e7e16fb971").into(), - hex!("81bfad9e94c00fc810c4e63042fed6dc54c7c48637064376d5a4df8c8d6be3c2eed335640bf45bb8df99327a7e070d06").into(), - hex!("b6b38236ea973f91eff175206c4328cb97335bc8e498d9c9a2040468885f7d8464a8a1168929cdcc4c59513885e1589c").into(), - hex!("aa14a7baeb7b6d0048bdb8c772de512001174f764b37396c6481bff5aad30abd6143e4654a3d80406f8d08948ff8145f").into(), - hex!("a7297d6c09873e481c04f2e9e9a07567d78da504d2929c8b9d8ecae1c4d919611e061caa632776a8716b20e031cfd203").into(), - hex!("a0942935f58ef26a111d77b1c4598207eb6e3414c106b286f1c4dd344b3e70d3a46595ebb657e43f0e71dfff3b532382").into(), - hex!("95dca5de041e96f8c64f945817ab1ad62414b3002073b18331e288878c7a889774468d3c24f04e0714958ebd79ebe71c").into(), - hex!("b64f58f4eea309ea03c60f6ee66107fbe45c5ba81b8ea397a515435a179ee86bd098cb9acab4f374d29c8a388152fc6b").into(), - hex!("a70fe2ce7cfbdc22183a1a81c779c6071199768ad9b39ad0727ced4fcea5fc79e9833279ce93e1ef16cfc6dc0ef4f15a").into(), - hex!("8169d05ef0406b661022af53dde8ccd7315b3e35065c568673bfe5e59828480312a8ad418ad431beee12e7882d11142e").into(), - hex!("8148070a20eba3b61bd168e00ae8262d698263a8f22ee01ed6d46d154a08708a85533f54935bf92ee6ab0c04569eb3ac").into(), - hex!("b5e4f8b8a011c9cde6a9338d7c751ce2828fcf41b40e140ecf543150a5b4859f87836461d0ea2ed7cd0e6bfb8febdfc7").into(), - hex!("aab7b0022a1791339fbf567e771c43e9a2a46fcfed394b7216b556aacdebc259e5fc599eca66b12c23467b2443fa9c76").into(), - hex!("a843e5929fa14bbdb5f370d28547a7b585443f4d2fdf8e7237fcbb93a5220d62c8033665996f36288127a2bb4822f357").into(), - hex!("92a5abe1a8d508193c88827f93156e84199b14731a68b0b434663e5b9ce8e6e3005ccefb3ad8330c56fc0898eb9334d2").into(), - hex!("948c5a4bce25157f5f779fcdd89bfb4747a6178d464d15148742920aa2ab7fc63d6989b586152e1e79eced93f8686206").into(), - hex!("8702f3fccf470a294946970f8ecfed499f5ab3df799601f872d7be3d9227ff78a764550fd1a97ab25b7be96d366c82e5").into(), - hex!("85c5f99e913f1cb67a30807386b5292c841b51e959a13912fef2e0f4ba84ab3b1c483dd5fd33e80774de19695b622888").into(), - hex!("8a903e39b9b46dcaaca4fc968b298430b982ed3916f8ad533ceef5131dd507f1188fbe856c80bedc7bf34799743fa86c").into(), - hex!("a91ecd938c2a399b97576c43c5d1621fe748732090e360fa1e3ddd145438f9569d39a7be9d032b435a5d14ca4c905d15").into(), - hex!("aba9def4db5bbf2ba185c134f7734feeef976573e20d76aee476bfaa2af389ba5576a1476aae2d42d5470a46ca3f58ba").into(), - hex!("91d3529480d066817c0111bbd92714a40472ed6c877df358de98f0258f79fb8ccd54a4fa8bab3b9cc15bfabeb620c196").into(), - hex!("8cbce4e674d90185c47225c587dac654428427cef8a563cb89aee6fdc2ae6f12a8b11be46c779ed9afe38ea97d7d71ec").into(), - hex!("ac684cedfa58b2adbb6a13a94aa8398ef4a14970f5a43a344986cab68fff7fd48f7bcdc0506026eb0a2867efe86f283b").into(), - hex!("a21a2f8df2b811550d6e115c095d4d6781a84ba25b7f4017adb318776ba7452f48ed8b83a6a94aa68d83f2226a4c0549").into(), - hex!("a0d96e01d937144627c695aa4256f1d1a16c708894ce854f5ac656585e6852a43c39080909e7029b6611ef519d9983b2").into(), - hex!("a2f32ffa61e370d087058cd3ffc534da6a917f75ed5de568938885cf5220d474c930ba9bfdce91e031aab3b3167ad362").into(), - hex!("aa6a7c0162520c6706ab0f6188b718c1909a4aa12e71afc1c2d40e51fe44f667db0e7f1f0cdd81594447e267720f2dae").into(), - hex!("b4f16474ec3f37765e8750729f3245167b82472ec454329c9183a5d5ec939041d85b83523d11f2b895e2d15586f81422").into(), - hex!("917af7d2995b6466baaea2b3eaee5f76508d0c117d0452bca6a07ecb87c0cf595161abd5bd31a904e05684e55475a4ce").into(), - hex!("93dc25ff6a8ed93fa40d198a97955d40a5f29e50fc6fa6dbad34582478d3d1bbac0ec5789f11a92a738e533939c281ba").into(), - hex!("a41c824ff14ff5ee486a6130dc6cb01043e59f71e234390d464c95ac49ceda8b5400079ed4edecbb59be2083d8f06da7").into(), - hex!("850da042d678ac0aa31dfe0eca861ce17cc306188f260195fd10f940c67d42c9431cb68a64d27232e989c9c23a6e3d1a").into(), - hex!("a3e223f30d9782fa1fae634497c64fc58bc8289e48a67c8517621918e2b921cba1e90b2b01f838ea36071ed89bf64ed3").into(), - hex!("809001b01c33bf49a97ab6fbdf708fb224879c71679a2b335cfbb3cb4aba3201a32113de289878606c9feca057d9faea").into(), - hex!("a10ee1706f4c49a9cb2fee4ec6a0dbdc883fe40d4e1cd7a0388f49edf1f5f23a38e6075fa5fb54fd8e77ac3742266a6c").into(), - hex!("8c96e17529d7051f09f93faca150f5313e4d7f32235a4af6d12270780d6c14418749489a2674c728095a56585e0ed924").into(), - hex!("a9a7bf56eb25c9bda003a70128117adca9c33c6bb24bb4c381ac405e014d9c75aed0d704d801b9feacdf81c3b7f0040f").into(), - hex!("ad53d11d31bb9ea53bd23d673fb26211ee39ff4442e9efa1259bddae866e97bf07b0f9ca44e166b3b85d19b5865b1612").into(), - hex!("95e86d1427c8abd87e7f966c2ff9468d0bc3f76175bda677acea5113b5bd0d7631972c4172220e3a72e0dad1496bc14a").into(), - hex!("b8894228542dfbbc6eb65c9adf6549eb4ade838701356e7d672c095b1f997be5bbf3ff19474ee99e81320efeb04cd529").into(), - hex!("88bc36d6d90424e86374499e330ce5afeb63164fe81fcb4d56c5c997e07093a37df33437389879895c8b2cccac28ed0e").into(), - hex!("8ec1d43488aebb9544ae0a12ac7311bf873bee05caafca5176e26d681b881ef6b5e3ae5d9853b33577cc21d3acfa1e82").into(), - hex!("aec567db9a542eacf68cf4b7b9682ffe0b385dfd192296f8d8cd9e1db9d7da0b4a4a0d0ec2419825177413faad458cfa").into(), - hex!("ae242e9e2c7ff2c0898f92e7e9742ee5e19376ab97195c4eea0487490068199d0fd7ea08b832c43e208336b5c77d1947").into(), - hex!("93447c215479b68442636384d29fd5b4815cff904668e909c67fdcef1cf5d594219371f62edf189d6e54f04872705947").into(), - hex!("87f993a564e69e132c6cc4874fefd83bb5032b98bda5eaa8fe9e1713baaf08486aea21eac3231028715e846e33a3fa23").into(), - hex!("a9c4eade07d3d51bf733d8357005e08a5f86cb44c3dc6b66dccbdbb67cb5727bb456d6092418275f34b59063b3fd64eb").into(), - hex!("8939e3cc9c1dd203d8079aa4ac0d40d2e1b85bd876616bc6b589b0bd187701fcc36c52d79ec7f14b5e54fff459c99028").into(), - hex!("978122dfec6fabe4f737a3c9326f2f721cc212455001ca7e09b65b70ec1ada1ae26d451632f31f648cbc65a3337250c2").into(), - hex!("8d1eeed7fb1902deaf7d6dec7c86807c4aa8ea1d7130d6caf01d65e36f6a30e3442a97ad6918e67d2e17fff4ebe7a97c").into(), - hex!("a16203ba484b5b02a1b210d487a54c3da41b3815c307a30fdbcda0c3f5f2205e16bc7232e1b8d57d5f58718ed4941ec1").into(), - hex!("89b4e7bdd90323c53aa502a9839f57133ab0cbae1cb133fd0beb54f4d7785988eab89eb0bcdf61bf62a29b341befb883").into(), - hex!("b75550a71a4144a4f23ee27d86c10c44e8e57c118ff4f9a2685762a98a3770a6c2d1fd9229f9792dd4e784e8b2eb675c").into(), - hex!("9171ea1599ae47b04ffc307dfe5e49da0f48835cda926355606ddff47b18ce3c224828ddb942e63dd8153c273105125a").into(), - hex!("8e0e78d069f4d51b9b0c370100a9d10e395b8f88d009e33ed7fc4959bf140176cc316843c76d2a741a3471d56ced5db4").into(), - hex!("aad6b97330e76b22781e78ebb2fb2e92148d74546cddc7348e7a7f0563b986a7553907c8946258cc343a15a8918f7491").into(), - hex!("a9e8e436356d44c945d8248d249e20f5c50bd147de94418d4f04e1f67be2319e4d2a7291981378a1e457874dc91a9948").into(), - hex!("800b092bbe1f56e78d766c510dfe42f0d6670335f5931b3f821c77689fc11a502d7c82d2d887ab21caf312f8e5a037f7").into(), - hex!("aa8b05f90da0056b7659c26171df70c748d7a8fb52bfda42b7d129df386de331c1fef9d5ad1b19f0452cafbb813c3ec6").into(), - hex!("a6bb8153637b097a905342895ec1c927faa92ef8d59af86e43864ffeb6b8caa3f5b025079ccfa83214332aa4f6b71a9d").into(), - hex!("8244cab3e6f39492c8fda490a363dcbd8af265dd3a158c2af0e66182b48fc2b49f473b402bbf0951b42da5bb669504e8").into(), - hex!("8696508e20c144ef2cd954fe420c60f8432529b97a865a52de5292215c448984dd591170d88c286d7bf5a1cf8b94ae53").into(), - hex!("abb5b057c6b91d51df313b4690b15a218dfac6a30a05041c5cf451f515062eb02c54ee6cf6ff2df7640d15ddc7a95dc9").into(), - hex!("ada583911773366a4ca0b5d407520a590e4f3c6628c6d050f2641655d1654809b886807c1efeee9e9ca187b79b7676c8").into(), - hex!("9730edb86b7161715296bd5267bba55d3bd956dc9f4c640df92cc8aaeed8ab2dc1ff74988ec2122f6c3ea57b6e30dd91").into(), - hex!("8da42bb48c6f17c0e96b5edb71ed5e937c9aa65af142234e3ce61403df7f6ef05a4309e92469eaf68d83afc5bd800373").into(), - hex!("b3cb17866a99dfd048c4ad6024823841eb6602c7e4728340f1167b8af3c810926f0eb3e1a0f51ed6fba4a80743660db0").into(), - hex!("af121178dfa05ac08a2acd56f895f444e56968b703ec6b6cfae1e836d78afe6f51021d4a415aed89913df49bffe27ec6").into(), - hex!("958d5dad1aabe840881f29617dcd2f759f220974515507b0a63b3487b4cbfec69be7d22f4f7f45d693101177ab205303").into(), - hex!("ae6160e53c2c9ce5495bd0f0476703684d854048f2a8bdfeb6cd1e93fda36e44d879531f213feb1dce706d35f9fbb04d").into(), - hex!("8dca41a5808d3c75f41919cbe65a226355df9ebc7c1a2d2263d654bc66d1f5786ffba84a1670a7369258bc92d6bd68e6").into(), - hex!("81585a607df11d0a5dd778adfa1eca440a49e37b21677fe88709142243f5ffb2205e703366de53fbdbe3d7ded093e834").into(), - hex!("a80b1f358d284d3d8b18ef9f101d4f0d84c2ff99342e7150a55bb2f54ee231e333ffa930487a86e97f460696348e897b").into(), - hex!("a4a1f79af8ca4a5c5b44b05828449002c92c313c8bdc33465c099ce8f74c3d575ffcf0ac1ec5d29e80ff96b07f08636d").into(), - hex!("8797e455d44ad2721ce7de2fb8125af1bc4c0757d9c2fae25394e44b8952dc5fa597e0cf5d2b1c2ce996e380597a1db6").into(), - hex!("acd840fe9ed7f38ceb48d65c9f9f02fba4df0fd871efb58b35547c9b526e6e2416195d2c131a04408df7298db50a76aa").into(), - hex!("a9ae67c2d2bfe04d64bd4def66509c108f9ce85394da48d97407535c1aec05df39e3f7c66203f72bc65fa72c18bfa77d").into(), - hex!("abb785c66a7aa06200bec1960c572d61a9cf2c283404601259ba720a506b3831391e998346ee73392a3f7f12915b6f6b").into(), - hex!("8a453eb657c2a85bf93193d47ec26102c4d3adb666a7e1f05f1991782319bbfe104cea57ae1f4379cd115ff711be67fc").into(), - hex!("96c7151e34ed488a06946059722dd9d1b5a2ad2fec96b545ed662a3d0fc23bce6973d93dd2932128d95b0686f9208fc5").into(), - hex!("b5f39ed29d3f85e56e21ec2bce47b04ba16d72a9fad492815b485a93065f2a83dd46f92d74274f815c84792278a67cf0").into(), - hex!("ac9449a216a875c2f288e34443a94a521f8e9de28f70b729f393a483359ffd3ef8537b8a798b8c9a259ca390f9fa9751").into(), - hex!("b15584e841de0e25a301bc3378e89baee55989d9610c513b79748e7c51c484f7bb1d9adb33f3b63d52d36918514aed2a").into(), - hex!("b4dcbabb43cf694b024d36734baf824830304257d959f6300ce17f892a23000e036c4d3d59d7d1198bf4f6ad5ff07e57").into(), - hex!("b8a1f0a8ae246442517606f34ca4029deb727cab005c9952ee9858dd99497ba8a0e3311bd43aeee35275db74c7bbc52d").into(), - hex!("b1c443db1b5a00a87a399880ccbff4481f5742423c47d38b175527e84b32fd66110791c117fdb70782d75c476683f9fd").into(), - hex!("8e018c4b2b4cf1f1a417d00b13fc51ccebcd09a502bb14795b8274585d2e30d71c2c7a9b9f56a717f0676e685e65e907").into(), - hex!("871ea4444c7080995472fc8bc08f9091f9f706e9cfc49eeea5357867badd837649f059163835a7ad7263cf03fd13b198").into(), - hex!("88b67b5819119372e0fd7f97ba1eef877cc32d4be465001c35096adfa18e1811bec1620849a608de8420126fee9c37e5").into(), - hex!("9060dc7f55fdfc237799a2814a6bfe2d2f539ab76c38a9b1206890323bb4eb7b1ce011ea4fa552b412bbf6c67a95f025").into(), - hex!("8bd156a3a54bffe373fea65ecb2ffb12c96f04e07eee582200a0ade24d543bd6523ae5eb8a710c1de1912b2b4712fa0e").into(), - hex!("a8c3fb552f1a8c6cc2714b97d0cb8b2b6028bc3aa4571a7e3e33f46eb4c150771556c7884d575ce8fb7b62a5770ed2aa").into(), - hex!("a808f5a34beb7d62d23405a64d27ee5d7bf83cd880caf7bd4a615b84f22e1dbf11eab129d9cc9ad90d4e1dcd68613f0a").into(), - hex!("ae56febedf59fe99e79e87d7fe7aea5989493833a52f2e6012fd3400c69a6dde951fba50e0c280779d530d74452d63f3").into(), - hex!("8ed5f6de4a3ba85c6c857068bad6432e96c6054ea38ef07391b914c052c2262856d19403a590e8df63c6dec99da35b68").into(), - hex!("89c01fd1f37d826b9ef3b73e2b1aa5f4b4f86a263b2822cff0153fd2b945bbcf16eb3868ce66910073bf86b222becfc1").into(), - hex!("97b3ef6e0bfd3c399ec959d22d29fa9a79fe8746eec49e1675afbf7a955d02db2e89190ebf43118b65a7dc2db0c4d72d").into(), - hex!("a95700745f0ecbb1e794f4db9788af60df4772b5ffc8f5f693f213ce6230810df31716382dccd5a832ced7f34945d144").into(), - hex!("87d0a6a8cdc36fbd788bf744a443b632369fa0cd983d2b60e20856533ed6451d8476b9b3cff39ed0f75de94ad5c7aa48").into(), - hex!("a14c6f6463aadc8d1d2985b601bae8e74de54954ee7e3aa918837064a98efa5ab736628446582ccd13bd458ec2d50b1b").into(), - hex!("8b68ec274484c910f1a73a8cf8a8a149ff2942ac9de6e73641619fdd9e778e9c0fe6198745f049fa9fed9e56287da0b6").into(), - hex!("b77e981a03493852e7ebd6efecaa647c69ce6d46b2190bb2d08f0eede4addda776fda92e9d943ba57331bc985cc8e112").into(), - hex!("9870ea49ed03991dc1a4f47fc978618d549b4f0ddea01d91e7c409db775c91cb2a58c0c0c57eb73e7b6d3418f850b0e6").into(), - hex!("a518fea50400ae263ab9cea0180079d0d353bdb7cd440cb4d2156b9628e487b704630d931bcab742e0f3d7230821ae91").into(), - hex!("861ba1b761d0ce92972f28b7a65cbf6026bdf7427774fe78ff1f45c67f9083fe94fd2c42f47082b6fba722abb648c61c").into(), - hex!("83d257a40e8418407c80851e2f14d0bc47c3b9ce9e2de53b5c6cd99f31dd25dc200fa90c822060d47c4225d61560706e").into(), - hex!("881f7f674959e4176731ecaf6e2c9b490e70c07abceef15707dba8c9aa3cfa2293a96bc9d5455f769642c9717a4fe949").into(), - hex!("835116735f8e21064c497fb0dcfc929004ae5eea1f3e6863ad0b227c820d36255230090812da0800e03af9fde4354a13").into(), - hex!("98d9c12ede55af8067af5b62b89002c66e3b6556ee201ecbaf585fe5026f997fda75105068d62fe5d2403c6c64c314d8").into(), - hex!("ab359e8e0ef4cbaa9830e2aab892db7cd7ddaaea54cf455c2ca24f10ca337f989641ea33fdb1772ed90a988083405cb6").into(), - hex!("ae9ded9c9fc4e812dcab3d8a1c74ea264eab2df0715c7107ec1ec336c0bb5f3761ac9580ca18109278be5cff837f754e").into(), - hex!("b373013674404122f39dd6fc29abef1b2634e2bf650b42c15d5a2f7d762eed98166be26372e8dc6bddeaff84cc2aaf4b").into(), - hex!("b34adf4c3acadd7e11a9d61f7df20cb2520cdbf2d16c217f39e3afbdf2180abe59d37115910b77a504b81a6000b982c4").into(), - hex!("8161d446296d39d0c27a3db1bcbf0619e0c49739c655af49f49ea8403374afa4f98aaf530413848b7d4b53eabc16864a").into(), - hex!("8256cd8e3c9354ffbb59818f0b24db969a7765d64c2fcedf591ce65f619237d6eabd110293bff42b388c9965ff6d51a5").into(), - hex!("a1c562787d2ba1cb64dba278080fccb1c6538ccb00b94db34b62ed1cd863792f8acc4df78d181badc38dd9bda544e395").into(), - hex!("94ad66b4066f53ff299dc4bde2bdc23a891959903174e8ec08dd79f163c6f4661b3eb3458a786bd8f3fa153c806e793a").into(), - hex!("ad1a50bcfaa5641422c6f10d31316035eaf061ad1fc0a36c8835e078d3fa6efbe6dde4bdb28158d9b7aa74fd9241523d").into(), - hex!("a5952780f78fd6afd9c31226a23d307be72aefe0bd99c32a139c3909b1ff1769e2441dd2c03f33cf98df25c76178e492").into(), - hex!("954100f83b800dfb89721ac06728c3d5e8a8edb7e1b56513a63c2b49dd44b9930edd897fecd262984301cb6df23a338d").into(), - hex!("85de42b8de3cc88181a50e9aae696d92e66cabcc7b86425f846dfac138d26eda7cbc420cfd10f5d2681b63bcf411afcc").into(), - hex!("abeda3b142d621f94f829ed4174d042461e95d978be206fd31f8661263bb7a87c648aeff8bf640ec173a77ab0970a93c").into(), - hex!("af99434f06a13d9c5ee7195ce58beea07940949b686b4ce06727bbbdfa1621c608c891227e2f026bcb58c60a6e925533").into(), - hex!("96e97ce1ed97b8afbbf282bfbdbdb4f863a6931cc781e9d7938617310ded35dcf043c2320507e91e94f470f0cbb98621").into(), - hex!("8693fe1860981505e4540b79ee7a7ef33b26535cde6e9aa019bd1e0d26f359a2d26f0341b7c1634eff1f5859ed3a8625").into(), - hex!("a94e940bc2d8f826c23bcce8fc4e49e29c5f918180f566a67395d33cd573e6dfb149490de1ae75068feaedfe6cce0e40").into(), - hex!("9697d6be370d808a49563e062c2b3a0b347281e00839dc3dc0ed888c623f346a42094fbe2489d0487049f2fe47887cb5").into(), - hex!("b06d4cc8e83acc4121bd278784061f6fd391b3ac378fc6ef46ca2158207f5c0d33a51d3dcc4a499aa48e5b27539c4a16").into(), - hex!("972aa57628ce57381aef9710ebb7cb7a8db28b1b64d7db8be38936479f39772c60d766b0c5dcb79676e9330d0406761e").into(), - hex!("ad2164467404544aabb70605a56e9b0f7887491a1691302b2bedf271b50cb6f1bea1b9637214aa3624f5d8f854359607").into(), - hex!("a9da2595107e9db07c56a59d2af529b036c50033ff43c282e2da551bed8faa96eca744881e600b6406569675643046cf").into(), - hex!("8680660eb867978df2474b25e225fd7536b88e9e73f0188c0dbe835677de701fd402916d8e3d17fe652c7ac6d2fa0330").into(), - hex!("b721e239f50bbc7af5578b75c8befa439474bc4e6ea8d35d1006ed54c6d81c718fa675901df591a69b4cc30899974362").into(), - hex!("a8af30765f1b00ad51a32d856a2b2f97831843878a1668a43e66b65b8d0bd4a2e2826fef5ca5bf140050dd81eaa6174d").into(), - hex!("82baad156e89d7b3da9ded4516603ec9aec36e3a0a9bdd0ded604e4fcc0ba10179f9517fc8372d3743cce5e676c8cd17").into(), - hex!("b3392745016dfafca36a7af4be273c5fb4170b71938d6b93691d7a3bc8791bda537ef001d19ffcf7b393a89c898b8b14").into(), - hex!("92f83c901eccb742618313ee2f5ca571406bbfb1d077ebffb92d52ca962403d34a24f9d333c3a155bb9a72a0fc2eda34").into(), - hex!("9792598e2f303896010e35bf670dc2f3799cbe6f0c66379030b0ea01b44ebf24b9257841ab80d2d6a401fc56bb722e68").into(), - hex!("ad1a3c9c5d699ebe4f1b2727dc94b290c84f44c9ffb38d5498b14fcfc5914f4ef4d1d57853e036ca11e42396808556cb").into(), - hex!("90729c7ec4250613062a4ffbcba5829743ba7fd03a4e3407c2ae00b4513c21f3ebd68d10759ac4dfda5544e77b2ac306").into(), - hex!("840add692580be7aea866045826baa4a07804f8e3f56593a2af6fe317046d7d0fae181632f4009ae0d64dfacd4600c4a").into(), - hex!("b1be58941fe077aa8721b020f34d3ad94d1d5083244c276b7f3e6f4c918517f8c5c8d5c1376178bf27cb35ed76699e6f").into(), - hex!("97ba3e3be55d17113fb63abdc808d89fe205d75fc1ac808ebb78ea1b7570f7a014fae099cbc4b2a4b2ec884977405f80").into(), - hex!("a2c57bf9373db5382465ce924bf7dc4e62f406c187a39ab456a7387ed9231ce059d197f8701af9ce2d6cc772367ecfde").into(), - hex!("a62ba8b81b9f8d40fad7fa1d7e8e49ee547f170889b5d6a2be9e2ad2ab0b265b4197fbbfd3b17803a6e727d41cba83a1").into(), - hex!("a94559a51d438b194fea96975a4571a118105479fbb7a37abc7d676fc8b8d2ca30c66b25b7727dcd297384773ddca074").into(), - hex!("957f9be0f15d8eecf621eb0978267c3fc85607f31c501179d9c83864ed9a9e5d526aae278af3767632bf56a20eca62d1").into(), - hex!("b89928c19d1101486d4299c493db5bb72f56f8bc24b71bb54eedf84284452250427b179dddd7fcfc0f521fbba09d0c5e").into(), - hex!("97dda9cbf61015b296307e510295be258045a1de9de52117f0aa28de48e27ffd24ff711f9187936293babe89da226fa1").into(), - hex!("a66b4064c5b1ee95a35a93209c89206b352e0666abd1b5c95eed3c382210334fedad7d531b9939cdb2fc649c4369236c").into(), - hex!("89d85e413030dc45194b2676a1f2a76801920535ccd909277af1ac87fd9b0d16d94d8c62a421c9d95e7a053cc4c3e0bb").into(), - hex!("b8f0350e1ff988bf23846f2d64e40b35a370d1c5d1f9dca4021508205611f788fe5485e966ff2bb6fe8acc1540a2e751").into(), - hex!("aef9ed7229aaadb1ac4344e5b4d0eaf9b89b20d50d8ae8dae24294ec3c0f2f68dee3186dce35d46020d8d1b2626a29e3").into(), - hex!("b9362f34ead1b0cef1fa9b35b76b644a323ff71c48f375c27e22c6878cdf778b1a3125445cc8cffb6c8b9a3ed046c3d5").into(), - hex!("b69c578e2223f3727b7b5e99f3926eb7424869b356541feecda54a0882e4a009b182c358052d788c2a7e776768ce2b7f").into(), - hex!("a9ab536cca003598d88f76cd0d666b1738802c7452201f5d99ba4fd82b6d7da3c9ad8c4707445d6cb4b2c43de7ba06b8").into(), - hex!("a02648e465634db73fd49bbcdb23cb6feed9688eaf4c5678799734d49f2d4cec9cdddf598114896de961ebdc07436884").into(), - hex!("8253283df9690e171af958f2a3cc37e0b2cd67768f2362bd604ba5c5db8d3500c0d7d6cdee982165eaece63bd016f2c5").into(), - hex!("a06d8256d22ef3891a751716449f97d374e27bedbb9dbd0f1c9528307787e4d9ab9450002bead2922c31fd4ccab9abc9").into(), - hex!("a3bcf7d7c1f1c5a2bdde1e0f4cd3cc6dfa061156534aacd6318d8192c27218b6e34e734a118a282b0d5fdf639e704c21").into(), - hex!("b5577e876cb3de8196b485ae828362419c2f7f8ca9c8f38b1254059873fbe53b57110be543c864bbcf8b485f63925169").into(), - hex!("8410e1b1ab99cf1868fa4494dc75129f42a5e633448e64321cb379175cf6eb704ad6863e3a6475f9cd3cd3f1fcd4b49e").into(), - hex!("b6b21b346d709d4897da4c535556d599486878f5c574bca2823ff9d382fea2f45e8d03aa0fc5a5d623098f1b67c77a60").into(), - hex!("92951386b734171accd57b66afad7ddd0ffdebbd9da835e273b11f96639aefa6259a1387fe3947f9f7eacdcfcbb54b65").into(), - hex!("837cca28b3bb00034d619a3b667b06b66d7cd351ee2c161014b4c33692c705e0fca1352c1e5a7fe8ee00515f4b9c9658").into(), - hex!("95589319552ee815c1e1b053cc4452f9ba600142c37bd700feb3c27468c769e45e6307d7c0a3f366440cdb4d3b997d1c").into(), - hex!("87ed23d8d5fd6aa0922565367ab405e666996e7b918795da299c204cb6d1e51a9c6ff1760dc3fde555b0900e677a9b9a").into(), - hex!("88564f50eb215320ad93b979c617cafcda9122ea02f113029702df1f39116e00b35e0beb0c70bb7d7f2d9b4bf68a1419").into(), - hex!("adce6ad54e5d24a2da5a04751151034245184bd7e61998ddfed673fddbe4e3d069b580e833b3bd4509c30a2e6a81f528").into(), - hex!("80800ca4fa6d0f3ea555ac7d37e54e7776f640f76fe89cd7f172c74723cdb3324da01314c6f66c4fc404c393aa8c7841").into(), - hex!("a16f473cbc9070881b9dd63be9f99670ca571822a67520cba885b2636137731b440561f83e199713ecdd51d4dd542997").into(), - hex!("a08c0625cbaaaba847a63ab4a96206bbcc7bfeb659505d0b6b0e58d22f00aadec41f8cd62ceb116258b78063f26796ea").into(), - hex!("a358200c83ff15fe3fef7a1610bfacdf86d55452258e7f4701082f993c8bd5d234b4d86f96d444e96c01367503663886").into(), - hex!("97278525e5e590ab6cc4fa4a1bac4ed7164a65887b29e658bdb2146008b02907488565dcea09e761f6922118d9933ed3").into(), - hex!("b4e76e4cf2c711a7f3be5b404f076b9d2272e15ea7c61fa4b7a14c5608c352a92fe6674a25dc493a6bc9e864ff4b4a85").into(), - hex!("a4612d268cffd31d092892268e6b4f9f564f0036bfee4f200d270a61a8e5e239996d288d28d6f281d8446a88da56cb55").into(), - hex!("81a70c88fd7d99165b41ee12883ae529458758650fd13001c86f8fc6ce5f8f9b69ce3a133e310619692faa1580dd5d67").into(), - hex!("a87124cbaafc8ee5418639ff27795003a43ac18d07a60fb8a1c155c5fece0f8b25525166ba697e07a5f2d47af6cf0bec").into(), - hex!("90807f573a322aac9d1cd546100e49cb8c771f3d32c89da1890c1c819d90b1dc668c2374249a093c0863d5988c358d4d").into(), - hex!("90cb26b40d10f193da22975b0507f04de6cd9d002e33226852cb40d948d1814009a39332c75f1067e8192b0c9230ce63").into(), - hex!("aefbe25ad8bef226d434b970bda8a47bce8269ad69cf91e02e04208a74055ea79a3a7dbc988981b79bcb9298af467e62").into(), - hex!("b4932ab425f4abad270b32b6f66066cd01fd6f18cf8c84dde99d21c9c2676d58be4f9ea5ebbc454c9d9f921c0333cff5").into(), - hex!("ad19368c70cd241b1a90e5b46f34c44351d298e2fc9ee5906596b20f5aa9e592e878afe8924aea112be60c07648fef8c").into(), - hex!("8b2d2953b4603b73bfb1edda8313cf07f6d9d16b0272d90bc46816677b602b4a7e6fcb36c4f69335918f1ba4ec95dec3").into(), - hex!("ac64d362f730c790ee3f9311990d9ffa3b99d4952ea74f63d141360d2edb7fd0b70d94e5865504af3caa94b63e34ff4f").into(), - hex!("b71ad17d1cdf6be4b7f0bf7d3fca689d5a69a7426dbedfc137bb162142d26e079f49c99797316e2a577225d881e31a04").into(), - hex!("8dd692a01ecd819981ea31f39a5950bac2af0deafb35323358736bc59f8fc69f58c865ed9cfe239ee34d6f80bceb562b").into(), - hex!("b2ae1f2d871d48b6157aa9d74c24e3fa3f09d6c40f421de9c545de5ecdc44d44d6c4a7caff315694d8173974b92c6119").into(), - hex!("8c934a58d5d2c06221c10c14f08f17265e918c6f7f158f6989acca4b1bdf3db58952e5500f930af02ac3e6e44133669e").into(), - hex!("9466e7c328d12ad5439ac01c994825a94665091aa00e212a75c4ffd39f4473a62c160d63e568b534dd7d5577ad266544").into(), - hex!("8e35a84ca6f167c75f98728000b5df8d9c5611080d2dda8c49f8d4afd2196da349cda481fdad8a0e7dad1cebf4b82446").into(), - hex!("8ec436a9690744a1c6a31fa796bfc8f054ea5efb1c8d6a70e9094dbdc32bc199a7c1b29216d706616029525883a9e342").into(), - hex!("87cadc50459a643648f5995ff7ac751c24454040f788e218c4894854ac658fc64c2ea0a8cae4973056ea11f7bb0e5a26").into(), - hex!("aa5a2d8278dffefc43d598186f1119bf1a6d2343143f4874aee24d3869fd4b58401e8bb220f2a228416c89c1f5344af4").into(), - hex!("a36f48c232cba1daae013418421fac6278bca09ee3816eb46cc4059254f1e7672dcecd6eebc9bc0896e96cfa0d8b485b").into(), - hex!("937f8e28abdb3859575cff574517975b96ad41dddd4efb23af86429b01ecbfea553be6cce336d170116752118368e05b").into(), - hex!("aaeb4e5c7f67ee23b1976b2e86f2897ced033e79012532599d130cdbe29d8cd551d9451794741d2ede8564af9070f07c").into(), - hex!("884d9608b7556dbddd0ed13bbe04a5bd9f2bda0bd090d47550f7362bd769a3b3dfa890191c64e44378792d97ee4df5f3").into(), - hex!("a8276ce24aabe42cab32ba7d77c2ef2ca84b3a3e3d750f8d0385f9027f0e009365c78196638dadde186bf44b780fff53").into(), - hex!("9148c5c797b4a6438360072c463008df8b17978335f36d4972b4f826861e8a175265a9eb00c56f47d3892783dcbd080d").into(), - hex!("a7e5100f51c611f010b2601d340ad7aa65bab89c8aeecb181e76185f3a739892f8b172e5cd2c108d5aed8f5cc91cb6e7").into(), - hex!("87c46e67d6643c07e0e318dcb22032753c624e646e4871be4098005100b306f3cfb25b6d81c718e83b42b92841c577d3").into(), - hex!("8bf429c735133cb05edd9b8943b5d4040e83191553452e69b3a1fd06edf2a9eefe8e280cdda811795e1da33e41e58345").into(), - hex!("800ce4d6c257a365e5d8e1bcde67a38c04ff723e38b0926af8b9fc352545317beb40621497aaac8d0e5da291c0208630").into(), - hex!("a5c795afa0ce78cbc11de13c8f58d0bd9ca5b8665d5d8d28513a0d8666f9336b0dc3295557801ba253983fc99f45ce3c").into(), - hex!("99e3e4a8e16ed2ea44aae56b537ca9b159d57e987b0511b6d34767744b04700ff287d431dcc6c67d7cba5748b3580899").into(), - hex!("ac88e78183973e9730ff0c88dd62eb23e2794067ac2574a1c8deed85a4aa6229ee620668dd16084c8f168b2555f04cb9").into(), - hex!("a9c4fa68984527577c6da60dfff110163f35ab7393b852c053d73485155fa1536d9701f660a08b160bf49a647ce3cf92").into(), - hex!("902c3138ff660230158ff69c33911cbe958d29178a54cbd13480addd948b19b0b97f6b235df2beeadb7f7e1803b8cbad").into(), - hex!("a6169eabbed09e08a0d290f9075c62ca4b14e1f7adc53545abae49858b3d5d7fd6cf8d8ba2ee1bf13f36f79ee4092935").into(), - hex!("85a0d7387b1db5635f17899bbadddc0fe6b11976385e12ea4272a8f61d81004406604c8f04f10ce928fb6b547d3bc654").into(), - hex!("a39e5f2112944a7ee31fdccaca927e4f4bbefed1274a134e8a038307820c1d14a6260e25ca5a3af0589f8faa8f516c5c").into(), - hex!("b5c86d0482a417bc94b42f8478de06918b36c5f45d0695275da2a3e773088268cc127ac1380f912307b6455dd0b16d07").into(), - hex!("b8b5e32afc4cf0fb92251b422ef9b757130455150c49ce51f6d6d95d895dafa25649363660608bbe7507d787db9d643c").into(), - hex!("b11f3856f691d84d49fdbeb4f33c45c37dd401a2bb71bbf946f3ddc53a57ce5c4da583f76cf4467d43034a61e1dc88fe").into(), - hex!("a56d1de276b2d0a4482e17cd358455aa19a47bd25c7fc97af8457ebc37781358cbf8a7eec9427881550a8db1bbf51771").into(), - hex!("9508c85488f15d2772522dd1e991f41da1f3af7e3527e098d5408ea96f11f4150415ac68ba0a3031e95528664b261de3").into(), - hex!("a28e129c656bc44d0b6892103b7d7c0d15ef1f1ce583e90e2c644c3016ab348ae26a662652c953a3c447272e52b007a5").into(), - hex!("a68dcb67d0cb585cf22f753602c46c7ccffff246b106db9c56248ecc5e94a036009bde23864879af62a4ede81d040c56").into(), - hex!("b9725383c63b2a522f4d976ad6be14a35b9e80145e058baa622238500f1a2ffd6869cde87fdb984654b2e57615bde3ee").into(), - hex!("90248e4cf47ec8b00ee874ac98227759a3f7ce4819e44176dd9b1acaa6270d144d3d707a35e0cbdd7ae23b15537a20e2").into(), - hex!("81327abb95401fc2fe0b1c2d27d7d9972811a63e12be0173fe8311678ff1fb097d73fa32cb85f13935e1a4b7fc59113a").into(), - hex!("a31bd2dfc9ddfa9ac748968b532a41a26007b23cda258fdacb3b0abb751cd7ce2eccecab2d5e3781fedfe0d8da027481").into(), - hex!("809b28c11c1abbf53f2dc005d30403937d9826960b24f4de857a9470067add08d49345586d7e58bb1107d232b3b47bbf").into(), - hex!("b0597958b75e64fe5c6e56ef803284b3b7420fd537e5625c75af3aef814a87a5ff01951261c2c7b27e374466658711d8").into(), - hex!("ad8fdb91216db4fa779774324162fd5bd7ff9a999030c42d9f90248bc328221aae315ef8617c9ba623091adaa0556074").into(), - hex!("8668991c8bffca4cbfc06f3429961c595d85803a262105907361758d677920796be70d2cf820f0b1caaef708d924e676").into(), - hex!("ab22ff4c2ec9e683d2d1ecf57f7af9b3aab1cd289e22b1b66f37dc3779e83e35211f7d4919dc3ef0babf876d491e0bff").into(), - hex!("b8696c811af5d3360951d7bcc9ba4e82e17a125501e91ff74b915de28a8cc217c6fb05d90985fea7ee431e519e494d9e").into(), - hex!("845c0bc4769c428fb30e63c8e4631f22e69f934b0e6089431ddda2c232172a4980cdb6f650563992667a0790f1a3870d").into(), - hex!("b4113cfe79b6b198b517ab5d14900a7189ba78b7ef85d04551e18fe1ce6a69564377fb86a0e11627cb794d1f416fbeb1").into(), - hex!("aa6848837b26df24b04198b0b09b77d7b59d26dd3b20f7843352f2436c046e9975af2985e64fbd6267d897e728a9e721").into(), - hex!("861456839cb76a9490dbe055559e3dfe3bcdc41646aa656d8aaabeb4c0e39a1b370a4f0107b78f900614e3fa09b46bb5").into(), - hex!("ad6a8ca9a21b7874f8b115024a7f079f5a1dac3b165267b33a59d1c8de2065bce4552369c930e9a949d0b07110a71452").into(), - hex!("aa83179de1682892257c57774844b040299789430a262c8b44dcbd81f8062deaa731ff4bebab1a815d3148ec719f4cb0").into(), - hex!("895549691861582abd102fc19a4ed269b335010aeef45ae9ae6b0d9c6d26f26c31371086ddeda626e76f7f07dc622fc6").into(), - hex!("a94e590989e81d269b5246f22a9c97b604af58352c70100f8a20454fecf36d19e601dc1201342841ab231dcefc461f2a").into(), - hex!("82541b5b7a392456d1936373396012b086c370e6dde41f6d4409d35373d1586d3c7119f6f0d1e38bce9cae67c97fcdd8").into(), - hex!("8b89fecfe83adce613e75a52e785ffc90847c09ed779ebef4d29048bbac04b58e27311461c25d4e68cc0e6778228b037").into(), - hex!("b3eeb09bc9ace8a62b71747711bbfa308b746c86ca87297cf2a8e768765a86ed1add2e1acd2925cf05537dffd4dbec50").into(), - hex!("a5364dc8221a37d73250f8498d9b6e163babfcb01e1fdef8ae570538e128b562a0ed8b353235159c3781ada8506ada33").into(), - hex!("ad0d54f0f67d0231ca0ab54ae881386b055c169fd7415c12e511e5ddc5d4b1beba0e1a157211996c7ab61f6e94cacd64").into(), - hex!("b4b978f7f9b084c089923e73a593a24d5aa22600c879eb03645a19ffe8b36cb8ae040378a378ebcb4a5b73331a2064e5").into(), - hex!("b3d79038de0c62c667ab4213524679934b33de22111626c258bf8fd8e16134425549dc7e3dee15239c32bcf122f5bbcc").into(), - hex!("af7a243eb665d9b2c37033363b252c42bc2c202c266ee125b5676b6f9f94ee5d46d3e2ca217f107719051de511625dfd").into(), - hex!("9726a0d607674fbde3fa5c346806c4083e092921c303ec86bf5a16e4b760d031a24585ab407b9b1b0692d12276912961").into(), - hex!("85a8eb7ff82937e2ccddf2f049af9d871c653de4d71ab36b198bbc7bfef2e32eb3f22462dd01affbce13813332193262").into(), - hex!("a8889fa7291017a3363a5e14cee8cb24c273be4aeb74c4b0e1e375f70060dbc9ba296b291e154eaa56703b8e3f7e85a3").into(), - hex!("a789cbc52c5468bf404fc1b19651ef6a805d96ab8a8991407e149a68d10d1f67d1d4b380c08f8be1faea8d1b32bb8c1a").into(), - hex!("9535392a86b73ac66ff8ac1ee0549d266a9e25e1db542b077d136d26710282529f34c43dd94ee77aa97c647e0e05356a").into(), - hex!("a1ae9d5fd0ca16021e0a33fa116eb5b94991aae02efc6f116e073def47253fe2d1f2438275f09f204cec0610ad523ff3").into(), - hex!("b5c6c5b37943e99bed4e63c9215bea95fc365a576a9f8f0b9da8d5ceb5f9da881a273f5692b0913a3bb922772923c07e").into(), - hex!("b3b0144fb027e0c7f1a0c4c703cc5e1c09422be38de4e10010c28bfac358a6c834df6794e5007ecc4c8d866ffb9a8725").into(), - hex!("aaea409068fd2cb94a7c6fe031ed47c7c5b366a33905d12a107799aea57a052b9bfbb1c4f88b1b3775d5bef7d6204b73").into(), - hex!("a10cea5af8405d807b66ad492a1aab8618324ec3d9d01181ce29512e38f03bfaf556251dc490b3d1e80576bbecb27dbb").into(), - hex!("b700d4046b0be98b3cdfb8a2eeee52df68bcc1c5550d1c17205664b0d896028bddaf5dd38482645e76f643ad9d2ea9ae").into(), - hex!("ac9163d5f57a2d1def901e74c1b07f4d14b1e9a5c362d3b082c45389ae8add929a1dfb0baf14f64790f86cddbdcaa32d").into(), - hex!("8e3b79b19d49d77844e3401c01984af7211268bdf6609919c9867a83cbbea21870ff108143795a85fbdb2c15a2d127f1").into(), - hex!("b9db73eeeafbeee4edc52c1fcac7de6d8acd22a8d3d1c4cf760a81dfb6cc91ee454385044301fb2253588f23f3a24079").into(), - hex!("b268631698668059d8eb44d50d532c9d8c49953ea2029d6a2d0eaf69713afc85c42d989cdd3bc0a479ad77cbad24fc0a").into(), - hex!("95f74950a24d82ba9a9df5d839d17d7ff830a5dff38663630efad5abe9c58724802d5bef891ca2b3b81923b55a94c6f4").into(), - hex!("969297c612c35347019f5bc80d2887a3c95c8ffbb011f5cefac63a1f51e48dc84d961aed56afc353791589a45c871cfe").into(), - hex!("98743e9521e5fb6a643c086a00423fea51b8ad2e55bbeadf791ede16eae64f9fa45c41101c6cbe4a8e96c692fc57c030").into(), - hex!("9374001ac3a8673e337b078da1b72090bf2450a5f53f6a600f4cd43ea4b5fe86a73d14bd0103b110f23e417dcb4c2e47").into(), - hex!("a91bd42a87f28a6fed7fac68b5306e5382a93fde2bc9aa5c48b747ab774f9c557343cafb46dcd4e93df5aa95ed832410").into(), - hex!("8fcdec0a825737ee2c61401014287079e729a8b8e49337e99b34c25dd9da570a1fefc532a0cf6ce1bec80be2d9ff46e8").into(), - hex!("8197cd84016cb41e4287d29b3a0fe8d221868e5993aef8c15c1578e038f9c43e93bc26dfc67fbef919322178223d0b9e").into(), - hex!("a4607e2b6ff802a4e497c53b206972d35520c78f14f7d4d78514333e90b2a8852603bf223f1c9eee3793008f87cd8fc3").into(), - hex!("a72b6185e451b3be2c140fb3f48225927e7c052805682e3de9b2c826997419084bf1e2034aef0c5d364b0004b3b7807c").into(), - hex!("aa99a2cd46884d2ecae4257c1db8fe1ef6b0cc1a0c25dcefb53540ae91ea7bc8955b8acfc6d96ef47fc3a5733f2f28e0").into(), - hex!("878ea42dbda59fb6f839f0b65eec295f2d543541f4fd576a60d104b94b49b1a1ac6e9a15ed3274e6305de3f35ce1e3a1").into(), - hex!("ab2f77f6036200b4ffd3192b8d06dfdae4eaed4e1105b27e64ae2e120c909095e59f4dbbc44e818afdffc7f9ea1f42be").into(), - hex!("a37e3fd9b1337734cdaf34111762403db11b1aa0324937a17e053242a9099b3db0d396b485ca996f91117c64623915bd").into(), - hex!("97c65c28a6a81690d4d6ff17d5cd3be0e15ab9cafe66e6f7b8da66ead8beec561c3abbc79af52a8986d576363f14cd27").into(), - hex!("ae138b3020373ca238d5dd780862fa28a2c3e05903366cdc0fd7a142db3d18eda63b8d049abed37f1fcb25f6cdedbd67").into(), - hex!("a800bf90b4e7aa7b5b00fbe6b5f45067e0d7ef2b1ed9a626211e07b66b12ddaf90ed05d369f8da13ecfd8cb499f192a1").into(), - hex!("96565fc4ef721f754b6f53db97d32ef5e5c3cc0f55928eba3eb341f4962b815381178763ef05c21c1247124d592b4449").into(), - hex!("b4896f9e2f88c990fab764a4e006f3f39ba6bdd0e1c75fc8dab2973544e052ce63f8c61a6ab213c85f6799d988a6fd61").into(), - hex!("87aa22b60a13edcede78e629d54714436a8d7d1e6e232d4df6047213b4a91e61e5feb38216e0ebb209f1dd8d7e4f5f9d").into(), - hex!("ac4d5e8bb39a2564f3bff053e2058f261209cf14e65f7dc540070d40dad7ec4f5fa81efe6274aeab8691b85a774307c5").into(), - hex!("8b13673c306988222f09ad896a75a6232ef3bfd2f6c37c2d751668466d45511542fe982ca5720c6518891830674e2cfd").into(), - hex!("afeaafa07eaf14f248d2a34e4f86064c5bccd92d3a6c0ace1ae827dd59111e9b3cf2722a270234eb5aa633c12e140354").into(), - hex!("aa31119422a52a7a5ba90f4e0b5676434b4f05289ea3143e8a2162e32b1e19b582a586da796ad9876d0991274f3363a8").into(), - hex!("82c78ac9f2018540eea744c003a76cd7bc8984103e941c680a4a833a7c81defdd28165256890d534aaca2991dfd856b7").into(), - hex!("b4a99846af0ffe14d0f820a574d42571e0186cd078840ebdf0684c806c08eac1d6afb2f7f9f9dbfee19c2ea12af5307a").into(), - hex!("93cd10366714618a7e8d4edf3c93a9bd30a280f765cb93071a279eb5bc4fe8dcff8d91a1efe8fe697d1cb5e760a07fd0").into(), - hex!("b17dd2a8817471efd91b60ee31bb5f7c2848bb40251dafc0e2250cdeec3202cbfc7a8af6d7f5c3300a53a73bb4a11b54").into(), - hex!("b396d11ed53f287ecab591707ec5ecd0c5d34a67854783dbf263fe2614c707a2226231fd8dbd6bb1ca0760f06f2fe7d9").into(), - hex!("9982a0fbdde6ad91f35e64de34183e4e7f7df6cf422912f3dde0cd16394f0f172dc32c4f68f2a09647fed32894471fb6").into(), - hex!("ac5889086fbfd2f2570191b5d92659fd17283509477f442dae81a8491b8641a5f63e275659e6592ebd0e62a8c7a9bdb2").into(), - hex!("8fd6151866cc75461b69b4685ac4efb5a21c10d5b3291617bee4ff300d90fa2290319967faa2b7189c090d3b60994fbf").into(), - hex!("adb4459e4e6410606a74742d6e48f7b84f30ecc8e849b6af9b4b617236dedf1707ec388a97523f18ec7e047743fa7151").into(), - hex!("a9fd9329ea3b6fb77dc577e2c891eb66c61a575ab75a66dcd897f1127e8bd9ad8d3eb9059c7f6a8b08199913b83e5ba7").into(), - hex!("b94cfafbd3ef7673023ea37996084acb3109ffbccd210184aaf8ce8d29bf36390bdbbf2870b0970e66831d28e90b248b").into(), - hex!("922404dd76801113ba23df87ba689e5cb609c94930370576d0d16e99a489de0fb079fb273159b8b07fc58bfe4f787c70").into(), - hex!("8c6005451c02b18458c3f069a521aafb44fab40f4260a60da6b9bb5f920e91990a868aafa4b6b071a899d3bc51fac72e").into(), - hex!("b0cf68badbb39413649b3171281ebfbabbcda1123549a4c6c09dbd4dc0427b51d555056c79f38840c52cf920dfa2c8d5").into(), - hex!("a08a09c8dac1f7bbbff2b7ea96899b64fed53e971569171224e675399467daea6870e48fddcf47179d3c7eab4cfde3ad").into(), - hex!("881c89cfce577898ad367abc2cf5989c647bf8904be5e061e632256b3750b0aedaf4d30c17f994358aecd069b62cff09").into(), - hex!("81674253d6664d414f667b10f6e8edc32af0a67b2b99d3e4657991f8a8b1dbf260447871c1c680d92f99abdf3da2d035").into(), - hex!("92e34adb15141ea58b2b481f9dd69e2584f512531bab13779fe99e18d48b6ab039bb28d9f444d517298e11464ebde4da").into(), - hex!("81ee1554da84a0a487e52c57528b69cd79f1b6530418354095ab976207e368379ae2fe0a4a340d209f13ac9783cd6d5f").into(), - hex!("839c0316ca07242ab52b76f55049f2da3e83f021591b0bba295677d80d4b407f88b0d207f3ecbe7eb85f19eba5d152c2").into(), - hex!("88b0ad748a61db5eb96016d9bf16bb05ffc4cf5ef56569397e9395f454fc1f731b48dcd8b3368163c36a3fb41577286f").into(), - hex!("b94fac438903b1e6cd11135b8fd35b91b61a0354addf8ead5cae4fc853ebb5be68bfb9901d8b4d3bdf58224675b6d675").into(), - hex!("a015eb1a7e1b814625b13c1b1bca7f738e80be5972f3a3a27cd9b21b033f16e4b5934bab69e38a6edb8d03e84e8725ef").into(), - hex!("83ef4eb739353f7679b27d3679551b2a0eb1bd4d372def5c0e8e5922a9ce7138dae4b62d5c147e6439a551d3ebb1e1cd").into(), - hex!("95907a3b288f3d4199434590340293881b94322e82f7fe9c186da3fdad7881b9a92cdcc5fc29d4124b1d05886bc9ec2c").into(), - hex!("868078f74e35b72a894d72f93d45333e423b1aec6d7e3cd7550254ed6a156957d4c5919489a84986f6134be8334bdf4e").into(), - hex!("8f089ffa10d8ff27470b8f6fcff49a69bd06ef3f88faee54a6bc8ea0dca6bb799199bdcd9a9e7686c43302cbadb584a0").into(), - hex!("980f4614de867eed7571cb3100f9566542b90d2b4110806dbad64249944cf3e4e484d03543107fdff0e91634d5193530").into(), - hex!("abab8578ecc6096bf063da248b376bd9e76a8b9364000a98c85813ada835017ffe693f908aa789cf09ca3020f3bbb9b8").into(), - hex!("a2beaf5eb12232e44bd251aaef3e007989794ad1df7a5f41ce1e6d862ff0607db47cacd4b04d684dc22d3640f6b8aa16").into(), - hex!("8f57e3d8d68264b5a07c9fc2399db0dfdd079abac46e1023373c22377612d3b005053e0df490d2435110c9fc2791b8ec").into(), - hex!("af7d2c45de945cb09adeaa1898fe0b026b5a5c5de2ac21f3b2c298d82fe4ae253d859c47f71def164a77b542905bfc73").into(), - hex!("93b026c1b083d82b3bd52d0004985f374acc81f754f7dd4e563a9ca5b20780f7872925a03e48d2154c526723b6d3fa88").into(), - hex!("b8a11c00250f9e148086818aad4dda9d69480b378ef5ca9e2fe85dfbb709d2a919067d9abd2eafdb5202cd334081b5a2").into(), - hex!("a7026b1a57d9d64f2526bc42c771cacf43a718725c2d0dd889b1af12481e3112bb5357e6434b3e83754b067bd5d533f8").into(), - hex!("84771640879d9628fea0ae1106a45bb8a383ca0a9a110093355395968b4d5af9e4a34201024a187d3a31b78a839af6ea").into(), - hex!("b99e5eda7144057e439ae752c2d879345ebba19e83c35785743d6fc1646069b0258ebb1ef62fdd43493498ed08a8de15").into(), - hex!("b2a17e5253f695a61697469df96f3182a62faf0b5d10c150f833543e7b3f5979506a068ddaebf310fe86efaf3adf13e5").into(), - hex!("8ce51f0a8ffbcfdddead1a94f45a42ec4f9e8770c0ca33b58207b8db06f3004c05e88f5b31896e1b7d3c79ff571426b7").into(), - hex!("a775ae2c3c59968d0add4c446c5f20e92f92eebb704016ea45a47c5496945b7d0935b4d8ea315990e6f58ec33d00aa9c").into(), - hex!("93bac2d2038c87f111c8000e721e4637b04ff8c3b7b1e8a9f02cae40e465a1b2928aa226af73ed643a4c21f3fec436f2").into(), - hex!("ae050b3f4784f2c12c902fd1881f6bb940806c0a9d7cceeeafd194dcd49cfa48acb10a09c55ea47b508d5d16702800db").into(), - hex!("a8c6680208271473433781cafde59a4aca2496d58c85f48ebaf447a0c175e784c4a1351d94b5d1a64c78bcf8c84f8f2e").into(), - hex!("8f9f71c20844682e17bfc30d745ee2848bd8782b05572ea64f9b9bdb2c24b3d1953bae317d79e267982c42f3f3aa60f9").into(), - hex!("abc4ec57e1625bcf3c10754a07a2047d359e503b05e2524175b48d5844756ea21f626a65a08f4f7b32cfb0646cc68fc8").into(), - hex!("abaccbb39d4fc4c252997503604764731889f5bd66382c90477df2f2d413f86892f7efdbee0e3a908b3cd69321d3db78").into(), - hex!("906a87855cc2b3765774d3e8c7daa62630fa7ba761ee2a0bfc5594380dc1d9b62740d1190fb882ffaf17c0d869356261").into(), - hex!("afd0ed291ba237f8b626698e3c54b8a84341628a524b897e53aad5231aa01977990c55215a677e9adf4319a98e81bef2").into(), - hex!("89512dacd42d13f5618f1979d9afd93c06247de2e1e9ab6625b5bc9efe24439189a564ea220c4ce2795f059064f5f5d5").into(), - hex!("90238fe2ab6b623ecc990ef8d2849d26229db5f3c8587cf06501e459c7742d81653c7dee45da82f5946e041f129a8df3").into(), - hex!("a420b197f4863782fbd676bdf1808ff1c6f49a506d525952c575c10a32cf63afef22f977d4b7d6258334c498f36e7f95").into(), - hex!("b7d8fe926876d1d01529eb6e30a78db47b6693af3171b2014bd18180066609cca9036e35953ebad7355362fa671d903d").into(), - hex!("a4b7dc0ae7e7d8c8eb65081427f5d41a122bcad56456dbcf4a4e83e188af1e3d80dc7f450766b8e87ed8b28ca6c5c479").into(), - hex!("8d3e1060196b4e8e827052c2ed782aa554540f21690b67d39db46fcf088d10f67f2b6e0d98689e7497e8029bc8f355bc").into(), - hex!("861657c4e2a48891939b49706791a03f63d092643cb491adfefb3cfa7d86ecacccaf86e4a1382444e466a61e29a12bf4").into(), - hex!("92f1c5b122943341854ab7d5c4603e083019344e2252da5664c676ffdd564345d7e28e2a5692dcaadc4371a95ea2a142").into(), - hex!("86100ccc2ee10dedee28a3ffa0bbaccc1ecb19d36a99e6deef1f2373c1c1c3dcb8b8fbec5809304d883c5d60f617d875").into(), - hex!("97c06ca658fe3ec45a6573bde07b3a95d80cff213c9f4eb8933c8dbaf147262291a5ebd55b0e58a4686c4971cdc45671").into(), - hex!("b13e9055709868f723014736b1fde59c05899bbf2aa6d4591d724c35c15ebe6d215e37fcb1e7b8585abab0b2ba309c00").into(), - hex!("8ce0532b968d8d770eb611131978a253e7940ceb627b7364b3a4dd517f26c31bee51c134a5b1297362f6f9b6d714ef33").into(), - hex!("92edce89bea01fdb25da5d0f903de2fee626681cec3db418a9161286a2e95bbb90ef2ccd8dad434b51776f85d982700a").into(), - hex!("aefc7dea295547984ab42a64f2f59ba2ae8220712778a71530623351a44372ddd1018cd8d4951934ae0fa39653ad6aae").into(), - hex!("ab297f28266bd5ed104c1b55088f114592e80aa098a0865e5543e12c6392b0f94b5cd4e0b6f375d1a0d0809d80c1fca0").into(), - ], - aggregate_pubkey: hex!("81a5778df2e724c98b4ef79ff33b9c5fa3ea265de81d49de5c4ab3be2165d32fe15c59c982f758c3b9c522ca5e659fce").into(), - }, - current_sync_committee_branch: vec![ - hex!("1da42c54eb912009030c084b700d2e0031c0a0e5759b0cc593601b99764a725c").into(), - hex!("0c960bd59f4a61104153da676eb38ebae603e9cbb55b0f6677cc1df0d535d60e").into(), - hex!("1682c67e0936255e351f8be6ccbdf048db06a80749aa900bd4265af1c366bd52").into(), - hex!("d95bb6af7d6be07e5d7d27337ab9b54d5bf725ac37671b9483434d22d724bb92").into(), - hex!("3abb1af4e9c3acb052119a42c2d4222d99e8b5b958c520a03526a8177b921cf5").into(), - ], - validators_root: hex!("043db0d9a83813551ee2f33450d23797757d430911a9320530ad8a0eabc43efb").into(), - block_roots_root: hex!("ed6ca045637c1c7dd54fbef547b8b1aa3f5b9fa8f0bfa5df26142a0c4237e617").into(), - block_roots_branch: vec![ - hex!("620abd1a8757614facfd9d2fa43795281bccd4055bc9b12e5cb3742a16a9f9cb").into(), - hex!("14c793be544d5fe1993a1b25d39f4b69e832e914c3d470745276a25d982df4f5").into(), - hex!("46aea5f0a7d66cffbd55e676b915be97cbf3dc6281146cdf4952047214ff74bd").into(), - hex!("0ccefa47e43d03e26def9fa07bacd91a5a2a20c6c5dec2ea090f71f91ac99282").into(), - hex!("f03f3d7a52241ab959560beb9b748a8ab93e2b7221c8070561a12a5fba8d4434").into(), - ], - }) -} - -pub fn make_sync_committee_update() -> Box { - Box::new(Update { - attested_header: BeaconHeader { - slot: 5808573, - proposer_index: 430716, - parent_root: hex!("0be3932fbc9ebdf3220e2195d87653f283d9f999946e53f6a9f6172b6f532779").into(), - state_root: hex!("cdfacee5c92a351843fdc4591ccf16c4f040d0276add8421f08dbd5c71035a1f").into(), - body_root: hex!("3d248ca71ec98250b8dcdeab1207806406f1434c11874655af56925da6bd88da").into(), - }, - sync_aggregate: SyncAggregate{ - sync_committee_bits: hex!("ffabbff6fcdefbebaefffff9e37dfffebff57f7bffe3efbdfef1f7f987751dd176f3b3ff7bfa3fedff5fdf7f7afff7ff777bef5f9f7fe75f97fffe7dfdfffbdf"), - sync_committee_signature: hex!("b405701a0227b7c40805504a66069fb5ef99cdd84f1e295c9b4a4eccbe4d93718740efa9f8eca62f563dbc73021c00e914a69b00a9ebaa906e78f26c1cb8088af916096801c787f18f493b1479fd43f1f5b28d15af827a1e580713fa82bfa1d7").into(), - }, - signature_slot: 5808575, - next_sync_committee_update: Some(NextSyncCommitteeUpdate { - next_sync_committee: SyncCommittee { - pubkeys: [ - hex!("8e9fbd36b3cbaaefc176cf46336592e2b59a51e3035d095da9e1df9d2fb5aac5e47ad05d27784ca675442abb875a6559").into(), - hex!("b4c6164c5ea19f3da5a76a2435db598bb012ea34cc8fb6d749f1588463e5c39d29cb3d45ceae0543372246549b17deaa").into(), - hex!("a89c780da1a713e86b149d63312aa840e865dd926565f0ee9d9627d363eadadf5a4bd5f79d8039f2e2927ed7fa60209f").into(), - hex!("aeff2bd9faa0201abd7dd681ff97888c0ae71d84e71590f424facb2e37b5759f07d338dcbb695ad6ffd08d903c0f92ec").into(), - hex!("b89cfb61a59cdcb61e9f3ed76cb5cf13c907bdf6b2622e16d140743c5021d45cb6d91ee94331130b876efd984575948e").into(), - hex!("a2c889cc5195532bcb5c83d035cd6881b889ffb9d0536843d3fb6f7b1c093a927162add5ab6ca5f06e7c3ec4ca4522e5").into(), - hex!("b5966a6d047ef679a9613114149530facbfc7b4bee6ab23a60853f45de034435b624ad0126ac6c7d6a12b1be93177e0d").into(), - hex!("99249360fc064fc2778b37b107d834eecd5eae29e8f10a45d946f11fe358db065242482935224226e83f518fa6916962").into(), - hex!("8c3548aa879d974c5542e59ea43bb34db91f92c7d21eca5e3e4fb9d01364c21e8e2341eeaba1d22da67f1f455644afe6").into(), - hex!("828b95590a46cdc4756fc1a7b7d7c4031637494938521b74a3740a970ff532b88ffcb5333197088f6700925dcab5c42a").into(), - hex!("ae2e6ae80c16831c02170dd273ff6808e4379a8baf00e707d497eec6cb50b5a1f132eddf053f243765a54695ca35c443").into(), - hex!("a7bfac686f7b307d794fb1740a05cb1a6ef14b06150e64353a0b6544e7b0c5e3a7c8985d257c5bd74e411c0cc8424479").into(), - hex!("b3671a59e2d425ef0ed109932402ff7dfeec72cee39c1840cade48a13f3ff36bd0f9b3931d0651fddd214a2dcaf7bf89").into(), - hex!("b56c962ab20fae058c256e37ba4091d7a9e5d3c602e3eaa2d90df65fd5a11ab68f245a5a6e53262335c6dd4f3e0e51f6").into(), - hex!("a8be83de4b06ebd8c14bce332a1175a4c651fdddd4a58ec85bf4c68cbce83a50dfff8c26070d104556883af678693076").into(), - hex!("b4b33b7013c6af21797478b14b1dc81fb7c5661fa2471d8cb4eeaa62a62f795aa9be2cfb65ff6b957cb7f89487a587af").into(), - hex!("991a42351791da02bf6c1a9ca8248901657d6f2a95225e4827ac3171b5247cd31f9465c9ab1c2b78e268c82b61db1f36").into(), - hex!("88a38e70998cbed82ae7f9c192e06df8abdd35278efb25a1112246d46a3d3f0bddee41f5c492949f15e651ed7fdd6a15").into(), - hex!("87dcb7f13c6af7f7d102c643db0406ac7fb06fbe1fc647f436ea839e75561b27beabdd6133da332383bf22ed4f83fb9f").into(), - hex!("a441e2c51448b6b2ddb38dab213d9ae3d1fe70e91e1feb0f98590b5fb6f3c18ec0adccc221fc44ba027511c52e5fa626").into(), - hex!("ae5f4dc4266016943cbe1db6538619c430639a1179d246cb820adf8edcbe55e9f79471134d06365b0d459b280aa2282c").into(), - hex!("8165bbc59ef3b15f29379a7ef90d8b3610590c662207ea7c49267f36b5b62af3d48008d182ec3384ca7c1063bd25b284").into(), - hex!("8cdc4e6a238afc55406920620fa90f696403afc1797562b424c26e679096950e7f42b8d8327ab0d7573608056364fa4c").into(), - hex!("a1f4c958f7bd1182cd4ef88561eb534c9ea3563d149a276fc256645be0b2e86a3d642ac17261696ada39a04a866973fc").into(), - hex!("b19e5ca1ef1d4fbac5633cd29e9510116bafb3229749e0e4444caf9819fabf9c4c805b5966c02446c1eb0029b3c1293a").into(), - hex!("a4682af7e19328a145a1a5c43ad3e14648b90f664c6139eabe1a13da9b763ef23947dc3ea2054af7d0b7018f7498df51").into(), - hex!("999ae1a8f2e0cad6a0378e7e0a67c8a6ef4a824043b34e67074d05ceee93cb7b49d3c3acc961f1aab69b45f89d12180f").into(), - hex!("94a9f1686e91ec733799b569e3b0313db64f3a219b48482e2a56c21016e800d4373c2f8b876a923e0753a464e5fe4684").into(), - hex!("b4936942d807ad09cbaead9f56ca124617fd1fda2ff5cd94fffbbdf5ff2b295867acd1e41599928ae455d597ea45cfb0").into(), - hex!("a74166db86410c9722e657cdd0f4d1da86a4f83168e2bd9ac71850bbfd9471e1ed88a6476b75ae5ddb42afc62a9ac121").into(), - hex!("a97909c10241e046dc707ff9d822c385dd68be297d6b54c84fbdc18f5a1dbb3350e93496698d6304ad1d6bfd34b4a041").into(), - hex!("b6d9b775129b048a6c577656ac2de15135c2bf1a3c7c8140ce20a990274e42d7b602ebe932855c1d03373797ea0bec63").into(), - hex!("b59f975937cfc8eb510c1da0a7fff1960c46b9235550cd6decb514805439f08b8f18d88ae0373bbf50b028a08612d552").into(), - hex!("8af01facbaefb24cc4c11e13c64445600b1d716be66908964ef79e12c0eded04e1d23295444818f024e55df2aa911034").into(), - hex!("b79607bbe31f159b208a0d1b2f95cc5373631908292126b8b75fc44b22a8bcc9550de7b51ada33e5596d0f17d5f4e48a").into(), - hex!("a1a474a66940bbf6e601b6c6e63103de2d5eb76d7ad3d39dbd74149658a14e31143a9723327a73bf72eaa75dea42c3c8").into(), - hex!("ada18b62cf80098f36921cb0c2f85200fa362721c4673546f8554e2f5fc8639f2ffb2cac68e888af7ead8c660b0db13a").into(), - hex!("9198582e8aebc174dd168c6cf20836a21cbb6baeffacf9f933850d8e0fe0619ac1ebb99fa6fe902c75927531c108ee5f").into(), - hex!("b8a44b23d29cc5ae1f00d5384fd06f31b73ef1a7ffe334b59db668c924aef2cdf60c3070a44a12b52a14ba185198035f").into(), - hex!("a688064e0b3fb3baca87d711b29419a02c06e6a1dd764af31574dd84fe870c8ef614d4c2d42fc9508711dc05fe373776").into(), - hex!("b86c167a1c6738bfef1feb7eef8f553898f69a933876acf675596fc2e39f0a8c83ac37df69dffb669fcba4e3f1caab92").into(), - hex!("a32d52f3e9acea45dfe9ce6c577dea8200e68d6ca39eab5d6fd24c508d2028f533b8b04f1a4fca7965315ee5dc5e2809").into(), - hex!("8ec96bf235d5e9bf36382d79b4bd1be8a8e2b23a9f7f9e02ab6d708e96a1c12fa81eb236f02b0180a0cb9f3c1bc28cc4").into(), - hex!("a0261a76664fe2fcebe1501e18eac7bce32b947db7bccb7b746757ba51cabbc8bb385600a99b248887edeb84f82a6f49").into(), - hex!("a44313f945a1d462376e03fafe6d7a9659dd81046460f45ff8914732ed268b2430ff632aa0d368828c2076144bdc8595").into(), - hex!("a55fbee79559e1fa7b85718306185e3769a92052cceb600283d0236accc6ba2343799c1856609faeb7c685dd504384e5").into(), - hex!("8a3d4ea2eea81742fcbde7a1bea5ffda55c58b5e4618ace17773057932b7216b96ad4a117d9054de18f71b3345a0076d").into(), - hex!("aeaa0984232b1fd5607a1a67051d42df3ffe71363639e5130de243cea84c87554e6597f3f07952b7d40d19b6e18957ad").into(), - hex!("986c868f8f25db957f44a39bc209f1ff8e98e9bff52236b2473b8ba977d0b7e90d146ec86a518a581c5de796290d505d").into(), - hex!("b1cb0755c54e0619c8306636e926930605f15901c01e36822131dde1538b063d0dc485a97534ef1e12f2f0febd1092c5").into(), - hex!("93cf415d4d7ea309b85bfba7ebefc0d1ea91b8e93fa351262d9eb34b728c7a516ef0904cb2b3549db2b3b3f788b147af").into(), - hex!("97359ca81e9fa330f4c0a3b4de96ff45391c2f83247d1f73a6884bd123d34edc66a4d3f29718f5543350204488ee51f3").into(), - hex!("8348c9b229787630ce26a41e7c016adeef5dd3ec1f124081baf9db4ebc1a3f3a37b40d94183ea9eedf9a458a2e65fb41").into(), - hex!("a4c6b13c7dd27497917bc9a4c4a91b953b88c819e147087b125c93657ad082971152d384e8c512f48cfe07a69f54fd95").into(), - hex!("88008b395718646492ab944a9139b95251214c42e90720c703b19b99afc971824bb87c2a4d40202cfbb62bd2ee30c15c").into(), - hex!("946969ae721cdb08dab293a638387dca6045e230cd7c7b7237c75e123355db9b8e444089633d0977dbb6e42a729ab4ea").into(), - hex!("83435817ddeeb242c37d31877a55194f208f4cab406b10a4a0605a54a19745f3517a880dcab8a5a4422c0e19e2ea8a2f").into(), - hex!("94fd0a0f870a6ed2e6a4f53f5dff5b5adc1a6943203da6a34c73694702733c991e146f8c7108ff35d563fb67f55a106b").into(), - hex!("89bc609d5223c73afbca46a8c3cc271990a8bac5191f1ef6a2c88d7984adff00d67bcfcdb3958c259e17d5cba62beb28").into(), - hex!("b39077093900919b51e68f647d11e0f78359be69c405fde5735ce6839f739081437b899f33c6c9e6c86d4bcfed059186").into(), - hex!("a0a6f9f588e336c14b91a9c0c56085830611df85ce6e99d759c72a4dbae500b47dbe736287f6b2d65b448a2a0e6ca237").into(), - hex!("8222a17ad961ad325b819bd0625e079a471e597adb89f2170cb490c40f6b8b1a08b2e23a1abec02011452d589b183702").into(), - hex!("8b77ca7fa195450ab3399f88341a9d323e8b9b7b9b2ca30985d97ebb287e1f9b7e0279f22ab3a2dad682d7906f6c8d59").into(), - hex!("b6b8389382d3336bc5ffdc752bc699a6bb0057dda7879901c7633787a2b412fb7852fc896ce95cd09a9b98c76bef1b1b").into(), - hex!("970a20613047ad84b61ede90efc41a91ef7259a5fa79ba23964ea907fba1fd88d2710b69fe5bcb0d75ed9fb68d02e557").into(), - hex!("8843dcb71117b6044b1c7eccb5010d0a2f93775a98909bf23c1773ac9eb1c0f43aba26dad08ea7823da593c38a30598a").into(), - hex!("b5b147bf651ef9696ed3ebcfc3ce226b2748a4c4e7cbfbf12b3ff5f1f0b2ee1372477e1d7d8aef8d9ce3ec602a63d01d").into(), - hex!("95433edd328aa9223f521daf6d78ab272fb83150bac78ef6639cbc032de8834049d4992af0828946eca69f359987584d").into(), - hex!("b2f4d2154ac750245e966f62b92022a136ed0313964ddf534ff3e9b4456cf58bfe429ac83b718bb38db5a4fbafab23ab").into(), - hex!("b6b1f2a3a99496dab156c6159b8c98990501894b5b0cf200c792bc462263cb0aaac570f5a785aecf367a0531ac2a87e2").into(), - hex!("9985e3ae265653082f068b8ac4c09d10b2543f920a19911cddf18ac53a7f921da86f11836f51f2adfb26c7bf4ad51efe").into(), - hex!("90c31f4985c7481e5939766dd080f6ee01ac7a4fedb9954b9d1fa8fa1cb0e6e7185a1e31d8503542f1d409ed2f550e88").into(), - hex!("830736923cdcbf7de3ae650768482845ed9b45c4dc9928d66481c76ead9b27427a96989389c8583a153851ab957d67a9").into(), - hex!("82312631f5b301fd3ecd8b0a6e83b130b6e997a5a1e6255e883c590efa00b0ac3bee45c15308efe824aa665c8d7a365b").into(), - hex!("b8ed7b3c092f7bb05aca8cc4c2041161426908e8db349cdd2064e95044f9e7649cd569039e0ef0a94e006094113d0e22").into(), - hex!("b1d6e5344b74a67699cda807ad4883369a77d79335cb8eded6e0ad9b64c8661b7ddb47ce4308ff69f947fc173f496ac0").into(), - hex!("922f0a2f84e476e6fc00c196eb913ebfaa6b205fa8ce8c8453330a58956872eb2e4ec0087b398eb51819ea2d0aae6b21").into(), - hex!("8c729483a3d2ea34337d9c6260944da7e2ea8646de66d39617924681189c79672b0ccdb63525cb4635e3cce1d8f72f13").into(), - hex!("a00af936fe87caf17f5b365f59d019f8438a62b8f174510d863da59097986011a9e76319d4125ceb64f1d83defd822c4").into(), - hex!("96d33c3832bf0af5900a20c067bd45dbf3f0ecdc086eb065afea6c44f117eaf9ae8841848578d2915452e61bad014803").into(), - hex!("8a16c15a161a1e898bf06a23f62a9ec042c5b9e875cbd54d62e11be181647cf09e6a0bc65fd62017ae150525c16ee746").into(), - hex!("b4a0443c452085bb77b5790be42005178dec8f9085e2f1b963d55de6978cb608b7ebb42e4a84f24350c768c2e78d22c4").into(), - hex!("9168aa07b4e29c67723f4b87a025fbe6876f13c69505520b4dd6b387f16530a886bfae5e5304539564debabc059589fc").into(), - hex!("9504db9c5ece4ac0b703ccf751503665746bd580f11106df3c8a903ae7a5c9b0520dd16c89671967e2aa12775af4f67a").into(), - hex!("a776127d4e2e46c7dee8559ac56b266e7eaaa26eb8db0a7f4df0c66fa1564a349f414c9091d1e4c3e7ba96938916c769").into(), - hex!("a85785ed5832dfa8c9a5dd9d20523591f04536712c19a38c2c1496ce9c8787cf37964d739f83d9979db5574ed524d557").into(), - hex!("a4ba9a3312c2c253394891714719d2cb369eea993353b07f9a6efe3ecbd245f08d69f3e1302d6ee312e743c05ae85cf0").into(), - hex!("8329604134885c08173b14b7c68b74ceceb3694a0a3f7997f566ba94bb3fb2ad3f78ab3d02c496858bfc95655f072e7f").into(), - hex!("8e3f5485c98cc317653375ceb44636054a3202045bea6e9f6faac128e115de7a658a49a6432858db7b4b14fccbb93f7c").into(), - hex!("a706c82514d19152bc4097f8602f792a4917f5cb409c42dd42a5e4f2ebd1bec8318019934ed6d19cb43123293bf4ec98").into(), - hex!("ae14d5f32cb99bf3eb0d844157f12b836963be0d6f91b776f973a66701924c1ad9c3496540db4292580e6be871486486").into(), - hex!("a45ee325452d4bb2c60ef5be60b7d601158ca1cfeef0734727562b94ef8f72190005567e2007e8940f8cc538838f1147").into(), - hex!("b8f1fcdabf33ba011c86487a082b19fb146de932a469b19518cda2ac046c319059382cb8ab3715f8025573ab53c5cdd6").into(), - hex!("a613f3dd6c8361893be08f816c640cdea4d57d3207704774eeea8818edf102cba7ff7b06c4c5d0fcf0873b09f72d1ef4").into(), - hex!("aaeab877b1d16a4db6e47a8a864e073c4742e0a84e46ae8dea1a0eed0d2cc9f23adce9e0c8d88464ec0c059df99a9583").into(), - hex!("8fed26ca2cc519a44ae38398d856c3f75d1ea6cd02dd36dab004188f3ef2167cd67d279580f37176dd70c1a0ab08d72c").into(), - hex!("ae18905c02f96e110f40d3bd99ab26bf28e0af939c6945966fd5e3ff440e54bcee56d667a0a21d8326f88e5c22e42506").into(), - hex!("97d803614adb6571f4ea11833d0d9ca8221e7fc99a960c637d4990a72727ed2713da874bf156dbaa70bd4c2f668681fa").into(), - hex!("aa86c3bf79ebf46e1cee54f517b7bdced4c7a96d3ab27405e7d68dba92ee6fc7fc91a107f3cca85096f0d2581cb4039e").into(), - hex!("b75cdcde1702b5bd6be180dc8ea26e5534da77b1c7bf711c8447a565a63d073474f0270d78dcec78ecf5baaea1f75d1b").into(), - hex!("a36e810e50d283e8ef625cf684c1fd333a0373e5b0a9d81ba40cabb76299af93c536285c5d7239e86ec56905245ed2b8").into(), - hex!("a16b6b41e5c31901f3c0fc2a7dd8c084fb508947314c4bf4b6fb338d95ff2cf49fdc5de1d6b9acddb1b096b835df6ad0").into(), - hex!("8b580da99256b1d0d7a90dc46a98ce5132fb3928d416f2df5ed1769544692482ec8f2ad5f57871041d8c78d00c949a0f").into(), - hex!("945dc91cffe575f06b4b01fdcd580da57403469a21db6ffaa77ae06d31b8a2aa9957e26db1bf89554611f51f10c8f73e").into(), - hex!("8c55c4000195fd1155ea608f586a327cccd1221036ffd29eb9903f8f28009083203f18480b35cf82e0390a5ffef4bfb9").into(), - hex!("87cec982094c85f6c1e402b74b52f7c0495ab4a2d3f2309734aa0bd2bfdbc88b8bdd9556664015c7d9fe2f138dd7c807").into(), - hex!("8fc576e4f9057d82e2fd2270a787c596bce5fedbdb9f6d612c2caeb1a778450d8c1f6e86dd011a45f3fe7f201e520438").into(), - hex!("a43eb1acf0de695d478a661a71128ce9c58923e3adfb62728a2e9f185c9f46877db645398546a300b75f2c849f5ab14c").into(), - hex!("b57be020fd23d3fcd6057997099fdd648dae32cb750e8d058b62a5e902ee5ca27771d762020cba2985884ffcfded3500").into(), - hex!("ad3ad1089c8232280e9fa2f6c314ae57758cfbc3a0663ad9517e35b74b19e49345e03d1d33d0d7b69d736501ec5b3f4e").into(), - hex!("aed7faac2e65c10b52d7b3009eef010a624c7f57a5c76c55afd310345707bc8959ad619101b9c1ee4bde44152697c537").into(), - hex!("a6b177c7f945cde42c5389f7258689aefe1b6ee0b243f9901c6e60ef1bebbea9bc297689cda0c93aac9b28c7d70d0022").into(), - hex!("b079f925c29da333461adc949ff4daf19d0500f516d95e3a4c3dc2e2f5ce26ba0f08b2473c03b6974146b239532deade").into(), - hex!("8c573c73d603c8ed73ac3eedacd8ffef4c18425699e30d46be2dbbeb3590380b0fb713daf3ff3cf7544da502dcf35cfe").into(), - hex!("a39331c8acd40377f020611ac9f3a758832e0a644a5cca318c01e654696fc607e299b744c0cc2ecee2bca755c9aa3581").into(), - hex!("8e71e261664d5a6094ee912fa7e3e866ebb5c4c610062fb5fd733359d0e5a5d806a3370155ec3b04e83cf7a2d7c4a0d0").into(), - hex!("ab048af1200dfb67b4fb6bc8bbcd8344547e57942f7397c06988c9c42cce53784a0282fc13bc878635a3317b8f306a81").into(), - hex!("b32fc2da89d3a3541a61338e6b0c5a7f477a23bbb9a7c63b1087f36c49b6d9a42d4720708af496d82c56e1e6836f5cb4").into(), - hex!("97d0e8f961033e4aaf96a75f585d16eca691dd05f4a5477e8d3a0fd97d02555d67b29d314b5d150dc0de3b72810338fa").into(), - hex!("8223bb67c99eda58237a765c8fb426871a1a9e02e6e91d956b16e57b8dbc30c0edeb76abb30ecb2f4139a19922a4c62a").into(), - hex!("8d9ec5c0575500e433a4bc66d196d404b8619ea38b0dcaa036e1c1453eb23c6949509243531ce59318c22db6e33ee1ef").into(), - hex!("933ac0e3e6acc7a238fb5495835a591db77c39e27f4034dfaea20bce7c072ff6bb6f59a9823a07a76a431905afa2dbbc").into(), - hex!("99f3cab4e8005fdb6bb44900a4f166ef0c2c48dad85c0a127c4d854bca4ad32a2954a586734ee0e57f3317e5b81923cc").into(), - hex!("8f01dc4011ea394a9f7a73b7f246bb00472632fe715314525f1db2cc6158b22dad22d1371e7d0b2d5e72cc408f07cb25").into(), - hex!("96e702adba7420e819338f6f8740946289bca6f24a5f14a5bdc727d1cd66bb7d2a573cdec8ef1333ca39685c33f6e7b0").into(), - hex!("890ab24865a2652a8fb96ced381530192d072cad275c19539cd74e03c001321216a0999ba83c8f3a162bed003dcbaae1").into(), - hex!("96e2f1ed5f78c0b018cb388447bb85b33da331a5a306ce4e216d1070beb7c3900f979ef128e85180c56958c0d729ecdc").into(), - hex!("8ef642d5a1fa4b32fd69f7f57886d1d9447ddd9a8425a03f15633cd688e41054d5243ad6f352a5a3fea2be2f3cb7bede").into(), - hex!("84a3177be656623fe280f91e2acddba52c068cf8a37bd79b9b4186ef199bad65f52cf3e47b581f1964c9987f088fabd2").into(), - hex!("8b913725eb48feaaed46b2e3ddc0cc414aeb433dfa584155e2eaf29020f6f1fa0e801b85bee4bd28831b5cc66944f411").into(), - hex!("88d802c75d422a713c19a600cfc9cd843ca41e35722e21a0614c3195ea84752337ee30991d860fa75a57ce3f614e0a50").into(), - hex!("b43cf4b09d02b20073903bf152f569a43864095622a472656d8a96efebfe3a20dca86871268ffc528a194bd951662d71").into(), - hex!("ac1c65ef79ad0e56184bcdf0680dde5547bd01b95d7e9c3c71671c71683709cdf7fb988440c3bfcb847c26f198b94f81").into(), - hex!("abebe453b3f2430a9287d0d5fc043f7ee434b33feac6b7dab58d5deed7568e0730d59f94b1883e3d43f3c2934d3f40c8").into(), - hex!("84e0acddddd0c202eaabfca7cbf88774ae374e841899942a2353064f132c6205ee378277b2703744a8bea9bc16449537").into(), - hex!("a69865f8a3f66ff4e548ce29a212041bcacdc85410b8467f0515842062b3204fb1b7616e45fb5f46a5619808fb390dbb").into(), - hex!("a55b426b402e9b27fadf87b27cabe5375c6941b22597dea75586eb9dcb699d925db77250b1d755512aefbd4eab0a2e4d").into(), - hex!("8047da13f072c9e848d33a0f397ecf3e783e7dd507ded7a4de25327fe89c183c8dd1da3d419b48f53d93537bc2c1a8e3").into(), - hex!("94a9345e464b9b28798c608115438f1eaaa60a56abad028729dddea3c856f7f871031b4f100626f8bb7a06d88f7cc6c8").into(), - hex!("aac8cc93a4bf5b383080738021fc56cf732988622fe0d493540545b19a6a54cdfe9f8cd2d2dcbd572bdde0d1f8cbb101").into(), - hex!("80f24fae3c8d202e8072092342f8b046dc9edfa1234c86e9f06cdd7fd2a1dc0f81ad69886a8c219f53a94b9a75cf6b78").into(), - hex!("88ac9c1d5c036f14566203d8e18421cdd21b2305cbd20f9857e4edd09e002ba0bb5c89b039cba417b353c6f2f63c50de").into(), - hex!("a45c8ac231d0ddca06f1bf03eeed331e9b524ecafa74642e4c4591cead603d4228cbb0701af58770100964fc880ff85f").into(), - hex!("88767dcda5fc82e5ee515639992868790ad56d2a4fdf1bd1ba1c5be51b381c149fc9db23b93488b54adc89fd4c48dcf9").into(), - hex!("b23e34136c22ac73157c7c5cc8a9491b0b5bc968c95a9c104b402cad9de598e323ada4cc527555157cbecadf48faf87e").into(), - hex!("99910638bfe8b9974a1bb7efed279de750deb046bc21a9655da4ea81a1aa807f2b76aa2a64d773b1b23af283ba3878f0").into(), - hex!("a05869387ea3b4c8f7403d85ec788499a993482538e0e2078d016f00d67571d1342187ae088c788dea518bdf295da88d").into(), - hex!("a7dd1735f178d53908e29db85ba6166640da8c8bc6f717e0da9bf74c547bb98a512266cf737937201cbf6d14bd9420ca").into(), - hex!("87f5b096a1263b51df28417fb423604879b18c4d0a8a48630f70e0f95226bd51a252d8be362df801680344330857fb5c").into(), - hex!("b1a5a549e27b8256c388465be3017dd123a7d257fdb49b2bb409c6430b6056cb8125bf88b5f196bc9e02567a6728c7e8").into(), - hex!("b70862d190351d6bec9c618057e407b43864a0dcf860b31ab6617f75e1ea02de49ff338a45af53783cbf10400c878a32").into(), - hex!("b27a654ece8541b9bf9c6ae0047969ebb69c4687a43030b1c412991dfaf349e2d3caeb6b7ae3d72ff0e2d758a04510fc").into(), - hex!("81368aaa4489c992a6ef3b55df26ece993958df2e40f04a95ca514fda56c2fb98f11d61faedd31860b89e89eab965f0d").into(), - hex!("94e14e03de977732b7c7faa60ec8180e77233a43d513a37c443be4fa0bac64308d6a1929de075b5d51efaa9bbd6855f7").into(), - hex!("b2e26d7b979f93e8dd55eea5a0f4985bb254128963a939ca07fbc33bf83ad7796e9426660b2f35088d7aa5fa0cda2ec2").into(), - hex!("850aee846e93c5204c1906a2782da71c0ff9e2d1962a778dac77561846e6f9290ab10daf72f189df0a57c1548bd4e6cb").into(), - hex!("aabcd7f870c299cabe4dad1857b3b6cc3b9fde2b525e9d8ec0fc1f497cd199108971173e61cdd5937c45758cbf7b9403").into(), - hex!("ac069d7ff2633fc73bb0b7607d9c27305a4e15c189c8da396d6685798c12ef179bb44cffeeb7435667fb03a799eee5cc").into(), - hex!("99e3eb82b955b2411d1b81d946e5ef6b9c6957ae0e368f4a9c279a0541c3a46e289fbff526a1f9db4aa21b92d13bc9e9").into(), - hex!("b5bc3dd1e05a66a1d775ae0ad159df19c7188f2c73a8553525855ab34617c7f080e217732003e09b29a5b36b12ba564e").into(), - hex!("aa631a69aa4a9c14de2c49fde83453633d17bb258a2b7ada723bc8e71ef22c617ebdf8ba64c72675440b35d419d0f836").into(), - hex!("8f42bb48587cafbb3936adc495e82981d7fd81d8c0233a4e4d44f9df72f8439a9a0228d6cf9d156ea608caffab8d9eaa").into(), - hex!("94e079215b8d187d546f33d5384673215ee65c70d3bd0778f67c11665af5fb025b4302518a0db6266996c136ee90d4e8").into(), - hex!("b3dcb504b50dc58ee7f2e2f78ca884d5fc081b570d1177b884c92bd34272ececf2a9319cb1cfb9df011d4db3ad266e42").into(), - hex!("a5e5b55940e379e6c0fe7c6ac9ab86f3836f261942e3933087f1e1deecd280af9afd95d1bfb384976d5947d5069531e9").into(), - hex!("b1a36c3a0a79836817a2890ac53c6768ed3965bf5d1663e2df69b1bba60910e84dcd4f917991812b305367786edfa288").into(), - hex!("a8d07cbfbbf31d113b80d3a1f82ec7c29c4d78007efb66b5592255acebbd8e1b0c8b927a866c79211d5d4994648153ca").into(), - hex!("acad1228fd1ffbc118ada45a27f33ea02a09455d0c295510da693d741ca3b5725af41b99967ea6d429f604736a4fac81").into(), - hex!("b201ad414928e315aa00dc60b89c7a15464d5e97c30b551a462d02c35e327d2ef3244a98a402f9e055a2f9af6e970733").into(), - hex!("861689f35fb72780dc0be92c140dec07857290495baf3137bd2e83ace2f268f205ffc58edfb0e09f323ea5f14d0ce10d").into(), - hex!("89138730c80c30dea01abfebbed79bbe6016b4924193d9c2e8bfaeef30616bcd92f0eb24d5345bfb005bcfea989fd8d3").into(), - hex!("b78092afc3f16397d2eaeb5bdd7fc6c01ef516a71102124febc0cb443f4446c18037ae75c7c1d0c8177454b092922ace").into(), - hex!("a739cb664cdefe7a2f38333fff13bacaca129d718a043fae1a1b7c4251a77319b44589429dcb9ad113f24e11d3b75024").into(), - hex!("879996d4bed3d3235c0f73ac8f3f612eecb6aef6756896920e0229f5deb1d91feff95734e6b4143ba89badb5cc1f0cf2").into(), - hex!("a213d854a0496d74526b3c37a48d6f610452b44202424a419acf206df1cf76f7357ff5c0899e45adb565535bb09c29c1").into(), - hex!("8afa04d66a3e8a2759ff088395cd98597883b3ca6d8811703f5fc74b822ce4e56e1dddeea2c099fb3e0f6648f990f1e9").into(), - hex!("8a2e7ca192972af2b77660b07aa612811fff94c951532e3fb6829e8031355363f4aeed0f9e02b845f00cc9ad4b744c4c").into(), - hex!("8f0757fa7ab1eabf429802c3811caad65833e763029c3aaaa43ce921abeb277d7dfd06e0e58d36e494871ab9bb090668").into(), - hex!("91c0c0b0564fd95db51c73637fad622e6769206bfa03e41474a4e68369d10de7da5d1bd2b5d226f0564cc1ee8c3e9074").into(), - hex!("82b35466d835a6f13080628ce407cfe495cbeee26a5168de9e595a122ae3757f2eb0a64a71ff1ef6ef26c8cc97ec1f52").into(), - hex!("80d11c7a711fd2dbfedc76fe018fca09295d5a3146df92496ba01063e5e098198cd9c52d3802e6cd033f64b3c651b67e").into(), - hex!("8607de2cda6838c70f262dadb21409649900c27a5bf3505ce2166ef6f616f4b7119aa3e3f3c62c1a508662d7d68e8f0e").into(), - hex!("a1c14cbb653115b6225f53e3e6ef8e25f87cf47315b25dea5e658493121ca22733d3fd2781920dfa3a04271d58970749").into(), - hex!("aa876cfb3d572bc1f84a5579dfe8df82a9177b441492382e8ef6528e28e46ce59fce9a82d42c1c2000b28cff06596d18").into(), - hex!("8742ee128452ee98f21360f903c0a57e600d622d4ac793f32d6732f5fc315f757bac89b0f39a4ddcf4b8668cd02f3e78").into(), - hex!("a2e04418db55c0d9163a1bc242e6d43230a943ead121bf8a5f50c109e4ecf0fd99e5b126a4fe2ae9b0a248e613b54f7e").into(), - hex!("841b7c0ab57c2cfb1a180a9b0a2875a7675624f0e5c779f01f3f92a1ea547cd1164485f54bc433d71c7b054a6fdfff15").into(), - hex!("9855f3506dabfea5a133ad49557c3c9e1c7b6965215cd940bce4bfa90e98d9c62999feb29da0af8768b99f5f82c64489").into(), - hex!("a65939fb29f1d913e36be1f877c8b9a3549ec17313c4354b1834cf7ca9ae220af26a72cdfdbc59567bcd7e4152d90930").into(), - hex!("b64edc36e0bcd48cb350350fce955609ae51f5bd197cb7d42b04a2ec7f8dbf236b2a3b23a6e0778d57796433f0e6e9df").into(), - hex!("9379a72a722c1a5c8399acf72ebadb7ab1c5a2e18137cd3850b211dfef907850399b6151ae7bdb590a6eb04387ce0c31").into(), - hex!("b621023f0d3c731f49a48378c3709a0c051fa1e3f8788d27169a76dc35d46cd6095b32d7e91794c35f4af8d75f950411").into(), - hex!("a82421a53687a444a065ff1e11c439cb7342a3edf496f2ccc04f56fc6630bcd79ccce1437479a6e7d6dce918d3d45181").into(), - hex!("857fb59242e6687e940fc114df3c06af5a89d85c762140b1e4b0f8cbcae9d604f435377d7a2d153a65e0dec099e3e8f3").into(), - hex!("95e6a571cbd7c7a58c1c599cb4c837c9f31757a6ee4ed6740e9d55c350baa847ce6d081023b43b397a3798c6843baf13").into(), - hex!("adc1e1f8523fc6e3d683dc0ca15ebdbf471de635f25fa7be6fde9907bd3fad130baafd7d21b43fa04738d4c19448d788").into(), - hex!("85f8ff5b661f9e529421f7e5f831db1919ba3170a59673546db695c3af8a82cb1ca352e07e6c801ef9fe6f501d5896ad").into(), - hex!("937b374871e35266c2815e4d0ad72dc2b6c756e840ec36fdb90a71ecdd4afe13f6064ef36b9d1590a39a7be2156fd728").into(), - hex!("ad4aa9b451187905652222dedfe6135111ce4eeebcca74ecc74f3464a07831754eb0072abfb96adc23d0c5c33a1d9f16").into(), - hex!("815bc7c9c7c84396bd0de5c71b78f2be5fddbbca3f600f341a21533ae6dcfef8bb94f4340ec2a90f40ab091efe4cc6e7").into(), - hex!("90bef1fc273005610cd79161686b25d88ed2ff2abe18f16a4054fa05dbcbaa339825616c117f55ab26d12bdf2e414f70").into(), - hex!("b96e51c2d2bd0fd78c4d3b9873d217eb76642c329a9ef293010fcadb45ef2f9ee3a9c34b0365e344d33c464c08a0f51c").into(), - hex!("94c4048c3fe7dfe736458ee16566027290f93b1f052c3cfaf28f5c33c32af6b9cc960d86181d54361dcc10aca9f81a58").into(), - hex!("aeaad402961126722aa5033c6bc7735d4cddf35ededaa08073ab1a8412e5d1d06e95c58c7a95409edf1566ae904d795d").into(), - hex!("93d019b814d00d5eb6e7545e6480da089fa48ba34f0a961c704db12e34a144818c306cdc4f31320e542c75eb0f1ca96a").into(), - hex!("a3c21f7864512c38a58f02c0c83993ce6294329b074b801404e4f941d21e4e7e5eaeccd41da8ac423c967b7230b2a505").into(), - hex!("80c26a2aff26da9d8d739496b5a63da6d8d35544c71b7b05b41ce4cbda89e6d32e85fb1e38a215aa01dc64cb43e089e0").into(), - hex!("8c5e66d7668ab7e0de06ebab4a4ffd13f24e4458610e64a972a1e1f15356f6e745cf36b8cde658d03817f2749616fe84").into(), - hex!("a1260c9a6727d6d4a4c147e0c7ba91c5e2a47b5a08a07a3ba0eaf9b50360b6919495b4aca5f85e8fb2e4ef1c307286c2").into(), - hex!("9150fbf49242afc6ab7f865d4a92e7013eabab432b341710232e0fd971eb2b214a3da5b82617a8b7defacbe060538ea6").into(), - hex!("ab44ddafebcba5a0fc1002f3bedf595f3245ae07c9184d640154968e4993d85087efa8a173a670d07eba1c00d3ed1c5f").into(), - hex!("91580bd78343a09b62e31bdef63dfa9e0c874d7b39eb8a4300388ab053f262e118f790392f73d4fcf7714b521690d94a").into(), - hex!("ad4b8eb477ff8e573a911a1a4c1ba027088828cde7907e193ccc4b853aea74c66d19ea99c3779f6ce4d505ad83f2174e").into(), - hex!("a5791ba6dd8534607100f405b2f104c987336d5c47a544ed571d0babc6dd88a634296773faacfc3fdc13a5f7ab0f0cc6").into(), - hex!("ada0d1c948bd8f66442cb4b9cdc3a5368ab6c585cd8be766b468864a8fbd60535e454943731d4121ca134743d05221d8").into(), - hex!("a83556f376d8cc4a26b53223b11426da96bdad5351c2fd451ea053346b334eafef9773e3486928b9d407d3e13d5dcdd0").into(), - hex!("83be01b65302a31c5ba09c8329f683904943cc8017cc8975272d7d284b6a15a3313e27887e4de9110f64445581747ec9").into(), - hex!("8acd831b27588a99743c5d4f61e6f0610faa530d6259f187aeade29f1c9d5956f1c01a5faed8be8924fe1e8d9de03571").into(), - hex!("b17e88d1fc760f3d6633f5b48411b7237e276e2fca621d3db4619da62993bdeb3c12cfe7d130a92e4d3a14693d1b87eb").into(), - hex!("b769850bf9b77a1958d5eb932f99807cb695eedafd476d99131e3d7340cb845a33cb2cc7b640a0f3b14901b506802ff8").into(), - hex!("89e7eb7cc852326b6e18cf5c720c4e44c474d254de9e912d22510aa4cc1952b5e5c40b46a4907be375b89bd57d9f1152").into(), - hex!("af7ec9a4b836709701fb497f69dbcd0d94bf986fb6894f48c67014bc8b0ca947da71722d87de0371923f5bf2ec82ec64").into(), - hex!("8d3ff45719a7fc5254e91c710d956a16b8e8435fc4c8f68d1a47672335246bba9627d7058510d25417b7eed5ece5c110").into(), - hex!("a99a7b987f7050c230ab1adfa50a30b4f3782cd31467ff9c2a749182a1974a36a6a375ed5b0909d1e627b32ce0245ef5").into(), - hex!("a0bea35f339b54d82e345204fd4b75d41af3bd08d33b223211e496ef7fcdd8e327dc5a9ecb6fcb7de134b3eaa43d30f5").into(), - hex!("9419df6b2bd022fb6c79566f932c37828ca7a5a1a9efb64f470d7ec06e0d6b0b0147cba88814581a0773c80cf3d21033").into(), - hex!("948b0cd553cafa57de03279b83fa4f28cdbd0ec4e2219e25fad53c9d3d28c619ede568ad6e095a155d117caadfa87551").into(), - hex!("b21383b264f67c8c66011a79e20a4d739d1f8fc258562e6351eb1e1c5b83e42090f1525886ff4b65875868ae17a8faa1").into(), - hex!("aca93939c30eeac8fc83c82ff6ba3549ff38121115a60b7fc94b7d64e1f36f65e932bd8f3bbf2bcba986c9309861fcfa").into(), - hex!("a728507043b7e86c0bf19cbd81a45e1ac98d2edcea4c7faa3381df13f6352232b711b03829e3eddb7770213866dde7ff").into(), - hex!("ae0bafa42eece82975171e94b14e7063a09bbcd44cea6b7da4b820cd5d984be4c00a2e9e5137b0d34603e1ac914f889b").into(), - hex!("b63cf4b55c4a62c50c356cc2721ae5a89244ba9aef2c9f5c93762837fb14197479435f593947c8943ac77e6a2ade0208").into(), - hex!("acb5cdbe2cc7c44ad3980f9ba74b0a97f36add3fbb4e9b513c62157c14812aa73fac68be8c30170c39d1aee626f5a1b8").into(), - hex!("b14ddfe1c42321feb8ffd76ac041814f3d690fc16ff47b23ffcc247e8722d50ae001b6df4e1af6cd7c67c8799c8a1907").into(), - hex!("abe60d6024a9d6874df7e59b4bbd7e1e55da22adba1d16320fbfa2b68e8db995997ce6f81f8809e96c40f548ba005787").into(), - hex!("a23307e2ee6d96561452294a9265cf0eb1d6f86b30c7ec48066cbbe889eb7f0d64819225293496db709a1fd60dde7e5f").into(), - hex!("8bbd00e149a9fd5eaca24581821c3dca114e008c3e92a36db536944f6b5e5e983628f155c2319cba9a8a2a26d3885add").into(), - hex!("954fcbe0655b82bfc15679237d98c3759a49ffd0eb7f5da1827711814b92e0a4be2c0b7a96fc16ee3e31099c993ce6ef").into(), - hex!("a9bb0a14061ab4de136605e94899a41c3585ed190b2a97f529e911f02ff389652049616b408aaaea81d38f08a8f6c533").into(), - hex!("b58fa12cd0b69ac2e5c50b543bb15abcc3a0c96cc9cebfff34c4f7dc83bb5ece69d881348860385456eb6198ecc640ad").into(), - hex!("b73597c5ffd3a812e8a553bd3ad2216282fe7c1203120624b86cacb8a7421ea6807e29fac3383cfd61d632db8e3af5d8").into(), - hex!("ad153b873be0eaa71ad3b0191067874e085164f8428b89c7d2e01af0802169a9afa1775ca0f9491350db9e6c7c6581e9").into(), - hex!("8a7fcbfc564fd1af76df52ac5802a7342aff25d745307d2b9cf29c4470273686d9877b4588754af0e1bbbbe0310c3fdb").into(), - hex!("84553c8b77c7e5c81bfb1413cfcda7f8fd95c78c011c19189784be6a5e7352248b3b30cf5c80d9262de6c35ae6d4f1a5").into(), - hex!("8866da76cc8ca6522c3d41c950ea7fd67d448e1d567ecfd0cb916912d597b754807f7489f5e3bea7b4110cc8088ded24").into(), - hex!("84adaf9a79d5c3bc8dc7e669ccc5d4964254d0fc32bc535e54c5e4a4f45aa3c409c11eadd4fb21f4c831329087adef06").into(), - hex!("a77ce1ee4f8feed6ffa0c5cb8fb7fe0f95a03117e746b56b5e8178d27a1582804e84a86aac1cbab53aadffd9f84c0bd4").into(), - hex!("863321bf40995482cff032854ad5017bd885baaa6ec4ef47ab6bc713640b1e258eb40797ba049fe677937e3ff7a2ba2b").into(), - hex!("a46fb6fad471bb923cc38748253f887b53153ccad475240bf7244c1f9f568ade931b0522911348d64460021639bd831a").into(), - hex!("86604e383195be9c40ab728db426af87698d0e34157edaecc357544037d66d40e558cbfef7b005f8db3c9faf541f2c6d").into(), - hex!("abb7d323687c1d0ecfe89d411d9a81d05d009b84e652af437cee40e89bd2657641cbacf28120fe93deb0a1d3b410fbd4").into(), - hex!("a8d2488d99e04b79057739e6e0522b38a0f68a21bc190696c38d96f0e58a9395e3b9011e54d2cf7e8fd0b380e753f2ea").into(), - hex!("a36fd6a64f64f40ece0babcca8926dfc005cb1d90e4adcaa9c01ff3bff8d73cc0f95bdcb4f09d7e3b5d761ad5c3c065a").into(), - hex!("9699c0c5b1695416470c302f3097e93b94004f42369be26afdf04aad49bed67851d50f14c44efc0a90e311ecb27b3387").into(), - hex!("929e6ba1338579c1cbe76f1b075c0fd9725adfa97ab8b821aeee75133a874426414fbfb5cde7f7f8b74fbd8b27bbf7db").into(), - hex!("ae874a087a61c3ba4bdc2a582cdeace6d321f81683636440943dd860c783344d4133196197a108f6f473bb1e75c597ae").into(), - hex!("95bb2da076a9fc25e96affc7e4adf71496dd5802d7443cb5a77e3d52ef544aaf939c0884169df547000b3afc55cc208d").into(), - hex!("b0b63d1993f601c8aa96448183ff560f291903e649192e2e34e796bb66a31f9d0edd0f03ba4f1d299fcfb1e931abbf39").into(), - hex!("84cc92f8897d0bc0efee72d62ec3a8c07b7c72e00913860623982bba412307c2c42069ed90dd996bc56ffd0573b607f4").into(), - hex!("8ae9804b99addebafd3672785d4402a583c97821087589b7a129961b6131fb18c2fa60d606cef4f636b6cbe46b5d6415").into(), - hex!("8f4c85506e99d383b103217077c70571ad8b9046d039174df6d9f1902f8b85143754969bcec37519a1340c79046f1c32").into(), - hex!("81a5a0214a381d72657e1142a781fa8db0d849e1e012babe4c912a1edebc5dbfc265bc7fbfdf8b6ccbefb55eb0fcbf86").into(), - hex!("82c0e11c9016d95501a97e551b8b926fa317f02fb6764cdf0981796e6e23cbf13e48d46bacc875681900fe8c1741cd27").into(), - hex!("a00912f7bf9abb33f1624dbeb5a960ed32addb4d6bbf9770b6d82d514eabdc339f751e41c8f4461e560141b53f086f8c").into(), - hex!("8d905bcf245556e52587f92957459a41b9974b5d8b8d2baf2d8a98edcac2a77fc8b1eb70024e1e28d5c7a190d9f2a77c").into(), - hex!("b8e19d883289d97b0174cebb92d12a8c6ab16e4a8f0db9d7b67ccb9bdf97f070352e6b24c2decd89e7894099445d8b96").into(), - hex!("89cee93ceec6e742aff71ff60085f04e9550ef5568012b4ef0aceec9928c677f9711ea553499db812bf80eb5df021396").into(), - hex!("89d58564c0215295070329974e51e528ee4d9cb197b089755a86451098bc2f347be8be5b0cc06240315f75222ba2e9a7").into(), - hex!("a312cf33dd49ba6488ee13200193f06a5801407a15fc79956f977586a27a4b2d4cebf0da22f6c1100ce2a0d08730a383").into(), - hex!("acb541c487eb8fb4034ca6208f542c5adec863f1346dfd50fcc0ba1c6866e43f0071c8cbdd62ce6a2498e16e80855fff").into(), - hex!("98022eb774377f49b90f41439cc6703fa152d1d38c0e0c78eed49cbc54670369cb2b7acbbc37dac6617e57e527e41b83").into(), - hex!("8f00d44e73473d7b96a686d1d3b0848095d0514b70128c22ccc4141219dc3f5d2ddc3345cc506ce0e747ba358289bcc6").into(), - hex!("911e37896367a3e8603eaf995480bbb62229a3758a608c4822410e46de45a1048ee6f67c2039aba9fc95281ba5476623").into(), - hex!("80a349a605d2968fbe362e40672b33eface969c975ef75a8fe82ee7ace1d0b5034b7af8667650e813876a8a7484414c8").into(), - hex!("8b00779d873c6976d8b01afc94734fcf943c1819ab1c46e512e0c43469cd08b93158caea1cde84d13a48f27407048748").into(), - hex!("99030a66c4afac7e3753abb669cdf576cf96e21b1d698135148ba133e2d8fe97b4875d770e6246597461958224f653c7").into(), - hex!("8766f592d757c09f617090eb8f226016073a992990e16fd64a705c0c3104b202d36de18ccadcdb3dac5d68afc2495b4c").into(), - hex!("961cce69a7a39c20500c96332d2ce4cdeb3d844082edd527fd1694cf499b30bd33f06da66047d3849b49f4c2ccc8bcf3").into(), - hex!("8bd5dee639c3ef32712931295cc5bd0a8820192aafd35d1f1f9a24130bf208b7cc3f2ae99d6fce02dcac4c8225564d5f").into(), - hex!("a89ba310a62330e7396ae361da7a74a596e4a8be02496c8f4b3c860ac5c3cacdfcf4790d00b2ffa75fa900db2bdb15fe").into(), - hex!("89bebf6f59151404989f282a567c378f2f5a04d85225e23e22e0963da27673f3c7e8990dfb526a1133a988811cd03f45").into(), - hex!("81e9ec6ed189c12ca8d4fe32e21c60834d7938f739545c7dd76303ce347b69beba9eb14ab780c00cfe3804c5756417ba").into(), - hex!("8bbbd7b584948e34852a26d18b9dbb46f2974fb68bc8317ba5a168094a74bbe2304e1dc438777ccf92117831f7986c84").into(), - hex!("8ffbf94991bddefde2bf0ccb115b00d7b19a6a448f093816b9db0c65a43a27519a52ac7b88e6e37a7f33d384d42b05e7").into(), - hex!("b62267be83a54451ace1b8e2b54994990d2e1d619e040c2075cf1906c25089dcbc08ed8c2f2f8f62953b822f163324fd").into(), - hex!("af6d55c342e0e7f0bc3ec547ebb4688a884b59410aca90ad6d8730b4fd3543952fe2476e2db871618d12901fbbd2b91b").into(), - hex!("9027b69f6e5d550acb459f8b4b9e3f05cf291c104594cd244b224eeb8cac419800ebfd5255d87e0dde31bba662e20134").into(), - hex!("8bd160918bfd8049878826f443fa416fe32bd018262b1b4802e015ffb0049197c34d730c5ecba951a93986cca1e23825").into(), - hex!("b82f2bf2bea66697c4b5ed6d340ba74bbe0dce84b2d23904270f3500507318ccca0dbc967a69c4379bd12766708dcbd8").into(), - hex!("b4d00a38be54fe5ba5984af648c9092b133f21b22e56ea106442421c03c26d282b81d31ef8d22ebf92c0c26f86d27512").into(), - hex!("857d95d8aab25f91e7cbe0ea70a3159723566192c1d6dc0e68c2b19565a865a0daeceb4b1c733f75b0dc9cbfe246d870").into(), - hex!("b222a1f3f2d05912987902a861796f43cde8124f7dc398170beb76b6434e7095a8e2d5de54b2692490cb0c325cef8956").into(), - hex!("b016f69dc65c3e72e77d43334863db2c364f3697c552d4bc0730f45cc32fab5f60a5dc0f9f2f6df409fe3e2ba3f2f3a2").into(), - hex!("931b966d70e048570c463bfe7ce7decaea3ad80d0540ca079ddb10958398ea27df85de2fb2b7c238d0763d6293d34b4c").into(), - hex!("aaa3cacaf65a90a6a8e8fcbb98b673160e5f410b28b08a8733444cd71de9e807e00b146ae35fff05160a786eba6793c7").into(), - hex!("8effa24ae2c3cc12aef32e737faf7985c03e2ccd984cdf740f31aac7a93ac295be7fafa3a4d47812d9e0fa5bc2b3472c").into(), - hex!("ae8f1044330885e22c376ba50926ca10177799628b1c3f6b731113126ace5faa7756ca80fda0c535ddc77d051632266e").into(), - hex!("8a6613706dce5417736438d9bc779e29646a0b12fb1c5b5e118aeffbe72d37ce71ef78d3da4f2cc8c1f3bb47f8721cd8").into(), - hex!("8a435b4d265a01f7de575ee8893105de8be608a370c2f1870b7b097bf3635abbdfaf164ac1c704a6c9b31d7baf48028a").into(), - hex!("ab842c0851dc81e247a42806ff83a2e23b86147d884cfc828cbd1f3abc7fee929657bb49a2910975be746f97d0bb7c7b").into(), - hex!("81966af3ed4bba12f6895bcc1e2d4af8a0b313f45446f4f2e966494460f77015d2c9e65eaf396653f8f55e50413e7986").into(), - hex!("b61357419b1d65649e79ccef51d68d1e7c746d77c7f32692b6ff315d9dacefdee2a527816ac3118e5c80e00212725c87").into(), - hex!("b3a0c1e36006ab666e4d4e98c78df5630abcc76e86b3c13c342efbb64c2f669d12a98e797429871c12a7171f7a751422").into(), - hex!("93601527015bc30178505d37cea121f19145e366be178e42c9ea7380ae34053c45938a3b4d8ef852ff8701764bf74a52").into(), - hex!("998a446e7b4dbd7a7a2055f437859dd3ddb44c52d3dad9250f085d797c821ed91a17dd13d00f532c5f0f2321c5b3eb9e").into(), - hex!("af35c5f4bb11a87ee3f626007cacfee4ca892851459cb9cb2e127e92c9c274f9082c905165758976f9c7bbaeb984acf6").into(), - hex!("a0df73b065667fa0f6a4894aba39b3e4aac620fb1a8a3be96c94423231917c3a7d75f04383b40cd802909d9cf018b0d1").into(), - hex!("85c9c5a5302b706af5af436c07d1a1a952ee1cf4a0cccf002f514473fcf85d05bc4c23b5da2d6d0b5d0aa503f7e41a65").into(), - hex!("abd1ffa853de61d8b26e6eb6c7eba5636967c155233a6d73fdddd361379ec51a74c242715b6ad0033a6343157aee7ebb").into(), - hex!("ae45b130af61f3e76012da75b19d46a786e0c21ca7c6b5bde193b2203d6d8b7b8afad25a198e8c920c69954d3d6bdc14").into(), - hex!("93729120899ef573f6f276a1ba861a400a35efff7a2074400bb6b5df818e3fc1f353cd5a8e4ce122a2bbd8f5b30126dc").into(), - hex!("b34615b2cf8912c51c02264008e0cd78b79c87b87d56db810d899490bc438d446f734ca958c7c291aff68e3211ec8c5c").into(), - hex!("a1ca372d158fd7eee15091582c6c1b9ac9854959677ee25e5786a94cf8c1d15b64f0019aef20331d9675e1f1ce41fd6c").into(), - hex!("a4bd66cf90f38233b579b8698f5655f077bdb1d626e1d36ceebc67cf7ab8ee8e129cbdc307895bf0fb6e34a4aeeffc68").into(), - hex!("ae06f6db3a3ea3a21193f6c6231db42d18fa3aa06a8295741bab35589dcb1d51256838dca01356d580e8c423c45ddbe9").into(), - hex!("b70b5f0cf21cb98c70996a9eb6e4b3562732505299149bbebef821477ff406dba3979a2526b9969213b9ba75e35de3f8").into(), - hex!("95cf5980f21a58f4604ffb99c8651752f724faacaa216f8c7cbe400774deda53f26aaa15fc6415e936f52ce13cec6ecb").into(), - hex!("933c0e5bbb358f5f83cf9e60c67ea8fdcc0b7a203fe5b07131e3bd69295c507880a1e542ab2a6a8d182866f7c6b14a8e").into(), - hex!("a8baa60ce583afcf85e4756dbb0a4871b330ee70f7872c3e36ac4d43f2587fbbdfa2a13162ceb7efdf897bb96fd2d97f").into(), - hex!("a127b3828c422ff51a067d482fb67074d45fd0a86bea5066c7f6dfa83f4b82b4584646518e898ff725cf5de055c6b236").into(), - hex!("871ef5a7f50e5ae528eb16bc30ceb64b97d111896d34fb4a65c93c8d0498eb7032033eb663f7b169a8af4b96e7acbe21").into(), - hex!("80d0bb10037029f0d8f8c9b9b46f0d0ff32b2198af44a4f84c8c0ace60f2b39f8f8d284308769c6075e9425d6229905b").into(), - hex!("b882ecbb78c758c951fe53b434af25b594e602dd783787f09ed077b79f7dd7851fed769a1593f5a5b938ea2171987d3c").into(), - hex!("ad41cb47b16077f73cbbc157527a17c936efa78a59d1f36e3c0dad67cd19fdc60cb772556018029611aa46643084f024").into(), - hex!("82ad3ad7a706ec19b39b0c8cf75d061ea3a1966dab04643f5b9d711e6651b45f0cd22ce5048cb51e4e118b305bdf231b").into(), - hex!("8286a4970b8db361abd04e5d197849dd335b7074f9c3fb91dfd19b7f43d2a3ae9e114b0cb6342463986d32d262c34d79").into(), - hex!("a844f14ffc4c99989a6c666dcdcc135c2fda96914220b1c565215d5c2c3102f5413b7edf9b25882a02a19aa78c2bc545").into(), - hex!("8e758f3b03fab7f5d0993e78674efe3f9cc211e268c12d23911fc01ae7a4c8f879a393e3fcde0c05c10106a59b59ab72").into(), - hex!("a973caa021aca6f0470460b84df9324ed894a441435a53c4f0c48fed4359242ee71fb3a0e4cf438839ed838f37e5c02e").into(), - hex!("ae17c713f10747282798487f02d25d2d8e7459ed436d90a895617afb9299ee81994ed68ef87ecdc0660b7565c323f0e8").into(), - hex!("978e68aa5f44daf9cfb9220147ff509ffde89d121d08d982a0fabae9f07cb3145c2312ad200f2f0dc051820fc54d07c0").into(), - hex!("844e58a9e35ce1005fd5785f56fdc9b3f7e8e073f48fa40da19a5e9e84aca00b8743c5407920cb554e926873092015c8").into(), - hex!("b296da231b6ca9d5535432c81f7d0c20a71cbd32d357740d1543e1e3910ea5d32b005938f9273af96e401637180f4606").into(), - hex!("8aee25d881e7ba99fa6aa2fc65ebd44aa498d31ecffc595ac8cab010f6cfdaca308f56e616ae51d7e2c2e15864eda0bc").into(), - hex!("a04298e32052d7f91096285c73d67cfb3f3f5463abb3d7caf3108d8d77aedf9896c359986ae598bf9602dc90e6eb3178").into(), - hex!("8c336e463dd98ecccefc55fa366ac70a2fcaf60acba2f2171490642a6f616a1c6b72601bfc3533a5f49ba02dd1e39fa1").into(), - hex!("b00b383ef5d68f0939c0538c7564614401283c6923dab4db4c72a05a88e05bb576ac374eda61c024345227bf45161e05").into(), - hex!("9273a1a6c9cbbc8d5a46498b7658f6125e955cbf19f0461d1372ea9de200688e4f7376b23b132b41cfd672fb42ec48b1").into(), - hex!("a7f04c0377207a6bb5d96e2e6cb9f7696d5dba2acc3dcd6021ecdb3d121a558999b2b3d92497f72f28f39a551b2fbfcb").into(), - hex!("8d530cf98af85dbd0bb7b1f2fdc24d499b19a941ef431bc7f37ca9328a4f6ceb0660eb87edbb1a5d868d3141fe6c51f5").into(), - hex!("ae88acd7fddf35c72c3ad1c507f8dc185546d8acdd92d70f00991f50afd67809167ad3171c7e45976456fca033f0a95b").into(), - hex!("8df71ffbc265a4bf475ac7ebdd5eba137f4c3b585075ea8957757661b3f11e7a92888094e85c8863ed53d91df45e37a7").into(), - hex!("917737cb24287f30c899dd88853ee3b9be54ea707ef38f1545ef9e436865be1399fd2de4d2c04e3fa5b4a3205f4305ac").into(), - hex!("837e57594b1b71fd9f25f27967b721df500e3d7c72f22e90f4315e10fabbef027ec1db0dd9863b817071fe3c9413a5af").into(), - hex!("94b9c2155509b2189883d2237cd37c9ed19c3a22203e9e2b045184aed072e406e93eb7b5c3fbfb85eeca4c5e630e4ed7").into(), - hex!("b022c75923080450ffe5ecb8e01972785628ec2027b6bf3dc2b09c92ba8ba55222965767c21a240705ed5af6e9d92695").into(), - hex!("b993e15339e28a472b3c98bec723ddeb7728822571ef1fb1c2a1607a4023f37d663b615c7855426170d9ad8f6a971617").into(), - hex!("b34db4df6a97056021b088c53cfa7cedc8e585f907a67d1ee8412a50d84e5e3d347011fb99d5d71b111c88f5efd44610").into(), - hex!("b582bbdd7e0d2ccabe94e6d193d1b8dcad1932d1e96ae8e1a295cc05b381646f682f1f66cb90ddcfcd7735b335ea0242").into(), - hex!("b289c068f7c988a69173d347361047211c302abfafbac1d87259388b5197274f5ee90d56228093a42eec32039e490868").into(), - hex!("88e84114e8e536051ef5197ad181f96ce13fcd5627f18964bf4bb2f461c6638033ba363800326e494e43aeee94c62125").into(), - hex!("80d16c3e8717274533ff3b764984479b3bc709f11ef5129644dfcbb5d8bdedc7a8cb2e539a4524bb0fd4d977ffd25fb0").into(), - hex!("9405d059e30017152eca6d6d86366a7a5570501d78c3869d638a2b8a0bdc8c5bce9f0b46764e78680e2fd41697af9d52").into(), - hex!("ae23483a1d25f8b9a5adea9527560cce5552994b3964ffde2fdda0ce7b6156e1d76e698d7314b0820976776baee37b63").into(), - hex!("8d8395fa4ff7ad0ae3be3d3c446cab058890cf7a07d0a2825e22396cc938cf2d7a986745be5e3c1758c5ca0dc29c0ea3").into(), - hex!("8c5899cfb437a72d99085d8abf54eeb345d7da59ef93978b0cd9207853dc491451939f4b1a7bf317c87504ce949713b2").into(), - hex!("816ca0740bce43365bb20e41c3d0c88cad587e4c743b2c0cac9dc966aa8de220da347d65392a9b750a2001499027e3c5").into(), - hex!("b3d23c55cec1d18bedd276d1454f93ad28c72d921dd6600d8102710770f52b79ee8cf445f6781c2ca095c9a25d41489f").into(), - hex!("95d541d6196c1221dfa5ff213dc3e658649a3cd4afc8e738631fc7b6914bf0dca74f41cf382fab364dcb0d2d6ed489ae").into(), - hex!("a1ab2fd361b973027f6ee6a9f8f2c081cb5d7199d69e36c280c7f9c3e99b1cfc994ad7f68ac0cd78c61bb419251fa14e").into(), - hex!("ad36ebc0cf82369457b665dfb2f8444fd2add0b49658cef2c800ab0297bade2c0249bb124f3d321536933128c1149c92").into(), - hex!("8f917e000d7688a0f508777b8db7c0ace39677c4458d7e50d8c9dc59d32faba4abdedfce3af26cf3d04c020e526ab597").into(), - hex!("aa994238e432c51896efdfa240f75fe40f1b1a7b624ff0aba66a35f827b9bf1197de3cdc0bbd9d0147304061ced0325f").into(), - hex!("943da065ec673dd41351270747e40c1f5a8dbd7ba259c501349ed754ffb91c56747a78c392cb4b78a796d748044798d7").into(), - hex!("b0c45ed1457710daa48edf2e61ba59988a8257ddf902318c6bb00be7a4ad8235b46180f7353d9f0c0f747a4cf219d1fc").into(), - hex!("81b56da0943d2940fc8041a51c74dd03f6dcd8a705ef2ec3b685395e313224861f29de31205d45e944e437179f19398d").into(), - hex!("aadd5eb1be98f3fc7e93925e46062353576ef2ee81421fe3f6850701728b8f74637d66cbcd344364565b0893d8bdcc9f").into(), - hex!("a5dd3dc1e172c899f4ed17fbdb842bea7d7f3f0d6b284af9749e25acbfbb2f9c1afb1848490bb22da9ddfeef30232323").into(), - hex!("84ba149e940db1663271eb16e920442bfeb035fc601a7389f85c78ce7bf27b13b5c1a5625d8b45dbbf199caf2d753bf9").into(), - hex!("b5634eb31a68f45a2aa17e8eae7752d8a58673fcc9efad34118b0f3db7415edfdc27166e6d809406da0bd26a0ae1371c").into(), - hex!("a2ad4aa94a40f1c159c7588ebdd77b80edbcfd95e867ec6991f711d39b4dc911cfb6da6075db23bc090218976e9ffa38").into(), - hex!("8de6002f3e789b014254b32161b5595257eb01ace67a8cd9657235e2d04f7ffce6ae0d059488bd9dc070c32b5b7b3fb3").into(), - hex!("a5f659b41f35fe6a9f43d1f72c803da876ee4aa5b879fbe5d5e93be38dcd5f10716122d83afd003b79b8120d83358884").into(), - hex!("a64e6b71dc6ab9eeb17d50e1d2516c5ae63680b50a6077fd870780aebffca70a8b7f8627e23731b79b3866813a20af0d").into(), - hex!("b0003260e70f86eeba286d3d9f6d73bf15f084e7240d9aeee38a1173ea5c47fd9a9637384204001873732e6a407edadf").into(), - hex!("8d4df6703cc9f1d0760c67ae6b20928ffeb6b13d67bc406b8a534ecb07d6ef415a106ed992b50267677f7d114f9d69c3").into(), - hex!("8cb982f382ac327918387c16c73de1ec5ff979923f1110b9660836ddc2f5f742aaf970700f7b27fb2fdacb126d341353").into(), - hex!("b6988aa5e4043e278c01c83a9774175b1188bc2d78b96817a7fb406f86aa4395b7eb666267e819a5a0615803f840171c").into(), - hex!("b69c70007de643e3fbaf7b557bcaaacb67288ef6ff616c9c89dee0cedd33a76396a90cb44207225568870c7c5601438c").into(), - hex!("971102768c0dba73925cfff2053b1cd8fa88f5c21aeba2cf3a78ac853818bb4a85cff714134879e5c7d7c7994cff20a7").into(), - hex!("b00b8d49b1f1fc0e792e257b0c3c33ab554fe231aaa6366f5aac11ff35051ae23cd2a5c6b9eecb3ad00e840c78d6a587").into(), - hex!("a34bf3b6d9659f1a89e40e3b35afe741a670a3a9305278a52d479535f4b5973b23b10ccdfa194cb2937f150beca3535f").into(), - hex!("a84c4fd757d86613a4bfe72cc9d7864c2c236b9463e365441360686e19f7f772ebb6c07a24c680462ffb1f3939c870d9").into(), - hex!("b3c34a2470e32395bd9c8789905166ba77b7b7d27cb504b8647dfb4fa6d65884afb2f120d83afd876b4a00cb104347a5").into(), - hex!("b9d18f57a669686eb8ec08555972e54505b7d487dfea7105afc76333138d5f934b9b5f9a3a7896481782fad5328bdbda").into(), - hex!("a23f65babfef6a2442833441200291028ebf56031d7154a4d7d0fa18acd4b7bd78dc34b85924c3073eb5be7733ac10f5").into(), - hex!("80948f3e12ffccd88605cd4d67abb83014c35d8d1a3254f6c546aa7197f810cdd06eb49b99f424187df218c8e8d7254e").into(), - hex!("b24ac23a86e23a16f4f04ed683ebaa51ccc6d2d038674e36d00a14fb71d46c433373a8a0bb75a0afd3c2f9605dd4867f").into(), - hex!("b002aef96f1702f4e3c92b00aa2976b57b77ed97a4d64619c6db676b286c6e633eca63fb232cec0d533a803660c20147").into(), - hex!("9867492f550c1f12276a201717bb4c420bffe904d55008655f929368b664e0293c1dabe9b5a5a71ad884a12686c1d9de").into(), - hex!("96b702733a7ef38b23e45999a04bacebe414a01bb41792cd9aff566fc23610d02e069c85c6fd4173846a40657a958e78").into(), - hex!("8e588db21f84245d034d7427055996f109133b9b3aa095472b879bd180052657da20a48513c1f625c339be90a64878e8").into(), - hex!("b6821bb1a130460ed1936d34cc189980d8fae8c5debc5149d47e90aad69ed3b143a3a00de5959e21ada73a06b3e8c9d1").into(), - hex!("a751ae06c6d699b5593f5928910e1ef3634dedd460ccd3f23d74f5f61a3950392aa66149ae366c048c6c7ece968c2d9c").into(), - hex!("86835cbe686b81fe7e096af5ac8c24f7cfffe2ce2b993626a606e42f6356c0d7c3d4ea19d110aa1a7b7f7ec5e68808f1").into(), - hex!("93719cea4911ce7e436f7b3ea77b9cfb83a1db903cb38f1de3b04d0a69a0f06bbc4f9acd3b313d46113009a917dd5996").into(), - hex!("b0d240c09c137a742d77edf11a7257030ef8b1a785b810de104fb24b22535cf0d62bc54f544b027d532f16b43a2df7e9").into(), - hex!("9376f46ab931f5c58b1be49c529ace24fade089af1af43b339721321a273169c5bb668250b2c2b0aa16aa522e6675bdd").into(), - hex!("82636e68d0d59d20dafd7486176b62ca2d5dd0275c8fff552fbb974565ef2406ff56cff5c43a5b9e383e0b09737de446").into(), - hex!("8f300fd7f29640aeb759d09735f9ac36d1035248c35ff38a165d2d931058268a055971b4fd4dd9d467960180cd255dba").into(), - hex!("a7d5f4e2b01dccd9cd7cbf566b5ab604efdaf9b682bb4ecae1b7801c2f93425350620e91ec807b0a110971c316e68cc1").into(), - hex!("8952700221cb45e3ab933ec20978d9c9c7b873784299b86d0c2d9998bb6b1d1efc1ee3bcd00c5148b2fd9473838ce067").into(), - hex!("b787e77d194e4dfb89968f4e289e97195c2674adba0a3e7d5582cefacdedf93a0e5f27d9d144aab68aaba878fd640414").into(), - hex!("8466c67bed3fbc30e46639de92c422f06bc80df658340a47299ad7798cae412c976fa6ae6bc0a32ce655b93b08cbeaf5").into(), - hex!("ab5d78cf76e16fcfc0491886fc1c95a492ccc67fd31060eb183b89bf59ed6e2d349324f9734c504e74c360272a22f369").into(), - hex!("a4f9f8539f9f89dc5a2c8296af591277c2d308275234729dee23e35e3d541919d1aa9a260780899615e2a895ad8fe703").into(), - hex!("94ed2cf23c5d28497b506515597ab71120f4ca42f7ebc5a4e87b798353eb70590923eaaf163bc550bf312bd6bb2c0b05").into(), - hex!("a78f064aa69402af33f1c9c1bcf04634384ad8528aaf8d28ce1d1a04804bdf93a8b49baddd6870eedf642e566d091af7").into(), - hex!("86796909d2dd3010e8d46c3d99a3c0efcbd4e986e581ef5be4c7810ed8b92268bbdac1dbf1b24d6805df6642f53f0b58").into(), - hex!("a6b555b50ec3b60e9768f407b84c5fd8a055150c17f78f2d5a3b0daa13f2c692e5041184bfc8919280c230c57adc9ddd").into(), - hex!("b4f9b0a0242ded4dc0a4903f16d270f21f2e15668b3abd45f79e1b465bf50074d232f905c6de6f2727a0a9ef039f7681").into(), - hex!("930b7dd8666a35358c6a0a42c600dbe8ad5d9682dfc641474fbd8fba90ddaac7d3ed5f5395f297dd571051ac2d603333").into(), - hex!("abba3bdcee368688a8e53d56627b915148fcab59717174fe8136c85bc24e8d15046da09b31c0c7c9a5bac1016bbfafb5").into(), - hex!("ac199e71110e15ebfb3e58b8ac14f1de8ebd3e0894f273f84783ef3fa4fd16ce6bfa5d41421e884e258fe8e2dce68075").into(), - hex!("a53eaed94fe550c07375ff5ed9706d69563bdba724a4022cf7c639737c97683f036400dcb87268184a9877eb116bd479").into(), - hex!("86e8269c1b368228438de5aa4065ab9d2888de7599b00d5382ebba8fb0600cf357de27e20edaa50127e213c7f6be1f6f").into(), - hex!("8f8d9b9b03b178d370a9e918dd54264f83c4ed20824be79427cbc973a9acf3d74637e5c35080192bb67e64390299c19a").into(), - hex!("a230cbc17aa669c2a9b02e736d20519d93a6fa1b6ed452e065fa78a0fb4b3a0f55fcbc5e719db6417353ef0798f70b43").into(), - hex!("b4e28c30e57cd33fdeb257cee66389365f4a1b9847f94e8b0552c65adff5719e51d50ec8bba36a71ec24641ce4fc6338").into(), - hex!("91799f066e16f9a07a419d3e425c959052f8ad1aee0e2f613d3b023829fb1946c81b16e8b733ed03ca924d03481bafcb").into(), - hex!("8ad935420f026b166233ad387c58857eafdd2fcd4efe55ce1bce9ffd668b8997555927fcec88b04de795129a10263d1e").into(), - hex!("a098f20bf1ae2510f1955c586c7115a29c64bd22a086a2f2a7ff5e08349bf24086504a1e5e1fa82b3aa73a097bcd948f").into(), - hex!("909a3d2e7bb5538bd89c446aa53f1f05a1ec17c88d793a310866cdda6e5d836d53fbb80afbf8baa8aa49db3836c912e8").into(), - hex!("89e64879667f34f1127cfacbd9a3337fa28c0227bac5c5ac907d6ad9c3a853472f4f7cf093e3b735968229398bc7c94b").into(), - hex!("b6ea32c4d640f9b7de841575a00003c1b25d0a845eb54b065129c271790bf602cc39761316c4e9dfc1644ae3ff4b05e1").into(), - hex!("80ef23a1cf6f50f96d5b4645bc79ed4c958f1394da9e5cda0cdaca3815ac8435a8d3a690ed19665b7cd1bef8bf7b0366").into(), - hex!("8b7346d1f30de7e50e3d3b32b441ba5681335d25ae6025623e1469466addc5515415a29ecfed987e07bd6a85ec1eabbc").into(), - hex!("99277ae52f7f2f193549739a704aa2f756c2ddff68b9848040ccacc675fa12d62c9fc1318daecba514089537a4e7b83a").into(), - hex!("94d392e29a3a1b8ce63c52288fdcd3f95f80bdd2a600626e2ce3517162e69b9c0eb36bae6786701ba12e23a33b8f90b4").into(), - hex!("8f270be40047911a4cd5997668bd6d62c90780882451c544ea4bdebe061a9e61bafa1d8bb8af62e0ce4fd73611a7f34d").into(), - hex!("a841f7229fd0490a853523edbd12a5dc6772bd607afd0516c582a813a10fd74d19f480d02b3e7b7b6256896620905976").into(), - hex!("aaf65a2e4e6a3d903ccb51a063d64688590a3ae54c7df3c5e8820d88533a6f10b81b130ab476c9f16c660a81f66dd3bf").into(), - hex!("b3683ebb70696339844ccac03925ec85c8dc06959608527a1744c23a67a805e71b5a91610fc6fbe0f667d054b4087e37").into(), - hex!("b042a5614245184e5a4620cd3a67c51811fcc0a0dff63ac06dc8030f01d8343ff0bd39ab3cdc3c09e4f3c1503ed35e62").into(), - hex!("8a343ff96dfae2c2e62558db3cc424b3c055e2cf84b53f63bf49c95d98ad0b372517df7afdb189007b7db725a3fbd567").into(), - hex!("a3a81a2b37160a371ceee3d07194a70e58041a3e6f75f47c4d8e2c619cae3f44b2de5703e3b80fbae9778e284927170a").into(), - hex!("b9554f94b7c611c2b3f63df5ac0f920d1eaff7b424bc8e857b94c354aa1d3c02a4348510099750e0af3e16dcd0f9a245").into(), - hex!("8678aae32f5bfb9dc249a39eb5d0638bd45d48d2b5b7be32b5e1c2be7b8d29d7198a15e2c24fa7813f060309f2493843").into(), - hex!("85f020a228f8952986c979028dbf2c2e8e59191970ea5e4cff6e6bb46251138d9edd90a211ccd53fd395db8addfb6d71").into(), - hex!("8b0801e8ea30467063d68caa5d3315809b3f21c7429f256fc2a10f7e173f0e1d1bbcf59e025b9e44238a53ef1b8318d9").into(), - hex!("a4d3fbad305853d8057c09bb10fdea9234ff90d51ad0c21342248895d77ead5a8c104c554e6008677e396b55d4efdea5").into(), - hex!("a7f12f870c5a3e2332f10cc2db7dc26ce58a94ff60ebc28f3ae06e820e6514d80c5133563225011213e53f51f748413e").into(), - hex!("a94ed25fba32b4302fff40e2c55e06b6fa4b9820635beb0b43df61010ab5cdaf944199bc73c4827214ae1f57bd75e70a").into(), - hex!("8607e973bc67d217ea67104eb538fcaabdcefcaa7da981ae0322916f7a74229b47f18820458823e7ef160f69f5363dbe").into(), - hex!("a83206fcc995ca57583c5952bef2027503308472bd712c536050217a391bf0fa9617d956ff6c913c2566cbc515cb291a").into(), - hex!("b9110bd697c294a0905503490d17d5536ac1782514bcbdd6f67e8fbb75c0922b39cb7f742d28cbf5356e4f1885b060c2").into(), - hex!("96e1d2b723a458f6b8cd4a8b2a83f33fc7931901cac1fe2169ffbf7c1ac8b4d8547165af3dc61c2b37ab88d3e81f940b").into(), - hex!("92cddef13af28962b7e281d5c0552ee5135b7a401944c9ab31d617b072cf00365e24dd87f86f6618b202d51c25f63fd6").into(), - hex!("a751e27a646ac1f3c828cb88585aeae6899d0940252973329b0589b05714bdc1cd271bf745d482f670f4ccbcd9a60d98").into(), - hex!("861fc00a2edf468353c6012a89ab7cddeaf964ee387e5eac48037eddc536df3d097c69a689f09bdad189384719d50e0e").into(), - hex!("a7dda298ac153aaa6a59785ed7b6900362b1220588a29b44764cc45834859bba0f5b9f8f17bba97fb49fa2c7ed4eb65f").into(), - hex!("a6b679d47e1ea1469e5dc14e1eba97ba2a0f2cec0a9a0983ca086f917298c93af45de60765aa2cb3759ed62c9eb5e4dc").into(), - hex!("b95b1f4472f8f69ee010d36db46c268c59cbd13864c63ce9e6a4755ad00c2db04c951e312b88060e8411018cf655e76a").into(), - hex!("935883b9eca730ef868329a67fe99ed5363b0384e7e6f97147d4c80a76d9b2d8ae6783e80d103149a8a3fbfd51f9f6be").into(), - hex!("ace980d1e3c76dcf78bbb87f3ca9bd0bba7897fcf9e24b27e00fa22855b1b4ac224137361ef6817c94fcc81fc3d3a3de").into(), - hex!("a614b6f113d74d4dd6dea66125b11195212031fd7d3da825b24739e5107cae653fb89c34527b399c43340064a9744a6e").into(), - hex!("83c27783856f9af7491ec9fd34be730600afa59484cae9d3981685cadb869dbd05555a07b93db7d0f361c9ae8e0bfe73").into(), - hex!("850f1389e21bec1c8785d17316a09af9355d32b75d02d9ad72791cfc5a411595a367ba9eb641c5b7acd6be1ee21579ea").into(), - hex!("b810405c7415c49bce0f7893aecde90da33b71684668877c5d6cdbe82161f9cd7eaa2d68597140e39fff8b9cd67424e5").into(), - hex!("a5923930d34526d70e083f4633de4766f04df901ca3adba4a462d03423b609d9813b78a2fcaa2d770a5abc27c260c39e").into(), - hex!("a6ec439bff50a4bef8d0cd47c52e92cf00846ca3fe97cf88e5b6d7800ea22d0ebcac49d9ecd123d4c156642f8bb4389f").into(), - hex!("97b7d3fbd11886976291a24e9e7d6f4974345e06024121eaf57097057c103b6f548d1f523416cd6b465e8109aa0be911").into(), - hex!("b45f04e0d4c17df2815a6fea2b04fd7cc2cbb8e6789084e224db3c1d00db1c6f1d325a63df25ee4a9a992553dab420b2").into(), - hex!("a91dc563b48b4cc210119ff55bec2957e8be50aa25928147d0434a9ea4088e98ba1f17c2050e713d2891a3c741ea6c6c").into(), - hex!("a12256c39f3b17c0540d2d3442b732b2485ae9da240a1ef47782549dc7e84f7a9c9240ff59a73fad228a3c01fe953169").into(), - hex!("aebc98b50533d844fe3149735750c10eab861e765aa7820e3d54fb66089ce15409206bb58d3aae5ef22a29ac5207c702").into(), - hex!("b023d0e4fc2eba4c60cedae9d2ffa79cdcd5c79279fa41baa94f536c17d746a6aa76e8fe203fb1678da126c4343eed8b").into(), - hex!("a673262367bde5d1775961c7d9aa26d9859c59600536130f9adc8f99f81f0106d2eab2c5ac3912476affcab3821fecdd").into(), - hex!("8008298954370c0c3026fd71fb48fc619caa394c9ea17273284a903b07de1d385336fad69c8ab6fe6692774d5fabcfc1").into(), - hex!("a98a824454bc0fba41a6543ba11ec6879c979e97c87e3f7f3a228ba995e33bcae9378740f925800b81d3627f2af36c51").into(), - hex!("a29c667540db41eb7ce06d74ad91c7ddeb3e1f019a028b8ed4ee705d8d079d6f7d36f1b64fd4b9b807f0dc1ab3d65d2d").into(), - hex!("86c32be8a7155f26696c1e541096ab43b3836315490a4bdad867b973ebfa8ac414e4074819b9639348a048bd6fc4bdee").into(), - hex!("a0de748319bb0c53c03f172c9aebc4f7538dfce6ffdd362d24ffdd111448277a8a705832e94f65c61aa635a5f40b6f0b").into(), - hex!("970de7621ef90cb3921f747ce1cf9d389f322cebc286c339395714a6d40167fe26e04e1fc3116d3b7bea1c99bfedf0fb").into(), - hex!("841ae6b0bdd22718fd917ca4a871d39cf6811b9a460b99422fb324235b2c51b460e48159d7e1bc1778de3513b7ab1f29").into(), - hex!("86764a78587892407b311892c4c4e70890bd757d3f72a832257f411646e9298eb4f042ec1c929cc6ffcf539dda90fe7e").into(), - hex!("b33008c5025d35243e91b6749e7d7934bd8334e5f58e88db907715435a28f02d018b09127fb0302d1ee68d7f97391040").into(), - hex!("b5ea29ebc8107525894d9872ac88b4c9662fd18d87316565a8b013529b478f17f6c1c0ddf6482db6ede54d27c0e80782").into(), - hex!("9576def9e5dd8673d3dec2090536672d44368b78b2c2f70dd9e36a9d0e5889cd9e2a47b77ebda94388ac75679257b829").into(), - hex!("823dd44b4635bf095786e47f836c4af02d4dea848bc1cd823876266341d56496e09bec8612413c302fb34c3383a55e0e").into(), - hex!("b6a32b13f8b1339b0591b9db343696aab77a0c2ff181d2069ff39581da8904499d619c26e6e44209b7791c3aa2fb7aa2").into(), - hex!("b9b3262a97049e236e29afc4a7c6d2e2253f437e013b90bd0882d35d46d7a67e1344b3dc822fcae27717a9887d842a81").into(), - hex!("8a94e08cda133175049eb2cddae936b16c477db54a749b8d3378233034f56fdea99520755ec8eb355b738af61138d9a2").into(), - hex!("a55933f63c4cce4d99d8df4fe6dc9d9a3054379ed2560bb2a9147f9e456925ab29f7b1f14321ab2501d67dd759f5ef36").into(), - hex!("8b5a713fb50a2aa0671f1405876b0a829a5c1f7c9915906bcad26de7e2011f8eb2e2b7a1cbf94c19685edf8b364f242d").into(), - hex!("97cd2419d4aaabe457b1efa6d2e557a0c4d8725e57e33018626fb31395ed78555b79cf90da49975360a497049004b20c").into(), - hex!("90d640d0c949a73543b476e0b634d442c0bbe0f4d3f1f4f99d19fd8d37d3b99c4bb3c5c08ee77c24f0af6dc7c29ce658").into(), - hex!("8f65263c9ac0026d9a536360c8b01b40243cc27a7896fada367372ba82ffcf2c758bba9f92c96fdd66956b25d7162903").into(), - hex!("ac50c7c4b3201f2c98e812e83452ded2e2dfbeb4c1910b873978c4b5b443b34dde042b13cb4943759cefe1a546bd8197").into(), - hex!("a07a157ebb964282729ab09205f5a2df132b5a0103233dca67dd55215b84e66423c576c6e0b055bf85c6a27025fe1aba").into(), - hex!("b89462ff76b35af9a1f23bbeb7f3b6e2f72f4d96aaa30fcce820573654895c76d813f27dea9251c96ea9e3f1726da99e").into(), - hex!("a81866a83434f91d464a93a50c4906224f3108777f731a1d363d16f769795be8ffd23c25f0e051d8c43a55b665c15bda").into(), - hex!("a974e15a6315d56d612f5e8d70171b01baba976ae1602265cdb74e1f5cf3a48c94e8b90bf1d343f3f56f8f9ece604ecb").into(), - hex!("97ad199e4ba05c97c5aa90cc6e63ed86f78fbea35b9f56f5107df643efe40647d1ac7e50cf6e1de8b4ede8e2225e090c").into(), - hex!("a67c3822c0e5902355fe053c3c41765146018dd90de0df89c6ae230826056e91cad2a28f06859b8ea899486ddbdbe6fa").into(), - hex!("a5dd8329edde8fdb8f82fb71637c7a4d1e13c51ab2b24cc98b80952575e821fe31c3e7de5a566f8a98e0243cebc6d1d5").into(), - hex!("b7070e8349dbd4359414c0d909de10a472c4a7fc4827804b3e1980b1cd8f468d21d4c6163c234c05f05534e423f6199b").into(), - hex!("a1acc31ccbb89ba6ba5be3ffc26ef83a28c3b0f76be71f87ef618f9f8171c8afdbc5f05c521c67171ea9fde1bad7a9dc").into(), - hex!("a86d620245d119b34f55c6145a65937e5ed5281803675e120d8c2de05eabc08f85eb8d8c877aebf535663518c4fe2f88").into(), - hex!("885317798c5b49430d50d5c5eb527540b0b704794d88d510b2511e9fea2de299d8f2cf2ae2e96196a9c0925ab1f30da1").into(), - hex!("8a5c37ad34f1867fc9fdd3303ffb86fb0d98ce27fd6739078949c070b44081349368302d7c910fd3d886165b5fbd3304").into(), - hex!("a1935e801664a3f51c22e616d25fbecb3f3be76b936e4d2dc28a4bbe79d002ddf01b94cdf9e18d07f2e2c4bccdfd76a9").into(), - hex!("b3d13a611ada38fb6c802e6f7e09d03703e9e7bf82424ded2774d6493dc0c7d8965e7839ff4d3f9fe00a1e8fb20bf13c").into(), - hex!("84f6edb320cf92e147ba3ba8b2470c57dd107b80ea8083219d3c91b77fba7b20b6774ae7ace26924c02c9a2247842bcc").into(), - hex!("86546f16627c3b875790b604aeb19c925f6d32db27c2ebf405df0324095fab1f8b748fd94b6c2b5a2dfeaf748a565b3f").into(), - hex!("b95563cebc351d8237e5f9b8ab984976e84ebf7e16c62102629cbda06c86b013c6a973d007d72a870883408b8343fd1f").into(), - hex!("8d5eff4d3238446be0f805b8f387fd57f298dfcadba88a0d87234bbede46d0ef833beb0f2ede7a51fa84a808393757b4").into(), - hex!("862179dd50e7a0fa7906248c0f3671d8d3b25504e30276da74a36edfebc8c92a04abc9dc3cba8c1b34005beb06cceca3").into(), - hex!("b12bf5775e3f9ae29da6b127ffe2892d5dec12f9c1bc21426c225220cb0d5fca5c6376afb5bf5f112f79c6563694007d").into(), - hex!("957cd40aa0864b86bc64420a184988be4489c0f0a3363f39571e71a7443ac6815a1b8ce4862c736be8441108dd78101b").into(), - hex!("8f31cdb655b66e1f8ad877639f71524aa78c09acc24aa493bd6f6be383c295f51a6e70f2573081cf87cd41ef55f5428d").into(), - hex!("a8f304c1f2faa78683d409dbb0c11e26583fdfe845f2557e378c56acc9baaa88cce25442733edcdd0da70f3e5557e53b").into(), - ], - aggregate_pubkey: hex!("870e9dfe2c909b7116a9a4180da4fb6ac4865f9304adc4c36dde6f82338c43352b58dfb494e6095bfade1dbf86e7f939").into(), - }, - next_sync_committee_branch: vec![ - hex!("d138fae7ec85d4d5ebd8d7375b3f39f4bf0d05439e6920a44bcc977e62ee0dfa").into(), - hex!("a6baa91932e6f9d9fec678e9fd75a140c8e74bd87f11d37093839826b95ceeec").into(), - hex!("926c0348ccc4c44119ca84e50911ac22078ab704b0784ebc593155da5c5adb53").into(), - hex!("c4a04575645ebf0cf5b3317a092e595adf49dd93669424c2a5efef700ed082a1").into(), - hex!("81a062566009887529ffc6350f713cd2aa30460c13173fe9ffcdbde71fd69f8b").into(), - ], - }), - finalized_header: BeaconHeader{ - slot: 5808479, - proposer_index: 218610, - parent_root: hex!("ac0c3b35e7e21d11d0563f98fb16bbfb0460aef2ee5fe39ea209aed66694601e").into(), - state_root: hex!("c66e3a4f1718ce82f35c898e8df8080c540aca493a535a2f6170a13b550faef3").into(), - body_root: hex!("207806f82ac8c5bdb6793dc61f31ce91dd06a7fe3a143d29b6579975c64d1d9c").into(), - }, - finality_branch: vec![ - hex!("0bc5020000000000000000000000000000000000000000000000000000000000").into(), - hex!("8c04962a994aadff4d3042da73e167e666323757db5b0234a497c7ddba058ded").into(), - hex!("95901d6dae3edaab0f29f2c6155edbc4eb3980b6816339a464fb51b91fafdb7a").into(), - hex!("926c0348ccc4c44119ca84e50911ac22078ab704b0784ebc593155da5c5adb53").into(), - hex!("c4a04575645ebf0cf5b3317a092e595adf49dd93669424c2a5efef700ed082a1").into(), - hex!("81a062566009887529ffc6350f713cd2aa30460c13173fe9ffcdbde71fd69f8b").into(), - ], - block_roots_root: hex!("93a5736680a9dfe23df1f8a6098c0671c583dae469847e25da3532b3649ae11b").into(), - block_roots_branch: vec![ - hex!("31a647639bd26edd8e3976b4475933d18d7d238210881f57570b7b4030133da0").into(), - hex!("0a3392c5febec2f099f93c5465c68f4f1630927d0326ad84c8d0b318364dcd82").into(), - hex!("986071ec073d43597d67a6595f7f6fc807ef1042c6821fda41ff80aa2717536f").into(), - hex!("732f545955de627e65c46201f053569dceab609948147690136bc64e060f38b4").into(), - hex!("2e7c74db495877af1e95da27113e89757ea475e8d672d319e655810ec64d4ba2").into(), - ], - }) -} - -pub fn make_finalized_header_update() -> Box { - Box::new(Update { - attested_header: BeaconHeader { - slot: 5809441, - proposer_index: 169069, - parent_root: hex!("a4d2fbf3ee62f32589738f386559a1e2358f4f54aff5f7eaea61144d3d9c00d1").into(), - state_root: hex!("4aad4183bc21fc96c90f8e043049f8c1d5ed205c6880c89cd99f2e080ef85138").into(), - body_root: hex!("406c96c6adad01df901df3625cbd622f1d541249b05c768ccc4db5643d973141").into(), - }, - sync_aggregate: SyncAggregate{ - sync_committee_bits: hex!("7fabbff6fcdefbebaefffff9e37dfffebff57f7bf3e3efbcfef1f7f987551dd176f3b3ff7bfa3fedff5fdf7f7afff5ff777bef5f9f7fe65f97fffe7dfdfffbdd"), - sync_committee_signature: hex!("84dc756c452ec9a3ba01cc98d03cf5471b871e9f3f77ddfe72ddf6d5d318ec3de9e5c1508e47ed362300cd45a144655a076d50073c24a67591b0454d2a4632bc01e97eab80f937a8288131a31ab76f400ba9c26a19df176c7e67b724f70407c3").into(), - }, - signature_slot: 5809445, - next_sync_committee_update: None, - finalized_header: BeaconHeader { - slot: 5809375, - proposer_index: 170923, - parent_root: hex!("87fed31787712fa6e802b9f296c1eb0b0ac5bc77f6945d4478c4d25bd7160d1a").into(), - state_root: hex!("246ac89e1854bada03be1da64081954e008238de219088609ddf45efc8000346").into(), - body_root: hex!("ffe0fdbdc2bf57bebdd084fce3820a13801095d236a2fb8f3a64c9d7cf94f8b9").into(), - }, - finality_branch: vec![ - hex!("27c5020000000000000000000000000000000000000000000000000000000000").into(), - hex!("8c04962a994aadff4d3042da73e167e666323757db5b0234a497c7ddba058ded").into(), - hex!("95901d6dae3edaab0f29f2c6155edbc4eb3980b6816339a464fb51b91fafdb7a").into(), - hex!("34e68ed57efdf18c5d2f455e77fa8b2a5be95bb827bdf7f7f6648103688d84b7").into(), - hex!("fc1d45f882aa66020a92c55da663ab9758581a020eb7336173fe84ef861bbdf9").into(), - hex!("7d1745c42ec44d4b2493a55dafdb770f6d38eb4a7ad68ae0264949cb7432e4a7").into(), - ], - block_roots_root: hex!("9e5aeee5467301f3a44d1ab664cebd198519423e73e2118ad046d9bae217f497").into(), - block_roots_branch: vec![ - hex!("ef671e41918c36e23a3673407050b420366022886dcce1b707622de97a695121").into(), - hex!("707cb79caeaf310c10ce1c177312e48b2331164c8327d2635203148c4d974f09").into(), - hex!("1fd802c27384482fdaacfa7406072f6f96ff5428f003af748068d1965cc36981").into(), - hex!("8a31cc13bddabda4f79d948e5e3d70806f638b61d89c87b40aa7131af43c18a8").into(), - hex!("70eb43218a3a6f619f1d0dc7f173fc9c3323fa7e3824ae6cd79af2f7d19634ad").into(), - ] - }) -} - -pub fn make_execution_header_update() -> Box { - Box::new(ExecutionHeaderUpdate { - header: BeaconHeader { - slot: 5809374, - proposer_index: 130336, - parent_root: hex!("2bb54c61560a80d1cfb0528e8ea207dfb9d55ab49238523e21609a9ee3b8a9b5").into(), - state_root: hex!("0116ea76f5c36373dfc8e039811eba86c8e8e16cfe9f0614376559b6585741a7").into(), - body_root: hex!("9a10b47e30bc11fc2ee1e21943a8382d727444f646f09664192236458b555ffe").into(), - }, - ancestry_proof: Some(AncestryProof { - header_branch: vec![ - hex!("eca009f3262f75b055e6c919e2c0a2c017f017e581a825a2618a2a76926a264e").into(), - hex!("a647371a5590630186dd47b9b8571f27e39a77b4aac1f763fabefe104bf94985").into(), - hex!("9a414690540e4c87ff5171b619b3ab6ff1115c21f247196989f5a0a9085b59a1").into(), - hex!("1bf7ae16fcde0833c6e97a83b72aef31a0b5ca055b87f86602b9b4aa193f557c").into(), - hex!("588d993d05b59bf3352f0f5ebb4cd3ec97ca3e41800da675996741e8fca374c0").into(), - hex!("fdfc6280944bb0a18c9cd0afa9f4a255719a4650233f19de478399276f198c92").into(), - hex!("1d96235b47c604f029b9ab7eb913b13b3c0c2df7f79e3301341b1ec38ea44e4c").into(), - hex!("3ee3af17ce8f5a4946d30b6bce7d6e7580b3981cd2af92246401e2326224f6d1").into(), - hex!("b53b5450e070adf02f4bb9d7c65dd131d07ae2218340eec95ac8aa5e5cdd82aa").into(), - hex!("4d7c09715a1f25574afa1dc3dd7bb44e4c1a723b9360c893b8510f675f85227a").into(), - hex!("38c159fc38dedc1e4f399a3f773ab4376fc40b126634b40d172d5daa6602cf94").into(), - hex!("9faac6fa44ed19fcf530f77b7090dd50dd17aeedabe763931ab7567276025a75").into(), - hex!("c6549c1b0f0027ac373164437e7010b955fbae1a0e78485408ec33ca906beb2d").into(), - ], - finalized_block_root: hex!("f6e721e4e65d9565091a557705285ec6db0a3a3072317317719ec8ad563859a3").into(), - }), - execution_header: ExecutionPayloadHeader { - parent_hash: hex!("6d51d7c94763813ffefa234097a51c6fd7009424d2991695f7bd6203157c86f9").into(), - fee_recipient: hex!("000095e79eac4d76aab57cb2c1f091d553b36ca0").into(), - state_root: hex!("fe9f753520a7b5c0263bbf4fdba728f69e9cf861ce1883aa13de5da30ff75d74").into(), - receipts_root: hex!("cf6ab47d8fc336155b18abfa2d965aae57d9d35a2fcf5cfc992b8dcd136958cb").into(), - logs_bloom: hex!("8427414fce71480d7e70cdbac68dd6f77608c05cf349c34c87ad3256e8dde9e3f9c52131945876c03b6e83ea5970536428283a180eb40efcc5fd834ce424f0dbf622dbba6cfda7945cc1f93a1b6e7ae448c598b4f45f7cfa933fe9808d835cb86e8a38261a031448e262f8e4f2dc4c3254c460e5faae4b518438c1330012154a1ba33ab7d85c8acaa9c47dc582fd003a771c9b09aa16c34d4f0c01fbb3f8c0a28e11d2eafb4e73b75a18e182eac7c021706832a9a785836d31f651efacf88a329334e5b3def3bf1871573dc3553f415f298a9457f7837a31302937a4178be1339cdbb83af329ae7e88d8ab6cba62f018be139896ecbc7ac11ef24b0b4ae343e9").into(), - prev_randao: hex!("5a76eff974d26bf74dc3003fac473ab4abc541be26bd61f124a1818a70ea0b3e").into(), - block_number: 9143323, - gas_limit: 30000000, - gas_used: 28165724, - timestamp: 1686220488, - extra_data: hex!("").into(), - base_fee_per_gas: U256::from(2267_u64), - block_hash: hex!("e4a67cdb1512f29ad9b331e7a37cf8e376222eafa58e72cee7771ad582cc0610").into(), - transactions_root: hex!("bd7eaeb676c14c37bbf0b6f3db2ce021a04a41dbf002f6c7df3bb61639ac7287").into(), - withdrawals_root: hex!("8647d3ecaaf62e1d087c5ab54a23f1d64f477b7ddd16fff458847181d89fc432").into(), - }, - execution_branch: vec![ - hex!("795608ac1294bcc663127b8428513ba4a5ffe952ff72f8322dca23628f13d716").into(), - hex!("336488033fe5f3ef4ccc12af07b9370b92e553e35ecb4a337a1b1c0e4afe1e0e").into(), - hex!("db56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71").into(), - hex!("2a8f5c65655edeb2800f248f2e14044fc651061d0c00c8e8b627cb21ba421fb4").into(), - ], - }) -} diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/benchmarking/fixtures_mainnet.rs b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/benchmarking/fixtures_mainnet.rs new file mode 100644 index 00000000000..4b88d887091 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/benchmarking/fixtures_mainnet.rs @@ -0,0 +1,1215 @@ +// Generated, do not edit! +// See README.md for instructions to generate +use crate::{CheckpointUpdate, ExecutionHeaderUpdate, Update}; +use hex_literal::hex; +use primitives::{ + updates::AncestryProof, BeaconHeader, ExecutionPayloadHeader, NextSyncCommitteeUpdate, + SyncAggregate, SyncCommittee, +}; +use sp_core::U256; +use sp_std::{boxed::Box, vec}; + +pub fn make_checkpoint() -> Box { + Box::new(CheckpointUpdate { + header: BeaconHeader { + slot: 4058624, + proposer_index: 631, + parent_root: hex!("4abadda13b61df8d40fcb061d1ec15d0fb7bc5144252bb54c57b41893b642bf3").into(), + state_root: hex!("6fe9fa01a04dcdeaa64eba04a72fa6dbadc8596dc5ec1fff2ef343520fe722e1").into(), + body_root: hex!("6cd83df0ee7669e06e64496a1d2be083bc3bb9f2da17e9b1e62979d200328106").into(), + }, + current_sync_committee: SyncCommittee { + pubkeys: [ + hex!("a13bf1fc1826b61cceefcc941c5a4865cefdfa6c91e5223308fa6a0aa6e7b13a0499a63edf5d9fff48fdeae83e38dcbf").into(), + hex!("b3285148b91dab139b053442bdd14d627ba1e1250fe469f0f2df854b6e6ff4a18671ae3879ec9f7d8091f99f092162e9").into(), + hex!("b00d95908e72c6051478a422eb2231b5f797c2fa5c696ed1e6b9c9996ba1d8236f512443f18c01ce63312c38fa383fd4").into(), + hex!("a866633b4293e726accf6e97ac90c1898cac83e8531a25b50ae99f0ecb477a692e6a5f2488447ccd83ed869ab5abc406").into(), + hex!("a308ed8737b3a9346ff20dc9f112efccc193472e6fde6aa218ceae11e288bbd2c35fa45c1d8bb238696a96767cd68b46").into(), + hex!("81534e2a182da0c6831479c7e722953d267ba9c63a204ac96a178b1dc90d0a6ba8737002688ba5f102eda5669249f114").into(), + hex!("87c5670e16a84e27529677881dbedc5c1d6ebb4e4ff58c13ece43d21d5b42dc89470f41059bfa6ebcf18167f97ddacaa").into(), + hex!("b37334c41a3456b73b61d0eb0777260af9c2e400bbec0e0c0fdb45c39ce0dd19f021d9760f35da801f20486c6be30e9e").into(), + hex!("ab73a043ccdfe63437a339e6ee96ef1241264e04dd4d917f6d6bc99396006de54e1e156d38596ba3d15cb1aaa329f8f5").into(), + hex!("8983fdebbeba6e3cc3ee1c9feb24faaeee712356975e359b0ddca3f7c9c7448132d665f54a4629002252d3fcf375f7b0").into(), + hex!("a03c1e287ccc4d457f5e71e9dc769294835945561e6f236ac7de210d2e614eee8a85e21dfb46e2143c68de22ccee8660").into(), + hex!("8e6b888197010ebadd216da35b9716daa8675d93b3c33a96a19fd9ca42624f6b430b2ff115cd0f5b717341605dda24bf").into(), + hex!("8fb51e3ef3c1047ae7c527dc24dc8824b2655faff2c4c78da1fcedde48b531d19abaf517363bf30605a87336b8642073").into(), + hex!("893272a63650b08e5b8f9b3f17f8547b456192ad649c168bafd7166b4c08c5adf795c508b88fd2425f7be8334592afb2").into(), + hex!("a90c42266ca0a65976fb4dc18465b0a44a63ed3b2747cae74e46e3ccf158f98384e2e86c852e7c5556b083b3ded9d243").into(), + hex!("b67c621d9b6313a9f6744dfcdd77d4e9cb4bd413fb5e3199cdcd7f675fc39f1ba492860749bfddf98f4088756e844a98").into(), + hex!("a9760afaa51002be0948acf7aebd90ec4e60e0dba8456e445aea93408a0468b62bb6da4984b92f8f6061561c9d56f4c4").into(), + hex!("981b2d7c56ff38f1d02c5d7a7f8bfe71daaf94d48c3bc93e8083a0a23c1ae1ff05f90312deb09b35d4513c1ffa573d86").into(), + hex!("9515dedf061e654d58a43e4e525a63ad2a6274ea6f20b1d624a6ba7d3062ed68a0226eee6951ab8464906c52ba5556b0").into(), + hex!("901f724ee1891ca876e5551bd8f4ad4da422576c618465f63d65700c2dd7953496d83abe148c6a4875a46a5a36c218cf").into(), + hex!("a8d152e5d94b75cb9e249230db21af31de4d4f3d4ef60ccbf2212babf69aed2a38435a993ee2f13cca410ad55a4875ab").into(), + hex!("875ebfe737cea438e967d70ceaffb4360cce28ecc76c8c4ee612c47fb6b3e89af03c66981571066107323f49a6242772").into(), + hex!("a798a0371e8cc4dc42ccd79934b0db5a3a59f18a0ae09f2eb172596428fcb3f00312e783d6fd21cbc1610317f44e08cb").into(), + hex!("99c629c9cd603a9344b04d22d2bcc06cf45ebf62d97f968df19c73c7a50f4f6a2a2cc7fb633f509f961edfb94fbab94e").into(), + hex!("854410e6fb856da8b997ebf28ae2415ce6e1f9f6a4579fad15b5df61709c924a925397b33fe67c89ffad6143a39d756a").into(), + hex!("a3969926aa2e52f1a48ac53074b764648b4c71bd43430944679628463cd68398f700d874c14503b53756be451c8ba284").into(), + hex!("8ee8873de7cd28a54ba2c63a80b63399effed76b154e96ed26e7c0668b9f2476e298688b6a00c4b2ab9d020a897695d7").into(), + hex!("ad54241ba3de6a4426c788690d3f78d2eb678814edc49d3fb988d7fc752e43512972567bb384bcc1b18d083d15e376da").into(), + hex!("942bee9ee880ac5e2f8ba35518b60890a211974d273b2ae415d34ce842803de7d29a4d26f6ee79c09e910559bdcac6d3").into(), + hex!("96b478b1e5e49d4ea3fd97c4846ae0f781dcc9f9ff61ee022ca92c3d8dfba89c513c46e8bb38b73e6b678a79b9b12177").into(), + hex!("aad9577501d7f3a5dbac329f2c1fe711710869cc825740f365488fc55a278d687bb72423560f7cb2cbd60546a82ea1e6").into(), + hex!("8aa3d9dad1c122b9aed75e3cc94b3a9dab160fa4cad92ebab68a58c0151a5d93f0f6b40b86fba00e63d45bd29a93b982").into(), + hex!("a12fc78b8d3334a3eb7b535cd5e648bb030df645cda4e90272a1fc3b368ee43975051bbecc3275d6b1e4600cc07239b0").into(), + hex!("ab01a7b13c967620d98de736b8ff23d856daa26d5cd8576993ee02a5d694332c0464ed018ebffcd5c71bab5cada850ce").into(), + hex!("96cf5760c79cfc830d1d5bd6df6cfd67596bef24e22eed52cee04c290ad418add74e77965ea5748b7f0fb34ee4f43232").into(), + hex!("9443e6ba4400fb3370c573cd7e33f05e1475f9cf1d6adb905bee3aff8f1452d8d384c8a72c9110070f35c6aad940bba6").into(), + hex!("95c60b5561e53cfc26d620be90f84199ffd6dd9687c1be3a547048e7cba10a0be9bb6da000e7521cbd488d0901d48ee9").into(), + hex!("ab69cf79750436d310dc3c5e96c2b97003f4394f31dfa8a9ac420595dc7b4d96dad5787d93347ba2bc6f196c241a3dbf").into(), + hex!("9145ee1fb6e84114c903819db94fa5a72bcbc15fcb8a7fd8eefba23b156cc46309281dcf78b48a2847b3754f7d7d7a79").into(), + hex!("b118f77f99ac947df97e7682f0fb446175185b842380af4ee7394531e4f93002c72b41a57a7c1b923a4f24b10924c84f").into(), + hex!("a4aabd1890ebf35423565dbff3477a09eea4e35f5a26ed449eab38e0a21fb89e9ddfe3a2003cddc457db648a1b5891a3").into(), + hex!("8ff5d2e6c98b1fea70cb36ea8ed497fd1233b9418948ac58c6c379ed35fb10f8253ef188c909d5e77e81b5b8e2a4ad17").into(), + hex!("a23f076306c120dccf69d7d2ac7f83a377a72d35bf448f88feff8b6dba9307fdabf34452e30b87407b2258b9edfd1174").into(), + hex!("87d2217eb05d657aba7b048cf3c661b463e78e51135a5b937e71975ff5102e596434720f02349c73415decb88418cb0d").into(), + hex!("8bb51b380a8a52d61a94e7b382ff6ce601260fa9b8c5d616764a3df719b382ec43aec9266444a16951e102d8b1fb2f38").into(), + hex!("b0053550040ab3a3996cba5caf9ad5718867b5f5df273ed8c6520761571f03a94e50b5f8a6a8c42d725383cce97d3cae").into(), + hex!("ae50f93230983a82e732903d6ed50a506d678f35b6b4a4b3686a92b12aeb9d34cb095e8562b0900125bbced0359b37de").into(), + hex!("8bfa106ada4914419bf1d8900c5981dd5b90c3023196d7e918d62879fc3a575bd0a25f939366f7fd2240df6108b069ec").into(), + hex!("b3a5497365bd40a81202b8a94a5e28a8a039cc2e639d73de289294cbda2c0e987c1f9468daba09ea4390f8e4e806f3c8").into(), + hex!("b4f583e10aa9af79b4ebd647e0fffe1c720112727e5ffac4313f236737491fceeee194537786c561cd5777b453e5b03c").into(), + hex!("826be957cf66db958028fa95655b54b2337f78fb6ef26bd29e2e3a64b130b90521333f31d132c04779e4b23a6b6cd951").into(), + hex!("aace45334070c51cc8b3579598d4cd8cda2153bba51f56e3b1fe5e135c83ef70503c322756b9cad9d3cd28f1ecfc8227").into(), + hex!("94bb68c8180496472262455fd6ab338697810825fa4e82fc673f3ac2dacfd29ee539ac0bfe97eb39d4ef118db875bab6").into(), + hex!("b560c33950a355119845f63defb355807e56773f636fb836f7746155fad070e384fc1091b8e5c057e4cbc7da9275ecf7").into(), + hex!("820cc2ac3eed5bce7dc72df2aa3214e71690b91445d8bb1634c0488a671e3669028efbe1eae52f7132bde29b16a020b7").into(), + hex!("9244703338879e3ea00663dcde8f11095de3e38df9277d8c2acc26e72021c222ae40bcc91228789fdf0b69acc3144783").into(), + hex!("8d474636a638e7b398566a39b3f939a314f1cf88e64d81db0f556ca60951ec1dca1b93e3906a6654ed9ba06f2c31d4ea").into(), + hex!("889a5cf9315383bf64dfe88e562d772213c256b0eed15ce27c41c3767c048afe06410d7675e5d59a2302993e7dc45d83").into(), + hex!("b544c692b046aad8b6f5c2e3493bc8f638659795f06327fff1e9f4ffc8e9f7abdbf4b7f6fcdfb8fe19654d8fa7d68170").into(), + hex!("aefc682f8784b18d36202a069269be7dba8ab67ae3543838e6d473fbc5713d103abcc8da1729a288503b786baac182d3").into(), + hex!("a0f2092ac34d2363614fb2f57fc7b72db247eb1fa53f395881ce6b4aacd6fb920d6dc59507701d487288102e4c4fa389").into(), + hex!("b33de3de106be61481ccb7f07a7a63cf4d1674010e462388fb8ab5ea08f444ed7a277905207e0b3aa2f00bb9efca984f").into(), + hex!("84173aeaf3d96368dc7ca1ad5e5575da279113567e5815a364a0356a720c5e08cb58ca1fdd891924f4871d3eaae5de40").into(), + hex!("b6d6482ad7b9b412ffbefbbdcc28eb3d091b1291f54f77bdd53c4ac85f705c454940f466dc272dde7b03c26f0cd6ecb3").into(), + hex!("a2053719da2b7501dab42011ae144b3c8d72bd17493181bf3ae79a678068dc3ee2f19d29a60b5a323692c3f684f96392").into(), + hex!("8296f8caf58316af535def398a43357e48cb3b1e674b857eba1bd1b970da3dd045e22fe6d17dee4e9117f62ece3ec31c").into(), + hex!("84faf4d90edaa6cc837e5e04dc67761084ae24e410345f21923327c9cb5494ffa51b504c89bee168c11250edbdcbe194").into(), + hex!("879aea8f09dec92f354e31aa479d00cb77457d363de2d9a51ddf7d734061b6f83d6345cf33dbef22004cd23dd6c4b760").into(), + hex!("b8fca0f7bc276f03c526d42df9f88c19b8dc630ad1299689e2d52cd4717bbe5425479b13bdf6e6337c48832e4cd34bb5").into(), + hex!("b2a01dc47dd98f089f28eee67ba2f789153516b7d3b47127f430f542869ec42dd8fd4dc83cfbe625c5c40a2d2d0633ea").into(), + hex!("a19f2ce14e09ece5972fe5af1c1778b86d2ab6e825eccdb0ac368bb246cfe53433327abfe0c6fa00e0553863d0a8128e").into(), + hex!("95d1f944b0c53eb3e9fcd5632713602bbb9195b87a172a370ae2df98504612a55f3968615a39b569ce6a0fe9fb559be7").into(), + hex!("ae36ab11be96f8c8fcfd75382bb7f4727511596bc08c25814d22f2b894952489d08396b458f7884d6b3c0adb69856a6d").into(), + hex!("824d0dc002e158adef06fc38d79b01553be5a3903566029cf0beddb2248b11da40e66feb168e8e3e2a63ea033a75f382").into(), + hex!("8f9f85ae6377414fcf8297ed45a736210cd3803f54f33116b0f290b853dc61e99ea08f3c422ed9bc6bdc2f42ab4f56ba").into(), + hex!("86c53fc078846c3d9bc47682506f8285ba4551475921fd388b96291741970c34b8de4210202e40d2de4acb6e2892072b").into(), + hex!("853184f246d098139230962e511585368b44d46a115c5f06ccaeef746773951bead595fb6246c69975496bac61b42a4f").into(), + hex!("b91b4260e2884bae9778fe29a2c1e4525e4663ec004159def5d47320de304c96d2a33ad7a670e05acf90cbba3efdd4d9").into(), + hex!("83492e27e07e35c0836aee6bee95d040b8d3e82db6f94a3917d07797800f7200f5dbc6c9596c6c3c70f8f470b65a9b6e").into(), + hex!("b1bb33607d10ea8c954064ecb00c1f02b446355ef73763a122f43b9ea42cd5650b54c5c9d1cfa81d4a421d17a0a451aa").into(), + hex!("99cb1728157a1b7cdd9607cf15911bbcb56b64d52fb0d0117b457853a81ec55913f977850f26e188fa2652579efe9ddf").into(), + hex!("8b7cb5b8de09a6dfceddcbaa498bc65f86297bcf95d107880c08854ed2289441a67721340285cfe1749c62e8ef0f3c58").into(), + hex!("b97447233c8b97a8654749a840f12dab6764209c3a033154e045c76e0c8ed93b89788aac5cd1e24ed4a18c36de3fbf60").into(), + hex!("b4790910e2cbef848448f24f63e9dd4a1b122cf65feecf152d5fde282ad6fcc6ea3f9cc23178baf85612020795e4b13a").into(), + hex!("81fc724846b5781f3736795c32b217458bb29972af36cc4483dd98ab91680d3d9bc18842db2661487d3a85430dc9e326").into(), + hex!("a154892ff23b284040e623bba940a6a1ef1207b8b089fc699cb152b00bcce220464502cfa1dfb5a2f62e6f3960cdf349").into(), + hex!("af3f765fd293c253072b33a780ed68933f78d7e079d9a2079b6232755bedf6ebcbce9ba65c01f695602fa8ee17899867").into(), + hex!("97578474be98726192cb0eac3cb9195a54c7315e9c619d5c44c56b3f98671636c383416f73605d4ea7ca9fbeff8dd699").into(), + hex!("917c4fd52538d34c26ccdd816e54ebea09517712aa74cec68a2e3d759c6a69b5ccb4089ad1e0b988e916b2ce9f5c8918").into(), + hex!("8cf3c29531a17489a5f8232d56c5251ffddc95be3ff7ff61472e19fb38c5eaec841ef3b1ee36756b3dd8ff71ae199982").into(), + hex!("96d4b9b411319e531bab6af55c13f0adb1dd6b4286784ff807f283e7990dc368c16d536fc5db3d992deb4b0278914e6f").into(), + hex!("8903f7e0c9764ce844b15d84feea04406dc66b195a5f82ff4027f27361e11cf368538137d139368f5a6f42876b04f056").into(), + hex!("a4047173b5906c9b4292aaee1e91d9080ae74b1d3eb990449ed1f96bf22c3ee80f4915361e5bf7dccce24ae1618dae77").into(), + hex!("a4c4b96071e7bc92e41defba3507ddf423d93f3a94271b1f9812dfc4660e4c9fd24e0dd7aef324c46deb8d7a7c97eaa4").into(), + hex!("8289b65d6245fde8a768ce48d7c4cc7d861880ff5ff1b110db6b7e1ffbfdc5eadff0b172ba79fd426458811f2b7095eb").into(), + hex!("ab4119eef94133198adb684b81f5e90070d3ca8f578c4c6c3d07de592a9af4e9fa18314db825f4c31cea1e2c7c62ed87").into(), + hex!("a3ffc3dad920d41ec3f4c39743ef571bcabb4430465d9aa811d0f0a7daa12bee4ed256527d16a6e937bf709ebb560ebd").into(), + hex!("8553748da4e0b695967e843277d0f6efeb8ba24b44aa9fa3230f4b731caec6ed5e87d3a2fcd31d8ee206e2e4414d6cf4").into(), + hex!("b15e1b4ac64bafbc4fdfead9aeff126bf102fdd125c1c914f7979680ec1715fbeccf3dc35c77d284421ec1371ed8bc32").into(), + hex!("9377aab082c8ae33b26519d6a8c3f586c7c7fccc96ec29a6f698b67d72d9266ad07378ba90d18e8c86a2ec77ecc7f137").into(), + hex!("b71c11828ecad7731136cb1f5b80392a4add8d62f8866a781fdde797a201ebf6d483b2348aacbea2061a5108933b757d").into(), + hex!("86793899ef71740ab2ec221d0085701f7909251b1cf59a276c8d629492f9ef15fc0b471beedc446a25b777391ab00718").into(), + hex!("8100b48ac2785477a123a7967bfcea8bacef59391680a411692880098a08771ff9786bd3b8dfb034cae00d5a7665621c").into(), + hex!("8b027c14affe47f83ee59b504d83b2fd2d9303de2c03ee59d169bb199d9f4bd6533d7f8c812dd7a6f1e8155e3e185689").into(), + hex!("9615800f8c95f95bf25055ae079b964e0a64fa0176cc98da272662014f57e7cd2745929daf838df0094b9f54be18b415").into(), + hex!("951aa38464912a29df2101c60771d6de7fadb63f2db3f13527f8bdacb66e9e8a97aaac7b81b19e3d1025b54e2c8facff").into(), + hex!("a0e68d24f784fcb2b71acc2d5871285623c829d0e939146b145e04908b904468a67c07a2f156e6b17bf531adc5777c4b").into(), + hex!("86a533b02ae929f67c301649a2d58651b98cdffe731b63fa32aa1013c271634bbb088c0d02865913c11bbb1bf57c0e12").into(), + hex!("81f145ebb9a5674a5b052d0e9059acc8f8ab612dd9f54d43ff620202606e19a86a9b284dc6480d555a030e5fefee8c50").into(), + hex!("a698b04227e8593a6fed6a1f6f6d1eafe186b9e73f87e42e7997f264d97225165c3f76e929a3c562ec93ee2babe953ed").into(), + hex!("b3180ded54610b1b3a2db7db539197ced6a75e9bb381d1f4b802ca7cd450f5418522ad2bee3df1956ed63ff1ffe95dc1").into(), + hex!("86fa3d4b60e8282827115c50b1b49b29a371b52aa9c9b8f83cd5268b535859f86e1a60aade6bf4f52e234777bea30bda").into(), + hex!("97d076617cf0a64ab3d1f030cfd72a303b6b252c0a7b96157ff7fc8af5970f00d14492c46e8f6f37caafe837d0dc95c7").into(), + hex!("ac2c98a0ab3f9d041fc115d9be4a6c77bd2219bb4b851cbee0d9257a4de5791251735b5b8fad09c55d16eb0d97080eff").into(), + hex!("ace7fda25c2fb7c18710603c16a0ff0f963352d1582a42a20c9f5603c66f485df8383465c35c31e8379b4cb2ec15b4c4").into(), + hex!("a07b35ec8d6849e95cbd89645283050882209617a3bb53eae0149d78a60dbf8c1626d7af498e363025896febdba86ee7").into(), + hex!("b2fc4478830f2ae4234569346d80b59899247c609b75bd2190a896498539e1f30dca5edbad69f0224918d09f0d7eb332").into(), + hex!("84926cf2265981e5531d90d8f2da1041cb73bdb1a7e11eb8ab21dbe94fefad5bbd674f6cafbcaa597480567edf0b2029").into(), + hex!("b5f32034d0f66bcbccefe2a177a60f31132d98c0899aa1ffff5ebf807546ff3104103077b1435fa6587bfe3e67ac0266").into(), + hex!("938206740a33d82ffda3e01598216324731335d367965aa0b740486d60ba2e86a4ecd546851046a61a4b0fc88295b5cb").into(), + hex!("ad2b1ab32161e37ee553e3787f05f9281073d7ef7d0ae035daa353bc83da8ef8c76c99ad2928463c7c708f7404020476").into(), + hex!("94f4720c194e7ea4232048b0af18b8a920fde7b82869e2abcc7e14a9906530be1ef61132884bb159df019e66d83a0315").into(), + hex!("a26dd9b28564c3d95679aca03e3432ac26e287f80e870714c5946b05538b3cb43bba7b85c16bceb5430e81b7a04c1b1d").into(), + hex!("8ef0930db046c45ca5c69d565d54681d2b6d249e27092736aee582b29de3aac3fd96e1066a57cadd851b4e5334261594").into(), + hex!("92096ebf98ebac5c82345d3ef0db0f5a14af23ceea73279087426b281d6701997fe131fe65a7df7d624b4ff91d997ae8").into(), + hex!("81c850f419cf426223fc976032883d87daed6d8a505f652e363a10c7387c8946abee55cf9f71a9181b066f1cde353993").into(), + hex!("97070a33393a7c9ce99c51a7811b41d477d57086e7255f7647fd369de9d40baed63ce1ea23ad82b6412e79f364c2d9a3").into(), + hex!("a99cde5c7c85ae291c74c893e598cc0e6eb2dda2a81dbb504a638eb21dd2c41d6e5caf7baa29e3c1c32e94dca0d791f1").into(), + hex!("937ccbf8cd19b82af2755b4856cfcca3d791e33ae37e4881982ea89d3b21d205a9402d754fac63037243e699484d21f6").into(), + hex!("ad7dca7640444f1268f03b67544815d4366c6a4a2f0d25ee78f3361c63095416216fd31aa0bcce7448cdd7ba73a6344e").into(), + hex!("84991ca8ef255610ebc6aff6d66ea413a768e4d3a7764750fd02b5cd4735d41df399b36e87647fc83cf73421a39d09e9").into(), + hex!("91215fc3f7243638733fe293dab7029e0c4275550102acf5f1638773cf8f8ef2c53ffa5bdfc1b602c269a2b5ab164b7a").into(), + hex!("aa6cfb3a25f4d06c3ce1e8fd87496a74a5b951ab72557472a181a2e278c5e982d290dd4facf40bd2f4f8be62263dadb0").into(), + hex!("ac9f29ad08aaf27581fe1f12e210ad4ac6011507fe3100763a4120f9e439f3c6d191f3fb55aadf58bd865cfd4406c68e").into(), + hex!("87c6cb9ca628d4081000bc6c71425b95570291eb32ef2cf62416bd1ce3666eb2ce54accd69f79d506cefbfe6feb5a1da").into(), + hex!("93042dd42e56671155bb40d85d9d56f42caf27bd965c6a7a7948b39089dba8487d4d5fd30522dba6ba392964e3ffd590").into(), + hex!("a76adeddf2454d131c91d5e2e3a464ef5d3c40ee6a2ab95e70ef2e49e0920d24f9b09276250ed7b29851affbdbc7885a").into(), + hex!("92a488068e1b70bf01e6e417f81e1dc3bcec71d51e7eabbc53b6736e8afdb8b67d191940fe09c55783be9210e1cbd73c").into(), + hex!("8180ffffb5abe78c38f2a42a3b7f1a408a6d70d3f698d047d5f1eef3018068256110fcb9fb028c8bdccbc22c0a4c3a20").into(), + hex!("a50ab79cf3f6777a45f28d1b5cdad2c7ea718c60efeeb4c828d6307b29ef319445e6a9f98aa90f351c78b496575150c1").into(), + hex!("a4632399c1a813e41fb2055ef293466098ea7752a9d3722d019aa01620f8c5ecdc5954f176c6c0901a770cbe6990eb11").into(), + hex!("83bf5055d6332009c060fd50b8dc698d42b764b079c90a1fad8a83101f8dd1cc27acb27dc9d1c25ac8d3db4107471b4a").into(), + hex!("8c432e044af778fb5e5e5677dbd29cd52d6574a66b09b0cd6e2a5812e71c91559c3f257587bfc557b4b072a822973a60").into(), + hex!("8368a0f17c8427beb71dbf11a09a2fe8495a33f08c29c74a9a996a88aa01c0a09f9555abeb1ef1592cab99a9e05875cf").into(), + hex!("a8795e7f4c4c5d025ead0077c3aa374daaf9858f1025c0d3024d72f5d6c03355ae6ac7418bf0757fe49c220acff89f7f").into(), + hex!("a6d9f67ca319ea9de50c3fed513269b83fa067977adfd1e9d9ee07ad61b2ac1de64a39d7b6897ab55870cf982fe481dd").into(), + hex!("86b3a4ea9b1fde00cce79d5ae480353d60cb6ddce363c535bbbc3e41a4b8e39fcf2978eb430091ae1b10420d43193971").into(), + hex!("90fb5cac22a22fb8a6b619f1eacd95873be974d4d5d1f7080e523bb9b4b2644eda7340d780bd1ea8ce36407ca0410fea").into(), + hex!("b5036d4c241685bcd67156e4ab0eba42b97f639947d54b17af2c88fbcc5fc57359c7df4bc7f8df955a524fb1501a6fda").into(), + hex!("b1c56f028f31f0ff86bdf55788703b4d809becaf3e4d9d349f1b660a07d2f15e127eb72a0e2a5a2742313785a3de43a5").into(), + hex!("a3e909196f447e492200cc67000c5d7f0f585fb98e966cf9bf08257597fea8d92a90ceb054d4b5553d561330b5d0c89a").into(), + hex!("87cac423d0847ee3547f45ac5babf53bddb154814e291f368cbb62ddd4f2c6f18d77a1c39fddb482befe1a0e77d5b7fd").into(), + hex!("8605b88ce23190b1fa9d389b15e6907417239a72b97673d1479c4ccb8f4515c7921d14537775c74e738a9c3f122b1443").into(), + hex!("87587504e819bc7f0349705a05c15e8504fd6b2c25c3fd264096cdb7aaa22d8078da776215925d9d775a7f9355b6f0c0").into(), + hex!("afba279768f0f928b864645aa4e491e9c949bf3dab57efa24eeaa1a9a7d4d5a53c840019354068e64c65a2f5889b8f3c").into(), + hex!("86b1cdd26ea9a3ae04d31a0b34aa3edc9e8d038437152214d195381173e79e4ccf7f8f0ce9801086724a1c927c20e4c8").into(), + hex!("812d3ded3a3c9e58eecf13a29bb4cc13b01b2a0af322423a29bb0e4f6d9021d1d87ac4af7a2a6b88d34f44a8bc1b3c55").into(), + hex!("a988cfed9f481bc98beb5fc188ed3f6893a3ebba27c3ebace669792f6abf0997727023c3b6930a6421224f5b257b8b49").into(), + hex!("a38c974b57da968f0c4611f5d85d8014fd48594c8cd763ef2f721cfd2c738e828d41ff029e3591d7447e3125641db8ef").into(), + hex!("880b4ef2b278e1b2cccf36a3b5b7fbce94f106ed9fa2820cb9099a7a540a57e9fdeef5c0fb0a743049828fc2b8c46163").into(), + hex!("96e7d1bbd42195360267c2a324b4d9bccad3231ed8a7f070278472a90371867e2ef2c29c9979a1ec6e194893afd992df").into(), + hex!("a92beb343caf6a945990adcf84302c55d1fccdef96c34a21f2c00d3e206a9b2c6c6b412f66e5d4fafe26ef6446cde705").into(), + hex!("aa48afa77d5a81cd967b285c0035e941ca6d783493e1840d7cbc0f2829a114ace9146a8fbe31ecbd8e63e9b3c216a8c5").into(), + hex!("893a2d97ae067202c8401f626ab3938b135110105b719b94b8d54b56e9158665e96d8096effe9b15c5a40c6701b83c41").into(), + hex!("b614910b247c6ade31001b0435686c3026b425b9bff80b6c23df81c55968633349e1408a9a5a9398a7d5d6ed5d9d3835").into(), + hex!("991c660e4d476ad92aa32ef2c5b27669ab84026eeb5ca70af69bbbcd8ebc0a8fec17843423306edc78b4436629d55c25").into(), + hex!("b926a21f555c296603dc9e24e176243199a533914f48994b20abca16f19c30cfd0baf319268139fe3f83ce69afdc324d").into(), + hex!("8e70e4867d2731901d603928d72bbeb34b2e0339a4f5cf06e7a771640717421b4ea039c61dde951582a28c2ff152ff70").into(), + hex!("95aafa379cc6a2b4bdd0cad30b7f0a47839952af41f584219ec201c6c4d54610eb2c04b67b29080acb8cecc5e7543fbc").into(), + hex!("8465bd8be9bd9c2c6116d4ae44ec6618c109cb9aaee2d241e7a6ed906d398ef15a6fc18bc8b1d3398184241405954bba").into(), + hex!("b455f751232de0a48440d09983f4f4718b6169907979c9f282acf7177ab5b1f338fe1f2acd8d0bee4b4aad61d0340839").into(), + hex!("970df2314849c27daa16c6845f95b7be178c034d795b00a5b6757cc2f43c4c8d8c2e4d082bec28d58dd4de0cb5718d61").into(), + hex!("8d52413f981bc611427ad0534d25e914113d0ebcd6960aab6421608bec6648b89ae4b2ca2153c57d3cf4f1f37212aa5c").into(), + hex!("b7ac87da14b783914ab2e914fb7b536893b7a650cdc5baa1f3b4aca9da77b93a3336671335250e6467a8cd4aa8dc61e9").into(), + hex!("b37a2ec9dec3d7d9cbc911fa1e5310a47d23a841d02c8b99a923991c73fc0185d130a494748c64f2b5a4c07bcd06920e").into(), + hex!("86108b661fb2c363adcca84c114c83346413df748b959015c018452cfac14890bf585dc0a646d68727cc3cdfd2b61897").into(), + hex!("8421044f794a1bcb497de6d8705f57faaba7f70632f99982e1c66b7e7403a4fb10d9ef5fb2877b66da72fd556fd6ffb0").into(), + hex!("84d2eb008578aebd6f01254b7e46584c1524e6fd7a5a2ae5fa0ea560865ca50d52290cf2d12dd20b042f402e62181b4d").into(), + hex!("8d6bed5f6b3f47b1428f00c306df550784cd24212ebac7e6384a0b1226ab50129c0341d0a10d990bd59b229869e7665a").into(), + hex!("80e30cabe1b6b4c3454bc8632b9ba068a0bcfd20ce5b6d44c8b1e2e39cbe84792fd96c51cf45cf9855c847dc92ce9437").into(), + hex!("b7e74ab2b379ceb9e660087ee2160dafe1e36926dfab1d321a001a9c5adde6c60cd48c6da146d8adfa2bd33162eeaf1a").into(), + hex!("a2b1ea43f51460b3cb83657b4e296944658945d3ad6ae7b392e60f40829ba1da6a812d89f0380474578cbd0ab09801ac").into(), + hex!("91ead7dacf43905eb5d4b179af29f945479ed074126bad3b5a2bbc1663af5f664fe53a36684e9389ab5819e53f1344fc").into(), + hex!("927c030d5a69f0908c08f95715f7a8d1e33bed5e95fc4cfb17f7743cb0262755b1e6b56d409adcfb7351b2706c964d3b").into(), + hex!("883f38af3b2c1d50f6e7c515a5e02468d76890f6e669f7acd2df89365862fa65877095deb001b4e2868bc5b59439dbb1").into(), + hex!("a0ebae60a998907a19baa396ae5a82bfe6aa22cf71bfca4e1b4df7d297bd9367bbeb2463bda37aa852ad8fd51803e482").into(), + hex!("8ae80eeaed3fc456f8a25c2176bd09f52a2546d45d77a70f48a9e30aa29e35ff561c510ae1f64e476e4a0f330b9fdbdd").into(), + hex!("a7be457b8bc1bfde4865a35b7b1826118edba213b0f0d3cf5d877267cc1559cabe61cefb1e300142a978c29676036179").into(), + hex!("af51da717d2a45ab96fad5d9317ea867ec4c6a411af6fabd72e568230099a04c036a0f114158815b1a75da6474dc892a").into(), + hex!("b549cef11bf7c8bcf4bb11e5cdf5a289fc4bf145826e96a446fb4c729a2c839a4d8d38629cc599eda7efa05f3cf3425b").into(), + hex!("8d264fbfeeebb6c4df37ff02224e75e245e508f53fb3446192cd786ecf10d0f704c4fc2e53e7f7318ae1407e46fc0fb8").into(), + hex!("ac3195143035cdb4ddcd5f93c150035d327addee5503ea2087b1a10b2f73b02453ddd1a94d8e7d883e365f9f0e3c38c9").into(), + hex!("acbb398ea9d782388c834cf7b3d95b9ff80ee2a8d072acae8f9979595910849e657889b994531c949d2601b3ce7b235d").into(), + hex!("811e6a5478f708495addbb1445a2ef23e39ee90287f3a23ecd3d57d4b844e4f85b828bae8fa0f1893dfcc456f86f7889").into(), + hex!("8cde690247d4831dfe312145ae879f4e53cb26641b3a3bb9eb4d590c56c11ece3cfe77180bd809468df5cddaea4f5ab1").into(), + hex!("b42578df29a9eb23bed91db6a1698df49654d2bc1b0d7973b2a7e300e9cf32e0e6ac464d463d4d26e394e7598239c4bf").into(), + hex!("97ffcbf88b668cde86b2839c7f14d19cb7f634a4cf05d977e65f3cd0e8051b2670e521ae74edc572d88201cff225e38a").into(), + hex!("a322b5d2a6e3cb98b8aaa4c068e097188affef5dec2f08c3e9ce29e73687340d4e5a743a8be5f10e138f9cabbe0c7211").into(), + hex!("a076ea1084b7a1a33115ef62d6524f36e7820579868763a6ed1f8bce468f150cbfbf0ed04be2487aaa34100d828b0db6").into(), + hex!("944259a56e3b4f745996289912740281bde47e22705f142c2a483ffd701e780f51a01b177d2494dc8db9e69157f45d44").into(), + hex!("91cb79d52951d1b901e4a686bf4ad587e31db57ea5af6ffeb93eeafae3929879c386ddec860f803c2dc61055437e6bee").into(), + hex!("91efdbcaad9931312d7c41d24de977f94d7f3f7b88090a1f72d9a097a1e30cc805c5ea16180f463022d9b26b8863f958").into(), + hex!("b26f5ed09f7d5bb640ec94ddd1df0b76466f69a943b4699f53d45296d5d6b8010bb61477539bc377d1a673d89074d22f").into(), + hex!("80822499f96a1a8c0048f01f389dfcaaa5d8269c332dbb507fe46f270bcfd5f67c53f827fd867221592dbde77b6b37ab").into(), + hex!("8860ba25d5530cb8585975d8013a1c2d5b0f0f96066044fdc43ed13488ae44e379c624ff6993a18cb6e037809d7985e7").into(), + hex!("999d1c44e14184349064415ae28a149b3b11aba5baab6792744378d14df554a3625fac82038eaca920064822294dd513").into(), + hex!("a62c2e7c692403e874a16e08e46a067e19dd561993ca07ff79cecb53c753763b3e49d372638c96c0a8c921bfa0798a0c").into(), + hex!("a1c84730a5c41dcab9a5ef9e1508a48213dbc69b00c8f814baf3f5e676355fc0b432d58a23ad542b55b527a3909b3af6").into(), + hex!("a1c0c317e6e352e16e25c140820b927161ce5d2c4c2e10bca3057ba4d46b4f42ad7aba20de86dad9fc6368ea92695268").into(), + hex!("85c216e314eb7bd8ba02e092c90e132bc4bafb21c6a0fbe058b0dd4272cb76f183b83c6783fc321786065ff78c95f952").into(), + hex!("8e8f63ec8f4f1f7fcc61f893b671710c3c17f9d2d26c5c6ca40e671bd4b252bc0cc1655e6780d2ddcf2915d8f623b9a4").into(), + hex!("aaeb0005d77e120ef764f1764967833cba61f2b30b0e9fed1d3f0c90b5ad6588646b8153bdf1d66707ac2e59fd4a2671").into(), + hex!("92ff79402d5005d463006e0a6991eaacc3136c4823487d912cc7eec1fe9f61caf24cd10022afdab5f6b4f85bfb3eee4f").into(), + hex!("a32a5bd9b7bec31dd138c44d8365186b9323afbba359550414a01e1cdb529426bfa0b6f7daaf3536e9402821faa80003").into(), + hex!("845982c2672fdd44b33d2e56ad676e704c02f756b09e8765bea42b924c14724484567b55f0db42ac20cb70a7f5201c14").into(), + hex!("89cd9f6ae7d9a9ff2b4db916ba3af9fe700fcfbd16577bf73a965af938e8cf633020466b0298d3c31300360aa6851af2").into(), + hex!("8fa2d7b22af8e6b82679ebdfa13efdcb34289a554653ea6c1b16efb9f957f7fe64df787e7b03d8cdc8a732b91c916bd1").into(), + hex!("94f327bc57ed1ce88ce4504b4810cc8af5bd21a7e07b280a7866ce08e39b6cf7a6560bf73a5f10671271624cd7893970").into(), + hex!("90f4476224b64c2a5333198a4300ece8b3a59ae315469b23fd98dadcdceaaf38642d2076e9cd0bfacc515306f807819f").into(), + hex!("ae0db78548261216ad7d6a7ed4e6089ee17b3fa311494b2f2c559e215cd3de7e5f3a781a49dcff428a8a61c2a4f49a19").into(), + hex!("a83371f44e007c708dc4bcafa7bd3581f9080a4583c9be88624265014fd92f060127e628de5af3c442a25f049c7e7766").into(), + hex!("b471c72bd2971353f4b44248b8e6cf5316812861a88ccfc20fd0d89a5e010428c387228b2f6f14c12f79e31afc9d0753").into(), + hex!("8962afddcb1a26cc8ccd3c993109e79a4dd747ca473b8b5ef93d9c2e71d29623b834ac945074acf118248e3ae7878a6c").into(), + hex!("aa0940e4e5586e79a3d97397c8aff3d112c6f759d2efac29366acc5b5c6a7cfef8d50516bf309da8b787de265dc8deda").into(), + hex!("a211120e1bb3b10138df1fa58efb009a298b8771f884b82bb3de15822b1252124a68f3980f96122a775fb96f05ddc3d5").into(), + hex!("a1047401598b1e6e2613d746bb4689e0406eccdbadf319a6609a3261cd09deec215d90eba6d0ddc50dd3787d60104e7f").into(), + hex!("96791b2b8066b155de0b57a2e4b814bc9b6b7c5a1db3d2475a2183b09f9dcd9c6f273e2b0c922a23d1cf049a6ce602a3").into(), + hex!("91013e0d537fb085a49bf1aa3b727239b3e2c1d74c0f52050ff066982d23d5ee6104e70b533047b685e8b1529a0f14dc").into(), + hex!("aa65c11071be23c9bddaa5203f3166e5cf043efe5fb8f4b26f8a9cabe71db701a450e79eb001c401da5752755d9cf1af").into(), + hex!("8645cc44d180c18a6d8f57ba57bae05879451997533cfe558cad4d3d586caec877e348915e32a09ee73483283c4df744").into(), + hex!("8eafbb7002f5bc4cea23e7b1ba1ec10558de447c7b3e209b77f4df7b042804a07bb27c85d76aea591fa5693542c070de").into(), + hex!("919c81bd1f3d9918e121e4793690f9ddd96c925ae928536322d4b98132f21979c1f34731d393f0ae6e0871af4355a8ad").into(), + hex!("98181e9291622f3f3f72937c3828cee9a1661ca522250dfbbe1c39cda23b23be5b6e970faf400c6c7f15c9ca1d563868").into(), + hex!("8f44c43b80a3c5f488118859fab054745cfe5b0824821944b82fcf870fda6d93489ea9ca4220c24db2f4ad09c6080cb7").into(), + hex!("a683d4865ddcc099f7b698153007b92f853b80f49b3be75163ea8cd1f8ff584b43a68e68de3ae61cda8ad4b41f355c87").into(), + hex!("942772b7c7c47d4e5957ccf1d6f1450070930af3e2b7eaab0dd7699372445df0cc910e6c0efcf501887dd1adabdaee23").into(), + hex!("805c06e565ee67cab0cbccb92b6656fdb240b430766eade3c6b0a0b1b93c840e2b4f028601451dca135c783239463880").into(), + hex!("84d3e2a06e16ced26094b356a16a4fb6aad50ad9ab23ef804a5852a33ef0bff76f3c5fbf7beb062376c2e669cb598679").into(), + hex!("803df08aa745cc3c0a799f3a91bb6ed423cd520c9d255d36c21bed1a0c3b12e8cad32f54da09dadca97683e9548fba91").into(), + hex!("aa2c3ef95b8d4265f01666129646004b6950d3e8ce74b4ca12aa3b90fbb445079a569178df772c272463a44d48922b8f").into(), + hex!("b0a4c136fb93594913ffcebba98ee1cdf7bc60ad175af0bc2fb1afe7314524bbb85f620dd101e9af765588b7b4bf51d0").into(), + hex!("93e4c18896f3ebbbf3cdb5ca6b346e1a76bee6897f927f081d477993eefbc54bbdfaddc871a90d5e96bc445e1cfce24e").into(), + hex!("89019e9550648962420984e9fd03597a854ae824567d9aa6cd5db01a4616b4e1477230f2d1362a2d307e2425a3eeb898").into(), + hex!("861b710d5ec8ce873e921655a2ca877429e34d432643f65d50e8b2669929be40a9ce11c6353b0ada1fe115e45396b2b7").into(), + hex!("88554c83648ea97dac83d806cd81d92531980346b208d281fba489da15a0084fd4d9a00591d1ca67aad3c5793685d55f").into(), + hex!("851fcadebee06930186f35293feefd40d7daedec9b94e6fe5967536c2c0e4cc68f58d3f5fbc76f1e77b90c9580074f98").into(), + hex!("b96a11048c7c327709d52e72e6f6ed0b7653329a374ea341ad909311b5b303e5629d6dcf11dcdb195e8c7592ceefac21").into(), + hex!("836075979eaf386ff6cb459cfd48fed171ae812b0ac3b38dc24dd8ca905cac1c600be717d4a0defa0a854f40cfaf8c33").into(), + hex!("90fc170529bcc0b80c46a53fffd8323fd2cc5cfa9b75ea4d36db21bd1f198335ad2bfa87f8990cf9cd9fd7989ecca718").into(), + hex!("b7eb6a49bf8f942dd8c37c41c1b35df43e4536e07ca9f4c1cfbbf8a8c03f84c54c1a0d8e901c49de526900aeac0f922f").into(), + hex!("af6911edd6c7ad30f905a0a3f78634808832fdeb4206b006934822d673bcced8e378779261b3c4b772b34b8871987f57").into(), + hex!("a74d240d0d7ea0afe68813fab55388d77e75eca0519d21771dcb7170cedb11dc14b237b26c5ae1f7f728b52e5ec0f02d").into(), + hex!("a7b86e4f1366da44fd59a3ee68018a99c23ba3588789463bd88b0177a9b94030b58cb879a506e64421af966f261eaa86").into(), + hex!("ad8d94e46cc02a1c0ad27105e8f672ec15b8296051801f1918d0bd470625686e8e8a0abde8f6852b846ee8d9132b26bc").into(), + hex!("980508c4d1e655cc6200f89a884b3a25c0c05708a3e4a101205c4fd901c3e20a943071a6300bb2614be41a139d4ef1df").into(), + hex!("b0173651b4ba0590b1d2f0265183f3729b5bb09893523ca12c4936120cbe5ef0d9b98733734407d99fdc766792ff10ac").into(), + hex!("abf72ec0280d56971e599b3be7915f5f224c0ccde2c440237e67b95489f0c9154ace04b7763db228473715f68053f071").into(), + hex!("b404beebf60026ca6843f2953cfcdee494d495c8e2d18865147102ef29a8f0ee470961d2246fe5a450c622d20ca51d53").into(), + hex!("89461cb2dadf51d6f1208b0965c8eabec895d7b19b7d90d3c6e49dbe75a75c30fd26db3dfb169dd46a4342280225032a").into(), + hex!("a61cb5b148cb7ff34775dead8efa7d54d7141182356bf614070dfaa710ebf07a4dfb684dad151db60c0f8261c30a4f40").into(), + hex!("83a798f47a4f62dcb8b531d463b0fd4a876d47a8ca990710290549255033c909de709471b4e823a60bf94d8baf8b5acf").into(), + hex!("a23431589f3a25070a188deead9adb0ed423d6b00af267f3f125cdd4391c1527909b5cfa88130dc4b67915f5002128fa").into(), + hex!("8d77e65ba6250fe18c54ce70d0ba4571a7d3e68a8b169055cd208e4434b35a4297e154775c73e7dfba511faadb2598c5").into(), + hex!("90e5db75f3787b819df471712f87b6f3281437090f5db7a2c21b07164446292a414c687e41de2d1ca00786b093239c64").into(), + hex!("b382fa28670a5e14dc954b2db8ace250c73df71ab095304bd8ee28f455ab26cc54f82775a831428e110d1a3a2af709bb").into(), + hex!("a58d2fb1c2612d28c54fafa7f2e1e6c336c24435abdb53e1be9dce9aebecbf7468a348b872549535ac18aa003f83ea87").into(), + hex!("9545f94c4e9056e360dd999985f8ad06210556fa6f07cff77136a2460605afb0ff1fb1d1a2abe4a4e319fd6c29fff80f").into(), + hex!("93121aa60f904a48e624e00f5410cf8c8925d2b0719f90c20e00cba584626f833de7c8a18dbfa6a07df24b916156bfc0").into(), + hex!("aa3446aac25f6c23ea16e8f7d19c58d187746ef3c2ac7d8fdf9bdc329409a07589ec8eebafbe2b156e7ba60addc15af8").into(), + hex!("b964f50011f03135e993739e2e63a71933ba4583040b3af96c7e2dce874226518f7b68f622c4a1d78b9c3ec671d33ad7").into(), + hex!("8cb5cb7cba886af58acadc5a4348524b1395a39dc51196316d759a9b72d9fc0fe45b706e264393a13ff911f0d15de45c").into(), + hex!("b50c306f78143b37986e68efa10dbe1fb047d58562e9b5c5439b341dd8f1896c7ae586afac0a3213759784a905c1caaa").into(), + hex!("97825edba8410e8bcb85c5943628c02ea95ee7595f559c030b94395c0d1d0d84c38eca199fce9c1992e572b5029b124c").into(), + hex!("b0922acd6da2a95b36de6d0755316594a7e2e32ea774792dc314e8c3cd76d9f1d69df38231e166e24bd42c664f4fbac7").into(), + hex!("ae5ea228c1b91ef23c245928186fbafa1275ff1817535018d7d2d913abff0fd76bf41fd04a96d816f2f1891bd16e9264").into(), + hex!("b106c6d13ca17a4c8ea599306e84918127cf2de21027ac3fe5a57d35cf6f3b1d7671c70b866f6e02168ae4e7adb56860").into(), + hex!("a044cd5a3b727dc1cb59875e4025718375d12e706fffcdb48874e51a675dc2cabb209670192e408cdced5aeac65192e4").into(), + hex!("ab1cc44983e46a6ea2430aa6616ab28614f43624665e3e6ae31a9357c0c5434f34e56c720906e184327693cc4ebe1fa2").into(), + hex!("890def696fc04bbb9e9ed87a2a4965b896a9ae127bc0e1cc515549b88ddbcbc02647e983561cab691f7d25cf7c7eb254").into(), + hex!("a86be58fef115445b909dffac6f51da3fe9214afd9c31fd564bb8f39b1dc3cb895b1222f2c63226b54b60b278ec45edb").into(), + hex!("8757e9a6a2dac742ab66011c53fa76edb5ebc3c2fbd9a7265529a3e5608b5c24b4482fed095725e9b8fed5a8319c17a4").into(), + hex!("a7e0ddbae16e4491822684c0da3affecbbd17ef96c5c491ac093c6eb4e162fc7854c367535e296fd3d6265c2ed1210bb").into(), + hex!("941fe0dabcdb3225a625af70a132bc1e24ccab1f8331dde87db3e26cbee710b12b85535e46b55de7f5d1c67a52ddd5c8").into(), + hex!("a24d05b51c7c128bb49979cbd9019e6618545d95275a44b5c3d1d03e71bf2ebffdf43fff50c30846ec27d279043cef4e").into(), + hex!("b526f40d519e7a8f2c81b69f71b3e2ef079028004c0448ba0608296c2787972491ec6d05ed6a8fbd5ef2da76325a93cb").into(), + hex!("87ca4fa85a257adf7e21af302437e0fa094e09efced2d7ebab6cf848e6a77ae7bfc7cf76079117f6ed6eded9d79ce9cb").into(), + hex!("9276e8051bed8f5dbfc6b35765aac577dd9351d9d6ac1bb14496bd98091005b9a4737b213e347336413743f681f5043b").into(), + hex!("a7741c52498e0a24db3ce7699882de8f462a2b3ed5e9f77dc7200cbdf46b6cdd923b1128759909d6dddd64700c4c20c5").into(), + hex!("ab5b363ed9551e32042e43495a456e394cbc6d53b15d37a8859850162608bdf36d3d4564b88fdbaf36ff391bb4090b8c").into(), + hex!("838ff6630dc3908a04c51fb44a29eca5a0d88330f48c1d0dd68b8890411a394fd728f14215482b03477d33f39645dceb").into(), + hex!("997d3b82e4753f1fc3fc2595cfe25b22ac1956d89c0950767c6b9de20623d310b1d84aaa72ab967ef1ea6d397e13524b").into(), + hex!("85416cf3eef63d5530062d6f031aeddad101c7f1aea3bccb826c73f8a25d5d963caefd789a6b9832bd4ed459f268ae64").into(), + hex!("9194bc45e11d7276ed1c9ef3ad5a33d6a27372f5568563ca8ee213e2e7029dee404ab5acbaecaef698129798d35fd895").into(), + hex!("a4828a003513ab887082390262a932a7e8c5e25431824b7b4cc10fccba73265c0e5ee5b315ccef13906d971644913806").into(), + hex!("b907ec84b6ae5729d36e2acd585a350acacdeef148bcc5dc4a91edb57505526462bd4371574865541d8bb0d786a29b2f").into(), + hex!("aa5d1c1f0a7f6b9b3c3734f85864aa60bddad5121450218d76d82edefd2602685a820965c56d7eefe789d5115cb41e01").into(), + hex!("ad28fe70a8606f87bcb5d6f44e1fca499c24bcee791971f599ffef1f403dc7aec2ab6ebed73c1f8750a9b0ff8f69a1e6").into(), + hex!("a641eaa149c366de228a2833907ad60eea423dd3edf47e76042fdf6f5dc47a5b5fc1f1b92c8b96c70e6d8a68d3b8896c").into(), + hex!("abac08f4df786b2d524f758bca43b403b724d12601dc0a8362b7a2779d55b060c6682a5618fffea2e4def169fcbd2bfb").into(), + hex!("8658a15df961c25648fd444bdf48a8f7bb382d9212c0c65d56bf9cdb61aab3bd86604c687fb682260dbc0ad2dc84bf01").into(), + hex!("ac7983d50ec447b65e62ed38054d8e8242c31b40030f630098ce0a4e93536da9179c3f3ae0b34a0b02aad427a97ee60d").into(), + hex!("b8877a00a24b0ffcb2bd3fce8a8ba327d8ee2e98d85531cb61fec21fd49cd1696491cd51024a9c3820cf06a77cacf04b").into(), + hex!("ae075b66e5f211c2149c45b211d1297bbc1d9e6497cb3315363c492a9a51ae5b9d0a28bfecd755d68553736901ac6606").into(), + hex!("afdc091a224486e7bfac169e6a7b4e008d2d04144508a337fd93b6f4d385ee3f0d927b1f5c1cd79a15e0fd6078e45dd4").into(), + hex!("b75c28941ee3f91b3535b4eaa0fb17b59ca65b5256601a1f6d0cf2bb4d66837fd16e51d6942856679012a5730a66e519").into(), + hex!("84a6edac5ac68a7ca837c46d5ada8fab136748b6c3a3b9165dbbc231ec386b15328e4ef7d69a15d4cf354135348a4ee4").into(), + hex!("b01ee30d120b97e7b60ea89b9b6c537cdf20b6e36337e70d289ed5949355dd32679dc0a747525d6f2076f5be051d3a89").into(), + hex!("a80deb10bba4bc7e729145e4caf009a39f5c69388a2a86eaba3de275b441d5217d615554a610466a33cfe0bbe09ef355").into(), + hex!("8d6e3df29419bd0da1deba52c1feebe37744108685b49ca703e1b76fb4d612e3959d3b60b822506e5c0aac50b2f5eee2").into(), + hex!("a373408beb5e4e0d3ebd5ca3843fe39bb56b77a5d3d2121d4a7a87f9add3ec7376388e9d4b8da0ba69164850cb4b077d").into(), + hex!("ae0beb452af7479134a7fbc31a5f59d248e8a67d4c7f73a0e30a51db9cd33a1da3f0ae947fa7e5983aea1343e7daf06a").into(), + hex!("aa103a329b699d4102f948101ce5fae27226419f75d866d235da8956f11367e71db5c0a179dd63007ed53f7eec333aaa").into(), + hex!("a094cca9d120d92c0e92ce740bc774a89667c6f796b438b0d98df0b7aef0935d8c915d5b0dad4b53e383dc9f095c29fa").into(), + hex!("a4d88467136b99d6e55603b3665b6da0f7fb27c7759687f7e6977b6230272773d7b95049d999538c008f310c05ed948a").into(), + hex!("a23710308d8e25a0bb1db53c8598e526235c5e91e4605e402f6a25c126687d9de146b75c39a31c69ab76bab514320e05").into(), + hex!("a36d6952c2d7f88bf28032a76ed46c4dabbf1901a46efc50deb798d1b44adf7e0210fbdf2473a1ba408b5c98d76943e5").into(), + hex!("ab45f5b756ec6e0b98d0d4301c87675a0a1f0b1178b8a9780c1ab23e482cd821834835afa1de890962212159e464b10a").into(), + hex!("b800be1788175a01a9228b0d3e7eb4302484a2654eb2a86c0f0900b593da0a436ef031ac230e2b05e968b33e90a342ce").into(), + hex!("8cc8d279ec08d0a5a2a09ad07fabb0122eb65f48da2571d83f86efa2c1c5bc51b04ae94b145f0a8ef19a3988638b9380").into(), + hex!("b4cd409256819e8e4627edbba90ec40b7da17a57f95749104d90db0364f5007b1accc816f4d51a0dbe5ffbcb737cb37e").into(), + hex!("99365fe5ab8ea8bd768ae7181a6ba49b79d240f512ce309b02f09d465fea276298ff55b5b9cb5b4162a901b390606024").into(), + hex!("ad77fcac9753efba7a9d9ef8ff4ec9889aa4b9e43ba185e5df6bf6574a5cf9b9ad3f0f3ef2bcbea660c7eef869ce76c8").into(), + hex!("ad2456725ac3aeb0e4ca5c0502a8abb4dbd8a8897d9d91e673fea6a0cffd64d907b714b662d73c0877b98d4ab3ce6a89").into(), + hex!("ac8436e33619e2907659741d66082acbda32612d245fcc8ae31e55f99703fac1a15657342fa66751d3be44fc35d71c36").into(), + hex!("b0eecd04c8d09fd364f9ca724036995c16ba6830d6c13a480b30eb2118c66c019cfdc9dacce6bfd8215abe025733e43d").into(), + hex!("9439b663e4104d64433be7d49d0beaae263f20cfac0b5af402a59412056094bd71f0450bc52a294fc759ca8a3fddfee9").into(), + hex!("b72de0187809aaea904652d81dcabd38295e7988e3b98d5279c1b6d097b05e35ca381d4e32083d2cf24ca73cc8289d2b").into(), + hex!("93706f8d7daca7c3b339538fb7087ddbf09c733662b55c35f2a71073f4a17c91741955d4d549c2ee6c22eaa84193c1ad").into(), + hex!("926dc729e135f1f0bff4662ee3d6823a64597fe189b763ada34f246e77705fd4e062d85506a338e9fa98c4d225a3b27a").into(), + hex!("93f03495d53c781be8b76e37e68b64aa260523004eff6455ddc8a8552af39854e5181f8c5365812b1f65926534fba5dd").into(), + hex!("9834f66e5c946c3a8241ca2bbde046a7e88072124911d5d15c037a95b61e82b88b5c2058fa4a3721537dee39dee5da18").into(), + hex!("92ec1aeb2aa24c51cd5f724972c8b6095e77b237d83f93ed34ca0bc91a1dbf1ad95adccc59e0f0abbfef33f331f3298c").into(), + hex!("94402d05dbe02a7505da715c5b26438880d086e3130dce7d6c59a9cca1943fe88c44771619303ec71736774b3cc5b1f6").into(), + hex!("8368bb9b9bb2e17730c42ed1100eb870c88a8431601312aa8cb1e738cdb9ca2704dfd432cf1703c0db043259819631dc").into(), + hex!("a35189a105401f0cfba4b43be21723486c04659e5a01e67c43e8f9911030810b878beee696f04f63d314ccfe97ebb790").into(), + hex!("93ccd8c5f82374e0bef6562e16576f742d79b6f400e3485ef36e148088b61fbd882c3d2bb38ab0b43fa1dac77f31d543").into(), + hex!("b85d9a426a23ca9ee582bc16c203a9352dcc5f85440e46979de80eb572384479b697dc964cafd9457d9f34eeb77bb72a").into(), + hex!("aefb70e89dbf4456e077690509afcdcabf975416ff2fa16777fdf90b3abd3f5dcd865c43f1ebe6f8a669edc7f3bd6ad8").into(), + hex!("8eb03001ac9e22c6956a682ed458e650785c36d23ddbcd51ac4d9cc991325c02519ff1958987a08eb29ff56ff6e2c293").into(), + hex!("ab4a1ffef7e001723c71f5d28f3dd030a06c42d91773733d117247bbf9c01cd66fca2cff8c6ce04c4bfb68dfcdd851f2").into(), + hex!("a9ef845ab489f61dbfdcd71abcc29fc38f3494a00243b9c20b9cd0dd9e8a0f23304df84939b9652cdf5542d9b3ee085e").into(), + hex!("b5726aee939d8aee0d50bf15565f99e6d0c4df7388073b4534f581f572ad55893c5566eab1a7e22db8feeb8a90175b7d").into(), + hex!("9953a7cbc152f101a60e3e381f2af17ebe7401e16ef6462d132b8f0f6c6a18837914a1299d1605f9f289b9561112f4bb").into(), + hex!("a0c9b944a338325f5efb675c9c12619fb43c8e25e80d38d6140e31d5070573b1a0ed9bb52576e4f22f37d0292d36a648").into(), + hex!("8bfd6a173a56b73480cc950ef266a18933ecafc86915a7453ded09efd8a0cf4466101f1373f05d48eae3e7fc5c0f7f54").into(), + hex!("983fc1ddf17f9756c9cecc00b39bb2ad432587a5c6d1c3296a383b9f539c9afe84c6c818447a709c0b686ba26ce5ea3e").into(), + hex!("94bbc6b2742d21eff4fae77c720313015dd4bbcc5add8146bf1c4b89e32f6f5df46ca770e1f385fdd29dc5c7b9653361").into(), + hex!("b26b4d483bca73d3f3a976bb595a0e40f9a42094e0febbad3a1874934be1939a1b362ee4ea14a4f5cbfa9b1392796a12").into(), + hex!("8dbe8fcbcc414eb352245c52549973f73d987012de9d5f2b2f55dfdc43cf8cc9ea6b147abf149817f80f9e15aea566c6").into(), + hex!("9604da21e23c994a0a875ad5e0d279c79210f7a7de5c9699fac4aebbd76d39b703eeec5dd5efc9ad6b9dc58936089ddc").into(), + hex!("8934e9a3feababa12ed142daa30e91bd6d28b432d182ac625501fe1dc82f973c67f0fe82d39c9b1da3613bb8bfe2f77b").into(), + hex!("85f2ed3ffb03e50c8f22553b8e6349be6244d893aa37a7c6dbd221e9e121579e5a04466e60d6b4d3567bc747b1fc1e9f").into(), + hex!("ab0ad421f6fd056687b4fa5e99dff97bd08840b7c4e00435eb9da80e0d7d071a447a22f8e5c1c5e93a9c729e5b875a1e").into(), + hex!("841d77b358c4567396925040dffe17b3b82c6f199285ac621b2a95aa401ddb2bc6f07ebd5fa500af01f64d3bb44de2df").into(), + hex!("83f21dfe0272a5a8682c3c7814c5e0e4db6a9098f1fa80fda725f77ea81fdfd2fa36b0c8db013503a89bd035f86306fa").into(), + hex!("95c98e3b6b62f84edf7f297cae93ee5f82593478877f92fb5bf43fd4422c3c78e37d48c1ee7ca474f807ab3e848d4496").into(), + hex!("81c3a8c00cfe4e82f3d8cb48de7d4926d5ec2f7689f9cb85c1886a23758bc107a4bc6e978601c3519156a169d0bf6779").into(), + hex!("8e956ca6050684b113a6c09d575996a9c99cc0bf61c6fb5c9eaae57b453838821cc604cf8adb70111de2c5076ae9d456").into(), + hex!("83474776ef2341051b781a8feaf971915b4a1034fa30a9232c4bf4b1bd0b57bc069c72c79510acef92e75da6f6b8843d").into(), + hex!("b41780d9d67e9e8b81b1f62d25c0c72ecfda659d2bfe6825edb70ecd0e0724250ac364e7be521cdc112ba638f16360d4").into(), + hex!("842ba3c847c99532bf3a9339380e84839326d39d404f9c2994821eaf265185c1ac87d3dc04a7f851df4961e540330323").into(), + hex!("af17532b35bcb373ce1deebce1c84abe34f88a412082b97795b0c73570cb6b88ea4ba52e7f5eb5ca181277cdba7a2d6d").into(), + hex!("b9574edb9567f07f85c7c2e6ca6c02d90ad7c7b87d49796f1e2fb7240ad071fb755cf13ca8678668a56217c62df168eb").into(), + hex!("82212706111fb1cf5def02b5b0eb7ae9e6ea42b4c7a2b9fcacb7aec928326edb9ac940850dd933f2822f6cf519de0d50").into(), + hex!("9579973ee2559da09b327c62b1cc0177f2859872885dca709e24dcfbb9bdf9224a6d26869aafce498f44c0e6bd8a996c").into(), + hex!("a102c2ade15ea2f2b0cbc7dbd8c1171de0c8092fc4ecef84b5fd2bae7424aea8be1629f851c75e4d1d0e96104e54bfbc").into(), + hex!("a5d7e847ce7793386e17fe525f82aabb790d5417c3c6e3f6312f8e5ff52efa8b345c1ff60c4c9bf7636f5ff17b7a0061").into(), + hex!("b4b80d7fbdb1dbf1567dfb30d8e814e63de670839a8f6ff434fe171416599fef831b8e978d6498851b8a81e0bc8dfb85").into(), + hex!("b6e6277b86cd5284299ced867d37ab98090ac44a94deef6898aeadd177e64605440c15b9609c07e71fe54c95b61873b0").into(), + hex!("8135a0633082e4465090d6930b770340e82366bc5c37be6ef6dd105f85acf63361e17de8b5fcab4c82e9f9b4029954b7").into(), + hex!("864d5d9858cd881eecb0dde5e3e0c6c5de623cd9ef619e87b82fd25c5edf45a1a025b1dc763c27c5f4d520fd564b464a").into(), + hex!("8784a8fa62e0ce23283386175007bb781a8ec91b06fd94f22a20cd869929de37259847a94a0f22078ab14bb74709fac6").into(), + hex!("8adb748d5fa5c22ce4c76a1debf394b00d58add9f4e08524cf9c503f95981b36b8d0cb2dfaef0d59d07768e555733ecc").into(), + hex!("b76cb8cb446eb3cb4f682a5cd884f6c93086a8bf626c5b5c557a06499de9c13315618d48a0c5693512a3dc143a799c07").into(), + hex!("b2af1f7ece1fd640c205a09614122d69d5d2e81a7618bedefd6dbb91c7f432679be4ced1e6dddd3de323bd44991931c5").into(), + hex!("b950b457c34bfdfdd9d6da9628d41749ccae03659518a04b56487bf1b4c0681b719ec5230c0b0fd5dd710894df6aa2f8").into(), + hex!("b21785008910a949804d1291e7533752641d31beae3cb518806488f81d58c38a5efe5ed9534ac692e68c3121e2f9d97d").into(), + hex!("a9b120a77d70c1cbc0178a12d97a78b2dd0b98d0584e8e780b937800ceb18c90eaa1f0a83c5b50e34cae1c20468f004f").into(), + hex!("998c9ee20d33f96a2388b1df642aa602bc8900ba335e8810baab17060c1eace4bc5203672c257b9ae750008b707b0aa1").into(), + hex!("a7d1676816e81a752267d309014de1772b571b109c2901dc7c9810f45417faa18c81965c114be489ed178e54ac3687a1").into(), + hex!("b409f87f0632aae9bc081345b17a50a767ba4198f9ac9d352246fb3bebd29ed53c9d6f148c2f318c2eb12846b0aac4cb").into(), + hex!("b40a3bae2b08c13db00f993db49e2042be99cde3d6f4f03d9991e42297933d6049394c659e31f316fcb081b60461dabf").into(), + hex!("8c1de4264e04ff7e8282faf81c0bfb5943656451be52170211cb7adf4ff21bccbb789400735579c622f69982fcb8e9c6").into(), + hex!("8085c60b6b12ac8a5be8a7e24977663125c34827842aa3b2730854ab199dd0d2eaa93084c9599f0939be8db6758b198b").into(), + hex!("972cfaefda96f5edfe0614c01533b76153118712c1c02c505008204a5be2aa438675d97f43384199517b1c08c7c9fdb2").into(), + hex!("a1e47798a782a024da340d6d6a1b1e5e15a0f2d8668adf349ca375086964414a563cc1eea3226ae637f87e78c0a630b3").into(), + hex!("8171f20c020faae112bb92ca213c1df5b1050151496c70db5c5319212bada83b120d515bd7d8b24736090c574e1b7203").into(), + hex!("afe779a9ca4edc032fed08ee0dd069be277d7663e898dceaba6001399b0b77bbce653c9dc90f27137b4278d754c1551a").into(), + hex!("a5a07bf219432e9c80c38596c93560b49c7de287f31e30b7a06fcb4d15982add4a24085adbc5b753c462be989c64c96d").into(), + hex!("9210be290176d7e8a5005d27e7ed825067b1c678b174bc8180f92b5c03b6c3d1822356edba84f460caf6bf5275cd7efb").into(), + hex!("a95bec86a7c8417a8df3a0158199327ba0924d3b7dd94cd7c1ef8489b10270ae64b8537ed39cd3699a48942bfc80c35d").into(), + hex!("ad9725114b01152fff134c1a8ccb8d171b8cd11685ef6815b76f442d757d130bab9ef4c9845e66f4aa0237ee2b525c20").into(), + hex!("8018499ef720e28759133033833edfe17ed23e42f99058bb79fe844ddee823cfdc43916be2dc9724d18f9726e6f1b409").into(), + hex!("809c7a08fbef7caf4c137cd639f2e47a8ca60d13bca3990eac51ac2a9e4442cd1a1473bebb63c61d595b586525d7b027").into(), + hex!("9793a74fa578ace75b083578277a1ae8766d41a5c508b0f1135fb97dff1d0826002393a7276b18cbc4b3c5671360ce0b").into(), + hex!("a6d7e65bf9f889532090ae4f9067bb63f15b21f05f22c2540ff1bb5b0b5d98f205e150b1b1690e9aa13d0dee37222143").into(), + hex!("99c935fe18699bca9852200c292690a2b834bac508890c4ee9af1aa6999a8d590bf6a3a274bb55d5a73f1b7095d10f37").into(), + hex!("860f5649c5299211728a36722a142bf1aa7cbbfbd225b671d427c67546375de96832c06709c73b7a51439b091249d34f").into(), + hex!("9104ac7ad13b441c6b2234a319e1c54e7f172c9a3efcb8c5fab0ac1d388b01895a9a208f59910bc00fb998b0adab1bc3").into(), + hex!("a3b109249ac2900806f0f39338da72d4f2cc6d1ac403b59834b46da5705cf436af8499fa83717f954edb32312397c8d9").into(), + hex!("b9893f7a47af457a9efd90ddc0c0ef383ab34e9c1284e617c126965cd9f0de5c54ee8b7b5208ff190366fe445e9c1325").into(), + hex!("b77416ea9a6b819e63ae427057d5741788bd6301b02d180083c7aa662200f5ebed14a486efae63c3de81572fe0d92a9c").into(), + hex!("8b20a852fc8f0b7cdbbd808c04a0cfd2fbccbdc0cb2361434f0d96341c8bde6155695977768d563b95746dcb4339fe2c").into(), + hex!("96b15806d9009962fa07f8c32e92e3bc30be4ded0645ab9f486962a1b317e313830992179826d746ea26d4d906bdb7b6").into(), + hex!("b0d69b3861ca6791632ec8a87114b463e0da571bc076c22a8f0d9e88a1a5eaef24683f3efa8f34900d0112412e3dc4fa").into(), + hex!("b01a30d439def99e676c097e5f4b2aa249aa4d184eaace81819a698cb37d33f5a24089339916ee0acb539f0e62936d83").into(), + hex!("b19ca6e55f349bbb2dc3e429520ff5b2e817972470794f35c1aac8c118b37a694cfcc875b6d72225343799825d2f5c39").into(), + hex!("b7ea5e0d3cfcf0570204b0371d69df1ab8f1fdc4e58688ecd2b884399644f7d318d660c23bd4d6d60d44a43aa9cf656d").into(), + hex!("a778da56ddfe4a383816b43b027464d7a28689fc4a6b35b36883d3f36d9c41f0177bdbfc8f258afe8da90f02d3b64fea").into(), + hex!("910fd030feb5538f538e5ba74b9bd017d889ed6d2a797be9c26d2be8caeba7a473006102de27e87755742ba34e445bca").into(), + hex!("b49593ea6040ce82cfb5aa2881a4b0c42b78aa9fc8467d79c8e4a8ae4ee7355842841c8e1cc0558362047ed80de44fd3").into(), + hex!("b07447c7e87459315fcbda3fb86fef27f98373b1246e2ce367e26afd87f6d698a438501fdc13cc5de9eef8d545aab768").into(), + hex!("8a9f7e8d45f11c4bfb0921c6008f3c79ff923452bcfa7769beb3222f1f37dcb861be979e6eae187f06cf26af05e8ee5b").into(), + hex!("8ebfbcaccddd2489c4a29a374a2babc26987c3312607eadb2c4b0a53a17de97107c54eab34def09144b3098c082c286b").into(), + hex!("93be3d4363659fb6fbf3e4c91ac25524f486450a3937bc210c2043773131f81018dbc042f40be623192fbdd174369be2").into(), + hex!("8cf8412bd48b21b008f0207b1f430ed96bc6512c3712dffbbecb66e493e33698c051b27a2998c5bddd89d6c373d02d06").into(), + hex!("a5562fbaa952d4dcfe234023f969fa691307a8dfa46de1b2dcff73d3791d56b1c52d3b949365911fdff6dde44c08e855").into(), + hex!("a8c167b93023b60e2050e704fcaca8951df180b2ae17bfb6af464533395ece7ed9d9ec200fd08b27b6f04dafa3a7a0bd").into(), + hex!("93e4d7740847caeeaca68e0b8f9a81b9475435108861506e3d3ccd3d716e05ced294ac30743eb9f45496acd6438b255d").into(), + hex!("8016d3229030424cfeff6c5b813970ea193f8d012cfa767270ca9057d58eddc556e96c14544bf4c038dbed5f24aa8da0").into(), + hex!("ab7eff4ef8696db334bce564bc273af0412bb4de547056326dff2037e1eca7abde039a51953948dd61d3d15925cd92f6").into(), + hex!("a3f9dcc48290883d233100b69404b0b05cf34df5f6e6f6833a17cc7b23a2612b85c39df03c1e6e3cd380f259402c6120").into(), + hex!("8b476b3b065a3b95a3d11ec60a749c2258ddcc5885bfb50b8a086d3fd1e49ff73e1dde733b8981c3d2d206aa0c87b09b").into(), + hex!("af3e694ad71684f7214f86bed85149db039971e1c362119b979a135255aa226128802e58e2caaeaf8d89304371dd0440").into(), + hex!("aa19a75f21a14ad5f170e336a0bd07e0c98b9f5d71f91e784d1dc28a5f5eb6870a4eb35bb41edcf9e6efe982ae5c2c5b").into(), + hex!("b9528983419ab5766596683faebb3592982a76b68593f810186b4e5f94f6de60830739ad8dcc164c601d575b84bd2700").into(), + hex!("88e7a12a90428bb45bcf4b01442c11607433211fc2f9bee9545304eb66e0b4b5339360160bc782e185391385da7c5ad7").into(), + hex!("a4c4df0e29db19ab4c82dd6ca8570b337d15b59c7d84577a7a444a8f762ff16ff5ab3e4203a1d6b60a23ff949a93ea81").into(), + hex!("8f11ee58ef82b1bbd2240d3f548d8681e22bed5ce118d605bed4523b4bb39899ac78e15337daab92666750dfcaf32aff").into(), + hex!("8d3cba4d10f94bd3406a341c903ad144cfcfe6b61678d5c03084a56b4413bc30bd20d7a9fd5d839dbb565cc9b2aa99fe").into(), + hex!("ab8a8769c754008a7976b6799e81d7bfe97413d0a79b90715703c1f8f567675463ec93aabee59277121fc4df88b5c7a9").into(), + hex!("b201b0546f19c5db88df9c684cf55ed623bdb43927d06051bd595497df741feb1485961f64e8d3d1811d9e2e9e1e54ad").into(), + hex!("a04016e9e13ad845763cfe44af4e29fecf920b4aa42f581715fc34fb9ca27776feee45c82093c7274839eef1838b10c4").into(), + hex!("8f84cba7ceb7652023fc8ebde4b00ecde1f550935bab12feb630d6f49517b4148f3cde184bf55d4f6ec99a849fc6f862").into(), + hex!("a2248409026f35c3da8bc4d5c02315066df8fca44ff5a358cc42b5c88bdf6866dc133617c697bff004b1ef20ec4b5748").into(), + hex!("a52c5a63b55a8001b6b67c5db4fd5e95923052f03618369312896ed9892d99354aebc0dee8c3b365bafa29e211a5c3f9").into(), + hex!("8c9fefe233d0d657349b7efcdc368f5aaead27071d224af780874751e7d241f6b88f7650fbb4133043b24bbebc12aa48").into(), + hex!("86ceb649a337a5a79c17b496993ca07fa93b38a582367ca04f3dfec5cef8f268d4e8080e5a76b150f5be1b177ef6984e").into(), + hex!("87dcb537e38cefa32e629ae669da42e809b5afcabdeeef244b72ce057fc18584a1e8c3f073d5d33775232707f0cc59ca").into(), + hex!("a020404547407be6d42856780a1b9cf46b5bc48122902880909bdcf45b204c083f3b03447c6e90d97fd241975566e9bf").into(), + hex!("a1beb9f673409ec678020ea4dcbe65177aa18e2932ceb9cfb33fccb94b9a8ccb664f71647d58b3c8b2bdbbffbc02d5f7").into(), + hex!("ae47b31c5b62b38ee886ee04945649054369018dd6543c91f0138464af489a32c1fea339e0e0cbe82e3e8b9f2ef3918c").into(), + hex!("b18c41c0f827f6d8656d3fb93c90b663eb2eac034923972f8842cb30e96c32842b3fbc1127930e1ba4322d5b6641f04d").into(), + hex!("a6d6ef51a361df2e8f1d993980e4df93dbbb32248a8608e3e2b724093936f013edabb2e3374842b7cce9630e57c7e4dd").into(), + hex!("a49da42c27d019a21cc6489ada7b712b98c4ede28ba25dbcfa916acef48446a2baf73e03a48be763378a09774d4a03fc").into(), + hex!("8b62902fb2855300580e94830a4bc825d997ede33bf356fe3b7c08d6a8bd85a37879433fc6bee58f9b44ca280f4e8dfd").into(), + hex!("af9d13103868c854821ba518907b067cfba025d739125f1e9cce0a04fffc3a2a1f25506c1209a0cfe1d6c1572c229ff0").into(), + hex!("8910f41db6952c25dfbf6b6b5ba252a2d999c51537d35a0d86b7688bb54dcb6f11eb755a5dce366113dfb2f6b56802b7").into(), + hex!("b551d1ce88cbf4ffbdcb0113a6e319513bd676d0078dd4e6a6f23ad336c1d0fb47a4e427bdedbe0fc8f152353971f81d").into(), + hex!("b8876bda1e709ab16e1347a1107852a7898a334a84af978de39920790b4d82eb0739cbfc34da1c7154dd6e9f7674759c").into(), + hex!("a7d9ae9621dd1f3da3cd2d435e891cc3579c4c0d60d6a4565cac86c315cea21a9ad883559fe7b897ae6e05f1aa989ad9").into(), + hex!("aac995a41c14d379853ef18ffc854ad62ad77061ca9bdf5029cab3d6c2630de114e777a7fc3322455939d5205ed59c55").into(), + hex!("999cec6a31d9b2f280017ddd59138014829fa34cab58e6c35a5014ec364b84712441e7a2f717cf2f0de8d5451e250924").into(), + hex!("b1f43b498cba1797f9793dc794a437500c3c44a8a4b59f9125a4d358afa304fc05b88ac31ed40b6eb68f0396b60cb7cd").into(), + hex!("93ba2e000bdb7269818d390bc4232992d280e69abebe2db2ecb6fcb1390d323238c9793574509bc1fa34051ac1928f07").into(), + hex!("a64808a2d15c30460651c200a09b50fc83e9d84d87abc156d06cee73b76fbd74e6d64424cb5bb83d3f16b21bdb7ae9d2").into(), + hex!("a75bcd04fcb44ce5cbab7eef6649155ec0bef46202e4eb86c88b4ced65e111f764ee7fb37e9f68e38067040fedf715ee").into(), + hex!("b95fc0ec39596deee2c4363f57bb4786f5bb8dfb345c1e5b14e2927be482615971d0d81f9a88b3389fac7079b3cb2f46").into(), + hex!("aef456af90354ff88039d2dde02b0f5a6790aa762b23e0a9da8c6ec92c3b8b3320687bb21666608b4a22615843afd1ef").into(), + hex!("b38be9ada17ced704a34a7498c4fd6ba2503f6bd886b693d4712267847efa887a26e7da5d60f8bc5014b92bca8b3a12d").into(), + hex!("991a7c93f06d50ec6a4340c6751b73eb5825bad02a954e44e1e2d424af928819ebbb590c6129ce35b3f1e908e2152f33").into(), + hex!("84888f2efd897a2aca04e34505774f6f4d62a02a5ae93f71405f2d3b326366b4038854458fd6553d12da6d4891788e59").into(), + hex!("941e2e3ba414a371a11c3fe92cabf688ff363da6230ec7c83ac7303f652a19ebc89cc494427c456d0c2ae84c72053f73").into(), + hex!("925f3bb79c89a759cbf1fabdaa4d332dfe1b2d146c9b782fe4a9f85fee522834e05c4c0df8915f8f7b5389604ba66c19").into(), + hex!("941c8962debd2756f92a6a0451a2bf7fbc01f32ed03d0823dffd4a61186628a4c3c7c482b18589ff65e4c449fa35c2a4").into(), + hex!("88ce41025aa153a94f91f22e7b96f9342b5e0e1d76274fc70c4df7d08f66d9f7ac86e55a1c6e77693b8b01b2b38bf900").into(), + hex!("8f142bde50abe4dac8e059003db41610436d5ca60d2dfe2660ecaa5f9628aeb8b5d443e1b57662076f77363c89a1479d").into(), + hex!("b2affe048c187d311a185503d8958cacbe03796edf79bc32e8533941004d9178bd2e376e627e1ba61ed43850c0c455cf").into(), + hex!("8f7bbaaac458bada6d852fe665c87c646133bab16c0d5136c3dc922095b9d647d93a9de7671cb7bfd4cbd138ae0709d1").into(), + hex!("b76f598fd5c28d742bc1a81af84f35f1284d62239989f1025e9eba9bece2d746a52f246f9bb6bcfde888b9f7b67fc4f6").into(), + hex!("a4c665a3e4e25a7af51e433c978573841bfa2c75c075e17dd1f43b2f0369249f3d3a46ff51051e8ce7da528b0fa98d16").into(), + hex!("81e0992e7c1c54c21cac32e36b90b25e1e5b72aac99c953c3c4d019eced64d7e316cbc0840204a4a51a4ad17d8b1d508").into(), + hex!("96d7a69eaf2761bf0e5ebcd607b134d5dedba8e262ca1d6d3e8fbf23e6419a8ce1bbe4cd23b9e4b5f80db54a802a9795").into(), + hex!("b2235bdf60dde5d0d78c72cb69e6e09153b0154efdbab97e1bc91f18d3cec4f660a80311fe6a1acd419a448ab65b18f1").into(), + hex!("838d5eee51f5d65c9ed1632d042bb7f88161f3789e6bb461318c5400eaf6728e7ba0f92c18e1a994aa4743145c96164b").into(), + hex!("acfbac397ae2ff23b31bb27b90788fd0fd51a50f8e8c9f4b31be8499194252014f0b1972b204aeb9c2836a20beb3c868").into(), + hex!("ad85789bb62b60e9768bd330a31a16f711b6018445af6a47646f318f12df8d4d256ad00d1ed7c3afa4e98fef73c6c610").into(), + hex!("b2349265be33d90aaf51362d015ce47c5ffe33e9e6e018c8c6e39336d9327ccdd13d25e792eb33b43ed89a162f6ac2fd").into(), + hex!("aa458aaca6ecb43b6e45ea72d02682e5a7dc8dc22782669a0628e1638e73999319f011803f4ec8cf072467bf2c49c629").into(), + hex!("b9e6c9f2562e90bd3008669a42151538b70faf028cc5bbc09fd6ab3febc626df911fcc65744a2ad793ecaf3f91a1f701").into(), + hex!("a37185bd96faa526dfd3ddaff89b1eb29ceb4597bfc7e346bff9d6b3225b9ca87cbce0db94f05243c7232ead5f6607e8").into(), + hex!("824fde65f1ff4f1f83207d0045137070e0facc8e70070422369a3b72bbf486a9387375c5ef33f4cb6c658a04c3f2bd7e").into(), + hex!("b0ed68167a67490bd7d7d49e83341606d6e6fdd99b82e46747c2190d270719f81c5f5f8733646c246260f438a695aa3a").into(), + hex!("a87c2f13f2a824b7e2c39cfb63ca7b94ae6a11ade0c6b8e83f5092b933fa8b6157a5d2f09c23081f49d35cc85f5db36c").into(), + hex!("88f5e795cb36ab22bdcff01caca0e9d04db463c3d88cf656c3a0e0f5ac864b7092c738758b4c8f3b65e31995c6aaf267").into(), + hex!("ac66f3a7041586ac1576e33598f01921e16d99afbf4249c3350f0ee1654de98bd37a61c243eb6a18a942db529e36af0d").into(), + hex!("aca69a4095567331a665e2841210655636a3273d7b7590e021925fe50757617898e1883532f9cfd46428c2e3d854f9f7").into(), + hex!("946d585d7aa452d37a8c89d404757c3cce2adf2410e18613483c19199abd88f7a12e206f87a43f6009e42f4e31ed20c0").into(), + hex!("9722c1079db7e2e1c49756288a02302b43b8fd92d5671585ac1ea7491123742a2744a526c12c9a0b4c4a80f26342a3a6").into(), + hex!("b80e8516598c59dddcf13fdb7a42d8f5a52c84e01bd6a39880f4acaefe8e4b8f09cc1b1a2423cd5121f4952201f20078").into(), + hex!("85bca2f86423a09014b562f7dc613246bedffdcb3aa41fee02270c13e6b00c8d6704dcbfbafc5997df6a90c7fc08c29f").into(), + hex!("a36dad4f7cba9f4cc843fe40f6240e1973a4c412cae29b4a68712598523cfaecb05272fc47d30772bf06906b5a26e282").into(), + hex!("a3d8610c2522d330df02511710e52b1d9bdc9f2b156deca12b1bf754266caeac4f449ed965d9863558df43ce9ae65a44").into(), + hex!("b3e313e79d905a3cc9cc8a86bd4dba7286fb641c2f93706adb3b932443e32eff2cbed695beeb26d93101c53d5f49d7db").into(), + hex!("88d8a32231ff2bfc39f1f9d39ccf638727b4ead866660b1b8bfbdf59c5ab4d76efddd76930eff49ea0af048b2e396b6c").into(), + hex!("a90d9502a9785e55c199630456fcb1e794bbeb0f5f8c022e66f238a0789998b126cf9911fd0b7d463b7706dc6f9ec128").into(), + hex!("8c627caf25eae6764501b9eff35aa90bd4f24952cad712aae20344579e83ecd104ad1f7915edc4f9023b17fddbdb4cd7").into(), + hex!("87d4b20bbe2dcd4f65f4e1087f58532d5140b39a5288e1a63fc0b7e97a6a56946eafdd90ba09300c3d1fef6356ac6b7c").into(), + hex!("a18f4464cf5cebade8ee280fa00e0917cbf1743aeb0dacc748ab68773b909e30dc60f40fdef3041b5f082e650985f7a6").into(), + hex!("a6ae4fd03fbb4e2150795f75a241ab3a95c622b4615f553bab342a1803b86b1c1a2fc93bd92ee12786bf2de22d455786").into(), + hex!("a89bc7548ea245ce9556eeee3fba98a3256f87499f54a7c5eec0c43b9fb4ef2fe8f6810867ed0df814a88ee100c245af").into(), + hex!("97f1a7370b4f5acf83b466f519da361c366915f560385dd7eff9d53700ad81b25c9862bc71d35428e82372a5ae555ea0").into(), + hex!("825359cfe68ad6a75578a94be6419179e0aa088170b6c20fc5c249dc3be7a260d687c93d8d8a343c7c72c2ed6a716de3").into(), + hex!("aa9b9cc039d147677aedd1e47ad9013fcc0da0164070ff7305b18e5786c7fac0471368637a3adbb78f3af174a5c1592a").into(), + hex!("a61687511b627bde7b3977e9a34cb7fddc2aaa509a7b99b6b6c7b97133845c721e1e69f99758698d82cca265d8703610").into(), + hex!("8853c582e86cf916750d670a621246a63c7fd78f68c556642053bcdfa7937de58885d728209736b7d5521b591387e9a7").into(), + hex!("82b8c013f24fe64b8e0337ae8b6a682cae336b8404eafc1404744f80f765efdb8b2873d1d3f31141e8dfe4d93346ac56").into(), + hex!("866ec39b9eda580d96bc2bff76af5cd4887b6788675149ab33bfefe38db82ad01b8d64c6b60704210918f3564cde1110").into(), + hex!("81337ebe90d6942d8b61922ea880c4d28ebc745ddc10a1acc85b745a15c6c8754af1a73b1b3483b6a5024b783510b35c").into(), + hex!("807c510df25c0ba10d4aa06a462e02f050c69a977c64c071401ab74f9ac1e60788aa504743b4cc1982da835ff9ac2541").into(), + hex!("96b1c82b85cdb8a7026fd3431bea9cd008f0261ee7f4179f4e69a399872837ab836a14e2dd45f5448d54800a4ae7c7f2").into(), + hex!("a48b1031ca2f5a5acb4dbdd0e9a2b4e9add5ccfc0b17d94818273c8df11e825193fade364e0aec10f1ff91d57d03a52f").into(), + ], + aggregate_pubkey: hex!("a825959280c88c6716f6df807204feb84d745dfbee3cb3474ce81a1ef0c4cd142e5ca962a0335e68b7b4266769d631b8").into(), + }, + current_sync_committee_branch: vec![ + hex!("bcfe80e1d24fbdad7bc058b011403a4c26cb56967654494cde51517f888023f4").into(), + hex!("4710ae46156553fee6231622052f7fb2f6945cdb59a5501cef824b1925c87445").into(), + hex!("6df62e05ef3e1ac92c659c3a519b8fa651d1b649c2b46fda58c48cdeffe8337c").into(), + hex!("d26ff22ef5958a707a8d98eb1ffaaf1f9f412e816c04b79f5434cb1792ccf608").into(), + hex!("90d5e61f0af673ab4d8b3ab0b978d05142a8295a163b198e6dea9d8c8f1c6d89").into(), + ], + validators_root: hex!("d8ea171f3c94aea21ebc42a1ed61052acf3f9209c00e4efbaaddac09ed9b8078").into(), + block_roots_root: hex!("5078f286fa90b88a09dcccd4ac72f6c3615b77c0ab3132508cb8c0c07b20282d").into(), + block_roots_branch: vec![ + hex!("558b658b1230e225ac3adce3daf0b066ed0484b4a768d55b74ba81579ca0e5d0").into(), + hex!("2cbb27d38065ff3f230247af918e67d1998b67bc7e2ce6c244bab7146e16b8ad").into(), + hex!("c63bfc96585f424385e3b4b39ce46e957017b716c54d105eb7e07c841d1d4309").into(), + hex!("e662b38f57427b58c46b09980db3856f17e56b60b36bd5471823b0f2cc1b6467").into(), + hex!("8b3bd99618b1e50cf284b4c3b03d0cc272312bce377d585eded77154aa5580a5").into(), + ], + }) +} + +pub fn make_sync_committee_update() -> Box { + Box::new(Update { + attested_header: BeaconHeader { + slot: 4055104, + proposer_index: 1862, + parent_root: hex!("5f44df1f70338aca4b3046f9e5b144bda8b27276320ca000077389d0aba35317").into(), + state_root: hex!("9daecfedc819b45231bf93819a73efd4304ca79528032fae2e852ebbe514cfdf").into(), + body_root: hex!("a33f5cdc6732684e6f248e5a7636c7e7bf705f0bf709098a46ba15c660b4fc65").into(), + }, + sync_aggregate: SyncAggregate{ + sync_committee_bits: hex!("ffffffffff7bfdfffff7fffff1effffef7f9ffbdfdffffffdffbfffbbf7ffffffffffefdf7ffbeffdffef7bfffffffffffbffffffffffbffffffffffffffdfda"), + sync_committee_signature: hex!("880f147850ac0a94130b81f94203e2f69d512c929df8b954b6adc20cb1e8598aafadf366c074b590c0905d584dd980af18e0c8a837bbcadf6b4438507aa46ef95879c0acd9c2d273ccb13d93e4938e9c601f0dd466f53369ae94e1287955cae6").into(), + }, + signature_slot: 4055105, + next_sync_committee_update: Some(NextSyncCommitteeUpdate { + next_sync_committee: SyncCommittee { + pubkeys: [ + hex!("aedc2d47fa2662be6ab58ddd3682bd5e53f508162968fce8326c75f92fb3c1a25c4d4d0e6904f9b6cb1ccbaaa9dc28d8").into(), + hex!("8097b13908662d245820f3b045d8c2c665fe9a054e9c661323924ec86dfa713b36b0c787ad4dfdeb979318810e687a48").into(), + hex!("98aebd4bf15916512508a5fe89d814d5d76423c562cd3f0a0af504c8cde53be30f4df00e3ba0229cbf8528e198a0df11").into(), + hex!("86bba46d0031989d0f1baccea4174fc3fa0d595e60d35a464e86c33c233e2d6def84fced7a00f59afe397cf4fb5b67c5").into(), + hex!("845982c2672fdd44b33d2e56ad676e704c02f756b09e8765bea42b924c14724484567b55f0db42ac20cb70a7f5201c14").into(), + hex!("926dc729e135f1f0bff4662ee3d6823a64597fe189b763ada34f246e77705fd4e062d85506a338e9fa98c4d225a3b27a").into(), + hex!("b930ecc2a26183240f8da107e80979b59da4e05f090316d982815ed6151d7750490b85273187ec4e07eb221813a4f279").into(), + hex!("81564bee5a3bd09476f658cf7719326c353485e2f4fea58d110071c5dddd3cabc349a8d1ecea45d589ed4479952a2ba2").into(), + hex!("a66d5b1cf24a38a598a45d16818d04e1c1331f8535591e7b9d3d13e390bfb466a0180098b4656131e087b72bf10be172").into(), + hex!("b9b9b6113301bd2b409b71afa1ab9e31d22f84f8cb03badaa408e1d37032350094124e533de766622d7975a047fade6c").into(), + hex!("8eb3b3e3135720036c1120c4e8b8d405b00d002f2bdbe601a06f2c2fffb940a9966d18636ee34fc003dfef547d8f3b76").into(), + hex!("898deb30ede570d391266c81132a78239083aa9e27a9068e26a3bc14ff6468c3f2423484efb2f808b4996c16bfee0932").into(), + hex!("a90d9502a9785e55c199630456fcb1e794bbeb0f5f8c022e66f238a0789998b126cf9911fd0b7d463b7706dc6f9ec128").into(), + hex!("ae8af784224b434b4dfa9ae94481da4c425602097936623e8abb875f25deb907aa7530bce357786a26ed64ef53d5e6b3").into(), + hex!("b544c692b046aad8b6f5c2e3493bc8f638659795f06327fff1e9f4ffc8e9f7abdbf4b7f6fcdfb8fe19654d8fa7d68170").into(), + hex!("ac5c01c51dac6ee1cb365c9b03f09906d9b7b9b4d1b73c44d9e8e06823025d7070f242898a975420bc87d6372382cab8").into(), + hex!("a4632399c1a813e41fb2055ef293466098ea7752a9d3722d019aa01620f8c5ecdc5954f176c6c0901a770cbe6990eb11").into(), + hex!("85f7ae1a7a7c793c408750ddec2d7f58b985fc3cdf9fcf6b2192bc57092b8a271b2fb6ced0639baaffe0bec3203e568b").into(), + hex!("aaeb466f4316874c2107a0de38dafafa65ce50039c20723e8797815238011426f4e77e29fc573e7c6d2df85c1bbfefdd").into(), + hex!("a8fd63da16dd6a4aa1532568058d7f12831698134049c156a2d20264df6539318f65ec1e1a733e0f03a9845076bb8df8").into(), + hex!("93600f65c090814cee5cbd5f22f98e79c69e63510501a0be6a74b111e4c52441133fc1c198c7bf235f9005aeacf1d441").into(), + hex!("a69f0a66173645ebda4f0be19235c620c1a1024c66f90e76715068804b0d86a23dc68b60bca5a3e685cce2501d76de97").into(), + hex!("ac6e7e9960207138d5b4b6a7f061756c01cc4a830e5988423d344f23544ed0eaa790aed63a22df375768f670cc9b9bd4").into(), + hex!("93042dd42e56671155bb40d85d9d56f42caf27bd965c6a7a7948b39089dba8487d4d5fd30522dba6ba392964e3ffd590").into(), + hex!("85bca2f86423a09014b562f7dc613246bedffdcb3aa41fee02270c13e6b00c8d6704dcbfbafc5997df6a90c7fc08c29f").into(), + hex!("9550072f64a48cb86bfa224d492be9a91e5a6c9def04b6a290b7a19d96981937d5a2c35de6515d1881bcb167f6e3d661").into(), + hex!("8d797819318cdf7b26405d1a327d80d4c289e56f830b28d4e303bcb019aeb0b3d69bfed58adcde8a2445dd5281b86af1").into(), + hex!("90c04eb3f3679cd630434418cb3a225a73254887692429960bd45b1613f85b2c14723cd8c7f1e875588ed82b7f5576b7").into(), + hex!("9953a7cbc152f101a60e3e381f2af17ebe7401e16ef6462d132b8f0f6c6a18837914a1299d1605f9f289b9561112f4bb").into(), + hex!("a9300a33927335f482dd0e44d0d57704ebeb278f732ae8301073cb7d5e457f02a0cb03268de71d284b8c23fb96947469").into(), + hex!("88554c83648ea97dac83d806cd81d92531980346b208d281fba489da15a0084fd4d9a00591d1ca67aad3c5793685d55f").into(), + hex!("9131874b09aa95ba186bcaa9e040fabc811b9c7b905b7dc79e902cf2bb5816d7ee39b0b55be609f22bc8c538760b2037").into(), + hex!("8368bb9b9bb2e17730c42ed1100eb870c88a8431601312aa8cb1e738cdb9ca2704dfd432cf1703c0db043259819631dc").into(), + hex!("b49379bbb9f954d2ef5574199607bc6b3aa2cc3b48dcc3745cc77406bba2a394929844fec1b87c4ce65cd0ca0f83062d").into(), + hex!("876afcd045c8a18967923733a3a43757652289b0974cd348238a693f30bb57f38664ecb97877a5e5f7d0185039a2bf54").into(), + hex!("8db19f6dd3789df179ab606508ca7e3da7967ad4340f630bda83df54c197d6bd3a14980c87fe10cbced7678c0c300ef1").into(), + hex!("997a91da55801acb6134d067ad65a9a44ead0b53d3871bb97b46ec36149d25e712d7230d38605479796190abd3d134b7").into(), + hex!("ab1abf9cf630d6cbcac0c503df44603142ac81acd647784ae0e8fc97800ef04378bc9d7f2087f959ad4bbbeec65b8dfe").into(), + hex!("95718b06017ba9d45894867fd67148645d25d9db2229aa89971f444641ba9db4c5c6f0785f3b25cf2cd7fadaa6adc5eb").into(), + hex!("8ec38c68afdfb6ba019204039c2fb49a35467058f561f626fa87314d705fd615a7b9966576052be1b3690028d3c5c7bc").into(), + hex!("a5d72ac4cdcd847d67cb5a68c6141cde99a91303ca84165bbdc6fd7f643422faec783de60739e1b2753088280c90a68b").into(), + hex!("a778da56ddfe4a383816b43b027464d7a28689fc4a6b35b36883d3f36d9c41f0177bdbfc8f258afe8da90f02d3b64fea").into(), + hex!("a2ab566033062b6481eb7e4bbc64ed022407f56aa8dddc1aade76aa54a30ce3256052ce99218b66e6265f70837137a10").into(), + hex!("b9c347c1c350fb7ef6ee9ca6780cf0604f30e3a74e9d0234bca6b3e7faed26148f2b736d9fbff6b04f5b947fda458e8c").into(), + hex!("815f53751f6d3e7d76c489f3c98d2b49214938cac8c2b417e2d17bb13446c285fa76fd32a97e9c4564a68f4faa069ad2").into(), + hex!("b3f1319ae34ad1d59207288f01d3d7b7e1bad7733fb4a819a09b011d72a4d736bd3c7afeb74cf56da0e00cf712042ad2").into(), + hex!("abbfb501071148e98b6aa56308197356fd993c93e27fd58987eca82036c1ae0ea89f9fb1a06c82851234643904c58453").into(), + hex!("a0899189bba608887c6cb729580e570ecce9ca7107865ebd30def867afaaa250bac407c30dbee11b7ef6cd423269a8fd").into(), + hex!("88e7a12a90428bb45bcf4b01442c11607433211fc2f9bee9545304eb66e0b4b5339360160bc782e185391385da7c5ad7").into(), + hex!("82714b00a822c30b317ffc1d4ba163990cc1ffe5769f91906a7f71ad1f62b39865a5314433a4ab2ba762b1d62b01003e").into(), + hex!("a3a930dd70aeeaff0f2e3790927d5425db40467ee106261615de5fcb937bb1621be213ccd8b3a14d96c5908bedc2e421").into(), + hex!("b2902161b565dd5b8e8c54187b26f01741a39ea8bc1120598661bd367cf8fc73e21eda2f0f6f9ba2270c80a59ff5985e").into(), + hex!("b77cdf45f39bf85ab3e8c8afa602f159de8352188aba5378957d468315a2d2326daef83d8ac6b227f1e7a514488afbc6").into(), + hex!("a9e573274f5a131d6c7641bc0576a2621b6466a5bf2cecb21058160a854b1b9e0be176da2b6b9b3ed562fc36c5f09119").into(), + hex!("876561bba29e656b7122f1cb51a02dff1ac7d470217d8a4799c01e61816c4660eea91843a5a42502ddf842d2daeb0586").into(), + hex!("a0ebae60a998907a19baa396ae5a82bfe6aa22cf71bfca4e1b4df7d297bd9367bbeb2463bda37aa852ad8fd51803e482").into(), + hex!("84a6edac5ac68a7ca837c46d5ada8fab136748b6c3a3b9165dbbc231ec386b15328e4ef7d69a15d4cf354135348a4ee4").into(), + hex!("8b476b3b065a3b95a3d11ec60a749c2258ddcc5885bfb50b8a086d3fd1e49ff73e1dde733b8981c3d2d206aa0c87b09b").into(), + hex!("b48490c5a3bc9e66cdc78994f7c73e0f2724fec8a304b4147799e5142396df155ef7c42065ed6d2c0393d138fb4d2a0b").into(), + hex!("849ddbdc3ac55ff22a3b2f4bc51892fed694490ab4dd342165ac38c725c8b38921eaefe3c443962925fc3726aa41e236").into(), + hex!("b49c45d9da4aaa64967c28f1fd77b7f709f5a331b58823eb1613856fd8f92635135981830a287e8dbda3a0e0fc481c5b").into(), + hex!("93ccd8c5f82374e0bef6562e16576f742d79b6f400e3485ef36e148088b61fbd882c3d2bb38ab0b43fa1dac77f31d543").into(), + hex!("81522576ae4ec9358f1a16934cd1c1116de609634e68f552924a972101eb7215f037ab8e0582d7b13541537d55554d31").into(), + hex!("aad60e58a19598c5013b37e2e4adc6721eaa7e6e184960d1dc4e6f012246abbb58a047c0679064d5eaaaaff02de881e5").into(), + hex!("b4f034f2b53ff9989e8a0f12c1484c58ed7942432a429af58a6659feaf23f7d2bf20ff7b9a7e0a28a2e09c9a730681d8").into(), + hex!("88b2c68b425269850c1a4f4608aca194da5c641adeb99e2f7fb92e34b8245dff066e73bde072be60f7f2c3d3d13de3b6").into(), + hex!("a749ab53fc2662a0796489be84fcfa59bb723ff748bd8980df0cb4b3d1e2943845b0d7c67576fa0a33c8b0ff8a86932d").into(), + hex!("abd7248ae069d3a3a45b0ef4dd5d7d54b62994e578ea20bdd3b7876596673953b94c5b109a6e4b953b517544b915368f").into(), + hex!("a49da42c27d019a21cc6489ada7b712b98c4ede28ba25dbcfa916acef48446a2baf73e03a48be763378a09774d4a03fc").into(), + hex!("b3c36fa39f668bbc3fec028875a820057dbf96f727bb423280da96d5d50e885d23bc23fb73457bf79089691ce7663a7b").into(), + hex!("8dca376df4847cb8fc2e54a31894c820860c30b5e123b76670a37435e950f53312f089a8e9bd713f68f59fd1bf09202f").into(), + hex!("95d1f944b0c53eb3e9fcd5632713602bbb9195b87a172a370ae2df98504612a55f3968615a39b569ce6a0fe9fb559be7").into(), + hex!("8c9fefe233d0d657349b7efcdc368f5aaead27071d224af780874751e7d241f6b88f7650fbb4133043b24bbebc12aa48").into(), + hex!("a2ee6c29efa982e9b9abd3c5e4f14b99d5d0369d7bfc3c8edae1ab927398dc8a147a89e127b3324d7f4e3a7494c5d811").into(), + hex!("b7ea5e0d3cfcf0570204b0371d69df1ab8f1fdc4e58688ecd2b884399644f7d318d660c23bd4d6d60d44a43aa9cf656d").into(), + hex!("a07826925f401a7b4222d869bb8794b5714ef2fc66fba2b1170fcac98bed4ba85d976cf9ee268be8a349ae99e17ac075").into(), + hex!("b0a47515752c15e4dbeaf9ee27fab3b5c0db82f5c685e8f716fd7d8764164944340430fe3db1a5679e6ffea5a16dd919").into(), + hex!("b7de6d7a4afb05984dce153e5570b104338265e45c8f0156f4d45c458f47add234a479e01c02d3c1817c170b5b65b100").into(), + hex!("acd4d1e11f81f4833353b09d4473ec8b15b8ff31dbf39e97654f5338a26c4020306d51018f1f4b9c4efdb92992408a6e").into(), + hex!("80e09f3bf3ea87d48e04b53d8f3b43b7e53d61f445f8c8a5a35472b84f6bb4f58f17d9832f5881bb44fc06156151e5c5").into(), + hex!("98d6d46f603afebcbc561c130e416d5a588a7e6c1f17f89ed6e30538b7f8dbf4b3c75b8a3331425c4ca21e03fe8b57f3").into(), + hex!("ab671eb947490c43fd05e42a787344b21af89babb705393c82748eaa0cfcf80bee498d275a1eaf1d647ca3b2923d76ea").into(), + hex!("80e1dbf3296bdfa98aeec1a7560682165d13bc628061bd3257f345aa1ba13f8bd1bea14f117af562be22118f5a8265af").into(), + hex!("aef456af90354ff88039d2dde02b0f5a6790aa762b23e0a9da8c6ec92c3b8b3320687bb21666608b4a22615843afd1ef").into(), + hex!("a5a07bf219432e9c80c38596c93560b49c7de287f31e30b7a06fcb4d15982add4a24085adbc5b753c462be989c64c96d").into(), + hex!("84d2eb008578aebd6f01254b7e46584c1524e6fd7a5a2ae5fa0ea560865ca50d52290cf2d12dd20b042f402e62181b4d").into(), + hex!("b8e5226ad3515627ae6840235f5f7b7ecd54e8f01079c324d126ec852f6665ebb77168b3f2b3b51580e04a6ff602d5b3").into(), + hex!("8c1de4264e04ff7e8282faf81c0bfb5943656451be52170211cb7adf4ff21bccbb789400735579c622f69982fcb8e9c6").into(), + hex!("90bfbe37ac3992432e68c95c0d4342a9712126d1f50089239c9f4f6c0c202b54334e08604d245b97dc8e8f6706f6992c").into(), + hex!("b0a771b9a0dd7e352d46c8efcc1834e610dd097711bf7117678a99d386890c93b9b901872d4dcacb6dcbcf3aea0883ea").into(), + hex!("a4eb903990bee2374b14fa66fc262d6821669537e9ba241c87b4b5c9e2b89b32fff4bfc28ab8471ef52e8eebc3e743d1").into(), + hex!("a6b74c706b33d3cae9b7adc5c7502ac98f7bf94a14d579d2bf77b613ae555634ad6fe631ba36dc14bf44526436355e24").into(), + hex!("8296f8caf58316af535def398a43357e48cb3b1e674b857eba1bd1b970da3dd045e22fe6d17dee4e9117f62ece3ec31c").into(), + hex!("a129c9cf33df42b5a98ad98be9d940207ae154c715d3bde701b7160dfe45304679fb0481a4f9dde242c22a9849fc2d9c").into(), + hex!("858b6f1bd3e68fc536bdf1f4bd96db032994eb76e71571e2d85af73b898478b82f9ab432732b0beebc0864ad8025ae33").into(), + hex!("8658a15df961c25648fd444bdf48a8f7bb382d9212c0c65d56bf9cdb61aab3bd86604c687fb682260dbc0ad2dc84bf01").into(), + hex!("a8d152e5d94b75cb9e249230db21af31de4d4f3d4ef60ccbf2212babf69aed2a38435a993ee2f13cca410ad55a4875ab").into(), + hex!("95757096c132e7f6c096d7b93a5a0d2594d5e609b9f13c4a9f878e95a389fa1a111b185dc1fd8f7d98b737dcf8d2af60").into(), + hex!("a22542a4a2ebde18cc6aa29d5dace8b4f6720703f519610dcf01e671018392aff15728e3764730840272c9cfb074b612").into(), + hex!("8f90e72a54e6894d511061957162e753010812346afd4d90cfedb678b99ba1aacf2b6bd0e49b4b0e684da8082a048619").into(), + hex!("b2affe048c187d311a185503d8958cacbe03796edf79bc32e8533941004d9178bd2e376e627e1ba61ed43850c0c455cf").into(), + hex!("b549d272a7f3180826a978d747507e4dc80d82784abb655cfcd3a69cc72e7d58c70febea1ce002a89852a8f934ea70fb").into(), + hex!("a9ef845ab489f61dbfdcd71abcc29fc38f3494a00243b9c20b9cd0dd9e8a0f23304df84939b9652cdf5542d9b3ee085e").into(), + hex!("aa744c552b5fc41e1ac6ca53184df87a1b7e54d73500751a6903674041f5f36af25711e7bc8a6fbba975dc247ddad52d").into(), + hex!("a802b9ffbd4f01b877791aba27da972be4bacacc64a1f45687be4af01b84bd4b83fe2ba1ea78e29d7683f6c777ab2543").into(), + hex!("b44d2d9510516c0abb4fc101241cf0e0223b179fb70686519628c27f0ef56381232961bc79a30f592ef093ffecbc4486").into(), + hex!("a684a09add047c0fe648d9c5618500d1816047168e055e8ac8c952c3544a462cc095b32fab07d939947a58fcb4ec7ba7").into(), + hex!("b5eb31e5cba0193e74968099ace5808dfc457c6f404f270fdc4949b60daa7607ba1811abab1bb19fccdad61d489b6657").into(), + hex!("a10f19657a9bc5a5c16ebab9f9fddc3f1d812749cd5d80cb331f51de651873ff899e0670f1b079b29a194572de387a17").into(), + hex!("af61f03e3ceef5bef36afa29ba2edc7a3b01ca26cec2589edbc9d124dd46e41410e0e3afbae959c83a6f839bbcf8049a").into(), + hex!("8e6bbfe492ecbbb8dc8889d3dcd7037a58db605bc6bb79131a72a9b9c1bad630e75f5e5e0c1bc407e73f3d13b116739f").into(), + hex!("983fc1ddf17f9756c9cecc00b39bb2ad432587a5c6d1c3296a383b9f539c9afe84c6c818447a709c0b686ba26ce5ea3e").into(), + hex!("8d52413f981bc611427ad0534d25e914113d0ebcd6960aab6421608bec6648b89ae4b2ca2153c57d3cf4f1f37212aa5c").into(), + hex!("ae075b66e5f211c2149c45b211d1297bbc1d9e6497cb3315363c492a9a51ae5b9d0a28bfecd755d68553736901ac6606").into(), + hex!("a02f7fec0661394399a82b2e3151009160b3f5392017ba579b301ed42c85100c295acbfed46b6c58a9d71796ed0930e6").into(), + hex!("a3a7196fecd25e9cc7cac79c35365676e48c7be1493df255676adff2209c0719f2190ceff3ce008d08efa07c244c11a6").into(), + hex!("a5fe3dfb5031517bb8db0d5ade1e9f438e84bcf23221de003b03d2a2f4ea97629e81c79abc3769bdb8c69a512c189b91").into(), + hex!("8cd9d7e953c7ae07ee785d68a999e702565960d376692d9ea468556ad141229b1f3bc97926818c078901f73ecc578e93").into(), + hex!("81d6fc2f01633e8eab3ba4d72588e14f45b00e68ab887bdd4ec5e8558965db21189310df973837106216777b07fc0805").into(), + hex!("b75ac3d5b3dad1edf40a9f6b5d8923a81872832eb3a38e515539cec871a353b07cb477f6d55cf15ba2815a70458aac32").into(), + hex!("94d3c9406dc6dd7241a726355643d706e46b35f1ffe4509ac43e97c64c07592821156ba02ec9a78978e66709995a0ac8").into(), + hex!("a3b109249ac2900806f0f39338da72d4f2cc6d1ac403b59834b46da5705cf436af8499fa83717f954edb32312397c8d9").into(), + hex!("8336744d8ef3a3bb3e9ed3d6b83e08cafffc76b7438adedd3a7358b32acec0e73a4635aa3166362ab4e158e68576255d").into(), + hex!("99b74edbac662fff69ba412de466a427a928ce2363c9e59dddd664f6fa50f2e1dd3d464701b01784aa224b3d96dedea3").into(), + hex!("b397ed7134f447d9bf1c511bf92f2d27d7b6d425b8b411365fbef696cff95c2175461cf5dd83d93bb700e50ebb99b949").into(), + hex!("a3e1fe11f38d3954a7f48c8b68ff956ea0b6f8a3e603fd258c9406ec2b685ff48241db5257179ea020a83c31dc963854").into(), + hex!("949cf015ce50e27cf5c2ff1b8e2e066679905ac91164e3423d3fb7e05c64429e77e432db0f549acb99f91fb134b6edad").into(), + hex!("a1c0c317e6e352e16e25c140820b927161ce5d2c4c2e10bca3057ba4d46b4f42ad7aba20de86dad9fc6368ea92695268").into(), + hex!("8d6e3df29419bd0da1deba52c1feebe37744108685b49ca703e1b76fb4d612e3959d3b60b822506e5c0aac50b2f5eee2").into(), + hex!("a15e0cb96a463ab81e661ca44c619b71a159680bbc04707ea5a5867ff38b15416e3abe55d2fabdab9aede1f157dd37e1").into(), + hex!("b6d6482ad7b9b412ffbefbbdcc28eb3d091b1291f54f77bdd53c4ac85f705c454940f466dc272dde7b03c26f0cd6ecb3").into(), + hex!("8391e3ad6ec2686bdc686671d579edac2d5efa8cf0923577df28fe0735e4d5103173d44452816e3c2b2a7fcc1fcc20d9").into(), + hex!("818202d7cb60e4148c71633ccbe1ce311de7b7ff93a1988e86ba29cc58037189f0f275b3323a6719dc9bdcfbc49c35c3").into(), + hex!("a7c0fcc422c6da878926cc6763ae6ec685a5d8fd1afe61269957be6bfb3f1705a8e4c6e6d85bd15636521f5a2ceb3a00").into(), + hex!("8f7bbaaac458bada6d852fe665c87c646133bab16c0d5136c3dc922095b9d647d93a9de7671cb7bfd4cbd138ae0709d1").into(), + hex!("b6e9fe9fa3d4c833c3beae7f798f30f07e3cdf6f6c8eb8e2b70cad51b37af2549dc9f2e7f97f194e5897d4dedb904a45").into(), + hex!("b455f751232de0a48440d09983f4f4718b6169907979c9f282acf7177ab5b1f338fe1f2acd8d0bee4b4aad61d0340839").into(), + hex!("8aadfcf3562f1c357068323352cb1745349a27a7362358d869e617c2410db747149b993ee9e881e252ecdd42fd75f351").into(), + hex!("91bf4c32fa8888d3829d3c33e12550d2ecb70762d5eeecd044d4902e4a7f8b7a2592cf6cb7736eb6bd9d312f85c2777c").into(), + hex!("859426bf6211e68924eefdb26cdc168ac0deab291aaff7036163997bff34d45809932f91e12d113784c05553ca773b15").into(), + hex!("81730b4bc5f755e5b99c321a6996c65e57ea2ebe6c0e4e404ed30920194fd76db65304635ad054a8b25bfd982cead47a").into(), + hex!("b26f5ed09f7d5bb640ec94ddd1df0b76466f69a943b4699f53d45296d5d6b8010bb61477539bc377d1a673d89074d22f").into(), + hex!("aa65c11071be23c9bddaa5203f3166e5cf043efe5fb8f4b26f8a9cabe71db701a450e79eb001c401da5752755d9cf1af").into(), + hex!("a019370ca799c2c98a605850910cf43531bfb616393039fdfc370848feedd3339b2427b750ccc91952b03a09f690e9ed").into(), + hex!("8f84cba7ceb7652023fc8ebde4b00ecde1f550935bab12feb630d6f49517b4148f3cde184bf55d4f6ec99a849fc6f862").into(), + hex!("838733220d1559c800cf1714db8a43a67a0c0d1d3a9fc1e2cdcf615d20406501e5146fe8b59bf64f4c5daa1a6d74f15c").into(), + hex!("9708cfcc9ff95cf23f544119e17518a338575018f153b1ef50118da0681304919a226b2089a417c2ab7b4320dffafc2a").into(), + hex!("a988cfed9f481bc98beb5fc188ed3f6893a3ebba27c3ebace669792f6abf0997727023c3b6930a6421224f5b257b8b49").into(), + hex!("812d3ded3a3c9e58eecf13a29bb4cc13b01b2a0af322423a29bb0e4f6d9021d1d87ac4af7a2a6b88d34f44a8bc1b3c55").into(), + hex!("b2baa7eba496ac4ef60ad8ef27a9677f9507820d95a1c572d322621c4d0226b36146bfc3a9ca1645d123acbd945de3f4").into(), + hex!("89ab1e5c2565f154f92c9b3554160832d176613f1a2f872b6ed62ed925a33fb0b40b71b7443eaaa15099ab24693c8d13").into(), + hex!("8982534f2c343dda20cccf5a9c8bf98240bba5f4e8eb2206e63a1847097deadb6bf0d24b358014d564c5ef1d0448c43e").into(), + hex!("a1e47798a782a024da340d6d6a1b1e5e15a0f2d8668adf349ca375086964414a563cc1eea3226ae637f87e78c0a630b3").into(), + hex!("847b58626f306ef2d785e3fe1b6515f98d9f72037eea0604d92e891a0219142fec485323bec4e93a4ee132af61026b80").into(), + hex!("8368a0f17c8427beb71dbf11a09a2fe8495a33f08c29c74a9a996a88aa01c0a09f9555abeb1ef1592cab99a9e05875cf").into(), + hex!("b38e558a5e62ad196be361651264f5c28ced6ab7c2229d7e33fb04b7f4e441e9dcb82b463b118e73e05055dcc9ce64b6").into(), + hex!("8018499ef720e28759133033833edfe17ed23e42f99058bb79fe844ddee823cfdc43916be2dc9724d18f9726e6f1b409").into(), + hex!("aa9b9cc039d147677aedd1e47ad9013fcc0da0164070ff7305b18e5786c7fac0471368637a3adbb78f3af174a5c1592a").into(), + hex!("a5c0e42851b769d2d822e39222e708068455aae3bdf782975b59d3201e67a58fd66e16d380558bf2086bcab890a92dd5").into(), + hex!("af3f765fd293c253072b33a780ed68933f78d7e079d9a2079b6232755bedf6ebcbce9ba65c01f695602fa8ee17899867").into(), + hex!("8a0192ef0903d7a5ed2e5614a715901f2554b324ee72390974dc90727ff08dafa580041a21a8e6c48a3e08e1b042afab").into(), + hex!("907c827a4fb5f698bf0e6f10ca07741c5b8e3ecb26aa53f938ba34ceb50c01be80c4afc5ac4358a5fda88eadea0cbe73").into(), + hex!("a35ee5c2d7800489723c78008b495e1742f0542dbb487172ef438f60424c81aa41c2397095821248066140662133f6f4").into(), + hex!("b1925ee53c9228cf80e2f5ac0117008a91e98d878f69bf03d00d873ef45f4351cb6988772d89d4ccddb40778d11e0dd6").into(), + hex!("95aafa379cc6a2b4bdd0cad30b7f0a47839952af41f584219ec201c6c4d54610eb2c04b67b29080acb8cecc5e7543fbc").into(), + hex!("8f44c43b80a3c5f488118859fab054745cfe5b0824821944b82fcf870fda6d93489ea9ca4220c24db2f4ad09c6080cb7").into(), + hex!("af861bb21f84c3e7cab55370839d18ac24c475a9e833607fcd7e65c773ee9d64bea203ee9e8fd9d337f1cd28d5ca0d90").into(), + hex!("8f6fde2ebbd7682c69026069cfe93aa5410071f05de9ccd7070c8c3299a6539b39b3798f01a0b4e9b1330510bdb51de7").into(), + hex!("a35d9d6d5dd5428cce7616842203b5fa3721cb4b20f50c0113f138604954fe0cf214ca3d065b578f921054b9efe823df").into(), + hex!("8d562d6c0e0d8325032e1fbf836022c82a8f600a6fbb56c553ee5d1fac0f052c7ce2504c0fd48c9fa6494a6bff63c9fc").into(), + hex!("b02ce594310f1eb8acc92bb80de524a43e663e12fb64fc28291ff207f9d8ae761631416410c3c8f4d6890b8b7e6ed24d").into(), + hex!("a258f8c0eff666c2bb70e505544c3d10d6b258310e4fb2206fd0999f69bfb739a1e232d1e810e7206f490f6c44f6934a").into(), + hex!("a8a77936ca91df3b2ee7394ea821f2bfe91c6ad8193f44651466c170b6ecca97ab356fa7d947ebb4b767e8967092f143").into(), + hex!("88ad79a0320a896415e15b827a89969b4590d4dfa269b662bdc8f4633618f67b249f7e35a35884b131772d08025bfc32").into(), + hex!("a3c66439724d737d20a640bceed8671b20cf6795671b6d442ed1ea5eda6723ae559396c24f44e982ba7751dcc6adef5c").into(), + hex!("8d0e6475acfa2b904e7d53bc7acd070a2ee4894ff5720a20e560e9ecb7872ea442a51cf2f2eee4bef66604a5c08ad9eb").into(), + hex!("804c021152c3304853941847e80480fdaceba3b9676fbe018268cf77d1a1856966c2f9686bb4d4aa0c4118a7e85f83cc").into(), + hex!("a6565a060dc98e2bfab26b59aff2e494777654015c3292653ecdcefbeeebd2ce9091a4f3d1da10f0a4061f81d721f6ec").into(), + hex!("8d5de60e934ea0471d9e0a46489f21e03abb9722f5b3633631a9a099b9524beac5d67716969c83d824498796d9c106b7").into(), + hex!("8c5a9f6eb0a3ea95e75362b06e5cd23968447a212cf22e1419c984d74432c51d290b717f80e8ed3e76b1232216f99758").into(), + hex!("918ebb73eef984d0ce28083306626d04817038056aab4a82ff9ac8176ffdfbf3173c0b05e936daf553248b323fe54f56").into(), + hex!("8f9aededb605db4e499d3c383b0984b1322007c748dea18dc2f1c73da104a5c0bece6bb41d83abdfac594954801b6b62").into(), + hex!("adb198f70a7f1969ed0958be4a9a60dcc1806bced79c63692b9aad6c5648ffea1fed60b24bf4b1862e817cf229e93e83").into(), + hex!("b118f77f99ac947df97e7682f0fb446175185b842380af4ee7394531e4f93002c72b41a57a7c1b923a4f24b10924c84f").into(), + hex!("944f722d9a4879b5997dc3a3b06299182d8f68d767229220a2c9e369c00539a7a076c95f998bea86595e8ec9f1b957bb").into(), + hex!("b7270f33011db1bad18e076a162d6e53d9123808609773eb46e3a4ac69c84c257407907bd5d05b6eb5e926b8d8c6d884").into(), + hex!("b09c0a505457c6b473fc7b2d634222905b36a6ffcc015dbdffa3bd62218c94e891615e77f28e6e18dd8474be8c156695").into(), + hex!("97d076617cf0a64ab3d1f030cfd72a303b6b252c0a7b96157ff7fc8af5970f00d14492c46e8f6f37caafe837d0dc95c7").into(), + hex!("b405520ef829a2a3b8947f1687ab56a7af4026c1a6f99f59aa192bc4f3b12a2de407862ff74ba1b2c51889b8d6b090c7").into(), + hex!("8bb045e7482b7abe670d72eb2f7afe4207b5a3d488364ff7bb4266f8784ea41893553a4bf7d01e78c99ed9008e2c13bb").into(), + hex!("b2df29442b469c8e9e85a03cb8ea6544598efe3e35109b14c8101a0d2da5837a0427d5559f4e48ae302dec73464fec04").into(), + hex!("99daf03fa434a482d9aa4d090884c99b7208c1f5380b9acbf304e1bc33d3d6902afa5d248d20ccf03795e26901356ede").into(), + hex!("b60df25a7ac1ad14aef7e8809c4bfc190b715f94f14b0534cc2e4015ff6c322883cbdc5309e05d67dca4bc641c69725a").into(), + hex!("b46a818f3e492e231d8fa8de8848c16f0d648a2e0d1c816adf9306a8596fdf45922e59cbf745430570a19e54f45e28f7").into(), + hex!("b3ca2ab7d64b71e40693bd3e2288a1f78741a139403c783d259cb9dc9c29f16c00796b6302cdcea4a4314e132b4f9d1c").into(), + hex!("af3d3dffbe55842dfb4417295a6ed1a82d26a579199494b305445215045785759be4cb57dc870c7ddaffbc101a854a92").into(), + hex!("b21785008910a949804d1291e7533752641d31beae3cb518806488f81d58c38a5efe5ed9534ac692e68c3121e2f9d97d").into(), + hex!("ab7eff4ef8696db334bce564bc273af0412bb4de547056326dff2037e1eca7abde039a51953948dd61d3d15925cd92f6").into(), + hex!("8bb4d08318386c91a0136d980a42da18c05743a5c52a861ce52a436e66a8ebe472dac7f7461db32ea5da59a23e9bd6c9").into(), + hex!("a1c84730a5c41dcab9a5ef9e1508a48213dbc69b00c8f814baf3f5e676355fc0b432d58a23ad542b55b527a3909b3af6").into(), + hex!("948f808c6b8e3e109a999657ef966e1e02c96a7aae6eecaf912344e1c7bf7ea51c911cecd3cea2b41ff55acc31df9454").into(), + hex!("8d264fbfeeebb6c4df37ff02224e75e245e508f53fb3446192cd786ecf10d0f704c4fc2e53e7f7318ae1407e46fc0fb8").into(), + hex!("8d47a7c2c62b459b91e8f67e9841b34a282ceb11e2c4b0549883b627c8526d9e0ebd7333ba70630bc0ec2478114b6ae8").into(), + hex!("a4348ad30c12bb7dd03dd014cca599c3499ddf348e7795b0392a18f998289979478374e374a8297b5b6c427441e2b5af").into(), + hex!("92ec1aeb2aa24c51cd5f724972c8b6095e77b237d83f93ed34ca0bc91a1dbf1ad95adccc59e0f0abbfef33f331f3298c").into(), + hex!("941f73b2138b4347ecafcc7b8c3d03f2a54dc49f580394ed08f22b0878ee7cb63d42978f1d320c09e7dbc67648c06f8c").into(), + hex!("a308ed8737b3a9346ff20dc9f112efccc193472e6fde6aa218ceae11e288bbd2c35fa45c1d8bb238696a96767cd68b46").into(), + hex!("8eb03001ac9e22c6956a682ed458e650785c36d23ddbcd51ac4d9cc991325c02519ff1958987a08eb29ff56ff6e2c293").into(), + hex!("80637db55287f891baa0e865d2423191b9a575620bc4493ea76166d47b99fd89ad8625c21f446b01e3ae17292c78f7ef").into(), + hex!("a5b3da08aad945effdb645c797a0a8bfa828c9d658df2783a214597acebda3ffc07ee48d0ce1147d77540b557d9ada91").into(), + hex!("8d5e0b8cde1f62cc8f15d9f596e31de09c221da91b10335b92ef1155802e742442def161223333573158723f3408bbd3").into(), + hex!("931923f0c1f75a197e6244d67525b524ceb07510a6aae8cb3d56167cc1aacc76d26fadfa1bdfc55d8439c6ee4d4d8174").into(), + hex!("963a298fc8876b702424a697929c7a1938d298075e38b616c8711f1c7116f74868113a7617e0b4783fc00f88c614e72d").into(), + hex!("91ead7dacf43905eb5d4b179af29f945479ed074126bad3b5a2bbc1663af5f664fe53a36684e9389ab5819e53f1344fc").into(), + hex!("b8a6c999068c13fb71a99d75eabadf7edd2d32e28607baf001a0aeec412fdd3575602c68d3feb4d743b90396705e37f3").into(), + hex!("938bbaa0ba14597067ff4c0a7cfc1529c44160d6f61cfad12246526d84fb7a1ba964d3bbb065a348cf7a98356ee15234").into(), + hex!("80e44d3577f12cabaed7074feeb57162ff80b61f86cce8f41d1d1250bc455070b09f6ea9d0c263b7b4824701480f4c14").into(), + hex!("8d74f4c192561ce3acf87ffadc523294197831f2c9ff764734baa61cbad179f8c59ef81c437faaf0480f2b1f0ba1d4c8").into(), + hex!("a0133deca5ae8f1100df8db69920b2d0c31aa21bd3849dbaf4c264eaeaec8937ab8f982770ce1ea17e0e258910a56d02").into(), + hex!("b6a25d493d708b035b853f1f7a6628d8e0b205d2678293f763d7ea4da11d298539533b22b43ed2e5f708648556f3094e").into(), + hex!("a58c3a4ba86d0d6b81c8411bb73a528b4f3bc2debac0e0208f788c080a3a96541d57c927143c165f595070afe14b0517").into(), + hex!("a52c15840b89d92897d1e140b2b8468a88886c5e1092861e598b3a433b340ded5b35b3d632a9879820fd56f20ca3a68b").into(), + hex!("8c122bea78deee98f00a86184ded61c10c97335bd672dadddc8224a1da21a325e221f8a7cfd4e723608ebcd85a2f19fe").into(), + hex!("87a51e0011dd0488009baac9c611fbde01878f9cf1584ea407599742bb32ef10586d9040dae3e9800a125de54f80c047").into(), + hex!("98181e9291622f3f3f72937c3828cee9a1661ca522250dfbbe1c39cda23b23be5b6e970faf400c6c7f15c9ca1d563868").into(), + hex!("b01a30d439def99e676c097e5f4b2aa249aa4d184eaace81819a698cb37d33f5a24089339916ee0acb539f0e62936d83").into(), + hex!("830e70476c6093d8b9c621ddf0468a7890942589cae744300416639a8b3bc59a57a7e1150b8207b6ab83dafcc5b65d3c").into(), + hex!("83ca733849830cb8fc2ef469e7e464fd94def561ce49ff0aa352a6ecd0e52c7aefcd69ab59f3d1ed2d5b8536d0a7895d").into(), + hex!("b76cb8cb446eb3cb4f682a5cd884f6c93086a8bf626c5b5c557a06499de9c13315618d48a0c5693512a3dc143a799c07").into(), + hex!("8b027c14affe47f83ee59b504d83b2fd2d9303de2c03ee59d169bb199d9f4bd6533d7f8c812dd7a6f1e8155e3e185689").into(), + hex!("8e6b888197010ebadd216da35b9716daa8675d93b3c33a96a19fd9ca42624f6b430b2ff115cd0f5b717341605dda24bf").into(), + hex!("b6652440bd01316523feefceb460158cd9ba268dd8dbe860a0271f0176230f057767597e4197885ba907318ca202ba06").into(), + hex!("a0b3dff15982a38a2f56d8c6cfc5c5543c045bf2db24571d23387ccab42abe2756f34d5f0bf6a426bbad3c358b8bdb00").into(), + hex!("a8b593de2c6c90392325b2d7a6cb3f54ec441b33ed584076cc9da4ec6012e3aaf02cec64cc1fd222df32bf1c452cc024").into(), + hex!("96b478b1e5e49d4ea3fd97c4846ae0f781dcc9f9ff61ee022ca92c3d8dfba89c513c46e8bb38b73e6b678a79b9b12177").into(), + hex!("946d585d7aa452d37a8c89d404757c3cce2adf2410e18613483c19199abd88f7a12e206f87a43f6009e42f4e31ed20c0").into(), + hex!("8c432e044af778fb5e5e5677dbd29cd52d6574a66b09b0cd6e2a5812e71c91559c3f257587bfc557b4b072a822973a60").into(), + hex!("ad2cdae4ce412c92c6d0e6d7401639eecb9e31de949b5e6c09941aeafb89753a00ea1eb79fa70b54699acbfa31eda6b7").into(), + hex!("b504cb87a024fd71b7ee7bed2833115567461d1ae8902cccd26809005c4a56078617ec5d3fa5b29a1c5954adc3867a26").into(), + hex!("b8876bda1e709ab16e1347a1107852a7898a334a84af978de39920790b4d82eb0739cbfc34da1c7154dd6e9f7674759c").into(), + hex!("973dcf44ab60f55f5d10a8753ea16db9faedd839466a130729538f3a0724f00f74b3ca1de16987d7c6e24e9467f62bc7").into(), + hex!("94df5fe87661101a89b49091a3d4de89331cdbd88531ebb08a95f2629886ee53b3dcbcc26bb6bc68b443303d8d397141").into(), + hex!("a92beb343caf6a945990adcf84302c55d1fccdef96c34a21f2c00d3e206a9b2c6c6b412f66e5d4fafe26ef6446cde705").into(), + hex!("b298aa927713c86adfe0de1a8d6f4083b718c8be27156da9fd11abd8edb3a54a926ad487801eb39cfc9363a0a3be0d44").into(), + hex!("b34d4d2e15079e7e80fdba30cddf4fc0e6c9a61f7ab06a6ea0a4e55fd5bf632c6d72e021d6264d935439d321de883bb6").into(), + hex!("b4a86fb5b0049718caead1bc036833a2caeb88e1afadbbbcb0cd021d95e1f33fcc916f0b97fc1b9226c37050e3463796").into(), + hex!("b6cec65e5268818c82c0a4a029b02f8d23de98b68730a445119fee670118eb34027c23c987fac950f9b0151631328a4e").into(), + hex!("880b4ef2b278e1b2cccf36a3b5b7fbce94f106ed9fa2820cb9099a7a540a57e9fdeef5c0fb0a743049828fc2b8c46163").into(), + hex!("ab2053c376c6bd113b89fdb2ae3b8401aa891135345885730c61cac7813f69ea7d906c531be752e28657f73af92d1f4e").into(), + hex!("8fa2d7b22af8e6b82679ebdfa13efdcb34289a554653ea6c1b16efb9f957f7fe64df787e7b03d8cdc8a732b91c916bd1").into(), + hex!("8e825c03c8409a3302266dc5f47fbfc381dfbafbadc37bd8d40f079ca8963d4c5ae6ef0d0ba6aef2d4688736f5f6bb45").into(), + hex!("a40ef3d2291d8782540961ce285054678b3d322d3cf7fc154207228c290708b1abfc37a4d7762dab3dfea582a112444a").into(), + hex!("8dbe8fcbcc414eb352245c52549973f73d987012de9d5f2b2f55dfdc43cf8cc9ea6b147abf149817f80f9e15aea566c6").into(), + hex!("a7e8775e04214e3b9898ffb9625dc8bcd1b683e333acdceddb8ca6db241df08a7b80e9d476a711b8b7d66aefca81e9cd").into(), + hex!("8b6ed54668f78a4a7624683b9bf3abf2bb0b6dccffccd8c0967df6297dadaf51732800fb9832b069437a6bf82ed7e6ae").into(), + hex!("9437ce85146202d3815df7f341a182678665dfb74b96006dc9d6acc16110d00b4a02717b702a765566457710ff5a7280").into(), + hex!("86a790072efa2cafa97be4b6b31f8c533f3b20cf3922fc0285fd403da436e4c49c65c5f08d77bfe823526c67bb58fab6").into(), + hex!("8ee8873de7cd28a54ba2c63a80b63399effed76b154e96ed26e7c0668b9f2476e298688b6a00c4b2ab9d020a897695d7").into(), + hex!("975c3261f0f32d59473e588f89593be38f5694cfa09394a861e4330b7800fb2528ea832106a928c54c76a303d49140e2").into(), + hex!("b5222582ed6604b9856a48039bd643340f4bf1bf0fc805e8453a9eb7630d6cea1452d28536706d6fa3ec16617617991c").into(), + hex!("b75c28941ee3f91b3535b4eaa0fb17b59ca65b5256601a1f6d0cf2bb4d66837fd16e51d6942856679012a5730a66e519").into(), + hex!("97b510f9f46bdf77a002b2403d8e42b6d6ad5329ea080940844429763ad3efd592652789c8d3d4fac0903c705f533cf7").into(), + hex!("a3fd9d8bbdc98394883022299fd9793e0c4f374d8e40d6ce89b2869d3173cb6a5476371d6095dad068ff217729f60af4").into(), + hex!("a57d5de556853484b1d88808d2529450238bc467376ded84cfd7b4a1ba258f6d43b5958220f962c57b033abcef1d5158").into(), + hex!("8465bd8be9bd9c2c6116d4ae44ec6618c109cb9aaee2d241e7a6ed906d398ef15a6fc18bc8b1d3398184241405954bba").into(), + hex!("ab1cc44983e46a6ea2430aa6616ab28614f43624665e3e6ae31a9357c0c5434f34e56c720906e184327693cc4ebe1fa2").into(), + hex!("aafe14dd3b680f096010788226d8413ca628feedad79a2bc78cb04d47c6ad910f7f46ca87b8f8281744625d8f42d5eea").into(), + hex!("86a533b02ae929f67c301649a2d58651b98cdffe731b63fa32aa1013c271634bbb088c0d02865913c11bbb1bf57c0e12").into(), + hex!("b28df3e04bde4ec373171401dbd0546f4cb6fa8e9a4a8019aadc653d4e05e0b5b9a64417715dd87f6df9e7b3145f6659").into(), + hex!("ac63fc758c1a3bc5cbff0f5e0b5a07a5aa801363b129d4e0360165c7dc1057ec37b0d808e9fd6b179e2c1e66bbc6090e").into(), + hex!("93f941b4fe6c05621e7a651b87669eefd60b6e8a4a8e630a51fa3fee27417b9eebce39f80a5bade9ca779133ad8388f6").into(), + hex!("96d7a69eaf2761bf0e5ebcd607b134d5dedba8e262ca1d6d3e8fbf23e6419a8ce1bbe4cd23b9e4b5f80db54a802a9795").into(), + hex!("8b62902fb2855300580e94830a4bc825d997ede33bf356fe3b7c08d6a8bd85a37879433fc6bee58f9b44ca280f4e8dfd").into(), + hex!("b043156fcd02b75dbe940c763fa8e8a7c7f6d74c1d5395db5ce544af3b6097eab61686950535a810aa95889ced12f74d").into(), + hex!("8614a7599c8d97aa9ca63b876f677977cf0daa969ff2a9a153f297a4a46e08fa5d91492995de94dc32cf009ce6bb5b5f").into(), + hex!("81351fd284d6d07092875f366bc5e53bfd7944b81eece85eab71a00443d1d2a9fc0337aaf34c980f6778dd211caa9f64").into(), + hex!("8c722aaf5d5dad1845056bf5e56dbff0f8b501f4846610f99da01130a49c96db9962bfd9be20670658cf276cc308be08").into(), + hex!("8effe3fb27c9f76bbd78687b743b52e6f3330eddc81bc9006ca81fd640f149d73630af578694f4530833c2151522dcc1").into(), + hex!("a3d327f48eb34998a3b19a745bca3fade6a71360022c9180efb60d5a6f4126c3f4dfa498f45b9a626ca567fdd66ffbff").into(), + hex!("a59a59db246f981e9c8e54aba52898c714d9787fef8969a6d8677fe6dec82950ff22a1364393b579f3e596cdf5bcd7b1").into(), + hex!("a15ebe9ab6de62a4d1ff30b7fc58acfb14ea54d7fa513cbcb045af3070db22bf9c1e987fa26c0c54356b9e38fa412626").into(), + hex!("b58396bce7d32ba6c70adbd37156d859e153c1932d2b0c7c874a1182ba831439e80d6fc6d7d88a870e193f515aef2264").into(), + hex!("b666dae42ea858c9b7d903ea3ca5279f619c71ac6e3fda7469e2bbba08c7e8e12d6a3c35ff2c6383673b1b7c21db5e0e").into(), + hex!("8eaaa21c8955f15bbcfd5756421a045e7b4825576379cc6229fe9751f7a7738b90be19ba52261db01c1e13af955675b0").into(), + hex!("8027bc62b59f9f15613e38da74ccc71fc3eaee26f096d187c613068195ce6eb64176013f2d86b00c4b0b6a7c11b9a9e5").into(), + hex!("8275eb1a7356f403d4e67a5a70d49e0e1ad13f368ab12527f8a84e71944f71dd0d725352157dbf09732160ec99f7b3b0").into(), + hex!("b8c41c09c228da62a548e49cfa107630166ac5c1469abf6d8aab55938ed1d142d5ddbc4f1043eed9496e9002cac99945").into(), + hex!("912750d2f1b21756662a400236f797b8ba76c73e5af95941a8c6ef9427838c4826715c80942cf8cb7ed01566bc490754").into(), + hex!("862af7dbb38ad7293a4e598cb52a8ac84dacee3d9bf007b5cb6a18a1acead0aa33f6dba796ce630e632c97aeb7100d68").into(), + hex!("890def696fc04bbb9e9ed87a2a4965b896a9ae127bc0e1cc515549b88ddbcbc02647e983561cab691f7d25cf7c7eb254").into(), + hex!("b835ffaf54c8b878d3c4262ca2bf5e6be2c691adced622b35d998ed72e1467ba907f4fde8d64ce43b43a8196f48e55db").into(), + hex!("a6d7e65bf9f889532090ae4f9067bb63f15b21f05f22c2540ff1bb5b0b5d98f205e150b1b1690e9aa13d0dee37222143").into(), + hex!("8ebfbcaccddd2489c4a29a374a2babc26987c3312607eadb2c4b0a53a17de97107c54eab34def09144b3098c082c286b").into(), + hex!("900b9972180a2c8753f5ff49fdd2cfe18c700d9927b3c3e16deb6376ad6ee665c698be72d4837b94911a0b4c183cb140").into(), + hex!("aa9679c01ecf1f1452c54688e01cb25bf157bde6b09b1ed460b8c175d65eba439c7ad4b7c1d72415f5622f3fbc068dc8").into(), + hex!("887a4277ee8754733f3692a90416eeac1ebee52ff23173a827f0ba569bd84efd806eb9139049f66cc577e370d3f0962d").into(), + hex!("951b27456e2af80436608aadec54ebd03bda37fa58452631da63bc5ff3eecb5ffb73d356b19f6c9c4225fcb0da8fda20").into(), + hex!("9104b5af82dbca914370eadb5518b26bee7ed7edeca74b741585ba8b249204e2c998bd47a02cef4335e236f8efafef94").into(), + hex!("8757e9a6a2dac742ab66011c53fa76edb5ebc3c2fbd9a7265529a3e5608b5c24b4482fed095725e9b8fed5a8319c17a4").into(), + hex!("a7acf82999de75f231fd80770bcb0f4c720d6b1e4a2558fa1ce854382fda92beb89fea5b5d229dad85fafee7a9e98329").into(), + hex!("8fb74891a8642f25a55b5eda5818367aac2fdf9663ad1e3dbc0166b484c0cda581b243cc75131167f1afa9caaf6705a0").into(), + hex!("897d7a19b70dcef1af006df3365981d73068c81f18017f32fb9966599481496efd5f6caceef943b31c52750c46d9590d").into(), + hex!("87ac804ccfe7f1fa156b8666664a397236832569f8945e11d4688a9e43ada4d4104efb3fda750f48ef655a29357c5e7d").into(), + hex!("af18cf1e3d094b4d8423da072f98b3023d296f6a1f2a35d500f02bde522bb81dc65e9741c5bc74f7d5613bd78ce6bc03").into(), + hex!("9752561179783f336937757b619b2fdcb9dfce05aa3c4fce6d582dc966182eb85ab4ccb63e7e1736a7c5fad9d33cccd2").into(), + hex!("89e19b665ce7f6617884afaf854e88bb7b501ecdd195a5662c79802d721f5340eca8c48341ad1d6c78f519f82e5a9836").into(), + hex!("94402d05dbe02a7505da715c5b26438880d086e3130dce7d6c59a9cca1943fe88c44771619303ec71736774b3cc5b1f6").into(), + hex!("a76adeddf2454d131c91d5e2e3a464ef5d3c40ee6a2ab95e70ef2e49e0920d24f9b09276250ed7b29851affbdbc7885a").into(), + hex!("8934e9a3feababa12ed142daa30e91bd6d28b432d182ac625501fe1dc82f973c67f0fe82d39c9b1da3613bb8bfe2f77b").into(), + hex!("a5c11337eb91ce0e9b6d61bbdadea0a063beee1bc471cc02dc1d81c5dd2095315c400cbc6c33d23c77e98bba6bdf5439").into(), + hex!("92d00e64ed711951aeb852908aeb6fd379ea516872dd512384b1e773ef078e52e6d618beb202d437d2a46bcb78087f7a").into(), + hex!("97f1a7370b4f5acf83b466f519da361c366915f560385dd7eff9d53700ad81b25c9862bc71d35428e82372a5ae555ea0").into(), + hex!("95614544f65808f096c8297d7cf45b274fc9b2b1bd63f8c3a95d84393f1d0784d18cacb59a7ddd2caf2764b675fba272").into(), + hex!("8d474636a638e7b398566a39b3f939a314f1cf88e64d81db0f556ca60951ec1dca1b93e3906a6654ed9ba06f2c31d4ea").into(), + hex!("b87e5f481b938ac8a481b775cc58be2a06604549e3c810fc4734bab76099e5c617f0243c4c140cb7dd6d36a6dc2286bf").into(), + hex!("806efb61d1c948efc10dbf9bef30197d1c269e5e7fcf20a84367b26223d33fade413a0bbf4e33f0d1f1a00967289015e").into(), + hex!("880b99e77a6efb26c0a69583abb8e1e09a5307ac037962ddf752407cacaf8f46b5a67faf9126bdbcb9b75abf854f1c89").into(), + hex!("82ffe4de0e474109c9d99ad861f90afd33c99eae86ea7930551be40f08f0a6b44cad094cdfc9ed7dd165065b390579d0").into(), + hex!("941cd102228aa81ef99506313a4492a17c506e7169808c6b14dd330164e9e8b71b757cbe6e1bb02184372a8c26f7ad1f").into(), + hex!("ae96dc808c316a677977831bad1e529ef965dadb5d6aea25ab008fe7bb1543e596e33052cfbe4279fa060201199d2c34").into(), + hex!("a2053719da2b7501dab42011ae144b3c8d72bd17493181bf3ae79a678068dc3ee2f19d29a60b5a323692c3f684f96392").into(), + hex!("b17171939519d90e243d41839c3c5ce7ac7e6a978e4a7e56b2c8e6a2b1b587c7eacea47f2e31a55d88555d252c810ebd").into(), + hex!("a958987c2b3c84df8176b600f5b75a8badef9653c71eff967e76648937def38826eaab4027a639f4f300b20019166250").into(), + hex!("854aafa329e2b2563355641eba95f2aba5b33d443ab16f5e342048f97d97c4e2812ff27c6f4180b8110272f3151be690").into(), + hex!("94d4a1e3a3d28a948f14d1507372701ac6fc884a4905405a63663e170831578a2719714ef56f920baa0ca27954823e39").into(), + hex!("826be957cf66db958028fa95655b54b2337f78fb6ef26bd29e2e3a64b130b90521333f31d132c04779e4b23a6b6cd951").into(), + hex!("8261f7e644b929d18197b3a5dcbba5897e03dea3f6270a7218119bd6ec3955591f369b693daff58133b62a07f4031394").into(), + hex!("84926cf2265981e5531d90d8f2da1041cb73bdb1a7e11eb8ab21dbe94fefad5bbd674f6cafbcaa597480567edf0b2029").into(), + hex!("8fb51e3ef3c1047ae7c527dc24dc8824b2655faff2c4c78da1fcedde48b531d19abaf517363bf30605a87336b8642073").into(), + hex!("8ba45888012549a343983c43cea12a0c268d2f7884fcf563d98e8c0e08686064a9231ae83680f225e46d021a4e7959bb").into(), + hex!("973ab82026d360e2cf5676d883906186bc61b43f60767ca58f11d0995e40780b163961e6e096299ccf1c86175203abde").into(), + hex!("b77416ea9a6b819e63ae427057d5741788bd6301b02d180083c7aa662200f5ebed14a486efae63c3de81572fe0d92a9c").into(), + hex!("820cc2ac3eed5bce7dc72df2aa3214e71690b91445d8bb1634c0488a671e3669028efbe1eae52f7132bde29b16a020b7").into(), + hex!("a6b434ac201b511dceeed63b731111d2b985934884f07d65c9d7642075b581604e8a66afc7164fbc0eb556282e8d83d2").into(), + hex!("b81821a79c9148b41d24d85dc997336a1e1719da0e31e42af30812b97a5af31708ca3e7bc2e803c3751cff23af5c509d").into(), + hex!("a013cc5e3fbb47951637426581c1d72764556798f93e413e1317849efd60f3ecb64c762f92544201eb5d6cfb68233050").into(), + hex!("b5f32034d0f66bcbccefe2a177a60f31132d98c0899aa1ffff5ebf807546ff3104103077b1435fa6587bfe3e67ac0266").into(), + hex!("86ca8ed7c475d33455fae4242b05b1b3576e6ec05ac512ca7d3f9c8d44376e909c734c25cd0e33f0f6b4857d40452024").into(), + hex!("b781956110d24e4510a8b5500b71529f8635aa419a009d314898e8c572a4f923ba643ae94bdfdf9224509177aa8e6b73").into(), + hex!("a3f9dcc48290883d233100b69404b0b05cf34df5f6e6f6833a17cc7b23a2612b85c39df03c1e6e3cd380f259402c6120").into(), + hex!("a104d4bad69f1720307ed12363d1ec97952acfe09d9e3650034c33f3f20c763271ebe0d5b50b1d3bd15c469f4573b09d").into(), + hex!("94bbc6b2742d21eff4fae77c720313015dd4bbcc5add8146bf1c4b89e32f6f5df46ca770e1f385fdd29dc5c7b9653361").into(), + hex!("951aa38464912a29df2101c60771d6de7fadb63f2db3f13527f8bdacb66e9e8a97aaac7b81b19e3d1025b54e2c8facff").into(), + hex!("919b5187af7dae210f151dc64a9cbd396d1ae04acadebf542a7123004efc7ce00d6e14c170d876fbc64dc1b5d141a5f4").into(), + hex!("88e1e459ee5aeb8b36ed004f6d03da296101106fbe1b18f9bbf63e92321db51670c34050fd3b7dc56a4bad76403823ee").into(), + hex!("86b3ec14a8ffb811a0ecc3771f600d8b08c098537d100fba66def19e7ee4d1c397a311977bf37e6cd2d47a8a2ee8c223").into(), + hex!("898c4873bd356ba8015f6f686d57088fa8f79f38a187a0ef177a6a5f2bc470f263454ee63d0863b62fca37e5a0292987").into(), + hex!("b471c72bd2971353f4b44248b8e6cf5316812861a88ccfc20fd0d89a5e010428c387228b2f6f14c12f79e31afc9d0753").into(), + hex!("8b7cb5b8de09a6dfceddcbaa498bc65f86297bcf95d107880c08854ed2289441a67721340285cfe1749c62e8ef0f3c58").into(), + hex!("983cb6bbfe83bce8326e699e83fca01ea2958c09808c703cac97a0ea777e5a5f3f5bba9169a47732de7459a3c7af47d2").into(), + hex!("8235a3f09078dd34ce2fc17cc625e061298713b113dda12d354b3d2ba80e11c443b1dd59c9eb5a29513a909645ae97d4").into(), + hex!("8bb51b380a8a52d61a94e7b382ff6ce601260fa9b8c5d616764a3df719b382ec43aec9266444a16951e102d8b1fb2f38").into(), + hex!("9579973ee2559da09b327c62b1cc0177f2859872885dca709e24dcfbb9bdf9224a6d26869aafce498f44c0e6bd8a996c").into(), + hex!("842ba3c847c99532bf3a9339380e84839326d39d404f9c2994821eaf265185c1ac87d3dc04a7f851df4961e540330323").into(), + hex!("99dad12f78e1a554f2163afc50aa26ee2a3067fc30f9c2382975d7da40c738313eaae7adbc2521f34c1c708f3a7475b7").into(), + hex!("b96e3ff8bdae47aa13067c29318b1e96a7fe3941869c17ce6662183b7b064bf261e1cea03e2a4643c993728a2606b5b5").into(), + hex!("955bc897171aa65d0159aa6e5d51855833f83d8bd5e65f93ad26c27781171783f3988a12bf987472edb39994bd071ea5").into(), + hex!("a59249e4dfb674dfdc648ae00b4226f85f8374076ecfccb43dfde2b9b299bb880943181e8b908ddeba2411843e288085").into(), + hex!("ac2955c1d48354e1f95f1b36e085b9ea9829e8de4f2a3e2418a403cb1286e2599ba00a6b82609dd489eda370218dcf4c").into(), + hex!("b2eedff11e346518fa54e161be1d45db77136b724d497e337a55edfc896417de3a180bf90dd5f9d92c19db48e8574760").into(), + hex!("976eb5543e043b88d87fda18634470911dfe0e0cabab874ca38c1009e64d43026d9637d39dcd777bc7f809bbfc3e2110").into(), + hex!("8ea5f88a79f4eb9e7c0b6b29f8ef2d1cc4c15ed0ed798ab11a13d28b17ab99278d16cd59c3fa8217776c6dfae3aedf88").into(), + hex!("b7f146a357e02a63cd79ca47bf93998b193ce1174446953f12fa751f85dc2a54c9ed00c01a9308509152b3bad21d7230").into(), + hex!("87fd7e26a0749350ebdcd7c5d30e4b969a76bda530c831262fc98b36be932a4d025310f695d5b210ead89ee70eb7e53b").into(), + hex!("b9445bafb56298082c43ccbdabac4b0bf5c2f0a60a3f9e65916af4108d773d62ffc898a35b0b8efb72ea846e214faa02").into(), + hex!("b106c6d13ca17a4c8ea599306e84918127cf2de21027ac3fe5a57d35cf6f3b1d7671c70b866f6e02168ae4e7adb56860").into(), + hex!("9276e8051bed8f5dbfc6b35765aac577dd9351d9d6ac1bb14496bd98091005b9a4737b213e347336413743f681f5043b").into(), + hex!("aefc682f8784b18d36202a069269be7dba8ab67ae3543838e6d473fbc5713d103abcc8da1729a288503b786baac182d3").into(), + hex!("97578474be98726192cb0eac3cb9195a54c7315e9c619d5c44c56b3f98671636c383416f73605d4ea7ca9fbeff8dd699").into(), + hex!("99c34f9bd0fcb18b3d931e562988cf91886a417f8678f22651bf3cf138df2bbec3f675de90f62dda769e0eda03d72b7e").into(), + hex!("a0047e03c89a95248543618e6b7ca2c7aad7acda3c9f85771ec5c93fa898c651e8b2ea3b6b799d8cd592290a986cdd7d").into(), + hex!("993726e0b1c2277b97b83c80192e14b67977bf21b6ebcde2bda30261aa1897251cd2e277cfcb6193517f1eb156d2fe86").into(), + hex!("974a5180e55eab23d4c973fbee6ad1010335161ecdb849fe6520b34c1f96530a4faff80bd738fe281019b79d968c472c").into(), + hex!("8f1d90034f998018c3f4b5947b40b139fcead2e40aa80fdec6a4337c60e9d5ff1923dda7f0b5b1731ff16f55027d41bf").into(), + hex!("a7d9ae9621dd1f3da3cd2d435e891cc3579c4c0d60d6a4565cac86c315cea21a9ad883559fe7b897ae6e05f1aa989ad9").into(), + hex!("800f6be579b31ea950a50be65f7de8f678b23b7466579c01ac26ebf9c19599fb2b446da40ad4fc92c6109fcd6793303f").into(), + hex!("86fa3d4b60e8282827115c50b1b49b29a371b52aa9c9b8f83cd5268b535859f86e1a60aade6bf4f52e234777bea30bda").into(), + hex!("a80ac2a197002879ef4db6e2b1e1b9c239e4f6c0f0abf1cc9b9b7bf3da7e078a21893c01eaaab236a7e8618ac146b4a6").into(), + hex!("b4bf70468eff528bf8815a8d07080a7e98d1b03da1b499573e0dbbd9846408654535657062e7a87a54773d5493fc5079").into(), + hex!("ae0e15a09238508b769de83b30582cc224b31cd854d04fdb7b8008d5d8d936dbdd3f4a70fff560a8be634c141772561b").into(), + hex!("936f7e20c96b97548fef667aa9fa9e6cfdc578f392774586abe124e7afc36be3a484735e88cc0d6de6d69cf4548b1227").into(), + hex!("8163eea18eacc062e71bb9f7406c58ebe1ce42a8b93656077dd781c2772e37775fe20e8d5b980dd52fdad98b72f10b71").into(), + hex!("86a6560763e95ba0b4c3aa16efd240b1873813386871681d075266511063b2f5077779a4fe49ffc35e1f320b613b8c94").into(), + hex!("b156d9d22722bb6e3b75b3b885b64642fa510ba7e6057657cd61bac43fb9c284d05bb09e2d4b78a2a4ddada85da9c702").into(), + hex!("9779ca2759dbed8081f0cbbfffcb3b842ba335e3ae48a60c5e5c77c7a2a0623e4c415ec3a023cc4e216885fcbac3ce52").into(), + hex!("b8137fd57ce7d3cfaf8bdbaa28704734d567d0e7a2d87fb84716722c524bb93acb2c1284249027f3c87bccc264c01f4e").into(), + hex!("8cf06b34e7021e9401eb705dde411ecf7e7e7185f8c0b0aeed949097df31812a9fdd4db7d18f9383a8a5a8d2d58fa176").into(), + hex!("8c65aa29a9ee9066b81cf24cf9e0beca3e8e8926e3df22d5ff1236297e158cc8bc7970a2c7016009cc4efa8f14b14347").into(), + hex!("ac7e49f2059e99ff65505742978f8d61a03f73f40141a2bd46fde5a2346f36ce5366e01ed7f0b7e807a5ce0730e9eaa9").into(), + hex!("a1c25eb9b73723982be78180770aa63c5f7b23c2e54a2ed7e75a860c4512d273008066f1124ac8a43c60fe1e2a8bf03c").into(), + hex!("9310722e360a5652737362f6b9cb6e9c3969a0c9bb79b488b3c7d19d9e8c42ebd841df346258ded2e393895c99b413cf").into(), + hex!("893272a63650b08e5b8f9b3f17f8547b456192ad649c168bafd7166b4c08c5adf795c508b88fd2425f7be8334592afb2").into(), + hex!("b576c49c2a7b7c3445bbf9ba8eac10e685cc3760d6819de43b7d1e20769772bcab9f557df96f28fd24409ac8c84d05c4").into(), + hex!("af17532b35bcb373ce1deebce1c84abe34f88a412082b97795b0c73570cb6b88ea4ba52e7f5eb5ca181277cdba7a2d6d").into(), + hex!("8b8813bd2c07001a4d745cd6d9491bc2c4a9177512459a75dc2a0fa989680d173de638f76f887de3303a266b1ede9480").into(), + hex!("ab73a043ccdfe63437a339e6ee96ef1241264e04dd4d917f6d6bc99396006de54e1e156d38596ba3d15cb1aaa329f8f5").into(), + hex!("b67146b202afec0132ac0070c005cf664081e860339f8f4d45ac3e630dda05560936e646673e652d08cecd8d18fc64da").into(), + hex!("a750404e9d4b1a48f767d2b6aa699200c92c3b8102597f8c5c1dbaaf08112a0587c05801dfebb3612fb6dfd76ddc9ccb").into(), + hex!("b0d4231814e40e53ab4eed8333d418a6e2e4bd3910148b610dec5f91961df1ad63f4661d533137a503d809ea1ad576fa").into(), + hex!("81fc724846b5781f3736795c32b217458bb29972af36cc4483dd98ab91680d3d9bc18842db2661487d3a85430dc9e326").into(), + hex!("a5cf6f4fd67aecb845eebc8d7304c98c69806d774d4c468350f7f82ff0f5baeecc56837705e39432a8d246aa2a7075ed").into(), + hex!("a71d2c8374776f773bad4de6edfc5f3ff1ea41f06eb807787d3fba5b1f0f741aae63503dbca533e7d4d7d46ab8e4988a").into(), + hex!("825359cfe68ad6a75578a94be6419179e0aa088170b6c20fc5c249dc3be7a260d687c93d8d8a343c7c72c2ed6a716de3").into(), + hex!("b6aeb7a9b934a54e811921494f271d5d717924c561cd7a23ab3ef3dd3e86184d211c53c418f0746cdb3a12a26a334fc8").into(), + hex!("8c6fc89428c74f0c025e980c5a1e576deadf8685f57136e50600175fa2d19389c853d532bb45a3e22b4a879fab1fcb0d").into(), + hex!("ae95ddcf3db88f6b107dcf5d8aa907b2035e0250f7d664027656146395a794349d08a6a306ce7317b728ca83f70f3eaf").into(), + hex!("8c03fb67dd8c11034bd03c74a53a3d55a75a5752ea390bd2e7f74090bf30c271541b83c984d495871d32c98018088939").into(), + hex!("b8d68610fdee190ec5a1f4be4c4f750b00ad78d3e9c96b576c6913eab9e7a81e1d6d6a675ee3c6efac5d02ed4b3c093a").into(), + hex!("87d4b20bbe2dcd4f65f4e1087f58532d5140b39a5288e1a63fc0b7e97a6a56946eafdd90ba09300c3d1fef6356ac6b7c").into(), + hex!("83e264b1d3d4622826ab98d06f28bbbd03014cc55a41aaf3f2a30eec50430877d62b28c9d6d4be98cb83e1e20f3b13db").into(), + hex!("97ffcbf88b668cde86b2839c7f14d19cb7f634a4cf05d977e65f3cd0e8051b2670e521ae74edc572d88201cff225e38a").into(), + hex!("91efdbcaad9931312d7c41d24de977f94d7f3f7b88090a1f72d9a097a1e30cc805c5ea16180f463022d9b26b8863f958").into(), + hex!("a4b507a4bc2bc424297bf8968bf385fae3acc686cff4b7933b4f5b6ef3149995393d5331dbac4b629e8adce01a91a4cc").into(), + hex!("a76a26c30d8abbbd4bf982bb8bd2066a2ec823a5eb6fbe37c664e67efbe2f72d8ce2d00223b900699149f8441bff5ada").into(), + hex!("b3a5497365bd40a81202b8a94a5e28a8a039cc2e639d73de289294cbda2c0e987c1f9468daba09ea4390f8e4e806f3c8").into(), + hex!("a09b2a07d861e01645accfb088f7f9ad524186bd439712775459a60f8a1fbbd43ee084e4d6e23ffce06daa189cd1e654").into(), + hex!("a41cf5d678a007044005d62f5368b55958b733e3fdde302ba699842b1c4ecc000036eda22174a8e0c6d3e7ef93663659").into(), + hex!("a698b04227e8593a6fed6a1f6f6d1eafe186b9e73f87e42e7997f264d97225165c3f76e929a3c562ec93ee2babe953ed").into(), + hex!("8bc66e370296649989a27117c17fbc705d5ac2bda37c5dad0e4990d44fcc40d3e1872945f8b11195538af97961b5c496").into(), + hex!("8bff10f91b8c0abb6c9542588da17fa0118ffda4c82626a754887e333d7d69661b3ae4e400da15c49565f8d10a77d0d7").into(), + hex!("ac715c7b3d794860a61d9c7bd224a2b14a6023f696afa30345aad2ce0a6ea6dbc142f34af1ffe7f783542851a28e8ece").into(), + hex!("91c5e0b9146fe5403fcc309b8c0eede5933b0ab1de71ab02fac6614753caac5d1097369bdeed3a101f62bbcae258e927").into(), + hex!("8553748da4e0b695967e843277d0f6efeb8ba24b44aa9fa3230f4b731caec6ed5e87d3a2fcd31d8ee206e2e4414d6cf4").into(), + hex!("ac722bd742374f925185ea7d4d62d7510b2d8a6ebf5c750af6ce83e2d8a28c95a3e298870ec8254ab2d1d0aa2a063c60").into(), + hex!("b083c4cefb555576bb37b71f30532822cb4b1e1998e35cb00ffb80ca14e2853193c16a6756417853d4a74d625744dd76").into(), + hex!("85745bd84c92ddfc55df11fe134cf70e3c340aa1c7cdd6188a03308cf3a840f4f19629f9730b2e6426424989ff03000d").into(), + hex!("845b4531dee808b583645f56fa98cbdecce3ea100db60524b64f68e29866173791f01137714f4dc7fb8612f7f7943263").into(), + hex!("93f03495d53c781be8b76e37e68b64aa260523004eff6455ddc8a8552af39854e5181f8c5365812b1f65926534fba5dd").into(), + hex!("801c126abff96fe9b042be8869d2907d0c6963a79901f9db46577a445418b7465a1f4b346933d433e539536a9a2df01c").into(), + hex!("952cf6782b0ad3e85625391cc5f486a16bb5b1f8ea20defcb6857bd7d068dcd2701bc7ed5c3b773a869180d9042f772b").into(), + hex!("b3b6eccb2ec8509b4eea8392877887180841ab5794c512b2447be5df7165466d7e293696deaabf063173e5f2238ce763").into(), + hex!("b63fd45023f850985813a3f54eceaccb523d98d4c2ba77310a21f396e19a47c4f655f906783b4891de32b61a05dc7933").into(), + hex!("a113b889be5dcc859a7f50421614a51516b3aadc60489a8c52f668e035c59d61640da74ba1a608856db4ff1fa1fe2dfd").into(), + hex!("87fec026beda4217b0a2014a2e86f5920e6113b54ac79ab727da2666f57ff8a9bc3a21b327ad7e091a07720a30c507c9").into(), + hex!("a3ee8fd53158dad3b6d9757033abf2f3d1d78a4da4022643920c233711ff5378ac4a94eadcaf0416fdcca525391d0c64").into(), + hex!("8d6bed5f6b3f47b1428f00c306df550784cd24212ebac7e6384a0b1226ab50129c0341d0a10d990bd59b229869e7665a").into(), + hex!("b549cef11bf7c8bcf4bb11e5cdf5a289fc4bf145826e96a446fb4c729a2c839a4d8d38629cc599eda7efa05f3cf3425b").into(), + hex!("982691766a549df56436acd0fe76da78132e027515f27174c10d117bfcc20ed73fc31f5465bd7a22a101094fe913e221").into(), + hex!("985af1d441b93fa2a86c86b6d7b70b16973d3971e4e89e093b65f0ae626d702202336869af8e3af3923e287547d5384b").into(), + hex!("994b7baecc8bb68d270a3a88c58e4054afdbd713b4472f9522b27c1762c637ef8f013d745ce9d1dc8fc4d986d4c9338c").into(), + hex!("827dabda84c7f7b1adc0f5ca0fccf0729e9d7f78e1ffa7c5e9c4f66610ff0ab776c880b00c77137cf7abe14df977febc").into(), + hex!("acd17cba1203748b55bd9d7b940a16bb7c02988c93007a80b87e0bdb049b91f5ecce577e3e4ea68a0abe998a72cd300d").into(), + hex!("989fa046d04b41fc95a04dabb7ab8b64e84afaa85c0aa49e1c6878d7b2814094402d62ae42dfbf3ac72e6770ee0926a8").into(), + hex!("99dc48a054f448792523dcdeec819e1b928b1bd66f60f457261f0554f8532eedd7152792df70ae5316ab2f9c02a57cdc").into(), + hex!("ab33c65587ecb3278325948c706aed26547e47ed2b4bc027e9119bb37bec67ddf5489fbc30304ef6c80699c10662d392").into(), + hex!("ae89e41d8cfbf26057a4078f8a5146978e658801b08814190cbce017d79beaeb71558231a72bde726fa592fb0828c01c").into(), + hex!("a9901df92e2d3abbb25f3bf4b913692c4cd57da327b01c8ee2362c02fbefcf66cdb792c17a81dcbde3c9b9dba313e4a1").into(), + hex!("8ee41011424da5e2ecea941cbf069ea32420749f2519434d3d8f9725ac789753404687a6745cffe4bd5dfc8fec71a719").into(), + hex!("8cfcdfa192b17321be4e447204e1a49ecaadca70a3b5dd96b0c70ab64d1a927d1f8c11a7e596367e5fa34e2307af86fc").into(), + hex!("b8a0003e949cf994b1bb25e270cb61358200c93b1c6f611a041cf8536e2e0de59342453c5a8d13c6d4cc95ed8ce058f3").into(), + hex!("adc806dfa5fbf8ce659aab56fe6cfe0b9162ddd5874b6dcf6d658bd2a626379baeb7df80d765846fa16ad6aad0320540").into(), + hex!("a83b036b01e12cadd7260b00a750093388666aff6d9b639e2ce7dfc771504ef8b2090da28ec4613988f2ec553d1d749e").into(), + hex!("825aca3d3dfa1d0b914e59fc3eeab6afcc5dc7e30fccd4879c592da4ea9a4e8a7a1057fc5b3faab12086e587126aa443").into(), + hex!("845a4a09941f48677e6c03699770f9a56ba72695089e432a6f232294dd8da6d34e394116a9a87f3b0902c78332af9439").into(), + hex!("b2f168afc35ed9b308ab86c8c4aaf1dcd6833ce09153bb5e124dad198b006e86a941832d387b1bd34b63c261c6b88678").into(), + hex!("a094cca9d120d92c0e92ce740bc774a89667c6f796b438b0d98df0b7aef0935d8c915d5b0dad4b53e383dc9f095c29fa").into(), + hex!("956ecb233b3529b2d9cb80ae49e48667f2a3120e4a0d7131d1e9ec36db3a59dc2ef2a579cbb99d6f14880ca83f02b64c").into(), + hex!("906cde18b34f777027d0c64b16c94c9d8f94250449d353e94972d42c94dd4d915aa1b6c73a581da2986e09f336af9673").into(), + hex!("824c8a1399ab199498f84e4baa49ff2c905cf94d6ac176e27ec5e2c7985140dbaa9cc6303d906a07ab5d8e19adf25d8a").into(), + hex!("889a5cf9315383bf64dfe88e562d772213c256b0eed15ce27c41c3767c048afe06410d7675e5d59a2302993e7dc45d83").into(), + hex!("95791fb6b08443445b8757906f3a2b1a8414a9016b5f8059c577752b701d6dc1fe9b784bac1fa57a1446b7adfd11c868").into(), + hex!("99049e9a23c59bb5e8df27976b9e09067d66e4a248926d28171d6c3fdd1ab338944a8b428b2eaae5e491932c68711c7c").into(), + hex!("95c810431c8d4af4aa2b889f9ab3d87892c65a3df793f2bfd35df5cfdb604ca0129010fa9f8acae594700bece707d67f").into(), + hex!("841d77b358c4567396925040dffe17b3b82c6f199285ac621b2a95aa401ddb2bc6f07ebd5fa500af01f64d3bb44de2df").into(), + hex!("90c402a39cd1237c1c91ff04548d6af806663cbc57ff338ed309419c44121108d1fbe23f3166f61e4ab7502e728e31fd").into(), + hex!("968d44188e2d9d1508b0659e96d6dabd0b46aa22df8d182e977c7f59e13aa05d5da09f293f14f6f2ee1b996071cd2f25").into(), + hex!("8ae9585caa3c73e679fe9b00f2c691732f7b7ca096e22d88c475a89d4d55cb9fba3cd0fe0cedd64ce75c591211664955").into(), + hex!("94b81d5ad72efb4dd60867e71afcd8e87e1f24bf958d42fc07db66f6185a1e610987ab9ceef63109a36fe5544a0cf826").into(), + hex!("8499a8c3d67d1f6eccf1c69274393dc498cff862ea8e6c11ffb8107ae190d258ddc1d294f2a8f050488df0212063ece2").into(), + hex!("921109a390e4d7fbc94dff3228db755f71cb00df70a1d48f92d1a6352f5169025bb68bcd04d96ac72f40000cc140f863").into(), + hex!("b464d763e5ef724ab7ee13a60015df5c9a7809a79188ff6a7e0d5e5400febd42ad7330406a59704a44a08f2289d659c8").into(), + hex!("96f1a36134e0d4137a7fe8bbb354f50aaa67f28f194ae2fdbe8be3eb24596678d8c9287765ee90c1f2778d0d607931e0").into(), + hex!("b031d93b8f119211af76cfafee7c157d3759b2167ee1495d79ad5f83647d38248b4345917309ef1a10ecaa579af34760").into(), + hex!("88a7dc337d89324f025f686f37d21240c7da9a1cb802259ea8d8a83e246dcc2adceca7ca3534bc7bf8f3ae1cbeafb5c0").into(), + hex!("b30e022b8a563655074e08e123b5f96956bbf0fe221cc629c5fedd2764a66b475916ceb98867f935b4a47212e53ae9f3").into(), + hex!("ab6e3180dae399d41243f23545e5e6d118844f9b8edba502a3503fd1162ed826f9fc610889a1d685d374b6c21e86067d").into(), + hex!("96cf5760c79cfc830d1d5bd6df6cfd67596bef24e22eed52cee04c290ad418add74e77965ea5748b7f0fb34ee4f43232").into(), + hex!("a5817c74a394b0359a4376ef7e9e8f7dfa6a7829602da225074fb392b715e1fd52c50cae0f128a7006f28b22f233fbf5").into(), + hex!("a50ab79cf3f6777a45f28d1b5cdad2c7ea718c60efeeb4c828d6307b29ef319445e6a9f98aa90f351c78b496575150c1").into(), + hex!("8b300dea07e73dd2f07b05d477e51f8424589f6b2fa6f461240e1322a3a7ab5bf227b74544bb5d66a297702cdbf6c6bf").into(), + hex!("b13b5cb86dc8b8fe87125f1a51fe98db36bdde4f600401408b75059a44e70b1bbfefd874e539691f3f1bf6f54db883c8").into(), + hex!("8d06205cd66703ce6776b38b98c32b27f45c7b3f65ea2d05e2b702c24d553f51c69bf0b17e8db7382475e3d370d2e8d6").into(), + hex!("a11a7496c712734aec80738e30d2bf245758b34245076149854eb209fa6403be8bb0d4e515becc881b7f3610749260c0").into(), + hex!("9615800f8c95f95bf25055ae079b964e0a64fa0176cc98da272662014f57e7cd2745929daf838df0094b9f54be18b415").into(), + hex!("b19ca6e55f349bbb2dc3e429520ff5b2e817972470794f35c1aac8c118b37a694cfcc875b6d72225343799825d2f5c39").into(), + hex!("a650864b7eb6769aaf0625c254891447351e702e40d2be34dfd25f3b5367370de354318d8935ba18db7929270455ae6a").into(), + hex!("a649208372f44f32eb1cd895de458ca1b8be782746356f08ac8ef629429d0780a0799fcff85736e19aead0b79bfff261").into(), + hex!("89461cb2dadf51d6f1208b0965c8eabec895d7b19b7d90d3c6e49dbe75a75c30fd26db3dfb169dd46a4342280225032a").into(), + hex!("b5d6f664ec92e5343792d5d6b629919c5fd8cfb874677df2264daf02bcd9d12facf9b859d5402839c9022396e20d260b").into(), + hex!("a7179d338fe5a0e4669364a364e17f8d00cb6c59a80a069afd5f4f14510df2eee90c07826553e4f7fe46d28f72b2903e").into(), + hex!("8ded37d67b5368619a090266e9b5585fbff60319a90a4244a3c3342641f5bfa5130998dd97d7a42505cd896c29255530").into(), + hex!("a3fd63e87a00b48ba46a646a26187ae6dcb16779721973ada13a545853e2e51b5e4df04630d670884ad4a2304cc60c67").into(), + hex!("92761b7e31f0c758b3b1f5b43a194b25aabec668101946eb6511132863d3afb9d18f833d43a8338d0e7bc78d8689e523").into(), + hex!("ab8a8769c754008a7976b6799e81d7bfe97413d0a79b90715703c1f8f567675463ec93aabee59277121fc4df88b5c7a9").into(), + hex!("b354d0d1bd942f79002a2eaf37eb99dab650170e7040c13c824803ed7c1670dc910ccae13bbe58bde003829b140b45ea").into(), + hex!("b9eed89e003894ad2cc9d9b93a45247e1367ac69a00b0ed5e3280c1188b4cb90eb870d449b83a852a798bd02f9d0c813").into(), + hex!("b900a55013d0427e5da6b21611d6ae3e648f54f794cb099b2d2beebae0a957477a94dc415e8ec5e68e9029ce50d43843").into(), + hex!("afbf44071c2c905f7c8ef396eaed7f13deb7a91719cb5e8b9226aaceb876d81a10076383edc6216bc2f5c38a480b2957").into(), + hex!("80bdb82b7d583bf1e41653966b0ba3b4fec0e7df2ff08e3fa06fd9064bca0364263e075e1582741a5243bde786c9c32e").into(), + hex!("a841fe9ff26db21ade698f6dbfba025d90ae9f81f02af9e008fa0a429b993fb04d06acb93e40a9f81c78f73334555a17").into(), + hex!("8cd49711b42af58a5aae75a38fea9ddc5e4183c467a3159b5b0629f01ba548513c577456d34c861911e85782e52c3b1b").into(), + hex!("a322b5d2a6e3cb98b8aaa4c068e097188affef5dec2f08c3e9ce29e73687340d4e5a743a8be5f10e138f9cabbe0c7211").into(), + hex!("942772b7c7c47d4e5957ccf1d6f1450070930af3e2b7eaab0dd7699372445df0cc910e6c0efcf501887dd1adabdaee23").into(), + hex!("9834f66e5c946c3a8241ca2bbde046a7e88072124911d5d15c037a95b61e82b88b5c2058fa4a3721537dee39dee5da18").into(), + hex!("a90cc5b9c4d84f36962d0d55d5bc123dbe5ec5f4fe7b6bf0d009028b3cf14e36c11bc5365391cb4ae548d5eb04fe371b").into(), + hex!("a7c2174eea2b66b2a71cc8095fae39c423a353c7d5020ec2d0551317a66202fcf082c6119ba768755523fff49791bb4e").into(), + hex!("ab92b2a177dfa55d202a653532f0e04d1339ca301aebe6a0e8419bf45be3e573b6b9ae4d3d822cc8279367a3d2c39b06").into(), + hex!("8a9ad977988eb8d98d9f549e4fd2305348a34e6874674bcd6e467c793bba6d7a2f3c20fa44aabbf7151ca53ecb1612f6").into(), + hex!("a7d1676816e81a752267d309014de1772b571b109c2901dc7c9810f45417faa18c81965c114be489ed178e54ac3687a1").into(), + hex!("a575be185551c40eb8edbdb21a0df381c801b6e99467fcf5882dd7cb34916960ce47ac732c1920ad3218f497b690cef4").into(), + hex!("b50c306f78143b37986e68efa10dbe1fb047d58562e9b5c5439b341dd8f1896c7ae586afac0a3213759784a905c1caaa").into(), + hex!("b31e89b4a034c1b73d43b3d63ea3bddea682a6a5327eff389c70b13e9e72185b0327682a0cb1ff3c4a4f8ba08b13d898").into(), + ], + aggregate_pubkey: hex!("948a4b8d91bd29969cd4470b1bc24d34586d38e73d5be71c98a9894899471a5f708747563276b4b6d2716fdb72860267").into(), + }, + next_sync_committee_branch: vec![ + hex!("cb3fea582872d90706ddc6d029bac0d791ea75d43c3ab04f056f62a11b89d27b").into(), + hex!("f26b4bb68eb7e6906c8ef4a9958398a48e4450bf9c8a462fafa4fde51cd5628f").into(), + hex!("690925f92c1d322d2ff2a5636539094825dfd2c9bf7538fe111b2358e03a71de").into(), + hex!("51d977e358166401c7cd3f6185468c1a8c69a4c3d8577535dd583bc427692e02").into(), + hex!("88d2089aaf2f6fd8f6e4ae499c6fe33cc34289eb9310780861e772204f07b670").into(), + ], + }), + finalized_header: BeaconHeader{ + slot: 4055040, + proposer_index: 854, + parent_root: hex!("8adf3b288deb17566a553fa7a06a2f63f4ac4cea4868af4d89ddca41f73ae9b9").into(), + state_root: hex!("595e9ebaaa23f027672b4d2a33173a22b2839baac709c7f8e66d3219f492ee9f").into(), + body_root: hex!("acf37b466d4f6b5d1db5b6ffe5d77c13972d116c2b0809de924427fd597d391a").into(), + }, + finality_branch: vec![ + hex!("00ef010000000000000000000000000000000000000000000000000000000000").into(), + hex!("3d4be5d019ba15ea3ef304a83b8a067f2e79f46a3fac8069306a6c814a0a35eb").into(), + hex!("a2e2a28c0bb0ad56c25f3c461a4bfe4f3b3b894bc0105a62e85f43a4ae1adc3f").into(), + hex!("690925f92c1d322d2ff2a5636539094825dfd2c9bf7538fe111b2358e03a71de").into(), + hex!("51d977e358166401c7cd3f6185468c1a8c69a4c3d8577535dd583bc427692e02").into(), + hex!("88d2089aaf2f6fd8f6e4ae499c6fe33cc34289eb9310780861e772204f07b670").into(), + ], + block_roots_root: hex!("7054ba439f83e9b2223911e25fad48eb28f5c362d94c0de2455a45436cc93897").into(), + block_roots_branch: vec![ + hex!("c99a842c81d0b956eef988dbcd90499457d61f942375c6cbf67262909b708db5").into(), + hex!("5d32345aeb10aa3ede4be021d2231dac47cc2074f74b72466f0b042e69adf70f").into(), + hex!("b69608a2377956c1a39c3423d3399ccfb12307623c9df6358f5fcfca64a80102").into(), + hex!("cefd9b668e49ece82bd4b0ee2f1efc88ecaf0d9af464fb622735663aaf106c4c").into(), + hex!("c113ad1c971779b15c64772ab69cd775edfb926a60447974913bb6f58fbd12fb").into(), + ], + }) +} + +pub fn make_finalized_header_update() -> Box { + Box::new(Update { + attested_header: BeaconHeader { + slot: 4058720, + proposer_index: 1088, + parent_root: hex!("37c7398a391c71da07258b48f41d4caaaf891fdf558e110b9c25db716fa8ff55").into(), + state_root: hex!("6cf68a66c993f1c27f499e054a5fbd7c0e625c34ea0057fda9691c561e990002").into(), + body_root: hex!("109e4c0c647d42dba0c8c6569997c51b5bcfc1a33475b1433ded6353f48423ff").into(), + }, + sync_aggregate: SyncAggregate{ + sync_committee_bits: hex!("ffffffffff7bfdfffff7fffff1effffef7f9ffbdfdffffffdffbfffbbf7ffffffffffefdf7ffbeffdffef7bfffffffffffbffffffffffbffffffffffffffdfda"), + sync_committee_signature: hex!("b5727bad1db101b6f0fd7ec4cb79b43dae90366fe0cae31a62439388eb03ebd75732cee3bde51f814203a4c0f5b23898120cd0870f0e662bdf0f85a048b534d9a906e6d32a65df019059d34f724221075734ec2849c09679febecf6929934f09").into(), + }, + signature_slot: 4058721, + next_sync_committee_update: None, + finalized_header: BeaconHeader { + slot: 4058656, + proposer_index: 810, + parent_root: hex!("bb6cfda1e02c3117d9fa41c1e1594ce0645352a073ad8b474f83c148e0d9954f").into(), + state_root: hex!("f938f0f0cba85234afbaace20545134c70b35e6ff9f74d944b0fea309109f3cf").into(), + body_root: hex!("cf6a7a6f653cb64b2b910278a478339b34eb08abf00e0766d10c7a8fe9bdb139").into(), + }, + finality_branch: vec![ + hex!("71ef010000000000000000000000000000000000000000000000000000000000").into(), + hex!("3d4be5d019ba15ea3ef304a83b8a067f2e79f46a3fac8069306a6c814a0a35eb").into(), + hex!("a2e2a28c0bb0ad56c25f3c461a4bfe4f3b3b894bc0105a62e85f43a4ae1adc3f").into(), + hex!("aa2bad8cf9b0433d3d79bc5b95c067048b018d1d2ffd0c66db6e7cf86e0a314e").into(), + hex!("027f238235d07ac9757543c19deabe1d553d6fc110e8bea4b037b1fab263b4dc").into(), + hex!("7dfa1cc1907e8927295f78a770bf86b28f5c2bddcac38beb3b4beb265ff5608f").into(), + ], + block_roots_root: hex!("4a5a57fb0769443f6472f59dbb78d7a9a69ff61d09aa89d5da645d634ec46a14").into(), + block_roots_branch: vec![ + hex!("a09ad7f3afd681bb6fd54abba339549f3b601beedea79a5b7d448b1cf1e1613e").into(), + hex!("acdfd4d5eba154f118a84af7a2d17ba6100fcd9c24fc235e927f584a5b56e32f").into(), + hex!("36ca106eac009ed605e680415b105b3a6591830c38034511f300aae44802235f").into(), + hex!("171561a9e1afb413132d0f4d3cbbd810766c151be32ec9f2d609f40aef9e2588").into(), + hex!("7cd963eba3fb57ee5ce37ee4b621d24fc14d642e32f48dc48ade528e11458ab9").into(), + ] + }) +} + +pub fn make_execution_header_update() -> Box { + Box::new(ExecutionHeaderUpdate { + header: BeaconHeader { + slot: 4058654, + proposer_index: 1039, + parent_root: hex!("758fa0a54047c0221b3107423e78b8910514ba7a0c4250401dac77108dce2ff8").into(), + state_root: hex!("53c79320b4b7649e39a9f07903f4fc68a7cfe7a81cb2e30293dd7b00ee13f69a").into(), + body_root: hex!("a76a7f037f12ee070dcb273d9787b13ff0cf17420a39564a101789318a157ec3").into(), + }, + ancestry_proof: Some(AncestryProof { + header_branch: vec![ + hex!("bb6cfda1e02c3117d9fa41c1e1594ce0645352a073ad8b474f83c148e0d9954f").into(), + hex!("b44967bd8ff799126cad993ff7369f7a28d60281304d0c7c058e6721b6ce4c61").into(), + hex!("0009710ef2467f95542c2e8e7a7249282c08f62aedbe7d21ae4a7af04e1a890d").into(), + hex!("7bc5dc20638cfe1cfd5d2547c3efbed4cfb533c76c27d41f723ed876ab9edc3a").into(), + hex!("6dcd59a8a041cf2591921417cb8133f0ff5af9bfe1f1ab491e75a751adc9c9e1").into(), + hex!("3f25a2852042c7bf2c421bf16c0b9373c1d27ccb1eca4088f8191712481261be").into(), + hex!("d1f9cfe1f04031459e5c45f47b2a49c780cabb8ca5b8d76461db2b88c337ed76").into(), + hex!("8c37e3119bf7d3cb8208e832669261b0eda1b3c7b11d321760ba1c0649f61416").into(), + hex!("1783d3b7041ecb78d9e1f913b82bd335229ca1f2cc5d3cc8dd28c94152e887b4").into(), + hex!("e39fc366c951c7cb2100308b0a9417581c46812a7d7e89f516c19863f7686f96").into(), + hex!("3c29b6d9b8715dbe5d6831364229efc91ad56ae69e93cb119d5ef4bdc53fcb37").into(), + hex!("3cf6fe5e8d91dbaa77e6befa81e04fb25a3e089317d83ff35fc8adfbbf2aab5a").into(), + hex!("b41c97cf3b1b4b5bf2999dfb1b3eaeac5c1b12205e9ab0809988e3779d119047").into(), + ], + finalized_block_root: hex!("b4802863fc1d32778211ce6aac8109c73c516a003213f4f5333c80472d08fe4e").into(), + }), + execution_header: ExecutionPayloadHeader { + parent_hash: hex!("9cffcba69c88a619483e13864704dde5db80e05f8d49018f615395ce09cd24ab").into(), + fee_recipient: hex!("ff58d746a67c2e42bcc07d6b3f58406e8837e883").into(), + state_root: hex!("6a4aafc93626778475a416721104229035e91f0db788d0099b57e756cd272f0a").into(), + receipts_root: hex!("e1ce670bdcf9acf4c62fee845cd7e81eabbb6db9ddbff56130020c6cf999a45d").into(), + logs_bloom: hex!("a000980408008000328c1458805c005048b84812c134200090b40428568108a0648090105085100301844800090802484420800d020282019002040d083004031a20420240a4a8900a43296938c040802040220170860210910020036b8c482228c004440300021c82c0400110402a10800582424001c00000828310210020a18130504020790dca716194100880ea5501149104002bc05e189080901c4001010e0a040658a410072021230a5224265030082404000aa11f28162e216636000408842103d41010760972060060000500c20130b000000065401483200081a84934f020020120009618002269c884724616040000840e18080300024490000230").into(), + prev_randao: hex!("5d9ac7ea788ecb534e98bc9079fa0bef199011dadadedaee5dc40e2cd702d664").into(), + block_number: 5025098, + gas_limit: 30000000, + gas_used: 13802943, + timestamp: 1704437448, + extra_data: hex!("476f65726c69205365706f6c69612d4265706f6c696120513966").into(), + base_fee_per_gas: U256::from(19959019915_u64), + block_hash: hex!("795021134c2b7f9c00b498ff7b0971dbbe061561868f702d8ca68a05e5eb5a99").into(), + transactions_root: hex!("3cb7c92fde5d511cc90cd67e375c4388794f4c01e375e8e8a06d003b5593fd12").into(), + withdrawals_root: hex!("5f5155fd8e5cd24b7ecb1e039792b0caff01dfda2990786d9ffc88325b5d1ea8").into(), + }, + execution_branch: vec![ + hex!("85ff3d1c2bc3dcdd5543bcd29a1224c6a8c24875224fbb1e3b69f0515ffaacda").into(), + hex!("336488033fe5f3ef4ccc12af07b9370b92e553e35ecb4a337a1b1c0e4afe1e0e").into(), + hex!("db56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71").into(), + hex!("fe1fa7acd413c54ebd394126ade19fc624ad9e4c60792d54ff3d60b07076b76d").into(), + ], + }) +} diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/benchmarking/fixtures_minimal.rs b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/benchmarking/fixtures_minimal.rs new file mode 100755 index 00000000000..b9476a0fb08 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/benchmarking/fixtures_minimal.rs @@ -0,0 +1,248 @@ +// Generated, do not edit! +// See README.md for instructions to generate +use crate::{CheckpointUpdate, ExecutionHeaderUpdate, Update}; +use hex_literal::hex; +use primitives::{ + updates::AncestryProof, BeaconHeader, ExecutionPayloadHeader, NextSyncCommitteeUpdate, + SyncAggregate, SyncCommittee, +}; +use sp_core::U256; +use sp_std::{boxed::Box, vec}; + +pub fn make_checkpoint() -> Box { + Box::new(CheckpointUpdate { + header: BeaconHeader { + slot: 152, + proposer_index: 7, + parent_root: hex!("7ecd45ee8bbacb20c6818eb46740b0f8d2fbd5af964e0dd844d3aa49ca75ce26").into(), + state_root: hex!("0859c78c54a2ecf1af0aecc05f3c8ba9274d1df500bfc4e6a7194c0235f55def").into(), + body_root: hex!("561bec3e5b200ee1bf6b60b5858ca2d7766ac9327b46355c070afafae8fca2ba").into(), + }, + current_sync_committee: SyncCommittee { + pubkeys: [ + hex!("a99a76ed7796f7be22d5b7e85deeb7c5677e88e511e0b337618f8c4eb61349b4bf2d153f649f7b53359fe8b94a38e44c").into(), + hex!("ab0bdda0f85f842f431beaccf1250bf1fd7ba51b4100fd64364b6401fda85bb0069b3e715b58819684e7fc0b10a72a34").into(), + hex!("a8d4c7c27795a725961317ef5953a7032ed6d83739db8b0e8a72353d1b8b4439427f7efa2c89caa03cc9f28f8cbab8ac").into(), + hex!("81283b7a20e1ca460ebd9bbd77005d557370cabb1f9a44f530c4c4c66230f675f8df8b4c2818851aa7d77a80ca5a4a5e").into(), + hex!("9977f1c8b731a8d5558146bfb86caea26434f3c5878b589bf280a42c9159e700e9df0e4086296c20b011d2e78c27d373").into(), + hex!("88c141df77cd9d8d7a71a75c826c41a9c9f03c6ee1b180f3e7852f6a280099ded351b58d66e653af8e42816a4d8f532e").into(), + hex!("a3a32b0f8b4ddb83f1a0a853d81dd725dfe577d4f4c3db8ece52ce2b026eca84815c1a7e8e92a4de3d755733bf7e4a9b").into(), + hex!("b89bebc699769726a318c8e9971bd3171297c61aea4a6578a7a4f94b547dcba5bac16a89108b6b6a1fe3695d1a874a0b").into(), + hex!("a99a76ed7796f7be22d5b7e85deeb7c5677e88e511e0b337618f8c4eb61349b4bf2d153f649f7b53359fe8b94a38e44c").into(), + hex!("ab0bdda0f85f842f431beaccf1250bf1fd7ba51b4100fd64364b6401fda85bb0069b3e715b58819684e7fc0b10a72a34").into(), + hex!("a8d4c7c27795a725961317ef5953a7032ed6d83739db8b0e8a72353d1b8b4439427f7efa2c89caa03cc9f28f8cbab8ac").into(), + hex!("81283b7a20e1ca460ebd9bbd77005d557370cabb1f9a44f530c4c4c66230f675f8df8b4c2818851aa7d77a80ca5a4a5e").into(), + hex!("9977f1c8b731a8d5558146bfb86caea26434f3c5878b589bf280a42c9159e700e9df0e4086296c20b011d2e78c27d373").into(), + hex!("88c141df77cd9d8d7a71a75c826c41a9c9f03c6ee1b180f3e7852f6a280099ded351b58d66e653af8e42816a4d8f532e").into(), + hex!("a3a32b0f8b4ddb83f1a0a853d81dd725dfe577d4f4c3db8ece52ce2b026eca84815c1a7e8e92a4de3d755733bf7e4a9b").into(), + hex!("b89bebc699769726a318c8e9971bd3171297c61aea4a6578a7a4f94b547dcba5bac16a89108b6b6a1fe3695d1a874a0b").into(), + hex!("a99a76ed7796f7be22d5b7e85deeb7c5677e88e511e0b337618f8c4eb61349b4bf2d153f649f7b53359fe8b94a38e44c").into(), + hex!("ab0bdda0f85f842f431beaccf1250bf1fd7ba51b4100fd64364b6401fda85bb0069b3e715b58819684e7fc0b10a72a34").into(), + hex!("a8d4c7c27795a725961317ef5953a7032ed6d83739db8b0e8a72353d1b8b4439427f7efa2c89caa03cc9f28f8cbab8ac").into(), + hex!("81283b7a20e1ca460ebd9bbd77005d557370cabb1f9a44f530c4c4c66230f675f8df8b4c2818851aa7d77a80ca5a4a5e").into(), + hex!("9977f1c8b731a8d5558146bfb86caea26434f3c5878b589bf280a42c9159e700e9df0e4086296c20b011d2e78c27d373").into(), + hex!("88c141df77cd9d8d7a71a75c826c41a9c9f03c6ee1b180f3e7852f6a280099ded351b58d66e653af8e42816a4d8f532e").into(), + hex!("a3a32b0f8b4ddb83f1a0a853d81dd725dfe577d4f4c3db8ece52ce2b026eca84815c1a7e8e92a4de3d755733bf7e4a9b").into(), + hex!("b89bebc699769726a318c8e9971bd3171297c61aea4a6578a7a4f94b547dcba5bac16a89108b6b6a1fe3695d1a874a0b").into(), + hex!("a99a76ed7796f7be22d5b7e85deeb7c5677e88e511e0b337618f8c4eb61349b4bf2d153f649f7b53359fe8b94a38e44c").into(), + hex!("ab0bdda0f85f842f431beaccf1250bf1fd7ba51b4100fd64364b6401fda85bb0069b3e715b58819684e7fc0b10a72a34").into(), + hex!("a8d4c7c27795a725961317ef5953a7032ed6d83739db8b0e8a72353d1b8b4439427f7efa2c89caa03cc9f28f8cbab8ac").into(), + hex!("81283b7a20e1ca460ebd9bbd77005d557370cabb1f9a44f530c4c4c66230f675f8df8b4c2818851aa7d77a80ca5a4a5e").into(), + hex!("9977f1c8b731a8d5558146bfb86caea26434f3c5878b589bf280a42c9159e700e9df0e4086296c20b011d2e78c27d373").into(), + hex!("88c141df77cd9d8d7a71a75c826c41a9c9f03c6ee1b180f3e7852f6a280099ded351b58d66e653af8e42816a4d8f532e").into(), + hex!("a3a32b0f8b4ddb83f1a0a853d81dd725dfe577d4f4c3db8ece52ce2b026eca84815c1a7e8e92a4de3d755733bf7e4a9b").into(), + hex!("b89bebc699769726a318c8e9971bd3171297c61aea4a6578a7a4f94b547dcba5bac16a89108b6b6a1fe3695d1a874a0b").into(), + ], + aggregate_pubkey: hex!("8fe11476a05750c52618deb79918e2e674f56dfbf12dbce55ae4386d108e8a1e83c6326f5957e2ef19137582ce270dc6").into(), + }, + current_sync_committee_branch: vec![ + hex!("c6dd41df7b4978b7ee7479dcbfdbfa9fb56d1464afe9806bfd6f527e9d1c69a4").into(), + hex!("b3824f305318071010d4f4d9505f9fc102cdd57f1c03cf4540e471b157f98e3f").into(), + hex!("66677299731d34be9d4dea7c0e89d8eae81b8dffa3c6218152484a063b1064a1").into(), + hex!("ef53c2b02cdb7f44fb37ea75f4c48c5086604a26be9635f88b1138f961f87773").into(), + hex!("1a3f86a88fb2ec99cb1d7b0f35227c0f646490773bac523c30fc7eccf87c0f84").into(), + ], + validators_root: hex!("270d43e74ce340de4bca2b1936beca0f4f5408d9e78aec4850920baf659d5b69").into(), + block_roots_root: hex!("8ad7487f0e79a6cf67ce49916f74e5b272be9e38ea5f8a6a588eaa89ea7f858e").into(), + block_roots_branch: vec![ + hex!("90683050cb3f3b04b2a89c206365747bef4c42154feb5d3f4198dfd48b2067ae").into(), + hex!("34f521b45630273930475b8a4350fe2c71c804878ebcd89064eb1dc24a85e468").into(), + hex!("81e166eaeaff5df2d3a5df306c78af075106cbf63c2f1b50ab67eec2dbb0f5ce").into(), + hex!("857526b3bf20de3ec6e57565dd593304f83e47541cc18d7c2d5b4c9f2724ba14").into(), + hex!("1b4bedd5ecc523599da000387f5e33ffe5324b8e234c43ee702de8ccc88d713f").into(), + ], + }) +} + +pub fn make_sync_committee_update() -> Box { + Box::new(Update { + attested_header: BeaconHeader { + slot: 144, + proposer_index: 2, + parent_root: hex!("74e7da3093f79414b5ab593d1c12ba63767db7f4af62672fa1be641331c338e0").into(), + state_root: hex!("92a08dc74f6af7bfcd428aa1677d58f36fefc159c0134b312c186a69fcd00496").into(), + body_root: hex!("51506a8230d40d065a29ad01197c983b9b5d4b9abd26d3c48773941f4e6f482d").into(), + }, + sync_aggregate: SyncAggregate{ + sync_committee_bits: hex!("ffffffff"), + sync_committee_signature: hex!("92cbff711040bcc4a81616edbadbe712ea3ac4939c3d3121a4561b4b3950e2e5b09809606b79fdad2ce20fdef413120a04f02dc65149ca9b6ecab2a94ac4087062df4ab03e161ae56fa6fee4ba40af29c3b4327e21e846f98144cab30684d197").into(), + }, + signature_slot: 145, + next_sync_committee_update: Some(NextSyncCommitteeUpdate { + next_sync_committee: SyncCommittee { + pubkeys: [ + hex!("a8d4c7c27795a725961317ef5953a7032ed6d83739db8b0e8a72353d1b8b4439427f7efa2c89caa03cc9f28f8cbab8ac").into(), + hex!("81283b7a20e1ca460ebd9bbd77005d557370cabb1f9a44f530c4c4c66230f675f8df8b4c2818851aa7d77a80ca5a4a5e").into(), + hex!("b89bebc699769726a318c8e9971bd3171297c61aea4a6578a7a4f94b547dcba5bac16a89108b6b6a1fe3695d1a874a0b").into(), + hex!("88c141df77cd9d8d7a71a75c826c41a9c9f03c6ee1b180f3e7852f6a280099ded351b58d66e653af8e42816a4d8f532e").into(), + hex!("9977f1c8b731a8d5558146bfb86caea26434f3c5878b589bf280a42c9159e700e9df0e4086296c20b011d2e78c27d373").into(), + hex!("ab0bdda0f85f842f431beaccf1250bf1fd7ba51b4100fd64364b6401fda85bb0069b3e715b58819684e7fc0b10a72a34").into(), + hex!("a3a32b0f8b4ddb83f1a0a853d81dd725dfe577d4f4c3db8ece52ce2b026eca84815c1a7e8e92a4de3d755733bf7e4a9b").into(), + hex!("a99a76ed7796f7be22d5b7e85deeb7c5677e88e511e0b337618f8c4eb61349b4bf2d153f649f7b53359fe8b94a38e44c").into(), + hex!("a8d4c7c27795a725961317ef5953a7032ed6d83739db8b0e8a72353d1b8b4439427f7efa2c89caa03cc9f28f8cbab8ac").into(), + hex!("81283b7a20e1ca460ebd9bbd77005d557370cabb1f9a44f530c4c4c66230f675f8df8b4c2818851aa7d77a80ca5a4a5e").into(), + hex!("b89bebc699769726a318c8e9971bd3171297c61aea4a6578a7a4f94b547dcba5bac16a89108b6b6a1fe3695d1a874a0b").into(), + hex!("88c141df77cd9d8d7a71a75c826c41a9c9f03c6ee1b180f3e7852f6a280099ded351b58d66e653af8e42816a4d8f532e").into(), + hex!("9977f1c8b731a8d5558146bfb86caea26434f3c5878b589bf280a42c9159e700e9df0e4086296c20b011d2e78c27d373").into(), + hex!("ab0bdda0f85f842f431beaccf1250bf1fd7ba51b4100fd64364b6401fda85bb0069b3e715b58819684e7fc0b10a72a34").into(), + hex!("a3a32b0f8b4ddb83f1a0a853d81dd725dfe577d4f4c3db8ece52ce2b026eca84815c1a7e8e92a4de3d755733bf7e4a9b").into(), + hex!("a99a76ed7796f7be22d5b7e85deeb7c5677e88e511e0b337618f8c4eb61349b4bf2d153f649f7b53359fe8b94a38e44c").into(), + hex!("a8d4c7c27795a725961317ef5953a7032ed6d83739db8b0e8a72353d1b8b4439427f7efa2c89caa03cc9f28f8cbab8ac").into(), + hex!("81283b7a20e1ca460ebd9bbd77005d557370cabb1f9a44f530c4c4c66230f675f8df8b4c2818851aa7d77a80ca5a4a5e").into(), + hex!("b89bebc699769726a318c8e9971bd3171297c61aea4a6578a7a4f94b547dcba5bac16a89108b6b6a1fe3695d1a874a0b").into(), + hex!("88c141df77cd9d8d7a71a75c826c41a9c9f03c6ee1b180f3e7852f6a280099ded351b58d66e653af8e42816a4d8f532e").into(), + hex!("9977f1c8b731a8d5558146bfb86caea26434f3c5878b589bf280a42c9159e700e9df0e4086296c20b011d2e78c27d373").into(), + hex!("ab0bdda0f85f842f431beaccf1250bf1fd7ba51b4100fd64364b6401fda85bb0069b3e715b58819684e7fc0b10a72a34").into(), + hex!("a3a32b0f8b4ddb83f1a0a853d81dd725dfe577d4f4c3db8ece52ce2b026eca84815c1a7e8e92a4de3d755733bf7e4a9b").into(), + hex!("a99a76ed7796f7be22d5b7e85deeb7c5677e88e511e0b337618f8c4eb61349b4bf2d153f649f7b53359fe8b94a38e44c").into(), + hex!("a8d4c7c27795a725961317ef5953a7032ed6d83739db8b0e8a72353d1b8b4439427f7efa2c89caa03cc9f28f8cbab8ac").into(), + hex!("81283b7a20e1ca460ebd9bbd77005d557370cabb1f9a44f530c4c4c66230f675f8df8b4c2818851aa7d77a80ca5a4a5e").into(), + hex!("b89bebc699769726a318c8e9971bd3171297c61aea4a6578a7a4f94b547dcba5bac16a89108b6b6a1fe3695d1a874a0b").into(), + hex!("88c141df77cd9d8d7a71a75c826c41a9c9f03c6ee1b180f3e7852f6a280099ded351b58d66e653af8e42816a4d8f532e").into(), + hex!("9977f1c8b731a8d5558146bfb86caea26434f3c5878b589bf280a42c9159e700e9df0e4086296c20b011d2e78c27d373").into(), + hex!("ab0bdda0f85f842f431beaccf1250bf1fd7ba51b4100fd64364b6401fda85bb0069b3e715b58819684e7fc0b10a72a34").into(), + hex!("a3a32b0f8b4ddb83f1a0a853d81dd725dfe577d4f4c3db8ece52ce2b026eca84815c1a7e8e92a4de3d755733bf7e4a9b").into(), + hex!("a99a76ed7796f7be22d5b7e85deeb7c5677e88e511e0b337618f8c4eb61349b4bf2d153f649f7b53359fe8b94a38e44c").into(), + ], + aggregate_pubkey: hex!("8fe11476a05750c52618deb79918e2e674f56dfbf12dbce55ae4386d108e8a1e83c6326f5957e2ef19137582ce270dc6").into(), + }, + next_sync_committee_branch: vec![ + hex!("c243f5286cbf6c3c5f58ef6e1734a737bf96cfc0adbf2ee88d4a996f8dfc7097").into(), + hex!("6ae16cb8ea57014c75a9469485bc024bb1e64676656cb069753bf091e58de88f").into(), + hex!("1afa3c77cd75040c1bbbc5d1b7c07e65eeee44fbc659b64ccd55b4ba579038ae").into(), + hex!("89b14216f60859ae366de066eeff4c7b69f8b5738c5b70cdfab4b3a976f9f12f").into(), + hex!("b7d8fa1e64e6d6339a7c68a81e20daab65804777b93a04236fa503b575c2f1a9").into(), + ], + }), + finalized_header: BeaconHeader{ + slot: 128, + proposer_index: 3, + parent_root: hex!("3774d6a479fc6f71ccaff3f8a1881c424b0319e96a7da15f87e3b750ba50dae5").into(), + state_root: hex!("85937007c564046bcc147d53b1d2d78941e2787ec059bee191420369a7f80447").into(), + body_root: hex!("c8f31c33ffaeef2d534363b7ef9ec391f90c17bc5bbe439cf0dcf0de8eeb4d7d").into(), + }, + finality_branch: vec![ + hex!("1000000000000000000000000000000000000000000000000000000000000000").into(), + hex!("10c726fac935bf9657cc7476d3cfa7bedec5983dcfb59e8a7df6d0a619e108d7").into(), + hex!("c2374959a44ad09eb825ada636c430d530e656d7f06dccbcf2ca8b6dc834b188").into(), + hex!("1afa3c77cd75040c1bbbc5d1b7c07e65eeee44fbc659b64ccd55b4ba579038ae").into(), + hex!("89b14216f60859ae366de066eeff4c7b69f8b5738c5b70cdfab4b3a976f9f12f").into(), + hex!("b7d8fa1e64e6d6339a7c68a81e20daab65804777b93a04236fa503b575c2f1a9").into(), + ], + block_roots_root: hex!("b10da1bbb1c0dcb01637b9e3dcb710d1013dc42a002bd837d5b4effa0ac995c9").into(), + block_roots_branch: vec![ + hex!("9c62693fd336e4b3ca61d3cbe9caeb85f1f1b59ef50aeddfce53dc7321d6058b").into(), + hex!("364947a6574f4acc97888e1fddb5ec718859d54cd7e3db98cda8db4dbea82ded").into(), + hex!("10a61d26b0c1b5b89cf5b82b965f772a1b6ae852fbd13a986c5c63bf12b99244").into(), + hex!("506ed8ca9908af4b5acb4cfdec6dd968acf38346c16385abca360c9976411c3e").into(), + hex!("ada571922caf3dde48e19f1482df8d17dd6bb05e525c016c8cf6796a5d7f4a00").into(), + ], + }) +} + +pub fn make_finalized_header_update() -> Box { + Box::new(Update { + attested_header: BeaconHeader { + slot: 184, + proposer_index: 5, + parent_root: hex!("13548d0b72ef2b352ba73a53274ad02e9310d8417d4782bf9cdad877da549595").into(), + state_root: hex!("cbd5e841afef5103a613bb9a89199d39c40751af1af7cabadfa8e1fd49c4be09").into(), + body_root: hex!("c9b5074ac3043ae2ad6da067b0787d61b6f1611b560ef80860ce62564534a53a").into(), + }, + sync_aggregate: SyncAggregate{ + sync_committee_bits: hex!("ffffffff"), + sync_committee_signature: hex!("80628825caef48ef13b4ffda96fcee74743609fe3537b7cd0ca8bc25c8a540b96dfbe23bdd0a60a8db70b2c48f090c1d03a25923207a193724d98e140db90ab692cd00ec2b4d3c0c4cbff13b4ab343e0c896e15cba08f9d82c392b1c982a8115").into(), + }, + signature_slot: 185, + next_sync_committee_update: None, + finalized_header: BeaconHeader { + slot: 168, + proposer_index: 1, + parent_root: hex!("bb8245e89f5d7d9191c559425b8522487d98b8f2c9b814a158656eaf06caaa06").into(), + state_root: hex!("98b4d1141cfc324ce7095417d81b28995587e9a50ebb4872254187155e6b160c").into(), + body_root: hex!("c1a089291dbc744be622356dcbdd65fe053dcb908056511e5148f73a3d5c8a7e").into(), + }, + finality_branch: vec![ + hex!("1500000000000000000000000000000000000000000000000000000000000000").into(), + hex!("10c726fac935bf9657cc7476d3cfa7bedec5983dcfb59e8a7df6d0a619e108d7").into(), + hex!("c2374959a44ad09eb825ada636c430d530e656d7f06dccbcf2ca8b6dc834b188").into(), + hex!("97a3662f859b89f96d7c6ce03496c353df5f6c225455f3f2c5edde329f5a94d1").into(), + hex!("4c4720ad9a38628c6774dbd1180d026aceb0be3cb0085d531b1e09faf014328a").into(), + hex!("c3d59497774f8f1c13fda9f9c6b4f773efabbac8a24d914dc7cf02874d5f5658").into(), + ], + block_roots_root: hex!("dff54b382531f4af2cb6e5b27ea905cc8e19b48f3ae8e02955f859e6bfd37e42").into(), + block_roots_branch: vec![ + hex!("8f957e090dec42d80c118d24c0e841681e82d3b330707729cb939d538c208fb7").into(), + hex!("4d33691095103fbf0df53ae0ea14378d721356b54592019050fc532bfef42d0c").into(), + hex!("bc9b31cd5d18358bff3038fab52101cfd5c56c75539449d988c5a789200fb264").into(), + hex!("7d57e424243eeb39169edccf9dab962ba8d80a9575179799bbd509c95316d8df").into(), + hex!("c07eeb9da14bcedb7dd225a68b92f578ef0b86187724879e5171d5de8a00be3a").into(), + ] + }) +} + +pub fn make_execution_header_update() -> Box { + Box::new(ExecutionHeaderUpdate { + header: BeaconHeader { + slot: 166, + proposer_index: 7, + parent_root: hex!("da28a205118aaf4aa69a3fb4eb7a565541b7172cc77771ec886b54b6f5bc10f3").into(), + state_root: hex!("179a6249c3e86ebcc9c71a0fc604a825a5fb5dd1602177681c54dc7e09af4265").into(), + body_root: hex!("e1290e50d64f043594bcac66824b04eb3047ae4174188e40106235183f47074c").into(), + }, + ancestry_proof: Some(AncestryProof { + header_branch: vec![ + hex!("bb8245e89f5d7d9191c559425b8522487d98b8f2c9b814a158656eaf06caaa06").into(), + hex!("ab498fef414d709fcac589217246527b82c25706fa800f21d543c83a0ccc59a2").into(), + hex!("de054acbf636cf9f1692137f78179381b5b0328b49fbc4d324eb8e897b41f52c").into(), + hex!("c472fde1df644788c92208467ff5aad686ce55bab1570917e8de1922296666fd").into(), + hex!("11a71c67676c72696c452d875318501cd50968106f72fb611bfe5952285516f8").into(), + hex!("6d2bd2b6cd84ddadc89df27f3f7f9141bb88c742a30123c77eefebef9d5f6667").into(), + ], + finalized_block_root: hex!("be7d9cc4483ed0065fc7c32e2a783ca3782d8dbd7bfe899fd7c0bcee82f11629").into(), + }), + execution_header: ExecutionPayloadHeader { + parent_hash: hex!("96b27b6e0919c19a70c4a2f7136fd59d2e63a3ba0453a86775add3f2dd681cea").into(), + fee_recipient: hex!("0000000000000000000000000000000000000000").into(), + state_root: hex!("b847ee60946ebdb5bd92c22385da44b8a9aea4c6779f1a1402cc06e22b76fb4a").into(), + receipts_root: hex!("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421").into(), + logs_bloom: hex!("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").into(), + prev_randao: hex!("e6c6665aa502e12dd8f5937da2eb7f7fe7a78bc9a900c9321412b8ddd4d72325").into(), + block_number: 166, + gas_limit: 68022694, + gas_used: 0, + timestamp: 1704700423, + extra_data: hex!("d983010d05846765746888676f312e32312e318664617277696e").into(), + base_fee_per_gas: U256::from(7_u64), + block_hash: hex!("1871ded7b2b8b4b5b358c904104704811b15aeefc24e49daa2a1a68176d6553a").into(), + transactions_root: hex!("7ffe241ea60187fdb0187bfa22de35d1f9bed7ab061d9401fd47e34a54fbede1").into(), + withdrawals_root: hex!("28ba1834a3a7b657460ce79fa3a1d909ab8828fd557659d4d0554a9bdbc0ec30").into(), + }, + execution_branch: vec![ + hex!("276d006ecfe51451787321ef00417b194e90b35d4106bd7d51372f39918a4531").into(), + hex!("336488033fe5f3ef4ccc12af07b9370b92e553e35ecb4a337a1b1c0e4afe1e0e").into(), + hex!("db56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71").into(), + hex!("6b8ff91d1be713c644ef9b3e5b77323897930c342fd12615c0d2142bee5cd1d7").into(), + ], + }) +} diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/benchmarking/mod.rs b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/benchmarking/mod.rs index cba22fc86c9..807d4de14ee 100644 --- a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/benchmarking/mod.rs +++ b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/benchmarking/mod.rs @@ -1,18 +1,21 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: 2023 Snowfork use super::*; - -mod fixtures; mod util; use crate::Pallet as EthereumBeaconClient; use frame_benchmarking::v2::*; use frame_system::RawOrigin; -use fixtures::{ - make_checkpoint, make_execution_header_update, make_finalized_header_update, - make_sync_committee_update, -}; +#[cfg(feature = "beacon-spec-minimal")] +mod fixtures_minimal; +#[cfg(feature = "beacon-spec-minimal")] +use fixtures_minimal::*; + +#[cfg(not(feature = "beacon-spec-minimal"))] +mod fixtures_mainnet; +#[cfg(not(feature = "beacon-spec-minimal"))] +use fixtures_mainnet::*; use primitives::{ fast_aggregate_verify, prepare_aggregate_pubkey, prepare_aggregate_signature, @@ -148,6 +151,13 @@ mod benchmarks { Ok(()) } + #[cfg(feature = "beacon-spec-minimal")] + impl_benchmark_test_suite!( + EthereumBeaconClient, + crate::mock::minimal::new_tester(), + crate::mock::minimal::Test + ); + #[cfg(not(feature = "beacon-spec-minimal"))] impl_benchmark_test_suite!( EthereumBeaconClient, crate::mock::mainnet::new_tester(), diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/config/mod.rs b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/config/mod.rs index 6b959ebfec9..d20743b846e 100644 --- a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/config/mod.rs +++ b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/config/mod.rs @@ -6,10 +6,10 @@ use static_assertions::const_assert; pub mod mainnet; pub mod minimal; -#[cfg(not(feature = "beacon-spec-mainnet"))] +#[cfg(feature = "beacon-spec-minimal")] pub use minimal::*; -#[cfg(feature = "beacon-spec-mainnet")] +#[cfg(not(feature = "beacon-spec-minimal"))] pub use mainnet::*; // Generalized Indices diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/lib.rs b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/lib.rs index fdda200251a..53877ea58fe 100644 --- a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/lib.rs +++ b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/lib.rs @@ -28,7 +28,7 @@ pub mod weights; #[cfg(any(test, feature = "fuzzing"))] pub mod mock; -#[cfg(all(test, not(feature = "beacon-spec-mainnet")))] +#[cfg(test)] mod tests; #[cfg(feature = "runtime-benchmarks")] diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/mock.rs b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/mock.rs index 4d1d14a1015..b25e8b0e813 100644 --- a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/mock.rs +++ b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/mock.rs @@ -1,22 +1,127 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: 2023 Snowfork use crate as ethereum_beacon_client; +use crate::config; use frame_support::parameter_types; +use hex_literal::hex; use pallet_timestamp; -use primitives::{Fork, ForkVersions}; +use primitives::{CompactExecutionHeader, Fork, ForkVersions}; +use snowbridge_core::inbound::{Log, Proof}; use sp_core::H256; use sp_runtime::traits::{BlakeTwo256, IdentityLookup}; +use std::{fs::File, path::PathBuf}; -#[cfg(not(feature = "beacon-spec-mainnet"))] +fn load_fixture(basename: String) -> Result +where + T: for<'de> serde::Deserialize<'de>, +{ + let filepath: PathBuf = + [env!("CARGO_MANIFEST_DIR"), "tests", "fixtures", &basename].iter().collect(); + serde_json::from_reader(File::open(filepath).unwrap()) +} + +pub fn load_execution_header_update_fixture() -> primitives::ExecutionHeaderUpdate { + #[cfg(feature = "beacon-spec-minimal")] + const SPEC: &str = "minimal"; + #[cfg(not(feature = "beacon-spec-minimal"))] + const SPEC: &str = "mainnet"; + let basename = format!("execution-header-update.{}.json", SPEC); + load_fixture(basename).unwrap() +} + +pub fn load_checkpoint_update_fixture( +) -> primitives::CheckpointUpdate<{ config::SYNC_COMMITTEE_SIZE }> { + #[cfg(feature = "beacon-spec-minimal")] + const SPEC: &str = "minimal"; + #[cfg(not(feature = "beacon-spec-minimal"))] + const SPEC: &str = "mainnet"; + let basename = format!("initial-checkpoint.{}.json", SPEC); + load_fixture(basename).unwrap() +} + +pub fn load_sync_committee_update_fixture( +) -> primitives::Update<{ config::SYNC_COMMITTEE_SIZE }, { config::SYNC_COMMITTEE_BITS_SIZE }> { + #[cfg(feature = "beacon-spec-minimal")] + const SPEC: &str = "minimal"; + #[cfg(not(feature = "beacon-spec-minimal"))] + const SPEC: &str = "mainnet"; + let basename = format!("sync-committee-update.{}.json", SPEC); + load_fixture(basename).unwrap() +} + +pub fn load_finalized_header_update_fixture( +) -> primitives::Update<{ config::SYNC_COMMITTEE_SIZE }, { config::SYNC_COMMITTEE_BITS_SIZE }> { + #[cfg(feature = "beacon-spec-minimal")] + const SPEC: &str = "minimal"; + #[cfg(not(feature = "beacon-spec-minimal"))] + const SPEC: &str = "mainnet"; + let basename = format!("finalized-header-update.{}.json", SPEC); + load_fixture(basename).unwrap() +} + +pub fn load_next_sync_committee_update_fixture( +) -> primitives::Update<{ config::SYNC_COMMITTEE_SIZE }, { config::SYNC_COMMITTEE_BITS_SIZE }> { + #[cfg(feature = "beacon-spec-minimal")] + const SPEC: &str = "minimal"; + #[cfg(not(feature = "beacon-spec-minimal"))] + const SPEC: &str = "mainnet"; + let basename = format!("next-sync-committee-update.{}.json", SPEC); + load_fixture(basename).unwrap() +} + +pub fn load_next_finalized_header_update_fixture( +) -> primitives::Update<{ config::SYNC_COMMITTEE_SIZE }, { config::SYNC_COMMITTEE_BITS_SIZE }> { + #[cfg(feature = "beacon-spec-minimal")] + const SPEC: &str = "minimal"; + #[cfg(not(feature = "beacon-spec-minimal"))] + const SPEC: &str = "mainnet"; + let basename = format!("next-finalized-header-update.{}.json", SPEC); + load_fixture(basename).unwrap() +} + +pub fn get_message_verification_payload() -> (Log, Proof) { + ( + Log { + address: hex!("ee9170abfbf9421ad6dd07f6bdec9d89f2b581e0").into(), + topics: vec![ + hex!("1b11dcf133cc240f682dab2d3a8e4cd35c5da8c9cf99adac4336f8512584c5ad").into(), + hex!("00000000000000000000000000000000000000000000000000000000000003e8").into(), + hex!("0000000000000000000000000000000000000000000000000000000000000001").into(), + ], + data: hex!("0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004b000f000000000000000100d184c103f7acc340847eee82a0b909e3358bc28d440edffa1352b13227e8ee646f3ea37456dec701345772617070656420457468657210574554481235003511000000000000000000000000000000000000000000").into(), + }, + Proof { + block_hash: hex!("05aaa60b0f27cce9e71909508527264b77ee14da7b5bf915fcc4e32715333213").into(), + tx_index: 0, + data: (vec![ + hex!("cf0d1c1ba57d1e0edfb59786c7e30c2b7e12bd54612b00cd21c4eaeecedf44fb").to_vec(), + hex!("d21fc4f68ab05bc4dcb23c67008e92c4d466437cdd6ed7aad0c008944c185510").to_vec(), + hex!("b9890f91ca0d77aa2a4adfaf9b9e40c94cac9e638b6d9797923865872944b646").to_vec(), + ], vec![ + hex!("f90131a0b601337b3aa10a671caa724eba641e759399979856141d3aea6b6b4ac59b889ba00c7d5dd48be9060221a02fb8fa213860b4c50d47046c8fa65ffaba5737d569e0a094601b62a1086cd9c9cb71a7ebff9e718f3217fd6e837efe4246733c0a196f63a06a4b0dd0aefc37b3c77828c8f07d1b7a2455ceb5dbfd3c77d7d6aeeddc2f7e8ca0d6e8e23142cdd8ec219e1f5d8b56aa18e456702b195deeaa210327284d42ade4a08a313d4c87023005d1ab631bbfe3f5de1e405d0e66d0bef3e033f1e5711b5521a0bf09a5d9a48b10ade82b8d6a5362a15921c8b5228a3487479b467db97411d82fa0f95cccae2a7c572ef3c566503e30bac2b2feb2d2f26eebf6d870dcf7f8cf59cea0d21fc4f68ab05bc4dcb23c67008e92c4d466437cdd6ed7aad0c008944c1855108080808080808080").to_vec(), + hex!("f851a0b9890f91ca0d77aa2a4adfaf9b9e40c94cac9e638b6d9797923865872944b646a060a634b9280e3a23fb63375e7bbdd9ab07fd379ab6a67e2312bbc112195fa358808080808080808080808080808080").to_vec(), + hex!("f9030820b9030402f90300018301d6e2b9010000000000000800000000000020040008000000000000000000000000400000008000000000000000000000000000000000000000000000000000000000042010000000001000000000000000000000000000000000040000000000000000000000000000000000000000000000008000000000000000002000000000000000000000000200000000000000200000000000100000000040000001000200008000000000000200000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000f901f5f87a942ffa5ecdbe006d30397c7636d3e015eee251369ff842a0c965575a00553e094ca7c5d14f02e107c258dda06867cbf9e0e69f80e71bbcc1a000000000000000000000000000000000000000000000000000000000000003e8a000000000000000000000000000000000000000000000000000000000000003e8f9011c94ee9170abfbf9421ad6dd07f6bdec9d89f2b581e0f863a01b11dcf133cc240f682dab2d3a8e4cd35c5da8c9cf99adac4336f8512584c5ada000000000000000000000000000000000000000000000000000000000000003e8a00000000000000000000000000000000000000000000000000000000000000001b8a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004b000f000000000000000100d184c103f7acc340847eee82a0b909e3358bc28d440edffa1352b13227e8ee646f3ea37456dec701345772617070656420457468657210574554481235003511000000000000000000000000000000000000000000f858948cf6147918a5cbb672703f879f385036f8793a24e1a01449abf21e49fd025f33495e77f7b1461caefdd3d4bb646424a3f445c4576a5ba0000000000000000000000000440edffa1352b13227e8ee646f3ea37456dec701").to_vec(), + ]), + } + ) +} + +pub fn get_message_verification_header() -> CompactExecutionHeader { + CompactExecutionHeader { + parent_hash: hex!("04a7f6ab8282203562c62f38b0ab41d32aaebe2c7ea687702b463148a6429e04") + .into(), + block_number: 55, + state_root: hex!("894d968712976d613519f973a317cb0781c7b039c89f27ea2b7ca193f7befdb3").into(), + receipts_root: hex!("cf0d1c1ba57d1e0edfb59786c7e30c2b7e12bd54612b00cd21c4eaeecedf44fb") + .into(), + } +} + +#[cfg(feature = "beacon-spec-minimal")] pub mod minimal { use super::*; - use crate::config; - use hex_literal::hex; - use primitives::CompactExecutionHeader; - use snowbridge_core::inbound::{Log, Proof}; use sp_runtime::BuildStorage; - use std::{fs::File, path::PathBuf}; type Block = frame_system::mocking::MockBlock; @@ -103,86 +208,9 @@ pub mod minimal { let _ = ext.execute_with(|| Timestamp::set(RuntimeOrigin::signed(1), 30_000)); ext } - - fn load_fixture(basename: &str) -> Result - where - T: for<'de> serde::Deserialize<'de>, - { - let filepath: PathBuf = - [env!("CARGO_MANIFEST_DIR"), "tests", "fixtures", basename].iter().collect(); - serde_json::from_reader(File::open(filepath).unwrap()) - } - - pub fn load_execution_header_update_fixture() -> primitives::ExecutionHeaderUpdate { - load_fixture("execution-header-update.minimal.json").unwrap() - } - - pub fn load_checkpoint_update_fixture( - ) -> primitives::CheckpointUpdate<{ config::SYNC_COMMITTEE_SIZE }> { - load_fixture("initial-checkpoint.minimal.json").unwrap() - } - - pub fn load_sync_committee_update_fixture( - ) -> primitives::Update<{ config::SYNC_COMMITTEE_SIZE }, { config::SYNC_COMMITTEE_BITS_SIZE }> { - load_fixture("sync-committee-update.minimal.json").unwrap() - } - - pub fn load_finalized_header_update_fixture( - ) -> primitives::Update<{ config::SYNC_COMMITTEE_SIZE }, { config::SYNC_COMMITTEE_BITS_SIZE }> { - load_fixture("finalized-header-update.minimal.json").unwrap() - } - - pub fn load_next_sync_committee_update_fixture( - ) -> primitives::Update<{ config::SYNC_COMMITTEE_SIZE }, { config::SYNC_COMMITTEE_BITS_SIZE }> { - load_fixture("next-sync-committee-update.minimal.json").unwrap() - } - - pub fn load_next_finalized_header_update_fixture( - ) -> primitives::Update<{ config::SYNC_COMMITTEE_SIZE }, { config::SYNC_COMMITTEE_BITS_SIZE }> { - load_fixture("next-finalized-header-update.minimal.json").unwrap() - } - - pub fn get_message_verification_payload() -> (Log, Proof) { - ( - Log { - address: hex!("ee9170abfbf9421ad6dd07f6bdec9d89f2b581e0").into(), - topics: vec![ - hex!("1b11dcf133cc240f682dab2d3a8e4cd35c5da8c9cf99adac4336f8512584c5ad").into(), - hex!("00000000000000000000000000000000000000000000000000000000000003e8").into(), - hex!("0000000000000000000000000000000000000000000000000000000000000001").into(), - ], - data: hex!("0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004b000f000000000000000100d184c103f7acc340847eee82a0b909e3358bc28d440edffa1352b13227e8ee646f3ea37456dec701345772617070656420457468657210574554481235003511000000000000000000000000000000000000000000").into(), - }, - Proof { - block_hash: hex!("05aaa60b0f27cce9e71909508527264b77ee14da7b5bf915fcc4e32715333213").into(), - tx_index: 0, - data: (vec![ - hex!("cf0d1c1ba57d1e0edfb59786c7e30c2b7e12bd54612b00cd21c4eaeecedf44fb").to_vec(), - hex!("d21fc4f68ab05bc4dcb23c67008e92c4d466437cdd6ed7aad0c008944c185510").to_vec(), - hex!("b9890f91ca0d77aa2a4adfaf9b9e40c94cac9e638b6d9797923865872944b646").to_vec(), - ], vec![ - hex!("f90131a0b601337b3aa10a671caa724eba641e759399979856141d3aea6b6b4ac59b889ba00c7d5dd48be9060221a02fb8fa213860b4c50d47046c8fa65ffaba5737d569e0a094601b62a1086cd9c9cb71a7ebff9e718f3217fd6e837efe4246733c0a196f63a06a4b0dd0aefc37b3c77828c8f07d1b7a2455ceb5dbfd3c77d7d6aeeddc2f7e8ca0d6e8e23142cdd8ec219e1f5d8b56aa18e456702b195deeaa210327284d42ade4a08a313d4c87023005d1ab631bbfe3f5de1e405d0e66d0bef3e033f1e5711b5521a0bf09a5d9a48b10ade82b8d6a5362a15921c8b5228a3487479b467db97411d82fa0f95cccae2a7c572ef3c566503e30bac2b2feb2d2f26eebf6d870dcf7f8cf59cea0d21fc4f68ab05bc4dcb23c67008e92c4d466437cdd6ed7aad0c008944c1855108080808080808080").to_vec(), - hex!("f851a0b9890f91ca0d77aa2a4adfaf9b9e40c94cac9e638b6d9797923865872944b646a060a634b9280e3a23fb63375e7bbdd9ab07fd379ab6a67e2312bbc112195fa358808080808080808080808080808080").to_vec(), - hex!("f9030820b9030402f90300018301d6e2b9010000000000000800000000000020040008000000000000000000000000400000008000000000000000000000000000000000000000000000000000000000042010000000001000000000000000000000000000000000040000000000000000000000000000000000000000000000008000000000000000002000000000000000000000000200000000000000200000000000100000000040000001000200008000000000000200000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000f901f5f87a942ffa5ecdbe006d30397c7636d3e015eee251369ff842a0c965575a00553e094ca7c5d14f02e107c258dda06867cbf9e0e69f80e71bbcc1a000000000000000000000000000000000000000000000000000000000000003e8a000000000000000000000000000000000000000000000000000000000000003e8f9011c94ee9170abfbf9421ad6dd07f6bdec9d89f2b581e0f863a01b11dcf133cc240f682dab2d3a8e4cd35c5da8c9cf99adac4336f8512584c5ada000000000000000000000000000000000000000000000000000000000000003e8a00000000000000000000000000000000000000000000000000000000000000001b8a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004b000f000000000000000100d184c103f7acc340847eee82a0b909e3358bc28d440edffa1352b13227e8ee646f3ea37456dec701345772617070656420457468657210574554481235003511000000000000000000000000000000000000000000f858948cf6147918a5cbb672703f879f385036f8793a24e1a01449abf21e49fd025f33495e77f7b1461caefdd3d4bb646424a3f445c4576a5ba0000000000000000000000000440edffa1352b13227e8ee646f3ea37456dec701").to_vec(), - ]), - } - ) - } - - pub fn get_message_verification_header() -> CompactExecutionHeader { - CompactExecutionHeader { - parent_hash: hex!("04a7f6ab8282203562c62f38b0ab41d32aaebe2c7ea687702b463148a6429e04") - .into(), - block_number: 55, - state_root: hex!("894d968712976d613519f973a317cb0781c7b039c89f27ea2b7ca193f7befdb3") - .into(), - receipts_root: hex!("cf0d1c1ba57d1e0edfb59786c7e30c2b7e12bd54612b00cd21c4eaeecedf44fb") - .into(), - } - } } -#[cfg(feature = "beacon-spec-mainnet")] +#[cfg(not(feature = "beacon-spec-minimal"))] pub mod mainnet { use super::*; @@ -237,25 +265,25 @@ pub mod mainnet { } parameter_types! { - pub const ChainForkVersions: ForkVersions = ForkVersions{ + pub const ChainForkVersions: ForkVersions = ForkVersions { genesis: Fork { - version: [0, 0, 16, 32], // 0x00001020 + version: [144, 0, 0, 111], // 0x90000069 epoch: 0, }, altair: Fork { - version: [1, 0, 16, 32], // 0x01001020 - epoch: 36660, + version: [144, 0, 0, 112], // 0x90000070 + epoch: 50, }, bellatrix: Fork { - version: [2, 0, 16, 32], // 0x02001020 - epoch: 112260, + version: [144, 0, 0, 113], // 0x90000071 + epoch: 100, }, capella: Fork { - version: [3, 0, 16, 32], // 0x03001020 - epoch: 162304, + version: [144, 0, 0, 114], // 0x90000072 + epoch: 56832, }, }; - pub const ExecutionHeadersPruneThreshold: u32 = 10; + pub const ExecutionHeadersPruneThreshold: u32 = 8192; } impl ethereum_beacon_client::Config for Test { diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/tests.rs b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/tests.rs index 92a93720ae9..d6346d3aafe 100644 --- a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/tests.rs +++ b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/tests.rs @@ -1,15 +1,28 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: 2023 Snowfork use crate::{ - config::{EPOCHS_PER_SYNC_COMMITTEE_PERIOD, SLOTS_PER_EPOCH}, - functions::compute_period, - mock::minimal::*, - pallet::ExecutionHeaders, - sync_committee_sum, verify_merkle_branch, BeaconHeader, CompactBeaconState, Error, - ExecutionHeaderBuffer, FinalizedBeaconState, LatestExecutionState, LatestFinalizedBlockRoot, - NextSyncCommittee, SyncCommitteePrepared, + functions::compute_period, pallet::ExecutionHeaders, sync_committee_sum, verify_merkle_branch, + BeaconHeader, CompactBeaconState, Error, ExecutionHeaderBuffer, FinalizedBeaconState, + LatestExecutionState, LatestFinalizedBlockRoot, NextSyncCommittee, SyncCommitteePrepared, }; +use crate::mock::{ + get_message_verification_header, get_message_verification_payload, + load_checkpoint_update_fixture, load_execution_header_update_fixture, + load_finalized_header_update_fixture, load_next_finalized_header_update_fixture, + load_next_sync_committee_update_fixture, load_sync_committee_update_fixture, +}; + +#[cfg(feature = "beacon-spec-minimal")] +pub use crate::config::minimal::*; +#[cfg(feature = "beacon-spec-minimal")] +pub use crate::mock::minimal::*; + +#[cfg(not(feature = "beacon-spec-minimal"))] +pub use crate::config::mainnet::*; +#[cfg(not(feature = "beacon-spec-minimal"))] +pub use crate::mock::mainnet::*; + use frame_support::{assert_err, assert_noop, assert_ok}; use hex_literal::hex; use primitives::{ @@ -168,7 +181,7 @@ pub fn verify_merkle_branch_fails_if_depth_and_branch_dont_match() { #[test] pub fn sync_committee_participation_is_supermajority() { let bits = - hex!("bffffffff7f1ffdfcfeffeffbfdffffbfffffdffffefefffdffff7f7ffff77fffdf7bff77ffdf7fffafffffff77fefffeff7effffffff5f7fedfffdfb6ddff7b" + hex!("bffffffff7f1ffdfcfeffeffbfdffffbfffffdffffefefffdffff7f7ffff77fffdf7bff77ffdf7fffafffffff77fefffeff7effffffff5f7fedfffdfb6ddff7b" ); let participation = primitives::decompress_sync_committee_bits::<512, 64>(bits); assert_ok!(EthereumBeaconClient::sync_committee_participation_is_supermajority(&participation)); diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/execution-header-update.mainnet.json b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/execution-header-update.mainnet.json new file mode 100755 index 00000000000..97d498e2d9e --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/execution-header-update.mainnet.json @@ -0,0 +1,50 @@ +{ + "header": { + "slot": 4058654, + "proposer_index": 1039, + "parent_root": "0x758fa0a54047c0221b3107423e78b8910514ba7a0c4250401dac77108dce2ff8", + "state_root": "0x53c79320b4b7649e39a9f07903f4fc68a7cfe7a81cb2e30293dd7b00ee13f69a", + "body_root": "0xa76a7f037f12ee070dcb273d9787b13ff0cf17420a39564a101789318a157ec3" + }, + "ancestry_proof": { + "header_branch": [ + "0xbb6cfda1e02c3117d9fa41c1e1594ce0645352a073ad8b474f83c148e0d9954f", + "0xb44967bd8ff799126cad993ff7369f7a28d60281304d0c7c058e6721b6ce4c61", + "0x0009710ef2467f95542c2e8e7a7249282c08f62aedbe7d21ae4a7af04e1a890d", + "0x7bc5dc20638cfe1cfd5d2547c3efbed4cfb533c76c27d41f723ed876ab9edc3a", + "0x6dcd59a8a041cf2591921417cb8133f0ff5af9bfe1f1ab491e75a751adc9c9e1", + "0x3f25a2852042c7bf2c421bf16c0b9373c1d27ccb1eca4088f8191712481261be", + "0xd1f9cfe1f04031459e5c45f47b2a49c780cabb8ca5b8d76461db2b88c337ed76", + "0x8c37e3119bf7d3cb8208e832669261b0eda1b3c7b11d321760ba1c0649f61416", + "0x1783d3b7041ecb78d9e1f913b82bd335229ca1f2cc5d3cc8dd28c94152e887b4", + "0xe39fc366c951c7cb2100308b0a9417581c46812a7d7e89f516c19863f7686f96", + "0x3c29b6d9b8715dbe5d6831364229efc91ad56ae69e93cb119d5ef4bdc53fcb37", + "0x3cf6fe5e8d91dbaa77e6befa81e04fb25a3e089317d83ff35fc8adfbbf2aab5a", + "0xb41c97cf3b1b4b5bf2999dfb1b3eaeac5c1b12205e9ab0809988e3779d119047" + ], + "finalized_block_root": "0xb4802863fc1d32778211ce6aac8109c73c516a003213f4f5333c80472d08fe4e" + }, + "execution_header": { + "parent_hash": "0x9cffcba69c88a619483e13864704dde5db80e05f8d49018f615395ce09cd24ab", + "fee_recipient": "0xff58d746a67c2e42bcc07d6b3f58406e8837e883", + "state_root": "0x6a4aafc93626778475a416721104229035e91f0db788d0099b57e756cd272f0a", + "receipts_root": "0xe1ce670bdcf9acf4c62fee845cd7e81eabbb6db9ddbff56130020c6cf999a45d", + "logs_bloom": "0xa000980408008000328c1458805c005048b84812c134200090b40428568108a0648090105085100301844800090802484420800d020282019002040d083004031a20420240a4a8900a43296938c040802040220170860210910020036b8c482228c004440300021c82c0400110402a10800582424001c00000828310210020a18130504020790dca716194100880ea5501149104002bc05e189080901c4001010e0a040658a410072021230a5224265030082404000aa11f28162e216636000408842103d41010760972060060000500c20130b000000065401483200081a84934f020020120009618002269c884724616040000840e18080300024490000230", + "prev_randao": "0x5d9ac7ea788ecb534e98bc9079fa0bef199011dadadedaee5dc40e2cd702d664", + "block_number": 5025098, + "gas_limit": 30000000, + "gas_used": 13802943, + "timestamp": 1704437448, + "extra_data": "0x476f65726c69205365706f6c69612d4265706f6c696120513966", + "base_fee_per_gas": 19959019915, + "block_hash": "0x795021134c2b7f9c00b498ff7b0971dbbe061561868f702d8ca68a05e5eb5a99", + "transactions_root": "0x3cb7c92fde5d511cc90cd67e375c4388794f4c01e375e8e8a06d003b5593fd12", + "withdrawals_root": "0x5f5155fd8e5cd24b7ecb1e039792b0caff01dfda2990786d9ffc88325b5d1ea8" + }, + "execution_branch": [ + "0x85ff3d1c2bc3dcdd5543bcd29a1224c6a8c24875224fbb1e3b69f0515ffaacda", + "0x336488033fe5f3ef4ccc12af07b9370b92e553e35ecb4a337a1b1c0e4afe1e0e", + "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71", + "0xfe1fa7acd413c54ebd394126ade19fc624ad9e4c60792d54ff3d60b07076b76d" + ] +} \ No newline at end of file diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/finalized-header-update.mainnet.json b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/finalized-header-update.mainnet.json new file mode 100755 index 00000000000..49434dee72d --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/finalized-header-update.mainnet.json @@ -0,0 +1,38 @@ +{ + "attested_header": { + "slot": 4058720, + "proposer_index": 1088, + "parent_root": "0x37c7398a391c71da07258b48f41d4caaaf891fdf558e110b9c25db716fa8ff55", + "state_root": "0x6cf68a66c993f1c27f499e054a5fbd7c0e625c34ea0057fda9691c561e990002", + "body_root": "0x109e4c0c647d42dba0c8c6569997c51b5bcfc1a33475b1433ded6353f48423ff" + }, + "sync_aggregate": { + "sync_committee_bits": "0xffffffffff7bfdfffff7fffff1effffef7f9ffbdfdffffffdffbfffbbf7ffffffffffefdf7ffbeffdffef7bfffffffffffbffffffffffbffffffffffffffdfda", + "sync_committee_signature": "0xb5727bad1db101b6f0fd7ec4cb79b43dae90366fe0cae31a62439388eb03ebd75732cee3bde51f814203a4c0f5b23898120cd0870f0e662bdf0f85a048b534d9a906e6d32a65df019059d34f724221075734ec2849c09679febecf6929934f09" + }, + "signature_slot": 4058721, + "next_sync_committee_update": null, + "finalized_header": { + "slot": 4058656, + "proposer_index": 810, + "parent_root": "0xbb6cfda1e02c3117d9fa41c1e1594ce0645352a073ad8b474f83c148e0d9954f", + "state_root": "0xf938f0f0cba85234afbaace20545134c70b35e6ff9f74d944b0fea309109f3cf", + "body_root": "0xcf6a7a6f653cb64b2b910278a478339b34eb08abf00e0766d10c7a8fe9bdb139" + }, + "finality_branch": [ + "0x71ef010000000000000000000000000000000000000000000000000000000000", + "0x3d4be5d019ba15ea3ef304a83b8a067f2e79f46a3fac8069306a6c814a0a35eb", + "0xa2e2a28c0bb0ad56c25f3c461a4bfe4f3b3b894bc0105a62e85f43a4ae1adc3f", + "0xaa2bad8cf9b0433d3d79bc5b95c067048b018d1d2ffd0c66db6e7cf86e0a314e", + "0x027f238235d07ac9757543c19deabe1d553d6fc110e8bea4b037b1fab263b4dc", + "0x7dfa1cc1907e8927295f78a770bf86b28f5c2bddcac38beb3b4beb265ff5608f" + ], + "block_roots_root": "0x4a5a57fb0769443f6472f59dbb78d7a9a69ff61d09aa89d5da645d634ec46a14", + "block_roots_branch": [ + "0xa09ad7f3afd681bb6fd54abba339549f3b601beedea79a5b7d448b1cf1e1613e", + "0xacdfd4d5eba154f118a84af7a2d17ba6100fcd9c24fc235e927f584a5b56e32f", + "0x36ca106eac009ed605e680415b105b3a6591830c38034511f300aae44802235f", + "0x171561a9e1afb413132d0f4d3cbbd810766c151be32ec9f2d609f40aef9e2588", + "0x7cd963eba3fb57ee5ce37ee4b621d24fc14d642e32f48dc48ade528e11458ab9" + ] +} \ No newline at end of file diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/initial-checkpoint.mainnet.json b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/initial-checkpoint.mainnet.json new file mode 100755 index 00000000000..1f0f837f596 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/initial-checkpoint.mainnet.json @@ -0,0 +1,542 @@ +{ + "header": { + "slot": 4058624, + "proposer_index": 631, + "parent_root": "0x4abadda13b61df8d40fcb061d1ec15d0fb7bc5144252bb54c57b41893b642bf3", + "state_root": "0x6fe9fa01a04dcdeaa64eba04a72fa6dbadc8596dc5ec1fff2ef343520fe722e1", + "body_root": "0x6cd83df0ee7669e06e64496a1d2be083bc3bb9f2da17e9b1e62979d200328106" + }, + "current_sync_committee": { + "pubkeys": [ + "0xa13bf1fc1826b61cceefcc941c5a4865cefdfa6c91e5223308fa6a0aa6e7b13a0499a63edf5d9fff48fdeae83e38dcbf", + "0xb3285148b91dab139b053442bdd14d627ba1e1250fe469f0f2df854b6e6ff4a18671ae3879ec9f7d8091f99f092162e9", + "0xb00d95908e72c6051478a422eb2231b5f797c2fa5c696ed1e6b9c9996ba1d8236f512443f18c01ce63312c38fa383fd4", + "0xa866633b4293e726accf6e97ac90c1898cac83e8531a25b50ae99f0ecb477a692e6a5f2488447ccd83ed869ab5abc406", + "0xa308ed8737b3a9346ff20dc9f112efccc193472e6fde6aa218ceae11e288bbd2c35fa45c1d8bb238696a96767cd68b46", + "0x81534e2a182da0c6831479c7e722953d267ba9c63a204ac96a178b1dc90d0a6ba8737002688ba5f102eda5669249f114", + "0x87c5670e16a84e27529677881dbedc5c1d6ebb4e4ff58c13ece43d21d5b42dc89470f41059bfa6ebcf18167f97ddacaa", + "0xb37334c41a3456b73b61d0eb0777260af9c2e400bbec0e0c0fdb45c39ce0dd19f021d9760f35da801f20486c6be30e9e", + "0xab73a043ccdfe63437a339e6ee96ef1241264e04dd4d917f6d6bc99396006de54e1e156d38596ba3d15cb1aaa329f8f5", + "0x8983fdebbeba6e3cc3ee1c9feb24faaeee712356975e359b0ddca3f7c9c7448132d665f54a4629002252d3fcf375f7b0", + "0xa03c1e287ccc4d457f5e71e9dc769294835945561e6f236ac7de210d2e614eee8a85e21dfb46e2143c68de22ccee8660", + "0x8e6b888197010ebadd216da35b9716daa8675d93b3c33a96a19fd9ca42624f6b430b2ff115cd0f5b717341605dda24bf", + "0x8fb51e3ef3c1047ae7c527dc24dc8824b2655faff2c4c78da1fcedde48b531d19abaf517363bf30605a87336b8642073", + "0x893272a63650b08e5b8f9b3f17f8547b456192ad649c168bafd7166b4c08c5adf795c508b88fd2425f7be8334592afb2", + "0xa90c42266ca0a65976fb4dc18465b0a44a63ed3b2747cae74e46e3ccf158f98384e2e86c852e7c5556b083b3ded9d243", + "0xb67c621d9b6313a9f6744dfcdd77d4e9cb4bd413fb5e3199cdcd7f675fc39f1ba492860749bfddf98f4088756e844a98", + "0xa9760afaa51002be0948acf7aebd90ec4e60e0dba8456e445aea93408a0468b62bb6da4984b92f8f6061561c9d56f4c4", + "0x981b2d7c56ff38f1d02c5d7a7f8bfe71daaf94d48c3bc93e8083a0a23c1ae1ff05f90312deb09b35d4513c1ffa573d86", + "0x9515dedf061e654d58a43e4e525a63ad2a6274ea6f20b1d624a6ba7d3062ed68a0226eee6951ab8464906c52ba5556b0", + "0x901f724ee1891ca876e5551bd8f4ad4da422576c618465f63d65700c2dd7953496d83abe148c6a4875a46a5a36c218cf", + "0xa8d152e5d94b75cb9e249230db21af31de4d4f3d4ef60ccbf2212babf69aed2a38435a993ee2f13cca410ad55a4875ab", + "0x875ebfe737cea438e967d70ceaffb4360cce28ecc76c8c4ee612c47fb6b3e89af03c66981571066107323f49a6242772", + "0xa798a0371e8cc4dc42ccd79934b0db5a3a59f18a0ae09f2eb172596428fcb3f00312e783d6fd21cbc1610317f44e08cb", + "0x99c629c9cd603a9344b04d22d2bcc06cf45ebf62d97f968df19c73c7a50f4f6a2a2cc7fb633f509f961edfb94fbab94e", + "0x854410e6fb856da8b997ebf28ae2415ce6e1f9f6a4579fad15b5df61709c924a925397b33fe67c89ffad6143a39d756a", + "0xa3969926aa2e52f1a48ac53074b764648b4c71bd43430944679628463cd68398f700d874c14503b53756be451c8ba284", + "0x8ee8873de7cd28a54ba2c63a80b63399effed76b154e96ed26e7c0668b9f2476e298688b6a00c4b2ab9d020a897695d7", + "0xad54241ba3de6a4426c788690d3f78d2eb678814edc49d3fb988d7fc752e43512972567bb384bcc1b18d083d15e376da", + "0x942bee9ee880ac5e2f8ba35518b60890a211974d273b2ae415d34ce842803de7d29a4d26f6ee79c09e910559bdcac6d3", + "0x96b478b1e5e49d4ea3fd97c4846ae0f781dcc9f9ff61ee022ca92c3d8dfba89c513c46e8bb38b73e6b678a79b9b12177", + "0xaad9577501d7f3a5dbac329f2c1fe711710869cc825740f365488fc55a278d687bb72423560f7cb2cbd60546a82ea1e6", + "0x8aa3d9dad1c122b9aed75e3cc94b3a9dab160fa4cad92ebab68a58c0151a5d93f0f6b40b86fba00e63d45bd29a93b982", + "0xa12fc78b8d3334a3eb7b535cd5e648bb030df645cda4e90272a1fc3b368ee43975051bbecc3275d6b1e4600cc07239b0", + "0xab01a7b13c967620d98de736b8ff23d856daa26d5cd8576993ee02a5d694332c0464ed018ebffcd5c71bab5cada850ce", + "0x96cf5760c79cfc830d1d5bd6df6cfd67596bef24e22eed52cee04c290ad418add74e77965ea5748b7f0fb34ee4f43232", + "0x9443e6ba4400fb3370c573cd7e33f05e1475f9cf1d6adb905bee3aff8f1452d8d384c8a72c9110070f35c6aad940bba6", + "0x95c60b5561e53cfc26d620be90f84199ffd6dd9687c1be3a547048e7cba10a0be9bb6da000e7521cbd488d0901d48ee9", + "0xab69cf79750436d310dc3c5e96c2b97003f4394f31dfa8a9ac420595dc7b4d96dad5787d93347ba2bc6f196c241a3dbf", + "0x9145ee1fb6e84114c903819db94fa5a72bcbc15fcb8a7fd8eefba23b156cc46309281dcf78b48a2847b3754f7d7d7a79", + "0xb118f77f99ac947df97e7682f0fb446175185b842380af4ee7394531e4f93002c72b41a57a7c1b923a4f24b10924c84f", + "0xa4aabd1890ebf35423565dbff3477a09eea4e35f5a26ed449eab38e0a21fb89e9ddfe3a2003cddc457db648a1b5891a3", + "0x8ff5d2e6c98b1fea70cb36ea8ed497fd1233b9418948ac58c6c379ed35fb10f8253ef188c909d5e77e81b5b8e2a4ad17", + "0xa23f076306c120dccf69d7d2ac7f83a377a72d35bf448f88feff8b6dba9307fdabf34452e30b87407b2258b9edfd1174", + "0x87d2217eb05d657aba7b048cf3c661b463e78e51135a5b937e71975ff5102e596434720f02349c73415decb88418cb0d", + "0x8bb51b380a8a52d61a94e7b382ff6ce601260fa9b8c5d616764a3df719b382ec43aec9266444a16951e102d8b1fb2f38", + "0xb0053550040ab3a3996cba5caf9ad5718867b5f5df273ed8c6520761571f03a94e50b5f8a6a8c42d725383cce97d3cae", + "0xae50f93230983a82e732903d6ed50a506d678f35b6b4a4b3686a92b12aeb9d34cb095e8562b0900125bbced0359b37de", + "0x8bfa106ada4914419bf1d8900c5981dd5b90c3023196d7e918d62879fc3a575bd0a25f939366f7fd2240df6108b069ec", + "0xb3a5497365bd40a81202b8a94a5e28a8a039cc2e639d73de289294cbda2c0e987c1f9468daba09ea4390f8e4e806f3c8", + "0xb4f583e10aa9af79b4ebd647e0fffe1c720112727e5ffac4313f236737491fceeee194537786c561cd5777b453e5b03c", + "0x826be957cf66db958028fa95655b54b2337f78fb6ef26bd29e2e3a64b130b90521333f31d132c04779e4b23a6b6cd951", + "0xaace45334070c51cc8b3579598d4cd8cda2153bba51f56e3b1fe5e135c83ef70503c322756b9cad9d3cd28f1ecfc8227", + "0x94bb68c8180496472262455fd6ab338697810825fa4e82fc673f3ac2dacfd29ee539ac0bfe97eb39d4ef118db875bab6", + "0xb560c33950a355119845f63defb355807e56773f636fb836f7746155fad070e384fc1091b8e5c057e4cbc7da9275ecf7", + "0x820cc2ac3eed5bce7dc72df2aa3214e71690b91445d8bb1634c0488a671e3669028efbe1eae52f7132bde29b16a020b7", + "0x9244703338879e3ea00663dcde8f11095de3e38df9277d8c2acc26e72021c222ae40bcc91228789fdf0b69acc3144783", + "0x8d474636a638e7b398566a39b3f939a314f1cf88e64d81db0f556ca60951ec1dca1b93e3906a6654ed9ba06f2c31d4ea", + "0x889a5cf9315383bf64dfe88e562d772213c256b0eed15ce27c41c3767c048afe06410d7675e5d59a2302993e7dc45d83", + "0xb544c692b046aad8b6f5c2e3493bc8f638659795f06327fff1e9f4ffc8e9f7abdbf4b7f6fcdfb8fe19654d8fa7d68170", + "0xaefc682f8784b18d36202a069269be7dba8ab67ae3543838e6d473fbc5713d103abcc8da1729a288503b786baac182d3", + "0xa0f2092ac34d2363614fb2f57fc7b72db247eb1fa53f395881ce6b4aacd6fb920d6dc59507701d487288102e4c4fa389", + "0xb33de3de106be61481ccb7f07a7a63cf4d1674010e462388fb8ab5ea08f444ed7a277905207e0b3aa2f00bb9efca984f", + "0x84173aeaf3d96368dc7ca1ad5e5575da279113567e5815a364a0356a720c5e08cb58ca1fdd891924f4871d3eaae5de40", + "0xb6d6482ad7b9b412ffbefbbdcc28eb3d091b1291f54f77bdd53c4ac85f705c454940f466dc272dde7b03c26f0cd6ecb3", + "0xa2053719da2b7501dab42011ae144b3c8d72bd17493181bf3ae79a678068dc3ee2f19d29a60b5a323692c3f684f96392", + "0x8296f8caf58316af535def398a43357e48cb3b1e674b857eba1bd1b970da3dd045e22fe6d17dee4e9117f62ece3ec31c", + "0x84faf4d90edaa6cc837e5e04dc67761084ae24e410345f21923327c9cb5494ffa51b504c89bee168c11250edbdcbe194", + "0x879aea8f09dec92f354e31aa479d00cb77457d363de2d9a51ddf7d734061b6f83d6345cf33dbef22004cd23dd6c4b760", + "0xb8fca0f7bc276f03c526d42df9f88c19b8dc630ad1299689e2d52cd4717bbe5425479b13bdf6e6337c48832e4cd34bb5", + "0xb2a01dc47dd98f089f28eee67ba2f789153516b7d3b47127f430f542869ec42dd8fd4dc83cfbe625c5c40a2d2d0633ea", + "0xa19f2ce14e09ece5972fe5af1c1778b86d2ab6e825eccdb0ac368bb246cfe53433327abfe0c6fa00e0553863d0a8128e", + "0x95d1f944b0c53eb3e9fcd5632713602bbb9195b87a172a370ae2df98504612a55f3968615a39b569ce6a0fe9fb559be7", + "0xae36ab11be96f8c8fcfd75382bb7f4727511596bc08c25814d22f2b894952489d08396b458f7884d6b3c0adb69856a6d", + "0x824d0dc002e158adef06fc38d79b01553be5a3903566029cf0beddb2248b11da40e66feb168e8e3e2a63ea033a75f382", + "0x8f9f85ae6377414fcf8297ed45a736210cd3803f54f33116b0f290b853dc61e99ea08f3c422ed9bc6bdc2f42ab4f56ba", + "0x86c53fc078846c3d9bc47682506f8285ba4551475921fd388b96291741970c34b8de4210202e40d2de4acb6e2892072b", + "0x853184f246d098139230962e511585368b44d46a115c5f06ccaeef746773951bead595fb6246c69975496bac61b42a4f", + "0xb91b4260e2884bae9778fe29a2c1e4525e4663ec004159def5d47320de304c96d2a33ad7a670e05acf90cbba3efdd4d9", + "0x83492e27e07e35c0836aee6bee95d040b8d3e82db6f94a3917d07797800f7200f5dbc6c9596c6c3c70f8f470b65a9b6e", + "0xb1bb33607d10ea8c954064ecb00c1f02b446355ef73763a122f43b9ea42cd5650b54c5c9d1cfa81d4a421d17a0a451aa", + "0x99cb1728157a1b7cdd9607cf15911bbcb56b64d52fb0d0117b457853a81ec55913f977850f26e188fa2652579efe9ddf", + "0x8b7cb5b8de09a6dfceddcbaa498bc65f86297bcf95d107880c08854ed2289441a67721340285cfe1749c62e8ef0f3c58", + "0xb97447233c8b97a8654749a840f12dab6764209c3a033154e045c76e0c8ed93b89788aac5cd1e24ed4a18c36de3fbf60", + "0xb4790910e2cbef848448f24f63e9dd4a1b122cf65feecf152d5fde282ad6fcc6ea3f9cc23178baf85612020795e4b13a", + "0x81fc724846b5781f3736795c32b217458bb29972af36cc4483dd98ab91680d3d9bc18842db2661487d3a85430dc9e326", + "0xa154892ff23b284040e623bba940a6a1ef1207b8b089fc699cb152b00bcce220464502cfa1dfb5a2f62e6f3960cdf349", + "0xaf3f765fd293c253072b33a780ed68933f78d7e079d9a2079b6232755bedf6ebcbce9ba65c01f695602fa8ee17899867", + "0x97578474be98726192cb0eac3cb9195a54c7315e9c619d5c44c56b3f98671636c383416f73605d4ea7ca9fbeff8dd699", + "0x917c4fd52538d34c26ccdd816e54ebea09517712aa74cec68a2e3d759c6a69b5ccb4089ad1e0b988e916b2ce9f5c8918", + "0x8cf3c29531a17489a5f8232d56c5251ffddc95be3ff7ff61472e19fb38c5eaec841ef3b1ee36756b3dd8ff71ae199982", + "0x96d4b9b411319e531bab6af55c13f0adb1dd6b4286784ff807f283e7990dc368c16d536fc5db3d992deb4b0278914e6f", + "0x8903f7e0c9764ce844b15d84feea04406dc66b195a5f82ff4027f27361e11cf368538137d139368f5a6f42876b04f056", + "0xa4047173b5906c9b4292aaee1e91d9080ae74b1d3eb990449ed1f96bf22c3ee80f4915361e5bf7dccce24ae1618dae77", + "0xa4c4b96071e7bc92e41defba3507ddf423d93f3a94271b1f9812dfc4660e4c9fd24e0dd7aef324c46deb8d7a7c97eaa4", + "0x8289b65d6245fde8a768ce48d7c4cc7d861880ff5ff1b110db6b7e1ffbfdc5eadff0b172ba79fd426458811f2b7095eb", + "0xab4119eef94133198adb684b81f5e90070d3ca8f578c4c6c3d07de592a9af4e9fa18314db825f4c31cea1e2c7c62ed87", + "0xa3ffc3dad920d41ec3f4c39743ef571bcabb4430465d9aa811d0f0a7daa12bee4ed256527d16a6e937bf709ebb560ebd", + "0x8553748da4e0b695967e843277d0f6efeb8ba24b44aa9fa3230f4b731caec6ed5e87d3a2fcd31d8ee206e2e4414d6cf4", + "0xb15e1b4ac64bafbc4fdfead9aeff126bf102fdd125c1c914f7979680ec1715fbeccf3dc35c77d284421ec1371ed8bc32", + "0x9377aab082c8ae33b26519d6a8c3f586c7c7fccc96ec29a6f698b67d72d9266ad07378ba90d18e8c86a2ec77ecc7f137", + "0xb71c11828ecad7731136cb1f5b80392a4add8d62f8866a781fdde797a201ebf6d483b2348aacbea2061a5108933b757d", + "0x86793899ef71740ab2ec221d0085701f7909251b1cf59a276c8d629492f9ef15fc0b471beedc446a25b777391ab00718", + "0x8100b48ac2785477a123a7967bfcea8bacef59391680a411692880098a08771ff9786bd3b8dfb034cae00d5a7665621c", + "0x8b027c14affe47f83ee59b504d83b2fd2d9303de2c03ee59d169bb199d9f4bd6533d7f8c812dd7a6f1e8155e3e185689", + "0x9615800f8c95f95bf25055ae079b964e0a64fa0176cc98da272662014f57e7cd2745929daf838df0094b9f54be18b415", + "0x951aa38464912a29df2101c60771d6de7fadb63f2db3f13527f8bdacb66e9e8a97aaac7b81b19e3d1025b54e2c8facff", + "0xa0e68d24f784fcb2b71acc2d5871285623c829d0e939146b145e04908b904468a67c07a2f156e6b17bf531adc5777c4b", + "0x86a533b02ae929f67c301649a2d58651b98cdffe731b63fa32aa1013c271634bbb088c0d02865913c11bbb1bf57c0e12", + "0x81f145ebb9a5674a5b052d0e9059acc8f8ab612dd9f54d43ff620202606e19a86a9b284dc6480d555a030e5fefee8c50", + "0xa698b04227e8593a6fed6a1f6f6d1eafe186b9e73f87e42e7997f264d97225165c3f76e929a3c562ec93ee2babe953ed", + "0xb3180ded54610b1b3a2db7db539197ced6a75e9bb381d1f4b802ca7cd450f5418522ad2bee3df1956ed63ff1ffe95dc1", + "0x86fa3d4b60e8282827115c50b1b49b29a371b52aa9c9b8f83cd5268b535859f86e1a60aade6bf4f52e234777bea30bda", + "0x97d076617cf0a64ab3d1f030cfd72a303b6b252c0a7b96157ff7fc8af5970f00d14492c46e8f6f37caafe837d0dc95c7", + "0xac2c98a0ab3f9d041fc115d9be4a6c77bd2219bb4b851cbee0d9257a4de5791251735b5b8fad09c55d16eb0d97080eff", + "0xace7fda25c2fb7c18710603c16a0ff0f963352d1582a42a20c9f5603c66f485df8383465c35c31e8379b4cb2ec15b4c4", + "0xa07b35ec8d6849e95cbd89645283050882209617a3bb53eae0149d78a60dbf8c1626d7af498e363025896febdba86ee7", + "0xb2fc4478830f2ae4234569346d80b59899247c609b75bd2190a896498539e1f30dca5edbad69f0224918d09f0d7eb332", + "0x84926cf2265981e5531d90d8f2da1041cb73bdb1a7e11eb8ab21dbe94fefad5bbd674f6cafbcaa597480567edf0b2029", + "0xb5f32034d0f66bcbccefe2a177a60f31132d98c0899aa1ffff5ebf807546ff3104103077b1435fa6587bfe3e67ac0266", + "0x938206740a33d82ffda3e01598216324731335d367965aa0b740486d60ba2e86a4ecd546851046a61a4b0fc88295b5cb", + "0xad2b1ab32161e37ee553e3787f05f9281073d7ef7d0ae035daa353bc83da8ef8c76c99ad2928463c7c708f7404020476", + "0x94f4720c194e7ea4232048b0af18b8a920fde7b82869e2abcc7e14a9906530be1ef61132884bb159df019e66d83a0315", + "0xa26dd9b28564c3d95679aca03e3432ac26e287f80e870714c5946b05538b3cb43bba7b85c16bceb5430e81b7a04c1b1d", + "0x8ef0930db046c45ca5c69d565d54681d2b6d249e27092736aee582b29de3aac3fd96e1066a57cadd851b4e5334261594", + "0x92096ebf98ebac5c82345d3ef0db0f5a14af23ceea73279087426b281d6701997fe131fe65a7df7d624b4ff91d997ae8", + "0x81c850f419cf426223fc976032883d87daed6d8a505f652e363a10c7387c8946abee55cf9f71a9181b066f1cde353993", + "0x97070a33393a7c9ce99c51a7811b41d477d57086e7255f7647fd369de9d40baed63ce1ea23ad82b6412e79f364c2d9a3", + "0xa99cde5c7c85ae291c74c893e598cc0e6eb2dda2a81dbb504a638eb21dd2c41d6e5caf7baa29e3c1c32e94dca0d791f1", + "0x937ccbf8cd19b82af2755b4856cfcca3d791e33ae37e4881982ea89d3b21d205a9402d754fac63037243e699484d21f6", + "0xad7dca7640444f1268f03b67544815d4366c6a4a2f0d25ee78f3361c63095416216fd31aa0bcce7448cdd7ba73a6344e", + "0x84991ca8ef255610ebc6aff6d66ea413a768e4d3a7764750fd02b5cd4735d41df399b36e87647fc83cf73421a39d09e9", + "0x91215fc3f7243638733fe293dab7029e0c4275550102acf5f1638773cf8f8ef2c53ffa5bdfc1b602c269a2b5ab164b7a", + "0xaa6cfb3a25f4d06c3ce1e8fd87496a74a5b951ab72557472a181a2e278c5e982d290dd4facf40bd2f4f8be62263dadb0", + "0xac9f29ad08aaf27581fe1f12e210ad4ac6011507fe3100763a4120f9e439f3c6d191f3fb55aadf58bd865cfd4406c68e", + "0x87c6cb9ca628d4081000bc6c71425b95570291eb32ef2cf62416bd1ce3666eb2ce54accd69f79d506cefbfe6feb5a1da", + "0x93042dd42e56671155bb40d85d9d56f42caf27bd965c6a7a7948b39089dba8487d4d5fd30522dba6ba392964e3ffd590", + "0xa76adeddf2454d131c91d5e2e3a464ef5d3c40ee6a2ab95e70ef2e49e0920d24f9b09276250ed7b29851affbdbc7885a", + "0x92a488068e1b70bf01e6e417f81e1dc3bcec71d51e7eabbc53b6736e8afdb8b67d191940fe09c55783be9210e1cbd73c", + "0x8180ffffb5abe78c38f2a42a3b7f1a408a6d70d3f698d047d5f1eef3018068256110fcb9fb028c8bdccbc22c0a4c3a20", + "0xa50ab79cf3f6777a45f28d1b5cdad2c7ea718c60efeeb4c828d6307b29ef319445e6a9f98aa90f351c78b496575150c1", + "0xa4632399c1a813e41fb2055ef293466098ea7752a9d3722d019aa01620f8c5ecdc5954f176c6c0901a770cbe6990eb11", + "0x83bf5055d6332009c060fd50b8dc698d42b764b079c90a1fad8a83101f8dd1cc27acb27dc9d1c25ac8d3db4107471b4a", + "0x8c432e044af778fb5e5e5677dbd29cd52d6574a66b09b0cd6e2a5812e71c91559c3f257587bfc557b4b072a822973a60", + "0x8368a0f17c8427beb71dbf11a09a2fe8495a33f08c29c74a9a996a88aa01c0a09f9555abeb1ef1592cab99a9e05875cf", + "0xa8795e7f4c4c5d025ead0077c3aa374daaf9858f1025c0d3024d72f5d6c03355ae6ac7418bf0757fe49c220acff89f7f", + "0xa6d9f67ca319ea9de50c3fed513269b83fa067977adfd1e9d9ee07ad61b2ac1de64a39d7b6897ab55870cf982fe481dd", + "0x86b3a4ea9b1fde00cce79d5ae480353d60cb6ddce363c535bbbc3e41a4b8e39fcf2978eb430091ae1b10420d43193971", + "0x90fb5cac22a22fb8a6b619f1eacd95873be974d4d5d1f7080e523bb9b4b2644eda7340d780bd1ea8ce36407ca0410fea", + "0xb5036d4c241685bcd67156e4ab0eba42b97f639947d54b17af2c88fbcc5fc57359c7df4bc7f8df955a524fb1501a6fda", + "0xb1c56f028f31f0ff86bdf55788703b4d809becaf3e4d9d349f1b660a07d2f15e127eb72a0e2a5a2742313785a3de43a5", + "0xa3e909196f447e492200cc67000c5d7f0f585fb98e966cf9bf08257597fea8d92a90ceb054d4b5553d561330b5d0c89a", + "0x87cac423d0847ee3547f45ac5babf53bddb154814e291f368cbb62ddd4f2c6f18d77a1c39fddb482befe1a0e77d5b7fd", + "0x8605b88ce23190b1fa9d389b15e6907417239a72b97673d1479c4ccb8f4515c7921d14537775c74e738a9c3f122b1443", + "0x87587504e819bc7f0349705a05c15e8504fd6b2c25c3fd264096cdb7aaa22d8078da776215925d9d775a7f9355b6f0c0", + "0xafba279768f0f928b864645aa4e491e9c949bf3dab57efa24eeaa1a9a7d4d5a53c840019354068e64c65a2f5889b8f3c", + "0x86b1cdd26ea9a3ae04d31a0b34aa3edc9e8d038437152214d195381173e79e4ccf7f8f0ce9801086724a1c927c20e4c8", + "0x812d3ded3a3c9e58eecf13a29bb4cc13b01b2a0af322423a29bb0e4f6d9021d1d87ac4af7a2a6b88d34f44a8bc1b3c55", + "0xa988cfed9f481bc98beb5fc188ed3f6893a3ebba27c3ebace669792f6abf0997727023c3b6930a6421224f5b257b8b49", + "0xa38c974b57da968f0c4611f5d85d8014fd48594c8cd763ef2f721cfd2c738e828d41ff029e3591d7447e3125641db8ef", + "0x880b4ef2b278e1b2cccf36a3b5b7fbce94f106ed9fa2820cb9099a7a540a57e9fdeef5c0fb0a743049828fc2b8c46163", + "0x96e7d1bbd42195360267c2a324b4d9bccad3231ed8a7f070278472a90371867e2ef2c29c9979a1ec6e194893afd992df", + "0xa92beb343caf6a945990adcf84302c55d1fccdef96c34a21f2c00d3e206a9b2c6c6b412f66e5d4fafe26ef6446cde705", + "0xaa48afa77d5a81cd967b285c0035e941ca6d783493e1840d7cbc0f2829a114ace9146a8fbe31ecbd8e63e9b3c216a8c5", + "0x893a2d97ae067202c8401f626ab3938b135110105b719b94b8d54b56e9158665e96d8096effe9b15c5a40c6701b83c41", + "0xb614910b247c6ade31001b0435686c3026b425b9bff80b6c23df81c55968633349e1408a9a5a9398a7d5d6ed5d9d3835", + "0x991c660e4d476ad92aa32ef2c5b27669ab84026eeb5ca70af69bbbcd8ebc0a8fec17843423306edc78b4436629d55c25", + "0xb926a21f555c296603dc9e24e176243199a533914f48994b20abca16f19c30cfd0baf319268139fe3f83ce69afdc324d", + "0x8e70e4867d2731901d603928d72bbeb34b2e0339a4f5cf06e7a771640717421b4ea039c61dde951582a28c2ff152ff70", + "0x95aafa379cc6a2b4bdd0cad30b7f0a47839952af41f584219ec201c6c4d54610eb2c04b67b29080acb8cecc5e7543fbc", + "0x8465bd8be9bd9c2c6116d4ae44ec6618c109cb9aaee2d241e7a6ed906d398ef15a6fc18bc8b1d3398184241405954bba", + "0xb455f751232de0a48440d09983f4f4718b6169907979c9f282acf7177ab5b1f338fe1f2acd8d0bee4b4aad61d0340839", + "0x970df2314849c27daa16c6845f95b7be178c034d795b00a5b6757cc2f43c4c8d8c2e4d082bec28d58dd4de0cb5718d61", + "0x8d52413f981bc611427ad0534d25e914113d0ebcd6960aab6421608bec6648b89ae4b2ca2153c57d3cf4f1f37212aa5c", + "0xb7ac87da14b783914ab2e914fb7b536893b7a650cdc5baa1f3b4aca9da77b93a3336671335250e6467a8cd4aa8dc61e9", + "0xb37a2ec9dec3d7d9cbc911fa1e5310a47d23a841d02c8b99a923991c73fc0185d130a494748c64f2b5a4c07bcd06920e", + "0x86108b661fb2c363adcca84c114c83346413df748b959015c018452cfac14890bf585dc0a646d68727cc3cdfd2b61897", + "0x8421044f794a1bcb497de6d8705f57faaba7f70632f99982e1c66b7e7403a4fb10d9ef5fb2877b66da72fd556fd6ffb0", + "0x84d2eb008578aebd6f01254b7e46584c1524e6fd7a5a2ae5fa0ea560865ca50d52290cf2d12dd20b042f402e62181b4d", + "0x8d6bed5f6b3f47b1428f00c306df550784cd24212ebac7e6384a0b1226ab50129c0341d0a10d990bd59b229869e7665a", + "0x80e30cabe1b6b4c3454bc8632b9ba068a0bcfd20ce5b6d44c8b1e2e39cbe84792fd96c51cf45cf9855c847dc92ce9437", + "0xb7e74ab2b379ceb9e660087ee2160dafe1e36926dfab1d321a001a9c5adde6c60cd48c6da146d8adfa2bd33162eeaf1a", + "0xa2b1ea43f51460b3cb83657b4e296944658945d3ad6ae7b392e60f40829ba1da6a812d89f0380474578cbd0ab09801ac", + "0x91ead7dacf43905eb5d4b179af29f945479ed074126bad3b5a2bbc1663af5f664fe53a36684e9389ab5819e53f1344fc", + "0x927c030d5a69f0908c08f95715f7a8d1e33bed5e95fc4cfb17f7743cb0262755b1e6b56d409adcfb7351b2706c964d3b", + "0x883f38af3b2c1d50f6e7c515a5e02468d76890f6e669f7acd2df89365862fa65877095deb001b4e2868bc5b59439dbb1", + "0xa0ebae60a998907a19baa396ae5a82bfe6aa22cf71bfca4e1b4df7d297bd9367bbeb2463bda37aa852ad8fd51803e482", + "0x8ae80eeaed3fc456f8a25c2176bd09f52a2546d45d77a70f48a9e30aa29e35ff561c510ae1f64e476e4a0f330b9fdbdd", + "0xa7be457b8bc1bfde4865a35b7b1826118edba213b0f0d3cf5d877267cc1559cabe61cefb1e300142a978c29676036179", + "0xaf51da717d2a45ab96fad5d9317ea867ec4c6a411af6fabd72e568230099a04c036a0f114158815b1a75da6474dc892a", + "0xb549cef11bf7c8bcf4bb11e5cdf5a289fc4bf145826e96a446fb4c729a2c839a4d8d38629cc599eda7efa05f3cf3425b", + "0x8d264fbfeeebb6c4df37ff02224e75e245e508f53fb3446192cd786ecf10d0f704c4fc2e53e7f7318ae1407e46fc0fb8", + "0xac3195143035cdb4ddcd5f93c150035d327addee5503ea2087b1a10b2f73b02453ddd1a94d8e7d883e365f9f0e3c38c9", + "0xacbb398ea9d782388c834cf7b3d95b9ff80ee2a8d072acae8f9979595910849e657889b994531c949d2601b3ce7b235d", + "0x811e6a5478f708495addbb1445a2ef23e39ee90287f3a23ecd3d57d4b844e4f85b828bae8fa0f1893dfcc456f86f7889", + "0x8cde690247d4831dfe312145ae879f4e53cb26641b3a3bb9eb4d590c56c11ece3cfe77180bd809468df5cddaea4f5ab1", + "0xb42578df29a9eb23bed91db6a1698df49654d2bc1b0d7973b2a7e300e9cf32e0e6ac464d463d4d26e394e7598239c4bf", + "0x97ffcbf88b668cde86b2839c7f14d19cb7f634a4cf05d977e65f3cd0e8051b2670e521ae74edc572d88201cff225e38a", + "0xa322b5d2a6e3cb98b8aaa4c068e097188affef5dec2f08c3e9ce29e73687340d4e5a743a8be5f10e138f9cabbe0c7211", + "0xa076ea1084b7a1a33115ef62d6524f36e7820579868763a6ed1f8bce468f150cbfbf0ed04be2487aaa34100d828b0db6", + "0x944259a56e3b4f745996289912740281bde47e22705f142c2a483ffd701e780f51a01b177d2494dc8db9e69157f45d44", + "0x91cb79d52951d1b901e4a686bf4ad587e31db57ea5af6ffeb93eeafae3929879c386ddec860f803c2dc61055437e6bee", + "0x91efdbcaad9931312d7c41d24de977f94d7f3f7b88090a1f72d9a097a1e30cc805c5ea16180f463022d9b26b8863f958", + "0xb26f5ed09f7d5bb640ec94ddd1df0b76466f69a943b4699f53d45296d5d6b8010bb61477539bc377d1a673d89074d22f", + "0x80822499f96a1a8c0048f01f389dfcaaa5d8269c332dbb507fe46f270bcfd5f67c53f827fd867221592dbde77b6b37ab", + "0x8860ba25d5530cb8585975d8013a1c2d5b0f0f96066044fdc43ed13488ae44e379c624ff6993a18cb6e037809d7985e7", + "0x999d1c44e14184349064415ae28a149b3b11aba5baab6792744378d14df554a3625fac82038eaca920064822294dd513", + "0xa62c2e7c692403e874a16e08e46a067e19dd561993ca07ff79cecb53c753763b3e49d372638c96c0a8c921bfa0798a0c", + "0xa1c84730a5c41dcab9a5ef9e1508a48213dbc69b00c8f814baf3f5e676355fc0b432d58a23ad542b55b527a3909b3af6", + "0xa1c0c317e6e352e16e25c140820b927161ce5d2c4c2e10bca3057ba4d46b4f42ad7aba20de86dad9fc6368ea92695268", + "0x85c216e314eb7bd8ba02e092c90e132bc4bafb21c6a0fbe058b0dd4272cb76f183b83c6783fc321786065ff78c95f952", + "0x8e8f63ec8f4f1f7fcc61f893b671710c3c17f9d2d26c5c6ca40e671bd4b252bc0cc1655e6780d2ddcf2915d8f623b9a4", + "0xaaeb0005d77e120ef764f1764967833cba61f2b30b0e9fed1d3f0c90b5ad6588646b8153bdf1d66707ac2e59fd4a2671", + "0x92ff79402d5005d463006e0a6991eaacc3136c4823487d912cc7eec1fe9f61caf24cd10022afdab5f6b4f85bfb3eee4f", + "0xa32a5bd9b7bec31dd138c44d8365186b9323afbba359550414a01e1cdb529426bfa0b6f7daaf3536e9402821faa80003", + "0x845982c2672fdd44b33d2e56ad676e704c02f756b09e8765bea42b924c14724484567b55f0db42ac20cb70a7f5201c14", + "0x89cd9f6ae7d9a9ff2b4db916ba3af9fe700fcfbd16577bf73a965af938e8cf633020466b0298d3c31300360aa6851af2", + "0x8fa2d7b22af8e6b82679ebdfa13efdcb34289a554653ea6c1b16efb9f957f7fe64df787e7b03d8cdc8a732b91c916bd1", + "0x94f327bc57ed1ce88ce4504b4810cc8af5bd21a7e07b280a7866ce08e39b6cf7a6560bf73a5f10671271624cd7893970", + "0x90f4476224b64c2a5333198a4300ece8b3a59ae315469b23fd98dadcdceaaf38642d2076e9cd0bfacc515306f807819f", + "0xae0db78548261216ad7d6a7ed4e6089ee17b3fa311494b2f2c559e215cd3de7e5f3a781a49dcff428a8a61c2a4f49a19", + "0xa83371f44e007c708dc4bcafa7bd3581f9080a4583c9be88624265014fd92f060127e628de5af3c442a25f049c7e7766", + "0xb471c72bd2971353f4b44248b8e6cf5316812861a88ccfc20fd0d89a5e010428c387228b2f6f14c12f79e31afc9d0753", + "0x8962afddcb1a26cc8ccd3c993109e79a4dd747ca473b8b5ef93d9c2e71d29623b834ac945074acf118248e3ae7878a6c", + "0xaa0940e4e5586e79a3d97397c8aff3d112c6f759d2efac29366acc5b5c6a7cfef8d50516bf309da8b787de265dc8deda", + "0xa211120e1bb3b10138df1fa58efb009a298b8771f884b82bb3de15822b1252124a68f3980f96122a775fb96f05ddc3d5", + "0xa1047401598b1e6e2613d746bb4689e0406eccdbadf319a6609a3261cd09deec215d90eba6d0ddc50dd3787d60104e7f", + "0x96791b2b8066b155de0b57a2e4b814bc9b6b7c5a1db3d2475a2183b09f9dcd9c6f273e2b0c922a23d1cf049a6ce602a3", + "0x91013e0d537fb085a49bf1aa3b727239b3e2c1d74c0f52050ff066982d23d5ee6104e70b533047b685e8b1529a0f14dc", + "0xaa65c11071be23c9bddaa5203f3166e5cf043efe5fb8f4b26f8a9cabe71db701a450e79eb001c401da5752755d9cf1af", + "0x8645cc44d180c18a6d8f57ba57bae05879451997533cfe558cad4d3d586caec877e348915e32a09ee73483283c4df744", + "0x8eafbb7002f5bc4cea23e7b1ba1ec10558de447c7b3e209b77f4df7b042804a07bb27c85d76aea591fa5693542c070de", + "0x919c81bd1f3d9918e121e4793690f9ddd96c925ae928536322d4b98132f21979c1f34731d393f0ae6e0871af4355a8ad", + "0x98181e9291622f3f3f72937c3828cee9a1661ca522250dfbbe1c39cda23b23be5b6e970faf400c6c7f15c9ca1d563868", + "0x8f44c43b80a3c5f488118859fab054745cfe5b0824821944b82fcf870fda6d93489ea9ca4220c24db2f4ad09c6080cb7", + "0xa683d4865ddcc099f7b698153007b92f853b80f49b3be75163ea8cd1f8ff584b43a68e68de3ae61cda8ad4b41f355c87", + "0x942772b7c7c47d4e5957ccf1d6f1450070930af3e2b7eaab0dd7699372445df0cc910e6c0efcf501887dd1adabdaee23", + "0x805c06e565ee67cab0cbccb92b6656fdb240b430766eade3c6b0a0b1b93c840e2b4f028601451dca135c783239463880", + "0x84d3e2a06e16ced26094b356a16a4fb6aad50ad9ab23ef804a5852a33ef0bff76f3c5fbf7beb062376c2e669cb598679", + "0x803df08aa745cc3c0a799f3a91bb6ed423cd520c9d255d36c21bed1a0c3b12e8cad32f54da09dadca97683e9548fba91", + "0xaa2c3ef95b8d4265f01666129646004b6950d3e8ce74b4ca12aa3b90fbb445079a569178df772c272463a44d48922b8f", + "0xb0a4c136fb93594913ffcebba98ee1cdf7bc60ad175af0bc2fb1afe7314524bbb85f620dd101e9af765588b7b4bf51d0", + "0x93e4c18896f3ebbbf3cdb5ca6b346e1a76bee6897f927f081d477993eefbc54bbdfaddc871a90d5e96bc445e1cfce24e", + "0x89019e9550648962420984e9fd03597a854ae824567d9aa6cd5db01a4616b4e1477230f2d1362a2d307e2425a3eeb898", + "0x861b710d5ec8ce873e921655a2ca877429e34d432643f65d50e8b2669929be40a9ce11c6353b0ada1fe115e45396b2b7", + "0x88554c83648ea97dac83d806cd81d92531980346b208d281fba489da15a0084fd4d9a00591d1ca67aad3c5793685d55f", + "0x851fcadebee06930186f35293feefd40d7daedec9b94e6fe5967536c2c0e4cc68f58d3f5fbc76f1e77b90c9580074f98", + "0xb96a11048c7c327709d52e72e6f6ed0b7653329a374ea341ad909311b5b303e5629d6dcf11dcdb195e8c7592ceefac21", + "0x836075979eaf386ff6cb459cfd48fed171ae812b0ac3b38dc24dd8ca905cac1c600be717d4a0defa0a854f40cfaf8c33", + "0x90fc170529bcc0b80c46a53fffd8323fd2cc5cfa9b75ea4d36db21bd1f198335ad2bfa87f8990cf9cd9fd7989ecca718", + "0xb7eb6a49bf8f942dd8c37c41c1b35df43e4536e07ca9f4c1cfbbf8a8c03f84c54c1a0d8e901c49de526900aeac0f922f", + "0xaf6911edd6c7ad30f905a0a3f78634808832fdeb4206b006934822d673bcced8e378779261b3c4b772b34b8871987f57", + "0xa74d240d0d7ea0afe68813fab55388d77e75eca0519d21771dcb7170cedb11dc14b237b26c5ae1f7f728b52e5ec0f02d", + "0xa7b86e4f1366da44fd59a3ee68018a99c23ba3588789463bd88b0177a9b94030b58cb879a506e64421af966f261eaa86", + "0xad8d94e46cc02a1c0ad27105e8f672ec15b8296051801f1918d0bd470625686e8e8a0abde8f6852b846ee8d9132b26bc", + "0x980508c4d1e655cc6200f89a884b3a25c0c05708a3e4a101205c4fd901c3e20a943071a6300bb2614be41a139d4ef1df", + "0xb0173651b4ba0590b1d2f0265183f3729b5bb09893523ca12c4936120cbe5ef0d9b98733734407d99fdc766792ff10ac", + "0xabf72ec0280d56971e599b3be7915f5f224c0ccde2c440237e67b95489f0c9154ace04b7763db228473715f68053f071", + "0xb404beebf60026ca6843f2953cfcdee494d495c8e2d18865147102ef29a8f0ee470961d2246fe5a450c622d20ca51d53", + "0x89461cb2dadf51d6f1208b0965c8eabec895d7b19b7d90d3c6e49dbe75a75c30fd26db3dfb169dd46a4342280225032a", + "0xa61cb5b148cb7ff34775dead8efa7d54d7141182356bf614070dfaa710ebf07a4dfb684dad151db60c0f8261c30a4f40", + "0x83a798f47a4f62dcb8b531d463b0fd4a876d47a8ca990710290549255033c909de709471b4e823a60bf94d8baf8b5acf", + "0xa23431589f3a25070a188deead9adb0ed423d6b00af267f3f125cdd4391c1527909b5cfa88130dc4b67915f5002128fa", + "0x8d77e65ba6250fe18c54ce70d0ba4571a7d3e68a8b169055cd208e4434b35a4297e154775c73e7dfba511faadb2598c5", + "0x90e5db75f3787b819df471712f87b6f3281437090f5db7a2c21b07164446292a414c687e41de2d1ca00786b093239c64", + "0xb382fa28670a5e14dc954b2db8ace250c73df71ab095304bd8ee28f455ab26cc54f82775a831428e110d1a3a2af709bb", + "0xa58d2fb1c2612d28c54fafa7f2e1e6c336c24435abdb53e1be9dce9aebecbf7468a348b872549535ac18aa003f83ea87", + "0x9545f94c4e9056e360dd999985f8ad06210556fa6f07cff77136a2460605afb0ff1fb1d1a2abe4a4e319fd6c29fff80f", + "0x93121aa60f904a48e624e00f5410cf8c8925d2b0719f90c20e00cba584626f833de7c8a18dbfa6a07df24b916156bfc0", + "0xaa3446aac25f6c23ea16e8f7d19c58d187746ef3c2ac7d8fdf9bdc329409a07589ec8eebafbe2b156e7ba60addc15af8", + "0xb964f50011f03135e993739e2e63a71933ba4583040b3af96c7e2dce874226518f7b68f622c4a1d78b9c3ec671d33ad7", + "0x8cb5cb7cba886af58acadc5a4348524b1395a39dc51196316d759a9b72d9fc0fe45b706e264393a13ff911f0d15de45c", + "0xb50c306f78143b37986e68efa10dbe1fb047d58562e9b5c5439b341dd8f1896c7ae586afac0a3213759784a905c1caaa", + "0x97825edba8410e8bcb85c5943628c02ea95ee7595f559c030b94395c0d1d0d84c38eca199fce9c1992e572b5029b124c", + "0xb0922acd6da2a95b36de6d0755316594a7e2e32ea774792dc314e8c3cd76d9f1d69df38231e166e24bd42c664f4fbac7", + "0xae5ea228c1b91ef23c245928186fbafa1275ff1817535018d7d2d913abff0fd76bf41fd04a96d816f2f1891bd16e9264", + "0xb106c6d13ca17a4c8ea599306e84918127cf2de21027ac3fe5a57d35cf6f3b1d7671c70b866f6e02168ae4e7adb56860", + "0xa044cd5a3b727dc1cb59875e4025718375d12e706fffcdb48874e51a675dc2cabb209670192e408cdced5aeac65192e4", + "0xab1cc44983e46a6ea2430aa6616ab28614f43624665e3e6ae31a9357c0c5434f34e56c720906e184327693cc4ebe1fa2", + "0x890def696fc04bbb9e9ed87a2a4965b896a9ae127bc0e1cc515549b88ddbcbc02647e983561cab691f7d25cf7c7eb254", + "0xa86be58fef115445b909dffac6f51da3fe9214afd9c31fd564bb8f39b1dc3cb895b1222f2c63226b54b60b278ec45edb", + "0x8757e9a6a2dac742ab66011c53fa76edb5ebc3c2fbd9a7265529a3e5608b5c24b4482fed095725e9b8fed5a8319c17a4", + "0xa7e0ddbae16e4491822684c0da3affecbbd17ef96c5c491ac093c6eb4e162fc7854c367535e296fd3d6265c2ed1210bb", + "0x941fe0dabcdb3225a625af70a132bc1e24ccab1f8331dde87db3e26cbee710b12b85535e46b55de7f5d1c67a52ddd5c8", + "0xa24d05b51c7c128bb49979cbd9019e6618545d95275a44b5c3d1d03e71bf2ebffdf43fff50c30846ec27d279043cef4e", + "0xb526f40d519e7a8f2c81b69f71b3e2ef079028004c0448ba0608296c2787972491ec6d05ed6a8fbd5ef2da76325a93cb", + "0x87ca4fa85a257adf7e21af302437e0fa094e09efced2d7ebab6cf848e6a77ae7bfc7cf76079117f6ed6eded9d79ce9cb", + "0x9276e8051bed8f5dbfc6b35765aac577dd9351d9d6ac1bb14496bd98091005b9a4737b213e347336413743f681f5043b", + "0xa7741c52498e0a24db3ce7699882de8f462a2b3ed5e9f77dc7200cbdf46b6cdd923b1128759909d6dddd64700c4c20c5", + "0xab5b363ed9551e32042e43495a456e394cbc6d53b15d37a8859850162608bdf36d3d4564b88fdbaf36ff391bb4090b8c", + "0x838ff6630dc3908a04c51fb44a29eca5a0d88330f48c1d0dd68b8890411a394fd728f14215482b03477d33f39645dceb", + "0x997d3b82e4753f1fc3fc2595cfe25b22ac1956d89c0950767c6b9de20623d310b1d84aaa72ab967ef1ea6d397e13524b", + "0x85416cf3eef63d5530062d6f031aeddad101c7f1aea3bccb826c73f8a25d5d963caefd789a6b9832bd4ed459f268ae64", + "0x9194bc45e11d7276ed1c9ef3ad5a33d6a27372f5568563ca8ee213e2e7029dee404ab5acbaecaef698129798d35fd895", + "0xa4828a003513ab887082390262a932a7e8c5e25431824b7b4cc10fccba73265c0e5ee5b315ccef13906d971644913806", + "0xb907ec84b6ae5729d36e2acd585a350acacdeef148bcc5dc4a91edb57505526462bd4371574865541d8bb0d786a29b2f", + "0xaa5d1c1f0a7f6b9b3c3734f85864aa60bddad5121450218d76d82edefd2602685a820965c56d7eefe789d5115cb41e01", + "0xad28fe70a8606f87bcb5d6f44e1fca499c24bcee791971f599ffef1f403dc7aec2ab6ebed73c1f8750a9b0ff8f69a1e6", + "0xa641eaa149c366de228a2833907ad60eea423dd3edf47e76042fdf6f5dc47a5b5fc1f1b92c8b96c70e6d8a68d3b8896c", + "0xabac08f4df786b2d524f758bca43b403b724d12601dc0a8362b7a2779d55b060c6682a5618fffea2e4def169fcbd2bfb", + "0x8658a15df961c25648fd444bdf48a8f7bb382d9212c0c65d56bf9cdb61aab3bd86604c687fb682260dbc0ad2dc84bf01", + "0xac7983d50ec447b65e62ed38054d8e8242c31b40030f630098ce0a4e93536da9179c3f3ae0b34a0b02aad427a97ee60d", + "0xb8877a00a24b0ffcb2bd3fce8a8ba327d8ee2e98d85531cb61fec21fd49cd1696491cd51024a9c3820cf06a77cacf04b", + "0xae075b66e5f211c2149c45b211d1297bbc1d9e6497cb3315363c492a9a51ae5b9d0a28bfecd755d68553736901ac6606", + "0xafdc091a224486e7bfac169e6a7b4e008d2d04144508a337fd93b6f4d385ee3f0d927b1f5c1cd79a15e0fd6078e45dd4", + "0xb75c28941ee3f91b3535b4eaa0fb17b59ca65b5256601a1f6d0cf2bb4d66837fd16e51d6942856679012a5730a66e519", + "0x84a6edac5ac68a7ca837c46d5ada8fab136748b6c3a3b9165dbbc231ec386b15328e4ef7d69a15d4cf354135348a4ee4", + "0xb01ee30d120b97e7b60ea89b9b6c537cdf20b6e36337e70d289ed5949355dd32679dc0a747525d6f2076f5be051d3a89", + "0xa80deb10bba4bc7e729145e4caf009a39f5c69388a2a86eaba3de275b441d5217d615554a610466a33cfe0bbe09ef355", + "0x8d6e3df29419bd0da1deba52c1feebe37744108685b49ca703e1b76fb4d612e3959d3b60b822506e5c0aac50b2f5eee2", + "0xa373408beb5e4e0d3ebd5ca3843fe39bb56b77a5d3d2121d4a7a87f9add3ec7376388e9d4b8da0ba69164850cb4b077d", + "0xae0beb452af7479134a7fbc31a5f59d248e8a67d4c7f73a0e30a51db9cd33a1da3f0ae947fa7e5983aea1343e7daf06a", + "0xaa103a329b699d4102f948101ce5fae27226419f75d866d235da8956f11367e71db5c0a179dd63007ed53f7eec333aaa", + "0xa094cca9d120d92c0e92ce740bc774a89667c6f796b438b0d98df0b7aef0935d8c915d5b0dad4b53e383dc9f095c29fa", + "0xa4d88467136b99d6e55603b3665b6da0f7fb27c7759687f7e6977b6230272773d7b95049d999538c008f310c05ed948a", + "0xa23710308d8e25a0bb1db53c8598e526235c5e91e4605e402f6a25c126687d9de146b75c39a31c69ab76bab514320e05", + "0xa36d6952c2d7f88bf28032a76ed46c4dabbf1901a46efc50deb798d1b44adf7e0210fbdf2473a1ba408b5c98d76943e5", + "0xab45f5b756ec6e0b98d0d4301c87675a0a1f0b1178b8a9780c1ab23e482cd821834835afa1de890962212159e464b10a", + "0xb800be1788175a01a9228b0d3e7eb4302484a2654eb2a86c0f0900b593da0a436ef031ac230e2b05e968b33e90a342ce", + "0x8cc8d279ec08d0a5a2a09ad07fabb0122eb65f48da2571d83f86efa2c1c5bc51b04ae94b145f0a8ef19a3988638b9380", + "0xb4cd409256819e8e4627edbba90ec40b7da17a57f95749104d90db0364f5007b1accc816f4d51a0dbe5ffbcb737cb37e", + "0x99365fe5ab8ea8bd768ae7181a6ba49b79d240f512ce309b02f09d465fea276298ff55b5b9cb5b4162a901b390606024", + "0xad77fcac9753efba7a9d9ef8ff4ec9889aa4b9e43ba185e5df6bf6574a5cf9b9ad3f0f3ef2bcbea660c7eef869ce76c8", + "0xad2456725ac3aeb0e4ca5c0502a8abb4dbd8a8897d9d91e673fea6a0cffd64d907b714b662d73c0877b98d4ab3ce6a89", + "0xac8436e33619e2907659741d66082acbda32612d245fcc8ae31e55f99703fac1a15657342fa66751d3be44fc35d71c36", + "0xb0eecd04c8d09fd364f9ca724036995c16ba6830d6c13a480b30eb2118c66c019cfdc9dacce6bfd8215abe025733e43d", + "0x9439b663e4104d64433be7d49d0beaae263f20cfac0b5af402a59412056094bd71f0450bc52a294fc759ca8a3fddfee9", + "0xb72de0187809aaea904652d81dcabd38295e7988e3b98d5279c1b6d097b05e35ca381d4e32083d2cf24ca73cc8289d2b", + "0x93706f8d7daca7c3b339538fb7087ddbf09c733662b55c35f2a71073f4a17c91741955d4d549c2ee6c22eaa84193c1ad", + "0x926dc729e135f1f0bff4662ee3d6823a64597fe189b763ada34f246e77705fd4e062d85506a338e9fa98c4d225a3b27a", + "0x93f03495d53c781be8b76e37e68b64aa260523004eff6455ddc8a8552af39854e5181f8c5365812b1f65926534fba5dd", + "0x9834f66e5c946c3a8241ca2bbde046a7e88072124911d5d15c037a95b61e82b88b5c2058fa4a3721537dee39dee5da18", + "0x92ec1aeb2aa24c51cd5f724972c8b6095e77b237d83f93ed34ca0bc91a1dbf1ad95adccc59e0f0abbfef33f331f3298c", + "0x94402d05dbe02a7505da715c5b26438880d086e3130dce7d6c59a9cca1943fe88c44771619303ec71736774b3cc5b1f6", + "0x8368bb9b9bb2e17730c42ed1100eb870c88a8431601312aa8cb1e738cdb9ca2704dfd432cf1703c0db043259819631dc", + "0xa35189a105401f0cfba4b43be21723486c04659e5a01e67c43e8f9911030810b878beee696f04f63d314ccfe97ebb790", + "0x93ccd8c5f82374e0bef6562e16576f742d79b6f400e3485ef36e148088b61fbd882c3d2bb38ab0b43fa1dac77f31d543", + "0xb85d9a426a23ca9ee582bc16c203a9352dcc5f85440e46979de80eb572384479b697dc964cafd9457d9f34eeb77bb72a", + "0xaefb70e89dbf4456e077690509afcdcabf975416ff2fa16777fdf90b3abd3f5dcd865c43f1ebe6f8a669edc7f3bd6ad8", + "0x8eb03001ac9e22c6956a682ed458e650785c36d23ddbcd51ac4d9cc991325c02519ff1958987a08eb29ff56ff6e2c293", + "0xab4a1ffef7e001723c71f5d28f3dd030a06c42d91773733d117247bbf9c01cd66fca2cff8c6ce04c4bfb68dfcdd851f2", + "0xa9ef845ab489f61dbfdcd71abcc29fc38f3494a00243b9c20b9cd0dd9e8a0f23304df84939b9652cdf5542d9b3ee085e", + "0xb5726aee939d8aee0d50bf15565f99e6d0c4df7388073b4534f581f572ad55893c5566eab1a7e22db8feeb8a90175b7d", + "0x9953a7cbc152f101a60e3e381f2af17ebe7401e16ef6462d132b8f0f6c6a18837914a1299d1605f9f289b9561112f4bb", + "0xa0c9b944a338325f5efb675c9c12619fb43c8e25e80d38d6140e31d5070573b1a0ed9bb52576e4f22f37d0292d36a648", + "0x8bfd6a173a56b73480cc950ef266a18933ecafc86915a7453ded09efd8a0cf4466101f1373f05d48eae3e7fc5c0f7f54", + "0x983fc1ddf17f9756c9cecc00b39bb2ad432587a5c6d1c3296a383b9f539c9afe84c6c818447a709c0b686ba26ce5ea3e", + "0x94bbc6b2742d21eff4fae77c720313015dd4bbcc5add8146bf1c4b89e32f6f5df46ca770e1f385fdd29dc5c7b9653361", + "0xb26b4d483bca73d3f3a976bb595a0e40f9a42094e0febbad3a1874934be1939a1b362ee4ea14a4f5cbfa9b1392796a12", + "0x8dbe8fcbcc414eb352245c52549973f73d987012de9d5f2b2f55dfdc43cf8cc9ea6b147abf149817f80f9e15aea566c6", + "0x9604da21e23c994a0a875ad5e0d279c79210f7a7de5c9699fac4aebbd76d39b703eeec5dd5efc9ad6b9dc58936089ddc", + "0x8934e9a3feababa12ed142daa30e91bd6d28b432d182ac625501fe1dc82f973c67f0fe82d39c9b1da3613bb8bfe2f77b", + "0x85f2ed3ffb03e50c8f22553b8e6349be6244d893aa37a7c6dbd221e9e121579e5a04466e60d6b4d3567bc747b1fc1e9f", + "0xab0ad421f6fd056687b4fa5e99dff97bd08840b7c4e00435eb9da80e0d7d071a447a22f8e5c1c5e93a9c729e5b875a1e", + "0x841d77b358c4567396925040dffe17b3b82c6f199285ac621b2a95aa401ddb2bc6f07ebd5fa500af01f64d3bb44de2df", + "0x83f21dfe0272a5a8682c3c7814c5e0e4db6a9098f1fa80fda725f77ea81fdfd2fa36b0c8db013503a89bd035f86306fa", + "0x95c98e3b6b62f84edf7f297cae93ee5f82593478877f92fb5bf43fd4422c3c78e37d48c1ee7ca474f807ab3e848d4496", + "0x81c3a8c00cfe4e82f3d8cb48de7d4926d5ec2f7689f9cb85c1886a23758bc107a4bc6e978601c3519156a169d0bf6779", + "0x8e956ca6050684b113a6c09d575996a9c99cc0bf61c6fb5c9eaae57b453838821cc604cf8adb70111de2c5076ae9d456", + "0x83474776ef2341051b781a8feaf971915b4a1034fa30a9232c4bf4b1bd0b57bc069c72c79510acef92e75da6f6b8843d", + "0xb41780d9d67e9e8b81b1f62d25c0c72ecfda659d2bfe6825edb70ecd0e0724250ac364e7be521cdc112ba638f16360d4", + "0x842ba3c847c99532bf3a9339380e84839326d39d404f9c2994821eaf265185c1ac87d3dc04a7f851df4961e540330323", + "0xaf17532b35bcb373ce1deebce1c84abe34f88a412082b97795b0c73570cb6b88ea4ba52e7f5eb5ca181277cdba7a2d6d", + "0xb9574edb9567f07f85c7c2e6ca6c02d90ad7c7b87d49796f1e2fb7240ad071fb755cf13ca8678668a56217c62df168eb", + "0x82212706111fb1cf5def02b5b0eb7ae9e6ea42b4c7a2b9fcacb7aec928326edb9ac940850dd933f2822f6cf519de0d50", + "0x9579973ee2559da09b327c62b1cc0177f2859872885dca709e24dcfbb9bdf9224a6d26869aafce498f44c0e6bd8a996c", + "0xa102c2ade15ea2f2b0cbc7dbd8c1171de0c8092fc4ecef84b5fd2bae7424aea8be1629f851c75e4d1d0e96104e54bfbc", + "0xa5d7e847ce7793386e17fe525f82aabb790d5417c3c6e3f6312f8e5ff52efa8b345c1ff60c4c9bf7636f5ff17b7a0061", + "0xb4b80d7fbdb1dbf1567dfb30d8e814e63de670839a8f6ff434fe171416599fef831b8e978d6498851b8a81e0bc8dfb85", + "0xb6e6277b86cd5284299ced867d37ab98090ac44a94deef6898aeadd177e64605440c15b9609c07e71fe54c95b61873b0", + "0x8135a0633082e4465090d6930b770340e82366bc5c37be6ef6dd105f85acf63361e17de8b5fcab4c82e9f9b4029954b7", + "0x864d5d9858cd881eecb0dde5e3e0c6c5de623cd9ef619e87b82fd25c5edf45a1a025b1dc763c27c5f4d520fd564b464a", + "0x8784a8fa62e0ce23283386175007bb781a8ec91b06fd94f22a20cd869929de37259847a94a0f22078ab14bb74709fac6", + "0x8adb748d5fa5c22ce4c76a1debf394b00d58add9f4e08524cf9c503f95981b36b8d0cb2dfaef0d59d07768e555733ecc", + "0xb76cb8cb446eb3cb4f682a5cd884f6c93086a8bf626c5b5c557a06499de9c13315618d48a0c5693512a3dc143a799c07", + "0xb2af1f7ece1fd640c205a09614122d69d5d2e81a7618bedefd6dbb91c7f432679be4ced1e6dddd3de323bd44991931c5", + "0xb950b457c34bfdfdd9d6da9628d41749ccae03659518a04b56487bf1b4c0681b719ec5230c0b0fd5dd710894df6aa2f8", + "0xb21785008910a949804d1291e7533752641d31beae3cb518806488f81d58c38a5efe5ed9534ac692e68c3121e2f9d97d", + "0xa9b120a77d70c1cbc0178a12d97a78b2dd0b98d0584e8e780b937800ceb18c90eaa1f0a83c5b50e34cae1c20468f004f", + "0x998c9ee20d33f96a2388b1df642aa602bc8900ba335e8810baab17060c1eace4bc5203672c257b9ae750008b707b0aa1", + "0xa7d1676816e81a752267d309014de1772b571b109c2901dc7c9810f45417faa18c81965c114be489ed178e54ac3687a1", + "0xb409f87f0632aae9bc081345b17a50a767ba4198f9ac9d352246fb3bebd29ed53c9d6f148c2f318c2eb12846b0aac4cb", + "0xb40a3bae2b08c13db00f993db49e2042be99cde3d6f4f03d9991e42297933d6049394c659e31f316fcb081b60461dabf", + "0x8c1de4264e04ff7e8282faf81c0bfb5943656451be52170211cb7adf4ff21bccbb789400735579c622f69982fcb8e9c6", + "0x8085c60b6b12ac8a5be8a7e24977663125c34827842aa3b2730854ab199dd0d2eaa93084c9599f0939be8db6758b198b", + "0x972cfaefda96f5edfe0614c01533b76153118712c1c02c505008204a5be2aa438675d97f43384199517b1c08c7c9fdb2", + "0xa1e47798a782a024da340d6d6a1b1e5e15a0f2d8668adf349ca375086964414a563cc1eea3226ae637f87e78c0a630b3", + "0x8171f20c020faae112bb92ca213c1df5b1050151496c70db5c5319212bada83b120d515bd7d8b24736090c574e1b7203", + "0xafe779a9ca4edc032fed08ee0dd069be277d7663e898dceaba6001399b0b77bbce653c9dc90f27137b4278d754c1551a", + "0xa5a07bf219432e9c80c38596c93560b49c7de287f31e30b7a06fcb4d15982add4a24085adbc5b753c462be989c64c96d", + "0x9210be290176d7e8a5005d27e7ed825067b1c678b174bc8180f92b5c03b6c3d1822356edba84f460caf6bf5275cd7efb", + "0xa95bec86a7c8417a8df3a0158199327ba0924d3b7dd94cd7c1ef8489b10270ae64b8537ed39cd3699a48942bfc80c35d", + "0xad9725114b01152fff134c1a8ccb8d171b8cd11685ef6815b76f442d757d130bab9ef4c9845e66f4aa0237ee2b525c20", + "0x8018499ef720e28759133033833edfe17ed23e42f99058bb79fe844ddee823cfdc43916be2dc9724d18f9726e6f1b409", + "0x809c7a08fbef7caf4c137cd639f2e47a8ca60d13bca3990eac51ac2a9e4442cd1a1473bebb63c61d595b586525d7b027", + "0x9793a74fa578ace75b083578277a1ae8766d41a5c508b0f1135fb97dff1d0826002393a7276b18cbc4b3c5671360ce0b", + "0xa6d7e65bf9f889532090ae4f9067bb63f15b21f05f22c2540ff1bb5b0b5d98f205e150b1b1690e9aa13d0dee37222143", + "0x99c935fe18699bca9852200c292690a2b834bac508890c4ee9af1aa6999a8d590bf6a3a274bb55d5a73f1b7095d10f37", + "0x860f5649c5299211728a36722a142bf1aa7cbbfbd225b671d427c67546375de96832c06709c73b7a51439b091249d34f", + "0x9104ac7ad13b441c6b2234a319e1c54e7f172c9a3efcb8c5fab0ac1d388b01895a9a208f59910bc00fb998b0adab1bc3", + "0xa3b109249ac2900806f0f39338da72d4f2cc6d1ac403b59834b46da5705cf436af8499fa83717f954edb32312397c8d9", + "0xb9893f7a47af457a9efd90ddc0c0ef383ab34e9c1284e617c126965cd9f0de5c54ee8b7b5208ff190366fe445e9c1325", + "0xb77416ea9a6b819e63ae427057d5741788bd6301b02d180083c7aa662200f5ebed14a486efae63c3de81572fe0d92a9c", + "0x8b20a852fc8f0b7cdbbd808c04a0cfd2fbccbdc0cb2361434f0d96341c8bde6155695977768d563b95746dcb4339fe2c", + "0x96b15806d9009962fa07f8c32e92e3bc30be4ded0645ab9f486962a1b317e313830992179826d746ea26d4d906bdb7b6", + "0xb0d69b3861ca6791632ec8a87114b463e0da571bc076c22a8f0d9e88a1a5eaef24683f3efa8f34900d0112412e3dc4fa", + "0xb01a30d439def99e676c097e5f4b2aa249aa4d184eaace81819a698cb37d33f5a24089339916ee0acb539f0e62936d83", + "0xb19ca6e55f349bbb2dc3e429520ff5b2e817972470794f35c1aac8c118b37a694cfcc875b6d72225343799825d2f5c39", + "0xb7ea5e0d3cfcf0570204b0371d69df1ab8f1fdc4e58688ecd2b884399644f7d318d660c23bd4d6d60d44a43aa9cf656d", + "0xa778da56ddfe4a383816b43b027464d7a28689fc4a6b35b36883d3f36d9c41f0177bdbfc8f258afe8da90f02d3b64fea", + "0x910fd030feb5538f538e5ba74b9bd017d889ed6d2a797be9c26d2be8caeba7a473006102de27e87755742ba34e445bca", + "0xb49593ea6040ce82cfb5aa2881a4b0c42b78aa9fc8467d79c8e4a8ae4ee7355842841c8e1cc0558362047ed80de44fd3", + "0xb07447c7e87459315fcbda3fb86fef27f98373b1246e2ce367e26afd87f6d698a438501fdc13cc5de9eef8d545aab768", + "0x8a9f7e8d45f11c4bfb0921c6008f3c79ff923452bcfa7769beb3222f1f37dcb861be979e6eae187f06cf26af05e8ee5b", + "0x8ebfbcaccddd2489c4a29a374a2babc26987c3312607eadb2c4b0a53a17de97107c54eab34def09144b3098c082c286b", + "0x93be3d4363659fb6fbf3e4c91ac25524f486450a3937bc210c2043773131f81018dbc042f40be623192fbdd174369be2", + "0x8cf8412bd48b21b008f0207b1f430ed96bc6512c3712dffbbecb66e493e33698c051b27a2998c5bddd89d6c373d02d06", + "0xa5562fbaa952d4dcfe234023f969fa691307a8dfa46de1b2dcff73d3791d56b1c52d3b949365911fdff6dde44c08e855", + "0xa8c167b93023b60e2050e704fcaca8951df180b2ae17bfb6af464533395ece7ed9d9ec200fd08b27b6f04dafa3a7a0bd", + "0x93e4d7740847caeeaca68e0b8f9a81b9475435108861506e3d3ccd3d716e05ced294ac30743eb9f45496acd6438b255d", + "0x8016d3229030424cfeff6c5b813970ea193f8d012cfa767270ca9057d58eddc556e96c14544bf4c038dbed5f24aa8da0", + "0xab7eff4ef8696db334bce564bc273af0412bb4de547056326dff2037e1eca7abde039a51953948dd61d3d15925cd92f6", + "0xa3f9dcc48290883d233100b69404b0b05cf34df5f6e6f6833a17cc7b23a2612b85c39df03c1e6e3cd380f259402c6120", + "0x8b476b3b065a3b95a3d11ec60a749c2258ddcc5885bfb50b8a086d3fd1e49ff73e1dde733b8981c3d2d206aa0c87b09b", + "0xaf3e694ad71684f7214f86bed85149db039971e1c362119b979a135255aa226128802e58e2caaeaf8d89304371dd0440", + "0xaa19a75f21a14ad5f170e336a0bd07e0c98b9f5d71f91e784d1dc28a5f5eb6870a4eb35bb41edcf9e6efe982ae5c2c5b", + "0xb9528983419ab5766596683faebb3592982a76b68593f810186b4e5f94f6de60830739ad8dcc164c601d575b84bd2700", + "0x88e7a12a90428bb45bcf4b01442c11607433211fc2f9bee9545304eb66e0b4b5339360160bc782e185391385da7c5ad7", + "0xa4c4df0e29db19ab4c82dd6ca8570b337d15b59c7d84577a7a444a8f762ff16ff5ab3e4203a1d6b60a23ff949a93ea81", + "0x8f11ee58ef82b1bbd2240d3f548d8681e22bed5ce118d605bed4523b4bb39899ac78e15337daab92666750dfcaf32aff", + "0x8d3cba4d10f94bd3406a341c903ad144cfcfe6b61678d5c03084a56b4413bc30bd20d7a9fd5d839dbb565cc9b2aa99fe", + "0xab8a8769c754008a7976b6799e81d7bfe97413d0a79b90715703c1f8f567675463ec93aabee59277121fc4df88b5c7a9", + "0xb201b0546f19c5db88df9c684cf55ed623bdb43927d06051bd595497df741feb1485961f64e8d3d1811d9e2e9e1e54ad", + "0xa04016e9e13ad845763cfe44af4e29fecf920b4aa42f581715fc34fb9ca27776feee45c82093c7274839eef1838b10c4", + "0x8f84cba7ceb7652023fc8ebde4b00ecde1f550935bab12feb630d6f49517b4148f3cde184bf55d4f6ec99a849fc6f862", + "0xa2248409026f35c3da8bc4d5c02315066df8fca44ff5a358cc42b5c88bdf6866dc133617c697bff004b1ef20ec4b5748", + "0xa52c5a63b55a8001b6b67c5db4fd5e95923052f03618369312896ed9892d99354aebc0dee8c3b365bafa29e211a5c3f9", + "0x8c9fefe233d0d657349b7efcdc368f5aaead27071d224af780874751e7d241f6b88f7650fbb4133043b24bbebc12aa48", + "0x86ceb649a337a5a79c17b496993ca07fa93b38a582367ca04f3dfec5cef8f268d4e8080e5a76b150f5be1b177ef6984e", + "0x87dcb537e38cefa32e629ae669da42e809b5afcabdeeef244b72ce057fc18584a1e8c3f073d5d33775232707f0cc59ca", + "0xa020404547407be6d42856780a1b9cf46b5bc48122902880909bdcf45b204c083f3b03447c6e90d97fd241975566e9bf", + "0xa1beb9f673409ec678020ea4dcbe65177aa18e2932ceb9cfb33fccb94b9a8ccb664f71647d58b3c8b2bdbbffbc02d5f7", + "0xae47b31c5b62b38ee886ee04945649054369018dd6543c91f0138464af489a32c1fea339e0e0cbe82e3e8b9f2ef3918c", + "0xb18c41c0f827f6d8656d3fb93c90b663eb2eac034923972f8842cb30e96c32842b3fbc1127930e1ba4322d5b6641f04d", + "0xa6d6ef51a361df2e8f1d993980e4df93dbbb32248a8608e3e2b724093936f013edabb2e3374842b7cce9630e57c7e4dd", + "0xa49da42c27d019a21cc6489ada7b712b98c4ede28ba25dbcfa916acef48446a2baf73e03a48be763378a09774d4a03fc", + "0x8b62902fb2855300580e94830a4bc825d997ede33bf356fe3b7c08d6a8bd85a37879433fc6bee58f9b44ca280f4e8dfd", + "0xaf9d13103868c854821ba518907b067cfba025d739125f1e9cce0a04fffc3a2a1f25506c1209a0cfe1d6c1572c229ff0", + "0x8910f41db6952c25dfbf6b6b5ba252a2d999c51537d35a0d86b7688bb54dcb6f11eb755a5dce366113dfb2f6b56802b7", + "0xb551d1ce88cbf4ffbdcb0113a6e319513bd676d0078dd4e6a6f23ad336c1d0fb47a4e427bdedbe0fc8f152353971f81d", + "0xb8876bda1e709ab16e1347a1107852a7898a334a84af978de39920790b4d82eb0739cbfc34da1c7154dd6e9f7674759c", + "0xa7d9ae9621dd1f3da3cd2d435e891cc3579c4c0d60d6a4565cac86c315cea21a9ad883559fe7b897ae6e05f1aa989ad9", + "0xaac995a41c14d379853ef18ffc854ad62ad77061ca9bdf5029cab3d6c2630de114e777a7fc3322455939d5205ed59c55", + "0x999cec6a31d9b2f280017ddd59138014829fa34cab58e6c35a5014ec364b84712441e7a2f717cf2f0de8d5451e250924", + "0xb1f43b498cba1797f9793dc794a437500c3c44a8a4b59f9125a4d358afa304fc05b88ac31ed40b6eb68f0396b60cb7cd", + "0x93ba2e000bdb7269818d390bc4232992d280e69abebe2db2ecb6fcb1390d323238c9793574509bc1fa34051ac1928f07", + "0xa64808a2d15c30460651c200a09b50fc83e9d84d87abc156d06cee73b76fbd74e6d64424cb5bb83d3f16b21bdb7ae9d2", + "0xa75bcd04fcb44ce5cbab7eef6649155ec0bef46202e4eb86c88b4ced65e111f764ee7fb37e9f68e38067040fedf715ee", + "0xb95fc0ec39596deee2c4363f57bb4786f5bb8dfb345c1e5b14e2927be482615971d0d81f9a88b3389fac7079b3cb2f46", + "0xaef456af90354ff88039d2dde02b0f5a6790aa762b23e0a9da8c6ec92c3b8b3320687bb21666608b4a22615843afd1ef", + "0xb38be9ada17ced704a34a7498c4fd6ba2503f6bd886b693d4712267847efa887a26e7da5d60f8bc5014b92bca8b3a12d", + "0x991a7c93f06d50ec6a4340c6751b73eb5825bad02a954e44e1e2d424af928819ebbb590c6129ce35b3f1e908e2152f33", + "0x84888f2efd897a2aca04e34505774f6f4d62a02a5ae93f71405f2d3b326366b4038854458fd6553d12da6d4891788e59", + "0x941e2e3ba414a371a11c3fe92cabf688ff363da6230ec7c83ac7303f652a19ebc89cc494427c456d0c2ae84c72053f73", + "0x925f3bb79c89a759cbf1fabdaa4d332dfe1b2d146c9b782fe4a9f85fee522834e05c4c0df8915f8f7b5389604ba66c19", + "0x941c8962debd2756f92a6a0451a2bf7fbc01f32ed03d0823dffd4a61186628a4c3c7c482b18589ff65e4c449fa35c2a4", + "0x88ce41025aa153a94f91f22e7b96f9342b5e0e1d76274fc70c4df7d08f66d9f7ac86e55a1c6e77693b8b01b2b38bf900", + "0x8f142bde50abe4dac8e059003db41610436d5ca60d2dfe2660ecaa5f9628aeb8b5d443e1b57662076f77363c89a1479d", + "0xb2affe048c187d311a185503d8958cacbe03796edf79bc32e8533941004d9178bd2e376e627e1ba61ed43850c0c455cf", + "0x8f7bbaaac458bada6d852fe665c87c646133bab16c0d5136c3dc922095b9d647d93a9de7671cb7bfd4cbd138ae0709d1", + "0xb76f598fd5c28d742bc1a81af84f35f1284d62239989f1025e9eba9bece2d746a52f246f9bb6bcfde888b9f7b67fc4f6", + "0xa4c665a3e4e25a7af51e433c978573841bfa2c75c075e17dd1f43b2f0369249f3d3a46ff51051e8ce7da528b0fa98d16", + "0x81e0992e7c1c54c21cac32e36b90b25e1e5b72aac99c953c3c4d019eced64d7e316cbc0840204a4a51a4ad17d8b1d508", + "0x96d7a69eaf2761bf0e5ebcd607b134d5dedba8e262ca1d6d3e8fbf23e6419a8ce1bbe4cd23b9e4b5f80db54a802a9795", + "0xb2235bdf60dde5d0d78c72cb69e6e09153b0154efdbab97e1bc91f18d3cec4f660a80311fe6a1acd419a448ab65b18f1", + "0x838d5eee51f5d65c9ed1632d042bb7f88161f3789e6bb461318c5400eaf6728e7ba0f92c18e1a994aa4743145c96164b", + "0xacfbac397ae2ff23b31bb27b90788fd0fd51a50f8e8c9f4b31be8499194252014f0b1972b204aeb9c2836a20beb3c868", + "0xad85789bb62b60e9768bd330a31a16f711b6018445af6a47646f318f12df8d4d256ad00d1ed7c3afa4e98fef73c6c610", + "0xb2349265be33d90aaf51362d015ce47c5ffe33e9e6e018c8c6e39336d9327ccdd13d25e792eb33b43ed89a162f6ac2fd", + "0xaa458aaca6ecb43b6e45ea72d02682e5a7dc8dc22782669a0628e1638e73999319f011803f4ec8cf072467bf2c49c629", + "0xb9e6c9f2562e90bd3008669a42151538b70faf028cc5bbc09fd6ab3febc626df911fcc65744a2ad793ecaf3f91a1f701", + "0xa37185bd96faa526dfd3ddaff89b1eb29ceb4597bfc7e346bff9d6b3225b9ca87cbce0db94f05243c7232ead5f6607e8", + "0x824fde65f1ff4f1f83207d0045137070e0facc8e70070422369a3b72bbf486a9387375c5ef33f4cb6c658a04c3f2bd7e", + "0xb0ed68167a67490bd7d7d49e83341606d6e6fdd99b82e46747c2190d270719f81c5f5f8733646c246260f438a695aa3a", + "0xa87c2f13f2a824b7e2c39cfb63ca7b94ae6a11ade0c6b8e83f5092b933fa8b6157a5d2f09c23081f49d35cc85f5db36c", + "0x88f5e795cb36ab22bdcff01caca0e9d04db463c3d88cf656c3a0e0f5ac864b7092c738758b4c8f3b65e31995c6aaf267", + "0xac66f3a7041586ac1576e33598f01921e16d99afbf4249c3350f0ee1654de98bd37a61c243eb6a18a942db529e36af0d", + "0xaca69a4095567331a665e2841210655636a3273d7b7590e021925fe50757617898e1883532f9cfd46428c2e3d854f9f7", + "0x946d585d7aa452d37a8c89d404757c3cce2adf2410e18613483c19199abd88f7a12e206f87a43f6009e42f4e31ed20c0", + "0x9722c1079db7e2e1c49756288a02302b43b8fd92d5671585ac1ea7491123742a2744a526c12c9a0b4c4a80f26342a3a6", + "0xb80e8516598c59dddcf13fdb7a42d8f5a52c84e01bd6a39880f4acaefe8e4b8f09cc1b1a2423cd5121f4952201f20078", + "0x85bca2f86423a09014b562f7dc613246bedffdcb3aa41fee02270c13e6b00c8d6704dcbfbafc5997df6a90c7fc08c29f", + "0xa36dad4f7cba9f4cc843fe40f6240e1973a4c412cae29b4a68712598523cfaecb05272fc47d30772bf06906b5a26e282", + "0xa3d8610c2522d330df02511710e52b1d9bdc9f2b156deca12b1bf754266caeac4f449ed965d9863558df43ce9ae65a44", + "0xb3e313e79d905a3cc9cc8a86bd4dba7286fb641c2f93706adb3b932443e32eff2cbed695beeb26d93101c53d5f49d7db", + "0x88d8a32231ff2bfc39f1f9d39ccf638727b4ead866660b1b8bfbdf59c5ab4d76efddd76930eff49ea0af048b2e396b6c", + "0xa90d9502a9785e55c199630456fcb1e794bbeb0f5f8c022e66f238a0789998b126cf9911fd0b7d463b7706dc6f9ec128", + "0x8c627caf25eae6764501b9eff35aa90bd4f24952cad712aae20344579e83ecd104ad1f7915edc4f9023b17fddbdb4cd7", + "0x87d4b20bbe2dcd4f65f4e1087f58532d5140b39a5288e1a63fc0b7e97a6a56946eafdd90ba09300c3d1fef6356ac6b7c", + "0xa18f4464cf5cebade8ee280fa00e0917cbf1743aeb0dacc748ab68773b909e30dc60f40fdef3041b5f082e650985f7a6", + "0xa6ae4fd03fbb4e2150795f75a241ab3a95c622b4615f553bab342a1803b86b1c1a2fc93bd92ee12786bf2de22d455786", + "0xa89bc7548ea245ce9556eeee3fba98a3256f87499f54a7c5eec0c43b9fb4ef2fe8f6810867ed0df814a88ee100c245af", + "0x97f1a7370b4f5acf83b466f519da361c366915f560385dd7eff9d53700ad81b25c9862bc71d35428e82372a5ae555ea0", + "0x825359cfe68ad6a75578a94be6419179e0aa088170b6c20fc5c249dc3be7a260d687c93d8d8a343c7c72c2ed6a716de3", + "0xaa9b9cc039d147677aedd1e47ad9013fcc0da0164070ff7305b18e5786c7fac0471368637a3adbb78f3af174a5c1592a", + "0xa61687511b627bde7b3977e9a34cb7fddc2aaa509a7b99b6b6c7b97133845c721e1e69f99758698d82cca265d8703610", + "0x8853c582e86cf916750d670a621246a63c7fd78f68c556642053bcdfa7937de58885d728209736b7d5521b591387e9a7", + "0x82b8c013f24fe64b8e0337ae8b6a682cae336b8404eafc1404744f80f765efdb8b2873d1d3f31141e8dfe4d93346ac56", + "0x866ec39b9eda580d96bc2bff76af5cd4887b6788675149ab33bfefe38db82ad01b8d64c6b60704210918f3564cde1110", + "0x81337ebe90d6942d8b61922ea880c4d28ebc745ddc10a1acc85b745a15c6c8754af1a73b1b3483b6a5024b783510b35c", + "0x807c510df25c0ba10d4aa06a462e02f050c69a977c64c071401ab74f9ac1e60788aa504743b4cc1982da835ff9ac2541", + "0x96b1c82b85cdb8a7026fd3431bea9cd008f0261ee7f4179f4e69a399872837ab836a14e2dd45f5448d54800a4ae7c7f2", + "0xa48b1031ca2f5a5acb4dbdd0e9a2b4e9add5ccfc0b17d94818273c8df11e825193fade364e0aec10f1ff91d57d03a52f" + ], + "aggregate_pubkey": "0xa825959280c88c6716f6df807204feb84d745dfbee3cb3474ce81a1ef0c4cd142e5ca962a0335e68b7b4266769d631b8" + }, + "current_sync_committee_branch": [ + "0xbcfe80e1d24fbdad7bc058b011403a4c26cb56967654494cde51517f888023f4", + "0x4710ae46156553fee6231622052f7fb2f6945cdb59a5501cef824b1925c87445", + "0x6df62e05ef3e1ac92c659c3a519b8fa651d1b649c2b46fda58c48cdeffe8337c", + "0xd26ff22ef5958a707a8d98eb1ffaaf1f9f412e816c04b79f5434cb1792ccf608", + "0x90d5e61f0af673ab4d8b3ab0b978d05142a8295a163b198e6dea9d8c8f1c6d89" + ], + "validators_root": "0xd8ea171f3c94aea21ebc42a1ed61052acf3f9209c00e4efbaaddac09ed9b8078", + "block_roots_root": "0x5078f286fa90b88a09dcccd4ac72f6c3615b77c0ab3132508cb8c0c07b20282d", + "block_roots_branch": [ + "0x558b658b1230e225ac3adce3daf0b066ed0484b4a768d55b74ba81579ca0e5d0", + "0x2cbb27d38065ff3f230247af918e67d1998b67bc7e2ce6c244bab7146e16b8ad", + "0xc63bfc96585f424385e3b4b39ce46e957017b716c54d105eb7e07c841d1d4309", + "0xe662b38f57427b58c46b09980db3856f17e56b60b36bd5471823b0f2cc1b6467", + "0x8b3bd99618b1e50cf284b4c3b03d0cc272312bce377d585eded77154aa5580a5" + ] +} \ No newline at end of file diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/next-finalized-header-update.mainnet.json b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/next-finalized-header-update.mainnet.json new file mode 100755 index 00000000000..3440749102a --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/next-finalized-header-update.mainnet.json @@ -0,0 +1,38 @@ +{ + "attested_header": { + "slot": 4066880, + "proposer_index": 1904, + "parent_root": "0xcab3b6fe3ca0c3ec6f9a8290d1cb3ade42b019f399dca754060518eda41fd429", + "state_root": "0xc47d2d0ec566de4bd41082ee14aa6294c05f264a4fb6a73766c75df917b57a55", + "body_root": "0x5dc66f1cdd8fe849e0aa63b096a8083c16b00814f37edd213819852cc43317d6" + }, + "sync_aggregate": { + "sync_committee_bits": "0x9fffefffffbfebfffffffeffffffbfffffdfffbffffff7ffffff7fddfffffaffcfeffff7ff3e6ffefffffbfffffdefbffdffffffbffffefffffff7ffffbfdffe", + "sync_committee_signature": "0x9146a1a3cc2520a69415103446e2c30676fcd164ef2beb42933bf4beb753f5e94f28fdcb6296e3ceda302b2a93c716d515a890894365a36ed535e099da76c7e585b8d6ed5fc2ec3c316049b14da844add39bc79cd3829a455f552438669ab70c" + }, + "signature_slot": 4066881, + "next_sync_committee_update": null, + "finalized_header": { + "slot": 4066816, + "proposer_index": 1396, + "parent_root": "0x17d77d07327f42b16d6d87a06c6ab5e56ce02e3ebc65ed2d28a64dd0c3a33d15", + "state_root": "0x9b498175419bce5a027c432fbb844f35138dc00083540a04ec0f54c77eaf061d", + "body_root": "0x6650167595152e94d0741c7a7b64d2c10ed01b0d11519f7d0c615c8a60dfae2e" + }, + "finality_branch": [ + "0x70f0010000000000000000000000000000000000000000000000000000000000", + "0x3d4be5d019ba15ea3ef304a83b8a067f2e79f46a3fac8069306a6c814a0a35eb", + "0x452c63d803b8bf301447a73b2f7a747e49f37f9c9a096d8ddb6c8302666b809e", + "0xdfebfd48ce69c56abd05de8266c76478936901404ac3869f0c068c5cfd33b301", + "0x6f1a65d993b2f461764934642be084a68bccee505bd3adc20cc69e151bc6330a", + "0xbd65074f41adb20717d733e64d219d832064b6417b90f22de6d065cbbd6b3d83" + ], + "block_roots_root": "0x4729dbb81e8ebbbae1acc10857551a3991fd5da08c27dbd304b62673edcd46a0", + "block_roots_branch": [ + "0xa3c286182434bdd4d55be8ef6e7212917dc272c204a4daff2d0244fa993d86cd", + "0x00d2df4cb3c0b06bb4f2722f975d6630a7f3c2a1ff12d635e2109f08379e3922", + "0x135a357782eb8f46d14db6e62bd3e9ad611d01f16a3e573cad9ea0c53010bdc7", + "0xdb944338cc4e7b11242b39bd83159afb122504a1934569bb500a4228b884b8c6", + "0xd381920000999813479b975b7cf0e5663b52c3ab06bb6ac66e723731e8f41e9b" + ] +} \ No newline at end of file diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/next-sync-committee-update.mainnet.json b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/next-sync-committee-update.mainnet.json new file mode 100755 index 00000000000..c445bfb48a2 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/next-sync-committee-update.mainnet.json @@ -0,0 +1,563 @@ +{ + "attested_header": { + "slot": 4063296, + "proposer_index": 944, + "parent_root": "0x3e8712719bae71b519a25b7eeea9b412acb882ba6bbeeadc596b1682838cb6a6", + "state_root": "0x16add3b722d0b9075e7a3fe9cef6d237698053edeffe1b95f5b59a31f1bb4f1c", + "body_root": "0x724f1d72cbacde14baf82d273d3c4eafbbda3a56cb0f641cbfe76a426657327c" + }, + "sync_aggregate": { + "sync_committee_bits": "0x9fffefffffbfebfffffffeffffffbfffffdfffbffffff7ffffff7fddfffffaffcfeffff7ff3e6ffefffffbfffffdefbffdffffffbffffefffffff7ffffbfdffe", + "sync_committee_signature": "0xb2f86b054283455ef620757c13531ef64baaf8899527864aee1b86301c62c72b6c979865579e04880790c1ea418b53a717d7b8b85c70fda1760b2436ee04a25b13a8906d6aea8e94facef2444f33e4d5b4e91439adb981900c253186e742f1ec" + }, + "signature_slot": 4063297, + "next_sync_committee_update": { + "next_sync_committee": { + "pubkeys": [ + "0x936749ff47e5be307546564a5a4615bd8df52e2590034b2db19846939af3595a79ccabf0f6ff52ca46b9a1de3efd47a5", + "0x93fda62b785757b465e6f396f74674d5b95a08c938cf694e66beed7d2f317a4c9d736cb54d7c221d61e8cb3d64dca3ab", + "0xa39e96e33076fbb49c35a58b6e386d22fa7378337bb8b0d47699264f78e5ae8dc143f1f6d5f8b371deafc5c875adb60a", + "0xb5f69b7614fe07889b58142d7b438186d70214ff4cb209b6f271a3bf2bcdef5e6f1c7e95dbf5f2785aa471f0294cd029", + "0x987dd977d6b8d27c4065b61b3c078ec9ce3871fec02844ed00f5ad28c42f9cedecbe830ddd19e11a5c879b01eb0f8f80", + "0x9969ab62009b6aa81734579346766937d22ba73c008d24bebc183d1b3d3cfabc90b47f41b29bc6e23d70165594c2e774", + "0x840ac0e104b22eaebcaa1e49be43689f45434a6c5ddb71eec577323f38836ada5464b317fa3862773132166f2ac0a536", + "0xaf96a83f97ed0696fd29e59daa24e1857e16371f67089d08129f9c236753ea68c93590dce4d32c9e9818a21014da6f0d", + "0x8779a0376579008d0daa99895f548dd091b3abab37e91efc9cabf08835068c983ab0927e7c8eb0396eb83a5e0a713c56", + "0x99289672bfc48d2fbfd51a32d0d7f9d03fff37b8269ce45cbae1e9a091ee3983774d053efe8eae2f2d3f22a9eb532457", + "0xb60df25a7ac1ad14aef7e8809c4bfc190b715f94f14b0534cc2e4015ff6c322883cbdc5309e05d67dca4bc641c69725a", + "0x8c22f1f2a530879a93e744397fa6acca57b01fb62b62188ffa7487464815c605e1520ff4bb18e832753893649ab80d62", + "0xb3acfe8f25eb5153b880a03e07760f7fa30beca475843581b4878ac0412cd2038117f25a48c152e6d60ec16e4b1e9a45", + "0x8163eea18eacc062e71bb9f7406c58ebe1ce42a8b93656077dd781c2772e37775fe20e8d5b980dd52fdad98b72f10b71", + "0x8100b48ac2785477a123a7967bfcea8bacef59391680a411692880098a08771ff9786bd3b8dfb034cae00d5a7665621c", + "0x83bbd31e799ac14686085868e8ea7587c7c7969c7015bfe45fd8e3a3847ad5338005f9cdf58396b2ea833c4af98bd9ca", + "0xa59249e4dfb674dfdc648ae00b4226f85f8374076ecfccb43dfde2b9b299bb880943181e8b908ddeba2411843e288085", + "0x9793a74fa578ace75b083578277a1ae8766d41a5c508b0f1135fb97dff1d0826002393a7276b18cbc4b3c5671360ce0b", + "0xa734a3c947be4c7e6704639d4400aec2ccf5f1af0901b41a29e336afb37c53bf168774939ce51f32d4496bce1a32e612", + "0xb96a11048c7c327709d52e72e6f6ed0b7653329a374ea341ad909311b5b303e5629d6dcf11dcdb195e8c7592ceefac21", + "0xb3b7af9258af054362d461a74fcfeb6dcf3a37b6e33b6df32f8317d50d8be8e1970818a6e41c8232b89e1c8f964c6c1d", + "0x907c827a4fb5f698bf0e6f10ca07741c5b8e3ecb26aa53f938ba34ceb50c01be80c4afc5ac4358a5fda88eadea0cbe73", + "0x84173aeaf3d96368dc7ca1ad5e5575da279113567e5815a364a0356a720c5e08cb58ca1fdd891924f4871d3eaae5de40", + "0x92127d55535bf59f2b00511c82f74afe90529d4abfbaca6e53515d63303fe52b4b22383fb026a2a3f88e96d2bd235f6a", + "0xa9f261d19934fd26458421551e91f484d7a1522a7e7adbfb28f6371102a7650a5ae6efd49d9e33b03aefde647d134ce6", + "0x880b4ef2b278e1b2cccf36a3b5b7fbce94f106ed9fa2820cb9099a7a540a57e9fdeef5c0fb0a743049828fc2b8c46163", + "0xaace45334070c51cc8b3579598d4cd8cda2153bba51f56e3b1fe5e135c83ef70503c322756b9cad9d3cd28f1ecfc8227", + "0x97578474be98726192cb0eac3cb9195a54c7315e9c619d5c44c56b3f98671636c383416f73605d4ea7ca9fbeff8dd699", + "0xac5c01c51dac6ee1cb365c9b03f09906d9b7b9b4d1b73c44d9e8e06823025d7070f242898a975420bc87d6372382cab8", + "0xa9a591fdd18aec8746435eeead0a54bb88e055f55e91ffdd9bc663ce0bc2937fb296034ebb959d6adcf9af94bbd2f49b", + "0xb495404544c9335d5f184cd6873299a93174905fa34c14092f67d9b8545e71fab29545bc337e380dffcb533f7390e9cd", + "0xa3b7fabaabd4c2e555dce46add6c56851b68308c1bb7253576a9f32eda141522317b5c00a28b384ead3a880b8e7e40dc", + "0xae0beb452af7479134a7fbc31a5f59d248e8a67d4c7f73a0e30a51db9cd33a1da3f0ae947fa7e5983aea1343e7daf06a", + "0xa9d9a295590641b2b09d8473b50c0f6e036e1a009dcd1a0b16d84406763b4b078d5de6ca90898232e34f7f7bf147f61c", + "0xa5fe3dfb5031517bb8db0d5ade1e9f438e84bcf23221de003b03d2a2f4ea97629e81c79abc3769bdb8c69a512c189b91", + "0xb614910b247c6ade31001b0435686c3026b425b9bff80b6c23df81c55968633349e1408a9a5a9398a7d5d6ed5d9d3835", + "0xa19e7db50604f6b82cc28bc97135025459c8eac107a1c482919df10b8be2e4f24fceb93b963c0b8ac9f402e2f6ebf387", + "0xabf7da952c9d8f75fcc67fa7969fac0b26d4dc3e022961ed674ce85d734f11620a950fb1fb0ef830fba1d8b5bc3eced4", + "0xb382fa28670a5e14dc954b2db8ace250c73df71ab095304bd8ee28f455ab26cc54f82775a831428e110d1a3a2af709bb", + "0xb284286dd815e2897bb321e0b1f52f9c917b9ef36c9e85671f63b909c0b2c40a8132910325b20a543640b01dc63b48da", + "0xa2b1ea43f51460b3cb83657b4e296944658945d3ad6ae7b392e60f40829ba1da6a812d89f0380474578cbd0ab09801ac", + "0x8b886448cbbbeb40be3e71ccee251632186dccb51697f69eb5c746000b4327fd85be3a58fbd49f1df642a37f6388a8f2", + "0x9161ba220130eea190932ecdad9f114e385a31ec51c71cc8de451ffe5e75abcda37227c6a77f7090d4d8bbf134421bca", + "0xa24d05b51c7c128bb49979cbd9019e6618545d95275a44b5c3d1d03e71bf2ebffdf43fff50c30846ec27d279043cef4e", + "0x8cd1c73b7fe915e7169d351f88ade0f810d6a156fe20e4b52c7a697c3d93459e6d6c2f10dc1c6ec4114beae3e0a8c45a", + "0xb95e3032192bdc064306c683982d885f0ded8b907a532f15526a257ffeff2c8bdd7a2334c10d74b1484909b2e3ae0e47", + "0xac754a42f279472760bd36dd0cf36f5ec685e7fc2970c275811a70cd05843f94fe21745dddbd54135144edf1793aa0cc", + "0xb26b4d483bca73d3f3a976bb595a0e40f9a42094e0febbad3a1874934be1939a1b362ee4ea14a4f5cbfa9b1392796a12", + "0xa841594e74b66935efd295a6c06e2be03cc8c187b277cbf5cd2f590630d4812801ad55f3e502736d126441a2f22f1867", + "0xa845a8a3299f8e5fcf72358521a114c6077251e62ff6a885003f7281b0e1ee33715d9ca0b0082fbf7cb9d452d531c38c", + "0xa7b86e4f1366da44fd59a3ee68018a99c23ba3588789463bd88b0177a9b94030b58cb879a506e64421af966f261eaa86", + "0x85822227f6a96d3b6d6f5cf943e9fb819c8eaf42a9aa0bdd1527055442b1caf672522762831b2dac397af37a1c5ed702", + "0xb455f751232de0a48440d09983f4f4718b6169907979c9f282acf7177ab5b1f338fe1f2acd8d0bee4b4aad61d0340839", + "0xb97b2f1b2d6d744f2322812825ea1cf91453dfe1bbbb2678776e40e7d0fe682239d0dc8053f94d97e5a9678232b7a71f", + "0x815f53751f6d3e7d76c489f3c98d2b49214938cac8c2b417e2d17bb13446c285fa76fd32a97e9c4564a68f4faa069ad2", + "0x8ed7790f87f6975e0f3e501901b0bec1778c88bf39588989014c5dda76c2163732e7e5703c9cb2c1a6144ffdac5dcbab", + "0xb6cacc458ca5a0f04836c5640d34c70cab34cb5c87df28579a0d5e2c72edbc092814bdbe902747ebe3ce36808d8f4dac", + "0xab7c058199294c02e1edf9b790004f971cb8c41ae7efd25592705970141cdd5318e8eb187959f1ac8bf45c59f1ead0d9", + "0x99365fe5ab8ea8bd768ae7181a6ba49b79d240f512ce309b02f09d465fea276298ff55b5b9cb5b4162a901b390606024", + "0xb1afaefc9fb0e436c8fb93ba69feb5282e9f672c62cbb3a9fc56e5377985e9d8d1b8a068936a1007efa52ef8be55ce9c", + "0xb37334c41a3456b73b61d0eb0777260af9c2e400bbec0e0c0fdb45c39ce0dd19f021d9760f35da801f20486c6be30e9e", + "0x95757096c132e7f6c096d7b93a5a0d2594d5e609b9f13c4a9f878e95a389fa1a111b185dc1fd8f7d98b737dcf8d2af60", + "0x8f71f8edae59d6936846d8b50da29520f69b339f574ba9156d3d5f0cd4a279d36bad7ca7eb724dd48aefc4ca9ce26bdc", + "0xac2c98a0ab3f9d041fc115d9be4a6c77bd2219bb4b851cbee0d9257a4de5791251735b5b8fad09c55d16eb0d97080eff", + "0xa09f11d2bc6000d12a42b545ddc29c1973944a39787c5f27c96d4f6aa0d9c8fa9c479f2ed327fbd30376df3fa5b7d2a8", + "0xaa19a75f21a14ad5f170e336a0bd07e0c98b9f5d71f91e784d1dc28a5f5eb6870a4eb35bb41edcf9e6efe982ae5c2c5b", + "0x92a488068e1b70bf01e6e417f81e1dc3bcec71d51e7eabbc53b6736e8afdb8b67d191940fe09c55783be9210e1cbd73c", + "0x95cf2e038c790ce7a2960add7ab44804375f04ec6829f8cc63793dfe9fc48c7471079f81b932726509394fd3d46a52e9", + "0x87fdca39618051c4b3f03c816b13df2d4cd4c7c564e3d8693dcb58145b7b3b3db7884b0125b1e84d9bb82e91bed8bba3", + "0x815922ad356f490910e8cc3b0f7d3934b5e28c09711b5151ae8329876670f3de6d7a3a298fd97b580ac8f693305afb21", + "0x8bb4d08318386c91a0136d980a42da18c05743a5c52a861ce52a436e66a8ebe472dac7f7461db32ea5da59a23e9bd6c9", + "0xb0053550040ab3a3996cba5caf9ad5718867b5f5df273ed8c6520761571f03a94e50b5f8a6a8c42d725383cce97d3cae", + "0xa42c46a7e617d78b12053d7783f0d175fd9103db06d0c6982b38893a20b72fd8ad8501eacb3d47be06fd7c3ad89a8159", + "0x838ff6630dc3908a04c51fb44a29eca5a0d88330f48c1d0dd68b8890411a394fd728f14215482b03477d33f39645dceb", + "0x8ba45888012549a343983c43cea12a0c268d2f7884fcf563d98e8c0e08686064a9231ae83680f225e46d021a4e7959bb", + "0xa59a59db246f981e9c8e54aba52898c714d9787fef8969a6d8677fe6dec82950ff22a1364393b579f3e596cdf5bcd7b1", + "0x8722f3267a945f7123c1df8b6c2122456d81fed56e6369ba726b023c01c1f6738fc12e506e260d99e448fc920fd5e5af", + "0x89d356593ec09d838cd89306ce83c060ee797bf9eec8523f581cf263925699ef0f7161a790bd00bb09681534ed05ac82", + "0xb97fb8ebf2ee1bae5914cf96e5a07887ba41e712530eb2096ace318e989c0ad93060cfcf40507d927af6c7e945bcc289", + "0x88015bec478fd3ddff72efda0e8fc54b74faf804b0a3473cca38efbe5a7e6dc0be1cfe3dd62b8ac5a6a7a21971dcc58c", + "0x860c0eaee51b7de26e99033f352aa09c093943b59237f1313ecc35b0d711509bbe9f939c4bd646deb7de8103eea9ea13", + "0xaf9d13103868c854821ba518907b067cfba025d739125f1e9cce0a04fffc3a2a1f25506c1209a0cfe1d6c1572c229ff0", + "0xac7983d50ec447b65e62ed38054d8e8242c31b40030f630098ce0a4e93536da9179c3f3ae0b34a0b02aad427a97ee60d", + "0x8261f7e644b929d18197b3a5dcbba5897e03dea3f6270a7218119bd6ec3955591f369b693daff58133b62a07f4031394", + "0x8fa2d7b22af8e6b82679ebdfa13efdcb34289a554653ea6c1b16efb9f957f7fe64df787e7b03d8cdc8a732b91c916bd1", + "0x897eed8c65712e9b1ed8213abb85a6252ec30ab47eda4e36aeb8a72447ce7972861bc97957bc321714328c64af27544b", + "0x998c9ee20d33f96a2388b1df642aa602bc8900ba335e8810baab17060c1eace4bc5203672c257b9ae750008b707b0aa1", + "0x92378adc9d56996ce8ecdb9ed6510affccbcfd96712a23631edfd6ffdb1469847aa447db6b2bf61dad416ebcc5b7d1a7", + "0x83fc998e050cb1004fd016c7dc62885b07a95fc9b219fd6fde8ca2824c647f331f6b18ebdbd14569b906cd1ca1066189", + "0xa87c2f13f2a824b7e2c39cfb63ca7b94ae6a11ade0c6b8e83f5092b933fa8b6157a5d2f09c23081f49d35cc85f5db36c", + "0xa89bc7548ea245ce9556eeee3fba98a3256f87499f54a7c5eec0c43b9fb4ef2fe8f6810867ed0df814a88ee100c245af", + "0x8d52413f981bc611427ad0534d25e914113d0ebcd6960aab6421608bec6648b89ae4b2ca2153c57d3cf4f1f37212aa5c", + "0xb0a4c136fb93594913ffcebba98ee1cdf7bc60ad175af0bc2fb1afe7314524bbb85f620dd101e9af765588b7b4bf51d0", + "0xb7ac87da14b783914ab2e914fb7b536893b7a650cdc5baa1f3b4aca9da77b93a3336671335250e6467a8cd4aa8dc61e9", + "0xaaeb0005d77e120ef764f1764967833cba61f2b30b0e9fed1d3f0c90b5ad6588646b8153bdf1d66707ac2e59fd4a2671", + "0x8a60e066b13eabb372067a6b08704f3b6b98c0d468942738768127ebfcf122aef0ae2303f361c6338010fd371646769c", + "0xb7de6d7a4afb05984dce153e5570b104338265e45c8f0156f4d45c458f47add234a479e01c02d3c1817c170b5b65b100", + "0x983cb6bbfe83bce8326e699e83fca01ea2958c09808c703cac97a0ea777e5a5f3f5bba9169a47732de7459a3c7af47d2", + "0x8db19f6dd3789df179ab606508ca7e3da7967ad4340f630bda83df54c197d6bd3a14980c87fe10cbced7678c0c300ef1", + "0xb4e6bb207e08a1e096f6b27a5a60effc74fc8db0b6cdebc9ddbe88f434f4c8e0bd7fa77e015cc309db0f0922bd05b3f5", + "0x951d69f32685615df304c035151bd596d43bc3250f966e0c777544c506e3035d031afa4a3fcca1b85c41a4a041aefc01", + "0x942bee9ee880ac5e2f8ba35518b60890a211974d273b2ae415d34ce842803de7d29a4d26f6ee79c09e910559bdcac6d3", + "0xa0e68d24f784fcb2b71acc2d5871285623c829d0e939146b145e04908b904468a67c07a2f156e6b17bf531adc5777c4b", + "0x921da028f26a61a034f5425d6618eeb61adaa8ff10141bd65ac970adaefd3737a4bbd77d8a7a90cccfca35b0f4d585de", + "0xaf6911edd6c7ad30f905a0a3f78634808832fdeb4206b006934822d673bcced8e378779261b3c4b772b34b8871987f57", + "0xb044857d879d06e9be5dd70498b27a20aee758ef829d37d0ea12b92aa84b9d3c6194205368014d942ae0517cf6d0e201", + "0x8f90e72a54e6894d511061957162e753010812346afd4d90cfedb678b99ba1aacf2b6bd0e49b4b0e684da8082a048619", + "0x8317974fb1bdd174c7ef81a2a6478f887f44c1e8680c21730974e5c440846c4d43a76a3e90334b39508f507163e2ff8f", + "0x976eb5543e043b88d87fda18634470911dfe0e0cabab874ca38c1009e64d43026d9637d39dcd777bc7f809bbfc3e2110", + "0xb53fb1956a2a34a840de4ff0b5b1e0e2fb78a21ac8edbce6be6c26a4b4de6d37e9dce799110a802a344e8541912353d7", + "0x85bca2f86423a09014b562f7dc613246bedffdcb3aa41fee02270c13e6b00c8d6704dcbfbafc5997df6a90c7fc08c29f", + "0x8bca3560946189e4984126acb42153d8dad0b60e7f86518b55ea9ff7c899c9ec12821850943b6adeffbe9363bce4d217", + "0x952a95612aecce4321d2c17aabd2fb260b1cb41df5f76f5b82b46cf818d7a4f18e5e2944cddcd2280a993c0af4f834fe", + "0x9722c1079db7e2e1c49756288a02302b43b8fd92d5671585ac1ea7491123742a2744a526c12c9a0b4c4a80f26342a3a6", + "0x824c8a1399ab199498f84e4baa49ff2c905cf94d6ac176e27ec5e2c7985140dbaa9cc6303d906a07ab5d8e19adf25d8a", + "0x94bbc6b2742d21eff4fae77c720313015dd4bbcc5add8146bf1c4b89e32f6f5df46ca770e1f385fdd29dc5c7b9653361", + "0x90f7fa9a30d9f2812a20db97b3d03962a5b59719385c1881c61009e4c049809efe378b39cf74b64daa981358edd691de", + "0xa4632399c1a813e41fb2055ef293466098ea7752a9d3722d019aa01620f8c5ecdc5954f176c6c0901a770cbe6990eb11", + "0xac79f5491dbbd0eb47669225e781f94b98d04947cbc55baf287365831c100248bd0b39c911ac09b518715ba1ef0602f3", + "0xb9574edb9567f07f85c7c2e6ca6c02d90ad7c7b87d49796f1e2fb7240ad071fb755cf13ca8678668a56217c62df168eb", + "0x889a5cf9315383bf64dfe88e562d772213c256b0eed15ce27c41c3767c048afe06410d7675e5d59a2302993e7dc45d83", + "0xa0b3dff15982a38a2f56d8c6cfc5c5543c045bf2db24571d23387ccab42abe2756f34d5f0bf6a426bbad3c358b8bdb00", + "0x8009dff405aada0798a6cb7f418f73017d7a569a7576aff51348b15913a5e639dd232657cd775cfa0dd811ae5e301241", + "0xb31949c4a21181a54928f25f8598ea3dfcacab697a5653beb288d218d312133e5a93f434010ffdab3f3ebd0b43b207dd", + "0xb46f481155df4c4d576e5d76f1d4054e1129cc49398533ed32d0f681701276cecad4759e47b818f20d6a087989449529", + "0x88158d759eafd2205c770f166829fd61e8f17b2c13f440777eaf45f4d88a6e2028bc507680ff435882d5fb462f813735", + "0xa922d48a2a7da3540dd65bda3a8b5fb1f1741604e2335de285ac814c69c40b5373d92bc1babd3e4b2d32993f251c70b5", + "0xb7efcb232d3b639921ce21e80744c293ea77e25982b609e8cc82bd3999a734ca04ca43f41d9c7c15d162e0bbc3152495", + "0x96b1c82b85cdb8a7026fd3431bea9cd008f0261ee7f4179f4e69a399872837ab836a14e2dd45f5448d54800a4ae7c7f2", + "0x8295f613c162159f368340ca0fc2fd7776f7ad64eeafbd132bd3be1f1c30b5fbdc5f107f12fb0cff15b12c08621f457f", + "0x89e3ff351ce4f0d43cbb6385bac30b37431b31c7c073bacedbe0a60af3dd372aca672c6c4b4d05d2c4b7a040e80f3ef5", + "0xb075db32979df905cef986cfcd6db823ac21dd4013cecfe088885390ff8acd18d76dec793b80db5f7779426127daed7b", + "0xa18f4464cf5cebade8ee280fa00e0917cbf1743aeb0dacc748ab68773b909e30dc60f40fdef3041b5f082e650985f7a6", + "0x8fb51e3ef3c1047ae7c527dc24dc8824b2655faff2c4c78da1fcedde48b531d19abaf517363bf30605a87336b8642073", + "0x93e4d7740847caeeaca68e0b8f9a81b9475435108861506e3d3ccd3d716e05ced294ac30743eb9f45496acd6438b255d", + "0x946d585d7aa452d37a8c89d404757c3cce2adf2410e18613483c19199abd88f7a12e206f87a43f6009e42f4e31ed20c0", + "0xa4cfe97f6e61e45577ed6ce6eb7d1d9aca9e323b79b30736b407000555bf3e2ecbffd6314585b09000f09ee8381903af", + "0x87c5670e16a84e27529677881dbedc5c1d6ebb4e4ff58c13ece43d21d5b42dc89470f41059bfa6ebcf18167f97ddacaa", + "0xac7e49f2059e99ff65505742978f8d61a03f73f40141a2bd46fde5a2346f36ce5366e01ed7f0b7e807a5ce0730e9eaa9", + "0xb471c72bd2971353f4b44248b8e6cf5316812861a88ccfc20fd0d89a5e010428c387228b2f6f14c12f79e31afc9d0753", + "0x86b3a4ea9b1fde00cce79d5ae480353d60cb6ddce363c535bbbc3e41a4b8e39fcf2978eb430091ae1b10420d43193971", + "0x8167484b6a9bcbdef21464cee959a7a6aab5ac92ccc46214f4a2ed520cfb4d4de8917f9b9bd6fad71e66c17bd831eeeb", + "0x86ca8ed7c475d33455fae4242b05b1b3576e6ec05ac512ca7d3f9c8d44376e909c734c25cd0e33f0f6b4857d40452024", + "0xb49379bbb9f954d2ef5574199607bc6b3aa2cc3b48dcc3745cc77406bba2a394929844fec1b87c4ce65cd0ca0f83062d", + "0xab6366a7c6da8ca8ea43a3479e50ecf9a1f3b20ec01b8eae1d2a21ba2223a4ce62615836377c6395580a079c284947d3", + "0x9175ec473efbfaa029aadf1584f986371ecbeccd82ff6a52d1f6c66f51d7395e0ad67a5e8bef0600ffdb348978913e6e", + "0x8cfcdfa192b17321be4e447204e1a49ecaadca70a3b5dd96b0c70ab64d1a927d1f8c11a7e596367e5fa34e2307af86fc", + "0x905a97217fae8cfdc4a006b644e91b097df28e02da2f19f77e18f4b0c4aac2538ea83919a722eee5c0ff315a1daf3cc7", + "0x94b2d97448b452a986c039df1cfd651da59249b649182941556018af4ab61d2c6af82a29e69599153316f9b262efbcb5", + "0xb0eecd04c8d09fd364f9ca724036995c16ba6830d6c13a480b30eb2118c66c019cfdc9dacce6bfd8215abe025733e43d", + "0xb4d07d50fbc9634e5f4aeb884974068ea6b94e67e4527207f5f9c41a244943347d69d3c73af74d8de9ab3659d06c6d6a", + "0x8e54267871d8d3ce2a080e48786be3d97e5fc9404156436dc2a37bf05a588470b7656383bd79d58746d1667ceac54344", + "0x8277508c9aa4d1938c83b48d05fe3a440bfb50c5be79b30da1ac1853d19ee062797be19521f94b038cb991b1237abc59", + "0xb4aa92a60de61ad089cb027ef19a211c720ec0e51743b1166e3d71bac08a9ffff2f0687e250c6a7e1db866f7c4ae8f29", + "0xb9299f950db8cafd236a17f141cd2ea9ff441730749bab3571211d207ccafbf5a3990dc137400c405086c4d2879ab91f", + "0x8c38ab2a9558ac41c6ef736a5560e5960102e92f710efac3f631367a3f6d7227e0813579f349e661116bb29b2163b296", + "0xa5c11337eb91ce0e9b6d61bbdadea0a063beee1bc471cc02dc1d81c5dd2095315c400cbc6c33d23c77e98bba6bdf5439", + "0x8d3cba4d10f94bd3406a341c903ad144cfcfe6b61678d5c03084a56b4413bc30bd20d7a9fd5d839dbb565cc9b2aa99fe", + "0xac9f0b44105cf77ad721b97b0f04a37fddb2bb62c345b0d22a29e2870b8964d7484aad30e454c74608ce9901043501a5", + "0x8be4830a391aace561decdfea6aa610696d292a9e6b56448c6a590027df9f6762668671775272bac46ea335391ae157d", + "0x8e662149e22ce32383461ceb489b912f3c6320293d6edf61499164beaab7a265ffb9de3e0af6c95ca824d800718e1506", + "0x88b49b1130f9df26407ff3f6ac10539a6a67b6ddcc73eaf27fe2a18fb69aa2aff0581a5b0eef96b9ddd3cb761bdbbf51", + "0xa41cf5d678a007044005d62f5368b55958b733e3fdde302ba699842b1c4ecc000036eda22174a8e0c6d3e7ef93663659", + "0xa663c57b72e8acac40127fd3af579dcf9aba05910b26ed1155888543223d6558ee8e1c07f0a0e634e532ef6c5e9cf17c", + "0xaa103a329b699d4102f948101ce5fae27226419f75d866d235da8956f11367e71db5c0a179dd63007ed53f7eec333aaa", + "0x86c53fc078846c3d9bc47682506f8285ba4551475921fd388b96291741970c34b8de4210202e40d2de4acb6e2892072b", + "0xa7e0ddbae16e4491822684c0da3affecbbd17ef96c5c491ac093c6eb4e162fc7854c367535e296fd3d6265c2ed1210bb", + "0x88f0f11d0c2bf51453077cce0d3191931e73b104ee5c524da57e4eac0a88965f58b4abe423c1073f75fe3d3c666a209a", + "0xae8af784224b434b4dfa9ae94481da4c425602097936623e8abb875f25deb907aa7530bce357786a26ed64ef53d5e6b3", + "0x9408bfab1e7ac8b8b888c623bc0438b3a3460aff12436d13888315f496fdb808e9dc00894f272f348ed6aa475f848c49", + "0xabcf138d9363a73131f5bca56679d15606216bae1647c59c2857cb56818a0529c1b4b45e382273c993d62b7bcd552ded", + "0xab37a400dafa918d28ef43294b18dabcb4dd942261832f9839e59e53747c7b1bc44230967a9610b261f3abbd648e3dd8", + "0xa73b3c9d16f6c63659179b74b1aa5a0f4447c683ba38f9fc112efaccde4835e5b92c2f7041fa82cd90b2c4932704b9ac", + "0xa3fd9d8bbdc98394883022299fd9793e0c4f374d8e40d6ce89b2869d3173cb6a5476371d6095dad068ff217729f60af4", + "0xb4c5aa21659b3ae37fde62233b0bf41182fdd57c22fb5f47a236048e725a0e8636b9a595b13d9ecdf18c445f156ad7ee", + "0xb3a5497365bd40a81202b8a94a5e28a8a039cc2e639d73de289294cbda2c0e987c1f9468daba09ea4390f8e4e806f3c8", + "0x8cd49711b42af58a5aae75a38fea9ddc5e4183c467a3159b5b0629f01ba548513c577456d34c861911e85782e52c3b1b", + "0x868c13bb6bec7d56afd4e518f2f02b857a58d224fbe698be0e00bc178c1858e6bf5f0f7824fa013d5c8dd6f6e4147974", + "0x86f5a9bdeebd38fef93bf20a7451ef4c851d63f08e025a59109c68b46f4c61069a6c8c5fe90eb5af36943acc35e62f51", + "0x90c402a39cd1237c1c91ff04548d6af806663cbc57ff338ed309419c44121108d1fbe23f3166f61e4ab7502e728e31fd", + "0xa21477f0b51d73b0816b4b411c12db1e3a83698113ff9299ab2827e8da59baa85dbcc70afb831f5b0c038e0470562f00", + "0x82d09556978fa09b3d110e6066c20db31da2e18de90f973930f752970046f2df96b2a0248fdd833cbc50abad5c756026", + "0x92a346a321cfd73214be02f084ac2ff417900a1392d134b538099c92e7fdb7ba2174e9929c51b5e45bc3bcf718414dd2", + "0xac4b39bb8f0f62666a50574632764f8b6a1dc98afba5a5dad4409c920a0c0d5d2b5c2506c3a0d2f8727b7b7dce2ba1a8", + "0x8296f8caf58316af535def398a43357e48cb3b1e674b857eba1bd1b970da3dd045e22fe6d17dee4e9117f62ece3ec31c", + "0xa931bb29b6200899e8a8c257166400eff9888594daa1e37501390a1d219b019ed1b730d921a8f6d6fe62dff7b86ee387", + "0x8ae9585caa3c73e679fe9b00f2c691732f7b7ca096e22d88c475a89d4d55cb9fba3cd0fe0cedd64ce75c591211664955", + "0xb4a86fb5b0049718caead1bc036833a2caeb88e1afadbbbcb0cd021d95e1f33fcc916f0b97fc1b9226c37050e3463796", + "0xa15e0cb96a463ab81e661ca44c619b71a159680bbc04707ea5a5867ff38b15416e3abe55d2fabdab9aede1f157dd37e1", + "0x8b3f8fc8d2ec7a8db6ecadb8be90f55c1be4871bde10eb18c1773dc45dce042d93baa65b75c4688eb4125b6b7965c2d3", + "0xa4f964d672fa5579479e939d2d5dad6a5dac6fca4bcbf7d5ebbe7489f3809131667b41c3472addfe766d83202ea29c1a", + "0x86f0253db0918337e4e128e8056d2c793562c6b5cce8ba43695a02eae7df12605309722fd1e3b8c02ac513a4a49894a5", + "0x89cdbd610e7f57e86438e50874c3c7ba85afa63f5adcab9e454b5c203e4da65d74bb7cac5995a8652d10a6e438a1c2b8", + "0xaf2dc13a599c834b9af1b54a4fa675c0db92e807cab3bfc825f2c5571b3bc2e1c213cff941cc8b1080d894036f9f73f8", + "0xa0899189bba608887c6cb729580e570ecce9ca7107865ebd30def867afaaa250bac407c30dbee11b7ef6cd423269a8fd", + "0xa22542a4a2ebde18cc6aa29d5dace8b4f6720703f519610dcf01e671018392aff15728e3764730840272c9cfb074b612", + "0x88ce41025aa153a94f91f22e7b96f9342b5e0e1d76274fc70c4df7d08f66d9f7ac86e55a1c6e77693b8b01b2b38bf900", + "0xb76cb8cb446eb3cb4f682a5cd884f6c93086a8bf626c5b5c557a06499de9c13315618d48a0c5693512a3dc143a799c07", + "0xa7741c52498e0a24db3ce7699882de8f462a2b3ed5e9f77dc7200cbdf46b6cdd923b1128759909d6dddd64700c4c20c5", + "0xa211120e1bb3b10138df1fa58efb009a298b8771f884b82bb3de15822b1252124a68f3980f96122a775fb96f05ddc3d5", + "0x92ff79402d5005d463006e0a6991eaacc3136c4823487d912cc7eec1fe9f61caf24cd10022afdab5f6b4f85bfb3eee4f", + "0xa48b1031ca2f5a5acb4dbdd0e9a2b4e9add5ccfc0b17d94818273c8df11e825193fade364e0aec10f1ff91d57d03a52f", + "0xa0af9e02a7620e7ff119c3650d59d80169edd0ad452062b0e3e429c038cdaa4f55a18495e459367aaeb6a92c98003191", + "0xa61687511b627bde7b3977e9a34cb7fddc2aaa509a7b99b6b6c7b97133845c721e1e69f99758698d82cca265d8703610", + "0xb9691fb57be7aeb9d43995b8022051f199978d6ad635e1623a1bc1754b250fb8a94985cdc1e623e98767690a417e92a0", + "0xa6d6ef51a361df2e8f1d993980e4df93dbbb32248a8608e3e2b724093936f013edabb2e3374842b7cce9630e57c7e4dd", + "0x9820d98ef31bab813a0124ce48cacb9d99b2c1c625c41cb3d6e0b21f604ee215d5f37505c86766531dc302622d889766", + "0xa35ee5c2d7800489723c78008b495e1742f0542dbb487172ef438f60424c81aa41c2397095821248066140662133f6f4", + "0xae95ddcf3db88f6b107dcf5d8aa907b2035e0250f7d664027656146395a794349d08a6a306ce7317b728ca83f70f3eaf", + "0xa36dad4f7cba9f4cc843fe40f6240e1973a4c412cae29b4a68712598523cfaecb05272fc47d30772bf06906b5a26e282", + "0xaefc682f8784b18d36202a069269be7dba8ab67ae3543838e6d473fbc5713d103abcc8da1729a288503b786baac182d3", + "0xb551d1ce88cbf4ffbdcb0113a6e319513bd676d0078dd4e6a6f23ad336c1d0fb47a4e427bdedbe0fc8f152353971f81d", + "0xa11a7496c712734aec80738e30d2bf245758b34245076149854eb209fa6403be8bb0d4e515becc881b7f3610749260c0", + "0xb38e558a5e62ad196be361651264f5c28ced6ab7c2229d7e33fb04b7f4e441e9dcb82b463b118e73e05055dcc9ce64b6", + "0x9437ce85146202d3815df7f341a182678665dfb74b96006dc9d6acc16110d00b4a02717b702a765566457710ff5a7280", + "0x813bafdf6a64a9c40ef774e6c8cad52b19008f1207fc41bd10ad59c870fda8089299dd057fc6da34818e7a35b5a363e9", + "0xa5a1f7d42220d3740b3f353de74469fbd3a75ceccb3c84d0a87e43444855be0c51116a32a56cb1980294724d36bdda16", + "0xb4b80d7fbdb1dbf1567dfb30d8e814e63de670839a8f6ff434fe171416599fef831b8e978d6498851b8a81e0bc8dfb85", + "0x971882d02ad64729cc87251b49effc0b8db9880c25083bfa0ff34e7394e691288c7cefbb5cfdc76d6677ffb9da765dba", + "0x8144a5c583a61f809f6a9f5ba97dbed42f4086de71af955f5df5774f66a3581335926663502d7cc7b5129216da225f9c", + "0xb2eedff11e346518fa54e161be1d45db77136b724d497e337a55edfc896417de3a180bf90dd5f9d92c19db48e8574760", + "0xa6b434ac201b511dceeed63b731111d2b985934884f07d65c9d7642075b581604e8a66afc7164fbc0eb556282e8d83d2", + "0x85ab3c57517e3c348e7ec13a878b9303ff9aad78ec95b13242e087ec41f05f4a19366ae169fda8afec5300065db58f2f", + "0xa51f7858f1a7832b743a114127ebee1cffe176c988d4cb2348e45d4ebc52b43f80432c7276c6a5f8bfe39a432d4412ee", + "0x9332251b4b56579b201a2fd9e777e4be80aa213bc986ed5d1187cada9b225a7ed18f1f5bf68c2839bf330e00b2d63f22", + "0xb87e5f481b938ac8a481b775cc58be2a06604549e3c810fc4734bab76099e5c617f0243c4c140cb7dd6d36a6dc2286bf", + "0x83ca733849830cb8fc2ef469e7e464fd94def561ce49ff0aa352a6ecd0e52c7aefcd69ab59f3d1ed2d5b8536d0a7895d", + "0x8302ad0f2234535b55b975c5dd752c8a555d278b85b9e04e83b1db3bb2ae06f082f134d55216b5cacbf80444e1d0af84", + "0x8c627caf25eae6764501b9eff35aa90bd4f24952cad712aae20344579e83ecd104ad1f7915edc4f9023b17fddbdb4cd7", + "0x91066bac5341cead3d2cb168fde7da62b3dcf933ff5c1d379a4dd424b218c4e2ebcce038cc342e758795ecd4dbb8b790", + "0xa17e8874e2c59a2bdc31cc67095a271d31d5a4852ccf2a82eb7c457a3ba8c87ee5beb93a65a8f7bd04d10247e63d6b84", + "0xa15ebe9ab6de62a4d1ff30b7fc58acfb14ea54d7fa513cbcb045af3070db22bf9c1e987fa26c0c54356b9e38fa412626", + "0xa2ee6c29efa982e9b9abd3c5e4f14b99d5d0369d7bfc3c8edae1ab927398dc8a147a89e127b3324d7f4e3a7494c5d811", + "0x8cde690247d4831dfe312145ae879f4e53cb26641b3a3bb9eb4d590c56c11ece3cfe77180bd809468df5cddaea4f5ab1", + "0x8dc3c6478fe0150a2cc11b2bfb1b072620335516ad322dc5a644676a4a6aee71a8680eafb37db9065b5aa2f37696de07", + "0xa35fe9443b05f6632b080d0812e71142dba534b328f7d77e165aa89b370c158be708fed2ab8d8b3c60a3f83d6b1c4fd7", + "0x8266f9cc52944d85c50ba04d421c0ecb7ceac774f4485bca84115772ade238fdb5f5bf93f1f6c5288b3a44af177042e5", + "0x995194ca593943e772c58944789a30f8a91f20e58059967fa65364e4357b3483b0f94a3fe34e133bcf967859c5bd026d", + "0x83117ec2e506e292ff4759c270b3bca2ac221fc044ee7d3a4fcdd424ff0f4b961d6d268f7b9fce9ff07d29a4cb6ee3fd", + "0xb0a47515752c15e4dbeaf9ee27fab3b5c0db82f5c685e8f716fd7d8764164944340430fe3db1a5679e6ffea5a16dd919", + "0x91babaea18cf8f1e56feb0b89f0a3956c6469bb963d63312431057093b0ea0240a36abc3b7ac160e644e826cceb62530", + "0x9302bb41f741deaa5f2b6e3bca1427a6cf98b7ec2bf7967b7c0595efa258427323a022ef12f23426ff7a7c318462f07a", + "0x9022541f84e48b655e74bf3da484179e0e0040827fc71e777b68f19bcfd0e103d385ef957692e7091fe713561f38035c", + "0xa3b109249ac2900806f0f39338da72d4f2cc6d1ac403b59834b46da5705cf436af8499fa83717f954edb32312397c8d9", + "0xa94ccbf61b3a857744aa1540fc6d633afb8ab3c92d07fceef90a0dc54ecd2133490cbaac8832b26cf2f4b956471f36fe", + "0xaa744c552b5fc41e1ac6ca53184df87a1b7e54d73500751a6903674041f5f36af25711e7bc8a6fbba975dc247ddad52d", + "0xb544c692b046aad8b6f5c2e3493bc8f638659795f06327fff1e9f4ffc8e9f7abdbf4b7f6fcdfb8fe19654d8fa7d68170", + "0x94179fcc1fa644ff8a9776a4c03ac8bff759f1a810ca746a9be2b345546e01ddb58d871ddac4e6110b948173522eef06", + "0xa3a7196fecd25e9cc7cac79c35365676e48c7be1493df255676adff2209c0719f2190ceff3ce008d08efa07c244c11a6", + "0xb746447b0c0d7165f965672d71c318f2c1052a5ac6ebe320b14165c9276c839ed822a9183ea6e6dae63a4f826d421d65", + "0xa66d5b1cf24a38a598a45d16818d04e1c1331f8535591e7b9d3d13e390bfb466a0180098b4656131e087b72bf10be172", + "0xac1af27a7c67b1c6c082f0fe733046f8b155a7d66caa8ccc40a53ac5a55a4903d598b5f80543ea52c25205b02959f4f5", + "0xa485a082dee2987e528d1897dfc5ee99c8de9cdc0c955fc38c404c16c35b71bccd08770c93102110547381a2eb9d3782", + "0x900b9972180a2c8753f5ff49fdd2cfe18c700d9927b3c3e16deb6376ad6ee665c698be72d4837b94911a0b4c183cb140", + "0xb8454e8438641340b7fc8ac55b869abe54806f873ec0f2d8fc5425a1ba76ed8471425440621763b6e9d834b6e5451b98", + "0xb3ed0906d97f72f0fd5fe01cbd06b77d61c69f059f1e87a143a5630073ab69ef8876bc2a5e261d467a7f00f0050388d5", + "0x90a908b47d0c29a2d0e7e65a212d7e1788454062f46458c519c7f2ccd794ff21d4c24b91acf42a71a509aff6544f676a", + "0xb07d7c3f1d486f5657d5935e3d67403024ffdcf25da5c460fdadc980d8d6b931de623c4f8a3da5eb6af346193eb36573", + "0x87c2989f377be3751da3bc19172c5987d21c095cc3d851ee5120f67a5b3986d387b058688d54336d8510c49c6a66d754", + "0x8e70e4867d2731901d603928d72bbeb34b2e0339a4f5cf06e7a771640717421b4ea039c61dde951582a28c2ff152ff70", + "0x8336744d8ef3a3bb3e9ed3d6b83e08cafffc76b7438adedd3a7358b32acec0e73a4635aa3166362ab4e158e68576255d", + "0xa70132fe0c9580ecce2e3c0d4a531cabe48bbf6e7d1c1daf9ed2f315e81705bf1616b4cfda1c903b074e239ac6ab4c47", + "0xa978fb8ce8253f58e1a87da354f06af989b0bafaafec2fb3100bee272dd8664d2690f8ada7dd4817bc8b06ffb1fe23f9", + "0x94274299f0faca1152cca89282c10d00b5d3679cd4b7b02e018f653257b778262fb3c6c49d0eb83ce388869c283c3c05", + "0xb8233d647876eafe2746c10c1b41d99beea28b2627ea2ecb67a3eb0d166fadbceee34dfe942aa4ecf39e0d55f9d6d2a6", + "0x980a54f9e9d88a7ec08d04edbdd7c9222e99f270b1e978ce7140cc67e38a2e60cc1034dc5b0deb5b60e10697d3bc7295", + "0x8553bfd1a163df0d8bb1424383552b85a1c0d288dc1f46fdde90ce2d9be7e2688d7d06e1d6be06252c7099588d3488e5", + "0x8e8e48992d0394fcb9a0c56bbd3797400128e28fe395ad9acf582919d66d11a4811a7187897e60ee2ab4842800c8c36c", + "0x8853eff72fa4c7b4eda77e448e12bc8ee75f5cb0f35b721c7ee8184cf030a11e3e0278a4e76b326416fd645a9645d901", + "0x88e1e459ee5aeb8b36ed004f6d03da296101106fbe1b18f9bbf63e92321db51670c34050fd3b7dc56a4bad76403823ee", + "0x890def696fc04bbb9e9ed87a2a4965b896a9ae127bc0e1cc515549b88ddbcbc02647e983561cab691f7d25cf7c7eb254", + "0x95915d8ff2df795e7baac5433887c39ec6bbb9281c5d3406a4a1a2008f96c6f266adad4824c6c46429a158e36f5e1210", + "0xaf917d086e2e327d8d9e37ff85702536d7b15f444310d4aa832a61d850c7c3f09d31b3f5fd2a073e7fd64601275b6fca", + "0xa448516054e31866b54f1951b9a03f0a54fb13d938b105e3f67396ed3fbb015f290a37fa538baeb077fb4f9ac86c8305", + "0x8e58219fde5e9525e525b16b5332ef27fb6269e08e8c0bd3c20abb89397864b2c5bb55f5b6e03e8f0a0e0b04e5f72b14", + "0xa798a0371e8cc4dc42ccd79934b0db5a3a59f18a0ae09f2eb172596428fcb3f00312e783d6fd21cbc1610317f44e08cb", + "0xa8cbb85e8f38734d95b9d69346cbcb169c149b9801d9da46df5e27b5ff8d0ab7b870c83db3fac32a90d02efe5fb8fb49", + "0xa63868892ce200c7d82d7ae041db371c91ce03282adf796c8b1a1652732ec77add0945727b110339a80596c367c97deb", + "0xa0133deca5ae8f1100df8db69920b2d0c31aa21bd3849dbaf4c264eaeaec8937ab8f982770ce1ea17e0e258910a56d02", + "0xab88f81dc77f09a2b62078e7baf4b6c7503925a7a077bb30d72f4baeff8225039c5333242e325e824f7192d4d132b596", + "0xad83b3c5e9a08161950b1df9261d332dda2602cc68e0f5ee75bfa7e03bbef9edfb4945ca1f139df1bcb8affe8ae025da", + "0xa52c5a63b55a8001b6b67c5db4fd5e95923052f03618369312896ed9892d99354aebc0dee8c3b365bafa29e211a5c3f9", + "0x973dcf44ab60f55f5d10a8753ea16db9faedd839466a130729538f3a0724f00f74b3ca1de16987d7c6e24e9467f62bc7", + "0x991a7c93f06d50ec6a4340c6751b73eb5825bad02a954e44e1e2d424af928819ebbb590c6129ce35b3f1e908e2152f33", + "0xaa48afa77d5a81cd967b285c0035e941ca6d783493e1840d7cbc0f2829a114ace9146a8fbe31ecbd8e63e9b3c216a8c5", + "0x8c01b901e1067a89471927d911246a8b2f1284e93be9913406d7c88aba784694317e22a0a7635583dae7db45cafb73ed", + "0x942772b7c7c47d4e5957ccf1d6f1450070930af3e2b7eaab0dd7699372445df0cc910e6c0efcf501887dd1adabdaee23", + "0xafc555559b435c585b61096a34a15b8ad8722b2d3306ac8cbf158b46c135b293b08a5f37b109b138350dbcd1e0da9f8e", + "0xadc806dfa5fbf8ce659aab56fe6cfe0b9162ddd5874b6dcf6d658bd2a626379baeb7df80d765846fa16ad6aad0320540", + "0x80bdb82b7d583bf1e41653966b0ba3b4fec0e7df2ff08e3fa06fd9064bca0364263e075e1582741a5243bde786c9c32e", + "0x8d5776148c65e35d717da1902d74727b3bee21ceba8d337d77738932865f1b851e810b91346f705880da6cac63183717", + "0xb9d24940937b6e50a1797cad9ca58d4b2b2d8987bb8ec056ca2f397a2bdbb7af7939c0f4bcdf5a3b6fc80f65f9d535ce", + "0x81d6fc2f01633e8eab3ba4d72588e14f45b00e68ab887bdd4ec5e8558965db21189310df973837106216777b07fc0805", + "0xaf03bc1e94067741bca4978b9cf065cc6852090fde3aaf822bbe0744705ebda5baac6ed20b31144db0391309e474ba48", + "0x8cf8412bd48b21b008f0207b1f430ed96bc6512c3712dffbbecb66e493e33698c051b27a2998c5bddd89d6c373d02d06", + "0xb9c8a3894365780842a2096da49e48f7e77f05972e2acdeae8e8fed8ddc52a1e2fd754547087bc9292cf0c868155fbcd", + "0x85c8e7e1d7ee3ed366b530c5c9fe0a353f2907d8b80b16d00391780c04e3f7e060d433539780457732864e334039474f", + "0x8a3987de0131b7461bbbe54e59f6cefe8b3f5051ed3f35e4ad06e681c47beee6614b4e1fba2baa84dff8c94080dddda0", + "0x852ab89dc28bc26f6300800d9a3046bccfb3fe1491f29030f1389f40ca452f6b8a2f6d1541c1e523f1b59f8730823488", + "0xb5726aee939d8aee0d50bf15565f99e6d0c4df7388073b4534f581f572ad55893c5566eab1a7e22db8feeb8a90175b7d", + "0xa356e5b70bc478c625e32a38d29f0a619fdeb665503eedc304d1bf34562d4b6814dfc30aee5aee94ca4bc6394e412765", + "0x8b476b3b065a3b95a3d11ec60a749c2258ddcc5885bfb50b8a086d3fd1e49ff73e1dde733b8981c3d2d206aa0c87b09b", + "0x9171a7b23f3dbb32ab35712912ebf432bcc7d320c1e278d652200b5d49ad13a49ec8e56a0c85a90888be44de11fc11b5", + "0xaeddb53c6daac757916039e0992ec5305814e9deb113773f5ecf10355cc3723848fd9c55e0a6ffb6bcff4ad65ed5eb3c", + "0xb576c49c2a7b7c3445bbf9ba8eac10e685cc3760d6819de43b7d1e20769772bcab9f557df96f28fd24409ac8c84d05c4", + "0x8a277710379ba4fababb423026d9db3d8dcd484b2ee812439eb91b4b5177d03433b7a4486e43efbf2d2ce8ccfeabf323", + "0x80e30cabe1b6b4c3454bc8632b9ba068a0bcfd20ce5b6d44c8b1e2e39cbe84792fd96c51cf45cf9855c847dc92ce9437", + "0x804c021152c3304853941847e80480fdaceba3b9676fbe018268cf77d1a1856966c2f9686bb4d4aa0c4118a7e85f83cc", + "0x901f724ee1891ca876e5551bd8f4ad4da422576c618465f63d65700c2dd7953496d83abe148c6a4875a46a5a36c218cf", + "0x90fb5cac22a22fb8a6b619f1eacd95873be974d4d5d1f7080e523bb9b4b2644eda7340d780bd1ea8ce36407ca0410fea", + "0xa34eba9a41f2307891af1825ed501b74278f67eaef4bc57cae5c0c46202c19fa0d9a5dd8b91325f6c151a0644762ef29", + "0xa5c225b7bd946deb3e6df3197ce80d7448785a939e586413208227d5b8b4711dfd6518f091152d2da53bd4b905896f48", + "0x84888f2efd897a2aca04e34505774f6f4d62a02a5ae93f71405f2d3b326366b4038854458fd6553d12da6d4891788e59", + "0xb897fa90529458bdf3cede5ced3f3823dfb9b6d93b96b81429bf05e8f1a80f7c857d458045cfee58296b3ccbc4119abb", + "0x8117fbcf61d946bee1ce3dff9e568b83716907acfde9b352c3521cfed44158874af8dd5b3906b4a6b49da2fb212ef802", + "0xb6e9fe9fa3d4c833c3beae7f798f30f07e3cdf6f6c8eb8e2b70cad51b37af2549dc9f2e7f97f194e5897d4dedb904a45", + "0xa7555d66719916a2be7a7f0c8b7001aa2925bcb79723f78288f10831f9cec64923228b0e4b89dfd4342de8f70ce03cb4", + "0xa10788831a0cb2c3d14d8bc214d92bee6e2a9e92c423d2974760d84a6872a9465d12b628f9bd8a6e777a7db6f509b3a0", + "0x946948e31311703f64d34dc6faaae992e39b7ced92ecdc01df9761e3819a6db1266be718fdf434fbec912da37d1986f1", + "0x8675d210e67eddb3cefeed200b9e205679d36d8dcad70f09e678d8d1b3eb1059d12542f3aca300f384504458a881dd60", + "0xaaa18df4ad95f7443955accf8ec206f46d4d8ad9f1adb07b143b4225590917ed7ae050fc329d54310d3d0b198cedaf0b", + "0xad77fcac9753efba7a9d9ef8ff4ec9889aa4b9e43ba185e5df6bf6574a5cf9b9ad3f0f3ef2bcbea660c7eef869ce76c8", + "0xb201b0546f19c5db88df9c684cf55ed623bdb43927d06051bd595497df741feb1485961f64e8d3d1811d9e2e9e1e54ad", + "0x836075979eaf386ff6cb459cfd48fed171ae812b0ac3b38dc24dd8ca905cac1c600be717d4a0defa0a854f40cfaf8c33", + "0xa0617db822d559764a23c4361e849534d4b411e2cf9e1c4132c1104085175aa5f2ce475a6d1d5cb178056945ca782182", + "0x9831b8c836114f6d8213170dde1e7f48d5113974878ae831fc9b4da03f5ed3636342008228b380fd50d4affe909eb54a", + "0x97b43a6d1a47a1c415278344dba0cdfa952663a71fdcaf58d313c161e479ab5d1b980d8870055cc8f0d283bec8f97425", + "0x9340bfc34ffab8c28b1870a4125c559978ac2b278f76f462b5c859a00c3ba3426b176dc2c689096ad575b4cd4dbb76ae", + "0x88ad79a0320a896415e15b827a89969b4590d4dfa269b662bdc8f4633618f67b249f7e35a35884b131772d08025bfc32", + "0xa0230bdf83cd469c7248074bec535eba8280cfde587d7c63d307149e9626bc7642b4bacc9beff2d8e8f6ea398dc0ade7", + "0x8934e9a3feababa12ed142daa30e91bd6d28b432d182ac625501fe1dc82f973c67f0fe82d39c9b1da3613bb8bfe2f77b", + "0x87fd7e26a0749350ebdcd7c5d30e4b969a76bda530c831262fc98b36be932a4d025310f695d5b210ead89ee70eb7e53b", + "0x83a9cd621beecac8baebf7df4f7ee17bf4b70aac31df816ec3efb5cfef2dc5c0bf959c5227df3a7ef4c2b8d1e1b658a8", + "0x9529ea4a51324ed4ecd855faea43846a223da8cbb494e5854cef700ebbcf4d76119cef16192e6b7c51f82ab79371756e", + "0xb15e1b4ac64bafbc4fdfead9aeff126bf102fdd125c1c914f7979680ec1715fbeccf3dc35c77d284421ec1371ed8bc32", + "0x8f1d90034f998018c3f4b5947b40b139fcead2e40aa80fdec6a4337c60e9d5ff1923dda7f0b5b1731ff16f55027d41bf", + "0x86b706c5d3c5aca72cb23ddfb6452bc70dd3b1a98c8539a7c32f760778b401cbe90ef86c12d0468892dbcbd9a268a38b", + "0x9752561179783f336937757b619b2fdcb9dfce05aa3c4fce6d582dc966182eb85ab4ccb63e7e1736a7c5fad9d33cccd2", + "0x8bb51b380a8a52d61a94e7b382ff6ce601260fa9b8c5d616764a3df719b382ec43aec9266444a16951e102d8b1fb2f38", + "0x8097b13908662d245820f3b045d8c2c665fe9a054e9c661323924ec86dfa713b36b0c787ad4dfdeb979318810e687a48", + "0xa09b2a07d861e01645accfb088f7f9ad524186bd439712775459a60f8a1fbbd43ee084e4d6e23ffce06daa189cd1e654", + "0x941e2e3ba414a371a11c3fe92cabf688ff363da6230ec7c83ac7303f652a19ebc89cc494427c456d0c2ae84c72053f73", + "0x820cc2ac3eed5bce7dc72df2aa3214e71690b91445d8bb1634c0488a671e3669028efbe1eae52f7132bde29b16a020b7", + "0xb5222582ed6604b9856a48039bd643340f4bf1bf0fc805e8453a9eb7630d6cea1452d28536706d6fa3ec16617617991c", + "0x938bbaa0ba14597067ff4c0a7cfc1529c44160d6f61cfad12246526d84fb7a1ba964d3bbb065a348cf7a98356ee15234", + "0xa83371f44e007c708dc4bcafa7bd3581f9080a4583c9be88624265014fd92f060127e628de5af3c442a25f049c7e7766", + "0x8c17ccc763fcdf2ba7e27ea643654e52f62a6e3943ba25f66e1003fd52f728e38bfd1036c0d50eb3e3e878378bcc2e9d", + "0x9517cd84390fbbfb7862ca3e0171750b4c75a15ceb6030673e76b6fc1ce61ac264f6dd1758d817662abfc50095550bd3", + "0x936f7e20c96b97548fef667aa9fa9e6cfdc578f392774586abe124e7afc36be3a484735e88cc0d6de6d69cf4548b1227", + "0x908d762396519ce3c409551b3b5915033cdfe521a586d5c17f49c1d2faa6cb59fa51e1fb74f200487bea87a1d6f37477", + "0x8ec38c68afdfb6ba019204039c2fb49a35467058f561f626fa87314d705fd615a7b9966576052be1b3690028d3c5c7bc", + "0xb790669f1acb10911e520198795b259a18471cb3ac03f3885b4fa40626d414e26025790296fd078ef5c3681ebe4689cf", + "0xb659c05488f778fca3c918505d2d849c667471af03369ad9fa29e37bac4cc9caa18e749c62fcff22856945a74ef51356", + "0x97ffcbf88b668cde86b2839c7f14d19cb7f634a4cf05d977e65f3cd0e8051b2670e521ae74edc572d88201cff225e38a", + "0x9888c250b4b60306f4ecb1babbf95d0b6dbf6186503b2024b134478d721fb782d801bafd126cc3247bcdb1ee9d66de85", + "0x941f73b2138b4347ecafcc7b8c3d03f2a54dc49f580394ed08f22b0878ee7cb63d42978f1d320c09e7dbc67648c06f8c", + "0xac3195143035cdb4ddcd5f93c150035d327addee5503ea2087b1a10b2f73b02453ddd1a94d8e7d883e365f9f0e3c38c9", + "0xab6b47627cf76d9552c723818db5ebee7734542436b50ffe15b3a96e8e7a6b54f9a0965de78405e16e309193f147108d", + "0xb7c66da483b18f08344fc3c27bdf4914dabbcefd7ee7672fab651d05127d85d25ce363b0c338d6eed55c4e31f57bcb35", + "0xa641eaa149c366de228a2833907ad60eea423dd3edf47e76042fdf6f5dc47a5b5fc1f1b92c8b96c70e6d8a68d3b8896c", + "0x805c06e565ee67cab0cbccb92b6656fdb240b430766eade3c6b0a0b1b93c840e2b4f028601451dca135c783239463880", + "0x8528cf6ed82d9f729f9aee83c3ef763d85649d46019c4ca7dfb58d7824c2003f88ddb2bc5a40c4d78d86e68b675f4e56", + "0xac2955c1d48354e1f95f1b36e085b9ea9829e8de4f2a3e2418a403cb1286e2599ba00a6b82609dd489eda370218dcf4c", + "0xb043156fcd02b75dbe940c763fa8e8a7c7f6d74c1d5395db5ce544af3b6097eab61686950535a810aa95889ced12f74d", + "0x8e7d1dc7beb2de660b7da19ebf4cfef3ebb6a3d6f2f367e2dc91105653226e859137879171dccc586c10d9c4cccee7b6", + "0xa278bea51af1de8bbd2319f3a37ab14abc3bc0289ed31aae44f38897a7b24263a4dde1cb037e1441217bec0ddcf47266", + "0x8afa23226c47083bba80ab1be55b48c90c6629135533e3e4c14057d19febeba7f8e2cabe617b28ce1f0bd97a06972f66", + "0x9865218b0eb281e547e693055456d1d0c598bfcd0138dddb5edd5f5ff66cc2d52465f3e70c0f321246036d7ed8c606d1", + "0xa3a6d1ee35cc0ed9290a135086b32f136028b320650e1f3443434af7ff52dd74c546ffe2a1bebfc329f1b52cd72aca34", + "0x812d3ded3a3c9e58eecf13a29bb4cc13b01b2a0af322423a29bb0e4f6d9021d1d87ac4af7a2a6b88d34f44a8bc1b3c55", + "0x8d7dc174aa361d046cf183dd202cbc12fed780d7053f7047e11af9aded336318bf9928aab73ebfc81ca86f12007077b6", + "0xa9fdc2209bbf48970a404de3d803c65b11be96ab5a165183d05ed6477b3a0c633c3d6f0cb8eefb430fddb5b5be8cf887", + "0x83a798f47a4f62dcb8b531d463b0fd4a876d47a8ca990710290549255033c909de709471b4e823a60bf94d8baf8b5acf", + "0xa8b0bb9e1f8b0508c7d6e7382676663d27fb27e3f1c0e991a295e59498f4a5dbcc4cf89c73d3d587fb3b8f5838153885", + "0x80414adc7e0a9cb961b1f31682c33d8e01e3b8cf2aa2c2a911ab9b1f54d5c4bf92e18466cacf9b80333112ab015136d2", + "0x82d2b1053f6610064f838b3aeec585878f86323cac357c4aed054d87595c7734729a737b29b57940884ee839e984d612", + "0x91efdbcaad9931312d7c41d24de977f94d7f3f7b88090a1f72d9a097a1e30cc805c5ea16180f463022d9b26b8863f958", + "0x90ab68c372fd01bb210fb94094adb27296b7144d964bb1dd807ea8f718181747356b0f9db3feda78dd7a596209099ab8", + "0xb40a3bae2b08c13db00f993db49e2042be99cde3d6f4f03d9991e42297933d6049394c659e31f316fcb081b60461dabf", + "0x94402d05dbe02a7505da715c5b26438880d086e3130dce7d6c59a9cca1943fe88c44771619303ec71736774b3cc5b1f6", + "0x8adb748d5fa5c22ce4c76a1debf394b00d58add9f4e08524cf9c503f95981b36b8d0cb2dfaef0d59d07768e555733ecc", + "0xa129c9cf33df42b5a98ad98be9d940207ae154c715d3bde701b7160dfe45304679fb0481a4f9dde242c22a9849fc2d9c", + "0xb3180ded54610b1b3a2db7db539197ced6a75e9bb381d1f4b802ca7cd450f5418522ad2bee3df1956ed63ff1ffe95dc1", + "0x80e1dbf3296bdfa98aeec1a7560682165d13bc628061bd3257f345aa1ba13f8bd1bea14f117af562be22118f5a8265af", + "0x8d286e63f64a3e24c2e4c2b91bafb7c6a71d9438a2ffd7288c58ec6de9db6194eaf671b39c5a462c8658ad3cfce46f85", + "0xb4f4ed1bd274a852189719a8808a8f214c8386e844ca9ba13161b75d04c74633b1d8a758ce0b23ccbce8052494c81c3f", + "0xb1a3e6baed1cc37b9a67f38648f4fe365d23fb982027ab4202c3392d5459d7995264c2e9bb8e821a3e75e71390b6dc7c", + "0xabd7248ae069d3a3a45b0ef4dd5d7d54b62994e578ea20bdd3b7876596673953b94c5b109a6e4b953b517544b915368f", + "0x9377aab082c8ae33b26519d6a8c3f586c7c7fccc96ec29a6f698b67d72d9266ad07378ba90d18e8c86a2ec77ecc7f137", + "0x959675679fb41dd62595d8266e796834c1207dd70750e304b1ce45d3fc215ceb5214d6651fc97a061b6a570eba35b811", + "0xace7fda25c2fb7c18710603c16a0ff0f963352d1582a42a20c9f5603c66f485df8383465c35c31e8379b4cb2ec15b4c4", + "0xaaf15335f1fa2a187f24f3db7966fcda52c2859113ed8f460167538f5cde43429750349f9714edda0adb6705d401d27c", + "0xab99038a2a6f9228d5d7e67f47107abaf06af293586c3a6ab1adaf02aae373e3434ae3e26bb617302b8e3a7ce5107bd0", + "0xb3119de346a02c87743faa4a20fb90e7eac404a6f81ac681d593171cb29c5f79d4d5ab761b66ec71d4a86f43e0b4165c", + "0x89255902846cb35c706f6e8869a9122527afcf8a8b8f5f81497b5b71c6a96c601e7185acc78646e2a7884d148eeea815", + "0x8c26d4ec9fc8728b3f0340a457c5c05b14cc4345e6c0b9b9402f73e882812999e2b29b4bffdcb7fe645171071e2add88", + "0x903b9bf66c147ddfddacce63c8f12f62e45638383bf91b50e2fef29013ce54a3fd8c3eccc9b8961d91ca2920ba5b0c1e", + "0xb7a2c83971c4e4132f3fcaf3c4374872de67ea5d89814492309cf924520a23787401f9621681fcf526154e80849a7e72", + "0xb74f6e53b56856f88f8607b1c4e6c9e54aec15c5bb891e7bab00e2a13caab3b1d6529bf0d72d4ce99714b8cb8b973f1a", + "0xab8a8769c754008a7976b6799e81d7bfe97413d0a79b90715703c1f8f567675463ec93aabee59277121fc4df88b5c7a9", + "0xb34d4d2e15079e7e80fdba30cddf4fc0e6c9a61f7ab06a6ea0a4e55fd5bf632c6d72e021d6264d935439d321de883bb6", + "0x927c030d5a69f0908c08f95715f7a8d1e33bed5e95fc4cfb17f7743cb0262755b1e6b56d409adcfb7351b2706c964d3b", + "0x95718b06017ba9d45894867fd67148645d25d9db2229aa89971f444641ba9db4c5c6f0785f3b25cf2cd7fadaa6adc5eb", + "0xb30faf88fe203495aa268503bc82576f76a27f8bc8c4125b4c6f6e5e7b6880d495481cc9454713e0833317fa07da9b5f", + "0xa9ee291de5997232c68c9f6c3b568b05f46bfedfa18eb3776699d98cc7c6320003b7d862564d07fd28fc3691d1d28b21", + "0x8e54c7270d2c7041796f202e929ae921fd0fcdc8ef1e6eae7e67d461114fd45ecc7fb78247c072222e48d1292a12acf9", + "0xb7f146a357e02a63cd79ca47bf93998b193ce1174446953f12fa751f85dc2a54c9ed00c01a9308509152b3bad21d7230", + "0x8aadfcf3562f1c357068323352cb1745349a27a7362358d869e617c2410db747149b993ee9e881e252ecdd42fd75f351", + "0x8068da6d588f7633334da98340cb5316f61fcab31ddfca2ab0d085d02819b8e0131eb7cdef8507262ad891036280702c", + "0x89ab1e5c2565f154f92c9b3554160832d176613f1a2f872b6ed62ed925a33fb0b40b71b7443eaaa15099ab24693c8d13", + "0x8e9bccb749e66fbe47296f5dec33bd86e52987516263240f35ce9a212dbcf71348b60a016f830f2acd05482962403542", + "0x8fb74891a8642f25a55b5eda5818367aac2fdf9663ad1e3dbc0166b484c0cda581b243cc75131167f1afa9caaf6705a0", + "0x8027bc62b59f9f15613e38da74ccc71fc3eaee26f096d187c613068195ce6eb64176013f2d86b00c4b0b6a7c11b9a9e5", + "0x8658a15df961c25648fd444bdf48a8f7bb382d9212c0c65d56bf9cdb61aab3bd86604c687fb682260dbc0ad2dc84bf01", + "0xaf76d2de3664f45ed4024f1b944cd316cf758393232bb07bc695e5eaa7f04e7e09007f29e83f62ef6fa25d1000113ca9", + "0xa3c4269e6fdb75882f0bb83529388fb8e08d025d00d869a2ceefdbd38a060e59535bca43012815444cb84021787f6c7c", + "0x8784a8fa62e0ce23283386175007bb781a8ec91b06fd94f22a20cd869929de37259847a94a0f22078ab14bb74709fac6", + "0xa99cde5c7c85ae291c74c893e598cc0e6eb2dda2a81dbb504a638eb21dd2c41d6e5caf7baa29e3c1c32e94dca0d791f1", + "0x802f512bd4a97487491c0e07ab8a94d5580c72212032e34c42b7039b860a7cf8f1e2e24b7185b80d3ee00a9cd4c92903", + "0xb12fd5f747c5223c5150dca2728bb3a363c5bdade5a9d1415642b2201c51aa6bba20a988c51bb6452fee7e05a8586b42", + "0x99caf2cbdd4427666fcfb506bb6956772e058150b0638eacd5db2e8869c8565c1ff2c63f308bc3143874e0f31446292e", + "0xa9d47cb4c69fde551b2648a2444091502a56a778212ab544ac75cc1bd14d0f043f4e31de47fce9a890ef5428cc28dd41", + "0x94240350a53e7715c178382b174c4f918d35cde875faeda528c2f32073085c6032b47fcf00240dc264621041c105e0e8", + "0xa413befdecf9441fa6e6dd318af49173f19e8b95b8d928ebe1cc46cacc78b1377afa8867083be473457cd31dfff88221", + "0xb7c4e55e2b48ba55a71f72387475886e5b4715100e93cd2ae09582fd37e5646b54bd93fba311b65c842bd0aae1424bc7", + "0xb7ea5e0d3cfcf0570204b0371d69df1ab8f1fdc4e58688ecd2b884399644f7d318d660c23bd4d6d60d44a43aa9cf656d", + "0xa7c2174eea2b66b2a71cc8095fae39c423a353c7d5020ec2d0551317a66202fcf082c6119ba768755523fff49791bb4e", + "0x991e0fc7fddd0e316cf4bfe20478f10c15b8bbb618e6be52a5095e457ca52db8adc008f47d4624b6cf4f7d6c2b94a29e", + "0xa7d76c88daa3ba893d4bd023e039e1f587565d317609cc9ddce73f2d3c4d6d9facee20fca31c85322f10fdf15267fbec", + "0xb880555398668dc7d064a18ba82d574999a93a6843423703aa8e543fc196607239de7a4258710b85563f2889eacdd0fb", + "0x903f569a8de771406b9fd36384f1fea20d5d79374b8d9af24b4814f96c44739193662aa47be857543fa101aa70ab205d", + "0xb9ee3b7b95db0122edd90b641de3c07fbf63a4f70fee5f72051cbe25c92d88444314d0489a5ecdb1805f4f149f462ee6", + "0x8ee41011424da5e2ecea941cbf069ea32420749f2519434d3d8f9725ac789753404687a6745cffe4bd5dfc8fec71a719", + "0x8a978ee4be90254fd7003ee1e76e5257462cbb14a64dbca0b32cea078908d7da47588a40ffeb42af11a83a304608c0f7", + "0xab73a043ccdfe63437a339e6ee96ef1241264e04dd4d917f6d6bc99396006de54e1e156d38596ba3d15cb1aaa329f8f5", + "0x9439b663e4104d64433be7d49d0beaae263f20cfac0b5af402a59412056094bd71f0450bc52a294fc759ca8a3fddfee9", + "0xa53d2a4bef5f3d412fed35ac375f632eb72a6650efe811e2131a6ddcb530f88044f65b80b7d739998115b9f961bbe391", + "0x88e7a12a90428bb45bcf4b01442c11607433211fc2f9bee9545304eb66e0b4b5339360160bc782e185391385da7c5ad7", + "0xa163470735c16f800bed412bf0190d7c85cb2d3d588ffce245ec8e8d4872c756a109367e293caf4f5c0ca1ad31f8be5d", + "0x897d7a19b70dcef1af006df3365981d73068c81f18017f32fb9966599481496efd5f6caceef943b31c52750c46d9590d", + "0x90f4476224b64c2a5333198a4300ece8b3a59ae315469b23fd98dadcdceaaf38642d2076e9cd0bfacc515306f807819f", + "0xa8d152e5d94b75cb9e249230db21af31de4d4f3d4ef60ccbf2212babf69aed2a38435a993ee2f13cca410ad55a4875ab", + "0x95aafa379cc6a2b4bdd0cad30b7f0a47839952af41f584219ec201c6c4d54610eb2c04b67b29080acb8cecc5e7543fbc", + "0xa8795e7f4c4c5d025ead0077c3aa374daaf9858f1025c0d3024d72f5d6c03355ae6ac7418bf0757fe49c220acff89f7f", + "0x85e2013728a13c41601d4f984f0420a124db40154a98bbe8fddc99e87188b4a1272d20360406a9dbae9e49bfe3f1c11c", + "0xb380ee52038a0b622cd7eccf4bd52966573fadde4fe8f70f43fa9c43a5a99b3eaf58335a1948b561f5b368ab4e0710f6", + "0xb43fdb2ba9128fd24721209e958be7b9c84dca08387c982723f93ed4a272f933823ae084f1b1399ff6271e0da6f5aa3f", + "0xab2053c376c6bd113b89fdb2ae3b8401aa891135345885730c61cac7813f69ea7d906c531be752e28657f73af92d1f4e", + "0xb586e67ae1826a1cdd651ac785e4b38f8a0e042f103a9b7dbb0035626d5dec3ded04a4e2cc09e63b4b01aebe304e40d7", + "0xa86be58fef115445b909dffac6f51da3fe9214afd9c31fd564bb8f39b1dc3cb895b1222f2c63226b54b60b278ec45edb", + "0x8016d3229030424cfeff6c5b813970ea193f8d012cfa767270ca9057d58eddc556e96c14544bf4c038dbed5f24aa8da0", + "0xa8b593de2c6c90392325b2d7a6cb3f54ec441b33ed584076cc9da4ec6012e3aaf02cec64cc1fd222df32bf1c452cc024", + "0x860d581af35d522b5eb5fddd92a98a6b4cc483fda00820d1ce4530e07892890c096e99b33976ca3550bb900e830ad3b6", + "0x82212706111fb1cf5def02b5b0eb7ae9e6ea42b4c7a2b9fcacb7aec928326edb9ac940850dd933f2822f6cf519de0d50", + "0xa98f68569ced00cf2c9f85fe0b4bcaabed0652b9fbe438bb5a86612a0addb5975e3b98395f2a4788639c602cf21a8494", + "0x8600e2031c9113ad2a75c19872b5efef85765b524f74de98baf4efe4a75c6be563e9e19622388fbe9afe58aa6017b930", + "0x8e825c03c8409a3302266dc5f47fbfc381dfbafbadc37bd8d40f079ca8963d4c5ae6ef0d0ba6aef2d4688736f5f6bb45", + "0x8bff10f91b8c0abb6c9542588da17fa0118ffda4c82626a754887e333d7d69661b3ae4e400da15c49565f8d10a77d0d7", + "0x8421044f794a1bcb497de6d8705f57faaba7f70632f99982e1c66b7e7403a4fb10d9ef5fb2877b66da72fd556fd6ffb0", + "0xb504cb87a024fd71b7ee7bed2833115567461d1ae8902cccd26809005c4a56078617ec5d3fa5b29a1c5954adc3867a26", + "0xb5f32034d0f66bcbccefe2a177a60f31132d98c0899aa1ffff5ebf807546ff3104103077b1435fa6587bfe3e67ac0266", + "0x9604659740f6d473bd2c470c6751f2a129328e74e01b23368f692ad9b6cce0fe1509c3f82e9f01019b72f6bf3a8e4600", + "0xa6ae4fd03fbb4e2150795f75a241ab3a95c622b4615f553bab342a1803b86b1c1a2fc93bd92ee12786bf2de22d455786", + "0x8f142bde50abe4dac8e059003db41610436d5ca60d2dfe2660ecaa5f9628aeb8b5d443e1b57662076f77363c89a1479d", + "0x919b0dca4050f3304144debd653bce45768355d2faa698b99de06ca6ab8573a285764904cafc9262352c87d9287f0545", + "0xabf28b692bed19ee9152d5f8ade776f0a42a9762ea5f37d80f47ff219fc0a8ebe5e6eb920453e1ced3ea5bba19ae5be7", + "0xb67146b202afec0132ac0070c005cf664081e860339f8f4d45ac3e630dda05560936e646673e652d08cecd8d18fc64da", + "0xaa25208385573caee2a4830f09e1cc9bd041cdb78d3ee27a4b011815a62d0d2e0295c222480947ae427b1578fb5509f5", + "0xa35d9d6d5dd5428cce7616842203b5fa3721cb4b20f50c0113f138604954fe0cf214ca3d065b578f921054b9efe823df", + "0xa1c0c317e6e352e16e25c140820b927161ce5d2c4c2e10bca3057ba4d46b4f42ad7aba20de86dad9fc6368ea92695268", + "0xb9ed23f3f26fc9f31e1e30e8ae88482352fab6ef79a2eb8939dc78110580708f482ba3ab306ed6e09030653b9704a80e", + "0xb15978155af006d231888257c6e4beac0d3b0782bcbc99e61802a5c031252f05213c9ee9465e6816d9702e4a21cb9571", + "0x8c9fefe233d0d657349b7efcdc368f5aaead27071d224af780874751e7d241f6b88f7650fbb4133043b24bbebc12aa48", + "0x92f0bf3257e775c5c469cd9a43249421c9fd223996aeda09654045b885a512e86bd834b2947aef216b4d9dd5f8f2e9aa", + "0x81ad5baedeacae12f19cc6d268779c791ddbdbae859d218806cf887b91e83bee3472740b0736877c81c5c1969eeccfec", + "0xa54e104339286d3ce8271828fbac20f6cf7afd3b72d9b194b7cbaf65f6612416117be492bf4aa88faf6ada56cf4b6462", + "0xac2c341f0054876d28393d5125c84b913e754bafdadf769ded764b8dcd4b042b5dbc19b6f40ce8eb45edf7639b3d62d3", + "0x8eebee05702bf1574b12597b72a86d5badef064879fa9d1b9aff5ab75e5c71d81d8bc404f2614085855d6ed87f581238", + "0xa5a07bf219432e9c80c38596c93560b49c7de287f31e30b7a06fcb4d15982add4a24085adbc5b753c462be989c64c96d", + "0xa3d31b20198f326eac488e88fc5b9171276d4934b0bc573c8b55b2abd26380d5296d5bbea281de91c0945f34b37f42bb", + "0xb928a1a20f078a50f9c67da1d909e6656c3980f20b96bb8d06c0cc42557ccd290ed64cd78f9c9ca090cfdb9327eebd89", + "0x8a0a4b295761aa6d2d1b988fb0c65b4338cc3ea48410cc673671ca029ba6c51fd4e101b54472eae93611faee53d4eb2f", + "0x935f616bc620ddcde07f28b19a66c996798792b953264d1471f686e84f3c6f125e2a3d3a7a535c4175973c7ed2e4bece", + "0xa80deb10bba4bc7e729145e4caf009a39f5c69388a2a86eaba3de275b441d5217d615554a610466a33cfe0bbe09ef355", + "0x8dca376df4847cb8fc2e54a31894c820860c30b5e123b76670a37435e950f53312f089a8e9bd713f68f59fd1bf09202f", + "0xa04016e9e13ad845763cfe44af4e29fecf920b4aa42f581715fc34fb9ca27776feee45c82093c7274839eef1838b10c4", + "0xb8a0003e949cf994b1bb25e270cb61358200c93b1c6f611a041cf8536e2e0de59342453c5a8d13c6d4cc95ed8ce058f3", + "0xa50ab79cf3f6777a45f28d1b5cdad2c7ea718c60efeeb4c828d6307b29ef319445e6a9f98aa90f351c78b496575150c1", + "0x8253e3b0b85538d01b0ca90b0a1656ad80ee576d0c3fa6349df58df92683b510e56c524fa6144f79a5525f41e4a2ed34", + "0x917721639b1bd13c33ad5b332e4486c4202ed28ddd9fe97b4d2367a87829c742c9e4bfb508827f4b8cadd0bdab99708f", + "0xb0b8c15d67a443907315ba3e94a89491dfbfd04ff9238d856f46cd49a3324788ddff3be9d61b2987f6f5a3c7d852133c", + "0xb2a4000ce0ddd3f0543ebfe4906570853a85350d75418a1ff2608099c069f03510df576ea0cbb406b7ae8e4f21576811", + "0x801c126abff96fe9b042be8869d2907d0c6963a79901f9db46577a445418b7465a1f4b346933d433e539536a9a2df01c", + "0x9530f92929f61f9afeea5737bded7aaff3078367aaf65b2c75f0f4263b6e90990a2bf64927774c4f0289120d49558d6f", + "0xa065363b9c4b731b08fd361081f93d987ad336475487dd28bbda2dca92b0b5da4edf326995a4ae923a4b2add7aa1df4d", + "0x85c216e314eb7bd8ba02e092c90e132bc4bafb21c6a0fbe058b0dd4272cb76f183b83c6783fc321786065ff78c95f952", + "0xa53658aaddc51e20752454dcbc69dac133577a0163aaf8c7ff54018b39ba6c2e08259b0f31971eaff9cd463867f9fd2f", + "0xa013cc5e3fbb47951637426581c1d72764556798f93e413e1317849efd60f3ecb64c762f92544201eb5d6cfb68233050", + "0xb7e5497eda543c02a7b3245eece98d21dd4c587b5a05f21b5c785756a0b875715782f706fbbfeaa0edaa6faa6b03d8eb", + "0x8ded37d67b5368619a090266e9b5585fbff60319a90a4244a3c3342641f5bfa5130998dd97d7a42505cd896c29255530", + "0xa9b120a77d70c1cbc0178a12d97a78b2dd0b98d0584e8e780b937800ceb18c90eaa1f0a83c5b50e34cae1c20468f004f", + "0xa22b351f139096f9ed5baafe27affde1351685765805d458381e392e0bfc51cbd8af5909b3a1da05d0d176877028eb32", + "0xa16938f556b8c11d110d95b8584cecef8b95ef349ea64b59df806cc62c52ee48074d0b3f18d84533e41583aefd6a9d43", + "0xb95fc0ec39596deee2c4363f57bb4786f5bb8dfb345c1e5b14e2927be482615971d0d81f9a88b3389fac7079b3cb2f46", + "0x89ca7b7aecbb224d04839d36e4b323ae613c548a942830317aa0d51a111cb40d7e6d98600dc1a51e5a32f437951d6c7c", + "0xb28df3e04bde4ec373171401dbd0546f4cb6fa8e9a4a8019aadc653d4e05e0b5b9a64417715dd87f6df9e7b3145f6659", + "0x89df46082b8dc997c3e33fa94fb6ebfd19af29d619ed4d861f8ffcf83d02b9077b9754d0667c2fceb7aa31ab5f806f65", + "0xb0c707313762e66c681b0efe03ca11a49791173c1e5d42b235c3370e98c37ca4393e6babaabc3933e3d54e72843337d8", + "0xa4bf094dcd71e1a8dccca76dc7887476154e673551f25b0ca90d6dac8b3b3a2241bc601afeeb1564bde0432db1972999", + "0x8f88615a86867c4add4c6dbd2c717a7d5c9e6450e9540b56de14c31d9ff84e2495aca3f1d5be51940c183c6ced9da2d4", + "0x81351fd284d6d07092875f366bc5e53bfd7944b81eece85eab71a00443d1d2a9fc0337aaf34c980f6778dd211caa9f64", + "0xaf7616b8f2f56dc68e3e8ae5dc5dbb4b027e53ce652860687f1b15b2f820ea0349baea5af4e3ba4d865429330d3383d8" + ], + "aggregate_pubkey": "0x90ad8bc2718e8464a78d43480f280d3ae08068ad88c2686227ec6a25f4393099e7e21b6200e83ba1a8fc34a9c08f5069" + }, + "next_sync_committee_branch": [ + "0xbcfe80e1d24fbdad7bc058b011403a4c26cb56967654494cde51517f888023f4", + "0x621312d94927fb6e3633ca6b4a8f61e8fbc72799bd54639043f1abe818ba816f", + "0x16fc985fc30e89dee4524512296e2a5438c4c68d8f035d3377cdbc2c7f9e1804", + "0x88c597da85b7b1a0ca4f2e149ecaa3eb869e60e78e5127db801706005d3d0d3a", + "0x7b3e52c66c24e912c1c7aa3207753cd882ec3c691354ede99ec716da5fa0fe3e" + ] + }, + "finalized_header": { + "slot": 4063232, + "proposer_index": 1311, + "parent_root": "0x9f5209af620727873d563ec0386856f5100df2278ee157f8b058021e29a2d0a9", + "state_root": "0x9cfb7a4ceeb31d6be6dba26dace0a074066152dbe507e328886be16e8b38bd9c", + "body_root": "0x9b934ad271680073ffce322e54a0ba990caafa9a0ab95195e4553aa5936d3f41" + }, + "finality_branch": [ + "0x00f0010000000000000000000000000000000000000000000000000000000000", + "0x3d4be5d019ba15ea3ef304a83b8a067f2e79f46a3fac8069306a6c814a0a35eb", + "0x452c63d803b8bf301447a73b2f7a747e49f37f9c9a096d8ddb6c8302666b809e", + "0x16fc985fc30e89dee4524512296e2a5438c4c68d8f035d3377cdbc2c7f9e1804", + "0x88c597da85b7b1a0ca4f2e149ecaa3eb869e60e78e5127db801706005d3d0d3a", + "0x7b3e52c66c24e912c1c7aa3207753cd882ec3c691354ede99ec716da5fa0fe3e" + ], + "block_roots_root": "0x31ed28275cbaae8300426740b8f08d2d31b0bebac67939a5f6507adc361458d3", + "block_roots_branch": [ + "0x7fb8181acdb3d8c6c5e2db5dafd701f1439abfaf2da9435818dae5cc47683035", + "0xc439004cf29049836d890c28867350dc62197484a9c97ca0fcd7be38904e826b", + "0x433cf8bf2df73fd85edc9445bd609ffff88cdf3eaea77b593e3aa48e6648666e", + "0xf092d3324350b4889c0a16d9c2ed940798360d33e5d82b32e0049b6b25cad0a8", + "0x565c0d114cdf1e419edfdcda9941aabc3d9bb8ebf07a4afea082ba1ec2083331" + ] +} \ No newline at end of file diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/sync-committee-update.mainnet.json b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/sync-committee-update.mainnet.json new file mode 100755 index 00000000000..22a44e3cf79 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/sync-committee-update.mainnet.json @@ -0,0 +1,563 @@ +{ + "attested_header": { + "slot": 4055104, + "proposer_index": 1862, + "parent_root": "0x5f44df1f70338aca4b3046f9e5b144bda8b27276320ca000077389d0aba35317", + "state_root": "0x9daecfedc819b45231bf93819a73efd4304ca79528032fae2e852ebbe514cfdf", + "body_root": "0xa33f5cdc6732684e6f248e5a7636c7e7bf705f0bf709098a46ba15c660b4fc65" + }, + "sync_aggregate": { + "sync_committee_bits": "0xffffffffff7bfdfffff7fffff1effffef7f9ffbdfdffffffdffbfffbbf7ffffffffffefdf7ffbeffdffef7bfffffffffffbffffffffffbffffffffffffffdfda", + "sync_committee_signature": "0x880f147850ac0a94130b81f94203e2f69d512c929df8b954b6adc20cb1e8598aafadf366c074b590c0905d584dd980af18e0c8a837bbcadf6b4438507aa46ef95879c0acd9c2d273ccb13d93e4938e9c601f0dd466f53369ae94e1287955cae6" + }, + "signature_slot": 4055105, + "next_sync_committee_update": { + "next_sync_committee": { + "pubkeys": [ + "0xaedc2d47fa2662be6ab58ddd3682bd5e53f508162968fce8326c75f92fb3c1a25c4d4d0e6904f9b6cb1ccbaaa9dc28d8", + "0x8097b13908662d245820f3b045d8c2c665fe9a054e9c661323924ec86dfa713b36b0c787ad4dfdeb979318810e687a48", + "0x98aebd4bf15916512508a5fe89d814d5d76423c562cd3f0a0af504c8cde53be30f4df00e3ba0229cbf8528e198a0df11", + "0x86bba46d0031989d0f1baccea4174fc3fa0d595e60d35a464e86c33c233e2d6def84fced7a00f59afe397cf4fb5b67c5", + "0x845982c2672fdd44b33d2e56ad676e704c02f756b09e8765bea42b924c14724484567b55f0db42ac20cb70a7f5201c14", + "0x926dc729e135f1f0bff4662ee3d6823a64597fe189b763ada34f246e77705fd4e062d85506a338e9fa98c4d225a3b27a", + "0xb930ecc2a26183240f8da107e80979b59da4e05f090316d982815ed6151d7750490b85273187ec4e07eb221813a4f279", + "0x81564bee5a3bd09476f658cf7719326c353485e2f4fea58d110071c5dddd3cabc349a8d1ecea45d589ed4479952a2ba2", + "0xa66d5b1cf24a38a598a45d16818d04e1c1331f8535591e7b9d3d13e390bfb466a0180098b4656131e087b72bf10be172", + "0xb9b9b6113301bd2b409b71afa1ab9e31d22f84f8cb03badaa408e1d37032350094124e533de766622d7975a047fade6c", + "0x8eb3b3e3135720036c1120c4e8b8d405b00d002f2bdbe601a06f2c2fffb940a9966d18636ee34fc003dfef547d8f3b76", + "0x898deb30ede570d391266c81132a78239083aa9e27a9068e26a3bc14ff6468c3f2423484efb2f808b4996c16bfee0932", + "0xa90d9502a9785e55c199630456fcb1e794bbeb0f5f8c022e66f238a0789998b126cf9911fd0b7d463b7706dc6f9ec128", + "0xae8af784224b434b4dfa9ae94481da4c425602097936623e8abb875f25deb907aa7530bce357786a26ed64ef53d5e6b3", + "0xb544c692b046aad8b6f5c2e3493bc8f638659795f06327fff1e9f4ffc8e9f7abdbf4b7f6fcdfb8fe19654d8fa7d68170", + "0xac5c01c51dac6ee1cb365c9b03f09906d9b7b9b4d1b73c44d9e8e06823025d7070f242898a975420bc87d6372382cab8", + "0xa4632399c1a813e41fb2055ef293466098ea7752a9d3722d019aa01620f8c5ecdc5954f176c6c0901a770cbe6990eb11", + "0x85f7ae1a7a7c793c408750ddec2d7f58b985fc3cdf9fcf6b2192bc57092b8a271b2fb6ced0639baaffe0bec3203e568b", + "0xaaeb466f4316874c2107a0de38dafafa65ce50039c20723e8797815238011426f4e77e29fc573e7c6d2df85c1bbfefdd", + "0xa8fd63da16dd6a4aa1532568058d7f12831698134049c156a2d20264df6539318f65ec1e1a733e0f03a9845076bb8df8", + "0x93600f65c090814cee5cbd5f22f98e79c69e63510501a0be6a74b111e4c52441133fc1c198c7bf235f9005aeacf1d441", + "0xa69f0a66173645ebda4f0be19235c620c1a1024c66f90e76715068804b0d86a23dc68b60bca5a3e685cce2501d76de97", + "0xac6e7e9960207138d5b4b6a7f061756c01cc4a830e5988423d344f23544ed0eaa790aed63a22df375768f670cc9b9bd4", + "0x93042dd42e56671155bb40d85d9d56f42caf27bd965c6a7a7948b39089dba8487d4d5fd30522dba6ba392964e3ffd590", + "0x85bca2f86423a09014b562f7dc613246bedffdcb3aa41fee02270c13e6b00c8d6704dcbfbafc5997df6a90c7fc08c29f", + "0x9550072f64a48cb86bfa224d492be9a91e5a6c9def04b6a290b7a19d96981937d5a2c35de6515d1881bcb167f6e3d661", + "0x8d797819318cdf7b26405d1a327d80d4c289e56f830b28d4e303bcb019aeb0b3d69bfed58adcde8a2445dd5281b86af1", + "0x90c04eb3f3679cd630434418cb3a225a73254887692429960bd45b1613f85b2c14723cd8c7f1e875588ed82b7f5576b7", + "0x9953a7cbc152f101a60e3e381f2af17ebe7401e16ef6462d132b8f0f6c6a18837914a1299d1605f9f289b9561112f4bb", + "0xa9300a33927335f482dd0e44d0d57704ebeb278f732ae8301073cb7d5e457f02a0cb03268de71d284b8c23fb96947469", + "0x88554c83648ea97dac83d806cd81d92531980346b208d281fba489da15a0084fd4d9a00591d1ca67aad3c5793685d55f", + "0x9131874b09aa95ba186bcaa9e040fabc811b9c7b905b7dc79e902cf2bb5816d7ee39b0b55be609f22bc8c538760b2037", + "0x8368bb9b9bb2e17730c42ed1100eb870c88a8431601312aa8cb1e738cdb9ca2704dfd432cf1703c0db043259819631dc", + "0xb49379bbb9f954d2ef5574199607bc6b3aa2cc3b48dcc3745cc77406bba2a394929844fec1b87c4ce65cd0ca0f83062d", + "0x876afcd045c8a18967923733a3a43757652289b0974cd348238a693f30bb57f38664ecb97877a5e5f7d0185039a2bf54", + "0x8db19f6dd3789df179ab606508ca7e3da7967ad4340f630bda83df54c197d6bd3a14980c87fe10cbced7678c0c300ef1", + "0x997a91da55801acb6134d067ad65a9a44ead0b53d3871bb97b46ec36149d25e712d7230d38605479796190abd3d134b7", + "0xab1abf9cf630d6cbcac0c503df44603142ac81acd647784ae0e8fc97800ef04378bc9d7f2087f959ad4bbbeec65b8dfe", + "0x95718b06017ba9d45894867fd67148645d25d9db2229aa89971f444641ba9db4c5c6f0785f3b25cf2cd7fadaa6adc5eb", + "0x8ec38c68afdfb6ba019204039c2fb49a35467058f561f626fa87314d705fd615a7b9966576052be1b3690028d3c5c7bc", + "0xa5d72ac4cdcd847d67cb5a68c6141cde99a91303ca84165bbdc6fd7f643422faec783de60739e1b2753088280c90a68b", + "0xa778da56ddfe4a383816b43b027464d7a28689fc4a6b35b36883d3f36d9c41f0177bdbfc8f258afe8da90f02d3b64fea", + "0xa2ab566033062b6481eb7e4bbc64ed022407f56aa8dddc1aade76aa54a30ce3256052ce99218b66e6265f70837137a10", + "0xb9c347c1c350fb7ef6ee9ca6780cf0604f30e3a74e9d0234bca6b3e7faed26148f2b736d9fbff6b04f5b947fda458e8c", + "0x815f53751f6d3e7d76c489f3c98d2b49214938cac8c2b417e2d17bb13446c285fa76fd32a97e9c4564a68f4faa069ad2", + "0xb3f1319ae34ad1d59207288f01d3d7b7e1bad7733fb4a819a09b011d72a4d736bd3c7afeb74cf56da0e00cf712042ad2", + "0xabbfb501071148e98b6aa56308197356fd993c93e27fd58987eca82036c1ae0ea89f9fb1a06c82851234643904c58453", + "0xa0899189bba608887c6cb729580e570ecce9ca7107865ebd30def867afaaa250bac407c30dbee11b7ef6cd423269a8fd", + "0x88e7a12a90428bb45bcf4b01442c11607433211fc2f9bee9545304eb66e0b4b5339360160bc782e185391385da7c5ad7", + "0x82714b00a822c30b317ffc1d4ba163990cc1ffe5769f91906a7f71ad1f62b39865a5314433a4ab2ba762b1d62b01003e", + "0xa3a930dd70aeeaff0f2e3790927d5425db40467ee106261615de5fcb937bb1621be213ccd8b3a14d96c5908bedc2e421", + "0xb2902161b565dd5b8e8c54187b26f01741a39ea8bc1120598661bd367cf8fc73e21eda2f0f6f9ba2270c80a59ff5985e", + "0xb77cdf45f39bf85ab3e8c8afa602f159de8352188aba5378957d468315a2d2326daef83d8ac6b227f1e7a514488afbc6", + "0xa9e573274f5a131d6c7641bc0576a2621b6466a5bf2cecb21058160a854b1b9e0be176da2b6b9b3ed562fc36c5f09119", + "0x876561bba29e656b7122f1cb51a02dff1ac7d470217d8a4799c01e61816c4660eea91843a5a42502ddf842d2daeb0586", + "0xa0ebae60a998907a19baa396ae5a82bfe6aa22cf71bfca4e1b4df7d297bd9367bbeb2463bda37aa852ad8fd51803e482", + "0x84a6edac5ac68a7ca837c46d5ada8fab136748b6c3a3b9165dbbc231ec386b15328e4ef7d69a15d4cf354135348a4ee4", + "0x8b476b3b065a3b95a3d11ec60a749c2258ddcc5885bfb50b8a086d3fd1e49ff73e1dde733b8981c3d2d206aa0c87b09b", + "0xb48490c5a3bc9e66cdc78994f7c73e0f2724fec8a304b4147799e5142396df155ef7c42065ed6d2c0393d138fb4d2a0b", + "0x849ddbdc3ac55ff22a3b2f4bc51892fed694490ab4dd342165ac38c725c8b38921eaefe3c443962925fc3726aa41e236", + "0xb49c45d9da4aaa64967c28f1fd77b7f709f5a331b58823eb1613856fd8f92635135981830a287e8dbda3a0e0fc481c5b", + "0x93ccd8c5f82374e0bef6562e16576f742d79b6f400e3485ef36e148088b61fbd882c3d2bb38ab0b43fa1dac77f31d543", + "0x81522576ae4ec9358f1a16934cd1c1116de609634e68f552924a972101eb7215f037ab8e0582d7b13541537d55554d31", + "0xaad60e58a19598c5013b37e2e4adc6721eaa7e6e184960d1dc4e6f012246abbb58a047c0679064d5eaaaaff02de881e5", + "0xb4f034f2b53ff9989e8a0f12c1484c58ed7942432a429af58a6659feaf23f7d2bf20ff7b9a7e0a28a2e09c9a730681d8", + "0x88b2c68b425269850c1a4f4608aca194da5c641adeb99e2f7fb92e34b8245dff066e73bde072be60f7f2c3d3d13de3b6", + "0xa749ab53fc2662a0796489be84fcfa59bb723ff748bd8980df0cb4b3d1e2943845b0d7c67576fa0a33c8b0ff8a86932d", + "0xabd7248ae069d3a3a45b0ef4dd5d7d54b62994e578ea20bdd3b7876596673953b94c5b109a6e4b953b517544b915368f", + "0xa49da42c27d019a21cc6489ada7b712b98c4ede28ba25dbcfa916acef48446a2baf73e03a48be763378a09774d4a03fc", + "0xb3c36fa39f668bbc3fec028875a820057dbf96f727bb423280da96d5d50e885d23bc23fb73457bf79089691ce7663a7b", + "0x8dca376df4847cb8fc2e54a31894c820860c30b5e123b76670a37435e950f53312f089a8e9bd713f68f59fd1bf09202f", + "0x95d1f944b0c53eb3e9fcd5632713602bbb9195b87a172a370ae2df98504612a55f3968615a39b569ce6a0fe9fb559be7", + "0x8c9fefe233d0d657349b7efcdc368f5aaead27071d224af780874751e7d241f6b88f7650fbb4133043b24bbebc12aa48", + "0xa2ee6c29efa982e9b9abd3c5e4f14b99d5d0369d7bfc3c8edae1ab927398dc8a147a89e127b3324d7f4e3a7494c5d811", + "0xb7ea5e0d3cfcf0570204b0371d69df1ab8f1fdc4e58688ecd2b884399644f7d318d660c23bd4d6d60d44a43aa9cf656d", + "0xa07826925f401a7b4222d869bb8794b5714ef2fc66fba2b1170fcac98bed4ba85d976cf9ee268be8a349ae99e17ac075", + "0xb0a47515752c15e4dbeaf9ee27fab3b5c0db82f5c685e8f716fd7d8764164944340430fe3db1a5679e6ffea5a16dd919", + "0xb7de6d7a4afb05984dce153e5570b104338265e45c8f0156f4d45c458f47add234a479e01c02d3c1817c170b5b65b100", + "0xacd4d1e11f81f4833353b09d4473ec8b15b8ff31dbf39e97654f5338a26c4020306d51018f1f4b9c4efdb92992408a6e", + "0x80e09f3bf3ea87d48e04b53d8f3b43b7e53d61f445f8c8a5a35472b84f6bb4f58f17d9832f5881bb44fc06156151e5c5", + "0x98d6d46f603afebcbc561c130e416d5a588a7e6c1f17f89ed6e30538b7f8dbf4b3c75b8a3331425c4ca21e03fe8b57f3", + "0xab671eb947490c43fd05e42a787344b21af89babb705393c82748eaa0cfcf80bee498d275a1eaf1d647ca3b2923d76ea", + "0x80e1dbf3296bdfa98aeec1a7560682165d13bc628061bd3257f345aa1ba13f8bd1bea14f117af562be22118f5a8265af", + "0xaef456af90354ff88039d2dde02b0f5a6790aa762b23e0a9da8c6ec92c3b8b3320687bb21666608b4a22615843afd1ef", + "0xa5a07bf219432e9c80c38596c93560b49c7de287f31e30b7a06fcb4d15982add4a24085adbc5b753c462be989c64c96d", + "0x84d2eb008578aebd6f01254b7e46584c1524e6fd7a5a2ae5fa0ea560865ca50d52290cf2d12dd20b042f402e62181b4d", + "0xb8e5226ad3515627ae6840235f5f7b7ecd54e8f01079c324d126ec852f6665ebb77168b3f2b3b51580e04a6ff602d5b3", + "0x8c1de4264e04ff7e8282faf81c0bfb5943656451be52170211cb7adf4ff21bccbb789400735579c622f69982fcb8e9c6", + "0x90bfbe37ac3992432e68c95c0d4342a9712126d1f50089239c9f4f6c0c202b54334e08604d245b97dc8e8f6706f6992c", + "0xb0a771b9a0dd7e352d46c8efcc1834e610dd097711bf7117678a99d386890c93b9b901872d4dcacb6dcbcf3aea0883ea", + "0xa4eb903990bee2374b14fa66fc262d6821669537e9ba241c87b4b5c9e2b89b32fff4bfc28ab8471ef52e8eebc3e743d1", + "0xa6b74c706b33d3cae9b7adc5c7502ac98f7bf94a14d579d2bf77b613ae555634ad6fe631ba36dc14bf44526436355e24", + "0x8296f8caf58316af535def398a43357e48cb3b1e674b857eba1bd1b970da3dd045e22fe6d17dee4e9117f62ece3ec31c", + "0xa129c9cf33df42b5a98ad98be9d940207ae154c715d3bde701b7160dfe45304679fb0481a4f9dde242c22a9849fc2d9c", + "0x858b6f1bd3e68fc536bdf1f4bd96db032994eb76e71571e2d85af73b898478b82f9ab432732b0beebc0864ad8025ae33", + "0x8658a15df961c25648fd444bdf48a8f7bb382d9212c0c65d56bf9cdb61aab3bd86604c687fb682260dbc0ad2dc84bf01", + "0xa8d152e5d94b75cb9e249230db21af31de4d4f3d4ef60ccbf2212babf69aed2a38435a993ee2f13cca410ad55a4875ab", + "0x95757096c132e7f6c096d7b93a5a0d2594d5e609b9f13c4a9f878e95a389fa1a111b185dc1fd8f7d98b737dcf8d2af60", + "0xa22542a4a2ebde18cc6aa29d5dace8b4f6720703f519610dcf01e671018392aff15728e3764730840272c9cfb074b612", + "0x8f90e72a54e6894d511061957162e753010812346afd4d90cfedb678b99ba1aacf2b6bd0e49b4b0e684da8082a048619", + "0xb2affe048c187d311a185503d8958cacbe03796edf79bc32e8533941004d9178bd2e376e627e1ba61ed43850c0c455cf", + "0xb549d272a7f3180826a978d747507e4dc80d82784abb655cfcd3a69cc72e7d58c70febea1ce002a89852a8f934ea70fb", + "0xa9ef845ab489f61dbfdcd71abcc29fc38f3494a00243b9c20b9cd0dd9e8a0f23304df84939b9652cdf5542d9b3ee085e", + "0xaa744c552b5fc41e1ac6ca53184df87a1b7e54d73500751a6903674041f5f36af25711e7bc8a6fbba975dc247ddad52d", + "0xa802b9ffbd4f01b877791aba27da972be4bacacc64a1f45687be4af01b84bd4b83fe2ba1ea78e29d7683f6c777ab2543", + "0xb44d2d9510516c0abb4fc101241cf0e0223b179fb70686519628c27f0ef56381232961bc79a30f592ef093ffecbc4486", + "0xa684a09add047c0fe648d9c5618500d1816047168e055e8ac8c952c3544a462cc095b32fab07d939947a58fcb4ec7ba7", + "0xb5eb31e5cba0193e74968099ace5808dfc457c6f404f270fdc4949b60daa7607ba1811abab1bb19fccdad61d489b6657", + "0xa10f19657a9bc5a5c16ebab9f9fddc3f1d812749cd5d80cb331f51de651873ff899e0670f1b079b29a194572de387a17", + "0xaf61f03e3ceef5bef36afa29ba2edc7a3b01ca26cec2589edbc9d124dd46e41410e0e3afbae959c83a6f839bbcf8049a", + "0x8e6bbfe492ecbbb8dc8889d3dcd7037a58db605bc6bb79131a72a9b9c1bad630e75f5e5e0c1bc407e73f3d13b116739f", + "0x983fc1ddf17f9756c9cecc00b39bb2ad432587a5c6d1c3296a383b9f539c9afe84c6c818447a709c0b686ba26ce5ea3e", + "0x8d52413f981bc611427ad0534d25e914113d0ebcd6960aab6421608bec6648b89ae4b2ca2153c57d3cf4f1f37212aa5c", + "0xae075b66e5f211c2149c45b211d1297bbc1d9e6497cb3315363c492a9a51ae5b9d0a28bfecd755d68553736901ac6606", + "0xa02f7fec0661394399a82b2e3151009160b3f5392017ba579b301ed42c85100c295acbfed46b6c58a9d71796ed0930e6", + "0xa3a7196fecd25e9cc7cac79c35365676e48c7be1493df255676adff2209c0719f2190ceff3ce008d08efa07c244c11a6", + "0xa5fe3dfb5031517bb8db0d5ade1e9f438e84bcf23221de003b03d2a2f4ea97629e81c79abc3769bdb8c69a512c189b91", + "0x8cd9d7e953c7ae07ee785d68a999e702565960d376692d9ea468556ad141229b1f3bc97926818c078901f73ecc578e93", + "0x81d6fc2f01633e8eab3ba4d72588e14f45b00e68ab887bdd4ec5e8558965db21189310df973837106216777b07fc0805", + "0xb75ac3d5b3dad1edf40a9f6b5d8923a81872832eb3a38e515539cec871a353b07cb477f6d55cf15ba2815a70458aac32", + "0x94d3c9406dc6dd7241a726355643d706e46b35f1ffe4509ac43e97c64c07592821156ba02ec9a78978e66709995a0ac8", + "0xa3b109249ac2900806f0f39338da72d4f2cc6d1ac403b59834b46da5705cf436af8499fa83717f954edb32312397c8d9", + "0x8336744d8ef3a3bb3e9ed3d6b83e08cafffc76b7438adedd3a7358b32acec0e73a4635aa3166362ab4e158e68576255d", + "0x99b74edbac662fff69ba412de466a427a928ce2363c9e59dddd664f6fa50f2e1dd3d464701b01784aa224b3d96dedea3", + "0xb397ed7134f447d9bf1c511bf92f2d27d7b6d425b8b411365fbef696cff95c2175461cf5dd83d93bb700e50ebb99b949", + "0xa3e1fe11f38d3954a7f48c8b68ff956ea0b6f8a3e603fd258c9406ec2b685ff48241db5257179ea020a83c31dc963854", + "0x949cf015ce50e27cf5c2ff1b8e2e066679905ac91164e3423d3fb7e05c64429e77e432db0f549acb99f91fb134b6edad", + "0xa1c0c317e6e352e16e25c140820b927161ce5d2c4c2e10bca3057ba4d46b4f42ad7aba20de86dad9fc6368ea92695268", + "0x8d6e3df29419bd0da1deba52c1feebe37744108685b49ca703e1b76fb4d612e3959d3b60b822506e5c0aac50b2f5eee2", + "0xa15e0cb96a463ab81e661ca44c619b71a159680bbc04707ea5a5867ff38b15416e3abe55d2fabdab9aede1f157dd37e1", + "0xb6d6482ad7b9b412ffbefbbdcc28eb3d091b1291f54f77bdd53c4ac85f705c454940f466dc272dde7b03c26f0cd6ecb3", + "0x8391e3ad6ec2686bdc686671d579edac2d5efa8cf0923577df28fe0735e4d5103173d44452816e3c2b2a7fcc1fcc20d9", + "0x818202d7cb60e4148c71633ccbe1ce311de7b7ff93a1988e86ba29cc58037189f0f275b3323a6719dc9bdcfbc49c35c3", + "0xa7c0fcc422c6da878926cc6763ae6ec685a5d8fd1afe61269957be6bfb3f1705a8e4c6e6d85bd15636521f5a2ceb3a00", + "0x8f7bbaaac458bada6d852fe665c87c646133bab16c0d5136c3dc922095b9d647d93a9de7671cb7bfd4cbd138ae0709d1", + "0xb6e9fe9fa3d4c833c3beae7f798f30f07e3cdf6f6c8eb8e2b70cad51b37af2549dc9f2e7f97f194e5897d4dedb904a45", + "0xb455f751232de0a48440d09983f4f4718b6169907979c9f282acf7177ab5b1f338fe1f2acd8d0bee4b4aad61d0340839", + "0x8aadfcf3562f1c357068323352cb1745349a27a7362358d869e617c2410db747149b993ee9e881e252ecdd42fd75f351", + "0x91bf4c32fa8888d3829d3c33e12550d2ecb70762d5eeecd044d4902e4a7f8b7a2592cf6cb7736eb6bd9d312f85c2777c", + "0x859426bf6211e68924eefdb26cdc168ac0deab291aaff7036163997bff34d45809932f91e12d113784c05553ca773b15", + "0x81730b4bc5f755e5b99c321a6996c65e57ea2ebe6c0e4e404ed30920194fd76db65304635ad054a8b25bfd982cead47a", + "0xb26f5ed09f7d5bb640ec94ddd1df0b76466f69a943b4699f53d45296d5d6b8010bb61477539bc377d1a673d89074d22f", + "0xaa65c11071be23c9bddaa5203f3166e5cf043efe5fb8f4b26f8a9cabe71db701a450e79eb001c401da5752755d9cf1af", + "0xa019370ca799c2c98a605850910cf43531bfb616393039fdfc370848feedd3339b2427b750ccc91952b03a09f690e9ed", + "0x8f84cba7ceb7652023fc8ebde4b00ecde1f550935bab12feb630d6f49517b4148f3cde184bf55d4f6ec99a849fc6f862", + "0x838733220d1559c800cf1714db8a43a67a0c0d1d3a9fc1e2cdcf615d20406501e5146fe8b59bf64f4c5daa1a6d74f15c", + "0x9708cfcc9ff95cf23f544119e17518a338575018f153b1ef50118da0681304919a226b2089a417c2ab7b4320dffafc2a", + "0xa988cfed9f481bc98beb5fc188ed3f6893a3ebba27c3ebace669792f6abf0997727023c3b6930a6421224f5b257b8b49", + "0x812d3ded3a3c9e58eecf13a29bb4cc13b01b2a0af322423a29bb0e4f6d9021d1d87ac4af7a2a6b88d34f44a8bc1b3c55", + "0xb2baa7eba496ac4ef60ad8ef27a9677f9507820d95a1c572d322621c4d0226b36146bfc3a9ca1645d123acbd945de3f4", + "0x89ab1e5c2565f154f92c9b3554160832d176613f1a2f872b6ed62ed925a33fb0b40b71b7443eaaa15099ab24693c8d13", + "0x8982534f2c343dda20cccf5a9c8bf98240bba5f4e8eb2206e63a1847097deadb6bf0d24b358014d564c5ef1d0448c43e", + "0xa1e47798a782a024da340d6d6a1b1e5e15a0f2d8668adf349ca375086964414a563cc1eea3226ae637f87e78c0a630b3", + "0x847b58626f306ef2d785e3fe1b6515f98d9f72037eea0604d92e891a0219142fec485323bec4e93a4ee132af61026b80", + "0x8368a0f17c8427beb71dbf11a09a2fe8495a33f08c29c74a9a996a88aa01c0a09f9555abeb1ef1592cab99a9e05875cf", + "0xb38e558a5e62ad196be361651264f5c28ced6ab7c2229d7e33fb04b7f4e441e9dcb82b463b118e73e05055dcc9ce64b6", + "0x8018499ef720e28759133033833edfe17ed23e42f99058bb79fe844ddee823cfdc43916be2dc9724d18f9726e6f1b409", + "0xaa9b9cc039d147677aedd1e47ad9013fcc0da0164070ff7305b18e5786c7fac0471368637a3adbb78f3af174a5c1592a", + "0xa5c0e42851b769d2d822e39222e708068455aae3bdf782975b59d3201e67a58fd66e16d380558bf2086bcab890a92dd5", + "0xaf3f765fd293c253072b33a780ed68933f78d7e079d9a2079b6232755bedf6ebcbce9ba65c01f695602fa8ee17899867", + "0x8a0192ef0903d7a5ed2e5614a715901f2554b324ee72390974dc90727ff08dafa580041a21a8e6c48a3e08e1b042afab", + "0x907c827a4fb5f698bf0e6f10ca07741c5b8e3ecb26aa53f938ba34ceb50c01be80c4afc5ac4358a5fda88eadea0cbe73", + "0xa35ee5c2d7800489723c78008b495e1742f0542dbb487172ef438f60424c81aa41c2397095821248066140662133f6f4", + "0xb1925ee53c9228cf80e2f5ac0117008a91e98d878f69bf03d00d873ef45f4351cb6988772d89d4ccddb40778d11e0dd6", + "0x95aafa379cc6a2b4bdd0cad30b7f0a47839952af41f584219ec201c6c4d54610eb2c04b67b29080acb8cecc5e7543fbc", + "0x8f44c43b80a3c5f488118859fab054745cfe5b0824821944b82fcf870fda6d93489ea9ca4220c24db2f4ad09c6080cb7", + "0xaf861bb21f84c3e7cab55370839d18ac24c475a9e833607fcd7e65c773ee9d64bea203ee9e8fd9d337f1cd28d5ca0d90", + "0x8f6fde2ebbd7682c69026069cfe93aa5410071f05de9ccd7070c8c3299a6539b39b3798f01a0b4e9b1330510bdb51de7", + "0xa35d9d6d5dd5428cce7616842203b5fa3721cb4b20f50c0113f138604954fe0cf214ca3d065b578f921054b9efe823df", + "0x8d562d6c0e0d8325032e1fbf836022c82a8f600a6fbb56c553ee5d1fac0f052c7ce2504c0fd48c9fa6494a6bff63c9fc", + "0xb02ce594310f1eb8acc92bb80de524a43e663e12fb64fc28291ff207f9d8ae761631416410c3c8f4d6890b8b7e6ed24d", + "0xa258f8c0eff666c2bb70e505544c3d10d6b258310e4fb2206fd0999f69bfb739a1e232d1e810e7206f490f6c44f6934a", + "0xa8a77936ca91df3b2ee7394ea821f2bfe91c6ad8193f44651466c170b6ecca97ab356fa7d947ebb4b767e8967092f143", + "0x88ad79a0320a896415e15b827a89969b4590d4dfa269b662bdc8f4633618f67b249f7e35a35884b131772d08025bfc32", + "0xa3c66439724d737d20a640bceed8671b20cf6795671b6d442ed1ea5eda6723ae559396c24f44e982ba7751dcc6adef5c", + "0x8d0e6475acfa2b904e7d53bc7acd070a2ee4894ff5720a20e560e9ecb7872ea442a51cf2f2eee4bef66604a5c08ad9eb", + "0x804c021152c3304853941847e80480fdaceba3b9676fbe018268cf77d1a1856966c2f9686bb4d4aa0c4118a7e85f83cc", + "0xa6565a060dc98e2bfab26b59aff2e494777654015c3292653ecdcefbeeebd2ce9091a4f3d1da10f0a4061f81d721f6ec", + "0x8d5de60e934ea0471d9e0a46489f21e03abb9722f5b3633631a9a099b9524beac5d67716969c83d824498796d9c106b7", + "0x8c5a9f6eb0a3ea95e75362b06e5cd23968447a212cf22e1419c984d74432c51d290b717f80e8ed3e76b1232216f99758", + "0x918ebb73eef984d0ce28083306626d04817038056aab4a82ff9ac8176ffdfbf3173c0b05e936daf553248b323fe54f56", + "0x8f9aededb605db4e499d3c383b0984b1322007c748dea18dc2f1c73da104a5c0bece6bb41d83abdfac594954801b6b62", + "0xadb198f70a7f1969ed0958be4a9a60dcc1806bced79c63692b9aad6c5648ffea1fed60b24bf4b1862e817cf229e93e83", + "0xb118f77f99ac947df97e7682f0fb446175185b842380af4ee7394531e4f93002c72b41a57a7c1b923a4f24b10924c84f", + "0x944f722d9a4879b5997dc3a3b06299182d8f68d767229220a2c9e369c00539a7a076c95f998bea86595e8ec9f1b957bb", + "0xb7270f33011db1bad18e076a162d6e53d9123808609773eb46e3a4ac69c84c257407907bd5d05b6eb5e926b8d8c6d884", + "0xb09c0a505457c6b473fc7b2d634222905b36a6ffcc015dbdffa3bd62218c94e891615e77f28e6e18dd8474be8c156695", + "0x97d076617cf0a64ab3d1f030cfd72a303b6b252c0a7b96157ff7fc8af5970f00d14492c46e8f6f37caafe837d0dc95c7", + "0xb405520ef829a2a3b8947f1687ab56a7af4026c1a6f99f59aa192bc4f3b12a2de407862ff74ba1b2c51889b8d6b090c7", + "0x8bb045e7482b7abe670d72eb2f7afe4207b5a3d488364ff7bb4266f8784ea41893553a4bf7d01e78c99ed9008e2c13bb", + "0xb2df29442b469c8e9e85a03cb8ea6544598efe3e35109b14c8101a0d2da5837a0427d5559f4e48ae302dec73464fec04", + "0x99daf03fa434a482d9aa4d090884c99b7208c1f5380b9acbf304e1bc33d3d6902afa5d248d20ccf03795e26901356ede", + "0xb60df25a7ac1ad14aef7e8809c4bfc190b715f94f14b0534cc2e4015ff6c322883cbdc5309e05d67dca4bc641c69725a", + "0xb46a818f3e492e231d8fa8de8848c16f0d648a2e0d1c816adf9306a8596fdf45922e59cbf745430570a19e54f45e28f7", + "0xb3ca2ab7d64b71e40693bd3e2288a1f78741a139403c783d259cb9dc9c29f16c00796b6302cdcea4a4314e132b4f9d1c", + "0xaf3d3dffbe55842dfb4417295a6ed1a82d26a579199494b305445215045785759be4cb57dc870c7ddaffbc101a854a92", + "0xb21785008910a949804d1291e7533752641d31beae3cb518806488f81d58c38a5efe5ed9534ac692e68c3121e2f9d97d", + "0xab7eff4ef8696db334bce564bc273af0412bb4de547056326dff2037e1eca7abde039a51953948dd61d3d15925cd92f6", + "0x8bb4d08318386c91a0136d980a42da18c05743a5c52a861ce52a436e66a8ebe472dac7f7461db32ea5da59a23e9bd6c9", + "0xa1c84730a5c41dcab9a5ef9e1508a48213dbc69b00c8f814baf3f5e676355fc0b432d58a23ad542b55b527a3909b3af6", + "0x948f808c6b8e3e109a999657ef966e1e02c96a7aae6eecaf912344e1c7bf7ea51c911cecd3cea2b41ff55acc31df9454", + "0x8d264fbfeeebb6c4df37ff02224e75e245e508f53fb3446192cd786ecf10d0f704c4fc2e53e7f7318ae1407e46fc0fb8", + "0x8d47a7c2c62b459b91e8f67e9841b34a282ceb11e2c4b0549883b627c8526d9e0ebd7333ba70630bc0ec2478114b6ae8", + "0xa4348ad30c12bb7dd03dd014cca599c3499ddf348e7795b0392a18f998289979478374e374a8297b5b6c427441e2b5af", + "0x92ec1aeb2aa24c51cd5f724972c8b6095e77b237d83f93ed34ca0bc91a1dbf1ad95adccc59e0f0abbfef33f331f3298c", + "0x941f73b2138b4347ecafcc7b8c3d03f2a54dc49f580394ed08f22b0878ee7cb63d42978f1d320c09e7dbc67648c06f8c", + "0xa308ed8737b3a9346ff20dc9f112efccc193472e6fde6aa218ceae11e288bbd2c35fa45c1d8bb238696a96767cd68b46", + "0x8eb03001ac9e22c6956a682ed458e650785c36d23ddbcd51ac4d9cc991325c02519ff1958987a08eb29ff56ff6e2c293", + "0x80637db55287f891baa0e865d2423191b9a575620bc4493ea76166d47b99fd89ad8625c21f446b01e3ae17292c78f7ef", + "0xa5b3da08aad945effdb645c797a0a8bfa828c9d658df2783a214597acebda3ffc07ee48d0ce1147d77540b557d9ada91", + "0x8d5e0b8cde1f62cc8f15d9f596e31de09c221da91b10335b92ef1155802e742442def161223333573158723f3408bbd3", + "0x931923f0c1f75a197e6244d67525b524ceb07510a6aae8cb3d56167cc1aacc76d26fadfa1bdfc55d8439c6ee4d4d8174", + "0x963a298fc8876b702424a697929c7a1938d298075e38b616c8711f1c7116f74868113a7617e0b4783fc00f88c614e72d", + "0x91ead7dacf43905eb5d4b179af29f945479ed074126bad3b5a2bbc1663af5f664fe53a36684e9389ab5819e53f1344fc", + "0xb8a6c999068c13fb71a99d75eabadf7edd2d32e28607baf001a0aeec412fdd3575602c68d3feb4d743b90396705e37f3", + "0x938bbaa0ba14597067ff4c0a7cfc1529c44160d6f61cfad12246526d84fb7a1ba964d3bbb065a348cf7a98356ee15234", + "0x80e44d3577f12cabaed7074feeb57162ff80b61f86cce8f41d1d1250bc455070b09f6ea9d0c263b7b4824701480f4c14", + "0x8d74f4c192561ce3acf87ffadc523294197831f2c9ff764734baa61cbad179f8c59ef81c437faaf0480f2b1f0ba1d4c8", + "0xa0133deca5ae8f1100df8db69920b2d0c31aa21bd3849dbaf4c264eaeaec8937ab8f982770ce1ea17e0e258910a56d02", + "0xb6a25d493d708b035b853f1f7a6628d8e0b205d2678293f763d7ea4da11d298539533b22b43ed2e5f708648556f3094e", + "0xa58c3a4ba86d0d6b81c8411bb73a528b4f3bc2debac0e0208f788c080a3a96541d57c927143c165f595070afe14b0517", + "0xa52c15840b89d92897d1e140b2b8468a88886c5e1092861e598b3a433b340ded5b35b3d632a9879820fd56f20ca3a68b", + "0x8c122bea78deee98f00a86184ded61c10c97335bd672dadddc8224a1da21a325e221f8a7cfd4e723608ebcd85a2f19fe", + "0x87a51e0011dd0488009baac9c611fbde01878f9cf1584ea407599742bb32ef10586d9040dae3e9800a125de54f80c047", + "0x98181e9291622f3f3f72937c3828cee9a1661ca522250dfbbe1c39cda23b23be5b6e970faf400c6c7f15c9ca1d563868", + "0xb01a30d439def99e676c097e5f4b2aa249aa4d184eaace81819a698cb37d33f5a24089339916ee0acb539f0e62936d83", + "0x830e70476c6093d8b9c621ddf0468a7890942589cae744300416639a8b3bc59a57a7e1150b8207b6ab83dafcc5b65d3c", + "0x83ca733849830cb8fc2ef469e7e464fd94def561ce49ff0aa352a6ecd0e52c7aefcd69ab59f3d1ed2d5b8536d0a7895d", + "0xb76cb8cb446eb3cb4f682a5cd884f6c93086a8bf626c5b5c557a06499de9c13315618d48a0c5693512a3dc143a799c07", + "0x8b027c14affe47f83ee59b504d83b2fd2d9303de2c03ee59d169bb199d9f4bd6533d7f8c812dd7a6f1e8155e3e185689", + "0x8e6b888197010ebadd216da35b9716daa8675d93b3c33a96a19fd9ca42624f6b430b2ff115cd0f5b717341605dda24bf", + "0xb6652440bd01316523feefceb460158cd9ba268dd8dbe860a0271f0176230f057767597e4197885ba907318ca202ba06", + "0xa0b3dff15982a38a2f56d8c6cfc5c5543c045bf2db24571d23387ccab42abe2756f34d5f0bf6a426bbad3c358b8bdb00", + "0xa8b593de2c6c90392325b2d7a6cb3f54ec441b33ed584076cc9da4ec6012e3aaf02cec64cc1fd222df32bf1c452cc024", + "0x96b478b1e5e49d4ea3fd97c4846ae0f781dcc9f9ff61ee022ca92c3d8dfba89c513c46e8bb38b73e6b678a79b9b12177", + "0x946d585d7aa452d37a8c89d404757c3cce2adf2410e18613483c19199abd88f7a12e206f87a43f6009e42f4e31ed20c0", + "0x8c432e044af778fb5e5e5677dbd29cd52d6574a66b09b0cd6e2a5812e71c91559c3f257587bfc557b4b072a822973a60", + "0xad2cdae4ce412c92c6d0e6d7401639eecb9e31de949b5e6c09941aeafb89753a00ea1eb79fa70b54699acbfa31eda6b7", + "0xb504cb87a024fd71b7ee7bed2833115567461d1ae8902cccd26809005c4a56078617ec5d3fa5b29a1c5954adc3867a26", + "0xb8876bda1e709ab16e1347a1107852a7898a334a84af978de39920790b4d82eb0739cbfc34da1c7154dd6e9f7674759c", + "0x973dcf44ab60f55f5d10a8753ea16db9faedd839466a130729538f3a0724f00f74b3ca1de16987d7c6e24e9467f62bc7", + "0x94df5fe87661101a89b49091a3d4de89331cdbd88531ebb08a95f2629886ee53b3dcbcc26bb6bc68b443303d8d397141", + "0xa92beb343caf6a945990adcf84302c55d1fccdef96c34a21f2c00d3e206a9b2c6c6b412f66e5d4fafe26ef6446cde705", + "0xb298aa927713c86adfe0de1a8d6f4083b718c8be27156da9fd11abd8edb3a54a926ad487801eb39cfc9363a0a3be0d44", + "0xb34d4d2e15079e7e80fdba30cddf4fc0e6c9a61f7ab06a6ea0a4e55fd5bf632c6d72e021d6264d935439d321de883bb6", + "0xb4a86fb5b0049718caead1bc036833a2caeb88e1afadbbbcb0cd021d95e1f33fcc916f0b97fc1b9226c37050e3463796", + "0xb6cec65e5268818c82c0a4a029b02f8d23de98b68730a445119fee670118eb34027c23c987fac950f9b0151631328a4e", + "0x880b4ef2b278e1b2cccf36a3b5b7fbce94f106ed9fa2820cb9099a7a540a57e9fdeef5c0fb0a743049828fc2b8c46163", + "0xab2053c376c6bd113b89fdb2ae3b8401aa891135345885730c61cac7813f69ea7d906c531be752e28657f73af92d1f4e", + "0x8fa2d7b22af8e6b82679ebdfa13efdcb34289a554653ea6c1b16efb9f957f7fe64df787e7b03d8cdc8a732b91c916bd1", + "0x8e825c03c8409a3302266dc5f47fbfc381dfbafbadc37bd8d40f079ca8963d4c5ae6ef0d0ba6aef2d4688736f5f6bb45", + "0xa40ef3d2291d8782540961ce285054678b3d322d3cf7fc154207228c290708b1abfc37a4d7762dab3dfea582a112444a", + "0x8dbe8fcbcc414eb352245c52549973f73d987012de9d5f2b2f55dfdc43cf8cc9ea6b147abf149817f80f9e15aea566c6", + "0xa7e8775e04214e3b9898ffb9625dc8bcd1b683e333acdceddb8ca6db241df08a7b80e9d476a711b8b7d66aefca81e9cd", + "0x8b6ed54668f78a4a7624683b9bf3abf2bb0b6dccffccd8c0967df6297dadaf51732800fb9832b069437a6bf82ed7e6ae", + "0x9437ce85146202d3815df7f341a182678665dfb74b96006dc9d6acc16110d00b4a02717b702a765566457710ff5a7280", + "0x86a790072efa2cafa97be4b6b31f8c533f3b20cf3922fc0285fd403da436e4c49c65c5f08d77bfe823526c67bb58fab6", + "0x8ee8873de7cd28a54ba2c63a80b63399effed76b154e96ed26e7c0668b9f2476e298688b6a00c4b2ab9d020a897695d7", + "0x975c3261f0f32d59473e588f89593be38f5694cfa09394a861e4330b7800fb2528ea832106a928c54c76a303d49140e2", + "0xb5222582ed6604b9856a48039bd643340f4bf1bf0fc805e8453a9eb7630d6cea1452d28536706d6fa3ec16617617991c", + "0xb75c28941ee3f91b3535b4eaa0fb17b59ca65b5256601a1f6d0cf2bb4d66837fd16e51d6942856679012a5730a66e519", + "0x97b510f9f46bdf77a002b2403d8e42b6d6ad5329ea080940844429763ad3efd592652789c8d3d4fac0903c705f533cf7", + "0xa3fd9d8bbdc98394883022299fd9793e0c4f374d8e40d6ce89b2869d3173cb6a5476371d6095dad068ff217729f60af4", + "0xa57d5de556853484b1d88808d2529450238bc467376ded84cfd7b4a1ba258f6d43b5958220f962c57b033abcef1d5158", + "0x8465bd8be9bd9c2c6116d4ae44ec6618c109cb9aaee2d241e7a6ed906d398ef15a6fc18bc8b1d3398184241405954bba", + "0xab1cc44983e46a6ea2430aa6616ab28614f43624665e3e6ae31a9357c0c5434f34e56c720906e184327693cc4ebe1fa2", + "0xaafe14dd3b680f096010788226d8413ca628feedad79a2bc78cb04d47c6ad910f7f46ca87b8f8281744625d8f42d5eea", + "0x86a533b02ae929f67c301649a2d58651b98cdffe731b63fa32aa1013c271634bbb088c0d02865913c11bbb1bf57c0e12", + "0xb28df3e04bde4ec373171401dbd0546f4cb6fa8e9a4a8019aadc653d4e05e0b5b9a64417715dd87f6df9e7b3145f6659", + "0xac63fc758c1a3bc5cbff0f5e0b5a07a5aa801363b129d4e0360165c7dc1057ec37b0d808e9fd6b179e2c1e66bbc6090e", + "0x93f941b4fe6c05621e7a651b87669eefd60b6e8a4a8e630a51fa3fee27417b9eebce39f80a5bade9ca779133ad8388f6", + "0x96d7a69eaf2761bf0e5ebcd607b134d5dedba8e262ca1d6d3e8fbf23e6419a8ce1bbe4cd23b9e4b5f80db54a802a9795", + "0x8b62902fb2855300580e94830a4bc825d997ede33bf356fe3b7c08d6a8bd85a37879433fc6bee58f9b44ca280f4e8dfd", + "0xb043156fcd02b75dbe940c763fa8e8a7c7f6d74c1d5395db5ce544af3b6097eab61686950535a810aa95889ced12f74d", + "0x8614a7599c8d97aa9ca63b876f677977cf0daa969ff2a9a153f297a4a46e08fa5d91492995de94dc32cf009ce6bb5b5f", + "0x81351fd284d6d07092875f366bc5e53bfd7944b81eece85eab71a00443d1d2a9fc0337aaf34c980f6778dd211caa9f64", + "0x8c722aaf5d5dad1845056bf5e56dbff0f8b501f4846610f99da01130a49c96db9962bfd9be20670658cf276cc308be08", + "0x8effe3fb27c9f76bbd78687b743b52e6f3330eddc81bc9006ca81fd640f149d73630af578694f4530833c2151522dcc1", + "0xa3d327f48eb34998a3b19a745bca3fade6a71360022c9180efb60d5a6f4126c3f4dfa498f45b9a626ca567fdd66ffbff", + "0xa59a59db246f981e9c8e54aba52898c714d9787fef8969a6d8677fe6dec82950ff22a1364393b579f3e596cdf5bcd7b1", + "0xa15ebe9ab6de62a4d1ff30b7fc58acfb14ea54d7fa513cbcb045af3070db22bf9c1e987fa26c0c54356b9e38fa412626", + "0xb58396bce7d32ba6c70adbd37156d859e153c1932d2b0c7c874a1182ba831439e80d6fc6d7d88a870e193f515aef2264", + "0xb666dae42ea858c9b7d903ea3ca5279f619c71ac6e3fda7469e2bbba08c7e8e12d6a3c35ff2c6383673b1b7c21db5e0e", + "0x8eaaa21c8955f15bbcfd5756421a045e7b4825576379cc6229fe9751f7a7738b90be19ba52261db01c1e13af955675b0", + "0x8027bc62b59f9f15613e38da74ccc71fc3eaee26f096d187c613068195ce6eb64176013f2d86b00c4b0b6a7c11b9a9e5", + "0x8275eb1a7356f403d4e67a5a70d49e0e1ad13f368ab12527f8a84e71944f71dd0d725352157dbf09732160ec99f7b3b0", + "0xb8c41c09c228da62a548e49cfa107630166ac5c1469abf6d8aab55938ed1d142d5ddbc4f1043eed9496e9002cac99945", + "0x912750d2f1b21756662a400236f797b8ba76c73e5af95941a8c6ef9427838c4826715c80942cf8cb7ed01566bc490754", + "0x862af7dbb38ad7293a4e598cb52a8ac84dacee3d9bf007b5cb6a18a1acead0aa33f6dba796ce630e632c97aeb7100d68", + "0x890def696fc04bbb9e9ed87a2a4965b896a9ae127bc0e1cc515549b88ddbcbc02647e983561cab691f7d25cf7c7eb254", + "0xb835ffaf54c8b878d3c4262ca2bf5e6be2c691adced622b35d998ed72e1467ba907f4fde8d64ce43b43a8196f48e55db", + "0xa6d7e65bf9f889532090ae4f9067bb63f15b21f05f22c2540ff1bb5b0b5d98f205e150b1b1690e9aa13d0dee37222143", + "0x8ebfbcaccddd2489c4a29a374a2babc26987c3312607eadb2c4b0a53a17de97107c54eab34def09144b3098c082c286b", + "0x900b9972180a2c8753f5ff49fdd2cfe18c700d9927b3c3e16deb6376ad6ee665c698be72d4837b94911a0b4c183cb140", + "0xaa9679c01ecf1f1452c54688e01cb25bf157bde6b09b1ed460b8c175d65eba439c7ad4b7c1d72415f5622f3fbc068dc8", + "0x887a4277ee8754733f3692a90416eeac1ebee52ff23173a827f0ba569bd84efd806eb9139049f66cc577e370d3f0962d", + "0x951b27456e2af80436608aadec54ebd03bda37fa58452631da63bc5ff3eecb5ffb73d356b19f6c9c4225fcb0da8fda20", + "0x9104b5af82dbca914370eadb5518b26bee7ed7edeca74b741585ba8b249204e2c998bd47a02cef4335e236f8efafef94", + "0x8757e9a6a2dac742ab66011c53fa76edb5ebc3c2fbd9a7265529a3e5608b5c24b4482fed095725e9b8fed5a8319c17a4", + "0xa7acf82999de75f231fd80770bcb0f4c720d6b1e4a2558fa1ce854382fda92beb89fea5b5d229dad85fafee7a9e98329", + "0x8fb74891a8642f25a55b5eda5818367aac2fdf9663ad1e3dbc0166b484c0cda581b243cc75131167f1afa9caaf6705a0", + "0x897d7a19b70dcef1af006df3365981d73068c81f18017f32fb9966599481496efd5f6caceef943b31c52750c46d9590d", + "0x87ac804ccfe7f1fa156b8666664a397236832569f8945e11d4688a9e43ada4d4104efb3fda750f48ef655a29357c5e7d", + "0xaf18cf1e3d094b4d8423da072f98b3023d296f6a1f2a35d500f02bde522bb81dc65e9741c5bc74f7d5613bd78ce6bc03", + "0x9752561179783f336937757b619b2fdcb9dfce05aa3c4fce6d582dc966182eb85ab4ccb63e7e1736a7c5fad9d33cccd2", + "0x89e19b665ce7f6617884afaf854e88bb7b501ecdd195a5662c79802d721f5340eca8c48341ad1d6c78f519f82e5a9836", + "0x94402d05dbe02a7505da715c5b26438880d086e3130dce7d6c59a9cca1943fe88c44771619303ec71736774b3cc5b1f6", + "0xa76adeddf2454d131c91d5e2e3a464ef5d3c40ee6a2ab95e70ef2e49e0920d24f9b09276250ed7b29851affbdbc7885a", + "0x8934e9a3feababa12ed142daa30e91bd6d28b432d182ac625501fe1dc82f973c67f0fe82d39c9b1da3613bb8bfe2f77b", + "0xa5c11337eb91ce0e9b6d61bbdadea0a063beee1bc471cc02dc1d81c5dd2095315c400cbc6c33d23c77e98bba6bdf5439", + "0x92d00e64ed711951aeb852908aeb6fd379ea516872dd512384b1e773ef078e52e6d618beb202d437d2a46bcb78087f7a", + "0x97f1a7370b4f5acf83b466f519da361c366915f560385dd7eff9d53700ad81b25c9862bc71d35428e82372a5ae555ea0", + "0x95614544f65808f096c8297d7cf45b274fc9b2b1bd63f8c3a95d84393f1d0784d18cacb59a7ddd2caf2764b675fba272", + "0x8d474636a638e7b398566a39b3f939a314f1cf88e64d81db0f556ca60951ec1dca1b93e3906a6654ed9ba06f2c31d4ea", + "0xb87e5f481b938ac8a481b775cc58be2a06604549e3c810fc4734bab76099e5c617f0243c4c140cb7dd6d36a6dc2286bf", + "0x806efb61d1c948efc10dbf9bef30197d1c269e5e7fcf20a84367b26223d33fade413a0bbf4e33f0d1f1a00967289015e", + "0x880b99e77a6efb26c0a69583abb8e1e09a5307ac037962ddf752407cacaf8f46b5a67faf9126bdbcb9b75abf854f1c89", + "0x82ffe4de0e474109c9d99ad861f90afd33c99eae86ea7930551be40f08f0a6b44cad094cdfc9ed7dd165065b390579d0", + "0x941cd102228aa81ef99506313a4492a17c506e7169808c6b14dd330164e9e8b71b757cbe6e1bb02184372a8c26f7ad1f", + "0xae96dc808c316a677977831bad1e529ef965dadb5d6aea25ab008fe7bb1543e596e33052cfbe4279fa060201199d2c34", + "0xa2053719da2b7501dab42011ae144b3c8d72bd17493181bf3ae79a678068dc3ee2f19d29a60b5a323692c3f684f96392", + "0xb17171939519d90e243d41839c3c5ce7ac7e6a978e4a7e56b2c8e6a2b1b587c7eacea47f2e31a55d88555d252c810ebd", + "0xa958987c2b3c84df8176b600f5b75a8badef9653c71eff967e76648937def38826eaab4027a639f4f300b20019166250", + "0x854aafa329e2b2563355641eba95f2aba5b33d443ab16f5e342048f97d97c4e2812ff27c6f4180b8110272f3151be690", + "0x94d4a1e3a3d28a948f14d1507372701ac6fc884a4905405a63663e170831578a2719714ef56f920baa0ca27954823e39", + "0x826be957cf66db958028fa95655b54b2337f78fb6ef26bd29e2e3a64b130b90521333f31d132c04779e4b23a6b6cd951", + "0x8261f7e644b929d18197b3a5dcbba5897e03dea3f6270a7218119bd6ec3955591f369b693daff58133b62a07f4031394", + "0x84926cf2265981e5531d90d8f2da1041cb73bdb1a7e11eb8ab21dbe94fefad5bbd674f6cafbcaa597480567edf0b2029", + "0x8fb51e3ef3c1047ae7c527dc24dc8824b2655faff2c4c78da1fcedde48b531d19abaf517363bf30605a87336b8642073", + "0x8ba45888012549a343983c43cea12a0c268d2f7884fcf563d98e8c0e08686064a9231ae83680f225e46d021a4e7959bb", + "0x973ab82026d360e2cf5676d883906186bc61b43f60767ca58f11d0995e40780b163961e6e096299ccf1c86175203abde", + "0xb77416ea9a6b819e63ae427057d5741788bd6301b02d180083c7aa662200f5ebed14a486efae63c3de81572fe0d92a9c", + "0x820cc2ac3eed5bce7dc72df2aa3214e71690b91445d8bb1634c0488a671e3669028efbe1eae52f7132bde29b16a020b7", + "0xa6b434ac201b511dceeed63b731111d2b985934884f07d65c9d7642075b581604e8a66afc7164fbc0eb556282e8d83d2", + "0xb81821a79c9148b41d24d85dc997336a1e1719da0e31e42af30812b97a5af31708ca3e7bc2e803c3751cff23af5c509d", + "0xa013cc5e3fbb47951637426581c1d72764556798f93e413e1317849efd60f3ecb64c762f92544201eb5d6cfb68233050", + "0xb5f32034d0f66bcbccefe2a177a60f31132d98c0899aa1ffff5ebf807546ff3104103077b1435fa6587bfe3e67ac0266", + "0x86ca8ed7c475d33455fae4242b05b1b3576e6ec05ac512ca7d3f9c8d44376e909c734c25cd0e33f0f6b4857d40452024", + "0xb781956110d24e4510a8b5500b71529f8635aa419a009d314898e8c572a4f923ba643ae94bdfdf9224509177aa8e6b73", + "0xa3f9dcc48290883d233100b69404b0b05cf34df5f6e6f6833a17cc7b23a2612b85c39df03c1e6e3cd380f259402c6120", + "0xa104d4bad69f1720307ed12363d1ec97952acfe09d9e3650034c33f3f20c763271ebe0d5b50b1d3bd15c469f4573b09d", + "0x94bbc6b2742d21eff4fae77c720313015dd4bbcc5add8146bf1c4b89e32f6f5df46ca770e1f385fdd29dc5c7b9653361", + "0x951aa38464912a29df2101c60771d6de7fadb63f2db3f13527f8bdacb66e9e8a97aaac7b81b19e3d1025b54e2c8facff", + "0x919b5187af7dae210f151dc64a9cbd396d1ae04acadebf542a7123004efc7ce00d6e14c170d876fbc64dc1b5d141a5f4", + "0x88e1e459ee5aeb8b36ed004f6d03da296101106fbe1b18f9bbf63e92321db51670c34050fd3b7dc56a4bad76403823ee", + "0x86b3ec14a8ffb811a0ecc3771f600d8b08c098537d100fba66def19e7ee4d1c397a311977bf37e6cd2d47a8a2ee8c223", + "0x898c4873bd356ba8015f6f686d57088fa8f79f38a187a0ef177a6a5f2bc470f263454ee63d0863b62fca37e5a0292987", + "0xb471c72bd2971353f4b44248b8e6cf5316812861a88ccfc20fd0d89a5e010428c387228b2f6f14c12f79e31afc9d0753", + "0x8b7cb5b8de09a6dfceddcbaa498bc65f86297bcf95d107880c08854ed2289441a67721340285cfe1749c62e8ef0f3c58", + "0x983cb6bbfe83bce8326e699e83fca01ea2958c09808c703cac97a0ea777e5a5f3f5bba9169a47732de7459a3c7af47d2", + "0x8235a3f09078dd34ce2fc17cc625e061298713b113dda12d354b3d2ba80e11c443b1dd59c9eb5a29513a909645ae97d4", + "0x8bb51b380a8a52d61a94e7b382ff6ce601260fa9b8c5d616764a3df719b382ec43aec9266444a16951e102d8b1fb2f38", + "0x9579973ee2559da09b327c62b1cc0177f2859872885dca709e24dcfbb9bdf9224a6d26869aafce498f44c0e6bd8a996c", + "0x842ba3c847c99532bf3a9339380e84839326d39d404f9c2994821eaf265185c1ac87d3dc04a7f851df4961e540330323", + "0x99dad12f78e1a554f2163afc50aa26ee2a3067fc30f9c2382975d7da40c738313eaae7adbc2521f34c1c708f3a7475b7", + "0xb96e3ff8bdae47aa13067c29318b1e96a7fe3941869c17ce6662183b7b064bf261e1cea03e2a4643c993728a2606b5b5", + "0x955bc897171aa65d0159aa6e5d51855833f83d8bd5e65f93ad26c27781171783f3988a12bf987472edb39994bd071ea5", + "0xa59249e4dfb674dfdc648ae00b4226f85f8374076ecfccb43dfde2b9b299bb880943181e8b908ddeba2411843e288085", + "0xac2955c1d48354e1f95f1b36e085b9ea9829e8de4f2a3e2418a403cb1286e2599ba00a6b82609dd489eda370218dcf4c", + "0xb2eedff11e346518fa54e161be1d45db77136b724d497e337a55edfc896417de3a180bf90dd5f9d92c19db48e8574760", + "0x976eb5543e043b88d87fda18634470911dfe0e0cabab874ca38c1009e64d43026d9637d39dcd777bc7f809bbfc3e2110", + "0x8ea5f88a79f4eb9e7c0b6b29f8ef2d1cc4c15ed0ed798ab11a13d28b17ab99278d16cd59c3fa8217776c6dfae3aedf88", + "0xb7f146a357e02a63cd79ca47bf93998b193ce1174446953f12fa751f85dc2a54c9ed00c01a9308509152b3bad21d7230", + "0x87fd7e26a0749350ebdcd7c5d30e4b969a76bda530c831262fc98b36be932a4d025310f695d5b210ead89ee70eb7e53b", + "0xb9445bafb56298082c43ccbdabac4b0bf5c2f0a60a3f9e65916af4108d773d62ffc898a35b0b8efb72ea846e214faa02", + "0xb106c6d13ca17a4c8ea599306e84918127cf2de21027ac3fe5a57d35cf6f3b1d7671c70b866f6e02168ae4e7adb56860", + "0x9276e8051bed8f5dbfc6b35765aac577dd9351d9d6ac1bb14496bd98091005b9a4737b213e347336413743f681f5043b", + "0xaefc682f8784b18d36202a069269be7dba8ab67ae3543838e6d473fbc5713d103abcc8da1729a288503b786baac182d3", + "0x97578474be98726192cb0eac3cb9195a54c7315e9c619d5c44c56b3f98671636c383416f73605d4ea7ca9fbeff8dd699", + "0x99c34f9bd0fcb18b3d931e562988cf91886a417f8678f22651bf3cf138df2bbec3f675de90f62dda769e0eda03d72b7e", + "0xa0047e03c89a95248543618e6b7ca2c7aad7acda3c9f85771ec5c93fa898c651e8b2ea3b6b799d8cd592290a986cdd7d", + "0x993726e0b1c2277b97b83c80192e14b67977bf21b6ebcde2bda30261aa1897251cd2e277cfcb6193517f1eb156d2fe86", + "0x974a5180e55eab23d4c973fbee6ad1010335161ecdb849fe6520b34c1f96530a4faff80bd738fe281019b79d968c472c", + "0x8f1d90034f998018c3f4b5947b40b139fcead2e40aa80fdec6a4337c60e9d5ff1923dda7f0b5b1731ff16f55027d41bf", + "0xa7d9ae9621dd1f3da3cd2d435e891cc3579c4c0d60d6a4565cac86c315cea21a9ad883559fe7b897ae6e05f1aa989ad9", + "0x800f6be579b31ea950a50be65f7de8f678b23b7466579c01ac26ebf9c19599fb2b446da40ad4fc92c6109fcd6793303f", + "0x86fa3d4b60e8282827115c50b1b49b29a371b52aa9c9b8f83cd5268b535859f86e1a60aade6bf4f52e234777bea30bda", + "0xa80ac2a197002879ef4db6e2b1e1b9c239e4f6c0f0abf1cc9b9b7bf3da7e078a21893c01eaaab236a7e8618ac146b4a6", + "0xb4bf70468eff528bf8815a8d07080a7e98d1b03da1b499573e0dbbd9846408654535657062e7a87a54773d5493fc5079", + "0xae0e15a09238508b769de83b30582cc224b31cd854d04fdb7b8008d5d8d936dbdd3f4a70fff560a8be634c141772561b", + "0x936f7e20c96b97548fef667aa9fa9e6cfdc578f392774586abe124e7afc36be3a484735e88cc0d6de6d69cf4548b1227", + "0x8163eea18eacc062e71bb9f7406c58ebe1ce42a8b93656077dd781c2772e37775fe20e8d5b980dd52fdad98b72f10b71", + "0x86a6560763e95ba0b4c3aa16efd240b1873813386871681d075266511063b2f5077779a4fe49ffc35e1f320b613b8c94", + "0xb156d9d22722bb6e3b75b3b885b64642fa510ba7e6057657cd61bac43fb9c284d05bb09e2d4b78a2a4ddada85da9c702", + "0x9779ca2759dbed8081f0cbbfffcb3b842ba335e3ae48a60c5e5c77c7a2a0623e4c415ec3a023cc4e216885fcbac3ce52", + "0xb8137fd57ce7d3cfaf8bdbaa28704734d567d0e7a2d87fb84716722c524bb93acb2c1284249027f3c87bccc264c01f4e", + "0x8cf06b34e7021e9401eb705dde411ecf7e7e7185f8c0b0aeed949097df31812a9fdd4db7d18f9383a8a5a8d2d58fa176", + "0x8c65aa29a9ee9066b81cf24cf9e0beca3e8e8926e3df22d5ff1236297e158cc8bc7970a2c7016009cc4efa8f14b14347", + "0xac7e49f2059e99ff65505742978f8d61a03f73f40141a2bd46fde5a2346f36ce5366e01ed7f0b7e807a5ce0730e9eaa9", + "0xa1c25eb9b73723982be78180770aa63c5f7b23c2e54a2ed7e75a860c4512d273008066f1124ac8a43c60fe1e2a8bf03c", + "0x9310722e360a5652737362f6b9cb6e9c3969a0c9bb79b488b3c7d19d9e8c42ebd841df346258ded2e393895c99b413cf", + "0x893272a63650b08e5b8f9b3f17f8547b456192ad649c168bafd7166b4c08c5adf795c508b88fd2425f7be8334592afb2", + "0xb576c49c2a7b7c3445bbf9ba8eac10e685cc3760d6819de43b7d1e20769772bcab9f557df96f28fd24409ac8c84d05c4", + "0xaf17532b35bcb373ce1deebce1c84abe34f88a412082b97795b0c73570cb6b88ea4ba52e7f5eb5ca181277cdba7a2d6d", + "0x8b8813bd2c07001a4d745cd6d9491bc2c4a9177512459a75dc2a0fa989680d173de638f76f887de3303a266b1ede9480", + "0xab73a043ccdfe63437a339e6ee96ef1241264e04dd4d917f6d6bc99396006de54e1e156d38596ba3d15cb1aaa329f8f5", + "0xb67146b202afec0132ac0070c005cf664081e860339f8f4d45ac3e630dda05560936e646673e652d08cecd8d18fc64da", + "0xa750404e9d4b1a48f767d2b6aa699200c92c3b8102597f8c5c1dbaaf08112a0587c05801dfebb3612fb6dfd76ddc9ccb", + "0xb0d4231814e40e53ab4eed8333d418a6e2e4bd3910148b610dec5f91961df1ad63f4661d533137a503d809ea1ad576fa", + "0x81fc724846b5781f3736795c32b217458bb29972af36cc4483dd98ab91680d3d9bc18842db2661487d3a85430dc9e326", + "0xa5cf6f4fd67aecb845eebc8d7304c98c69806d774d4c468350f7f82ff0f5baeecc56837705e39432a8d246aa2a7075ed", + "0xa71d2c8374776f773bad4de6edfc5f3ff1ea41f06eb807787d3fba5b1f0f741aae63503dbca533e7d4d7d46ab8e4988a", + "0x825359cfe68ad6a75578a94be6419179e0aa088170b6c20fc5c249dc3be7a260d687c93d8d8a343c7c72c2ed6a716de3", + "0xb6aeb7a9b934a54e811921494f271d5d717924c561cd7a23ab3ef3dd3e86184d211c53c418f0746cdb3a12a26a334fc8", + "0x8c6fc89428c74f0c025e980c5a1e576deadf8685f57136e50600175fa2d19389c853d532bb45a3e22b4a879fab1fcb0d", + "0xae95ddcf3db88f6b107dcf5d8aa907b2035e0250f7d664027656146395a794349d08a6a306ce7317b728ca83f70f3eaf", + "0x8c03fb67dd8c11034bd03c74a53a3d55a75a5752ea390bd2e7f74090bf30c271541b83c984d495871d32c98018088939", + "0xb8d68610fdee190ec5a1f4be4c4f750b00ad78d3e9c96b576c6913eab9e7a81e1d6d6a675ee3c6efac5d02ed4b3c093a", + "0x87d4b20bbe2dcd4f65f4e1087f58532d5140b39a5288e1a63fc0b7e97a6a56946eafdd90ba09300c3d1fef6356ac6b7c", + "0x83e264b1d3d4622826ab98d06f28bbbd03014cc55a41aaf3f2a30eec50430877d62b28c9d6d4be98cb83e1e20f3b13db", + "0x97ffcbf88b668cde86b2839c7f14d19cb7f634a4cf05d977e65f3cd0e8051b2670e521ae74edc572d88201cff225e38a", + "0x91efdbcaad9931312d7c41d24de977f94d7f3f7b88090a1f72d9a097a1e30cc805c5ea16180f463022d9b26b8863f958", + "0xa4b507a4bc2bc424297bf8968bf385fae3acc686cff4b7933b4f5b6ef3149995393d5331dbac4b629e8adce01a91a4cc", + "0xa76a26c30d8abbbd4bf982bb8bd2066a2ec823a5eb6fbe37c664e67efbe2f72d8ce2d00223b900699149f8441bff5ada", + "0xb3a5497365bd40a81202b8a94a5e28a8a039cc2e639d73de289294cbda2c0e987c1f9468daba09ea4390f8e4e806f3c8", + "0xa09b2a07d861e01645accfb088f7f9ad524186bd439712775459a60f8a1fbbd43ee084e4d6e23ffce06daa189cd1e654", + "0xa41cf5d678a007044005d62f5368b55958b733e3fdde302ba699842b1c4ecc000036eda22174a8e0c6d3e7ef93663659", + "0xa698b04227e8593a6fed6a1f6f6d1eafe186b9e73f87e42e7997f264d97225165c3f76e929a3c562ec93ee2babe953ed", + "0x8bc66e370296649989a27117c17fbc705d5ac2bda37c5dad0e4990d44fcc40d3e1872945f8b11195538af97961b5c496", + "0x8bff10f91b8c0abb6c9542588da17fa0118ffda4c82626a754887e333d7d69661b3ae4e400da15c49565f8d10a77d0d7", + "0xac715c7b3d794860a61d9c7bd224a2b14a6023f696afa30345aad2ce0a6ea6dbc142f34af1ffe7f783542851a28e8ece", + "0x91c5e0b9146fe5403fcc309b8c0eede5933b0ab1de71ab02fac6614753caac5d1097369bdeed3a101f62bbcae258e927", + "0x8553748da4e0b695967e843277d0f6efeb8ba24b44aa9fa3230f4b731caec6ed5e87d3a2fcd31d8ee206e2e4414d6cf4", + "0xac722bd742374f925185ea7d4d62d7510b2d8a6ebf5c750af6ce83e2d8a28c95a3e298870ec8254ab2d1d0aa2a063c60", + "0xb083c4cefb555576bb37b71f30532822cb4b1e1998e35cb00ffb80ca14e2853193c16a6756417853d4a74d625744dd76", + "0x85745bd84c92ddfc55df11fe134cf70e3c340aa1c7cdd6188a03308cf3a840f4f19629f9730b2e6426424989ff03000d", + "0x845b4531dee808b583645f56fa98cbdecce3ea100db60524b64f68e29866173791f01137714f4dc7fb8612f7f7943263", + "0x93f03495d53c781be8b76e37e68b64aa260523004eff6455ddc8a8552af39854e5181f8c5365812b1f65926534fba5dd", + "0x801c126abff96fe9b042be8869d2907d0c6963a79901f9db46577a445418b7465a1f4b346933d433e539536a9a2df01c", + "0x952cf6782b0ad3e85625391cc5f486a16bb5b1f8ea20defcb6857bd7d068dcd2701bc7ed5c3b773a869180d9042f772b", + "0xb3b6eccb2ec8509b4eea8392877887180841ab5794c512b2447be5df7165466d7e293696deaabf063173e5f2238ce763", + "0xb63fd45023f850985813a3f54eceaccb523d98d4c2ba77310a21f396e19a47c4f655f906783b4891de32b61a05dc7933", + "0xa113b889be5dcc859a7f50421614a51516b3aadc60489a8c52f668e035c59d61640da74ba1a608856db4ff1fa1fe2dfd", + "0x87fec026beda4217b0a2014a2e86f5920e6113b54ac79ab727da2666f57ff8a9bc3a21b327ad7e091a07720a30c507c9", + "0xa3ee8fd53158dad3b6d9757033abf2f3d1d78a4da4022643920c233711ff5378ac4a94eadcaf0416fdcca525391d0c64", + "0x8d6bed5f6b3f47b1428f00c306df550784cd24212ebac7e6384a0b1226ab50129c0341d0a10d990bd59b229869e7665a", + "0xb549cef11bf7c8bcf4bb11e5cdf5a289fc4bf145826e96a446fb4c729a2c839a4d8d38629cc599eda7efa05f3cf3425b", + "0x982691766a549df56436acd0fe76da78132e027515f27174c10d117bfcc20ed73fc31f5465bd7a22a101094fe913e221", + "0x985af1d441b93fa2a86c86b6d7b70b16973d3971e4e89e093b65f0ae626d702202336869af8e3af3923e287547d5384b", + "0x994b7baecc8bb68d270a3a88c58e4054afdbd713b4472f9522b27c1762c637ef8f013d745ce9d1dc8fc4d986d4c9338c", + "0x827dabda84c7f7b1adc0f5ca0fccf0729e9d7f78e1ffa7c5e9c4f66610ff0ab776c880b00c77137cf7abe14df977febc", + "0xacd17cba1203748b55bd9d7b940a16bb7c02988c93007a80b87e0bdb049b91f5ecce577e3e4ea68a0abe998a72cd300d", + "0x989fa046d04b41fc95a04dabb7ab8b64e84afaa85c0aa49e1c6878d7b2814094402d62ae42dfbf3ac72e6770ee0926a8", + "0x99dc48a054f448792523dcdeec819e1b928b1bd66f60f457261f0554f8532eedd7152792df70ae5316ab2f9c02a57cdc", + "0xab33c65587ecb3278325948c706aed26547e47ed2b4bc027e9119bb37bec67ddf5489fbc30304ef6c80699c10662d392", + "0xae89e41d8cfbf26057a4078f8a5146978e658801b08814190cbce017d79beaeb71558231a72bde726fa592fb0828c01c", + "0xa9901df92e2d3abbb25f3bf4b913692c4cd57da327b01c8ee2362c02fbefcf66cdb792c17a81dcbde3c9b9dba313e4a1", + "0x8ee41011424da5e2ecea941cbf069ea32420749f2519434d3d8f9725ac789753404687a6745cffe4bd5dfc8fec71a719", + "0x8cfcdfa192b17321be4e447204e1a49ecaadca70a3b5dd96b0c70ab64d1a927d1f8c11a7e596367e5fa34e2307af86fc", + "0xb8a0003e949cf994b1bb25e270cb61358200c93b1c6f611a041cf8536e2e0de59342453c5a8d13c6d4cc95ed8ce058f3", + "0xadc806dfa5fbf8ce659aab56fe6cfe0b9162ddd5874b6dcf6d658bd2a626379baeb7df80d765846fa16ad6aad0320540", + "0xa83b036b01e12cadd7260b00a750093388666aff6d9b639e2ce7dfc771504ef8b2090da28ec4613988f2ec553d1d749e", + "0x825aca3d3dfa1d0b914e59fc3eeab6afcc5dc7e30fccd4879c592da4ea9a4e8a7a1057fc5b3faab12086e587126aa443", + "0x845a4a09941f48677e6c03699770f9a56ba72695089e432a6f232294dd8da6d34e394116a9a87f3b0902c78332af9439", + "0xb2f168afc35ed9b308ab86c8c4aaf1dcd6833ce09153bb5e124dad198b006e86a941832d387b1bd34b63c261c6b88678", + "0xa094cca9d120d92c0e92ce740bc774a89667c6f796b438b0d98df0b7aef0935d8c915d5b0dad4b53e383dc9f095c29fa", + "0x956ecb233b3529b2d9cb80ae49e48667f2a3120e4a0d7131d1e9ec36db3a59dc2ef2a579cbb99d6f14880ca83f02b64c", + "0x906cde18b34f777027d0c64b16c94c9d8f94250449d353e94972d42c94dd4d915aa1b6c73a581da2986e09f336af9673", + "0x824c8a1399ab199498f84e4baa49ff2c905cf94d6ac176e27ec5e2c7985140dbaa9cc6303d906a07ab5d8e19adf25d8a", + "0x889a5cf9315383bf64dfe88e562d772213c256b0eed15ce27c41c3767c048afe06410d7675e5d59a2302993e7dc45d83", + "0x95791fb6b08443445b8757906f3a2b1a8414a9016b5f8059c577752b701d6dc1fe9b784bac1fa57a1446b7adfd11c868", + "0x99049e9a23c59bb5e8df27976b9e09067d66e4a248926d28171d6c3fdd1ab338944a8b428b2eaae5e491932c68711c7c", + "0x95c810431c8d4af4aa2b889f9ab3d87892c65a3df793f2bfd35df5cfdb604ca0129010fa9f8acae594700bece707d67f", + "0x841d77b358c4567396925040dffe17b3b82c6f199285ac621b2a95aa401ddb2bc6f07ebd5fa500af01f64d3bb44de2df", + "0x90c402a39cd1237c1c91ff04548d6af806663cbc57ff338ed309419c44121108d1fbe23f3166f61e4ab7502e728e31fd", + "0x968d44188e2d9d1508b0659e96d6dabd0b46aa22df8d182e977c7f59e13aa05d5da09f293f14f6f2ee1b996071cd2f25", + "0x8ae9585caa3c73e679fe9b00f2c691732f7b7ca096e22d88c475a89d4d55cb9fba3cd0fe0cedd64ce75c591211664955", + "0x94b81d5ad72efb4dd60867e71afcd8e87e1f24bf958d42fc07db66f6185a1e610987ab9ceef63109a36fe5544a0cf826", + "0x8499a8c3d67d1f6eccf1c69274393dc498cff862ea8e6c11ffb8107ae190d258ddc1d294f2a8f050488df0212063ece2", + "0x921109a390e4d7fbc94dff3228db755f71cb00df70a1d48f92d1a6352f5169025bb68bcd04d96ac72f40000cc140f863", + "0xb464d763e5ef724ab7ee13a60015df5c9a7809a79188ff6a7e0d5e5400febd42ad7330406a59704a44a08f2289d659c8", + "0x96f1a36134e0d4137a7fe8bbb354f50aaa67f28f194ae2fdbe8be3eb24596678d8c9287765ee90c1f2778d0d607931e0", + "0xb031d93b8f119211af76cfafee7c157d3759b2167ee1495d79ad5f83647d38248b4345917309ef1a10ecaa579af34760", + "0x88a7dc337d89324f025f686f37d21240c7da9a1cb802259ea8d8a83e246dcc2adceca7ca3534bc7bf8f3ae1cbeafb5c0", + "0xb30e022b8a563655074e08e123b5f96956bbf0fe221cc629c5fedd2764a66b475916ceb98867f935b4a47212e53ae9f3", + "0xab6e3180dae399d41243f23545e5e6d118844f9b8edba502a3503fd1162ed826f9fc610889a1d685d374b6c21e86067d", + "0x96cf5760c79cfc830d1d5bd6df6cfd67596bef24e22eed52cee04c290ad418add74e77965ea5748b7f0fb34ee4f43232", + "0xa5817c74a394b0359a4376ef7e9e8f7dfa6a7829602da225074fb392b715e1fd52c50cae0f128a7006f28b22f233fbf5", + "0xa50ab79cf3f6777a45f28d1b5cdad2c7ea718c60efeeb4c828d6307b29ef319445e6a9f98aa90f351c78b496575150c1", + "0x8b300dea07e73dd2f07b05d477e51f8424589f6b2fa6f461240e1322a3a7ab5bf227b74544bb5d66a297702cdbf6c6bf", + "0xb13b5cb86dc8b8fe87125f1a51fe98db36bdde4f600401408b75059a44e70b1bbfefd874e539691f3f1bf6f54db883c8", + "0x8d06205cd66703ce6776b38b98c32b27f45c7b3f65ea2d05e2b702c24d553f51c69bf0b17e8db7382475e3d370d2e8d6", + "0xa11a7496c712734aec80738e30d2bf245758b34245076149854eb209fa6403be8bb0d4e515becc881b7f3610749260c0", + "0x9615800f8c95f95bf25055ae079b964e0a64fa0176cc98da272662014f57e7cd2745929daf838df0094b9f54be18b415", + "0xb19ca6e55f349bbb2dc3e429520ff5b2e817972470794f35c1aac8c118b37a694cfcc875b6d72225343799825d2f5c39", + "0xa650864b7eb6769aaf0625c254891447351e702e40d2be34dfd25f3b5367370de354318d8935ba18db7929270455ae6a", + "0xa649208372f44f32eb1cd895de458ca1b8be782746356f08ac8ef629429d0780a0799fcff85736e19aead0b79bfff261", + "0x89461cb2dadf51d6f1208b0965c8eabec895d7b19b7d90d3c6e49dbe75a75c30fd26db3dfb169dd46a4342280225032a", + "0xb5d6f664ec92e5343792d5d6b629919c5fd8cfb874677df2264daf02bcd9d12facf9b859d5402839c9022396e20d260b", + "0xa7179d338fe5a0e4669364a364e17f8d00cb6c59a80a069afd5f4f14510df2eee90c07826553e4f7fe46d28f72b2903e", + "0x8ded37d67b5368619a090266e9b5585fbff60319a90a4244a3c3342641f5bfa5130998dd97d7a42505cd896c29255530", + "0xa3fd63e87a00b48ba46a646a26187ae6dcb16779721973ada13a545853e2e51b5e4df04630d670884ad4a2304cc60c67", + "0x92761b7e31f0c758b3b1f5b43a194b25aabec668101946eb6511132863d3afb9d18f833d43a8338d0e7bc78d8689e523", + "0xab8a8769c754008a7976b6799e81d7bfe97413d0a79b90715703c1f8f567675463ec93aabee59277121fc4df88b5c7a9", + "0xb354d0d1bd942f79002a2eaf37eb99dab650170e7040c13c824803ed7c1670dc910ccae13bbe58bde003829b140b45ea", + "0xb9eed89e003894ad2cc9d9b93a45247e1367ac69a00b0ed5e3280c1188b4cb90eb870d449b83a852a798bd02f9d0c813", + "0xb900a55013d0427e5da6b21611d6ae3e648f54f794cb099b2d2beebae0a957477a94dc415e8ec5e68e9029ce50d43843", + "0xafbf44071c2c905f7c8ef396eaed7f13deb7a91719cb5e8b9226aaceb876d81a10076383edc6216bc2f5c38a480b2957", + "0x80bdb82b7d583bf1e41653966b0ba3b4fec0e7df2ff08e3fa06fd9064bca0364263e075e1582741a5243bde786c9c32e", + "0xa841fe9ff26db21ade698f6dbfba025d90ae9f81f02af9e008fa0a429b993fb04d06acb93e40a9f81c78f73334555a17", + "0x8cd49711b42af58a5aae75a38fea9ddc5e4183c467a3159b5b0629f01ba548513c577456d34c861911e85782e52c3b1b", + "0xa322b5d2a6e3cb98b8aaa4c068e097188affef5dec2f08c3e9ce29e73687340d4e5a743a8be5f10e138f9cabbe0c7211", + "0x942772b7c7c47d4e5957ccf1d6f1450070930af3e2b7eaab0dd7699372445df0cc910e6c0efcf501887dd1adabdaee23", + "0x9834f66e5c946c3a8241ca2bbde046a7e88072124911d5d15c037a95b61e82b88b5c2058fa4a3721537dee39dee5da18", + "0xa90cc5b9c4d84f36962d0d55d5bc123dbe5ec5f4fe7b6bf0d009028b3cf14e36c11bc5365391cb4ae548d5eb04fe371b", + "0xa7c2174eea2b66b2a71cc8095fae39c423a353c7d5020ec2d0551317a66202fcf082c6119ba768755523fff49791bb4e", + "0xab92b2a177dfa55d202a653532f0e04d1339ca301aebe6a0e8419bf45be3e573b6b9ae4d3d822cc8279367a3d2c39b06", + "0x8a9ad977988eb8d98d9f549e4fd2305348a34e6874674bcd6e467c793bba6d7a2f3c20fa44aabbf7151ca53ecb1612f6", + "0xa7d1676816e81a752267d309014de1772b571b109c2901dc7c9810f45417faa18c81965c114be489ed178e54ac3687a1", + "0xa575be185551c40eb8edbdb21a0df381c801b6e99467fcf5882dd7cb34916960ce47ac732c1920ad3218f497b690cef4", + "0xb50c306f78143b37986e68efa10dbe1fb047d58562e9b5c5439b341dd8f1896c7ae586afac0a3213759784a905c1caaa", + "0xb31e89b4a034c1b73d43b3d63ea3bddea682a6a5327eff389c70b13e9e72185b0327682a0cb1ff3c4a4f8ba08b13d898" + ], + "aggregate_pubkey": "0x948a4b8d91bd29969cd4470b1bc24d34586d38e73d5be71c98a9894899471a5f708747563276b4b6d2716fdb72860267" + }, + "next_sync_committee_branch": [ + "0xcb3fea582872d90706ddc6d029bac0d791ea75d43c3ab04f056f62a11b89d27b", + "0xf26b4bb68eb7e6906c8ef4a9958398a48e4450bf9c8a462fafa4fde51cd5628f", + "0x690925f92c1d322d2ff2a5636539094825dfd2c9bf7538fe111b2358e03a71de", + "0x51d977e358166401c7cd3f6185468c1a8c69a4c3d8577535dd583bc427692e02", + "0x88d2089aaf2f6fd8f6e4ae499c6fe33cc34289eb9310780861e772204f07b670" + ] + }, + "finalized_header": { + "slot": 4055040, + "proposer_index": 854, + "parent_root": "0x8adf3b288deb17566a553fa7a06a2f63f4ac4cea4868af4d89ddca41f73ae9b9", + "state_root": "0x595e9ebaaa23f027672b4d2a33173a22b2839baac709c7f8e66d3219f492ee9f", + "body_root": "0xacf37b466d4f6b5d1db5b6ffe5d77c13972d116c2b0809de924427fd597d391a" + }, + "finality_branch": [ + "0x00ef010000000000000000000000000000000000000000000000000000000000", + "0x3d4be5d019ba15ea3ef304a83b8a067f2e79f46a3fac8069306a6c814a0a35eb", + "0xa2e2a28c0bb0ad56c25f3c461a4bfe4f3b3b894bc0105a62e85f43a4ae1adc3f", + "0x690925f92c1d322d2ff2a5636539094825dfd2c9bf7538fe111b2358e03a71de", + "0x51d977e358166401c7cd3f6185468c1a8c69a4c3d8577535dd583bc427692e02", + "0x88d2089aaf2f6fd8f6e4ae499c6fe33cc34289eb9310780861e772204f07b670" + ], + "block_roots_root": "0x7054ba439f83e9b2223911e25fad48eb28f5c362d94c0de2455a45436cc93897", + "block_roots_branch": [ + "0xc99a842c81d0b956eef988dbcd90499457d61f942375c6cbf67262909b708db5", + "0x5d32345aeb10aa3ede4be021d2231dac47cc2074f74b72466f0b042e69adf70f", + "0xb69608a2377956c1a39c3423d3399ccfb12307623c9df6358f5fcfca64a80102", + "0xcefd9b668e49ece82bd4b0ee2f1efc88ecaf0d9af464fb622735663aaf106c4c", + "0xc113ad1c971779b15c64772ab69cd775edfb926a60447974913bb6f58fbd12fb" + ] +} \ No newline at end of file diff --git a/bridges/snowbridge/parachain/pallets/outbound-queue/src/lib.rs b/bridges/snowbridge/parachain/pallets/outbound-queue/src/lib.rs index 201e524fb91..c3401c4dc94 100644 --- a/bridges/snowbridge/parachain/pallets/outbound-queue/src/lib.rs +++ b/bridges/snowbridge/parachain/pallets/outbound-queue/src/lib.rs @@ -109,7 +109,7 @@ use sp_runtime::{ DigestItem, }; use sp_std::prelude::*; -pub use types::{CommittedMessage, FeeConfigRecord, ProcessMessageOriginOf}; +pub use types::{CommittedMessage, ProcessMessageOriginOf}; pub use weights::WeightInfo; pub use pallet::*; @@ -186,12 +186,7 @@ pub mod pallet { count: u64, }, /// Set OperatingMode - OperatingModeChanged { - mode: BasicOperatingMode, - }, - FeeConfigChanged { - fee_config: FeeConfigRecord, - }, + OperatingModeChanged { mode: BasicOperatingMode }, } #[pallet::error] @@ -200,8 +195,6 @@ pub mod pallet { MessageTooLarge, /// The pallet is halted Halted, - // Invalid fee config - InvalidFeeConfig, /// Invalid Channel InvalidChannel, } diff --git a/bridges/snowbridge/parachain/pallets/outbound-queue/src/types.rs b/bridges/snowbridge/parachain/pallets/outbound-queue/src/types.rs index 07803ed9b73..28d400bb9d4 100644 --- a/bridges/snowbridge/parachain/pallets/outbound-queue/src/types.rs +++ b/bridges/snowbridge/parachain/pallets/outbound-queue/src/types.rs @@ -1,11 +1,9 @@ -use codec::{Decode, Encode, MaxEncodedLen}; +use codec::{Decode, Encode}; use ethabi::Token; use frame_support::traits::ProcessMessage; use scale_info::TypeInfo; -use serde::{Deserialize, Serialize}; -use sp_arithmetic::FixedU128; use sp_core::H256; -use sp_runtime::{traits::Zero, RuntimeDebug}; +use sp_runtime::RuntimeDebug; use sp_std::prelude::*; use super::Pallet; @@ -57,43 +55,3 @@ impl From for Token { ]) } } - -/// Configuration for fee calculations -#[derive( - Encode, - Decode, - Copy, - Clone, - PartialEq, - RuntimeDebug, - MaxEncodedLen, - TypeInfo, - Serialize, - Deserialize, -)] -pub struct FeeConfigRecord { - /// ETH/DOT exchange rate - pub exchange_rate: FixedU128, - /// Ether fee per unit of gas - pub fee_per_gas: u128, - /// Ether reward for delivering message - pub reward: u128, -} - -#[derive(RuntimeDebug)] -pub struct InvalidFeeConfig; - -impl FeeConfigRecord { - pub fn validate(&self) -> Result<(), InvalidFeeConfig> { - if self.exchange_rate == FixedU128::zero() { - return Err(InvalidFeeConfig) - } - if self.fee_per_gas == 0 { - return Err(InvalidFeeConfig) - } - if self.reward == 0 { - return Err(InvalidFeeConfig) - } - Ok(()) - } -} diff --git a/bridges/snowbridge/parachain/runtime/tests/Cargo.toml b/bridges/snowbridge/parachain/runtime/tests/Cargo.toml index 9b5000b56cd..0a09f89c6b9 100644 --- a/bridges/snowbridge/parachain/runtime/tests/Cargo.toml +++ b/bridges/snowbridge/parachain/runtime/tests/Cargo.toml @@ -233,8 +233,8 @@ try-runtime = [ "snowbridge-system/try-runtime", "sp-runtime/try-runtime", ] -beacon-spec-mainnet = [ - "snowbridge-ethereum-beacon-client/beacon-spec-mainnet", +fast-runtime = [ + "bridge-hub-rococo-runtime/fast-runtime", ] experimental = ["pallet-aura/experimental"] diff --git a/bridges/snowbridge/parachain/scripts/verify-pallets-build.sh b/bridges/snowbridge/parachain/scripts/verify-pallets-build.sh index f060cf958b7..74cec954832 100755 --- a/bridges/snowbridge/parachain/scripts/verify-pallets-build.sh +++ b/bridges/snowbridge/parachain/scripts/verify-pallets-build.sh @@ -57,6 +57,8 @@ rm -rf $SNOWBRIDGE_FOLDER/codecov.yml rm -rf $SNOWBRIDGE_FOLDER/docs rm -rf $SNOWBRIDGE_FOLDER/hooks rm -rf $SNOWBRIDGE_FOLDER/relayer +rm -rf $SNOWBRIDGE_FOLDER/scripts +rm -rf $SNOWBRIDGE_FOLDER/SECURITY.md rm -rf $SNOWBRIDGE_FOLDER/smoketest rm -rf $SNOWBRIDGE_FOLDER/web rm -rf $SNOWBRIDGE_FOLDER/.envrc-example @@ -74,6 +76,7 @@ rm -rf $SNOWBRIDGE_FOLDER/rust-toolchain.toml rm -rf $SNOWBRIDGE_FOLDER/parachain/rustfmt.toml rm -rf $SNOWBRIDGE_FOLDER/parachain/.gitignore rm -rf $SNOWBRIDGE_FOLDER/parachain/templates +rm -rf $SNOWBRIDGE_FOLDER/parachain/.cargo rm -rf $SNOWBRIDGE_FOLDER/parachain/.config rm -rf $SNOWBRIDGE_FOLDER/parachain/pallets/ethereum-beacon-client/fuzz diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs index 61939a2c80a..0423dd0ac86 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs @@ -917,6 +917,7 @@ construct_runtime!( // Bridge utilities. ToWestendXcmRouter: pallet_xcm_bridge_hub_router::::{Pallet, Storage, Call} = 45, + // The main stage. Assets: pallet_assets::::{Pallet, Call, Storage, Event} = 50, Uniques: pallet_uniques::{Pallet, Call, Storage, Event} = 51, diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml index 6bb20b5ee35..bc8fa72bb0b 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml @@ -130,7 +130,7 @@ bridge-runtime-common = { path = "../../../../../bridges/bin/runtime-common", fe sp-keyring = { path = "../../../../../substrate/primitives/keyring" } [features] -default = ["beacon-spec-mainnet", "std"] +default = ["std"] std = [ "bp-asset-hub-rococo/std", "bp-asset-hub-westend/std", @@ -223,7 +223,6 @@ std = [ ] runtime-benchmarks = [ - "beacon-spec-mainnet", "bridge-hub-common/runtime-benchmarks", "bridge-runtime-common/runtime-benchmarks", "cumulus-pallet-parachain-system/runtime-benchmarks", @@ -299,8 +298,8 @@ try-runtime = [ ] experimental = ["pallet-aura/experimental"] -beacon-spec-mainnet = [ - "snowbridge-ethereum-beacon-client/beacon-spec-mainnet", +fast-runtime = [ + "snowbridge-ethereum-beacon-client/beacon-spec-minimal", ] # A feature that should be enabled when the runtime should be built for on-chain diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_ethereum_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_ethereum_config.rs index b0526148fa3..af2438efbcf 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_ethereum_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_ethereum_config.rs @@ -14,10 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Cumulus. If not, see . -use crate::{ - xcm_config::{AgentIdOf, UniversalLocation}, - Runtime, -}; +use crate::{xcm_config::UniversalLocation, Runtime}; use snowbridge_rococo_common::EthereumNetwork; use snowbridge_router_primitives::outbound::EthereumBlobExporter; @@ -26,5 +23,5 @@ pub type SnowbridgeExporter = EthereumBlobExporter< UniversalLocation, EthereumNetwork, snowbridge_outbound_queue::Pallet, - AgentIdOf, + snowbridge_core::AgentIdOf, >; diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs index b21cde248e1..b1ff98491da 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs @@ -99,6 +99,8 @@ use parachains_common::{ HOURS, MAXIMUM_BLOCK_WEIGHT, NORMAL_DISPATCH_RATIO, SLOT_DURATION, }; +use polkadot_runtime_common::prod_or_fast; + #[cfg(feature = "runtime-benchmarks")] use crate::xcm_config::benchmark_helpers::DoNothingRouter; #[cfg(feature = "runtime-benchmarks")] @@ -209,7 +211,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("bridge-hub-rococo"), impl_name: create_runtime_str!("bridge-hub-rococo"), authoring_version: 1, - spec_version: 1_005_001, + spec_version: 1_005_002, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 4, @@ -566,7 +568,7 @@ impl snowbridge_outbound_queue::Config for Runtime { type Channels = EthereumSystem; } -#[cfg(not(feature = "beacon-spec-mainnet"))] +#[cfg(feature = "fast-runtime")] parameter_types! { pub const ChainForkVersions: ForkVersions = ForkVersions { genesis: Fork { @@ -586,30 +588,32 @@ parameter_types! { epoch: 0, }, }; - pub const MaxExecutionHeadersToKeep:u32 = 1000; } -#[cfg(feature = "beacon-spec-mainnet")] +#[cfg(not(feature = "fast-runtime"))] parameter_types! { pub const ChainForkVersions: ForkVersions = ForkVersions { genesis: Fork { - version: [0, 0, 16, 32], // 0x00001020 + version: [144, 0, 0, 111], // 0x90000069 epoch: 0, }, altair: Fork { - version: [1, 0, 16, 32], // 0x01001020 - epoch: 36660, + version: [144, 0, 0, 112], // 0x90000070 + epoch: 50, }, bellatrix: Fork { - version: [2, 0, 16, 32], // 0x02001020 - epoch: 112260, + version: [144, 0, 0, 113], // 0x90000071 + epoch: 100, }, capella: Fork { - version: [3, 0, 16, 32], // 0x03001020 - epoch: 162304, + version: [144, 0, 0, 114], // 0x90000072 + epoch: 56832, }, }; - pub const MaxExecutionHeadersToKeep:u32 = 8192 * 2; +} + +parameter_types! { + pub const MaxExecutionHeadersToKeep: u32 = prod_or_fast!(8192 * 2, 1000); } impl snowbridge_ethereum_beacon_client::Config for Runtime { @@ -630,7 +634,7 @@ impl snowbridge_system::Config for Runtime { type RuntimeEvent = RuntimeEvent; type OutboundQueue = EthereumOutboundQueue; type SiblingOrigin = EnsureXcm; - type AgentIdOf = xcm_config::AgentIdOf; + type AgentIdOf = snowbridge_core::AgentIdOf; type TreasuryAccount = TreasuryAccount; type Token = Balances; type WeightInfo = weights::snowbridge_system::WeightInfo; diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs index ac5c4afd52d..fc97a3ed89a 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs @@ -47,10 +47,9 @@ use parachains_common::{ }; use polkadot_parachain_primitives::primitives::Sibling; use polkadot_runtime_common::xcm_sender::ExponentialPrice; -use snowbridge_core::DescribeHere; use snowbridge_rococo_common::EthereumNetwork; use snowbridge_runtime_common::XcmExportFeeToSibling; -use sp_core::{Get, H256}; +use sp_core::Get; use sp_runtime::traits::AccountIdConversion; use sp_std::marker::PhantomData; use xcm::latest::prelude::*; @@ -58,12 +57,11 @@ use xcm::latest::prelude::*; use xcm_builder::{ deposit_or_burn_fee, AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses, AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, - CurrencyAdapter, DenyReserveTransferToRelayChain, DenyThenTry, DescribeAllTerminal, - DescribeFamily, EnsureXcmOrigin, HandleFee, HashedDescription, IsConcrete, ParentAsSuperuser, - ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia, - SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, - TrailingSetTopicAsId, UsingComponents, WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, - XcmFeeToAccount, + CurrencyAdapter, DenyReserveTransferToRelayChain, DenyThenTry, EnsureXcmOrigin, HandleFee, + IsConcrete, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, + SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32, + SovereignSignedViaLocation, TakeWeightCredit, TrailingSetTopicAsId, UsingComponents, + WeightInfoBounds, WithComputedOrigin, WithUniqueTopic, XcmFeeToAccount, }; use xcm_executor::{ traits::{FeeManager, FeeReason, FeeReason::Export, TransactAsset, WithOriginFilter}, @@ -383,10 +381,6 @@ impl cumulus_pallet_xcm::Config for Runtime { type XcmExecutor = XcmExecutor; } -/// Creates an AgentId from a MultiLocation. An AgentId is a unique mapping to a Agent contract on -/// Ethereum which acts as the sovereign account for the MultiLocation. -pub type AgentIdOf = HashedDescription)>; - /// A `HandleFee` implementation that simply deposits the fees for `ExportMessage` XCM instructions /// into the accounts that are used for paying the relayer rewards. /// Burns the fees in case of a failure. diff --git a/cumulus/polkadot-parachain/Cargo.toml b/cumulus/polkadot-parachain/Cargo.toml index a9b48a7984b..464c333afe2 100644 --- a/cumulus/polkadot-parachain/Cargo.toml +++ b/cumulus/polkadot-parachain/Cargo.toml @@ -167,3 +167,6 @@ try-runtime = [ "shell-runtime/try-runtime", "sp-runtime/try-runtime", ] +fast-runtime = [ + "bridge-hub-rococo-runtime/fast-runtime", +] -- GitLab From 14f49002c3420ccb30cf433c93f5f1ddcdfdecf8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Jan 2024 15:46:44 +0000 Subject: [PATCH 134/191] Bump the known_good_semver group with 1 update (#2881) Bumps the known_good_semver group with 1 update: [clap](https://github.com/clap-rs/clap). Updates `clap` from 4.4.13 to 4.4.14
Release notes

Sourced from clap's releases.

v4.4.14

[4.4.14] - 2024-01-08

Documentation

  • Fix find cookbook entry to allow repeats of flags/options

Features

  • Allow num_args(0) on options which allows making them emulate being a flag for position-tracking flags
Changelog

Sourced from clap's changelog.

[4.4.14] - 2024-01-08

Documentation

  • Fix find cookbook entry to allow repeats of flags/options

Features

  • Allow num_args(0) on options which allows making them emulate being a flag for position-tracking flags
Commits
  • 514f28b chore: Release
  • 1440456 docs: Update changelog
  • d6479ff Merge pull request #5290 from epage/or
  • 02f8214 docs(cookbook): Clarify intent of fake flags
  • c603f34 Merge pull request #5275 from epage/ci
  • 641b42b chore(ci): Speed up critical path of CI
  • 3eaf1af fix(help): Correctly show help for fake flags
  • d63106b docs(cookbook): Allow repeated operators
  • 148e102 fix(builder): Allow custom flag definitions
  • d53d881 docs(cookbook): Demonstrate bad 'find' behavior
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=clap&package-manager=cargo&previous-version=4.4.13&new-version=4.4.14)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 66 +++++++++---------- cumulus/client/cli/Cargo.toml | 2 +- cumulus/parachain-template/node/Cargo.toml | 2 +- cumulus/polkadot-parachain/Cargo.toml | 2 +- cumulus/test/service/Cargo.toml | 2 +- polkadot/cli/Cargo.toml | 2 +- polkadot/node/malus/Cargo.toml | 2 +- polkadot/node/subsystem-bench/Cargo.toml | 2 +- .../test-parachains/adder/collator/Cargo.toml | 2 +- .../undying/collator/Cargo.toml | 2 +- polkadot/utils/generate-bags/Cargo.toml | 2 +- .../remote-ext-tests/bags-list/Cargo.toml | 2 +- substrate/bin/minimal/node/Cargo.toml | 2 +- substrate/bin/node-template/node/Cargo.toml | 2 +- substrate/bin/node/bench/Cargo.toml | 2 +- substrate/bin/node/cli/Cargo.toml | 4 +- substrate/bin/node/inspect/Cargo.toml | 2 +- .../bin/utils/chain-spec-builder/Cargo.toml | 2 +- substrate/bin/utils/subkey/Cargo.toml | 2 +- substrate/client/cli/Cargo.toml | 2 +- substrate/client/storage-monitor/Cargo.toml | 2 +- .../solution-type/fuzzer/Cargo.toml | 2 +- .../npos-elections/fuzzer/Cargo.toml | 2 +- .../ci/node-template-release/Cargo.toml | 2 +- .../utils/frame/benchmarking-cli/Cargo.toml | 2 +- .../frame/frame-utilities-cli/Cargo.toml | 2 +- .../generate-bags/node-runtime/Cargo.toml | 2 +- .../utils/frame/try-runtime/cli/Cargo.toml | 2 +- 28 files changed, 61 insertions(+), 61 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d4d3b2f6404..4a9f0c2d51f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2639,9 +2639,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.13" +version = "4.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52bdc885e4cacc7f7c9eedc1ef6da641603180c783c41a15c264944deeaab642" +checksum = "33e92c5c1a78c62968ec57dbc2440366a2d6e5a23faf829970ff1585dc6b18e2" dependencies = [ "clap_builder", "clap_derive 4.4.7", @@ -2658,9 +2658,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.12" +version = "4.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb7fb5e4e979aec3be7791562fcba452f94ad85e954da024396433e0e25a79e9" +checksum = "f4323769dc8a61e2c39ad7dc26f6f2800524691a44d74fe3d1071a5c24db6370" dependencies = [ "anstream", "anstyle", @@ -2675,7 +2675,7 @@ version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "586a385f7ef2f8b4d86bddaa0c094794e7ccbfe5ffef1f434fe928143fc783a5" dependencies = [ - "clap 4.4.13", + "clap 4.4.14", ] [[package]] @@ -3413,7 +3413,7 @@ dependencies = [ "anes", "cast", "ciborium", - "clap 4.4.13", + "clap 4.4.14", "criterion-plot", "futures", "is-terminal", @@ -3576,7 +3576,7 @@ dependencies = [ name = "cumulus-client-cli" version = "0.1.0" dependencies = [ - "clap 4.4.13", + "clap 4.4.14", "parity-scale-codec", "sc-chain-spec", "sc-cli", @@ -4315,7 +4315,7 @@ name = "cumulus-test-service" version = "0.1.0" dependencies = [ "async-trait", - "clap 4.4.13", + "clap 4.4.14", "criterion 0.5.1", "cumulus-client-cli", "cumulus-client-consensus-common", @@ -5499,7 +5499,7 @@ dependencies = [ "Inflector", "array-bytes 6.1.0", "chrono", - "clap 4.4.13", + "clap 4.4.14", "comfy-table", "frame-benchmarking", "frame-support", @@ -5591,7 +5591,7 @@ dependencies = [ name = "frame-election-solution-type-fuzzer" version = "2.0.0-alpha.5" dependencies = [ - "clap 4.4.13", + "clap 4.4.14", "frame-election-provider-solution-type", "frame-election-provider-support", "frame-support", @@ -8107,7 +8107,7 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" name = "minimal-node" version = "4.0.0-dev" dependencies = [ - "clap 4.4.13", + "clap 4.4.14", "frame", "futures", "futures-timer", @@ -8571,7 +8571,7 @@ name = "node-bench" version = "0.9.0-dev" dependencies = [ "array-bytes 6.1.0", - "clap 4.4.13", + "clap 4.4.14", "derive_more", "fs_extra", "futures", @@ -8648,7 +8648,7 @@ dependencies = [ name = "node-runtime-generate-bags" version = "3.0.0" dependencies = [ - "clap 4.4.13", + "clap 4.4.14", "generate-bags", "kitchensink-runtime", ] @@ -8657,7 +8657,7 @@ dependencies = [ name = "node-template" version = "4.0.0-dev" dependencies = [ - "clap 4.4.13", + "clap 4.4.14", "frame-benchmarking", "frame-benchmarking-cli", "frame-system", @@ -8701,7 +8701,7 @@ dependencies = [ name = "node-template-release" version = "3.0.0" dependencies = [ - "clap 4.4.13", + "clap 4.4.14", "flate2", "fs_extra", "glob", @@ -11243,7 +11243,7 @@ dependencies = [ name = "parachain-template-node" version = "0.1.0" dependencies = [ - "clap 4.4.13", + "clap 4.4.14", "color-print", "cumulus-client-cli", "cumulus-client-collator", @@ -12202,7 +12202,7 @@ name = "polkadot-cli" version = "1.1.0" dependencies = [ "cfg-if", - "clap 4.4.13", + "clap 4.4.14", "frame-benchmarking-cli", "futures", "log", @@ -13043,7 +13043,7 @@ dependencies = [ "async-trait", "bridge-hub-rococo-runtime", "bridge-hub-westend-runtime", - "clap 4.4.13", + "clap 4.4.14", "collectives-westend-runtime", "color-print", "contracts-rococo-runtime", @@ -13554,7 +13554,7 @@ version = "1.0.0" dependencies = [ "assert_matches", "async-trait", - "clap 4.4.13", + "clap 4.4.14", "clap-num", "color-eyre", "colored", @@ -13631,7 +13631,7 @@ version = "1.0.0" dependencies = [ "assert_matches", "async-trait", - "clap 4.4.13", + "clap 4.4.14", "color-eyre", "futures", "futures-timer", @@ -13778,7 +13778,7 @@ dependencies = [ name = "polkadot-voter-bags" version = "1.0.0" dependencies = [ - "clap 4.4.13", + "clap 4.4.14", "generate-bags", "sp-io", "westend-runtime", @@ -14648,7 +14648,7 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" name = "remote-ext-tests-bags-list" version = "1.0.0" dependencies = [ - "clap 4.4.13", + "clap 4.4.14", "frame-system", "log", "pallet-bags-list-remote-tests", @@ -15438,7 +15438,7 @@ dependencies = [ "array-bytes 6.1.0", "bip39", "chrono", - "clap 4.4.13", + "clap 4.4.14", "fdlimit", "futures", "futures-timer", @@ -16582,7 +16582,7 @@ dependencies = [ name = "sc-storage-monitor" version = "0.1.0" dependencies = [ - "clap 4.4.13", + "clap 4.4.14", "fs4", "log", "sc-client-db", @@ -18544,7 +18544,7 @@ dependencies = [ name = "sp-npos-elections-fuzzer" version = "2.0.0-alpha.5" dependencies = [ - "clap 4.4.13", + "clap 4.4.14", "honggfuzz", "rand 0.8.5", "sp-npos-elections", @@ -19065,7 +19065,7 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" name = "staging-chain-spec-builder" version = "2.0.0" dependencies = [ - "clap 4.4.13", + "clap 4.4.14", "log", "sc-chain-spec", "serde_json", @@ -19078,7 +19078,7 @@ version = "3.0.0-dev" dependencies = [ "array-bytes 6.1.0", "assert_cmd", - "clap 4.4.13", + "clap 4.4.14", "clap_complete", "criterion 0.4.0", "frame-benchmarking", @@ -19187,7 +19187,7 @@ dependencies = [ name = "staging-node-inspect" version = "0.9.0-dev" dependencies = [ - "clap 4.4.13", + "clap 4.4.14", "parity-scale-codec", "sc-cli", "sc-client-api", @@ -19392,7 +19392,7 @@ dependencies = [ name = "subkey" version = "3.0.0" dependencies = [ - "clap 4.4.13", + "clap 4.4.14", "sc-cli", ] @@ -19434,7 +19434,7 @@ dependencies = [ name = "substrate-frame-cli" version = "4.0.0-dev" dependencies = [ - "clap 4.4.13", + "clap 4.4.14", "frame-support", "frame-system", "sc-cli", @@ -19912,7 +19912,7 @@ dependencies = [ name = "test-parachain-adder-collator" version = "1.0.0" dependencies = [ - "clap 4.4.13", + "clap 4.4.14", "futures", "futures-timer", "log", @@ -19960,7 +19960,7 @@ dependencies = [ name = "test-parachain-undying-collator" version = "1.0.0" dependencies = [ - "clap 4.4.13", + "clap 4.4.14", "futures", "futures-timer", "log", @@ -20622,7 +20622,7 @@ version = "0.10.0-dev" dependencies = [ "assert_cmd", "async-trait", - "clap 4.4.13", + "clap 4.4.14", "frame-remote-externalities", "frame-try-runtime", "hex", diff --git a/cumulus/client/cli/Cargo.toml b/cumulus/client/cli/Cargo.toml index 1bf25f3963a..736cb02b94b 100644 --- a/cumulus/client/cli/Cargo.toml +++ b/cumulus/client/cli/Cargo.toml @@ -10,7 +10,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" workspace = true [dependencies] -clap = { version = "4.4.13", features = ["derive"] } +clap = { version = "4.4.14", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } url = "2.4.0" diff --git a/cumulus/parachain-template/node/Cargo.toml b/cumulus/parachain-template/node/Cargo.toml index 52c6ee7050d..7edb4b454c0 100644 --- a/cumulus/parachain-template/node/Cargo.toml +++ b/cumulus/parachain-template/node/Cargo.toml @@ -14,7 +14,7 @@ publish = false workspace = true [dependencies] -clap = { version = "4.4.13", features = ["derive"] } +clap = { version = "4.4.14", features = ["derive"] } log = "0.4.20" codec = { package = "parity-scale-codec", version = "3.0.0" } serde = { version = "1.0.195", features = ["derive"] } diff --git a/cumulus/polkadot-parachain/Cargo.toml b/cumulus/polkadot-parachain/Cargo.toml index 464c333afe2..50fc48b3f2f 100644 --- a/cumulus/polkadot-parachain/Cargo.toml +++ b/cumulus/polkadot-parachain/Cargo.toml @@ -16,7 +16,7 @@ path = "src/main.rs" [dependencies] async-trait = "0.1.74" -clap = { version = "4.4.13", features = ["derive"] } +clap = { version = "4.4.14", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } futures = "0.3.28" hex-literal = "0.4.1" diff --git a/cumulus/test/service/Cargo.toml b/cumulus/test/service/Cargo.toml index b5294ec038a..f4dde7d2945 100644 --- a/cumulus/test/service/Cargo.toml +++ b/cumulus/test/service/Cargo.toml @@ -14,7 +14,7 @@ path = "src/main.rs" [dependencies] async-trait = "0.1.74" -clap = { version = "4.4.13", features = ["derive"] } +clap = { version = "4.4.14", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } criterion = { version = "0.5.1", features = ["async_tokio"] } jsonrpsee = { version = "0.16.2", features = ["server"] } diff --git a/polkadot/cli/Cargo.toml b/polkadot/cli/Cargo.toml index 0b47da4d45c..1b331c5ed42 100644 --- a/polkadot/cli/Cargo.toml +++ b/polkadot/cli/Cargo.toml @@ -19,7 +19,7 @@ crate-type = ["cdylib", "rlib"] [dependencies] cfg-if = "1.0" -clap = { version = "4.4.13", features = ["derive"], optional = true } +clap = { version = "4.4.14", features = ["derive"], optional = true } log = "0.4.17" thiserror = "1.0.48" futures = "0.3.21" diff --git a/polkadot/node/malus/Cargo.toml b/polkadot/node/malus/Cargo.toml index f555cbd5dac..56d377648bb 100644 --- a/polkadot/node/malus/Cargo.toml +++ b/polkadot/node/malus/Cargo.toml @@ -43,7 +43,7 @@ assert_matches = "1.5" async-trait = "0.1.74" sp-keystore = { path = "../../../substrate/primitives/keystore" } sp-core = { path = "../../../substrate/primitives/core" } -clap = { version = "4.4.13", features = ["derive"] } +clap = { version = "4.4.14", features = ["derive"] } futures = "0.3.21" futures-timer = "3.0.2" gum = { package = "tracing-gum", path = "../gum" } diff --git a/polkadot/node/subsystem-bench/Cargo.toml b/polkadot/node/subsystem-bench/Cargo.toml index 73405a3bc3b..dc1179b7762 100644 --- a/polkadot/node/subsystem-bench/Cargo.toml +++ b/polkadot/node/subsystem-bench/Cargo.toml @@ -31,7 +31,7 @@ async-trait = "0.1.74" sp-keystore = { path = "../../../substrate/primitives/keystore" } sc-keystore = { path = "../../../substrate/client/keystore" } sp-core = { path = "../../../substrate/primitives/core" } -clap = { version = "4.4.13", features = ["derive"] } +clap = { version = "4.4.14", features = ["derive"] } futures = "0.3.21" futures-timer = "3.0.2" gum = { package = "tracing-gum", path = "../gum" } diff --git a/polkadot/parachain/test-parachains/adder/collator/Cargo.toml b/polkadot/parachain/test-parachains/adder/collator/Cargo.toml index a6517608b26..c2cea979b97 100644 --- a/polkadot/parachain/test-parachains/adder/collator/Cargo.toml +++ b/polkadot/parachain/test-parachains/adder/collator/Cargo.toml @@ -16,7 +16,7 @@ path = "src/main.rs" [dependencies] parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive"] } -clap = { version = "4.4.13", features = ["derive"] } +clap = { version = "4.4.14", features = ["derive"] } futures = "0.3.21" futures-timer = "3.0.2" log = "0.4.17" diff --git a/polkadot/parachain/test-parachains/undying/collator/Cargo.toml b/polkadot/parachain/test-parachains/undying/collator/Cargo.toml index d34a855ab9d..4d7c7391d82 100644 --- a/polkadot/parachain/test-parachains/undying/collator/Cargo.toml +++ b/polkadot/parachain/test-parachains/undying/collator/Cargo.toml @@ -16,7 +16,7 @@ path = "src/main.rs" [dependencies] parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive"] } -clap = { version = "4.4.13", features = ["derive"] } +clap = { version = "4.4.14", features = ["derive"] } futures = "0.3.21" futures-timer = "3.0.2" log = "0.4.17" diff --git a/polkadot/utils/generate-bags/Cargo.toml b/polkadot/utils/generate-bags/Cargo.toml index 8ec828ba072..5435baa6151 100644 --- a/polkadot/utils/generate-bags/Cargo.toml +++ b/polkadot/utils/generate-bags/Cargo.toml @@ -10,7 +10,7 @@ description = "CLI to generate voter bags for Polkadot runtimes" workspace = true [dependencies] -clap = { version = "4.4.13", features = ["derive"] } +clap = { version = "4.4.14", features = ["derive"] } generate-bags = { path = "../../../substrate/utils/frame/generate-bags" } sp-io = { path = "../../../substrate/primitives/io" } diff --git a/polkadot/utils/remote-ext-tests/bags-list/Cargo.toml b/polkadot/utils/remote-ext-tests/bags-list/Cargo.toml index 8ee277e64b5..aeb62e87941 100644 --- a/polkadot/utils/remote-ext-tests/bags-list/Cargo.toml +++ b/polkadot/utils/remote-ext-tests/bags-list/Cargo.toml @@ -18,6 +18,6 @@ sp-tracing = { path = "../../../../substrate/primitives/tracing" } frame-system = { path = "../../../../substrate/frame/system" } sp-core = { path = "../../../../substrate/primitives/core" } -clap = { version = "4.4.13", features = ["derive"] } +clap = { version = "4.4.14", features = ["derive"] } log = "0.4.17" tokio = { version = "1.24.2", features = ["macros"] } diff --git a/substrate/bin/minimal/node/Cargo.toml b/substrate/bin/minimal/node/Cargo.toml index 42eced506c4..07138eb0c55 100644 --- a/substrate/bin/minimal/node/Cargo.toml +++ b/substrate/bin/minimal/node/Cargo.toml @@ -20,7 +20,7 @@ targets = ["x86_64-unknown-linux-gnu"] name = "minimal-node" [dependencies] -clap = { version = "4.4.13", features = ["derive"] } +clap = { version = "4.4.14", features = ["derive"] } futures = { version = "0.3.21", features = ["thread-pool"] } futures-timer = "3.0.1" jsonrpsee = { version = "0.16.2", features = ["server"] } diff --git a/substrate/bin/node-template/node/Cargo.toml b/substrate/bin/node-template/node/Cargo.toml index 6a600364c4d..aac24a83096 100644 --- a/substrate/bin/node-template/node/Cargo.toml +++ b/substrate/bin/node-template/node/Cargo.toml @@ -20,7 +20,7 @@ targets = ["x86_64-unknown-linux-gnu"] name = "node-template" [dependencies] -clap = { version = "4.4.13", features = ["derive"] } +clap = { version = "4.4.14", features = ["derive"] } futures = { version = "0.3.21", features = ["thread-pool"] } serde_json = "1.0.111" diff --git a/substrate/bin/node/bench/Cargo.toml b/substrate/bin/node/bench/Cargo.toml index e90b7070396..e2b68b2a0e8 100644 --- a/substrate/bin/node/bench/Cargo.toml +++ b/substrate/bin/node/bench/Cargo.toml @@ -16,7 +16,7 @@ workspace = true [dependencies] array-bytes = "6.1" -clap = { version = "4.4.13", features = ["derive"] } +clap = { version = "4.4.14", features = ["derive"] } log = "0.4.17" node-primitives = { path = "../primitives" } node-testing = { path = "../testing" } diff --git a/substrate/bin/node/cli/Cargo.toml b/substrate/bin/node/cli/Cargo.toml index 3a80dc4e0cc..4bf5efd7cd1 100644 --- a/substrate/bin/node/cli/Cargo.toml +++ b/substrate/bin/node/cli/Cargo.toml @@ -41,7 +41,7 @@ crate-type = ["cdylib", "rlib"] [dependencies] # third-party dependencies array-bytes = "6.1" -clap = { version = "4.4.13", features = ["derive"], optional = true } +clap = { version = "4.4.14", features = ["derive"], optional = true } codec = { package = "parity-scale-codec", version = "3.6.1" } serde = { version = "1.0.195", features = ["derive"] } jsonrpsee = { version = "0.16.2", features = ["server"] } @@ -164,7 +164,7 @@ sp-trie = { path = "../../../primitives/trie" } sp-state-machine = { path = "../../../primitives/state-machine" } [build-dependencies] -clap = { version = "4.4.13", optional = true } +clap = { version = "4.4.14", optional = true } clap_complete = { version = "4.0.2", optional = true } node-inspect = { package = "staging-node-inspect", path = "../inspect", optional = true } frame-benchmarking-cli = { path = "../../../utils/frame/benchmarking-cli", optional = true } diff --git a/substrate/bin/node/inspect/Cargo.toml b/substrate/bin/node/inspect/Cargo.toml index d14cc8ff760..29c0917440e 100644 --- a/substrate/bin/node/inspect/Cargo.toml +++ b/substrate/bin/node/inspect/Cargo.toml @@ -15,7 +15,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -clap = { version = "4.4.13", features = ["derive"] } +clap = { version = "4.4.14", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.6.1" } thiserror = "1.0" sc-cli = { path = "../../../client/cli" } diff --git a/substrate/bin/utils/chain-spec-builder/Cargo.toml b/substrate/bin/utils/chain-spec-builder/Cargo.toml index 3848ef91588..e9dc4d83b6b 100644 --- a/substrate/bin/utils/chain-spec-builder/Cargo.toml +++ b/substrate/bin/utils/chain-spec-builder/Cargo.toml @@ -23,7 +23,7 @@ name = "chain-spec-builder" crate-type = ["rlib"] [dependencies] -clap = { version = "4.4.13", features = ["derive"] } +clap = { version = "4.4.14", features = ["derive"] } log = "0.4.17" sc-chain-spec = { path = "../../../client/chain-spec" } serde_json = "1.0.111" diff --git a/substrate/bin/utils/subkey/Cargo.toml b/substrate/bin/utils/subkey/Cargo.toml index d4ecfda3735..822068f6614 100644 --- a/substrate/bin/utils/subkey/Cargo.toml +++ b/substrate/bin/utils/subkey/Cargo.toml @@ -20,5 +20,5 @@ path = "src/main.rs" name = "subkey" [dependencies] -clap = { version = "4.4.13", features = ["derive"] } +clap = { version = "4.4.14", features = ["derive"] } sc-cli = { path = "../../../client/cli" } diff --git a/substrate/client/cli/Cargo.toml b/substrate/client/cli/Cargo.toml index 526db17fa32..caaa96b904c 100644 --- a/substrate/client/cli/Cargo.toml +++ b/substrate/client/cli/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] array-bytes = "6.1" chrono = "0.4.31" -clap = { version = "4.4.13", features = ["derive", "string", "wrap_help"] } +clap = { version = "4.4.14", features = ["derive", "string", "wrap_help"] } fdlimit = "0.3.0" futures = "0.3.21" itertools = "0.10.3" diff --git a/substrate/client/storage-monitor/Cargo.toml b/substrate/client/storage-monitor/Cargo.toml index 37259b9234a..2b46ccbcdc1 100644 --- a/substrate/client/storage-monitor/Cargo.toml +++ b/substrate/client/storage-monitor/Cargo.toml @@ -12,7 +12,7 @@ homepage = "https://substrate.io" workspace = true [dependencies] -clap = { version = "4.4.13", features = ["derive", "string"] } +clap = { version = "4.4.14", features = ["derive", "string"] } log = "0.4.17" fs4 = "0.7.0" sc-client-db = { path = "../db", default-features = false } diff --git a/substrate/frame/election-provider-support/solution-type/fuzzer/Cargo.toml b/substrate/frame/election-provider-support/solution-type/fuzzer/Cargo.toml index e21b9536727..d64498de087 100644 --- a/substrate/frame/election-provider-support/solution-type/fuzzer/Cargo.toml +++ b/substrate/frame/election-provider-support/solution-type/fuzzer/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -clap = { version = "4.4.13", features = ["derive"] } +clap = { version = "4.4.14", features = ["derive"] } honggfuzz = "0.5" rand = { version = "0.8", features = ["small_rng", "std"] } diff --git a/substrate/primitives/npos-elections/fuzzer/Cargo.toml b/substrate/primitives/npos-elections/fuzzer/Cargo.toml index 29dfa809fbe..e7cfb75e54b 100644 --- a/substrate/primitives/npos-elections/fuzzer/Cargo.toml +++ b/substrate/primitives/npos-elections/fuzzer/Cargo.toml @@ -17,7 +17,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -clap = { version = "4.4.13", features = ["derive"] } +clap = { version = "4.4.14", features = ["derive"] } honggfuzz = "0.5" rand = { version = "0.8", features = ["small_rng", "std"] } sp-npos-elections = { path = ".." } diff --git a/substrate/scripts/ci/node-template-release/Cargo.toml b/substrate/scripts/ci/node-template-release/Cargo.toml index 32210de73e6..b02f941811c 100644 --- a/substrate/scripts/ci/node-template-release/Cargo.toml +++ b/substrate/scripts/ci/node-template-release/Cargo.toml @@ -14,7 +14,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -clap = { version = "4.4.13", features = ["derive"] } +clap = { version = "4.4.14", features = ["derive"] } flate2 = "1.0" fs_extra = "1.3" glob = "0.3" diff --git a/substrate/utils/frame/benchmarking-cli/Cargo.toml b/substrate/utils/frame/benchmarking-cli/Cargo.toml index 02cb6ebc303..21c5701b518 100644 --- a/substrate/utils/frame/benchmarking-cli/Cargo.toml +++ b/substrate/utils/frame/benchmarking-cli/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] array-bytes = "6.1" chrono = "0.4" -clap = { version = "4.4.13", features = ["derive"] } +clap = { version = "4.4.14", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.6.1" } comfy-table = { version = "7.0.1", default-features = false } handlebars = "4.2.2" diff --git a/substrate/utils/frame/frame-utilities-cli/Cargo.toml b/substrate/utils/frame/frame-utilities-cli/Cargo.toml index 96c43aee070..886e17280b1 100644 --- a/substrate/utils/frame/frame-utilities-cli/Cargo.toml +++ b/substrate/utils/frame/frame-utilities-cli/Cargo.toml @@ -14,7 +14,7 @@ readme = "README.md" workspace = true [dependencies] -clap = { version = "4.4.13", features = ["derive"] } +clap = { version = "4.4.14", features = ["derive"] } frame-support = { path = "../../../frame/support" } frame-system = { path = "../../../frame/system" } sc-cli = { path = "../../../client/cli" } diff --git a/substrate/utils/frame/generate-bags/node-runtime/Cargo.toml b/substrate/utils/frame/generate-bags/node-runtime/Cargo.toml index 07e74a59a6b..d2aaaff9a69 100644 --- a/substrate/utils/frame/generate-bags/node-runtime/Cargo.toml +++ b/substrate/utils/frame/generate-bags/node-runtime/Cargo.toml @@ -17,4 +17,4 @@ kitchensink-runtime = { path = "../../../../bin/node/runtime" } generate-bags = { path = ".." } # third-party -clap = { version = "4.4.13", features = ["derive"] } +clap = { version = "4.4.14", features = ["derive"] } diff --git a/substrate/utils/frame/try-runtime/cli/Cargo.toml b/substrate/utils/frame/try-runtime/cli/Cargo.toml index 4f09a34fae7..b5bce36e3b7 100644 --- a/substrate/utils/frame/try-runtime/cli/Cargo.toml +++ b/substrate/utils/frame/try-runtime/cli/Cargo.toml @@ -38,7 +38,7 @@ frame-try-runtime = { path = "../../../../frame/try-runtime", optional = true } substrate-rpc-client = { path = "../../rpc/client" } async-trait = "0.1.74" -clap = { version = "4.4.13", features = ["derive"] } +clap = { version = "4.4.14", features = ["derive"] } hex = { version = "0.4.3", default-features = false } log = "0.4.17" parity-scale-codec = "3.6.1" -- GitLab From 9d80735a7cccb7c52280ea057177d92e17203c51 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Jan 2024 15:47:01 +0000 Subject: [PATCH 135/191] Bump aquamarine from 0.3.2 to 0.4.0 (#2882) Bumps [aquamarine](https://github.com/mersinvald/aquamarine) from 0.3.2 to 0.4.0.
Release notes

Sourced from aquamarine's releases.

0.4.0

Breaking Changes

  • path attribute is no longer supported for importing diagrams from external files

Features

  • include_mmd! macro-like syntax for embedding diagrams from files
  • multiple diagrams can now be imported from filesystem per documented entity
  • imported diagrams can now be placed freely at any place inside the doc comment

Miscellaneous

Full Changelog: https://github.com/mersinvald/aquamarine/compare/v0.3.2...v0.4.0

Changelog

Sourced from aquamarine's changelog.

v0.4.0 (2023-12-13)

Breaking Changes

  • path attribute is no longer supported for importing diagrams from external files

Features

  • include_mmd! macro-like syntax for embedding diagrams from files
  • multiple diagrams can now be imported from filesystem per documented entity
  • imported diagrams can now be placed freely at any place inside the doc comment

Miscellaneous

v0.3.1 (2023-04-17)

Features

  • mermaid is updated to v10 (PR #46 by frehberg)
  • better handling of a failure to load mermaidjs (PR #46 by frehberg)

Miscellaneous

  • add Frehberg as a maintainer on GitHub, and package owner on Crates.io

v0.3.0 (2023-02-16)

Maintenance

  • update dependencies

v0.2.2 (2023-02-02)

Bug Fixes

v0.2.1 (2023-02-01)

Maintenance

  • MermaidJS updated to version 9.3.0

... (truncated)

Commits
  • 480897b chore: version 0.4.0
  • f78120d feat: multiple fs imports, free placement of imported diagrams
  • 4cd047c chore: less strict syn2 semver
  • 1a092e5 Merge pull request #42 from maurer/syn-2-update
  • 525a00a chore: fix demo crate dependencies
  • 50a0b23 chore: fix demo crate links
  • e3211bb hotfix: malformed string literals in mermaid.js diagrams of a demo crate
  • c135a84 Update to syn-2
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=aquamarine&package-manager=cargo&previous-version=0.3.2&new-version=0.4.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 6 +++--- substrate/frame/bags-list/Cargo.toml | 2 +- substrate/frame/support/Cargo.toml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4a9f0c2d51f..f5d57bb50be 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -333,16 +333,16 @@ dependencies = [ [[package]] name = "aquamarine" -version = "0.3.2" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df752953c49ce90719c7bf1fc587bc8227aed04732ea0c0f85e5397d7fdbd1a1" +checksum = "074b80d14d0240b6ce94d68f059a2d26a5d77280ae142662365a21ef6e2594ef" dependencies = [ "include_dir", "itertools 0.10.5", "proc-macro-error", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.48", ] [[package]] diff --git a/substrate/frame/bags-list/Cargo.toml b/substrate/frame/bags-list/Cargo.toml index 198af21be81..7fab47a20e1 100644 --- a/substrate/frame/bags-list/Cargo.toml +++ b/substrate/frame/bags-list/Cargo.toml @@ -35,7 +35,7 @@ frame-election-provider-support = { path = "../election-provider-support", defau # third party log = { version = "0.4.17", default-features = false } docify = "0.2.6" -aquamarine = { version = "0.3.2" } +aquamarine = { version = "0.4.0" } # Optional imports for benchmarking frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } diff --git a/substrate/frame/support/Cargo.toml b/substrate/frame/support/Cargo.toml index 5c0c4091468..32dcec727cc 100644 --- a/substrate/frame/support/Cargo.toml +++ b/substrate/frame/support/Cargo.toml @@ -50,7 +50,7 @@ serde_json = { version = "1.0.111", default-features = false, features = ["alloc docify = "0.2.6" static_assertions = "1.1.0" -aquamarine = { version = "0.3.2" } +aquamarine = { version = "0.4.0" } [dev-dependencies] assert_matches = "1.3.0" -- GitLab From 49cea35d0a13c145091e8b4df4efeb2f7b92f812 Mon Sep 17 00:00:00 2001 From: Oliver Tale-Yazdi Date: Tue, 9 Jan 2024 18:44:50 +0100 Subject: [PATCH 136/191] Remove bounds from `PrevalidateAttests` struct definition (#2886) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Removing some bounds as it came up in https://github.com/paritytech/polkadot-sdk/pull/2726 while still keeping `Send + Sync` capabilities. --------- Signed-off-by: Oliver Tale-Yazdi Co-authored-by: Bastian Köcher --- polkadot/runtime/common/src/claims.rs | 10 ++++------ prdoc/pr_2886.prdoc | 13 +++++++++++++ 2 files changed, 17 insertions(+), 6 deletions(-) create mode 100644 prdoc/pr_2886.prdoc diff --git a/polkadot/runtime/common/src/claims.rs b/polkadot/runtime/common/src/claims.rs index d15e04a660f..4cddab969c0 100644 --- a/polkadot/runtime/common/src/claims.rs +++ b/polkadot/runtime/common/src/claims.rs @@ -591,11 +591,9 @@ impl Pallet { /// otherwise free to place on chain. #[derive(Encode, Decode, Clone, Eq, PartialEq, TypeInfo)] #[scale_info(skip_type_params(T))] -pub struct PrevalidateAttests(sp_std::marker::PhantomData) -where - ::RuntimeCall: IsSubType>; +pub struct PrevalidateAttests(core::marker::PhantomData); -impl Debug for PrevalidateAttests +impl Debug for PrevalidateAttests where ::RuntimeCall: IsSubType>, { @@ -610,7 +608,7 @@ where } } -impl PrevalidateAttests +impl PrevalidateAttests where ::RuntimeCall: IsSubType>, { @@ -620,7 +618,7 @@ where } } -impl SignedExtension for PrevalidateAttests +impl SignedExtension for PrevalidateAttests where ::RuntimeCall: IsSubType>, { diff --git a/prdoc/pr_2886.prdoc b/prdoc/pr_2886.prdoc new file mode 100644 index 00000000000..9fd97c11e11 --- /dev/null +++ b/prdoc/pr_2886.prdoc @@ -0,0 +1,13 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Remove bounds from `PrevalidateAttests` struct definition + +doc: + - audience: Runtime Dev + description: | + Minimal change to `PrevalidateAssets` to remove some trait bounds on the struct itself while + keeping all its capabilities. + +crates: + - name: polkadot-runtime-common -- GitLab From ce4e5496de35064c4cf4fb59c279d3834fc556cb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jan 2024 00:12:35 +0000 Subject: [PATCH 137/191] Bump lycheeverse/lychee-action (#2875) Bumps [lycheeverse/lychee-action](https://github.com/lycheeverse/lychee-action) from 2ac9f030ccdea0033e2510a23a67da2a2da98492 to fdea7032675810093199f485fe075f057cc37b3e.
Commits

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--------- Signed-off-by: dependabot[bot] Signed-off-by: Oliver Tale-Yazdi Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Oliver Tale-Yazdi Co-authored-by: PG Herveou --- .config/lychee.toml | 4 ++-- .github/workflows/check-links.yml | 2 +- .../tests/people/people-rococo/src/tests/reap_identity.rs | 4 ++-- .../tests/people/people-westend/src/tests/reap_identity.rs | 4 ++-- docs/sdk/src/meta_contributing.rs | 2 +- docs/sdk/src/reference_docs/frame_benchmarking_weight.rs | 2 +- polkadot/node/core/pvf/common/src/worker/mod.rs | 2 +- substrate/client/rpc-api/src/state/mod.rs | 4 ++-- substrate/frame/staking/src/migrations.rs | 2 +- substrate/frame/state-trie-migration/src/lib.rs | 2 +- 10 files changed, 14 insertions(+), 14 deletions(-) diff --git a/.config/lychee.toml b/.config/lychee.toml index 72c1e66a4df..70869465d67 100644 --- a/.config/lychee.toml +++ b/.config/lychee.toml @@ -12,10 +12,10 @@ exclude_all_private = true # Treat these codes as success condition: accept = [ # Ok - 200, + "200", # Rate limited - GitHub likes to throw this. - 429, + "429", ] exclude_path = ["./target"] diff --git a/.github/workflows/check-links.yml b/.github/workflows/check-links.yml index 0932d38c9ad..14941efce24 100644 --- a/.github/workflows/check-links.yml +++ b/.github/workflows/check-links.yml @@ -28,7 +28,7 @@ jobs: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.0 (22. Sep 2023) - name: Lychee link checker - uses: lycheeverse/lychee-action@2ac9f030ccdea0033e2510a23a67da2a2da98492 # for v1.8.0 (15. May 2023) + uses: lycheeverse/lychee-action@fdea7032675810093199f485fe075f057cc37b3e # for v1.9.0 (5. Jan 2024) with: args: >- --config .config/lychee.toml diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/reap_identity.rs b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/reap_identity.rs index 81bd7620e46..2902f359dfb 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/reap_identity.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/reap_identity.rs @@ -95,7 +95,7 @@ impl Identity { relay: IdentityInfo { display: make_data(b"xcm-test", full), legal: make_data(b"The Xcm Test, Esq.", full), - web: make_data(b"https://xcm-test.io", full), + web: make_data(b"https://visitme/", full), riot: make_data(b"xcm-riot", full), email: make_data(b"xcm-test@gmail.com", full), pgp_fingerprint: Some(pgp_fingerprint), @@ -106,7 +106,7 @@ impl Identity { para: IdentityInfoParachain { display: make_data(b"xcm-test", full), legal: make_data(b"The Xcm Test, Esq.", full), - web: make_data(b"https://xcm-test.io", full), + web: make_data(b"https://visitme/", full), matrix: make_data(b"xcm-matrix@server", full), email: make_data(b"xcm-test@gmail.com", full), pgp_fingerprint: Some(pgp_fingerprint), diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/reap_identity.rs b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/reap_identity.rs index 6de2562b278..31c3444f1a3 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/reap_identity.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-westend/src/tests/reap_identity.rs @@ -95,7 +95,7 @@ impl Identity { relay: IdentityInfo { display: make_data(b"xcm-test", full), legal: make_data(b"The Xcm Test, Esq.", full), - web: make_data(b"https://xcm-test.io", full), + web: make_data(b"https://visitme/", full), riot: make_data(b"xcm-riot", full), email: make_data(b"xcm-test@gmail.com", full), pgp_fingerprint: Some(pgp_fingerprint), @@ -106,7 +106,7 @@ impl Identity { para: IdentityInfoParachain { display: make_data(b"xcm-test", full), legal: make_data(b"The Xcm Test, Esq.", full), - web: make_data(b"https://xcm-test.io", full), + web: make_data(b"https://visitme/", full), matrix: make_data(b"xcm-matrix@server", full), email: make_data(b"xcm-test@gmail.com", full), pgp_fingerprint: Some(pgp_fingerprint), diff --git a/docs/sdk/src/meta_contributing.rs b/docs/sdk/src/meta_contributing.rs index 0d3ecea4655..b4f9d504c6c 100644 --- a/docs/sdk/src/meta_contributing.rs +++ b/docs/sdk/src/meta_contributing.rs @@ -70,7 +70,7 @@ //! > that they already pose, rather than repeating yourself**. //! //! For more details about documenting guidelines, see: -//! +//! //! //! #### Example: Explaining `#[pallet::call]` //! diff --git a/docs/sdk/src/reference_docs/frame_benchmarking_weight.rs b/docs/sdk/src/reference_docs/frame_benchmarking_weight.rs index 7ebad37ecad..db77547a4bf 100644 --- a/docs/sdk/src/reference_docs/frame_benchmarking_weight.rs +++ b/docs/sdk/src/reference_docs/frame_benchmarking_weight.rs @@ -20,4 +20,4 @@ //! - how to write benchmarks, how you must think of worst case. //! - how to run benchmarks. //! -//! - +//! - diff --git a/polkadot/node/core/pvf/common/src/worker/mod.rs b/polkadot/node/core/pvf/common/src/worker/mod.rs index 5e7deb5ca78..9dcd535d533 100644 --- a/polkadot/node/core/pvf/common/src/worker/mod.rs +++ b/polkadot/node/core/pvf/common/src/worker/mod.rs @@ -319,7 +319,7 @@ pub fn run_worker( } // TODO: We can enable the seccomp networking blacklist on aarch64 as well, but we need a CI - // job to catch regressions. See . + // job to catch regressions. See issue ci_cd/issues/609. #[cfg(all(target_os = "linux", target_arch = "x86_64"))] if security_status.can_enable_seccomp { if let Err(err) = security::seccomp::enable_for_worker(&worker_info) { diff --git a/substrate/client/rpc-api/src/state/mod.rs b/substrate/client/rpc-api/src/state/mod.rs index dbc2a505456..4acc64def2b 100644 --- a/substrate/client/rpc-api/src/state/mod.rs +++ b/substrate/client/rpc-api/src/state/mod.rs @@ -270,8 +270,8 @@ pub trait StateApi { /// [querying substrate storage via rpc][3]. /// /// [1]: https://docs.substrate.io/main-docs/fundamentals/state-transitions-and-storage/ - /// [2]: https://www.shawntabrizi.com/substrate/transparent-keys-in-substrate/ - /// [3]: https://www.shawntabrizi.com/substrate/querying-substrate-storage-via-rpc/ + /// [2]: https://www.shawntabrizi.com/blog/substrate/transparent-keys-in-substrate/ + /// [3]: https://www.shawntabrizi.com/blog/substrate/querying-substrate-storage-via-rpc/ /// /// ### Maximum payload size /// diff --git a/substrate/frame/staking/src/migrations.rs b/substrate/frame/staking/src/migrations.rs index 311e9667ceb..92af4fdba5f 100644 --- a/substrate/frame/staking/src/migrations.rs +++ b/substrate/frame/staking/src/migrations.rs @@ -15,7 +15,7 @@ // See the License for the specific language governing permissions and //! Storage migrations for the Staking pallet. The changelog for this is maintained at -//! [CHANGELOG.md](https://github.com/paritytech/substrate/blob/master/frame/staking/CHANGELOG.md). +//! [CHANGELOG.md](https://github.com/paritytech/polkadot-sdk/blob/master/substrate/frame/staking/CHANGELOG.md). use super::*; use frame_election_provider_support::SortedListProvider; diff --git a/substrate/frame/state-trie-migration/src/lib.rs b/substrate/frame/state-trie-migration/src/lib.rs index 8652e8e9561..ea28d712605 100644 --- a/substrate/frame/state-trie-migration/src/lib.rs +++ b/substrate/frame/state-trie-migration/src/lib.rs @@ -476,7 +476,7 @@ pub mod pallet { /// - [`frame_support::storage::StorageDoubleMap`]: 96 byte /// /// For more info see - /// + /// #[pallet::constant] type MaxKeyLen: Get; -- GitLab From 01ea45c3a1abb4d696b77fbecc440f7905a8e9b1 Mon Sep 17 00:00:00 2001 From: Nuke Date: Tue, 9 Jan 2024 18:18:59 -0700 Subject: [PATCH 138/191] Fix deps for local docs build for Rust `1.75.0` (#2896) - Fix docs deps build issue (https://github.com/servo/rust-smallvec/issues/327) (Please forgive me and LMK if there are processes I need to follow for the bump a dep here I am not aware of). - Fix links for `meta_contributing` docs, internal and external. - `cargo +nightly fmt` for `/docs/...` files --- Cargo.lock | 4 ++-- docs/mermaid/polkadot_sdk_parachain.mmd | 2 +- docs/sdk/src/guides/your_first_pallet/mod.rs | 2 +- docs/sdk/src/meta_contributing.rs | 23 ++++++++++---------- 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f5d57bb50be..c3e5e2ff41b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17418,9 +17418,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.0" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" +checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" [[package]] name = "smol" diff --git a/docs/mermaid/polkadot_sdk_parachain.mmd b/docs/mermaid/polkadot_sdk_parachain.mmd index 3f38fce046c..4cee54ba3f4 100644 --- a/docs/mermaid/polkadot_sdk_parachain.mmd +++ b/docs/mermaid/polkadot_sdk_parachain.mmd @@ -5,7 +5,7 @@ flowchart LR end FRAME -.-> ParachainRuntime - Substrate[Substrate Node Libraries] -.-> ParachainNoe + Substrate[Substrate Node Libraries] -.-> ParachainNode CumulusC[Cumulus Node Libraries] -.-> ParachainNode CumulusR[Cumulus Runtime Libraries] -.-> ParachainRuntime diff --git a/docs/sdk/src/guides/your_first_pallet/mod.rs b/docs/sdk/src/guides/your_first_pallet/mod.rs index c886bc9af84..24eada44a83 100644 --- a/docs/sdk/src/guides/your_first_pallet/mod.rs +++ b/docs/sdk/src/guides/your_first_pallet/mod.rs @@ -365,7 +365,7 @@ pub mod pallet { // ensure sender has enough balance, and if so, calculate what is left after `amount`. let sender_balance = Balances::::get(&sender).ok_or("NonExistentAccount")?; if sender_balance < amount { - return Err("InsufficientBalance".into()) + return Err("InsufficientBalance".into()); } let reminder = sender_balance - amount; diff --git a/docs/sdk/src/meta_contributing.rs b/docs/sdk/src/meta_contributing.rs index b4f9d504c6c..bff475f8e6b 100644 --- a/docs/sdk/src/meta_contributing.rs +++ b/docs/sdk/src/meta_contributing.rs @@ -54,8 +54,8 @@ //! > high level tutorial. They should be explained in the rust-doc of the corresponding type or //! > macro. //! -//! 2. 🧘 Less is More: For reasons mentioned [above](#crate::why-rust-docs), the more concise this -//! crate is, the better. +//! 2. 🧘 Less is More: For reasons mentioned [above](#why-rust-docs), the more concise this crate +//! is, the better. //! 3. √ Don’t Repeat Yourself – DRY: A summary of the above two points. Authors should always //! strive to avoid any duplicate information. Every concept should ideally be documented in //! *ONE* place and one place only. This makes the task of maintaining topics significantly @@ -69,8 +69,7 @@ //! > what topics are already covered in this crate, and how you can build on top of the information //! > that they already pose, rather than repeating yourself**. //! -//! For more details about documenting guidelines, see: -//! +//! For more details see the [latest documenting guidelines](https://github.com/paritytech/polkadot-sdk/blob/master/docs/contributor/DOCUMENTATION_GUIDELINES.md). //! //! #### Example: Explaining `#[pallet::call]` //! @@ -133,14 +132,16 @@ //! compromise, but in the long term, we should work towards finding a way to maintain different //! revisions of this crate. //! -//! ## How to Build +//! ## How to Develop Locally //! -//! To build this crate properly, with with right HTML headers injected, run: +//! To view the docs specific [`crate`] locally for development, including the correct HTML headers +//! injected, run: //! -//! ```no_compile -//! RUSTDOCFLAGS="--html-in-header $(pwd)/docs/sdk/headers/toc.html" cargo doc -p polkadot-sdk-docs +//! ```sh +//! SKIP_WASM_BUILD=1 RUSTDOCFLAGS="--html-in-header $(pwd)/docs/sdk/headers/toc.html" cargo doc -p polkadot-sdk-docs --no-deps --open //! ``` //! -//! adding `--no-deps` would speed up the process while development. If even faster build time for -//! docs is needed, you can temporarily remove most of the substrate/cumulus dependencies that are -//! only used for linking purposes. +//! If even faster build time for docs is needed, you can temporarily remove most of the +//! substrate/cumulus dependencies that are only used for linking purposes. +//! +//! For more on local development, see [`crate::reference_docs::development_environment_advice`]. -- GitLab From a4195326b93bf2c0f4dd8f562a218e0963983d68 Mon Sep 17 00:00:00 2001 From: ordian Date: Wed, 10 Jan 2024 10:32:52 +0100 Subject: [PATCH 139/191] statement-distribution: validator disabling (#1841) Closes #1591. The purpose of this PR is filter out backing statements from the network signed by disabled validators. This is just an optimization, since we will do filtering in the runtime in #1863 to avoid nodes to filter garbage out at block production time. - [x] Ensure it's ok to fiddle with the mask of manifests - [x] Write more unit tests - [x] Test locally - [x] simple zombienet test - [x] PRDoc --------- Co-authored-by: Tsvetomir Dimitrov --- .gitlab/pipeline/zombienet/polkadot.yml | 8 + .../statement-distribution/src/error.rs | 3 + .../statement-distribution/src/v2/grid.rs | 4 +- .../statement-distribution/src/v2/mod.rs | 242 +++- .../statement-distribution/src/v2/requests.rs | 25 +- .../src/v2/statement_store.rs | 13 +- .../src/v2/tests/cluster.rs | 145 +-- .../src/v2/tests/grid.rs | 198 +-- .../src/v2/tests/mod.rs | 180 ++- .../src/v2/tests/requests.rs | 1149 +++++++++++++---- .../node/backing/statement-distribution.md | 25 + .../functional/0010-validator-disabling.toml | 39 + .../functional/0010-validator-disabling.zndsl | 21 + prdoc/pr_1841.prdoc | 18 + 14 files changed, 1407 insertions(+), 663 deletions(-) create mode 100644 polkadot/zombienet_tests/functional/0010-validator-disabling.toml create mode 100644 polkadot/zombienet_tests/functional/0010-validator-disabling.zndsl create mode 100644 prdoc/pr_1841.prdoc diff --git a/.gitlab/pipeline/zombienet/polkadot.yml b/.gitlab/pipeline/zombienet/polkadot.yml index c246d98a048..4112096a2ed 100644 --- a/.gitlab/pipeline/zombienet/polkadot.yml +++ b/.gitlab/pipeline/zombienet/polkadot.yml @@ -139,6 +139,14 @@ zombienet-polkadot-functional-0009-approval-voting-coalescing: --local-dir="${LOCAL_DIR}/functional" --test="0009-approval-voting-coalescing.zndsl" +zombienet-polkadot-functional-0010-validator-disabling: + extends: + - .zombienet-polkadot-common + script: + - /home/nonroot/zombie-net/scripts/ci/run-test-local-env-manager.sh + --local-dir="${LOCAL_DIR}/functional" + --test="0010-validator-disabling.zndsl" + zombienet-polkadot-smoke-0001-parachains-smoke-test: extends: - .zombienet-polkadot-common diff --git a/polkadot/node/network/statement-distribution/src/error.rs b/polkadot/node/network/statement-distribution/src/error.rs index b676e5b6a22..a712ab6da43 100644 --- a/polkadot/node/network/statement-distribution/src/error.rs +++ b/polkadot/node/network/statement-distribution/src/error.rs @@ -75,6 +75,9 @@ pub enum Error { #[error("Fetching availability cores failed {0:?}")] FetchAvailabilityCores(RuntimeApiError), + #[error("Fetching disabled validators failed {0:?}")] + FetchDisabledValidators(runtime::Error), + #[error("Fetching validator groups failed {0:?}")] FetchValidatorGroups(RuntimeApiError), diff --git a/polkadot/node/network/statement-distribution/src/v2/grid.rs b/polkadot/node/network/statement-distribution/src/v2/grid.rs index 19bad34c44f..19f23053192 100644 --- a/polkadot/node/network/statement-distribution/src/v2/grid.rs +++ b/polkadot/node/network/statement-distribution/src/v2/grid.rs @@ -253,7 +253,9 @@ impl GridTracker { /// This checks whether the peer is allowed to send us manifests /// about this group at this relay-parent. This also does sanity /// checks on the format of the manifest and the amount of votes - /// it contains. It has effects on the stored state only when successful. + /// it contains. It assumes that the votes from disabled validators + /// are already filtered out. + /// It has effects on the stored state only when successful. /// /// This returns a `bool` on success, which if true indicates that an acknowledgement is /// to be sent in response to the received manifest. This only occurs when the diff --git a/polkadot/node/network/statement-distribution/src/v2/mod.rs b/polkadot/node/network/statement-distribution/src/v2/mod.rs index 2f06d3685b8..02fdecdd9bb 100644 --- a/polkadot/node/network/statement-distribution/src/v2/mod.rs +++ b/polkadot/node/network/statement-distribution/src/v2/mod.rs @@ -17,11 +17,11 @@ //! Implementation of the v2 statement distribution protocol, //! designed for asynchronous backing. -use net_protocol::{filter_by_peer_version, peer_set::ProtocolVersion}; +use bitvec::prelude::{BitVec, Lsb0}; use polkadot_node_network_protocol::{ - self as net_protocol, + self as net_protocol, filter_by_peer_version, grid_topology::SessionGridTopology, - peer_set::ValidationVersion, + peer_set::{ProtocolVersion, ValidationVersion}, request_response::{ incoming::OutgoingResponse, v2::{AttestedCandidateRequest, AttestedCandidateResponse}, @@ -64,7 +64,7 @@ use futures::{ use std::{ collections::{ hash_map::{Entry, HashMap}, - HashSet, + BTreeSet, HashSet, }, time::{Duration, Instant}, }; @@ -96,6 +96,7 @@ const COST_UNEXPECTED_STATEMENT: Rep = Rep::CostMinor("Unexpected Statement"); const COST_UNEXPECTED_STATEMENT_MISSING_KNOWLEDGE: Rep = Rep::CostMinor("Unexpected Statement, missing knowledge for relay parent"); const COST_EXCESSIVE_SECONDED: Rep = Rep::CostMinor("Sent Excessive `Seconded` Statements"); +const COST_DISABLED_VALIDATOR: Rep = Rep::CostMinor("Sent a statement from a disabled validator"); const COST_UNEXPECTED_MANIFEST_MISSING_KNOWLEDGE: Rep = Rep::CostMinor("Unexpected Manifest, missing knowlege for relay parent"); @@ -189,6 +190,8 @@ struct PerSessionState { // getting the topology from the gossip-support subsystem grid_view: Option, local_validator: Option, + // We store the latest state here based on union of leaves. + disabled_validators: BTreeSet, } impl PerSessionState { @@ -205,7 +208,16 @@ impl PerSessionState { ) .map(|(_, index)| LocalValidatorIndex::Active(index)); - PerSessionState { session_info, groups, authority_lookup, grid_view: None, local_validator } + let disabled_validators = BTreeSet::new(); + + PerSessionState { + session_info, + groups, + authority_lookup, + grid_view: None, + local_validator, + disabled_validators, + } } fn supply_topology( @@ -234,6 +246,33 @@ impl PerSessionState { fn is_not_validator(&self) -> bool { self.grid_view.is_some() && self.local_validator.is_none() } + + /// A convenience function to generate a disabled bitmask for the given backing group. + /// The output bits are set to `true` for validators that are disabled. + /// Returns `None` if the group index is out of bounds. + pub fn disabled_bitmask(&self, group: GroupIndex) -> Option> { + let group = self.groups.get(group)?; + let mask = BitVec::from_iter(group.iter().map(|v| self.is_disabled(v))); + Some(mask) + } + + /// Returns `true` if the given validator is disabled in the current session. + pub fn is_disabled(&self, validator_index: &ValidatorIndex) -> bool { + self.disabled_validators.contains(validator_index) + } + + /// Extend the list of disabled validators. + pub fn extend_disabled_validators( + &mut self, + disabled: impl IntoIterator, + ) { + self.disabled_validators.extend(disabled); + } + + /// Clear the list of disabled validators. + pub fn clear_disabled_validators(&mut self) { + self.disabled_validators.clear(); + } } pub(crate) struct State { @@ -510,13 +549,20 @@ pub(crate) async fn handle_active_leaves_update( let new_relay_parents = state.implicit_view.all_allowed_relay_parents().cloned().collect::>(); - for new_relay_parent in new_relay_parents.iter().cloned() { - if state.per_relay_parent.contains_key(&new_relay_parent) { - continue - } - // New leaf: fetch info from runtime API and initialize - // `per_relay_parent`. + // We clear the list of disabled validators to reset it properly based on union of leaves. + let mut cleared_disabled_validators: BTreeSet = BTreeSet::new(); + + for new_relay_parent in new_relay_parents.iter().cloned() { + // Even if we processed this relay parent before, we need to fetch the list of disabled + // validators based on union of active leaves. + let disabled_validators = + polkadot_node_subsystem_util::vstaging::get_disabled_validators_with_fallback( + ctx.sender(), + new_relay_parent, + ) + .await + .map_err(JfyiError::FetchDisabledValidators)?; let session_index = polkadot_node_subsystem_util::request_session_index_for_child( new_relay_parent, @@ -527,23 +573,6 @@ pub(crate) async fn handle_active_leaves_update( .map_err(JfyiError::RuntimeApiUnavailable)? .map_err(JfyiError::FetchSessionIndex)?; - let availability_cores = polkadot_node_subsystem_util::request_availability_cores( - new_relay_parent, - ctx.sender(), - ) - .await - .await - .map_err(JfyiError::RuntimeApiUnavailable)? - .map_err(JfyiError::FetchAvailabilityCores)?; - - let group_rotation_info = - polkadot_node_subsystem_util::request_validator_groups(new_relay_parent, ctx.sender()) - .await - .await - .map_err(JfyiError::RuntimeApiUnavailable)? - .map_err(JfyiError::FetchValidatorGroups)? - .1; - if !state.per_session.contains_key(&session_index) { let session_info = polkadot_node_subsystem_util::request_session_info( new_relay_parent, @@ -579,9 +608,49 @@ pub(crate) async fn handle_active_leaves_update( let per_session = state .per_session - .get(&session_index) + .get_mut(&session_index) .expect("either existed or just inserted; qed"); + if cleared_disabled_validators.insert(session_index) { + per_session.clear_disabled_validators(); + } + + if !disabled_validators.is_empty() { + gum::debug!( + target: LOG_TARGET, + relay_parent = ?new_relay_parent, + ?session_index, + ?disabled_validators, + "Disabled validators detected" + ); + + per_session.extend_disabled_validators(disabled_validators); + } + + if state.per_relay_parent.contains_key(&new_relay_parent) { + continue + } + + // New leaf: fetch info from runtime API and initialize + // `per_relay_parent`. + + let availability_cores = polkadot_node_subsystem_util::request_availability_cores( + new_relay_parent, + ctx.sender(), + ) + .await + .await + .map_err(JfyiError::RuntimeApiUnavailable)? + .map_err(JfyiError::FetchAvailabilityCores)?; + + let group_rotation_info = + polkadot_node_subsystem_util::request_validator_groups(new_relay_parent, ctx.sender()) + .await + .await + .map_err(JfyiError::RuntimeApiUnavailable)? + .map_err(JfyiError::FetchValidatorGroups)? + .1; + let local_validator = per_session.local_validator.and_then(|v| { if let LocalValidatorIndex::Active(idx) = v { find_active_validator_state( @@ -1452,6 +1521,17 @@ async fn handle_incoming_statement( }, }; + if per_session.is_disabled(&statement.unchecked_validator_index()) { + gum::debug!( + target: LOG_TARGET, + ?relay_parent, + validator_index = ?statement.unchecked_validator_index(), + "Ignoring a statement from disabled validator." + ); + modify_reputation(reputation, ctx.sender(), peer, COST_DISABLED_VALIDATOR).await; + return + } + let (active, cluster_sender_index) = { // This block of code only returns `Some` when both the originator and // the sending peer are in the cluster. @@ -1572,7 +1652,7 @@ async fn handle_incoming_statement( checked_statement.clone(), StatementOrigin::Remote, ) { - Err(statement_store::ValidatorUnknown) => { + Err(statement_store::Error::ValidatorUnknown) => { // sanity: should never happen. gum::warn!( target: LOG_TARGET, @@ -2110,7 +2190,7 @@ async fn handle_incoming_manifest_common<'a, Context>( candidate_hash: CandidateHash, relay_parent: Hash, para_id: ParaId, - manifest_summary: grid::ManifestSummary, + mut manifest_summary: grid::ManifestSummary, manifest_kind: grid::ManifestKind, reputation: &mut ReputationAggregator, ) -> Option> { @@ -2195,6 +2275,12 @@ async fn handle_incoming_manifest_common<'a, Context>( // 2. sanity checks: peer is validator, bitvec size, import into grid tracker let group_index = manifest_summary.claimed_group_index; let claimed_parent_hash = manifest_summary.claimed_parent_hash; + + // Ignore votes from disabled validators when counting towards the threshold. + let disabled_mask = per_session.disabled_bitmask(group_index).unwrap_or_default(); + manifest_summary.statement_knowledge.mask_seconded(&disabled_mask); + manifest_summary.statement_knowledge.mask_valid(&disabled_mask); + let acknowledge = match local_validator.grid_tracker.import_manifest( grid_topology, &per_session.groups, @@ -2770,6 +2856,13 @@ pub(crate) async fn dispatch_requests(ctx: &mut Context, state: &mut St } } + // Add disabled validators to the unwanted mask. + let disabled_mask = per_session + .disabled_bitmask(group_index) + .expect("group existence checked above; qed"); + unwanted_mask.seconded_in_group |= &disabled_mask; + unwanted_mask.validated_in_group |= &disabled_mask; + // don't require a backing threshold for cluster candidates. let local_validator = relay_parent_state.local_validator.as_ref()?; let require_backing = local_validator @@ -2777,14 +2870,14 @@ pub(crate) async fn dispatch_requests(ctx: &mut Context, state: &mut St .as_ref() .map_or(true, |active| active.group != group_index); - Some(RequestProperties { - unwanted_mask, - backing_threshold: if require_backing { - Some(per_session.groups.get_size_and_backing_threshold(group_index)?.1) - } else { - None - }, - }) + let backing_threshold = if require_backing { + let threshold = per_session.groups.get_size_and_backing_threshold(group_index)?.1; + Some(threshold) + } else { + None + }; + + Some(RequestProperties { unwanted_mask, backing_threshold }) }; while let Some(request) = state.request_manager.next_request( @@ -2857,6 +2950,10 @@ pub(crate) async fn handle_response( Some(g) => g, }; + let disabled_mask = per_session + .disabled_bitmask(group_index) + .expect("group_index checked above; qed"); + let res = response.validate_response( &mut state.request_manager, group, @@ -2871,6 +2968,7 @@ pub(crate) async fn handle_response( Some(g_index) == expected_group }, + disabled_mask, ); for (peer, rep) in res.reputation_changes { @@ -2968,6 +3066,14 @@ pub(crate) async fn handle_response( // includable. } +/// Returns true if the statement filter meets the backing threshold for grid requests. +pub(crate) fn seconded_and_sufficient( + filter: &StatementFilter, + backing_threshold: Option, +) -> bool { + backing_threshold.map_or(true, |t| filter.has_seconded() && filter.backing_validators() >= t) +} + /// Answer an incoming request for a candidate. pub(crate) fn answer_request(state: &mut State, message: ResponderMessage) { let ResponderMessage { request, sent_feedback } = message; @@ -3008,11 +3114,13 @@ pub(crate) fn answer_request(state: &mut State, message: ResponderMessage) { Some(d) => d, }; - let group_size = per_session + let group_index = confirmed.group_index(); + let group = per_session .groups - .get(confirmed.group_index()) - .expect("group from session's candidate always known; qed") - .len(); + .get(group_index) + .expect("group from session's candidate always known; qed"); + + let group_size = group.len(); // check request bitfields are right size. if mask.seconded_in_group.len() != group_size || mask.validated_in_group.len() != group_size { @@ -3065,17 +3173,59 @@ pub(crate) fn answer_request(state: &mut State, message: ResponderMessage) { // Transform mask with 'OR' semantics into one with 'AND' semantics for the API used // below. - let and_mask = StatementFilter { + let mut and_mask = StatementFilter { seconded_in_group: !mask.seconded_in_group.clone(), validated_in_group: !mask.validated_in_group.clone(), }; + // Ignore disabled validators from the latest state when sending the response. + let disabled_mask = + per_session.disabled_bitmask(group_index).expect("group existence checked; qed"); + and_mask.mask_seconded(&disabled_mask); + and_mask.mask_valid(&disabled_mask); + + let mut sent_filter = StatementFilter::blank(group_size); let statements: Vec<_> = relay_parent_state .statement_store - .group_statements(&per_session.groups, confirmed.group_index(), *candidate_hash, &and_mask) - .map(|s| s.as_unchecked().clone()) + .group_statements(&per_session.groups, group_index, *candidate_hash, &and_mask) + .map(|s| { + let s = s.as_unchecked().clone(); + let index_in_group = |v: ValidatorIndex| group.iter().position(|x| &v == x); + let Some(i) = index_in_group(s.unchecked_validator_index()) else { return s }; + + match s.unchecked_payload() { + CompactStatement::Seconded(_) => { + sent_filter.seconded_in_group.set(i, true); + }, + CompactStatement::Valid(_) => { + sent_filter.validated_in_group.set(i, true); + }, + } + s + }) .collect(); + // There should be no response at all for grid requests when the + // backing threshold is no longer met as a result of disabled validators. + if !is_cluster { + let threshold = per_session + .groups + .get_size_and_backing_threshold(group_index) + .expect("group existence checked above; qed") + .1; + + if !seconded_and_sufficient(&sent_filter, Some(threshold)) { + gum::info!( + target: LOG_TARGET, + ?candidate_hash, + relay_parent = ?confirmed.relay_parent(), + ?group_index, + "Dropping a request from a grid peer because the backing threshold is no longer met." + ); + return + } + } + // Update bookkeeping about which statements peers have received. for statement in &statements { if is_cluster { diff --git a/polkadot/node/network/statement-distribution/src/v2/requests.rs b/polkadot/node/network/statement-distribution/src/v2/requests.rs index 8507a4b8276..bed3d5c18ae 100644 --- a/polkadot/node/network/statement-distribution/src/v2/requests.rs +++ b/polkadot/node/network/statement-distribution/src/v2/requests.rs @@ -30,12 +30,13 @@ //! (which requires state not owned by the request manager). use super::{ - BENEFIT_VALID_RESPONSE, BENEFIT_VALID_STATEMENT, COST_IMPROPERLY_DECODED_RESPONSE, - COST_INVALID_RESPONSE, COST_INVALID_SIGNATURE, COST_UNREQUESTED_RESPONSE_STATEMENT, - REQUEST_RETRY_DELAY, + seconded_and_sufficient, BENEFIT_VALID_RESPONSE, BENEFIT_VALID_STATEMENT, + COST_IMPROPERLY_DECODED_RESPONSE, COST_INVALID_RESPONSE, COST_INVALID_SIGNATURE, + COST_UNREQUESTED_RESPONSE_STATEMENT, REQUEST_RETRY_DELAY, }; use crate::LOG_TARGET; +use bitvec::prelude::{BitVec, Lsb0}; use polkadot_node_network_protocol::{ request_response::{ outgoing::{Recipient as RequestRecipient, RequestError}, @@ -495,10 +496,6 @@ fn find_request_target_with_update( } } -fn seconded_and_sufficient(filter: &StatementFilter, backing_threshold: Option) -> bool { - backing_threshold.map_or(true, |t| filter.has_seconded() && filter.backing_validators() >= t) -} - /// A response to a request, which has not yet been handled. pub struct UnhandledResponse { response: TaggedResponse, @@ -542,6 +539,7 @@ impl UnhandledResponse { session: SessionIndex, validator_key_lookup: impl Fn(ValidatorIndex) -> Option, allowed_para_lookup: impl Fn(ParaId, GroupIndex) -> bool, + disabled_mask: BitVec, ) -> ResponseValidationOutput { let UnhandledResponse { response: TaggedResponse { identifier, requested_peer, props, response }, @@ -625,6 +623,7 @@ impl UnhandledResponse { session, validator_key_lookup, allowed_para_lookup, + disabled_mask, ); if let CandidateRequestStatus::Complete { .. } = output.request_status { @@ -644,6 +643,7 @@ fn validate_complete_response( session: SessionIndex, validator_key_lookup: impl Fn(ValidatorIndex) -> Option, allowed_para_lookup: impl Fn(ParaId, GroupIndex) -> bool, + disabled_mask: BitVec, ) -> ResponseValidationOutput { let RequestProperties { backing_threshold, mut unwanted_mask } = props; @@ -751,6 +751,10 @@ fn validate_complete_response( }, } + if disabled_mask.get(i).map_or(false, |x| *x) { + continue + } + let validator_public = match validator_key_lookup(unchecked_statement.unchecked_validator_index()) { None => { @@ -1013,6 +1017,7 @@ mod tests { let group = &[ValidatorIndex(0), ValidatorIndex(1), ValidatorIndex(2)]; let unwanted_mask = StatementFilter::blank(group_size); + let disabled_mask: BitVec = Default::default(); let request_properties = RequestProperties { unwanted_mask, backing_threshold: None }; // Get requests. @@ -1056,6 +1061,7 @@ mod tests { 0, validator_key_lookup, allowed_para_lookup, + disabled_mask.clone(), ); assert_eq!( output, @@ -1094,6 +1100,7 @@ mod tests { 0, validator_key_lookup, allowed_para_lookup, + disabled_mask, ); assert_eq!( output, @@ -1167,12 +1174,14 @@ mod tests { }; let validator_key_lookup = |_v| None; let allowed_para_lookup = |_para, _g_index| true; + let disabled_mask: BitVec = Default::default(); let output = response.validate_response( &mut request_manager, group, 0, validator_key_lookup, allowed_para_lookup, + disabled_mask, ); assert_eq!( output, @@ -1245,12 +1254,14 @@ mod tests { let validator_key_lookup = |_v| None; let allowed_para_lookup = |_para, _g_index| true; let statements = vec![]; + let disabled_mask: BitVec = Default::default(); let output = response.validate_response( &mut request_manager, group, 0, validator_key_lookup, allowed_para_lookup, + disabled_mask, ); assert_eq!( output, diff --git a/polkadot/node/network/statement-distribution/src/v2/statement_store.rs b/polkadot/node/network/statement-distribution/src/v2/statement_store.rs index 96d976e22cd..022461e5551 100644 --- a/polkadot/node/network/statement-distribution/src/v2/statement_store.rs +++ b/polkadot/node/network/statement-distribution/src/v2/statement_store.rs @@ -97,10 +97,10 @@ impl StatementStore { groups: &Groups, statement: SignedStatement, origin: StatementOrigin, - ) -> Result { + ) -> Result { let validator_index = statement.validator_index(); let validator_meta = match self.validator_meta.get_mut(&validator_index) { - None => return Err(ValidatorUnknown), + None => return Err(Error::ValidatorUnknown), Some(m) => m, }; @@ -134,7 +134,7 @@ impl StatementStore { "groups passed into `insert` differ from those used at store creation" ); - return Err(ValidatorUnknown) + return Err(Error::ValidatorUnknown) }, }; @@ -251,9 +251,12 @@ impl StatementStore { } } -/// Error indicating that the validator was unknown. +/// Error when inserting a statement into the statement store. #[derive(Debug)] -pub struct ValidatorUnknown; +pub enum Error { + /// The validator was unknown. + ValidatorUnknown, +} type Fingerprint = (ValidatorIndex, CompactStatement); diff --git a/polkadot/node/network/statement-distribution/src/v2/tests/cluster.rs b/polkadot/node/network/statement-distribution/src/v2/tests/cluster.rs index a9f5b537b32..7ffed9d47d4 100644 --- a/polkadot/node/network/statement-distribution/src/v2/tests/cluster.rs +++ b/polkadot/node/network/statement-distribution/src/v2/tests/cluster.rs @@ -75,15 +75,7 @@ fn share_seconded_circulated_to_cluster() { send_peer_view_change(&mut overseer, peer_c.clone(), view![relay_parent]).await; } - activate_leaf(&mut overseer, &test_leaf, &state, true).await; - - answer_expected_hypothetical_depth_request( - &mut overseer, - vec![], - Some(relay_parent), - false, - ) - .await; + activate_leaf(&mut overseer, &test_leaf, &state, true, vec![]).await; let full_signed = state .sign_statement( @@ -120,7 +112,7 @@ fn share_seconded_circulated_to_cluster() { // sharing a `Seconded` message confirms a candidate, which leads to new // fragment tree updates. - answer_expected_hypothetical_depth_request(&mut overseer, vec![], None, false).await; + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; overseer }); @@ -156,15 +148,7 @@ fn cluster_valid_statement_before_seconded_ignored() { .await; send_peer_view_change(&mut overseer, peer_a.clone(), view![relay_parent]).await; - activate_leaf(&mut overseer, &test_leaf, &state, true).await; - - answer_expected_hypothetical_depth_request( - &mut overseer, - vec![], - Some(relay_parent), - false, - ) - .await; + activate_leaf(&mut overseer, &test_leaf, &state, true, vec![]).await; let signed_valid = state.sign_statement( v_a, @@ -226,15 +210,7 @@ fn cluster_statement_bad_signature() { .await; send_peer_view_change(&mut overseer, peer_a.clone(), view![relay_parent]).await; - activate_leaf(&mut overseer, &test_leaf, &state, true).await; - - answer_expected_hypothetical_depth_request( - &mut overseer, - vec![], - Some(relay_parent), - false, - ) - .await; + activate_leaf(&mut overseer, &test_leaf, &state, true, vec![]).await; // sign statements with wrong signing context, leading to bad signature. let statements = vec![ @@ -308,15 +284,7 @@ fn useful_cluster_statement_from_non_cluster_peer_rejected() { .await; send_peer_view_change(&mut overseer, peer_a.clone(), view![relay_parent]).await; - activate_leaf(&mut overseer, &test_leaf, &state, true).await; - - answer_expected_hypothetical_depth_request( - &mut overseer, - vec![], - Some(relay_parent), - false, - ) - .await; + activate_leaf(&mut overseer, &test_leaf, &state, true, vec![]).await; let statement = state .sign_statement( @@ -370,15 +338,7 @@ fn statement_from_non_cluster_originator_unexpected() { connect_peer(&mut overseer, peer_a.clone(), None).await; send_peer_view_change(&mut overseer, peer_a.clone(), view![relay_parent]).await; - activate_leaf(&mut overseer, &test_leaf, &state, true).await; - - answer_expected_hypothetical_depth_request( - &mut overseer, - vec![], - Some(relay_parent), - false, - ) - .await; + activate_leaf(&mut overseer, &test_leaf, &state, true, vec![]).await; let statement = state .sign_statement( @@ -448,15 +408,7 @@ fn seconded_statement_leads_to_request() { .await; send_peer_view_change(&mut overseer, peer_a.clone(), view![relay_parent]).await; - activate_leaf(&mut overseer, &test_leaf, &state, true).await; - - answer_expected_hypothetical_depth_request( - &mut overseer, - vec![], - Some(relay_parent), - false, - ) - .await; + activate_leaf(&mut overseer, &test_leaf, &state, true, vec![]).await; let statement = state .sign_statement( @@ -497,7 +449,7 @@ fn seconded_statement_leads_to_request() { if p == peer_a && r == BENEFIT_VALID_RESPONSE.into() => { } ); - answer_expected_hypothetical_depth_request(&mut overseer, vec![], None, false).await; + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; overseer }); @@ -544,15 +496,7 @@ fn cluster_statements_shared_seconded_first() { .await; } - activate_leaf(&mut overseer, &test_leaf, &state, true).await; - - answer_expected_hypothetical_depth_request( - &mut overseer, - vec![], - Some(relay_parent), - false, - ) - .await; + activate_leaf(&mut overseer, &test_leaf, &state, true, vec![]).await; let full_signed = state .sign_statement( @@ -579,7 +523,7 @@ fn cluster_statements_shared_seconded_first() { .await; // result of new confirmed candidate. - answer_expected_hypothetical_depth_request(&mut overseer, vec![], None, false).await; + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; overseer .send(FromOrchestra::Communication { @@ -677,15 +621,7 @@ fn cluster_accounts_for_implicit_view() { send_peer_view_change(&mut overseer, peer_a.clone(), view![relay_parent]).await; } - activate_leaf(&mut overseer, &test_leaf, &state, true).await; - - answer_expected_hypothetical_depth_request( - &mut overseer, - vec![], - Some(relay_parent), - false, - ) - .await; + activate_leaf(&mut overseer, &test_leaf, &state, true, vec![]).await; let full_signed = state .sign_statement( @@ -722,7 +658,7 @@ fn cluster_accounts_for_implicit_view() { // sharing a `Seconded` message confirms a candidate, which leads to new // fragment tree updates. - answer_expected_hypothetical_depth_request(&mut overseer, vec![], None, false).await; + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; // activate new leaf, which has relay-parent in implicit view. let next_relay_parent = Hash::repeat_byte(2); @@ -730,15 +666,7 @@ fn cluster_accounts_for_implicit_view() { next_test_leaf.parent_hash = relay_parent; next_test_leaf.number = 2; - activate_leaf(&mut overseer, &next_test_leaf, &state, false).await; - - answer_expected_hypothetical_depth_request( - &mut overseer, - vec![], - Some(next_relay_parent), - false, - ) - .await; + activate_leaf(&mut overseer, &next_test_leaf, &state, false, vec![]).await; send_peer_view_change(&mut overseer, peer_a.clone(), view![next_relay_parent]).await; send_peer_view_change(&mut overseer, peer_b.clone(), view![next_relay_parent]).await; @@ -820,15 +748,7 @@ fn cluster_messages_imported_after_confirmed_candidate_importable_check() { send_peer_view_change(&mut overseer, peer_a.clone(), view![relay_parent]).await; } - activate_leaf(&mut overseer, &test_leaf, &state, true).await; - - answer_expected_hypothetical_depth_request( - &mut overseer, - vec![], - Some(relay_parent), - false, - ) - .await; + activate_leaf(&mut overseer, &test_leaf, &state, true, vec![]).await; // Peer sends `Seconded` statement. { @@ -885,8 +805,6 @@ fn cluster_messages_imported_after_confirmed_candidate_importable_check() { }, vec![(relay_parent, vec![0])], )], - None, - false, ) .await; @@ -953,15 +871,7 @@ fn cluster_messages_imported_after_new_leaf_importable_check() { send_peer_view_change(&mut overseer, peer_a.clone(), view![relay_parent]).await; } - activate_leaf(&mut overseer, &test_leaf, &state, true).await; - - answer_expected_hypothetical_depth_request( - &mut overseer, - vec![], - Some(relay_parent), - false, - ) - .await; + activate_leaf(&mut overseer, &test_leaf, &state, true, vec![]).await; // Peer sends `Seconded` statement. { @@ -1008,17 +918,18 @@ fn cluster_messages_imported_after_new_leaf_importable_check() { ); } - answer_expected_hypothetical_depth_request(&mut overseer, vec![], None, false).await; + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; let next_relay_parent = Hash::repeat_byte(2); let mut next_test_leaf = state.make_dummy_leaf(next_relay_parent); next_test_leaf.parent_hash = relay_parent; next_test_leaf.number = 2; - activate_leaf(&mut overseer, &next_test_leaf, &state, false).await; - - answer_expected_hypothetical_depth_request( + activate_leaf( &mut overseer, + &next_test_leaf, + &state, + false, vec![( HypotheticalCandidate::Complete { candidate_hash, @@ -1027,8 +938,6 @@ fn cluster_messages_imported_after_new_leaf_importable_check() { }, vec![(relay_parent, vec![0])], )], - Some(next_relay_parent), - false, ) .await; @@ -1117,15 +1026,7 @@ fn ensure_seconding_limit_is_respected() { send_peer_view_change(&mut overseer, peer_a.clone(), view![relay_parent]).await; } - activate_leaf(&mut overseer, &test_leaf, &state, true).await; - - answer_expected_hypothetical_depth_request( - &mut overseer, - vec![], - Some(relay_parent), - false, - ) - .await; + activate_leaf(&mut overseer, &test_leaf, &state, true, vec![]).await; // Confirm the candidates locally so that we don't send out requests. @@ -1152,7 +1053,7 @@ fn ensure_seconding_limit_is_respected() { AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::SendValidationMessage(peers, _)) if peers == vec![peer_a] ); - answer_expected_hypothetical_depth_request(&mut overseer, vec![], None, false).await; + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; } // Candidate 2. @@ -1178,7 +1079,7 @@ fn ensure_seconding_limit_is_respected() { AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::SendValidationMessage(peers, _)) if peers == vec![peer_a] ); - answer_expected_hypothetical_depth_request(&mut overseer, vec![], None, false).await; + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; } // Send first statement from peer A. diff --git a/polkadot/node/network/statement-distribution/src/v2/tests/grid.rs b/polkadot/node/network/statement-distribution/src/v2/tests/grid.rs index aa1a473b833..1ac9f4d45e7 100644 --- a/polkadot/node/network/statement-distribution/src/v2/tests/grid.rs +++ b/polkadot/node/network/statement-distribution/src/v2/tests/grid.rs @@ -102,15 +102,7 @@ fn backed_candidate_leads_to_advertisement() { send_peer_view_change(&mut overseer, peer_c.clone(), view![relay_parent]).await; } - activate_leaf(&mut overseer, &test_leaf, &state, true).await; - - answer_expected_hypothetical_depth_request( - &mut overseer, - vec![], - Some(relay_parent), - false, - ) - .await; + activate_leaf(&mut overseer, &test_leaf, &state, true, vec![]).await; // Send gossip topology. send_new_topology(&mut overseer, state.make_dummy_topology()).await; @@ -137,7 +129,7 @@ fn backed_candidate_leads_to_advertisement() { AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::SendValidationMessage(peers, _)) if peers == vec![peer_a] ); - answer_expected_hypothetical_depth_request(&mut overseer, vec![], None, false).await; + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; } // Send enough statements to make candidate backable, make sure announcements are sent. @@ -232,7 +224,7 @@ fn backed_candidate_leads_to_advertisement() { } ); - answer_expected_hypothetical_depth_request(&mut overseer, vec![], None, false).await; + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; } overseer @@ -320,15 +312,7 @@ fn received_advertisement_before_confirmation_leads_to_request() { send_peer_view_change(&mut overseer, peer_d.clone(), view![relay_parent]).await; } - activate_leaf(&mut overseer, &test_leaf, &state, true).await; - - answer_expected_hypothetical_depth_request( - &mut overseer, - vec![], - Some(relay_parent), - false, - ) - .await; + activate_leaf(&mut overseer, &test_leaf, &state, true, vec![]).await; // Send gossip topology. send_new_topology(&mut overseer, state.make_dummy_topology()).await; @@ -400,7 +384,7 @@ fn received_advertisement_before_confirmation_leads_to_request() { if p == peer_c && r == BENEFIT_VALID_RESPONSE.into() => { } ); - answer_expected_hypothetical_depth_request(&mut overseer, vec![], None, false).await; + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; } overseer @@ -530,7 +514,7 @@ fn received_advertisement_after_backing_leads_to_acknowledgement() { assert_peer_reported!(&mut overseer, peer_c, BENEFIT_VALID_STATEMENT); assert_peer_reported!(&mut overseer, peer_c, BENEFIT_VALID_RESPONSE); - answer_expected_hypothetical_depth_request(&mut overseer, vec![], None, false).await; + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; } // Receive Backed message. @@ -561,7 +545,7 @@ fn received_advertisement_after_backing_leads_to_acknowledgement() { } ); - answer_expected_hypothetical_depth_request(&mut overseer, vec![], None, false).await; + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; } // Receive a manifest about the same candidate from peer D. @@ -733,7 +717,7 @@ fn received_acknowledgements_for_locally_confirmed() { AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::SendValidationMessage(peers, _)) if peers == vec![peer_a] ); - answer_expected_hypothetical_depth_request(&mut overseer, vec![], None, false).await; + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; } // Receive an unexpected acknowledgement from peer D. @@ -798,7 +782,7 @@ fn received_acknowledgements_for_locally_confirmed() { } ); - answer_expected_hypothetical_depth_request(&mut overseer, vec![], None, false).await; + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; } // Receive an unexpected acknowledgement from peer D. @@ -930,7 +914,7 @@ fn received_acknowledgements_for_externally_confirmed() { assert_peer_reported!(&mut overseer, peer_c, BENEFIT_VALID_STATEMENT); assert_peer_reported!(&mut overseer, peer_c, BENEFIT_VALID_RESPONSE); - answer_expected_hypothetical_depth_request(&mut overseer, vec![], None, false).await; + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; } let ack = BackedCandidateAcknowledgement { @@ -1022,15 +1006,7 @@ fn received_advertisement_after_confirmation_before_backing() { send_peer_view_change(&mut overseer, peer_e.clone(), view![relay_parent]).await; } - activate_leaf(&mut overseer, &test_leaf, &state, true).await; - - answer_expected_hypothetical_depth_request( - &mut overseer, - vec![], - Some(relay_parent), - false, - ) - .await; + activate_leaf(&mut overseer, &test_leaf, &state, true, vec![]).await; // Send gossip topology. send_new_topology(&mut overseer, state.make_dummy_topology()).await; @@ -1121,7 +1097,7 @@ fn received_advertisement_after_confirmation_before_backing() { if p == peer_c && r == BENEFIT_VALID_RESPONSE.into() ); - answer_expected_hypothetical_depth_request(&mut overseer, vec![], None, false).await; + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; } // Receive advertisement from peer D (after confirmation but before backing). @@ -1208,15 +1184,7 @@ fn additional_statements_are_shared_after_manifest_exchange() { send_peer_view_change(&mut overseer, peer_e.clone(), view![relay_parent]).await; } - activate_leaf(&mut overseer, &test_leaf, &state, true).await; - - answer_expected_hypothetical_depth_request( - &mut overseer, - vec![], - Some(relay_parent), - false, - ) - .await; + activate_leaf(&mut overseer, &test_leaf, &state, true, vec![]).await; // Send gossip topology. send_new_topology(&mut overseer, state.make_dummy_topology()).await; @@ -1301,13 +1269,8 @@ fn additional_statements_are_shared_after_manifest_exchange() { persisted_validation_data: pvd.clone(), }; let membership = vec![(relay_parent, vec![0])]; - answer_expected_hypothetical_depth_request( - &mut overseer, - vec![(hypothetical, membership)], - None, - false, - ) - .await; + answer_expected_hypothetical_depth_request(&mut overseer, vec![(hypothetical, membership)]) + .await; // Statements are sent to the Backing subsystem. { @@ -1371,7 +1334,7 @@ fn additional_statements_are_shared_after_manifest_exchange() { } ); - answer_expected_hypothetical_depth_request(&mut overseer, vec![], None, false).await; + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; } // Receive a manifest about the same candidate from peer D. Contains different statements. @@ -1514,17 +1477,8 @@ fn advertisement_sent_when_peer_enters_relay_parent_view() { send_peer_view_change(&mut overseer, peer_a.clone(), view![relay_parent]).await; } - activate_leaf(&mut overseer, &test_leaf, &state, true).await; + activate_leaf(&mut overseer, &test_leaf, &state, true, vec![]).await; - answer_expected_hypothetical_depth_request( - &mut overseer, - vec![], - Some(relay_parent), - false, - ) - .await; - - // Send gossip topology. send_new_topology(&mut overseer, state.make_dummy_topology()).await; // Confirm the candidate locally so that we don't send out requests. @@ -1549,7 +1503,7 @@ fn advertisement_sent_when_peer_enters_relay_parent_view() { AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::SendValidationMessage(peers, _)) if peers == vec![peer_a] ); - answer_expected_hypothetical_depth_request(&mut overseer, vec![], None, false).await; + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; } // Send enough statements to make candidate backable, make sure announcements are sent. @@ -1616,7 +1570,7 @@ fn advertisement_sent_when_peer_enters_relay_parent_view() { }) .await; - answer_expected_hypothetical_depth_request(&mut overseer, vec![], None, false).await; + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; // Relay parent enters view of peer C. { @@ -1737,17 +1691,8 @@ fn advertisement_not_re_sent_when_peer_re_enters_view() { send_peer_view_change(&mut overseer, peer_c.clone(), view![relay_parent]).await; } - activate_leaf(&mut overseer, &test_leaf, &state, true).await; - - answer_expected_hypothetical_depth_request( - &mut overseer, - vec![], - Some(relay_parent), - false, - ) - .await; + activate_leaf(&mut overseer, &test_leaf, &state, true, vec![]).await; - // Send gossip topology. send_new_topology(&mut overseer, state.make_dummy_topology()).await; // Confirm the candidate locally so that we don't send out requests. @@ -1772,7 +1717,7 @@ fn advertisement_not_re_sent_when_peer_re_enters_view() { AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::SendValidationMessage(peers, _)) if peers == vec![peer_a] ); - answer_expected_hypothetical_depth_request(&mut overseer, vec![], None, false).await; + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; } // Send enough statements to make candidate backable, make sure announcements are sent. @@ -1867,7 +1812,7 @@ fn advertisement_not_re_sent_when_peer_re_enters_view() { } ); - answer_expected_hypothetical_depth_request(&mut overseer, vec![], None, false).await; + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; } // Peer leaves view. @@ -1949,17 +1894,8 @@ fn grid_statements_imported_to_backing() { send_peer_view_change(&mut overseer, peer_e.clone(), view![relay_parent]).await; } - activate_leaf(&mut overseer, &test_leaf, &state, true).await; + activate_leaf(&mut overseer, &test_leaf, &state, true, vec![]).await; - answer_expected_hypothetical_depth_request( - &mut overseer, - vec![], - Some(relay_parent), - false, - ) - .await; - - // Send gossip topology. send_new_topology(&mut overseer, state.make_dummy_topology()).await; // Receive an advertisement from C. @@ -2042,13 +1978,8 @@ fn grid_statements_imported_to_backing() { persisted_validation_data: pvd.clone(), }; let membership = vec![(relay_parent, vec![0])]; - answer_expected_hypothetical_depth_request( - &mut overseer, - vec![(hypothetical, membership)], - None, - false, - ) - .await; + answer_expected_hypothetical_depth_request(&mut overseer, vec![(hypothetical, membership)]) + .await; // Receive messages from Backing subsystem. { @@ -2165,17 +2096,8 @@ fn advertisements_rejected_from_incorrect_peers() { send_peer_view_change(&mut overseer, peer_c.clone(), view![relay_parent]).await; } - activate_leaf(&mut overseer, &test_leaf, &state, true).await; + activate_leaf(&mut overseer, &test_leaf, &state, true, vec![]).await; - answer_expected_hypothetical_depth_request( - &mut overseer, - vec![], - Some(relay_parent), - false, - ) - .await; - - // Send gossip topology. send_new_topology(&mut overseer, state.make_dummy_topology()).await; let manifest = BackedCandidateManifest { @@ -2289,17 +2211,8 @@ fn manifest_rejected_with_unknown_relay_parent() { send_peer_view_change(&mut overseer, peer_c.clone(), view![relay_parent]).await; } - activate_leaf(&mut overseer, &test_leaf, &state, true).await; - - answer_expected_hypothetical_depth_request( - &mut overseer, - vec![], - Some(relay_parent), - false, - ) - .await; + activate_leaf(&mut overseer, &test_leaf, &state, true, vec![]).await; - // Send gossip topology. send_new_topology(&mut overseer, state.make_dummy_topology()).await; let manifest = BackedCandidateManifest { @@ -2391,17 +2304,8 @@ fn manifest_rejected_when_not_a_validator() { send_peer_view_change(&mut overseer, peer_c.clone(), view![relay_parent]).await; } - activate_leaf(&mut overseer, &test_leaf, &state, true).await; + activate_leaf(&mut overseer, &test_leaf, &state, true, vec![]).await; - answer_expected_hypothetical_depth_request( - &mut overseer, - vec![], - Some(relay_parent), - false, - ) - .await; - - // Send gossip topology. send_new_topology(&mut overseer, state.make_dummy_topology()).await; let manifest = BackedCandidateManifest { @@ -2498,17 +2402,8 @@ fn manifest_rejected_when_group_does_not_match_para() { send_peer_view_change(&mut overseer, peer_c.clone(), view![relay_parent]).await; } - activate_leaf(&mut overseer, &test_leaf, &state, true).await; + activate_leaf(&mut overseer, &test_leaf, &state, true, vec![]).await; - answer_expected_hypothetical_depth_request( - &mut overseer, - vec![], - Some(relay_parent), - false, - ) - .await; - - // Send gossip topology. send_new_topology(&mut overseer, state.make_dummy_topology()).await; let manifest = BackedCandidateManifest { @@ -2613,17 +2508,8 @@ fn peer_reported_for_advertisement_conflicting_with_confirmed_candidate() { send_peer_view_change(&mut overseer, peer_e.clone(), view![relay_parent]).await; } - activate_leaf(&mut overseer, &test_leaf, &state, true).await; - - answer_expected_hypothetical_depth_request( - &mut overseer, - vec![], - Some(relay_parent), - false, - ) - .await; + activate_leaf(&mut overseer, &test_leaf, &state, true, vec![]).await; - // Send gossip topology. send_new_topology(&mut overseer, state.make_dummy_topology()).await; let manifest = BackedCandidateManifest { @@ -2713,7 +2599,7 @@ fn peer_reported_for_advertisement_conflicting_with_confirmed_candidate() { if p == peer_c && r == BENEFIT_VALID_RESPONSE.into() ); - answer_expected_hypothetical_depth_request(&mut overseer, vec![], None, false).await; + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; } // Receive conflicting advertisement from peer C after confirmation. @@ -2755,7 +2641,6 @@ fn inactive_local_participates_in_grid() { async_backing_params: None, }; - let dummy_relay_parent = Hash::repeat_byte(2); let relay_parent = Hash::repeat_byte(1); let peer_a = PeerId::random(); @@ -2795,25 +2680,10 @@ fn inactive_local_participates_in_grid() { send_peer_view_change(&mut overseer, peer_a.clone(), view![relay_parent]).await; } - activate_leaf(&mut overseer, &dummy_leaf, &state, true).await; - answer_expected_hypothetical_depth_request( - &mut overseer, - vec![], - Some(dummy_relay_parent), - false, - ) - .await; - + activate_leaf(&mut overseer, &dummy_leaf, &state, true, vec![]).await; // Send gossip topology. send_new_topology(&mut overseer, state.make_dummy_topology()).await; - activate_leaf(&mut overseer, &test_leaf, &state, false).await; - answer_expected_hypothetical_depth_request( - &mut overseer, - vec![], - Some(relay_parent), - false, - ) - .await; + activate_leaf(&mut overseer, &test_leaf, &state, false, vec![]).await; // Receive an advertisement from A. let manifest = BackedCandidateManifest { @@ -2876,7 +2746,7 @@ fn inactive_local_participates_in_grid() { AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::ReportPeer(ReportPeerMessage::Single(p, r))) if p == peer_a && r == BENEFIT_VALID_RESPONSE.into() => { } ); - answer_expected_hypothetical_depth_request(&mut overseer, vec![], None, false).await; + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; overseer }); diff --git a/polkadot/node/network/statement-distribution/src/v2/tests/mod.rs b/polkadot/node/network/statement-distribution/src/v2/tests/mod.rs index c34cf20d716..3ce43202b95 100644 --- a/polkadot/node/network/statement-distribution/src/v2/tests/mod.rs +++ b/polkadot/node/network/statement-distribution/src/v2/tests/mod.rs @@ -187,12 +187,30 @@ impl TestState { collator: None, }) }), + disabled_validators: Default::default(), para_data: (0..self.session_info.validator_groups.len()) .map(|i| (ParaId::from(i as u32), PerParaData::new(1, vec![1, 2, 3].into()))) .collect(), + minimum_backing_votes: 2, } } + fn make_dummy_leaf_with_disabled_validators( + &self, + relay_parent: Hash, + disabled_validators: Vec, + ) -> TestLeaf { + TestLeaf { disabled_validators, ..self.make_dummy_leaf(relay_parent) } + } + + fn make_dummy_leaf_with_min_backing_votes( + &self, + relay_parent: Hash, + minimum_backing_votes: u32, + ) -> TestLeaf { + TestLeaf { minimum_backing_votes, ..self.make_dummy_leaf(relay_parent) } + } + fn make_availability_cores(&self, f: impl Fn(usize) -> CoreState) -> Vec { (0..self.session_info.validator_groups.len()).map(f).collect() } @@ -240,6 +258,19 @@ impl TestState { .collect() } + fn index_within_group( + &self, + group_index: GroupIndex, + validator_index: ValidatorIndex, + ) -> Option { + self.session_info + .validator_groups + .get(group_index) + .unwrap() + .iter() + .position(|&i| i == validator_index) + } + fn discovery_id(&self, validator_index: ValidatorIndex) -> AuthorityDiscoveryId { self.session_info.discovery_keys[validator_index.0 as usize].clone() } @@ -284,7 +315,7 @@ impl TestState { &mut self, peer: PeerId, request: AttestedCandidateRequest, - ) -> impl Future { + ) -> impl Future> { let (tx, rx) = futures::channel::oneshot::channel(); let req = sc_network::config::IncomingRequest { peer, @@ -293,7 +324,7 @@ impl TestState { }; self.req_sender.send(req).await.unwrap(); - rx.map(|r| r.unwrap()) + rx.map(|r| r.ok()) } } @@ -366,7 +397,9 @@ struct TestLeaf { parent_hash: Hash, session: SessionIndex, availability_cores: Vec, + disabled_validators: Vec, para_data: Vec<(ParaId, PerParaData)>, + minimum_backing_votes: u32, } impl TestLeaf { @@ -447,9 +480,7 @@ async fn setup_test_and_connect_peers( } } - activate_leaf(overseer, &test_leaf, &state, true).await; - - answer_expected_hypothetical_depth_request(overseer, vec![], Some(relay_parent), false).await; + activate_leaf(overseer, &test_leaf, &state, true, vec![]).await; // Send gossip topology. send_new_topology(overseer, state.make_dummy_topology()).await; @@ -472,6 +503,7 @@ async fn activate_leaf( leaf: &TestLeaf, test_state: &TestState, is_new_session: bool, + hypothetical_frontier: Vec<(HypotheticalCandidate, FragmentTreeMembership)>, ) { let activated = new_leaf(leaf.hash, leaf.number); @@ -481,7 +513,14 @@ async fn activate_leaf( )))) .await; - handle_leaf_activation(virtual_overseer, leaf, test_state, is_new_session).await; + handle_leaf_activation( + virtual_overseer, + leaf, + test_state, + is_new_session, + hypothetical_frontier, + ) + .await; } async fn handle_leaf_activation( @@ -489,8 +528,18 @@ async fn handle_leaf_activation( leaf: &TestLeaf, test_state: &TestState, is_new_session: bool, + hypothetical_frontier: Vec<(HypotheticalCandidate, FragmentTreeMembership)>, ) { - let TestLeaf { number, hash, parent_hash, para_data, session, availability_cores } = leaf; + let TestLeaf { + number, + hash, + parent_hash, + para_data, + session, + availability_cores, + disabled_validators, + minimum_backing_votes, + } = leaf; assert_matches!( virtual_overseer.recv().await, @@ -530,51 +579,82 @@ async fn handle_leaf_activation( } ); - assert_matches!( - virtual_overseer.recv().await, - AllMessages::RuntimeApi( - RuntimeApiMessage::Request(parent, RuntimeApiRequest::SessionIndexForChild(tx))) if parent == *hash => { - tx.send(Ok(*session)).unwrap(); - } - ); - - assert_matches!( - virtual_overseer.recv().await, - AllMessages::RuntimeApi( - RuntimeApiMessage::Request(parent, RuntimeApiRequest::AvailabilityCores(tx))) if parent == *hash => { - tx.send(Ok(availability_cores.clone())).unwrap(); - } - ); - - let validator_groups = test_state.session_info.validator_groups.to_vec(); - let group_rotation_info = - GroupRotationInfo { session_start_block: 1, group_rotation_frequency: 12, now: 1 }; - assert_matches!( - virtual_overseer.recv().await, - AllMessages::RuntimeApi( - RuntimeApiMessage::Request(parent, RuntimeApiRequest::ValidatorGroups(tx))) if parent == *hash => { - tx.send(Ok((validator_groups, group_rotation_info))).unwrap(); - } - ); - - if is_new_session { - assert_matches!( - virtual_overseer.recv().await, - AllMessages::RuntimeApi( - RuntimeApiMessage::Request(parent, RuntimeApiRequest::SessionInfo(s, tx))) if parent == *hash && s == *session => { + loop { + match virtual_overseer.recv().await { + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + _parent, + RuntimeApiRequest::Version(tx), + )) => { + tx.send(Ok(RuntimeApiRequest::DISABLED_VALIDATORS_RUNTIME_REQUIREMENT)).unwrap(); + }, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + parent, + RuntimeApiRequest::DisabledValidators(tx), + )) if parent == *hash => { + tx.send(Ok(disabled_validators.clone())).unwrap(); + }, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + _parent, + RuntimeApiRequest::DisabledValidators(tx), + )) => { + tx.send(Ok(Vec::new())).unwrap(); + }, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + _parent, // assume all active leaves are in the same session + RuntimeApiRequest::SessionIndexForChild(tx), + )) => { + tx.send(Ok(*session)).unwrap(); + }, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + parent, + RuntimeApiRequest::SessionInfo(s, tx), + )) if parent == *hash && s == *session => { + assert!(is_new_session, "only expecting this call in a new session"); tx.send(Ok(Some(test_state.session_info.clone()))).unwrap(); - } - ); - - assert_matches!( - virtual_overseer.recv().await, + }, AllMessages::RuntimeApi(RuntimeApiMessage::Request( parent, RuntimeApiRequest::MinimumBackingVotes(session_index, tx), )) if parent == *hash && session_index == *session => { - tx.send(Ok(2)).unwrap(); - } - ); + assert!(is_new_session, "only expecting this call in a new session"); + tx.send(Ok(*minimum_backing_votes)).unwrap(); + }, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + parent, + RuntimeApiRequest::AvailabilityCores(tx), + )) if parent == *hash => { + tx.send(Ok(availability_cores.clone())).unwrap(); + }, + AllMessages::RuntimeApi(RuntimeApiMessage::Request( + parent, + RuntimeApiRequest::ValidatorGroups(tx), + )) if parent == *hash => { + let validator_groups = test_state.session_info.validator_groups.to_vec(); + let group_rotation_info = GroupRotationInfo { + session_start_block: 1, + group_rotation_frequency: 12, + now: 1, + }; + tx.send(Ok((validator_groups, group_rotation_info))).unwrap(); + }, + AllMessages::ProspectiveParachains( + ProspectiveParachainsMessage::GetHypotheticalFrontier(req, tx), + ) => { + assert_eq!(req.fragment_tree_relay_parent, Some(*hash)); + assert!(!req.backed_in_path_only); + for (i, (candidate, _)) in hypothetical_frontier.iter().enumerate() { + assert!( + req.candidates.iter().any(|c| &c == &candidate), + "did not receive request for hypothetical candidate {}", + i, + ); + } + tx.send(hypothetical_frontier).unwrap(); + // this is the last expected runtime api call + break + }, + msg => panic!("unexpected runtime API call: {msg:?}"), + } } } @@ -614,16 +694,14 @@ async fn handle_sent_request( async fn answer_expected_hypothetical_depth_request( virtual_overseer: &mut VirtualOverseer, responses: Vec<(HypotheticalCandidate, FragmentTreeMembership)>, - expected_leaf_hash: Option, - expected_backed_in_path_only: bool, ) { assert_matches!( virtual_overseer.recv().await, AllMessages::ProspectiveParachains( ProspectiveParachainsMessage::GetHypotheticalFrontier(req, tx) ) => { - assert_eq!(req.fragment_tree_relay_parent, expected_leaf_hash); - assert_eq!(req.backed_in_path_only, expected_backed_in_path_only); + assert_eq!(req.fragment_tree_relay_parent, None); + assert!(!req.backed_in_path_only); for (i, (candidate, _)) in responses.iter().enumerate() { assert!( req.candidates.iter().any(|c| &c == &candidate), diff --git a/polkadot/node/network/statement-distribution/src/v2/tests/requests.rs b/polkadot/node/network/statement-distribution/src/v2/tests/requests.rs index 1eec8290fab..04934b31482 100644 --- a/polkadot/node/network/statement-distribution/src/v2/tests/requests.rs +++ b/polkadot/node/network/statement-distribution/src/v2/tests/requests.rs @@ -86,15 +86,7 @@ fn cluster_peer_allowed_to_send_incomplete_statements() { send_peer_view_change(&mut overseer, peer_c.clone(), view![relay_parent]).await; } - activate_leaf(&mut overseer, &test_leaf, &state, true).await; - - answer_expected_hypothetical_depth_request( - &mut overseer, - vec![], - Some(relay_parent), - false, - ) - .await; + activate_leaf(&mut overseer, &test_leaf, &state, true, vec![]).await; // Peer in cluster sends a statement, triggering a request. { @@ -176,7 +168,7 @@ fn cluster_peer_allowed_to_send_incomplete_statements() { ); } - answer_expected_hypothetical_depth_request(&mut overseer, vec![], None, false).await; + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; overseer }); @@ -272,15 +264,7 @@ fn peer_reported_for_providing_statements_meant_to_be_masked_out() { send_peer_view_change(&mut overseer, peer_e.clone(), view![relay_parent]).await; } - activate_leaf(&mut overseer, &test_leaf, &state, true).await; - - answer_expected_hypothetical_depth_request( - &mut overseer, - vec![], - Some(relay_parent), - false, - ) - .await; + activate_leaf(&mut overseer, &test_leaf, &state, true, vec![]).await; // Send gossip topology. send_new_topology(&mut overseer, state.make_dummy_topology()).await; @@ -354,7 +338,7 @@ fn peer_reported_for_providing_statements_meant_to_be_masked_out() { if p == peer_c && r == BENEFIT_VALID_RESPONSE.into() ); - answer_expected_hypothetical_depth_request(&mut overseer, vec![], None, false).await; + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; } // Peer C advertises candidate 2. @@ -426,7 +410,7 @@ fn peer_reported_for_providing_statements_meant_to_be_masked_out() { if p == peer_c && r == BENEFIT_VALID_RESPONSE.into() ); - answer_expected_hypothetical_depth_request(&mut overseer, vec![], None, false).await; + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; } // Peer C sends an announcement for candidate 3. Should hit seconding limit for validator 1. @@ -537,15 +521,7 @@ fn peer_reported_for_not_enough_statements() { send_peer_view_change(&mut overseer, peer_e.clone(), view![relay_parent]).await; } - activate_leaf(&mut overseer, &test_leaf, &state, true).await; - - answer_expected_hypothetical_depth_request( - &mut overseer, - vec![], - Some(relay_parent), - false, - ) - .await; + activate_leaf(&mut overseer, &test_leaf, &state, true, vec![]).await; // Send gossip topology. send_new_topology(&mut overseer, state.make_dummy_topology()).await; @@ -657,7 +633,7 @@ fn peer_reported_for_not_enough_statements() { if p == peer_c && r == BENEFIT_VALID_RESPONSE.into() ); - answer_expected_hypothetical_depth_request(&mut overseer, vec![], None, false).await; + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; } overseer @@ -725,15 +701,7 @@ fn peer_reported_for_duplicate_statements() { send_peer_view_change(&mut overseer, peer_c.clone(), view![relay_parent]).await; } - activate_leaf(&mut overseer, &test_leaf, &state, true).await; - - answer_expected_hypothetical_depth_request( - &mut overseer, - vec![], - Some(relay_parent), - false, - ) - .await; + activate_leaf(&mut overseer, &test_leaf, &state, true, vec![]).await; // Peer in cluster sends a statement, triggering a request. { @@ -820,7 +788,7 @@ fn peer_reported_for_duplicate_statements() { ); } - answer_expected_hypothetical_depth_request(&mut overseer, vec![], None, false).await; + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; overseer }); @@ -887,15 +855,7 @@ fn peer_reported_for_providing_statements_with_invalid_signatures() { send_peer_view_change(&mut overseer, peer_c.clone(), view![relay_parent]).await; } - activate_leaf(&mut overseer, &test_leaf, &state, true).await; - - answer_expected_hypothetical_depth_request( - &mut overseer, - vec![], - Some(relay_parent), - false, - ) - .await; + activate_leaf(&mut overseer, &test_leaf, &state, true, vec![]).await; // Peer in cluster sends a statement, triggering a request. { @@ -958,7 +918,7 @@ fn peer_reported_for_providing_statements_with_invalid_signatures() { if p == peer_a && r == BENEFIT_VALID_RESPONSE.into() => { } ); - answer_expected_hypothetical_depth_request(&mut overseer, vec![], None, false).await; + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; } overseer @@ -1026,15 +986,7 @@ fn peer_reported_for_providing_statements_with_wrong_validator_id() { send_peer_view_change(&mut overseer, peer_c.clone(), view![relay_parent]).await; } - activate_leaf(&mut overseer, &test_leaf, &state, true).await; - - answer_expected_hypothetical_depth_request( - &mut overseer, - vec![], - Some(relay_parent), - false, - ) - .await; + activate_leaf(&mut overseer, &test_leaf, &state, true, vec![]).await; // Peer in cluster sends a statement, triggering a request. { @@ -1096,7 +1048,7 @@ fn peer_reported_for_providing_statements_with_wrong_validator_id() { if p == peer_a && r == BENEFIT_VALID_RESPONSE.into() => { } ); - answer_expected_hypothetical_depth_request(&mut overseer, vec![], None, false).await; + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; } overseer @@ -1104,26 +1056,31 @@ fn peer_reported_for_providing_statements_with_wrong_validator_id() { } #[test] -fn local_node_sanity_checks_incoming_requests() { +fn disabled_validators_added_to_unwanted_mask() { + let group_size = 3; let config = TestConfig { validator_count: 20, - group_size: 3, + group_size, local_validator: LocalRole::Validator, async_backing_params: None, }; let relay_parent = Hash::repeat_byte(1); - let peer_a = PeerId::random(); + let peer_disabled = PeerId::random(); let peer_b = PeerId::random(); - let peer_c = PeerId::random(); - let peer_d = PeerId::random(); - test_harness(config, |mut state, mut overseer| async move { + test_harness(config, |state, mut overseer| async move { let local_validator = state.local.clone().unwrap(); let local_group_index = local_validator.group_index.unwrap(); let local_para = ParaId::from(local_group_index.0); + let other_group_validators = state.group_validators(local_group_index, true); + let index_disabled = other_group_validators[0]; + let index_within_group = state.index_within_group(local_group_index, index_disabled); + let index_b = other_group_validators[1]; - let test_leaf = state.make_dummy_leaf(relay_parent); + let disabled_validators = vec![index_disabled]; + let test_leaf = + state.make_dummy_leaf_with_disabled_validators(relay_parent, disabled_validators); let (candidate, pvd) = make_candidate( relay_parent, @@ -1135,200 +1092,164 @@ fn local_node_sanity_checks_incoming_requests() { ); let candidate_hash = candidate.hash(); - // peer A is in group, has relay parent in view. - // peer B is in group, has no relay parent in view. - // peer C is not in group, has relay parent in view. + // peer A is in group, has relay parent in view and disabled. + // peer B is in group, has relay parent in view. { - let other_group_validators = state.group_validators(local_group_index, true); - connect_peer( &mut overseer, - peer_a.clone(), - Some(vec![state.discovery_id(other_group_validators[0])].into_iter().collect()), + peer_disabled.clone(), + Some(vec![state.discovery_id(index_disabled)].into_iter().collect()), ) .await; - connect_peer( &mut overseer, peer_b.clone(), - Some(vec![state.discovery_id(other_group_validators[1])].into_iter().collect()), + Some(vec![state.discovery_id(index_b)].into_iter().collect()), ) .await; - - connect_peer(&mut overseer, peer_c.clone(), None).await; - - send_peer_view_change(&mut overseer, peer_a.clone(), view![relay_parent]).await; - send_peer_view_change(&mut overseer, peer_c.clone(), view![relay_parent]).await; + send_peer_view_change(&mut overseer, peer_disabled.clone(), view![relay_parent]).await; + send_peer_view_change(&mut overseer, peer_b.clone(), view![relay_parent]).await; } - activate_leaf(&mut overseer, &test_leaf, &state, true).await; - - answer_expected_hypothetical_depth_request( - &mut overseer, - vec![], - Some(relay_parent), - false, - ) - .await; + activate_leaf(&mut overseer, &test_leaf, &state, true, vec![]).await; - let mask = StatementFilter::blank(state.config.group_size); + let seconded_disabled = state + .sign_statement( + index_disabled, + CompactStatement::Seconded(candidate_hash), + &SigningContext { parent_hash: relay_parent, session_index: 1 }, + ) + .as_unchecked() + .clone(); - // Should drop requests for unknown candidates. + let seconded_b = state + .sign_statement( + index_b, + CompactStatement::Seconded(candidate_hash), + &SigningContext { parent_hash: relay_parent, session_index: 1 }, + ) + .as_unchecked() + .clone(); { - let (pending_response, rx) = oneshot::channel(); - state - .req_sender - .send(RawIncomingRequest { - // Request from peer that received manifest. - peer: peer_c, - payload: request_v2::AttestedCandidateRequest { - candidate_hash: candidate.hash(), - mask: mask.clone(), - } - .encode(), - pending_response, - }) - .await - .unwrap(); + send_peer_message( + &mut overseer, + peer_disabled.clone(), + protocol_v2::StatementDistributionMessage::Statement( + relay_parent, + seconded_disabled.clone(), + ), + ) + .await; - assert_matches!(rx.await, Err(oneshot::Canceled)); + assert_matches!( + overseer.recv().await, + AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::ReportPeer(ReportPeerMessage::Single(p, r))) + if p == peer_disabled && r == COST_DISABLED_VALIDATOR.into() => { } + ); } - // Confirm candidate. { - let full_signed = state - .sign_statement( - local_validator.validator_index, - CompactStatement::Seconded(candidate_hash), - &SigningContext { session_index: 1, parent_hash: relay_parent }, - ) - .convert_to_superpayload(StatementWithPVD::Seconded(candidate.clone(), pvd.clone())) - .unwrap(); - - overseer - .send(FromOrchestra::Communication { - msg: StatementDistributionMessage::Share(relay_parent, full_signed), - }) - .await; + send_peer_message( + &mut overseer, + peer_b.clone(), + protocol_v2::StatementDistributionMessage::Statement( + relay_parent, + seconded_b.clone(), + ), + ) + .await; assert_matches!( overseer.recv().await, - AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::SendValidationMessage( - peers, - Versioned::V2(protocol_v2::ValidationProtocol::StatementDistribution( - protocol_v2::StatementDistributionMessage::Statement( - r, - s, - ) - )) - )) => { - assert_eq!(peers, vec![peer_a.clone()]); - assert_eq!(r, relay_parent); - assert_eq!(s.unchecked_payload(), &CompactStatement::Seconded(candidate_hash)); - assert_eq!(s.unchecked_validator_index(), local_validator.validator_index); - } + AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::ReportPeer(ReportPeerMessage::Single(p, r))) + if p == peer_b && r == BENEFIT_VALID_STATEMENT_FIRST.into() => { } ); - - answer_expected_hypothetical_depth_request(&mut overseer, vec![], None, false).await; } - // Should drop requests from unknown peers. + // Send a request to peer and mock its response with a statement from disabled validator. { - let (pending_response, rx) = oneshot::channel(); - state - .req_sender - .send(RawIncomingRequest { - // Request from peer that received manifest. - peer: peer_d, - payload: request_v2::AttestedCandidateRequest { - candidate_hash: candidate.hash(), - mask: mask.clone(), - } - .encode(), - pending_response, - }) - .await - .unwrap(); - - assert_matches!(rx.await, Err(oneshot::Canceled)); - } + let statements = vec![seconded_disabled]; + let mut mask = StatementFilter::blank(group_size); + let i = index_within_group.unwrap(); + mask.seconded_in_group.set(i, true); + mask.validated_in_group.set(i, true); - // Should drop requests with bitfields of the wrong size. - { - let mask = StatementFilter::blank(state.config.group_size + 1); - let response = state - .send_request( - peer_c, - request_v2::AttestedCandidateRequest { candidate_hash: candidate.hash(), mask }, - ) - .await - .await; + handle_sent_request( + &mut overseer, + peer_b, + candidate_hash, + mask, + candidate.clone(), + pvd.clone(), + statements, + ) + .await; assert_matches!( - response, - RawOutgoingResponse { - result, - reputation_changes, - sent_feedback - } => { - assert_matches!(result, Err(())); - assert_eq!(reputation_changes, vec![COST_INVALID_REQUEST_BITFIELD_SIZE.into()]); - assert_matches!(sent_feedback, None); - } + overseer.recv().await, + AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::ReportPeer(ReportPeerMessage::Single(p, r))) + if p == peer_b && r == COST_UNREQUESTED_RESPONSE_STATEMENT.into() => { } ); - } - // Local node should reject requests if we did not send a manifest to that peer. - { - let response = state - .send_request( - peer_c, - request_v2::AttestedCandidateRequest { - candidate_hash: candidate.hash(), - mask: mask.clone(), - }, - ) - .await - .await; + assert_matches!( + overseer.recv().await, + AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::ReportPeer(ReportPeerMessage::Single(p, r))) + if p == peer_b && r == BENEFIT_VALID_RESPONSE.into() => { } + ); - // Should get `COST_UNEXPECTED_REQUEST` response. assert_matches!( - response, - RawOutgoingResponse { - result, - reputation_changes, - sent_feedback - } => { - assert_matches!(result, Err(())); - assert_eq!(reputation_changes, vec![COST_UNEXPECTED_REQUEST.into()]); - assert_matches!(sent_feedback, None); + overseer.recv().await, + AllMessages:: NetworkBridgeTx( + NetworkBridgeTxMessage::SendValidationMessage( + peers, + Versioned::V2( + protocol_v2::ValidationProtocol::StatementDistribution( + protocol_v2::StatementDistributionMessage::Statement(hash, statement), + ), + ), + ) + ) => { + assert_eq!(peers, vec![peer_disabled]); + assert_eq!(hash, relay_parent); + assert_eq!(statement, seconded_b); } ); + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; } overseer }); } +// We send a request to a peer and after receiving the response +// we learn about a validator being disabled. We should filter out +// the statement from the disabled validator when receiving it. #[test] -fn local_node_checks_that_peer_can_request_before_responding() { +fn when_validator_disabled_after_sending_the_request() { + let group_size = 3; let config = TestConfig { validator_count: 20, - group_size: 3, + group_size, local_validator: LocalRole::Validator, async_backing_params: None, }; let relay_parent = Hash::repeat_byte(1); - let peer_a = PeerId::random(); + let another_relay_parent = Hash::repeat_byte(2); + let peer_disabled_later = PeerId::random(); let peer_b = PeerId::random(); - test_harness(config, |mut state, mut overseer| async move { + test_harness(config, |state, mut overseer| async move { let local_validator = state.local.clone().unwrap(); let local_group_index = local_validator.group_index.unwrap(); let local_para = ParaId::from(local_group_index.0); + let other_group_validators = state.group_validators(local_group_index, true); + let index_disabled = other_group_validators[0]; + let index_b = other_group_validators[1]; - let test_leaf = state.make_dummy_leaf(relay_parent); + let test_leaf = state.make_dummy_leaf_with_disabled_validators(relay_parent, vec![]); + let test_leaf_disabled = state + .make_dummy_leaf_with_disabled_validators(another_relay_parent, vec![index_disabled]); let (candidate, pvd) = make_candidate( relay_parent, @@ -1340,20 +1261,733 @@ fn local_node_checks_that_peer_can_request_before_responding() { ); let candidate_hash = candidate.hash(); - // Peers A and B are in group and have relay parent in view. - let other_group_validators = state.group_validators(local_group_index, true); + // peer A is in group, has relay parent in view and disabled later. + // peer B is in group, has relay parent in view. + { + connect_peer( + &mut overseer, + peer_disabled_later.clone(), + Some(vec![state.discovery_id(index_disabled)].into_iter().collect()), + ) + .await; + connect_peer( + &mut overseer, + peer_b.clone(), + Some(vec![state.discovery_id(index_b)].into_iter().collect()), + ) + .await; + send_peer_view_change(&mut overseer, peer_disabled_later.clone(), view![relay_parent]) + .await; + send_peer_view_change(&mut overseer, peer_b.clone(), view![relay_parent]).await; + } - connect_peer( - &mut overseer, - peer_a.clone(), - Some(vec![state.discovery_id(other_group_validators[0])].into_iter().collect()), - ) - .await; + activate_leaf(&mut overseer, &test_leaf, &state, true, vec![]).await; - connect_peer( - &mut overseer, - peer_b.clone(), - Some(vec![state.discovery_id(other_group_validators[1])].into_iter().collect()), + let seconded_disabled = state + .sign_statement( + index_disabled, + CompactStatement::Seconded(candidate_hash), + &SigningContext { parent_hash: relay_parent, session_index: 1 }, + ) + .as_unchecked() + .clone(); + + let seconded_b = state + .sign_statement( + index_b, + CompactStatement::Seconded(candidate_hash), + &SigningContext { parent_hash: relay_parent, session_index: 1 }, + ) + .as_unchecked() + .clone(); + { + send_peer_message( + &mut overseer, + peer_b.clone(), + protocol_v2::StatementDistributionMessage::Statement( + relay_parent, + seconded_b.clone(), + ), + ) + .await; + + assert_matches!( + overseer.recv().await, + AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::ReportPeer(ReportPeerMessage::Single(p, r))) + if p == peer_b && r == BENEFIT_VALID_STATEMENT_FIRST.into() => { } + ); + } + + // Send a request to peer and activate leaf when a validator is disabled; + // mock the response with a statement from disabled validator. + { + let statements = vec![seconded_disabled]; + let mask = StatementFilter::blank(group_size); + + assert_matches!( + overseer.recv().await, + AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::SendRequests(mut requests, IfDisconnected::ImmediateError)) => { + assert_eq!(requests.len(), 1); + assert_matches!( + requests.pop().unwrap(), + Requests::AttestedCandidateV2(outgoing) => { + assert_eq!(outgoing.peer, Recipient::Peer(peer_b)); + assert_eq!(outgoing.payload.candidate_hash, candidate_hash); + assert_eq!(outgoing.payload.mask, mask); + + activate_leaf(&mut overseer, &test_leaf_disabled, &state, false, vec![]).await; + + let res = AttestedCandidateResponse { + candidate_receipt: candidate, + persisted_validation_data: pvd, + statements, + }; + outgoing.pending_response.send(Ok(res.encode())).unwrap(); + } + ); + } + ); + + assert_matches!( + overseer.recv().await, + AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::ReportPeer(ReportPeerMessage::Single(p, r))) + if p == peer_b && r == BENEFIT_VALID_RESPONSE.into() => { } + ); + + assert_matches!( + overseer.recv().await, + AllMessages:: NetworkBridgeTx( + NetworkBridgeTxMessage::SendValidationMessage( + peers, + Versioned::V2( + protocol_v2::ValidationProtocol::StatementDistribution( + protocol_v2::StatementDistributionMessage::Statement(hash, statement), + ), + ), + ) + ) => { + assert_eq!(peers, vec![peer_disabled_later]); + assert_eq!(hash, relay_parent); + assert_eq!(statement, seconded_b); + } + ); + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; + } + + overseer + }); +} + +#[test] +fn no_response_for_grid_request_not_meeting_quorum() { + let validator_count = 6; + let group_size = 3; + let config = TestConfig { + validator_count, + group_size, + local_validator: LocalRole::Validator, + async_backing_params: None, + }; + + let relay_parent = Hash::repeat_byte(1); + let peer_a = PeerId::random(); + let peer_b = PeerId::random(); + let peer_c = PeerId::random(); + + test_harness(config, |mut state, mut overseer| async move { + let local_validator = state.local.clone().unwrap(); + let local_group_index = local_validator.group_index.unwrap(); + let local_para = ParaId::from(local_group_index.0); + + let test_leaf = state.make_dummy_leaf_with_min_backing_votes(relay_parent, 2); + + let (candidate, pvd) = make_candidate( + relay_parent, + 1, + local_para, + test_leaf.para_data(local_para).head_data.clone(), + vec![4, 5, 6].into(), + Hash::repeat_byte(42).into(), + ); + let candidate_hash = candidate.hash(); + + let other_group_validators = state.group_validators(local_group_index, true); + let target_group_validators = + state.group_validators((local_group_index.0 + 1).into(), true); + let v_a = other_group_validators[0]; + let v_b = other_group_validators[1]; + let v_c = target_group_validators[0]; + + // peer A is in group, has relay parent in view. + // peer B is in group, has no relay parent in view. + // peer C is not in group, has relay parent in view. + { + connect_peer( + &mut overseer, + peer_a.clone(), + Some(vec![state.discovery_id(v_a)].into_iter().collect()), + ) + .await; + + connect_peer( + &mut overseer, + peer_b.clone(), + Some(vec![state.discovery_id(v_b)].into_iter().collect()), + ) + .await; + + connect_peer( + &mut overseer, + peer_c.clone(), + Some(vec![state.discovery_id(v_c)].into_iter().collect()), + ) + .await; + + send_peer_view_change(&mut overseer, peer_a.clone(), view![relay_parent]).await; + send_peer_view_change(&mut overseer, peer_c.clone(), view![relay_parent]).await; + } + + activate_leaf(&mut overseer, &test_leaf, &state, true, vec![]).await; + + // Send gossip topology. + send_new_topology(&mut overseer, state.make_dummy_topology()).await; + + // Confirm the candidate locally so that we don't send out requests. + { + let statement = state + .sign_full_statement( + local_validator.validator_index, + Statement::Seconded(candidate.clone()), + &SigningContext { parent_hash: relay_parent, session_index: 1 }, + pvd.clone(), + ) + .clone(); + + overseer + .send(FromOrchestra::Communication { + msg: StatementDistributionMessage::Share(relay_parent, statement), + }) + .await; + + assert_matches!( + overseer.recv().await, + AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::SendValidationMessage(peers, _)) if peers == vec![peer_a] + ); + + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; + } + + // Send enough statements to make candidate backable, make sure announcements are sent. + + // Send statement from peer A. + { + let statement = state + .sign_statement( + v_a, + CompactStatement::Seconded(candidate_hash), + &SigningContext { parent_hash: relay_parent, session_index: 1 }, + ) + .as_unchecked() + .clone(); + + send_peer_message( + &mut overseer, + peer_a.clone(), + protocol_v2::StatementDistributionMessage::Statement(relay_parent, statement), + ) + .await; + + assert_matches!( + overseer.recv().await, + AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::ReportPeer(ReportPeerMessage::Single(p, r))) + if p == peer_a && r == BENEFIT_VALID_STATEMENT_FIRST.into() => { } + ); + } + + // Send statement from peer B. + let statement_b = state + .sign_statement( + v_b, + CompactStatement::Seconded(candidate_hash), + &SigningContext { parent_hash: relay_parent, session_index: 1 }, + ) + .as_unchecked() + .clone(); + { + send_peer_message( + &mut overseer, + peer_b.clone(), + protocol_v2::StatementDistributionMessage::Statement( + relay_parent, + statement_b.clone(), + ), + ) + .await; + + assert_matches!( + overseer.recv().await, + AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::ReportPeer(ReportPeerMessage::Single(p, r))) + if p == peer_b && r == BENEFIT_VALID_STATEMENT_FIRST.into() => { } + ); + + assert_matches!( + overseer.recv().await, + AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::SendValidationMessage(peers, _)) if peers == vec![peer_a] + ); + } + + // Send Backed notification. + { + overseer + .send(FromOrchestra::Communication { + msg: StatementDistributionMessage::Backed(candidate_hash), + }) + .await; + + assert_matches!( + overseer.recv().await, + AllMessages:: NetworkBridgeTx( + NetworkBridgeTxMessage::SendValidationMessage( + peers, + Versioned::V2( + protocol_v2::ValidationProtocol::StatementDistribution( + protocol_v2::StatementDistributionMessage::BackedCandidateManifest(manifest), + ), + ), + ) + ) => { + assert_eq!(peers, vec![peer_c]); + assert_eq!(manifest, BackedCandidateManifest { + relay_parent, + candidate_hash, + group_index: local_validator.group_index.unwrap(), + para_id: local_para, + parent_head_data_hash: pvd.parent_head.hash(), + statement_knowledge: StatementFilter { + seconded_in_group: bitvec::bitvec![u8, Lsb0; 1, 1, 1], + validated_in_group: bitvec::bitvec![u8, Lsb0; 0, 0, 0], + }, + }); + } + ); + + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; + } + + let mask = StatementFilter { + seconded_in_group: bitvec::bitvec![u8, Lsb0; 0, 0, 1], + validated_in_group: bitvec::bitvec![u8, Lsb0; 0, 0, 0], + }; + + let relay_2 = Hash::repeat_byte(2); + let disabled_validators = vec![v_a]; + let leaf_2 = state.make_dummy_leaf_with_disabled_validators(relay_2, disabled_validators); + activate_leaf(&mut overseer, &leaf_2, &state, false, vec![]).await; + + // Incoming request to local node. Local node should not send the response as v_a is + // disabled and hence the quorum is not reached. + { + let response = state + .send_request( + peer_c, + request_v2::AttestedCandidateRequest { candidate_hash: candidate.hash(), mask }, + ) + .await + .await; + + assert!( + response.is_none(), + "We should not send a response as the quorum is not reached yet" + ); + } + + overseer + }); +} + +#[test] +fn disabling_works_from_the_latest_state_not_relay_parent() { + let group_size = 3; + let config = TestConfig { + validator_count: 20, + group_size, + local_validator: LocalRole::Validator, + async_backing_params: None, + }; + + let relay_1 = Hash::repeat_byte(1); + let relay_2 = Hash::repeat_byte(2); + let peer_disabled = PeerId::random(); + + test_harness(config, |state, mut overseer| async move { + let local_validator = state.local.clone().unwrap(); + let local_group_index = local_validator.group_index.unwrap(); + let local_para = ParaId::from(local_group_index.0); + + let other_group_validators = state.group_validators(local_group_index, true); + let index_disabled = other_group_validators[0]; + + let leaf_1 = state.make_dummy_leaf(relay_1); + let disabled_validators = vec![index_disabled]; + let leaf_2 = state.make_dummy_leaf_with_disabled_validators(relay_2, disabled_validators); + + let (candidate_1, pvd_1) = make_candidate( + relay_1, + 1, + local_para, + leaf_1.para_data(local_para).head_data.clone(), + vec![4, 5, 6].into(), + Hash::repeat_byte(42).into(), + ); + let candidate_1_hash = candidate_1.hash(); + + let (candidate_2, _) = make_candidate( + relay_1, + 1, + local_para, + leaf_1.para_data(local_para).head_data.clone(), + vec![4, 5, 6, 7].into(), + Hash::repeat_byte(42).into(), + ); + let candidate_2_hash = candidate_2.hash(); + + { + connect_peer( + &mut overseer, + peer_disabled.clone(), + Some(vec![state.discovery_id(index_disabled)].into_iter().collect()), + ) + .await; + send_peer_view_change(&mut overseer, peer_disabled.clone(), view![relay_1]).await; + } + + activate_leaf(&mut overseer, &leaf_1, &state, true, vec![]).await; + + let seconded_1 = state + .sign_statement( + index_disabled, + CompactStatement::Seconded(candidate_1_hash), + &SigningContext { parent_hash: relay_1, session_index: 1 }, + ) + .as_unchecked() + .clone(); + + let seconded_2 = state + .sign_statement( + index_disabled, + CompactStatement::Seconded(candidate_2_hash), + &SigningContext { parent_hash: relay_1, session_index: 1 }, + ) + .as_unchecked() + .clone(); + { + send_peer_message( + &mut overseer, + peer_disabled.clone(), + protocol_v2::StatementDistributionMessage::Statement(relay_1, seconded_1.clone()), + ) + .await; + + assert_matches!( + overseer.recv().await, + AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::ReportPeer(ReportPeerMessage::Single(p, r))) + if p == peer_disabled && r == BENEFIT_VALID_STATEMENT_FIRST.into() => { } + ); + } + + { + handle_sent_request( + &mut overseer, + peer_disabled, + candidate_1_hash, + StatementFilter::blank(group_size), + candidate_1.clone(), + pvd_1.clone(), + vec![seconded_1.clone()], + ) + .await; + + assert_matches!( + overseer.recv().await, + AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::ReportPeer(ReportPeerMessage::Single(p, r))) + if p == peer_disabled && r == BENEFIT_VALID_STATEMENT.into() => { } + ); + + assert_matches!( + overseer.recv().await, + AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::ReportPeer(ReportPeerMessage::Single(p, r))) + if p == peer_disabled && r == BENEFIT_VALID_RESPONSE.into() => { } + ); + + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; + } + + activate_leaf(&mut overseer, &leaf_2, &state, false, vec![]).await; + + { + send_peer_message( + &mut overseer, + peer_disabled.clone(), + protocol_v2::StatementDistributionMessage::Statement(relay_1, seconded_2.clone()), + ) + .await; + + assert_matches!( + overseer.recv().await, + AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::ReportPeer(ReportPeerMessage::Single(p, r))) + if p == peer_disabled && r == COST_DISABLED_VALIDATOR.into() => { } + ); + } + + overseer + }); +} + +#[test] +fn local_node_sanity_checks_incoming_requests() { + let config = TestConfig { + validator_count: 20, + group_size: 3, + local_validator: LocalRole::Validator, + async_backing_params: None, + }; + + let relay_parent = Hash::repeat_byte(1); + let peer_a = PeerId::random(); + let peer_b = PeerId::random(); + let peer_c = PeerId::random(); + let peer_d = PeerId::random(); + + test_harness(config, |mut state, mut overseer| async move { + let local_validator = state.local.clone().unwrap(); + let local_group_index = local_validator.group_index.unwrap(); + let local_para = ParaId::from(local_group_index.0); + + let test_leaf = state.make_dummy_leaf(relay_parent); + + let (candidate, pvd) = make_candidate( + relay_parent, + 1, + local_para, + test_leaf.para_data(local_para).head_data.clone(), + vec![4, 5, 6].into(), + Hash::repeat_byte(42).into(), + ); + let candidate_hash = candidate.hash(); + + // peer A is in group, has relay parent in view. + // peer B is in group, has no relay parent in view. + // peer C is not in group, has relay parent in view. + { + let other_group_validators = state.group_validators(local_group_index, true); + + connect_peer( + &mut overseer, + peer_a.clone(), + Some(vec![state.discovery_id(other_group_validators[0])].into_iter().collect()), + ) + .await; + + connect_peer( + &mut overseer, + peer_b.clone(), + Some(vec![state.discovery_id(other_group_validators[1])].into_iter().collect()), + ) + .await; + + connect_peer(&mut overseer, peer_c.clone(), None).await; + + send_peer_view_change(&mut overseer, peer_a.clone(), view![relay_parent]).await; + send_peer_view_change(&mut overseer, peer_c.clone(), view![relay_parent]).await; + } + + activate_leaf(&mut overseer, &test_leaf, &state, true, vec![]).await; + + let mask = StatementFilter::blank(state.config.group_size); + + // Should drop requests for unknown candidates. + { + let (pending_response, rx) = oneshot::channel(); + state + .req_sender + .send(RawIncomingRequest { + // Request from peer that received manifest. + peer: peer_c, + payload: request_v2::AttestedCandidateRequest { + candidate_hash: candidate.hash(), + mask: mask.clone(), + } + .encode(), + pending_response, + }) + .await + .unwrap(); + + assert_matches!(rx.await, Err(oneshot::Canceled)); + } + + // Confirm candidate. + { + let full_signed = state + .sign_statement( + local_validator.validator_index, + CompactStatement::Seconded(candidate_hash), + &SigningContext { session_index: 1, parent_hash: relay_parent }, + ) + .convert_to_superpayload(StatementWithPVD::Seconded(candidate.clone(), pvd.clone())) + .unwrap(); + + overseer + .send(FromOrchestra::Communication { + msg: StatementDistributionMessage::Share(relay_parent, full_signed), + }) + .await; + + assert_matches!( + overseer.recv().await, + AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::SendValidationMessage( + peers, + Versioned::V2(protocol_v2::ValidationProtocol::StatementDistribution( + protocol_v2::StatementDistributionMessage::Statement( + r, + s, + ) + )) + )) => { + assert_eq!(peers, vec![peer_a.clone()]); + assert_eq!(r, relay_parent); + assert_eq!(s.unchecked_payload(), &CompactStatement::Seconded(candidate_hash)); + assert_eq!(s.unchecked_validator_index(), local_validator.validator_index); + } + ); + + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; + } + + // Should drop requests from unknown peers. + { + let (pending_response, rx) = oneshot::channel(); + state + .req_sender + .send(RawIncomingRequest { + // Request from peer that received manifest. + peer: peer_d, + payload: request_v2::AttestedCandidateRequest { + candidate_hash: candidate.hash(), + mask: mask.clone(), + } + .encode(), + pending_response, + }) + .await + .unwrap(); + + assert_matches!(rx.await, Err(oneshot::Canceled)); + } + + // Should drop requests with bitfields of the wrong size. + { + let mask = StatementFilter::blank(state.config.group_size + 1); + let response = state + .send_request( + peer_c, + request_v2::AttestedCandidateRequest { candidate_hash: candidate.hash(), mask }, + ) + .await + .await + .unwrap(); + + assert_matches!( + response, + RawOutgoingResponse { + result, + reputation_changes, + sent_feedback + } => { + assert_matches!(result, Err(())); + assert_eq!(reputation_changes, vec![COST_INVALID_REQUEST_BITFIELD_SIZE.into()]); + assert_matches!(sent_feedback, None); + } + ); + } + + // Local node should reject requests if we did not send a manifest to that peer. + { + let response = state + .send_request( + peer_c, + request_v2::AttestedCandidateRequest { + candidate_hash: candidate.hash(), + mask: mask.clone(), + }, + ) + .await + .await + .unwrap(); + + // Should get `COST_UNEXPECTED_REQUEST` response. + assert_matches!( + response, + RawOutgoingResponse { + result, + reputation_changes, + sent_feedback + } => { + assert_matches!(result, Err(())); + assert_eq!(reputation_changes, vec![COST_UNEXPECTED_REQUEST.into()]); + assert_matches!(sent_feedback, None); + } + ); + } + + overseer + }); +} + +#[test] +fn local_node_checks_that_peer_can_request_before_responding() { + let config = TestConfig { + validator_count: 20, + group_size: 3, + local_validator: LocalRole::Validator, + async_backing_params: None, + }; + + let relay_parent = Hash::repeat_byte(1); + let peer_a = PeerId::random(); + let peer_b = PeerId::random(); + + test_harness(config, |mut state, mut overseer| async move { + let local_validator = state.local.clone().unwrap(); + let local_group_index = local_validator.group_index.unwrap(); + let local_para = ParaId::from(local_group_index.0); + + let test_leaf = state.make_dummy_leaf(relay_parent); + + let (candidate, pvd) = make_candidate( + relay_parent, + 1, + local_para, + test_leaf.para_data(local_para).head_data.clone(), + vec![4, 5, 6].into(), + Hash::repeat_byte(42).into(), + ); + let candidate_hash = candidate.hash(); + + // Peers A and B are in group and have relay parent in view. + let other_group_validators = state.group_validators(local_group_index, true); + + connect_peer( + &mut overseer, + peer_a.clone(), + Some(vec![state.discovery_id(other_group_validators[0])].into_iter().collect()), + ) + .await; + + connect_peer( + &mut overseer, + peer_b.clone(), + Some(vec![state.discovery_id(other_group_validators[1])].into_iter().collect()), ) .await; let peer_b_index = other_group_validators[1]; @@ -1362,15 +1996,7 @@ fn local_node_checks_that_peer_can_request_before_responding() { send_peer_view_change(&mut overseer, peer_b.clone(), view![relay_parent]).await; // Finish setup - activate_leaf(&mut overseer, &test_leaf, &state, true).await; - - answer_expected_hypothetical_depth_request( - &mut overseer, - vec![], - Some(relay_parent), - false, - ) - .await; + activate_leaf(&mut overseer, &test_leaf, &state, true, vec![]).await; let mask = StatementFilter::blank(state.config.group_size); @@ -1409,7 +2035,7 @@ fn local_node_checks_that_peer_can_request_before_responding() { } ); - answer_expected_hypothetical_depth_request(&mut overseer, vec![], None, false).await; + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; // Local node should respond to requests from peers in the same group // which appear to not have already seen the candidate @@ -1424,7 +2050,8 @@ fn local_node_checks_that_peer_can_request_before_responding() { }, ) .await - .await; + .await + .unwrap(); let expected_statements = vec![signed.into_unchecked()]; assert_matches!(response, full_response => { @@ -1473,7 +2100,8 @@ fn local_node_checks_that_peer_can_request_before_responding() { }, ) .await - .await; + .await + .unwrap(); // Peer already knows about this candidate. Should reject. assert_matches!( @@ -1535,7 +2163,7 @@ fn local_node_respects_statement_mask() { let local_group_index = local_validator.group_index.unwrap(); let local_para = ParaId::from(local_group_index.0); - let test_leaf = state.make_dummy_leaf(relay_parent); + let test_leaf = state.make_dummy_leaf_with_min_backing_votes(relay_parent, 2); let (candidate, pvd) = make_candidate( relay_parent, @@ -1592,15 +2220,7 @@ fn local_node_respects_statement_mask() { send_peer_view_change(&mut overseer, peer_c.clone(), view![relay_parent]).await; } - activate_leaf(&mut overseer, &test_leaf, &state, true).await; - - answer_expected_hypothetical_depth_request( - &mut overseer, - vec![], - Some(relay_parent), - false, - ) - .await; + activate_leaf(&mut overseer, &test_leaf, &state, true, vec![]).await; // Send gossip topology. send_new_topology(&mut overseer, state.make_dummy_topology()).await; @@ -1627,26 +2247,28 @@ fn local_node_respects_statement_mask() { AllMessages::NetworkBridgeTx(NetworkBridgeTxMessage::SendValidationMessage(peers, _)) if peers == vec![peer_a] ); - answer_expected_hypothetical_depth_request(&mut overseer, vec![], None, false).await; + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; } // Send enough statements to make candidate backable, make sure announcements are sent. // Send statement from peer A. + let statement_a = state + .sign_statement( + v_a, + CompactStatement::Seconded(candidate_hash), + &SigningContext { parent_hash: relay_parent, session_index: 1 }, + ) + .as_unchecked() + .clone(); { - let statement = state - .sign_statement( - v_a, - CompactStatement::Seconded(candidate_hash), - &SigningContext { parent_hash: relay_parent, session_index: 1 }, - ) - .as_unchecked() - .clone(); - send_peer_message( &mut overseer, peer_a.clone(), - protocol_v2::StatementDistributionMessage::Statement(relay_parent, statement), + protocol_v2::StatementDistributionMessage::Statement( + relay_parent, + statement_a.clone(), + ), ) .await; @@ -1724,12 +2346,12 @@ fn local_node_respects_statement_mask() { } ); - answer_expected_hypothetical_depth_request(&mut overseer, vec![], None, false).await; + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; } // `1` indicates statements NOT to request. let mask = StatementFilter { - seconded_in_group: bitvec::bitvec![u8, Lsb0; 1, 0, 1], + seconded_in_group: bitvec::bitvec![u8, Lsb0; 0, 0, 1], validated_in_group: bitvec::bitvec![u8, Lsb0; 0, 0, 0], }; @@ -1741,9 +2363,10 @@ fn local_node_respects_statement_mask() { request_v2::AttestedCandidateRequest { candidate_hash: candidate.hash(), mask }, ) .await - .await; + .await + .unwrap(); - let expected_statements = vec![statement_b]; + let expected_statements = vec![statement_a, statement_b]; assert_matches!(response, full_response => { // Response is the same for v2. let request_v2::AttestedCandidateResponse { candidate_receipt, persisted_validation_data, statements } = @@ -1837,15 +2460,7 @@ fn should_delay_before_retrying_dropped_requests() { send_peer_view_change(&mut overseer, peer_e.clone(), view![relay_parent]).await; } - activate_leaf(&mut overseer, &test_leaf, &state, true).await; - - answer_expected_hypothetical_depth_request( - &mut overseer, - vec![], - Some(relay_parent), - false, - ) - .await; + activate_leaf(&mut overseer, &test_leaf, &state, true, vec![]).await; // Send gossip topology. send_new_topology(&mut overseer, state.make_dummy_topology()).await; @@ -1984,7 +2599,7 @@ fn should_delay_before_retrying_dropped_requests() { if p == peer_c && r == BENEFIT_VALID_RESPONSE.into() ); - answer_expected_hypothetical_depth_request(&mut overseer, vec![], None, false).await; + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; } // Sleep for the given amount of time. This should reset the delay for the first candidate. @@ -2051,7 +2666,7 @@ fn should_delay_before_retrying_dropped_requests() { if p == peer_c && r == BENEFIT_VALID_RESPONSE.into() ); - answer_expected_hypothetical_depth_request(&mut overseer, vec![], None, false).await; + answer_expected_hypothetical_depth_request(&mut overseer, vec![]).await; } overseer diff --git a/polkadot/roadmap/implementers-guide/src/node/backing/statement-distribution.md b/polkadot/roadmap/implementers-guide/src/node/backing/statement-distribution.md index 86a1bf12141..e6e597c5317 100644 --- a/polkadot/roadmap/implementers-guide/src/node/backing/statement-distribution.md +++ b/polkadot/roadmap/implementers-guide/src/node/backing/statement-distribution.md @@ -123,6 +123,31 @@ only send "importable" statements to the backing subsystem itself. backable and part of the hypothetical frontier. - Note that requesting is not an implicit acknowledgement, and an explicit acknowledgement must be sent upon receipt. +### Disabled validators + +After a validator is disabled in the runtime, other validators should no longer +accept statements from it. Filtering out of statements from disabled validators +on the node side is purely an optimization, as it will be done in the runtime +as well. + +Because we use the state of the active leaves to +check whether a validator is disabled instead of the relay parent, the notion +of being disabled is inherently racy: +- the responder has learned about the disabled validator before the requester +- the receiver has witnessed the disabled validator after sending the request + +We could have sent a manifest to a peer, then received information about +disabling, and then receive a request. This can break an invariant of the grid +mode: +- the response is required to indicate quorum + +Due to the above, there should be no response at all for grid requests when +the backing threshold is no longer met as a result of disabled validators. +In addition to that, we add disabled validators to the request's unwanted +mask. This ensures that the sender will not send statements from disabled +validators (at least from the perspective of the receiver at the moment of the +request). This doesn't fully avoid race conditions, but tries to minimize them. + ## Messages ### Incoming diff --git a/polkadot/zombienet_tests/functional/0010-validator-disabling.toml b/polkadot/zombienet_tests/functional/0010-validator-disabling.toml new file mode 100644 index 00000000000..6701d60d74d --- /dev/null +++ b/polkadot/zombienet_tests/functional/0010-validator-disabling.toml @@ -0,0 +1,39 @@ +[settings] +timeout = 1000 +bootnode = true + +[relaychain.genesis.runtimeGenesis.patch.configuration.config] + max_validators_per_core = 1 + needed_approvals = 2 + group_rotation_frequency = 10 + +[relaychain] +default_image = "{{ZOMBIENET_INTEGRATION_TEST_IMAGE}}" +chain = "westend-local" # for the disabling to take an effect +default_command = "polkadot" + +[relaychain.default_resources] +limits = { memory = "4G", cpu = "2" } +requests = { memory = "2G", cpu = "1" } + + [[relaychain.node_groups]] + name = "honest-validator" + count = 3 + args = ["-lparachain=debug"] + + [[relaychain.node_groups]] + image = "{{MALUS_IMAGE}}" + name = "malus-validator" + command = "malus suggest-garbage-candidate" + args = ["-lMALUS=trace"] + count = 1 + +[[parachains]] +id = 1000 +cumulus_based = true + + [parachains.collator] + name = "alice" + command = "polkadot-parachain" + image = "{{CUMULUS_IMAGE}}" + args = ["-lparachain=debug"] diff --git a/polkadot/zombienet_tests/functional/0010-validator-disabling.zndsl b/polkadot/zombienet_tests/functional/0010-validator-disabling.zndsl new file mode 100644 index 00000000000..c8102661020 --- /dev/null +++ b/polkadot/zombienet_tests/functional/0010-validator-disabling.zndsl @@ -0,0 +1,21 @@ +Description: Test validator disabling effects +Network: ./0010-validator-disabling.toml +Creds: config + +# Ensure nodes are up and running +honest-validator: reports node_roles is 4 + +# Ensure parachain is registered +honest-validator: parachain 1000 is registered within 100 seconds + +# Ensure parachain made progress +honest-validator: parachain 1000 block height is at least 1 within 300 seconds + +# Wait for the dispute +honest-validator-1: reports parachain_candidate_disputes_total is at least 1 within 600 seconds + +# Disputes should conclude +honest-validator: reports polkadot_parachain_candidate_dispute_concluded{validity="invalid"} is at least 1 within 200 seconds + +# Wait for a few blocks for the disabling to take place. +honest-validator: log line contains "Disabled validators detected" within 180 seconds diff --git a/prdoc/pr_1841.prdoc b/prdoc/pr_1841.prdoc new file mode 100644 index 00000000000..c99583e6dc3 --- /dev/null +++ b/prdoc/pr_1841.prdoc @@ -0,0 +1,18 @@ +title: Validator disabling in Statement Distribution. + +doc: + - audience: Node Operator + description: | + Once a validator has been disabled for misbehavior, other validators + should no longer gossip its backing statements in the current era. + If they do, it might result in disconnects from the network due to low + reputation. + +migrations: + db: [] + runtime: [] + +crates: + - name: polkadot-statement-distribution + +host_functions: [] -- GitLab From d1f678c0ec44e9734cf242247dab90c2678774a9 Mon Sep 17 00:00:00 2001 From: joe petrowski <25483142+joepetrowski@users.noreply.github.com> Date: Wed, 10 Jan 2024 11:30:00 +0100 Subject: [PATCH 140/191] Unique Usernames in Identity Pallet (#2651) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR allows _username authorities_ to issue unique usernames that correspond with an account. It also provides two-way lookup, that is from `AccountId` to a single, "primary" `Username` (alongside `Registration`) and multiple unique `Username`s to an `AccountId`. Key features: - Username Authorities added (and removed) via privileged origin. - Authorities have a `suffix` and an `allocation`. They can grant up to `allocation` usernames. Their `suffix` will be appended to the usernames that they issue. A suffix may be up to 7 characters long. - Users can ask an authority to grant them a username. This will take the form `myusername.suffix`. The entire name (including suffix) must be less than or equal to 32 alphanumeric characters. - Users can approve a username for themselves in one of two ways (that is, authorities cannot grant them arbitrarily): - Pre-sign the entire username (including suffix) with a secret key that corresponds to their `AccountId` (for keyed accounts, obviously); or - Accept the username after it has been granted by an authority (it will be queued until accepted) (for non-keyed accounts like pure proxies or multisigs). - The system does not require any funds or deposits. Users without an identity will be given a default one (presumably all fields set to `None`). If they update this info, they will need to place the normal storage deposit. - If a user does not have any username, their first one will be set as `Primary`, and their `AccountId` will map to that one. If they get subsequent usernames, they can choose which one to be their primary via `set_primary_username`. - There are some state cleanup functions to remove expired usernames that have not been accepted and dangling usernames whose owners have called `clear_identity`. TODO: - [x] Add migration to runtimes - [x] Probably do off-chain migration into People Chain genesis - [x] Address a few TODO questions in code (please review) --------- Co-authored-by: Liam Aharon Co-authored-by: Gonçalo Pestana Co-authored-by: Oliver Tale-Yazdi Co-authored-by: Dónal Murray --- Cargo.lock | 2 + .../people/people-rococo/src/people.rs | 32 +- .../src/weights/pallet_identity.rs | 94 ++ .../people/people-westend/src/people.rs | 32 +- .../src/weights/pallet_identity.rs | 94 ++ .../runtime/common/src/integration_tests.rs | 10 +- polkadot/runtime/rococo/src/lib.rs | 12 + .../rococo/src/weights/pallet_identity.rs | 94 ++ polkadot/runtime/westend/src/lib.rs | 11 + .../westend/src/weights/pallet_identity.rs | 94 ++ prdoc/pr_2651.prdoc | 12 + substrate/bin/node/runtime/src/impls.rs | 2 +- substrate/bin/node/runtime/src/lib.rs | 10 + substrate/frame/alliance/src/mock.rs | 33 +- substrate/frame/identity/Cargo.toml | 4 + substrate/frame/identity/src/benchmarking.rs | 211 ++- substrate/frame/identity/src/legacy.rs | 17 +- substrate/frame/identity/src/lib.rs | 515 ++++++- substrate/frame/identity/src/migration.rs | 124 ++ substrate/frame/identity/src/tests.rs | 1359 +++++++++++++---- substrate/frame/identity/src/types.rs | 24 +- substrate/frame/identity/src/weights.rs | 195 +++ 22 files changed, 2653 insertions(+), 328 deletions(-) create mode 100644 prdoc/pr_2651.prdoc create mode 100644 substrate/frame/identity/src/migration.rs diff --git a/Cargo.lock b/Cargo.lock index c3e5e2ff41b..924aeb7848c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10047,11 +10047,13 @@ dependencies = [ "frame-benchmarking", "frame-support", "frame-system", + "log", "pallet-balances", "parity-scale-codec", "scale-info", "sp-core", "sp-io", + "sp-keystore", "sp-runtime", "sp-std 8.0.0", ] diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/people.rs b/cumulus/parachains/runtimes/people/people-rococo/src/people.rs index 9ff249318d9..88a89711019 100644 --- a/cumulus/parachains/runtimes/people/people-rococo/src/people.rs +++ b/cumulus/parachains/runtimes/people/people-rococo/src/people.rs @@ -22,9 +22,12 @@ use frame_support::{ RuntimeDebugNoBound, }; use pallet_identity::{Data, IdentityInformationProvider}; -use parachains_common::impls::ToParentTreasury; +use parachains_common::{impls::ToParentTreasury, DAYS}; use scale_info::TypeInfo; -use sp_runtime::{traits::AccountIdConversion, RuntimeDebug}; +use sp_runtime::{ + traits::{AccountIdConversion, Verify}, + RuntimeDebug, +}; use sp_std::prelude::*; parameter_types! { @@ -51,6 +54,12 @@ impl pallet_identity::Config for Runtime { type Slashed = ToParentTreasury; type ForceOrigin = EnsureRoot; type RegistrarOrigin = EnsureRoot; + type OffchainSignature = Signature; + type SigningPublicKey = ::Signer; + type UsernameAuthorityOrigin = EnsureRoot; + type PendingUsernameExpiration = ConstU32<{ 7 * DAYS }>; + type MaxSuffixLength = ConstU32<7>; + type MaxUsernameLength = ConstU32<32>; type WeightInfo = weights::pallet_identity::WeightInfo; } @@ -84,7 +93,6 @@ pub enum IdentityField { TypeInfo, )] #[codec(mel_bound())] -#[cfg_attr(test, derive(frame_support::DefaultNoBound))] pub struct IdentityInfo { /// A reasonable display name for the controller of the account. This should be whatever the /// account is typically known as and should not be confusable with other entities, given @@ -202,3 +210,21 @@ impl IdentityInfo { res } } + +/// A `Default` identity. This is given to users who get a username but have not set an identity. +impl Default for IdentityInfo { + fn default() -> Self { + IdentityInfo { + display: Data::None, + legal: Data::None, + web: Data::None, + matrix: Data::None, + email: Data::None, + pgp_fingerprint: None, + image: Data::None, + twitter: Data::None, + github: Data::None, + discord: Data::None, + } + } +} diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_identity.rs b/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_identity.rs index 65cac7875ba..1e8ba87e251 100644 --- a/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_identity.rs +++ b/cumulus/parachains/runtimes/people/people-rococo/src/weights/pallet_identity.rs @@ -312,4 +312,98 @@ impl pallet_identity::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } + /// Storage: `Identity::UsernameAuthorities` (r:0 w:1) + /// Proof: `Identity::UsernameAuthorities` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + fn add_username_authority() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 13_873_000 picoseconds. + Weight::from_parts(13_873_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Identity::UsernameAuthorities` (r:0 w:1) + /// Proof: `Identity::UsernameAuthorities` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + fn remove_username_authority() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 10_653_000 picoseconds. + Weight::from_parts(10_653_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Identity::UsernameAuthorities` (r:1 w:1) + /// Proof: `Identity::UsernameAuthorities` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + /// Storage: `Identity::AccountOfUsername` (r:1 w:1) + /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Identity::IdentityOf` (r:1 w:1) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) + fn set_username_for() -> Weight { + // Proof Size summary in bytes: + // Measured: `80` + // Estimated: `11037` + // Minimum execution time: 75_928_000 picoseconds. + Weight::from_parts(75_928_000, 0) + .saturating_add(Weight::from_parts(0, 11037)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: `Identity::PendingUsernames` (r:1 w:1) + /// Proof: `Identity::PendingUsernames` (`max_values`: None, `max_size`: Some(77), added: 2552, mode: `MaxEncodedLen`) + /// Storage: `Identity::IdentityOf` (r:1 w:1) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) + /// Storage: `Identity::AccountOfUsername` (r:0 w:1) + /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + fn accept_username() -> Weight { + // Proof Size summary in bytes: + // Measured: `106` + // Estimated: `11037` + // Minimum execution time: 38_157_000 picoseconds. + Weight::from_parts(38_157_000, 0) + .saturating_add(Weight::from_parts(0, 11037)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: `Identity::PendingUsernames` (r:1 w:1) + /// Proof: `Identity::PendingUsernames` (`max_values`: None, `max_size`: Some(77), added: 2552, mode: `MaxEncodedLen`) + fn remove_expired_approval() -> Weight { + // Proof Size summary in bytes: + // Measured: `106` + // Estimated: `3542` + // Minimum execution time: 46_821_000 picoseconds. + Weight::from_parts(46_821_000, 0) + .saturating_add(Weight::from_parts(0, 3542)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Identity::AccountOfUsername` (r:1 w:0) + /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Identity::IdentityOf` (r:1 w:1) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) + fn set_primary_username() -> Weight { + // Proof Size summary in bytes: + // Measured: `247` + // Estimated: `11037` + // Minimum execution time: 22_515_000 picoseconds. + Weight::from_parts(22_515_000, 0) + .saturating_add(Weight::from_parts(0, 11037)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Identity::AccountOfUsername` (r:1 w:1) + /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Identity::IdentityOf` (r:1 w:0) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) + fn remove_dangling_username() -> Weight { + // Proof Size summary in bytes: + // Measured: `126` + // Estimated: `11037` + // Minimum execution time: 15_997_000 picoseconds. + Weight::from_parts(15_997_000, 0) + .saturating_add(Weight::from_parts(0, 11037)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } } diff --git a/cumulus/parachains/runtimes/people/people-westend/src/people.rs b/cumulus/parachains/runtimes/people/people-westend/src/people.rs index d279be65110..a5c0e66a3f8 100644 --- a/cumulus/parachains/runtimes/people/people-westend/src/people.rs +++ b/cumulus/parachains/runtimes/people/people-westend/src/people.rs @@ -22,9 +22,12 @@ use frame_support::{ RuntimeDebugNoBound, }; use pallet_identity::{Data, IdentityInformationProvider}; -use parachains_common::impls::ToParentTreasury; +use parachains_common::{impls::ToParentTreasury, DAYS}; use scale_info::TypeInfo; -use sp_runtime::{traits::AccountIdConversion, RuntimeDebug}; +use sp_runtime::{ + traits::{AccountIdConversion, Verify}, + RuntimeDebug, +}; use sp_std::prelude::*; parameter_types! { @@ -51,6 +54,12 @@ impl pallet_identity::Config for Runtime { type Slashed = ToParentTreasury; type ForceOrigin = EnsureRoot; type RegistrarOrigin = EnsureRoot; + type OffchainSignature = Signature; + type SigningPublicKey = ::Signer; + type UsernameAuthorityOrigin = EnsureRoot; + type PendingUsernameExpiration = ConstU32<{ 7 * DAYS }>; + type MaxSuffixLength = ConstU32<7>; + type MaxUsernameLength = ConstU32<32>; type WeightInfo = weights::pallet_identity::WeightInfo; } @@ -84,7 +93,6 @@ pub enum IdentityField { TypeInfo, )] #[codec(mel_bound())] -#[cfg_attr(test, derive(frame_support::DefaultNoBound))] pub struct IdentityInfo { /// A reasonable display name for the controller of the account. This should be whatever it is /// that it is typically known as and should not be confusable with other entities, given @@ -202,3 +210,21 @@ impl IdentityInfo { res } } + +/// A `Default` identity. This is given to users who get a username but have not set an identity. +impl Default for IdentityInfo { + fn default() -> Self { + IdentityInfo { + display: Data::None, + legal: Data::None, + web: Data::None, + matrix: Data::None, + email: Data::None, + pgp_fingerprint: None, + image: Data::None, + twitter: Data::None, + github: Data::None, + discord: Data::None, + } + } +} diff --git a/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_identity.rs b/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_identity.rs index 65cac7875ba..1e8ba87e251 100644 --- a/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_identity.rs +++ b/cumulus/parachains/runtimes/people/people-westend/src/weights/pallet_identity.rs @@ -312,4 +312,98 @@ impl pallet_identity::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } + /// Storage: `Identity::UsernameAuthorities` (r:0 w:1) + /// Proof: `Identity::UsernameAuthorities` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + fn add_username_authority() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 13_873_000 picoseconds. + Weight::from_parts(13_873_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Identity::UsernameAuthorities` (r:0 w:1) + /// Proof: `Identity::UsernameAuthorities` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + fn remove_username_authority() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 10_653_000 picoseconds. + Weight::from_parts(10_653_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Identity::UsernameAuthorities` (r:1 w:1) + /// Proof: `Identity::UsernameAuthorities` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + /// Storage: `Identity::AccountOfUsername` (r:1 w:1) + /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Identity::IdentityOf` (r:1 w:1) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) + fn set_username_for() -> Weight { + // Proof Size summary in bytes: + // Measured: `80` + // Estimated: `11037` + // Minimum execution time: 75_928_000 picoseconds. + Weight::from_parts(75_928_000, 0) + .saturating_add(Weight::from_parts(0, 11037)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: `Identity::PendingUsernames` (r:1 w:1) + /// Proof: `Identity::PendingUsernames` (`max_values`: None, `max_size`: Some(77), added: 2552, mode: `MaxEncodedLen`) + /// Storage: `Identity::IdentityOf` (r:1 w:1) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) + /// Storage: `Identity::AccountOfUsername` (r:0 w:1) + /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + fn accept_username() -> Weight { + // Proof Size summary in bytes: + // Measured: `106` + // Estimated: `11037` + // Minimum execution time: 38_157_000 picoseconds. + Weight::from_parts(38_157_000, 0) + .saturating_add(Weight::from_parts(0, 11037)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: `Identity::PendingUsernames` (r:1 w:1) + /// Proof: `Identity::PendingUsernames` (`max_values`: None, `max_size`: Some(77), added: 2552, mode: `MaxEncodedLen`) + fn remove_expired_approval() -> Weight { + // Proof Size summary in bytes: + // Measured: `106` + // Estimated: `3542` + // Minimum execution time: 46_821_000 picoseconds. + Weight::from_parts(46_821_000, 0) + .saturating_add(Weight::from_parts(0, 3542)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Identity::AccountOfUsername` (r:1 w:0) + /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Identity::IdentityOf` (r:1 w:1) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) + fn set_primary_username() -> Weight { + // Proof Size summary in bytes: + // Measured: `247` + // Estimated: `11037` + // Minimum execution time: 22_515_000 picoseconds. + Weight::from_parts(22_515_000, 0) + .saturating_add(Weight::from_parts(0, 11037)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Identity::AccountOfUsername` (r:1 w:1) + /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Identity::IdentityOf` (r:1 w:0) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) + fn remove_dangling_username() -> Weight { + // Proof Size summary in bytes: + // Measured: `126` + // Estimated: `11037` + // Minimum execution time: 15_997_000 picoseconds. + Weight::from_parts(15_997_000, 0) + .saturating_add(Weight::from_parts(0, 11037)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } } diff --git a/polkadot/runtime/common/src/integration_tests.rs b/polkadot/runtime/common/src/integration_tests.rs index 4870432d22f..cfa8f4c3ad9 100644 --- a/polkadot/runtime/common/src/integration_tests.rs +++ b/polkadot/runtime/common/src/integration_tests.rs @@ -45,9 +45,9 @@ use sp_io::TestExternalities; use sp_keyring::Sr25519Keyring; use sp_keystore::{testing::MemoryKeystore, KeystoreExt}; use sp_runtime::{ - traits::{BlakeTwo256, IdentityLookup, One}, + traits::{BlakeTwo256, IdentityLookup, One, Verify}, transaction_validity::TransactionPriority, - AccountId32, BuildStorage, + AccountId32, BuildStorage, MultiSignature, }; use sp_std::sync::Arc; @@ -293,6 +293,12 @@ impl pallet_identity::Config for Test { type MaxRegistrars = ConstU32<20>; type RegistrarOrigin = EnsureRoot; type ForceOrigin = EnsureRoot; + type OffchainSignature = MultiSignature; + type SigningPublicKey = ::Signer; + type UsernameAuthorityOrigin = EnsureRoot; + type PendingUsernameExpiration = ConstU32<100>; + type MaxSuffixLength = ConstU32<7>; + type MaxUsernameLength = ConstU32<32>; type WeightInfo = (); } diff --git a/polkadot/runtime/rococo/src/lib.rs b/polkadot/runtime/rococo/src/lib.rs index 67caa347bc3..3fd3f2bc635 100644 --- a/polkadot/runtime/rococo/src/lib.rs +++ b/polkadot/runtime/rococo/src/lib.rs @@ -668,6 +668,12 @@ impl pallet_identity::Config for Runtime { type Slashed = Treasury; type ForceOrigin = EitherOf, GeneralAdmin>; type RegistrarOrigin = EitherOf, GeneralAdmin>; + type OffchainSignature = Signature; + type SigningPublicKey = ::Signer; + type UsernameAuthorityOrigin = EnsureRoot; + type PendingUsernameExpiration = ConstU32<{ 7 * DAYS }>; + type MaxSuffixLength = ConstU32<7>; + type MaxUsernameLength = ConstU32<32>; type WeightInfo = weights::pallet_identity::WeightInfo; } @@ -1620,6 +1626,9 @@ pub mod migrations { } } + // We don't have a limit in the Relay Chain. + const IDENTITY_MIGRATION_KEY_LIMIT: u64 = u64::MAX; + /// Unreleased migrations. Add new ones here: pub type Unreleased = ( pallet_society::migrations::MigrateToV2, @@ -1655,6 +1664,9 @@ pub mod migrations { // Remove `im-online` pallet on-chain storage frame_support::migrations::RemovePallet::DbWeight>, + + // Migrate Identity pallet for Usernames + pallet_identity::migration::versioned::V0ToV1, parachains_configuration::migration::v11::MigrateToV11, // This needs to come after the `parachains_configuration` above as we are reading the configuration. coretime::migration::MigrateToCoretime, diff --git a/polkadot/runtime/rococo/src/weights/pallet_identity.rs b/polkadot/runtime/rococo/src/weights/pallet_identity.rs index e8c25269ac3..b334e21ea03 100644 --- a/polkadot/runtime/rococo/src/weights/pallet_identity.rs +++ b/polkadot/runtime/rococo/src/weights/pallet_identity.rs @@ -334,4 +334,98 @@ impl pallet_identity::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } + /// Storage: `Identity::UsernameAuthorities` (r:0 w:1) + /// Proof: `Identity::UsernameAuthorities` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + fn add_username_authority() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 13_873_000 picoseconds. + Weight::from_parts(13_873_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Identity::UsernameAuthorities` (r:0 w:1) + /// Proof: `Identity::UsernameAuthorities` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + fn remove_username_authority() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 10_653_000 picoseconds. + Weight::from_parts(10_653_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Identity::UsernameAuthorities` (r:1 w:1) + /// Proof: `Identity::UsernameAuthorities` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + /// Storage: `Identity::AccountOfUsername` (r:1 w:1) + /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Identity::IdentityOf` (r:1 w:1) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) + fn set_username_for() -> Weight { + // Proof Size summary in bytes: + // Measured: `80` + // Estimated: `11037` + // Minimum execution time: 75_928_000 picoseconds. + Weight::from_parts(75_928_000, 0) + .saturating_add(Weight::from_parts(0, 11037)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: `Identity::PendingUsernames` (r:1 w:1) + /// Proof: `Identity::PendingUsernames` (`max_values`: None, `max_size`: Some(77), added: 2552, mode: `MaxEncodedLen`) + /// Storage: `Identity::IdentityOf` (r:1 w:1) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) + /// Storage: `Identity::AccountOfUsername` (r:0 w:1) + /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + fn accept_username() -> Weight { + // Proof Size summary in bytes: + // Measured: `106` + // Estimated: `11037` + // Minimum execution time: 38_157_000 picoseconds. + Weight::from_parts(38_157_000, 0) + .saturating_add(Weight::from_parts(0, 11037)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: `Identity::PendingUsernames` (r:1 w:1) + /// Proof: `Identity::PendingUsernames` (`max_values`: None, `max_size`: Some(77), added: 2552, mode: `MaxEncodedLen`) + fn remove_expired_approval() -> Weight { + // Proof Size summary in bytes: + // Measured: `106` + // Estimated: `3542` + // Minimum execution time: 46_821_000 picoseconds. + Weight::from_parts(46_821_000, 0) + .saturating_add(Weight::from_parts(0, 3542)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Identity::AccountOfUsername` (r:1 w:0) + /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Identity::IdentityOf` (r:1 w:1) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) + fn set_primary_username() -> Weight { + // Proof Size summary in bytes: + // Measured: `247` + // Estimated: `11037` + // Minimum execution time: 22_515_000 picoseconds. + Weight::from_parts(22_515_000, 0) + .saturating_add(Weight::from_parts(0, 11037)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Identity::AccountOfUsername` (r:1 w:1) + /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Identity::IdentityOf` (r:1 w:0) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) + fn remove_dangling_username() -> Weight { + // Proof Size summary in bytes: + // Measured: `126` + // Estimated: `11037` + // Minimum execution time: 15_997_000 picoseconds. + Weight::from_parts(15_997_000, 0) + .saturating_add(Weight::from_parts(0, 11037)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } } diff --git a/polkadot/runtime/westend/src/lib.rs b/polkadot/runtime/westend/src/lib.rs index e0b9fd0fb53..e1416c4b754 100644 --- a/polkadot/runtime/westend/src/lib.rs +++ b/polkadot/runtime/westend/src/lib.rs @@ -878,6 +878,12 @@ impl pallet_identity::Config for Runtime { type MaxRegistrars = MaxRegistrars; type ForceOrigin = EitherOf, GeneralAdmin>; type RegistrarOrigin = EitherOf, GeneralAdmin>; + type OffchainSignature = Signature; + type SigningPublicKey = ::Signer; + type UsernameAuthorityOrigin = EnsureRoot; + type PendingUsernameExpiration = ConstU32<{ 7 * DAYS }>; + type MaxSuffixLength = ConstU32<7>; + type MaxUsernameLength = ConstU32<32>; type WeightInfo = weights::pallet_identity::WeightInfo; } @@ -1626,6 +1632,9 @@ pub mod migrations { } } + // We don't have a limit in the Relay Chain. + const IDENTITY_MIGRATION_KEY_LIMIT: u64 = u64::MAX; + /// Unreleased migrations. Add new ones here: pub type Unreleased = ( parachains_configuration::migration::v7::MigrateToV7, @@ -1644,6 +1653,8 @@ pub mod migrations { ImOnlinePalletName, ::DbWeight, >, + // Migrate Identity pallet for Usernames + pallet_identity::migration::versioned::V0ToV1, parachains_configuration::migration::v11::MigrateToV11, ); } diff --git a/polkadot/runtime/westend/src/weights/pallet_identity.rs b/polkadot/runtime/westend/src/weights/pallet_identity.rs index dea631b9316..dc7061615c9 100644 --- a/polkadot/runtime/westend/src/weights/pallet_identity.rs +++ b/polkadot/runtime/westend/src/weights/pallet_identity.rs @@ -338,4 +338,98 @@ impl pallet_identity::WeightInfo for WeightInfo { .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) } + /// Storage: `Identity::UsernameAuthorities` (r:0 w:1) + /// Proof: `Identity::UsernameAuthorities` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + fn add_username_authority() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 13_873_000 picoseconds. + Weight::from_parts(13_873_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Identity::UsernameAuthorities` (r:0 w:1) + /// Proof: `Identity::UsernameAuthorities` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + fn remove_username_authority() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 10_653_000 picoseconds. + Weight::from_parts(10_653_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Identity::UsernameAuthorities` (r:1 w:1) + /// Proof: `Identity::UsernameAuthorities` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + /// Storage: `Identity::AccountOfUsername` (r:1 w:1) + /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Identity::IdentityOf` (r:1 w:1) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) + fn set_username_for() -> Weight { + // Proof Size summary in bytes: + // Measured: `80` + // Estimated: `11037` + // Minimum execution time: 75_928_000 picoseconds. + Weight::from_parts(75_928_000, 0) + .saturating_add(Weight::from_parts(0, 11037)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: `Identity::PendingUsernames` (r:1 w:1) + /// Proof: `Identity::PendingUsernames` (`max_values`: None, `max_size`: Some(77), added: 2552, mode: `MaxEncodedLen`) + /// Storage: `Identity::IdentityOf` (r:1 w:1) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) + /// Storage: `Identity::AccountOfUsername` (r:0 w:1) + /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + fn accept_username() -> Weight { + // Proof Size summary in bytes: + // Measured: `106` + // Estimated: `11037` + // Minimum execution time: 38_157_000 picoseconds. + Weight::from_parts(38_157_000, 0) + .saturating_add(Weight::from_parts(0, 11037)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: `Identity::PendingUsernames` (r:1 w:1) + /// Proof: `Identity::PendingUsernames` (`max_values`: None, `max_size`: Some(77), added: 2552, mode: `MaxEncodedLen`) + fn remove_expired_approval() -> Weight { + // Proof Size summary in bytes: + // Measured: `106` + // Estimated: `3542` + // Minimum execution time: 46_821_000 picoseconds. + Weight::from_parts(46_821_000, 0) + .saturating_add(Weight::from_parts(0, 3542)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Identity::AccountOfUsername` (r:1 w:0) + /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Identity::IdentityOf` (r:1 w:1) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) + fn set_primary_username() -> Weight { + // Proof Size summary in bytes: + // Measured: `247` + // Estimated: `11037` + // Minimum execution time: 22_515_000 picoseconds. + Weight::from_parts(22_515_000, 0) + .saturating_add(Weight::from_parts(0, 11037)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Identity::AccountOfUsername` (r:1 w:1) + /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Identity::IdentityOf` (r:1 w:0) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) + fn remove_dangling_username() -> Weight { + // Proof Size summary in bytes: + // Measured: `126` + // Estimated: `11037` + // Minimum execution time: 15_997_000 picoseconds. + Weight::from_parts(15_997_000, 0) + .saturating_add(Weight::from_parts(0, 11037)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } } diff --git a/prdoc/pr_2651.prdoc b/prdoc/pr_2651.prdoc new file mode 100644 index 00000000000..e28013d4330 --- /dev/null +++ b/prdoc/pr_2651.prdoc @@ -0,0 +1,12 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Unique Usernames for Identity + +doc: + - audience: Runtime User + description: | + Adds the ability to add unique usernames for an account with reverse lookup (as in `AccountId` + to `Username` and `Username` to `AccountId`). + +crates: [ ] diff --git a/substrate/bin/node/runtime/src/impls.rs b/substrate/bin/node/runtime/src/impls.rs index 717fbeadada..7ff52a758b3 100644 --- a/substrate/bin/node/runtime/src/impls.rs +++ b/substrate/bin/node/runtime/src/impls.rs @@ -64,7 +64,7 @@ impl IdentityVerifier for AllianceIdentityVerifier { fn has_good_judgement(who: &AccountId) -> bool { use pallet_identity::Judgement; crate::Identity::identity(who) - .map(|registration| registration.judgements) + .map(|(registration, _)| registration.judgements) .map_or(false, |judgements| { judgements .iter() diff --git a/substrate/bin/node/runtime/src/lib.rs b/substrate/bin/node/runtime/src/lib.rs index 6e7bfb4f4b4..ec1601929fc 100644 --- a/substrate/bin/node/runtime/src/lib.rs +++ b/substrate/bin/node/runtime/src/lib.rs @@ -1500,6 +1500,12 @@ impl pallet_identity::Config for Runtime { type Slashed = Treasury; type ForceOrigin = EnsureRootOrHalfCouncil; type RegistrarOrigin = EnsureRootOrHalfCouncil; + type OffchainSignature = Signature; + type SigningPublicKey = ::Signer; + type UsernameAuthorityOrigin = EnsureRoot; + type PendingUsernameExpiration = ConstU32<{ 7 * DAYS }>; + type MaxSuffixLength = ConstU32<7>; + type MaxUsernameLength = ConstU32<32>; type WeightInfo = pallet_identity::weights::SubstrateWeight; } @@ -2208,6 +2214,9 @@ pub type Executive = frame_executive::Executive< Migrations, >; +// We don't have a limit in the Relay Chain. +const IDENTITY_MIGRATION_KEY_LIMIT: u64 = u64::MAX; + // All migrations executed on runtime upgrade as a nested tuple of types implementing // `OnRuntimeUpgrade`. Note: These are examples and do not need to be run directly // after the genesis block. @@ -2215,6 +2224,7 @@ type Migrations = ( pallet_nomination_pools::migration::versioned::V6ToV7, pallet_alliance::migration::Migration, pallet_contracts::Migration, + pallet_identity::migration::versioned::V0ToV1, ); type EventRecord = frame_system::EventRecord< diff --git a/substrate/frame/alliance/src/mock.rs b/substrate/frame/alliance/src/mock.rs index 01e0e01fe7e..22aea9005ef 100644 --- a/substrate/frame/alliance/src/mock.rs +++ b/substrate/frame/alliance/src/mock.rs @@ -19,7 +19,10 @@ pub use sp_core::H256; use sp_runtime::traits::Hash; -pub use sp_runtime::{traits::BlakeTwo256, BuildStorage}; +pub use sp_runtime::{ + traits::{BlakeTwo256, IdentifyAccount, IdentityLookup, Lazy, Verify}, + BuildStorage, MultiSignature, +}; use sp_std::convert::{TryFrom, TryInto}; pub use frame_support::{ @@ -101,6 +104,7 @@ parameter_types! { pub const MaxSubAccounts: u32 = 2; pub const MaxAdditionalFields: u32 = 2; pub const MaxRegistrars: u32 = 20; + pub const PendingUsernameExpiration: u64 = 100; } ord_parameter_types! { pub const One: u64 = 1; @@ -124,9 +128,34 @@ impl pallet_identity::Config for Test { type Slashed = (); type RegistrarOrigin = EnsureOneOrRoot; type ForceOrigin = EnsureTwoOrRoot; + type OffchainSignature = AccountU64; + type SigningPublicKey = AccountU64; + type UsernameAuthorityOrigin = EnsureOneOrRoot; + type PendingUsernameExpiration = PendingUsernameExpiration; + type MaxSuffixLength = ConstU32<7>; + type MaxUsernameLength = ConstU32<32>; type WeightInfo = (); } +#[derive(Clone, Debug, Encode, Decode, PartialEq, Eq, TypeInfo)] +pub struct AccountU64(u64); +impl IdentifyAccount for AccountU64 { + type AccountId = u64; + fn into_account(self) -> u64 { + 0u64 + } +} +impl Verify for AccountU64 { + type Signer = AccountU64; + fn verify>( + &self, + _msg: L, + _signer: &::AccountId, + ) -> bool { + false + } +} + pub struct AllianceIdentityVerifier; impl IdentityVerifier for AllianceIdentityVerifier { fn has_required_identities(who: &AccountId) -> bool { @@ -135,7 +164,7 @@ impl IdentityVerifier for AllianceIdentityVerifier { fn has_good_judgement(who: &AccountId) -> bool { if let Some(judgements) = - Identity::identity(who).map(|registration| registration.judgements) + Identity::identity(who).map(|(registration, _)| registration.judgements) { judgements .iter() diff --git a/substrate/frame/identity/Cargo.toml b/substrate/frame/identity/Cargo.toml index 78f966c0535..1197a37ecae 100644 --- a/substrate/frame/identity/Cargo.toml +++ b/substrate/frame/identity/Cargo.toml @@ -18,6 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false, features = ["derive", "max-encoded-len"] } enumflags2 = { version = "0.7.7" } +log = { version = "0.4.17", default-features = false } scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } frame-support = { path = "../support", default-features = false } @@ -29,6 +30,7 @@ sp-std = { path = "../../primitives/std", default-features = false } [dev-dependencies] pallet-balances = { path = "../balances" } sp-core = { path = "../../primitives/core" } +sp-keystore = { path = "../../primitives/keystore" } [features] default = ["std"] @@ -39,10 +41,12 @@ std = [ "frame-benchmarking?/std", "frame-support/std", "frame-system/std", + "log/std", "pallet-balances/std", "scale-info/std", "sp-core/std", "sp-io/std", + "sp-keystore/std", "sp-runtime/std", "sp-std/std", ] diff --git a/substrate/frame/identity/src/benchmarking.rs b/substrate/frame/identity/src/benchmarking.rs index 3d976bd6c88..fe2fb0b0489 100644 --- a/substrate/frame/identity/src/benchmarking.rs +++ b/substrate/frame/identity/src/benchmarking.rs @@ -22,22 +22,43 @@ use super::*; use crate::Pallet as Identity; +use codec::Encode; use frame_benchmarking::{ account, impl_benchmark_test_suite, v2::*, whitelisted_caller, BenchmarkError, }; use frame_support::{ - ensure, - traits::{EnsureOrigin, Get}, + assert_ok, ensure, + traits::{EnsureOrigin, Get, OnFinalize, OnInitialize}, }; use frame_system::RawOrigin; -use sp_runtime::traits::Bounded; +use sp_io::crypto::{sr25519_generate, sr25519_sign}; +use sp_runtime::{ + traits::{Bounded, IdentifyAccount, One}, + MultiSignature, MultiSigner, +}; const SEED: u32 = 0; +fn assert_has_event(generic_event: ::RuntimeEvent) { + frame_system::Pallet::::assert_has_event(generic_event.into()); +} + fn assert_last_event(generic_event: ::RuntimeEvent) { frame_system::Pallet::::assert_last_event(generic_event.into()); } +fn run_to_block(n: frame_system::pallet_prelude::BlockNumberFor) { + while frame_system::Pallet::::block_number() < n { + crate::Pallet::::on_finalize(frame_system::Pallet::::block_number()); + frame_system::Pallet::::on_finalize(frame_system::Pallet::::block_number()); + frame_system::Pallet::::set_block_number( + frame_system::Pallet::::block_number() + One::one(), + ); + frame_system::Pallet::::on_initialize(frame_system::Pallet::::block_number()); + crate::Pallet::::on_initialize(frame_system::Pallet::::block_number()); + } +} + // Adds `r` registrars to the Identity Pallet. These registrars will have set fees and fields. fn add_registrars(r: u32) -> Result<(), &'static str> { for i in 0..r { @@ -95,7 +116,28 @@ fn add_sub_accounts( Ok(subs) } -#[benchmarks] +fn bench_suffix() -> Vec { + b"bench".to_vec() +} + +fn bench_username() -> Vec { + // len = 24 + b"veryfastbenchmarkmachine".to_vec() +} + +fn bounded_username(username: Vec, suffix: Vec) -> Username { + let mut full_username = Vec::with_capacity(username.len() + suffix.len() + 1); + full_username.extend(username); + full_username.extend(b"."); + full_username.extend(suffix); + Username::::try_from(full_username).expect("test usernames should fit within bounds") +} + +#[benchmarks( + where + ::AccountId: From, + T::OffchainSignature: From, +)] mod benchmarks { use super::*; @@ -523,5 +565,166 @@ mod benchmarks { Ok(()) } + #[benchmark] + fn add_username_authority() -> Result<(), BenchmarkError> { + let origin = + T::UsernameAuthorityOrigin::try_successful_origin().expect("can generate origin"); + + let authority: T::AccountId = account("authority", 0, SEED); + let authority_lookup = T::Lookup::unlookup(authority.clone()); + let suffix = bench_suffix(); + let allocation = 10; + + #[extrinsic_call] + _(origin as T::RuntimeOrigin, authority_lookup, suffix, allocation); + + assert_last_event::(Event::::AuthorityAdded { authority }.into()); + Ok(()) + } + + #[benchmark] + fn remove_username_authority() -> Result<(), BenchmarkError> { + let origin = + T::UsernameAuthorityOrigin::try_successful_origin().expect("can generate origin"); + + let authority: T::AccountId = account("authority", 0, SEED); + let authority_lookup = T::Lookup::unlookup(authority.clone()); + let suffix = bench_suffix(); + let allocation = 10; + + assert_ok!(Identity::::add_username_authority( + origin.clone(), + authority_lookup.clone(), + suffix, + allocation + )); + + #[extrinsic_call] + _(origin as T::RuntimeOrigin, authority_lookup); + + assert_last_event::(Event::::AuthorityRemoved { authority }.into()); + Ok(()) + } + + #[benchmark] + fn set_username_for() -> Result<(), BenchmarkError> { + // Set up a username authority. + let auth_origin = + T::UsernameAuthorityOrigin::try_successful_origin().expect("can generate origin"); + let authority: T::AccountId = account("authority", 0, SEED); + let authority_lookup = T::Lookup::unlookup(authority.clone()); + let suffix = bench_suffix(); + let allocation = 10; + + Identity::::add_username_authority( + auth_origin, + authority_lookup, + suffix.clone(), + allocation, + )?; + + let username = bench_username(); + let bounded_username = bounded_username::(username.clone(), suffix.clone()); + let encoded_username = Encode::encode(&bounded_username.to_vec()); + + let public = sr25519_generate(0.into(), None); + let who_account: T::AccountId = MultiSigner::Sr25519(public).into_account().into(); + let who_lookup = T::Lookup::unlookup(who_account.clone()); + + let signature = + MultiSignature::Sr25519(sr25519_sign(0.into(), &public, &encoded_username).unwrap()); + + // Verify signature here to avoid surprise errors at runtime + assert!(signature.verify(&encoded_username[..], &public.into())); + + #[extrinsic_call] + _(RawOrigin::Signed(authority.clone()), who_lookup, username, Some(signature.into())); + + assert_has_event::( + Event::::UsernameSet { + who: who_account.clone(), + username: bounded_username.clone(), + } + .into(), + ); + assert_has_event::( + Event::::PrimaryUsernameSet { who: who_account, username: bounded_username }.into(), + ); + Ok(()) + } + + #[benchmark] + fn accept_username() -> Result<(), BenchmarkError> { + let caller: T::AccountId = whitelisted_caller(); + let username = bounded_username::(bench_username(), bench_suffix()); + + Identity::::queue_acceptance(&caller, username.clone()); + + #[extrinsic_call] + _(RawOrigin::Signed(caller.clone()), username.clone()); + + assert_last_event::(Event::::UsernameSet { who: caller, username }.into()); + Ok(()) + } + + #[benchmark] + fn remove_expired_approval() -> Result<(), BenchmarkError> { + let caller: T::AccountId = whitelisted_caller(); + let username = bounded_username::(bench_username(), bench_suffix()); + Identity::::queue_acceptance(&caller, username.clone()); + + let expected_exiration = + frame_system::Pallet::::block_number() + T::PendingUsernameExpiration::get(); + + run_to_block::(expected_exiration + One::one()); + + #[extrinsic_call] + _(RawOrigin::Signed(caller.clone()), username); + + assert_last_event::(Event::::PreapprovalExpired { whose: caller }.into()); + Ok(()) + } + + #[benchmark] + fn set_primary_username() -> Result<(), BenchmarkError> { + let caller: T::AccountId = whitelisted_caller(); + let first_username = bounded_username::(bench_username(), bench_suffix()); + let second_username = bounded_username::(b"slowbenchmark".to_vec(), bench_suffix()); + + // First one will be set as primary. Second will not be. + Identity::::insert_username(&caller, first_username); + Identity::::insert_username(&caller, second_username.clone()); + + #[extrinsic_call] + _(RawOrigin::Signed(caller.clone()), second_username.clone()); + + assert_last_event::( + Event::::PrimaryUsernameSet { who: caller, username: second_username }.into(), + ); + Ok(()) + } + + #[benchmark] + fn remove_dangling_username() -> Result<(), BenchmarkError> { + let caller: T::AccountId = whitelisted_caller(); + let first_username = bounded_username::(bench_username(), bench_suffix()); + let second_username = bounded_username::(b"slowbenchmark".to_vec(), bench_suffix()); + + // First one will be set as primary. Second will not be. + Identity::::insert_username(&caller, first_username); + Identity::::insert_username(&caller, second_username.clone()); + + // User calls `clear_identity`, leaving their second username as "dangling" + Identity::::clear_identity(RawOrigin::Signed(caller.clone()).into())?; + + #[extrinsic_call] + _(RawOrigin::Signed(caller.clone()), second_username.clone()); + + assert_last_event::( + Event::::DanglingUsernameRemoved { who: caller, username: second_username }.into(), + ); + Ok(()) + } + impl_benchmark_test_suite!(Identity, crate::tests::new_test_ext(), crate::tests::Test); } diff --git a/substrate/frame/identity/src/legacy.rs b/substrate/frame/identity/src/legacy.rs index a7953f7e178..60e812c2238 100644 --- a/substrate/frame/identity/src/legacy.rs +++ b/substrate/frame/identity/src/legacy.rs @@ -75,7 +75,6 @@ impl TypeInfo for IdentityField { TypeInfo, )] #[codec(mel_bound())] -#[cfg_attr(test, derive(frame_support::DefaultNoBound))] #[scale_info(skip_type_params(FieldLimit))] pub struct IdentityInfo> { /// Additional fields of the identity that are not catered for with the struct's explicit @@ -155,6 +154,22 @@ impl + 'static> IdentityInformationProvider for IdentityInf } } +impl> Default for IdentityInfo { + fn default() -> Self { + IdentityInfo { + additional: BoundedVec::default(), + display: Data::None, + legal: Data::None, + web: Data::None, + riot: Data::None, + email: Data::None, + pgp_fingerprint: None, + image: Data::None, + twitter: Data::None, + } + } +} + impl> IdentityInfo { pub(crate) fn fields(&self) -> BitFlags { let mut res = >::empty(); diff --git a/substrate/frame/identity/src/lib.rs b/substrate/frame/identity/src/lib.rs index 8588612cd5b..1df0a619ea4 100644 --- a/substrate/frame/identity/src/lib.rs +++ b/substrate/frame/identity/src/lib.rs @@ -40,32 +40,53 @@ //! The number of registrars should be limited, and the deposit made sufficiently large, to ensure //! no state-bloat attack is viable. //! +//! ### Usernames +//! +//! The pallet provides functionality for username authorities to issue usernames. When an account +//! receives a username, they get a default instance of `IdentityInfo`. Usernames also serve as a +//! reverse lookup from username to account. +//! +//! Username authorities are given an allocation by governance to prevent state bloat. Usernames +//! impose no cost or deposit on the user. +//! +//! Users can have multiple usernames that map to the same `AccountId`, however one `AccountId` can +//! only map to a single username, known as the _primary_. +//! //! ## Interface //! //! ### Dispatchable Functions //! -//! #### For general users +//! #### For General Users //! * `set_identity` - Set the associated identity of an account; a small deposit is reserved if not //! already taken. //! * `clear_identity` - Remove an account's associated identity; the deposit is returned. //! * `request_judgement` - Request a judgement from a registrar, paying a fee. //! * `cancel_request` - Cancel the previous request for a judgement. +//! * `accept_username` - Accept a username issued by a username authority. +//! * `remove_expired_approval` - Remove a username that was issued but never accepted. +//! * `set_primary_username` - Set a given username as an account's primary. +//! * `remove_dangling_username` - Remove a username that maps to an account without an identity. //! -//! #### For general users with sub-identities +//! #### For General Users with Sub-Identities //! * `set_subs` - Set the sub-accounts of an identity. //! * `add_sub` - Add a sub-identity to an identity. //! * `remove_sub` - Remove a sub-identity of an identity. //! * `rename_sub` - Rename a sub-identity of an identity. //! * `quit_sub` - Remove a sub-identity of an identity (called by the sub-identity). //! -//! #### For registrars +//! #### For Registrars //! * `set_fee` - Set the fee required to be paid for a judgement to be given by the registrar. //! * `set_fields` - Set the fields that a registrar cares about in their judgements. //! * `provide_judgement` - Provide a judgement to an identity. //! -//! #### For super-users +//! #### For Username Authorities +//! * `set_username_for` - Set a username for a given account. The account must approve it. +//! +//! #### For Superusers //! * `add_registrar` - Add a new registrar to the system. //! * `kill_identity` - Forcibly remove the associated identity; the deposit is lost. +//! * `add_username_authority` - Add an account with the ability to issue usernames. +//! * `remove_username_authority` - Remove an account with the ability to issue usernames. //! //! [`Call`]: ./enum.Call.html //! [`Config`]: ./trait.Config.html @@ -74,25 +95,29 @@ mod benchmarking; pub mod legacy; +pub mod migration; #[cfg(test)] mod tests; mod types; pub mod weights; +use crate::types::{AuthorityPropertiesOf, Suffix, Username}; use codec::Encode; use frame_support::{ ensure, pallet_prelude::{DispatchError, DispatchResult}, - traits::{BalanceStatus, Currency, Get, OnUnbalanced, ReservableCurrency}, + traits::{BalanceStatus, Currency, Get, OnUnbalanced, ReservableCurrency, StorageVersion}, + BoundedVec, }; -use sp_runtime::traits::{AppendZerosInput, Hash, Saturating, StaticLookup, Zero}; -use sp_std::prelude::*; -pub use weights::WeightInfo; - pub use pallet::*; +use sp_runtime::traits::{ + AppendZerosInput, Hash, IdentifyAccount, Saturating, StaticLookup, Verify, Zero, +}; +use sp_std::prelude::*; pub use types::{ Data, IdentityInformationProvider, Judgement, RegistrarIndex, RegistrarInfo, Registration, }; +pub use weights::WeightInfo; type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; @@ -115,7 +140,7 @@ pub mod pallet { /// The currency trait. type Currency: ReservableCurrency; - /// The amount held on deposit for a registered identity + /// The amount held on deposit for a registered identity. #[pallet::constant] type BasicDeposit: Get>; @@ -150,14 +175,41 @@ pub mod pallet { /// The origin which may add or remove registrars. Root can always do this. type RegistrarOrigin: EnsureOrigin; + /// Signature type for pre-authorizing usernames off-chain. + /// + /// Can verify whether an `Self::SigningPublicKey` created a signature. + type OffchainSignature: Verify + Parameter; + + /// Public key that corresponds to an on-chain `Self::AccountId`. + type SigningPublicKey: IdentifyAccount; + + /// The origin which may add or remove username authorities. Root can always do this. + type UsernameAuthorityOrigin: EnsureOrigin; + + /// The number of blocks within which a username grant must be accepted. + #[pallet::constant] + type PendingUsernameExpiration: Get>; + + /// The maximum length of a suffix. + #[pallet::constant] + type MaxSuffixLength: Get; + + /// The maximum length of a username, including its suffix and any system-added delimiters. + #[pallet::constant] + type MaxUsernameLength: Get; + /// Weight information for extrinsics in this pallet. type WeightInfo: WeightInfo; } + const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); + #[pallet::pallet] + #[pallet::storage_version(STORAGE_VERSION)] pub struct Pallet(_); - /// Information that is pertinent to identify the entity behind an account. + /// Information that is pertinent to identify the entity behind an account. First item is the + /// registration, second is the account's primary username. /// /// TWOX-NOTE: OK ― `AccountId` is a secure hash. #[pallet::storage] @@ -166,7 +218,7 @@ pub mod pallet { _, Twox64Concat, T::AccountId, - Registration, T::MaxRegistrars, T::IdentityInformation>, + (Registration, T::MaxRegistrars, T::IdentityInformation>, Option>), OptionQuery, >; @@ -213,6 +265,38 @@ pub mod pallet { ValueQuery, >; + /// A map of the accounts who are authorized to grant usernames. + #[pallet::storage] + #[pallet::getter(fn authority)] + pub(super) type UsernameAuthorities = + StorageMap<_, Twox64Concat, T::AccountId, AuthorityPropertiesOf, OptionQuery>; + + /// Reverse lookup from `username` to the `AccountId` that has registered it. The value should + /// be a key in the `IdentityOf` map, but it may not if the user has cleared their identity. + /// + /// Multiple usernames may map to the same `AccountId`, but `IdentityOf` will only map to one + /// primary username. + #[pallet::storage] + #[pallet::getter(fn username)] + pub(super) type AccountOfUsername = + StorageMap<_, Blake2_128Concat, Username, T::AccountId, OptionQuery>; + + /// Usernames that an authority has granted, but that the account controller has not confirmed + /// that they want it. Used primarily in cases where the `AccountId` cannot provide a signature + /// because they are a pure proxy, multisig, etc. In order to confirm it, they should call + /// [`Call::accept_username`]. + /// + /// First tuple item is the account and second is the acceptance deadline. + #[pallet::storage] + #[pallet::getter(fn preapproved_usernames)] + pub type PendingUsernames = StorageMap< + _, + Blake2_128Concat, + Username, + (T::AccountId, BlockNumberFor), + OptionQuery, + >; + #[pallet::error] pub enum Error { /// Too many subs-accounts. @@ -249,6 +333,24 @@ pub mod pallet { JudgementForDifferentIdentity, /// Error that occurs when there is an issue paying for judgement. JudgementPaymentFailed, + /// The provided suffix is too long. + InvalidSuffix, + /// The sender does not have permission to issue a username. + NotUsernameAuthority, + /// The authority cannot allocate any more usernames. + NoAllocation, + /// The signature on a username was not valid. + InvalidSignature, + /// Setting this username requires a signature, but none was provided. + RequiresSignature, + /// The username does not meet the requirements. + InvalidUsername, + /// The username is already taken. + UsernameTaken, + /// The requested username does not exist. + NoUsername, + /// The username cannot be forcefully removed because it can still be accepted. + NotExpired, } #[pallet::event] @@ -275,6 +377,21 @@ pub mod pallet { /// A sub-identity was cleared, and the given deposit repatriated from the /// main identity account to the sub-identity account. SubIdentityRevoked { sub: T::AccountId, main: T::AccountId, deposit: BalanceOf }, + /// A username authority was added. + AuthorityAdded { authority: T::AccountId }, + /// A username authority was removed. + AuthorityRemoved { authority: T::AccountId }, + /// A username was set for `who`. + UsernameSet { who: T::AccountId, username: Username }, + /// A username was queued, but `who` must accept it prior to `expiration`. + UsernameQueued { who: T::AccountId, username: Username, expiration: BlockNumberFor }, + /// A queued username passed its expiration without being claimed and was removed. + PreapprovalExpired { whose: T::AccountId }, + /// A username was set as a primary and can be looked up from `who`. + PrimaryUsernameSet { who: T::AccountId, username: Username }, + /// A dangling username (as in, a username corresponding to an account that has removed its + /// identity) has been removed. + DanglingUsernameRemoved { who: T::AccountId, username: Username }, } #[pallet::call] @@ -331,36 +448,34 @@ pub mod pallet { info: Box, ) -> DispatchResultWithPostInfo { let sender = ensure_signed(origin)?; - let encoded_byte_size = info.encoded_size() as u32; - let byte_deposit = - T::ByteDeposit::get().saturating_mul(>::from(encoded_byte_size)); - - let mut id = match >::get(&sender) { - Some(mut id) => { - // Only keep non-positive judgements. - id.judgements.retain(|j| j.1.is_sticky()); - id.info = *info; - id - }, - None => Registration { - info: *info, - judgements: BoundedVec::default(), - deposit: Zero::zero(), - }, + + let (mut id, username) = match >::get(&sender) { + Some((mut id, maybe_username)) => ( + { + // Only keep non-positive judgements. + id.judgements.retain(|j| j.1.is_sticky()); + id.info = *info; + id + }, + maybe_username, + ), + None => ( + Registration { + info: *info, + judgements: BoundedVec::default(), + deposit: Zero::zero(), + }, + None, + ), }; + let new_deposit = Self::calculate_identity_deposit(&id.info); let old_deposit = id.deposit; - id.deposit = T::BasicDeposit::get().saturating_add(byte_deposit); - if id.deposit > old_deposit { - T::Currency::reserve(&sender, id.deposit - old_deposit)?; - } - if old_deposit > id.deposit { - let err_amount = T::Currency::unreserve(&sender, old_deposit - id.deposit); - debug_assert!(err_amount.is_zero()); - } + Self::rejig_deposit(&sender, old_deposit, new_deposit)?; + id.deposit = new_deposit; let judgements = id.judgements.len(); - >::insert(&sender, id); + >::insert(&sender, (id, username)); Self::deposit_event(Event::IdentitySet { who: sender }); Ok(Some(T::WeightInfo::set_identity(judgements as u32)).into()) @@ -452,11 +567,15 @@ pub mod pallet { let sender = ensure_signed(origin)?; let (subs_deposit, sub_ids) = >::take(&sender); - let id = >::take(&sender).ok_or(Error::::NotNamed)?; + let (id, maybe_username) = + >::take(&sender).ok_or(Error::::NoIdentity)?; let deposit = id.total_deposit().saturating_add(subs_deposit); for sub in sub_ids.iter() { >::remove(sub); } + if let Some(username) = maybe_username { + AccountOfUsername::::remove(username); + } let err_amount = T::Currency::unreserve(&sender, deposit); debug_assert!(err_amount.is_zero()); @@ -501,7 +620,7 @@ pub mod pallet { .and_then(Option::as_ref) .ok_or(Error::::EmptyIndex)?; ensure!(max_fee >= registrar.fee, Error::::FeeChanged); - let mut id = >::get(&sender).ok_or(Error::::NoIdentity)?; + let (mut id, username) = >::get(&sender).ok_or(Error::::NoIdentity)?; let item = (reg_index, Judgement::FeePaid(registrar.fee)); match id.judgements.binary_search_by_key(®_index, |x| x.0) { @@ -518,7 +637,7 @@ pub mod pallet { T::Currency::reserve(&sender, registrar.fee)?; let judgements = id.judgements.len(); - >::insert(&sender, id); + >::insert(&sender, (id, username)); Self::deposit_event(Event::JudgementRequested { who: sender, @@ -545,7 +664,7 @@ pub mod pallet { reg_index: RegistrarIndex, ) -> DispatchResultWithPostInfo { let sender = ensure_signed(origin)?; - let mut id = >::get(&sender).ok_or(Error::::NoIdentity)?; + let (mut id, username) = >::get(&sender).ok_or(Error::::NoIdentity)?; let pos = id .judgements @@ -560,7 +679,7 @@ pub mod pallet { let err_amount = T::Currency::unreserve(&sender, fee); debug_assert!(err_amount.is_zero()); let judgements = id.judgements.len(); - >::insert(&sender, id); + >::insert(&sender, (id, username)); Self::deposit_event(Event::JudgementUnrequested { who: sender, @@ -679,6 +798,8 @@ pub mod pallet { /// - `identity`: The hash of the [`IdentityInformationProvider`] for that the judgement is /// provided. /// + /// Note: Judgements do not apply to a username. + /// /// Emits `JudgementGiven` if successful. #[pallet::call_index(9)] #[pallet::weight(T::WeightInfo::provide_judgement(T::MaxRegistrars::get()))] @@ -697,7 +818,8 @@ pub mod pallet { .and_then(Option::as_ref) .filter(|r| r.account == sender) .ok_or(Error::::InvalidIndex)?; - let mut id = >::get(&target).ok_or(Error::::InvalidTarget)?; + let (mut id, username) = + >::get(&target).ok_or(Error::::InvalidTarget)?; if T::Hashing::hash_of(&id.info) != identity { return Err(Error::::JudgementForDifferentIdentity.into()) @@ -724,7 +846,7 @@ pub mod pallet { } let judgements = id.judgements.len(); - >::insert(&target, id); + >::insert(&target, (id, username)); Self::deposit_event(Event::JudgementGiven { target, registrar_index: reg_index }); Ok(Some(T::WeightInfo::provide_judgement(judgements as u32)).into()) @@ -757,11 +879,15 @@ pub mod pallet { let target = T::Lookup::lookup(target)?; // Grab their deposit (and check that they have one). let (subs_deposit, sub_ids) = >::take(&target); - let id = >::take(&target).ok_or(Error::::NotNamed)?; + let (id, maybe_username) = + >::take(&target).ok_or(Error::::NoIdentity)?; let deposit = id.total_deposit().saturating_add(subs_deposit); for sub in sub_ids.iter() { >::remove(sub); } + if let Some(username) = maybe_username { + AccountOfUsername::::remove(username); + } // Slash their deposit from them. T::Slashed::on_unbalanced(T::Currency::slash_reserved(&target, deposit).0); @@ -886,6 +1012,186 @@ pub mod pallet { }); Ok(()) } + + /// Add an `AccountId` with permission to grant usernames with a given `suffix` appended. + /// + /// The authority can grant up to `allocation` usernames. To top up their allocation, they + /// should just issue (or request via governance) a new `add_username_authority` call. + #[pallet::call_index(15)] + #[pallet::weight(T::WeightInfo::add_username_authority())] + pub fn add_username_authority( + origin: OriginFor, + authority: AccountIdLookupOf, + suffix: Vec, + allocation: u32, + ) -> DispatchResult { + T::UsernameAuthorityOrigin::ensure_origin(origin)?; + let authority = T::Lookup::lookup(authority)?; + // We don't need to check the length because it gets checked when casting into a + // `BoundedVec`. + Self::validate_username(&suffix, None).map_err(|_| Error::::InvalidSuffix)?; + let suffix = Suffix::::try_from(suffix).map_err(|_| Error::::InvalidSuffix)?; + // The authority may already exist, but we don't need to check. They might be changing + // their suffix or adding allocation, so we just want to overwrite whatever was there. + UsernameAuthorities::::insert( + &authority, + AuthorityPropertiesOf:: { suffix, allocation }, + ); + Self::deposit_event(Event::AuthorityAdded { authority }); + Ok(()) + } + + /// Remove `authority` from the username authorities. + #[pallet::call_index(16)] + #[pallet::weight(T::WeightInfo::remove_username_authority())] + pub fn remove_username_authority( + origin: OriginFor, + authority: AccountIdLookupOf, + ) -> DispatchResult { + T::UsernameAuthorityOrigin::ensure_origin(origin)?; + let authority = T::Lookup::lookup(authority)?; + UsernameAuthorities::::take(&authority).ok_or(Error::::NotUsernameAuthority)?; + Self::deposit_event(Event::AuthorityRemoved { authority }); + Ok(()) + } + + /// Set the username for `who`. Must be called by a username authority. + /// + /// The authority must have an `allocation`. Users can either pre-sign their usernames or + /// accept them later. + /// + /// Usernames must: + /// - Only contain lowercase ASCII characters or digits. + /// - When combined with the suffix of the issuing authority be _less than_ the + /// `MaxUsernameLength`. + #[pallet::call_index(17)] + #[pallet::weight(T::WeightInfo::set_username_for())] + pub fn set_username_for( + origin: OriginFor, + who: AccountIdLookupOf, + username: Vec, + signature: Option, + ) -> DispatchResult { + // Ensure origin is a Username Authority and has an allocation. Decrement their + // allocation by one. + let sender = ensure_signed(origin)?; + let suffix = UsernameAuthorities::::try_mutate( + &sender, + |maybe_authority| -> Result, DispatchError> { + let properties = + maybe_authority.as_mut().ok_or(Error::::NotUsernameAuthority)?; + ensure!(properties.allocation > 0, Error::::NoAllocation); + properties.allocation.saturating_dec(); + Ok(properties.suffix.clone()) + }, + )?; + + // Ensure that the username only contains allowed characters. We already know the suffix + // does. + let username_length = username.len().saturating_add(suffix.len()) as u32; + Self::validate_username(&username, Some(username_length))?; + + // Concatenate the username with suffix and cast into a BoundedVec. Should be infallible + // since we already ensured it is below the max length. + let mut full_username = + Vec::with_capacity(username.len().saturating_add(suffix.len()).saturating_add(1)); + full_username.extend(username); + full_username.extend(b"."); + full_username.extend(suffix); + let bounded_username = + Username::::try_from(full_username).map_err(|_| Error::::InvalidUsername)?; + + // Usernames must be unique. Ensure it's not taken. + ensure!( + !AccountOfUsername::::contains_key(&bounded_username), + Error::::UsernameTaken + ); + ensure!( + !PendingUsernames::::contains_key(&bounded_username), + Error::::UsernameTaken + ); + + // Insert or queue. + let who = T::Lookup::lookup(who)?; + if let Some(s) = signature { + // Account has pre-signed an authorization. Verify the signature provided and grant + // the username directly. + let encoded = Encode::encode(&bounded_username.to_vec()); + Self::validate_signature(&encoded, &s, &who)?; + Self::insert_username(&who, bounded_username); + } else { + // The user must accept the username, therefore, queue it. + Self::queue_acceptance(&who, bounded_username); + } + Ok(()) + } + + /// Accept a given username that an `authority` granted. The call must include the full + /// username, as in `username.suffix`. + #[pallet::call_index(18)] + #[pallet::weight(T::WeightInfo::accept_username())] + pub fn accept_username( + origin: OriginFor, + username: Username, + ) -> DispatchResultWithPostInfo { + let who = ensure_signed(origin)?; + let (approved_for, _) = + PendingUsernames::::take(&username).ok_or(Error::::NoUsername)?; + ensure!(approved_for == who.clone(), Error::::InvalidUsername); + Self::insert_username(&who, username.clone()); + Self::deposit_event(Event::UsernameSet { who: who.clone(), username }); + Ok(Pays::No.into()) + } + + /// Remove an expired username approval. The username was approved by an authority but never + /// accepted by the user and must now be beyond its expiration. The call must include the + /// full username, as in `username.suffix`. + #[pallet::call_index(19)] + #[pallet::weight(T::WeightInfo::remove_expired_approval())] + pub fn remove_expired_approval( + origin: OriginFor, + username: Username, + ) -> DispatchResultWithPostInfo { + let _ = ensure_signed(origin)?; + if let Some((who, expiration)) = PendingUsernames::::take(&username) { + let now = frame_system::Pallet::::block_number(); + ensure!(now > expiration, Error::::NotExpired); + Self::deposit_event(Event::PreapprovalExpired { whose: who.clone() }); + Ok(Pays::No.into()) + } else { + Err(Error::::NoUsername.into()) + } + } + + /// Set a given username as the primary. The username should include the suffix. + #[pallet::call_index(20)] + #[pallet::weight(T::WeightInfo::set_primary_username())] + pub fn set_primary_username(origin: OriginFor, username: Username) -> DispatchResult { + // ensure `username` maps to `origin` (i.e. has already been set by an authority). + let who = ensure_signed(origin)?; + ensure!(AccountOfUsername::::contains_key(&username), Error::::NoUsername); + let (registration, _maybe_username) = + IdentityOf::::get(&who).ok_or(Error::::NoIdentity)?; + IdentityOf::::insert(&who, (registration, Some(username.clone()))); + Self::deposit_event(Event::PrimaryUsernameSet { who: who.clone(), username }); + Ok(()) + } + + /// Remove a username that corresponds to an account with no identity. Exists when a user + /// gets a username but then calls `clear_identity`. + #[pallet::call_index(21)] + #[pallet::weight(T::WeightInfo::remove_dangling_username())] + pub fn remove_dangling_username( + origin: OriginFor, + username: Username, + ) -> DispatchResultWithPostInfo { + // ensure `username` maps to `origin` (i.e. has already been set by an authority). + let _ = ensure_signed(origin)?; + let who = AccountOfUsername::::take(&username).ok_or(Error::::NoUsername)?; + ensure!(!IdentityOf::::contains_key(&who), Error::::InvalidUsername); + Self::deposit_event(Event::DanglingUsernameRemoved { who: who.clone(), username }); + Ok(Pays::No.into()) + } } } @@ -925,7 +1231,104 @@ impl Pallet { fields: ::FieldsIdentifier, ) -> bool { IdentityOf::::get(who) - .map_or(false, |registration| (registration.info.has_identity(fields))) + .map_or(false, |(registration, _username)| (registration.info.has_identity(fields))) + } + + /// Calculate the deposit required for an identity. + fn calculate_identity_deposit(info: &T::IdentityInformation) -> BalanceOf { + let bytes = info.encoded_size() as u32; + let byte_deposit = T::ByteDeposit::get().saturating_mul(>::from(bytes)); + T::BasicDeposit::get().saturating_add(byte_deposit) + } + + /// Validate that a username conforms to allowed characters/format. + /// + /// The function will validate the characters in `username` and that `length` (if `Some`) + /// conforms to the limit. It is not expected to pass a fully formatted username here (i.e. one + /// with any protocol-added characters included, such as a `.`). The suffix is also separately + /// validated by this function to ensure the full username conforms. + fn validate_username(username: &Vec, length: Option) -> DispatchResult { + // Verify input length before allocating a Vec with the user's input. `<` instead of `<=` + // because it needs one element for the point (`username` + `.` + `suffix`). + if let Some(l) = length { + ensure!(l < T::MaxUsernameLength::get(), Error::::InvalidUsername); + } + // Usernames cannot be empty. + ensure!(!username.is_empty(), Error::::InvalidUsername); + // Username must be lowercase and alphanumeric. + ensure!( + username.iter().all(|byte| byte.is_ascii_digit() || byte.is_ascii_lowercase()), + Error::::InvalidUsername + ); + Ok(()) + } + + /// Validate a signature. Supports signatures on raw `data` or `data` wrapped in HTML ``. + pub fn validate_signature( + data: &Vec, + signature: &T::OffchainSignature, + signer: &T::AccountId, + ) -> DispatchResult { + // Happy path, user has signed the raw data. + if signature.verify(&data[..], &signer) { + return Ok(()) + } + // NOTE: for security reasons modern UIs implicitly wrap the data requested to sign into + // ` + data + `, so why we support both wrapped and raw versions. + let prefix = b""; + let suffix = b""; + let mut wrapped: Vec = Vec::with_capacity(data.len() + prefix.len() + suffix.len()); + wrapped.extend(prefix); + wrapped.extend(data); + wrapped.extend(suffix); + + ensure!(signature.verify(&wrapped[..], &signer), Error::::InvalidSignature); + + Ok(()) + } + + /// A username has met all conditions. Insert the relevant storage items. + pub fn insert_username(who: &T::AccountId, username: Username) { + // Check if they already have a primary. If so, leave it. If not, set it. + // Likewise, check if they have an identity. If not, give them a minimal one. + let (reg, primary_username, new_is_primary) = match >::get(&who) { + // User has an existing Identity and a primary username. Leave it. + Some((reg, Some(primary))) => (reg, primary, false), + // User has an Identity but no primary. Set the new one as primary. + Some((reg, None)) => (reg, username.clone(), true), + // User does not have an existing Identity. Give them a fresh default one and set + // their username as primary. + None => ( + Registration { + info: Default::default(), + judgements: Default::default(), + deposit: Zero::zero(), + }, + username.clone(), + true, + ), + }; + + // Enter in identity map. Note: In the case that the user did not have a pre-existing + // Identity, we have given them the storage item for free. If they ever call + // `set_identity` with identity info, then they will need to place the normal identity + // deposit. + IdentityOf::::insert(&who, (reg, Some(primary_username))); + // Enter in username map. + AccountOfUsername::::insert(username.clone(), &who); + Self::deposit_event(Event::UsernameSet { who: who.clone(), username: username.clone() }); + if new_is_primary { + Self::deposit_event(Event::PrimaryUsernameSet { who: who.clone(), username }); + } + } + + /// A username was granted by an authority, but must be accepted by `who`. Put the username + /// into a queue for acceptance. + pub fn queue_acceptance(who: &T::AccountId, username: Username) { + let now = frame_system::Pallet::::block_number(); + let expiration = now.saturating_add(T::PendingUsernameExpiration::get()); + PendingUsernames::::insert(&username, (who.clone(), expiration)); + Self::deposit_event(Event::UsernameQueued { who: who.clone(), username, expiration }); } /// Reap an identity, clearing associated storage items and refunding any deposits. This @@ -943,7 +1346,7 @@ impl Pallet { pub fn reap_identity(who: &T::AccountId) -> Result<(u32, u32, u32), DispatchError> { // `take` any storage items keyed by `target` // identity - let id = >::take(&who).ok_or(Error::::NotNamed)?; + let (id, _maybe_username) = >::take(&who).ok_or(Error::::NoIdentity)?; let registrars = id.judgements.len() as u32; let encoded_byte_size = id.info.encoded_size() as u32; @@ -976,8 +1379,8 @@ impl Pallet { // Identity Deposit let new_id_deposit = IdentityOf::::try_mutate( &target, - |registration| -> Result, DispatchError> { - let reg = registration.as_mut().ok_or(Error::::NoIdentity)?; + |identity_of| -> Result, DispatchError> { + let (reg, _) = identity_of.as_mut().ok_or(Error::::NoIdentity)?; // Calculate what deposit should be let encoded_byte_size = reg.info.encoded_size() as u32; let byte_deposit = @@ -1014,11 +1417,14 @@ impl Pallet { ) -> DispatchResult { IdentityOf::::insert( &who, - Registration { - judgements: Default::default(), - deposit: Zero::zero(), - info: info.clone(), - }, + ( + Registration { + judgements: Default::default(), + deposit: Zero::zero(), + info: info.clone(), + }, + None::>, + ), ); Ok(()) } @@ -1030,7 +1436,6 @@ impl Pallet { who: &T::AccountId, subs: Vec<(T::AccountId, Data)>, ) -> DispatchResult { - use frame_support::BoundedVec; let mut sub_accounts = BoundedVec::::default(); for (sub, name) in subs { >::insert(&sub, (who.clone(), name)); diff --git a/substrate/frame/identity/src/migration.rs b/substrate/frame/identity/src/migration.rs new file mode 100644 index 00000000000..88ac08d1bf5 --- /dev/null +++ b/substrate/frame/identity/src/migration.rs @@ -0,0 +1,124 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Storage migrations for the Identity pallet. + +use super::*; +use frame_support::{migrations::VersionedMigration, pallet_prelude::*, traits::OnRuntimeUpgrade}; + +#[cfg(feature = "try-runtime")] +use codec::{Decode, Encode}; +#[cfg(feature = "try-runtime")] +use sp_runtime::TryRuntimeError; + +pub mod versioned { + use super::*; + + pub type V0ToV1 = VersionedMigration< + 0, + 1, + v1::VersionUncheckedMigrateV0ToV1, + crate::pallet::Pallet, + ::DbWeight, + >; +} + +pub mod v1 { + use super::*; + + /// The log target. + const TARGET: &'static str = "runtime::identity::migration::v1"; + + /// The old identity type, useful in pre-upgrade. + mod v0 { + use super::*; + use frame_support::storage_alias; + + #[storage_alias] + pub type IdentityOf = StorageMap< + Pallet, + Twox64Concat, + ::AccountId, + Registration< + BalanceOf, + ::MaxRegistrars, + ::IdentityInformation, + >, + OptionQuery, + >; + } + + /// Migration to add usernames to Identity info. + /// + /// `T` is the runtime and `KL` is the key limit to migrate. This is just a safety guard to + /// prevent stalling a parachain by accumulating too much weight in the migration. To have an + /// unlimited migration (e.g. in a chain without PoV limits), set this to `u64::MAX`. + pub struct VersionUncheckedMigrateV0ToV1(PhantomData); + impl OnRuntimeUpgrade for VersionUncheckedMigrateV0ToV1 { + #[cfg(feature = "try-runtime")] + fn pre_upgrade() -> Result, TryRuntimeError> { + let identities = v0::IdentityOf::::iter().count(); + log::info!( + target: TARGET, + "pre-upgrade state contains '{}' identities.", + identities + ); + ensure!((identities as u64) < KL, "too many identities to migrate"); + Ok((identities as u64).encode()) + } + + fn on_runtime_upgrade() -> Weight { + log::info!( + target: TARGET, + "running storage migration from version 0 to version 1." + ); + + let mut weight = T::DbWeight::get().reads(1); + let mut translated: u64 = 0; + let mut interrupted = false; + + for (account, registration) in v0::IdentityOf::::iter() { + IdentityOf::::insert(account, (registration, None::>)); + translated.saturating_inc(); + if translated >= KL { + log::warn!( + "Incomplete! Migration limit reached. Only {} identities migrated.", + translated + ); + interrupted = true; + break + } + } + if !interrupted { + log::info!("all {} identities migrated", translated); + } + + weight.saturating_accrue(T::DbWeight::get().reads_writes(translated, translated)); + weight.saturating_accrue(T::DbWeight::get().writes(1)); + weight + } + + #[cfg(feature = "try-runtime")] + fn post_upgrade(state: Vec) -> Result<(), TryRuntimeError> { + let identities_to_migrate: u64 = Decode::decode(&mut &state[..]) + .expect("failed to decode the state from pre-upgrade."); + let identities = IdentityOf::::iter().count() as u64; + log::info!("post-upgrade expects '{}' identities to have been migrated.", identities); + ensure!(identities_to_migrate == identities, "must migrate all identities."); + log::info!(target: TARGET, "migrated all identities."); + Ok(()) + } + } +} diff --git a/substrate/frame/identity/src/tests.rs b/substrate/frame/identity/src/tests.rs index 8ac7b4d66cb..4da31782261 100644 --- a/substrate/frame/identity/src/tests.rs +++ b/substrate/frame/identity/src/tests.rs @@ -25,17 +25,23 @@ use crate::{ use codec::{Decode, Encode}; use frame_support::{ - assert_noop, assert_ok, derive_impl, ord_parameter_types, parameter_types, - traits::{ConstU32, ConstU64, EitherOfDiverse, Get}, + assert_noop, assert_ok, derive_impl, parameter_types, + traits::{ConstU32, ConstU64, Get, OnFinalize, OnInitialize}, BoundedVec, }; -use frame_system::{EnsureRoot, EnsureSignedBy}; +use frame_system::EnsureRoot; use sp_core::H256; +use sp_io::crypto::{sr25519_generate, sr25519_sign}; +use sp_keystore::{testing::MemoryKeystore, KeystoreExt}; use sp_runtime::{ - traits::{BadOrigin, BlakeTwo256, IdentityLookup}, - BuildStorage, + traits::{BadOrigin, BlakeTwo256, IdentifyAccount, IdentityLookup, Verify}, + BuildStorage, MultiSignature, MultiSigner, }; +type AccountIdOf = ::AccountId; +pub type AccountPublic = ::Signer; +pub type AccountId = ::AccountId; + type Block = frame_system::mocking::MockBlock; frame_support::construct_runtime!( @@ -57,7 +63,7 @@ impl frame_system::Config for Test { type Hash = H256; type RuntimeCall = RuntimeCall; type Hashing = BlakeTwo256; - type AccountId = u64; + type AccountId = AccountId; type Lookup = IdentityLookup; type Block = Block; type RuntimeEvent = RuntimeEvent; @@ -96,12 +102,6 @@ parameter_types! { pub const MaxRegistrars: u32 = 20; } -ord_parameter_types! { - pub const One: u64 = 1; - pub const Two: u64 = 2; -} -type EnsureOneOrRoot = EitherOfDiverse, EnsureSignedBy>; -type EnsureTwoOrRoot = EitherOfDiverse, EnsureSignedBy>; impl pallet_identity::Config for Test { type RuntimeEvent = RuntimeEvent; type Currency = Balances; @@ -112,22 +112,102 @@ impl pallet_identity::Config for Test { type MaxSubAccounts = ConstU32<2>; type IdentityInformation = IdentityInfo; type MaxRegistrars = MaxRegistrars; - type RegistrarOrigin = EnsureOneOrRoot; - type ForceOrigin = EnsureTwoOrRoot; + type RegistrarOrigin = EnsureRoot; + type ForceOrigin = EnsureRoot; + type OffchainSignature = MultiSignature; + type SigningPublicKey = AccountPublic; + type UsernameAuthorityOrigin = EnsureRoot; + type PendingUsernameExpiration = ConstU64<100>; + type MaxSuffixLength = ConstU32<7>; + type MaxUsernameLength = ConstU32<32>; type WeightInfo = (); } pub fn new_test_ext() -> sp_io::TestExternalities { let mut t = frame_system::GenesisConfig::::default().build_storage().unwrap(); pallet_balances::GenesisConfig:: { - balances: vec![(1, 100), (2, 100), (3, 100), (10, 1000), (20, 1000), (30, 1000)], + balances: vec![ + (account(1), 100), + (account(2), 100), + (account(3), 100), + (account(10), 1000), + (account(20), 1000), + (account(30), 1000), + ], } .assimilate_storage(&mut t) .unwrap(); - t.into() + let mut ext = sp_io::TestExternalities::new(t); + ext.register_extension(KeystoreExt::new(MemoryKeystore::new())); + ext.execute_with(|| System::set_block_number(1)); + ext +} + +fn run_to_block(n: u64) { + while System::block_number() < n { + Identity::on_finalize(System::block_number()); + Balances::on_finalize(System::block_number()); + System::on_finalize(System::block_number()); + System::set_block_number(System::block_number() + 1); + System::on_initialize(System::block_number()); + Balances::on_initialize(System::block_number()); + Identity::on_initialize(System::block_number()); + } +} + +fn account(id: u8) -> AccountIdOf { + [id; 32].into() +} + +fn account_from_u32(id: u32) -> AccountIdOf { + let mut buffer = [255u8; 32]; + let id_bytes = id.to_le_bytes(); + let id_size = id_bytes.len(); + for ii in 0..buffer.len() / id_size { + let s = ii * id_size; + let e = s + id_size; + buffer[s..e].clone_from_slice(&id_bytes[..]); + } + buffer.into() +} + +fn accounts() -> [AccountIdOf; 8] { + [ + account(1), + account(2), + account(3), + account(4), // unfunded + account(10), + account(20), + account(30), + account(40), // unfunded + ] +} + +fn unfunded_accounts() -> [AccountIdOf; 2] { + [account(100), account(101)] +} + +// First return value is a username that would be submitted as a parameter to the dispatchable. As +// in, it has no suffix attached. Second is a full BoundedVec username with suffix, which is what a +// user would need to sign. +fn test_username_of(int: Vec, suffix: Vec) -> (Vec, Username) { + let base = b"testusername"; + let mut username = Vec::with_capacity(base.len() + int.len()); + username.extend(base); + username.extend(int); + + let mut bounded_username = Vec::with_capacity(username.len() + suffix.len() + 1); + bounded_username.extend(username.clone()); + bounded_username.extend(b"."); + bounded_username.extend(suffix); + let bounded_username = Username::::try_from(bounded_username) + .expect("test usernames should fit within bounds"); + + (username, bounded_username) } -fn ten() -> IdentityInfo { +fn infoof_ten() -> IdentityInfo { IdentityInfo { display: Data::Raw(b"ten".to_vec().try_into().unwrap()), legal: Data::Raw(b"The Right Ordinal Ten, Esq.".to_vec().try_into().unwrap()), @@ -135,7 +215,7 @@ fn ten() -> IdentityInfo { } } -fn twenty() -> IdentityInfo { +fn infoof_twenty() -> IdentityInfo { IdentityInfo { display: Data::Raw(b"twenty".to_vec().try_into().unwrap()), legal: Data::Raw(b"The Right Ordinal Twenty, Esq.".to_vec().try_into().unwrap()), @@ -188,54 +268,58 @@ fn identity_fields_repr_works() { fn editing_subaccounts_should_work() { new_test_ext().execute_with(|| { let data = |x| Data::Raw(vec![x; 1].try_into().unwrap()); + let [one, two, three, _, ten, twenty, _, _] = accounts(); assert_noop!( - Identity::add_sub(RuntimeOrigin::signed(10), 20, data(1)), + Identity::add_sub(RuntimeOrigin::signed(ten.clone()), twenty.clone(), data(1)), Error::::NoIdentity ); - let ten = ten(); - assert_ok!(Identity::set_identity(RuntimeOrigin::signed(10), Box::new(ten.clone()))); - let id_deposit = id_deposit(&ten); - assert_eq!(Balances::free_balance(10), 1000 - id_deposit); + let ten_info = infoof_ten(); + assert_ok!(Identity::set_identity( + RuntimeOrigin::signed(ten.clone()), + Box::new(ten_info.clone()) + )); + let id_deposit = id_deposit(&ten_info); + assert_eq!(Balances::free_balance(ten.clone()), 1000 - id_deposit); let sub_deposit: u64 = <::SubAccountDeposit as Get>::get(); // first sub account - assert_ok!(Identity::add_sub(RuntimeOrigin::signed(10), 1, data(1))); - assert_eq!(SuperOf::::get(1), Some((10, data(1)))); - assert_eq!(Balances::free_balance(10), 1000 - id_deposit - sub_deposit); + assert_ok!(Identity::add_sub(RuntimeOrigin::signed(ten.clone()), one.clone(), data(1))); + assert_eq!(SuperOf::::get(one.clone()), Some((ten.clone(), data(1)))); + assert_eq!(Balances::free_balance(ten.clone()), 1000 - id_deposit - sub_deposit); // second sub account - assert_ok!(Identity::add_sub(RuntimeOrigin::signed(10), 2, data(2))); - assert_eq!(SuperOf::::get(1), Some((10, data(1)))); - assert_eq!(SuperOf::::get(2), Some((10, data(2)))); - assert_eq!(Balances::free_balance(10), 1000 - id_deposit - 2 * sub_deposit); + assert_ok!(Identity::add_sub(RuntimeOrigin::signed(ten.clone()), two.clone(), data(2))); + assert_eq!(SuperOf::::get(one.clone()), Some((ten.clone(), data(1)))); + assert_eq!(SuperOf::::get(two.clone()), Some((ten.clone(), data(2)))); + assert_eq!(Balances::free_balance(ten.clone()), 1000 - id_deposit - 2 * sub_deposit); // third sub account is too many assert_noop!( - Identity::add_sub(RuntimeOrigin::signed(10), 3, data(3)), + Identity::add_sub(RuntimeOrigin::signed(ten.clone()), three.clone(), data(3)), Error::::TooManySubAccounts ); // rename first sub account - assert_ok!(Identity::rename_sub(RuntimeOrigin::signed(10), 1, data(11))); - assert_eq!(SuperOf::::get(1), Some((10, data(11)))); - assert_eq!(SuperOf::::get(2), Some((10, data(2)))); - assert_eq!(Balances::free_balance(10), 1000 - id_deposit - 2 * sub_deposit); + assert_ok!(Identity::rename_sub(RuntimeOrigin::signed(ten.clone()), one.clone(), data(11))); + assert_eq!(SuperOf::::get(one.clone()), Some((ten.clone(), data(11)))); + assert_eq!(SuperOf::::get(two.clone()), Some((ten.clone(), data(2)))); + assert_eq!(Balances::free_balance(ten.clone()), 1000 - id_deposit - 2 * sub_deposit); // remove first sub account - assert_ok!(Identity::remove_sub(RuntimeOrigin::signed(10), 1)); - assert_eq!(SuperOf::::get(1), None); - assert_eq!(SuperOf::::get(2), Some((10, data(2)))); - assert_eq!(Balances::free_balance(10), 1000 - id_deposit - sub_deposit); + assert_ok!(Identity::remove_sub(RuntimeOrigin::signed(ten.clone()), one.clone())); + assert_eq!(SuperOf::::get(one.clone()), None); + assert_eq!(SuperOf::::get(two.clone()), Some((ten.clone(), data(2)))); + assert_eq!(Balances::free_balance(ten.clone()), 1000 - id_deposit - sub_deposit); // add third sub account - assert_ok!(Identity::add_sub(RuntimeOrigin::signed(10), 3, data(3))); - assert_eq!(SuperOf::::get(1), None); - assert_eq!(SuperOf::::get(2), Some((10, data(2)))); - assert_eq!(SuperOf::::get(3), Some((10, data(3)))); - assert_eq!(Balances::free_balance(10), 1000 - id_deposit - 2 * sub_deposit); + assert_ok!(Identity::add_sub(RuntimeOrigin::signed(ten.clone()), three.clone(), data(3))); + assert_eq!(SuperOf::::get(one), None); + assert_eq!(SuperOf::::get(two), Some((ten.clone(), data(2)))); + assert_eq!(SuperOf::::get(three), Some((ten.clone(), data(3)))); + assert_eq!(Balances::free_balance(ten), 1000 - id_deposit - 2 * sub_deposit); }); } @@ -243,35 +327,39 @@ fn editing_subaccounts_should_work() { fn resolving_subaccount_ownership_works() { new_test_ext().execute_with(|| { let data = |x| Data::Raw(vec![x; 1].try_into().unwrap()); + let [one, _, _, _, ten, twenty, _, _] = accounts(); let sub_deposit: u64 = <::SubAccountDeposit as Get>::get(); - let ten = ten(); - let ten_deposit = id_deposit(&ten); - let twenty = twenty(); - let twenty_deposit = id_deposit(&twenty); - assert_ok!(Identity::set_identity(RuntimeOrigin::signed(10), Box::new(ten))); - assert_eq!(Balances::free_balance(10), 1000 - ten_deposit); - assert_ok!(Identity::set_identity(RuntimeOrigin::signed(20), Box::new(twenty))); - assert_eq!(Balances::free_balance(20), 1000 - twenty_deposit); + let ten_info = infoof_ten(); + let ten_deposit = id_deposit(&ten_info); + let twenty_info = infoof_twenty(); + let twenty_deposit = id_deposit(&twenty_info); + assert_ok!(Identity::set_identity(RuntimeOrigin::signed(ten.clone()), Box::new(ten_info))); + assert_eq!(Balances::free_balance(ten.clone()), 1000 - ten_deposit); + assert_ok!(Identity::set_identity( + RuntimeOrigin::signed(twenty.clone()), + Box::new(twenty_info) + )); + assert_eq!(Balances::free_balance(twenty.clone()), 1000 - twenty_deposit); // 10 claims 1 as a subaccount - assert_ok!(Identity::add_sub(RuntimeOrigin::signed(10), 1, data(1))); - assert_eq!(Balances::free_balance(1), 100); - assert_eq!(Balances::free_balance(10), 1000 - ten_deposit - sub_deposit); - assert_eq!(Balances::reserved_balance(10), ten_deposit + sub_deposit); + assert_ok!(Identity::add_sub(RuntimeOrigin::signed(ten.clone()), one.clone(), data(1))); + assert_eq!(Balances::free_balance(one.clone()), 100); + assert_eq!(Balances::free_balance(ten.clone()), 1000 - ten_deposit - sub_deposit); + assert_eq!(Balances::reserved_balance(ten.clone()), ten_deposit + sub_deposit); // 20 cannot claim 1 now assert_noop!( - Identity::add_sub(RuntimeOrigin::signed(20), 1, data(1)), + Identity::add_sub(RuntimeOrigin::signed(twenty.clone()), one.clone(), data(1)), Error::::AlreadyClaimed ); // 1 wants to be with 20 so it quits from 10 - assert_ok!(Identity::quit_sub(RuntimeOrigin::signed(1))); + assert_ok!(Identity::quit_sub(RuntimeOrigin::signed(one.clone()))); // 1 gets the 10 that 10 paid. - assert_eq!(Balances::free_balance(1), 100 + sub_deposit); - assert_eq!(Balances::free_balance(10), 1000 - ten_deposit - sub_deposit); - assert_eq!(Balances::reserved_balance(10), ten_deposit); + assert_eq!(Balances::free_balance(one.clone()), 100 + sub_deposit); + assert_eq!(Balances::free_balance(ten.clone()), 1000 - ten_deposit - sub_deposit); + assert_eq!(Balances::reserved_balance(ten), ten_deposit); // 20 can claim 1 now - assert_ok!(Identity::add_sub(RuntimeOrigin::signed(20), 1, data(1))); + assert_ok!(Identity::add_sub(RuntimeOrigin::signed(twenty), one, data(1))); }); } @@ -288,11 +376,12 @@ fn trailing_zeros_decodes_into_default_data() { #[test] fn adding_registrar_invalid_index() { new_test_ext().execute_with(|| { - assert_ok!(Identity::add_registrar(RuntimeOrigin::signed(1), 3)); - assert_ok!(Identity::set_fee(RuntimeOrigin::signed(3), 0, 10)); + let [_, _, three, _, _, _, _, _] = accounts(); + assert_ok!(Identity::add_registrar(RuntimeOrigin::root(), three.clone())); + assert_ok!(Identity::set_fee(RuntimeOrigin::signed(three.clone()), 0, 10)); let fields = IdentityField::Display | IdentityField::Legal; assert_noop!( - Identity::set_fields(RuntimeOrigin::signed(3), 100, fields.bits()), + Identity::set_fields(RuntimeOrigin::signed(three), 100, fields.bits()), Error::::InvalidIndex ); }); @@ -301,13 +390,14 @@ fn adding_registrar_invalid_index() { #[test] fn adding_registrar_should_work() { new_test_ext().execute_with(|| { - assert_ok!(Identity::add_registrar(RuntimeOrigin::signed(1), 3)); - assert_ok!(Identity::set_fee(RuntimeOrigin::signed(3), 0, 10)); + let [_, _, three, _, _, _, _, _] = accounts(); + assert_ok!(Identity::add_registrar(RuntimeOrigin::root(), three.clone())); + assert_ok!(Identity::set_fee(RuntimeOrigin::signed(three.clone()), 0, 10)); let fields = IdentityField::Display | IdentityField::Legal; - assert_ok!(Identity::set_fields(RuntimeOrigin::signed(3), 0, fields.bits())); + assert_ok!(Identity::set_fields(RuntimeOrigin::signed(three.clone()), 0, fields.bits())); assert_eq!( Identity::registrars(), - vec![Some(RegistrarInfo { account: 3, fee: 10, fields: fields.bits() })] + vec![Some(RegistrarInfo { account: three, fee: 10, fields: fields.bits() })] ); }); } @@ -315,12 +405,12 @@ fn adding_registrar_should_work() { #[test] fn amount_of_registrars_is_limited() { new_test_ext().execute_with(|| { - for i in 1..MaxRegistrars::get() + 1 { - assert_ok!(Identity::add_registrar(RuntimeOrigin::signed(1), i as u64)); + for ii in 1..MaxRegistrars::get() + 1 { + assert_ok!(Identity::add_registrar(RuntimeOrigin::root(), account_from_u32(ii))); } - let last_registrar = MaxRegistrars::get() as u64 + 1; + let last_registrar = MaxRegistrars::get() + 1; assert_noop!( - Identity::add_registrar(RuntimeOrigin::signed(1), last_registrar), + Identity::add_registrar(RuntimeOrigin::root(), account_from_u32(last_registrar)), Error::::TooManyRegistrars ); }); @@ -329,68 +419,79 @@ fn amount_of_registrars_is_limited() { #[test] fn registration_should_work() { new_test_ext().execute_with(|| { - assert_ok!(Identity::add_registrar(RuntimeOrigin::signed(1), 3)); - assert_ok!(Identity::set_fee(RuntimeOrigin::signed(3), 0, 10)); - let mut three_fields = ten(); + let [_, _, three, _, ten, _, _, _] = accounts(); + assert_ok!(Identity::add_registrar(RuntimeOrigin::root(), three.clone())); + assert_ok!(Identity::set_fee(RuntimeOrigin::signed(three.clone()), 0, 10)); + let mut three_fields = infoof_ten(); three_fields.additional.try_push(Default::default()).unwrap(); three_fields.additional.try_push(Default::default()).unwrap(); assert!(three_fields.additional.try_push(Default::default()).is_err()); - let ten = ten(); - let id_deposit = id_deposit(&ten); - assert_ok!(Identity::set_identity(RuntimeOrigin::signed(10), Box::new(ten.clone()))); - assert_eq!(Identity::identity(10).unwrap().info, ten); - assert_eq!(Balances::free_balance(10), 1000 - id_deposit); - assert_ok!(Identity::clear_identity(RuntimeOrigin::signed(10))); - assert_eq!(Balances::free_balance(10), 1000); - assert_noop!(Identity::clear_identity(RuntimeOrigin::signed(10)), Error::::NotNamed); + let ten_info = infoof_ten(); + let id_deposit = id_deposit(&ten_info); + assert_ok!(Identity::set_identity( + RuntimeOrigin::signed(ten.clone()), + Box::new(ten_info.clone()) + )); + assert_eq!(Identity::identity(ten.clone()).unwrap().0.info, ten_info); + assert_eq!(Balances::free_balance(ten.clone()), 1000 - id_deposit); + assert_ok!(Identity::clear_identity(RuntimeOrigin::signed(ten.clone()))); + assert_eq!(Balances::free_balance(ten.clone()), 1000); + assert_noop!( + Identity::clear_identity(RuntimeOrigin::signed(ten)), + Error::::NoIdentity + ); }); } #[test] fn uninvited_judgement_should_work() { new_test_ext().execute_with(|| { + let [_, _, three, _, ten, _, _, _] = accounts(); assert_noop!( Identity::provide_judgement( - RuntimeOrigin::signed(3), + RuntimeOrigin::signed(three.clone()), 0, - 10, + ten.clone(), Judgement::Reasonable, H256::random() ), Error::::InvalidIndex ); - assert_ok!(Identity::add_registrar(RuntimeOrigin::signed(1), 3)); + assert_ok!(Identity::add_registrar(RuntimeOrigin::root(), three.clone())); assert_noop!( Identity::provide_judgement( - RuntimeOrigin::signed(3), + RuntimeOrigin::signed(three.clone()), 0, - 10, + ten.clone(), Judgement::Reasonable, H256::random() ), Error::::InvalidTarget ); - assert_ok!(Identity::set_identity(RuntimeOrigin::signed(10), Box::new(ten()))); + assert_ok!(Identity::set_identity( + RuntimeOrigin::signed(ten.clone()), + Box::new(infoof_ten()) + )); assert_noop!( Identity::provide_judgement( - RuntimeOrigin::signed(3), + RuntimeOrigin::signed(three.clone()), 0, - 10, + ten.clone(), Judgement::Reasonable, H256::random() ), Error::::JudgementForDifferentIdentity ); - let identity_hash = BlakeTwo256::hash_of(&ten()); + let identity_hash = BlakeTwo256::hash_of(&infoof_ten()); assert_noop!( Identity::provide_judgement( - RuntimeOrigin::signed(10), + RuntimeOrigin::signed(ten.clone()), 0, - 10, + ten.clone(), Judgement::Reasonable, identity_hash ), @@ -398,9 +499,9 @@ fn uninvited_judgement_should_work() { ); assert_noop!( Identity::provide_judgement( - RuntimeOrigin::signed(3), + RuntimeOrigin::signed(three.clone()), 0, - 10, + ten.clone(), Judgement::FeePaid(1), identity_hash ), @@ -408,46 +509,51 @@ fn uninvited_judgement_should_work() { ); assert_ok!(Identity::provide_judgement( - RuntimeOrigin::signed(3), + RuntimeOrigin::signed(three.clone()), 0, - 10, + ten.clone(), Judgement::Reasonable, identity_hash )); - assert_eq!(Identity::identity(10).unwrap().judgements, vec![(0, Judgement::Reasonable)]); + assert_eq!(Identity::identity(ten).unwrap().0.judgements, vec![(0, Judgement::Reasonable)]); }); } #[test] fn clearing_judgement_should_work() { new_test_ext().execute_with(|| { - assert_ok!(Identity::add_registrar(RuntimeOrigin::signed(1), 3)); - assert_ok!(Identity::set_identity(RuntimeOrigin::signed(10), Box::new(ten()))); + let [_, _, three, _, ten, _, _, _] = accounts(); + assert_ok!(Identity::add_registrar(RuntimeOrigin::root(), three.clone())); + assert_ok!(Identity::set_identity( + RuntimeOrigin::signed(ten.clone()), + Box::new(infoof_ten()) + )); assert_ok!(Identity::provide_judgement( - RuntimeOrigin::signed(3), + RuntimeOrigin::signed(three.clone()), 0, - 10, + ten.clone(), Judgement::Reasonable, - BlakeTwo256::hash_of(&ten()) + BlakeTwo256::hash_of(&infoof_ten()) )); - assert_ok!(Identity::clear_identity(RuntimeOrigin::signed(10))); - assert_eq!(Identity::identity(10), None); + assert_ok!(Identity::clear_identity(RuntimeOrigin::signed(ten.clone()))); + assert_eq!(Identity::identity(ten), None); }); } #[test] fn killing_slashing_should_work() { new_test_ext().execute_with(|| { - let ten = ten(); - let id_deposit = id_deposit(&ten); - assert_ok!(Identity::set_identity(RuntimeOrigin::signed(10), Box::new(ten))); - assert_noop!(Identity::kill_identity(RuntimeOrigin::signed(1), 10), BadOrigin); - assert_ok!(Identity::kill_identity(RuntimeOrigin::signed(2), 10)); - assert_eq!(Identity::identity(10), None); - assert_eq!(Balances::free_balance(10), 1000 - id_deposit); + let [one, _, _, _, ten, _, _, _] = accounts(); + let ten_info = infoof_ten(); + let id_deposit = id_deposit(&ten_info); + assert_ok!(Identity::set_identity(RuntimeOrigin::signed(ten.clone()), Box::new(ten_info))); + assert_noop!(Identity::kill_identity(RuntimeOrigin::signed(one), ten.clone()), BadOrigin); + assert_ok!(Identity::kill_identity(RuntimeOrigin::root(), ten.clone())); + assert_eq!(Identity::identity(ten.clone()), None); + assert_eq!(Balances::free_balance(ten.clone()), 1000 - id_deposit); assert_noop!( - Identity::kill_identity(RuntimeOrigin::signed(2), 10), - Error::::NotNamed + Identity::kill_identity(RuntimeOrigin::root(), ten), + Error::::NoIdentity ); }); } @@ -455,50 +561,75 @@ fn killing_slashing_should_work() { #[test] fn setting_subaccounts_should_work() { new_test_ext().execute_with(|| { - let ten = ten(); - let id_deposit = id_deposit(&ten); + let [_, _, _, _, ten, twenty, thirty, forty] = accounts(); + let ten_info = infoof_ten(); + let id_deposit = id_deposit(&ten_info); let sub_deposit: u64 = <::SubAccountDeposit as Get>::get(); - let mut subs = vec![(20, Data::Raw(vec![40; 1].try_into().unwrap()))]; + let mut subs = vec![(twenty.clone(), Data::Raw(vec![40; 1].try_into().unwrap()))]; assert_noop!( - Identity::set_subs(RuntimeOrigin::signed(10), subs.clone()), + Identity::set_subs(RuntimeOrigin::signed(ten.clone()), subs.clone()), Error::::NotFound ); - assert_ok!(Identity::set_identity(RuntimeOrigin::signed(10), Box::new(ten))); - assert_eq!(Balances::free_balance(10), 1000 - id_deposit); - assert_ok!(Identity::set_subs(RuntimeOrigin::signed(10), subs.clone())); - assert_eq!(Balances::free_balance(10), 1000 - id_deposit - sub_deposit); - assert_eq!(Identity::subs_of(10), (sub_deposit, vec![20].try_into().unwrap())); - assert_eq!(Identity::super_of(20), Some((10, Data::Raw(vec![40; 1].try_into().unwrap())))); + assert_ok!(Identity::set_identity(RuntimeOrigin::signed(ten.clone()), Box::new(ten_info))); + assert_eq!(Balances::free_balance(ten.clone()), 1000 - id_deposit); + assert_ok!(Identity::set_subs(RuntimeOrigin::signed(ten.clone()), subs.clone())); + assert_eq!(Balances::free_balance(ten.clone()), 1000 - id_deposit - sub_deposit); + assert_eq!( + Identity::subs_of(ten.clone()), + (sub_deposit, vec![twenty.clone()].try_into().unwrap()) + ); + assert_eq!( + Identity::super_of(twenty.clone()), + Some((ten.clone(), Data::Raw(vec![40; 1].try_into().unwrap()))) + ); // push another item and re-set it. - subs.push((30, Data::Raw(vec![50; 1].try_into().unwrap()))); - assert_ok!(Identity::set_subs(RuntimeOrigin::signed(10), subs.clone())); - assert_eq!(Balances::free_balance(10), 1000 - id_deposit - 2 * sub_deposit); - assert_eq!(Identity::subs_of(10), (2 * sub_deposit, vec![20, 30].try_into().unwrap())); - assert_eq!(Identity::super_of(20), Some((10, Data::Raw(vec![40; 1].try_into().unwrap())))); - assert_eq!(Identity::super_of(30), Some((10, Data::Raw(vec![50; 1].try_into().unwrap())))); + subs.push((thirty.clone(), Data::Raw(vec![50; 1].try_into().unwrap()))); + assert_ok!(Identity::set_subs(RuntimeOrigin::signed(ten.clone()), subs.clone())); + assert_eq!(Balances::free_balance(ten.clone()), 1000 - id_deposit - 2 * sub_deposit); + assert_eq!( + Identity::subs_of(ten.clone()), + (2 * sub_deposit, vec![twenty.clone(), thirty.clone()].try_into().unwrap()) + ); + assert_eq!( + Identity::super_of(twenty.clone()), + Some((ten.clone(), Data::Raw(vec![40; 1].try_into().unwrap()))) + ); + assert_eq!( + Identity::super_of(thirty.clone()), + Some((ten.clone(), Data::Raw(vec![50; 1].try_into().unwrap()))) + ); // switch out one of the items and re-set. - subs[0] = (40, Data::Raw(vec![60; 1].try_into().unwrap())); - assert_ok!(Identity::set_subs(RuntimeOrigin::signed(10), subs.clone())); + subs[0] = (forty.clone(), Data::Raw(vec![60; 1].try_into().unwrap())); + assert_ok!(Identity::set_subs(RuntimeOrigin::signed(ten.clone()), subs.clone())); // no change in the balance - assert_eq!(Balances::free_balance(10), 1000 - id_deposit - 2 * sub_deposit); - assert_eq!(Identity::subs_of(10), (2 * sub_deposit, vec![40, 30].try_into().unwrap())); - assert_eq!(Identity::super_of(20), None); - assert_eq!(Identity::super_of(30), Some((10, Data::Raw(vec![50; 1].try_into().unwrap())))); - assert_eq!(Identity::super_of(40), Some((10, Data::Raw(vec![60; 1].try_into().unwrap())))); + assert_eq!(Balances::free_balance(ten.clone()), 1000 - id_deposit - 2 * sub_deposit); + assert_eq!( + Identity::subs_of(ten.clone()), + (2 * sub_deposit, vec![forty.clone(), thirty.clone()].try_into().unwrap()) + ); + assert_eq!(Identity::super_of(twenty.clone()), None); + assert_eq!( + Identity::super_of(thirty.clone()), + Some((ten.clone(), Data::Raw(vec![50; 1].try_into().unwrap()))) + ); + assert_eq!( + Identity::super_of(forty.clone()), + Some((ten.clone(), Data::Raw(vec![60; 1].try_into().unwrap()))) + ); // clear - assert_ok!(Identity::set_subs(RuntimeOrigin::signed(10), vec![])); - assert_eq!(Balances::free_balance(10), 1000 - id_deposit); - assert_eq!(Identity::subs_of(10), (0, BoundedVec::default())); - assert_eq!(Identity::super_of(30), None); - assert_eq!(Identity::super_of(40), None); + assert_ok!(Identity::set_subs(RuntimeOrigin::signed(ten.clone()), vec![])); + assert_eq!(Balances::free_balance(ten.clone()), 1000 - id_deposit); + assert_eq!(Identity::subs_of(ten.clone()), (0, BoundedVec::default())); + assert_eq!(Identity::super_of(thirty.clone()), None); + assert_eq!(Identity::super_of(forty), None); - subs.push((20, Data::Raw(vec![40; 1].try_into().unwrap()))); + subs.push((twenty, Data::Raw(vec![40; 1].try_into().unwrap()))); assert_noop!( - Identity::set_subs(RuntimeOrigin::signed(10), subs.clone()), + Identity::set_subs(RuntimeOrigin::signed(ten), subs.clone()), Error::::TooManySubAccounts ); }); @@ -507,67 +638,76 @@ fn setting_subaccounts_should_work() { #[test] fn clearing_account_should_remove_subaccounts_and_refund() { new_test_ext().execute_with(|| { - let ten = ten(); - assert_ok!(Identity::set_identity(RuntimeOrigin::signed(10), Box::new(ten.clone()))); - assert_eq!(Balances::free_balance(10), 1000 - id_deposit(&ten)); + let [_, _, _, _, ten, twenty, _, _] = accounts(); + let ten_info = infoof_ten(); + assert_ok!(Identity::set_identity( + RuntimeOrigin::signed(ten.clone()), + Box::new(ten_info.clone()) + )); + assert_eq!(Balances::free_balance(ten.clone()), 1000 - id_deposit(&ten_info)); assert_ok!(Identity::set_subs( - RuntimeOrigin::signed(10), - vec![(20, Data::Raw(vec![40; 1].try_into().unwrap()))] + RuntimeOrigin::signed(ten.clone()), + vec![(twenty.clone(), Data::Raw(vec![40; 1].try_into().unwrap()))] )); - assert_ok!(Identity::clear_identity(RuntimeOrigin::signed(10))); - assert_eq!(Balances::free_balance(10), 1000); - assert!(Identity::super_of(20).is_none()); + assert_ok!(Identity::clear_identity(RuntimeOrigin::signed(ten.clone()))); + assert_eq!(Balances::free_balance(ten), 1000); + assert!(Identity::super_of(twenty).is_none()); }); } #[test] fn killing_account_should_remove_subaccounts_and_not_refund() { new_test_ext().execute_with(|| { - let ten = ten(); - let id_deposit = id_deposit(&ten); + let [_, _, _, _, ten, twenty, _, _] = accounts(); + let ten_info = infoof_ten(); + let id_deposit = id_deposit(&ten_info); let sub_deposit: u64 = <::SubAccountDeposit as Get>::get(); - assert_ok!(Identity::set_identity(RuntimeOrigin::signed(10), Box::new(ten))); - assert_eq!(Balances::free_balance(10), 1000 - id_deposit); + assert_ok!(Identity::set_identity(RuntimeOrigin::signed(ten.clone()), Box::new(ten_info))); + assert_eq!(Balances::free_balance(ten.clone()), 1000 - id_deposit); assert_ok!(Identity::set_subs( - RuntimeOrigin::signed(10), - vec![(20, Data::Raw(vec![40; 1].try_into().unwrap()))] + RuntimeOrigin::signed(ten.clone()), + vec![(twenty.clone(), Data::Raw(vec![40; 1].try_into().unwrap()))] )); - assert_eq!(Balances::free_balance(10), 1000 - id_deposit - sub_deposit); - assert_ok!(Identity::kill_identity(RuntimeOrigin::signed(2), 10)); - assert_eq!(Balances::free_balance(10), 1000 - id_deposit - sub_deposit); - assert!(Identity::super_of(20).is_none()); + assert_eq!(Balances::free_balance(ten.clone()), 1000 - id_deposit - sub_deposit); + assert_ok!(Identity::kill_identity(RuntimeOrigin::root(), ten.clone())); + assert_eq!(Balances::free_balance(ten), 1000 - id_deposit - sub_deposit); + assert!(Identity::super_of(twenty).is_none()); }); } #[test] fn cancelling_requested_judgement_should_work() { new_test_ext().execute_with(|| { - assert_ok!(Identity::add_registrar(RuntimeOrigin::signed(1), 3)); - assert_ok!(Identity::set_fee(RuntimeOrigin::signed(3), 0, 10)); + let [_, _, three, _, ten, _, _, _] = accounts(); + assert_ok!(Identity::add_registrar(RuntimeOrigin::root(), three.clone())); + assert_ok!(Identity::set_fee(RuntimeOrigin::signed(three.clone()), 0, 10)); assert_noop!( - Identity::cancel_request(RuntimeOrigin::signed(10), 0), + Identity::cancel_request(RuntimeOrigin::signed(ten.clone()), 0), Error::::NoIdentity ); - let ten = ten(); - assert_ok!(Identity::set_identity(RuntimeOrigin::signed(10), Box::new(ten.clone()))); - assert_eq!(Balances::free_balance(10), 1000 - id_deposit(&ten)); - assert_ok!(Identity::request_judgement(RuntimeOrigin::signed(10), 0, 10)); - assert_ok!(Identity::cancel_request(RuntimeOrigin::signed(10), 0)); - assert_eq!(Balances::free_balance(10), 1000 - id_deposit(&ten)); + let ten_info = infoof_ten(); + assert_ok!(Identity::set_identity( + RuntimeOrigin::signed(ten.clone()), + Box::new(ten_info.clone()) + )); + assert_eq!(Balances::free_balance(ten.clone()), 1000 - id_deposit(&ten_info)); + assert_ok!(Identity::request_judgement(RuntimeOrigin::signed(ten.clone()), 0, 10)); + assert_ok!(Identity::cancel_request(RuntimeOrigin::signed(ten.clone()), 0)); + assert_eq!(Balances::free_balance(ten.clone()), 1000 - id_deposit(&ten_info)); assert_noop!( - Identity::cancel_request(RuntimeOrigin::signed(10), 0), + Identity::cancel_request(RuntimeOrigin::signed(ten.clone()), 0), Error::::NotFound ); assert_ok!(Identity::provide_judgement( - RuntimeOrigin::signed(3), + RuntimeOrigin::signed(three), 0, - 10, + ten.clone(), Judgement::Reasonable, - BlakeTwo256::hash_of(&ten) + BlakeTwo256::hash_of(&ten_info) )); assert_noop!( - Identity::cancel_request(RuntimeOrigin::signed(10), 0), + Identity::cancel_request(RuntimeOrigin::signed(ten), 0), Error::::JudgementGiven ); }); @@ -576,79 +716,87 @@ fn cancelling_requested_judgement_should_work() { #[test] fn requesting_judgement_should_work() { new_test_ext().execute_with(|| { - assert_ok!(Identity::add_registrar(RuntimeOrigin::signed(1), 3)); - assert_ok!(Identity::set_fee(RuntimeOrigin::signed(3), 0, 10)); - let ten = ten(); - let id_deposit = id_deposit(&ten); - assert_ok!(Identity::set_identity(RuntimeOrigin::signed(10), Box::new(ten.clone()))); - assert_eq!(Balances::free_balance(10), 1000 - id_deposit); + let [_, _, three, four, ten, _, _, _] = accounts(); + assert_ok!(Identity::add_registrar(RuntimeOrigin::root(), three.clone())); + assert_ok!(Identity::set_fee(RuntimeOrigin::signed(three.clone()), 0, 10)); + let ten_info = infoof_ten(); + let id_deposit = id_deposit(&ten_info); + assert_ok!(Identity::set_identity( + RuntimeOrigin::signed(ten.clone()), + Box::new(ten_info.clone()) + )); + assert_eq!(Balances::free_balance(ten.clone()), 1000 - id_deposit); assert_noop!( - Identity::request_judgement(RuntimeOrigin::signed(10), 0, 9), + Identity::request_judgement(RuntimeOrigin::signed(ten.clone()), 0, 9), Error::::FeeChanged ); - assert_ok!(Identity::request_judgement(RuntimeOrigin::signed(10), 0, 10)); + assert_ok!(Identity::request_judgement(RuntimeOrigin::signed(ten.clone()), 0, 10)); // 10 for the judgement request and the deposit for the identity. - assert_eq!(Balances::free_balance(10), 1000 - id_deposit - 10); + assert_eq!(Balances::free_balance(ten.clone()), 1000 - id_deposit - 10); // Re-requesting won't work as we already paid. assert_noop!( - Identity::request_judgement(RuntimeOrigin::signed(10), 0, 10), + Identity::request_judgement(RuntimeOrigin::signed(ten.clone()), 0, 10), Error::::StickyJudgement ); assert_ok!(Identity::provide_judgement( - RuntimeOrigin::signed(3), + RuntimeOrigin::signed(three.clone()), 0, - 10, + ten.clone(), Judgement::Erroneous, - BlakeTwo256::hash_of(&ten) + BlakeTwo256::hash_of(&ten_info) )); // Registrar got their payment now. // 100 initial balance and 10 for the judgement. - assert_eq!(Balances::free_balance(3), 100 + 10); + assert_eq!(Balances::free_balance(three.clone()), 100 + 10); // Re-requesting still won't work as it's erroneous. assert_noop!( - Identity::request_judgement(RuntimeOrigin::signed(10), 0, 10), + Identity::request_judgement(RuntimeOrigin::signed(ten.clone()), 0, 10), Error::::StickyJudgement ); // Requesting from a second registrar still works. - assert_ok!(Identity::add_registrar(RuntimeOrigin::signed(1), 4)); - assert_ok!(Identity::request_judgement(RuntimeOrigin::signed(10), 1, 10)); + assert_ok!(Identity::add_registrar(RuntimeOrigin::root(), four)); + assert_ok!(Identity::request_judgement(RuntimeOrigin::signed(ten.clone()), 1, 10)); // Re-requesting after the judgement has been reduced works. assert_ok!(Identity::provide_judgement( - RuntimeOrigin::signed(3), + RuntimeOrigin::signed(three), 0, - 10, + ten.clone(), Judgement::OutOfDate, - BlakeTwo256::hash_of(&ten) + BlakeTwo256::hash_of(&ten_info) )); - assert_ok!(Identity::request_judgement(RuntimeOrigin::signed(10), 0, 10)); + assert_ok!(Identity::request_judgement(RuntimeOrigin::signed(ten), 0, 10)); }); } #[test] fn provide_judgement_should_return_judgement_payment_failed_error() { new_test_ext().execute_with(|| { - let ten = ten(); - let id_deposit = id_deposit(&ten); - assert_ok!(Identity::add_registrar(RuntimeOrigin::signed(1), 3)); - assert_ok!(Identity::set_fee(RuntimeOrigin::signed(3), 0, 10)); - assert_ok!(Identity::set_identity(RuntimeOrigin::signed(10), Box::new(ten.clone()))); - assert_ok!(Identity::request_judgement(RuntimeOrigin::signed(10), 0, 10)); + let [_, _, three, _, ten, _, _, _] = accounts(); + let ten_info = infoof_ten(); + let id_deposit = id_deposit(&ten_info); + assert_ok!(Identity::add_registrar(RuntimeOrigin::root(), three.clone())); + assert_ok!(Identity::set_fee(RuntimeOrigin::signed(three.clone()), 0, 10)); + assert_ok!(Identity::set_identity( + RuntimeOrigin::signed(ten.clone()), + Box::new(ten_info.clone()) + )); + assert_ok!(Identity::request_judgement(RuntimeOrigin::signed(ten.clone()), 0, 10)); // 10 for the judgement request and the deposit for the identity. - assert_eq!(Balances::free_balance(10), 1000 - id_deposit - 10); + assert_eq!(Balances::free_balance(ten.clone()), 1000 - id_deposit - 10); // This forces judgement payment failed error - Balances::make_free_balance_be(&3, 0); + Balances::make_free_balance_be(&three, 0); assert_noop!( Identity::provide_judgement( - RuntimeOrigin::signed(3), + RuntimeOrigin::signed(three.clone()), 0, - 10, + ten.clone(), Judgement::Erroneous, - BlakeTwo256::hash_of(&ten) + BlakeTwo256::hash_of(&ten_info) ), Error::::JudgementPaymentFailed ); @@ -658,8 +806,9 @@ fn provide_judgement_should_return_judgement_payment_failed_error() { #[test] fn field_deposit_should_work() { new_test_ext().execute_with(|| { - assert_ok!(Identity::add_registrar(RuntimeOrigin::signed(1), 3)); - assert_ok!(Identity::set_fee(RuntimeOrigin::signed(3), 0, 10)); + let [_, _, three, _, ten, _, _, _] = accounts(); + assert_ok!(Identity::add_registrar(RuntimeOrigin::root(), three.clone())); + assert_ok!(Identity::set_fee(RuntimeOrigin::signed(three), 0, 10)); let id = IdentityInfo { additional: vec![ ( @@ -676,39 +825,44 @@ fn field_deposit_should_work() { ..Default::default() }; let id_deposit = id_deposit(&id); - assert_ok!(Identity::set_identity(RuntimeOrigin::signed(10), Box::new(id))); - assert_eq!(Balances::free_balance(10), 1000 - id_deposit); + assert_ok!(Identity::set_identity(RuntimeOrigin::signed(ten.clone()), Box::new(id))); + assert_eq!(Balances::free_balance(ten), 1000 - id_deposit); }); } #[test] fn setting_account_id_should_work() { new_test_ext().execute_with(|| { - assert_ok!(Identity::add_registrar(RuntimeOrigin::signed(1), 3)); + let [_, _, three, four, _, _, _, _] = accounts(); + assert_ok!(Identity::add_registrar(RuntimeOrigin::root(), three.clone())); // account 4 cannot change the first registrar's identity since it's owned by 3. assert_noop!( - Identity::set_account_id(RuntimeOrigin::signed(4), 0, 3), + Identity::set_account_id(RuntimeOrigin::signed(four.clone()), 0, three.clone()), Error::::InvalidIndex ); // account 3 can, because that's the registrar's current account. - assert_ok!(Identity::set_account_id(RuntimeOrigin::signed(3), 0, 4)); + assert_ok!(Identity::set_account_id(RuntimeOrigin::signed(three.clone()), 0, four.clone())); // account 4 can now, because that's their new ID. - assert_ok!(Identity::set_account_id(RuntimeOrigin::signed(4), 0, 3)); + assert_ok!(Identity::set_account_id(RuntimeOrigin::signed(four), 0, three)); }); } #[test] fn test_has_identity() { new_test_ext().execute_with(|| { - assert_ok!(Identity::set_identity(RuntimeOrigin::signed(10), Box::new(ten()))); - assert!(Identity::has_identity(&10, IdentityField::Display as u64)); - assert!(Identity::has_identity(&10, IdentityField::Legal as u64)); + let [_, _, _, _, ten, _, _, _] = accounts(); + assert_ok!(Identity::set_identity( + RuntimeOrigin::signed(ten.clone()), + Box::new(infoof_ten()) + )); + assert!(Identity::has_identity(&ten, IdentityField::Display as u64)); + assert!(Identity::has_identity(&ten, IdentityField::Legal as u64)); assert!(Identity::has_identity( - &10, + &ten, IdentityField::Display as u64 | IdentityField::Legal as u64 )); assert!(!Identity::has_identity( - &10, + &ten, IdentityField::Display as u64 | IdentityField::Legal as u64 | IdentityField::Web as u64 )); }); @@ -717,66 +871,759 @@ fn test_has_identity() { #[test] fn reap_identity_works() { new_test_ext().execute_with(|| { - let ten_info = ten(); - assert_ok!(Identity::set_identity(RuntimeOrigin::signed(10), Box::new(ten_info.clone()))); + let [_, _, _, _, ten, twenty, _, _] = accounts(); + let ten_info = infoof_ten(); + assert_ok!(Identity::set_identity( + RuntimeOrigin::signed(ten.clone()), + Box::new(ten_info.clone()) + )); assert_ok!(Identity::set_subs( - RuntimeOrigin::signed(10), - vec![(20, Data::Raw(vec![40; 1].try_into().unwrap()))] + RuntimeOrigin::signed(ten.clone()), + vec![(twenty.clone(), Data::Raw(vec![40; 1].try_into().unwrap()))] )); // deposit is correct let id_deposit = id_deposit(&ten_info); let subs_deposit: u64 = <::SubAccountDeposit as Get>::get(); - assert_eq!(Balances::free_balance(10), 1000 - id_deposit - subs_deposit); + assert_eq!(Balances::free_balance(ten.clone()), 1000 - id_deposit - subs_deposit); // reap - assert_ok!(Identity::reap_identity(&10)); + assert_ok!(Identity::reap_identity(&ten)); // no identity or subs - assert!(Identity::identity(10).is_none()); - assert!(Identity::super_of(20).is_none()); + assert!(Identity::identity(ten.clone()).is_none()); + assert!(Identity::super_of(twenty).is_none()); // balance is unreserved - assert_eq!(Balances::free_balance(10), 1000); + assert_eq!(Balances::free_balance(ten), 1000); }); } #[test] fn poke_deposit_works() { new_test_ext().execute_with(|| { - let ten_info = ten(); + let [_, _, _, _, ten, twenty, _, _] = accounts(); + let ten_info = infoof_ten(); // Set a custom registration with 0 deposit - IdentityOf::::insert( - &10, - Registration { - judgements: BoundedVec::default(), - deposit: Zero::zero(), - info: ten_info.clone(), - }, - ); - assert!(Identity::identity(10).is_some()); + IdentityOf::::insert::< + _, + ( + Registration>, + Option>, + ), + >( + &ten, + ( + Registration { + judgements: Default::default(), + deposit: Zero::zero(), + info: ten_info.clone(), + }, + None::>, + ), + ); + assert!(Identity::identity(ten.clone()).is_some()); // Set a sub with zero deposit - SubsOf::::insert::<&u64, (u64, BoundedVec>)>( - &10, - (0, vec![20].try_into().unwrap()), + SubsOf::::insert::<_, (u64, BoundedVec, ConstU32<2>>)>( + &ten, + (0, vec![twenty.clone()].try_into().unwrap()), ); - SuperOf::::insert(&20, (&10, Data::Raw(vec![1; 1].try_into().unwrap()))); + SuperOf::::insert(&twenty, (&ten, Data::Raw(vec![1; 1].try_into().unwrap()))); // Balance is free - assert_eq!(Balances::free_balance(10), 1000); + assert_eq!(Balances::free_balance(ten.clone()), 1000); // poke - assert_ok!(Identity::poke_deposit(&10)); + assert_ok!(Identity::poke_deposit(&ten)); // free balance reduced correctly let id_deposit = id_deposit(&ten_info); let subs_deposit: u64 = <::SubAccountDeposit as Get>::get(); - assert_eq!(Balances::free_balance(10), 1000 - id_deposit - subs_deposit); + assert_eq!(Balances::free_balance(ten.clone()), 1000 - id_deposit - subs_deposit); // new registration deposit is 10 assert_eq!( - Identity::identity(&10), - Some(Registration { - judgements: BoundedVec::default(), - deposit: id_deposit, - info: ten() + Identity::identity(&ten), + Some(( + Registration { + judgements: Default::default(), + deposit: id_deposit, + info: infoof_ten() + }, + None + )) + ); + // new subs deposit is 10 vvvvvvvvvvvv + assert_eq!(Identity::subs_of(ten), (subs_deposit, vec![twenty].try_into().unwrap())); + }); +} + +#[test] +fn adding_and_removing_authorities_should_work() { + new_test_ext().execute_with(|| { + let [authority, _] = unfunded_accounts(); + let suffix: Vec = b"test".to_vec(); + let allocation: u32 = 10; + + // add + assert_ok!(Identity::add_username_authority( + RuntimeOrigin::root(), + authority.clone(), + suffix.clone(), + allocation + )); + assert_eq!( + UsernameAuthorities::::get(&authority), + Some(AuthorityPropertiesOf:: { + suffix: suffix.clone().try_into().unwrap(), + allocation + }) + ); + + // update allocation + assert_ok!(Identity::add_username_authority( + RuntimeOrigin::root(), + authority.clone(), + suffix.clone(), + 11u32 + )); + assert_eq!( + UsernameAuthorities::::get(&authority), + Some(AuthorityPropertiesOf:: { + suffix: suffix.try_into().unwrap(), + allocation: 11 }) ); - // new subs deposit is 10 vvvvvvvvvvvv - assert_eq!(Identity::subs_of(10), (subs_deposit, vec![20].try_into().unwrap())); + + // remove + assert_ok!(Identity::remove_username_authority(RuntimeOrigin::root(), authority.clone(),)); + assert!(UsernameAuthorities::::get(&authority).is_none()); + }); +} + +#[test] +fn set_username_with_signature_without_existing_identity_should_work() { + new_test_ext().execute_with(|| { + // set up authority + let [authority, _] = unfunded_accounts(); + let suffix: Vec = b"test".to_vec(); + let allocation: u32 = 10; + assert_ok!(Identity::add_username_authority( + RuntimeOrigin::root(), + authority.clone(), + suffix.clone(), + allocation + )); + + // set up username + let (username, username_to_sign) = test_username_of(b"42".to_vec(), suffix); + let encoded_username = Encode::encode(&username_to_sign.to_vec()); + + // set up user and sign message + let public = sr25519_generate(0.into(), None); + let who_account: AccountIdOf = MultiSigner::Sr25519(public).into_account().into(); + let signature = + MultiSignature::Sr25519(sr25519_sign(0.into(), &public, &encoded_username).unwrap()); + + assert_ok!(Identity::set_username_for( + RuntimeOrigin::signed(authority), + who_account.clone(), + username.clone(), + Some(signature) + )); + + // Even though user has no balance and no identity, they get a default one for free. + assert_eq!( + Identity::identity(&who_account), + Some(( + Registration { + judgements: Default::default(), + deposit: 0, + info: Default::default() + }, + Some(username_to_sign.clone()) + )) + ); + // Lookup from username to account works. + assert_eq!( + AccountOfUsername::::get::<&Username>(&username_to_sign), + Some(who_account) + ); + }); +} + +#[test] +fn set_username_with_signature_with_existing_identity_should_work() { + new_test_ext().execute_with(|| { + // set up authority + let [authority, _] = unfunded_accounts(); + let suffix: Vec = b"test".to_vec(); + let allocation: u32 = 10; + assert_ok!(Identity::add_username_authority( + RuntimeOrigin::root(), + authority.clone(), + suffix.clone(), + allocation + )); + + // set up username + let (username, username_to_sign) = test_username_of(b"42".to_vec(), suffix); + let encoded_username = Encode::encode(&username_to_sign.to_vec()); + + // set up user and sign message + let public = sr25519_generate(0.into(), None); + let who_account: AccountIdOf = MultiSigner::Sr25519(public).into_account().into(); + let signature = + MultiSignature::Sr25519(sr25519_sign(0.into(), &public, &encoded_username).unwrap()); + + // Set an identity for who. They need some balance though. + Balances::make_free_balance_be(&who_account, 1000); + let ten_info = infoof_ten(); + assert_ok!(Identity::set_identity( + RuntimeOrigin::signed(who_account.clone()), + Box::new(ten_info.clone()) + )); + assert_ok!(Identity::set_username_for( + RuntimeOrigin::signed(authority), + who_account.clone(), + username.clone(), + Some(signature) + )); + + assert_eq!( + Identity::identity(&who_account), + Some(( + Registration { + judgements: Default::default(), + deposit: id_deposit(&ten_info), + info: ten_info + }, + Some(username_to_sign.clone()) + )) + ); + assert_eq!( + AccountOfUsername::::get::<&Username>(&username_to_sign), + Some(who_account) + ); + }); +} + +#[test] +fn set_username_with_bytes_signature_should_work() { + new_test_ext().execute_with(|| { + // set up authority + let [authority, _] = unfunded_accounts(); + let suffix: Vec = b"test".to_vec(); + let allocation: u32 = 10; + assert_ok!(Identity::add_username_authority( + RuntimeOrigin::root(), + authority.clone(), + suffix.clone(), + allocation + )); + + // set up user + let public = sr25519_generate(0.into(), None); + let who_account: AccountIdOf = MultiSigner::Sr25519(public).into_account().into(); + + // set up username + let (username, username_to_sign) = test_username_of(b"42".to_vec(), suffix); + let unwrapped_username = username_to_sign.to_vec(); + + // Sign an unwrapped version, as in `username.suffix`. + let unwrapped_encoded = Encode::encode(&unwrapped_username); + let signature_on_unwrapped = + MultiSignature::Sr25519(sr25519_sign(0.into(), &public, &unwrapped_encoded).unwrap()); + + // Trivial + assert_ok!(Identity::validate_signature( + &unwrapped_encoded, + &signature_on_unwrapped, + &who_account + )); + + // Here we are going to wrap the username and suffix in "" and verify that the + // signature verification still works, but only the username gets set in storage. + let prehtml = b""; + let posthtml = b""; + let mut wrapped_username: Vec = + Vec::with_capacity(unwrapped_username.len() + prehtml.len() + posthtml.len()); + wrapped_username.extend(prehtml); + wrapped_username.extend(unwrapped_encoded.clone()); + wrapped_username.extend(posthtml); + let signature_on_wrapped = + MultiSignature::Sr25519(sr25519_sign(0.into(), &public, &wrapped_username).unwrap()); + + // We want to call `validate_signature` on the *unwrapped* username, but the signature on + // the *wrapped* data. + assert_ok!(Identity::validate_signature( + &unwrapped_encoded, + &signature_on_wrapped, + &who_account + )); + + // Make sure it really works in context. Call `set_username_for` with the signature on the + // wrapped data. + assert_ok!(Identity::set_username_for( + RuntimeOrigin::signed(authority), + who_account.clone(), + username, + Some(signature_on_wrapped) + )); + + // The username in storage should not include ``. As in, it's the original + // `username_to_sign`. + assert_eq!( + Identity::identity(&who_account), + Some(( + Registration { + judgements: Default::default(), + deposit: 0, + info: Default::default() + }, + Some(username_to_sign.clone()) + )) + ); + // Likewise for the lookup. + assert_eq!( + AccountOfUsername::::get::<&Username>(&username_to_sign), + Some(who_account) + ); + }); +} + +#[test] +fn set_username_with_acceptance_should_work() { + new_test_ext().execute_with(|| { + // set up authority + let [authority, who] = unfunded_accounts(); + let suffix: Vec = b"test".to_vec(); + let allocation: u32 = 10; + assert_ok!(Identity::add_username_authority( + RuntimeOrigin::root(), + authority.clone(), + suffix.clone(), + allocation + )); + + // set up username + let (username, full_username) = test_username_of(b"101".to_vec(), suffix); + let now = frame_system::Pallet::::block_number(); + let expiration = now + <::PendingUsernameExpiration as Get>::get(); + + assert_ok!(Identity::set_username_for( + RuntimeOrigin::signed(authority), + who.clone(), + username.clone(), + None + )); + + // Should be pending + assert_eq!( + PendingUsernames::::get::<&Username>(&full_username), + Some((who.clone(), expiration)) + ); + + // Now the user can accept + assert_ok!(Identity::accept_username( + RuntimeOrigin::signed(who.clone()), + full_username.clone() + )); + + // No more pending + assert!(PendingUsernames::::get::<&Username>(&full_username).is_none()); + // Check Identity storage + assert_eq!( + Identity::identity(&who), + Some(( + Registration { + judgements: Default::default(), + deposit: 0, + info: Default::default() + }, + Some(full_username.clone()) + )) + ); + // Check reverse lookup + assert_eq!(AccountOfUsername::::get::<&Username>(&full_username), Some(who)); + }); +} + +#[test] +fn invalid_usernames_should_be_rejected() { + new_test_ext().execute_with(|| { + let [authority, who] = unfunded_accounts(); + let allocation: u32 = 10; + let valid_suffix = b"test".to_vec(); + let invalid_suffixes = [ + b"te.st".to_vec(), // not alphanumeric + b"su:ffx".to_vec(), + b"su_ffx".to_vec(), + b"Suffix".to_vec(), // capital + b"suffixes".to_vec(), // too long + ]; + for suffix in invalid_suffixes { + assert_noop!( + Identity::add_username_authority( + RuntimeOrigin::root(), + authority.clone(), + suffix.clone(), + allocation + ), + Error::::InvalidSuffix + ); + } + + // set a valid one now + assert_ok!(Identity::add_username_authority( + RuntimeOrigin::root(), + authority.clone(), + valid_suffix, + allocation + )); + + // set up usernames + let invalid_usernames = [ + b"TestUsername".to_vec(), + b"test_username".to_vec(), + b"test-username".to_vec(), + b"test:username".to_vec(), + b"test.username".to_vec(), + b"test@username".to_vec(), + b"test$username".to_vec(), + //0 1 2 v With `.test` this makes it too long. + b"testusernametestusernametest".to_vec(), + ]; + for username in invalid_usernames { + assert_noop!( + Identity::set_username_for( + RuntimeOrigin::signed(authority.clone()), + who.clone(), + username.clone(), + None + ), + Error::::InvalidUsername + ); + } + + // valid one works + let valid_username = b"testusernametestusernametes".to_vec(); + assert_ok!(Identity::set_username_for( + RuntimeOrigin::signed(authority), + who, + valid_username, + None + )); + }); +} + +#[test] +fn authorities_should_run_out_of_allocation() { + new_test_ext().execute_with(|| { + // set up authority + let [authority, _] = unfunded_accounts(); + let [pi, e, c, _, _, _, _, _] = accounts(); + let suffix: Vec = b"test".to_vec(); + let allocation: u32 = 2; + assert_ok!(Identity::add_username_authority( + RuntimeOrigin::root(), + authority.clone(), + suffix.clone(), + allocation + )); + + assert_ok!(Identity::set_username_for( + RuntimeOrigin::signed(authority.clone()), + pi, + b"username314159".to_vec(), + None + )); + assert_ok!(Identity::set_username_for( + RuntimeOrigin::signed(authority.clone()), + e, + b"username271828".to_vec(), + None + )); + assert_noop!( + Identity::set_username_for( + RuntimeOrigin::signed(authority.clone()), + c, + b"username299792458".to_vec(), + None + ), + Error::::NoAllocation + ); + }); +} + +#[test] +fn setting_primary_should_work() { + new_test_ext().execute_with(|| { + // set up authority + let [authority, _] = unfunded_accounts(); + let suffix: Vec = b"test".to_vec(); + let allocation: u32 = 10; + assert_ok!(Identity::add_username_authority( + RuntimeOrigin::root(), + authority.clone(), + suffix.clone(), + allocation + )); + + // set up user + let public = sr25519_generate(0.into(), None); + let who_account: AccountIdOf = MultiSigner::Sr25519(public).into_account().into(); + + // set up username + let (first_username, first_to_sign) = test_username_of(b"42".to_vec(), suffix.clone()); + let encoded_username = Encode::encode(&first_to_sign.to_vec()); + let first_signature = + MultiSignature::Sr25519(sr25519_sign(0.into(), &public, &encoded_username).unwrap()); + + assert_ok!(Identity::set_username_for( + RuntimeOrigin::signed(authority.clone()), + who_account.clone(), + first_username.clone(), + Some(first_signature) + )); + + // First username set as primary. + assert_eq!( + Identity::identity(&who_account), + Some(( + Registration { + judgements: Default::default(), + deposit: 0, + info: Default::default() + }, + Some(first_to_sign.clone()) + )) + ); + + // set up username + let (second_username, second_to_sign) = test_username_of(b"101".to_vec(), suffix); + let encoded_username = Encode::encode(&second_to_sign.to_vec()); + let second_signature = + MultiSignature::Sr25519(sr25519_sign(0.into(), &public, &encoded_username).unwrap()); + + assert_ok!(Identity::set_username_for( + RuntimeOrigin::signed(authority), + who_account.clone(), + second_username.clone(), + Some(second_signature) + )); + + // The primary is still the first username. + assert_eq!( + Identity::identity(&who_account), + Some(( + Registration { + judgements: Default::default(), + deposit: 0, + info: Default::default() + }, + Some(first_to_sign.clone()) + )) + ); + + // Lookup from both works. + assert_eq!( + AccountOfUsername::::get::<&Username>(&first_to_sign), + Some(who_account.clone()) + ); + assert_eq!( + AccountOfUsername::::get::<&Username>(&second_to_sign), + Some(who_account.clone()) + ); + + assert_ok!(Identity::set_primary_username( + RuntimeOrigin::signed(who_account.clone()), + second_to_sign.clone() + )); + + // The primary is now the second username. + assert_eq!( + Identity::identity(&who_account), + Some(( + Registration { + judgements: Default::default(), + deposit: 0, + info: Default::default() + }, + Some(second_to_sign.clone()) + )) + ); + + // Lookup from both still works. + assert_eq!( + AccountOfUsername::::get::<&Username>(&first_to_sign), + Some(who_account.clone()) + ); + assert_eq!( + AccountOfUsername::::get::<&Username>(&second_to_sign), + Some(who_account) + ); + }); +} + +#[test] +fn unaccepted_usernames_should_expire() { + new_test_ext().execute_with(|| { + // set up authority + let [authority, who] = unfunded_accounts(); + let suffix: Vec = b"test".to_vec(); + let allocation: u32 = 10; + assert_ok!(Identity::add_username_authority( + RuntimeOrigin::root(), + authority.clone(), + suffix.clone(), + allocation + )); + + // set up username + let (username, full_username) = test_username_of(b"101".to_vec(), suffix); + let now = frame_system::Pallet::::block_number(); + let expiration = now + <::PendingUsernameExpiration as Get>::get(); + + assert_ok!(Identity::set_username_for( + RuntimeOrigin::signed(authority), + who.clone(), + username.clone(), + None + )); + + // Should be pending + assert_eq!( + PendingUsernames::::get::<&Username>(&full_username), + Some((who.clone(), expiration)) + ); + + run_to_block(now + expiration - 1); + + // Cannot be removed + assert_noop!( + Identity::remove_expired_approval( + RuntimeOrigin::signed(account(1)), + full_username.clone() + ), + Error::::NotExpired + ); + + run_to_block(now + expiration); + + // Anyone can remove + assert_ok!(Identity::remove_expired_approval( + RuntimeOrigin::signed(account(1)), + full_username.clone() + )); + + // No more pending + assert!(PendingUsernames::::get::<&Username>(&full_username).is_none()); + }); +} + +#[test] +fn removing_dangling_usernames_should_work() { + new_test_ext().execute_with(|| { + // set up authority + let [authority, caller] = unfunded_accounts(); + let suffix: Vec = b"test".to_vec(); + let allocation: u32 = 10; + assert_ok!(Identity::add_username_authority( + RuntimeOrigin::root(), + authority.clone(), + suffix.clone(), + allocation + )); + + // set up username + let (username, username_to_sign) = test_username_of(b"42".to_vec(), suffix.clone()); + let encoded_username = Encode::encode(&username_to_sign.to_vec()); + + // set up user and sign message + let public = sr25519_generate(0.into(), None); + let who_account: AccountIdOf = MultiSigner::Sr25519(public).into_account().into(); + let signature = + MultiSignature::Sr25519(sr25519_sign(0.into(), &public, &encoded_username).unwrap()); + + // Set an identity for who. They need some balance though. + Balances::make_free_balance_be(&who_account, 1000); + let ten_info = infoof_ten(); + assert_ok!(Identity::set_identity( + RuntimeOrigin::signed(who_account.clone()), + Box::new(ten_info.clone()) + )); + assert_ok!(Identity::set_username_for( + RuntimeOrigin::signed(authority.clone()), + who_account.clone(), + username.clone(), + Some(signature) + )); + + // Now they set up a second username. + let (username_two, username_two_to_sign) = test_username_of(b"43".to_vec(), suffix); + let encoded_username_two = Encode::encode(&username_two_to_sign.to_vec()); + + // set up user and sign message + let signature_two = MultiSignature::Sr25519( + sr25519_sign(0.into(), &public, &encoded_username_two).unwrap(), + ); + + assert_ok!(Identity::set_username_for( + RuntimeOrigin::signed(authority), + who_account.clone(), + username_two.clone(), + Some(signature_two) + )); + + // The primary should still be the first one. + assert_eq!( + Identity::identity(&who_account), + Some(( + Registration { + judgements: Default::default(), + deposit: id_deposit(&ten_info), + info: ten_info + }, + Some(username_to_sign.clone()) + )) + ); + + // But both usernames should look up the account. + assert_eq!( + AccountOfUsername::::get::<&Username>(&username_to_sign), + Some(who_account.clone()) + ); + assert_eq!( + AccountOfUsername::::get::<&Username>(&username_two_to_sign), + Some(who_account.clone()) + ); + + // Someone tries to remove it, but they can't + assert_noop!( + Identity::remove_dangling_username( + RuntimeOrigin::signed(caller.clone()), + username_to_sign.clone() + ), + Error::::InvalidUsername + ); + + // Now the user calls `clear_identity` + assert_ok!(Identity::clear_identity(RuntimeOrigin::signed(who_account.clone()),)); + + // Identity is gone + assert!(Identity::identity(who_account.clone()).is_none()); + + // The reverse lookup of the primary is gone. + assert!(AccountOfUsername::::get::<&Username>(&username_to_sign).is_none()); + + // But the reverse lookup of the non-primary is still there + assert_eq!( + AccountOfUsername::::get::<&Username>(&username_two_to_sign), + Some(who_account) + ); + + // Now it can be removed + assert_ok!(Identity::remove_dangling_username( + RuntimeOrigin::signed(caller), + username_two_to_sign.clone() + )); + + // And the reverse lookup is gone + assert!(AccountOfUsername::::get::<&Username>(&username_two_to_sign).is_none()); }); } diff --git a/substrate/frame/identity/src/types.rs b/substrate/frame/identity/src/types.rs index d3e6bf3973f..10f0db8c25d 100644 --- a/substrate/frame/identity/src/types.rs +++ b/substrate/frame/identity/src/types.rs @@ -232,7 +232,7 @@ impl = AuthorityProperties>; + +/// The number of usernames that an authority may allocate. +type Allocation = u32; +/// A byte vec used to represent a username. +pub(crate) type Suffix = BoundedVec::MaxSuffixLength>; + +/// Properties of a username authority. +#[derive(Clone, Encode, Decode, MaxEncodedLen, TypeInfo, PartialEq, Debug)] +pub struct AuthorityProperties { + /// The suffix added to usernames granted by this authority. Will be appended to usernames; for + /// example, a suffix of `wallet` will result in `.wallet` being appended to a user's selected + /// name. + pub suffix: Suffix, + /// The number of usernames remaining that this authority can grant. + pub allocation: Allocation, +} + +/// A byte vec used to represent a username. +pub(crate) type Username = BoundedVec::MaxUsernameLength>; + #[cfg(test)] mod tests { use super::*; diff --git a/substrate/frame/identity/src/weights.rs b/substrate/frame/identity/src/weights.rs index 95898e6c6cd..1feb8252c84 100644 --- a/substrate/frame/identity/src/weights.rs +++ b/substrate/frame/identity/src/weights.rs @@ -68,6 +68,13 @@ pub trait WeightInfo { fn rename_sub(s: u32, ) -> Weight; fn remove_sub(s: u32, ) -> Weight; fn quit_sub(s: u32, ) -> Weight; + fn add_username_authority() -> Weight; + fn remove_username_authority() -> Weight; + fn set_username_for() -> Weight; + fn accept_username() -> Weight; + fn remove_expired_approval() -> Weight; + fn set_primary_username() -> Weight; + fn remove_dangling_username() -> Weight; } /// Weights for pallet_identity using the Substrate node and recommended hardware. @@ -345,6 +352,100 @@ impl WeightInfo for SubstrateWeight { .saturating_add(T::DbWeight::get().reads(3_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } + /// Storage: `Identity::UsernameAuthorities` (r:0 w:1) + /// Proof: `Identity::UsernameAuthorities` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + fn add_username_authority() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 13_873_000 picoseconds. + Weight::from_parts(13_873_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Identity::UsernameAuthorities` (r:0 w:1) + /// Proof: `Identity::UsernameAuthorities` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + fn remove_username_authority() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 10_653_000 picoseconds. + Weight::from_parts(10_653_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Identity::UsernameAuthorities` (r:1 w:1) + /// Proof: `Identity::UsernameAuthorities` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + /// Storage: `Identity::AccountOfUsername` (r:1 w:1) + /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Identity::IdentityOf` (r:1 w:1) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) + fn set_username_for() -> Weight { + // Proof Size summary in bytes: + // Measured: `80` + // Estimated: `11037` + // Minimum execution time: 75_928_000 picoseconds. + Weight::from_parts(75_928_000, 0) + .saturating_add(Weight::from_parts(0, 11037)) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: `Identity::PendingUsernames` (r:1 w:1) + /// Proof: `Identity::PendingUsernames` (`max_values`: None, `max_size`: Some(77), added: 2552, mode: `MaxEncodedLen`) + /// Storage: `Identity::IdentityOf` (r:1 w:1) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) + /// Storage: `Identity::AccountOfUsername` (r:0 w:1) + /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + fn accept_username() -> Weight { + // Proof Size summary in bytes: + // Measured: `106` + // Estimated: `11037` + // Minimum execution time: 38_157_000 picoseconds. + Weight::from_parts(38_157_000, 0) + .saturating_add(Weight::from_parts(0, 11037)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(3)) + } + /// Storage: `Identity::PendingUsernames` (r:1 w:1) + /// Proof: `Identity::PendingUsernames` (`max_values`: None, `max_size`: Some(77), added: 2552, mode: `MaxEncodedLen`) + fn remove_expired_approval() -> Weight { + // Proof Size summary in bytes: + // Measured: `106` + // Estimated: `3542` + // Minimum execution time: 46_821_000 picoseconds. + Weight::from_parts(46_821_000, 0) + .saturating_add(Weight::from_parts(0, 3542)) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Identity::AccountOfUsername` (r:1 w:0) + /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Identity::IdentityOf` (r:1 w:1) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) + fn set_primary_username() -> Weight { + // Proof Size summary in bytes: + // Measured: `247` + // Estimated: `11037` + // Minimum execution time: 22_515_000 picoseconds. + Weight::from_parts(22_515_000, 0) + .saturating_add(Weight::from_parts(0, 11037)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } + /// Storage: `Identity::AccountOfUsername` (r:1 w:1) + /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Identity::IdentityOf` (r:1 w:0) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) + fn remove_dangling_username() -> Weight { + // Proof Size summary in bytes: + // Measured: `126` + // Estimated: `11037` + // Minimum execution time: 15_997_000 picoseconds. + Weight::from_parts(15_997_000, 0) + .saturating_add(Weight::from_parts(0, 11037)) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().writes(1)) + } } // For backwards compatibility and tests @@ -621,4 +722,98 @@ impl WeightInfo for () { .saturating_add(RocksDbWeight::get().reads(3_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } + /// Storage: `Identity::UsernameAuthorities` (r:0 w:1) + /// Proof: `Identity::UsernameAuthorities` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + fn add_username_authority() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 13_873_000 picoseconds. + Weight::from_parts(13_873_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(RocksDbWeight::get().writes(1)) + } + /// Storage: `Identity::UsernameAuthorities` (r:0 w:1) + /// Proof: `Identity::UsernameAuthorities` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + fn remove_username_authority() -> Weight { + // Proof Size summary in bytes: + // Measured: `0` + // Estimated: `0` + // Minimum execution time: 10_653_000 picoseconds. + Weight::from_parts(10_653_000, 0) + .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(RocksDbWeight::get().writes(1)) + } + /// Storage: `Identity::UsernameAuthorities` (r:1 w:1) + /// Proof: `Identity::UsernameAuthorities` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + /// Storage: `Identity::AccountOfUsername` (r:1 w:1) + /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Identity::IdentityOf` (r:1 w:1) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) + fn set_username_for() -> Weight { + // Proof Size summary in bytes: + // Measured: `80` + // Estimated: `11037` + // Minimum execution time: 75_928_000 picoseconds. + Weight::from_parts(75_928_000, 0) + .saturating_add(Weight::from_parts(0, 11037)) + .saturating_add(RocksDbWeight::get().reads(3)) + .saturating_add(RocksDbWeight::get().writes(3)) + } + /// Storage: `Identity::PendingUsernames` (r:1 w:1) + /// Proof: `Identity::PendingUsernames` (`max_values`: None, `max_size`: Some(77), added: 2552, mode: `MaxEncodedLen`) + /// Storage: `Identity::IdentityOf` (r:1 w:1) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) + /// Storage: `Identity::AccountOfUsername` (r:0 w:1) + /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + fn accept_username() -> Weight { + // Proof Size summary in bytes: + // Measured: `106` + // Estimated: `11037` + // Minimum execution time: 38_157_000 picoseconds. + Weight::from_parts(38_157_000, 0) + .saturating_add(Weight::from_parts(0, 11037)) + .saturating_add(RocksDbWeight::get().reads(2)) + .saturating_add(RocksDbWeight::get().writes(3)) + } + /// Storage: `Identity::PendingUsernames` (r:1 w:1) + /// Proof: `Identity::PendingUsernames` (`max_values`: None, `max_size`: Some(77), added: 2552, mode: `MaxEncodedLen`) + fn remove_expired_approval() -> Weight { + // Proof Size summary in bytes: + // Measured: `106` + // Estimated: `3542` + // Minimum execution time: 46_821_000 picoseconds. + Weight::from_parts(46_821_000, 0) + .saturating_add(Weight::from_parts(0, 3542)) + .saturating_add(RocksDbWeight::get().reads(1)) + .saturating_add(RocksDbWeight::get().writes(1)) + } + /// Storage: `Identity::AccountOfUsername` (r:1 w:0) + /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Identity::IdentityOf` (r:1 w:1) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) + fn set_primary_username() -> Weight { + // Proof Size summary in bytes: + // Measured: `247` + // Estimated: `11037` + // Minimum execution time: 22_515_000 picoseconds. + Weight::from_parts(22_515_000, 0) + .saturating_add(Weight::from_parts(0, 11037)) + .saturating_add(RocksDbWeight::get().reads(2)) + .saturating_add(RocksDbWeight::get().writes(1)) + } + /// Storage: `Identity::AccountOfUsername` (r:1 w:1) + /// Proof: `Identity::AccountOfUsername` (`max_values`: None, `max_size`: Some(73), added: 2548, mode: `MaxEncodedLen`) + /// Storage: `Identity::IdentityOf` (r:1 w:0) + /// Proof: `Identity::IdentityOf` (`max_values`: None, `max_size`: Some(7572), added: 10047, mode: `MaxEncodedLen`) + fn remove_dangling_username() -> Weight { + // Proof Size summary in bytes: + // Measured: `126` + // Estimated: `11037` + // Minimum execution time: 15_997_000 picoseconds. + Weight::from_parts(15_997_000, 0) + .saturating_add(Weight::from_parts(0, 11037)) + .saturating_add(RocksDbWeight::get().reads(2)) + .saturating_add(RocksDbWeight::get().writes(1)) + } } -- GitLab From ccd55552a85ae45227abf7e0a4aee803b707229c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jan 2024 11:07:29 +0000 Subject: [PATCH 141/191] Bump parking_lot from 0.11.2 to 0.12.1 (#2901) Bumps [parking_lot](https://github.com/Amanieu/parking_lot) from 0.11.2 to 0.12.1.
Changelog

Sourced from parking_lot's changelog.

parking_lot 0.12.1 (2022-05-31)

  • Fixed incorrect memory ordering in RwLock. (#344)
  • Added Condvar::wait_while convenience methods (#343)

parking_lot_core 0.9.3 (2022-04-30)

  • Bump windows-sys dependency to 0.36. (#339)

parking_lot_core 0.9.2, lock_api 0.4.7 (2022-03-25)

  • Enable const new() on lock types on stable. (#325)
  • Added MutexGuard::leak function. (#333)
  • Bump windows-sys dependency to 0.34. (#331)
  • Bump petgraph dependency to 0.6. (#326)
  • Don't use pthread attributes on the espidf platform. (#319)

parking_lot_core 0.9.1 (2022-02-06)

  • Bump windows-sys dependency to 0.32. (#316)

parking_lot 0.12.0, parking_lot_core 0.9.0, lock_api 0.4.6 (2022-01-28)

  • The MSRV is bumped to 1.49.0.
  • Disabled eventual fairness on wasm32-unknown-unknown. (#302)
  • Added a rwlock method to report if lock is held exclusively. (#303)
  • Use new asm! macro. (#304)
  • Use windows-rs instead of winapi for faster builds. (#311)
  • Moved hardware lock elision support to a separate Cargo feature. (#313)
  • Removed used of deprecated spin_loop_hint. (#314)
Commits
  • 336a9b3 Release parking_lot 0.12.1
  • b69a054 Merge pull request #343 from bryanhitc/master
  • 3fe7233 Merge pull request #344 from Amanieu/fix_rwlock_ordering
  • ef12b00 small test update
  • fdb063c wait_while can't timeout fix
  • 26e19dc Remove WaitWhileResult
  • d26c284 Fix incorrect memory ordering in RwLock
  • 0458283 Use saturating_add for WaitWhileResult
  • 686db47 Add Condvar::wait_while convenience methods
  • 6f6e021 Merge pull request #342 from MarijnS95/patch-1
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=parking_lot&package-manager=cargo&previous-version=0.11.2&new-version=0.12.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 2 +- polkadot/node/core/approval-voting/Cargo.toml | 2 +- polkadot/node/core/av-store/Cargo.toml | 2 +- polkadot/node/core/chain-selection/Cargo.toml | 2 +- polkadot/node/jaeger/Cargo.toml | 2 +- polkadot/node/network/bridge/Cargo.toml | 2 +- polkadot/node/overseer/Cargo.toml | 2 +- polkadot/node/subsystem-test-helpers/Cargo.toml | 2 +- polkadot/node/subsystem-util/Cargo.toml | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 924aeb7848c..59734f77c34 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12985,7 +12985,7 @@ dependencies = [ "log", "parity-db", "parity-scale-codec", - "parking_lot 0.11.2", + "parking_lot 0.12.1", "pin-project", "polkadot-node-jaeger", "polkadot-node-metrics", diff --git a/polkadot/node/core/approval-voting/Cargo.toml b/polkadot/node/core/approval-voting/Cargo.toml index 5fbcec50cd3..0be0cfdea25 100644 --- a/polkadot/node/core/approval-voting/Cargo.toml +++ b/polkadot/node/core/approval-voting/Cargo.toml @@ -42,7 +42,7 @@ rand = "0.8.5" [dev-dependencies] async-trait = "0.1.74" -parking_lot = "0.12.0" +parking_lot = "0.12.1" sp-keyring = { path = "../../../../substrate/primitives/keyring" } sp-keystore = { path = "../../../../substrate/primitives/keystore" } sp-core = { path = "../../../../substrate/primitives/core" } diff --git a/polkadot/node/core/av-store/Cargo.toml b/polkadot/node/core/av-store/Cargo.toml index 4b2baf3fc55..e56fb4f1cdf 100644 --- a/polkadot/node/core/av-store/Cargo.toml +++ b/polkadot/node/core/av-store/Cargo.toml @@ -37,5 +37,5 @@ sp-core = { path = "../../../../substrate/primitives/core" } polkadot-node-subsystem-util = { path = "../../subsystem-util" } polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } sp-keyring = { path = "../../../../substrate/primitives/keyring" } -parking_lot = "0.12.0" +parking_lot = "0.12.1" test-helpers = { package = "polkadot-primitives-test-helpers", path = "../../../primitives/test-helpers" } diff --git a/polkadot/node/core/chain-selection/Cargo.toml b/polkadot/node/core/chain-selection/Cargo.toml index 6056ddd41cd..8e7029876cf 100644 --- a/polkadot/node/core/chain-selection/Cargo.toml +++ b/polkadot/node/core/chain-selection/Cargo.toml @@ -24,6 +24,6 @@ parity-scale-codec = "3.6.1" [dev-dependencies] polkadot-node-subsystem-test-helpers = { path = "../../subsystem-test-helpers" } sp-core = { path = "../../../../substrate/primitives/core" } -parking_lot = "0.12.0" +parking_lot = "0.12.1" assert_matches = "1" kvdb-memorydb = "0.13.0" diff --git a/polkadot/node/jaeger/Cargo.toml b/polkadot/node/jaeger/Cargo.toml index 81947f4f6a4..58fb983c84a 100644 --- a/polkadot/node/jaeger/Cargo.toml +++ b/polkadot/node/jaeger/Cargo.toml @@ -12,7 +12,7 @@ workspace = true [dependencies] mick-jaeger = "0.1.8" lazy_static = "1.4" -parking_lot = "0.12.0" +parking_lot = "0.12.1" polkadot-primitives = { path = "../../primitives" } polkadot-node-primitives = { path = "../primitives" } sc-network = { path = "../../../substrate/client/network" } diff --git a/polkadot/node/network/bridge/Cargo.toml b/polkadot/node/network/bridge/Cargo.toml index a2a4735d7a1..ee4033b0099 100644 --- a/polkadot/node/network/bridge/Cargo.toml +++ b/polkadot/node/network/bridge/Cargo.toml @@ -22,7 +22,7 @@ polkadot-node-metrics = { path = "../../metrics" } polkadot-node-network-protocol = { path = "../protocol" } polkadot-node-subsystem = { path = "../../subsystem" } polkadot-overseer = { path = "../../overseer" } -parking_lot = "0.12.0" +parking_lot = "0.12.1" bytes = "1" fatality = "0.0.6" thiserror = "1" diff --git a/polkadot/node/overseer/Cargo.toml b/polkadot/node/overseer/Cargo.toml index 132a2ed4832..f168bdd0807 100644 --- a/polkadot/node/overseer/Cargo.toml +++ b/polkadot/node/overseer/Cargo.toml @@ -14,7 +14,7 @@ client = { package = "sc-client-api", path = "../../../substrate/client/api" } sp-api = { path = "../../../substrate/primitives/api" } futures = "0.3.21" futures-timer = "3.0.2" -parking_lot = "0.12.0" +parking_lot = "0.12.1" polkadot-node-network-protocol = { path = "../network/protocol" } polkadot-node-primitives = { path = "../primitives" } polkadot-node-subsystem-types = { path = "../subsystem-types" } diff --git a/polkadot/node/subsystem-test-helpers/Cargo.toml b/polkadot/node/subsystem-test-helpers/Cargo.toml index d0be9af4ed6..c71f030568d 100644 --- a/polkadot/node/subsystem-test-helpers/Cargo.toml +++ b/polkadot/node/subsystem-test-helpers/Cargo.toml @@ -13,7 +13,7 @@ workspace = true [dependencies] async-trait = "0.1.74" futures = "0.3.21" -parking_lot = "0.12.0" +parking_lot = "0.12.1" polkadot-node-subsystem = { path = "../subsystem" } polkadot-erasure-coding = { path = "../../erasure-coding" } polkadot-node-subsystem-util = { path = "../subsystem-util" } diff --git a/polkadot/node/subsystem-util/Cargo.toml b/polkadot/node/subsystem-util/Cargo.toml index 6668430d3b7..3147a4f64f4 100644 --- a/polkadot/node/subsystem-util/Cargo.toml +++ b/polkadot/node/subsystem-util/Cargo.toml @@ -15,7 +15,7 @@ futures = "0.3.21" futures-channel = "0.3.23" itertools = "0.10" parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive"] } -parking_lot = "0.11.2" +parking_lot = "0.12.1" pin-project = "1.0.9" rand = "0.8.5" thiserror = "1.0.48" -- GitLab From a56ad80a38cd44f030e04fd0d8883093980f41e5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jan 2024 11:16:49 +0000 Subject: [PATCH 142/191] Bump trybuild from 1.0.83 to 1.0.88 (#2902) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [trybuild](https://github.com/dtolnay/trybuild) from 1.0.83 to 1.0.88.
Release notes

Sourced from trybuild's releases.

1.0.88

  • Work around dead_code warning false positive (#253)

1.0.87

  • Update proc-macro2 to fix caching issue when using a rustc-wrapper such as sccache

1.0.86

1.0.85

  • Set thread name to produce better message on panic (#243, #244)

1.0.84

  • Stabilize usage of Cargo's --keep-going build mode, which parallelizes test compilation for a significant speedup (rust-lang/cargo#12568, #240)
Commits
  • 52caff6 Release 1.0.88
  • 0321a01 Merge pull request #253 from dtolnay/deadflock
  • b720ee6 Work around dead_code warning in flock implementation
  • 0081291 Release 1.0.87
  • e0c4c0d Pull in proc-macro2 sccache fix
  • a6cbfe8 Release 1.0.86
  • 7c5a8fe Merge pull request #252 from dtolnay/cargofeatures
  • d3cd15b Propagate cargo features from source manifest
  • c28428d Merge pull request #251 from dtolnay/skipcargofeatures
  • 3e4029e Omit cargo-features from generated Cargo.toml if empty
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=trybuild&package-manager=cargo&previous-version=1.0.83&new-version=1.0.88)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- polkadot/xcm/procedural/Cargo.toml | 2 +- .../election-provider-support/solution-type/Cargo.toml | 2 +- substrate/frame/support/test/Cargo.toml | 2 +- substrate/primitives/api/test/Cargo.toml | 2 +- substrate/primitives/runtime-interface/Cargo.toml | 2 +- substrate/test-utils/Cargo.toml | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 59734f77c34..3ad73feb5d5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1371,9 +1371,9 @@ checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "basic-toml" -version = "0.1.4" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bfc506e7a2370ec239e1d072507b2a80c833083699d3c6fa176fbb4de8448c6" +checksum = "2db21524cad41c5591204d22d75e1970a2d1f71060214ca931dc7d5afe2c14e5" dependencies = [ "serde", ] @@ -20661,9 +20661,9 @@ dependencies = [ [[package]] name = "trybuild" -version = "1.0.83" +version = "1.0.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6df60d81823ed9c520ee897489573da4b1d79ffbe006b8134f46de1a1aa03555" +checksum = "76de4f783e610194f6c98bfd53f9fc52bb2e0d02c947621e8a0f4ecc799b2880" dependencies = [ "basic-toml", "dissimilar", diff --git a/polkadot/xcm/procedural/Cargo.toml b/polkadot/xcm/procedural/Cargo.toml index 74990f873ab..e88f4b0c846 100644 --- a/polkadot/xcm/procedural/Cargo.toml +++ b/polkadot/xcm/procedural/Cargo.toml @@ -20,5 +20,5 @@ syn = "2.0.48" Inflector = "0.11.4" [dev-dependencies] -trybuild = { version = "1.0.74", features = ["diff"] } +trybuild = { version = "1.0.88", features = ["diff"] } xcm = { package = "staging-xcm", path = ".." } diff --git a/substrate/frame/election-provider-support/solution-type/Cargo.toml b/substrate/frame/election-provider-support/solution-type/Cargo.toml index 04400147790..508c049e490 100644 --- a/substrate/frame/election-provider-support/solution-type/Cargo.toml +++ b/substrate/frame/election-provider-support/solution-type/Cargo.toml @@ -30,4 +30,4 @@ sp-arithmetic = { path = "../../../primitives/arithmetic" } # used by generate_solution_type: frame-election-provider-support = { path = ".." } frame-support = { path = "../../support" } -trybuild = "1.0.74" +trybuild = "1.0.88" diff --git a/substrate/frame/support/test/Cargo.toml b/substrate/frame/support/test/Cargo.toml index eac2dafbf00..8b61f25f569 100644 --- a/substrate/frame/support/test/Cargo.toml +++ b/substrate/frame/support/test/Cargo.toml @@ -31,7 +31,7 @@ sp-core = { path = "../../../primitives/core", default-features = false } sp-std = { path = "../../../primitives/std", default-features = false } sp-version = { path = "../../../primitives/version", default-features = false } sp-metadata-ir = { path = "../../../primitives/metadata-ir", default-features = false } -trybuild = { version = "1.0.74", features = ["diff"] } +trybuild = { version = "1.0.88", features = ["diff"] } pretty_assertions = "1.3.0" rustversion = "1.0.6" frame-system = { path = "../../system", default-features = false } diff --git a/substrate/primitives/api/test/Cargo.toml b/substrate/primitives/api/test/Cargo.toml index 0346ad270ab..b0975082c44 100644 --- a/substrate/primitives/api/test/Cargo.toml +++ b/substrate/primitives/api/test/Cargo.toml @@ -24,7 +24,7 @@ sp-consensus = { path = "../../consensus/common" } sc-block-builder = { path = "../../../client/block-builder" } codec = { package = "parity-scale-codec", version = "3.6.1" } sp-state-machine = { path = "../../state-machine" } -trybuild = "1.0.74" +trybuild = "1.0.88" rustversion = "1.0.6" scale-info = { version = "2.10.0", default-features = false, features = ["derive"] } diff --git a/substrate/primitives/runtime-interface/Cargo.toml b/substrate/primitives/runtime-interface/Cargo.toml index a4c8457b598..0fa2d1f3276 100644 --- a/substrate/primitives/runtime-interface/Cargo.toml +++ b/substrate/primitives/runtime-interface/Cargo.toml @@ -35,7 +35,7 @@ sp-state-machine = { path = "../state-machine" } sp-core = { path = "../core" } sp-io = { path = "../io" } rustversion = "1.0.6" -trybuild = "1.0.74" +trybuild = "1.0.88" [features] default = ["std"] diff --git a/substrate/test-utils/Cargo.toml b/substrate/test-utils/Cargo.toml index 526ed7c049c..af8b01cdef0 100644 --- a/substrate/test-utils/Cargo.toml +++ b/substrate/test-utils/Cargo.toml @@ -20,5 +20,5 @@ futures = "0.3.16" tokio = { version = "1.22.0", features = ["macros", "time"] } [dev-dependencies] -trybuild = { version = "1.0.74", features = ["diff"] } +trybuild = { version = "1.0.88", features = ["diff"] } sc-service = { path = "../client/service" } -- GitLab From af2e30e383b48302441f063929d4e69959db9830 Mon Sep 17 00:00:00 2001 From: Nazar Mokrynskyi Date: Wed, 10 Jan 2024 13:56:44 +0200 Subject: [PATCH 143/191] Improve storage monitor API (#2899) This removes the need to unnecessarily provide a very specific data structure `DatabaseSource` and removes huge `sc-client-db` dependency from storage monitor. It is now possible to use storage monitor with any path. P.S. I still strongly dislike that it pulls `clap` dependency for such a small feature, but many other crates do as well, so nothing special here. --- Cargo.lock | 1 - polkadot/cli/src/command.rs | 12 ++-- prdoc/pr_2899.prdoc | 10 ++++ substrate/bin/node/cli/src/service.rs | 18 +++--- substrate/client/storage-monitor/Cargo.toml | 3 +- substrate/client/storage-monitor/src/lib.rs | 61 +++++++++------------ 6 files changed, 55 insertions(+), 50 deletions(-) create mode 100644 prdoc/pr_2899.prdoc diff --git a/Cargo.lock b/Cargo.lock index 3ad73feb5d5..e00c173228f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -16587,7 +16587,6 @@ dependencies = [ "clap 4.4.14", "fs4", "log", - "sc-client-db", "sp-core", "thiserror", "tokio", diff --git a/polkadot/cli/src/command.rs b/polkadot/cli/src/command.rs index 9290ec584e4..1e25f6533f0 100644 --- a/polkadot/cli/src/command.rs +++ b/polkadot/cli/src/command.rs @@ -256,11 +256,13 @@ where ) .map(|full| full.task_manager)?; - sc_storage_monitor::StorageMonitorService::try_spawn( - cli.storage_monitor, - database_source, - &task_manager.spawn_essential_handle(), - )?; + if let Some(path) = database_source.path() { + sc_storage_monitor::StorageMonitorService::try_spawn( + cli.storage_monitor, + path.to_path_buf(), + &task_manager.spawn_essential_handle(), + )?; + } Ok(task_manager) }) diff --git a/prdoc/pr_2899.prdoc b/prdoc/pr_2899.prdoc new file mode 100644 index 00000000000..0c7afc0ad08 --- /dev/null +++ b/prdoc/pr_2899.prdoc @@ -0,0 +1,10 @@ +title: Improve storage monitor API + +doc: + - audience: Node Dev + description: | + This removes the need to unnecessarily provide a very specific data structure DatabaseSource and removes huge + sc-client-db dependency from storage monitor. It is now possible to use storage monitor with any path. + +crates: + - name: sc-storage-monitor diff --git a/substrate/bin/node/cli/src/service.rs b/substrate/bin/node/cli/src/service.rs index 5e6e794f732..67d21ee69ed 100644 --- a/substrate/bin/node/cli/src/service.rs +++ b/substrate/bin/node/cli/src/service.rs @@ -38,7 +38,7 @@ use sc_transaction_pool_api::OffchainTransactionPoolFactory; use sp_api::ProvideRuntimeApi; use sp_core::crypto::Pair; use sp_runtime::{generic, traits::Block as BlockT, SaturatedConversion}; -use std::sync::Arc; +use std::{path::Path, sync::Arc}; /// Host functions required for kitchensink runtime and Substrate node. #[cfg(not(feature = "runtime-benchmarks"))] @@ -769,16 +769,18 @@ pub fn new_full_base( /// Builds a new service for a full client. pub fn new_full(config: Configuration, cli: Cli) -> Result { let mixnet_config = cli.mixnet_params.config(config.role.is_authority()); - let database_source = config.database.clone(); + let database_path = config.database.path().map(Path::to_path_buf); let task_manager = new_full_base(config, mixnet_config, cli.no_hardware_benchmarks, |_, _| ()) .map(|NewFullBase { task_manager, .. }| task_manager)?; - sc_storage_monitor::StorageMonitorService::try_spawn( - cli.storage_monitor, - database_source, - &task_manager.spawn_essential_handle(), - ) - .map_err(|e| ServiceError::Application(e.into()))?; + if let Some(database_path) = database_path { + sc_storage_monitor::StorageMonitorService::try_spawn( + cli.storage_monitor, + database_path, + &task_manager.spawn_essential_handle(), + ) + .map_err(|e| ServiceError::Application(e.into()))?; + } Ok(task_manager) } diff --git a/substrate/client/storage-monitor/Cargo.toml b/substrate/client/storage-monitor/Cargo.toml index 2b46ccbcdc1..7185c62e276 100644 --- a/substrate/client/storage-monitor/Cargo.toml +++ b/substrate/client/storage-monitor/Cargo.toml @@ -15,7 +15,6 @@ workspace = true clap = { version = "4.4.14", features = ["derive", "string"] } log = "0.4.17" fs4 = "0.7.0" -sc-client-db = { path = "../db", default-features = false } sp-core = { path = "../../primitives/core" } -tokio = "1.22.0" +tokio = { version = "1.22.0", features = ["time"] } thiserror = "1.0.48" diff --git a/substrate/client/storage-monitor/src/lib.rs b/substrate/client/storage-monitor/src/lib.rs index b88b66d2d60..28d9063e5e4 100644 --- a/substrate/client/storage-monitor/src/lib.rs +++ b/substrate/client/storage-monitor/src/lib.rs @@ -17,7 +17,6 @@ // along with this program. If not, see . use clap::Args; -use sc_client_db::DatabaseSource; use sp_core::traits::SpawnEssentialNamed; use std::{ io, @@ -70,43 +69,37 @@ impl StorageMonitorService { /// Creates new StorageMonitorService for given client config pub fn try_spawn( parameters: StorageMonitorParams, - database: DatabaseSource, + path: PathBuf, spawner: &impl SpawnEssentialNamed, ) -> Result<()> { - Ok(match (parameters.threshold, database.path()) { - (0, _) => { - log::info!( - target: LOG_TARGET, - "StorageMonitorService: threshold `0` given, storage monitoring disabled", - ); - }, - (_, None) => { - log::warn!( - target: LOG_TARGET, - "StorageMonitorService: no database path to observe", - ); - }, - (threshold, Some(path)) => { - log::debug!( - target: LOG_TARGET, - "Initializing StorageMonitorService for db path: {path:?}", - ); - - Self::check_free_space(&path, threshold)?; + if parameters.threshold == 0 { + log::info!( + target: LOG_TARGET, + "StorageMonitorService: threshold `0` given, storage monitoring disabled", + ); + } else { + log::debug!( + target: LOG_TARGET, + "Initializing StorageMonitorService for db path: {}", + path.display() + ); + + Self::check_free_space(&path, parameters.threshold)?; + + let storage_monitor_service = StorageMonitorService { + path, + threshold: parameters.threshold, + polling_period: Duration::from_secs(parameters.polling_period.into()), + }; - let storage_monitor_service = StorageMonitorService { - path: path.to_path_buf(), - threshold, - polling_period: Duration::from_secs(parameters.polling_period.into()), - }; + spawner.spawn_essential( + "storage-monitor", + None, + Box::pin(storage_monitor_service.run()), + ); + } - spawner.spawn_essential( - "storage-monitor", - None, - Box::pin(storage_monitor_service.run()), - ); - }, - }) + Ok(()) } /// Main monitoring loop, intended to be spawned as essential task. Quits if free space drop -- GitLab From f2a750ee86e72c9ab677aaf588d0a33ee8446bef Mon Sep 17 00:00:00 2001 From: Alin Dima Date: Wed, 10 Jan 2024 15:19:50 +0200 Subject: [PATCH 144/191] add fallback request for req-response protocols (#2771) Previously, it was only possible to retry the same request on a different protocol name that had the exact same binary payloads. Introduce a way of trying a different request on a different protocol if the first one fails with Unsupported protocol. This helps with adding new req-response versions in polkadot while preserving compatibility with unupgraded nodes. The way req-response protocols were bumped previously was that they were bundled with some other notifications protocol upgrade, like for async backing (but that is more complicated, especially if the feature does not require any changes to a notifications protocol). Will be needed for implementing https://github.com/polkadot-fellows/RFCs/pull/47 TODO: - [x] add tests - [x] add guidance docs in polkadot about req-response protocol versioning --- .../src/pov_requester/mod.rs | 6 +- .../src/requester/fetch_task/tests.rs | 4 +- .../src/tests/state.rs | 7 +- .../availability-recovery/src/tests.rs | 311 +++++++------ polkadot/node/network/bridge/src/network.rs | 5 +- .../src/validator_side/tests/mod.rs | 51 +-- .../tests/prospective_parachains.rs | 33 +- .../dispute-distribution/src/tests/mod.rs | 4 +- .../protocol/src/request_response/mod.rs | 43 +- .../protocol/src/request_response/outgoing.rs | 67 ++- .../src/legacy_v1/tests.rs | 9 +- .../src/v2/tests/mod.rs | 3 +- .../src/v2/tests/requests.rs | 7 +- .../subsystem-bench/src/availability/mod.rs | 10 +- .../src/core/mock/network_bridge.rs | 18 +- .../node/subsystem-bench/src/core/network.rs | 16 +- prdoc/pr_2771.prdoc | 9 + .../outgoing_requests_engine.rs | 5 +- substrate/client/network/src/behaviour.rs | 15 +- .../client/network/src/request_responses.rs | 414 ++++++++++++++++-- substrate/client/network/src/service.rs | 16 +- .../client/network/src/service/traits.rs | 22 +- .../network/sync/src/block_relay_protocol.rs | 7 +- .../network/sync/src/block_request_handler.rs | 2 +- substrate/client/network/sync/src/engine.rs | 2 +- substrate/client/network/sync/src/mock.rs | 4 +- .../network/sync/src/pending_responses.rs | 4 +- .../client/network/sync/src/service/mock.rs | 6 +- .../network/sync/src/service/network.rs | 6 +- 29 files changed, 802 insertions(+), 304 deletions(-) create mode 100644 prdoc/pr_2771.prdoc diff --git a/polkadot/node/network/availability-distribution/src/pov_requester/mod.rs b/polkadot/node/network/availability-distribution/src/pov_requester/mod.rs index 6f9ef9f6a9f..4e23030aa49 100644 --- a/polkadot/node/network/availability-distribution/src/pov_requester/mod.rs +++ b/polkadot/node/network/availability-distribution/src/pov_requester/mod.rs @@ -139,6 +139,7 @@ mod tests { use futures::{executor, future}; use parity_scale_codec::Encode; + use sc_network::ProtocolName; use sp_core::testing::TaskExecutor; use polkadot_node_primitives::BlockData; @@ -231,7 +232,10 @@ mod tests { Some(Requests::PoVFetchingV1(outgoing)) => {outgoing} ); req.pending_response - .send(Ok(PoVFetchingResponse::PoV(pov.clone()).encode())) + .send(Ok(( + PoVFetchingResponse::PoV(pov.clone()).encode(), + ProtocolName::from(""), + ))) .unwrap(); break }, diff --git a/polkadot/node/network/availability-distribution/src/requester/fetch_task/tests.rs b/polkadot/node/network/availability-distribution/src/requester/fetch_task/tests.rs index 460f20499ed..a5a81082e39 100644 --- a/polkadot/node/network/availability-distribution/src/requester/fetch_task/tests.rs +++ b/polkadot/node/network/availability-distribution/src/requester/fetch_task/tests.rs @@ -25,7 +25,7 @@ use futures::{ Future, FutureExt, StreamExt, }; -use sc_network as network; +use sc_network::{self as network, ProtocolName}; use sp_keyring::Sr25519Keyring; use polkadot_node_network_protocol::request_response::{v1, Recipient}; @@ -252,7 +252,7 @@ impl TestRun { } } req.pending_response - .send(response.map(Encode::encode)) + .send(response.map(|r| (r.encode(), ProtocolName::from("")))) .expect("Sending response should succeed"); } return (valid_responses == 0) && self.valid_chunks.is_empty() diff --git a/polkadot/node/network/availability-distribution/src/tests/state.rs b/polkadot/node/network/availability-distribution/src/tests/state.rs index e95c1c3a27c..66a8d8fcdcf 100644 --- a/polkadot/node/network/availability-distribution/src/tests/state.rs +++ b/polkadot/node/network/availability-distribution/src/tests/state.rs @@ -19,6 +19,7 @@ use std::{ time::Duration, }; +use network::ProtocolName; use polkadot_node_subsystem_test_helpers::TestSubsystemContextHandle; use polkadot_node_subsystem_util::TimeoutExt; @@ -324,7 +325,11 @@ fn to_incoming_req( let response = rx.await; let payload = response.expect("Unexpected canceled request").result; pending_response - .send(payload.map_err(|_| network::RequestFailure::Refused)) + .send( + payload + .map_err(|_| network::RequestFailure::Refused) + .map(|r| (r, ProtocolName::from(""))), + ) .expect("Sending response is expected to work"); } .boxed(), diff --git a/polkadot/node/network/availability-recovery/src/tests.rs b/polkadot/node/network/availability-recovery/src/tests.rs index 1cb52757bac..f1dc5b98c09 100644 --- a/polkadot/node/network/availability-recovery/src/tests.rs +++ b/polkadot/node/network/availability-recovery/src/tests.rs @@ -22,13 +22,14 @@ use futures_timer::Delay; use parity_scale_codec::Encode; use polkadot_node_network_protocol::request_response::{ - self as req_res, IncomingRequest, Recipient, ReqProtocolNames, Requests, + self as req_res, v1::AvailableDataFetchingRequest, IncomingRequest, Protocol, Recipient, + ReqProtocolNames, Requests, }; use polkadot_node_subsystem_test_helpers::derive_erasure_chunks_with_proofs_and_root; use super::*; -use sc_network::{config::RequestResponseConfig, IfDisconnected, OutboundFailure, RequestFailure}; +use sc_network::{IfDisconnected, OutboundFailure, ProtocolName, RequestFailure}; use polkadot_node_primitives::{BlockData, PoV, Proof}; use polkadot_node_subsystem::messages::{ @@ -48,8 +49,18 @@ type VirtualOverseer = TestSubsystemContextHandle; // Deterministic genesis hash for protocol names const GENESIS_HASH: Hash = Hash::repeat_byte(0xff); -fn test_harness_fast_path>( - test: impl FnOnce(VirtualOverseer, RequestResponseConfig) -> T, +fn request_receiver( + req_protocol_names: &ReqProtocolNames, +) -> IncomingRequestReceiver { + let receiver = IncomingRequest::get_config_receiver(req_protocol_names); + // Don't close the sending end of the request protocol. Otherwise, the subsystem will terminate. + std::mem::forget(receiver.1.inbound_queue); + receiver.0 +} + +fn test_harness>( + subsystem: AvailabilityRecoverySubsystem, + test: impl FnOnce(VirtualOverseer) -> T, ) { let _ = env_logger::builder() .is_test(true) @@ -60,101 +71,23 @@ fn test_harness_fast_path>( - test: impl FnOnce(VirtualOverseer, RequestResponseConfig) -> T, -) { - let _ = env_logger::builder() - .is_test(true) - .filter(Some("polkadot_availability_recovery"), log::LevelFilter::Trace) - .try_init(); - - let pool = sp_core::testing::TaskExecutor::new(); - - let (context, virtual_overseer) = make_subsystem_context(pool.clone()); - - let (collation_req_receiver, req_cfg) = - IncomingRequest::get_config_receiver(&ReqProtocolNames::new(&GENESIS_HASH, None)); - let subsystem = AvailabilityRecoverySubsystem::with_chunks_only( - collation_req_receiver, - Metrics::new_dummy(), - ); - let subsystem = subsystem.run(context); - - let test_fut = test(virtual_overseer, req_cfg); + let test_fut = test(virtual_overseer); futures::pin_mut!(test_fut); futures::pin_mut!(subsystem); executor::block_on(future::join( async move { - let (mut overseer, _req_cfg) = test_fut.await; + let mut overseer = test_fut.await; overseer_signal(&mut overseer, OverseerSignal::Conclude).await; }, subsystem, )) .1 - .unwrap(); -} - -fn test_harness_chunks_if_pov_large< - T: Future, ->( - test: impl FnOnce(VirtualOverseer, RequestResponseConfig) -> T, -) { - let _ = env_logger::builder() - .is_test(true) - .filter(Some("polkadot_availability_recovery"), log::LevelFilter::Trace) - .try_init(); - - let pool = sp_core::testing::TaskExecutor::new(); - - let (context, virtual_overseer) = make_subsystem_context(pool.clone()); - - let (collation_req_receiver, req_cfg) = - IncomingRequest::get_config_receiver(&ReqProtocolNames::new(&GENESIS_HASH, None)); - let subsystem = AvailabilityRecoverySubsystem::with_chunks_if_pov_large( - collation_req_receiver, - Metrics::new_dummy(), - ); - let subsystem = subsystem.run(context); - - let test_fut = test(virtual_overseer, req_cfg); - - futures::pin_mut!(test_fut); - futures::pin_mut!(subsystem); - - executor::block_on(future::join( - async move { - let (mut overseer, _req_cfg) = test_fut.await; - overseer_signal(&mut overseer, OverseerSignal::Conclude).await; - }, - subsystem, - )) - .1 - .unwrap(); } const TIMEOUT: Duration = Duration::from_millis(300); @@ -342,11 +275,12 @@ impl TestState { async fn test_chunk_requests( &self, + req_protocol_names: &ReqProtocolNames, candidate_hash: CandidateHash, virtual_overseer: &mut VirtualOverseer, n: usize, who_has: impl Fn(usize) -> Has, - ) -> Vec, RequestFailure>>> { + ) -> Vec, ProtocolName), RequestFailure>>> { // arbitrary order. let mut i = 0; let mut senders = Vec::new(); @@ -380,7 +314,7 @@ impl TestState { let _ = req.pending_response.send( available_data.map(|r| - req_res::v1::ChunkFetchingResponse::from(r).encode() + (req_res::v1::ChunkFetchingResponse::from(r).encode(), req_protocol_names.get_name(Protocol::ChunkFetchingV1)) ) ); } @@ -394,10 +328,11 @@ impl TestState { async fn test_full_data_requests( &self, + req_protocol_names: &ReqProtocolNames, candidate_hash: CandidateHash, virtual_overseer: &mut VirtualOverseer, who_has: impl Fn(usize) -> Has, - ) -> Vec, RequestFailure>>> { + ) -> Vec, ProtocolName), RequestFailure>>> { let mut senders = Vec::new(); for _ in 0..self.validators.len() { // Receive a request for a chunk. @@ -433,9 +368,10 @@ impl TestState { let done = available_data.as_ref().ok().map_or(false, |x| x.is_some()); let _ = req.pending_response.send( - available_data.map(|r| - req_res::v1::AvailableDataFetchingResponse::from(r).encode() - ) + available_data.map(|r|( + req_res::v1::AvailableDataFetchingResponse::from(r).encode(), + req_protocol_names.get_name(Protocol::AvailableDataFetchingV1) + )) ); if done { break } @@ -532,8 +468,13 @@ impl Default for TestState { #[test] fn availability_is_recovered_from_chunks_if_no_group_provided() { let test_state = TestState::default(); + let req_protocol_names = ReqProtocolNames::new(&GENESIS_HASH, None); + let subsystem = AvailabilityRecoverySubsystem::with_fast_path( + request_receiver(&req_protocol_names), + Metrics::new_dummy(), + ); - test_harness_fast_path(|mut virtual_overseer, req_cfg| async move { + test_harness(subsystem, |mut virtual_overseer| async move { overseer_signal( &mut virtual_overseer, OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::start_work(new_leaf( @@ -565,6 +506,7 @@ fn availability_is_recovered_from_chunks_if_no_group_provided() { test_state .test_chunk_requests( + &req_protocol_names, candidate_hash, &mut virtual_overseer, test_state.threshold(), @@ -600,6 +542,7 @@ fn availability_is_recovered_from_chunks_if_no_group_provided() { test_state .test_chunk_requests( + &req_protocol_names, new_candidate.hash(), &mut virtual_overseer, test_state.impossibility_threshold(), @@ -609,15 +552,20 @@ fn availability_is_recovered_from_chunks_if_no_group_provided() { // A request times out with `Unavailable` error. assert_eq!(rx.await.unwrap().unwrap_err(), RecoveryError::Unavailable); - (virtual_overseer, req_cfg) + virtual_overseer }); } #[test] fn availability_is_recovered_from_chunks_even_if_backing_group_supplied_if_chunks_only() { let test_state = TestState::default(); + let req_protocol_names = ReqProtocolNames::new(&GENESIS_HASH, None); + let subsystem = AvailabilityRecoverySubsystem::with_chunks_only( + request_receiver(&req_protocol_names), + Metrics::new_dummy(), + ); - test_harness_chunks_only(|mut virtual_overseer, req_cfg| async move { + test_harness(subsystem, |mut virtual_overseer| async move { overseer_signal( &mut virtual_overseer, OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::start_work(new_leaf( @@ -649,6 +597,7 @@ fn availability_is_recovered_from_chunks_even_if_backing_group_supplied_if_chunk test_state .test_chunk_requests( + &req_protocol_names, candidate_hash, &mut virtual_overseer, test_state.threshold(), @@ -684,6 +633,7 @@ fn availability_is_recovered_from_chunks_even_if_backing_group_supplied_if_chunk test_state .test_chunk_requests( + &req_protocol_names, new_candidate.hash(), &mut virtual_overseer, test_state.impossibility_threshold(), @@ -693,15 +643,20 @@ fn availability_is_recovered_from_chunks_even_if_backing_group_supplied_if_chunk // A request times out with `Unavailable` error. assert_eq!(rx.await.unwrap().unwrap_err(), RecoveryError::Unavailable); - (virtual_overseer, req_cfg) + virtual_overseer }); } #[test] fn bad_merkle_path_leads_to_recovery_error() { let mut test_state = TestState::default(); + let req_protocol_names = ReqProtocolNames::new(&GENESIS_HASH, None); + let subsystem = AvailabilityRecoverySubsystem::with_fast_path( + request_receiver(&req_protocol_names), + Metrics::new_dummy(), + ); - test_harness_fast_path(|mut virtual_overseer, req_cfg| async move { + test_harness(subsystem, |mut virtual_overseer| async move { overseer_signal( &mut virtual_overseer, OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::start_work(new_leaf( @@ -740,6 +695,7 @@ fn bad_merkle_path_leads_to_recovery_error() { test_state .test_chunk_requests( + &req_protocol_names, candidate_hash, &mut virtual_overseer, test_state.impossibility_threshold(), @@ -749,15 +705,20 @@ fn bad_merkle_path_leads_to_recovery_error() { // A request times out with `Unavailable` error. assert_eq!(rx.await.unwrap().unwrap_err(), RecoveryError::Unavailable); - (virtual_overseer, req_cfg) + virtual_overseer }); } #[test] fn wrong_chunk_index_leads_to_recovery_error() { let mut test_state = TestState::default(); + let req_protocol_names = ReqProtocolNames::new(&GENESIS_HASH, None); + let subsystem = AvailabilityRecoverySubsystem::with_fast_path( + request_receiver(&req_protocol_names), + Metrics::new_dummy(), + ); - test_harness_fast_path(|mut virtual_overseer, req_cfg| async move { + test_harness(subsystem, |mut virtual_overseer| async move { overseer_signal( &mut virtual_overseer, OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::start_work(new_leaf( @@ -796,6 +757,7 @@ fn wrong_chunk_index_leads_to_recovery_error() { test_state .test_chunk_requests( + &req_protocol_names, candidate_hash, &mut virtual_overseer, test_state.impossibility_threshold(), @@ -805,15 +767,20 @@ fn wrong_chunk_index_leads_to_recovery_error() { // A request times out with `Unavailable` error as there are no good peers. assert_eq!(rx.await.unwrap().unwrap_err(), RecoveryError::Unavailable); - (virtual_overseer, req_cfg) + virtual_overseer }); } #[test] fn invalid_erasure_coding_leads_to_invalid_error() { let mut test_state = TestState::default(); + let req_protocol_names = ReqProtocolNames::new(&GENESIS_HASH, None); + let subsystem = AvailabilityRecoverySubsystem::with_fast_path( + request_receiver(&req_protocol_names), + Metrics::new_dummy(), + ); - test_harness_fast_path(|mut virtual_overseer, req_cfg| async move { + test_harness(subsystem, |mut virtual_overseer| async move { let pov = PoV { block_data: BlockData(vec![69; 64]) }; let (bad_chunks, bad_erasure_root) = derive_erasure_chunks_with_proofs_and_root( @@ -859,6 +826,7 @@ fn invalid_erasure_coding_leads_to_invalid_error() { test_state .test_chunk_requests( + &req_protocol_names, candidate_hash, &mut virtual_overseer, test_state.threshold(), @@ -868,15 +836,20 @@ fn invalid_erasure_coding_leads_to_invalid_error() { // f+1 'valid' chunks can't produce correct data. assert_eq!(rx.await.unwrap().unwrap_err(), RecoveryError::Invalid); - (virtual_overseer, req_cfg) + virtual_overseer }); } #[test] fn fast_path_backing_group_recovers() { let test_state = TestState::default(); + let req_protocol_names = ReqProtocolNames::new(&GENESIS_HASH, None); + let subsystem = AvailabilityRecoverySubsystem::with_fast_path( + request_receiver(&req_protocol_names), + Metrics::new_dummy(), + ); - test_harness_fast_path(|mut virtual_overseer, req_cfg| async move { + test_harness(subsystem, |mut virtual_overseer| async move { overseer_signal( &mut virtual_overseer, OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::start_work(new_leaf( @@ -911,20 +884,30 @@ fn fast_path_backing_group_recovers() { test_state.respond_to_available_data_query(&mut virtual_overseer, false).await; test_state - .test_full_data_requests(candidate_hash, &mut virtual_overseer, who_has) + .test_full_data_requests( + &req_protocol_names, + candidate_hash, + &mut virtual_overseer, + who_has, + ) .await; // Recovered data should match the original one. assert_eq!(rx.await.unwrap().unwrap(), test_state.available_data); - (virtual_overseer, req_cfg) + virtual_overseer }); } #[test] fn recovers_from_only_chunks_if_pov_large() { let test_state = TestState::default(); + let req_protocol_names = ReqProtocolNames::new(&GENESIS_HASH, None); + let subsystem = AvailabilityRecoverySubsystem::with_chunks_if_pov_large( + request_receiver(&req_protocol_names), + Metrics::new_dummy(), + ); - test_harness_chunks_if_pov_large(|mut virtual_overseer, req_cfg| async move { + test_harness(subsystem, |mut virtual_overseer| async move { overseer_signal( &mut virtual_overseer, OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::start_work(new_leaf( @@ -965,6 +948,7 @@ fn recovers_from_only_chunks_if_pov_large() { test_state .test_chunk_requests( + &req_protocol_names, candidate_hash, &mut virtual_overseer, test_state.threshold(), @@ -1009,6 +993,7 @@ fn recovers_from_only_chunks_if_pov_large() { test_state .test_chunk_requests( + &req_protocol_names, new_candidate.hash(), &mut virtual_overseer, test_state.impossibility_threshold(), @@ -1018,15 +1003,20 @@ fn recovers_from_only_chunks_if_pov_large() { // A request times out with `Unavailable` error. assert_eq!(rx.await.unwrap().unwrap_err(), RecoveryError::Unavailable); - (virtual_overseer, req_cfg) + virtual_overseer }); } #[test] fn fast_path_backing_group_recovers_if_pov_small() { let test_state = TestState::default(); + let req_protocol_names = ReqProtocolNames::new(&GENESIS_HASH, None); + let subsystem = AvailabilityRecoverySubsystem::with_chunks_if_pov_large( + request_receiver(&req_protocol_names), + Metrics::new_dummy(), + ); - test_harness_chunks_if_pov_large(|mut virtual_overseer, req_cfg| async move { + test_harness(subsystem, |mut virtual_overseer| async move { overseer_signal( &mut virtual_overseer, OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::start_work(new_leaf( @@ -1070,20 +1060,30 @@ fn fast_path_backing_group_recovers_if_pov_small() { test_state.respond_to_available_data_query(&mut virtual_overseer, false).await; test_state - .test_full_data_requests(candidate_hash, &mut virtual_overseer, who_has) + .test_full_data_requests( + &req_protocol_names, + candidate_hash, + &mut virtual_overseer, + who_has, + ) .await; // Recovered data should match the original one. assert_eq!(rx.await.unwrap().unwrap(), test_state.available_data); - (virtual_overseer, req_cfg) + virtual_overseer }); } #[test] fn no_answers_in_fast_path_causes_chunk_requests() { let test_state = TestState::default(); + let req_protocol_names = ReqProtocolNames::new(&GENESIS_HASH, None); + let subsystem = AvailabilityRecoverySubsystem::with_fast_path( + request_receiver(&req_protocol_names), + Metrics::new_dummy(), + ); - test_harness_fast_path(|mut virtual_overseer, req_cfg| async move { + test_harness(subsystem, |mut virtual_overseer| async move { overseer_signal( &mut virtual_overseer, OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::start_work(new_leaf( @@ -1119,13 +1119,19 @@ fn no_answers_in_fast_path_causes_chunk_requests() { test_state.respond_to_available_data_query(&mut virtual_overseer, false).await; test_state - .test_full_data_requests(candidate_hash, &mut virtual_overseer, who_has) + .test_full_data_requests( + &req_protocol_names, + candidate_hash, + &mut virtual_overseer, + who_has, + ) .await; test_state.respond_to_query_all_request(&mut virtual_overseer, |_| false).await; test_state .test_chunk_requests( + &req_protocol_names, candidate_hash, &mut virtual_overseer, test_state.threshold(), @@ -1135,15 +1141,20 @@ fn no_answers_in_fast_path_causes_chunk_requests() { // Recovered data should match the original one. assert_eq!(rx.await.unwrap().unwrap(), test_state.available_data); - (virtual_overseer, req_cfg) + virtual_overseer }); } #[test] fn task_canceled_when_receivers_dropped() { let test_state = TestState::default(); + let req_protocol_names = ReqProtocolNames::new(&GENESIS_HASH, None); + let subsystem = AvailabilityRecoverySubsystem::with_chunks_only( + request_receiver(&req_protocol_names), + Metrics::new_dummy(), + ); - test_harness_chunks_only(|mut virtual_overseer, req_cfg| async move { + test_harness(subsystem, |mut virtual_overseer| async move { overseer_signal( &mut virtual_overseer, OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::start_work(new_leaf( @@ -1170,7 +1181,7 @@ fn task_canceled_when_receivers_dropped() { for _ in 0..test_state.validators.len() { match virtual_overseer.recv().timeout(TIMEOUT).await { - None => return (virtual_overseer, req_cfg), + None => return virtual_overseer, Some(_) => continue, } } @@ -1182,8 +1193,13 @@ fn task_canceled_when_receivers_dropped() { #[test] fn chunks_retry_until_all_nodes_respond() { let test_state = TestState::default(); + let req_protocol_names = ReqProtocolNames::new(&GENESIS_HASH, None); + let subsystem = AvailabilityRecoverySubsystem::with_chunks_only( + request_receiver(&req_protocol_names), + Metrics::new_dummy(), + ); - test_harness_chunks_only(|mut virtual_overseer, req_cfg| async move { + test_harness(subsystem, |mut virtual_overseer| async move { overseer_signal( &mut virtual_overseer, OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::start_work(new_leaf( @@ -1215,6 +1231,7 @@ fn chunks_retry_until_all_nodes_respond() { test_state .test_chunk_requests( + &req_protocol_names, candidate_hash, &mut virtual_overseer, test_state.validators.len() - test_state.threshold(), @@ -1225,6 +1242,7 @@ fn chunks_retry_until_all_nodes_respond() { // we get to go another round! test_state .test_chunk_requests( + &req_protocol_names, candidate_hash, &mut virtual_overseer, test_state.impossibility_threshold(), @@ -1234,15 +1252,20 @@ fn chunks_retry_until_all_nodes_respond() { // Recovered data should match the original one. assert_eq!(rx.await.unwrap().unwrap_err(), RecoveryError::Unavailable); - (virtual_overseer, req_cfg) + virtual_overseer }); } #[test] fn not_returning_requests_wont_stall_retrieval() { let test_state = TestState::default(); + let req_protocol_names = ReqProtocolNames::new(&GENESIS_HASH, None); + let subsystem = AvailabilityRecoverySubsystem::with_chunks_only( + request_receiver(&req_protocol_names), + Metrics::new_dummy(), + ); - test_harness_chunks_only(|mut virtual_overseer, req_cfg| async move { + test_harness(subsystem, |mut virtual_overseer| async move { overseer_signal( &mut virtual_overseer, OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::start_work(new_leaf( @@ -1277,13 +1300,18 @@ fn not_returning_requests_wont_stall_retrieval() { // Not returning senders won't cause the retrieval to stall: let _senders = test_state - .test_chunk_requests(candidate_hash, &mut virtual_overseer, not_returning_count, |_| { - Has::DoesNotReturn - }) + .test_chunk_requests( + &req_protocol_names, + candidate_hash, + &mut virtual_overseer, + not_returning_count, + |_| Has::DoesNotReturn, + ) .await; test_state .test_chunk_requests( + &req_protocol_names, candidate_hash, &mut virtual_overseer, // Should start over: @@ -1295,6 +1323,7 @@ fn not_returning_requests_wont_stall_retrieval() { // we get to go another round! test_state .test_chunk_requests( + &req_protocol_names, candidate_hash, &mut virtual_overseer, test_state.threshold(), @@ -1304,15 +1333,20 @@ fn not_returning_requests_wont_stall_retrieval() { // Recovered data should match the original one: assert_eq!(rx.await.unwrap().unwrap(), test_state.available_data); - (virtual_overseer, req_cfg) + virtual_overseer }); } #[test] fn all_not_returning_requests_still_recovers_on_return() { let test_state = TestState::default(); + let req_protocol_names = ReqProtocolNames::new(&GENESIS_HASH, None); + let subsystem = AvailabilityRecoverySubsystem::with_chunks_only( + request_receiver(&req_protocol_names), + Metrics::new_dummy(), + ); - test_harness_chunks_only(|mut virtual_overseer, req_cfg| async move { + test_harness(subsystem, |mut virtual_overseer| async move { overseer_signal( &mut virtual_overseer, OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::start_work(new_leaf( @@ -1344,6 +1378,7 @@ fn all_not_returning_requests_still_recovers_on_return() { let senders = test_state .test_chunk_requests( + &req_protocol_names, candidate_hash, &mut virtual_overseer, test_state.validators.len(), @@ -1358,6 +1393,7 @@ fn all_not_returning_requests_still_recovers_on_return() { std::mem::drop(senders); }, test_state.test_chunk_requests( + &req_protocol_names, candidate_hash, &mut virtual_overseer, // Should start over: @@ -1370,6 +1406,7 @@ fn all_not_returning_requests_still_recovers_on_return() { // we get to go another round! test_state .test_chunk_requests( + &req_protocol_names, candidate_hash, &mut virtual_overseer, test_state.threshold(), @@ -1379,15 +1416,20 @@ fn all_not_returning_requests_still_recovers_on_return() { // Recovered data should match the original one: assert_eq!(rx.await.unwrap().unwrap(), test_state.available_data); - (virtual_overseer, req_cfg) + virtual_overseer }); } #[test] fn returns_early_if_we_have_the_data() { let test_state = TestState::default(); + let req_protocol_names = ReqProtocolNames::new(&GENESIS_HASH, None); + let subsystem = AvailabilityRecoverySubsystem::with_chunks_only( + request_receiver(&req_protocol_names), + Metrics::new_dummy(), + ); - test_harness_chunks_only(|mut virtual_overseer, req_cfg| async move { + test_harness(subsystem, |mut virtual_overseer| async move { overseer_signal( &mut virtual_overseer, OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::start_work(new_leaf( @@ -1414,15 +1456,20 @@ fn returns_early_if_we_have_the_data() { test_state.respond_to_available_data_query(&mut virtual_overseer, true).await; assert_eq!(rx.await.unwrap().unwrap(), test_state.available_data); - (virtual_overseer, req_cfg) + virtual_overseer }); } #[test] fn does_not_query_local_validator() { let test_state = TestState::default(); + let req_protocol_names = ReqProtocolNames::new(&GENESIS_HASH, None); + let subsystem = AvailabilityRecoverySubsystem::with_chunks_only( + request_receiver(&req_protocol_names), + Metrics::new_dummy(), + ); - test_harness_chunks_only(|mut virtual_overseer, req_cfg| async move { + test_harness(subsystem, |mut virtual_overseer| async move { overseer_signal( &mut virtual_overseer, OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::start_work(new_leaf( @@ -1453,6 +1500,7 @@ fn does_not_query_local_validator() { test_state .test_chunk_requests( + &req_protocol_names, candidate_hash, &mut virtual_overseer, test_state.validators.len(), @@ -1463,6 +1511,7 @@ fn does_not_query_local_validator() { // second round, make sure it uses the local chunk. test_state .test_chunk_requests( + &req_protocol_names, candidate_hash, &mut virtual_overseer, test_state.threshold() - 1, @@ -1471,15 +1520,20 @@ fn does_not_query_local_validator() { .await; assert_eq!(rx.await.unwrap().unwrap(), test_state.available_data); - (virtual_overseer, req_cfg) + virtual_overseer }); } #[test] fn invalid_local_chunk_is_ignored() { let test_state = TestState::default(); + let req_protocol_names = ReqProtocolNames::new(&GENESIS_HASH, None); + let subsystem = AvailabilityRecoverySubsystem::with_chunks_only( + request_receiver(&req_protocol_names), + Metrics::new_dummy(), + ); - test_harness_chunks_only(|mut virtual_overseer, req_cfg| async move { + test_harness(subsystem, |mut virtual_overseer| async move { overseer_signal( &mut virtual_overseer, OverseerSignal::ActiveLeaves(ActiveLeavesUpdate::start_work(new_leaf( @@ -1512,6 +1566,7 @@ fn invalid_local_chunk_is_ignored() { test_state .test_chunk_requests( + &req_protocol_names, candidate_hash, &mut virtual_overseer, test_state.threshold() - 1, @@ -1520,6 +1575,6 @@ fn invalid_local_chunk_is_ignored() { .await; assert_eq!(rx.await.unwrap().unwrap(), test_state.available_data); - (virtual_overseer, req_cfg) + virtual_overseer }); } diff --git a/polkadot/node/network/bridge/src/network.rs b/polkadot/node/network/bridge/src/network.rs index 2fcf5cec489..21bed019256 100644 --- a/polkadot/node/network/bridge/src/network.rs +++ b/polkadot/node/network/bridge/src/network.rs @@ -264,7 +264,8 @@ impl Network for Arc> { req_protocol_names: &ReqProtocolNames, if_disconnected: IfDisconnected, ) { - let (protocol, OutgoingRequest { peer, payload, pending_response }) = req.encode_request(); + let (protocol, OutgoingRequest { peer, payload, pending_response, fallback_request }) = + req.encode_request(); let peer_id = match peer { Recipient::Peer(peer_id) => Some(peer_id), @@ -315,6 +316,7 @@ impl Network for Arc> { target: LOG_TARGET, %peer_id, protocol = %req_protocol_names.get_name(protocol), + fallback_protocol = ?fallback_request.as_ref().map(|(_, p)| req_protocol_names.get_name(*p)), ?if_disconnected, "Starting request", ); @@ -324,6 +326,7 @@ impl Network for Arc> { peer_id, req_protocol_names.get_name(protocol), payload, + fallback_request.map(|(r, p)| (r, req_protocol_names.get_name(p))), pending_response, if_disconnected, ); diff --git a/polkadot/node/network/collator-protocol/src/validator_side/tests/mod.rs b/polkadot/node/network/collator-protocol/src/validator_side/tests/mod.rs index 3a974014994..1ba6389212c 100644 --- a/polkadot/node/network/collator-protocol/src/validator_side/tests/mod.rs +++ b/polkadot/node/network/collator-protocol/src/validator_side/tests/mod.rs @@ -17,6 +17,7 @@ use super::*; use assert_matches::assert_matches; use futures::{executor, future, Future}; +use sc_network::ProtocolName; use sp_core::{crypto::Pair, Encode}; use sp_keyring::Sr25519Keyring; use sp_keystore::Keystore; @@ -559,11 +560,11 @@ fn act_on_advertisement_v2() { .await; response_channel - .send(Ok(request_v1::CollationFetchingResponse::Collation( - candidate_a.clone(), - pov.clone(), - ) - .encode())) + .send(Ok(( + request_v1::CollationFetchingResponse::Collation(candidate_a.clone(), pov.clone()) + .encode(), + ProtocolName::from(""), + ))) .expect("Sending response should succeed"); assert_candidate_backing_second( @@ -761,11 +762,11 @@ fn fetch_one_collation_at_a_time() { candidate_a.descriptor.relay_parent = test_state.relay_parent; candidate_a.descriptor.persisted_validation_data_hash = dummy_pvd().hash(); response_channel - .send(Ok(request_v1::CollationFetchingResponse::Collation( - candidate_a.clone(), - pov.clone(), - ) - .encode())) + .send(Ok(( + request_v1::CollationFetchingResponse::Collation(candidate_a.clone(), pov.clone()) + .encode(), + ProtocolName::from(""), + ))) .expect("Sending response should succeed"); assert_candidate_backing_second( @@ -885,19 +886,19 @@ fn fetches_next_collation() { // First request finishes now: response_channel_non_exclusive - .send(Ok(request_v1::CollationFetchingResponse::Collation( - candidate_a.clone(), - pov.clone(), - ) - .encode())) + .send(Ok(( + request_v1::CollationFetchingResponse::Collation(candidate_a.clone(), pov.clone()) + .encode(), + ProtocolName::from(""), + ))) .expect("Sending response should succeed"); response_channel - .send(Ok(request_v1::CollationFetchingResponse::Collation( - candidate_a.clone(), - pov.clone(), - ) - .encode())) + .send(Ok(( + request_v1::CollationFetchingResponse::Collation(candidate_a.clone(), pov.clone()) + .encode(), + ProtocolName::from(""), + ))) .expect("Sending response should succeed"); assert_candidate_backing_second( @@ -1023,11 +1024,11 @@ fn fetch_next_collation_on_invalid_collation() { candidate_a.descriptor.relay_parent = test_state.relay_parent; candidate_a.descriptor.persisted_validation_data_hash = dummy_pvd().hash(); response_channel - .send(Ok(request_v1::CollationFetchingResponse::Collation( - candidate_a.clone(), - pov.clone(), - ) - .encode())) + .send(Ok(( + request_v1::CollationFetchingResponse::Collation(candidate_a.clone(), pov.clone()) + .encode(), + ProtocolName::from(""), + ))) .expect("Sending response should succeed"); let receipt = assert_candidate_backing_second( diff --git a/polkadot/node/network/collator-protocol/src/validator_side/tests/prospective_parachains.rs b/polkadot/node/network/collator-protocol/src/validator_side/tests/prospective_parachains.rs index c5236ef3eb2..23963e65554 100644 --- a/polkadot/node/network/collator-protocol/src/validator_side/tests/prospective_parachains.rs +++ b/polkadot/node/network/collator-protocol/src/validator_side/tests/prospective_parachains.rs @@ -314,11 +314,11 @@ fn v1_advertisement_accepted_and_seconded() { let pov = PoV { block_data: BlockData(vec![1]) }; response_channel - .send(Ok(request_v2::CollationFetchingResponse::Collation( - candidate.clone(), - pov.clone(), - ) - .encode())) + .send(Ok(( + request_v2::CollationFetchingResponse::Collation(candidate.clone(), pov.clone()) + .encode(), + ProtocolName::from(""), + ))) .expect("Sending response should succeed"); assert_candidate_backing_second( @@ -565,11 +565,14 @@ fn second_multiple_candidates_per_relay_parent() { let pov = PoV { block_data: BlockData(vec![1]) }; response_channel - .send(Ok(request_v2::CollationFetchingResponse::Collation( - candidate.clone(), - pov.clone(), - ) - .encode())) + .send(Ok(( + request_v2::CollationFetchingResponse::Collation( + candidate.clone(), + pov.clone(), + ) + .encode(), + ProtocolName::from(""), + ))) .expect("Sending response should succeed"); assert_candidate_backing_second( @@ -717,11 +720,11 @@ fn fetched_collation_sanity_check() { let pov = PoV { block_data: BlockData(vec![1]) }; response_channel - .send(Ok(request_v2::CollationFetchingResponse::Collation( - candidate.clone(), - pov.clone(), - ) - .encode())) + .send(Ok(( + request_v2::CollationFetchingResponse::Collation(candidate.clone(), pov.clone()) + .encode(), + ProtocolName::from(""), + ))) .expect("Sending response should succeed"); // PVD request. diff --git a/polkadot/node/network/dispute-distribution/src/tests/mod.rs b/polkadot/node/network/dispute-distribution/src/tests/mod.rs index a3520bf35f8..880d1b18032 100644 --- a/polkadot/node/network/dispute-distribution/src/tests/mod.rs +++ b/polkadot/node/network/dispute-distribution/src/tests/mod.rs @@ -32,7 +32,7 @@ use futures::{ use futures_timer::Delay; use parity_scale_codec::{Decode, Encode}; -use sc_network::config::RequestResponseConfig; +use sc_network::{config::RequestResponseConfig, ProtocolName}; use polkadot_node_network_protocol::{ request_response::{v1::DisputeRequest, IncomingRequest, ReqProtocolNames}, @@ -832,7 +832,7 @@ async fn check_sent_requests( if confirm_receive { for req in reqs { req.pending_response.send( - Ok(DisputeResponse::Confirmed.encode()) + Ok((DisputeResponse::Confirmed.encode(), ProtocolName::from(""))) ) .expect("Subsystem should be listening for a response."); } diff --git a/polkadot/node/network/protocol/src/request_response/mod.rs b/polkadot/node/network/protocol/src/request_response/mod.rs index 2df3021343d..a67d83aff0c 100644 --- a/polkadot/node/network/protocol/src/request_response/mod.rs +++ b/polkadot/node/network/protocol/src/request_response/mod.rs @@ -30,7 +30,24 @@ //! `trait IsRequest` .... A trait describing a particular request. It is used for gathering meta //! data, like what is the corresponding response type. //! -//! Versioned (v1 module): The actual requests and responses as sent over the network. +//! ## Versioning +//! +//! Versioning for request-response protocols can be done in multiple ways. +//! +//! If you're just changing the protocol name but the binary payloads are the same, just add a new +//! `fallback_name` to the protocol config. +//! +//! One way in which versioning has historically been achieved for req-response protocols is to +//! bundle the new req-resp version with an upgrade of a notifications protocol. The subsystem would +//! then know which request version to use based on stored data about the peer's notifications +//! protocol version. +//! +//! When bumping a notifications protocol version is not needed/desirable, you may add a new +//! req-resp protocol and set the old request as a fallback (see +//! `OutgoingRequest::new_with_fallback`). A request with the new version will be attempted and if +//! the protocol is refused by the peer, the fallback protocol request will be used. +//! Information about the actually used protocol will be returned alongside the raw response, so +//! that you know how to decode it. use std::{collections::HashMap, time::Duration, u64}; @@ -188,11 +205,11 @@ impl Protocol { tx: Option>, ) -> RequestResponseConfig { let name = req_protocol_names.get_name(self); - let fallback_names = self.get_fallback_names(); + let legacy_names = self.get_legacy_name().into_iter().map(Into::into).collect(); match self { Protocol::ChunkFetchingV1 => RequestResponseConfig { name, - fallback_names, + fallback_names: legacy_names, max_request_size: 1_000, max_response_size: POV_RESPONSE_SIZE as u64 * 3, // We are connected to all validators: @@ -202,7 +219,7 @@ impl Protocol { Protocol::CollationFetchingV1 | Protocol::CollationFetchingV2 => RequestResponseConfig { name, - fallback_names, + fallback_names: legacy_names, max_request_size: 1_000, max_response_size: POV_RESPONSE_SIZE, // Taken from initial implementation in collator protocol: @@ -211,7 +228,7 @@ impl Protocol { }, Protocol::PoVFetchingV1 => RequestResponseConfig { name, - fallback_names, + fallback_names: legacy_names, max_request_size: 1_000, max_response_size: POV_RESPONSE_SIZE, request_timeout: POV_REQUEST_TIMEOUT_CONNECTED, @@ -219,7 +236,7 @@ impl Protocol { }, Protocol::AvailableDataFetchingV1 => RequestResponseConfig { name, - fallback_names, + fallback_names: legacy_names, max_request_size: 1_000, // Available data size is dominated by the PoV size. max_response_size: POV_RESPONSE_SIZE, @@ -228,7 +245,7 @@ impl Protocol { }, Protocol::StatementFetchingV1 => RequestResponseConfig { name, - fallback_names, + fallback_names: legacy_names, max_request_size: 1_000, // Available data size is dominated code size. max_response_size: STATEMENT_RESPONSE_SIZE, @@ -246,7 +263,7 @@ impl Protocol { }, Protocol::DisputeSendingV1 => RequestResponseConfig { name, - fallback_names, + fallback_names: legacy_names, max_request_size: 1_000, // Responses are just confirmation, in essence not even a bit. So 100 seems // plenty. @@ -256,7 +273,7 @@ impl Protocol { }, Protocol::AttestedCandidateV2 => RequestResponseConfig { name, - fallback_names, + fallback_names: legacy_names, max_request_size: 1_000, max_response_size: ATTESTED_CANDIDATE_RESPONSE_SIZE, request_timeout: ATTESTED_CANDIDATE_TIMEOUT, @@ -328,12 +345,9 @@ impl Protocol { } } - /// Fallback protocol names of this protocol, as understood by substrate networking. - fn get_fallback_names(self) -> Vec { - self.get_legacy_name().into_iter().map(Into::into).collect() - } - /// Legacy protocol name associated with each peer set, if any. + /// The request will be tried on this legacy protocol name if the remote refuses to speak the + /// protocol. const fn get_legacy_name(self) -> Option<&'static str> { match self { Protocol::ChunkFetchingV1 => Some("/polkadot/req_chunk/1"), @@ -360,6 +374,7 @@ pub trait IsRequest { } /// Type for getting on the wire [`Protocol`] names using genesis hash & fork id. +#[derive(Clone)] pub struct ReqProtocolNames { names: HashMap, } diff --git a/polkadot/node/network/protocol/src/request_response/outgoing.rs b/polkadot/node/network/protocol/src/request_response/outgoing.rs index c613d5778f5..88439ad4036 100644 --- a/polkadot/node/network/protocol/src/request_response/outgoing.rs +++ b/polkadot/node/network/protocol/src/request_response/outgoing.rs @@ -14,8 +14,9 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -use futures::{channel::oneshot, prelude::Future}; +use futures::{channel::oneshot, prelude::Future, FutureExt}; +use network::ProtocolName; use parity_scale_codec::{Decode, Encode, Error as DecodingError}; use sc_network as network; @@ -49,20 +50,6 @@ pub enum Requests { } impl Requests { - /// Get the protocol this request conforms to. - pub fn get_protocol(&self) -> Protocol { - match self { - Self::ChunkFetchingV1(_) => Protocol::ChunkFetchingV1, - Self::CollationFetchingV1(_) => Protocol::CollationFetchingV1, - Self::CollationFetchingV2(_) => Protocol::CollationFetchingV2, - Self::PoVFetchingV1(_) => Protocol::PoVFetchingV1, - Self::AvailableDataFetchingV1(_) => Protocol::AvailableDataFetchingV1, - Self::StatementFetchingV1(_) => Protocol::StatementFetchingV1, - Self::DisputeSendingV1(_) => Protocol::DisputeSendingV1, - Self::AttestedCandidateV2(_) => Protocol::AttestedCandidateV2, - } - } - /// Encode the request. /// /// The corresponding protocol is returned as well, as we are now leaving typed territory. @@ -85,7 +72,7 @@ impl Requests { } /// Used by the network to send us a response to a request. -pub type ResponseSender = oneshot::Sender, network::RequestFailure>>; +pub type ResponseSender = oneshot::Sender, ProtocolName), network::RequestFailure>>; /// Any error that can occur when sending a request. #[derive(Debug, thiserror::Error)] @@ -128,11 +115,13 @@ impl RequestError { /// When using `Recipient::Authority`, the addresses can be found thanks to the authority /// discovery system. #[derive(Debug)] -pub struct OutgoingRequest { +pub struct OutgoingRequest { /// Intended recipient of this request. pub peer: Recipient, /// The actual request to send over the wire. pub payload: Req, + /// Optional fallback request and protocol. + pub fallback_request: Option<(FallbackReq, Protocol)>, /// Sender which is used by networking to get us back a response. pub pending_response: ResponseSender, } @@ -149,10 +138,12 @@ pub enum Recipient { /// Responses received for an `OutgoingRequest`. pub type OutgoingResult = Result; -impl OutgoingRequest +impl OutgoingRequest where Req: IsRequest + Encode, Req::Response: Decode, + FallbackReq: IsRequest + Encode, + FallbackReq::Response: Decode, { /// Create a new `OutgoingRequest`. /// @@ -163,24 +154,54 @@ where payload: Req, ) -> (Self, impl Future>) { let (tx, rx) = oneshot::channel(); - let r = Self { peer, payload, pending_response: tx }; - (r, receive_response::(rx)) + let r = Self { peer, payload, pending_response: tx, fallback_request: None }; + (r, receive_response::(rx.map(|r| r.map(|r| r.map(|(resp, _)| resp))))) } + /// Create a new `OutgoingRequest` with a fallback in case the remote does not support this + /// protocol. Useful when adding a new version of a req-response protocol, to achieve + /// compatibility with the older version. + /// + /// Returns a raw `Vec` response over the channel. Use the associated `ProtocolName` to know + /// which request was the successful one and appropriately decode the response. + // WARNING: This is commented for now because it's not used yet. + // If you need it, make sure to test it. You may need to enable the V1 substream upgrade + // protocol, unless libp2p was in the meantime updated to a version that fixes the problem + // described in https://github.com/libp2p/rust-libp2p/issues/5074 + // pub fn new_with_fallback( + // peer: Recipient, + // payload: Req, + // fallback_request: FallbackReq, + // ) -> (Self, impl Future, ProtocolName)>>) { + // let (tx, rx) = oneshot::channel(); + // let r = Self { + // peer, + // payload, + // pending_response: tx, + // fallback_request: Some((fallback_request, FallbackReq::PROTOCOL)), + // }; + // (r, async { Ok(rx.await??) }) + // } + /// Encode a request into a `Vec`. /// /// As this throws away type information, we also return the `Protocol` this encoded request /// adheres to. pub fn encode_request(self) -> (Protocol, OutgoingRequest>) { - let OutgoingRequest { peer, payload, pending_response } = self; - let encoded = OutgoingRequest { peer, payload: payload.encode(), pending_response }; + let OutgoingRequest { peer, payload, pending_response, fallback_request } = self; + let encoded = OutgoingRequest { + peer, + payload: payload.encode(), + fallback_request: fallback_request.map(|(r, p)| (r.encode(), p)), + pending_response, + }; (Req::PROTOCOL, encoded) } } /// Future for actually receiving a typed response for an `OutgoingRequest`. async fn receive_response( - rec: oneshot::Receiver, network::RequestFailure>>, + rec: impl Future, network::RequestFailure>, oneshot::Canceled>>, ) -> OutgoingResult where Req: IsRequest, diff --git a/polkadot/node/network/statement-distribution/src/legacy_v1/tests.rs b/polkadot/node/network/statement-distribution/src/legacy_v1/tests.rs index 8ac9895ec5a..2766ec9815a 100644 --- a/polkadot/node/network/statement-distribution/src/legacy_v1/tests.rs +++ b/polkadot/node/network/statement-distribution/src/legacy_v1/tests.rs @@ -50,6 +50,7 @@ use polkadot_primitives_test_helpers::{ dummy_committed_candidate_receipt, dummy_hash, AlwaysZeroRng, }; use sc_keystore::LocalKeystore; +use sc_network::ProtocolName; use sp_application_crypto::{sr25519::Pair, AppCrypto, Pair as TraitPair}; use sp_authority_discovery::AuthorityPair; use sp_keyring::Sr25519Keyring; @@ -1330,7 +1331,7 @@ fn receiving_large_statement_from_one_sends_to_another_and_to_candidate_backing( bad }; let response = StatementFetchingResponse::Statement(bad_candidate); - outgoing.pending_response.send(Ok(response.encode())).unwrap(); + outgoing.pending_response.send(Ok((response.encode(), ProtocolName::from("")))).unwrap(); } ); @@ -1382,7 +1383,7 @@ fn receiving_large_statement_from_one_sends_to_another_and_to_candidate_backing( // On retry, we should have reverse order: assert_eq!(outgoing.peer, Recipient::Peer(peer_c)); let response = StatementFetchingResponse::Statement(candidate.clone()); - outgoing.pending_response.send(Ok(response.encode())).unwrap(); + outgoing.pending_response.send(Ok((response.encode(), ProtocolName::from("")))).unwrap(); } ); @@ -1869,7 +1870,7 @@ fn delay_reputation_changes() { bad }; let response = StatementFetchingResponse::Statement(bad_candidate); - outgoing.pending_response.send(Ok(response.encode())).unwrap(); + outgoing.pending_response.send(Ok((response.encode(), ProtocolName::from("")))).unwrap(); } ); @@ -1913,7 +1914,7 @@ fn delay_reputation_changes() { // On retry, we should have reverse order: assert_eq!(outgoing.peer, Recipient::Peer(peer_c)); let response = StatementFetchingResponse::Statement(candidate.clone()); - outgoing.pending_response.send(Ok(response.encode())).unwrap(); + outgoing.pending_response.send(Ok((response.encode(), ProtocolName::from("")))).unwrap(); } ); diff --git a/polkadot/node/network/statement-distribution/src/v2/tests/mod.rs b/polkadot/node/network/statement-distribution/src/v2/tests/mod.rs index 3ce43202b95..bb780584feb 100644 --- a/polkadot/node/network/statement-distribution/src/v2/tests/mod.rs +++ b/polkadot/node/network/statement-distribution/src/v2/tests/mod.rs @@ -38,6 +38,7 @@ use polkadot_primitives::{ SessionIndex, SessionInfo, ValidatorPair, }; use sc_keystore::LocalKeystore; +use sc_network::ProtocolName; use sp_application_crypto::Pair as PairT; use sp_authority_discovery::AuthorityPair as AuthorityDiscoveryPair; use sp_keyring::Sr25519Keyring; @@ -684,7 +685,7 @@ async fn handle_sent_request( persisted_validation_data, statements, }; - outgoing.pending_response.send(Ok(res.encode())).unwrap(); + outgoing.pending_response.send(Ok((res.encode(), ProtocolName::from("")))).unwrap(); } ); } diff --git a/polkadot/node/network/statement-distribution/src/v2/tests/requests.rs b/polkadot/node/network/statement-distribution/src/v2/tests/requests.rs index 04934b31482..dc2c8f55290 100644 --- a/polkadot/node/network/statement-distribution/src/v2/tests/requests.rs +++ b/polkadot/node/network/statement-distribution/src/v2/tests/requests.rs @@ -22,8 +22,9 @@ use polkadot_node_network_protocol::{ request_response::v2 as request_v2, v2::BackedCandidateManifest, }; use polkadot_primitives_test_helpers::make_candidate; -use sc_network::config::{ - IncomingRequest as RawIncomingRequest, OutgoingResponse as RawOutgoingResponse, +use sc_network::{ + config::{IncomingRequest as RawIncomingRequest, OutgoingResponse as RawOutgoingResponse}, + ProtocolName, }; #[test] @@ -1342,7 +1343,7 @@ fn when_validator_disabled_after_sending_the_request() { persisted_validation_data: pvd, statements, }; - outgoing.pending_response.send(Ok(res.encode())).unwrap(); + outgoing.pending_response.send(Ok((res.encode(), ProtocolName::from("")))).unwrap(); } ); } diff --git a/polkadot/node/subsystem-bench/src/availability/mod.rs b/polkadot/node/subsystem-bench/src/availability/mod.rs index 7c81b931365..faedccdf3e4 100644 --- a/polkadot/node/subsystem-bench/src/availability/mod.rs +++ b/polkadot/node/subsystem-bench/src/availability/mod.rs @@ -109,7 +109,12 @@ fn prepare_test_inner( chunks: state.chunks.clone(), }; - let network = NetworkEmulator::new(&config, &dependencies, &test_authorities); + let req_protocol_names = ReqProtocolNames::new(GENESIS_HASH, None); + let (collation_req_receiver, req_cfg) = + IncomingRequest::get_config_receiver(&req_protocol_names); + + let network = + NetworkEmulator::new(&config, &dependencies, &test_authorities, req_protocol_names); let network_bridge_tx = network_bridge::MockNetworkBridgeTx::new( config.clone(), @@ -122,9 +127,6 @@ fn prepare_test_inner( _ => panic!("Unexpected objective"), }; - let (collation_req_receiver, req_cfg) = - IncomingRequest::get_config_receiver(&ReqProtocolNames::new(GENESIS_HASH, None)); - let subsystem = if use_fast_path { AvailabilityRecoverySubsystem::with_fast_path( collation_req_receiver, diff --git a/polkadot/node/subsystem-bench/src/core/mock/network_bridge.rs b/polkadot/node/subsystem-bench/src/core/mock/network_bridge.rs index b106b832011..5d534e37c99 100644 --- a/polkadot/node/subsystem-bench/src/core/mock/network_bridge.rs +++ b/polkadot/node/subsystem-bench/src/core/mock/network_bridge.rs @@ -33,7 +33,9 @@ use polkadot_node_subsystem::{ }; use polkadot_node_network_protocol::request_response::{ - self as req_res, v1::ChunkResponse, Requests, + self as req_res, + v1::{AvailableDataFetchingRequest, ChunkFetchingRequest, ChunkResponse}, + IsRequest, Requests, }; use polkadot_primitives::AuthorityDiscoveryId; @@ -144,7 +146,10 @@ impl MockNetworkBridgeTx { size = 0; Err(RequestFailure::Network(OutboundFailure::ConnectionClosed)) } else { - Ok(req_res::v1::ChunkFetchingResponse::from(Some(chunk)).encode()) + Ok(( + req_res::v1::ChunkFetchingResponse::from(Some(chunk)).encode(), + self.network.req_protocol_names().get_name(ChunkFetchingRequest::PROTOCOL), + )) }; let authority_discovery_id_clone = authority_discovery_id.clone(); @@ -212,8 +217,13 @@ impl MockNetworkBridgeTx { let response = if random_error(self.config.error) { Err(RequestFailure::Network(OutboundFailure::ConnectionClosed)) } else { - Ok(req_res::v1::AvailableDataFetchingResponse::from(Some(available_data)) - .encode()) + Ok(( + req_res::v1::AvailableDataFetchingResponse::from(Some(available_data)) + .encode(), + self.network + .req_protocol_names() + .get_name(AvailableDataFetchingRequest::PROTOCOL), + )) }; let future = async move { diff --git a/polkadot/node/subsystem-bench/src/core/network.rs b/polkadot/node/subsystem-bench/src/core/network.rs index c4e20b421d3..bbf61425f73 100644 --- a/polkadot/node/subsystem-bench/src/core/network.rs +++ b/polkadot/node/subsystem-bench/src/core/network.rs @@ -19,6 +19,7 @@ use super::{ *, }; use colored::Colorize; +use polkadot_node_network_protocol::request_response::ReqProtocolNames; use polkadot_primitives::AuthorityDiscoveryId; use prometheus_endpoint::U64; use rand::{seq::SliceRandom, thread_rng}; @@ -311,6 +312,8 @@ pub struct NetworkEmulator { stats: Vec>, /// Each emulated peer is a validator. validator_authority_ids: HashMap, + /// Request protocol names + req_protocol_names: ReqProtocolNames, } impl NetworkEmulator { @@ -318,6 +321,7 @@ impl NetworkEmulator { config: &TestConfiguration, dependencies: &TestEnvironmentDependencies, authorities: &TestAuthorities, + req_protocol_names: ReqProtocolNames, ) -> Self { let n_peers = config.n_validators; gum::info!(target: LOG_TARGET, "{}",format!("Initializing emulation for a {} peer network.", n_peers).bright_blue()); @@ -355,7 +359,12 @@ impl NetworkEmulator { gum::info!(target: LOG_TARGET, "{}",format!("Network created, connected validator count {}", connected_count).bright_black()); - Self { peers, stats, validator_authority_ids: validator_authority_id_mapping } + Self { + peers, + stats, + validator_authority_ids: validator_authority_id_mapping, + req_protocol_names, + } } pub fn is_peer_connected(&self, peer: &AuthorityDiscoveryId) -> bool { @@ -428,6 +437,11 @@ impl NetworkEmulator { // Our node always is peer 0. self.peer_stats(0).inc_received(bytes); } + + // Get the request protocol names + pub fn req_protocol_names(&self) -> &ReqProtocolNames { + &self.req_protocol_names + } } use polkadot_node_subsystem_util::metrics::prometheus::{ diff --git a/prdoc/pr_2771.prdoc b/prdoc/pr_2771.prdoc new file mode 100644 index 00000000000..1b49162e439 --- /dev/null +++ b/prdoc/pr_2771.prdoc @@ -0,0 +1,9 @@ +title: Add fallback request for req-response protocols + +doc: + - audience: Node Dev + description: | + Enable better req-response protocol versioning, by allowing for fallback requests on different protocols. + +crates: + - name: sc_network diff --git a/substrate/client/consensus/beefy/src/communication/request_response/outgoing_requests_engine.rs b/substrate/client/consensus/beefy/src/communication/request_response/outgoing_requests_engine.rs index ef462a54fca..7121410ea10 100644 --- a/substrate/client/consensus/beefy/src/communication/request_response/outgoing_requests_engine.rs +++ b/substrate/client/consensus/beefy/src/communication/request_response/outgoing_requests_engine.rs @@ -43,7 +43,7 @@ use crate::{ }; /// Response type received from network. -type Response = Result, RequestFailure>; +type Response = Result<(Vec, ProtocolName), RequestFailure>; /// Used to receive a response from the network. type ResponseReceiver = oneshot::Receiver; @@ -125,6 +125,7 @@ impl OnDemandJustificationsEngine { peer, self.protocol_name.clone(), payload, + None, tx, IfDisconnected::ImmediateError, ); @@ -204,7 +205,7 @@ impl OnDemandJustificationsEngine { }, } }) - .and_then(|encoded| { + .and_then(|(encoded, _)| { decode_and_verify_finality_proof::( &encoded[..], req_info.block, diff --git a/substrate/client/network/src/behaviour.rs b/substrate/client/network/src/behaviour.rs index 745550412fc..1f234683392 100644 --- a/substrate/client/network/src/behaviour.rs +++ b/substrate/client/network/src/behaviour.rs @@ -231,13 +231,20 @@ impl Behaviour { pub fn send_request( &mut self, target: &PeerId, - protocol: &str, + protocol: ProtocolName, request: Vec, - pending_response: oneshot::Sender, RequestFailure>>, + fallback_request: Option<(Vec, ProtocolName)>, + pending_response: oneshot::Sender, ProtocolName), RequestFailure>>, connect: IfDisconnected, ) { - self.request_responses - .send_request(target, protocol, request, pending_response, connect) + self.request_responses.send_request( + target, + protocol, + request, + fallback_request, + pending_response, + connect, + ) } /// Returns a shared reference to the user protocol. diff --git a/substrate/client/network/src/request_responses.rs b/substrate/client/network/src/request_responses.rs index 5af072aaddc..0cd1cf06bb3 100644 --- a/substrate/client/network/src/request_responses.rs +++ b/substrate/client/network/src/request_responses.rs @@ -56,6 +56,7 @@ use libp2p::{ use std::{ collections::{hash_map::Entry, HashMap}, io, iter, + ops::Deref, pin::Pin, task::{Context, Poll}, time::{Duration, Instant}, @@ -172,6 +173,13 @@ pub struct OutgoingResponse { pub sent_feedback: Option>, } +/// Information stored about a pending request. +struct PendingRequest { + started_at: Instant, + response_tx: oneshot::Sender, ProtocolName), RequestFailure>>, + fallback_request: Option<(Vec, ProtocolName)>, +} + /// When sending a request, what to do on a disconnected recipient. #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] pub enum IfDisconnected { @@ -264,8 +272,7 @@ pub struct RequestResponsesBehaviour { >, /// Pending requests, passed down to a request-response [`Behaviour`], awaiting a reply. - pending_requests: - HashMap, RequestFailure>>)>, + pending_requests: HashMap, /// Whenever an incoming request arrives, a `Future` is added to this list and will yield the /// start time and the response to send back to the remote. @@ -348,29 +355,25 @@ impl RequestResponsesBehaviour { pub fn send_request( &mut self, target: &PeerId, - protocol_name: &str, + protocol_name: ProtocolName, request: Vec, - pending_response: oneshot::Sender, RequestFailure>>, + fallback_request: Option<(Vec, ProtocolName)>, + pending_response: oneshot::Sender, ProtocolName), RequestFailure>>, connect: IfDisconnected, ) { log::trace!(target: "sub-libp2p", "send request to {target} ({protocol_name:?}), {} bytes", request.len()); - if let Some((protocol, _)) = self.protocols.get_mut(protocol_name) { - if protocol.is_connected(target) || connect.should_connect() { - let request_id = protocol.send_request(target, request); - let prev_req_id = self.pending_requests.insert( - (protocol_name.to_string().into(), request_id).into(), - (Instant::now(), pending_response), - ); - debug_assert!(prev_req_id.is_none(), "Expect request id to be unique."); - } else if pending_response.send(Err(RequestFailure::NotConnected)).is_err() { - log::debug!( - target: "sub-libp2p", - "Not connected to peer {:?}. At the same time local \ - node is no longer interested in the result.", - target, - ); - } + if let Some((protocol, _)) = self.protocols.get_mut(protocol_name.deref()) { + Self::send_request_inner( + protocol, + &mut self.pending_requests, + target, + protocol_name, + request, + fallback_request, + pending_response, + connect, + ) } else if pending_response.send(Err(RequestFailure::UnknownProtocol)).is_err() { log::debug!( target: "sub-libp2p", @@ -380,6 +383,37 @@ impl RequestResponsesBehaviour { ); } } + + fn send_request_inner( + behaviour: &mut Behaviour, + pending_requests: &mut HashMap, + target: &PeerId, + protocol_name: ProtocolName, + request: Vec, + fallback_request: Option<(Vec, ProtocolName)>, + pending_response: oneshot::Sender, ProtocolName), RequestFailure>>, + connect: IfDisconnected, + ) { + if behaviour.is_connected(target) || connect.should_connect() { + let request_id = behaviour.send_request(target, request); + let prev_req_id = pending_requests.insert( + (protocol_name.to_string().into(), request_id).into(), + PendingRequest { + started_at: Instant::now(), + response_tx: pending_response, + fallback_request, + }, + ); + debug_assert!(prev_req_id.is_none(), "Expect request id to be unique."); + } else if pending_response.send(Err(RequestFailure::NotConnected)).is_err() { + log::debug!( + target: "sub-libp2p", + "Not connected to peer {:?}. At the same time local \ + node is no longer interested in the result.", + target, + ); + } + } } impl NetworkBehaviour for RequestResponsesBehaviour { @@ -596,8 +630,10 @@ impl NetworkBehaviour for RequestResponsesBehaviour { } } + let mut fallback_requests = vec![]; + // Poll request-responses protocols. - for (protocol, (behaviour, resp_builder)) in &mut self.protocols { + for (protocol, (ref mut behaviour, ref mut resp_builder)) in &mut self.protocols { 'poll_protocol: while let Poll::Ready(ev) = behaviour.poll(cx, params) { let ev = match ev { // Main events we are interested in. @@ -698,17 +734,21 @@ impl NetworkBehaviour for RequestResponsesBehaviour { .pending_requests .remove(&(protocol.clone(), request_id).into()) { - Some((started, pending_response)) => { + Some(PendingRequest { started_at, response_tx, .. }) => { log::trace!( target: "sub-libp2p", "received response from {peer} ({protocol:?}), {} bytes", response.as_ref().map_or(0usize, |response| response.len()), ); - let delivered = pending_response - .send(response.map_err(|()| RequestFailure::Refused)) + let delivered = response_tx + .send( + response + .map_err(|()| RequestFailure::Refused) + .map(|resp| (resp, protocol.clone())), + ) .map_err(|_| RequestFailure::Obsolete); - (started, delivered) + (started_at, delivered) }, None => { log::warn!( @@ -742,8 +782,34 @@ impl NetworkBehaviour for RequestResponsesBehaviour { .pending_requests .remove(&(protocol.clone(), request_id).into()) { - Some((started, pending_response)) => { - if pending_response + Some(PendingRequest { + started_at, + response_tx, + fallback_request, + }) => { + // Try using the fallback request if the protocol was not + // supported. + if let OutboundFailure::UnsupportedProtocols = error { + if let Some((fallback_request, fallback_protocol)) = + fallback_request + { + log::trace!( + target: "sub-libp2p", + "Request with id {:?} failed. Trying the fallback protocol. {}", + request_id, + fallback_protocol.deref() + ); + fallback_requests.push(( + peer, + fallback_protocol, + fallback_request, + response_tx, + )); + continue + } + } + + if response_tx .send(Err(RequestFailure::Network(error.clone()))) .is_err() { @@ -754,7 +820,7 @@ impl NetworkBehaviour for RequestResponsesBehaviour { request_id, ); } - started + started_at }, None => { log::warn!( @@ -825,6 +891,25 @@ impl NetworkBehaviour for RequestResponsesBehaviour { } } + // Send out fallback requests. + for (peer, protocol, request, pending_response) in fallback_requests.drain(..) { + if let Some((behaviour, _)) = self.protocols.get_mut(&protocol) { + Self::send_request_inner( + behaviour, + &mut self.pending_requests, + &peer, + protocol, + request, + None, + pending_response, + // We can error if not connected because the + // previous attempt would have tried to establish a + // connection already or errored and we wouldn't have gotten here. + IfDisconnected::ImmediateError, + ); + } + } + break Poll::Pending } } @@ -976,6 +1061,7 @@ mod tests { use super::*; use crate::mock::MockPeerStore; + use assert_matches::assert_matches; use futures::{channel::oneshot, executor::LocalPool, task::Spawn}; use libp2p::{ core::{ @@ -1025,7 +1111,7 @@ mod tests { #[test] fn basic_request_response_works() { - let protocol_name = "/test/req-resp/1"; + let protocol_name = ProtocolName::from("/test/req-resp/1"); let mut pool = LocalPool::new(); // Build swarms whose behaviour is [`RequestResponsesBehaviour`]. @@ -1053,7 +1139,7 @@ mod tests { .unwrap(); let protocol_config = ProtocolConfig { - name: From::from(protocol_name), + name: protocol_name.clone(), fallback_names: Vec::new(), max_request_size: 1024, max_response_size: 1024 * 1024, @@ -1102,8 +1188,9 @@ mod tests { let (sender, receiver) = oneshot::channel(); swarm.behaviour_mut().send_request( &peer_id, - protocol_name, + protocol_name.clone(), b"this is a request".to_vec(), + None, sender, IfDisconnected::ImmediateError, ); @@ -1118,13 +1205,16 @@ mod tests { } } - assert_eq!(response_receiver.unwrap().await.unwrap().unwrap(), b"this is a response"); + assert_eq!( + response_receiver.unwrap().await.unwrap().unwrap(), + (b"this is a response".to_vec(), protocol_name) + ); }); } #[test] fn max_response_size_exceeded() { - let protocol_name = "/test/req-resp/1"; + let protocol_name = ProtocolName::from("/test/req-resp/1"); let mut pool = LocalPool::new(); // Build swarms whose behaviour is [`RequestResponsesBehaviour`]. @@ -1150,7 +1240,7 @@ mod tests { .unwrap(); let protocol_config = ProtocolConfig { - name: From::from(protocol_name), + name: protocol_name.clone(), fallback_names: Vec::new(), max_request_size: 1024, max_response_size: 8, // <-- important for the test @@ -1201,8 +1291,9 @@ mod tests { let (sender, receiver) = oneshot::channel(); swarm.behaviour_mut().send_request( &peer_id, - protocol_name, + protocol_name.clone(), b"this is a request".to_vec(), + None, sender, IfDisconnected::ImmediateError, ); @@ -1236,14 +1327,14 @@ mod tests { /// See [`ProtocolRequestId`] for additional information. #[test] fn request_id_collision() { - let protocol_name_1 = "/test/req-resp-1/1"; - let protocol_name_2 = "/test/req-resp-2/1"; + let protocol_name_1 = ProtocolName::from("/test/req-resp-1/1"); + let protocol_name_2 = ProtocolName::from("/test/req-resp-2/1"); let mut pool = LocalPool::new(); let mut swarm_1 = { let protocol_configs = vec![ ProtocolConfig { - name: From::from(protocol_name_1), + name: protocol_name_1.clone(), fallback_names: Vec::new(), max_request_size: 1024, max_response_size: 1024 * 1024, @@ -1251,7 +1342,7 @@ mod tests { inbound_queue: None, }, ProtocolConfig { - name: From::from(protocol_name_2), + name: protocol_name_2.clone(), fallback_names: Vec::new(), max_request_size: 1024, max_response_size: 1024 * 1024, @@ -1269,7 +1360,7 @@ mod tests { let protocol_configs = vec![ ProtocolConfig { - name: From::from(protocol_name_1), + name: protocol_name_1.clone(), fallback_names: Vec::new(), max_request_size: 1024, max_response_size: 1024 * 1024, @@ -1277,7 +1368,7 @@ mod tests { inbound_queue: Some(tx_1), }, ProtocolConfig { - name: From::from(protocol_name_2), + name: protocol_name_2.clone(), fallback_names: Vec::new(), max_request_size: 1024, max_response_size: 1024 * 1024, @@ -1359,15 +1450,17 @@ mod tests { let (sender_2, receiver_2) = oneshot::channel(); swarm_1.behaviour_mut().send_request( &peer_id, - protocol_name_1, + protocol_name_1.clone(), b"this is a request".to_vec(), + None, sender_1, IfDisconnected::ImmediateError, ); swarm_1.behaviour_mut().send_request( &peer_id, - protocol_name_2, + protocol_name_2.clone(), b"this is a request".to_vec(), + None, sender_2, IfDisconnected::ImmediateError, ); @@ -1385,8 +1478,239 @@ mod tests { } } let (response_receiver_1, response_receiver_2) = response_receivers.unwrap(); - assert_eq!(response_receiver_1.await.unwrap().unwrap(), b"this is a response"); - assert_eq!(response_receiver_2.await.unwrap().unwrap(), b"this is a response"); + assert_eq!( + response_receiver_1.await.unwrap().unwrap(), + (b"this is a response".to_vec(), protocol_name_1) + ); + assert_eq!( + response_receiver_2.await.unwrap().unwrap(), + (b"this is a response".to_vec(), protocol_name_2) + ); + }); + } + + #[test] + fn request_fallback() { + let protocol_name_1 = ProtocolName::from("/test/req-resp/2"); + let protocol_name_1_fallback = ProtocolName::from("/test/req-resp/1"); + let protocol_name_2 = ProtocolName::from("/test/another"); + let mut pool = LocalPool::new(); + + let protocol_config_1 = ProtocolConfig { + name: protocol_name_1.clone(), + fallback_names: Vec::new(), + max_request_size: 1024, + max_response_size: 1024 * 1024, + request_timeout: Duration::from_secs(30), + inbound_queue: None, + }; + let protocol_config_1_fallback = ProtocolConfig { + name: protocol_name_1_fallback.clone(), + fallback_names: Vec::new(), + max_request_size: 1024, + max_response_size: 1024 * 1024, + request_timeout: Duration::from_secs(30), + inbound_queue: None, + }; + let protocol_config_2 = ProtocolConfig { + name: protocol_name_2.clone(), + fallback_names: Vec::new(), + max_request_size: 1024, + max_response_size: 1024 * 1024, + request_timeout: Duration::from_secs(30), + inbound_queue: None, + }; + + // This swarm only speaks protocol_name_1_fallback and protocol_name_2. + // It only responds to requests. + let mut older_swarm = { + let (tx_1, mut rx_1) = async_channel::bounded::(64); + let (tx_2, mut rx_2) = async_channel::bounded::(64); + let mut protocol_config_1_fallback = protocol_config_1_fallback.clone(); + protocol_config_1_fallback.inbound_queue = Some(tx_1); + + let mut protocol_config_2 = protocol_config_2.clone(); + protocol_config_2.inbound_queue = Some(tx_2); + + pool.spawner() + .spawn_obj( + async move { + for _ in 0..2 { + if let Some(rq) = rx_1.next().await { + let (fb_tx, fb_rx) = oneshot::channel(); + assert_eq!(rq.payload, b"request on protocol /test/req-resp/1"); + let _ = rq.pending_response.send(super::OutgoingResponse { + result: Ok( + b"this is a response on protocol /test/req-resp/1".to_vec() + ), + reputation_changes: Vec::new(), + sent_feedback: Some(fb_tx), + }); + fb_rx.await.unwrap(); + } + } + + if let Some(rq) = rx_2.next().await { + let (fb_tx, fb_rx) = oneshot::channel(); + assert_eq!(rq.payload, b"request on protocol /test/other"); + let _ = rq.pending_response.send(super::OutgoingResponse { + result: Ok(b"this is a response on protocol /test/other".to_vec()), + reputation_changes: Vec::new(), + sent_feedback: Some(fb_tx), + }); + fb_rx.await.unwrap(); + } + } + .boxed() + .into(), + ) + .unwrap(); + + build_swarm(vec![protocol_config_1_fallback, protocol_config_2].into_iter()) + }; + + // This swarm speaks all protocols. + let mut new_swarm = build_swarm( + vec![ + protocol_config_1.clone(), + protocol_config_1_fallback.clone(), + protocol_config_2.clone(), + ] + .into_iter(), + ); + + { + let dial_addr = older_swarm.1.clone(); + Swarm::dial(&mut new_swarm.0, dial_addr).unwrap(); + } + + // Running `older_swarm`` in the background. + pool.spawner() + .spawn_obj({ + async move { + loop { + _ = older_swarm.0.select_next_some().await; + } + } + .boxed() + .into() + }) + .unwrap(); + + // Run the newer swarm. Attempt to make requests on all protocols. + let (mut swarm, _) = new_swarm; + let mut older_peer_id = None; + + pool.run_until(async move { + let mut response_receiver = None; + // Try the new protocol with a fallback. + loop { + match swarm.select_next_some().await { + SwarmEvent::ConnectionEstablished { peer_id, .. } => { + older_peer_id = Some(peer_id); + let (sender, receiver) = oneshot::channel(); + swarm.behaviour_mut().send_request( + &peer_id, + protocol_name_1.clone(), + b"request on protocol /test/req-resp/2".to_vec(), + Some(( + b"request on protocol /test/req-resp/1".to_vec(), + protocol_config_1_fallback.name.clone(), + )), + sender, + IfDisconnected::ImmediateError, + ); + response_receiver = Some(receiver); + }, + SwarmEvent::Behaviour(Event::RequestFinished { result, .. }) => { + result.unwrap(); + break + }, + _ => {}, + } + } + assert_eq!( + response_receiver.unwrap().await.unwrap().unwrap(), + ( + b"this is a response on protocol /test/req-resp/1".to_vec(), + protocol_name_1_fallback.clone() + ) + ); + // Try the old protocol with a useless fallback. + let (sender, response_receiver) = oneshot::channel(); + swarm.behaviour_mut().send_request( + older_peer_id.as_ref().unwrap(), + protocol_name_1_fallback.clone(), + b"request on protocol /test/req-resp/1".to_vec(), + Some(( + b"dummy request, will fail if processed".to_vec(), + protocol_config_1_fallback.name.clone(), + )), + sender, + IfDisconnected::ImmediateError, + ); + loop { + match swarm.select_next_some().await { + SwarmEvent::Behaviour(Event::RequestFinished { result, .. }) => { + result.unwrap(); + break + }, + _ => {}, + } + } + assert_eq!( + response_receiver.await.unwrap().unwrap(), + ( + b"this is a response on protocol /test/req-resp/1".to_vec(), + protocol_name_1_fallback.clone() + ) + ); + // Try the new protocol with no fallback. Should fail. + let (sender, response_receiver) = oneshot::channel(); + swarm.behaviour_mut().send_request( + older_peer_id.as_ref().unwrap(), + protocol_name_1.clone(), + b"request on protocol /test/req-resp-2".to_vec(), + None, + sender, + IfDisconnected::ImmediateError, + ); + loop { + match swarm.select_next_some().await { + SwarmEvent::Behaviour(Event::RequestFinished { result, .. }) => { + assert_matches!( + result.unwrap_err(), + RequestFailure::Network(OutboundFailure::UnsupportedProtocols) + ); + break + }, + _ => {}, + } + } + assert!(response_receiver.await.unwrap().is_err()); + // Try the other protocol with no fallback. + let (sender, response_receiver) = oneshot::channel(); + swarm.behaviour_mut().send_request( + older_peer_id.as_ref().unwrap(), + protocol_name_2.clone(), + b"request on protocol /test/other".to_vec(), + None, + sender, + IfDisconnected::ImmediateError, + ); + loop { + match swarm.select_next_some().await { + SwarmEvent::Behaviour(Event::RequestFinished { result, .. }) => { + result.unwrap(); + break + }, + _ => {}, + } + } + assert_eq!( + response_receiver.await.unwrap().unwrap(), + (b"this is a response on protocol /test/other".to_vec(), protocol_name_2.clone()) + ); }); } } diff --git a/substrate/client/network/src/service.rs b/substrate/client/network/src/service.rs index 06db23844d0..47e23337633 100644 --- a/substrate/client/network/src/service.rs +++ b/substrate/client/network/src/service.rs @@ -1048,11 +1048,12 @@ where target: PeerId, protocol: ProtocolName, request: Vec, + fallback_request: Option<(Vec, ProtocolName)>, connect: IfDisconnected, - ) -> Result, RequestFailure> { + ) -> Result<(Vec, ProtocolName), RequestFailure> { let (tx, rx) = oneshot::channel(); - self.start_request(target, protocol, request, tx, connect); + self.start_request(target, protocol, request, fallback_request, tx, connect); match rx.await { Ok(v) => v, @@ -1068,13 +1069,15 @@ where target: PeerId, protocol: ProtocolName, request: Vec, - tx: oneshot::Sender, RequestFailure>>, + fallback_request: Option<(Vec, ProtocolName)>, + tx: oneshot::Sender, ProtocolName), RequestFailure>>, connect: IfDisconnected, ) { let _ = self.to_worker.unbounded_send(ServiceToWorkerMsg::Request { target, protocol: protocol.into(), request, + fallback_request, pending_response: tx, connect, }); @@ -1160,7 +1163,8 @@ enum ServiceToWorkerMsg { target: PeerId, protocol: ProtocolName, request: Vec, - pending_response: oneshot::Sender, RequestFailure>>, + fallback_request: Option<(Vec, ProtocolName)>, + pending_response: oneshot::Sender, ProtocolName), RequestFailure>>, connect: IfDisconnected, }, NetworkStatus { @@ -1287,13 +1291,15 @@ where target, protocol, request, + fallback_request, pending_response, connect, } => { self.network_service.behaviour_mut().send_request( &target, - &protocol, + protocol, request, + fallback_request, pending_response, connect, ); diff --git a/substrate/client/network/src/service/traits.rs b/substrate/client/network/src/service/traits.rs index d4d4a05a86f..74ddb986c24 100644 --- a/substrate/client/network/src/service/traits.rs +++ b/substrate/client/network/src/service/traits.rs @@ -551,8 +551,9 @@ pub trait NetworkRequest { target: PeerId, protocol: ProtocolName, request: Vec, + fallback_request: Option<(Vec, ProtocolName)>, connect: IfDisconnected, - ) -> Result, RequestFailure>; + ) -> Result<(Vec, ProtocolName), RequestFailure>; /// Variation of `request` which starts a request whose response is delivered on a provided /// channel. @@ -569,7 +570,8 @@ pub trait NetworkRequest { target: PeerId, protocol: ProtocolName, request: Vec, - tx: oneshot::Sender, RequestFailure>>, + fallback_request: Option<(Vec, ProtocolName)>, + tx: oneshot::Sender, ProtocolName), RequestFailure>>, connect: IfDisconnected, ); } @@ -585,13 +587,20 @@ where target: PeerId, protocol: ProtocolName, request: Vec, + fallback_request: Option<(Vec, ProtocolName)>, connect: IfDisconnected, - ) -> Pin, RequestFailure>> + Send + 'async_trait>> + ) -> Pin< + Box< + dyn Future, ProtocolName), RequestFailure>> + + Send + + 'async_trait, + >, + > where 'life0: 'async_trait, Self: 'async_trait, { - T::request(self, target, protocol, request, connect) + T::request(self, target, protocol, request, fallback_request, connect) } fn start_request( @@ -599,10 +608,11 @@ where target: PeerId, protocol: ProtocolName, request: Vec, - tx: oneshot::Sender, RequestFailure>>, + fallback_request: Option<(Vec, ProtocolName)>, + tx: oneshot::Sender, ProtocolName), RequestFailure>>, connect: IfDisconnected, ) { - T::start_request(self, target, protocol, request, tx, connect) + T::start_request(self, target, protocol, request, fallback_request, tx, connect) } } diff --git a/substrate/client/network/sync/src/block_relay_protocol.rs b/substrate/client/network/sync/src/block_relay_protocol.rs index 7a313458bf0..b4ef72a10c6 100644 --- a/substrate/client/network/sync/src/block_relay_protocol.rs +++ b/substrate/client/network/sync/src/block_relay_protocol.rs @@ -18,7 +18,10 @@ use futures::channel::oneshot; use libp2p::PeerId; -use sc_network::request_responses::{ProtocolConfig, RequestFailure}; +use sc_network::{ + request_responses::{ProtocolConfig, RequestFailure}, + ProtocolName, +}; use sc_network_common::sync::message::{BlockData, BlockRequest}; use sp_runtime::traits::Block as BlockT; use std::sync::Arc; @@ -43,7 +46,7 @@ pub trait BlockDownloader: Send + Sync { &self, who: PeerId, request: BlockRequest, - ) -> Result, RequestFailure>, oneshot::Canceled>; + ) -> Result, ProtocolName), RequestFailure>, oneshot::Canceled>; /// Parses the protocol specific response to retrieve the block data. fn block_response_into_blocks( diff --git a/substrate/client/network/sync/src/block_request_handler.rs b/substrate/client/network/sync/src/block_request_handler.rs index f363dda3a2d..f669a22cd2e 100644 --- a/substrate/client/network/sync/src/block_request_handler.rs +++ b/substrate/client/network/sync/src/block_request_handler.rs @@ -570,7 +570,7 @@ impl BlockDownloader for FullBlockDownloader { &self, who: PeerId, request: BlockRequest, - ) -> Result, RequestFailure>, oneshot::Canceled> { + ) -> Result, ProtocolName), RequestFailure>, oneshot::Canceled> { // Build the request protobuf. let bytes = BlockRequestSchema { fields: request.fields.to_be_u32(), diff --git a/substrate/client/network/sync/src/engine.rs b/substrate/client/network/sync/src/engine.rs index d7b024cd801..952300a14d8 100644 --- a/substrate/client/network/sync/src/engine.rs +++ b/substrate/client/network/sync/src/engine.rs @@ -1263,7 +1263,7 @@ where let ResponseEvent { peer_id, request, response } = response_event; match response { - Ok(Ok(resp)) => match request { + Ok(Ok((resp, _))) => match request { PeerRequest::Block(req) => { match self.block_downloader.block_response_into_blocks(&req, resp) { Ok(blocks) => { diff --git a/substrate/client/network/sync/src/mock.rs b/substrate/client/network/sync/src/mock.rs index 42220096e06..a4f5eb564c2 100644 --- a/substrate/client/network/sync/src/mock.rs +++ b/substrate/client/network/sync/src/mock.rs @@ -22,7 +22,7 @@ use crate::block_relay_protocol::{BlockDownloader as BlockDownloaderT, BlockResp use futures::channel::oneshot; use libp2p::PeerId; -use sc_network::RequestFailure; +use sc_network::{ProtocolName, RequestFailure}; use sc_network_common::sync::message::{BlockData, BlockRequest}; use sp_runtime::traits::Block as BlockT; @@ -35,7 +35,7 @@ mockall::mock! { &self, who: PeerId, request: BlockRequest, - ) -> Result, RequestFailure>, oneshot::Canceled>; + ) -> Result, ProtocolName), RequestFailure>, oneshot::Canceled>; fn block_response_into_blocks( &self, request: &BlockRequest, diff --git a/substrate/client/network/sync/src/pending_responses.rs b/substrate/client/network/sync/src/pending_responses.rs index 55308dfc1ea..e21a5763225 100644 --- a/substrate/client/network/sync/src/pending_responses.rs +++ b/substrate/client/network/sync/src/pending_responses.rs @@ -28,7 +28,7 @@ use futures::{ }; use libp2p::PeerId; use log::error; -use sc_network::request_responses::RequestFailure; +use sc_network::{request_responses::RequestFailure, types::ProtocolName}; use sp_runtime::traits::Block as BlockT; use std::task::{Context, Poll, Waker}; use tokio_stream::StreamMap; @@ -37,7 +37,7 @@ use tokio_stream::StreamMap; const LOG_TARGET: &'static str = "sync"; /// Response result. -type ResponseResult = Result, RequestFailure>, oneshot::Canceled>; +type ResponseResult = Result, ProtocolName), RequestFailure>, oneshot::Canceled>; /// A future yielding [`ResponseResult`]. type ResponseFuture = BoxFuture<'static, ResponseResult>; diff --git a/substrate/client/network/sync/src/service/mock.rs b/substrate/client/network/sync/src/service/mock.rs index 6e307d86984..420de8cd5fd 100644 --- a/substrate/client/network/sync/src/service/mock.rs +++ b/substrate/client/network/sync/src/service/mock.rs @@ -117,14 +117,16 @@ mockall::mock! { target: PeerId, protocol: ProtocolName, request: Vec, + fallback_request: Option<(Vec, ProtocolName)>, connect: IfDisconnected, - ) -> Result, RequestFailure>; + ) -> Result<(Vec, ProtocolName), RequestFailure>; fn start_request( &self, target: PeerId, protocol: ProtocolName, request: Vec, - tx: oneshot::Sender, RequestFailure>>, + fallback_request: Option<(Vec, ProtocolName)>, + tx: oneshot::Sender, ProtocolName), RequestFailure>>, connect: IfDisconnected, ); } diff --git a/substrate/client/network/sync/src/service/network.rs b/substrate/client/network/sync/src/service/network.rs index 12a47d6a9b5..07f28519afb 100644 --- a/substrate/client/network/sync/src/service/network.rs +++ b/substrate/client/network/sync/src/service/network.rs @@ -54,7 +54,7 @@ pub enum ToServiceCommand { PeerId, ProtocolName, Vec, - oneshot::Sender, RequestFailure>>, + oneshot::Sender, ProtocolName), RequestFailure>>, IfDisconnected, ), @@ -94,7 +94,7 @@ impl NetworkServiceHandle { who: PeerId, protocol: ProtocolName, request: Vec, - tx: oneshot::Sender, RequestFailure>>, + tx: oneshot::Sender, ProtocolName), RequestFailure>>, connect: IfDisconnected, ) { let _ = self @@ -134,7 +134,7 @@ impl NetworkServiceProvider { ToServiceCommand::ReportPeer(peer, reputation_change) => service.report_peer(peer, reputation_change), ToServiceCommand::StartRequest(peer, protocol, request, tx, connect) => - service.start_request(peer, protocol, request, tx, connect), + service.start_request(peer, protocol, request, None, tx, connect), ToServiceCommand::WriteNotification(peer, protocol, message) => service.write_notification(peer, protocol, message), ToServiceCommand::SetNotificationHandshake(protocol, handshake) => -- GitLab From 6a80c10a6fc345f96a504f11e99dfbd0ec1ed139 Mon Sep 17 00:00:00 2001 From: Marcin S Date: Wed, 10 Jan 2024 16:50:55 +0100 Subject: [PATCH 145/191] PVF: Remove artifact persistence across restarts (#2895) Considering the complexity of https://github.com/paritytech/polkadot-sdk/pull/2871 and the discussion therein, as well as the further complexity introduced by the hardening in https://github.com/paritytech/polkadot-sdk/pull/2742, as well as the eventual replacement of wasmtime by PolkaVM, it seems best to remove this persistence as it is creating more problems than it solves. ## Related Closes https://github.com/paritytech/polkadot-sdk/issues/2863 --- Cargo.lock | 2 +- polkadot/node/core/pvf/Cargo.toml | 1 + polkadot/node/core/pvf/common/Cargo.toml | 3 - polkadot/node/core/pvf/common/build.rs | 19 - polkadot/node/core/pvf/common/src/lib.rs | 2 - polkadot/node/core/pvf/src/artifacts.rs | 359 ++++-------------- polkadot/node/core/pvf/src/host.rs | 23 +- .../core/pvf/src/prepare/worker_interface.rs | 33 +- .../node/core/pvf/src/worker_interface.rs | 4 +- polkadot/node/core/pvf/tests/it/main.rs | 19 + .../utils/build-script-utils/src/version.rs | 31 -- 11 files changed, 117 insertions(+), 379 deletions(-) delete mode 100644 polkadot/node/core/pvf/common/build.rs diff --git a/Cargo.lock b/Cargo.lock index e00c173228f..6ac2fe567f9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12671,6 +12671,7 @@ name = "polkadot-node-core-pvf" version = "1.0.0" dependencies = [ "always-assert", + "array-bytes 6.1.0", "assert_matches", "blake3", "cfg-if", @@ -12753,7 +12754,6 @@ dependencies = [ "sp-externalities 0.19.0", "sp-io", "sp-tracing 10.0.0", - "substrate-build-script-utils", "tempfile", "thiserror", "tracing-gum", diff --git a/polkadot/node/core/pvf/Cargo.toml b/polkadot/node/core/pvf/Cargo.toml index 2642377b6e6..be35dc47b8a 100644 --- a/polkadot/node/core/pvf/Cargo.toml +++ b/polkadot/node/core/pvf/Cargo.toml @@ -11,6 +11,7 @@ workspace = true [dependencies] always-assert = "0.1" +array-bytes = "6.1" blake3 = "1.5" cfg-if = "1.0" futures = "0.3.21" diff --git a/polkadot/node/core/pvf/common/Cargo.toml b/polkadot/node/core/pvf/common/Cargo.toml index c5c09300e8a..974965be593 100644 --- a/polkadot/node/core/pvf/common/Cargo.toml +++ b/polkadot/node/core/pvf/common/Cargo.toml @@ -39,9 +39,6 @@ seccompiler = "0.4.0" assert_matches = "1.4.0" tempfile = "3.3.0" -[build-dependencies] -substrate-build-script-utils = { path = "../../../../../substrate/utils/build-script-utils" } - [features] # This feature is used to export test code to other crates without putting it in the production build. test-utils = [] diff --git a/polkadot/node/core/pvf/common/build.rs b/polkadot/node/core/pvf/common/build.rs deleted file mode 100644 index 5531ad411da..00000000000 --- a/polkadot/node/core/pvf/common/build.rs +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (C) Parity Technologies (UK) Ltd. -// This file is part of Polkadot. - -// Polkadot is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Polkadot is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Polkadot. If not, see . - -fn main() { - substrate_build_script_utils::generate_wasmtime_version(); -} diff --git a/polkadot/node/core/pvf/common/src/lib.rs b/polkadot/node/core/pvf/common/src/lib.rs index abebd06f71a..af4a7526e55 100644 --- a/polkadot/node/core/pvf/common/src/lib.rs +++ b/polkadot/node/core/pvf/common/src/lib.rs @@ -31,8 +31,6 @@ pub use sp_tracing; const LOG_TARGET: &str = "parachain::pvf-common"; -pub const RUNTIME_VERSION: &str = env!("SUBSTRATE_WASMTIME_VERSION"); - use parity_scale_codec::{Decode, Encode}; use std::{ io::{self, Read, Write}, diff --git a/polkadot/node/core/pvf/src/artifacts.rs b/polkadot/node/core/pvf/src/artifacts.rs index 17ce5b443e3..78dfe71adad 100644 --- a/polkadot/node/core/pvf/src/artifacts.rs +++ b/polkadot/node/core/pvf/src/artifacts.rs @@ -18,8 +18,7 @@ //! //! # Lifecycle of an artifact //! -//! 1. During node start-up, we will check the cached artifacts, if any. The stale and corrupted -//! ones are pruned. The valid ones are registered in the [`Artifacts`] table. +//! 1. During node start-up, we prune all the cached artifacts, if any. //! //! 2. In order to be executed, a PVF should be prepared first. This means that artifacts should //! have an [`ArtifactState::Prepared`] entry for that artifact in the table. If not, the @@ -55,28 +54,35 @@ //! older by a predefined parameter. This process is run very rarely (say, once a day). Once the //! artifact is expired it is removed from disk eagerly atomically. -use crate::{host::PrecheckResultSender, LOG_TARGET}; +use crate::{host::PrecheckResultSender, worker_interface::WORKER_DIR_PREFIX}; use always_assert::always; -use polkadot_core_primitives::Hash; -use polkadot_node_core_pvf_common::{ - error::PrepareError, prepare::PrepareStats, pvf::PvfPrepData, RUNTIME_VERSION, -}; -use polkadot_node_primitives::NODE_VERSION; +use polkadot_node_core_pvf_common::{error::PrepareError, prepare::PrepareStats, pvf::PvfPrepData}; use polkadot_parachain_primitives::primitives::ValidationCodeHash; use polkadot_primitives::ExecutorParamsHash; use std::{ collections::HashMap, - io, + fs, path::{Path, PathBuf}, - str::FromStr as _, time::{Duration, SystemTime}, }; -const RUNTIME_PREFIX: &str = "wasmtime_v"; -const NODE_PREFIX: &str = "polkadot_v"; +/// The extension to use for cached artifacts. +const ARTIFACT_EXTENSION: &str = "pvf"; + +/// The prefix that artifacts used to start with under the old naming scheme. +const ARTIFACT_OLD_PREFIX: &str = "wasmtime_"; -fn artifact_prefix() -> String { - format!("{}{}_{}{}", RUNTIME_PREFIX, RUNTIME_VERSION, NODE_PREFIX, NODE_VERSION) +pub fn generate_artifact_path(cache_path: &Path) -> PathBuf { + let file_name = { + use array_bytes::Hex; + use rand::RngCore; + let mut bytes = [0u8; 64]; + rand::thread_rng().fill_bytes(&mut bytes); + bytes.hex("0x") + }; + let mut artifact_path = cache_path.join(file_name); + artifact_path.set_extension(ARTIFACT_EXTENSION); + artifact_path } /// Identifier of an artifact. Encodes a code hash of the PVF and a hash of executor parameter set. @@ -96,35 +102,6 @@ impl ArtifactId { pub fn from_pvf_prep_data(pvf: &PvfPrepData) -> Self { Self::new(pvf.code_hash(), pvf.executor_params().hash()) } - - /// Returns the canonical path to the concluded artifact. - pub(crate) fn path(&self, cache_path: &Path, checksum: &str) -> PathBuf { - let file_name = format!( - "{}_{:#x}_{:#x}_0x{}", - artifact_prefix(), - self.code_hash, - self.executor_params_hash, - checksum - ); - cache_path.join(file_name) - } - - /// Tries to recover the artifact id from the given file name. - /// Return `None` if the given file name is invalid. - /// VALID_NAME := _ _ _ - fn from_file_name(file_name: &str) -> Option { - let file_name = file_name.strip_prefix(&artifact_prefix())?.strip_prefix('_')?; - let parts: Vec<&str> = file_name.split('_').collect(); - - if let [code_hash, param_hash, _checksum] = parts[..] { - let code_hash = Hash::from_str(code_hash).ok()?.into(); - let executor_params_hash = - ExecutorParamsHash::from_hash(Hash::from_str(param_hash).ok()?); - return Some(Self { code_hash, executor_params_hash }) - } - - None - } } /// A bundle of the artifact ID and the path. @@ -194,120 +171,31 @@ impl Artifacts { } #[cfg(test)] - pub(crate) fn len(&self) -> usize { + fn len(&self) -> usize { self.inner.len() } - /// Create an empty table and populate it with valid artifacts as [`ArtifactState::Prepared`], - /// if any. The existing caches will be checked by their file name to determine whether they are - /// valid, e.g., matching the current node version. The ones deemed invalid will be pruned. - /// - /// Create the cache directory on-disk if it doesn't exist. - pub async fn new_and_prune(cache_path: &Path) -> Self { - let mut artifacts = Self { inner: HashMap::new() }; - let _ = artifacts.insert_and_prune(cache_path).await.map_err(|err| { - gum::error!( - target: LOG_TARGET, - "could not initialize artifacts cache: {err}", - ) - }); - artifacts - } - - async fn insert_and_prune(&mut self, cache_path: &Path) -> Result<(), String> { - async fn is_corrupted(path: &Path) -> bool { - let checksum = match tokio::fs::read(path).await { - Ok(bytes) => blake3::hash(&bytes), - Err(err) => { - // just remove the file if we cannot read it - gum::warn!( - target: LOG_TARGET, - ?err, - "unable to read artifact {:?} when checking integrity, removing...", - path, - ); - return true - }, - }; - - if let Some(file_name) = path.file_name() { - if let Some(file_name) = file_name.to_str() { - return !file_name.ends_with(checksum.to_hex().as_str()) - } - } - true - } - - // Insert the entry into the artifacts table if it is valid. - // Otherwise, prune it. - async fn insert_or_prune( - artifacts: &mut Artifacts, - entry: &tokio::fs::DirEntry, - cache_path: &Path, - ) -> Result<(), String> { - let file_type = entry.file_type().await; - let file_name = entry.file_name(); - - match file_type { - Ok(file_type) => - if !file_type.is_file() { - return Ok(()) - }, - Err(err) => return Err(format!("unable to get file type for {file_name:?}: {err}")), - } - - if let Some(file_name) = file_name.to_str() { - let id = ArtifactId::from_file_name(file_name); - let path = cache_path.join(file_name); - - if id.is_none() || is_corrupted(&path).await { - let _ = tokio::fs::remove_file(&path).await; - return Err(format!("invalid artifact {path:?}, file deleted")) - } - - let id = id.expect("checked is_none() above; qed"); - gum::debug!( - target: LOG_TARGET, - "reusing existing {:?} for node version v{}", - &path, - NODE_VERSION, - ); - artifacts.insert_prepared(id, path, SystemTime::now(), Default::default()); - - Ok(()) - } else { - Err(format!("non-Unicode file name {file_name:?} found in {cache_path:?}")) - } - } - + /// Create an empty table and the cache directory on-disk if it doesn't exist. + pub async fn new(cache_path: &Path) -> Self { // Make sure that the cache path directory and all its parents are created. - if let Err(err) = tokio::fs::create_dir_all(cache_path).await { - if err.kind() != io::ErrorKind::AlreadyExists { - return Err(format!("failed to create dir {cache_path:?}: {err}")) + let _ = tokio::fs::create_dir_all(cache_path).await; + + // Delete any leftover artifacts and worker dirs from previous runs. We don't delete the + // entire cache directory in case the user made a mistake and set it to e.g. their home + // directory. This is a best-effort to do clean-up, so ignore any errors. + for entry in fs::read_dir(cache_path).into_iter().flatten().flatten() { + let path = entry.path(); + let Some(file_name) = path.file_name().and_then(|f| f.to_str()) else { continue }; + if path.is_dir() && file_name.starts_with(WORKER_DIR_PREFIX) { + let _ = fs::remove_dir_all(path); + } else if path.extension().map_or(false, |ext| ext == ARTIFACT_EXTENSION) || + file_name.starts_with(ARTIFACT_OLD_PREFIX) + { + let _ = fs::remove_file(path); } } - let mut dir = tokio::fs::read_dir(cache_path) - .await - .map_err(|err| format!("failed to read dir {cache_path:?}: {err}"))?; - - loop { - match dir.next_entry().await { - Ok(Some(entry)) => - if let Err(err) = insert_or_prune(self, &entry, cache_path).await { - gum::warn!( - target: LOG_TARGET, - ?cache_path, - "could not insert entry {:?} into the artifact cache: {}", - entry, - err, - ) - }, - Ok(None) => return Ok(()), - Err(err) => - return Err(format!("error processing artifacts in {cache_path:?}: {err}")), - } - } + Self { inner: HashMap::new() } } /// Returns the state of the given artifact by its ID. @@ -335,6 +223,7 @@ impl Artifacts { /// /// This function should only be used to build the artifact table at startup with valid /// artifact caches. + #[cfg(test)] pub(crate) fn insert_prepared( &mut self, artifact_id: ArtifactId, @@ -376,151 +265,33 @@ impl Artifacts { #[cfg(test)] mod tests { - use super::{artifact_prefix as prefix, ArtifactId, Artifacts, NODE_VERSION, RUNTIME_VERSION}; - use polkadot_primitives::ExecutorParamsHash; - use rand::Rng; - use sp_core::H256; - use std::{ - fs, - io::Write, - path::{Path, PathBuf}, - str::FromStr, - }; - - fn rand_hash(len: usize) -> String { - let mut rng = rand::thread_rng(); - let hex: Vec<_> = "0123456789abcdef".chars().collect(); - (0..len).map(|_| hex[rng.gen_range(0..hex.len())]).collect() - } - - fn file_name(code_hash: &str, param_hash: &str, checksum: &str) -> String { - format!("{}_0x{}_0x{}_0x{}", prefix(), code_hash, param_hash, checksum) - } - - fn create_artifact( - dir: impl AsRef, - prefix: &str, - code_hash: impl AsRef, - params_hash: impl AsRef, - ) -> (PathBuf, String) { - fn artifact_path_without_checksum( - dir: impl AsRef, - prefix: &str, - code_hash: impl AsRef, - params_hash: impl AsRef, - ) -> PathBuf { - let mut path = dir.as_ref().to_path_buf(); - let file_name = - format!("{}_0x{}_0x{}", prefix, code_hash.as_ref(), params_hash.as_ref(),); - path.push(file_name); - path - } - - let (code_hash, params_hash) = (code_hash.as_ref(), params_hash.as_ref()); - let path = artifact_path_without_checksum(dir, prefix, code_hash, params_hash); - let mut file = fs::File::create(&path).unwrap(); - - let content = format!("{}{}", code_hash, params_hash).into_bytes(); - file.write_all(&content).unwrap(); - let checksum = blake3::hash(&content).to_hex().to_string(); - - (path, checksum) - } - - fn create_rand_artifact(dir: impl AsRef, prefix: &str) -> (PathBuf, String) { - create_artifact(dir, prefix, rand_hash(64), rand_hash(64)) - } - - fn concluded_path(path: impl AsRef, checksum: &str) -> PathBuf { - let path = path.as_ref(); - let mut file_name = path.file_name().unwrap().to_os_string(); - file_name.push("_0x"); - file_name.push(checksum); - path.with_file_name(file_name) - } - - #[test] - fn artifact_prefix() { - assert_eq!(prefix(), format!("wasmtime_v{}_polkadot_v{}", RUNTIME_VERSION, NODE_VERSION)); - } - - #[test] - fn from_file_name() { - assert!(ArtifactId::from_file_name("").is_none()); - assert!(ArtifactId::from_file_name("junk").is_none()); - - let file_name = file_name( - "0022800000000000000000000000000000000000000000000000000000000000", - "0033900000000000000000000000000000000000000000000000000000000000", - "00000000000000000000000000000000", - ); - - assert_eq!( - ArtifactId::from_file_name(&file_name), - Some(ArtifactId::new( - hex_literal::hex![ - "0022800000000000000000000000000000000000000000000000000000000000" - ] - .into(), - ExecutorParamsHash::from_hash(sp_core::H256(hex_literal::hex![ - "0033900000000000000000000000000000000000000000000000000000000000" - ])), - )), - ); - } - - #[test] - fn path() { - let dir = Path::new("/test"); - let code_hash = "1234567890123456789012345678901234567890123456789012345678901234"; - let params_hash = "4321098765432109876543210987654321098765432109876543210987654321"; - let checksum = "34567890123456789012345678901234"; - let file_name = file_name(code_hash, params_hash, checksum); - - let code_hash = H256::from_str(code_hash).unwrap(); - let params_hash = H256::from_str(params_hash).unwrap(); - let path = ArtifactId::new(code_hash.into(), ExecutorParamsHash::from_hash(params_hash)) - .path(dir, checksum); - - assert_eq!(path.to_str().unwrap(), format!("/test/{}", file_name)); - } + use super::*; #[tokio::test] - async fn remove_stale_cache_on_startup() { - let cache_dir = tempfile::Builder::new().prefix("test-cache-").tempdir().unwrap(); - - // invalid prefix - create_rand_artifact(&cache_dir, ""); - create_rand_artifact(&cache_dir, "wasmtime_polkadot_v"); - create_rand_artifact(&cache_dir, "wasmtime_v8.0.0_polkadot_v1.0.0"); - - let prefix = prefix(); - - // no checksum - create_rand_artifact(&cache_dir, &prefix); - - // invalid hashes - let (path, checksum) = create_artifact(&cache_dir, &prefix, "000", "000001"); - let new_path = concluded_path(&path, &checksum); - fs::rename(&path, &new_path).unwrap(); - - // checksum tampered - let (path, checksum) = create_rand_artifact(&cache_dir, &prefix); - let new_path = concluded_path(&path, checksum.chars().rev().collect::().as_str()); - fs::rename(&path, &new_path).unwrap(); - - // valid - let (path, checksum) = create_rand_artifact(&cache_dir, &prefix); - let new_path = concluded_path(&path, &checksum); - fs::rename(&path, &new_path).unwrap(); - - assert_eq!(fs::read_dir(&cache_dir).unwrap().count(), 7); - - let artifacts = Artifacts::new_and_prune(cache_dir.path()).await; - - assert_eq!(fs::read_dir(&cache_dir).unwrap().count(), 1); - assert_eq!(artifacts.len(), 1); - - fs::remove_dir_all(cache_dir).unwrap(); + async fn cache_cleared_on_startup() { + let tempdir = tempfile::tempdir().unwrap(); + let cache_path = tempdir.path(); + + // These should be cleared. + fs::write(cache_path.join("abcd.pvf"), "test").unwrap(); + fs::write(cache_path.join("wasmtime_..."), "test").unwrap(); + fs::create_dir(cache_path.join("worker-dir-prepare-test")).unwrap(); + + // These should not be touched. + fs::write(cache_path.join("abcd.pvfartifact"), "test").unwrap(); + fs::write(cache_path.join("polkadot_..."), "test").unwrap(); + fs::create_dir(cache_path.join("worker-prepare-test")).unwrap(); + + let artifacts = Artifacts::new(cache_path).await; + + let entries: Vec = fs::read_dir(&cache_path) + .unwrap() + .map(|entry| entry.unwrap().file_name().into_string().unwrap()) + .collect(); + assert_eq!(entries.len(), 3); + assert!(entries.contains(&String::from("abcd.pvfartifact"))); + assert!(entries.contains(&String::from("polkadot_..."))); + assert!(entries.contains(&String::from("worker-prepare-test"))); + assert_eq!(artifacts.len(), 0); } } diff --git a/polkadot/node/core/pvf/src/host.rs b/polkadot/node/core/pvf/src/host.rs index d17a4d918e0..21e13453edf 100644 --- a/polkadot/node/core/pvf/src/host.rs +++ b/polkadot/node/core/pvf/src/host.rs @@ -218,7 +218,7 @@ pub async fn start( gum::debug!(target: LOG_TARGET, ?config, "starting PVF validation host"); // Make sure the cache is initialized before doing anything else. - let artifacts = Artifacts::new_and_prune(&config.cache_path).await; + let artifacts = Artifacts::new(&config.cache_path).await; // Run checks for supported security features once per host startup. If some checks fail, warn // if Secure Validator Mode is disabled and return an error otherwise. @@ -884,14 +884,13 @@ fn pulse_every(interval: std::time::Duration) -> impl futures::Stream #[cfg(test)] pub(crate) mod tests { use super::*; - use crate::PossiblyInvalidError; + use crate::{artifacts::generate_artifact_path, PossiblyInvalidError}; use assert_matches::assert_matches; use futures::future::BoxFuture; use polkadot_node_core_pvf_common::{ error::PrepareError, prepare::{PrepareStats, PrepareSuccess}, }; - use sp_core::hexdisplay::AsBytesRef; const TEST_EXECUTION_TIMEOUT: Duration = Duration::from_secs(3); pub(crate) const TEST_PREPARATION_TIMEOUT: Duration = Duration::from_secs(30); @@ -915,14 +914,6 @@ pub(crate) mod tests { ArtifactId::from_pvf_prep_data(&PvfPrepData::from_discriminator(discriminator)) } - fn artifact_path(discriminator: u32) -> PathBuf { - let pvf = PvfPrepData::from_discriminator(discriminator); - let checksum = blake3::hash(pvf.code().as_bytes_ref()); - artifact_id(discriminator) - .path(&PathBuf::from(std::env::temp_dir()), checksum.to_hex().as_str()) - .to_owned() - } - struct Builder { cleanup_pulse_interval: Duration, artifact_ttl: Duration, @@ -1110,19 +1101,23 @@ pub(crate) mod tests { #[tokio::test] async fn pruning() { let mock_now = SystemTime::now() - Duration::from_millis(1000); + let tempdir = tempfile::tempdir().unwrap(); + let cache_path = tempdir.path(); let mut builder = Builder::default(); builder.cleanup_pulse_interval = Duration::from_millis(100); builder.artifact_ttl = Duration::from_millis(500); + let path1 = generate_artifact_path(cache_path); + let path2 = generate_artifact_path(cache_path); builder.artifacts.insert_prepared( artifact_id(1), - artifact_path(1), + path1.clone(), mock_now, PrepareStats::default(), ); builder.artifacts.insert_prepared( artifact_id(2), - artifact_path(2), + path2.clone(), mock_now, PrepareStats::default(), ); @@ -1135,7 +1130,7 @@ pub(crate) mod tests { run_until( &mut test.run, async { - assert_eq!(to_sweeper_rx.next().await.unwrap(), artifact_path(2)); + assert_eq!(to_sweeper_rx.next().await.unwrap(), path2); } .boxed(), ) diff --git a/polkadot/node/core/pvf/src/prepare/worker_interface.rs b/polkadot/node/core/pvf/src/prepare/worker_interface.rs index 984a87ce5c9..45e31a5f453 100644 --- a/polkadot/node/core/pvf/src/prepare/worker_interface.rs +++ b/polkadot/node/core/pvf/src/prepare/worker_interface.rs @@ -17,7 +17,7 @@ //! Host interface to the prepare worker. use crate::{ - artifacts::ArtifactId, + artifacts::generate_artifact_path, metrics::Metrics, worker_interface::{ clear_worker_dir_path, framed_recv, framed_send, spawn_with_program_path, IdleWorker, @@ -165,7 +165,6 @@ pub async fn start_work( prepare_worker_result, pid, tmp_artifact_file, - &pvf, &cache_path, preparation_timeout, ) @@ -205,19 +204,22 @@ async fn handle_response( result: PrepareWorkerResult, worker_pid: u32, tmp_file: PathBuf, - pvf: &PvfPrepData, cache_path: &Path, preparation_timeout: Duration, ) -> Outcome { - let PrepareWorkerSuccess { checksum, stats: PrepareStats { cpu_time_elapsed, memory_stats } } = - match result.clone() { - Ok(result) => result, - // Timed out on the child. This should already be logged by the child. - Err(PrepareError::TimedOut) => return Outcome::TimedOut, - Err(PrepareError::JobDied { err, job_pid }) => return Outcome::JobDied { err, job_pid }, - Err(PrepareError::OutOfMemory) => return Outcome::OutOfMemory, - Err(err) => return Outcome::Concluded { worker, result: Err(err) }, - }; + // TODO: Add `checksum` to `ArtifactPathId`. See: + // https://github.com/paritytech/polkadot-sdk/issues/2399 + let PrepareWorkerSuccess { + checksum: _, + stats: PrepareStats { cpu_time_elapsed, memory_stats }, + } = match result.clone() { + Ok(result) => result, + // Timed out on the child. This should already be logged by the child. + Err(PrepareError::TimedOut) => return Outcome::TimedOut, + Err(PrepareError::JobDied { err, job_pid }) => return Outcome::JobDied { err, job_pid }, + Err(PrepareError::OutOfMemory) => return Outcome::OutOfMemory, + Err(err) => return Outcome::Concluded { worker, result: Err(err) }, + }; if cpu_time_elapsed > preparation_timeout { // The job didn't complete within the timeout. @@ -232,8 +234,11 @@ async fn handle_response( return Outcome::TimedOut } - let artifact_id = ArtifactId::from_pvf_prep_data(pvf); - let artifact_path = artifact_id.path(cache_path, &checksum); + // The file name should uniquely identify the artifact even across restarts. In case the cache + // for some reason is not cleared correctly, we cannot + // accidentally execute an artifact compiled under a different wasmtime version, host + // environment, etc. + let artifact_path = generate_artifact_path(cache_path); gum::debug!( target: LOG_TARGET, diff --git a/polkadot/node/core/pvf/src/worker_interface.rs b/polkadot/node/core/pvf/src/worker_interface.rs index 456c20bd27b..ad9f0294c09 100644 --- a/polkadot/node/core/pvf/src/worker_interface.rs +++ b/polkadot/node/core/pvf/src/worker_interface.rs @@ -384,10 +384,12 @@ pub struct WorkerDir { tempdir: tempfile::TempDir, } +pub const WORKER_DIR_PREFIX: &str = "worker-dir"; + impl WorkerDir { /// Creates a new, empty worker dir with a random name in the given cache dir. pub async fn new(debug_id: &'static str, cache_dir: &Path) -> Result { - let prefix = format!("worker-dir-{}-", debug_id); + let prefix = format!("{WORKER_DIR_PREFIX}-{debug_id}-"); let tempdir = tempfile::Builder::new() .prefix(&prefix) .tempdir_in(cache_dir) diff --git a/polkadot/node/core/pvf/tests/it/main.rs b/polkadot/node/core/pvf/tests/it/main.rs index 09f975b706d..15b341dc094 100644 --- a/polkadot/node/core/pvf/tests/it/main.rs +++ b/polkadot/node/core/pvf/tests/it/main.rs @@ -358,6 +358,25 @@ async fn deleting_prepared_artifact_does_not_dispute() { } } +#[tokio::test] +async fn cache_cleared_on_startup() { + // Don't drop this host, it owns the `TempDir` which gets cleared on drop. + let host = TestHost::new().await; + + let _stats = host.precheck_pvf(halt::wasm_binary_unwrap(), Default::default()).await.unwrap(); + + // The cache dir should contain one artifact and one worker dir. + let cache_dir = host.cache_dir.path().to_owned(); + assert_eq!(std::fs::read_dir(&cache_dir).unwrap().count(), 2); + + // Start a new host, previous artifact should be cleared. + let _host = TestHost::new_with_config(|cfg| { + cfg.cache_path = cache_dir.clone(); + }) + .await; + assert_eq!(std::fs::read_dir(&cache_dir).unwrap().count(), 0); +} + // This test checks if the adder parachain runtime can be prepared with 10Mb preparation memory // limit enforced. At the moment of writing, the limit if far enough to prepare the PVF. If it // starts failing, either Wasmtime version has changed, or the PVF code itself has changed, and diff --git a/substrate/utils/build-script-utils/src/version.rs b/substrate/utils/build-script-utils/src/version.rs index d85c78d2c99..cc6b4319eca 100644 --- a/substrate/utils/build-script-utils/src/version.rs +++ b/substrate/utils/build-script-utils/src/version.rs @@ -59,34 +59,3 @@ fn get_version(impl_commit: &str) -> String { impl_commit ) } - -/// Generate `SUBSTRATE_WASMTIME_VERSION` -pub fn generate_wasmtime_version() { - generate_dependency_version("wasmtime", "SUBSTRATE_WASMTIME_VERSION"); -} - -fn generate_dependency_version(dep: &str, env_var: &str) { - // we only care about the root - match std::process::Command::new("cargo") - .args(["tree", "--depth=0", "--locked", "--package", dep]) - .output() - { - Ok(output) if output.status.success() => { - let version = String::from_utf8_lossy(&output.stdout); - - // vX.X.X - if let Some(ver) = version.strip_prefix(&format!("{} v", dep)) { - println!("cargo:rustc-env={}={}", env_var, ver); - } else { - println!("cargo:warning=Unexpected result {}", version); - } - }, - - // command errors out when it could not find the given dependency - // or when having multiple versions of it - Ok(output) => - println!("cargo:warning=`cargo tree` {}", String::from_utf8_lossy(&output.stderr)), - - Err(err) => println!("cargo:warning=Could not run `cargo tree`: {}", err), - } -} -- GitLab From bab0348372b58d5106333faa597423242e831a31 Mon Sep 17 00:00:00 2001 From: Clara van Staden Date: Wed, 10 Jan 2024 18:51:27 +0200 Subject: [PATCH 146/191] Update Snowbridge versions and prep for publishing (#2894) - updates snowbridge crates to `0.9.0` - updates Cargo.toml files in preparation for publishing to crates.io - adds Kusama and Polkadot Snowbridge runtime config crates - moves runtime tests from the Snowbridge subtree into the bridge hub tests dir --------- Co-authored-by: claravanstaden Co-authored-by: Ron --- Cargo.lock | 164 ++++++++---------- Cargo.toml | 5 +- .../Cargo.toml | 14 +- .../pallets/ethereum-client/README.md | 3 + .../benchmark.md | 16 +- .../src/benchmarking/fixtures_mainnet.rs | 0 .../src/benchmarking/fixtures_minimal.rs | 0 .../src/benchmarking/mod.rs | 0 .../src/benchmarking/util.rs | 0 .../src/config/mainnet.rs | 0 .../src/config/minimal.rs | 0 .../src/config/mod.rs | 0 .../src/functions.rs | 0 .../src/impls.rs | 12 +- .../src/lib.rs | 4 +- .../src/mock.rs | 29 +--- .../src/tests.rs | 0 .../src/types.rs | 0 .../src/weights.rs | 2 +- .../execution-header-update.mainnet.json | 0 .../execution-header-update.minimal.json | 0 .../finalized-header-update.mainnet.json | 0 .../finalized-header-update.minimal.json | 0 .../fixtures/initial-checkpoint.mainnet.json | 0 .../fixtures/initial-checkpoint.minimal.json | 0 .../next-finalized-header-update.mainnet.json | 0 .../next-finalized-header-update.minimal.json | 0 .../next-sync-committee-update.mainnet.json | 0 .../next-sync-committee-update.minimal.json | 0 .../sync-committee-update.mainnet.json | 0 .../sync-committee-update.minimal.json | 0 .../pallets/inbound-queue/Cargo.toml | 23 ++- .../parachain/pallets/inbound-queue/README.md | 3 + .../pallets/inbound-queue/src/lib.rs | 52 ++++-- .../pallets/inbound-queue/src/mock.rs | 52 +++++- .../pallets/inbound-queue/src/test.rs | 1 + .../pallets/outbound-queue/Cargo.toml | 14 +- .../pallets/outbound-queue/README.md | 3 + .../outbound-queue/merkle-tree/Cargo.toml | 10 +- .../outbound-queue/merkle-tree/README.md | 4 + .../outbound-queue/runtime-api/Cargo.toml | 10 +- .../outbound-queue/runtime-api/README.md | 6 + .../pallets/outbound-queue/src/lib.rs | 4 +- .../pallets/outbound-queue/src/test.rs | 4 +- .../pallets/outbound-queue/src/weights.rs | 6 +- .../parachain/pallets/system/Cargo.toml | 20 ++- .../parachain/pallets/system/README.md | 4 +- .../pallets/system/runtime-api/Cargo.toml | 10 +- .../pallets/system/runtime-api/README.md | 3 + .../parachain/pallets/system/src/lib.rs | 2 + .../parachain/pallets/system/src/mock.rs | 4 +- .../parachain/primitives/beacon/Cargo.toml | 9 +- .../parachain/primitives/beacon/README.md | 10 ++ .../parachain/primitives/core/Cargo.toml | 9 +- .../parachain/primitives/core/README.md | 4 + .../parachain/primitives/ethereum/Cargo.toml | 9 +- .../parachain/primitives/ethereum/README.md | 4 + .../parachain/primitives/router/Cargo.toml | 9 +- .../parachain/primitives/router/README.md | 4 + .../runtime/rococo-common/Cargo.toml | 26 --- .../runtime/rococo-common/src/lib.rs | 16 -- .../runtime/runtime-common/Cargo.toml | 9 +- .../runtime/runtime-common/README.md | 3 + .../runtime/{tests => test-common}/Cargo.toml | 81 ++------- .../parachain/runtime/test-common/README.md | 3 + .../test_cases.rs => test-common/src/lib.rs} | 49 +++--- .../snowbridge/parachain/scripts/benchmark.sh | 4 +- .../parachain/scripts/verify-pallets-build.sh | 26 +-- cumulus/parachains/common/src/rococo.rs | 16 ++ .../bridges/bridge-hub-rococo/Cargo.toml | 6 +- .../bridges/bridge-hub-rococo/Cargo.toml | 7 +- .../bridge-hub-rococo/src/tests/snowbridge.rs | 15 +- .../assets/asset-hub-rococo/Cargo.toml | 3 - .../assets/asset-hub-rococo/src/lib.rs | 2 +- .../assets/asset-hub-rococo/src/xcm_config.rs | 4 +- .../bridge-hubs/bridge-hub-rococo/Cargo.toml | 39 ++--- .../src/bridge_to_ethereum_config.rs | 4 +- .../bridge-hubs/bridge-hub-rococo/src/lib.rs | 107 +++++++----- .../bridge-hub-rococo/src/weights/mod.rs | 8 +- ...s => snowbridge_pallet_ethereum_client.rs} | 6 +- ....rs => snowbridge_pallet_inbound_queue.rs} | 6 +- ...rs => snowbridge_pallet_outbound_queue.rs} | 2 +- ..._system.rs => snowbridge_pallet_system.rs} | 6 +- .../bridge-hub-rococo/src/xcm_config.rs | 29 +--- .../bridge-hub-rococo/tests/snowbridge.rs | 43 +++-- .../bridge-hubs/common/src/message_queue.rs | 2 +- .../runtimes/testing/penpal/Cargo.toml | 3 - .../runtimes/testing/penpal/src/xcm_config.rs | 2 +- 88 files changed, 579 insertions(+), 490 deletions(-) rename bridges/snowbridge/parachain/pallets/{ethereum-beacon-client => ethereum-client}/Cargo.toml (93%) create mode 100644 bridges/snowbridge/parachain/pallets/ethereum-client/README.md rename bridges/snowbridge/parachain/pallets/{ethereum-beacon-client => ethereum-client}/benchmark.md (88%) rename bridges/snowbridge/parachain/pallets/{ethereum-beacon-client => ethereum-client}/src/benchmarking/fixtures_mainnet.rs (100%) rename bridges/snowbridge/parachain/pallets/{ethereum-beacon-client => ethereum-client}/src/benchmarking/fixtures_minimal.rs (100%) rename bridges/snowbridge/parachain/pallets/{ethereum-beacon-client => ethereum-client}/src/benchmarking/mod.rs (100%) rename bridges/snowbridge/parachain/pallets/{ethereum-beacon-client => ethereum-client}/src/benchmarking/util.rs (100%) rename bridges/snowbridge/parachain/pallets/{ethereum-beacon-client => ethereum-client}/src/config/mainnet.rs (100%) rename bridges/snowbridge/parachain/pallets/{ethereum-beacon-client => ethereum-client}/src/config/minimal.rs (100%) rename bridges/snowbridge/parachain/pallets/{ethereum-beacon-client => ethereum-client}/src/config/mod.rs (100%) rename bridges/snowbridge/parachain/pallets/{ethereum-beacon-client => ethereum-client}/src/functions.rs (100%) rename bridges/snowbridge/parachain/pallets/{ethereum-beacon-client => ethereum-client}/src/impls.rs (91%) rename bridges/snowbridge/parachain/pallets/{ethereum-beacon-client => ethereum-client}/src/lib.rs (99%) rename bridges/snowbridge/parachain/pallets/{ethereum-beacon-client => ethereum-client}/src/mock.rs (92%) rename bridges/snowbridge/parachain/pallets/{ethereum-beacon-client => ethereum-client}/src/tests.rs (100%) rename bridges/snowbridge/parachain/pallets/{ethereum-beacon-client => ethereum-client}/src/types.rs (100%) rename bridges/snowbridge/parachain/pallets/{ethereum-beacon-client => ethereum-client}/src/weights.rs (97%) rename bridges/snowbridge/parachain/pallets/{ethereum-beacon-client => ethereum-client}/tests/fixtures/execution-header-update.mainnet.json (100%) rename bridges/snowbridge/parachain/pallets/{ethereum-beacon-client => ethereum-client}/tests/fixtures/execution-header-update.minimal.json (100%) rename bridges/snowbridge/parachain/pallets/{ethereum-beacon-client => ethereum-client}/tests/fixtures/finalized-header-update.mainnet.json (100%) rename bridges/snowbridge/parachain/pallets/{ethereum-beacon-client => ethereum-client}/tests/fixtures/finalized-header-update.minimal.json (100%) rename bridges/snowbridge/parachain/pallets/{ethereum-beacon-client => ethereum-client}/tests/fixtures/initial-checkpoint.mainnet.json (100%) rename bridges/snowbridge/parachain/pallets/{ethereum-beacon-client => ethereum-client}/tests/fixtures/initial-checkpoint.minimal.json (100%) rename bridges/snowbridge/parachain/pallets/{ethereum-beacon-client => ethereum-client}/tests/fixtures/next-finalized-header-update.mainnet.json (100%) rename bridges/snowbridge/parachain/pallets/{ethereum-beacon-client => ethereum-client}/tests/fixtures/next-finalized-header-update.minimal.json (100%) rename bridges/snowbridge/parachain/pallets/{ethereum-beacon-client => ethereum-client}/tests/fixtures/next-sync-committee-update.mainnet.json (100%) rename bridges/snowbridge/parachain/pallets/{ethereum-beacon-client => ethereum-client}/tests/fixtures/next-sync-committee-update.minimal.json (100%) rename bridges/snowbridge/parachain/pallets/{ethereum-beacon-client => ethereum-client}/tests/fixtures/sync-committee-update.mainnet.json (100%) rename bridges/snowbridge/parachain/pallets/{ethereum-beacon-client => ethereum-client}/tests/fixtures/sync-committee-update.minimal.json (100%) create mode 100644 bridges/snowbridge/parachain/pallets/inbound-queue/README.md create mode 100644 bridges/snowbridge/parachain/pallets/outbound-queue/README.md create mode 100644 bridges/snowbridge/parachain/pallets/outbound-queue/merkle-tree/README.md create mode 100644 bridges/snowbridge/parachain/pallets/outbound-queue/runtime-api/README.md create mode 100644 bridges/snowbridge/parachain/pallets/system/runtime-api/README.md create mode 100644 bridges/snowbridge/parachain/primitives/beacon/README.md create mode 100644 bridges/snowbridge/parachain/primitives/core/README.md create mode 100644 bridges/snowbridge/parachain/primitives/ethereum/README.md create mode 100644 bridges/snowbridge/parachain/primitives/router/README.md delete mode 100644 bridges/snowbridge/parachain/runtime/rococo-common/Cargo.toml delete mode 100644 bridges/snowbridge/parachain/runtime/rococo-common/src/lib.rs create mode 100644 bridges/snowbridge/parachain/runtime/runtime-common/README.md rename bridges/snowbridge/parachain/runtime/{tests => test-common}/Cargo.toml (78%) create mode 100644 bridges/snowbridge/parachain/runtime/test-common/README.md rename bridges/snowbridge/parachain/runtime/{tests/src/test_cases.rs => test-common/src/lib.rs} (88%) rename cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/{snowbridge_ethereum_beacon_client.rs => snowbridge_pallet_ethereum_client.rs} (97%) rename cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/{snowbridge_inbound_queue.rs => snowbridge_pallet_inbound_queue.rs} (92%) rename cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/{snowbridge_outbound_queue.rs => snowbridge_pallet_outbound_queue.rs} (97%) rename cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/{snowbridge_system.rs => snowbridge_pallet_system.rs} (98%) rename bridges/snowbridge/parachain/runtime/tests/src/lib.rs => cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/snowbridge.rs (55%) diff --git a/Cargo.lock b/Cargo.lock index 6ac2fe567f9..13b90eafa75 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -907,7 +907,6 @@ dependencies = [ "rococo-runtime-constants", "scale-info", "smallvec", - "snowbridge-rococo-common", "snowbridge-router-primitives", "sp-api", "sp-block-builder", @@ -1952,10 +1951,10 @@ dependencies = [ "parachains-common", "serde_json", "snowbridge-core", - "snowbridge-inbound-queue", - "snowbridge-outbound-queue", + "snowbridge-pallet-inbound-queue", + "snowbridge-pallet-outbound-queue", + "snowbridge-pallet-system", "snowbridge-router-primitives", - "snowbridge-system", "sp-core", "sp-runtime", ] @@ -1986,11 +1985,10 @@ dependencies = [ "rococo-westend-system-emulated-network", "scale-info", "snowbridge-core", - "snowbridge-inbound-queue", - "snowbridge-outbound-queue", - "snowbridge-rococo-common", + "snowbridge-pallet-inbound-queue", + "snowbridge-pallet-outbound-queue", + "snowbridge-pallet-system", "snowbridge-router-primitives", - "snowbridge-system", "sp-core", "sp-runtime", "staging-xcm", @@ -2063,14 +2061,14 @@ dependencies = [ "smallvec", "snowbridge-beacon-primitives", "snowbridge-core", - "snowbridge-ethereum-beacon-client", - "snowbridge-inbound-queue", - "snowbridge-outbound-queue", "snowbridge-outbound-queue-runtime-api", - "snowbridge-rococo-common", + "snowbridge-pallet-ethereum-client", + "snowbridge-pallet-inbound-queue", + "snowbridge-pallet-outbound-queue", + "snowbridge-pallet-system", "snowbridge-router-primitives", "snowbridge-runtime-common", - "snowbridge-system", + "snowbridge-runtime-test-common", "snowbridge-system-runtime-api", "sp-api", "sp-block-builder", @@ -11677,7 +11675,6 @@ dependencies = [ "polkadot-runtime-common", "scale-info", "smallvec", - "snowbridge-rococo-common", "sp-api", "sp-block-builder", "sp-consensus-aura", @@ -17564,7 +17561,7 @@ dependencies = [ [[package]] name = "snowbridge-beacon-primitives" -version = "0.0.1" +version = "0.9.0" dependencies = [ "byte-slice-cast", "frame-support", @@ -17588,7 +17585,7 @@ dependencies = [ [[package]] name = "snowbridge-core" -version = "0.1.1" +version = "0.9.0" dependencies = [ "ethabi-decode", "frame-support", @@ -17611,7 +17608,7 @@ dependencies = [ [[package]] name = "snowbridge-ethereum" -version = "0.1.0" +version = "0.9.0" dependencies = [ "ethabi-decode", "ethbloom", @@ -17634,8 +17631,36 @@ dependencies = [ ] [[package]] -name = "snowbridge-ethereum-beacon-client" -version = "0.0.1" +name = "snowbridge-outbound-queue-merkle-tree" +version = "0.9.0" +dependencies = [ + "array-bytes 4.2.0", + "env_logger 0.9.3", + "hex", + "hex-literal", + "parity-scale-codec", + "scale-info", + "sp-core", + "sp-runtime", +] + +[[package]] +name = "snowbridge-outbound-queue-runtime-api" +version = "0.9.0" +dependencies = [ + "frame-support", + "parity-scale-codec", + "snowbridge-core", + "snowbridge-outbound-queue-merkle-tree", + "sp-api", + "sp-core", + "sp-std 8.0.0", + "staging-xcm", +] + +[[package]] +name = "snowbridge-pallet-ethereum-client" +version = "0.9.0" dependencies = [ "bp-runtime", "byte-slice-cast", @@ -17665,8 +17690,8 @@ dependencies = [ ] [[package]] -name = "snowbridge-inbound-queue" -version = "0.1.1" +name = "snowbridge-pallet-inbound-queue" +version = "0.9.0" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -17684,7 +17709,7 @@ dependencies = [ "snowbridge-beacon-primitives", "snowbridge-core", "snowbridge-ethereum", - "snowbridge-ethereum-beacon-client", + "snowbridge-pallet-ethereum-client", "snowbridge-router-primitives", "sp-core", "sp-io", @@ -17693,11 +17718,12 @@ dependencies = [ "sp-std 8.0.0", "staging-xcm", "staging-xcm-builder", + "staging-xcm-executor", ] [[package]] -name = "snowbridge-outbound-queue" -version = "0.1.1" +name = "snowbridge-pallet-outbound-queue" +version = "0.9.0" dependencies = [ "bridge-hub-common", "ethabi-decode", @@ -17721,45 +17747,36 @@ dependencies = [ ] [[package]] -name = "snowbridge-outbound-queue-merkle-tree" -version = "0.1.1" +name = "snowbridge-pallet-system" +version = "0.9.0" dependencies = [ - "array-bytes 4.2.0", - "env_logger 0.9.3", + "ethabi-decode", + "frame-benchmarking", + "frame-support", + "frame-system", "hex", "hex-literal", + "log", + "pallet-balances", + "pallet-message-queue", "parity-scale-codec", + "polkadot-primitives", "scale-info", - "sp-core", - "sp-runtime", -] - -[[package]] -name = "snowbridge-outbound-queue-runtime-api" -version = "0.1.0" -dependencies = [ - "frame-support", - "parity-scale-codec", "snowbridge-core", - "snowbridge-outbound-queue-merkle-tree", - "sp-api", + "snowbridge-pallet-outbound-queue", "sp-core", + "sp-io", + "sp-keyring", + "sp-runtime", "sp-std 8.0.0", "staging-xcm", -] - -[[package]] -name = "snowbridge-rococo-common" -version = "0.0.1" -dependencies = [ - "frame-support", - "log", - "staging-xcm", + "staging-xcm-builder", + "staging-xcm-executor", ] [[package]] name = "snowbridge-router-primitives" -version = "0.1.1" +version = "0.9.0" dependencies = [ "ethabi-decode", "frame-support", @@ -17782,7 +17799,7 @@ dependencies = [ [[package]] name = "snowbridge-runtime-common" -version = "0.1.1" +version = "0.9.0" dependencies = [ "frame-support", "frame-system", @@ -17795,12 +17812,10 @@ dependencies = [ ] [[package]] -name = "snowbridge-runtime-tests" -version = "0.1.0" +name = "snowbridge-runtime-test-common" +version = "0.9.0" dependencies = [ - "asset-hub-rococo-runtime", "assets-common", - "bridge-hub-rococo-runtime", "bridge-hub-test-utils", "bridge-runtime-common", "cumulus-pallet-aura-ext", @@ -17839,18 +17854,17 @@ dependencies = [ "polkadot-core-primitives", "polkadot-parachain-primitives", "polkadot-runtime-common", - "rococo-runtime-constants", "scale-info", "serde", "smallvec", "snowbridge-beacon-primitives", "snowbridge-core", - "snowbridge-ethereum-beacon-client", - "snowbridge-inbound-queue", - "snowbridge-outbound-queue", "snowbridge-outbound-queue-runtime-api", + "snowbridge-pallet-ethereum-client", + "snowbridge-pallet-inbound-queue", + "snowbridge-pallet-outbound-queue", + "snowbridge-pallet-system", "snowbridge-router-primitives", - "snowbridge-system", "snowbridge-system-runtime-api", "sp-api", "sp-block-builder", @@ -17874,37 +17888,9 @@ dependencies = [ "static_assertions", ] -[[package]] -name = "snowbridge-system" -version = "0.1.1" -dependencies = [ - "ethabi-decode", - "frame-benchmarking", - "frame-support", - "frame-system", - "hex", - "hex-literal", - "log", - "pallet-balances", - "pallet-message-queue", - "parity-scale-codec", - "polkadot-primitives", - "scale-info", - "snowbridge-core", - "snowbridge-outbound-queue", - "sp-core", - "sp-io", - "sp-keyring", - "sp-runtime", - "sp-std 8.0.0", - "staging-xcm", - "staging-xcm-builder", - "staging-xcm-executor", -] - [[package]] name = "snowbridge-system-runtime-api" -version = "0.1.0" +version = "0.9.0" dependencies = [ "parity-scale-codec", "snowbridge-core", diff --git a/Cargo.toml b/Cargo.toml index 231aab8dee9..38cae6f640c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,7 +36,7 @@ members = [ "bridges/primitives/test-utils", "bridges/primitives/xcm-bridge-hub", "bridges/primitives/xcm-bridge-hub-router", - "bridges/snowbridge/parachain/pallets/ethereum-beacon-client", + "bridges/snowbridge/parachain/pallets/ethereum-client", "bridges/snowbridge/parachain/pallets/inbound-queue", "bridges/snowbridge/parachain/pallets/outbound-queue", "bridges/snowbridge/parachain/pallets/outbound-queue/merkle-tree", @@ -47,9 +47,8 @@ members = [ "bridges/snowbridge/parachain/primitives/core", "bridges/snowbridge/parachain/primitives/ethereum", "bridges/snowbridge/parachain/primitives/router", - "bridges/snowbridge/parachain/runtime/rococo-common", "bridges/snowbridge/parachain/runtime/runtime-common", - "bridges/snowbridge/parachain/runtime/tests", + "bridges/snowbridge/parachain/runtime/test-common", "cumulus/client/cli", "cumulus/client/collator", "cumulus/client/consensus/aura", diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/Cargo.toml b/bridges/snowbridge/parachain/pallets/ethereum-client/Cargo.toml similarity index 93% rename from bridges/snowbridge/parachain/pallets/ethereum-beacon-client/Cargo.toml rename to bridges/snowbridge/parachain/pallets/ethereum-client/Cargo.toml index 9f8749c89da..59efcf91fd0 100644 --- a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/Cargo.toml +++ b/bridges/snowbridge/parachain/pallets/ethereum-client/Cargo.toml @@ -1,11 +1,15 @@ [package] -name = "snowbridge-ethereum-beacon-client" -description = "Snowbridge Beacon Client Pallet" -version = "0.0.1" -edition = "2021" +name = "snowbridge-pallet-ethereum-client" +description = "Snowbridge Ethereum Client Pallet" +version = "0.9.0" authors = ["Snowfork "] -repository = "https://github.com/Snowfork/snowbridge" +edition.workspace = true +repository.workspace = true license = "Apache-2.0" +categories = ["cryptography::cryptocurrencies"] + +[lints] +workspace = true [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/bridges/snowbridge/parachain/pallets/ethereum-client/README.md b/bridges/snowbridge/parachain/pallets/ethereum-client/README.md new file mode 100644 index 00000000000..0cd3b9f8558 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/ethereum-client/README.md @@ -0,0 +1,3 @@ +# Ethereum Beacon Client + +The Ethereum Beacon Client is an on-chain light client that tracks Ethereum consensus using the beacon chain. diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/benchmark.md b/bridges/snowbridge/parachain/pallets/ethereum-client/benchmark.md similarity index 88% rename from bridges/snowbridge/parachain/pallets/ethereum-beacon-client/benchmark.md rename to bridges/snowbridge/parachain/pallets/ethereum-client/benchmark.md index de976e12149..2e19fece7cb 100644 --- a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/benchmark.md +++ b/bridges/snowbridge/parachain/pallets/ethereum-client/benchmark.md @@ -7,15 +7,15 @@ for it is super helpful. # Benchmark We add several benchmarks -[here](https://github.com/Snowfork/snowbridge/blob/8891ca3cdcf2e04d8118c206588c956541ae4710/parachain/pallets/ethereum-beacon-client/src/benchmarking/mod.rs#L98-L124) +[here](https://github.com/Snowfork/snowbridge/blob/8891ca3cdcf2e04d8118c206588c956541ae4710/parachain/pallets/ethereum-client/src/benchmarking/mod.rs#L98-L124) as following to demonstrate -[bls_fast_aggregate_verify](https://github.com/Snowfork/snowbridge/blob/8891ca3cdcf2e04d8118c206588c956541ae4710/parachain/pallets/ethereum-beacon-client/src/lib.rs#L764) +[bls_fast_aggregate_verify](https://github.com/Snowfork/snowbridge/blob/8891ca3cdcf2e04d8118c206588c956541ae4710/parachain/pallets/ethereum-client/src/lib.rs#L764) is the main bottleneck. Test data -[here](https://github.com/Snowfork/snowbridge/blob/8891ca3cdcf2e04d8118c206588c956541ae4710/parachain/pallets/ethereum-beacon-client/src/benchmarking/data_mainnet.rs#L553-L1120) +[here](https://github.com/Snowfork/snowbridge/blob/8891ca3cdcf2e04d8118c206588c956541ae4710/parachain/pallets/ethereum-client/src/benchmarking/data_mainnet.rs#L553-L1120) is real from goerli network which contains 512 public keys from sync committee. ## sync_committee_period_update -Base line benchmark for extrinsic [sync_committee_period_update](https://github.com/Snowfork/snowbridge/blob/8891ca3cdcf2e04d8118c206588c956541ae4710/parachain/pallets/ethereum-beacon-client/src/lib.rs#L233) +Base line benchmark for extrinsic [sync_committee_period_update](https://github.com/Snowfork/snowbridge/blob/8891ca3cdcf2e04d8118c206588c956541ae4710/parachain/pallets/ethereum-client/src/lib.rs#L233) ## bls_fast_aggregate_verify Subfunction of extrinsic `sync_committee_period_update` which does what @@ -59,14 +59,14 @@ cargo run --release --bin polkadot-parachain \ benchmark pallet \ --base-path /mnt/scratch/benchmark \ --chain=bridge-hub-rococo-dev \ ---pallet=snowbridge_ethereum_beacon_client \ +--pallet=snowbridge_pallet_ethereum_client \ --extrinsic="*" \ --execution=wasm --wasm-execution=compiled \ --steps 50 --repeat 20 \ ---output ./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_ethereum_beacon_client.rs +--output ./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_pallet_ethereum_client.rs ``` -### [Weights](https://github.com/Snowfork/cumulus/blob/ron/benchmark-beacon-bridge/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_ethereum_beacon_client.rs) +### [Weights](https://github.com/Snowfork/cumulus/blob/ron/benchmark-beacon-bridge/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_pallet_ethereum_client.rs) |extrinsic | minimum execution time benchmarked(us) | | --------------------------------------- |----------------------------------------| @@ -84,5 +84,5 @@ benchmark pallet \ # Conclusion A high level host function specific for -[bls_fast_aggregate_verify](https://github.com/Snowfork/snowbridge/blob/8891ca3cdcf2e04d8118c206588c956541ae4710/parachain/pallets/ethereum-beacon-client/src/lib.rs#L764) +[bls_fast_aggregate_verify](https://github.com/Snowfork/snowbridge/blob/8891ca3cdcf2e04d8118c206588c956541ae4710/parachain/pallets/ethereum-client/src/lib.rs#L764) is super helpful. diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/benchmarking/fixtures_mainnet.rs b/bridges/snowbridge/parachain/pallets/ethereum-client/src/benchmarking/fixtures_mainnet.rs similarity index 100% rename from bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/benchmarking/fixtures_mainnet.rs rename to bridges/snowbridge/parachain/pallets/ethereum-client/src/benchmarking/fixtures_mainnet.rs diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/benchmarking/fixtures_minimal.rs b/bridges/snowbridge/parachain/pallets/ethereum-client/src/benchmarking/fixtures_minimal.rs similarity index 100% rename from bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/benchmarking/fixtures_minimal.rs rename to bridges/snowbridge/parachain/pallets/ethereum-client/src/benchmarking/fixtures_minimal.rs diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/benchmarking/mod.rs b/bridges/snowbridge/parachain/pallets/ethereum-client/src/benchmarking/mod.rs similarity index 100% rename from bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/benchmarking/mod.rs rename to bridges/snowbridge/parachain/pallets/ethereum-client/src/benchmarking/mod.rs diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/benchmarking/util.rs b/bridges/snowbridge/parachain/pallets/ethereum-client/src/benchmarking/util.rs similarity index 100% rename from bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/benchmarking/util.rs rename to bridges/snowbridge/parachain/pallets/ethereum-client/src/benchmarking/util.rs diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/config/mainnet.rs b/bridges/snowbridge/parachain/pallets/ethereum-client/src/config/mainnet.rs similarity index 100% rename from bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/config/mainnet.rs rename to bridges/snowbridge/parachain/pallets/ethereum-client/src/config/mainnet.rs diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/config/minimal.rs b/bridges/snowbridge/parachain/pallets/ethereum-client/src/config/minimal.rs similarity index 100% rename from bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/config/minimal.rs rename to bridges/snowbridge/parachain/pallets/ethereum-client/src/config/minimal.rs diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/config/mod.rs b/bridges/snowbridge/parachain/pallets/ethereum-client/src/config/mod.rs similarity index 100% rename from bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/config/mod.rs rename to bridges/snowbridge/parachain/pallets/ethereum-client/src/config/mod.rs diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/functions.rs b/bridges/snowbridge/parachain/pallets/ethereum-client/src/functions.rs similarity index 100% rename from bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/functions.rs rename to bridges/snowbridge/parachain/pallets/ethereum-client/src/functions.rs diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/impls.rs b/bridges/snowbridge/parachain/pallets/ethereum-client/src/impls.rs similarity index 91% rename from bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/impls.rs rename to bridges/snowbridge/parachain/pallets/ethereum-client/src/impls.rs index 7e72b12631c..300431d8770 100644 --- a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/impls.rs +++ b/bridges/snowbridge/parachain/pallets/ethereum-client/src/impls.rs @@ -15,7 +15,7 @@ impl Verifier for Pallet { /// ancestor of a finalized beacon block. fn verify(event_log: &Log, proof: &Proof) -> Result<(), VerificationError> { log::info!( - target: "ethereum-beacon-client", + target: "ethereum-client", "💫 Verifying message with block hash {}", proof.block_hash, ); @@ -26,7 +26,7 @@ impl Verifier for Pallet { Ok(receipt) => receipt, Err(err) => { log::error!( - target: "ethereum-beacon-client", + target: "ethereum-client", "💫 Verification of receipt inclusion failed for block {}: {:?}", proof.block_hash, err @@ -36,7 +36,7 @@ impl Verifier for Pallet { }; log::trace!( - target: "ethereum-beacon-client", + target: "ethereum-client", "💫 Verified receipt inclusion for transaction at index {} in block {}", proof.tx_index, proof.block_hash, ); @@ -52,7 +52,7 @@ impl Verifier for Pallet { if !receipt.contains_log(&event_log) { log::error!( - target: "ethereum-beacon-client", + target: "ethereum-client", "💫 Event log not found in receipt for transaction at index {} in block {}", proof.tx_index, proof.block_hash, ); @@ -60,7 +60,7 @@ impl Verifier for Pallet { } log::info!( - target: "ethereum-beacon-client", + target: "ethereum-client", "💫 Receipt verification successful for {}", proof.block_hash, ); @@ -82,7 +82,7 @@ impl Pallet { Ok(receipt) => Ok(receipt), Err(err) => { log::trace!( - target: "ethereum-beacon-client", + target: "ethereum-client", "💫 Failed to decode transaction receipt: {}", err ); diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/lib.rs b/bridges/snowbridge/parachain/pallets/ethereum-client/src/lib.rs similarity index 99% rename from bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/lib.rs rename to bridges/snowbridge/parachain/pallets/ethereum-client/src/lib.rs index 53877ea58fe..c99458441a5 100644 --- a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/lib.rs +++ b/bridges/snowbridge/parachain/pallets/ethereum-client/src/lib.rs @@ -61,7 +61,7 @@ pub use pallet::*; pub use config::SLOTS_PER_HISTORICAL_ROOT; -pub const LOG_TARGET: &str = "ethereum-beacon-client"; +pub const LOG_TARGET: &str = "ethereum-client"; #[frame_support::pallet] pub mod pallet { @@ -692,7 +692,7 @@ pub mod pallet { /// Stores the provided execution header in pallet storage. The header is stored /// in a ring buffer map, with the block hash as map key. The last imported execution /// header is also kept in storage, for the relayer to check import progress. - pub(crate) fn store_execution_header( + pub fn store_execution_header( block_hash: H256, header: CompactExecutionHeader, beacon_slot: u64, diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/mock.rs b/bridges/snowbridge/parachain/pallets/ethereum-client/src/mock.rs similarity index 92% rename from bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/mock.rs rename to bridges/snowbridge/parachain/pallets/ethereum-client/src/mock.rs index b25e8b0e813..217d37db8df 100644 --- a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/mock.rs +++ b/bridges/snowbridge/parachain/pallets/ethereum-client/src/mock.rs @@ -11,6 +11,11 @@ use sp_core::H256; use sp_runtime::traits::{BlakeTwo256, IdentityLookup}; use std::{fs::File, path::PathBuf}; +#[cfg(feature = "beacon-spec-minimal")] +const SPEC: &str = "minimal"; +#[cfg(not(feature = "beacon-spec-minimal"))] +const SPEC: &str = "mainnet"; + fn load_fixture(basename: String) -> Result where T: for<'de> serde::Deserialize<'de>, @@ -21,60 +26,36 @@ where } pub fn load_execution_header_update_fixture() -> primitives::ExecutionHeaderUpdate { - #[cfg(feature = "beacon-spec-minimal")] - const SPEC: &str = "minimal"; - #[cfg(not(feature = "beacon-spec-minimal"))] - const SPEC: &str = "mainnet"; let basename = format!("execution-header-update.{}.json", SPEC); load_fixture(basename).unwrap() } pub fn load_checkpoint_update_fixture( ) -> primitives::CheckpointUpdate<{ config::SYNC_COMMITTEE_SIZE }> { - #[cfg(feature = "beacon-spec-minimal")] - const SPEC: &str = "minimal"; - #[cfg(not(feature = "beacon-spec-minimal"))] - const SPEC: &str = "mainnet"; let basename = format!("initial-checkpoint.{}.json", SPEC); load_fixture(basename).unwrap() } pub fn load_sync_committee_update_fixture( ) -> primitives::Update<{ config::SYNC_COMMITTEE_SIZE }, { config::SYNC_COMMITTEE_BITS_SIZE }> { - #[cfg(feature = "beacon-spec-minimal")] - const SPEC: &str = "minimal"; - #[cfg(not(feature = "beacon-spec-minimal"))] - const SPEC: &str = "mainnet"; let basename = format!("sync-committee-update.{}.json", SPEC); load_fixture(basename).unwrap() } pub fn load_finalized_header_update_fixture( ) -> primitives::Update<{ config::SYNC_COMMITTEE_SIZE }, { config::SYNC_COMMITTEE_BITS_SIZE }> { - #[cfg(feature = "beacon-spec-minimal")] - const SPEC: &str = "minimal"; - #[cfg(not(feature = "beacon-spec-minimal"))] - const SPEC: &str = "mainnet"; let basename = format!("finalized-header-update.{}.json", SPEC); load_fixture(basename).unwrap() } pub fn load_next_sync_committee_update_fixture( ) -> primitives::Update<{ config::SYNC_COMMITTEE_SIZE }, { config::SYNC_COMMITTEE_BITS_SIZE }> { - #[cfg(feature = "beacon-spec-minimal")] - const SPEC: &str = "minimal"; - #[cfg(not(feature = "beacon-spec-minimal"))] - const SPEC: &str = "mainnet"; let basename = format!("next-sync-committee-update.{}.json", SPEC); load_fixture(basename).unwrap() } pub fn load_next_finalized_header_update_fixture( ) -> primitives::Update<{ config::SYNC_COMMITTEE_SIZE }, { config::SYNC_COMMITTEE_BITS_SIZE }> { - #[cfg(feature = "beacon-spec-minimal")] - const SPEC: &str = "minimal"; - #[cfg(not(feature = "beacon-spec-minimal"))] - const SPEC: &str = "mainnet"; let basename = format!("next-finalized-header-update.{}.json", SPEC); load_fixture(basename).unwrap() } diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/tests.rs b/bridges/snowbridge/parachain/pallets/ethereum-client/src/tests.rs similarity index 100% rename from bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/tests.rs rename to bridges/snowbridge/parachain/pallets/ethereum-client/src/tests.rs diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/types.rs b/bridges/snowbridge/parachain/pallets/ethereum-client/src/types.rs similarity index 100% rename from bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/types.rs rename to bridges/snowbridge/parachain/pallets/ethereum-client/src/types.rs diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/weights.rs b/bridges/snowbridge/parachain/pallets/ethereum-client/src/weights.rs similarity index 97% rename from bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/weights.rs rename to bridges/snowbridge/parachain/pallets/ethereum-client/src/weights.rs index 69d3e809986..e1a5578f466 100644 --- a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/src/weights.rs +++ b/bridges/snowbridge/parachain/pallets/ethereum-client/src/weights.rs @@ -20,7 +20,7 @@ // --repeat // 10 // --output -// pallets/ethereum-beacon-client/src/weights.rs +// pallets/ethereum-client/src/weights.rs // --template // templates/module-weight-template.hbs diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/execution-header-update.mainnet.json b/bridges/snowbridge/parachain/pallets/ethereum-client/tests/fixtures/execution-header-update.mainnet.json similarity index 100% rename from bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/execution-header-update.mainnet.json rename to bridges/snowbridge/parachain/pallets/ethereum-client/tests/fixtures/execution-header-update.mainnet.json diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/execution-header-update.minimal.json b/bridges/snowbridge/parachain/pallets/ethereum-client/tests/fixtures/execution-header-update.minimal.json similarity index 100% rename from bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/execution-header-update.minimal.json rename to bridges/snowbridge/parachain/pallets/ethereum-client/tests/fixtures/execution-header-update.minimal.json diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/finalized-header-update.mainnet.json b/bridges/snowbridge/parachain/pallets/ethereum-client/tests/fixtures/finalized-header-update.mainnet.json similarity index 100% rename from bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/finalized-header-update.mainnet.json rename to bridges/snowbridge/parachain/pallets/ethereum-client/tests/fixtures/finalized-header-update.mainnet.json diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/finalized-header-update.minimal.json b/bridges/snowbridge/parachain/pallets/ethereum-client/tests/fixtures/finalized-header-update.minimal.json similarity index 100% rename from bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/finalized-header-update.minimal.json rename to bridges/snowbridge/parachain/pallets/ethereum-client/tests/fixtures/finalized-header-update.minimal.json diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/initial-checkpoint.mainnet.json b/bridges/snowbridge/parachain/pallets/ethereum-client/tests/fixtures/initial-checkpoint.mainnet.json similarity index 100% rename from bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/initial-checkpoint.mainnet.json rename to bridges/snowbridge/parachain/pallets/ethereum-client/tests/fixtures/initial-checkpoint.mainnet.json diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/initial-checkpoint.minimal.json b/bridges/snowbridge/parachain/pallets/ethereum-client/tests/fixtures/initial-checkpoint.minimal.json similarity index 100% rename from bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/initial-checkpoint.minimal.json rename to bridges/snowbridge/parachain/pallets/ethereum-client/tests/fixtures/initial-checkpoint.minimal.json diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/next-finalized-header-update.mainnet.json b/bridges/snowbridge/parachain/pallets/ethereum-client/tests/fixtures/next-finalized-header-update.mainnet.json similarity index 100% rename from bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/next-finalized-header-update.mainnet.json rename to bridges/snowbridge/parachain/pallets/ethereum-client/tests/fixtures/next-finalized-header-update.mainnet.json diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/next-finalized-header-update.minimal.json b/bridges/snowbridge/parachain/pallets/ethereum-client/tests/fixtures/next-finalized-header-update.minimal.json similarity index 100% rename from bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/next-finalized-header-update.minimal.json rename to bridges/snowbridge/parachain/pallets/ethereum-client/tests/fixtures/next-finalized-header-update.minimal.json diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/next-sync-committee-update.mainnet.json b/bridges/snowbridge/parachain/pallets/ethereum-client/tests/fixtures/next-sync-committee-update.mainnet.json similarity index 100% rename from bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/next-sync-committee-update.mainnet.json rename to bridges/snowbridge/parachain/pallets/ethereum-client/tests/fixtures/next-sync-committee-update.mainnet.json diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/next-sync-committee-update.minimal.json b/bridges/snowbridge/parachain/pallets/ethereum-client/tests/fixtures/next-sync-committee-update.minimal.json similarity index 100% rename from bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/next-sync-committee-update.minimal.json rename to bridges/snowbridge/parachain/pallets/ethereum-client/tests/fixtures/next-sync-committee-update.minimal.json diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/sync-committee-update.mainnet.json b/bridges/snowbridge/parachain/pallets/ethereum-client/tests/fixtures/sync-committee-update.mainnet.json similarity index 100% rename from bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/sync-committee-update.mainnet.json rename to bridges/snowbridge/parachain/pallets/ethereum-client/tests/fixtures/sync-committee-update.mainnet.json diff --git a/bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/sync-committee-update.minimal.json b/bridges/snowbridge/parachain/pallets/ethereum-client/tests/fixtures/sync-committee-update.minimal.json similarity index 100% rename from bridges/snowbridge/parachain/pallets/ethereum-beacon-client/tests/fixtures/sync-committee-update.minimal.json rename to bridges/snowbridge/parachain/pallets/ethereum-client/tests/fixtures/sync-committee-update.minimal.json diff --git a/bridges/snowbridge/parachain/pallets/inbound-queue/Cargo.toml b/bridges/snowbridge/parachain/pallets/inbound-queue/Cargo.toml index 6a5ea6f8222..f645b4224d1 100644 --- a/bridges/snowbridge/parachain/pallets/inbound-queue/Cargo.toml +++ b/bridges/snowbridge/parachain/pallets/inbound-queue/Cargo.toml @@ -1,11 +1,15 @@ [package] -name = "snowbridge-inbound-queue" -description = "Snowbridge Inbound Queue" -version = "0.1.1" -edition = "2021" +name = "snowbridge-pallet-inbound-queue" +description = "Snowbridge Inbound Queue Pallet" +version = "0.9.0" authors = ["Snowfork "] -repository = "https://github.com/Snowfork/snowbridge" +edition.workspace = true +repository.workspace = true license = "Apache-2.0" +categories = ["cryptography::cryptocurrencies"] + +[lints] +workspace = true [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] @@ -32,6 +36,7 @@ sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-fea xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } xcm-builder = { package = "staging-xcm-builder", path = "../../../../../polkadot/xcm/xcm-builder", default-features = false } +xcm-executor = { package = "staging-xcm-executor", path = "../../../../../polkadot/xcm/xcm-executor", default-features = false } snowbridge-core = { path = "../../primitives/core", default-features = false } snowbridge-ethereum = { path = "../../primitives/ethereum", default-features = false } @@ -42,7 +47,7 @@ snowbridge-beacon-primitives = { path = "../../primitives/beacon", default-featu frame-benchmarking = { path = "../../../../../substrate/frame/benchmarking" } sp-keyring = { path = "../../../../../substrate/primitives/keyring" } snowbridge-beacon-primitives = { path = "../../primitives/beacon" } -snowbridge-ethereum-beacon-client = { path = "../../pallets/ethereum-beacon-client" } +snowbridge-pallet-ethereum-client = { path = "../../pallets/ethereum-client" } hex-literal = { version = "0.4.1" } [features] @@ -68,6 +73,7 @@ std = [ "sp-runtime/std", "sp-std/std", "xcm-builder/std", + "xcm-executor/std", "xcm/std", ] runtime-benchmarks = [ @@ -79,15 +85,16 @@ runtime-benchmarks = [ "pallet-balances/runtime-benchmarks", "snowbridge-beacon-primitives", "snowbridge-core/runtime-benchmarks", - "snowbridge-ethereum-beacon-client/runtime-benchmarks", + "snowbridge-pallet-ethereum-client/runtime-benchmarks", "snowbridge-router-primitives/runtime-benchmarks", "sp-runtime/runtime-benchmarks", "xcm-builder/runtime-benchmarks", + "xcm-executor/runtime-benchmarks", ] try-runtime = [ "frame-support/try-runtime", "frame-system/try-runtime", "pallet-balances/try-runtime", - "snowbridge-ethereum-beacon-client/try-runtime", + "snowbridge-pallet-ethereum-client/try-runtime", "sp-runtime/try-runtime", ] diff --git a/bridges/snowbridge/parachain/pallets/inbound-queue/README.md b/bridges/snowbridge/parachain/pallets/inbound-queue/README.md new file mode 100644 index 00000000000..cc2f7c636e6 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/inbound-queue/README.md @@ -0,0 +1,3 @@ +# Ethereum Inbound Queue + +Reads messages from Ethereum and sends it to intended destination on Polkadot, using XCM. diff --git a/bridges/snowbridge/parachain/pallets/inbound-queue/src/lib.rs b/bridges/snowbridge/parachain/pallets/inbound-queue/src/lib.rs index 834e805fbef..f7eea0aadfa 100644 --- a/bridges/snowbridge/parachain/pallets/inbound-queue/src/lib.rs +++ b/bridges/snowbridge/parachain/pallets/inbound-queue/src/lib.rs @@ -44,7 +44,7 @@ use envelope::Envelope; use frame_support::{ traits::{ fungible::{Inspect, Mutate}, - tokens::{Fortitude, Precision, Preservation}, + tokens::Preservation, }, weights::WeightToFee, PalletError, @@ -55,18 +55,20 @@ use sp_core::{H160, H256}; use sp_std::{convert::TryFrom, vec}; use xcm::prelude::{ send_xcm, Instruction::SetTopic, Junction::*, Junctions::*, MultiLocation, - SendError as XcmpSendError, SendXcm, Xcm, XcmHash, + SendError as XcmpSendError, SendXcm, Xcm, XcmContext, XcmHash, }; +use xcm_executor::traits::TransactAsset; use snowbridge_core::{ inbound::{Message, VerificationError, Verifier}, - sibling_sovereign_account, BasicOperatingMode, Channel, ChannelId, ParaId, StaticLookup, + sibling_sovereign_account, BasicOperatingMode, Channel, ChannelId, ParaId, PricingParameters, + StaticLookup, }; use snowbridge_router_primitives::{ inbound, inbound::{ConvertMessage, ConvertMessageError}, }; -use sp_runtime::traits::Saturating; +use sp_runtime::{traits::Saturating, SaturatedConversion, TokenError}; pub use weights::WeightInfo; @@ -83,7 +85,6 @@ pub mod pallet { use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; - use snowbridge_core::PricingParameters; #[pallet::pallet] pub struct Pallet(_); @@ -135,6 +136,9 @@ pub mod pallet { /// The upper limit here only used to estimate delivery cost type MaxMessageSize: Get; + + /// To withdraw and deposit an asset. + type AssetTransactor: TransactAsset; } #[pallet::hooks] @@ -142,7 +146,7 @@ pub mod pallet { #[pallet::event] #[pallet::generate_deposit(pub(super) fn deposit_event)] - pub enum Event { + pub enum Event { /// A message was received from Ethereum MessageReceived { /// The message channel @@ -151,6 +155,8 @@ pub mod pallet { nonce: u64, /// ID of the XCM message which was forwarded to the final destination parachain message_id: [u8; 32], + /// Fee burned for the teleport + fee_burned: BalanceOf, }, /// Set OperatingMode OperatingModeChanged { mode: BasicOperatingMode }, @@ -268,17 +274,16 @@ pub mod pallet { Err(_) => return Err(Error::::InvalidPayload.into()), }; - // We embed fees for xcm execution inside the xcm program using teleports - // so we must burn the amount of the fee embedded into the XCM script. - T::Token::burn_from(&sovereign_account, fee, Precision::Exact, Fortitude::Polite)?; - log::info!( target: LOG_TARGET, - "💫 xcm {:?} sent with fee {:?}", + "💫 xcm decoded as {:?} with fee {:?}", xcm, fee ); + // Burning fees for teleport + Self::burn_fees(channel.para_id, fee)?; + // Attempt to send XCM to a dest parachain let message_id = Self::send_xcm(xcm, channel.para_id)?; @@ -286,6 +291,7 @@ pub mod pallet { channel_id: envelope.channel_id, nonce: envelope.nonce, message_id, + fee_burned: fee, }); Ok(()) @@ -330,6 +336,30 @@ pub mod pallet { .saturating_add(len_fee) .saturating_add(T::PricingParameters::get().rewards.local) } + + /// Burn the amount of the fee embedded into the XCM for teleports + pub fn burn_fees(para_id: ParaId, fee: BalanceOf) -> DispatchResult { + let dummy_context = + XcmContext { origin: None, message_id: Default::default(), topic: None }; + let dest = MultiLocation { parents: 1, interior: X1(Parachain(para_id.into())) }; + let fees = (MultiLocation::parent(), fee.saturated_into::()).into(); + T::AssetTransactor::can_check_out(&dest, &fees, &dummy_context).map_err(|error| { + log::error!( + target: LOG_TARGET, + "XCM asset check out failed with error {:?}", error + ); + TokenError::FundsUnavailable + })?; + T::AssetTransactor::check_out(&dest, &fees, &dummy_context); + T::AssetTransactor::withdraw_asset(&fees, &dest, None).map_err(|error| { + log::error!( + target: LOG_TARGET, + "XCM asset withdraw failed with error {:?}", error + ); + TokenError::FundsUnavailable + })?; + Ok(()) + } } /// API for accessing the delivery cost of a message diff --git a/bridges/snowbridge/parachain/pallets/inbound-queue/src/mock.rs b/bridges/snowbridge/parachain/pallets/inbound-queue/src/mock.rs index 6b79a55e3c9..b031a46e219 100644 --- a/bridges/snowbridge/parachain/pallets/inbound-queue/src/mock.rs +++ b/bridges/snowbridge/parachain/pallets/inbound-queue/src/mock.rs @@ -22,6 +22,7 @@ use sp_runtime::{ }; use sp_std::convert::From; use xcm::v3::{prelude::*, MultiAssets, SendXcm}; +use xcm_executor::Assets; use crate::{self as inbound_queue}; @@ -32,7 +33,7 @@ frame_support::construct_runtime!( { System: frame_system::{Pallet, Call, Storage, Event}, Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, - EthereumBeaconClient: snowbridge_ethereum_beacon_client::{Pallet, Call, Storage, Event}, + EthereumBeaconClient: snowbridge_pallet_ethereum_client::{Pallet, Call, Storage, Event}, InboundQueue: inbound_queue::{Pallet, Call, Storage, Event}, } ); @@ -112,7 +113,7 @@ parameter_types! { }; } -impl snowbridge_ethereum_beacon_client::Config for Test { +impl snowbridge_pallet_ethereum_client::Config for Test { type RuntimeEvent = RuntimeEvent; type ForkVersions = ChainForkVersions; type MaxExecutionHeadersToKeep = ExecutionHeadersPruneThreshold; @@ -142,7 +143,7 @@ parameter_types! { } #[cfg(feature = "runtime-benchmarks")] -impl BenchmarkHelper for Test { +impl BenchmarkHelper for Test { // not implemented since the MockVerifier is used for tests fn initialize_storage(_: H256, _: CompactExecutionHeader) {} } @@ -200,6 +201,50 @@ impl StaticLookup for MockChannelLookup { } } +pub struct SuccessfulTransactor; +impl TransactAsset for SuccessfulTransactor { + fn can_check_in( + _origin: &MultiLocation, + _what: &MultiAsset, + _context: &XcmContext, + ) -> XcmResult { + Ok(()) + } + + fn can_check_out( + _dest: &MultiLocation, + _what: &MultiAsset, + _context: &XcmContext, + ) -> XcmResult { + Ok(()) + } + + fn deposit_asset( + _what: &MultiAsset, + _who: &MultiLocation, + _context: Option<&XcmContext>, + ) -> XcmResult { + Ok(()) + } + + fn withdraw_asset( + _what: &MultiAsset, + _who: &MultiLocation, + _context: Option<&XcmContext>, + ) -> Result { + Ok(Assets::default()) + } + + fn internal_transfer_asset( + _what: &MultiAsset, + _from: &MultiLocation, + _to: &MultiLocation, + _context: &XcmContext, + ) -> Result { + Ok(Assets::default()) + } +} + impl inbound_queue::Config for Test { type RuntimeEvent = RuntimeEvent; type Verifier = MockVerifier; @@ -221,6 +266,7 @@ impl inbound_queue::Config for Test { type WeightToFee = IdentityFee; type LengthToFee = IdentityFee; type MaxMessageSize = ConstU32<1024>; + type AssetTransactor = SuccessfulTransactor; } pub fn last_events(n: usize) -> Vec { diff --git a/bridges/snowbridge/parachain/pallets/inbound-queue/src/test.rs b/bridges/snowbridge/parachain/pallets/inbound-queue/src/test.rs index 6dc3ac45374..17ebeb39446 100644 --- a/bridges/snowbridge/parachain/pallets/inbound-queue/src/test.rs +++ b/bridges/snowbridge/parachain/pallets/inbound-queue/src/test.rs @@ -44,6 +44,7 @@ fn test_submit_happy_path() { 27, 217, 88, 127, 46, 143, 199, 70, 236, 66, 212, 244, 85, 221, 153, 104, 175, 37, 224, 20, 140, 95, 140, 7, 27, 74, 182, 199, 77, 12, 194, 236, ], + fee_burned: 110000000000, } .into()]); diff --git a/bridges/snowbridge/parachain/pallets/outbound-queue/Cargo.toml b/bridges/snowbridge/parachain/pallets/outbound-queue/Cargo.toml index f99fcc72e19..de4487553cb 100644 --- a/bridges/snowbridge/parachain/pallets/outbound-queue/Cargo.toml +++ b/bridges/snowbridge/parachain/pallets/outbound-queue/Cargo.toml @@ -1,11 +1,15 @@ [package] -name = "snowbridge-outbound-queue" -description = "Snowbridge Outbound Queue" -version = "0.1.1" -edition = "2021" +name = "snowbridge-pallet-outbound-queue" +description = "Snowbridge Outbound Queue Pallet" +version = "0.9.0" authors = ["Snowfork "] -repository = "https://github.com/Snowfork/snowbridge" +edition.workspace = true +repository.workspace = true license = "Apache-2.0" +categories = ["cryptography::cryptocurrencies"] + +[lints] +workspace = true [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/bridges/snowbridge/parachain/pallets/outbound-queue/README.md b/bridges/snowbridge/parachain/pallets/outbound-queue/README.md new file mode 100644 index 00000000000..19638f90e6a --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/outbound-queue/README.md @@ -0,0 +1,3 @@ +# Ethereum Outbound Queue + +Sends messages from an origin in the Polkadot ecosystem to Ethereum. diff --git a/bridges/snowbridge/parachain/pallets/outbound-queue/merkle-tree/Cargo.toml b/bridges/snowbridge/parachain/pallets/outbound-queue/merkle-tree/Cargo.toml index a3432163622..27c4ae02e52 100644 --- a/bridges/snowbridge/parachain/pallets/outbound-queue/merkle-tree/Cargo.toml +++ b/bridges/snowbridge/parachain/pallets/outbound-queue/merkle-tree/Cargo.toml @@ -1,11 +1,15 @@ [package] name = "snowbridge-outbound-queue-merkle-tree" description = "Snowbridge Outbound Queue Merkle Tree" -version = "0.1.1" -edition = "2021" +version = "0.9.0" authors = ["Snowfork "] -repository = "https://github.com/Snowfork/snowbridge" +edition.workspace = true +repository.workspace = true license = "Apache-2.0" +categories = ["cryptography::cryptocurrencies"] + +[lints] +workspace = true [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/bridges/snowbridge/parachain/pallets/outbound-queue/merkle-tree/README.md b/bridges/snowbridge/parachain/pallets/outbound-queue/merkle-tree/README.md new file mode 100644 index 00000000000..a3afef1d671 --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/outbound-queue/merkle-tree/README.md @@ -0,0 +1,4 @@ +# Snowbridge Outbound Queue Merkle Tree + +This crate implements a simple binary Merkle Tree utilities required for inter-op with Ethereum +bridge & Solidity contract. diff --git a/bridges/snowbridge/parachain/pallets/outbound-queue/runtime-api/Cargo.toml b/bridges/snowbridge/parachain/pallets/outbound-queue/runtime-api/Cargo.toml index c92e725c60d..1f2b51a6752 100644 --- a/bridges/snowbridge/parachain/pallets/outbound-queue/runtime-api/Cargo.toml +++ b/bridges/snowbridge/parachain/pallets/outbound-queue/runtime-api/Cargo.toml @@ -1,11 +1,15 @@ [package] name = "snowbridge-outbound-queue-runtime-api" description = "Snowbridge Outbound Queue Runtime API" -version = "0.1.0" -edition = "2021" +version = "0.9.0" authors = ["Snowfork "] -repository = "https://github.com/Snowfork/snowbridge" +edition.workspace = true +repository.workspace = true license = "Apache-2.0" +categories = ["cryptography::cryptocurrencies"] + +[lints] +workspace = true [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/bridges/snowbridge/parachain/pallets/outbound-queue/runtime-api/README.md b/bridges/snowbridge/parachain/pallets/outbound-queue/runtime-api/README.md new file mode 100644 index 00000000000..98ae01fb33d --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/outbound-queue/runtime-api/README.md @@ -0,0 +1,6 @@ +# Ethereum Outbound Queue Runtime API + +Provides an API: + +- to generate merkle proofs for outbound messages +- calculate delivery fee for delivering messages to Ethereum diff --git a/bridges/snowbridge/parachain/pallets/outbound-queue/src/lib.rs b/bridges/snowbridge/parachain/pallets/outbound-queue/src/lib.rs index c3401c4dc94..9e949a4791a 100644 --- a/bridges/snowbridge/parachain/pallets/outbound-queue/src/lib.rs +++ b/bridges/snowbridge/parachain/pallets/outbound-queue/src/lib.rs @@ -5,10 +5,10 @@ //! # Overview //! //! Messages come either from sibling parachains via XCM, or BridgeHub itself -//! via the `snowbridge-system` pallet: +//! via the `snowbridge-pallet-system`: //! //! 1. `snowbridge_router_primitives::outbound::EthereumBlobExporter::deliver` -//! 2. `snowbridge_system::Pallet::send` +//! 2. `snowbridge_pallet_system::Pallet::send` //! //! The message submission pipeline works like this: //! 1. The message is first validated via the implementation for diff --git a/bridges/snowbridge/parachain/pallets/outbound-queue/src/test.rs b/bridges/snowbridge/parachain/pallets/outbound-queue/src/test.rs index 454a91d5df5..0028d75e7b7 100644 --- a/bridges/snowbridge/parachain/pallets/outbound-queue/src/test.rs +++ b/bridges/snowbridge/parachain/pallets/outbound-queue/src/test.rs @@ -110,7 +110,7 @@ fn process_message_fails_on_max_nonce_reached() { channel_id, command: mock_message(sibling_id).command, }; - let versioned_queued_message: VersionedQueuedMessage = message.into(); + let versioned_queued_message: VersionedQueuedMessage = message.try_into().unwrap(); let encoded = versioned_queued_message.encode(); let mut meter = WeightMeter::with_limit(Weight::MAX); @@ -134,7 +134,7 @@ fn process_message_fails_on_overweight_message() { channel_id, command: mock_message(sibling_id).command, }; - let versioned_queued_message: VersionedQueuedMessage = message.into(); + let versioned_queued_message: VersionedQueuedMessage = message.try_into().unwrap(); let encoded = versioned_queued_message.encode(); let mut meter = WeightMeter::with_limit(Weight::from_parts(1, 1)); assert_noop!( diff --git a/bridges/snowbridge/parachain/pallets/outbound-queue/src/weights.rs b/bridges/snowbridge/parachain/pallets/outbound-queue/src/weights.rs index e4b6f8439b0..87eee1a31e8 100644 --- a/bridges/snowbridge/parachain/pallets/outbound-queue/src/weights.rs +++ b/bridges/snowbridge/parachain/pallets/outbound-queue/src/weights.rs @@ -1,5 +1,5 @@ -//! Autogenerated weights for `snowbridge_outbound_queue` +//! Autogenerated weights for `snowbridge-pallet-outbound-queue` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev //! DATE: 2023-10-19, STEPS: `2`, REPEAT: `1`, LOW RANGE: `[]`, HIGH RANGE: `[]` @@ -12,7 +12,7 @@ // benchmark // pallet // --chain=bridge-hub-rococo-dev -// --pallet=snowbridge_outbound_queue +// --pallet=snowbridge-pallet-outbound-queue // --extrinsic=* // --execution=wasm // --wasm-execution=compiled @@ -29,7 +29,7 @@ use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; use core::marker::PhantomData; -/// Weight functions needed for `snowbridge_outbound_queue`. +/// Weight functions needed for `snowbridge-pallet-outbound-queue`. pub trait WeightInfo { fn do_process_message() -> Weight; fn commit() -> Weight; diff --git a/bridges/snowbridge/parachain/pallets/system/Cargo.toml b/bridges/snowbridge/parachain/pallets/system/Cargo.toml index 4356bf57220..70155370d19 100644 --- a/bridges/snowbridge/parachain/pallets/system/Cargo.toml +++ b/bridges/snowbridge/parachain/pallets/system/Cargo.toml @@ -1,11 +1,15 @@ [package] -name = "snowbridge-system" -description = "Snowbridge System" -version = "0.1.1" +name = "snowbridge-pallet-system" +description = "Snowbridge System Pallet" +version = "0.9.0" authors = ["Snowfork "] -edition = "2021" -repository = "https://github.com/Snowfork/snowbridge" +edition.workspace = true +repository.workspace = true license = "Apache-2.0" +categories = ["cryptography::cryptocurrencies"] + +[lints] +workspace = true [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] @@ -39,7 +43,7 @@ pallet-balances = { path = "../../../../../substrate/frame/balances" } sp-keyring = { path = "../../../../../substrate/primitives/keyring" } polkadot-primitives = { path = "../../../../../polkadot/primitives" } pallet-message-queue = { path = "../../../../../substrate/frame/message-queue" } -snowbridge-outbound-queue = { path = "../outbound-queue" } +snowbridge-pallet-outbound-queue = { path = "../outbound-queue" } [features] default = ["std"] @@ -68,7 +72,7 @@ runtime-benchmarks = [ "pallet-message-queue/runtime-benchmarks", "polkadot-primitives/runtime-benchmarks", "snowbridge-core/runtime-benchmarks", - "snowbridge-outbound-queue/runtime-benchmarks", + "snowbridge-pallet-outbound-queue/runtime-benchmarks", "sp-runtime/runtime-benchmarks", "xcm-builder/runtime-benchmarks", "xcm-executor/runtime-benchmarks", @@ -78,6 +82,6 @@ try-runtime = [ "frame-system/try-runtime", "pallet-balances/try-runtime", "pallet-message-queue/try-runtime", - "snowbridge-outbound-queue/try-runtime", + "snowbridge-pallet-outbound-queue/try-runtime", "sp-runtime/try-runtime", ] diff --git a/bridges/snowbridge/parachain/pallets/system/README.md b/bridges/snowbridge/parachain/pallets/system/README.md index 9e4dc55267d..5ab11d45eae 100644 --- a/bridges/snowbridge/parachain/pallets/system/README.md +++ b/bridges/snowbridge/parachain/pallets/system/README.md @@ -1 +1,3 @@ -License: MIT-0 +# Ethereum System + +Contains management functions to manage functions on Ethereum. For example, creating agents and channels. diff --git a/bridges/snowbridge/parachain/pallets/system/runtime-api/Cargo.toml b/bridges/snowbridge/parachain/pallets/system/runtime-api/Cargo.toml index 97d0735bf63..96d5aa522c0 100644 --- a/bridges/snowbridge/parachain/pallets/system/runtime-api/Cargo.toml +++ b/bridges/snowbridge/parachain/pallets/system/runtime-api/Cargo.toml @@ -1,11 +1,15 @@ [package] name = "snowbridge-system-runtime-api" description = "Snowbridge System Runtime API" -version = "0.1.0" -edition = "2021" +version = "0.9.0" authors = ["Snowfork "] -repository = "https://github.com/Snowfork/snowbridge" +edition.workspace = true +repository.workspace = true license = "Apache-2.0" +categories = ["cryptography::cryptocurrencies"] + +[lints] +workspace = true [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/bridges/snowbridge/parachain/pallets/system/runtime-api/README.md b/bridges/snowbridge/parachain/pallets/system/runtime-api/README.md new file mode 100644 index 00000000000..99827c9c2fc --- /dev/null +++ b/bridges/snowbridge/parachain/pallets/system/runtime-api/README.md @@ -0,0 +1,3 @@ +# Ethereum System Runtime API + +Provides an API for looking up an agent ID on Ethereum. diff --git a/bridges/snowbridge/parachain/pallets/system/src/lib.rs b/bridges/snowbridge/parachain/pallets/system/src/lib.rs index e5077abd921..0042093ee66 100644 --- a/bridges/snowbridge/parachain/pallets/system/src/lib.rs +++ b/bridges/snowbridge/parachain/pallets/system/src/lib.rs @@ -79,6 +79,8 @@ use xcm_executor::traits::ConvertLocation; #[cfg(feature = "runtime-benchmarks")] use frame_support::traits::OriginTrait; +pub use pallet::*; + pub type BalanceOf = <::Token as Inspect<::AccountId>>::Balance; pub type AccountIdOf = ::AccountId; diff --git a/bridges/snowbridge/parachain/pallets/system/src/mock.rs b/bridges/snowbridge/parachain/pallets/system/src/mock.rs index 7a4f6118930..bb9bae6b56d 100644 --- a/bridges/snowbridge/parachain/pallets/system/src/mock.rs +++ b/bridges/snowbridge/parachain/pallets/system/src/mock.rs @@ -89,7 +89,7 @@ frame_support::construct_runtime!( System: frame_system, Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, XcmOrigin: pallet_xcm_origin::{Pallet, Origin}, - OutboundQueue: snowbridge_outbound_queue::{Pallet, Call, Storage, Event}, + OutboundQueue: snowbridge_pallet_outbound_queue::{Pallet, Call, Storage, Event}, EthereumSystem: snowbridge_system, MessageQueue: pallet_message_queue::{Pallet, Call, Storage, Event} } @@ -167,7 +167,7 @@ parameter_types! { pub const OwnParaId: ParaId = ParaId::new(1013); } -impl snowbridge_outbound_queue::Config for Test { +impl snowbridge_pallet_outbound_queue::Config for Test { type RuntimeEvent = RuntimeEvent; type Hashing = Keccak256; type MessageQueue = MessageQueue; diff --git a/bridges/snowbridge/parachain/primitives/beacon/Cargo.toml b/bridges/snowbridge/parachain/primitives/beacon/Cargo.toml index eb717325e8a..8294e903dfb 100644 --- a/bridges/snowbridge/parachain/primitives/beacon/Cargo.toml +++ b/bridges/snowbridge/parachain/primitives/beacon/Cargo.toml @@ -1,10 +1,15 @@ [package] name = "snowbridge-beacon-primitives" description = "Snowbridge Beacon Primitives" -version = "0.0.1" +version = "0.9.0" authors = ["Snowfork "] -edition = "2021" +edition.workspace = true +repository.workspace = true license = "Apache-2.0" +categories = ["cryptography::cryptocurrencies"] + +[lints] +workspace = true [dependencies] serde = { version = "1.0.195", optional = true, features = ["derive"] } diff --git a/bridges/snowbridge/parachain/primitives/beacon/README.md b/bridges/snowbridge/parachain/primitives/beacon/README.md new file mode 100644 index 00000000000..658d7c5be7d --- /dev/null +++ b/bridges/snowbridge/parachain/primitives/beacon/README.md @@ -0,0 +1,10 @@ +# Beacon Primitives + +Crate with low-level supporting functions for the beacon client, including: + +- bls12-381 signature handling to verify signatures on the beacon chain +- merkle proofs +- receipt verification +- ssz types + +The code in this crate relates to the Ethereum consensus chain, commonly referred to as the beacon chain. diff --git a/bridges/snowbridge/parachain/primitives/core/Cargo.toml b/bridges/snowbridge/parachain/primitives/core/Cargo.toml index 706c508363d..1cb28eb3e50 100644 --- a/bridges/snowbridge/parachain/primitives/core/Cargo.toml +++ b/bridges/snowbridge/parachain/primitives/core/Cargo.toml @@ -1,10 +1,15 @@ [package] name = "snowbridge-core" description = "Snowbridge Core" -version = "0.1.1" +version = "0.9.0" authors = ["Snowfork "] -edition = "2021" +edition.workspace = true +repository.workspace = true license = "Apache-2.0" +categories = ["cryptography::cryptocurrencies"] + +[lints] +workspace = true [dependencies] serde = { version = "1.0.195", optional = true, features = ["alloc", "derive"], default-features = false } diff --git a/bridges/snowbridge/parachain/primitives/core/README.md b/bridges/snowbridge/parachain/primitives/core/README.md new file mode 100644 index 00000000000..0126be63aeb --- /dev/null +++ b/bridges/snowbridge/parachain/primitives/core/README.md @@ -0,0 +1,4 @@ +# Core Primitives + +Contains common code core to Snowbridge, such as inbound and outbound queue types, pricing structs, ringbuffer data +types (used in the beacon client). diff --git a/bridges/snowbridge/parachain/primitives/ethereum/Cargo.toml b/bridges/snowbridge/parachain/primitives/ethereum/Cargo.toml index 3624044f86a..016f16ce0e6 100644 --- a/bridges/snowbridge/parachain/primitives/ethereum/Cargo.toml +++ b/bridges/snowbridge/parachain/primitives/ethereum/Cargo.toml @@ -1,10 +1,15 @@ [package] name = "snowbridge-ethereum" description = "Snowbridge Ethereum" -version = "0.1.0" +version = "0.9.0" authors = ["Snowfork "] -edition = "2021" +edition.workspace = true +repository.workspace = true license = "Apache-2.0" +categories = ["cryptography::cryptocurrencies"] + +[lints] +workspace = true [dependencies] serde = { version = "1.0.195", optional = true, features = ["derive"] } diff --git a/bridges/snowbridge/parachain/primitives/ethereum/README.md b/bridges/snowbridge/parachain/primitives/ethereum/README.md new file mode 100644 index 00000000000..c295aad9040 --- /dev/null +++ b/bridges/snowbridge/parachain/primitives/ethereum/README.md @@ -0,0 +1,4 @@ +# Ethereum Primitives + +Contains code necessary to decode RLP encoded data (like the Ethereum log), structs for Ethereum execution headers. The +code in this crate relates to the Ethereum execution chain. diff --git a/bridges/snowbridge/parachain/primitives/router/Cargo.toml b/bridges/snowbridge/parachain/primitives/router/Cargo.toml index 40ae12920e7..65133128ef4 100644 --- a/bridges/snowbridge/parachain/primitives/router/Cargo.toml +++ b/bridges/snowbridge/parachain/primitives/router/Cargo.toml @@ -1,10 +1,15 @@ [package] name = "snowbridge-router-primitives" description = "Snowbridge Router Primitives" -version = "0.1.1" +version = "0.9.0" authors = ["Snowfork "] -edition = "2021" +edition.workspace = true +repository.workspace = true license = "Apache-2.0" +categories = ["cryptography::cryptocurrencies"] + +[lints] +workspace = true [dependencies] serde = { version = "1.0.195", optional = true, features = ["derive"] } diff --git a/bridges/snowbridge/parachain/primitives/router/README.md b/bridges/snowbridge/parachain/primitives/router/README.md new file mode 100644 index 00000000000..45967cbf76c --- /dev/null +++ b/bridges/snowbridge/parachain/primitives/router/README.md @@ -0,0 +1,4 @@ +# Router Primitives + +Inbound and outbound router logic. Does XCM conversion to a lowered, simpler format the Ethereum contracts can +understand. diff --git a/bridges/snowbridge/parachain/runtime/rococo-common/Cargo.toml b/bridges/snowbridge/parachain/runtime/rococo-common/Cargo.toml deleted file mode 100644 index 656ed6de26e..00000000000 --- a/bridges/snowbridge/parachain/runtime/rococo-common/Cargo.toml +++ /dev/null @@ -1,26 +0,0 @@ -[package] -name = "snowbridge-rococo-common" -description = "Snowbridge Rococo Common" -version = "0.0.1" -authors = ["Snowfork "] -edition = "2021" -license = "Apache-2.0" - -[dependencies] -log = { version = "0.4.20", default-features = false } - -frame-support = { path = "../../../../../substrate/frame/support", default-features = false } -xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } - -[dev-dependencies] - -[features] -default = ["std"] -std = [ - "frame-support/std", - "log/std", - "xcm/std", -] -runtime-benchmarks = [ - "frame-support/runtime-benchmarks", -] diff --git a/bridges/snowbridge/parachain/runtime/rococo-common/src/lib.rs b/bridges/snowbridge/parachain/runtime/rococo-common/src/lib.rs deleted file mode 100644 index 97f0332fe66..00000000000 --- a/bridges/snowbridge/parachain/runtime/rococo-common/src/lib.rs +++ /dev/null @@ -1,16 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// SPDX-FileCopyrightText: 2023 Snowfork -//! # Rococo Common -//! -//! Config used for the Rococo asset hub and bridge hub runtimes. -#![cfg_attr(not(feature = "std"), no_std)] - -use frame_support::parameter_types; -use xcm::opaque::lts::NetworkId; - -pub const INBOUND_QUEUE_MESSAGES_PALLET_INDEX: u8 = 80; - -parameter_types! { - // Network and location for the Ethereum chain. - pub EthereumNetwork: NetworkId = NetworkId::Ethereum { chain_id: 11155111 }; -} diff --git a/bridges/snowbridge/parachain/runtime/runtime-common/Cargo.toml b/bridges/snowbridge/parachain/runtime/runtime-common/Cargo.toml index b835152cac0..b81c5d496e8 100644 --- a/bridges/snowbridge/parachain/runtime/runtime-common/Cargo.toml +++ b/bridges/snowbridge/parachain/runtime/runtime-common/Cargo.toml @@ -1,10 +1,15 @@ [package] name = "snowbridge-runtime-common" description = "Snowbridge Runtime Common" -version = "0.1.1" +version = "0.9.0" authors = ["Snowfork "] -edition = "2021" +edition.workspace = true +repository.workspace = true license = "Apache-2.0" +categories = ["cryptography::cryptocurrencies"] + +[lints] +workspace = true [dependencies] log = { version = "0.4.20", default-features = false } diff --git a/bridges/snowbridge/parachain/runtime/runtime-common/README.md b/bridges/snowbridge/parachain/runtime/runtime-common/README.md new file mode 100644 index 00000000000..57d178ea2d2 --- /dev/null +++ b/bridges/snowbridge/parachain/runtime/runtime-common/README.md @@ -0,0 +1,3 @@ +# Snowbridge Runtime Common + +Common crate to contain runtime related structs and implementations for Snowbridge. diff --git a/bridges/snowbridge/parachain/runtime/tests/Cargo.toml b/bridges/snowbridge/parachain/runtime/test-common/Cargo.toml similarity index 78% rename from bridges/snowbridge/parachain/runtime/tests/Cargo.toml rename to bridges/snowbridge/parachain/runtime/test-common/Cargo.toml index 0a09f89c6b9..ae72de406fc 100644 --- a/bridges/snowbridge/parachain/runtime/tests/Cargo.toml +++ b/bridges/snowbridge/parachain/runtime/test-common/Cargo.toml @@ -1,10 +1,14 @@ [package] -name = "snowbridge-runtime-tests" +name = "snowbridge-runtime-test-common" description = "Snowbridge Runtime Tests" -version = "0.1.0" +version = "0.9.0" authors = ["Snowfork "] edition = "2021" license = "Apache-2.0" +categories = ["cryptography::cryptocurrencies"] + +[lints] +workspace = true [dependencies] codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] } @@ -48,7 +52,6 @@ sp-transaction-pool = { path = "../../../../../substrate/primitives/transaction- sp-version = { path = "../../../../../substrate/primitives/version", default-features = false } # Polkadot -rococo-runtime-constants = { path = "../../../../../polkadot/runtime/rococo/constants", default-features = false } pallet-xcm = { path = "../../../../../polkadot/xcm/pallet-xcm", default-features = false } pallet-xcm-benchmarks = { path = "../../../../../polkadot/xcm/pallet-xcm-benchmarks", default-features = false, optional = true } polkadot-core-primitives = { path = "../../../../../polkadot/core-primitives", default-features = false } @@ -71,19 +74,17 @@ pallet-collator-selection = { path = "../../../../../cumulus/pallets/collator-se parachain-info = { package = "staging-parachain-info", path = "../../../../../cumulus/parachains/pallets/parachain-info", default-features = false } parachains-common = { path = "../../../../../cumulus/parachains/common", default-features = false } parachains-runtimes-test-utils = { path = "../../../../../cumulus/parachains/runtimes/test-utils", default-features = false } -bridge-hub-rococo-runtime = { path = "../../../../../cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo", default-features = false } -asset-hub-rococo-runtime = { path = "../../../../../cumulus/parachains/runtimes/assets/asset-hub-rococo", default-features = false } assets-common = { path = "../../../../../cumulus/parachains/runtimes/assets/common", default-features = false } # Ethereum Bridge (Snowbridge) snowbridge-core = { path = "../../primitives/core", default-features = false } snowbridge-beacon-primitives = { path = "../../primitives/beacon", default-features = false } snowbridge-router-primitives = { path = "../../primitives/router", default-features = false } -snowbridge-ethereum-beacon-client = { path = "../../pallets/ethereum-beacon-client", default-features = false } -snowbridge-inbound-queue = { path = "../../pallets/inbound-queue", default-features = false } -snowbridge-outbound-queue = { path = "../../pallets/outbound-queue", default-features = false } +snowbridge-pallet-ethereum-client = { path = "../../pallets/ethereum-client", default-features = false } +snowbridge-pallet-inbound-queue = { path = "../../pallets/inbound-queue", default-features = false } +snowbridge-pallet-outbound-queue = { path = "../../pallets/outbound-queue", default-features = false } snowbridge-outbound-queue-runtime-api = { path = "../../pallets/outbound-queue/runtime-api", default-features = false } -snowbridge-system = { path = "../../pallets/system", default-features = false } +snowbridge-pallet-system = { path = "../../pallets/system", default-features = false } snowbridge-system-runtime-api = { path = "../../pallets/system/runtime-api", default-features = false } [dev-dependencies] @@ -95,9 +96,7 @@ sp-keyring = { path = "../../../../../substrate/primitives/keyring" } [features] default = ["std"] std = [ - "asset-hub-rococo-runtime/std", "assets-common/std", - "bridge-hub-rococo-runtime/std", "codec/std", "cumulus-pallet-aura-ext/std", "cumulus-pallet-dmp-queue/std", @@ -134,18 +133,17 @@ std = [ "polkadot-core-primitives/std", "polkadot-parachain-primitives/std", "polkadot-runtime-common/std", - "rococo-runtime-constants/std", "scale-info/std", "serde", "snowbridge-beacon-primitives/std", "snowbridge-core/std", - "snowbridge-ethereum-beacon-client/std", - "snowbridge-inbound-queue/std", "snowbridge-outbound-queue-runtime-api/std", - "snowbridge-outbound-queue/std", + "snowbridge-pallet-ethereum-client/std", + "snowbridge-pallet-inbound-queue/std", + "snowbridge-pallet-outbound-queue/std", + "snowbridge-pallet-system/std", "snowbridge-router-primitives/std", "snowbridge-system-runtime-api/std", - "snowbridge-system/std", "sp-api/std", "sp-block-builder/std", "sp-consensus-aura/std", @@ -166,9 +164,7 @@ std = [ ] runtime-benchmarks = [ - "asset-hub-rococo-runtime/runtime-benchmarks", "assets-common/runtime-benchmarks", - "bridge-hub-rococo-runtime/runtime-benchmarks", "bridge-runtime-common/runtime-benchmarks", "cumulus-pallet-dmp-queue/runtime-benchmarks", "cumulus-pallet-parachain-system/runtime-benchmarks", @@ -192,53 +188,12 @@ runtime-benchmarks = [ "polkadot-parachain-primitives/runtime-benchmarks", "polkadot-runtime-common/runtime-benchmarks", "snowbridge-core/runtime-benchmarks", - "snowbridge-ethereum-beacon-client/runtime-benchmarks", - "snowbridge-inbound-queue/runtime-benchmarks", - "snowbridge-outbound-queue/runtime-benchmarks", + "snowbridge-pallet-ethereum-client/runtime-benchmarks", + "snowbridge-pallet-inbound-queue/runtime-benchmarks", + "snowbridge-pallet-outbound-queue/runtime-benchmarks", + "snowbridge-pallet-system/runtime-benchmarks", "snowbridge-router-primitives/runtime-benchmarks", - "snowbridge-system/runtime-benchmarks", "sp-runtime/runtime-benchmarks", "xcm-builder/runtime-benchmarks", "xcm-executor/runtime-benchmarks", ] - -try-runtime = [ - "asset-hub-rococo-runtime/try-runtime", - "bridge-hub-rococo-runtime/try-runtime", - "cumulus-pallet-aura-ext/try-runtime", - "cumulus-pallet-dmp-queue/try-runtime", - "cumulus-pallet-parachain-system/try-runtime", - "cumulus-pallet-xcm/try-runtime", - "cumulus-pallet-xcmp-queue/try-runtime", - "frame-executive/try-runtime", - "frame-support/try-runtime", - "frame-system/try-runtime", - "frame-try-runtime/try-runtime", - "pallet-aura/try-runtime", - "pallet-authorship/try-runtime", - "pallet-balances/try-runtime", - "pallet-collator-selection/try-runtime", - "pallet-message-queue/try-runtime", - "pallet-multisig/try-runtime", - "pallet-session/try-runtime", - "pallet-timestamp/try-runtime", - "pallet-transaction-payment/try-runtime", - "pallet-utility/try-runtime", - "pallet-xcm/try-runtime", - "parachain-info/try-runtime", - "polkadot-runtime-common/try-runtime", - "snowbridge-ethereum-beacon-client/try-runtime", - "snowbridge-inbound-queue/try-runtime", - "snowbridge-outbound-queue/try-runtime", - "snowbridge-system/try-runtime", - "sp-runtime/try-runtime", -] -fast-runtime = [ - "bridge-hub-rococo-runtime/fast-runtime", -] -experimental = ["pallet-aura/experimental"] - -# A feature that should be enabled when the runtime should be built for on-chain -# deployment. This will disable stuff that shouldn't be part of the on-chain wasm -# to make it smaller like logging for example. -on-chain-release-build = ["sp-api/disable-logging"] diff --git a/bridges/snowbridge/parachain/runtime/test-common/README.md b/bridges/snowbridge/parachain/runtime/test-common/README.md new file mode 100644 index 00000000000..d582f87142b --- /dev/null +++ b/bridges/snowbridge/parachain/runtime/test-common/README.md @@ -0,0 +1,3 @@ +# Runtime Tests + +Tests runtime config and bridge functionality in the boundaries of a runtime. diff --git a/bridges/snowbridge/parachain/runtime/tests/src/test_cases.rs b/bridges/snowbridge/parachain/runtime/test-common/src/lib.rs similarity index 88% rename from bridges/snowbridge/parachain/runtime/tests/src/test_cases.rs rename to bridges/snowbridge/parachain/runtime/test-common/src/lib.rs index e5a45cdc92b..8a6834db2e4 100644 --- a/bridges/snowbridge/parachain/runtime/tests/src/test_cases.rs +++ b/bridges/snowbridge/parachain/runtime/test-common/src/lib.rs @@ -1,12 +1,9 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-FileCopyrightText: 2023 Snowfork -//! Module contains predefined test-case scenarios for `Runtime` with bridging capabilities. - -use asset_hub_rococo_runtime::xcm_config::bridging::to_ethereum::DefaultBridgeHubEthereumBaseFee; -use bridge_hub_rococo_runtime::EthereumSystem; use codec::Encode; use frame_support::{assert_err, assert_ok, traits::fungible::Mutate}; +pub use parachains_runtimes_test_utils::test_cases::change_storage_constant_by_governance_works; use parachains_runtimes_test_utils::{ AccountIdOf, BalanceOf, CollatorSessionKeys, ExtBuilder, ValidatorIdOf, XcmReceivedFrom, }; @@ -49,7 +46,7 @@ where + parachain_info::Config + pallet_collator_selection::Config + cumulus_pallet_parachain_system::Config - + snowbridge_outbound_queue::Config, + + snowbridge_pallet_outbound_queue::Config, XcmConfig: xcm_executor::Config, { let assethub_parachain_location = MultiLocation::new(1, Parachain(assethub_parachain_id)); @@ -109,8 +106,8 @@ pub fn send_transfer_token_message_success( weth_contract_address: H160, destination_address: H160, fee_amount: u128, - snowbridge_outbound_queue: Box< - dyn Fn(Vec) -> Option>, + snowbridge_pallet_outbound_queue: Box< + dyn Fn(Vec) -> Option>, >, ) where Runtime: frame_system::Config @@ -120,8 +117,8 @@ pub fn send_transfer_token_message_success( + parachain_info::Config + pallet_collator_selection::Config + cumulus_pallet_parachain_system::Config - + snowbridge_outbound_queue::Config - + snowbridge_system::Config, + + snowbridge_pallet_outbound_queue::Config + + snowbridge_pallet_system::Config, XcmConfig: xcm_executor::Config, ValidatorIdOf: From>, { @@ -132,14 +129,14 @@ pub fn send_transfer_token_message_success( .with_tracing() .build() .execute_with(|| { - EthereumSystem::initialize(runtime_para_id.into(), assethub_parachain_id.into()) - .unwrap(); + >::initialize( + runtime_para_id.into(), + assethub_parachain_id.into(), + ) + .unwrap(); // fund asset hub sovereign account enough so it can pay fees - initial_fund::( - assethub_parachain_id, - DefaultBridgeHubEthereumBaseFee::get() + 1_000_000_000, - ); + initial_fund::(assethub_parachain_id, 5_000_000_000_000); let outcome = send_transfer_token_message::( assethub_parachain_id, @@ -153,10 +150,11 @@ pub fn send_transfer_token_message_success( // check events let mut events = >::events() .into_iter() - .filter_map(|e| snowbridge_outbound_queue(e.event.encode())); - assert!( - events.any(|e| matches!(e, snowbridge_outbound_queue::Event::MessageQueued { .. })) - ); + .filter_map(|e| snowbridge_pallet_outbound_queue(e.event.encode())); + assert!(events.any(|e| matches!( + e, + snowbridge_pallet_outbound_queue::Event::MessageQueued { .. } + ))); }); } @@ -174,7 +172,7 @@ pub fn send_unpaid_transfer_token_message( + parachain_info::Config + pallet_collator_selection::Config + cumulus_pallet_parachain_system::Config - + snowbridge_outbound_queue::Config, + + snowbridge_pallet_outbound_queue::Config, XcmConfig: xcm_executor::Config, ValidatorIdOf: From>, { @@ -263,8 +261,8 @@ pub fn send_transfer_token_message_failure( + parachain_info::Config + pallet_collator_selection::Config + cumulus_pallet_parachain_system::Config - + snowbridge_outbound_queue::Config - + snowbridge_system::Config, + + snowbridge_pallet_outbound_queue::Config + + snowbridge_pallet_system::Config, XcmConfig: xcm_executor::Config, ValidatorIdOf: From>, { @@ -275,8 +273,11 @@ pub fn send_transfer_token_message_failure( .with_tracing() .build() .execute_with(|| { - EthereumSystem::initialize(runtime_para_id.into(), assethub_parachain_id.into()) - .unwrap(); + >::initialize( + runtime_para_id.into(), + assethub_parachain_id.into(), + ) + .unwrap(); // fund asset hub sovereign account enough so it can pay fees initial_fund::(assethub_parachain_id, initial_amount); diff --git a/bridges/snowbridge/parachain/scripts/benchmark.sh b/bridges/snowbridge/parachain/scripts/benchmark.sh index c47649b2eeb..c9a561b33c4 100755 --- a/bridges/snowbridge/parachain/scripts/benchmark.sh +++ b/bridges/snowbridge/parachain/scripts/benchmark.sh @@ -7,9 +7,9 @@ cargo run --release --bin polkadot-parachain \ -- \ benchmark pallet \ --chain=bridge-hub-rococo-dev \ ---pallet=snowbridge_ethereum_beacon_client \ +--pallet=snowbridge_pallet_ethereum_client \ --extrinsic="*" \ --execution=wasm --wasm-execution=compiled \ --steps 50 --repeat 20 \ ---output ./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_ethereum_beacon_client.rs +--output ./parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_pallet_ethereum_client.rs popd diff --git a/bridges/snowbridge/parachain/scripts/verify-pallets-build.sh b/bridges/snowbridge/parachain/scripts/verify-pallets-build.sh index 74cec954832..a62f48c84d4 100755 --- a/bridges/snowbridge/parachain/scripts/verify-pallets-build.sh +++ b/bridges/snowbridge/parachain/scripts/verify-pallets-build.sh @@ -78,7 +78,7 @@ rm -rf $SNOWBRIDGE_FOLDER/parachain/.gitignore rm -rf $SNOWBRIDGE_FOLDER/parachain/templates rm -rf $SNOWBRIDGE_FOLDER/parachain/.cargo rm -rf $SNOWBRIDGE_FOLDER/parachain/.config -rm -rf $SNOWBRIDGE_FOLDER/parachain/pallets/ethereum-beacon-client/fuzz +rm -rf $SNOWBRIDGE_FOLDER/parachain/pallets/ethereum-client/fuzz cd bridges/snowbridge/parachain @@ -93,18 +93,18 @@ find "." -name 'Cargo.toml' | while read -r file; do done # let's test if everything we need compiles -cargo check -p snowbridge-ethereum-beacon-client -cargo check -p snowbridge-ethereum-beacon-client --features runtime-benchmarks -cargo check -p snowbridge-ethereum-beacon-client --features try-runtime -cargo check -p snowbridge-inbound-queue -cargo check -p snowbridge-inbound-queue --features runtime-benchmarks -cargo check -p snowbridge-inbound-queue --features try-runtime -cargo check -p snowbridge-outbound-queue -cargo check -p snowbridge-outbound-queue --features runtime-benchmarks -cargo check -p snowbridge-outbound-queue --features try-runtime -cargo check -p snowbridge-system -cargo check -p snowbridge-system --features runtime-benchmarks -cargo check -p snowbridge-system --features try-runtime +cargo check -p snowbridge-pallet-ethereum-client +cargo check -p snowbridge-pallet-ethereum-client --features runtime-benchmarks +cargo check -p snowbridge-pallet-ethereum-client --features try-runtime +cargo check -p snowbridge-pallet-inbound-queue +cargo check -p snowbridge-pallet-inbound-queue --features runtime-benchmarks +cargo check -p snowbridge-pallet-inbound-queue --features try-runtime +cargo check -p snowbridge-pallet-outbound-queue +cargo check -p snowbridge-pallet-outbound-queue --features runtime-benchmarks +cargo check -p snowbridge-pallet-outbound-queue --features try-runtime +cargo check -p snowbridge-pallet-system +cargo check -p snowbridge-pallet-system --features runtime-benchmarks +cargo check -p snowbridge-pallet-system --features try-runtime cd - diff --git a/cumulus/parachains/common/src/rococo.rs b/cumulus/parachains/common/src/rococo.rs index 6e31def4b55..9ab57f0a6c8 100644 --- a/cumulus/parachains/common/src/rococo.rs +++ b/cumulus/parachains/common/src/rococo.rs @@ -117,3 +117,19 @@ pub mod consensus { /// Relay chain slot duration, in milliseconds. pub const RELAY_CHAIN_SLOT_DURATION_MILLIS: u32 = 6000; } + +pub mod snowbridge { + use frame_support::parameter_types; + use xcm::opaque::lts::NetworkId; + + /// The pallet index of the Ethereum inbound queue pallet in the bridge hub runtime. + pub const INBOUND_QUEUE_PALLET_INDEX: u8 = 80; + + parameter_types! { + /// Network and location for the Ethereum chain. On Rococo, the Ethereum chain bridged + /// to is the Sepolia Ethereum testnet, with chain ID 11155111. + /// + /// + pub EthereumNetwork: NetworkId = NetworkId::Ethereum { chain_id: 11155111 }; + } +} diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/Cargo.toml index d923f7388a2..2bc57bf2548 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo/Cargo.toml @@ -30,6 +30,6 @@ bridge-hub-common = { path = "../../../../../../runtimes/bridge-hubs/common", de # Snowbridge snowbridge-core = { path = "../../../../../../../../bridges/snowbridge/parachain/primitives/core", default-features = false } snowbridge-router-primitives = { path = "../../../../../../../../bridges/snowbridge/parachain/primitives/router", default-features = false } -snowbridge-system = { path = "../../../../../../../../bridges/snowbridge/parachain/pallets/system", default-features = false } -snowbridge-inbound-queue = { path = "../../../../../../../../bridges/snowbridge/parachain/pallets/inbound-queue", default-features = false } -snowbridge-outbound-queue = { path = "../../../../../../../../bridges/snowbridge/parachain/pallets/outbound-queue", default-features = false } +snowbridge-pallet-system = { path = "../../../../../../../../bridges/snowbridge/parachain/pallets/system", default-features = false } +snowbridge-pallet-inbound-queue = { path = "../../../../../../../../bridges/snowbridge/parachain/pallets/inbound-queue", default-features = false } +snowbridge-pallet-outbound-queue = { path = "../../../../../../../../bridges/snowbridge/parachain/pallets/outbound-queue", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/Cargo.toml index e75187bea95..0904578b156 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/Cargo.toml @@ -48,7 +48,6 @@ asset-hub-rococo-runtime = { path = "../../../../../runtimes/assets/asset-hub-ro # Snowbridge snowbridge-core = { path = "../../../../../../../bridges/snowbridge/parachain/primitives/core", default-features = false } snowbridge-router-primitives = { path = "../../../../../../../bridges/snowbridge/parachain/primitives/router", default-features = false } -snowbridge-system = { path = "../../../../../../../bridges/snowbridge/parachain/pallets/system", default-features = false } -snowbridge-inbound-queue = { path = "../../../../../../../bridges/snowbridge/parachain/pallets/inbound-queue", default-features = false } -snowbridge-outbound-queue = { path = "../../../../../../../bridges/snowbridge/parachain/pallets/outbound-queue", default-features = false } -snowbridge-rococo-common = { path = "../../../../../../../bridges/snowbridge/parachain/runtime/rococo-common", default-features = false } +snowbridge-pallet-system = { path = "../../../../../../../bridges/snowbridge/parachain/pallets/system", default-features = false } +snowbridge-pallet-inbound-queue = { path = "../../../../../../../bridges/snowbridge/parachain/pallets/inbound-queue", default-features = false } +snowbridge-pallet-outbound-queue = { path = "../../../../../../../bridges/snowbridge/parachain/pallets/outbound-queue", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs index e62a73caff5..85547f210a7 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs @@ -17,12 +17,12 @@ use codec::{Decode, Encode}; use emulated_integration_tests_common::xcm_emulator::ConvertLocation; use frame_support::pallet_prelude::TypeInfo; use hex_literal::hex; +use parachains_common::rococo::snowbridge::EthereumNetwork; use snowbridge_core::outbound::OperatingMode; -use snowbridge_rococo_common::EthereumNetwork; +use snowbridge_pallet_system; use snowbridge_router_primitives::inbound::{ Command, Destination, GlobalConsensusEthereumConvertsFor, MessageV1, VersionedMessage, }; -use snowbridge_system; use sp_core::H256; const INITIAL_FUND: u128 = 5_000_000_000 * ROCOCO_ED; @@ -94,7 +94,7 @@ fn create_agent() { assert_expected_events!( BridgeHubRococo, vec![ - RuntimeEvent::EthereumSystem(snowbridge_system::Event::CreateAgent { + RuntimeEvent::EthereumSystem(snowbridge_pallet_system::Event::CreateAgent { .. }) => {}, ] @@ -168,7 +168,7 @@ fn create_channel() { assert_expected_events!( BridgeHubRococo, vec![ - RuntimeEvent::EthereumSystem(snowbridge_system::Event::CreateChannel { + RuntimeEvent::EthereumSystem(snowbridge_pallet_system::Event::CreateChannel { .. }) => {}, ] @@ -190,7 +190,10 @@ fn register_weth_token_from_ethereum_to_asset_hub() { chain_id: CHAIN_ID, command: Command::RegisterToken { token: WETH.into(), fee: XCM_FEE }, }); - let (xcm, _) = EthereumInboundQueue::do_convert(message_id_, message).unwrap(); + let (xcm, fee) = EthereumInboundQueue::do_convert(message_id_, message).unwrap(); + + assert_ok!(EthereumInboundQueue::burn_fees(AssetHubRococo::para_id().into(), fee)); + let _ = EthereumInboundQueue::send_xcm(xcm, AssetHubRococo::para_id().into()).unwrap(); assert_expected_events!( @@ -481,7 +484,7 @@ fn send_weth_asset_from_asset_hub_to_ethereum() { assert_expected_events!( BridgeHubRococo, vec![ - RuntimeEvent::EthereumOutboundQueue(snowbridge_outbound_queue::Event::MessageQueued {..}) => {}, + RuntimeEvent::EthereumOutboundQueue(snowbridge_pallet_outbound_queue::Event::MessageQueued {..}) => {}, ] ); let events = BridgeHubRococo::events(); diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml b/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml index 43579cfe5bb..5d0cb41395f 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/Cargo.toml @@ -91,7 +91,6 @@ bp-asset-hub-westend = { path = "../../../../../bridges/primitives/chain-asset-h bp-bridge-hub-rococo = { path = "../../../../../bridges/primitives/chain-bridge-hub-rococo", default-features = false } bp-bridge-hub-westend = { path = "../../../../../bridges/primitives/chain-bridge-hub-westend", default-features = false } snowbridge-router-primitives = { path = "../../../../../bridges/snowbridge/parachain/primitives/router", default-features = false } -snowbridge-rococo-common = { path = "../../../../../bridges/snowbridge/parachain/runtime/rococo-common", default-features = false } [dev-dependencies] asset-test-utils = { path = "../test-utils" } @@ -139,7 +138,6 @@ runtime-benchmarks = [ "parachains-common/runtime-benchmarks", "polkadot-parachain-primitives/runtime-benchmarks", "polkadot-runtime-common/runtime-benchmarks", - "snowbridge-rococo-common/runtime-benchmarks", "snowbridge-router-primitives/runtime-benchmarks", "sp-runtime/runtime-benchmarks", "xcm-builder/runtime-benchmarks", @@ -231,7 +229,6 @@ std = [ "primitive-types/std", "rococo-runtime-constants/std", "scale-info/std", - "snowbridge-rococo-common/std", "snowbridge-router-primitives/std", "sp-api/std", "sp-block-builder/std", diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs index 0423dd0ac86..3010cbc69fa 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs @@ -35,7 +35,7 @@ use assets_common::{ }; use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; use cumulus_primitives_core::AggregateMessageOrigin; -use snowbridge_rococo_common::EthereumNetwork; +use parachains_common::rococo::snowbridge::EthereumNetwork; use sp_api::impl_runtime_apis; use sp_core::{crypto::KeyTypeId, OpaqueMetadata}; use sp_runtime::{ diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs index 2826c18f3f7..121e213b57f 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs @@ -31,6 +31,7 @@ use frame_system::EnsureRoot; use pallet_xcm::XcmPassthrough; use parachains_common::{ impls::ToStakingPot, + rococo::snowbridge::EthereumNetwork, xcm_config::{ AllSiblingSystemParachains, AssetFeeAsExistentialDepositMultiplier, ConcreteAssetFromSystem, ParentRelayOrSiblingParachains, RelayOrOtherSystemParachains, @@ -39,7 +40,6 @@ use parachains_common::{ }; use polkadot_parachain_primitives::primitives::Sibling; use polkadot_runtime_common::xcm_sender::ExponentialPrice; -use snowbridge_rococo_common::EthereumNetwork; use snowbridge_router_primitives::inbound::GlobalConsensusEthereumConvertsFor; use sp_runtime::traits::{AccountIdConversion, ConvertInto}; use xcm::latest::prelude::*; @@ -817,7 +817,7 @@ pub mod bridging { 1, X2( Parachain(SiblingBridgeHubParaId::get()), - PalletInstance(snowbridge_rococo_common::INBOUND_QUEUE_MESSAGES_PALLET_INDEX) + PalletInstance(parachains_common::rococo::snowbridge::INBOUND_QUEUE_PALLET_INDEX) ) ); diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml index bc8fa72bb0b..849a4cf8cd6 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml @@ -108,16 +108,15 @@ bridge-runtime-common = { path = "../../../../../bridges/bin/runtime-common", de # Ethereum Bridge (Snowbridge) snowbridge-beacon-primitives = { path = "../../../../../bridges/snowbridge/parachain/primitives/beacon", default-features = false } -snowbridge-system = { path = "../../../../../bridges/snowbridge/parachain/pallets/system", default-features = false } +snowbridge-pallet-system = { path = "../../../../../bridges/snowbridge/parachain/pallets/system", default-features = false } snowbridge-system-runtime-api = { path = "../../../../../bridges/snowbridge/parachain/pallets/system/runtime-api", default-features = false } snowbridge-core = { path = "../../../../../bridges/snowbridge/parachain/primitives/core", default-features = false } -snowbridge-ethereum-beacon-client = { path = "../../../../../bridges/snowbridge/parachain/pallets/ethereum-beacon-client", default-features = false } -snowbridge-inbound-queue = { path = "../../../../../bridges/snowbridge/parachain/pallets/inbound-queue", default-features = false } -snowbridge-outbound-queue = { path = "../../../../../bridges/snowbridge/parachain/pallets/outbound-queue", default-features = false } +snowbridge-pallet-ethereum-client = { path = "../../../../../bridges/snowbridge/parachain/pallets/ethereum-client", default-features = false } +snowbridge-pallet-inbound-queue = { path = "../../../../../bridges/snowbridge/parachain/pallets/inbound-queue", default-features = false } +snowbridge-pallet-outbound-queue = { path = "../../../../../bridges/snowbridge/parachain/pallets/outbound-queue", default-features = false } snowbridge-outbound-queue-runtime-api = { path = "../../../../../bridges/snowbridge/parachain/pallets/outbound-queue/runtime-api", default-features = false } snowbridge-router-primitives = { path = "../../../../../bridges/snowbridge/parachain/primitives/router", default-features = false } snowbridge-runtime-common = { path = "../../../../../bridges/snowbridge/parachain/runtime/runtime-common", default-features = false } -snowbridge-rococo-common = { path = "../../../../../bridges/snowbridge/parachain/runtime/rococo-common", default-features = false } bridge-hub-common = { path = "../common", default-features = false } @@ -128,6 +127,7 @@ bridge-runtime-common = { path = "../../../../../bridges/bin/runtime-common", fe "integrity-test", ] } sp-keyring = { path = "../../../../../substrate/primitives/keyring" } +snowbridge-runtime-test-common = { path = "../../../../../bridges/snowbridge/parachain/runtime/test-common" } [features] default = ["std"] @@ -192,15 +192,14 @@ std = [ "serde", "snowbridge-beacon-primitives/std", "snowbridge-core/std", - "snowbridge-ethereum-beacon-client/std", - "snowbridge-inbound-queue/std", "snowbridge-outbound-queue-runtime-api/std", - "snowbridge-outbound-queue/std", - "snowbridge-rococo-common/std", + "snowbridge-pallet-ethereum-client/std", + "snowbridge-pallet-inbound-queue/std", + "snowbridge-pallet-outbound-queue/std", + "snowbridge-pallet-system/std", "snowbridge-router-primitives/std", "snowbridge-runtime-common/std", "snowbridge-system-runtime-api/std", - "snowbridge-system/std", "sp-api/std", "sp-block-builder/std", "sp-consensus-aura/std", @@ -251,13 +250,13 @@ runtime-benchmarks = [ "polkadot-parachain-primitives/runtime-benchmarks", "polkadot-runtime-common/runtime-benchmarks", "snowbridge-core/runtime-benchmarks", - "snowbridge-ethereum-beacon-client/runtime-benchmarks", - "snowbridge-inbound-queue/runtime-benchmarks", - "snowbridge-outbound-queue/runtime-benchmarks", - "snowbridge-rococo-common/runtime-benchmarks", + "snowbridge-pallet-ethereum-client/runtime-benchmarks", + "snowbridge-pallet-inbound-queue/runtime-benchmarks", + "snowbridge-pallet-outbound-queue/runtime-benchmarks", + "snowbridge-pallet-system/runtime-benchmarks", "snowbridge-router-primitives/runtime-benchmarks", "snowbridge-runtime-common/runtime-benchmarks", - "snowbridge-system/runtime-benchmarks", + "snowbridge-runtime-test-common/runtime-benchmarks", "sp-runtime/runtime-benchmarks", "xcm-builder/runtime-benchmarks", "xcm-executor/runtime-benchmarks", @@ -290,16 +289,16 @@ try-runtime = [ "pallet-xcm/try-runtime", "parachain-info/try-runtime", "polkadot-runtime-common/try-runtime", - "snowbridge-ethereum-beacon-client/try-runtime", - "snowbridge-inbound-queue/try-runtime", - "snowbridge-outbound-queue/try-runtime", - "snowbridge-system/try-runtime", + "snowbridge-pallet-ethereum-client/try-runtime", + "snowbridge-pallet-inbound-queue/try-runtime", + "snowbridge-pallet-outbound-queue/try-runtime", + "snowbridge-pallet-system/try-runtime", "sp-runtime/try-runtime", ] experimental = ["pallet-aura/experimental"] fast-runtime = [ - "snowbridge-ethereum-beacon-client/beacon-spec-minimal", + "snowbridge-pallet-ethereum-client/beacon-spec-minimal", ] # A feature that should be enabled when the runtime should be built for on-chain diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_ethereum_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_ethereum_config.rs index af2438efbcf..d633da2a8e7 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_ethereum_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_ethereum_config.rs @@ -15,13 +15,13 @@ // along with Cumulus. If not, see . use crate::{xcm_config::UniversalLocation, Runtime}; -use snowbridge_rococo_common::EthereumNetwork; +use parachains_common::rococo::snowbridge::EthereumNetwork; use snowbridge_router_primitives::outbound::EthereumBlobExporter; /// Exports message to the Ethereum Gateway contract. pub type SnowbridgeExporter = EthereumBlobExporter< UniversalLocation, EthereumNetwork, - snowbridge_outbound_queue::Pallet, + snowbridge_pallet_outbound_queue::Pallet, snowbridge_core::AgentIdOf, >; diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs index b1ff98491da..0052e9dcb38 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs @@ -71,8 +71,6 @@ use frame_system::{ }; use bp_runtime::HeaderId; -#[cfg(not(feature = "runtime-benchmarks"))] -use bridge_hub_common::BridgeHubMessageRouter; use bridge_hub_common::{ message_queue::{NarrowOriginToSibling, ParaIdToSibling}, AggregateMessageOrigin, @@ -102,17 +100,9 @@ use parachains_common::{ use polkadot_runtime_common::prod_or_fast; #[cfg(feature = "runtime-benchmarks")] -use crate::xcm_config::benchmark_helpers::DoNothingRouter; -#[cfg(feature = "runtime-benchmarks")] -use snowbridge_beacon_primitives::CompactExecutionHeader; -#[cfg(feature = "runtime-benchmarks")] -use snowbridge_core::RingBufferMap; -#[cfg(feature = "runtime-benchmarks")] -pub use snowbridge_ethereum_beacon_client::ExecutionHeaderBuffer; -#[cfg(feature = "runtime-benchmarks")] -use snowbridge_inbound_queue::BenchmarkHelper; -#[cfg(feature = "runtime-benchmarks")] -use sp_core::H256; +use benchmark_helpers::DoNothingRouter; +#[cfg(not(feature = "runtime-benchmarks"))] +use bridge_hub_common::BridgeHubMessageRouter; /// The address format for describing accounts. pub type Address = MultiAddress; @@ -154,7 +144,7 @@ pub type Migrations = ( InitStorageVersions, cumulus_pallet_xcmp_queue::migration::v4::MigrationToV4, // unreleased - snowbridge_system::migration::v0::InitializeOnUpgrade< + snowbridge_pallet_system::migration::v0::InitializeOnUpgrade< Runtime, ConstU32, ConstU32, @@ -512,7 +502,7 @@ parameter_types! { parameter_types! { pub const CreateAssetCall: [u8;2] = [53, 0]; pub const CreateAssetDeposit: u128 = (UNITS / 10) + EXISTENTIAL_DEPOSIT; - pub const InboundQueuePalletInstance: u8 = snowbridge_rococo_common::INBOUND_QUEUE_MESSAGES_PALLET_INDEX; + pub const InboundQueuePalletInstance: u8 = parachains_common::rococo::snowbridge::INBOUND_QUEUE_PALLET_INDEX; pub Parameters: PricingParameters = PricingParameters { exchange_rate: FixedU128::from_rational(1, 400), fee_per_gas: gwei(20), @@ -521,15 +511,46 @@ parameter_types! { } #[cfg(feature = "runtime-benchmarks")] -impl BenchmarkHelper for Runtime { - fn initialize_storage(block_hash: H256, header: CompactExecutionHeader) { - >::insert(block_hash, header); +pub mod benchmark_helpers { + use crate::{EthereumBeaconClient, Runtime, RuntimeOrigin}; + use codec::Encode; + use snowbridge_beacon_primitives::CompactExecutionHeader; + use snowbridge_pallet_inbound_queue::BenchmarkHelper; + use sp_core::H256; + use xcm::latest::{MultiAssets, MultiLocation, SendError, SendResult, SendXcm, Xcm, XcmHash}; + + impl BenchmarkHelper for Runtime { + fn initialize_storage(block_hash: H256, header: CompactExecutionHeader) { + EthereumBeaconClient::store_execution_header(block_hash, header, 0, H256::default()) + } + } + + pub struct DoNothingRouter; + impl SendXcm for DoNothingRouter { + type Ticket = Xcm<()>; + + fn validate( + _dest: &mut Option, + xcm: &mut Option>, + ) -> SendResult { + Ok((xcm.clone().unwrap(), MultiAssets::new())) + } + fn deliver(xcm: Xcm<()>) -> Result { + let hash = xcm.using_encoded(sp_io::hashing::blake2_256); + Ok(hash) + } + } + + impl snowbridge_pallet_system::BenchmarkHelper for () { + fn make_xcm_origin(location: MultiLocation) -> RuntimeOrigin { + RuntimeOrigin::from(pallet_xcm::Origin::Xcm(location)) + } } } -impl snowbridge_inbound_queue::Config for Runtime { +impl snowbridge_pallet_inbound_queue::Config for Runtime { type RuntimeEvent = RuntimeEvent; - type Verifier = snowbridge_ethereum_beacon_client::Pallet; + type Verifier = snowbridge_pallet_ethereum_client::Pallet; type Token = Balances; #[cfg(not(feature = "runtime-benchmarks"))] type XcmSender = XcmRouter; @@ -549,11 +570,12 @@ impl snowbridge_inbound_queue::Config for Runtime { type WeightToFee = WeightToFee; type LengthToFee = ConstantMultiplier; type MaxMessageSize = ConstU32<2048>; - type WeightInfo = weights::snowbridge_inbound_queue::WeightInfo; + type WeightInfo = weights::snowbridge_pallet_inbound_queue::WeightInfo; type PricingParameters = EthereumSystem; + type AssetTransactor = ::AssetTransactor; } -impl snowbridge_outbound_queue::Config for Runtime { +impl snowbridge_pallet_outbound_queue::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Hashing = Keccak256; type MessageQueue = MessageQueue; @@ -563,7 +585,7 @@ impl snowbridge_outbound_queue::Config for Runtime { type GasMeter = snowbridge_core::outbound::ConstantGasMeter; type Balance = Balance; type WeightToFee = WeightToFee; - type WeightInfo = weights::snowbridge_outbound_queue::WeightInfo; + type WeightInfo = weights::snowbridge_pallet_outbound_queue::WeightInfo; type PricingParameters = EthereumSystem; type Channels = EthereumSystem; } @@ -616,28 +638,21 @@ parameter_types! { pub const MaxExecutionHeadersToKeep: u32 = prod_or_fast!(8192 * 2, 1000); } -impl snowbridge_ethereum_beacon_client::Config for Runtime { +impl snowbridge_pallet_ethereum_client::Config for Runtime { type RuntimeEvent = RuntimeEvent; type ForkVersions = ChainForkVersions; type MaxExecutionHeadersToKeep = MaxExecutionHeadersToKeep; - type WeightInfo = weights::snowbridge_ethereum_beacon_client::WeightInfo; -} - -#[cfg(feature = "runtime-benchmarks")] -impl snowbridge_system::BenchmarkHelper for () { - fn make_xcm_origin(location: xcm::latest::MultiLocation) -> RuntimeOrigin { - RuntimeOrigin::from(pallet_xcm::Origin::Xcm(location)) - } + type WeightInfo = weights::snowbridge_pallet_ethereum_client::WeightInfo; } -impl snowbridge_system::Config for Runtime { +impl snowbridge_pallet_system::Config for Runtime { type RuntimeEvent = RuntimeEvent; type OutboundQueue = EthereumOutboundQueue; type SiblingOrigin = EnsureXcm; type AgentIdOf = snowbridge_core::AgentIdOf; type TreasuryAccount = TreasuryAccount; type Token = Balances; - type WeightInfo = weights::snowbridge_system::WeightInfo; + type WeightInfo = weights::snowbridge_pallet_system::WeightInfo; #[cfg(feature = "runtime-benchmarks")] type Helper = (); type DefaultPricingParameters = Parameters; @@ -703,10 +718,10 @@ construct_runtime!( // With-Rococo Bulletin bridge hub pallet. XcmOverPolkadotBulletin: pallet_xcm_bridge_hub::::{Pallet} = 62, - EthereumInboundQueue: snowbridge_inbound_queue::{Pallet, Call, Storage, Event} = 80, - EthereumOutboundQueue: snowbridge_outbound_queue::{Pallet, Call, Storage, Event} = 81, - EthereumBeaconClient: snowbridge_ethereum_beacon_client::{Pallet, Call, Storage, Event} = 82, - EthereumSystem: snowbridge_system::{Pallet, Call, Storage, Config, Event} = 83, + EthereumInboundQueue: snowbridge_pallet_inbound_queue::{Pallet, Call, Storage, Event} = 80, + EthereumOutboundQueue: snowbridge_pallet_outbound_queue::{Pallet, Call, Storage, Event} = 81, + EthereumBeaconClient: snowbridge_pallet_ethereum_client::{Pallet, Call, Storage, Event} = 82, + EthereumSystem: snowbridge_pallet_system::{Pallet, Call, Storage, Config, Event} = 83, // Message Queue. Importantly, is registered last so that messages are processed after // the `on_initialize` hooks of bridging pallets. @@ -758,10 +773,10 @@ mod benches { [pallet_bridge_messages, RococoToRococoBulletin] [pallet_bridge_relayers, BridgeRelayersBench::] // Ethereum Bridge - [snowbridge_inbound_queue, EthereumInboundQueue] - [snowbridge_outbound_queue, EthereumOutboundQueue] - [snowbridge_system, EthereumSystem] - [snowbridge_ethereum_beacon_client, EthereumBeaconClient] + [snowbridge_pallet_inbound_queue, EthereumInboundQueue] + [snowbridge_pallet_outbound_queue, EthereumOutboundQueue] + [snowbridge_pallet_system, EthereumSystem] + [snowbridge_pallet_ethereum_client, EthereumBeaconClient] ); } @@ -991,18 +1006,18 @@ impl_runtime_apis! { } impl snowbridge_outbound_queue_runtime_api::OutboundQueueApi for Runtime { - fn prove_message(leaf_index: u64) -> Option { - snowbridge_outbound_queue::api::prove_message::(leaf_index) + fn prove_message(leaf_index: u64) -> Option { + snowbridge_pallet_outbound_queue::api::prove_message::(leaf_index) } fn calculate_fee(message: Message) -> Option { - snowbridge_outbound_queue::api::calculate_fee::(message) + snowbridge_pallet_outbound_queue::api::calculate_fee::(message) } } impl snowbridge_system_runtime_api::ControlApi for Runtime { fn agent_id(location: VersionedMultiLocation) -> Option { - snowbridge_system::api::agent_id::(location) + snowbridge_pallet_system::api::agent_id::(location) } } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/mod.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/mod.rs index b134bb41ed1..aac39a4564f 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/mod.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/mod.rs @@ -40,10 +40,10 @@ pub mod pallet_utility; pub mod pallet_xcm; pub mod paritydb_weights; pub mod rocksdb_weights; -pub mod snowbridge_ethereum_beacon_client; -pub mod snowbridge_inbound_queue; -pub mod snowbridge_outbound_queue; -pub mod snowbridge_system; +pub mod snowbridge_pallet_ethereum_client; +pub mod snowbridge_pallet_inbound_queue; +pub mod snowbridge_pallet_outbound_queue; +pub mod snowbridge_pallet_system; pub mod xcm; pub use block_weights::constants::BlockExecutionWeight; diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_ethereum_beacon_client.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_pallet_ethereum_client.rs similarity index 97% rename from cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_ethereum_beacon_client.rs rename to cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_pallet_ethereum_client.rs index cd960597b44..0d5f29c6ff2 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_ethereum_beacon_client.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_pallet_ethereum_client.rs @@ -13,7 +13,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for `snowbridge_ethereum_beacon_client` +//! Autogenerated weights for `snowbridge_pallet_ethereum_client` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev //! DATE: 2023-06-08, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` @@ -47,9 +47,9 @@ use frame_support::{traits::Get, weights::Weight}; use core::marker::PhantomData; -/// Weight functions for `snowbridge_ethereum_beacon_client`. +/// Weight functions for `snowbridge_pallet_ethereum_client`. pub struct WeightInfo(PhantomData); -impl snowbridge_ethereum_beacon_client::WeightInfo for WeightInfo { +impl snowbridge_pallet_ethereum_client::WeightInfo for WeightInfo { /// Storage: EthereumBeaconClient FinalizedBeaconStateIndex (r:1 w:1) /// Proof: EthereumBeaconClient FinalizedBeaconStateIndex (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) /// Storage: EthereumBeaconClient FinalizedBeaconStateMapping (r:1 w:1) diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_inbound_queue.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_pallet_inbound_queue.rs similarity index 92% rename from cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_inbound_queue.rs rename to cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_pallet_inbound_queue.rs index f734227a411..faf404f90cb 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_inbound_queue.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_pallet_inbound_queue.rs @@ -13,7 +13,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -//! Autogenerated weights for `snowbridge_inbound_queue` +//! Autogenerated weights for `snowbridge_pallet_inbound_queue` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev //! DATE: 2023-09-06, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` @@ -45,9 +45,9 @@ use frame_support::{traits::Get, weights::Weight}; use core::marker::PhantomData; -/// Weight functions for `snowbridge_inbound_queue`. +/// Weight functions for `snowbridge_pallet_inbound_queue`. pub struct WeightInfo(PhantomData); -impl snowbridge_inbound_queue::WeightInfo for WeightInfo { +impl snowbridge_pallet_inbound_queue::WeightInfo for WeightInfo { /// Storage: EthereumInboundQueue PalletOperatingMode (r:1 w:0) /// Proof: EthereumInboundQueue PalletOperatingMode (max_values: Some(1), max_size: Some(1), added: 496, mode: MaxEncodedLen) /// Storage: EthereumBeaconClient ExecutionHeaders (r:1 w:0) diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_outbound_queue.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_pallet_outbound_queue.rs similarity index 97% rename from cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_outbound_queue.rs rename to cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_pallet_outbound_queue.rs index 6cffbc5344a..8adcef076e0 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_outbound_queue.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_pallet_outbound_queue.rs @@ -43,7 +43,7 @@ use core::marker::PhantomData; /// Weight functions for `snowbridge_outbound_queue`. pub struct WeightInfo(PhantomData); -impl snowbridge_outbound_queue::WeightInfo for WeightInfo { +impl snowbridge_pallet_outbound_queue::WeightInfo for WeightInfo { /// Storage: EthereumOutboundQueue MessageLeaves (r:1 w:1) /// Proof Skipped: EthereumOutboundQueue MessageLeaves (max_values: Some(1), max_size: None, mode: Measured) /// Storage: EthereumOutboundQueue PendingHighPriorityMessageCount (r:1 w:1) diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_system.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_pallet_system.rs similarity index 98% rename from cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_system.rs rename to cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_pallet_system.rs index 88c6c669c88..c6c188e323a 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_system.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_pallet_system.rs @@ -27,12 +27,12 @@ // pallet // --chain // bridge-hub-rococo-dev -// --pallet=snowbridge_system +// --pallet=snowbridge_pallet_system // --extrinsic=* // --execution=wasm // --wasm-execution=compiled // --output -// parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_system.rs +// parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/snowbridge_pallet_system.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -44,7 +44,7 @@ use core::marker::PhantomData; /// Weight functions for `snowbridge_system`. pub struct WeightInfo(PhantomData); -impl snowbridge_system::WeightInfo for WeightInfo { +impl snowbridge_pallet_system::WeightInfo for WeightInfo { /// Storage: ParachainInfo ParachainId (r:1 w:0) /// Proof: ParachainInfo ParachainId (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) /// Storage: EthereumOutboundQueue PalletOperatingMode (r:1 w:0) diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs index fc97a3ed89a..dc98622cafc 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs @@ -39,6 +39,7 @@ use frame_system::EnsureRoot; use pallet_xcm::XcmPassthrough; use parachains_common::{ impls::ToStakingPot, + rococo::snowbridge::EthereumNetwork, xcm_config::{ AllSiblingSystemParachains, ConcreteAssetFromSystem, ParentRelayOrSiblingParachains, RelayOrOtherSystemParachains, @@ -47,7 +48,6 @@ use parachains_common::{ }; use polkadot_parachain_primitives::primitives::Sibling; use polkadot_runtime_common::xcm_sender::ExponentialPrice; -use snowbridge_rococo_common::EthereumNetwork; use snowbridge_runtime_common::XcmExportFeeToSibling; use sp_core::Get; use sp_runtime::traits::AccountIdConversion; @@ -216,12 +216,12 @@ impl Contains for SafeCallFilter { WithRococoBulletinMessagesInstance, >::set_operating_mode { .. }) | RuntimeCall::EthereumBeaconClient( - snowbridge_ethereum_beacon_client::Call::force_checkpoint { .. } | - snowbridge_ethereum_beacon_client::Call::set_operating_mode { .. }, + snowbridge_pallet_ethereum_client::Call::force_checkpoint { .. } | + snowbridge_pallet_ethereum_client::Call::set_operating_mode { .. }, ) | RuntimeCall::EthereumInboundQueue( - snowbridge_inbound_queue::Call::set_operating_mode { .. }, + snowbridge_pallet_inbound_queue::Call::set_operating_mode { .. }, ) | RuntimeCall::EthereumOutboundQueue( - snowbridge_outbound_queue::Call::set_operating_mode { .. }, + snowbridge_pallet_outbound_queue::Call::set_operating_mode { .. }, ) | RuntimeCall::EthereumSystem(..) ) } @@ -492,22 +492,3 @@ impl, FeeHandler: HandleFee> FeeManager FeeHandler::handle_fee(fee, context, reason); } } - -#[cfg(feature = "runtime-benchmarks")] -pub mod benchmark_helpers { - use crate::{MultiAssets, MultiLocation, SendError, SendResult, SendXcm, Xcm, XcmHash}; - - pub struct DoNothingRouter; - impl SendXcm for DoNothingRouter { - type Ticket = (); - fn validate( - _dest: &mut Option, - _msg: &mut Option>, - ) -> SendResult<()> { - Ok(((), MultiAssets::new())) - } - fn deliver(_: ()) -> Result { - Ok([0; 32]) - } - } -} diff --git a/bridges/snowbridge/parachain/runtime/tests/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/snowbridge.rs similarity index 55% rename from bridges/snowbridge/parachain/runtime/tests/src/lib.rs rename to cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/snowbridge.rs index 9a5d12e2892..f32c6cae69c 100644 --- a/bridges/snowbridge/parachain/runtime/tests/src/lib.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/snowbridge.rs @@ -1,22 +1,37 @@ -// SPDX-License-Identifier: Apache-2.0 -// SPDX-FileCopyrightText: 2023 Snowfork +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Cumulus. -#![cfg(test)] +// Cumulus is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Cumulus is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . -mod test_cases; +#![cfg(test)] -use asset_hub_rococo_runtime::xcm_config::bridging::to_ethereum::DefaultBridgeHubEthereumBaseFee; use bridge_hub_rococo_runtime::{ xcm_config::XcmConfig, MessageQueueServiceWeight, Runtime, RuntimeEvent, SessionKeys, }; use codec::Decode; use cumulus_primitives_core::XcmError::{FailedToTransactAsset, NotHoldingFees}; -use parachains_common::{AccountId, AuraId}; -use snowbridge_ethereum_beacon_client::WeightInfo; +use frame_support::parameter_types; +use parachains_common::{AccountId, AuraId, Balance}; +use snowbridge_pallet_ethereum_client::WeightInfo; use sp_core::H160; use sp_keyring::AccountKeyring::Alice; -pub fn collator_session_keys() -> bridge_hub_test_utils::CollatorSessionKeys { +parameter_types! { + pub const DefaultBridgeHubEthereumBaseFee: Balance = 2_750_872_500_000; +} + +fn collator_session_keys() -> bridge_hub_test_utils::CollatorSessionKeys { bridge_hub_test_utils::CollatorSessionKeys::new( AccountId::from(Alice), AccountId::from(Alice), @@ -26,7 +41,7 @@ pub fn collator_session_keys() -> bridge_hub_test_utils::CollatorSessionKeys( + snowbridge_runtime_test_common::send_transfer_token_message_success::( collator_session_keys(), 1013, 1000, @@ -44,7 +59,7 @@ pub fn transfer_token_to_ethereum_works() { #[test] pub fn unpaid_transfer_token_to_ethereum_fails_with_barrier() { - test_cases::send_unpaid_transfer_token_message::( + snowbridge_runtime_test_common::send_unpaid_transfer_token_message::( collator_session_keys(), 1013, 1000, @@ -55,7 +70,7 @@ pub fn unpaid_transfer_token_to_ethereum_fails_with_barrier() { #[test] pub fn transfer_token_to_ethereum_fee_not_enough() { - test_cases::send_transfer_token_message_failure::( + snowbridge_runtime_test_common::send_transfer_token_message_failure::( collator_session_keys(), 1013, 1000, @@ -70,7 +85,7 @@ pub fn transfer_token_to_ethereum_fee_not_enough() { #[test] pub fn transfer_token_to_ethereum_insufficient_fund() { - test_cases::send_transfer_token_message_failure::( + snowbridge_runtime_test_common::send_transfer_token_message_failure::( collator_session_keys(), 1013, 1000, @@ -86,9 +101,9 @@ pub fn transfer_token_to_ethereum_insufficient_fund() { fn max_message_queue_service_weight_is_more_than_beacon_extrinsic_weights() { let max_message_queue_weight = MessageQueueServiceWeight::get(); let force_checkpoint = - ::WeightInfo::force_checkpoint(); + ::WeightInfo::force_checkpoint(); let submit_checkpoint = - ::WeightInfo::submit(); + ::WeightInfo::submit(); max_message_queue_weight.all_gt(force_checkpoint); max_message_queue_weight.all_gt(submit_checkpoint); } diff --git a/cumulus/parachains/runtimes/bridge-hubs/common/src/message_queue.rs b/cumulus/parachains/runtimes/bridge-hubs/common/src/message_queue.rs index 651537ff8b7..3e821d45569 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/common/src/message_queue.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/common/src/message_queue.rs @@ -26,7 +26,7 @@ use sp_std::{marker::PhantomData, prelude::*}; use xcm::v3::{Junction, MultiLocation}; /// The aggregate origin of an inbound message. -/// This is specialized for BridgeHub, as the snowbridge-outbound-queue pallet is also using +/// This is specialized for BridgeHub, as the snowbridge-outbound-queue-pallet is also using /// the shared MessageQueue pallet. #[derive(Encode, Decode, Copy, MaxEncodedLen, Clone, Eq, PartialEq, TypeInfo, Debug)] pub enum AggregateMessageOrigin { diff --git a/cumulus/parachains/runtimes/testing/penpal/Cargo.toml b/cumulus/parachains/runtimes/testing/penpal/Cargo.toml index a21023a9331..cc965c154c6 100644 --- a/cumulus/parachains/runtimes/testing/penpal/Cargo.toml +++ b/cumulus/parachains/runtimes/testing/penpal/Cargo.toml @@ -79,7 +79,6 @@ pallet-collator-selection = { path = "../../../../pallets/collator-selection", d parachain-info = { package = "staging-parachain-info", path = "../../../pallets/parachain-info", default-features = false } parachains-common = { path = "../../../common", default-features = false } assets-common = { path = "../../assets/common", default-features = false } -snowbridge-rococo-common = { path = "../../../../../bridges/snowbridge/parachain/runtime/rococo-common", default-features = false } [features] default = ["std"] @@ -121,7 +120,6 @@ std = [ "polkadot-primitives/std", "polkadot-runtime-common/std", "scale-info/std", - "snowbridge-rococo-common/std", "sp-api/std", "sp-block-builder/std", "sp-consensus-aura/std", @@ -166,7 +164,6 @@ runtime-benchmarks = [ "polkadot-parachain-primitives/runtime-benchmarks", "polkadot-primitives/runtime-benchmarks", "polkadot-runtime-common/runtime-benchmarks", - "snowbridge-rococo-common/runtime-benchmarks", "sp-runtime/runtime-benchmarks", "xcm-builder/runtime-benchmarks", "xcm-executor/runtime-benchmarks", diff --git a/cumulus/parachains/runtimes/testing/penpal/src/xcm_config.rs b/cumulus/parachains/runtimes/testing/penpal/src/xcm_config.rs index ed405aeddb3..9287ac30514 100644 --- a/cumulus/parachains/runtimes/testing/penpal/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/testing/penpal/src/xcm_config.rs @@ -40,9 +40,9 @@ use frame_system::EnsureRoot; use pallet_asset_tx_payment::HandleCredit; use pallet_assets::Instance1; use pallet_xcm::XcmPassthrough; +use parachains_common::rococo::snowbridge::EthereumNetwork; use polkadot_parachain_primitives::primitives::Sibling; use polkadot_runtime_common::impls::ToAuthor; -use snowbridge_rococo_common::EthereumNetwork; use sp_runtime::traits::Zero; use xcm::latest::prelude::*; #[allow(deprecated)] -- GitLab From c8112e2c6fd9f1f5e7cb767b682fda746fc00520 Mon Sep 17 00:00:00 2001 From: Michal Kucharczyk <1728078+michalkucharczyk@users.noreply.github.com> Date: Thu, 11 Jan 2024 01:30:32 +0100 Subject: [PATCH 147/191] frame-support: sp-runtime dependency updated (serde) (#2907) `frame-support` crate compilation fails (reported by @koute): ``` $ cargo check --no-default-features --target=wasm32-unknown-unknown error[E0277]: the trait bound `GC: Serialize` is not satisfied --> substrate/frame/support/src/genesis_builder_helper.rs:32:24 | 32 | serde_json::to_string(&GC::default()) | --------------------- ^^^^^^^^^^^^^^ the trait `Serialize` is not implemented for `GC` | | | required by a bound introduced by this call | note: required by a bound in `serde_json::to_string` --> /home/kou/.cargo/registry/src/index.crates.io-6f17d22bba15001f/serde_json-1.0.111/src/ser.rs:2209:17 | 2207 | pub fn to_string(value: &T) -> Result | --------- required by a bound in this function 2208 | where 2209 | T: ?Sized + Serialize, | ^^^^^^^^^ required by this bound in `to_string` help: consider further restricting this bound | 30 | GC: BuildGenesisConfig + Default + serde::Serialize, | ++++++++++++++++++ ``` This PR should fix this. For all runtimes `sp-runtime/serde` feature was likely enabled by this (and few other pallets): https://github.com/paritytech/polkadot-sdk/blob/f2a750ee86e72c9ab677aaf588d0a33ee8446bef/substrate/frame/system/Cargo.toml#L27 --- substrate/frame/support/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/substrate/frame/support/Cargo.toml b/substrate/frame/support/Cargo.toml index 32dcec727cc..04717c012f4 100644 --- a/substrate/frame/support/Cargo.toml +++ b/substrate/frame/support/Cargo.toml @@ -24,7 +24,7 @@ frame-metadata = { version = "16.0.0", default-features = false, features = ["cu sp-api = { path = "../../primitives/api", default-features = false, features = ["frame-metadata"] } sp-std = { path = "../../primitives/std", default-features = false } sp-io = { path = "../../primitives/io", default-features = false } -sp-runtime = { path = "../../primitives/runtime", default-features = false } +sp-runtime = { path = "../../primitives/runtime", default-features = false, features = ["serde"] } sp-tracing = { path = "../../primitives/tracing", default-features = false } sp-core = { path = "../../primitives/core", default-features = false } sp-arithmetic = { path = "../../primitives/arithmetic", default-features = false } -- GitLab From 578960f3ea4f1336167861df0b6eb6dc99b9eec6 Mon Sep 17 00:00:00 2001 From: Serban Iorga Date: Thu, 11 Jan 2024 11:39:33 +0100 Subject: [PATCH 148/191] Warp sync zombienet tests: add basic BEEFY checks (#2854) Part of https://github.com/paritytech/polkadot-sdk/issues/2787 This is an initial PR that adds some basic BEEFY checks to the warp sync zombienet tests. To be more specific, it does the following: - Changes the snapshot used by the warp sync zombienet tests to one built from an updated version of the kitchensink runtime, that supports BEEFY - Adds some basic BEEFY checks to the warp sync zombienet tests - Deduplicates some params of the warp sync zombienet tests, making them easier to extend --- .gitlab/pipeline/zombienet/substrate.yml | 22 +- .../zombienet/0001-basic-warp-sync/README.md | 31 ++- .../0001-basic-warp-sync/chain-spec.json | 150 ++++++++------ .../generate-warp-sync-database.toml | 7 +- .../0001-basic-warp-sync/test-warp-sync.toml | 8 +- .../0001-basic-warp-sync/test-warp-sync.zndsl | 16 +- .../0002-validators-warp-sync/chain-spec.json | 193 +----------------- .../test-validators-warp-sync.toml | 10 +- .../test-validators-warp-sync.zndsl | 23 +-- .../chain-spec.json | 193 +----------------- .../test-block-building-warp-sync.toml | 8 +- .../test-block-building-warp-sync.zndsl | 24 ++- 12 files changed, 176 insertions(+), 509 deletions(-) mode change 100644 => 120000 substrate/zombienet/0002-validators-warp-sync/chain-spec.json mode change 100644 => 120000 substrate/zombienet/0003-block-building-warp-sync/chain-spec.json diff --git a/.gitlab/pipeline/zombienet/substrate.yml b/.gitlab/pipeline/zombienet/substrate.yml index b687576267d..ca4daa01871 100644 --- a/.gitlab/pipeline/zombienet/substrate.yml +++ b/.gitlab/pipeline/zombienet/substrate.yml @@ -40,6 +40,16 @@ tags: - zombienet-polkadot-integration-test +.zombienet-substrate-warp-sync-common: + extends: + - .zombienet-substrate-common + variables: + # DB generated from commit: https://github.com/paritytech/polkadot-sdk/commit/2e4b8996c4924fc39f85198019039cf0987f89ec + # TODO: As a workaround for https://github.com/paritytech/polkadot-sdk/issues/2568 the DB was generated in archive mode. + # After the issue is fixed, we should replace it with a pruned version of the DB. + DB_SNAPSHOT: "https://storage.googleapis.com/zombienet-db-snaps/substrate/0001-basic-warp-sync/chains-510ac1c891afe26bad6fcd6d74185917b3fb1b4f.tgz" + DB_BLOCK_HEIGHT: 47222 + zombienet-substrate-0000-block-building: extends: - .zombienet-substrate-common @@ -50,7 +60,7 @@ zombienet-substrate-0000-block-building: zombienet-substrate-0001-basic-warp-sync: extends: - - .zombienet-substrate-common + - .zombienet-substrate-warp-sync-common script: - /home/nonroot/zombie-net/scripts/ci/run-test-local-env-manager.sh --local-dir="${LOCAL_DIR}/0001-basic-warp-sync" @@ -58,7 +68,10 @@ zombienet-substrate-0001-basic-warp-sync: zombienet-substrate-0002-validators-warp-sync: extends: - - .zombienet-substrate-common + - .zombienet-substrate-warp-sync-common + before_script: + - !reference [.zombienet-substrate-warp-sync-common, before_script] + - cp --remove-destination ${LOCAL_DIR}/0001-basic-warp-sync/chain-spec.json ${LOCAL_DIR}/0002-validators-warp-sync script: - /home/nonroot/zombie-net/scripts/ci/run-test-local-env-manager.sh --local-dir="${LOCAL_DIR}/0002-validators-warp-sync" @@ -66,7 +79,10 @@ zombienet-substrate-0002-validators-warp-sync: zombienet-substrate-0003-block-building-warp-sync: extends: - - .zombienet-substrate-common + - .zombienet-substrate-warp-sync-common + before_script: + - !reference [.zombienet-substrate-warp-sync-common, before_script] + - cp --remove-destination ${LOCAL_DIR}/0001-basic-warp-sync/chain-spec.json ${LOCAL_DIR}/0003-block-building-warp-sync script: - /home/nonroot/zombie-net/scripts/ci/run-test-local-env-manager.sh --local-dir="${LOCAL_DIR}/0003-block-building-warp-sync" diff --git a/substrate/zombienet/0001-basic-warp-sync/README.md b/substrate/zombienet/0001-basic-warp-sync/README.md index 1f8bddee640..62717a8582b 100644 --- a/substrate/zombienet/0001-basic-warp-sync/README.md +++ b/substrate/zombienet/0001-basic-warp-sync/README.md @@ -10,10 +10,10 @@ The `dave` node executed with `--sync warp` syncs database with the rest of the Database was prepared using the following zombienet file (`generate-warp-sync-database.toml`): ``` [relaychain] -default_image = "docker.io/parity/substrate:master" +default_image = "docker.io/paritypr/substrate:master" default_command = "substrate" -chain = "gen-db" +chain = "local" chain_spec_path = "chain-spec.json" @@ -32,32 +32,31 @@ The zombienet shall be executed with the following command, and run for some per ``` Once the zombienet is stopped, the database snapshot -(`{alice,bob}/data/chains/local_testnet/db/` dirs) was created using the following +(`alice/data/chains/local_testnet/db/` dir) was created using the following commands: ```bash -mkdir -p db-snapshot/{alice,bob}/data/chains/local_testnet/db/ +mkdir -p db-snapshot/alice/data/chains/local_testnet/db/ cp -r db-test-gen/alice/data/chains/local_testnet/db/full db-snapshot/alice/data/chains/local_testnet/db/ -cp -r db-test-gen/bob/data/chains/local_testnet/db/full db-snapshot/bob/data/chains/local_testnet/db/ ``` -The file format should be `tar.gz`. File shall contain `local_testnet` folder and its subfolders, e.g.: +Sample command to prepare archive: ``` -$ tar tzf chains.tgz | head -local_testnet/ -local_testnet/db/ -local_testnet/db/full/ -... -local_testnet/db/full/000469.log +tar -C db-snapshot/alice/ -czf chains.tgz ./ ``` -Sample command to prepare archive: +The file format should be `tar.gz`. File shall contain `local_testnet` folder and its subfolders, e.g.: ``` -tar -C db-snapshot/alice/data/chains/ -czf chains.tgz local_testnet +$ tar tzf chains.tgz | head +data/chains/local_testnet/ +data/chains/local_testnet/db/ +data/chains/local_testnet/db/full/ +... +data/chains/local_testnet/db/full/000469.log ``` Also refer to: [zombienet#578](https://github.com/paritytech/zombienet/issues/578) -The `raw` chain-spec shall also be saved: `db-test-gen/gen-db-raw.json`. +The `raw` chain-spec shall also be saved: `db-test-gen/local.json`. # Where to upload database The access to this [bucket](https://console.cloud.google.com/storage/browser/zombienet-db-snaps/) is required. @@ -81,8 +80,6 @@ Test can be run with the following command: zombienet-linux test --dir db-snapshot --provider native test-warp-sync.zndsl ``` -*NOTE*: currently blocked by: [zombienet#578](https://github.com/paritytech/zombienet/issues/578) - # Save some time hack Substrate can be patched to reduce the grandpa session period. diff --git a/substrate/zombienet/0001-basic-warp-sync/chain-spec.json b/substrate/zombienet/0001-basic-warp-sync/chain-spec.json index 8c09e7c7b03..ab0c5bd0898 100644 --- a/substrate/zombienet/0001-basic-warp-sync/chain-spec.json +++ b/substrate/zombienet/0001-basic-warp-sync/chain-spec.json @@ -3,7 +3,7 @@ "id": "local_testnet", "chainType": "Local", "bootNodes": [ - "/ip4/127.0.0.1/tcp/30333/p2p/12D3KooWFvMbTsNZ8peGS8dbnRvNDBspstupzwYC9NVwbzGCLtDt" + "/ip4/127.0.0.1/tcp/36639/ws/p2p/12D3KooWQCkBm1BYtkHpocxCwMgR8yjitEeHGx8spzcDLGt2gkBm" ], "telemetryEndpoints": null, "protocolId": null, @@ -16,11 +16,17 @@ "raw": { "top": { "0x074b65e262fcd5bd9c785caf7f42e00a4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x08c41974a97dbf15cfbec28365bea2da4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x08c41974a97dbf15cfbec28365bea2da5e0621c4869aa60c02be9adcc98a0d1d": "0x08020a1091341fe5664bfa1782d5e04779689068c916b04cb365ec3153755684d9a10390084fdbf27d2b79d26a4f13f0ccd982cb755a661969143c37cbc49ef5b91f27", + "0x08c41974a97dbf15cfbec28365bea2da8f05bccc2f70ec66a32999c5761156be": "0x0000000000000000", + "0x08c41974a97dbf15cfbec28365bea2daaacf00b9b41fda7a9268821c2a2b3e4c": "0x08020a1091341fe5664bfa1782d5e04779689068c916b04cb365ec3153755684d9a10390084fdbf27d2b79d26a4f13f0ccd982cb755a661969143c37cbc49ef5b91f27", + "0x08c41974a97dbf15cfbec28365bea2dac713b7f8b14e2815d297585d3581e774": "0x0101000000", + "0x08c41974a97dbf15cfbec28365bea2dad47cb8f5328af743ddfb361e7180e7fcbb1bdbcacd6ac9340000000000000000": "0x00000000", "0x0e7b504e5df47062be129a8958a7a1271689c014e0a5b9a8ca8aafdff753c41c": "0xe8030000000000000000000000000000", "0x0e7b504e5df47062be129a8958a7a1274e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x0e7b504e5df47062be129a8958a7a127ecf0c2087a354172a7b5a9a7735fe2ff": "0xc0890100", "0x0e7b504e5df47062be129a8958a7a127fb88d072992a4a52ce055d9181748f1f": "0x0a000000000000000000000000000000", - "0x0f6738a0ee80c8e74cd2c7417c1e25564e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x0f6738a0ee80c8e74cd2c7417c1e25564e7b9012096b41c4eb3aaf947f6ea429": "0x0100", "0x1809d78346727a0ef58c0fa03bafa3234e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x1a736d37504c2e3fb73dad160c55b2914e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x1cb6f36e027abb2091cfb5110ab5087f4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", @@ -32,81 +38,80 @@ "0x2099d7f109d6e535fb000bba623fd4404e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x2099d7f109d6e535fb000bba623fd4409f99a2ce711f3a31b2fc05604c93f179": "0x08d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48", "0x267ada16405529c2f7ef2727d71edbde4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef734abf5cb34d6244378cddbf18e849d96": "0x00000000071c0d84db3a00", + "0x26aa394eea5630e07c48ae0c9558cef734abf5cb34d6244378cddbf18e849d96": "0x0000000007662b322013223b2000", "0x26aa394eea5630e07c48ae0c9558cef74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9007cbc1270b5b091758f9c42f5915b3e8ac59e11963af19174d0b94d5d78041c233f55d2e19324665bafdfb62925af2d": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da923a05cabf6d3bde7ca3ef0d11596b5611cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da932a5935f6edc617ae178fef9eb1e211fbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0x000000000300000001000000000000000000a0dec5adc935360000000000000000000000000000000000000000000000000064a7b3b6e00d0000000000000000000064a7b3b6e00d0000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da94f9aea1afa791265fae359272badc1cf8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95ecffd7b6c0f78751baa9d281e0bfa3a6d6f646c70792f74727372790000000000000000000000000000000000000000": "0x0000000000000000010000000000000000407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96f2e33376834a63c86a195bcf685aebbfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0x000000000300000001000000000000000000a0dec5adc935360000000000000000000000000000000000000000000000000064a7b3b6e00d0000000000000000000064a7b3b6e00d0000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da98578796c363c105114787203e4d93ca6101191192fc877c24d725b337120fa3edc63d227bbc92705db1e2cb65f56981a": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b0edae20838083f2cde1c4080db8cf8090b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b321d16960ce1d9190b61e2421cc60131e07379407fecc4b89eb7dbd287c2c781cfb1907a96947a3eb18e4f8e7198625": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9de1e86a9a8c739864cf3cc5ec2bea59fd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9e5e802737cce3a54b0bc9e3d3e6be26e306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9edeaa42c2163f68084a988529a0e2ec5e659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f3f619a1c2956443880db9cc9a13d058e860f1b1c7227f7c22602f53f15af80747814dffd839719731ee3bba6edc126c": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9007cbc1270b5b091758f9c42f5915b3e8ac59e11963af19174d0b94d5d78041c233f55d2e19324665bafdfb62925af2d": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da923a05cabf6d3bde7ca3ef0d11596b5611cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da932a5935f6edc617ae178fef9eb1e211fbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0x00000000030000000100000000000000010064a7b3b6e00d000000000000000000000000000000000000000000000000000064a7b3b6e00d000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da94f9aea1afa791265fae359272badc1cf8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95ecffd7b6c0f78751baa9d281e0bfa3a6d6f646c70792f74727372790000000000000000000000000000000000000000": "0x0000000000000000010000000000000000407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96f2e33376834a63c86a195bcf685aebbfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0x00000000030000000100000000000000010064a7b3b6e00d000000000000000000000000000000000000000000000000000064a7b3b6e00d000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da98578796c363c105114787203e4d93ca6101191192fc877c24d725b337120fa3edc63d227bbc92705db1e2cb65f56981a": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b0edae20838083f2cde1c4080db8cf8090b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b321d16960ce1d9190b61e2421cc60131e07379407fecc4b89eb7dbd287c2c781cfb1907a96947a3eb18e4f8e7198625": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9de1e86a9a8c739864cf3cc5ec2bea59fd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9e5e802737cce3a54b0bc9e3d3e6be26e306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9edeaa42c2163f68084a988529a0e2ec5e659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", + "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f3f619a1c2956443880db9cc9a13d058e860f1b1c7227f7c22602f53f15af80747814dffd839719731ee3bba6edc126c": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x3104106e6f6465", + "0x275bb9277673f20fc2801bcda9e63d2e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x2aeddc77fe58c98d50bd37f1b90840f94e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x2b06af9719ac64d755623cda8ddd9b944e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x2b06af9719ac64d755623cda8ddd9b944e7b9012096b41c4eb3aaf947f6ea429": "0x0100", "0x2b06af9719ac64d755623cda8ddd9b949f99a2ce711f3a31b2fc05604c93f179": "0x08d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48", "0x2c5de123c468aef7f3ac2ab3a76f87ce4e7b9012096b41c4eb3aaf947f6ea429": "0x0400", "0x2f85f1e1378cb2d7b83adbaf0b5869c24e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0x2f85f1e1378cb2d7b83adbaf0b5869c298ef7dc060436e4ed803af07632b89b65153cb1f00942ff401000000": "0x601de9615313b00e8cea3ef84e79e50b2fb70e2c8a47cff478b9fe8b3fa8f2db02000000", - "0x2f85f1e1378cb2d7b83adbaf0b5869c298ef7dc060436e4ed803af07632b89b6b4def25cfda6ef3a00000000": "0x601de9615313b00e8cea3ef84e79e50b2fb70e2c8a47cff478b9fe8b3fa8f2db02000000", + "0x2f85f1e1378cb2d7b83adbaf0b5869c298ef7dc060436e4ed803af07632b89b65153cb1f00942ff401000000": "0xf6abb8e2242d0084dad2c0afef26d70268e93e7e6072ae40949c58fc53713ec402000000", + "0x2f85f1e1378cb2d7b83adbaf0b5869c298ef7dc060436e4ed803af07632b89b6b4def25cfda6ef3a00000000": "0xf6abb8e2242d0084dad2c0afef26d70268e93e7e6072ae40949c58fc53713ec402000000", "0x2f85f1e1378cb2d7b83adbaf0b5869c2ff3ae12770bea2e48d9bde7385e7a25f": "0x0000000002000000", + "0x362ae49268098c4c7de8029927a1df2f4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x39deaa720535a0afa236c5679f4b23934e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x3a0e22bc6b9ec8129f8b37b4779576b24e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x3a2d6c9353500637d8f8e3e0fa0bb1c54e7b9012096b41c4eb3aaf947f6ea429": "0x0400", "0x3a2d6c9353500637d8f8e3e0fa0bb1c5ba7fb8745735dc3be2a2c61a72c39e78": "0x00", - "0x3a636f6465": "0x52bc537646db8e0528b52ffd0058dc2705bea5c66d15541040ac6c3ae971bcf5f1040221a8d1f8b7c17e61bf21cce87411480b10bd8daa5e3c2b65f8c4aa364e5a8ddf27c0313827d06a2d6334e074db9ca7d876ac8d052862b9984530f4d340bda4edddd6e4de5ba624536717e1139e14df2d875c7f7086dc3fa3d398b64f50fffc58fbf4fb73ffb0d39cc2b86761cfe6d3073b9c1fcee7fe611b7f4875f9a7d8cfe208fdf493f4d3b07d9a73ad05c8cf39e5c4dde679c3c8391b9ceec4fd78c824d218e4cfb79cb8be9cb301eace3b7f8a274c182edb72e2e83349855e7e4a2a795d7e27998b94f46d92b42eb543afcbcf5f5c9e5bf2d52dfd9b2f93dc33262710e3fc79b943e09fe2d00f8dd7edc4350b92a692a2facb7adddffddd3d89e9babb7b8e0b9d61050b2b4ddf3efdfdb3f629e9edfe9c18c4f8715bebf42d6f6e3ff74be1b9c0c8b9187cb89c83618e5bce6ebf90cb3918729745244063391ee9710cdb87bfbbbffc6047f275725e904518e7f53cec48efa788c4bd67d104a4eb81534cd2bd67cbeebb075b4c32deee59a43da30fd2d0c979410f3db2fb2972cfcad89d0f822c7ab644bade3b59d6eeddc9925eef8f34e8645980eb0fb2f8d9b2cafddec99273d7bf234bee5995292c3051e1fa97dcb31285eb5f76255cff23de917c3f72c8afaeaeac6ef74e96462e7d70864ed2ef48be2c9ef05d8f1cfa6e67cb79dd0ecdabababab5b225d7f4a72cfa6a53d9bcf739903246f521840fe916b813c65e41c0c50b7b60fe76078bafc61ff4c1bbfac7d3887b3bafc37979f73580490ef389f9f5920c8edc3f3cee7075fdc3e4cdba79f1f9c200db97df896f532c31e008355cff83a7dff7e1791b4e5097b400cb89ef19def24533b4524b567fe2c96c02292fe233d5900f2edfed96d8f34d29c2680f3270934e67054b7a4b7bfceaf95fd879b568e777e395e3aa7139fded3ff484f77779fef3ebbbfdeb6364afae9f74c32bf6dd9ef3de714c839e5df7e908f8c208b30f2fbb388847f8a2354c1e170305cb6dcb3b2de7eb0436e9ff9edc33deb3fd24ed29ef50f602cc7dbfda0ac7df8f683331cdba73fd63efefdb2f699b79f45244e492a38b708a9def9f54e6ba3643efdf9d41acdeb964524d396f3ce3fd247fa2f7380e4736a01f2e59c72bcfd606d9fb266c81ce3fc32bc0d3a198071be3f3f8b27cc0f725b7bc6cf3d2be99da45f916a7e3f38c349d21b7211a2597587be4b05e6ceef17b908d1c4dd21112e95f0ceef777111a289bb43225c2ade9ddfffe2224413778744b8f3fb594c4271b83bff48831d3217995ffa73cff86bfb94f3faf3834ed69ef11719fdf9592481f68cdf6ded19ff91063b9c64df908b10cddca5e2ddf9fd2217219ab83b24c29ddf3fc51346dc9d1fb60fdf7e16934cdc9d7fa48ff4913ed24c72cff839a76dd0789903a49e5d06c80dcee7f629f9a7e59ef1f323cd2903720ee774f91b22454f610414ad21610c79c190160c991a32c6102286c0604808865831440c2057860431c469881042da10f28221370c9961881742e6186245881c426630248b1035848421248e214d42de18b224644a081b42bc08a11212032164081943081842d6102203212e102286902e84782184cb902d845821a44ac8154248304520a449080d3d36e8a9ea99a3478e9e387ad4e8f1d233464f0c7a723d5b7aace849414f153d24e839a247aa678b1e287a9ee889ea71a207891e237a44d053821ea89e247a94e81941cf0a7a5ad0c3821d11f448d1d3448f163c3af070a046c68e1a3b69eca0b173c68e193b65ecc060478c9d17ec84b103c64e979d2f76bcd8e982878947069e251e259e241e2b3c31f0c0c083dbb9dab963c78e9d3776e0d891c1ce971d2e3b2ed8e162678b9da99d1becd86087063b74ecccb133831d3976e2d8a963c76aa7063c1be0b9b293c50e163b2cd859c18e0a76a476aed8b162a78a9da89d12ec3cb143821d26768cd82962c769e7879d1b767cd80162c7033b42ec7460070440ec0072c70e13901b00b9da69dab101481640ba00f102880b807001b20490278094000813407e000204902cb51acc20a61390a51a0d80c850fb52bba376558ba3660710a5da1c409280e06a5635388058a9cda026478d8e9a1bb5aada1b35366a30a86d51aba236454d899a096a4c0059a386a546430d57b3528361e76987089d2f74dcd0a9d25943270d1d2a1d18e88ca123860e1b3a73e880a123874e0c74e0d02943270c9d3674ccd0214387063a32d0a9814e171d2b9d3774d0d0a143470d9d17e8cc40270e1d2f3a67e808a143848e077478d0c9a263834e0d3a34e8e0a0d3019da61f6afc80e3c71a3fc2f8d1821f5dfcd8e207173fbc981ef8f1c40f277e90e047133f98f8b1c4ab04f34b8f0c604288573fbebca26a54d0c8f083aa2af9f0c2c71735197e88a1d3c33787ec8e9009f6434d1b36573a869a0bbc2f3a778473d49e422ec2168453e11630203c1bfce0522347784527869a17542d68984219603d7442c086a8f902e34167294cea425023469df26e50e3a5878c70a926d5259b1d6267c8bebc5eb0d303cc03a1d2384307467490a583a70e74a851eaa0033d8e10bfc070a8568c3db8be78687c74f408e2c545b481cb4a8f14e06c51657851856d8c3bc8bc78c5c047d40f2d6476c83421bb416581cb062f2f2f34646ed42d7c24e164f1ec78a9e15223e6c54b63d4e2c38a48c78c1d95a9068d5a11f54aad04b51d5c68b86010adc61a6ad4a0597aa541a39463031033726aa08901c9445e21ade05841c6602307a9f423f827300d1b19f4d4f1657000825718382da827e8b0886ef4808123021c23708ae809030704384ce02c81c3054709215d709cf8f1c1f900ce062a10383e8852b468d0b2c26962c686991a7048b09303ce08704a504bc306861a326ad8b0d9400d0c6ac0c8990187861a3a74385063464fe12ce1c4e003063ec6f831831e40f4f0c04b8c1f67782ce8d104a8460fa79d257afcd003043fcc905981103764a2e8a1030803d005433e007ab179b201818d10f406a01dd48ece868e0956431743dd42bff4e8402743074387ebac74576a0a2a15758aae06b1aadbc07f60c68c971daf2f558a1e5a3aa577aae9a24bea66a077b8946a9868c8a0a1010d1d3435a061636606345e66e2a091c18c1c346bd0a83143c7cc1c3469ec0411ce40860b4d0b605a68585093aa69a131a25ba2c982e605b52d343e8c1bb0c901f6011808604f3c88784551b9c8ae646dc072f820fe88991bbcc0e88ae888e88c70c9d03dc18aa8319851a3f683c8c60c1a325f646e206303992b19ab191a66b0c850f1a282460c9c20707ac00142e60a192b6049302b3255c8a4e03df03f00d181831d4419d4c6b0517a55895334493b30b41534565c4b2e1ccca99682300d980e5e0d6057604cf306e31a3655231b3e62f08241f5e245c66b0c0eb48c408c3f8c1eb08943868b07e2d5454d1aaf2b5e5b6cdc78a9604c0387089c271928402e5e55d86001af6aba8871d4d0a0070f3634d4d8d1c3071b2b21ce268b8d0d3367d4bc01bba1c68d1f2ea859e387979a18c09a6c7880d95073364b3565d0ab9a19d4b2b091e175831a2b180d3859d4d421b6f17ae2d5c4cb891f37a89101784718c3cb0697198e858f261717ae12b846e02ac2b585eb042e295c53b8927081c015e59a72b5c07584ab0617169716ae14b8b270f5e0f2800b0bd710ae255c4eb884706d7129e17ac2b5838b07d70f2e1b5c50b8a270657171c065848b05ae15b8987055e1bac275832b07d7932b042e205c1f7005e15241cf54cd183364b862a8b99a2943ac439cc3e606110e9106e21be21d40bec0711273220a8068b169c3956433c3aca3c6c4b303073cbccee891c30e0e385c841b7899a1e30510aa1a143555b5276a4e4c2d707ee080033b576021d88961a7069c295810af357464086100bfe0203141600387cc13322600bbc0f100e8458f25c02dc030769a00c1787d51b1709d51b3807140acc1cb8b9a06ce11343000c204a40c58075e65d868a9b1012ba9fe00dba1034137448ba047053369bc6cf0838d1e3df464515bd0566ab8ecf0a0d34563f1d9507bc0116205162a544da22e5195a81e783272a2462a9e8b189731052e3b64553eb8689911bee18901048d57171d2d3836e0d48033838e0e325f006143c68b8f06b5a57a458c8b2ae5aa636c72a5d1e303a21db58a1a11b5281f31e058a92800a2850f18ea0a5e50d4cc21dea0a606231a43b8801101f321b4e25b8833a82a10e5a849c2d10296c533e3470c6a5c5073064e08bc1fbc19bc2b5e0c3d33e8b1a367e81a7a072057b4161b1d76b4b8c2a01903e452bb41cf17206a0021a3cb0244059d53a743d7d4d1d075a0d3d2fdd005d1c305080f3d5d741ce87ce87ae878e880e0d1d2edd079a0cba1fb40874377031016e00c61f3464d0daf0d9d1c7ab010b700d7d0b9a1870d73861b367676e0e14167079e2606e060c101838621e3820ea39de8259a896ea29fe82e1dd55f34091a0a97aa5cfc106fc423417304cd123448e41891e38408845884e834163192603402e4400d23c6464c8e980c649e64909029a207971e60f4e822a7889c12e488409c41e4808885468a460b1a15c4ba88c120e60558450503b442d64566860c8c19ab993b66eae8b1460f1af460237644ac043124782cf168e22143ab8adaa56545cb8bda45eb8b2fe245f042f838818f2d3e50f02178103c11b12b625bc4a44627c629c6a81814b12d3113f810c207123e86a8d9e0b9e1d1e1bd018301ac0cd8182316a31763163eacf0d1021f57c8acd00981ec8a0f86efca1783a884480271095087ea0270872a06a8e585e5b5c38b86d612b5205a4c842c08c908b1a835d42cd586fa058d153eb4f808c2070fad21ea0b5a21086f107e69bd117620ecc1d3a2268697453746774617032058d870c026861aaa9a1bd8d450e3854d520d1c364d3638d4dc5113860dae260e1ba69a2f80cca16307101bec28d145f42cd136340d4056d0589aa973681e3acb9ca3710d03902ee6d5acc1b4c184a3c76a5acdaa49032052736ab66066b164a260b2604e31a5983f4ca989c584629e60e6a609261573cbfcc05cc1b46246318998219843cca46965c6309f260c1357c50215983e3c994d4ea8b820a505a1261098400424f08006a49000144e40c001941820090953082300100091282c38c07979c648c16a072a6a528125539a00b1b0640938fd4914a0254b5abf8127529c003dc1f92b5c548401202551a440292a025a00f94c1cbc0c34bf24d4c40914222946455058f0e0956c3e89895a68e1f556b8a80848a8c7c7c0310f03b7700099c7f1e05c090935712224d48400349c3bb848084a1323a0274b80802cf0018e1d2cc50251a02cc10011900b434ba04cb94651805ac04013141ee70b03ad7003067a22c5c992274da4084d71c1060c64d4048a519426464551a0c870ea6021a1264e8c9c3421328a228500301c2b067212454a94254d9c44918200a3282e4871e2e4f6c0a9019429170345500a80814be2d020041c3a7270e660189c19b01ccc82132953806c70e26022175680628128529c2c8132e50255a0894d06a78a8b9e1035b90010d19215a24079120568ca1228536e91901429284481d2821404581c38780a14168a8880a25c40ca120c00057d80f3063f018ab20294a2282e18357122850a14178680961811499902444404c70d7e026589115011910b4e6870dae0222028465088a4b060e44293252b2c8132e53699f2244a1322127ce0c8802f0065ca25020a2292e28013481c361808c80520171290c213a015566892c20f9c35b828c809100b4ebc7091511420222016a240791c35a240b1800d4e1aec044a5114284446558096604068ca94264b88809e084171c116e4448a90ed06070d6e614913a3264f9a18011d0086734606a00835816204250a14191c3338c88914a10a2c013272c109501520189c3298480a01429e404215686214c5050b2c3172024404e54914284b96d0e880367c2083918403c3ca97cb4820e770b83b919cc66355b1aae694f951efc6c6fb273d1bcff3bc27c99b1b8ffc1beadfc75f7f5d6b77adb39bf963effa7d5d2be576e68ffb03e9f4fad1a6def7791fd013fe987a7b5f777fb4995b74ff9add99b2338b226566ffd8fbbe9deea87760f7d755efcfbbfb1b476ef70aced44a99ba7762f56e96d8ac3a99bac74ce64a65cd72cf9d3f0fdbe9d7ec2f661bfe987ecceca4dde9e73895dbbb72f5cf690794fac7edb4d93f76fa71d3ef73f7bc8fb6536766ca9429534ad9fb28f5f6ef83317b53a64c993fca4e653e66a7cced9476bb575ae5cafef19021428430c8eed4e5a20e7a575abbdd0586cc937a5ead1f738fcc9f3b6598bb5377efd1dd2be0eeb0eab5d6dae3d8b4dbdde79c3e67d3f6f6a6d4bbbf6edaecd46beaf5fc2af5c09d3af5599dddbf70c645db43f7daa42ba5ee2ff6f656bb7fee1574265d57ef4a7b093b8d31b37fd3dd41b052a069482b0dc31aef1a760fc309788712a8719ed3bf5ab97b727fdc13e4eb09e21e0176770a1386ddd3b9bb99fba3f9421aeace94db2140a97baeaf7eeef4f3a8473d66af52eade5fb7fb473fef8ffbc6fb3effe6fc981bf600dab4ddbb2937b37fdd1f7bceee7d2008a34054a820303bbfda1dc0cc3e3bef98b9fb989bb9eb66c7ac6eba772c67ee58ecccdd64ef581d77ce9a5dd771d7755d73d779c71db3983b666618666f6731c73033b35831cc95997aadeedd9f7b8e7b7737a51ed0ee80f6cbddbfe6699e6e8fba7703ba76f7a49501ed7937ad1fe5e9cddd1f7f5fc7d49dba376d4f61d20528c0030e9d7f780218051ad6f41ac7a969202774cb7cddb06eeafd79b57e8e0098ce016a351d6f1a86ec734e9eacf6febeef874c7ba594c62adb7ccc95a73bedd0dd457710e6e476b06d427666a6dd4ca33edd41f77228655a29ad94b6f70ca5b45217a5d4044a5db429f5da5e2b58bfaf6777fb6cfe3e9c0efae3e993d99550e7ea6cc3ce6266af71f7cf6b6776f630c63e67c8ede2768ecd364077e8edce727767d51866f7ca732661febc69f3474343536b7dbd5e73ce5adbbd84f6f6aa57efd09d046feaeefe7277eef9f5d7947e1f87cedeee4dab778314ac2085e9eee6ea9f37280382ec3ed929ad15a4947e1ff7d7d49d7d4e0ec3574e873e42483d44e2341e76bb7bddcdeeeeecfc7ddc55669e9f659cf979e8ec79dd4eabd7dab47af5efebaed56937add4a35e53da3da7cf39270c4c7be73c3bca6af72e403b28d33dfba360d7fc79d8dd9336a594b67f4e00dbc7edec3d99bbdd3fff3e76e6767667766f6766a6a0e73ebdbda977f7f4cf999d5266fed89ddb9d32333365fe98bfef6b76ff989d7a5f6f7766767777fed8bddbbbbf23dff7cd6aedafcee97d3319113c99effbbcef930d4000edc950af7e9fabbdfdfbbeefebfebe98f77dfc7d9ff3f77decf4fb78ec9a366d9036edcfdbddbd73ea7ded1fcf39448a2153380f6e0c10496901a805cf8805a448219a0242009e0011013d2192b2c427841e20284446207c0043d323a5a60b72d2a402424252402852d3c3470f1a1e464550aa00dd742d48e981620120a22996031b98284053a634b9f10b00450122ea0e5a806214c50522cb81058c5ce8c14115201696184581423465899322282ddc0cf1e95145ca058c7c3461a1c8475013274e80827c42e8e1c14188f40459d20314d444a8024b5688028585a2262cbc102128413c00f8800807690244e4032868895115a0283a3e3e807922048505274b8c845c686201a027b4ce88a88951d1073d1cfcac00a5888c7190220c00052d710245a8022e4c99111575d0e29ea22220a2292d4871b28408888a142740444b9a143d7102b42448904f083d539c0015fdb0587062d4a4024b58288212058a05661f60c002508880a870608980a200adb00400414208a1e709d0122946533040e4a4039610101520a125559ab480035b418ad09215a240596105294234b3051f0c446401275284849adcc054017a12054acc94169a181501b500c5e87b449102c5c84993a2284d888c96184169a1022e14d1584f80808a96b420e5499426443606c8a88951d1922022291730028a92032bf2596116821150d19227519a2c01226a32a5052943c62640424e9600add084488a51d112a1264ea4088140250a90b338c8922852a014110151594224c5a8c91328424da82c2982b2240a94262c38b18005a42c31aa02c401952840fe03aba3f986d44cf805a466c28dc462c247472c9009b7c20e09e9e8e8ab48ee47484820528b09231d1dbd8e8e68bb33399a4847474794c9d13cbacddb64f2c27c611e1d1d1d1d3192787474243261a48f8f908e909c9190e6d1d16482348f909ac96dde6ecde485f9c20bcd848f90909cc9d13c3a6a2647f36832e1a3a3a323a48e1e1d21cda3598f26d264723499091f1d39133e426a267c74c448481f13a47974e4313942ea98204d24a46682349991281346426a268c8484e44c9026d264c248938905bc342633cf168a9a70ff6aba2dbecb9bc2179ba6703ceccdfb193b61ec6d8ad3fa61f6369d5af6e654377762d95b3bc9d8a6622aae72ea625e8cbd219102ec61fec6fa1bd3105beb6f48a4d0bd3775fb6f48a450bfeb5c0ec6de580fb373b4b709e5b4fe97bd4d97bd7993686fdd14da9ec24d2876c109ea68a220cbde9296425bcbde904881f5f46f93eaf6330db1517b63d949e5b47efa9ebdcd29a7f577f6d6d5766e7a36a8a2065a90800530cca9a9c58c21d4f882082b9f3dea2b9a5002872dbef460a37656517915a572a2534d533447713977a250de975e0555e5509eedb450755fba13d5955367bb266fa25ff6d477757507185faca087266a3ba6cecd37bc08c30c20a4c2b0b1cdbf6cdced8f8b1dbc7842862cdcb0b1cd6d87735a7f39ab6eff1cc138bfec70b7bba9cb1c1c59a4d933361c31c711671c31c611611cc165882e59dc0c8c9c1b4288db0f5ece0d41c5104fcc1a30bbb3b395796543826b58f0c86e3ffffc59fbcc3075fb6f74daa76fffecd86d16fe36cee5c961ce39d9c66a98c3873984d395f5cc2d371260cf8668c26947f0b30d091c10081bb60640bafc2fc840c4b644c4d6cf362bf3cad61609b64773ea809492486310fd0f6e89d41d5dfa25eb006cc6ed2c11b57b26eb7724253b57a2ca562d8eb568a25fb228f9c105278b10f8e01e4da4ae9b0b281f40e625e61c9ad77fde00f293f00738346f3f0f5e6ef8dd3759346f7f8b25f065d9a0f9ac269a5cebdea8de21bebae0b73842f8ad16d87db348ce817ed8e586cf7a10ecc26e3dab45253409ebc33fd2247c0ffe24c16791e1bba8a4fe9c96b936cbb6936bf3590f9265b3a8d43be477e08c269237db8dc9f47f5c3a9f7970bade7f28a8b003166eabf159fbd878dde7cc98b0204667f3d1a38ddbe9b44fe9fd8c3baeef25842a30699f8ea54c689f79bbe7d1c274bb1fd2519edb3117299f9a5bf219b7ab3fe57edffc46deed07694efb74443d45254beef7f5fbe6cf32ebb00559a2094852782dcffb727edf64b51fe99125d2f5823c31c967bfff6cf98267cb79bb497f70762bf16f25d3b34ae677f737e00e425c8fec260cb7accfb9197c18c158fb78df3d1549a85fbe709564c270eb83dcb8fbbd47d68f2cbde73fe21e0c777e7b55f502d6fe793dffd83ee2f3c7daa7f5cc7ff339ed539f7fd63ede23dd16297e25914010fc231d9236f559396cb9f4451dbc07b95cfa1e07ceb8f441fa208834c367b1c00727f8437ec1076b908d92ef3bfab93e259feb03bf3ec86a3d5f56cb8e509ff5ac1db25cfaaddf21e9d2a0eebf0fbf92f3b25c1ca1d56ab56c50f725fd22a4138a906ef841de9f40ffb3a5f7a165f165d52e6431b4e5ed86ef912fd27b89394839935ebfc41cc4fb693be2210976a147fabf48b6555209cb06894f5f7c16910c896314df3df03d5b8a0f5a1bf0bfef94d017ad0d6895d4f7be821ed9fa2fa8d64f49fd6a12fa2c5b7a0f3e089265f836ace70bbe47dab0ec08dd830f5abe1c98e3d2071fecd06b3d68cb794befc3073d6c91e197f386df8d002601c1f767d9a179c57a7ffaa02d5b1f92e0bc1e396f8be43b2ff3ed8618b9fcec359c0168182ebf8b87c8d1446a7568039884410f5924c16d39a75802fbcf13fafd595f562e52bf6479e86439aff760fbe5760ffb32c8a1279e40df6d59af7bef950e7e210d3bd10095eccb22e7edbc9fff89273458c5138edcd6b3c8790d8024c56d3dd80a5926208d10e50e1dd52421cefdaa880024a7db7ab04396480292d31d62725b0fd6b0251a00c986db7a100c5962121eae1259a20948b7f5a02b641da0cbd7fdb8997976aef2a8e97a0f86218b65cbda2e5779e474bd6f91cc3a65ebe787e209fd2d5b4e164356927ecfbacaa39b4588ebfdbc959c17ac618b49e8fb4f71c86f903802d2ed3eebd9f91e34df46498981dbcf17a94e2f892c583c0a0ee4c09405072f138710ecefb7e99e67f7ec9136ddcffbfd07a3ffc1f5ffbec9ee677bedb5c7df5ee59eecfd11f7c8ee821dd90fce59c3d83f3b0f3b1a765dbff7839d38028be17d3357f3dcc976ecd907d791bee95b803c3b3082b387b193b89cf3418ddb405cce7540eace2ee778b04a6264a5ea96485178b774e1062b2eff6bf6303a1597731f58e2ce2d977340bc71752ee780e0c01449686541758798dcaa1feed091eb9646658c2103e296464f408065dcd2688632ba5b168141821f504cddb2286aea561c8eaf2effe56f1dc0a179e98394ecbeebbeb8f300fe6dcb5c08dab8f4e9cfef49da28e9beb8f4bb2f6e598474e977cf7788afaeae1ae9f6776ddc79c4964b5ef2821d3689733bb2fbe24e9184a72233ad512b7927c1eeea5a9b24f3fd4998efd608e4dc105eae51dfce96fd54e6f547bae47592bc6d045e7ea46ef69739ee7cd9eb3ffbf9fd5d3401490adae4fca60d23e76e38e3d6ffde6b7d25cbd607b1be7ef7dffb834d860fba481bd7f32d91aeeb3fb2ecb643af4bc5a8afebc31769e3fa79c70769d80f36699384e270177c7afd82df645f16934c5c8b24b8fe458eff91ae6fd2c317492f48c38f643aee8bf40b76e147f20dee8bec0bd29edc7dd41b3ffc8f643bee8bbbd9d425be5f317c316e48f68fe4eb8ff88bec38e8fbfa6e029214f5b9d63fd260f308f3bf2926f9beda24f11bbedfd0964851e070b749f0c129ce1a46f05d24f8305cb04317093ee86f5c90cac1735cb00b5d64d177a9f45d81685ef0a98864d230820f52710416e3820f7247bb72e0027f0b2e86eb22792ed8627d83e233d75aa0f8618b2cfdb23e64852dd6832451288afd21eb5b248b26b00e8b9fe707ebecd8336aed752beb996b7e5ec029c3482fe76e78c19461ec2ee76e880173ad83eff3bceffb496ae0fbbe2f0d9049708add5cebbabbab5ceb7e921ae8ba67711124fddd73e5225420097c5f0f32333373cf6772dec9af906baf6f3203a3ebc50f1ffc0c8cad677dfdef33307afe7af5bf5edfaf31c05792efbf1659de777d677d7dcfbd7a2cf0abef2495796bfd6f72bbcbfdddfead36a8fef72c1ea0b26c8974599375abee5eff880fdd6ed76675edda3ff9491bfff9fe4ddaf83b59c291cbac537effbd937cbfff2a9151788744b873caadcf621226b77eb5cc3a247c64593fc8ff7bb092966888ab70b86b04735bef6e14ded6d767f1842997f547ba92444322dce69abf91776b5f7f164954dfc8bbad6751c992cb7a9c2111eee41aeb2bcb32ebb83842f7b592f3bf725efe8e2cfbe733b5b5674e8e757e5880ecc1bc7bb0f307a7c86d03bfb625d2ed79fb9899ffe33bc9a1dbfd6693437e5fd33259d25a2793ee43dfd5d5d5975b9b1cf25bed9077cfde7f64f93d95f10a511c0cb7ec1ffabec07075a9d4921544bf3edb72bcfc4d86fd54beb27f8888ca778b90eeb42c2261efdba86febbd6fd9a1f9e5521669d497beb5493273d7bf4524fe1ec9e57cef9da4d29ef7b61cba5dfa5d8974bff9555bde6efd26677777fd598434e423f0f77b437e29b5414aa892f96e83f89b59b3e2d03327768055c6166f787a2663152e32bf6fee52f1441f1f7cf1a5ede37df8fccc7359dc7a2e3243f2b9c673f9bd24f5c93abf4e92ef145b606b04d66b5e904524fcc1c69eb59ef5e04f11c9b425d29d2cb2458295a4326f392feb2749655e16eb2bc99782ae6987fcda8ce077feb4cf35fe792bc9b241f5c1a7e250bdde8321f862fd14e7d2e86f59967f82952cebb35ab644baad89a405daf276c19f248bf49eac33bf340092149759673eeb8ff8d0ed7a3fcb5be490b3fc59e4541afdc726f97e64ed7a6425c119ceff489b6987e6f52c6fc1e1ee8feb8900f426a431a8fb0f6ed9d989a5677c3937830fe0c4d23e7ce9037111229e4b043f12a7f1f399ad6793966a36ef99626c58da2776e9d70c29632c85eec4d233fa3c68a090e4fdfc23fdc2584e2c977ec9685cfa37fed16974f8e004104e4051e17036efa96d92382a821a4010431027b0252dd56cf399626cfc494b6dfb9e6900b6f91ec93400db0d8914e6df50701afd3975e97b7f432285ef3d7b3be234fa9fbd219182f7d3dede69f43dcbc3b9dcfc92a7980632a8800837c230820c2efed21f1283916d483a6071821f7e98a2cb1233b0b18dbfe4b9f4594ce17138dbc4d23e1f5cfa9c436dd06ceaa63f80cc454a1ea457d93e2dfa1da547d73b332eb55de97df43f1bc5b3a5f742ae44d5edacf7a5dbf276a92b612d6cb89e25a2765f1e5d21241fae17450049b9db7d496d59e57a14d6a2e9765f66e052cf46e1336e67a79e50b0f30515f4062df7e672aee9cb053bec48226efc47afabab2b1f6c2c227033632861650d1cfd39e4575797085c0f1a86c8e244d48153125238a3297cc62502b7f30515382a0248ca55c1b1164d36fe3203b77be60030ef949cb3a1896b342f1131f0193696c5f11936b637fea3283f7c000c18bee070b66a7149389c8dbfbcbddb720a48c34af253d2bfc506ec7c31c5958d9fc506c0c81823047758b9bab2f1c7aeb77702d02925bba7f3ab5df7fe951cbbce6b345cece2b8b29e754fc979410fe97b1d9d9776c3c0bf72112f65d77f7a7d67bd7befdefbb3bcaf9ebf7befdfbbfb77e4bca047f2ed90b41bf48f74bff7d37b1bfaf3f6b5a17078df7d5e47ce4b495ab9c6ed06c8dd532ee23d7fe791437ad6bd1997a767ddb3e865ad52df7f5adffdcc7fc0effea67d68cfea774f848b3cd7ea770f9263d3eab7c8dab4caa3fa8fac69f5bb97b50febbbe72db71c72bbe7c145ea3b55e891fcc1eafb43dd9b9ed5ef9f3fc5fa36dffbed6bf37dcfb91ad4b89cab018d2beb597d6f885e96e59ed58e6bfc2c528f9cf7a891ba7625406e9fcf9ffe47cedb91f45924a17be6da08fef4711082c503f8d3af4f6d592ffd7e8a4355926280017787ca0bdcc08eabeb7d11d2f56cd1674bfadd91423529061868951695545b56015924a1a34fc511bc67ae95dd47ceeb911d126a6d92f8d3f7a736a89fdaa1db2dfdf677b353007e0f4e1109f8e1775f49f1998bb8de7bd0458e8074cbf0c1677184ea0aaacf1f9265fdf9e014d9835dced520c6edb8e6b53842f78b64fd16392f08b278807e16eb4592f52d92e7b3888465cb79d996ac6716d90ffe9106990c1f24f9822c92c0367cb043909c9745125a97b956f283e00cc1f08f34872059490c8ce183dfba654d526f688358df2059b27e2ae967cd568be4cb22f956be5e475292f68cc3e95a409e32d22f65b77b9eaee3b9dd773fa47b5913b7fb9bfe695b67e4763ab7fbb17dfabbaeeb9e733a1bc4b923907932cf27207fb0b0673114daa77c1adab8b92573b9f4bbff6af7f7f3bee42ef77b229f4f594b689f7264a17dbe37d23e35f77b15da87733534ddef25d03fd4e6dc85b7dcefb97d6c6e19bb2591fb757fa46fc0263f21a608eef760874df6952171bf07b927bb6b685e5dfe3ed63ef4bfefbfe79ccf0671953fcdda074baee797b21bf6e176ec3e092ebba1fea37fec9200f20e19230d586eff386120bbc029c3487b369f67fc29e92414d0b9b87bcdedfff096e3cd097b46a3009e230826bad0800439dc20031bc760d4b288643e1db17ce9b17d64b73fac3c6d783987a58d4badac67937336009968ec1ab6cf1c3b00b91c1b745dcd30c70d888445871b9e7000a34b1177d85804e7734ec943ce7bc1497b36699f4049f06cf9d7fbca1f8cf6cc96467e5b2f6b1ff0fd6fdae7033f16cb96ac6f3deb0b7b36b6cfc77a7ff023e7055924873f451278dcd096e1b7fe23f986a4915fd683b379baeb23f98224df168be49e95b23bbffacf95b771d3986be5cd9db6f4409fd323f98a30bf9246dd9d21d86195eb3d93652d2b7fb0c9624ecffcbfff9e7d4c52b29cd7238dfcf24f72ec19dbced69ef578bffa0fc5e170389ccd7fc645fc7acee569cdce03eee493b1d6366e7f289bc187db7ff3649ccff34ee110c96bc42b6d5cce5d11e3967ffb0a16f7fd47a769fd8d047c79df5988b40fe7ae7cb9fd46a67882ff7c1681c672d63d11cecdc074fb75fa67dafa8ddcdcb44f3f933c3d6b9d9ef57b47922cce581c615e9d9e4d71d6b37e0a8c47b7b60fe774371d0790c9381ff48e9832e2703818669f30bb7da4670e23e736c0e57e709d72112e1a3977258acb972fd885948bf4e5d2bffbf9a00bb26b24bbfd4e96936888af6ebfd177e9839ea8e4d52473adf4af9cc4fbee5924c1ff3bd24ef2ad64d97d39afff47da28f1bebf6d50f7def3a5245f4f54f2c1f52c73cd9f8a48ba196576fb67dae6d31695700da2cc6e5b3bb9d6efe209b3eb96b9d6967b3691be498d00b9dd7f2673bb2d274e54f2baf49da4422fb5cccecc5ce3205dbc7a7693bd05387f82977332bc60a6d132ccc0bbcb3919eaa0fea0fbd0bc9acf62166f06f1724e863ba693f37e97734c42b02ee7984470653d6363d620037617b9d621d7fa99ccc0c839a62dd72fe7985070cbcadf2f32c9d4c495f1e775d535763b80dc0ee89e1af9ad1d69e437c9c4e170b83b9f92464eef7c4ae7146386ee0f3a39599c7fa4bbeefd5d44e23d73f2eb9fe2fc16bde7a40138b18cf3d9320d387f9224f0052739831657d6b2cbb9a52fae2c1eb688645eced55075653d6b71885ee61a7f8b4886e6d5a5e15a7f8b24cc4b9f4916f927392f9343f3eace771109b5b19ef54f52c6b57e273530724e862362345c846fff28e322ad20fac10e1685174e923d58d833ee597973e7bb2ee764c8e2ca7a361f64ea3db973790e20370876cf3dab5df7471a04596c40bf2d912efd239b3b8b2af8b7bd21d96ef4dbe64ede906cf48f746d9fcafed35f1af95561e4cb29cc777b3bb22d213124c2f57eda3a92da72deee3db2f4db7d93fe47bc6d2ca6e0b6f9479a927c9b641bf74fb521f9517733813c34726ea98ddb5dce2d65b90c63918479fd8fb423cda9c4a70246160d807429b521d29c0570b204e49e913091f8a74842503fdf20b64347977fb200b202e81d2ff8a29d9b8074fbdb863df3f7a79d4742bfff91e6f6b119a1dfdfbd9f4f6bfbb82dbb0ff2a7ef791fb64f5f6fbc2a00590123f8a2bf84e5f2fc72de69c39ed1a70fbe4c18fdfb878e2e1d9a97da0a80dc20b74f7bc824c8394a6d8497a77d4a23df3ee5cc48fbd0f7d7699feffa8fedc3392531ae7fac7fdae639d79fdb27259834ff120097ec88e099bf976002e096d4a1fca71301d3fc69ade328fbffe0961fb478025371fb6b869431f214976f49adae9b20e91af5a5cff405705954d25d6abb6e7e51204319f90b14e42eecf21727e052afecd2f940a0187279faf7a5ce65066282f173da87763f85726eb524bd030a19dcf9a3fffcf4ec87acc6ed9e26d9badbd95228e73e1b23dbe6b482883b3830f586153a9c61732ba048e3baec7e4ed3e603891abdcb3928a86ef9777aed5e80dc3eedd94a96f5d6ffb8c8e77111afe3229d73116f2ed2938b4cae79cfdeb441defb7b5e93b567f57bef67b565add7fbeff3bcaea3d4bdb9487def6792ef76d523eb7b5d3f3bf4dda07e4a96fe4548b7bf497b98028bcbb929a2e829a06e0bd13ede50fcd3494cebff61a6958d85e5c33c2b3bcbed2f6197610f8021978342ea1af5f5279a4d65be006e8b27787742b14e7f0f31f2852a29974b446fc95d54e8d9a463246f433581ce3c9b30da339d9e75397358ac6736582e7d1bcf8ed0d77bf642055f6ef7448c4471fb5930ea1fcff517a07d38f74413b779b84c223ee3ed248ac3a27f9240272438f7441bfd1ef9002b73900fc045910fc045d133be3ced53d621edc329788015b639447c76ec9b9e35ec0131e47ac677bcdec30fce56f25c2682f4c412414081613583191c61632a2ef3cf8ef40fb5f1330466940f4fe0da89266eb71351dc6e9e198ce53febfb6e0ab2489e32185bcfb7f5f3bfd6f741f4e9839d888465025292efa72d83be9f22fd8f0cf23e4a270f6bfa1b15ac19e286d3283c37c83fec197ffdf69e7e29c473ebb31eac64ed591be3f77c9b45d6cbfe536dfdb59e4065de69a98dc2733d1b44bfb32358aeb3677077f7f9eeb3c7985eb610caa17d93dc44c5718650cef422c4236344172210e2f9beeffbbeeffb84be28dce5234beec25d7478867011f0f96ffa67e6f530cf1f8e3d00a6b7c9c4629e5b16461221f331b171e61b1623ebd9477bf67d0c19ebd9f733e437edfb1639eb190cc917f6ef3f32b0960c599bf63d8c1c7bf6fd48f2f4ecfb1739a467dfbbc802f4ec7b912ca167df87a4093dfb1e2451e0daf7ec3f449af67d3f7f8a23f46d59eed95763ba0b0128da92874b17c6e2b22dc51785786e149e1b147eabe4b9b30c6dc973c3cf893dffb70fecf9cbd88d79181869a467fd317248d3622cf8230cf94e9bffca9189e28ffe03f3e3f7c3902c22196d19fe57fe15df4596e3156d19de72e48bc20dfabe1e39d2d8b487cf96b3fb31598e2e11c808c67f1739739aebbb63f7fbf0b97fc2a67dff3d7873bf77912212d1d69e7d7fc443922c6577da3246b2ec67bb882ee3f89e9d43e61879cb9d638cf5997462ccb83c1632def295467e8634adfbafd67194c9fe673c3debc68f2c6796ebd9982582c575e6be7624c039bbdd29ed989cff8948645f8c6cbd18d97a3306237fe7e22a76e8206d752c2fac3d63ffce3fa8b3b567ccb3d6cbcc9fabac72e9e5cbb34507a50e7ed37b1aae75f4e69486d487be77e1e4e2fb96eeee20839f0472b808e55cfade046bc8e4bbe82efd4f4442ffa667fc32aef14f19c930a21d2dbfeffba8571a399805e46286dc1b605b9670895cfa538c71be1091cbcc52e8bc80bad3d9656a4ba4282e7df79f618cf35d88b75c3acb18e74f2e287da702049fa76e39a48cf5112ea202d7c42fdff5e5ec87884effcc9ce6e1f74cbb7eb5338db11c5b3cac073b474906ba30a28ba62bc4c3c5849eb946a74d7186e4bc2209640463498488ffbcdeffc88b046718b2fc27d6347fff58f86a8c446e8b88ff2421517fe96daff72f40fb94d5a7be7f09edd3ad677d68cb1b6f81ef42442eeb5d547253010e42405d21ee7259f4b2c8b23d7b7d2491c953617b4ed417e7943377bbef723b59ff94e0b4ee8938ad7b7e06b2c548ffd6b30ec8d408648ab19c5aa696f6e96f6b342f121fdae7733aa27d3e4b0454fb44b58f4d4f2cb77bbedfe8b4eebbf17295a55c05640463f725a8c045d0184ba6badd3379d23ef5bb670137a56fed530acdeefcfeeeab98506dc95c5c44e259233a9be05af71d4219fb482023602d3dcf184baeba5df7538c4a2255e6531212f497de2644fb94d3a97de8779f0f8b48be5aad106f51a28121b8f042758598ea4e7a3d925e4a7208f363fdc3b66aebcaf176b652e7fa7733f7d9c0df97eeeeddc75dd7f1cc72bcefefc85276f9fbb2eb3aaed1779f1e59c62e7764195eae43b8c66347070d27173d3db2b6c6e8d9dab376a6773ecffe32bc73ea08d7d8081109e480219433847f96c3c577f937936a72573bebc541bbae637ecafcb2aeeb28384da0725ba270fd2759f2dc39e79ce5ec9ad0b37e27857898cbed233deb9fbc85889139bb5c29223d6b4a96425198ea064d8b44a73fa1d333de22813b9fff36c5a8bcb94239977bec596cda92c89ddffd4ce7bdf7294444c65bbce9348020c8df24ebdce6b94de476f9df7739b7ab48c25a8fb450cee5a79c33e43291cbb2d28bf5cc93fdf5a6673b7276bbfca6946b311691944244eefcb6b3fbc299bffbd2f3f83dfe208fe716fc938b7e3ab718e7cf1890e075dd7bd77d10a5f426d67d4929ed485b32b9dd53727631cea746dded3a4b72d9755de74f20b70fbd6077777b7bcb00f697eeee3d6bbfccf432fbf897dd3788a8af5f5d3107807ee9de414e49a2795b095f5d5d6effb2bb8d5a890817c9a76701e98325330d625ba70b2a7391c945f896f4b9b6c6382f7dfa5e7b367ffec806f885970dd0e6394b505582d9ed449313b8ef8201726fc0eaf60c07708740ee12702901167480f38f984c7c694288af7d027039c744976be4d7bfc8fdb84873cd595150b18aeec585f791f1b1bcd4d7e55c1371b0445ccb69006b53a8456c05e1a247bc6050239d02165601d3da2226468232623130323cf50a3855408239aedf2e0196db3fc4c80765c84528002e915bde9044fe4454c6cb3ff4978a5fce5d4af6b8200d295943ca2ee88594e471c12fa4e4cc056b48c9980bb2424ac25cb0155232c805c190923c170c434a861714434ab62ee80a29c9bae02ba4a477c131a46477415848497a419890927ec19890927dc1180c2c2626e3b24446e3ddc9ddd0b580f30aa8286e49a19a8082f280169d86c262ced9ed05ea0caa840f4a24415929d1841249283184a7441b6228a1c496fa8d97734ac8515d31b0bca6568b0360750ac1277189dc12276831e10ae7d42b146364282e505bc46496f012c25c2616de662249092c4b58dd3126b3c41bb5c28493891a6238c74416d8f8728921d8625518170c16e04cc1571954d3edc94dc059c41836146e323373126d24e18593f8726524c87c11d39fad4a9ebaced39673887333b72a798ada72e6b69c35151628d87f3f8e0ffbbcf88f0c4dd9552fc8946d35f323e3f15134b6b574ee3fd9287694d31aca69dd4f4e6ba75c12b95bce2a9eba652f4199ec74923dccccc7bccccfe75156198c2dff636c29b3e5e8d45aaa6664ac66aa50cdcce0bccc30cd3055cd34cd3459c954dd923249d9d1025bcdccd4cc8cac8b4cf6fd4de53f3c686c6c2ccf6a6a2c0d0d0d0f4b79f008656f4566ca66acf7f3a7d37492eae9659c54cf1ff3b3cbf3ebd9a614fb39f52fb2e78e71dad74f29191a1e5353aacb949215999fb132a599b7223369ec0b323b3363a79722a4db39ae75c76c59636c39c2d85206b3e56cb4e5f7bfc8ceb195950b9ef84007d0880304b6594b2db551830db87165fb5c8ba8343c80abc3043656d73147087032e08ab0816c2859e9d2050c4e6063a7b95e7ca79af1c2644714554d6ea585e25ea04e2fd0a714c0616b24a66e4999a46ee75cb3d9d8b2a54c566df9f7b3b9dced9fe5b4388d9d3c5bd6a7ce962394d3f8525bca8e2411e534be6ecbbf50311dd303c83925cddd999f89e241130545c38366522d4eebe741e79cb28ac9c46233333433333c66666a64646256c94aec9564373ff333df3236375f4dcddbd467ffe161797c0d8bc682cf36997d61c6be20f3ad076913283e65125f4f712fd8bbd5b7555b5575eef3a8ea50ac677fe2a9b5bdb853d15792b1de45e6adc4629e6d4a32d6a73e86a45ae69496a9db1ff3e59c1a81d32d1b57c563d556fed34f4eebafa3ac9f6e3f68ad1ad731b69f26ae9fc62a1be7d47c9a5652d3d64f9d1a14fff55552b7ab6e4ff194ffc8c4bac81e05a74d2a1e305e669e9d36be8cccb3d35c6fc563cf4e0bbf63969d063e28533ff6e28c65a7b15ee65f3c2c3badf5330fbbc92ccff7532dfec3c3a2e0b4f93330b6e42e773ecc965566b42553ddf92f5b8e31cb4e73d992bddcf9a22d65a12db9eace07a996dbcfe33f2d5b56962dc7caf3f178b6ac9dadf3eb6521c1348c1c20e780ec3face707adaaa68d454e1b4fd127a7e12ad3d8c44f71fee3ef24d3323631ddae2375f72e5053fec3b62e54d40b7d826a2aae7226ff513a8ab1d5af4fadf0c9296c396979a55ba8a5c97f94beb7e255eb4c4eebffac37b93375d465bafddec5f2fbf7f4bd9fdfb2b63fdb9e65a7cda6a6f2a2e5f6971d75fbbbc97fc62a1bddbbc828eef697dfdf915063e950936d2fa34fd73673d38b97cfab9a39a8692515859bca35531729a7b537a99a3edda64ffed3475831061a1da86105b67e0ae53fae830dbe1061441054d8fa6994ffcca519c0b8b2baf2c2d64f73fe13e40a1ecab85ada62eba752fe339da82307263a70c0d95a4bffd4e23fb76903bf5bdfacff89f21feffba784fd55fc07b42538adb79838ff695914fa2793ffb0ac0afdb3a95a262f789605a7f537f52e5cebf72eb7dfddbd9f8971d2aa0f89f6584515ff61b0b2be9c5a2e2f4d1beb5fb077f173abf52087e2873ffeebcbc974f92b09b333cacb6827d4d2b4bd443b9f467e1496a60df6adfa254b7dc939f04b2297c32f792effcc7f6e283c3f8c9c52e48b9c5d5ce4a422a717d6f3d72a4ef347c169e2f38f22682753cbcea6b6a5cc4e2d4e9bb6fc3bbf9c52f367b30abe3f4f0debfb13a995b258ef5f82ff80e0cf9c361fb4ffd992a5eefcf23d5b724ec6b263674b22d569d4963c7776cd8a01e49cb273255b3dfd92a7a82dd996b3cbb664abeb930463399d9e6ec9565655fed3a50b1595172fe594f29fdb1fc5d8fca793ffdcc4f7befbc207bf64a9af6b3deb4bce755ffdef4b22b79c4e2e7b7b41f4eccc697d7bc1fb723a85f641a95ccbca589c8baa76fc884079b6b2d34a9e6e2175d31480a327fb76da7ddebb9effc3faac16188ab19779feeaaed7088b81791ba6698bc9ccf0a8f9a4a56aa37999272df1d86c6c0d0d199391313c666448598ca4e120f363c8fab15a1c040c6b6c6e38480f1f381cc425be46184ccd746fba8db445df738deb9e7ef8370773b85ce35e56bcfef737f7a77f0bedadab9ce650537846960b1c5b7ff3b1a79ce6b73975e3d9e404c29acaebec6d56fd847a7d2e741c2bd7385c2ee46155415541b1fe6b2a707cb6815fb693d89a4ea3eb4b1e5ff65db64e89a1958176ec26961dab954d1dc5d83e5b9dd6cf36cfb28dfa0b69762b0b9073ca59553faf7bfef71ffafc1ed991569c9256fc236f325fc91b8f3f8ab1252d8936eafdd2b4794d947e47ff567f69daeadfba168bbb5f9ab6ce5b323154ad5f9ab6968cbd252d89b62426116c32bf346d37245288bdccdf78d8db8c5d9a3619ff987f8cbd4d2aa7f9c3d8a5696bf9c3ec14a7f9b3ec8d89d3fc47bb346d9dffcbfecd6597a6addadbe8347fd14ea71b3bcd3fb44bd3e6f9837636396daa7aef8d9dd3ccd129ef998ae7e3aad69793aa658f626cddb3ec518c8d3edbbeafcfb6fae584aae4477a6447ca9c369f92efb4396348b3bfafea8ef44b59f9b79cf5dc31127dcbf5ce62bd7d4104bf5b2dd0bec00a9f3efb4f685f68bd7e3efb8f52d873c73834ef2765530affc624c4f6b22f802efb42f879569e95ff88564914ad67e534ffd02a85e1f753eab3e583560904676eda52d6b24aadb7525fa96539ca69fed47a562cabc47a2bd5be409f6d4a2ccb4eeb9f504efb703d778c44def7cf2546ce2181eb27a927ce2181bb9e37359f9efce766c58f626cb5f5dfaa3259fdd638de723edd9884d858764cd9acf80bec3411aa6c4f3d778c7fdb9673887ecf1de308ccb5b256f6979fd44c629c498ce5e7e459959f5397f9d4b7fca43e29ff994f4ef3af751c65b25b7e52d79ffdffe23ea74fea73e2336ee94d7956de54cf2d3d9cf7e4e13aa82e1d54ec9694aa63a26add9236d128dad4ddd2735e5c8be7bacab5485955b513aea59eaed55339ad7826ee4beec253d6eb7389712a31cedb5fcea7afea32074715a9eb97179066c766c5a9288e15ff52d361ec26e78be9b159695cffd2fc6cfeb2390f9be3d8fc039bdb9bf74c426c9dc454b359712bdc92676ba6b675cbd630b6aeb1b5b53508b6b6b7ee9984786c24c9ca6763e2b1f52fb9cd3b9b8b3697b1790f9b7760737bf36712d24ebbb637fa4731b6ef6bcf7b2b2eeb3acf8e6e6f4c426cfe4c426cb718b7ecb4f94731362621366fd21cf8fec334b6d34f5a7a99edfba4a5d1e63df8fcd57f929886d89262bf44c4d6faa5d096b4f436d6d7e797f94f12d34d28be5c3ffe528e0d7cfe318969664b5a2262837dd2128f2de6976636985f92d9c64f5ae2b179335bc741e6272dbd8d7290f9cc21cce78f215d1c643e0c297290f930f2c541e68fe4c821cc7f91321c64be8b8c7190f92239c341e687240f0e321f24652c647e8bfc38c87c16197290f995ac1c020799ef91351c647e47de7090f994ecc141e63be98383cc6f128783cc3f8a99ad05e8d15f8a6123494c3c36ff256a6ba71d7dfeafb25addf3879dadaed70883f1e78fb111262ac34698c21936c214e3c146986e646c842987868d30e9d8daca9c6684a9deb011a6b1071b6192f960234c6febe7c761234c331b1ba1964536e276ac61236ddf69f3f98fe86c2a9073ca6e0a89b1ec9e3a29f1add05c14ebadb00b4e500714d3101bfd9b9527ffb137b732886013eded86f3eccd7b1944b0b1ec0de9082a64e8ec0d034a503029b18226ae6c371944b0517b3b52c38730b43c75c9c1e6f4bb4f5a0a6d5e8faf55b79f296663799de7e35bd489aae3f134f63c62ddcb4ce13ccc146da2f65dfc1b1229906fff063ef9379b07e9e76ecbbe86e2fe657fc3ddfe9c8b1c7ccecccddf904821e667fed6317ffbfec614b3f98714eab6573914cdbbfe0675fbab6ee7d89bf81cd8b7f63692f6760404dfc6de68aec6dea8ccdefcade778d81bc7622f636f74caa7702c6d82c9be656fd487a5b4875dd2b1d5677d39e658f5a6e66d605ee4f1dd7a98538beaf657279967395131958dbd895f639938ad7fc6de50705a7f8cbdf138adffb3b7251ddbf7a1bd5128af72a886a2b15df53cc5e3c9441e33cf637c2fe6f523d46d575d280e21c40b47257abe100422480d636ff0b0421925c6f9bee3f44b77770edddddd8180618e12351a86620e3a345dfc10c3d02592e0e038b95d25d205e1be42100b1a1d43590c66b090470c1fc0843de0f020268c3131cee79c58c8030b0732618b0576266cbd80e411be154f65a10f2a7068c287818f9a3096450f9b7044c10dbd0963399b1ea10f236a7c846710118387cb0c8be72d3223e390a9537322dca0508e713e75777797c1096169c4ea87231731950c7d60016343191630ca41f82d8d342714a35e1d842010aeea410802217e10be72086761cb0990d2c2708c560521fcae60fd087d00e1e9842d233a2021521312e37ce7aacb5f1391f07750e37c7777770a24a470305bba13864174e5093d2e6690b053639ceffccc3b406a3a3f40a0cd3ef0a0831c0e2cf9383e7adcd8d4d0c878ccc8c46260785c43f3eada24e1b93eaedbd202b608af5e3dfc3aea125fcf2292f18f34c82212d81f6998ef594412c3748c7d0ecf902305402105264fa618e1926653cf3a4bab95e32d5a9ae6985a9a6696f6d1021391cc2ae66c82b7cc288edc1614de64ea59e3dc0027132ea97d7c1ce793771daa00469c3052654a1b56538caabceaf0c1881025108922c2021339bc3079c2822b8e26225a4c1832c5101550f0d20585145410d7984943b0a0c043029e128ed0c152470a5042488615cfc4a5a053021d223c7610e11942045ca30d9d39549849319bbd0c669f336bd54135f322811c26847264630d1e7cb0caea773f4b4452ddb84e2f483a2994735b767eeb33c1c82dd2a8bbad56cbd69b198ce574fad6b784e8a72212f08477f0c90d15df4d8cf5e54d7973c1564bd602bf7ecb96e07f7fc46364949b5b3ef944245f3512c7752b747363be18cb822c0aef5ba4904c268bc53e161945764b16ae7ffdde1391781f8fecc278304484622808bf450ac5ca5819bb2d4a416e9fd67b6194d82d85aeff4796fede772292d0bd1cb742b10b0b613a53c613bce8077e39dedc502af47e0fb6c872bce00bfcd7d3fea14d03fff5e10c403877c07f3d8fafffc872ca108f4f45242f6b44ef28bbe3f82f925ea3f009d7b748a1f00365b2da7a6f916578c177b20caf0b7cd7d719803a77c0773d8b43e1f56c697443f09d74bd8b485ce183e477757555c70dad5078c50767e822e975d156f97018f9bdfb1669e4d73ba8919d9c2c67cb967f5bb29b1bd9188b8de16d7d19b640f0f35bff48b3482a2db2acb7f54e96357c7f3a03c073a7a4b7f5fe21c93d6bfd1107ed90b7ba67916595a1d92292eeb31e299e403b6a67cce4a00890bf2231f2cf0180ff334aa9fd2029891f1b500308aa314b07738cafcb393594408063ac76ccde185d7074808291950608368ca3173433466f8a668391750508698c2214514fb33ad200c20318a4418307b934965890460c52e377830fc8183d393ec861a46f7840c358d360638c0ed0183b30406862ac5b7800c4c892ea800553d0e2780206682cd102348ca08931d6343ad862a4657460c6c802c3832c63ddc28df15b0108478c314e80f0c4c81ac1075d8c303efcf8800e5acec0b2c6194a5db8d8f2410f638d0c3c9861ac29f062fca2e8e089b1b5841523ab08da0c660c7141b0327e977366fc70671c3043cb9d9fc3050f6a9871cbe761dd3c7f09fe439f7f8afff8b3cdf3cf9cffccd6f31f61c17f68cf38cff6f5fc44fcc7d5e3397cfe09e53f391ffb98e757c17f609e3d781e9f5ff6fc28f88f8fe7afe23f33cfa408822deb05e19bb499fd07dfc177e48d55aaf99bf748cbc1dbffff481cabe475f0b3af24cd2a75f7b407c91cab94f3cfc18b648ffeeeebc3480fac07effd072f439256c9929ff33c481f568926f3f56948259b57f2f15978b9207c4cc7d6c3c7dffc8b54f261affcb02989efe36bbe5563afb86c386f639568fef537f68a8c4de9fb9a97d97cec5b1f432ad9c4fee65d37effa98bde236251eff7a16a97463afd46c4ab0bf717deb29a9e4b25704605302df47cb5eb9b129b5bee66dec95984dc9e6e9c3904a32d55ea1b129d5aff9b657aa4dc9e6fb9d66af4c9b52ec6f5ec65ef16c4aaef7f19dbd02635392f9d7cf904a337bc5c6a6d4bdcd07f64a8e4d49f6aff7e04352c9037ba5655382f1ec95974d297c1fdf81bd42c4a6e47dcd8fa4921525245b8ebdf2814dc9e6fddf5ea1d99466fec5fa7ff227a9c481bdd236a5f16fde8a1292cdda2b03b029bdde87556259a5f19560af04f34ab18ff92bd3e6e3497be5c7a6c4fa1aab54f357a6edadd27ca57e257fa5eee9e3904a3656e9cab4d9bc0fabe4bdd2f74aac9fdf83548af91bab646395645e69e69578bc12cdcbfecab4d55825f095c257125fe9f5ae3fe2209047b94b43b2d3f865e4cc69fc3c48149cc63f4356711abf0c399d9cc61f23abd3f863481ea7f1c3902a380de734fe919c4f4e637e1749c469fc22c9c469fc2139999cc60f9213ca69fc2d52e6347e1679c469fc9564c1694d4ee3f7c819e534fe8e7ca7f153b204a7f13b39c569fc4d4e2d4ecb398d1f691ed1ba12017283fcdc73c738c284e25abf0a5cebf6c058765303317ee397b381184ba6fa619cb7ac138a8b14f10f054dfe8f6a4e8f6a2fcfa45d62087e3b8d51dd62d5afbbbb9b54e02245303f14f47abe4530b6a9b856ebe787d97236bebe9c512b98ba8d858bbcec7f2d8e9a358ddf6539b4207b5354546b4671b5519f8dba1dc5b5fe26b6d591868061b3aa4175db73652dc752e6e4d04bfc21309cf3f54114ea5f41f4881b97f841f44926065121626010751abd20ea43cffa893a5b06512d3deb328836f5accb8f36d1b3fe209aa567fded14fbf7be7bfafe9ef39f98a5514eeb87b1ecb40e46479bcbe572b95cee874659772fb7dd8b7b712d5ab468712d2d56fdaa5aacfa55454949494949b5935454545454543b39393939d1262ba7282b2b2b2bab693535353535f534f5f4f4f4f4549f260e377113377113a70277e12edc85bbf0f0f0f0f0f0f0781dad4d342a2a2a2aaafb69136da24d54ae2ef234e322e00fb59c862068cbefd97ca2962d6f7a36653d9bb19ecdb167734eff30ca25866054944b0cc1a828aa16ab7e54542d56fda8a85aacfa514545b9c4108c8a72d9b28ab61cc3a81b2515e54d2d56edffbca9d56255fb7969b1aa179d5c2e97cbb596afcb75aa5a4719ada202499d5b555555552555252525252535a5a6d3749a4efdd3a98a95959595150a3cc5533c35f33a3a6bafe7d3ea55fa51a6fe80538db2060093d314b79c5d3ab2ec926b531c8173458a3c5abba9fba0f97c51e0daa4f1cf6c62f1cfecd234c50880203272a4b9eeb41276fdc18ea47736f98f6cfc88fa0ecddb3f9b6617ff91c9c6b1cbfdbc26a70d5cf3aad9e7d1ef1ec67276995daeff6c721f6532dad44e1e0c40ce017bee1887986b1f0a5c842f5bb23d307a141929b841e1d77cbf47d13e6590f83639d7df6c797d0fa9f17d60017b9c29987f2e314f7ebf77699f92af626fbfdfc5689f3248e639285dcbd7e780742c3debb7a433f5ac9f243da967fd4f3aae67fd3864fb20dbaa67fd3dc8be21bbaa67fd3664d790eda56773d24cd9e43167a60ce9627817e7e2538e854bf916cf79141ee53476b716b0c5aadddddd44aa8f54d6a19792bdcc5cb3e03fb58ea34ce6e57e2587442691d9fd50277573924d5cebff6c39f3d23ebdb47be9597727f5ace7979ef59ca367fd234c25d336960e8ce5f40282b1e78e916f0a5c643ecf8b4596cb392c926ed95e5860753d4bfbf8f45cd3ed7ce1fc5318e2f926b2a9b8083b55d3d7677debc1ef20c6a27ef7a74ced1334ad479111059628ec68ca65d9a245ca072c9ca684e0f2d43e41dee58a1ed13e412ec6d5d597ebdf3e8c657b89baccb5efcb49e54d5eaebf37799337f984729affa4f3b3448ce564bafe93a9a96758faa7b364e99ff6c187fe692184e89f3ea29be8997f3b8d2591eb445eb6ace0d8126d2963fdadb63af27091cf76d4f765375151f97ca69d37a93a8a8b7cefad6e7a96fd6acbff9494df1677529df15f4ad99ca367d496e3d06ca367fe2328999dd481712289930505a5df7bffd510fcd68b1fbee892c17ebc8979988f199a5f24f3b197b132b11818d8f8728921d862d5cfeb6833d163bbab5dec76a7dd77d8c25f6a3d75dbf676e4bdf72fffa6dd1fdd34adfe47acef64fd47ded3efabff512b46bfffa8be077ef7fd51ebfd975a369817addf7fd4bd0763fdf74720cc78043ee85a6ad9446b0567fcdb52cbe6b256705a7fc40261fe1efda3eefb996a6cafbf3deb8fc0ff7ea9651bad151c97bdb1beeffa47fef4996a6c626841cb2dd6d3ee8fbeaf7f3beabe6b59fab72396ad7f3bf2af7ff43dad479f773beae891b7fd0e01363f2840ea03b8d93c538dcded8dfe6dc9b3f90fe11c7d5bd8dcde965c367fa6191b1d9ab4b3f2ba62aab1f9dface02cb53a6aade0dc8ec49f792baf1a5b4d0c667481b0f075139b81195d60cc0b269b81898d2e500616139b898d30957a3132638f99188ceb8fc21f6f40d6d7fd91f74e440f1b9a97752f93592b38b7a3dab2a1b156706e472d5ad9064db69b9a9918cc08fe51f8aebf2db56c36d60a0e8dccde986a6c3ceceda8f5333198d105b2beee8fc2f7bf1dd59f89c18c2e90e57f14fef7b723fa33b1bf1dc93cccdf8e627efcdb11ec5d7f3b7a3df8b723f1bf3f0a9f35637364ec18b31f636330f6066665a395bdec8dcbc6449bf347a17dd08e2dcb2c1b56fbd9da21f4df8e3c1b760821f41f515b3b84f96e6987d0cf7f6433595220fb73fdaf7cb074bdf83cfeeb19e661cfb18f29737a46c690dfb37e1812468ea4cc458a64488e2d16890433671b20b74f10578d4145b8bae38eeb4135280c1a836241b2a09ba0b7422204e5f8d5d51dd7e71060cf1d2351918f21fe21d60fd51ffa7ec8fba1ee87e80f157d53b7bf0809d16422b6e5b39e8865cb9bfa44d596b2ef893e5bc6bc27f26c39764fd4d932ec1913515b52a9b9fe44fddedc6da9ccdc69735873c600e4f629f2bca2aefba12216ab55148645afd758040313f345ee324533333c8a643f34bf48f643343688686868841186e60fc57ec87f08f643ae1fa20fbe92fa4afa8766dbf2f6a4b1a56cdaf279d872e62626634b8fd952068bb1250ccc9631d768cb97cb9623f8546a405b862d5bb2a8d45cfa546a6e2da9d4dccf96df16d7f3efec10ced5d5d5a5b6a45273dd96df16d7bf34f2ae5b2a33b7ad6cd227c09b1eb3c8b44c33f3f26a6c280f598d89c9843d9b45da8e21172132a2b7fba1d7a532c3e2224446dea53f24c2a512bb5d1122a3befe437ea9c844eff95d9e8db5b80895f07645a8d0db15a102738b506951e94bed4dcf66112ae3eda7e2ba5e848a77dde6f46c1669eb47804c9fc8e87b7eda7d5eebf96b6db15ccf1f82a14b7cfe1136fe2bf6fc31d78589bd917763de68e60ebd2e8fe7978557e689a8d0cbe38de89d79a3d81d12e1da1019c15cd91319b52ecd1351f1aecd1bf5ad792222a3f1fa7822a37a7bfccd1bc9ee905f1c2223d725a2d217c736d7e61b7977be0fd2b936bf0749b936ff86ecb836df8664716d7e0d59b9369f86fcb8365f467a5c9bcf830cb9367f8604b9365f866c716d7e8c7c716dd66a23d7605c83e1da0cd764b816e35a0cd768b826e31a0faedd70cd866b355cabd56af3917c4cb7ea26a9154859b1245585941452725f4460031ee478aafae28a10b0ae48828731368e35a717d4000c28a83881162fae08afc8218771e6724eaa885b8eef6b744edd690f358c327777291bae63b1b9ffbbbbf70da3eb724e0a861b5ece5d41c7ed2ee7aea8aa01581241dd1e21c18f449090107fdb2877fe5123cd1e01acedd34dd6f993e79c64cfb9022e5cb8542e5c64df5812b9a38f7fe3e0e978f6bb9c9e7161755688e77a9ee7d93f03acb4769de75531c6f5aa80010c150b1876f0210926a82742d0c515705cd1e50a29afbb2e2d83c7e58aa4eb793ef4522b1db9e08d29b810e38c2fbcb03117ae250fe74ca29e2d5e688163ea06343eb0851561b0ac30e3035dd7759d155bb07458baa2b5250b261e991552d430bb12b028a55356f4205af154831532b8acd0e1735070cbe7f18cc86d69aa62cb16301a872e72d862820f6879838c2b1b6dc1a53fc271691572e8d04ab1cbb92d465cf0726e0b102ab83296fd749bca7f3c2fb3ca9b534ef3ec0b1eae8b6745c5349ba6962a4f4c3cfef37d7f49a47b1b25df69de5447da34807ef79d7da13eb5b10d9ce1870485044c9bf77d47ffb347ded3ee864403e61b245801ce569ffeedc8fbefab3df2fe85a3cfe25c0c1964c1d9e8d3eefb65fe4343701cd94f651f71e73fd934a07befbb299b06d0f79ebe376d1d3992b643eafe3cc0e33f6de3075f4f77faeb5d4fa442eb59df302caa70ab475a01e20b302f3a6883bd5b2414a6c2bcdcf994eaceffaa5ce6e9cc53d807f3627d507c5004ad4d3fab71534e9b0fd3c5a6adee7c5733b55337b5963bbf2389ba17c1fa300f635f807d7db689301ff331f685ef619e6de0b745d2b18f817dec5954e1fb986f62baf3452d777e8cb4f11ec9167bb02389fa55783debfd895468bdebfd871a70033ffcd737e026fef8ad07a7a802eceb4f5185ef611e85a4fa30e1d787b136f4679eaa386d3e8cc4d9d0e974e7cb58a8182975e7c790365e54eeceef4652e634a2a27987868814a0801f2252c1a601ad7f7dab9f48059b06bc5e10fff56c83f9b648baa70ffbef41d8b3a882f81f0c09236dfa916cf5412a2a806d49ad7f3500fcd6b7a882f8af175508bff52caa30da97b5f1774d89644856929dd6226ddca2c01d42974ada34928d9d763422755d5d0072775227c5643763cc47d9181bc7366698819513d440b5851646884ed45063e3e51c1549b0018eded9efd97432a767b418dc510618531da0428a2c7ea82148a25688e7765dd7f97377871b556429430d2f6164810596ee061afe676b7ccefbcfe83f9ffdb276dd8fb8ebdd6ee9765d47ed1af53f27bc9ca30204b77c9e6e066f94c5a8e8c0951e65e5786354d8304367a9b8b2e44d41b798428c18a618c30a8fcbb929d0b8f4726e0a32b8413abf2fc3eb799e57dff33ccff3bc8fa43da39ef7a3ccfb59fb08f15c5a1b07907368bf0da57d3bb8f38914a07f2ad5cc9dc0eacea992e7ce1c0a7077feecce2a140c714b2377caeeb4bad4fb3ec08ad50c99c21e1083975bdbc7610f88c1a9677cc1c9ddaeb6338e31e672ee04572e4f39317af7a5ce0562022f2935c11b9732d9e8c7fa87da28a5b3ac945213b07129a5fea3db8e83cb39135c71c5cb39134071cbf1697b1726f0c10447c891e3e58cf096cb43faa7daf87352545dd8e59c144997c5fe233ddd18633fffa69c1d19eb99900c9c88c1972b1a8050818d5e71e98fb92a2efd9bfee11c0e8793c1463fa77fd8466de95688675c63e45b8eb7dae6fc26c79813a3783907051cb77eb9e5f828005fcc3e77a6902f403a521b92aee58ea45c73bf8d9c7ba2897291eefb3b2e22c7954d27e9144e97a7e8aaae3f38d4fd34724e055d9e6ec9530eb502dca5560ed573c7d8cf391574f1efa4fce7880aa09ac65153b92e5254d75530d534be65e7e5fa774efe43a7a895ffb49414e788102969f5c68e366e8a8bb42dfa7ea8e8b3fec435ff69c535fff9d4a58318dbce2f5c73ce498971cbee72fd5b88b1ac01e01f87fa1ff6e11f0fa54da8c4a9150cb4899a041d536a06680441400353156030482c168e08048a26d7f80114801098b2545a9fcaf42888814a19430821841802000020002030334c0002449b3da1f71f290cec0d6a2eda91cd9c18032ff0dca5a25b87109f947ed71b47ba08981d9bf2eb8274611b9bb453e3e7ac8da1b052cda092de2ca54eb20d304da0082804cda4a1f3c20b1db431f06a0187aaa837b4efb965f92729070114f4bcea59b995635e6ab964472cf4a36ab4b19709c2ca9de559662a421ffc529d1a7b238b3f2aedbd15738daf14666fd4f24795bdb76256f795d26a6f84fde51b60d7db9446a2d08e90226a9d8d122b1a6cb88ea4185e8ab8e828c0b547bbd13679d2e8eb62008f3df7c003341b2a56a1313c5bee8c133f55ef2b6be3a8f64de1d95bb8527d6f859fb221f71f6bcd8b6c8a9d7e5ae19cbd1d83b6ef5dca812c912fb71f29ccf63e3881fc2ddb5d2cbf8e2013a84318cfc5ea0ddb63bb22e7865cad61f213d625e0059b3965d0d0ba019f1b9c8f463543f237858748ee5ea3cc8ce2e9169db250f69c42c4957ef25f05bf927d337805e7a9c127a68ab304437b4fdf1cec75c4976720c5cf675cbc7c9600104ec31deab1daa6da90ea2e68b2d3fb183b47fada1739a348859ad424dfcd9b5a51a636050bdaa24005bb3e09d32a06af898c3ed46bd7ac2df71250bb69135da4b3230e9a600952a3cc8dcc1ef833daf8af458999fb360a2a0b55ccab6b747098d712665194cb54527b1c476b4e091333379dbd6d06867ef58142c14f115b2b940d25b4d25e5dc424683aff6af940c398b7e6d19b796ea7247d57f6f1b29f5a3042643962d66c46aea38ee900a581e4719715dac6a44d115c8616ed20a5c64ae32713d2162995829cb618dba14a67e654b9a7aa0ad972cd3565b969a3ac543a5ca6a717047923c352c8baaad3acab74ac18f070c0da4cd214b5d89b3bab2805208b9e7870c36ad252ece6816850c9a571009a29569705ebaac0e73f4d13750b574673759a8e009465223fd72f4de9a84d861936f12ed4982c4395d1424c35e51c48136a3bb71e1d79b70b521edddfdd699a24380f1faa9b9e956b7b3d41859a768f66a9d89e720e4ef1c4423e57ef896749b13efdcf6ce9e1356c06ce10e06fa93e1305e565f67da0669b831e088c05fa2f19bc2ebf67657f7d691c9ce87d1f5761c8bbe256fe5cb3f027af104fab7322ded5187c0c5e42ee42ce8a270b5b252e3f050235054a7b7bf28ab5bea6c6b4f4964b56e2cb65ff8d2cea2a8a4b3f71ed05c0442127b2aa9aa3d5949d533991365698308826d8568c9a443f916060611e49de48596136deddaaca8651c4e1c762906a01a1b40da9f7888ada2ba960e322b592daa3de0455ba1582813a54d77f8d896cf131506088a9bba9f2e218a5a46f5ec66a4faf1697b1753c30fa2d759189369d38b8d6059246990ab474780e435d3f1772b935304f056102dd56386b9372ef6b781125778254d44995bab3eda025a1b15072bad43cc1afd5682b16ce25195ebae8309c013ed5bbfaa9c7820349259df8681249971dfd2c01ddc3db884b424f3a0126be38a999dec88aa3d05b904b4bd83d2ee6043c1d394cfae52f77a340521e074963371f336152fe576a72774a16cc67fe0188393e5257b75f154c9409184dc7882e8e76c44c617f8bbe191a9eafe4d9243cae15e21df29d5863ca452ef3245a288ba66b90922243c5425aba5c8c845af81354dfb276445e7638df27521ac547dbc3cba9a395ba982649ee347c062f49167dbeb91b7d93f4daeadffcdf3b893749e28ea96747a2251dd12dcddf32d81258ac5e1626fd71cad511914d5d789326ef8c6c39e122d373d120c1974946253fc4bfb63eed5e467fba65f46440959dd836ea6d27bc4a21e599bf34788ad8bd92bc90f8902deffc3049c8b70c9de0629f23c561da895c73531c7471978f3e349ec1402aaeb5a6420bfec49334613ba38eb3267466eb8ce8d59adf4b3e7fa89e2274c0b2c1d5e34047f6fa091d695fe9d1064ba530cecb62fcef245c4b8f43d09f1cfb284d2456bb7aacc819ca1888b7dbe2ca0ff83c8994bef1da1806f9c27a7ebb01f4066e489df2076af97793f05fc779fded8cc8857e1fa2017d627eeefda020eaf90d931dea0bf2ef799e2b75c10b0f8c339059b86124a8db6a81dc435fb43b9890082202d636438c8a86aba073f75df8e3cb00f25ec6f0720a6cd342f71ee185cf3ecc02d4534e7487cf64be6feb6ec18d340400426452f811407ee619e2f0a440bf0d20f1252a42c6506345663530c1585405f964c212073a6ff8b86b0d61a2ae9c0511f5e57ec7bb433e6514688a56697d15b4c70ba4dff9ab8ba44f7a83dc758e4cf30c54e781d89513d83d6c9915014b882ac53f346c1c4b54bdb424b3db0688c95498cb9cd1f3912197cad54afadd7992b8f40e38baf374eb32a5e899740e46de3a43a8f39bfe7c9f77fb734e886a2212d4c175032075d54e4f44663a096901c81b5d71042a0f83841fc18dcfbda063064b2b09936097c6d75db9116b120847d2f7e01baca50e9ee5276548f69e0b460954143ed52ace21ac28e0c83f9e3d68202df581b25a558ab3dea6f7903571f32706ea6f46e7d1e53f6d15283d8ec329093f492b9eb51e5911020f4c6275593de84cc4fa54886d513dfec010bf4ac8111316299d70238b13cb64835f4849c7656d2e0a85cbaf474a1b9ef97cc84dbcad93e7bdf19c407ddfbbdfcb660f84cb303a705bea1c8ca65fb7955df5a2799b464b5499d4ffb010399475a9bf24a1a5aa03ef2c7dd2742b2336842a1b2c0ad87730a7c4ca3f80e15e3855f446d650449477629f313c4f6fb4a4217a4a3923e2f24408ec1d306fe55d3ce2f2f74536516422b51e0064cdd56b59be5baedd1e0d3f181055d0133f7cc1fe93eaa5410f74a11b148f70902a9f4e2676a6b4ac09fe8adc5f2a4f92aa5b8eda56735b937214772fda15e585d2c2a28777e3e755039e14322c5e88726dd471b446e35431e4a16d93141a72c3cc5fc1e0ce7731033d8ed114ad8b28fb8134a6a282c1fc20b6c5bd8caf1dc90d42bb6a4b01633d71b7b117faef2ff0a21c6a04c3e80736d1bbe6e843733cfd43091f91d2457f54f5355960682c21079aa9029fd89d215e307f6a4302057a57c42e62e034e52adf29c32f54f2d3d99d80053b9635ef497c564f733fd658c2b2819f189c57e9ab1ca23f1f2edf474eabbaa0371d966c29c6a30ec7cf09e866b7f88dddf0491ded82d9750976336d482c070633bb3b74b3fb1bd64564faff999dc059947cee8bc9d7815955e5e7a395c65a9988e184cfa2aba11d7a67263257d80c86466de8f6608bbe5ce27fe78cec69c143a2f2fa3064b76765d5c5d29e4f467b4d60793bfa8711d61bcd37bd612e548d115f7e3601fb39192e1fc068ec54b4eb8c9bfbc03f0d32c346d587193b8ea03f89d7c3b0388800ce66685019b0302d438b54cda15e038f79fc73f15bba5e4eefa3854b37d6ed5b9871a4c68d574525fd6e5007eac2a7ab425f0f09b43d6b8bb407bdd007d57dfec15cc52977cc66dbd6aad4cf6ebb25c7c66c7477729dbd1e4102b4911dfc436e9c29b3aad343aa41ef334246749f382e62d8d479cac350015db653088a4e93b24be39fa1beb8e1add7776c9826d28c4e8a96d554e4e62560277dd21e413f73e700c1b10e90a442a210b5c402d206d083c21b9b9a166ce94ac1f82a51040b1f3125afd009698a7b3faa49f4758298e68b352fbaf599bcece122f88bb819e604cc23088b88bd725c06333d184a2fe4285c4adb755ee942c78e0dffe0ca705cd465f6cf41406053e51ba9f5d14894bc014deaee964462db16cd2b60296041e8c4028d9db38eb6acb9a1451d6f72e963f8a96bb4ca7913b7e16a174162118e1d94dcb0593f660ee859b9736261b26643ce67ff9f7cb76152f0f222db9042a421a9d4b642938423414faca9aafca9ac52a4e42fefe1fcb3a9769c4daabe989c05ddc21873df5c3296475701c66f8e8e05e3e4626b0bb90c5c81913b61afcfa5bed9f78b5d667473e9752ece61a6b78bbdc0c0f572d765d9e2566c5112dffe7a7967743bb8568337ee2c091e2cd153c350a1ef642ca8e59a70b18be35a73b227334de8796aa5a5f908ce82566553f0758566843c57684a09a19e832946a089080e73ec42c0e15dffa5d3fc3a22ed6eee702894ef04c694441d3882bab5e3b19b77bb39b9134f94c88af0dacdf39e785c32ce9e98219758ee795b329c4a3283c89609c765679600e120e0da74e43590531452a8370f7acdc890af227ef833ed3f89dd90c8c4212c55c15753ebe2d2d9f8d70034966d14f77a869443d5e7dd4f25387ce285d9fe78cffb02122ba74e6ec3d7316672bde6f746497f635c08deb205c8fba9babffdf05937e10c0ce4b7c43971ab6ccd20005665d40581912a831504cc53d99e2078a2609b21aa271506b5435301ef04c6d6457862dfae833c81651b0f1ba9dcc52a791f2aff85393f5d68a7855ab398698775e08463158fb97bbf52eb4ee24fac01c1a5354f3d257ff4745dd952081fbdd08ea83dcd92f6ae1863a07dd78ba04d4290fed64b1c6014814cd81c90ec593fd8fc8c9e66b6c4284518ca65711cdf049454e5a59a16f34e93c1fd23c2445da0b891957c66f9b7466cbc1fc32b0a382351bc5b631b89834eddb2a8d35d2c4f2261733aaadb940cfacc87c0403e7d8ba238d3f1314c24f4941115f54a5041b2fc58816ae3864ec399039a91f8502577fc5e9918a5c0e752ab49da983b4b752de08a80bf1d76cba9f556393aa8ee96a2d9d76f3a8fec390782b9205334370d4f25d0f29510e2f471c6684044fa496ac299c91e9cf4dad132aba8437a109d4b188b6381dccd4af3d725174dbbca4ba552a85440ef9cd9a2a2ce1b0658827443de4eb17e69e3ebd75c3eacec4710b3ee4c188d391abb468db4fce44553bfd415f77672ba125a64755f54e99547dc8ca391131c80eb8b647d9f2b18d07b17d015be5927b2a40a66bbdc312e16731e49afc6efadd90b887593c8f0b8ab7c48a8837d2918e7b9b2ce4b12cc5211481b78b474713c641762d99a8aa0aa5fb258a62a393fb6320e78f168251db5e5b57aeb0d02ea9adcc80d00245fc80b9b1000f99ebffebcd30bdfd3fe403aa53a590a57f94ebb7d4511a1e9e0442465b695f028e6eba26cab08cce4bd653d01a2494db4487a3dcdc294f84dc59c341ce6f57c976863b57e1c376cd23fea5c09ae5ede3444c64404597f3f3700f12dc40fdbfcc89cb974adddc12545701f469326f207c133d0e620693202b01a031c8f102835953a465db484773104294f553ce22e39a560466b228950fe8594d689cadaff46a6b27f4e6e6b26313ac6365b1a27268a86e41bdb58d392abd83920819849a02631c279e96adda9889d39e3be786535a4ead7082aa2641d98820623ef3a77bcccebe6adc609d7d2eafda7efdb410b95844a8542b575d27ccda880f4c430f8c40f9ca179b09fff92163c85214f868e9a91fe9dcea6fdc336d507b73aaedbf3275509a8ddea008f3a04e5847b6ae6b006c7b4655231cc72021e81cb57cae946139c848cf14f3eac4f842b16b066d8e2354def71ae1498e3b6dac3375d7f1653a41de6187acfef508754220543135350ca52ba889eabb99aed267c66d7a7627acbe02a279711a81bbebaf5eae1c9133973f49e66f9c6835bea8ee90033c0dcb5a3dea5ba9d7c3a65c454448d6eda84c84ecd37120b0d8e18f3bf1491ae04dc9fb8a980d92486aaa7ff1795f166f6ce68079ac865491a2b63250b5eb7728acfc0968cf9f753ed242c871a6a4d98c43393c93d281ecf57fe38bfbe7df0bbf3f5cdd764dc7cffb471273a2c76a9810446a1c374f97bc526978649b85703a35e6a6e02429332ac0d99f08a41bbea26920312ce7a72d4ad4bcfb2682e1d1de0174d36aa0d34abd484d402463d7916b493b31c135971183a4214ae08f2ef4c8d5b16e2ff523225e1d5e2c263d71fa0b1e0e2b9739fbc53e46261cd3e6f7430c2baceab7dacfa6e80f3c78406efc56e47a642c4de674c8b5d7cd35161e98669cd281daea8be38ce44a3a790012e4e78f2da5c1c0ac58c0340db48d6e7a1e13255ead70dd2e4a27c4d3af4bb7a517290d679628884204515a079c8ae88ecb4681903a942059fb88880ddcb8d47415132e20251249bd05aa612adaabd5cc0832e680c9faef141a7ee4abcf6c5613159737bc49cd19fe629a5f1be80b35cf8c79d78d591a96cb121569ae5c61df116e892e4090bded4b1b15628c1f85e2831f5414c8d0aadd23e8950c7d3694885a57ace181a0bd4b93dd6742033b4b982c5cce4c66586c3f3b1f682a9ef939a64b197e260b6c5edfc670847719916f30c7127d7b410344119fa2c0af3f72066cae9a77af860fb5ebbce040579efc9174301ef5ced5da526b5f20689a7905da5c733fcb7f638ffe874cc977a9d16eabcfd6f82734be5bac2249c28ebcc59e54a2bad5c69e546c0080ed310755e92eaa5a74d9537f8921efbc44ac80fa2a7775c46ac323495bf245eec0a02e64b99e2e6f0acc6f7a2625bb6d81124e2f7c857d09d08c9f065f0d70d78e3aabf2c8fe93268e87915e7121768a0c5dae4a80b502002d86d462394dfb084145326330cf6ed07196d69bd5ce3dfbbfbc629e78ff792c4071317a6dd87cd79fab4f436a6ec909a98233ddb29e058b802a16b4c66d537bac5c8aad17412ae3d0c3f3a4f663dabb21d51b393a96c23e41cf7acb5d10044a7e8146bd97e9f43dba6bfb67fefc076d7826dbf2fc01672e0762c4708c5cb2088307d946e52d7cb124cf662a0cb003702adaf04c0345175b811ec78bcd83989788f4e1b4389789fe4dda5ee4d74da8d54fbde74852312ea0c790ec4ce2a98a419d4b735def0dc3f20e6c0177c1f676532c82487b1d5648541255404d0cab3c6bbb9483628e098e6e823a18406276b89152fddabe3ab79a3fb063e06277a710a31197a50d815da9ba850d8633da651e85bf2945d10f58d559a9eb2790fdfb65c841e04bd5afc866cfe55bce1dd1738d1d2526e04e7fd7e59e1a35302c3511cf560c8fbfd080e1da8b05137ebb0e1ee3afc97bf49fc18031abc78bb60536b59514be897565860f2b22db46d52daedf17e0476a962ca623042a2a79ef79b8f2815258014be8610c01b17c89c7a5111ec4bbde5e67255f7ff18b4ef6a23a5e2be22186c1256b5b985809773e3ed2de021e8354add2140e28e298e31c7b19feb0c3fe768aa8c33f9ff2c6895f2fc12c01713c7147e1ed5238b6f429e70f6dd475e5f2f26645005e23ca1bc15f2872c9f985331550a198863031a98da57103656a596bbec59350157ea33a60d0428a78d711bd6a807d49371cc728c1abfb8a6aae18c34d0b2b36fc0533f4c929d6d01572763904996ed490ff3f41c37a44fa6eb8993050330e71b5463223bd8b53788cf6f648d7d2db560290c1051e6450723fb978a0c213f0bd1af931561c271da4881e8397c02f79b1a75b67db28d6f6f20051bdda420fd7c4612b20a3cbf9778f96301c4a70981940a072d2f16feae28627b44a64981e84bd589c105d1406eacd04b583fc2d78b2162e5c2b6b32026ca2794d38464d52211b47f2101ec587dc58e470e0b8bcedc70e31f5e02e2ae12d31f99fbe766657e943ccabf125d627343edde9df62e9de6a5b5838121e3f9fcb21d66a893986b295dbb78e95dca72a153110bcbd2efca9f860203b717b06e1b2a2640dbd133a3c80d3b7f474f176898ceb2b2772e0dab1f460367f61d11795fa715b91d3f17e507b47031d7a432bc7861d1f45db58651491bd0fd197a30a51ffff9fa2ccf40e934aeb4dcfbef2fb76d4e74c7233840be7bb858202832b39cc70328959c10045cbb234e06a2c1281acac44e7a2f84c7f7fa30f4308bbd045612a72f1377d55dae2ba29ef36bc95c195437c1a2cc4313c5528f6790c9120f38157128e41cbf10406a72b85e0507b7e1228a3f2a80e6b85d29554fb1872046ed90deb2d0e170023928856dc52f3671e60d928cf63edf42886fd2d4bcb17359f59a07ce5048edf58f6fd55965d770220ce1fafa445a0c11ddc30c271540d3f8135d170bdba4ded555d8ad4b3534296f2b0a762da4bea83d60d89373d5c742bb07c4cfb76c0b823edb23ecf1871ed27300461a3d38e360ee80d2e338fca6ad682b06481e8e83888d758f9c4f37764f83d8ac023944ead7e0a5664559e8bab6451b120d42088dce7ada71cf4a1c3bed6fcb48193d39482b288abba24643bcec7442d5759e9b3094c52dd1a1390a166713d6a0a37b3c7350481b187e25d71cbfc1feafcda1eb22b5d8730dedcf9be91adb6ecb16144a25631a496c5c66ebcee41d00b4640003eb9b1d394f5f8ee79736e2929ce3791b1cc3df155e6dd80b2bc7f91ad13c1997874e15ac12488acc3f4b56d50582f0423087562b03c5e14cab16d17910cd795ed4c93e496aec1c8e42b259af81988b6fa1b51a5e488049e14d63290d30463343ae3cf120486af08f1c0f37fdceaa01ae14858b4a7b33a1b33c1a12588bd226edc4b4b9e1950f63c6c1b91ed74cdcf08498cac054231dfda990740021df3369b6b917e083f70bd4650c5f4debbf50c304c2c02920f1ff289abb20c24c23f22a7fd0d09b3913960cfa389173cb50b1f33181fd6abcfb34618c82a073353a14dae776fe127aa44a747296904b4dc0cbb7d2462e042552d0f9a7770e103a780df978a841f8cd6e4d18a91eba4e27d15e4e2bbb5fd1ce94b332fc4737a572399f759f2d2de70d92bbdbf391252b54d4f9d2a85d6aa832c5ac0f259bb6e013ba2f6d387fdefbe287834c341e91eaa162ea5470ea969e6aeacab5edc457b0bfcf526f0be7d998d3acb54876ee31fe93b885ca08e03fd1101a9f6283b664cd8b66f7ae81af8c330f168269a3a00a2c0835be103c2365db06607e1b80df50733be2f24002d1af85080efdf2891ce24b98475708d11c44a9ada84e8ec23e5b6540f76a277df5beb0078ff182e145082c0b48e70b745ad2651bbb70bc8e4a44da8bfd261341f8b1b9f0eff3f5bf8f4cecb0fe8637b6414d0fe7dede56801b0c153b3bc732fe6905419785c47e72f5c74dca782f222d82c987d84d46c3f83849577f2f1312d9f7c43231455d231806b26dfb51d8ba02fa1be8a6899e3eccb2f5296a1ce3657f20cd4173ab6d5c6642f29621cbff6f5f3ffef84151fb5da5bee1f5de807e861ef139f4b5d0c8eb07ada9136931878d4dbab9de4a8a783a8672f17e87d089e3d744b63154270cfa78a78fe1cfa704129f5fa478885f56fe8e6cd20e377c600fdf148f36798aa837e0bc17ac305960771d14666f739edab5822869e9f5131173b050a24d269c7bc12eef2af6cfe83165b10677ec60f740aa0e14e8edfa28e6412999eac68e15de1d1fff9b82492156030b289ba7836893213fde4d4ca4d6489c2133a8332edc8f8e483452c05ab127846b65fc5930b858c4f6fd0adc85e18fc675aeafc65d9b9ced088ef36a8602b422833128d4263be2cf94612d8b6809da3fc68f4611417b55ea332ec007171df88497c2d16f589402e30bb79ed859d31d9d83f6904bff7f2431e7120b7517bd94dc57fe1ccc3965094d4c8e8be8a2e5481b575cc5ec4f76122c0318b34f5ea50322def9c366a9a9956b9089d7326c330655b82edbad92b26b29f2fd87ab40b833cdcc711dfc62f9cd7bf9eb0738d4cbeeeec7ddd4b6015639ebc1f7d1c01f716642d54edbb40c3a5c5aa960a7dbe6a063966885fa62d49b28ea00681281ccdce548ebfcbf26e751f1b299a8dc3c21023195d54d3347bd3ce61a69da8605f89c6d161737efe6b5e527544cdf3827f3e62ebf33a7d7520031b79f3b8967ff40822c9467bda6d2bf3c06b0e5b42791c3b04db66ba7aa48f10424ed7cb763ab0cffab6af5e679af3183869c74b4e2f63d2ee48f26712972c2d4e1e4849dc4c75f7a3100f5a165f5e15697dc70a5a3ce1f9d3998e8ee3e110c87ef83a5fbc2a20f64abcebe87293ac719fe5b20ac2afcfa7dd558e9be395d0d972a074512b12391d7a856e1eab046b1542cf803f928923f0350a1d76efe4800c91d65eb9659b051104f7163bedae3d2157fade540eccb48e49522780ed91c88b4882f1e6d5a9e4e956859ef320223ea68a57c7bb565981bb56086007e70335f42c08ff6d1ce6a24850a91251ccf43e9b9617100fee0f149ba9b3bbc944eb403286996ff9774228e77b6f9fcec469e0a3704fee9f7077cbef9c3e93117f8cbd5d915b3c53ad34a76cc7decdc8fce33cb69fd1a3db3d11f9963ec58c302e7288290b5a3614a0be453e048ac50974dcbcf9dbae46a11a2d01ba9d9493d386007defb4108f7504d77601c4925a6daad1c5363942e014ef97b2e7dc4a6bde641f4abcd86c5c178ccae69e39aed0f09980653a7d598a67d87587c06110e005a754854af55ef79fdf2034e5efba7bcfff842e16cb8ad4f524331a30ed6ca4b7d121bc637b804f90307a5c9175644db5e0917add4308549dbd5e51a4b45a208df16be7b50dd54e58545da5ec79bb82174614fea40bba4e5433357ff87c143611e007b7ed55347838820b5364dfd7de952e6fd5bfb344420f8ecf3370f611f1b8ca86c9f1dfc5151f5c3b3de30d55ec60359d2292e926c6a7595f5dbc7300730539f47274c2ffe43306cf8ee6bb2b18693b1dc4095bda26f3360a7d247ec03d03693849c8e3f91a802bad6cc4a9a4620f93c0d3e1a4c744c6cccc1d7a9e955431c43649497d61f3d162d53379f79cee4cbe6bcdc2d61751f09612519cae44ba28c9d9c481806c777a2070465aa43dc7b50ad106e6dadf39cd189d95d647b22a8ca6d931d7cd4da0bf9fe28cc59e705ee3a7e3368e5df8e746a0540ea25c8e769f6dbe1d9b5ece225b7c796066500bf6ebc057520700e429d65a4bf05bd72cead9948242ae7131f21941a627a08c6ee5635749207777ec455eefce4c13a8e956b4509c4a88bb6d7190c73399899730719b5c97974cb960cb578e885a1e3d1e1099dd25a1565d2e3cbce28987d10a8a7d9125c41f0163c50d7bb3bc7eb4a9bec9cc4facbcc08e202dd50f820bd081f446fe007d35b7c60d01b1fa136a46e92cf79aefff226dc939b539589da8912f1a6b4481dfdccad4b23ee88ac7312ca70d9b3f2073aa1a579d8fe7573bc7fa2bef54c696c6fdf7e78d4519e4c70c0c24eb83497faf40dad191c6e70faa3e93ef1d4c0b9eb43ec8716fdaa9ffe9f2dd04c99625a72e36f9ac234b0b681f406702964653482d682f1f31fef22bf1fbfcc0abb32da30bc7887cd6e1080f2d610fdc3c070a05da2ff98797c02832842b37a31486af908247de748b1b685700e2429d718f46ca2b34d19be94d8182562464ef17dbbf66dc9a516a2ef0715879561d631f86bad67db5a330f5d3143db4864349b4e5e439e6a145353bfca7928f2feace6eb5e4f935d923728bcfb8b800028ef0487a83fbe1b680b9a91fbc49d1847f4b0bc6d1d810bd1501affba3eb024258d5b681c5257f7bcf598307101af3bb497916507da43ced9205c51360fdcfa0ec6f9c3d6907a49c3944942ed6b1403321c3f47189122d85e842c1bfea28ac0f786ea654cfca4badd50bc7521af9093e0bb0ce3af8d27af12451912a7e03f9ba0884a04a6f63c436d3e690703b53f8016f8b6c884824a342b9d4bd811eaa40f474e30e1c54b7ce52f91e860f07616aac89882820a69da2f20aa2f5a7e48b6ae869c82ad837cac55af7c9e5a685474730c7618be629379d8a54b4bf5d6354c2dde2d975fc749a699de5bcf32dfe13e06054df534d6608db699e91390cb95e39778d8f185a045c9a6ded78cbb8bebb23c9a1657a9b4865c78a40a224b6ca1b7e087d0ad7113b3ea9dcbf4e5c377949d01abf2c32bba86950ca4d43aa3e271cbfa86608830fed8589fd5f57021ecbd1e54da6438a2454ef04a642a9fd42f4fab6590527517b7dd68956e86bbe299359914199efaf4397ae386da63f6c14e4a36c81f054218576a384b5108b23cbe4cac271234053799dacbd91adcd74df345dce2345c3a9707059cba4dca3537d37ee0ea4cec7a8fe6a79446e06814c687a9c68818f439d39aaeaebcd3e2cfe75774397f32430b66bd3877911495c0b90ec1f01cb2451211e8fac316c1084aca550cac2d1cf43f788f935a21c0a17b13f88290c543e6931996c1e25e5f1cfd818d68f1d718a14012873a7568e4a9c3ace3871dc91a530c3f8b3c08a115bbc421eedf719a144536195e12bdd800777f408e6e9aaf1d3b1b0bb87ffc3c94e084a0819bd9d3abf590030552b44ce0fafb924615dfb78247e8c7fee88ab90e7e2fb0f2f3d0369979b5e7fa727d6eb82cbceccbe6c2cfd363a489149a724e02405120bf626e544ca0fc97abcdba3054a11e20cee642794a24f5032853cbea21072372b64424a011e0df224280a169000737dc72ca147dfb1449e13e8e677e24480e70a695a9813dcdc5b1e3b94335331815de9e233d6bb925f0d7d308a3643d99d31fb370823cab57677ea5ad136b1b45c389b3894ae5f5d2f3b31d2ebb1e1d08906819b867c13fbe7975824bee474b0ed6c4081ae26e36685abb04e98ba00838ccb34b2f802a02014695e898ded7a225c4104411f9f92120a301c48795bcf49412e8bdce70dbf5198df4dc5113a9d52dc7ba1289e4b06191ae36940f6b13dfc92f6f18f669e92e0c3d5136c18859daa4a2557298b148187e29d8705f06809d260a3e5f676e2316ab31df76b55d641610ff61c97b823ed61e45fb25b89ad18d96d9168c1be55674a901cd7174e0498f1a1959721c12bf32c59a6d1b0b7acc96e006f714aaf451669379fb9637e82057cb1e8ba710c43ed117efddc17d4b67ecbec195561f8d195d0b51a654142b29848324853cc777a8fc1a561382e3e232004670bb3cd56762ae8341344618d4d47208f9ae5cc52718b08f889da9a97e06a80f700af8dcf73618428cb7379e7c5b5052b59918b751a4f32224c61a66047a9d609ef5cf7252744b2127b7b0dcd7f4d8d13419201b06df235b024967dc87a922b4aac44fd1ef94ca98805203aced89ba43710323d67c2ffd03dc483c224fe43dbadfcce5aea24ad2bcede482b31e9ab7a13b324162d56635f5aebac9329954e1d1636841199d58b8b0842b667111739611d939f35196b8329c0015252758e78be56e19c3f1d6e7b73d4973a07edee1c8f31d9f1d20c23403b2a69d1afbc501a68c5d04a537f5b6f7f7d8170edf8dfa4ea72f16891514b5d8cbb41345bf16564761d5c89ee29274db5a9a08350f6a2952bd1a9f8631b85a59ce5d056e32625c6c658d19dbc973c83bf165489269f42f7c502bd3c52ebad09cd44b8ab5e1762a868c442724e615c2e6aabeaa3e46c1ab7e6104a9f8312b55e914184f51eface583add07f9da6228d3b514c31ddbaaca1e2c5399ea3000df3342ae2ce01dfebf17217421e038494c4b3f8a52cb91b36c77299fa336043a349a2a5f5d4896a244afe4726e94f2f1cd02e89a8cc400eca22979c08e8fbee7aa0ead455ad470eec33fc85211e56fca0e18f50dbb16823a543c0268c73bdc87d7a13ad4465e7599845368875b45e64e77f9ac29910108941c4df04224bee7e0af26808da05b6f30a0d558ff366302d5b9441918617386790e390d43dd8972b5025c6c003aea8906482493b7eb6987e1c89e66b4cf8d66a6432f225636563d47896aa06320b538703bd7233d2d1529cbe7c7ee2dd4423412b1455299adba9e05be87f440f5e14012d7e44c0a70f243ea516758995fb4641dad229c4b2df55f4ed2569830fb84e55ddc040e7687690240734c5bc05981b9d3ac122aa490e35b08dcf2cb5ca0f9c3affeeca04cbdbedc41302e1f76e456709531f609d1747f497efa36735819d20bb73efffac7e9eff52b0b59e4d3378f92827dfd5044f3097f927bcc27172a13e535873bc7ee971f36e2991b3e5285ca6d09c9b166b6b2383a7107018ab6b541699593207c7925a0c5050de446612391dac6b634082cad3711cadd66844153421af90ca6ec7a352020316d835c08861f77717622817ab926a6137490c2df60c003e46831b23ed3539f988fd966b029475e30ccfdedaa30e92e76fdaf4b1ae25e58bc6623d7b0929aaeac3d7481d9575a46aeda762796905a64186caeb0bd257d996e9fe03c602b168926d04f5b3968ef45f001c25311619ac1114e23fd8b1f382abdc0b49754ab15076aff23f4159bd0fe8d8546f24b812f542c1fab63a0b775563536c8fab6282a5450a59ba64521d033718dbbd107e388c2a55fd0e4711900eb7ffb18f10f7f17ec0bc10d484c1f998edbfa3218494f575857949868393238dd66bb50341c84409381a5c5858a3090a9a5e3b58533aaaedaec495607d3fc465dbb027d826ee187dc2d706a0e058902d099e6bc132daee3c5c5e197d20835cc6942e849f9fd7a20cb3c51f707a9caf9af5c11c19bb3a83385cc47d78e1191d231f8ab3d1d9e783c7a17147e14f2e8cafd98a4cf8f1f9ffe7b1de3e8fd2385fe6e16743bd53565ba155d8b4f40320b9581ece0b38edf24bdebc6ba75c1fcf395c07a846cdd367357e89fe81b277ba6c89bf63ea5ca94e4784b72e43615990f0c0d770aad51c735ee622927c9ac3672eb2a61cb3aceea79f601296b9ee528c6354265d92cf2e03311e97acfc850799408287c1e6ea83720320c2a0e42edff504fcd6828da11b30e5fcaa543794f068cbf16518f78073053f5056c69896d91d70b7f471f180938f2178d0d091153276065fb61fe168fec0a4768f2e52ec14dc5c6281026d6bca4897d4a04f074a38b2710160171b4d2dd41e0245ef7da941f11e1c2d79d6ca006d018b395bfc52b92cb4473910a29ce103749da71e5f1feb322497717a0000ecda2e68e412d0ee340f70aab402bc7fabf24c05ecfed15496fd39a6b658b6f098bce75a34662085a725f364e6fc72b38368ca87693e2ee25a06cab2f13c10633ad73b4610a0edb78bab3efc06f38b29d3540aa3f72bc90efa1e3bf52e0bcd928af40844e9cc78b7df1e7d01f822e608089c4007f1578090ec3b3c1e9b25b89c2b07d48d6c7c7fdb0dc4b3899a32c7456fd13a8082b44dd67413911bf6bc98e8502520b8b90edadeca68de6641375b4cb4535fa9283490fc18de9d4df6e03e9b66b13103cc9ba7d5f3536e4e8814b5d70c2f01c7fb69161128cd4aff928ec7a4ab49e6bab1c7fe7927dc7adda2a08f0d1c37391d73346781c2aefa346499ea2e5d2ede2108fc44a03a8c38166dd0c4a95162db39cd9b834c7d804c4d3ab9eb3635502deab599d5bfb95d72b59c90614a5b0d74eaf9cdfd00982b5aeaeba9ccee837140dac541f5d0f80381e1a6a9730c4f8f7e8b592c539f96e73b7516b998db9b6940b65d5a0f0221eda939af58f93e7d77a24b06c49ff53589f8342ac16f6fc94ff29dfb4a585afee9ea933122e8981223bf3efd4af410088ffca42ee334992d706f527a8d8f9989af067e5a9a2cb1dcf0bea18232260654431dd51726d2483c29add94c217d05bb8f8df072f3290689d49212f3cea2fbc337c2c0a9812ee72cfb1d7acb55f9c35d61e5443e6aff8c447252f4aa7a1c1a61c06ecdca76b8edf64881827726e0601e59b5fb844b99f7ada63a13627730e93ec90310a41ee5c744b0c1870a1844a91155f0f08c4e160f9e8ba0a0decef6d6ced168987d707bfbb50e03073924d44e4238f11b1b9002bcf11b746dce92af119f877e66bce32ede73a19bab999413994040d76bc561c893cec7801149659b8ef301d6256931b573ebcb4b5ce0df690b72f8c242a9586967dfecfd553b34ac214c3dae889f4ff465a916d8849cb108a4dc1bb46d2e4753dc85642762e9d4283287ba83db9657a2e62004f4b0d620a89cb1a8784b54e34aad099ebc1ad7da627aba9597158639a5bfc526e68674a278d7b0587598890192478083dc5015f28582c8c423d6b7df57e2c03e92f99a19231ca14db9243bf11a8bab0a0e52b3bd1d4669e67461f34c00dfd0c48617bd01416c725384c3ab741c7f9c3b6da7fd521d4298563ef8353d0496a901838de4541b4559cbd589b083a13a5fb626ea4c8c042f89535ce839ab143ec88a50e3db04b581c7278f551a8a0c88f2dcc588482abcca00ab84d498b8fe29b401bbbbfa42a4cc226c1723dd88090ae5b22ba8917b5a060f2238fb5182ee2d41fd51783b1ce5e08f16626f5150a104e8d63eb005c41916c3b78ff58b8c4eba0dbf7ccec9aa6d2ccc3187a3a3c3e57243b0440e80824362fcfce297ae40bf0dffc84b19e9a44a14ae41cb024b9744ab18ede9e9e2cac6836fdb89bfc895a99275fac83c1baa87f0efc48166f755a68405144199f467d9e57b559937a996ae5a5f18f8295ee7db7a98a459850aeed35e90a245a0c6575de32d8eb0a2a7de98741e77e219d80119beefd82086712390ec8a2a37e78aa88704aa86a250c2f91d85cfafa9debbb80f82eb54509b6bbbe00e6225374e4a47fb5554c833ca88ba7eec656e9a5a403f7c0843687d500d2e66659f5ac6e26a922e047d0d0c9e25d47b4e48879a0caef173b279536eeea391eaacc1c095d2bce4f5e1a700839dd29cff2c1a158d13d28883594972f14f4bc943dbf18c1486a472445615dbf93f665fd7422e5b5382f6b9d148d0608df5f9209313c53139c979a50c6ad89841cf08101b2c6a84b18fab12f08fbfc2ca794c2c51817d67f36a01b56cb36ad8911d2fe033cc1359926ab888be8b04e6456ecd63805422364c752783210f6ea0dbfbf1607c35e9d40945be8d54d4d7fc90e7571e20cc7f8bda3b6547dd170a3e917606cea48db513251ec0129194d1342637a7ba2387ed867bfe195e002436a2f8f93fd2e79ed9eec513d79d2a185daa39101982a301e09c7c1c225ac2a62d9a3fb42db993f9a3f774e321c6843008dd08f367d3ee56f0543be85e04438800b0a64513803b6ab4a312663f544386e738e6f443e3fc04d0a4f81269f1ce79121e9f9466cad5c5eb475f26834f72cf718638528c3e086107f32ae58b8e29b3c9b8583796e9c240c0faf9435b770d89b007d2397b2746a1d9851f1b9c9b59efeb06afb1620d64dd67687b5745721b673c94adad2a4404c602bddbb2d23658d969318f449527b0f128cac9931845bfc300420011f792e93535fd3ea2126caf2c6b864cbb6bab4d30214e246464078127706dea43bd1db23d6563ced164200c029ecdd9e3330ef7d76092a4c2806c348170dcfdc08625bcb20cdcc4ad32ad2d289bf6af7d119037f605b5afbf130a6092e072dce1beb864023a9f79c5a3a5f98dab3a65515609b404d5ced7bc1375aa94ca605f68846ac4ac88bb194d6f6da7aef92c63733af3c43c30810409578e3d8e22d31d0b06283d6924c9bb4901042a939610c44bd3feb72862b816866ad20a54de52c01758813ca8b6ac36be0c97708225c799a837cb3cccc967080bfaed5163cf3d8382d0a7c5f482bfbcdf0a4ea2513670bc39a5e00fdf19370dc6542f5c3226d04b4d2c0c8a65bae7c481bc49ac926aed78aac0af2cb110aece11b8f2b6fb6cad716f50441029f1ffddefdce253c4708d22604a82b2f5016a63271cd02e506c7ee1c80cb4ced4e47f6383fa6eee82aa0472af9552e176672d5592362440923fda58a8509a950cad878e023c075f585dc3552eaa4af92367ec4659bf5cfd8e6afd04c17df69629aaf19d1855479b5f1d7c722602babecbaa9186e8895c4115b8238bfab23413046e63be7970c971d902fb5ca2ff4dec4a236343bea3abf1845c1b469d73a1582d164635cfcf2a04ec1e215e89b940fca1cbafddc50fca43805600a8e086e85195800ed609459d79690f4a0514c53c0f32c1c1b08222a1950c04972abeed430e0f17eeff06544212756bf8d66c5dac489283fc60846329da5412f28a0a83d30ce860d16f201887c0af84de974d009e0018964aff08d4a9fb14785d023bc804899568df516bfa449263b931b92fb3cd3a4f2708fdd851783d1362ca45ff38a0cded50a959292da82accb2164b0ba6e0d6ae606d2109b53f666359995afa62923bb4c3254b0bef114505603218e9a56528fef28461b3483249d1e9be49f2445b7a3b878eb4cfb1036ffc01f57ad9908c34da333896b780d4f748046462c192b269501842175b0e67d9d29481ba563f82c6b56f3421c637bce9bb65f7017c4cbba2ee7d9616657655095c1319e295d1e00c640eb26f2f431e1ae4587a4343a79b870d4528c8e0f69595a624599e938458ba643a20681980ab6970b017ac0d7efb1b5e83f1b1d1b063926abd58deca36d3565288acc2d4088b8e13896da1e46350c39c5e761abfc4703271e668c1059894bdff08f0614aa4772d9f72e40ca6e04fc34193503ef1c082e75c79095e9839c18185ff4a1551f946cd70456766db1d0a4f39e59c52f62cdbce32ed8a8d3dcc41fbdf155471ab636e474c6eed245703acd50824f44e0d6295915c1412371d0dd2536287265c93a71b58b937d47b6a8671bc106c95d7aab570c244ccba305e40c4d55127dbd9c5a9ba9447fb46c313266191a701c076b04f76ec98206554d22c4669aa6c85c0c762d20bbe3f6a9f1ca611594438f7895240610c58f75aad70cd75470f9a007a30d8b5a66b6cd5bcf836809b187d1ae86248f569bc749900106cc2baf43949fc306c496b9a6a34ec5baddea773dcb7be6e2f04e0e8839f302abd884c807aa696edf973eeaf905e67d6d1ec80e4026696ed140ae4713a22c64b59ea37cbbfe1b35c3ca0e35f07a2990236b360f30ad7e84b23b55ba60505cfdf008b59d44305570b0a6c4b61ed2fb085c6be5482d0a77ff94280fec16f228d04adeeffec810cebc7be2a3943f40c67fd14b0b35c4a3764e1b639249720dd7827cdb22a04e235c9299802b7cfea5b7e9b07a554046400639ac884ba9f7ca5c0315daeae4ad29a4a780f5bd9929780f771215b229624002975ab68241f120a3611a03619244c0cf5d911a6e70449cb23930c93c99c03bb04c229418c1d2547720e3b3f5f11a0e84f0f51fba5af4768708271f0d432dcd8c1f808bb517fca85b7eb18b4ed187e5fe7dfb29277cdf1e9b9278c766e79590745e3c9648a4a94b9f5111b59ff4aad2266bd4dcbb7515195fab0ba485c4b62bd46873652e4fe998bc4fe4ac1a50d4b0eed44010b2540927b78d2ef5310655f3234c947811482fd9c0c6cf8d57d82494189b66697dc8798404ea234f787ffd54f04af4e555e138802ff0328b4c181612b4d80208dbfe6fd60659c42b0cf8af21dfba0e02b4ae205ceb8d55ba19c43d801e50abce08d4456940b0b515ad01552167dd7149183d6d7fcc918d5c22d5a993660a5d87f30da0149d4d0b147d6e525d843a242acd3368170c7568ac5c4dc2c83b5623bc4197daa2e0a13c07552705d4dc3717ea70adad8004b6c51d8766d22d61599fb693ace46d0d7edaf0a79f426834864b8fc06c7faf4e63cff3dfc316a740bde3001f18212b212881d40245ce78e0ec4fbc0ff945338c6d62800ae1449d7404da370037535090fb2dc3507c93e817a9f9b5dc5ba646915052059b0130c385531acd4a53d6ef234cad7165e4983c14920a6b1dd439844c3e49a52035ee80c3f81caf89952fc057db6bc1bff7c84b99672ba5292ae0930bb2ffacb8c8c6eaacceb0de43af7b79575dc5e36931cf83f68165942fb9de822b40f64fb78069f6d9c4665b39d6c5a356dea6c7f23c5f638119327621b2f5921f5a38475344a68af2ac4c0f4c06f1dac3127766da05c31da5ccbcf18b6cf3ecd417178c808cce370407c25219795f8fd540c9cc89977073c9fc4d8638d7f1b18a056b42ba00da1a4ec79674148924d98e4d9dfd73e5260f663507af88dbd72c9b713ed17a919c655c4fca9b71693899e4d54dd0d7fda5dee217f563d1dcec94593801d3a5284a4968d5cda17684dd1ef507c10caf1ca437aceb7d0af69e89afc4bab4a19d5a3cb79d2061cea20e49495ff6ff4f5b6da38298de4dbcf9188b581a927935ae7da7395a63d717c8ac5eb18f1f5915e6dcfb781c4092d23fa99817d889bedeb5190597d71c448f9b70346d64334d17cae44d9fd1cd6abd6a1d1d331ac63e837550d40ae851ee34b314dca48f9de4d3d458cd0c7b422494006ca41798f11c6fefca4879067a76c39bcf38af2791c92ea1e810d041f517ea35690b4c32cccfa2ab67cad629c718014d15d0e79764f1e06fbbee7388d92db5c918955692f2e4e6ce4802bbc02cbc6016b35dabd0b3d7c5e6c50973edb775a83f9f51cc05e6674d572f0bdab7dc19438ace4fcda2c8787ed7cc0094b21c5127c6ed177f6364cdd5e92076b7d9b7f9a4859ac965fd2e454bdb77ab009e205a2b8cf0ec12c3cc6800e2745c3cd5d021e34bfb6cced466231f4446b3b0843de787a01c1c04d7b7380246d95a9d82bd2cae6d967b9edd23a9f8e6a2a61f96d5e277650b2057ad66aa25138cc5e91266e3be80733d781805527e225d91b044f2b3a1cecfabb3ae8e095f8b1eafb2ad148b8c6d410701f6c4dffecb8f431a49e70f337d1dd584b9a6095069ea7d87e14402c5483ccb79c815860349a6fc9eeb639cfd52fe2fcd5808d066a66c6300322d74e199fa8c014c78b5424abc5949dcb81c7e5cae3d6dd813a45c4582bd5bfb8450b03ae76ee5ea2ff5a1a3db944a2d5c638414ed72eec1656b46e2167f77dc9761e4243021bc45f7990b953ad35eda2538395ed7870f350cef1ba503aba18f172dde2d46de2343e22de42d3ea1c2ce175a73bd67f36c108ad619e7fb06bd27262e320e95d21774dc1b8cb65355f3db34c36bbd2f596b1e4334be8265e6d27e6667a8e163336ffaacfec3473d3bbedfd5b8b964210594fd36304cd97cb09daf43e20eaeebe79f08829e0700e685a3f98078c98e302a0f5fdb7d8d3a1ab30521ad8f42dfd27c7f9974f55f2978efe8f1124b194eda34f5fc79a825b8868e3796bf411bfbea58b0afdb042941457f3f321dc53128a36b89dbb2dd85bb9f96faa21961a3448033f29b2ee181443999cc30fea01d5e24ccfd0c5463eb8f51e9a1a8983a30093ba61393e1e8aa5287c92009f1a7058b09acdddee731e7a6c4861afc55c7091f2aa5c8ef698fa39eb79e0af6ba2eabbc5df753a0b36cbdfe42d955a3143cd93271cb8f012652c43e54775a31cc3e3c9b60fe8e495c395937bdfb8422a340a3071b8245a12c4f2480edc87ea8fc93101fed600f825a4314fa0482adf0eacdb07a029c1f2f07de4c4fd3a5c0107a6631078867a3a812c272cd2b97addd7c3b4c0c7c19e13396721783c4f9272ea714669dee5c51d246dee723fecfff678deb7c37756c4538a2b1945250e67c6c117e75d0a619163be94891e7f13ea29b7fad1edb8988bb19ca2af144ac13acdabff82d07dd1a6d72f527d0c1c988f3ed1bf0fa1cdde0bdec42b838035e659a8b2c53e1231ceb843235bfb1d7eb52dac6a6af0dd4feda255bdfbe90a80d5b24ab259f358e4f1fdd42ce99778784529ce1088e9ddb178ac67345e4c80bcce2120715a1ab4e17c0790abaa4b395439b5153ec5ad3fa4018bca598f242c5200df5c3d4ca72f72f4236e70b797355843533b291a40c63ad423ed5c16838c586142cefeaf2f4073fd06fd1198db10d4e327a9454a04fdb0afbd25dbde2d15179920e06664e6986a9551e6d0e750231c91f81065aa5cc56f313373c110c7f022e05a39b2b021b6f59d28733088dc715c31a410483dc68f022e9286016b05ca4a306182b829f5fa3140aaadf5160359b14eae2daaf5d9e0e55d52a97313d46c0ab641de352f092cbacdd880d85e0ee3be096076fa84c23cf3280fe1d4406da0bf9f233e1ea908944b8bd1964c5f8f0f765ac4c0fe9a9e0dbbbe42a6f8fb8b4b9e423fbf56393256669012a4dc005c89325a5ee52f14f98402e22b5bb2ff04692007853f3f3a376c7cf9c23c987b5e443c2d488a05c8295d0f0f84c6ca7360d3f22f3632f0c30377167e8d75b10c515fc21ad07824e0ef2b53971f73edaf1653c5ccca861cc44cae8354b3e92b4d99bbf7e590ab7a982dbfe883b872b2bf4c72841209f0ca3895360cdc5e7e484738d7e4b6886e227c1e2e2f1526d583117d7c654a75688b0c0f1310b6cf6f2c7dd49dc3a84d0010f2b83839852265f1fff3c307404f18b5926493b6de12288b1e703cc5f7f5ea06ef1dd2011202c80ffcea302c6758de23336d03c5d25f3df577790a4de49efd09472ba626a60573fd3320afc9893dbb35cbeb08014003cc61bdff6bb1d5c46590164c2c7a0b82f1707b8f42789a6e9b96640fff53f71c62840ddc5eb34aa4d3f3ffd8b9cc782a993dc2fff8b636b75ee60087bfec016c72cba50c76d30f9da80d8638f029d4db221e00d40a908fb7ca99f32c671387cd3448972d84a69459dd1a17f1b40e5512b04e46cc28b5c8156ad54c13720b0faeb614a97e08bb4a78039ea027bfccff6db0637cdd6e0ec832423ca170ad3deb57ffe3343c34f069a5349fd8eb8de975a56587044472f49b370550fff00b16e9fe39ce7e0afb4b8c0e43e234a4db043c88d04284e5228cca274ff92236ffe0f68ee67be398a65dc407da34fd518f807840732e79b881a06fda39874e17964b0f4742c2714e3e70d92055827725bbc7942d9dc4828d3227c7735267230ed24fbad8e9883907a1e336963125a2366390709741dc89e9448fdd2145be4e6d34a4d1d91470dac20b4eb76b970ca456f8572fc4633fc2598247b792687b1c7b331a3b4461f0012e4e9c9ee9b04dc587dc8371141a655998648ff89e91ea9264bba62c8e825489d9c7b6913443b8b2141bea76f451f489d05cd8241023b948b112a703a173fd65c849ff96ad41837bd93a18a59dd35fee4e6f87a9e5aaf775041f5da2d8112a138c0cb8594454a45ca083886b4e310d0137d663668d80b30a9ecaadb345d561049d459bddf0ae98bcd165f3d1ec3fda3e856e095d7d0800feb329b39f95c9fe291876825792a3203f4cdc3addca09a724f687018a24e104c3dce0bf414d27c0bb2d14bfc1f5860f3bb1d1b84869e0c8949b867e390207d96b9506fdbd486deefac20a0b1fc459983bc0e0b98aee13da113a36ad2fdc654a2f9fd8128409c00ca213bd405f60f97c85f4332738288791db25ca328b4e7b3adb7c0fef638f5cb4b1b31e94e47b9ab1e2e9a13753e1ac41f849edc5777d3e79e911225d79a952d93ac11bc52b67451cd6b87cd75c58e5ec3d2c1790d1637276914bda8b547057b6f09f9056cff04dfd118043bae7b50b13af90a8cf86475d6391ca5b22b0a23d769a35ade080c36174db8df670d0b7555619623dba5f03abe959f440ef0fe46f5c3b243c71d9f7e8a50aea522d08a3a89548150983254d893e3c26c8258f62008eac8e3187c0db5942ae141e62412aec3771cd63e1fa224b42a59847c6e7484ed31b26a1fd8381cc0ac1b86e6873ad8ddff7a50b08836baee156592c2e418a7c6b3294d246683b645f046163430e170d4d989fae7861782e9e85a4a8d677f8bbe23ffc486cbe8efe00a4832bda64d452a3000311df6aaa591268dd750376ae9ae734810613de6931414f2c3d202c82bec35f761dbf0588b62177647db07a0e9f9643862cc51e6403f02914657a27f457d717f19afa00bf6084b6b34731f5b9964ea7cea07d5fc5a85c12a00210272f19b38803a94e9a412f7de54621888be887f213fc7d9c336a07c5cb0bdc4dd73508109047147332fdf6ac19d17d0afb263dea52bf6a651a5a55ca912ffb69c71e36c05dc2484dc2aac4d0f848e18ee5718edeb123600c02b8df0614883dd215e67070e83b980571522882f83a1e9ce8e828ab2bfe34f42558e6a9817745974927ae5333d244821f67d9df9c95495ea16745e861e5f70b72027b74e25f0d125871b44f3463eb9a068bcef7cc2e5516bb9f3328e897121b563e302d606248b579f57b2deaa605316584c1ee99e24c5a257a590124cbde59c00253c501317b40c2afce813c59075b831ad1e47fd01ce1b9ea012264450f8d083cb43541c6b772bb254f0ea63ece3168b9a27ae823339c97bf53bcc40755ef1ad035c9046fc2f43d0730498fc4f82c511b831d1f6f671ffbd0f60aed8d1eda8b0a6c318dd5006684b14fe4a9b0d4289fb208146c66bcfa93837cbdc17268465e11b3bc4ec000eba5b06edffda7bb5b530b8f076b6de88621c368be445efc6934f7da18263e4945fff49415072fdc2432368dc42cd6fde6a9dbc6999eb59bea5f2bc2c1a311322b57dbbc7d66815760a6245b0a8801501fc46d4c86204072ea71310dc2170ece85a1a4e93fdb5f3279ba9ef0d8b214e89733782b3073cd170ba670e47d832f8d44d8cc452cbaaeda04e4bc0c8a5243f98713b02cac0047c88d02d7be6a9e661c47367b2d984668ed2631e89d848a37ff8f8b7466fca64fc614be9c9da3cbc16fce7138d531ba6d1cbc5f82cc7fb4988c4693f6fad48d115a621fa5a1386c3a158c28c25a8ef9dc7afe78faa7a3563650455c591a0d943da8b1854a3284fb24f48f8520da6e6ce0a50ee7b2deced0701ec88adfcbced1801c4f10b605819f80522e20b15084141fbfca155e9687368b7bac253f77f83bbea5c3a0a03ac22aca32e7dfaa5bc33b3ddd928ab92af639675012a1f14c7ac8e4370cde2f184e1ede5465f7e7e567f3ba9313ea13e3b371c0ab55900b58463fa2b623f2c2080b8bd6f0f040552f2a3177953cf405d8d64f1cd6f260cd10bbb1601cf91239eef86da322d064eaba184c4ff115858062197f40b1b91bddc8db374aadd3248036e6107e12d416d5b45e4e0a87f5e7366446c84d16451d93f985e9dc5dbc64394b513bf93b560abd74eb79bac566cdfd7fb0fefe8da81f9fcb266991ede82bcc349e8bf7302175f6abc5a2416043252e160e04c232deba30f24f5b9cec79f61801c199db899468416c198e9adcb709034392d70076c5eaf585cfc1f102ca014081a18ae0a5e32bc6acca708a6c160c57acc3aa20169e2bf91ea91c10aa8a2a58b2d498c69fb5ee647cba92832fa4473bdb495e17f6bf2cdc42a82b2e2bc0f7aa8884b16f147021f23b06554a56a21f9b0d9f235bffb1a1a9edb2e3b012cc3777409541acf5b275561741ece824ac7d026f0c39ff21e284ecaadafa04c34bc72ec88c8082cc287295d9c217ef957de0e1bd90401db8dc3b7361777cd144deb06d680236367a2b055381d645d6330af6005ce078240fe72b7ca0c303286c50f68ac2a419106b6d863a9b97f5cd88fc70aad3b8cb8cad39af5f736e88bd98415ebd8574e562f1c614eacf50215e1c82a930f3e2e82df5a21da4bd7120bd320b8f2eb6cc6d542e995e34d900988f5a94954c33bbca43fb6ade09cc973c836d9230ee66a2c0b4831ad630f49691ee0a1cb1465ec1ae046407f225fa016553e46bfdc4ccf459105440ee49e7da5db84014e2ca337069a8998de3b3cc25aba6db94dac1530fd577f6846e09e4e1f5c9914d6b0c78bf7ff28e9881437cc0e00ac98277405a7e8066963a29156f6a41d2d6a9630c903da922c9d720ff8fba2adf52e117f595cc200ae9ef0e7b51966af7e78c5ca656c549b6d617b8ed4aa9127f7ae7d80630f5536ac75ad2b56300dc9e1bf14a71d6b7850c312c702bfae60d0a6d50f76e07a9e3f6347506f636b13d271468b01ac1605de2217f5f0beb2f2e85c26ab56e6a91a108275b0bf844c958b0af0222ae7ecac2b96ea4f56f9ae0aee3b7845a7dd181ee81575fc1f440eebe579d10078131b2379103566478b904b5f28680a5fc9f3684f84bd7eb99967a9f2278595f330bbc41d10f7088c540d0d19a93b65aabbee34b26f2d6002aa1dd673837adbca65866675b2a125a352fb68384298c38e825f986f052db5bfbd1216aa11855509527d20411442b376f6424aa518d081a9371b6cd032718b22a6f0cc6e9667db39525e5a671575a706e6e5e644bf8b3b158ce06bdd9593f11a0f1d641109c25c9c0ab03b9349633aa57318914c4702a53223eef1923db68cb1c5020d905c01d0dcd38433006ad5255116a3dc5aa7e084d8ab10d1f270d1c786724d6c8760784d109314249181fdeef836d59c79ae748aeb2fadf41ae298d92d0ddba53f1f1f1ff30ea125361a23578ad4b937caa11a384fafa1c4978c19b71ff2f3b609810971bc6be60c0fb31acc3ef21cde2b85fd21aff4958e738b981883b7f30dc7ce85aff73e4ba80d4759108954456b8601d3c93c4010b24ece63159ea22bb69f02b60db70af792a2fa220b1035cc745c6018a5e967edc1bcf2e9a2ead4ce3077810b6f5c2847b43b85511e3ef8dc4dcd31a6158fa8ab3ec035d8bd4f134eeab0bbe1fd52c5c141e06577af66599783ab038af045885f2aa6da28f48408f667f8ea5b59587b5c475a1b1e55262b217157993e50549d4927766119e674a733cbe8caba446bda7cef55a0364a41e1aaa69f965c139b829dc7427e62d36873d7e19081ee1ca699422c92bdf8288e340b8ca33a9a35c58a92263d3b5070c62ba0b6313ba837040f4639a22d34982149ed38fa1204117cc7af4c959e0650dbb161f97ec704463b16a1589a08c096da40464431affdb0d6c0ab84e554db7aea6cbc316ac951f79a8c9459daadaff17f543c9c4859d36334b7518c52e9e06dee6723a41f96840d2386d329eeb316709c1d95caddf882b8cfebf27ee199854b124e1adfcd81b3c1e5f4ccbfe23430cbf72b49bb05c7879ed1aeb2acb1bc7325b900938318c7104d8dd2057eb604426907a637ed7e19c6d7336d83d112b83f3aa5fc6ff0984ad06cc6b576f6ec62c38f37f7b5080ece2c62d3025205eec7ef77c2f5c618669f1e5bf20d792365e6c44d3983f83128179a89c7cce1f7f9add93c736c36eefabbd2f501d1d423199663227edc8b90efa5256ad8c8206dae862489644544aae2b5342f9a2f4b325477667b2fef471db6c1144b15fb04e1f41a87a43f14ba69515b4cab35d5ba326fe8ee6917f867b9bd4e50a8f2230b06c8bba75dfac5785815c846c533e0983e997aac1dc83ff73577f4740df9ca1fcc3bed13b611da3ed055b25b12780f32cbe708a56a79952bc6e3d23c99312246b90d38d3e3c6c2e3c55ff2f04ea1303ae45b3617988af9ecfa86c6808f1b6bdba20c4cfda71e6430c58fb6c0e9c82cc0d0a9a2e63bf8e93eece12a943eb702e748081e9b4d2e37fb920ccbfa6dde536d9f6dee7f7abf2c6c13b0effcd1dd4990a52cc3cc6687ca703675dd1cc074b308e7fa60d57076e56383d5e5f02e1bfe29592fa6ae0e8c90ffbd94e8757f89cbdb196d1502cc598368cba4989beb574a8ac3022354c30a9fcd6a560c9e53c4975fd7757d74334459df724a84d6706975a56094de3e9d39090389951b903fc16fe19e6f8c80716f7b9137f6911e40b5540f57c27a47c68f40475000231e8c613fbde599d0a08d9276c2f58fcb1df2f111428af03f2e9d7d1c942c4fa58c67eae69bd5e51400b097d544b6be51e8c28c66048315e3d5cdf79aebebdca54118d5f32f5e024144027a63c6f162cf51527d130c5a068c8a213318b7f40776de479df22dba62d764b5b57b88c7b864a62d088466307de16f7e2d36751ebc1e2c4d046d2d1b6fb46f14c592589eb6fc5ed105b73692674121b979988efaa673f93b32dfb4641ad085da16e1e3a2cd9a9abf9678d3c6db4ac74c51132a0bb1d858bd9f247c016bf870a2dcb824231408875fda4ef8fa2c52114c7ee586e213834540e622014d6acb682ffcc2cccbfd13571f1266051578669dbd9622319359d66d27f14042feec254952d3549d8b027bad35780315b0657360aa18ef18c10917a0a9937d276cee2e8a4495b1c2d7c6c3ac8a06a69f31324b026b0295fdb3474d5b3c1b606eb62d851a1e2d84fc3576f99a300016aa356b11baba1e0dfec87eb544743ba15c92ed5c3565706ca8b521e5ba8631070dc1d1d63b5307fd2e871acc1268f0da20719202ff0f99f7f0f53aff74b773676415e9b1455e749d291e126bd032798675fd4725a2cb877d0e83d9840c74cc6e93d4c0011ca01a4100e396ad83ad8ba3bf80d3e3a93b4048edd829678d3bf9060af91c49c06c5c92d5d4827b310cc21d75817f02cd8bf4515155f90812d30ee24f69743314677574515b5c0463fd3a49aadec3d61be3067e41755a76cfa96e44d4dce5990ec80cb998ace89e5c8c728af14cbbcad72ef6559e0d65100e879db9934b71c4856f53a49b490509c2984f8612793afe9f285d17338e80a47ce8392239a1c451025f70ff2390538b89a5c1fade36f54e28cb17391294919f780f945fd047b639787c588ff4e9913e77348fd09e8ffcdad96fc16f52f72967b50d2de81ef3037455bec94e6e6f36809804b7306776c639daea9a85fe120c60eb6019526d3493490f65d5c9f4d7260b6dff838b311e1240f849c44e40a8a082a86843461a033df32f2c5f10c13c642b22563f15e83696f71c875294cf5706c5fb10fc7feb9ac57a4bb033ae537d35b204c4a9b0e6569c85a1e4ddc8d48371519ad438a7623eaa621a57934518f2d867b65d6b2582daee8f78be9db3a1076d945cef90d7edc816074cd461f4a71171da3536e38517aa1a7c1bd18433e0d86f82da4eddd6defbdb79452ca5d0c400d950d3e6f5e740975cdbaf8fce0bafc74d1527e6a3d2009cdaad4805cec0431010a42e2484bebc5dc1bc82648c8c802f16f563d929511f2372dbabab4173f59e082b69c28d2dfb188b60555c1e566f563f5fb665d50fe7513f250516bee2322fa4d73376bb0ad185a31b482546188288bad5f42d1b7055b39ad9e18824b4b1f134254c2ef9ba5e2eb0df3d7c777909f766f3368eb9b762b2202cdca2ab38ab0ef25dc8bbffda6159d3d7c0ef45db384be2dc821118538dc02c2f466e122310516687ed3bcb7857a1f74a48505373f852a0e4cb418af5bb8f3ead14bcae8a814abffdc9b8a37472e4a513497545cc446bb40eaa97d282da791bedc219544bafa8f0a8b045ee1ca9aab9b46b33547ab2e54735724faebb5e63edf483aebdece68ebfb66fd75f24559ab8cfa0287c3e170385c08e6d09c035f0c94ecdae541b7d977c6212d0c43f4b34f038be70ebd04bdfcfc9d57443b507e46f78d0f511bdfb9bffd4380fb7dcf0cf913c1d26c212cf594481e99ad79953a532289efe7932c711903e641871ec2768ef7e03fb7ffa15faf52889a427a82c8311ebd3faf8e1f077f9fefc68f553cce589724974cebe1943c3ac4d9cf67b73b1e64d92b566a679633b618b63dc0284f3993415ba7953c3f7aca5717d1a77c89117f4acf522b83ac64a0d287082a673c08959a4a9e59115f10bd3ccd267b96a083e7be9f7d67ff9cc4e78be0f7dfb9af8a526646b495fa871565d00e43258d4b262ac310f2ad34a31495e411162579a445191b221a95f52af9ae9edd82f0b687ceeef80fbed6a3b21c23ba28431c2c5219b4c3952f26309e9030cca68a3fbbfd218005ff7bfc96f715c328b3123746592211934ad04ba6a0fcb47485f1028743ab63c4dde6aa458b8040de6bc3e826eef4bda86851c8b68635ac210882a07f3db0f2c4ad5fdcb4174317efed3b73e842cf81d0bfed1fa29846d31aac9ed1a334dabf3ec6f904b77b6f89b1115a6febad22997b6f0c245555adb5d65a6badb5561c36e24ad1d55e115b9ceb91bd169b35f2077ee1a7f1ecda9b74034caa3c2d74a9e88dfbefdaafe62f15fd7a908ab808a3903f10346b842888e2f88de398c7118fe3388e771ced388e63ddb99eb3d974d10f346b5cf3828bf3675e604bb3863541f333cd6c9a26bed634cdaac5518faf6bab6e6a7ad9d7eb553fd8ce318eaf175996668d7bab47d54d1396c1f0af63fd9a69dacb34807db234611606abb9b437566dbaea982607f60d017009dea233186d26c6625acbec27e1e0dc9a8c6adcb7d5235a53adc6fd593daaae5303415f746b2d3565b058f176496c9408ae180d92967034eecd4ffaa29a878746c3341a8d766d85c1768effd120968afefa6d7f8988e218414ae36a194e998473c63b7767c7eed411b64d2093e1e0e4e4cc664d3bb527043f112747cfececeaecd096684b3c97c77eb3593dd2d1d9d9e1e1b9d1683d3d311f1f5c9251ad4040f8da71c7a67b2abe9687a67b74896bad866bb55bb322cd6c227bcc1a3eb4ffb13f15f7f8d89f5bc340b9abc6fd1bf5a866f0d57b86e53d77c5caa01e55c7251989e8a8e26523cb7bae3022cb219308768b156916b2f29ebbac718d8c4a23f2351a1989a191ad3cb0d247cf4a5befcf4f2da82654ddab9baf4ef6ce1345672a542ccd48aad5665b3134444434a335dd6645452c74ac458b16b0162d5ab468f1657c5bd8da53339b6640b4594dac41b66c02f2201bbed1846c4dee33dab56fab3f43f1b5280ac27e0800fefdedc15f5488f4d3ac71ffdcfaaa5061eb07733f4fb309b5e605e58a3a7487ecd0a7c2244036c25d5bb1b862e887be2811d1ed5654c4a285db6824d228864848e08794f145b24848485506db3986cc26a2dbad286909572b8b92058b580bb3a9fc8c32bed6a88ab08de38988cc1a96bc990618c1772002dcad88450b23b3c6fd5a8f8ef0b5b51e552f329bc4ebf8a2b5bf7bf6778bb6d66a3d8b9f495cadb579cfc0d246ddba3316b4598dd455377f6b43f445599806b06f74a76817481e64fd30d1d769607bdab03a5ba4ea464797cce72e3fdf33a3d8baa88da02fba4b24dc8b180cb3a9c6b03144d8cef147f90343717c91a5098b69d9114ece4c678787d6e3f353030a12f21355615b3144742b62d1c2081f5d5b9182fea21b036f510838216bade5d72a02b25eb2d65a6beda006fe6c91acd7f879eb625d72496bd6c05fe33e07f64350ddf2e8d23d3615b0f315bd17a05ffebefce12f5f20d82ec1570ffa8a6e0c7c05edad6086596b6f40777e8ccb2aabf7265a74e7382f0dda7a07f9b768e27b4b6c7a366bd8372ff89c03fbe641149b4d1fca817d83f3f6e0e782dff96d8da4afb37b13af12ce68ae471fd8af393bd5bd4935b951301e3111b8d136b6641b94c1d1204bc4e0deec6bc6bd595ec525e5d86eb3269d7bab269947c7e78869dc11631c866088437c86a82649fbb9ce5967b9c4d556b0fcc8b004cdcf926399bd963d332c3d2f1d7fc57268268c06334d8f5d530d6e8b5b6f9af6edbe6f1bb797682ce1a01b67f418c750186aa2dfb967dc974ece399b5245659ef50a559e505010134035dfb8194035b4de22dd0d70aa8914ecace68c2ddc52122ee9b7d5cd48b28b8a9d1516b4d45bc344cd05f57a3d23c8a0a939a0ded501add15253a6f6e3fb9644d67ed07a8b2aaff2ec54af17c512d490277dd658121b9cd1cde877e525f9b03caa06c201d56a49fc18fdd45ba4857323029cb3ca8cb8fc86baed77e51971d9d8711a971c4bd1dc719db3feecac9ff3af276b8db465362f7839462f4fdb12aa9209355743894aa1d26bcd95636c24fdf3986fd14400e9a2d3b8d78afd604755c2f51642cdfda061b53acb542bd2ce327d20c7c37842af3527f3d07f646809f5196791b26b748bff64c2d09e2570389e1de7c3e39b66b348d849ecc383d65b647b18e7dcb5d7413e77199e3bf6dbeaac91cffe9df5a6b55366038c6edbe3711cc7711cc7711cc7711cc7711cc7711cc7711cc7711cc7711cc7711cb168e3e91609635ca3618c6bbfadce26264b831f1feffdfcf47a3e3ebd5e8f8bdeb6b7ad4e4bcd56199e1a0d9ce3a9b7c842ddf8aeba6050b3d2b470f4ad67b519361f1eda8f4ea3b550f125e70a638c4b1f2743d78e4d04947ebb91a10ce63c8ebd5a267be537b7dd7078ceb07e20c7c3ec558865e8be619045caf64ac7501ae65ddd5bc6bab7fbc4bb4f50ecd57dba4f3d3eeba9b7483c79f6ca066d2909c7d333e3e1e9e909122228485ba49186e65b346ef1a9b43133bad974199ccbb7a8ac5d6e64afd1b0d49beba191e4575a74973f3aad6ca1a2462dcabec31f259863cfa9b91ec75e2f2ecbb284f59c5697b33c5c9443d27765122b52e915e631c7a6024ab7569bc7ea62386e9964ae694c342c920df4deb255118d2d967bcb8e516ba54f5c6fd86967588bb065aaf8cace0fe44000d66e9178384723866627419a571a6aafb2e72b9cb33d5c943d6334db5e6d076d755769e39cf22e9fae5216af52f8f5b3e346cf5e9ef8142dd2e83430e8e1299e1de4dfb8f2756e1be563073fd06cfa5ce7b43f3bede79cf6abc539edcb4efbfab41fb36fda27edfb540bf47df4733c2e3a46cff1ac16892c1d9f1bc7934e0b63be5b6c15347e94b4efd88f5e6b8ec777ce8fa66fd88f5e5626dbb348d9471f3d8fe8b661f4a1eb30bbcf4e8719a5dd9b0ee7689edd2d137ef3e685bec763354773acb3e3aa84e3d8c39af3713c3a769f33ac45a3e39cb8de46979db51ef59ca387423f3a6d44f78def47c72602467474b4bcb78cbe3e6bbd6df2b1f39cb516edd863a791ddf62c935891b067a2c71e137aecb0d76374db3035ec34cf7db397e716c1dfc01f3a79ee325b2411c561fe7c7739d7fa3882acb67d9f1ef41ad9e2ac35fad14551747b6ea3174791c6c5dd72a45be748ab93d7e2961e74129be6a9c12d02fd737b7ebef556f7d662b3e9739cf4721ad79ed8bf93036c36c57cebaf9bf675fbd77dfb5ac5ebb1f3e7f398cf5c9f3f5976fe64f4670132375d03999b9edd4471c090510db4eba0384cd78e63e632cf91c2ce9f05c47ce63f1faa41cc673f1ac0dc74989b8e73fe7caee339d29cf3e7437f1690e338ae418ee3f8e738280e183e54031cd74171fc7cae7111e839521cc7f1f3a11d68a0e33bce809af2107111e833df4171e0d8f11d5407cd91e6788ed4ace9ec9673d614e7aca9ecaca93e6b1a3b73a4b033475a9e9bf6a0db8bde001d708623e8514435b8b70c666d34f69b331de499e8006e1148e3de40bf4ff4e719e4815e6d20ca81fb145ef108f1c918a9b3f7fa6ffd585b5d35650fd83155af32b82e8a9ad694b484f6f377edda2da0166107a32bc229cdf9bb5e6133837a84773cdd5bfd8dabbab75aedc5b0ab9b45a1abf7aca0abdf1834f62aa6f8695c5e0884d669eb4d28f5d04081ed495276eaa744516b1acd337abbb70e7a3d124dd7dfc09fef0d076c8dd52ef500e7a3862a1e47a8c0c3619db0814956ea81a52188375569b53136f8d6ad1367c04ca5624ef0822e253f304c9a22bc948c9d3ab4d15b8cb5d16f64527052d8eaa51e845ae59945ef4c3eb1a384def982fb6280fce0a578aac8d653ad328e2c09612bbde77dd29638ea1345cce8520f88f45b5bc29523572919dbc9b23fa4802295064037e429256f894f2bc5c30b4e2989afad382b398344554ac684c6e82dead03e2488524826ce2abdb310114ec24e113d85de59d64368081cb687901ca4521c1ec89670aaf1a4d27a29d8b7b7be6342ac4b6f114848ad0b171d78b5fc02480fbc948c65367a67120a718a29466ff127434d255195de1d9c46d8a564d797035010bd45924de53255a54befe39cb64c38ee94142698e8520f5e5fa052187e0c50cbbcf55ae62dd2972bba948c8950f4ce2fc6a0ed25a9ce48e19091e155e68c68268af04c96b18c11b90b9b714144e3842ce36334234378e6074e991e6740087110c93019cb44e19cf9209b717a911973660d4c099c32278468869067ce9489612433251cc28c4e2c53430e9a15341925f98c0d26192e386782d065b68466bc8848f81c09c9408166ce8867ae40abd10c980f4d8f98192be11929ca7811cd2891cfac5006cc2884c606bc4a395bf9e94ed5dedd81533d98dd39ded226c8d381bd114fe55de5e5a97a759fb62c2feb70efbbcabc7b05ea763c7c957b1f0fdcd9a99e6eeadb029f2ecf5e7d4fe0957dc2b96f07c3d75a6b73c618631fc771b4d6da529cfdadfd35fab3c7da9f81bc00202f0dfa96f8626c36651367f382ecd96cca68fdf087718da4c7582b3f59afb5166374976fad78f517e77bd1259eac38e75c7ece18573dce5586f59cdda2376c6dd7f51cd7f9b9680633c7f12eebf312b7c02f5f9f9d77ea52603de7bc5597878bacec94f9f8723287312dd3315849be463104a770ce56657dbc9d9f6497b481ac7b09976b0f43de7a046e4e5bc0ba8d9bab3ceb343078eb349d75c739a61d64e0e95062862dbad4faed955aaf5d5f4d5bbb1e0ce993c4a555a0db03afc2ed49a25eaf52be81ff7a154dd0d77116579cf5ac16c9bd5ea50c8a3324fafaa967444367bdb9c8af67507c95344f415f17aa79d1adde2c0279bd4a2dfc7a06c55709d3b3bf6e33a2d2d7836e462d5814d59bc572f47a958efc7a06c55709d33833da5fc72dbda0afd792968e8c5ab0a8378ba5f6f17a9590fc7a06c55709d338b31d9a8dda5f9f310021fafa0f8d0120b938326a516f164b3d7be1d73328be4a98c699edd07c6a37bebf8e410647f4f59e0364f00287e4e2c8a8de2c967a46e3f17a9562f8f50c8aaf12a671663b349f5a905fd7200241f4759a03221003c60b1c928ba37ab358ea19ad76865eaf12057e3d83e2ab84699cd90ecda716e4a8edf6d737d080127d7dc7021aa02029068c17382417f566b1d4335acdef39cbb93832526a41018ba4a2183718442f86702b906c36ee0ddfb837ace3811b39250a9262c0788143aa378ba59ed16a6ebb275801928ba325a35c0b2516141425dd6210c1187ab10267f37b5d04ba26fa7a8e57b3060e5d054b39250a9262c07881ab378ba59ed16a6ebbc9bc5e2526bf9e41f155c234ce6c87e6530b72d436746361e40297c4c3470cfa3a8e930f2619152ce59428488a01e345bd592cf58c5673dbcde89e00f0eb19145f254ce3cc76683eb520476d433716462e703092969ea060d0d7f5102800cc609251c1524e8982a41830eacd62a967b49adb6e4638b3bc27cceb55b2c0af67507c95308d33dba1f9d4821cb50ddd5818b9c0c148525a9a119544067d3db64b6241000030834946054b39250a9262d49bc552cf6835b7dd8c7049f77cbf9e41f155c234ce6c87e6530b72d436746361e4020723496949c68c1ba0d4d40afabad964ea6958100000cc609251c1524e8982a418305ee0905c1c19b5605174231a5a6143cb7b0ac0af67cb94e4d741cb14c3af8b9609865f7f59a6d4af9796e9855f8759a6f7ebda32e1fc3a8e65a2e1d7679609c9afef58260bfc3acd32b9f0eb3e9629007ebd66998efc7a906502805f77cb64e4d751cb34c3afdb2c530bbf3e649998fcfacd32b1f0eb2c2c930cbf6e64998afcba0bcb54815fc759a69b5f87619996fc7a926522f2eb4a9629e7d7972cd3905f97619994fcfa0ccbb4c2af07c03251e0d76958269ba5baa74f94be356c156aa708e04cc1bffeafbf4e03f6d72dc0f9eb01d8f9eb00f0f9eb3382fe3a13fad7650cfdf50a58fcf525177f3d07e3af2b29fd750ace6a91b68cbf9e74568b743dc6792dd2751867b648d75f9ca245ba8e3b4b8b741de9d416e9ba8b736691ae1f9d348b74dde8ac59a4eb2d4eb748d7599c368b74bde8bc59a4ebb7d3c8225d273a7116e9fad0996491aeaf38972cd275db39c3225d2a1aebecc53832988af346feebe8e9a7d01974029db5f3e7dc3376c5b2abd563a761e7397715f3d8774e9d7357358f7d76eecaf5d873308fc72e3bb7f5f1d8f5193bb78d7aecb073db248fdd3ccb735baab753bef268380c361001cee5d44ae15c4ef56b44f752e589e8ae57352bc420baadcee943b785da6574db295bf5d8df1a599135337ad3bee646b8ab847f30fa559ea59a5279336e8052533396664425594a5a7a824ac2253df62f3b68847bec9fd1cd480dd7cd76eb69d9dc860d4b0c58fb40daacbc38dba83df64f033411dcf0c00c475bb23113c10d6db33133f280164149bb91fd46b9717cf938679ff349578b847d8be5cdd5d42784708a2d25903085ae8717352510117eb50732388ce912c4051282209115e69081d72386ac333a22241ce1252c011128d4c0c584294af092664bf8840b574ee083102e1f2768e120d38da03ba1491256824033259c80133444818035c58820cecc109aa0cd1340bcf940c90d55cc3819ba0a13840a6d94d47082324c3c18a306092134b4095302191680382289102098b9210d162354e0208a287e2051831211ae1491c2f77ddff77df58a13595db6a420458931bd20e80b1282d8f0f402991344208284f033cd0891a5a3049e8e26d23cc4e7127a7cceeeb7abf47ddf057a14896255e487ad11c6bcc981e9f7c1bef2802893132409149128165a5882462b3bd1c2536865245a4bb4866811d1ca45b4f0105a369c3f3014c717599a3272776f37c9bd5d276153f776a9eeedfacd57e92a5da57a95ae52bd4a96eae62c8f3745eae6ecd454b5bb5d92a79bb34f4f96c7cd599dcefaf8ea22b8390fd8b8b90d947a5c5f7d833bf35a97d06abe337af59b118f57c7252dd1bcfa8cab642ac1bcfa007abc3a0607c8c0c7ab6be080085ca5254e9efe78f59f2278158bb556349b6c93aca91b60b8cbb29b013211f3b4f419b9929461c0dac2e117ae7a46d76cca41ed550afa478bdef6ca8a59e2e469cd73fcbac5ba01a85da59cab94e3d76b39388d2ec5253f3f3229f4ec5ce2e3398d0f49c6a2746d498fe7343d262642dbfcdeee121acd34c99c451b2de1e11983e824dcbddd253bbe63863df48ca57bbb4b7496febace87b7f400ee9299e734da62dd227b756fd7730b1a837bbb9e465b191220b09e82af3c20a29e8cfd344086c3c608596276a9cc6b7aa5eece5c404d655ecd05dc5486ea0ba2a065cc4e8b18aa1f231ef49002892198f86063450c1018728200c2abf22901f1c2e585228c40e31466cdd83543ce194957948f1a6648a28627217ed8906f789203c8981c80a0d2040f3acc0026081f6fc2207e8040e583820f614029524723a465e9ab5dad6e8f5bda00575a57ddaa3b874e14d19d6347e3310284fe43b13f4675d809692bc63bfb5773ae18638c6eec1f8a2d768b51119bf12763d65a6badd5daeada005b895759342ec637dc92dbbb4bb1975729fba4a0eb571a37973f2760ce19dd9f874e7edf9773fef2f77d9f8bf9dc95778a637df988e67bab34b1ee172abae39cddd1b2aa156d49e3ae886efdb2ec2097204714f1206a7bb6cc55027368367d4c501122cd6fcbcb4df9bfd3fe0b225c31e2b7dde51d50570682d9e7339b3218fa7590891e65d0fcb6f7011f9cd83f27b3d9f4e126bbf572aa392ecb91c95ce6158699e7380e1c9fe5a01e5c29a63ce1a03a1cc741af0e17d92e5c64f5059900b184807db061041f9cf8d064874f903c7ee5f9f0f47921ab6d83bcb7d5b1e8bef2aef06aef2b0f87153e3f551956ab1e5906dcf442e1a211f4ce4f6015ce7d5074ed74dabfa92a9c9351648b148f87733952eb9fd5778573301d7cd8f2a44bad7f5938b7012ecaca3d9c6bf1c313434ce952eb590be7725479f3e6cd1b2bbef207e22cabd1fdf5defa063897b770917574572dd4b4254aa2dfeeedd3db4f2a4fe5aa9ef54feb09e7729a58c2422fb59ea1b670ce3a815579f76d655e9109469e9cde7e4f34fb41bdfd2eba7317a8ed2786ac968903fb1d84808310fc1af56b3db24cf5abd71564b56dbc55ad16abef8d096d7d6b7bf1ed8729460b153d543867c99f0e4e4e6f26f9c01cb41330ac584211872c16e49088664988e37805a7e3647c895680bebcc8320baef270608ad14205f8611ef766734296592cd83433486966090096f16f997bebf162c24e007cf51ff79910b0d80c724b4c972bfca631415928da105a2643eb9d37329c0a8094c0c9917a5a3d9a4de5cc723c23cc7494b6e8ec7ca1e025c40ecf0f49578e858796f318ee413c5aed19abff70095584e0e7617a024f5a7fdd678773396a7803b5440a13da30712487df3e5c9ae8fd20c148942474e9f6c1f2dba792397383086f8cd031e44dba7d70f8ed63a5c46f9f2b1f2c2d3e44b444fddd3eaf2b9fd795cfabd7f3eaf9bc7a3e3d3c9cb33991850c0f4c7c6872c495df3d25b061099b10ac38a10211e9eeb1f2bba7891d9a10f245ca153247d2ddc3fbdda375e677cf16d70b494f941792297f774fd54baaa7c94baa87ea55d5b3fbdb23f5d7693d9cab5746b6ac382199e2cd90b4ca6f9ad65f29765052f5419a3457e9a6ddf09be6e2062468b2a42cb1cb92ee1e2abf7b9c9e86fcf5dd03d513b5040dcc123431fe9b96d545ebd245c37a39d1aa5e4e34decbc9eaafd3743857a580e255094105104a3062ca6f9a5391d490ac1c74d0ea6242ba694f527ed3a0aad090c58b0b6894880122dd341b7ed3a4fefaa64dfdfd4d1bc1f08c607878d4f070fddd3c5dbdde5f1eadbfceb3c3b96a35441026a0f8e0893354d228bf79a4feeea4b2d2a4f0c31133e9e699aafacd531535044b08266868d811916e9e1a7ef3585d61fdf5cd93c5236664c243e49944fddd3c50533c3ea67886f0ba783c3a1ea7bfbec3c3b9edc48ea9a822524cb540c3ef9d094031460910281cdc2c49f7ce0cbf77ca1c4105c994a91a76a090ee1daadf3b5a7f7def6ced70b5d989d266cadfbd5335ea769a8cba1daaf169076a7cdad98d3b527f5da787732ba24822a48d14179b23a0fcd691009728322d0041c20e27a45b4786df3a5d1948212545083abce1724af7ce93df3b4e7f7def3ced0cd1a203468b98bf5b27eb4aa7cb950e564fa7aaa7c3d3b1faeb3a3a9c2362d3c49724d448c98a4aa77eeb0899a201092c4f5c31a12add3a4e7eeb4021400d1537663e6063048574ebc4f05b47eaaf6f9d291d2a91481b91889bbf7bd625eed4883baea959d6546f4aebafcf76385787f0f1440813c61899c22385e1f74c2acbc9c9852d4e4ca124ddb326bf670228a2862a40a208614c0ee99ebdf07b66f5d7f7ec6a86956646244dd4df3d0bb766e1d64cd4e588ba99a89be5d0c0820845ac10a5072e5f5cf89df332b264ca1a2e19485022dd394c7ee7f040a50405ae3146207993ee1ca9df395a7f7de76ce57069c989a225674a4e931caa9edf39555739505739bb1c29adae9c9d43fb9d133ec1099fe0e0e0d07ee3845538210e1627281ca9bfbe71a672af74e3508541da8441dca8e1e2f92deb0aa1645921542f84d29221ca191f3e64d8c1ab926ed992dfb22aabbfbe6557322c7009191170095994cc876cc8ce6f19545757974cd7e56495a5b7d65c5674142b53feea2ad04a37b1a2cad250597a9725f5d7633d9cab65821882ca961dba9a3ca5b685df312d28944cd165b1c1865dba634a7ec77688b082113b62d0b9a9926e9de4b776faeb5b3f6910490c44128bc5b0fec6b2c0581518e38131abbf1ed3e1dc986508104ce0a16b8824290bbf634e3574545cbe484121871ee98e9de077ac2e2143171790eca6d44049770cc9ef98d45fdfb1a918d5126d9670f317d6f575c1d47c5d5ca0130c7482814e30d80ee7162085cb0f2976f84164f71b56c14441452607246d8c18936ed80abf613ca826ac4ee044854c0ee9861df90ddb3018961518112b517f619f15ecb3827d59e69705fbb260260fe7727c70240c12416cd9c1c41babc26f33688a561b116490a2254cba4d1bf5dbbcfab1e48413aeb658e121dda635f2dbdca6c985c48c8264ca5fb3c95f73eaaf592565424999bb6d4afdf5b287739509146890f232246a2b4d5ae477a95501178e58f9a1042740504977b9f596c8efb28b053655a474ecca2c916e13eab7e9f4d7b7f9640ef97494603e1da598b24b89f5b7ccfa9ccaaacfa9e4edd2eaaf973a9c3b40126b9ca0e1618db92185dfa5539625b4788152c24b0c26a4bb44e17749d543af0c9621b8146193eef284dfa5d45fdfe554ceef92ca0bd9c68b9bbf6457ce22d5e42c2e2d324baba7a5f5d7c91dcee500f2e508167638e10986ad21bfc91ac4944eca0a503790c025dda409bfc9aa024001b36608992b4c82a49b14f29bb4faeb9bbc22b19e90449e9051a40f72c85f12aaaaab8ad46d9287733c49daa059e2e4c7961382fc7e591d200c1145b4803ca52993eed7d5d3ef57d60d26f8b801ca171d2944a5fbd5d3faebfbb5f5e2ca415e517290d794579317d5df57557e41e5d72ebf7a38577b505d4a1429e28d115da92de1f7a895801d2660713a8344d491748f5b16c8ef71851b98b4b015458519a8a4fbf5e3f7cbe9afefd7d36b081ec1e0514cf97bccc263173c62e1b10a8f3c3c5afdf551877320b841480c63c490b01322f5f17b749a8185146a006303971ee91e9f9e84df23d411dd0c312c41262b041de91e7723fc1ea5fefa1ea7462a6c456c83ad886e443522d75fb1cb4accb2ea59ed706e5cd2c4901e42662823432ac26f512a07942f49a69440e5871ebea45b9c72fa2d3ae143161eae7a38d1a149ba45de87f05bb4faeb5bbc12b1701091080e2246bd7e8b50184af4210ec1525d584ad461291ece6de089335474d0d1c2134a52107e873b4c6d21c14b218a3031a43bbcfa1ebfc3ac0d58e04161450b0f880ee90e7b3c7e875a7f7d875b215711619422c229e3efb04a2b6ca215527585505de12e94faeb600fe7ea159e0e2d4360d5d0c312e98edfa09690962c3fd610c9024256bac1ad0f7e835d7fa5da8809a31b42058974873a1dbf43a7bfbec3a7bfe1102d20182d62c474835db0fe825957e0942b100be85402160d52449460f2258874834f7f75bf412850eaaf6f702a074b37487589b4b944dcfcfdbaee4ecddd714d7d5953bd292da9bf417a28618286aa89287a48f737f56f7e7f559fd55fdfdf15ceef0f2bcd47244dd4df0f6aebf3f1776bc85fcf5d9fee86a9526303902e42ac4e904ef13b5bfded42a5851f94b8e92125ddf94a8adf994b0a2c418ad4b0860990746737bfb3d65fdf794bfc9db9bce4285ea6fcddb949aecacabb9da57232fc7802ca8e24ba256914bfb156d5902436403142e40459e9c650fcc65d5d57968082c85615978f74e736bfb3d3d390bfbe3354f83b473dc1609e88d9b88badc245559867b10ee7aa559b34407a3abef850a4eb3776c25039e81842ca933527004937de3df11b4bfdf5df98eaaf8e3656879bbf4eb8488d13d743e1a2acbbc3b95a86479612c82c59410a98d489df57aaea5a31b9bf2fd6022e91ea25eaefbe500ef0f1376bc83bfdf59c0670975205f5667ddb285fc194bf396618a2ebc70a3c64f8b2246de2b7b55a00102427f43802831b2ce9b63daeff6db9feda24346e91f56da3fefa03aad2586fd62ffe3d8af96b9b84e9b643ec1313bfad53056c8c10420424b844e892b27927217e408982cc942d4b6cd9f284e50b1a273a1de9016e4e57b4c7922f639e44118509e9c5b9ba0686105ad0a1c908315c49ef9aaf00981e11212c99024c557a95f8eb38f0affb127acb9ce82dd3e9abb76e6ba2b7eebd75f3047aebdd5b3791e8ada7deba6ea2776cebadeb17f4d6bab74e1ad13b76f5d663af58158faaf382de31a7b7aee382de315b0c7ac3786fdd0683deb0abb76e96a037ece9ad9b3ff48675d1dbecbdf59e2d7a9b5b597a9b5ff436796f9dcca2b7f9f4d66961f42e7b6f9d2684dee5d65bdf71a37739f5d677a0d0bbe4bd7520357a97bab70e8484dee5d35bcf50e84d3ad19b9c7aebb318f426796f9d4704bd49dd5be771d29b7c7aeb2f2bbd5f576ffd9545ef57efadbfb2f47e49bdf557958be8abeaad874588553fbcb8e2458f994da2f3f41ebbdeba57d1fbe5f4d6c75e888ebdb7be0208cee5d4ba4cea2ad5add00a0a940f6d1f3acc6c0a5d08bdc7a9b7ee60f41e796f7db645ef51f7d6675af41e9fdebab6416ff1eaadeb287a8bbdb73ea3a2b7389ba2b7b844efb005bd45dd5b171241eff0eaad8342e81d5ab10e6ee90d5abd75708dde60d65b9711a13728f5d6750f7a7f5d6f5df3a037e8f4d683b4e8fd59bdf5202bbdbfac87f2200882a283601623511ff27ce8a6d9149679d14bb34924cd269066a57768934aef9cf5d64d287a67adb74e12d13b57bd75b288de19eaadc79eacc780e88dbbdefa8bca7ac983de7807bd7110ebe293deb7ebadf7e460bd078bde77eaad0745e96db7de7a5011bdafee15c03583171d4800697325cd497cbe62e4c7679f65bfe1ec349d4ea77b4ab3111fb6f8d05f665398035daca3d9048a6653b6593827d3c9743624f496e9defa96eddeba6c274b72a5080f9539c9745f14fd5f0ef779fd7e979f7fcf3e7b95faecf92ac5f88c6585309fb1ec867c76d06ccab52a7d0f66b3e92ba5d0af2dfd5aa34b157419a5ad1859e13176db8d56b352a489ff3c5f2516ff55a50a840b9fadd98471ff15a1bf5ed1ee65bc1144e9a4e82d9e59e449e1b42a9538691e4b5f29320196b2b09489e505c58ac345d8afc61883a8888b70d5bde1f034deb6eab1ae1be7a2a979accbdcaab13cb5bcca9205b2e441014b59cac298a5e804acdc71428c953b49e81268069aac9465d1db5e5d5d5d5d5d5de1943b5b39a598c4ac14d55ce9944e75b553024599c18856caa674f5945a47f629655bc49f12a8aa572b3f1ab4804a5993a0527fd02554025df172674ded2c3f1d325a962da8284536b652e45a51c246182a452432515926b9955f1ad16e5c510964456f7b7525b228c5234a71a66b34bfb528714cd6f78b5c6599ac0d6f947345dc339e342a7b6a4eac4538173a765c95f1557f5199b2579ede9465caa82da22255e15c88da2b32323c268fca9b9a6faf663a92aed2b6568f1dbb6851ab12682eca0f8af592442a3f5114af704e0cfa7c75f86660448ab637e79c69554697067ffb571df40e1f7c38572cd2ea598de09716c1ec9f69dc100cbf0fbdf13d08826808becf68c6e126a4675c7e58c962d046ed267e9e453dea10c5a9a0ad6f1c4ec4b966d3222449ad5e95212b0d0dbaeb99d6355ba6cf33ba6fe01b2d63dabde1330404b83a5b8fb2676c367dd93400f9e6cd6f1c3add67b483d16f885f91b2571c21b83f82f8419403fc23fadf35b5b4f52dea19cdde1bf8b3df376f42803d3f652c6af03fd75ba4812e82a7067d8b354a54d3b2e72ca2f8f6998681116d7d572b119b4d1f885ad3003a2e00e1c20f016e463b80d3ad21abb5b5625a5355aa32aad7db757d6f5729a7deae5f1ae700ead1f59c8c36d5db1dc0bdbdbea216fca0d19bf6167ccd6d94d72da8325e7fbd8a4f1863a85b84c590062ec24966b5f681f6dcb6123bbe50160a63df007f7e4f31f41c8ae199dfa2153c71a8d634dadeb8c7f5fac65d259427de0f8d756b64abaa76aa4a5dd036a1592a5e2d4700639d2a5230377d8ba55b290fe01c0c45f57d6dcf8ecfd0471bb6a610b551e69fe5b4786934f75bb652958751297b355e9007d1f6642cbbce4fe801dc9cbeb8a58d2b1f04cffab9ad36fb8c73b6fd2dd7a2ecb5cf5b97b6c74ed06c7dfd1aab36cf15004e9ec67cebbc132e8df9e629ddab87d64df00b40ccab93d6afd9047a788a2f7a782e8179ec7412d3d1699c03b8b7ebaf13832ae6e9e7cde8c49d49df396346ebd23fe2579ef884f6df3acb0d51e0d31880d72bf2662ad2b595b69fff88fee342fe23a2190079cd831cfb2549bb23f393e8a4488aa4e8a26f27495288f42092249d244992244992244992c4c9f199a9cb4c9224e943923d64a9494d239dd42167a4e79038a4cb48922449922449922449922435192361a4499664261de8ac9782ecb553c445d97f4e1b2996f072cd45d77f81fe73ddc783fce7a219d4fcc7813c3bf6d1c5fcf432dd6a6151d4bae2a0f3ea70d1cb814edb858b5eaf97bf5e4ee3be5e2ff7e979bd5eafd7ebf57ac972665eea382cc6f3bd5eaf57cfeb4543b7c8836ebdf3d241b7d5fd6bf6ca7939ce4bf6728d6e0bf5afd7ebf57abd5eafd7ebf57abd5e31747f4e30747f4f26fa2a5f24ba3fddbf72d7bfbc76d64bc1e73fa7888b3ef739352efabcda5e2807409ebe2110a4f56ab356c7c32d6ab1b5d8626bb17f19049d043ff0033ff0fbec67cfcff3c901fe2e309f568faef730a9ba53ae9276faeaf9c4dddb122eba8e4bbab71b8446df2a7cabee5548020f540f3ae8a15fbbc4741a97667b9eaaf4005586ace71c6b9175515753ac47d663e7cf75d26d0a3b7fae979ed30bf07360dffc580527bebe66b1a184c7eddb8f6118e210dda367979db11376bedc9a178c2e827ecfcfc76b36ddd0ab79033f017aba9ca17af0a2366e0fba350dd0d3e50c9407d1254e9e9a68d22db2e29b674dabf9a138f14737554afe2ee14e1af5c8fad882f6df22f9354b95247fd1adafeeadbe58af5e170c81b426a8faec3f4cf4b6bb7dadfe7abd17ad36eee9817babb5d6ef73d2def2dbb9da8b737514f475a1223014185bae9ca1d8fc7dd94eb1903f300cc12fc3903f300ca33e10fcb21afb81e0976308c2e6efcb762a7f6018825f7efa2167305ac6e49c79743927f18484fc8161087e590b981cacad923f10fcb2182e536e905a22e74ce6ea03c12f73d1d223e74c43fec03004bf1c953f300cc12f47e50f0c43f0cb4168f8c1bafd40f0cb27a86073b64ba6c879899c57e821e76c06e37b31d8f5808688b77e1b418a2b34a001b3c3e38a4081bcf8e6308761ce91befda56bae1cbdba5895aa522ed14aa215fbdf1d7ef5af32cdb048d7ab93e1f9d5b1de3e7386e863eafce775dfdf33c07afb5e21787cebedcbe07f2478ec7914abcfc6797df55bb357276b48d3222a81c704705b2d8665d4deffdc667cc1effb2c0c58ad479fe31ce22d8390a4bd49f2ae3c2da8bf713f06f2050c9cc2ccfa47adf94a5951b5028be8cb9010222e2229a2158874ecb819290a43a464851344552c3e2822f2e4c663280a16405a90c04209d18e1622ecc06237a445f401113a2f5c3d845022081e0c584154f0a10513ed8344914ec3c614d9a071b89c408b3810e1a0c32945635644515a714249eca981826c9321493497c49001c68b3cdbc2e9c8806481b25c581b9423738891d8f3a5c52c0c0b7287a24c2be2b68308686b684665137980a8105f3ba0e26bcce9563c07e1201494673d00e92a353bbbf2d3c4070cc393412674b20ccd2c6bac9c1cc4038e48e341766b7c195f70ef05f7332fb8f55e6dda10dbc132b93373ec84b22a7dd96dce8ef3bd5d8b5ed4de7b2f112f116a24a9883d59c22024a0f87ae10381b0f98dd0d6efcd366808f26b42c3a277feac944ffa5665dc6a9dc80e38b06ffefa0df1b3571bf9bda0770622a37307e1df10ffe702ac538fac59c3fc8a8af588a719503fbf0ec8e987e2f020e7f0cd14babfe8ce135a3c33ce395f8b03db1efc7dbf5d5cc415875f79686cb8d7f2b2a665dc17ed5ec67b7b86042f5b9248abdb31da46f13194e0a1c3951f8e20a24c5a2b88820b550e3bd82401c142f1d66553aa8cfc96039f4f5da56fcf40073cf67beedb5f7c4fd4c6edb17f32a90f95ed6449eecd7acf11bd653b190f99d355cabd951129222223521455e4a368c8df5d0425dbdd64bb22d9aee8c6c3b91a4c52d0b1c044162042dafcbe59d00684221f38a10b018874dfba7edf96d270e95a808147096fd27d7be2f74debafefdbd64db7b9e936b7db8deaef6ddfa0feeefeea9bd45f27eae15c8e11ca08e11df18147922652277e1369fddd41260a0626929cc9926ea2267e137101e20305365c88981242ba6f5cbf6f4e7f7ddf9e6e43b41081d122e6ef26cad257445df4151196ee1155e91e114ff788acfe3a910ee7aa9a214852c0c1c81a18aa30f19bc8490a0612945c45e124dd444fcfe6371114971f393061e20b5710e926da1149fdf54d3445fe26a2d244da68226efeee21bd1bd2bb213d35a4a786f4d4d0d00ee7f609bcbc312187373a6459e2f7d00b3a2755218871626647ba87b67e0f518006303a6489a2030d27a47b68cdef21abbfbe87ae62bf87b0d20c1149331405e3f710d4d6908fd8d690bfbea24beb86747ac8e9afafe0e15c03c20061c6092423bc014289df2bac9ae84a82ca981c88689921dd2bae92f8bd220b4b6bab0d4f47e449ba57a8f9bd62af58c1a56545142d2ba6ac68b282eaef5e51155b115b115b21f5d76d3d9cc340cc112c167ab0c10d9a1489df362d105c684184351fc80025ddb6237edb7a1f6831028a1e5a745049f70add0aa7bfbe573cc17eaf18127b6203137b621363eb62c3fabb6d595536dedf6db3faeb361dcee588caa18525588c14699225cd6f1b9a188ee872e689d319a874dbb47edbb0b4c023ca09549e5449b70dcd6f9bd414d55fdfb62adb94980e156d623adcfcdd2aba624e2ad43871fd85c2453128adbfae628773357448783494800505efcc6f1552434dfc80626a0a4c1050d2ad62cacc6f1555171082e68a8b10639a48926e15bc32bf555805f15bc595fead020b96460511581a15512a7ca818f277ab80826da16e605b2a78fc75948773475a469280b0638a2921647ea35a47a889828d151d2a40916ef4ca88df6856932294e8a1890f51a8a41bed15f11bd5bafa8d6ea51be5824541a3c0a2a0538e7ea355301eda8447054361280c95faeb670fe76a9b1d08563d429042e607dbfb7d563160a80851040952b89192eed312f1fbb422021b2082d8d1852724dde810bf51a7bfbed12774084c84130c4c04317ff7097b3a614f276c77c276276c779e3b40f1c16e2a4a93273ec6fc3e3da0c5083233f08010c142ba4f31bfcf18d63cb952c1071a76a090ee73f7617e9f527f7d9f53e6ef930a4c1b306efe6eefeaa9e9716d79d6566f4bebaffb0ee754b8e131f1810213bb35a910bf7d04a7204ea08a820c9523e97630bfbd4a032b5ba8a0b0830c4d9049b767fd76abbfbefdcab198381126517fdda1cc29f7313584d7c5731dcfe9af0bf1702ec71122d0a4e08305166ab0f2e5b7908c1dce7039c1c525cc07e9160ae2b75056069c78a932844d1125b449b71010bf85b690902982902982909010d5df2d54650a4199423b5348eaaf07f5700e035d636e6842c9921f74c0fa1d54a138320213676ec04ac2857407fdf03b288745489a10aa70c16221dd423efc1672faeb5be849680898203060c4fcdd4159bda02ebd20acada0aaad20de0eb2faeb413a9c8bc0162740b0a10ae10b0ea997df414e2190828411509cb070440de90ebafa1d046505c5ca4aea863160d21dd4c3ef20a9bfbe83a682a84a266d4a266efe6ea0ae2935535c3ca02c5e8fa7f5d781763817aa41c24409251f9c8025e5e13790140792f0c035029b2e1ba64837d00ebf81a480a1ca13504988d8ca4a375097df401b0808ab0d109136517f37105409e4a3041a52d6ba4a205d09e4f4d76b3c9c7b00970f7690f24215ac255c7ed774a60c3145550a2a84a14a776dcbef5a16053c1c4cb08107066b8a74d7b4fcae69fdf55ddbaa7191b528646d4aad09d5df5dabead5a07ab55d4f4aeba7abe6f4d777ede96f6d08c9e4070cc944ccdf1f72ea879cfa21793f24ef87e4fdfce8702ec79414ab16744873830b4c58fdfe410ae2861b868042450712e9fec9f2fba7eaf0640bcb0a63acae9449f78f0ebf7fa4fefafe99027fff50b569d3c6cddfedd345ea7cd4903a1f2ef2c9278b7cf2e99101a022a814091a0f7349a714325323c00040002317003028180c8a06a328c9b144f90114000e63b65260521e0824f220857110648c210a004000008000008001a588ca00984ddc1a451fbaf9cfb961c8ff7b3289e65cadbdd42222f66c6dd6ab7c1bdf1cf354aef12ef285df769b694d6dc1a333d0b5a3f8c7961c74a0d18c4e3dd24813a7e9f27ff25e9a1dd91c9326343a600a343ef5146b088a2bb11db8e2bd1fc26e9e0acd637d1d476173dfddbcad8b587b7267872f7993e8e7dacf52614b1bdeaafcd3e9be3aa9665dfd2e71d8f38ead7514b0b51baa7d7eab015f23ca901cc98c0413bace4278363584745700bc2f7ca205439e90da644d1af0b2c967765d8da3d3df290edd2f9cf2f48b3bdca118d5d6219b6ae8b4c33159f190f0ad12d23661796dbf0d3d46d64c6096ca0565c41bc82e53925b09e0195e730346a1c0642ac0762c782667a657bd58983e3a8369db82fc14df4c805591c5fbe8a63c420b9f468bce76a6f6e011d37547d5725005fadc4e0fd345637e8e0cb18c4ae6dd1061371328c52b1243f80e949c444a63ba5761a8afe2977ec36594747496e8fef731c433c3eeb1d0d4fcc9fdf6b11859b24e1a25930c61d914d4faba54e98d5ed4fa360a3d63e77d8aa7829e273a89c921b8aed9487bb9631e24bb547289d42e9521f2525d787d157d6f87f49345f26d501e97472c6e0d1eab884ca5d0a58fd4dbf8f3918233d097deff66b59aafda223d13c89e77d3a2ef63da73678d9de076508298328aa1c0f6c8bbaeae0dcca05c424cec1a375b4140a5c3e1a600280a39219be2449bdc19889004b31d38a7abb8d11953520f59b045ae700a7da6a498aed89686f7e93aead269de6e7c31b9abd054b762f40cb42cda90661a5b4a99290828a69def47260d649b6b29dd69b987a21275aada3f4c3616e554ad56832442805a962a68854d48274f4a9379ea14136e4c3e8b34d6377e003f991b3b73e4954f2920b0a5cbaf78b2852ccc7d6f7bc11981e052475c585592380b8d49ed07aad0b6b4f3aee88367545be5f15a2636cf5a225089fc7fc859ff7d41bfda5379385a2293bc6a1e9bc464b9b2a059484323829b897417ddd929969b47ad0a1ddf0339df0f15388d7c1e88a801cce4e69b09988e7b99428bbb2bc51bb64ddf4f022d57f4feb932ef720745e33c403818245b4f786ec3445ff9b020a71299336c04ddadb0b968f1081b6981a7b05a70276f8a3e2475ec520972156ecb28d02b08c266e1ea436434c9b06eb243fd122bf46219028429b3c013b9b6746ab970370f957df6fd2f64f4edc25d7a53f220339b5337a1c145c448f46f9d2f638b9a1288abfe40a3ca171740f87c1da80fc6349a5cb97f64094a383086c0dcae24701e8b0e17ccc5c07accae4233dad06aa3f31c706e046b7e50e7e9012e270c941886884026fa8dd0cb94b8dfd96a9bb854b39853bb78b30b30d209e810e5f256e703a6a041dee10f28cc625cc31ed8dc3520c2f8593c4632196fd7a2a8d9a0739414c4692c11b771f94e059c92aab39bd05bd24ec8189dccbd68b43e246ae26b2169b03bf141a60d200e280b6e6826703a008e9eddaebb7c5c3e5aa63cd390c8884e9e5f203755dec2f9bcaf695e54d5990806af7b6795acc3450fbb5534e322068ed64018e2f83ed9ef25705b193f2eb28fc91190b3c4685e17053dbe12eaaad9e4b683e9e35b32dfa544f1e87e301a1c4a6a5519be059303174506af9813a142da9596c9f9be4025a77ffb80d9de20e5db07286065345dd331684fa9dc4c352704695315322e616356d685f5aa05b043aefcd8882a949190870984a2a0ac1711d1f32bbe380a5169c09fdb553805cb7839203d0e961b5c3b6712d736b0178dc0c8fdc3604458418ef59a1495ec17edbdb0fd93e482a505b98e645884c80cfccaa2ebcc151a4a59593d76476620572e0288eda5954c755846875d40ac7c68114296488107a4231b80358a59fa70b383f0d36f684a5119885bea4c36415da8f7e8e4b551d995b449472234e3e14f58c2e75bbb060e558b7014abdce08fc5bc86dd8d83d18df260375ab882fcb42866eaec9ad651cf204ef9790048beef049781281b24a0b6aa0af03f183259e16a4ae993d60d471ad0220cf65220df03161ea5d63150ac17e5828c4130603d662d2b7bca17cfeb7cb85913df739cc507e3edafa0525d79d0c432ee0611f908d7bbc0a4774701c159ccad6177486e090f8e1c26c2432b74dd77c9109bf448dc2b1a4d2594d3f90b5260b1f31bda13e67ff72b008d1c7b5813333008eabc0ab8e65b7943d79827b130f38fa6b3560131e08352224285d60ad88cf75986348845da5b733b53b4f6b2a722259df684eb8a197029e92f568a2328bff318b4f6bac434abf55c42b357f0955d4e879607e48cb80849dc3cee84f722fe6daedbfd4cc20cbaa08904212285acc9f76b2f9955511db465e06dd0a82d9052fdd53da7c962ca46052153222a0d7e8f7a82fd0cba40458bd8105b97c4fd3bd2728d0b0797559fcbe18279dab5b9a541ae2423f23e971d0fe1d60ef654a3b512932aa0ea8e369d8240358f3d177e410c37ec8b918b4a7e97a243b382ba64e96924e571117f7458b358242b6795f0afb0fa388445fe239e16cf02d1be3e6df042448478e1bc457769af7e9705c560038c239c0132892f0e270e30408e3f8ff30388a864794d9f1d8511e9940a802a88ad15716c87d127116145711ef66089106924c820dc365d58b73e8832248a65ade3ea71a224bf922885053a7b8371eee4c3988b55d516e545bc6e16468f800f27808423fd5291b48db1ea191a76afe23448a6af1277c06994c93b41354182680169c2843ab568f9ce0718fe09d05f3aa1f9b51aeb41cfa0c61be9935ed6841a1da7d44b15439934f91c5c412857b17b4fa0c89dd026c15ae385ea91c9a906505e3acc355dda2e9ea456de8a793d5f3299d80a9230f0ce2c4874d849c8041603445b9e26aed63592e7b51d4bdd4c88c9c39a7cdf40ac46fd4b48daba5523e440b8a4a44147ebe6666fb573dbf1b2359bcc94fbb656bdd1871efcf0d343a5a1cb3f4c545905919fb0e9da13a75a97a7cbe996b30fe5562190c095150871da3088bdfb3b235daf2378c3f1a6df731d7fc8875257a1b79fda8859abab929b323932b3e8059187c810170466ec1a012018f5c16fff5837e1e203cb1a110f85a23d09b23acc203f0818b7cb9b082fa1bd61446f68b5e03d58a54e2bd96a32437b3e817b459c661966891ada83fc2aac6da067c268ad1b58a88c1fa290553f059d3c30638956901de9d54485f5269b10befd432eec6d1a1ab0cc8a15b2453f2562c781526acde7801927b34893f06373533b7d45e6b48c4ba67d09900efee3e23162e238ac260bae8ef40a22b255264c0c3f21ede8b771d884692692e93f0ef41656946de9c9c48df1125a902fedfe302622fdfd23eed8633a1ab3c00a2b65b20fc67d2b913327b3a62b8912564d3781ccfc83713331dd27e782955322330f1ffb9859f8806e76ddde7021ad993051d9d6bd4eec18a7b4644e566a86d4d83864c2c426920dcd9c8895879b326902b2a14d5362e25053a64c2083ffb9b8d56f80b492721ce0ca09e3b13a3efedb415726ac3181ccff810dd5bb28d7e79890af32c6245a2eb3e2976034bd4e6f084d2f5aa0fd257493ff6cedd36c84b4087cd42bdbc44ba029a51dca82990a4767203b454a90ebefba85dbba68e356900edff736e47094354ea2855b898c9edc0ecc225bbb48fd7ee7896122cca36eb0bf3d850d82dae5665cfa9314c8b435b858f38556080139d75cf5da329d6345f4f12ae567c09dfa7213c130a08a4e90d4aa3b149384fed197e3e9477129567cc28f4a3847701d85cefb443f7718209ef39de54064c203cc2e07a9e31d01a934a57080af926fee6e5d37fe1ea521f6c674e5c8b44ed060246968eec115a0bb88e0098dd38be8e0d2a7832ba10eae4b325cf893e13232ffb06dae919aa1bae8d0d1f0b221c40a6ee862a2cb5e4d0714bcfb4a90fa3f3be27e64e92fdd64562c1caf3a87e0e96db1888000949f57014c69543bc7f05861d99cfe52db502d7b1af734c23b289c6182b2422d007b8195c932001c6c3fef3b1b3864f2067bf37cf8579a0c28466851c129e684437b6a7ef03cf06843c5d3cd0fe73ce5b215f54e373ffcb424e03654e12654f6e8fc1f49d92fa264323626bcfaae27342a64a33d4f09e32ed5a62cc85f0aa4c846381b297093222f4d1220fb4f64465e0ca7dcac093f3eaed7c36a7d09d4cc832dc5c15084cae1b96644ed951f18fb6d95930056e34cf3a2ca5b6ed0f6809c9da8b29517da5f008e020bb6ccd9799773b5999cd49eb715def6ec2eac642b4adc5eb185e9adf196977edbbd1331e867a8ce6dcc46cbd39d08edf85e80a3a967fb6a701457642b3b6f5be1855987f1396e9991d913a99868f6a55c23cb36fa9191101754a98a8e72a9f9e4a4cab429fd3a2771ec26d668590e339a39c94d7c687f245174db142e813901572587117075de0f83632315b37d0bf7dd455e649e9be53cf49c7cbecd459dc72821124a79601cc008aab5fec97a88375dfb7681a5aa4fb89d8bc40096e803c76a7ed9b7662c06a3f1327fd75d9dbf0a4f79729b0362ceca7466814a4fe0a9484d16b1b6acfa8cb5ace96f5aaa7f7cca31322ead83cfec42ce1205249bb845c14f9e1b7208f9c389a323aa820a8fe11c95a6a7d5bb5d4e35a7b190a4893578512ea3bed8484ba220a610d20c59aa5dd4c2b01dc5933a08e4bd6993e19922d8c509293b355736992042b58528d3280039fc0c3069eca6881234248338b9553a350df75c7f3956501c5cc0dca0c3f662ca6d9e0cce59f58b491c1aa71572702580c50698b7895da5a3e135e2d7a423024aaf7ca9fa1490b24cddc0e507b86167f263e5cf811e1b086eee70a1da8813507b5a0842b5e38a8fce326bd784108ed6a15f8eb5454850ee1d5a255d5cefb00b5e7a72234919859216dcbf7764b37cf55a32db7f6a6231a9b4c02b7d9478d263aa4ddbec17be80ae16f8bebf5f897e9658d4d7debff96542c658de7725754c5823eb134829f9c0da5cbb9d2c2f7d5f80e06ea244ccb5a3bb789963589fa5bc947dea01e293b509473be1dfe3cd60277f28ed50a59ba77c0c297a28d9e84629d64c80e9b7cd8dac03b02ac31f44477532884c09b00be7de1b71ac0d2c33c2461bcfa848d4983c833663d383393c590b80e9c8d9a95853ab5783c55c9c8c4afafba0347a7d192498e7b38829ddf3b8af967fee0023afbed51f7a5c73008cb8185dd3351a53b62bbd62fc74b02948005829938a905225c98302e795aefd0c2160bd7d113181824a3b8bb4ca79a17108c11faf4be4bcc4963b6b280f107787126fe5ce523a487019daceda0ac19d0a6a982247e0668f07955033fd80f668381a07443e6d854dc63156722aa9d71c9a90824dad985af379e78812b7e0451f161351403e74ad4bf00067c7cb433478e438e06779f3d7a1e4a8d69c1c63c0590bf4ca3e18b9841e8ae086ba00822f9478139895d6ed92e9e2a905b7d2daad989f46def36eeb5a37e2eec5899755eed980d75a2fbf5a1ec6e20b64fffe8681d999cda81e790dd0650bbaebe074bb9e78dd9ed1d4f7ed8e078e4ea2cf3f5cb501ee9b49cce98601063ceab24b4883d670fd72f301ba80ed73332f0edfd2390ff702226192f95a702cd767276ff17a11b87a79bfc81bfca5d02bfbb893eac560d4150bd82989659a32737d06256323d8e61020adc76a3a741101b506a1d501416d1a4abc7b9108bafc12b004f93da056573d9993f7a2822cefcd1034608d60f3be8d22a0a6311121eea938d6e8eda267294070b23e8f64994aafb95edd4708936005ebf2ba4282e2060176d1be11558a6664ac90e4eb923ebd25aee87d0cc9f3a83ff73d935c7e72bb8e794e6025fd5bb33fbcb32b8934164120c8fcb28307face6c2afbdf80ac6a06f640a816ca84a31380a3b138f96debb920689701f19327ae48be359c9b27963eb0f45687fa95f7d888beb4836607bf022c9a71b9d649079a271dd7226be9762643c9730b0cbd1b6d041baa65a447f231f84432ae121000326a32e488a01ce3d051f2d4e8b23e53eb0b4d5cb81712760de61828c35058b8c9ae89eaa85f8293eed0b70104e3e9f0997e4e879232bd392902816b792bf96264f442cf5825da4a24d6cce9a453c8e5188fbf0d508c5d468874c374f7050d8e58726810c81f1ed0062d303d0bc289b5ae7986409d6c586e9331021e874e0afb0e915ab0c8403b0c9e022dd6e974b7b61a60933e2b0c859df4bd48e0839288408cd1e1276550810871c30bd053b50153ff758d83967fd7c1779b9bf0b829c30c98d5c71df838891845b1f4256bc45c2268a33e40408df62df428d7800e4dd0bb0ebe1bdb84c7471986c0549cc2c0e7580fa422decd6a2ff549fb350766b16e063da049a96209dec7134ac46add0c501a430358fbcc7ba82496ad61553a5c3639bc3560d734fb13f0eba8a6f1159dad44f5ecbc6e0501422e8c18c223d80514bdf5e29b1734313cbff05a0820bf9bd124602d479094885b834e18772341028abb2d6616a820739c1305d59fc53323b73b7b3887b2da9def9060bde6570e7f40564ff7e598516f3cd75557c0736d25924e958430a0519a643a183d598fa7c50ae46fa34989ea6fc4fd0b0e5e022ea0b7a585b93f871fe91f0181aa7b8dfdf48a7e78dad35508581b5f75b7bf79898aef7b8724b53680afdbcfa692b72daeb800667fdf778c3232151a33c7dceba9e904e33642b15026e027593b26de1663fd3134c53efd07a705a2a277b6d65845bc8df1b1b0c754631ecc3dc1f622c1f19608e17727da8ed45c7ad38259694776dd713bef6ae7fb8296455859cbd49fe76b64e62ecb46dc35b2015882b80bf432c04c5e97ec9183d0e94053ec7ec53a24c887bbf63b4a30f3ac740cca4f0c4edccf83663764d3dde5118177fdccb8fa922b500b99e0dde9e98efb900cf727b1b715094475dd1506f070f3ccbd5330c7839d0bc2b1355c6351ed1a4b80b8b4fd662f1abe4677a0d39a82504afd79087554074b98613db55a5161c4825d19e5a173b9486a4fe9722201f8ac91b2deb558a83d1560740d10cb71fe45cbb125f1536f657daab26c995ac93ecd5623d0c49c6c29417475c8b7d7da8a49de1ef82e5c50aa85e92e9fa25bd3b59490ec1f182f90220e6c9d3dda03e676f26ef384c027078964f11b3acb9edf188734ab8cdc889bf71abc4041a7fc64e733951f06b49b551777b7f481df974784aced2540054d8bc14ddd38b8a593657a1390701e14b6178848346e0d2431e3b9f0b83b51e02d49bb82aa8d0907e71362838655a8d1c0b798a4fd0858ed8623f4cc7847f758be0bd1a894b489a54176f34af19786657be77fde0a0f66e970f0ab6c323ed33b9a2bd58d8768f535aa686c97b5bd12db1acc955066e47cdbb8b0ee0ffc4b78cf4e1104824ce3ededa5e168f6f0275c41120fe2aa41c4d56795225e82e18437c9f2464bafda3a7acf8825ee5eaf8346b494ff932c0dbfa1873afcaaf0be3f2d304ae5ac84ac7fda4baf5d3cdd94c9fcec4ea83d1ad99600b89ba928719117223081699196c1f058f0e2f458a9bdc172edcc8d6d833ebc5cf929a0ed3937dab80888a2e19ad5d2c6dfac4d842a8fb5515d4e7e278ea572729b1d75d2b8cbe65bd5d20ca72c5e70116d4a919b0c42458a8d1c5c0db95c7147343cd1ce75ae1cf0ddda17484995281ef575a06558fcbcd8f8955b78cedf8f3ad053482da3ca8a8c4268c6388b257d160cad4bb8634a3be743f3403e6b797014b9327ccc02d405f9a2472dc05830a1471a264ea008c968296e2da4bc80fc303462614614dcfcbcd71ac0a1af1cfc79bc233a4ae3c15691501abdc18440c409000d811e89caaf57c4734b1cda101535ae6a08390cc2aa778a44403e75b276fba8b20949531fa481ff8a7176f0e4a8b527acebd2ebc2af8a935aeab85e3b27cbb2643d4aa8d5cf052add460e5d0d50248abd0a309f0bdf883f843ef7e7219a968e64f9d6f7b8cf3334acd044c63a5316e1d0ea89e1ea13c6c0faaefe7c03c4853750c8bf591e6448a6a3dd0734e7ea2652b0b321d516cc98fe5a042bf754a5d6ed54e28ef1de1e6588cc280b1760dfa4b92d322d025f4c6c0f7a1800b8c9a31a8dbf9dc732d59a5caedf273963ca7f5b83ed9bbc38fff45702159e04ad5a41d9980b3d6cfa40f4e6e73096b17843d47887dfdfa867cc0899b16f57b5dc173d407072095ba490be9601d19560e025affd6c3fd7c72b888ae28a0ec089ea787cf622e4038bfc30c9e3b14430b77d3f9e2e9955c9fc53bec34e6b2a7fd9b6ec69a7437cbd112e3a8c52e5115aa5dfe206b53b0407521bc8c62b86fca04e4960f144d7f2f24972c019d6a001e8f5f0884b4f3ea124aab54cbdc12d6d0e7fbe953293a6c1359f3d2593f794c3a2898ed250cacea02ec41ecf08312b999794fafba93070a0883a7b1524cc59fba3bb85a02942bd2e0d4160f1686b98815f8b96ffccd2b406f581661b70e921a0a2ac80c15ff39c9f133aa0204cec49142024cb765397103bf1f92989af2d67116e133ea8a8e86bd323b5c256584661fe1f366d40e3aa20be536254ce39ae4e65f812459779a91ea84a1dc9f0d58533d205820462ad75f484d43151de8b765bb8fb060fd183739f834c8aa4387e483075a3c89f4d8fce0e7a163d0f7bcc9b276611b57122ade7f5a03916a861be49a04068093a094e11deeb2fa00b21795218eb897cf0e59b555f738c92299d7146995ea78b274a69353f632d5c31c39e4cdbdf79a91761bdf08305938617d5efc49f755aa0e6b5c6bf3223c9f9058b33fdf2a88479e96428419e484bfd46a8a741f31cfc7d4d521c11a9a1c680b1bff22b306173095c6d3224274dd22db0e4fd467f9990fff220b758e21b4f406f9acb6eac1c993250de2d35cda3156d71ebb25ef04476e3e0cbea9882590744c3be8cca0ba5146fbe7f3dcef9d7a74ecb14884158704ed2aeff71871939e9874a5c6606af1f80cf558c1857dc4855de7460d4511126c922215c3e742340b31d1b5c3b75c848a71d71e6f411274e3b1e0bbc306801ccafa0c24e30aeeff05bbf99de67a47cb6f9dd2a471819902dbbe4e13f2b700ec818e7d5cfdfb759c0909b0ffb1105e3475cc00d382ed67a2a9321e5eda935e9960ccbc2da161f65fcc009e8efd76dda3fb759ce9ca624b9a51bc1d25470eaec57cd68bdc9e40406221871d87eefc7e074c5b064de1f97a7f874603671b74156e2e9e2b8416234bfabb8b9b1498df26dda1995549ecaa2d6b47e406daf69f5c8824bd11d2bb6581f3f7012b74ee68ea0624c3ef044597e1bbc7bfd047c087376b1bb49a575e6b4ed52531f1ef9d8671e77c8c6f500a0365ddf2ec8f8e58d0177d8d8a52832298678e6f27781d35a3c4fd4c87eb124863e8f644a01a630ffcd5c45a137d57a14fe3a1e2f87d2f10cec055a5753c351b3355520821ae8e90144e65b3d4410b5046da3d54800aed416770de131bea0df5d0e6fa1abac86944d5bcef9a9061f5dc82757e998fdefb399ec5584834dfc4ba4f47db06991bd1c7ea8452443fbd12c9c65979f66093a5ccbe708e1a5498a1722619a93cca0004c355b70edb15d1f5b3a601aa6b8d647cdb147a034da108e24448ff708a5d34b979327258edeeadead7b2edc619199863ed14db7b5b4a7a54adb74f45a1988762a2e1098d81277134d7bae71e526b5473ed7a8729ddb5d0ea3d3a20a57b13c4825aa64ca96e0909c2384d7b0f30fb3de700afb1887675accb6e401711fba90632520fb680e5f28c518b2784dda01017dc01475a245e3560d324047758ea20dadcbe1fa590b641d3051697069985b00ac1cf8a5c1ff7ac920093ab8606e52264cbf63d7e8c034e32699455cf8d1a2ba5a7f80f77c3795940d8de31759c66af7c333103b7fce6182eabd3fe7f051c0a515c513bc87a5ab8b292a6d7b350eabaae8b4584e6d1dc67d85f9bc0c6e912f69209ecf93291272b659e2069d0354c36d4b744bf9d744e05aa98d94d40ef903cf4a33e4751b66cc238a9fba76e1bf2b136819a3be28e6fc16d8293d73b75ddc691a393f7793154d550d2ef70c8c99cf9de43c1fb58b1770835e819d8c590f9c34995e818d4734319dee4a18cbc9a4372002663e275d4283733c6ad80f69361f768fbd9cd1805e454074d487ebd9e398116f14f22810f94f826c01b903e9b463ae9d050e2a6cc801c4ef9e3d7afa8d174f172e44914d8208699d85f0fd77efdf3d7b849e922f52f24d5238bfa59e9be8e411b3cd0ed770f34fa8ee9d7e318632d1761fc03287710e6f86415989ed8e6857b82f81597b2917434d1a72f0423ce20afd758085b152d02e07aba0998e7c9a75993e3701319e70ba52ee49d07e65bb3491c9eb96cd1247779441ad1284a30be8b7a162188d97628898a318ad09485f419f44a2119d7aa6bb5c63b4885cfc65dc284474847c8954964f07f8db960545d6ed93fe8aa96dec8cdbb208c8963dce210dffa58f45a63923feef227c4f48659b27a2452ca04573f369efc7cfaa39e90f7bbc926617be5839d9aec0b85b0765f527ffa39deb652860e5a4a53ab64d6cee1dfd345a0cf0f7f7a54a120d6e3278d78ee1145c456ec76d58f454525baea32bcf14952008939d338160179510ef2ed0324525a2470f499733857cbb5132c3bede02842e5b5347186e8f5b13c3aee74af83818643eb4c23e7f10ee10696b90a07df12444af27d75765c52dfe9211869af2c1dbf0ad9bd768a31c9c3fcdbcc3c39d54a0b24408969c8ba15bc31398af27180bfdd0e47009e8a1a553623bf67d2f281a428e1ee9a70fbb98cbf234b4a0814be188d57bdf432380d3a6a6b1a800cda084184ef999d3843bd8fe96f4ccd7042670597696c382cdffff90137bd36d7bf6cef744ac335c5dd75ccc5250a954a1b600200a758f655bcfca7ca6a2448c340b242dddfbcc5b02ac6c7b62280067d49712319607c255c78b4466610e790eea16ebaf9765fa21c5a198e64260112c05ba9382fcb9573bf730504a0b59cc16f914fb8c640d9009bc94dd1128b260184970ad6d20af4476c883a557250abef836ea1a5820ff10456a84b29c24ca66aecb31dabc89b2d98c4dd50cc571101795fbe9677c2eadbe349b1fd22ad5ba6e6490e96934886376c79567291ccc13c10020c25811ea15691655a0417566a5c163dc6c60336e6cb08ca53e903ee50bf82edd7d5508169b2cc2fb2d9e9e79504455bce4ffa821b3bfa8c1f31faba1f9dfc81875f7b2f2f97fee01ef3f56f6e85c3cb428310494dea4454f03a1f182da2387a597878ae59f070b0b640f124be61e2d7b6459dac9288f438ab90b7f22cd750f74209e10d773bc2495909d36a13d4d4b6a3d5f96f83d9096a87b722d757b542efdf670a1aacfbc40b7f724b207ed9b0edaece34e7d1c4d651552af72881d9803e3f30b266654b461d6259f36125db2a50da697d4b561f8259f3652a5b6db06d3efbd6d24452f97b4ff27e13243ef683da48c43c1cc9b64b5a176d97da9fb86f02816b329924411489c501812d3a8ad606d0146113ecb42bc8b919cbaddae0c66948909a629a246d0683b65dda31d4605f79413619c505c757c809ac4c98c7780d25b9b032f0e313789efa0a4d4e017b329524018d15b9be4dedc4edbd35e8e6568bd34cb99bd4dcbcabd3f9699bd302e137b732c37f56a2c7ff6722c43eea558ceecede84e60ef233ae2c732a8f6c9f92658b9894c8f9099a9b60eeeb0c336dc80f19d7d5f01ff46d5f07393d53373b7ab2b717fa933e5865227e6ce566fcaad56ffc4cdaa0e999ba49e39775b5d99fb4b9d393794c7666ece708a19db4b663659197d7765ccb0571031c520420edda58622d7dec7e859ee4324e8dd874dd0741f3a41cb3edc04cdfb3009baefc32668dd8749d07a1f2641eb3ecc04adfb30095aedc32468dd8771da6509320ea2b50a79f4e6ce337e5499f81713949d4e2aa5969b2ed1e457350cb309e37bf76a8b26acd7e08d4250436914111a5a5020d44082e252c352148e1a84a2286888124553031214c41aaea258d4e08242b0861214911a5aa240d440f2e4510d5ae2ee01b89ff6b6d23e1967470a5b710389bd8a5da7bd22d105c84b6852c3703faab5d09075c08e60a65707108e6cf751226990044e47cae72df795af1f7e3ea1c14bb32978fb2d28a18b0c6a47d24407e86db92a3f3655e1bd88594e436c355481d09f19fba94f2da6039ececa6a2ba1db369304359350a72516ec7cecded51b1f4064ba791aa75bffc0da11fee13708c8b8fe9057483cee7b22cba86e228915ebb46bd2143a590672c82bf340cb89463f793628d9af50fcb3ccf3a6f0b8bada356f807fbe0afeba3c173428774d5b014a5a52d0ba091adaf7b38b308133229f6ab544fb40af14949c3dba11da660d92e10782c84df32ecab758743b1629114645abbf4998a1d0126ffcc3a1d0a04dc094fc10e31d7d7de0fc53c855d810ac644a513cfedad39bb61fa8218009f4549a1f1920122cb3b891ded681030a6e5060c54291c8a20af0068ff9f402097710e4155177efdb30b243496212cd5878d58650fef871238488f6cbdd69070db7f4f8a6dfe1baeea6ecd48060088d15101c0f9d5c2b175389f6f2d540243d884f0d4c47e0373273a72034ec36ae693fb5837a6a3bc959b85c6f026966187a10da300f610d99c0c3e17fb340959320be4a683ed3b530f8496ba55a0a18c527dbd8f347bb0e23647156a450f3431d6b8d4bde9ad9c55d0004012cc62418eb10e39509e6f77f6afa0c86d96fa2c3c27523d82fc5c040b2cf6a34bc06d9c26513a23dd1771a42dacab4a0c038d99f61c00b575eaa0ec8dbe42a773942d82a923816423a58af41b65d0d9528b05dd75c7540561e1611825c33ea0179594483e07d108218e109a7d31460277728bfb887a89155ea5ab6e5ba8f8a83c5a70a6d376ef4bb60dbe55bd971c4df31b61d48189dfdcb5870631e3257e67b5248517ace70b1e4b42253518224f0a8558b7719c4c91b9f837b10637c4cae21c6f8807fee5fb803fa7bfffed9aff4fb7dfddd5fe8f75efcbfdff41f066e8a505cb01b44e6242e3fd2aa67ce67fb8262fc0fd4ca1be1a153cc366ad50a9a5bf58296ab5ed0ecaaf7bfbdeaf5632ad5c303e73572c07558b9880016a73859ad0daa24dc943d1d3b0730078a86e85d311e69d769b1a321ed96873ac9775ba1240f040c27744670d94e8209d3049053f4c9a2850a4137916854b56a84aca506bca0d115e44185048d4dfb3b3d445ff8ba469a36cdbea834cb51a259105e39b72c1132aa7dcc519557243af3b5427e3df49070421cc0fb86d0a65a0059a4a4bfb360f8f49aea084dd5ca39254d8d255aa69a030bf3321dc609fb0966247802d67e10b5461567ff8980bfc97c831d6aad5181183f71c0ed3381b7e2d0b461b383b07dba7e8d2bc92670f843ef8d20f3bd74163e3aebd215d8c890036988238459bfc3263b6c3b889aac2a461f0b643f3cdbb402773be3f5a879120d2393a1c06c8b5a8ff8884d14206f8bb414c7f7bb5b3cf29f8472ec94409bb3e3083f64efc0f9e6d220114a6a02770391b31b86f320afa6d3d819bc6660a35281fc9d170d061a10796ad6000a8c8963684011c2a4395464856a656eef0193c3b662709eeed769bd3e60741b0ec67a837b4feb9f8017f097510e63f42b76fb0a96e306affe1b5299b0e38f9683ff51bd6f4144f551c2889b1838dc22db9a3b1a742e75ee1500231fd565b5adb1efc7afc6600cabdf84713377be876af28f2ccdf3cc6ef971b3ad034709c6ff8b30f1ff76bfc6b81541088d6f53d1f24d25a98f339704038d51be8c4e0ec2745057192a9c444530b38ba8d57ce150d15774a8c0654cf19debe0aaa829a6a8427bbea12b4f1a25b2c63a94b5fe5c9429ec51a617e22b3c2305c05f5104ad034746582c42dccdd1ac5d6ce523a2b383d4e98a83ec19aecd590f1c6097064cf7f0a8bf08d1f78e55b0fa5250c99ea43407d706431cb42248e4122686fc1f674860fd0765139f1526f451b415653c9dc1d2cd5f9fabb4bf2a0d44aea6bf4efd13f89726d653f60e3bfde2c92a1b871196f7f997e85a93fe8ec948d494be0597f2c6a873f780c8ef3c8238380acb747b462003e6463410a1fca9ca27503af986504a7365ea451c3588a5f7fa23c4199a0b1e6661587d821320eb323998176026156a3a0dd04495acf90425724b9c67f441b9413a1b02d145921929d5054711fe604cca4fa26084ead2912aecc4c16a261fabad8747859d19451036ae8d8be5fa1f479d40051d1144f6be80826c7846648a34df0af6f61674cb0d56adce67d8eff71f9ffa18e951bbdf9dfe66d671a0aec902c08e8fe2297c8edf6b823ef1010f7f71a44f2318612539b58ac033df658c0fc3b2747cac106a417305a37baff069cafe733c1a19067707713a6d543abadbed259b5f74247702e053801dca07add35e77ed4f4491c5624ad0abdc05c4d8641e84ef293327c875ab65653d8c81443a571f8e5f74e5a2f240996c441eb6567d64349392e7bfd5e513453d76eee12ea57dda92c2bb35c99f8f44a18ffe04e5aa8be4fa10d8558738bfb1ad28bc5c357cedb7e067861f186dbbb3a245960965927901f5c23f9004a2e27005ecb7c3b9352d4cb0c0b4d2d630d8e32371a64377dbd2af7900d45ecc30950e2643c76ccdb546daec8e6223e2bc9bf8b5425b0a2d24ad75e055472234cb101a81e7180dead1278b1e09abf3c7355aa4d5c0d16e97e81a711646c6975c6c3efbe6e8687a5a20304037f3e9cebda2d2978bd3028f7bcaa1d09e3889a49472e7655bd50428c67731fd43fc2443e0fe4063a48b880b9b75015dc58455fbeb2f81ba2923730cea811425dbd4dff6cb20e76c33e8e4f528506721fffde6ba9dad16a32d3949b4ef1930f8bedc94df49b7c002e4285cc5c8124656ef9021ebe6b9018aa1a7481daef874c19e7d710e52d1640a4809b3490562c75feba6ead42d17c6d2e1fef5aaff8b7d012ca1aa424838d4280e5052d2ff93cc1a20b2394cc889305e324ce2b5c643a06051cc679cbfd0811e503197350f38ded07eadd56cbcc0f9d222a21f14be5741b8ec479bd388ccc517c4d42908d3c398cf37b2ac243a6c78ade57ea7730c51b30273e2e5e637363ec74567635c6056609a3c6b59eecbede479deecd0b2a7a4655f73e3569f2ed324eba9e1ff1520a2b4905af6c0af514daab6ac69232e5637be5091385079cdc2248c063ca1b985149239f1433b06081381f11b81b3a968d90775d6f3e55442a4b8f3f3184fd181e4e6762f0afde111dd22080814703b1e8886fffda8de78dbd5eeba706bb1ed45803c233e05121f04a613dcac7ba7ee2b34ac59a2ca9f439ff06f7fd158f84f8d508a3d4aaca7505c7bd07b54ecaee5bc708619bfaa0ed09709df31c6c4f21310f11bdb3f2bb89df2ba91ee7f7d425116290b19ef5cc3cdf56404b46951c0c8874c678b38986c88b2fb6b2973c13a57269323f5ec79f876612d4b58fb91c44586ac06cedbf7ae14b67fb009cdb3c5318fb90adfbd6c6c48765b0b774cb05656b1ec65762fb6d728b2aad69ad00bc8a0f692348357eb87530467343bffeb1284262a3fb3dff9a8b075fada0b76e05065b0307f14a765f79af62ea7ddb916e23d76c7dee007dca04eb8d8187516c2ffe7f505d3f5abefb8b68c124288937dadb9930f77d395be797c2a4a7e60ab9aced9cc3d4976c77f1682e847b27571f284d8f3a514482b3f37b000b07950c45955f900f31d95c937b99bab8ca47d1e7c83b0bc459f11a19f74fe2c695e72bc8ea395cedac4b38abd2ff977eaf906c0c43eeae22a93032a7870d01e19bfafae85ffa9a0f3e069bc0374bbbe968176173b38e4c5383a35d80e4e863500e21905f53875dd4d78a0a5167e30fe1b87d34b058bcc55e4e22c83fe4f84cac685c81efa79ecae4a310b5946793fd85ad07c983daf78b0522b20105b88e251a85dc8a7348328f4ee44775e3e901eba5928c2e4a900c02be691f12fc17f014a3020f68370e63c242f120f822210281406693e1e897e47446785755bc4c3899b5f5220fb96a21742b45ff1c207c99369b21494b365a757307b070a11cbf3123ecb1bbb242996e907319e05e397b96caa6efbb7658ba41e4135c5f9962f7e0422be3ebe65e6d6cf69234bc15fa008f0780137fab22d3b01f08091f96e154e218c8c7c25fecf1851bcaa7a87a93572ee23fd5c07eb0bee3eb4243ec8d5d3fcfa0ac38931664682b7506be24d5f7927abb13d5220ada0198536889fa4369e97f1b60dea267dc127b17238b89b29de63cf74d19bdeab661fc9728796dd58b981f0f37a98124019be0afeea881ce2a58da5780f662531b30dd0e44035eff384e77c3c53d7204712b82224b5cd96cd69c6e05b61f8a8421f006741af436c36b573e0c32d62067db26a0edbd89616698bd4a2d7a8626f15dc670aaf110701e6f24d03d90aac01b7ee0ce42f957f7fc73b9c40d290d5dc885a1e1b911b9211398e8be81a3454f1994a26a89ea276f884bba7e8290b0bdf5ceff1eb39e70b749210340053aed762ececa2763938c8e3e1624aa79e9a388a5078631b4bf7b1d71b7ff492b03879d24f7d4efe48aced9423421656f270c5dc9b4587fce4a1197487ab5b92b7eb079cdbde043c6b60ce5c3480b4168ea0b335c2e32aebd5c4adfa95ccdb8796f854e097f0abeb4cd2a85d0be6ce5463bb14de77c2eb2d30cc17ea507d6a066e8727d2133c62a286376bbfeb5be8f6d4fe8adc44371685ebf9d843edde3cadb992ad9eae20272ec18fff90f44a602c13a64218756e0affc3ec8919d70f11b86eecadd3e481b5334de453a4ed9ba318a7df66a3366e18e16ffc6386452e0f1cfbe6f61e41b5b6423fb1cd40ae5a884dd68c2e396fc5041cc957f4827e8b796268b7c97c25f80ba7c6f8eb8906c240a52162402c6669a62f6953c77525d241e13a0cfc42e8e9107cddd492b08a452e9845a16eaaa942df3428150915e8e62a0dca2a6af6b7cb3cf2fee2a267cb831de31f1357f1ca9263a3cd0c05c87264e20f192dd59412abdff08bd5bfe8dad4ab0674a81cb631a1a202309ffcee12bd58ed3ab9c01585c3b20eb9aed7ebebae70c6326ed8eb19c1b05d48de221504784f30282bfb3a52e7d0c0ca25601abf79eabe090855f26880bc8b7f1d77c6514ac1f09ab2d29321de96c570d726f6467cde180f895ec3c2fbeae36680c66c08d053d7816d484578de03d64c22457b53b8cfbfa40fab9ad1cfd93a8343d7db99529b5cece2e0853bc7f0c20f348797e8f3bb208f2949e64bd788c9626880e8de2e21d092e906cf31e2bf756d33f27d8cbbf2a0a06916ccac5118b3cf9a15dc265f61f874637a17b3f026abb91651d02e2f74be731cc86d4d32e174bf2bbd84c31a6ae5d3f7e9a129d24422e2b61611f852a505706abe7f21893fd5bfb0c0f606260a06871796246bff54b9b1fb4bf57cfc8cd6d72ff3bf9b31471c84c1a51be4774e5c0a17911e8c35a3f4d281a061e94bb5a75df2b9e1f0f21b6bcb0b38a37a3ef32e549b74181e32230c950bb842061fcd8f6ece4b4178ff27b8b8c17da1eb987ac6c1ac84bb41afa445190652c6d8e21457b8677813399d59d40c9d5e4038edd0eb97992cfd3607ec75d1b5b2ff97ae76d93a041a598b9b42ae5e2a840a72058ab80e854af4e2ecdda6387520473db9c345ba22eaa93d33d6991ffbfc996ee939d17cde47d2d4b73b4d10ad6dc0762b0b626a8a411358f362e89a942c7a8b466cc21770b5061bcf26faa3811df30592b8194850377900d4da4dba5196c6eccab2cb091bf4551eca27df5afccb0a955b5f43ae71df731ec3b02c93ab27a000c7304cb3011bdf2db43bf375f1910d58b6c44e270423b5e480160b8301e05b28c0e2404d403636e0114aef7181ca5dbf17a0e274f34609e59fb6b023a50b969862209d4a0e0d1021305ecb60a13fbb58ce2f81306dd7ab2181409975458129d875694ae7a13c1a35495fc76647f80b310acbb78c4ede3c2812947472f011606919b6ba04dec376b3e734a07b506804377c7ea4f6120c7d851690fbd561c01ae76b8b79e1935c122910b263ec61be06c75bc2c7f611ec1508971615c22641ef0e0e3ae003ddd25a4ccfed87b82815fae19da3573c813479c6997212fe2b215be94be2921a73dec66bb97f25b92510bffa04c25a85bae883704c91cbc82ab3fccda12732d94a36b29823ca4746affa834bc7be26afc809abeb9269b5493fa9e9fd27794d1711a85adc3a93871591dac2ce4cc39a8332dab7290bd7423cbb63678dcf2dd2ecc72f243ec9489834080d2c2ee06f4ea5c20d69b9afee922fe2ef3e4c99e80fa54785d4d32990bee9051f460fe02dda20af7b70bfca7a1e3c1b5c42d2e509961a102745eacb08e8b3019e79dcc019444bd2042d4cef10f1bbc665ee2164051a4adf0d4a278b97dc50d69d387b4fe0a015a2d8d3b95492bbf54b10400af950c9cc5b7910ebaad51e09a0129f5183660db0f579242e6ab4d0e70e98d0590b427ba1969f05e949c2d28061351bf832e63c134bd2945dadf3e36823faa5f19bcce6b8ddb8af81b643b892594f0a4c35ed9b77383083ee8e06ad155ff61359a939f6dc39ad6af842b56b4304c562089a1e5f2b32d21a8a6cbe96cab661da67ce0baed4719fec895af4179814f0741b893bfdc21d275a4ed8a4d0af98d641ff746396e0d669c92fa6ec5094db8a3b10ac697fe3ab8aac1d4318cfa36a0f56e91f6de0579aee033f77e9a757d7284368ce5e8b374a08540c8bfa08d55ca6fa036d8c30ff3d6d8dda98c2b4e9742c68f1ef89c5935b0b930791aa39bc756cb2139b6114d856d9ac9cfa940abbd0abf6d959b56c169cd211c2b1cc72a89f43fb52b0e728ccb64d4b6b4f42e9d600dc0f8542ec300258f2275afd6c32860ea73f82f1d77504183906a9801372d70f56fc6700295b99a83e4cbfa524045a33896df7015237377d9748a0341e5a5faecbdd0d9f902f429913836eddcbeb276ebebbb1d2223beba63e69fe30298f387d87e1f04755200ac8cbc93529bef2bd80962a25ae865e4bafa033bf29b0924957812c228984c2738812d203f65af8ce20c281e940e9c9f0c6b99c4906ff397173ea1f815790e3a55088e78d3fd82f3f7638e30cde40384373c1e02477d9579bd6de1993560dae29e0b12e0624d3639217ed873c6926b3460688d428fad0aeb687db9fcc3b36af336f75806f920060b7c3c01ed9e76b43a67d31330f578187e684b9a7cb0773178070528f9e1be1f3c36a96f3812050cf491a1e414efda1f46dd1c4da13b7dc1614a627d27366d30dfc5e01a52f3212eb208398396a4818d774364bb814be91fd7e27f36f2ed61cbb6f81bae58dfe61a7b19a29978c79f9f1fa23c3da26a9124c81bd8a6e7ee09a5e1f4e6056c1ff6bb2a9131d0e2e5edf6034a59d4dc23beb14d673b55ce77618ad1e91b88a8ce0955291f773ee8be47fca68f44c64612a62db627296d50f74445b47222151142e0235701d166872d863298bad5d9a9bba068a030bedc470fb834cedff4dcca543f36e84515722dd1cdaec754a591e2b2ffe70c334d0c4e12e10f0fe9fbae674b9e743ed0f59d674a45b17c44de1149d4a0078062924580ef266394d70d4f5d436248bd5c5c9156342b9fdf0496988349aea451d356ecc639f8f2322aa0c354933e1aace38c4602b6419d424e27e873cd401f4d74bce890a33e6b831260c899a1be34f709f43f68d58796b80e3fc8d3970d8a29ea3d70353f550561faa2a76315adf09ee7f9414669e1ac9f87261dfdaa4b5ceaef76f9d34f9264711033aaec27ac1e5998e95ba38da9be1f83736f0b9057d0f6477ffff38ab0b9daee2b907688bf35681ab33372cd4431464f335ffd6039d1582957816b91348c0a66623b9422795d797eb7a087edce1b35e0debaa8ab2d53665c8e43880bf0fdeb1a0b38273e5bdfb6c16d52ebcf28db601d146b4bbee54857bec63d10fc2bcb486e7694eeacca8d91307cfbec3935d2d762316c5616d02c1f91553520266aa56949ce2487dd2617ac020d83e9b47f5d677cd0a455a24caaa1244126eee3d6c6ab6d94608dc5d0675658c3861348aac0f46deed4d0e19d1981ecea73f28e2854c62f5f7f5078869f3e18f7e77b2be0843935d50be495e9b5635978c77aade571ee4aac066895332300435e00e79418362cd2cb03f4164a8c1a348b80deec28c1553435e97aeea1a4cd3c0662108b32aeeec32ff109f58914e20c1b742c715e1b50b8b47aee944b64b11a691454887dd9a2316e7f7cdf38d195a2e91aaf97a46fbc29efb5dcbc63c89ffb5143ab8d4b243470a158b07850bf1084295148b422e024817830aa615c8874c208a8537a24385054725d462bfddedb83ccb227cf4b34287970257f545f3d34148e8e6c26fff538458b91ecbfd59229f178a2b395d68da5cf4a30ce4452698f0135306e7d7fcc0348ccaad10b25df686bdc8d131c46309012e115894744663756279538b17891640d460680f95cb89a5ad0434e13905bcf9da7a6fafe672301afef0c3b72d67aedb8ed8f147e68a164c60c4b65906765e564714f0b0d534ee1f1f91da6dfbe05f3109670b76be344f044cc2690898f25de1183e8340e5bd5c2a27a4b585e32b428d90a675a67cf610fe5761228b8e6c029961b36b64a840960ea1c3e9529cb1d6ade5cae23f6bbd671546d28304979c51f7aaac25528ddac359a11f8cd632758f401bfc44fcc19e76ba8832bb11ac80458cd8a6433b88821cbc80374b057dbcf4607d0072504c14434cf61de7feb2515dd597999f9270227dd9d7c9c242e9d5d8436a46d2195accd86d90c28ec236f44864c1363b734f6570ad865fd5edf34f4ffd3e6493b50b84509bff453382097ccf9ada958380befe2966463f86ce83dec5886e8fed484b62352fe2754bb457f411da78891766bcd7832f9eaeac14e4dd693b8c92b34ad0d821e81573b7bbff2205901092429cb9e2d8c841b730abe05b9d32a3f4081928fdab4395960d8a26e70b81d73030ef2a1399f708cc4663780716cc78ab8e56414b0f1139611735caaf157a9f7829f4595c4bcf35fcc61d67507d08f0aca0028e4f508b4b052737bdbf46a0f70a2d9e43d2b24b07dcc6f3052a2470da80d2c50d72204dca81f9246d4034838aeaa262608096de97dfdf00d491f0e8be274f02ca624a3fa3f5fb46af1ea3aa57e5f70ac1d478a4ab7e0f84460013ea1ba3d42517f185f1c7c854681c4218ca810ce011c30d5d205054c58812d1ac946d38671a00b3ff3ed8ad2be3f4f981f8c59712f14b8dcdef20d26d8082b7f139935e9cde131c350ef97b1f3c29f459ac456f6b543bb94b1407cb50d0ae19f0ee428f79935c73999730e15164627a23e8b7fbbc123ecc78bd505090e9a20c2f485f0cb8e074e16edebb753b9c41b74366539b9617f1a0753581eeb44402e93c5cb01ee8215da3f4eabcafc2c639ba18e55f192b29a24f8011a54716beb885ab10a79caa3bb75a690bedad7b9f832fdd5f112d579296fef347fb487e506d2d835fe05988130b3c7ab8058f735360287bee1775848e5400b473d8dee5e5e49e088065727d72673f788ad2d63905209c9c90d5d7970b96494a2733abe136454a48722ed19f392a6caefbe082c109a568ec110cf146020410e6ae3584444cb4d59754ae8b4d22d52c3bf7f2ec907dcda65e4ada081231df4562a7032f2c4d964d10b8a3287c615e89151649e08b97008e464a0867e15286277cb9492b71abf136ff0497ce8808a8c8cbf1e52f8a856dab61e56c1755937951ec7c70dea12eeb5ae848384457212c317d46c942f377f0463b30043b41f0a0f67bb12f4c0807f0c304ea2005dffad0057602fa7c633656d18bf681bda8ae2f7ae73b336c2d034719f0692398353aff7d16ca0671c61d7f5adbc448a1cca51f4de6d571c4751706094f1be1602be5664f6eaa6372071c8ccea8de6a2f06ab83c2273be27727082661878944d76228ea601c1531a01807d7c2f9298f0fa4eb8a4a2f0fa78b91ca7e0a9210dcce16249532a4630746383c072e303df59aa34a019e25af6f2dac4809a77d6f90a29ccfb9f94ca4e3d39473035e61594a49bc296d3ae5b1a804a7323a972a1552b56aa68f12684519f02be794d06c5e9849dd3f5150beac987d80d2572ba1103230c1030ce349618d8519ca772d9921d12a89f2c83103af0fc8b5d189dd90841df9c911ab72d28319cad9b544edabe35886309e107ccc09e96e3284e0c87948b598caa90b022fef9b03726c59b7f23e02bd34ebcc9a185d623f599527957a4846003dda1bbdaba360687323df9d5e9f0a10c911d45c4fb8bdf0e8557fdfb45323174f49bb33036a7046e8deb57e602cf8b890657da8ae5c1cf97c763bfcebb5e62307de5ec47f0a7c307c61702dff064907854ca69a55493da7273bb08222b17eaaee7fda7c0a18644d84505de606da2be649464765d77d111159e96a8c44d66b4d59bf162a1aaecaa8c464fea76cbb117b55a71c378cbdb38edd1e8ca58e00d3c8c97bdd8f12dbf147c13c01a4c9000e26788631d62d3b736036882f57a397a5ee2ebb0a9946b6aaaed0f56182d795941216a947afe632b3848765c00cb0cab8aa3f7797978d3bb54b088a4058bbfbb660377da40625952210c0e8083d1623402060ebdf8dc697ef93118f15190f36c911d9088a78ddb18ef7b6a353d16bfb28952f3df6a520abaf632a00a5115ac909586741495e172c1862cb9af65bd2472be1ad2c5a96093ad05be1d113c4ee6ab50e50d766d3a1021a790b9d20a1b40210d2c9875b8ba95b5b8e1ec3e2bc85d7c5e11ed456d4303b49408a6ed7d5844ddfc2185ed7bba8a265c63e47992ca6fb0e597721f44e1eecc1100b11e6f0b96ea0e4d7a8c35d79e865a32de001606555fe5c25aab513fe434779afb16190168038c20cc496e114c7987343d8adc9976bfb2e689e1e3da4af10f6b6c7f726a9b9abc9339e988169831dbdb1a52af73cf6cc7a83b2f18f6306bcafacb21fa1934c92eeb94f26e9b06b128ceee241f294056a7160f6273c071ad600cf1ad829f164590cd507011264bb0741676e4008d28fece5e0a8f59448e4b35a8b735c1ea2880333f07033d8815bf022e2285b0ca525ce3acac512b4dd1353e1cd97140886b1d48d03a6ca31c2d0b83bf98008c8ddbbd66a6bb192ec0689ed92c93b35f246f69e8e946e6af5e81ce52af6a9c2590a2790e46f6ccf38456a017aca453e93560f09b9981c2e422e2c834864f3545b026987fa5a01d729ba98fe84c0316946fcc4371653dd99f2e560ae0b4bc60162412b0bf3975987ba294b59e2877ece0b71b6c448dc2d99e1f856e1cb4b84699ec1311cea4d29a2e3824bb703480da5c08efee30408bfd6b9272481a39caed7c82402eb3988a6893a3f5f8576a84946a8e2f3600f31f7f2c9fc27aa4a70b6bba8f6609764bb2ae05e43411b34f4ae1e665084258e4c0904698c2d6b9da455f2b3a68c876c6ac722e7cfb22d658f26fe74a9b438d48f51f4529e02b8178f6457c832f4e8ecd3a7c762037552a5ee8b7fca1dee72be675431a99a289668201f6dcd4b37bbce033a3c59e5e115ca00f7702a86df9b5b27915122a7357b4a16bae0ccc855103271dc4dcce6112965d42de6ada72f51909a08351900146c317ee13b27d8bcadc42a860b1b0472ddb272afcdb71e89485044019a3ec47b3ca960463d651eac263959f01380f8f919e2437872c0759b8e5c09264e0dac8e027e662c2abf75c1b1940c21e84e87a754d703713872cf1699547109aec7dcfc3238ff05873f96c1554eaefd0bbe377a29e80de5b85d83700e540b3b9d3ce0b024e41104ba6537aa5820da19a703cdaa62056cecf1c67c309c701df078e6b31026ed56e5e75da84c77bcc89632450232d54fd155fb03b19508b05002a310906a7321517d409d21fef5df3695bbdf86bd0ea43c5562c30411d9ddb6dc52a694640a3f0a930a7a0a49baab77559830c7a7c6777777ff23dbc3af9478632d47f7ec6c867d0c2141fd7d521f305e89359e34a89f2251047586342258a1c41caa2e939821478d31ce58718253da345236ad60819af6464ec125205c6567da9a6823679ae60f3346ee1760de63188691e6d2442a1f46397f985e029991b46dc70b368d944dea038aa0a0f5b943c690109eb08365825dc7d102a232658b9cf1de8a5c2959ca28658c314a12c827121dc3c14475d62d7fb617836c624448d8633f4c4c462c462931a90452d65fdab4171489667452d77b3e856ac618e35c4f6e552aa191f387b9bdb0756d240ff5fbcee380f5e2a3e20ba5336872386b2576d1054432c618a39452f20aba075ac728a594524a19638c2d85849146d05926d823c5467bea07817888c5253e020285fd3c94f1100f4d3efab9d19e192c7105f6386b0510c208218430ce28230ce6466512ccd2a13a91214bb22c215a32549d159fb92f0956fd21843470f5603761a8773295793217c166009b4c5af4d87fb0496d9e73a7a8a87987818ea8e4ba39bc3337ea10c3a28c58ef6059e0cb5f722ea58cceeeebec316e841c9296d25f3e74a34590c51e93f882b9517e652a7882c5abbe22131cfabb7b978461779e654a39290a4b02859a1b151a827232544a29e5bb9498942e4991247f3d967a786c1913844390ec52c2b9514a29254c179bf5c984978c31c618a5941247062ed7faccd15bc818638c314a29a5143782a1b880a3ec22482388e2db8821cd1831677c4c76362f6463e3332c903354df81a33acee6f3bff9f25ff3d001eae8201e1c1d280cf62f5926dd3413a9bd1c1bd4cdac0659616b6bfa4b2468ed30b922b2ca8e48890414230a7a7102f44550955c34fc7e6805917b9c3366934d36516cdc666e34c610b988d18f986a8c928a18e3a909378521a5134fc5fffa6408598b17f8dc286b21e4594c76648c31c618a39452da3cf119a44c22e7d87d85aacb44af46e832665294bde8eeee32b6df444d34708da62db0eedb24accf199dd0969312ca871042093b1a21a53db06c73229b2fe3cbc766b7af611b0efed14b3db0c6a45319d316a94829638cac448c3e027667c87d53e3016a1c4069b7fdba1a3f2e25bfe66103d4d11f9da06c803ca00ed4d16f32c1bc984c5b47eae6954a7ac9f97af17968d55c9ad86f823a7352ba03777a073939f84a7ad13a6e6be277a4eebb40f587ebc507c2258645efe0cf0b9c4570f9a432533024647a073b14935366922435b94919a3141a236f949a4cff9e874205712224b4519b1d2fc28c9874f7f7624449ac0b82094921a1fe190fe551b0852b7f4eefedbf444a229f40a1a6a99238b842f59c2b01d86555ea0cb03451013568d30038f842264d28312c4a8ce314f772b06a7bf79f476c9acc49229988b4eccbcb71c4c663cf0676d99e4b3f622a94d6afb66e07a6e92b70bf34de90e9930336afc9d2073dd18b5adc622946295b40a564e7cd64faf73c14cac66688cfd090f7cc209baf7dc47ebd38434926ca038d5ee4a6324bffa2c52998905e5ed3344eaee2ca575a6f1ad72bcd378de39526378d83ab12b7c90702137fbec3ffe88e27d013101823f1e917bb13adf33f4a2af590118b353edd9afead293881788d2fe9de2ce504b411f85eb77e303e0ebb11f8f1bd3bfdf01adf6b746e7f7dcec738b6dca394524a19638ccd33371aa57494ff6cdfba787ea64419aa47f6cabc828357ef41e95af966d81dd5d97bd97254a7a4ffb68a55ffb83c8440df1bec4a75a70175f7652132a6fb4c4b4d2fa58deb53f6481829e388b0d715eb866c4d7f944d723dc0b9d12b252a425d5ca930702ab141d5dfcbf1cdb81f99a90c650fd8f57a977ac8ff7e6d548fc9b41923b2281bb03303180fadda3ac84af5286dc1da6ca4b4b1e12a090358e9c7d7ecb509975fb46eb78644ca7ac46e8b564bedef8c3126b8628c53ba122637794e789e6f3fa1ad9452c640e73b16b7927c79c1482e47e05b943039355226a794513a9531658c5101793029860e5ec293d2cedddd1fb58355a5f7df4e229fd88169fabf4d9decda1f720e2184117b77c5103b222cbab92f0ec9b51e3b4f2261ba74e9327d90b24a9cb3e3dc4a1fa594b2b4a132cc83d08a3d4a4391509913892e6397b14fe10546fb48caa67ccd378d944d140ff451933b0c7e8f1d9d7f2b976cc881b521e421a2d8cc629c9352938905514a8f95480aa29991668c2065267f9b1f9bf5e933444248299f638c12462965472b40992d605d8c31ff79f43f948cff6c62fcb7ae17d306a580ac173f3edc940ff67a8b2af693ba806e32b8189cc906c8a634b05e1361afb499b48e2483b4aa08114efda0814d01b15e0c5797263e0ce771585420fa8bb4cae6074eed7ad35597083930a8feb04a8e0e1a86e3686afc35000ed51f66dd733562a0fac327f273a35b946d8112030e688cfdc055a4ca773f62aaf29deb266c131554ca29698fd89d9c78ebd35d069a0d8aa46da5196440d9d94da67fcf43a16c6c823c212434434ccbca1333ec68d0abf092242d470fa594d216accf1c359e307a410e9fc2f424e39c93e161d773251e3960a2417c3860abfa0f3940395472a654ef207cc97d471cd6df1a7fe89877cba457c067009aeaa68f729bad1527439aa6df145fba52f7cd2d8618ea4765cdba1f4a23a0f0872cad7187dc7b805576356e7016e1ff91e3d7bec6183fcacb3c59857decbe24ae0435354dbf0c0c5ad008bd015dba74f1ea7567fa68638c1c638cec0426d9a3a0497fe8b0d46362f2bd63a23552168954f9f1715a8b5becbcd483df25d63986b1173b9451c739bfb93941e5c7ee9b1f8397eff0096d71288c8a1f464e760b7fc71328c40176499a9b35967c6c855d2c01d92e409274a90628857579e7d1dda33bc767c618638cf993891bb1ece1aaa8fb84a911a67e94865865e76d4d3f8ce7ad4f19042c71450a32ae1d48265a3254d9c71fa7997bae431f18507f9f506afc2fa6ca0e026d4d3ff30028723dc0fa41a0f5097da40ecf0ff461a21fccd803a13fbbbb7bc78fc31c343b0a9b7e26ff221d7c715075af82ba0fc117047a85754dca01dd57fd7888833a0542106272508fcf60ae63a5ffe8f69f09e6bf5fd5cb7fa41ae767a82428c744fb207860b158ac157d0d869bf1f2428d01a840898ba51a6718a9fe839638b934f1b7971a3fe37cc02a89c657fd7f60553ef683d6ecbd044456d921d92e95d4c5ad8932ebbe10d408975f66e75b13bf582310d57f13105d8947d4e48882d7dce28c524a29638c11670a97bbe646d751805109ab9450a894914b3da27b1258e543f9fcb2f301d6d83918fbc26646f2a098935293e91f6709972b4ae95e7d0521a270c8f88c1118b61ee61553e2476670007d0105e7c0cc10ca8b012966537a703e918f5ef56e08f67ceef28744312487d60acc103cd0c2d74a4f5d00e4386c22e4cffcfb1153f57fef09f5ee6f6f9aa691cf2528930aa69ff14c0330c2144698a65a8475cc3e3e6dd5f6f2f1513b30ac09c576ac176d24875a6f879217ee4b9ea3368e6a26129771cb039511930f8fd8d4f8b00424c6132c5430eb9622076cea129923d9a3f8c8aa7964734286bd76f7ef086f9539ce87a51f70044ba4f8630f5f3efcc861ddbe7663c713a8ffd6f8b3d423da90533d7ae7f3c86684298c30c556034e38c5ad1ddae75da2d8d08bbdf9e582cdcb00d42a197e6d3a195ec0829efa6d3e6775eaee44011e2fc30b51c0db744aa4f42be0bb13c2e36578193a253c3e679504b5f99bf72c45bdcf407b23f7a6eb3e5759157c35cdfec48212e1e324d4fdadb1053627a526d3bfe7a1b00d9680406c8bc79d84c8f0de7b9d12254bf68a26785652fe952ce11f7811b492c2bd005e86cf59cd1550f8de2f8edf6f56b73875fafdd661d5007ebf9b70eac6ef374fab08f0fbddc3291bbfdf4f5895e3f73b0aa74cbfdf3fadaaf9fd06e2548ddf6f2aac2ac0efb7154ed1f8fd0e6a958edf6f214ecdf8fdc6c22ad4afccaf017ebf8b3825e3f77b0bab0ef0fb6dd447ad42c0ef3bcb99b06ac7efbb4e02dc09ab52bfef4fdca755aadf6c67347d402406ea986e0600ddcc4c07b560b07f7a00852e48423dd0228469c70748e899010097030b88cb8145657b80edd4fde778e213f6f69fe366466362c8909941a386c9c60deebbefbaeff41cf75cf7e178fe9cbaa51edfc11e1edc76c3650ae06c38f8ea8fa1fb260cdd0bdd67dac7c191ae905ceced9f38d21047d2c2debe0d8ef4626fdfc491b8705a8bbd7d1a9cd684bdfd199cd623c36932380d88d3acb0b71fc36942eced534ecba215692a4e3b6a9afd14a76d619afd04701a51d3ecefe0342c4cb38f004e0b3a00a751619a7d03701a8ad39e30cdbe0e4ee3699afd02709a0ed3ecd7701aab69f673702423a6d92700472a6a9afd0170a42c4cb34fc391849a66dfe3485698663ff35998ee9b1fddbaefb5eef32aaaf29fb2f98c85531ff6535786bd53d6d1c035a3b2cf2e4edd1862222818d57d2ee22dac62b21169e9a98b62b1154e6d152864a9fb1cd4aa5eed6793b11f4e7d994fdddfcf7c3875823e300a36855318104685539c82ba8fb9302b9c6214d49db20f547f92a01f746547381d006e5718f7f1ab6eadba1f3920ae52f705c02951b2243be2b59272f25f82802a442b2927effc55dd88bde5a95f7624031700ee60506644bf7e99bfeac2eea34b85bdec0802b1b70fbdd89badfb31f0d00fbab69fba0058522327009ce3096d673e7ed57e1e9df992874b5402e52752e12f078027d49344f835c2a036bca5f6f3164ec9f77e6d967a402b4a38cdbac9200832cc1da5a139c51fa462a5967acc1fefce9c29d3027d1b7461a67bf6fa73b0e7ede09784c22a29f377df35274171dbbd79a1eeef600fc21d2c58425e0ef6a012edb727318944ca489dc7218128f6e092c642b4da5ee3966c53ecacb4b721087bf07db0870327f8c649e9d73829d873a9c7ecb6090a3f86236c0802b3391db0454ff5ca838f205bece860c362b9a1ab0366acf37bb6f468d85ee7b373fbb0a9a424519bdc5753e7673fb98fa6cecebe01d4993177c4a662d84f200da8185714a7b01d2cc51ffe7c2deab7afec6b08d1ec49af91b89f29ba52dbf38250448aa854f83bb08ab3879f638d2a3c41fd76d41802d51a0889c33ee3fa39853d01aad82a5330aa6c434424a808a7becdc203a7aa4c014b859f837dec00dbab70cb10e8967ef0e4fab774034fee6bc66d1529bc2a97cd39272966393e9b1a2712d8e5c70ac108203a706a76275a6588a644a938326e071e046da907a8cb8328b450616976a61a50d30ae8e755f8455ab52b081fe38a703bc0af82ae1076762842048876972e15b2480c5305160c62270a3b2b25374c3464b418982f75da155eaed546822e2082cf8af44b78044106aed5e97356383e6705c3e7acfe7356dde7ac6cd4982123062d2979f9527712927de94b9d92d2679fb37ae17356317cce8afb9c55ce6abfe376098e33695028fc18388ffb2f5ee07070a82ef4e3d7eb05d71084ad96d1d18b3d7eb1e746157b21817e04b437b0f2bb0df6463e7f16a2ca4fd8e3fe99e63ed4dc7a6ea6769f2938849c88b23daed791f6f34511f5eb27cd8a3db429ec71048a3fcf13a56391cb81e2eb753464145f928b5e6c0dbf47f7865cb61dac2b5c5b7e98f04e8b75459525ead74fbae30fa7bee8457dd5299c621d13d425aef038d9b6137792008e3f3d8e0e081c7ffa3867fc79acd4235e9103290e903838de86e823e827c6ae0738030714d61ebc7eb185838b91cbbc686f606cb57e34aefc71a855710a512ce510c491177bd35de3ab5571e85539c630047d810138e24fabbce8856e9b669be6f923117b1363b0354540559401a4e1ffbf71e3e78badeee2cfd630571b54e8e745ce434d4ae06abbcf5463cb8615f4e3d76b6f56d59449bffad5a4b2084e1d10a71702ae4ea7ee147f57a7e7f71e5a63c842e3891b628397ba5700fdd41d88e080dee06c70afa5062763050adff4847ef107a855fcc5d2f03387e1aa3c82ca1f9b88ca40ec12e257a603fa404c7810d47120f843839bc1411e2450f832fc32f8618802ece1600c0e965894870d0aabc2180eba60100f7de1e050d3f0938ce0a645e8064e7ca2f84cf9f9b9a1c42d6cd2a567e54da0f09d09744b3574750224799df0b2220bc756dc012ae271c25ed429a27eb149e579e23d3d0ed4aaf8b38329b6ecac3c0bede2a7f26b6fe4de7021d2c21e3fd1162f2aa2c21ebbab7320f6f86100837eb1058de20bbef6a62bbfd6d21b4211da424bebb057a942d4abf8d2db8be051855cd8732bb1ee1536d0c2a499e5452d9d56b39af0ce4ee52dd5f0428d3f4ba05ffca9b0f4a3eb27822abfc4ed4aeb0d08fc5ec8ced5bb6fc9ae366ea32085240cad346e57923302dfdf091d25a854e9c9520f50d7950517d47e6d0d7f3cc5893dbf38152b3f1b716a5d5c742a3f1f754f4761d5328188b9706aab58b1c3af2fbaa2d87eb814a17e3d31e9409cfa62cbc5a9af5f419cfa9c4788535ffca95438c52d22eae7565af5f32b7588fae1a89951fca92cb457e800063552910cd4048d2d4e9dd8c55666165cb17b5d81414cd08f836ef07eed4dec4e34c81a3f762cb435fc469c622c5916faf5e3d756f78a185851bf6671166e827e3cc429ef4e4060779b0d481c13715116e8a6020ae58d1c8c5346da6e24712721a49c95c69d84684a66d3f86b9fb3da2d66d98bdd89867571a1739240af4e12e0df7eeb44407afe5dc1f7d7be243c597e7c589add0f9b1a5535beaac6c7691cc66123d9c7245cb3eef4237ee7035723f2d7c5854e95aa2ab97515fd548ddb1589db55e4785055f83be39299075a16148abf8683e3005665f2d7abf3f73f9b39290d92714998a6794801dd69c2284545285e90b781df6462ef701887530b21dc66d80961af83b0d75c15d42bbf0338f590fd0b66be2144bd3237f110324326eaee76ef6e6feff676ffa1113a8311c3d6ece7d4ad5b82e1051ca71b364c3568cc9091112386c2bc94368d944d4c466f2ef5e330dd6e7709cc61662d1af42c28bfc6dceefe12bb6ef729e95e62a0eda6f87d57d5fcb0dbdd87bb8421057cd7fbb77b994de0b367edc7aa91e6947feeee1b77abdd95800855a0dfd736cd78393835e4dffe93bdc781df886fecf57774c83db3ee7cf8717a924ed215be0b216ef799e0cf55650f29cc370db71d5f76303eec9c3d538c5d0f5e8f982a7c29c828a57c9798c4a4d7d825e10adfa9e0eef0c6468feefe53da9003ab57ffe07fcc70c297330ba1186394d284ea41a1e6464d419a97c327cfdea29412c3b028636904d24b3df8796e14a3a2273e0c2207b1d6374a29a59432c618db05ebf38aefdec88f9a8a42a171dc7a4bda6c6757d9fdd6c4e84fe4dd87d8b418639c73d2dea22d6fee5bd45bd1dca84de5b701428c5146982e3c89b076be3531e70a4e93f4113e3d57e201f17be80453ba54434ef59fd8b70f5cb1d7e6d6a51fde0cfb65ce0e4957ac93bda51b62e745c02eda421e0da1e47c602863e46f1fb8eb41c687ab23fe46eeea48baca6e3958614bc84c76aa9c1897b1883c077bf23df6e4a3d893b5853a28e3fa0af659d7575a8853d8cbff30ef6d4e5658eaf14215146ba12afda769a4730b63b0873fadea16c6e5c022b928afe47bd1ded474517d8b2a3f3641950febe90822dfb4e662d5b00de36690251ab0da8f7158d5b00dfbaef2fb8a8c51e5f79133d991df58a4785265073db3a4b0523fcf1b6b71ea93d9e1d487c3d4c33a9ce256932ad949953cf5c381956ee00f6c6a7bf91ed814cccb1712c406f940ac0afe348d7cf9436a7c3c173c13a623a809aafc60104172bda85236e99d22ec658dfa75508d26823c7a0ad4217f4aee2754f9f0a755dc6a9ad27f35de53f9301bc72d2c3d05f2682c56877ce923a8e93ecfa8fe162d1f05c2d6c82aaaecda4efab1871c0631d8b0bbe6614f76cb3aecc91df65ea874d0d6cc981c82f069177bf25fba06624f9686a0f2fb49fbc497dfadeca589ca2b4c2325ed1a4ba95bf6b6eeeb2c59117bab7133b0275fcb36c8e1d0c05867f30215f49ba9f2bf47710a56f95e0e4ec927717d853d99752dc49efcd975107bf284f51556f50f8bc5626225bf8338b5a9ead3c57a5bbf1a5a6896a5d95a7db02ccdf6c04ed54bd9631c576d7138e36417f49bdf030a7d28ad5fd1ee84fdae5887694ed8c38a75dc624f7e2605fd2ab520bf0eaaf26515f49b55be7c29492cc384b633d88a9df268ad2eedbaf3273d73c23d8a5b76ca9a7f383585819808bef0c354b054c873a542d65261f6ed9287531fb37a38f5b98ff4e1d4d747d2c9d17ef2898c52e1cf1406ba822ea74eeb59b765ddc47100a74a0fd9461e65599665fd5fd72c6866d9c3ecb3eca83a15fea1428ae591b1a00e9f2fc78c8f8d3ce29e8c057970142d9bd977f771fdf88759d079380ae4e14fa08eae87ab951fcc873d1e7e88e91cc9a3c95d0f70739e5651da499ea6c93a2ddb6612f4c37c6a14f6a0ff34cd13c8c3a5581df0a14f2ab606fec7f5f327153e73e73eb16e95574ffde4d12ce2d409e661253dfc8cfbdc0763b52a16613e58cf9be6cb2dc097612c0fd904eae0c2a923188eca14b54af2b46c0279482b5007fc37519e58d4a4d2d9c9a31eb3339966117b5b785a25839a069aa8d4acfbb028f06510d67d33ebac3319f452e567cfcccc2c5bf667533b6bc9035f5a813ca411d4c163a5c2ee301ff68eb6868b34823c6418ab630b5b035f4aa30a7f4615d4ffcb58af0a3356c6246bcd17a78c38d5c3fc24b36a0f7f1e712afb197984b57290fe93473d24a195df3bcf9342f2cad6609143328b0cc2ea80cf9c1cc2d640199471415f062d2adb81611b58689a0679eb66e6c85c12f443d5c9d0e173fd6085023b254b564b20f30d7c23d710429844728c2ee690c400a94020f67aa83affb7aa16ba8999b3ebc8f5bc5a2d14b95b684b0f35d1164e9dd61b4b6751a27ead056ed0d52ad872d5102bb4b235fe730594e10b06cd49a9c9e4cd23e88732d5ee866c8d7f0bb52a87a5f1f77642757f8d3179c56f5467c2aa77412c9cda2a5e04d50f6af988a840e425561550503fc8059311eef070cabf5d9c3aed7812f5834eaa0f55c7e16f62820e6995d734fede3494aae7a2f07fa65f9b09b49dd1b64077c3381a8333f22396ce561172e2a8a8bd198891a8f061aaf93b46977ac4d0b46d7ef940302b2c6931629adbd8830e85edb319323eb26464c9c822bda67dd6efdda576271f5bfd6bd8eadd8e2ffce7e7541c7e79e75e301b0f6774321d5c1a9c263dd6652f349094d841939d1da8e0ca125cb0cdd9bd5b317607444f44396a96cb0a52b297eb78f38f886d1a473f868342e349dd897f57349e76277e58e56fede7a0a02f5d13753dd459d8831f040dae7598a69535a15b321b77f2df1a3f5691385ec8c274c594202afbe7f0bc2a8a2a77a82aa8869580f0b0002654bad30f9727e8a9fe393db43139b05eec6dd53458f267ce077892c00b2780a2490f6b45e3a1d4f8053071558e46b784c6d378cd937005b20026aedabf0026aeda1d9425343a29fd52fc736870529a8b559bdb0cecd9b007677085aaf5e00ea70afd96b469dc565802224fd082dacf251c505cb06a7748d0fdaf5b9bc5e4c072c11765cfa120027af9b0a1499090201042f86a5513f58b6a41e1179b65b0772835a1f8053db65a2d085403048240104b8b080241a01a5d340d7914424643746832b443dfd0465be58ba37ac4a953bf026a8cc161f8f810b9b6e8d76b6f4e2ff4809a2a4c85df437bc3117161556fb12a08e44d2a7426b5bfa85f85232a08b151e6ddea8ceec0f8f30e4c0627c43a974fec7cfae19bbe7e5261d7722d68276169e067f5eb2157510f6d0d7c1c9e4103fa75ab5bada2f1f0db8855d5781853bf6ef5f7cede34511b310d7c58a36b2d760c7ddd1afaba15d3aeee83810f879e40bf6e56d011a8c0840aeb0c20aac1284ee2c62eb81971a9d1680b976ef08d4b409c61bf7c4aaad635769f076af3cbd51f0cfc276cc43615a029157e4701721e226a17bfac20d42e3ea27edde48b55f1503fec9d21232afc9e25885c0bfaf5d0107c085953a0c154bbe3d7d6c077223aeb56b9024f6d22f6e07f5ce3b724015fd590a93dd4aa1a73526a32fd7b5eb76874ddea1935a05a7f01f4858f0637025441ab58a155bd76516bab8071d45b6a0c81c2d20ddc8d6d5d02d23380e82cf558538cbf476e87726009a5f6b3528fd6e1428d5c8c0a4b3ff6bfb81bf483a31ab95861e986fdd8ed7a5e7b873dd82df6206b68ab7c81a5c25ac261bf3b243570edffe1b597d4f68d39fa16fd50d1e18fde2ff8e2d409b6a08e0a9af00e4c41d8f3b335f0fbd43dc4a958e1779626f2963761157ce26a2d9cda2a5db02afc36fa9ce53a15cae8dddae1d4077f2a7c58e448ebc06e52e1cf2c40e8f0676fbabfbb1fb6063e57f8700aa79430810f59ec4116e4610ffe0b3ef48bac0a3fb25a059df4ace0c756dc8952a114ab2f36893d3398013f803e82ec8dac39a0cd5718c0a0ce0c83f6861f3ebcc2a97df804d81af87c621f9cea0adf06f8413875a3c2ff01326115f41112c2a9adc245940ab554b85c2ae48fde28f8397038f511000671ea94e2d60c15ae950ab9637803e7e0d4c9042b8ebd81b50a196d3f75dfb4022a43ab0200b323e8fcd951c685c422f990a6b0caa687c464a82ea949dd8fd4438a5217be738a531ff422b238f57193d3dcdcc888fa3997ba91c984dd476ad5a5375841492d4ef1d4ec8853cc5c482c66c9bc8cd88347ecedcbb05d3c3172ad92a0ff302441bdb731711fac375ef317cddffcab5537bf34de0de7b9ab69b8de781cb6e118688f6cd8f8ccc6bb8d8fcf47a7c7f1f088536e63834279debfc9c4dd112cd530bfbbcf6117b926f4c3a2d47dd3e9e38fbfbef9d1cff4fde7d9645bd85ba34affc37e6a76d4d5a031a3fb4c2fd37defc9e83e0f15a3cb7c62bacf86494033a0de65af0c003a14fe9715d57d2c0aa7e00d6e2b89fb3ca8eed313f7ad95e73e3efad68a0d1a6607b940f11e87e1ab55cc3c5e0c4ad02f3b621ee8a2d014bbece8e326fbabf116006e573e30c110786ab4a005364db30f03125ef72686ffe6c2f01fdd176c1efbf5d77a93813b09f1f6a80a32385a799fb3dad21d11b023051d1e2c75ffe38fb7442f728483ea26e9ee7878310fc31d51b8c2cc5354c4a9d3101d38d126caf8691f3633146193cdc6c0c23b2f226e93a90f6fcae8db05fd3628898fe5d2926a320618b36930193d749bbbbb79316e3eca6b150f41a8cfce07c6f14a060a283f377bd9cb975363f8e285080aff232a0ac2362818803ad355e66e69fc913932fb47766f006b414a2e5b08b9bb7f6fe1eededdc61d68ee1ee72faf296851281b5e158a72499886872a502f6d51108c319cc561140ac53242deeef80298232d998f6188a828089c1886cd396d5c41a8aeeca93999c79cdd3d7fd99bf3677f4fd39c1deca67ceadd67a23d9f605be4a62ab05ed32c033090753f96a6bf3faebe593706d45ffeb7434578f801b2b6ca16a6d4fe21adca59f5ac3a4ca8d72fc9f3421e2fac4a92ac853c26abee7329763fe277334da8425b06d21a5fcec7e128a1b47e356798a6df25778a0feb16e1d82113185a0f4966c57ee1ea805ca3f7472cc6f81873d862bb3bb1b918ff7cf66214babfdf8500eababa7083ba6dc951d7d545a7d22c51c618e30fa2b020fe0c630140a2928ac05cdc0750d7d58527d497baae30ac34c32e30c182164840794161042618c8034b851e72aad0b245123b34d882cb166ae081ed2183c15a931ee7cb462aedd30d81173e3a7861d1d30323aaf0000d586083214461052bf0a4000c29fead28d2c41456149e8085a585a7987eae94d27fd0050c301da7262a432915b02c91456271052be850da052ba84c951c0c5552dd2a2e29ea47a1cc00084940c2105d24618515fcacf81f85c222830758698214a0d0a0084f5c8941fd4c0c797a6044142bb4c0e4f50fc42a28383822092944a1042ef8c7f46f031858e0678b1457086309415491c50b725084235eb005125842f8008b140844c10509b478a9c0083ac8224a9421a8c064052c7801152014094e4c38a009275842093818421255a860c21646208494524a29603efe1447909ad0993e9b18429e40081a26a8e28a294498011458780a200d8b2634a1e352d4efb5d0821cb55d5a5842d69a257091832368e1043d2862d5388c9deabac2e84295755d611ccd1bf8a854b0042030907022075380d2802d88a2f841124f68190285ca228a1ca86c3982082bb610644416cf62b148f099989ffedb000a24559ad0320250115c6042164f88f84901128ae0420411522c9607fc60092ac842062e2eac7041e5a75f8427b60a472062a2488a249a5471e2e708294d3401b40510b0f4e4e04089297494782541c78a19c4ced4b680051e37f104284d749c3cf1411195d5ee20082c28a83882111257acf8b7c4a88ae5ab2b8c292ada335b80bb40a89f8c8e23258e6a503d0c1254f8cd50fd7795850549e86942ca162656fe9453eca4faa338e5bf83532fd5dfc60141f6065688048450b52be99cca51631735da38827ef4a12b0b46a834aa3f34716ab759c56f9dad12418c1bc4bf83b14e8a11f8fdb25392b392bfa520b23bed6a36cd0ef933d511e4c386203f4026426c56cb16ed6bb978a71835838d0e14ff0eeeee6462e61d6c89ddc19c3333c78da61a5136ecb54692dc45d86bced1348d0477b0581a89599cfab6cb163169e7540ff293cc9ab5e64ac6afb79261b392f15f8d19646c1a89967e3f07ccc7bc36a4fecec29d1dffbc36fd98d2cb520fda49622d7d978080a04b972e433576473ccac1ca9da53217a4f4d2750f51c372f6c6bd1669950d4cd3df3ed8b381038fc4b3714170d89afe1b56c79459263bc8ca02876a7f7f6bdf0f593e3f7b8d29cbc77ce85a9adfac5a0972562188f19a73d833a77d89db3824b08b977a68a46f9246fa56890008192f045cc950c9e84e41627c8c4e095c8940c6c7f89c553faa39c80daba37f72386c8db63725ac8b9c0d5bd36d037b1d3b0f870e6850ef7c49b8fa3369776ee0514046272546b7a52031bad3aefabbd44352c8da9ae6536cd2ae2bfdd0497774f611c48686acbdd9da5880426d1c4c38d8eb2cec7cb0c7ff896098860b34fa3bb393a47d64f833c31e435485306633750c8704da4882d6a8ebc2821335d62d4152851c3fbc02856010e5e01574296dda7b85091a407168b66da651ce14d331313486b6c9b4850d7605dcc10a0ae2d407afa87c8581f415f0676e948353ba586db8a810540254c9ec4d12f686fefef73764fc500c380489d81a7e22b008085ba43eaaddb75da01c0cda1a6ef8a7de2c5b8b534df8a196161f5566ee85bc44508761e987d7207ecac54a847f074e1580e115508769b8053b4839ae366e403f1311e80787b4186159960cfbd47cc6985583f636ad8af1a55f2bf205e6b71352408506a87088a6428f63e8da80705543fbfcdbb4fba829497ce1bef764fc6743e6bf18d58cffb25a7ab82a1a5f2a3d8d199c0c27835b4e3ee44affc221698097b8e592b07fc376137bd0bd189d088088f142c0558c183f572d444a975363e4ac62fc6c1ab601fdca8d031aa3c7c6178ed5102b7bf7ecb9e7413813c01ac3e210167b081288e8e0f13b76dddd9d65bf599665998c09676bfcb353961539e2cf03a7369e04fc246152dd1d8baec7c14cd46fdb1b2ed62bdca0faebc0a902547fcd27b0375185f21d5be35e6de480fa0f69d59c1b58ff22fb45f50dc3d4aa97edfd5d1301102faf9562d7dc02125053240075863f1b185c5591a629e2382de793beaf3375b351b798ba65757bb8aa18bf6d1f83dba5217d0c4782e14893f4cd6d5fe2e6f7c675fc2dcde79ecf73766d92b942bfc8114fd235fea08453f3b90577f885dba669f662077f484c89b4dfd83372423a65339048ef836866a872a551f9718208e941e5d78155db05178bc51ac1ba8c822a3f2acb814525f56d91f30a2a2f1121b74d235292341287636b60eb57da2fabb49fbf714a3edc39c334d98e2f28c923751e7b9c7133f3833a7eb9124e4132d2d3b9fbd8cc3aec5b7345923135daccd5fc96cd2afba1f6cb55863d4e3787c4541b07ac7a00a63a56bb33e2b4e58300f34e02dda50bf74bec1b5bb9ecdc5aa0824c38bc1c54a0eb7a15d5cff41aaadf34e1f0729c82ccdf2a84592bed69abb2e79f1a6ccdd57c12c744089bd5fcd65c69118ad691709a94713cd4f8b9bbbb8c08a85b02b253a8db4139f92b59d70a04f34190a5dc9bfffdbb20d97b17815d651d4b8e34d0b65535bad082b5da1b1ac4a11f6a6dd29a33e2b4d4cfdce9477c7eee3ed819e13f75e7fd3935a7f6e9c7e7d4e6706023fdd388bf372cf1b78c43ee02ef6abbcb3c789779975b08389f5f6bcd5586ed66dd94dcf743ed561a49c2d565d4947b330fde8575ee4299b3dba6e95d02ed82aecb8ba2fa4d2f788884306b158d78d1f28275f28f8fbde44eded1b08a5dcb8651edf9afe263bf2dd32a621f39b92dba8a0f4b3460753b1ffacbea72adb98abf252002a8db4101417c1cf6eed285b74b975594400356b1dba659f6b6b9abdc605b9bbc49595e02b72ea6c60ed4fe41a31663cf6de376353921ae7570131081f0ea2708947efb21a56efb21fb3bb650247b94fd16d59c55ce8a3d761fd43826da538ec9f6dc0e3028923daa497ad70092869cdabb8ace958020a062afc94deb6f58fda7c64969d9dddd5e7ac93a1fb8627362327af747d78eb6ad9282fd6e15e209705f2190c562b1e0d27856fd03952727c5dddd7d484b0a129b6a2449d7f95ecd59fde84702bb544e7ec631c95e0829486c6a9236407ce64a35e464dcaebc6309888c2a716858fbb18c93e20363dd3de3cbec7c607f8c1d092bda72ca35081debe07a1108efef770e562d629c0f2cb1f7d681d6bdb1c7ee8ddda8f2b1caed33f6e9c7c23af906d8a57a27a10efeb81a81ff4988c9ae86af2cf706f26824904beddaa51fdeddd6f0c76f23b1ab61ab07b1da7a80eed009ac5446d25db854f88ca4bb7479e903c3ae078c75c0eef3973fbccf5f7e977050e2f18708620948a56fa8442c98ca9a5432442410000000026315000020140a068482f1804cd223dd0714000c7eac486a4a170985610e04318a216388210400001000011019a26d003f377ab5bb613e6773c7b7ad172515035068d34b4714ff6b36f4da4ef25b18a866ebec8c5ed5ae3710351334a1fa1a35d8d8b174c1cb07a3cddcf370caa0a4f18ca71e5e99be454e27a5bbd3b4d9de8b10fe01d9231f0e709c8260969bde5826edd42652b55b6554c5c67c4d7150b093502931c43656081818b8e4e561203835855b6ba3580ab49429c045171e75af299afe39e2b17855625631fe2efcfd492ec320efbd472ac454ac0d48a413ca6d17ac683863bc003292ece4136a8965134b23c12d9811a31c2595432145f489df68ed5a99f95d0190fd1c40642dfdc45792c4d0df4a89242691056950718080448f40d6cd63c0ea76833a10ac5466b185d102a1a4e7355839cb5ebea1d23bd392a94185e4cefe1e6720f9f29400cd831ec228dea517aaa5eaa7fd2751af49dde8252993126f0f9581b70a8d136fe121d0b971d95314e17ec59010fac9bb7099e2554d4da0ea396844a78753a088b156a13c35b0eccd07f5e52c5748f32479dc65943ed57b9e024b7540fa8ab3b360f07ad38f0b4be0d40889f2839aa56db96b347e05a1a45117722763bb0b7ee74d12c4ae40f590b045b8f6bde26caaf3b7f07379cd3891ed63cd382985e53184e3302c1af07ae6302ccb3d0162060a79104d50032e374709d3b2352aa940126a124d79d880190b85fad77cbe4de686e74b00e1da5deb53274074d1fa9f4eff58fe56dfe05ed1b5a4a9dc50998fa3b8bc46dca3da9ac6d4d5e4878a5ce0b424aedccf5ed6175071495bab00615c6cdcc45b2bc936a77e46aec17f6a6741608de59c18565aaddf8f9a98592c3e6b9420226b4510ed8b4a4a44a2c55822d87c10f7293f21a2a941620984b42b51d2a423d1325f18d98a3fb7ecfd3cf49b48e4b259d678e7efbc6f2b21d87ba3151f0b7b8d3b16a8fb5bd8a3de6f575b6f462d367ddb2d0d6d04dfa37731b791b020fce10a45e8bb872140ff05f1fe61eda5fdf7a7cab18fe24cfcadb5fd4971c8d79274cd9c019e3c3c79af8af682a2ea5bc6855f9267ffff6699908005ebd5250ce40f72aa81d73cf979c417a32fa676b7e582309174706aa7ba44be174219de7c7521a5fa8e07609ddd62350b69e245fcb8f7506f9c9f803b330f2be207b12576284b970715b935c7925b216a1fc0e73f6124472a400b158805e52178a5c404a1d65c916f563415684f90bf0fa7309fe49d7c9eba8e64cb5b9784778059d16543dd218e5fd94730d675b81bfe103fef107f1bf9ae58375e39248ecf4625eca9d31ecbc31dff20b894cbdf73e49911aebcb04e34fa05dd270cf385476397d9e7c91acb81c6fc04bfac104d93f05f0f053c667b47348c0523852215fd47c6913073ddc5efb8378a65e143b861c687e438d9cccb30a89f7072af4b2aa5199301ff23dba48c45f6ba662b9a912fbd49533e14de2da404e36389f052a431bf84983ee5c586e2c73345554642e1ca39a4d0220162bd7e23a0b0e6cf0b1f051b8b9c8c9c11da9a91742d3b660994fc5a78fc09fdf2354dc9570ca1f3a798d40b861bc03d4916845d32063d460b76ec4e5674535bb53b1631522eb46873e13419d20412c24cd02ea3b0be9780bb0dd7ad4a4146a9cf9bea45012b4c3d643de2613dab88ed250903698938a8acc6c28cd685da380aef9d36c0f5a0c1815936a268d3e41957e15804be307f9ab066f5d8ef7701c57a22b946c337bfc63cabd55d7e2f1fab31951d9d8aefaa2cc918f74e3519dfba80947184987f5f22e05321df6a8ba96ba6edbaed4521888cb65a410f893c97482b2ed783d89a103583856d1e6108849072e3036ef39f6e76fe4d3a4b6111fa7badec21f45caf9efc9fb8331219df48783a862be17c2466eba2d3679f8e1fa728e84812dcdeb1c4e0d023e7f32e1f0768fbabe1fc896184363d9f314006a945ff67042a23813cc6b53ffaaafeb0f26480e5458c774b0a493fc8f8ead0774708975ca0d9a4069fb21354fc8037cb3c8849c2fa42c7157b89286b2da1f412556e66475199af4e450d6169a8cd68e07a65ffdd4c2857be10f02df592be35e5275857609e02980a7cf32b77ef9dfee5e6ebc6e5c675d3edc675d3f5e6f5e675c3fdc6cd6eb8ff19b99fbff927c4c5f109072ff7473bdd16df1df5eb8de6a5ac0df4edb08ca5579d79dda5ffe12a1d1018cf8bbe172168e0a7bbed5e2abc6d54fe26a8529266ba3c2477e67a6045d4e2ab5ef98173209562a4e71023df1a619548448218499e589ed90975f1c6d5aa394337c2e32f214e547d71aeeef764a028aae6798cce850b3f839ccee4ec37a4be16eb11e22033e67587b863675e130318f1d1602a414f824075f8357b151b85f110723038cb02bd8b462c65d0621e7993f4635267c8ebc5068d3df1cbb41e9b848967f232ed17db6dec092ff3151bc2658e3dfad7841f8a1e56c5e60c4d19dc88b4054a00ece8b87ac0793ebc1000eec281cf8b27615aa01f25e3afd0b8f7ce03c7ef8dd00898ad28e62dcdb11b408e27de71f3321341d9a8deb9f2f2db0471ca006148ec19054ee8302e35d9378e072dfcfd44e840dc61fa2550b52af66a96937c8a8cc5fe737f43c1a2f6591404c2729e645b9487e70efa7ebd05be6287de044badf7666c4ed4feb51193f42bb9613f79e293a96b204aa383eb9f941bed3347eef13eb25af4434358111b3096092ed31eeb06334504a4edf4dbe4ba59e782fc56495355beb7c5d6d9440b7a6e9489855ecce444c882fbbde221ce00c275921c6f93d8ef43ae1d47815c49201edf2aa880b29edd166c1748b11354ac7b365c6a14749454893af162fa8b78e3ab25bbca0ad69dcf3c3ab34d3a48ae6b4bf76e97a6a982c4b8449ac10c405c6cf077dd54940365253560b7ee4c4b4475403c65d28c2c759c53d7097235521fe5f5a8e9429965a43a6f548f83ca70427f05c3a35bed4bf1b4a95da7265b2513beee10942f2ca95c8daa5c073e6030fcbb60f5cff4cb003d2df06405e2d2655def0b0a1a7243423c409eeeb5d22a0f4cd2714d87459b6095b510db21feb7b7b4715c9b615d43bfa65f89bf941b27c80b1f41b48611daa2b11bda36c5bf3224ed2a4ceb1a377d3129b3af4a492815c298e734fd96cd5c056a1ccdb93527c65e4d47f11ac058d550140ca90eb39517638fddaace56822f30768faae5237e1f55c3d08f3a6321bcb90f8a599caf72c97404484e985f8f28e3c813507c10d42ba427ab83cdb76e86856260ed86b23e5a13cfe74041450f6013d516cb0aea6afa82aae6d1ecd1cfaad36d8a85acf24419c50e63da3ec8ee934cc4dd000e177a4df31d369901ab7670dfbd494b27a16dc6c8e8d77f585cfbf0c45bc9c8dc86a4584bbc24c1385289310d0e0cad3efd8a1a862d8b06074838b6a9b52dab0827a2cb60646f16cb4323da13615342c9cbfc866646e513f53a5b4101d92eb63cc811e198a2b76b99d21454e32f02d8a06c56446e4f90783f0d72ad3ca1f7eeb8e6ccfc8361495f79a53e1077d316e7dd8758c5d582199002e666a8a5e5c64aec2e37384615abe9c52a8eb4e915455144c7949fa9b7a7e69d81b275aef28d32a69e4cd4bc11e196cbeec649eb0838cad87536708627419d5799538c0924276af4e10eb867dd6448fcece16ec464d78856b2b40a8b2cb5745685d2544bad13666b4230d19cb5ab9ce9bfabd2a3e7f6df82b02e744bd312434e1c26c68a79f5a8d9c56eeac28360985291f9b020d4a4f30fe1c1da0668eee333f91d4208996271b57e39e7ac239b24d92f61561ee335007e08b3ffb5be396983ea0ed3dfc4f24cf8d3cf8a8f4a662870e057ce0924d031c1ba98bdbbca5dbdb0478352e6478089d96adfb243cd5adb2af412ffa8e85a7cc60d3bf0ed0fed6ebb638efa405bb183551b35f27da1abf6d5864845270eb8c284e1510f8cd8a8212aa13780eca6db6a02a406ccb9c8b7322c2779828efa72238792930b88594e3f7b14bde0bb007708869dc115327065423b7671e35380a8476a70b0c4ac28dc9ae62469a98a29aa88658c1f1fb472ea88de83eee85c72b295165d8922a560e249541274f441cea02cb6b885664052e1022fe209759114609260e06bbe326c2e73e725dc281136b5cf0417abfb3451ae9d83dd52657041ad6e7f70efc4b97ca602623581181f991d06e3e3fa25803a78d12acef6caaf1607127900b7225dc81e81cbf566ab1d005735278e026e041f3d10613981aef008fc75bc277bf243cb94f7af030530431d817a0bf7132e252fb3b6c64c6b5ad53b29290a38096823f22a23961fa0289add9851277f335edb08e90ce950575c2178dff053d927456ddb8c2ef58e68148685b7c4a07a1e429f28a71df96ab8b68d294411dd33ff1137600ab2399b1a2b9a9901fbccaa97fe886263dd8b4ddc7115220416d52dae0c3c04f9388ecca5e76ad5c84d09f60cade4ef45443733f0bcc55e1cf9609b4ac71636e7afcd59e03c36a9e2fe72e2de3108d2f1b75e8556ccf2218a9739721968add49eade57e3ebc15328cd1332c0f0c0e3de997b853c3a6b134da6865fdc8867a7186017dd812a1cb9026f321e49c27f409b26906afb980c5d95ad2042394bb1db3a7a094b4ff2eab417998f6eb7ebbe7bae9369b7521b6c87cd9a666c302ba0e4deea8a6904a0fb8a9b8f920420871230a3a4eb5e4a9282855b3b15f7543117832439fc1e7aaa3166c2bc45db3877a3b80569c606268bf6327093146a0e035134298f03c8edd736412c2ddfea52cb484618163e0b47848662586d1f4e19a6d17da0a561a68af1cf04c62c8760cce06f41f09ea0496fc186c4512cb54d265344864f81c47d58c043438485835d31b1526da80b46a3bda075df8616580db1c5eb11d701de4f37e86a8f11eb472ce4ccedb8884f038e617ccc486b6b4b34d7f39670a0ec2a013ec0b99aee1c2d473e2b1922d5b8deeb2cb9b359ab4ffd1293e64702c53a927288d6ccf579387a48622df94ad0e4540b3c0a4b5007de1ddb3d64caa4bc2bd52c75c9f901a973a0a41850961e52616f6aa27e4cf08c205b20704fa84588c891be84226479e1ac6411715d6dac3c00855e37e8633963f0fc291608a95132c856caa8b9b5a6ec7d62a15ac6fb4fea54299475597523ae48917c093ca6ed24d70138c4e89a67e8df9bcc7b7998fcf8f6c32a4f1d5baeeb2ac984c382b70d3d1c0a154c5dc28d60c2adbc70a01881e7d67c980f2e336c783399058070b2209bd4afd09e929226780fd5baa2ef7ff464031b05824a8ac42e889e85d9e6212732f4c3f30d3d8701ab37ad231a655a1ae023728a303557d5e6e98b68bd7da95b7b15e9ffb6b4de2daade39c9abcbc619885ece1414cb595c3bb9132b41e142c87403adfa706f0daef98af834507c9c0628962ab657a01d6e07e5aa1365d2e248eb7cf47b0a5cb42cc2b3c32f91000102ed721b51bf1602e7cd3d5a4f6606c96b6f3aa1745aa0b1a8ec0285e46f0a01d91c846d82b83100475fa9ed12250e13641b51128e5a69e7e123fea07aeeadb0d1627483797071053b81628c8bb42d0f5bc20cba0c0df9e844854704a116c3714381c7478f64e1daf2838d8fe7fcbb629cbeb2c21c3e060d1d39baf60068327c9284575ec96a8401c4791cc48ca3df2c1a1b421645ace5c1f66139222dce0adad47cea0174ecc3a374aa3d1f2b5e3e8b48748d85e3a940d7352a805bd7c9591e549b6a6330f31d851531a3f2780ea1729b0bb145e920610369e00446da2a428912e1b8509118fb39029bde68cf02093b047533bdf8d114c2ccb956ea7a1b90b6d63684be84d37273b9f06e65553e8ef6db3d2bcdb4e2bfc126edbb54aba3015dbc3e4227b96648af98671ed6d286f375d6dce40cccd60d6b2c34f910ba84dd22aae682a23a4676b7e34f3f9e0f347301ff35be4b1808765246aee8d0193030570510c2d16471e8620985b52f82282c0422a2d603a3d387599e1c247324cd74b6ddc7ca1b1ecb890a1c857454728a2b0474d72a7bb5163fa5bce701076dda943d32e8bea413af0e13253de6aa3fe9ec13016f30b828bf3be7fbcffdf3b36ef11b2a2bf4c8f95fa36aec40f96d5ee2085578b8008530dc2dfe6fa573f21702dcb2686a64fef40160e8738c1810b2ad7c298d37eb0a3953985f0af10e08d9ae67041d50d800c38028a0e38c7b9aad57b24752a67db9f771b5a959570e2efc39c8f900a6290d66f26cab4d3bb540d069ddb31bbb7e96d10cadf7dfd9337b95f65e006f0dbc8f732293c510cb8530fcd93e15e81564ea390a80ac2876b75f24e3ffbc217dd7d05d35bdaa11bc619e7734082034c7c485d2d4041b9610eb221aed05182242cde059461c3c0b818d4a0c03c83bbf864ddfd745f9a937ed2936394287350b4ccac57c6601b65ecfdf0a81c70e6e285dbfa38b2c47654621f002f12c1b33a5d4e23b45da467eeb6578f86f6840cda781b221c3f18b97ee9a2dcfef2a9c7fe16ede06004d067436990090c2585ececc6ee86964e02dec5de68eb3c64cbd016e25746bc18c491188c1d2c7fa4115bb05d1c8285ca51bf7090fe68ac50090f3a140ae70d88afd2d085b8649d146923f1facaa537badbed807b80d662ba08b0b728dd9f2e1193419b1a45bc6bcbd2418c07ae1b037c0b225487c7db855d19d05c4dcbd3537765cba5410df7b2fd08e030a4ac17b207bbd4cb9dfd6baf0e3d31db8918784055bbc3bf077316ea1dbabf74c831e5f7518556550d3e372ac08b28d3082ac26f5b145face5a8253143239e8c214cee939005d1eaf77063aa72b7e1bb6f656eefa5ab54d451f953ed61f788461d8cd50279074d341d1691668feb7ca4858e9d6c907e4e2401c4dc29077416014ac9f1345935b8b59beea17ea7d924471b9efd8c03971ae0d9bd40c663029954e9068f3974208b688caac6b1e90db97312e01d8d8cb97073cce05fcf85ac5fcbe831613a58299f07d9869d42bb3c84f0f448a1d9ea9850a457d590353d8244d423ea95e07fb494530d5ffd538fa03b85484d939dc0d59238cbc4726f7139d3ab699bd6a0aa99ba728aa1226a4235e6c09f038e7d3d3d28ca16ce021a2fbfd85c90e66281bcd2124808e92d5f1f9d46baa3577d93e58ebda38671baa9a212651f8bfc72b61bfc85b80da9f4d6aed850fbe6512c3b1740236bac56463a497df357cace294ae31493ccf5915e9d6313048da035c809e8285a23b711052196a82eca830585de3fc564e83cc0a965dc1b25cc0432e1db47f6d89c0969505151d5bfdfaf4cf02382dec9ea91e409b6411a26b5940a1bafc3da0c14b974a5ae1ba534a5afd108e6341f8f4f86bbabd07300007223fefeef8543fbc207342018e957b88802d6ea17b398ac4cb5a05133f6eab839537f6b0c89133f3a114aecab88bb776e409612419f09dea656c16b5f4125a3cca32a2c0938707e3663d6b8b2c0a982598d9b4c8b30ac2fcf5a71f858c0f121e871a09f8b2b259ddb6219cee464432e93b2143d405bbb5f30dabfb20260b2bad0be4cd45edd8979dc1905b57f50652ccb16ebf50ce68ccacd66f35816138e06406d5a45cfd67d1ff2251c29fb378f11410dcfa5d39886f3d6d2e13838bbbec5936ad912c562945812d4a02926e50fe89ccc29001572fdd5a0bc87c1213e829ac54a8bd5e39294e71e696941c1678698f5c9eb4bbd0c5b3dd834b54bd629eba7d45808c983b1f6556570f3d2ddde0860306105f3ef18b52632fce3f7d8511cd4d129180758890113d29c1f46e3910a1b7fffc8478a7e15a0c8a86510861614af5a86c66240533f6e2f5e79a997bbc05bb70fe5c69bc5c0dbb1242b2018f684a596e6928496b605db8962f91ad2748132247db5855f27989e869b4781c37df347cef335cd61ce99393e9c78dbde19e55099cd48251574931e615d6af68fb1830e742b6141c7347d0fe89f03866d4665cec8e188333df6a8168510f52a929de4180b4dbe97d2302d4dc733d3d057a0d44200eaa8562a464d429005cb804e00d4154df4a7e7572cd8c56c6f35b860416d80f4b164945f3551ee171b0e922ee3dd3746e77432c27457e49c9baf2c463c4eaa5fc1b2e55e84142773acf6cceb70becd25377050d1901fe5dc4f82777651ca2671a0994457372a88617f47e896365fb7d0d2630ef70d250fd8ad269a1d1b8d615d45b0e7947953867fbb8f82093ecc07501ae06f0699fd383e57d23427fda748868d46831683a375a0f2d522b6bb988dd8e5693d693882cad11b7fe74397496c79b7cfacce01232020fa2b13ff0b4017aebb24b37d2cae2ba2c8680ad70684ccc01923369eb6c08b2ccf3050a85baee3b5c7657c13bcbe4df0720766037f093ea6f3a745f7031b3367d24ac6f694e34c533c47838623335f49ad5a5f7b85e1980283841adb9be0a4b930354214391e796c051b3523d11987dbf4ddcc3aab83bc818191c76278c5e9468d01a3e9c3e3d08526d9c53b39e550b80abe04bc2193989f124ca73b3e4d373c7672e2df8d45a78c85608d61c02f81bfde5afab9fb845ddfb173d0e7c7719f65b89e3864524ed14e54887da35e192aa967a49e8712947449ccd465497a1e3f8e5aa4a56122385703260e781dc0e123be0688fcd2b4f655523941ab242aad40c461dc386c160a8ccf39ecc017c52d19ed38d1772b5c70d74e2a53232b020d75c6a0bdcec0d2a7e97114ff66f49aa358b8ab63a4eb451d5230351e20ebcfe4c6470b9825caff1e82b2d7fed3771902c1fbeb6dc2840f31e93b7bb44c18ad3244d152521210510b6e3d507eabfcc8f1169b1c503631c8d29d95fcff95221dc492a06a5d8f55decefef653e219e8d2d9c655507fe0de978befb3b694ecd660db1927c5460fcfea93eab27cbcbee0521ccf339dacac74f9323b149e9e50eba2bbd4e6d6f21c54e2fb489236e3266a0b0db1f27171b70148cf8404324384b17013f43c45f32690e92d3f36d24a32aadf180d936ce5e22a2f52ee46923b44be6ef6fa2e25bc257dc63d0b5ea5d6b7f54ca1e233f12d5a6c3dfac15e865f0aaa33e5d4b3cd44b62b3621c592e312da4c3884468c861b7e9ef5cf32d613a888320b8d506ebd336f404b7532da2bf93ecef13402278d1ab0c3cc38e2faf85a00508c675fc1dda1d407af9c9c9f0cbd45db155167fddc2a4fc702f7dc45e1205759e50691d2bb31c9c6ee900b63ae15f43c32c99c3d7843606f724374933b22405aa81700fabec8d034a6453f305f68eecb3883a579d90febc625194b9a84034fb72a95386aaa662e6b2b1e6353d5e3416ce3ca67e7463845179c43f633199ac4404ccef2ad050cfc2b1c575b368e14d928a0759f34664f3d078e56b17a027f3a62e19cfca5bdc81e5eb0cd7f73aca6a40adc8c45fd6d3ccbdf78362ca2f9e8e2f07e39b571dadfe9b08a959def576d7d7036b8421d45ddf888e6a0cc384bc57126488d1ec6779d9469f4494e60d4467c2e12223a7108ec564e2925b9e8f5c91119c4715a42035b4291474eed855cb294d69f232029db6b03b1a1751d34b038dbf934eb81d46c078fcb474516e9e04e72c4979478a2fb8697715fb18114e0e0320c3bc5e79835ebee5fb3468706b1d93d96fa2a3373ac7e5e28182740483bf5918405222e13641475310e63ac60295206a11fa141d1014101a4fbd0565e8845760fe424294b458a66670dc144aceae853a3009b12770926346606fa01cfd1422cd536bd7a34849d6d331d7370dd0adc365ad720063013bbf393dbc3abab4986280821944fd81837a65850e83eeae9c9e52c5fe403eafebc83775203a14a3d0d351cd0f0b40f6a9bc8340168dec8e6aa8b588885f687a1758a2a894ee7f7e5125d522cbb5f0389764815f3da7467e0e88f3c03ec8d2e15bb01ff53e5fbc22fb4211fc0dbc0472aaa8cee97bafc190b33b3cd1ed1bb281cf6c19c94617c5f496752448656e1abf3e37c3946a25845c2efdc8efe6df563c24334103132586c1aa7627fd95707308f33a693e7849698804bc99b6b0874b5e8ef94414c3320406021455faed68f05376b6290dd288fd50227966070afad681cfbe241ac50155ba00279adfe2a6d842f14c6fe54115efdcd503a264cccfc7dc9095ae909fdbbff6bfb881679b9e3080c4aecffbfcc043d7c2d731a652f60737a209361500c02e0099f2e9befd39d5eabba98626baa854beca1d51cdde819368b67195d12a0c3e7f0bb7df218d6ec85ef0757e764b87d00674148dda870d6e5cbc4d1476b30890f74687b7f64378da481c37183347c4143b0daa1aa4c6cbe35a98d9d61175204c73603e6814dc6cd00953b0f10ce6a5b3cbbba2e703c9fa0879297458793d95ca1575e03ff265f9a9b569383dc5e94df14ba7204f34aa86e51c00df341bc3a8eb57df6b135f16b01bac7da6ca265af0e8ef8e53d2f69dd9cc1b84d0a1337a8cf0901768be4d5a23a82deff1a7f68866d9280d7df16417bfca2f30ce5b117c81c7a2b2cf789ef2372465e31a9524fa965c0b0a2da0c325d0f69720d25bd49038ab1cee418a6e2d4b8a129f9dae8d07e64adaf9cea2485f477f03d72609bb99b0ec600af2a1e0a11946d18910f495872d1fbe0e3090271c03a9e74095da90234ba249616044c3d1038eaa3183a8aa9a8c84d3b673c7d840476830e244d1b19e6fdbd6c05bcf336eafa2128072b3d97dd345061b144c4bbcdafb0b16db59a2bfab1b847ea40d183c1bd7730787bc1f91db15e7b758a966992baa6837608eed4519ba45a1b611564788fce29e0f88d5c11a26746c6ee0a3e3327efd8a31774adafed080d4a49f3b0164903009f97ab9e532770ad0cef7beffcb607216eea8026fb497d6a48e4c0d8706282abeacd1a58bd876d39e5ad8b54e78a5f28881af27653c3539fd06f6d0d66463bd557441440469332b0272793e782eff237c73575fab3a030bfa284526d95d89c1b9c041ff0b68113ba713e191e2a40aaed97bfe44420a1b0954480d8fd5db81aa31e003afc0c292984250ed599b2df105124eb7afef43045f617c544424b07f241d151509992b6f19c09479a5c92185165bc595bc5a2e02b72bdec2eaa386667911b5a54d2c1f9e75886ecda5cc1a5af1ff3203c863f98a20f342da55da62b01ebdc48c93d3cc5b72171df8fcb62b4bcdd533d90d493b07ad2428261984a075387f702adea3ff1446183ca1bd706d870f82d6fdb22c8ef905a7cf0d34ff57570eb262cfa2e6255c331b4028c215f1eef3de545e069eca52d5a3725b57091296aae4b1ffc87987b28b2e591d4717015e6319c4182193e4269ec515993a83aba7c21b935190e56dcbe33aec6d6b501384c590fd7524464c370043c2becd636f574dc18d26ae1c27909b428be71190859d94ba77d6d64151825280178286b0fefe7f6a5cd8af505d0ba29c05bea2556acb0fde62878136fbd99d26e290816ca8afa03477d6be4b0eb4112c5bb7dfdcf962828bee15ebce9ad9bd001771241604289db16074947eaa6201a308eeacb2bbb75360e4ce80c32a2d0de4028c00d3a9ac8af175a42bf564b87579c1cb37f065751b9e53e067a70683c34e02bb34b95736acf6b31605654b86810ee64512a751d395159f52bf1905d156b3ab709f68b94b976cdc737eb6d96d47b816e91230cc51ac78f7de223c70364cc2214a043d4fb9349d26e94309540078b1f1472bbae0e84893f523c31440cda29c352a067983868b1cc4935c0981a7674a89c48fd3daf4524b300b9956e54e9359ca7016a9f6c29b1fedbc99ede995b41617240a0c9ab53a72b7996533f3584d3e2c6a0011346173ec65ec01b23578c0c358c0fc7af9173b081689c5930ee4b510967c602eaa2fbc28f56e66a41854363cad7b2ae0984cfec4fbeb4e96e5d559956ffa7fb02cc8991dc870b08bb8606ad9455950e9406c6b592f9d210950fe58fdb8ac101cff9f60f0b60fdcdebbb473122ef8730552e1479f462dad68a993a7dd1981b21634bbcbe9294d41493c87ffe26c1344572f38ff84900666250402bbe0fc1e86ef30d48521463e973a42085da45dd18ed0c3d59a56446cfe06fb8d63941d79a62f20715800baacf3fb40c769d0a7f0c290dff1764538a7e37f65a996939fba1d841ba9b90abfcc65e757b9488d38f884421da665881021f1c4365f1291e56ef5ec76eeab0d204c54835f82642a13fde36fbb80ebecfe4c8eebb56b13906ed4dd22829b48a0f530b6824a262be77b9171bd08d8c7154f5c0e90fa4691d8fa696a7835020c1841c5d549679d3473b4f07d3774390e8fca31f8c8f30c524a5eff708ec4e0f53b3ac9da378119046f14693918ff3499cbea0e0ffa0d6dcc21857c905c558d5039e1d0505fc174d2faeed90a3d1a24a80c6b50919e7f5af72841c03bd895ea3ec4c84fe85075c307e239f915c38262b98d49612ac3aa4ed0f464480ad3789251b2131012e1bea8efce99b60d8bae984ecd3f6696a61a0541d275d643390998aca62a9789c04de27e5644fe52182ca337614e3961df5ede92c65cbf8a5c6c0cf4045c229310dbfe9ef8a3a42fa34abc7a606e7e69466f8486615ef139d4e257caf13eaf634f6188bd04c037736ea6a7bf783463a23f40802f43bde08c80528aa6422f4b869541100a3ad677c41d28185c86cc4c3b509dc01dd1581a1f09635c547ff7b3bf792cefe3d3104040fea7302438492345dde3ec9cb916a01891323a9c34f5b38ceabe47c1919752dc444711de5670f702142570227e161541c4d1a900e32fc6b09b4e1cf4082e676647ecf0404c70c575bb90384078b340a4f4ae76c5c1ba1088bd518c4fc14d8c32e0cbc65c0a2cee3fc6edd5ccf2228f93a93cd622082c2cd4ee614776d45c67021e28ee6ec77e8c437f85d923ec6375a8d3d1500eaa5d465d08b9eee0ce59b9191dee77e77c37695a57a546d13b9ccf42bc8fc5bbcd2f70952921c20694411858e0225ea94d7d86d48e046833cd401b72ce94a4415233dba5b983e06a662b69f21624abc613d80398ac2177667f56489b48fb45e93c95636dc8c465aab680f040ab0c773e10e05cb129703c1000b5fc0dfc4f32ba4be3d9c738a9d6a4086c0706ffc4d1ec08bb5f9fa7df24a84a3924857410f2cd3e9186b42a0010fc0545b644de56e9ba2f209d9b6f95b8eacddebc8e2dafc10acec466e455d186e27443134b6e27f591f096de8bf365756a7eb12743c33ef03531a8e950b450dbd170524385d6d2ac9469357be0fce6a3401f647c3dbe8e8343f13000f3b624ed16f704855cf53804dc2af0fe7210abd5319f1f6558d5ff40a4323601c95ad2661046d2ec327f660e6b69aedff825b90b6ab01f5354e03d653ebea6270688e20095c6492fb5ebb6268851e95f27e167b77b19797ddaca6518d7283ad3e5eaab8ca880cedc37f667688085d4a29c1d791e002d983b3c31a87ef5229d3083ded95ead402b78f716989e315619b641f11203eb49b1a451b00701383e382e080c84d2c675be7eaf48452879f88d7516ca04baf1d5fa54d610f9798cc7928de56bfaf705389d6ce4438a16b7848ebb9f6ab418369c51f72f5bc16e926628666dc63148df66686deaa9d45aa2f36e54f14538ce105ab35ac04c44567be15387643ff0fdb6cae0ce9c3a85ec15cbe485e0b4e96cb12de946be7319c3527b8cecc58fc1a92e687ca66005e87e91fa5622e978abf8f508316a6ca220445901048167d8e7bedf98347600101d1c120506002028eb1750ab4c2be3473d6e4d0aae7c2cef6f8577a200bb1e6554b26de6e965c2594d76ed3167b341c0c49b48946902a4d808b82e1a36af0594909891cec57a4486581e37c04c89daa2181de7104f1c8308604ddd1e029b747f9b7af0f228b8690cfc0c9b68c5a34fa7c4d078dd5577bdd7bf443d9cca7823fc1635b5c0fae65b621276768c030c35d9d073613591d5a7916ecf5af7cdc0897fb68432d9e93f25ed5318b86a6a0da8e4126a42a011be885f0bf5df2071412bfecef2b8cbdfa90bb7e2ae8702e85bfff1e732bf541dd2cde0f5e39f498b65be3b83933cd624465b722a4e52e3038d4efe310be15d4735ed0570be421de546880fff9d502ea49ddb98dec4eafee9c93fb1bfc77461fdc35fb034092401cf74a125015b6f09e52eed0138c4ecd49ee64380515da49957512dad8ee044eef060b7b1debc48358e596e49f3f82fb38179e4d3fb25cd99af884caab2f6764613ef18030df31784ceab1bb40e9382f4aa696f334f908a370ddc14b70d316e9ae93f82b81b2e66a5742bca027acc94c7f1290aaea9130b9ee841123dcfcf6abbe94fc70621c8af7e09ad8b3cd3258f3621e1622fbd99c661a8431754dd49f7dd1bcc8a40c81628f2c0df6e23fb897841dbc7b82c2ab877739ad4e43f7466a987c20c4a4bf0e286fd1a34c02194c46280ef30eace9cbc62dbb1c21be78599d20979a5d8a4ecb31b5e8125031da50d8b3e645fa062639bd1ba340b2e22fcf06ba4bb2c58424ded7fd7c35068966bc859fe48fbf1c2e770cb89de049fc393e913a487a0c228c6c66f564f60d4c248247a51912a1b023ee9e92d43b3900ace1e1ae30201bdc4f59a8bbe512220a65cab16b6e952e0f98c7750bec33a11b96bb3eab5b03b4e03f338748eb3482e665a6648a6349291d068c522be61da3689a75749551c5c9e82aca10e62b8f05bc3e2882d4a30edb55d8f1b3ffa6f2d10d26f52b9a38e590aaa0115e0992e3406e09270f03a3093b26d5a9feada1e7aabeeccf8fb128be603fd7313c5e9754fd074a6e533d6033b62625ab2cbe7f47642cc719654b3b96f7aef73402b1241399e6f87b63dd6fdad57aa28caa1fc35dc11d0f6abf552a2a6a12b9739d226eb8029cf4a6b57114104a492ad170fa75e807f24c175ecd20a31a3205e51248fbbf7907e1887f013634fc21fb051d6036cf8f6dc220ed39e8d3056beed5f593fa00357b9c17327d14c480683390b57888e0aef319fa56805642d9c58965676340629f1729becedb473059650264b1bf2d6e595e7eda059f595a7edef8792c9e5210ab5322f509ecc5037e759e8242496f119a56d6d7a6b28985d7c10e23dbbbf127227460fc439cd8e9c30874c80c2a1951c1a15259f12644173088300c6b80d8b840cf6bee1f2e0f98414674ee7f323538b29a5f10736aa39743978479579f40c5ef5832fa211e315415578162ec1cfcfc0ae524fbe754e3c15c56adcd7e1d1dcd0cef8b9b7f1278f56762068242138372c5edd1f883f9ec903a12333966a5c71f6293623f7a63648e5e3d7924569765104b58374ad2c2654158b1e94c3ee075fe40b20c52c3da7450fa7a3bbd2830652121f56299af10a5739b87328886e26d810334f30481695bdfdd04650eb668628b8a487a6f045d423a90ad6fbd112059bc812c9791f9c4cdc9d68cbb791b19af03cdb7756b30e9a0d7041b58e091507df2eb039052d947011eab0a72046e9c55bc1a45f708633ce5b5cac508e2018c9a512fd48891f21888094e6ad3ab2bc8cb4ae8c804e0ce9ffcd5004872d3045cce3680e2f676912562a57f6260778ff8100ed544454f6b672e27f5aa0505ba5a648c61c13eb16579c76fa986fd82e6cd63cdfa1606b17d2004f643ae1b0fe0b13f3eac65dfe906376bb02b7e11c17438ca458b01733af6915ee5b8690fcaff7c0af759dd167b599dfc6cf9aabbca6cdcace2a94deebbdfca5c11e917e64cf961cc8c29168c410eca9f3f24fe23cacf51cf6c8317f69c2601b90ca761b92f3e2c063f5df41f9390af587acb014f8a19714c8de40dc0b234c71b2c5a5b8382c0cd9cdd1fc6e1690d48cfbbd17d60e0f325ae3feab4f9b7ac016bad58e96687a308263be84c924c03d663617ef8b2f88ce62381935dbf9a5b275a3ccebc298080083cff471d819e23713fe105c30c203e9ff99ae052fdac47aa6ec924e5a53831a5fdce3251ee85824284e0b1f45676e5cca603a45405eb98fc64f4bf8003d736e869ccd99c66fb4f4b4ef1387e0a145d81eeb6acd91d7ef274b60470a04a32d43fe53f98c2475149ebb0a425a3e87d8a16d664e5073abd6ba43d7748f54757d592b8c4f857b51f9d692a5a1b4620da0d95a48ee1b2626b75cacdb17a34264f91aecdaf6ea5e1a2a381a92af3546c204fac86a40a2f01f606264f4067a902c4261e1af98007c2c46e3148784b0bcd7ec6176197d64b76e104d7236eb577cb88ff4a3f6530b4bd8583a5d100cd02db88c64b6f5a2a456284cd022cfcd2981e8c889eb54464ef1650c1b0ea803974e05d727bc01723ec65d5dbd2c64195bc2f02acfb62165ef97ebcca9295ff6a31bfb96ed8b9c43e70b0e29d3925d43d6d07c1d058398c570da909dd23be25bb2c02c1b9a7f1885a5d0f7bb13317c76a772e698369948411a38a4a8161d0dd8be8eefdb6314702ff4ca8ef02da3500cf1b399dd291d086f008708614a1a5dde41ed364206e13f15fb00e54e5e4fdd7580e5bb09b507c542b09e2f46a82d558e6c640df3164e51d9aac1864cc9b982d6c8057ae2d6fcc31ff22533ccbb95a2df33566e071a306158dc01efd77ca1ff1a7b661af5d15330f2ed55efb73d8008efe6dbea3c03743cf21e8f5a6b0828900370badcd8df6e51610c725378646c5fc300e886b22104343ea1de191b41a05796c850e3b59c32983dd6feabbff874253292c6e464e00442ee1586b0b9452002650b7e147c55ea8aa6ca6129ef227f7b6d7c13442e7b01f48d98c47870328d9f961d9bf49911861d935cb18ce5246b04e0f3058d33e46a9f28d6e156dd62b5c633440c8221d71a5c12bf5b6104acea94e69955e2119ddf65b9fc2ad3d5a0524ec4fd765ec97cb9003135ce31d674d239b0a16a59b8021dd91aa215589618ed0b2e3fe62c57f42d1ed600707b5b764abf009daf8ed9d54d458a4b7d91f51a8961229a4ac01d6cecc9d9c1e0125eec0f2ccd9bc400e3a6640a1683e8596760ae73bcd9469bcef912c2109f0675eca2438a8313e7d4c06e087d1f8a07d8f50fdb963142c75e43d59801921701004f08b3ebee574a90c92066232a037b9fdd097e325f300b6f1d6793961180ca73dc58d9d5654cee84d62027f215736c2462d8e8694ac8039633419c563e7e0eddff8c591c5bec7f5e34d809d010301a55c65272a1d50418c7ed0edd1886e49b62e8e0363bbc8fecbc987fd5bbe31d1805251d88514cdfbf7d1a113504bf64133bbd776d5af1fc3e7785ba58d4334fa0033e20b4ac56974ea8b35bb11b8de12a3f2af067742f0774b2cc99645e6e3ff048887514dae88af3aac78f2257a5c627134c40a14aa10f42c8183d01075a6e60ab94012e58a7164ef0d714ad96b27d0395a7d9df22af6c02461e475fb1c03aca0e515831ce2164b70877ea4f359036289e1c257963aa827eeafd8f1a184f3dbec109f7728a9f03fba01846a9d7121c5bf6957a00a3c95e2e3effc5cc96c214450a383cc00eebde608a37f6e52c53802b6820b1208622bb870204332df8cb425c0230bd3faa6792f514462c0554c96b39301f7bc884c07d0b2b0ded407a6dc6829202e89904385e4a6c2d0bf3550ddf5007e5d4a18311882362ac5792cbf12b0ebc6aa7a358f5b18a72cf9821d7f804ca206bc804a0ae734bc86573c67e1df8b8e5f119274766ce6e6ef295af6706876065bf6b7535256444c58445f70e80901587d9b333a6f9dbf1440173af9e1632565ad9bea741eff3896e64f17d73427b24bcdecc50b80fe31ba345c84fbc7b3d82722a46070faec51879c1e5fd0b854eea3e09e2c0bdb009a06b7d5188c9aa1f904185bb3bf1fe192b7eef5ef7791c7c081d986b0304e3f9d3fd173af2d3bc06736aa03f50ba787f0d497509a0cd7a16629853dc84a8c852cb0c9b1cd72112120e5ac57f339af7448fdfd003dd04ecbefb19fddf55778b869d191581182c84da051f55169196193cd91a6dfa028b2e6411c7309141222c2d61947e5c5230cd69df1391f3312bac67045c1adfa0caa9022f5cab051d5302e36541083110d2abd78e7e1abb6222e1d488dd89a20e75a1112c001c4fc9f8747afa88516463aa48bfbe606a219dc30cef0af2f8d90fbed0344806558cba64997210f779e9e45f2b080c3499416fbb3eac1a978318ed9f4fd34c6fc764a689177105047697acf52d93e8472a3190c6798901b36dadae0864eed48165ce57765d61272031a229d6605be903e38b3ab044730ca7f0bf28c182cb4d892ecfeba20ee72dd13d7bcefcf92a053ca91ffaf301a486ad92fb396cbdebfb3920864116a41a1d9dd27f5ebb53e4dc6a6fb4d656a6f4678b7197132046141040add4b2a135c027da490c22ce2ef5fef5d569ab94275f00b9be8a1055fd0055a19870788f1f37e61e9bc24c8b4f1852ec1a2c3e622a73ac3aa7fe57c0d2ae1bf372047d1dde0b6e46069d71113e34824b9bfd6d7206d706b0df6b389a17441954b45665bad78ec6e24a5d222daa406158ee49db4f3d964f8d7d908a132a805b65b5439f62f2a679c764b7260c2eaecec3a35019a0ad9fa4b35be9dd113fbd9e3858ea8f243c038bf283856a14642f6cba12abd3b9c7df3843e148522d2a5906b93e035ffadf996bdf6c648c45c84aafbada85302d3053b4c9ad653a57490ae578358f6bbea9901146417586e9a11e57cf050a4d574fe8087db4b98035aa6e4c84c416f19832c0737f5578829dfc64c38ce32768adb9c81cc655ac1d12e19d0d696da098f8cc2d10c66a7fb8b7004e71f91376f2f35230988784b8e911eba83ee469078ba79d1cd8097e472ecc0d5f233bb558e6dcb17509010f71c225cab060d5991004bad2014e0ff4eacae4337dc325acb80e63e9c5963b7ad6e52012ef07748b21b7b5be9eb79dc97fd8820c848c8ded194317ba556b9b58e364ef82b6986629f56d4ff65aae25e90e94271f0825996302c5cf2833cb825895c97431e5f417a483b8e7f3a61c3fabec64f8b0688be30a1588d2a337a16eca94e4228e6c5e608586cf6dd13345b408b2650a62073ea6e3038a6e0aece2bf6800513041f4073de9d53888969ae66142d5dfb7e2f0ad8a99607f2deb46db4a1dce01b311608e7562587d1adb9a1e9fcb326025410c629e0aa2148a5863d6a9c76b353c67c43ecb158ff0efaf596570614edba03f98e9f55c31daf8a7f4d8200defa06055e14337a8db6af16049fdd257aba5f76c54556489ad91466f800751c79af635c37aefd3e665d57c830805428f0ecf2fdb2caaaf55e2d8ccb7f96219c2fd5306d931771d8e206a761300e50a937782372767f7edff86c5adea81bb92b8128cd17c23313bca0dc00db8bae083496e215a0de67582f6f20ceb75dac2bb4afd98f2a6cf9dd780eebcd6fcb66203bacfc293944cf93aa72441c23df722f07c07161bebe940464f8a8fbe6f9e3cea2cc834b7c30236d3bd6db17479b14bf63b8442aba68ac1e2573b79536e6155aedfb17b82417273558261b97f9bbaa2a80ea96273f1e8df597d91df824ace3452377c5b96a48bc8b434e838d2d95ec218a35799e81833c067de69ac2836a0f57cb37dc07396ae0bebd0abbb1072bd0fb0a2c30b2d9155b304754b175cd6d94cb4b44758ebaa38dc8aaa5957a9dd012aabf7620fc425d05a30979ef357253b1227b89569b685eac691d45aea740f30701b341b51869572430f1a1c70df06150df65eacc14a1df08d446bd51ba730056b143b086031a500a2a0129211b4f45fc11b311d37b0d9e273fb6b3dbd0f0cea5d13b3a67e5856a51af7835de2fa32904366fad847229dd4af2a72d3ec12cef9e301d8ea34b18c6531867e4127fcacfe419240b427c662b6fbbf0a7b969abd2fe6484fd6da591b8e03cbe21dfae0809d6de5b0418966ea510503b8f3f3599050b6dd7e11924f429dc69b2d1f82d9305a7401e716fbfd53f8d51b0b7fd5f3ec53eb0fe8b76062ed9260a740626f8ccd3cbeb38d646dee589075d039ef7208f83e3373bcec38b05820c05fff0b681ef98a384bfb1b933198f2df981e8445729247cfe186dfc7c756683914e5df31296b162623309c2f86db977e1acb8904f8ef9e3f3665826c1c2ddb5c3411f8424d040afc982042b8845f734d2a7c0bebf0f0da25684e54bcaf4062271a080c3a9b81f601378c9ab74a3a22d8b902256efa8c48c3ad3dfdb295c5fbecf286eab755cb8be7f5205ec61f17bebf8464f817713224da978b44f8dcb9a7cf720626b2a47aa3360b91d712477ed3c61220e6029802a904ef16cba696206f455781a71bb73f0127bbd002670c9ccf1f132ce0a32be28fec58d7418c1f3c5b4b0681c3b73fca26077a88939f4960ee07721f1859e33f9b8b2191022883e724494588741e2fb858c1c823b34c20c2b1b96c609cb396d4ef7891870ac572c5d5c60e60f6709bd613e3809764109305f01adae46105e533602452572f8690f09e8ae449ceaa82386c90d62c22c5236a31aa3589c6ac38f864238ab0bee3a86dfd674db6281557a9e034975d3da35976d6a3a42cd87494821d9dd5ca0cec2753d1a45f6f2dbae438fd077500bd3268389c57793af96d834854b5f02124dca720def1c66d285c63d316ac4bd482bc492147c60720ca0de0c1f5bc4608679e1226a1150a717a45c66468b04714ef17f88ad968169a43c80d6c7cfb8f50dde222eb957e7ddfe5ab517e8d17bc5aa3426097ab67ad2b6cb2d5a56e70494673a465868277ba7d2d3f5654d180fbb6cf727fdadb85260e3383e183ab0db365dd8b661a2189df0a9f93c0fba98640f5699859212933ede180d2056bf8fde789aa1317020d220b5236fb351112c838d25f3bbc054a197e76e4addd2b0edaaa3ba1eae32a39aab52c1a40d04f85e281a69e5f24502deabc3862b004d6ef22c6ef0e97bc0b7d3abccec9f40517bcc06cce9e5e83ca14229120ba21b1e4672f6a60b53543adb6013fd60c89de7bf59622350b5e054260ba5eaf461269d222dbcdbb3b3b1ed46269929396bae63a0ed98db64a35791f5a307c308b242182d1f881335e7470f24145446a9d71065a02759047d439e714783dba45693f8f9de0e490b834bf861c68d9fea284f4cb9c523efe3f9393591e25ec9cfec12f8f37bc8e42dc3664678941ad2768c73927711dea2f42af9256617bd527f339c68c3f95bef715b442c3eef239e07525cc8e68d2590e6d4386b111b42ac60507b9c4048633a390c89ddd42feb4995b8bcc71d27acd4d4452d071d5f1a7327f51b86b8b0a747f1b46faf80789b81f4c323f67256603040095a34d6477f47a17098d4661829be1be804e3d69e95fd3a0a3fdc4457c76de7908b73dfcbd24cb5cf69041be019449a573b5d6a972b1dfaf351e4c20224e70323cde8986d509413cec84b017c7f3de1349a6b78da62b5389060f37d5aa4165bd11c7f6238de1c0c08deb6c760e108897a9e5a53f281e8863d1c4758dc0a15f3e3e927cafb6f5bdcafa920bb86924c119c44e1a482208278e222140bac402068280953cef01e60838b1da8898112ff941a4969c496309ccb300fcdc7ed72457a131f67886587344b15e2c0b8753faf395b432ac1bc82af3a2e0967c250532f0858fb4f6bba4479952b1795a2164a78fa9e3aec4203aa5131281faec613b4489109bfb9d1a6ae516af4f11953d65f3b1bc15f2d66a46ed473caa07e321e697b06483957a0f1aad5dee791b005fc57580cb4b4c0872f597d7d7b5ebe53b9c34983eacd97a18f83cfc5697f8f9d01fc280f2af023efbb1a795135a1fac6d66ae10285bfe7efa17d4911fa650b088dc6e393340ec6cbf9879649c27f59733638e4c1d260fdf808ec9762254e6cb8b66e2694933db23a8052f11526c75083f212ce0b63831f5ffd93acb91f9716d042706c4d6ce06350b72b341cfe54fb30721a97e5a2e203edbeaddc482a634efade976873fe04b93679877fa4e17e1ea812930c4a755365466517cd649e53f9c7dc99406f9687c1620636971419c85cc37539c80823c9c4472e50a7c5e95ec1bd725c02bc768d31154bd70da3b2e7447ae8b438c6387d772904551fb9ec94b8b4ff52c3d9403a6421f946e10197a016be6e401c531497ad9ac3317465d6dc5f676bdecf28a67b05380d5205f05dfcf1ea6bd031f704d3819bb332e8a57cf1d74d66c82470db235f66f96483ee3b6f80b4e6ec1709f26c59aebb28d54b757a3b5e7d4b4ac6f53f596c6d9f0deb1f2ef343311bbeaed4320f22837114d58880d05b250203abbda419731584f001d30e633aa6f8395c04e1597162a0c3ea572e58c5b423eac970b180fa25b770b9380c120bb37e7968ad5da8fb6a58bbe1ec88f368a628a8cee426274f5a20134d933d785697cb3b58859573addaaf3e0adbfe6d182c2aa56d8e52d0270c2b44813560bf3739ee468ebe74e1e8d910885dcc48504a661506fd7744fc0091f8f26d08893dc85b0fc8917e273f129350bc268ac897f1792c2752112c64d3f2c18b4e3fb38782c3354aa0b81689dd087d742895d23c98aa26727e61125f764f4b78d78a6a82c543ed5423d88e395c2ae7e279794d67a6159c0faa5017b0c4bc03d231d53cdfc3abe089dee5c4209fdcb93acd3c802bcda62170d47156adce77cdaec5b6801e07adfe56153b80325d3a37df6fef3bc623423daa63640d08dd15a8b7a2a4f4650951702fcb5307980ef1fa87d53d874931b0d4e7198907b9c0cd1fdf87a79111376184e88554b08143c091235197971cdce96407d2749fc271d286c752fa1981c2871cc049990f6eec5c51a657fcf4ee7862f578562df757d674f80edfa86a826d080405b1ee0246e60e978241a6db45ed6f59a90b82843820294e269e2ea0e6066345992c4a607641c1fb48eabf528b2cd2ed3897fe3be18992734cdf1a1b6a0497443bb6a7688f70e0b3220c5d0c73569e889976c70e0cfdd9111ab1829919d9b8a840e6435dcd7274238cb8689abdba6a0b6abde895655020f6f4d28f7edded0ceedb8d77c64b098026a210ab6a5261ee66b6d73a4369f8001ffcc67b25c6760fbd5a8bb3c4ad8f3f50b00a85ff61a8ec6e96ed2ca5aa537f9b115af98f82f46c15780f44a57409c69884bf8ddc48625c4376874eecaf928426e751d125a4db14af2737e227c98ba713f69909b2b46ff00cdd9c58e647d9b9e1762da520607e8b39baf9b707584ee277c55e51b8ea0e9cb039f2badc3b1acb230d6da22f8525f3054418711c66c69fcae312bc3808f098c17ed489c9861702ecbc2f9b9f4e48bea2914c8c158d1804b30df29af34522307832faf004ec720a0abcb5199a18ecb816e6fc5a14f5090a541d264cf9dfa83c31ead138ca5615b8b72d94b321feedefa56e8c9b4baa64c358a974f9af29134fd304b798243ceb3477b032f2c638f73260c9685623c57ac0b33c450821c78b6be2f9917ef5779b137c3a4e06c28f287d7645cce97c8891825c1d442cfc38af9b9b6e452c90a71f27b55388ff34a4f56b5c5c1cd69fbf19e7947e1aace7b60378e375ee65ddd702f986d9c24c19d1ad712026fe021b3e98b7254c64634364626b2ec625082138c9517441677e0568326eba12b939c04e473641e49c49eb2ecd72bc0cbfbe8aa3a11d91e2c32db1ab2d90dd16b001f8b4d9711d3f684124c6d9bc2a9dd885536613d295d11bc51ac7b2005a4d299a6952a903c06235b2f97dd6c4cb364d41e43bc3b445b4a2afd81b86b222729418a62806ee42af7b877b67f9a1b17ce61f9bc907f2be311b7d74f70f300b4ad76f08480d3b6aca0b48ca68a57a3930f54f438fd046ea82fbda6c6cc76a87ae52a03f006b2b75b0b6f4a832e53d496455c3a42dfa667a8d380a72e8a451812f4964b21b1a67afc228554a8488757a01523d59048a5e4a8b1ee4ef13a45aa4c98dc39ed77642bf094d45c41e83919ef5b28eb06e99e8cf76066173d4b6cf7fe5662d18a8afe4c1c26dea11e79857135d25878abc0a02ec408a62eda2d7a6f861226c9a99b3daaefb4fa3cd07b9199609fb27c0d1af0810bb335c28dda91425542db993dffb7e127725c5002cd793f33197fb82800a076178913b54359a44cf5328e149cde8c1576b83544eaabf341deb45f394da6230e0862a1c7c6c10bdc66358771b5a144dd2db223b595f8cc32bc79225034fc05dbaec1302904c7291091ea791793e7adb41ee4b22564198445745750b274751cfa052e18f550c0b4a60645c6cc6eb748a4836e3e75153787496ff230f6b5fc9abcca6a19ca4288c1185fd1f27988a21f8d1784b0766304d2da89be3781df4b8807fd735387a4299674a0c2e6e005fb953b5ff8b1f6715fe9c71404a246f1cb0f06e96c8897f271a17556c7ba0896568590e2aa41638317bedd969febc50112bfdff8744e43475d6974bdc6118a322f69fdd07493254c9fcb47dc2cf87d89a7cbb65e2d2399dab7667174d7fb21e427b39614e2963155f18b22ebd8ae875c2dcbd8e864b903c13a8d7d9e1fbe7b46df27820759b844fd5bf47cc3a5fe53d3d48a2cb344217916ece7e6c00cb847ed9918a887c5373da3ca224341025ebc9437b903de8bd84d977493f3125774bb0fc9f6fc94e7a4af7397f97d60356babb2939032bef769694d79c291356d658ce5441a67ea118ccafba69a4c8e100d730389aacf46a6a49023bcdd9aef4aecf81a3a0b9144cbe9cf3cedf8d8b4040c3f6dae8e44a38c7acf6e0582b709f90fe38186b3d82ff56b800867b1fc4102bce2ad5ffb856725b82f08a7974f2ac14e52f75422834f1c589c6177166ac552fea5623afd8587d512973a993551454aee3e0ca01b7d9a2ddf44b0a6b563ae335946e1c485a2f149787a4c6e410586f57b1952f53c75be5d87123a0a733d3ae465651a508f172ed5a1768c1cdf1470cd7f1b61fc76c67daff94c3dd33a5de821f08b6d128fc6e72ce24821ea945366e05f0cef469c064ae33bf48912f1b03ff9ea20a5e7d0f2adfdd48d5de69812a8a921ac48f7ff90b832819e2c472c82aa584360633c32185fe92257eed0161b2f8ac8d836c7153f6a51957760b35a1d6d665b58e35a1006dcb37450e0a6bc425ddd4cdb281d5254f991c0a193ae1c1824191b8fc29133cf0f180cc62b2bfee3718f875f909792f7c51c2a228945b5413e15d5515e721576889f942c97657382c29e6bf201584929f4fbd60cb1dedebdc87952e8b516c069a701a15e0bbfed1af9517de5e85ddce3281d07dc20f2a0a65411ca6d54412d5763e3f8443e889a7aa49a831bbfc9c0e84fb1f04feec07c50031c2fe91e2fb02ce28261508e48fcd42027aa03d27da747b3de5f95f95ec1439262726c9fb27a676d70e0ecdb2472570b1e70a40f853569be95cc57bab0d7e57d7a6904c749dd7955cb55d35113aa481be3b98effc3d662f7a595dcbe57cc00cd7abb613a31829756462e2a971b99e8283556ad0469a981590da86f1e14e0c7fef61ea00ddaad8441bcd631e9f68c3ad1e420d59d24d184a3c5e0d1bc3f230a4d24fd4430a2907aebcf28322a0cd9cb368e53a3420f121362dfc4843b190fa026f56f9f006978e6913fe3afa1ee2641ecfd52cb0f1f5f1fa68517d9a4567e0958255c28787f6eb294cc01dde4a82c7c3ddd2934ebde822a2cb0c1d0343a7e4cdbc638a9345a78f9380a96af9ac1131c6d3544e4e734cd33d4e08fe77fbc32638b88b7a61359c79462b131b4a53dc3be738de25aef21dce548b2b462125d6e6e167c409bcfadb1dd3e8fd937017be40b0e2bd58312b13438d9aa92e10148bb1b496aa41d818446d48a688b4fb65947977f6fcb0d6a113a053bbb363a85da5dc6f5f91d54db2892d977f8c2c2e404ed0d403c8d607a6035e915164a5b5ef8bd462a04f24073f528649bab27510f61af5669bd98ac7a15b3d706e751f217e4f4582f9cac9e42a310c3688226076f761f5fbf102f2c9dbe30b573340401dc9edcdd2b3a9459a00021959d441cd1f59b53b2ee7bd62e8382351bbe8b5e3f95e9e282bebe9c48f34a24fe377ca46f559c754e46746ae5a2ec32367eaacf56ea9360b92b31a647542b99da86c3c8a6065c24e5f9d1cac23d41b8810bd2a2ec55f4a52ac3cbe8de1d94916d392497c31c0767828883f938c090f18db508274a4e80d206f0aba97f07f6aaa59b062bfb7c7f5f0f9d381ceb4b9e54103be29ffb4efcd43d6a076e91e7ae3bb79e2b1bc512ae0e54648327e0e3f47d347f5113aec681dfc71800d151773c3aed31c03e45d7f9a7917f144531fb726acec0fa583849fa8d7c36a39a7deb0c8c150884985f402e50b7b384555610150b7afbdda9d5a46c19e6e79ec9e14c835e9685bca997141c73f701cce9d94f4bccd5cfa7e1f25a0411ac7311b08a6e10ab633782e8fc2799debb0454b5adc5dd77ad97aabd3eff8cb373ccf8032ba461549508d74f7062aad45ac7e2012a07bc91ce41a253bfe2463de0e5ea2ef32186121aa3c65fea6c667c55304f776c621c0d99189ab5bd761deaaa021c011a6681084af1e61ffa6420b2a3ba73675505e7428138d47706aaa4b630e1fcde009daea0a84895a12bc1123826f9d69d0f3670778a0320039bc1ba93a43658d41139fd7f296b863e6a6ddf6f5ab75bfe707f1d97eea9fae733268e17e8f703400169994590c6f2da7d55b7a446c4a59e50c62dfac0670f261a87374b894b405cb3623370e0530aaae36982f31f57abf2c2f5de9f0fe8c5d2a226aba51ff0d13108b4f8c9d421ba9030d66aec6d88b0226974e219ccdf3617568483af6fb37485170b6e3977841048aa70bf493fd4a17eab2a20c7d41f4960e91a5af8d09ca7da9a34b62bf95fccb07353915d15cdbb238f53d6dc1b61b6c0ac853ce216c172183d971ebd9e90f19c7ed23efd3e642e95f8488bb55c8d4ec472bff9a8fa8accb8cc5a586990efb70f0b3445113479dd6fd517aa15e36de2204ff7c181ac898bd7129c17017d91cd8f8c57d01cb4ae8995f7043474a9e4fc1062d7f4e8d0d95cadc1a2f4f44999c02d962e8357981ced71fe64968fe72486563b6e1d070aa5f523abca9f9f99ac43fcafaa452c72684492e40ba4e8a2cb3abc21013b23508c34565318e4aada1cf6a645ae0906edf030b6b4936460942c603f5da29ca358473e7d08d0d53c1b5f059559cfae579bc3ada96ccf0fd56cb7a0b921e408d3afdecdd7cf36ea83ab805ede9c4cb1bd30ada118e2828899050829e0fa9afd306d53f0b6b42edb20014e80183d73f9f7d06c69950d436f8cb1be43a12a95a7b1abb94090d790875e92232cb213b516b36f3d9d4a7cbe67d55568fd095c70db0a52b2e0e18dff623b24735d002dad91ad0368e0f6f1b3d4fa3b2384056301a34e6406359f9d408e308c5b70a75db5f395b479ca2b001a2a5104a5f89c922cd4d4482539ddf20d589023bb0f07c70bd3405521b4a86b12036283a768defc7ec32b08a7e63c09cf4316cb6c9e242c56a207c422f4c97cbe0edbc2d3be4c7d3951567afad7bce6a7b8b1f85468f97d63e6fa833944dd5d8d31fd0c5ffe6af822ac9245432b75deeb6296058345f3a8ee36fe42aaef01edd48c541099e3182e76d1f19df1003f14eb997708dc25a42f46fa300ae10edbf73b45f748f002400f93de9fef9fe92c03b48e9e8bb41e92c868328c78eeb53e92908dd85596f04da1383a7b3e6194763d55187e3220780a7a20fd501b31e5cd32052925640135cde8219955aff51ea08c5973acba08816c681569be9120c785e0ed54b9659a071a036ea6b21ef874512193d0141863673402613c2b0ea3c6161312f0007c08161607bd97bc404ddc522b42abdc1a8af10abce2eaa93465d1ca1adaeaeb3535e269beec6977ae59c76d0dd5d5668c92444c02b1f48dc356ae6ac0c9891f597710e8940217ddda28f1d8c815af094c48194d96dec3f397a460e1358919defcbe6b6011f7e04670e96e5928a9e08d2aa04a8852c9ee8faf5dfa748b9b063d7013ed7c8c911b3d8f8da1f3a62a87b4dcb4da545ef17931d8beea0bfc86dcc99160aa56ecd047b54248b2f00ad85d38d7f693afee7fbfa2128d018f99937dce7094db93f6bf0eaafb4d736bb8cbf5b7fb84efb93150127f16a30b353a6a9c3d9273ed790d90ca5cbbea36d80555c025cfa488e25eba5ae7d5c566d8540dcad41c80be280a3def80daccb8be3958f4e144d8a52290017864e4d2fbbeadb30200f88fda044e0c7438d8fde36cc56dab54264ce91140c7cb7ca2835e28748aebdabff0f0c4ff606b69fec88aa00b5dfdc10be5c37db87e3ffe8c858207429d37d1650772c9e7acb15bdc46af3353219b0919c792334a74a3ad9fbfa646340a8961037ab4f5ad1879aedf735e6d092c6b778021529a342acf125a44047eb094a8066fc2803844994b947123c1d4548a7804a9a642a1b99636574b67531884f4068d3f3e84d795368fb21399462c01f79ed4c89f24c58755c8423fd8b821a96257874ce559d8bf92e8f00309587029872e9a0ab108f846a386c245dcd1892b5c3dfd9a86ff085478f350d12b4f9f11b0bcca23d26af3c53ffafc6120f653cc441d675ca61e6384a09a7b75b347b24409633e3bce09011330ca3e3e0a04728a926910a36e0ea91c9b7340c50e2347270ddc2a8da6b816507f0657d532678004a8fc4b13abb08d28a85596f293346d9d8a42a5a70f662fc9cb07a6703bdb242fa139c2d861a9575a8f6207a10f8eee1d6a0d832fcb39f65461e7e734be83f1795bad95d21646a99a9fc5f0bb32d672780c27fdd0bcdd9404d343a7526291ce4238dd835790efd1429da4bf874964572044e403430fa9161dba21f70f703e2f635fe0c77c846b517fd2203039cdcbbf8ad13c6f3af43af3a8c92fc144ad1b4f8bf6a71c1ce9a238d256277e93aac5a4c0521a150bbb01a873c8907479f28d820a51639650d9c6cec2d0885d7724955b670a346725a04e2fb3b33082e55c3191ed6f823abfe671ee28921d919c6a1eb5b11aa0ce8346d739ff81fdf452ae2d74dedecc6bd93c5d0b45f94d5cd1eb40b15ea3a2524197f3ebd198520ab466c97b0231fe8629a8c273399e17e7a23a7bf9b76c281555653a07f986c72bfde7636d4616592a953a79afd01f01286a30f83049e489b395903b0fec128f9f3a074d986f9a4764350f0bcd0e54c6a3cf8b29778b775fa95b50f0af0034e1ca4ed93c4d3206e7541a01c134c62291125625a940b12a8e308e2fab3962764a80735cfc823d0d08aab4728565565d1fc6a205fcdd42228492f1c3a6f17cb0f6b5f9ca0674a8c592f11fc6a98a249a52c1e8f548cc28fbb73bb6324c895f862b2565a60b31ca61cd461f52b523193e27c598477e46d043e87012314e7234649958b8d3ea9fae87ec089af840f1304e061b65736c7d8809075585dad0d3699a7904aa1a3a8cc510ef7d5331ab1aba16bbd2d94d080887f8ce7d5d42f4816d70ed637486f5d00e654ffe14d52c3081021a8cfedc416ba75d7d6b2bc7111729e2409f4a03602f510ad65b33ebea2e98a54988e063a851ae3f3c0ff43b8136206132793b4a3ae32ad5b60358ea4fd3fe03e4746a945183085c6127e3c0b7ae06fc6c0b4bda553f12c9538a0f9f0fb86925a00000393c60b2c3b410cd4532ec09b069c89a819f95ae60af26ec66cb619c502b69188ff2c7ac883445008b909a77b81f97c20e5027487020e1100223817a1ffc7ce380412c0151956c1884e72bf1dba0202a6b25e2f2ee1c876f2f0296bf6a8f790fda128c9ce581e5401caecb39b0605606d6680cb2c05b33e8069569f9150d0ec2f9defae1fd30af0dd01e4ca75f829c81d6a29080cc9667985b76bfbc799a2fb65ce1a43382a9a512bc0c4185d562977ded362468a8be1e9a3fcefaa1f6f33374fecf3ea3e4150b0dc108e5335ad6e317f426e4055dee4b0414ba9e6df0f73f270e3701fbe2031cdf2927723840115c8a08aa8f7072f303bd4bc6554edbb2cedbc12036ce2866200434117ae83a45e59526342d1ead13981147d1b91dea622ef50c8d1f378b005fc06d5ee210b61f92c6267e9cf46efc41b55d37b800f2a619c2c2bc255052399650e2a5a8b1f2818fef77d1ade04b052d45295a6b561d92455efc1981e3260cc568f25a496a164013bf83ab9ba1b17df021668be876f9b61a194cdb92a731269fff309ee834e8563d5ebcde36b8f801bc300c2c1140cbdc12fc28e978889f12dc25299acbd37b8fca11effa843e0b72cf0b0cd474e678844ac4a41aa39b4d6a0d4f43a0bc05c4034134e14ac7444bbd301677a2b10837d4e24cd467058d47aa21cfec762bdb72794a0a2bc0143b90596fb4a0ef9e67afccb35bec6c54f25aaf8d4edf6d2d1e73f3cc18eddc61cfc89ba29bcd1f5aaaaae0952e79f042a58ad68628d515d2a6ed0e9b10e5a42736b3172dad43e4659fcdffe275750c9be96506a066e6d1d839c255446991457248e3597dda864b4f00176959fc0f3a7c6f1bcc672f2b0ccd4a5ccd46ecdb3b9a63a05a85beff49e8f88e98d3890349f92207d338e1337b34472e09a0b098cb43c9c9a034882dd34d893a364f65131a07a2f5da74f592834db75a9b3066030ec30f5f28ce8bf08af571ff4c47e8af12c6196c85b0975f88a3f089143e835b7a1879ec3443460d62b2b60915b88ba0791c6475388f47c398d026d3ab1ee8dce226203e9fb13820fec0fcb9b34f82e16e60a8efc192e0c381a1417306bce978eb8d05e958931c9aa533e8d0116f32e0cbe982b0e6fff77e19ed904fd2ecede624924e8bff0545de88763d4decadb6b07dd6115e9d402b999da3ce19a66317c02215914d15bd016d5cc13e674c27a7d0e2221cbbbccb0092031b42d52749212c297ecf6c4ee983f48ec0756a318aa168b934838d3c3324a0d2498ba3206a7cf8fe2dd13a9a5c29cff5c905caa9469760c80739a75f67f28cd02299e57f46b8623484cb00cbf6859a4298e5117f1cc41a61d1943199dbdeeeef45040870d5d3aa48763433f2370b0cd2a52c4bcf9440c55f3492e2e65f3914b0b380a655cdcd48d49608c64d981a47de3933385535bff5952d9376b4287d3ead35b307663c79d71bb4c007e68fa298c080ae047064b2f636c189278a4bb97784de29675ad1d8042baa85a23f810b601dab69161cf493108bcf7f6a1f67c397db571cdd169caec777dcdda34abfabf6ea70beacb82593c7f680a58f8a09e988f845616d2a7ea2a15bb166d04c1d32ded1ddc3be2562f6c252a7e49de157a2482a4ae92715ea1461a3a0159a990fcb344c37ff81bb0998100252ed801d8b98b067d53d11801145e7a6300e104ebe01405445f37ffe7856b66ce4ca3ef3838e0d6439df1a4e86fe767fd16fdceaa0d20c74fe91f3bcbfe7078fb3cbc7a67e61b6ebc8044cbe1a72fe2f7015aa71bc464cc078b630038a555d985dd73c2ad80e4ca6bd372829564690c857f14f3671d7f4737d7ff5367ec68198a1569f563859f5c60b7443980cc1eca7e4a0419a6ac875bfc598fb890cedf31f430ceb416d344b7eb007ce3eb9c8483faa824c7313b84269850ce88471b05838889064ca57c31ac480678f38f3d94c14718995aed836bbb72986dad40dfe4a65a24f2da03fc25042a6157a95a30d815271df1a9248c74b1cddde5f6e2a8e6ba65edffe82edb4892c5790a2d1d4de854167a7c90fa12714c2f6e57e904a07904ec884081213bc56c66429fcb8f0660d4baf7a451d822a6ced5476bdbdbb61142c82664ef2df70e5c0acb0a680aa44ffa19defe76eeb3fb7cd3cc96d0e74806897e589f475bd55a0e5b49cdfda846f490ca54327d6693e964f2ccd8fc99407307fcdc79d6a51e587b2f0af583e092252c968c138aa9a43de5db8ef2713f7db7441a556b62cd1699b3c3c3e289f9c9c0cf8f063210f343b2dcb5d7dc6f246b4ddb4d1876bf1dc65dfb4c4bebbad6b49efd997ebfd2533ab47387d96e4f43ae3b636283b4414afaf6c990be5dfbec35d35fdc4d18a6530fb3e75ef1ebbe8461a4dfbfb4f697d52c69c3dcc8eb42a6c8403991647cf6299ff6d3c71de5db6efabc97beeea34f74d2177a0cc5560aa9a5b4565219625c99819f1f0dc4fc34bd01249555faa6efe354865da67b718a9e647fffb2bfa7bfda4918b65d3b8cbbb5daed8772ed3bddf4dd8f3e12d54894462f5c6bb3c3eeed33fcd27ec23052ab6297e95dabb3528652ae7b9209d7d488ec4b58dbba90e53c91e88b2dda212d405ba347b38436cbd60c3404a1826290cc913b4a3eee337cde515fe8299fe9324a285f8a9e4895862fb65264a0f0f8087991a0eb22080a1a81b5f7a2503f088a404890b5f7a2503f08364a173af71a138a0a78b225148e3bd1c87daca9924028b3e2ca7cc7a23964b1240e6d3343160d59b8b39ee4b8d039cf74ef332d1b02b283cc7d1b727517322513e9d3208c865d349443287353dcce618ca57470efbec3fbe931e442691f289b18f787931a55ca956a94777fa1bc8b13e58d5f29efde694ff94ccbce16946b32a77be7beee9c0e1947f94bc651304cc71ed65d068ed3e217ca5330eca461da9dfbabe3ba9317fa4ab8a686f49ad125cd0dce4e689433495f6c09098a693d1283a7eba2eb64b4b16449cc85424ae1b6a3bed3657cde51bed2492926ce76295f6c914cae26ae26381abfcc0cfcfc6820b6b5f7a2502c6bea80f47bbbf79a93c52e53d7e1549f8ba6eddd5fdbbbf73b0cd3e14aef7e3acc2bbdf3be9d708aceacab190f8943dba474a4fcf457ca4f18a6d387999ef23a1d05c34a3fe118327dde4b5fca9aeea55ea5772fa5ec7778377d47f7d2a7c384e3f44a385aef761f8de109f974fd1095b1d8be96acb985bc6ca150e157dc0cdfe9a8cfbb8c0fe5a42fe5a510377a7767f8620bf5c5968c2fb648251cb345e6ecc470cc98a99a583af9f991959be2ce4cc167e0e74703ac19ca40cccf9c2d76ce392de5b6a3fcf49a947bdc86537d199f69e9b8489f993bbdfbebd47da615aeae1637660ec498e832f37c8fe862f366a79d38b4f1a7a35e8ee8d29fa7400c65202dba0615dcd3bd7337dd3ee52a1db61da58461a5a7749d0cda60eb64f8e55d0686a5600fc350f009cbe86497b1291ddcb7bf381c67865fa6973009d7d4dcd7885ee39d7bcde8db4bd36efbbad0c813dd98fb0394f568c86b8484db970fa515794e94cf3fe5d38ef2653f7ddb475fe9a42f65ea2ef26228555b285f6c9dbed81a7db165127db1d5c5cc16a984c7496318895df49d8c19dcf0ae061257240e3102c547d9f203b78a2bb3f10f6cc59597178016ae7c877e48d5f3105ba45b207ddaa7407888ad9a1aeddb6bb297de3855b18bf498ede767ccb46444bf9f8f3ab4dbbf2c86e9347e6537615809cb88601b96d191317dbbf6995608e6a923633ae9abd922c2291da56f4ff545b7f6a2dbcf6f2f7dbbd9e7bbd297ea974ebae84be9289df454e35709c716e9a2df7b114e354eed4891020f4ee06447e9262ca3f312bd84613a2f7bd161dab7ef109d034a20e1890b68685a220ccb6e2c7d243cfa745ca2675f4ad3b62f25c23535a1d774afd9aebdc67b0df71afbecb1b5512153356f3fee9345640ecd4d6cd9d8ca7e4cd5fca4204933b33922ba947cb8a23126ad953597559248b0649784e879a29914095aafb821cbdec8228d43959c9a9996906575958078c3ccf017a03daedce0862c1edd129b7559837af2451799c562b1589946a94a5c913ff97451e5345d4e1f0e47e8014fab93dee9935538a20a39ad6e7a13264f70c3049ed6e91fac04318b214a5a76dac027a8a5332f714a0753e9a6cf64d267f2fd4c1e7d268b3e93439fc9de6772f799cc7d266f9fc9f63359fb4cce3e93eb676025c88410d43abd0434c2a0a48582f279b1c13b1285bc8edbec923caf61f19dbea6b1a2a06058095a51a54b5d81e8ec0c51d5f79ec3b3c4a851176eec398305573ec7c7160c4fcc22c9933c9fa387667122cf4320bac4aca5663847573c4fb36f2f8e9117aeec9f79d3459530fee40cdbd0d4e8a4224a33d1a45f77c9bd7bd7494f7bd7c54945b4a3d402cf3ad194807dbdf172afe86691cda2edf6bbdb760f257a2612fde2f08a3ec2212a775ff82cbf98c3d71cb877b7a11ba125fab65f9fbd5a955dc3ae2de85a8c03bf3498612737ac91b3d7a89fcc3294837db5e1fd667827d477950f9c1bee8752da2c6fb3c84c4a8baff59e33cfc69ca2077308e62035d71f2f097349ccfdb03f06c495c9720016b0c1d9ad7883767b613030080c0b813568823c4f6337bc12e8e6d44bbbbdc5b058869686532e6d66a69544fbe254e510cab2932909d3030d59b68087c7933c234b18b178354b2a521b53ce796f63db51074dc3b012b4aad0c5709e74b13b635629cd689665d9a946c4cd88c0a17999aa3ee5d9999167a785fc08d260cd3020ec3c519329f6a6c5d120fd15375ce5db60f78c46c5aee675b16b25907a5601c306701557faddb11a675927c4aca43102945393b29364c9901b213e3f82c0accacab31764d5b07142d59a932787489aec5dcfc62c91d56ca12d1db4b59a2a6a69dcd16c6896987b88c151e4c5460e14ea07c1d5aa8bce15f3c1751dd73dc41479b19143ce6957d765a74a4619623e9a25b4425e2e986649913435437a88e9e1e57ac1bc62ae18ce1671b55a1d86c68ae58ae1e1a3c60b1874151b66a3507395a3596068ac58ae181e3e6abc445a83c62a7a34583456ab154d0b2abda71936d21ce3ca6b344b7871a81c7c71bd7ab061754f36a8fcde19570554a974028971a3125dfaa5db565cd7719dc3c5b259d1a811dba28cb83d344b687bd878c111f323082c87cb7a396c34d8e2613b4fd6060e1b2f3796090f2bba34901cf25324c80f2137384790c07a2889e1e1831557807e04f9010403e2e142175552dd16635d276d78c4f49034f2864804830fa0dcffd16d9ccc71bd9aa55fc0d249906149eece85b4d08dfad260a31a943e70ef1e72f7ded13a49f5fdd436a359c2f853eb411aed57346a744bf40250184836aec6f0a033e28a6cd06bf0d9edd7e125bc73ef66e806d71cf57c34d87fbd77ed5ea4d5d60d5f1be98ec6c566511207896788376cd886384f6933959ecbf203bd3c4d9d81d7f2b8c71c230bf7d07eebece779d693527ad6fbe6799e77ee0b676c0dddf02c8b7cb8bdf33e9abbedd3b66bdb69839a77db2cdbfb1e0e376c716c508b59d34e3ba44376972be64d8cdb03c73498fd93c2ed87f127025523ba1fe2533bc46bef3c731ce5c4167ba459ea61eaadbd17853aaa491399a4c12a711aacb7b3451e69547d9548ecb5a87b14f81588caac1ca27245e57aed8b1905ae583c3eb9c678882d98a9aa625ca9a4c1fa0ccb9d06eb27852ba7ac4d38ddc88356e220f105e20df3d3621c110a793ee4f2f4a1691c71a50c37bcf9d6e89621ded2eebdf7765d4a323379a770c3e8130407bda49138b4bc41d2c8badddd6dfae28692c607874facf206f99b53cd4906f2071d0653b001142d450a72761a5996652846e415dc20d3537a148b434343938216b5414f2fcd810e4c34410c5d48c10bc400a345a3c8947699524a293d856e509397b36cc615395469400e6da091c525648f61b42267437c51051429a8428f0a8030040539fb8a358427677f3122673d446021672f856e64b11e1c81232160082264fa1bba416f2290f4a8c8e189460e67e44c256736e42c873472868224c09cdda2a0276747d9e4ec6f96cca6670814e4ec2356a6032a9a082253c0135114ba9145a146a60f152144cf8c9cdd339249968e4e11c418999e531142103b310959258a205240809cdd460186abc5584d105a90f5d414c139ab91b32ccbb2b39aa53ebac45c4f2917997edacc467616bdb3e50718b2e8c1177e983831452b83226755d080660753f8020c9d24b4b22539ab020956e4ec349a45cb599665d96807379663de71b133bc78b4f79e5033ac56356dc990aa0448f361013da19e68925920b23062064dd505828b18f445391114041a9bae77b64414bc40664dd3b4d3207c11842733d35059eb398112596341ab5efba34bcc5a56c49156c53c8125485a1573682f0a8922f754837278df1141bd44aa3dab59560f20834bca91878b2105f0220603d0c2f572e4e12227c9ed72e4e12249017eae8c1c79b8904245836b73e4e1a209aa2cae28471e2ea4001ee16639f270d185ca095c7ca1251f01345531d397f6420a99e6d873040ec5e962086eec0102498e3d401891b721c71e1300753c59a2c0f86329cd33356dfd992ad9627dfac90a77d0a499a40b00f1939f34283f693a30834c1f76900ea52a903a48faf8045dc004364b08a50f95ed65593f6995fcfc3a2805d75adad59fd962ab882af92b9c3801284b2a04fdcc96d8720214647de28a9ca1226d00c1556356835658a10609e5809a856679ee8ba0661965f90ea743d22df2c80f67827086d70a2f69b4a60f92d84e93243f4e0421cb276450b384bd24cb870d463d92e5659d42969776489697960a4b45db6021b5f0e9427ee15333443eb1ca611fe138eb0364e346e39721cd626f6c911b7b636fec8dbdb145ec8dcdb13b56490ee993e5b9d08dc638ea14341acda6fefc6ca11b5d8f344bcda93b35a7e6d49c9cd9125b3b4a787c6aac8769433726860123ba00e0e7a626cf7469b2836c6caa1a871588c70d9ed9626353257fdb07757d5041d9e736e1b13e1ccd7dae3f3eb21e4e9ef8110426a483105d3c10ad903d309338c2c429ba45a6817e92a6c11a9a2136f2ed4474f1403d9039c693ec236e91a9cf159ee4e863852d72687d7cb6f8c9d6a759a2cf15ac681612901b7d8c009467c8910a3168b20c51a04f9329f6000dede08189533be489c31c62f6c147dc22630fc42d1a89db3c3434b9af10db014dde22d74f1291370dde1829522409ce9128c0901b89f5c9c9d9d949d248942cf16162254f83f230e878bea027490c1189e14e2a633c2af5f80331e4e9cdeed460ac8127db49170d368bc4a913d56205c6624e6c036e0f4d1557b493a8ea8709c832f718bd85c9823c51d060c8bd0a23f7971869b01f672a82368c1134ca7d181905d0184e40d9438382ecc51772a53396819a259c4672374b7711841c71c88a0fc137d8a780912e3418b97b8cdcd12587987f40c5157a525c918fb345c3332da94d19144a1c197b8a6e1cc24dbdb6db6f384efba55ef6da2dd6709099e7e35313ebe85686230eedad8844c99e55d65a7b061157625a637615bb553a5bc64e947a79adec342f917934935996c52aaa2a204a7e5bc7d1d99ce4a2260a81c82f9c91e3b3500e5e68c38d2cdbb8f285b44a9c5c6bf5116333c680c46b73688e0be53033e56e846883f15d77e3dab822bfd0bb9103cd368a3a11271289449b4824125991481365a24a4553d42229baa1b6654207e4071d6e9e77d103c921e6781e628b5ef2f85e1f8c18b7c7c3f80324440b1720413daae2251039595681849decb595fdf0ad842c71b89a715483a89924c6a03b73fc0cdda89a0dba33b4430fc9d95f6237118c394630d59d7b97b7cf005914c5851bc626303dccb709721afc4f13458a18094216326d5ae9875570c3991cbb71634ce9aa473a6822884c7118794ec793a2c65092572231dce77005529ce77972b4aa51524ca49208273b59d2c7fd7a5493dddaa4cf5e633f7ae314c52e92f6793fd39ad9b5bf320dc3742e86d98f0edb9e5d510e8943db68cfaea3bde257f6118689bceedc76ab3d7b66394fdbba5006d469419f3c49e10923908c138acd913ba3fbd347bafd52dda62fd5da97ea6c33b99ab89ac8202020a01e69f1ea2d5a8cdb0f59150810d00fb3abcdbad61ad2b9571d2ac35dfb0764ee7b9cd231bafd0eeeda65745edab9cbd88f2ea3f3e2aee154cb8c6e71aa239008e20f21d16566ae08398434811c01a55ca6d2f6d7e8dbeb372ed53cc4d6a8d5de0f201a6e0cd6de8b42fd2048234392439b5d9f382f456688916232625e4cdadc948e3a9df4a13ce513ddfb42efbe7bee1b75cacb6c9145705c1966ad563a622cc678d0e18a2b73ce3963766b310f40329c6aaef4d36b4c4739c5a9c62e6edbba14ae54ea300ce5a6c34e2f95bafba5fa5d37a58d597d712a7b37c2a90c7bdfb68bbe947d77d1435f4a4777d15316efe82e4aedf01ebaf7d04cce707fb40c10a098a67c3af528dd63cb7b6c99be542d7da98a5d35f735a353981e427e4423576c47644457935db6b86e12ebdee91bef26f49d6cdf7491c6e99c50ece726d6a46f6c6868fa2674d15fba6f668ba88814e130fe28d13e9acf4b17d1377dd32de822fa265e30ff00a4def8a1e254db7881f911a45b9a8633591c25695347afe17eba992dd2364e1ee10d631a2c5bd97723d8ef5354f58c1b0dbbb6bee924ba88d73c681cb412d987fb4b7bf387c3b099968c4d9574d2431a049aaf466822cd32b3226da459ea90fbc596bc29822377244f8e92fbc956119c9c1d253cd927fbaa0d5da4735a49fb344eef74ac6fa66aaebc99ac4b4328994699151de5d34a1fe9a65166b78cc7498c931f4052020102fac1b4b5e8f735da4975db4aa34fd1b7bf441bd660573412e1687d709234362938397207f5d99f3eed29a3934a753b95eeddecb9d7681fdd6ddb4efabc3d75ff6a3761d8e81a9631c9a4bc64b5cba0dc3ebc2b199d17eaf73232ce7df4c9a07e9ff2c1745e28144ee9189d7baabffdde6ff81e86721998fb08cbe8bc4cdf2e83f2d139946f9fe9a3efd6c3d88f0ea37dbbbd8ed1ada69d3e9dfa6ef4d2b7d2a8f4eda4a75edb49df768c4678c7f6d14730edf7b1451a7da5ed2361ea1a5121d2a6484e698676e7822eaa507ab984d2f7982d324e23bd07572cd4c75dc6d73de543f9fd4cb75faa6ea72f551f4a652f7d4b94528a83524a51534529a594d24829a5946625d26b45a174ef122551fa55a9547abfd47587a19ca3b4eb3eee4b357e7ffb4c4bd3629a45667a1e37d248b7a4f8a08f4fa296b58bde94cefd553a87613a5dc2a97afcb2ef308c746b755cf7289f8c8ecc09a7babbe99321754f55d2b9a75ea47327e1780ea72ae621b62eaee941efd18be8b72e34a254f260a193fd05bd7c119a3c67509e4ea69db13c451867f4893e7724d752c293a74f9e9e2c325b66d054cdd9c4499e4524cedca1b8831a6806379c3bdbbc22a88a08d4134e27363c441e160fe6cedc993d789e3ca078eecc9daec1bd84b7c84ee835dc453b9ab5386c9a5463978753edfdb5ddc31b27c21268aa66ccf327679b2d5e1325b365eecc6edaed93adb933adbd77a7795a49fb28992df701dbc3f6699eed8bad0edd706defe6ce74622a993ff38a3c67153dd349c7162d21ea20a01db225c2b09956037dd3e666e27411ee9c4c9a25ec2e0228dfe91b9df4d7e824f0de843f55364e95bc992d323af332a48f2e53fabd7d0da574903efa8bf4d1c4afd22fbe53652f7bfec754d1897f78915e3a0fb1d50316838148b8f4b9a68a9ef48d7e1fc6d8c453c695b8321fa76af4f5177a5c0e1b4702149863e4d0b756a29d3ec66791a9768d6aef6f9f0f2dea6f13e1d40ea2cbe720c2b1c14dbe747fa16f5fe8338481b293af8b741291652ad14a9c14913c3eb14ce9c4892bf41d96390dd27358e2b492cdbbb36b1a4c20bbbbbbbbbbbbbbbbbb5b7677db8bea6f49109bab17128936d971b6a6e6f6a5e67cd7ddc3b0d0bbc33ce9356d7920b0d57bf7852ee2ecf62d13e14f76dc66cb4099306bad5ad4773f0d6e91ab3671e85e8e07d4a9cce0662fd246fa488ce6c5f5b1cae10766c255eede5de6ccda7de2d05ed4bb87e04d7409e52ac5edbcc3f4a13bfbf61cb2778dc3794e6a9f30dfbcac974344962e2282f5b58b7c98d9625bf5ffc47d1357ea43f76e441209e170fbdcae3d9cf7f09d1f6afbdceec3fca9c13aab7d2825f76aad943951552f71c87da806ebbb5a67d7dd13964570779106ebb57ac366a23613b9be999038f4ebb970c32ec2a2d22c757ece39a7176b6863c53ef44e280a1ac11f4184fc90427e48ef2fed7a892ef337c796ee947b188f9029f707704b8cce7d36b6157af7d508c16a856e635ba38732485ba0f7d116987d555f57347c61dc9adac18633d9e2983f32dcdac9195b52d1129ee8a1bf44384e5508a7ec438fadd7a74afb08a76ce83b460f61191d9911aeb161b5ba0b615bdc778444b8665e08dbea1e5b1e76bd7c39aae85b3542dc568c090863121610862203c25845a6bfb305e647e2e6a1b75fa4d69334190aee0bee15fd35bae8f222d14f18069b91f2a5d24f1806bb33a4df4b895ff7270c83cdd819aead10dd4dd3f8c1c34402cd1a1bdc340dd2110eae8ca3340b77da9d5e2a992d293ccdc2a45942a740d1a5e485c8f2d2a01514658a61d1448b08441095f2c596e94727c5ad398c403274e3be93e2663f82d450c4ed3cc369787dd83499c62f9a88c211b01006115f006ad1d3f0499b4f0060dc27cd92d96878862f5632dc50dad8d4e98cd3194e25ce8c2fa5fda92fa5e11f5ea9cf380fb13503c32e4e3db66678f8149ef1451a3ec3e50c34c8af741a3e199fe1433d86487fe9b8a21df5c9f8a44dabe869fb1c9146a8cffd2493d0279334d8207d0acae8933c9fb459c2f45367c212d0b27c04a81722486f634ec99ccc268925d08659ab06c15879f566d4dd4d273fa7cc892bf311cb9d06230f8e1fd927cbf679992371f0e28a892d8748225922f9b6772a49dcbef797e80244e6eef3f9cbd9261a8d46229168f4eddaa7e592c9f4fb1da5d26fe932285f4afef4d8227d2989533a4847f98efb139639fd1e05cbe8bc4ef85e86f4d8eab24fcbda2512890359d3aaf921448ca08efcf8ec072b7d2fae982fb644210dcb1c9b371ddc0a06d7b605940830b8f9b1a146534a299594de076aada596524a297e5981ac06a72b8c44c861244296407f3ed62c210ba6074ae99663cf12262cb511e7ce6740e858a64db46850cb6d93a495f4cee5473b3f3932269bcc16dba26f9be8a265fa1e22b2c03448b7e89698a9a27247f2cc16ee07faa2696a32c5400fc9b49443885e8a6bf397d2d1ede84ec23542bca5935d473bf7fbd40eeef7dc2fae21fdbef4e9a476e8db374ee9307bc2589283344e499be812caf47208a594def9d5a01bf64e2b992da553d3e99ba777327d67fa52db675aa52fb5e11f5ea59bce436c99300cc433ad9055c23a1d82a6aff4d100c38d2daed59deb1b7a243649a64b32bdc1992dd6de4b7f3fd27782d11830cdd243440cf490fb23b5904d1aa4177d92678786505bb48a9e760dcd939f2f32a5b28b4cfbd3b2b599f4c556e672b0b971dbc4151ddc8a5d158cdb8f65ddc5baa8427ff821c8cdf24066196872109bb3937e1fca941ea477c1348823bad8d3eb105950f4acc8928a200522c7a0adfb81c082e0e689551ae4bed1bd4f14fa40d64f4d5cee5c7d78999abfd3fb8bbbf7790fc374267e79bf1816a7273bcf4fcb327423a523f4d15f211ca76a845f9faaec33845753458f23aed07bdfa78abefb5834a54304b79eabe1a6f1a776bdc110c4f0931590e310ba004556a7bc46e965f6507ec391f6a53c8739eece7338dc3ecbc50064798e468a71acb8707978f4f07129b970c3f81379785cba1379e4b51c7ba0c8228777053702653f6861cd29d2826cf1405bf52f1d2324bac8cf8b20f6704d5304371408892b93155d4279561c2382084ed7d67329ae5fccb985161db1d08105686a9db3d67a591bcc76b3a19da15b35cb74e9af441c62bc2114b78883a4efc6e100b27c78036a0000c061cdf2214aeeb8d26f2d6e189b8820e24043ded0ef5f20b6b060a20b6509c30b510b395221776c61916608bfdc8f724e29e7074a1c06106f90af3400904359664ef89899899cac3bf372f6f8653bcc07913ae8e2bbb3ac3d309bc956cd128a38ac5bc5f2f7e44597ea925db6962d146e189b6020ba3421cbb3a6aa87980b441c5e30d1a5de47f2842c1044e6791f335319ca81c6184331c31ffdece7810dc6b366cbed97c4a1c61be2258f96e3c3d8042666d0c5568d7c8c57e9d67b6096090b2cbfb3de5213216ffb96e60909db431ac9939ab860e931a3138a438778c3fcc42c23b05e592fb86174d2835a7befa39356d95a71443de8bad8639ece5833ed2079c64fd3deefb2ac434a2badd92773d5c1cbd9bbfe428d6adaa95671d75f988591ce9a793674233e76ee7e16c3997bebf8b067e7b066cba4b392529a6913d3ec21a594ee44eb7516636a06a81c1f67a593d619638b26a594dad43cdb2c61bc8c93ce39e7ec8e0b5aa0546a418a49062d68215a21597e5a1a032dcc89238ef25352e9a493bdd560c5799b25c6497134d88f361a6c1afd15adda0fae0d2058b38cc2e0aa3cd3ea0ceaa4d32c3dddebd9d922a3aa3e461a7d5e5ec6b85e965846907a1bb789626b53cc0210714111d900446e28c71e17d428e17239f6204186fc9ba172d68344177296654560308a9ba98aa018ee28c71e247e4023dc9b630f1231247cae82044e0ebfaa2790544a2ae795d3e6d974d22a86541837a4d9569b9d5a39a2b2fa7431c618230ebf1c278d94ce397bce49bb637777ce6194360a3244dd21ae7cc7d67ec0dcb4717ee243b905503f8632a8e7082472d8345dd3437213c91da3a1a109a29b8432890872b408430c2ab0410f6243c8a1f4d9410e654c62d1319913ebe8a40540c8a28e4f72d7cc9c808830960862084bc08101931cca224608914389238fe48eabd9e24310648083253b4fb65085560b213721db196b42104f8c410b1e317e5a3d45ee5f9cece54682152a4600c1003f99126122532264c8f43674838239461c0c90b96ba11b5c4619b182fce5ed59e8c6c6534365468352e786a8972b9ab42afeb42a66ea04045a5d11c4a26955cc4ab069d56c41a1622d6092eded9b25a4ff28fd8cdb90e2db9843546e154185ac69a7a59f9c653c4520e9236ed8b19f1690868606081e1a1a3b5bfae7e7a68b4c234f27a42e58790576e1ca10e544e264c9495114f6ca1863dd682127e0450d4ce0042a827002103d4e94411453f8a6894c4f8375a2072567286591e98d0d5880844c8f0adda07726891b90a10c487821451450340f144540913296b08230327d4a8480154f38a2022504f2618cc1586b2d8ceb158b7fb960228d1a8df1f33dc4263e31c618e3a682ac09b3091fa8481423dcb630ae9cc748f923251631461a638cf81469157725c4adb13d7b26d1c959653fac92892b1fb1684a29a594524a69a59452dab19e2554fc4049cc162bd151634716d4fd4e344b89c32c561da02eaaa88c9260439e3f9805716b27133058b58cb3e7258e9f0ae8c5157a0a647f5149bce8327f85ae4f01f0b933f245e9e0cab7066ed7168951d4663c7d7170e5e365164839f6576badb931ea92727833496679f9cc8594e76d6c91a48c73e5a3ca6c25745165e200274f7ff28bbbcad6de3b43301603820f9cb83b477cea1463c874708489c9cf33450bace8eea69466b5577727c623d6c3478cbe6009cd6685c4b559ce9d314615f4102aa707c6cda1bd3f3589631aeca15dbb0f7d1e0dcec693ca39e59453ce4b1cf6889973db68f3e83135ec9a314d9afcc4f468c2c34793263051a820df0cd44595f06e3d37dec881916e8903144f1cb9993f11078e1c4bf29c3c730a2249b6b879d6501a2bf21444bac8da125411f2c431ada5d1e012f6abd962f1276d7b848a1f1b6a4829aba4524ada5236c1d3b35b543ac618e3a3c4df887059f3190d54661744e4f4e2662339311be4a9a494524a29b5d6524b29a594ca15488f70795e6ce0c841a9b53725c79e2558b841ac0875b670349e4e94c3a756d5c7305cfad076f40341672b23cfa3c41b503d327dd5e8274a5c49a963a044707e86700399be5a8066fb6dc3a7b8321fa2783ee4792e8227587e11661553d639e794724e29a7aca11b92ce1ccdd2b3e79c731291854b26aba856c898f4913e32267d60af4019963e71a51e003cb8dbedb577f64bedc09c2af53a890a52b841196a603ae11236b265bfa38629705a4038a086a755821aa6c069592c839aaa6aa7aad630058e9d42078253e5801a9e96c51f0d2f50997d5631a2a422d8cf6c1ad44595b0d264da302b1aa48ff93448e792e812338d5d6be9ec209a0eea201a1e164b071949b89904b61dce9b36d3264ecec4f521d833dbac26b38c7e4183324c812850a6ef9d69edbdf3872aa1c8d4c79b3eddf4e927dd12c21d9b35dd90da759ef499dc073355f4351c71a1d8bcf8dae17ed238b62a9c357348a6dd1de4136b42df1d343b1ac213e7389c4428928963278e3671b28933a5c8f491dad4bad32db932ff40e9251d22aae88bc834894b95c8f41587a84c73ba90e589a94d5ca19f5c1177d263267786120a9c4c3f71664b131155f447e4c4c0064ada2674a3876472c68c8a26964bdac6da7b51a89634422a8de905b4b9276eaf4212e85ca3cf3d71b5980b26ba94327d0f99e6ba7c0d5fdc17fbe1c81eb7e87dc3dd8e6e7b5703127706ad794c00bd10b6c686d5daf01755f442d8d60d2b35e4edadc4a79095b8c6d6c5c5f71e0d43bd6733e4a641b06d6e6ca88fe842730fd17ac81c92da214b452a71673645245132809be8c283835c95c835895cdb87c329b9e18dc3323aafd0b9cb78dfbe830b9df3bc875216bf369cb2dfb8879e7a710f9debcec9fa1a90b832f4e1a896082f727df7b54d6f32c8620964a3c4460229b119722381b61c1b4cd5b7cd270c44a14cf631f10a64693736077da4bb69cfee96565861450e591a62d20994859f5a4317eeaa4392c644972fd3f7882e2497d9b6e3fadb2605e9690d5f5c170ee2dae7a05fb1bacf292ffa4ccb1b8930ec7e34d36a199dd7fde832a48b2e733fa29d6374993f19882afa3801c0832b3ae9323342291da48bbee37ea44374d277884ec2309d1dd20a3be0e2062fa0a16991f09daa968e9c4662cb0be11da593b08c8e8ce8252c33ba5f6c75a21cd1a553de67b28747df2a4774e94c65e69eb85a5c999d3d9c23aed05beef3eea98b9b61f0ab22973ff50b72460e929d9c06737696d41c6a9454a0c9a1a4024dd67a882e33d3675996512a8f9044642a83c840f33386259206692c94e1304621d37758823c710f394d7bd29eb427fd86855bf151e04fd735721a046bf491adfa4e466a73844597104e7419407499b9be91ecc0a20bcd0258c2cd00b073654ed114c52eeedeeb87705fe37c9d33557513e3f60d8e146e289db48d932adae64b7243e9244ea18323b9737de7c4313861840b4b2801c517805a7d443a914e52605c0d770e1ec2adb48b066be3cc961cefa1eff01ec232ddb94e86bb875316df06e736c5d5b004c2d24983f5b80877c2d480c455d5fa6ef694dd54442986c595fa9211892ab5b6760521503124f4840655e8a20a08be0630dc50f2f0742f3ca28b448991690c43a6d18b4c1faf90e9398d4a9ed992b2b4ebcedd5afce2be61d8760ea7ec630bc6bdc3298b6d8b6e53dc8aa5120de322dc50eeb4f66672b51c2fb9d76aaa68c6e4d21c99dc28a5ec2ad2308fb8428f852b314824d2189dc2912194083231b129c1e0081f538e3d4b96a084114422a571efbdac958bd2d31a4b9ac8deb54a744055634224887e712bada75bf670db28addfb66b1bddb62daae86128add46a543bd55e1aa477f9c034cb8b521bcd224fa190020d6f96415759d1a55b624b8cac0b4417fa18558dbae25611df80d8e29aaa992cfbae596bad36f6d859638d353eca1669f871657ef20702ab42f0f9810abaa88223bacc56b7b8af1475b839f440a6b2d5511129ae4452a68d6f5cb93adc4c7f587b5936bae5029dbcaa32ca31267b8e115d648e4d5c54c84c0306c61583b9f75e18d72be67ac1b85e30ac55ccd535ba67ffd8c8227ee479d8c82e71ccd7a3c196f23c7ac4f9f81ecd127177ecd851bb7da77d3d627834d83c9a45daf77b584dc6f0e8d119c681590df6bf9706adb0c28a1cdd3de2974c91c3db3fb8a1cd194d271f35d20580501271ac001d820c60a045567d2ceadd034518446826788191eeeeeeeea63dbb9b3261c2c4a7079f263e384a39f62c319243544f7592592a8c484204303ca9f72ddd979d861abac171b53ed380c9cebd725cf6ec3e7030cdc2d5d75aeb39bc7d309febd560cd7e3badeb05f39cadb8706bbc6aed898248ceea911bdaf823457df7f282ef6db63be77d355a555970fbe14aae7498fdfe61766d2c2348bfaa24c8fd4af30441e719a748fb4bd355c7d16870fb3e55f516b5c44b532f6eb8ca3514325373ca6ccaf53d82748ba8de064eaebd53a35922cf929c5cebcf92277218bb90118b5c3fe9aa59263dcdec8c08223c8944c8f133a24bccf2973474a3b69438e8434dd3341ccda2e16e1c0dea109365966326571b3824061b6c9ea661a359ba098d1e2880624ddc7e54e95ad34515ce4991b8420fd420ed2f32d56692a964ee34487170399ce812caa3df67f473e77ead440060dc89a495a4e44b13091039464ae2cb934a1876b19d2aedb0119e69350e9be7c6fb911d7d8461a393704ccd9e58f2ccb42c0ebdfd3b676862dbc9eef9d9fbd15ff7a36b3a0a86dd9b1ae5a37b6bdff7afd1efe8250c5b8d7034dda27c2f5dfa8bf41289849a2aad278cf4128e5355fae88dbae0fb46dbb8e38a761957343b5517a859681660ec9b21779374644b2b99aaedfd2e64e38624301f7ae82fed63d5d1c073650ed10fc19138589c9e1e239de6cd39499ff6d117e7d612ef207d8465644aa35f1c5bb195ea1da4df7b1930dbefb8279d84654cf8e2b7ec6db9433bb774424316985802354849a49209e5f6d36442e9e429e5744af9c5d7963eba45f9bd2d7df457e9238cf28b47275de6a67c32a593a8a4ac1775414c95a2190120002000c314002020100c870362f18040226b931f14000d83aa4e6e4c1ac9d32888614e216308318400000001181111d2b40920ba942a8cbde81c14c3fdea0a82824b6abf724bd5fff5abba7e36cd081f42841a3e8d589954911c46deff43d4a417d352a5d0bf67278edc51fbabef31ae69679b2f1dd7c53718eb4ee3afb8976666a8e4a974971f14e7bfdf38fbde0ca8c6dc55ec5d42fa48ad8d2ecca73c5f6996e2f723d936103f66e275c9145969712f4612c0b4531b223d07758f54d2fe9d5b254d19c99c68c975561f8a97eb15c2e93bec2a5bbd2d9fac9874f4cbf027ae16f95b9dc32c4f565a0d2dde3ea347a88ea53a6e693af227ab8074de3b2db55046dc750c71d88229e79b6ba4ccb7bf918896d0459cd1e659e21344a9c2c948c1f580b88168fd34359736516b624f824f43d4cbceaa5157c429c9d4203232548654acd9f60cf4d5077d4f4e1249fd985da0b1dca5d7b1915f5fb94fc274ae5616a5b25e6d5170303271e1b05d68bf326a82f8d260bbf471cbaf7a35e9025707ca0043f5fb7ab67a840b8b3263ecc7a7ddcd4ca2c30387d8b46b73f237b8df39c7a7e7683cff2cbcbb2193eee4b46756a84d1c2b465119c01182ea14d3cd3412a64fa67c286e7f82c3ef05221cea799a616fb80a57c5270400df974dea340696b8046bfadbb678cce68e7c8d00faa8552057e02b5fb713560ae861610cf83d2e4e6bf81943810214c7fd0402c44a772326ea421f35d8bb1800341d473566097ecf7143f5b041522aba2f3f8bca1d41f35ad19a653f799877d78ea3a01b13047cb28f6a8a34ecaed45ef33d6bf160c45298e1c6ce52a533d086fe5afa71844882ac39f71a41367c99d302a77f10f59b4bd36df93aa7b2d1552dbc1232add751559116803536225b4b0a121dba218946e5136d0e835a344bf0ba5a7ce6e16d03068bdb3a852a69785b99a7949d32f24b00937601115dbf53e1e5f7a7287eae0f4532a0d76323d926d91bfc7010afc08de1a571209d26f999481337e3352418b104402042636689f359abcf1d93235f48d5872853dc3f7f3ad2bd331c7cdc15c9d26996c706b6d20785c8e81f1f91cf58df09529a6e46d78a0955eed735b51fd8ddbb65e6aae25de354b86647473697135a38ab943b7235353d654ecb64608e63cb11a83e88a9c62b920735e21b7831b5c2f39f289cfded3b3d641d8e781679335c8a9079e768c77461e814e3e0021cc9f25738c7225091cf68dcb2006da4adb010fc4f8c0546d0e76c93b1b3224ecc30c4ff942c4781139cc82ff2293312b3bf47f2aefc7eae52618ec3c09fc1d3df7203bc0c850d1039b68cbddcea7fb8c622d6b9d9c07aab8a1e94e21dbda163626c5317278f0f06ca4ba80220e22ca74839e36d422158da641399e40921df24305e7e82ed435c376bb999e24e1260d285b6a889a0d7228a209187a20001d53b9d38256b37eb7b20a24fc8d251f69ccb4dcf071ea9432bf5f31467bf588e446c442d0a3fcac9456c150de2f062ac465c443a4b26f569e763cc131502652ff50963634a3b7297ed7edca438a27f163d318a37d428c664bf4e2f501236ec7c18c1d4c97aae59be2c689146c1d4d0d90e5552f8216bc9e2b6de2c813ad9c1b7fc487a7c1bc86c4d279e2870207f616f06022e5fd97eca0a0f0c05f5271b51f3d21e15cfb147bb692a72ed7acd5988deeda8b571b821aa63329dc7676b69b753e1e288a4263bd9221bbd1271b345f8a62c23ca5c946d31b0ac65ee7c057af86d8e3ae749202f030baa6ca2cb060cebcdb88593f0733d995bed518ad7b36225a57ae709c23847026329eceed3d0a0b680e29db470a3ac7ce5b80c0d368bc1a3993d949e9a83e1a4319b740b02e58ad6a0820ab7a017adb3d06d00c8ba74dc4ea33e52ebd244af9152de63303c1e2b38e0b66d317bf611b9fb039518c189f8db5f6a5502e2c9210746fba55065f4631a725041fed2511b0da29ec8373c15a5efa4bb7eba86802f5d5a1dc854bae79daf08254c837fc2b36db3ebe78d09d7950dfbe9a5405010ea4de4aa0807a1340e88284e10cb8d90a2f13935479c3f43df595b3440f2889b7f35d87b3356e3b162afe6b4927ec0ebe42392ec9fb999b4fcc2588912d430e4558d174f54bb361c4ff8ef4b163ec0e790f9dff1ed7c29cf8bc9e64f572ff7dd22eca03f609bab34fe18a4762c25593cd178674ea7b502874384956254f085b83fb3e2d7f7e318f08a01cf8b8c49f495ee913b6101418c659b00c640104ede37e2a3a4024733529d721d4003b5e5b786c29a7388450b3a641ac258ad9091b9bb5cff234c89b72c886b043c21cbddb5c6102d24264426ba7fbe73faf96e1dd2e69c50fcb430792c64a0e3ff061b0439e4c8a88794aaf6d299ee70f8fb3a79c779936d6fafa153a11be724991b0069a8fa52ecf46709a6c4435665917ec884383125606c7775c21a035430de4293ac57cbbda062ccfc23f546c2be6049383bd3f83964a411475d24fbd8c9e43a6712183b120f5009fb080eba7d0b0aa3ac2149a8229f3091a94a820c14219ed5f5914b32bf934fb7ac5f128218b94c128b2b691350239d536e907b74ac039f3f2e69dc721927668118607c1b68fc0ab47f85e79026b2ce30f14c29834ec3f14ce5fbe05d0f1e4e60c1d9a1ee42a79c41d659f2f24b0e1f82edfd56bbe680cacf94694a1760c3144333d55bc7f4d9529d5f8489e2350ef480b787f865293c5152fd9ef71c432a358a0829676949b0fbacc62b9b36f623f03ddffb1e3e91531ec8c128d54407a1e2b82880c465afa49d2fbf0fdf099a8b6807bb2f881ee22caa658f6ac1f1616f133d5ca35d2193abb8d4baac97bd1c4cfc3128866f8eafb35ca1ee82f2b005b8575bea9f27ec427885d50214f1fe6277d71b09b07130556a2cabf00ed30c9c20d0dd9fac0dd6696baf139e6c07ca531e1c8c6e1a3084b0e6e0d50ae7275a2e14140c8696734ef8fc243ed3bb27ec253e2366b99804ce1f90b094e00a5826500b1ec278068d9c5bc017c71c307331f2b332ecbea224bdaa14fa6357ab8b300d2dc81d97144029a9c1f87efd592fe367c51b3836c8ebc51fe6b8b85c123e6f92a9fd7f0dd62bcefe2b0f00a51c75250851df3e74ba4e678e5c49d88dacea588556380fce909cff8039b82d811e0585eeffc727834bd8b8dc6601573e8fbbfba51489b97f8a12d8fe4849761f6578df5ffb8cc4a5ec3a3cde9060385227f28411e8b282fb124558a600deed95789138c922928e4de8c03a82eff7fd4d05dc0501e400388efbd2b91920156622d7f214b60721ff5e1fd3f75e121ad75f76fef59fe249d860b505865d44e486c6114580aa86ab911ce832c155ddd186b5ba2279c00a40c89261e14c926b4490364d17d1559fdb6f79d73482d6b400d73fb05aa973a3fa096317964ade506c46db2aa910f91ae70267c83d62a701817aac49d2d8db3bab47cc7b6198bc75a327cfff3695f557dabd673448d45115a151138d2d23dc5a31788916aaf88f3ca1bfcfb1240e0c32ad0eb13dc1f5b6342a3090695c1a87c735bab6f26a0af94b57b5480d4c9b4e91935899a82c662457cf91a7616ff42d541ba3ea0d46724a4729dbe6f5a063af1fcd6708ca048152fdab2efc64e85f9c2f93054524e7a21a743ea9824712d23921a4a1302109b4783609a22ef39407ad727ce30a02ef619ce69d4886502ea8703104510f52d1d961f642d0212b0bc87d6833b8e34fb6f4cdd55aae01a63fa305fe141d7a6b20541e3054642392c0dea3984fb6f7b3a8deb36c1111eba7dfcddbee491bf7dcf1fb590aeab2716cd9993af260eabdf21e3323295a34bf5f9583f6ad63030ccc6e32a2025c429ae047640390374f01822fa23c72ce5a9dfbe386498e706069f4895cc518b49f9069d39b2587875200bdbc830372e4003d57ac6448bab4402224bce39b1d2268de6cfa0e1bef3232dcc66810fa447280227ba8c81694e1b55a060295b66735bec3b69929d90e8d51db54bfaf4008ea06e5f7eec487dcadd53cb657495bff8dbe03d74bad404af68385497799faba6eb2207b6a943a63b3f03c68c80f3275bc1a0bd332ad79416df200bbce6ec7c8551de0ba6939d0f932a171ce482f1de0fb926b94ef5685febe1610cc3edb4aff83805153de8ea2e9f9e5e332a9967feddbc29c5a00e17b75b7d59b2a6d53c249730a749b6540c870f18388f102b085e44bdb44889c2d956a70360395465bd0e34b40ab5c009f2896278258f705fd28c2f2596a79c10de9d6657336b44f658b390e4e4149bb3682dddd2b2fb48dab1750726bbe1a059bc60c0831589ac33f750ad1beca08f5cfcf0a407dd8c09b28fdd3d9ec31fbd5ab1fc54978bcf9e6a857bd794c7bdbb3a4e9298d07ec1c855ad8030b0520d42df0ab770317a3235f78d1281622604401195becbee5143bada08130deea7f2301e3b6172d7a8715e223bcf31645b27e0e558e5e5ebe610ec4a8b73ee667fba15728dd0e2234009a7ff9e6b96579a3d04fc84dbb5a277181fb379315dd0dd7d820afeb4cc69668a8690d493f3a54604f06fcb73e0dafa07befe56198d76bc7e67d47da62698b0f3b1047386e110e2b5d84da07ce4930f25bcd6ec27fb98c2c7e52f5a4e3922fcd05587c3fcf4649449b8fea7cd947df28f9da4f6506fafd229008bdcb101ff1ad4e0493eff08cf720dceb6852e5d40827881130e003c2ad9e54f15794eabae60b5a7d29075d40c7e9c264d7c5c426b00719a1ac3369c1fa29f1c89d192e1304542709ebfd8a15e724912936aa3cbb48ade181c70ae8b4635c3d604a9686e8432bfe909f6365c1ba7ca85fd3c424f9ccd91556dac0a137022b57cbd5615a189f8c4ac403204bbd61ddc4fe568aa1b24eee6676d8e1a50c4e4d3aed42f21d0b0aa73a806cfd3561657979d4c335be15f0579ef847107b0562dc126b454e39443267a441722ac106583e7e06dfbf9704290b659e9e11ec901f31b00dfaf26e5edec1341ee2bb3260a1872ae7b471307bb97c112be0bafc848de2b7e7860d62e517b6f7516b2c5f26493d6f7cc9f2de67c93e44214cb72c04d46277184c4fa5a31bce681153484768618cd68e147553953517ba55c0ea5867a4088e2d480d31ae67c9b6a3c6d6bc9e21a32c85d89a9d4733ec97e5390942daec9e6d357b2609a6c58f20a76b7e0040ca48d0bc2fcea5132e9ece05fbe4669e275c5cdc02de7398513c79190f3ea0d16410e7bec85e7b055beeec354deb090617b64c72f4075e5ce16e590b599ad61cd043b603f9085be0d6af7d586e7359016dfcf26e5e18abfc99b32e4915346d9b76309d25ee98f7da743adce963b25b7eabf7f976cbd9d1af9f2f46a287c8cb79ec0ea37861a60838c00d2ec566bccd4e812f0842d4db134ed77359df06959eceac428239e854052fdd86d14941c71bb9adc208551f39e3329769104e0c8eb24742735b828c2e2247d8d6453ebb881ae45ca8887521833b545886039302b9ac39ebae366307a4d9d9d3f4f40276d073282e3c51e5f510da1cfdeb6ceb0f45bdb38a64320810a8efd61e0527d6290adceecbd775d47ea2b8f51cf6d06b68516b2dc305f11b656f6c3b6d8da64d4c7741a2a6c056cb64713abf8bdccb655be03cf8292f271ec0e8a468391b4dbf66d975a8005c418b8a56bca370a448b59aa1b37294616ca10c59fc130d7187520dc90a6b6864d2b7432d4ac0e3a7c87853c8dacb90c9630d7c2272fa499214ba803da96f7aba412410cca108698f74e0b2513748833427eca73a3e79ca3c54c6451611367efabcdd872406d8d3b28abbd91ab70c0ce1542f4464e957a59993dbeb2518961ee07201170b1049a010c407c01d9643bc42948e676f14b6271a416e05cb140832cd7601a2906a16876605ddbf5228a00b78efaab6662889966d902bfa16467ca55db9c9dcbbf43fcf4ed74d7bad523288f494f1c3dab4e2422c0ac4fbfc7e7d8cfaed6f97981546c5171023e460c447414c1bb1fe1807374da41f78d4240c54885655ce55fd4429484da394f1f7949b0239512fd02c2ba92398bc4d7eefdd94fdcd14532eec727be4e5c7bad11381c7c2544a7d9b67a5826f11b1e4776aae6eb636c2d0bf32ea995bdfb803ffd8a7a565e23587cd66c3986ae179f6b129399f286aad7e4ce26efce8532c01e85850ad58f609eb6370a7dce18b8018c85824f37e545b95df1b7e04638c11546c006ba5c904212833b48c0caac3a21e367370cc100df488d20e221d1c071e06c16c28682b7a877475b6e123dba7c4420809d3747b653928c2fbb55a8614be89a5aec4e20b36b0430939971975ba923d92c54a8fe760f14b5d9e78f6141234b6507fa84b06c87f47c7939de2dfcbe6f910c3d056fa4977b51eee5781c4c536ab4af17fd623b417e3be4c567f18c29353d42534ab4a460b55be0bb5eb85295b16697499d165de1d5f3e402d51563c83a3e25503ecc45343253ef75d71f358bdae4fc65dbd7397c8937530371b34c803d3ce74b464840b595b84ca08671a610281fe8c1b3db9ff89387926d21acaea6967ca3174cadae1dd6585dfb606ab396b2827e0a57195524ff9a1326d427964a27fa8d3dbfbff44e550fac481ee644e1d89552af309c9efe2cf841d2126fee500d5802f22b60411c899e14b0ff836ccb85429ca8a2050d4d623e691184941ee4afa9e29ef8b865110d6861c4e2f305d9a8351979f4ebbbe759ee0cc9bb1637a78285897fd321ecb937ef08cac77666e5caaab72e2355b11416ae100b304799f5d416e59066edc0b833c01a3410c1b9f04959a1b62e320316a9268d7f1774a215ff21b62ef2896b8353335a32903abd275760197aaba2c6d8918d24424eb0f492315abf235c01b1a29a8b713d121f9f32e0d48a952c2882191fd836e085cceac673cad2f847ff40292e3c12f2764d29c4b2931f2c2b489abacd2b32aff72b1b0c58d242fff95c88cc99bd122d147f6d6a270403c0d8569dfe492478fb051fdfd5564286104b78c1c9155c048000d26276925961efdd6b8feae919f1a5de380f474007b4f9149ebe8bb5e229e4fea7ca54e11efda06d5ae5b930406e0d8a94c16bed42ce73e6d217c6bb5fda479247be06b8fabec7b99954952feab89ca34eccc4a3039c527955fd78f12c85f3069a7758287c57c27a9651e4304e07e4acafc3f6b56152fb7f5d0484656d3c378f5ab38346e70735de0461db6ed4d491f9af1699a0cf3dcf6aafbc3b7a77a053433abc351a6af39d59fcba3aea431b19d7571ea22dfb11c71321ace3b8c37fe23c874766ff44a4320a75d54130d80ec7621df0219b8a8d3e116f5e1d0e85a38f0a84c15dd40af3ed4796a5291dcdf7b012b89c528a348a06b5f9db31b4e18d345f36ded3be82a879744cce0847b0e13fba15c013ae892f0ee8c7c6840c1a5ac7318de809d9c2ea43f2e3a5136e8858f82bafc7b14ad066120226191be7ea480658ed5103c85d3224b110359236e647d5163f2e2f9603a6851bd367e395c84b4898196faabf63eebf1e4314493bd14f09eee37c4f42b4b86de4afae186f5b5d75fa5941dcb0ed5afd66c7f4070ab0b4585632d3c0e8de767d1865ea03bf397cd50e4fe0d7e0203a00b656f2003d3f6f591ec2ea1c6ac7542a567e39c366ef52ae892915081e360014adf7a594227c8f4bb03c4371343f4e24ec34bc23ec80cf1e7db1534186dbada216d7b9cce945e87614222eca43e0e33304c05939e44f5754e7ede6ad2f6268fc142619351163e7b34778a5c7807ead0695d07113e7a11c176a94021c3ed9d0cef3e4b274ae293aed5d9d3e9cfc45e35f5dd2d4b4ae761229b05f8c81db99330c207131b319a13d527980cbc82cb0704fc465ea75f02c4cf9bcb9c320a9721e27a4e9c333133737412cf8af2b3692334d3c4a0fa6b0d6eec86f69c1f88582c6d7645c9cbec53a8a47658ec3e1de06c9cf5fa67e4031e6db6895b6ae9315f67339fa290511850ffdf64f1dd5ed66c08cfd53fecfda9b66c7b49d9fa242a835a9da124ac62891871c1fa5be35e0ad9eb2b27ce3cd42e767ed91e4486bba2ce72df8c112bdd0b79b3562ee5f531d0f01a97f64238ea8b28f054fe4f37b6ae859f56d17acea721d3b7eac6f3d7a85f2e8930bf1856b8ac75cde72eadbed59d53f717cb8cb54c56589f60c995801e94391fc4724e35f0551e3b301f17e40584ee415819b3b7fc12d92f3429c3b54079acc852647a023279c2d036a6e29d480618a9df651e150166a137efcc2e309c3f72b8bb590cad436477909f0b8b0d94b9e6c7e1d682d248d67403c55ce1ca82ce8207b626e4ba6d737a16c7612a61e93984dd6c28a46f281fb34122bcb7c248ae39207674ae287a1f79387df61395cb6679443e482493926bf10290ff5666ae014d6b82b6bf139ddd89a9e34460640b3caf0b70485f4d37ab6ab6362429ad0c8658b76b900602ae8ccad4bfa3582bc323ae946d1b75e44d88ca86d0e5f637a6150882ae0f6aae405ea12d6df77ac663e28ab6e63ac9d3b8082c951d2f83df4550f2e645d4892498c52a3dc023f4bbc5500a3dd810a382966ea97d0697cb4fbb338a4f0b078f367ba4938059f5ed83a54f39788bb8404c35309bb49943d730237444bcd1467f268d8c83c6356bd751820ee3c9c576d3e538d5a87d63e0fa4d35ec0ecc6c08976f9c768e593d7229d4f3e4670f7063698fd873ed5712c0bbc2fcb87a08c432d3523798cf0119d51270496dd5e2fe3e56132962dee12d2c2f3c8f41f8fb29fc13975fe24ac35d696fc52bde035f4134584a005936c80a4102fb56d517fbca6b689da0b0cbe0652848599c0737597fbae03741fb0bd756fd40ae849d8c15ebbdb1adcfce40091323cd7f0a2d06f0fcba69a35c0db345b3170d6d03b7cccaec060b39402f8ee244c649b2523db53c25b6b4ce6512e08d2dec88ec22b203a2901ce5f433f6748b6aff81085733a1174ec4a3c55219f0962c00d8dca47fb4953f768e0a7b45f2147cbb8fd0871a2f180d82af43d00b3cb0b88fd63ec21e89e1e2221d69c7bf8a01cac477750127a4d4e99ad4c9bb999ef51e493b8c8e39c305fa0b86284dcf6c1e714c40330316d555eddba7674a83d2bbc8762a22f69d4ae2ff64381a2fe68a6a2e07871d4f27a9df04aff1ee0ba714262ccd301c7c3e4f18ec3e05a0f9d49c0bf6bb287fc7611aaacda61533305e7b488d4e03701f8d26632847e523797198d2ee4c8c8865cf1876e9b2bcfc1cdfbe6271a231922616a2aaf372894f6f30d28b065e3274f89faf3e02a24b0a541f3d5995d509511d0eba57da48e857f40882b2a65683b1a48d59bcd823f34094b754365c2db67dee8857b277a206a21f42de6ed2c55fd11ffd8d665114c780d8b7de7e685dc7f6fb36b05db99afb5fb745d74984524677c6babd41bc08b1228a2288dbc19af134abd271d76de955e0c5f4aee350a12487ed1013310a72ae9bc44af61a650d1a8b3f006044ae90930423b0b45a9d669502b90bdb098f9b4ecc5c8622e7429a0dbcef72b0cf84c865a8e938138af67523985787f0ab9b97da16f9cc888beafe8823e0a02b8b200756d81ee15adeabfc0eab9e6a3180a6f7c7bb1dacc65de75bd082d13b1b5fd055c487c6f1bc423ece879ee7f87348cecb87b6a8513032635bd29017deb751c9e08582117b880f6c355db47ad76de14a141da2bb894063cadd5c70520ba0015b286f61eabed0d88ded949251b40a1a23b151a1877329e86cdbdb1310936f05cb4550e069192a93af62573c4b708ab221d94210b874e5825bd6b2c52e78e8644773420f3759c654ba1e5d258ade0963191b5a1dd2a1ddaca4669666deb77496021ed3a14f0ac93b0c7babdc59789ae8a7280149a8d38d1ff581fa38b94c16ee8654ca1b6507a9a2b8b0bbb06b58d49e109e2d9019766926667e3fb0c2c2a41e783f7e9eff953e86750555e0d24aec890e9951583924fe18987eb161cdb84b13161c8d41caadf7e0bd6f64ee815053ccc00bc967c84584fcdbe49890a747cb647d014d48deeaa024afde198581960957923c48d94b32e93af7f9eecf7c635c68c2742cec1c880f20207dde5f8ad586e55d6f0987ee5b2519fe8cef1379f8dce8b39a42e38889f7e1e4c6aa3066b780d7ef584c3fba1b54cb268ac10ea5db8aaf13f1ee2136dd87325541233fbee10f25b3d1515bfbf8ce2e3c66bb0867ff1ae219f8805caad54b0a3191ed46f7e61d18020c3c9d8f475d077e188218459fd796c46b7598899898b03a0464140a2154bb93cea55f60d6d6742781cb0494b0954483360abf280d7460b52d3fe84d95b60ac9ed9b977cd6b65cc9cfbe7b08dbfe3af58c2e8d8b847271e0bc4542c1989982a0a22f5453e0852eb76d6eb362ffe82e709133431e846acb9184fb4f44918fe97389528384c01f81eefc1a1fb7157b3b864a2007111d5fb554a6d0ff87097af4ccca2db136b7e23f79d6aaad245ff998800442ab84a424ba24ff38599655418db7c07da9376e5a474a9c7d81668f8acdbe6e17c3f49035e01954d57538a98ad3667d2b332916cedefb47e5202d76441e6acdef3c748ad0fcc267698327f32b8331bf3234590be98077ff14537119c4f2dcc7f64c25f2f76bb187dbcba8e5a227b4f41d43a56b6449279adeca752e449362c7d0818fd99a4baa620e7e057426b15b43daf1832c4219959dbc6534b6667d13312c8ab12d38f7f5ea7f8b69498eb8abaf8a716db958eb8706451414f956e505758890ccc4bcdb44e3ae04d1d2a21603c53367a9e6eb009d4171bba4779cba21816fe0ce2c371dbb09f018c59ca15813e0a04119475bab3c1f0d3ca79884a1ba3d8f264367db973ca699a26bba920aeffb8c98d4acd309a8eafc04f52a4f5d4ce1adda7e0dc7d89e759e2ff479463e34a5676f56f796f6ad4e5ee454660dd642cfb5a874d4886a402ce029744bcefe5f81bedb06b1dd5b1f63d6da35bf22636efe884ae42582bf46baf6e0592385a31c853d564e89ab538bc12ed56fceb7dfb3e037b93d70ae7c315edab48a9c561ccd9dc91955660d371eef1548c88cdb8acb9fbe5ddc4cf7e4f461c335e0f8a3e8f2bfa8e3ce1227b17cbb943fec9e811eb3be16b4bb442d3cacf352dc9feb05c0ee0b3f044dca5477f3994cd25088209bf36fdd82424d8d695d0c5a722aee9ecf28c352958b2882a901e93c4c10ca49e7973e17f96fd56b99efa37dc15a2f45ced1cd63b972b18c1f1d7a7fb6dbe4e483b91a6d842d8e141f3bba1277310b41acee62472f184d24aa2e6423a3943c05e408a20231099174373c763e690950b0ea6e31075d414818c4536aca58f98f5ebebe3488b4a1ffd1e023ea9df786666643d2a4b729f0060eb53886182a9f03435cd75f318c2549a79366761dddd71ddc21d5ff01aec0c9a33d4fb649f99759a393764df9c3db4119e8d73b53dac303a8ffa3f92936ca1f4abf8d0629837090a863d85775d3d4e26e99dcf03cca4c9cf32c9d98154e391b6c5ce72f28e912181ee7fda8046181f69caa360506644df207ee55e8a17223bcdb3719518dcbee8796a0a5ca43003a757a841e88563cd4b72eec2c62f2b081a60213e25b810ea0fcea7dad26861dd7ed56c98767fb7b5a5a6aee612b843a9930bfe15bbf25b6c2aecb170361c67faf22a5066ac01b1c4c9f416b13f4a1081604bd2054f9e46363b67866577d0c621046f7188ce6397ac60844e8d8a818ef1fa09e851958bb252381b84afc7f382fbfb9d7c857fcd79fc8acfaa2f78f88ce3899e0cf7146b5011880d1a1946103572b4eb3092ecc77c4d744d03229a4be0599007439da4ef36fc69c5f59b229a46e13c616064829997155caf03bb0fc07dcefba8477adce1d668edabd14a708fa5a496950148901429609dbafafe7d6ee9432376415a9d4ccdeb11446da6a17bfc3015c6c449a0c9a371fbcb7b24c9d75757ffdfca3f0c043d91124c776ec3b5083ff0cf93448ac917acd9ebb2bf44aa4f5d78b138c50cea407ea53887ba4c162dee9ad00aa1e7ae861a8219aedcade0f05b14374f8d12cc7562a4058c2620308902948dfe6099b0d6ab962ca116d6d97668413fe562fd1a6308ac0f25e8034d8366781757775c88417709273b14e5775f4aaae8d7592b848a2eea62cfbfba52884742dff83cb50b1ce52b31c2896077430c9b3e633e9784b6876e32d065276df0451a1d32c0cc6fbd87e75b93049d37e6caa0fc6ca82250742229863dc0c0dd58ea17249bd06bf7856b3e28d0f5959e9dfd0de7552a892821c1e9cebd1b54aae2bd5adcc79d6937997a086f2ac7e8d1491a27ecfa0e6bddf443b797689d04d576469934cd21fc9f80e65b1c8100fbf423a0a1ddf908dd24ff14bf8f05b9fc8506e4b8a90be677da9560c2afc83de491cc4b97f94403abac0f0a194fe64be626019bf8426dca240383b6b8b7f8ee2d330d5efad6939ccd898bd0d0d8e0142389737439d98512164a7c1a6882194e72292abb10cb6590c0ca258fc4eb274ea4e3c342bf379927aa4477b962f150394ea6832831c8fccf69a5d8a0b32128e18a4344f1551cb06d2950222ba23b1c8c89655dddab670f4846308349cb9c0232deec73a8f44e26fe46f03eb45e5818b704bc967528a9e3620ab508089ca2b9588d23a9b664742892c6927e758dc1223fd388b65fae4fb55b416935de3d050b654918b8e9f78d91b49b994a69c179e1a2d80789b4e1a70843111a8d3bb7350fcba57d154838bbc1dea4f9159001b5bdc71f35a629f69448d2650fa0032919423aa1ca27b606a6fb4256346dbd0a60e3384f5bc9e1f177a4205e8be892ca8f6919246029471131f4efa04f69f26a3d23a3ca07a57a993acda25b63457e1254400a61d9e4e5cdfc13199bc835bd22a848d6fe05801ae7b8fa8a10b30bb7d9c8e4cb583e8aa5ae4830c9f14b933354dee709f909c1df1c744e6124d06a7708e5b1dee475f0a2c06719bdddbc88e4e43b50733fb956e4033bddba17c3c2b66047f32f304e54f56db386d4a0d10e52f93b8440a164719928625ef4a683e9666a56b0320717c0f9f14fb5edf9fce986b23cff84a2aee5271ce5f9798bafa4fe6f6c7e7812711692e83363c017b946c0f91d6f8be40eacf2fb827bae3d54d6d4f9387b8e92f3f82a1392b25f22f64174a19e14149a533725048908b6292200567ed9fe2010c1a7ea3347727ee569d472d03e260065991e26af101c251ba23a7d7480643295fb203d5b7a3b3e6e25af36a9c47ad7b9c38498e771dcfcf31574b8390c9191075abab3f89d01bd559effae6fd0c75e488cfc6379b8bb0dd3be1f5374c87758c011ab5b0313a0b34a32375b190eaea9760f336c664952e07beabfc838b9b8a81a5c420bc1d2856a83b67e6ec93c1b6258aaeca26b04145cf218cefd7b613aa83e3b9cdeee9fb3f1f228bbd6ae65f874212705c407752a0b1d740caae552627de4ea66e87360a180e31827b7c9fb0835d9c7ab168706ff865dfc7e1deb6e85d1a544baf53944d11fa0f6cf35c6355e202dbcecc76c52f3d188a43db6cc9dd73a4f8469a824b196f62124d32370f5a85ea45c14abfd037b752383cb7c5ce4725f42251b4ddcef8b6ad07e5449de1e58cb0fe500f6251ca865ad36c08340110ece19144bab4cece6964cfe2cc3bd1d29d1f193260ce92e734034630f2a35dc34103de3a7dd0e8b8c03d6edd8dd277ab4a7785710528ba32afe6a9225ae4c188bc5ebd50634fba8cc59ea7aaf3c7d0d052325daa473d2871e2f3161fccc44876a1c79595f6a46366296ed1b0c1cc49bd5cab8e05f59855139b602dbb0e1825889b2315de3594e6883d720db5558ab61b58efb142ae4c35b26a14972fd034ce7a9c831207f2a17aafe4de3d0bd1dce621babaed2fc8e1f561660b9626a7902a80d0ea0867508c9c0236c2900dd38d595b3d1c5e5d787b3dd92a23edec5716aa1e56d28f1987b215ce02664fa6b212ac3c842ebb7c579b3881c61ebebced8a06acdacb30ccdaaeda6ea8dcf57cbeff0eaa54252f18709be6c46358d9656054aebb848c7cd1b53223f36e94a5262215b004176f6963f05102b736dde71a69ffc688758c0961515525228552c4f630ec468399d151891721bb00a3a1ab5a92fd29ba2f3f465784c904adae0b00190ca8b0ff5cf003e63c258a2dde978f139c25b7f591c064e854521d02336fa3ed5953f9e6b66795c1a3c58affa386f8e752d4d57b8b57a88a4bbd31a297bc82da93217c67f803278cc3b8c6618154445edadf6e512e79dddfd81383ccebeadbe3ecf42e7ad28a18880963254c9e661bff80a7c84f7d7c53aa7fe71afb3c5004ce2e37ce595e88c642599718affcbf64c904780f035931b5c98985693ff9c6403a2b10be6750e6eebc11867ea182f0134ab5bb5c79a5fb7f527750958cb0e08229b4377591d30f91d1a534ff23e87f5c2054c11a57ba12fa3c2b976c00c1346185f5ce14de8ae218266e45ddddf98344364f4f214178f6954bcee6855bd3296b610e0fb69c8bd219aad27987fa31879e4743006e5e0f92d6bd15cf2f4b95fa0d8b7218ab21647b0bb1c0b83fd16ef26d9148d389bb09c5963cf9c9d4f6f539d827fa269cbe81c815c4f0752eb32d86352ba3e3e0427b78244d1e360c5504f830394b40948ccc8686a6578759b6991a4df92984876467262e6636642cd55877420344bc6569715e12071e692a7cb22711d90feb500f83d3df3f1c32f2183ef4fae32de6e8afdcef1facf6bbd531703d0a2a8838a503aabeb506bbf9fb87e2836082e1c9c55b0e5c082c0005b62a7778580858ac9d4d82171888b2c605d24b137281cc4556faf70d786dcbd9ecb11836b15e5fd7ea078399ddbeea4c4394fce1c704fde18a3588ba080cec67ea2bc3312cacb2a500d60b8e54ef07e95b3ef689ededb284e8c9c30b587443c77a1628cb3340ca7796768fafdd32442bc2b182d8c30fa54967c312894179aeb37e6002bf92f76af8adf5c12a0a43a7b419a178ca582d4e7190fa735411f01b8246ddc10d866916bee3dc55b59e58facc2713350bdeec614c937012efd402a99c5ca83b1c801d879c456ec4ae621d58c01d65680e52329ad87700789000a5c802ec7734bd7048b6b03fa009bc98e4a7eb2c34d3bd5b811042424680f5bc6c257cc32726f24995f53cd1ff4c746631f090e60892fa7b9e7d1f0d683121e2fa89b09d8594974064b33d11a9ea517200b2d570355eeb9a39f8cae722f970053879cba5ffb90c551e72adaebbdd15fefdfa0f3cf4e04ef9b67f9fab96bfb5d72d6cbf196fa98f1ee1e878ffa145c9bc4aa3e411954494aff8b80bdd7049fb3c814ec70dbdb414c34db693d6f5787592a0f1ebf7c1b89bfcb3fff936d7d7cc07326a52a57206c33ab8571101a11ce9245a6196e1e5f922edd50a3ad03b8e36fcc21667453c4399b0f4ee39f15550985c911cce8d26cf7ab1b815e7216a8e96b8a812462207f8a51e9a54923138a0ac220bd00bb11ef91e1e79f53ac8a70783e7a6998680e36000d002d53ba97fd51a09774f18d9a4220ce50c39fe527ae1024f2f285848ae29af638a1f5eb056305609f5e15cabd7b90f15442765684a010cfe570db9ba66de5ada9bdcc9456a3957bfb48d7f8051ab2234dcce2b8b01ae557c182a8e9500d4867951925f01016cd52046d8325f45add9128200fcd952cbc13230d6ef0563b0bdaafc71ae3c4f3f6e68d5b873f164fa1b479ae98428bb1e3cc034dc658b8ea4980e0fdf7adf91d61992d50a36597734fece06d591028ac47ccc25d7d988101e6b5cb656c34e362af5094e92c20e0d1f3c36dbe2f8cfa0a84372210ba20357e76f18e47e3e4006f1cfa400d087a61fcd2f101b11befeaafdb2994576a78f75839b6a69174175af485abc0e0a6dd81e12377ef180101d3f6d21c36eb58ba64c26f12a1d97c086ca5846a36eb3462bf35697fffc9bc1b97d0266f85c8118dc6594cf4ca82fb8405433583610c50642728ab66df25b1bb94c5efba828b7df6eeaec9530cc9ea33106e18a71790e0e4e531247379efde8299d39980e50a9176e18ce6aa82ff11b5c7f1694ea16294f737bcff2a0d9b4b26bd39db9d4961a32210e5321c667a95be90acac699a906accaf29ef36762e878789970f13fe6160db446ad1d868fc6857e68ee66d6d085b863ed18846e55e501a8aed72dcf5f08bb7ff70b48e50a144e7a037d214043015c69b0f18f16fdb7f9166dfb55a68480567cadb4fb21fe84559bf57e35285b43e3aeb1e5ac4feee183e701a834a55b0cd4b2f61eb9f37ca8a9e1efdc97921304be01b18e1d8a2d50f2c7978d090590f5c8ad4ace6b78b551e65cea365c8e352c5b4d6ae57c5a32e6eb632426b6e6cfb290198222b29705b4219c632e95124ea3d35f2925e45358733ba4ad75a7490ee8e77f8c623bdd3ba5a7c054e922fb8269e684ae154ecc668738bafe1a0188dd3beda462d254bccbb8187a9cc0af38f7b86ba2750b4a83b7a69da5a8316aec1db8a4f1fae550f37deea4ae9d47ece3f63fcb8abd655a94e4a13c3dcea1c662ff564e18662602ee74df9841be146c1c537454c28c53f4ccdac8c632c4991e8eacc8671782fec92f9b7d2495692f01880d715eeb4be0389c94533b93703818e330155076f9aa9be168007635b1f526d1ae5c92df354b5595c8f6bed3cde41ad916a3ee440ba1b65a93bae9994c4f8e601e079493963ee67061874ed5da40cdc0dad7247f68596979ab7105188584309ab480e699430b5a433b3c3013fbd4a1103ee8b570ddae0e9bc2f4567a94da0d98b2f182c944f3b919caf8c009fb15b91057713ee370272adcd8199de644ded7c908803c28b47eea19f486e21cf39d0576605ad7018612958263f1e672d044026f20eb1998ce3a4eb5704353e56b9b34b852dc948dc9bdbf1e8ea0a92a11c0e69c1ddfe16f39449f730681897cab56c9ac9b7d010005b1a93201adcdeb8a75390c6ff54b5bde37028332de40ec70694ce8fecd780f66c031cbfd4aa7c7d4383e5db1d2451baec921a76bbfceeaaee1530d7bec19525713c63f37a1b18df145dcbed6e981d600a6e1ec26b540e92601e841eb7114379313738f413fbade80b2f501f9bea60d12a43a045780cb4b373aa6d610e206ca386b99ec7fa1ab6681a9320bb86402d6456a8866ef352efd816affa080c327aeb164b11c3a51c467a5c78ee303787b0ac4ff528feec12ca3914f778d57b31d8a7eb2b8763d95fc40662d230d0b38b0e5054c775ff232cca8182b3896e6c8d1a2deb67ef93701b60768ab267073c7c89a070257ab1c771f9859c63414cb4f7b00371efde5d423028016cd0110c06e83069ccc4b26762deb14628080bf62b3700526069166038d95e9b1b1124775efc20bab823a52505ba008f3be66d99009d7730983766a9101f6ec5da1c69405036fe5de161db26d6ea785083ac9114148221fb14858b5f911a561296961b2fb232b0adc013b6802a2df0a766aa0524007f932a585782a54be574ef37a4db1095cce6be681302874a9fb8b1f992e2e0fe8ddbb4e84898cc168153e21d70f2bb2c8b9492782e169a753d9cb525e8d49a2500d34eb0a2e938ed7307563d48b321749501595da7af439ccf5861677e3b90632669029110ba5d59e2bb4b6f832425830e954a04d994421dc8a739c9878282fcdc5a928e20cfb8498b4687f921469938265809e04fd7ad21a0773a96e034b02f066edc0fd0afbd445f88487a72973d333ca5037a2d9f90c5eb0619616dc4c575d80569d9827e26a277d841586f9eef6394a325b5a9da5816b0690c558aa29a1331c55c38ec713216efbfb9322ff24cdc82e4d4034b3d65ea8c84efefbd3e5b116471a9920b77088a9d898fcb49cf8c4db764fbebb39b39d7b7b25b121d7ef7958930de12ab652153b0e893673c23b12b60c96f8a7c28d0ba6b5fccfa50594cfa6890e32988cf4ac0cd60480a57a84e4e25f21ac2eed7c9ed841fad933e2777f7f09a13bcf80988dae86dbe877d4e2e6d57c49d22625db425d9c44611310c5f46514c1a2c0f6b61ff1620410c05dcba6e427b9650d3baa8ab87e031f5a8cab39c1fde0be43302f8404f5571e5af37901145875c1d3fce05d7f777e1ef2f012850594b004888133fac7d0e4dff2b04711364bc49509c2f7e629b3a4f991497d542efa31b4eab2e0625f9d3272247e1c4030f9a19416fb5935622bcace9f200fbd6b7704e655e223135a99f78ff664764b0174a824c4ee3b0192c2768094d7c30fc2ed5f70cc6ab68fa1b493902d21cad675f0934c31e77b79fd45011bd0e6c6fa386f39f942d62ba5adfe773eb958318a52ba4c81e075e1411f7538ae17ad9d89d7f6875940226f6d00f823a9c58ef23480e25949414a5f090ccea2542db643f22c2560e906ce76684a618e231164ebace175f8b31e3bfed98153775b3a2004dc9314832d5ae47daf51ee6a813b073832949408cf1ad7cfcfc7f51cd2bd4bdd969751863183fe118995b7a268f35ce53443b6e12cfa4bc34c084e6d3e9215b6b51e477cf5248998da802478bb3192781efc22bfd2b2f85fb536a2e55e0295c094f92ae205a15bbf77e709b5a6b8157832c2d3e67669fb054c1f37c535fccfa7e409f4cd81fe8fabcf52ea3991ccc37016b661ff5bdd1d362ecb0d547a4351d567e1a839ca9e3c5bf27a9769528d86762e0358b7cb1b5a51115ea31c2afa086c93865c2410096e29f320b21f1c0887f25bcc50b320934fc9daf1d6589cfd66bc267f77d1128003c18b5c9ac345e883ac5ee11c5c41f543df29718dcda23807b1736fcaf2613003844b709a76c35d89173668af77459416981f036830aeef0eaeb1ca09d711bea22350f2a49db81dfe1b5a97886d6a15cb98190dbcbb877a3fdf629c30f16a6dbc2d674285f746fb1c2e4dc81f42b52f064ffb8a32da578d4ce9b76abef5a91947760496d1281804ab6f5bc079e19f02fc1ac63f76402f7a01beda48a08230a9dee6de6b8c8998cece6a4b3d3a37e880dedabe170153c9abc9541140cd00b9be5a0678cfbb72f268f145f265eaa781c34e8572b96327a64fe48d57827d492fa52f48907c0726062fd737640661d835221668cbcfd44c18b8debdf7c4efc016d4def3660e89921e037c27c7cb8c350741ccf2ac9b16c7ec14acc7e4b10d25ebd205d7728224187ea93867da359a8a6ad25d56a6e55c9b56c7b5ee3abe763d6b672725238c8c6037e8435fbcad8120f61617690bb2c454aed5e3c3a96f7d9c09342a3170040ba6e8d29021c70326cb3b8187e14c9aa1465b010a933724962ee485d4a46e1aa9d2d34d485827f3cfe37039050029d6d9625888806cdd36c0e1735c0ef6da4e709518ac074949a3c299b54168abce3198140d1de4d1bd92e48d59daa82abf6efe19c71cbc62f58b4efe1290d3e53381f0fe6915aa39492fad9e830408fabd9f25f0aceff1d41e9f51670e3cde28d1f89dcca8c1205df05b2e6c49ce41a81a9bd1907fb8fd2827f41952e5cb779f1401f3893b6a09bd0aebaab5b136590235e02f74f98fd49390757d8e55df118b7accaebeff5e707b4c2dc06e0cdf03d6444b63ddf3f2b7642e585774130b8433a322f989b485f6947a1e9f961a9dfe9fc3ef02228fa1586503d389ccf054d5c5c75c3bd96e065180487783ece3d78f79fd925ddda2c371ffa5fcce34c1e1462d54090d56ad53fc0090617983fc9778893d016ffdd7d809d440149b3447c6567ab62e4b43a90c784f4d42c777dff2554775e325d1c3100bfaa1bb997aaeae09f5c8ec8418345aed6d18de9855388c3fc992e3dc70ddebbf76cceb7fe39883301da39e36de59900d16d9db725f864746823bb16eb2820f1f6e4f39a3026e90d14a0f773fe6ff0ee3cfc8ba0884e0fed0e24c5a4f97c6d0e5ed7e07606e06aa4d5171cb43105dde426b9f227e69800a77f0797874bc401cf356cbfc83f8ff46cf1a38163d58199403ff40ab0177d994b63771332b0a7adf6674aa05b720dfe350fe87907ce62cfbe711c34b75a3e6eef46582058425ceb36c6e28e091e262054059cac5b54050ce32e8c3174db761ab30fc66972d95cd0d64961633405807e0d007556f5102dc2a49007832771b84cc8253c71bd62b07fea9e4772a7ec7aab58b23316faa9baac9a6f32395c986bd4398077f13cf5d2c0ddf0e6ebc469f46eeaf22f1e21714ecb417406a1b90192da3f1d4495c24cf6ffd5d101283b4649796ce7d5a802891d59ece54cebee724ea25adbb4f35512ba0d03570b1990b77c0578cd3364b7e51def8863d4268d1d6f3ec90d2bab2f557233d0d94e1a364474485c72e07cc9f90dd393aa587200c7680cb7e0011238712be6eddae7d5658a5f87a60432fcf767210978716a2283cb0220e5f9724a85107dbe64019e2763722dc8c6319909ccd96161512e216b137d044536ff5eca2434182c31c0662e620cc56752162d5b3fc894812f3b6eb862b4d7b8da5921f73e5d03dc8599526509cdbda1d6e8d80198018a5a91665a9d9fa7b3e841b769834d97d49932971db5659070201c4116ff76a0ee14eac2ca39ebd5baf84eebbf3cf8c2e3af8bad70d973f1067d12744c4b652ce27c2c1b80112115cdca62fff9e27de482a5ea08c6a63b633c514c73b3b52aaa47b1d79a65ede2f58f5b8cf5caea9070050d4159c71c0b9a4d6b552531ecedfec19e61b69ce0591ff82c6197f73478eb6b8fa7e62743169c92b5dbddd52c185029dfe5b558c7af6c7a919dd947c7492798112fd9772a62303014c62702ef28846a4279d129118662791a8ad1c157b9095dc022165cae6f190824e5841cab8c67a9ccbb432a5f18b8d2d3c89c57251bd22d4b62e4865c1d230c32b4b81b825fb074665699c8507af4c97bf4582ee10a1829b3994710b27e19cc96a1d4a8b8385e9b3b95b13694750eea4820d7917b322e6817dd048ef06d7bb21069cb5e5faae526cc71d9823d58635d49cc3221eb57db3aa779b5d38d94c87261048282fabe0afb000f5c53a3ffdd98b3eee06d37c8536e50fbb6b54f197a94bf8ea7ee7036feb187fbe2dfe1cd57637a54acb74ba3bf009e1bbe308a2041c61584b1644fa562000ee0320f33f50d34ed1900cecb47f91eb82a2ccfce0c8707651e422e913aea2ccee913e8ec318dd4aadfd9f687c8d27e61d30695ca6599c07f7b0a8c03d2f0f4859cb69d082462aac6634c59928942cbed1a5a18e439f5e9a3e8dda433d092d38f4a1e2dac01f36cb7cf9e0ef41b21cd4e9898557d15c1318a884a3090364245b86af30149a19866506f0d5e80d8f946142bd4930761b994c6fee386a891704809442f8b43fa770185123c9dddb3918e6c9ebfae5adfe866f66c0627553982f7cff6112636462ab2aba37c4f6ce5cc77e3570354785c2436e49d1d774ca2b9b8299805896a4a88390ad8d821e0c96f8efe651e4f7da2bab403a1c7fb3c74529390ad51ada3c59fa0b02bd22198a3ea84e291957a0554f22948ae7262f74fc312b1dbfe4363a32c04f7d126561e88d0806e2658c38e83d88ce9ce88bffefba70cad88c090f9ad9c9f5c7f933e80b69862dbf43bfc3f0c726eac154eb71e6a8db358a60670b5a310b6541c22c2d81dd250fea72f899a641570219215d52145c703d39008b6e5d31775ca33c57db4818a6909f69ec5ab55a5a6c680775d281c593cb21efc3dffd4a1b78519a893d259d525ee0a9c8e980c9d339c348dd0315746f14b1d2276e5b34c83c60be9ee5bc173c5a7ef69a5fc66a93482a6cbb45690d0ee970e577ca1998c614abb5f35711e00bcb9f90fc50e84b8e47cabad62526873921bf58b5f8bce088c99cc48a377114c0699796897242ffb2d7e2ff4e334cbc1330d3ae17b92e004a56c937c58a6a44b386bda191846ba8d140d2a09bf46f374987d330d8789607a353f5b84bf979db1fcf591174074e6fa06141bc046725d481b39c60ecd7d1a5cd9246f3485719911c2e8a8cc71ee9b7897ab385dc5836d28aa8de7da5b44a6b16545267a718db680765bde65630bb513be1fd796097da98d13ff347daf38a8e535035682b3c530fca9438f7596c07b04ca338132899c851a09b0f0b9cd22807fd9ad4188c16b68bf28ef36a1b1942d474886d7d87518e2bb7b8fa8cabf6ff95038f39e724b979a600f73526f0bcbc59155c609ab86f5e13a009ef1c201616d9f3dfd08816988631464ea60baa276b8f114a8b25d11aa70871de5928f7c6924e22bfd23f8a9330e5144f429573b65d72c21697a070924a2ba0c96fb84b83bc369809b41dea790ec0ce2205e695cdf5e74f53a268ca6d222b21b134638ff7bc1752482f8c47c3bc972d15be545b56601eaf81b55f0d0d3c1eb7aa26dcaf3831ed471bf02cd247df61dd4a6919688ff15bf80b1f16f4d017a30d7121fccbd875372f28d585797202fbbd9cf499ab0082c1dc4cb12303689fbfa89f73765943e4e9c8615c9ecfbcdcc0554a06fb192ae3bd403e834b1adfb0fbf1e06e4f8e921afe7fe707fd0ec9aa0150249c80dbeadd8c3b00e409f83501c10450830edcb9c578e443ed9a81130731c15e41cc04bb00d0c19e06d28f873915cee7b67fd4bf4f1e56fa0f53a127d00337bef1b0daad2867259ead6dc3926d096c053bbec653f99cfd89e433ef5332b0eab9cf96ec78f7e4b9284330729fc23464064200f9e6a9d1da6b487db3c210763d0b6d3bb3070ea95b5d2604946214aecab35051e2f8bf9262be2bb49125ba70a599fbc0377f029a79f32460dfb0df9ee305211a2b4d190a82130b26a0fdad7270e88a5b455d73dc8bce88e1c9f4f6e02a2d9a558a1631406d2db441b32c513dd7b2c3739be0d2d5ea4b5b4a460d3d90af5f9ec20337c7c2c784cb9fd796b1b4e2ad9615a258bd11ac8e92652188896e7799e57f7f249ec23233294b88c8151b5995739219ef0fa17eea76493ee56ddd7c5cd47ff779c361a83f2d1407c584a4c9b64193f61d14bae8bfdd45d151484fcbd61566cae7b8f1eb51e8c958e398fab2bfa08c2c8f8611bdc7466b23230bc2469be14d2c9aa20de768e4368a6ed3848867296d88a165b009de62a00a4f512c93ff57a70dde11ab1078a74b5115be11e43c39517a5ca141346654353c9094d0d4bf35ceb90f383776c47d57420a0721040966b6c1d62e0e997f7c2d3bab51e0be7549c17982bf84e6950901acbb71a44458ef48191c6a7bc6965f61624b48fcfe41ea4c1d54327cb34f7ac221d063b2e0b25520fb4db3523d39be5f20c85ee5a5d88c7da538110dd9fda0d0a62e2391945220732a02885e7b98d0a58009d00a3a723ffb9e5470aaf7e0ef1eb2012ad42522930da389e2b7b8bf6dd8dd44687c5a40585df8dced13e219fc298c74662d9714039092aa6c3e1642880c6f8d4d5243dd87be90fdcf3fbdd9bf5813124fcd7bf3dbcab63201e88d252c876ac5194b4f6d086296d5935ffcfc5cb99cb54b966906a39cc28695a1851906484b392c27b7d195917dabc9f5b3958969dc0cecb925d8f55639722da479ff0d2c232c87d3981ef17a9ab12cc8a61b04ae12edca7f2a48f363c9d18d6d5819b19ee19003bd2e87455418272156ad11ebe17492f9dfb1d3e128689c15a16844f473e628f61fabd0b88fadbdf124eea6dad220042b32e11d87c6a1d5787dc6761127566bdab8357ed1b4768f90d6611483161d22b4a8389186d6996f643496734388306ce548ec410c36c00198ff25ac2f229b9ed53a29581cc744e2e7d8d92490dd28360c14c93598baac073f86fa123f80c531a66e8affc021df8e749432c82839a3bd28122108a8442bebac3434c8a16512ab55955018555f867b7642b9db597894a75ab0000c81f2d1ba821a1a87a1b3ec952e4d2cb8286934537700c6a8603d545bd127f6cfd3e51b35422d0b2e2f007e9a55c284005ddc70d85b2f8df037d3c75406614e0e6a1c077ed9d8d5632779eb870c6ffea54f21ce636b58c94e3a5c437c7d6976d98b3cfa85bde04e2de1553ab7a214abf4ef299652a954418e423bb0da3b49a2d341cbd563cf535779fd9630e88c4de16c02a17d7c36ffe88c10f29c1558e764ba7925ef6c544493b7cdaa8c64c604378ba3a02986fd92a4acdd341a8c0c7bb3f1f7d9d9b7ee58154979b526944e9f7751faa3274230904d4011379cf228be33625d4cec99b9baef68f972fa9f3211a9576535938589bed476b56a5729cb1d9707d4cf43fd6ed0b4905db78439c4318620aec3353342d9203c745d171e85652ada68c2171b556c98ef3f8b0b54a9d2cc0e83c6e5c83ff7c4a6ff5ba22e18d42cddedce718e217d9a21d08d61bebd244b612990112b9fe9cdec3872d4be6d386a73ebb4db0ba5d9f7e21476f6e9ff929a608f52fc711a40d68bb7fae3b06a76718dc9836f5b2cf5a0eb86b529d33183692b028de22db2127c7201a1522de8f22716d09b6cbf1c49b72fb7bd212cc57280db71fc19b9d210a6aa08410440ef76b5f40f73fdf1b7abb41b532e84a03d65dc1c8fe63badb0f5227ab847eb58772ce7dc80bac4287e1e1f5677e908d91a035e5808e9c907eef7876ccde5de7987da71a8f81ae3402dbce411f4515d24fd23bf26d7005d4794ccb965ba56dd83c7cbdfee0cbda9ff7005a1c6ad912a44754dae1a1da6ac49bf288bb8f89c8e7df2d49d98e0c92a304bed8974b46f3b0846296b6dcdc1910f82adfe392decbeb5711772e9f89cd384dcb39c44a1ee077eac184bcb95133c273b7654fbc32ca2a19d783555687aa08388391ab83687ba635e7c8117a620d2658e203fdd06f835623bdc0a9d1f67ea1899e5ec8ffe6224d1db6b3fab67e1252a5ec256ce229ffd39d41259bad1d69a46ce425a005628427d395c0971d0711cc7443e23f3e34b53066a47ce124d8a70c7fd9bf5d61716309d63bfd3aff346054cd1ea73bf0eefa90a1b8cc407069946ddc5b35f7affb6a2bdaddd9792c056c9aba563027e1dccb3119e25f723815bc87de3cbcc770ccbc8ace611f10e47dbe7bad85a2a77b17249c3cafcdd1ddac81f09bb8f70aaf17cb8ca28a5c3a4ea836ed7153f86773a160bf24457ba03809a6469a292ae03a58981a8b1fd87c42431a23ca944501a3c8be85c339c32aae8344a51882a537362f392112efd0a0f62e1b89ce5abe7b08e50a1a3788f8f5dc9e27d7acefde45394b27f77cd22ffbcb26002665e29161b6a908a2801615842cff2491dc1c32a4319dcf622f9a438eee9a029eb80f8bf9e3507a5b7ea938d7cd82169964b6e7d08118982b1328c5316951d699ce2b967607a94df334ec8db489cde8f03f85c1953dae353bc7580d248af29958f941655da334a4135a24539e0e9b88bd898e944d0005640dfd4fe42691ac8b002d08bb1f63c602bf4fed452c190a7b00d93e16cbbe4d24eef721a64d3c84063a32a86539dde55e826264557fce17c04e130918369ab05f5efa631156d2c60f7469b5ccd7ac47dad4714a4524af2a9586f3908d7b2b8a6803f3d6fb58d5a25a412963ac1417ae9edbe25ae17a05e2debc7b470bbaa96e75c3a5966d9daecef89f8b201277a91b8f1467691344bb74a9292822fb6a2fb56be348509e9fc25c1cdd7a0397fd918aa89d6cdc1d51ce9ea0f12ea90cf71682ee34c3362e86d4438df91269162ec7afe9c55b9446a957c4c54a3ff475145d9a6b6888117db4e5eaef1386c221a36cef00c16a2f045b9975e15386033a40ef364c3a1e6c33b74e531ed4592de4a34a84388d2c3aa5a23ded91e4095e5c759960fcfd6f92aaa77372c47715a99b2c48d256de89b11c09c7b5fe2fa78ff22af4e45b99d2c964e4b11c5a37764aed5b30d611ca8c24441e99f960107b4dd07932c5a866d51a0e0cc1ea511541673c44bb94063254860f2679491490640f8c9fb0eb357dbc7ff6c4c2c0778f245018f4da9eb1ebd01ded5c649568e9c6711d811727595ccd4fe4aa0d30647f6796dca042f24746ee7bbe4b5d8d97893cf04944666375771f159ece94482db13f4715a4cf55369689a23c53e170e0bb06bdfd2ee15f9a89d5fc132ade3713db680b7fc368d4bc6b39f6e1f68e7aabd8882deea7461df0211c5426e8cf441e863fdb02e051f5f2f3a15ba7555ebe67b8fea237905bff2e1c2722a412b7c860c3317b6b882db62da647dcaf31a8838088e0c3c0bf4dc411d807e81401e72bf114dea5c1c6436a1a298f332be146f2fec813f1bb54c5707f06be8707c016c9c5a31013e10581bba3c5858750e91514464413e7e88f71a89c92b29b5ad9859b920d7921c85643e18b4f28a75b7060a7218eca89946b62daab95ec39468e071c3861bd773c5cc8b3b639fea3fa278d65a75b9693f2dc0aae433aa4758816d5be7c52e8f64facaa5e78a359e4e39da8ba28991ecf200a3eef2564310bd5b2cd0bea1978c5a89b1a8f5898c637afb718dded1d2f173809134cf29ee3875e5bfae417608fc2bd3dff223a854b9702f9aedc06302d0681c199142edf24eddd33505133192ea41115d8d5242f14791067755ccd10ec98b1b8c4090d4dc5d1ed2bf804ae8eccba4a2d6b4a1b017080e105656f642bf99a80f71d98b7612a1c337048da3d10769c12373ab3c3866560abe4dddd8a01ebc0f00bf670b36e232e160ed07f6a4794d1f717cc2e2daec2e579baf1eaab862be879a8c33f7b9aeced65941ebf2bfa66d2662585caa87724d639dc1a87662439131371e71259f6307ba194d70fab5f59190a0f057b301220076dcbd02320d558602f7698781f5a609ffc291d339618cdd6f1a69e4fb7eccfae65c7507d1b361d880b2982075b676f64d5f3cc909cf50f833a2ce390eadfaa0d41d7996848ebcfff4333d9cd080eb120ecb0df74f92347bbdddcfae579dc14eb05ec23fe354b5d0f09fe94beb6d672706319ef985e5693703c818356242601effec71d2f204746608c53a1ae490d4a2dcfde8ee032c99d7057d6f635b260e811fd882eb490cbc510f7e6ace0c08a1f8e38406963829bd55db708381155a81a52c2b2b4f67796144d965b2c8d38908aa8f0372c3d91e0559aa37365a669c661380d49c107eb60a4c81440c33ab19a71234d167f8a89dfbed148ec217ed97447ace156b4537e0d460728b5c280385c65d313be39baa27ce3f44a532fcd56577947b2edb9bb24c95b5932778e2a6647b2e9bb4df2267eb0ae8329ef9ff284191aef781769b9575becff7d51c5d028974b4c3981c4f4c7b0fc47614d2a99791868f6331046603f3a2588194fdbbfdd998f8049a565bedaf51df07d6892174d19b4876a3f5b1c4f7c5e414373a2ad9874351fdd092dbf8f6fca5c3c645942809a341e7c16c2ad354c759dd39a81faafd4cefa27aa40a914d3c4a5c0419d12e10e039e1166564e1dfd0d1c11991b2f7075c212b69e1b2b1287a387a133a7945213e6d503ce976a5aaa58ea3cc4b0445b24a2c145bfea82778d1ccd086baae94c9518df7e185e404fdeda70e3b0f2dc53b1928b977cd4d9dfb526cf374b9e4b34e740e4bc975f1ead44b2632e1875773861a996388d9566c8037d19943067691b9d7a429418d5387314e69454c91ae403f99d717c92eb0f78fba6228e61ae2e7d01caed2c9fe645013b56b9926db39f0c4fd6d067c8b3b9c9d0bf72e040195ff6b7d6b8bcb5b78b302017869b8690e2ca1a728c1e17d9d154ae12031f01129fd4e955090f31098d3a1655ba9b87b307a9c2c78af427e7196470eb453410ff9870e70669b60651a221166ba6299bb95571825247aaf92e028c1bb5ebd9915c5215c462c8f4b1dab28a95dde7cf2bd1f5f76a7447dc3fb6521dddb6e7b1bedfd76c53d2eb43eab18b23a4bf06d4503e84054e87e666ae0339f87d1fca555bcfe01459818e053bc99aaafef4d5df2810e8db206e31068459c31538142c9311042036c65e98090f331ed60b0bd4b77f30000ed4636610e83a2a664f2e3592c7144fa89ef3e78fecf4fd4072168168a2c5620a5c60119e48cd8393fded6962b22d5f9091f83626ab1a0d1e47aaf37cc3c647590ca6450844d460c4bd8bcad09294af2f527bf63d9c9457826755ffe4d1494839a39b7aadf80198fd179f99d2260bd213770a450a58b7f4ffabeecb6c0cdf066210570ea29d05b2905aa47413d512980a404195bc1ebcdcb6620b62b120142ba720cdd4c36ebb705bf42098a0afa6b4287782b38f514d22b5829ef4ecd30240311c795e886988048f34acc6009a2dd95a82aafed03326905af4abbd258a09f834a312e5366b35b7eeb502ae405a21b5f8b2e68c3a9e71a28e7c2699908de08a9385ed73ef65351af80faf37f78d8a2473742f6df73d2f508cc790c8c0d23539d37f74bfa2a0254fda72ffa2b3acfe4d2fb99ae727738066ddd0b6eeab8907d00fe444a38ac1e8bf63c67f93a9de4944a54deebc49952878bcccab035b0e4871cbc220a5d7dbdd2aff185a6bd5a118a345a29c6c9111bfd96833283b6839664153dc43646c2deca06755095c82098e30213c985dbc15dd1bb967370078c65577a50302ddea93917f2060be444967424c96f6bf3b2dfcd1002138439e400fe3d66dd0d38969df0f61cfea2fa041ac8aa7cf89b02bb63053c040cd416af653ba2e8b7b9271f0f56f0438a491614917de7208e63e4c926cf514fc97a7884602c348dc20d02d14cd5aac8ec0ce7fba996e2ac4a2dca2a347876f88a3706f6274e21a91ff43596fb4f088360d314b7054c25c127840c00a7338f00ea50f952ca8b5cc6c3619aff0278317a7700498a3053c764c0c85331585d36466ac76e78b7dfa88e42ba633ddd3f1491f84a0c2cc1a6d56f78dbf4bcd48c53b9e6234e32d29acce12f06f793634c236afe1f360c294c78feb8d548dacd6cb5f861ff590b7d8041037cf918c25c5687e0c2b69f30bfeebabd6b76024f11fd04855e36b2f5666de151b8b681cdf2d97088a20388f0aba54c08123bf6982b2ee4a300ffc1bf292f25a5007df8b73a5dc5dea2a3226fb400f91deee720601ab4c63df6dc4ecc54661b9a18c93fcdb0199bc410ee40192b9608f1000b3a986ace01e7823ba0027cc1544ab4a003650d12af1227d66db74c78934d7216f378a3d20711f15723fa7b4bee9a880a1fe5060282738b75afb5661f95cb7cb635f42386dd299b28b9706f6c08b0a10cacf71fe250bd90b246b430972b6cfd8a5727b62119ca3afa9918aa36424121fa1ea0638cd4e4c0200585c1023d5127e93cf585a05dc7d485fbbdef7b68d6911d0ed0f4ab6be285a842ddd051c4958d8d9d89d403560b3e78a2d7cc37d08aac26783f31e607dd375f4c552ac477809712073838d30f4e57b24e729d580b781294d763b25c7d3f55e34fb5ec46922d948d2d364951129ba75bbcdc8592a67fe1355a5a4b42707d14b938467a9d43c5fea7a2ae564c0467281a6e3ce255ab60f0b7eff7f7f24dc7b057f2f02fb5479dd954f90f15063d1b4db248429d627e8f234dc2df15d639592e550b3915c7d8ad4e9e7fdcd4d43480930c450dc942630f3238c2e7b176e912e10d7ba2c590be9da0367e4ce7ca02c63a23dc3e2aec3f6e437fcb0753447260a556f8409e24486b2fa72ded0c624b14b0c53313c40244942de5f76e89cc44f1cd62124f48d18c1a0da12d775e9c40beafc8a36770863c9a58952e03ed141240ba04e0dd4cf88b11507b9bf58bf4746bee50cf3792d1af80db365290f25837da91f429a3d064a195876158a32c6ede883a0e245951777c163106de1822c82f093abda3ce1b5fcf61a77972af3de3f7e2892ef55dd25d25f6ae7df6b01927187925ec17feeca6a64f00c64f1646e4d3b52cf75706bda87454d01115b5f67202741c19b5ea04a3c9ae94a999346ad0e90c74d519c4aa4acc6a4a58affa368c5b66afbde5a6b0f7c4fd1bfb24dbce0df84693c0260f22366cb1b2d2aa24036ac494717f296bd1f4b6ce8e75a0451910c3c3fa2a5e48ebf0e25cebfe2738a50b44f313e9486e6ae1e50cac3f20229fe1934a7005665dabffbc725140d13788984a5c12b0c8095a648699946bc37ad362d2ab79a84cf8d4bc0346227a52b40b2ef6e7f1047bd98022b88e71767e8eb8f61f70c81436bbe0a17abad222d0010c26f5b0f26d4b28a3feb1eb2a34af3ec491d63ff6a7da0aae0fd8ead6977fc02b61961cdecf001a6984e41fe7bc0b9a8ad24dc6f3789b8d3eeddd443de6bd3a12abf34ebc2ee7152cc298369f2720e10371929b3b5c38e9a6d7ea91aa4e14c00115beb87b0aa0464eee762d5eb474e77a11bc9a8fe1462cd018dc18060dc3bc8f0703178b3177ea984321610afab35cdba70e7539a8120460383d11889645987b070c481a35e713a2db71acca2e9d06046a41dc2fff6d4d9c916443b5b83b7d99fda4a3b0998c292787b65e8219da5edc0a63488a1c04c37e1ad4469a2821bb38dc9467f05b70ca3f26e640c9b14675042f5125c54b060c70b3f1264c61d0fd0479034796340290a7230060b9be7969c07dd2fd7c01dd33f8542c67665266e51f59946be712209e1e8bed1847982c4788a20839aeab4cf35ffea55e9eeeae1eed2fe8566c81063f3fc8179dfd25004a41e41e347012c2dfe66809d1d659bc6ed1e4a0977a229ad8ecf356105dc845c1211758837d55fbd9ccbf6f7de4cf0fa6e9423e2ee376b303dd4dca73b490eec3ec7fc1253f4fc898802d593edf976c9b38c5d1f9d37d0f7e6d5cdbac952664913596750ef5805413101401176be1fffa292bce4dfaa2261300a0041254eb1ff38a75645bd4c1ffd0446a281ff6f5b1bfe820ed69d32dd47f8cb6f81843801e0f2ff3b52c103dd60abbff87388133e294c9411fb777bbc9818e26e5b80eedc054c40282b280fca915e313c911aa5a0d8f0348ed7072d0147c898f2317b2490e16c0cdf0f3065c035724a19245de8926f3647db59850f32e8e29fed16aa27df418ae91f5c93911aa0205a29e9c70aea54db6c261a569a8864f1002e89db5bd07ddf76ab8c00c767d1218f40f3db05d211f027cdf7debaa0e731a95df72381ef094df45cb9ca0ad7a81ae600c2df4977fb722de929c7f0922f41298f1cf79d0ae17a3e46a6e16cedff9490356a5d211cf8dde32f949b649f493065afa31f1f34c325c425132d0b9baaa196b8302354527579ef2b759eade6745eacbbc11dc4219cd6f1a01b9f05f82952f8233485c9f57079107a80aeb11def45b06c5b0c46a3c7040677bc09de93c9c3b21be4877e02f90f01e77492f25260e3ee9764df120b830c48376c86d206b5c0b2a4b4311b845fe757b7522f500e92aa636b539c14c01fc2c20fc956ceff9b74fd087c3314dcf81ff8e24c06adf0ffc669634bac29c1cbc0d142588bc3f52de2881b6290ea00750ecb9b2a9e204d45102405fa58af25c02166482632df5cc525c751ac1873aeaf9cbe6893f494c999b4bc2c68837bafa865949bbdc3c445290f6ddfce018de6d9bc19ec01931b1c1bb918f34755fbbd61f4bbb089c60cf9b14b169ff0a077754b47a9c4945a12ba50830f3fae3d6fa0e199f5a77211a942351979eb19cd1b9d97ad5bd340873fc5c19e7a83028fefc6f571883490dfbf1bcc41e89c0b7a404ae77b6b2318c17813d9f0ff29b1b147d49cc7553646feac11a47bd2a20c59eaab4b730085f06c0e6d19fb26922f1ee1f05328d76c7e11f0aa90aad0f7aff603d92d3d5eb7b99ba39ccfad6ee3abc1f400c2d770b0af645bc652dc6666bb4f24b8c93400179e52862beb6a1254c97ce6e9de196adab02b623ddde97d3cc766173290cded705e1a8e81519cc19836b77bda6478edb5ea9fa41ef2ed53561d6a4bef3e62ef84f0ed339b1eb4c9a5677644b12824557b609541f6690976ec64d7456dc1d712ec6fe573990a63537742e586d07b7a6d5d6b7a4f2ce3db2328905014762c809bf622ccbe50ccda3742ad30c9c4c19895b5681e6f338b92895fdc217f2bc408dd02502f9027723ca9b8640abd22b39a4332240a7634d9048838e0c3f5c18acbd36f6f87e8cb9ecc7abbb8089366a7d5eb6c3d01a7842c4af95fd11fb3c48a793e2956b3042e8fe14bba5aebd16b71cce0d5d892645ab16ab19da271bf8b755d4938cdacac96e64da98c20e29cc4acfdf1b4f56851e2d80e1dd277e1fd57c86d05340b602fd52c8059e3e3d7e90b6ca7bb78087c0d1fefd90b1a17a4db4cf817b33eb1d507a83929f9099c169f67c27eb6d83b85f48da368c4ab28db4a76de41bd9967f55e0fba0a4c55aca8222a3b79b53a7cd58a462f6234c2d210c60a7adb9d69370a20993a7fd0e60f22c9a0c84f3c4b8404f8c09a47f412e9456f8babe3c636f2500f28d49dbd3abe8678d4dc2535af179d4d2dce797e0f26881cf05b0ed804922dcabef989484114dad59acd856edb10b41400c10dd2dae21503072d95f2615451580a6f8e3222dfb890d5dbe27e41b46ae2720546ce8947d2e6c8866e7467366def50ac1f37fad5169d263cff7773dbb35f8b563290a2229df50a8df80b2841ed830a81e21ffa07f2435b0652bb8c51a279e60816aed7bbfe5ea35ccc2450eb2b3fb5728bcfdd1e5357ceb26b597bf2b71872231a136e67c36845990d8a959035456032a63d67a5a30145ea503994e4191ec1e2aaa874b6a029bdd3c29cfe5f63c1694a45895bb0f30e2c0a823ea2fd6918ebd058120d24bf33f000cbd49fc7ab310afae7e6b5ab39dd9481695cc0a48eca57e98a0f6edf52dd99b6cb9a59429a51475077307a907d099497bfe9e821dec58885b34dc62a1199ec80765f70df91ece8dd6a03c839ce9b1ecb949cd63268ee59e7a64b0d670344ff31a0d3fe4c73e9e6080cffc5c19cb9e460334199c3a78bc1b2e2e48ba5946506f7a9e8b870e560de892cbb5e41a8ad262c245c9e55a720d452162b96a66686a6866a6ccb2168b8b926bc9e5e2e2ea2f5a0708a00ac46a535b6538fee632c3bda79cbb56eadad59ecfb44be9071757abd56ab55aadafbdfc9801c9e572b95c2e170de887f250ae191a578d2b860ba929caf52ecfb514d3329454f8ec0411bcd4f9f3b3e7e745aa5a8cf7776d32f33edd62209583542c757bc80191595c4e539d5b696e37a05c6568af3f08e7466b50f24d1c0886542ce34080d948e0b404850a25966035a1f90915d0da63da63271858d37e25d39540e6655e93e156503c009fbf04503c003f7b7982811f76363054e881cf3a205eb5af407bdc8f36f39b0e9ff619ae37ae57edf9db88423346d51b29f413126fc00ea73d98b781049d9376a8da62d29e3b92f6dc6d7ca19ee448edf9c6c4855a67be7f659329eb3efe2dcbba8f5ffbd3fbb8c6cd6721b1cec73205fc6ab5f2b195bb130cdb84e924242714a93dc76213047579c1d23bbcf26f2425cf5c9eda9a755f67a9ce318ca53a9defa9786ae79380fe01d37d3ca7ee536d1d4472ee6c0cd18f4e28b95df21d99b70983c6aea886a391e11ac991609ac6096d6ad9fe9d5aa0f72eef4e2dddddbddd0db7683c4c544a9807de2e2a3f90de591f13892641c15ee63faf2148a1f2cecc333fceea6cafbd6927c6f3f3f44ecd0e7d7ede1dcc621cdcee803755724de8d3224f758aa974915cd3a6c970fbe3dc3e5127e7dc1ed128e2e48473ab0326f3098d829af227a1981cd023e8e6dc52716e7150316ebec62fb3859e34de3c2d736e6ad9e6cc6cce6d13319e38b746158339f598266c621b746e8b284e14fac1189b7308f0817e53c6e6dc01686824cdd89c3300adc9e21c8faaf1807ed0b91d4ce6131a0545c5b3a27ad60a9585733d558bfbf313655e724d64ba7ec935a1dd760bdf66b3395700cac5cdc6a43b0b0f1695158fca4f41457902c40a6a1555b138bef8520c2eae2d6973903c65e5886873aee01d9cc4e2e8ef25f848edaf41829eb039b7332305cee9987840bf89c2e65c0b262c9cd3f14d709b7304a89333bd0c87c3ff40f1d7b83dc7b429e0f838c939f61a0aa71ed88d630ebbcdb91cb4051ff4e05df483ceb1508344bf89b339a7faa2699173386a70a0c2e6dc00ba702ea79ab81b4d687c6cbed0af860ad114ed6d4ce8dc0d19977302d887ada453fdcde449eda7e198885b2e88f66085cdb9154e3882b7611ce4362fb5f151eb508ca3f105dd0eded89cf3b024657171692fdd45fb80e68bc780e8077336e70240e96989016ccea98063730e00345a10aacd391c9a1816b0b03997c26f3feb51284a592cae88cce3f03f321d94cdd2a9fe66a22f9a2af58959fbfef321fc98d75638f598a9ceb5f445b562226e716cce97428dc7ada76ab8754a04b3be3d3ba8e5d89ceb564504d89ce3e83c42bfa96373ee6990b02465e1d8c5b192a7963cc553d47e966271d07cf1543f0be80423d06fb6b0615c13da563ad59f718c85e324cec22e14b8078ba3df3914aae909fda04d127636e74e989ee27678886c90406980f563a2130f28d6cdf6b4026cced9548c6b32f3936322a6d21e4fe954bf9c827eb06773ae46c5b826f425c7454c45a66322203467a3ba609a01415a0cef88d5c60bfa4158dd7fba37f48636e0d3de81f06f1847671f7be4c36fde617af89a16398f5c57ad6bafff97d307a8fd156e8e7f370f7ac375e56aeab9f188df577fe7c19bb3a71ed039ef2ab150e89c066dbc58c85b64b2621dbaf70ea0f70e189b9b717c9a9c01e5f7b8bed19b3bc640d3ba09cabfeecec528bb5bba43e85cba4008210c1146e8485d60eb7c44e0af167d1b07be38ba75f7d2254e8de30df30e3861cba97295ef70159beaeee391e1a43d825150e835bdc39b5466a1ca2716aa3470fd3889fd0ae5c5e124e88fb168dee1244ef5735d15eb6c7b9c456d156c75f38e95d1575e4c4a6b5037988c527a49baf0d07d0df04244514a5a355a609dc510c2a8292cbc1861e2c50701e4404f758bbcbc4005197891818cba455cbc1c89777777bd07e70fb5226887eae88bde689df87d80d8d92cff77361d4df1674ee8abb808b63f5175d152151c8a8a54b9010de20e2fb943fc886508b14b0e3b4001862b2a7191c312e10ae6840653d7284912499e4cd102830371050cf08570922cf0935c1159052076eece76842f00156adf50a576078ed73c6ac307e23562988cd371f8bf19a7c296b638951fd6f0135446a11d028f69b9bbbb3b33bbbb4b8feece746803407c77976e7436c18068d105b010e5e66616742bd5b12240bdf26cdbb62c7b53f7e33de53f99fb28636f7a1bf9304fe427eb6cf8f4dadb48e0f4da9f3a1b6c03b5fff43612e663303d8ca9c3ba184e359cba205ac79265475459fea8fd9a8f8f7f5201aa9a71369889b3c13a096c6f83fde989fc642f01eddf068b61c3be86adc3ba186a78223fa66f55e5eefb51650744556568cf67f061ee6ce4f3dbc8ce05acce24b074581d56c27afefdeeee1856dff9cbe6388ab23226d67fb9fbb19c0cfb31b4e72bc38f0fceda407bfbab045b315a051fcc48a23c3e1ac6cfc3a30b4cc6d051162e35c6960ef55bd7567494850918b78a8b1a8150e3df88b2fb9b257e7eac5facd84709b335a2f163e499b2e3a992072e9892648b4d0c7376447ef6b7bb522ca6ae51932c6a7758f74dfac3a2dff415c4000911484a29a5921d322600e580a48909905026a07062d54f7c71021efebf091640a8b6402285d0a2c3115478d1610b0d3a0a2962600458e504592069a2a5dea8a1355ed7a889154e68cbcdcf809d9dfd3d39806de03e22bdf1a9477cc901cd1ff9918ba1573ff297fb4a50bf10c0daaab1f3ee2b410cf4477ef16d1460aab103414c855d13f9eb83aa7a9fe655c542f3d7c10d5f885054b78aba39f0c2a546098f66bc25a32641ac24f9e32f6164057dcc43edb701fa98090f7a4a6d278cb8a27af7b1d26c2c5c8dab803210cebbbbb8b104b19cc548ed25b5d7df37f04e06b86dd89e2dbb535d3c3d3d3972701c8dd861a0f3d99ce6d14259e9a7b99d6ccf3a8abfb8cff6b030b03dbbcdaecd699f9882148a39c675c03b1bf9fe1fdbc82e067ee8e37c54bd93b67648506f43825f4b010a9d2aa03f54a420b60895795136ecaad50a0a0a0ae2968cb0b165a32756b539cb4b9be29f29a8fcdf168157d4abdc3577a94c4434b9b5571ea0a500853a11acb3ed467887e7119aa4f22f2fa9fcaec3f6cce7ef2ebb3337c56f43e5c9df4a73528a4211050505316fcfd3c43fb66e3db55aadf679797fff019bb31f143429ea9b835ac789608f9f6750f959e096f3cfc9cc44ad266a2566a1ee100d910f4d6da373569f1dd42dedbf0ee22a9c72c94e36e5bf4d6c133d3d3972701c0d1adc921dec5848e3b8a5853ad1f6c0f7f7d76a402613b210b77a4a7bfe454de479d0c32dd53f460ff467d51e507b9d05ef2cb7d1f696a2edc1de86af504ba046d002550595c269c81e7b4d4a295fc3ae547e2bb2d002938f715c8922514f691da5a5a6e2de49d5db4b94b0e5cf4cdc280653aaf313db93bdbf133551018a7c9f4062b985663df889ad90fbb88adc42f9e57452a3d5b18daa176d4e134a5390424d2b45e58f2888c8777835dd79c5add841c0f49ac641272a47e4478b5c07606783d9605d0cfd3df810f0518d1c1f55c86dedf721ac6794a0f5c3ca5159541657d2c6e88162bb9caf529042b3ba3d337b7eb66103857228fb5dd230bb4e82e529e69ae81f5a89a0cd518259add36a9d1d6a1d9bfd45d23a41adc384db7699d59e867a42f7d4a36356ebb8bb43d6a232e44056b7d005f2d4f2f2b28fcde1ef1e720be5b81fe887aaad04a891b4cebac01cd81cf6b13dfbb13027a528d47a1116ead7409cc43f27a528d4ffe7f1764db439fc0ee4abf6d8573bfbc395c50de4acd9a720e452ed3a84973a80ba46432c51b5de94e6dc02d63e3a3a6a94114d62a72c22e65ba8a7a8f9654e2527aa44bd71059402142772c5852e872e560a4850fa7209efc415f32fb3b4616510db637afafd72b53dbcf207a982da520719c4e62ce15467dd278be20bb0ee934ac0ee93466cf749225ce82a579bd38f6384d20eb573ebd591efb0ab8196bfa0bec609fde2172d58c787faf4302fabf00ebd82b282816416b55f3e219dec4e5c49a3f8257e9142dbe39b66caa0cb7768bea78ccb559d88a6531a6a1da905c3749fdcc2c8897c2752147b353a510d117465d8546f922bf90e7520fa8fa2be4936d4fe5e6d8f33d2f6ecf397dacc456dee52794b6daea2f6c7952bb9922b05c09536a73fc6b81e520eb2c0d2f289dc1c00218b2bf90b2d9dd48e4ad854b752f003900ae04a87da3648a12446628e5fe2176050a9fd722585a2f40ec792455a678dbe78523b4a24416040513fd94232022308f5934f3e0954fb393252af1118536a7f2cb283fa451e221224107018aed43a6b34840a6abf7b699d156abf73f207949f4f326c4ad0fd4d09caef10908fc3fc99f99898a72fa3c37a0d7b882814a548744e4a55aaae407b5df3343f239fd854bf14b5bf0aa5ba45c21c6a7f0dcd8c944ea4112a0959446dd9fa47a1565f6aff4a0acd2003735e6391f65a0ac52f9bd32fc345256c0bfd948b602c01fa63b818c6b2d06f02a211287e59b9746a2e8af6d2aa58eb6ceda56269b55ad9f0b3c44a11205793fa39abb6890913f57325fda5f6c36521b0d47e9c661254fb864c5d1a59e5d40a75bb1c75bb9e8a6aa2ee6b6e05eb70506bef4af0ce6ca24af52bb5df93f01f76875b9bea4715f1b55210b5df83b647e968624747be33f30dd37d936edd87cae487a25dccd73e6aafffeba30fd68f839edf63a5d78e5ac7ad60cfb1b052db7fe8209f93d25652f220131065a1ae4382a600857eada4a4a198a07bea74a05f077590efa8828e1ec0eea9566d0f7caeada4a41463ec3eba425dba297e5e4e6dce7e9f3a4606da5229a59473e54af98e75b283b07b50d5d6d322c671c58afa8227155279c1120c6050210cb8a85015a5385185922258441942f203ad547845cb912184b8c1d5c5163f108a20c85042b7f20ed3096416355601000b02c1aaf04a0ca290e669fc385ef7d57736528ffec5213254fb97e3f83c1e0742fee6f7719fbee1a9452aea1cf8e112c40227f343082184703e67a6ccb565779ab529ffd9858bea4d5c2bd81d6eb50baad3d4af5932a8fefca4394a7d9e2cd45e2b5b84d94eebce6404ad47726c38438d147600be90b84e57cd1f0ed315e55ff72c4d68821236b129236cc2c464844d684213fc1d09249cedd1da4d0e3388b33dd3835128f4364e1cc6f1f90d1e38aca3539df26a04b039fdb1f3ce9398c4a2d79ee76d4e1838dbb34daca71235e8c8448db1c6e78931c6185315fed60005157ecf18638cd1852a460405810809546cf9899da5c62d6ac46a8c31c61b75594a961c434028e68c188649214241d7a0803c157d67a5e840870844d19212450f11e081d2cb2e2855ab8abad862071981a32f9dda5547e009a04e6d8da927ba50c20a5350d30d01d0820715b878f1c30bbc60b202165e144151188dba454b10a2c2d6124dca0ff55bf85ceccac085123ec16e0e413b104695dcd9f8d8caffc256eeba0f7e0888549f765a5b6653fd348ab8d40c28e8477d053ce79b9ea1474c4e547b0a80d5d4c1d9bc5009e324f562bd39243ec7249ac6eb0ce34f7f08b963b7504b11df414a29e50f5030821720615151855505952baee400042b60384141144140c8a658416b872794ae8851b4608a1e5e43614bc056498e3046080097141900200846528600c011c5ea1a4979c1f4a72ea5f420a548fdbef20c623a5ef50e54edeea851942f5555d7e88820542d46b9c3585aca855a90ca1f3dc98e91e00ffdd86584c414779ec244acb6a2c2671eaaa8f07dc0e7221d42d4f4df9cd23aa687dd42609d3f613f44a9eaee6024f6e13bbcfa767807d3c9ae7321d67e46e21dfdc3e2800f77d48f5d7cc5d57d2aef3b0c728783f763020ee3070af69f10af3aa0a08b650f5f83f1e32e60ba0ff57468534b5424431847da9e609cfba60386f43875db1eb7752bc4abf6262e6e409b5ad60cdad4d68a446b53bbfbbd9bb3b51765377f92be2852fb073e77c1406e6a3f3f7f6b7d6ac23dde0d55054880f3dd78ab03df91000bec7cedfaf2582bf575f8e985e8b54ebf00ab8f28b4b89ec9b471bc9e694d23a830fbc180f6fa3ddf89a153bc43015e60e8f6cec7e6f43fa13efc7df80560e22f41f14585eac1962da4173d4829a554819722546104282e20c2059d2404138694219a8a2a264802bc92859222f1e33671c5bc1206108e6843b8c088c88a14459cc00737cc2956469a8afabd0f2d1e27bc07f55b24a4badf2a1da1a56e171f688110aa68b9c1122d48e2c7b11c61a5ba472104510a8660a2080b58f0e3af4ae1080d848c8c8c5870c38fff0cfe85d6353a62ca1147645a767b365effad3d7f17bcef5437e7f48257f7d30b587517e00bd9e905b9dc524a97129a60fc7d7a6e4e3fbf8908b46b3f991e802350adaed11142d81b1d11449552055a943c95f24265ea1a1dc13a0248059de8eda671bcdef13ac5af52f114151d1d2121c9d87da1df561f7513655c0f821d4542f977773b082184104208216466ee7677a1bb37ef36ec61629cefee32fce973be4318338fd9c4a07c87d9c4645c8a02e5668f2d73df56b185fb37dac389c9fec9e35aa4221ecf3d1dde411f150f8ff612f0791b17949188d062988d8cc0a1327ba89bcd41fd6eaaff5052752f0249f522aaa83b447ebab97768da3069a8e7ac1046201f9610621d01a38a255354f80fb1183101054208e1a90796a37e5b0e8690d0208a2a290a5bd48c410aa0b8e0cb1660e030742503362842020a1f562084112994cc304b99c54e477bce037a315a70a37e5bc56680a562180d84a818851edc2a5b2c11e40589269696fc402427a298004e3a37fac333685529df291d5aad563b1ce105cca473a3d93eb1031dac503f1d15f2582a589c7051e14348045185464418c9c0880c7cf004880a9fc7e7891315be0f1fd6088aab2655da3a271acc099d60590192a7763a1182110864594ae221b1850d50758b8e0045b5d28c8c60c1beb0d59f856ce4b141961bb22fa43d66e6863437ff727333fbe021419613b2b44186c8204286ac8fca0b32a48656dadd20429a0767dbc9757f743e8a509cda36b406d55e3f1fd12bc4c7d6bf0fb70b226408f6dfee90d6599e9352f6b129fe211c7bc41844c8108fa73d5e0a524377b7c733a4756a689d8f37d03142d426e1ec7791cfb055d7263ed728e37d5a4b323284ba2e33011b5a49467e508178980c34b763f4fc966f0f4de5e5d5af9432cbb239b1971c08b03a1f62523a0c1c06ac7c9a0f8ba8d4dddd2625e0869658fd9c60e0971d10afdf7cc871434bac6a9f1c306374b2f380a972c7455a45d0cf592c2424f41d47696f635ed39eb34d487bcb4166e64c2205e140b043b86e0b5c5ea406b3ede90598ff1689b7188eab0d29d4a789ee2e96f6564224ed2d0cea20ab3d56dd77972bb5a40775bdbbefac2f4b4c7e7ddaa769e6b7ab756a7ebf5bbec3937ea8cfe3a11b43083f20f3634e3d32245de602e78145aa1d8043754f351d92b38b9fa6fbe6ce74dfa4b4fb509eb3f6b2fb78ea56f82d1598d36bbf9d7a9c3ade3856c241ededdb9801fd980933691d5eb5b73f817c27884dffd6227d80dd656dcf4cdd7724eec3ee746b53fbbb9f759f2ba9fb2dc4ee386bdfa609f473d6909f1833289d018d988052f92643710f399cbfe1792b6954fb655996bd7c9f6ea19d936ec6dad4b6507b926b26ed2dfca73931804895add6e12a65c74aecda82ee774ba875be5e62d24f5a67c906beb7eaf2903c3ecc25a04832c00717ea4a5ae7e101647436fcfb23e3f77765644e640c3fdadb476a269dda8f5cb7322c5a75f96568cf480333b4b7fbdc7dde02121894df1ec6098912c3a694d23d761edda5ecba854bdaff407dc6d8b967d3e1cbce3d7670c2d8cdb781e653e343b8df8120aafafd00a26a61b98f85baec39eac28f4788ac0e39fad9cc1a5ba8df6e0fef3e8f70dbcb511bbee6de428d1f2b6cd96d1c39288c4125a0220c5457f8f0a8fbd204384cd01d361b6a7cb871c2232a61c224e878f1e85015c173e2068e14aba3bd8552aada833096a0db9768eb1be37f83aaa11bb682083b1d081dee8e7686ee0edd89488e476032bb2123460dcd8c0c8d81396d5a669a37ac563c28254d89c51831d61833bd4f9b30e639e7d6850959c4706664680ccc69d33008fc40a2800c491998c105a4cb15083119a974dca360e3841b9b1a34503364c4a8a139c26225090a5ad26a11212464c4d0901244444d141555393aba828464455252162e97164a4a4e3049e70ca537287884224c663c37363568a066c888514333234363606e58ad8c00011d61b19204052d69b5881012326268688a92942c624f63604e9b86fdf8142dc0c711047e20558007ea42289b586366d6186a52ca8e060d4229a536a1d4349865d9369526f59245ccaba19991a13130a74dc34c33d6d025284609b1a247c1c60937363568a066c888514373c36a650408e8088b9524286849ab458490901143434a101135515454e5e8e80a12921549494a2e083119f9f52f145e365e27bc6e5e36af1a2f1a2fd46bc64bc62bc6abe645f39a79c9bce82be605f33abdb697f632bde62bbea494d2a7943e6334b9c7d8d160828ec5d88ef1438fb086eacf32c687f26394cf9551e093164c663730a74dcb4c533260ca528cd221364d28fcc7e3ff3b00f7df1675ff6d134b2576dca360e3841b9b1a34503364c4a8a19991a13130a7adcad1d11524242b9292b27069a1a464d2dca4b9c91402697a8dddf421e82ae794262d738f99d330db7bcbe0e61daf87612eb3cfa64f475fe218260a26b3f87abd5eafd7ebf57abd5eaf215f6e58ad8c00011d61b19204052d69b59e2879c164c623be6cbc4e78ddbc6c5e355e345ea8d78c978c578c57cd8be635f39279d157cc0be6757a6d2fed458490901143434a101135515464456935a4a3060dd40c19316a686664680ccc69bb61b53202047484c54a1214b4a4d57a22243444833324209df01f8f8dff7a78d838e1c6a6060dd40c19316a686664680ccc11162b4950d092568b0821212386869420226aa2a8c8cad1d109ac19f9de29927d111ca8093c8c307ea0c4c741f50365fe37e99ae69ca1f406857a08461631c905f3bc1c2a158f2e72c5ba2123460dcd8c0c8d81396d1a669a37ac563c0001c5e0998586c9ec690ccc69d332d3941590c115c3d80d3730a74dc34c3332c0c789a50e8a68fca7aaf15f0e9bff74dcfca7c373635383066a868c18353433323406e6b4699c24286849ab458490901143435388888a6cd85484c92cbe5eafd7ebf57abd5eafd7ebf5ca5eaf9764254a4b344c66386b9a7386d21a2854f7bf82e7e550a97a78787e7c8a16e0e308023f902820435206667001d90076b4c264e6c557cd8be635f39279d157cc0be6757a6d2fed95bd4caff992af1a86ac260ab89545ecf41f0ae6bf1a31ffddd0ff6cc8fcf733ff7534ffe1d4fca7428cff3c19ffad30e3bf1ba8ff06a0925c503364c4a8a199e17a78787e7c8a16e0e308023f90282043520666d8b86f034a34045912c1901b562b360204c44798c54a386806674f3099c535cd3943690d14aafbbfa11487344cce68ffd56cffc940c5d7f6d25e3550a8ee7f054f7239542f13cbe70c9a583e67d004a18931c69e1707d65d319618f6d8f27c3c11091aefc8fe9bf03f53fc6f9bffc198fea3d80e5ed39c3394d640a13ac6c138fa2197c734886910c3b48c7971ccdff9b0e7cc76fe3a176fc02e4a68b3757625774787f0e50eddddddddddddddddb0218410368410c2861042c6b1ce45dbd581d07b4743b82b3dba943a107a775dbbbbfb61175386685d232f5a35092b758dbc4842d535f2a2c8b99bf93eeddc56ee36fe1a6817f3dcd1ae06a89d1e06a6b379000dcdcccb3c09683a09c8689d4cb73f9048e537c51334c524787200063f21b0deb4d7031802a5375a68ec4e0dab68b375761f528f54833176b32b4177b300f573a5947008ab1c080dad8290c3135aae349150828014456b28b5f2c5529ce24a500a6a50b4260917248104126134667d2eb62fe1c77d47653bf3bda34e3d078d7f5de030ea6eceeee6f4360cd31b1cd00f35e1eac7dd77329e1f3304414914b7ae11e1f620b07824f49b3b284f39ca860a14109e6ef6807e1e8fd6b9d13ab1759689708344bb0685e3a9183e0a158361ae61355840b1179a4e87e93e140c46f331cc3c8d4cf779357b98ee9b35bca7b29fe9b8209a51ad63de61defdb5a3fa09e98a3dccc7701f911af37dea11f31a9f5c680e7b98a732446a0b8995761d04c6015333339853f7cdb9751fd53a1397753b6fd4ee38f6625454b2551886614934d635222af2bf0423300a2459832d7870a4a3f84f5d28e8f71ec70382b40653f4c0d81596cb1a1cedf02fc591cad403742e3249f7a6e7993ac36e4c4079e3c137aaea0bc0fe7e00c87e46f9180facced5d3a90767ee9ccd1b5e53e1110015e47cacc33887cec59845397fce2e4ad3ab4c3894670df40ab7530fd6d89db9adcced796d08bdb339a2692b6b6b304a6c9adaa3c466a6c9530fafcd4159db9db92f46754ed5ad71a76e9d4f067f3042df1cc6d8157e9dc39999b48dfb6454e7beaefa6b9a6fdb729f7fc3f63e186fdea142a8c44cda688296d10c0000044100f3150000300c0a870342a1509646cab03e14800b739e42745a329ac6b21c4761180419ea8001c010430040000666a4d100d0df795064311ead65739644e40f58d6d7d089910dde5a6450c003bd139a4667ee089c9e430be73a8ea1522c421564652a7fe88484262d4c7de3442e4ef095221ccd1477b1c01742d59e3aa3c6e52e799b1cff4561f37e28ac7fa8340ae0d1068d3c4e120163cf1eea548dfe0bf4beb6593d54af47777ca04379f0fec2dd2023f1904834a15428953881b2ac036fbb044643a4427c471ec9e520e7ad5707e81ea4bb5ba0c62270eea9deb49f2f50599a0e9c6d610d24017d80d3a1af5301defb70de48e57814baa059841ad02f0f1d09b6542fb7009c8d5a04bc01bc8bd6674c5c8a265273a75554ffbfb4fd99a50221497fb1c0cf988a351ed7adecce5f0d696c3c5a6d394f4f1b5f0caab64af889fab749fd56ad7bd06a8b72d83b1130f942ea13c1a34ecbf1812577ca9ce88a0df98353b6bf924231a30d45ba4a4154174554da53a0e06540ddd5bbd80bda6c712eacb2d393e50256644ca044672ac681d5721d57a3d2b36f5405d131f362d02d360f7086530543bdd056e6eddf7109841946237ad1030cc04927252ec439263842eedde300f25ce859e460148ee615029f20850064bd01235ede6813610c8e1b4cabc0b2d70d78539d0182fa1f40e5e7ef2d82ae070ca3b048407507d8f2e7f7f9068c31a46d093d8b956fc0840cd5ae720f788626094a750bd69c9ab65e7b8035c270dd85ce8e1f1576e0f025819324b9ac586f30663ee34bd12d18f376b7cdf40cb4ed162c0d75acb7411c4bb89fd10db699bd050b32b46edfb6b6070ce27a5c241fb61d386cf492097ccc059af8a3d4e4151d119235a768d469e6e1d565b567de6a635441691c91e989be5333902c92ec5e6cd308b17a601a8b6fbcec7c83d96cbb208671c05380771a8d0b0c3fb01ce3f1dc746f70d426ba00501d3f5dec5202669d090c68718fd50413988a3736373ec778e79210a88896951cd1e514514a581fab28c82f151e4da366e94782f3f1cc0644c571be3c65830a381fa0364adf7ce615553fbc65f8f26a72f4d6fb6c8802e65f61435ca39db3f85d08bb1f76ba6c8c3e0712a57d29c52e27e3dfb34edbc418de55a8696282919a75d60a099e5817c4d81b227c19f827ac932a455832c5bf4be1bba015ab1742b8b3290a2e9b9c2a7537624ee69173af4e34ab5c49b99b3acdf78586521b7d628addddc1a36859b8f79b8217b781c8f9a4b6b5827b9a1411aa811218fdc68b5c1c0678ca25b5081c0e3152db45eadd4e8cbd613bbdc991b758dd7a5e765a9b0cd76ba891f5c209e04be9196809ff53ff3f22632d9b47cabef33078b50740ed0f2a020bc8e1eeafe34422364d82264cc67994897afd3465dfe7944a7bc6e2a997e58ef464802fcdee263af90836a2f6456aba9cc6bfcb329d99f17daf7ff2a909b494ce5df9bf31ce92bbc7ccb9e732906ad4ee29a87541ee6d76349eccf5c9d7c0814262d4badc4123a4c6456da52462decc5c576d7df7858901dc2d0dc4e88c8712637cea1d1c82ade48f21dfc7ebb2e7e574b54cc80eba0634f80db44d8dbad324502308500c92e8eef143c24328020d45474dc3a0cc2bd01ea2880f1be68222e47278a9c6fc9382b08621dc09b4729b04c0f0e63d240dad460d77ff87d4595350c42eb728852205a312d2d76990c9f1c8589fe4f5b130e2194834cdcb54bb388c7f977d7a138e3d9ff8d5caeeb69268aa4b9fc0d43bef0c71c3dbcd5f1624ca8388d0b2805287b3f16fd9a66136baef238a7c3280add275d7ef67c499c4f69a30e7bc7f668c2bed1f33779ddbd78c0dc26615d33e7df328ae240e8c8fcf4ce12012810aef8ff1cde2e74124317de6ca06c6e5bbb7a182ad3c47c65067bf7135b1ce697ff70979407b833d413c20ef708f8007b0371c9e8db0f939ecfe9e184a5acd59e91c9d118338d091aa496bc48dd9d280ae2e67272dac33c635f0a1ba7dbaec6ca50c351344113856a3a59b731fa4667cc076c0158307c29479f835bb30b24c4523cb12808b0eedc8e31e260a18082814243048c902d9502516e584269c4fc8e50a923dec5ff2998a842f9ebc68a435962aad1b0ea76b7e793a917275110c2741018cb14be13ce6526387427d424f1e13ba53b4add431c9349f50b3c61f3d8145d6be94aa1b38a8e89213b584e434a1d253546f1617772f5e838c071b9127e40ace55ff197b06f35d83245b85ea3de48088a4bd2c4597f3b16fb3a7c36cec6d56d7b1ae3ad5bdee3ad791f54533837cf5a69a32628daf4f4729ef062f0a7dba733b7c8eb1d214936c081c953662ef163e7f0ef3ac14ee73bd0ef6c2049e1b0bacc8f69514a06b623842675d886316682a7fec877e8fdb7e0ed0eac30edfc049b69a97f05533d1fc3b387705fc2492301889e45595ae072f3c8c7eb33e420846a20a5c82b23668940c50cb45c23d467fb1ea415cba14f47f037a70ee9f8735bc0da0003facb729d6a0d0c8ec68413ee73e37905d0bc6de20c572880da62e3251ffb982d41c8f2e90906532fbc2d2a7d25c6747b0511a9653a66f7ac49be061bed33989e6f61b6c90dc4be5bdc3be29e1aeb4c1a9ef16a63e094e6390511fc83e453f3ea7c9c69d8e1b4b8eb7185e9db238b3ebe78810e2eeb7ad202bcff13112d149f469f42474bea1ab1b469fb67a6fa51577e5b8ba236d484af528b1c59fab24742877332ee36c2b08022aba9cc045685f7e274b3ab3c7df070bf839f6f3aa7f978549c77b6daa1de3baf7c5921f4386ef2ff34066265667e2c45376700089aebde43b96749b8e7fcb4a5ac0119fc22ad2d841b284f0f63f353c88fd675a0f69aedfa8c5f655b6caa866868907981936b27d7f19619686d503d90c97178534ae06ac93a59520ba355be79ccd1cedd67e15497a3c997c443ec9658b23f1b5f79164d52132b29a612c6723d1eb5ac9b8fa9f21e760f1d2c142b937cf45b41e068fac75015587e3e36fb249677e54df3fe83c318075450f819cf4f4b843a55914ca0da4ea296f3f1ff1a510220a5d8ec022b45f7c97acc9a07e477da97c98ae1abe554431dd3ce5725b9888549e545ba8ab119cc04468b444d5f11ddfca9cad6e7c4eb6f3b9105d5d57e996b4191d0e3407e46d068b36518a1d6ea0a3b52f7d87251df3a36fb24a03f7c5db8c5c6302b94aa5206179293f052dc9b3eb7aabc04b4cbb80848953ed738a210d7ccda514ba9cc1476f3ee61d96f4ddad8ad5514f76c840e205457dee2ed0a9479217e90e66bcd8c31079dfd0bd32111d8208e3091f20bf4f6f4332f128b596086ad7af5e09de29efb4e7c07e657f098fbcd34112aabe7b9fe07accc09279f643e3b8541f16f5ba4f32019bcd54c1eb531607796c2d789e33ec72c23216461ffa8ceaf9fa3d866307c0a8f6e8ad6c5a0b1de239f2ed0d923623fbbcb1dd3dc3ab19e1a610974a85f73b73ea315834fa5a42b2f7f88eaca71d4ba180ad2ad6c5c77d213cfc5d4a8cb2c3e633c4f38b0f9052ec8ec2fa0ec23087d612a77d41a8ae25706f71d8146c30a9276ff05138c6b008cc40ba9bf70f9cd2bc6ec67090291a34232045387e6d696d03b96703894d074ec635d0c15fc9cb736850c7ff4f6b98685ccc06e4eff2dd1026323aeaebfaae06e2b6633b998790b4bbadca9fd68700d9338de539cc53839f6a9a8b721d880bd8d9fa196dde968eef8e37297c57dbda24f3c4def97686c7350027db4760ee218dbad664b4c05b1735c77cbc73b876000e0dab04e5c7a3b34a60dddbb1a60214d874e29bba9155e5cd1475faec963ad9889d4abcac18a2bda43ad971332e3cd0f961263b155b63b19f6689acc082ec27d2b72a38bb609078dc85bd576045873172549ad4c600bc0e1706b5bf3426dc6ca74812025330451d81d8dc643a16817af9e13385942e3c6c0de4302501a43bb027fe3d18b6e156e19aebfe6b0bf6e3bcfd181cda0ed654b92a432ba0ffee05f613fc4bea680446ad040f6d0a2ca458b65c050769f94b1fd0ff492b6a0b6fb50ef3bd9063238646f96ae75a893ae15709aad73aacc2b8a7b8fe44d356fdf879ec319ef9985ad49e17cec4538b4e00bfb2c3d8495d1480fd1f1752767a18ee8459454fce06c8b02450d6dcf50dac32e951453b0c98e1fe7e2e3de61566cd3079f4bac8fe404acf07237d0406210e2f7f800dc2534ee689f48eab0fe0af6fc8e60a821759fa76383dad01a00b11f260b7cbad6079e05eabd455f88e608c3615ae191cd60727e7de3b08ee483d60689edf9bb43f765e7e0c47ffd1047d13dac247f1268d2c8e17a765d6ff48fc1fed4b3bb443605a5ee55b42d54464497785436a0f74fa4669dea8b3921012c73af3327dc75f82126a68fa36b0e8b059e0de4009fd6a20d715fda45227b9c1d82e37007702c52cf5cd929535a777269869596a7766301d9a734b98e9a8c8701e3e1711199a014feba06b91cba96b9234a97e3fca33b91d122db83a8d142202854ab2a3232761483f03f31df63de5cc63b58cd8b61252b9507ef8bddb540dc9d8b776b8b3174dfb65a9d626ab4219b01b1018d9146f59ce21a0e7e386986366c79d2552b165518b868187328943d20724055a8b1cded27b78c287b9494110f2e8abfc61794176ce0f999953ec14992ccd6cf66c85b5ffd798751f23458e4c177ae9fb3c30bad18d0ec743b40924b4a1f2b6e89250695e6d01935e3c0dc9ce3f2c61b062e739390cf475be0eccdab1655502b070949a5f499d59b9ac08c19cdf28c1850e5d2d072bd0eb64c442f1810fea0762972bdc05e69f2dca7de0a19b63f62c1f8bad0b49ea1be7c963d85f51195ce9f1bd0aa38a80b89c22216d3e88e7012934b65db8af45671f79eff83301efe623453172d0ba0cd103319619761f18fc4e34707d1358c32015e5b58d2e1774988b84db402d051572d3f9497e57ba965e3e3cad30a43a1f25ca25b43901580108d3e6170ce01806ae1a09ebd08a04b3e1169dbab9c1aff4cc3f15fc8e5e0eb16fc9ca8d0cf9fe54a5da107fa6daa580e007636c7146ebfdc2ae45a23059b58d90f203b48680743b458c6fa916e3a368d1720cdf07855e13bd1f53e9b0853754827d16f96e2d2809ab3cf1bef14fc37c0d36679f5a0ffbeae887b99a3959b64faeddd853285608e2fa0c9bd35febed6fec065e0d983cbd8c187924757664a8a1a52b2b8239682a5f8d825fc5d821967a86390d3f67f8587cc2a46a274bc406449f1052635c7680e4e9e36f918cf459759ebe40f5cdb278094c7a3fa635c163f922471f31902eed7d9e3cde038abad625f7da1ff2405cfb3bfe5813747a1607bc223ff872c27663e9c8113ac4b81c569b8adb78072b471bf497600deaece3631666a400f9d1d4993bd3ba4a98d7598443f529d7b2949584e26a8740af14e66aeb2974dfb2908a269e07a87a3b6d1910f956deffaada1417e463f4834feb0eba9bc4e7a58344bafa5de615bab8fbebd6c604a6c28f82923c423f7b18ddbb6c0d221a0839a40a9884d694588150112893a8a72f7c1b4984fcc1f0b666d4868b0b6f46490710d47defe952a20bbe4d46929a59086fd39989c6ff4e01f33775112dd31f0a1c6b9dcdd8b1e40c4aa7e3578ba4d29742bc796cc7fff3dbea996345ff02b705e253a16c7400479fa29d257c9024a38eeff5a36f386354167a59e86e7d04bd74238bc3fc1c020d8ef2eed09bf0c5ab03ebc5dac26c2670a53b3545997577faa1e952be4843c1d474001a87bb15bb92d4b919809bdcaaf77a2427b0113d4248e67253782de84f09487167295a3aa038e9091ea44ebc09b7b2e963b73bfb07312b55255e0777fb601fbf2ad561399947d7b55b36cadfe8c39eb7f07a606a4c348d4dfb7a7fa07c989f72739c42e096be1e0d3c35525f4799d89fd26273a32b7e1f2a7e01a83b7e4029e125218276b6e5568d97e7d5f78c449bfad2b66c991452890e2ec07bd555f5c99dd50e59212de51211af6cb6827cc6f9b17381056e433a18e4f3c132a4c6fa4708fcf3078143f80a1559a6d8b9d10a0689f4fc61425db27380b00e6cca6a2b6047de0ad42af6b6b7dd3adff083c0360a6214cd9e984c8f0a48f8bab19ea50a2b93d04bd972a3a04c05abcaa20e346732c91b58a5944c1505ca36ebcfae15ad9c5c0ec3f3cb6acc271be14d2927f4afa1282d5fc7673887d6c08a279152ec4292fa2a7e6a99bf32885ef541c4fb45c9d15b181c8511ed5c9d4e44d8b656374146cad1bd6c602b892a816efe15f4234266ea2f44d45a8abd90b06e54939d05055bec508c5b76017b815c893115f164dc0b9432d6417efbd137f214c8b4370813d997f26f2f0e8c44ab8ea402d6defb8d32c1879aad03afdc204fa3b03a8ad00baa06f5196b4e0cf582ba8e2c110856ff46edd4e524583796744266489d9423e3782aa9b25c515402456613775356028df4b348b77d9fab9612c22285022b40352346627a1388015821ea8a747d8ded86809e215402a9017250fd61b106f216d465a4c6e822f930ae7f723dd1c57a98dd91bd0bc3a94b7d01560477c0846323eba415220177449bde08ed83a2c3504e52958936ca2639b5d8e6a71ca5669686015f1c645e520dafad39addb64f3cdbc510127c4e495b55201d0afc324cdd87093bd90b6f83d0e0404a25d82dc0ec66a1bf7b601f80f65bb70edbd5edfeba657cb077f4969d7c5e323f5719a7bfb8662ac24996a8f4ff1a8762f057fc9211fd0cae983efc840ec734e605f5e6509629b18e64620206d58253bb22bb03f480e42ab31a796e0f5c1ef57625322cfd184843e6bcc2a34c1f58df7222a7c3790433b7b6cbfd47646155e420cdf42dfc1a27c366d1293ad92df4a7d01a81cfbfbcc98a3de66d935c8afe64335bf1480a8af8d443af41b0bfe830b940a718fa880fc74a83a85b7952e907385eef739858601124a21e0f9a4c898b21e04eeaab7c59315e9f40da080a04b94bd2403714ee0caf44d35319f9ca87e1a6bbb5f7810a100f957f95485e85713654d9fed3233fca2ae425c10475ce586bfbd55db18562ce13e57a293b11411363781cb950e8e70e38012d6c02e4f06251476c14a2a30e21f8d950860e20028f8bab834f1efae6c6e81c0ec8f4c834273398f06eac1a065717b58410a03c109633270851a1f7636684415fa4cc530efff811b7e2571760fb11ce09e797d0e599012013e376f2e04c6c68d47cf077ad701153f3ea2fa478348e50fcb2e05a1218e862bdf9616d603a8fdfd2adff361b9fef6f8b19edfcf2c1dfee1fc8e86ee47573d83ac16d7c871877bce5751bf1fb09948bf858d43d70f96347b052bf2054008810e84037daf658b41a34c7fc8678abb1b11eb37b2de8f8389e05bcf1fdc816cc736219bae92a531fdcd671b2ea485b6e56463d81ffceeaf34ba5062eb537249b136b9564b2a83373bc8e934bfed3d8c66ad83f0e5d851d6cb23c18832a22f4ef93e2641ddf13c8791f06cb2eb2017ae72138f89fe1c85f2e57f2438348e6999c0ddd0cdf5438622640b6ee30796a4b4d4fb517e425b1aa9de428eb56285414240aa00a418661b5724124e29d1f08af8f6dbc8e834f574e6c085950342ca7209794a794e14fd583f4c807860e87029112a7c58db8915d116499f0af0a1cde3867eba69ca6fec51a16c8bdc9e750c35181d4f7b54624dc6692a9e083ad55f69109ba79b2e5a7c8706b0eef5df4ed13f955833c4d9949e2e0d44894694540fff8cf50e253a26f4c094f4a176a162a8ba2be16d894b1c4dcc572d01e04e8d3fa6c19e007a0886600ed5e5228041dea74138ce05528cba891a70b935ba81b208001a75e29d2736b124a85a6ab50e440b147dcaec352575167876bb07fba9e06f3390bf2e46039aea0188f8653456b810805cd2dfea5fb7bc626194c123e97da879e63bb3be3b830c86661dbc29d29651e32fd9ef156c95128652ab3a47c6b5fad20fe61d18d1220bdbf6ee0dedbcfb5f549e765ee92eaa151908ef72b29baed959920547f96ecf38fded3dcb668c9c703d66f37efaabc092fdb4594b46b673589c67e4df6a2dde5c9525290f9272ccc963edc4cc47133888733c4bcfae643754f248e984f476e63653a7623808c32001a191fc4ede45b04afa77da9e2524d9b7e62f44bdcf8820c421022116874f40f2338146e3137be335016a8271ba53dcbae0485fa7a147dc45253e19c2995fb68b0385cfa8ee0e7b51b0075bd75d651fe7d3ddcd948edd303d9dd149c607b32d0a90174e7fc22f4828b0403040a1d602dc520ec239a1f6ddf523322c9fcbc2ea02585f92dab2683442d7fc519df92e6f0b0a4925c5224814128538ab53962f56acfb068e00628c54edf44a2c23014629036ac7211e07919f61ca1ec7bdd6d8cdc431e8a17b15f65268d5c5b46b84bc09706b708f62613b480bef02adc1b69a6d5bf041afedfb1015a439e3fd36516eae779024b7e607e1162b1ff69c5cfbcc25210fbe20257827019ebd97ca25b9d8c639c913c715a18636bffd41acac736f050da63012a53f6c1bc918b21b064008b7c952b505e20fdf3e6ee9b3487d92442d100326ea15da1162c12039e7aeb3698754ee526c182ac4b327596514a2dd126671513eb609fe787f0c98e03b048881f613a66cb636ef4b84e0d4066f1608439be18e23e60e42ddc1d423ef57f7094587c682ef243319eb1523482389fcaf2eda2e0e9a635ab67b0b161d8c4612ae2a8f7a465881762b3bdb04203e209d4c3a5a1d307d42af73016e1c4a47140d305e5d3d32df9b6780e7f32a5b7b7532ed50614b8316ca9187ff652744db4e18faf3658f9dac1000d88cf283a3fd0e5d6ca229599e6aaf4f8ead73048d5c0803e47a5516e8e80defba2929ced244a30f268398d2e6aca80367861d605b2b6f7881fbc4bb86d0b6c03bb4704782251d3935d398863df66aaf9531ab00649afa44bc478bde633e739abc7aaecee9387af290898538521e1e1160f9429f50769daf79506e85f3d8187c20d89555cbb5c398c502e376a80b5a5d8f853ae59648e99eeba0672e121da01c3f72783de68543eb9f24feb5d9dced675119f758ef2efe309099d5c33536eea5fa0c5960b9ac90694b498f4eea9ce02ea426d14a9b1bcb9bcfe8f743c69175a6d5f83aefd3b8a60d932c24bd6bb1945dc905949138db8b41f2da228efe3e7ddc80a689e77d80398d4b50f1a414ab513a3f9abc133a91623d6d20b8ebfd2d65d872291099a3fb4c807b087aa0c1902bee1e3501cf16b2ca68898a045e3c70974da81b4a0771e81bd8e54cba3ab409e92923b0a21a569701e95f800d2f061c752c3abb3d8debf906bcad8b952344817d84a486d4828201d84bacde7a8aa2948dd5488446ed65d34c3747b3631ad3e9f16735ffc227092f697a856f366b8014bc69557d6a7062139dfcbafc5c7b1c36662ce66ff97d3778d183693ecab98cfbe941602d6e3c60bf6a9388147a45896e29d4925fc7e12c72d32a25b5b256206640e8fbd7224202e584188f52ac593e13fdc7d4a5e81337af345796bbd65894e0b5e86c19d9c8bba0663dc6bf4a4663b167bc14592577c803916b0d4e2467c1a2d12ac1463744b18af81d28cbe8f822dd51c1201c4275d6b79e3acd08b00f475003057088abf5fdaa30571ff0e62e419c8d086994cb5163abb796e86943142a8e622a6efa5ecfab5041db15e26d1ffa69136f7ae3bb9eed26407385b72a02e81f3a2daaa6e094e5208c38a84624c64f80fc81d7d9caad4b0aca4953b0eee10529b4a4272f97ef05b49630273dde627f6121e39afce8e575917826fcc131cf113fbeba77f2a265f3eb38611c8a5418bfdbd916cfaa06f4b95fcc0ca5d1c6e5bc48cc1e5d221e3664f098c008ab98cbc929299bc6dfb89ad30580cb2d69830d9a885934218be71570c08f8aac52d4e32de961368063aa7f72a913d98ffa0e09c9d377ac42652ecfd29241ee6369a7b3f4b167f4d7799ac227378aac77aa1c431796c6cc27a422919556157f6f7e7aa17aef1d26239afbaa735b7f0d4941546e6e0bc27bbd4b848c2b55e3f7b7bd639fbc31ffce601225043bc09205b307f020fbf96e734a7f9fb4919dc3c30f82b8b63a35c88b6e007f6f82ba89c30d72238288599711e000fdfd84d8d05ccce8b02f63a5ef4af63764936f48a9b443fc621cb15e439b6043e98eb58d7d2ba85d0ca354025c35524c05393588c75d4ca621ed4f66197e893b5c4e5b04b9496ea94334d32c446d995da7c8d59335a42c5a0d4ae1cda57b3c3b5b6d2c68cc873e056726b059a22e7435eac8a5889bdd2d456c6bedfe386bf519ac9dcac4740f7724eadde37cf22de3a243b3ed97a4fb834107019bc8b97092036d60095ef0eea350d29cf0be4f1e6dde1691453de32a5469d2e675f91846284cd5ea828a85746cd7346f2f8426a1c19df7cb0815d9e9d35290772034f21c756f88d5006de821cae6851125a5da3dbb48b8725fd3a31a25c3195c2e8ba295521c62e856e66d7b68c3d232e2dfd4170939f514605c2a22f3766d52b5005b92c11cc0bf8acce29789eb33ac008f303651b3ff7c645650391f46d4cb1a87a743c524c5842490101eca0a0b56eb74421541bd9f0ac39683603c50c99efc3704c9bea057ecc451baa944b0822355e3f59108a67da51103337deff97dca62378c1d07f17393775e3800100e73e5ff1c24bfcada77d9fe10226546939a9d4b58d995fe679981f0533832bb11a9dd3eb602c7f65e3d35cb15bed3a6e1d8b11e1aa40177b45ed3199edd77e0a2efd584996c46a8913c6fc8589617fdef789253f9279e76c161cbe4d3a8f439c28cd963cb8163fab40b9a0cd8de13abf7c826040a5241fa1a8fd1324eb40906f1f40f9188944362e983d39ab89b87d622df8b32b19c1dbc4d97c4fb9b4cc287ff50de6ec9487bfc6767b2f1b781c853c9f139e1dcebe1c1d7927514b68eaf2b0abeae8c442c775a20598b91456910c819132d19b30fdce330aae2ef32a90db888ef5e09fd5d747c5e54dbf130af6c29677c120ea94e61812530b76b1e60c6dfa31a3a4230c36a90fbfc8846bf932620e3e28c4e863b7992012014668cca1e7346d593a8ac436de93830077cf915f948917d0c21ec2511d831b32ecb99c77fa3c8bbf8542b01ca252d179aed4c24109a2bba3fce9bce75b80f13a3ddf96af9094e3157edf29411e677afe1127188f442ae59a6a5d2ed26c9cd0ba8d9ae3560790e40cbc829b4950585e97bdad5b3908e9a4e108f6a3274fc7915677b74a16091904c21b546bb01beb7c3fee40c8b41ffd07bca9a1187d1eb35cd2cce60b1cef23d58618b255a12ac6a5f0badb9af5abf40bf5d0f201b91b4b9cafe4b0d66c60f7146a6ee25ef7f750a81d6f935027d00ef70e9f48b75d800b0d305db87b8d9e39a1d152fbd1abe6e6dfe0340c70fd2887af99a04a36f173d5ee7210aaca7db26727a5e5e261dceacd56ffcf3fc2038d07ef4a93c12699dae49de9079616e9b38dadbe6bd1c3bedc967f150ef4f02783de16eb8b74121287049024fef877ebd8de1682faacb7962a8fecacd5370bacee8c2302191b0fdef9a79d4a18cbe5ca5ef3bad66fe55fefd8d9dc35e08e8bb11ddbcb9bfbe9b122a6b76b8dc66d99a064f26faf3096a4de5465ae8dacfdbb4840f9334475b8357d42140802c104bbbfa2fffe827859ed650ccbcf5c7dee37b288b34158a355889067261faf5af94d6d2e2cec9caca7edc1662e68a74fb41d9d5ce39fc9fb38539b89e1ad71a7fe2d658385463eff43d63f106f2171c92c559885af31c0ab7ae85a8e031208e899844278eea1d3da9aa5e4a94e8d9b73549ead2085088f13bdd567e1e2e23923072ab76220881d015e3fb390687449bc8ad829ab6286823d18bb8440dbec107c72d15f281e316e4c0548aad0fd8e9d7e7706a427ae31db9c2732d4cfdd671cb99d5c7ad6555f9f583a60930ec2da44dc5423637f9a3b655c284b8269e9a0fd9e446096468056e7a6d598190398341421726f366ee0261c6d0ad1203198378f1881d9ffe0061319105af7f2f9fe91357cb5033999c0c0f32496a4cf22878368556c146eb1ba76433e3921bfb36dc09e1fa738ef170a634a64ad9c2c93d485a7dd7d38a0895d936e29284af993f425c224c3c22c4916790c311bd120eb970b43307cb9273c98501ead19ca024ddca20ed8a78b797d4b164b3223f8a33790f94f1daaedfcdf523808207e8383cdfc5fa2913507d176d1630a08b2f8a090081c41ad355ea28606ca789cc2aacbe421e13bfffc564ea6e245acb8f7514f6f94da50b60fa95a3d256697aec17c633e1ab278fb4c4ba3acda78ffdd628cc1277f9432d2c681419a8973500ab4ded261d4b42b3edb16f4198e89302822bf11727fe79a5143b43d40dfcb1ef38a6ad491a788c4bda413bde92ef99e44604db7fde66a0ef8a3c4c3a30498e5ec09b2a65abbd1c10e906853cf88a05119aa502b8f8fd03e9647c81e1887ef754ae16fbaf6e387db28643b8b66a4e9e7faf31d087f5e1350257bc5c802a07998bf666a33fc3f60b28d9835dcebf8c5809e622378670814c30b9dd457159fb26b53e1c95e168660809b882ddc1c3d4549288db429866d34c76220154ddd4ab9e5596c13f60e13cf96bf5f831737c841c40aafa8e905cd01d7ab146bfd12aad52c7a685d8515377ebc87b2a9b1c3e6a93e0ac6a54d68a86260ddf635adaf7b09598a7d21c060a04e0c9273540f449264330a1d8d3f2a33cd214b7d4b76489a8eb05246f31457281204fd66872eb4057ed6284e4ad0f8095c26b3f54a17ebbbc427c68b12586e5104ff44053f4ac1f17aa6a8a59a4567d7e30b5394b69ac5dda4b22ba27d1c0251d2e60f627cf05e2c984cf15f84e0a9842896dc232d1347dd9a1fb0cbf58c2c039258059c52731179d1fcb8913b1c1a158858a408172d333c2f894e7877824f0b1507daa2733aaba1cfcbeaf786dfac0cf36624f6146a8173df41f0daaceb7d50e5dc2472c079d5adc8361313e20d8f575c031ede05dddbb7865d982f272dce26837d7fb61c6990e77379061ae6ce5b9fc9f3355bd4ff9a7db73f940fdfe0eb48a1152e89c4928723e9edc14bce90b22779c1b72f36bf24856720cb33f6a809bc9d2ad421fed5227bce558898c88f3f23114a453e7af0b0a760f9483396b571a37a4f255037ea0b2986f9a1f398bc80869d5d7d1de832cc72a10645984cd021c490e97306ef075a842a3791b2ca4816f3d23733ca16e917342c1203d8c846b1ab1be32eafe49924c8e1b81489d892215e90c59026138d530d1577b2f8010057e218bf92446dd05de7d6b9678420e0ffe060cb9412de06edc13e639d5a655b08ac6e3523aadd118ee1b108b5902e9f0cd94f59f9b21b25abadd84112b91a60ef254c0f394da418e64431e6eded88c865a976ae8b6332b92e02c324ce0238aeeeb94f1776b98401f04da5fb7e167fe892753678f7bffbfc1829c2ad70529723034e1bd36b9ca33716114aa3b90bd8c13b4fcdb9fc8a0235715a1463a91d7ef8814842283b1258808f4ad671c0e7611d7ff28f98300b79b63e266b7d0443ff9c99f7ca59936cfb22543b319f4ae0f8612416d7ee803b04c63c275d721f6fad0b60dc7a053fb11c72e33a78424addca64160ec17c71c5f0094cd63d2df90d565873ce629ff1f0bec2412a5253932cb1f931b36f566f757061fee36a8b4c4548793ff9e71cf318743f4a1c9488be3994f7b7e86c6e1281db3e77804bf2c7622474d9d9c4ca648988fed0e6d84bca4aac8479dcd701568470bd61f0c0b2888a1f23a35b559c0b816acfd6c1e53b892f17b9ecdb8650498a2eb11c812c800ff12a02b563beb2ef9efdcaaab337fa9572e92eba5aea0bad4877fce4843427637b7fd88535a30829795afff493e9998b5aaae17cbb6cb83b561a84061beb8619da0ca7a2e5142f10096d9890c65502ac423a1b164c23afa34de779d0ff0ef6d883f44c9628dab15b6d5dd7ce05118633e841f563d65ebd0b2614094a2e1b0de1f9c3f230f167c8dd67e2a20fe7f90ddff7b06f55b7462db05987eac44bfe9432bff0133585b7494c9a4c93b76edaff2e6d22a0e93e1e9e1985c9f8dda50822ae7747a8ab46ba238f438985335129a133fba59fcb64e969414be2ed36efd293956e3c89c5ebf846283b6a2d78cd2a5e3858e18c51cfa4255a0121b4af12ec4a3295fe949668d6907f7b5f0b9f9640b239d6d6367073680ab93f2cb1851ed0aacb307fe3145bdf49df5fbd414e3c225d645aa86c26f5896f1d7aaf13cc0a00cc2dedd5d3453bbba6830d804ad401b8fab7f6510dba3a21d65d5468e1107a7ddd63c06645ce6c7f89e82fb95439384811ad02a1ef00f16bca32421490c87f6d3d140d1ba6234ff9a3b74e66e774aec2807fe18700587a5090a6aa5f0f00e868f459d93831af24186695eb3c33d68cf6df43d2d3d1bd6f6420f1d7ef572d8e5d1d60d9f5071ffaab15d02417b4d6c94ace7a8246fb6bb4c2d45f04ec2f44400dac6fdc84798834340191dc18b137a836fd394798eed4ebfc39be3850e33893de7f928deb834d8cfa9342e2eb1250506f0d555007098d0a21cc8e4e3a636eff171ce4160a842f925ff50c3b1d257d699723b3b0d47225b092139d06c9043b87c0bd370d17064c7fa9b35ecfa6c0acd3aa3ad8170850d3c9a5d2bcf14221d77378e28dce1070af311c3c5a72247d9a43eeae38c0fbede23f500cb8a372df5b2c6a1437725dbb82f94dacfe713b8854c1607ef473d8b437bcc5866cb10a8bf9f7d056e6501d2e89ee8b52546ac2c1153f00b7a765eb435eba65bac805fe592142aeafeb5019d6d0f15a6730ce85837e2a08478c2dbef608b0c7912667f3576817d187ac4a22836bca24addffac70c15cce5604b0d7749d856cf75f7875c50b747ede9a43d3878708283283bf908efb14d4544ac28e96a7ef042a54ed91599496c40bf9fbfeea1a49c7760449c5d4f7008d7224d4b3829aac6b55a3f2295966d31821e20de126a7bc34a17d65f1db753ad4868a847c95a79b6d1b037ca9403f12639c5d94eac2e8087b0d302f914fb068290f77be34a0ead151b5e673273b54c0a986c85101d3616387644d3d535905e9baa83618092c54841479a06043804e081821364af4a5bd7151e77606ae4756e415a6debc80fc31e0f40665cb4521ad0eb25f09c307687630652570d83defe779d94d8bda202dd68b64b7f64c39edea7b911f58b975bfbc2de1c1ccd55bbd5c5d98b3e3a6a44899d4733dd5e73f5091ae98d83cce87a252d710a63b68b6b4d738e78b24b4413463850def2ac43fa0a87b9fae3d84a53df24655d86dd6a367f92eec4f52a2dfe029bf0d39fdf1562f38419a95fa3f1a9cb44d35b944c02b499304de70db1430a535522898b77eb812a54d0a8bdc3eb5c07f12e5c215def461a268a01fc77e2f3d43ae5daaf1092ad043548adba9db475f903985cf2075e1dfe217d44105466f6f107349c0290aa4f7e2f5d3a1dc1c8fde1ca8c79332014b6cc839bc05faa9e5405948cb91955c07e00dadeda8f0dea0a8e6cc6a6d93d20b769821f5aa4db2c0998f274583e6e5a648eee828a996341e1497c63118aab06c06c7195b80aacb62d6be6e8a10fc50ca56b9b94ab03a3c338e3a16be7aaa6b3d385bbea89c81b5b907a0c8c2fed07770ad3b1c8390f4c1215313e6981235160fda3bf0f46421b834856c83c6c42a575cbcd255cf4e9419f56565647bc1406f4aeceaa601732585496c4d0fa05b221b55179c211b90934b756c7c00afe15894635538d2267924c6c244a01bb536e08dcd1b35887db3d746dd7bc14923b54a3497da8637dda356beccdc18696cf58e69ab762792d874aa1e44c5a8dd577974d1c667f1e8a0aa72814bca3f937786b74a13198b9355606f8b11fb174a8b8b2d9c81bbafe90bebec204a3a93050328eaa3285f2f056199597bcc353e14b308bb5c3e22d91edd401124e03727bad236899b8fc26d0b51dcacc2b0da9414aa7683c3af2393cb106ca6223d4bcb37b77706a31bff303252e2c015dd0cd91a28fe85a9c28391e988ce70827c1db78ced988d71963e3e6de4b0588101375f33b79cb8d57c09a1c3637663da52523aab19532c031b883922e4ef836f34b515b3dee861f7907fa04c0cd4e083d68225d86851cb9f671c81672804714a9020acd0ca0be4f9c33eafd9286b844fab9c2a8580b5f79c7ed7992bb34c19eb5ee1aa38ebd620c999b91ffec0902d5fa933c47667c0628272ff3e9d58e623049ae0c3caa0f7223a48bd647a58ce1e95a62ba21b7505121cbd13411982ddf338793177c821ef7e2454dd2180c7e968f24cf53efbf7e962f769ded72c00c7312ea2dbd47ca95ca1eff0aeec8a8f331bd7405b44840cb0ba3b0cfded40a208730fe62e537c99561714de7d4f3c81e0824d7a045db8da8f9c88e1114a9a0c97e1fccb7f0126a95d942350ac132157eed442117c22cd69487a004c08d03eff97569e18adf23d2b54dbc924433b6efe4e20f42311ccdd66943bd5e31db7d4b1052446626486800a178347c5475274751719c7ff66073d2120652cdc9f1affc2a350583ede431cc85ec00dc441a6b529592a8aeea99047d257a05744f281982f8178c9a1364e21c9dd63fdae573e2b47f87b138a4b3597377a507e898492dfa61bb255c40fafc8bd9349896abe0a08b191cf1adb21432660a663656c53bae3b8f7db657878b2bb2d93e62ea399aeb6f5757e775b8e7fb3696da882d24d6f9465f1566edc0d2d6c08d2cd1a5dc56f30f9c47f78fedbd58d09ddac40b279026d513b7f9c1ab721dd1f8a6835218b0c62d8e03c6af48d530d6ba7c74ed3f11b51ac0b9a8f319ced2cd2846b6ed308a1551551dd598fd2f406e8731af3a8da3dc6fbbed744e4b22b3d73d5331bbb7245082ac9df6d72fd59db877d9b8bd442d0f671ef0eb2b872439c1eeb6b92368c52b662536b1e85645705511119f00949d5f2890652d1a71d5457674eb761b9d02657498f9b9f7bd8a2cf1cd6b1d5b45d64c00c7f2be2e546ab6e74d491898addc3e762c4476cddd4e5711f5a4ab6153e333204faa185c56c2a81628ddbf4004ccf4ce649c120d20fa33219d0196dcc0c7bafe2e34eaf327171a72a52c93528559ccc5961e1d502b158a7a701114c47f35cfedff455c23a67f5de66887b46bcda187dcb46f00c16e2225e88fc9fcbe5667a0676bbd527d371bd08eb4abec65801c226e021da0e0526dd1882755901482e8070572a43366ac23da5a14bc96330afb604b5367f64ac9fea96321efb0ddad7c329b3feee015b6a668e4473aa520c94ec95d4e367b50fbcdfcfd81e173052526cb65a34aa748476112c0c25dd60eb7a532d90f541bb948dc26018f4443bc714c6e67c0a18dacd5c6141b2ba8cca6bc820658d6de9523a8a42066fb0b3b56eed8f9ddf2d3735f87fc49ed82542fc2f8c4b1b71b1ae93c62ea07f1cc052c9dfbfa52f2f180943ca05feb7d5dfb04f57d4de9136542f9facb60af908e6c4a047496bf382a1658ec47d3a27be7027ec8555222f9f16dff7029983ba3bf0e99a913ee6f98ae03bf295f86469f935e0c0e89658d116a697009a0ab5a99a7434d55c25a770d4b57a741a55dcd7ae33ee33e819bad15413789fa3f1a6f116bd45c9cfcd8f0de0fe6c71814939633b8cc3bbab36ba416e0fc45a5ede806620506a6e5e222f0eae213c7e3a3a359fa4354a6d9e04dab5ced04bd140a0ed447f9ca458a9899933495f0337ae057093e52ad9aab05c6e4e161a540cc70e4f24bc7140ba401b836897e8651eccabf4fc3a1c0c829668dbbfc3448dd5cb20575753e7b1fb97a098386a10c9fc551021eb23eb681dca3c440b98b9bdc80723afdf5f22bbe5989755e2129648133ac04c1975118af613dfe9883d2982cfae922a19b44a875ca75ed3f5b92f704a2a0c8ac787e9f090f1b0c6f66223985544b68a5696f2afffd15601443e29d2afc6d9ffdb4f32b67e4e8720fb29102cdf4383e58ccbbafb106264e5a2fe47ff0f0e573c2e98b849a9f1b3129686a071e9b57540cbad68dd72e553dca204ee40ed99e0367ca45e42ca058f9c14da69349c183d8fc49d8236a0e81c9daed7082366627e9c95f72f67acacb320ed35c915d1abb8e49340e41bd3c04cc591a115e1664a9b6d8397097d9a6622a7c60e7869194589be5c0c7d6f0854dcb9f535625af328875c6266c3c0ff3df818ade7283bc1aaedee4b29e90666ccfe4e2b0d451f0972105ad695abde4cb846bd99573060701d477496c20f5c8a611cda86e46e6194b8b2974cad6b5fed3af15df6447fedb1922d54f71e325e7f27a8303fa42f60c14c6caab36ec22053599b1091540235472e37e774eaf461a4a64c54b9a482629495326b53b08c825e0d19a725f14d12fa7e2efac47bb2cbdc598af68f24e7f338c5d55950b2d47e09b6037e30247083a29038785da56134b57863725531cd427c13af0298dce83e68f17d13a85c2e28fe7d34a05250583b1a4732ca0090be652819091c161205f7edba145eb9f65351a85ebbce227e9aced84dc34de4cab1af36f52a01f287f1b8d58f35a17306270a19c057809e24ff4b78082df40a77de032f987d7827299f616be6249f4e5a3e190cc6aeb85ef605e27b80001a4ec66357ef621ad06649953c201770cdf8ab794ba2d74500a65aad04b9c8d793237185e79aca34c5b8d3399be558c70e4e907e9e70d798d62cb1888b1b0d6aeea4ab6c90c9a2b045221ec0a1df232b6bec70ebd5accf45927311c96e3a463d03039a27c137caff88b36ad06388da213ec1fc0c75c6c646faa14da7fc748dc01be9e6b62236053d79a50181fffe0700fd7d78815c3b99445ae88140febede19210e7dbb3db72b4c55b63cfd78aaefd598595faa58f9e72d00bd9b102bedc15fd31f33fd3a840c19987a91b1142b1f26df9635230eacc243f27b4fce3b1ef62cbcee2b30f3ac216218376d40db08bc35ad5f4a6f5ac0008a9032ed17e78798de71ba21709c63fddc113f14f320799c29e7ba89871e9225ac953bc3457e45470ede7b9fcd70714abc8dc19a4802bd06ab1acd59d69816778d55e7c9f10ed257d28e9c6e9ae0e3d53485a20ef6c2a46d6355a64ccadb040450dfa5f12c3f535c296e08e1183a685b57ada0ff8960a6a0d895e09c511fc79aacbcd03026b47eeb3ab4eb57beac82492303e129c3e168028c112518bb7ebb9fa4269617cb2ab61484914993a79a3f117434dc928047f2f549bc7fd0a3c4e593c7a554d046a94e549cf505fadc3537301f3be458add522bdcf5fdbc9942dcb34c158cb713e2df0ef0db5c7ef5500bff6bb2822c71a88b2c094d1ffc7e130a53552b4b3fab54e8372be661614df20cb7396a788eb565e30979e3c2b318a51257323b0f99ae03d179247f888ab731227111791f95134c2efd1dd44ab7857440fab93bbe07e6ca3e9b0d5468aa1c478ebc60606f5716b6a1bb53c366fe23fcdd205369178acd5dd230abbb0734270ed92436b5e73d0bfab9e956be48f2c31ad986acd2dbc06dea2763ce85e55ca73fb13e3d12fb5e8267cb7450057e4f4a0d1a7e3436ab139ec637c0cfd8d5bf14cc6e43cc61665973524a86121c07ae6611e43a5adbebe35549b42a4488fa0914243d47d13368da811e38483b67ebe5a4ea2f09a23b70dad0dd3693ba771899dce8da192f9b9536b801d3e0391968da8416b762aac180e30add2c730c85e400c27b419a2af339e481522297e3283566d296aa7691c15a87bd8c3a831ef477e13e9ac3d44e62731757b1838ae3b88ea3a5db9eb9c7b38bf16aa75cbe2ae9faede2366a17f9a208b3da4af81b2af3a7ca7b6a8c874d5f0d59e20a26143e911d4ba99925a47c5cf23c72d788bcb756a75653bd55cb0c13cb93e930b2e4ab236318e85d441b52af6793996abeac4e692961f7d335baf155068a2e99625def90b8434b80357e484381a791ed7ebf981d7dd5c202a15bd2536845660dff3a9a1ca6e9b7a2f904d1920cd7954918812ba863411a026440fbae3dcb3459d8a2c44695d23eb3abb56e2dc1935632787b33989b9876c6c3b03e50021740d3ba464d536e85a486004812ad1544ed10c4751ae13344102c44e50695a569ffe6d4083d5b26c2f46d7c5840c27856f45938bb13bd91e193c4f61c1f5ec2ce8e3a322a3b535a992633c3c82b62e5a3b81eee21d620fab80af635b1f85da35d204b07e5b6455d3db7e352f9f2968edce3a0c34fb0ac425da027b98d509d0862ad351763d7c4c9a4432b2cf741e2385bb26e7acb333b093aed231bc695330b188f140dcb89d752b9f9cf11716a076bf19690e8196f0ac4483e775625500edbb88e78a3befb70cbac0634ae3b998aa0b34db39f0c088f2196550552015a405c20cb171bccd981445b21176c24ebbbc32b2931c15a0f84fdeb8a9650f6af563f60b374da42601a6f7c9e1ac6ecb854712ccd5a9e811cdbe2229d8d517ff7e809e758bf7c03a88884bd33f7f1cff3c4e317d612e57c42af0da0deca619ec7a16f49131aaa68d42c4119565da3af3aab8804cf3e81b9c4cd389bf1c95c229a049b696d2f20b348b68d1c41441158a1a866446164e9fb4367dd861f287bd543eb164f57b1e80985bfbb0a75be18ada1ab4079301502bc7fbc086d2691082f4fd94c90c9429c99a703d724ea4287b70d58759a75ea71106b0e9745fbac0ac1d4b8d6b6c06b885413e3165f0fbea378507ff3c470a9acf63d241777f486386cbc66755d170e8a5a80fdc88d26b018aa35739993e7e8992ccb2ccd4edcba28e6cfb6241efe1689dd2f1aae17a4c1f765e5136a2288db67da39672195e702596a0b70b47299741f4e83390e3f342c046f2545766807f7b5d7ec0d867ba5e086ca36067a3e9c48ae593e101c9b517df65a4d2aaa16d3c996a1fcbe7fceb97a1f5bba29715407900f03f4e072335c34be830a347f75b74431496e01bea0f6767c3e7094be5669b514526fe0e55e808ed29f649542d2b641308cbd9b5f899d3fa8557891cc925bce017ebb6ad0c2fea702cc88dbcee394038c6f0b340db763e5fe15587df7d396da30abb4e3261a3fd41a36b17646fedc3ab94e585e989dab3ab2ccf4601e272bd1340e99ea9ed62eeedc719733b3077aecc88a1a77635003e81c1192d817f52afe089fd96df5f61f2c0f4bcd6490acbb9ee362247b8553860b5192d32b9592343c52f51897b45e3184c2986c2281572bc18a50463a2047c234fe0e7182c4f80600dd2c282209d207027be10db7e706e71f17e9c2ea51fec610fe718a5bca17387fed873dd0ecd822921d280487ffce790df1cf8e538c3d2864ca7532db8208f4bddd4a0fa9fd8b38b87c921d762cbb10b490af8262ecc0eb162b9d4218721a71c19618ec7e0392b9cc9ee104ed99474ae02a21b9af976b7b126696d075bc0c253106ad98fb7112844a6f5c91d2dc74cbb81d0225b2ca6baccdb8a21d08b3c500449aff7cf3bc704827acf1ed25ab076a0756d4f435b96c7b3f78793c311739242dff63a0ea974782d6135d49222f2d66f3a801a9f87eddbbef3d4f8bb9d14697587ef19a190562f768ee29b79563f4a7c3b9f906cf54cd1badba02d2ed7fbd5748988759103732fb186d2d1f2107ee1e8a706dc5e82149d7ed370d425a67c3f61686c652616e5eb6d782798ffff47b0a697a02a767655534c1bc1ecb71534b1798dda5c59adcf3a606a08c470d630c48c04ac34f6fca0baee01628d8b52d35257db44e995f3902ed32a84115168399107f2e4ce29733e5e9885f890cf53bab977906c42053d92b91831f42ac0f9562495c29dabe1162d57b2afc61d53cc893522818ac13cb266406b6659c2b8256401656e6cf45e43faa3b08a05dfd0307e6abd2365db2c7b13cce1b62c296d1b839899fcb4ddd31d17929822870756b93efd48f65ce56c0456ed0d376d7ac275282beacdba789253affafc7c162cb205178b92814a447c0a58563eb212e2c57693c25a42d820dbd5bd9df82c38e2e0cfb37823dbb5eb9924a848c83f5e87d53b324855499615300e8bdfc06beeb90bb2357e729f1f5c9c1ed405708ef046d602192ed4c3314b2e882ca19a175bf3a2cf2fb579ca16a4a008147684d7d10cc978abc1a15df0999d00950b92c34fec9340a25bf95e3b82f74b046c20be1ee9cea051055961e997e5c2e314141177a745c328aba7fafd05149b4430135836eca3cf076cbed9c34c3f7a93b6a8e8231266b24368a8b85c694bf7a30a046b74e25955f3615d404585759d215c38ced97abc0eec14251fd0f3541a6124ebe4b0309aad20459f750910cf1fbaaa49b7ab023a7244815e1ae4f5a299123548226d512bf52995aaf7112bc5470142587bad7258cad0ffbd9e5cd720dddfb467a61cac7cdbf0ba8be4be4d5690cc6bf9c2cc7ba65e8ba0ac2bda65aeb969502aa4a1c78e079b1cab3dcac5fad3618953660b40eb0d3487153decebee55dd0fe8f3da986268e7f980ef85395d02b277eae1a079b0ffe9df8b7a3dc7fa208125193c597c5cffb5f6337d58374fc5fe08c0c11bc6d7d114acff3898afe8a8eb47c8855983dbf2c57e0742f3e909cca9221ca770001bea85283cae48429e1466ca9669a4823e5b2842c89a462f6bad5c9b257e8ba1d1adb45382c5ac695d92683f06fe1838ee8da71a35741d3e208e664abccac8f311e8eaae2702f75199eb32efa0ba3d986638fa160096ff52c6aa2eccb10994de7ca31d1b41e75e765d546f0d29ca1596c66e0a59117b2fffa8965517c79dcc1dca80245f37960f606b468de54d8c53a481070ec5a136a228e38daae7fade7a9901044410a0622afd92bd0f75e4186316e3848d975077b9cd2f9445cdd53f8b12d9e9b84a1253f28e335bb5e6b7ca142fc70ebfb9d1a0160d6b740c7f920cb6156ace9a7ddb1eda66d2526151335eb012482b2559b3dca10980349a6a79919a7f0a27b29ac634589715ec9960c9368a5d1e5ad6a54b502b99f81a72483e6db177ab9e6a388a6350b3c9d4dc1a9568f6ab37f0ca9fdff3cebcd75ed1a9d65ac211bb086247334fbbe72d1f2a1ec892446ff72e425f1bf535a9e352d6237dba279d24f2c4cfcc15f18a38073955ad568e208d5c2fbf44f6991d6bebc2314ef3114de5d33c5825c412fe9b8e1ecfdf5e6895522a11fd82c8520579b6699f756cacb3ad361d18f726f57607606f009de77c45a37eac0a5ef501ad875632f44b65696370613cee04283529bc539ff8ab8dc71609c730c682f997548c6b0f878fa5c3a915d4a414fa995b038582c18ac14cbc38eab69a0cd06cc3829fd1955736bea523608fa040ca5f25a1c3b078bd821a093775a22e45f03aa4e3f578d18e9653a78ee96968390f999a04d4d8dfa929f14585c3c59118acbac5731584424fb8b054105c18503ba616bd91acd517c11902cca023e9b339c2745b1441bf5902189d035786038ef7468d2102e1803ee2d0823380214cdb80aefe2d9542231a63182d1a4d1e8cb9aa95c7dfbec0e45fd99e01260ccc7f6a8797f842dc1b1c4fd00adf9c01213731d793ed1ef15cead98ef8ad8600a4b6c22c0b4a6ed630fc3fa6edab6ff1cdb93da7fdb01482529b0927e00dfd849da00a5f0a3af79ca756dc81bf38b55dd992a5c4b195fbad7879170eb6583ed6e6da9567f48b6c29165e094ac78c9314885ca81dce5e83d20ad5abe1748a85a8d77797f425d0c212ecb2d9c4340080c304ee4ec611bc1b4c746c2028b213cfda833a8ab031bbdc86f1573794918cdba8b9b12446de3ab41f432c06b0473964832934b056df907d4d0886174e93207012ba0510a2a720fbc123df3d7973994a2d37d17bbde65a9052c32ea4a9eeca6376f6892efaccb15f2d2f3147e6323012227e06df99c3290224fffdbefddfc0419b35c43f3ff605622c3f1f637d705c6f85735332539ddf944f08899e9f10db362360f1fd81887d9ff1b19883e160d33e8c43303543637dc2ef471838e675033d6422e75718011fad2d2aa95b88ede49e63515e01b4a67dfdfc10a7bdea9fc44c367b32b5bf1373c93f7408590214f8917fafdac853e0ac06caf29c02ddf46e3e9fe6dd42cbdba99f3443b32c03844d7317c46b3736ff1790c121d27f58d02e031464a79d14cb8fa87a0f36cac25e161ae0c86a579ba9dddc25c9f22a894988eb3f082a4db6364d4124b163c427433707bd65f8749a2fe9e48dbb95ec522ee1532647ef4c3d3914245934d1956b65e62c480e138ea381c008cc36ebe541931164619c0423ad3f1b006b7180a670f8ec42a1c5d23adb34f94e8923b6cbdab6e9bc461c1d4e760aa02c9a58ee57060bdd61e69e418db70caaf5d627c8c28b279b0616573d1156edd31aa896783d6b9d8476c399596f6212b2118d9c4252fe9582c1d7eabfa64b63eda4f02831d2c26877654ba5bff1f7221ac21e1978691d5f0ad133cbae796a41c4cfcee54742b8c32b3b3ebf665920ff9c5064256242f9b3123960dfcd6b8b565b05e6fa4c242869cd191ecea62ea130c4022cc75d73722e90214529268a1116da3c388f7a8444f2e38fdf232d6d937a6f927ff639e46822a590bc08334165ed541fe4df286b04e692b3dab68fccca13f343cf2b7194d964600e40c7e01bd482923517bb537f3dca989c551a8677e92a8dffe401a379e020e8cfc5a50f208cb28d2277a3f0b757346c8c5949910935816cff07c5907aa121737b5ec576ba6eb598ca38df1bf9f9ce58e7bba9a326f1f79c371601885cbf5f869ef7ab61de86aab68cb84ac34d8b00719f0b9d79202e34709ccd22c865f825a4592229932b87c68c24e499a99b9be071737a506e80644bda5c286e0eb35d7619a4a482c4f07da3b2775941a499b0b3f5fbd3a203fa0d071d210b358c4f40f33f26ab5ab24db6090e90ce194403aeaecd0c710dd65795a035a4ffd32be81f52b095c2eab2cc1c50ace483e6767ff07df49f26d32563d8694edff2c0dbe650cc0e0d8a78f71854d8b0dc1758155cfdce898d62e813727465086f016468572999e70c8f7599d3a1354c71f3e8daf43b02ade7568ebf03cb076ca99107f81f04cd8748062fa4fe710ad3539493982f23e810a3cd7cb9e0fafb22b939132219f65f8402a77a4dcdf086e2f299026bd5731088b97434779c3a91f063cc9067807b9929ba5c956722dc00482329780a6bc4934025743e02e0ac2b844c3acf44352203a5947804369db5ca4da286d75d68d6f2422be879c3877257725ca3a84f81a73e5a81878164c130a1b53ab3e07a3aa990fa30144de232cb800f910443088a9cf5087ec0425b0832b30765179ff971f412c48acc27764aa2970c71ea67c2ac841c0264e80213a495c07cd7b548cff5f87453f314772d0b64523a4ac346e9a7638a9778531cbd0ecb60ebf7c801ca4a42628954b6bbfb9fe749bf421efef45f71b970627fd0832f00159414c0fa210346f2d3845a5bc917325360827db8e375bae6c56f410c79ab3a7fd70f1a0fba61c1a621bd058c16c7118420a037f5ba8d7260f0c897b19b656565d633d350859f5648c8160c63f2ff1b56819d5bc90febcf4eda5c0e7a2ef10149d7a5baa45afa7f7d423f54220f4342625a48a5878718f04888ba5c4826dbdcd4555e8075537bc473dff94aefec723d89d81838f646611219e01df5ea5515f5530b358e16783424811bcca5e5316dfb61a8f67d84106c745b0b170bbb7d42d0197e39d1a6d12114ef37488a0715d063e84e98fad7e342e2d5b3b0843cc1f456b10a9a2644297791076801cad64081674c08925bb49b324eabfe08f75c12f46308e710d3219f6941204b87322f0d3164ed50d01c8238460597a83a713ddfa14a8bb5daa0e983775317d21c24c17cc8da373c96620ff27c31f57978213bc7edaf03112cfb1fb3997129eb31d5708c2a6b605a7d4b109540c96803eb938dba7cea21c5edb5ca7255aa480ff3ae4d1d188366b91b984cde973022509fd9d301368dadd383439e5dc7eea2bb0e9cbb660c7bfc0224403fff18a8daaba7fed38c06919eea938ed5adc281643325d1de87365f00aff9d50c68036a020b8313f0a67a971cbb6350e14f0a8c06aef9954c8efb6b4be2fb4a13d688109098852e02fc55bbcc01baf052648cae44a93cca4fca29168dfea1d06b9c9344b8a374f7c1058344a47001c9ffc08ed3d0156652d9f2882615ae76d8d1377224a84dfb298c83f2cfb6c3cef1f849519c9ecf5e7e52e62ce9c66f85a9400c63fbd02b3d37e13f2c89809e12741be003afc88f995ba60b5477650f63df60bd30ad03921bb65b4c84582d912426a153b537c7d824cec8e1dfbb33b2cf30ccb31ffd013232d3d53c691cc262cc171a3ae9da97cf5fe677433728acdc3294ea79dd250cea4d9aaf2bd51a0010b586dce393017e292cc0459a835fc652d7cd66abb0500d95e3f04eb309f3ca90dfec8c1119c691fff1a04a384ddcfceb74e3162940920b76e64c80cf4ce4a5b3cd449c839b19c2e0068dd8c46fc506e9a905a4a16c3d21665a0916014aca5468390f8ebcbb375601afe0544b194eb97283aaa499733fed3944241086a1d82001691b75fc051a011e1c98651318b48b8d109d821cef3663627986bc49ddb55b93d60fd720a8759f315ef947b541981c32c403ad430e5b9cc87be358fe514d4d9b6ed211c77e72c71c136412728fb037faddf07e84a03a91bb28feb3c44a96604d781e3b8d100b51b651e029d19fb6b5261307ebcf27bdadeeee7c8fc6658785cc1323aa2a7f5d12d639ad71e91332f80ceb3111d8e701a815ef294ce7e2d247052c99e9b64413e61c87e1b7e96198f8a6244b94b124e7b2228ef653dc35b48e15a148664a360d21278907392cec5b37ab60d703ccc71f2016f33eaab3fac531ff92d840230d2a038b5e15c3e482c42b2465ee1e0542fa0dda7d5f5241cf8536fe98c4de80910eaa0bffae1397a1967e7b00f2afcddcea6023357028ec884ed5e5dc38da4d704f6259f3058d4bc2614739cc6230c9f1467c35c8bb4b6421680020c365f619a407f45cc5bc0197069e6991aac28e3f1589bb59fc99ca1b5aca2284b08e441eb576f2b708b64d414b2223e46f6fb55225005395bb1c8ef94079a7df2d26437051e149f6544bd10a66585604ef294c9bf9a783b17117ffc3a05ddd7073b629bda6a582270f3ed12e3ca40a9a83cd1d8148aef840e8fde04a4f2942b5900b7c79dd941f72be5dddea884c8421293cf08e6527400099672e1288e1ab957df1ba3090fe9aebeda5b48ef6bac2a39fbca30b5baa3691d4ec7661bcd2bdf5ec4f2d7cc3018e9e7da8f9571aa2501f9d3d5678091ae413e81bc9368f1193fa95ee437cd27447d944094cbd034a04639f5a304cca9a0e7589ed157bf66477b1ff7608fca9fdfbff9b9b3b641b094267b4eaa879bbbe76e5fe3b015a3336b8f3383f78bf2ab4a968fc14f467b68e18009de8475ceb0a13775033867d5ac9e00a1c4d5a6f5ad2f69652ca9452b009ff09ad095eb8a6db7857f58d46d363fa463fc134fa3b11e9f6771a6f2818488a1dd0eba24361a01fecb7e7fa36c95879d371110431afe5b190ebf9bf96d76a7d656fd916b7ba6a3df72a22e7f8661fc8cb2f2f8bcc402dca7903099ea45a6bad319c9925d11b7ab228d140b9602559a94af294a5861dda3ca1823d7102aa82c902ca87294fbaf8e1066773434f1625fa54cd98ca2689c6d0a40b13830c459e89145190512203021688f0c2e48a270f6aa9dadac31319ea931b5ab0b8169a685f3248d3b2da7452da462ebdd1dff1a79452002061e5652d38a4db6f474f0bee86647a59b8e61d679836600c2ef3f08e993bd2f87570154d0a799e770156f23cb6e23a6b711d851f5b85978b599ed8595428782a5c7724fe3c65b26432b71b8070250ed368f7cc73698f10e4ada265209c0cc442f66c09f6e59d1439ce10eded5aed97ec58a3e1c4d2c8c1810e1a3b3d3e1198d4c795cf0a885151974f5e3c88b9590766f6251ffbb0eddd521c6ebf7d7d1222190c84c4ca6019d3ca72c752daa42802f57dfdaa61336d4e2a72370b4f3e661bdddf5a2b8714b8f2fb8bb96c96534a798f6af795efa4cd6d9fbf688773fab794d2369b062510490c2d24619e2419a1460b12aa27ac16992254f8d61a37355902b01801451528a84070c50a2c2c9cd43047c0b086504a29e5374f6e562062840e55508e65864ea1c2e3bc10224bee8e5fab51fc54a5544b96268cf820c92029cb113b6a94c8c2e58ef6a7c097f7dff368fdabf55feb83c8f79ee9eb61cfe3fb9818c4f5dfc3c4204e41c07f3ddb2ae879dffa59f74734f9336bb63694a306866c035fa2c758d36511efc8fb22f0bda7542c7a7deb0556af138b5a2f4523ffd61bc9f73e5777420326282dedc1d7acfb23db8e5927ee402261040d9ad896e779b226c2082f9cec2281af50be8b6afa2443fbce18305f7ed17c5934df138d48903ff4a7c8f2a74a833276bef4dc9334917a35d83673cfeb231b0f31484bb4df75eb7974deb7bee547363adf45084708e97be883e52a11e80a5fff0f03cd9e6be5fb17c97759c522f99e68f47246e5f3f0ef5c9cd978487146c51dadf73a845d96423590d65961e54f4a933ff3bdb09b73d22ecda17817ec8c490342ad9cc639a409dd751fb61ec4c2c73ef20776598706652cdb8c9c8a5c2edfe57bdf2c72bd271a59978b46523462514eeb123d7fb67963ed4efaae679b0ce57bcfc3df25067105b1cd04ccdf0104a9087786ad188bdf54d11c1c047105f9bec500efe543c0e554e412adfce9209ea844993eaf7eeb8beab7bebfd5bd271a79dfbd518bbd8732eb56e87d51cbf3de251abd510ed9f6a1d8514693b2497fd2bcccd77dcff53e88fff7dcef7a1ec2513fc793f0c3856c5071509f6bad5855378765cd1df9ea7aaba3b48a85ead67fa13bb251f9f38be4cff9522c7a19c97f8947362a8e3fe6a5dffd9ce6b4a6893e4eab5fff93e0d0044ad8d1e7d66ffde873d9fffb22ff4ff4c4a27e17787dfa369da2e0512ace18505f3e8fee5d0ce2dfbd14833815f9771f447efdbc56fdee6794b65cf5bb96ab25a97cb16e6fc640954f9fc7fc2a0611833815d59fe2cc16a47b29ce5adcf179dd34f9131e712ff4c1f6f31d6934ff0efdc9c73e9efc99fd4736125adc815482064e6cce69b2d6dc8124dfd6ddb5c4bec964322677cf75e00456260c8ac359ece6f67f356883fb61b1e0e5af6003d806eb6b89c81f0f2ad8facfbb76d878745be0c7be88be053bf96c03c3991465b656947d2c55ee68afec6ab70377c04422f5c1270212fd9275fd170bd9666d38d47d0d3656e7777e26ffa8fb991477207993fce9de99e48fd2d0ed5e03275609e7bb9cefbe8ff8d304dfb1ad7b9a31a03ef822d087e9fc4e0c49e902490a7db0f2f90279cd5eafef81746fd47ddf3ca8bbdd779307517121184fdd3752f7d475dd94dbf591dbfdeb7beadea978902b7dafee9d18a8fb9d1088fce95ea7fb5619eb504eebfe25fa93d3baeec5275676bf430ae588b3ef63247890fcee7548211c71f6893c40fab00f521f7c1eb08f7d4c0c421ff66ceb5e042964bfebbc8060c915c0652f3454dd0e08fbbdcf3748f4896f47be828560d81a796ebf7c2f949d2bcd1725564daa246c7e58ec8e9c5f65ea459b78cdc91d193765b2891d6560083e4ef31acfe52e3f20dd1935d9c48e3469e5abff4db6e1dd4343b50e5e5696071848135684115a6ca39fc19dfb00fea93fd20ec0dba2080c543f47093b7653d61bb621654c6c0b5944807471eb7718b6c1ced46a6e8de25632b70e89b9d5b3b2da4d4b4c52a889d6818586ba69484b3714c4d8ba4ddf3def251ab9bef546df473ba1c8f5df090d609b953ff54d6800dbbc6f00dbe67fa291914cfed43fb2c91f69b24619cbb6d6b36dfee8cdfc8f6cdd14ce5cdc81d438f953bfa15a8326d6f5f903a9ef79d666ddfa1a38b1557efd7e924250d599a450ebeb7b9314aa9f58df25d67770075238df15ca5752656a75538c27ab81be5e3ff4c176cf77eca66eaadfb5833b54af56ef755d68821df7a1b973d87ec3c73edf87c5c23e2c96079c31e08b604871662b3afa22850f30d8ba975fd4bd148bea7bfd23db2d72d96ab0b1ddd7df81d489550d0e25d95116fa60e9f31d87d8fc00a5852cacb842c35ebab9964fbe9295d16e4bffef0322979ce6f5482e8d4777be6d59f3ac1c7b35b28698a24b1a234b7a58c346bc61b2a68d99124c29520596272d1e2693c89552ca1987bbc1063254a4c8a0851a2c2c34998207a90c0e862c5ba496f0ab2b5c58f71cde04eba362ce39e79c73ce2b5cb430320409a41470b0cd3477ce39e79c5fceda862e1560acc8a003939929407089818a2b4c7460340095a58817485071e5031a299d264652b850a384eba1c817567ee5ca085a4c388922aa34fd80431a2f8e988200586438024a0b16397421c50f3e504a29a594524aa1585862045a72534c0461a3515c4a29a594524a7718c87fecb9fe3d6c835d72210127a2f0d084e588ac2dce5c5121a74991264fcc60254a114c707028de804e1c0cab01a3d3c4b160198105154cbcc062c604ac2d9e3c59a214849b27babc98f8110f63de2031c40b356099f29c95282a5ff28d99c27577e22c2bd084952d597c81c4cb5499194baec0f04407295c38391182167bd381e86047cb36baeb36b7c99e76dda54c227b5a7727ca3a83da878f4c27c1cc2cce21b3bae7dfb1879ed37cd049a778c2bc3e68d72d95c99852ea31f3147fd0eb2fbd88adcf5eadf2877af2a7abacb2ca8e79dacbf3798a9465e8e38e3b578eb992622945963ffd1e333f03b5ccaeb1fce3ebdaf80a37bc44ffb8c1652019069779f8877f8a2f83feb43b0ce442dc7d0acbfc1ecdc65a5ecbcbf2644e29a7b5ded7f758a8eb2c9e353c6be49c9d0b3feae59fdf2985dd009e73ce89355a2cdb3fca50b2fd9ed378ced7654aeb0b92a964fa94a7052b2995799776b13801dff33bdf231a39ed8845e1fb88463d1fbe518c17ffc866413863c0051fe3828f312bb2e07bde82ef7919e18cbecf1fd93efc97f145ff329ebe0c19ef231acde81fd964bcd18c8a2714f93c06df00b621c5780c4423230c1e03d1473cb27dcfb3ade747598fc8b618e205e1d10c7370feebd705e1914d0cd916866cfb906d3242b659101ed9186cbd53fda8b7257ad50a9647f430a33f4979d0d4070b9de67f3aaf0e5d5716b2edeb20e779fe6370e771be43fb3ce128de1d91e773489c30271c7d884e8b85f07d7ff0bd8f219e7fe1c8253b8ff339e17874731e0724caa1f43de0707c9e709c97e777c2b1efced3b0861536d49138bf131e5d1d71004d03e76738d6b8389f43e684e0e384ae8785e38c1b7b1b8eaf1b13619f43c2c2fa603895427f721a94d3e4c34022973897785fbdf9e5ca3975a5c089ebc18e8ee39c8e30899daf249bf9a79b6f87732e71c7c578f92ee5423df4e53b94074d318718e29c923f522a9c54f207e7342a6a74772d58bee3c44d9c377138a93495a6d2954e257f80b03f451c8e891b1af2260a12e5e0c08d4dc0e4dcac6f119594586105218c501652104e80bb630dcb1ee9788c283cb4765ecbf5bd4058cce2f4effc8e38e67c8bb30f76bebfc551e777de493af9f3849e6f30e7efe88438a1b58285af304aabdfebafcd3e13c76791efabeeeeeef4ba4f2969f2a7264a29a54bd9b49aacd297a27bd3d04567f70ef61da197ced9ad3a67ab9bd22a25129a90e70c0116e28030420abcbe0cdc7e497fb69c68269a2128173e5f57cb342af2ec98465ff67c815becff4cc1f6bc4c26853eb0e67ac19e6d36146301b874000bb832a7c509dcaf7330609b81a890d9c47b4911dc623f5a69cdf39a44cb3a5969ad34031fecce652d50b840ebc1e6bc01c01bdb61411bc27a6aac99322e18f9e23f1c8687913101a83273c41d2d2dcb0cee8e5ffbe1e3037c9cc3ce7f2a9b0a4ead31235bccdcb6dd563a2a4f539a62f676bbfda84f4d5198a0c0708e48dd8003e788940d51a02cb5129813c58b121f43bdd44a9dd4482f9daa23a0a8d1498dd437201f8f14313bd478a48891d2b7ac36fc3e5c14d8d086871914d8d026046daeac466859e5c614793e63a8f8757850ed3c2a291cd5c74b121c6ef776766f3b291c5dcd832a0d8018294bf89005408c143143b5193e9300307c9962070402c0f0458a199271b47bdbc94f4eca62a488d9e1766f67f7b6eb6a53ef19a45e776f6d37e7f5f0a86b9da68f7db22e8da56d9b27853c2b73a197e7341b7f87b2bbbbbbbb650f0ab6866c9320d10efa9ff77ab9d0ab461bdb59f7b9b13c293d2576ac5df953865eada291101b156fd5c9f45c36bda1e9796fbd9a1372a6dbed96c456eb53857aa2893b565c95fa1feb541d13e5e54d1e99e18e526949ce8f7249e74719e5098a0cd51d254e4aedfc28a7787e9461aebfcc492ba43b4a2cd966821f6516053f4e24a52527aedc7132cd28b21f67138c1f2795eb3f71e39c7222eb8e936a86a9e0c75935fb719eb9fe136b66e59ac0b92345ba1ee329136d9272474aa95cff9142dd1fa9d4f5a754b4eaca1d698e9eb9fea61e79a2883b56a5bae4ba6749284d5f64957c73640a8f73ccb4a24bd40aa557d76d236d731dcc94ebd31d0c133ef5a58601c3d379bcc40d2b9705d21554a67021e608054d535c3db504973b36d51d3bccf5aeea31d7cf4061024a0c848dbe347a13099cd8b9a353b9ee6ee5ba4b5d7f1e9dcaddcb1d3de767ae3f7390bdff3240a2ef8f80673968e4d1555421c2e72ff831079f0b442136a71e3ec4fff7219d942871bbe27ff8168044e1874cc59521e3638044322cf81e90c882d78db17363fc8cf19e991be36d0eeac628c3c28df133902886ec08a5dbf31580443db323eeec618044b30a5e06125500c3092617c6530012c190c97e029048e67329c85d0a9e0724a26082097e07249ac0f29009c1e5791d908867c7b6f33920d18ecef398aaabf33820918e276fce5b9028872685867098c04102078704575c1c0c2e0ece5b2717a704555c9c31572ecec740229c21da0fe530c25a31d61ac0e2b8638d6b9f77b8b600d7dab74c9cb9f66555415cfb9fe4daa73581c4b55f23810dd73e0c24b243ae1b7b10248ac196007361ff02896042e07f2011f8aabae3ce7d8577ecb92fa0fb7abdfd725f4b44b92f3134dcd7bb40a2d77fef72595d97eb3d90c8555b60baadef40a2d6f5c254b99e19cf76168009e256f96092eebcb9dba25b90c30fd5a65ad65e4d8937b6bead696ee5b9b5d65a2bce6b47833bf630a18416258a48820a1f3276f4e6eb460d246a88a105092c544b77fed3a8c0dcf9b5249ceefc184834876aad3a2e14e941892a374954f02d7aa0c0823164a6ee38e34b0e253022052398b418f1e68826ee7c1848346bad74bbdd54a0c2050c324dbc6a2c819bcabaf3655ec4dcf94f4408ee7c5a8d0821eefca122a898829a536d9ca25089c2218b93275c8b2c3cd82f83a924b7be8bca13b0560008d0c5aa4b955bdf135d40a2c9480d527ed022eb4a198f893beef4383144d4ad5f65530529983441040b524800e5a6cb08902845820b9b5b7f7a7fc4a44d15140d48a84052c536b3e8d283102f0baeb0a34cc6369ccb9958106768b398d99c71a700ee9c5235dc2995c59d5c906cc982021d3c18920b5f0a3930890bae214a2fa6262da4a7ef07275e0a2e235ee850a86a458d515289e0bca8354be810ac6ecb902693470a750b0c2f48f6a6c7a30813e52d4d30f01882dba225061e448e6c19f38407529519a8cfc1a2659dd75a31e8d245959f2bb82ea6a46c8ccbb82e8ec840073bbb8ceb220d00907851e40d086a489aea1839cfb16f31096e7b9e4be9628fcbbcad3c07d5583efd503220acec89359a459250e188cd68e785b89b9bcd29f66ddb098500e0c8cde624e5b374cfe8c8858923900b7b0fc7791ba55190204284e0ae7f8e7b61a10907f8e28bac5166dd9ccff910bc98788209fdc585b12d278cbd5b715ae3a0947a1022013cc536e86d98d75f6e5aa8609edc51d4223814b19c7f82ddd35cd88fbe060ad49b9cd0b1c00e625c173dc74057566718c8a75873fb5d7a3206732c35b718cc83c2cd46b080d3ac744bddfe5c4bf9f270d655fe04d368878281fa5b0ffb58ce83d03f9c56c28f9d43a32302c9f27ba38f348d2bb6e1a9e11bb06ffeeee839b631bbfd7e866dc8b7dfef51f08dd8f7fb146c23e763b19b63a517f6d591b173476e57e574ce2879100bf510b7bebaa2e2b97ed3d2c9f11c15da9de1343f83c51dfdeaf663d52072793be8cb9de3a07339e618dbb9b66a346c038b6db4d886ebfb3b8b6d7cdfdf6fd8c6ebfbfde6485af08d9ed234fa463f358dcef9b1dddcfec6826fe4bcce8fdd05dfd0f96ef2254953b8b86cd886f7bf5ad7437965d867ae988172574daca3601a7cf93be92a754e071ba3ba7df908a5db37a96f3495297da3ab9a46f78d1ed3b2a6536e3ff912032931902f5172fb1d89c770fb1d06a6d1af139e00fb1c49a56f3813a6d1ef4e6e3f0e95db6fc39ea2a3601afdb0b0d5308d7e306c2ca75d856dc540cd40fdadb0730cd41f463dd891b360583916a8aec8dd907076ec1bece948d2153bf6111eaa27dc0eadd44b5cb0632bc16e4f550cc19406ca12942476ec250a8ce45098d24c1de5891d9bc93e15914295a62939d8b19b5e4c8ec3228527a6272a4eecd84fb72e5c18e9e2e607282b33d8b1a126c09acaa2089b348d6ba99c1c1555509921d253fd85891d7baa02aa21724cc034558769c18e4da581522e4d19aa9c9baa3141d8b1ab5e4f5db6c0ea92c552e7fa8c153b76ce454595a686a099424a6275f5821ddbeaaabb4db539c3e436e50688a936423456b779b26363d1dc1553b92bca7456bf01811d3b6b3e2d2d21c40dc9c98e7ecb80ea48921f89620a8c4b1451a2b8442186cb992ca52558ece84a4f309eb8c0d0c40506325c9450e1b2e4c51214253bfa12ceed892c24a6284aece84c2da521d24861d5e44e831d5d09b7c50d6bb29ea8f8d304538986a7efc6a40a282b382911d8d1713bb928235f0c29e253fe658a1d7d6a4c054a5262c24889b9024b4a892b29313938958711c28e4e0584a3f2059557f918afaa54b919d8e0925879cecf006147cf71172afa06046ee5576e055261ad5003c814b502ceb1bc0d0f7674ac3617e4864073c5d4c2a73484153c0c8126cab3fc4d0d76f4ac2532aa2e5a246175e982885c973650ba643d7143a2624779a34f4833507961c591a4263bca233838a9b42489ebb66407a5255176944a4762514837798b2262064b0b17555143965882e2831de5d21230b70549d29314a62d48ae6c51ca3145b9c18e92a975cb59110595155c344d81623f6ff965eaf64b2a0f9ae0f6cb2c59180f629c1a9c3c63e5a3c4926fa6740975fb5b090aa766c9f5ef97563c68e6a27c725a3fcf95f2692a197971b5aa8c81fc9bb3f5c29b5b94239ae4a465a85879b57a6d6a509222a5345de1aca865802f4a3cd95ae2914d4a59ef63205bc50ebe1448d0643372bd908ea266cae624ffc8f6b54257c82091d7d55951eb67452d57382b3ab2e590267487d41582ecb68701d9ed6f2155b7fb1a8edd74ab27a56ced2ef4414122da6275797786de6dc9cec12e1fb3003e9642d236a5b777f05506f244727a908b3d7ec82bc48fdc35f0f5f821af8b33297ee0cf01797bf077df78a2f365f28786423a2b21b52648a86c4eb3fea3dbe2cc028d1442e34d53968d7d838f4e1ab29a2b2c4b36dad5f7c49b90fad5c8a9fbfa4642e8cfefaa2864be73d9a0ff6397019070b619b2ed897ddedddd3d0f62a64dc76eda83d28e763de83b9deeeed5ddeb8feeeeb5dbdddd6b37adb46b57698fdad5aed2b047f557ed78ba5e7ab35dca1e3de99c41d26ff4ed1eece8dde9cd3b6ba55cc1c06030180c06832989599c9c17ceeb735e39e0386f4c84812f58ef4cd17df7bb9444b97f9dda703d832074627f77fb9c507ff495df0ce57fde4f7faff6140c21f43c1cf57eca64d68e5eec5d9c9e373de8aff733304862bbefd75b80840bb08dee2995219359ae79907d9ca73fe441f43f1bbe9c063e4e689d063e831f607071c4e934f073b8f5faee2c4fe81b0b4fe80b0bc7d605c597d3acd36efdc4f979a2e7c9efeebb47cb1934a5777b3f767777777beeb3d66e6f47a1e594b8fbf1abc3d677e151ec82633803c17bdcd6bbf75edf0aa86cdf762f1cbd1edefb4f30047f31508ebed19752cfeb72f878c4583b4b782fb95852e537db70792f5d9fc33de48077fd7d4e087ff4edff5e14a42cf4f2a752faccccf45be2d8ba14e7524f1c615cda458a2fb782cb5da4e0e17eee7d47df7bf672ec6875debf14caf90a03ff25be2803ebf7f55ba0582ba0a28e1d2dd11347d98591b3d369948ab30edcbfe6bece6377fed49f320dc77eefe70c9a72fa8d13fab2e7795ef764af2b90c1f673b7cbe512e56d47a1a707fb150463f9c71d7da36f6dbd8be3bc1ce8eb89b30fe4175fb03b56cb6d12174873ce39e79c5ab6d8c2ca953f63c8c7837a9aaefcd7e8197dec3352a52b9fbfbf7850470025b6fb640d17727d5f1084f92ed1fb1ed6a0025ce2d823a3ff8130c348f90a7388bd2bf6333441c8ed76f6d2fa1efc75fd9c52a34b9cb99e8a2f97e89910bbde832fa9c658c936b7a4a5284f56a6c2e4ae661645f22047727ac9a90a8220deefbdbe1fb712ff97962ddadcd77f200852ca693ba29c0af9b6402b85fdc04ff080afeb3d68bf2d90081499698cdffbbf9e411082dcefa7260882df4f94524ee340dfeebdb0ef1667ae7f072a20769981bc10e4944c8281644b34a1e594d32437a5b0f9359461c620774e5152814ad851e2a86efb3355f29c2633b3bff4319fd2e94d3e376faeebe75f5da0cb5adc58b99fbf725caed073c8913c612e51feb844ef1369e174212427ef918abceb8bd06c4eafa7dff77db1b0ef9c733a61c71ebedf2be4eb66ca35c0652d592c5ddc652f97b56425dd9d1e0f8dedfe73c2ca6f70becbe572b93e27ece77a97cbe5daf120970873c55c2e97cbe582c580b03d4ef3d6cb157af7f57a851cf0ae0b043f19c85fac000c247362b1e9e5844e385370fea3af1fb621f6e070c99eb0d8b740d87f1ee8c1843d831dc4fe85a3033bf060de97f862a059072fa7bdc41eb18379633171c86931256ceb7b7a767660b158ec5fb1900023b0b1afd669fd31716708471c3d02046169072fd08a218c7d77c2eef6dc0edc715ae3709a1c62200240d94f1c77ae164f974b70594b9698fbb95e5ec89f1376945d097ecb55410d33f687bc2e79bf594c3c0184f9c1f7531c5dff89de77f70b47ef8b8923901b73b99e9dc6379675edc73e87bb4ce8ae15c7be31317489a06520091359bccc409d43ce5bb6f1bd74fd50d390eff964ff999f681968fe50dfc0611af3a5ce7d39cd479f11e7ce2b5f3db7e70fdba8f7831f06ea8fb90e13669ecccccc93999927f374f38db5878164723e9db3328737586571e48e3b35c6da8ed3e7015f134c9897190887813c7e859681b2eed853c1072c6bc1c2ea71d846d8d7f320b681e463af49e1103dae1d43b519bad25fe08338682fb3d5602199ac7910ecfbb99b89ed86751048170693fd912de719023c3fc11751f032d1c8a973c471e882df6211cf4f70646b71ac5d1004c57e863a73c10745761a4ccce1b19c3f22b23018ec3de070fc11c679753e271cfbe63c2c0473421c9d30f63938e2009a46ecc170ac71639f43dae9b41a56d8873d188e5c55e3824d60e875e883abaeace5b1abbe17569f41b33b12c7bd2b7dc4e290695d66c22acc6526aca42e1017bccc84150cb73bf0b1cf38b9fb56add5937df7934da92696bdebce0f5609c3ef41f6c5b2d0c3f88ffc0e3f9c170e48543f4cad46cee34c1c1c1c9c9fa109325e5447fe13159ec1a23f99d00e25f54bec3895c239c36e9eb7d3dab73c9fc33bb43f799e41229ecfe155f729c0c1365cc8a9e48f95424426f87f22305e06052f3e910a3e94fd054f64f616e4b8209cd1bfe0637c18ce76c470b623ce18207ecf1789013a5970d04982c5883539580069795d03a1b33618207ce5e5ba216e799db367bd4e66ab4e0224104d53c63ccd97d5837c24b7bc4ec7649a2c6786b1afee641b55555521034d1a65ecdc9de241f25fb46f592daf6ba6dab7acac2c20f2a78d1dffceffff7faf8a40fbaffaaaafd2d18940fbaaaffaaa87c23e791015176a1f206118ef2f9e959595e5b4fe2e060f1f5fe0052b6ca6d8e4961cf12d2ee042ae25edeb738d08a49c4fbb70a4728a3d66276957b1c7a44dbb6743f1e4e30bb880c4e6089b26595417545703de352176fb93bc7c7c811a97a358f8d242d3e5a8a42fb788cb5149b7fb3eb42f36ad6efda82bb26e157ff8dd80ec8e406eb7dbfd21bbfd6065a6cdaf5efd49c51ed7ebc6fa7356b1077d797bd4dfd9a9228e2345a46d486773d2c0bcfd7ec3dd6eee21d9d1ab4924a8e4ecd9fde524e9a0ed124bf0dff153af43fee8e4ecd84c5f241353333593753925ede7fcdc71e24d5a86d61c34b5eb81a5843cffe9762967cff939efe998f9d19ef7d211823733f1d43d5826f7a1c5c4403558a6afa1953f4dd5a3c4ec266e1eda9f81b837171b05a621bf134b903fb2c5212530501776ec269ab73463a96fcc97efd1a858fbda6b799d7b1e9691b1ba894f5337e91b93a984eeaef94f0fe508c5a6d15f4397459cb9ea2a69951ba16fd06a7fb214ea3c76b968dcf2baae25d6e48f7ccf7a9d4ca4c91f1d9c1dbba99b9a264e0998cee96a9da41c1e4c24aefc190e154046bb4193d17288d8916941e3ebe6c0b96c2c175a2707cf6b87d2491e340a09b18d66a0a6c91c363de5ec9e3b4ca64fcf0e5fdd4973da1c3a0077a131d0147f6402b8d2935db1e3506d2866c3c7e3bcfde1153bf298dbcccece8cc3c809cb357a54b02c8e3db7ad1447a32b9f8f26f3d16c1ad51ca5c29b2815982e6d1ba54c9f7ed75adbf5dc6ac960f00f7d119cd632cc62e97fb114ecd838cfb356267b991403d13fe3340f8d8dd1c48eb599fc7ae79dc9e725a2d8e2f212516471c7ce758e568a8bb1a455633e076c2376e988c325ca1888fe055d58cf72e541b866c25fd84cf887829d856d34e8f4c2e152974b1c5b864b41d90a3d90a8d5b53a113665297d0ba0b0f5ebe5a823315c7939eac8d2a5f5e7bf6a388d3e1dc01256c7e5c0698dd5420363ce29ddddc5277777779fb25f3bd7ffebe934af041edb609e724e1c9df8441bca5db5acd166481bee58c39d597ef9d8a756ab31820f1c595f86a8aafacd15bed16a9886cc72c75a96cb625fc1a8902de6d0c6835cf4b1e2683ef619fdd603a8358dda320b856dbd477f874cfe8823b05feb86be7f3d0fd7776290ee5dff1283381575ef1267fe3571e6570c54bffa19db594eab5f3f0463a5486b2c97c8a28cdb1d964315bd5a9349211db52a73d4fc26abbecadf1c634ba0973e093e74882085be2394f21f61f9c187bdeb3f4f6cbd80c81fea33f931ab99c46ab562e24bd4d1a2af1cf2879e2063a06efdeb257d5848935d38434ffecc8ac07f3d28b2fc697f7deb5f624b647feec0ed102b4b9039a4d0f7f475009142afa7fc632dacc91ffa3487d653f6a4508d7f78aa255af9c37e3b246ef669320b8ad8d90e24efbbc7b97d5da3cc2fff8de5cbcabef043990cf6fbd7fbcf9d1d2cdfef5fe26cc7f7b306b0ed13dbf6fa198fb6bdbe6d2ff1e58f8c81eac7b6589907dfb7dee8b50309c9f52fa4d67fe26cfec7b8d93462f9e3fad6cf6fb5fe138d5aa251ad32185aacf572d487affe67a590b4d51ffd368d2a59c643cfb2ca0069eb442b9fb0f4bfdb1bcd910d699e68b24203153a8c913514b1446e49c9932f5524c9a4a8335777e7725411365a2e3ffd915d0be36e0ffee9ce74ce661c53dc01986760fe5cccdc62af19a873af9479824c93eedea07706c6175632b851410635b43332e490666882f1c577b2d25aa3ae9248b232bb237380124c0188ba228204575277b4566677c4cb512c48b16f03922dc858d855065b2c5826032d1654a2089b7339aa0a2e071184a91285829cac65b437510c9171396a851ab620411249282811c3840b2637de9021b5d65a398082439aabdb11596b240d4542c026290d45e342eb7294162c53522debbcd25a690650589ccb5157b8d09454f941b2f672d4151c9eb8f2441645a4086965aa0c915a6bad33cc550d449e5a628604c1c290145ddc91712c1525451452e48cd4bce63f4e4fac60c4c2de6470439b0c6ef6438341d513187861e9e5a8dc981f2ad6bb1c950bf3349b0c5551556e789f28235f5c7a390a8ad51dbfd62447dfa33e6ad77a33dcf16b90e18e4338b424943b32d55208eec863ae3c73c44b142fa4a2aa9031442d3de9d45c5145d2940a498419e248ca1b23382c490551440b36f93aa4900796a678818d1a1e8c28d964eeda1ddae5282757dc9ccb514e7277b44f83068c90220d0f52acf04413f904eadbc242adb5562b48da90a0852e7e6823612002ea85c90313921e28a53074435c86247838628635e4b9bc4f9496a66b2f476959bae3d73a2f7ecc60f065c99f389a21c907334850b88105304b6868152d545beb981699289076d6b82e471589e2c2b81c55e48b10b59ad76ad349e9a44961e5e5a8225eee68a558bf1c55a4cb944e8660353de09c308249912f2cc8265145b87407966680c10b93149535b65a8d2a92e58e5fab8146abd59418695fab81a10245052a0c946432c40a0a2570814c0a6b9a904b34704314370481c20878b805e15794c8d8e18b2263b07893c3937f2899e48eb21741d21434ec60868724ff503cd29ccd1a2b68b24082839632b51a184fa3064a22e112e4b0830b6c567022428bff20388cfb5b28773327542a31c0a188353621ae289bd3f48cdc0808bcb06213a2010b36a749a9bf6ad83c30b9a264933571c6a37e97664c931b6c426057b6fa9d68d44e048182954d488e0bb62ad27c83fe23db375f7456548d3c230aacac10c2260414c25637e8d0680055aa18926513e2512bc860abf906fd95f61824b26461a37da553d4154bf787bc19cc78d059d39f4f43ebdede3e1b0528eedeee2e9f711fdb867090f083032a574a29a594b286d736f76e8b3ed3e50d1ffbcc781835154fb6fa4e10e89ebe37c666f48db159f913847d79b98b104977ac5d2995dc18f4c18eb22b7f2e40bb1c756b73a36e672e47ddc2005d8ebae1703f64a11ad45208bac45045893636f90d82d04d10c672d44d863bdfdd8bf8e4532674b87df2d541635df1847e138e6ef747dfe64aafb790759b1d69b1eb1f631b5dc17510013c639c2fbf7f8ade112ebfdab5d2ee64d470afd49bb8e8b47d8bcfbf63a07ec97dfb7b6ebf8e22179281a5c50b2b35866ef317e93c76fdafdee9d806ffcdc969934f5934b998b2d8c273045600545d5c58b20605ef65e50e76b4ddc213160d48724aacc87a7ab09e10b164c8fb2cb1e3d36684c08eb44ea6596a951953ab21c58eb5dbbca209d7550b433898ec3834a9a8b49082d3224b0e0e60b023e3a67094bc48c17991e28497262b2f529ae84840163bf2540c8b6a4892253b8a6cb0235329cd2b8e7c57ec204204b6d891ab3e2c2cb0a4a061040b70ce958b62418a112324f880b2235b794ab92ad250596151c28f2a7664ac1615152b50210390a114a884ccf695412c95b2810000001000a315002020100a87842291480ee4d1b87c14800b759852785295caa34912e428884106194000218400008c31c42034662400841b56c86f71fa51417e37e4a71efd4006fa43a135d3dd9925766406335d98e1f3e42b414e52679ac03f9b8fadb2dee55c91f30e1778182846c5412f0ffa798402a4f097292e3f54c25f9bf50c5a21bfbc262d9f838ccf13512bf4298100996c1df0280bc341994c870ab3476634a005339c3ac35044545f0142aaafcb7d202390cf0e4619ad6342aee4896ff35f326500502460c97e021613232e30b7204cbe25e8d5798ee4187c6478ed99443a591507d17ee3f4044db28af9c22619afd3a4239f17ec93c277f28adcd5b12617c01685ea8c298b4fa3d65432d88bc90533c25157b51de23d6e2949123f0c450d880224a9cbfed72488d92710e8b226ed4321e6827097a4e04bc62e2e0a1d64c3da301fbb474a3afd9bc9cdbfe5fe9b20f199d9f0a907e4e9c9b7781d3914c58569fa7036dea1014008d1ca956e1b0e3c39d5e9635d5bedb8c92cc67d04a3ffd72f4696a91e01014c7d70bb6622a11365cd44828e603513073a02a899d4b7a23e85e5a2bda008ca259ce31112c100d47009363ef61b191bc7c2f60784631d254fd276a92219cdcb8de3125580c78bf433350ff14ba7523a0f1c12370fb631cd1d121e115a9be519f7dd5c922f02fa60dc1de55cb7e4790180facc5afa2332de183dce8bee354b21b45c62d69236ef2117f24b4405fee26f65e12f22c25bca9ece60c8e7d7dee37f2c11ec111aec2cd05792923b459d8e705ea15603cdf780e8559bc0a233c572a11c44f6df3d4f933733e9aca49e091339e428d9152f693fdc3274887c1ed38afac03b8162d70c32bcd8c4cd123276b829764c4c55610929aa9823c6b90c8ce21238edeb5e85faea737c4667331cfe8021ce1b669c6a789678861770b2a3962896746e7d7c7e501f18f50377e6323d27fadba284e56d9c46440ddd99b80e0fb7f5790c79193e6991c8db54f059fb01842936962dba14f3a73b0b4f62b1ec615d9d9c4d6d16f8b58f5f86305e517f4a1e0f6f61257baaffdd9b5ce6c01a6f85ea0dc58fa0ea13706ffa74c43727a1352e52f47229761169b983a3e23a562d7721af8002cbb03f866f0426f1e1801f62f99bb2933ba87670e11faf1e3b5903e40da79c3c87b1f4f819f9e01842de0b853f88576255d8a9ed0af895fd66348f2a07b3a5088497b9551c71de3680ae0322c1aa22931084f63b6492df2705fa031976583f01e568ece8af6c4d79ce5f5c59859e18135340d925f33139bc3a3731fb57177ebc4469508db24e289f37635f6008889323ab619f542c1f4b14be1d67b08fba2b576748c32e764558742cc1c40d583fd07b256ce20f28c3484c020155d8c8e2adb1110e8c9e3a4df7c2b33e58a9a7e91b64ea71afa9de5c7a1477e44288d3969f0dc465e5303d132924e1a10225790e101df415554b9efb7343201ce30b3b7ce9b45930a0b5ea74e296274da48b24628f4c94f004e06a5c089d88ff510c7d32d020ce5749f9dd54b6144708df323539aca15de33859670536ada3ee520a7b26f779c21fd5ae9b08c9298dc99eaebf440c4ff7e789ae30a8d221a2818c72bc07627527953e2e6e5037b9e2df569de38a95a5297d9c4db126b4c17b7054d2185549476bc3a402612353abe2e2d53945376a5cbd34cea40eb305f028f655648a4db4fefda2b4b67bf9d85739d13963ec899175688d8a2d0c33cc15831e10040f02fd3d316878e79a528b78a0c6435da6c25ce340d11c9fbc71456e2794791c94c214d9052118ed20add31cade11088cf3a407de4bbe8102d7d28132a9bec53c4881bd99f47398332c0cd517ecf456fcc1179316f452c7e6c3249c4a0165eba2ba422eae611a5465b3e8a3faf6b35cc5c1a216b649e4bdb8afd3077940ac2635f7eb166dc10edb075d5e1735021fdffd40b51fd28ac28cd742b756b4db53133ec632cb56f5942347191cd7e6302f14fcaa6645482478598055d683c69c1a592c3f6ca1666aeba3d043e40afd031d11c79084d629c932679ad7f8e465826f199954919508baa410c204cca2a60446307875713040b242b6a223352e6452fc5b9374f90ddc0684fc98add717c36c9fa0111575e43c2514e535fab39d6392017714691276deab6621e547308212a62ac848a8d78dae616383eeb0f4326fc1ef4b460d6060eea79b96318c8ea79513259e56c95160e62cec5ac56e93331a81a1639eb4b8a6a687f4c1db40cd5850b11a45db9b946fbfd284085c10500c37e26354723ce43e00d335e227acacae44a6b3539f363cd35fcc772d8726ba3f44ba304f0c2f9722b894eecc9c2da2496672c8770a2ca56c63764ca5738923b8b37d5c42a0251e6b66d6c7d9abe487c1e7231dabedab3215adff85e1fc7f6513aed6eb14bcb70c19aaf24ad82d413e364b531ea42f54cc7858d969f07116be9bb2e0300c32915da84f61a6b1298c5472abd8e95228a1c660a62563268545b54ecd57ae16fc10aeb2c9eb4855e941ec079276aeb134b1c76d03d8f5245b8379f22e82b500939b4bc17639f547948145660c96af5ce8a391dc34fcd46d3fa2b3ea23c6745f799f3c4d42e8952de67a925d8f1189692d24d0f8049f239026bda8b68ce7d62a5c0ccf09ca400f349a7631529ee4e26e7332fc4ca9f623c486b32b20edd172fccb7354c6d032b3b9ecf5a5cb960c5cfc7c12ec65bbbed92983280356d989cbb4ebecd6569020aea7e20352b3bb2fb69aee8a6a51df0d067ce3790361571e73820820437ea77f28791374a8904907a70ad84b30595491009b21887301019d8cde5688095ca3b56317d39894ddf196e1128c5629707ee3949ccd528ef7c4e7a0754c231dbac62e0577390cbd9311f60ec3cb8e96c3d4f60a1b4019771bdde4bd4a7e4b780071829878b16304288c69aebc0d34444f6ad1a07dc9f2a3083f214f54b53511246c4134be6b180219d9fda0be16a1c4d1ca6671df8f1d72fc22fa607704f52c9c810cbce163c7e8bc8843a770b96c958ae5387cb6df7f36b210fbb3459225f06b83e6c7bc8756f9403ba56ccc47c59043d04d3b750a516e60f56928e3860504956004554f6b7a0affb84a0b536980414e880133edd9fbea08010fd5c0918a1ead00e6810c51030e0d6e17c14d3ef862857e0dd2c503b7db37c234497773a5483ec6d7d9fb7beb43b7cf25b7ac86ef370a2c42ce03b60848e6f18930b6f9fe19961a6450ac39d9a55de5cb6943fe226ca981a68d77a989aa17ab483c4dd957bd2ca80f6e5f9f61c0f5a5f5967b02d7f6161d0e58a7a2176bc64f8bbb0ff17797b7a1796d40b092b78d907b9970055e4537e2a6e3713772e07a58a7a326cd600c2add81aba8dc9f1466474ee7e126fe0e021300c97162ca537083d4c88bae6313e61c46bd7ea07e456504707cd1165880b636213703c068645cf205d855307ced1c81043a691c2351e6e571d93375ecebf127be3a3cb2c2094cb8a66d47dfdf26071603385f8661f65d099ddd7c22648f6c5e861de69184ae19ca63ee7a1d68607f56aceb9e369b12e7b1ed37261d9dc1361910e633806d77a8ea7a067d6cc101f39a2503ef46247f505726e242c3d2103140f401986032a030bfdb7ce5a6b1591dbf6381ea31e88dc47b03634fb1be460c0d9d7d91d7965e67c9e70a5c833de5d52cf12f64e94ce265efcac479f97809ff9ba13cdb4d7094635a1a63fa04eba1b1b1d3b71b3f2c2b2716cb92b0aa7922872de90d4be1bcf06ea21cda6653e7f2df5f3aa0b33ebead26ab7618e26cea3040d8b83406460f79390839cf83dcb63d26280333194036c26b5716aa10542667907dbfe5d3f1197b4aa0c4e85596d297f8527defa46280de22946203a49a2b48b363850ff260061072a49e42a7aec7b10d5b4e672716cfee4ad125bfc9741eaeffb3380c34cf02faf2be702901256a5ed80e4f684b87ffd87d962c46bcf7bc11b667d728da01e4f5f17adafc0e7e61baf43e3636b695266a2433559bcf5d7698fc913c59b518aeb4b6c66e8e8c37d30ef931212733329cdbfea178dd2804411f2b6591fffd5144a787f4b3cdb8cfd083257d81bdc4edac8fe5c2844f8228b6cc45da57d72b8fb0f62f30e42bda5dd50fa2e834090f509caf7e35bc5a4d43ba829916776256218d8d43d1094fc580796356c45ef880bdd476bbe9e933150892ef8a81b897fa46de126617d52c23c9d9d0aad823cee0e4f2bbbc0758b2ab0ce0d4d343a89d4779083544521a3b80480319c6f7d9587e08064381416a74e492478bcb0830a90598b90a2e3c115ded0db6fb04a438da79ca254c54bd77558ce2612800a7db2cfe7917076b8df4cfa1cf1faf20a668dde5d128fdca12374ec36fcbb1f77f7f1c9ee2bf12a744b6b53137edcaa9b776ea94f34c1e4cbcdf2bf02092e0a691e2883f16c852b119eb012640e7cb697426b133703df66e6615fc8753cecf57e28ac8ae88a6bf800b5da25343b89b6f868393bf0c79ce2719fb825b9568569be30bc3d5806aaab6a19f2d056857d275d563211d0c11d40d06f65d7a260cfcbafea4a6bcfd422c60ec284abb50a98465537bb4a7c83322aa591b6429b3a6698913153b799a0bf09cbefc7714b60b7ac6d3e20f984bec3620f53ae44153540daa67034fc85b09aff1f29cc015478da5559651122ba8501a67ea0ec02db71dd865bb49b381374fb84a23e44644badb7f17a6c4f606f6befe6b6f89a0510a10677bbb4d7e9e165010e3646b67beb85eb102a628ba121075705e536eaa2d6fe55bf0fbcc4250cf007ea711cfe59e5b6720850484d2890d591e5d12de986e75afceb10620b96f6ac0e27c8ca34fe4ca17b1a0852b392455912f45817f39cf02a968331031c823ed8e022c0d06789c61eda6832e9c192ce590b5ddc885d74fb570828880086f5ba29124dc73c9e1f18f8cb83a1eecc8d51ffbb0bbfbf4e671ea104004c4a97b1aaa346a87e02fe9373371ee006d5a4d4012c166c0e3f40a72c77a96bdde65caa49d3f084aed6f65c532abf408ae08cf3b513491a7e09140d7355c89410f16444cd855626314a3bdd0af929772252f17672207cc8239ddc75418d3aeb0e598d4263cd3eb0c4122b866b042d4fdd6cd32b200b0ab1e8fe08f5ca4dbc302807c2cdd494b91dea769564b1aa9d4d83529d1d786f471db47f9dbf812c3843e433611dcd4b07391db4d6e4db7ecff3cfc0c1ade2f451be34cf7d00d86a482614d1b015dc99437ab043756346f361466ffe977d8c6a4bedf4a37414cf7f8814a98a06a4d11ef139081432eb85e856f033ec62addfa2f91c683f52f6bc17108662b6cf4a899fcbc4e840b858fe3127d9912e4ba84352f88c8d34b4338473dc94c206deef759957c90157d712a0e534a485a8ea755d2acd8ff22b5ec754c21487e5d96551e275b10e20338bb0fc243cdf6511a04d66dbcd9a0c59b1657c9a924c78be832b1242a65c02f041293079ab2c598aeb600211b909fbe694ceb1a91faac3f8037dc370d8af630e4637d8644b517309f9074aba1c8edbbfb857cc617e972f10c672ecac8da1ccbc7c680d4d8e38dc6f83865446736e90b4b6540e1145a7e7d4f201833df2c22317721320a43f922a629b197460b21bac26470e3012cdbc5d384c5bef5209805648a41a4c5126e3c7129dbd1d48718bb316f71012f504fe1687cbffa8358f0667e528e578a0463ab8839ba62bfd36e8216d8d9fdf301723527c20f87cfa612652e6f657fc92d57f98359e733d481e8f1cb9ad14cdf7f725920572c678782d9271c8733aa1629a9c9dea4012e5b0e8117f1bfd81c74324a28d92661c9376196bb0ee04e3883889fd99a18a4131d189d9a0ca03e73d0d6c167d53c7f58db13aca35a323c572473bd03de31c1d69aa4337b8a794cf5ea962fd49c035137dc600bdeb23f5fbb080f30e7bdb3c5de8a24954aa534d0ea27fc20270eede74fc4d270781c39119a859af32ccd19c9ef0875032448bc93808db1c4304694485f53b4dc507b52879a027adf3476269a8434272bd12220505682fbe978702073925255462b3a5cb14d90742cc29592266dcbbf28dd6c3571358bc6428fa28993e333189c60b9821cc89f813ca58b0c6a3da74fcf0387f888f1943a1e3306ee4854577b25500dd28a84ac5fd1026f76933435ece7f38bccb0ef16c744284abf84f3a24b9f03d81a3c09449f6e2e7f684ae73749e08bf4992cfc9d7e4e95f3045ee15746c3aae5ff62b10cd9fb705b9eabaad56ebf5e1d2a4f975dc27965097c833016d59eda716530ad9e29e58e2f2ba171399cc3303e5ae3907584bf5346e6b119f0b0a9fb2f5a617bdefade95f4a36e2861a4ccc047b3a3f655b4ff9f65ed139f7c1308f32a22c6f5b56c0d38054d024fb26ad4b7c6220ffd7912ccfab37b59590f1a3490c53afa5870b8463d7e6251a9448d575e4327039a2416bb65d25cfd6ee136d595e6bf28e96b60a58590a805f166d4d0c8ea09eb431a81be04dcb6a5475dea07f0593afbc7dd138a9ff99aac9778bf440d3e8473fe34a663d0c018faeb09bdd5c1d283ac464cefbebc942b49ee6f4bccf3c2e59248cd7bd3c5c0d93c9b68e34c70403a73e2d839b36ad4b424adcd7eca3a4b34b2e4aa294c847bf977559c58eee92299ace0fabd21d7439c6659d7c74ddc78e9d0710354e45f45f6fe396a247be17fb7067eeb344b000787dca4e003d133fd045d75c97e176320d3264fa91324411d3d6080cb99eb2332a26f204cee4d7ce2d8d399618481dca8d8bb577a183f1ecf971c9b94ee228dce1384ee7c76a9715861055cb09a933ab602b2920d41091eb5c14ff15809430c901aaffcd70ecc051e87fa6d62f9a97e48e4a60347f96d0bce2e8dec8ec3ecafd291b9a2dfdcb1219650d1bcd0b4685a4b6302c3351a5f030a799172a6464d3032889fbe1777d41f42a5959442551cff5242c8247a03750457c416f0662b6041352d1435855348f81566769593b1c8eca46e86ae44ffa4eb90a2af3789d3ab3c893b54778742271342e390c1c686d59a22586fb3ac42439011697dfa5127a83f1412d36e3dcc7697087d07b6fa472b9abfa79535fde6adc820c5f0e65d1cdaec158fcb0fceee5641ba6ea5623b95410ae1367bd55a265c78805db58af2fc062916dff637a9ccd0afce96c349867ae41c7a1686d68f056219aacc81a8c291930f9f4602a9e861aa0af51710e05c594434d56445f23cdee64b8c5d43eafe2e6904e97a8fe59b36c8ad1e7e8574ba29ee1478a180d0bbffe8e5db0eac4b47f9f78d91285fa3414aa7293409848037188c0750cd2a349948b7c32795d0e48b4566f7255249f48d56fb2d1785ec3e4934a3365cb35af90b02ec768685ba199072041c4b3d6fc7f099495ae99da95255adabc5fc6b3ea26ee056a445950003afdc03891bd0964ae84e6f6361b98999515378da4037c2b2dba5d5f91da039afa378fc7a382be0079792ae9fcbb5e2920e4514c155eb025bd08bd142b5bc67fc3772fa6feb355d02c50f969b281e43804804b5b01703c9fc386888d4f3bc808c61412de13a3b70e66518e56ec8de304b2901d789effa31cdc8d12331663a1a9c61f62c0584c99f5ddd782158e3df32f5509d191e06bf97defdf704688d80fb48b68b42b0e009005d8361b758ad1fbcbf655c4b2a965449a359738c91ea7f13a528a83880022c893f51020941815c8f6996c36fdf537c9ae3e11272e9334a57a911f8a563c47089a4f33c6b05bc95c002db0e040089ba31503222b6b54525837bdc6966df58548e790a38941b7b28df87bc6c7c9c66860a15913999769cc125ef58f83203833625062ec5675aafb700b489366786c14d621ca9edb5297f590ca43f71a2c93211cd7e7338dc1dd8ebb1015c5d12424470c46a0dd7a8f2862171319cb482092da1a9866e56b5f20afc1cdfa0247d783368164409d05f95807e1f7fdc143ead9269e916c125dac91d2cc0b267fcb641e4c08a28067b4508b77d106fd4849642696f820982df7344ed9910a2004ccd8704c2cbf10917ad74c242e5808f9e39122299a3ff4dc66f3ef957666564a3225cbec265086bd05351c3ecbff9c41219ab8cf3ef1ac58501442b083c09a8d43b26b8d1aa886ccb046d04e152f471b77432816139a18ff6f20edbde91351ce7c4f4be25a6109812ca62dd66eb558ad28fd6decc03263fc7ce143f60af7575d2048213b5011b78ca3e2c78c64dd6e38291b46b34ae6abc1f188057d17296bbbecd5b08c0395120211f3e9e2d588d34975f8c6cdaa3929ef58fd1f393b085bfb0deb11b433c449961c48195ff4011a493492fba7d4e54e94a3c38d1521280116ba5ff19b627d858898c403b4dcb0d1c80e39fb9acdb1b836d6a7605e93281cb1f64746e6913a8910e27abc301b4ddf69a77038cacf1f36a4ca51706aadebe9e0313585adf901482c0de6b14154724ff40308a4076d024ade8b088441d7fe1d17b15bc8bed23921b6101b05f9436b382ebea409e6be863b340cfb103608a87da97775e8cd056c688353112942790ed56ab9da46322977ba0c426af2046bf4025cfa04ad8809dd04d9321f7087b135cadbaf5126dc5c1182421496f8b50d230f5d9a103f0fa1a2d42b4407f876a92b416be125ac60f0c9c10ead93145134cd1cd8b968768bd42af51da46073c0a19dbb405cc30976c1f3874324bbd425e846303b8c8c01542d6863233a122c1144910a8b2396ad987306a4a2dc8273a40d741b60625150922d0167738bac7e4f6b6ca52ab1cd0ada5e55d5d5752d9019f707206290d49b31c3018af200419258098cd159141c34d1fd803ad74a382a4fd32c57d11a932a0c6d9561fe176513e0cdbb61cee338fb54769c20084255b3ded5093fe0783796b18b85d5d93e650f5e39c53e317bc0e881a75c542a36653e517bc0525f5370c68487183b6e3c4f7e9e9ef258a0d67e09474c70c475e761cbd19bc62cb9714c79e9cc13e1d884e4c226f133e181068456373ae0cdae6b2d141dc72b477b0d864a57f5b5d3f32b6bec7e8d262d8a694a030ea07071418da035f40d4bed45df3c18aaefb09817a51e667e81e97d077849033beb4ecf4be80b504de9baba66bca16141bc89bdeab8bd66af424b266e6fb79d09ce85775615d43a99ddef8ad2f6813a7b0f8603ab8f6e6ff9b3064fef8b1843c8915d4616921e58c93593760469b8dad6017e6b289acf31b8b2ca59570ae8bbb622a1538cf7bcd7e41bf59101d56634d39064217d21d63ec8cce3a1b746ef54fcd124607fb34893792122e5cde06d875e2a7330c20383d2af3b07dc37a3389d1ec6197ad2e0586a46d700cd656a339bdc00792a796e3a07131a01a9f47d872938a326074abd889f81f8fad0f2634c1b8c6eac8af67ff9fc9ad0c1a862748e04fad1c8454e6cee6fe83804a0f16f68a6b4737aed674b5caf706e8ac8ef421e6e7f434e799bdfe8426c359764492900d6a7f1742e3a32a0277731c82430cb7bf2c4fde836c50632ee7cffdec82c03e336a1042d3307239ced5b886bc13a23e0a7bfef22c1721d97214e8c50fceb2b4189a583610eda9ad21a0a60866a165a799184b520baace846a7e79a6ac1dc74cbc53c67f30ebfb622a9586a3714e9592da159a5debe8ef376708fd5dec1b17e83d5ebbdb41814935a69ac4c5194d13927bf7fc501a5f5fbd929251f9ec33800c5632a1236f844a75b49106adad7254e06e48a1b13ae4cc0f09463d6ff283e68cd7a01c52720e0c22c9140447295798afb48c93c242df820ff06d70928fc6959be3a16cac9854b572de7f7006af27ec864b576f3b4222d91ed2aab11e66ae912c1040e0a1cf1cdefec6eaa263bbb85ae81c724145f093520014597200a9710d9127f0b3e6601928453910e17a85f1700038486bd8c132556b894455130a96cab26441c0bc9510a2977e87ff002991331f5aa8d4700632fb2f11ddaef0203ad8c14e2cc2cd7dc0163e03582a78a78074d103cc4790f0325056dc2f044b37a80ea8397ebb9581c5d22123415506f9a081e9424dd3413000460cb144a8f093f619971faf6d98a3bded5c8150e7413166232ed59b2a4f099696c62f47a84c39930d26ba981b41aa55d0469519d6a4acb8269aa5471e45c94652ef611a88460bb31c7bb2596fcf65929e2ca36297de3ff4e6027e4d503135649d8fdd91669d324ed39a1061a3439a53a5a60a326dfeb45eec36f832018b5b444f0bf1524b45cdbcf6133bd96a4dafa1c9efca189f8e1260cb2246d8f02c4842406161ad13ed4a55a87b294eb4789fd175437eed5b028727ffe7439b1c3b4962407c30ae26991404edc855c4a01c5b54010584e81680ce4808f1ba314b00ccfba5f19c02ca4a4e14357bfc41f98a3377238f98de8844d1c3ca022591707774f4352b2a1c5d3e856ac9f5660bcb587e8c3580d6c76fe9c396e06ac5e8040ccaa46037549f8d900d9c29c40f96a1863c86aeb7c375f5d3c484fb534902702304fef264025ab229fe65e509871800b224b20ccea288fe7a38787a3b7442f300101b79ce690583384cadcb2546d468d34318fb3280a853cb6d60bd4f33d2143dfd03c062772ca6c9ba4317a3b61dc658da3e35c91a2fc6e2b1552579c52359a109e27667e7294cffddd04a0937808253b7f84dd977f9a1e00b88a219ea7dc50d329fdf0d9d0ca0c23882d1aad09353bb1ff4a53f3250949c67d1da8d420556b4d399de51a0c1dc77b64dfd5c669e6d84efc158fec2313fe629cacd1733c4a5f8c71a77218f2a56950376c64d7302c4b56c31fd3d44959d6afad7bdd39dbdb4d514855c480f23d106dd50844209b0a546723a4c4c82b2f1d71dc3460338f8d59c139c842d5b22de4709c1317182084200a338990fd59f7ce54cd90991d2128454a0823be45aa93e14446f90d808f06ce74c76f3ed2ed03b0dbf5cb80fce8936eee86dd636dba53a6c66c51b567c1262da575c4e3f6bae55ed01830892898fa9578f4596ef081fc05ad20c6c58fdd0dcf9f316b42eff73de75ae1737f10f5f9aa6898b7c8838197a4cffce9ddb44465c92bb6e77a1f79a172ded3a893f17beec8431da52cf0ecc0f78ae3d6ecd3da29eedf8769669d3e9bc7e6e0e59a160110e4e82af2894800721638c65f60fbe3e80b6d89fc99b52cbfb50292f3c7f513bb221f42234d64197a56260bad1f06df318236cea18bb5700149cb01473e335d7cd6ec47d4ae8c902077106287d67db85809837bb821064c9ae0ff9552405a68929e054cb5af4d845b6d342184b55aa25e7efd55e379ceaa9f8672817762842a1958162306ff629d0bd6d6c7e991d61c00343e2b400244c5f483a163a9a76ef38b8e8750e0b07d4be5716ec971e0eb409db861747134338c8989bd4325f3d7b5c999cf7ff595f841959225f04d5d170522941e4242a972e12f5abc280ccb6738669007b59871ce7597f9596b003b41c233b50f35c950793c3a625898fdada168fd0d18c81db19f51313161545845d8db20b339eb7acc5cfe4119b746d671b1e80c3fcb29a0c86b22088fa77ac035a07eec5bbbd364c0d7c4258c3591cc102844fa863353590206604838b78558ecb075a4cb6738bd2e4c203ef9a6990b8077c627f472d0bee8c2140ef111468d8afa022d9d76117ca87b7f562bd0892f16b574a924ddbee141166977844943c09b3e65004a5bf0c34ccc6c60b70d774f6758b860de80cd08d5dae3d0951c5bda3eb9f3ead78e19b26e2b16cd280641c4a320c051ce540433997b337f5f2110be182a954eee183ef8a93ac4d9f250531e5a921c79e78bbde82d4995da489170a73f9e4db0df0c203655f0e52f41305e35365908131867fabcbe1a54d0198c1d001d11af417a6e0a7e75a7fceb8645563e33fe0ea2aaa4c4d84c7b03c7f05ec37e2bb1e011bca3f17df3076dc4ad2d2d242c42ca857cdaed821a0a95438cb5018b43e305a8d188b890adb3504180c7536a90daa81ec34130865db10c82f9501b67a8f50a0c02fa63b8a8ada4967fcd9d7096f7dce32d854e0e25339b217382d835c555f6d0d840f72d0b1a8f8078f55d7afa537ebccdc6a75981a74f60f7f11b600408a7e417ed66b889f940fdd779c7bd194af212853687378f56a0b70fc89b47aebc32dfaff70e392f74382fd14a06f4e43a74479bd371bbf86a09ecbb77bd6acd63e2673d392f61330dedc85c4531316016c08a1c3ebe72060b7a0df1615da352da4b849123a5f0390e3536b2b020899d99ad0c2ef0d9f963e0d203764cdd806f92e8485ad4537bac7756ed400946897d756a569b00687daf7f519e73b75161f0cddcf79cd4ab672e45a6d8e97637a3b2ed1e520a983782752ec266d22ab3b75479ef5a9ef74f5c2ffefa4523dea50a3ff507dadbdf1bcede271233116c70a9493fb8943b903b84b2b340b63109b327c12914cf9f200eb131b0e0df5f7982482c37bf784881c7d8c294221c8b989cf0dfbd0367f07202207ce08d0590e9507db901a2def4478df167fc7801bebeb7633ccbbe3aea84377b533d6d00c90cf9ffa7e20d8809bcdad167cf47ad4ea2790177825eeea966c020f83dccf087dcc27cd05c1bfe448419ca557c94d7513dd0228139b7ea58561c1ba303064f3b5b90580feab4ac661677cb373f9d52d8044c40e120b5b4459c9f795aac1ed50be1c1d18a72703a42ab317bf108bd2c701a955618b240e2fc14c22221085061c28cbcc83c491780115367c83057491b516cb15c1fefb132bdf617eb942fea8cc97526fc2ba21cd3266d82412876b9a0f83578e7faa3e631c16f8749329eaa03d7cd9718b44d2c8429539cfa8eed9ef2d634692c048645e5f2c641539c83563e8514f758bfd2850d7bfe15024421875917ae698cdc1108304ecd83539766e0b22e820edd45121b336072e67acebcb2e1a9beadb84f06248e4f72b0a00288ba59f67ccca91cd94b56cc6c1e8ea77b385bf2c7ce0aaf026c12fd2d7428a5e482a0fdb2362ec17be85fe971759ffd054919a45cdffa348ab0e5e812030159cc03b19d78b2d57be5c076a2d09f54a91f91a49ba38deefc794483c836ea63ed4252b1312f2617c9948a867d6d7c9f95ab61fd6af15f95d66c265bf9a98fbd75c3e73aa30e0af0f8b1e035b13a9d0bb613e8de0556ae00be92606bc95a90ab20462a7cd6b5b9b5fb252926704257f87f4e3887eccb60620efbe4d17cb84c9424c342f989162ecf423588cf36aad32cc19b0b0eb1b1ace3a87092bd070b0464216d203aab6ddef2b2758374d2f10094b4152c7ba5da4995e89bd4765a7adbaa87d5762846d79d52e6621c10e203ba175e7edf5ede13e761c2cfaa5cc17e5cb64618f69853c091ef9fbbabd8b57c9e2d72a14e23d3ebbb67010d8f472c9805423df1e68dcd526e21891d5b0f235e7a59aab86e75f882fcfd28fe8e2aebdd6d2b19d8b9b19a2807349686eb1606dea25cf97b2e587d203232137924fca1db45dd2be7de55b6a760dbb01e5b2661b3381994eb61a24ccbda60bd322646a7ac4114ab145a1c3473ea36a6628a5fed87a616fc3ea760ca41579e138b62731e66143167f791c88a67820b56292353c9f9f318db9a142be455127972a298055e93315f9e548c6518e1cae6fa1406b6ac8f136f4b0a217d2de576672ea170824b1dcea9dd37431707a0bf6a12d411f163bb30d90b5d972394d7b6c32e87b7b5b7b88f6c88e265c2324565f92fcb17008f6c5f9e99323271165a0aa6a81494490d7b935981dc43c5296da0ad648d16551654ee2b7a98bbe0f8d0a5841d2aaad430aa8cda85a2ddab1be7d2049f241c3e5baf1ec8d341b36f8eb49c1ee56083c6d28f71cd6f4653cbd98507081e795a066e226c0fb4d2c6e1fd7fb7e177bb0d390319b4e0948c720ba8b1ae58c6280247b777a7324eb1d57c9fe7330ae227f9e4a49350e44726936775937367fb46b624b6f69ce3a06bf0e7f9480d29061d72c495e0d7b4c9d66289d944857fc37925368e3c34d03429e1e5273bc27918535a15e7336c140ac8124e9c2e9b561880179812cd08e33ce09ea7ac52197b34c9da3aad9435be0d6aa53357fa1303870de46ddb4358694ca249e4632b25d56f4b458f9b0dcf5c91764bf8a94524c589c3756bc0b0af4f2badd46e6ee0ac4e6156723f6f6746312a50495dfe4d5a1f1fc85412b61363b5b1bf5f6d29e1e2c6946868852701d5bb057df911b71f550481dc191d8901a445c12b698ade5583ae67a0f226d1247d3fa6dce4a78a0cfe98d9b4b0581b47b88f36c34abb8e7737964df85e012e77640ca78265a13f4d3428329c1e53f6e152cf4715f8b129145142156d8dfff644233ff2d175d79f87bd37e1948fae2f574b1d274b0ec13bde05ef8db54f1982cc795a40119ee01099662614e7201635d490e7243caae301d912c0b703d8dbba7a78d299d1fa70293202bf7cd10a7f8bbb3bd231bc8a97b0b0060817e13e747687db9876febade1be570d631772395cb676fab1fce95322ec350d9672423da22ea02b930f3bfa90bda31dfd614047feed67c1e4cf11c4ca91fc2f6b74f5383521e5c1cec9e3d81a8e5d948b5400c87f9a0fac49508eff3e1f95911d5dd13f3f1df388466a3af4b1c397446e11f2630b55b061d9b76f2ff7b71885a8ad424ad8f4da9f5b901f5707b438c2246983018866826cf7eade1b921ec3251f5a6283d37699964998d56472bd1a08fe463da4a91ed118af90bf3a7ff0d49fc554f5aa79e38836f6b19ba777cf37f8241aa725dee6d7fc0f1dbd3e059c6b69b75dc280217426f1f3a251dda3fe726e24a0bd10bda449bd55df63cb9bc0ce77f0a32aef85c78d69978e9de58392a631dd21c0dea658065d1a5c2597763c846ac512e0cd160e9448d1d7cda8a5198cd8a825434d4a0170cc266aaef5a78c7d030ae80f136dc41692473b059d04b1e972943d86086ea019511d615e21272599c051e54e458b5873eb3450437a251dd7fcaa5f6b549f1cd2dd1c82dcb680be32a1af7f38f20067e7a249edaf75ff4699cf5d25b52ccf8c35945cedb620f0b9236b267e804141012da3b543abe6bcde1f1e363621ae94da82f61cda86eeb1b2c0e4523035499201ed5ec1933f73104ebaf827eb8bd1fbaa09f829a7206e8369619a47be9ef37f6563e31271c9cb44bd580747ec37cb50f32629a6233c07239cd8ca0b091cb24cce0bebaba8362701d7570b8d13a960d6ba7316ccb9d12737436617e8cac9921a7e15604cb692da81213980b4742882c2cf0d38cfe221b8deae1d01bb26e4ec56486e02cda2b172a7944cc79857a8744533ecb0e5d8d59a67be46712c48ba5d2fa34fac8fc8b3b12f3bcf5a06844ae2c44462761d752a8de2cb38b0018e868581ebacd22690392810704661b5b3536c8281fcb7e1ca7f216892a1b09abe4260a96cff14138920f514a3e86139bcd09875be55d9b45e8a674980170c2731f53f221f7937c9474a400d35900bc75a41ff4d50beef98cd403e4e7b30a89041d6a107bb376dccbb081368e5d5e64828a2e302ba0b5123c048249c60751ae5c747716ec4bbaecfc1c687ee3c34bae01e5ca8c22e1d791f12a72be28d16c4e6efb85c162741b27f2c9d5c7cf704734892da45aa0cf00062c390c5275fb52c7a2f900c1029afdcedd88cdde606925011a85c42d6f3c70af95c399ca9a7322b5cc23e58543fec4ee52a87532d33106f8a4d0167e9b7db2f16e016a0c86ba70fe6c03a712897083ead0d3b31175c331db5963c30408370c08b11e7f457ea44954a54a6f1c15ed771eb2a0fb1335a42967fd05809a1f6c3c3376a6fc80657a9842eda066c91f9fd9043b889f822f83c11fb28e83fcaf2864e5785d0ddbbf60da73b86539feaada1b551eccde7df9deb238a963666179416234587ffa89eb4e19b2a992ae6d68a07e18a672a958df1c69c1f872a9e2c9b2cea80b223aa626b3b23d81ce4a598d2d7c374cc978fff163eac42c84a6c0cf88ca6c279579ded7d6f621ab72e180f5b0279c7b72dbadf5e04ac30d0764834e83d5f15b1e50a9046a94c6fb653af7ef215a08428809b8a58032e78dad5ab058cafe3124c000144920d85333c62dac934dd83c7060d7dacd811dc81ad13275a020e202f8f9b8632577249dc1a8a2dc25ffb727fdcfdb7f9af9ac6ec8a6f096260f7af709b689a22dd2f187ebb73df5e439d2f9361a14b98c48f9eca0c5259abd3722dbb3bbf98b83ca4f440b6552b1837d7aef7c607aee0a78e18a0ff430591b78f62cd99fa314bf7396733b2e7d946b5ebc34d0d86158bc6175d5cdc99560970f34e1aeff5650cf47e4237cca0b53a981862d0e8931b0ef3d8500496e04dbebbbf15ccae0da299dc0fddc597027e4eaafef71bee2d6d74829fe1dbf3d2d7836115a80cc5aace84838ab19e5714dfb010b8c79b0008c6f8d350d3c8687dcb2e48ec269d8ccfaa9d773e7207e1dd28a3857144a4d52057cfaac8bfd41a34321509e9b52c16358b068917d5832c6654647c4e2d305072df04c35b2178bd08b8c29e91a417128ae5ebb95df1a24a06d1f1b1eab3b5b1ddf1818d613909ce3234242c2aa8cc5e163009bd4403e03732846ceadcc36fa935d62209bad635a69c4e13a71f4bed4f81a9d514aecc664cbfc638763add6f8b99ec84a280cf5e9683e07b20b11f1cb0fede3eb5ea69af42e40ec973ab65fe40f5bf283aeb72556df84c4808cb28231132532d2dca7f78a99c857e7c67ef2b1357b28b994988d90a8640d8ed9083d315e71d5162c7ce8d08d4660ba990109ab991ac399b951ce4c46b3fe7873a39021e7e12b04e653a305ba793a54003c46769dee3197f2ad465a298cbc42f3d7a1f480efe98d0253cd95342c4cd22049cbf0b0c267a104c8b33f961e2af95026fbda6d204736b18b49700f8e87a21d096acb73dc1a7ff29f49032c5c2e7a45594740fd4800a368f7e08758f2450a803a717f5ec012549c04bac9163b8a99ab94cd5941671781c0f8fcfafde5279e14be8e5360e18d26e85740bd89085e1df9bc3189fdd34c6e9538f47d061a2c1fdf2529f4b2494a5f0f6de1e40b3156dff9b59f4299844a507cbb36f7bfda9c35454f47b3690986958f46c80710edd2d116c5e0e4faf7c5a68682439bb925a164969048d9e86f2474aba183af13f6dbee1e839e9c36e0a6aa342c86722b6e171280e1ed4e58531ac8129cc0beaa041af085c63c777a5a66e21c2b58b18379948c3f5e5fb3051517b889348deadb315425536fe5dde70fecbfe37a5e3660efe3c87e8ece9576674bb93db3d0b47f3a771cbd8e7fff13887b7bac15735d7c6d9c6ac15dd22a400f3deccc24949ae9219c9ca1e8fc88fd798cfe5ecc8d259a84fd442be39514c7d0b7fd08ef112fb70df9f231362776ed9a766409b8b809b043c681159bcfb72331de75cdd6bebd4c453fd704bf7dd295499067191511415a4536897bb943a6f5f5397ed9a8ab85ed1cff8782a3e889769e5306737b81249517ee2a105479b54f45be9d580f83d85c8039d9b34ad6312d86c6bc48c30a3dc1c3297d855d49ced13e2f353f9e41f252b6a83e72b6afd2a5e7cf54068ee99f2191935166c7d7135db821b3fb4b5b598bb0413b1a30d8bb731e19f57b969083ee6bf340b5547dc0fc121de1d079ac11336e0cc865d22986d3b95826fa6de54a45e9d09f63f2154a6da26dc785d33b36e6004414424fd95dca6682601fc1d61417713aa6a2e0ad11c03e6cdebe24ef83ac1191f5c77f43135db0e3f7fe515b185873d6f6ceebaf125fef4500e4754569303240d40e6d5c7308cb1d27efe375c5a6d613abbd2b196cb04becd63fd8e1612bdb291848e6089a5258991254c0f4c6f4737f27c3e6fe218f59b7e3fdb5423066cd2eed6fa539b4d0018ae4ad65ef9034d7b1592556e7d5aa8051bbfb112236bc6869385e19ced1e2fc2c4db4625d439cca0a309146071687ec3f7cfc94e3aa282c84f080aaab2e4462f841537eaa96378bb74e2c2c7e24f38a3f720aa5f37b4b34bc5d1b2e38ae1fc869fc8b558a35cb6e509670a24a4fd9d024ff6b2d2ce730e0f0359495fcd98a2199ca42b35613db27865dafbcc75c719767c48708733e65b53d052ea0922b1546b33d76cd9b1b0b11bb1b79aed07a20e8c4a99f0a37132c6b86903f556db9130b354698e3303e50c73aabeaa670a6aa297c1ac7e9c66f708fc5bdbf397474a34274f448d7935d8b040285192b6600cd66042fd41400815fa9e2f838c315c1a02fb820c1dfb36d5fcbedca77aad73ce9420e7e52a757edef19e21909bcbac302c7b1075db767ff16e8c933ab79b7ba4b8938f1ee2e759cbd383aeb18bdc883d21b8d03d0a312cb2c307d754889022acca3169054122d191dec1546eeb6b12b8bc940307c36fdb9105d512b5d631ac344dafd65096e51dab35d1c33fb1c1bdc6f535f8467dc5b54b888c6e58e2894fea19fc684dcc35e22e1126a7520d75d736a8ce3e91655dc1e8f46a99cd05c5411d72b6e1ad6b34e5bcedb860ed62310e96a431fbfcebfa14a444bb134a73251c3c1a33f75c11f66d97c813fadfcf0af55f00efd498ab1bb1ca18dda349098c881046e7989b162888d63841172a5bcf65b42af81887b60e9aee9f27b6eb1a1957e6b1fcc8f807642e568621dbbabae3abaa7d03ec80b915f155d01e6aa08f2f6d3e24bbb4c881a49dbce2de1d45f7f999c8336304838de2d3a57db7f23d8fb29026021268cd3200bd7d8937fdd2052eddeb68d8510bf3562438ea0eb21f5eb5611f4f8e6e0871716e786e552e4b480c5026bcc85b7103d65c7059dd30239ea05a4cc337b658020b061174d5c00e5a19ac7c3bc42c2b9310dc491fd37d50451a67aad59a6f12ea4b65a5077e7ea387589955108d7d838457d82c90bbdf0d2ff79627ff9b604de9d2cb55e10329daae942a4c5eec8c53525c53367b1f3e971b63f4a05e36faa7065ac35eb21ae0dd8dac51b045d4fa68babfece59979cb36c54cef4e4363d86377d0d667bf30263d4d70c9f95d620d1a9b1c584bc3f08a940dbd6db17528dcd1ffe1e68d28b54be1347ce0c91e3abb56dda5ba9b32ed448cfde6368f41910160b19b908f3b5609cd833827c990579298fdbc527868f01aa563851f094847dca8644eeb300d19dd419da702f8bd79b2b77a2d210d5f849bf6f771533a9e9a5593baeae695252629a61fb341478dd8151571873031793548503f53791692d5318d39d93abd6cc5e77f5683bea336673382b647829101cc83b2c49405d10a8a50a5b4ac733cdfd8f55d4a2cc36d2144ac51c95a6878a041fe2c79302e7d69b11112d4214a3cc2d6d54ad40b9b08953842f1ae0352bd98938bb615ce3b9197a8b39e25fc62dfc7ef784695315aceb4724bcf8d3c7a4c0105fdcbd8d8508adeec78aca5d536d34840f2d0d4d33019e7fcb75df9becc703243141d5cf935f9d42f6b36e3f67655845ab79add0f050c0ce40e7e28179673bf54c52950469aafb65303d0e27bae68c18b741ba8f7c1fe8f9633066d49c47b523c6f09d7e441895fe50a71dcfac15e0fcb13f5082d2fc94a5df8965b5e11ddc4d11d36f69cae7e93694e214a0996a0705ea35139b3f6b9177343ab967c6d848a43367be183948083883f4765312b5094103b66e8c8d35cadfe3c776154649a9385a8442c86a391b23bba19ebbbf1d0201471337522399b781b5376b9c3ded4db9a00f271904655ac4ae42474a2cc0b1d0f3528f72c57e5e62f800a2c6c8d19413e51c42f6081bcca51ef3d87f16e16db9597beff6801a76c3adf2793a939d296f302a351902a3a9dffbd185ddc24f9eba8d57dc001be14c69b5749c6f6c6a7eb6163b1e1571c6f107abb3b9a1be3f3fc0f888e69d07bf07c24be2e01913f7df895511c74ed0197681ae1f86559ecb64a09f869c50412a9d8ea3759f356aad509da3617f739cb1b95da1e19b5140e8c0ceca139274d2ad7d41247b275ead5039d27667547520f7755f9e2c5c2c6836e5f4027b0160801bfd3240e73a65d1a97f3bb48e431c241028e49eb846939baec30c42c717f4cae9f89a62d2fc51ad6dae1cccd268f606eca0c96dcdaae574fd31152524bc787c244c69b31543bd1c488b29f7101f8e425eef3c6abd2bc0c55b308b305b30d1e7387462087522117596cf1dfd14a079430e312f137220959a27864c8f7b4a2a1fdecfdf7bce75508ee81679731f32d1f7f3198e3f535bfdfa09170ff6cc0a95719916083a0e8ad9d3e47120c9e98ffc7e9398dff0d74fcb3361b51b4f24d293c722cb7a5ad8954b114192833d3b1953ebc1e8d12fbab74116e56d0e07519ad354ab86056234cef3704aa91c1262b4d3db4fcc12c7a554a10051f52800a0dc718c519effe3fd329057226eee2121d848fe075fc439955a509a5c1ff8506c68d54e6bf338995b6750f9433dbebc89bbc3be0b8c650f2352925dd5b22dfb43834f15aed82f3f70c32a948cfb11b4867088fe0569c2f5ba14c012f23df7076eba3b55e2cc70527d42ab4e57191f8a25ceb41b9d4d01dc64a8efc67fada379ff5d48c33a0e1c3521387fb0952918d8427b695e8862f40c222f20d30a13c7c6cc8a679fc2cb8e469018c977c31168ad502dd28428530d1b630e95ca75d90543b64da9470b0a08ba9b1d45b956360cd7a61e4d9fd5f339de6c508b4831b55a222159f573d55de262c44e3efea22dccd0063826ae5882ffa001f78930142330c4d652c067431fb9a574fd40fc436b4b04d3e9cce778c02569f12dc180e092e8629fc7c38a70867360dc6da0d5e37c9c14733816595ec3e418887e9b9119fe8100374c6823bf5d06d5d1d1469354971be8640850805827dfa6f0475dc530737d8e552701cb47a35498dc2e01285f910aa51583e810d622bd16b450a78089c1dd5731e1cc5bb4fbfb2911b3c8aea094426c16985f27b085e89ed84baf28f85eb3cec2d31c65116978a44a575087b72150ddc6460babe6a332962faeb90c4002887d174dd01bd4194e04488afcfe402d54b05fd70f9d19daddfa35e9427eac7f4ea0c4cd24bbb1fa04e7543df268f32cf221b57b1fe9156c034c4aab5576d7e91820be44060874136b4bcbcc6b4f27681575d3ac2c0f396b3fc9e8913c225bf35b8cbbd3e4825412f53c6b4ce56305961ae0abf8ee5412eae33462bc489b6c28a3821e2f89afcdbc34fac7fd573699e46f2b381daedc84b34f91718ecb7de5268734f547f15d21089c88b5bb1bb1b5df6ff1ba655212acacb9a1d7afc9927abd09fb7493fe49bd010d73e0c6f5597c7babcc094c915c4a1414583e6239f0b75537d975540e73f3e8bc0d1b28c073072a1b0596bb36a69696c514dbe9bed38ca8b624962632461e4a784c64dc0f258d2c383d0fdbca7a08c39224e0dfa6e13d99d70cb5290cec2d725181c86ac2e4dc3fcb2a5e630ac60ac4085d76b162abf6c90a3969274ed348ff8c2493ab00b7251da422eacf82247cb2f0b0f4f31bcd82ce43c6a8160ceab52db4d5aaede3f71f878cd109e6795a01b7ecb23365511cf890ce9a45609fe555ee41680d902141d3cb45b46400cb08e53b688df527b14ec84264d0ca6ed9b3615f55e4f4384d0c6d4489cd75ead20a2db945632752c965d06a402f9ce0b0adae1caf70a77ca665e2b3642cbf93557356ba98b4a46dbea590f6fbcdfe359717f1c465a2b7aefa88894f329c22f04e1e3199189a71955e727edb4638f849d133ea0e747b1f3043400d4a2b8d881794cd24cd299bce6cce65ee63603c56d076a4a427b7b86fc48be1f436ac3cb21d969014c803f0ab5dcf72a72e8293db0c4f0d8b4751349e144df9aaaefdfd875a98cbbf9858aab07326e3e44d91c51813cdb84861117bde4e5dc7a84f9bca8e960801c35d29e3b592543f5bf197982646e510b6d53c697bd3518e462d7788b04d66626952dfc99e652064cf68eb6993eea16ea02c30361a1e69c413590f44cae96e8d6a9e1931a45379a742c246bdb78a11497d6622eb2e0aceb201781a1a22b6c1425319aaaa10a9dad236d99eb1019b884ff186d6759e18948b8fdd46d6cf83f5efbc390a14e97f8781fffb40811dfd57bc684fece0db13aa6a1c214493f19cb0707d9cf72d9602293ca31bbe5b8d3834094a8d0e92feb4aeafad66853ae8c3b6dd410abc5c1a5e94137b325200fcb0545d6121a790afc49a8c8cec757f68f5991b0c00fa1086d54040d1452a819a5c1aef4f3738a6db25505a7b703b11659fd0897b62c36f951a4e0abcf1aa3e10e0c9e0e44fea6c1a95cb7c5a36d9933f9445fd45752fe1f1f680af3e92172c55fc159d0f911f9ed2116a323ffdd64faa074e649017f7cedf28515ce3d46cc6d01611617fae87d82df6df30546c589e9817b9694e4db98c63b0b9ec204eed41186b62e4dc60e69dd9fb5e3db4264293b1111aa1be2bf9bd982f2635445f53c1688e52143233a10d374e01895d072ab317b6e878de15a65f991f93d367e634a8019b4166927c9a24b98ac0725278a7dc9afc616e381782d503be9e49422b45377d34ac9bfc0089b037bdfbb0fc7eddc00dcfcaa597d181e39b7ad17586fa8cdea62d8dd906f56333cc6a831b9d03cc5b90c37339b6227489ea9900dd5e1d5908c28020694d9a3cf024cbee07ac85add847c1aaf2b0b62b303e2d512b7c08fe72e17c603a9b7c581a7b3fda3c522c3e30f080921431e3a4596ffcc941612685df714c506e0b216eac8cc7d9691ade7cde74edc2fe418da8b3fde3224eb882444a4392807d44d161e5d6c51dd3b771dd6a4bb30b91a20eb64766b8540336473dd097dfc3490e8de885f345995c8142fcfc62747bea4983f02bb69e1d567a7c0784e456d326a41e697ca8a8f342c28203df70ea7534e6df76201d93acc2f9951ea250261215ac58348ef6f32e1e7fb5e7e69d9dc8107d9a253b4ce4efbd5c6a8075b23434b293fab8042e9ab62161373a9679132b775394c8c6013489ad462c86a24431ed68abbda932058ddd126a4b088e3b4575752404072d48cef7d4a83e6ba7034ef779bd527ff4906b6a62e15d4869f51bd30047a7b60c9e29522d6b02cbe992283552200559a76552a5cf4d684686376d2b69572d58ef12c2bb560c54a9e17295c8727e5ed5b601eebb2ed7bc9d4f52001b12d5ab85123dd70db77b346b12eba8aa653bdcc49ed987dcd9b6fa9e8073c71a311a06c31442e39f7d6954f05400284403af0c880a71f3a096289f9c97f8756a485baca2066f230e0abc16cc07ca8119caf43d44ed5ccdea9af525b3fa5e9c363121d15e6e898215d6a9dae0764599d66bc88bc037f291c879f31b05e9be4467522ee6d36fb1ce9603202d0f6cbb30532a962f3881e604af270b9d639d622457985216e1657d25bcdcc0df17bd023a5729c4f151162514e1874e3d970be14dd08704172488098370c27a90f74e15b0a5a1612d29feeef192c412454da4040ddcd0722963c254b874dfb158253845fbf7b6015b0833ca2cd024c9200096cc9df8a4a41ca0881011b1392401da68cec795093af2e2e7f83916089733fd4ec303dd9457e17a2e44eca9615f62ccfa3870ce672f2f34a0e92bf60072799442adf708c17c163c0d97b483fce83f12893abad2b3c66c1b1ed0e2484170799a561b5a6c9d6c3fcced52b61e14cab90698d4dc9093b6e09aeb491e278eee4c6f257fe4fbdf77f79a672cd5515c78e49e9dc3e81b0d51db9f4d970bceaa75e531383c16420759d972e8f7a7362410f0a2aeb0014fa0fa76b4546b42c8e15cd4f7c0b5228240e4f0c6ef6007debb09c1b4c8e63e21798d5554c21044bcc2a6e7a2136a6757bd456ea7217bd0e88aa3226d65611c205431747d132602d7f7409cd74c167471f8a7041f60b4d41ee292d551377078a5fb9361961513278cacef52356f1064a44ae356380b8bcb6739254beb5a3a6cc5feae7c4f99dbe81073fa38fd3905bc159d13b4e896bd023bba3f076e276444d87360b3811eeede71b96cee3682a27d35282fd6f44989e73f4138c4a29eaacb47cc28f2c5f2f2933218476c497737ed4501ce3e624598b6ef0efe7de6a37d25a051264094fb366622ad6f1be5ad5c3dd49655f0977c802a55e6e570622135047dd0ac1984ad7c6b0ef865ab2e64d15ba658edf0a89595c2a96470eb134283976accf90a919931e1247f39f15296f667b09700e990ca37ce8a85b9fa32cbecb6238a493a416201f6b24beb3e45371c973744430ae02d85237d510c2a5ba7106eb4106cabf774d04ad3a08c66e84675739dad7b11268a21bf2f7e51baf213f4dbfde2ce71fed0c043d37ab246a288d96ef4131124c9f6aa4eafba1d2355ed51a15711e2b827329ab1415cf7c61cc6d2ff614a2c9d05500b310efc37d8bc05f853d6da21d0eac7e9a91ca31841402d249db15a370a44f75ed3991ca3c7a51a9b84e5d765d316402c11ddb9df587908e08054961f9052c1aa5327002f1e2f8bbc3bb594fff81d8236558cf5548a40c4b1b03721e3275c561aa58b28f1fec346091afc844435828685e71cf35814d50886a0012f3fd0857e3303d15f11b2a0a2b6df2d71a9fac43b0084e11063cb411400f4fb08cf6e9021a498f018f66bab530b20e58f0fcea73f64c6d71906adf320cff8f1556eb4c9bd4570d362d1b7db57e8115a8bfde565a4a2430ff5bee598cd0e01ffea8b3fbeba0db07286a4fa5d61aea62608f6ca5376ca18bca8f3a60585fd47d8cb7ae18b2969adea0748bed7ec7442d0f88f5cae067d899c0b9023a76c6388e22cc050eb0b55801c1634a971b4ddbc2d3ad671a57928a13f321d9e335e56ad02fa724fcae024189cca7587d498df9fb9c978a2eeee7ce73c892459f0452ac026b20f1f08dd4d3daa48b8a508a5ca9aeaa8f67bda8fd57c837877d5924a4caff0f185688c4336beeb1034b700f52ea05eca02e38a3fe60e813522e082ef724cab829511e0fbaca9a8eade836e33d3356e41bf2e1f156984b189f56a464fd8cea525b448225407c1a41c845ff5e3fc49c0fe37ee766f0c0caa2efdeae03bba2c0d1a28b28a1d14abef0274162e109a54fd0279f86e9650d038bd6e5648611f1dbc141d110eea7ae35468598dff70a8a31da0516c45f40b5dd835c419fb1844fc593d343d78a2a68d05794fa08d5630fae41036431b8bb5393e139eba0eba01ea0876ed7f6a93ded9cc30733f55d9e67cedc7e741a20f5ebac0ad89fa43b8cc78aa42c886032cef1c11293cf21d23ea0873c0ef7e5be5179918b97d783cce1c1bb965c4dc30b6244e16bbc3d56deac22f5cd50625a95d3f6e4272609e3c0d85dcf23d66bbc3197e73a096ea919a88b1f0c62eb4eafc28162623cb1e96e523f6f08a1fee78a64f6949d1b4cde3361ea87455776582f7df350a30768c5550bd648d6f4234a66cfcf3696cd337357153e2a1fa3f57a6fad70b369b6766b46d9326ab4ddc3183f9e603c9ac3409017acb59636ad0b1e7a9c65743aceed41ddc86b0f08caf5e4e980dd5f326eabc28e1ce681f62307a2f4b7e2c031765f8931c449e8178688fccfbddebf6456f475de2791e12f8e62c434cdafb0a84cf00b5490a36b4548e59bd7a9a40c4417cad2567e8ab2725dd0bb6e1f31072dbe354b78e4695ab14c41824da053256cf8a8c08e118f0d335bef1d324ab554dc01e4b00962f272e9c092fe1134f4153f7f41f4362306088e5e936642260e35bb9a8a7de6f7833a0ccc26ee9ee69d5c5c48909f1bc01028fe64a0fa55bafe8b02302f0f8c2182c254a9fd584ced26ae066c3c56fa68281489fe8cf0dfcf08cf6a93fa9a83d7186145fb5034485b99724f8a3603b54fca0ba520d87a2151b20f75931dffb2dd128b8d79fa20a8da46ea6b97e8d4c4f2ec12bb07b6ba8d781d3712af3ca4d0b1a9f37c57ccb2bbc4c53fc3324feba1c7745f59ea2c010932994243bd40268841bc44eec3e40bbf5ab275a02b1abe007bd399e0b8ce14b12a28ba0c77864c89e05cb5a78ac626ba25e9bb487c5956c8eb16f42b8423536878352dac51a1c92b25b5f583f3bbd52c50a235958cf45b0497cada21a28ca88424c69bf6a8f5e270e27599802c69fdbc0af25e8f70b6e5d66360f95499904e5516c39e7e3b1486bd57a55ba24e002028c164d3614aecb67d141a5bca59172acfa2819f860aded79af98e2107d4da7fea951f16803630644afff40b27e8911a23916f958d579f7780775556001a64a80c10b3547119c29823c8e6f6221ea62f2cb7e7a16bae65baf063169db7b4451bb545da46b5f77f1ac5df1ff72ef38898164d53b23bebcdcdb71d7d45e3fa3266cca0027f87c8e8eb6bfcd5213c01407ee2810ca8a1ac73a63fc5e345be45174753380949448e786161e1de2863e4c76f32fecbf5443b07c1e31c7c579d4fc94632797586f8f363baa792849914a98484f91255aec102e65ff4a92d5602ffef95c437179a5d2c483b724c403d0a1b84ca08f7fd3ec0a78abdbb7b05e1bf110308fdff06e141927fcbc11f340c27e9bc82fb043e1db113239202307473cf339cb291014307da46022786cfbe62bce9f8877ebfb67134312a92345d24a88082d63e0cdd4b7870203e874255b458fe5f3804f3ed0ec25670af750b50f60fb8acff97d707741ccf770928634dbf63d6dfc3925ff9efe8f32ed70ff71f2dc5907aba4cf35a661875ae222693057ddeb481c668c00656b714d9e0391bc1c8c9983f2c308b2f4e69c1620a6dc6c3cae2e3e1873ea13e31d1fa29cc15806580e534e1a48c319f6f28f00e3c817ccd451c82cc28bb95623f4d8adacb54eb9ad0fe7e0b52385281a4930c28c2a33d1b2b2a141aa219dd6adee1c59b172159e466d0071b092368d658315f9e65c6f6ae63c376adf3309f05ca3411848e14af0347c2e446915951dcb91f2ce9918e09d1cc1201cd1da2e7ebf6c3bca0fd8c40985e2519c892915de2ffee9b50d76e54051d7d21353230092ff24e0dbfbadaacf9f85d56c9873974b4382f424ce4007b93d01a37490155e716103de87055724886d57c68468f440c5ab75317b0c101260d3d3f70b790b4e8a10a3fdd846b40ad1731a868d48bd5dc0ffcaa7c3fd6c0a4ce9e085386670175d056a53161b7b35caf514e93f4e51cd54e6906356c390b8c93dffb07c7b0ca69ffdd83bb7e0d309ed6c788bcd3e3d42584af4e49e103614dba2b78cc23b35b2e8228d81d849c7ff133bab5c8adf8264479f86126e1090b897df48f9b3778171049ff92b44010f1cf03f02e32e196a14fa09717cbc829c7cd619bf03ef832d995f2848d0a265abce8bbc8fa2a2d0e430071e8feb302bccc320a05d15aa8a99e88e414f2212bb81466179e51194d1c5a01d9e274d85782d49cddbc46cacf3a14ca1072be7e9bd1799621c41e050e4f423078e025acca7e2d6603f63ef4d61a3e79518036f0e1b0c4521b6dfb4fedc938308baaa7f8833282e24cc0037ce1b27ccb0a411c3bc735a0907045a6665f80e92ad1a844fd47eb4004ee922f5c7a586c46524242603aec740fe292eaf876d47699158faec3c784d0267142d2b9a4dab63acd4ae53ff7caf051615eaaa09d4293b0233e3498667e97a475e6472d8e9cf44fdb26729a570994d223d1e3a424ed686accf7f895d9459b1d5a95d79fbebf67057248922c6751163a1dcf8471b41c49470c29f1f922a2f4d77eb6d00da4135cb688e9960eb28eac5ac380a376e04b86b623b7b4a2cb1a051f5851ef0489afce94bb94b7a8c3682c00b4882051e8b9aa6aa6bd60eb0fc43410255b19749c08d4091fb20dd8e11bcf3f810ab03e7ccc98341747201268c649bee58110048d3d2aeadf623ef2a1fd0c77c30bd7224a93562dbf6377fad34b0dcc60445373e1ec6b2c591b0a450ea32f78623bba2cdf0ae3b1fb4661d4e68a865e6e4869d9727b371a78e87d7439b3bcf7125c169d47ec8d13da26820b215ca0cafac680bde1e66288d7cd7b5585dcd062272350ef5ab500a3644d368e5aac7379843a174ddfdf46150f926dc60d0fd5eb3b3bd399012c1ba36ad0d9d5d77e88c601cf410e56f83cb43896929e6745a0f8e4a43a30e5501205119577328783ffba93e6ece4b52cdaebea94e26dc7c228703ad2cbcfdedd949bb20ca040b786c441791a45a7c986ca4bca556d2b9a42c273008aa13bcd3309db652f608582348187809e4adfeb4a24d5abd7aa26da0791be3b799c1f3c83586ece4d63a83149309296f959fba783ac627cc009ad18f050c88a30be908eac13d503fbed0f6d981f16de606ff194cd97ee6c43407c894bb5c2ba7ff3102533fe649df333b924c2d5d28bc0149723578881229239fd802a8fdf6a56f1bb53c09a91a913c499649601248acda2845d015c14af42f0c9971346139de39630c20c5a60f651f02f6926b29632b641790516582f9f0a3e42e626228feb4ed6abcdad4a614e3cd57da7fddea64ce6303e4e2e6f26bbe629549943f6d6081ddd6997b9008f0dd4e78b761249f84f5632e4800c4fb05921191a6ca173fd1f17c4af8f2171c00509a48c4f8d960906cb86e3aab7b0e79fef798ef5938c8d822dfec981f2dd3bc31375fdd17635204acfac307a3487d0451171c12ee1a209f103cb2b7c45fe2d358e9c5d2b2dd9d300271d3735bb2514ad3adf67699c2b3ef3f802d0d1a08aebd49361c0f9c5b134d1f214768bc6e1cc588fb0fa3aec1221bbc1bb3757378d82807861fef9c634f13d9e9b9c3891039de80cfae1fb7c30d78212860da6046beb7317bc7e760c7777eaaa046cc4f02ba68314657309c19a50367919a9f3e8ff1b54898cbec5cee96c4aea4aa90266193660efbae272cac2e61f18c5c3202f108aba1620d8c2f020182801ec0f2100a6d1b363a90ae07c5bead6fe25784bcefacfb1bd97b4b29654a32a5145804040483043fc46088142a539e9052c462600b059835f57a71bd18d1a8dee2eba3d6d0f057b6592fdfb24adb238558bf2d8ff555b64232f7d547ad61f92adbac6c7b96678568f9172c991048ac96ab86c52ae960cdd130002a180e31f0dfe20d228a6079ec8b68f9173a2d4ac074b27ccbf7fbf2a88d96502c58e6434bf622d34637e410d866399b65fd0a673839d69095ddc8b1feff2dab94838363e87a1c1c39164ece6549232d9fe2d135faedfa95ccc655ba715d2ba3d168a5aa5aaa2a23addc609a6be5b7ea476f55a51b3682aaef01c7cacacaca252556246f304d2565766394d9b8c134bb7384a3aaaa1cd670dc108bc5fa4d8b2c8bf4625996949794524a79c9eaa5bca4252d69b9110dabaaa48d1ba7972775295ed8cfc52e33d8a5c205529230062e84fc4197f7eeb7efef377f98b53710deedededf0fd2d58227537d6edb0fb750bf166e2ab4143448c023aa19c1f73a113899452d3fea6d550a0c92367f93479ec98fc6e79dcf26c0f931d22c49789155a86425608733770ce71b303c2fda658cb9895df65cbec76cae9fb47d59178c75c6cab8028cbbddb238898a6a94a7a86e43712c800349a517ed49ad1cb6ce3afdee22ac6cc850443c68f5a0343662fe58bc7fe07cbb73c101931dbb8c25eb0582b2596910e2396571942acbcb3947e20a9c0e8c6e829a03256328de44cbfa24026eb480e816de68335ecdaf877db87d90e1cd678d7adfb2ded60cdc9dfc132a2b1d241964fb125df6df22f292fab64bd351ad1b0ac2b46964cd9147fd3118db8325ebfc5b7de8aa5527c7959d688c675c9aa5ac96854d9c51ae3304dccb6fd6aab321c9d384cb32f7fa755551fe3ea5428d4cd0cf86e9b19925e2084f0dab0c931cad2cf4a961a4208e146194ab028f22aa6e10c3de841163d903b4d3451d44415192eb420d4d811420861b8ac86f35ad6b2afe557cb57825143fe84ee1d3e7efb30779e915873dfcc211cbdaedc5d811e1743767e6420a4040c51e2c3f70f5e315648603fa900c217865c1a7b982afe00bc80d980ff227c09af8fa51e3ee1e8537c1919653060f6acbdf752098c0a28ba98efdd0fb01212cc7df5a92bdb80cceb65bc7e4735e05bee610f9faefaf70c2be8a073f3491852c6a7c409cf7c34ccf782fc5021ca3f29ea7192c4542ee693113e148a69f4c97c0f3303017dd2139db0d4d2eb033be3abacebbdeff8de7b3038ab015fbe7ced17b9c03097caba2eab8a80cef71edfc1a8117fbed23eaed8e224307f17d2c77e349c0e3a6174432402b044f38a111d57b3190c2430fc7d78cf26b0ffde87150249673ee8c31762ffbd10485ce603ccd409f1b21b9480adab29a989df14f9f92f2ad8f614d08782a53fb820899423528278ca114454a4f474a11342f8e0eb52ab6624c69d2396c2583e225c1fbb034405888a8bf921fe7a1b403afc36808080522faa1c71717952a031dc3b1f2b78e74365dc0b1f6c53206c8642d127eae40a05fa1915d113344b539518d1641a819f627fcf7746c7369719e1791930eb5ea559c2850648b8ac80861c4c71f1a1a10916eff251a2e779bc873023b06d77b41d229e69b4c741c13a6a138f1c6942e707a55924148a1645222c45c0b6f5f16142476de24f1678f972478029400108a00cb880c6708f4365acc0b41808d335f879453a3a7a042d113bb6e7b5f7105589cd8c065093d4d882699d796665db02d17126f73196743e46f72265541bee1f6804531b87a94d4735997879f898bc58131857035b31777ffee4cb2934c4e0d758c75cd7b80373bd45357e8d8198ebef618ac5ecbbe7c5fa1151889aba00379ddd9d1dc2989b1467bd8d85f7ebf7e083dd3b58b18bb0eeeef6e8839dbf113c9722780dbf9d045a8c7d02191a3b48c2ee4b62b06661caebf7fc79630f0667c5139a05afdff3e73d22c21a28ee04a902617b15c8e0a4bdfbf573944382f9bbfb7bbe648808ca69c60b9b9e417b601a7ffd1b3ee0e4d880d6a80c853c652663587337acdd50044c8b790ce1ab1e84aff2e7f253ec19ac640c6b314eb6d40a42c055c95635974073c7f7b2205e670fbe4cb3de7d8cd556104d8bc1c931a34c4e4142cffb47cac50a6cd3283b7ac44822318dba3410ac7de6c90aa32fafc4101114b70c3720bcea7ae5724f340b53dc498c6bf1c518939c463b38275d181244db97f272a2a3b3fbf3c7cccccc9c392f6d3de0e4871042f8aff478b004999cc1e601c6ccccddbd8ebbd7b97b9db9db77e3c608a360294c3fd74419afdf830f767cbe6193f302d6dd1a83bf479cac32fb1abf63d5de0826bfebeece56659663ec67448c4d42475595a5094c1fbedd1ed696486683b525d2dddd4b647b4a3b647bf4692cec59225de5e4d8d7d26e8411427f858e3fc5d2aa5e96aa4a36aaea5996f5a41cc9fe37aae17fbd0d55eb2d592ac9973f83b5eef15e4544395e5766433f6e31b391a584307d9dfafd02a834aaaa663e58eb1dac45e9d922f05b1deccc331d2d59609b0add70291bdabdddfcbd0203e75cf78e94eeee0f2ecb88c693b0d71f6cd75d42b573ce41e8205ce71e3a084fb09d73fd9e7b19cafd7b7ed1f1ce38e33d84ce41f7dcbdbb25bd406cbe2ef55477f7dff6e7de95600183b96285a5ab990ac1367ac04197c33937849c910ec59a0ed3c4f8d6c1cf6199a3c3555b7e4508e1cbec848270468c314a1d7e8d68b8846e79749f21a584988eb6fab78ebe33f60c2847343cba8dd6d1513df7482fefbd6ee8ba1b967e3ad70dddebe79c73eea4c8589285c9b41ad8defd1cce98d5d10e1c64deb0c97d8a515530ff4d0b01434063b46bf7209c4b30d9f735d7fe5e5dd3b217d6629c2efd8aec4c54877aef596f35c26a4403be3895b9e4dceebe760f3b704d20fad7c8f5298e9594efd9893594945e954634aaca23af389837aad16f392a7ef5562c954e712687bb4bc8f022f5a8068a6922cc50a7c928ae20c3767087df33379bdcbf0c87693ce30c4786d305ecc47f61158f9460694c40ddb8682edac60005d85545bf7e0f3ed81da7a0a0dd06bafbf337c39d80e955554546de17b5e13190610996830b62da0a4642069827fd6bdae904a439130e4370bd03054cf5af61ac397f2a92cc28606e27059c4ea7d3e974caa1323910718299519bbe809a0a1db41196bc7ecf9f7764d40d4980de7bfe9ca4fa5aa3833953ec42843a383848a4229c85333f6e899d9d203b5660c1ee6ed3d06c9a768108c484859a8914371c61db62f8b6f4a66abd9560baccb25bf55e611a46627cf32746830ee183cfc130835876e102b6ad0fff4cf113a39d4e33393a6e8e080d3d39d24414a7d3e9743a9d7252806dec73f26102867f9e3869a593ca9c26f39ed486e7d545c0bc446facbdfbf5731ef1c032e1c764b28ac482e8803b53d5f8da69820f112245889060dbf69c7a86c0a498462f1f2208050535219a1b6a6e1a4ad3b4d7b409401930c371261b54806d0c04c4049e5c0d94d12ce4031b4a2d2d9d6117c768afdff32122283c7e18e9e1f9fa3d7fdefe8a520522fd5cc96cb896ab840035f15725abf480d6d4c4eeb4794096d80373bd6532c63dd107c5348e089122fde4891327575cd1a40993b9699aa6695a0e36b9cfc1010b28a6713e37f8c1ebf79c6558ae3bc4aef184212228afda2f16403cf5b5289e7714495acadc5c5cf80626d8b63f3fcc404344507c5a7b01c9a016211b50bbeb2bcbf16a27227cae3b7b374cf32858ea520936cb5db0b43909a67ff3e0e6e387250622e59584c89c7a55e2ccca162e3b65f08135a1671a850de123826f3be57818ae19bd62a3920e9d3662a808c771fc3d0e0ee78793e1e028451cac392f6055c90de1c877590faca11c6ac6cce30724574604d30a2d85bff7f62d33ef430821fcb74bc4ddfbb9f773efb7ebfebabd776494214bb1845dae08330df7ab7dc7be355a262f06afee41f74f4387f00d114159c93670c7e8842a314b3848151ee22176e278dc107ea2b1141e622a6ec70999ee9f778cc638d818c9a4e289a955d66750356d8c646e3ce42cf0214e986e7bd1b8a8b95002dbbc4811a6790232136ac33e38e889d188f0a1280a17334cd35595654130c5a9d48c869026bed48c979af152d97b103e1acf66a466c05497092ea6d1d601cbdc1f690c6c87e395b9414c8e23d5f6d703936377cb6bf481c9afdad563f2bbaede7d4c75314d1341f99906a51a8cd6905093c78fb9af3a73df470560a647f6c8ea3e715a263f1bb442eba465587b9d2c1729988cf5611f159c6620e9b5d3ebeab6ac6c3b36838197ebe2466dfcc6010e40296a4335401900821e2a93c3110c6fd4c67b0a3e2722448a14e190cc806ddbd333e4f4989999b50984da04055058292ee22286c251e8e400036c632226e22729286e681540b8430522e810bea1202127344e34cd3d01db5648a8899290a48bbb7b555553f66b20e9d40080ad061b38e0520310bbab23c6a7043a84ef46131a7aa2314dccced41dfc41414242397c3a9d4e454551a250494d1e3973377b895d0574081f7c7e5d2e2e2f2f303537dc198a351bae88d1b58fcfe3e0189203a55272a8ecce0a41ddbc6abc82890bd3fd86000dc374bf2da0a43516180d816d27d4699f3323703398579baaa66da3a0408a2387ce0e95713cd4e478a2b041a6734d9ac09c50674e601bbb2017238675cf885b8e20c2c47d69bd04846387b183bebf0efaee3e04feaea43073615363320bd853e1832bccedc47cc4d21f9410d242480b283f509cdbe0101fbb0b86e3cb8be68af5dc624fe7fe456fe791ff65f3b930f02b1f5896aab2bad730ccddbcce9fdd7719863575cead7bfbbc9d332bb373ccbcda0e33332bb36bc15a67d700d8c63666deb25619552765dde3f3d8afbb338deedac58e0d9f7784cfabe817d67bafa5e9570783edebcd5a6520f4ded8cfb5eb6fa7704af9fb98cbac9bb461af99661f3412218470480adae7d160058e073310f99122b60842c2c303173f4158010f5b502942944491dcc1922e9a54d1c5130c3006aca74ed10591c9075d3cd186740125092225446a300322b438a245920dc8dce732401865f7b231b8549300d574360603d4c4598c262f99cca2433cd28177e7f2af940256aa02ebe74b4d2f231c56a24861e90f48489912450b213f54621005c67b0d3a8194a94127e862eacb6a6c357ddae8500485a5038c11f74cddfe0fcb296408172ec32a4c09218410c22020844f4addc27237fb9dafbbba2eb391f79c70c2df69d7775f73777f1d3358da74bc533f3fa90cbfe7ce637c8d84b5c8708d85e53a87cab876ce0531e9288e080b735e776b672eb2d6ceb96f6e02e327aa6ae0fbdf85fff103e27929e60a6cfbf8de1be2ac192f01ebdfddcdfcbb5b477392d7ef515fa639b42efc8659103d3d6329b8a7d52c805c6825444586869c14a181326099b0c412459ae05004b6ad90d0154588526af386869ca4b630379da2331dd217b06d8584ae48a9cd9b4452284263ad3252c2779aec1f137a0b163688bbc2ce921aba055878a719f705f7f71c421dc23f7952852a40010a4c60021290d080b9690dd0344dd3340568cd05d4a4b50d3b9a8f108478788444c1644811137b647f36898e0ecd622a16a652406b58244ba653844da11bd514217c9d18e1f2c408e52e0f0fcff22c4f559d2047336c11e5d3622c2dc6d262acaad262dc568eab7e107655599f62ab6a29a5bcaeb6b690a51baf2606520ca5d186aaaad0ec1b737fc75f2e8b18049ea1a5a8c1080a8542a152286772989017f02e84259e6ced0e0d64fab315a55ef2922069a84b357eec355447d5b875db31f78a7db590114c6af3def3e7fd1bea0028140a8532c0d2686035f7a80ca8cc4a91496db897f939e66d752b9b951cd0c95b6b8f394d406de09394308592b4484280d668cee4da5d8c1849d329801c61f2db080a0a7a95d912065e7a6ce0c6f0a236ec2f4a524db57d8ff1e5a53be3f1638bb83406662f31103f5615b73f8f511b864668fbb2022f6ada1ca4c9e3c7644c4dcbeb8ef0d81d82110f0d63bf0dc86c87fb63eef36a0c765e6776eb56de4329af070584fe5a922c55cdfa8dd1923700f568c4157b0a96b8e0744ab91a949af8af203e3ee48e838367480e873dc43804db3468eaa032ff026cd321140e1dd446a5081eeae66d2378dda81bd40deac6279883a8b48d9b0731ab118004100053160000180c060483e180703c502451f914800f638a3e745234140844418e03298ae228c618420030041963084146a1a14107e32dc3d1252b309dd7fa2bc0260079069572cfdd25f0912778bff438acfd9fc4976d00892659e065144eb16a5cc5703f884abc36ec39236ac9c68d22f6e8dfa9c3a2e0689183a8b9b2e418026f1413a23a74a79d2f4fc72542a96905712f3deb2e4531df19e7c0e10e287f6d526f88756e52b727ec51c9fede104e2c3f650d0d090a14c493773849f2a8d8e49a7722596df977ff473ddd6bf929325352d82d02c772d2f10a1ba7c21bc6f6669c807882078fcaa7754a09af00aca0de2b5c291d08c12261090a0f716772ee185e9a3f5fd7820abd449c3d71a03acfbabca4a9aa8ead156be86d6c98de91fbfda227167382dec6ba64cac7a1273009f2c48c16793ba387921bf88293cc582e19e2e058fbd918441e4d030758968975a6bc2a24ca886e9161b84f4f619fe4cba73e775f2985728c8d7cb80f84baef87cc221d1fdffdc0e8b36261c39ef596fb889522843127c9f02c5bf723e22d9c77103d53a8b3b467cbcd70d441bd9043c416a5b9894e80a28c580a7aad37a643bc85460e67af37ace7611ce4517666e2d1737b287fefbf53b37ddab7920e087a6ada1b2dc7a9222179c8fb465cd2c27124757e6476fb7317b7b070896f2b2a5725683da7ebd52634c1d0d732d25de98b488423cb0a07be5e440b8c3f7173c48ab255a8d4f08920620a0b0262ae3858d66f92bfc215a462f4ab9ec066a74c32c4411c77cbf2f2af5bd97ca2a0b8a4f34ace709d8862ad4f5c15a5f074acb7bc720397ea0e50f9b45f845b7fca5925fe750af5e3c4e039c9be96becf7affca4afd7315cb64d276a998bf5f7aefb6d64f70c4e0497604780aefba6bb9580ed4470635a02ce349bf79a2c87fbf87fb17def7793ec92667a06c322b5a46ccf986e89e52c221293b95c33d2dcf5cc8f9fea810e38a4c257d615f359989c57ed79212a9e20f04fd1e045dcb9619677c2353b809c48787f9c1f4c119a01b0aad3a8006a23623b173de268a308dd1f286643599a366c277fafcc6b304e80fd667c9474b61fd6c82a1d998cf082bb8c6dcf29da4957f3286bcb93f6e6d497669a4a4084e54222410d0d1c543030fd0e326c4c6903bbe3d7731db407a623a41a3d7f5b6943a2bb6fe63d2621e6eafc9cbd408e214fada0c4f7c6b7003b9e22c9ac29d851bda1be502af396da6567eef582742cbf80bdc1756e1974d332d2a90507934be2ddb9916c97c88fae15befd0b1acaa06cf0ae97b65ec5104b13e2b729a5e9c117c6503c78c55cdf8e2fb3bc1ae62becfed8a0aa76989c8e6e84e9bd4a66d308826a604d0a170d1dc5d37e88f9a1937630bed3ffd4ca3899990f005511c1d3999bf833e5ad7136548c3977e96c1f9fa6a22fb7f72e12fbbf9534f8bf7960de7e0b86081a2dc883200ef0046000d7b5424c4bdc443b374118dda2a3008007b99b625e52eda4b3d2180355a9591ca6dae395db38bd5e66ee8ed179ce12c97a46bbb4aff9a361f481487b12943c8e7bb34c577a180145288b34353dc659e999fe6142f6002ea0437a472dcc4d053ade531d56f2303a59c22a6ac0f213e5cc2bdfe40bda80bb0f41c4d73525fb8451d0c2506db1cc6a1c0948b986c243423d52ad65169166cafb029e770de7a25c6100aa75cbd122a5a29d5d2b23f92104ab1bc0d8569282a7dcbffeb66251c490c005c6f1c40ffcf6771f2230b80abf8468a92bcd8da023a0fc26269c3d574e66c9943d7c28614119e4e0a7b71b54a4a2b486bbfa9b8e6c996fb8cec6248db170f020a560765ae9df90214c5b1623cb33588f87c01effd151e26bf3b45650d0e2b18b0b1cd23b04842df3e687fa28de7aaca8436702c7a6e166569adf90da6e9aa1c0fd0c65f0b64812a2d1dc6a63924f3d3e2d13d648d97380ea56509c53526b002511e933543b46cb09463ad4bc5c3e4b121bf622f015742bf76835417224e5ebfc63bceb42200f80579eec1fe471a30905bdcad33ec7e36a33b3436a2617246af64f9543a422f53369a5a6e75eacf6b57307d8410b81e239cb9c130d45d143500ece27e0253baaf3f1095eb97acda7891c5755725c9452e5eaaec3e5fc740e707854b62185f74d26b756a599c8d82bb8126b28f0f4943d59a1c5d415d5597bc2cc0f643055500b84a455a768da16ee34a57696cfed198c89b6c509e0e2635c585229404e76f7147c5b6cc73d03a083a78e2c7ee96fff9aba14e925e458618540e171d3c929a094f3c396483ff9632e1c5ad8bfbb611097a85ea23fdfc13214ef0ee3dd06b67d805306a588029dd59873a9a84882ad100b799bbff483b44a54cf4af18961fe9422b20d9a2bfb20955115995842279365c97d77b145dc2d39b4431b753ab06bd573bad8a76b55d65a779238ae2c748150473a9bf3ce516a3283b03092d42f17d0af4109d54cbb324fe109a8998e40bc4341bb7fb2724ed875bfc04aa78cdf12fad6e0d73bb8370f3cd5dea055906a1472cf2df66e9f801ca39d174db1de9da875f416b7b1951d55a7d0a4681efbd7843f769ca8a55a7535f6dcb1df52df8ad8e82773acf407d7228d28b92851c60e2df939a7e5143b1a3eb0e8048ae7cc8a415bc276c6996d73f790f9f08ff254c4b7403481d0902e40acb349ec5f48407b05d5768d9fbfa0e5cbb88be68dbdc59740bf05ceb10d6785981635a8a871956b99dd85d25bbd2e8f5e5b3c44a83e1edc5b9efbfcb9cf902dac53f413e8a43b0942f521e2d6ab2ba237705f6bbd5d8d797e3f788b6d03d87360c5abaa967e74ab22d93fd226f5ca5b9a19875511abc0d883fdb7f060e520ede22391ba4e86ee181bcc5a1347a63ba29968ffcd16cd8c972382dcec61cc72083962a8ce45efad0611d940195a9b97e0b8a162d6e601507107a40efd12b09f455ff7953a34a57137a9cb7e7d95b8dac2068197c3786d8a8a11ba05213fe306bc99c070670be8a0926ef2a4dcebe3d09ac76ac206317c7c4acf6547dd51313e7f979092027c7951daaf7b24298a116736cfc1a2bcf90a91682571c325595548ae8fda47a62d8eea2670e7dd1a5d91c7abb4b299436ef807641cf19572ecc6fa4662979e1bd145efec0c26e39678c4d6984f45e143130c0071ae448a36758acbcf521560913c2600012135c879bb8dfd75afe6f568c571899c22744fdff38d2fcf8d72b90a691be4dcd0dc71d32953a37d0ae133ec1607304c42cc103e2092858d5301cdc7bdcc2c3d4090109071fa09e20142cd062af13d09f1da11e77a0711b97d0df886c21df7d4f0f23f5faf5021eeaf942bbb853d487048766646b481242ebc5e74d5ed648985208dc9c6a61943e7962a625c2d705fabbf840893302d6346f729c087c7f9d34ff97cb9ae3db3b49a215be9951a728558fcc2564dba3cece45a34799c181b5e2c6f7b03f98984262853fcc2269c93857a68ddd8a01c8a065737585202aa172cbaedd78228cd8f54d2fbcd24774d906e64fd8530170dbff84127f5ffec779c7e2a6a57dac009c357b00c9d63a8cc0c30ea20b6dd2b8916eae0f07db64199a8eecf0cdaa0113a8412866cb1336877f0c3d8a8800487888e03e0b0190ab936dae58cbbf610e0ab9e835963fc570b902d867781327c76d5d876268ff6642042c59415be738c04c48f1d46aeafcb171b9a898ea95bb7d2a142e4816ecfb96e5e67eae12f7965312111560fecd486b761bcb42054664986ac5a6781ce7f85070a611eea49fcda12684238fc73f90dc2d9c46ab11fddd48fd7e86d3d8f119ac2936bf1ceeb6b1424bbba8f0ebb8d1dcd02442fb92aaafd9eb9c028526a29d5fd1d34b5ed9c150cf915b81de6034343ff5e5ec45f1cb8cb82e2a0085772a728112c88b88f98caca38228e0479d8d2c4431a44dd7a4b43f513b037ed8a1167124230bb62434bf47786cad4b5ca2809ffd7af6a6c700b042d3c1d74e0590193f4197f65fb37885d86ff8a710cbc451f3cefb04bb7e13a538db8cf9cea37423d8ac44e016d8cf84c44b9f63f01b170b0a8abd869d824a399c46240043293b24c567b36b5a1df40a3119d4d17b5b2f21c70fbae7aa256159a113e1813f0cd272c8fa1edc833da0ab3910523c2577b1dfaff6cc93c5ac8f5ac33ef680c14786c6fd600f2dc180b9e96f63c896e35e43e13a60b05224f8cf11fed8d85b859e75d0341235f73e60b8d385efe0db1ca614babf3fdd073b7ac3eb03e5e8cf34db305188031b1899e9f30148f444074691256d7fdfcde7e7251e08697175d25b1a2cfc6a69e63eaa08a3bd3e925513b10c766c502eb616e5e2a34545682e7f4b12caf7d6a41c81197553d3185bf0fdaf187ca54fe7cc1af5c6463a41ca786c4d60e76a2cf71294fb0ecdb9da3e2765f679e3157bc48c7b684116d5e76a13a0474db2bae834e93e1408944a3377a0ee3e48e066e1a4b6d164a1f0dad493a8bcda73c8832d256375f7c8bbc3beecc3523ab3ff53c4b59bd5d7aa76a2d617df64d87743d5601cf306f1edcf67a742b2462e652fdecd1fadd5ff5a188847c090cedbe91b07f11be7a0c5ead55724fde695667b2748da1dd4b4ccc16f3ac9d1d12e238451e02a6e568299bbc482a695d7907131f1ff76e69876570e9fbc590547d0a578af61018046788c64f6a36c1c683f55c665e5c597f3f3c04149894547d691cd93a6fd3ead19c602d385a55ae653847f812c071ca623b58cb4aeef98861a58432e499e991c33d61004b102443283018bb8ff7420a1e0a0bfd955e79fdaf57c438b6687a7c382a93a16f78147fb2087a20066d0cc3645e4a6c0a7b6fc3428af50826441e7bccbb84c92567935caca940479dbd78b569d9dae0d693d0c83ae597223bfe23024292c36d1e3bd9d755fb4d7d59db78e75d9ab5c06af0de5582791b223606790bbaa6169cf38fa2caa82a1e46d549938987a9ec3de7df22b693c620f3b885c37d2a604e78dc26796016ef5b81a3274cddff09cdf898d84f9e1e990026ffce732c37cb35fcbf8f8272c3613b9a2b7312caa9b7556e16bd7e8ca811c85d8d59d3e358c1b6f44fa9449687a01a8da8878ccd2b73697f225667ecbbfcd166958d2185041ce9b03b0908070f44e9827440c7aa87653f354fbdd4589ff4ddcb27cffe4a0755aa4b1fd51602dfb3c842dc1c0ab78b748c7afd08d1d5418d874921bd0da8b447839aee22371fa4c2ca4a182ad249704d86db449ed91422fda4311018c7da08645f46d7ed8eb207349a1cedf2e4bed7449c5cf5615c16b887f186aa44e69e0b52cace5e8948b190b19ddab7a7fa22a7778589d3e7e1964ad2fbc142063e0adde6750c238a40d39bd93e3c8087822c869c4cd8e12c6d075ed958fc7e06a0172d99bc4328fcc952c60069e14c70427a91c43d8bd5c650cc874836224f6157563aa8af9ab1e1536d1e6967a2d8409959ff1e03b6ec44f46ae70b6d48d1ce93c1b3d38e1466300a3ec8980e9551ecfc90299124b957dd5062cdf648786c70d8c6596e8b57d287eaa87aaa1116e406df1708a2a03396be27ef79338e1498a8e82c747b099b2a791827cf97bb4b70ee24d612db8f6862a8bdc9553d831114be17ba9a1223d6f919e952174802a755753337a7a7ad63e7a2d9e3a5d723a2d530bb703838b20567f34101fd1c40ba07e60ed212f1bb6b0c89f963bb1133d59dfac88f2eab5c7fc146f51d321f830de09760ed9d8afa6c4e50bc02bc560f6d2f026065cc14107471d3b40b4ca80b76a9697266e6a58b239236ee06ecc25cb4bc5e353bee892da74527310810cc6eb7ac3f1f40c3ed7cba8ddf8e270ed0c53966b98797d06c6e75d7b55014c315617ae4560af12e639aebf60232b7f852ec9d479010b3f328affea318075f5731d1f68f4066060977428b1cc935a8a9681b4b144c394f8719e80db9d01f23a18952387d513181ad082e87264ed2f6ed18a4dc1533d0a35997712718bedb972b873eee40a2a2df8de6739aa9e322bdbc4fb71601e03a5a5c05da08f179dd5c2a1eb3076383d052ba2790b19d992f1001eaa70f61f17adf456b6bccdf0aae90dabb80cb0bf303e5fc1ee1fd129f74198490dd877e7eebf9a2df0e6032432bd0699f0229803debc0da4e58ada9f4979551a51f5a9cac181db016d4dcf17090910000abfb5d7c89f35f803f2af27259ea6f8c3e8c2849e2332697a89d5020f46ef07cd770bf1540fea48ab0fd336905e9c347d3379fe41f248a388bc004a050d072f381513f64f7843802f865ff3fd9805a10e93685d59403122f68d2bd8871d5157867e9b7635842690f6532d70b4cbb22b930548640b9cdccbd0ff1e6928f70d2305472d6a13cd4513f6b46745ff86f54318eef2eb8a023ae06211e0f6923df53f7c36574664c1987ed1df5c5adc085e3e110ce91cb791d1fcfd9903b38d3d6615d3e90e75ef81b27de481e9b454dbc9b4994da8b4ce704616499645e019c21d90d0a3daa60760832019816978fda118ba67f67ea0f930fda00e275eef1c1b17d7973726cecd9b75308f9631508f0ec34f606cb92a5d1ec3dc747e44b22fa88827059ae67f32d7beb422ed85948e4bcfa0b9ae1b7ed355a3792101e67619c9f2cba9c440d7f1c51adf1c21acbd7c46982c09467c4463fad0175f16ad4b1130b9ab20671d412274338313d0cba4caf1202674d2144a9501991d4585c8ac48d00cbc0828bfb15149c7311e1210949f74beb65e81a49403401d6a669621b52ce362a8911f04a60ec415980b78fcfebff641e093465091403aa4206bdfc7767b97cc0c8e6da82e97226ffd6fd40644aefec499a666268996d2ee7f27f50c066d97d2118d118b5f754c83632a791765e500002121ba23234c49e17310ad04be4592f31221ea5faf4ccb80af8c14befea77e4d3e1f1e056111a19ba29bbf688736fcfd4a1f04cecbb170dcf51c542ff6a3df4610e173c2d79d0708f976a75f7e1e6d8476294a62af717c92afe490d6221f5d1cdff520681516f47161480fe89c043257c60ac8635a3c57db15fba1d3cd8d71b5af4b121fa3c30e27fd2562d953e22343c816317e90fcb18784bebf259a8a3705fb249c4a74f0e178190bbe24cd352775911b53f09467fbdb3de80c9424a1f73b15e82895886920ee8147b3d1498a4a123d3191e680cc0aaf7a3295bbc64eda3f32fc3aa08764c2492ec5d59ebf4a002b2f2f1d42a6308a00fda7fef23b5c892317b24b00abd135a58ce5701c5d868642238cf32969f264e28803ac71f5483212c94b66bb0b58a719a181025d17f1cc381b9cd7c3c877d236ab68be2e5ca94cb8a3847b7da3a55af18b0dd460742730c790bc19130f33f6ea11019865b1ec1937ebb98378a26a4085c04b00b21d1a62b6b8e116242c5c303bd0e5971eece4e54230ba9ca99cee962b2e89319da81566eaf50dde148327073f93e9a275a665e938342bfa3843675048d0ef8183ab4bc015775e11722490a02c399a29ba427133a25b618f164b496807784f5d8a5f6ac49349d467320e740c9eb6ea08604874f07b906293e8a71a855298917b7060a845e40401ab40ed74082a31a97080605ae7626e256d4e8ea3bf68987c2f0a7b5c653e6431261a0b3266307673cc330c8fc84441abca6d1a95707d621a2aaaee762b0e01cfc89bbad795fc71b5bfef138ed619cffef71b9d05e2c8d394954c5c21a07be021318035bd3f2dd890eedcdff3d024740c9441a4c228651ee48144a1610886d52f07d52f80046620d17dbf58830fa30d1e086cbdde0e8798379629693a9b107643fd51430f5c20e85f5f16084b0a5f5971dcdabe0696c0fe41e1de64eab245d2a2ccb4811b2b2a5de54b57357a9a80a6bca9a79e1193dd1a9a6098ecf8162ea7b2c26a21484f08d32daa41b3b1a1d9826e575bafb7eb5d74b28dd46ab98f57d2d3712fb55a5bd55b955b518b0fc68ac7b9878e61a3c69c629916a6e6aa084e4fc17d47f48e3f843c7e8010eb6c8a88d184400f1bc4198322c1aaf55863fddb0021d3b3c0cf4fee7b2c685617f49e64884b3014e836c0e02a6c59516affa8446bb119c87ffff6b2aaa2fe3cde9a54204eacc1e38d49f3dfd656dda91b5cafe586f5655de7e4658625b600c1dac54176c7b10e81a2dd75f2a25c9743ec394c8347e10a225c2e0e5c0c26a6015e6aef8bb078fa888329d40b450766d639c041d3fddc1048f99e847b0031f09ff9acd3d97455760c55cee5709ad1a40339f879af2509cd68290c6809d3d0182c4cbbd8f611a40eb62ec1c72557edefdcecdda00e3134b5b8e41fec0a003dd2c3506b4bb2dbcf588398ee49040bab7460f1bf2af4cd0d061dc7126e54988505e64f596be25fc828a0c9f1b62cb4f1c5973f0cf9ed439a4dbe68414db052caeefe64008b2ea722b080ff3d0fad241241999f9468ac3bacc28c2776644250268b7c3a4b3906b4b3350a8d141023797459f6c02ede1b74b98db06bf44e30822aca84daebd80d82c32291cce91ac304a80b4869dfebb7151493169da0c419e2d0edab5813aa2febddd1dcdde643e97ebc2ae881074762fceb1dd4ccf9a57a03ac831397509fb913f02663d6ed03c2e03a41aa387fbbc62ef16d214744bf9d96df55f78392a4d25ccc34c0aaa7ca7c4cf3dd47f508391df3e839db57f7b93838c3dddeb73e8e75cdb8898178c868e325028a86eeb271394e8ca2e9b12fb2f172405d6322ab678a404b091aa52cd18978cd32230fa2e4e6f04ebc34faf5bab8f35e4d11d6ebb2640094da629fae19de32868d75ed825f8864108873194c39ebdf25417c4020d0f721ecc4ef525f3d36e4dd63d62a0b878a91a1662315b440f3b1c0d04140012744991c2f3585dd68bf73bfdc804e394ce17c9801074e8b270c616d0160dfb2e0e6435d3020f45de64f1fd55e1b93dd17ba2e6e4a2592351b44598d732114a764c45c895546af728cc919bc4013ec5dc48094aebc1b477d396c4356aa4cd233dc3dcd322e69295e6e246af8bdbf50b410d86136e0e38c5d2ca1b887f07a99d610e5f6b8c4ce27793c1358ab34ddcf63f2b64b65c6ed06207810576fb591543600107e80e49ca619c14936c4c029fa50a4cc2034bc398da83ab6968452f451c833f45b3558207004dc060e77e437e06a17f2c93d4405316ec26c3066b6c828abeeb80ca85c52c88b8ceeb1012513dd2e298c5625a4edabbd1e8b2b495337085df65eb7f05d12e1d03e1234721541f85546141d233326dafdb85a93ab615864e96c46042f700e6b4e43bc65d454b7798df39359e2681b8b6fcdb223d2723449626f106fb9187e043e9aaea82be91247708ef1111f31a46db2788234ffe29800553e2d3a7e73ec9fdf41e6e95ed35c97a4e28513baadb0ddd952cddfa0b91002c46a7a82d802dc73f66522ad3639f886d7aa52f32bac2f1564b819049fd87d7960cba44dcbaa5453c9144df9d684a708056a596309922cae60b8c123b88fd951b0859816791cc1f7232d01ae4fd5d3ab3bc7e15dab9224dc799c934e89e06d231f5bc475a685d4053a9f3991434416fc83b103490cf4e1d882e64fccb6d4aa3d4d19cee4f91a11002ef25288c2c0085cf053b4e7a81fbd1df14ae177f66382c271f78c0f605635d6b53569ffe09b339fa90e3ba63c08a25eafa97f5c554f65373ad254c359e79ae98404b5570793d20f9a92a323aed1aab908769de5c0dfeb13a808b4a58b832f4c6e2e9d0c890e8aad48e063c1b82e04c83e67e34f67bbe963404148bdd8cf6cc0797ae998c84068f3bb3dfbc592af6268bb39cda9b9bc55513933ef62ea18d2b69b4bb5f9ae515f718a77fed7363393fa1097a126847bbc556df26932a3797968dfd63bc928f7c73575c72fcfcf38e70a93e80f9823096bf7b920c2e2cf69be33486e7c90f78c01a75a0770ff0ea613452340755cd0c83696f19beefa7988f5a0772eca56b3db6b450d829854867462465d88a5b278bdc5b75a2dab07cf2a47b4bfff10bce98576ba64bc72cdc12fbd7cf0e675ff41d002582fdcc5ff80d4bc476130ac8fab9729e746a2c9a23782bb57ee515d01f4036042df31593935ede2305d54eb2bfa4cb64aa752a952f60aca5fc8d4fac98175cd697206c7e0961674fcb1031c28b2c9ae9b2ba8a8e861a009cac598eca6a72c26541f219f2a074cc6b88040008d5234f704bb44fa1a28f8b1a4e0aba961da23eb93ec452e8b1ce6d450c01de456eacbedf8845c0ef1ec507aa684d572a6c6d510fa3569066482f40cbccb6d0046227e45264a74139d3a31106d13764b6562f82fe0673351facb4ffffbdfcfc85a30b99b3f2ceb38a6858a7d5006283ce8d2f9526f7eb942a8c886736df899e7c8c6388c0600b4479ff9751013380d0c640ef9445c2e8a9c8d86e75f4ab0a045b12cdaf1fd0d81171dc4396f2b88149f1d6a714e58857f04b954be2d48cd198cf244150c8431abfa02a551d16db246199ac36327142dfb42e57dd990aead33bf41764b8161274801148d3fd506baed5aa18a3c39ca078d08f8b1823c1e0ebf83af0c5a5697407857d580e32573f717dc8a0325c46a8782e7f10af319c230c422a5c6d4f23bcc18e016b09fe90e1a0ee05072fa07e799abc40b7ee9ebc2ce6d5d835b05c7e17db5c1c813d05ef2d3b9aca1d3388293edc512f0624b95a8ca8a15012abf54b67348462b4efa5ddfb56491804236ead4d9d2ec0c1dfbe85ba3a47ed59b12c675e19308b515132b2601bd62b2a10fdba37550f9451e2bf5c01bcf6e45fb66439bd2239f2773c38739eb5c119d26c9a38d6c7475726dc8f6db7acb1bb48d5cd055a7bbf87b22d3bbaab0937d306a408b289155f748d63683d464341118270e86b631c2cc6448e34abf3904d6b27104f80e8762c398e39db084559ae88c3309a52a999bc40be1c09b8ed0c9bc027fd753935ed3cfe4875ec0a2354aee2fab065e1dc10b9f428621cec5c23e4b9058701c4efcb1d81fa68f5a6cf5b87415cd1fea63d5e8b74bcbbc94593373e9aa8552754554da69cce451d28770459d622b7eaa0e057f5a5b2174ce039c40fde8eedee81339981f5116e4b27de56d4d42d1235897cce28375aa95508b14cccaad574859e1084d0b9d581a637c14aa8b132a66c03d1eadac01a2fae834b083c7f606d911c5fd496059bcab9ff82c12da259eaa2d115f395c2a91f91ed154e22e4aa1a8e05e4527c4a19943cfd1c42accd41525586a01fff8e66fa06c876b2e80be2c22f1aa9c2a57860e18f78704999a83257e5686b197feb97f9ebe47494586c34ff91b587b68ce05700b9b72b94f28f1522f0f08cd2a1be22a83fc826daaa20552baf3c9a9abfa88d7313d5c99767482814d9146cc431edaf7849c12ac1a6f7828737acded992383d8622847980e30d116b00e70eec3043c839259601e7378fab8cd9ccda075ba245fb6a1f0b62cbfa3a69b8c1ae753c677f517c8e52aa5e8f861e54264a2c43e524a8e36d2fbbb8b949adcc2ced9dcfd09e3d82f3fd703acc4077cb8292f5ab61cd830c6d43be9855461ab7e2da48f233d53df31c37a058045c76ea4c7a2046f572f54873bcd2db17e78bd488e4af2002949bd5f3969f7de5f7053dc844a28702de30b8b104411c2f8d6bd527ab3321efe83947ef3318732bcfcc6a74e43800240fb0f028e53de04540b80b7ec1bf15605707140b0c57eafc8efaff8182bffefa5627551462394cd8ff91c3f3e1e87fcedd3cb504cc49a93cded15f9e2eb0f0c27732a2cf846c6cc77da5b3383d3c2a50d9d87b4ed94472ea7b55ba2f2ec0fac5b98fba936aab4bea63e791b40bb270775d8497c078d046d3069d28dbda02aa3e6ae0663e83bd102dceb4464e80d0b8d4bd19f33568075f3d508c1bf060ef9bb8a4caa0d15aa6ea98a120a1b6a6ebf599ab1b74d526edf7c9e00851465f26843bac5df8a0a3f604aa6cca8b088ff5859141a66dc6c506be24347086309fb9f161cc2b035475a3424c0ef3eb0f70bce43c280698aeb960f58fc608e662f4cc046af85219b88f460786c5b78f97aa0fc8f3e34537ebf86a2c0b4f5618d042b5c99c428068c3e79a9c7997d35fbd35c0f93439e48f022875a432755d5cec569a6904097a1a99fc1348413bba428fd672553a40c595da1e721838e0a547b6ab1a1f1a08e8d4265f2f9273258f60379ac15bd15077b8656239310758b422ac3667d1b14f4c91c88f6075e742a98b5ce08d1ce57e2643333ce97e42a76083f8f2cbdc484a152ddf43f9b26368cea0cc58987dbc690527a80ea8cce61cd8db7774a6563a3cc92983ad3564bb0e83be9b52bdbd32aef41193da50cf1e1a4d755997a5ede7288e4d48f43876080bedd047309cf83d2f651054a42719f599343978dd444bc6d0f3ec99f30ea4c0cd2de5e2f642784efe7aa4d595e3d6e3c528d2c3cb1f184132500605e51c9e2642a5db48e116f650905e49ed81373d1e2ed86726604938149e5f33a7293a013e9bd0d43d29f594ca0536166e33987dc61db4e0917329cc93c2833391f398e6a4c0383fe4a1fa1f709d9176bdb92536ab646d751e59dd02db2d7a9e0108409e7170277d5f858dac385bd40bce6e0886a7b4b33bf4924bc1f2423e3cc5698ef272edaa02bca8cb9000e4120fe35b43e7e9c801c0cc5da4a93013dcfb665d05f5a954266e20a9705b8799582f8f8cbf0291e681740caadb6cbcdae5eddd814e49c080bce664cab1d8ba040713f0d3849e898d7e36ac411919fb56018b80d403dfe62d603ad6745769b60d0b6046e9d1b4a9c896ece6ce644c2f6b922273abf60e825b639a8034238450f93f822f4d96630af25b68db1b8be58a8316f2313c5f09c6ac8ececbfff4081a9a938da4e1efe57ab3cfe69115911afa49897f0eff48f450c962168644b1ce7796058c260570ba229b8df9f7e85286cf1d38d5ce78b4a9f82d4b448a0124b1dec0f47e0473a5d8d07d9c13f42734ffcd29c450538c8f6c640d56919fc7f230fdbc387130c9fc8eaf02ed16cb74cf7a4eb3816371ab3192f6d82ce8472e42653d22a5fae0ab296d935e647c5a1c5d9909ec6528cf83cf7a4d00b0f74b0e4355900ed127e64baf6836cb8c18985a0bb48b28e2cddd0c83c05ecf088f45fdc814fd915e9207075dd8303281660411f70733f50a661d57d2dfd5a2a296313ba43c7571ee5c46e464826ccbe1a6d8726b67d0a4e56fc2ee76bf0b85c36dff559c1ecf33d4a32b97f81ac0fb3a1ef5fc8db98723f4cc5d2aff315ce2e0a4010112fb97e9b527f41bd67b2a66d43dd3586207f1d654948151cd44ca321e756c5cba9d44b9e8f724344c4e94814d82314394c28733b4877013d1e6cc237e4d74101c84f49ba9a7d00dcdb668b3c3b507e900887d9115aa991fc797609217b6a3de8f7bcb078659a668ec21166c538fe894eb143b3df42cafec0b8a583182ba2c8ae314afcdff3b215ccc60a21dc18b730d59d0d47ec0245c60a65e5440acc76c0dafc93ae373f8b6f56274e079d995ea79ab561fb4c15a5c307b19a617510b3c20c215e3da04ae61b9036685c3b105026d02ab1278da66627f11990970f347d22e47170894f02c2769f5aa0d5f6db46cf3ee996c68ede1dea816bf49158eb9a3a68ea6f613d4c4edd46a9b295637a4c6b2c8c3fe690d61090ad3aa6ea10321e6b559d6a453f716bf19860ca76fe01e8d8e794643beaf0bf322a0771494a2645a95016531daaf5c7a21b4db01c558749e3e159d952b02652d5f81a59fccaf8ae3f280e727c965e1d3fe67ee427e1fe64f1aab09032d7a09f5aaee06c2d4a34a897c1134d9a220e8e0c9b7fb935ca4401aeb6942732c99b8401ff2aca2398249c590f0cfa0d5639e22ecf1aacee33491a5a4e2d78882659dc06d3f0186b09ff8f4bbec1b6e161d164c9a8e3cafa1ed2278a2c8b283a85988884acd6484b618395181c9ba38abe4f7c57aef001fff311fb36504a8b11e9ae46272f810111dcbb5a62478691b84eb9ecdbb514a69646b4ed801f3e8b78e913b89de9cd902244d9cddf12244db728227795977a1814d065e8752d885edf1b4d65d427ac0550bba5417281eb56c05753720dc997c56a08c44a1332f4b46569e13c0568187d8cd7ac97a158c5720167da760119e015bdf1db7d893e0e4a5e40bf0254db2ec91155413d9cfd912a0242e6d27bb974a01444d99436296944c4dee492cbc1a086f250db52ccd47cf478b501332138f086fd367ba991573affd6bc0382975ff0bd10eeba529c6d9dfc12d987ebc49b7954053fecd8d1725f77d75704fcb258c836faf56b7d1a04702903b5a0a7c4c217feaa9b2dcdda821d7eada0da9766cb4996ebeff3fcb283897ae568417b4bda3e3c4dc729a39ec3e4274184316e842adf06e6a528231d82d3c2ddbf9fefbd06f749602089161601e4093f67c4cfd1e8aca4167104346836752cce382ba0868226f0d9428dfce013ed1da11469c158678cd9c8fbed77cde8287702e8bcb3a5f0b12caeb141701747caf5a6d9e694dbb6c24295241a1aed81a7d7e49e22fc0e4a22756e4548e1a222f3da9d318a387db1ab0d8e54a62bc9d2d48a50e98d7db21c18322e3032dfa2d5df302015bcb687910ac3a23708fb32b3128b03f653dae55d9b7370de05305bf6d5e54ee9488f2e426ce857a5fa9b33c3863b5810a1dd8664aac0b703439ca0d038c18b2c63fa24ce3575b5c4f42430088b140e7fbbf1420712f8bf92043c01bc522774d50a33da91a2f22e476bc05dc5d8a308a9829357e1b15477e171c960dec328cd521dcc3c8330ccdf52910b11223069e672ef024fe761a618befd11814951b2015da51ed54193c22d1d6836a6d706f4a42af4ab275ddb9f6ded2339722c9f3fd029b5304c30b07b0fbc0dd092a386b502f802aafd202f554242caa1059f85c7e41fc1d1b866b4349facaba4255b0f849b225b10a513d496c6ce70ba6cbdf166992fb329cf1f5ceed998770d56174de6f724881cdac946eb34d1c506f8ba86cc69b97d90c8b2a0e4400b54debe16e69c6654d2b9f1d36b34f80272169cbcfeed61c5a22f146da42a9b3b9411cd790b2a8b569c7554557e55e555d10b0d0474d75ce281cd59fa3701545170407dc76070bc03e81f6367175d54da3f9dc3d10534fd8869fea87afb0c7f4c527066fb025c2ebed3f5d8bbae1082a2cb5acb1b7bc659ec2ce0f95ff10d8ba2cb1a3ffe56fcd2e4eac18b5216cad870c9b81f4c29acdf211990dff82d7ad422d52e7f8d8b097358a596dd3f19dad9315fb5c51f1f9ed9a0095a396d7ee36c07d1320aaaa3df05d120362dd8490ce469a55b89b0b1bed5fe317edfa1c0e19106046396ab0934af72be7be909835f651a153c2bf208269ee4270067ee0c6dc0e66a52c7340c6d86da2e5dda9dd30d8f7a34e931b7625a30efb196ea2b8b1a1fac2d3250791c79f3ac92a92684107218119ef83d5374e4d78538b497f7ccc8425ea5cd1b7512f0ee1ba2bd1c5981b9f7741164743808341b91cafa456038417a15c049f2169a44e87cc50fb549a62cdaf0cbe85a4bba4af70adb5d479dca07fc654ad1105120b877c4d66f979e6149a7ceb655888f4b51d4d4f5e6b3a82e00bd423b23d334856ed1997562cca85921dfcc512cd01bffa23b5b88053c7d279720057a0933029fdbc049f8ceef897411a919a624198bea23c89b3211c6c84fd77712c9de5b38cf2cd73423ed15de063ead87a817cb85bbbd8e58ac46a202ce112babb60f648eab22a3e9a71e702d8a5e01192136bc1ef4a619d4d0310ac9c14e8d0e80ff9dcaf887dce2795a48416f4e64ae0188a67cb9d1abc3f1e85157bf3aeb6dbd3f6ae40257f95ec3005d530def59031e6360f6468c30a4cd34514240e08a8cc08961bdbaab75590a5692043c17b8cc3d6780d955c4f1792b781a93f45612b932e221210f17429b00b4b35008145482f218abab9870c30e191d0871727ae944c6ed1571978477328fd986509f1276fa6adad31fc978fc5e96db5b7404db0e7086d5b373be097a1390c8a92e617be7848e0856f5a5e53d4376f12c3967fddfe04ff868cd428131ef2444b573d0e7e7899b2a5a869a2ed19da1b2b70453b883e74394feb55f53ccb510e5e0965e2828492022a8a7f88c6f31c5bc6d72f41dca8744a54c562b22401a5dc368d5ae15980f0da0554a0ec133d8bcc023abb40646344e6d17f486dde77ebb0fe3e49ce0acb6afb6e11cf70d874de6c7c2b484e57efde757ac154c4d53ac149bc8b77f414808b2a8b71a3091a81c3710e2a9d36de5747066a9b54cca337b10ea947944079de1791066e959b3192d15ea7959bc1bb39663dd9cef5dbd1f36f20d6fe7b0949c37b7ae135ef57e70de21042b54266ebe7a743089a783920aa537d88f09208d8b392a4fe77d24793fd3484bf6de780b65b2b3fcdcecaffc48000d252076a2d44fde6c283ac595e0f99f8f389780271ec6852f3f63608b47183942aa757f07421b718522199772b50f07580b7e4e98b848e6d5f6d1d784e7b8b8994d0f2b66bd1ea465724f6ab50fc4157215ed830be3e792b0c908a61ae01875698cef994dcf63b8447532893ef274cc25b7a8230840d1d442bc30f3eccce9485472ab1b3ae7a20a7d40089e7d7287048de485c6ade633549feb12cfec21f13e9b93877f32302dc77ebf0bd6f20325c6590236c9c0eaf156777b282724361d3099eb116948601a6f41f5abf30834ed32338f169e4002b3d026231a48a70bef6d6b72cf3df05dfba0b03e4a357ca678b885f3f542c8fc195b52b4ae1e34df456fc42d28021c8ee01c3cc9ec2b6612d17044c5ad99431c9dd7c65155c85b8e0e8760b300f60e4e41e141743820c73b011acbfeb514662c53121e0e8d5e752eb1e8c639dae88638e4ef0334e50374d508e8b31a74acd35801724e8be6f70cd5f0b3c67854283912626aa3d8f2d861a2813752bb55059354e09025da3184235f983808bc11dd8371668c39d49360a4e81ce740d03cf7a4926726b908468029eb280c08f6ab1f32fde9b9beab2ad2fd2217c8c0946e928e49d8e6f901478ab904994568bd4bcca65a92ea0ac847efaf359dcce8517cca9e42c62506ccd0e8732256e1b0250603d41223da7346b75962b6129b46665962307d9563b9813049b0c4d099ee2b31e19544cd33a34392f9a1db0ccd83c7c7ed9598f484247a2d591f0851bd728d13607891ad099345082e1592e7de18e938315063c05cb5cfda080aa52b2ef8e12134c8015dd4287f456aec4b3a842b858e4e7fe6ac348cb0c17360cc32910022ce688921394672bfa1017c757c0cbb871bd85206f64d3c4530c1c6eee1435f61b0356813951920a5626a4a1ba512eb232940c80ba154db09a4782075e87c5cd399bdf80f8a09358b22c0dc5a65f3af50db313913b5bfc6b70d93104f4ea4707ec5c6413e96a849bb9ce589060b725689d5b4ebba4b5306c0d795eb505495ff90675b2dbbf023381e3271c5631ce9be67ef2d838684d3178625ed2d5be716e72fc965c690602f36295f64baaa5507984d45e3250971d9c0f97211b6e67e44a431bf3e7c09566de3f59fd7289ca0dbe7dcaccc49b6e68d8ea5fe81d2b9f793848c2b35196ee684d15d026e802013ca54a2798ada5b29e4d5fba9398ebcd5ab3db9baad6ac6b702375e8d3dffbf6ed5ec7794ec8b28b88b5a5edf578858ec65deb1b6c4c2ee4bde05c8325f9d3ff17a72db12083265590da06ab3f875b0735971ebe7a0048d4767e330647796454572423045047011cfc903a82dde9bbd4338319785fd38c34e19014a2bd6a920f6480c39aa17de8790334c562cfb61494a90dc14a50a95f01a2a82185e63d9190f0caa75a3daeb79f8025848e472da38c13036ce84eb48a79d0b0d1267a7c5ad0733d0bb050603142edeb4a06044d17427b781b27039abe21b17024b3f273903c4a7401957c90709df19a4451e404221ab48f05ac0914e0556086e15447f7e90309edd83a96a7f9ec3bdd37c87e8970f10043441363f3f769bdc48e299662b229b781c53f7d00a7d39bd8eb771662932fddc90d40a2becfec6c0206fff2a6a8ba62f933111591fefb4367cbab6bcc840d8bdd7e052925a878bc1d1369f88629f75c4729e2c7036f652dea484396fd48124f4187d144429aa57e9106d214e7dc212db4365ac8f4e0b3d24134113d1250b3afd606ad1bf7a141affefcd99530f6640e9dde85108b04474ebd1ab8bd673b51ce328dd4e3cdb314f0c8f962e3106b68589df552e11e7903f87527778c3fef9f4fcef42f7822c7ba86ec3e69ab27316a8f96ee6b9ccca6ac3ab346815144563d07b9be14af51fc21cce51dca2aec0910a5d29a8703331df63198139f9004459a0d90638ef7534c9028ed620e2faca92fcecd3aa57cbaadecbc7a0a9159fefd2ee89f793007820d3418991d907e61baa1fc668ee4f8ddff5c77cf488059b9a9b0f5a277b28842588e75270c1e77fe0d9263e940809a7bf95224078a6804448f2c4ea20521cc7b2171de2603585228bbc91a398df4dd927f690972a8ad928167649d34b116bdb020574c04370ed6da5e7f928bfdf263cf1591a4fb63ec147d880d0555e40c022092959e0e7e9f86014334f7afc874940e1f9d15d61db7c8d45ad7698db4b495d238494df84f7074352761afc8f4dc48da95174cd84f9fc02c0f3da4d53e685159ebab0c2a6e2a7af29fb8cd5b555f091e9d20ac014d8e7a32e34b3a030ff6937ca54596ffa865199e49c4e5257b6a5a843ae49bb2c8a58789c4639fd6e769b086f174d0b1f96a187a41b0f5656b8b80237aa8066169d12eb690944835ef2f9160212ec62378a09d43153c9ef9fef570953dabec02a51439575079e680d23b5a8bfe370020ff32a5909aa828f3b5bdb6fcc8af6d75b9f8ae112eefe561f51602a97225b3580264d105ec6fba8dc052d6f9e2000be6ee3c077f6020aee3d52ab39069c4015d8d9355386e7566dbf237d00b0f9326de98cae0fe1c44c4bcf047ccde6a4baf9a7f8b8d533bab5f2dcbea68193da8289a5d068c162002e93047de2d35e4f07cc52b6a65cbf66f8b536b1aba664e41fa7f67e7823b70894dd5937649a7c0a199526f9928bdf722e8aa444c01c8e31e8882a80d5d7ecedffde4637795161d06d9be4960d40ee103a3ca9aba9ae5e4d9beaa8c18b415d7e790c966213f8dd29d4b54ee55cd580d06b99427ead75fed4d1b1ce42a4ba29a9f41039f542d130eb2a331c41ca853941393e9bd1f7596d963e66506c4e06371334b65b79cfb677d61b6bfce635894c06f9ae1d6b5e9144d0c10622a57a934cbca5f6df39240ddba8073ce6fdc8454b74e43fb229e9f7b5450aa98ba4b85c0b14415cdd4433a0ac0ce309c52d7ad733d845952cc7246bdb406ac822d95096e90d814baa71821cb4e39ec432163f6f305c4fb76c6561cb2923dde27c17e5339145b47fb9bfe450c052d893b99e4f7302364433932e4a5e26b0184387bdb403c6e26e646dcf3ea58269f083ee1911b759e9af8d141c0a6cd24a1473194c228bf562426ae37667ea055cd4fd8b7f6c91b77040e239189a79607acbfa7f1038e3187ac3f9f4eec9bf1ce4f04b67a4aeafff2ed629e6ee031d7679774afa270bbb784175cb0a7644fffacbf40438177bb03ee10ee53346403c1a284430bfdd0de66af05430fe8413a26d6bd791c7bf4ebd1acf637098711efa7eae8a6e73aff547a421587cbf508c9b5271e8a5057d136dff739a1fc05f45ef44d553e2b95ff1eccce39b7c5a8447ae1b78a4a6bdb4a09505a7d8f25280ce2a7cde2f6268062a07c8c3985a0136001bbdb602d5713543e8389debcac84df0f156f61dcf2c3e3e462e49b39d3f16c009f8cecfeab0ee65b2a5ef168a9f21ae25e4061a1c2df63a409ab85a4506a2eee736139612ff79044f62bab0a4750e56dde97248eaf9d745346f5a4d6173849ccc8d5f02c2bd55886162c8a795332c2673c7c857f5d689fd37cba093c0ee588926a1f7f5a071ea3452340d41597682663f39de020bcc3b60b0f2c2a3890a4c893d41f26c7097e679a1bc798c3d4bae849079048866861b2305b8f7e9a4a111607c9ba33fa594b7922cbb620de516aa172e6b0d41c033f890110644963578e61e6eaca32cd2e57caf1825fb93bc6f09705f06dbb88160168ac5fa76296042e17b5cccd9c3720032882ff476ff7000ed4dad02d3186dc25bf0b41b02fc53f5a292fe25a4fac97afe7965a377a9fd09779d3e5eed756bc10b6b61bcdd2d354b43ae5cbdc75a2bdeb3a18b6736ffb671d5d1ba2fd8ed4430fca2edd450aad22c253f88805e2bfb44dc8d4a617f37f49bfeadc8b8a97b69f40ed43003ca5166785b30ce424a07026d0563d3624b9e585045b675d6f88af2f2650b0a863ac375b916ef185a765479f0392e82b1fc2c59c513b167383d6704629dbda1392dda331023d02c5379d0573c7b3edcb730b3f3cff125217befbde59652ca246584074d07580746320713d115f6efcb79c4d8398c0a696811fb8f161b4ac638dc9672bb94c7de85d409ebb17320a5443207fb66451e29d163b74618e76c8d1efb8ff65890635e038243192e13aa3d09276358e289e88a8b89ea10c456bfd76b074de4f9b5d62ded9980c3d13770f4e72e98bdf41c30fbbef454a8e1a763b7d66f10cb8473497966a6492e0b6369e462ff0eea3dadad991765cfdf2457f233f7d6124e32dbe06da5c2c9189688a5114ac3d4c5ac13cf3a33c59dd1692fbdd3da7c9a8a9b96b3fd1de89cc9134f3ba7a5d576fe80ca2b355666f369aa8ca394a336b7a320bdd5e6ebc9c9e916576e9bb3d3c0dc3d719cbc76823033a5a1c8aa524ad90e020eed6e5b314867edeead0739daa7e368bd4a5a6d7733ac6d574a99d17a86a33da59436b576d4a7b596a3b46a1d05b1ecada3603d2339ed4caeb5d64a67d6d7959d2caed5522f5c4a29a574aa524a596badb5562ff294b56a980911194ac9504a260d194ac9504aa64c1a329492212aa30d7112c76a3808f57e64d8478fa60c671680016b43397f3e85644efb0b9e0b2db6c7b4cdb6e0b3b47155051438ceebd19cf34e68c9c26915f734d055630d6431a95c6834b4032171b43f7d0b21731ac914125a80c7a389ebaac469d13d9f4353680aa986c8546b8d6a427c35e31acf4f8b9e4bc920e9124fcf52fca4ac1c4824f1a33c82f59c488c9933e69c530236c4d0303ddd508689d6a444492899dfc4738e538ad1112c871fe7d2e4b2f9386363a6ecf264c9044a82708202d49a94499432b36676b3835c2e170fd31b520288899a49b09fde4b930b2945e68cd9657ece897482a04963ce3969d83c0d973f3c0da741430a134fc367783d34da490d92124dbec6b3d75393b3a7bc9e9c8a42c6a71ce5f5a45028f7bc1e54f6a204f15ee79cd7d3d56c79ce2513cff9e6f5709b4fc9b3d56836afa95ef3aa6945535e4b0204afcde035c75e8ff601d2d0e31b24b47cf655e1ba520550bebcc5625c3aa0043de5e95cf434262a86a1dc7b7dd8c205cd099cd0e204d6bad488bf4d90f99bfa7befbd4fb0ecf82d96780bf298fd090e7ffde27ba99080bbf7de7b594eae08c20cab595e13a323db164e5d132c48b426ae89971c300b6584b6262c38920135925ec91f71ee02043008426a1206d0cbc94f08582043e4c48720169a849c9400a8014c8c9c2001c4c216474e9e48c2020c8c6aceb09ab55a926d5e221991428430b088b20598dcbd443232832422224cf9090a80999c7a89f433f4c50f124ffc40e12c2a9c8ca1095119436528a1b12e7d0447d4aade9609218b3c4e8b2717dbc4e4d3bf2ef26c59b98133d6a2f530296b3e8ba40b94c773eb228bf254b756ecaaff2856cefa9defbdd8859e0be93e50d5a2f5e0c81224436d2d097eccf116477ceb2d5abff19166aef8c287232e578b3a8fc67d5db65b89a399ba09123298ca70e5600229685c689ac660da62362c571966dba25a9dcee974ceef7a67860d25b78f5c0d25198bdc9e5d467ad0d57458ab614f81984d6dbd6066a90e101062b94b5d91658b1d7e39fefbc27de1beb8900497f558fa419f66901018114c245dcff51ed02dcd39bb55c9e35ca22658bf49a1ca505b94d8dbfba99f30cef99b42736922993ba6d2c4d14adf48be5b1cee7a08390dd1272257d1cb08cc8fd4c83775b5d84a734787d163cc2a6aa3986c435a5a4899e8ca4b6e400daf81ef837c4f81c8344fe5ac431910276338c2c818466328b9b8202aa2a34498248941248653bf60cc9827a630929e8ee88f112e308ac0782ae3e933901f080864a466a5d3cf34c9a7e9edb125a963a3c2f17a86a8b5d62aa7d3d945e8104dd3d4dedf5376eaa686758cba6a0f5121fab2e16d1acda514a3445a795b25a34396070934d44343f410ee21cad44df488aeda312c2f1db986a8100da2afef1b1a1a72ad00c263a74cfd31313149a61a86b0d323fa7d97c7d3a1efa3b6bab223629eb9d6229e007044ca5b8b268f19a988230178eb9bd763712de18857099400838594297489985a6bbd7992479694357ec479eb7289b75e7126810adefab7e4ad7bef48a4129c1173344009a4a126ae2d4b6468112788626b0e2290c04494f1d5b3a326967873f563f7b58aaf4844dc60f4d56db64ddd0f752888afd8fab0be1889b1394ba7c77810be7eb92ba3648a122c3708c5944c716448496c042a00b1a4a40b20158496104999ae8c5e896d1a2a6fede4412a8900f6d6dbf5226491062644b691921d0905c5c893525a6b6d254a7d299ca199acd43b0d6b476186f9f5254df333f46b91390d93396d43961842501ef1df681c74fb0cfde3acf9d622736a97e9332db616c9a342af7a8c18305eacf826244c4628500dbb89f369516cba847de0640c4a9c80f102230999ba1565fbd2b7a2dc33295545b65e613926501f75524f1b4ed89c3c351967f2d48425f41c75b6a24c7f86da0364be01648e0d9fa3ab38796daba595565aab05a9137db24ecf3c51273379a430aa449774cc64eb29bf6ec1ceb90c95023d3f9239d4fdb90b6af2a88aa437a1fa388fde8b9f312fd87c7a2798900a1b70bdf819e382f1c7a3fa68a4443cf50e1ca90d638b9982872dc4f450bb9ae480c482a7def1a74e943a5198cca14e614e79a44ed4a99337757aea488410947b86dbde0d7db2734939e8ca488b64e486f5518bd4c71c96671ed1d65affb99ea7516647cd534debd6b954388b64ce9469349350c2f3ba0c0c4d7120ab03459c1651a107bfb528c5a8c529472ddaec5b53ae97bb20933cc11b2d5acf204eaf2c0b9438accf10640e94b7d979b48e0cb717e4c92473cd79e1640c565e62573aa350f2f376ceafe79cf34eebd65a2c28161c754ed6306b9a38a4903a66986d51253b76c5624bb228e72862619c33a543928aa2fbf7e55cf47d2e242a8cf260b7b021dade03ba859faed3d3cde92967b41919519eed888a1f679435c13823a7ad4ace9ae60eae0989630ba9837b42e650a7463267883c72464f7d33a23c0d83e5cf45f1c7cd6886238bba165444e22029112bc5eb2079b420ba72cd1d163671507769413e04c128b5520cd156bdce84a44a4891ba85cd1dd9d3c4419dba164479e813623cb530091be229bd22f494a67ecc96640ef5322dd2cc296b6a91d2316b921486f3e74d14e98970ab2bf2a6183386081afaaa62a4e90a11a22b36c03a06548a10ba62435191e6f055ede029f68b4e9eda524b8d24f258b52c5b142f8f88cb4a749f9883be0d67f3957105ebbf3aaf87528ea31dfe6810875112e9a56be0248f386585ebb42ee348c963ad49c04bf77e988180a41ab13c561a366080687fb8bbbf5fbd33b106ddc7820d3a8c73630fcce4117fddcbe604b9060f073b747043c2d286854a67c991f2583de8a42aab168ff0d966e70be797f5e086d27ce5072c9d7f0902019e6c96f2511e2b88036673251cc019d939620949494a4a5c66d69522a961ad1f783dd5034a716a98002080a7dc45041b2fdd032f64e3d54baf60371ba857edaa7cbb1a68b028c256de13364410800e00bc748e881bf39512411e7108f57573268fb547cf11bf9e50109b624c4fe711ab7d7a3ddc00c258c794478c03e7fc7deea2c89a2fdc83bff4400679c40408ea845445373627050802238fd58397ce8dd065d747c0f325c4f79da1fea42474b5836e5eeee0965db493457d960e0fba9a35a6aa481e717e52a73c6ea3ca54990dcdbd837fcb22675511271c47bbc3584addde7b25186bedbcf25e6b6dadaa5aa59492524a697777eb349d61ed30febeee9e362fa90447a9e5e5ea65d5ba9f86e30cdf614d15f93e8d410c2c92dfe418c460bc6169cf51fc35fb5a29a55d6fd42c7bea17dbea9cd7d3dd466bf52c08e69c93ca7b9db22e9d5d6bad1a94c9e0386fe0b0c2a6b47691a758bbc8bc5dd5a2740dcae4e9b8c5fc72529ab95a25adf5de7b6ba594d6ec95b9f6da5a6bd55cdab95d8b6515d265aaefd3b67a2de6bc32da56b39a6badf55acc755e190f4b9e35f33a6bd5b86dd3327bc95cbfb6d6cc6b9d30d8b56450489cc471ae69ad813797a20b558a9a735a87bb70a4e135d5f7691d963ac2b983a250e36bea8e976da28f4f18176a21e6b84d7bade332ceb3365ece53e2a01fe86eab92af732994ddb814d8e3b3010cb28794a7739b95a2a65d97a207e6a62d4d58a5ce759dd763dd9b3b54ee58e917d549a9a3276c09d6e459dab33a795af0c70a7a2ef584101c1753923c28805053acf84c8eb179db658c278ce0a919a454f514c7a9e32a9e7aa6fe35d1c55377249e22393186d1d3536f297982de6e915f473c15a47ed8a1b3e20955840f1c97208f092642b07561eab0e8a0f9a880897be12d4bdbd22babb8cb8bae2413311f7c52006302063f3419b97af0b1c2c8a8071e7cae10322a010f3e312123293bf87081195d09f2d9f2649368c0c5899c7a896483183a10c94174caf825121120a62042048e75f9d571c660a8a4d7e1f74d27b80a562f05196cd76e3f417e8741ec6fa0abcfcbf4585a2f05d902cf1b94cf49aeadd7c33927bf10c1010636e09f1d7e248fcf3df2f8fe2087782d244a86915d24151f19327f21b9a03c124c2ff50e75ecf61ed12e7287b467465be6b1cb1ef398cb637bc563dfbae49a9caab42937e7061b80372d7c426e1ed0adeb1cf806fe8542a60e2598e2490e5a1414b49e68524b94d74f4bc890ee86d613940fc95460a5f544f331075d217b89969c280f8bae700aa6d43b35eea36db2461f1ead11c67e9fc84c3d63dbaae48cebaa64ef477f295bd5ebf1b9a17e9d83b0c6e80a7b06de50df20ac4c4d7485bd82c92f649fe82d7a7c891edfa1c7d7f5f8be1edfa0c76e63168be4c9fce6b1db29bd73d43b358edd26491ded1f76492d938d8faa1fad91063e5a2a1ebb7d519e2cb446f87fb42fb03ac99c6a46aeb06357961ac6e3ba4457d89f62c9a37db5973cd6a5c7d8ab1592875597a48e49231c3f3259cc58bd7c3351235532b74774855d7a12b86e8de80a3b8fa64979a444449cd68d9eda22d3f0b19f28914d980ac74c54c3f1c35b953c5aa3948fd5db3b98e11b0df0468bd81bbc115bc42e9f01a9b0fac6254fecfd243eb5881bcd63dfb6e4544d78420eab13c83d57ad95c730db84d43c1af2680f92c85928e4490b995f0f85c8319e285af282c9d5ca42ecae9634616e3fbd94134d049916b5883d1552a21631f64b947d70f619e00cf37f481d9b63f7a13ccd4457d8714e61e750a0fc0d94df4cd825b6fdf4f98de6b9d449af3095d22bdc44e66007e50e7a84c48167cf6d4bb6b676addfdced582cd11a69e196ecdf1b68034d9489e9e808069bb1212712a71165fa8d62fc7dce8302a13fcee7b6701cc2f43ee61005b14f30887dab5129bd6ac72115cafe45dbd712722c91bb27f2f4ab9467488d90c917d47ec8d2c49205f038ba99d685deb1dffe02d0b7cf97440193058c7c177d3b0cbd93999424795b6951ef8cd40895d23bd4c9b77737bd14ea1b6997af42fef68e873c9d47d3a3ad67fcc0c918b87079bd5e499cecbd768bead5722057f0c909f2250cf2acc19bad1952f08547af107f5459a194822d4a90b6cc0029055470607008b01553fcde9b44149a8e3a73ac00fa5a3b89134014e32c35e1a46f7e578a7c2c588a319d398382f602054f38bc709072c3d367003f9014b5010542568ee0f2d2ca112fa0f19b19194315463f473724f919ea19d8ae497ec65b6fa30204215d41f2d665116f2d75ba02e5c72e7aebba42c58f3de5ad9d6d9bacf0f58ebdd6553b640fca4f90c67333e90529c8a0797b7611dedfc673d36341f3ee6aafbcdced5a0be19194a6e0f670d8e099107c830078db610f9b947d04e9951dc149cebc1b49061a7d967111d2a29d209216a36fb083f71d72032579eb1f2c6951e2c7b9f401985cbd4738416925e8a5b74292d46225cb4b6f85ab85b20048567cca793427bd9e9437889de835b0bb3661fc04717ce6e998c9de09f4a3b802835f7e823bcf496e6eb2ceaa859f731bd24f5083e7384e7a0270411e7da83e9b1883a3086b7ae9e998495af2d33914cc043f4104fcf474ccc078a8f1bd42167a6d3d2d4b969fa0cd679e0928ef10b7e63ce8cd747933e705718338bc3d7f6bae037163253f41033cc7693ec1d9d1e95d97cf35d6b4c7a1750c66ae81a38f769486a588c14f90009f8155e6d010843eaa03471f5fd8655d9662ca4fb0009f819dccf911a47e56c1f80902e039e9ad90b578a73441f319de4cef97f3a078f47143eb13ec6e28b5b002cac151a565cb4f90f519a881a30534d087eafb06eaa8052f85ccfd2f289194927c8633e585207e82e14b6f85cc259682c84ff07b892d853d75bfa0449a22f617df5c9748515cffe0550f84f31b02998f0a479b4779d722762e93b351362080f01287a30fd5639fe1383c77935ef0d24b013b0daf711e3dbb098af017f452b8a10ccea3db6380e633ac1ecab9eb61efc0f92660e7c0f91c9e586250b68892dfddb44ba4242b2f91b018f113bce990019acb1645781b3fbdae459473d43be1b62009a416bc94621291b493a246218f8465e92798e3bb934851bc7e821fbcf452981b9a414db24703a2b1209ffed2d7c4f7216617cc300df0a6ebba5c3b1478a36929f046736d626d0678c339e79b731c5803e2c61c28df03b78e4e303ec1b994042848f593531e9b60687cf1aa1db2e73304c14249e6f56991bc0d225a1332c7e1a87aec5cf7dc8979b4e4d1b863b11853ac29e6147bdad1f2e29238a80d1b8f026de85c81478c375c446346b1a3182cb684029d9317dc41e6e040cd97ab45eb63b55e8af0e2c48b142f53bc24e96879519239f2b9bbfae9ad1e05ae1ed7a6a6a332f248e56533fcd16203c55c73fe0cd1bc0ba2a7855c665353513657d03c3b613e9a3e4a41f389a4458d869f6e83fc741cf167467dd84c14d8403a5e720fd11f5d6c8ca39e29682ea4458dca167dd864e7d10d94f35cd609c9951cc244b9e833922bed0a2800f05acef3681498f318942a787a097b89d465cb5ff1fa0f5e227591f29cd669e06c0a9bba145104d1b4ce659d06cea7a32b623bb449d64dd488af8e99acb92c0a421fb502ca37405f86d94def84ce35ce51e31606a13f9d73ebf54c07e14a96e102d3fd65389d66538b5665258f3e6cc2116716678fa45fb12c5bd4326e03c7efb7e975285be6e8e94cf753bb94d0b491dea12678eb5369168591517e7d7a5a389f269a89e425c99c4eca8c9b4b8f85e94e7a678e38484b5497d50ba2c29135def0e969e1db67e6bd834275a89a02c709e4538836f1b4931b37a68b3635925e59b7363d28cff7a1c2cc7edf2f160a3d2a6c003fca2d131bb7804af5d35b6cd15a950d68a4c84cd37a32db87b72ee50863f3f0d6fb8824c13a0ec71f8fa7d69a57c3006a3a923a2e3d821e71c32ecd91d4a185fdd2e9925d0852c1ce688777ce39a7ca6f03e970c9b8f2a0181cc37b7de2b468e7b401279a5e596fcda7b7de320686d2f374cb7a27e91eb3e9ad6b7367be756d86b66d87dd3d7dc020dd42d5622e7030c08035d1c2d0a2b52fc0d0a2d5c01c39509895434bbece594785e3073e47f3cf557ee3c60be78652bede8937faa5853e3e8e428b3a54e47b820a3e2dda51e543fccce96d816a5909bda3eda0dcde70b4c05f9f5c4d2da0455b82064e47813e7eb468bd877c9518294f01f58e9d28b7fea3772447bd9e6906956ac187ea512ffc0cc7394e478152f3f1f3c17a1cba4079a63c62593bc1348f8d4fb7311bf035f6ab815ab41bfc04259252166f2d90ccb17e25bf28400515578a145d314274a548100541ca6597edb89c2ca1c6a57fde0898e1d2bb1a0464976e933397dfdc9185aaf98df91167ee58491c7646e8a1386d0d88e92a4bbab2b2f581972cadcfa2deb961c01c737c367f1cef4b691e969559e6371bb54ddbfcef78b9ab6930f40ee79b11a9a3bab5ae0f2ffcca34c47963b264075b953c30d0150c94a731ced7fbfbfa0556c03b08a88786fdea320fe319b628c5021c8a88690103072db67001c5481364c8c08829a264b1c1c9ac4c492c0bc5124058e9258ba6af8edd71b22c82b8588a135e9d91c5ebeb972f6fad95ec3858108de0d3996441c4054b5d50b9610cfa848932342c8ce044d1b26035ab0373c60757181c7c180a134410511813bcc244e941284cd21108588185b102041038620af365070854390ab3050f548ec28c910304a8307d354b61352bca8f1850641a2f917ed26071430f4d727d897403098c18d1e58627696e90f2c31d01ca4285e3acfc7047b63280b250e1b828595c2e233680968881c2868d0fc9880d20d7123150d8b00145cc754ea65259a5d539314c9a74680919c215910255a69794e9ced6789d3dafabf1e6161d949ca0256488a6248a2459e4eebcc65acf7377eebc1a8bf20e47cf6f4620ed27b40ca3e75c8327c8cf35ed1c38c2f039e49c07f57cc2c42c91f97bcdfcbdb79f832a79ec180338bf01e3faf5eb9cedbae92fd3df8ec9ce42f2d0eb5507c943c306d3abebb5c7f8f0372cf3d7c72ac46da1d650c8e4c23485a92564c846054a4b0317326446085ad587cc2f925a4f524ebd86d6061b803588aeae6b0056a126e13a05ebab48f63ce5637dd5787b69bf28cf34fcfb824638662eb0163f4ed88b0bc7d48c70acae26e1067dcd8bf2b417b9ba391c5bcc5fe75ef5f51de34290abd39ee1f811c9f56738ba9099b40488574bc8900d8a0fad27d387cc145cd17a9272ffa8e4b1632160c1b9b763134657d72f1ef353afc92e6174c6955e082687b94e5dbde3f9756aa4773abfde31a963fbeb0d46eab87fc3f1eb2ffee6e6e2efd85ab080f29b145232749e72947b9ed2209c4abdea6eead407369816af7b6037b578bd03fbcced588bb7c77419b09d5abcd733a516efd2bd1e02963aa4c2827389b1c1b9c46c6564e1b632b2282063b744327669e7c4d22b9808902035408310960e175abcb5928ab7d60f80c3ddd039af013318c4aa5a5ce13a0e715ab4dfa7815fd6b44e2a2053df52b9e67a0d28e50afc361c9c3983d8e7401c15c7398fc6a07dae3b2e03f33b9f5e0fc63d1e8a0b551d289f66dbd488641a9e401dd72fa13bb9a32345b9430089a50e96ccb1ae52b1b20b6bae098ec894295b1954a8e08cd475b5495bd21fab4d8b99579f4b9e04a84fd8e80e4a1ded46fc0cfd33f45b2d896cadcd42ae660244965afc2f43418380b250e1a86099b2f9b724872046bea68750648ae937edf480861afc1cbda0a14dca921d9c704438224b2ce162441811652b632b830922b62a990a9d9146738a06e40fa9c3c65b0f2275c8ef495e328738e21979b528640119968c028f164340ca4b4b34bcd1ac07c92fa985eb47ac85ebabedb14e85c821189169add685fe9ac81ab6529cf81a560a2583415ab4aedc2f5d79cb001089c37a0d7fc81ceb1c9c208ffe35ab2e843e43e41fd631ce4ed65a4b438bd67f380d3fc21fd4696302280b150e0cb7440c1436c2d8b8a19ebd06fbdc504f79f69b94d7f80cf73e2a2160e11a8950074dc941720688025d59af01adb5b65abfd5390faad6bab5d67a2a64512c99456dcedfe7f54bf6f10305f6a02b6b9d26e5ead662c0ba0fa9a3bf71fe7c9664787f41ef258ebd55b060fbe284c8921e63230c14ce35440c60c6bc9a7208ba612c81a523de709c4f6593f9d8f5681fcdc3d2116f388e6c1a6dbae9e9e441f274109d403c6da78e01c993e94aeae09eba0fa9a37ef3279341bd83b2b0837c64ce03e48a3a8bae288bf53d2da8d32b8aa3e4116f3fe69f8eb73272ff985fdab6211199f66811ca8f1e48799447d80c182eef4aac0d883c666fcf9e045269d2a449d3aa2d64978b490d6d5a3b22fbc8829247dcdd587032862f498a94c6a83f5e8620f535ef3a07727da401871ba8f116a494524a432099b7822c3d0c643e760e879e0aa31602b93ee2e93ed7418c7f8621902c6442bf7012a79b2a2ddc5c7aee398f6ea9bc0b8b741de6b6ceafd7aef39f1a5a5df893726f0b81648e352628cfc0142acca173da85120cdbb9e7cdeadd9c5e89d0ac67f7a4938657c88bb195d01b88b73072b0bc9e59adb5f3a66a5eb34c63d54bfdc3517553de58a73818cf6ffab8f1d3592de668517a074359ceb00653a6dead754dd7a0647052aee44803f5ea3fd64720c058c38fd22509928451c88fb2a6907f86e38f9febd47f6ca5610e5feb877aed1bfe50ff09c71f6f4306d4fc0ca524806cd51426fee9429e4caf610ea96d812438e2f086d9e29c7399b3b9901a5a5bbb0c41ea03c97cd47c03f4997460f3bb85456a70b58a081992a64a165d80310619695a9bffd4d0dac29fceb9300492b9740b32d9864cd7d150d0cb08111b5a45649ad6ab466b0b73d8fc670b2f38fe781b6e60e4f0b57e36e79c8639e0d60fa62be943648c888c1f2e63ba94f1a4f5f3a47d0ba9cb1b1287d21e8e887ecc4743eea4fd907d74169625260fec4157ed1d8893701044a6432d8a7d5d903af0b7bf30a50ecebb8af1dc4490a7cdb6853917b528851aa1c92315a2453b45429489cc69bf61ca54c85f680474deee0215ea9d9132f9f6a644dfde4e2813a9c33bf0463b42f57dde8114a8574d5f1f6c91c7a654322dea1d3a4a399dfab0348221db4969b13da66971a38ad3b7d6a12cd6b7731ca5aea72727a7a69cf4a8348d1656410b99220800000100c314000028100c08c5429148200fe464df0314000b85903a72549bcb836910a3200a32c0184208008000000800801087aaa60800c804c07847778a62af42045c3eefb1395633e29e034b5cdf2546325fbc9c514f576782761573019d19b546730653acc2cc978365d94273680b7ab0d6ba402a841a45626b2a7826cc0148433ad8c14b87bdb74671d85c2fc8e1cd5df4eff07fc2f3af20fe69ede617637829b6f1ac2acea81d7b731e23d615868225d8d30e4a2fd73a9ee00fdb3bb0379f2c623787d6ff0e60bde4e2429651c41054f1b8e5eb177d93487f1a85c27fffeb02c5ee47001de08d4d4e3da1a43b78d0cd36823dfcfd63ab1559e12971e51e16ad1d9aac40d1b8a1d5c36535fd152cdc1dd743a6d1e713dd022c657f81aa1b1ddbb6ffcae518ad2be036bceaf2921aa2705002f800c7774a43b0ce527d08b6496bed3e58b2761805597beb0c54416617d55f1b56af38d66223fbd0a748bfc1abad4d37eb1cb6c53d2572046012dbc8ad1bb71d254c3a3cb7c2e3dafb5f5a980f5c0bcf895fafada1b01c51473e5f878fa12557bf4d03819c452e6f12e2930139c8d49e428e443fa2428e924dc486bc24fa881878a5eb7e4cac4db4c33e138c559a01664d15c9de976c24c17b5706157cccb889fe8b74a68fdc3dc5d1e105186a265886585229a734336ddc1636a4af7ccaaca6ddc215b168432cb21f5cc0beff97ed10668377117741ea4e0f3bd6094655b7986652629084ecb289add5684280d798e06fe7c76f2dd87b0b80c6d881dede7223cf0df9aabd8beb883623568337f4eabd45978e1e8874268ec27d758f2532d17ba33b412f940e2c3aa0f4ddacc85d4d89299fdb772c99897e86f4d6737bd32d3df748eec647ee3edc273419315e634e5a6c633eb08a285b4d240cd05aab26cd03c1faa733e8e2ddf046250cc643a48e2f4b14500262a0095c55191d8b7e95851ca50daefed250b591c12e1f27cea70f3844a68eaa475d344ce97aef58357f5a422136c8d1fe0da71686bef4fecd995dd063a9faef2bda19214a5b53976c43765fec464fd51921955d1cb6be50b676617246b8478ca199345ed4fe1a90006ac71abdd7e67b3b1780ddfa7087d73d18fc125f72379742ea53aa3087501ed05505f77d03e141d17fdca58a194ae6d0c3040397839e50c2346a68db07d05c2dfa9d7f84c1cf3973f67a0f7a382238e01e438756988ad898382dec85da89415f9d93bad46179f09ec8ef6e037a8ac7145f753d6528ebfe58bb482feed01572e5f6413e4f7eb147d9e7570bc205523acbbe61a3cb0387a5b206768dc06055259084c297f7d579bb1dc111afb5defbbf1d15ee906a5e81033acca506cb4a6e9468ed0563273e2d88d221c33e56bdb1c7160e48a876ce33926373eaf2aa82588be50b23e6366c5704446ae843ca862cdfec095680aab539b47e3f445bdf47b92032a3487f5b76d1e2202c3282bc794d2f216d7b16bf4593d654868899018f277eae3f8faba52e7c31aeaae28fdd02f09d4032d3c3b7b30e9411460b3cab5d78d182d63484b6cb23b69315305a9d9a496b9899c4defdcca32ab49c06efa833c6e110e30e0e8acc1ba2ea4561595cef8a4bb8bc6a5520ef01a4ff440c6bfd79a6d175045316452ce210924922315e8d66b83a70966a8f2962788b7730a48439c0c57b50a3163d96adcaf00e8c58928bf5e783eee9f7b9533683224120d8c6fbce093b5cf4e17bd49cd8ec0dc92480420e5ea6fa84c455798b19cccaf848dce911cba782654134648acd0024ba76416ea60957934c9b2586926a42e08bcc6a3915093a968ed2eaf9561160d5b5a798c41377d03a62ebd9ea92c56e65eaa1e918bb67ad93c4d8c0b7e91209736a37da56e81c540a097037024cb036586efa74a4262ca2d657bba891bea062f9026b07ffcb72aaee241b57c1d563027cdfcda26064625d9adcb55825ca7cd8ab0de4595c62f72e236d5595f588094b439dd8b73177fafc8b8518787ffe52df8a56d030a1819e651fcdea99b504db92a225d1202c6c09f9a13c11231a443ff9b99efa069efd92979f4f702dc291b11f316fdc25965832d7605c31193a2947ff72dc8dd500b70802f66daea38bda1eb816f1d2eb0a28fc2411f77a7d5445cd181120e65663e9ec3d12b9b088f9a365f215c0ced12e609c478f0f8bd0fa58d2f5dfecff35d7e121921b90809b93198aa87ba951c80be1f90036629d5b15c67cebf3d496f120e9df73c60bb3b831906e7825194d91319d9ba2b65720eec3e7e3292168157621f2796903e8cb0cd5ad2b5f85f5a1fdcaa42772ee681b7c3a0209ed17218475fa3928b0401e2bad58841677bc944569126e3f1d148abec182d675042ec67a6f1be04dc4716bf184b398c903621717c280132166226e5f549901c16d963e80b4d295543bcb52fbd3e57f548ddfa59c460ddc5a1efce7908f3af2647087f57258507ea2661a66c937bb28509516795888da0695c34e116d433e305ec12cf9d6912e881c2f8a76b1e2e4ecf4742f3118656312552ce3da13a8f37b4e846503f51520ce9d76b10f2419ee8d88b5e4715bad2ddaf1ad1ae58436353cf49b1a719577186b4bd0c48403564039398b9bd6054b8bf13732349794951afcc2adc2265cc215a8e7c17a2516c9a325940469611fc5ea0aed01c03d8d035ddf7fde924dd6b32b8866256f35fca8886f5a4153c445366f61c0bb452a2ff470b0c4f1ed6dd9bd229998be2910743241261156fbb9feda06160c6201a02782ca826232e4f799922bec0f2794a16588fa930952dc4b3cde1ac6a174df06ff9eaf4e46c7caa56040a429ce1a79f15828970cf01a5c806fd636ead0e9df1953890bde4c8fa4639c05db3e0fc9bc0078c67e52683aba9d5528ec84864fbf4e42879d1ac22c28f0977d2c5cc565455db7c7a7fb5160ce50a67a58ad1e6ef4eae88de23df15a9043b9b5297179c238abd060b40798bca8731db0557b35b51c8304a9d7fb63017622a05e2b0ef967f29d1dda46d5b740d2b9f72b4b4f3ec7829eef860d9217b54045dce60b23d4bc8921e5f33caf44bbbe4c05b55fd24d3c00a7f2fff1bfc02e6c2ccd077a2cd8fffbdf1d54245da179e3a1269fee5b49c77123fea85bba483f55a507b8d50f512c4566c2787a59514b02af6c508fcb0082fed5dd2a26b356ba7ef692c9dd18b6e59500b7524c2cb0722b25d082593da662e301b0d6c39769bfaea7f3ab1244e95c9fce51f95c75b11e383cc210e55194832dc2c4b5bc9a977ff0e205beccea0a7bb4ebd82d1bc3a9fd819da5cd48f959ce2c7298ca44bfa02023e4de912c2ba61389de414c837c8ce7bd587017ae64da958b875084bb77c306b8a0c8520dfddce7e072cc0eed5e62364336c02a841efe26f0bfbc79ca321c8eb8ac8935678c599cc85c898673ca03fa93d052917a94364561bd32d3cefd43de8c5656b538d2e151e9bf018f170ebf7f2a8b5a31a79bf049a3fbc9b00e45dce6d81b8d9b4f45e4053b6c741a8a3e1bb364ec15b7718d488fc3c59449992aaf97a1e24d108166cc200a653607ba74325e1b8f0ec9cb25a87c15b4188aa8fd4673e0d68c56067ed2ea874065176af3ed165484b2fc8b0d2f78c80d7aba42ef9d66e3619d3da9d10bb6562604d5adc509b5dad6be2c0205cc915c8f099118c4d0b0bdec8dfda7d266da81ae89f8a6eb30c3e515b8bd846d985c463fad024185eef147a81aaa23b4b761955b027711d49655df8854ec2ccb62206a45f8763634ff0374b5e02737791f02bb47edfb037296d897de719e91d50b92b27ec7d44debbb2776cef3d762408c1466ccdd991d906cb0586f0947fab9987aba1ed5b7beb899f20401f53a79c084d4abeacd3777a60c137220248aeec16e8db96666627e3c4f1b8a5edaaac1535925a8b17ab9595336c800c368f078dd7c497526858b2f330c953a18d1f199550d5b13b709f66255c42c90748c4d884dd8934a82d7c832674990e2c530523a1d9b70f7dad0da3190be9e8486735baab7af0c6a39cbf1f98f67fecfd9fcd81dc4d9d396b7d5862fb0effae3052bb49f27c3c06e46b2bb92977d4be43a32d513c89ef0644447d1697a3ead73d57eaba307b29d884289744de4937cb65864650997a207f7ac5d11c3553e3ca3005e683cb74e79be7b787c31d6bc2bc6fe1025d57cb72623819ae8eca69232971d645c381841b72de279ee4e7bb7f543841c264b85501bc492424bf1ab2184b7d2f4fe1d48450bac1e91512e1e6e117069f66298d3debb42b8999a261bc135446fa74d27219a5fbe8f45696577c87f6f7096c059546712b1fe7156b03d4428cb242d2b56290caccd8927aa18ab3f7db81bd0a6efc765266b76b4090cb6420f68aab7c5db9a54d8c326602dc6a0c27aa7689e159a148f494829b82bd2ae450757536e95c89b6b4da68e897fa20d4e737aa559493b19ad5675a451d27c785f034d5f3151cba0305840c72ea9cf0c6c3369a9abc998f035696f40605549c942c8c26df2591d8eeaf429fffe619f4f9afb78a10e57cf8e12b4298b459565b6f2ab3f7d5c13cb07ca53ebecf431881471fd49b0a6e0371c7266f4bd1529b546855c5406713d2373ae3a294c82ec1034012c956c95889f36afe71b77ff65bb7c0b05071e5f398d55c13537015f0b2f2f4d3c72bdb337addd708a41eaed5b626d09b49ce479e5be7676bd72ecbaf154a11d448ce1571091657c91cf73dd66c58160b61510851c17d90a9ccd9ffc435888c1f364dba51b11f65404ec8bbcdc945cf7b3d3ca1e758a130681879002bd0332d1149fd31bc9d1f2611754cc59d788b2b4bb40215abd0ca033e579292ea907f6b0f30dcc8540fd0ac55475698fe9fc28286208ab0d0fa1bbf09493889ee0ab19d4f7902815334182359be35cce0ba28918a8dba75202a470349f3cf4a8d00b9b765ec78bbca9679179bc57008ad28b77119b8ae8f0889d582318fa6ac6df0924af10399ca8f6c8047a88b651e3892d22d76e0166603796fd69522a3cb88c59ce36312830d16a88e35a43aae866d58d4c78b4c6f116de4fde286a8d9f2d8eef7d70cf9b28633e3760f046d331d15cb4aaaa766d4ee566fd6e0b1c15b29a870f6c335b3de247e267cd5020fb3c365dab1309af01107d8d4d69ef6824ef12d4b3bc5aac83bef9c636a27113e5bd09531089f5e514c09cbe9d80f8544dcf7bb2fa0f4f65548c2a827812dd36c1f49f2a85ba0337b1e278c26358b274335a3f9e632a2f75accb2bff78f45d8f3c142d34746abde7fb592668e568db0224aa35522c4fe6291670f0e0c7ec1b4e829bda17edc6cca97df589ff45b0aea3e9a6f70bd088d6c0959741423f87f3ec210c7fb93f79e393337d8e59f68ac40b652ef684322aeaea11affcc733676310be2860d8aa0183562eb00b198ec628ecca18edc841e533fa1a31b7a98dae68d094a3396b319997e289ef389d09c251f23296332eb3750fbe3c0bc9ca3b30c10aac1af8a89140feb4560004e758844d71fc26693e5020a5d35da4648213283be0862223c3bacca945e27a0dbb90939ce7d91d5e2ce1e6d2097a28c9a3237d32580e3183187961661ff6771d74aecd538be3c0891d26f0bbd9693dabdb1ce18135f2d7db42833d7a390166c48968397abf9c058ce251b279ee9ffc4c7709ccb077c0d21d4c915ad87c9143300c3c36b277eac6c2929d903beb9d1ca6251aeee830fed76d63844d7b73805b8846ddc7be2d377dd8883064528f0d05219905a70b370113a01227cc8fd4463360be2c62f5093bd1f7881d51fa7b71c69fb1bb1f6ebf00504dd41594d168ee702d81b9c6441d31f97d587ed7abc3b70c382eda4e9d3f64e86010196b8613090d3ea64e7036fb9ab876d5390daada4c74c0dc4fe89e2ec0735d3cedc3754d7b922a6d40410e51a47022c6477f036564555ba430978216ea1681fcc3ea06efa7d32ce98ab73f4823771e2c9f022cc84143aa1bc3913f9b1867c4fd3a27c6eb1d9290cfd457907655d44addcd3ad2726dd351e98a0c2bc831745e3ddff79b9d228ad638ce92273290bdaf47eb54b2d457c6df2226981c5b41cddb291e14d48058de736720fa7151ea79a6bbdb90f3779159bbd577b011680c7a1fe3db4fb5bbcb2ca2b7008ea0d1c22970fd6bae591564070006488eb5cd0bdd12f3a477125293a1fc7515329b1c1be54f53999e874f522b4633c6276e5d27e02bcad0b75c2f4bca4529a44b8ad2231b608b280bb7d9d1771d1baffedc9dcd906edaa43dbf43bac2652cc1c78586e520da1574b3161e043e755680380a511748d8d6c7078d2cc0bb699d6b2ed7e2e4d6a2508536462894188f06f570c60f182a92882b643350c22b85eae96ec9cf1300cf7acb00e1aa2e29a3872975be0ad3f104a126e5d37e640e53bfe7aaae15e74393cbd9984c99b293e9ea4636423e811dcbc585e6a6be97db4f9e187887568ebe04ba8e47375044fe5fac39b7446dbb1b0b196530896fc00c0b012fdbe40d13e5f2172b2dc3af6cfbdd62acd0b13174e13cc126ca5b44c341cc43d9ffda0d0cafd4b8a54ca125724f653e4864d51a797b63037f48c261745311bf8d27c410b60228c13afb6c184965469f25ce033550bbb03ce70d5cf28a2f219f7a30ad2cd72ac3ee52dc9b56a0fb3e5d2bcd8120c1260649621968891b1f1de6a626e14d7bb2f8389faa8a9e97838cc2a67c23bdeb028f6862f1fde349915ac1e69d419e5740f5971f559a4be3a2da91338831fa8dda71568e160f06021dd75dcc772b6802c70aaa5588087ff01d5795baedace066395bf32e13dc7477559200d799c4c717f28a21b82945a1a4c4a077e89a149b94d891d2a377a66d6eeb3aa92dc1ecb576ed1241a96814a46da8ccafbcb081b5736d4e90a666c3368ba6792bef17b6e02e5840dafbbaef7df9df9d84fd950d4f0ab930e0d735d93dbc923f4f19341e447b2ce22fb27ceaeccc67dd6faba4550c78b61925cd7d2fd789e7e41fe6bdc7e451032a442f547a4e64ff4dcea090dfbe5eb2ed04f5427df0d8808ae5bb2e9fa79626f4e2c2a6ec2485e54f251424747308560e11a24343e02eff07ec4961221f799614b8713908596d8a400bf91e5d741db91bf1890c3856a7bba7876e1f6d3501850eaf899c0eb76b50fa51b65876989b8634215a663cc54439d5d27a4999d4fe8270a00a2b30046aec809dddd8368885324c129f3a3ecb8cec18db0f046de988643a34a533b52b5dd140b9df3897c8c0aea401f30ff0892df608b26c5e7eb3b17913026dbfe757a3e7fd88bef645700ce3947c6868e369e8e60eeaf4e746c6e3f409cd6fbb0beb404188aaa6f4c5eae5e8ff89312f6a7d8063c3e008fc34cd74f97e52431d42857dc5f7bf86e214f78389e2464658786b5889d33c91ab278d2add0122ec450ce51ec529e307fb46aa7f96e98f925119ef3bc7d836346338d18bf4859e9d67f907748675be65321a46f3312877a34ffeb3ae7500429de8bc423ea758a55279402155d106a446566f0d684d50b77cc97b4034ecfd11a059e4e91e5cd40a7a78276330ead47a3a32c7886b4e3ab94d2978ca64adde5453ebd46df2f766582a6ae39377da521439479d4e70f03bb70b101a21f8eaa988843762525236d4212d1d31785f3b7f16911f897a0b0d6c4acb63fe03feffdfbe821c0d908bdb83813558b9db6253abec82205adcfe71e401e0897f30f3fd192e534f26736359ab24a959baaee44c446eca96a1729e4b900624533c710c1a95314fb106f15729dd62b74b7345dc242ac46ad0114bff663fc011cc2c16dd093413758ad1246c435c796d434123d5798baff894a6c60626b60750c505840776e32000f44d18748ec3b38dc2a4ef87e1ee4f130e2768b38d45eee75eee9d7faa68889bf22295914c9b43eb80ca335ef4a09e841cb00b2ac34573b342d4722eaf837091d6b4220e1263290f006c2500534ca478a29504aecda8bc7e1090fd63d81a9815af311f338f49bffae5f206385e2bd2ab9d6ccea77fb1b1263ecb428dda194dd756b5fb13ce1ae19532d41669cca28711eb44c86718bfae91a382a1e8ca4e1e502e8686533c04aa4734cc189df5c12594c96eee18d21706858c350a3129a873f7c936755e8ab373a35d90b2ef271673359fba688050318a9644a66737e2b66603097e4005e783656d71eab1b5c79c7dd21453cecaf9e417534333e3c4953dec02c44da472495a0086e29a017e0c5fbdfaee1948d5e4ead29c78c52eaf14fafdf09ec09c7a53a6a8773cae0be90d2b75c3be34dc3c36b6df59dc148c0163f3480746fa027a32c953d04996d1c8beaa2fed6c835c9a56675d1f2a24e731d8cdfc809f20744cc0c56fb7e0139769bd057ae106d0487954bbe51579cc42b303df1f07e42ca58a41714cac5d669e43457c7c387d3fc83975088198b395fd3b4965c42c7b0d20e2d5b231d03ac30961d6b9fa1d12e73b7078799f8412ca3021b4045e3a6b34c976b281e327155f67e5d76489d4243eba0150d3fc9af300926debb7d394b6b121adcbc2a2351465ad06b497059430d46f970d0475cf3c8d605c16094316cdb2c6f7f6a6141f4d5ae01ea3f476502bb9fa2bc04fef37625d89614c480a3732cb6643b984549bf623d33b5ba9fd50a77e8f86edbbc83316810b0ce86f4cd2170aeb9d611ec3d8c718a83c7a20b79dde15dadb7530ded64d4b5dcf38fce242582329f9d6b2d70e7f78add99abfe700b3c0741d6ccd0cb5a8a5e913724fc3a89ba16547d2b3ee0c48e36c1a5dda14e740b8955e03debb344bfccb25c1888524de63c6804b546c419fecb95ea41ae7324275ace92a99695afd356abf5c32d432ae104654a61ceae1cb409c5ec0c6e13a513ea6e67de8101046365b749c25d29e4fb1e193c224dc03ec48d9aad7d9687478395062766f1964e7f75243c98db05269174f145149f816113382d8bf337d028b2ed03b98449e48f1c28f3dd3669d9c17a8a27fcd18d28abdbd3a5057f054a8746ee9fa172a9467a1e7941aefa9f38790b2878f2b85c4ac240b06d9019761ce37d8782db30fc6a6ed3094223a3b96efd290ccd85702a4ecb8dfe069aeee384281f705c1a1710fe9060439b05df3c3f7673f38b24fbb9cccb87ad2e5dc84a75dc77f2bb03a4bb700ffa82a017d09b48e6e1373015469c09357e0894aa22d3a0eb5ecfb078acb222d004e8e1b3f46652b419bedf149815b8cd143402f70220a76046c1c3cdfc8b28ed911a6ce754c718c20fed989007d07389648f2e4f85aad282f0ec26cfd5afdd8478320cdea21884a44e618d514eded2d18e5f51b7c7cbbbeac558751ea844d937d7f1c7664dd10408aa2b23bf87dc57f8f4cb64f04bb2108e6899ef2f7b2e449f3e429669dbd69c5ff705ec8d616781a512a602469f1880c6ac596237d602ce35fdc4d9021269a97fb8074c890fd117dbc587d5ac360906cc07f799d3f17abdd6496cc8a9ebaf5b8c2231097ceef6409e63f2a25cbe306f79b00ea9bab38bfaa9bae97b2a14f6a50fb2156c9331c6dfd2950524d1c0108dcf44aba1002ea6a1ea530eab216c731131b482f52ea75415fe8eabf4f11ada7036dd8081523a17b6010b5ea8ef0795bddeac1e7f42d710371f00d881eecc0d7e8e0900f02927764ca33070ebd12a841d6d3495b380a2fbc346423cc4b11a2fa1021bf567c3a8e3e9ac87f02cc16098bea6ede1074c527dadc29a80ed57ce3eb684659039462ceef603a9ec1dfcbc26832f5e3a27c3b7b8e02b297e8881d9a528a02d01fed9b3c1f8792a5f0570c8e261a5a29713bda9bc0fa4c9b5af332d0bc0988a883f9f1dd4b1e0238b7aa34aaee15f23a90849e7be6af8919888128abd00afa80e839852b88bfa0298f878e0a62a39af6140ea1cda4d37c8baabaf07498239a04deeeb59b8b7f8e43fac96c7e3e11ac7d6fb613d26643189e8c068cba9ac075ffbfd3ffefa4c8f26eb34bc914384b07aba06eb957a21a02402ec0b4ca122d3d00de6c16bd64b04d98ada1ca2c71bf3fda34c0cb603558337619a531f4e786224777da08fe0e54e083ea0f6a48c019fcce2edc4732b16aa203c2dc77eb7ff6b7047b524dd9bdb88b01fab841b4c3cad0ce22e7c8870d31bce93967f09583e635de14fbb8a10fe95aa6101dbc5c4c3b1a7a2722cee3b0e94bdf39ee8dd9608e6e22e92c6e2262907f72f0a5a2b7af8908ea9aa924e41d13cbba7cf1ed1841aec16051a2faed66cf96713f9b05e502dcc5722485ac11dbc3889a08112c5f6b8e72dd57905ecf8891d98ff4fa615b4fca0fe93f56a21e7831d0a3eb363d5ea20b2120942b434bf4c3586b3924d375442c59411d8f91790a16ba8f2bf8322b8631628b3cb201b08dc02eb2f54fc6721cb2beb47ff5f62d01ad019177dcf94bde373d58991cad74b0b37db45e97f03765eb7f06e8641305519801e46dd422aff8c65dd78ce8dc2ae80552e658876613ae24e1e082943fc6ec1f53ebf60bf8acde3e5f9ccba39f2e443c190286bb4b526e5fc38c69be2abd470f15e3505e9f9446dab80712ef019abbfdc16a3d5b818225313471c0b45314fd9706126bc85c3bae0b9f7aecfc80c7ab898fb4456797e9a748e94dd08ceff58f18441e8bd41df47a7022239ffacad6a79325f9421d08f4c81c621fdee3bd9185c78f1768aae42f9d6e74c5d4b33fe454a754ccbd5feae7efb687004e569d79af6cc538eda04341dcdc4c140e22ac17b5270cd37b712b6195f3c0c6c299984e78aaf3be5d8dbd785e18b0b58de4ec46038d545227615983a5ba217ab7a0d400b1624d9fa254b7d8e092f06646c9ea557de72b8dcecda8267603759dc58a7ee097566048cfa4580f790b0e9c2a8de1fc05b48ffaa20600a10388a77d44b4829569202fbe10e6e54dc0d4c39642b6b0f3253ef7dc764c896d897a0ac5ce077d7f2aecb22416ec44e3fcae0cf99f77ecf9e3aa85eb7a50a1bc5a279c40a45cd0732a99fa967fc870cde5cd9865a89362bd5af786349e737b70fe5c54f52bfdf90f829a78072007880b2df682906e611ddbab939104299c0bb78c182642f8909a93e58d3d56002a9242259e0a06a674af7854203f2ff8c55b8f3c911a140630ba6832e7ced3799fa6e2e4f7cb6b2efc26327e028aeb52865b8328bf2745145bd868b7b5fe7bb1c03bda037be8b13faaa9c9da5db6fcf055e7f0fd59ddf66006a1e2b33a815bfc0d1ee7df62545f359ae0a07e001ac56b59a019674b2e0edaf2567a35abb0b40c612f65c21af620c1a8783a09cda88c01c908f688c893cc0e90f70bafdb3a80c7dbfcc574e0a0eefa05637be9d9cfc8856527a829b0207d17ad486c881e0c8074e8e807734523d403e0c4e7dc0a0bb3eb84aaf01df34d2c00069a8d3646224a7f4bce96804ca74d02069812c538bc4772b01b63d1895fb7e7a0771ca22e6efa73d2516251da333310f095608b9b9c9a0f8d8b808268e3d710218289a1293df318ba543521561fb57ccd98eef73e7565c362319d07b57a5c67df699719a4ab70e51235c18d59dcc014df08b1d75653369dc16b7102f4cb534fa828efaef19eec0df9f10389cbb233c06631ff5eb4e25547b21bc5d25e09aefc978e98a5af91dd5a748431d774b0a1d38423d271da3a9e1731f858cfbb6286c152241a667b723024f135d2a9436a035c5633b420f38175f6ecffe8ad869a56c14c78f89712fd35c5357f71bfbdac3104642b5a62f134e7fc8e9f047dd925b4d0e9a709172ca6cd3c344dccf0b5d17f7f882e2b5c81c570bf855cda92d1d97bfe2f103ee264332660fa57807a58f9ab6530c7b6b984bbc3a7daacce621642513e85f37dbcd421e6adf5ae764b9b64c2fdc47187192c68f16f615ca7edf987d117739dc7920de9d2b7f917034b37444f488161133bcb609a6b586cb32d41817cb502f42c96ef625ef6ba7045cb4c8d1c10f8cee86805e63056848534e04b01889d5e7614c1c1d87f9194044906db2bbbcc96d88cbcac930bb02a56de121a107b51eb67c86d66db7b59879ed79faf887449a34573f4bd38525acd4a355852e0e6328aeff41343a7bd285a9515cccf7d27636e3a0f0e755eee1bf5d4c8a716e9212a7d36bd7250d6255d7868f75ceb2510d8a36a14d2abf7abc0bcf2e33585cc2bff3784b890f78fea584dbd84d886ceb93d8a1cf6829147f22daa19d85d5a006e01753f484a99461619a567f1729f286b51e8d3d4205be768d22ca07375905853e5cb8c5a4b3532625f0bb4a1563df02ad233fe0f1e3e88a791ec4e0c07e1d621a9f052c963aa6dde02df6722649340088c26c83ebeb53c49473d0822443767526aa422afce8852fac6080dd90ed81b0290d3f1d8b8e141ac258c26dc469736855636f63e0f251fa4184678bb039ce0aaf5247a5aec47d93d17344b0d701a1168df0926e7551c847111ea00f37ec79d0ab674b5c01a2762198df803b0998561ff956a8114ddeac273b53c808c5774c632e26a1344608e71cd720d901db9334eb6e36e4c27773d9cd0a40de072cf3bd71afef9b1bff0d01737a8dab3ef9dc8cfc89956dd50e5eea663b7e266ff042b22ce2add235ea5628469ad7b50eb988cf020d80fddf977df93f1031f74994cdb4d88c3310197406d0fc1379e3b91421596465040bd500e275b5ef1f77b4bb105afc2c4684e0c6d6abf6227f48e8057c184bf7313933141581e95489902f6f0ea86c643d9ba018febc98694093300f851d8ff52817f69c805c1fe3535bd9ddbbfc400e3c217543950a5c3bc99838e114fd55ea9200b228bac4e9d20d87c15564f00d143d1e00a45954053da15242bfdef7ca2cd69ff60fea8896ff9a4616d6ae84d9408ab8733a87a5e3d642e6bc92e16ef57243a359e83c51d5adf6cf5f51636c9fa8ecac699b2ce78669db8ebe04f43f38bb53adfece5ef666251bd4795bd689716086815ef76c0d8d228343c097efdd4632555de08c69e98e2f91738776ef88d203adf3552b503fd4381385f9f7e7340bc8381da712fb952709199bf570b45069903c77dcb608526e8882724dd1a459affae4d999a1267be00a1f2042ddd899a028be5331860f9b39d001ff509e243d9e636346ad4189c4fd9351d06d4ba128c1c4e91df7f96fd71859cd07c8d378927d0d1040a31184a141722cf8e96d72cadbec660c178944a7106cc3a1b97c824c741f33d137503c1e55575d538db5032717969c7fdcf89d5faa692fe9016f1c7b7477185a06ec6ed03a660b36ec115825628b22f8621fe895c04e36d6f97fb523295d70a2eb1ec2a1c5f8ec2fe9dcad70094b63b890b05bcd173407f092dc8373f25c1420ccde3bc5084c70d5eaf2b2b1995745e4cfec75fa6b882fd09c31e5d36e2a57056efa4d475bc18f007891f83337fd5a9cf262daefb57e56d830562622265b29067fcc42e64867fc71501cfad996841e60f10244b41ee01622fbdbc5615050b9be2b08b4fd7e4f6c06227f720a8d02c410595ffe8cc4aed707f022ecf917284a8d3e871c50cef30328f69c5c526138b14298070215994634fef1cc2213713e90bcda24767b84172513f066652b9074f34a0499a6cd0365769c1a3ff5fa10b3380c970adead64306c51cbfc2d4c44c8c6f2776028b49f11718466c3861e40cfc49a1860067629f36d52fcf1cb222958c8c65269a947067662bf24082adf5d0f3fd9d34938be4e22e1ecb8453df2dfdd0f81c3c52ef28270c1b08feada6f9ec6ddc177b2f24b515021dd74df595bcc35a7aa154bf6e770161d2969a54bee6c3dca42d7cc444372da1542581e840c4c729259e51fb6e753fea441b6c4197cc6d4d57d3b491d68e8e4ad2a8f4d10f99b930a28695aa80c109982d1540289cca45f7267699ac0ccdf594598d370b185a117ac3afa9764d9525b550d12dc6f2143d41137b21f1ed0b31fc430d934ea2a938fdd60ee85c742645f24c6770e3448b59e7344b6a561afc7a76fc1a2efa8da16fd3601b9a6843fc83990156f6746e81836fda5fadef4c52eb54da10792a8e6048592d0b5f7cabe31963ef48b4f0c68b0c4b6a729de7030fc0596904f1b0e25419a225f407768e8253a989fd4306fd71001408f80beb6d3e7bc30755cf9ed10f0a515cb8dac5d4a0939ae50fd5e7fbf71e0fff878bc88e040a46f7c47439f9dc6e9e8430572da2d4efebdbcb59a7df4473e9c6015a84b742c519a8b5b9933a58135dab4d0feea5f0efa413d57737b3dba0de981dfdf23aa51e08db8aa24a7d68ad2caa1283134045f444ce97473271c76572c90aff2b4f10d006149818047cf2a900ef0ef34a6406e1bb9f5e438040a6c27e2ec197c2357c8cec32e231abb48b20407994403688940c4b8d6a0f8470ad695d24aa00c083992857a00d5889d73265894a0307bbc546ba01bf17feb60e2dcf4123a721da5d59f5a47e0d08d949d19d20c5ac7d694b6417916501c89fb0518b0c5ab0be8b3d8f60f15eaadb2a65511273255853cce06e7616db6dc48e79c06e63492d5243690d52ec79a66a0f1ac65d5ea2737b324c0a8a1c72a12768e406d54f8fb5419387a270c6627bab9f3f1cb00774e639333d696ebf6666699a574a283270d17d05d68c8e2eca900eb5e72a7d0e6dbb5a7b23d4c2e99ed7808131b5b04cfa281fc0d38cc5677e55fa3eac13ba2b325f887698d59029138dd3afcec9f950c6578e573973e04e6302a33c7a0a0d10544ea43d5f7eb5b5badbeaf63d4fc2d636e19aecc54ec6a12048226a878b66ff7e35c114c438c0423982df94ada9f80506e3aafa4f90eee5220030d15b746d0ab45b37ed63bda7c0e7241a84a46d79a6c5bbffac788e9119845b83364aabd5e2c1fbb8909f23ffa56001db509ffa3ca57da35c7ccb14d1ad21f89c1735a016407d60518c5b6bbce4e79dadd126ae0f883d80723f9e2e8ccd75990b80529c04ff568059b527b5c82cbb2c14851e7b252464cde9531eddd886ba096c8a904b516ea01f06f80e682234a1071722cffcff7dfafefaa73b2431b31e88271bb7cb93a596e48470ef32d4bfa7486d904fdd7babd89e1756b850ba6318c68f05ef45c6b92ceb47833f2f81950a19ff39c0f1042be5a442ba6fdb738580713b0058618b4685e081a32c8208eed57d50fd0bf271d721eb5a0bec1e753066be82714a0b93aecbb729d0df8ea368741ebec11781c067a6d48821822b370186b2e1e6c20e7b2c4b0e55e7d6e1211a3fd6fa81adfd3a7fd114cee79fd75c7aea2dd2e2aa87632840b2c75d13a4631a87d73c7fed14ebc9f4f604d22c1408ff7d27504fe68e4d0e8860daff1b9cfcecb29a425a63e004b454deceaf5f6e94b49fc775400f1ae021c6b582774c18d280c7cf6732e455798c1f719a3c42e6adf011716a38deb6ca293a57a1d4a51f9412851db92d054f22edb91dfd62e6b52be3a64f92521238d6393565a46cf0fac72f38a3cdc2b60a6ebb3eff89b1b5db544941b46cf64d68ff555c8653cb86ba6753b3e3e87bfcf62aa140be722bc452cec56fc8647d8b01edc7071ba5a04aeb598a2eb5067dc4c375cc81f553a11d586f9bed470db9916d6431708ef4f3f162549b0d8192f36159f20235cad552e822d6f27fb9ca14b1bab94dee7cf81be67aaf913eff0e512b7904afe179466adf109bd74bc0c105251b91557f050b13ed4185b69292a9131b03298da5dfeffdd8be5dda7f65f838d0b6fec298c8c445dfe6421afffc3ab88207974af4deac3c9805243cbe41a85cecba93f8ab6d2ee0a7cf30b091fc739fb7850d190a7289a0c297207f87b159a0561d55400fc6de42bc18db19b0673d45d1fde93d6ad557011883186c0c99f01439e51a213fea6958e784b5d7a89b74a64910c758a38425b9b9e6891c32665313b825909ce7c5cc3498b061edb562b8da00b0d94e3112051023c63848087e41cb9e9d5ef30e6dc1c772c730e92c36a00fb5a76f3184113b3aa680459b4e4ecb6575644e27144f46c93e9c2bb359428dd05fac819963db353defac9ba605f6506ebdadf953895a60f23cf55c2ada02c20c16f4887385383602b23aa16a6b75940d19b404bbd5a2058905cc34b70dadc14519a119bbcabd533f47de6f4756944966a96aac379460aa55231692cbbbba35606d037561a4769f19962d01dd2de5ff4b17dfbc4a04cb20ec7e3ebcb0d8326e0d77e9bfb3ec0b17dec52dc2de60b47c1ec360e0162ddfc82018b50962a7a7efb97cc038347646b2ef453c6af4a9d3b7c9e0df8a5d9018dafeafae65d8b6022d0400ea512bb80f3a3dff9dbddd909c792d289fffd196ffcc3fdc3ed4597e182b1cacc9eeb6de434545066cbdb5fcfdf0b28205170da8032a104199b5451e6a65ea15c6898e681531dd096741dc3546f6fcac4cce11c429574065544d085c2bbc02807993f386b6060ee0b56caafba312fed026f524ceadfc55490d8f41160fb4ed3d702359b320c0ca62944a833e344a8d24079ade725b853b3ac979023504cda981810cfcd6b230540da59783ee0cd4cdd773c16b1aa68f52bccf825fc6bf701c73b73522efe067ae4762dfbaf4b6823c6cd7d522a9b84b597283cfe5ba748c42c1cf9227d8a28d37be1843c54e91e2a7fc5cbce2f689a1b79a4d88898f8afd619ee6883752eee43233b12570db76eb9fb8791bee3ff20c7b5e77fde9c64bd8e8c3146850cf0bb81d74f72ac26303a866811da35388113158a891cc2ed6746a5581aa163ba9c736031e37b54bfb6ff00b424e50102554109567aa16b814cb4ee905800c820287c1512bb241da79cb4f5eb276579a83746181a071f6215b3bcdc90cd057e17fb06e43e19d92ed01df4101d43306b60b4aabaf073e4d10a7844c0d47ccaa06b30fd437488921521de8d354da6d2af9ff5873e4ab190cdc9445e4d629b5bd56d866a7d292256d51804be07f35c336a2a53910aeb12ee3ca68221e00d3909a87a0cf76a55d4140d9c5701eaeb7d05c2475610268207ad0d674f56db3eb62d8e89d800655150174b8a4cf6c747124dc15c9798e5ba0dd62a04e8e67b82f7c950dbf8af6aa9197382704a911aff2e458ab934fd7fda4a5620dc02185e972c93cb2b8a8a8317fdef0a9e7ee03f1babaca7760a941114f43c96ea71bc00f532a6dd63fb497aa8a4421c63eac8ca722f636a27cbbf94ac3a81f000ceb3b97864acd43c2f07fcd2b55c30507b2ef1481f6387c33b5902175de5b8baca2be6f900af631c26ae1c93ad9404691d337188555b4aaf9a70820e53ee9caf1b2f284f62908287bc1abdb7d55357006326a6177890a79642b0a270e94cd629d65e0a1eed0e8d340e901c3d720bdc3a28f01a1876e26db30e0d0323111c7f8b0bfdda65e88a6da16b9af2938582a1a16e9f8eb054a01a50ecf05b2dc5a7619aa6249d865974dfa1f2c69c5524029eb3a05ff382b2573c30077485397975a9e6bfa649a4a8072b7ec42349991b30328d330c6e111aac471c664210ca01ca57db6ceb3b01d9c3196140459b42f70df7bd24d1bac7a753c014e3a407df854e157e11b833c19e613ab7e7da017e16c1ac9bb1df67236ab56c013f48504c3b2dd19931384cc055fddbe83351d074af7da1119538b4332be2ba8406ac94c7cbb2c7e98cb68f08265d17f94244c0dd88c957bc58cecd1313bc1e0f1e3b2361381f1b58920d6618890860db7a321c8724c41d826facc5c56f9705b41d3efda5fbe0f7ca3bdb93099250e495136d2f8211b88202684749f86f3d26820c6c7b0c367a1ca3dbfb31f80986b1c3389b4872593d31a84e6a25b131091974764e01452fb5270637e41bfcc5aaba6632e164e68a2811ec5d17f6b94cd79128a9512b3f2f7dff1f18132dc540b36f1f2ce798daff58ef873e1209e6e2ff9821f26101241e8f47ba58c52875d6ca85dcbd1b72238b540bc0a9c4c41ff33868aa0822c70a8870b08cb5d80914ef160a3378da4c388d1a7335363806bbaf1b0e9cd689327dddfdb327b894b091457748d3dc30e605d63abb2ab27606473b94801791e3d9d0692782546ec582337c490fe09943d3e99e46371c1f788810f32b94acdda5936304a585b3d8ebe64092d1b8f6249989785cf13c6ea70bbd94eba8f281e38bd796c424dbda62fd2f9801690e16b6ccd9b3ff9ae9897b245294ccb71f25effbe4f0256d3f514e532794e792e0fcd5b017a4a02e68b86b0d22a169a1d42b7e20da054ba4f8c4d65fb330f729231de9a258a44895c2f926e4b9b4d16befbb2ff1ae9147cafebbe32523788f504bdc1f95b9f0a5e87423867d9e2e3ee6a44211021d46db7cececa656ddf6338ea0c77719217f192881d7cec3f3a26eef04cf2b1937900bb38f79f45bc95777bbc11636232d8e198a9330be3ec4b4677afd2342b98a22d6285279b49b2f6372f259f84fc38536f3900a4d63351744894b4ae9825da6ef650e1dbde149230482f64abc1250aa1c51c4c304db7323de36c3e6a78de0a5fa496246ecefb657edd048221be03d15baec12e72e34a1727947a66acd961c35368361717ecf9177ea0f15bf4eeb7c60aa1a5baf6e1b4a2445842cc3f8b2078b62df2424e59ac2773075a749661cf085119f8a0d997c8ba1efd3b84aa090b4aeddc42c730500d295c1462e993c7c63b338402843a307e16b2409a6b4bab98505dcd4e53ce1b339ae071f938aacf44853dd9b66c17d5a85e81baead308543ee1e8a1b64badc316b1a0b250d36b5a8c992c45379fda70f3dac5382b687f470b91640b2aebc55cd681f9f24df4b9da3303a61fdb1fbfb1efb93f38193c6d08b48d0946a2a7190202d08b7f65eb7fdd1567da5541540bec7314a250e10a1b2d4b476cccb05764acd82858c857392f532b8eb1de95a82c9df013709342ece1a1371c210791ac5b45b70e0c3f0cd0ba6048e413dc458b593450e32c63edce10ac9ef21ad1b4dc825c1510c4aa3278bea3e8bf7b9893dc9fcdeb4a510b65679f608db85940bad7071b7f83bfcb61d08b211e05b255e8b022ee90812189a69873934cf8e94f469cfc7a7488d51132ab8ae55d90bff0d5f9370ea6dd847c4f2d4d54c8fb6825004dbc32d869a056e9cf3cf3d1e0967579520e3eac734eb2621576dd5ab1ceb9fbaedcb225468fd3df2b473abc7578dcc33786773c1da1ebfe2d2108018ae2f93d957f72016bd2fa30eb64c9b3b9df3046edb284a9e86523040beca619afbfa1fe873c786c0f4d1afbc71928f58fbd1bd3ee2f1ee929a5181c64fc24a351d58b5567b4cfbf0228ec373f0a15834f66191bb7ec622ba406f58ae6ce5637e79d7bc83c632350845dcb8fa14241ea1988f0c41ac20ed17d3ab20e5b721737417532e98891c164717f0ffa66b1f8473f8bb8a6d5d2933cf26b46420f794acdd8e904e22fa4cdb530d8c43be850c85ec143b21c3a6faa21bd41078a8e509e9fa09fc48d5747f37652790bc6f29b60adc9f0faebe7ccc21a69670c58023355c4da98852a2f9ed027db7ca2012bc6021ca6b6fea003423405a3c3330803e7f0debfdd0e7a568ea4e9ae51e930dda296f42ff213df04fd1a5420e567125d4f27dbe5adfc67f4e8544f78a1fc3c78507e5292bb970d1be158484d394607000656bcb5f27a830ff7cc4fdce386ab7ad67147cbc66fd57d56a909c3e850a4adbe8192bd1567310673579364780f5d7da7a17dd2ad247b35580961ee44d288d14f72c84167204f455490aa47a39f955b56be55068365f87bf1307b3fab238801fb59ca41283ad2c16f85ced17dec48590f925ee84396ce2ad70ac400381ca959ff1f4129840a932daab92112788bff75cbcf97abe50844bc4166fbe97b7922617b5dd81a91b9c0a8f46823cb168a75b5eb9aaac37e6260fc40fa3afaefaa5bce19e43d1575e4a0f9d332a29f123aab1a590182d7dc1c5624de05d4508acee1bf9ee36d6a33f3385f347f4a885be7b31e0d4a6bc8249a1641eb43f1c1e6994a2ea3b16eebdec04acde26a27d6aa9d7d0339968e7c8721729d85537e38118519fae8a41c965b23c0b7f5c65a38ef79dbef49cd8f975dc7f87759560ecbcc4026540d90a142e953e571f25927fffde1891b22e3c07c1861cf1f37759230586b499a8f4fe2fa31f5645eedf1841ba6527a492c42d6484b25b7e0c2dc4bea2a70e13459c34274e33def0535ff417a851539ee782ac5db3621073d814cb7acaadf1834c73bb36801f802b4b96acbfa4c5004fe59d2bd32a24576cda0f33b41fdce3ab5eeac4c47c8419b501e22c94532c1899f50743a4adb682ceced311479af705b43f718e08946112c486232f6de6ec16569d1da3ed57174bf973035b52fd4d780b3262a732c1001c35faedf21a1d691354bc3662ee43d9453e5d393070d32b7c62b9f14e0ffb845a6d0e1eb2618d2e1b91d20c36d601620d4c64fff067b9c54891e30824e5f77c1944e8eee66d624d69e5465d667c326a9a8ba9a2a3919ca3bcf9afa0d70300337a9a109c3b77e52e07420b161cb735f8a55dc7c695ac5cb8a2bcea0365560c74f8160b10e879693db13a131f9cb6094a16b4076ba397c4bdcbc011189a6dd73dc7e9483a42ddea5ac11a7b3c0aa9655150eba55a3ba56aba086b51585b9037283c6b65955417cc8a6b514fbce1da452ed2aa0a83fc019c85ce05de6900191589ed772623ad73283a92fbb9b07299c89dca21d452b6537a695a55b286fdfa2e37eb4dda913c7cdc96d8042659533c9707a72ddf0bdd652722739402817887bb96cd8ea77fedf9da12e51aeb58e837b41002d4b7f563ae1f07f355dca70179e36cc41e55f0fde64a823708ae088a69694d4cb5db5f756a26f21b99cd56fa04ed050dde746f06162869244a8605d766074d590e3b5d350f06b68d731be29532bd24979080d78aac31c207fe53614a9e74cb36e5f8b2e5a41bbfbe0783004c77a0a649e1ccdab450f1544688da6ddb016d10a819c2793158997924ecef636c34c36427c29f0648423a59aa0ba9860594c1629f69a5039731c898fda902e17f5ce62e541b56a84c6917cacf72cc67a137ff34927c58ff84b6c8584c68141b6d3fd3a7ab403ecbdd08dc1ca63d9ddb8c2de8e7a9fb6f625140dd123707110a326227ccbc7842bfd5aa9ed027fc155a2ef8da030a6386b3312270f548eefc6c88eb20f5c46663795dd9631dbfe45575d5fa9035af6546b47d679b02036cc01881feaaf032c5b23241b675b41801d8b37be5a8961849b9f56c79e0bda89d700f529926fa3eab15f7351ab8d67a5fae2f6a71630667ced0ad0f9d5a754ef5ec8045c8dc438aefe8c0795557b2db4a93ae0b410281acd793a37b0d66697e15c1ad2f244d537a554bf36d53e160aa8ee9a77eb2053a3ea6ef5d435bcaa77ea8c29e9a373862d17038b3f41b7e342cee7b9e180ce21ee0dbd5838e7e989153353138d77d4903631410ffb91777db7f5b9bebd5d66aec6594aae2ef16fbadf63cd0ed9af01dc57b02ed7f489ab03d5e2eba8caf5d04d511840dce48355be0da1c8c5f65caeb8149a6acb1b59b50a4d8903868729d148e8d4274d7e91cb16b59e82ab10c8c3d714f4f54926c3ac55eb97b72d4ba78b72815187fcebef017dbeeed57b062df85b7df8f28348760806fea24f8c1600b6e5c9ad7e17e32cff29d42cfcaec2457f856ab7f30cd1ae01d321914ab0733a8921566407954b9fba629c0448a6ccf3187fa62750b70c07d89db7702be336f1001b33360acc7a05f2cc374a4f70ad15ff34c52ded921bb5599e5b86ebbb1e41b3117c465946caabcd25666fd1d7edf75c0706e2ab513775f8c8a238c49eb3b0e9c6ae3aba42f60094b7c7cc8ec07834d272dd997f7f44183bab7f6f5178e20479b7216729750a18ebf5677e9a1319e0b0a1c22d9fe55adc259ffaaba8f34f3b131e006b8ffbf47e82d244a6804293a9139147953c8171e7b0be689c35ff633e54ac95e6719ea7ea5cfeaad03f31c63a8dfbe06578c1abc8569ce1f9a00d1ef61d165e0d3e3b347a0ce03d44f4335074d86ad6e6a40f692d9415a01dc76a88ebc9030d41118f33be2ac3146de9345858c0d06ae288f2a7b7ac75eef79d35c84d1a3fd42b5cb7faf16a2a9eab9dcb33059ab867ac513bca348e091af38ee6ed54de90dcac28c86168038b5f599e713240bda2c40402984ace1410fd9c8d4e8fc31570865c574290a98f5768761ed68258807aae184709bfa986db86fa690129e9305a74e884df6c5cd5b45bfdbcca3aa3dea13b9b8e982e1805d21044a969a370889cced618bb32ca38ee18efeab32246355104e21a51ade50290b3206c8cb419c844ea497bff09863dc0adb8f5c3a025dec5e51ea3eec5f3ab824a5955cf590db9a875f9dbb52e735b634d8cfe5f28615474c354f346a0bbc22ab5dae87da94742ea3e7bd28a3aa8f7b0cb9cba91401092aa77b608d3518b2b04a7f1e93e065be6ae931a0e7a6eceb93ea78e57788bfb59d3b2b45ddb286a513fd0a48103ce416d08dd331f771526473435079441ca0a060e40f393b4b3fe77e16b8d6bc1c94b0800756e852bc0ddffa73e8c897dfd3c332ba21c507aed811da3d0be39ff6597a0fe50135a74eddcb7c4f68c863cb1837e4a208af34d561e0d84a7a45fe854b961d0fb1492db9862ac80f5ee5eccac19583283524049dc578b0b8284daec6181e1d4b308b1500584e5ec0504563a1de8fc00ef25a685101547a2aff6ab62886ab5811f4fb00e2005dffd74a21dfbb8debd16188c701514c472d12ca0a93d5e1f575d02cbb6520077f997465f797a2527d4c6dd28f1d1e98419c45d76b78f2af5df5ed4ba5de31127e4f1056f075a72f716d77e2a8d3201b1dacb59d22a61ece1ffd3e3d8e1b87e08fc7890b850fadf1334853acd03b1feb2f824fbc771c050494fee381c7542730b597b5eca41af19d4f9b43c22cee22cb27ed6ae5e0606f772ff849918b7de30b08a57bf21a1b89dcaf66c999507d032610e45d5094d913e842a98144744ccfaca195bcf61b96f9a5b751ca651d0a4af77e835c3e09e0efaf6665efda482573842bfe235b0ea00437d914d93277f0d76c0c97a5fed00b014560b27cbaf94e8e2b343d8869d771c9baaa7963a4f769ec11ae617228b5fedf936d75b7fb9cfda1fd0228a066cddcfde670fef4749f7f3b5ca0133893db5839bb2f69c9cc42d0d9854259c05e179f466ca8f15d9ac52a0401c5d4dbfd1606268457b7af377bdef8524079ed339e267ae1a65478999821828a6fa57108ca3a780a382a55b0558c3136e3bd3fe451731eed7e855d713aab78e9ebec43e6310ea79c7a10ccd187c86d35e9deb96c5adb4826783d21840e3c36048b3f2f96ccef819d125ab0ea24d9807d0535f1c855753cfa7def4a2863a8be3d3d40cac6055abf27b738bdfdba734f729ddb8f894429c05ee3efe25bd1d030a8d5a8e78e0edabb5d667b9d2c5331727cf167c6d5058747388a59844f0157ca85c4730251dfe464324010691bf767e287b21337a01133f1230cfbbac12d43bb40967f3775306b13e6e4fd7097b8694287d46f1a8671fa20cf33d51665f89de15cd6b8d4362574c690ba57187839447c95f69f5120e51e4d95efb0760bfd2c4c8991e1a4a8c0b79d1d614ca444c928a56675ecdaa31aa90931451a4ea464984691d322041bd05ebc8635900f4447809e503a112068034374f2dd364e16a95b85ce610786446efa473d9a0e350be60208cce974a09bb991a6406227c92711c01c1106ceec16c7ef1b218d0285bfb34af34d7b8253083eecc5360a820daa4237e441f071fc464fefd4b27edb0f480ef192ae587fa99a805045574ad5a0dc5149808549b6bb7d73852040dce7cbf0ed5f0721bbdc5824f56bf3875bd756c258d104e1f36f94b1364aa26a2e49ce0a11c1fb9d5e8dcb886abe4f0f9d1f27c0716ed71b1342b3348a599e422f56858ed5a87093683a82fe03022a95e4aad209fcd48eb1059091fa0744853cd044e69ba6c29f460e9f4d8af0a10b7fafb4f5c9c70aaae6f688925618bbc27d09cad29bbd93c37dcf6a3c9ceb309efdd0dd21e25a83645fbbfb2b87a7e93407e31264f89f6af4ed3e4022f4640961cf9d098b56fcb129cf4971dc3b9b8fc70eccca2ef332252979afac760e20af6cf26c6d09b54b42290f17ff4a9eec01dab5aa5d463b5c55573b9c7290ee33b953cc781fe99c81154fbe121e5e66f1750d326827c263ea3a9681e5dc0256d2a52975d400fece0314c8335a32e59980537ba80cf416b433dd6b9df0314bebb17446d0646c629235c5c6393d1b0d157094a1cee84bb1aa393074dbe4f16852fbae8a09db910af7a3bd2adccfeaf013d98587c51c78e96653539b62d4c636398491758c1746ff273716d7e0d78e63aea748bf9a48237a589d9baffe2fb64244480a4014e341c969d8fe6077cff35c998149cea5bd1706c6cfc2de6531ad1aa84ecddc68ae1c37360b95ce355293b8295b9c804f72c761f3b57ef2471fc2e183e90d14afdc70c9ef4e98e0b46643596e995263606c3867f45daee83114e74e50c3149d69fc933c0ed990789aa0b71f54b1c5a01a8afca063e29f4152054595a21e101d395a491ee8c6d9bf1d91eae4913a09d90910ac0513b10b0fc6513e17f96584c7d9cfa6bc86ab1ed366df18e1b4abc30d0efe08f1d3680096bf9b376ff81c43d04dd4cc802601329b3b26b435d2ec04c12fe278c66d20979941b91ab1ac55ace047b55014c0ede4ee29d0d99086c2821556f4a91179d56cd5ec1feaf0054a9fc0ce0af4ec6c917f156a639d91629985b13542d569483751a3cc134e22d614e84dd2049aab3ec31297a79acfdd5b2e77fc3b287baccee5157fcdaa1a2cdd6614f9db583b6abd06e90d50885a23489e7a9857472fefc7a5c475352a3aa08ad5d2d18845d8f0cb2f8859f2d758f0f67af6116888b3c5ade1e2ee78ced3e5f0bfe25940940b99e7bf1e45fb87f843462f3fbb7dfd8eda26c8af81b4b4ac7160a2e7f887edaef3a81912b5cd859c81e11946c72f6ffd0168437131f03a5340e714066e67f66b2ab2f55ed676e84fb27ba9428905ced0a5f7a119ace3a840a9c9af0d903e399ca912505c12cc4f3e6cdaba7e11bbb3135b4b7e36677fd6859830084d8c4b0e74ccd02d03157c021dfd255ff3537e405e3f1d0fe836c2f1cb4deebb392cc02e6d4c05c2dd910d0ffd18e42f674647bf1440f5166266f5d52be6fd9539fc52d487b82459e73b5e0ca251216d76c69e0fb4c4019e9b4a501ccb53158a967955c81eeece059a5b0207fc28eda87de2470627f8af7185a818b9893a24c81f3920a25e196d668589492cc434bde85ba8926c5fcb23c57f3d301937d59731a0a3d2008c28a5324098b2bbd263c0f9a1074fdabe4a85121b72a74d0b1314385c757be1a86b50537998f3efb14999ab9c69afd4fad3badc61eed9499025a69283ac0bb55bdea481d09ad2569bde73c6f6927e76035ee3a7f80c49cde86b0cff1bdd4cd575391b271755e2eb54e6191c58bfec1961029f178aa74497bfdb42aa6e59bc16d58c95073ac95842b62b46fdcbc309d9ee4b424dcaa48bb17c5dc6240e5b6a2ef2c3dba724a79f4ef1490a8797fad94073897f428eb08cc76b86a6bfd465a694e3d7c33fd9efd540e9c72d2ca80743774e246d1c8d47e55be6853f5ae0029283a522f46f93fdac991513ff38b7471c802023738a479ebd9d38e638da04d557dfa8cd4573f8a3b2a13c19e6baf482e8d9bd0885a58cfbe4dc53c107ac456ecd7a087b3bea4276d52a1479441a00505c66377d6fe693682738494b3af989a84b6252287b2d78fccb585b410c90d849cfe568103712239c1704148bbda4b342fe07a46d7b0cec8046a04fa23ff468c009ca41c4565a93b432fe50b46ac56cfc0f4e1840c4894bd3357726ca7c36ac2625d48104b707e126dbac7bd7b49f8958d6af26797c3037fa6c6cc0346872f0c4ee63a8c76faf67cc06f3dc6800e99bd53c3bd80ab522e700c78b0b1e052220427042ab99e8d5920d0ba4a0789afab4ff41b19c0d004ede52fd750e36730b063c54713c06f4eefc3c7a3c396b6910303b55651867664b102a26208e9c012ec964a317dce1fb2c3685af643016533fbd608ac93ef43cd92bd09917b4b99524a018508f708df0842b10b283f09d80a7026ca1f6dd7c69db8c65251523dd29d47d943e3f628b548130a0df5cead0d2e413be2a33efa78247feaf4d5d928234d182baf073e507e2ab859430d7270a60d30747f770d48adeed3292b7b2c958783e3717b685c822653efb304b304b46ecfc9ee45001ea15f7a3cf855de4a51a5b75bca745945c0e3f13649f070910081b74942ebdcd3517785c242d5b059ceb033d592b5e373a64d15b43f643dff7cff1d9fa3faf8fd9ccaebaaeac358551feb78a3c171c1eb5ab8c9056b7596719c4179d75f1d44acf1679051bebfa68b4625dbcfa06d9a8cf125ef96338ceabe6bc7866dba76f917bb5ddd7c0119be7f9bbe84a9fd1d83c12a5f408698c43bcaca2085294354c608856d9763d1b58ed569669943c1e3510f87358ba2acedb185862e1e8623619eb03d98ba6a079d9373b04b3d974a3df34c116997b7b0b33b3fb118f34ef348275baf7cd8fc77cd196936b2f97d2e6a215ca8aed9a51b165073dd125ae01170707890e3f77fb6c7bcf1011097c054780447e22fdf3175d571aa70659bc756783539292635cfd6b8eb8a2fbd6e5df1d928321fc95a167fd398411d2ca9e5c0f11894443c90e190ede01c600237bcdf17ff8d07848448112335ad5a0384f11013edece710a09d1b1e37b5028e54dfd1ce06a3da72ac05b46b57b833f0c6e37df1db78abfdca95c7a0f6d5782ceacfab292f060d77e640abd6f6c531891e69da9176a41db5f66d47234790340fcfded2d89c9ae5ff3411ef91cfdf4d3be397489123acfa987635d4eab837f9cb27106b37d55022c94f2bf2973b41c39648d59be7a979f871b035a1fdcdbd65993bc0cbeadf1851485299b9b977c025008c9ab8b32c97eff29392bf5ddccccc1f9ddbdca4ca42757021703b46f624c68b538cc98a12121528474c1475868c19d4986804b7bbbbbbbbbbbb628290e0b3b31d37f1c8e9b0c8fa1387002f16e06aea6e29a39400309c6c3163e8b5acf164c46dddc8ed07caa072c3531151173750bac1e886a4309cfaece8b19391b9eba279970b2e0422caef33b2affb141b63d4589aa67dfbde55dfe2b66d31fa5744f66ee8d2dd37c61853bdec3451882863163251926127d34f9ca5b9dcd98948501c1276b056aecb65f4d9f136668ccdae038e893613edba4f868cc2704c945f3291f74800d8907af94154bf3d173fa005536c50f9db0f69514aed555f90f6b5e2fbf8cb83e4d78adf0882c8d7be2097bf3c09b87d12d027f555e9d00534e587bf9ab08419d22e873242640bf59fc925987224c3ca4e8c3136e9581500329a54f9a908c61893d0004510485f286d6962058c47c42f0c1369ac18c71655fe54c30555fe46b184991a0863c450e5cbb83748428818638cd10331c610c3a5c6d805e7504950e26a982c66d5c8a096a48005944c8c998c0d1d8ec814dd1023f38215349119a2c80260c82cc124ca0c2616706a22c3e5862f51646650a444068c1b88c898b1c102543c8911030e16f87284130401c058c2e40585872c4ba0b858da07644e4d929a8c692f64311b906c20c306a2346cf0c42436864912d4f2482d6a1e5f933146c9bc05b7756577a4fa737b715d712291cc51b8fd40184e2b706202bba1090c3064326a46d54c8ddf0bdb997aa46b0b488e7aa3c62f4c81f6c9ad9bf632ba103f5617e2e344fab1564434aca9fd610df46de07098a1494abb3f5a23bd758de1f60363c42c812d61d2637ca006514a9c94c8606d300e1cd0fd30d6b8ad4292daea1a6afc3589732fa979ae72724137c62825ff7e2dff50a0a9fd6d6533a4fc5ce88f31da3e8a7493730e628c51070be87ed27d77e516a594a1ac45bad8b030ae0eebf8816effec662835d3b959fb26d77df9752791dc5a382b92b342a3b78203da68a38d36826ccce58713638c5e39d2a7f281c7f766f6707804fed87275687751ca9e1da3267bf8a0b6ab1177706298b56be3152e80baa9fe3c9a67f7a34ea8bbbb7bb84cd9ddd7290046d058c3ae76cbfc3a64386e1fb79f31ca9f3f5b93114afafaf3c7285beef4246ec2f776c13f8747e09f3bf6c5dfa4b5bb7ffb87ee66f160f6ff68bbda8b3c61a41b54ddbbe3ae9432eeee8e4be3393f8489839cda6fcf693cc250ff9652fe87c03b48000c60445c84616262064668a0c90e34389343163b98e2454049f913ef24452bd0e287a41df84003154f8a4fc2d6eeee6167ecd27425873262ae8851014622ea01c64c51c516269808a20897c1961a30c1c1f184aaa0faf7f6e8da3121ae80820c8c95b07240f96ba5c0fe49aa2bb50bb4c0a28595ca7f02901061988490c2534480a2fddaf342c5ff218292b0bf886b5f0b3d2415db2e4998a95df73739b93a21fef869178ba084b6526817be166bc7c7441ab573e4b7eb5d3cdac5eb84a5490dd74989863e4d34b9be38e38aeedeb5cb9d992977c739a7cfe9cfc349a1daefcae572bc82c0bfc06da852deceeaf84f6efa967aeee9b19e3f8efbfdb39eb5e38fb48b3ea1fee1ec7cf8330bdc49c5384e0a0dbbba404fb3a62fbcd4dd528699caaabba50c3195ab91ff020afcdafb884976482843631bd53bc6ed07bc80925153a25423538dae3dafa426b58f5a8c5fa87d2e685c94518b316ada27bf7dc12b7f8575b1e3eaede12cd5df54fe4d6a1abf4ca5bcd5e9dac57146d6b6692b5e1dde38068573c518638c316ad23deeaed4b64ddb18ddbdbbbbb5f8b1bbffa8abd32cd69ccc3fdab5b4bb37d6c6d327b46b3f046ef7a04b4d4ac571aa94a66d8cabc9d9dc944a95da1c57f456673fceb66d4bb172ea4a7777df388c7126d95dc6a86952326fdba64929b79a252dae5edd7ca6acb15dedda326874cf9152935195d32eafc6e75d1fdecdae9bbda5e3563c68341937d50a38c6892915192783855e09796215d7b9bb0fe936329b18db2aa678a4562c16a5fe43687cb058354dc494a879bc86de44d58daaae8a53a53457a9542ae7544e44cf709b23e78ef628b56d5b75504043625c6e95d3a57efce5e3a3c2ea476a05e4bda254bb9a48232202f235eeab7e56af38a75d3f9b8771dac5dbca472af08fa69641798fea5543ed045381add68243bed6146e41d94588004155debc6264a4d2a2a6b9e611082866fdf191ca63236e83c2b33585e91e0f92a4b49556ea587be94d6b2828a82abfc734cf92a9f2f90c17b54bee88d1fed83ba8e03687cb21a3b3ca3258122c06c5240595bafdf6feb1d991aa9b31b5f1a91bd05aa183a13585e6190c62908bf852bb9b53e551cee11f23cb1145c366637b18ccbe787ba8b13c1d667b3aca5f1c420c34aace9fac0fbb29ab27ef612ff6c54fa64ce577352aff93f70ccabfb065bebd87937aefaf7e1a4ff5b1886b7afe2e5bf273dcf5d3190ab5b35379d67ef29eee992b6366820fd00f7ff1bc12e3591028a076f17fd0792cf3177f121495839bbb6b9aa6757c0f716aaf2ae020c7fd148750a2822d757e3fb51857c845705445fac5ef1fab7f44188a05f70a4490534a54881a6e540b322068b850a9c631228b585d1dd4c5e26949cb512c06ab61d80a29507e2d5f30ae82b4a6b0c0f717abc0055b53b45f9065441935dc99bb76a4e7e3af2b43b5178885ba92c52e3b10b4cb818a29a104ae288b448a18d515eb68294a110c3c298a13356428bb9483931a466e77a10122f01ef91de0bf998081e1ac6bc4909e86b1a268f547c2b0a2a51f70a8fe4466ad2f701b2ea31449f9236fc87e78cff4214d3274c5d03fb8e9a57e67474b7d3796d0709b90782472d73aaa8ad66906a2eee9fad5bfaa256e8041c3598dcc663bdb59ca7be6f7e41eeeb7c7c63daad4eaf403790ff7a9f8d5dffcd2bef0c6497ee107b53fb6b7363882c4c89c4dadbdccd45c3a6132543ba85ffd48bc8784f66242ec9e552d41bbf697e3c47b4eb0affe18a692271c90ac0e0fe12f88a328d155f79777797957d3de59ba74e9d2fd71982e6cc27c0cd61ad6aee62149049dc5269a18d2344dd38e905490180263831a59a4903dc1a4c687a218c8a198e44a524a29a5c6b47d318368484a29935c79028b35a6502286882e9c698a303da8be94012545b524a7abcbb483ac0cd72df93442b04147101d0307b34359ff392e1e06604206008b1504c8328500aaa05add25a62e71dd054b4ef0a07ddd25a62975abbbc474e44d96fa0a099ce1e405982b76f8618cff2b5b0f9a51d1126954839438bb03254ee567668900a4d0ad2e130f3708a3868d8728d5290ed30e666aaa2e130f5cd490fe5cc2b7d490f500335fa0aefcb0035292ebf0af7445ffd36c41f77763661cd89318f3182d95dd573e689e7bd54b6edd66bdd77d230e272326ef3d52aa714a793bb1976d979d9aa7bf9bff7d766a9efd7ed058a27fd050da11f6b9a95decd42eae5c436eaa1c26a9dbd51ecafbd347351f3d1b7e72eeb86df536de115f7d8d27a45d71e58366cacdf7cac7ea93acec0d47357925e811627737efcb18a5bbdc26f6d23c2958d38b81daba1f3fb1d2c7499c5457c5ad8c454e9abcb84daae3525d978ace3aeac14ac7a58a624d4c36f1db091bf911151db02751b5417e2e95e4b1cacf58f8dba9297e69721813466a29ed62362ac2b1030d39eae663682855ee1b8fc911af4ffc73fbc2f9313f0d214284610cf5ad80aabe85e6514d6905b9f1fbb552d829ad203537bf5f6b63128eea9e7801f2976cc98ebbc48393ea41e51e1ba39913a3213889872d356c2a957bd7c9b35476a2863c2602aea3024ab43d36080530dcfc0d0d409ce7e728efc1f982664802a200e7614801ced3c020ce1704821fc09b1b5f1008a2802b213734006f40d615fafc9579da5c000605fb2a0e28d4c5507352eecf63a80f7ca0fba9d4f37a5b395ef5735c149ff11a66039d1f721217e73782197dcad971a620c314685a6afbfdf678ac34cf7e0c2526da5c00f6648408d582862b2352a47b3e0097a3b8547e3ed3b05dda010a6e871f87057787a356879f9f78f093cbd5319bce4983f382168c17322881422c45d1f442b4040a0c1a018b2d305088c13c394206c65640abb7d0c0cc0cecd14314483118c845efe834b16558230b224e76ee05ad0da03043060a390d4ead15be209e728319a240a1550d33d03f4619b460e6040aad5e8004fac72f8865e0a48918284473c611e8df6eabb112276494c0f616148adc38f4182bc0785a2e509834711919506902395f42c31846a0d026a31b460a18249093ee04ca4a1328d49d39e268dab08596797483153230888198c129060af90e47a076460a1033b06938228a285003a306982890eb68342d6b1c29f10ed6698b2632e712f58453ff10454313c8f96ed114451228d400323d84891a0c6a98411328b4d383981844275c684004725ad79e27110326723003b9ad6b2f686540d4c00914ea34aa84818019c0cc402e654506284ea0d00e94334dc09c56407b4108c0818c245068aba0828015283102b9ae6b0f0135d8900472abaebd03b4414311c8d174ed711618cc10052e93922e512047bbf6dc8719c8000672365d7b41ae0519658a40a1950e4f14dd74ed79d10f349881dc8daebd20f985071a66a0d03a1501469caebd78650b2d92400e47d79e63a146124720373dd0d13550e982040a31bb1358cc38710472dcb5d76a982992815b85194dc840cebbf63887299e20818cc31145c8c0a03ea3062398b604092b92402166bec107eb7bfa98dc75cf751dcd8faf7e3e7b21d8597561f5f397b43871dead9ea5303333f3b6d1d4d43c57b3d56c5b951f4b69573f8dec35e856b93528576e0d2a2b173bd51a5a975aa1a0aadbef340f8b45a993eb3ff0e19b67fbfa1989f2cf9cb88455ad41b515ffae363ea2195237b903a49582fc14f091ea4377e276f2399dbc67c1e94a1ee522384143f752bbdfbdc8afb5fd5657bf54f28e6d338d9e3ef8f0114be1595dfdacabd5b3e72b2f7e77146bd84523e0da0a838645e2d6004abfbf95be161fb5cb632967d0bf12553525ba8572636957c76a33c5ca1ed7560ae189324ddf708184adc7713268e0fa4bbed7efde1159b1a0618b69a7586d294c5868377d1dfbacd0fdb063304683e3a464667ed9d139c4bfb065a21605f8b55f41fe7e30eccbd73e18aa04d967180cf2f96b2cabe3bffef2e7dcb3820ec94f0890cd0d686a5ffeae239c5e66476a0e7ad05251430e780085b62cd0007fb4a630ac700128b45d010350bef605ad164d4e4a80429b1210a0fcb61510f2a8fc49407f7fad207f7ba92465c497d60a9f267ffbb4179a33dc40e70e166d0591d383f6092e567801063cec2fe5e73c1454fbd9cd5782d5c310ef7922eeda1e5e0b44b6ede5a1fd7aa14fd55ee09e9db5d0fc0d51a29188d742bbfaa714dba30544fbf8da47262a667599a880aa05a8cb4485953a9b87a97e5da62f522a173b5f49b949606b94c0566d86b2b216b5fed82cab06a46b7f093c1026a9fd496a7f3f0da4df05ed350f4800aafcb65d75733c32e198be38a9367599bec0bedd1853af799b53a5b7af79aa8f5e00ea265dc6df3eae50e89f807cd9d5cda95acec6af43a22e4c76256e66228d33c47df3040d5766831ab342458a07b6c7cff668ee9f2d1e83a7d82f8f45fc34ff682e445aca5ad6b226d24da4894c2dd409112832994cf603886a319b1cbac848e7b0cd3245462277195f70cf0356cbf67cfbe2af41ab600b1d587186146210000a0454f61e95dd0b5e4f29a985763191fe3eb023f87f42768c2d4d2e040d295454932225d174515c03494a9467686790ea0f6dc30119cda4ddcc8e934f4c16ee0c8b152ad508926d9a91718f4b4c14ef88f11943c61828471e738fcd8cf88b998d301bd16464239a9c363a90329ba5543355145c1a45508c60b1b2b9fcc53db7d6a28be23aee3eea280dc4aa8b7240c39d4d1ab9e7169ba3a0b151236ca53a9bcd664a9369622370699f1e4858b8a3847009fc710c438cb00c5a40b9913468d8b00ebba836a9bc89bc67f51edf699a703cde11ba8eedf3dee6711e9fe20d2e768cf8f8f8e4482aa28b895ec0eb4eaed1ced9a60eb149678a494a95834f556a23cee1a870dd8d0edd0a071a32d18a0627079a9a9b266ae80d26166a08b5c942e30e269b9b3528efcd0d336ee044a191c331e273860f0e19d0f8fc383aefe5222226f282fafbac8f07396e80918395c5647573a3abe33f844be0cf6647b8f1c54cc756417dce9821c30a13319940820924101111f9fcf08f65e5d0f16388dbe112f8a70008b0d9016b87fba6053d77543bce83c71b5de2dc51ed481c208af8949a130d37c6f270a763b2e3a345dec0a0e12209194af59f1d1f7f2d2e0e1d380e070dcabbbbdddd3631a0fc5a7c5985f24edffdb40f8165357edddd0d44eceeeed8dd317677f4c254f566efd8da1641f9e3abee8dbadb366b65709b13c68e9ddca6cdeac4df1882d4be6c44b0994046d9695b472937d9cd8a6f33048d326a51eedd44d149bbfa7520456ece2dceda1efc5df9bb591d790304d555fbea7d495509ba3d761dcbdf5d6af365949299e76b9d9c40ac470da58ddae51f1849d13185c6a32e4654b99aee612727560b8d1144598c9115437efae019c939c9830f5929c7c7c8454382e2508d2f24d620699ed6c718a353c4e98f1f7fb6d8a02def9b7e1869887ff0852c1d5f485939be90e5c117521c319c2f9c4621f59b161b34ec66ee365f386521ad29f21dde3a79cb521f51f50ffac610aec99afb2c5839ff0eff863e55b00d4766662766e06ea2061f93962dae2899a8419558a65489455665134330f183ecc9a104462e4dfeb38625a6b8e2a5ba6a36c1344e57643a7fce7905cb15236a76708ff8f30aac4625246afcd6ca47a4341011e58b0e9e58d0448728b248d1344dfb20f5a44445893035be8e958f488bf83259719f60cae149e205498c5102a96a4890a9dae758f9d05c55601113638cd183950f197657e454eda3f6338caa3d3d628caa3dcb4a1355fb474287236ea8dae358f9d05c581c01e6468c31e270d951441a463451841155fb1b2b1f1aa54bc49002eae8090dba28e150182104b793ce8ede6c971a76496324c5a0c6b759f9883963681874e5438b677471b50668da965043126a6842d59629842a59aab021832664f005112d20a28baafd5639aadad3346591a166a90a518df157ed84937c4dd3344d8bb17972545966aea6254a142f4a4a645c3465c9c2c251e4da1e4ee5892acc1237a8a416638c93a67eb99c06d490c7135a96ac3040d57ed218aaf62ced9f49d5de25c41455fb9d1554ed7d8670aadaffb0a06a4b31b8220b6e4372a2c6d7b4170c41668d1fd6b8f2e505dec5883238b9f221674e036a5c42ea414c8d1fe94e943151d4700415596600e35c9460c0006003d452e3c777aa695786543896a65099223c99da26b7edc809903094acec6003a8288c80c8949682f8c208880d8a5831a4a52c456c6abc92e84ddda52c2f4882eea8bb9445869913b3073821bb517709872527742883f67b6fef2e37af7cf65ee8caa05dc39f6550aee1772d5710e83a3dafda1534741de99e4e721e924907d89ebef9f83bdbc3e6e9872b5b2f56b387f86b6adae86071f7ae0ebf8dd749de53a45ff1e36b5ff1a39918d3a871e38259286a7cd5174bc5b88076aa317e38239176bd14347424588def48716e7c1f6a16941a9dd438654c20f0c154606b05185ab45d314aeaaa3102404643972b27d2744a8b18a4356541d6ae363eefbbfcb5fc85eb64820f945251513c8a694d4949fc1c0d1b51c16691e324ef6125fca4f247a548c44944f10b3916e78cb18bab18e5aa536ddf7393316a1a5be917d7481cda3d8d6ba7fb58feab5fb0fb9045e4323281e8a7f37ef82b16c41be22f21575443463256412d05015b828192f61a0c90ea9a517749ca957f0a43bd1899c0af02f7778c8cdcc87dce55d1eaf0774882f00f274569cc7bf84914218ae0278e19ad0e3bed60b1b4546a4e6e7ee4542b1fa9e7150af3b7d7e616a3f69af69aa63113738e07e1bef3f9e13e97efa83e745556815540a010fe9091d888a1b831565081db17d16c38aa53b62f88c1d60adbcf9f1f0cf3b7af06d97efe377bfe825b7703e12f2e0b9847c130e03d2278012606b6806cbb0aa27dad0952d54fef705610ede517d49ab2e3affe7eed7b97bf3af60fa02b50fef953d4a10b19454c45f3e733c1b468991d390c894a0f35eca893665d44651cac0b0065a2f88b37f2392a95f21ae6af281c2ccfaefc56b24df4042b4b37015086527e9ab2d509829fae18b183862573445136b6879f6417557ed8f116dbc3515c832adb68abf69325a1629d7cf7f7afe352352b1fbefdc79523f1fc6ececa3554cb5a42495977547f61cf729e15030d218a2e5964e02165e84aaee44a4a3e49d876bee7a4dd51fb926f6482f4915be891595bfd496a557dd8505256fe9c50ac1c28c74aded34ff6253f4a1155be92944e6db43a12ca09a71ad20a15c4a0ea7f3809003464074d367e8c9fe302628107e530ed35951f877754aef1fd9f66a73efc9bac3e2028eddf811ea9d1a4055328b78ceeee21cc7c0758aabbbbcbb8d345530c607bf47b7f5d506e57bb583a50ce3bd512b4e917a309f1f311e10a6522a8b7093f3eed62614157c77b806145b1c58747102933dcb66a620201fafddc0e2fa85d60031318b8c30b0a126223643cc4c02af377bc083aa040b8974254ee93d4766a9e30cda3e359bff9c66a0f7ad6b0380fa85d1bf7add607df4c1e4ebb5aad0f85ae2dae6edf5468533bb598ed7b4cf77094eddb8a53dd24b87deb03ee08168668336a9eb0a554212a109ff1c2c40994ad35bb99460d0ef7d1766d34eaf01a69fbe875d20e19286c7b96c74349dbb3d3f639be90a56a1c8ff385cfbaf185ac8d05866e543620a5e6a1f9ed1b4bf3a8d0db37d3f6d07e93cf79e1576ec8eaa777f3d10b8b2c540739d2757e3fde4fa14fbd01e16d3cd5afbcd67caef341f05a292198d8526b1a69076b7b6e87b75d10310403819a67fe4685053210a680f03b3ca0e6f9eeb7e7be1049e57e7a21923a9fdd0be777c441f85af31764a15fdb775f6b7eacf313c2c445cd99f3fb8f80fcd5d378ad14668802a85d714f65e5f168d79684d4aeed456883ce57a179e647a45ddbeff0b81ccc62e0ae2ab06df377dab5bd099e4fbbb64fe5405fc906757e612bd52d6ca4bafdb46b73b6cf0587511568dd1fb076a054287f1bbfbd233ea5fb58e8178f61a24e89d95e917d4261bfdfbd10ec537561bf91585f682b050f859eb457a576f77bce20ede2ef3d3e94ca3ba5fbcd2bb24fb55d8b71a7985591e45af4199130fd19699e0d970cba83052fa85ffcdb218942fb1b22a45d5f147de2518195449178096a62183f50f3c8a3caaf42f3b0a050fe1fdc2d7911537b3581fd0e6218128e88902726e2e13a21baacccccac04c6520c5566662ade4cad1d12b444f146f9f8ec33d7354a7032071774ab5c41802b03d16a2b85cf058d9bdb24abbf0a5400474b5ebc8ce1a63db369cbd462ed3021a6ba6e897a73fc58bb1878ea2e49115565f4a8e6e100fd10a10dca83846ddad9d99e6caf71e1769ca191080b438eb4a66d5d1847f45059fb8aac530a5d18473cf199554e56c2bf9d26e8d6d8cf0e25bc20edeaa75cc352146264f4d6d7d6b25e987d90419a877f9be1e989334a0051c39e2d085150ee57cfadbc86f217b39ed0d404bb75da50298772198c363bcc7bbaafe53df39eedb74a46cbbff9dd07c30743151852afe27ece397ffe0043270aaa1224154ed91eb67d42f361f8d4b79cea22f53d09c181ea43156c1f02559db27d3020f1d747c45faa2e54dffa2bf53191bf70c044f3abe2dfbdea4356179d8fbf1884293445f35bcdb7622b7e53bad80c8a6ac84620704137075dc6a00106c230bf05443ff54940fa0555f1dfbe06a95d9cdac2cbb1652876aa4d5e08183014ab468a30602856a7c020b4c9c0d46f9fda425b260216da5fd84f7593810ba63ed82603b7afc5338ef217d450c38e70f217ffa6c9dfbe4e1ad3444c5a16726da6767592bfa648bad2a4863d6b275dc4db5a9750ba87953419542a379da91cbdc3e6d6b61766a6957ffb884af3eccf28109cbf12b4d5bfe0a6b630abfab0f40416232c2d20db02c2ad9fa2fa84546095fe24759ff793d424b50544abfdb552bfadedabac1b695af27342bf260155e3ee744ee8cece67478436e886446d6666d5582bc149521db3fc6c36cf458c9663a9e90cb7d8ab7f10edd931455f869cd849141f691d817e0489c2e15504ba87edd1411b336307513c81421cc59725c02afda0062435811f4ea369fd3fedfdf0819ef00389f70075511cd43024ebf403c9eab88deae7871bd5b56b7bdea889a30534649db0f2a1fdaea226a36c7d0ed777252809ed72c7a9db05091e6ac84426f8d4241dabbae05a40fd49407e76fe1610f3b7fe62b0fb19ec8fbef6fe24e0802e9fa04203b58be3d57e394ee809f6e5ef2f85913e3e8a3a8a95c1450551fb439b96c02a02ea360d9d51696da212e539417168a1336e67bc8b1815e18ef0c38ebf711ff990d632b1d2f7d43d4def8186ac1424a9306385cb11182454c3c3141780f4855a32a411036b825a01fe351e9256803390d404e47327c5867f0b5989abef121458aa4735cc4bf56f22265090a9feeda47b968b24180c16c32e4d61a63ae8cf6d6c85612dd7e2af6a8e1d1224341c551aa2ddb3d2d675bef2d1d1acc47450fcb44350f304bdabc29dca4afcd3dda7f23ba11060a15382ae334cb56a354143b6c25492c4a86ea00cc54fedf2ff9ad0a54fabe36fa3023a47c0f5e90857b9339f676ca679564b104c75fe74549a4154fde9a0e6d96fa2213fc57797a2fab399edb1b5bb9f6284220a29b5bf9c6f9783536cb49fb6f16a94bcd4137eac50212cc4232ebfbbe3f7d7fa515598693c01390e5de718e2a3d0709f7866c84c5c8e01161242991583630c50804eeddf1edb7136b553b59fb74788105f7d47646aeaa8f36dea4cd5f9d3c6f358db0b0ee0df55737bf7053c046739fd82a05c4f5804833e3319e23d3f29eb818474169403dcc37dfc211bd81ea98ff353de065627fe72805ff1e38c7b465c356a8c435627c6c8c31237cca0e14ecafa77ad53051888029302abd31598abc57eb1646a8e9ae372fa6643b5046d9edd1e110c6003fbf20f67eaeb6f00db83045c9989b9690af1971764684531c6d2594c7fe9981ce3588f0bac0e06f8e5afa37e21463885e4b0802ec736a6e5c0a996a04cc6b22064a1a87c44d096dde430146e98392965b11c025b7dceee2c88b4d0aed412f42b83f277165886b828d13c6100b8abe9ed129959939b9c526eb29b638c31ae4777d75ec02a6f5d3235b70c547fee8eac52b1b721d3344d8bd107ae6776a8a3ae4df476775f01e1182a4ebf2825c3a293d9bb70817243ebcfb5e3f3365f3379720ddbf0cd17b2ea46433a3f74edf8a4bc3db9bddbb67c21847803a75ffbad1415f46342d070ce36a2e669178f76c9ee62f7a87e555e0bed496de7495bfe9fde96507e2d885b80431950606090d08241620656892f5423464b1358a5bf0532644370a2a88b47f7a89e559a27ff0b1d0214a479b69701a6a8a8a42ef64435756646000000008314000020100a860462b1482c1a1236691e14000c7b9a427c56990a84519203310a21630c01000000000008608066c4120025949beb342a08da99c14bd40aed6e5ae059c18bece3e31c32031202481e301737c55a5b07996a4ef450ab8c2c9344c846b0b4ed9c39f2e3e8455d22c6257bcaade8167c40387c9bf12f38617fdf5e8a2ea2c7bab614bd54564dd3a17670f89de9fe9a112a22d00169d178fb531749f72dd5877d220f48ff91ab95c5b8268c8f25c178a7404d68694635be7478476851009fafed2039e96ab767e9e83ac46814d3d4ca2b497301e6338da96dea5e2729b3d48a6dc9a6d87dbc21cfb8d6f41ed4a8735b32a40039082e76c6040c40bc1a446ba2c5f59ca560a3c5451c72bd6bfb325a370f2c9d559ff0d6f893ab4fd1f12021e520069a0b14516b6e0305a22945032da57ff829965ede15325b2ab9320edd598e99f7b3e45d98eb05bf6f44c1bec7a7860ed09932b335007cc3d6f09de42cb657c656d9edf2369de1cd2eb564b865d9fe0321ce12d8312c8509375c4f2a62f0cdeeadbcbcc761d82f2f5b80e6ca90018b2a9e704d2c94fcd6a170ad44d4ffa4faf775322fa1579b46436aa18636555991c2c3a06467aa2d27554715e24a3d38b2aa1d61f45d7398236e5d57b35a4d3011bd71c6ca5d175f0d215d1be0ea7eb60eabdea5ebdff72ed14081ac7342bb16eb2a84f3643b2707906d419451504e2ab2460bd8267ba6abe7e26782a7d0550e3d1b826450ce28e53d3d325785889bb5f17648aaa8e011338940c4c03c2be6fa9427e5ada20d6ada7118b4f507f07d0990ce6c835a1d9ae8d8ad303a4cc1a7975b6ce2a9b378a1cab18bef6e11bd7db76dbecc43830b5d3737dee3e5f06013567dcda06c34d1438de4423fe6f985ea5ba9bcea516c58a060cd26846d2b9abe4bc1c98b08d69255f68221b9a75c9018be647c0e5de9f24a5ba6844ed731fba7e47ac6fdb12cd543dedbe1c3b10ff92d4219b935d7485d0b8bfc446c94d299a4f87b9af0a838b0978f3481cab9933c6cc36f4cb86d52f3c61d63d307c9b28680d1f364b9b1c8dab150383a7222ac62492a5c686a9835a0d513a08dda2463c144a490ed1dcd06dc77f16e3c9d0b94dcde994b0f13d5069433403a4834ae2c03f76ac35318415d3f208e3748e1ee9ff10a859fab119769aa2a63ba9a7823d9c72f4b1ef903730a7a46d9d2cdbd77ff8367e2e871594a6e75dd028f7b9086bad736b6247c859011fa399f401c43b8a742cd9ae6cdcac91ac54a1c9e7cd241bea75782ae3bc9e53f9b7ca7c8f0ad8edc40a297681b2d32f574b0ddd1eae80e0eedbdd61d69e3390e359ea48a393985c96d8397d570f74d7e6e9ed7872bdd8f299815a6d5721d05c17845597d8bf9e64c8ebc5d33126c9c35b5d7011ee389bb5e19b8808cfe9055e606eed1795297ca82966dc8ba3532dba779e7f91f14c0f25e8460c9a4ee4f238247a07f5d624d25548d8f0d15d6dfaa3bf4afced947f0ddad0d1d9ac8b9254dc21f769e44db7bba0f96354d7b45a7e0d89523a666da797c33b17572127faf0ff3ac99d0088b7e966765ee61590731521e813f07311b2251a5959c858f9601aa44d11f53fa49a8e62fa06a5efff21a07a2647b5bd85e31a465ec3b2be336f94ed4db158173fe8719450e01f99cdb3486540eb93edb6036baa5853fc5f8d312491a6cad9896d0271892f12dfa7b8f0388017beb01c3faaadfd32a4b189b72ab2daed67499490dd426de2a40d1f7ec5d56271ae571b680d48d341c3269ee8a96442280579123815fd02e97bddeabd35bb7257ea4ec1af879df3f74ae0c01c6f56c7076fe3ef7e05bf0d552ccd2c733c7a0cbe9546053c312a870ee00db5f3ee538a969fca0ce58e672824025a679ce5216e6eeacf3f505820175ed3be7a5bcba5460dbf1ebd60ef02d610f3c3f90cba9e7648b4187455f724c5f9c9f7aec75da96555116ecf3f3fdc218649260d406174def4f2e2fd267e81cfc8d7881d1c92dbf9ea3f5f154e81832cc46cf1cb0344b7962e31fbd5471f728928e93e69d692670a3c84259f220c66045f1cf5b75baaa7cb0e7ecd804c5afcdb5bfc7c4f8c8ed88d8eed88eda0a6629be786b8048da6d3a2a29f2aa7d965a1550cac60aa52bbbd72c665f54ca6a5d5b2a96f02790f000dea89a31fdf32a9091c6cff0c4eb1f6fc6781d349876f8e1ac2b23bdd70d43348a09c35e3b22bba9ac6486b4de48388afd0203ed374b0346ef63650a0c0dc33fbcd6e3d1f550526c252c313beee7f8815c809c0a0aa431bf552228eabf8864a558b2c1139bec6d35a49e2b7d9d3289cb40cb3832960e6ae2a903bbface4bb5a99fd5b1a8bb24e897e62cdaa3518a0424df95d2146611e29742899449e0927ee966cd051005f36cf42e0bbaf5ffab32b0e7b5e892a665351b2023232ae6f5e8a59da1ce9b54d67b4c6ff3b1810cae5b9a154514266a98cf040645efb3dfb63aa5270217648623142fec434f1bc7e85c4dff0c03f4375fc9cec82941e533bd73a889b932f829ce7b343e6be751fa1fc5b7e5f5bb99af0842199218465909134e78404490113e247b12328fd15b10e40b4a9e70ba961ca33ab1a8098923d29288f1ad6ae190497d2538c52748d3ca7c63276961871ed89e44d2d781b8272a8b89eb47f24007038b2fdac94fb49cd859854ac757cd192a8c4346a01c6f3f0e55f0bfaa33cc79463166a2e2d1fe7b623b52ef03e2560e813f1ee2f13c9f125a1f49f259abf95b4add92ed9b2ad2ec303c41789bb1cfb3c9cff949653f6f967f462b7175d4919e65f021189b2c40db4cb6012c6db9462b70690208ef7dd6070191f7d000dbb022c630093cd3257f81b2d2c2e9d2bac7194ea88f4228766636ca966cd997ec13b20c7fa672291090e7a370e3b5dbe826dbb9f546e4fbca1d20597c57c7ba254d4a3b5c6f625ec79561012156c77d581878412c89f76401ecf2e684804aaab91525138b7d42255a4069cdb5d2c4e54234282ea76b05d96b6772ce236068cef19c5b0438ac8c37895c8352cc0fda0bc3add46852950dc1164546f8b853f1099b9fa9ddd38cd922481aa35c12ea5e1bdca18b577f1567d391fc64b7d5d04361bfdaa5c6536772f6e5db87efc213fdca1b38f20bf81d2a7918c74a5e0c6d3fdd4dee3c6db28791d667823316ac4e01b4e407aaac34edc907d790cc1353c67accaa7380c9a937fb58ef3630662d90e7b39b38c0101b606183eb5d5da9267fcd6801bc20d79528a571e3cce59b3b2e8da18fdf55806a3cb16fea53e3728b07eebc2979e108f8d2d9b532423d231e506c0546b2a7793284d9a07aaea5d03ecd9446d6a27f8b551dc233b1d869e85f654fe929477169c237d13542ad3810ef416c39e0e4dec26d093682873d6d909dd8cee81c07f72add41da08950eb414712285b63d1fa6a0a99b1d2a80bcf4dcbd8f407f3492cb86b4901141ade321c9b7147c20ec43306cf6d8d72b2fb3c962a2e1b547d18e239f4b9c43d65fb58a181e09a0e43ecef88bf95cc7858a6ddc8c0e8c8a8d3b3fb407e37d2a17cc05832d064a4779f1d3f346b74ff69f0a5e88cc5b7a56d6113aa55ac246f96bae29a6cbd62131b56973b7bae3bf81fa0ccafbde42e1996212a081d6d47b6807ed3a5d9186d4afe6d31535b3a71dd6fc41cb83f1906ef84eb21afbc487d95f16dcbf9301f03dc10cd19ab81ad9be7bd9a68b4a4e5d70d8d7d77789302ac51db2bf43f53ca3647b4bf3064c51ec0f5f5dcd40dfdd28bc2d94d132cc829d13349c9e6a0571e3848b2b0228222491c2ac0d7b31e56c942f5ed68bea2724deac0271b0c2dd8677f707d4b0636408e0eb619c5e89def5ccec3304378e622ca32ea91fbbdeb97849da203b157a8951e1ea4bda398ff50195f042fa29a464c76126be7191fe2365e7bef6f5adc696f30c5ab448edc05019b47533efd2d1a8e9a98fe2d2f4f71da215cb33d6b5527132174d202ce7f46eed2682782c472200bc296330a43d6164f4a4c0e8841e907f3bae7b61a9f00deeda2385a7ee777a3bf1f67c65f55c81ccbec3e582f22f2897432d2dbd6e071d5bd68678bb4562d645c79950edd76dc7ce9a26712c3b788875f6b7daf8dee73f79737f314c2623a24acbdbb193958ffe8c3f834c659dad64901b437b736e823824d066221f9f296c4b07c961e8431238518c86e4a20ad19a8e14bd1b772234e0568b6c690bd31935380b6cc9f50b5ef9eed3af09fb477359a3f226e6087793d5e49ba0343cc5e6b8e41534c1a6015eeda31e3871306aa5075471542bd9b324417e10f09789e663bae8f6464847544fb56fde9f8810ece2aa1af6df348888352d3d2dcfc0c19efe4445b65721baa97730f665fe1e3dfdd9cae5c7281e553868b48c43cc863540a8eec6422cb36620147aa6a07e8df4865b62bf0336f71d99058aa51aa302fb2e3f26aa795233cce1adc34ea64029ba611fb03070bf8f5c3a619cf28f282efe9deed6ef22142bd61d9e15c360e4df2b90b3e25e590b9ba564e2944a4966e7e334c64c71ec10163ed9c9e45ebe08a3940066b96bb75cab2c3020cade315faa88964168ae278fe6ffece6898f92a4e4820a84fc04da65026092b58d522dda43c703d746f61f198300635f47dd5640f3d07c15de9c05c05bf87e463e11867141e6949cc905cd84de3175e64b8918fb9a60297b654e8828a4e5dc978c3208b52a14f34a234086da23ae5427fb012be53d3d5a260e45755659458c9624ad84813ef999b24c3c05a4f1ac88e0580b437f4f001f7df7c344cc226f07dd43cb0e8832b6a330c0d5b89160d968c8795b246065516f958c9faad7f64532ef0c20c72d393ca7a0a63afd936835c53836e3c4949708cca9bd452f24d2df384ad2fba0636872482b2c72ca73a8272d5dca3081bb49022b312925c717be76cd4b20ba54d6fde0ba3a34ec9f520e42634a59f83ece07341c16e490bd7cb0ee488705fce61b00ba28282f14fe49dada049e96d3ea7c5ee08bb984c8896d16a83aee3aeb7255296f21b01bc43a2dd4eb06ba5e208fc5c2b343b691b96aba210c06ce91439f09ad60ecdbb596d885999b6758b9ecdbf8f96e966fc3af177a1efd6fd9197f55050c0a93ae7f5a4a1c38e855b462930a7282f7008aeb9d694f6e4134dc359085fda9ca36c205db9fd3aebe8bbbd5bec90cdb3b005c809d8af3aa4c1024a2afaf5bddab8f94a50ae23b4b5bd00fb9edb99bcf1fb0f3deeb6cf16ee2cb310f4b679d9470be66b7b4fa11a845eb2acde4687d1e0b19128fdc2d8815c222041cf6282cc4f7e2dfeb3a3aa13890fe4c19e223788914aa52082578214a027dcd12ac9558d59bce8bb718ba3592a6df05eabe9e83256bcfe2a00c114f513ffa81d1064684b0c9f8d488f913d518c08a9634f09e6a0c8776bd68e7868808832a1300ed1db4ab2719cdc4c6e4f8e2bc55702d411c351c29d2643738ee67ed12ce5da1d099d57590eabf96ecea7ed375516973bc9234af21d3c0c197d0b45a662133912d18caafcb44a09a5a3cfff99748e07dd590c5fce43d50631be3ab47936ee1c4e43f171f2b865fab372a60d956cc4025d6c93bb8afc259439ed9cf38f7a7c95fa2d7f7e3afb63e43b904d6f2cd12090ba11dd3ab90d08eee8d49b8fee235238d8d3275a8ff44962c4d00eb1cd41d2dc54ab0a41d7d86d60c93152cfbef5c0ca3f803831d0f1c14100c64a9a260ed6fe43e2dd41788795cab5e373e1ade5f354f858ec509d2b6e59736cb4d25f37749703ce7f6664f47ba82c21f2386b55aa9b427218d1195ca79f8072e7f0dee8d09f0cf7b868d14061a2cfaeea8d67791bb916f7e8d2a87b05c112730a4b0a9c064ab8134c6cafebabf20156ca9840a38e7e53975f061c76e8335c021ef521f7554e8eadb7bc726ff20a4c4297221642e3a7c4923b854f6888a9985fe6e3f1ca48296385683c5b9372c609068569459c9d9ece3d452826ef245008c09814804fc097aa40a7e0db1dca621041bd08207ca708c3c03537af66d52f4608fbf49c0a56e5d87c734e39a451c7c975a07d5a65aaf63005548b6b82b9645db2d6e4133b46cec7067eb8bac33f2dcee9e22479ed878b866b68fc75e51439457c42aec219b0401884a6f8db72bcd0a662f4e275c520f663565a10610135f5f4924e9d54a0a03d2ffde49039c684b95741e0f7b35c173c8f915aff228137912fba39a768cd4575b788bff724102b929155b91d74001393cbe84af7d46552fb7a9c52b92d86500fd41e4d4cf7465372c8bad7d15db2043fc9b7ca2df98cbaa90d1df75b504a7b82a3705423a17d22acc5c8de3444edef7c41e47995091bbf47fa343924752e6e3b51e210f1248a5960a79c3590933410efcd04a52001a73ea87c9a461d9fb476859a4d64a28c651056b2c93ce99e7f422751d21738ad857212e2baea08158efd8f47ce8b74460d6c928136aba46bc3674d853601026ad5fdfb2d485780be8da5b0d82c98714b6cde9d72a2a747fe6eb29389c40fa75c127812ad3afd5a15622fb55022f8dd0bf5fdfb79adbf08ae2de79131d476b7216818d133fecb35f3bb4c5eab12efed4e125daf8f0ac0a48e6cec99c4225ae4d913c5730186a081236616611d094d3b7fea045756a779eeade5c2c38cf99e5555de212e3506614343492f7f178072b698d77c124eb990fa12f80143ea745a46ed73e8b667d6a9e072e3d5c99a821918b3615c7932c85874236e8590a7814a3b9d8f6fb2c018c5ed045f9c37885b5beab2e5b8cbb05c4af5965bbd6e21ffd0ee71dde62559804070273904a0699d07634d6f373743836c68a5c0d27fb5c9e87ee55f6408aac5ea7aecf5dd543218acee9ca3183041a7993b42da88179c1a657f3a43bb3ff16241b519e8aeee937e80d4b00f892ea09bdeb76f908cb0d81e3984e42e8dcc0df59bde0448e5e5bba48437c1cca8aa4cd69bfc138a9ae8ff0b3c352ed1a489dd720555deb55f05ad0bc8a62a5cde8a82746aca9da02342d18aafaa63fde1c98e7ac68a3f832adaa9ebc594f70aeafaac5157d6d9584ce11b5b130cc2dd872dbfff93d0977f91bebfab4ed7f92c13c8ea7b2bb6425a6e7a501c819b76864eb305b27e004786d71a2e9b0b85a64b2a2326c55e60a586adefaeb15aa6d9357b542755b45cb27431f53206ce52c11f46ee6f22641001d83e28b801e4bad813e7e83c6bbe1a6ab456384f19723c140319846d7353b6e4ca01ffb7e5aa88ce57bfb4af38781b2d388b03864df8bef400bff1517482428067bd2f285bf43ac8593f54788b404370c757647705a15ba1e5d940cdae74c7623905d6b5d3cb356ac38badeff3e899a34deb7dce17f9cfc173613dcc9b62b1cdb0672d64a954dd90370d22c6d65e89c77c72b462014370f9bd57b49938dd17e6c4464aea2d0e63124ab89c6ffe10468ce7b23c828bc51a3ba7cc28d1457fd50bddec21b738340b0b5e6b9c8ab8416d01f89e36b76a667160d9a0039dfd885d35ad84264c9525aa531ae66dcef1822f703e3e909141e29f26325a0830c7b4972be562788ac5e50af9dfb99749cb544e0b21c3ae1cb1cfb44254cb8b162973bc17279c94215d5f4479d86f94f8910b633d6797d8a16adeeff1b126d6707c99d073ce089ddf3c475fc2a328917169d7c614d649c541a659155f523e44858fac6a804a31bd1252950804e844a430f64e0a203890bab444fd84425209496c5fa43d5f5452064482029c6c6c018f069d30577d018ba006fb44e4a0635422efbca3586892c0e01d0b35bed3abf1d02d9e32d02c907e9e4f9dbed8e5bf60a28c955dbd51dafad029bbfb829da53a655c8c3673ded35b7901c98c56a904b8bc557acbc264f38771909f90b2a20f79d8f24e37e41fa898068686235cae85ba9fc32e243e234fc3995bfa3d27ff8520bb491c0f356193557716b353a0f65e5b46acbf4e4a14b7f341b9dcd6122f9aba0e6aea55d3db4def82787882021ed08665181b35084f519f86b4e720e159d04c9c9915281e135c3f2ac4a1a790a67f591b01779214bf9b7e6f9f2c0b6ed88c1c907eda0e9cf552c6448692ed9829c2dafa593b32e2f7f20f94c41ca6c8098ab43537adcb9637d4d2e3afbd12931e875882aabe67a1c034211b575c5725fbbe98e4ae1aaec5aa44f1a9bcdbae868366c43968525459198fe89d368482d8d6154c0314849580abc34bfed219f171d08173991342b2b9dd3ce1e298e3dd5c87f634ea72ac6ac5253062cc4418b5c03af73adf7319068415775135d19ca4dfaafcc4a1c5c81382f689458b144d2d5c857a4fe9a012ce69b6398cbb8979b4c177f6f4478bb92e09f033f032c1b817d99e0968ef9f95b8a3b600ff4850c4830c8f226cdb4ac9b8192a138a12d32453786e4be7eb4abe343063e6a6a64454aea7632ec613dc872b3858fa4b2d29b1de3b111d8c1f1121540970999c73821623ba927afb9abd090c65daf437e1760de8977cda703e043f7016a128c2b17c2fb5ae246408ab280827dbf5525565507bc02ca56089384d007cb9dc4e649c9a4f4870137dea2611fe7dc54f09e2d0e2e83b67ec873c64dfd44f7bd25bceb52d08662389cedba8f174db93c24b7a6721170eb804d6953da084a6454c61780a8c4cc9a0ec816d26c19f0cfd5edf20086e037fb3905d490114c107aa59a08a3e09642f8f8197b7a5f121a6c61a3f3d1a3aa7e1fb7dc2974485f021eb0064da66515b41b77e0b4503d6c6351629f55f7be94859f4620c6aef4d34e2730255574883f33b4de348e09fd3089be315e1e775506b75455c5acd7517256aceb4a9650d1a6990f713b44512526d3cfdb064df0b0ce8788ddb2a433a265c67a6bf5a5fac5a5ee633008cc4271d044ca40e994420cb1412dff0b2c65b479dd20679a6ea5268e8a0d33b48530ad1b822111b4f312a4322ae2e4b7b00c2b8c4f1094fa7dc55798f01141d6eed89f88089cdb288315db50f1477f64b48c6fa1819c38e03e52e5eb563ad94a729dcdb8916a4794fb78dfa9c28d182a0ea12e5a560bfd34be1c3c413f13c52106e604b814f23f18ad3826a0109fb14c1adce0345831d39700d6f4f9ef22e8ceb46855c3609b0cc5c34a5fc546a97b74c5f3bd84ebede1e798de74ad54d963625cc00fb45e7652481dceacbd7280c30786067bd7b7228a0cd0c3427087aad96ab11684e8b59865373102a628605471a476023c9e79ca1096d1ef01f9fbc1519c55e19286e4909ec13dc20318f434c047a6ed0887a1a973835ff0ac7b757ccadbf24febc63a53cf5add643da960a5ad78b12623637959940ca7185a5b314e5ca1a9e7d777cd5002f682e05d3fc21e1624774086d5451b9420ad8b3d042e38b90079d78565be5185a68c4b113da0abdf7a758c35cc636ee7dddd53e078d77b8cc54701536b979491600bab02832332def1bcd73b34a441b525ae77aae318aa2786532684dc5ee13f7fc52a0cade15b086cb861edbf21f0907b2e73f50fdd3509799bb117522d3a5cc643cff9d5b07ae50f188441bee420d8a2efc3bb013f582b22439a5d0464919944fd8816edd694d827541a5c8eaa3aa7bbadc27391b82d8f442b5487f7100a186818d67031ea3103db375899b1eba23b3c0f6d41fee2eb18cc795a8c2723a26145beb918792112cdc5f5dcb93e11f748f18cc525a3459f474c7744bd5ea5b1a251ca33f199bbc87ccef9c0a3a43e2b82dedd3102ab17f0dec9d281fe0969c5f175eb90dbeaf92e061b667cf5c3819e1e3d5a91eef7b6a4d5466fdf2091eed321ceb78bea8e395573066d8df8b650215771b9d3f2e4fcc354a4fda1bf4d7fe5901903be8bc7696fe436a72e2e8cdc1205e754af016edf187a8f2cd2a2da3b335ddb47bd83949000d9743dc04ad0621d42471455f2322331e744ce7246dcca279a5f9f30bfc72d4e7de8a02d24930240280457b0cf212f465b7ae951c7d7ba1a54bbd28aa579375d3f3161a89c3df9f1740356e578b1b364aba992121962e36f2b96d4178dc1142d1d4cc5174e9b11030f6fef82541da218bdc49b6b115f967ed929fb019f2df5f51ea9c0a59fc6beb7ea99c30d08093d31f49ea9856bdb17eb1a73fb953ce362203eb7d3cde1b8d1a55f81233dff4a54ca3f60bb856793a855571004363099abf71a092bf3ea3fbf7f5b7241379a3b1347c603b0489995f60fd279c973f6b9f9d8cace18f2b7991591bef90fdf5283c21e65ad024fabac0de9a61af0fb69f268e8d69b5b5e0ae4001907a8715eb5c7f5c2d8d95830bc02ac5bbf059791c0fd28d1d2e2f6ceae94de1767058dc86d82e7bad218af6ba59fb1dd951974c274a43de9236d7f5c60a4394104c85b024e99140ec6a5baaede28bfaa256336b4274ab905c6e8bee5e92c55e8dc917c966015c6315f07c1d8c822d5dd036180a5dd2db3f6508ed8ee32a6a0efb0a4d1b8c59f26981f70b811ed26818c7004fe0ccf44e758c8c28ef019448be469422514de3fe4603f0cbb8dcd405029c7a63ae74a886e4ed392f374f742d4cdaab4d326160d47d559b8ec21f725d1cb9827bbec15599ab7191ffd09b514b246b7b50404b68ae576ccf2fb6198ff0ea591a7f15355e43a11af4c61625ea302a805b39d7fd8fcd97ca915b53c989655b2ca666bce5d2fc384096bc3a55d4e0d9d79607e829a708e888f7960bd6ee06c2e4e11948c2d35afc04b88cd50ce4c06ebbd07bf54999018bf9b2fa092d1e9436b4c1f0947123b27e5137858ab55b1a9f8913f3667d1c588d362065cdeb656cb0dfc1b1fea4b7e2eefa2e38ef09126c9a39926a40db466bedf2df53dd0201e00c914bb4cefe797353039141de0269ab7719d9d477b184ff63bb7634274af6fc5169f78fc65d1aba9b8216107bbb67bdaa3bcda654722add7f2b32582e798f8d074c838ae7b8c34017e30c87f5764d82bd020bd72d544a4fb2170061c19ce40d10fe8d11d5892a4db3331f055a757e6b3a42ea973efdf1e1ea6436755027ee967a0499b762cba390a1923da2978706703f28e3fb01456f3d5352c18644f16ec55e38a3907a13f2f63ca41b75383a855119e5d22fd60bdf1809d7e30f4b62beb9cad5d2717d97d700fa14480cbb8d6053ed86b2b618c5b3f680a00518dfc4ad6236c9a4128c8187c71bfab5c0c7568b51b2aac54d62b9fd604dba152c7c2b27606c3f8091367de8d04b703d3c3a2800cbb8b3b1b0cc50561fe09059ab97233a827577a435192fe00e8f1917008723551ac688068fe5c75081e33c62a23786cfed5a5c10b1e9b763cf4b7f384e8a9f382882aaef4263e8d4ca32106eddab2f7c87f7f15ef114577e0f1e0e3d5aea118158415f930e6b0f3135a77016c65f3dc810d64d161a9bef1611b7308fa516d96747743f8bf9a60decb6dd4e9f7ad9df420c25084dad62257f963e49288ee0dd309c854f73cc34d4a53edf54d654c49047b23a59c6f13f65cedb3902a226b61bff68b3b6e64a6f8c5330da8e636e0b819c0e76fd426132dbb12436a4cd280afedaed90e772f3c5c46c76cdb6fe6e7b770a521270dd6eb1510e59713fedbaf874434bd78f297bdcc42cb4c2f4da9fa018003cbcdddfab79b432e77cb8972a130a8b4c689d23017dd1753f7dad7c48de8d85e3933f5c9d718897119891c38d4a3a93e7454abb7808c8e4fc4fa230ef4925d0339e92d1ada7b5cc5a482df4a054fd1603548234a7443bc9a2d7b664967c3b5b84b6d9825e27f0fe8f3626ac41985f54807237a95cb2a9af87b01a7462cf43556b902a33b335cd17153b08780528d56871402c5a3107b1f40f1d62548b38b53346b7434ac301d5218b2a5b1a02078a1dfd4d75a27499398d1584dae3a7627d2e53de5c3b6bbb8222ad23a904863d68982a4646b027e21f6a8d5574398bd6f30a6c913027faee3b880a4f5c038a0eb7d3af133f96273c64c408a4001870a93384474678001a88789795ef91a3f214823ddfe8b833f64f61344e9ef3c8923fa1d2ea35927e1030b0a70921842374fe8cfbe1379c0d23c06024954fd4b4b77c98c8ef93beb96c6b165aa1669d32a0897eb705a9031f9636fc9ed8e98610a24ea878b8349198945285005435485833e707b3a91bf6907506f119aa4da0503c5dc7baee6e855ba98c7cc33abae0e23dae57cb8654e1e90fcbaa1ca35697a25061d225ba2b626699b4802515fdf271f324a3af9dac3fceeab0339bfbbf00934912ab1c05f80cfbfae102cd39c978437c61b17d391788a0b0613b86b51d8f5079a32f8498224025e835077f57ff1f055af2846245427d4cb4fd97e6c526a9d7c417c0f6e051b2e1d3520a45b6865bf53b05dfacaddc4a39ab1ac06657ae2fa80ffd19003e2448de43cef866a44d59b0e211264338bca0bc480308fee2ff9950660a2813029a85836ebc758abecd548fc96c020eefd2ae1ef93435cd692b26b72e3ec803eefaa7b8a908bcfa74e939ba82f50a49a1c4e45ef0b6b610f37911f8d28d01f455cf17588d9db97c47780cefd4d32be7c9a4309d31fa2710d4d0bb3c847e8b43cbae682a2974c01ad8fc5563954ec75094bf3f4e55e28728bc425160f4e9621a3a41486dc4c641c08ba3bf170b715d486e355d5059277007297c7a8dda904aab666a411a92a8a88e7314819cda8089653c38ac789fa7e1dfa0bcae9a9aa3eacf03368ca0f59a47e94af0b09a564602734b3e768e48e6b05eaf7be03586a5fa03c73121085295397903994b3c0238fad942ffa17bca3a774abdddc278de187079b60e00a4c775409e3b61dbf5a59b02df8b77ed1fb2ed8041dbf88f9028e36c78b20037a5d2bf60b1d8f58638e3c743289260a5bfcae7946951cd640be6cb80612796f746cdd76977522c4126101d3f0bb0b1f94bcbc9728cab904397719205ed21ee1ac9409052ed54e3e46cf391009956f1884a89c7f0c2b4dce98a5419cb78067dd7a1822b46777dd07945d68d4d7d34698a1a3f7ca2c4998835212e4ad403fdae85a02c45e226b8318abcff5b791182b64c1c90b118d9c29d91dc147d5818b3681154d32d3b33ff8e56ac2192d4052527cf7e8566b489135c78286ae6ac87a295df5d6561a9eeb3038836b58f8a563643afa1680440925d5398883f10508741be320ac6c58d230f8eeaf63140d6c60ac900d24f5c6b5b60f6d813edb94c991f5676157320f3db6fd33e2a8ab87e92f7f7c7718fb507399a85adafe3942f8267216486910f6787ad1b455993c05fb075a0fb6f048d01a502d8b9da96b3752356a944339ceded31007ea022e0d4796471fe2661040587232758e46d6714f81fa53883bcf0ea5590a9ec9e7c4b94a6ec399aad3b81f60e8a2a07f924efc52701ac53eb8e25718c301e16a373b10cd997f7a2ecce6f270ec04dd4c27a2c5636b6b20889e4e6911108764a8e48c2739d83a4e8e66f95a9121899625efaba6cd348aba1fe5b60ec1d6bd2803cb5eac75efab6472a9bddfb6453bc98dadc6c246a1152484c31352cd7785baa371a8785cf59f64fb0e840acc2dd9de1a64d17903e5cc707fc986271dbdba632caf479829eeaa6708945d4003ced1017b4769ff7038f83f32d21b67a3ee778fa1a5d2ebd33776dd796da8466ee68d07f35ee4107b61f00bed982f94d8069451b9b042e78e5ac365fc4816c2c9923ed63c483c7d639aa16e7ad4fbcb8354f748bc3bb67a5bafe70cb48ac175ddd9f9c6d86d58e0911e9bb5f7e9d598012f3135733a0c8a9106358d429ad64603bbf6c57c5d0a3a391c591dda9168bd1feae8de23640a41f1d7d9cee48798e21d0fb4a8d7cd8d7652d991a246b6d57d338d7f965d7e4683f0ae48eccecf0a475245f9f33bad5ec4c688943553a0f94b496de195b5eea86adad1adc0afc65dda9f70e43d853a184df9eed774a322a97d8d1b82304263067b17a5d50928baa384fae2bc007929c22c05bb74e3c7435330aec68df4a40e9622462881a9fa160a6e9493aaf00fc665c2baf1eca494086ee05b59cc74e4cfd91dd0818fcea0f53dbb50b75965b402dbd1e82664a592af2089980799ac343ec0b70c36754b9f7c82d237008b46994e8be4c6a00b545bd1186e370dad3e398e61abf20f980dd4eedf53003f9d3307b30ea7105590a29d2fe55e02388339be7d0cb8a243fd572bb4197e5fc5f5b912a69f09b6a5294848bdd19a652da4fd5c638d9d7879c04bdd441cca7a25a80da135373b5febeaec2f36b2fa4a33d143679e4eac89f15e2cf2ef34550c590c40426a854a627bd9c5ffa2c85cd2e43423ae40c1764a6b07acfe6be5040cc3477250b9fa725f4382e57e0ee2babe440e36434ab19b0ec2f001cbcf821788c2a02e8b2a23b525a7a7f01cfced901640d87c3a48bac72169d92d2c178fbc4881c1d8e2a9f1f411bbb578950b6c5b34af6013cc16af496938044b983981a97ef8031371ae8f028eef7d649f4a0560e70153ff6ccbb72c807b1f39e473de24b6d27d7b6808376b7553223fdc63ed22eaaa595c26e9f3ecb30fc6c9e1586a14773bdeaf2da5c6003e783ec65dfc25bcf354afb64368e9c538d3708e5dc635e2b62ba7a9f62344331510b7652f60e04fa399fe5723935d44d6cb78be7ebe96b57e7dd384d61e2b3cbfcd739dd13ee46959a537091d60b373acef04a3889286789287b060ed76d189fee6708c5f8f1af9119ca241f6b934f0b9a78d487f72912d943ee74fdf7267f2670e6ecc8bee4c2ace3dc3d6f61e3de2e92d993450d10cd5e29ac7e91c0f47c4e6b142258e075356271a64b122348e072762ada3f11899d5b71c8c0680a6b61aa142de67025b57640e35c577d937953d1791e1d34ec1529e7ec01535b875f87417cf4194e36843f664d5c7f72aa31765900be30d760fdad5245d4696d35a6cc05ea853173e50fac202a4e2d903b3d876b34f6ba09ce6eda810b6e5e0d47a664072d09967c18f71f37917aeb9e47cd1c5d02f5da2c0618aeba171719a03ceac7f94aeac2f10363f09a5cb8a3240703d1b6afe0d3ea0d00a72bee9acff19cbac28be12012a37d55b79fba3705763b75d16aac8209bd164771411b3ec96c0e7bfaaf604074e71336e1b60d8bb53801ae258c2d9659d9780514b9319fb8eef09bae972ceed2bfe91f7ce41c861b3c186be4119306f94d9b0a183ab0e0a0c20dd5e217cdecac65113f8a7c320e177544e6eee8b3ff4eb76ca1196eec3b722bd0a16ebefe705ef777ff4e86ed751c6a7f80562f1419b9e7dd01f7f9c0f7b919407316d824964ee2c14663b3c3b0602565dae13059336dd9afcfd9042c4af74abf25b5ad9e4bd49795ef3e01371a5e84084494823b8f93191d14a1c2b9d059be8169866222ab532b233f7a0aaf1613517cada50f71057d6880e118bdca0d8f6265ba1f8582faf97b1d04d8d85e26b1b22f3a501ab930aca7129a05aa7e8f4ab2d68110d0f9684cdac3af5332c753213deaa98a7f079eefce267cb69f7c67634c74eada140b30b3ed83a0d2f8ccf65e73d3259942d1c3dd5de409608612869a198e21c51598cb5b07d674daceb0df4a58640716e2e139fcfedf43da2de3a64a4ce6e7a8f672f3590a1a2cda3c2c4edcb1a885b09343439a15c62b11b26b44f4ad05935722fb4c98cdae873c9be541c207437ffbe2b7a80227b064572552f878e39f838734fde73ba21d8466f8d62c83321d354a10c3a6dbc81ae53c57bf03dee816b7de38c4144b98983e71d9d05fec4c08c53622a70f80c9b268928b659aa6cfd95fe6fa451d021789a9630a71f7c2b1d20e73624d3e7892591d9cae0654052e5caa40aa689c66b111f6e70ef4d98382a0e3123192eedaeb23de64a2f22e68081e533cb840c42db55de4a3e5646c9e0d7b3fb842f7a640dca6fee3abcbedb40f6ab311494961ee2e823189bf6d8aa91f46c333d9f384d3cd43ffbabfadefdf7a7e9a6f7baebf73a483ce68c775af34e846ae009318e83646edb920a31ecd4ff3bb0eaa9badfe6a1d26c66b86ee69e23c67abe4eef8638a6abac625605dda1229853cfc2c31fcc562179a6078db6a82a38e22c3cab143ecf1866d9fc41d5ce8cfbf1cef0eb67d989dc40836246e5e88331b479959983f4ec91d24061c0c88cb7f03c78a1b76e4f9303a2690f0308542bef979959e06f78a4152eca5f9899424b086320ad320025b893310c4c36aa0be34532d9f025a88b5e11e2b4b986b90c4e0511aa0e2c65d06de49d85bd1d7823cc819504f80b6327913e2b8b5aaa491829ec66d9b75ba5ddf5a6bb6ababc950d1046004fb04ffca53a79d8673d695468bb6cee9eed83d101e0cabce36add74ba5730ed7f04876e862fd07a2998c14a0bfe2c9d6d25bc8bb8873707e97197eaf78390a080744790bd61d5dece8360f156da94a3a61d225f68c92e2b0da4a59817bf7f81ddcd16f3a20d649f82cbd38e18637da7306f8968aca7de2c16072626fed7cfff047607001a7bdafcdb52cda29897aea74c59402564d11e9ea0edae44872ee60a8011867cc53fa38401594a3d38a32e060d84c0329b53e1d9a8190a9358f4863544efc945a1d737cd77f5c6e598605956b7c9211e4d8f880b2d8053511601d6289cef348e1f9727598a21a57f99e830d030a2db74ca7e0d1cfc621fc81a05087dedc0b7a3f4a302b63e5799e50d3d9de36534afd1d5e209d6756923916010f94fa44f079fd8f6e6f27645bb0abecf1eec911e1204f529db990528d435293524904cc5362a533d278ca267085ddd44ffcc2a0a023425dd41764b719cbe5b5c8989b40def1417caf775738ae660db10b4982064272a70aadeb92dc7720ca6dddf8625ab312058ced1922592bacd722d17566d4d8ef5212210a86c8c5910aaa06b43de1ea53aa011450c12e84bc58a1acf17b2a014a92eee2b8505288b880fcf8ddbfe7da413467a0a29635d3a6e4a9141bffafa63cdfb21d124df06b2aa82585ee1f178722d4de0931e88aeb9b0823ef4a4ad0bc04c97d02358404c8075ccb9bb71364352ac4a9223a55e009f548037d98f8c6f0d53715938b3fc607983a7990531605ff47322a511a7b7507eecf4889acbe8f2957dd5a2a53137b4ef3e920a2769834e23931f45f70321dc7a425b6b131a229a8c4d7c1087699c1814d751c7c806eb22fa120e07a3f7a59fdbf51c00494d1d9cc947b14ef3103aacfd51a0268469c76a628182e6b170dd8ce36f52b329f89543d85cf0d0c5b87ea24384f2242bcc35317d53e0a91c15d1c921657c05e1098611d2fda349760ac815b7c61d2da030e67aacd20358f54c255add543f22e5afee28bbeb969a661934590ecc1c3d8cd66633ed6207c7d8605a2c9d72bbf8fd6cb6652f37b51120e634c0a438938dfd68ddc941519e8545fea41fbcb2e65e77158f7bbce6c561a951b4ee6bbab3cdbb36ff2ff8e1048422aad5099f9617438ede1979361032887ff2ce2c2f28aa01f692116994dc05450f572ab435778731277000f48ae60288cb01609ca1ca60dbb48e35c1a85824934c9a7b8eede5408e3714b88fead02c511c162502bc4d0c8f33da4166c16acc1884336e123675460d171c33f20955c894bf05737a68e3081b5882f7441a2625daeef79ec96b244423a4f992628be30db48815a9dae2eecdab262f1f9c54df3603a419ed5fd8dd7e0353181c3035dfda84a06270e3db5c4e2a3ee695b2bf5391bb2008094dc4bf417547e0785c17ea56c1e7abbf5cafb40f9c428f8cb35370ab5092b38bd2b33cc88dbe85f7cfaff06771e4fe664cd89bda8f8a9e4695f4fbaa5b0bf148c6373dc77cebc0d8009c05031722303e7ff6e4f49660202ec20d6d6924d8b716364cc8ff60c837ad1086f484fcf64cf71f747bd0a72ab48b7c8ff61fc403adde3253fe6b6f8a726b20c9ab2b8efe03e6a22dcfe30f004b2cf5219f79fb881931be2dd5a5236b3bb3413e02548b28ad729b6e263c444c41d42d4162cf4e3c83e1c6985e84939a8c4c9f5995613fb353ea5f49acb808fb872f2f5d2382f451541b6b0eaa46057fae52c9d7ad15b2d2034ca8f82444098cd644d68c4d5003622b41cff80eaba989a54f1d9ee1be8515cd41caa27c85bd30875ef752e2e27d934f9f74d2d4eb94637968ef5a420a63676c83c942fe03f1dbd1b2aa608faa1a1093d9fde94e3e835ae1c40e29251a85e4ed40c2f5b7a2fcf62768650af7634c8153203024dd6d63c3d085c0a8ab720b66f022d1b9674dfc98e0ea5fdd854d48270b796c935102cc32ed0a389e79cb3fe3261537e741cfcb5209c5d4725161d2f4cb199737debea6b7497d5883567c00c967fa432b1fd511822a907ab5019e2d0289ce79d25561c95064a3e73bd54470bae829825cf1278dee01931314fb3ab93e573807ed7df3f655050ad51597e4d494aa55c08775be61c6c62ac7336454bad1bc8b9dcef3f6b8a88107f8c87dd0ac3c0d5372513f5887335905743d39cd66f20abde60bc0b96623dfec7c1d6c1962fa06495d9723946b1318609cbb7c87c1e952fe8f61beb352ab1f0b4b6cb14e970f48a730b69ff7be4afd9000572c6a83bf45168cb9948bebece7098e2b02e89b0e00141ca8e9e7517c3804c3f1d2233509100b5fb01138f8e50cde1414cb5d33fdaff786acd6f64854ff0d635bacff49aee8a62db2afdd05736e4ccd26ead9b99086bb046250c0de2a53b12a29e81b8f8241c33f737b506823c7259e9eb37ce7c50783ec24d858cf5503b8b044c962af1be529c79f2e1de78d64a728d02ec4e9360d7d69d5bbdd9a13e2a865e9cb6f9bf2c09a5bf98e7345747df37c335dea394143d2fec9091d3d3d237fdabbb4d21429ac60a0b83fa9db382dda7f0d444ecd5ac1009aec380b5a7b6264b9c4ad50b67575dac4a28e96686004f2371267be1cac849ac5b900cc51370d5d6aa11aab3d73dc102d91f329a5e94a60cca5740a9e02531d35e7231558b28fc6455d11b6b3e88dd9b8a59160dd646746125cdae8f19ccb41a47d33083e93073e67ab23d4a04f5c2f76d4b02340183720f52439083195a2964f8b661b7fd05146c1c6f783896e3b5cbf64a24aca407f3791dcf76103bf47343720029dbe239d897bb2d66d766a8ab1710ce4a1ca111d11e17ab3f29168f315d41338845bbe3ed30f5c75a0406c1d3755155a9860511bb05e8b5410dbd6836f0429687d10ae29b2171d0c2b8be71c06322ddee6cad1b6b6b3593a77a724184499a59a00198b83e1ea944ae574f00753d64191bb00d69db13db487946f03d97a9aee4b3ec6e105a0c771062349ee4d32acb30cadac76d5c68b00b26e956528f2d474a188a03489aa88744fd630f0c889b512bc993046919a97480e96ba2dd6525bfd567f95c5588e14d5c2c540393d7e11c9438e07e00141700610229138e94f92980321ba75df15de13b17d10e4d5947122e217d488590ba802142d1069ba847f060bfd6de1bcf10cce23a22515b86c6ca7f037aae88cecb0e252c5d76c113b07eb5a463ca95028861a0890bc3bd228cb77efd30b68fc8b134492b42b5a16b0b292a3ba2247d457844ba775fcefb05bdd7771fb79f40bb60f48de308a953c093a5b3986c06e0f0ca3785e0060295a59529e69007c7a688d815deb50230adfc90c3ed1df4a9f65e27c05a7272ba58f5a9165cfdf07119fcc228e0f5a32eda758fc690ef6a65b7b887b584bfbf54e7fb559202c7a6fc628c82cba006ea866cf288c7d4990c4ad44b8242bbf80f3d13658f4f1f8397349b61ae4dd616dc24d0fb3fd0df0e267c2409806439d14807a0ac4ebfb84803c3cd0d92b0ba2495fa4f8489ce8057625be66fd40cc99539c98f7849193aab82767fd2b4badcdf70d57dd86b0f670d89c24a97da7eaf510b6a73a95592b287824eb7cf21563f0f8630f767e80c3b04c202ee36580fee19fa80abc78dd28017a134093722db8b5aa122173ed4d1eb0765605bda2e82347487c78e065a20c52862cab7d059dff69c5f01ee140330163df3fbc36f989f9dfb39868fa608cd0dcf17b9e3bbe44b4bb31b790bfdee40d8f62d1c6a9e8674ab6d0bf11c151d4dc4808ced08fc03094f0edf5f73123f877967921b0529148db8f49180049836fed2ff509ab28b58de46010ecd1603680f0a687626ff97a5ffc01f63081d6063f69385b5c8b40c0c68c1efd500410a4292106afc743ae5b054936ccab21c7946f899678d57c8ea324d84228c2ca0b24b7fbf3354bc8d5697571ce0c47744492a2e906aaefa9bd2ac2084e205dd58e25d5427ae63f65c905c2b7c3c6abe82e8380334204dbdb66c32722f645b8d0e054d27abcd5773280234feeb8c7fd907c568dedd247c2bed67d547dd6fc58faa6486f50f4da612bbd9cd68c4d0b24ce2df10a2eecd4183753131eb191859768ecef0c32a5f9e26c8e85b068c9a922bfa9e216304d37c2c49984d16450e0d2584440f91edaa6ae7e6e7abb661f436758f067a9f0f43ca9b82c4edb5583aef9da02a6d0f520c3655db6916cfd8a3d8de73cb6618ae56ffdc2e16de5e4b3c86881d48934b73db6b47f144e2d42659034479b1b398fa2ad90ecf6bdf22c923de9e304070793b4d32ba7f4f05535aeb3a0af4fe3c90442323b331a5416dcbea2edc590ea359fbaa8982e73e28485e86401edc51b72560afee7c4d79f87d7e6e1703d360707fc01f17f8a23bc24e98d19d9f37fe1d19ddc2754123e878ba26547402e9367359d40ef916bc289f36a5b63bdf336a63f4e23f211a3cd0afa6763ce09237066874ccc77ddcdde214e406275aec9eecc7c85ecd666d54ff08a508af33c958cb1086f0b63ad85815eab4617d34a71f486d835602504ab82ba172b559755e6a200fe09e25d55b12d49ab4db4f4f5d134688b22e755a7f75d6316f4edcd88f87dcb8a6bcc9eaddd31d9508289271d64c956743aff3f6666f80b7774d44f5d6b35f10c31f47f6a420450c0ba0f235c80f6b5078dc5ea1abce0cb0144cf60f5634e6c24cdea5f4140b581448b6c70950995fbb5d96499dec3c12dd1260f26c81e98ce7a6dcc40398b9d1efc62c46908768c6ce60b04be82c2510f5411ac9898bcc04f469e842ab79b2abfc0aa369e9d993f37457a2adaedfcd84f52a127b854b038b174e6fabd668ec33cd8540aff6c73381732d54b5bcb6ceb2ef10336390e0747247032da9db6b275f196bf65f80d0d1eb6d06713bbab48bcef4cf78011abaca99c0df1f237ddf34a5e09a75fe1563e09425e2e4291d50bfcf6b85dd25fdd9d0174f9e654440e991296c8c395ac6bdf03d54827a437cdf8e61b7995adb6f1d5cacfe2faeaa368be7d37036b4d40fd91900ad7ea668fc0e614417bb16e62111cf5be8ccfd95a17d877a6c900fae797fa3b6162824adedf38dd59cfa949e797cf8b8bc5369bd3ab017d2cbb95fd6637117c08582a0cbc17ffefb5307a512ac322d9888ba36bf4d8928241cf69e0f866146accac95aa59a7e06115f5db1c732e7198d5ee86186709000915a5c78030966bd95c6e53e079ebff20f65f7bdadae2348880900c1229433ec0c5ce1f22c7302a32cbe860549dbb89890f917ac4141fdcb2900eb0f840f1bc1d8e083e5d9dbd3b38a12338345581e53068a07be6a1bc605617b87986124952ced9c7d199b4eaccb366dd4338b70248db90936bada8a417ae357cf54bd41e70fdce12f05eb40b47bb8bb066a3e7b3bafe7aa82e1c32f14ec3876d9f5e0b54e66fc603929bafeaa0799547265e800859f28a0671ab0c8588b015dfc2a4149d09dc8ed197e74a58fbd597ce28b43d56d8a126e508db508dc28b8da17a6880368dd884c0d1276cb9fdfaa549ba4096d30b58c41ad1338387b3479b791627ffcd9c542a65ba49232d7f94ef54d18c3fc60c29d0187e228387598f15337b64bef3f3133e8bc367a01df3e65efd14c8373c245195380ac2cb2b8760b8278470c4b1bfb75fcd9e523f5a69d9d962b4695b5f659afe6d24dbb26a0b67b857083f7f0f718a0110eb879fff0c79a80e5f72c13b64e8e206a4b36259d14fa31cf01a80617e5deb4ef092503ee1a01ad90e7115ef89ba7a92c55196d0509b6c6c15918d738fc1326da169974f6b0da7b77da8ca462181b27d75157b757490457220a7c7e93d31862e1230c578f8f11538a54148ac72338db3c11c6e494345f7bbd3ba0a486f151bb72402f641e321251c08b82a2bccfbd4d8d93204752583dddc8fb36dea1a80fda6693d38b3489ac43440f55b8337d5b3d8412ea35480cab494dd2cc3a8bfd913492750a35ea78a25bae3221590a8d5a8e054e53c9e926120c63daed779ca354b86dbdd5d09ed5fcabdfce30c9a53329e8517715ffb89d3a89a331d37ce70673158cc04e5b75f43be68d78ddf9e63b8b35435bc3812844648c36b4a836601cbad9bd754cc0f875158a627e48f6f316538fb309532b7fbc1a3051b2bc7c9bad1889397415ebdf556be1c587513ad8b04aa66e5dccfb36bc57e03853f52e73bf1b4aeedafadf7756fe07ce66fcc8a14cd8af03069a0e5e6135045f0f8830b3cd3e2e5f23b91378af1b2a22c5b4340fac8db4456a1b165d76975caf3d4c263abeff92b6ee9dd9cc379e8321258ce4322bee5b7bee0ec05357568db17dbf4df684a239ad0b678c40147e73faf5ddf2440e92142682ba82b54297ff48f1a8839dc62cd524a62e932e39d0eb2cc7db4254f210a70f80640df0aabcea7beedc496baa5f87d2a3be20124f456a1262990e93d1e850e0568ed0354f4128424504d600334278146ffc052846424e6ebb233bdb1c561709b182ec7a67e371eaefc4a09c650d7785c588455d3e5c6f2f0cf70799278a685419eda16fa0adc03883ecb9d71f53d3a353038b29fb48fd6c4c804b09e8be4de9f0749e18fc80065694ec1662cf44de97f2fe4fa9fd0cc32b04279c3b1a3bbb18924c98b524a55a7c5f4053bb65713d07dbcf74182e8fa8a7cb1291209a58deb47997b5fb5f281f6028515af21904215cab456e90c004aceac3e2a1757b8a8963d9a271a80e1856533c3844253679cc8f495dda6addbc98d8d8f0b1903b797e6f8d6736902e535e5d7084de8b98a98a265d60f091a0ff8f0415c654877ded29c9eeb95b9aa26abb6c7a21076ac8db903f358e94ce38b0adbe7f61714fa8c028340bcf92b80126181f30a082d88ac0a07c42fa4435ee0dee6fc6917dc0a0ad0db573c024d1ab868d72e876b0e428624964c952ef79fef55f85355821db4fe1e1136dacd26825abeef7971ec42509da3370ea5ff31971d5590e03de35096ccad299602a55047c8ab3485d41563196c5b4d3880ab605c73eb5eb8165ff5ee5473820e93e46d42cc71f700982a32ecf64ff1a565e58ae1a4649dfab17096718e6ff5df6dc059e9c65c4538072336a6ee1ab29d9138d017da1971335e8a71a433f6d13781bea4c80279d2656c0fae2b011198cfa13b0989e228fe2a8c29061d85155d69b51814235b03427276ee228c79a9ff8a3005e3260a942392a9b62ac89181456c40e9665a906e6ea42ea99d4a632c67f6c7958b10662b01541fa53b2e865f3641515d2a685d408db977496d8a610f8977abfbdd27d941c2add24edb67d0d86a7304cdb9637b75f1a054d228c600ff5466a4df03cf5a2b53c367050e8e7179be9e76e8946b9c3917d146c43a78af0756011af07245aa3d74c84752f9b0d08024c532b077221ee8e695d66e572a66042e65d47a505dca98578c8adb02f7d1c2a94c83f459d58f5ed936a9274805dc4ec5d29788edb8b6818d3108f0b73f733a623b08c15e176e8a40cc179e8371f04a55418fc081e5a9e9d2dec90b69cfb0ede5be668284e337c7a6cbc3209698fa366c5c413e3bc0b199c31409c729abef337ee7073b9b1e529d3ae0418054371e9da6979973be3c56b36e12c85374fe238865cfcb55e5f30ba80ef00d2bfc2c79022c8fcc31cb137c6a878f9969921d604ae98899e9d519c75d95171073f12adf00a2ae17d0940407ba4cc0cee2bc82ef564a87d5b0701df35e417cb9a113ced67f0af049aa5953c3aaa3bd40a5a8d56c8280c0b12d4f0a3ffaafae3503637c889eda78e7faebe83bb2b7c353ac04ad8f36c3d4e587c5ec1e0d63c2484b0aab8b297ccddaa1987d96be1209facf100166d11a7d17203d6950cf1cb3bef2ef2d4039120464f7f828f3f7bb99bf82d170ffc320f5f5bda400fc6a7f300e446033bc5f7ebbd4217d853f379fe1b197a3e1b3e02166f4d54394fd3a014b1ef6f3eeaed1cf8a538051b192df38f161a1afda14768b792c609e0b612c2826995414413f65cd5c6f827e922e8b8d5cdf5016dc62db320a212aac3d02a4c3cbd86b6a4381d27be74b4b718502e89886aa485784f20d6eb07a878886e2ced02a9f34d42016b8114d55eb0ce2efe413d6f0336ad4294fa6683acfcdb79520688fd7a2db9fcb9f3e430a24b3ef359467b858b3ac4aae79ec836c62184c2d666d2b1dc3ccc21db6dfcf566689f87e5872e7938524312c563545c8c7c187124f3dd1d4bbcccb0cb654d32efe785d4afa96f5a6ff9879ad1f93bea579049e46edab020ab9e30a9e8e9be68f76e2bc02c51b24328eb2a6d0a3bcce9e4625b0a9bab52b203b50fceeb063d898cf3184f400447443eda016f1874631edd5311134d726608a4523e091b7b8b7eedb22d9826274cf4700aef3f177196bfc1f92e1042be2439c77b4bbc1dee8e5ca28a69448a9014a1a9fd2d5d14b3103bd7cee397fa9d4e34f097f3491a49d50a5fe66e00e92942740839994ff9a88db1c00b8e28102f61d2e0a37e228424a33e8cb64024d34a8de220cfd2c51ba0091c2a227dc84714a60f0f9e4a0fc04cc852542216c5a756e33c914e18e3a297556ac19ad2d796e633de97daa53ed0d66ebb8153f8cd2fd01b197f9c8f3bf89805c694edf192fd134eb942f37820971df1bf096eddbe609563e7637891ef1ffd8c1f557afbaadc7de1cf4545647ce41e51444591b072431c4ec6cf094c2716c365ed2498a81a44f4f10314b15927dfea8c012dc089549f11800b76680a4dd946003ade35ac309a4c420a7517cb1399d5f8cfd91ce8e8d92dcd680b66e6dde5902a4f86df016007d489413689c72c2d4088f5535aadd953295be45b2edf2282593b14f9e77cdd4af04c2d7473b1d3b02ddf76169695ba6320271a1e0d33a00f50c024622c7f6010ece88e03e0e238af667af9d72582dd973e84bc5477593c5611cde8d79285b41c7096313bdb1431520acdae2c1368a2fa5fc7e2012f1d23d355c2bbd319471b77a22844af1566f668bd54b52b4500bd8887a037a843b747bd46dc97689bb32b00fdc518add482328b30461954db7edd1b158a3a2d97caa11059a1bf397ff81b971bd24e8ad96067edffbfa3093d7e9f34639eb5551f3d6e9bc1743d8d6f98a66c9311a14a86f761171f931200ce45d62c34341ff4f677a24b563309b3441b799c2d66b755ed84c571ac1a1747a8e2d460ae239814c142b6ef7d0f1328e11b620b956b5c5996372b9305d001ff4bbf6197fbe40f62d19396234191ad09cd27dcfa0a1410ece3a7355b4e59a6ec71da467360f0a80b9a47fb212dda2a3b2823822511289a69f3a48f6b913207d55a2735a07333f283287b4177c55d1a309be5287b23b94b4f30597ae7a843797dfc04d9d32f3826138f772116631bcdc1f0f252214c0be07a269d9f92e09071221d12e2f4df8e846d6265f78dcf95a07a6a66b2e054cb1f401ad7abdf81bc410532741465850b06d00a282c81561daac2a7945894d2e9ddb80ec7e84dab9c9444ec9a48aeb0bee07eecfb87b305762aefe45e613a62b2e1b5cd2125b945bf346aedb4f1dcb01ff20a70b9d55d445464330a0365ca78ef64c280c25e0f2dfd1f90e9b3dfb8255db412b2793cf91a914d66ee574d8c5481275f2ffc0bd20907ed232e40cf572f650f3b9b20df3c1da05cc511eb1cafc01f3460520d59540608d83bee506c9d49c5dae91f91cd4bf6af4e7ba7ca1913e0e3d22f3fed6f9fba77096a4bfcd09b47f26f1ff64785634666c682e0a2113af42955a70d68095e9567d8d65a7af37ef9d705ad91428222b88276c01a82e425c044cceb2e4d950d3109d1d1f0497bfa5308782de55e93648329c06aa7c4d0216142a4371d0ca5e10e08afc4eda47d343c37b63dd056e5202e3d397c0d212e66a5f1d50406d8c0eb047a8727d7aa0a6f5c24f27e3be894a262862960318f1e3b8ba8a44433f13932945e0108d3ff43439f5743501b415c76d031acc351ca63299f8987ed37e74d7b5365d9057d7fc72a5f8baaaf0b107b854887b09cf2a1c25a684211017a66506fdcacdf4067505129a0c93cdf33143f0cc6615644217bf6c9e21138174877b948dfba3fbef1ab9e99d5a1fdd4493b98040f186aedfef02e1be02e6ee091b958ce8cb0165eaf629331622a5c9705475faced7e17483e220dfa71cf2ae6b04bcf9ba76ad7f2fd8a07d23a8dac6a99ba8bfc929b403f86c64991af57d8c68d8c820645189038691069634454286100704555d647db9828d0007fe4409c9c35e1cb0fa283519dbd3bed45025b60a8e83c487025fca91d8e3e3d828d9a182ff331ebf1bf5a7244fe1edbbe172ea0af4ffa4445a91d168896e42b9f108de91866970c31b6d4d496e00d6f321c933781981aab303bddd364c6ee14978f6dfb448cb4882843516417bbcb6abb0d800d812d2bbdea9d3863af8d9e6af982d0f4e95a1d53ea25534bf23080f6077ca0a2579a5a810dd8615d6ed065d0981a13d10e0215410049c4f949dfc343736edaad8a42d443d0b0ef5b0a342564da2959dcae5d02014c8de1b16f15c0c4db6129e6bc1c1ae74efc756d3d74aa2eadf1236ba95ac256450dcbd78111bc9e38c0aa0c989f6c0d11169ce76ad9f1603eda75de1a7994705748b07e2fe33f707576c80983a3ab82d9235e63dcee29eace753bd8d2e766cb8966be84d9350bc082cb4f71db2e50c1912acf8766193de087a5cb51ae7897a423429b350e314fb57d0fdf3b7419d72c257df3587c919b6dec98ef14278a6c0eecdaebf830875e591f4aa98d9b15c99aff07071b1a98938496a230159b9bcb091b064d44276ac168268246ec19bd67d56453181b12e453ce92666d5ec0b18008d0f925f8188354108fa508834cfec3f84fb836fd40b3b6ca1d7915beb26c88ea44fc9c7de840d8d65cb149ac6bc1655923cb48c449a36e94c256ab6baad13070991588e4e61aba968630df9cf5783a7a0991a8593f0fc7f9fa01769feebb28e8dcdcc77b10a795b0650b956a94597120825018daaab3023cf6091bf7a9cb98ac96078f008731512a3caacf61e5f764d8a57acf0ee61661527361ead048be13be85ad95733129ab05e4d521a1da81f08107e2bfe8bd92533c9d8a756ecdf5b6b9619430b0fb5e4684d0260048bba35ef5daf623938731956b3eacf37ddcd8e268e3bc5351aa6b85367d7da0c0cf37fef0cac309182b6571fdb08775d887e75489865b6380c599551204a0a21e51e7cec8299a31180f4158b573c5cb6d3a8a3bd61f668c36f7337443d231cc60778b249ed011f3c5ac38142cb3e46fc604d40d33084180a7e4b128d0b5c89e25c439179318c088359b3777d2c4443159057c6c5043471bdde99710b04c10999538670a290935cbabc7a2129441b426c046d33421a35e9168b8d4b1b1c6ced3adaecf038539611e5a92bb4657cb937e775325d2e0b5953b448e7b9cbe586af04d7c1aa4442e8813ee399c5fa3a9f58ba7fdc6865bd27df63692294d041a158343aa41f4686de6c3e92630fd906b4c3b16cceb174e2ea7e58ebd7447d3a3d11dc5cff66820d6a0c7364092aa0be5bf0f8d6923bab94fe830956799e47c1c430c9bb6b6dfc9a649ec90baa78b2b359b288af9334259a3bd8c3437ed7c884fb94a0e5eb7ac86471d57f865326cb15618681198e001ac8822833ea83b2095fea41c8af99be51ad2c97308e88facd973845286a98a592e86f5b93f2a6bbcb72ccbe03c7c21009ed392c86cb1f97b056bad56aede49fe6489ad9dff61d489f59571c88fb64a6d7c2019ae3e980265cb43a44e8da2111a8258140c31e93c5d14503913a705a1c1e81edfa348e06d9c28b4dda02d98185868145cc43d72187082c388ace7e19ee9e2b30f4f18f25c9545830235b46ed5838ed0b2b8193b8058cc0bf5abe9b3733a735e2e61ad6a11e435ea32f77530455aa65c06be6d1c74b9e9d385d4be1e41856f62df0cff507ef5f99717c8c98ee151f72a828472a17e73b66c303054cab0965aca620beb0a43996cd91427081d585376c4f04f58e5f74387aca95daaeb2130dbc08acb4d9b81a4f98eeeed61c050bbc0e59d0a18f9927bc5170e403da59663b295e98a1797e5434df7d8cc39f785b7492fb31a65b4ef8b791f26acc252111837b448fef81b9bf0e6d24b9fd718abc11dc1bbb103a5643d45d504b467364907c7186df40c585352abf72519e8c73abc055a8e44e4d0681cd89dcad907254e84ce83b718a1b643a6b564004b9eb36b7340e834a08ad0caecb1f2576c400be6034647b248d2bd3f8a7c6b037034edf8fbeff6c3bd04f3e952fa3d0bd93673bc332b1abaa31b2ac2792fb742fbfc6d477c02204423ea1dd55eb3a0e9acedbed6f182dc80747f488a4d9cccd280f6355226e6e0473f3805489e77c3ac8b832401011f97b6283996d347e97f98d8d639e1142626365a3f186eca5da5a39712ac1ff366e63f74e8f5c4e13f40915f3e1fee2add369bb880ea668564c2d1748035a13c14f42f65c88732a26859a8fcae53f0d84c593fc8d9754df6639d539cb612b90e9ebcb9b0909caf258aa70fccddcefdfb7e12bbe4d9662936922e31bb927817be35362efaafff252f493f97580725810213b3af048ed0b1089729f1705dc2c1572a9060e1314454b57bad6f3505cbbea99fd98490fb88dbaa56ff2221f6faee10835f6e4584e8152668d1715677ec9c70bac658c2dbae6a9a8f01e6ba59b85df1cc63c0c893e04faf53af156a76bf77c707478cc177b71e5f90f9cb422f1428467b6a7c812ac44e81a38c9cdf192c85cb74c727bb016f9e40385c5114e99bc48d5cc0fa09cd763a9d80b5647ba643b0d85d1e288954c35328f1647bae4a7915db438f2f8e3f6d2aa88718ffcaa62af6cad51d435dff35f2d98c61ed1ee68399e8afdbb60aec14c7baa63ef8c38b03110d8fb44b1c5e9b293cd10f5bb0c7c3973f7ca907fdbd72ff83ff35011d0d1029a63110d1702f9d7e61827adddc5b1068d4a3879c252e494d88c7c0e1a77a7df12934e405e00f4e2145990404c44e284bed917c65a083982e55463d73ee058051ed2b5260c501812236ed8137268cfddf25e5ec40b74cacb8c2684c0df7a19fdd7df1346813994b61fb52800d5cdc878571b448da9320894a8269813e96b19fd3ae5a76a4990fa817caff7b9521724243f889eaac25cc377d6df64c9e501d8d44b30f71aba685f85b1ae9857a23d133cb47196b807d4ebb8766936c28bd58d5acad1ceb31cdb59a6826f25cf866d430c3b34af96d174df7a6dfc252cbb0dcf5fc15946a3b3253380be242e3e40079cd26d11c9e730ed48043047f81bca6523027f88a364ecd66b2c083a3dc3139907225dc66263da3513e49bef5ae844c9e4ba4abd3a2ef82f0c31bbbdff516f9d879bba8a8ce59133464d5043e1b1101a552c9f29661e6cc3031b478bd4e1bf7fac6b79e6c09125ce59988a7d1c1b7c278ac13b79f275fe53c8675a7509e6bd4ab87674206cedde3e9af682da4c76bc8b33292013c4ec41e5cf0e71b5becfb528190b58832fdcdee718987cb6ab679bff3d31809e48628a7269abf99e4ec376cdba18aadb642c990f12d3a017e0d26c617db836d2d0296a36cd4fc189050713c7bd7963750bf1059b73b1614aafae80bd0c6e2552abbfb352a34f2639499d226177b22adfa30429c14dd992354800c4b451a374f55490bd6d02d03663f3f0da91fb52c671634ceafb7b7f3e7499c3699c130f75afedc1ddee42e5940f73ce5463f96b857f0073f31476dcc42929adeeacf672f9325ba53c189fe2ebc162efc1a8478fdcd805796455cedf8ed31e87b932b751b006a33246cb2beb94ebe44a9257a5983fd1a9d9f317d3dd10bda11438323283335bc746ed4bb74f4e3bb98d559d000d490ec843cfbdd7587557d462f09ed0620f52c5c6fff7c54e4d593c3341f68405791c1e9b01ca233f029263ce65ea386b180f1e7a9cc5eee69154479bd017484f03269e4cd7f60226e2801227012f713d6abea192cfa6089383c856b4ccbc3c3e3845a507a5051dd9be7c885138d7a1dee1dd6afda4d84aec3b7fbc31c6232af11234b3a0c95c4e4a4e5cad9b56b8b325d69c257a037f38d293feb77a59c1102504f5040612f6a96cd6bc5ea000a626249aa85d0b0fd854c68217e9db8b6e0b1fe833d13f5fbbd6b0788e64961dca7c6a9a362aaa58d508313cc5fb368dbb57f48d9921633a92256bf49a13e4c00369f7dc4566a66f46732945a49baa75198abc50e170373ce3a381cb3bad4b040285654572e6c8213e2d2b8b4407160d4c17695a5d5d9d653b16a12e39ba490ef49ca9c075f2e01c701f725a5198095803ef4601ec5432026c8ed9d33dc38ba021458c24323bfc2345e006b5b029b0434f28e04280ed1443058f53228aaa314cfd1918c2abe80c4aae3f5582bef8576e4ca7a78912fdf9be2ac9d690852cd504e07e59c8faf35bca2a785417339674292cb5a19659a8a98ce9641c48c35dc831bf61d24b09c78c2b67abfade50ef405c288b036d6e4cac9c1271411af959235f602dc3e4e7e882406110f4e47555b44d04e788956e33439d81f33e5c318e1c156e148c10e003d6008641c26d0593cee1282e5acf7dcc4eccee4ed4b36b48ab3ed1b274046a83a5f102f808aa17062dec3324a1e1e6d415ee1e2257f3f93400cb5a6efc1bcfc517024fef04e0a95b3da94d40aab810f24943854a10dfb89b9cf9d0d10fb68a61085800ba14581100af53c3c326fb103c3c9ff012d91db2d44c31579f29f522175a470c89e8adc62bc1a57113839711395c94188003edf748e477550387d636b3f04debf1d65c1974b39c75202235b2ce9e5c5743148224632df292b88bae45c77ccde542c9ca16864ebfae169e04da5a365b1714c72460d4d4203e9385ac86be04c99b090bd2a071e28570b2f71a360324c0357adbd7fcebc8d65c1693c74956ea85bf6e7d823c0268c84ce6a57c7b48e23205e15bd2a68f43606ef4e8d3fc2a1fce594df950c95717af73c00c845b10e3e2fd1d168bedd362759654d113902de61c25859292b152529cfa200dfdaf6161dd96585be5a6dd9ec6e5decfcbbc5f78b99b18b9481fc8db9327b1a384991109d01a804f38756aba10baa0324c6487e339fe2b0db6acdc1096c1051cb303af0c8278869ad1439702bca63293634ddac1856f0147b082fe6332ecad08829f34a72cbcf969c5a24cb1dca073bde74e0cfd183631dbdb1870c0ffaa61d82f80de0c6c4d616a3117574a82809c06a4883ca63e0314342550efc395355540dd8bb8e49c844818784274bfd86465350a8987586625e41bcff984f6edbb440f1ceb42edf8c759aa184f3ee9fd0f06fa6769f98062978f7438d36e72e55d9ab190ef09b27037e477193157ae7b8cf9e808c3bfab668ec1acaf224cf21a41ae7068a34c2bc22a518129f7794f966369dbaf0984c3b4f88d070ca32d4b988c3a18d7bef087233d6ec03cf20d768d41c5e1eca012e434aa1412d08026a5de46c24cc370f8d387030657ef46d4e6744f342070c77771be046210bda3e075d27a4626f16e6a87afb45c95c524aa536f00ae2782aa0915cf5e3bb038159038a58ba5d1824cb04a237d7a94a842d3bd075a37770c7edf0dd11b20a17fb12c05a8223278d57788109a721b8052b0d3cbed9eac8c48e4ffc83e97bff6a9b184118e2c09169e79e16881127df462fbb4f581099a6031e7d8380b9f5499640dbb1f1a445d02d3e9450f96f9c8a5b43eb4e3205527da9fbc799eb5597bd8c761808add79c2e59d0a2161e02f60bcb96d2013f78d97a519f5be94a7827ddae8f6af915671ae50716b64098a2d9b0e309d7158b269248dafcf3666c47cb08d52854803e6e20ad4173e1d7a683d63b9b487204bce22a2f18a2ab87f0a44fc846a3e4c728c2691caa226263b1fcd6a821e279269d0e38ffd30d852947008a180bd1ab7e431a8fc83585c8d8968ee6fb2d6daa3f695837eb558064ce81d3e4f23362c7a30b8def0e1cad6b527ada0df038ed347461d956e7fcd60a7c98bd36b3021513a403c8148f181c03d8fc3f04cdd2b8f8e4124121c408f9f8cc945ef9169c0c8bf072c6826823242e077f2325d6dd0f5de852dd2af1fcfe123cefd014de7237839ef4ae393752bfc43bc6ef06a2339046561c81a5026660293186a703631fe24a76b13323b1509dcd7be0ae1cf6c6922f8013756e8d71108f02ac42473f21f80d70e710e3953f5f1690e22bbb3b8594837409e3eb7519699ede13d5ca6b0aa33765c198d4c0180b2cfbd743afc36777a346276e9fd27c0fc58e10dbdadf3cd45540204d718cd52f8d87313d44fe9b6e9993e519127981878a32203437695f21a5d421d01a8a5c68de7c23042494758ef5d344ca8c3d063d4cb9a570e736ec3e824f575e5d59093de70b271359c5491b5997d2825a5af0112b89a96897d93dccb15ecfeb0488b83d0f731cda2e920e388728daea48b29a32b1adf517079f3345fb296e47365df70aa9598a735e317e060f8a9eeb5c2bdaa2372c3bf5bb2fec4059703a62a0185f0cfa94cf734cd26ed49c06f7a2149d0e7eaa628f588e5d5afc74815b24c04d3e0d306e0ee0a4954f2290d94e7163d5722252b18561f1f5c1476d6b1d75d000c0cf8de0aef25ba24d976d7a7d128d4e2f9b1b41e6d54d5d5bf9397ceef6c311ae8b3a08fad0dcb013a1424a22a65bf7de311aa487bbdd42e7d12797fb46016fd41de6effc87ea790049b86cd186e31c56c448b8554c416482c96d423bf7e449250ff8f1f35d52e07b3188ea7379df6ec42bf30129fdbe06e08eee3481d8888e43ee481bca4363aa6800f53f4877e2ead080625b3e0bd0c71f16640996830d79e5340e91ca80a94e565d94bf4c8134504c581b878cf64f3e87f979ebf9c6a8858786e028568580422ba525584c8b24ea4711b217034fbbe97b3aa73824ddb74df7baaea1fb54b7cc6659acd7c2df81ee5b88c1e7e6b93c82fb04af84b5d583e3e4cb2ebb9a32191397f13b648140cb165fd0803256269bfe1d4020e0c01cdab84f30c5d2b11d43a57c7c3ef5747814508607ec20ca4645a1a0a3e2445d96ef6dc5f7ec5c7c73a9caf42252370b34617b92974017f9924b66764b4e4ecd2fb5814afb2dd413a8a9b12183ec19fed07b5d3839a2643229051139805de8821b962e301161321b1823398e7c3ad40cf155bbbe254af605d610aa6b9f2635b5c065c443d515fd49594053ac6d54ef8875631679637d65f12cbd9542812b57722090da030df62683e30095887a65d7f4e28219f3ed27bfefdab21a31b1665fe59101154698ba9327ee232453eabc5cf943d7e14e33ef703e4b00f891b0e62579567ea8df6063588001fc8edadb34c76cc8f49fbbdaf152e5f60e11285d13358869156283211fb0dd002962200707290494e6a6d07fd22cf3888e40b44d7f8222df9eef51ad11a94117a706c241cbf573f44f6fd502fc345b68cd12ed202b8b89d1072dcd76855a410c889923400d1f68ab640c0ce55e27d8f1e5dee76480523b45abf216863e158ace23579ac4fdbf069fab8476a3afc580859d170050d2d39086df7be33bda9d9881e7a788de0dcf7bea40905a6bca36bc2d04dc81d692a5e11a7cc3a6a7777731c40651a2b5da7acbcd00680c5d476a74321c9fff4ff3085b7eb36103cb0bff1e9b38d0e398e1f9d67c22288c1257ceb910d0f5942b26aa0e31b08bff4c1aad1cf151a952ad91ac6889b2a79e076ac00df04183578208305475e7453d6abf66c03ede7bd3a9bcbe386ec8b3e56e5b3643d97164a06a4e1e04ea7c6b945071fd73c4e12275384f4fbee39271612add7343edcd19048e3dbc72cf78b90bb2927d989274122064d39691326317055439506bf101c5c763070f87fc5cd8233b1c229fdd02a64bbf2792b86d864eccddd7c21a133846ad737deacbba40342702d3ffc1e8b83dd2c273e0cd7bd2cc7691dd290118a64c3965e1615df8bda12fb1218f3b5a0c9f0f79153f4e4590436f6311a08ee66044bd8b8a534c674385771d0d513fcef14b43098489126497774c0ff59ddd5de28df632ccb1a353b40ffa1709a40a073b303ddb557532422aa850e31949a768b4e7603cde96d075c87e492d291418bed49b96cf69e3c651f33247a5e9400c698bfb665b3d5a4addecee71c0057c84847a65a4b0af2f42660d02ce4a8a8c907484038ac40e43092aa4d050bddcb00afbbd70b253bac8233b753990da2223c17f2f03354f4778c8fd6d8d8b1f43c2b7c02e809c0ad65822e5b1688c1f70f0685d0c31742c2886793bb122ab3cc047594d387930b10adfb88ce10d84703ddb75f393dfaa24bc903643b889611c7b03d9b88faf7060b5c43ff8464a42514c8237f1d8fb11bc6c44ddc952f56954350945a02a4fd537c9caad27f120bc8e3278f91bf2b68b998991b1955f374dfadf87a978aacf0fa253743b735678f36bf52b1ff1783f92589e1394568e5c7ea924048eb632facbb07aff3456fa96ce301c4904173ec82c728007a2e7b9402e3ae81b1fe51e980cd41b5b83e079181389507cff283a610c1d4b0aa06641344933bcadf5f6248acdba454bb054066aa3aac8f40a4701a20ad8594a6fdd14a6db03b961347f407058cce7c18cdb50661b842a081ccd7fdc0de7a0f4428b37fb09ff1da08e912d083ab20f3e53fbaad162aed0f8bbff263bcfd34978d2a78e08efca093ac15d8011337bd7617c001d4b5c45253fd83edf9151f59b9b280dd531b3a560b21d2aa37c77c9d25b83a343b993740bc5e568e49f22546a8599d622874e276aae802166b2583a5b5503cef5ae8f1af4c6e5e1314be8ffdaa512705cf7008f849a45cb4c473585e6f892c06f620954f76a077b3c92cc62ca368f2de1847a8b96d7eee47ec584bd8514a43f8ffab21bc07b41104daeb82995c30ccba9a0e251d2a102168e36481dce2c0d163f09bf18284e080c6488505424ba5c256ad2ca04381c9334548b60574387598b96fd7f1d76954156f4dfc445d8b88ed585ffc2104c7858e5cabde0b8da691496b7bb735b9a594322519d9095c094609453b64fad3484b9e93274b261268594af776caad6e49f5bc77ded7bfec7c4dcb4442510f0da81f5e8061ca0b9313198511605831005330a165cc172699116392e4f900f0e1872ac44801922d26808225082856386fd4336008c0194c9c0126d7c7e027063450810214966e505a413a0d71c39c73ce1e6f68ae7274ace8c24486972a5670c40a9acab0a18c33c4389921e50c1472fd1ede50ad2408a28647ec124446d1d413793e8f8e183c5480058a29a35c7f07930a78c091eb5f20450aa6b0c01baa1b971c1480494111b97eec36f9114956cc39e704bda109801e39cc914222d725505084822272fd1d6fa8ea3821b50206b9be0e6fa85a219ca0c97133986fc7c832c60a79be8e37346f5217343806500031a41003863c1fbf5e4c4a00c316585280c20a098510355b2b7e07bb5b8c10d4e4f99f373473c894084396411846e4fa9f4385eea28ee45adf460d91ebdff0866a17f50421b07202a65cdf863754b7271d308ec895e96b784375b3628a1f2576f80835608a57a2162f9074783145982861b6f862875cbf07e88b2e72fd1f4082e4784375bb225a10ee00a36403cc152610c204b55c1fe60d551d1474395dd472858a92ebbfc010e5fa34b0121266b821072eb40c219f20620515ce1417f8708145174170a143aeffa242b48af7755dafa09ba6e2eb17242e50f8c224d7b7f186aa1135d4787122cf7719d9e450e143835ca3960aab61b8d428c68a14acb0a28b5cffbeac3023d7ff2b9ac8f5412c72c8f57bb01893eb03d5b8e4fa3fb21022d707b294450a725dd2e2895c1f842d74c8f52d90812d98727d225e6878bd6aad482899894133edcaf34a9729baa45053830e1722b0105197b8c872ad5aaae821572c5e86115dbcfbbaae976b56c18214797ef73a620bee36518124cf5f7d3184956b9b9e92c8138bce9309b9d65a6badb5d65a6badb566b92087ae297c9862cb0979fedd52459e4f5f3f905133a3531679ce295158b5d65aeb4e9e45042db1f7058ba2498597164734a2c832bbe1128563b7486293b76d73bdb098820595d78d422a494d97292b6437d784992b8b231b1750a0a9c2a866861566b67072452992a935d14c79e1621135c3840b2d2e453258acc0d262ea66f922ca66191343b785118b89122e8b266f04ab2b689d9621544f9c653a62b718ad66d32ef1586cf2c4633187f7554bb2802a9cc25861015a142d69197364015434a9b0002b8ea4a02149920287a2055cf1248514240be082f4399a4c6dfdb295564aab8e272e8d1c9762b872e472392ec5c0c50a3184912403d113198a7ab85549d365d174b020430e3218b1e446278ea0e59d2519a05892a1cb7dffc273bd9c80b224d39f5132998c05195680a48b4ed470845ad0c2ad39c18223eeab091597660af874594a607155392e359122ff52932b4ca83a4930189d48622ad31c645cbb45cce8da1c979a7851c495c971a9c91832382162e2ae725c7292828e14eecc71c9c9121b392ecd30460fa782eef60ebcd0c20d2fc8eeeeeeee186eb6736d312846cfb12f6b73fe25c494835105827e3ac3c9184252b6a726b8ddb382843d665cebb13e2342dd07ab5f2b16c27a0e17693deb8b70dfbd11211ae74cfeb45e7ebc2dfce2aecc7bcf61ef693ecad8ccdf6dd24209667e437ab2bf63a97463c60d6d035ac8fb8ef5716db749eb240eb7928c612bb7f3be48eb65dec345baafc1600d4c9c47642d066daf3c49c8128757929125966164f9f3732207392ca5c615d785a5918cc999bf1f8258cc602040637ce0032d5c448a90d6771f65ec65f007baaeebbec320f88005eeb7f0c5edf4dd87f1098b16b64464cc7bcff3dec320f80057996e7fe8442d2ca50616f7bd0fbb080bcfc718dc772c25077fc95509799f0ad75f853530a5d3978bc3885b6bb88e8d3c87e0affaf9e1dce0aade5ff5dc6c99a3acfdc8300ee563c70e9dad8ba1edec6b2a064510f42efa916c21f9124a3a5296b827cfa2e8d2684a1c76b307190b5142f16f0ba7466beed3126ace6613ffc148618ca498299b4573891f492319258732cad1e752554297e240f553314b563df7f50bc17f72d063f2064b407dfa1c547f0e749e2a2712e33e2a1c420d679e218ce0b92ec0e248bf10fc371a427d7ffbd14b802a048b00bc7909880e4aa9fac54c9b62507de95f8b3c3f93c8634bc41f9985962b57644d8350d67cec78bd646454d39f1479d8978831f95934451ee9a59f6a2a2b8e43764327f269244a9e1ff3c4b52831b2d6535ee38c58ff1870f800e4a5c28d1ebee1fe7020b2d25aa794524a29a594725229250754f5616cfaad1be2c2ac94db263729e595745220b449bc575c07e2df06af136ef430941b46a60dbaa393d2de6c383d95f3757c839e5a5cfb405cdaeda3106c73f78a9baacb7be50c0264851b9970dd95ef6d822c4109b61792bace1b6a2d0e7abb3bf548bd9dce0c8c9cb41c4d1a35256530dbb918db5dab238f1affc3c01e5f7212931d6a7af48064d2069bff74cddbe994d14a14145d249ddd1435e53eb2a1c254713159bef5861c07894eb20271b3d70f241079e4ab96b81209cba317686e28f9e3a2f93c8aca55ad7c48f58ae72742a41f1a41c24074caa111a41cc2fce6def5c1fc6dde8810cd07f3a22330999f79966c72c1904fb27cf9c47d4287923469e4a054d17db9c47dbc972f84e65d2ff33580e65db2fcf120dfb12bf9fd9c8a741a6e3515717dcdfb27858585b8de0617b179d7d77c456a9ee6af1897bebf74288fa202459372b0dae028635d83a3941bcd93311eb974d93d329c51a8bfd0a964f93964dc501ee121aa57492877a92807a5fb181c675cff469247625c9d12ae7f9d5df9b11eb9f263457271686404528aecb8a37040b961877941b9f2b54c18910c4b40e71fc8c854ca96c1acb8321ca1e6f72f00cdcb775acf644c65853e31e2b8012021414145351d4509239dc8a14b1d4d41426a922f9f38b9d374b8f2639634ea94ce9671b21286caac84f2c88a54b7d42487b28b4c924c5dee510cdab23c8a729fbcf84f902c2e618162924eb24ba52d619dd454a46b4992f2a89564902ea16a209157dca71fe93aa883918ecff151e76b212ec77795acbd5729c7176b2c71e5bbcf741a89ce21c7e74daee40298b4d3f94c68a1300ecea8e9f704b7a1ba269b24b9928d25f746de799d0f811e082e4ebcc0c504a83184e6cbaf6b2e80f939e6ebf86291ceefe0225284e4f81cb888fc4d8a101daff345e4e7f8fb51fee8e022fe3a709431d6b33ec71765ecfe90b1f96ef3fae834609f63ff7e278536bce12b13c1f11dfed5f7aaff1b4f3f4aafc6b79e88fc71190e1cda0f87afc7e1dfc021986de01a3804ca3fe48f7b7197cdcfc1a187c9f36138b434f00b872e26cfbfc1e1cb06879228cfafc1e1bb300d0ec1192c83c39efc6ae110c89540599d5f2beee1121163f3ab402d912796dc4991677e9ddee4e0fc39abf48e945575be28e4440e4eaf1263f39700b1e449c5865d8989eb8e83882b8dde5949465d6ef8b1ff2a03c04028f7a7179e73832f8932461bc1eebb1122d87d47c4ebb82279f52dc580b2524e282eea6c51c6de5e4e1d392bddbe5b750772b95b712b1528bd0d883ba3cbfd2d3d9244942a35262644a13f29729f965522134d2abb90ea48460a555fc6c9eede906398fc2f7706024b0e5545d51bf24ee6606fde90e3d8e28676ca4e5931d6be5ecf7943931e1539d81d11d20d3b5957f41a81aabeaf2bea64f4ad980fcaf673fb8ec83b99fb548fe2b1d9b9937545ee13ab4a36e52086bae12dba45ee538418395415d12197dbff70ba750d1c2e4d8e5bb68c206ba0fd48ca7268a537646be470433f72cae176d4e3847b73e5aafeb574433b7593c4a54734949472d8c972ffd1a447b9df33923f5b918cf51fe5de68b93ff490727b49b99f4611eb4b0e3d2bb228748b84b8e1565494fbb7221bb7a2dc5fa162cc63ac50381c52a1324c7e14f2280e937f24e6fe94e4e1bae34e8a314a96c450b6ed3b6a2a777f03a6d086ed94dc8eecd496d4b84706e972016b2f2d6ba5a824d418e6452fd418d64d2e112b640a3586f513b95063291c44107463c08893a21cc470e1c315412c49117534a3a2d4b049c0095210484b556c01430b162b284e0006892701133932753ed0b8187f36b757c6a8c521fd4ae9eb65ed638b438c514afa93cef8515c8cd14b8eef4a3551b76337998a5a26b65de692f27cf9752698fd5eb38836ec47fa21e0d0beea6df521752d8675509f6e1d1ac9f439efbc0ebed0089df282b813417ff9e188608f18f3ffc99e43c38716f24608f3733831ac83cff53fd74975b044e83179e27f9593ab56d56e5ceb762c4f86c635f3381fbd211a35df3eab5d754e62065ef4688841d5d5e3a36bdd97f9f845dc87f5f17be623cdc7ef27add44c34c2d6f28adf556206eda57bd87cd84b3ff149e0c2cf0cc949f48f42d481e8df474070086c890ae81efea01733d8d13dfc77d830176af310503b281a384d5e5e37b89b6c70e85e831baa9110e0b9c6042e9a9e4599cd198f95813e12f552e6b6820c6179386c31de6db647013d3dcd75d4d7611c7429f7b73874a2ecbfe1b0c5647f2f76646fa8c8e30ffb0eaa280639ecbbbb63b7fc09c31d06aa4a4375e1331c9791eaf999423019ea8e0f2304514970a92d2185822c4d542c2b54289c4890274427011347d4b6265078188e7208eee8f172648261492da1d229636cc5e860fc5983129b5015a24253889b1dad1bcb0acc4686f5aacd93a492c478fc8ebaf225c7ee22c76f2f3108a78d9cdae829c6be32a5ca94a51cbf9562108d8f4528e49824472639badebf9fc87cd84744eda489688841351f9f7af6145bd64443c808139f480ceafe87178f31c6da1621518aece4b129c420c7171283bcf701a44190dc9175a2df9cebcaaf0ee7a3dfece2099c4fe626314a5d3c71c3062c49eaca97dcef44b98bdc8f63e3833dec6dfc8d1b30182ceac6d719e7eb6c03ca0b8d8f7ef3937949889c1a9fd3942a35a4a7a51a9f8dcdc33ee7b9ce1bcab1b1b1b992f375a6f175863129d1f862c6e9dc45ce247751e4a9f968cd376b3e995b0437af2f03dd4e723f95dc35af4fe665dee66f6e6464648e6ebece355f679b36ea2691a7ff8bd945a7ccb532c098a1f9641f74d110329a06d5b35a19341f8bc5adbca119160bcfc88821e27d747a9fcc718ad6931721518adc2fd55bb2773f554b019dbd272191a7df931ff50264a7ded413000d72a62a4f0146b2ca474f4b47d6513f2ff7fb8edcefad93376fa8d6ce5de4e98f3987e8f63bd9e818153b2bad95ee94e0cae4c8d40253d1f572646a61881c2a6801e97e0b32b8a0baafeb7a41c9335a700188abca91a98523605a20daa1dd9a239392339894444d2f48321633a53b3f5c1a53e8d002450e9fcab53932295122ef38a14409dc40491253922472f83d3d4877f98fcb63fd4aaab9b13c57c751a970707ab23eefeb56d64655b3727134b6bb92eb64951b9098251ec113d063c68c19d31eebb65a57a6a37165a51c9d3ca95743bd9a1ad652afa6c6b40102410bf6006d30326e38694c98bcd1572f8f4e2b99ed7dfda42c20dc6c09c620dfe13e1debc8838100727f3880ec1d1b87e6ffc69cb37538295dca28a594aa18a5a4966e73d6bad139638c314629e5cab9961de99cb3fb557fce3a65f458364c5c8cf12565534a698cf1467635b8bc26add1c53bf2dc2e8a09e46084d9703d3796db6fc3ed0cb3e1469b29433a5d730c4ae30ced628c118740e594b1975295ce6c49c97594524aa99452ca158beb28a59452cab1ba19b59aad6e46a9ec94895bcf50cab9bae8451c4ae0ca6ec76f88ce53eaea62e49194524a29a594524a6d7c8cbe2ddc7ef9b4bb439d1c256aa5b5ba1cc442d4248fe058667904efa93c82e777106f5b0e558ed5089ee387f5e72aabb6ca7539e2d75a6bac35c6aeb6fa7632b5d63a536ba5b17155cea69b33da5a9fbb795557df7412a0945219a3d71fa2e30dcdc773ce9b5965f64c719a4637a51ae6e4258fe0596a86f4e5770f05e7e33c75725e37382e53029d9bc5e95577f7a455ca2e5772b9b252dc45b3abb8928a2b7174b0b3a1a1abf1c2d0b470984564ae6cda9a6290dd2d251829c1483926090d5232f13061e84c1266d231b015b88a3b779e71b13dc33a885fe414814ead9bc579e5f8bde2b8ef5b71ddcb7d54acf8ed31c8fecafb4ef515c144ba2d534d42e4f1b7dd4d718f74d11204c82c71cfa43062510f37ad9b5e03a4d00a379216aeb3e96a3c8fe5b2400d04164d6bc6a99b76901ef03a9879cadc1cbf08526e26d6cacdd0b4726a60d5d874d14b6edc9187bacd0d2701073f887315243ae174919b9a9a542a2f9c4b94d3ac553d7d57c96d82e5745064efa6d844ec2cd97d065a4e8dce02c10a883c37861a366cdc90403d3d3df267c571dfcabfb8f118470caa407afac7693247cca0a3ba87bf183b56756b50345f254d164af4a7adc53baa33e825620f7f2f5d8c7237214613f7e1d078dde0ccc701135bc1cba8f20512313098925049929464ca28989220fd1b4d773a414b122c2fe2a27325994cb66405160a52b49294548832836486d73243c76ab574726b47abd5f25a1f8fc8ad9f2d26246372eb6f95dc6afdaf00456e3d8824b7be87052772eb8156c8ad99536e254912a3cf67cff33c4f0531d93be2c4a4c2112ecb9373652e27733f392e8527994ba18bcc7939ca036042a10935b273fb28c656837664ea23533a001aaf6090c3a8a50bcd804ad126f2c9611fc9b49768403f66c994bebd24a420d37f2165fa1f0231327db0042032fd9e12aec8f481984a1893e903214acaf48310a520d3ff000428993299e045a69f01fa44729089c08ba21e32653ae14ba64c011f975799f33af9a9b2cd5cab93df96b9dbc9af669ab9998e867375359d8d8b66a6e686151ac9b00e6e3a37f68091d92ea6a38e7bccb9e1c69f2a748c1d63eceed8dd91c6ee27dca42f99f8f4affc22209bd33d467713b8f84831469d3927954e1d989c2955b6fb72e5538a6d94f5ba125b1d816a256537b74fd2f9d58f66d5eab33182f4adfcb939f5bd5a6abf036bdf1b52596c75b0364c4509d9c4001de3733b5f1402bf22345000e3884c68e7b92e020267e14b91d0055f040400e0e2284a28f616c8b80fd991675ec6bf70479699f91fee9fcccc476f68c6a6c647cf068d4fc7fff0170a3766fcd6b5dd0be686b2c88fcc8e5a375afff26f73ffa68efc6cae09c1fdf79ca9c30d5f5eebe2e0d3d40d250ddf7cbbbe717c7b43aee75c2e3a66cc182c3947a5aea5399af33b1ff70dfe0e88fb776cb8709f06ced30f07e77f382725c5e108343ffd6cd89367ce174aa770484f479de04a263188fecb071d72c5a1acc1667b4614f9c4084bda279b3868cdb8345ff3f6551f4a1a77b3a972a85e7a43aa8ae36b8e987138def960f279fccecf0f0653bdfc0dfc602adc001ebff330893de081779ee7c1876dd8039e079f0783df12fcac8c71bf5357cfad6256e178ca89f023cf77bdcb254254ca12873ff2c421b85ec7ff70ff5cafc3e70f77bc4d11b6ed13c100746772b223e24ad294f6297d42975c7243b90ffdde41c096a964b1581deb6547955a0afcb61b9c100115b42652fe944e93d2734fda6c311996fb6553948a8a4c4952b925131130e4502a5dc9dd3fa52b2146892b5f02259a6c9c4d173d0e74bcebfd73fd8effe1396f9f03df88d0dc79f085ec3c08f3e78932362516b20373ac0121e0f3e0223fb003a2101019eb0fb283ed86a5c03e0af1f0ce87bcf20f5fcd6ff5f60b3fabb0857d21d4bff987b45f97f375dfe3e3b103fbf09837d46117eb69bca1d5bbbca1ee5d1feb7574cf7a6ef5dd2865afcd9a94a2ae92d39383c0fe90f31ba1f3dc70e0f78f7b9a83c3435e19c7db1c3d1cffc3c31c78484fc6f1f83f2917e7693c87f3859db717a5b1610cf4641d1adfde100dd8f7309d8fded01724e7619653b9761e076f3938b4301cde1756816190fcfaf971a0f3f7fd0f7f7da10e6e3d8daff307e5869396fb713c1ed293bf9f1dfe6cfe3e188eef93dfde3f27bbefc3f1850d73dc0135caf4bf8f59ca9c9e6a505153535150b5272737f223a424a5a626a524243f8a9a729917f98ce6349f4d452935393dd5a0a06a4f4e4d4a3d6b5a1bf511525212521fb551d37a166b112a2a6c595117b56c2aaa07282af5e0f1f100b953e6fe87b7de88833c3c7a7c3c3e1e108bb0e5b033067a3287c320f987e3577d18d85e7a43f8fffb42780cebc0cbfe5ef6778c819e4c7108ad973df95b2663fd4684769e87061c108544e0de0151087c1eb8481110708fdf791e1fde1e9fe411b66ce7a3d08e0f63144f186b418840bc835fd25a7eadf7aff53c1f2cc88e8771d8015168078e3226b4f3300f5a68e75b6807f74cc65a166b29b5fec6e79f94eb5fc36dd4a851a3468d1a356a7c9d6dd8f8ba461b19b9769ea3f9c2ceafb7f9866e705e62b007e855bf3dad6559a353df5ce539387cc1f04603d315b698c3385f3842cd37ef72798d95351f63cd4b0cf6b83e04ba71bd7f353fbff0e6dd1baab979aebb1b8c3d8cc76a5c51f2d1915f71b05fe67ede34d4c29ee47ddde746df852b4b9afc89427d5434739fb02ff87c890ba0df82afa75c00fdb12fba00e4e7448d50f392dcdfb289b4b966881b4db511c881bff33e80b2a4d5ecef3407dbc886eb4d6a9fdcf9bc04c42758c88edd6886f2481a6530cb270787b8b20a491483a2fc96e1953e2e254dd27c892bb32ca72021d9194c49c6fa618e3bc98ac4342d4edd4a2d3b9a328a6a1a54cf6a71aae73df6c41028dc3ae8595681d093e50f395718033d5985c320d27654023c3066cc18a7bce1213de0ce178566974b8b415dee974631a8c34cf9f7909e3ca427cfef28077b4ae9facff61026ee2929cfe17243497bb2f3f40bb0b3f30dfefc064123f7a118e66fb37fcfef89a11c543d216950547ac8b2cbeca79def0989bdd41cd4a1a5fcc7c378acbfa71c3bd40ac9fd9e42eb3092d6500ef63794910e9f8018545219e5766f6dec6926e647fc3b3c947712dd34504a95a69cd035ed0195e74feb2428e28c07a294522a71f28422cf773a060633c6488113279c7084a48288a93a43539e566a92ea4b511493932f96cc4878400b3424478c9824c961f60025494c3308a1e40149a03a147a3607bfdc558e4b4a4e782d2d51a2134ea5ec7ee3c5f599776f68e667e48cfc5519575a4e46e6391919ee7ee190b7ffc3657dcb71975e7ae9a5dc8febe387b688f8e3c231c65898091a6c25bbccf159cfd18ef51ce775ed7160bf22c929e57c6eca29e5949999796e662674654a714711417a1c788e52463e6c2e711f9783bd4d23ff79e43e51fce72c923f52d692fcc9bbc830eee332647feb0d61e9bc8aab57e6b8c8bd27399555197766d673fe0aba00c8d2822c71228e3f4e8b5f0c8ab97b80a4bfc45362a6a46c6aca5a6855c6ad1a90b28fa48f309e6864f23a80cd23da7d2865f3894c5a7bedfde849a4c8e3f208c71137743146fe75e6412ae54a2499342391ac375d262af5d1d7aa54ef17be72eb0b6d9e42ba1269db5e25b1f538f0fc23f2f8d323f789b2b5979e3295dda5cb29739f302acd22f70925929c9262e4530e27d13c92fdeb064c4d9eb237921e20b047de97b419fcc0b2a7c9ad1543a14940ac9227f6e13d34df061e73202986a43aef9da424e33a50dc6071c3e8247ffec445a450db42f2e9c4b097833b40f901f184b8501123424032d61d6b4e515f28c150c5dd9d521a630c928daf74f9caf366712b0e87b8f0063fb3e31fab14eee7f0a504be72f74b8544189d6adb10d50417471814700722bb39a7063a87ffeee3ca9f41087bfe3669ca91a949d2528e4c3248e56792c14bae3f9da4bcf1722703e2529ef89b4febcfa7923b32790cd8de4a0fa828e01404073fd672e22b7b7f54124d94a69c90bd8833b2632b59e847dbf445fbff8cecafe39fe3378cdb0f5edfc8c8b4bf2ed78d6e5b75291b241f5e3c76d92af5188a5290fd75bc658c42e215c52aa1d65aeb96335a485070220c192238b2811ba0c6a0a054c2962db63cbde045f17483122c6242d081394185e7cc781d95540ebfc722795b69ad7495040d546011a3c313a229b6b43013c5161c9a98f7755df7c6315a48b1f0c2d30c4e2c4df1658b628a3050ee65e264c3840b2624a0b92e262652324e8e4c4c96e43075d2ba59d58aeb58565e4111003916c522abba325f6c2266895c7e8b1cff00d18bfebb86a5e3a4322a6b9b71cd0a04fe903f351f7ffb2800426dc8c416a0ab4d8c4c36400ad16022644c7d2ec47577bfeebc8e2e57adcb39e9e0ae643890b96d0ab7a7cc8c4a2929a986a456cb1b627dcbe3c0b3ea672c919679e71ff88f17452872fc05b8064282282006a9b647723b9b4569b55adf2d3cbd157655dd6a48b547b2b328dbaccea2047902c2cd7433ded0f6331e079eebd7d86c1988535ea441d105397eacd66a5ddbac962405f84f276d76f65ed4b575c6acb596da95da14990fa88773b95c3536b55be5b420cad9500f4c1b1b9b9bd7ecc95ed4b5eee17f5f2f3abda8e633236a2de946fecc7cf8caf672f78b4232ab4c693fab85284ebfcc95f9eca521f18412391a2d9623b1fc6bb1d6760a0009285cbe2c51b3a20769c50f38d81e2b434c996925994c76245ec9f406a554504a63971fa464fa3f4801b104105053aabc10c409327d20415ec8f43f10022aceef07223b65afed0be48354cd0d510aa4207e90c2f85025d79ff186aa0f5b7c209190e75f6f68ced083095a35381080872ab2f42025d767d9d04981c20309b9bee70dd59a274c5290d0a8c9218a19b9d6e7bca16a8520aa5959e014254b14151130b02c8f284620c5084ac8f3b74b850b5b6badb56576108369075a9e4fef9c53096fce39e7bcb88acfa18f5cc15cebd10db91e89c9f51f9c814987292865e40a14047777a0687941060c0bbe9ed490d84cc9987df2850a355a9c6c9e4c417125d560c181862317682470410897a32892ccb658418896a3308a8e987020e30425990bd6056e8b5703926ddbb62a68b40aa3cbc311551551dc2b872232a5db539ae569cb52dbb2406d59a2b62c531edbc026b668a7bd82a6ea525d2f2b64326673f86205da258a902e53b61cca6032a5a02205d385b26426048b1294274a8438d5a008a144c8144d509a8e087932fa9e90b4525a2d78e1d21c979a5ce1056dc9c9931811b7cb71c9490f3b29383102cc618b135c1a26a42d3a90f0e1dae4b8e4c48a0b922c39215a7232c61126883c168fd825b7c9eb89c72213513c167308c68e80628cb991e3120d496a947d4efeb42f3fa39634c924c6ecab24cdeca2ea644e30fb8b946c5f1eb98c1283aa945f3b7ded25f2d8a75fd71cac12833afbdbb73548a61dd94a22b2f5215b1db27d570e97ba8e6e2869921655ef82726592fb6c336f5f1a49c9e1502a65fb5151dcaa5379181e1585fa03e2ceef1cca999cd99ff6673e6924690edadfbedc9837498b3cf6372eaea3107d5648a28f6a87f6993cb40fd744f4a150449feeedbb0939b81231a8b3fd767ab7eff5972cf1a7919a3a83bed26664db28c8b6bfc816894bb6d6beffd05092c49f0cb808da3e12d97eec22b2d521cfc0c47ef55c4f6e3f573d06d477e170ade522875deba4b559becc7be00f0b222303f3e02dcd5f07ed47a1d7a5c130efa310cd47a10bf360e6657e06c33c0ca5e6a390eb6530ac6228331f856476d4a18a4130dbaff97a64ccbeeb039231fb349f53b5efbd878138686393ccf7818cd9bfd5daaf6f0107ed4365fb8d74a53390b3ee61df43ba32abb556ce3bdac9aea37226674d29fdd6b4b3283db3cf51caf2b2773e27d79a3d25f79cf4eaacd6fca6b56fbf8f74068dd43da2676d876d1711b4bffa7a8b085a29eb1ef66d7b1163f64390eddb318c5a397497451e6b27b6ff61b92b4b439a6f71c8765af943b61c9e13e987a7dd502737533fe9eeee4e8105df9698d88beb3fbb890d377a584a13f7799913dc59420e6bf2fceb8a41dbcfe96097a6fe58002e72ecc902a4e2b1bc96c8516210e33fd83f7d45c7fc6b5051397ed857f48f3ba970c8c3e250878d1cf65383919d8bee6de4d067339f55e069979b504ca7f9e43ee184623a4d2db3cb84c2a7c824242f90b4f09991cf7cd61598451e7f3148536492ac85f19f98524c420b2d4d579cb2cba7ecd24b76da4e336fba22bbf8ac27a7450e25174dd28718f39759f4500162f9255e55b23b11f24be4e95a3fe1d87a67350e7f83fe69619914f2c861010ac0fa2ede4b4b77e3150ed491436fca8e7978412412f672c3396b2d1e94a0d2c4b484d64158ac8779e081f71b863540f5dcdb8779c0c1a4c530676158c51e744f571836b1072a98c450ba0dc31c43517d14da3ebef7592b1de3eb25f8515122bb0612c8c106fa2181787ceaea73082eea7034a600f7f11d3948ac9229b5d4e577c45de51824a3d71e02bc2c710da4d537fd0f885bbf33dd24f716e3d55bfc41883807e3aa704ffe0fe346196b9a8392ca98162eead4af8fe867420bb551c4c07f03e346198b42dcd32e6da3c8e3bf857139b74fffe949e23e52616b44b123893cfed1480a8beb53fe3886dbd88bdb180a7dbd7c4274dd1f470b37eca7a7277f9232e9754a8c31c87c70c782e848efc84d73374d36b1ed3845e48686eb665cffb069e0911b85a2500824611207110a6b8ac8589b715be68ec3042476c05e2491d2332497888346dce80de1143a02f57b9c6d447051e795dc28e3d634e36f3fed4f4e2623e2e07cee05c38d1edee186718a88aa7fc619e777b9b218b42306adf2acfba99247befba28cad6cb2dcf856c61f1b0011f20108ee038bf88bdb0f10199b1f8292a88b7e7090fac89c54c62ed9670e88423f646cc65509d1845b69fd721c9c8d03c98d320b064ce2da1c999e3ce5f056c182e40913201597e6c8f424891a25d01daed3ea3ae5d65deb477fabdfbd75779d34470259b9d19c6a5f39decf6ce395e3edd0696d9ea55c51fadaaebd76a3af1c6f874e6b524bbb4b819b52caa77f03f7e8f89c73ce493ff6f4a89aa136ede89cb3937246c5182395b56ba594527a2da5946e1b1254c61869ddac8a524a6b8c91d6788c2f393b2be5fcea54553a372e0a183060c0cc31130c183060c08099748699632818304761cee0a24ed8b5235b172d99cd365b8ba88848a9e46aca71f2f1a4211670d07f840c38e81fb59a12e03e90dd1054d77943abef9e257b8040ff97f781fe4a5468f2a7993ce6b6afb41114775292060e42791deba35252126773582a57917163ed86317078c891c9e315a6274732b54adc1085c6ebd4c2930d275ca61b54d0a5eaac40083a850d4972e4fa53e74a0d5276e4fa968a5ceb2da2883bbf062436d01ca851134b84bcd06484059329a3291784b880549bd87ccc923282b833487408716768b8e0890f31302e54d9e1b6725c72018a1d2ff7e6b8e4c21535725c9aa184292a318733c69c79811873ea2f7d6e34b640e44972fb093339790f3d8b41396250cc114714b3f944b325f46d8c71c39ecd9ad6b2af8b965c99d0d3f7f1f229a5b321b87e1a36b636b926bb66b24cbe99db3af9b532cbcb5de6b84e06a5d8a8248df745392ad19400000001004315000028100c088402814828cd835db10f14800c7292427c5c369708b324c661144286180288018400038801305354e3007682e79eee7040c7e23542471cab3e8a5010746afc592d0001442be9be613fda755f3bff06fc67ae8bc9ca997de96f1d991bfee11f78851670b5b4b95668efef23aa28d84cff32f9e73389ff847f590a00db04c296af65c491abe3239626006d70d79e1b50b2a8e531e915c542949b08c52a423b61c2fda524c05831051a9755895e1a838004331485d7366eea40ea1053646b76a6b3398ffa7bdf548259fbb75d0a2641fe4b53720ccb00a8e2a12e7265874ac9fe1c9598a0014341e72b10ad74c411e5592742c7d0d6560d6e2bbf532d6e3b93e5cf47dc076b5e091e66f6ebc986754743fd6af4aef6ee3a306529b3e65cb17656e46bdba337a7172f212c7dc14a71782b98036879eeceedf35b87e932858369f19ae72d42f10e70a33e4b73084ebd9d2541774ed8808b5d2434c37bda30b660efdfadf39df20e4b9134759d5195464f7fb9e90642fa50bcfeadd576406b94d4941d98490e3b8a18b89e601e2ed493990b7f6bffedf0b768360bc28de26d84ef4c2c1b9172118272f62bf53f842898cdd30bf1538cacebbc17da9c752b2af19a22e18b48ae093c0f38d82df097090c7ee2c06ebb421126d1c4266c9b584e3c7f902d10fe7e96eaa9665ede7e0556184ef9038e40695d5a9bee647059f5c304ffb41a0a73d6cc0dab4cf8e8360a629cfb0b172ee198e0fd13b5ec739f7986cba0f06980554f3cc2a3e4ce8d29a624ccef6d7e09c0c5ebbbe055339800b6ce564edabd1fe63ccffb6a773d2d6812470681e7aa4a32e34cbc41a0e63582ace32718f8bf1771e47685e7db024b98c5a8beaf54ac4ac370b5782cf42ce8c0c190ae653f34ad15f5188a6168b383498461a09652f82a8a1aa1f530afbd18776ff8850cc83b11315bd5bb196e62e3475875ea6f3047d5822bc946de632dd8cd6fca0e287071e47bd136ad41b10b8496a6ae3876c5d8e381bd6dbb1a94ced56d323cf21353bf045b32e525b0e326964b11344d8aeaf6cd8ef23836171e31b7f7181a9ba0ec6525215513c42d561f3f0827d887c190d0652c7d110d751f2ed6c67f011590d1e39c94531a937ed345eba0b992ce21a48d4ebb9d0de364478d859e0dbda75473f819729f61af4905bd86cabb1f27206f3be97e06d9d1a73187a168b7bd811eadd8953b27b00c5eaee05d885db156a8ef6c4a801525026cbac229c472aef2aaafce5ff7a8e79abd1b6ac827e7e458f481e0b791cdb5c7f5f950f5398db7a4ac5ee6ecd3bf9a2e4992188fc8ba142ef93b5a0a7c7e357dea81219fc92fad06e6605d5d4d80d86ad2b506e218a887b4fa9197525f82253494a9a1008b27403dd97f83a2a960c9c57308bcec5825f0250c6b865ee6cc2648aa84018432a72efcd72da302166301ea4f56e9f2fc80f0006b6507f724242c13f630a8cb1277843665c572e9161bda2a4a65e24c5e3a7ad532b5a171a3e3d87cbe23531d81d99a4173d6b28ff6c42bf6eac3fb72bb9e3f0af4d2a42c1e84a9a0d1d271a7a0a2820c7211ea675bb18b356681e60a28be3fcb0dd198b81c2c7e2e1a9237deb891f2eedf971cade6de3593c824b140b528b206f9efcba4738f2be492128ee5401d147f2401103782899c198323182f9deffd9181ebed7962c5bd5e3f9f34fbf6646fcde6b006d3cb342c8618f122078e02c77d27119ff066b4918c31fd57e2130e7400fee29e9010d144ddb296c9d0665c9e3de67ccd0f513362b26ab5abbdcfc31ce12a2a91e98b3314671fc95f9df63b3690ea1759b18b9beb2b84fac899206d6a80ff66d73863c79ea7f39021fc9c8496fc360d121079a2fedbe07955b2751aa6e1516b55bd982b283d37eb7f959c43c9ce3d7b94f494eec30ab16d60d0efbc2cffa157921afe127cfe10a146fa8484968cfa0eefe665107151aad7b6bff957f9f0ec3779c898698d4fca929b73074ea4faf5c8a6a7171bd3263cf97a169e1908adeac7b3d95cfe1802fa74270a3034694de89423dc548ff858e8f22388b915badc1b04d8457c32b64b9051960a5d4ad684b31c2d8543afa5672e85b633537b399a97485d4468f74985ad28b5b624dbe2c011bc1599cb1b98061bd21eec7b63b66924c3254f187d00232fafeee16f3ca502a79ae6c4fbb6e25592463f7ee7eb145dbaa4d7d32ebe4b4548db2520e3682c79a7ee34470ecbdfb4b6755443935f664bb4907bf10c5275e485cd70559b01953e147c477f91bd24db739898e47a03d6e9afa1cd9355437f3a3d2b083c3a44addb3f8613544a052804c2e75674fdbcf836c4d3755fcedc7f2488e7a9e99fe1cc82de48ad6ac17a0a9a2ad38b03d2c57bceb38484b1678aa278d574415bd3e6d355d12f02dca12677f77775506d0f844e3b3a0f4c3cce3ad081b09c3e394db22955bbe392310cc33bc5e76903c2c46541748969f6655e1986febd04cf474b1ea758dec9030fcecc1dc1a3e4d967545d7a00ef220e1a127b326d585dba2f30da5da00b4181abc7c1e3f67a9a30b085434fcca8d848267ba21a7b1a5b7634663975ce777d0892c1cd96672a6b1a646c7ab01d863c832c9b47fc7478a0b3f07bd39e11d8da08cbb2787c4e2e6f903d2721e5ef59a2811fa7065e19d64e69e1f9a1440147a8ee0650083dc729a4b0d3609e47f7f829fa1a9b59b9b06fb672f996d43780981c3e3e300d247841f76494956d40f9529c791dfac074537bf78efd8e017a8e05b986019ea70b521a24024e68b525b16986d6d2f8379c909608178633e390fea3617618e8ce5b833088c111f6d03156e9f1f4d3059f58598669a8eb0aa278eb07425e9348a17472bbe5c27f5a8051a853dc0ccfd5c3f685f13ccd4c7efd7c0d1bd3f30cfcd2c234fc5f4a29d24b5f0de189f6d67d5a7f0a77c48e1b9ca785d1c02c3ac557cd2538f11ac84f54fdc5c9644c2dd0dcec2dd598292c602d2549c45282c581096f4b4a00d08cdf503b70b33e37b54fbdaf4b987b72da3501da27b5656979f7f0420c11b354d47d34f86cb3aebf5aa992819b0fae6e8298e599d5534b776bb1fb69b56639ddd2f2aefee859ef4c5b631a772e7e416d168dd080816f4fd409a194df7faed7765a51b58218501608f5029f9714501e090a281889343c139186a783736bc48c699aa58307a278acbb86e5b1f66a05c6510922d111a0f480a0693a2251a2d0b98b75edf55113c98962c939d21cd9dd11df61ad460643519705930224aa3114acfee91f2d9232e9c8889f12ac2aee97fe262a7299b7c18236e7650740e0ae8889418646be6239c3650c8de14c6d503763dfffb5a45c0222af22c67151eb9627e2686df42edb06e6ed1ccd30c81ab17f10b428b7dc6eb066b5548744dbc33f10c037b9857b166eee6ed0cd9098c744cbb8398241b38253d37584776b7a5f479db366551e4b586f720b7d00ead598bb921c4548f49d9368273500ad01c914a8456dd005a4346cdb2057ce80cec123fbe5bb3d48520c69b367b8e6d864ab81193fa1555ccc08780686a0370be40cf22acc428360e24f018b180e2a27e9598631272b0bff68a6b02531fb6da3a61530c5aa804575c7573c8709557022f7456c2b33629a26c076c98a98a8452242558c13416ad78b4adb2bd2b972a4d3358abf44f088dbf9111c7ec6fc9212c729bc88767724d99ccae0891bde99eae80c2589ee2b3a033d301d63b22c5e209172ea6b02edfd11af599309227ee974f38d9b77ce70a4bd642ef160ffd76e853d9c1fc7a27858ccacb653af36aa478d9a6f9cbf904d437de6771b70b761da17701c138f5f1a1d2dd0930c9e5c7a4e0356f1bd0e429b2144dcc345511955bb471514771f22a53bb5ca1a178b9229cec2760c5cfe549c60fc54b0ddb8f484553cf035eafe0c508b0837671ee314c11f1dbef267fe402024b97b32b40b954080a3e7323f2eb8e58cb71652bab0c1b246bb912190ee56422e3831b6f3a6698d4051b311192485e565aa53f2eb292848669909823d1852be4142869a19752359346daf96e7e49f85f2e152cadd4259339af1658d6e457bf0fd7cced16c8e686434a2fc5c0f89c62d589da28a96b452660a78d87aa8711faae79d2732592b2bd0b3a560cad54c9a9b086b9046972729f17d53d04f9d32a9fbe5d9d0d908c1782bba71f3f0f9749abda0edb1edce33b191de79aeeeb9ab4f6b7c7dbbf1932d9ccca879c11ede04d96dfcc4994ac73d4d8f5e5701ed1038133feef02f4c01a2c8d3d5b4e767a9b512c33c16dd7dd359f04802fa2e9903f2486ce933a53a9b84348997508e10fa63c50dc57d0accadc6004dd37791cffe308d2ec05ce42c60dc60b4484ece62c7a24c495346cc8ddd71984877f02bf4c338d4ef0a2d4ce2746bfc5a212aea38545c1937008cd03e20b4e81887a20b2d0a6a8a96870bdef54f5e943587d33c9eeca1511962ec300aabdd9167a2c59048797045a4b002a626c624e4da50a2635de6b619b2af32e3e0351635b254d4870607f183290cecd3271a8835433d7d10d129b194928d6a5c06bd2e94e589e4ca8ae13c03d9183a63394e3cb220787b8289aad9c6236d35b496023a27e85ed60a14c75328b3ddb69c7cd0ee4c4def6f1b7289089795a029bafe62f7ce585bd3cd1814cfd090cb0c560f7d370d91184594cd06fbea69afccbf1f1c20c31e15c1783c4b3c144da257695487eb793d0041d88b8f60186bfc9b607f2a2446999673216bd2cc7060ac49b079ca05bbe83f83a41dce6fce9afc7b24af4d55481f59de189fff0535159aad329a44a05626ebdbf1d94d18b2657037dec74412c9c000fa5ade20e3e01f49376b6fda09b8b5de67fdf22bc3e040e1efca4a25ebf80f3d8e03da89ea107709c74a49082e39f7944784c2a29479a83c742be426d4c95779174ed814c5b3a66b151ae1a52ddb3355aa2a22cdbff22ae7695c30090c2ffb9b46e33a0b1bd500d69169831b46cb5b9673d57c01c481fef575d16dd22ff5b558de252620cd732e68421f18fbd2c2e9a3624a981e56fb684f0e296392b0ef94ef77a13cc5b4a2eac92d805d51f3011019024b492496b40ea0a2a8b318473fb9a6221970200b4311c39cdffe6832770f85569c58da0be34673e2388156f074aa42edd75f3e468273306993682db5767d3711a0d14ba75655a4c64b9061bb831b6e5c2d0c58872fdab87baed90ef512c184250ebafeae305c60f020fb802c6a169db66651ab9d677a2c971c9b71531809c1c1d0bb6b59a74c33f30e2b32200b2328513dba98e30a73f4d20c3c18193dc02cb46e52684d3f209ae0d801de4b70167bc98f5ddf0885aa2e28ab142cfbc01c99be142caf3b3bd8e8b5c202df8b1ed4fe24aeaefd6b0420ce74816c33135f48233dc4a011ab8dc4cc13fdf762bbedf24257875e2e2d15818a38cb6617283417a8aa6c6a6c36642298cc7f1a17b65ce4902eb64bf247cf84abe02942ec4cbeed68e0b9cdecb995a32ec72683c4029fe4b2d82e946d458721ffa229c887196ddddcce7e20f42f24fb7f012c40c24526581348d93aa66c09d96d1e908df8643270af9e9fd8fd613e256b8b7ff340eef5bdc6597eeaf034621d3137ce4684aeb817bc76a051dcebf2691a296732082ccb6120336e69948ee703f4c50062ec8392a5adb464c004ec477fb56f457a5ae661068608d04ecbb556b577da687a7e67c73627c4c47aae74210fea689cbca5da2f031b5e06d625c1430ac87df6533504dc9f0c5370b383172d82d93511b9d759c7bf935d5230c213962a52a49bcf748044e59be91433e2ee556ff6685ab8fe3b938be2d57db7285684e1e0eae17fb4a2d6ad272da5b729a7c2517ab1e0f550c977ae955c16cb20bbbbbc5a26a2798f5e302ead4183265370dfbeb229a4ecf2398fcdac89e9634f4c60978681e5712a064bb8e2b07a43ccacf7ee08b4af294d8f986bcb304ff82a3204a0a487b72a8f45bd8aba3f8a2333137420ecc71c2d1692e24dee4c63ffef09b67e1dfbcb222422bebb4e1009cb8e2d1463a353529bcdd97bcebd6da2f11c86089e3f20c4a63341ce245ce4ab3de841b081865ded615e8354b45a77bbd8704905a06d50c1c17bf0bb072fa79fa07617bdb52f5d68ae777e033d8ae8be6829de3a20183ee72485f73b921cd56b5a6a3ba036a1e1c4c89355856c4d4b69133ada1997ee7915b0e6e73677a1b48bbefb015595566054de1ea727e2d6513f74c7d52107fd901691a4019422bf1809938bfcf6ec19ab951431acb030ab3dc52a071498643d027a1d41adfdb31dec49acefd200401d66f30435fd0a757f15e7340f89aeee55f573e065bbffc9b3d275ee4ed7862f610d47edc0997caa88ef533a590fc52f082a472957c27cdc09651811966a5ae676a1250a11f912080ede317449c7c84ddfe6659d5d5933c22814764fce43e42cae02fdf3340f4d0a601843d8cae7219a9acf4314d4a5cb93c2eddba4f9bbc9bbcc7effb373a88f34a5bf444435f11eb76f3934a4f404add9282378e3dc15b06c008f766fed68d1e15bcb27a976bd9fa54ea0201d986bb5317f40c31cade6f4b4c203aa967d2871214ee5765e88c8b4b6401faba2b4b2302c0e529385d90b4430c657b15531b57f4c8e3373b01c225065c016998af985014e5c5e8fe99893b300b96ed219b6b5468e4ef9a1f0b960456e299e138695be55514f1e6ae3bc8ef5f525b9884aed0674da427341e50163e1da6e72a2a2674d8678cd01634473defc80520b38ba14dca438d0617ae9642afba9ad3834305f7fd74cacc9ebafac2f4c74d3bd68ee6e827179f52d9725e6599d2f0d79b5668c53cc76a502e1223c729f20893b2cbc85ed5c02ace565c9c6e2d7161e9c96a6eb1ecdb01c9f549f260cd4884599906444059193ea5b27495be531a64c60a375d1caf782b9c6e87deee7a2be5754434dfe11dd10ad41374608285e23ed834a44e2442f4e804e885b556e7a41a3684600e6bd80bc9a21aba2f51024dd1f6491dde1fa6f198ccd8f5ce8fc56d8af9c6fc798adcb52e96572e90a051e1bf94dd36e4bf40d851920eb87be3ed26ac19d32effd0d51947f1956cbfeb13b0fea0e74630915d1f79bb786363b3637f9f3709f894cc5513391db01cce56e827f34738c26fbb06043b3cfc08152ba04e20bc4bafcb94bcc791e7560f054820f3226c58715957015472b5aeaa6bd0fe0a0be6b328e14e95a1ec28928d1d3dea3d85b07d9f2a685333acfd0f4e4f9800a911d2b83accca03ee80bade8909cafa71bc4a738b05d56839f7681b365070707c19a06900a71851ab10e5454f3ca17c793b41cb38e1a70bd96a2c38d9d84c3172032436bf3e81030d26d35c2b1de54350d7f18f24fc4c70898a8ffebb14d378a256defdfec1fbfba3e5bc54472d344fc1ef7b392fda337fb208aa4acba81da0b9e03f9d71871cc1142e40f09f57a2afe442b077d05dd98921afa5289630a4f699afb81ac776a99dcdbb919728241c8b28701b5eddb2aef8e245b88407bea83b0ea893442c61370021a03e5048ea818f2e90f81ed46c7cd0e25827071b00f4a01223fa40171e1642ac94c184e212486ce299b2988515b187ca3ad1c9f45d85bea3fd4705443952de219720fac7e540a77ca02d466980e21dd140d2927d38979029180f10de1c8fed5d368ccc6f401978475de5e12091c62d0149f64c615150fd58f30407cc2bb3923d8da06da6a8b5f52d1529eb9929b32843ea11c5c8baeec819c8afc5848763657f84f6dfa63fbf050b3fd82485e49c30e29d917c29f5946fff9e6b80897fce88e0688ca7e2b878ca1e44fb4b4905502d0458041ce4cd42f948099266302ece1ed26d686d49881806021ce9e148021c6b21d0293424136d047df2ab35930927f1f41c73f42e9bea61765b54af114dde4b3e26234ebf42bd1108696765729a8927443bb53311537c043102fa466c854a4a4955ae5800c7d479abab134b365e59e9c72e83c8c8ab35a728248464794c4858ad14339ce8d4cc57b142dda3497775dca2c1ba3412840d623bf28f6448b4c2ea5d1f283948cb54924b2d423df8761c4f5782c3b12487582925c3a10153ea7bd91708e9196f57115ee4bb4f19708bd23d391a472b981285e486766209210e2c518ca341884bc22cc84267e004cdfe15cac0d7a1062ced52d1d44e1117ca4230a6fb57bc33300f36e9906b476c724b6c13c72ffaa5528c0b5b45764c747b46715688ca847a7153213de367f2b0c7eba016e299455b69d31e82bade1a677fbc3b702fae29a5689e2c90351cd1ce808b12257a0a81e02d7aa7e65f88953bf44ab5bdb6dff66251830ca3f25bf540dbac8dc7b78cdd7e29378071b040de96448ca954ebfe545842dc40a712887f35eb0cd32fdb6489e6cfe715c0e903e8b212b7ef048abd9d66053fe02d60f5ae16d1233a2cd5519050a92992ce98aefb72c163e35ba664a259f6c17ff66fe19891cfcf0254ce9853a8f6884c068031b553d9eb990ec723dc06ceb9419689a14aef187d74ef71675614fb9d753af8feec9d97c89abab3ef8f450f55e13ac0e480edd2f0fc0e53e256809d011cf6b854a84eed9c432a33f348725593419df15eb381a2e730121a881abf7b29e600d6419a008340565bd7c866e6e10a1ccb6a9049ee9a94d1fa35c5c19720b6e25f54c61821879078a03ceeaedc6362bcd0898557b693f587a70971581fd0518dd6a83d2bf9cf1f05f2b30a5f0ba290f83849587a3b795c2d1e350b25e273b5953d8ae5c8858743b5a09d0a2e9d5f772ec8f1226703dd47ef160622d3fd2b5787f17963393184a243ee6fe0861e8d48cd1f97505d6701512ef41da07bb277bf79bb973027fefc9c8a34ce27aa50a99e207e54bb40970cf63c88c8104068a675d515910d24b777619dac0b09b022b7f8e6caf8ef2c2d7c91f476f89de58c90d4c611143a7f772ca2955eb543ff0d7ef5bec1d40cd2b6d4ef97926ae1b98d709ae9a819389e26445727323fc7664bdb1c8f5bad2ef90f1dc82ce6a4682b7a9effaf169adbcc3db015b357fbfa8f9e773061c9d42eb22cd795192f4da985833de501e775f14cd58af70cd2a2c1e71849602cf265dc8a5c654411f73d1dce6997c1c6a02633edfb26da42c6a7006728ab1068f80141fa8d5f9630084026b2524186b34ccf9e3fea705dde4606a797e1c3435a1fbfe8764e4e5ee211e55cd368926eca0437fe0040fe3bf12861dc21bc736891b23112631099456512cba94706e56f50e175c1153d36ed93c85ce8ba194161efb5f9269bdf86ffa35e626f65655e0e1bbd9becbf1853d6bed5685f3fe1b2a08c3be820f2853b5c9e83c66f28530d135641343e3b06498fde7e68de70837ca49b801d8a91e9c8164e23f964979e99766431b86ab2fb4785dac439876afc34491ae029c7548401ee818d7bdda9e00a795c303b679c9ff49ea7d00f5587c8faa59e6744926d643ad35d84e2f8a67ade9c476dcc8c19d56ad6ed1456ae4f0284815427c49f2277f59fb1faa29c6500f1baeefe9cd0df345e1a66bacd6adfec55cf2a2d2383816b48b6efa53ba673f121e915511ebf3ce246deea71578581a904a5ebe1692a8b71ea8fd9635ac82084625148c9fe6698191dd9556b745f8214b257c41a3962df35058ee57b6dac70ad887e76b6dbb35515cdb62c320d3b8f284cf94ba2e53c8f8a6cb4ce4a49b607125112ae54105d918f8b80670e8ac050a41562c3c73436c8a928bba6694c99dd5d1bad666879203eaadd31cb33292999a40d16d26befc6fdb6bc931622ea8fa0333843a397118a10892309441a83b82f84ae0fca6987d56972dd553229fe2ae1e48a80b6370d030bb131fbdfdc1f63437bca62fd35c4790ed5ddf0f1b3079231a9926c135072c58740cefedf2ad536922e3012d7482fc2ed5ae6a401c11aebcb0dd28a0149095ca1f27a8c13722c782698351ae6f7819686799733555a5b22029891d732a365be636474ae59cd31dad8c2972e42c6ab1a04b0a43a9bdcf1e6f1edc8420f10b7c2b189e148c60f05ca77d8ab184e0ae977fc8ebca2c4ccd8d7d03e8f46a4f7797ade07877c1459732a0898f62f1dc0476fbbe4421c6e7dafd02c2b577a4753979b583072ac9739b79ee952aaa965e31bc34a7ce2441f7605457739c0ecf54e8cb11c9604679b01faa0191869a98bd942d11ab993285655dbe54e2e920ed5038c202d18cb7a9baba3dbe66e2dd025ec5685e2738e3c10001ee0f0f548a71e4b47890280b675a028de6f66a8082cdf4a539cbdcf2959c1a2dc148efd55218fce24d410d401b64e5a43a2bb4bb8876c75828931a1b86da756dc2ecae9c4c4d22396129a76274c92f0df2e88753bef5b4ab8fa9a8ced53e2352c16b9b005ee3b5dc14855520f2f59fe210e0b82351c0517c1d8d16927c681b2c7bd1d42a6962093373ae9294fb7cf176cc3eefca7eb2ada239f4609bbae5bbab837ef2156d40c830203efcd2f0e289aab0a138ff68540dc0712551149b4586f631ba07d6f85004ea84b28c1cda635af7c3b231733798faee680fb909cf1c6f9322da48d17072fe433b64c60b256950312dd51b932087bea40ff0ae20ea468cad25d79fc0ed37b3b9305f7864b111ba58cc4ff7d23fbab72170baa458590fde830231d98caf2be60abacfa9150243bb86c0db1504281c9fb9679f33eb505ed5204a9fb7e5c8b56b3dd3788d328e2a9d15b445f9ff60a133f4c6c319fc1dbf886d6c98a2097041870447cdd7738b7c81424106fa275153a68206ee7f21d92da4153cd83c944f827cb786538db0334224640a096050075a01044200eb135ea712472cf3fbf96a67d9180f6ef247f0f89939e90b159fe1f3786adfdd6aeca0e092c224b8006b17751584ee068b5f5695e2966b684aef5b11aeb8a8fd2044275161210d9acfc8998ee926e7ca16cf38eee05303f39a2bca2f8e081954032bb78bcc3ab956a5b2060648fff8b5177eabbb704f1b5555b5de8b80ab10947cf52c1909c7784b8239e60d25455f35de3fd4ad6f6614d6fad5e596c59cf48c98787491785c7725a7fae719da7e6bcf43499db4b14a3120bb794bd99f31404a139f93b8e9ffe6e401b7e200b3e4c9f6d32310473021aeb814e8916c3ada7a5e82ce39246b052eb9219e1ff4d5a00e37140b96dd9d18fde32874334ae6ce2a22db0e31318acf98f351ab5b0e4637282483576f3906ac7c90a40d2a7fac82d52e208be812eb4e05fbc939496122560a7be667e82763b7d60d6150c7f09e10c14ac9c62cf551c45ce322e62fade950371aef2f37cebcb8e1ff09d302d90e9b85ea974e892d929f383ade43a8d7738129fb5388e388ce8a429783d6602f1c1c6cdb7128cb14afaac30283d87f5745aae4a74e5a72feb93da962033d6f4f49400fbe0ecd5bb40adce3f8fe41abec029d5eedae924d0da2df33912e07e09f40d9f998872bb06deca410f84f025f99f02af712e86d3e5e800f7a80da30889e99d62f5887d0410931c807f70ae12790ff941721df1fc85f92a6917c4653c41dc00c7af993400209ecc4d0e8e3c3d743aa198220e45935903411f05e4a033024f88724ea8178fba0eda71999c2c00f2bf73c888875bf17f96c824604cc1688c602e13361145d9ddf11cd5f1edb9e71f5ee2def31510c1578593b75c86c6585b6ae3f2e89d822507a1f7af736133c8d1ff6c9f89d3a09cd2e1ad8dd53a91b9970430699a8da912a6efc3c19d82fa8091e28d703c37d8d2293a3d6baea2445212e8cb1dde0ca857e13257ea888071729b78a170b6b6a805335edc1fe09946f59fd029ef046003dcdf9b02b2272d82721cbecd40d0a8ac8ae0b4e9f4c71c63076a3faa191aafbf096b33ea760bc74d5d78f0826b7b03657aab5b67d9f2636ccfcfcea5d9fe9b312e155a8d0971a78288f78b6a0bbd1384f40366383733f59657cd3151592a4d7a6132cd704c3f025224170cb3172fd66f49efce417cac2ea4f2882d651d3824f9a0320b493df7b410a38ad2722032a9921d06c655cc0c2b5bc8a6476b27e132c237d22d5880275f6a48444be5584281c0d76afacbd2820a766209cdadbb523838535cc5f7f69be0f34e59ebc9bb6ef9327a24e79b60b0105382b5b7ba673ffe1251c2995cbef1ee3d6efe8251ca5e5deafb2c9df5904a401033dbd0f3fb4d09a24b9d5f28b29ae396b4fd7100b6eb4d50e62d1af29f018930e0f5809082b0abd17f1eb8baaa0211f2bbf6cf1e2a51528b71bcac670d6df28e3618c8419dc63d4d5bda899e4bd4c004f13e7bc6f6b88e287de654a32417a8e273a90c588404653687716d675302d3f58513fb6b293e9a9d0c6c868a99a129e3627bcf25cb531d7a79d5aab4413871c8a9ea543d5bd16dd3b811b6886772a65c3bebc39d4e59378f1d63a2f67d48c6dea1f6cfa455dd8fbc38e939e2406d4e7130095f732b307d98aa190a4a32a92510592198e817211b43bf640b8b795b262a9a6274227d840f7605b33181316faf3b49fab71ea06b846f07f4a95baa2ea6e24a28c514dfa730b88da2c698641005672ee338672213a88f17441710a9858c9c64d6c7755689596291866eaf2d7c09c76433cadc46400fc522429928a004ad3f748042adfd9513c207c0208048295808ce7992216693e00b57b8c4bd24614389fb2c86feeb60dff532bfdedb74da93f268e4dbffbe3c0db41aa8ac39399b7d3b0b60d8879bebff4edf4cbc52e84ff592521a3dfc3b01e98d42e1cb57d1fd6de43e9f77534d6b2922a8ca937a0a6bcfa4c70be0000da13c8dabd6777bcdc073e0e08b95f3a3efec6cef025145dd1fa7493930c8561e121457a653ff46c225f1a56edc767b0e61e236c3529f19beba65e2362ccd2715117aab698829e1af7ca222bc91bc101aa9b0a5012ad6c9d4a35dbb130eeadaab51978c5cd5b04f0a4494fc432b1e485fe3c4b8c0d42060d5018f79b3642e4bb017fa604a00a25016e62f72ad335a8ca08516f516201b7d116571092a6413bfd03e3b1714d83eb6f2aceff06eea44745634c4d44826fbef2f7f372da0ee6bbc34cea1033ff82d7fa2a831f0067ed02f0f1a0d79cb26b4d0521da7259f234b25b8b5532c12659de38f719861703dc9b4cd3083324e0478259e42483a61d6a44e84fc3285bfbeb65c2c8e4960dd0feb02655f7418d81ccc99288abf0486318c8fa04c0d82cdb46adc20600e841e4168baa44f5bdfe615c66395e141f76d45e31599ccd9189afb234564a1a787c5e1395ec8cdf4a3a863cd134f55e49409e6f4446d3c18058fafd1295b2e19d0666b4fa2a7268932d307ef6a9cc86e1ad21da32942b1593c2c3462f9d1ffb36b2d88683ba6d7bc918b34cd5f1d412cddcc2f8228b34e1d96933c6c39bea970472655c53f977348e1412f7d0e124b478cecbd58f4a5063ce2059e9536ea47b0e43172c2a7c76a8e7bfb3d84327cd7ca671c957cb5c8b8d14530791061faa95277e8410eb3bcbc6f38daf0d97399e6467bddaa5c55dbd309a32e6fce3ad2e8940f2360dfc8f77b194d2381e55a9a4823a2ea3238041a4238e8bba966123f548a933c8501b10bc6d8639be1053a756c20e46310cbd5bb056ac50edf1ec389f8ec1c041074590c964a2122ade63a3c7857efae06971a23a26a0b18a4cd9c2e94cb146434a928b73a7aa6f71001ae4f61d0884ab43299117bb1626ba9b503f81a302380eb1c9275de3002749e05f112d29f5d476e25b9f97b905787cb7c70ea14f39909099a739c17f7b532216e5dda5a7156e2d907722b66c54ab23a69e0506039a33a18a3abaf859e19e1609d7b3115a4a4bcb6e690e459150b416a587202d30bb5395677059bfda741626babedf072474110c7b8a843a17a216ac57a9925142b179f89e537d0cd57f3739f9ffd50a6f4c02ac5d8443fddc2aaf53bd9f0fdb018c53db11a97405ea87b44b59c85014fdf0a398caf91c670cdb0805bcdf1e741ec4d36ab77e48531bd6afffbb96e6218f79d358a84e313c7bf4805660c38f76e0aeb106fee5197976f2f9cb0e6dc90e1c35fd09f9c68e5f8e3f45d8115ec6f8fff05f772c8dbb5c0d44f4d90ce03336d579bd68d22101ef72a9805e9c7b152bfaac0ea15c8f3ac21b1420c820d9dd580163fdd743b0ebe9a26bd0d6d2197296225e7b18f3e55d8d26538c5728edc98dd85567797aef9298e00f13c8e9bb80a2d956c944b42de90731553906f8f41be77af8ad36e7cc4a58f165b262e9b30466e1f817175d3a1d9dfc36ff68a0da3121ebb820ef72888c0331d0f06b1326d76979d477ad0438ee97710cc1c86a03a21ec778c4bb7b18fa9e7c854df32ed9658c0734da9507b8e628f4f3aed61101d928b65bdcc84cd9c70ed896190f58bfb1be0d489a4b52dc003987a0b4689642758041032aa394fa7b8e04b3011a01c11d020944b2cdab16776f0de19e3fe91e0df5af3b067f760e97245383f4d217e44a815cac4131dc5fedd83e89302d9d38c2997ed03f868d997f3a0083ba568c8ec8cd91082f34175f74c9c9b37df2627262079eed831048b345613f15c2ba1b20bbe40549874805d1635716205574248f2001195a9bd87dde611de01cccf96932a3f51475930903145ed5a5c481416fce8ae0eeda25e966034254c8624db7a5376772e735476cbb0ae36264e044f4ff53f3870f21a7199cd1764918a0c628b054e915e41fdf34d9aec399197827917b2bba39c0471ee85ad4c56d1aad9f2aabf35eecf0240817f197d0ca5844acee815619c6afc4df5c393e8c306f5f26aad7528f80321577e391950e62d8679be6e43120e186df31a8091719dd077c32d82a2f7a90a2ee14eeacd131aa6dec47637b1ea59f52ec76e63a9cc1200f666325d107dcb41239f72f0ced12982d2b6cea4f16bb6f4fbd6aed01f661c877a80610ee1007f5e1cbc83c9507725a9068bd3f8136bfaef15da0f27966aa17cf9afe610771f678c5f70f79d0bb5bfb4b693b9ffd0928c0297ed92f60f06563a4fe924757622554f32d673493135cf3a9ca668e7ec46e23ab4b01735857d18a6bf06981958d7ce7829fe0c12c34c646732fa1ce96141a65e5b99ec6ac4b8c131eb053b459b91ab9b09cd1a223bd789ae6ed3e1cf17e0b2c76b90d34f1cbcd5a002d8354ef18c01cc9dec8dce67e989119841dc514f427ec2d505453fe1d4a932f46bb1f8e7d9a65cb9fecc307362a5d7eafc3e4605e7b2364673ba95043a78cce173ac38c710b2620e06c5370120c15869299bc88b48eefe98278a83d35c46168fbdea497c34c613b31d4e9cdedd4628c4639bf2526fe1121a1277b03dff90605746b735eaeaef73fe08ef8e7e333bdc8e9c00c245840db48aa3beadf5538b3ae43f098870d05125cea03bd43f6cd4c055eb8547bc74ca32d6378bd0af58a846ac0965870a49fc74a7ca9f4369cfad9c21870220d76c42fd4eab9ac029dd336c0b6afec4f3a48c58551d04c6d15b9bf18fb9c2c2890ada1f046b88fec1391e17c60ff0bb9bedc271d6fac69610f17e8ea37fe74a176c82702f4cbb1c1ed44071421a6e296a1945363ceff1ebdb3943e72452c35ccf7765f378c4103cca698204c23884cb6048f4576c7cfd9de75667441d29740018de41d9e68004915b9a715dcb142480469f44b298bcad5d7f50a110472c98efa412de53ca818e04066d57415b8ca81013cdb59a006c157ea511efbdfcdc58d86cd3b2d4b96b209a53591cc17e3cb00762d5f62255618be056110092945a09310fe890d789b2c106b8b6c8abd6b54066246732f7e5575628795bf7d4e503358f93505bf1c30f136a43740e99322ce49bf9fd6ab4181a0f1fbb2755d8d993d3827107d6d6f8cdfd7691de9d8ee7f96212cc5df2af3bf437a2663719d788c39bb36a1d9a59a7b5d7ed4428581c248863bc71c33f3f8a9064a504f41af47904373c583e04b971b4996907e236289a21265b375a329fd217223815c2182639a4c54c03f038f01f2cf302b8c1df57710c4e41e58a8dbc444ee2cdc05aa4c168ff056099f7d1a9626c762e9992b459eb28c3f7db9ef9d4b63160422801b711f0413e0bb555a08336aaccb2aeedd111bb913ca118319b0061ca2bde5d6bb509adcceeaf11d2ed69fc6874cf7fd4021d8d7c8d7da0c3db868499997379cb22c41b8a7a408e7e5c1c5450835fa9e10d3cfd2fc9740245f260d4a0d2bd85cf0292cc27e7fe4858cddebd82137957308175dc04811a349e7f85f2c1ca58dfb9e04cc843b66042e0b40443f01f505360e79d0c0d0d7493ce4b4e7c2e00192cfd717b0b39e5ac2e940012072d8772106cfa90d9bc180a1c6dbb3ee876a19952000e51dc6450c02caa5ca0a11a12014e4239947749683af4f55352056abb144395d9df4d8bf67d4526925451039bdda0d1c744da5e4575145989108407320efdfe34a1165aa3c4608c0bd1a333bc68ea071363b64f8e228a9734727b43eb87df8410c0c1b05ea3eaddbcd7f53bd179817454c7ad158667143be6f7c025410386475aa646816fe4d30e6510abe49c585a5e9fc61e6262a17ce2b153c192ed05ac637a34db89f52a7180f9e0022be561ff29bd901111b5f22a98fd0ffb698270bdc19718833fa847c615f253be815c2570c5c9f87fb061cc63cc50741a52160eb2f6154dd41a74658a480420a1ddcd214acfa5f54f2dc0f108c4753a11d7a9b8641e7c9fe3744ed3d183a6b888fda6417d1f27c53cac96ec2cbf62c6268b240234e4283f07323b1a7617f726151f2e16c668a78cfc22507b1a164f81e2b0746cdce2d0db3c63f04f82456189b9469d6768dd409c370526c6d3fbcaf1af7d8dc7675b6bd63e05444eea6d5e41628db2035349dc171e3af02be77f81a6822d85c29bd5dea00b6d9e45f2afcd18f0622fd179c0f05209da3435174bb789ccebe4a627f11a95692eda3d858310b7a036d4a0eef435c74a5c9fa344a9cb37983b97343b4d2f50a5a42bb88854055d14828fd99e672694f309aa168d63b7a1e5b8441d5f799ae4fafb4c7945d8cca24d40999fd8981889073c7dc3bbca9b060a0ca2ed5c130920b3b0c03893bb8fbd3b5b9a79d92bd31cff9a8fe53deca91d0f3f5c3f7deb1221d58a894e0ff93eeabe670a146b2f18ac119a02b2c74edce75900eb87b2573e091034eb1c8daf9c7a131de8429320e6d3e9116e789e4a53fc619cea1e670b48305bcfb27d8dc05452e1f851c3978d076bcee70dfb8620318b1fe7c9fe3ac3305d737f7f51a738a500a392e7c8e0f2fd2dd7930e5392daaae1ff131cdc3800f1bbd40978907523751d460f1df51c0e8c8b51d9a0dab61b7f580489eeeac852ff6e8ffc6f468e8f9d780a6a650e9ebc3abe5d797e021a0f7597f2c6346252b7e8861070c1159adf9955993bd1eeb7d0ac155864f4094f9ac658dc85f2f32cd9eea110fb58512ceb393c8ae90aa9e31012d08ece5927312938ad0669c0a1230408bf6bafc395ff6d965c0aa9b0687a66639093cba3c5e8251e5f1fce2502da951447c43d5d1acf9985260f7a092b7a5b3e929375e635bd6a8829a1a1ceb4768a912f6249f6ec062a0ba9c0334b4b0017de97017fd2a7c2de60ae95f3be46460010ee4bce35e1f7ef15fbc0ba6970f8dc202fc1c3937fa6771c8185e65fa062b7e1b7f9a2ba3e7cb829abe5f5c3a527f60fecd62d271dddf1b7ea1c4ff19dc0dce809f26476b9f37b55b8f74012f2352683abb408053415a89e912a48b399f0b7df5a15cfb7436c94ccbe6d7ea3c94e2464e51a7e438a5ddba6f93ad9369884be0034d000a401ecd5b43a68ae644e7761f535b081cc420ec76b50165d94ae85a8e6da6892538117e41ed23cd75272cd98b6ac35925b03a17492c23875231abfc0f16f7b90c3b58f4f92d8b361d31696d704bf459abd1cbbc3aea66baab105f7b49b8bc79e7193aa07e696442f3a327c5d097f0bfb2f6cec225cd137807a8f87cba1b9fedcc816e1a0bdd6e2948f07e2b6fb0b71e3cb8886f37e0bea940119a8208ebb4d06106338d04081291cdd753b1eecdaa2270c16b2093c71d53aeff1494867d0c4bd4606785e24b7ac400301901f4209c54a911466b494b4fb183f347178c0747ff1dc6432d6b1093dbb36e292cae9e35fdae32ca9486c3c0b15441ccc27a90c062c03766fd07d77ae2ba283ea85f829e46c0231099d836da229458d5c700d3aa092d510b2b4ceba1ec11650b985ba1709604ca8804c3d3c18a4811fc433980e7d99df65515c5790f10410b8052080ef208b145ab7ea40214168461ea56d93d45a8426c30cc2699e812ec620d71cddbf31eb3974c35025e7acde5dc0ef5ac054a6e30841c805986cc1a42d1a501c0abb8e6934e1b56a40d70d0499de386a66287de65e84962c86645ecad5379ea2882449035d512649a6f6c88a91085de595f4c3b2ebab803d7323aa00c0a7358a47d83f2bb9094955494fe6853495c4e52133840988ab8a72b948578afcb2b209c126a344d56cfe56b2ae33b5b89f96c7d6aa35b788bd06ef573fb71a06075868e4744af71a4aa0b665a4fe79576219e41f2ddb8c77c498ad2167f11aca8c9376a0a199cffa877ba059bf4f461a1373a93c450293c3300103d08642af2b8c1c1ccfbe3fe4442194786d3ce3ca22015bc59259a5ff83908dcbaf623efd2c0a908191fff58aa355d48b44b1a82dce31b36a3abf6837882daf5047d4f5d546677f894b956242799e3a525b7ec3e825f4e003055567cbcee91b265e040d82581a7c19f7952547b41f157e5752f88bf60c5fe62ba56d0de6f45d130007c4de68ffc66af75ea5e89235a5f4b90a00647e79a3acbc9a0e33691e4cb1f18d0a7810442b49bfba1eb77450bc27fca89d6c3f2e631e3c2d040cca1f5579891fe1752f493555ccfb29e675fb7d5ada7e02c6d026d049a3534b342196b075e135ddc6078dcfdf4422e62400d5830233ab6b24105ab164512913578343620f3713d31a6f014b4850811dbeaf506122feb2041250a77720f52e746a6002ff074c9ee00829ad2ddcfcb8abe4b1d6d9832f9427673e9b8bc63de25ceab83be3aae9778918a1b82d6549683187c900bbe43571c4dc3673c480a3de7c9a8fff20bb320c84f2d20ae2bd98dc9cbd220330e27a78bcb1ba279b35e39ee18806cdfe7d7f6e3af5bb03401362a78d994227fd90ae65a5d63996280d857a8999b02e215da8d623fa12f3444ac98a94831d38b07e90f2cef0ec21ef7edb0e575a855ebb0a5aa777093bcf435601b82bca2b22949166a751e5ff79b046b76d730b000dcc8d75f56e7380e810bee5775d244a05f5b8c9568504f39dedff95b53ce24e68fa1e98af8cb77e5631e6dbff8f3deb62620b04ae1561aec71c8df9ce27bb7b7d64bc0b8de3c2d8525778fcfa4252e51ee6f1f366889365494a0853aac874dcde127c9941911b8606f46a9cd6a85dc027b7bc9cda337d5bfb04fa7bc193d2da402cb1e9c3f3d053b6301360a3806692be13812076fb9bb56f519ce815cca7aad43300992772fbabc34a7c2a30dcb375080de4403dc5a109d0ecc2f8de6f19c8b263398b839708952cd354ce68dcf2c6561110235908d65ef5eb404f77f97fb948b8c82108e41d4337ca53dfbe15f31db3ad487386435507d773e59f90a5e5a1a3651cd45b02773d8f71e4f8064efa3a902e815e1a0fd98446a1491f84d8df6c8e384115fa6d1ffa3265a184d3b98ccb21e885831ecddd4ec90663367c0620ab7810a0dcb19f101baeec58e171e4713603e69ef69c946a041c7cc1ecf088ea2956b55c8a9ff8b619d52cd08da70aed2f47a20fdafcb5d4f8912fdb914b328670ad64da9b0d335190d3399de7d611b9c6256b3bb128914c3ce18b34abefb09db252f2107fcd82efc9bc30190853c512156166a03f52a45922e9892f7c017e58bb3e8a7f1f538840317ab8bd931dd20cf69c64b4ab6af0cc35c56e786ead61cc8ccc8bb3c3c6bca3a0808ac03b8822f4747141704e0a783b94aaf7b16327a9787226d4f90786a832c5f2ef2e6b64111d9015073f4c8d67687a45db95651307ee1df2974ca5ace5481e1f1ea2bd6e4e41cd4036b4097fc8ca3467e030e785833f87654bb53570c28f61d52ec5aa93e37dc9f72ad8a2a30058319f8abeee5846d454267c231c982bd9a760a09dfb7824dd7ffec872384b01efb78653f9d84baa3e492c22a741d1b90fce50e79a877a28b80eb23061ef2c3b623cfcc0cb8a13c819cfe049b0b0d376bd0ddc1b8d2df6f249735a5754b6d16b42607981549d74e0538d751a716192777bd23357bf88fc3141d404bae76ddf7fbea845d6c0ab2472301c1a6d12274f3d662d91f3cb94222f8cc10e161063d204f11cc2152ae5a6116fc294cf47811e202a8296874577f8aa65c7d838c4cd9169052fe26a6382fa9f4ce52e92a659d41b6312bd1b50d2860b1c7dee8375c43ec40900223d9e35bdae127c9b459ed75dbe4f9caba443d2926514b6440a11362a04ee0cf73e407280e6d607f3e5c0646148228296f92815124cfd761bf584c90ee09ba17ae0d0cb94f414a65808a15360559c408fd0cc8bbfce46765eaaed9a4e726de66914211222d901d6fe45ce9b8162f1f60d9a90b31dd0d49972673afb202fed1ef043630776898c49ef67adab577e509a0a1a6f28f7e3d12288332ed022898c6716206176d8c9a61024a9e442adc7adb34ec8046447b1d0af89e0853c9491e871012940af7d30558190e150fba91bafea662a298bc726de678e109046cdf7ca2beaa64534234650af2c3b3f5e39580f8c8288adc95090e0a7bcfb26a7f1d3cc0c815e96e2a1c24bb699ab000e8a08753cbb53d45367116130238a4daea5d766deab0cf1b75376b3e3790f21a524a274bd517334da91689bf73e3cdda52854175b0e0d9058bc99101266105f0a24f29c8ac91420af246a264fb2ba2e0ca20e361414424f9a4529d1b34ddb9ce7af76f6c977df90edf25fe1517815c1e021de8c90025f64a97a0722d9afad4ab8766758d2f4461bfd50c9a91f8ceb27952a466a7f01bf4aebb3ee739ec2fd7e2d0f1eab3336d22b5a8dbdbe802362b14496f6a6c747ac0ae1dd13c1d084eb33d7fc1acfb77623477a5acb3db14f36572abe60141fbd4b56ac608bd45462f44d28fbf432647e2bb105443529eeacc5fec45b665f5009d400c76dd6d24a99a7a4ff2fff533bf9e931085aa92fc5c9ed7875032bb3d523bf8851b154cd57fcedfe464e908c1e984fafeff246af3f8082094a92b8d10302f001af04abaea3892e90d9085a04ce7c686dc64c9bae933ebadf1c556abf84f6d6b9fbeed692fa12c6e906264ffce27a9be730150c76ac24735756313f79fd5693f399bf50c823d5fdd8d7230d389afa31f829183f079f5e68822f1d0e891fc03b0bc384550475718205b5f5b1ca2d4b5c15acb571dd3d99de1e346147958693b1945054ede4800f78c357974c4168ce71a78703d63ec9996fdd4e911cc6cf43a941c14e66f2fbd3c0433497b45546e9e244fe17ba133022791eac05f9ae3d27fbbac14e401ef94321f6e0129fd0b936f4f125978873d5d6931e6fb576a4cba0c7834c7a451d8baaa5eb7149cf7d86c43fd55e3a9d311ea3b297f54193d741dfa7b5d024499735d23e4ed0a810018b7437735935ab0d0162850f01b1be88f6f6124892448377a29ce8e4149cace7186409e9cf99d90090b3d007d3a83ff4b652280772fb9f3f4eb0ac5888c06fe1d7745769d312fdb9ed0186a13b03b13d2e241a1e91ff2371de143e982ca0b4d99b74296e47b9671e3b7d90bf9858be611a5f1d433e0fbb5be5000c03405ca82d8034ad2afe97b6ab6421cb6877e2a8000308f393007a7bf13403087068176e16a16ad61a4b5cd0546a601961a263f922adfda6950131b301632e0ea696c1921c32e654b658285a2c267501907930620641a2a028dac050e0d103627a2a6a154304de401721c3443c231988cecf63b6b853ab5ad4c32b4a1086b4c8b1e013ba52f26c96c8254ac201f85eb73d53a56eda2e4b2caf05ca4c90a9ba417e111b6d17c84082370b7e0a0951594cdc1e211d33c11eefd09653f4028ce32b8697b8837bd56e216e73d71669328718c2499b453ee458745c462c386b8f3f129382e3a4c54217bb2156cdc131286d9b68bcc7af32731a8f03d4bf602a4fbf9e14869f0aac5dbd281de986bcd23c2e00a91599f302ff39f6947aab6a329011f584191a58637c7a44f105d6b39b41947686418dd33a36df60e621c91e2ea9e0558073f7a20385eb359ee016a9c697a17ecb78ca760da0b1330a7de30694c6518311058a8502e3862e507779d14149c4409ae8b10be32d70ba038201102ba80e295da21db101ad32a508796f5e0597a49c03c04f33f9c108268c861275bbb0e12a9d57425832dc42b682d64e3c9af3e157aa4408cc48d4f16a59a7f4860950172077d2b4693275be446499064f113846ef55aa755b06cac23d2179e3a951b528866f2872a4b5b599367e0c9625babf1919b3891836321e74c30a7701b2cc68608ba2ffbd986139883a47e937ab0972719d0813605bde34bd62e2106baafa345c03d6a07b8c8181ec883bdea7d6e5aac78414ae6402e608477a9f3d5d2f190f817d8be1a80f78d2a304e01ec631400b92f577d585967ac41f03511ffc78bb54a33cfc21317011a46c1b076f84cc4f06b42fae1fcfaa409ad5b93e5f6be0f0a60b02ea5024162856e3c263758b91287a95b1ff7d6ef443b6df104560a3fcd454f76fa30a5bbf6aec7afed8950e5e899ceb586b5f7e4f112f5abb49705059d4f2339a709d226c4e8ecf57e300d060b4e753e7571a0a71d7262c974dbd14d16f4995241fa9b9f8abc9305b81022f8747fd0ebfd7d49c6700535909afa36bcdee8cf1f8f5e757f4fe51c4d37b2d23a58abe1027bf70c445d4fe540143f0dac1bdd65477e96679efb045119353e2d8bbb87ebef4ccba05460030dec2f105e4ec8cbdb6237badf6c66c009d4d9c048aad6cf8274b5789c809dc8bf4c5b48141010977d55ed8a5c1c6b1cef254fe8837b1d0617638e48474d70cf38724d6d5e7442e4cb0185415aa02b463002d052bd4ee3f92b7641c1a33e609262611486e3caa3a7671e275e84e803b408c408f922470b1129c58a563941e8d4eb1784a614805c5a56e547b2637062a1cda4e737ccc41f1487874e0309c8c081dabffb52347eef0de26a73abb341f976f82ea82297612051a4f8240150ea5fa0b07c6521572b4cb827e4657c57e9e8e08362e68612514b75efc86b805af9cff34cf78d74f7f808d471506be09d0488297c168917044de93c68c2776e578ca6b1108d79429a8ff8c721a520192bfd560ceca52390b16d06c8b649aca0bd9e9f3cce24d2bf1fc6353aca13f95b1a555740685bf7fd9400615e76b6f64221419a31d5f762466068051630aa8fb144f2f15024c36d239a2efba2522a7d8ab84d563805cb19ddcd91c716b476c0f1538cbd034ad0fa73f29ea898652f712d060cbc2717a50dee8a4f2fbb86a350796e8676ae1da0737a83736090944627c91775baffeeed78a33f8478fa68e3cb496e129e41da07bd6fb2c41f17c7c24f803372c542a0ad7e46a7e0d0c753d95e60e8913ce694113eec95d280ad4b55488db6b71350fc6de4d477aee70885b8a22964602ac0351fd7aaae7c3a0f414239d150aecb50c07754bdb8c7e566470a58f38ae4f6b4eab52ea4ee2b6cdf970e2ee609179338d5ff506d46a52621fd44f5cb1550d507443dd1044e7f22bfade45b97690906d19f6788ce2a4383b64a791dbf395d0b1cf9076b1cda679908ee4a7ddc45a14b725101b386b17e493b0ccfdf647a01f5f115273c2eb9eb9aff8e20c7c2708091262211eddc41434516ff09dbc28c36fc11b19c6e44181070af03b30f8bf4fe41e69b27bc186871d360d27b5775f93b7fe8721b28ac5d814875eade81f8b656c69e00ed7eb1819534d1248ab61d52f84f1e004a72caf5c8df0846beaa4e8e599823d78eb383bdaf47f70ff92ba6b4fe16b352a57b370777ddc87ae43f2b9f7b3a8f5c39a96f3ef7bc82ba51620f89561aeeb936e806e0f3b426a4ef0626813dcc52aaafa76fc47a5c2b943ae8594d04366b1672b3486073d7e298e802078e9464a56fe77548afa6d78f996245e623568888b98e57b1a016f3f15d1cb17a2bef10cc2089fbe5a2203f6c505886104be9b8c6c5e7b3c3b18404d5ee37d254851d495a77ab348f0ff4755e0a38081f1fb738cb5864735903ab0523cfe065236f1e6a206dd86effeb3c58565744e24d26f813aad283c6dca20283303724143ef81dbd25b625c47fb7cb478cbdbf53d6391e4a6d6df4cea26900b91062025a850b70b0feb918ff7d43dcd06e9ac72b0e7bcb43f5db7e8be0200c2df9156ef91f7aae0f97fb8463080cadce9d4507be5cad2ab54adc68bc22e64fb3e3ae2ba58f99e8639fad36371b889e7f899d214da0418dbc3c4470b87552d8508a14b7f7201090f522b13a64b765e2c42ba472b5e0395681c8fa2b272207738c4439377e2832a87bb14b6fbe7d90342e9dc69a3d8051c6fdd602dd5d1f197f862a4023426643e8f0b3361c5ec2fb76cf0e47838fed41ff25114f917fe9d96bcbee1dcb3ec976a9e2e55e8ab01abb7afb39eba50a9506845e5ae168b13b2f55f0d9347482ed87540484d3856f17b81f7bf0f1edbc3eef5b7723b06311d84617dd769000aff6c2305767740a4a44260d4408d5ee0fe6d867ac9080b378cf41c80f1cd3aaf18fe8fcd5b15f203da2df112c103d3c4083f9f184b6ad1f22425b1f188cdccc215f8e0311a8fa202ecef048fa9f97471db630271fa81ced5d8f4788d350c0f1d85832c9e7611a63ba30e31db103e2140cc352ee720e4d6201c01a96173a37e3478a59d6a046d5afa24b3473f368af8bf0dac0ed40cc1f7ce3c1647ae998804bb353ac7f65881feb846f681650c856ae1a2c6cbe71190bbe14c0a948ae24765407b168ed6f25d85c22b7f10051d8aead42d4d915b70599c57662a8d5fba727034a91af6d705d432a5c688a0389ff69164787251c00f9217ef9fa4cf00c2536ceb1c039db86ca2ba39f1b63921b941e1d42c7e98f0e290db381b42d7ada32fb6f4b07127ddcc992e2f178a610d5acc487934e0578d07d1b0a5d9bffb75972851df09b982e8340f18705f0af40143c3db451d0821600952638b05900c965a2ad665938d625123f9ac3673cdedc791d7704c3f318a08aed37e99f7eb27bafc2bc49f93446b28ebf749c27dd644f8fe245a0d21ad06b16b3f185ccabd017d1bfee04c4ca16d92a3c2f8fefe16819161cbdbbbde145c0dfd72491f31d25c6b9fc661a5904589eb84a1c48aff52a360ddb3ce0dcc9cf64740d1ea822a08b2145aae2a0119063906e4ecc3706571d595ebb63ea13034012f21fddadc68769823642b863f9d33bc241523b221ad37dd29893b8c5161422e46ffdbf0e78800eadb9da845c5d5321bf1534213fd2430dee2aaa31910b88427e2c9a42eba7ebc52dab082a09142ae109f9f5bc392a22e4574a880323c0132228988b0dcd98faf8eb8698bb6160aaf3c5322c010bf6e1688bca65d5f791f5236bc930cf7abe3dd00096f3efbcbf8ffab1f34b365ec1dabd2b1f859c7c9f062b49ed5ec2009bf90f50ea4db1f983d5fec538dc358a2ce630a96d0040a8af12bbc73b971fafe33d98a6985f5def9b6c8c9cff80b847f6e144d0ccc5f0073f57bec3432e0bc4d7de3c05290edbdec0777bd31e7a83466405a3dec93b3ca3f9a7ced23c5961574568d370293ffe64c7bf559302ea6bd0fc16c7f59d372fca6ef20e24d26a65efbf96721e4889cb4e610520543158643f43b18598499627fa4acc8632bf9e5317994a99918f8c654d4bec62411b76f68680ade5500215d49acb8331cf63018d51fee0f665d01bc3cec895d05bb6cf8f0603014c2a1eca7afa0a2e282b7fdc63b094f293a1b6ca80026526290d98197b521e2b5175ad6723ec71cece2e6f650dbeac74610154c7c1fce1f0dcc713a6a426afe73692097042f0c1b9b7bc4c4e61bbefe2818a979ceb0404fe60a730e8b8df770815465b5d7ec234ef8aeec66d14ad2f25102170c8efacccff3a93946f7350143368afa0bc65de027db0db117978c073317d4838c9a5b140abfd68d9f1b136937a1edd86604f095f1cb094709e6b6ff66212ff29c0ac106d161bccb4aa66f383263bc66c924793909b3ec7e6fca29f9fcbbb7ebedd1cd0d5102f4146359f1cc362905d0faf32a863bcfc016927c1f6486b31193dd5ca7f3de37561ed4e18f14f39343c148c978b5be431c4349b511fd220e726eee022de4cdddff171d956914f188382e5c83b2317ca21266bc761aae7648b2d7a3243c29d96e3df7bcfcee559dea2f52f31654561fbfccab1390e4c2c6a436a66f9a453f8c2af2e647b577788ee386ae6984d68ebb3227edc559781751ea0320e1626b75aff587289ce04a6a1fe04acd230ac85f9ab58b9994a8732bc22c2e25434e69f88b34f68cd3e09a383c228647930c903f88fa2ca6b8fc7f5ae2cf46b99da9e6efd7c3855406ecd3ab83abdf8edcfda9283ccd95d17b4e500ede81967fcd7798c2dc9759894ed46ae3ac9c1dbf228ad8f15742c2b2efbfdb287e574822c51140eae7983d9958e40ca8f689de5361685c20eff44f0cf0923d8f5b6de6d28c2e0239e15dc55ecd392dc68f1063679df00b8178502d7943780674dcf5dcfcabbcbb2853615c4130b5706aec20b074d2a6058565c0b7a12cd0e6880fcc221f9d6c184ad336ae21d71f187bb0014d600f2f7ae93a764722d60ed8c96e12105a8acc09ca0daa53269ab0da10827c5d8ba322b2943953bad198cbd714bd93c06f0e017104a2c08a56cf5121755040e68aafc11ca5d2e8308d62a4d761ff257a5119a63a485624ca89162a01abf7f0227d8ca07dac6e54fc06b236e672345f07a03828daf27705a77964ba15db181912376b9765ddf9a2a0f62ec03df15083d9931fed94972de4bbaf6ca45018aaeb49502ae6ab41461c6b50e512be7bb36d590068a55045c1753e0c41d92d11e096329a5642b273ea91f7042794928ba2d92398d9365aca43b40c99ce0b2868983fdbb5e3e4091bc516848fb6fa85f6f2700a287d93874069b8600d101529681fa52890e537f331a79ac32b1930a41f18503666875a87be7b3ffb93266f78c182cebde965b2b114b67b21ee8bfdc3486d1cf380d17c52788ddb06dce4c298834dd14a032f791edf2b096f83022fc0d5420b69ebb9d739239f424090556cc8139082419ac90fc030f91dcfef2df8cefae62c01c9631f1a7706681e1139c7d25a2e6541cad2507ceb3c088487e8de6a0d60124f07f32d518c14e9f35c322793b89c74d60b6ac7988061044eff19ab982d0070f5134d2e1d5176be0e189470c26bb94e465eaa37f5564fdd6f2b75fa8449b964adbf95efda31a0786ddbb54e6337fe6a6a0a8cd8b5ad81cdc83b9e42899eda552da5c0fbe43b7bd40430ca4db196904acd59fc9dd6d2d9a1fcd896416c28677ba6b741f49e36cce89abb946c8b658402d3e71673f0deda41bc7fb6b6487bf446e944f04d7cdd1fe35d8c11f1136e2238274e338fdb982477072d596b83f0a4c56bc1a294ab6c403d4e2c93beb83bb2afa51d50f603704486579fca1a56c6823972cf7886c78bd09b99251d1dfe0684bbc1415c309ff09a348ea73477cd24f1fd2a87a78f2cb1003fde4e3b9786600eb4976e066c3f6418e25dc6ee42f9e587de0d233524e872570d07162edfa3770a0049c1c792098b8807e3f23b04569b2e5383648e10fb93b0c8d790e1a0b5bd85a7ac29d15fc5d77ed867f1310cc37fe6e37ca687a518c88dd5535345fb8b4719f20719615a0db182cb74f9576b3b8f1f8a439c04172a293f0c4eb34759cf7cb302e6ad0ad0527e05891b90c3b5122cf06957b37846e12038225f01bf6dfbe94e31b675c36c9b0c65c9db294c0154cad324a36b72413ee68af50c5e8f7076af3628b2230fd72bf44a721bf4cf9cddf65c027d642a18db7dddc0dbf1212ee4327657149c8b0189933b3a83a5da495d9fd6cb0a1c2f4520419ba8a26d79528d715f10335a0d4101d4f6da509a3c2e3cd32c0efef852114644575a7ed150c66813c0b7511e9463182517aa608fbdcab48d152bb9ddcb0494171f5253c86f8ff85cb1c905e4780910708422172cacc0962edd2f9d7b08e56756ef9d0965228d5d7c128c278b456c403c5756467cf3764a5987e0fd0693cf5cc8e75bca9ad130782410cab4d51691bf04f3b4130cb514f4de8b4e1acfb85ef18c3e689b2bbc07cbdd64ccb88fab44ba4cb9d7d7312ae0d4ebf8015fa4f9842c83268f2444bac6cb057717048eda2907d68174555cfc1c5bdd6069ec460da69962490f44e20041f43c23ac04964388e08d1c2db030734c10e6e84b17ad86bda100f678967dc6a9c8523469f1f362c7c1def807f5914d1397b254a21ca9d98dab989fadad6fb853412dfc3f63168e9e253ba61b39b2e3ce0165c5fe2de1730d6028030b144c3b3db810f773ce4f98dcb3ee5084a62ad2d076a12515d790197eee0cb0dadcd55cad4614d7d13468234b78b4d29625faab6768dc806c139011752dd36d096c57a4d9e4086915bb9d019673286ae37b02506283f13f2e272a31dad8dfb9eec4e2b48541ab683441fd5854d498757c5e0b0d2b3e31dd9b58a129671243444a72bb75e92fe7f32779320b042e8e1a908fea768a3c292e09320b415865054d17da8168015f0721de685faae1564ee66900744c59ed23d2a839c6cbf582341f8eb41120661b5363188a5ee9431a8bc29caac697344b6abe260a5d304be621a9a00cf171446d6d1de576bbb97864c7792b05161c7c34f455397eba9c509cac949bf71399bdb9ea97fb38277204bd22964ed90a0c0612060c56f7106af32da9f387ffe107d9d099771e509554c1fde9c36a4b4ecd4358bcebae2e29ed99f953e910b5891b7269cc9067f2c06a842afd18d157f86eac1be24a29c9c436ded017fa41a3a4adf75d5bb1cd61b35b2545070086dfb96b246bee7424b3323f379e3e398a527611ea627fa2423ee559034f58e01c67c1573971e42675fb637bbd0f9490d8d8b0a05275651c73d0f6ef35656b58fcfc8a09ba244e2a820769e1316ef82788093076d1e342e595f2b663217e4d2f3260cc6b1c74d844440bba0e4feb2798c03a0a0d045af4a16f65038739c54ee840df2fb9561d32cc8ff709213191d6631e313b95fff0de876c058e23f9d1eba5ffc141640f445c520680c96e8bf7431062921c5a5eb5f402efa7db7efb7998497e7c0caabbc6bfa51e7311ef277185fec4d8e91e0c8d8438e9c651be58019da1fdcbe97d1a046b9c0114488dd928618f71202672c33234fce51cb15f4a6b2733eedc8590044a72aa83fe8a3f79eb1e1bbbdbeb00bab7b2282e801957a693a4f4f0e5954cf88326ca59fb19c002656c12b5dd22e710cc14e72a947050735a09f168582d782d459c5424944948151263cf65b3ae5271bf377e11f235e82966524b1e9aeed22dc3ae3544ae660aae370792182f07d7767b4cc861193b79adf7c8716ae767b1760f958be5290b6fd1b48b0a12bc79be3a6e2330038bf7268d478f83cfefa3baef16f279a6717e616d586e693846fc49462ee5936632e0aa65b05834ea6fa78e6d4a9384bb905a1fe1b5d4fb6788a109113d9be875cdb7e33350e15d038d44b485c55f637f4cf50b8b6ac9769e400d78ff8f8a3ae6c7eba2a4be0763fc70e6350c6a1a2a64a18fb9c64cdfbd52428255502e0858de1a04ee3297136e9c5e588b50cda1cdac118452315f3282082e86b0c4be17073913718bb8346dd8756a47e59845d9901718d53a7b58ded58f442d2a6f1fb1d35b07fdb0cc2cddc5f0e64eebfa18b0b5e6ce5fe687cf1f030bf7c5146dd74c83b1ab7e104cf47ec0bf01947660ca532a778c02772a1cf4d23827d2b9dd3c79e0b9409d0d91cadfaca5056eca7204ef42ed44eb1b1e9443d81d17aee5f0fcc95723961d6d5f6389e86a1ca0b1ee7a30f463e39954207a5049280d2beffa264e30192325a59caeb9573eae34741cc635bdd2322b11cf113ad00461732dfa3458d5bf81200a66f9f79779c844e20845b8a8b7b67a0e64edafa20858c3567d3fe433a7954287fee03240d983a7cb93b46c5fc80ea253a622866a994c01d4bdfc3e235e551392b064b4a434e40d45950006c38b448ab40ae852f9b52c45604235dec6145f6a66bcd709c71396c903a196258591d6cd9bcb7b7bf70b0240106b47b5949f02490c1450002bbf9e312d0fcda6ce5b27e8a6a82192700054155ccf1a118a0d84c91603ba9075492bc4d380275e43651228582481a1a7ea22c35f20be435a52b664b1bbfaa8bbc86861e077f48c84fc8df7b8eee2f522c5b0e756df61474d3e13a95c6fc96e92aaf5da158307abecace3ca29e5b7066b2db049290491380a641f3bf5a87f12ac448a27990676571ffc4a4d4d1446a7bc8f25f5c5bd609ddd79ac0120dfd0520f4f3382e28dfeab834166f4bb27af544399c117df06450565394917c364a517a7a10c310d18f3bf7ebec3605b704ca42242be2532b00166d6a3534d74dbf16085d493c6852eff9a4b002f6098923ea8707857e1f08087b0e69cab39090569ab59df8e5f1035e4e4d21673831592b446a05eba947988535ba06b3ba45bccd54845d26d36a4a8acf5b6782e12a55d90e55fede0fe5f443b57e811114263c668e91806da972a6f6d3b8e2c66237699a1c5a1ca4396a91b1531d458adee2592247d21fa938709647b1b428d7ec9e783b807ae1f835a8327aefc9f4b359364f9d6fcbcb1c4870c0034c53b7dbd09452e449bd224f1854843f7d54000a7d288613225a6c66381050261fa72a2f9d7912240201ac735ebf77e5210e5befb703ca4a6300d7c0424639ed8d09e06c41ea3a21a87b3950392a2f783faac210726220b492b38f90b45b46e671223379a6e606cbe98bf66488c5223c665151290838b8850524ef971ab8d918c70948a62be09aadea955b105ae642224c6762c520cfc44a86db2908536e7ac4782fd7d2f4c4a151aee54982a1b4485cf6b84f88ccc5ad420dba073aa574da294dcc89232b951f5cbcd89abb9eee2a80c5a3ed2114c21e24537f47c7e52b0555d7db24b300e5acb4375ed269673149d42a5e1e64bd778792ebe96445ed33c946f00b0b1182dfe1aa888605d893c398d48892d0fe6016fa3de9665a7422503d10995676f1b4991112141d832422f23ce245c08198b451c7bf9d64b9989e4b5575dc3f70d5b95746a1b8fb26c7ca9490670908d724c3708996af3b9d664b044f7e4950210a2896d13e54a8c1f7d0e6e72c37b53195b11f30d1a620462c02c65470738455bddff7ffb1cd289338ee9cf3bffd169a7650f9ee481544605c7ce19063a87777f180eb77f908f230738a822bfc675d2a4ec8efe0d24fe7fb14a0ea168af7e41bdc822cd1cb72f73e212f3f3d8cffa62197a2795d2857d0aad8af5771079c68935f2727d1930466652cce0dd947aac90e430b2a3bfcce0326298cd480b9a03f2f721eeb4506f5df67403669ae6c7688576cb9dc4aaa0f7f05a11db6c48af522f74a69b506f740c4ff115f2cea0c5d2a93d8d591175445daab3c24e17e0da5b6dda585683494afb3c7423874a235a89de6ea4dacc0a3c48d6e06d83687faff2fcea016a2822cc25d578c75ac9f9b68ebb531307f8ba97f3645361c921369f25656f9b38e547bae0685105b34d0d0e8cd3879973c2ee6f1d99e63a669534d9fa7baadbc97ff89fa9f161ae23dab1cf8e388d355433c816fd73404dcc6901c10c6cef13b9b5bd7fbd03dfab0c3100e6e3dd88187d78b3922eaa803e0ecbe3e6c374cb85dac51f0233f075337912e82e1f884e4018ae22005352d4d3d159d81bd40a5ae914f07f26926a2af720f373be19c36239f2e9b50cbda9dfc7533208a04eae2cc68431bfa0418a0b976d3a204f71c2820c4ce2db4dfa5f66d2e966114c59d143841bc7e82ce9a2347ba002a6d5777fa5f8588185503bd70362e15a845d103230c240cddcb4d0edada2be960d095aff43f20d68f34271cc69cb4d40260c368066823d03b837e0f44c57a602ca1b70703dfdc05bf56f0ef9acd46bad10b58aaae821f91b114da682e1ad3556f4c28875c2e5a3bee0378c12624825c4cc305d20b162ccf76502e3450747f0795210099606813a90863cea75133814bae7767698a76c016faa3ab21b61c5498633d55466f2d990760c00fe48e7d64417e3a431358598fc88f0b78fa200165b40e5ebd40e35decaee6fc696ba546c929c72813384f43923a4138742a443c24c5dbaaf6184b6badb6dd32450eb05ae99032bc5b1fd2204ee4f1d149f836b084573b97cfbba9bdf45b42f81f25223bd427fa528e3718e6baca056bc083b6f89994c838f910eb9b2ef60e2c3f59f9f05b1c6442df0844cb906aa7aff0291659954c1dd510d9dc99bcb9576e21e297124d771adeab31478adee2e34f27e5352d8a43e8499e2f3b07c51babeb5ae7491b4183a66bd84a1b6b4d124e87456ea612a4da147ad49b5fde21ac34ce49c8ac1e364fccf0bb099a75af914e1f60166008fdef134e3999488461f9bb227825df4ad75ca08ec27ed200cd0419131ba6335bbeb9bd623b4d9ee96dcb4126f427e8a458567b7d36f13487dc140bb2587fca48162adc67cd0769bcc09d309aa6d09b23650adcfe97652e00d1e24f1d8d2105e0523ce3deba68e3eab113c5aa633637cf7b1ee413dc288de57f0588ed27cf8ba0732e5a90bcfef8419f1acf73f6318f7610ab07902dddbd5bf84a4068f5249e6d5f6fb9fce44c661759ea3ccc76c031e814453d05cb71461b84aeb028b6143ea3e0dd4231e614650d452a423b5a601db29685d05370e369f4939aaef07c8c1f73f17a51b5e82296cd0299904a098a7c97025eee55d14b29519e75f12f5dc09f4baf55bb8e58c4e061c80dcee40b8cbdcb662a596e9daea7bb60c8ac2a08053ea37f2584c6a1ef5e2e02133d8abe25848e94e61af5381192c627f54a121934a703ca941684582056b24a07f26597e77e2fbd1946fd6760593e9d316307dd13c1cc5cd5030680fd9fbbe537813459e0f28c39d16d1f823a43ee45b6a9ce15d5c0480fb04a5f9178aeb1adec2563e0008b56d2882464efbdb7945bca94640a5b08c60743081ce4f6734b7e06e248c2862e84f373dbd21591dbec59f971fca3e6421e61422e452bdd18390e23bba217535a0907ee2d6e8112ba4e646253fc3b3ed9a64c791225174c1d9138454e59698ea223ae742e713764a6302ea9b9f1a8874b32b211cb9187e32db9f52475d1e32ff6f1e12e1ab1cb3f1d2c6b05298505a41591c202ca5e7e2133b9118c9175771e7e88a6cb11e7684493021bc62746401af40634583445baccf58f5a6a8818298b28ee91cb754cce90c4cbb821af31847361c368148d5ac8cb183e2c09643e3afed286a28ff69b0d3c1ae25127c05ffb0858edab6133faed63a282cff63dfda33de649d93e123009f2d15e7a524640030e358c407b157c827cb4eff12d763ea48c407b29db47821afa4be0c3dd8ff6d1107dbc411c7f09619deab2b1cdd67991b91c5efbacd142b14bc7a13a2939be3d1c1e7bebf4598eff7bc45f375eba14563e51617fc3a38149f439c206907fe3dba321faf41f21295d59fdfca8e58b928ba568f4c5a42f1e6151f2d45ccd7c03b13457ab29af944fa43c41698d2bbfe5af66e6929116a52ba59371e5473594ba7858572f041bc6a335a6b02c1fc6a75fcaaf76257db61928bffa9939e77cb2f20060836d8761793a9ebb16747c7b355ef4d1e1235e2935afc36379dad778ec53738477a6cc873a2e657b2b106ff968ec816032cf1e83fdcc175aec6bea65bc50478c97144384f1629037642615f6a9172f05ca97f259be7c50e25c2925273f8787c36b216fa1bc76d2445de3f5136fc9674d91bf153971e5ef68b234f453895d20d05f03096e3c0ed1e7c627a58c5db279e5c735983a87bbf27b4a3bd12f0008f5122d574a19a5a419364390cef1252197622e3197984bac8bcc6426a5c8921ca9df94321da386e79814cbe15c5bf7896126a0946294821527d6ba5a514a674b4ab9c8cc94524add23bf5ff756c3a5cce73c654f2ffce60c1bf39f93e38db367bd724e2b95e0eeee320773777777c7648c4ba639991963c6d8c3306c323327ed650c0929e7a44fe56cda22e5e7be45d62cab5ce4dc82512e1bc7338b8f25e900c93927bb2acd2a9d53c75f2f74ab29c0376d01be2264bac7cde71727e63b1a0431df3cbbaa7508114782b5f94a31ba84ad52003fd8d465242cb818c3dacb485850017e81050d70c02209ab821dfac1b7018b28f216635800d104c3304c054b2ea840cb009ec06207af08e78a0757b2ca6abff21855bca06b34acd8c1698d1b97a051458aada2835395266b650bee06537448582cc9ace4dcb0e6aa9e7170552a555293ab4ada82b7204aa56a6eea6d6eea53a92b7eb8a92bb0dcd40d82e801a8e57e0123515f918070516fad407151cf483c705284aa904191aae474485600a1564a6b2e0dc0a5b40a1f5c6a45511534e01e84418333785812f2c1aa38d21281d0c419480c61791c39515153ac649538f2e5eae80834260c1555ee2cc09d54a471670db09ce69c734e71842b6bffc089271ac663871459dcf9727e8d72e7dbd51457eefc0771a494524a1b3421a59472dae008cf0656a42062fe9cd3872f9cd8d003305a70848b31e79c938389020c1c512461f5824d8b5a6b553d11860f9688a2972788d0030a0a96d4134d442726cb830f9d1051504634e1a29c9218628342d4219d407b22c479e1244b41940d0a317aa84318695014e107fa6429b341070c668582a21ac50e3c4c178448a25140c941c2ac86bcc5350a24807061082d5140e1c4851428457185095c2062298a1cb8f0c4c82ba2310304cfb03097ab141145006a14e1c40e4554013a29420758952280e0a40726b4748b992a135dacd0ca8526869e0041145104af6856b1b10d10b12b82cd0013e19db8a2497d31c41bc6a42c66d56312bb20c03e31bfc5206ef99be0faf340c4bf566bc31587ffba212f6d552c0c6dc41bbb1e3f319f51c1b9acdb4b09e2e8a834f6d3b3bfb8b69f2aa5a1bef03b893e33fd98e4d2db3310fcae54e6d3a25beeed1ef81e84f8e27acc47c45b3ee3840d75e8e09d7ea2973e19b1c5dfee1a18c6d3088ecb1db8ae354ad17ee35a6b0ff6b1ead724d8ad0df382284563217e7dea15c9324ae9ccbe30d2c7aa473f529b6ed9e37b5c62536c395060b19f397eb0fcac060cc0a0728512582831f9c497b10138f2ebc962fd5b7d5f911217507ef09dd8b7d773a77f8fdb2db8ee188350843aa5ff832ffdb02f94f383b0aaed60bfb9234e82d54b3df6d9e2a89b882f1a88a3f3d957d4a9e3e637bfe370b4f9126befda59c72cd6e834de19b99b2f1fabe37f968b3407da4d2ccc6524a3265a2db0db6524a3237880646485910e6a58ae09891a24a108260840440d8a3080218bb5d16a52032d60036ab0342f23f5604526c5d32a0c16e2ad9dc9c308e01300b0e38fc9bef10a41ba57b4303100f35e6830e29c80009efbb12b7edff82c9b8bbf79949977ce9106e30bcd205906c18285b1f4910e8e4dc3505046df12843484b0d20eb604218d20323a16383b7078ecc03140eb1aa051a8020b50d244af95ab594dd178de110eb361aad1b204be846c327a1a42b00ca94228c01d19315b380de756ab93d0a3b16d31cae8b1b52933efda36d4dddd1b7377d7399239b20747c75fd8ecee7677f7d8e5deb1bbb7d34c0d5863c0c72efe2ea6408169107b49b1ae07f65e986d15fb9ec6b288bd0cd2458be130c7d2c9132a08bbf87980dc18262d8679956a84cc74b78de3ce89329f64661bba7f5766cccc9699ebe4103ca1583ff5a6645469c1a114aa4255e8052e7e55a494b40dda066dc3c6c7e8d3261b9f37ea853acc1fdfa56b524a29a594d99c2fa59452babb3b7f3dd2203fe52ed863d8d4a2820df2cca47429a5942ea59492c1adde60e3b39452b2942e8fe0a72da69c5272ec32659729bbc8c984c904c90425cc39e53bc628bb4da13ad8f82e6990a997ecc8c86808a329514d4d72367199b2a949ce262e534e2967939499724a2e7236bd787c9fcc2e19e717b99c3c2544e614fb28eb9cdfe3d393b3004e6cbc731ac166e34dfbacca4c6699967dd56483dbf7f4f6d17e9edf13fc8d7a717e766adadcb6d7e6c7e9fde0bb3df5f8c6d82c03468d0d573d9be296ffc74e0c7bbb1f7fe727d303ebcf752bf2965d8fbdf97d27869d9f7db6413965fd2f321fa6d3b25ff96fb3004e3c09bddac70273d3cdb0d9036773c28a0f4337895fcb567e58c18dac0323a594527ea1119c989898ee7e791a2ffcf9617eb5aa55af52a9bed008cecf4f4c4c0ceb5931ac2fe6865dad98c8bc3c8dca0b8de0e0dca059794c66647e62626038bbe2602a0eb7aa41b5adf2d26112192691292dd5b5bf2249e4f5b76ebdf0486b1d0a853a9d78e774ea3adee93a7669cff18ee4b4df78476e9ba6f18ea66519bbb4fad2abecd29ef2cee9b59fbcc33ba9d75ef24ecef61ec63c18df68df9ff23076f59f3cca3c926ffab5774fb24b7be94d76699f3ac9937fca637679cbe7387bfacedf7e117f2939a97a4ec5a99ef30fc9e993d244f5aa6fe6552a99998ff9f92b7fc1fcacdf9e6b2108baf6b9af5e9124f2da47755f68bf7e6ec69389f12c8cb73a72398ee338958ae35e5eec498a8d6deab680edd95b42a53e0eef43c5e3e4ec943f9fb9c8a30c9b7d6cba217d4d03927d614552e443fa49d9a40cbdcff695808a7c2acdaa57de8af960ed7d8006dd47639b5f04491874432925a0529fcab645ee7ab40ffaee7fd2b447c27d32d05cfb1aa7d99e6e6603c8741880dbf27b1c8dc3636e75fbf3553d9fbea755a7af764e11ecb3eeadfdf6c278bbdf5e3e36ddd46f1b6fcdc9ab39e7f9957d65fd4217279f7947fbd3b7abbf507b1b54a47941454d57e39a93af79bd3d12fae10cb79381e6729f7aee1e502f12fa2128a27df745b4efad3f24f44329f39bfc90d0f65cd62bf3fdf621e13e294d645ee6e96f350e78ee7e707c4fcb78d55b13c717840da07a99afab42ca7ccdcfaffeaac121f3f337d5b7b7a341557fdfa00ae6653c1c3532ab97f998d43ccd3391f91baa9f7926aabff1d65f333fbfc6b3dc52fdca5f377ebe8ca7fa1e87f1c2005cd557a47bbea87ff14223ac74431074bbdf842eb32bf585ddd7bf3d5feb6dcfbae1d1784c561f0dda0a8c98811041508183283e3cf3d9adfe0d1e68d8fadb56fd45c3126ea3c947e66f883e43d48749908fcca67dbff4b46f85fafd80faf2bd5b81ded63efec9930dbe62bee3623cebad292718563e8b85af97952ee60019e2cd3ed60af5d23742af0c7eabd2152e98ecfcdeb6ea890436f617951824109b7cba3de6965797df0af5fac73e415d82d82d3ce5d842561ffbfa19e6dc7caed7bbc9427dac3275006d6a6aea72b125d46fc1a873642b5df9d987f5a994a1f7d1be12b4920f957eacf3d15fdb9b9f451d77730ef3fafb01fd45b0fa2d18e9b863a0e2df6c1d4485c7d073e707f57cf71c9fe3f6e750419eece9f69f7430337318743d36ddeed9f568f693b3fcf9b2b080db31b05658c0ed5f0037dd3032bbead1c468cda6c635d87111d6294fb27315e8b8f543a2e3d69f3eec4512996e8d4b1c79e29491a79550ac6ea1fc0ef2e137ec5898efdc39a0629f8fed6bc7c2fc2abd96e26e5e91ecf96a5e91ec63617ddd0b5d855b3f242adc1a65bb3c85a0af0cd87d8a7d2cd82eb6f86c5314b1b4165d6a72f02407368842ce03d2164b785ec7288f36c6529c174497df89cbafbafc85245801d9380496b1ec807451dc391e6ebf6d918b6ddcf95d3ba7b2e06d08ddb0044aee6cbadb77b92f8caf6ddf378c9fbd772c047953d3edf19edee16a1e17a1cfb77a45e8a3629016fb045b3fdbcc96ed2dd333bd6a55c3744cdb4ef54bc746f5a9bba6f9d67a6bae6bd3c63a76bcf1fd95c586a561fec81ff957917f26c67ce10ae60b2dbfea88e872eab35fb862b141842516a13e2e62ed86c74ad1ebc7589c915fc6d58ddc754f0bd51f6859776466e62fbef65d2337333773a41f63a4941e493243e7546c6a571ac4d260fc8c1081e185af71aea051609b99397baf34f8168b62ccb237d2491dbb3b7667f1e5b6fdb66ddb16330f89c77844e784418f02db4410613771fd91ba09de6116e294ed88066583ee99d751fa8829ae431147252d0baef30be79c7372546c3f7fa1ac517af4b420ba31f7eb12b26460e33b958d19bb825d91f259baf7732fb179bb7bccbbbbe3f01a77f71befac777799777787797777777777777777f71fe2eeeeee38eeeed57d453383a326d3b04a3794e54e5d4a05f3728325a3847583663523a324060c18d58b92ee74ea524a2cead4714a68ad7453a26595e6f84e89ccd1a111d939e4155b70f4cc112d34976a15ba3e31724c3774a62e10601fd7c23e397450d9857dcbef3a439d4bdd85bbfb7b8f9618f6ad79365b11b91ec52676e4e3dec2cf7077af2291d8f86347b99b73dd845fb6871bb95c356a3e8c6b5cd6cfcbc894f8f2acfad4c7eae476dc5ba6d6128bbe88568b78426dcfcf21022e53c746452ef126bef64cde8a356b27f1e6f9c75f9e14562391c7cd8845456e9dc8976826262277125b49a9a8b97051f21797c8d35ac49bf85a70616a2791a7978837d1ad75a2d84eb468a9f9c215eb0bbfc64931ed84da3acebea852b3fb81dd1b344966acbea4994fe67333623a1b7c4b1a75094530315b542fee728975a225525cc7c4c4e44e2ceaa4c4a553e294b86c182dd2a2a8480bed732dcec4a5c1a8466f914b6e8cbec68d436057fcb05d0bbba2141cdfd960f943d7d2ccccccfdee9fbb96226c8cfc6125aae9192628fe4a713aa7c38814bbfe1b31c8db3caefcdd3d41b1f4b18fcffda6715bf65aad5ddb3bebd495479388669986f5b66958779fcd8dfbc2eefbe91cbed147c3beb0d2d45b54ca9e1e75d2ba8ab179f577e93289bd4831c62aabd58a777a48b768582b76d9558d0d965ab1974fc32f03649ad6f508b2e21dd495cf383f1f9006654c0f36642c38b458f98eb1a0c4963ddbb24cc5230a214123a5947ed635f6fe713e730dd2efe94a64bdf31174315a44f7a675cbe03124b1ec924f3d1aafa65bf235cfa65bf2376fff56ec929b7b2cff90afd86028aba1c807fdc21a8a2ef5519ffea84f7fe3066b8cb49212b726c1aefab1eafb576badf463cb4ddb5b6bc79ae6f0dad12d6eb5f8c64fa0975ff4f945bf1dddf2c7be70bb61bdf38b4166a928bd1d382028b9e8fdfd2bedea9d8d4de6784dc5309a2465e87d28f6a5d0a04c815d724a4c0576c95700dfc8df648f14748c6cc8615c39a473c2958e01704de45100dfe4e01d156e5060f0a5c32ef9f3637c92d1afaf7d3603a25f310cab7269cae0d421a961c69578d4f9e062d1d6f9d8ae4f28ba3f82f5892311b5eb9e4f1fa134189f28b1db0c341c894e78a76ff7f18412b2dda35efb6c72bc63bbbc46c0adce7e339c86387d7dfab1566befe9749ac15f40521f0ca8cf4883324a2cf758f730af7ad99dbeb3dffd0cfe02bdd57d4d755b87717d7aa95e4e24e097eaebbe1b724e9f0eb77b1450b7bae77ff18274ab63c1ef0a7cd371dc6f282f88f5f8caedfef49da058ec27e8af15b8d53d19b7ebba0f756ef7ec5de7eabea79fd8fef89143eef6e985ffe40569b0fb976e736ee66562663e2b1353ebdfeebbfb5902d3bdeafbf156f7b103d260f72727acfcd87d4c2452fda97b98d3cbab4e1f0bc54259d4dbd3a34ef6843afdca5bdd9f76b0a7eec3d5ed7e86ced1713becbbeed9a6fb8ac4a2d9a726b82d08cb0daa61c615ad8b51b4eb9f7591c84776fd6b17857cd4eb12099273b7813962a3bf69596c162bef64cca33d6fd66b40b7e847af278506290fbb280a7c43a906d84561f016cd00dfd06ae90b7449763d2aa5f4638c315a22fea2f1894486b0f6535f14fa58402fac98b7cf3e2f1fe423559f7ad5c7024ad1c09280ea6154413ed9cbcbfc4b4d7d2f1f7b2b4e919bac1cc795b7e8c378ff42e7d00869907e7b400d6adf4f8354c6041de01d19ec0698c79f3e911778277bfa30748ea66d377adacb08d9909788f00eeae96780794e4f5f039cd33dfd0e700ef7f48b70cef6f441c02f1d6fd19fd1e1ccaefa272ff24dfdce7306eb731e65b0fee66d0cd6d7f1178a932e7df6fada47fbeb117dbff42fdfd0fae9b08bfe098adddc7ba1418abaf523c22e4a9ffd6fb59f7ad587e32dfa2f40f653f56365f5b38f95696fa495b4ac6a35ab0f7a8bfe69079b42e760b9d90734a5c1faf1eb740e4d143af97067add507ea9e7cb0b171b0f10ec7925f5cb71ca65b1e39de9827e31b7faec1d6b2d8adb9ca2ed724d75ff4954817684a833cc5c636dd200873a3f6608b5f37cb7ad8254176a11a1004e3c0cee96f4757ae87777a08107f116100ef58805d3c14e01bf9d2524ecb62b51b72d6f9f00360b1f236734efdf60360b1f5fde7e9bbed39a0d367bb49e9c7a2d91bd9329a51a6239dd3577e922c56de21424e4416fb285bf7eb9efbd67efbee7b0e48fbad3f963b7d23ade44ddb9b8f72ecc43a23421ab1c929de6ae951640fb51091d785c9859c49cb1253176ff563515af2566b51aa4a995151d2512735166ff5917614c588e3a4d745de92d2eb28a827442dd44344714888a94b149ae1486bf196901f18881c252d49e9e9e000e9a95bcc13194e7a9168860501f601bde5ffdef228e4adf68e784b7a44bc253d21de92de4f0d273d203838e9f5e4e0a4a7a383931e8eb72427bdff38e9adbc253d6bc349af7a4b7a2c80959dc14a8f0501f6a9de72d90918f216c8498f05243f18bcd51fe4b371ebb4590103e946302e237df1837cc55c19666e7c18dee98f30ec8a32d4db57cb627d75e58d4fead7803d7d09843dfd3e1616560d45379c6fa495e6d785d2f53fed6081a68438389d1373c4079106fd67f7d3e0ec6910c7877f83cd4bb6f0c6652d872318bff0bbf1f9dbbfb0ef3718afea200aa101668c31c6c8aef81e5bf16f7c8c4a4a428ef4e0064764ecd84c8012853ef56cda61981c815235246717135309619c77c5894f66b0f20810b656cac4c474e4c81115143664a623a4e61df9354b42a6c1e460436682b2bd98c15c8cf47041709d92ee74c56e27948a092818daaa6cb02133f15175e94920423a8bd44b1362528aeb1893224f04d231e945b506962337f222214474705216757a51ca89b261d5ae62d738fdc2f9be756c5ec13d874d32738c07f0c2c2740eb78a1dc6b0c63f295629b4610392152cb0e189248c80c40dabd665a4329eb8a7cb483cc8610d185bd1e83064b208c21658ace08c2cbef0342a30450926306083871900c194c4134af8b0050d2c43284388223ce1c5510f16a5140013765eb69203130428b2f5b2951c90a04866108159c961e86e97ad3461a3d7702d6104932266a0841437306a1fb41449741835a805549a8cb6a8428910d478c2a70a2a866842858c13302142900c94a0820aa32fcc6062061a407409c3084e4c21c4141d7079820344d0c0062e6010c590920fc188043734f1448726286109679cc14df082cb900cb890b16404dfe25a18074c8c8104222ba46c9101ced72c965042b542c4e4486594016385480757bb6c85080b256af31bb513467d74e5092b188a201714c1a8054760b1c610429e250442f0392aa3890a9a60804614a38612436432a4022f24242424b4c589932daf4587036891afc396e82de4d19b9c6c1c5fd873830d13bfc8c3374c126f94427fbb51250ebd0f76e304966f84e996cb1b3e08aff2eb7e649c445edf912de994dd4a3d61e3cf2fda25fcf894131b8db055ece5639827035d210addfeab55e6d56fbb014e56b5c7b4ac22f19034d03863256cf62b599379d4c3784828babbbdddbbbbe79c18f6cec4564694324eb0c619647421c50bc808828c1b968ca0ba8cb434c6cc65a4a5a4251a2c4959ea610c36c640c21867c85c461ae34ad218518cf182315430c6500e4968a265088b09c4c8811855c49881182e10e30731726023e632d20fb460f9c11596062eb8302c38228816fc608805b76b821117264b142c2bc0a2888b824205b7a302e5724610714f3f5c19228b10f7e53252184a9edc4e8d2b29c88282ab9d11c44d8101c44565f1c3f51b5cf1214b0f17ab82e8a68a78b8f40527b8d5881d6e0784934b2f23f960071dae652387db3135b95996a1bb8561828bf10087bbe180c99d575c5992e5869b4971c5862c4aee160329743b175c69cad2c69546b071ab1057d6c8d2846b2f23f5a0c915266459c2dddab8d2258b126e97c695247041421635ee16c6e730c3fa11ae5f4602030c30ae706a051ea51777f2004540480bbe04549f521a238db45aa01f20ef6d9a4cc005e6f1e71d5a7fae1a9c5f6570b0212bfdb4108109580003fcd2a94a3ab5cef97702fdb06b2ae18029ac341f5c71346b28c5408ad534987d2c1ae96fb4522c64d51f33d6844666c4e6a45fa433624f2316e7b4737e2c6c3ef6b1300c9b139bd954025cd5ac583435362be660cc38b2e2332a3a02408d0d8b66b5a259ad6c914dcdaf56384c4c61f31d0489c5528079f855bf21f4931f0e24f586b4101d6cb8ba14c0b1d915c22effd313db92597eac39b1297f4a39a5bf5c213e46619198babbab7588191860977c29dc775ab86f488331604f7f089117302f89bd1660579d31e98b47f128c3c17182e3afa885192bf94f6ad147b153e2508348d90c6c4c3aba72a59d81893c1790e11d0cb08b89020cde0879626bad4cb1c8a4e9c0daa0209ffea98951b3ac9ed0f276340fb0f22bc3aa579dc60acb3ef533d495f5ce2484628c1c86b591235e926e1561977c0ff08d740ebc61977c29db73de06ee68d088c300faeb87d6c73a1fddfd61970c13ab02bf56de927f02efcc977fc32f06230ff6f209b023f2642fbf00bc739379ae1df6d26f1579b0afc53749270800c3b00108615c6a0a51877fe8b44efc8142ff40c17da0905d9f73fa9c523be9d0d9d9c8ee0737d8fdf8f958f7c39b92310c8b18d6da09094a763f5cca1fddfdf0ee47164baf96c56675326d6cc3c1649bc7d91b564d567bad734194514a83505c4249c02ef923881995523fab948619581d1d22f3669d8feee228b294526efab1d7e3587772c262f3d3316fd8d42b6a566b96d55a9bb677cd6ad0715cd771b33d1edbaf6aa66d9f0e8ef6e9e0b827b3a4db9e28875d591b1362dbb8b94d8fe0abc5add9fecdbf524952cfa32e62b14b3e0ddf14619eac12bb5babf5c3191b1c21754bbe94ec352fab300d629c7bf18838c58b4b744b7e0b8cc06a8c825df2e3137ce351a278378c464652fb19fcc57df1894fbe51f7b410e9c355dcd0fa0d1e6558aee2b27bad350bc08d4bd5ca0b53f10bfb6cb8cda673e263fcc2dea625a57c7e9e99e117b317bf5bf2d3b055e9a773429d2b5f2fa49342e7c897cf2e798212df0ba5d58a5d2ef4db2b1f8877fcca1701bf70b8255fca9608e057c8d3b15f401d060dbf70bcc53b4da441f92f6ec97fe1c89ffad4bb55e7006159527ab9e1eaa66eb7425fec5babdd0a7db5f7a858edb3a206811a940f34a48508b04bbe8f1f2a4a1e15cb376a58b20d468679b19734d2ce86108d146157e5f100dfd49ae5f0e82e07a7c1fa59e61969100625360ee1a0842c8f06eb6799bcfd5e03d8557f93c9c1cae01749bdfda83fbd4f57bff690c2699dd6f568b2213788a37b97a74e2bc2afd3179d74ab7efd803882f635e1d6df28277383fd10e7662feeebc7a1531c7a20feb2df0a25843d7ddfea22a95d8f9f25a8afbb38d460fd9313566bc2adfa462c0961939e685eb5ded250d93357351dd8556313bea99cb7e4861208f970acec51570af771675f1c8252638dde12ee71781feea3a269bf753d32da0509ba5aac7555ad91f9b1b28f393ef9e2a2938e43cd796c0486ce89482292be8dfad3671f89bacf501fe8adfaa78cfb2efb581a4bd37ed3b22dd3b2f756cdbefa30b06ecdadb1e885093892b20f549f94b08dc958794cff64171bdb586b51d7b24beee8168f6ea598a7a5e29d137ce686f64acb3b280cfb0dbba134bf08f65549c106a5ddd1a0b49db303a6b31b3b20a306ab538e51c29678c7256c138505ddd3a3b03f7d2c20fb27d59f9e7dec07f954d4a7b0477d2c20d4a73ef5d150c30bea837ca27d98b7dfc37c8ca1de3eca4e89ac18a3576f4d4c27059dce99f1e8d3c6e8a96e276f47b7e6470f64d7041d4ba1c1d9e3adf9123b256193db61d32d8f6fe6a901dd9acf7f9a73887d0cf08e0cf602cce33f5fc810dea13fbb1e18a555767d213abcd3fd7c149887fbf93cac02338073b297101d1b73dee63983d86b1e6510fbccdb18c45e88bf5013fbfeaa576de67c9fdf29609f0ebba6ce9d18b6f2d6c4308c6215a3d869074b3f7c1bfa014d9961a60e8abc314ab13232d94894813b40558a6f60bac6dadbcf2cff7eb4f6406fe1780b356def4aaded1c2d126141bc96659a963d517dd243dc72a795ba67350832ab35cbaa740fc889069f68f5b34dab9fd1da5d295b966173238e1b639aa6a27ca06e7fab2817a7ad88b26939750bbaa7362ccca79efd25e3431f27a394f60edaa53c3ab90da6e63198ba55ced2e7b1e3045a6586629847867a67784786d5b5abae5d8f0dcbbebb8a79dbad35dda230dd52a5f8867efd2cbbe8cbd86035201de407e41dfbf45bcc7302e7dc20e0456774548b3a751c10c60246ad2bede8f73418843a901d0e82dd0ad86b0ff3aa1798afaa52ffb2bd9156da364e92b9f483d0d73c5ee2a688b2aac926d53e97a27dd65e0c49e4bffc9e35bc722fa2b6a8546d58743de910d100000020004315000020100c884302a1503420c8b2de1b14000e7398486654170aa491280762140541c6186000200018628c31c814155501adb64ad121e68267de05dc66414b0192b2c99904d78b62811c63441cefdd086fa45d23c4ea2dfddcce1af0e3e2b9ddea3d2e65bba93f07f1c59389cdc74e88304acf3892d9bd7ed743c5fea13601808dedfdb5ee3a724f371604e9c3c41cdd767795a0debb90827bb90a030e1cc1dfd6227666abe0f2476168b85d92c8105e546b2f625141bc561002aaaf419ad79bce52906ea36db067f465719d7696e225044a49a1944f2cdfe99b65d335ff143e31df13fd157505f6c8d55161dfe7a963941dcf6f1784367056b8ac3af7f5e79d56a67d2f31b99adab1b456bcbb4c903d55af6a1b08d975cc1839f970c4cb19b8540775c70c497c8614df17d3c1c6d92d3c4d6a393e768969844f72dd9378672fe1767d6bacf8ad3187b109d62936792a4714f90f447c46d1e2d714ab200cd582025ecea6c41c44b72991bca4827d5eec13d91c86d14333279be7f2495e5cfe611bd1395a911d89829d4138382b157cd759061644b49a4e62f79a67d563ed009d4439372611ab04b89027da8ae8fc1ff9e26894452a0dbbe52e816fa154a9015b680808e3231f1967445fa0b6cade0e21f5af7a2a63c6f04da34723774ec0661b00eae40fa42b09e00adc0c738033ff5aa9da41b66d1628c3473c368cb861967c284e6ed6536b5c83e56f0afa8ef4f7cddc1a78472bb7cafdc0cd1ea4be39889d426dfec678ad6e36fe4714fb0764e72713109a3682a42799ba8702b186ad25858f05f5a92721cae4265b49c34890713baeea52c19ed0afc09751e5e6ef9a776299d9a453d27c28b6d2355b92920b120a556c08a7573e95b04b50e1768a299818d10d1b0c6c9094a98d6413960a1f7d66434bbaebd38f3365d2a4e280a540453a1f4223920964ead75e64f80f9c31489363b51bec9705cc492215a5821e42ff28aa40794a95ec20868a655ee4de7e1ef6aa196f3308396955d43125fe9c24ee23ccea8dc5fb48a9b02aa67ae73fc284c2609569dd126f259e793a6f130c229054df76fe23a5da284618ad2a2dff2317080f55553d41afaeaa8f31e88530de31d809fa84afaa4060733b7d1bbf0812ed7d9a4f721a0b43615996bf1a0bcc6c2c9be85ea43187100ad1db7a5cd23cf6d3b7237ea15d8920f8b6e0e4e44545daeab9aaa6a6ed7c4376879ae63d2a103dd7c5635ee02e00a1ba53d33c3261721a8cbb66166c7dabed3e7250b2a2a6ef6d24b56610f6ce4092ec34e08ea0665aa101b9c74981c65fd001986baac1f9dbe5571fee8f6c82a53d14e384038a60c7307d62d8b99de4e9fd119b6f92533eb4f10b70844a04b294dccdb7e86271bc4248c5c9bdc46104c2ad0a53bc49089f8ed65274b951adbe23bca97a17d3c55b2a3bfe96cea8ff886e2bdee6f48d59ac02cb337148f8447e94a314117c400081ef43b57446fd8ef046e1073101741cf7fbaa0f1a426cf4d4f6d3ce32478e9123d9a85d65b97488fb2b10ff4fb208463a19fef524dc6d95a7f517e1247a350b3c63ca17cc9225685af1777215bb009538521557088e156155fde15749a2fb1fda51ca913828e380c705dd90b1e1dfc973a3131b1fb72a9273e09dd2385222a2e495d4d3a53572a27eaa1238cd2ff51cac5ffcc2c02dee07d88becb4ad30ba7c4c04939deefa2503d75407a767ec217e38393a0d2ecf49581f5c84d31163c62fd866c581093f60b2fae4815d615ccc74ee1cab7492e25400f5556ac244f267636c9c4c5a21172f42a8d6d8eec256c4133059d5c53e682798c6086212a1c7d55774db521a0de1cbf3f0492386efe7d1829b3be6d50b1989f68af2264c77d78fb6a38d6a9c27006900141c17f7879b60a74e64ee56fdce02cd8d5c25722d2792c9aa1029170c2cc372bced2357f48696905c5b53955c7a659029067ae3531fc7d7743cfc82d23c48c4f99892ea7d184ebd733a70c2ddc33752b2931059f67e41a0075b4a3d17bd2ff0d11279a121c0060dfc30b1a449f612e33d5811f7c63a03f81b633dad03f9c8c43144ba623cf0f60698c9ffc860781e4b6f04f7cdb33ef6831aa06f4f6824798609e339957358a4ed42f6d777928c205fa88959fe9dec7f8532db336203713f4f21d6f6122f9eb016717b46bb9d8860ae03f2d212f52006a300f31944876959f48a5ee16d91baab620d705407c31ceb3a6b42f00c255d2f3e828625d3895b49675f695e8b66fb98b5d05afd4ad7ffb9888231160f42447bf7eff30819e938f6a52fb9c04363bf97f4c5414a13b208bacdc17ead0456093b7fb2369a244f849654e9cfc340c471993d1e3ab3f4915eb311a22d0cece2fa919be8a2597a4427954bb9076a0ae69b0469c6f4ba1c2e318db7fe076d243429592c90a360e2dc889d999d7816b9a63b122e48508aa84dddbc4d8426aeeca2bee81e187d8e2ec0b9b82e9a2c9180968426a6bfdc06cee6d17abac1dde03a9d6af0e0874d72e753e993263b2599500d08d944ab5564051a10a0e536a7a935297c985d2d09317920b5ea574b1c6c8bec7e6d7fdb98a68581de0e38630036c1409bae8df108a9707885b5cf0841d69cd09abf9996b5e475633d494e1796c700dcbd74d64ce9220c66c32b3318a4b1d38094d572a390f65320c24d4888c4645a8f34dc7b6a50fee352779e8d90e9d5cdac20e0515835cb03a819cd61724debd0383ec328abe6512ca6ca1d684b5b019cce4d17ce46e18a5a67051498bf3c42745579427c8cbd19fca8535393bf3c0c30d98f04bb8a1c99dc07da1bd04d135b11285200767ed4373f87768a660c91e51fdb1a3351b43537b613c1fb9897b4daf87bf6fa10f414709dd2eb20176c1b52428f071c987b563edd726f7db9bee413acee6ab92da64de4e204dcc74dee9719701c95c6e4a7dcfd5af771184a209a9e80673226882b136a71e609ded70c7293ad46c8ff9c02da7c12cb3a4bc537060ac28867731a823c30cb62de804a186026e937c80e8d8880ba0be97ba24805564deccf2c3189b4708e543a4c873322aff11800904e9f33992cb4e7d1ab04dd12cd9fdbedcad5d25ba2a1880fd567ea77c9c6fb1f2bd2f8e183f6e3661f61095d5e898811624806b71b7404e5dc74b1721e353576697b85e24374b78019f0682b25c779f32b527ad3ab93c88f129b3e91629438eb288db08a33af8d489679378eec838c52b407733003a8d84b998d7aefb39b1c8ff18a370f083f6387460aa09c7450bc0f9ccffad59784491efb640622727de772c5c53b83bfeee59482dfd0fe0fbd8df278a45fe95bbd3494825c2edcab25571d2ff195b756811c65ebd0ee80dd600de274489d0478a5be74fd39a8710e7f8883209e926300270effe1fec05672780d41612633cb6420debb15c6145af01e1cf8c6086f233dff5925dc97cd2a89d2737e74b0da8c0486db67243089c587de1bee42ec1977d1d457f9b75e6d988f6918108c7903495e191c21938a52ca0c9a9206bc47c4eba798be72f9126bea561470f21dcf76cae091812455de57f9ae30636ed4780e78c80b3a0b51ac20e4ff375b4ccc4461e33a8f9757b5442becc0ae8e6b5b44f0baa99036063b7a01449fc12f37561d1b4abffaf89c7c334fdb47ec4c8583da031303907e0c0ebf2822dd5a76606d278a1290fb30e62c38198f6223336d8d446d4a84f0bbd96ea93fc0d692e291744ef4a5abe72ecf1c701ae35ea15f7ce98282df4617edc6792a00342b698b3cdc68cc68811bb8c9834dbe9e0e80d0cd163845b9deb2f766c63b035027ca22d3f1f1dcfadadb8f41baf53035988f851911e8388cdf2e14ecd1836bc77cb2d42ec19e2fb8b618f8c753a78ba803d726d770eaed0d2abec200ae69c04841c15acf60477b213035f72181ab0df77b1950886d7508753c4fdb715f84de16f81a75e871e4c8eef68aa3afcbca306f854f66fea2058670914c556f22e4a605436e3c7711a6f46d5689f0857025c46f40d7dcb1690d86eb0ed6ef3fbe5e0f2e675455277bfe33b09faea9cdbd144a8ecc79184ae29cf48108699f0b4546079e4ae536a8ba24518ebd7590fff3d5acab0ee3fd99e4785c854bbc5fe7da3f5e51385d2e4cc359dc6c2b5c6007cfbf530e4f6badedda96bac0a8dc5e65acc9060fcd1e884af99d102840b2889fc592780161a9fc48c9ec92d1135bebaeab1e128bb0e2f5a2754031f01f99813b925df2c51916e2e5916f54534ad849b34878346003e9e8ccf0862e789ad4622e0f787d25ddaa0d32b567dccc81cebf28d4d01ceb64e80ff753e06a17c926f695e315c8eeb067b0aac0b1c17e279a274126463c1405028fd83ae65490e83d07acb41b2bba5c77791d0e30cac1fce9593115b6c3ab017f630febcbdeb4ab1c8f6d07a11303b00a2588377ca35d5e3249d05b7df5b3a7f4e9480bca93a37c5f3fedb1c13033cc30977e65451a3fe467460782ea48f33c064d1c205bea5ffa8c8062a29a2e099410c688dfa9a8bc4f5a2351bf3bef231a131067799eb8701bc28dc269b4d1ed39974520347759ec502f5f64da015297d3d44a061e3980b1382529b252f07a8a5250cea15aa665fb39567afdb3d572caf7f4dcaf12c9544ae24cfd6e58c1665ac9e7e1c2ad8d443dbc5bb11c29cccaeee8ac42ead27cad770c705b238b0194f77d1224f4ff98a3f5be76679f43e25fa36fac564ba76f7031e90c2e784569c8108926ff075cb8cf2724ae60015922a80725d5ca5e1643a09baad146efb7067e9775a7280d3018a3669f97a2df154d33d91e2ff7915a4a843e9101efc20aaa1a6aea475f8218eb02e890ad1c1cb35d3128ec83d9fc7bd90fe5a986c6357f2f5c8ca05a42dbfa326ab7abd56140040ee4b61880aeb680b262f26d892d77bb8201cb17fd3ea5f8856001f3fbc730d37871d2ce69bb586c81023668967136e0855989f92d9fe7e00fc4115af2a153ff6fc50dda5ef69cb5ca4449242229cdd65bea42e6b98b1fe19b5fd97e2cca219806b17e256a29dd21abf2c5a85aceca816ff5a0c047b9a61ac37eafb0745fed28bddf11e121364a1cb3bbbc25dbde661380e0e1b560fe8ac69bab1dfe152fd34065008520c9b786783b260a71f5cc0c2e2ea9181258ac2ed1a304f87482e43e6bbe10be1f62f503d9bbd6555b413880ac444e5950c55824043303e24b9a14e88e01f039367aa38829dc22721d41e9087c55132be348e63d79760ed90aea7594db9092374ff8bdffc17dfe3f900f918b50be49a3baeca61c67aa5ee82a44e4a4b03eaa10d417c9352f79377dc556e52fdab60fb7b7f6633243665d9cbc2a5241b08105b2cb54003d221bae9b613dc03494c0766d500442ded0e59de875a6c587ee0a74f2aa900d62133981d7054a017527e1f0f2a06c24b0d09d98d9974d8d5509d26f0d3c5afae09ac6de5252536db18b420ccc31649a76401ba124e338af97d71bed34ac4c443d3a945ce163c4a5626061cdccea9b9bc5257d612abdf0c8eee23157458c013cb859286cad6913651d62ac3d81248287f84b32b7467f315b964d1334658a30c4f14179e5026ec2c30e555529436899953c9042b8a196a30443e8928434c31bb0efa6f29c2f8be7108532c9c2b2b46c512afe309045c5c359a7787ef4fdc5a47e10f4a8b7cb995cef769a4287ea4bcc0cbf885d16451964d9a120287346f660b332662cc7b009228c2e8ea9f60038f4fe8609930924b6b08bd84ec56ef9cfc564d605c0cc00e265e7cfe14cae009cb6834f16d93eccdeacdac6e7badadff84e6c80581f20f8e006e0920d64bed46d7fae47a365d89ad71888580282957c19cc55afc347edefecd2522ea26e9562f84e8a0efec7f898c7f05b82743f8330556be75c0a83a32f0a3606e18b3ff9f21b94ee15ae92f9909564b4a664fa72d8ae413223ee34f5d5b3235e659f265839a27af614ffa38a62d4b7908e526cd4e302122709f68f32f74c44a55ba2c2801b66cb199a2515823dcc7436d4ffd033d5e1fa0cf433b2288df9a147dc9467920a29652fcdb29c7d717dc576943ea90ae9b5a393d6b8586d1fc1477b670ff67fd09b5be4022b7abac859474bd8f8f3d572cabb9051ca547247b43489d339d63655bc6d135e4da61ebabc149f9e78da150e02c0babf5038f0984c13ac07120f20ee09c6ddd03f0793a6e622558c994e7350bb00e8c2b5289e6e87320ffcfb3a3651291984486dca9ec8c2026bfbcb4d17507c28e255828ff01373c36d96c97cedecc0f218558981e52cc73e11745d12c98d7911f1c725cce10339321080c68a01c3e2e169e025ac61e52c0dd4e40ed7c9ebe735ef9c229d8ea7602e75bb6746c2147b735a8f6dab5a5cce634f36a737250853531be9023fd4d6412b2ea58c16d055735928677d97ef181c51d170a405c87bdbd0303e102542a9d9cc2bcf71b7ad1510d99a6e46652c3b8814a911bd16ed4a7d54e68bf20e3139ada9727a4e9a9c38266f73f25e37616b53baa7d3700fa4b8be61852ea87ac2866267e524a5f6ee3bb7850cf10c827bafc0e323f1eb2172333df3fac7db189cf11534610db4d6878f9488975c1f807ca7f89490b55688ee625de50dd8f723baa37d137d2cb7308955aef02a312aab1c241566c843bf93971b4a0c204b0368881ca0f66b5b9315e03b1c21b1b9099cc267dbae4c880810c1b6b327dcf250596c7ee5b245b8f5413cc7ec90a515690fb5ed3d481a4ae6f921227349940c5eab5055d3ee976c2df0f28f139d11f79e009ac4356c279cf2cea91f97cb5259350bf1d01e415490060ea217f56038b5eb9720beac1f0a1580333275cc8321a48f3f56cf51a4cde698c6ee246ea9720e33741ce4896eea7e1064be8e5f1af395463b9f5f6c897e46a50beffc65d9de65f9a2089e92ab7563fe32447a76dfdc327447f73c7768904d29ea15a8fb875b887ea37cd48faedccec84b239330201baba091952963db90c6b647284ff145022c78827f368bcfa805afcbd21dad9bb5038dd18a525d890d66dadc241f6f5f9db575cb72d7aadf9226ab13f21ebb5db2531b4ecd5c5128f533a23b6a0f316bcb43b1c1c9cc7f9942b4ca940591cb9e30593dba7c433808c4f8be55c8ae40d9d65665e5e62aad402a16067347e61199a6ea79cc66469f814d222d5ff2bb7c9b8c57abe74cfc6b28ec2ff16e5f25f651950b8030be98a3471a2526937a7861824678cf2ce12598826f90418662e0bc08f16b98634d494152d84ac034164541dbe4fb9cadbe4fee6b7cc78068379dc47ea9c254c405103b6043ec3fead90926710f3308ff84f1136f67c325046fb54929860fef5f78814810def2b736ecf4905408dfa1edd3b5de549bf3f1a4386ed588914572373e39f97624c928c7d70ce2163b877e832e42e37d95662462f1a151f92456c6b1376575d94a073e27e88926e56164c9e080932201e22870aec4f0c82d17db623ebae21e5737c31a6b9d2e8f7100f88439071749e7fe15ae9019e9ae42a0f1fde6566a86c70c401fa9ff88bc6c56ce0d1291dd59ca6af157694989109ab1135f55a0bf4a48848a84f530fd807566601257b5c69e65a6a604c1629fd592047719a9ad3a62a03329ed2cc44008eded2255f5788fe8b5aaee082198d2b9a1adeabb68c2653b8f97e223ff0504209cfcc68b282f391956f3119447462097f8f0ba3f829baa8a2e753b3998e04b19eb69768d834492eb6ab304eebc55f81fbbcb106dc30f6c73a519118cc5c727402f623799cddace960f82405c571733987fd652151a3e2dc672a6c82c8cf00fb5b90d120ea5bc07bf90052ded24bc664dc2ab48b011b8342029f269b27c25ad618cacd1bedbb6b08d15389380628fcca383855077c9f05240b84a5fe97bb1953970691b0e8d2390119a1fb73ea4e2a7ee2fc69a47de3be80ed10cd7bfdbdb14595a4812c1b73cb5d5a5ba1c22541ff01ddcc21637b4c16039b5ded8fc5898f0fb2a61f8d2f8d4e7997da2c1a87d294411c4841c895063d1b18d2bc9b0dc7622c8eb38e4b6eaf2ef320c2212517cb0355b225730078d29efd51fa19501929e8404d46243906e2e2130820ee00bd1d849608dbca4c3a9e8af6c44e94aa48cf5654545e9ad7dec1694481feb72680fdbdbf95c7b5ada979c17bafb3627669d6b9fd619aabf60454228a10a99049276403b5ef266d8eb8c6d72d4ec508fa46480706267d42db00390a997cb11ce81dbfc0f933c6269fce244e40d07b56c8f0044ec12f8a0b04f841f5bd44e0d78ca9ee0f15fbfe1f46c4afc03960b83c37d2f39cb0d72e32b1f8f4bf484e0860a68f0d8b3c41ddf909ac4d5b3d7c4efc8b43203dcf66091b18d51d5571c1cc96ad2d143b0af68bfab3e5d4ee37684807983a730fc53308f6defe48bb53c323e088b6577647305e24fef966301e90a8069f6baaa0b8f8dfc62ca6e549205fa498f73f5a072a63fb44b9a65c2c9671d4e2449d69e6152e8a55413f93f1d45fbe3807240fa2aeb6f1dd3b012952a8cdea136be7f017723423763dd2e089475f1cc07836e2257cfe8d6d87ecb14bd347803ad37dc04bd4b2373e530869e3987d28e0b90da2b6e8d11e6cd13e2624a0435dc5918eed3963801269036d9865a6fcf642e7879d00c41e3acd8c1eb2aec691f6f09175953d90e4ea56c95e12cf98f2223f98da000b884322cb57388bde3d7d37f2fbdb1546cc2a629a8fb19cba1c6e8096f901986ef2c866c542a7d55a36a6bc989714cebf4e431d9d4e22ff30446d7fbc0309b5031b1c02f9d325d223f547373c4ca349e14e85d4a1b3088d1c495b2f512eb8cd15c2b4ea598736625782d600b2ae7656bd9342e3daa030e11f6b920538960f0433605e6d4c429c58e5b5ed7bfb49d1eeeb626c5adb2a3bd190add64b6f9dc3ae55e2967fb870b36e23b7c15a9ef35868843a7040a0d0fe2c8c274b532400074cd3e7589ca6efe4e1090bb5e41edef21799337a627531afbcdf552abeac42877bbb8dc9d4676f5168d0bfaad782f8cfd708ac2ead7ad138cb686279f1fdf58c2adee4230e4922ff48ab7bc062f5c6918f6a5c6de614613e9845d2f0077fa24f9d1216161a06adcaff4a07ec9fe0bf3a2c5fedf35b591b95d4d828f73c0e7f59cb747b99dd3433e5e7ae32e0ade2052abe4e2f48e1b05c76d2499cfcef01427b00d67698b8c733dc2d75cd9d3409a95111c306b748692c9fc74350d6799be551adaa09f1ad6dcda31f5e460f67e06d768e40982e7c212b64c78ce98542022fd9d591bd1baf2af3a3509b3535fe31ec1534b6aed8d163f98515298ab2701dc47f1f8e09304514bca92271f6bc8602f2344424b6b410bb69a5d25195bb6d069b038e72e7dffe79f1a0291759d5af51869fbba2e0cb6557f1cfae22d5c38aed8f33da45e3d6bcd4fcd23789dd5f9f932c35b64723ef8a8190638c965735fcb400bbad5954a73a8c234c889bb84260ab13d138fc0263bedbbc479fc2d424ead3a735ec5b0801198ddb80f317dfbe84185ef5f797d5d72b4f71128e641cab789ee105cfb0926a4e1a3f9baaf81ef7204ac1ab00b46fbc9842e6bdd997b8a37df849ed4f629028c36dab6c4a0e27780273135f619abf468d8ea3a25814a8018c095d7dfc0a0172efb7c644cbbb14db5f8333d0a7bbd70a52ad448f0384cd77a3f94c31ec258a0ce37115eeaa6b62fed5c8123453809a1c9fc806db38a1541d04aecbd593c6b1e741868764c5a2be5aa9cced303dc9beeb68e7fc96a24806f4d2f280266d6441fc0224b8013194bd13672fc08ace2cb7e9d8980e600b48298cd5a82536396eeb9763cedf26a5ed9196bd43d8256c3b3137ce8115dc16aac3b3da26bc2ab9bda444d3e8dca5723d26fe0cfff259dfce3ed4e52f89d622c00da53bec616d0ebab2a57679a4a8b308dbaa51107220787df9fc594871e687d0bb91b84a09f0f852e130c5298ceeab1d2296b741008acc500d2860ce0915269fd47af8f2426765090f88f0aa002935b708a26a24d69c34cd679875cf46442ae65fb0b6b7e0c85f7784c7bb4f5a60ab94e4a36b8ec67b913e3d663357bc76370accd64011443fa9075a9ca02e057292f0212b3ca46c4623f62b16dae1310cca836227de1f3f0ba40ebb4eb0a4ab6602343222920b151e9c4011810a15a07891df8552bf72e6f46af2dfd45d79c959d1c436dc6b9462fb146636125915027582c380ebf73ff2b8b15c4b21f5b99c20f88ddb81a26f132129d80aa81fc55bf1f29a6f0e4e5c65bf4a1d4a0fa451f7ef43b950a357809a10c1ed1501fb92e447ab44f63d4280ad6a45825d233d36c5c670900d0800ae3e0a84454517d6bc1f0b675e01689ffc156ec75ddfda8eb165d41ec411210803abe492e5762f10b9a44d2105d304dbab22281535e5ff570c6d6c398506803328abbc52fbf5767e510813d60c0bd1d8880f6a88b0fe38c8435d6314374378d2ea937b345e32dec1a0cfb0c64638ff8ec2e832bc99eadfc949ec1a97b43bb51da987e301e73ffda8b2ecfb60ff0470255263069a9afefd7c75e269c8d53f0dd46d6ccbb46069ba65888e6badaac8978a31f6724276962195df087fc6bc8469a4ae1790419e2309b486b830f7fe6c287e366db1c398976a79c60c23b7c94ed66e92f54bb61a1a0ebf6a041d011c6cab0994fd80df84d6118e080f072715ee03402bdc9398f078c494144629728edfbc61e26d6c7beea2568c0fccba7712839197799683e359db3710b91ed5f2cbc9e562fc4e1a2d9bf82e69c065b3b29ac139f03ad191fabdb544755e606c59807b6ce4ad4051decf223d840e4f63b7d0a1a32a79de8f01280c02a9217855d88b7bfdcb0f8416432b3539da890547adf85fc5cd367d9db1189e6c79a1bddb73b701b47c89d971c8749d7ddfc708959b6991af53cf421c9d88a5ff1a8c041cc7e94b926f561a859dd417c8d7ce169ccd495447322793499b97668088d899696344ad964cd94c471f80f97ea5642249afbae784d8003a07ee8f588253271f1eed3bd520722eb4fa2eea55059ea65e34572c60fa52489a4e31c029a0f034a1d449eb87d3284abd77858bf7910ea8d0cc0b7827a976b3908cda0a84d632c7ee4a5397c9856ee019f8f93fc0dbf3f374b2434789796b181d99859d3e78045f0898bbabeac292c9a545a931df70e40d3cc108ae2ea732bde581ec67f91cd860cf94218ed63941b1bbbdc4fd443a5b62dee7ebbf1f00a35d1737488a096ca649d118a1b4d3b9498adf1a3d0a72afaa62821639eb7643eccb5934e8354cde6328608204703abd6c8d5c2d26e460381bfacfdea6ca2abd188b4f1a98a5e8431f228e4e82658cb6f2909c49ae72832e8ebd09c1c2a0a588bf490349614ba270fdb94388ce49c8ccca1e2b500804140f54409267342c105bea3c6c787eead27322e8ca09703b7413cdcf6296ffb438c6ae1a6c4620cefe2dd0b16dd6d017ddce8457134e2f89d58c06608bbe299be9dd91f77c028813b6cd53f6debf885c5d45685a42d035744bf77cb128c4b0fb85749000dd0ca4671b26a9648fd3c8fbfafc1bfab8be9ebaee200227bc4810dd6aacd9fb6609ca331e54b5303b58838f39784477c80e04aeb1a1fd63e7fa6568a434d675854cfc190e922ff5583d0e4cf56d8a50700a5b1f67300b8f8fef2acf72005a950f12153f194cbaaea80d5385e9236b0fc53260aa582e69b4c3f9f5b0e6a47e28e780b556eb6774b1f75697f0c45228a60bd608a3285395b9f5c9770e8a5c11c8afbf79196a854a92a0f3e007ca8bf14964495ec65eebdfe97c592c509f57fab9624a345ee8168e76a430992fc7925a4275aac61493bf12f7ced7cd3a14aa7c8dc29266086ad7aa7ab69713dd9fa418fd0e5a43525fb1f68ee103df4f52a6d29277d51feeeea86fa830366bf0b8c6fa5571d881a7e82d4b7f487a654152f6d6029d504dcd60514232d84fc790a245899364d944207c8cfad8b9481c41508e11432bbb4052abc4912e8c4fa20d487d1964bec0be49224d60508e5afc2ac903e6389431276c6cf4656be7cd5b53049747e5bfa2b47d50cf5b4756c87dc9af30459dab09fa931fc9c6362339ad3c729ae13189ad538c8097f53267fa52eea1cd7e6b8dc4427c36849da699955b4abd18d3b10ec3623922d495487fd38e540871a69719a77935618f66795442194fede38075d3600e6df797f38ff491e753bd31af6c0f3cacea884c0b62d2e308534f9baa53cf4f3e5230a1dc6ab00acf66bdc6a44760ee75fee62a1767184c852534d5f02e11faca1429800d2da226c42b82e5fac89218067bee9365942ca8f9693285aaa98290a7ccd55451b4b16d0fc17a9f6376cacda42282939115732d20dfdb177005c20e7852a4b161d6e606ae2f88288556c41dd19c2656b546a0e1af15f5368f63290e3f7530684c80f0a0d5cca8c20d0c64a6723f8375283355aecd0230444f6f2a3a5b156c0707b2635d948ffe2859410fcb05738007aa0e41cd060ff20c26e70688999e52c7b1dba716ccce36dea3d70b3e32e43a5cf047de3b057cdc1870e24f15294408c659de16cbd937e9fd7e20de08df9f7b9efa7f44dd9472a8b6a1fb9a3ad6e63eb28fa6d7a82af61245a5d9cc21d594eb670bc70a733c7edf70a37de7d861b0943417285ad6b0f7c87899235a892bcf25a37fbc12012fe0d24d2c019271832ab12589d0d0de81914ef9d89d32619862bd7cbc405bd0881e34267976cb18c62d7f6fe6a72609ee8c08d197f801e1b472b1b870ca0515125e4bc0247be43bb959925b41055db1eaa204d6529dcb4368c5d004ccf7a58a350d93a81a91b4f866489865e0e490cef54ffbecafd5e6ed8d3bcacc32a2c7d08c9bc9f98ce0ebc6b93518c87e66046b0290723c5047bc773cd7751259e35ece5c880b04f85d4ce873736e648efe11bc1b823a07a0ff8c6cbf15387b4dfa0fd0cd4568450cf468d17d01dd01b417d705b3ceb5d86f4809e7e944382e532d99288ebe023480bdc17ba8673146075ff3031ec93ee9516c2a5800de32ec7604bd311ff959320b7dd88de83bc20d850d3425eda31286533a02cd628228c8e90348bf749ec40b5d1716c7e6d63e3a0be77621d86bc3b3a3d3ac1620065ef4e25130215a49ea8312c4681a2c548d8d9bd093366d3c923ceb86320b56ef84d29fb1691ea673a311a883e16bab6cbc5d5005e5311fff76d61b68bb4a32bddd3f9fba7c509e04fba8aee29d02ba40ffbd2c4266443877cba9dc18c1a6324baca6a6b54cc41b42d11647d8917a260fdb911d5872dab819f72ae6f3576c00e3169ba0b7a2dd06765bb67df0ada8a1eb412527444d27d3f13f384249ed547b85a70d8e6f00196d3e19b44dce1f5b152463de577952cb1238023a973ea392ed895683a8ff364ca5ac37c06fe436ec91c7e91363dc4b0fa194012ccf166557804f9c12774e1dcb6907d2f262a4b0dbacb21e3d984bb725b3e48298103c97ead4dc958e5925bef578d69df4cc37b97869977947d3f49ba071cacc65159dc11837e50daf12e5969b9a52ea613769a65137ab11bc0d15eccc7d7eb98c71173f5cd548f06eb0e8507ae04d7993b34407d389b0a046f24e192c012306b9ab5b4c9497985185430ba511aada683db869352a37e93948b2a7d75a2bc72588d54f13ec7b886a558258208e4005e7a0317a721a57fd6d2c4ac6bae4f1ecb93fd1dfd72debb8f7da4b986d26aa055d2d9e9a1b15c89c62097166f2cca5b3a133abcdd152d69d1f13ca0b4708c264c5d7a298aa5cce299e281ec9c95755b33a1c3d7a046d78c7eaa14df33458b642a6636cdfc0f925561f68c1cc7e868d2d31b1e5d318e419e28d73ec1a206cd694ce0cd4637956caeb778630bee52691252958def97a88f4c3aad9b29133b3502c73de0622b8cfd9e6539decdb3f356040796bd8c9de8ce0360969877b531636694a48b063b8f350a503e60104c598f2d42d2b6ffefed4f83e4086a7fa7690b095f867784e99130efc98a39f8cd322714603e072f41cc2b49570722375e631a8691cb32fac31c84d7a81b490326246e5f6ee53ff2cd0cc62ccee594191a781e3d5336d7e62414c70fdce8119c04507bc741436c56eed8131be3bf04142815e29f05287bf5d88dd0c1ff041428adf0500f7145225d5811a6a8be261118c32af7549e53f4b10727da65702dc41aef0918cbc8d75e20ce7e46c2fd7e7145e2efba17a3fd5e865964119a2785102c1a4fba30e0cb8ba128ef9c7a3c105fac94e51d1a8c47c90c093a298eec3b4afea3144832ea58b6392476b2121a8ffa50ca8d8bb0670db8b8bf39f59d71c67b6c1908f997201f05d1dd5320ef3fa889c07809a87005eacd497a6beb9e40754d45411cece865cba7ce6cab1d0f5c2bcc6dd14e7cc8d0fbcda8f446893948924e8e4ada01d87f81fe586edeab3fc61c06a3fe889ed179c01d18d5d18d2ca2ebf4de4266f1487235dcbec04c382e67b7b96ef263cbcd0f5b8f5eee165a5e307294f35ca0b6a470ecb238880379efcd3e57479b64b06c7436450b6dd38353709ed7addc9e61dca4a69349350ec90158c7056d52fdcf2165e2cd8ea06c8159dc20fb1aab5358f186f8496864aa2fb7f005b0e68e5ea7d58ad596be96ddb6ffa8d03e968b2c599ff49bff40ffe4a100dab2e0a9af88c8853470c0b0be4eb3e44d03decaf0c2b3e77f3586658099743074546596ddaa0f76fda9c4576f061cfcaba691d20d34551d89838c9f287169bdf7a4bf6bab4d845f295b1759ddf06cb72e0349af25df4e61f83407bf273295f84e712fdcfad67d4700ee6cfba8da7c724e0280c0e8b0bd5e9d94ea5ebe3e17a537ba9c0e50d67bb3fb4e4c16f50ea8b649a343cbe72b77dbd59ec588bf915790250202dd10f3b3f5a50972bfce46145a844fce93e7fc3a39bb8f5f264b404e0ce551ca7db9000ac3d471939e1d78d29affeb6fccac41e45d7d96559b1735cae8cf7c7e32787ac64f1ee0e073c0db24b015ab3b2a040c13fb4192420401a03bd87f85ab8ccbf80c0f825328c1db39c105b8d2c7ddbefa6b69cd34d5e75f828f543c76043dab30ea62387e6e257fb20e6dcc2e0c8590fd3bc6422653a582abae4dd1377c1cd6bf4a2fbf9833b99e91e1780bda61e32a47450ddf17b06d347aff92d1002e27f177b97751520827491b639036dbb483a0260741e109786e48b8c1938126b895de91ee94f073103aac2a3a58a092880cb739c1c63990bbb160442a3ea3c62822c92e1bbcf5ca26b114a958abc8eb6545beb3e93e13811d69f52c6a3098a336a024881eda852369d6f069c73edb6142c63e1d67607007b6d37ba494603064488c2daea01d2b542de8252cc39514caad8a98241538c42d959de569c1d2043992ca71ed59de90b91da4276a68a9517336254b041d202d4f04a74d3667d95d91e101d0cacdd3355fe86abbe8f112a05b31216225b114f63ebc9204d051d2d54657c80e661124a008d546542d2876804db8da86114099b19ad230811972a196bbc76e1bff4075832ac084ce91367c1114663bdd207c10dcd7173d7a546cb41df09517639272d6252f3816b5df0fca75b5c4f20c91f11d27b70b9d6685b97b46dea073b67f373cef11aee84a07dfcfa75c162efce3b33b576f50e490717440fc336493572651ed9e11b947e382ba64f94f246d31b51f82b02feaa8bc90c19b6e19edf9263c972dca1a4cce2958cc9eb47ac4e5b1d3955b8509952b50c7206e1c58b711a3b1b681f110d3e6d5afe66c8b57ec6d4bdb581cb1e2d6a07081b6d004bc7562e5ae4ebd8b034407c6818a6f6dccf49d99c77e7b2e19908c76bcf3ec12b3376af1385165842115ca7d4162644fc0db3354e80124b5c291206763fa8c50a3a19a0ff051e0d46afdc5e8ce608ab25032d760a1582320769b439a3f958fa294c79177a4f57c85992e6f3436e23cb9017e935732528fa7661829afa83372d51a7c63e1e946cf4c9e62260743436ea102941ae82cba04a9ea739b550998cc385506db268a9455c911e0a1099f755b167af95ca0b468a8913e7f6bd90809aa429c7d68c7104577883f1c22743ef09ec7395f5b533a8095be91b7c9ab6884769131081dfbf48ef8bbc4076e824f3ec51b460b1911a8cf3eb1dbf14b696738203d5ce2bba17f45fe1b4f14d02061486500a292c46becc7a688168df040c9ab1ee8fc6d4030c3e6f06e851cc54c881c14a82fea782b1315b22c7e3f0a1da2e5db0942dd642a7c7c9940b4f47485651d9a6fbc6cb86ed4f5f1d8d99ff922828c2ea50270ee3ea4c864cecdda00a894bdebdcce2c3901ed0dc601830aa276ea90198204146accfa749a74ac40d5b82a7b648d8c36d9abfa31146cdb284a60288bfcaababadf938f67b1bb223a1bfa81f0fbcbebd24daf4ba41751fdb6e4265c5a50b07ce69c4f2f3d96c35863d4445e188acf83e5cf76bc841596f86ae16f47e8f8cb1f57579c38b976e7a7386e8e6850cf778585e553a3945e61e54050923ad7eea7639ef52f26ce0d6766887c1f62202a1b850ca3c3b44a77cb04563b30ba57dbaf2e29ff450ebf5d60f83379c5af0e7e4ac01de828db26c4c2f5c11d7591706c756f2b6d1098b852de236e555494090d706fc11a3f4f9a2d115702c72bf211b3cbd8f052044e28f4f2f71c27711916715ad96cf035d1ed588efd2d17b20b02ced01a87272c05cfc99b9fdae190b3b92357cd5e4051d5b2bec459428e4cb0ede41e848a0a31aa809208bb531e032aa797e4824596da07f99972ff6d6c1b72c911655b01530221bb10c2b953e7a1c9bc808e751fafb34db23cb349ca12bb9f2833ab1ab5b1a51c2da99cf600917e6264060e10d2db35099904f932622ed48360ac334c7788c3528e668b152e9262d802cacf413df119443727ec3effea4468662fa6c6994d02159159f0220b73496906732ec3c4ca4c9bac873dc90c479ace8f52b71ccb7e549494666658251ccf8556c7adfcfdb9655ee704514a262c1076cd70929dce25c836573b069cc26986c3c855824339d761e4357d482f5640c956a733fe214b6c0357bc247fd8e9246eb9a256a20d5a10bf7b0deab4b241a92618c793f688a1f36b0c2160ea2b2d41f66678881af4dd91058ef52f662ad0a49d75da4073814c7c601c230ea59d524fb8f911e0a6546af7d6c7288c3da58aeac4e1abfb894811e212a2f9f541864d249c4332429e0c0667e463279474f277789105b5ba03273f0f319c7185205b18b4f073144a1ed081c9162ef18d71c652f74befe7313d130941952cf4312338f095163075c91785af6c8229f2c609c6909e6bbf117892f9794b67514f2c8254fdfa5786d5bf042b9922ce2ede45dfb6bcc6e440e2aeed12788c349eaadbd22cefc184c663b1b99ede3681cc52ae0d81cb51eaa92636f966ccca8c7177fb0a21faf331ec03e29eb4c3edcdd5bc2e7db0f29f2972668872cddeb0ddc7983c7f851cb6636bc52acf62d283689e1e66284e079ee6d3604f18f8125ff92b0dad007677a43ae102dc6c21b4cc31599e26d03c5b9ca1f1596a631cc2d92c13d014259da4ad2e027bdd2cf25b72dd0dab9e41995cef1085c2e8e1846f3154a4943ce33f92ba6d1a07ce238606c1c4d415fa78a046d7e0df504df6fd099d112f6c0c1f19b231d8c628f450668f1e31a7f2c61646b6c63c3fdc39cd49cd21853a22d40c66a6e5378e82de2ab0b477d1bf8d50f0081e4bf415caf82e04b895aa342b9e4c0cdec3ebefca5da545faa162628888333b7e32c0bdde0c1343f62ec2f9a2fc23a456eea48de8cb3a9a2a4085821f2c7f749c27d2144afc426878d64829245fc75edaefaa2dd0ffb94809272fcb776b2568c433069df6a5c64d440f06516539e2630cd50282cfbd9151695da13950349541d22b29fbf936778ca390a27727165319701ea0b8b8418f0b4184b4725cd3eedafeaea12984cca61a44b77dde4195dfc8a2b3a9ab1133bc251204e8e5a24da39f82f2c64ec3ba41a7e5ec7bf828440be64073bfd17448438419f0b6399282f2a2d4f335f9ed7d9f748b379c2faf344abcbd42e3a08c648a4205fdb037ea9dc48708675685c539e9c2b48b9dbd38ddb1d9033fc41311c35b9ade22a86dfb93415cada5646b6c67c3aa017ab5942c744be4a33edc089d7bc163c224b0452f3b7dd495a10eb1d480b7428d6dbdca88a504d368f6125ac15350d6440b60f3a0a10450858ca80f93b44da4c27a10973cd323ef86199932585250a6a3e3ab408c035814190e76cf93da062b5f087c8bfc22fb91edddf66ead5450e2ef9130068d78f485c86be9802553e8e34a70ad2545eca03885633881b85507c65bca2ab747b2992bd03624b6a5933bde7fab0482b16282171c76f6fd013b2c3daa3e7d5174bf8726d2c3f402cae5f240f5be729d8b024a95fb49ae6245f6f02dd49fa511b5de45ea6b4f0d8ff5d402193912b3f96999b4a7fcbed572147e0b02f1d3a78f1cfdd6300f93b9c4b18a64efc1b649cdc0cf873692ab249306c87e27d39c136c828b94163fbed501f392989ddd99c817503616ba9c453b3b8e4326516407572dece4e4c04dbcfe9bd76face522671f1318415ad5cd38fc7c1b1972199ab7e90fdd6bab8d63d3613af408f6acc76b054415c06050726e684ada91064409aa081d145761ec27d891df81e195b0e08e8640b68e126acc23247508b79e7e9cadc730a3f451abd483f01cb6e938758216c0f6b1d6e7b67d8a99acd8c1ef1dab92d2d14c977ecec03b872a74f7632a5e1e318749d923b9f8ddf0c0ecee5b9f0b1774b7b81e91b5fb1d59fcc13c0f16993cdb78a2457e657edd9541476670d447538be79fefe945f0fedfaf24b79b030ebb1a16536bd66b87b23a3f4d763b8291db1cdbe4ba366ccaeeb324d91b78a2f533bed512a63ce35b5b9320b643214a6f2c69c45535c7fd1a3bd0b3495a59e1ae8b2f85bf3a39f3efac8e3503fe01ace8c5fd565ff5cf207620c2a1899148d9ed0816bcdbb2ab8574fd54c84d97cd4442c0ee14e3dffa83e65df4b17607ef01dddcbcac52c88363913dcc2efa57b03a6637ec44a8c1e252214e728d915c0a7184b632a3e4f1a92b520c34488a45b57a27c2e98c991743e0fd8f916ca874364abaee5744c61f4024966ccc69482af7d817c4cdd00369285a7debf869fe646fd0903753b1440995a3bab952f91393f1401d6392fc643e213146ba6cc79940cdbdb35310d4d85382a2c1205e528bb24263e850170540fc1d071c4223b441f1eb8d783220681329d1c25b35480311bfad007d8e9b85425956c67b19e2bb4e62b0f6ec495595b37a96aa053d0b7dc54a2ae2223e1227e8fc3a16229e4f9a904103e2376898c56a6f7a032fb17cce48c298faaf103b433e7edb7f4222a671a47800d25d0fe2f39f7db4aa0119b7166a9cbcf1abe35869c52f801b803a759266018ae3c349ca05756310a64203f48905146a81f8a3d9cd0091a8fa7cf378525e350aef1ee3876289b166c10187b9126d8af1ce95b482fc95d47b29b11bf70efaebc56ae3378d2f9b3160907c76f80ed08d5ae32628efbe6f216cab582a0f693e8bbed4236c06aea5d886c3d4f7195033546dfc22d731aa95b038fdcedc79f827b4567e0de2d7f86c79e4fd0d491165bef6b031f83e2078847b52d21fa6fa6975f37cd0e50f3e25e893f704b6f06cba4e4846580f8e70590cc30660c596bd291935361fa23f00803277514e5f585709a71b88be0d5a2b051cc41a5135402416e307d5081959e85af76050b453227611f6d9ddd028dad8805a3c286405eb92f010a8654a7c03183c1bee9173a43bafc2b0cd34f7018360fbec1d0bd46f215fff365159de3047f461830b66b6527eea31baa317a4b27b24ab6013d434467cef156bd3416aea227b5386c11a18768f51f45ef9fb511cfb92dc127a24336c6045d3788951c6fb2c2ea14a73206b7c69d03a2991f563a9eec1fae7d42f793b61295862a7028bafee1b9d5546ff60d8350e56ba071b7bec964b30f4e0008ec1849bd088e1cb28b17366a110a6b39796408140386ffb8d4603830dd32cb4117f70da94ddce89ff8cc0fe4ae0b3355fb90b1c620fa6d85c3b8416e8cad051825ba064cf27979bed061b0132ada91b9f19259f83e5f419918b2f05695e690b64343c382988ebc69bffae31fa57d1b713111465030aacea73174d4f0873094cbc96817ef66cd4eb81c1eae442ebe8792b388a68062c039d16071cf244c4f191a07aeb5a30019c2c8d6d40facb5538438d0c749e5dbfe78487138767b40b47f499790075b8a5dff57c70bd67f03dc5f73a18871de36aecfd292bcb0a89b6c0e33ddbe35e6a541904c0b8eea67145f9cdb4fa0a79d7a0ce50d812bf579259679360cff1398fce1dc06c4599a00332959a472a319a46141cd07805c010c58555e054c56ea14b6087e11af74c0f6b99c82e26cf88199b95e03e0cfb2cbb193dd27233fff25e5bbfe64f9863c1118beb13239fdbe3500f77e4e02606e9c7d3191b6cfef270462df39dedf9430cd093d0f85ed3d0f22b457186870c036cdf239b5d177d05d79dd4a761af2ea46b3a50409e56da306422f4b0162347a7e79e9468c192c3ef773fe6412629dd9b6b0ebb48335deeaccf31a17bbc45df14f123bbb6deb3dbf854a3fb0037f6c88f7c3482bf8b4da1b802ff1b8322f64cf455f2d0b10f9ed120f1c93dac20d0838de107eb9bd1318a61f2dfd8936104efbac5f6ffb673562329227240b2ad50f65441ee15ec930dc74b087552f254753f9ecebe2d63bd77ce6ba9a6cababa926796bdfd5652976455dc1da7ad0ff873349ef3dd10a1a5e0b92b3a6014df06d80dfa692cc8407d163b5c0c9a8ace50d1bcf164636ba49b92b7d49931405be577114347cf1c4d85c2609126025ce2080783f01737879249de7aeaad6f33e091d54feb4c45d2830f88efa01fb32f0fcf67dc66ba98b2060acf504d0ea5df09eecc5a501ca7ec9901871d044145cceec8277a8728ea34483fc480f6cca223019c9c7261427a4b418e1d0ac40dfa170603193598cea1359b3291ce8085318a7cb67548aa1f1243db75719da8f17135064b984b9e5fa96ff056f638837e169bc103dc360a284c06d3e68e79a91ee5dc14ca97ba4242d3b7e09ce531fef4582ef2383131ff5803a36ba05e260984eab61be17d5607d49ce5f6db11c50e90df29def9b44e9e48227c5a6c8a1dd37b5cd59da7f40644fbfe795e5712064042e259063b3b834aa169f3cecdbc2c2fe16ed9d588942a664f6d17a9869f6532680f3b09fb420a875c225fff1fa2e26754b84fb4cc1ae54e4101457dce3d4b2c9177c78f5caba7b5498756bd6345b18f2d3b9a9a7e56289a368f4893b362ea98799b4a76a89cf3261cc1909ba5470d3e078872f1b7287a36c986d2113a29a50964d5c80bf87f3ca481cd6748a91c31e94e8ee8cfda615ab9249eff787bc615e014a11e75cae53f9f9573e8604bff5b880ef8499703463db5a71b093adf60981bfbfd00fbaa8c6690d0fc27b2aa75d58570bf3c1fd77912aba09dbff32274e73c575865d5bc73f9f1cdce8066f925ccd31049c777be01dad7452349408566f4c2810c13b95805792513d0236b4ba7e142e5c8c7dc26e0a628396c45861b614c5f8d627587adb6574d276e68b0f25bf0e7f10e439e80db2c8370813b4d2b4a03c6a5817767d5b328d1092ce45033748f570d0ca32b19d25fb6ac12c6f8b484a8e2ea509f4a11b7996c9e6d3abfe2f1d89ce3a2705f2a1adfeef2ec141f1f894bd5d5fb9b605bec011c4753b25c4f2d4c5d35cecd409ca6d290eaa52e416cb0d601918098a9a9dfea46cbe6e4ef61e67094b313f04448a5e0706d49ecccaf23d083dc8f4c8eaaffb8451746ce85851894960e7df687bd24babc959bb71084e93a0b575db7897628675b9139ab6a9c31bddd58c014a860a64103053ed333214a4e8f928459e521ba4bc1f1936e7e2c0ad3a4f35f5545288345ed1072a302aaa4bb422d041ae5518deaf10d869d939ae43d6bde03b25085483e13311288a27ab6e211079d9141ef89664ce6289cb2dc18097b444a5268fc230a81bbf4e01aedd925ce2d1e73a809f5c1bc6a33e91b28059632d1c7feac77df453a38b5357cdffa0d234d2a86ed0fc34d019e7ded9d87cd6dbd537b474d448af3cb74aa45ec1c6bd7c59a7078820f11e8bd9e8e8edeacb24372e4dde9451ae6649bf4abd605cd6730703437a2f36916deb13b8e8d183bb4d7c32da9720e9f1c23850663bda3d8c268471de84d892fbc28e8ee22e3369c196fbda6124cfab2c54e15440c4e27e4429bce9c4297287f8ebe939dea95324eeb981a14897bece61e35701393eb3ab659a3159ecb19e6d09dc0d2a630a58bdbbac1e0c536f2b6e604eea740054e425bf34f8895719a7be3a4117580571087f49088652af6450ec20fd209020693e31fe58b18eacda49b3b245dfb0ae0aeb0d1c0f036de53c8096582b813db096f3df7aa38da5803fe591c14166bee99118e227b2c81149322489a56a696ae3e550e23f88224c8db8ca0f048d246c9507ce33f901b859235a225e26bd0f35a74a6a7d85d95745ff6d45ea5aae51ba42f5fafea5d64f7201f905155e743d561cab3f0dc8d03398852b8e24a1e27558266a7a868de044c72d3d1d064775bc9de806a8eb7d2d735d70e37f34c33e4c1a08828f333130106f69c60f5648d4f4419bd6cccd57188417521dbd1ea4f0ae2257032749fe196667ffecbb3497ed10ad35873c44db037ff18123195fe916afebf28a5fb90d91c91c702b4c4f23e4e9fc6badbf1b678fe76ebc11333a6db4340e9da126dc84c2ca815ebeda2f7ecb7654df3d1958a7778ee2678bf64578ccb93cca228d770494f0d59ec89f1b2800756690429060430e77c0b88fd7c2214c559d44474b39fe269ae6fee2ef6a35d70b219cea7f04bcd11706e2cd1f56fa8ba8d399c0cce55b18a3e995882733ff0c63c5cf184f3a38a91a902b433dd3c2d3a0dc4c50e30d5f3f9bfd7f60519ffeea0ac96d4ab84c8b8f329161f4622656f01f7252006f24ca1f23d8ce243c4d070a30183f5e4f1779703a65a48da90553b6e410738c84db270eb129c82a62c26f812d9628a15f45a8427f6f0c14100e398c488633d2ac86151388697db61992fc4948da136040ecbc0eb76aa7aa07908b72cb2bcb719a54414c3755229bed338306bd4b5491fa29ee3a16525db5c1007033db451d5cf0da302052fbb766de86f3569af6e46ff0945858f9dd52f2a72b2966d7c54ca7131aeab8b67266b94d3871c513d52e3b532b00feac4bc93fc6399237d0ee6d69665b3af154bfa646a3a578b9f98f7d858893507adf1221b073f2e4c50b274ab280e1b26a169886e2bcd4893c15548f11c7cd830505306779061add04b1e5734bc67df84980acd74574cc205543f991f118d7284ccb4c4d9f54d1871a00c6268a48f9b59dd4ddd4bf8f861a3cbbcb5748660a8182c6cb3e1d6bdecb54f56c6933817ba12afd74b8e8ff631203fa294aa2091f40e4914355da6c1f0bac085388d17345766808ae5abfa59218950dd369c6e256870bfb5789f5e1d4a97340f9a962e4937aeeb0defd980e20598bdd68425518b018d37067d1c365bbc247730db31695240b2e2883c58a8edf1d9e37108b7c5f576fa2ac269b26883f541a7dffb25146bbae4fe3900301fcadcb8bc0a00b0fa316ff8a04a6c55209fb127da406f9674009c2e20db614114fc5743383c2122c52f27daa70ead2d5e00ed2a50de4b67d8542b08675fb39539adaee2338e8fe19846d9a18e6d9682122c8a0a622a5b835db000d3d8318a87a76d769d872a8ccf01072f5f71058770d1b1dd5cfc5a5af457e62cd01da88297319668c5a8645c102158c5e7dfad2932711789a44979ad7e7337a69b7dcc29c8b1279b4704172adcadf81ae682647fc684351ae5da0ecf6ee9d900cf8d7d29e7ceda7385b98b2c05f069991061bfb00b1c7dc668886954bffb0ec5a198982e4ec77869fc79da7d95b92cd901d8c36f6771a64ed81afc8fd0c0d8d5f79d4f919ecb4506badedaf8fda5e3a9de7f8dea577def88c1e0f1b0e14e08a47ff85c2a928f95663d6e2f5d1e9dcff9f001c1306db2243ab0c34ceb26432c877597602bb2e8bf463d1f9afa8e39de67b3b43f54e80bae59896dfc7569b043319cb53e379215b0c8c8b8a7c67f2e6698d72a343f303e715db24d77ad2acfe83d3fa1a65d1f94d719c8d4516b021ae0a488cbc52b862b54cc3b2a858be86a9437856a978eeecc851c8b0c0845cb597ce6b093dcebe0c05b375a5c823aa03e0449c9772e35bcc145c1bd7e095afdec8396017017895285b31782509314209e3c79ad3a9d80b0f7f54390d54ba0699d23e53fc0eb266fa7d777fa244a7dd9dfd7d9313f8cd3980076e5ab1e62c6aefd049aecb887ddf2323fe90df38b2bf76a36f305ee2b430ceb0b2879c63800ca9dca94a5b0dd6ff768d516224ee7d9fbe04d42ae16f8967182d55155f0125526c8cbb1f651ff2867c8f301621f65dc3334fe96b5ef49f9d913c71420533ac86d769173c2e9401ab74c243696de8db47068b7e0de56b63be10cab5a6f09f7740021fb9be99a60307a90676a65c5578f9963a4cc256829811fb2b45cd13085e33c2390f21f9cce78ace23cf2788527024e1041bdc1a430f6cdc57f36b617c1a45267990addfc14380ddb3fff321b0eb61bae24af2ad33de982b0901cf760ec0bdc59cf2a1859e9f0e4269c3e82c06c354ac7552230d26f955da5df27b1957e9570eb687b724da2ea8a377bd068ab26ca9cad6d50abd1d87be51c5d15186b4e0c898c7db513b0bdaf74df89b18fc88770e32e0263df00adfa8afab90f160e7f96c33e89d3533fbe0dfbf6e1d1e0799638472e75e01a2dadec7ff6d3dabd5fa79f3d5d3d74f1ae2ed72793031290757dbbc7136a782db59ff8c85370b2c08025dfb768a8d487797c1fb3b0568af71ac2cf2ce91822fcbebae6b7b154747d6cc2855262fc201294547a187f5db21858930fc157c57f9721204018aeef0bd79ec5d93271325891eb61f06fb70e6d4618abc0efceae62c20310a9063371e5cac44185c78c67254f531638d9c61ee5fa2a4f02dd8b8327c40b271ecc475f411375ed945f2bce50803d41f84bba76bb3e48fa814d610b83136a0589682a57d852f601a757fc627000fbc4d2e2e9035492d7aef38f07aa0b2ab0e8d444d6ca9f2c5b1f92253de07ffb0a17c7990a05665d1cd97f57c089001d3e627598132e8b9e963589234398950076b0876b316eec96c8148b8a2ff3fabccc76c488cdd72a928f6a53ed3a95296833ab8fec8b77be7f10bb1c14ee36c17ebf3108468039b7fdb468bf2f0c6982bfa45e09d88356659a47e95f2fb4952ad29dbc046ad40ea9aed96027fd6243fa4b0d4e2927b06ef2cb77bbf1ca0d66055146aadf8c967858499ee6c85ec3cddf1155c4970cdad5eaedf0afd1c9e7425871e5a1f0d03aed0f042a96b81bb19772dff69f012dbe5d5ef90d2c5052b493fd9c2d0f032d9ebfbc648d5c887cf90b1fd5c93647b4628a8da8d0bfabfc0cb568faf2926d741670a2bb384b7884da13df42a20b91ba8da822951014bda239c58d4e16a4e7d046c7082e741a1510b98c376c596d71227b03550f4cc767bf3c414bc2219c7e2a1cf049bd21cab406de78576d9be0c7aa08b2c24dbc34c752a6466671dd05bb9d0ee2a35b3d5b5828f3e0ce7b48de3f4021657c997e98db2004a823b5e7f98e5fa7d010d6422a023d7850f982512a0248837c6eff2322fb7b77b6862b712b3d094eb835559d72a14689b014ad943bcd3d978942bd1c5059ead3f763339184e10a9303b6b117e2de1eb3003d7064ebabfe52136cb6c999065ecee0380588c7743c848580967695f6c8e67a51a1286565e2a01fb69b104d74be196c30e4270505ef4491e8c8d0103116093c84414cd8697484bb6357465350c180a4eefc6a8399ef384bb39ab2e52f8ac410f13741d8c52f0d467a5462e4852c208ec49f65635abc2251f3a9d7975774e076aaf7971790b78aa394f1587b377075ef14d6ef3acd7c03a7b805f3151bb09847b4045c0a2921ce4e448fc1e0dc2c7833bc5cd4b76de9187654f65e78de35e0c3db36a464fff70f295b04c0fa2c4b03f660a5e875f1acafe4333cc07706290abc7fbae88ae1fa8cd454ee1150b6833e437fc7cf59c28dcf99d07123860aebf1e36f1d25f5c7f4dc3fc578f615dc25340ec59fc27b0c0a5d2b229a3bc7446e313534d9156ccf28a2dd7366ce439da125c124aa8cce12f62f49b57b190c0efedee7d9f49ec8f91013f863474e2df0cd8782d978db791f84b9027bc804916bea310002f7ec933a7f00d10af21d1176aef1a78249ff41ca4603b67ded5bb46ecb6c3e084b465e733cba989d90a92c839bedf72b51108d7bba586494b95c5d41906474ca12e87a9f88e102f0ec7d9ccb23027534bd71218b224a5fa1f21b21679bbaae9094339aa79ca68e9ce5e4cfe626d7cc98484f35db7ba5bc1409044b5e3f6888dce2e8709efd2283327ea95f037c4cfb2082e526e713fb8ebda8417eeab48e9d8c78fbfe74e0bc08129ddc3895533a2926798009eb2f19c884e2256983882467d876d1f6ac0bbf5027e24ef0dacc9967895c09a803e858799a4ad6e5a458b7cc3f73d68527f36ef3f2659d96c945ab4137241ae4280559092d502d739c30917b3263e7321b53bc2e15fe5fa9065ddc2b81d2bc11822fff8ff012c384fdbef667b7a3e8aa276126810f2237fa9a7b1c96c32b20937963729eb527ea326982b5017234ce330a12ebd1c93d05fc06decd5abc694d046e0a517950fe005ef86dc66238610be6716b67e54d9f427c845c9965a3146553794fc236b2b050d7aecc440a00c3d46c8a5149dbd902256a1b4b8073bf68521e6bc186c392b6864311d21bbbd72684415e21f0428891655e96eeae276a1958c8fa7ee031e2bba2d75ab525ae2d3100a20741823747d892c46835803c1dd38ef419474d9d0573d303239b10fd6c104891cb98554459d2ba41382241d86db4049638b1e9eef17edc3332e9038f51b15123f95134c575d2ac7e8921a48d38f7e5a9ad6d25c0793498c25347c80cc92f6de08be9c5092506dbc9a1c9a1e1646cbf7d21f9bba110741ecf26d9ede1aba247b7fb02fb8e80f773c6af5dd4807de848e57fa0fef3595cdf71010152e67c0b4988a28d431faf8a0ba01dd423e3e3d1030f29643fe17bb72f29a1dd80324a5f92ae414d907655e1d97f688b0140738afa5d1ea610b5a8d7348a508cfaeaf2bb8924e462b6516cf15a5f882b1df813803c4cbc0f1b821ff974364e3e312ee21c2a6d3fd0854d8e2e086979292a2dbf43d3ae08a016cfc384680f66cb64c97e8fef67917d2d3e34228ee539f47ce0595825361a264187504b2920c1182013784d06d418b89dafc1469d6f4fab5d8386e940ef11e46fe685cce87337929155f15006687de0d1b1bfd9f9487c4e77d623bbcb9c96da745ffe477dd362e7f6bbb7f37690c388529cab9ccbc577ef96cd0d32ec9981730cf47b2753fcc26407e27aa5b32a229ca3613c02806859097b75cc96c46655fbfa208aa902232821c2402e780cf933608b98f0f3c52f79b15ec196283f481d006bd43fce075e5618be101a717c810b2e073914c711549fe22c39bcf25f1d0b4c636ef92c2fc97651011b59f99c6a05157c7f7aab0fa1645cba9e7395dff61e13e6552bfbb2ef415f46d5ae71f0f7cfe65f3c5b39b5d34db04c5f166702b2fdce5f04c487ed3028accbf3da510c05cf104bcf5633ab4a44ea32df7814acbd72fefaa3f1da9fff62974d833c0b732ba563634168a75cbabd4b4785c762393ca75efeff7bf5150478509df5f8709fd330df110ca2198b5e4ce92fc5c613e4d41c21e79029de18c01ba130972557153d76b21c04b50d6e1a013158f5c47e8a1c77b0aa5ed18ecedc4a523a5d6b0aee7ea0a75572a0b54ad2cf96489577c86edf4e906b1913dea529cd7e9dda1310019c6dc51b4641a038ffd7924b80b9af6a12dc7f8ab09770612152004efca8a65395dd248c96aa4845452b884ae48ac74d7eca51b40e9bbca282e14a265938706d6b101dd7f5337d4b725c61e1a79e46a29303b78d512adfefeb0b1e7540df32f7e513b51def3dc7ce29176722ebd991ab5acf9d7617403c6985cef3601ee5496c7582ae4ec98593a5b746586fde02aac4a2065be599adbe20edb135e9d8ab13ac00add4fa50eb592d5630bfc4c2d325598bb97ee38956233d1eda5602601bdeeaaa8d2904764322021c3a64a144cdc2e8b76ca3b9825144e9ef8a5b9cb2ad281db08caad09dc51d19670b975128d5832d4a44ecab2dd4e392396eadfd322f9479c637e4fc10b55b2afc66e6de7ea30ddfb56bfed8d3e05e0a4d2751f49310c4419262269bc9a2ebf4f8bba0bb94d452fc60a2ed6bb0e578e4916ebbe0ff95ce265a115d4be44b6bf650b5a4eb94fa77341969b3c0ebcb07bb0c7821bc0709a93b4f2478454b741087a35cd07a13a685675ccc2eabc25d8ad3c7f5af234e7241f623b133afa9489f8453227b0a7a259d43721100714d2857f9615cb846ba363ef789bdee76bd438c40c7fea960a8bd55513033348699b7961cad63f6f42d66cc431e660e48bfc1adf43aa0dccd01e4b1ef20decfb4d5cd47021fdceea9e16328a0de9e33187ba04011bf12683b2ff85e8602730da0eeb96e5e1f2ce64112bcf9258ca1ec60093077f690daf1f0b4e95233a4d87c092d8bb758a856be895afdedce82e5148085f7e1aa71e279b8609cc1f89c8f2dfe7201868e754b57eca92a074b05ec878cd5db88ef975ce4906255b3199ffd16caf0fdd4c9cab70ae3872cd807b8bf4a364babb7acd6a989c89eeec35172fc47e398a85490a272b8feb983e69ba725f66a4d10556db21599d82805f6b186bec99ae06d8c068dcca64cd4d34b339b5e9076ab1a4fbd8d93d0a378cece535fb0b6fa581f66561d14b99b374f18c63063e1e7b7d1bb02ce395772621fda74625592a1509bfb7476f1089809039b7c2a26c2d64c320a5252f91e4414ba9061109f2860c2df52966398af4e4c210b6b269869702a909a19ba3482e066d50f8860673122de6304c1e9f974482078faffbbd3a24d040a2498cde2b5b943e20e430a95b7f307517543042edd7efaf93c99abbf5337fa85bcb7c53361c8bcf45bd1df499767c06e6b73ca5a7d4e06d6ccd0628eb48813e87d6a4cf519c1022b4dc4c5bb33bd6f5ca7d45509dffd2e6e76fcc88325810881ff9d11147fbc6a2a1b97fcfb9b5426003eae371b2992d95c0190ebc3bd6ef09e792f93e061a6ea994b32d401febadd90de2a5a6af4658c78c6298fb31bdcce8148b972d98b7cf0d3731e6d91f840062b4afac78bfb64b56e65b2de22231bbb313dfa49704fbf7cb077598514e25e43409fbc3b4e65db3b0c0ce5b835402e66bb09dd55a86ea57be1e582366d67ea58d365943c4cca29101ce70af911d6cc3cc204eb2fbcd07079a098c6fb99d632db6ed099b602002ae7000c4231c70832c87bf8b916facb0016104069e0297a228e4f24b1ffc9e37e8e604403ce491e4469cd0592bce9a5fcd2c1a960d2a96176952e6e6c7c53c950e2cc3efe17f4f8c0215f7f4c9d81c615e7c112cf37234325a9c6a041abee4f2e1483525ed7ec6f864c25985ac92e2b098f6ae42ee429a451305383627096bcf95018cb22cd9a1140ec78319de29c8b5211874042a1a2b6b2005f714d3c5688ad364ebf96c59216c32d325bd66b4149e8acf9817483c9f7264dee0ee6c17252fab5f1afb4e41f5d513ba4cd18c818c557174f6142668932111ae8886235d28355e8ffca886470becade505fa99472c03cdb64e9c76d20e2fcf77d002c69b653060cc13920b703afa67b36190193abfae2edea2b75ba65a8a94f147cb10c388915d2e620c813591476b40526bb0487d18e28d882d588be8c1b6c01b8c92b4423a80279b31e14408086d27f1795adaaee62273c4a2c09674948107482445230d40c2d51200613e4a7801e2d09158503d1c63e1913580a22056a8523239fd8b5eb7ad4d6688b65dd946c63c5e0343e9e207b744fe28390bebe69ab19bce1671db644f5c4d706294bfcf23b1045c0dae24a1b548f832d704c1171d668e046a29055765f64cd122c83349280207f713ec6d7e3362320df75136a5305a49103ba72b27f5820cc524a0783fcc92540a636b56512542300ffde127ca48755ca33eaeb4a3fcad21b18b0a6c2379d0b877c96e7020070fc623abe006cc2c593f76252b6698f12d8255385b3bfd9974e5664117d49c8de9b6cb9a59429c914a5072608a0075147ff084d17cc60fd434a95744317dfa1ba4da541305656914d0db60632d8fed8b42a74adb921786955adb4caab6ed3afb7386cf5c686d996964d76f5943d656b3626b253d844a20f1a8cb25bf64b6db5fa6d255772255752ca8f88a505d7552ec431eea87bee91b6ef65b41db17e7ba46e7941a26cc8532ecf3661d3d8909f7eeb51b2e1dfe84d0d4697c2cac299764c0505b9504389c5a729a62b2f08cce0cb7f8a89415f6a3042b9fd852745cd08fb5d7563172737642a9f6bacff1642080db28ff94db5213e710038c4184fa85f0485a4bb7aeaf54fda0c6020d611c6ebd3f3b95556bd12b3f14fe85437723e47b1bbbbbbbbd65a8f1c8b952ae254413535e54d0daa9973e7fa57ab34cd397343ae9a33e6c63f8a4b110a0b8ff598d8138cd8eb62c0b08e68e958869283e5862e0575e39c7136cd836f9443e7862e0525e78d508cc5f735cdc3d930778cd1ca78dd3b07c1e7cf8f0760c6cacfe353f3a8f5b6b1215715b1d61381244b57d8ec271b3b35c8c15b8a032d754d70f76fd67529068acfba633da64de9857c879f7a46664f0492d0a9725d2a2e71749a6efca3168a11ca56e5912d2dc50bf0e0cebe6106ee3c2a21def9448e14462b979fbb1d57b08f69d085441063fc1a638c532ed56044622b2c53c9e8a166fcb1f62012740130c813b99c6c1524a61b72951179b9cf6c56242bc29572d42ff71e0d36acd9d31d2bb0f46764ee699023a458f71d21c5584158314887f41212e359ffa21f9f6ebf75de11ffa3d677cff25e42fc488c7b7aa4f5befa55fcd949a0e76dacdcd3a220dd778414eb7ea394fb20acef28c6aac32207e97edba851358af1acefa8f531e867b46d528f04fc59efe560c31a3bef48f7f6e30a859e6fcdcf0bdfc5747ef835fb59c429cdb49f45fcd2af48ac5f18b38c9f64025a5e52cf97a5df7e475adfbd7722b4be9751f7bd84b0de9f553b8ff5ac2772cab1e91971cecac609e89eebd35823042e223e25d80b7024d4d0831bbff5b343aa1cbd19bdd67b566c5867b6630536fbf8f463adcd7dfb4e57146375a4cbfacc7b01b14fff957df721d2cd4ca81fae3e3ef55e402a53ddd667b1fbb1fafac9ee595ef79af44224ae5ab95c3dd0faa61835b0c165282aae5031755b9f3da07b1a56f6da15458f487f186fd6fd583deb930dfa0784fb2cf3340ef403fceb7b25b02dd66bdd1722c9d80de95fc9d0e76637a3f4b3c9f28a6419fd2c760ff0cb755e9178b9af886f5fe85e96d198d4d967c46fbf5c791ce8d73e1328fd5e3fb2ef05a4be7f28bb1fdc60483fd2be6d3912f4110cc443ce1e0dcaafe39c2cb93010f7fb833d5b4ae9359b93cae539e753c96c3ca8536c910a7318b558f0d6a128050a150af9cd11055888d983f8c523ba5ce9e5f613c1e011285879310822bedcfe1f18944188b90d24defa452706923f2c61bd58a575c569ea7664ea9aaa24314c5a2614eedc6e40ebfa73d26d8fdedefe8d0245d29a52b1796cee98bd6d904e4a4106ca420a6d308f301eea98655946a3dc3e6e7960b0ee7e10e0fa34ccdd12b1be8492a684ceb9a3259973ceb92599f354c164712749994e09d5a6821455ca93357162369973cec9056dd2e4882964d07ab0a658a1e7888642082396cc07ffe75da87ea54049ec3084154ed04045455e6102059dc354032b3141f650dcb007d4144e6ec84f5041526fc258a3a429a19452eaa50a2a6a157652a8e20e8d32e79c93ce4922abd0228a0a3ee78a2e0d0b090834349440872aaeb0e2c9ffbc79f39455b14605695dd6c75a3071bca0f64d1a1c59bd0cf5a6cc0dedcb293e9b72ce3748ace077ce39c12ede68916f787012f98d0d4b2cc8374a5254ddd0be1072e4c869aefad81aaed8a4e887941bebf0c840459fc6a0c76e16f16def039d75d7009f1d9dd545fc4a59f4fa31affc79e52743eeba0fa25e451ded2c078a28a5947215853806350f8dbff0bbfc610ed7c7618ccb40714d0458a8c793c043f139c64e36f3478e1cb24ce33ea7fb941d7cffaa6a610ed787c1ed8ed1234ecd28986fb33a76374f9613d162aea05b30a160cc2c2920e924e0d0691ea2d0c18e17477899410c1776a40e52bc10a5704297b0cc610799e509a5945236db9299a539e79c5bb42496ce6001536689cc218a3c38bab80e021531a490c50b7660708a414561270a298c608edededebc00792363e08a715737ba96ed0410f884c8df3c98b71a3dc6e81ee8910ad12a1f4941fbd51fadbe97907aa4fdeab35d100d29cb8b525b836050a305954be3b21a2d92ee2ae9fa1663e762a0d690b02110b96e8df8ae27567e3abc8ce66fd33b92c27cfa47d9d3ef25847efdfa1dc93efb65e1587741e6571d5614841dd6e06dfe6929a557ab11af3134e2d78b8df1ce90b261e50924ebd95aedd71e840e8df8cdbe703aa5596c31db7caef40b91aee6bd7bfdd4cbe873d461f4fba83639cce46fad785d57fb8d3fb0d9d3cf3edba4c746b0f68528d4a75e18847ff5fcbd7ec4d79efbedbbedbd82dbb7f7fc85aeeab18725dc50fe10d7d5e86fabee39efc8eb47f6abd5e7dacb8c662f1becbc7e5f7df4b28f9da669da735e1d12224529dfdcec7fd0cf68a5af7df54ca0affd466b5d7daf9708fedd1bf5733f02c7942cf15fd2cf7decf50be97f202265b4289b6a98628c5c966dcd5572488332f3a10648a2c776231e1b729c127c931cc75b59997dd7de40a615bc3be7ee3e65dcb05e4966862eab276a758f05451837c6b8c48a4be365f3e07169bcab2ba2e1fa0bba22d7054b66b817bc055dd10516fc8caec88219cf65ee8cf7e98a66f8bc8caec8a70032a264e0b83264bc1d7365442941726524a9f2fc262a05237ccca9f3863560d77d6d73bb28244144252d0d453279b258cde76a3f57d3c0b8e26a618401834c0e28305c30c01765044085c31ad7816ef8737de8ba7781e7ba175dae7fd142175baeef7822e9e9d28832521084d405cf972f7440a2a44649621142c4192584b83367694af6f0f1adab8b2b61b8cda52fe9db00ac10b9aa252e7d59b9b8e1d26f592323ae9ca9a109942e26903c68b182e32ba59492c55dea83c10d6ba4d962882a2855415cfaac05144f292d028719435c5ca5d1428d16488ae48f1a353c74c31a2b9872a91aa815dc61228b2f97feaa2ba23f7628163c0061a1e6d2d7ba22ea0202aa8b3ca410183c58e0e1e14a2d5f5ab42b9a63ae78e2ca9f49288f2b942e6582cea5575cb9d44529a55d0d3b6899e109a8289cc81d82684329a551892b5fca6a0410ad035cd9a4c7d2a89366050bc2dc71d59942698618a70bead059c167aaca823a5eac20038cd30c3b4e96629471f2b1d342cf1a19766e7062a798a69a62d82c515a524f3d45b0c022f364c57462a85a76d840e1ca24b1ecc459dac254e9ecdc5995e1ec78a18599daa044a960a856539c645254da0d4fe8d454f58185d9942121472853459960c14798da32a558a14700c324a1acc013471853e577902cb198a5762d599f79394a69e986f63fa62a9d3063c4065466c2c0943063260c336f02800233564099c90206eec1ff018518d3303ec3e6cd0842d0f17721fb50679e38d9accbfab8a82e33c1b441155b5f0077b03d337050c6763ec048605746dc60b2aea81e2c8dcb5067daa839a3050726b0f632141a261c0461e56528343074b0049a18b8a0a90216292555283478aebc1cc504889a467ec040524af9335e4687c085667cd149c6e7b4f919b9c5c9bfa393537b216850dadb5e062cd8beaf7e19fff28ff148b157ff8c7ff97794c5fd339a71e413a570623346082f8208f326d6de14368c4edcd5b2854bf3882f1166bc8c1732e37bcd8f21e435bf2016bccf736c8637c5f09a5ef367fc8bbecf7c19ffa2f463cc789fef288606868d5ba2d30caf4e4f460c3b592d5bc442710aa7f0001cc56418cd16da5aadebbb19a760a16efa81857aca9d78a8e7ed6f5fc86fb80d0b0d198e3ac00da35310cc73f226060aa3d395641836e5423e45471b100d19eb4d55ea80815efdc2a7e14dd2c730907ce9f235505ae2d132a9f565c78ac54ce632475d3e40fd3008e65da6c15a7da21030900bc52c0c237ac3fa421d6d40344f66fb42171f400b0a75c0408f7e215755d9f8452c0cd4ffa6898d71a83450a2ba336b20e221edca0fe10703a434c240f2a50c6a50d24062c3a0fb2fc45588104519a5121a141465f5a15f0d5783f25d4f49e23031c5263c24b770b95a8c04312221c85410128884800d150fc9205808749893161ee2d897332e3251472465494957f8d2cf3e99cd7eea713569529b94b4c4431dbf081ceefcfe0a033592fe72fb6392152b6e686fff2775a1a2a27092ee002e434901c3dd5afc2359eeeeeeee524af9bc926337aebb197d38fd6ea8a8a44b68b0692029212669a064e9ef7822e9f6c73b3db8ef8f639a47f7fd318a7d90109f044025e9c647bafd118a87b4efef383da85a055f6e57cf9eabb56ea1e5cbf52f32d1225abb4da5795471a1d677670083657deb8dcc4b89da87442974f3c85483a51f910f095bff82276c1899989a877c252c12b21ecd636e3884c7c8cee306394f3210fdc85402fd76b99828c779803ffd6a784149f0af3f6bade4b1f2c75c60bb3c86f5bdfc39e641c3fae5d743d362ff06d1e686b1ca8e226c18745b4f36fed956726cebb21cdf1144801e02906c226080201ed22efd1e3c945d4a298d94ee6890067957580b368fb075e9d3a78fa379bc44982fdf68befc5e6e24ffe534c8ebe16058f0fb06a9f7848dcf2d1ef2a74fdfe5424eb15d8bd78fecf267998f23ff1b82af20b1cb135c945f12ebb098041737ecf1ce64c3ef6e23b6b8758d06df07b38e0b6e5cc1b11cfbf0501d29b788237f4c6a9fd78fbeb7430f5caf21bb600561c35aabec8af43512af4767f9137511bffef93050af56b4bfc6cbe95397b3bbb3ec9d66efd9f7aaaf5a332dabd98a66b4468334fb5c0c445d48946905875da8d6af66f139ca961d65ec2867d3bebe84c423d947a4d8ecd7be5f46dad14b483752cc575fbfc8c45ffdfce339992753c97d822596b0239528a5948af912a6c91c33658b3995d426d9145a9d25b78261c527fa7cf4c1ee75d655cd42326c3ef5a6cf902bbbd3b4164d8a1224a14a73ce3971e0acc89aa024c86850a299d214154c4f64c8d8d089939da1d366632e5aa89374450c5f5889f23fadcb5074cad0792242894f09cbb97a5c574baa25852403fbf23753f431bf768add020ff9d7276020f95576fe0555ac43d9f935d34ba766f26abd9db8a71c2669d59572cb93ed0fa55383528bbbbbbb3bcd6a56b39a65533a15f13c72cb4c63a58cc997f225a5d3952fe593749a5912175bcfc8ec2ebf38c34b66f6cf04feea00bcd8500ea08b0debe54827ba942edb3f966ea4bb7b411a74b11c638f066316fbf10586e5675d6139cbc62a39dde8aa11b5029b1b81e460f969ac60f9392e2c3f8d26cbcf6961f95759587ece0acbbfb962b0fff1fb698d952fbf23f225443b32ebcbef6524e94bffa691cf77ed031d16654357c631d72ae9e9c95aaa6ecf9e3cd2aae8c3bf6ea25df050fc3a06a9c36dd9e4591303655318d6df2c75f0ac04d3091bcaa62a4a45a9eacd92a20fff4ec2427d03c3fc5b0505ddb8a18106afd70d69950c1937a455d90978c83f1b32a7e8237e5d259eccb2afc618a43583e5a0fb65d7bf12c2c84005eb3f4370ffa0c12f96a5571692672453ca9c65f2e7c7ccccccb17f91735e13e6471dfe8573ce497d4e77671f43bf3f32f3836c57aeeceb17cea79ff48d29fff44c4aeab37e6c3e98b579d0d9834ab13dc3fa4dfef931d07c39db063bb3e7ccb3f7ccdd9d4ee7a4b75fa553122e9862fde51070052a3fd9a046e99c93524a69651b73596599ad2bfbfa8594d2f7d64aa394e9277f8d95ae7243db1c1c1b3fb4769b2fa5d632217b7bf9f20db3eff5c35efa56725b99e1b2496da756b3596687317fdfd1b9fb0423d90581afc6401c65fdd8ddac3e0b8a3f4ebf6d153ffa8842d661433e30069b7d17f13c79eefc000085ed9e7b18a5dfd4697baf9e3b23f1fec8600525a8103e2019aca084822bb39a7943828e6ef6e4759ed39698c47dafd5b31e2976f45a716fd4fd5196d567c4fd113bac23f24ceb07540e04095a7536a66672c505b9da576ff34222770baa755bfde6199137669ccc3167556b500fb0d6ef2a653a72b7a05b3b22dfbc217eb72d7ba2ae73ca5b2f145d8146e1c6f899c07a9e3c4c3d3f645580e3b2428aa156d13452cb45a105153e3b1df87abe0adc215fec351b27a06a14a87d6b833de4a7860fb6bdea853528e0dae28324c5dee1c6d42b77a2a0246c2a777efce2d2276a10dc3afdab3744bbd37f2efd420adc213f57360f198ba2b4dca960cbe001f0fc2e1a6c28a5dc7e0078ff1978367078ee0ee53ad3f5a5eb9ffca8e5d29f1edc3bd32bc2527e7d27a7ef1efd1e4abf5b2cfa1db73dffdd322e7695b6d25418a8df29d392cfa5c914e91a4ad5604f6c2a3ce4b7eb58b9dc2da0bbf30e03f5bf1abae6f627e08654eaf6bf7ec40fe79ddb318e8cef5a2d8871e89ae843aa79b00b517bc5e9125df2f61933aef4e61b0094b131261719a582944be372940a4e57724f13cac6383ca4cddbf3126183e7e085800febe46f4a80beefe037f080707836dec3f130cffb0e827cde14d1ffcf87fce4c6c67fff46dfff3ced5efe7d363ea39feffb8838ac8170bcc77770bcf737bc0e1ec8037a22df9aa311c777248b3f8ef77e03ef7bd0bbf1409e8defc0fbe7c0037a98d7c17bde919f07df3da39fcf3e0eef083b6c83204a6c7c47b218d978d81fa9ff1db1f1c19ea877b8c1f13fdfbfc38d8dff0fedcbdfc8c6e378a3ff9fcfba977f22e0781b6f64e38d7ebeff1d58d8ef6f3c070ffbf083e6f7e1f81b9ff73bb0b040dfc16ff0e0051f4409d077f03fde911bfff33872bc87c3fb1c38be1b379e633f39fe7ba31bfff3396e7c471e8eef891c47920601781168e0e1d0e003f044fd9a36bca58ed9f8f794304140ccc62f75ec7f7a416cbcf446e0988d774f88c7fe6f784772fc8d07f28eb218e9f80ebe23254c121003faa518ebe0757c2fff7f8e1d2dc518d0bfdc3b92c528c7f7f2cff11cbbf1475efebd44d0f138de28c7df781ddf5116a3ff1cdf5107ff7f04f4369e63389ec8813c8ebd67c36387edc0638b7018d703485787d7081cc3f147fc1413c18d17018ee7588c85910948098eefc637af743061de5cf22607de065e00bc977c8efd7cf18af7925facf27dec30cfe398e6c5022eaf25468cbf315c3786651692317e2e7dffe4c243f6dbc7e743ebf3af2f74f97cf8e0f599532e7480eaae9fe2823a6e28a76e5be0c509b91bd2a513a40c2fdc71c3b914ce23b8c1cc7e1e3050f6d26b58f63b82b2677d2178b3ef6453b67d2bd9247d4269b02753f6cd2522ac9cefcde33d8e6d36bc23b6a28a229262287448a05012cb223f86b2c98697c1bf07802506eaa5a8a464632ff150d75ab2f1ff05a87e8a4f36bc230e63878ba6180a1d12306462598808804ad27d01f1f94929cdc3bf5794ba52f70ca5734d1c7fd31fa9629517e3c8407a75065a9c4e4ae716d65e8e6a52e786d6095ba700f3d849b54113343770b074095818bb41c1e21811c3096ec860b5cb514d7668e2060ea6d8ec7254132a514d5450a1d1ac71185882a8264b3026b65e8e6a920456452d2dddb0c5883d3fa0952c00781d830e9391d3b48ca39ccb67b2b495c7ae39f8f3355c96ebef18db0220ba6ece07ce4fad2e17e8deeede2e996bdb6e29a59452cae972d5eadeeedeedeeee1e4677daddddddddddddddddddddcc1e6b5633dbdd168c891cbf7ee2cb96d3a7f469a5f4e8eeee3eddbdcacccd63dbb81827c7e1abde9e3be7b43d5c10e7838dcfb1e9996105671f9d9eb4eecc2d2959b29bdc26b4d2404f4ae9eeeeb23a33334797524aca75c58172cb28375db2b816e703c7c6f7766666890597c5c697cccc2c8362581968dce5486d4a275a9b34b35c6b955a46679eace59e676a92524a3549bfd612cb0d4a2d8fbb9c4efb0b7c95ae71ee56f6d0430f31e41472dce568529335a3938ed46a46670f313030e2c96378d0608f1e2c7b7a68cca0b2517a936696de217aa259cbcdb362b78a110c8a42b109cf2acb326e3e07a475b32b5b4a6c7ca2bea2803b1bb7e23a6d55a90780411804ae7b0ccee7ba1ff2d20910b9b856d6b2140ef89e8bc613cfa6553775537f37b5f74c4bd497c8870ab7327cba46833e3e5dd17c9f0e8478b7ef91351109e103063491e8e3b2eb2a8081180f118765868c18b56948d597b2baaafd2a41f974b716c72f906881a10446125c1e2a3d75f2741191b461a590c38c242e2851a25e71dac2c275289f0f5d6acc8d5467dec42dc6a51b5f32c9a6282638dc5056915602bf3557b533ae1aff036a727eae5ae7ac9e03f31712b9fcee69316ace9e11d97dabf5acdf9cc7cf5baf46c36495a42b5c4cda925445ca690b978e49639a4774aae1b6969854030f456b5f0cd419e5be90b3cd43d3be6d83fe5af36885ace7063b20ddb79e763f58dffac2ee877faf1fff99c07d7d13581ff7b1731edfcd0bebbdb776f6e372fd5416c45663cb6f296b6b5ab665f57385f2fac88fb7b0fd527619374565839d7d3472552e06a795317e1f2748ea10db25730d1777f4b136f2701e91fb6958fbc795a53733478dc50c245faae988d4d1842de4fa823556b0ab973cf4bacc1139ac351937cdbb526a14b8f5d3a17b2217b2600e192f49b1fe10788abb27c81bdaebc3403e633608d1076d14f2164720982fe70bf22708f65a2f7b0c9ad81882526280c5ceefad2b821297ec09f2b6d2f471811c59f6072d4eb23069c70d665d7da275355ab027c8195d51f3990f78a559502de058210a777b9f79675cfeee4090cf711fe76d2bad66744abf1bc771ab8de32c6bd3a17ba1eeb3b55ad75f30eb16602f064d408860ac50b9fe12c808ee7c39878c97a41b9f8ee04a2963dd04bf61816a4900b458d762fde517065961c0c4fafbac33ae3ee7e0baea75f66f48d06dd939a0748d6ec6bba29ef7aec8468dfb0171ece8211bbcdb13750cbff5930de82be3eb0848323821c1020625b2a071136386ad7ef3647c2b2f94778be1c5cd0b8feecb7ecfc70ddacf6708775b9f0d3595c16deb3ce95b08384f3e6fab2f3cbad525b38e63441a6563fa723e9dd3887b992165432458fce49c1f90ee8847bb62e3e253c5f6f21b48bf34322f064454adc72552c788878a14173684b1248822b0a041bac10b2a52f0c49aa617a03883a51ef1a5890b4b5bd4489971e20e9427636a70a18a34f38212197c50228a175e52e044132c984c0933450a253985a5bb301126490e5cac5461d102945c420e1a178620c10ada784953c606364ddacc3047094c1d32588a50f183152956cc14d1650c92152469b2f06108252b5188711c783042c30209dc2041c39a3261d88b28787e386229890c45c43c0a9326f06899414e5211601070c50a2a2559e84c8142aa480f767218020571b248e14b12121f78c0f24445c78d12333411461b20f0a8417243145216195878d374c4164c501af00186285190c0f3660a05484c48be809344c40b4c5978d12189282827a0a0c9d243122e28beb800c60b4b9078e1e9d5449326a29ea2c890844422ce1b26a0f2cc80e4c9982e3d749b33499871a24c0a787e807204961f5334c8f004551518d0482e0ee7688a9492921b92ec70c5882fb248c1c1ce114f9c48228bb02c3081a50c1e20bcd040440d5257527053039425e4c82db379b0001c12acd0c59c1380791a824a082849ba8c31c2890c42fccc2084933a2e8019834706b1c110456c21e70b0c4b3c915a6201e29c3b1828488cfd183dba7497d2047fcbf9b894f2db06e0c532736c61e39fed7fdbd1e08423e55a96a282caf5e8cd0a8faef605c99ecfb4af861b1b1a91d7ff33af2bb259966599b31cab7d4fd8ec897ca57d6683953fe78330f61101d6317b0cdd98414d82c3e6134008cb178479ab77b780ecb320acfab357f6b5c197f6f433ff97f63103655fa5fac2cc5282534018b22ccb3249b92b9f5969a35936e79c349392f9d9a564965688bc0cfb6ab55a497777e9e2ea5dc732b3e5724193f53959f21429a59430068a43eee04f8d70ce39259d35f32624b394cccc524a29a5945232b313ac2ab6c15d00fed81579db62a27f5a16fb63fdceb2efe88f8ef891621c97fa6d2cfb5ef30ba284484c7298fc1c6e2cc7b4cf92e52542f6ab37ca7e95511965af7d47447e81a7ec439ee25864a21aeadb58babeb1bde56ba706e57b66ac7f3f295929656520fe4660398a853b37690496a35a48ba1a0f55285151b4cc1fb0a85158f82259e79c73ce6f86a72c2988422a4e9dd804e2ce29ef9c73ce282876aeac320aedb3d5afe25ca0bbbb2b9a9991797d6a9a94ac56967d8b2f708d4c6f0f071b5dabff5c1f1176f55eb4aa736a9aa6d1baad3c49572bc642c677df3801514c4e709e3ace5add7cf7b1ddd9fc699817ff6a6dfe8b962459b65e45f5301c193b4607a37750501838e4f72ef97e411359d34829074d3a77528e41ae17eefc1a3be6fc1a656c92940bc5e8c7675895b65d9f552297d218437214644727e8e4b084ba5952479ea15382254f986e08e2887af2e4facf1326782403eaeac78316cab6678ea8041ea25f2debf983feae42ba27ee7cae85826a341577c670fd2368d3f0100b2399f0e1fa00b4a13b9fd9cb9d5db24b3f01309003a8940278c0f5e79e3ba9f3263b20ad1f0a6c2baa553a23730deb276aae824be0a1eab12bd2ec4ac4bc91835d71e1c1f6e02786e2a9356ce2dc59410855f47294933437fca02dcc45d5103e709102869730f2045b7871030c29b0810c1236fc8025c825c50a2edc2c718309a27832473acd3373a20cf15b94133237e427285e739dd9506597a39c28f1840b0c6a2995a9e4b201e76e6c86c0c00e65bab860064e17282658f26632b1444e0d486aa05343d2172820020b1f9e9023656e804a933356a058b303179985c9d28a09262d38993f9f6813a529b436dbea7294132e576cccee85ae382465fff42bd2baac8fb54feca65d8e7202844cc1c7449b945ad5b41ab34863f4e862ea8dee4aaec7a406659426868ac2f247270957be7b174cb1fc52724bf68e6eb60c54b0fc910121307f80d4b1973cc39841068a3f35a4e5cf66d44bb03def60201b622cf3d768707a4b2943ee5a8e6777fc9658304ba794ba9c9e0e4456b2c75ab2f27988cf8df23959e98c69985d0ce4534379e7bd7bd8f8e7b3cc595096654fc199516a5d73d6ca94259d328b9369fc9a3d675ea0eda8044e974435e9d0d4000000404000e314000020100a07042281301c1ed2e55dee14000d7992466e5c9ccc635190c32808216388210410000801060898a9a1210e00686d76025bc4ea29c66fddb6a2625ef32650a17d51929d62e56f757534b5b9e7b69a46ae0504606dd7041902b0ed88c9166c7edae2f917205454e88abc5ac38df461653ceac3153de72f6d48708df4bdc8f5494b6e6f0e589b8d05e1a32f599c0eb4703af805f5e7ba19063c3213553b890b1e3413f8104878e29d927f86f3302866c12b308e9971a5f0e562c1f5372fe18aaf8e2e40d0dbf772add0bb868d736f6fa555237dfae0d3b0d09a62de1bf91eb8496d23c5ea087cc370f1123ee8c4dd3f680660bf4b8ff0ee53012625341a6c7d3a262ef00e23d8b42b83ae8125ec0359d869361d26e8998536ce15c471e4ef808d8917825f6f8af2787bd0dea78a4cc528c7fa1ccb668f297dba1a2587c1d45e900e0e1a3020ba5062eee10cb5761b9ebed3d6a6d0672b8cf10a10ad077cb63340cf968c0f51a2c04565806f62d25b8e8db508a6099e4a810b9d053c74d86a66cec8875fddde71ff2ec76a5123d2803790b430886eec3d83b57e1dd3db0386ad98029a74eef4ad1fd92abbf0e77a4fb6aa8ac22bc1126c21b4315717640458ab3492e4d0679644ed8d371a52efccc24715b1d5a908ab0ba4bd7c94ae6032833ea11ccf7efa2c004ba4fe30ee2a1138e6c6868bb86721ae3d088a38a0e8c49e63b24a275a614fa83877dba3a46d7bc2abe565ac528244b10bee5e192a90248b978777b897ca8af3bc37313b80edf8696418bf91832ddad7aa5055822c6eacdf814f3f9f9f701fc49ee5b94b70642832cb9b883f994f2a0050fd767cb1d6a7618dd35b7f49a74726bc5303fdda29631a435b091c33f32810c0cdf439f1d1c71e520e206f798ef2713ae4502fd133463345999c6d44b54c9753a4b943d2c1c56e8cd6e248e01d70bb887a2bb224da2517a133f668b32dddd59f4438ffe030bc036072a3eba9ab97fe5a621d31ff371be3ff8f3cda7b6446c797ae9ff1a3c0dd77c0202b91eb36f6048e8b42033d1e9ec14d211a7d430a44e1c9956731f50156ea6d7b70d1140bd850de7c9e4e5409e4519fcfad5aa90cf606e1bd68e2c8f49a2db2e94a3cd7ed0a1e52790bca95181efaab69a04bc593b91ce64548bd3343ebb108e882c57cf4be98d06fcdce6aba45422417e8d4c8a8cd9fd09dc95ac0e273bbf35c6a92830b3daf1e96bd7448a6a9691c5377bf6d35ab30331450c9926b19468c9792ef4b554f52349020eb109f6ea8c8540457cf80334706f511ab5419a891c01b27f28bac0e8878f851d49142885f64ffbe325bffc7080865f3c8d1ae5391de18526bce8b43d3422a994182d73656537c21ed39cf4a578c435568bd8dcd4d1d0d4b8aa0c8cab19efc2c352b5157125c28f771c5eb7b36f7ac89eb8ae6fd25f3b9b8feb4ce8c9861a7ca6a4a6121de7eb91ffc4aceb45df6e58e185c55316ff4898059a018caed30ba1dff6e5e5d2bc7489a09d323a2cee41a363990e621e5ae9236bf1e9d04c747c1cf713ba3a6c59d23ccee2e929b1fcefdb7445e8f12382c344a3bc2bb8fd904dc6bf3d66c6924d4c746884e0300298393c069081b51d59ed0efa673ae13ac788742757d91846fffe312d22b0b064a9269be70c4f592c0c6c0de52d8ced45ef73c43a5beb5b2ea119b026b36a1effb37f5a12692677ca2c5541421b230b03791102770890cdc7c70a662f1e82aaadd35591c2b36d7013a371e49e4de7d03423f2dae50a3b90e9179cef4ccac2c355af7b1e8bda115ff7f73a32137f52a4f59eb8c6910e1a1193ef2084d82c9d356319c934e1fdc96888d0be44f164cb03cc48e12cf2cb060b0a25a9e54b91e06353967ab779355891c3dc4d5630fd838d8540f72d9e2e0a637784e68821893b91e26c441476473e3c5608e067d75ecc04043e73b800a7dec75044d97c73f0e933ce1b83430b4a851104e11e1a6b2069e4a1c1a262103ca332bca7b0e252e9c66c4dfdf2ae04954229363bea1f88c183b70ecc34a2b2302d3ba0bb9a111c06ec5a2dca278802217fb0855a3ec8070b1176240771efdec29d0b4880d4371392a170cdf200faa9804599f96c90c7dc90260072255633517ff0fb5095a771c7c1dc51dc867956f830a24485d39f37050231e5fcb01e0449c1a2c49b1e4c41481a94a700c177649de02bde910e27fa12161399dfc84bcac462f9142f5b20ac5b29a50cfa442a04ba756843f75e50becbe095baebe4b075a1e2dedb473f07352a268f32e322013f4ac1caec9e9796843fbf014747798d3180c661dd459b583abc0c72ffa2403f583034288187c83ee4262581cfb45a1e6eff1c18333dc76a1b123518cfc9219879c90dc6413baf3b142cd965ecc06d11508dbb941cdb956c18dc67141a85ae572d5e9e7e78289497fb28733aa74b38115f72453178729f537c645adc677481290f448b568a5e7734bc7e30ed2fdb19473908e08ef89f0e4f7324e7f1c9dbb86166edac1bf0225e2ce3801a1ff61ed21c025793a38f267ec88b38328e908ff60cdcb51542c8d424ef440efdbd7eab13d3dd9c8ee930882250051dc5fdeeb70b2ac9eb2ef950bd21cbd697f544aa562c5bdc5e1dba3a89c20da006ab3577c6090257b5ab837564a2eb0faf6063c6d3c8dc238054fabd9e346ee26029deb5232d786cbcb997eb9f237288aab003a534f990912bad043603937329654630adb6c17aa52727e42b9e776e716128f077f3333990953b6d51d344adff581943dceb93a3455d0b577294bc41bec01d431489a681f505c165eef26738811023a4f2a564dd7112fdff8d491e168d15e8f3501af80b5d1e19542ba325cbacb755d2b8af9717eca17680e11b6e5bbbc04bd11a8ab82dda34442adbcf5f4268d1d0adccebda03c2d016e87eb329efce80ba8b5c80addcc018a646550acf33944ce4a8c0a3a99038ccccaa050f73980bb598976e5920d47792da8ba2a7cd5e94a0c0a583de184e8f67ebe25b5d8c4c9c1daa61cc4dd4a2529296f5dcf99226e21b98ab904fe9253dc4fe610150284f374145d57f6d9334f104b7a92c2783915f6d230b1f5a9a1bed31536ed668cea09d414b6979e37ad5864ea0e712b725889622f2d616fe61611e03ea358e44e46af0981ccf3b25a462220d52f354dedcecd5d3f03a2169f892820944e343bb2c9455ae24665a05401e39b6f7867f7a178a544c27a1c51888c447f7710021309b1bfd87fcac3a9ce0babc7d84fde08063f1a8fec58de1666fe375287476adf88e8d03a83309f524de2674618c0ed83842607ac8ddd1bdc5326ee942db97e00be6c4d95042884d9363ab6d3128274de8e879d587779b72e62bb96127844eaa1f1eabfd65292cdf32cd2ab58d76b040ed1b39d738a4f154fdd0ff34a2dc6a1cc05a078814b075386993addf53cb2284628838aead645c15605ada73443d9b002004d930980570187ca6d7f22dcdac215541e626cb6888e985c4e0487d8e2286a221a3dba8987177bbb57b52163203ce118a1ba0a546844fa000b36aace6391cc654bbc9427b45ab9a484d59b48a9a16ceb9f3a1f81479393486371a2e6703064575dce91a832a90fdd323954a60820eca2fa9b24497b94651915cdc36438809cec30630136b7514f7169a381f181c4f93c2dd854806273e69b96b74da636c1af04d7539f3d9206487aba6d63eb9d8ae9f70d8499cba1750f5d4e032e3b8593eb412a36e382715c64f066c874f6970150148bf9182abd3ad5ae846b1ed687ccda5cd9b96800ab09087052ed6927c1c444a5fbf287ace9521cf27cd561892629188c58425f26258a2ef57351e5cb1955a56500e640e0e2c6df48a5dcd24d071482bef17d1899fd9f5630b3c036568aec8d0f6169bab3b695ee320130083f9f82d6ef2201de83da92fff4a66424813cdb2031f3da18ae33a7dae28d83102a9a3f3ee06c46f1d44f83b7824e2201297183c742391ef22a5b2de7472c4a7d4c6f47b809f68723112eea94036ea46fa763d8dcde494fc82f2e0606f80e583749591a2012c1d5a04f4b26d545a89ef91098c5cc8c3ca2dc80be25d28405725a46c9d1aca405028b1073ef6d2f94ce8a7368451c9490afecad731e617e682989c002f0d1d848f63340ee072ceb5767fb370596f4c182cf6a836d63757370a8320ee74cddd8ad0cc46927e8f9e64fa6c1c4587df416f96d9798aae74089c3ec5f0d5075c18c3763dd516627cfbc9b2e8df870996cc7a99d3e5631b9c90b64589ed12f1cae303f8d52ca09da7c26865a5a6f66fff17bd45245a315f5df46e7aea209535e5e30643bbf9388dd477456aa2a00ad4951520f4d115801f0be5e62670a9ae6fbece34b9f6cf672ee60ee0ead44152a26a3fae43e9f4588daa9010d97c7e7b0bf3c0551b55029443d6c9c00135f0d7830a266522780fa1cb1b79ae7ea0e8b14f0b3592de045824b857558e5cff771bfc9ed31ffa6b159fdee0964a6b7a534b6b0b159793b1d0c9a9c9c24bce3e66eb8cfc4bce036ecec3fa88b40706299a6698f4bcda375b51ad53854a0fa537ef266b37e9f2a718818cb075aa6d7703b5cbd5458bb027c58d54ef05f187c1799177ba2f7ad38c5de65bb4ab96a161f6e46dba55fa8d2908fdecb5a622ec76821400a23fd771735cee9dbae0df327f24846f426b84857d027f7b4ce3b6d9994f29466127cf1f4eb852f1509791d416975cc5576f68b2eb0813cc6cf025f77fca11b365f6688aee19c7e856055fa5202cd01dd05447bd22088f42d0d06e808588bd35394526e023e74e1eaea32b282610c7bf4fa4fde324a374b4cde461b7709ce3560abd8592aee09afd0d3fb4efb25bd9ed5a9e2a1fbf9fdba4bef0af6d5f74db0c0dad119684f9471bb57e5bc0df284472af5bffdb98623d08c45fb29d7b905ec28e353409cd8fbfc3c5e4fede3a8f2af098c073ffe6156539dd7c65fcf1e12c3410a7b69a5a24bb20af60b6c707b49b1d4bbb89c50eaa91c077ebf3c5b5db1ddfeb78d4e993807f1a34f62e6d9a8f2e9a5307703304f2787700504a8f61b467cafe2e9c80e10e9e351242c40da681931aa1736100cb7196ee7802ed58efcdb7dd41c76a54f01c2d94b38880324dd9686a0e087aa8efc647adfb53b21cbe24ea0a625ee140d4762277ba9f4affdadb938622f6a288f3206ed7b1c76ca34e9a1bd000a2dd53a424b96558974dd1eb75991e051dcccbfa83e81a22bc40a3bbd472c7f623d0d60b2bac20c48e9aa52720def41c406505c0cd064784d4ad74339ecb926ae4736ac33d5bb5c0b0bf833f0eb4feed4409b5793b879ac4f9da3938101215fc84739c4a78e81adb26dcd612959e08f19fa68928b55d36a715156f08e084733ce8c686fef5281e8d9f97fd146aa81a5a45aee9a72c426c479f4820db4dfb9a3122447dd75a4c7f69679991247902e80793237fb42853bad956f94c7ae5f2edb4638fd7b510c6b962026e3567eb26543b35f9789aaa5002ae5f311cb1a5798d42ce1f1e9d7a4d77da7705bcced0fb37af384891a470d2a63b2886cafd7d0930148e77e1200c207264232e931cc4935afe50e61bc5f8d38c09d1d85ef1994803de4517fd0601e40dfbf91030bc49e8fb818036d03ea29bd0135d20b90ca8d39077286dc7f90851a79b598cd5d5dc711f95496864ba1418173c3f0eb74a8cc7e130896e7b99b03f705f4ff8b4fdeb26c31f59806cdcc4f09d3084044554d1b052c0691e9ba0c6c1b4bfef820ce8d3f4e81411cf9d89e47575a8247302fde9bd864c628585df5918f07b270d202a938c58d1c4f70591d6887ed0c4b07916c66c71019e86dfd08831d08593892a41db5499d17345dde2f39aacf439213882ae02dbef297dc7fbb94ccda52a80ad4d5ddccf2dc73997545b6c39b1f29a105e5e10cccc06d5ff79954632ac034cc395db74b5271e0f1184209474cb4155c88a8d409082df84124cb5ce45af10656ef70b8cd49a67c5ce923ad14983ac3ab530a710638c66434738e03299f25be424011d4e2dfa94a71b63270f9bc0db460325e402953f1517ab84eb0ab628451eb0a474d4bd8d755298d670e14699611b4ae1454a0485728536c6ee46aae4bdc678e7c2f59e23fed3a6c86f87874045d571135e438fc35bbe4a12504ac96ed4309d64ddc2d021b80eca9b2c676bf9de37164d61ed2ff9ba205fb23d285d59ad5d0632b8e0c45942c17430e20559ffa7d8d69a9a5a46ab4506d0ac0147fb1e53431788e8dbbb44e9df60394c6e47c624a28ed0c1da21f97549357b16d4c998457170f0e82628b4f1733696143322f196f7d3f978825f3a0b14478e1c94de9cd0d961e82478223a705421a3a5d47ed49a0e8a57025e6c765bbd8d2cb193acd09492e6042cde10aaa1b6024e226123908891b69ac0f24205934c1bcac72d011103744640462dac81c4ab7404de9170d629d1edd2a95801a962c4d7934f10c127abcd8c21c91217ecf666a99f4f8b9bc421d4a8832618a7a1b503557f67add8e4edb6f8155d174ae0848c8800d4e411d847ab6b084f4b49daffeb5f9c7af769a887245ea40b55bb2e3be2c643771686fc5f6ca27f4a5af6b7a091f7890d36c0ac8761e8bc047864dd09cc59abf21c638f29ee78088d75de7979b759d3800363d57fd7a01a939974a912d71d2834f8c9ca82b942d0fca5d849fa3e9cf23c12611a355fa22ff3397a44a9e86b1ca6d5281d6a67f4a7bd706a7939c17cfa753910e99b730ea713ae976c5701ecabcf3323d01c0a6fc1e85e60fc82fcd4d9b4779eb4464e9f33914289d3dc5521d1f331025d7f3d1ab5f88c2ee2ec72b274583d01fa3dadbf73d4fcbd3beb3e38fa7b962748761c07d104a4a62ac9fb2442fb691d83ada38153f65164de908146378ac870ed904ab8aa0f6f6608293dea14f68a10288766f70accaaa3d66ad4ec19ff266b4427a240bca7d17b27e74f9bbd272930f9ac40aa9ddf0ad088fe16fc3f41196c10d4563c53991a27453b4aea9d1eeb37d52fe06ac2328e6382daf5c60610638b0032159d5caec79adf47e861cb439d60c8231cf0ea05edc48382dc62a836c49c24b34a285cc5783613501101f630d5b545d679918955cec7aa40cafccf208044306029cbf03bbeb2c9b7dfe2aa3102a9dde11859c45a5daea4f2c6cfc506b9e63319cb90c4c90c58de303071196b7d363f9bc82e6c4c5882bc661b472fce6c836c3cb6952192a3fe74aa3f0e516aa24655c579e052b9b45dc74da903df117e411ce32b2c94cfcfb11249990ba9e4312fd84f8e114ba6c184ac91ea88b692d09c01401802ced0c6b2718d83c95ca4f38fd4f00c08f8b8e30f019c2799df2b953995fd32a314d6ae03395ddbc732c60c7d66f428297e5d802dec21a26d4e9881016d34ab9b28ed0012e3302c10a9902f2d70d0e6b4ff4ff8beaace306931d093f5cad0cd0a1657a5331484e71fda0bf5d5287b0424f25187a7b0514ecdf6699ec5f85147475e4993eadf79ffb8016c9e1ef16362041c063dd373590d14caf8fb191410e62c23bc4b6cb04f3105d4c70858b2a41cfa0128b3c5899822cb79d047b1687834dd053a242d1687d2854f8e9273f8ced39e82d10d9c0d10399ff4d7aaa75d8f08a38c108a80731d31b792108ac21e09396d5dcf1f9606bff035113687fcbc695ba3d19110d3e9fe9307600126e0e0000e166ce053633df90058e0337d882c84ce184cfc8b9b1c6385556258e1de4031c653609f20949136ec5d639b1da4d100bb5c48d4f42b17be11bd3559aa1146c16cd2e160d42354eb84c150c1839708c646b064e06e04d085e3261e23c9fd105ac363000bc60441416a299970701609e3b541b6e5045b107b3619c4f496a725b6112e0cd5c4d6ea1fd55f9585981df823acf7939d974c98097d9608abefff5d29fe1c88519b20c652780b632683313624f1f36ef5575cdf6dab54cf6afa1b1301d5c0f8c0bc2196142b04c115748494c20d2c702d84c80d51c4560d0aa5f7b1bb10deba8833a06540f547582209eb3643c356a914661d811667cf2aef048b29ddb45a09a8eb2e6e12968b9bcf40d8bae67d89df437d41a0d063d912dafd639fb7c393fbb0bbcaf1720c09821c9316f36a36d0f0a663bb546dd98e51dd4ed65cbf240064737662d252742b994fcef1bac11060e9b1c290b8570915c623ffd5506cbf02b1e8671323ee0d7b0764d906442a240c7e6bbc147dde0c391e2147dc9cc9a916006d545daa04109458fd3e39803a85ef6ecb8b98982f7d3cd52cb34b0aafea94c562ce26e04b53006a7ad2f0c1937eb7d065eef0fcad34ff6ae80dce7c0e72cf471d69565fe5eebe158a1e95d8d6160abc4782328e5e9ca8438aaf43843dd70690b44f02e5bc894cecdcf8c4dcaffd72dc6287285aba75e03adccd9ccfea2782c302f64be619a09af731410f72614b85407f9bc9f1ac5728f8a38c8fa30bc1f33bc05476c1d4355e235f9b198760f0174120c32e400ea5a9bae1044194e79f42bc9dc6282d2e8e503f4afff1d222d027d2e80386c9521a4737d9f19d5857926cd8f45f99b84e3d5ac10883664f674bfd5d3bed864f302e2e503f3b038ae0974c2707c42fef15a8ac56aaef21b2cbcfa5658b2aef3ba27c27df53e9742cefbc741f42f3c644318201bae7540184792af7e95e87f6b27a94631543330ffb8cc2a062a366a7ade77c166490ae2e0206073933d7ec2a9dbf4e15be9e5a5a9ccab5d2c6cccfdc984f89970ed49577a9669247fde50920b31aaea972d25a7849b893cf16a0ef41b7c8977a2aa18e7588bb5242327db9008d12f5a2a593e14616c0a634fe6731741c04ace10c3754acdc06faa11d3a61381fcfdca365e41eaa37f516550589e91fb1fa34a7f591fc42270d1f85d3e69f297d5a76795436ecf6e9a8968ec686b575e703e3ea8fe10164f7bf587dc96c6f50a4a71efc3c9e070b0e98ef6a8c512edc3071ebe8d16fd89781ae45e010cf24eee2958dc61fa5c30699af775235f552f849676978bfbee5c752242596185527380f1cd40e18c5bef5e599aa335ee04d6c77ddaec1fdc1217c5c127374b3b69c139fa19b83c7998edb182dda062e757e5be1a2b6cb6d36b44968cf1dca232a3658fd299216342724067762365cff57e14bc4d6470e5cc75ec7a09fbaa49be4dd76f3f9626dd92b3755a2d11eae9089a8733630ab481a9e3d461943bbf1bcb5dc750292c1b5ec0f6113bfc9baa8d258a6c03bd29536f62691fa4a200ca6e24767e9dd9b1ad5aca15a251c57f7d615d0ebc2a8943d256095a28835d16ad3d6e60f26411beadd4ce208558abdd529f4c7ef29ac36f8e0726e5050ab329d6b041ee84db56cd83b9b95191aeaeb2a3592edf681721d5c45f001295e8a89e9446e78ddbe23f5f15bfbfdf1df1bf63dbeeb431c906279563457126b2a7481c6b7ba0fb4f8d8e30ebeb88e82f2b350d47f1bd243cb4bbe416b786ef6d193922cd16c5548f5b3b2d5acb3245019201f383d3047974cbc8f3160fa7e107f0cd0177ea67a79ffffd0e25e42138a03e0924702976104cca260c79f78c17a53800b2ca0c6603f2841649a411ceb6adabd228ea97622a2c3ad195cf9e8c029d218e3f3731bd741c018807db42b59a44885b40772b0488cfb0f3712803bec5f1afee58f6237aa9904c4abfdd09d24c22889d924754512b6e435b4ec22753ac1fbcbc8692001bbf386268436ba12afc57710584f4420e4dbc04a2716c5adf49a14a1dbe201107b737c88a07b91b0ceabdcdd53676d5104c3203a71eb93ba402e26a8764bb4bf069d957c795c62751614a91dd2003fc8f5b0af86174049e2867867c0ac114f1e40ade705abcdfc8e4e1458719d1e199c2f184527313cb0da23ec01afa53a2006f37ccaa3d50acfd8e8416aa705d49e058b2b82da0d7bcb3e0420c824d8136306e6b0301e501f00987c21c1b9173ab946e931638c9d56a794cc0b3351da7a604ef8d4b9bc3e8c2a1b004cbd60f58f72b0163e43b16a9b00e6eef7b3c3fd2b886ace554ee41ed11e31fb3816d1ab1a07165855057baaf5aa13f38d629f88b5d0901eca002e4d80357814a437357e0468924dae70ac5293bc734790a18c7910041f99a8efd39f673198574bed10744bfbc0ea5471f8c1efffb4556db3fb618d91d041eeb057f1d436456205315eb75469365dcfe1fdc22009c15d8515306c4fa61db008c9ffd70aebe56504c6c38c8414f00ff9a0084ae8f928824609b259beda0bad48d33b408adc1a10a51175919fbcbbe057ce4041c7be2c0bcaf9d772ae05b48523a962cb06070210d94a0b2822f3fb030e21a08226702a2870a9cc637f8c2b26660cb699dec04f55ae4b8814a27825f01dd3e8134d082f07371799664842184afea0442f00927eb038ad4018e760c4f0b746e19d21ef70a8400d8fc89230e151207de4e0c7d5b32fee2f775c3063238dc205b52c208a860d296bbcc2d67d03eab7e588b25f271c87e37a6bea86e05026acee08d694655c62f6c043209a868c632602271383ea3e6952b08c0ce28ec010f2d62ea4de050004451e460cd4c4121cc09caf28ecffb41d74ff0bd3ee48ea25d71748504112df0bc35a1d6e9d9382c069e63c60d88289e837638596f57fa22da3e7ce906fb85202efef24356e0ad964f6b0be5b2452678af4e6fea45d28b4f8e138c77d1f4321ede96b3bd0f21223a1520d7b74b1ac60c4d1cdde05d054e47f8e01d2e44d0e8ce86ae1bcc030af4d554eafca9cb325fb2af676aa3d125db7b4c5571daf742bc7f80be3b8ca1474324332a4db35cbf6ccc7bfef3a1a7c51a38bd02f494230ff4baf7a6693f9aedb5bd1ea6f80d9ce8a17b35f51b079bff1e76291297ac81bd95aa39a708940fd4ec86f2afbb97b4dcb4baecb008dfeabf9ca52f1b4dda758fe388ac68f6589f2b6dad34554db2b74860ec5526bed67b95dbdf3e8ff87a953c324a24efa7870cf3d73025020270207bf7c4be9bc8a09e3130473def0563ea4353304c5d4c3383458a0100fddca114f74e378fa06145f5faec7c772e9fb9c1e78cef7cfff22e844b02ae7457b07691fa49cd106e03b1b42956ffb91929e3d0f00f2e2dd6ed5db63974e18ae3cd459d9268d4e20bc9edfa95124920783bb1d06c5d35c8191e6d455ff0a3a90d309c7c25c9af449d5ba745fa10609621a9817393973bf4b4ea75958faa39eb0715c35a2a3de6d6976a82a841ef45afdc1f24b06a6003e0b3a7da9e5c1b87f054aa09efbad578037dbdfdd7d2133abe925be59f9e7fd683be7362ca46e37923f00bc8768110ad85c387c76ecebd8875e97ec47421e6093631d09ba734fecceb8af3614fe20eb778d06cf6bf4ec1bc1f02dd391ce80fa96cd7877c0f501bdccfe8487ebc87788acc1445bd3204323f871f3fe0a28f130fdce254200b3f1a36d71a1b6147143f4a430517688f82f7f4e40fbe7bd29f864964b3017ffed1bf2f69766afc7aa372dea1c021aacb624dc06b12227e0cf1600802573ffa4e113e27fc16569bce7616da9da64681e4acf896d45eab051c55cb3de88c2cb8e9d6282e5dee3fd25c88caf75eaaed1ffe75a7682d4b3558aad1a1520d7dea7ec1c1b879e099c0e5a185628abdc28035ff34867a855011efba09fe7ec1e080aa2ffd5d9f194a16552e7c57a9605076d50b79975130283755b4f25df301368536e93dd48669b2aa2e80a990952cf42a7ac1366c946a5bdd02671a495eda21a8dd1bd54c67042028a4ffdd5ec2e3a2d943d0cc8cf2cda0d608090898c939a828457a5ca01774cb12a1963c265f8777caa62b39042c8176de6d63ca2903c0b6982f45375a44f85fd942077aaa7564584259b29ace640b53609d67e0306e757699d01b30ddc2cbb6323427db79cd07c9dd2fa0ec56820e00d1012a2953ebaa1e751ddd44e378c2ce97cc6281162e64a8be58d6c59ff8bb73e862a6be3165103c5c1a845825b93f1921ab432ab021d3e095307f8b836ae77ad62e8d090134a48f2b3edb08f891c2c8ac3ce18492006d6e84cb725f1164b5827fd6caace9b0150f1462d25939f0e075439df17b71f53bb5036e0ff77547a3ac59f3da65ebfb673b8662e88a2722511fbcca8e191896f5804562b1b7e383952858b71ade6407b42ff952f9d7cc09411e84b1f2ab9a3c634cfd258366146ef8a883208307b6091aa6de65c7f5607b780093bb429429694e34ee6fb8bf64b1ab45274a1bd1b5a11615b20a4b3c175cdec3a376f4c04bdd7213b9ebfd14192fa8cdcbd7a3ea0d67c706d650558684fbc0284ad0d5566a75b2b315ade236f36c82709b561e59ffa63f6808137d157fa0ae4754ad479947fd47510a4972bbc5523b73c47b8f505d24eb84e77856cade1702aef08b9d115b99f1246d271f1a2abcfc6c0af38b51a7779c500d74353352c98e825e3c710b8c5ec26940e8ed90de734da7abe28fd5b132874c107198c9decee9626a57083a30d822218f9b781c3395761b903be931b19132748c4372b1ccdc487d56629fd775baa481a7aed10005d5b1f63a023854295e80dbeee46a99df02216fb6a22142622d363292953843f5c5eaca138205bd5a4654c37bac8865ba2584b4b79ecbcf456b6132120425d71650c2324532b982a988e5361c95e114dbf0a8897a312296fbdbd10762e466e0c8f45623356ee903c45420ba12d390ab8780f76c14b08c64839bdf1f9caea41756170bc82022834ffff51cb1fda1e00942a8dce1ecabfb7bfb4785795e5c05f4f1d1a9a144e404683d85653b758200b984a151aa9339324d48b5c3dd1588bab30e335e9cc0bddc6f27f226ec17aa8e9b92cf9ce5999b46ed016f40124f8ae8aef2b85f93ba8cccefb7b1e7742967abc134e5774fff2477b997b570d74571037b490ccdd4d1110ff28401731b2ffb680d28f80a0606ad8aee68c7d3c60ae79a015d5a1aae5df92c74f45211a1fc8070411e78df07ed0e9c27f4e98f9833df9d906d7f2f150391639cef8a3994f0e968096395d9f00e1a2f4f358bbe7ed22d657ea8fd9da9c5edf21440480b606840ded9be0b0d5a4db98dd9d650381c2f1147fffda3d51e13c124e4dae72d5b59c9f4456148e026157f4516f95dc1261488878fabfe755a65c644f11b78018bbbc429fe1a79d861051fe5aa38fd7fec7e653e1728cf6ce847b8643c770853f19741fca90de277315a9a23ea1843d6c44aba2b46d67de4fa5ec1b037fe37d59586305b1835ec0414f4f1c867778154831f8311806b2b0d29923e96a77d19284fbf5518976084b19f54ffde40508fc8a4ea41f27d6817defe93125e9d3035ad687f8f460b5b9dd0616885a4eb540f02792f93b2cf547646315633c8427b9b80401b807da220a671fe0aa22da59bac88d90a7e8a513c9f809e80c84338faeb66b52ea111be9daea01168c49af7fd67691055f1ab15c384d0104715430f32ba7ce080f5bfa05509a95d0328738b1dfd9dc6771515c19a3f4db04f9a24911081e722198753a510133a3c05ce5e30ba983ea7585905940c8202938bc0c6835127306b394f6fcf1e5836b1d9d6eba112badd6f08db63c7a706932098e312f4f200695bad3751011e8b5dfe0053fae8ff2d5c354f62ddae0bfe2158813dfbd4029c2f5fceb959824e2c7ab18f513e7f293a023c162119761e2cc1520075b2f7be552faaa70c1bd6318f3bd6cb6fa64224671ed6acdcb2e996661373b44f065350d0a2e56fea12bc6cfe326ccc1b64513f117fa47e0ca8c583eb25bac76dd47801cafa753f195dd99408ea4dc582564b228fc505ad6cadb22bd22fb5ad412163039aaafebbf07b00c8798034aa81159635892c737653b082b9d2a723dcd4b5260f0d43c41df65bef89c507b2fc3764eaae98e0bf6000cb36f503c8a584d84b7d8c42eff3d05d8331a3126846b390f198d249139448f86f07e50dba15ca7ea3a86622f4408d191cf0dc4f854fd1b52c50c5128c41ee071e37f714eddd1450a64ff8fc6988dbc3b848c4a8684d02b12d87e0d0d3185344e053c89f974a4694c47d54d76cc352d74f86502ff871974f3bbfc27cfc3aa303161ee9a84880953b275a7a759cb7ec9155ede82be28c3f182dd9cdbdf315969d52b6eeefa3a27336c255951e4ebf8556a04b4322eb431a3afc0ccd49508551c24d43a7e1f3895aa0d8e9d72c15da0f8103dfa1f9fb1bedf88d1bc1d7d3f34bcda9f41e26d44b864cc0c2895525f362cd7257d11aae8680d33f56cc98adc548b47bba82430f7d01bd0a50ad9bc9d586eee2ef3620f95f3f37d7e8cac4ccdc17f7e91486dd5018ad3f2257dc475594eb5e8dce5c5408195d052b4d92fae966fafd851e458143ba19bc4e5d9cd3ccd3fc89894b62d96e0de96b8000b760de82d7733c8bfa25f4f5ae0373cf9f8eb2fea7903be204931727066744d0f933e2b24a5e48c262367379d49000b65c968560233a851a4208bf2f89a2d7e11a37478f588c26a1072a446c2d7f46e6700aed9cb9a358505b60d88963dced832ef99dd989eb43cb4a5a69b00b49e02e00a618c63349140041a62acdea08c18c214f9dce10243d69850e5eacefeeca4e4f87396b6aac652b748d72064faa23c275d668c018a685b44e12637cc7f90c2ad8f3236c70ade26fc4310d4435d7514bc708e1e54757325d7d8aca953c0b6a7b2eac1e91152480bd3d3943dd95f636483302483fa22c4e691279907af25fcc833e1688731da7a85a8bcf2c7090a236b755cbb7085f446214e6b36c02d1b9a228769ec69b85f69f8a525e90a7f9b94aeb73d7834b2cf0f84fcc801078361d228138ac043d59e54c240c269d16584950f60a08ff46ccbb1b128cce20305d8a334d2a4a65b3e6d6e646a90c0d4c4abd7f5516f0c0f5fbd7caf1435063799d972904554fff0f5c7aa9ea8127fae8be4b3c112bd8a34ffb2547310d00466f706e10f1cc4b050260d320d1bda3f8124149a0a96243261a6cf78196aab0f7b08b536c16eb65ae7c7f97ada7c938aedd41a0d52b06224b348f505606e53179a1dd9bc540fecff4032f7d7102ec0fe345bcd7229611654587ed28f09bbb5dc032aa1526347af6eae3d9aeac9835213132ea3e3e71b86100aab66b817c7cf7b921560b354514aab3ebed138d8180fc004557a97be9015ac00ed49c3437f9019daef2e95cdc99133519b845ddaec5a02cc0d6e994ad5b33d50d393f0fe505808140852e8a6af9ebfd1db2d8f074ad29180305f87083f9e3fb77ededa663ae9531ce44074bea3e3bdf23d635a0102a5df6415caf4e1d780e3f2f2c0c1ff3494a1102458aa9c58979b554c3a71471f4d0d80c408468633d02c7f645716aa5d1959f1aaa51fbd377584f0daa34f2c6415bae4c2ed42a748b78f5ebc08a905a8a6ea5d1d7d791f236dd456cf52c8d30bd136435afa94df4689094ba1663622d6f737c1ac5202b315143175a7b26ba1dcdbb276246d10659255848206d10a3d87664fb557821a1515b368efe5b2263500d8895464677d7864e4d51b0d3a26821d214f94fb027aad69b1b35159600de727f7846f7a2ff3993d9386b56fa38a8cda76d909d45686216d8535e544bb8d3e6e9597d12ea42db5481b8b925e322359f1717dd83a2d6cebe47a94ad52e3ad9d322c69487e8b444020eb8f3a96e1daddef17b5ae478711141b3120c994371518ac72f9dd302e1395c5ee75b641eb05ec81b84e74d0829c202616050fe320d6f31d53b0fc9969912cc9c205a17fbb0c502e1245f91bfa91d0b0a1b0b042a2049240c6f0356f88fdf56efd83f4b32155d66943f92a8f5d1383a159f3ee1482232f1da96e83c77deec7e7947fa771f9596029c118dde3f9f76b3fe12ff52c5adca917cd59a9b95577e3e132750644803baa609ed0cc25122a20c14531d5cae26ff8c9c0b2a0772401563d5218725924e8b27a081814dc80bbc88a414d2546cd768fc937e857224e3b7d00fb22d82c788bd8998b8f79877c225ee130bcd6fd231fe95bdb48c883332a4284ae83483b2f83299de1780da1abcf41c8884d21667371b046eb4e98109b23eaf2715fbc2d206ff444fa664609340c28131627d622484d4f2824d9eb0534f63706043f1f03f66969121c524c269ee5c3f1970a86f61cec1e69d561c6add3182a252d333924c06ed692e22988e9adc9253e19f8ccc2ac2416c1f0fc947435083d20bb44f3572388405a1335403245a03249bf73b5419100278f563b92674a81462ee0251e942f60671bcf733733064733606070cd9b69ce6f35b785c480c341841251c33e2379a75c6e4fda1d91964c53fb1a1b68bddccee1f266e2c5394385d9c4baf082a281d304863410c3ef16cdcd45f20a6479df3f1bac6024e42a10316e1e58f14fdf56c274fb99fc20f0c1129d9a8670534cb271cadfc0fef4a7ee4eb1fe46e50ff4730050d689249336a46572156d09922a23b5fc30d2f1469d9dd9d33080455665b330d9a9f71bc7a7eb21bb191aa3f3eefd0537754dcde2d0ec4a33fdc75cbefedac2190d502db251bdcdc9b73dcbf9e76a54fe4cbfb707691c92bb2681fd5ef0c22899335eff3d41b0c0463f25dbd0faadfc31258de222b7d70570bc73bf828aee036cb2ac783ad29076daeabfe694ae8812aaa522db506ce3da6debb5b78ddcf357cb72ac488b47b517edb7acc80f8cce616d4c4c25b125e6a21ee741d2ade25fe7837e475a32669b30400c560c3f0cc412a78052f5f82d1d1eb1bdf5eda234ab55f26c7ec586f93c95154039e4eb248f0d8e3b72e1cf5ba208d01a4305c929d8b6b420a9a64542a39442cbb2990856e9e8b61669bf196eb528f9cb8ceb1a7d17021dd34eb15b9541e290609c44e436b99faa512b6cf606f6225e6ffab94db941818f03106f200d426ded1512a1d6b8d814337e8c636ed341e813e5507de6fb8e7508c9e2f8290de405734b3af784298853d9b07cbf098f32f153c70db2a14464c4854aadc45641c744f322d0a4d02bf608d7469fc88e0585acd1b3691f2887cc02840f8217016e9cc87bc205c113a689cbc641b8ce797c32153de0ec7ad75a0e89f251fbd415fcebf7e88a39166ed834e141c34dc861e06c3447484f8f51fbe67cf46a80a6e73a4301504aa7872ab32139d9536a9c1f8e0c584121b2e200f30ea6739813f008904035976f26bbad8af4e090258cdc7aefdf712b207ad71de30c07d127bdc8dd9cf713ef009834628a1c57d510209122f0e2f41199e01a6543e58d6416e8c49f768ffe8223ec834de81bfab71db97c01922025bcb7e1cd3fea60e752d25b4879cbbbe5a6dfa00e32adbc043da5c62a6c1e810f7072d7b42877a81e354b6b4bf13e65ecc804e507b41eacfce632feab55774216b9bdd40445eaf151c457a924e5449daa02640dcff2699c13bf9a96901c0c84c82e1224976475619999179a253f823a06ca6b8fe11f9445d4c995a7e82bede49db3422cbe2bf9c7e81154f07767b193a41908f079432d409f8ccfc964a49d9fda188de07244aa9627807332a6b99bce9e95f700553fbabb053a09f11ab3c1d073c6ae4f4b2da197e6a1754d0381bd9a5d4d4fe45b3d555d4012089aeb442fcf05b978c65f8aeddc6d82a879cc2cd24a7d5aa45742f635be976874fcfb62aa4ede08b7a27b75a3b1768bca69e8fcb1683fb083e069a48e369840199025b737408d365c45645e40f6bf8a3f39d09c758743ba5dc4916431758d7b468d451686402d9a81a6a602c18911732069ab8b2f22d0988bf0ba9a33f728cf3112abff76aea06e2ec4b744bed12d1e50b099583c89aa5941c38c4203a54ff10903cec4f18aa84884402f82cdb473283f91bc5e60f7bd319db11ffc74c4bd3e31b6149be4d12309420e967814f4fb3f5daab019a58ecf89244bbdc20b131c2468e7dfa2a33f7436eff65a8ca751bd3dad736ff04ad0e9fd8ca6dcce3d46c9ac185d7cf8cfb397c4888f043f2cc48260a190bf1e5a6d75ecf5b3f5a31e5b67a34fde1297a8ea7a3a9644d79b98ba856e2d9a9f3e9f62a1f144b022f995242a243cea676e0c1e20553c7af32bc847d0a4376811d688a8effd19f15deef6473dad972884460fab3a1454f4bc82305e80261fb92752baf4971dd19b49de6082e32602183902ad2975d63885a2a40010114a8c999fcc934724e7ec68117872c18c60e60d9e3a15911537a47b5520ea6a1915d0f2b73583ec805bbff55a38422c85d2c1f70951cb793b76412a8390f1478c98e24ee1861bbe9a48907143972a0a85f48e6ce0bb729f4647429869ff33003f649638e700988613419a95e5f48f4e553e8b811e79001c0bbc73c2d291beef22c48a3ba271c604d55a5874fc1b98ebc42f029c04f3d6b6a7223bd2a50bcbb470c6c7541f50c69de850413ba77a7fcd6cf539371277d38b4ef6374aac44e46658e3aca566394ff7e2733e6b6656cb025b71bd694d236a0516e7b3dc12dcde00696df3eca092fbbe3123b9747c93eb179d925bf536ae37c009f6e021281fb2303a168d2115686ee366004201ed70e2405af6d00ee2b0c1065118684297e24119130ae6df79671a71e5e101264114c407e157f3a7e30bfe2a89b4ae619ca3e10de20c843316111df289d508400d1d550fcaf2501da33bb43adce25c7154c4a843c582c29b0dbb9a863c35a94651acb822edd59b1f8bd09ed5778880374cf56999150e204ad46f7f4ee903d6f548dbe00177afbaacb8255664bfcf4c9d12148bbe14fd65070bfde24b1f1434facc9fae1593faccf316e5d3f75693fe51620a249db1f6e191ef0eef924980e94fecbc6a32f9f66f3cf510d66d8b0e531876799eda5d40eca97e9858e2637d258805de1e43b69f0ada8d46a29eccf0da07e517624705d085cc35da3a92d6d489d04af97e2d748793a19fead36dc40124763b8469520b36e9c6d8fd9186d24e6acc52bb791c25e8be971989ba84408437b0a2f0577fd27ecfdb38af4e67f9144e27e6f9aff7f9e282f0b5188014976934a655a1e2307b2edc3d81e74a8fcfe617279e6bb0a3e8526856270efbf2a781b0dd96e3a1d471bc4519c60109e5d216250dbf9905e7537eaf9acf8f71afa86535e08e511179f3ba0024e2305921d855d9295dd3df55ea384f678a55da3779a00d31d262434f2f4b682a33d0c319472dbf56e9abebfedcffb06233e689f9d0f014f0e885bb767a2b8536fb5d85a92b924e01c2cfca852212bd0bddb1ae3528b3c4175a02c590e484bbc8467e500cf6051a0bcbb315f0902cca3f4942a33e2a026a522234fbe3ca064d539d617da5ff1f1a59f15ea18a386159ea1d4668c93d58f45a4185b57ac191adea4ccd4f4378516276c84ecc59395461e0b740e6fb4325384a04a50f48fcd15dd1f69e0244851dba66db4120e14a3b3089281b13433f57abe60137e0c9fc6c52043f9bd76b90086aeb4dbe7b850b750b6bb53ba8e1e71a052b7f08da5b816b91d9122a9abbf2da561d5f3e6209f26915f60c1190af367478b2fe33735775bace397878f302c3742ace2dcee927901cb09d1123cb7372f419ba7970809ea25c6979607d37d402e64485843c47cbf5c952185f33be943d0701a9d7a0a1b3a665bf9570d3d4c7d372f5bc9443714dec33ecc847a1da94dd54bfb9ca4be2c1f195122d0cc042de68739e9fcfe2d045770800829006da2e1041b09f8fb11f577f10297a6bf55584f48dc777ce34a415d1d01f0e264499a0880634f5b1aee639208017038c4765b6a0da523c217d4a6b3bc59fb99818dc5d73f576583fe6fd6300af76371115c07fe007808732198eab5e66190cfcebb22340e64d1bcb555bb2ad0305a2e6f97535d1b7bc2149895044d2332714a09289a698849876ef651b181bd3a42b7b20c7a4c72fb65a8b933458822c85b141234d1f591489a4a7ab9e3c0b4312257ac29eec498ced58894ed8b4e11fabfd5339dfd9e952de5e7de42234654438f3a2830ae8a3029db266f50420b654a228e1c4bbf38fe863bc6d98402760eda3f949441387086947b15b05aecd7a24c33bf2d24e57e5db58bf89c1820ba54cd73919c28fa28246ce977178f818903f31c585e8490f09c483fcb962dd9c4c7203472f7664b1e6892e3b12b7ee06cc9bb18e0b53ad2ece96bbb9eab356cb3dfcf8ac35aed3b0dad5ade14a34c80c53218ccffb769bae236dd8d1199c7ec7511a493615f3e6b4d68f9aea112b5f97e437714dc555f03b084070c744a9b8316e3f2c1d5615de61a7f219559cc7fe17d58206ed80ea9b57340be35960c2c50b25d6ac1c35f579fb2b506c91a8acf130b7db23626b4c2a3ef959e7d691d5c9eba7de5ba65bf4f0cac19165365ea57e921e6ac30fb1fa381667f2d526a38667cdc94155b1f994fdc6662b2a4f3e11b1a4a4e256e819e3afa069824df70a003e161ea426e868b7f49fff155ef02531b13d39907bc000dbc72806374a8ee4e6838baeb39f4aeab34645e838cbef0189c5f97c6f68305b59f2dc7f4e126141ee36b9eee6da581df7a7f840b92b9c171c6e11747f8f2ec31799debd884c75856865c5ef7f75cfd9eb31ec7af0df66a1857eaea47f80973c025c4e456a0845bb004e87370bd76dc530b8de7dd85c862bccd7e730aa94ee87f5c825e93faf2b1d9a4e1dda35079a6b6a763748735cfa19057d94b664c46438d3c5899520d9c6d3e17734840724376ec7809e4270fe686803ea53b143789f9f21fe6aada26aaa3e136c23167a7027a04a9daafc6e7b62a1b07d2bc08d12781e5f83f6cda491f5aa31c23dba13f6273a97b6f780955dcc43d8dc6d23279c337d3562bd250d61b168969b1ecd1f2f90add949a96345c541bcdf1ed967a3b381dcbdfbc336d8dd35f14aed206300f5eb50e65be2a77c1c38b791e6e0839452ba0805231b5df19166df0b99e2e5f8ed5857429e433864ddb549f1725e9110ab1e0737a62ab476d153bf3174d3d2505f1567d2b5b0ea20dfa332893dec5881655ebe236b199de5ab4f412f92d192b0e352a4c211b0f23c2a17a8300c947fb2404fd65db5fd68173b43c99077bfe45bed7c7736b3943017a314369fe560322ec9210c1ee710fb3f8bc597b6819a64858b49f503174eb37065ee96a684ab58dcb7ce4562c80d2c20c78ec256431fa245c30981911ffeb78d659312172e73d17f4397c0a83167f1ee526cd5d12d2d48ffde9d94803956597a386eac8d66c4389797f7f93c53f5d9f4c7c71dc2693aba15d5b95d0ad4816e4304f1c6439b59cadca720fa365ca897bd73a4e133653d93332a110ca1d68b58dc98d26561b362c11dbcec605de270e6889f95b4efa159b8b1edf8982c2661eb11c77a2d1a0380a85fe761d053c8a894028374fe60094cd18a869d87f9903b81824596ef0f920871bb9e1a60c7ee860beb741a1d36b189dadc644bd0a0f95cde7c45e51023580f81e4245cbfc28b23968da0937696ba007e8cf7e404173e6882d027af461ce72092301dc90e71123dc5c70d24299de0cf7b26d3b38a36c6adf0a165f0653bea90f8ceb27e02a43cd541ca43371cf6308bc1b9d8bcc0b2f7889aabeaf138a610a6833a8245fdffdd656418d0327f5c322a3425b6a5c2e1fe1a8189e90e3f02ebf9a77f348b03a6235eef5443e8942df8d3f63ea33afc37d2784167613abea4fb1465e8aaab51f71c51d35cd726a5d5117784c314695aebccf967bd185747154ce9557b457969f490deca1a805117365c47f75a3e4cab87bd1b00064ce7c2d975f9768a545bf77691152c4aa4bb6bfee0eddd98e790d7ba913738e99726cf2f09b8495e3531cded6d96d5119f5da971579f4dda5102c27e563d174d0f12a098139f7c469a135f4b790f350c4036fb67e6224cdcccfb2e9ff1a41f939cc68dc4c0b24070c92a7b8c42a2ab216107c94e621a2c74d3059e3409403ca2c737acbb0d29fefc69c9ff99e06a12ad9888928e4a2a353855d4e171f0b3816973812edbc6f7cceb6ec2a63628dcb2409d5fc385c40e9e01dd1ba6b10935222e416665957baa754260ded401f2c0e11b69cd174799a2c5090358413fdc14ddc0bac60219001fa97322f5b1bbad5a7e1caa8220fec2b222bcf1aefd143e52ed8b353152322891fd153c8d8b6bc8d7e45e49dc89f0df7de23110fcd8b99b28f4edd1497b5d679c769f0fa8bd3b8cb92a035d6788d1dc8ff7f72454812fa6219192a4818b7420e2361e0caf4493aa2bc1b751847d818a08e3f59b29940cbba99a4e6fce60252c70bed88724dee30da6ebd9c4795076d17fc94e8f61a62d300867ef4a76cfe433c1087e66a4a1bbb81d1ad209b579c442db285c11a1e89c66604012f0f6e7e142b5942a5b40909b38805d1b3c762327012a89444cfd78000201753625c86f108f5d180218827ccc1e6bdd402fa96e80a32bfb2b720b85ddb168384d38b36bdb31044fc9119dda0482bf2a575878d8989e3f4a1dc93b693c754cc5b27e065bdca5deb7c254f83b21fcbe680f0e817bd9a800c7c150603f59acbf7aa5c76a3c7f0053cc7889868dc4aa5d54fa216067671fefc11fa04511ab513d65f2db00605248b974250806022f163d1e3bf385a80ed5d2c60a8f2814662a1300adf85ca39dfbba1771ab2b3e534fee7e51129b90cf92fce697219cb7e20a06371a09d1f64e21f54c2537a3c5a0f3ed5398429db3d1591f8c7a66a4a2502bf4d0702a24db41e9df2deeda38fc0101d5eb3654f75c474afab54e8296b60087598967c1bb8a0db4056163b4403ce6dfb68e721f6db933e606d9effba251e7d056513117031906aa79307857c029ccd87c719b32a80afe7c8e2ecf5e2f60a729f28e230cd75a377a641bacbc2221f397c9fb62b9632806e7e33db7a5e5e3ef7d96ba2b3980dca335ff4a50cf36b51c8c90ab8208ae8359d18a71e7bb190ea7fb40594252ffc1c2b1d6b86840725eeaef5da16ec0cc337888ec628e9bf8f1f5c5b381bf2a267c11bf6c634f1be8115b8d6be52ca1618e5906942fbb6a682e4171d849af3c973d414a26ea3d87c23999bb80619bed6c4d5a2906b80fbe8a41af1127b2034ca403e109b7453c73ab467fc7e472f2f6aed293c96f3f1b32fd713b298e060781d8b564541be9c5c79d1475835006174b448490bd65fd0fb1ae60d0ae4633d5cd17a4d0d44d5492394478b9bc9c9650cf4698cf795f64fd40f035d1b72d30762f245c1c8be85f76981758001a1b160a56a812d5df257a297b7e12d084440a8f111bdfbd081a1e320a2e3f0a9f099d032304f77f58d13991b8c6b8ff822977b20c66910606412b7c5d5e8978b2d5b75f7295524db7679b4331c5827f0f81692cb710e20c7f3e20e754b34118defe53fbea9c3a0a65134387bf3cc9810a6ac7b3b3b15f1c8e88e1d068cbcba076324d732c9f6ecfdedf19214f41f85a78039f63da2447e1a9e35a0d8cbd2819cb6ac6b46ad11fe87aeb2641e9814386dde74ee5667180c26371843b569c1103c13b119397a269318f1502761a5ae0c3fc89299a914d3faae9fc95c38e1a5b7ce9083a4fa5bffb963b2770b900e90d587096a9d33981b179291c9af15036b1f9d385c6c85980cf9580c7b898534d88c16ecf5ea245ca0587959c2fc791376a38abb575a8b9b05cc155ce4572d474d35e323942ed289403210f45396309878a57b54065877f3aaa59758924373b47ee929b0830ab75c6fd1fd855e3a4321afbce4b84d15e2f71f01ec0c1610b53b7b3460988a6d9534da8c385188d57c88973db4d5eb8e2007b00f53ca35ecf0ad19cf7bdad3b2aa68cd03fe58737a6cfd2c8b370a70e9d4b433953ad1040def61a9caf1367f02698c694b840df28e078a0a4f581886121f860fbef28995036edc9e4b9cb8ea3f83811f9c8ec5a28252cb80d7e3cced9c82389e410c36002ecf25842cc523a58f7d046c2092c63006d8205537e3aeda22ecf2f4c479226cadd47aadd4985ebcc11e1129845d53fa3023800b358ce38257275ab3c8095ad61f6aefd20ce441560804247c8a7d73591cb1412b22952a29bd18485a0058b9742f6feccfb86de074f1d19f498a16b65ed6cba8210787ca0b3a9201cf8de5541bd599a62d519a33c32c0f7fbf329578322c6ecbde3b92d1be8241e2146d691d29e970832189746f968ac3bd79ce43a5c5558b3a42a743f3127a329c90389fcfc22d60777210f3ab6be73ef8cdfc5ee4b8a90f026b4d2b462446ab5dcf9aa05e37f1e24b47aecb77b63541228f78115283a615d40c8ac4a9d51dcfb567945cb12bd9ce47d1a0e05781d9d351ce863065d12f7096ba11d5133a0f119f930d5f15ed14fbc152a24f5e9b10ec10a1165e3b747c7ff5de5c21603d24676c3f9ffed4048ebd002e5f5427f5e40912f5799587348ca28512a2e4ab012dc66d7ab9221a55a8aa12c977ede77e96f7c0a01aa21c0c9c937e13d8e4466adccc35b4525ff01ac17669a98e31cecf9df6bc825b68b86a27c922104f28c0cbf1a6fd312577ba7f27aa1e1ed80621cfae46ec385706a295bde402cdcb8c0c6247b6f81b1d4cf222908218cf8fa275b4ce29dce03e956052bd1b3a4ae1061095015079d2fbb5c8cbc3be96041e4b60a5a019c8d71a2402301e86d0f5c67190bbd013ea90d94dc4e297211be06015864ba75001be8cfbe78bdc2f73a12279798fd56f9ee918e2f3e65b8cf84208160cd3c113446f2a6894c5136dc033353e9a87b38fd160392cf724a5b591ce8818824415d6bc50b40643d2f61541ecdff9e62e46085683614d9849c3aa6b02ead05f8b7c001b409d1da3ca7954f1acb8281bf3f53f62e7e2ea324247941a97063a2588578ede81f46ce3f59e7e44ce42ee6dad846c8216d000ba5c0a711828bad9fd60ed399fd703c8e9f2f1cf7380807fa462187080b71658cd17c653b152c22cc1bda870e98d68996194894d0867fc7f57a9abcd496cd36b19fe0dd1c54300a55d5451d5b67ea969735de4fd6fc3f06ad07a307ece0074b0d80bcbfafb30a8656a9965ab4c2d8f911430b11472ee5ef1b3a2c053e48db3e82f1d4139aff10d56d5a8d46de6f3e960a806d7202375a272ee99114935c15bbf286a875a28eff62b3f3bec83b765d03e5c8d01eaf1853a380226b842dd18c453ee0720c9a70b1b53a681200b232bea0d2d4db5a1ffe3c65ab15200c8d6bd963422bca72f4541397575b8d61c291b2e4ea95c3784e75c663ecbc073720efd1e8556112c3a9ab2871c408d1df32ed653cd58411034800b897666ab7dc16846defaa9026eae1811785025a33f9d3b33b6b0181335194a82b99a6bc4dfbe0fa3bc6788df9cf8e9c7d1f8098d14c5f365ce355561bb4e0820aa3cd2d786cc44688d226a715456ddbf4e483a555b1683af231b32662d7a1061ad6ef1bd4a8e9024522d9534eb88ae5863afc33461eb6f0696a74762e4b8fb742536ea0a1e01d1ebdf94165c2547d8342d67bd8ca87191f7f071ea412153557fbf0580a723b420121e101b24cedfe97b6d897b9be8de8779c482538a8f4cb047b5fcca13aff715880e1211e7119d2457d3484440eaf0830b6f845363f5e63fe4abd50b301bd0bf746eec90ea03a36ae540b6cc5c125732c9b7daa7878a72ffb84113aa157cae408c9e9928600db33d91108e465e146488c95636715048b86a9155a5dc4328a990c6cadd4d01bd30427de3b4deaf3ae5f659689b5240209b61523210d0576b4362804a554ba98c9f31b39bdc19e56e8cf1611006df99f7edc9ca8e94c54c40e235710a42bc200249d377c3b183f596c60fc03ddbdae6bb4af1480eae36c59c0d11b3d6e5a8e5ae7506ccbb7f884eb6b1e72d84f9695e96d5b481a5d9a4991ea5976db9a926527121e96ad9afd23210350286a5b32cecb68870ff1b9d56a2acf6d8a71c610234ffae297d84125b182a4809f7c6ca9b00821d46ec0a2d6a59a1a805b9aaf57b72544f40d54cfaf36ab7d55d295bef11044015d675abcb831a4046d00d29e109405c01527528f0f5bc821b0722875e8664976d7deaee2ba2b58d6b70f8320895593a5673944e3fbd7e4040b5811df184e069928ff23e309d149381e5b25440902429a8ce5ea394eec643549fc0512a8477ba48df6d564af9ada1fea8155507ce1e45d30be966853cc2b0806c5a76ec92d7e710ba1c0b9f855a59cc094699788e2a747a0971d2ed9a321fc63a22ff5dd6c29bbe21901344665628c55001f998806dab99d9efa692bdd340de9e19c814f4577ae7745bf441344d92320a4dcf8494061470d25e1e26612336677018e4e439c870022214ab11d9e71a9b1491ac1d0b376f0e30218c7e48d497af6c62cf4e7722e56030c11d26b1ca51434e4fe8003cba95407ce1c6438a6b2c99cd33bfde34b2682b3d4c2f8e60dd11e6881b8414182ec2bc9bbd06e579158f0ffcafef3610ecf0d59d4ada78161b2d5fc99548d3a236436b2e38d47f21fe34dd9d240ac85a9ec54d1c4890ced77124d27ae3555cf47cd5dfb1f0a4b83984cfe51d53a56f2a6210620ac6f9c9923950f70bc4c5738d2e4e9767a37a91714d969ad66b7bcf52c9012f15dc602ca95798c59159cba69cd29b6a4232cabeafc8c87be24dd1f02842204cc1332b8afa3f9e09e6cd160704e1ca7d1332b890a2151a94387b675564c52bf662bd6119952be8150c8c4a245ccb22e6db18a05fa121b2b577a94c71b08d7d021a5e64d54438cefc5d2ac4867c10868d68d6d0a4cb48a43084a06f19fdcde7472a84d23abe8bcdd37980eeba6b9ec6a356949159187d4b2b9d8a874312b3b9983514787b102add531e6a640e8b8fd240484b80f3d1ccc95b649b6c2750f4a6397d33c59367685e5cd2530310aa9bbec18ecab748f7545c5ed8c746b34b0102780954347e5650c6c1bfc23e66d7d9f438c32d4903e8326b927d26088b1317c2e3c1aa6db9f1673bab5fd7fbc9d45425b9e413f24b886105edbd1d23ae511b45384614a5ee7710e7b784205456d861425a6382390a0f73fe10770c4f3cf23f8206b410e9639784e632d79fe439db98e46193784ff8ba338d434ced3382bbd790a85ea122dbb1dfc9d474a566b455f2be3fd6d2f9bc6d3d6432eb437accbb4db6dd83271f07828e0857b9fdc64eb88cdf2faccb7dc00be0a17353eb1b0bb6c0d7695e6037abdfca41b88004fd3ad06f7f07ee9c8a1b602c7d306d4e9cb8f75fbbc24c9da340f406ef9b1647524a88c356a14e78072535bcabca2006086b852c903032639bc6a285982625f0b36d3440798101c8d4c531be35db8e9311c43509c378999a52c6415d666c69ca58f6ad912ccf5d91a80a9dbd3c92988222965ae047f8982a412fa9f5aab07407419dd5d0d4fe961da0b013b9fd9f08eea991e4fca2edcca85d4f43bbdf6c3fdbd478cdc2e7f9f9f177569d536f94b7f36dcae2b9a7e59164259bb533f59cc22f97604e83cc41da5c4ec16e15cc6940177352f08fb5345e4da6ac2e2f695bbe694587aed814e117d3737154e07f59bbae3080afc2ff6beac6988862d3700b57b5bce295d8d46816cda8808c4855c1da25c99a205d0a9cc344b69165b1fa50c2d32803cffb399f0b0e94806dedc32864bf1b10178c014815f553a6be84a2953e57de36fbdd9989fec704ec9c0895c4472f90b501d35e95092af866019481205e60e4cddfb82880e5448b9afe51e9d2dd4099be398fb7fda61ddae8610542c683fb0d3750e97e37c055e629b47e4d4e1f268a5700f133d81aec8acd014280bada48a6371d198b3a5920a1b5b2b88ebdb9d4e0f1b972045c21d34e1b542a1923c0a2102d3321ecafee4494e0960c4d798602ae3af5ed1c681fb8e85d4a26fb8119acf774214e61517eabc537fbec3ddf5613264e5ea3f8413ba8d24f8482b94c0109c662e50f42da86da41a2ac34e38bb7991bd6b0038180802e4f9b709feab5b9c444d09473d458e5ac30a6f9bb0cc4b00c24d32f79910ab8e9b36826b73102aa83a331f7d1c0ca8433602ebf935c217dfd29aca8f8e9ef1e3e9f5acf9bc7fa003cb1fe4548b54ace0a4b619b2c3f207c7428ab1803ca56613098d859c885a93dbb01d7a222607e27e71a15a34a7d1d1efe0655b818f044ddd4ec4c91ab49ab18d58a7970021f0c92e99c3a95705a797a99a8b536baa6f6d31d2a74c4c3db08217a00bf8026555a6f869285d79d8a7f8db9a67db608dc994a3d21e07bb7b333c2f423a5b31471a39506bc823b6310441d9f6448c9c7c8aae1bc391fff94419da3e5a6b4c5edd87df9c3fa25b8d4a7da86c44c2406099bbe6e80789c942450d325a5c147f1961ca74b7e688be7ff322616cf4706a9149c9fa114dc80d704df620c8a9b4ce483085fdf63d3154c533b645729c3783c6f4a95537a230c492068e61091298b3cc70e90431e26b516ac8ae634910e1c17f9ee734165f88f366a0552890a246f7abefbbe6438d93b8896be71db18e964ae0f49e9adfbc1e1b987f212148ee5e2ea746909d8f857a17580237b41957ddb2c0036b0db4741cebe30e42b5983f4ffb452ffa9797b00d55fd33f52b3100a274c909c30c60c0907a2ae864b145ca41031eed91fe779141baf7d871b6bf351d82c415f00c7c848f937b98eef20768782670cc962bc4f51bea2c23e3539c6377464acd12eeb6ebbc623713a3b4a22cdaf4c312dc9b3c90d4c1603d54f738e6f889b445d8001709ab1db64c24f057a4350e9de7772d559638ce3456a3852f8bd5f94d6cef422c1f2c40c6892cddff12edbd983d4475fa59bae4dc9b9b1ab9d6b6c3fed4046559700c194b81bd7ddfbb16e7ca2b620a2541c1a7e946a6b6c86036862804e4596db4e4fa6619def02764163512278680fbf40bd6f44485f771cac100d379773d58d2a4d2f21f2eafbd306f26ad52ef2a8abc0ba39fbb9b985f4d9415ce937181466a0a24070956e562bb9d00549fff52aeaa4f4c6cab434d017588775cd0737b551d7b7979ee32c12361a7512a60083907a5e6b97f061a2920a210a89b35750fcbe355fd58d7211e986633101849b9ebf53912cab3d50a61069fd3f58aa08d9f9c5ed69e3ba31563316d25d7ee6c62b7b629cd0fcac976e9bb0dcef4f69eda5992f81ecc1d90af0b5189bb99072377c2239560b8a9df3ac9f9b36f86fd2dc9e7c7b2f2ba82b671d29f11f15777b30544fadb41b1620f2787975a02f0e64d208d2bd3f9e54a00dcff19ba6fd77963227c654c7e358042a7ab72c24c1db6842ab300091f3cd7b37611b94d732b2bca6703fa096d23540b5b1a80f80cf3a2af3b8530e85e388093464a98c3e30fccd48a5fec468d683dea74504f645446f0ce029575e879d855acc68cba782af074fd4ea41169c71cc488d861d31ff20918374900346222eb083da3251ba1ae7cac6d26ca1fdb3d0ad3595f4acb0679855f6535f8d0d954e898eaed73f65b62367857daa729c5d315f223cc7502bc90fd1ef70f73df55cdc04875b5f8e387f2c1efa73f090e4320f31d8fb62833c5a052b2405ae5886314b98d6330309c621862634a6879816a73d67302b6a1a57f10c2f3e627b5f1790dc3f8b9f4025aeb03fdc30744dfdc8c979985b3a6096abd32cde191087125e03b9878f431e0be8e353a1804bbeebaa6723c9832fd53ae5ae10cecf0356a1c8d0ab70e720a280e69bbdfae01b3c7cea347ae04cafbac9e9b3cd707c8c099db3526c06803063b427eb46e4116df13d33c5e5b7df524dd1cc5bba20036f02bae5968a1d00223444030a4c06795c308c4a4e07ebde33e77b6cb6e745b30d681b967e9329debee0e531201ed67bba102646712e7e606ab87e4441a758046cea5487196e5741601cfe3abe995ee48e7f0323a400aabed1d0da27f5fa5fe013c84b437bef2de5de524a99648107790758079c16a78b2a85b0f3c8e5cf38ca2f7f06da5b083b77dbb87da305b88dcbc8a8ac0a5917f7e5df3e201db41657dbebffbe22a128d15db509dd44af71dfe2083df76a5b6de30664e7f56bedb5cd3dfe4dd4e2aa4389a8d7dfbdd6bf3312d14f645656b9fdff1117f7ab1cb0a4b24e54517295d359c1c5aa11f7b54bfdc27dad155685dcc57d0ed8c9ca70dffda4a437e6ef5125395ddf5330ff97c7215403221ceead444037f7f641b8f17762a9f735da9bce155815a2cfbd0c532028a80c51c392132f5078808b65220e15158cac0eb54aeb1b870c93710a0e51462459776b3dccca00be6bb50fde71eeaa268a289568ca2043e9044c7630aa72c3ab7a400a6a0b0bb3872311966a40410a3166ec127084c8709ac4c0e9616b72ffde264b708a6e1370cf599631683a24db15b20fa626094e042e2099b1d6daad5a6badb5731583765d7d5a6badfbd0a696035f83b6f427cec974f1fbad368b4319e816ad2fede27764cb0798810e43ab83e723c4ee2da7d4bed16f92506a69a594d25aeba6744b736da873debb8f6cee63d4086142d209a6086302154bdb96ac80e3c25695d4eee33d6729a4a0046f06b950a7547fc8fa4cb3b9c0dee5d68bb6e2eec6070469427f34a7fc6e361d757e90afd91e382be34a0a5338144ba8084848418924610ab25d6a319ef7939294d2df58bb8f783badd537a5d4d234de0c0ab95615f10cb5487e145a47657150b9f8a8ac2898fc69d3a10a0524f404184e609182e504242758151698105984329e0866a0c061db4184378345c90e3fc867cfd995dad67bceaed076f9addbe4cd2077771daba78d49c5785f46e57cb9daa8ffc97914ea518f42bda638b647a13e9c17d8478d2c3aa0bbf2c7fb9cf113cb0af6b8f77239f851a811bf833be8bfcec9f970dac8c911eb8362f7d543594a5a1232c7b536c77dfe8d02ad9cb9f74422211cc0078feda3e7a1bca172d2bcd74151169871460fbcf780fbcd1bcb567671bb973a3cfe39cf23aa763e14e83df765ab14c29c88f23c07776c5fb6bccf62d9da1985aae1799e8ee7fdac42a9f7428a73c0ef537af4b1cccfe5926c096d9abbce3fbbe7ef44cf9efd3f686d6fed2ebb73b873efbed6aecb9ca69e145df7572cf5f61e7ff77df5ca233beba0ddb443ecee9ede21768805a1fe160b945f1ed9de885fecaed3e9c65201a58f7d7f47cc93e59f12bd8ca78dd6f6cfdb7bd4c7b2b5bbf7442c96be87f6edf0f85d52dcf7eaec1bdebf5fe78bed63a980dd3d1ecb17bb0c3bdf41b737e269c3bfe5e9d04a74d93a7bceb064b1f9f1db2be2cf6287e9d74477ffc1d0eebec478d30f81288e0f8676ee511ed95dfe8ea81b4bdf2b6f042102dc1fd9734f8ae37ee7fd043b2f7fedf2571022b0d2c037f7aded818fdfc6dbe650acc59b41d7ea11989a78282929d19413b4ee50a95695c4de9d1aee96f2b2713470b809e71d1472973aa1f376da789f0a4a8de15ad55dea91ecd35a6bad8558d1a5cea1b5d69a47cd51a291e8d1aed11aad512154d786425dd34f18292d618b794c25944e3da1b98d1b794c24362567d2e1b123839214159817dcafafb5d6dcf64c2237ea0a88d8b4b6422f09b1bf94a209d5e05dc0021e67d3771e4f56a1eef36fba89498f2e94e8efc1e71e7feec6559d5f470ede1357f37356b31b577304d2fd4804cc1c8178d77bfcf9c16f9c235e79231ea70e71c5adca32a2f46ef14e4812d3d528436b0d7df1f07ff93fd1878e203527a774070999a6e1121065f99626d910c9a3d5c444294d559175a94ee5a42555268fd28406793c86643e688e011d7f4c0bea73a38e334c581d4ce872d264474d827ca1d168349a75ef8046a3d160f8da2062f48deb94db6a8e011d7fbc0478db797344db82bfd0b8cd5ad5082dcaf2a12f5e130a4aa275afa3e6ea893e74705059ee44e3acdd39a20c1502a29ee45bba7c411ae2369ad39ce65b10ee3dc80c528530a69c2b15d3e5c442640d12547a6cca7854a19a0f893e5e95cea882873a1fb0d3940db496506daacb4d95b99baacac6a9d1e5d090fa55001d0cd19a001c03cbd1cd2fde412229cbbfa85abaf9cd2938960e0d6dcc6d37af5cf0b056edd85a6bb5b539ebcf596da57a1363551fa86a65532b1b7777fbc6f278a0aa950ab55aadbb6d7776956c7a7baaa93d675962b14dc986440f499cc95e9c6c4f9b52957befbd4b565051955c41432ec10d97b3e72ccb122c66294e94ba74c512ccea50abb4ae5966594698a5304496a5166dbd211363062b495274dd73666506194cac1c69d174cf99953056b47c332b55665644d8df9eb32a5434616940228592cb4847820c461449153ac45c46e69922a6334ad018d1118aaa78b9280e3218417379db5745fa324a62e48a4384acc8e5e1af8a5e53f2a6e69a66a0bc70e49aa1612a7279de57c5a12e5d602eeffb2a1123b336c399970bcc2a83fbfef78f6c22463e22a4bc5c608c7c415489b9c05491087d45b1c2e4226284f322cb4d60ae490990f355b1e55290400a25971114938ba404407d55f41f8c2863e49a52e0f08393cbd349d1265f684c2e3752692da2d29f9545691554da747111f13756b481e332429b2081ebfaa82ce79264cb152e231e1043dbd048e4c2c0260531b88818018f704d4a00235b9926ae23faf572557105a4522a684f4cae3af2c0d92908168ea8d72cad793ffc0961387fb8ede2546a47ab5cf5f1f418d90955433c61cf900ff5f1ab52a97878787a7a7a7c7cc8300c7f7e7e58b0f0e6d461dcddddbda7c72728fcf9f1f171afeed5abbb7f2b5fcdfaf3e3eeeed5ddddab7b75afeeeeeeeeee5eddbdba7b75777777afeed5bdba577777afeed5bdba57f7ea5edd3f16fad361dc5bad5640aa162e5c00bd78f17a6f8aa238864463059ffbd00d5518a4220ad23060c4881123045285402a55a8dd9d060d1a34aead9486cf1f202090a885aa45a802c2d385d3161f510b17ef22c8d2f0c58b202272877beeeeeea5915dc7175f75afeed5ff5f14c571ac00dce1a001e80763c6a0313cc6ada0023003bb71108c1ad467850123460c13741d65c890419224eb63b166cca001127d90bf0d90c823d23a8cc78821838824594d44feac1b435313a9767cee2e43860c70877b24a88106f60542f0489205ee98f139050dc07aaf5e4a396c67ad7a33543342151d67801af82e8f78343e1d46d7a861e3d361b407000058f059e0b5565b1ed1416b7c356cd898b5d6fadd7bef68810ab444d7b1fc2cb0a0d50a400004f0b93b6500166f660e7fafa7503771b890677f8229b29543984f341fde5459f47ba2f0d74b6cc0e7a0748608c1ba298bfe8092f43bf0b40e4a27b5a3fa3014150f17180c96278b3a9329e44dee4293afd0e42838acc98f9a7a1e1084e6c3000e9aa8177ede6b308339f3260e03e283a99bacdc8180f766479f362e3562594c1e3e9f0f48843f04ba3836ae088802a9a031ac49112c870687866cfe0949f029d96afd7879ebfce416b4d431720702721890e7e2d36174e9b04d5f7c1fc5e10e03896aeac54e8a851a6db1c65edb1eea032a17a4d8710383f765091e304ca0dc69fbb73d136cefadf758079dc55830fbc2011833177c8863a685daaeb5ed3997466b6f81661b102bc10f3398d1326506850d67542d8011807d6dad6a5b6badfdbcf4b0b7b75b0b5af63685fdba98f12245972b33b60d2a427f1097372c8badb5d642e00a9b1fc8a0a04413319765b32d0d4cb605b7b5d65a1e2ab6657078c2d21d2c1026b3ade58264db143e0a13ac5b4f5b1888bb1ca7a5cc931f2d4c2b2d67aa84492cb4b489f93cfdac80e449cf9657b80294253c1a2835f9ac80258a2a4bad6705189cec24f18c8192d2f2a4224267470450b42a5401565973b6c2d3955814a31e578e909e662724151183cdb68c800ac7719c15d9374978928d9a8c683a0a941e28247179d223cbd1079cf4b0525466498f2ab42094f44821294d093db6182561420f2cb4190b5158e9b102d3cc032454e9a1a5287c41abc228ed527f8c1b748bb6ae93302a5d62c0f4cf9e332a60643ce99e3d6754ccb06054d4e87f2209a8c3708a538f2935fbafa9b899f23df941a414a51e5298286b4609fa1b018906f79cc59eecf2ff63574cc83ad4aab047512c07bde365c60934169344e33232aed0dc120d11f477264691d64acc2881b652b068d076cf59ec0d0d2ab11390446164333054d4b0e2031812642976d0b7948ef5edb5e38a7a083cfa57a4b4eead1ce9d7bab2550b92962d974b7ed15a90c8bea5f6eface307dfdefeaa7c071bceecb2b563fe1ded9ca356fd4e52b2cb9615cb1a45cf2abc2c6b183da8bf71c97fb9e0af2217d8afa8fbaa66289a7ab922dbbe46cbf1533ceaa840dba8af0dda69fb07e5f83a6b503a526ecf1e7c28da75fc1e47d125de5bbc567d774cb75b3b3e25e78341344d8ee20ff4898b34321ab52719ada98b15b4bb01dccb297b3bd60d1b59a35aa62a55d9b441ff0160740794a4a2149a8cae5f6270532af49e6002aecb7e1551dbc50aba3ed2a6235cd7e746d7b1ac62362d67354252b3983a2255a34b0be26a9a5fface1914a4edbbd47b622d82d1f769e6fe0eb97b08e5fe7e1db978701f73f17e13571b16b9747fc5cde954d11757746cdda0acfa198abea3f883067b80e01e95687f6a995021216be7914db4da7e22816117fefc9c08c32e0e7f16930cb9b8bbda461fdccf0d44bb70b9fd2a836e6fa305501b8b738a46b4bf6f969d214b0b33a8acb2cd3daed3fb184a5c6d5a4727f53535a6bec8ac20155d525965794f521cde7bdeac792c3fe86077bf4d173dd8368f8ea56ff781c49f925ee78d1d45a1b4fe3a16015344f54f3425b7c75f71fd0d2afd6a77c6983e904a47226030ad78abb58ea8ed270af5aa71857fe7552b20faf10864e755757b4fa5bf52fa459efa984c4ab45e478b7efd22740c2264d2666d7374e5fddc65def26800bab3d7a2c4609bfbec5b6d0aea8d1ae0711b29121f4850afc1efc421746fafc5557efdd3851257795cfda88ffa0df4d3478df48ba86812c87d8e48912829345ddcf66da8df60e77f679c95f58d1ba08ae8df54e26ad33c4f44f528a1e9caafebeac77dd42fc03ecfeba0358f3c63113dae7ed457fd4a35aeb6a7f4f5d3d7aa5f6d23eaf5afc447893b44c00051bd1e8910019380e94252040c109ed73e5f84877bfde1ab463faa2cee9fe7555ffa9112e1e845af373ea31efd6f8c3b5f448f2efbd28d94e019551c87f281a24828c93d4adc3eab258a46a2421388990a6b36f7f3a94c61082ecf8ccaecb27ed9dc6fff65af29c198ae3421e18c36f72ba751927beead134fec922e39b14b8a4604b235bba46b36d7c42e699bcd716d7e3a5192e3e85115a2322aa301ac292481356ad4a041b3b4942307498ae2cf8f8e4ecebb3651b2be57b10826b7a8b188116ac4930bcc7d9e31b210f5f55fe7f5a833fea847b2b2eadb2094bcf2c54214bc2ad3022bd22b94b4f6099daf104ab5a314d54a631b17c58a2e6952514c6f493c288eaac63e07f382fcf6194071786f3ffb0a98187c6fed27828077fe3eca1431d91215eab9625fe9cbb67eb4ad97d93607fc666390b66d6d4b8bbc310a25adee9cf407d3c6486563280ed302fb58a462a60dfb3489929ead688f8d3ea6d1db584e37442440c59a2362bf0405169c5ca8c713d079fb7a5ec0bd5d0179d44864b5414fd24b8f458cd027925ea8df19573bf8f572a5c6490980f5d7d4eb4f8d9f7ad4a7c62761db79c5b6938a6d8b448f4d1bd60a5dd2188d6d238dd531a6472221bc5e2e8d1a894840e9ebebe5d2634fd2ebf5727914ec803783c017a818b9ea1f71856f74fd20eb33463086852663a490418c511263f6449ec9e10972891c9a72600aeb9a5aaf67d4bd2426c98e729abb2426c9ae6e1a773767eec720d22fbe24263bbf2426c9eeba777edd2f8949aeb31f750ca85be0bac6fdf246d0b3f6c67dfe1af7c6102b070d1af7ea7b6fd4a8d1ba31c4dafe9406ae5af537b4bb6edbb75ddfdbdc1bf723508c8d7b8da449920b8a111463cb01b7a018338ef03c4a291d29c514079d94529fb5d66ae9acb5d64a29a553b4d6d25a6bad94529aad78d85acedacd5a6b6dadd6564c71688a81b51587b556bfd65a7b496b2dbec1db2e75ce568a73cf58abae14d56590a8d2c7b456d4fb9cf306aa06fd26a5d6526b29ad1445524aa9a6d4da9be7eb18dce1b8c3718763afbd1b9c6b3738ee70e824b79fdbfb06b67de72ab7d56b647b1b277beddde05cbbc1b1d7ed7577270be78b3783ca5a349d668a2f77b76ddb360e5f8e26f99005ee84dcc959f4e79eef50388efa255d12b2d0a95dbad3c59f76af7b3e750caee52cb89f1d03ee7a1b77fa28491fc438dbcf74733a42a716751aa24eee64371da12c74faeea7efbb7dcffc29fbbee918383939dd29a84a958b76d80ce99625f56b991b1a74dcd480044de726072414103ee47ce3061876fe9c6f78da59cc6c671c9eec8c030876fe560e5e86f4dc81e382366739ae862336670396cdd9a0c4e666376ca9810a8ebc51f30cf7c3be4928ec7b3f6c61df59d2153430792fc4c84c21d3b219b57e20cdae3448997de0f5b29d3d53c133d46070c0aa66681234c311a784b540481c60010509e90ad212dbb2b132c8b6d5019b5073c0a187292430d44ba749939cbfaf634cc0129a5031acf03169ca89e18b134f098cc106269d2a6452f4cd4ac830981743104b7009455d0c4d4eb825b21c83131dd8f2f8c304d92c8627273f9c182529e18712a6274b7e3429aa5204f362c20f136a33193eb0e4078c89862f84474d1586155186d8fa67519678c2e950ab42a638af598d8928706a90d2c40629566238d1a83d67525c8891468a0d240b5278505531d3ba33cfb7879a73ce7b875c107cd3af7f64eba074ee0952588ba3dbddb62be309adb3e70c863755681f353386d03c3ccc4881fe6ea061a4c13036c070820a309040bed1e0130d3ae584084767bc1cf900e648461e25bda0b4cb6f591454c7b9f33e300744695027b5a38259dae313feb05801b570e1e2c58b6305412f60c49041b266d0a86103002ffcf9eb59a4d37c727ad51cf6e44a5e3accab05ad00086000376edc20000ea19616d779a13e2f7f1d06bd5287404f7a2890e8e6b80e41206d732caaea8fe2708da4718a32a13f4a5677b7d65a6badb5d65a6bb3b515d7ca430577ef56ebc5b5561e2ab4bfb5d6da5ab3b5d65a8bc9b7d65e5aa9b5d65a7b456badb5d65a6b3d6bedb7b364684fafcb5e9775a8ebfa4368fffb41d0aef5a2eabdf782f7de7befe675f7d68c3bee5e226cadde7be79c2048543f08c869bdb7de5a6bad76c35d9e5d9e9823efbd97db26b74d8a290e71daa8b372b7dedfeebd3af587ca9c73cea04aaf7fd0aedb7b76ab7bb31f04590fdf6badddbe8fdb3008125dfbd9fba6cd41699dd40eea9b14476a47c5d393da51599e7b6f8f4f55f1f4f46c9e9d3d3fb5afcfadd5faf60189eefb7cb527fc6ab5f75a8b83c577efd517e8de163e55bc66399cbb0704614363f2e14ad5d6cefb7418c0c109b0b64934101f600eaa2a1929c551ca41699d8fc90829d0493d06a6902b391425264a2328cd5a5532528aa394da5165150f16cab55aad2664b2e867803a95f089762578c6d9743472a7692384c27b7cd8b051a9787eec1552850c096148085a488e1a9bb0874d0f143d60abd5f3c3a27ab9f3bacc429c17bc601ab88ac87fd808a9d56a405688650394f2daaa039ebbbb7b0577d8bb836ece49575d5544f6c694bd70baaefcd448b5f6de6de3a6e83ababbb5eeeeeeeebe7118679c73477d568cf3e79e73eebacef3be1a443be89c9808ccc9b19bee54965277cff33ecfc999f6fb9ca26a543b83b46a72dbe501411d46a374ddf56da523ce41a1505a6b9d21a21c3b7cdf0853a9d40e49546307dd2110dd2a1e90082889ae63a9bdd65a6badb5d65a6badb5d65a6bad7574f7fc5d1e8968c085abd6eed5bdbabb57f7eaaea3a3934aa5767676542a1511518f4f1895554e1e4a1d746010310407b90811471fde7f4e854dfa449f6a94299bc640a21ac3a2c1112f81c928c42177538de85315aa5b6a14c7a0569916d047a2f5cba68fc2941acb5386e90b3124697dfea49422a184e6508ae4068922d66ceab02f94525a4413344529a54eec1d4a2b0e4478e0043e74608511580e6cfaaaaeebba9f212165776fbbaeeb2a120f605ea0bd5cf9f1e440a2bce9edc3ed081cf6f6b38aed618448a20ad9cb8531fe376208a618bbac6184525396a61a0864455071c66e7f99d43cc984465f950f46cc0050c43d7387b8730aa625fbbebd976969df2150d8778811ec4b44d2bedf3af364df1fd27106cdbecf030d07f645d3b46f1a12f64dd3b46f115e5eba0a5da6cb2484d3ae2f5ebabc340dc6defd68632c44d3bb80440a2e4079c900b36d70e802b6865440a4400041800922ceb68fdbdcb80104961940f0b06d8e7d69afd76bcacd21892b650389364bc6daa06d6bb0586d34e55463ade5b66ff9d93f6ccb83990e98e101cbb64ff200c5b6df1a62b2edeb506261dbe721dbf67d70a01467db0fd203d3b6df8107b69df960c5b61fc20f4c2f2db0a23073b634c3b63320901cddb9b570a40993315a509064042c2cd828a4783c4ba66bdb33d8be3b3051e605ca832e75ebc60e4580a006aa103ec6586bad7fcc9a272d2c86e2e9c598374d80546113b226949a6072118e8953b452d3444d143557d46c69f1b22725b050856e62405816bbf23302a3950ce94aa8e689858ca9c86789a61f198d4acf12b05076022a3c163bb1e4041a27d4f8844e4e5025e1d44326cbbdf75e36489435c59459fac1060d0f48c491648e8a52aa906644eb423ba2acb9552119d9131dda0e19214cd03fa0e89222a326ca1346984ccd494e125d34193831d06210348180a6759862429b241d567852c44b87189ca461d241c624044cf88726b8a933a20967c491114959ebd044d1e606ebf006ca9dd8e2354a3fd630717a87244eac2a8c628a1f51584159739758ef1025ca089c76e80213c10e47454d453bc8a614a114bef036806025a9e0c3942f58b4dd7336850c8c351aef399b3233010833539a76a99f86294db08af4ef399b52c5192a55c2300446e0cffc16e4a19c4b3ff3d72f73e89f96b2c0df11756c624bac6298432bea5c50ce337bea7c39d3f89773884e447d8ef8bd8b3954ec6ce888e564431ff42270a744d47ba2fe1cd17b1d31e7679b0d72306d80ef2dd9d068a858ce1e76a9cb09c410bbd47ba6d99a875c3b3aa2426a9ee7c9947833a8cc479b7b8ffb12dc9c36f7a56a03c1dd9a6cee37cf0a4a72db6b73af83b2d8a5dd774baa4275ac5b52cd3f9f6e4dd306f7155ca14b2e4efe42716cb5fbdc7369e615b93493c5855c9c79c1b46eaa0836c7856073f768ab2579e8ddc7cf81fd5c57f46f5265713f5dd8c73d72e12d147719b11125b91f63dac77293825ff7a80ae1e7c27ba4b967818db82ed8c7d78fce09bd7db9955b93d1e67eab71b5cd4dee5dd034978f9ce2ce6883ef91b5770a4121d0f2a042add6745971ba3c178f0e9a73ce39e755b5bf01f9f4ed58040c10f2e9577b7f0392fc4b7e9109ae7ed8afbf01f9f48afef68fb8aab8ca9ff30884becd39e7d7599c5b67189651127c2ae2a2ca0261c4788d9594d0df971c6c73471c8c039f2ba238ba073f3f75af0d76b00d96dd1a8a83e7c1cf4e1487eac1cf6d288e9d073fd7288ed4839fc1cf4854686baa2c30a8829e9f3497d96036aa4239ccb1581592f1e0734719e87111e61e7c0c23638ce573628ee12d542897a12cf08fd0a08131967329682c679959a682b1cc91e3c68d5d724fe44ff0c7aae7ef1f71ad7a80d4bf2311303d4f64044289904fff882bc7385865818fc7b1c45a1c4b1dfe58862fc6f2398e5659e0932ec6926c31963fae46163fe1586a9fb1958f36f89e7f3c222e8395f01266c26828093ef9d365c5551e2fe043c6a7385815c2f8e9712dc44e1ad3b00c912345fcaa2cf0afc81d7134b0e48eb8a3a31cd59554361a734c2cf118d3250e017e55a1eda8b2c0bf9ffa9e3127bf6e4ca1679b0cb41da58e8e36f8d3458ad3c523e63594045f2566274a82bf23e636b94649f075c43c0525c1e76855686be26038d35e18a68b3608eb621b7cd8069f3baa421989b2c0cf6a9ad0fc52584667311b3cda60ce98c71fd4254397d1dc13f75431e69e9e36f89efd5a059817cc0d3e90fcd2d9bfecdeeb44164c3ae7c11e3963d206df836ec494fcde52f27b1dd43352ceb10450d71d73acb2c0ef9cd0b3ccb1a6a6a6a60d7eab0a3960b2c007a3d8e0e7b8a0e94ec494ec5e8b9692dda3c41c31487e308319043b2316748506fc493e08165901195b3f8b606e95df77fe551ea7cbe6d873a2714adbe8a82c1087f7f33d2cd6dfc0f74c4524603cbfe713ecc6361c5416f818fc2c967a83ba07fd3d8ce679b40dbe3375e07b97fc20cd20cd20cd60fef2c17798831a0cc1f73e1104c1ff3eaf29e1cda0922bbaad2ae4faf7a2269f2d5ed0dd779e534ed90f77d1a78f7a1df451e07ba223117d54163864dbdfe8304a823f4170aa9ad0df7bcfbd40eeb5c1df68756eb40dfe26ab186fb20dbe0b9a2e72a3ca025d1ca1ed57071feb2ab43df8215985eea3c632c49b2be262568d7eeb256cfa7acd765a43700cfc0625c329f404260620e00d42d8c107f3821bf49dd20c5c844d472edbdb0ea60dbf42039feca8c48c9a6962e9d08c00004010002316002020100a87c442911c87f24c14dd0314800d65823e665c401f88435192c34008628c21c4004280310418620c62caaa0ce82a27d81a1ac6c4d01061b5d9edcef91f453135597b57896b298b5c3fed1607cb8201197f8f5f0b436057a8d99f0bf9df4b0982c9d8a91fb0b66e869a4f43fa1ddd75ec69db3caf7c264881990dc6a65fcde8b6eb2fd58728b77d373a70d78b6ab8db30c1258e45eaa8e9bf1378e20dd0f39bce6dc57d9ee720f1fd0bf4ec72b18683abeb89f8ecbbde6857bfd033626cd43430c9911a89c73558d1ade1cc59ecade19f68984a28de704b00c86e1033c924462667a000997ad9e6656fff6e3aa9e4c3221c21951df47598f989bfb3a747f91fdfadc6fb8a6910d74f90fdc7cb2040a317413834047e19b9d105e45e54c75b7a7c8de76a4a3cb8b2b970206acbcca66c79930d6e481c8615bfce2dec4810865abf6c19f6a0c1c2a98c2f23c3bacbca2dcf7f44cf630c6ec94b5026011c8f8f599dfcac8e5c73b2d5dd7c505ab97fb19c9ee6409494fa22491750fde0fd9467f535c948f53a394e0a3fb5a51439a474a43ffe0da2f0fb6225beeae4d2bf425289b3d7d24d1411cd89049d38e1905cb5c1f58c5a7282a2aebb4b01a7f3cfcf1e91334257e1c78ba5ef2af4f6591ce6e3da3c315dd24bef1d6226f74ba6169fd7c5f7107c2e78bd0bcdf326af270dc269fa5692034440a399b139884ea4386b2e6f1818c921af102f9a4d4776d6e1dacb78121feb114e2da06156ece0b1294d364a6f9a945644790f06d10b189394897602912627164d109876a7d104b94a02d963b04c98adfe403829338635d40289c7bf7ec49b1885578e65310819420c4340b0223899f025f244a068b79d492266c9fcff60100068c9cf3b66322c9a0e59f6c641e7810e1f95b821c769ddc56ee1acf5984945cb94453feeafde9aceda418d5068c6ddd8431a9b2431330886538fb0b5f29e2cfb904739c92981f50ba5a8a09900e1cbf7ce45b53a3412d2199c79f3d73279ce7bf8c76555c28536b3115e28e1cf42d426884fdfa5657aa83f4506f8f2c20a335085c96c98e8c841e481cdc5f8e789bce4f5fed95e47bb40a8f0d98c2bb2805ee504f04ea7f02d6119965c5fda975c2f4f89a25a6b61b4201ea3aaa0a9a9f0ebb8dcf3e12b9c10b0b18ed82b3cbd7e99bd98d85ffcc22551f2a8ddb51e579d1c2839cee2b99994c7ff68af798c5550d55ebe53f2fd9c7cd7fafe95ef8b372883c2fd75f738a45ae9d2835979ec2e8472f86e2e9dc91b3027eb487aaf74b275c9bb45fd7fb93b914fc20c0163e2556e6820d3e87f737c6b4167f9950cd460687eaeefb159345275223f0d26ebc0348d4feccdb3c955e74251d4956a1198835f2549e842e1725db120c2984255cb18ae10a0ab8cacc0ecdedfc96e82e6954497942952d6861f9b4d9927fbbd06b62bae756af2d71b39b2891f5676abde8076e883d075b9e6df8bcb3856d6e558bfae510b77bbe76aba13ebbe1c8ea3c63af59f36c84d316917d238164dedec159226a108c8ba947c9c62a0c03014eb9c8d509ffa5bc05e41607c6c1dd535b1a1aefd55f6db9f96d7a3b4266d2eb39f69bc491c6705170635417c76f54703283816e6819c50faf07ce909da0355d728e3cee04d1a8a8918516c52d4e508ab22291c139e499378066fa2098da96ecea3b20d632bee696da3f856c7114bc00c7c795d6c50aea4a5f77c8e8668e51dd5269c2ef02b1c48dd6419f6cbbce964b8875173e27282c87f2e351353154d91a39bf7f803d6d3d51d912d98309669d2010b52e5839308a2069b02be7d3627223b48889c6cb50d6cfe56f7bba647e6faeee75aa747dae0c3b80d82a1b20897a22569a1aee7de6dec850fe285470d4650fd7ed5bff265cf56e3e0b7aa584af25fbca77bc576d8f8e320a50a595325a07b4a7cc9fe66bbf2e1dfc3683c6a8f769f2645cf49f1961276f04f5a9bc0cb9380747d1075107a28e7a5b6d071242cab1cb1e0ea9e3f70a6e4bbeba8fce40b75d97b52356f987ab24fa187d438aa92fc23803271ffe4d658dd7f9d4b4fdc4ccb8e39ef21b13ac9f116ea22bf08059a1029821fbea8ce91694f634fe3e20670d28b1805ac5bad5c52de942e18e92dd1950384b594cf9ee9db5fda8399a017dc3204bd8ca37c8f9393edebcd9fd887d35a00d06b25c7481116d85c65c45232f6495ad569fb53fd2efa112bea7534b0cb2d399b4caee03b8d601c6618d213f97632f991829a2d23a0e988a01184ada7b7d6a20ab748f24b75b7acc32c90d74eae950073858dab1ae2a47d95f83d02dd2e42ba19c89c073e8394857ff25a567ae5be5d255ebee0367125100a3d1895a5c4794c0679555eaf33c0f7fc85480836be9d8a913631f4c1fcd008e5d0d9df2ebc2d77959d0417b9eb31165b5bea1430194084028e88c6f2955dc9b9bf641c3a6a718d1c0ae442a5378d747440564a055d57a5e6b40dbd02471728212291f7bcaf2a6ccce8b9c4c47b03330427cdf29f9263bdc8cf8021c8cce00b28bdbf0af40bd2d25e6b0476e5eb662ee0ef846570cfd469589934a62d5cb8eb8ead95dd475c37147410608873b81452f58247c2bf07c80f241789faf967072df51961e9fc4b31927fa71ce272e5c8be516e761f8754f05d74b9bc8074ff31ac4eaf56e8985bdbd9640b994fef6feba9e81defd161185527321d3ea19f3cf19275ea7135a42da5955200b2a990c4d2e6625f8cb513ba220f1d67fd3fe90b28eda00bdba9fa161133374b3d69d9663794b9d60e423bb4f92222e3c011f1367d71055c4f9e49f007cd48ef0c6b59517c8d34f9cc2895bae29adca51953b4d75035c7e7b437a5619d2e369b310823f197b2411afae924ac4111d40eeab670594b05482e41417a181c89128e3595a6d09c0db69a6f9d5693a3fa789ae4c1265e64768fb4ba30d5f41b7e896c5857a57722bb24c2dc61bd42f36f78b5d972703c07644f72c2b0486cdbf9042177938bd4194fc2564851ce6342ad4d864df71fcc4d3c6755480c9a1ae1eff08b461d3404ab9a28d109975dd48eb47b23a73dc73228d20e0d6981777c23b0be501a1084d4f5cca8b54773e8c85fd612003940f499e88862c0e7e0b4bcf235a960fc5e925701b59e568474ba462a9ba301524dfe5bfea76bf83959878a77611885cb2265578cefea64cc9a2456ff9436bb136ffc38633df479f5325a5bd0587342436c0a3ac35da5f019d2f536810e36076dc04219cfb3ba8fd1fb3987d7c4782e7440bdb1b8eff106a67e52948bba04147c8cf4191cee1aec8d2df88cefc3ff8cbf5b353e4566453b35be6d199fbe7d073f90b35a7833bebb682133595a7c04631904f560f184f8b8240c30dd5a0e449e2db9cb5127c5a7ac0f1a70f57da79237af81cd81088e977d097e61138949481a1137b4de92edf28df8bb787c9102ce7befce19e382e5b761ad2d03d3b71b0887c05029fc4f7497ee6aef1cfb1ec7172feb4fa09eff82041ef92c32ec5de519defc68c2736e9c3edeee16bd2f794eebb42bf65dea99b110037f29017aafdcd7d91d036569bf32e00d8b7da8925ad6fe4eb49316fed23372c42983cae806b82a4f7cc58597a8f01fa84db9aefd1e48f975b892764ad8b1c3a7a9fcc9a27aece21e5883c40bbe52821d8c02b40981d6b65fefd7922ab78966632ebbfa852d3d724b27093a6b47824b0a6b0d88d2fadff1f5901abc0959139faf3fe39d1873be45e5fcb7ed134990172dedcad8e998158b2bbb5327e5a404d95953e1f51ecac2561767e18e45e2d0aae56a8c471d7aa7140f8086112591d9cce551e38f0ebd2fcee6ca0cf604986e4d1e98527302a132d103a27077a31d525c88986c67cf4a82ebf0bec430cc8f1ffe8f92a88c69672cc364ea2b5ae017ba9d74188f0c75acf22dea894fc5a1cdbcfd916491f296fa19c755201e98a3a190cc5ea987afaf44006da82152eac9ca23e503729f814944a78a604891d0a8d0729dcfafb6d58e98603c8bc8eed584fe24c37ad1b7c09658f982fb7cc585f4f8e7e637b3be7c20dc89702920252588efbbbb8bc3537f892a44958ce2719a15f1a5ee67e5b42068d8efbc16bebe6dc98000aeeb5cc297310fb464df60bbd49aa5265cc59c4134a009487c1c97aa94f53c318170df2f91110acbc96d6a289bf75376ea0ec600c3e52c5cab8c0743e878335034ec53ea79c790e617ed5ca5c6066885f1ec090f3255dee96b256f02e8f7d36fb9c1a476cdbfc23e3d68d2a31ab99fd207e6c60e5a74b6cadfcee3072e9a551c4118f3e28faf0be5bdebae8015ca5a829732ad95e599a9348ed881a992c356381a5b5f0df5aab843e029e0f24ef7e5b5861a0291b8d5a124feabd0d0c8591c19ccf10578d813cd4809e55b18f625f879221052f514ea5629ae02e7e80ff21f9e0f680cfd0aff1d1b821be69b73d9a34fc08cf43260813c0ff7a646541136e4394c5c584ee40feb07ec8f1def6592c9b624f73e47dd7542ead4b43b22b47c40ec1b8243ce508114229a823c2d9a8c8679a0c7133a05be73b83765153decb64c12d25895ede4ff315904d593edac9a0bfe41d5d958ca9c999c775e619e2af9d6acb34d2c7f521e11ebef4dcae296c28e304d14410664e6cc9ae8edd0bc5eb6d2c68114745428a0c29a69a5f0546b2d3d2caff559c304e074f7e5c6727ec59edd35216adbd139e32bb199d5837ed303550a2b5cb739ba2f977aeb92a304c20481c9b834e5a2bfc25bb7d9e547f640821ba1a82c5526abb8014898b0b5d051d9cb5f28a445e19b3a2dd950c01204f1c7669ae2131694420c44ed42cbfae04978fa5c57548acc773861715ab9c7f047d72420fa8adde633d1156d5497a5329dd6da7c2b340897cc030917c67c974e145fe28b04d0fa082f6270fcd7443a1dc948c9c297f66b40da218fa736c8e30d469189d5fc6675bfc5f9b5aeb027c3dfbe5df94c11f74226ba670c628ede39fc2e76321503e2a61a02915b098f6ed2584d053360e58a7a6a9c24cf8b7704ed642d943cbc97d07a992a1f5ecaebc20401e7a0203729716ba6b31ce7ebe75c618f998644fd9a890b581586d596240c7626a19eaf11c116e401875c37f5c7d880b10f92237f941e269710c77c07a5acc91de1e4728c5c4d89f07a235634e62f219f18efb3616102006a12c9f03cfadba5514d5a52ee8ef3e3bbde7c2c413a2146ce87e934659d4504f71b763f423ae176e6af2a606a6170f834f82346d632448cda60f28f874541cce70ef4136548a07498c113394e64a250902b398edb23d3a2aa588830149328f483ac398405be16f72fa02b0c214c2d2564c4f7338899174d7277ab2e2e81cb2aabb7624ba23bcdccb7adf73836718044eb753229d835c634dd9e04f1ed9c1623006d9359f2159fcffe3e4f5acbfe2e0f4a815a080ad0735a752a6b2d7b378c6ebbb439450d7d475eaba29ee3a90314475edc8248f814f88aa0701cfda12108a323942e5ffc5446ab97457776a384d1e7073b85d9e8717a91b9ddc1298f4221817d378a7f2f0ab05d3dfafdcacf15462448839c82a2020495d44204bc49a8fbff7f19000d8393c670b92f5e28f051a6fd336f00651d094e25b23325c330a803c32d013db104b79129954d725bc94b807d5cac913c61b84696ce5574615d9d5f6b5ee87ef037c3ae921a7477cfffb77e9e76986055f79479bf16e1c572bc58ae94842233149a8845a279ba6c67a8e6fd357c1cc47baa6257fbf55bea7c025873bdc1ab3374a3ec4df449837d3e841ce9a90055f78f5c05e9f5217e1437c09c05135d35e3da575ea1c2ff3f90c11cd0816a01ef9790c159b19dad415457589181ae8b42bc4c9235981e0d61ef29e3ddd9747826c5f97aecb0063e132857176e11030b302c1d3ffde49776f3082c3d30f3ebb62ffa322861e5a88b238c78d965621ce69d1dbfb1a5462893067f99452f2cebb646401be4550fca1e268fac4efdc31b1f9876d55bb6f6dbfdeefa8428cd0bf3a71e3ec12ca2d341395aff4e314650fe31dae67184ed130bf2417a7a1cd577cd71b3c796e75a0fd6ce479565d2f24cc1ce97aa276b2b9381644c5bbba4168c7f81147e60d5f0874ad8409424d7db856373147d036c6b2eba5c3a042d146cfacb30ec4663701fd2a437f2f8d155f3b8cac7947f0b226d3e25891cc7a5f2f7815e9ee68245c23ab9ad76683f27532dfef21efeb63b4288e29d8365011a4335e2385aebb80d558e598400ab5be7e43cd49d1be351aff492523477b50c6fcfedc8092456d50e2aa89245a932feef1c48415f849ec4259165bcb2e7e2b3ad2782b9998ad1a8f4eb0e1f2a959a2634d643e5ab4b0bf48136b810d205173c7799a3ce7b4319821926feb0c756d78f8486ffc99c46ee5756e4fdbbf15c894814c98a1d5346e95875166b22bfc010c74936f74dee4a177b3fe1402f60540d13c36700a8b44f7fab7e4106601b1f9e70a03c7b262ad83a9f9516a01e7c7f9b4ea9b7871970f8c35e35f08387770dc88e32bd6ec2ba924b91af8830fd36a33d0837be85db1113766167f79bbe241969656f848299f88218757d2509141648a25db98bab04bfe79e5543ffaa492f823fdf4adff6369b37bb93f6a607d73e534dea327536dbd957edbf298da5d7d9afedd156f54f96fe52eea7e407536053cf7129c1e982b8eab2538206b3e0ee40f81582cd970efd5644fad9cf72a46be60c6f537f10a6f688ff4a152227c333d81bda8244522ed828692b3362e1e1489da72b95e14c402478922307856c981ce5cca51772a8712f661d441d5126f9d7cc9b5d821395c7cccc1774633c06a7874c1227bbe284b8a0695582c685817749f7219364335e07068e9264512fb0ea7156be482e076aab1ff85b059a16a99732343d0c3f01b56b381724dbde96093f716025f098329b9dd7449f02d00a1cbaf7582f49e89a2c6347477834cc210947bc3bf93adf364c0e52b95a1c2fad7d8d46345a87b2d83e0b0c2ac7e6817bf6befb6f4552c4356f3ce9bab94e91c835c372da1abdb896fd86e1587567f86506b25ff1cc8137402724630d1a6e6795f0b0b5fd4c94b9a31a81a40913a5d5251b0a82f77c0dbf6f4375eed7e34d7499c9d65fc75fcdd5f839678c6918b015882cb57c4c74d030fd5e06c60661c23b3cb3e30aaee8bb3c66948f776a705da9db7dc6c89728a0716a7058c7ae127dee1c63d95b75324ab28f68ade867531222cbfbbbc7426fa6b245e29c0ce08c05cac466e8d6067f216604e72bc4d0319c93c69282a8325ee3973d5a56ff521dc0a62e33379ed36108e069c38247f2b42b3a1edae6fc9bb45f2648a3557e4280ff6b9209ab9c60821233e81312b5f372fe9de589d205a773c8043d33c16f8ef38462ed9c434624c213aacda13eaf674c20d75d712b4e992fbb2b3188ec9776a319147de8dae1b8140c1f7dad7d16869105dad409a0dd0ca53244bcccb90a397302fd208d6fc4decf8a9c147a7fa33800f5de467238164ea008916557b9a8f8a19c00bddf4aea3cb139f5f0743a83641b764917b8fa07d047d83609ebcbcc9ccdd4f3a4677b7e7acc37467afab81def59a09b8960694d199d0b62debb85613acab89ee5859b41e6f6eb891fce67b290289c0b33419841a70978da9e711a023a9da6941d5122660c84844ebb2b087c8eef95eb0e0ce5a8a1b9494f16e57d05c1e3a0fe13730f9c9fd6e026d1e4e5b68870ad0f832f5b8d42a691bc36db8f459f36c84bcbade7d19d89fecda504c6e64ca2ab9c710456130918899ea439ffdfd4728e2593fc80354cac56a517c6d0010ac764dd6818380ced161d6a89fee0ed9afe545dd749b6006ca89220c69f8f39daf7bde019eac750a129e1612de1c5b8b6da9e438898d667645789e12cfffb0dc5a1759c98fc5b02b387f833aa559310f062db5adc550a04de4ad05e7ebe46c7544d822dafdfb8782273c8a95c0a707babe9438f76fe5ab46335979328f0bf3cae9b4757b7f3ae364efcfd06a83122f0e81bd71a0cc22ed62e9614124125af12cefaef02cd343550b8860c38fb8ad0cd2d5f7029c1180c00007cec855a43d54abddb4ca207660846fcbf12cc9834c97b2318e2706fbb8e75c9efd4a124f2608bce7b5172e7dee2b8dd24d9cf1717a505051eb659b7ac3b0ec6990e77e3411ec89a86d7c106b21373d4f5ec6aa034e24f29f9b40a1575932636256fe1c2007a5a95db515d54f2351db807713e3ab3e81f29a723348b6e0a1cbd158d36a676f3c5da9f85ba3094f7bd70dbc2f824f4640bf6f4b210923f64c061ff99447daa9fab2d10cc8eac73d8cb2a398670bda1eee8234f747aa1650d2657da29ff8ddbb3ab44ca2bf9097bcfa1138391a68482f49b86cf19f345f81916a819ca3b504ecf853840ae4d56599edd4cfe61095c9bd03b69c75921c6f4009d04da38357c226212467928af5885c8aae60b3ee956e7f96046165fcc7196b2667d276980c4f8c51c143685fac6243829f00e7c90e63a59fd993261a1ded0b202e58c4c076be600272a364d229c1c9139b3426271fa5d889eb6522142d589a0420323c1e53559b27e161d9fe67d28ca80855b3debc04c6c906072584ff6c051f6c4e997c74838fb9d157e725d55ef61ab258aac8a18d1042a5cce74833b4e1151d3ecb39d9aa6db8a0dea13bda5854d8196b41c2b61cb0ab2c1d673d280615e84e2311557d97e542a09b359beabbfc494d45b810e82761c3c049487cfc648b7a9bc27c42e68fe89f2e23f3e28e4958e3083356b54fc04d1e5d70fbf034e0db313192aa688bf60defaa81a0889793e68daad33179b924af7ede6fb6f97d6a51b018e3af64dd9aff4879816b728e800f3acd2f2ef99feb4fa6f9860be97b95e9b9efed7ca5d0d3594ff73ae50f64bff6036a92be0c1097e08c24d1525bb1f1047e60946366840bc0c559c0c47716a2c79dfd095fbb35f54a57d0f2822777bc5a6e6783981ce89a55999814a31b83a05ef1f54f99910a78fdb2202088a369fecf5209531f46acb16648c03232b24b9e0245266e3d9d08268a59c394f58acc75b5a47fb5088b5f8b3d5a9602b4d6040a999a29864a860a4cdf84b6c3d26499c6ed6e2f71a74d1a7370a1057a65d25fa7bd34120cce69e954d4f7ed3b510d6c3f6e99fd4d24509bc9ab57929b742609acf035507574b0f619a431dba47ab9b9a61cb8b09f79c694c392ea1bc3271042e2c835aaf211dc2798c58ebbe15fc4b66be58859b631949c78cb0c22b42aba140d28a50dc5c55a8fa56705028dc1c044576a9546c45ecae16666dd4a4c8d28937d66d89d54a5fe386d07c18e924ddf712dd59f4563434b14bc406def999c7e9358ffdba647b9420f4e3191ca553327665ee7f68b0f6525774899f1fc840a49f5de96a5775990a1f9c7caca4e6c55e4af053c36b95a597f5c6a262c44ba364a551f21dc6d275ec05cf7a7b95d24ee44a02627283ed6e3e28202bb5c70d86bc83a7d8f32e2d15be65d53926eb1ac2031b0ff2c860f0ed23dce8ef2dbdcc3d588fade57de8514b067c257800fd300fd1e51f3ad58691b4d0bcbb549600970cdddda5acbbecdcc277e8f01bdf693869a4234b9a6cd216812172d705c8b69a73dc97c31ba0635f8d0811ba7b118b9aa855dc0584a02d2e5941ec1b749750255b3a9bd418ac5117c0c2f4e3b52f4092dc915ecf99af53d2aaddb94ba2d41b3bacf405d47bf7886fd3b5b0c5cc0582700453fb0a906e214cd35247840a12f344939f78e7ca5adc366d90088c01223f66be5110460cbe00f1e84a9128436c299f045500ecfee680d69fe14b27cd3418b273001b43cb65b4daac709bd4b4aea000e3ca8aaf95e8f60fae327734d716aa8d80930aec558bcc424bd2030cbfbd3707de433ba43c6122c014d63e052c08d0118f14980b576591afbc204ba19b80dc5d047fa7f7a3ff92e8df5da75460d85d2282bc0840f9b9f78f043fffcd317206558920c8f5295d520d88779f75436c0171eab692af86fa0ddc7744fe435522cca42fbfd081fea78fd7f6b984222219da97851bcec481d7845ce2f55f1c33bf6ed7517d949e698221c74a21d3728b3748a1f7ef0a3bb1cc917e656b37b2f55bf3061983a21d25889e4ec34a8784f6af12ae3d909eec0d58f730c2ce008d5d5f72eb9427eebd4423c0c8b61a725bc0f9a121b5b3a73c551f71bc72fa0cc90d2a21713052277e2eba3b5c253a8eda809aa671964a7426afdcad8e76005b37d918ab051f27dd13faf625cc0686923c385d7fc1408aec4fb0edd4a9db18c3d1b1023c818597fe145a0be2fc2d1e77be16de7bdd51e1ec88d2b0d859f3a9a1b85d51cbeb90c3961dfdba70952ba444ffaec9c233604976c382678fdadae4a0bae5b971fd85f5c6c6f38a1d56db282ebe3ef698c7e44b47212b48159a00c102e4165aca1e4ba0f781068753f56835cf8eeb97c578a92d0c020c2df5d9d29c532814b7e66c02d5d5ed9201c07843c4d8df519ccebcf0fa05b091b7b60a1884bebc103bae7a71251632517c153f982862cd855b904f70108efc6951b7cac2855c2bdf3a0658552a3f4336f473ca5bd12088fa3becbc8f05c1189d01012faafe0471c262f1af7382ed398134c41ea6a16958a786677efeddc8b77240862b30d07af6ade53dad1adb8d01fac102ae29db97e1d6357926311ee8a712f5b7f23d4353790a988357e13dcc119c5d9eae3d6696cf81ae24748401fa270dc3d6c5280c4403eec3d35125e8a8d3154f84a04d6751e00788a62af714ce12244a61ae16e8779fb231a014c71005fb58df9fb37cd0a916f49fae00ba77641461967b2b493babbf9a9d544d66dea97c3015f2cf04cc93c8dc239557d8503a3824878c788da8f7196781894b402fd8e2d89d30dee8a13eea62bc8bc843193e519dd70627b56a10a09372ca7a609d589c31e755900b0e11033a624200deacd23d58d5a261dcd289b5fec7714cc15907b986fffc9f48ffdc041b6707fe507a3b91d9cd15d74176e6963e2caaf777e0555c0f22c0747b275eadcc03560548278bb0d6ffdf9ed91624299f8f070246267dfc85eb161c05f6cbd9445c2fe0e17e2bf3425050ef35ba3cc0d74a55fe8d73b52feac3fe2106c18b0a8bbf02b207170cc541b61b829e8b958897ec7caab7dc79a17a886b5c2d0b27f69c29f458c6c64e24fc87ed1eeddee1b0ad699ae2fb6f79c664fbd7fa7bc9fe62077c1b5a20289650fb9fb9427790cb786720234980d00a435a097d1b7709e40f0e33b6180f2c56fd3eee3c7ab131772f57afc39e9d735edef9b9ee0d1ab9519fff1e7f6b24f685f8ed0ac01f199585590588babfcf077a6dd39c7b37ed85da08c9a4d42ec6112877cd25e793a398b763075bd44cd6aeb8a6d040612a5c7197da9221a1fad69d837c84b8d08fffecd18799f13383375fad267803dccdc461f53c2f255b9bfa28227f182224abdb06c128548006d3ccb0442d88ee898f13fa88fff7edbced3f26c8ccd568afdb6e481c9af5b21e4e11f79abe4da39c4ccb8961891f5492e5fbf0fb81f8df23f9fb3709714e4fe55b218cd035e6cd0371a5344e4ceba07f3404e20f6a0dfcfd232202345a7bc185cda2331b4e6f38f18db2b1ee94514234d9a4a412911a383a3149400793b7d64e4d511ceec5899d5b7d483185f47ffab1f1ccc61f70165c0f68e842e60eef4014fcb0bcaf6870bb9258804b4a2179b8f372818e90ea2cc5dd208031583ae89fe3e012c818ccc361b26e7a6a67643d47d7a06788f04383c665a7d71e424d22f206a7ddbe0e06169dd0e9c900ac2edb6fd67da36ace681ad3dedaa02b6f7306816e22891715ef946ca29b12a6a2f6a43b1684697740a0ca56261073dc15941cf8cefcd7760ed44d676eb9f6590d52a7a6ee80814fc43593a492d39cc9e6e80e9f85fba34751ab426703d33dc85ec262c751ca69326e6d4104192fd9280a1982f32af1bc0f43201a773374788be3f39d12ec031e11b7008733521a20f15f38e87b0be1ce2394f568bac2b3aef576a8b641267ac81f41506af7bdadb5a75ff18dd1c801b84128f733284e4ab2b7db5601eeb191b98ce5a23107cd0c7a01500f194df7c2627fc52a2b73fc2d955d66e14e6560e88447587054b8ba6dcea50fd3ecfd184388f7c6a960569cd2a4da0be53568e41a72a6e7645e1e6c435ff92804e925857e9f06622170510743db2afde1a329dd0953f27f5344afcde33181b6f010adc49c8710961b92dfa7cd2f55f2b0781808638e209c4c5cf5aaf94166fb1824bdb3c956444aa32379b79743b438972941aa811a527378863190c31bad24304fa9e4059e8afc284b980587683a8f14628b0711709aba9cc5af570870e22e45d3e84beddbcfc382d864324d9eb0409558bd437ca2219ade60228ba6b4b4ad13bc4de71568e492f8ee78f4b8ed1e2228bfb20e17920d8924446efa5e1a4f5c343ea31e9c0db8870fad37e4a1dc86f1618aac9a91a103d4f17bf8baf70a1ee61672b3faca04535b49093a155e38361cf78521dac54b70575ea75915667da5acf9e7ed2a453b015125aad9a8679137e696c4c947beaef0e6e84fab616ef04d8b0549e835aac8ebd9c76dd01dcf1024f2fe320a171f318be32efbda1c7582048bff3ec7196799b5b76d8f97df001e7cf9ab8bd33bd45bcfb73e6ec840bff3abb3979e4d2012ee291e3bca107030f2ad2043f0601ab1ff1be9c7654bca225b14730f6792d315542c73aead0c78bbe4433758363a00dbb3418007195bc1707b0bbb00861909a70cf1d5f3e51ae57bd428e793b071c1bb1240a7e3999ca9e9f57eec805de1c6d99dccf0a345e8c1e26780f32be0f849a3390619a89222be8219617044219a5e20f6c99c2024ace24db1f5b1c10a597fe6583de0d2657ad9024e0c14a2757f0ccda2329a077313a60aa4707da658e6abaed10fe94b078c625cac3c0e75b1be553179c424866f6e8a86e924f6c365abb22f4bd80d0b52d774ad757c231fe5e461f46312f310a37534873ba75162f6febf89aeb0ee1304bcd2f63284d9ed04417df1f9b5785b39b317c565096a7318abb0da0e264e77f2a28b41093569cea1a7b6001e557a9f540a3f26b094a110d0b94687924fd1dda3ab59a3c0138beb014a2ce2a39e3a88d69d98ac567cf394e31205bbfd3a7b406a928adcc6a604f19a30c1b06dc464d514f68029c2c7296a10ad178e9caa7e3202f2b58e3488a643e67b505017df4d11b81647b126653963c701e645cc112bf9015789b4ad71e6eb450e30a957ca0bc1cc935682503a6d51c79a933fc8c11ba37a1ee0941236093081394ad414e3bac384846cb7a72cf9b92e4e102b6fcaa288de03ca052c1aba40282f219f41b43b95d643d2cf0c2c5cfdb704b3208408f3fa3b50332e06d16ef4444bda02edb258ccf0cb8577824c6537389b8c4d0db14aec3299b84ba2165ff4bc4a6b98efe2ea6a38bc84b31f6b3194816b6bf93fa543a2711504cfc41b1c165641e77a718f310967289107bc231444d3c921540aee9b7ac8e3e9aca9b72ec18c266812a69834141bb9c70b4c99d911961e7ad05e7f28085839026f4f780f808fa168b9e236638584209aaecdb0eda555debbf4253825fb0bc3cc63502dc854cbf4341b9fcde7f2faf67070ea4b4b017ff10a8f45052e50d416b58a5303fc6c74556936682952093f31f119ae24bc07e7ddf3a6c2d591a85d96a0fee331cf5ab0ee6e9a30abbd45814d9790cca5fda88f586fa09568205a7ce078d04c46356dc96865a1a15c3cc279794593521988d615582e0c3940a9dc9f37927f0fcdd1aaae0960d36df722dfcfb02ee7ae0485231ae9af86801ce4a7e35f3d3c6b668218668eea9419d2581f1e52a3bab9aa42680e4b8ce2f06a98d7cd92b42ab46410e58d2443064c60e81200b38016aac53148acfc9ba6a9272c8fec5d3e852d0af0eacd018582a007be737edf271901d1ae642f903e319af0ac8eaab754e55de24a56b338ef2fea6a20af7e808ada3c78eff9ab3193f11a4a138078c66531b0053b691b7c939357bf3bd7373e9bb316934e6f00d13a0e488ff57a4a3f68da70e302ac956ab45028908d716a3b98bde9e9444f4a13241afdc42a457cfaf7e4f00be92e45b5864d6785102881d525fcef67c7d7348eb8a0da8e415f6f22cfa9e398cff8780d12af751a08ea5ffb8dfe8e747f2d6b883347f8fc3c7a29b2d9b66a59f3d3a8cb3649456bc206d5e301c822b7be430de4ae6a7ff214d937cef4718477e252fe6bab45aac5d1872ba20a0aa53f171158852e3e1959f2ad3bc7ba5b63cb3622a8f996dc66b5b71cac32dff3c363e1c8ec309d586e5e6e8144894325ea63836d56882ba1553a1c13e153ada13b49d0adc49accecaa10370d5bb43357c8bfb8045d6c4d105b339f76746d297d07ad8f177dad9f23596a6ec75b74f6fd692bc95a29fb3139bb200c550b553a8e371f7cd1b06b33f5e308729eee3f417dd08d3129c9bfab52d32af84e57d117aac2d839422a813d7f68471cd87d322d69c729aeab06aa3f56512d8e11d093bb84ac765670b94740e85e656168a3a6717d3aa9d2d818bcab86abc2f3869f0c563b12b048054d8369f16a08ead9d75ca920c769cc6a7315bbb4094ec817622497ff1865c86224f04f6646f899a13e8da9717133ee6c6bf830c3ab4fa90f328f55d8faf5f445620a9ec07261c74b05d34e11b4ba631f5cc14d5b1d5def056d978ac35a7500be44962c22d25fb878d333f6c13c3c9c5c811c220b83fe976fb2deaa8d980535cbdb565aadcc907ace4f6121fd6075cacbe7ced5bcac5c7cdf1b6f1230ad67771ff749bb994dd91c1f19eec37d33355ecf6ca51b49ca0baa9906de2c4f2dab6704f74d9e1965f9aac5ac4659a5792b1cf6ca60e818e8d23de1a43e95e88c41a995c90ecc0ec22a676548ca6ee6230a153217bda9dabc71c1ccdf6aa967b62d7a8753cb0dc78c835b3df663ce7d700be6d90b55f4037eee03ea2a1a910f2e511c1da3342727af92d5fd7ad83b86fb6d5119d2eb6c9358ac765528273b18d831c370f8c3e626966a13679469b41d4ae427b930049649565a17186a368ea679e37c0fd74c5f55eac3641ca1f2a0c125c37cdd22f12dd3639b7674cca3d0edcef440ee648690a69e96c9018d3c41f19ee6e6ef68dd1fa71c7fa7fd6a99cd04e8e66172e282bcf9245f4a6a8c0d5840b26c57bb6e243b95e9395c79be7bbb75c47571bb83f8fec0de3e0b37c33db2188838ab67a4d388893d58b061aba9f0721ec167f248cb02873e77d59752682733eb3436343aff1a76ae51487accb15b2c6220a157b3538bf8048c8b1834e9ed50a6415ef771dfeca20241815efb838331e59f63fbd2efc3dcf618755b0e8b6d4d0d6441c5dbfd969bc3adf3e1b8bfbf5fd4e212fefb093474ae278e7e9e46eee3231394815e0e962ddc696417a9503d8399310c459f1b1eda2485717544a50418b3174954d5b3c0c30284bd8ec86055be15949821fa22fdf7bf1db0f24ab324ff74b4c9e92b623f8f7ccf1759a534ed63a88a8595530909456e571d3bd3d7c6505b28203ed41b341a5ac67fc4fd82c184ad88bf903cc33adc8d0339008c1f2b8121d908195d2569e4a81f601a0d123f1b215905a717c9d23cb568716b0b7761acb2603fc95d4eb45543e14b4c295836cb48ec97b15f2411d5e1e285dd057e3636def3bc225ad757c23362aeceae3f7e819172297f8073457bf8c4996e52790c0ae5e361b6d563b74efb22c153de1cf75cc075856c86c40ce71bdc9a3211d19654fb457f06c64bd34d5e0cf30ce0b224a22328d74505ef2590199fa8e894d3b285f81384428932b30a644411ee61626db9ca111369c172c6fb3cfd09372b6c884a8e8cdf6c3c8b6c80800a9c42cfd4600bc0817079b61f72312d5cb32ab465a5dd8df1e6f13e8455eea31992ea86041188507e92cc6e7ac90383a25c88741d19fee86760804340439e724b4736e90879cc26e3117b1b96bc78a91e9ee562a0c48012c6f38f0950f8f2797ae61acd7cadbfbda4dd651b4fcf2ba87fab9b751353ad772027847e67d033c4aaaccc05daf4f8a736776bd890c8e123ef3905d055d072426127a717829ea04fd0b62204f25e12d48c57b13a8e7463309c83cc3c6d620413e95dae059ce24692a98291891b102fe314f1352e0fd91499aa48f2e8b444edcdaf736277db2d09f80c98adae794d534de325101097ba05d739bd7cd2899583b67977487a7a6f3e0f13e25682760dfba50295dd0fc82ad3095a76292056a66a8c6cfc802019a73819e0407164aa60b27603e3653a45c93407c691a982c9da0d40902a3d0f683523fa6cffe235e56b3f2f92d4c7f77860437d64e30a09f490a5d7c70f39db4b23c8c5a7f37ad5935b9913e2e755e8dc18477a03ffdb931bea03535e136922b1e514bb0bc97bcc948a79c063e274a61cdd7cf4dc9bc1431de207f08d7cf75c938148886c47e9e988c100232ada72d6928c3530ffd85eb6eb0aeadf4a9d7be23039a88d5eb8aa6707c88b0f5a9067ce15cc62905875cf42859b1ba74c2ddb36dad5c8622c229ddd1e4174f239031037e9a7a4e0a3947d359292c092387804039cad6321936c9a8cdc17d993634817d95c1a5e4bea3bb728e60da7da5ad46f1f1f5986542c84eb55328971250cbd649408bfe9896314693c84d021bc7da0666b257ca0b1cfa811478e5948dfd1703746c30cf117f848b40f01682bbf7f3fc7b5c5c16919a57aeea9e124a45418e148ed721ba7c582ca6d14d560a9c7c71ef32f8e4f9c9b7bc9fb99d9174c45bb238a879c75bbc79fc76704ceba7258af664177211ebfd66e11c8dfd2953b87e01181a17658ed3576d572ae5b42b7df366755637108d4b431dafba62aacddb46efa2bf82d4c48559c9347305823cd5b8324c56c923b13bca18b6e1ba1ad6347ae221035b9a83a5f27b9bc1ba2c65b8aca4d36d644d22381c4baaa8d0c462439652df63e96449b96923e70c15e43254aa89baa549e784beaab4e9061671b648d24efe7b3b5ea49d21ef40eb5e5059612b820e0b89730db20ac5825057eefb25b86cd2792eb3275ccce960f8b10b0bec0020dcc93610bcba5a0acb5e135c67f3978570fdd739a0fa6343b5a43a14d26e4ebbae0ad93553dc7a6695cade9f034fa3b15ebc838b587f78217897327d8124da372bad0143fc0f063d3a02f4548343df13c5240ad4f0e0a6ccf2875f2b7a18a4c90c333aade36b3596af339b287e90f6ec749941718019b0b6dc4ae7ac0b968741d6783ecafec30b8a87e042a6ea9f53630606a1a3c4d6a9bee5aaf1d4a979f41f68c40efb236b0fcb172ba10fde5289ddff7ed50b763c35e5075ecf6449414a15bd606d616024ddbab3454f940a64b958acd85684b40cda3b6c5245b38422d7a3a54a08083271120e65fcacf4b782415c2d21ff034011a120db5783589acc177dc67694864bed5713e4516db58264657a600d2bea9fecce391912439e7b2fc3c3161094e8639b46214edfac6aa178b49550007611456b0a17bee73c1b55cdb1ef155fb7b5d9ed605964c543d286719ca4438f2071480450bc0c1cd44bad920313ecd3f70f6f8d78f2a1c5b7bf2c4b23bffcc05828a5489ea0a4b66e8190eec9120e7381d824cefdf9792495bf7fe1a6ebeef23c6af070b56b5e54cde44b7e507115a8e4f8d1d4197fd2ab7b8795bf701831f1bf0df21b3beddd2f470765a529a23aa8c4a755cb3d898d39031065f6e2bdc9c60894f12d1b79e4f13d23e79502775abfd15d54a42c59c48306ef79fec4ba76b191f4f43733fca00514d6267367a057c42e5578bffff741ffcd0c79201cbc0ce3045baa9f4241fd14809d5f32bc178bc709b6c7949394efce4b93448408059bd4204ed5cd48608d7287e692e5e8488765302fa504ccd65269f541c01086142f4a715b6a1f2fb1bbac3366d91a6900b3750e681f015256201e1173a2e6dce48bb83c114cef2bfff8c564b3836dbb0b59148274c24a041edbbfc4ce336e9eb51391ab30afa1e62d47dc11db58aca8e872fa126d13eba3729681e5cbc4b10e5faf32a7e84b8362d155a7a16f27af5750e5d223e4a004870409f02d4255973875c533f4a78b0795e813334319a7a3a4f36880a86d46f99b76b1814803f3279343814d8f980e5513038ea0f0461d9ad718afa5dfe8554e34711a00621ea67414797fc1898a3979297a8bf04e502e119fcc73353deacb4c6e910ef8ae2826767fdac30b9f4fb26fe93cc1512a0c1c0f055335f1d1026ab425e80edbe137c42759755ccde3a703fa7f8fcffe0eb0f9219bb9d2d571f9219b23711231eb48d6421e3e6cd57e0b1fb99473c415df767618026d58a73cf1f90054c681c31988ba9d4a013e1a1cf8eb9015a32c62d117db16f3e3c7424b52d8f75bd54b99d9ffe024772c10125658e814bd67e8db2075b7f663cbeca7b8b96573eec67ecc241c2c5c7f3c1e837c2685b5e733cb21201712ed0d9be67702c5f56371444fb792f10d8df6cf3b28b55b950f98123055f97c039883102a48760b25efe6c70c94ec7a020b252fe3ef5e5ceed9877973f1d7d17ae1e301dcd44822c72128ebcf149f57163901081c0e5a47a23556d88ebf51fec757f38b87fe6f68cc34bd29bb36fdc77c19e01feb061c8437bba8ff1c1c9cb8fe77d6b0bf9dd933064f2804c4635e6c7f36afa1aad138523e0e8c15d5bdeabcd68ece9fe4c06a4c98df6918dfd657e030838eca2e080443832b0703d44e454e09d0acf0d0df27e43e3f9df0a003f05d7b49102d63849de00803d2527b285d1f4f9f87d2000647663846af838b513824ab2576ec9d8e7100f1745eb3ed4fb4796142245105818d008429ce040c2376fada931a490f225c7297c58f0076a00f88a2f8c422eab67fa75cbfc4ca40be363d91df1f92d49b7bef20114aab86d3fb4c91852e833d73e64c489e44fd2bbe810f1d534e20bd7cf9fb276d0a896f5f3ae506a84d5f2831ed0c9de277079d310440f9cc564430e97a541df9188fe49b9abd8a203561e77022b6dd1ff96ed6aa883aee6f3ee00e132fdbc8c4c4ed23b5e7a1f052a803b2f052106d87bcd8940e7e687cbef6e19a72005b30762d84e37c17fe121a8846dd9325ee8df5e60bd5f30c0d3225306ff6227f06d84218debe3ee16fee70f24a9d0097a4913ac309f619832ded87858522f90ae60a84e01f592455ca38ae13ffcedcf3f14b3868fed29e7c405264d143e6704477c6824aeb2cee72d7cb8a22f56c9922b4552777833fe331cd917635534929f51768dd055ba8ab053eaff83c8265dcae994cf52b99478b471e97ebafad6f13ee52f677925e28c1742cd36baf0e61d85658e080cf5c26b86363a5002a4d535da0407a29ac5b5f8b4d730632f76e0c8bdaaa4873602bf275606813f53a82552aa44eac4bfd1a17d4639dfd3b8189643f464803781640a224b54bb3f0cecc8acca6c7196be52cd47bba012201af5a42e40d19e6f014617aa3f6306d8673ffcf12ecfc3146676103c33d41775b420e199f9a5ccd9e69f56532ad56d2f09da9dea36f59206d65e1277618b9f978836342374875ff278439766893276c298271612655093bf8df19fa8f5bea42e94337b39792813be84f84f6d91a7c22f52a86eb9605871f3d1a975ea41f42895826568bc51c4233e059792c3e9daabd2439c0e343543bef3afec0dada24458e63e369c6e42d14784b4d3d0f1a801d9c1f4d8d9d0f1ef112d1e96f5a188f9be74c55f00b8cc31466bbc07405d72e5f0907bf6f05a29c7c60e0f497f7ab2342f9d14dd82bfd0a7ac63767b27d7cada2f29aa7c7afd3e4a0745bc14863c4e973e39679bb1d016d8fabe7fcc47665810663c078ba646cd126b2824b5f2448f194d765f22bf6116073980a984ee51966eca29ddebdeb045b9d09198af0f4b427180960e4429870cbff7054e9ac0118d663e7d352393243698f55b613d8e00965438fafb4e9f2756e80caf90243a48d2b064ad4d9c443c77e05024cf84a68bbbf69ef0241d7f04fa566cb719ec6c99005a9ee89032eaa23d93f105b0c1f4ef96d83d85998efe6918bec970e158f387015843fcbe7d9fea1e748ed5ca08c06868f6649363d86100074b6865f508af811c94247fd87462fca1b5c35763e21410c705c4b1e07cb081d632943e7c1e3d4f2edc22d698e85ac112592740e03c469a7fa8875be4d92dfdd008549ff60408f9866ec4c6e9128ba031c18285686c5ef6fe31f3ae5dba8b746b7d0ad7b2f7c629fa0312155759620ef37f4bc6c349c6b46087f91fa31a4fe51583f1138c7908a344b937d0c900f058aac9b2dcc12c4e90c093b5630f462fd1a8ba4cd5251a9d91f5982a24bb3f9e8b42a6f1d01401625535d7afd9938fd84ad2701a86c81ad463c49b869012f2c9655a7a22d8a786a2c1748dd295fc289ca0ab2fc0f80e16956048c51de8d5e1720a6b4c2ed0a824b55c7f1bdae0cf278d490f0abdb350c848b88992a9e456793c853bec5d0b3623d693f65e9d12d0af4fc2519e90b5e978d3c9ef0a28649c16f6609169ddcc044bc877e50e9102a04c0570080bc99533890e0c2fee72fc7bd9f1d2ab90d079dec7fb12b43a4a0579c7cd26be8cc968659dec653c3132d026391bd139d9f9efb71baeda2200c77539cacafd6dbc9d3ff142a6940b87212ed03900e936498010f77580b62b52e6e22a2b74dbdf09535fc7e1b2c33d454b61f7fbbe9254b46b58924427e0e36464f0985de1b153adb9ecaf06b007a8dc6c5ab86e7d76c266a428b10ca65faaa1127bfbbb8566f29a697fc3178a3a9938d202ae7480f78dc79fd8eea2d261a56c17d609baf4fd5195443db72a9902abd4f488354b660eb722ceee9cd58ad881485ede5314cf48955a82d44392d8b511dcd5d7a6726b4bcae7825808c704e8a880c892f607543711c43a360c747b486899a22a731940e582c34c6746e476873e5d6ff2463a1ad7a4d266b7bc4a63843701e25d4ba789ec91073fc655f2e08ecbb91f32aeb746a37e1eefa5347ec160912223fcedeee3175728a220d08b2c314cf54569da8cf3f39032f5eb6b275c849b066f0e0ca120c41da2907fdaef2ef627e0d12834cd2756422aff55bd4bb116f5f0dca276489db87550b1e38ed98bdafecd72869bfab0eaf7d114eef5e337bd7c10b9f2c69d6d764bc7906e421edb6ed9c9ff06f58e34bc004901784489a71e00ec1d90b72819d3b55f47922a8ccd7d4c9d4f7f36fa2a196cae1998c99a9d123743b57110d0e3fb0c744bf894287a627230b00a5cce0c0db8add0b690d1862101b07e219f1e4ea5eaf4ce0cc89f65f88f078c974926819cd36804291b8cf62b69056c365ddf717f0864b46f3c7ed7e614af9f295c9fc7fe0eb3e2101412cd38fd9ebf95a7750c7ad60683a26f876e69e33a03ee7887e4e2e6e54dd5d048244aba73607e410c7ec899cd2b7b50d51f75672e90c143c63f575e644b1d6913df6930e21529778b35ec01743d95c099c76f14ed0ee6ba80b127a25697f5fc885cf6f260d299884730fdbe5e7f4b51c270b9699b5dc5f4f8eedbc5fc85d33cd343d455c3daf0300a6dced162ca522b157b3d90c82354a9778ba9445d89ded62704278e52beef9f95e7ddd25aba3afc7e47f3ee878de91ee837acab605771f4f5b72c1afa40b76bb8635310d56a2bb07a99820bf686a34e5c8ccc230c8b4a9b91e46a096dd85e16ecc40e97e19f0959846e621a4b72e5dd38104012da037c10d8c2993a94960c2d60b3bc8d8a09de0ea1e7d2b40b26c2f1446e7bfe41aaaa1878e1da14fee86d9fe51b35c719e1de5215d78868229575f5fa3b849c6fea86a2a04f9acfe106ef670e0459d044fb510424b82d3fa3ed586a052cba5356949103e945cb4da21c0ccb16b6542c2c382ef5a2935a1e9fda1451ad5907f10486f4060afca2aa4aa0aff201a49b403454d7cb4d29802884986baa3ab96280878763b51e197ca4c659d704327dd8a966c10e969ce02af81411f5968e58490de59e730ef83dab89a3a123fec9cfc8af360e27a961345dbcba8f78e322cee41079ea15628b1c382e9f765e17aade169694353d0956d87b0387bf9494f6c3881d58ca9b9558f0bbb18082d4539b747675368823213d496807fcce060c3efaa8b5b5f6abd204ff9edff6c6a1c0584908cf483165a98865e785fd0a96556c27d708bda67b057929d6d4d6913e9d64e90838b92a86addd526a9fc0135d4c162f216c22c0779bf7b0e0086e014258185b8c2ca2ddbc29af6c7bb2f3f39fc5e77680c6e0604467256477245307b8367ea480bec0c23b86a35c937717f30d3dee87a46283e75f5f3f78c74071ea2764f53f66b893f123412be41b12f8efcbfab0f48dbbbdfbba5f899d0a27ba656ab3d4f16532372806f5197b9ee60dc89b69711f88997c8c745e08fc4d9eccef93a7cc31576ea9cd0670e2e017ac84a8b2aff23b3b240e54e27046cd469a25cd2128838e8bb54a218ab7a09e0aa409576d8de1d68c30228151b86ae33a215674cd059defcde2abd498c71fb1a9a2a1319776391cbe97163fa15232e47d7c6508756b25eb81563c12b17a3477eed186bba073571c1e766e54bc79ec58a23b7a7f8d611ff75b081659b59a4486ff4518f571a8123c6545d17b200b75618a7948a703b46f375837b33f3c810b53758ccb5a76b2859709bc23da25cac032c4153fe1f3e1643018b41e733f285adfd6c392ae62d444f98100b6d22b8c3240d21ace2d1f71870eaad62cc139208548d7739920055a703de7bb49818faac984b8874c9dad3e61bd2414f95ea476e43a4f2236a65511b430345e4eefca155816af2bc16229f41cef905677a5e786d64a790bd1b2ed61698b4f92a040fcd5a896a2de9349739d5b6ad2595e028ab0ea570b21ca1c754ce95a6dab084b4a70bf18f2c1953d698770708b1c42def9becdcca4c06f3357205460bfcd901a1a0979c4dab3bebed5bdf4bfb2b7dbc968adfa08879f3cbfc96a285521c4d8fc553eb31dd84afdf382b4f5a86dcb40db0adf644affa4387b996601d657647be5d384801ef5d841da65c3fc065cec94b333d5ad8a03b89db3ec1c4c21232bfa899cc079ff59df4fd78d7216386b88e462fa40c8ba7b4a30e61f0f0fc8cc4b73cca3fa4eda9a84de6444ec58e6e338ec1747fb15ec40afe8643d325e3fd6073017f0855ab0d994ff728fe242112aff087133da467a437f29c96d0f5a9c7d5f3e158a7c9384d10f4900f015dfb1096500586da61f10183b49188971c27e24aa620a564c2128c828653981fc5e9f034e52d9cfe6c6e222d50c0cde28d2206d19f723a42f88524e7b98b9832c45bc4194ee070df3d9081639f5b91a6811e9cd52025d2d259720de8c4529f311111d911e2c0a6bf4d5294e2841b819e5d11b043d4b0844f5d6d4708901197b5804f4756917588b02d97a18616f43e1f88658cfd8a863a01ec49bc3c8c833290876039da4b4f7d48d68bfa6140a6e4c22f6503d5b15a03bde980d07cf2cf6a4c6cff391abbd24d494e7201feac8c3c4668fcf9565a18622682be0884ad162589b06f95c288ed290569cc527e5425e31d2a5bec58b53cd7ef507840a4162e3be4184a3f496f75049f55a3491cf8b1a1ca017699fa910125cf93eeba2bddde17604152f9d368bd8cc334130f94bbc70f88b8ef9178332b48f8a4c38f60c21778c08efaafc4850e0b819e68b84106e6b1fb2c99cecf181dad6aadc3db7ee7a84efe5d0c9d42dfcd1696a2b7d0eab3ebb258768ed961395576d5e84c958ca2112623875b7d998185b5844901b6a1609297410753f91e9a94361cb1617ed19b9f8e272710a1ed0981102a04540872ce7765c9db290be76af87d0efb2b0aa928e85a54be50626b6181b9ba7526a7d45e4ae8aa828d91dd917ad32c319e5a0850abff1c4c8f2d690a0fa46d98c299e91131279ad55fefd96a6031b728589c8df4c3e097568eddf76c40a6cad256d3447942e4b0218958d2363b3c38ce5b6020df4ccfa1ce2fae3892b343aa84251d1ac480f4d218dc481b3d23c49036408269c428eb5c399b8696bc079662b0c143bc562840b41829860738d3ecaa3092aa46b772cbebcf497101da277be91c042174423a6a7538368083044c27453a7469c5b2ca7c35001de8b6ad60d2abc0b3015a1a2aea46b71af2f0509e61201830f9aad4919e75c0e9aebefbf58ebb7605e942c6b210cf9129b434b999f4074a66249975cab3c23e9dfb30db820d7e629bd8d14adfb0c32bb144d2d2fa066ba613c699c469b90ace8e6d38040815ea69e575b1bc4de766023fe3b2b842a1a7f77532539d992f880725cf03767168c21ce1f4698e0cf5888c255a297731c9756795c5cdea96f97e6f28a741e310dd0e841eeef5debeabc71081ae5cc119b4484b5ac841bf61cb3da27b553f1db4968ef64379c46149ae56159243910f9c30b14c9cd1e7196a4d5bf18950333e8c7622a82d9293bb4e615aed431b40d7cb30132fcc8b4fbc68b361599fdadd228fd701ca3f44a8538487150b9a543190867d0c3b91bceedfb0156f4b020500a02125aa8a7766662a41a32fcdd3bb21a58d94fb69470f37f7e43585b0bb5450c0c9da0b88e40df21e3a12e1b11f17e223ef98829854290c5eb9fe265f860c3ec79ebf78a6921dd743daebbaf151922babb4d43fb80164937be03651dad2692c996fb81bd8ef6cc7b697d9dc47b3282a07dccc95014ebd3749bc4fbdeef468de8a5e9653a27464b4fdade2cf8daa1acf0df840266549205902376a65f295018b5aab2637a5362076aff10cedfd0d788b503bd09413b83b476e06510b422d825c62c3870dfa33aa514e4e791f3b64e293f3451900e98c5807c9f844cd57607d89eebbe71a70b85197b206ee6c68f243809488281bd00ee03758334d8d1736c74e7de7c46c1227f22c4273ab16a1f4423211550f8e96b7265af7359478ac550937c86cd2ef4f3cc2cd6618451f9c5e8c01a879223118ff7e499711cdd1f0731b70fdd7b5739cd9897498f716738b038863a50b25f5c6150c27c5536615ebf828578a29d23adcf516f836e14772f93ee6bc694f69a845f91b3bd81333c97c907c8c885822518e06fd035ac09e05a7a3706d62aad3466c923578a5746c79041029f45f99f04d4fbd003bb6805de9a8576002867b3d4d4a6af0197734baadd2ea3e903aa492167acc9259f227f84116e45d529279031316f794cd529db374cb3e59917da750ead0f3b8e9b68de0436595ec1a214ff3d37dafcf1789c65998c049722c5a4d95db7065f97b69a7e5dd57ad1e6ab7f8af21d4d5f5dc042aee323187c7e4f1d82ce11472fbdb1e2f978027dbd16940dbdff59a1eca22147fc79cf57a163a8e877d8723423e27e6c6eb13fd7f68a5ecd9902e38d0b9e6866cb01c3bf9ab89bf3160ad2dff4e9bace58f929a8676e509a2bdaf6ff9fc27a8b78971447af602f70e669ac636e62d715b541017ae194964ae5c2dd7157a8572f2417c9b89af50bb9370e87986bdf96b52e2ad0469dd3db86bea32df576404da3f3c1f5a085f7be512b24e0045e11393be74f98d2660cd5c94589360f152af1cd8a46e4320d1e885204200994515879d601eaaac3fe8c518bbad5b893b481fa43261a3cf89e14b9e3b8a928055b8b53ceb6b5e86bbb20c76ae3d9cdd002078952ecd4b89acfc3465320d6c75a7cf815dde49c3cab279fe8624f8253f98cee7519998059f6d514bac27adba9fa7b99ea998a6ee41b3631b906c532d7be0fac9f2ed29c31c99e9f30edd132f8df2650e7aaa162d21e2c1e4e2e9ea81c6c085394f7b9d706adbf5d3f99a0147e9ac7e4070624bc6add5b9f21eea422ecc48ae550b27ff94322d174b4e4ece165ba3c02b75775a746ebd046b870be555d1b636acf23b9ba4a5d7fcc7c297fb6c17356de085ba43c28208d1aef0af1488cbf65337715646a7f23381f54024f8bb9bfe387c422362ce92af0e2e2de5ac1a84f75137cd7c66ea4052981ce51a173afa843b8e7dae610622f50c51756e567645d189fdf3a5fe0fafe1d2c56b11d531d62679f10c61df024814dfd95524789ccb24469ce1280760a9bd26fc0754a477b498fee0a81c53ff1cb26ecb5f33ddc867d0fd12a41c787a5c5919e0f25cbf221d67be6a12a4b05adf4dd869befa1ea453723a4dde1e3796f2aeb3418d33208b9e8923bbd6a925ae94504a98c48b7d6127a84cc4141a5161136bc54d0dc5069af5416d383a8d12783016990d706720707f85e8b4aa178a726328e9d5b003468caf3b8cce020dae4c7196cea937cd1170f3a4049db8906257e6808ea8e0cf16051474aa6d5db0df643121c991cbfa7c0291f5591b572f3e8fe36df0a72cb4b6d9e69db7f32a1b5fa21f30a99e7742c2ccb4a1c850e19cea7e11c394c178d5055d15c0b490cd15980b97082a1026438dfdf962f14b49edc5654f3ab2a972dbbd0125e324691b711cc37b9de1445ae644f02e4a618a70248b3232afbb332b58508b7068734f523b6cf7a49211e2be59f1cf3bb2ca8b77f891d76fd3fdd820ff9193a7a5bf067e39d55814119920b19a3a8fdf5434fcd901b8565257e60e404ee02617f3d3565bfcd90f0f16a3538d20c002a7ca78580f645b75514ea4bb5076de34a1a8e05657a89830f40db422bf921d38aa287489a3250d922ec8e620ab0414d48cafa09e28f54a24ba82ba30d37174ef53ab0249f3759cf608797cc14c1ff88be8ab0580b8639eb8fccbe8d4eb298cdd5c6bb4d6473024af389685110280d6b3a39d3395132b120482b223f1040bef91ba9a51f9fa287a49ba5a13fd591f6bd88d3743d68a7b9300a984e0790aba471a66ffec552c23ca2fa118d6a5b987910706cbdd69a486b7bef9da44c291e06fc063b06313186d8f7c3c418d42cc5c499c730f39eb731a9598a7df8b11e91490d8d09bc813071e63dec391613675ecff33c94f0610fbbd94c883d6ce6f5d82eb4338fc77e3e3fdf6d5e4e9d836a937312a15ce0d7796b42a75befe89cec797cd338f43c7e3d3c1ff2bc4b64eaacef1199d42cf57c90c8d43dbdc5d455624f55cf5550f3fc27edecdbce46a82f7fe622942acefc9bc6d7ff0c0afd7e2ace5c54caf23df84da38b09161969e8c811f5f36a967c9e3ea55f7f897ecd51a7599b4f4599a37f934e3427f4d3c9c70728eba7be8f8f9028b77ca65396a8a5c71f91871db25ece66f5f4fc4d6e053d8f413e7f9b4eb29757b336e98ea74e198c424bf5652293ecd52c057d159964a20cba62da216ae95148ac0a9fc7f06fb24d28cebc6f1a6515cff3c823ce3c51290b4379393983d223fd1ee9f37cd0579149cd6c845a79ceaf6d96ea07894c136ad6dae480ac07e5e5666dbe8fe5599b50558c21776380bd3883127bd8c744263533a5fa24f0584528de5698383ef85085c33139c9317c2cf561e26c89be12cfc77efe9134421ee7135c94d8628b34c418b05411479f8a33a5faf4617f9b57777a5ea278ac17b35ed4accdf7aceefc9b0775a78735e57856334bd2e64472f3363c6b722a7cc970b3a6356b73fe043cdea69607d4e452480bca44dff305439995eefa7759647fdf161b0c7b4e203ae1ad714ddabf67ffd30fdcb3b945ee98bbb9bbe7c82f94f6b21074a3adf0e94d2ef2e9799ed771e9ba07ddbdfb29eeaed5f99c1eceb1621bd778e6bc5c18267415f8caddf89c2012286bfce0d75b1d7716ecba06251465a2972ebf2392329162cfe3b96e0c24047ad51b912bff25b6d0f7babeeff55d650c14bfd7ab07cc049e87895866507a847d8f30d1a98e3cefe46316d86b01c76623dfc76c8f12b6e4238fa885069e11f672f45eeffa91d9c8f779ef1788e27e1df0142d6575326d3623231aedffc5535cd77b52dcaf0396a222287a9ec8ffe01b0aca2370ceb682f2211441d99c70b6d4bd7f27fe84e2d177bd7bcfe36ce9fbee3fb1136750bed777e26ca96302bffb9ec7506acddad6ace1a6d3cc9a35cb238fa0e5f1850b5fce3557de239226614888898a614191b34979141027e02c9146e825411b13fe98f902ce0e428408792e4fc1c9f2469d2ac8d00a3206196974e9fe66f7c7f31596a5e5237b240a595a0d4ac1acae7a66387966e5b1362734ab2bf975df045dcaf3bcc5988d62939a6058c3d8e7dff74d30ac611873a344886be8c8a51131024274a402b18542624262f2f2e87a8c6c7f934878a40271a344488c687e3c5fa50dbdfcbe3b12abc2fa0eecb67d31900868439a529425b3d6555859ddf7816f5b625465456330269ecb23ea9ec2604cbaeffbe6ac9d6d09cdf57d0814ab955e61dda615c6e4fbe073a254ad8dbec21ac6c21a86b1ef0b6b18c65c9fb4739c9ddd765fbbbb7bceecce53745dd775b3737767263289a6cfe95ee7eeecd2dd6b6766767707634176a89c6efb6e1d13cda75fdfc9cc36afbbdfbbe77ddff7cd2c14fa73b9ac9cd057adeefef96466ee84be3dcf33a27d9e47f43d337722d3917ddeed664fe8e3c3fc7d9e6ce3fbf9ece705d5cfab554be8d03c2be4791e1da5363e77f7aeebdc3bae1a92a9999e85c215d84c347b78320fbdea6ee544ea935851bcd9f9fc1f9d4fcff33c22666666cff33c8fdff3c0392de3d073cff33c9b91e7defff03acf3dac28d2ea63a2d9c373cf9bdecf6fafba572d71b7799eb7867d8ee7795ef53c4fc9ddf0bcce465d22129d7be7eedea921474ee75e97eb72eee5d49023a7f39c1a72e47877c7ebbcceddddbdf3ee4cfa72a7b6ad7aec2a3933cac509b5867b97f32ea7061b723af7ba5c97732fa7061b723acfa9c1861cefeef8634de66e29bdf33ed0f5a2151663201893ee8576b88e3aa52831295a563c55575655c5b2b4d0482c8915e4f323036b4ce94a46c124546df3925268e41ab906284868c7acc7078ba1c059ce63636267cd28a50965a5d34be2244e268331f15e36c4c34b7229f06f422e3f90ee8582e72098211e5d7dd14a5f3c916a1f4d79db73b7aa575de5790ece32b14e43d2e4c7608d85c5a4f301c164566214b22614d4cccd35726b4b6e493bb8de9a503cb69f62ed641b06eba86e2385a6d7f41a1e3c66104827336a424da85966464da8324ab3165454b7fcc5a5eda6bae53797f65475cb5e5cda54d52d63e0d2aea2bae52e2eedaaea96ad2e6d2baa5be6e2d2bea2bae52d2e6d2caa5bd6e2d2cea2bae52c2e6d2daa5bc6e2d2dea2bae52b2e6d2eacb8b4adaa5baebab4bba86eb98a4b1b03d52d535dda5e54b73c7569bfa96ed9cda5fd4575cb545cda6054b77c814b3b8cea96a7b8b4afaa5b96bab4c5a86e33b8b4c7a86e31b8b4c9a86e2fb8b4e154b74a2eed32aadb2497b619d56dd2a57d46756bc1a58d55ddda2eed0c54b74897361ad5edd1a5ad81ea16c9a59d46757be4d2de40755bc1a5cd81ea96824b5b8dead6c8a59d55ddc62eed35aa5bd8a5cd46c7e90ed4366ad835f937effa34d28fa113dbd857fe38f2a3714d5862608241022f5c89800b10b0f28016aa5071000b2ba830e5968294063060010a4800020e8082010a70020106608200a204000a00964a20610425114200e183271e74e08483264c36d060bc4b32c0e0022549922cb0211d2139520105468cbabbbbf316a28798b28d36ba8d968ab9bfd79d06f6647ef77d84950662281379defcbee979a02cc2b48e91684bb848ca2ff2dde9b74adfb93fb826ff06263523c9bc2542cf13c3252c9b4598d6305b9df0f6dd298e725ab594cdb2a54b9fddec9cbae1b9d7759f473f57d7d53bdfc117ece592b4a63d5c84f2e7cd8a48dd6354bee47c5a292c84d5a758aca7613c62b33b9f863c3ddf13fa589f9e1ff1c7072802a09f20a2202021219a50d08e1db51d42329904b21d43434386643c7810e131349b15cd78f4e831418f990f1f457cf480000223087cfcf861e40704ff14fc0f6b2bb02f8a47441b410448221089888e88220002040908519020b620408408b14048101a2d8926a4564b52a349208112096a43865c304402cfc31e17ea2194ef44ba6ebe5b90c890a20c8a883c4d2075e70445628a4c51640228a30b1815f912ca77235d47c59d6f04340a75a0c0df29303255010554472aa802c991aa232456201d5d6143c2c2025b164916689124690b2549b8b8408915061774910106185892811777c99bf17ea1c108c6061a84c16483ab264cc4e0a0c9184e3820a30327703ce8a08c271e98f1c1933340f8002b041032204208682889a0811194d22061840d94400207964a5003004b595000b04600a0b0112500710410458e0902e8c0004c6883000370e304026815e084370c5000385030c09c03a0400701078823010890430109f0c00214b0c58005ccd10006d491d2003a529062e796c207a6dcea50610adf5941051c0b2bc8e0001666a0e2001aaa50c9d242951a1ed082162b0fd802012b4e2e40c08608b870c395087079e14a1709bce0050609e0c004430e31306189e1cb9d4f9bb0e8806bda41061c981964e0818619c264a1414c0d59a0b4d4d0c3162d639cb690b1c1a9cc0d36f8c0e506335db8fce0a54b140e5e80c80187209e7210e2cbd3103a7c39b3830e4480d9010d0f6072617828424c1823a0c41cd103549a313da82133660265c820e1439935667c48e207331488faa1024044b1090208258408c2024308b1c49921da107186093444349143e34411b9278c28028a238c88224de50976e823604de6953db8b0af144770cb59344111232314547004c91192cd82a4244a2ec020832577d46003264d3870d281074f3e00210411944620a18425004009401401983000029c500003a07000042440010b604003a4a4709ba2c20a2c38804a95161e6005022e44e0ca0b12808129062c4d8d6b197a86a6a1b3740dada5b7b453dbd0373497eed25e1a87cea19ffa4bebd03b3498e6a1c3b49886ea1e7a4c93e932ed439be91f3aaa81e8205a881ea2cf34118da6735d441bd147749a58db400748e5f3db7e5df03ba5ff7bf01381aed755a8dc29ddbbc0fefe16865ba1fc39e9eb6fe1ed34d7fbee4b6cc1656f54ae07de1c67b3d96c369b4d4a29a59457fe7dd3a960a482d17c158c5430f2e20ca83be4f294196c5ccae35364bfdedfacb838658a3f089dc856faca96b31bec9fe24dca7ee3ae053333b333b3333333773a5871d74d766766eebae7ae73f7ced9d9b99b13092396396d8eff9c57d8b123478e159e2a030e381f04255127250fa919d58f35c5c645b174834428aba494a449299e73cea9a933da14c599a2443690352997b8a8c2284a92f644d82f9334d9a0d1cb967064514654196ba8c018e2f6b84cf585d4a53c332597f7f425fffb66dfd366cd639a3f452699d734be8d041ea9c87493f9df6cddc86307fe1229edecfb28b3e67dd3e8b2b34f6c81041e95442627de38e37f5d89b3251c55c3429b20fff54bf3ebf357f92f91a9aac55907dff77f4fc599d2eb674bae7fbdabc78631f95cbf444a291ceed266ee1903c5f073d92bb3e671d67cba220c2eb25c0f4a1e71185b9491483d4e0e430b2fcd9def69bdfc4a61dfd4afc6c5a57e98c8c4d474a52a8a94ad2b27597c05fb259e87f53ccf7be21253d087df34de786be61f7b1ea59db9381b413eeca1f407f7d6746e3fe801d9858aa83454fcd0c595623b95e924ae1cc2ef6f2bb6e02e1839a693cc4ef2b054124d029f3c37d9fd6e61d79bb027733a7d2394ba231df71ae7b3ace5f4cefbc029394059baba653d20112e92df31618532d1cda9cbf61dea896aa8eb346957234e727d4f100c4399ec1f8b6fe7248df62f9365792e97cb45eb64e2ca2a9db0b0b0b01a8b7e7d02c13094b9aa8bbe948934f4f2a97c1e6b2f264549ffc65b208c8a4d66ee36f5584fd3794a79c8befc59a59bef6f9c45c5f924aba4d4d02f99435686269c35d9535de22cf62c4536e2a409e34002512130e8a78707f6469c247b17dd41bbbf4929100c4399ec9f8a4de49589b3cdcb29ec2c4993bf43149508c127e992469c249b8986aae20a893723d7f5af9732834420d187b3c450bcc9c498787b176751795d4fad1117b9c4998b612eb1c9bc3723f7c65946f6d64d5cf9df7472dd1b67dd8c48ad6bc4d7ec90426d384141444e6611071c4f23953858a08ed448679d39b8913a9809e046da51255181a7917a5a4f1880a30b2a46262c3ed6185922c122d4441d4ae046ea22838e0dcc31d217951719a81a29f522aa0aa79156aa3590801a29ac8a306f9c461a0be3ccd59b3284c88d3484b2c269a43d555a5983971bda8cd4a74a2b6f0033d566a43f55daf6a2c50a6aa440555a2639068e54165b231316a6630c183a46352278995822c1c27696787a625433457653278bab910a0505350b0d6141868badb1a9b1b49c5274de2a7ffe94190265a2e99dc8d414b03343d588e5cb1a418944ca0b8437f082b3366b73fe1499769041c3184ea38bb44e62ea08ac91ce9601ea8ca7715a1e5b76179f349ff2146fde688db4e1ecf0343a9189026a6434b49863cdc85ea8c1658db4ab9de53034f084d548bdda5926b6620b17592396971458d3ca664b1dcf160b6c8d1dd8d9231ba6781afdfb0ec8a00b041f9c48af07c16f4e127611f9a078035d6e6f4d13c6840a757710743d88f4025dfcb2409dc4254e9d51c575f166b3048d3450c1e1264c8479b1dcef13dfd288e6cb3a21e850d0f1191599e01675443ca1cb433e095c354a8309e1711ba4c72d901fb7444111ec1087ecec7dfcf80181f511410f2033213c6a6e8786b89515b9dd51c4ad9091ea3688e5d1e74a96cc9a5ba0fb592512897c7aa4bafd71eb73ddf6b80def74cb93d434a9b36c01172555b754092f91ed16bc605a2592e6d6ddce25d52de0a20d24136fe2512d0e40f75707b5031813ff396b375b22bcd96c4be4b741a844d6a407b127e107defd810f08402108892053e2e1a30704ffc3462012050122a4469380c890a22213185160a40224478e6c481624495282c10519dc25e3061a30e1a089130f3a7802c207212889304209242c410140000410c504020ce0040314a08b1214aaad8b94038049c182ae262500cc6d0164a634a08c0af24b8187156a2b619ab48069720aacc9df166d6156a86efb884b59a86edb884b1d50dd76119752a96e3b776995eab6d15cda4275db445cfa80eab6cf5c6aa5baed212e854075db425cea4275db415c1a81eab681b8f44a75db5197be50ddf60f974aa0ba6d3397c250ddb60f973255b75de6d218aadb26732996eab6c75cda54dd760f9736aeba6da84b5b86eab6c55cda3354b71de6d2a6a1ba6d1e2eed2cd56d83b9b46ba86e7b874b5b4b75db3a5cda5baadbfe72693b55b7fd7469db50dd760e97f60dd56de3706973a96edbcba5dda5baed2e97b697eab6b95cda3854b77dc3a59d4375db365cda4fd56d3b5dda5faadbde7269eb50ddb6964b7b87eab66bb8b4c154b79de5d2e6a1ba6d1a2eed30d56dcf70698ba96e5b864b1baaba6ddca5dd4375cb772eed31d52dd7716993a96ef903977699ea96ed5cda3e54b74cc7a56da6bae53a97f60fd52dcf71694755b7bc75690351ddb2072eed20aa5b96e3d216a2bae5382eed21aa5ba673699fa96e79cea54d4475cb705cda68aa5b7ee3d2ce55b7ac75691751ddb21b97b611d52db771691f51dd72072eed34d52dcbb9b4d554b71ce7d29e4075cb6c5cda4854b7bcc6a5bda6bae5ac4b3b89ea96d5b8b42950dd32072eed0a54b7bc814b9b4d75cb695cda4a54b7ac814bdb02d52da371692f51dd72062eed36d52d635dda4c54b77cc6a5dd4475cb665cda4e54b75cc6a5fd4475cb702e6d28aa5b26e3d28ea2bae5312e6d29aa5b16e3d296aa6ef9ead29ea2bae5302eed0b54b70cc6a51d51964a18810a19618a4c0385301207ccc1085c94c025acac586a49c90acb8c0fe8a787ddfaf77137fbfddc7d7252c7493ccfef7152ecf93f4e82d5245a39097c7e588c87cebff99ddd9dde9ddf9dae3befbcd13b937c7ebe9c9c14fefc0ae3a4eee7f78909bfefc702f9d820a11db2211eb31e3e20f8c145f6878be48716c8060971917c98ddc145f2ab95d9211e5c24df6567b6870f2e82808b7e70513847e8a325046f70ef7c6e3e746df5d33365403f3d56640f40a1191158055cffd9e38621c82008be3b7844d63e6ce3e9b072b281067707ef6024215c936f346b42180909c968225da6f20682408420d8b91e04c5255cc27ea3b9c112ab1c6067c8807e7abeef6fb0ef6f3c975fc9f79c844e9077f0e922f2db0235e9a16fc810280c7f5ad18822b04cb907082491be9f3d74a875228f1c4ff4ef867bcfa7dff7cdceeb3a6f4eb71fd0f7c942300462d9114a248df6830c30743a5dd7d3764f2783a083a1ac7560083e4f36e19ca1ec3c91e6855606e8b5e7303dd91e967a267c61044366c92c999925b364e6efe9f1f1f9f9010262212166e6f7616666c92c9965b62b0b7213e4e60aefce095f96b649abc08856011f3d61da74226936224fe4d195bec2e16433f7a4311294ae4d6f9c6d2d1c15a564b9137410fcc0cfddfd7ae715d40ae378c3f7e5ba9e573d8f525707e5d2939dfce4d7e5acec48a4be0265cf798393389136f4ec2b27b0cec2ae14abb4b4aa566b85a083134b6ba2f181adf9665e4d2bf06fd3ca65acca772b086a69b95c1de875567ee12227a943c3d045dac0a38cc2418eb9f3a5d60eac500d23358e6bf3d34469219bbaa184e2ee88229c5ef0d1f7f367183c31506792c1488d9bb54e72a58b4c99a881099b6df9ba6ed7755d57ab7ce224d95ab62f5b29054b279836ff4a27e9ac2e327f5291c4c69dbce5e562d157f24a369cc6126d17e1f7b7bee24ec6401cce09c411e1fe65681cae03c12f8cf5f490c964412ebfd86f8f6060da1ce2a32b9236e9874a12063e4ac2b4f936499b4fc5bebaca5aea22f33bf1939fccc9237927903b5f5ec934241288c5664a4581bbb2ea4e09e7ce29dddcf99fd7754f9ba58c755d8fd2446aad247cd44eb491b469158b6959595ddd97e5d13949def93fd2ba6e8f9ab07b29a5c4698562ccb0e6b66d20b8288876828fca740f4c9bdf4e5dc79d6dc4937438a14c82651a4e5ac349f226739cd473e7576935919eb8487e895ae2f670e7d49a35d87d59394eaab0b55aab2b623271678e8be6b3010317c544ea37e600e74f2d31c29bcce5e60cf3ebb84eebce032ef4c8c3febeaf6777cb29a79c5e85334ff7e979288fe6f7ed5726692e0508ca99c691c031c8e5a90e7820ce9bb0839801e68d335371d87ce1431d5f48b065482e6808301b000347ca0d38fe812b26cd89ef14bc9812238e1c3b5e9cb1f3459d26a82b78b89ac30cac2b92703a6850307903079c115b561c78c2ebd47e38a18a34e83c3103163f40f91cb20f813a1abaaeebba2ba400e38501e99b31a8cc5c5dd7652a33767290800b194d703953070b0d0c31856f8121c7240386902cd8042142881c5f1c088c1a0f12c82185a03d5138b2b429734689ab37ee8120564c2068524b1a566feea06163ab8c91d11b2a36535084e0652a3650c83ca1cb546cd0b02923ed0ce94172d18137f241f9619b3754312e6f5c5bc891f2b6bc19837e3d2e538959e2d2cb5462d208d1c1853b45a46933831923d6c861f485c75185c5962f6e8ce12285865167bbec4ebb42cb04be2d5f842133a9c4784165460dd7130d5da6d222cc7d5da6d202897b7ba32e0ca3967d6c847e792a8e5518278b2f0edbcae16a035dd6b0628d71d28983c5957d5371a6be08c3e9727dd3f5bee9d20f7ceec1e3846f078931263227c021ecdb5dec56e13bb7fb5825e2c19e4c97074d2d806fe5bb9ee73df1264d37d9c47bffe941d3ad12abdd7f6114c19dc738893b30dbdd93bedb2332a4e63fad4c3e99dfc4e7ac83babcce05ba3b0cfcacf5afeb5ca0f884ef5cff2a3ca5bb4feb60cba9efbf8f69a44d63bf27ce963cef9bc6177fb5209bf0065e998f2542975113e1105c1c2da5a858d162bab245e3d0927ac24a85b3a54fc9c927ce48e0d1d634468d4c3d766ed6feb6992e428544514d59dd7e6e28cf93603a2bd75abdb50667e6de9a4e63cdb937994576612c293d89bcac89227a0a2594952c2325a3726fa454d59a36b989c4e3d8df663a89ac52a68bf4f3982ed233694796813374fb659544aa61f5d41c3797cdcdb1e6c471a9141d32edb3c7749996c2658143ceed3702967ca8040c1d28a95388460000002011400083160000200c0a070422911c04e248177d0714000f65783a64523215082391381848510c84530c432110c22086102619320ca2191b5000fe119b2f79ec20e98583a718e11691fa39be5f84663d1e7d5568c5c2e90c46c61fc91f537bfc407132d6e8571cb37ea078d81a85a8fe08d532b182b5998d69013d9c71789771c5122b9c17527f21b526f5b4e6b465ac4ddf395a537c3198b9296b86b57126b6c05b3df56f9fd74c84817f9900714e928259802658f5a4ff6f9541ad2b84f154e13037523a695e9f2754a5deec90a13f335a901a3be75bd0f54a724f810c69536d4d04212658b9171312f131e35024d4432e96ee8ad01704a843c4b94703ab55e0588fa1e8a38756627c2b9605bb7c5a310961b7cc6c6e78494891b7c06226f1df093469c07ccec0b16e634ce30f42f44c659e1ddcde70e4e3946f8b495d6ca37752f85236b222e838da1db0239b2390acde82ba8f431446d84acb558c7d2889d50fa64209075818a604537fd45d2ebd4fb748845fe54049309847ada679d79a6003ddfe933419ef93dae1aa41667381343252e3fb92ce76e1491e6b7bacc8b7393f999f6259c70412ffe03d4f3515225a586a51d6feedcf6c36189bee722c5839181998b5a1102b6e411e603f7f0e7af2cdada2827c62e90268448bf44887012665473272323d353ad65e207044bff3b76984da6a5584a625ec990dad613f477212189e01be8c37d06c80662b6d2ae4e82c990bd296c850da2f6ebd3ee6b3229660410843389ce78222091d201fcbce0ae0a4e77d2e330c15cbf9babef1e4c62485c2818e097c08ae0b90b40c5a02d552c262f557b55b37ad1f6289b77dcc81ec3d8c4dabfe0870de6b9757b0a7cf1ad492d8001ea9ce71494afe960758a8ec0a4d180334b21db9e049b1be4dac63e01bac7ad1c96e2154ca89d4d63d0775dad7ea88266ddd9921ff03235860c870cf35dc2553f666e9f5a1a359c544021f178fb55e4fb2af9a357fb5049bfd32d771df33cf334f0fed50f2e765404037058271620e6312754c01d375a736cb9e2d193ea3fb8e1776a82a5f2f9bc248828593022cb73661060810d2b1ed123fe001af3340a59303ba729ce3c9ca6ae97c74964e9d87fbcdeedaf805999ba5a38d6a3507d9a0d81f747e7a67b1cb4309e6bd7709f4b39176940d24ef7bb9c43cc8c240fcab1be31190c652caecbd84b3ef5f8c071c7f4338422e878481383f05dc987019d0232ac0856628df9a39c756dfa50b696367b4da19a9c14636c2d64af06ef86828383b3810c10601af19e6e9e9a52e632edd6502a897339fe73e4ff7f794598e517d9a8980d3bbf67959b26054563f2c0a90fd2e6caba6eeac97811db36c4df002c306c30c50868753b90adf445a62d87c71b5df90056e6506f3fa22b9642237c7920c04f2ad66a1dd70e87efc0e440b2b37748938e61686ebcf81f62ec716c6a449420785d09109fcab8211d1932523a47fb19207ff60e606f1f0ab329a71b13a23da45c5472f9a860dc1320e71daa154cae3e1ed0c26f0cb99c080e91e746fa3f99c4781d35c713a4b8270a16b712e3424e1e4ac969caf2951c96bac26d3189f5db3db9b95d41d4b0d9c465954e5a5a369035256e239b3153a57238a030dd19885b3501f60d45fa02b4cf21e2c4079808dbb9515fd47f4894987c633d1ad70c06862f42decc13071533f2c63a1c685854cfd38493f6bc9e5349b871eedb7e815f5e1520a3f31f6edce2280bc18f5922a8a170b152a5624664c55f1bd2a8c718590d154b03d03371f2f34837e1a926e954fb68cdeddc55ad52aea3d67062c13655f44d7978a1483347967030a30163b86a010ec9a4da939b3b4cf66d5ccd293de65caf3be3f1e2343a37fe7fdf05125815cac8b55ce2a431633010d481c5df059d2be3de0718ec276d215b6321612428f87c7c4617cf6b56222519974dfbee97734e52b1a3890401833e45f2f9fe06046cf8b81ddf2be892545fb65119d7887e95a257dc4ea2640d781c59ffa767c1e10be6fe4da8f33798c84612ffcfe3548d501d4bf576bbdefdbf43fe1f77dd4c718c8f755b895c6365ed1dbad8381a20db3ce8325f4787dae2bd8298b08eeeb50c4b25ad4e44e2d97f771f81680b6ff3c468f26eb627d0fba81bf34dff129a0facfccf1b71d8bf35acc5a75775c4a98692999208fb8f27e6ac4337016a171b90f9466e4f8e9ff72e6f9e3907eb2f29c5b817f8c01a5e11bfd238ffda9aaf282e86f70e87f6e79fb036d285b5403785e019e3e9f019ece2a6c0e59f8bb2016025be3ee1e29940560bead25b3b381d3919cdd91103a32f03a6a3546e8bcd9115f960cbfe89ac14a099df3f3e7f5f3a005f4808a3d26d2c1cdb5f0fe3a6122687a55a1293b2d72b80ba563dd0b9bbd481d32572cff070b09c5adb6e4aa242db23c49688e19cf0c895b090a37c160276410ed5723ad5afa835b9f3d1eb8a3df8691871fe4795b9968dbbb4decd698d8726e398ddb84634e415354c3b88d2d3459d23bf03de538685e1807535aaf341b2fb70919a90adfd36d82e1a88a089da0996d824e814511a080054bb6b2d4ac78215e90654433bbb1b1fe4ee9c2064ade943968e0d4cb630296560a2c4fca83eab3560828230277eac1d61224ac55eee676f298149e6772b53266bf0d6b47359bd004df6a2c534fccafec66bb18a65988d6ac84f566e2a40121162c11310c0cdfdd645f69d3c7701947a82116e12a8a94ffb363bf0e9b30fef63c3acdd4615e567fc8c6939fd8e3950f0fcb341080306317c8d97d6a716da352a5de4ff3794eaac4a0343a42fd5db26c349bcd80bd0124260d57952ddad545980fea828cc28f0265267960d8f89ae3bcde8151e1812e8c5510a2c4fd21aecd6e6dd6234482f83a5c1c0cd7ba0f6d7a506b8a4ce3a609b4628c9e8a2383943995df99fef146ce42a104db1061e4677dcda006328ee7bc2771d29ece5f8971c56300fdf1d3242868c845974b551ff2151a8cb280f0cc2075b8dc2d8a5806c370d115a20a9c546f3e9d998b7c90fe3306f558c6454d207ae51b0a514e579f05553c259a83217f068c3997434c6a307195a4ec17f5dcf04f137ce10297df7114f4bfbea3baf0b8f25042b84670a94d90bce6dafec1318c481d7d25e4b155181af2aab2b8ffb1f4551544d5fa5e16c8141d30cb5fb5a9dd00fab5f9bb37bc658009b62bdc7b0bfaf34b4a4e8fe239ead0968fab92a73050ab64d521b0e0a4656ec944bb35138a1a3e33f369f70980feb26c69a124c407824ebc035965d114ef6258d81175d3ba17756db5d69e5a0b427f039c7640f8541b8e12123d012837a8ad7e6955bc2bc56bc5826a4538bdbeb66114e104cdb134b3e0e15d7f58978b85f5c5d556515b54b7f52c67b338e3ae502e93c3257c0babe0b1ddd8e2bf86fe995403c4d8de3a876b92a8821afe47f812138cf3252ec9be34b3e0a6e07f48f6d1b881316c97b81dab215dacac75b80e40552c586dd1f2ef997adccf62932415d645de4ae27ee25beddad8a34e707de5948c2d559fd4b974a0644da4b64b54da45f6288aac52d9704c38cd364e5a46a25252cba012a1c8c4fae605165e241df31d11be60f7f0d71e3c981f2298dde1ae60495fb5b2165a7580d8f3b32f35a587e4034709081a38ce88be45f34b31dd85232b2b3059b10b22f9c2c50468882d0ae025615cc473d4a14a61076380000701b35e8285fa602dea80850502bef6ae6535645d258bae7d3e269941d8126a813bd24bac76d018d041a6b7258413a49f6b8a6c3611da3c7547a575a2825942539373cf188d96a5e0852e9db4acf01b52c2c29ced8f9f71bd360416c4fdfa9d4b3c152d0fb220e2b12f1bc376a197a4093fd558d2adc3e839fd6050f637276a83d7758df9a3b784cf2492ed6b2eea56d769ecf287db1c2e9a0f453c65c746985501fd6ce3498275c2bd57d2aa3ed12517af954593c6169b794c812c29515866aa7465b4569bdf04a80da439d6e9f6ba7a21edaf63a7130b0474ad4a822d850f8d1553549038f049aec7ad9245b456e8abf8c9eed2c716794a016348594e0fd48f3bbfcfe84bf82f65e1503cecb947d8cc1654278ffa7237b67d4aa97853d04bc9a736629e693d794f6e43711d02220c05c2dcd5fafa8640181540f2f49453ce9419b8dee6cfa512466834ee9e7bb937d3102a504ea62803561aa2084f4ce4ce52010c1a6ccca3b54f5015773f530ea1537f5060370584242c1d845e41a20c709e905e87bde3b6935e3b32c46a951ae533ec7a01a1e2873ab8550d5801471ed35795dced4aaa8c1c312a83251d4a84f276d6a94b9aae182e0b7ea72b184eddd286488663154d12e1697b806e8b8a90ea150c392164183e32afc05733ed8292420c87173ce394774ecd0b032405bdb7abe30529106f868e3a146836661cf7615241912fd2b9f5bfa5c1852cb3aaee8b87023f1555d2832d6db526a460982282923be9d598603f25cf6acb03a71b0d9387f1d655a223b3c47261a677d1808fff37cfb8ff39e7734d73ac7a073a90060cf4447920822c10f4e11f196de8277df9d4e20e761508747cf8d63e62461a431135d9fc4f2770f54674b64a7b003c8bab13812d367173c5d96d8395aab241f10efa96109f9d3cf674dc3474556c461dac57f00cdce6678bc99d842ceea7fb5dc89a35e9a0570ff5d9c91d7b64213f6dc672c1656100a7b3223516add60839287c3e6946b40535ae799aaf0df1a5d88dd611a8e4f5684458be52b6e15917d98e8cd1eccc47ba0cba9f1972d348dfb07c5fe0646e88685b68868bfbf3dc36b261c560ff497e5ddc71ba757a1d060dd0d3e9d8b3c9bbfbf354c460cb8c33d1571b47f97c1de8a959e53f3410a8836d7de7b6d3ddc6aee4d57c1df53fac4ba00de3bbd88ebdd9909f36636db9ec74b7f90abb9935e7296dc51834185b663a0cedf69ad03d0540a951c639bff9f224b25f876a4cb6a7964acab129a6853a2b54eb72897925b5844f589a897fafa40238d3708ab591f467fa2b952bc0e56f31b07efa71851e80e2b47ba2ad49a63265faf344b014756878b8f5fc3c91c0a09954687a2d7896c4eef4bd18951a43253d6cd1dc3ddc8a0c764afa8b65a00087fe415b70926a3a995b113ade89b8a59aaa42fbab28302538926a648caaafff58e306434092d04c233c7ebe0e789a0f1d6d9eae46dd8a6325f383d36e48ef4a6131a4fa204ccefaab8b87d7bb1c91ea08ae86229f364a39b68a58729e0ff2d352393412a547b192f4a14cb6668ae8f380e12d19325182a15add83bab2099e09f3e2dd5275f26c8bda0baa5a28b81721463728ef7cf2c90101d540b12c276948413f0474905d5e7206a8215c8d8e559865a082bbadf0d2bb8500fcba31f8d5139548bff03045de92c42236892de493e813caccb82980b031dfde3ae48ef6bc49c5c6332468f4b2105689c55132e645c9c88ea186d809a54b5742d11c32ae7fc6a0d3038ed887ab7be650817ca585c100af89aa50e25fdd3b7765e7cdde70ff32ed3c32330504e7cf6f983f369018d24fe3f7013cef17c845e5d8dacfa9ba812a72b5d9a0fbe3d9a5d47bcbf67b43d2065587e33508108bd4c53a00046b63ba709e6ecaa32afe5b6c87e03aec259f716a45406bfe56adc8f5e329f1a4b80701c4e9f6ac2a881d6dc126891634a0b77ddc18f214b347d6c692916b5dfbc8414e7c64399628e65162618b1e88169e013c8815d6ba21f9790854513cbe568f00ae14ec9bfa2442ceca8c6ad5c8824ace7f569bdcf5f2abe63745ab65149bc3fbe6c0b5785c116ef208ef017d02f5aff1636cecaa05e09e5bb522e0dbe0d1ed924dcbd121262bc9ad2a6a8748165ba15c542cbea0d5fe81d826c4d536879d1f5fe8584108012736c235bdf7927a704d5bb62d9d947a81058701ae58433890a51cf8e217fc312e5b169ded94efe6b6481aae83cd820cba68c406d27f90f8891cf5c13594748a56c67e26d5fde3d11f37910e98890daa9d4306f84d6c0e983429a0a2f5819c677b2e65b0c472a7778341b25f7f42443d38e0736f00be78c809c5e7c8ef3de915ad25268be88e178ae67bb5da915005260b9c24daaa28b84b517ca3a55d0cba7e0b3c546451c25141474f0aecfc3d10c0b37087c20f050ef77ea44268241aefcbbed82ed3d95871d01df3ac4ac58122415b720ca3115305c31c708ee8df707fa8422a20e721eb102814b232586ed9b606b307e9beb259e7f1aee62038e737fe2b99697c188aa42a7620bbe2fb6c04501a51b233698b5e5f515f191774ec0e9c028ccf5562ee5c4a4fa0f64fa85c186e9867beadd179e8124f63f7b85212459b236622de6454180ac475b59109057721a0826b8d51adaf8866fc028aff5616480418e4ed45694462b7eb5e963666ca921b3e5418354a3bd6ea488282b83b5826c9bdd8e2848176d789afd4f7e62b9fd17e2375203e3fd26366b70fca43bacac9b7d0560c57d5fb5fa7314162be7fb4ec70386974d8e037d22f7fa70e2a7df0b885d1e9a9233508e3012c0d230dae0d2baceaa3be857f4576969d40e57daf6240f54d9f37bdbab66bed2300e6574b711c8b703c6856961c039da44a855cddd5c8e8a7bffc5deddf1c7523400ecca6bfb749aa214f524530011cc91e4422f1e8584c75967d9ef5b8f416ef16af03942ada14299c3d4d70a59bcb40b460a92ad0b239513e7d48f4ebd974a4e5479d1eeb4178d41ee417c1d011242c4e17eacd8249955a4aa9f7540bc5b8e430fa8d8974bd850cd48171e1f5024996bebff4f338f0a024d13262ab3fe56807bfa9d4d5979a5f0b42ab3b04d4f19c474e80cf1fb2e8d9e612723babb57e66d6a326a0db6a6e18b48351d6fa394a71ca174aab190c94ae5d589f04c8f2d9a12b18f53150f2899e89ccb27ff91ddce3345afded292707144e392b581e4849ed43bfc051babf6463d175bc994434edaf9c6789fb9850028b8d74f431a033c8e6763268b4027f1c9108f6f218414ae1e1b1b762841fb748891b8adb421803f11c2bdb12c6a0d42e5d5de84396f6cf6d407092c3bf5c406b1bc1cecd31dd990da0f075eca171d3f0ada99d16145efc1e7da565301de1ed10a915d77e2ac5efe45430a240046b0145f58b75ccb4d98960109ad9263cfbdb598f08694c1011ac47e0fe1290b203faef9bab3fe1f9f82f6461ae1304f4bdaf6e6f949130f250fa0123b910dee0e62d0d3e0dc91a2cbae33d0efcf4c053d16d1233bc2091764ca7b85f29e8e14d2747d8564829f99310d28009c8836e39e3af0ce757ce1bf85c7238f822f29137dbcc37d3f0342207516ba79c607eb919e97a013257772e171eb84da9212a364dd1bf54d7d4e106c0c0be94eed395d5aa682a1f8b8b3421c6b59bfbf11b8bc8536d05bd80da44fd002548db3d605608e0bd664241cf19744d676dc5125effb00810ef332c47d0cb9484fd46715e40f9eb6817686a3084a3a40070ef204b109a11b326294815931e4c86c9ffaf6d0a314788d92c93b3bfca1a1e1733270a194cd274a336678e8833e0bc51b77e792cf4c0e9dc5cf643f2f5d03a93b9dc4025ef80f9443763b77f8ca09c5c5d2380f3f05d29c8c0df2d5a6e49ca33613865edc8527eaed125f0af8cd92d5c0556385ee6ee189796afb64d8190dc57d4f4b8b5f93dfe4d7c07231967daf15e21827c85cac6a977058356ecce0d1cd92f60b0700bac30df9b560702215826dd6d86f07270bdccfd475a912f6e0ec02a5935dfefb1138efd8a745008b223b1886fc8015d5718d48b860db05955b1074d92bafe5823d51344650853d86f4ff773c46aab645fae90714743de5361d050e21d11f9c4a5509ef60eabb162a204d1fb1243bfabd86b7ea3a1da566e56ae370b83acbed768aed29b3b18a45d1a87e23fcf0c550dbd663f581f34b0fd8c8c6e296c0ead83186c62840143cfb76bf7d3f2a70b7cf35b61311760ca9bd6311befacd0281ea17d8a0a6aedccf4d9255c4f529685987d37918fb2e5504d174c4ab5ed72a75d7e4a2d60677214b58f653f960525addcd7a4eb9603793e4305f5cbf7bf91e8b57e498a70834cfde331112142f6e9e51101fae817b11ae2584a8f8aa06213fb39b55027257e7c801c87fee64ba66701d1cef47e7840ece7d085265252be04958ecefe3dce6e3c29c0147d778536f985b43f85f163575d5e2b783386b5e0aea373ad7d5e83c5202e9562ef0a4de9107aa50f164eacba26e784292ea16198d270a14ed60506af0566f77b3cbb48a4f75689ec8861823376d0f7873af70016988a536dec84c6533fa55ef49e277c01b5982332113856c41fb8cba8b2817ea879a3d2f34aafcf73255dcac858771cd324fe60458d3e60f29dccdac5c9a0753a2f7a60238f6bd422853cb438690c929191a91a85529bf1992bf750c630517988ef7400ab85d6d35119be8259496369008aaa0a8af84db509b1c38abdc6d813bfba97c3f62237dc27d85030c719cce17a9fe97eea3e0a3824c159450c19dab45b7a648ebafc68328c6ac55149e703da4d0bad530f4ba28ce731296b5182553000642a9bac31709a7e39f3580e94fecafee734d05d04e2982173771a08f99ddd85506839e176ab380135759333bd4fdbb9ecccfcb4a15d5aca3ded4ee24cc6d3362e39ff3a6d688796644ebb9238a3e0b48dcbceb04d1bda2d2366d3964d99b4f4e4ed42e0554a73bb584008c9ec0a8610080903287e10718edbe0c30e7e045be3af47a372784dfba8f18ac8f5ab2491b254386530108451d5902513953d47bdc9bbed179cc8e0f0b93fef2a6ff01183a8691e15096efba1fd99295c12ef159145b4420cad3f90943d4b5aa76a425496a63f05041667c8d9a59e89d50b24ccd53d85d4c6fbc03fe4575584f00aef5b9ca2362312ef0a3858e5a32d9d23bc5971596cdf3864e1c5fcd43d2fdff24eb2b3b63fe861cc75f2240de001c5ca56e1321ca4e467f3c2197100ab2592dcdb213e71cb2a0d177842ff98c70ad309d398573abf47994866c8007b79d2fbc1dd24da88b7d24ce411dc6a516bf169c8103d6429ebe638fd4cd24905bae87a8c3d743dc87d753ec43e5d1e635f1d1f739faec7b04ff783b85fc763eca1e321f7aafb31f6e9f210fb75fb98fb743d847dba1fe2de3a1e631f1d8fb9a7ae8fb14797c7d8afeb63eea1e321ecd1f918f7eab21f232b13018c0ff4d0eb1bd5488fd614f64951d4babec83d3f222295dd63765f9518d14ec01105716d40ace3659687e27f6b6aea84a772aac0727bec47100faecf492ea65d926ed5d5d34ed6a6db3c7d1035a16591f08f09cedf0abad4fcaf5086b546781f4dbd3278d4fcde8f531596b3b992efc5a7113a7369a14bdb26a8f1080b1e13a7e803776389eb96edb7a8d40177bc3be0f28bf2a64bb690ae190fba85b10021f482bfbb1c7d1e955c6cd6ee17caeb2e8b397c6e45c76cf8528db8f74cbde4d551cb164c9c1eba3d480f7058fc597998bdcc36f5b5f1f04a179d2a70f1edae5dcf3dd3bea8c0868f66d3e7be57de0ac46f77715ef7cd07d4c5a3c988b398862534689d06408389a270b6369a66a5378745b9f2aa86fcb9c6db3b3eed580dc6552f875da3ed11740af332fffbe3fe7098a4f219cb45c93561d1fea806100b8dcc67ba65413e3b905b9899ffa7e3eb495d46ce782831787da586aa8c3b5cc5bf58b77ddff7d039818060df2198e9858cd961199b31124b978dcf4f11589bf4a3888301a14e342ca4bbd5e6b89611b5c353753fc7ae0c413d416477c31805bc64138fb9247c8502644c0224b99c80fdea37828e1253b892658b9591fe010fed1f42e8a28b7ac14301b45b7d7e246cf046cd92c6084827360b411402a22547a78ea63a80962b2fc60c69c3391d7c0b2429b534e48206b9f2581d805544da231ba2a4d9f702a23627c70210f08e0af8dc9214ae9063c5afa96249cd14f94fcbe6325049f256da42e24c9220fb7be600219ee5c06c7ee57f59463b657e9bd50cb1cfdab457ce9eb3cc12995a887d5980bc65c1ac51f99810909ce80ae88e04da59d6476b8a644bab221aa502734575203b12c05e791f6d33322dac0ac1140b981b5581ec8800fbe5f5e00dc869655544575a682e7405304702ed2deb83352045ab7513ad7201b9d04ba01d0b69b7bc8ed600292dd795e80a85e48056817e50a8bdf23a9a2624b6b86a82291422075a07da4321f6cacac19a23b3e5ba88a6a490dc2835d0e3802d6459650171444955fa3a7d1615d18eac89c0f4447185740ade65d4e17a8c4c2ff015ca101846e8a6819660be959e65af6038f59e7f1b01ac2ce956fdd8ea06471127a6a88b80edcdda7bbef0027f71ebb0925024c4dbaad36cba3b58df4f1dcb06cb06c2b15063d00a0e8403cb450380767aebe024c6ab4735241ed1e28059b191ef07077961cc4c64c9f79389b8103023b0e6fbcb212b08981735f3fd71909503990bac5c7e58c49623662246fe7f7964a50033b131f71f0e9942cca8a895eb0f87bc34664860c8f5cb455c123122b273fde5212b88988bdaf97e701095838c05a67cfe78648b11732256fe9f3cb2420823b135f71f839452c8acd8caf78781b830642432e4f5cf445e0a1811b373fde79095440c8b9af97e18888aa3cc45562ebf49b42937212762e4ff9747560a30131b73ffe19029c48c8a5ab9fe70c84b638604865cbf5cc4251123223bd75f1eb28288f9132767dd46b245882d72780e6efd77aad265eedb4b84e8dda55723b69d2280c62ef2fab0e90942f5fa2557039b7e24a8c62d71f158ec2d0274dcd2ab8f854e2040eb2ebc7258e83501b5de920b876d6f13a2e12cb89e58761221747ec9cbc34e4f11aae9975c2c58f42b813ab384abc566bf08d131165e5c2c7a81107a73e9d560a1af09a8774bae1c167b35b1349fe414cff74d81cc5ed8c9b94cd2f00a3a4efecc826e73f4b7dcd74007c30dc37521bb78fc429fa85e2f633221b82062d220578d080a74e9963b505627145cd330a94ac03ae50f81a5bb055c3cc7f0b5c399ad7d31c3518ea81363acd0ed1e6b43403afc3caae17c382a1f4ea7127f8c7c2a6de48e7f54e9e96341feebf8a60ea3573054867aa4f0838be382b17bbaa49258a856e19b386677426b161529f0c858dd04997d417a6d471caf11dc094e0e72d8f18dc4f5e67a3449ecfbf89cc04939b7397ae1565534992f018fa675bacaa3d3d2102954e6eeee8a6f6b21f9a4738aee0c796ce9bf98727e73ffc772758621db8d34bc8db42bbda0567ace869a44dc142b048c7ee9a8bb6834880fc80796165d6822176e2acc124224701275b491160458d4917ba6ff1137ef0cab2a2bc6d013b84e7e1e29c3163c961da8921edd5784d84a0f9efa0432db155379f1266fbadb50cb7e0e083f878aed2f9b14cc17c782585087ad4d33457711e1729f6084f1887d42fd4644d6a7ec756a363654d63c8ecd94676ce0e4bd1067169fa6fab643d27d224cdef44a908f2715c3ebbe35adc470a532f021433382ccf21f2968b384f46825ef81aaa80c2d3339b5efbf6b44ccb07a596eb14670e09adfe230569e9b5a8d16b1b8357d966c8ca6dfdf7baaab977e4397553c99d4c5650c0c6f1ba113e1723ec0853073d33113d9e97cae7e9b6e11d093bf854f3f6391702bb13ed261bd4bb968eb0a9b736cfc69b186dd11f2d60d349226e25112ec0d278f5bdcebfedc39492420eb69c221d67ae5c5bc2ec8de209df94549534b745f9531d56441e1926e3709cf2e87dd61356f6a6027539e119df563d19f63a28ba7af9e9ec79e3ecda97d00bb694adaa66a9f55ec31705632f84ca7c7d07dc6075e7754df867dafb4e8b095372e3c6db295cab859bda9df10201f79f6120107b8adc98be26969ffeb21611dfd7e7794a884ba5c9fc7fa3c75734a6104cfb910fe75c748e1fb1e59569a5267d9e96f054bb3cbab20b38882825bde1df1f4f62d6f61710444c18716487014c517a058f70fefe79e0be48034f5524de6989b7d50b7b65457bde92ff58026f60c18a9cd8c3a11390f64eaca5db8f721d5e137403cd7adb664bf5833941d4e73023ec694802400d29c5603c065d92ba5176ec2eceeca28c5c4265f84007eac27c14eb80a1d4acf4bca5e6cb240b16510cec5a468e64b4f7b7cbca46b7656195eb83658d7b25f7f179e6122c3fcf88ded36270086c9e67c47caf7c66c96e84799d51f25747716da79bb600eef7539d6c8fc9bcf4ea7c8d40c7a06b40d20390144f8f8f54b65f1306b07341e2b935b88592092318267b14509eebb573b5bb439a0cff63a25feae606a0096c4761b67a0cc28dc5d77043b944e5aa279045c217a39c17f93e0b6eb2481ca89c2e5c2b9794690fe9a8e821ed412200eb7684de10e8fc44de51706fdfd8a75b326ba1b32c53e083709700719baf45b5f30a653bfb002002cf8b21310db1773bc429442bee053a8a2dcf438768002021315fe01d43c7b50f26d4ada50a2e5d066ba12e27712f076df2f15685955586f194189b8c005c5a22e0eaf5a114677c1052c12b9c9d752666d3b99418d5ed2972214a32eb4991308974b6e11085db7873389a8598a6bb5d72bd447fee13dceeaa09a8a96a51326abb4d9e9c608217e9e9b8e2c6915c2445f4df18f6b43452faa6b3d77596e34caa3cf92ae04fbfc0227c91e9c087611612e5541b93943b1d3cac13819d66aa9b0130b8a7c55b2bced8f63134cb6076c2443a918f5dbd52f16b1958410250f56b4a0639b2e7ff484ebbf8f41d76058c20f76d70a1469d3165c51da10067bcf77c485ced737cb06d4f94d8eac408d2235c2ad2cdd3f4526fb7cf44d6a0090ed7bfca0319af4b2144ba13806a764a4e1fe907bb8193a4b4e1cfb13e0c5b85013683ddc08bac6748345c19d04a1d515e11d55e39d4b6f0b79e6077f73823bd2a506e076b73a60728409d622d6b775db016fbfb6fbe56ea58e550a825323d8b552dce3e70657add147d15b1fd00159a2967242fefa37d8022d17a0112e373a3201fc1dd32cca4edd3dd9dd8eb20037d12545596dc1818bbf09b676abcc273ca9b8a08d7761a8515add6582f9c7249f8a3145a461ec83d8ea4aec5adbb7035d8e66e8e619e20b379d7ae071d4838234b7362f981f389dc18afb8299f4ccd6b4c5f308149f2fcd89e888f64d6bd44adad62f3c7a5eac3ace4a7521248976edcb06a44083741105aff0f7c2a6fa71f3dea9287372a81f17e29991e3bfde777668a19ec16648c4fb21c21853aca3c045f3ede91acf102aaabcfff8c6a8ad62c1e612f9e741c102f8ebf1c02ad66fc5af60902877f279094e312954adc70c1ef7d12b855c2333d14c68732ab73a8c93e00c94565b1e755ccf4113c88e8d47c432f6006c326d8359a3093b6ebeb9512414233e72f400a1934174c2d82b1cbb4df7cc3315e84a12b50de71b60605ba6ff780859cd2fe063eb05afcb6e383537566752976787a58db6be0eb88d1884912e51950740c1bdc948cdc01bc7da5a585398132b9dbccc96ecad097c85656481f4042b28b8cbb2013d07064bc1199c3f74968034c15a14781f8086f0df43389122ab3ece51ae1b83874d59c99802d05b34d4fd06e9ad58cbf487a4e78d23d6ed0b4427e1ff0f47c2247cb90eca4688ccc5629b10dc830dc255a72dd65c0f40a508b24deb0e5008183dc1061ca6d06408b30208cc00e0bb5978aa5ef7adb862434e8f2d5fe71aa0a57063f4333408ec128244d7c05d253c78de38249c12bec676f1ed2aa71e350178565646338fbe1e155fe52679d282a68e05be44483e463701174012fcce3af8e56e49b4697ffa7df43feb06ee718a7d6e1615169634f3b109599fd70fe49dc9d55215585d637297b086ca92faebf359e77dea47703bbecb70a607f44332795f64e5c267f33db1e44420ec4703d661692d9b6e88d0e4f4ab55d9c0631885b1f44f36a2be002ffc01c89524ce544486aa82e15ac9884a7ef6ce2e5640d3bd334eac12905426b2b771418a99d924c55859504643e828a40d69de91d013a2d62c61fd5a958ee518aba792ffe79813305fab11fe67f9cd2250efaeddd98264b3064ab3db1873b13a0d124fb6a171b504f9b624cac3c6082ade878d6632a4f07950cd4ba95366c1bd42bf96ffd2d1b56b5483c140c0187a37edb84df314d538f61d0b4433a04b174b8390f5b641b25aa159e81835f8832ab19d3e679fc4914938ab897158bc2e2b309112ce6f69a542c36bf861df3c06ebdc296a5189fc2dc2eb5748110a7e749a4622e8018020d22aeac517a42912d56471d784d669a7c4386cf52d072fe5113700806d77b59cb2089786d9439212740acc868e6f7a02fe30c8f6ebe06bf52fa5328503819945d970a0f970e4355dbd9464a31f90a689e7cb3c7c3435ab31656d667077cc1060f53a6aae3a6d2a767cd050bd367b101b0041ad2fe2bb23f76944051e6df5a0c49a329167b4728f7ac7ab2f0386e825b3381c4ac68048d0410f03c65b004cd2b8395cc66472fd3513a05913f8e3ad944c8d45fc5ab1d12fc6b94c6ee8234cb56ea083fd6e7142793418a253a032874bc0a2efbd0753e6345a4b53d95403c4d40a9ac3c034d539e661ed2ff06688789e6ac1b8e76a4a3af3b940cde3c5fcc5f41526002e6975a8123c3647b0e1475a5390bbfa7c6899056bccb9ea0695e38366003dc56a62c658b1b4d990cd95554f7b33c472aed4437dc505eda3487b4e57dc61f3d7e9dfac66715275fbb41a68f965a002f3c221442f3864d53cf10a1bf5318344b1decb3999b39e1c06a8738a439429f5d83f966573582f050754ca212366ddb19e5784ab41ce278c187a92bb2a24b2bef50dfd582f2624fa81ec1206bc7fa2cebe5f5b1b66b1a3c424dc7228d77ed211341f90d6a7932a5c5f0b1330eec3d2f1ebdc1d78e9f3f69c31f0b268bc545794a4a76b19df37ef42d987c74a19752915a78aa64fc5c016a683ae0ca14d1a4e6582ba079f862e9df0d5635283e04e7c839350b4c1c60978050ae78f13b08fdf37e155b36fc2cf5c7e5d72eaecf2c7573e56ada22f4fa491fcf05ec4f820ceb571cb817193dbc07ca75871439caf688fc846a10be9cc03620a1525b233e2282f2598dc616370626d4b537b7e9d43de831acecff895768e953f037fe2432ac3b1bfdfd55d2d476ee491ec11d6b6c7b8e9e5276b0cc7df4758636ec743d2abeeb797a8b46682a7a4c9a1d8e9393c1185e84ed1686f9e385ce4c0ed0ff7cb518917906229432f61dd48563cf3e3b94cad4487eb08b1758e3660e914b6f351479e57199c33b1bfe4b56248e89240455c245eaae2554a54de941bb958890d4af51c8986951950fcd12254d4ba78b5ee41c400327ec2eb37701c591987d91333942a980f327a70055954f220f4b826cc79c099550309816de8e3c814557d16a1a73f0f8e8139a2135f69f187f25cd5bdc971a912ed28d0af229bd207792310f7bc3a9732f70c187d0cc55ce5545ca726d53fc00a9f3aec619bfba0ec4b4852776d589cd315b43e07c13311258379308c11b975a438e38cc50a814edb18ecec3f8f33119ec7c0bcce20074ea60cc3750b05683cea2f486ee98eb26d17515525c3ed37cbb10a12411dd1566cf6eb8f3681a0e351b388dd8303ac60f8931fb3ca71f561e695113b976156e7e9dc11311c9c118734e5b92341199d10957bf496ad371c10fa947cb48fe2d6436828a5581dca2c7668a4afe42c3c1bb23fcb258ae3ec47ebb44ef07a73a6f4f24cb9289648162ea6b51bd85329006461e921428c310cde6125d914906222753416601d453c686078cc6a5237b78736811659927c43a2b245e5374f0a0788eb5d63541644471a390e4e62b27812b3e2b84f2f05b049b358b0546aa1c30d68854227a2343ee3293d8deaa9019047d9f5d50b172545d6e8000cbc29a6d1cde162c1f4b91429e394314a4a3f54fd87744ee82304bcdd1d55e0310c830602c74fc92e094a8b27fdea2b286b8b09ddd78a89012d66c01c6a84545727629ebd5cd96c950c8548ed4fa73981c7039064185e4f28f72fb60e115b93835df6938d8040194dc447dd971a76f5d1a85ccbfb05b2d60a38a8fb47f22d95821d1b53d82c79402b872db5984a55352a181ab3a5e38e45e8091fb015db034184637304b5eac0b1e9c0386be3cad265ca6c67d25209915c6bb0dddc0893cdddad9027c4178527ba705b8abe9a95a4138a84a7487e95651db272e7b8dc344966e58530362580f8061088174a6ebafb67646227f9a89ad0f82ab479fd8afcf063536e726451460561b635465adc3835a05cf612ea1e97e9f91fbf8be34d6b264de119ea7d1dafa4b3a76062c1643e22ec7ea17bb374a24a893d0018b73c1a0d42aa9721b42912532ec8fca885b59014935543f0149716dc72f86014e2bb74badceaa228d5537bf72b538a27e52bed4351a8a06ea638797869c25b065924344010b811eec5cd9f60455e81943189e473542b34d9cb2ffb05c5097dc2cca887be639ed42a2f8634f496d784d2020eca218bf249298b9a82f3e69355ca54a44b0ad3f4cae5eab74e4900ff7c8261c38be5d2d3e7a44b79512daf3acd599e7779522c0087711be71959aaa4ef741648cf059c60800bdb9b96001bca50c8d385a9b02cd46485c3958f5bc850d3491d61927b524424114be8660ee055559ee32c4a6e488c37272409b062c52059cfec17f6356ecdc22eed08112cd85772c0e469c1683b673d84eff8c8a82db8c3faec2e5c6b62726044c6a8deb90dae917dde4d0b93311a13ee12bd904f179c601b49e826b0070dde35039fbfce2d4976b4018a876641e1f348c50ced53db4216c4895dbc05ffbbb54cc74222b11514a533676ed04b2b50315eb5fb75c139c84e5301a0aa9f21666ced5b425a0008fbfe21a3b60957fb1779e379e8d00ee2a85a8dbc45422ab71def9b92a992bc638932ee17a85f0f425f3ffdebeb9fd607501f3d35233f9e40f1c6fea8c56491babf5a2a0f8c08d2f54a98eaeff37dd8fc574a9a60212bb74ee8c4650a9e8b7e14d2040becdddf171b23c5ba7189aebb14ea0d7bdc5496e316b2c74a9dbc235d0706bd92a2e0ea0bdf48c5e33ea053a9e283e4c67f94722cc757b392ae2123124f03c88a52a8dab26b38cbac4347e1f70a5ff08e892f397159e57cbdd15d86cdb918dae75630d32c6724bf9c2af8563dae3b8325dd138534984194867173e7d9e8b906ac9e97667cefea387ae4a997dda43f1afb857c220128fdd3f12bbaaeb7fe0d1bad7ceb4b532f1456ccd5d7af3b8d66a74706cfebe986c183f3ee77fc7e3730f487a51cd8770d4ce115ef8ab2156baa07912d3ea1822d6ba0c5be7777bbff161ec792de29f2940e10ca0ca162708978450a12f97c1c5f5a631841d3e05991e4dedb4eec91a8aa641ced9f0d01ca8c4f991b117541c19fb4e8c141d9c30f37c0378f03f10a26adb849eeb21a16e2c6576954490c41ab7a6363461e7396a5439d208e1b099c1f9850383a402f010eb8a8fa566df863af97f8301e8359466eafb6df57c36a0e3ff90f9b214b6d4ff2879eda8058e7b6b3ed7c88c636c7e588b0a72948fe10a84f23923d37f1c172e21f138f3d23e34391fe85bf90bd22742bcb86a7d20767d161acc8db632593d707745b7e38be07e745ddcd3ebcc1563b587f208930f5bfa0e641ca8939052eb71e6fd74be343818e68a311b680a058c6bc4af003fe3a21d5082b94a5b6bf4edcd6eef6de7ca35cdbc4bd7f88da7bd1efcac9c223e6ebaf08d17d883cff270c85c95b6060c6e66cc99f99e2f92ae58f5a9e798a8e6f3eeafb0c6a06f9f86c7c009d53c6585e1e8e9de8edcd4efd4128a7f046077e353afe90489ff612808368f4e0200f6334b8f38309d2a4df7541515a9d65e727e8acbfb85b02942e15c2578bfbccf676820298cb6901b4b7e03b8322fc15ab49a73f19d7361d84ae9a9947637aea0dd511ad61c1040d2297b8b0a9ea71c7803adecd828267e2ea43451b878d47578444b3faf416521de3205af9788d1bf64bc580e0b9c16c165608bc544e9b16e6a13225b4d8ea58f2425772497ccb8f8a8871de6d405fd746fc0b15af0dd4bf8042b8b07bc8c5e1a656456bd1646676fe0c560a6e067c5413a9459a88919765fd2dd0f58b50a48e958381130d881243bb127fceabea4fa5a112aa0fc5ed6bbfd638da931efb6a48e439191f010489cd32b0b31e6b4553b5a41471a85a90ed1355afa5b41c2dbd525bf1ff945dbfc3b205467a2b602fb65ebf4c09d254b2eb2ea694e2f3b5b239550db193ea969d62659e1a015f258e648189217544a0af6422b02f0e5db2a1af4aaef5c0287f9cca3ae03ddb46d3f402c52f36a4ad3675affcfa6bfff69b7689f181aca4acbb683e19facc9fee7ceb50e32536e9db29495a41c93e668ad33101dbf7cca098506f49db7c2e4f928212cef2ac534c7bf489166ba002ba738997489e770c76dc963667b8e5524e33039abb17a6bb6980a6948faa82fd97bf5cb25cd1004f3525ccefd5cb046f2396e3557c24e83e7e1c664042d3762bbfc3fb39778568fc67363696be9c8a01b580b35cb6be6b46ab4ac055f09de5ceaad881403b310c8d3d7104356d3cb109e1e141c1f75de703225d15801fa85784251b785996ca76f9884c5d5602ecb3568499fa1ce9b54dc7ec49f8482d41755fc20d89175a1b06d362265af4b2c3d07ea82c5657c6da0b660b37a66ebe6536dcd66297cc53f8d3fa6bff62fdadcbb21be3c3e63654eaa9a0e2b8977b80bdbcfe23cdf57ab952d2cb61635e5e445ebe31c9efbd1b6ae534ce7ed0e5043b13d9b6d1a09e8e81080624ba036aa12e8657205816a703f9819b4295991c26757055b82fe96e34a8125773129a97aae8feecfc88f8292ae25cdefbe214013b2845fc8cebfcfdeea32ed63c334d3907afbb01306e789d8d7d99b24cbe15ff2bbfeddd6d6fb9a54c29c922086e0865082017ca6ae58c133178d272c44b5dedfbda311848f6b6b9e8125d97df43cf35227288f41bf8da1645475da04ffddbd8e28c81c7d54298955b468e2e548531dcee55c49121da6ac86cf9a967385538ddf13744fac97bfe86742f3f9def71ba0325b889def3a61722f15e14f6d7bd28947e9aad71b26eab3e1d3827f4f20bc2395f28fa49863cd024647660284412ea54daea36385220eaba3d65a06f9bb5a512eb8e0c2473d49caee99205c9648e92393eb329cf992e3f7533500ef3d93fc99d2e3a1dd4665ab7ac0134c61d1b48ca88707bf410c5ff52a97dac3505e99c6dcbc2ca58266d247f75570d1b48025d1cdf8080569427e59658e0b4180d9b3c67cf6666e7d9546b588b81c3375ad82fa6f1d7f193180c44a5c59101004c654db7f5b7b8591c1e1ef73baa9b099259fd97959033a328ac0fec77646f2628b9dc023e71109c059e71e743105272cf6d5828ec868db01899359b713f577ef2d04f959f9c59fc04abafc819ff8ebb7f60c7ee59875325671c0b3b36ecfaab9fbfe3286baab46f335a0c3ef9cb8eb25a8d9e4dae61ad86ac51000e173e15a6f1279bb66d75ab9ad69a0264cd08a4e8353e388a59de023ef97b9be13280f5ccdc09ee197425e48cff085c49cfef1cff10d8391d14f65ce7409390d073cf21098544fce47f822acb09f17777fbc08259cc624d5517c0bf87a0ea1a1ffd4f9a7d66c82c1f66b399aac539552db6142ca9e73d3df349a93837666656a3a767f5faeb703269d1574eae4f958e97f5c6d2413d9be9c857b779dce3038f0f9d5729c4853aaf65daa9e3083c422b5ba7aaaa565df3829c4e2693d99a52266b56e17d1e15b57893999987300a08d6b13f1208f6c9019fbc99d5203fe1f2fdf82e87cc52c352a7325953256d4ed77fae1ce5393e5bf7f975706135cdfd4315d871aaa6ca513d5389c4b0e3545def3b551368aaa66aaaa6aa67ce6da31bb349811030856f0b4b58774ee6fa6fe0f51bd747d77face17a3f7b8ab9953842278f23ece839d5bac123f449b0e9d0e8f4ecc63147b58f4f0c34f5079a5af4dda110d193422426ed4dfd2ea24762d24c1d9a82c43ce987c0c03c2914220a212ea19531df27c91975ab5b2d92625e5efbef9afadaf3e81aefb570f469d15bda57d1ad1730941ee2f8c94d3a2f6fd2417b17d29b86700ee9d954811717d2cbfc8d1f42fad18f42215ec2286a68caa17ef8fda4d01444e66fc8fc0dd390d29bbef4a6973931a149fb984f920313923ee685903e26441285f7484cdb9be8c39042d37c93f6a497425e3ee6634224a62d3c22c4e5edeb2073621ee687c43c4c28441442460ff342d810498fd7109851a803f3129a667844079963d2483fc4e54921920f63432c29dc2149ce2881483ff6c851bf7f7c1c2f735ec2284c397491ae2b187a1238fa17b0e56340978701edf367d291791d648ecc0fd1f1a5979f497b2dd4b9f144748451f49b1e3469323a748451d452e961625e8852e803cccbbc8ea7610c1da9949f489fe36352314ffa0ac07c8ed0a443223de7bcbc3ce7bc3c4ecb8032c7049ab4cff149726e80262d34e9c8bce97384486ebc298c22f4329f244706bc11de78ebf242dc08b9c7becc9b9e86314ca1f493cce871b8fce82b601f47f89cd3d2f29cd3f2387d03e49c12c8399a4f8b3e5068ab35764a04b64fa7564f7c7c644099d34f80a200d150ca74b956ab2d86543d9897ce051c81cfa305b4626f5d3d11d82993cbf694b15351ba46037275cd4be698f875790a50bf1cc6b039e9cb6f6e73e3d015767e3868e12849a861b87f90a7d9da7713460b6b9bfbed473b3f7485cd71a917b344429d16a77dd5f4cf470d400a3712a5e327be3182056d237cc32d1d1fdc299bc0ac27ecc3eaf7a4117e59f97cc8a7d35ba485f245ca481716d3cc9f22c847c822a4b803d37012f2347f9271e78f3d1ee0ce25eeec959c9993888ef7ccea03e4e0ceaa317d7af9f3a1b3d385d2756ee897433f9d6c61097bea17bdefee169658ed76ef3d0c98384211d6c8d9e9de7b9c762f7485e52b67a3be97ec83c7117647e97f5c61fb8e7f04071df7fb0d748267cbf9befff3c01e72fee6be7121ffe6fcdb3770bbf2f3b0449234fd149469112cc2f38aebea4427794c665b62666ecf9ba51668a9856935d6261565a0a1659a69bb49e9943c7b761bc8540bafe4824ffe2bbed144e7825132f0c99fae98891517ec6ae6e94dea69301918f5834f387ef2e7e71f16c73217923022d2a6df9f0212c55b704e7cbfc3944bc4515f58e78f8460bf173dbb80ac0bc552fae431d72808b67e5faddf8878bbd435dbc4a1022bafbf1372060792c69f03d9899c59b1941d587eb1ab45b0087694414138ea4706f19c6c92a1243a57ddfec0b130af3b719557349860a7044836ed47190433b9baf910c1ecc82eaf0bbb4edc6a8f90a6813a57ce0401ca1901c10601393b87a378b99968326bd7684f1f8a7f09641037461c91156ce415ec46a97ad4b585dd4b0bb6c4795de53927c79e0ca2f785447d4690489035da1741daf0bfdc201cf585bcf213dfd090a3ac3e1b561ca579c5e148a3c8c031af021c05ff6eca633013a4e8cf51f846879de0c5758e12057649200e9233fe0b0082c32e094479355d937aa6eb32744d498afe23e82251a23cf977d334a78b5f1cb4c353a4b08cb3308ccbb8feb39999081fcfeb28a5f46f13e19b10c81f8c92fce272fd475748189d1f84a36cc84d644b18fa7f3fd7bfaf8bdfe56217bbd8c5ae3943eda3075a3061c5cc54f479feb651f6fd4bd226f4fe37a4cdf6fe38a44d871a8938d8e1f99c96fa2210880d087be97b20101d18430f3f75600c9a46e4b26844e48d9bdaf61cd76d60e8a927fe10c029009e486f0b08d3b6c5dace748a42e16f5b0edb739b6df916b0879f5a207ecd012116fc8af9916bc2d5d1adbe725fad56950833f4959cf1245656fae48f659b59ec0e55729d2e99939d15faaa45f00b3b83e6939e554c2833ca9472a9346ba5ea993b9fa584e5ba159d1d3b76ece0e131c82f06bfcbb5a5a48445c2bebcab40def0c034cea335e5206f8b47e70bd8c20bec894b811debeb4ea9b0ae196b8a47977074165c7f1b8ead44e32ee4c95f148ec2d191f08523b331ba8baf3c9fc1556a25c562b158ab98d02530c0207a278fc11a8bd5181bb24530df43dc2b4080c2ef7243d85a46d78c9a6ac7f5ea4a0339e33f5facd335db0e5d511fcaa230a02ea067d02b940daaa24be40c738b4271d8dce9e9a427939e4b945cd8b65381da448df18d16ce17d3f8aa36c1286f62f60c8b15292f17eb89931d9e949c093a03c69b985de79bc9869c50b88217d765333bd2d89c6958b4202d0b4c8bf1c8ae6b53d0903447980212aebf26a5fb32b42854a05c9fd2555c2368506c21699e7869ab96e6735de3b9ae29b9fed40945ec481b2b8d6a257d2a83ca681579d343481a9736fc4e1c713d4b2fc1727dd450705f9e3f1fa2679791fd3c1a8b89c0c6f202f6cc0ae87ac26a273c2939e33d5de32a12f4895f66c1b2934509ffe84abc65ee0d83bdfa497743e928a95e754ff3901e86926667812618e562f009039589baf2267cc531ee420c867115f6829df00a8fa031a9318e8ba9982891418679475f854db0a34f1e7fcf022ba36bb66f959f8266cfa56ec50b7b498b211556b6d84b666490e1f341bf82a14bc123950b6d95ebc2b179683e1f737acc614e65fa18de041a8e9cc5570e7398c31cf672a2b19ea8a2ac9c256de83777c48b515e78043bb24f87a3c68489b4610e7d481cb7558d4ea64e288b52262d1ee0009f8fc91d61433ffa6ade2e015e48861df9d53b3cf3b7679f57cd91fa24e02c65748ac935808d4dad5cb7558e7d6e6cb0e1f3d1cf60e83678849f04dba55ac8307eb53845cef85356829ca1f1974a47da009133fea1efbbafe1aef13e0583c1d8a04f5a6451271e48574c542d32fbb89c30100d704f550d527ca3853a4c235f2e2951666c763161976f6695e9c574c2f5b7a3d077b2fbae3f1fdef77cbde62be8e52beaba14e8d21e47558daa6e89f278c979781a7e871c666147a157ddc27aa5c4dd2d5fc7fda4c6449e0ffbb0cf086c292dbaa2c819568b4e562219aba6344aa74ffc332c32cd8a56c67509a3726da0311a1b698c871dd887ad982f15d3b0158caa66f049759965be1f5f35c363aa9894ec302fac1599a73ca3adaf1665420f43c684529ea6640f71abb9ea15afa68cb957afd7063a00368103e0ed517d98c6a7aebc89ce039eccf181d1993741653e7c43af5032a81a3b88d1181176ac31719e214ffe57aecbe810b329a3311aa3311ae338cef27a7158633e6ef8814303aa1a5418d000a64ce88aaae6773978dc11b6bf7b80c7da75bec2af51aa0deb5fd018743fa9938f862b592e8d491b1ac81b5781f32b083fe0178d4925211b96569127ff3358577c281badeb7fe3a331baa24ca84aced02554e52df77196af441d27ac5ee97c10f87c841e02524640488e1ca51b5336653077984781bbc9f5ff42dcf6a4d23a6b5795c7311a9bb18eb1b792334e5a6445e91a1f2c77a4b11834a0eb515cca48633cd2980d3406d3112224021190c01026d2a9dee12cda0426c051e056c023810e9b389ccae7c3615b583956f61013581ad53c74e77a96399b5168e3fa0d6341d2f8944dd99465e954ef4cd994f5aa9d28d19e684e3426da121aa3313a2de09140a7d2a73e8d5ec6f5d74020b64b4326c8197f0f43d290402718748247cc810981d880b0b75f03df8f8fa76400039f8fee31f0ddb0018ffd4a8df5180e8b8df575bdc586e52b55aa8c5f2e98273dcfd7ab6b48307436d3d9dc5635caa0e4b6aad10d6c60871d38e03d619a1a30aa82c1277fd235382f83f5761ff018e4eb32391306182f47f912a220850f460002860e63c18e1bcff5a70cf3ce2fef48205865ac52ae7fcdb8ed5c4f8244d529d2865bd5e77edafbe58f866167bd4348328fd33e4c41609ef442609e04c3313f6d57c381a53b20cf40e9a798977921312f43fa98f015f348603e26e4d776dd95c819ff900d4b5fe6c0901e66474ad79048a153d0838298af098b79524cccf277463ce92812cc8f3a607e748143be9937240260ba2ff423bfbecfebfb422b612a1cc4b3dee1d8e78542a1d00dc58032679e2167a0c034565a9cf5c412d4a27720df18b0731a7422e649608967cb89d1d1d35f82b5e854a695299b58ee94855d8c5336d615533932cb9036f35b546034467ec2f577987b8cbbce578b77d553e627ff6db3b6549a29e01ac92214182599f674cd9436678c1a112b285122ac15661ad7a76cca2efdd219b6ca3629d3989cf1a755349e23ddad29e9896d9bb53446631cce57d7cc0f78fd810f7c3ebaff0008b63bd61583b5ae384bd7b077936a4cfab6d2a8988ff99898d077b2602983ca94981f3b8acc8f0de5c7aea2144a5f72653cc6619ef4386dfa422a2c87ac228135e6ef1cbf58d5ea9ab1c6ba46dac4aa8c8eded47aae2fb9ae299133313b8a77a43123357684e51fc7cf47f70cf62df2dd50c4ab31695345a2b88b578d711581c7af66d2356c480e43b6206da412d71b09cdab73951d6458fa9d5281b45102f341ec63054b96eb3b17e554a6a07ca5a451358a85c25ec51226d743273cb4f892332e73c6ba3a5dfe422a2c83da75f7771813541aa5b1ac8cdaeafa87bae60b8d05b70b79a3a940d2bca4cdca511e863cf97b95cdcfb0ee57aeaf1c267ac1fac52f7ef14b5ba2f5809a1239c32f7eb1e6d335a394dd2a5efe74898c56719d3eb94e9d30b91e8edb168ed6964ae1f8e27c98077bf849bcb1f58cbaaf28a3933ca476e58b573edf78299924470ea1bf0d39f1c8b2a7743e4ee3a07dd3d9abee884d5dfed20a6c897e0ed96db914a56346b340234643166854817aa92ca44003caf4b59ef4e7d26f4f874f87d0735fa2ff8e12620b815be8eb735ad564619c115bc28b007a72cf7a8d6ec198c67f0d46f50b5a72bb7e5ec0285e83595bc88d615a14e1ba37aed4a28858aa0a3da0d73369d3fd836eadd1335e836f7a0bd93ef056b7357dfe7068118ce7dc601c8644f54f0bd6b29dc8db31c5f2fd5ad2a1fcc896b562abd5f37d3bb2f48c3e9d1d20477d2f7afe0ffcbee58788de8abee5452fc4e8bf9739dd8e2c9665bfc586a6feef47a3377528e4fb914988e85d5ef42eef1f1250f67d53421381f502dbf2f6e76b2d282dba11972ca4729065f4489b225ad883f66ec4ebb612d2a6732cb7815aa444b032685821a2d05e88ef5de67743cb14e47b9717f2bd4b28fa51c8834c14dbe2359d2eda5e04f6cc82b3949cf1300d5b05599386b4b902ab5544af5a37c802a87bbaa7c56ab15a2c16abd25ab5aa51510bfd91f7e295a4b063b77ab688b69e9033cc05df74e7a0597d65d69f8f1fb88dbba3063c76ec96dc9e55351cdefc6ef88122081895180cc6400ea4c308931968c643b8fe332698cf476b74bb188fc1d1ed969cf1d98807505c219bceeb7ab7ba55c33d55cd62188bc1e2a1e26ddbea562577b3b85b0d04ee1e69b3d5c7e91fee14ec15109ab48089eb9d7cb990009231c38e3d6b713ff6ec093264d81b6652ecd82d192b36f41df5b6ba79ceef1f04fa869e65ac60719ac17ab7cab354dd52a92d354b5134ecd8d3f3b41edbefd0c28e3debe16184e597a965a5164b5857de915d2ef04fcb823bb0520b1400ddb17be413aa80a15185185c91c62c0cfd58ed8edde380f9a67e4a04cb2e25ac2bfc1ce0e0c777013812a8d25ab5aad11d3cbc17c460144bc127e7b055cd7a0106183e1f4e7c36f5fdbd9bda0146f5ef868f8bf09c3de72401bd4070923b9fc386d2270ffdd8be5ad8add08f1d9f79ce2a8a9e288aa11fcbac198fc18f492ff9e9663e853fa1fd58d3ed5b9aa2ea9e16bbc759b552cd6d9b556301847e66251dd81e703c27ed66f0669861003bccf218740bc851a29fc29ff0264e5d57a4fdd0431f6286c4aa67c794596805c85d9a6f6bd1bb87fc6c8b53c219084083c720b37eece4ae8659dda2fe85507ce11276ec1fc80e82acf1810c2e1612d53d7e6af10dab68705d1ae1fa11d28b9022b73c099574150d96b8feceac59f7a8ba877e17a56f6e5bd54416acc106cf0862b00bd6b317fc4967712cdee34e3c359b990bc04a7413492345b7a07b4a4cd8b17b1a4b8fae449485f60fcf6aba35a78d0d37ddd35724d713fab17ec7eeb99f0fde69d19f49cfd89028265d17bd121689eb3e32024b9b204775cb51cd6275688a95e1c28eacba11b116728a79b6b023a7e61dbbe7867eec773f1aae4c19836312d5e5b05946a4ecb64f11be100a1b2eb1b31f79f2174217b36ecdba35eb59cf7a26fa3c26020b3ac943898f3bc2f695339bc82bde829f90db4adab470b7d9b6711777fb99e26e1c645bdc9e4118d16b71631e39b33dc8861d79b56d630d77abd94a77fbcd13a174cdc8473090a3a436f211d2a6eff63ad28657726607470591286e224fdb6fa328fe7669a8847b98270b368a104a88f9de6f510899efbd10f4bfefb1bdd8b1778fd4d46db0de6e52272d6e4fc1f9dd90e476340c7b2ba8a5aefcb8c7e96a5ff44346159ca9db51cf3f5310d1b7bc10d1b788420f85881ec9e845db57b053d7c74fdb083485defbd07f4f2916ebdf813ca5c50dc84f9beb075310fadf5760bef740d8a62267b66ddbde51dfaac4f2d3c6ab16472e0bc4767ff8812ffdf938ed59c9630b8b74ac4ba2abf527581fecbb759ad77d921c1387eefe48bad1e6749bc71d6119a4b7d3bc0ddcee9cb7e3a8e6b579e336916cb1d6e77a61a0b0f46768da3c3485deb4bdbff726eefd33857ed382ccef7e0385ccef42d3f6dd8f9e0385f87ba12948f7a3376da1902eecbcff5ef4a370fb91fd9d963762cbe9de9a3621ecbf84435c46ef12f6f0537d99d37d3ff0252267ea87be203307c74ff5394e081cc562fb6b0f03dcfadf016e7d2f01b77e07ce204ff5bb8fd19033f537905e6945ced4dfea16f2acc7ad0f7e613bc525994db36cb381b828a52efaaa556693728a5344e80c01c2375ae801a619c2a81e7a60141bc127244b64194b649650a74d168d603c70fe188e3c2ecc8f31301004b8b29329996acd41b59eb5ced704a3ebac569133dd61bd22692a19ddcdfa457d7d95bd9a70f7578b3ea5c50a83e88458adfca38913153ed58c1a0b408d5533d86755cd60546da2731f39d344cef8aa09f729a4374ffdd1573d66a852a4c8eaac56a932bea957244d25430d2e083003d50463be6898af09868a7d26188c622b9a99d90ae62a92b9260a3ca078e01b2ddc767adbe19bfe5965dbb92f03f0d03656f8f020a170fdbb1b7e3118b4c6180c465533eacb06ea041a03e3c5d5a736a9aceb7c53a7a837a0c20b16cdae691e3ab52f477ea1c346702af472f118a42f35764375428dd526eaca058f5f3870119caa818a01f38bf9622bd8278619fa01105080d73140cbc1ab2b087835562adda82bd3fc15f00df73b3ca61ce8f37328ef568382aecc342cece8ab1b8fe3475f1d69aab3b3c353430e0ce9635ee6774a6fc4d672e5e72af015308defdcb1797aa7ee58122467585602f92567f097e12401466e8294338c3c46e9d3a173605ee60b327360428ee1c0696cbea84aa632d5ef4c5e0eda646575683ab0cf310e9236f20acb292642cef8f3b4c3fce46d04c16032495f3eda89e89dee22a88d2b4197675c85c388d9b1c48ef5a519616b65b1c871b26d8992a674a76738b1a88650ad27a7d888909f18c128ae019f425a830a86a4f1e7d3c8fb42cc4f5aa34104fde08cb0e394c9ac2cc112648481b094167de4d55abf90370a7d558a0bdef49955cc2753c9ec993c2e782eb80045cef877313b5b09247a882a9a54859a8a6735a4c08ebe72e2acda64861cca7c144a94ebaf49b9fe74caf59f54ae3f3fe153fc78f3256dba90289ec267be7cec8ab26c8b673eee4dc63aab41be92994f9f41981f6f9002cd8af9005680966fced9f2cd1781324703e54d329bdc80697ef46a0d3b726c7a9f17e220bb90354d24123128354dd3b417cfda29f31fc9b1561704cbdd915bab21f00d18d5293fadf8462c2dc17a5184920fec0e3855468b31366c6ae58a327250e81322fa165260b9cf851f3b3207f14de8fd17206d385104248ab330031802b286539eead405e2a798eb0bb30089b95cb1de36b07b408514bd7bb87fd08276c92460b1ead70e4f6a95e2d20784526d631ad157fac28c574cd3346db52af57da1a93c69979306ea29edd350ba74c36b1c8dc3d3869033fefefd4835c159f886959044a4ba2e08b6cec08e9d1a6bf87e882834f177434c1ceae488582b53bfe84dfcdef726ee5ec8f748a2e0f09174ff0185dcead5f51a1a8003878ef21c85833cf9ab80ac56da6ab5ea55af7ab581dceda4b6da9ac80a3aefade94f10887ae5bb12dfaa26411a825b928d598cae6bee2b5be48ceceeb691524ae914083ca4db946529a73085124be1eeeed259d0f168517a73523a5dca3927d542295896c297668b7336a1352de81514d4461b1bc7416183823627f51707390703776f7ab3062efca6014cf3af1467111dd53b6c481aef56725bbc020705695b6d1804050505f115244a6706a5256c12b7bb881a9d3a8ac2fae63d68b70abe9fa2605f73e3e88b9d080a92335e586e5f6d35c00112ae48238b531a965e99451a4069b45cceec20290976f4eef5cbec2c6ab123971718528c4ce9060e530e1d4e9d3a75da820b0f863b78bc000018c453000410c38c0c343d661800010840001a0a50538029e058a0aee1ff12cbd2a88ae5a17d3eaae631ee75faf4a6f7c3b4ed98eba5522db164395e776e9bd329f55992a5f652e9fea88a9d2df29c1e02b960f657540186cb3ba70004ab8424765cb67405c8c25cb1c11ded43a1c42500645141b1f5ca2cae2821801558d29559ccb2fcc006f998cd9e30843bafcc62b6e2e1413453b18d84f4765c39df0339e5a720fc14b33cc5101205c44fd2467bd92c2e1cbb899c2133909f805c40409bc370470682e18ed2757b8a3b843c39c75c3e72c683662d863c48693ea8da7cbe99a10d4c23830d4b48a147e6d3cd559b3229ccf09946c65260d40fed7b34ad292067e6ff8fc7a1b3bfc5b0a39c89dc125b2fdc125b2d51e41b8e314d174186c859bca6c05e8e6225e4c9bfc9f5af1a9dda8e97956bedda2c999bf358c6329ea99c30162bcdd34c38884e4da353abb5d6aac1180ce697f6fe42b6d0c21f39e392335d7bda5639308084f00d6f2199e594e6275866999fa858af07d6c42f734cdc3304ebfe1c964a1206b20556dc1948eee11bae82892ae48c5bd2466b438a5790a2f3c05d84ecc1c24d8265adbac00e445af487f5c81997c9aa4c26639946a7cffb5081b35ccc1823fdedfa04d1f0c0eda79e3592e3f617a1e198e3f673620c321cfb678edb438e5b84fb51738c392e573b346cff37c71c957eec815b84fe46bb508f8ee98eb6695be5667353db26a5734ef6baca6bfc748e5230bff3b6e91d0d694d84bc9fa0474790e4b24ff6c071bb73765c881d8aba6d200e9cba53dbd8351f5b05c769396e2b21ca7130fd83eb01e616e1e877dd2247e9e4be4e2e1c616e11e66ab8bd12db3f964a258fe3429a86c4a6bd168e20c96d0e9caef1164a19c3fc19a2da6fcf6d1bf5aa51285da8fbdf363727d7bdfde0c3f5bed2ed470edf9b55b0fdf6e78fde9bda08641bb7e547ee47a1f6ddc0859e0da9e8bb341cf9ebe7c3d6c295e511f9beef3322de5ac11ec4aebdee46b1866a35f1f620de16517d7912fdf72ddf712e2010f5ba70b3d62de4e2f238ce85b4d9e32a47f2c7df1ada14d87e17d3a86954f3b4f9385dc11be4cb4b696302222fcc0f09b8f56b38822417e6c7fa9b3743a12d7c6f9cb743a18f646248a4972191b649c281e36ffca8fd86e36571bcf613c717d1b690391ce1d6a27ded06285bb45f02678bf66540af45fb31a06dd13e098469d13e0c7843c660ff05c42167ecbb8039a468df04be3cd93b0a4b72c6fe078ee2b5e13712b945be1789be2e044405e5d4b45a1fc7ab374bfd31999365287466cdb7ca3c9d8990962307ad959b93a3b4bb2bad5b87638e4b7bc871399ee198e3ceafcf6d2d8eea9e8e39c2ea8190b675b4f98bd4ef2ced7e4ab939394a9fd66deba17427b7fde55c58027d4f9b97f26079b845ea87359cda15d80bb9c06e4f9dfbfe0a8a5db3859b87251c7fed37edfdb5d7e86b4184ec7f2ccb6d93deee4e6bad557bd7b4f75a04a2c2890bc356e3d1a8d0f7e9c51e4fe4008a99b1c68a7ed7021a36d40ae3fa8f1d3709a280ca7db9520b1410e176ecd51848d44b1bd2a54eff8926977ee743c8438bf4c31e5827240ac74fb46b76685e42d67440320c24cad61f590797527f7b433c7440d6701252a4cf3cb4fbcd93903552d2e71ea72cc5fab47eedf1a894751e929b03aaecd60f8542a15028140a8542a1901129bb45ea6f1f0ad5e7ed4bb11a7a9ee7799ef71d0e1ad0b045425fc48894dd51f4f53d6feb72e87efb31f4a328d4ea9cd5d6fa3538aabf3e10593726ecb6ddf0fd180a4729bba1914d41ec8f7e88fd91e887b4bc281c43ef3d8e87a311ed3d2058bedbcb9003badf3c50fb7e6cf543a1ef2ae87de759db6243ef51d0dfe285a31129bb5d38562e046ecff9d85aae7492c7e851b8270301511a82bdeaaeba542cb93917171c857211046b11fa11f56496140c73314dbfc0056b6182143016b77beaca0b1825d987909d0617c172cf546a5404172957a5b56a55a3dcd4298bc1cac10c542e18524f868911330315b74bd9e1e8c92ad30c54936a52a47a443c29508af5973255b03258ac8c1a56260d2bb386959fcb75f1662335048f8c10ecd8ad1d50b07c7e72c0aa3c907881b504005708828b284be041446bc62d2fe9a0c2cadbf24f856d9d524604c1375aad35a238a8540dd65639eb140d0800000008a3140000200c088703e2e18040a20782a83b14800b7c8c407462381608932887619451c6186310218400010118819991ea00be231d829503017ee523f858000fe934e6bd14408e7c2f48bddc293628b7668cfbd82a34b80ff58d0de48ee977fe6222a58955f1a59754c38eebc5b7c60c4662a7a14ad62fdf93d6308ca6c658645293f2e1525337a4beddceaa9adb35a60284b6dc3cd149aea25d23877de2a0634845399c9e97f975dc4b0745e765e4350209449ec12970fff12ca61edf472a8dec65c563683a5663114f67f615ea3374324360f9b59f8b8f8e925bc3c78bb47c48c70514cb1321624a297052b30ab69e8bf9920771daf3e3d61741ddc2d6721ec3530dd113343ddcdc17c4418420bbc44d145f2d1019cdca430c21da2ec409670f01d9bc8f5e1862ff62a1efcde85604ccf36a60e41eefb1c51bd54c743670b1d093a14bab127131ae1be6bfe2fbe49c2faeb40d62dc18686b29292347407b046573618310d36dbf6379cc9a889a3e08101d814272c68e62035168fbea7086647677a35f461cc0120f0aaa2516b38a08a94216a1af50e83a53f990341392ac1eeb63824c8f11cb85e3a110dd3b03e72638ff878994f9a18c49c83dbd9980321eb172f4b02603f81b42c38679fd8607d6870fe780c11b9d4f18fc5b767d9abc51d2150cb39f0e3c8242a02517254c14a400a37b0614c03a2fb04499aff770a17c9e0235fc2a6df0f0525d6e2803c56774c8da1946e0a8bfe47899b04b441d37e92841480725543b64421e69531b6530a15ff2762652e0cb33294d41af9495978a48187c25bdc248fb47135de44f3435d4c227b7496bfb3b49f8b91b530f7f94fa60080fa9f42be88c1634fda7345939f0c5e0d08937a205b297654355e34881e49438c8c72b0fed9ab6c76bbb98742a8f925367419bd2a3db73d43cf59b8e80988191b498d19aa73082fbe54b07f2f9e0e32917a77b9631facc2bb9a24b39108ec8df7f477e994587acb973b682fa487aecc635b9b891811f41140f41867221a81c41df8aa24bb1c86e2ba8055bfdcc9293845829ffba1d3fecc63b2256d91b01e1abb6f6483807e418ec476c25f1b2571906044e2e19d8f54dba583a52724682627cb320d59133c676da2aa6b3a56eb81983768bdcb47e34a4f07f9fc972a2cf1906dd924583587851246d84704f0e746604fb1ad19ea2f9db8a4bf2dd6689d9b0ad1320be5b037fe0e4bbc09d7a659b83cdf2c05c770c60ffe2f8509e77cdef3e6564aad574f657199f75f8f4d06bb80f0f7d322f778591aff05e6fa7cae2503f6b22a3a0e979cd644c86443a9e245a7946d7f13731c82a53c04771922436f8a7fb7e591329f7d456afe2dc3d73b92412e8c614fbde13a0a3ad0a82a6b2733b21132876a7effe14027633bb54b183c822787f1eff91a9628b3c1faf5ab44a14c909145a0ed886ea90d8e2d7e89577a32bd6c2b3dcd543749d839a898fc15cd9b29f1c933a0a48f5b354977e01ff0d5d021e76991e152b354721490af95754fba1039494ce715b34f82e2bf47ca3fafbf11f202f481d7dd457547616e1d373975cdc5a018ba09234bc86dc91d1da138f0752cdc0e5bf83d1397266496b774657556d41b2362e86ead366b7783911866bb7c7f441133891c063be15ca86d977bf421fdb963426a2d7bc8179ce6a77eaa924c3ccef1ca2dce60a6d93915a0ed72ef1efddd737d6e1ff3527a644940c341db1af6fa9ab93676ec97a9f2038332ab555336888815155d9dba9a1b8e03f3dc4e68fa81003aea8afb2fdb9608e48f8454736078d0debbc0be16a9e7101c7e6559e1e2f6b9793794426c564a0ac2612d2842ab453974678475b2391e0b8d9aaa26e1cd46f96de73e3a94bc92ae5d0f17d7e18528db4d444f2837f33d93a3f75e2e7796ed4b8031ee25d3c8f84bdc11a8298c821630fec94e76e46821cb1f975c3351414a4f9c48379ae87d2088ebe8b9116f9bc358cf770e9d8b61a4248a16d2909acad65c2b08a6c0dc60d53d09c59e838c4f0f1c716aab44e1dfd114f2294f033cb843edc6006664473d262991c1be3f261817066fab854d64570e23cdb817da47be1f9dac4394f8aa231d200dfacfd960e0f5cdcf96ae9efb0b07f703ca50b2d3b8b3d3cc0cdf194e84c676f3eca501150378d63684fcf4613bb32837a106310c9ef63e227e5c33872ca6ac421cb9e7c7d864352192a90a146e0314e5bd9f84ef527678a609848592d523c7d2c612ed23509920303599cd4a0ed794b0a5064d734c39e33bcebf80baa1be98636d1787e1b678d532253523036f182587722876f240745b41c385634f575ba32efc70fc162a1ef248ae23f403f5aa0a443145a76b9bdeaea3f92279f9c57af7c0d39d169f7a40b7159b1f0fb7108cee3fde500e851f6e57f394bcf7520c3da842c7755b8fa9b7d9b31eb787d7a2f5867d0b87433608c164c8ae5edf1c00de6db67c984ee2c6ff6c1a894f2230f96bc71ff709924c2d2ad0fd001e2c9ccdc735697168cb56063b188b193380ff0411ec4b4d77385895e7253b2371e3e4bb17667bdc9f226647bf9d0a59b1ea296860d9fe57fd70f696998460a8220749f2b08d28599825099efc44266468207b8df5eb5591dd4a00ec167e27ae536ae8e337931542554fac246b6f5120e0fc359051c998840edc109fdd81e56ce4ebbf9eacdfab1947f453bc034b3d2c27dc0928bd417a07cf5c79e225639a2f792a028de6885f75fccf8f71f70cc0b46c5f1d539a30d5e812f34afd09510aaff8fa4dddc0822549cab8e74126dea9a89aaeefb4f0307a083617586a0e2c508ddcd706162e22daf2ab62b13ce3d99d1fcd678e058821f5ac770d208c5078fefed67aabb894323331d3fbeb9b07ecba64aeea4e47918f6afd2256903897277bb1dc319c9cbc8e2ff6b700a2f99a7a9e10e4664525d6a821b690f3b41afca6d4b504aef3129a3e020a499760829b0086651e0fc8262e80ad8d7e8bd501481a2599666bc9a91f7e84f5184216793e54f10c1ac7e7214092632e603a6fa6c75c77fca21451731fcea82a5eacf26a0e2a06731e8f74cbdb7a77ba73a716ccdbd220cee1d266657f9aa96d9d1b9ab6b9a63ca7e56faacd8a19900d2edaec3fd32bab0fdc2280a4613f46d66ee7fe8523be24189fc9a1569d4d3db08e9d673e4eec35e862586773f2126ed00cfa240926df00a4e6471533fce91396e116474c3c0106f85291e72f4dc2f28163a115bac0c8f82dac4d72b96ef6141bc6c84a0271cc8ff009c38bb6affb12ae4df714c8d16bd880ff41bdb235e4f4f3679ed375198ca3c417d03bca9d68a9dcc8721a004479092519428c9942a80cf2d1fea4bf1359a0abcce9bc687105667e614333327cdc79f46d82a75f2b106c65700bc7c2fe13e1b3db829f677692fe3bb93ec59d188c96b38ab8cb27be0098ae03ba17e35966e73ff587cb7872717d8423254ed537054f98497aec21238c0916e15568d0a4bb2d348f4bebff37cd0254a121ba9dc099f059d1e26e829567f7ba94892b2e6bec56ed354a7c435f4dda696e12322fe789508ff8d59abae962ddfdc1f6d07a0a792b6c2498e492f0fc2a9c0e071981da593743964466e5aa8519997f355ff202c5b53f53c0df38af0b94cbf1f5f1c0a490c4e1e82d56c69188a612045c218c8ffbaa50dec70d26672b44ffe742e19a7f6fdd2663c58256965e953d367e1b1feec4362c335c1f6f5be3f2e2678df5accab67144e5f1d8c7316aa5637ef939915997b923018a2dafbf67e4c00f1ee5b0052d57454b90c204eea5b349de4f8658b1529760d362f51cbbac81f275aa24258a1f6119395a41b059d16923bb865a86be5d9b31bab77e9b0319eed1e88ee80cad6f9eccec4e0450aab8881e3b932d2cec9bab0c695fb0ddba3a238df61978543e1bd7e8555dbc85163f63d42f58e2762dcf7d05fc1e48984130eb09c6df7aa6f8547901942b079802dd79efc0763aa40d4a1290a9061effaa39b6b0db3d38ba62b4ed2e24677e4b5995d588bdaa417a52dba137a069e954c0bf9d893e5887a87478da10a3e5b2d238343c8975932ef3149c139ce0e52d704ed288279dd4108868e0c5fd4d408541643466f25bc4307535ed3bd21224e36b2f0a9c44563e81765c487668acf99733ca5eeafbd6ec2f03f4a4ab0da67e70c0404928832843367f7dd8dfa3e798cc300f067e646e4cb039be3f0b9ee84e2253a2689b4b233434dc537e5285d1385b58062363ae6ec809231eff1f258cf4839f6488b753c6b796ba50da9ee60ea084c936764dca09493d382871997036073667513e39f7cf84daa19e440b18cec99959a85441435bfd08fdf62e51b895b0c17d91247681ca79ede288f1590a41a93f991ad39882360c5ae27cdba6aaf167260429c5793cd5ccd9b1adef5016e64d981bbc6e58f84290e594de303dd5c45f7fe94c4ec6308e1ebc34decc3c5bc0fb7047d05e465b311ead1066bef6f532394d299dbb8d7171522e1b5cb450bfc9b4f0b8cf4afe402cf115c2c3d56f9f7dcb4428341ef1760e68a058af0e807bf42a18adef36a6c8dd3f63957416e08f4fba4f40351eaf5a009c1f3d50d7f9ed3e95fbae627b30ee21495855a4e512850cd9360bdd803bdf8449ddb9ec73db4f2c283f2ca602cb662438f6a1e227c3c135bcda7d698db6360d4bce879e81e189dcbdbd124c04d95ca03d5dc274f0f5011c68a5791f7a6c817d95d2bef506274f3b788c44a69464f2cb0000f3d7139b9ade9ef87659cf299f977d66c2ff1009b7178054ca3fa7db27ab62178c73cb38639ad5ac4b4f9c90c09897a5626750823fa3cc05a2537fd78f294db47a1f3a4a3f0df45231440ddcda4061a57807b421ec3c018ed87cd8fe48770cffb8825350f0ad8861e7a64cfcad27a32ea9370d26e0182db8f2db2c6582717a315adb60f48c00d2a966becb3e52383ca89c8012698d30286eae20cc8eea74f4011bb78e021da309366e49d047d1418eb580ae9b41bf260f1017d2f3f22b04061a0890d9da9683f7cf16a23336ad5010d61563857c890b1e267f11647ab93899b5f62151757564adcbc5202809efb6230cd1d19947b9fe6c38af442929805a357f3c9a3603cfbb996721101a13c5b2617512b416e7dec41999db32e8088502681933ed74ca29c75fe1f1352b4b94ff99731e1e4e79938ecda428228f29f160430a8aafdd90692c71b0bb976d944d1653f3c5dc8e567154bd8b756253e0e7580c0e6fed26b12003a7a8a13ac5ad76f45f67413fa26671ed93c0385c6df61b39bd6faaa109a0829e07143604f4801e5720458188e52959a5d7d6baca94f853d4c7065bb0bc0a789b60892ef01a8d6a6651be0a5803cbb28b5f3c3891b107ee99424b8d6069313d2ebbbc35e62c5805f0c60992c5e090ba1c32fd17e4d684ba47b851809d60113180c84adafaa24b7ec3bf08299051f3980117945db3ce2fd775d91574b1e4b3cb607a488eadcb387fc028e347cedd67e5163b6a34ab912383e3726ee01b85dd017e3ff17a06040f0357e474958ff9aa76a7c45c289b5ff245589b4f06287be8aaec2ca4b1c9c8f18a68c1954cb195a915f8b4cd8edde3fec5a9ec30fbb5496450144f8e2479b68e1e1ddc156405f45e28d0581eb1779d25c272096a1e856c190bc399c0e0c0d4d1bab1388b8fcc69e1997b1397ee0080afac909e7c045b2b181e6c6591e4ad92ca8fb6ca2e1602ba3d5881090048e7cf52791a5acf6ef22e49d18cca55ed2041ce1844555aeedc6334ab92b724d2f8962b5c264750a3c11f111af0fa4befeca44aa2c441726bdd51de875962ee9d673d212577e0494b893dc9f1f2076ea2b3af4555c2499f13d27d358884d030984c59edb302313af9b802246fc50a9664702315ed2c0bed99864461bae88b3e40d254a131a20a7e6ec4cb8081b6282a7be3a6e64c3ad1a0134be3d5dbed2c6932403b629b448fb656fc6562b68bd51bb069e162e09cd03dab434501b48d40481cdfcb9daabd62da73ce2a8a3bf20fc615f166713a7fc8be1ff082195134ae95c96247a4ba918f19fac2c26c4d5523ac3691aa5a5c132a133ad894579c03b3da7628cb296ffbc0f1c02b26d2fc7944e67915601c2d5184b79ab07f6119d595eea475d0968bb2046fa9fd0275a0c9cea1a1ca459abd0e309f723f2d4fcda9fcbf35c0287cd846c27b58bfb2df41090a7cdda70a508c473e33e733ede6fe8faaf627228bffe8085ed2f40a6936244ab85aef85c5bca5d02e0240350d4b564f65d6f27d3b9097fdd8260179d0eb1fbf33905a9dd9b693abe278436450cd299399907fe14032b97261eeffdbb20785798ad16774c7499abc7565588beeab1d9b62c6090d89c31a437633e82b1c861d126619c0d2537069f7f30edc2a2b3f89c9c0ef202035d7fda3d44ed9e65cb9b50b349766205ea63e24fc764c26ee49702dc836b427413b6eab33a95f77e0eba02375da3544ec7ec50997d46808267f42baa67ab44ed7d28aed67c781f8849c86f18abe4ef4c52612525d225ad2aa9335e7a7b6da33585bf1d6f4b592e853ea40d67ac1eb14af71ddc3b482026049b7146318c5b95051158bdcbe53a46329280273f235588625a9e726ff33c793ee859d082bd3151694f0f89028945fed400869570905306138e668650bff26a7f1b02a89654f0db86780258bce146720f3a14a80fc0cc503cfd3265ed272291cba4651cbdc0e4c3d54233b67a994ec94071e17b10fc9ad959c6863de13a3509103ece71197154f810b28aac71b810b982c5f69555cb0561bb3ea3b50ab5ddde324b7c4c19d2fb1972fa2a3b74e4a10354df1de5d49e35a79a8291ebf9b2fee7f6c67fa79058ee19ce729c060131d2af4fd861b510db865088016e153b3050a407f3d8754ac56616cd460a130f98c50babc8e9d575658cbed9d1d221d8b00651cc208058afa0b8310e85cc80a7ddb6eefaffc2e24f7a9bb7d886f1ab89ea8cd108b770f5b4ae139cacdff4a5753a2cb2a986ecd8d1a5672ae03184621fe4e08e210fdd2d3253ed57408c8d9f8a1727bf22ff4810deba87d44c8ebb40a3d7b1bb00640567909b401aeef254306c34412933e4a83fa0f614c494617c85cbd19061f9e8f1cc778453a8f749ef7c45c2ed2a362a8a9333c781fde05dcffc47a7280b957c8e75dec96b78878f9f2eafd40486538f0dc8a9e39944c785d1369c52172e5804b865177c45ed0e44dccb5bf2f1a5a6ab004e73e5fea79926bd0cea3a79e3a93618e933c9c954fa3a37395753930b1fafda91895b12c721f475c1efdab64105c874c130a5755b2daa8d82f4e39a095d9fa488902783718ef9ad1bb24e65ad1c63d9567cce61e87f6b5065a3e2929eb8d70e20aafa251934ecdde984a68e2f1955c91ea19b4e72a7d97c4eb0f85d5cf6bedbd8b12760395cc5b1f55fd90b9dc34f130ea2afad88ab917a9e66a61aaeffbb2946c79c6b23b161440637c1e1b19d7a79d489f52d347dad34711c3dcbc2a220054907b8b7999ef97cd1fc1b298a2a2864974c11208252cfa11882f9bb40d678d9d05956cf293512ee9c19b81fd6469576f48e8d1ef735fa2adda5059227711937d7cd7fd1b4f82fbc2b83b198759043ed751758359cd6da4fe4951974b66fa6156f5200164607de9b8bfb0fcbb561625f65e683200c49793afb5cd2f7ae0a9d5b3e1aea03873e66b1d68336534a935e6574c593d589b44017bd5c1442d51c1377a1cf7a020e84c220038eb037822945d2066bf8bf94383348cafd4ec43f15f965eba005dfa38c5f94d79dd0173418361c2652c4ca4014c6d0cda75a790a6c3b6c77e75d0c172c28e944d97def7b9bf023278373652ac0cd40851f94470874ec892d80e4205840504dd402b76863e2303983f840333d48bfc470146927868b43caa0f9fbe56af036f96627567684cf90fb8bc94437a27313e898aaf71de55d93720a664894be15e04e6b0692eaf21fa7ed279f8ecee91c9fd8f467f3010c54e58b8c3ee3cf83588622120379851b4cd506724796c55f7c137466dd480ac5c23d954a913415362dc572455ae454a2fa6092439b9c6a5632d84ad71aa96dc8574cd10d4143870757fda0eaa43bb958222f8d4f7e664e680ee7214a31420da84cb1fb486fae544dce469705c01619d9c14777395b892979c8276f4e656f3ff1923bf5f7da8e5dc75a76dd63ed1027b3b2512661992528744afbcb8384dc81d9c1addc6d13ca3b4ac70f33e04fb5c09c61d7fd5514c3109453fba7f7376747d22356e95a6c70e4c2d30e43d4f8e52825e83f163451592793fb1c708164ec42cd069b40ef372faab79aeb5d08e02aba14c8f89772c5c113ad6d4c635d718db58157d815a4a540b357f6686b29886a4aea35b1704d1423e1ea514af9eff46b03f7e40c146befa2e4a082743a62e493c56a59388c72c3b78637e7bbff6969afd01bf16b2fd8b8e0759dd5281b2d690b5445a2600ba3bb5515997af3c8d70a40faa3c1b6087b63274a8b953c88c22225637f931d6317e1d340abfe51dce3c8dd119ce2ef6c68a957288fa3e424ecdeaf16857b9189727cf047ea352b7e922e6735381b1a3e739024cfd994f4354e97e3df4227f08e61f1badbf04485f10658a42871c8f3df3f360f35c3990876a23d97f40af8fcad37b82ed38419ad85d44b05b3792b69bbf0a538118210d56c9d4333fa67820e086f4e56ad466e606c84f4cc9462702153efcefb9738e769f499ead904a0a266ec8e39eae699386d3d1a7e69c01345e61371e855938d850fdc6fedb294ae41bac012c82413f3f2f3488bda9195b8929b8c64d9e603e042d3824816f551d775c02bd3e042014622d81ea1455d3d8680b9020ef09b143345d436b4465d050acaa6bdd20dce09b342c0965c976d7e9c25811478f4935897280789c09e052abb292513246b7292ef97b1517837dbf7584d7826355e0c4c82ef4bd88cbedad2485170a98539c7c72774d0b2540bc64188c89bd4c05e44be5e66bfae8ca6d1844ac0aa6cfafcdb2c7ea527bb247fb12b663922516994b220407241a8c15df45c6b444b39f42ed0caa334e947ecea01e0e01b4999fc8495211cd2f03f5342e3dfdb1f314381cdca1b12f74ff7cb04bc79ed7b1a33347745c388eb07c760114d84ca408d1c2c6eeeb920ddd7f4b89be9c9c319e6a46769846ad9ba88646391849671d1224732c42b43c5fb2675a15156caf76d5d332685408b87f92245e70db3c999e57f8ee08e4cb6b836568e291631cb5a634c018363113cd8b3cfb6bdb6e542bc74b74e574cbcda6fea681b1b81da88f32a6412873c804b49388c3e136da31179c529214288ebf626180cbb29ada0c0e92697a3809ee35d5750a928a5a01ea0ac8e4f3cb615b002bca4909acedda0f333409b6a8ed4e3245f99bef2a4fc43a73bef2fb7e0e3d0e7347db10beec567b7f6d1a0d95bd9ca1bec8a6c67c091fb30685e80d6f9df290de3f41b8bbb3a4fec9566cea4745b2db16939930ce3bd515f85d5b054d88475c0bda4162217b89aeb02acd805495fae0b5827ca969cdcf76bd89480d51970bf68df2eea4a53d0febb1f76761c0d640586cc66e62c8f85144b571096a6c834dd44bbf2ecbc343ceee97e0570b77cbd8194313241a8d6f814684919f26ca4f9db682b84a6d591f1627ef86871d79e8a3d83d84f62c0c77325bb241a1b45e6580df458b80d45efcf3ea95b322aa279a250de6927100e51c66d354e259170e4afd76033d9977cdc7e34b2846d1e69aa3ba28c12c3b476e67b7b868fa73353a5cb2b228ed5ef9e33f85869e1186e487e5fe96b16a9b5a272eeee82fbc525cd913baa6052c51345e9e75a87570bb2189594c749b3f56d395d3c95392e2f4efd9452f95615b5ba1cb1786d18f655fb0ce96ea9525d003f817b37329f8c345bf4eddef37d1cf1bd719028622cfc2b325821db19f7ba70ca00ae07fb9e6ff0df889c884134f86796a680473bc76ad9a9b8b79ee7ce6b782d652615554de6fed04bc06d4c5f3bce8afa8171c83943ccd4938b296410aa9cd437b9fe052d0d9d2c078716da054ad7b430e9c20ed62cc48f3b0b12857949afb94e68e2d7779447ce82038a4fa8b21276704162160b5ae71a9a9836070e28496a2df502a8c404f5a13b6880185794ac46de8f1e1450c069cef43213e6d7d067b47545ed0a2bfaff20f11d798c13cb7c0ea1a29814602aca5d6a7d1116f97fb6bb8928afe32fc443b7e03448dcf4874939d2fb9dc54ec2be43f11509cc9bfc49e80cf4552cee392d321a1e4529a54b904ac7a88097663d64d949d90f9df9482f866cd027d9394816b029639427f392b781a70971c310ae20e3591e59c76dec0c768c1d3184d78891321861333118b865d15b14f08487316573211b30fe70bd8cf11715acd5278cf10a3bea32221d5269fefbda5878ebf5e45ddf2f580b1e0a1f19e3bceae34a3ca7159d3fbb125fee3b28405df5d8e0ae8d9c9cb25ea15711ee33faed09b2d18771b047053ee9db5f54c8451d475a20e5a17b14d88d1c8301264099a13358d0639bf96f600c542a812424348cb027f0497f9fe7b13e5732f99a389429bc1f11394787aa361f293dab8b93b52a80a819256b34183c7a99e35c1017c6de0eeb1da011d07809e703394b3ec37148ca8fea80e8692c19ee376cb7c6ed665c16753b526e43c32ef1f1bd40ace941cb2aaa1e66452427fea2ba8a75fab091612876a1e38d134474b6dc3ad6b9fd9b3f94809387112a9dd0ef897e794285fb66e4ac3eb393087579e873d8b645ca62407f0ab9d8095e7d9cbf75008d63c3906ddd2f69b194ad87279b308c445cc5a508f8a2c0227180d483053a945664be07935c3d10bb00bf16f8b34444fb3566a0bf04d0df57bae4bdaedb39497190f3556c51d19fd7353f41971cd0b7ecf145af628b364c841c6d99ded3d8eeaf3d12bedc1288585c112809dad72c3a1141ef622ca7cdcec4ad074305f961212c497d5e3da196ea4fa4b87e00ba79012d0914e225461a172ebf1c89cb49baccb27c31383893d463c2ebecbc5d4e4a2c3b54d0e38ac21b90c5e8a7dfd820d074d70f2dbc5bb1c3cf01c3d8153fcfe8e7768d801dc8904f5f2a77d0b8c91dea52209aec560413126372ae7adc81f0b6ae0d884be4298a59524ff80cadf0ed8b13804f9ee9a5376cc241d093b5d04bb43d01633c1c95082b975a7bd22f27878793d7bb7ab12a665cfc727bb4b30bceff3740683a3d17ab1a07db3e5aafece1ade5cbd1c6506e4cadcbf36a82c44c8714899b699bf1a88637b66f2c9a529b2c3875bf03b4d20e451bb4411dabaca8a03dc5cf031028da62da85bc971de37975f9f4d787cf24de9f236f7fa543f59c33b8da97a6c43227be219de69717263d78605fd8a262ef3bd56c1264c03834d1dff8cfd00fa49b9a18e46bb76633bb89227e609978cd67678572dcfab9405093fc8f92fa9fe8ea643ea110080bd1bb65c107c6d1516b5d8ec820abfb7948d8a91bccedd2219c6f6cb123ae369adf1cdaf44512d425acb64e3229acd232da5259af0681efec2a944ffefeb1cf80774e41f96e488f2f4e3d9e5252364cbefc358e8a3603e4eab29bb9362d37c3a0d0da615934e2d83c51fcd725a16454ca4389ea59efefb34277ab9ec678acd1c8bb2bd39db618a5816098fa94d3fd1207fd74b547ba1db55ae113048074599f588083968a4b4b85c0c84248c2454c3560c5910b455b2a3c58afd21f71767247e475082ab953b7e45f5524e9582465da05eebfbd6997e4f992b2f4f5a4db881c06c0a4d7d67bc1f89ea57781af84669ae280a0b005cb07592305274b13c07cd274cf89909791e90d7ba5677cbc703b3ac5b6a2bbc0458d9430b0f4e52040706b70b28e0a3d51edd8c334f4659e53ce3ea64c5818b52cf7a23b852634ae66282fed75974027c7a2fde03d72f33a0405017752da647fcc6586db16759d20ccd138705eb10887dc2b1bb9f8dde688f2e05b4cb06bf1f171dbcbd80c00711a3b064f5078878e0587d35072b00350cc416c71bffc577ba38cfe9e967af0126ee13f70d83e033a285c5d09334bca6c27ba71d4e8e328cd8a3824c3210daa9f7d9a57878468ee0bca12ef01190798b1a3ffc4228f214d449333111590d5e9085957caec71d2b76522de183abce98e283929bb0c3c32741a628e284cf4c42337dd292702d28e9a063b65193aa756b9b1eda37e107a249721fa66e0f566e236b042477cc24498bb8e115ecfca982a118f28991640a8502217a6d9af9a44964c5451f78eacb86ed401f0986db768170609ef253a239de19d036e78063c364888868eb4f10c2f1111fc102250502d7c51fe605aa6002b85e909bc48b02bcf7759d2e4d8c4208ae03b9c850bfd5234c496ca985aaeb6efd7a03c2916e8861f80379887ace64a8e5f198dbcc28c6d44d9c4ce7e529bc0ca89ee8dd376702f2b4a8b5c505884c3894d7888b7a620bd351be945398c0a85df348a5c5e1e617938bd8799b804ffcfcfb56b9466af445b4c140b745c255f69a6c79349a4c32a1cfd44aca486ff290fa160413f9fd7e16088e5304ff2428d209c36ddd3b0f651d636f423e24e3320371b8b03a12f390054ccade002aae2422e84fda2f007b3e7f929ceb911de67daabeded28e3995939401ab1ccfed6cb211e1fb8e9c187518c63524fef89127360f20a76c851bd7c98df9980922f9671015a120dd825ce4a4e670314d0d5923d733f64cbb2ae0954e47e2e5c9cdcb05f3f7a0d2b91111e5c1d641c654b3f12f543fbef36f58b32b80270d27e48eeb3d44c9987368972cd5938890eee583a4528daa243cb9d2ade01318176a1ec83400551d746c05257377d79dafe0e0d5e1dd9e0445983c947223a40ab65dcef9f373b469a651da47e74725e73d077ec8e6965439cee220736b156d504384abb47256734552ea69b7e3c8c6aefdfd39f684beedfd5addfe6a32c8563234d1c9b611a3e59682de7efc3f9cc9523a56e9d1beae5aacf5140103989c2fc295ad7a234caef29f09fb5e6c8108683702b27debefec2078b7bd8f30d63b3dbbe5a09ecc83aeafad2f8a7bca3eb97811049ac0b7062fe9bcfa42ee160a889461a9d8480ec0e816c7beda7fd032f960be7adeab3b9c8caec1322938b0c99fb87ac18e95726d3589a2bd914ee15614c8e2878ced75a91ccc2b267971f6206033d6c40842659c1870f6f464d0c4966ca4eafb8389cc5c979f83f208c3a8d5ea6a5ecf2902a3fdbdbe7d55b5e16bcd1e2d120c58a4eed2ff44c5a23af32a21eafe5274ae675bd202b1781b7b977bc458f31341cfd3a5fcdcfe4d16fcb1bbc71d36bb536bc0b41860ddba15cd57ac95a4ee5a80c2ac4628206b616561048263bf22c5ff297ba0589ea6596df46e90b8098d1606bbc0d8cb5c1374f38568380e479d9d93ec01835b218b3ed3b6017d4f146672bb16272407914d98677cbb03d85075738d915435a98ee133ada2bb344c77f03229762d1a06247fe9559683c493fbb80a63901fd4f30c9ced26ef9665f39a0cb7827a2303ac124d2cab1ad8efc8815588641a00990e4063113cc3ce6e48e056335808fff5bb61c61091b26e2409cc591941127f89df7548fd6e0a8fdbe87e72265b03bff47b848ce41d279cb386505bcb86e1512a82682e08f039accaaa3f1d821f8b8ea833e666c2bedb0bb1f41ce8b1f41b25704321c5dc7982e73cbee39979d9c8b07a7c1ad72f2455de5e6079621ff4397c95624d4c4e44f563a56fb85ce99d6693187bfcdbc7ef206e312f597f6ff9b4fd2ff8f234c3c873d66afc7ed2093f3fa336ca02f5d93830634cf50cec09e5dd3433f6de986aeab6a67dc425b6d72fd445846b305e31347b76ec7c9e7d26b0228e50bc1cadbb018cc32c211f40973cdf5a195e6c31f891c26d75cca0749b4b01b4d02309819702979098e58cca06f06ab16a7ed5b09ad5a57cb942e6bcc010428c38bce727881b00cfeeee52de91335e62b9b31c3c7e1ecf528d05502ba54c4e92d902da8bf41db79a83351565998c25dbedd2dd05c068fb2d08325c480095ba9da00320370fe0cdbbd9672169adeb1c5c013deb0c6f7824e796a75f927ba961c7da8c82de7a2a60552eb63cc2e7273ae33caa3e8c15def0aa967dab2c1235d47204ef60e8ac14ec39c36dc66272a09d368693d64e1a7d8548b501b9d64436f578cc0a91d7fa1ebcc0711a8a396a00f098dfc105b8fc4450ffc77fc1bcbfba6881b0130f04f78fa6199ca3e2ade1e464b2d54c3d9d36f3eb5f6c814e08db0ccc8a76b8fe0aeb85e22cc28c6b76c48ebc9e4c936c8cbfde80d50067932a70488eda1cc5418fdf0c1161aaa3389b47e3568e02efc6a8476a7a1c95edaf4cebc1693e46c57d739fe01def2e988f36c9a2d86089a8205a8f66a017ecd373c5fcf5c9a7677e5bb2564ef4187fd61ef230d5bedb92d1f3376296d6a1f738f8037c5425e256e2d54a054a277593a3698de56f2b439364c9a8ff736e74e993a741df893fd7fe589cb2097de9d4892cd0fcc27df14b77d7d6e2a4e32781d442a1e5c3ff5a487038e8bfe5c3aa06a8b44c53c4e3fea58e58c9d6d59e43f9c455e633b397bf3547d611b6e0fe3263b90fd73e503155d8135139d6ea9bceb09dfcbee6b68d518ef4833102308f05bdd9bf5e872d11da13a5cea7090c6215cac0eab1a07306d73731c952939fe242c1b2898b4ddc289d37ffe24a95ae4157389dc9d49c8b8f6244b2b55150a2b45e149a04005988b148c8820015d5117284e9fb3b9a927bfdbf90611f5345564eac866f1a22c833b2af3582bdbd6aaab9d683f4e45240ff7aa142329b53ecbe889501b987441c07c799f30585fe236fa0e10660b4c4bb9bc5daef4d047f0d4b9e69de3d5198d97343f303090520fd3832df14cf52cb583e3a6ae78a3e313981ecd011150c5f52546ab710b1d5064abd2d6e1a250b1e325e8dfd948e9b4635af7f821fb0f95e8ae8cdfdedee00b85f71430b41905ce800b2fd544a4f19afa98c9ba5019845343640308146e5ba8ddbe8db12775e516ccfaeef95d2ca8eb6b4b7c1fac90cb34a6f0fe87649fc06acc9d45139c4b2d0f4447a9589fca8468efd3465d36e01ae6c6a556df1417ce4da61366f3b4359e082c43f7832b46c64f52da8cd249d3c30163eb948199532daba5c35013f8ff5c0f246adba9cf79a03f0ef80038feb71211ee59bab93d725d11efff58b77a708bca225c6b40eb87bd468051d9028d183025c67c6b9b8e7c1907b8ed204326cc6ec953a385a8b13b532a145d74d78808b17360117c68bef7be55f3d8f9f1910d46be16b86c3f8d810235cee45e0945e111541407b8f3898c8ba21d73806765582bb4928b726323381f05acceeb205f0f65fe50fc70b016cdee488d459c4f6215b24f8e0f5e5dd2c0bab0a1b2adadddafbf6e10a9ff2ecb0478da5d73ee4691874bbf53af8dad139cfb2a97cc9f3b5be8edaf5602ae0f6b76fb911353420ad352d76693d5b827e4604f7d6ccc57556f35a9dd8a62b4676f062a3f9e7f764ca50b4bf98e15c5fed57208ec61e6aa52410365a32a65e31a3e93dede1b81ac0b921612618fcaf5137f0316924cb2ba91afbc3f088b3412f0ee0ea5c0f05c771a6c00f637c2ff4dae3abb303c073a4860960403e720c204e7f1fad39709caa27d337b3d8f572b435cdfee518661a1fab8e64c7aac1586b56135d92d04ee9f4d63bd516c0b8373841cfbc5d25c7e808eab1e4561e0a7a93ef7c731dabbdf6405a5f8b1bdd92a736942ca38c1eb349ee051910a27e10fa7b91ca5c36b8823aabef1560e81e719523f575bd954e8e7339e6bf5a9e8898e34a5044c255519bda83282a5114250c62d9ee4ddffa2f527888c3ac010c8901da01f4464842662a07192298eb8ceac5f06aacd9ec8c095d83b6fc4750ef763061710191f7f4c928bf0213922e17cfd6536e7b33fff955b81169749f1a24fb6bf3cfdf9b97156092585e526e78c3784ac03e78a6972122ec1f555c61ad2cff36ba604390421589e045a8d8b84c40507adf6880059aa38f437afa672929e0c3aab215180009ec6aac1beee8a69193f681eba3c8191780fbf1e20b8c2f1f62a7a115b98eb1e41499b8844d362555183c6e3eb8d203c692595ddf8712006d00f7be4fdc6b42c90b9d761a1a391f2804a517fbd31befa9c2c66238b965d8aaa705457bf331492926aa7fa412072f2a55d43b667c3572a716943480992cfbab67cba785ec4599643d24691e11e90ef8a5fe71226254ed1578e01342370d100a0b908d55a319bd39f03b5e4f8ef37e08f08132b861af9d7cfa2472173224eb4b1c38bccc3248538457c8053a530a8ae51adb598f00526cbfccc4c04a98af0306c82a11749d0aabbd1b6b792271985770eca1f4997a4ab0c6d8d5338515f50a40d8c8459d845a8b275a4ef9042e753d4f5db404563f4b071639572520742d9187634997d189dbfa0de42ef91b8763fbbb5b317d6ae28543b9d112125506f9e16be829ca297f0c1b3df5090a63763051609219350dfcf5fa94678abcd5be8ca8339671a17cd1c03ff374ae99f51bd1603a2fd9322b3e8e4cec10fa41f4cc756bc46f3a1ec5d0f301ed8ec67339f317579e66fb081581c28588ae07f415013c91c18fba3b17708d838dd92f789e061d1356d24ac02c0dd0d8d3ba44f89d5c8068e967ceb94889e3e9e87064450dbffd478324cf4270e13f38285755964f537853fc403042b298e68b8368f58259cd3b0ce9bb468b55bbcde7aa59f90b3b4629364c128dd11106a82541c474d47441defa9a7f9938c439b8a2997211d64c9642a607c27432e8c6ad1ddf089a30ec1f4509bc0c26b922cb9fd16c68cfa4cb6db18fe540352eaead0413a5469fbe9a65cda02c7ee85ee788a1fce28727b3a4e2eb0d320e1b568b040b8c4bb85aec536a096d12d0c2ad7adb391190e3a986aad53d1cc8640f6f42e1375e6a17673b6af547e90ec9d18f0c7e447f8109d111f3446b3c72ffbd4e54d4e95daf9d7b1e57a0a8dd50c5395789b2d50e58a0598d51e682997d6239a6235c1e3c1d0415cd0226df024a5d5a4c27010ab4488784b62d83eb2d66ff073183d34b028a101ff8c223eac5731199bdbb907c02cb845d3abd65008a26b44b5ac8195b12931140e5271483179949ecdbc3599abef333c0305bd4f7005d9bf6366428191c05f3399ce9027f82b5f5812e71a14ed8a77c4d0cd7a8b9084e4b95c997e3b4041a64a454ff9410ceba45f069ec5ac8f434dc2172e147c05c3c255a094cd68609be864c7187b95aa7c5ea772e295581975fdc8624c10bbb847b41986a1a18f6385930a229bda2ed9acf82e043662dbfb357c6bdc288f4f2f1dd9f77ca03ff6f0466b223fdd86e13ab702b56faa9a1d2124363f76b2e59dd73d62910cf27ca79b55bcd0c179e0a1eaaee09b3109ccfa525ba8aeb28c5c329b5aa16eb2b00aed95bf1f3d53ea74f7af1c0e152137d7690c7e59a8a7442e6505a20e556a8c6d0361215711ab69d2ecf02ca479a40cf4479b4d47c8e082d13e4a78a1fb250f3a00e2a7b03470a6e790f266847048d73c388ebbe0576a69a21867b50a56d3240b84eeb1050ce30f51df03facf240fc2737b75f20f8c1f0bfc00d985ab818a44c9c3b43c214af8684d774b88823520d9986bdc0030b48be3261e90744ad06447b62123fca6aea5c073ab635d7de7d15104668d5471c72af988a05676de3d14e2ff8b2dc947626ce4987912034bb469ec6d324f24d2e0ee99d784db08fe7cecf5b1a85aa0558531a752b115c0f2902828ced5ae075662a5715beb97eccaeccc5e2204c011cfcd0ff0a73b3f79512a78d65da5f2c448e41ef030c2b793a33b53233d8ca4caaed376b14f1439904c84c6a534eae9459c69948654fbe1094bcd09848c0bacbcc65289c9ad8b5acb7253c9e63d59047c13374ef98a28495f3dda9c917b0174726125df9f9242e258eb46ea183b467b38bd29773a06ae66edc46e5d3ebb7c30b5c5ba2d6980648505cb5769e37af64ecffc9c9fba4c3e1236ca722b7740ceb09f8f65017f45029694eb6ee9366a50715d36e507b1462eee151948956beb9ab25824611e58059e24bb288efb57bc0ae052fc7184c732962b75c3f599088e0b2145dee4b46cd260e50296eb3c4334b7da4757d30da6ee8a3dc04250ca2ec6158c4b39c02e002a30545b021a93569152362e60a4fce5e2b0adc835fb1fbc91e79c5d32e3bc4491944abefef218349fefe0615bb64ec6086ed398ab56074b98787878650a5d84ad8688c1a4815f5be54c546513d381a6e744de59086391621abc8062f4523f4a3ffe4e9355cbc8ba6455ca6044d64691c215b44bef2ef281d8a2074969fc411ce749b3f8de30346694764432f467d152053262610252f89f67f47204e3152dffa2b00d39b122377c1906cc63ad40f38e4bc1dc49a3606060517cb5453d0434545ea8e02870b859d2797991933fa02d40022fb9f4ec487b812a6b2c551656b6162d6ab1759e212cf2d42872a43e0e3ec372d24f37d0f7a0e6daf41a95c80bbff0e0bebe6488af7971bdee534414e3251f37d3ac799860e7f5fd4b5a093b152940a8b4bfd6a2994eeefb0eba935904531738fa657f40969208c7f7f2994a5ea02f7a8ec9d0dbc9c4cc21d7bdef28a753fb66440fd19f869495b0254b3fb5a76310280719d06aa424d6c656db36ca44013692b63648166333396415c843628f94abe19067717ddea9b9b8f4ec0f5173844da8ddb29f5b633229295c741d50b64d846a6919f798061e383158e3dcb2dc83e171a1a0db89c16000c92fb1e903789fbd75ee15ffdf1e465c35fff4364afbfaf0d82d4a5c1b64c31369c2a72b2f484b7b5c773234f066760f09a3b486519ec1804b14f5ff005528f40c6c140be2b27d7a87ad1cefee41d59701c540c5fe38cb3f408a28ae60fb1f489c352821e5f3eec3b983c7e84f070902cf36a5f0329dea20ce823e7d52cdd341faf293e4d3fca3b6b4f59a01d18d4fb3f0c8ecfbf3645782d48937c02f98d68dc1790220554f573186f890bc1748a4597574a351d09bbe7cbbb13eea38a36032b7520b900d31dfa05b628ef1c880c30eede5673e8ef87be4c7e1eb3e55b866e0a79dadd40aabd51e921593fb3eabad598bcd788bf04b2c9ab31c7e75d4e10c224a11e9cd4ba65f08e3cc21b01dc220f0f6f5ed04294f40b74bd946c45b5dcd841042204f87a0c9717aed7ab3d2a7e0cebbb3119690915dc9aca0012a7ef3130b7536e2e6ee58f192d5b0ac29fc0b596748b9540714395b971c789a720136ea2fa8be33155595b6d6d6772a90b580180f8ce6841253249b30222e85683a470d91e0ab8f4b70bc75d09e98134fd31aea8ec283a8f09de0a7ee68f366764003e7f76ae6ad0b9d7cd06599c9ef408b1dc97c52c82833c5317b09a78b3d65a375e56e4778f4b56e9b52f5b88efcba089e1a16d9a76bde1d1a2b4cbd5482a26a1aad7a7c7943776cf268f8881cfb7c09d80e120685fea9d962354b9b78278d0108992b8e7119a2e11882358e84b6a0ca60e7f372ea5a4288b6d51fb7484338e9e5e9c055cb4eb64f71eb6fa4a97ac46df0ef065bfd2fbc7191135d0314496d5d6f6d0d4ea9d15c51499160462b4659f6f67cb5066df22d47c1472e245c4bd146381a3aa6a735dc80d6eb96ee6631cd488ef3e049664085221c92cc74329a41edc4081a040d95204220ac4b61e7d42aa30e2a0e28860eaada6da05f6e0679e86e822c548782637334fabbe432b30e7dc3e7d8b0a66d3f8fb007fb6a188bf7533a02dd17b61429582066fa45ea122d13a8f2f60397ee7b184d750926b9fc28f8c4a6d27e452aa3b6a52f239f446ba9eb5507c1f3ab679afd9efd684f1845eed7a9da8cfdbba0bb96f3a2cac22efcad9e5dbf43cd628cc9c14b5ca529d572770bdd9507b3de01fc7ce78bd3b4d4fb9ca8ef177eb6d58ddd0812329467668e28bf966fb571cf5643c7faea3059afbc912ced37bbf97b964c2784b009f2928709a1825dcaf8ec062162887248ccd996342aec5b84102d5a6808ab3063cc6f35572a62e1d60575b5670401b140f2f797353a151969c240abcb8a20228c53ecca4065eb49f49c471e4955b3b000f70e0a4be99a45fd90938b70e66deacf1b407386deaf54dc40afcda5a6fc1ef220c125caa2b68bf22ebd66b1a2b164d048e9b91f043cd90b1eed4d2ef84b7a24dd553fc67acccf4008e53f6b294901957b12f5931b6ac2b113317a808dd0198c10ac51bce247a1bc793b8d6e96222823580bcf9d5e2f028cf6116b88784fa1477a281d1478ca9f35bcc636c3f7c5a281d85d147496f99f93eb35db15e8cc61b4d7efc7d2b79128fb569443dc1a64dc61fff640d6f6c766e0d12215657bfc6f62c4750b4505f78ac4e10a64a32fe686b7615b69c5c0ae92c0a22700f846c218276444d40cbb17ee03299ae07c477e25768117b896aad7714be3377a34a3d45c14dcb5d9f716d6a977369d902cbfce970841ffc4f5af51501f3884f3e731b1a35867322e79ccf47e886d3b51a4a280833144b7a5474a04d89b0964cd6901b48ca40eb973c2bf394752dc574425f982846bd873182f02d91024493f710e6c14c9b46c4a1c08594c76df400da0f2e01a8857bfb5a898582d00ae02214b6e6ef2c3454378e5c21489225b05db4ca9352e449d2f2eee4e5bdda8cc85296e8ac50286eae97a543630f61db0d222c49d757cc95473c494f063da26680a3b9513ee5830a644aad338cc6feaa84f8582bed672ae3304b0598e44f3afd3aeafce0814fcebc18e38b4355e87072329138114b99cbc3556467c8619dc2c96843a39cf5423fe3c5f823b705ca74b8e12b46a32ad5bb82ab18456b044bd7f221badef67c1bfa5b8b8486a96f32ee7604e8136b2d3b1463569c224fd5081938db3842338759a1e62d8975b51cb035efb896ecd57b988c9f98db4b8094598883b5774d6e1dee0ee66a529f4138a8b523d5f4f2ba775c60f15d6eae4df50db6d3903c251f32f6e456bfd982dc5d33e1a89a497b79b9dd5ab2b5bd0f546a63e5fd02c775124834fc825ca88a773ed052fb968884c1f2d86d71db0831c29fb86fc8f1f562babc4a55819fdc726bb5025497ff15f070fa2081c07cc1041d733fc712687c483b40499f62515e8b23b4cd6136430e1f8114dcf68937942d3cd88069bf34d093fd49edb71ae438b505b0db13f7fa85fc3c3f90a70a73c1eca04b893d396d5ce548a608b56aac3f461f3e1883c6b6145afade6c7d47486aff547ffa1e309464cd51cc8abe60b32dee670bf29f10c5d6c2f7b35403ccd563006149c698f491129f04805ab7acbd67fab2c9f2bbfe74ad21faa31db21bd92974f4ce58600d52c957c734a6dcfc42d1043c1063cac03d47808d022b21bcae03ecc905fab4299a5ea87db60ca89c75f3d0d2d6df536c884a9d4de24943b1010180183ff4cdecfdd7ff9241fd9a3f61ec02c3eec0649c7ef1927276019a35cc76d40bbae92d2ad134498f5c8291206df0f47f7da3b3add1c53e52f71b8b45a48358c0baf7b80207945d21a5a14b029f29c6c70cd2d0a7bdd7701ae00ec42ed4f9ca8876dbd0f5a4a714e3329225f7429d8bef3b3c99d5804b695a2a18d2241c265321802d0ca5994d49fd05fbc192997f3035d7f355d2f03040518916a39b8fff20832233f1f635301b10479b9428b107196bd671ad3c79b062bfbda63a66242763aea0c90d8f195331cf40e55788661425ecec129d767ab7dc62db50a9c6a84f3822163ddd55f8aaa6f9070b4fe71b9257f7fe4279840e06a57414ff1fd6f14506cb6ae73d3e82b04d2cf3a883b16f3c95d1a56046b6b242048c0990072ed398f2284a98ede53d156c3e4e8476ff4f68ec85cde5dca377c65af6f9b4c88d5821179841d8db743c4295d300d020c28541c4b5389179e5c20b3989843763fcc75f9d857f5e82e163c75dfe661eb532b4e5578532764f12ea9714994ca643d5d1029edc9baaf7000df0d511dac74852796846c1140f720ba2c0b81615470467bc1fbf81af2b421fa74f0a7b3097fa2f612a1c85999e5e965986774b936cebb08a1615d8f89af748212b572a633b99807a0de10d7eed93b476685f9203cf8e17dee0cb5b3badecc917645e8fe4fa6bfb31a59689760ed39378155441df9f182902d7939b78b6dc8a6cd193829dd2599a328ae56e931a69485f2420d909b73d9da4d84d927462421efa566b53b5228a0107d2fced97c73bee3e59fa9b712dd61f4a8197531e9224f95e5559bad5b270a3965b34fdf71ee4cb7b007dddc6e84e02a8610ddba6924b7a9ea6912e07d494c8523827b1894ba6bdb50e17f14c40cf92aa43dbd6a21fd9b01eb48157b87166b72d1c59ca7d6eb591d4bdb5a9bf96433a7e90c7bd05156dbb39fe5f73f3cea106fa4e084904765faae98450b1e28076b2fe166cc501fc13e348389cc00953170fb69d8d17ba463bd930a6b2fac7a720f214b0c0800f6303326f030a2d08d7d76b8d8702a916a057510362d2b2dd0484e9762b938f4b76836b77c4f7883706d9d1414ecff5c94e9cb8cf875985b3e26fa47e7ca633fcd83da2d6d97df527ce3ebc575aa9aef2890aa645f1ee506b4524da4930761a56a4536f3090473a97474df0f1ad17b5b879d385ba251ac5f9a5c64b7d929518719896832d579e0052db554ab831fff57550b9c2cbb03ab063933e05b1c0293f43044f9dbb623825ac23e12b1fc4e674f0098f1acfab472b1594b522515a416917106e990b8ce03c3c34091291c4e8a813ae3685f0ef1a98500f94308a1d756dae7cb2a5f6e658950c04e4c85a4be542a479914dc310bf9975cf4f322f5b52379eb11037ed306ebfa3655f630ce5fcc01e9f9c98166db4f5fe5e623db08419def7fa089d080841320d70aefef0bf2a4509736d4381f81925b79554291f956d85ec7962c30373e2240361958d5fedfd12f05eff5a5d06742e4678de72102b8c0549b00b2d21fe392bad65083ecc6012a327240bbb1ea6a11677274c30acb7e1e5af74a3b836b195388c735e1b1f97a0a6962a55d1d9f5c813896a7c0b1d1625af4bad9f9cd41c8c43d778dd373bf0f9e755d83c2a86a444a63c997ad0447c40f54632fd0670905deb60dba56a574d4649c51f7a314de94b19759f6c873753408ae49f71aa7b714329dc36bc202a6e976d140ff3529492b5c87246bd7fdf145c56e8408bde28f1f9d5e9feda39d0c5b952a073dff8627b7ea805f9d57b96121966ae616751879a27bc0cd9e7671d894aeb0148c3f6c6b94d53e09bc35b44753a9e4d775fb5eec89dd14b66cce6f65938355d55c0c5a3ed5d2d6ba02bf1defc8d29f330871c5200e9ff49c4ab5f0ff17159cc96ecfbca8520672cf8c917a4b5f3c632e862609f695b774ef219ff7bda407a08f15b0f75b81247dba1dc1dec5cb247d8dfebc17f17520556ada65aa06d490ad59fb8e6c49a7d9f7736fa4af0afe222686b141fa0158aea41ad1e8706f3fc1692bc32e2157c2a4e200350c06651d176e9f0fa304d0cc72a4931a550b6587f31c7c54ed61ce0e010efa047a58c50b2a57fe8b70e481b387e37da9976ac9850bf24c901ffce85072cf5865dac2a908f8b882047795b8bb78919c2607f8dc3c5a718887f70d08520dec343fb623efcb9f448c1550f07c1ba075b910c8f916b65450faaec150dc6c2d3cfa2b56776082c831e885cdcb5b69235d4497e65fab67bf4ff8839ed58004fdae901f09aa887e147bdfbf5d65c65b1999084ba0f27058139ea1e60c0d37cd68948194b7c0e8be9f585c64bc6c5100ce9b7a840c1b06714eb6f7f4e2cacf54326a33a49d6480b3742d5e3554f47ff171e187c51eb6aa0976ed496cdd87ed71aa3598c8c8691360e181bb2247e3dc863f5cad877b7a5eb97135b53dd7176d7dd3006d41744b58b861f889eb4468750ee73278ef2b21ca1d5950073c1e926da58250b7aa7d6478c4c784f0bed51d158f0ebe6fe26330b56c7d07eb6809de72265587175e8cb17e3ce22a05ba4500e543f3fce8e5685017928857d4793454fc5166c922f2cc327b8faa5825437b6d4addab460aee7116537f3cc418d47155f41b21132578edc403ea7f62d4e58567f007ff4c61ab1cb90d0cfaa09a8277a97e45a8b6e78b162a717221af6fb13d515431aaa4a5f1ae85296165a6ac3363d61740b3ab36e1edc34e8e73a022d724bdcd3a980ffab6e1de5e3e8e1ffa931f263d5af061e1e56a83d503791bfaf1c2711d1ee8280d94c371afa5baff85b174653d6c875dc2a9e609f4484b3cb16bf99bf630eea650ee31b31e9bac271579a3eca32efc7bf5eb044ea4589c080ec20ee8aadb75cb7bceb7cc6890a3647ab4a28236f08a7d7fd1d82f40b82a5c231143f6261e17307c6095423d57bbca23bcbc7c95d3a72d2c35b76f67af91ebff4e8dba568c277e13978078944ba48ed8b8e1758a17236f7c5dc809936a37e564f8c8d9d732019dc49802a5ac3cc039dc8c795acf1523141dce6eb6e9aa19fb4f72852806595ad795a88ecb557e5e7d3ec0b85d692981b1d577d4c1668b822efd5c3fadd2f4e82fa47e701e65100a11d776c292f27656edecd981e89245be302bfa8e5e81f18bdd1cba40a5ec19656b02e502fc18be709cc1699f1afc16ca9353829eadd98066242e4f88382bb879148e9da0dbe338fb7d083b6fbe66f3c816a3b20ff266889bec9a43932dc638867f85e655f1384c923de503f4c1af2afc68a0a1fbc2297da0d7ea3587929a9d2838c8e09a535aa4b76d6a054e267e3d9132bbcc60447606306dd0ced5c386721e0403edb3d8dc2b64d09f9a239d512b04e0d6b3814196502292a118021364eced07821573f4cf3da7d6ba94ac75a1087c6e7a78dcfe2f8b87741cf156de9d449a58e552df95b6cef5716428b37354f98f62023887376ab4824a55d27b8852181028d24bb517f0fcf60695aa465575b7d16adc11954f650496f52d24cdc67593ac11ca4291676f48fd23a342dd4b685da3332ab5f4991be8a6c6e89c9df6ca31467d49139b90cce8c4d4c06ea3b35ce854f143f1c03bb7596f7462b25f9c8262d49ad7dec663ab49a4ae0fb0991d0a35b6dccb1f2e7dd5be6ab4a33f302331fc2b2798cdde9b71596d2319478362bf842471b7ff025bed5e28ee6c509cf363e15bc4a846241b62a212c39e895aa38478592d1516ee7b5b95c1be73ec1f5a1285a9a09879cfb76eada1f960f23f59eafc89555a69a21babf1e5978eec61b5c6a626d0c22865e14d30c6b72ccfb049de909c0e5893bad84ba0b090495ebb2e3f0ab28a5ca4d2ca62b40030a16c9dffa9136916adea9c9d1ceae7038e2ad8d831a2734b87f0d7b2f6f4358785e9723027b308fb39385b8e4763e6e67fc9b5c8ab22928039684407cc98a5e7d37803e6f4c1acfed4bb1c37e5cc1963d3bf4c743c06633c68fc7dec89c9e05e61073b5a5d4e9398ddc8c7e0bddd5f35923c931b3d44372de55da5b9506a1ce657a24645f93b58010077e1688aa9cd85404b7c4c61971ca5ed1277364535c2de422f01e082a74240677c8e6289f66e51350561b86de8f2aa2441913567d00c7aefb18b124e53ebf057edda8d7f188b653e06ca313c8ad9d723b8fb32f1a27bedf5cbfb6e1186c367a54d0fd303d7bf0f4898164f49652ac71e0b38f0052b202d93218592a76a96372ce426b1b60e2959267c59fb08dacb26e24d24627e63b7bcf632f6d3d75a08efa32707fb9a2bced37b22e81c2d9d97434ce3a6a7b0ba434fcfd6017949e25e117db16365681a49d5cc4fd7363f520380e6a37518eed6759fa062b811c833dda6528674c0ab7c2be5159a62e8c2abede6270149c965c03a01456f581803ae4773547491a52c8b295504bf3492ffe5bb220a43e1cb6001fbc75948f49ce875b3e055c1fa2d496914d7f49e98e7a1678b2351aba528ff14a2252a6c753bffb0a044f76e813b84b0538fa1060144887e98976c9eebc5f89bd03a3b4e04b68088230889623d728f9096b1b29f97066974153456f15f5fe6aa040ad4df7ea73fe6d737acb29cd20e0b87b158d053836670a23b31c6fb27fc13df39f906dc7a7289fba17c1e3b5d0de847b97058c6799d409d78a93f441be76eb8d0719639cbe3bedabba07ed830c55704aa1054e6c08b7b26be44bf6345fd8bac2094d383bb1863e625c538050df18cdc375352f06e6665313d6789299d5692393fd1d468ffa8889a866fe5a6f9aab8288b89f68889896e146a7427c5037697a0eda944a3f4cdd0d98c308fa41d397ca52fbc7d653a02f5b2ea7f08e00831546719dd025a379c9fb87fa5f1eada8d64c1c3c8e43ff861a331588160a9cbf19027d095e9d4d98f8aa358f23ddd8b598aa89ae982d8431b853aaeb7ef0d859cc9d62c7e864e4f771efb18144d34e1df75abc740e2f84820a387f1042f21e3985d25cf354388f0b6632d949cb9caac901631b9318d1e92e7f5caa3842bb485ad398d724f584b910b4b985c743128953147c49ed9329acf4cecbc7ce2673590d9263be40a25f640c19d3df2d27d04cf07aa2b37eeb8a6cc08ca470b6385b85ba5be7a19702608ea502acddcd01486ffbfdfcd5de33045c3656954c9ba1be85f4f2060fc9faf57042bebbb7633e167f2eb34e47e293714a51a3341ad46252a6f6cd9ef476d3de991030cee72ddffcbc953b68367e287373fcdd7cbf2ac1b5a22d8847abe6ff29a7577d09f8bb8c0becb6fbb2220726fdf21c3deafb67ff65fe7ce1f4e3867c8a6a818eadc00965592df155e94bac654d4c3acc5cc779abc3dfac21c553dab8f72515a061bfde0dc546817b04189831efcb38affc2f17725eb6c234247ef9672a1e89c83791321e0852e196ae8094afa8fa1f5152949fa0f8bf1f9f465ca3a994d33f7b8c825872c8dd086d3b38f8d1f7874ed0166668a903049ff5ae76fd66343d5d093fbeea8e8036d7688ea6cac5bef200826943caed7f0811df30412c11fbca212782af7d19c8e913e45b6b7b46888e1997ba42e8592dc03d6e03f03078b42aedffd213bfcb1f592e4dc31725c33e68b7bf48057fea93548e7bc4f65debc9936efbbdd883e40e025bf7441c6e357b4669b008202f61ded44344c7d0c8b5e9c9068beb6537a4c2b2c3a7b49ecaed3414fc8d9a9609b38f623b0d14f1533e27264ffacff7aeea69e0339abde8a9b82e4564bcb9d90a9251a35217dce79afea1f3f4a311340915afa33a7d4a5bcf6d2feb0c2437cfe7d4a5f0d938dc078240d38a3d9b7fed5124ccac30d29f4b09ee7c0ce7ca317a3e1cc91623755f112d9fb510669083a3f20341fa0ea2ba4857485f7ebc7069755aa734ca69c14360906d9164d84c5fa62029db6416cf029f0e7862ad9d025cfb6d1f3f11bdda828310ce5ac863dadcb615b3b931a364b0d34d101d9134bababbbb8273b3e7f2b9d411f2702aa5b6208df89b9317e2d9541c42e2ee339f4988a49fd10310c3b3562775608f19145b66cb5c34046054878edecde7831cf2d8ba59f37467a525620f6c728434484dbbb32cca6cca8fafcda45078c2d3f2b3f27bba120fecf4dc575610d4229a0acc7f9498cca52a28105ceb7817f358f7db4582d9aaccddd98f5638ec5b1e45cbc7a86ba177178e9ac0d22d536df35e5d983e29fd24e654a1e196ccb60ea7c46efc720b94b39d0f86a0fe526a68b8cfb085d8c81f5f8dca0aa9efadc06858e3460e8e18cfd92f6dd29037017899a9b7cbe2a88f623383910d92d5c36579180ebdc884f95ca153a81e0e27eebfdb6315bf4bd2e9fe78202ef21cd02d1de1283fa8b8f07b76dd4012f09cf85d141978e4c8b0ca5c1ed57f5097f1e580b71a9ebd63bc907d847a4f233f60ec5aebfb7d059840d6d6ce2ecda2975ae2459ad4765098b69d0040c23db036a54ec11ff7cd04a06d50dfa6fe90dba93b3a37e47d1dc3feaa34047122dc329d769ecd06878ae8c1e912f0b9773e1fd2138ae19c70d3dcae23265eb67005e042d415aac143326cdb63c3e510632e5ad72a23fc46b8806810b02c1ae90c6054cd09b4521e61b7a606ce456d8ecea77d1064835b88ae6eeba25c81c943a21b365d98dcf830b070d590f74d5c20098ad43b984220bba0196bdfb4bc9beeaa1088ba4d307ce6675b8f1f3b96d9b940b82cab9f7f592673bcd4b6b4291ad1269c710d9b8b0abc45ec7ac7a85a2560a8f3494432a8bcec00a73fd92046ec9f35b22df7c065b2843bd1a0c3284c47b7c1d47437a70136e0f2040bfcb761f6f148eca114cc925b37fac8ec002a44d804f0c470fa8498ade2733158ab1b913c037c87cfb4b92292f790281b4609bdadee8b8c8fc23ebc390870bc157e6cf8e17303148b2a60591679d76f096378cba85a15f07bf357a085b825fae9737804adf64e537426242861c1eafc08e3eac8380ea3898d9d0a553f53374270a4be45a7fdc088d3f8923ff4f1779cdd4c2ee98926b855985b13d1fbcbfa42eacbfefcbdefcc464e88f56aefafd74314526e408b3b23a434c741706dbd60926e0db4f99b7d8b4b8b5e2e2e2757c9bef8567be60500096dd4ddd53b0be674f347f5d224f569a8cfeccaf9e80dc5125931b737873682cfc43a62704b91964ed8096c527255283c3fd0a6b8f6bcb963380a91e2b085e8dacb81e6577e54288f8be899b6b1f0c2a21672ff176dd1574d6bdc98ecc1848b122994e7a6edfc8d29d62d160c796fd3e5fe91772476be0d676724f5a27007862e0764ef792c8e8598a79ff4157d57e80756e57e29a5cd64ddc68ebd43255e6f8c3cdf60f548f9f98c719bd7d8cace6fb37df13903322e538eb19a8ce3e30a37e7341e7e8c511a27ef302814aff8ff40aa7f1e8d96f10cb4991815fa9ab3bcf7cfda0c03adb5e878ecd99f3f40d31812b34e8034a5bdb6dddee350734a9f6ca88648f63aea30722ba410a8cac1f7a58ba319b1c3b04887e23a85c2ac01397ccab62f1102c705ee10bb878d86b66198d5550233ff8f2ed7f3e22d48bd800cbb600a97fd1bc4adc162050330f7b1942b6f0b499d8e423d03e8faba442407dd8ee0872cdcbfc15e2733dbdbcfcf033160c6c9f6384915ddbc2284d5aa34f025ec1658b221e9efb94240b3ab170e633ad0eae39ee9ea6cc1898fc0ddc662319c322ef2d0cd714b8131420ea6c8cbb1c94a49cc877d88913a9a084567aec4fdc0138b601a8a7db0d8190964b867da451ad845da51ff99fa41493aa927000cd5132b0ab93bad88a3e68cb42430c0e3d5ec93bd91f43b260f983936f65cd1a9b4fb1a87ec8ba3b1ca85166cb9e1a4ed2a5d15690d94e798e1ed24f433dcae76d72e5537f6563046e38ce709ee8b2f600e89583feb492df6f42aa17bc3cebb99cf97832c72602813a5067296e434506ae063fd5fb0b731de2e367a8d130615c9ae86f884fc60e89ec8c8191740f861cbe56dcdf5c21256106951f651ecf6f1f34b57ff1171b763c1ad4ce936068752926c5a4845f048c35a9ed64adce76fb7a34ecb35d5a12c05987cb24718576a6f9b78268f6090c4e1a85c954b504bef34f75227f67b8b06801201887692945936b93851fae203fd54d1e11f7c24334c5c50e5f79cbc3d0dfe7a8be447031e4d00526ee6903409191faaf0e4cabe006547bb64060fb846a21a120d926fe4744941e8034d318e46087b91129173cd765d36917878797c0d15837fbda0fe2206d8ec71b265ddbe4bce9bbbe9387475ec2f2ef1302f060c48db264394fa80ef270c2c09da2d995d8a00a4a500051ecfd06d6ee59f16cf4c4308562021ba1091b63506e4d2496cb0f8274e49b96b4d120e815bd508efe975fc988638e3717a514a238e8b95ec5d6ccf0abeaaac310015763c49e49f7b1886b81f46e1534fbc28ca796b233e820b4fc0e6724bd8614055de6ec312dcd1760164ba2690ff3b61785755c603f7e8b15ccc2d7a5585124895786f69755437f6aa29c3eac0666c1699376c0b467a1e1ebf175c07b3ba2a2cd3f78910b9bb6a564d84c1e2782c73a5422c980b68d1e6dc016f0ef1156bcb41782453e4ca77b2ad3bc2bcc1596fd3ed4b0d6f16243c14186b4ca764df572edf2c3115afb12f730666ca0071549d07a2ca3ad2c20a1fbcccfdd1a6641edb2d294d819b292a5e40404a11af20b65ef638eefe150b9bf5bcc73317a6d60e410417724113a629a94f231d15aff1caf940f023b08456a3b4e3f780d08d93bdc58144dd3a3afc3df3f96adaa68d6a4a0005c1ccdf1163fceed06346eb3e622bf2d62388561442d825d597af6ae31726c156a8121ac9dd171d390e74603481852042909bf596f7187b76cf6666da36c899ba466965e802722751f6997754bc2f372a032a09985ad2428bbaaf6d81ee99c9bef3019c6582974926721629d4321dd289fa89383fca693a5d4bdc60555225f11566392ee259c6546bef9ac1e26b8241ad9846efcda391e160b99160b5157407f2e396e97bd163c9baf30a45c887cd6a4e1735a675374dcfd364c1ad5eb078d511a9bf493f7d54089d36915d74a6bbeda99c742e9f034b5e5340b4f5e791b6c987368b5ca6c019733258df6f9f3159d2a298a5c1f76e51f152558c1e5da90deaa4de403f20ee8f1ca479ad61394fc810817d97f9cf52eff06c2e037e3cf147f783ca5a20399350d48e50ed349958706f4bebe6b9db4175efa1016997b88b4b7f7628c6a42c62377d4ebe88c84f9401474afd9b490b760096ecd5d7fe9038a3eaebe08913395cad829669cfe05120df11339d3ffa978aed2e7ef211f05e2d26e420b6ca07f01322c7052a441b5aa24f1223c9a8def535b541e61b3f160ad3494afcd2f092de90a929eb9bab47a078009c9a53da0a2bd6527e73d000cc5431020f15bdd85ad5f5d2129ced3eb02d40804faa7fe885720d8dda80369d5edb5b5d45d553aaab4b34857914e13829bf64654c9261966fd63dbb691494363e6017c3f98d1b15e5edeece10d8040b4c6778c09a43c6e7e1fa7aaf3628aceed347072e5ff219fbbdb6eb9a59432a514520879087c087eea9ce0a6a445c1f6adb646981096deed8f665b8584a6f16f42d5c27611b2c216bab86d04f903a6f17fa24a61a908314125b1e812854419e1524b1eeca0422f5819fe42dc702e41d29420694f6cc892c6b54ad2685325699226699246a9a449daf4991e52b22e30d8d662adb6baaaab6d1549b5aeeacae3f16c9e0d06f33cdf30b7f1ab43678b1677f7f73c1b0cb66d2fe29a2f01a102583a37ae7a3e9dd753708dff9848645c86f4b819bddcb8eaf974de83de4396fd96224c11c66d2d13c6a50dd63a302947f877115edf3dabd94aa705defbafc0fb929c9070c9f361618844d28dccdec85a4bc39ab061c3fca3542ad7612b58d36030180834ea713344448406079124e9d30e188c460d56b163e4c8dd1d6bbfdad5adae358abcdbad180a75b1eb6a5723778cddeeeddddeddd55ae337e21a04704d02c09273e7849db9e1c80bda3a49b86646847b708c3f68731eaef3628c317a3778191ff24e172758c162dc7edfaaac51322b4c74efdf5418879947f7856cc5ed77cf732d2e75ad2e4d66e0df4bbe3086cbc46d3c149740385c86351249b09d4885091eb3f6cecfc8097b03267e2d73900ad3f803a15e71e71a7f990c060624ea71e3a00f0789d0502409d79c741c1cc956359e2063c7c8919bdb4837ec155dd1155d5b6f5bdc6273fb8e91232a2837d880ea27351d39778cd0aeebbaaeebba91c7e3f178b66ddb647c61258dab854bdbfb47572475ef1f5f481cece872c51797e8f58f57b024e152bf0cf3d35cb3b9a060d9c4262cae7b32f8ddbe245ce31f4534ae112e11e13ddce0bad7180cd40ea9ee1fe216a554a107a771b1ca42e5613c798d0ab1f5459683f20b232b028169fca7a822ba8ca476767676768cec189131992756d7bf8b1c63c766ee1be6888a27af79cd6bb4298d3436b7cf9b799363e40608f8602f1836e98d83a20c6d05d7f8b37f77715d8beb322e39b3d74d298d1ea5f1f361c2865e9bdfb2ce433d2c8049fe8ab02b768aeb2fb6c277380be622ca261e06cc654e664544b93e856bfc5532559b1ec60e5f1897d81f423737b55a4be9cd4d942b1959a462c7c8919b6541aaa591d28d6e3146598c41e246dbb62348dc464712f7bfa1530da54f5bfd12e0b569c252080a2023043861fb23c035fe096892049ac63f2626f46cdbb66dfd59c28a98b01bd3606ef464700ae4806b74b0b0bdd1205ce347e2916d6b7074c453b64ac739d8bde5e06f44b02d16f58a25c44a2592a12896bd8f8a0de5f57fc5183932f39c71048140111465deea6696f10517da8936ce628db19014f6891a0fae472aaec71d5c7fa70293dce5059760de7594f418a62937de755037a61b0f836ab2f12124ec0daedb8087507c018b715d72b1509c146b4770c913ad78ace2510947177089bebf6bd13b3c0b2ecd8f43c47c1881b81e6770ddb770ddade05db8ac068daf26f385f5da982fb432be6abfb0ba565416492d93c9643299cc23eaaed55c2a95ab93459290982c268bc9e88b40a2be5d8ba423227655aaa642f5e3944512334f8f3fd0c1ee641de8eab8fe11159b38a97a17772e1e995cef40d1e7274e0ff42010687aa0771b50bc71e32b358dff87f6c37ae383e223c2f5f7a468015ce3ae831376def0e6d33961411fde88e6ed3e9f8e54804471072deb9aace6aa2e14eabaeafdb82e8b3c445a27eae1b2b26871e102e3bafb8c2d01d11ea66c4597c4e80ed7fdc3d053d09c5630cdcca24e2eba2f9c604c19d7b84c76c5f0316ebb7a4b1458b82d8bb55a3b57aa4872ad56b550c85a97aa5659fc0212c51d8822155ce36f43f4825445528c4552e401d3f8fbcb5452ace213abf88395cb7cc7bd10f90b2e85eb1f12312b20f4285c7f1b9ec5f597ae488a3d341598c61f89d00d6c105f1012030b4078e0b0b0f2146b2e03c92c16f1e43b91343defef5dfc0ac699a0f7772bb8e4bdbf37a171b870a973a7fde876f7bc9bb255e34857f3983299ecce952c9298a5cb5ee9f23dd0099826922ec034fdcc85aac4f60c9a50b5e84700d3e8d802f37e25ca0f3d97305f38616044de4724eb47048e6630c10e07db656e13c618ae749ec700f7f1c3217ec4c1f3ce3870384cc1c1f3f1dbc46e33677ab673eff992f873df4cbf2989e7e337d3df8d0ea6d932a1feacc5c19f7b8f28b6e787c4f73cfdbcfe84e8bc203ee7118db866bec80b2b67cd01ba27830eb74e2bec0cf1bbc7803ff73fba796edbf462bf0621edcdccd03df743bae7be2453b64f12bffbb66f48f749fcbbfeda0bae9913fc4449b0f2c38f1f2b9d5e417e118b11c6cccc393723b0935fd8f62f5ac618ed17b20893524ae78c94ce58a3284e4ae383925239279d944e49279d91718a413f4797e3e278afdeff289fd2b05e19075d7a3f64cbfa23ca3869d41fffe3231cf4c3f81f3f5aa07f04618eebf30bdf47a5df0d78e76de639a2dfccfce49df7521d599df6ec4bb7377d79530e02731888d1859629877e620b2b35d394fe20b46ea279bcac38d8d14fc77d3892405ef711b5c79670a471fc8340f3f8b07c68cbba4262e66a24a46be63595758544fdbad63ce23b124dea4d6e5bddaa9452d64e344d94f2bb691e1df7e99eb0db13f673fd76338a10c491f02f1d9d73e33e54e4ad22b8a6ce561e0e085f5a1f99f191c6e9562f41eb86c25a1de9a6c56677773a2708052466abd5aa6e72dbea5665e5a4a7fb745252295b5cd33070358e5361239ae8ee09dbdd2f36ec58fdd04f9d0bf11c36b0f2b7207caba856d8a6545ee148ec0bf300c24a2965f7f1401f2ae26e75a249bd45d3cc20d038fd650b246efcb8ea2f34004dac5fd07b272f3fb8c2085b708107ea09d1017da148131f86289c564ed8b0b31076166ef4d30d0f3c73c2e9e674bae9d837ce830eeab43ac9205c43e794f5930506b0894dde924dfc1fef47e5368e9bdcdc56ab6debb62ae20b12b1e9745af9670389dce48992f4922378809972682780f083cbe4bd114d0a1203a05bb17d4d206f2b92dc89477151e1aaa8135127073f2cb6d5dddd5d02a6f130da861162300e8ee6e18fa3c7781fdedf112c4edb5fc138f1f4a526340ec7a5fa56d5ee9faead8a8d53a479f8cf4e32ff22dea73fedf1ccd37d8ee3681c1dccc37b1cf7f3f7e339734d7b4baea91f19e3c74353b85d889c71ce3a6b8c31566baddbb6515a2bf56a6dea0109bdc0355d802fd4c5ce90f7fe5c158d22c9fb66601a7fcf62b409a92159d56ab55a0d0912d0ac999bc66ddbe846bbd25ab7ba511a29cb91ec1163947d7a60437f5db7c1e23630b7992f63acb53d5c953b2cf921e435aeb919f5b8d9116385abc562514ae98e118ee3385624b1228d1cc755aed46bdc7024bf27d890778cd8e047dc66bee7312e51fdb07212259627386d8a5415ab2b602f07a5d36f918dcb5e047c87209114a35061d5eae08dcc11b13833839b629e394cc0e502b00da54c30e81fe2b83ce399bf654cb04d2bc1b4e536cd9af14516ad3355eb9c73ce39e79cb3d2a9044bb94b348dcf280cfafb84c2ce26521e45b3454534b138a8258c1dfdd01a2362138d11b949cbf5a781f58471e6a6985f718ca84d51c4b7e3e68d11b1a9ebbacf526b4c5f4f65c399e2b2d5ba6d33156933254f0e42e192d499a82e369c29192a6eb7613bd89952c2b2f763a6666a862849dc828242cd9443ecc1cb04c31022e86d94810fa8dbac3a6d0dd1ad6198a908fa60449115599755ad0dd56835b06e54b061b35256dcc609931a9592af48aaf1345054505166111316036b2ad11525b27c60c39992f9195fe39b9941e667fc4c7f43647ec6cc901a1ffa1a1f7adaece74b13c988362eac77e04c7f8dee97097d8d2f898d0f7d1200fc8cd7c144433403fa175e07538c6806d4d9108db62b581a2ff322206c979a9981c6c73c0664bec6338e1a49313ff318a8f1386afcccd7781c684c1c1f80c7c0cc0be0c3c1c6cf7c003e1ca60cb1f1338f03001e47674394d3e30a36e66bfcccf63a98a82bd208d1a1b0176d459a0304615de69dc6e733f38ee3dd0380884d315f030038be991a2aba7d3313a8bfbd0e37462aa22219dfa21bfccaf8220d9a074c970bf3531416b9309f13ad28aa60bef8648698bff14362fe068d2fe6852f89ccc739d113cd10b1292462538c884d34ba4fc83fb1a794dbd0bcc45a9c39e82e51110cae710114d7b7309b8856e825b8cf0d67ab8b619022184cd3c91b9b0a60cc142db2680e7adcf9c2ced4e748e31aff2e78c76bf1e435afc51d445664c52cd189e8839899a2551c74eaa22d185e60e387d479e0128dc6cac2c1808511f31d644b58a99adb8491b5a2d1bca4669309e54b644d9f59668a6be60ff38a0c08312ab028b10897933ba33839588b446898a9ae61a68a843cf3d08ce7be980f41b7f14d554ccb66b4ac4616685441e6eb2d66cc142d66be68b3fbccd46471892fbde16c4d29b11559363eb40c7470816052a4451a6f9cc8126388248e60d03fb23c92a612ce510c26aebfcf17d7b87baa65911669916524922218318c9d1d76967891365373ced93595a231900ed663f0325fccddd2255b9265ebd6db16b7d8deea768264b15eac178b158233078d98e233b789dff216d7fa28e30b1bca4e4996cb6da4152e6ddf754ad45056556ca122595226a7b82eafc89914b11536942c09939fef1e1472ff96b0de9a7ddff711c99688e5921549202859208b6e3af849bb9ab41acb8a8291d4bd7f1a003bb0d3e2d545f4642092011aa41467c9c0dac2b66ab74593ec275b9dcf7c06f35d0085b2e059afc2071cc00de34b1ee086f1d53188e8729b3006115bad2a31462b3706c125d6d7856507a713969382d6ba6ddbb67d88648049f1ca4bf67ac5dc30be5876854932ca8bf5928105856be2a64567b9fe339e39a145b9e2379e20595c23a3482b5255a0a638edc82bb8c6d5b1497f506cc8b4193edf3d0628066ca481c27e8e965198c65f52b92e81705d5eb9ee4956a758ed4a75aa53f3c5f9278339e7fc7c3e1f4ae9a4f3f3f97c4694d239e7ece1a4fe7c54bbd13c1ff77d2fc4396984b1c562b0d7bffe35e7dce6165f91f4953a6ccb84f29a5aaecf2ad79fce6df3bef9482a116167fdaad5da5048b6c00b03171b53602b08cbde6784f55fd5d5b6dabef0b7554c4d1516b799b05904977670295eff199bb348ea3e04044ba5ce28dcdc895ed8ed89839b152cf7d2003eb0fe7c398a2e5c6edb4c96db843175533eb5d84272d30da7943bc60d638b4b7de327aa41c77d463f380f88df6d9b1f3d2022bf51e55dc04d311505dbf160d914bf7faedc26fecbd5625d8f22d912c9c086b235a16cb096dbc46f7be2a02792810db727dbebfa6f5ad8fe30a656a9a852a55253958ae08d2c95c72a5315695cc776cb411f4f1c74c6e2e9e964aa3a6f015c5322029ddee7864bf1e30f31753363aa4a3855b2255b32bb4d617bf27d7860a76a968a3207a74a0a9646beb6205d30933298491acca4103369c42c0bd7bfb1c0a54d62c134fe52b8fef10bab85eb63cc18bcfcfb0726c9163321f55442515a45b43ad58598daa61853750256019b80d4af2879c0530906e36a3261c4759eaf364210aea726cc55515485a52fd9ba79d5dc6e5dffbe3245ac8a9815b1d754bda66aaaa6aad61d23071dec566db1cd0710a5b3810c0b103b302b56acc41839b2a7eb4fcf6284c42e0a892410308dff16d73fecb8e6b8c8c58e8989d93eb5562bf7484ecdea2aad9344d55250fe95db6a48786b8ee3aac771713aa83f346a95c2073a34a4c43123140242103233ac9db36eb14306084a2b5be48832bc1ff17bda281f3737a36ddb1a4581202f24923acfbbbf17b93d90cc2259d56a35e7768c7adcf8e01a121b4ab89b993bb2562a5b69531a69ec6ddbb656b54a35a9bb8d0eb791e2a43afb32bdcc39e7a451b66d71dba20cafb25d6bed6d1b218049120c491bdd91478475976b676727ba7622084a54241941a15ed2a6132e3d719b3058d2e4f6a11f782e993b4c9611ff18bf21dc9784fbeee3fe685c03055b7feb264dd6228df770e9c541ff3837340f5f010b1a87abbf936af73e2f22918424d2344e4ef390bdbc20c9f97c5efdf9ee4f0dc9e713424237d16914922f36d08a741922631ef5c8018670442dbad3f5e8d445b1d026940965512b5445a15c7f19455068c1429fd0551435a1729b761b896a169394db44978c0f36152342511445538d436920002736a42852acd5da900f360036a0a9bafa01846f7f32e5a05314d7f8e7bdbfd1c38b75d74db90dcb1bb24c004278661e4fcd43f3ec7864d7ff46b760352600950d23ab968a39d8b558cc16c164c5c513a594527631bbdd2dd7bbbb259df3935d8ff1c186a35b639ea73dd03be84b9283a9c240a02f097d2501fde73b8f6846f4cdf4c3b4e787783c0ff32561df9e7b1d4c3a7414f5c2151b6759708d47591436ac308a1a82dbc022699afc6bcc6d7a78b15dbb2145f96f35b7691a4579fd627ab0ed9a32a47bef4bd2d5ee874d53c21ed7e455589483ce84a6fa0b47280d8091c635f091c68d60c31fc51b273676fdab169817fb1702312708174ba5891bd22154081136e458ade2fa6701a3281445511445515477b2f1454a29fd7a924b112ee1b8fe466c9032923a402bc235fe9f13a4eccd49acc52d77cdbc702b553ce65dfcc51b07c1d2206ce855dc4626817a13ccfc2458c42e65e35227650ae34423e020ecd410d7047d4dd0b7e33c34f85e60e9875e60528ed320e0728ebf935a44a790d0a42291c697e8aecfbd39952291e44b348d37e1f3854e8450fd4287c29bb88d045fa2b71697a870a9fa1242446887a2bd096fb9b7ea87a2703b91edf5b75a9ed06f7b68ba66eb7113631e16e8c8c7a787a5dc9467e592dba8597fbe7ce504c4650f24b3fe39ce0c84d58a15e3220506e5b5a56585ae56d5bd7635eec9c27237fcee6bad5f3f97bc15144d226244af1a87da20d48496218108a126ec12fe7586374d7bd5ae48530433c7107694ebcf79b7f2e0fa3f5769d9f951fa021bb26c031cd000976ef00126f5e949f3f0f76853f801130c869a4707e1c67558f33084ebb18fad0ed6533fa127da4f6606b80083880cb65aad56abd5a8c7ca52e166a64c9bfb65737222a94a493b0f1555aef9175a96d69430c963c34858d029cf97e3a371b88f86e6e1fffcf2726898afd7e49253abf461060cfad3d0384780602b705919610818d7662c2b66f3dde3e68185a5b55a6ddbba3098f993827262f22122ab44b8f35c91b922658e48294084694d7a1b69dc00d37dc05988d0b972743dcb105ea24966334f3794b957ec8d1bb24cd6cfe7f3f9eae0e73381e8f92244081b322dbc61de22fd34f847e446caf20d43a0474185d828fecc32c4ebe9d787610a1b72145f50b9a22996fbeebbb9f9978076846bfc6d11d6238a5ef480f483b040c041e7bbcd7c60e10d13029e28fc206ed3d94c520cb20797e4fb1549001def36954b5bc771de8fcd0697526069304e7f29a856864b9e77cf15eb5d7bdd779fcfc7fbe1f916c944e172f6084bbb1f1a8d46a31df1bc1d0e8e1cece1e08d833e722010c4c16e193e88a1dc85a5091396955635143a1a7532274f9cf8cb10979c8e4236c0208dfafb236bbdf4a768042d9271ce398af3e5acdf10a7e98cb07ec31010d6e6c086f6ba7c8fef38fe7cc51084d840dfbdb0262463e380c1216c689c3e1de1022f5a57282143316d368aa25028140ab56d3b463d3a06338399ebe82736d4d0a76ec234fe12a3f333ccbbfba5773d3cb0a31b3f9e15e1d9ac8894348cb98a2d66d7218bb1d825bea2966d4606ef3ed7f87ff7c726f3b76ddbb61a5aafadc6c5a5261ac7f3fd963eccc370c586b1359f348ee7065c62e2243fbd22c953339aacc99d4892f1fe13758a246fd249999c359ba44bb6e42aca28cc87f2142a854aa15cb3fae578626722107ffe8caf03150eb5d08a40709a4e49711b260e63058b5a82e212f3c7631173f6d5da50282e81b9f10718d10cb771116f5785f58f556e186bddb6214245d87645527479a660ebfdcfe1a4c8c4458c1397300c5c8a33f8dcf0bdcb7db515bae185b0d8b88469fc7fa84e228a6bfc0a1bc6566c6d1f7a1f4ed38f058b6bf12d22601c04308f7e5983112e4d0528a0fbc25a3d5f6cc556addba8c7cd5cd950d2ac6256ad184abf9eb4165655a9ba9b9b1bbad55a6b7d52f7616dff4251b061e84a5291a8c4f5ef2118076c33df85e052ff4da4691ccf97a479f88d77439e7d5f6e92d4f79bfa85355f6e68641e709266c25f51dc2074872269014ce37fa35255954aa552a938ae0a19e260ff27369bcd763ce54fbc7054173f7913dae46a4339399184a4f6e068462c51a06c9f56713991e43f1a816008d6b39e71e9b3a104dbb7ebba6e3ebd61ab26f390e17ddfcfcb077d731e902888839e811d52a20474615b3509543525e9314cec31f48f4056a6e9ff421b2af7db047a04bd6d40e87b6c60d8ddb8efeeba0f924e61b1b5630efabb604abf0ecc2b895d389950e0f6e57432a14226985702533b9d4e261d1d2502a05513cc2b71c02c6482791d253cc6eb64820168827918dc98604c30cfbd6c900f0b9d05d3cc9eb0ef1a62d6a63b3d836189ddbe9909f408e6f7ac023341d0c2ed1cffe00e6f5a8f59382a41dfee5974d9f006c4041bf6cc51b3d96c369b51ea33cf65b67065d65167a08f500eeaddb6b1043b9271123b5713e7873bc21cd7a9cff67ecc2f6caddb3665a432da3ccd79d2d15698344b67d55552934fa78e0c82b147a3ffda5f47c4dddddd3d09e80bd8ca94c388c90f5ca629fd21c36230fcc0facf990830974b9fb95cea3a7dca9175ea0607a9128be408f5e00006232ceda0b0f23671d053ad1c2acb7c3a9d4ea73ef58952a7755268ec34b7711dfec5dfbdb8bbec642097fc9238ee03eb573b8f16d6efec9e5e3708d391449fa6c37d7d5a2455ee0b400dac90d98d1e5e2ccfaea36ed846c0208495c16934da9c3b68758c8e99274f99acc7b03559173f317a778a42987843d75b75606a24b5153bd7df690d6cd8ad4869b2586beb38a9487f09781e611fa0f72f82821b9c04fa680d0025712793ebfcc53b2b1e366458ea156b1efe138b834da4b0adfa9ed8119020ec1d9c808df81371555c9062080c3ad83c8a500029322292a06a8566383ed40aa5a4a452527630d26ad156abd5ad6e756bdb463d5a33a4b85caf1d2f586656645ec0b65497ab7dfb500f48e7e1b863c3762921c68a3cd142609c2456669f54deccfbf629926efa497ca2a2a208dd4a4214ed84b80385b5723da9f2ba5cd5e572b95c9c886fbb869cbc2e4e2754cb0a1396ceaa4aeac9e90482b20623c95a2e798de35dfffac562c1e5367d1b50b047e889f66f4fe9f6fdfddbf71ba91ff24e7df0648db06d65db28a5b6e3a55e05180a77fb3ed5ea606f2fbd1f5b1525c1bd0d6ea4af9123f2044b7d4ed70dc0a300bc8502c0c6a9410938416aa05d6c100c02c1a07f0d8d83a479f8105d584a382276da69d970c4c869e774629d4ea7d3e964b1405f1cc7c5da49b264151df9454a296badb5e6c076dfc1a049978508dafdcc5924e6863cabaf5a3b092781b5849429490e323b28d3e773e8b8b032791f6b50dc660726758d4b325c9a21272c7f58721d06256c18dbd5318fc13f0dfaa6312fd61cac5dc023c39b6133d948e30f33051b46d749a2b8a71c05b2dd30db33dff3f15c1679a28f8863acd185edbeb0b7442ef10a26512298c67fca941ef4e086edb272c376f911b1567bc2054ec80df4d6e73e569cc6fbebedaf5d4caccb89d30d252ad6ac58ff6e2bc27d72885061b91bf2dca813d7db65a579b812d207066740ad4820e42a0a39c42bd624ab5dd48adfd4502b4822a96b55d45c35b9721bae166bb1166b1e0fc735421c1c4284be6c00c1ccb4b1d056df4412dfb0870a0b739d524aa9bb870a6b61c842686665b15a739cac5c00b3b826a6c541eeebd4ed20ae7f6c988f9c9b90671fe010b007901841e33414be02140ac54385a5fc04834180328486122b024bc6daa4d06655615d094d11aa227473c38ab1582cd6b6c154890921726242c310a6e9f08cbd906ebd05724c08970470fd89c0000a283d19a6582a73847dfba9967e433ad50d79f6b2b6880d2152b013f0dcfe402e794c888cc562b198903977787c60e6a992826a321b89b551eff40cc1728c49705f9f37fa7f798aafe2adc899354a7b38cde69b1662778cb17687c57a37ac4dba35c6186387c5c65e71e9bbee8574b0729b9614a61ff6eae670e5d50e3329a3bf6f6d6795811d503db0d36bf0067430dbbd6ff5e7ffe5571539ab55575fb93c7592a97f90684929e58e9119dcc43dc3803e1eee330203f27ca4b0ec604ebfbe70f46166f678a011e89b3ba31d5be5975365fde837bf1d233b3827288b52564bd6a54aac61cda55d946bb53614fad128ca6ab5f61f0447a366f58b4b7c7d764faf1fc6a5fe1fa6b84634a10b76b3a351a86d121c3721063d58c294433c220c93e7bf54ca32d7d8c993274f8ff60cfdbef4abe7a39f1107dddfeebcad4bd8203b18b1b65a6b592c101073ceba4dea24c65837fff13f291d758a76c157b0204290e80ca100eff0175917589066120d1a39187683cfc042b854e3bae806e192288bdb42827cda415110075d6efd520bcc11fc4990ab7ad2c38b95715e95759356791031ec7c820dc1eba22dd81094f2fb85041171b121087acb240c0683c182ccb9c3888e8fd8100e7f99c383cc9e93ba8e3adbe9597be9d8a45cf274308d3febe8f1ea973c5dff26820d2e729a5ffdc9d51722ac97cb59a8e8b2e58637314358ce4205961bde64a982c9cd424595cb598ef0e2e2f6eb543f1e1ffad55bc4729dbda4384bac4a9f9acb7c65893de186bdf369653942ec86ed456e348c56a415aef7f0aa3199ae80df5aad0d85fe417074634508eb1e1020ec20783ae108c5d3cb4ece628425d8bc765eafd7ebf5dab6978582e338e68e7c24e9288119638c2e9c4c32af2383fb9890679f1f8c2304300ed83cdc13b14946c4261939ce711cc7fd370e17f27e8608f41f519bac884d9c2889cfc788941c9111c910292972fa3cd853dc225cffb000d73f2236f5dd3e326e9a216a1367454a723899bcef603ec7258ce805bb9e08072433433eefbdf7f97038d271a2d6e260f7f2e19182c5e16a975feed362a5b07cbd9f7201192118a3c56f00e8fd6788580121cef5070bc0a53700f3601b4a039530e8df34d063b8eeee340ee42ddce71f49344ce38f802b15641a0eee73d41d5686877624e420d708f1b8c5c2e3f1b0876745aac7e3f1783ea311087ebe1a699cd890675abc97306157b9eede00506fb9a410278512383f9847949b273a52ba05e5ca78fb31f67432b90c5ba4eb72201084020e1ab1e1c80d48224d7f441ee794d45ab972ed20b88542455253a9b5d6eac9c0846b9c874a7bd23a6e93059372228d8eeb6134185c0069d9c0862db3f12f12699630e908e7c3c3033bcaf3f5ab50a47893277de7dcaa7c00036193152690538324f4175360d05fcdc3fb0a4c03c5f5530db8d0b296a3aab85a2d6ba18e5454ff509d340a2593c96432d9a8879021a998d5687453c4061f3db8cb4b0b6d853a236c7f884bdea871280fd73fe4031b8eee0cb9949147233a1a8d46a3d1b66db5be55881c63c766668e0fc3e50771649a077fbfa00a1760a61c1820c41096609acf1f120117f1174435780cccd26336123bc03cfcdd3fac2132820d6faed74abf9b1b29c1ea25c618afb07d638c3146902cd65a6bad52f610620e7d90213970dcf80c001036e4fd33925e003f2f2b43d7fd8642a15088527a84945246dbfaadeb6eb08a31c65879d63ff817e19201a4c93ecc69f3d8a8a24b72e474bad1830ad606f0869f3f810e97fb7e90c83ad8fd9d534f06f91fbbddf2f35d07deeed37d1495a0c7f8bce78a9d119f8b9df48000e10bfaf682f0057d33de8f803ee8bdaf0718a0a75f1f06e663be1a693ceed99bc17ecc10fb319ff7cd44a0043dc609e483bee71aef0b6d002fa7c3fd70a28f8c7ad9ebb82f6c6c62fd7360439ef12039e06bf57ca1e8f6733f2bc27156c435d25899108ee71a219e837630a71466446415a6d66a63ce39a70e9348245598da9da304db452f3a78716fcf8b2ad61491b8754422e97dbc17aee99085ebefa8482272d2c18103a777a8748db805356534020000000033150000200c0a860322e17848260a728d0f14800c70884082583e1a48b32088611ca4903106210300060404400433ac14053a62ebe1d49c3cda53fe7eae98e3e643a94226bf60417b85a91e3e638bffe5089ea7e763537b32c3cd1b038c3ed906023efb9e63f336e064a8a5567cffe1dbc0c094a9331d30f3b69c1fa8766c68dcdec5dbf79c271ee0c74b7ffa91677432bea0e7760a7cc1827b9935fc8bf91b5072e98c86924426c89c405bcd9ec76dbe2abf8b798d697cbdc896c50bd10f35b60d3eeee2e3a9e6833d8c3fdc9099ab586de87e245e3dd53f5a77d96d350a46ee4a20ec638faca8d75b58722f4c9d5bf121a79728d4dbff51812d25abf793941e0c2a3e16ace0527081eb1399986398e835311a9d843c292e10d193638c719ef7cfd7f6db872fb15176b6af55a7c41259774b743e7789008dcd33fdb5aeee4c0821d8133f78bf84d086cce763fd2975d25249e98900256f18c87ec3ec65ba3796c66396f3d40cb3e4c9235fbd9c386e20e511a6494adf8484fec0ac303cc9fd5ce9de955f3b8c3d890d84fc9f49851918390692050b930aa0579e9ad95d4f67abac99a2156e8e93dccbeff8726d19dbe1f738d5e6ed7c81f89e00e560d99582d3511fd4eae2c29a878ccd80c50717ab9af4827868365075a7a67f4f981646cae036e7d550443e5b091d11a8dbb68935740a15ed5daab9b4b9c564bedf47b8c41e2b26eb9f4fab1ebcac8d42f858421a2789cb6abeafa8603cd6dc3ae1df90ee6c4ac2ee834dd2688f12d65da7c2fb57c0b5720d571f17e5b89b64333557a8403c519ee0153a81296d23cb115ec9cc8faeced45f44fabdbb023c37503c1bda0f244dd058a0871e98bbd4e82b4b63b49ad2739856ea36ca901473eb0b125b68361cadce9e8fb4c36654b25830f9d53498c9060d377291e29da82124d2f2f2b081a8f4863e004b0616448ec2caf20752c8ec48e23aab98bd5aa73d6e853ece07c8aa7c44562ff00118bb279768075bf267ac182846526963eace6824eb4f159bc13b95b78e24f09182615f1f6c8da9cedecf86c906d856644d1778143198c830b1d57beb955188d86a275864d4f5fa80a4c72e30164540087cc42ff9727c32262ea5fc500adfbdc04c1a29e92a9f226a78adad762c357c9c06f4635c001d00ce22e486d8041ce8b8063ddf6937531de8bfaac2e6631107123727a9dd72003ae25618b18b7d7895e442553a98a6bd0b626aaf43ebaf5713efdde821caccb1fc37d15039cdd5081133f990cdbd4572ba8199fae0fd85cb60836e247223e06cd98b1a2fa39f743322774f5ba60978abce004c9f467bb2bcd1b1d1f16bc0c0b1bfe4380594a60e8c292610bca3f87e4b333474b25b02f8c15541743895ff0d42318117dd915595f6cdc4236582b62383e04de142221d853474510a33e68c682aba033e40b58ebc76bbc6290c30773b02cf76fcd1178b3a2ee7f8e8f0fc7390ab6e209eaf8cda14e00a8d0df50fb9901c367b8d55d2671cb402de4f72c2e7e2287ffdb07044884a22902a1b17269804e76d75db1de3187ae9943411682352fa2fa673fb0b818702808f2048681c5785b1afda62f312e6b7b34085bd8e3327cd5a3516ea969af67a2efb5fa660a86b841d56073fecdc848b0ab4820cf1ba6a0518546fddc3aa69f5022edec05965ae0c3dc47e8a6e85fc73ac1b4e09da48ed3d53a56bc3688a032d9ee5c8a52c55e44998a3c187ff1d5957efcbe0dd644cfb9adfe76930432b7015d19ac16f64b416e9a0b4d35431c27fa157c4d6546b94469717208a9ef5e444089ea933e9cc3c016aa0d2d87cbb90bd340d5d291e694d283f019bfc4f428959d736f5b64ec3e26bd24ca3c5f47394d134b17a824e181534f7c4c7016c5975e862d77f7c17203f98155dc4bc3dde2706189ca8a0f30cdb6ff0b7ac52c187aacf776aca195613a013c29d387817a57895e7df921f24384c56e9bc980f61534848c2bf683912224128644ca8599eb24a5afe099b80a72846470d30e9667628615161a4e182ca3ecc012a5f463a792f424412cb371d5289c610963613d2c89bf147ab590b596ad168d09f959ef77dcd554a927e8557c038723f857f9a6fdf08cc80a557b738a86981da9b15998db868ef528d12ae19edf7e79192f43b0030a00dd35ae6422ac970c657fc6f05d16c62d285b56ae153ba5ebf61882126f6416070e6d6caafc044f1410cafcbec35560083280eb41ae14101b312a1f906d0803adeca8d56e3b55c8b7d59082f6f0967ca9c3013ee94d68236909f3592ba01c801f3066d9e8f53db3ee9917d641c7afabdcef143a35918ff1e0b3ee042966632845372cb10a3d3d7165f0781b38fc300e1a6855ff14a54d9e0b85da30c8e917554f58acb08ce62b3b4d0f0cc431fe514351b0dcfa6ee4a38048fa8e95ccc4ac6a6bf7187a708329cbbfb45a20400f766dc5fbe3f8bd6c01c11363d1d5403eb63a2e564ca500c7c5ab9e57b63b842a4ca541f88c27623994bd1223e82a53e4ffd467bf353255ec48c98d1304d65a0bc0bdafa55e8ddf9fa060cf497c2745543ad5855612761105814e8c8dfe28965282f1121502ac17f9e23fd242b5509870abb0cfc3cea02d28700aae84c53c47ee4bf9f48611b8c30af99f36881d16a91b2626e9fa5b2fe34126128a51b518ff14868931744b9cefdf7d89295be661474a494f2305e25a17568dc11611278160b9ea49ac7aa0c4f9d1ae59aebd032ee838a6fe11299727b97cb6f0f3891bbd69cb48535d2f68b8e28d7a7e27b8cf0b8d8e20ffa142478c06d8a0bc22ac0d7ba8b3afc491980c809b0eceec3fd899fc402108979470025ebe8a8a222f98194fb3e9316e16ef9effd147df3da0eba96289ae5ca9e362b9fedc74695958a965df4dad6b72fff8d05d4a4be04e5dcb923077c745526bae38d9d6774e4e7e63afd4922fb947b0572807c84f889a32f90fb771a682a9bdf5155a31e0986d469b0e69181d19624d0ae384985681c49ffcb2e141ea8440f30b0d206d9815d7ce97d04067f1001a7f9aa4cea198e2bc91f6310bbd35cb4658d06a1e560182dce36c20e3ce539d4aae733fbc4a2edb6a1cbf13e18d3c52332047fd2f87bb177025aaecd21a3d78b3f859ad953338f7d710c9944a348921805137c51cee1ebf3b7abd2bd2eff48bc6c2f9f3bdd0b32de2ab613313936e325cbe3749ffa7a6377a01532bf8303a282701f102eb21647f7cd7fe6703cf7f5a0f1fbb0a0ecce432b02d948eb1bb99f850eca8db8a04a2a42df4ae6d8640c26f51a6926fbbd67a5c6f408c0d2229665949e909f22b189f71e1b69207e6e162b7c085dc9b1f84c419878845a611d6c7e1500a61d132064056bb5329615241cd71aa62ee67df9700cf1ef5725fad2508f59f41c94cb7ab6362247b7d9b9914c94602e602c81e1e69b2746dfbcfa05eecd43af1277f83745bf2a2bcc8105fbea6e82656bc44a25427fafd91311c34049fbd38599b17536390b654c662572d6180f070a5e1a5eefbaee7b186f2a51d0f94eb86423f7049c09867a6ba0e8e831c963a0895b087d0a72382505fd857e22f100695c6b2db6d500b563e0d93810de15bc602be8ef3e3e953f6f5071a3cca42145469abf001a1d644e6470733ab6f9153268eb85fcedc950150ede8e01fb480db574c85a9a2f49e5df326c5bedc8ad6e28ef29d8fcf5f0188892809f680888a9dc93c51f3f66d98713b45e19ce33b05c4f11d7bb1fb015bdaf0629ffc8633b1a0fa3aa3800fa003a7f72e4a60588ec8743207b6f21cf9f96b0fe20cb33d3e5361989f0cfa05ee8ac497760cb21e4e253876ea6c690fc812946908b79e8a354dd2665f3415cfa23420fee8b62d1743447aab966c99df93050992cda4ba6125f713a111191a8220b177f575b71426f3c25aea18ea52b6e24be13f90de47ccec53fc53d328697ffa8601d6f804022c3cb68e97f047cc83abf819d3218d36ec4d9951ade708a04561c7eba07edc995ed404c7c1b7f174246a2509c5aaf325d3ab9e467377de354d7d1802a79804da159f2fbe2af88adc376df0046f15a7c6bd109475608da1dabd3043aaa2d9fd190f62e131fabe00eb1487c39431aff841da124546423ce668fe09ee5500fd5abaacf527d06e5dcc128e77c0f530ccaed2e9c9d4b0461c8cf5af3bbefff458dc6aa2eefefc4f69e522bff8463d0343815021966c9f5aee60e025d943f37baeca3e0421500081742a80c14d9ee95d07f88d88e62e88640803219da46a860f1d8aa905b12356aa842f2d8e4bd536e625d3488720018d8663186c8cad165e9f3e44f6b6ca5da5329850b9332056d0ecc5c1cc7eb691c14d2aa9344cae648988be775ed2a5a3767493f9ceebfb7e54268d5c133addbd8c83e93504f758d452df4d7387168061150bf8d1c2e562078c4ceb31eb453672d4e18c45a5c7d50b3d76f27351715f300aa0507b2293d88489abbce4edea2a30b1295927f983f4e9fce7b547a49b1f2dfa38a0bb207e1a3a12d89eac800d15deb523fcc44cedc16afbc04e160e26662b2da8f05d238d6b81fb8abbc5c40e5c7ab175242d54e20fa0f839d54b32ec3ba87ef63e407746998e6536fa169dfd074af8a30a42996c6bc6f155698dfcc3ae14b76c556f0c2e790ac3ed65101d3f746a62e45d12556afc0841c038a7f9226ac88bff4c9e13eaa2ced3719a7a6cdf72771d3d1420cf79af1945e6299988d9630305f06c1643bc4a42d090e97a460602988dd09d55a0f3338ddb4f6898290dc1bb69701dd35b1457e1a0170b56380b06e82a7e86aa2ad2dae523308089e49c7b499da12a5826b44556984b4ce04b44412848a638881b2275c58d00ccce7200eeb5771b9895f0ed4d841fda00b28ca8cfc8f9a3249ecdfc74398fcabc720b8d458b3557ed9fc641f213abf5a7856f49394d2cb8b1a3196f55fba01a9691fe8d5c96701cb0d89f20245c76fc4ca49b6467f2a233142aad5ea75b0b4599ee4a86bf48f546db9f59396f73a836c176ea6544b4a640d6c5cb5135c29dc7ca942ef01f1e9c93e1520c961a1333f1625e04057ffdd71386530417f1a5d7a7b6c91ca2c870f23eb8cce3d44f66492c44a8f353f836afba51fc3d64c372c2e8b473a721254bcf0bfceff3867966954f999a814c4a5d0b0b154b6a3aa5f83770e14de14c8e9c390d8410ff361d5f0838dfe306959254f62e48adc6112ae26527bb0062c12ba5efc99a6fa8fd341bca9730ca51a730e8086ddc4bfda344f91bda9685e9867f16964af46d2da38c4fa40aa814aa99d13749bf4ee6d155d113be71763d80333ccbe9ad85090b228552db7b5bc3851cca82e80705b740df45251a2b3321d7c5ddb0fc8e064c802ad6907067bfb6d3ea8bef3726c87bdbef9f5cca7f30d644a1f5919df5ca9f58d02dc53007b2c001b05008efd46bff4948e11197283f84526e333ea5949f592a79c9a487ee2deaf5aa02d976a25db0710717faf8b196f6df9939ea8f409defac02ec7e97fad3500286567a1fb4178d785b85619f23ef685ce551434af46516459e00fb1c5a1b88c1ed57300fec042a57f70f91aed1093ecc1f4af0d1e34f494adc503a0a40739769cc95808f2f1e88520ae5b3f5940995ba243a12576a917d1beee263657207e7ad94cd2b06b3068c011c60fb1ff9dfd2c07386d0aa3c7f461d382f9ebb705aa3db04f03b651ff004c518e63f7c65baeb517b0845d83523f57feb52cd31a0dc803ebcc521b34e3c58081033b77650efa62e9187d2291b314604b21df488e64f4990c8990a6f36a9367bc838d6719d2ac2d1a2d7d667b56511b37271a94e6ca3caac8e3a1d013a16037807ebcdfe18bfb9e0f6521cb87e4fe087283a3875e9e60b550a0ddaf9eb2b672bc3d3a708b915eb573e4eb36cd2b7774b21f8a3504794586673342f0e8b13d13e46855f2aae9493fb020bdb826bdef0cb42a5aba683fbe60c48146a1a77da9187a73b833550c8bb91060d970ac3d2ec5757b6353eac66c81f4a8e488fe6eb69e88086ca3633b5b3655a07c8dd2ce7cbbb26589b4b8f21d43d723f80f0c7cd8535217eae639934e30caa982bfab4a6c3b38fdf4e163110414168ae9a527a6605160885dc7199f8cc3d9afdf7a369f26742ea7df8486badc6bd765a2fccd717800d46c36962271b06b00dbcfe576984c58b5e7deebc5b0d24608a87799298632ef373118d225bed47cd647e298643587c0a430b01ca837c52e0788df4030c6b52b278bf8b5847f8498a9496aac1b54815cfb50c33e5f0581ddda77c7d95c38ef4d9ff0268aecdd02d7b164bdd7267b66e91f0cb5533ba3cd65840ae0303838d390668185f0f8b6235ce490134eaa7e76ee062c82999e666f30ad251cde26fa4aa5746ea2acbbc55ea1dd785d357099c6b0ee1686d9d4942aa96081d29bab3545acbbd2430500971ed86b1f0b2482530ed2ebf14f7bd4ad3ff94eca7831fb70062ce6731ed80454ba3bdf7475c4b919f13c491ccdf5669416d170e0c5793df76518e18c3772e91b5ef1c6095fd9d4bfe0d973b3666042df85b6e02f1973eceead3aa3502498508f7c082d764a1926122900a2c20f4366592563d1b55f972488987214d63853a6036339fc387248f9da2ef7214e7991c23a16b04431468d795e3c7b2da99257f678d231d8b89cc96a26a68c4b8d82a451fd8ad2c79546402bfa365c58f8bc31137fafdd03be7cef9c594a4b7f1ab17fbe233a665c1f071e5a3073c1cfea76b9b1252409bfb16ace86d006880d08f0a035f26e689f27a77e7430d41b77785b56d31c307d2c0b4b1a33d8ad0dcb042a2330947513140aae52d98ca629b717ece28ebc04fcd85c549ec66f63ed8dd952f1aeffc971f5469330250336e774f057afb15b224c07716bc2b2b33d1c490a67ac82f84147c54181cccd0fa76f5d3cac128c8dd781158ffb581ad87c8e0abda6771283d6995cc2e27a78bc28f9dcb6ab478a95f01047a55321a3ba8b0eda1db2d9e8eeef611a0e0501a83cd3b17567dd1888a1f0aa7b72c48fcdde05c13e5c909eed65b6fdaf0ffe305445d988476f4d518566aa03dde53ea7c45cd1d63cc700457b20e7999b1b04eec640c4e03c0250477b4c24b34513fbd7a58eae9ca9daa3edc905d52069886e01351a9d344404b52337532253dc27b3685bd71cc26f8626e9b1b1f8f0d51fcc83cabc8592099d3241cb7af063e03d71f688938becf2efc9160494a2ac78d5074e928382d6412719339a6e7b07234699d5147c1b8a985495bed6f49926844b2300a0c9f7aab8445de6796253f54205e446f2cd0113a8c3ebb7d3e57361f03cd71a21c2319efa7da6c0f3c417ae916fbacef331ca8196f8d104e594b55be7f9a9a11cea92feb65579f2faeb5d2d2895044ca2979969e3b65d790a0d0765aeeaf254e1370465677b6a2366602d1328664f23693de008ff39441030f1150733fadfeb6c38cff28519b02a145a4c6364d05a756b1e78670fbddedc947e13b6ae175fefd15a10564252275495f6b34c996bcfbb743644cbf89a69b252966f9f4047f5f21011a90f85bab824dd2974a5125f8bc6ad6b4a80090105e6f8342649fcd4da0d86ecd4984e72783f6d1e657e3da8b9cb43194c59fc429709e4e5023e8bb5c50e864d27a11a6d3742b5acadc4f23ae21456b9020ee694b7de5663a7a86670f34d5217f72564eae30bc40f510c2c60b081230adc5c2aacafd1e66f9568b5703f6446c504756ee69733fad92e9aa689823d0a23b97d46b99612182c95bafc9819ff1067cb41922db2dbd3ad5bfe33b48767a688aa33f393abf4933263989a7a564345d7c83d0548487b0e09649f112201c3ed470109dec0296820e1505b76575d44d4befff5dfd01c1fc49b010593470761108bde3a441c7c4fdaafb190b564170de9ab9df051e7bb0adcd9908e391dbad9f0ebf0477675ecdf311799e69b02ee8318bbd2a025c3c0edaac4a3592b79f62a4837314c11201a84f31e9e6d958e57866040a5f2bb06982cce859b06162e7a040a5b33f2be5623200756880a328c9a19ae924fb7c896f5496a60340abc3125eec47590fb92dd03ca44299e8716bea1d047d06acc421483b6e41fc46a4a745e158aca19797068758b833d51a5179d53d42138f6381735cbbb0c2b54426754a62afaa6fa98d0cb4625e0b03ca0a3d371cd2e6dd1ad6da6d2bdb297f5f13f597d5b7077ad97108d0e98ef8ad3321cb4370e8bf374dc67e3e00030171ee1601d2f95086414f8c70209dc1716a50219e35992df51d221d1fdc9a18a45e8b29ac81e5ca93d30d428216c45440b8cd926add5519b0054bb86a61b307c22323015401c2eb728da840ef047d4c2abf2996a60944aae607e0e052139c6d12df55f4e28505a16c0e7ac134af49afc298e4f7493270bfa502282bf2bd621c1aa9383e0a92d5858523b198cc46a14067c1e00d8de0b32ed1c531761786b9e130d373eb9fccc6eeb2eda5d8f75785b906bc1c05906e0097234487c6f9c1bce308eafa1615256edc6b6b87a2e70d81c86576634bba14ef1b2daf37a283a5f4cb18ae78e59b20362d53afe4710bcf560be1b0bd378dc7d95accdcd00d0c880634eeca564b4796895b914c7c506238ae3c395a68137a2195e000451995588909204a746379ac80f54b7755f9c430f7dac534b39ad28c28b99e8015638307e72450b8cb6d56c68b791582e86757a7cb90d014c783178b14b8bfe53fb1abf2a9111591961bd0131261c82275d1628a06024cd36e44e0e4fd5204894b6e17086a8c8ba36d0aeab3737556bc35642082d351adfa2270bc1faf0ba09d661ab6cf443caca1997093d787a97413cae68482221254ca6ad099580274db1646fc195b4b105cfed9fba2d3ccabff992b2e05a6aebb5d6ebc7ae40ddde56c86763007485ae72adbc1375be6925b889e3e02259bf24b1aa12b76f9ad65306490fd405938953c69b71f50d702e82e4c451a537200e3cc349f342daf3a4c3c7ccb0f15e616383124ba5de8ac5d60764c040ff56c415220aea6222300c018f7ca2ea3dc57d508c677b779fdfb326d77d64b7cc573d08f2d8d48e79cecd62f080f04b96580534a807432fe4e4f0433472e7030652a9a146b463f83bc36b46c41ffb48b1325c11a3538a845639d98c970e1445658a013a8d9a72ba36aedb034b621b89d757e460e32d771eb95782d6fc4a726c9accb93774b04d23430bc9e39b9c2181878fe1ceb632adbbf2df4fb39fc55a73fe78cf0a50a40791b2f94d84e756b7c29e6f7f8f0f4c44a87775423b21980066231bd3cb306d03a86ebfc70a38aeecec325b7f9e8c4ac1494ee261f2a283ad8a2970450d2cd5254dbefa371d98ba1b27bfa0284bfb1e4d069735b724225ad6d93912466c1a74f07cd9843d4c411fc05540c4777283635a8ba7322b10910fba436c84809e0c1cb773f53860351cace24da7f26f1aa05ae4c0a1a1cfca141c8d28c05a16ac2cb83404860d2702cccb54f37aa462a600e70546cd3e426f7ced4f257c8a47f406b1a0696ba3af516dd6e02e3d55df110ee1ad2539d3d21f7fdda85ead65d32d69791e0ab6b3be2b2a3f158a38b2d8a25ca8ceae350e29a573a3e1c28310a92bfd4cccaa5ca4602788c2936196e7b694c31001029e7e9131abc4e57be60c8d60d90dcb73f084ff7735d9b6b40e357f528f934cc700c8d873c4018b91b15293e280528bc1abbc95f361e5aa23a6df9f4c3ff3a5c6be857892e384b0889b5c844f5f0c63a698c04bff8571655ba39c0d6d98bb355d39b4eb75e43715665d93f7d840aac0539d367298834087915c53105f9282082bf20629b93072355d70ab1772d0069349560a1901db72e359a81848280cbeaaa41a6255212fc3c9d2c035f185fb6c3f0a95daac8bbc6b7baeb449199ca6e671f1116ff046fc4d2fe77d654cba12b157f2f217f4c9d24de8e021b95fc4bfea89bda26b27e2dff3956947cd72fe88c34e647c24f80a64f157eb3537a44f4560089e81ce39f4814c7c921a1fa0c5e85666555bdb78b272bde309a023bb70ec66ca3005144d6de55edea7ec7394d1b2eed9087eff331eb5bc5f92efde73c5b1449dfb5f8d822094a12624a6de71d2efba4699d16baf0571eeab785a885669f7a64c1b5cd34d43a2e27d12e5a726b993525c633796837224003c7b3602469c8e509304f21905f743b88340ed228bb1ec4ad54bbeb07e8216d08e31b295c69dc52ef205e8ebf038bed90be5f70c60bcda7782207f3db2650d2154d7d774ee622bc31ae36232a1563d1067b4eb0e46aac2fb174a39c0b066de4ad7ff88b6625f7d7db6823b3c919769223f5971942dd7d3c9ccfa912f38f6096ada99838387799883324dbd265f55e9f8b5d34c3cdc699464517ac47a02a9939a82aa997f3a37696f4fbd9555e4189f787f9f71d3d290864aac4a1cb046a33875f5b32e9096f6969c4948b49ef670d0c8add2dd394568bd98985bc772598d18c3eed9327befa440387134671d89c27a04348f8210988b37304870ae817268ea4b03bdab17d757423f12a239eab66631fbc9b8ab917fb0d2dc0b89ea17114f80e01006014f1608233a4fb1f11c9d1b76e4ec072518d98848fb2373b034060fe6b635dd7af23d1188d3873b11a5eefbc847ab0c8308b41eee2d3bcc5fb3cfffef4a800eeb7a48b65d6991fb630aa53788d49e3abe8faa94d78b2c4f9bbb2769d9501e8c5303be66cb20046b5d82acbe1496501670b2e05439b70e57ac25fb3f018d4d37cb45bf7c42f62aa5e1e221c6b9b28407e6e79f9cf6d1b358d8461b9ffa992b0d40fbb18c5de6aab2aa76e3808fac00e780342c661ad75270afe59adf06d299d15461ef5e081cd4e32aff98ba8f7e200124bb361f1b0116e66e6595819e6eafba9af907db765da91d61dda9a00156948626da81e037589f371aab04fdbe959b4f1fe0d267b311dc59689b8ced5e175a1906f194b21712770f3b31c4ef87a826ae9515df000e88dac119c99004266fc18303621595fb33b04b0b8f6306103924ff5d26540b087aa20df6d04adbb9c265cfb6d23e1de3c43204f48533b6d6a5e7df1827e8f8152c75f7bad60c0c4d3deb6b3de5392798ba377cf6824017190849b04e2e14d774ad42480797d80817db91e36a5f26841809fc418d6695c867d0464db2d4390f4260b4f1bbdde97802cae777bb192f8b093b3ebba2a865458d262b1a1ee4d826bed829bfb52369e4a13307990bffc22269b41963c938b646935bf28b90ab1cb32fb8f5ea03229c8ec4610733b4b09eb5997aecad42b68e119bff37536d9c6fc0e240892d488c8f4e26757f640d94d07fd7a4b49c7042f7aef009a8495af1b9aabaa32b69bfb611c4bb6f53958ee3812cf95c091b0f55220cd3c6d8539e3682de051b36c348243bb6f5636ccb51d3bb4ffdf525e36ca342d7c45c5e112ac40b02af57da520e2ff87c06fd575aa8bd9a2128b9902fe131d9c39a9c7fbf496b50aed58cea85b516ecd60996ff961d073b42bb01ea4b14b6b8608ed3901a7f29302bd825fb74f5054bd1660ecc654e76eaffa4cd88fa28caf6256ec32ceb2c60bc50c1544c0fad34d0a51effc2ed614630e777d126164013d729701fffa0cebd3f6ae55644dc6a0798e2a068fae33840a03f6468b5b22b60db75c6faf8c97e0f069fcbf8fdb60c9cc5879357f0188b68376da4d6a0cdeca36e729a63e0ce5f59de37e3017deb575791c57e9620fb2de96a7d8f21be0a7301939ec61819b8ae52abc17fac40ad022fb06304f71a40d20d7784408a4cfb10636de17817ff6fd862d7ac0bb7c2b640b5751078c4885f4fc28b803ce31b20267443e1251f6f248e0607299a9d912e73a18dda523911c36f840c7fd7064a245478505d30994d090c2291627f44552ce0bbc8a37008de2a018a38a4c55ec085301b5dd89d51ef0981523d72f9697d8158d3d030a48ca9aae08ac397545e443675925f75cf51cda139d3cf07e73397fb8dc520884214c292b43d343258314c471f4068682a463877f12c8581681ae56116198752e6735176004d5934c99e2f84f9072ee8d9d153a340fe80906c95d55a8c9cecc6d502255823e95d971ded6d2d6a1cea2f0496c37e609195b0d0e500bc15228be89f59c4d5599a4c5bc19e816d4f6067aff643c5edafa203832bb50cb18980704e560ad70f57546496b34f2d535c779a2a51596e8c7855c05c0e7cd9a8b916782abc2430131ffc773837f1e26bb650ebb846377daa39324f298956c08ff5cf0fbdf2a3307ce0213b375696e2be34ded5835a6a2d73825f79c92e74add5ab94393066d3821526a7c720e83f80a44abf231a3222f0dc7a4538d2f9141f7d5ca2be517827943108279dbb22385046c5ee71ddf7ea41e16b077016028f0a18f000f821cd83ed20afb1638be0296efb9865c816e6292d4416e165d8f4974c87aa9a1f9a49620494694ffb742a5ebe486c5777243355ccc4d942ee5aa512d80452427b384eb5f8dbfb2a53814d19ac1bb310b8e47e243e615d68d9bb18f33b6c59e6ea4cc0bc61a2a24672f23d9b1430d8953f7be0dba7805714cd2984c13f8a7f55932ecfb1ba008738515170f305854a408f2f25b2780a915575309959024221d8d7d3501a3538b604d2472a73282228eb7ab5f1f23ace15cd85aa28581173b847650731cad92b488f04a9cf1bddb329051e1c411aaca34467f5d1c6105c5cfc059d78f33ea865c8f3787b531c0603bb1c6374ef72adc8106690f86de4806481b7a199ffff55106eadf8e6a2349d3025e9c4d6bacad5b6c569f519f2e85771d601c0014c28c570c17659b9ea605010700789703e086fa669d91ca726bab52998ec221c9bc9bdb144304adff22d3738dd7328b4c19f76c16be3f76833fab29afaa5b0c0b15135d7c3a80421a150c48fa4f65792d9ecd9e14e7cbf07530f0122f58a1159e1bebabdc375861850d77449bbeb5ecdcad20f2b6b6619bb9e57520d187f8eee371a0f01c784d1491746686ce3415520922ff10b49cc4aeabb185a9f41c449129b99c51658acd5ee7418027c7feb40ba420ebbfa2e759895257576d9adae4119ca5949d7ca113a18a1e7aaa4a0f5574b0128fda51ac7f91453424e4550ec0b7f3643fc4f7ac1900803085384deb4e016f21bccc1007cebd66d52ecd217adfcc785d857f162877d41016f197b4e2f916689bc7d4b205625c4d348165d917dbb981816180bc59afeca4184c842973693b6568f36e477a801a8b4e6d6c81710167cffd5929afb761c2101acbf754f7a08583f33dde4978af1af3510046f0db6756684ebe3e1401d81c00e20f3185a863e216efba675453b202d28c62e3491d6eb63c7d37aa10035c85a7517795a330b154c7cb2f6083c136e9fbb25c36e6fb192d8fd5d55c7d99f40dcc6518a419cbe4e4bc143aa301705733a263402ace984fb039ceae69907c022f7219788edf9c91d30281ea6026149c39e2c208d6337e76289c62d7febb1dd5101338d03c489b6adc2a94708a556c6b3558e49ac548eb29cb428c0b584cdbb554f3473f478d86a071e67cb2857ac6331c1a99c89537623d4ade22a5b8bb3f58c066cdd5a78245b54d1b46c5508e9aa5ca480d6c0197c30ef4ec078d86c7c72b9b43f53201f6bcd62b5ab8d7b67b01078e005fb58ddf52c091c11fc63a04db4d4f5ba97598ba81cf668ca917e6bf1b021779ac9acc81b2ff42fb06b2cefd491adb7d616bac7d314212a8966e5c79f95bedf02304968fbb040c76d423533b96402fe7407535ae831ae5cc893342eaa58a7052658c43ccdf677c5b9a0a729ce66716d1e0e7138fd5713c02d3d3aaeaaf2430543c12610caceb5e667c3eefb43e9c4dde55220ecaf3df2d3e55fc660fdfd6d8f4a399394c1fad386e3a30945c406ddb95cce3faa541aa011b4fceddf4f4fa5eb8491ad0598cb7f35dab27f8f5d0179ee5c3ff96d970c92dbd67826be8b92a1012207fd80ccf0df4f7663abe11e21717fb20a130a4b7cc3f2a4ad0909836f3255c844d43e9eec2e91a5683962f89c0b8c5c7818e376b0dad205bdcce83f18f207c2e7fc4ea3f106ce02ae803ceefd8611c8b708b335f8c2fd637200cb678123037135e0f237e6f9f18b04e30947bc0f0ca60895407b3e65dbb7720ab08f8fa46332dfd0e26a4dece89b67229f4a44ce1228e404b179442133e9a6cf90af982dc87c8495ed2f55e69c3641533bb5c644f8dcb161f8373a87f8d90984853151252daf616c94e0576a0df0d7d8c8ac2c6df90eb70af87ba0ce497d35a1b0b9941beaa5f6f17d3866a3bf3eba92347c56e7195483a6b66dc4d504da7b010674f4197340b44bb4cdd871c20502fd1caea9b820fcd47c828afa01021027e538b49239b9a990ef86730c82a4a9372e956c04a92b2ad355c1b423d487c3cbc112a990e72f755b721057880a4690a8d1f92099757ba174d7d887f1d9db36756d051ededd04c9b5b5020f15eeda6e02d5bea38696fc277177cca7dafadfb0184ed207ad0f840e0d27bfa626e48ade790a78f6f0cd5a127e283a93ada77af832706bc1a66d87f73f7f70b26859093f05ca7baa3432cafd5a42981ace66c4bcec1404856bef94b15c0af397bada8e30fed61f41681050cf98c9bafc5f6b94d8e9adc8551a31608eb43ff9754dc6d389eb6c7eec194c6234735aaeb5ed3740c5712e0a2c4d550bbbd3820d8353c12a80089856d01d1f559bb8c3d85d141e571c7351aa84001f802004f06e06e0ee4f9418253194a80cae1f68f3ea80186a35893eac6c32be4dfe0731b4322014d8b666a58081ba67c209afea223cf0750746672e268094cb4b1464c4b47a6b3c00476b645250105717a8ed7b42809e35ba86b264e7fac5d704493bde4bcbea7f7852649929b2eb3f1633f1f9fbf8d7a208dbc9b3ab3dfb9b2449c00afcd03ba03660811f9b6bda0d92003dcef87b32e1856e5d1cabe9568beb8ca647d0d32f9e2b040f0c30ae8ba71c02914658d6b47e31d620e7e85d4c6e32acaa125dce72acaf3c3af1770bf1ec9a2c88cf20ab6be60c9a44b0a092432f54e4d31abd701d5515cad6f30f9a62f20a5b983f39fbc3aa7997b9e60fae514f7ca3a18312f396ea699b7362b25e2132c34c1657adbeed960afbb0aac991742f204aaccd7f80432ad058ac4062b68d5d16e8ff8953dc32adc059dc572baa1b7495a0cab58ea3eb14e0103ad282a56b91ed5d43d6e0f18f175c98e02eda980b864ce32368c60381a9912a4494a376d874de059734e878e1fe264c61451161c4d303c98339c530d2a5329245ee2f081964883cfe76601fecbd0e9cb22033e74cadb3dc5857a37c64b5e01c1d6f809f810563b38d000c7557613475297eafb8e2587192fb9cb048869ac64a48737d4971363c80a054806df784cc5ef30e083e9ac6eb8c1701b08495a832340270a4b604a9f2deedeadbf50a16f12aa03dfb2d8009028f3e9baf68732fc24a95b65feb3fd0c25e7b52b021a50c85c02830f7dd0729bfcb440fa7a471cd5ed864487bd068a0a766b5e15305934d2ab6caa449ebee6c51869a064dcdd418306763257289ca32e0a7be9a93e866f388cbd85fadb7d68f55e346b6f7fd5837b3a71ac6e245b39c1f1bf48b0937dcc0045d32a2c8f9ce0f4a29deccffb65d35af6994a24b743137efda26c028afc0482ca9034ef0005a8ba5ec7c450f486b84c65deab89d00acbcaffd3191026b01017b56bad2969c35f79fab7d7e6e555015ea9872557a551cf7636fa579cbaa67e1867991c93db45ec52ed559819a3701d6daf9c104dff2647451dcbdd51ce1f837a86dce8a7e6708abce62b85fd8d8130c8834c7446c571139b3df6a375b97a55556f7199c74787303703de9ceafc1880179a61a075f80761836b98ae5502c1dc9d860a244328d1a33229c3fd7b61fea92b8bac334cd36b971071f38aa87670dd178417e4ef29bab34e4a22685f57e1cb12c899605bef84494cb058b1458fd683b86517dfc6e142c603e48c6cdfe3813a65b8c8fec9fe86a0a80a20deeca116178e5ae71cbf4226aadb7098aa9a87265437d62583528de7ffb1d26c887e855de6befacfa6ad6ba55b26dd1dd27c238589144a2080d8a1dfb3979aa1c8e0e1691ad3911ba66b1ff705856e0d451f8720d2b05964fc6a11509ca76b3060107cadcb45fa3785c418348321caf7470dd5e52f756d89ef4642e241e06cc8626af2d0db5da0d76ba074c59a0f8496f45a1d55b61dc9abe52e250a34f6ec79cf353998e712c62e9e7782c24b68676813113269263bd5a36801f88c39dde6f7dfef6ea4c3972c4958fb0fe63b268dff39f7b3df2481ea4acf1bb5db76fba5c4981b7eab77db2c23de2b11e2ead7db601cd1b6f5e86b5e6c37418763555bc8458eff7e802b18335c72ce12fff68ee581e3e230af6a56bc0c9dc99921ebcbd1674bee1b902237f9ab70edb6b655e82cd7cba88b8e2849e2f15dd206721ad142984f65ef13f3f143e5d95c25e37c4672f3efd4393c0f26b5280dc330e74a704fd6421505f65a923a4b21c40668102f7b15dcd0f82938fad13c4747c591a3ee84725634186877219dbdebbbcb83b98118a4640fe93305b571e7e912112e63e1aab96867e438c612ff5b32b828b09dddc147db76cffe1dc8b6542d388948222c1956118a203456e37ba6178300fbf711de38c758531b004a227f1fdab53a826adf3e6329dbc6cc72f3ae57e566c502fce9aaaf7d8bd42dcbbcded253e6478429bf846db7c0185e590d391a1da5eadfcadfec21aabbbe9c8e97706c6eced6f8b1960f41e6086baa9c2f4385195b124df5825dab2e57afce2ce59628ef6df2f5c644de08071db5a1ffb3d061c3ba083c4c874bd9d040c87dce6d7039550afd7ba98da24f7fd96a07f44040639452d1e8407272a137c28233a650706cd554d37c5f44466dde0777c801ca7af1b3e29d38e2b32321cdf8f26d269a8c1dac3f5e95f0393d2fd0c1911bfcce84da0112d556df7b06748c14c66b1b2910840991a75184b669b0a83bbd65a4267d8cd65400e4adc7ec4c706a478ed4d5a7923e8bf68941a6f397b914aa2137daaf543c73f8415329a5277aa90f6a632d1bb41ba4a9da1bf741b9e640dea902c906f510af80843fb59f17dc8dee8f27c4b255c0338ae75918311eab7100518f536fc3f1927bb56e3b186a9526748c61f7cd768fa1ad1e4376c6dd8ae91391a8a7671ec8b446b47d8d92a27ae5aca8d20368870a731aa411a2ae493fd133ddfb2a2ddcee5a8b6ac3665a6fee0c64124f07339b24d4ae9ddcf0f46ec28c636ac7fa209fa4c8cfac5c4c0171df05e4d8c69b8516816b0df2b05862471f65a7612da344c479270a78cbbb54d6f496a2333024b818b0d21910658e6aad69ab2c816a8d9af76b2576b1447f613039a5757d131b2bfc37351642e3ae6a2b8b262d4160225f937190bc7bd8b774edd8eb2d12108597a1e5cb05213fdb0cf0e1458f16c74c71105ad80a14ed1680dad776e6213c2f7a65cfdca20cb7517802c7d30d25ced7df83a0dbce5212f427989db4edad7622bd731d9d74b62a318858e0586547395d772f5f7d0ab376bd6839b9c15be9c111181d0d5c3cd460a0d1273bbb818d07bb0ed2a9dba9cb59b0e839bc040bed2809aca1b069a83dfe6da1b1b800bce62747dd66a3d270991335d0a80f1fc555a6c52b458369db029071183296ed98990f888ae7240bf8ba8609111b01f64dd4c7f9df805b81a58abb8ef49be421820093b54efa715f42dafa6e71a205c7252caf80b72d2ae51c0c017d40218932150304b2bd548e4bb009aa5a968d182f9d4702f4141208695d230ae6f4c8f7cc28698d3b0672acf0df2c36e57500429b460cc89eec2846e14ccbb2c2d569121dbd8fac0f8f291c02e152e0f51889b02e88b8469ef16e37354f3f63fd038696aeb8ae5574334845ee23ab2ec48cd066aabfee7ba85ce307242abf794d2128608510bc60a4774da2c9074ca44623460ed6da1c958aa10a88deba50b1df4d783618d2a30186845edb4d44a24cf3aee719f0db34cba41ad30430db935c2f30d276f11e35b47b6315e82534d07f8b1696cfba72581e5fa3cba2e7befa8c8350d68315c7f758d87da0ca0bae484b910babc2f0153255da145dee6546d8431fe487998facc1e8a18b4b2017c0f8a993b08a4f853d645cfdd7f12294f6e65057717656971d2bdaf8846350e6a7b4db5565bb91a6f13eb8421f1bcdaba61f5da99fef77b9b8b6ab5dfdb0a1fcbd2624146e6c54efe99002a7d1ccef3a6a049aa79b3ac7a082c9a9f6702df0e8f1fd1c3e0907d13ca2d5c9943be4b5465b0a5922f69f1514bea4cee8368afdb09264d20a92b4b0d54a917b8554efaf87062f2e7c1441b8a6a44eea9fb61fa5d28b2dd1fd20e88281f1ff52d248786693efa499ebd7464b3738aced1f499222af7caebdc4e21c5893461621afffc7edb52f2f928747875a10593dc114836349b219122553d8acb0eccbb105349265538ff196a8cfe7293dfa81ba58ca7b7979ee3300d90c5393ac4a82c6276c57f930346deb7721b993b1bae09e47cd6272867e5b236920ac3efb9b9d6b41e29ec033a586071e5e53cb11e1a8293e1b49673624225597c49a63755c2f53f95e7c5d0857afb31ad163362c4f8535e2b2df837d64c0b6adaf017851baa167877f63733b6715993e3105d6b1a8f6202388fd5d6ce021ed6bd30f7c2145977e786dbbe968e032ee5929e65bb5f1f17ecbba8a587c29d69fe430780d30434db3f205e13022675a75dbb582c0ec8bbf00b37e157934cd16864af98080ce4789b24c40dde2d45692e51726f42e5f5c406deaf27b33c2e268dc7ae03f8d466f5a6043b814fe0a23cc85b7f6e69b6750e3b9352b34e78471f628ddee680be61a2cb8b371d324451181e54b00468eb1edd149feb6bd8b65621b6908b9d90dd1d76da5d212bb6afd6094a2398b2c54f41650082aa65511cbc89f8dd6b8ba81a187e288d75f120fc6581583d6502bb0b22bfa99cd1ee45bf31a3b9039587081cf28a91496152901d9fc965c954cc71dba5c4dafee67f7c0b2b62a1d7616999b27bcea58bcbbd55d7956ba41793854e4d2c59b51d6a9114142edcbe9a6e95cd0a1733b4c2ef80dfbe56c5e92d516edc68646f89ef271cd3667e0c3278c8f968e8020bbe7f51b65fe82cba0ba3104c48716d03d3975ff1046e6644b528c89f10624c1f99b4cc2936f268cb7defa05d49f15d5a82946c98a634d9004a315d50364ad980915a758b35ce3e91962e96199ede91d2cddd212f2f3b1efa465e0ed0626a5fea7652b4fd2aaec1183db649ee9504d5cc415a0f92aeac9a4afc1288341d8cf74a711984beb31a82fb605cbe77599fac0c08ab17929c6367ac54c9c547385518ce3a20ac03f700d97b38167f15e8011d92526a9d6391a57e297222d6a00a9be584d59ee91449bea91c52a80087942c66ef1ac5bbe7f38a3060b444552cc58a6b92fe4dc679542f84061ab27264ede6aafbfcbfc1d506da2b43970db032dafc7056419c003e7614b154482077ca1ddc54a0a446a8116a70f0c6c241ce2b43567bd8416fd29471544ae581740ce95a52983ec0963aa073755b73f0e5c12d796b05c6a7542d9e4e4d092fb8ee0dc89a8f5465a43e0a92c927bb32d16bd6055d2e2abe860eb4bbd652ef090dfbc52ec9fb3e86a069ea63fe3390ffba165177cb3768e7bc5e45d0b86b0aac27d6660426af993da77b80794d1532c1e20d8c52e89fdc370f8f1b087ab689df216285ad668f1a39985fdb8dae8e226e54ad723ac96f8fc4a731e0c4116c93fb97c2857ee985a8f60bfadbd82bf2b1d97387c0cfaba64beac91e72d525beff87935115581ab9afd1812f1e61b46d99ab2e9016caa2b6b11a6959d1212e80aadc5c1210bfca8c00d8ed767012d4cf8101a2b4654e10cac7342fee7fd869e8fc83ab7ae0caf55189511f266375b4aa66227e9f3b1f0fd37cf9ec2cd64d27e4c4eab78490d0cbd03ff96237872959b6b64e2893c80512470794b1855e63b1077d40bf835c93b11675d24ad6396a5327321c19543d11bec71cbb802aabfc55b9d09c7d83fca03ee3af414fda88a4eeaccbb3f4717e9aa7d07a0d19f38bfb3ef445c3f6a5d0c1d9d89a2caf7812fc36d1b1e10bc5a3a5435af6e2087c34e770c1d73fabc8f0fa908aa4e487a8d2f11887952008622ab8b8d9db8d981829c54e1a5de3eb3766d0f5955ab74aa2486067cc75f11b74d400329c23c07210bb1bbc39204f83c445de9875f9dcf94e0415271b5925eb32813035122555500f78f0c4a108d7e0a1b119c278920e1f3ba344c1fe250e56a577710377b4d08dbd7dc3491f4c3414bb9fc995fcbd34d7b408f36f3b10d8af513d3a85a62428f949586babd70c15b0630afe1db956d05ec8fd7ee4d4250df08ddf254e1c27ca192accafad9bf4c9301b62b7fab614d0667351334c92a6bf8d2db855b9d2031d371059e1569b4e3df408b4e5613642a6ed26e65c7aec3c2a86cb2533e29e80c08a3d03d0e653c927032393602a02797119d62c678870a7a13b6420bda1889804c73e930f65179fe8023f3fb1661e64d9e5479e247f7c123e9666c19e89b634c322d4d1b3fcc45c61c4b4574822967601096a83d870ac9ef98e82cec79c008de2e0b9c7afc95e86b226dfa81932ba175268f0d7e390951e40af0b057beeeb756f7983496ddf18228bef4b3a8549f943e88946ba49381da02aa1bd67d0d737194cf1dfbb93e36b5ed54887dbf908a353b65092afdda2d4021b575f5ea1d4f9cdd6e968a96ac3dd6a442343d90b1a28ba19d955bcfe338f40f59e53812f5be502e2a082e501c3a356200b47e7f0575bea4bdae77a9e385ea9c2b71817fb942971cd659b2c3b0f80b0342c7c3bba06adc8d75caa5d44209a8bfc55000053d43868041d71065ca61939017c00d16f9398704c052eba7e4869d72369334f29fc432587c5608ddb47bf5e6c08c3ce58bb1257b12973a89b3640110accf4f26a7fd0ae57ac5db02b7709a27f811117bb33669f1139e2043ac9d1286f288cae9696a75522e8f4177ff0b7456f6170892c7865a92ad49af6a85d11ad4bf6cee3d3e80c7388eb3666ebf4997812fe14e795f7515979f5f1ba3de1592c79288408862985bfe5c33a360dc963397a809ebdb21c20d9b681dec0590f8d98ed8d959ef9fc95de6adf19ba01d9049128f3f9f0e087f4c68d201c36b8aea07a3c7577aab068f79f64cd709551beb2165a277d2a2dbf89e653e512f0f4d905c6a5ec25242e220cf838f5382262481b6b298e32438221effd31cf0a49688e574e65e8c081fbf6a680fef754cd9135a16a4f932d23b9524dcb4831b9fc01e52c454a451759a82e776faea3a6f81cfb8373859bef442ed3dea358bafea3501b6b72a0b2886ab83a210b5378bd9563a7908d4d33622dc3e026d79e58f16a22bb7d46adc2a982cede2fcf5ce5ce7c5ab567c4b60d646a762345473296141bf0833e797eefe35713af32669b1cf9617f75c785300e2a092645bb62f23887c13089796a40954bae6426e1898b3c683bf623cc6ccc138445c5c52d1166cec802b0b6b51d52163e6d0c55989cda9f8d68270f9924a52e197cd38c0bba515d2a69a2002162dafbb5258a61581e9cda65163040cf55f7aff0117d6c2587ff5b3fa9660d53cd50b8880ee0ed3153ae91c591e6cc5d16243c1e06d45e827b377e988ad5d617af7f3f2686acf249ec0e5790615d0079dec7f9339106d3fc44463cac394108fc86c83fba3b85fa4c78aadf5b4d9ac8eb78d0c7291239e65a784091e77eaae8ba450a0a17daebee902daf1d1e460c992f8e5624583c8c651a130c14c188c585cdde36c00442dc29f50e5d3e0e88f6729336366920956986592ffc25e42d4fdd76fa9ef2b8475ec56471226869ee8be0e6bb0624db6c7808647cc9bd88740bfa19d9cd43c061ba4139afb3e22d814d546f9e82d338119bb9875a19294c034e881ab51a072e2888fe8f7a911a0f5dcd830bf4d6edec76b0ae66524519092b7ebda85eb38b432247f3874bfc0023f6c0876dd1476d29ea17c71804a813e80544fd0a3755dc2e37e8d951c8cf95d65192fc80bd21441814bfc249bc4d8802e361d36b86184da2697f3856c3dc4f0b86f1fcb8a33ba285d0a3acef6a23b7074aed1ed15a967d94339086ecdf896a7318f7fb32b864631b18d5761e2fdb6c79a1fb5c043d70de28d5f0e69dd533afac3b3d2d9cfbcdebb309b46388d649d0ed32d30d3dfc918eda088fa39f84c5694b88b6655ece8980b654ec3d47c0a0ec7b7797c0614011f7cf57f9c46cd8d2e90d9125404f92b9dbb36bd3d9f6a3abe9edd2a62e0e595a2fee7a2f67a344090120056b3023ae6a6991d7d20ffb0f38d673498f4cc5cf022c7565a716845f054fbf1573a6a733f54c324376112fc507c329feb837c31f671bd5ef970c28519b66b9fe09e83a5110bc14c031cdfbd4e39ff38a552342f369220e9cdd623f4143b3a4caa2b2a87c499f3fee9744d5d2cc85171825d988dc5bac0b26d8e7f43c25378d8827053bd88b5f06efa3854b530963439d108d92d87088a853e0a63b9743b495fa2d4ef797dd9f2cc3e6c1641d40f112b2d020c13da59676a122afbf6b6d50355ba901ed3384d743202178c557deca94dd20aa16223155b93e7a59eaa0416b6dc4ac8cacb3d39d1c28bb6b73638628266a42753149e3c30ab7f33b01daecd2bbf566f8aaf5a35892c3c9de83f20b90284115ad4f46b9913d9985f1e76757abd9e9c288cf1e45364a6d2623c0a04d031ed2017393f9f34923d5e79a5714ad7cb7404e3fa0a90ac881ee08f39967e6a5da7866d6b2075c293eebe7f4fcfc80c22599d12bc15f574955d7f49e75234d2dfc0536849a19d6f419eafd336789679cb96fb57ac9a6698539694b197593403daae72c162baad2a1988df8343b146402ae6e2a5f30e544cf5511fcf075ae834741acf68cd298ab3a07e7d8b53f040c677542af1221e261de84cd62d6c0956db0d92ef7830ccdc7928124ed20488644300a99f7f0cbf41513a84178b710afd5b47102ca794a3b267a01623308ae01d60f124d88c8af3695bbe8637250fe46f53ebf359ab6e501aaea643d3d597babc437b243ad1bed7c096d2b6e2f0308708c0dead206f7d6092974f0c23d10966b4dc501a03dfe0e842dd0d2418d35dfa0b7237ec43698110e8329a6b2777711535eb53dc2677383c901724df564a01939bdd9456b93aca7c0eb6117341533a9335a10e2d587c11d9916d7c4890c1537a439fbee851b0824b1f523bbff93b580126677f6ce02a9a5034fc9341b8fdc790f9ca2a24820ecffdd7f6036e4cb06bc0301a0f264d46e84621649ad65c7f24917f6dfead5d9385362a829d54c14829e16d559547f288d5a59081f4c9c6f511af5e94804f10d1fa4690ace573b82f10726297953db7c7d38523658c9d4546548acea36cc8d11238a88d8501462131b9d0010cbe488048b0f83d203107bad3d777c587608b6173c8c1d58dc88dcd2069ecd981f87cd9498196c40940ddb85601c467ddda3cd0ff014c7f779cdea0f039f28d37821ce4db6669195cf5f28741341cfdd84718b4d573dc633c42030ff1e7b8d11837ef70b52fa62d2b3c6a8df64e0cbddd91e5ca87173c32a531eb6a6215f9ac61d48bfda398750ff039ce903561f62ee75e1410b8c884f889bfd4ead3621b1dca902637cf3b4d54800eb58155c8869b7a5e1ac823c3ac40a191c894253979d0a7140ecde4f6c412ae707fdf858ca6c6de95db80205d1946460242d8887b9219c6eb1d67d94589dae015e2cf4f4709b5c0317b9513044a389110d22f70840aca7c8c6fbc81846e2a486b27304e1504033e9805bc41194f1b04a56cddaac691f9d612a6c95ab3d2b7dc4f25df31f5aa9349fae70ce2226f121556872a1c1c6333ce81a47de02dc5adf68e2973399991810d14dbdc2fbc6c022921383df5c03ad371fbd00b9bbb7e1ca6c63bb9205aef492813f654c2fe128c1e98c3c2843400218efcd34adce90f64614e752556d77eca1c9232ed2d7cadb928e330c1ed0f88ed9834ad62de3bd00eadc32e5b79aae44e1331b15ac08356eedf0e8e6132e820b28990b837246cb03f54e073feeda6a8ec4f9ecdbdae07921c6f0b06edb399f77895b33c843d434a86d538e0e8e37700c88110fd54dc2fc82c686866cd1c29ed427050751b2966acb056818da3e79b84c4e37b1779da3a101f812af231f792285c789f087941431225bfaa2512af3f4121791b987a83c5c46d2cea321ae16813056e4ffb6c9c6c346d79f5e9b9a7fa70368af5a7ce4f6b3feafa57d1e61684634e07221012e4a03787c7f8f3da6d3107bcf03eeaa47fa8d6b09b2e7549644bad5974b374dcc1da11221f81c22f9343cd58e43f229a3b188163606d4a0fe1826f6eb66d1b6d8a3ecb8e3c434d419af53681c842521ef7f29a3660489543b66d80a1370600e2ad5316f7d3278d376ed39d377a076e01b9e95d65da55c2cadd3a2b6a3ff7d40a3cb14545d08550b967e48da7a903fa632b90b5667ce5048ecf42957ab53b8b712f0dd68004351e2c5d89bbfc2261bbf76795d1388b034514ad4a335a4dfbc17b9f736232a470d5d6b9957d9f7abafc020523c74bdafa9b82f2d48554d56db16a04d0b26938d2d3d13e34cc3a1dcd9a0f138f7471973e050bbe26f6813ae1fed03ef91daea1cab3490a37d432f1af4dfa4304d1131ff4f30cacf53153142f348f7b51a2fc83e58279f0e8603393321d86b97ffa7cf21c8a1d198bb9a8ee3b51c65e4a4e0ab69b62f084410f38d9039920556751fe3391bf6560e2acb3151700311331b02fa54e44bfd4ba103afe621cf8fd1fa83d8c30184a15f6ad48fa9c29059867fbd5caf143a40282e1d819bf3c371bf31f62df1d80d9fbbc5cfb4a18db255c51b6d55a912bb0465a175c291ab13f838789ba549214caca259192ea38bffe43c84a87e4cd5d6498ae94ee3a0f99656d3a825b7172e9bb28150ccedecb77aca715c441b45772fe2ce4e7635ee4c8258274f3eaa94c482d097232a66b7611c8efbd80e5fa315218ab857ff5ae03ff33976c4ff92f1c4cebe43e993f7a5a9b8b2a132e1fda7dec957b3b9e98d36911829909a284ed6ef1240e02171b323e922212c78cf84ccd2453b092e928c9a04c22f7825300f5345c3dce8e5967856b084b851921a6257a68d933b101b9cd135fb12a159c190dd0a212960e72c8a0fe64bbe958025dd845d296a509a760702692575aad8f0bcdcd9eeb7c83c5557b134d999cf01ad47c7c1cd1ac7406af0a44d5fbdb9eda198aef9c41e77061506445e4813239e41dee6cadccaa221fc66f6ad87cb421821fbc9172d04793c0c2e044ec1be5d81e006e2016ce7339022b7d52b37b36e1e648a02f4400902e9d8ca229565d9d3ac04c1dd6a8d4368f302b789915aef24b76d1859947b9a551be34ef9b4386ecd5cba2712d3f4a9afb50bd2f2575a8d98e75b065c8e29328d89a1fc74f2aa6174ddb527eeed80e5fe83475d9a78fa525901e582a05e88f8ffb558438e32d68a341de6e95e6944d10ff97abf89cc5c4d4abb6a55898b09a9c46810b54548556ba7296aa31a80e5c4e2cec5dc58b0c8edfef3e41541b79bb844ca925901533c7c0ab303f9ca371879cb68ed6fb9b900476dfc175be1803f14848ebd88d6af69bfe28be8d0da3896e07d8b8d89f40f348b5ebf010698e92d44d4c2976962d9b576fe6f9bff1ba382a4a3da6a85c7f087df812800e3939c26b4c44de3a2bb4d0d5e5e6c5c09d76524318c2116037afd338985499b26049e7eab7853d6a773c3ebea01f73d010159351c9a303e11c1d5bb9970f18c4ff54d4b690a7107664d73770cf628b8606d13ebd6e4fe80549fd336e5c6808033a8e60d693f5dd3a339fb38a39654188a539d984cbee76662ed9d5d28a5f1a9a28120487f888d825f7c3541851a6220a2eb06c7380cb6733978ea5e41f0ce2abed93029a376c66fa7eeefa056d6f2fa00f025be678e5b4a25ecbbbef826495f01101205991592a7fb231f5e0726c00a4b618206d9a14843f4c30473b4e091d92f41f05ecc1269559fe17fa2bd7b881791513551312b058be92b229f7454c153776162f92579b10ca2b35ef37dc95e504b6d92a235462325f312a95953174a3c4bf8a9599ed4f44f49dafb0fbc49a3b2330b5db7588a792ec00d68677addcebf77680831cc74302c40f2b0268144b5f1970ab4839cf8d466ab3ab00547a45e1eb272519ce0a613866863b69f3e5d9f7b79eb9313dc04a09462c354c2845fad52e5406cc412b77a32c071caac2c8032840a4dac3fd01a6b4133c16e438ecf28812432b51ba02a939892bc84c087b54be99705e77a344021f2b70964c2dd445120323c85b4a2a16334c682fcb0869ac0503cced5b51fbc5abba6b528ab0bf139685f9b09f313c0e9db38cb3955d49eb5d72885d694d8ddd9e42531c6f11297e1f15ee92be370a967092a09eac04759681d0eae33e5043cdf7d2d4129f9c9fbb227270c4ad69db3b3e119002a3726783f273bc1abbcd469278ada4c7ff8acbc5a839aa52a33a8223b3a03bc80eda648a6584a220e504d435a9c014f2ec135faf78cbc7f488b532a868baa0f4536bd4323e7e27c1951e72c65d2b8563c311b676f7c2f7c6eeefa176085a6f08b62e03a23c131739e87bb9dac05c0448093a22dcb491b8389fe4c6c962ff8843ad0e76baa23a6ad6aaf29048e3174d3f71b5e1109852cce9b92a8c0b34a065d5b761f9baa13b335e95e8927483c95c7ae2baf97f59dd50d397c6714e0a5f1e3cfe4544057ede6ee94bd4e21b483ea50917d1aee469701008d0baade1b55e707eab23e929cce9f730ec14831c9be24dc7e071839714ea095568881caa5dadd42a370032a289fc0094731ba4946d479788ecfaaee55b4cd3466a5b4b2446b04a30d5a5503e8523d958afbd1ed1fc70f487a579d11d0816073daeaeddcf85cdb54b54f177e1bf3ddec7075ca8ef32f9735cf82658a145586bcda4a06ae26d61b84a59a0baec5ac897dc5663c81b3b54976e73c92d07f26fc98c78c733eabafb9559e843598ad76cbea68336c70786cdd7e7e0d680e7d9e73caaabc8b4f8d35dc60a19dff7373017d59b4106c569a2839c7b7b274308711c58e658dfc9ca9756cdff2c1716010df4eca49e2d1c2c7fa17ea110a979d7d046788ff86f57ee164fa2491787dd64a5e13a745eb60638c20017e013e04f3572fcd247b0d71abbea295dc36134b4c238b963a08b00e1a690a8374bb12be81ab11026a27aaeb533d117223a35d4ae0467a7dbbd0d5830d6917290a5870e6dc46f9d9398b5173b4dfecaef3bf7ec096ac4253961925d592ed75d9579b574a129bd1025492c08aa835ae96cbb461271215ad48cf5b208816e7cd0c847473feecf1d419cb6bba5d77fa4225a20288f5274846ae94f5987bdced38d756bd8c396fb245a9e2b4c1326cce16a120d8c30d3b086a2e8e6245a358ffdee715c32baff63fa01a32659414a0e24f2db0e2afaec89365f7c45e22b662f31240e7969723e008876479cada45ae650743cb4411d80eb74ade9202275304e624eb0fb12fa93f1586f671633907e4b713d4c05b5f2b1e70454916e45d71ac2cd380764527240489901ee3a00cea6088faa2c5c9a799ba93adc666e41ca3ab4839a53321a33195854748128a1596b4982f223b41f48d514b6a484eb9bfa92d5af769bed16671f625442b5b0f289d39e8449cbd8bf01226429c5f4407af4a07e75618135067374d6e9a2b37e064ed786e6c7dc20cd45bb73b95b794250689e8a557168277439e4bba35c842c1ede78a1f7944d74f4ff9ae151b6051612891b53a3d9f224672f8744d6d09f81d5308fb7ff59654588084f44158214eca054eedab94d6930b15f1452c727c5868f14e02c9d9945ac048439c393af89ab61a422ba67e4d8c07326c463a2c5712ed5caf34420296a3749ebc694fbff47f69753195e2489d98261da76dab7831f5e660aa1e21961104954140165593b5b0b6ec9525a337ac3d0722d0252cb0b1c9b958a0edff3471ef0d509ecb6ad68d5e602a17b00ea99fc3057236d18676cbb8bc5b6988a8d213d1d31634f94a952510fb1ee1b66ea3117cf65463fa42b44b96d303829acfb26b791b30780b87c1c7cbca3afcb97f18adf3176b79f003933d671d5cd48d57f049d8759b5475a5805373d53b003bd004790bb1a6403ac35a6fde7e9aa250ac2dcbb0f9872181ca2f6f1c11070a53a37cb88e2c4ceef08b0dcead10ed26f90dc3594b7d2b1089c4caad77fb6c505c9a141dabac72e3ca17234e5567c08f86138fd871a104dcc34b0bbae329470851487f16acba4b6da1f4f19e239a6d68dd7c7819706a2aa67e77a778db72d911a77801c443b404e6e7a1e91664bbfce3ea8562cc8ffce7700244308983df19e007043dd66d86cebf257cba8227f0993ae355c4c6a1e0dbd5552350495524e5bf594fa653073ca5a38b4ad6e20d5e1f4a4b44d54b95582d74da101c06625259ffc2020662b1738dde95a6c67301f8d887c32793101f74408a92a83c199492de55223dfca478067406586faf309c2ac2a15c450fb60265b27fb83df96ced792663d61f8eebfbf827e939bd0031499083c8e5274b13e6ace4991cf85dbd35621fe46219477bc996b6dd7163c85cd84c8f05ae9c7604e19a8b2cda641afe1a20db79a5b2d2c937c9f31686694670805cbd7f4251f99568fc1b9afbc6ca0fa401221a5e3bab4365240d75b84f64be0195a44da6d2e0ffb1cfa8416ddd994e15307f86225c777d8257ae54bde5e6c5ff8b89ef5e225f4b6c7f4c3bb50851cda62154d0081d34b91344ac33d72b0faeb2605e8bcb69a9135cafade1a1c540ac9e10193e95de6d58591a202918c7044bbf0bc59186736553289cb3397189df8a1b09dcab9378de24dd0434d46b2261e76f2173112026dde1483186ef7268294e8b91e649b36e83f3c92570b334e662233c272b9284a6c9a0da34bb670ab02f519863a3b50f874eb95648b740397870bcdce75b0d66e7d9ab763b04ef06cf5434c1b02c54c51e83a41d7cb7a9d1d3c516cff1fd371737211128e46a2a865fe1ed3aac76d689d9cf22711e879b8d76f1b889f61aa1df3b03dae0c35d49ce3027182ed32ff993444c8f63e4f4a8065c91ab8b0944e24e74cd1f1a244a05068b5a43b1497df6ebcc3a59956cd10b903fa5620b949dae2a184dd589154ac609f1aa9ef3fd0c3e687556e6c943a1975df244d8786240c59a2e490d50aa785bb0eb33545ad00aef11fc1db7b1a674874b5f89dda6e307a6eaac1cbe471c6dc279745dba6e8a982ad94f5e26ee00542ac96cded164bbc9b3539e4343606f84d19a41f76a3ad681a343eb32f7a67978a496b15f4914625ae662a173d536ee6f8a7ba9347d1131d7b96a3caa44533f5038ea67e9993a874bae31966bfbc794a1f35b9efc249a6076e639bee04c1ae6234f66cc53342b9c5983ec68e165797054adb636ae71c6ab6973b63997012747b504ee426a46230710528245f271b0b4b120e46e731cb9f978abf4be721391d0915c46a302ddf7b61c23fe34e0b7988840c8b06b22ae586443a2623be6a79cc08940bf004ef733a5b7a559fc8128986c71170c5e461334b812d87dc9ef3c46bc0bd667a144bc0dd7c26522db94ff204d942a10408f3107b8d3478f51018d0d7afad1116121361260f785beb5185b3a4a91fccd66e982ca89b438865f0d60913eeeb9df77b36e3e79738ea1517c888b6dd26d8fdecd1153dc527187c9a98d984552102752e695bc2c5ae18fe5ce73dc0f050e0d2db7c69fcc8c30b878821a3d9df2a4214869075ad75c1f6e5e0ba980e07f91e53ce10a5e8c18fba754a722f28a369765561456974c0dca108bb1f420f833acf526301b018564d33e1aede0335b000757192324e7df4f80e4c11e5b8d806e2040425b926c26f9be6b1e0ef5dfc70bd993339bd39033abca0237dbe6b2073d7327f314883b052f3831052c2626ed92561d50b1be74c5c423ea7df697540c6ed4e6f2737870ad91d6c80554a17ad37ab9727dbdb821662bfd23a2f8c3e8687e299c8a7125a75db559d9b4518a2b1003186fcd9838303260186ab2b0e44b35de5c8354a68ea69d174b7c33c10f3879709c5fee8c1dc22f6b0c07527011b0cbf6c4352b391f162e8c7424be55e855b27d3ff613db56e85525af830dd0233d1312a63e52be6f8946afc365f9e6903b23bee323535c3321f4124a404496318f6a1f94230d8452456d53ed43f322d04928d02ac565e5d5481699de8b7efa0ff5d9718a89e64d14f05716e3819b67ff4bc5548cd8d8ea9a94c313cd733c803f15c1bd8ae962af3a4d5c491f590f2b3b0ba26c925e48b1b9bcf8e7ca281091b0f5d9ad2f45b655a2e5ae9739edb51658c7a7cc788fda2c833646811f9fcb2792b89de42156a3c34c07a808879bf0abbd9b08343b8e08adee2a3795d5f24196e719dee7b220dca49eac557a741b2bf9512b46e665ae7061f0c9f4421f8ef5d9ffd215ccbd837fa15ac05195b6ee4699740a5d835912aa1d8ca58246b465e9462ba9de0f9fd555288f8e61863697560a366fb0d694f1a03c78ec79130a2bed12f4deb851f40d4eb27fd5c69b885484e8243138a5279c4547084ca1d9f1c6b56ca0d4e4e3c0b616485bd8fe6e5b8c237f8676ece24102ae885238456e04d8cf72437ec20acc47b707dd0d1c8338ddccce6a67f1e135eacb57e4515deac7cb2705b1352a16bbc9de10c2a059f1ac7a2156ae841cb41f6f0ed1af73cd166daba0c5d5fa8382a8fc877b746478b2564aae4ce2a998b097bc527b44b00ee4bbfa0a14c7b807adb4d31f070594c494fe1404537c644290abf3174fae852800e6502c6c04a0d00cdecb84e291c225fa40ddffd53f28bbf2bde3015acc0a03b4e6636ade4f4ed88909ec9f51b2c1028dc74fe40664a989f69b774ed56388b6cf2d7a3f5b657dc816b08766bc3c21724284400931a7a1d8fce0fb947cb0935985338ae90ba30e407b2bd5f5e85751f6be259a01b3fe64bfac0f2f96e92898496c51af5580638e45890a8b17957278a474adaf90835c9bbca65c39d6a5677425eebcbbf7d32c5eecc1c495440f1abaf550ab0347431c9b24ddf0f50ce24a2af3d964039cf782a7bb6ab822b85d6587576596251728953d92f6843d14c207528386942df47109f9d0a405a392e427f1f34b93d83490048db38bb81766e35cdccf2fb903cef71e4c9228559dd1aac0de7fd7658409169c468d382eeb512f87d7bd8e50015f74f207b1044e89644b87db3e0097a7ce2436cf90de5f043157bc942683d0f66c535623ff162b3ce598af3943f27d1114f9e67a466c5a08bea0d97c2cda582aee94e3f8a7f7c4802b7df4fa798b0da5b8378b03cb1927acd376467d1e78b860096683a713e7d3cd8416fda734ece30b6dd376644f1ce3f4dc0f77eba11b913ffcd52335d61891c368ce76e63454937007b63a96ac57e330687ddd2ae8a9fcaa6014849e70e9c0f981447e28d08eebac4c3b5838af4a321a535911f6c539b109705c06b051edcf5c4203a3c628891e741ec7285163099f07f471b47588adf898aba0b7189b80f525841d9f3e1093824b4372fbe738316a43342829b7b1e7374978610bba6d961b3ba4a74d5a504284693bc9d1ebb69854370d0b3a8771bc71dc02077982b8bb03338f600a3d2ebd98a57bf3d46ee7225c618f7ca9071c6a958740202610ea0282252df5d2c62a6651640c83fa8e37691165b359a786ec6858480678b62b8ab6f3431fe743cb023d9b1b8223acd86b169a164e2a62e3626b780cefe4a4088432df4a244be431ae422f1d586faa7bd221433e88866ce7aa7b42a71cb263301a120691d4b5ffcdfb6b8e3209762b3edff6286823aebc5451670792aaff5247b313378042c427aa37816efa2a06a0424f27254ac85ce13a04cc641403b8da44ae5ffabd82e7dcc195fc8ca23cb085482957119db777e14c787d28f82d83b243518e0dbe28ffa5eef745405e37b4973bb43c563124854b494ef58af000c2c182fd76f58a8743bd360478432d4b0ee97ce1c581aa660ff111e65f390cdee20420d8fa4d8d692076167e6b2ef772695fde4c3fd420b94ec04761bb129598ee707397da0518c054ce178a646ce0e9db289fc301f2b432acf1e1cc9ef5eb56448f598c72586fbf008c08e07fb047bb70de34e85f5dfa9706bdace478a0be5a82420becef94a4f1d94263de507bd21dac40648c4a681dbf628f8707d2d2c6dd401904ee01680ebe823304928cb0239193076fcb5efca1cdeb12fb1e109e8491e5207322adf4a044037f4a02818fe52abd813bb931c2509640afb1aa2cbbf218b08f98472092cf7fe0842444e10df19061e34523bfb51038ef29cf29ed18fac3f290d2f211e228a219e0ac384d3ee01cb628b6e210a684ec13b15ee16ff5c9e7c51e1d83657f30d74951381a2cf0f8e4bc458290ba4b340d7e659294937c05ab75c5ae3aa4a38f4a4a0fe0dd2497877a83702c83724a24de7152d459239ef472afe5ea9ef091b66012237412cca772d7b391d89aa8512c21ae54d3dd91f2bcb46691dd9d955ab171df60d861860137a5a5dfdd6fb4780b2ded6017d0b663bd29a4010cab8fd38eec114a37d01aff11406605486fb8ebd155f275015e2e3d893ad5220178f97addcfe06dad81826225888604530d0a16571cceb45635fb0c69f60ede6ff091074722a3d749cc99eaf08c522433b2a75c12532437de9053666968d66dbbfa4d54683e1635404e12b975997243d9012bf523ae51be174232da9065ed45c4886165434e87a136943bd4ccfb9c5e62aa2bb41ec270296fb4a2eb76f1091f79a2af8729b675caea7774babeef5a5b1dcbd7b88c31d83847edadc280a4e02942a1419c4f8511fff75e4ea13d3d40737ed88ba62cde622fab19725a98e018b5d51281eae636a7b547ea4941c26a8b7b5916fb648e274040c6ae13c35fdddd2f49874ddacda922a0ea56eaccaf1a2170c18847246c8feece050b4a1511da13d151f30e331880db300d0d58cef821c90d02df1e817e68b9bad148242f4e016169eedcf00ed03054e24275de95f013ff591ceafbc27a9beadda8c0f1adc4106a00e37b9f8c1d2334f097b9ef6602cfcb10f8c1347717a563c92f2ccc44654df86a0a25d84d364da7ec0d2008f677fdce7e454211244da0baedf597cd5a641a82bab1e959d71eee131a0b05682917d427db195b42fe63b504cd1fa98b8011218f17891852788d1763abc05c7980a2d88f1102a42db1d38804c9d72d7bf4f909c1ff1dd4cb3d2aa543927385e0c89624aaa6c6399ac10f597c568b01612dcc3a981d10989c4042141611b5fa3c7fa67b70b2e8e8016c41abe720ab3eef1ce57c2723de3a48133ab87f047f894f2cec8b5e4c5ad1d0dca54a8315f4e82f1f2d0d7c0c5f60f5c51ebd70bc013ff448b596848de3c2bbe96a42941b86466d643978dfc82667b19df25b491ac04907d66cb73498242f88c54871da6d1c592eb8b9d6d7b3f83276cc4df65ea541ce82d7b84cf2bd3e6a62a8631e3c9c48488183639399ff3e7a980ca4a0fa9f41b6ab69923725f33603a0d8bde144a4a5cd10b8ac21344be6d7045e58b680fa5fe684f3199361f5dec7ac2a331327f4fca6615ec591818d8a8af43a8c92436c72d8a884f11b9e414298e191192cfb6641ba2cf6f1a5f494e5207e14137e16e6d1f78a2c38e6d1cb44e36a214e0587323816448068b04e22538c1f68e712c42311904426712dc5c50e89908ca93707a60126b6e79cc09ece4992cab2288e226656ee3c83530971ea6196aab06bf41e4ba08ab1423559e22b009c4238335a44f64e6f68281d98762c296c8f5c0813904243140db2a3db11d191432cefd034dfd335ece71dde2303a9446d9339ac36e59e4a31af53722e19a8ea36dc0c34dee2912a276f1658ad823e42aab286e1273a11d804aaaa3c4be2dc36e8e5fc2378c64d1edd9f26d245bb1c0f7d9e3413eabdd20e0b171275eb208c94307a5320a9604b32af250a38ed1c1c7d103ab0051d1c0e781888440b77d1af5d99c32ae8ff3418677b3dc7ce24327f9a934f8c02843181090123229bf2c463f75bfba55dbad63689cba2df98a203017c8a03da1e8a6e5920da15a903d9abd27f458ea7769d7c31cc9d5666cf13012eb38c2e4c5d4817d6c9680af1660be02e4427ed4b600ce01cd600702076e890f040c95d081e7d3bf0c3b271a7f28ca15b4b4222a8027941dc6def2df79652a69402d206c606e40623d80c9ff1a2a4c1f519df2f6962824dedc334da87b3ff89c940c791b8153e3e05916bc120a89953cbb7a09e6680a26779fb32c0202da8a7960641508752097452ac766fa01f10380871b9efa47077e53d6fcd65480a19af7d3cf849c67becf96466762dd44df0c5869e665c0e5c79ef3ab9a28cf244ca64109d4376219bc005394a981692149200512e71fd59240d98013d246cf4b22ed64a47739f59f8f33ea3588b5d064856404f829dadc9f290460c262b7c6245d7d171978e8e8e8eebb8cee7222a78d286bbf58a80cd521bb2da9881804bfb47a24e6e57e089629ea8999aadc93387cc23e66a2a993ab3c8f567c9cc2559ab944f230a2b6a2f47d0abdbf990f1392f36a26f7911588410a719dff2334432b04922e1924abed8885a5ef4a3a9e049c97ae6e34d230adbaf434a6004bdba3db4a6bd4c617d786eeb5e0629e78712b0f839c958dd9ea823660be965c6b7bc10a7fa5dc04f31bc88f46223fad18fc09cd18b5e889337832451a4171b979ff12ea0444998ef67bccb8f482f3632fce8650047e0cbf72ee0cb07eee0a7183e0650aa402dbeaf3526634cac48592c2f56fba25d79d65c8245a14260ec86fe7850b7012d131b70bf1f31d109a0d440766a29419354e28f188f9458f16f0bed6f037de8d5953ab012a808c5668809569ca86e990c2543c9503294f6a22b64133551ddd665c4609c73b240f30769fae91af3266886283373ce39c70bf8a987840192127203c60f128689cd2143eee0c8144c4345e7a84cb3bd8c0178200b143b234d4088f18425cc9546bba7e3eaf63d5bf50dc8f340b16dd53d9de366b58a75cf0dc8f34031ae9331f2c701f246de0887e7755cdd34dab205700956b67a70fdb9d3a4681c5ce7182acc47f86ebbb7043e5066451ec23210827f304d739288fbd2f4da4cb60a010f9c59955158bf75369bcd4a386a6c6a7b3ee0669e3c7bc6672882952fbeb681de337366d4629dacaaaaca65bcc2ea936aa44875d59eca9acdcc524ad7bb58ba4206b7608204ec94f36385253b7dffa3a508d7a90ba7e0aa629a15d3f068095724565c7f1a46ac58955c7f8fe723c2ca97cbc31e3f1a94b0defb007def49972b7485ae303564479d02099575fd4d9508c35415c7f8fb083d28641a661a174161e57bccdc1dc182eefc5e76083de879f0fefbd16b94a88d22286c836255d2a2bf4d3925d80357afd65ac11e82a017879b99b99b6a929341d0db83f6cdddddac854421c0fecaea09b2bb3b6ba129d65b591eb6a42bc4a7461df1fe03736a4769d2885362eb0adc99a982179a68e11a4f7ceac0235e71a4492e61187f9974a9aaaabe5c66565555555555555555516aa393cd5062eceeeeeeeed6f89b58e107a8536c14628930c1211858d0dbcf612134b9623ce5fc5881bdd7e81c7c7f4e3188abf56f93f492c3143bf6583640840cecce2311f1ea71fa00baa28b2802907f38a658973bc198115eb8fee5e072ebd7e47ae86dec5b30476af1841e273be37802fdcafb57635f23d9db24d6a20848ee46e26b493d4a18d44702033b03c2bb01283361cc4c99b97182157bdcb6d0460947e720293839729c1c512c2547ac82a8e48e4c713299176b99ccca703c742c2cd3f8f4004e8f3aa43be372de6b37a42947ee69a0426a82650f6d3cacf2c2c94cb0672f9cf721ef43a00fd07f209f38506c1f4e0621c994370ab115e4389415e528479709e226ef1df40a446f973f0938b39d1ed6670f3be5212705ecc2b287b54acb98a60ad370d30939cae44892a3cf26784029bc4e89b1e29b92a6940c076d6a9694dfbd1ca24dede27ed324101c348c1ca261bc03454985acc17599c4f5e7da88ebae2a71a049204cb3bd8c42d6402661c428a1f0d6624c09639b9aa6699a8d871330409bb86bdc03304cb3b111b817390b1a5101e3c8710d23a76a46cf8a56b5f95a47032b8eae7f7f5add3628e69cf5980e12616549ca4d1bd5c0e66c369b513aa56bdba9b5568ed5e7176ddc7e1a2014d45bc11078c8347c2587ce128707d3c80bfad58e0ef49fa67d0fea3ad07fdd7b3c80fe034b2e60f0f1bdb7f2a1d7b4eaf2848f2336a15f791f1ece4bf7f7d2200f3cac84409046c312b603bd9f76d48034baf1e7750ffa1c30c7035d442f6cdb01345260020e6ffa060bbc600710217ba53886022c2b712dc9706432994c86c3712b51586245a68a8c47c8d76b072baca7dfe1322f9d16e395e08b7cbef385f8a10b560c7b8734596b297592cbf526055d602d8bc5816dd1c76d5bc48ae10da5290786f187b2e347cef9e3bd58dddddddddd1a7b5d8963dc9320b650ec77c55207c57a572c953a87a39690da154ba551693492a65269541a953a28d6eb4ab26989c545370fdac443c2748eaac48b0a2f287891058d2456641f70fc72a84f3f1de697c3b6b5ab3492168a5de176668b039bf5846b48eba458012feb3ad0c7f7476c3e90c197e9e3653e9f3a1a9858ffce8ea4cdc20633f3a862c16ed788d1bf09863bd6a5f88ffb78e83eac924fc9673e33b39dfea261fcfb5be7755ee7e7013257ecd8f6bd063e17ae30852f2440ab44f791b9a2ab1e7045dfe19058d9627948c308cb2c27e22a1f1f1f1f1f1ff7711f4a6d4891125aef689675234ddc7332c90bdd3a311cfaded8a0092638874ddff0da840a7ce246e65070a64acfbc9182cc27e8262716ab321addc4b46dfb949873f2e439e79c737a366a74873d86f4a9128bb2a3720c6c62e53fc7bc5eafd78e275c2e53b581654c8561fc64fa77b519b6b05f415ec781c03ae76c1b7c474cc704c3f7d0e50b567ee7c0ea70b95c2e970e4aeb1394520aaba1d2b44d6a018ef1f7c14d1501579ab6efda4198ca6d928d4d0678e81bfe1b49233961abc84710d989059886effb0e1ce3308e03d65ca06fd8d0bef1b0524d2bdda0d6ca951bd6b18e553b44126fc4f51ddf683d0449221c7e2ccb1c33478d7eece29a63099f1d2178bda28462b59b03e9a43ca5e372d2446b088b476584fbf9f9690ee4714c41946a744a3baf683d10685d292edab4c30b870215ae37ca9398be8567e1499c0aeb38a85e83ebaf5d61454fc16029580af6ad48b1e00fc8c30e8aedeed63fb27fec0f140bbaa2ad3d52a0fee43df7d607568914de37cc0391c026e714c7b1384f718caf9048adb8221e4ed95cf4aa6157a86c20e7ac54ba87e826ae607d0304a5e01c70e863150ce33f04ac75450f58a9fe7151e9d98fa760ab15acbbbb57a9558a4ba552a91df8467f123ce5291c351c637323831593b55ab162517660465e4f5a3c158562d91512984a07ba4e225defe2fa92eb9d27a58c59e9ee4ce34b347163b8ac8512ad4b3f20fa5623ddd717a7914bf295af6444f9bada532b5c7f2986bb46a3781595693a762cbc07bee21831d8e453ace46bc54dae285f2bf95ac9d7eab5922ff95ac917378bccd554ada68a065484693628388764b24295a039c6ef064a9ed56baa54413c0832e64260182f5e1edb9cc0e4ab5153c5327649596513922402c748270ee3bc85273df5b56af1fe0b710faa3e05c738e854348c7fa0e85c5c7f0f149b0572c370a0e85b340c2849c334283a0fdab7a002e63275c534dd73a01b218b24207f5fc95713962fa6e1a0742191c079b5d65a3f0f9c71988ee11bfd376a709027c31352c662b5645294c47660515cee84a65229562ae52c16d3905a002f4bbf45f9e4fab33c6c79d87ec475e2933e85c19a34119dd5800684218924830c2c2e1343abc2ca9f48b0288be52c96a649901315a534caf86476840f95580c0683c118c635d2d4fd5fea1fd9339773f68c695cab2995c23006a3c104eb75a100ae07be50d0f75ee841341861c546813c1fdc7befa37bd088abb31aefb9f701faee6342b0f48680e831ee4b9022bce7be08d0772fc4f51c071cc3c2728e7020112f35dd5f804f1df8e5d0af69df0d25d0c097991a5e72a0e2cbe6328515676ca0c252c043972aacc8aff9e9606f835270df2869b2a222b1a8158c4a4d0b6d947c73fb82f6b17b44b1941cb10aa2da49496696b254b2121c8114c0915c9f0234763e722b608f122c7dad6218e92cf447a91ab97188d82ad625aed1d5ae518ee338fae823a5212d1c368e23eb937294b526b19386173616a341c48aeca2410496b5d6da0edc073dfa4ec3a0513b49ac5fb1562c7058859dcee1afd1b7f01d18a094b8cb437f6f314d7771794a8c0a1c240a2bfe0522040926c6518bc562b1586cdb3e2ade88840ee69c7394b2f267a9d65a6b85511a6cdbc61bd76aed68c4b6246bb576349261e871746adbb66ddbf64d60bd84c3a07e7ad997b5f6e572d2398cd008b8b3c72f9670fd6b04b1628ffd55607b50cc61db8090638cb1c9a003db9f433f10728c31a64b5932bd2c2c10d26bb05d1c9345dff0b79e85f5cb333995ed970b4c59970b4c76066b2da53c76e0ece0d14ce03009ad262499210a2bfdc331eebed2beab2e97cbe572b96a0d39c6c56264345d78508494ac9e73cab64cf30dd1a6b053a206334918c169bf7de55eba7b0725a4d324edfad73f728cff04c230cc800d06d75f93c1047bfc306261457e694e58314442b550c21da3fc5ae7f49e98218e391acdf9df7279083db0e28ae17c71e4ee4d50a9ab80cbaf99948a85bd21f4c51c51ea9a0b344dd364386de29ee7f34fa93d3f0b81c9cbe7f423e485cf890bfb86bf0c0654775a9a0d8648c2ad9f6ea00d35e4b421e461406986366861e89a0c67db4036d05ad358638fc5ae7c2c76f43e3e432c7b48a5f4402bf60b5970a5863e10e775dad4b8bad53ac339f7858e8eead553c4e52d77e22bdf9931f7c9e33293089b5a8700d7df554ce357c63b274df64587d1a0c28aae13facb2eaacb50a699b22575244a0a6153cb078d04c380c050b6c9681e92249d837bef76fffcb5a3d572994f6b47abf59ab5c637411554bf1aad1608342b28b45102b9cb16bc6913d464f496d3371c023e30d23afdf07666a7ae93d137ea26b51a7434806fbce66888c6d1c98139559b54677c05418d3a3339335f135e33a3191d978e8e8e8e8e4e8dcc93f2ffebd7afd555841498b0a95500609af6de821558e50425d07859b15dcde3aa6258da4bbade76e530720414a0508da7feee9fbd916c38a6c64350b4a06c5718566cd503c18aed5251c0c3510f8ef177cd5c3eee72b98b028d637bed29f8737e3e33357da8cc586c4ad122d31fa4053327d1a3eaa9e5f9991f80aa27d18bdc1589fa7b5e791d4e830afb329faf769a3e3486478931c72933442d2d2f12b55811c9cef8185e943f35325e87c7a0b049fec8dbf2f2478c1faf63a377f99834b98c4a2ea492e85b5e9425ede98f07913f31d0ad21c00d3d2af46a446143ef695cb062c76231f9c3f2f67fa68c22653226757cfa0649362161a18fa7482c6154521cc6bf3562ad5432406fa9b10473c728188bc5c299b2ce82c5c62ed7eba78a131f1e1915d893e972b19cbd8df64cd65a0150afb02f3bf8a9e7edd7130b4a62e9e778ffe4e9974b1cf5cbc562695f353027477bef2b98537fe33ee783e11f0eccd940ff32419b8fbe8fe7fec5c67b1f9587dcbe971db4dfde4603e76bcf270ada54f0067c9960cd69eeb4abd52c579425ede258bb38d62e8eb58b631c6b17c75c1c3332d359348c7f17302e9a6ce18a6d00ca288cd194d18d6bb2d060cea94d6dd643f6e8a17953aea1693dfc9b2013baa78734795f396f7605fb89c350c07b7c13ecd8f53138c6ff658c9bf3a20f35c6e8e798264c2ae8f9cb53430d38703ccf66cfdc0d4f9a617e369bcdb6ad34da18a8b657cfd66a6d206f03792330ece5d3886f9de252ba09d7bf91f413b197741324987a4818d8900b6040032c532a75c9927a48538d8419d239980e81d5004b804bd3488ee6aa860a27c45aadd3adadd699d010b899678ca5bcb8675afbb57e53fa4cf3b9e8c0b287b7bf1b660d13895aad9da174d5755dd76a750e6460f7ce816a6534912c79691ed8ad195d8189bb89d40b266559135a2a9f222b554b65237beac669df01fe0007543d5a35fba902a98fc044e0d0f6105d9715d184b1a5ea3a15f75dabd59ab1999921f96db53c2fb451c251637313c4689b9b3948376b5ead6fc009c3d22bfe126c0f4bb84c831081dc9e2bcfea8bec73e3a107403058917d4413338f1e48600296916f5d70fdf3e1d90d0d7a3ac56efe36ee15146be07a6afd826cdbb681402216bb12fa40228fa5b3dc4a0d7d54d3346ddbb66d037d9625b4c20256cbad84be0ee46d9bd771356439c161ccb0d878c4939e9f202d6b2923d1ed92d87abb24768eba2476e4a387fe4305c463c58685ba4ad7c934130e5552878763b8ea412a18561c09c089ed7fd1a18ddcee1b49c10a366c94a6aebed8bc67bab9f4a582363f9a1246aca3c1081721d896151b562a51d8f852c31246f6c460ad82e5400a969955b0a947bb8ab83d706db3cd25af381a81110557e708a5a9abe09a15a18511d63ec2465bedd980c49088f580cd601b0c06b37198a60283e1a8117501d3509a864ab57886b08e5829d1d15028ed09b11a56a56106564a6dc60cd804d130c47ad81c48c52e20d4a4848dda3698f7844c715c5754adda0c2ce781225c6f2de8a80247e17ec181a4d62899ca63e9152b2af460b3fe8b1ce143e4ec2ae75447b35c34daf6038b6528160ac51282041344505c2c168bc5623729ce2d9526a289182580c39134351305d0a1936f7eaac05f7d05418d3a23e76c1a680bd8cb07f0e33e5ec563b399599624ab540a435913aad4101c1e33b8420aa8d38f298428a7232f3a740fae33abd5dad1c86b50bba669db65e7256150723d8c22bae8557cbabb3f3d42830e9bf564fb555f355eff9476b7bf49e7eb8ad7742758b00e7b85a26f996911bd7cc5341bd3d02b7a57182d87c2f22e5e1c9fba24f67b1dee45bcfe1436318df73c3b5e8d5c77306c42dff22ca496b724d13749868ccf01fd8c0fbd88b4f220d207e67c2ffa1cd0b71cb111bd8cf7d102ce781f22d0876d7087d0b7fc4de85bc09c2336325ef4392c3f03bc59791198635f460b89e54524fb73b290f83449dd8b3caea8bd0fa3db4998d10d1de83f1c159702865771186fc2add611fd0ae23e6da45ff7670ac3f8bbcecfebe7355ffef297bf5e2f4a619dbb38d15ad358e3e6315f5b2101d1b70438b4461a898063fc7de0186718ff2a5be0c1857dd19e6f09da6df01d2e235fbb3c62d7885d231d34287169db569dd8b68d37d6d1d9b0e083c372c79126eebad23182c5e101019a3044804d38339d23878930298e157c28ce26936dda56ab27f3dcc7758a389594942e9b996bb52ad5ab54b2566bb5eb54ba4a9afce42ad548baaa8e8690a1320abfbeccff022e13c40557ecd4a80512d515bb894de4281ca5e7f3930d1031ab0047b9f3c9ede7516b10ef4917061e848007490bd5e3aeb7bbcc640b516eb77f9352cd063318e18b91e3d8fac6711cc78dd2b46975d3ea07e27134053b63c269391648b6eeebcc04b94edb368eab756686eb487cbbd5753536375cf0388ee338862c47ecfc9186a156ad473dd28bd78139317401060f4e393fbe24a723f47ff40f923875dfbdf47b1ffa482ffd20b05bd50097ca94202b021359ebf3beeb041d232684cc9692d075d09282f3465b5f0c2bc060b7baeb5958b1a90ed977a3608f1d845220429060626cb55aad568be588bd92e79c94523ac1be9225537a75b80f0971ccd1684ed115ec775166bb5361a43f2158ff2aa511b3d9b8da09a2d2318262aac39fd020866d596c8918aa7e384cb1f28a55d37a36c36d7626ae5b212e45d899f67db9569487de1c116c8361d858adf2ab42c7cc35a3b3d96c369b699a3785d6fec31a0fd8a8e1ea2971bfe64282b1251afe5326d8fffbb55afbbf6d4e34959479aa092925ca9c5276777f1886f839e5fc98a1c4ec14fa1f9c173af6a52c0c36f528933e4c334720a314639453aeff94b210cf9c734e1114566c253bdf0e7d0abd46aa170c825ed10442dceebdf73ee47954649f293b1db8a78f4347677f3754903ddc260f13366945c85432954c25234919c704e118bf230f1ddcb1752453c9502e336532994ccaa48c521baa101566e6f97acd58c591a639271039ba48008462a76d28dc0588331ab94cd7754d0242ad10002c7c0d52781d417bdaae57932d3a47659acd077c75bb374fdfa82feff55ce7813ccff32a28b4d1d203d555c0652db450e57a2b9452daff9765e877f7d73c48e2ce27acbf46a2b4524d2b694a24a574d229c7719423cb15e5a85d51b21cb1e28f9e102bf68b254b96a2ab821b720c33b934338a5b02bfe24b77d0093b8ee3467f0325d0af51272f0d3e3703db301211ecf793d2eec8d6db4637ca1a1de0824eeeb4bb9bfea6c3f348d20abbc35d94d00ed4d11be86803450f78a0f73c1f40d77b1d1e690711ebbdc82e1bc01d38a858fade83409482a8b7c47a339ebd1e0741c3191b58fa6209071c331dd75f6d14b62389f5fa50e36a4fa5699e4a330c050c0683c16a361b25263caec1cd5c7b7e9cf8548945a9d5ebea0652a954dae488a86cf7ebadf5946cd2d4e329b1f28acf63b52bfef5ba4f88edeaa655971efbc2bd1097a3a105db2abe53f5e2513529b26a7d31b0948617581f47fa7d74efbd8f9707da8040ae46ecd82caa28d2b19b580f7f504f471949f97e19f1d281deca75001af66262d943ee786c93b4ef6feb1cfcc8a5dfa3722c2d4a6538ac97794a29a5da87615d00b022c452f0653e0b71bbd520cf65b48edb36baa2a0495ff30f87bebda2a4ed7a3f60130e2887f7aec97432dcff0c21081d8676fbab8f53a7a0a26f386b27d55af56a4541d106e0a35960c20bb60409cfc85a511e826046ca04a081384cacd8abd65e003f92c1b2700e467abb4e8ef19c458939e7a4829d1e7ee1c4b6cdd9715b2761484ab05c00f017b06d9536cbb65adb9b42a552ad60fec4c8ab88ab87a544a51a8d46230e65a92459a552188e46fc725273c3329834f95879d0b6f9b0ef3912b7c2bef73cac3c2805969910197299896aa70897993c3185eb29573292a61a2961ae699ad63f05abc4271a66e02a8e718d44a43ead907a95d349f002aa75fa315b4a749195ab52aaed4557a9422f690a7244abbff2dbb63dfd2ca001b9f31bec41fbf99ed7a058128d443fdfba4cd7812f3bd8173d0f2bcf028a56de87e86d079244dc8f6ef7deacd665e66b2ba4976949deaf3c0fa067017dd807fd0ae8c3c7ca7bcf27fe74a0afad9034ed7b04a3db81228fcb813e8c6ec3be9df4388ccb4d6e727b52c3c3fb95d0adedf3335bad34a67195f3381157f5ca55bd72550d35e0c06163a55ab9cb086aa55aa95e2a954ae594da50712e0315b8d979641e7329fef21ead824fac8fcbd09722f4a28c22633b5ab7c33457700ea984964e4bc75b5d41d933f668d1df0183892540d6006d8709f4df7b9236f5f03a4792040ad71fe481a27331db62e65968ee45928a846936ff828b2d3c0b6fe9788b894ec78a2988709cb7bcd571a18d128e9f6f8ac7de0aa594524a295da976f480d087422f0ac0d42d8771d7102e9f28a5945a92e85948f657487d0a919eb8fe4e5c06f837164d84437f569f4224543d8942274bb2608e039c70c13aadbc10276f85c4e30709b342e2615f447a11813f802ffd166c70073f853e04f62861502e43b94c119c63fa4801430ade5728740ea6f95e7419cf2079ac7c917d388ee338707379a8846392f40d241cd3e2987602dff07f3510f8868bdd9a7139c61b089b7634bfa783d7921a74d139ba7796b72f826edf986003692101a2eba8648eb87456b2110100000001131500001808060583e190583c2e9c27d51e14000c61804084643c1a09a4410cc350c820638c610600620000000c0c91a8005bc4b75540a5a7c72b1deac50145f8dc4928dd364c074088a269ee6dfe486a1253dfae4a91eb83683c7be2abe30ad51f973c7c268c732e8ff712c14d2b6159b51439e66fbb7210af987b982a00826bcbf7e28eb27efa429df022e047c4271939921063dd42feddf0f2719645a76fc4a962a073a7af70baa8efb54d55a27d93719c641f8c33029f90d5e58d35719c62d7755351f582d2e269d3d628a6a751ed31a34f8240329c070e9648c5802a045db863d9cf40445b0c278df7d0fdf26edd62eb90caf0a8a0a1d69d84882dfb62ffad8faa54d3307de15dd3a4cade71fc11a4c9fe03c21e02fac399b2997cc8a7581f30db8a441934184df0eba87bfd4c734b0a3500e2cabe6d7e2587073cea4c712c021a900e439abe8a36df876321bd5e1dd189f53fdb99d07b13dd5be66c12e3107a6e1fb13d2e9aaaa80a707b64848797408927c17d4278565c732853861a9b5652083c50acb269abb8d77f5325231858e3bc3604e0cc020993c41205628091b626e07eb718fa43c37cb4e2d484f935d82269a29d0c2698a6213032ec325c24380ceeee5160a8f8307a02a297966fc2f63df573a80452eec54da143bfcdeeaee51ec6f06c1c04c9b27c675ce3ce96b1300961209fab8aae6c6968d96a2ef24ed067633fb5349caf52c366b82f5361003c7d5dc4f209b46aec54ceae2bc361ea71d77f6779559c9b30548c205520b84d0c6c00b953d273ccface5a88ff49f5320dc4cf82f7e966b2d97d82ea59e90de3eb2284f69e12fd4aa8b8f3b63a290a242f139a2bb71e7fdaa2dde223820750fbce770f88ce7ffa4963bbdccd1923811cb1a3310872841489428b57cd37e8bca7095840ec583dc08bcfe2a9259390a06bf59c1972f6db1ef75c123888d24db519f82c9223ec9311750ca9039825b68a01cd4888bd54a844d70eb0c32e7366dc4dc32fa794fe4ffcb78259a2e16d2c1397a38ba90c9bf56a2f4060c24048bfb2304d1612f8b233594f77fc494f62a29c14623721828a1e4b5264090272e3efb2145450631bba11192cc5da390cab66c8041590d50a9bb19390378271977000321aa13ec11b9c6b5ef849f56990610c2891094cc57ed207da0b58ff2630cd3030a2343b72fbaf7863d5c02ef0fcce269c574fb398d5f37922212a71037e680942eaeabafaca5f8d22e00672ccf690b3efb177ede1c8e0241ea5f6cce84181921802f9e88ac7db43133771e6ffe87c5078b9880fab08ef7f586d6c305f763c9753bdc537bc200d22a1b3552a06463d1c1ecbc7b1418fef7470020eca9b44e47dd34f56179f4d3979cfc99ae87c3d50a586b4e45b9f38162737f84268c7f031aeef6deac37571ab87ffec269b6622c4b8ebe1bd9bcca9ecfc587f01d74ae4205fa715b832ff7a18ccd52caa79ffe0bf8ba31fa94da79c386099d32273c4b492d095d0dfad08c5dda8ec265996925e12f3dc56165fde30179e24c75ebb34ad4d869ea5e7d04d122e6278686dd34d01192f098e5f11178f25da24ebc534943b0c54da911116a0225c41a7bc2b1ddc80969369c512d042a0983f92fc084a8ba29eeb386d4fb08afa396330a5009b14ab80775aea993744276dcfe0824b6c90a3c105ed2385304f95525c3c7316f5e508b3e4d48265a737cc2b2427e2d809572cf6190871215ddb9b526e68599f27ca8c7e9acf43f30f9180aee798c64a33295cd17b24a643b62ea6ae59d78f71369b67de7a77c0fe88eeba008439a19e32ef7b88b2095c2187ed8a5bba01de81222a89bf6167a78184d1e358988615b41bf88485c56ab78871c2f25a76443eb9efef0bcbaf66041011f07b8b71797d5d82c0d326c4edb90a633f4dae21cfe522bce3b749ae2a19ea31fe08ea8cce9ca9d4c17157ee00b22931e61f68d277b4ef9a623f4cd7ec43c2958fa53a43b50fd4a3fc47bfe7a05a39e5be281b6f58110248ac2606f7c1e7848cb2b5a0e3ed9875d048c9e8e69af173ea71ff6910b7d4dcf9fadbf1661c5db3115cb9cb1aed85079706255abdc40c69d0d2810a2a1ab821f4dc5d2a141f3c4a74ffb7dc1fa3337a8e53db2777235f1bd902d7165f482f30ef08313bc4d8e827f8abf1df92fb57482ad4f85ccb67ff6254990853988f8e34c1ff7c7c2cc1a8553ceb6f714dced694df8c12b789fc51c671a3d56e358cc4ed05c3c08be80b4322d7fbb964c450acd41f24390420649b61876ca9e84b4dae0b44ec88662bcbd6627f1f9cb43fb4406e7a4231e6686635002426c5c5cbdc10157e2e0d03896c2b2a85d91c7ea3a2388270c6de417c82f0296b6ee7ad0a33c5175fe4bcf5c0488d85c42924c9f66caaa4b7cb5c3c486ce6c1e4f736f27c42c10810ea7e52b86ca09826317c1f4e791ffa7f970d753bde5b1d8890e2110aae3e960ae47bb62b05c7dce68304d4478e444d0b0021a16dc5c09e560d108b55f9a83fe4ca4263c25bfd1ba7a8cac88314099149e8b8a3302525ad21e6e171c4857023c0d22425e956613687fb84caf0e1085f04a5dcebd05aa14149bc9000f40ae7d0a979eac196b3ea77cc1e900472d196d9dc10322a43a4b63824b1a73cfcef9544ad41a9f541500cdd601ccdcb55239616fe2cf20805af10064c9a2c103eab785fb5afcaa0288287402fb8881a11ce68d4acd689fc170f0dd4df4605deb214bf82b78db0c5dab8a95077a0c43e074b61820de2d5b9a3d319331124705fb27d4dcb192e0403cc241667f512595d84bd36f1fffa60f0455f9ac022e3402552c38da214794ab8f1f925952569403a2769c7dcc4290de6d76a71702b2d5b8c26662793abadf79337f21efd7293cb1d57f27c43e1643278f7014493a6eadebec9eadca9c8c8337e69fa88b81601253b10fad222b24f717d93155181b51cca11ba3a945fb686b5e81fd95feb5aae1d18036c9d58c781f997df3afd81d4c32b8fd02498cbaaf172d0ee81b76bd4d4e8d6f2edfdabf747de81b5f0a0ee42841b7f50dd2e6ca5f682e69211372f3bd5ed3101ad0c3415cf89f4fa0b43f7049528721df18c30e6bee31e41b7dbd12ab574ed3128f7bf85a1e0603cc1611690fa946e93cd34c0464626e8f1875a506b2264317cb3a1d54fbadbd5b0b2117bb166dacf872c6f910da40765a58474ec680cd3a095990db68c06cce2be4490b31c7c2e5c63a1a61a95f9a026ffed3669fd2ff1cd5b14cd2c97b97c05d12208576bbb3aaab596342dd5653ba3892f73943305d99ed76676ab49765defd56c6444a20d36059d73a3467917a7462baaf8c7f5864bcc84a436553d58061691eb013920b0ff338f4af469f67cd8fc77dc77b15a3cc7abf038185113104ba82059b8b47076ee02b7c3a8a02af80e0917107c765d0a9a602cb280d28b8a1f1e37e678b1d6d1dffd1347b2433322eb500ac5c669a3f595cefd6e21c7fb2cec274ae8e60854636543912d940011857b03cb3c9e40071656d41a7ffa2b2c27ba5e45e73e406acb1722fd0611a45d56117ab5793c0b41d7b8e0cf58a768ba160db3ae9670ad342aac065a4e48b12a8648c3b2b0c52498e3aeff2091cb30f630f9f360f533113f92ddc8d77f4c7184a3950b9960661865dc046af7fd502e451a2c1ef5d02ee69f95a2810789004dd525e386936d41afd48aefc038aad78adb8fd03b3b28580a296c543deb10f79af3a1cb06670df1cd083434d9e1baaa7105aa1b1d3c737064b21ba962fbdea89fbb4af8d4d1ca8045700b6411cda7b616d1b7a5269eea20001de27a1d306c87eeef553e34df3cd071d078ea81ef12f9b34ada1905a9bef9e589e60554abb265bb1315d20c238760207929536f6e2ba2769cba4c786d75f9f3475e1b14ea60bb0ff131d7599c205b8dbfd92acb7325ccc4b069d0563f30ab50c54812c66f0a7b0eb7555c3105677d10c2d6fa795b06c9a2b6e73c23be86dbb3ba01fa702162eaeb905cba71a18041a138899b7efff68b82245aa071c00a3f2af2cf5a4f01fafb2a3b6ae0202394cf177e37d1c739a6998d2d3ec9e60706782ff3ff22d4de1f2133e0b22c6c04eb6085217a07002426f234f7207ca3bb5afcb0cfd66c61c8770aa7ccc0608c53c43e753cb300cbe0d3a1c2319b96fb9c510afea4040e9285c320bab877d9d0af1580c3498e6a16fb58566dbe542cd0fa7d945d8194518520194d2f26278ba18b76b31a4a74088c9c3c35060c85d9007a4707b6ee0bed053c580d2efcf5911213e2300b0b510058f2d040c9ddc2ce13f8e26063b40f862245ad3920a320fa5012ae625435b878fe65e367265e5e35bee89b3f612ba3fa1465a463c141c99e6da0250c96a9c2ff6ea8871bcdb4ae49448a0f033d9ed696bf24981cf9efe568edfda34912c0e3ffa3df8fffda3b699910c4d5c183d98d05bd8129e1f3d1e0fe7fc0d5c813375dcd1b51e0f4f8ef2ce5234a35051cc4c0c93ee922e7645c121ac28e2c7728129633860f383211aeb1c8311f3b9633dc0e506ec87ab243dc6acc4f05ed9f2da9423f54791deb92ee12e698f3857b4b0f7afb5e33307655cee87cf1c5757db9c25cce8c40aa0a45331790844606dc4d40a696465c4bf79c7d10dcab3f7b8425cf62826480cf5e108686b6f85d1f626e12a8107026d1d48d56b2407b22b34d4807efe83e83782bc1468dd24ca44f1aaa2856140929b19a24885d06161de4802df2f01c2f932fe726068cbf3dad0baf78b193bd59c0923acc2590b53ae4f915fc0a22d3657d085139dd3d52c45feb687c9a03392cf530bf92095889bc942763396398baf7a754b0e2539a16db4cc63adcf983900d2f5cf077192ea85ce7c3f94b202f32648055b102a69b500501ba4cf025ba411714cfe7fda756d812543b31f7920efd20968bc0911faa7c23a24ad8ee628eeee220337093e246d31362a87d746bdadba15ea2625f769d93753775056fa3cbdd5bc36b1d4198e8984b67a31d8727720d3f1351916ec303c58efe0a0e0bf235296b3c8fda15d69f8270263d26de3ce55556cb61a3c2829c4241695c6874c0e6700334c567df1a25fd379579364e3d563ce9375ea227f13f027e6332152580f80a6dcdce6bc34e17331ad311e9d76f43a1dd64e1bf8402b6066e5f9bc2ff61cc4e27e1469e01f9c3cba70112ee9a4fbaf73a47445e9913963d3c6846c16d3307af07dfb56d9d416324d3e933bc4644b67a61d4a1e4e9dc3d66a002207672bc3b66b8cdcb0e09af3d3b97ca754019f934b61541cbe73d7c109f3f9535cb97a5f75d5c086fc2b4ea0cbcea4bd2284b609d4a5718201e069000ddcec080ca97f8f7fee1dbd005cc8527250d8a4bc1179ac1d74aac425093c162aff0f22605059b7994783f3232f4dd96c5bb1fb3fd522d2da87bc2a28d94e5ae2ddb2a6c6004f2a51dd7c0c3e79640de48147ef7a0f70c3272916d86e3939c8d83e88328bd11127d56b487089a977093b4e2b676cad27f44dc3f4d28139a4d6d81f5a91342974a1ae1b8634396d64c634708e28e48d39df050ec23d228cdb2d45ba753eae3f81b3282838d9c1ebea26a5d07deaf56f2fdef6d014b4d7621d7c2797c1532378df8d1815ef922536e52b1305979a9a64bd3544a486f45c39afe07a8d4201407dc16d2407cc31b247babe960952c56986ee75c5c1ba142facd46615372e9e88a360f0165fbe01e8ea572300c86cbf3e8fd1499d999163cd8f620e21433a520b80fd80e1557214b7a644f09f897091a362adaba63c5071896bebd27e1c9268f425239540699e6807a2c23136c082aafc4c29502628f4bfdf396e852a62522538c0780d812d3fcff8991528c5ecc10800607df981879205463d8e9e2bcd776c3db3ea0bbfae2b431f324fa3d1636b51e554f219273ece699f8f8088bd9757390e4dcf481fd97414486aecc9ced42c6db6c2d68303366e8d51194e7c443f5a8d62783c4b7b21db259b9b52b777db591cca8e2bab424ef7abea063244517d78ac424b1466e8cabacdae2d665388a6f811e69abd342e1e9c55516ffb7cc5924670db1c26c9932a7316a88a4b515fd8e2ffbc378d2465811f892c80d743e5c6206b1c0c5b6cc23f0bc020d695d64582781fec69c308f352e89d3fc132cf19f0951766d7875d656172dfded480a15532c3c5c741836c39f99ab258fc55774a35042a3dc04b5c1d89fda1f0da289f1296ed453795248dd9542bb27281048bcd6aa8f192f41bb39c9ed3fcfcb65a3c28b4f09ea79940efb07de19203573248c986c7746c95a1574a9eec60078c0f6dbe5a4b7611390671d38d5f3181facbe02a09e7a3f2bf1c276aa60be6d1fba3124c272ca8c67701db7168dfe3f3f5f7faca407b43cfdca7d442b390eb595404e51726c8733da3fe70154f7a671bfa23d03c286b8aba37efb31977c4d3a4d6405463e2b504a896cfd76ba0f754f3e801bfe5a18633422fd50ba93c24302eda7f820584210c54ee037d37db88b24cc733511d1711e5530b02101f3fe70cc297d1f2977103e3cc33f7f50c7b830bfd2e485d5645ef17fa1e98d5dd430a7c3fcab0f546238c6c6003c2c48af161ceab17973e96f58e256782d8deee55172021c039455d71af78f6f4a9b93e73d8e665b94e993710bb710854c20aebdd021e6964d1909a875df30fc3755fa9b61e29443157998c09c1fa8546cf1202d8c01520d3e9a63a1c538de76203d87ad2f673fe4d0ad34d90d04fe7d4ccb14759e339d1e886cbe9c59c05f73c478dc5d6d05d822fd26e9b137b42a97756507811d77b89daebf9b18e7c6bcf0e0f08e1c4152bbe7860af7515db364fc86436f315ec87215318ad64aa9751d0ed9286bb5a9f1ba25b42cfdc8d62a58655d82f200e27269f6a43c8eed9a7483e24ab1c62b45ca509e9cb0b0f84819cd8c7556ed2b8ec83faaac3949d56c3a2a197c9f53970f2c6c37af0272c8839b2017316b4d38ace2151e9f3f47893dee1c6d61c31d24449c1bbe9a5d667f0f70ac9159b9171bf2e221524b470c24ea40bc16341e0fc172b6d3172488ff911e9b5875a0b2626029b8419d76aca1031f60e323054b5eb0e0c350642731f88030ad1faf64a6a4076f1f40e9ced772881da70437f16168fa5c3fe4c36cb3245a04e56b0d195c6b8760308052cf8931f62fe34ff28210bb876abad9210731bcb1e40f6e126a82ef504461f14788de7870662695b53b2b0f75b58e7c20f6ffdc1fe66e78fcbf6390f5c76d10b89b7fff00d43cc1e0ca9167c82522cb7a5e1c3b0b052235d5e96fc6c87f58310fd0873bd2e551b8a5e198cb2a27600f5057b94a474fda69a6dd8f10837b6ba578f561e94f135aa25d0b508a58bf7afd30cfdbdfa5544192f6c7adc0055db1bbc95499e227fd40b1ce63c443fa438ea2b72d7ba454c6f6120de5f48a79049f4a4426c5253981a4e0d382a4a965d3d0fb769ef5a5d6d3d6bdd28577a3499ae518c3f3dcfafb4ae3b2011dfda41d042bdc10b643f1b231d11659e6d8cc8ac395bcd948932e81da32772c416ad932f0db8c4ee1aec87cb988c880a31167c56777e7851648a451d7690089a01ae253995c2511792f4adf9ed67b40e60bc179c7b8f2bd51afc0c80f7631628cd6a126fa6c5d1c66d568db8d32f7f6e39da066f5c62b9c49389d1c9ce6a70c6a41293dafeb7d726cf24bf0d9240b0231d628690802d50238fb5d01a1958150c601a9821fcce1c9aa2593fc3f5ec53ec007c1cf1c7bf2fee13bf71a34e04a4ded34dee000cdcc9f7b51166e4a9a640c97ebd2d4b287525fc226a5e1959851825639227f7948b6e1cf3cdbea9398373f86c8cae16429426c462331cbbef3a338a57375479af28b6078e1aea62909b4dc30fc2bbc50843dec6f7f28942283bce03c0ea1e7992ee34982e713d0c6b11ffd5e5ca23296f27e97ad7714c8fa414dd3bae9c205fab2d077e6349da1e40f620ac725f145565b231df862fc9405c58b2d507a2b699935287b860ec7da0150b3bb93092925c232729ccc1251a0737b6a272b82a21a65cdee1f15974490e8eb826a6a9b57f0940895824659a0fd44fe73be6101b7ca86aa235dd3984a65b72cdb6d801499f1f4e14fbeb22827f4eaaa5327e2af6d472faf5ebd9c9d672d221c251d89fe619951cded6cec9788680e5ea9b617f5e667670adc80ebc230f4bb9b1aa1e26a73fa787c3699b244dffc88053cae09c51622d0954d96ca725a7f1f196d7e7c5af4da93afb134c6336dc4d471fe287701d580986d5e2f9e7ab6413380dba9aaa6b469e4f86bc82affec94353ef1344244873851ef8ff96aa537a6cda05c3f9dc0faadd387c0dfe1c07fc775a0f32dde5c4bdbec0c6e454a172de29f596ca138aa27f77549b24a193707289be392fb54524394f158abfccbf0920ae379963689ef1a3819932ece9c585de74d697bf0b5757cce238c27f5aa7c015500fc27b751339eac4655158f8029a87ee2dd524fb7cf48371d437d7507a664e835ea064c0183bf90ed0d504f11952aeb149d4405f6bb08594b491c4b891adc52251c800a6631b2f458bd3e2fffb06ad5b7ab5739deeaf65f9ca59d8fe8a1d5ce5c62a378036d148ccea23351231951cbb37e52f153997274782f33a1bff0120698706e508348484cd6ade31e378ee644040cf4b1e94a062cd992696a782938ac494395e597356e521cdee2aefe7b2915e2168411d38dd3ac38c72f4aec8651b5faa50c5d0ea5417b75fc5a042a38c5b3306c7ca817f50fadf12602d0cc1b904e747fe73ee15ca4f31d0ab20911ee0fbd66c972844050aadb1ed586fb23b6beeaeb80353f31dbe00c9f654189568ab15beb542b692d4c60d17a8c01b1a4df9440e41abcd118d3c27b627b78192eb976effc09f3f911fd4d55c4e0296fdd250d4dde80ded3991d61704414efc5de9a403852b6c4c42c6f015c8e75a6fdf09bc45070e70d189d42eda5b20aa431a3dd036e894e60523c20091c0696aa367fde0fe6e8011381c49b84a0a050c3c200f997b00248f1ee8dbb7c26d7c0a0928128f3aa103d40d548bb5bddd4b873a1a799e942d4e4d4fe9080804574149f75ec757915984aa798b75522da221fff0e37269123ced35d12b78ca6782db74e630458df7f4942fa7b910ebacb38ab4f45b572cb43322d9305d409c737b6929d0cd6fc84469134c3f432dc1f420e092a2b1e613a948f502a5165f781d7cb447d97c82a9ef0a94e57d827e051ead65655265a167b8eb4ba198fa2372913af11f12b88db454dee48893c4be33b40347ad01a57e2b2345dd483e1871a34e6c57d36af4b4dd15651891bfb71450902334c1fcf33e97c749e07cde87cd8adfe233f02b5ca7cf9746660fce1b5c0f09653979fec34b3bdbb86e56df7663cceb82c65b75bc31233df99d32ab520f4ac9154a587ea42f7fadc824479061fc095476e384c73722962c88c394968af26b1189abf3724bc4bfa296f4245741f68ecb71ec5325171fcaf44cb1fff56ba063234ad465741a2a11e6e5ea1818898bdb7d37517f6f16da61623641a4e26bd1d5588ab6a9c6129d5ca3a4259b943d295427dfa0b9baf551f6a42618c906118511675b49378daedf12abd77de1975a091e6a8ce98a170a3205b749710175d879859b457ec988bd89f2100eed0a9c02e95a0ce7bea68d5a18dc223b08d0fcbdc4eea3438e9cb310f72464992be3f5fd45ec6b3cbcc3a282cb0455f91d6e350169ea9045aae6e0b8c5dc190511845507f105caecd0092e6430c512dcdad69d622a6af8373511dc027a65af7e8f3d3f52f6ed97416f8717938837aad82dc000b797f739bdbfefc1e0c740a49b2e53df5339af86aba1bf116d34094ee24db37a0cb16eb06f6edbd451c7a5122d1688702a56c18352d5ea017838d9e8df9f33d8e51e9c80e7cd84253991de7f31b5990e44c210199b5066ec89b61d12af912333a253f76615b7eb899b29c8df7b591740f7c9162b20038a6342796fe99a66ec397519e602f352dad809548bb3a70403101c069c3cce76b40a202af446ef9145de16e0d33c646e9e36258f9a4ffdde85c3155603e59c6a07296a3b93e0003e552f96a6734f6e42742cf55cc1d425ca2de539ec2c4c9c7e123a77e40791534e0697e3d4482716dbb5963a051ee7e6e381d443ef62e132092387350e3cff79c22e028cd4dbd70b150cceaa2cf7449caa20c679576d15135eb22bed8a36f893c6c1848d96b89fada8850c29640b639fe6368975bfcf863c5d27b59422b181ab0ac18e04c57a1bdb2a98a9653d16f6e651853137c7a1b546088cf06530e1f0e17c0fa75bcb8f2f4ab6c29fc3dd81e5dea0a4492573e6c0a29f8c090ee7cb10eee41c28c7f79dfac954d95b8e7ba9302d7fa57f2698b0a6c496c77b483767e423778200c2fbb5615ea53b751e20daaf9964bd37bc787f61374cc20dd36482840401de24097d9610e2cebc2273eb99c866134a25ad804b24152d751a8596914c2c01c5dd76bd388121d2171205614445f8166625ff79ed11b425bb4f50de399f3fbc3011c78da96439c0a85db5ead0dbc568fad5763c127c3be6b2a8c2f0ca463acb8969fe8480f289acac064b8ce5c024abe6abe476391f258a051486d35ca14ed4988a94ad0285dfb60772d62a2611a811fd30002cc86a296752d1dbb7bb4c6a88cdd9a5c90e99d02d6cbfc97c64dbcba749028e38fa7fc33030f7f6e21ae7e680600cf4b2a765fcc4b740ab6229776e1561eaf196adb281bedc3f8d10efd1df336468af4f04438d94987b88993cbdf7f143143dc6636a7efdcc838e65213a1dd11adaaa4fe2810ea161a1d2cc154c3c5c28d8898a7b8b70344edcb82ba762bc9c8b35cde31d785c59a2122860b117b3078339018d3c176b6f07c8a5b2b41fbda86c63a48f74cafc3d0d99819debd46a724e17656abfb21d20355cd0572a5f85612ec6f2b58486c5ba80811a90b9c69ccc90cd754844a53e49a3f507ccd51bd2d8952de78ca474df3543913422312024012c670e880450cb97a18033a464d5356d57d2f51f2bfcda01e5368d8db7c89916c773d4341f75c51a447d420089b5e6d23bd5eff3f439e7471418c0d8b68deedaded2d4ba2dda0d0c995856196d7766ac0a1473f5cfd9ef411ae7ddffe3fb2e76633c5d17d9eef36a420a236e6ab7159dc573b5156b91d4ac6687978703fe02861ab9b808f7aac5c5bbdb137e334e4a046f370c4ff51088ace0bac5c232a250bdd29ac26e8d7db9fa65f93a12203996726986cd1c0a1458aa42b16e43ac1321a4a31a3964e5e0486aace2bdf936f2bda43402b080b083eb1200b0894a64820c37b312138815e59abd319d121456276f22973290f406c61c489fa920d75dc084cfd5c1aaf7660f238f0329f8132369431b5e48eb67c612a3e336cec069afd52994048045ac69c7065c410d6278171e99e096a04e2bd23213532b970656c5a06b75906b73b52f51c277d5d63e70c7a2e8ecaf58c89ddaeaad68e40855ddf76e04d3f1edbc88e4093d84b3cd0fe67e88b983fe444bbcd88ccef64c2930e1b7aaa5be2cc90122816d0cbf48f0fae630ff71d621fda69d62042e006ad96a3bbd0588a19e65d1c8712ac8b587909209bbf5f009fbcd2e0935628a4e999635aa1deac96b4abf7272905cca58102d8aa9a8f80943d735ac52faf6b816aa35e868306b9d1fa2b56249fd644a23f49c73f10cd6f089bffaa859ebd3a1694b8b21cb5b0ae9f9adc17c23db222d00e04afeb2b980db309fa90700bea810a590d23f809b03eff7d30962bda5fc942057595f79e2879df7eba0df55ca77453e84a7115b1dc9427e9c6dcf20c99dec66e6cc34962dfb81a60498a40b84aa7b3cc04b973cd63b323ed1a16121d826c572db5bf4e7cd8a8dc5748741eda69685280d8c3c416cc87a983181a29a292b201e32f40ac3aa6d035c82543e2955ba01d0f1cd355b3035a18b72bcaa9a3ef6544de4a3729542ab11aa9590ff1d2f1895159cd3d46c008c608b0c940abc6f6492ae342c7e8c19072e896e93516d749b646de09cc355385753472a71310e4e5627d4bcd9455855c3ce353cc0efeefc5f318af3f731d0d26f7dfa9f308f0fa942c003c2fa7217dde59b746926d44e33031d1ecff9574d0b9e7f2e13537b0d167e903fd5dbe050e1da40618e7382a709666bff057b39b5373a96c1d6aff5a10546234cf6eb08289cbe8606cf75eb41eeca09184bbbbe27c334ee08f0401505812346546cb03b08fb6affb5378624228be5211f1904987d4c6376b8191e58634fe8294ae97ac9091dbc67018bbe695492668c02dfc01819d98a25e3b26be8c11891250211e19d80764f69c64d241c49a7f5b5700efb0e0218dbeae2ab0d41c6959ec1f7eddafb5c19221e0e57944a892b6580b8de6eda32c49fae0e944e8d7adf8bd841afa058aa9c69b1a44988ca0aa1f2e2a4804334c581c96274917e99f3098ec0cc8ec29ab4709aac9ea68a7e9a5cace3f1725010ff310979cb3cbfd06e3de92119c9f3831fae082e3879909c50c02c71dfb2e83233e1b6f43c0cadb38f62cee202963846ceaf67fb202cb1e9674b19abb2ee12a57e757bd8707f150350b4a52988de0ff06ecbd83561cac68454511ee69cad9b752aaa851cd63787db35e6ea54122436a4c3564c2058640dafdb67a0202c522dc68d26233e1f0702e8150cf955c7fc1557cc1e90fe3bc52a5750d85ca24f9f83a0576994a75a300aec370eb29877b107c8e656df2e7b990534b0c1292b3c4f5037f08d9a7e265fabb8c0296534b59b1b364f8e6203173d67ac9805d1011661750192f3907cd633db59a5673125d4f7c323590187c9b0e0f043a307e83fb9b22722334912263c16177a9bb3dcdedfed2bcdf53c5d4c32c8522d75f76d74208fac5f80259d1300bb2730c86b93a029db926ea0f0ce83f45347923ba25ff2727ae66971c9c2941ad5dc4025428db6afc1e7b72d7befcc6db16976584a2c66ae1ad676f6245334bf4712074155800dc048cd340c0dfdce0585128d1d53e0fae1d68229c6d70542413b1f4e5a4b9815be942c537ebf901d98158dc970a00ef63e77de541172f7da53678bda02c0aecf2c121a40bb9a91bde2e84442177e397264971689c0240adbdeb4e83aa18eb0b9cf6b3986c8a39865e6949231710c6e720cd05a5d7dcba28e2ed5f934069ee0b70bbdde8c7fce7d2ea26825bd40b5b3a04d3b62c8708898637e613a22e4e351377c95e0851ea25d85b9276850852e80b2c69ace512cd2463493a0eb80b91f2532cbfd3f910c1b2357a468dba2e7dac6414ce295f36b5bce993ea757d450f78950c1040ae921e1838a881fa99ddb27b8de1647364cb323cc77febac0c4d9d400313027c21d205b02820e85a0942e9e4047d65b9597dc26e14b95e3ea1586740e113e218772e28c21cb8042bb68fad17caa1536f8c7f54d816a02ece6e7b0bd09d1c487f32e55d7c200e0d036b473f45ace576a1de4007b639f3fe2d7e8d09e63e6c04a0bb682cb80ca0918b71ff16ae4e94bd4b2aa600975ba444477c55798d321a177506d5861c9617458a73d153b67857c541f84aafe698cced7e09c6600205f03ee14646461c63527d70843c690844eb7178b591122f849cf1a5fec5bc0f07275d5d102a440e5912f2f75b8ac5c11e65328970e9fd410e55cbf4ee0850daa696581b943869be35e431a472951d7c145b5d6df832c61e5f1fb95428764f2f1f1b13582570f19f7f16b1c275a33a04b370ff5e202e7755483fa0db6bc41b142a431a7ce87cd09d41154022c7e36581e3cdcfb81cc9c20aa2f6a6e362c766f4aead5719f2c3fa95ef972bd1fe7a500acce6c360455cc1535692a8d34f030aabd67b52ce855d67e3457b2089e8d12f3468c05403f414f580b41a0e302c1b8894a695b939564858c5c7b7b7425e1f8eab981acd58be6d2094cc98668ceba21168e6b6bc94ff870de594f041490ac3cc09e5fc80c818c95563361e5fc42656ec689cf182e15e4ce3fd8dee70c89afde7c072f5dce544652145e04c2c9f1e31c02299390224b68c4b44c3a1bb5342cb491900d0983b70594c132176b9dcaa69271799715a01ccfd72b9e058d9c991578fa81aa50f541a55db386a327fa6af400548ce9c2fbf495b9ba520b5df6b4fcb5369862a0d4f43464379c3fad7a6802f75782c5bcc9863c5354536f0a4c090951511415cb22d7d20e8152576efd513260582c2a1d8754d61515fd25b0d4e9ed72380b9e2683e62a3a92c5efe570b8995fcc9d620c46f2c1578f3c7bb5ca4805b3fb7984e87ebd06062b5b5a68fa3ab60a0dae27c1b5851e337d0f9e01a1f2d2eee0d74e092ab282bd7ebfe2bdbf0d419a8e61c615fb8a819ec759d4c0d114f17306584c9ef46b16f7761a1f0ad8973714897e3ff8632595af32aa4839d6d7901e103a5f1ea6a5153602d2d416128e927fd978eec93a40d438e5bf6bfd535dd8a13673f5b880a9f5ca5734526a4118b2b53fe96f8779ee452b36d3b98b08cddc18e2ff0fa1366003ea20ad894b4bfc2d6d3c73f7d4ecf32850085c4b6a0d97e17ec7e2fbe12269bb3de3d8c8d0d135de8e9f97a5ba007f91399e1b30457beb9e1ed01d2c9dd9903ca645f022d28b1c29c4c80bf65b404c16531f3ef30cf5297c8cc81e1907bbf29c463fbd4b997fce4a5c21aea9c78e732ec67c3f551734bcd1388ddf7a5a7bb1c10878359805e605fb4fa3bb28aac12ebf267927fa7e776656d325f74ba29da5c2bf3e97413234efabcdb51d309c362bae4cb685612ba04ee50e7e9fac94df9445490117765325d9d9cc2536f9576f79e0b607495e3e5a75285a0adee504b1a78e65edca0862f2852d1fafa4888d098df513802120c26800c93d2d729a0722ac8b1d43bbdc9c61b8b0d61551c6b3ba6d9c76844f1da1399d459cad53f660a5b08f37bd7b5c60f60a85597d7f9bca4a7928ffe83e1faed5b40776eb974403f42477c91c664ab12a5b8625cd0605719f1cc82b9d18a2f100b279901ab9f66eca211f23d9c51155bb0d67bf434fb9a5e52bdb13c148a4b4f5068124bbb1fe18d3efb69612cc1b021d7e7859da69f8af25084406f289bee11e19bce8fcda2beaa94e02b552dc890cbd8068f04d6d759d916c1048bdef77a5fc3f3c1df687a8592b0246f0b476c820d7a01546fe5a2f0fe1d450eb551a492b65eba8840174351856bc4b4b1af8062263f8685cb81ecfcf3adc661ca2f34dc6089d3d173092c634266b9df1a8650e8912545984129363f4db3caebdc130a758209dc38777ad5e759d4039ac2e68a3149b1fedf082deb1b436284a6c557a6ea1b0a3ac7a10206e4d477efeccbfc3004ae888dc3eaff9ee62b8248c68e66b66701c0da40151b2c41fb02b3a19dd0c40b30199bb13db63e566fd6af3e3812f469ed23341e3c0972cc6e1ac0868ce0043cee79f89922b14d4b9d40a7b4c5ce184f5850d4a91de0e6b0497598062604245d60b27a37a27eb37faf6e801a04e89b12b080f74925705cc9107f29085bae3a8c5d368ac4e1a76bffd6169eb1f314100acfc4923303f72a1425e9643ffba82c3da63b90ed822eb405711f21ae1915f8816051ea837bd335bc10c6a3aee24e0fa4c1323cbfee3062e1b00516f60e50ea2758f725fef3a27ad16fbf95d7958cdc20b5e81a44aec8935f4d17116ab8f59a24c74a55746075848b991017651d3d1a6b9e6185e591c0bc206856988f2f522d132cf7428c2b45b678aaa38ca5d2e99a80303b95381b8d51450ee7d40c4f18cf6428a07aebaf22533ff86f8c43c192df3e659320c71826e4060e945c449d008113db777a856e9c89050adc8a96765a74fb13ff8853936d1d60d98d764d2d07c0dab6f795719c8283d048424295effe0711e12214489a970351b55644541beffaefc7da8c1a86fdde7deb735ca5fe3123ee03034be9bccd4ff3df460a9e8f31be0dfb49116a5c3dde10d9c955479994d3fbbdf7051aa94da6ab5c7391dcfd2903cdb350e40a2bde5710bf582eeef32128e3dbedd2b20204bccfdf0b57754169b31d72825dcfe0493f17206e6b06103c3091bcf693e0868183eb34f80f00763e06f04e2e60abf92f5f8103e288ab431266ec594e0d80c68dba450c6ecbdf7a0a84d4dcbb9bc5b21866364e0cbb6426993cfe5dc03a5e61a6d62805d8c2d8cc44f04b4e07fe2b97f0f608bf43d47b1678e0ba9f5095e5340d492a795a0d9de9c398a79a9caf105763ad6f0c56d492989fa088729fc1d62b2a31070f3a3e7c7926761884194ef95076370ec4ed8bb2abe0fffd4d1e8fdc7bbff8a912e552d42e44e91bc82fdf8878098f5eaf1bdd0d8e3f4684e13a778d0c5fc33ed7f048ca2f9a82e9460767949f6c0ee7fef146590ecc664b28e28c21e309a0b004974d44447fd1ff477ed9403e08f27864e4d354aafe3bd8152a89610276fb71342a507220493e94da9266d2e0ee186e0a492695111dd17793594b90709daecf592826fa480300293785fab87ad630c430163dd2871eeb1ca218d6d84d52d58e8ddd4a6d510444b90db32b562d4a5e76a84c281630cd80a3c41468757100ddde4d28bbcf1282038984171203c268c697741218ba0bcabdcd5f82fd377a1eac1e09f9524ff0d72a8d43e5265767cb79ee7b25946abde2ce090bd38f907ab823cbb3ae3255e9c1bd27c8f4173cfcd6ce1136e908828d1199cd6553dcbaa45cdbbddfae2ae13270a5e15b11dcfd28c9f040b76e1d189879138b807a116b00abbd1850f56db94a9b5cdfa1c294ac24811992e510c463a31d8dba010494d8b77700b186677e94fae402bb9f69ce396320c1412f65641314b73280580872468d9671b0c546ddb8b585ff76210e0e028a98132a098d1127b4bfd7b3488a129bf3111144fe1ad63e085f9e63c6b6022b35a557a34cbe8f8d82c58d6f015ad29d46d4eb607fcb4bc102e3cc726d153d3c0657d4171dfc39f3ad31962629769fb432aa010e43a5c30b4e71c0d8ba124355c5b2a111280037569a63eac424322c432758f7a007f0962720ecf5915ccfe1c01eaeaa75969ec2fe588e808da49ce8135f7d4c51d58ccf37a9b8538576afe6218bc020731ffbbbfd76160d546f570d58bb2a9131090dd2c31967d66a471c1ff64f939e38dc7b4df8150bf4be18b58721ad96a177f577c3b5eae7a398e30dc8297b476aca74ca8234b076a5afdf339381200b8279e92e98bdb4cf4c0aa48af634ed738210497e6d000eb99cbf1ae704071a6c431c9abc8997c23749070d53fe4fd53838acb06aaaa79aa46af9c564305718235a758add978bc65d315bc0d01e5a2511b4bb03c3715973a4666b9cea3cd9b783e86ac224443eb948c2baec8c99d18300410cc1713b92202ca86f88a2f877128a81abd3b08057c7c25ea57f2a1f8d9bb974ac05c7ab0aa100df66600ffbd3330ce099be1dcc11f846ba69ec08b0c96b6649ad5fd96e11634260ddfccbffc49665abc458943444d0b339c4c445e16e114a3b6ac5c498107ffca4cf541b30c684729c16adaa0dc2460b8aea248bf7e19843503b9fec3bf7f1c6284944f6fc63016e6890f07fe630427eb0cb471f191e238a43f194941738a0d19930e8da9a553d3c681673a832e013911cf85407f0c8dea55c91b47c01179f94cafa55f19480ca240c7b5b1f372b6e405bae9495d32e36b698dc2ecc60353d114f89ccf724414c2d28fe8cc36308a5e6d4116da7f59aed50d38ba103fad4bbdd6f183ebef044732439fe0963305ea5485022c199eb4241ebc6f89dfce44bcae8f927d67ee80467dd20e4ce5955bd51f62dddcb617d399c43ce46621f6e5dd0a94c8c1ad655b532a43bd8cfbfb783eeba32618e662ab00c0b80952688a45423558401a1bf07c8f67ccba199db609c3c1d31db6879fb919e477ed6e940020665062a84ccada77f96af76587e404ef4bf562ffeafc45a14dc8b18a4129dbdde07655c940c27cdbfac313d04e80b032574a434c66bf19f9017e715220ee28f478f748c72190e61638fd5e763b5fef74318115a0d85c9264f6708e002a50fb158144a4cfc23658848771d8fcebc522942405345dfe00f9b6e8c19f387b13470d6ee6907606300300008382d4686ef3de62517c93837f2f60fa9347d211f5b166fe4d7e531c05c57210b88b29e56c1405cd6c9b153e3f1bb5c5703329037b2b254be23223e68746dab50bc1f25ea87020f2d95c818f21b63f386f41c0fb0dd8254155b81dee18cad39426ca90e4a535cb9e76a27a089b2c3ae6cf104e69ab3a99e937f4ae18940efae603b8817676e4d600c46d4e427dccbfc714dd5589f65b645eb9ff71c70f9c0374304ab21d76e386d628081d98f0b3ba608ede102340af0e9b9ef8226a8a72730635b0921a25b3a0578a813cd9db37dfae130e929edbd48b44d6453c29f2bea4c53dc358e8ec9a1fab04808ac103f8cb8fd59aa9992f8c241449b5efd1852f7bf1c9eaa003074815f9bba43fbef249973c30fcd29e5d0de69a4f6b6ec6cc12950ebc85d7ace1d0ce29d7095a3ca01db64cf02123814f82fc5bcd5dec1eb06582886a34249bfca144872ce269aaf50ea4b7e71ece906d7ebafa2a2bf81646f4b66a203e1c8b44f7dc48f2b90f5e7f728b3ae5fb89b6b4bfe90c0d3fac21ce81545abfc3f0d7bbe37e209b71310c9f53bbf4236ca4acc586a8a70341397f12344cc97bcd25f6c3ceee685eb9a35c0fad93837ca52af8ea92d03221df9eed6ef563b23941f87a4fcdca2dbba87a8c2b9cbd05a106cbbca20e16f93d3c26415e84d970bc54ffe830c866ab4549a12c23ff84645817219f91fdc101048256ece05958c0ef86eb38eca2b55a28e397904a0f8e0b9f94d39d49c689367610fed215e50d17a051fc26f14b07743aba98a218a1434f2ef82cbc168d72bd658550cb8c2acd8f3fb02ef70a9367ab085d91a51e8e5c4f2424ab56f0f25382d4c11903956da35da763f89e4da7bf91a9cdfc7a54ba3cda529b7c04ad2bd23410288075ef88b13a9cc07e5c8ff4cdd79d476666c049753515aea4c54fbd2bbf28020b6935e6b3b93a106d310cf407818ef8aa6b31df4d6d190dc20094924513cf488e1610899310ae60cf9946737833a074822250cde9288cbacaba54b3e124c00da42ec163955197ddb58e9375c0907220c93d4113ee729e8d98f6a34ef8c6713609972666b4f84e10c7f575742e1f6f8d641d99524446eba86e9b3e9ccc180ff0ec3cb40c8f2d8ef8e520e180c289d3c4ef298d6f86e257cfecadd1e4638fd72f611339af20bcc7b98b2d71b55a6c2c468412487946907f476278c10500512a6bd8386e0ef261d9b9d3f4010487bc45823b1f36ea63f71a06bb1a772f14a09d9b8c40d250b6b8ebe87d0c7292b8890da226011b96addfd8a75a04621a851d368a0a1879e22436408d11e66e984338db2662e48130ed18ab9670d824c80b189bbb74fe25b90258a03ac816cd00a59566ed2e7149ddd341bed866deb076fa4d0ddc32c0952815a633eada34deda23925d3949eefd2c296d2b2b801d502933445214d79399fc2df95b7d6a311add180500d0eb98a965cdad919edcfb2b456c832560370607c0ea605330a6a25c63a700760279cc1f650df6bc8b7f85776dc6ecdce55b4bc62eeca940663ec638412300d0fea94ca33064cb8f4e022a5fc8ff9b1a71f15227ebfd770a511be21f2aed815b9d27814f88f35cd51a197ee29273714c2ac5ad8f75a898bb44cd8571aab8f69cb2af4db6676db7b2f530e362b1c3bd0fb67caa48cf5df5607e56f78083e7137aa97bd7da13e3824bd3c5e292c81d26f7d1078a29935e05f7503659aa56271c5262391d6c8e2a08fff86c22f6bab3f3c1efebbfe42cebd00433f555e517ed822fdbd34de4240b79b5c2dff9aac290c3857463180f21591ac197e218244125fde54dfe404420bae25f8d781e28c9ea74a8c2f746d428ceb70243577eb03f8321ff9abd41e8e6e7a8ba6b4a3bdee9168d2ccfa499303d53df271a15245f58e0ba28b94377ad046138e287479d9ff58721587043af7c89b03210cc1e8249f3dc5f45cec07861b08d7f8ae5bc094b0a52c2dff86cb1bcce9644477114ee9b257e4446ec63de1b488b155a8bd9955425f6be3699c5d2be7ee10a4ad426d2a693d7e0ffc0e38d2623cab55f28f05c5557c1da59896b38c07f89f141a4336c304cee5c289e9a05581b0ef813fa1cab7026978b74413d261b75f6114aa1d5124e8cea8cc4dacf091128675bad07d6f2b6b55ba182d57cb5eaecec5a39c6479873e0e37587fccb6d07bb0544437e2aa8f2e89a548e87d3329626438df0f8f8becba8e0c41f45a1e4fb5a5444eadab86d8156b6319654cd1feebb1289a09664828afeb4adf9a5839d01c85a238ee5be9a24569d7146f5c5a9678908c3c4941c72b6666e42a3e6f4db434198645b9686ecafe52a100316169ef4fed55e036ccdc099afcf298d73bea505df608abc60225504566aae2b83d2a221de7657579748efccb0a7c70ba4a6d0837cab4d58e46f9a48a07756b53a1a5ea0f7635516b907bb64881c5731e8fff60097fe4335b275e56df9d80d97a7739606a23efe4fa7fb2dcde63ea992acb3491851c1f94bcb67a42ef5f7844d293388b315223cf205409cb9680103af2b223dcded5b2fadbd0d339c75bf63b19042aa77869f1ce4d54932f4e9b7a864a1ad8fe889077cc0c885ab105d6b4ea87eadc70793f21aea5e5418915951d3e7f59783e9a48007b1dd3ef033c6140a6b41ec4c64f715c6343507d05b88110e024350867ce3f6ed080e90e6d7f9a480556a5a70c5d17ae4ffef9011f769c763cb0941087965d3ce4b4cecfa81dc37f6359e4dd370bbebdb1cc895dd53a3b36fec10320f4b16bb39f2204210ab0ed1d5fc01cd489023914de7aca27c8891dd700cf07bd28c9278511f3fc2b9da833aef11cfc46f4b3cfa147b2977b99930c98f359eab14c71b750b8efeef8265c868c0d15d5175e1f77dd22ec47efb08c44930ce860d12497ea7b9ee5b6354be91e6d0cd85ac4110cf0d84e60855c5cf5c3a60bf42c1034209c8508d516a49e360014f62be407adb5165fe7e6d215f9a21ca0f1957a92d3bf40bc6687b37e8b90347d3e854fc3d06146acc42bc6e512bbcc7b90fa3fb627d5e5a70a3048dad8ac721f5f3e11112cbdcee5c1afd6d1a31d0a81c91ac1d6a50eeefb966737e3ba4728275dd0a300573c37a22470f859ff5db3a31ba6fdf2e5522b143ed2283e5e8d29ae429c6b6b81b843118e67509bdb87739b1527c63491df3cd2916c69c5f7e09c7a7e6cca493eea08c77144706ab7e5f3e1aa8525d3cbcf2ee1111ceef895f16818b06901c588cb4f71680c411c0a6e7a811ee6e71b0f5096304e6b2469cb131c4ab174fbfdb82d0d9755612428bdb0f78f85fb7dc4565580a61ab107fd4cc0b9ac381a859a8dac21d182c00efc11d842834289f2c3f487b761447d55fc6732427612a66dcfc6af7321812de5277a3c681f7200016c0574a107f1c133dd68d1ce966ca0a5d99fe1ea1a77e61b0aecccfa1273a46036a1563639926abd89d323eac27de61ce714c9b840849937535767dbc79925dece58c574bf4244707e91aa2fb9f26c01bad21602bdc064682a30e3f5e5a48c978d2c0faccef90cb904fd1e7ff7b13b67adcd221e6fa6ba7aa63d05190598dcc8e0a1b60cf58ba335aeda1d983b6ebedf045d4e77d11c2270ebb158c2655ef7fce3cc45f39c0a83f3d0e4104d0c88b71cc45dc235aabfcc9cfa71c115a9161fa08a8f946c2d205c023740cf063e0041d98a91684f080c5fdb00cf4defd83cf92a813f93ea01e1e91e33d8fc60769c8274b254dca39fbc8c2f2aaea89d0225eecad34d1886bde1d9066959e853474a71ac6fbb44714026c3b5af802c9b977aeb83338d5479c9d7ec01c86bd357d04c80e4eeed0564ede4b2444a99d9121b8a823934c270906b48ba2d1b35e0057ec2608338c70db90b3c77e5548a002d88fca8b68d07136a647de9d2b94a0dd8f2323c60ff2185237ba07efd8d49b4bd809bcd0b22a864ab8a279cef7cbdb22e0ecacd8cddeb6fc8fe24d94f2788d91eae144874a53abca9e1c019351654663f5ecf40e1b256d13a3012fff19af4c119a5d0a3d256c87e05dff323f3d89af38b8b6975abc69d3a5cfd70a78bda5488d353a97bb20805262c3884eec00c098c9472a9c17661c273e05d409c1d7dd569a25d0f8e85859751609e6805a8079169517dbb8cf82671034c8ccdaf73f8107d191a524d23bf0853acc1ebc400305425371bddbc230e35675770b0c5c27e0d59e294db4032b0fac21c83bb971c4a57242b40c14d088f9b0b3f6fd422a951da18b66a38752273df0419a74579e1d18a82bb8d21628ae1dfc1744deef83163062281099fba4840177acb4f68e4bc97c249f4a98c1e778eb63309528785e6ab1bbf9f48f1f155b0fa44a76e764e2b678c4e3282e9d386ee6d5e844981fc0d068ce827e092c66d7016f28260cae6966b6f343a2721489a3113fc9cb5a7b18044a2b3c883c4a076c01cdc6853036d4eec04ad9737bd327a350df1fbda99a86da8c321057903c15f54c82eb040daf29d310666013fc8c473b3242f8643d1fea179e1a3539d4bbbeec7579da5f2d0b4a0057639d682b1cfb7fca089c02b9ff52a68242802b71292926a7c2206572a1903acb4f705704de9f6be532ceac4a4b30014691d0a94c12096d7d4659a86061fb91228c073ea4b0ac2364351573000dd3ae49964dbbd915341d3c548430916af268b05883b15a0cc851bb7e755a0325a0b12fbe7b2c725484e50ee3087ff80c2ab5730b91b5e5e2bea2d2823a40a68745e75d0810cc1a5e9bb5b35c1c13af83ed9a1dd43984659e4acb80bac93f55b2efd6721635a0b3713048288f2a61c5082af585a61c621046c37133df6877d84e79f9d1fac2490de14c798440701c6d41a00ea2996e1288467cf08a7825e88ae82358fe05293ae71f91ab4ec498c3a157c01910a31cc017e27af57f926f1b4a11273342924f7a0d08a48b707560adb1ce9ae81fe0cbca97900b771bb5619a88b133157fb585ebcf264f26e0246a29126c18cb7692456abdfb48c1a102aa54ebfd5ba3ad107faac1bbe07c8ac8c4fd217e29bf142ae7d386cb0ab4e560a9db9bbc25effbcbfb8f35df51ab5e76fb81790176a6b84331800015895b09e8d8caaf5a2fcdfc518a2bf8a31ab50ca30fd6a28ab11f96ffd8a1be471c34613e29ec673cbe802e17373373d5b069f4d8a8531066ce2687f0c32e0056c1c5fdebdf3d163b32da327c74d45f97d1cb31e73596d0f18a3a0622914df5d2716788b3831cdc3bc4459bb9943150ef090bfdd1742ac89b472388cf746ce7c6e6115e31964d4d22849c1e50edc4c42fe91cc4d7f2ef3f0f66898183514e2b07b72b73ef9a63313466878209f0b51901ed12442924d60512bd10562b500965b18e8487c73564df6a393e1ee64099c13b880d3004e31cd1d3bf0043a9d2bc52f6875d7bb22efb00e01bd10256817ee8c7d02935cdfb4925868c2e556ff0a0252c6f80b41e3ae221a845b2e0d07188a6b1f22f533a02f2f13bf2fb06b317577764c40f057808b3138e21f7b430cb79f800f16f899372296268643d6c8aa884beef196ac118b2355181c687341856628a9fbda1222b327c99420912bf62b838599195d1763c1f7be40aec21581be1a12b2d7e267811a8dc4e0cc3242973a15308c24732306a05da8320926255fec276050ae29782f8eb2aa510f1d55d30682edef929e6ccb5d0342f4411187407021b5b11b61a4922ef93e94ad1abda2fe548c4a81b79c3ff4dca1db0984345ee5a064d070d09c51b7a89a423e97e198c75d99d0363112df24cc35c051bd577e3e6f1c4dd0b8d66a5ced9ab0648c8dc6ee700d445c3c3e5f0368168ffcb0a13e21202bfd678a94891c7be25fbc7f8b9645fe645c8e2de4060a0e496f2e1627673064fcef19ce19e313c1fb3384740fe77dd6155804e46fac78b905d906ea28b7771ddfe2cfaba204eb48d65c1c33e2c93830940ae44e5abf50e0c50e67c7b6500dc981f7831cc7d421a9cad4119787c1bee501df5b3e419006a21ab5cfaec44c6b28bf082ac31865784d732ad407974a6b9cb3fc788702400bb233c8250dd636e4cfa559e73dfdff531f7d151aba75b13c93d007702759d4a0d5c7053d3c1f84a46dfeab5f1782e766fcf738eaeb2bce8edee1a08431aa0a2c5743ed412a0d68208398d503d0104080c86bc3cb4901448a1224f9d4a57e49cc5b06a2357ca97f13fc3067a72dbb559af7f347983854a28597e0640619c0faefe4e306aca40c6c836b92aa3935154a7d2387994c9eb371374eaa0f64c651ca76eed4d2683286ec2a6c648e9e4b1f69aa91fac2c083824a1381c583f369b8069c1df44e799f0ea0af8fafadcc2c0804db33a7fcb5e324d55f4271a63d70ba7ad9ddbc59e440316f1ea85ec74e62d1d5a9200d965145f1480d93791ab88bdc71cffb508d587e6636dbd7c447f5416f087196abf41e65823eb988cb9341a9c84549ce4856d4d35545fb1936c8003f2a637751f408daef9dca9bc63121197e57c1133520e770a5c19795d9019c9668a1546f7a318b4ce74a0c49e0f6363ea597e60c77db1c54e20c758c58ca1e30c27a22e4304be0207c5d18d246253521d122c008222248bdae69217f5bed647a6b6df7b43ed3740c8f2cb7d8239e0b0f2fd82253956b92ef29f123b034040c8c841b013f1cd23f3bb0b2e595d5862b560d52fc24342b656393e7fd5ec1220d0b97ace46011d61c31b2cbdc87626858552362dead4bb43feef46d346d8133c72f9f09786356bef5354ae1d1720be9e0e382cccb9215f514d52783d63749d5bcaf56d9287cd287230339627380ea20a0850b5cdc3c4cb413dbfb493f34c827670404e281f5d34b80e1cc129f2e0c99c6f3bcd475a38c10e261d22460f6c68e59c50c328ebc3e069d1bc1860c69d3bc3f7682eae08874ce7f8a7022e130158eb8488c5af85590e35a53dd5fdf54d716e3e7713a331151b25386de025b0eba5362f4b8297d66ad5e6f152e9808c7e921145ec445cc0712379bc324936161c6f5cc4cd0c353c12683aa6a424a502f3d78c42cad6a5f4b7db57d0c364e32b3e8d8cad4d01c6472a33f002257cfd7585af45a41084f932c2dfe8acb5b8822b79861729ee055ba89b96fb025d7a6de8bd9e6297dd89fd206e4fcc209c29ea187d8e496333d2789a8a6dc5e20ad045363805188fd2d43aaaf9aa99d066429916e81e1227977e065a6ae7f3b85ca5069a59dba92d96ab00fd17203a110f5b9892251fa731b8a8494c2818734315e364e8366f66f69170672ed93283a445207fc617244e11ce338ebd22d5d7bbc5b4138e2b9075055f91b5a28741a71c22d857e07865504197f63c5c58d9b4556aa6b742fd0109fef09250c4c4cbd037a2cf9a96dd8f731ac821c863a5130bf5e0f86f498f5d22554bf1552200f753ec72111150b412f80e2f55aacb764a9234525c2410545c445efff46ce2f2fba6d58c3fec874e694563b8350820d4af9fbbe6ba6d14c983b3b6716b8f26cf73457fc576ed54206e8eba3ba6b25b9cecf347d9a06edd2a3dae8ce97035fc246050206568ec815dede61d503cff6e9b7753604cc70bcf80404082eaed037f629d3fbbec371e7a5a077ca0d9b50c9d38ba11bb4ae6f28032af931d3e183e4421c39c91acf01a99d6236755b914b8655d29fb86c0e543569ffa995eefe52d2342bd951147cb1a4bcb4cd4d69d9d080aa7bd07b57e15a0e0ffd8f96dddb49381bd0ed88defc964af041207569e67777a449d6934dbbd359bbc45a4b8d218a8e9e6729fcb26169f74204145ab9e2e67f9ac7569aa9e70471d0c367925e9932c564828a2ea5c91f7aab2415285edd2d224671d34e54961a5b1200a25754824a3fb596b699cf108b538040bf2f00d43e8e158f36ce6a77079cf78978d94735332300a5c663e441ca07c7415f7582d52cc565fe08186c0939a0a53e596b62a424cc454683919280a218f8e21d8fca2e0a0b609bb035413167006be16a1cb9eae2f76893444efe8fa26e0bde54e54cf682a6f91a0d2faf7c4f31d9567972467452d2524982c6706b242d35989285902e7503c14fabe5aa442fef51a200eb495490e6a397dbfc4d594ab7fae388774a3a775a3da383e650521fb5936b40b0beb12c1b87bc088328785b80981f3510da3114697643df3d280fb6608b84ef69a7a5904d489334ef150a74ceae6ee6d704ee2e9baa7f4281fcb16f4bf315774f49ebca369678186912d871e9cd21f8dcf28eed11284eec6be42140e551dd3ec59e9344758468dde9e9ad00caef1f03e4827aec27e46586a51de2d26fc2e17c470ea67463130669f0c6d34224acc32458e2747edb44ed167f33fc2984ae8d0e75019673cce3130e6d4f549055ae941a0c6c464519221f73c728bf376bf0ee4e680da75e910f0f618b0a3c599f425f67acf2c31f6fdb95b38206ff8eab309ef755f3c2c31965131f290fa771851352125e7a795c08159c6dce4894d046aa1b6a2af7c19d8e8431c5ebf29997fcc22b7841d2039e5ea8c01195103574b2800ea16fd15388780eb1bfb2bb052062be6adf61884f043f871f9179681b40f2edfb9ae04d4f09fc1df56daf2a5c651f6c1655666822177b1f6c27b3a2bc5d5bb46476eac65e2be24e6095e162c138b6d46112c54c97c18cddd5069b836aadd18c1112eafc6ba8a044e07fec0b57f67cdcdd9cfa478890ddf61ac7b04c5abb47bb8525cdac4776185a100e74d6e95b92c1e8872adb07a329c9a7442f5ce4895dd1cfede15d6898a54b063d8d87274fe88b3149274b56f75f5f6bf5a6ca9999611bfb2e114742f96c52600b11a4a4491b09f046f5dd3a3e546f39d177f561aa35d884e49af9c0e2edf900849213edba22e252d5767ce0404f8bcc4f6c8d974214efd982463a94e769bc95ca00bdc88a5f62f5257e62f2f5f9f5d2faf8af85073b11a176cadae0c413e57cfdd23803405502679c8ce929c3fa88cdc3e0db896d470480b1cb1b4b47be284049fb79e04ed2d7396e927fd383716a55d6a9a1443fad25ae320a87ae51c06ff44a683636ef354d841ce451b79e8b5e896684c22ac6e54bbe6f73a01c8613cc80d52437bace8c0ff8b7576550ad2043223bf59fa7a000983d56c3a9eaa428b73e498832606a1cb8f3f7fc3825548527004fa224cd934c06a8d82ab3809418f8adaa2892395419acd0338386b6d1f99754625ce03630924dc74575cb37ea3b4151951fa9b6c1d3ae4bf689489fed48e86078b3827d37421ae1d146c4e9569bb0274419b72661c39b43376b9814ca79f2fa7b28ed9e04a3d498529413af3b51373c16d0ce9450d6b74137e12043045b530713d5106fabc45b8767b30c11ec4c51aa224aa6baaebd9950afe32c82ea597765fc020b567f681c7247275e748ef440dcc1c3463105d35b2ff94c83e1a73d2ce7d1fa0246bd20bbe58a97835d2830278bb9406767c80d8db5d849a0fa73d95e06636009b583e7a712e7627a64cfe5866efe2176890413af4637fa870f6340b501b0393a8c5e4a71c4e71f22a594f6eff9c74f26393e865cde5313fcb432bc99f000f1c1bc69b32aaa99c3fe0f1113f83ecd5a65915bc41db9799eb6b1b03d0fad3c6be77919ab232e9b6947d02ca6e3350f57b46f4d0068c0e319de44b7823b5cafc24385408f55a95057109fe411d2d77421af97c490198168677da6e59d8c469ec699bf93040b851a50d8f57923a2b36b25c5024b84f7225fd6a9c4c76f389dca07c64fc1987d8ced0694e106d58ebe39a001e471f1552b831b5f050da9dc19fb44171265e8f0e1696166579104b09bbd4ae41efde8ce8cf49f4f0a987f9120962c6123d25008387c6383b252b2d89435dc002017675f5efc51b486213c6608dc104da9ba66fb31cc044229fe9ac5b3db9efd0de219e511893b408d3798bb57215137641565d5ffd5095841b7a3ba6c4502fcea53910159284c2ff910612f2fdd2802d1441b242a0fab9d74a3fce6137ba649677933de48ab67d9ac2ccd62a31844db8db2016fe6753f2708e37237d8a9beb85c71e2d981327c33823a8d4207df0b0121a4c38badcc72f8f650ad8a3f1c964d61410a553c7fd5350e43063a438adfff5fc929b5e6e1d0215fb11cda94fd962a69645bfb0397f2dfd9c1a2267a56cf6c14234184b7365e5b880c9ee6fbd5f5e300502344afef7ff8add0203ca4c7e021f0901f5b79f2c99745496a16dffaf962d4bfe02aa3b4fbde7af311ada018384652168fea2579738ba3daec9a2a614fc1bc6bf633c5e4b5e9c4c29437885f927690cc55887aff87bfb58dfbe18f087a0d0789d4a454be9c37e733f6a39b1a14ddf0acc8c2d4c1db96b3a42511a01b3ab80dc2c50265493cbeab9534c8fd878902b7846b72cfb4434a63b67bc3ceba0ff42bb8c552572a560c04e9c8b76cbda952e23031faa0c39db5b158833d958451a9a6e320729f0b40c69dac259afac3ecfc852d05dc22c71425d543951a6f592337fa9c4d51b0306ecda6d23c7a6086fb5d96564dc0f717cac82b7679fda27bedb4d79c118f66cf64873e374023a55e29389186a0e1b8f64e5baa7f0894646129fe468ea9e0b39ca15be2343988e5a85344edd1fab58be7d8add79eb726a5d0544c836029d6374dbc85f93636cdd0fe783485e42d708c13344d208a9eb57a0a2bf368f9f1978efb3fd57501e5818debc2d3281d176a029379b0ef90b29adeeda8249654530ab16f489d43a6f8b04fca74d48d42d44752e2206c64e5185b3f8ef31667ab347b0f4908c8e963fe49d5cb246904ec6bdd574d016e0034701acc1c75c86c1c0435b9306473cf8a413794fb46840fa559adf12dcd7c3e09f86b7b17c912afeb705c395eddf457d125bc23d745674d3b7be5ba4ce3b9464b93095ca11bdc6a65e3e3470f2c834caf76ebb588c3fc654af43cfde26a0e0ff79626de3cd93f5f8f3ba5fc462c6a9928914ab0f2ba7ccd50d14d4e567e2e9b4e1e50f60c8151d11f962ec175609bab069b70f93b158618d416064138b4eae630bade7ca82bbbff0f54180b654ccde3528a950eb43bcd0cd30d5bc488fd5123ddb8b5dec0f395d73e67ea618a501f0a3d9a31d04332b92e9af355373c1913dd5a98013cf8f2637beff06462c9c5ccbec42e3237bdd7347374d9b3b16940be20ff8ca6119368087edb207bdcd6b00cd245d9447f9e92e19548e9fcf72ea2a8a6e1ecfce44af6864a9758b5eccae389e33e742f235ca10007ac79942f4cfd1e200320af1c6c6938516268d3823bb20f53b8a0282c6ef2d9a5dc3f0c9926685c3ec93d6a488a6de61b2b57271f7b05a997c20a87b080fdd8c8980c4e600c37845a4db55de43b023e646074816fb68e431660bdb72db70c661cee0888a9db65fe98b8a1d574b7950b5e9e51b24146007a2afb9a1a7c8352a10edd1fed170c93753848c0f70e708c21b552fbd9255ce646b2ea69e1fed9110a015633d987ca8fb6b99fec50402a5dc40d8a349a4800272867b9ae501fe9a94fcec2e7e86a209210d9bc2aab338720f9e28612ba1ecddd5cefb91c7dd5902f24937365028a879e11c17a227b2b38cbc6d2f79794ad52eab5d1a98ef13aaa3e22eab5db0c753e1ed856349e3a07ce6389722be9fb40077ecae38bc3b619617e61450d276646e5879c70c1d9ee90206960e470fe5da9fe925e8adb5672f3a7526665807f031d960c749d6cbc73a0ee040252e87ffaf36703e1bd29e1d540a824631f2418e7ffc8f7dd35c9327d0fe1373d08755ba1f290771fb65ea28bfa1d1ce24551743ea2f5f9e4f2aae934d870afae0dd1273bef0c2d6e85de10d9b59b601d7e3d0b1933de33ae204da73b335c366dc9b5188eeb059f7a5c6eb2228d41903c0859b0ead3d901868274fa4068e3c813d00033741ea73c915dc548822d584e368c0afb9c8fff7d4650ae2c2051dc60ee3eacb4e37afa2d870529cadb159d725835f05dcd2e56e16c2a14855a8ab285d8cc94af527e35605952cb29ed045ce53ce96d3012d2b87cb5dc9c5940688b2ca999417e43f13d350ccf33f13a8c24599a177032b13fb0a9828bef842959b645bb4be9843ce7bacfd24360f686807e329afd84902dcc15c93da620e0216276e80ad7e32891c526510d878fb53da51ef66f25e457e971c56158744e306d30ded17ba8cc9703f94bc2c663ca5456c99988df30cba8a9cee778d8051fa62589b34b0a5bfed80a7ac5e9f8b8067c0676581436a7046a87e95aa70532b8a9e64899a4a1d79d4598b914dad5df0276cbf5a0c0e6bf643dd2fb9ef53ea8e356417cbe71d05b1b81a51ae3ddb78995c1490f492ead7046b19c5fa0ce2c89175d9010c59bf2695a926bcf96ae79d347fbbb8319e9c2adb28752a6b9c1fcadad91d8d95b286b34326808aa6903dbd806fe6e7f1c1e899571b0bb4e22296cfd7412783b127b1c84d762e11ce0ff1d7a75752e198641454cba8d94192cda93586a6988c8ef74d97f6d083ff746376eaeb14ec5a1d6dda6ef4f261a08acc46032a2bf9b970e7aa8f6a6c4d7857d1fd2290477ee669400ed6f746a3e5572b849367d029632653ab6106db9fd2e639531b9e1098218a4f53473e2bb3d165b365b04f09cfcff0ca8b42ad7dbc66e93900b90020d984e76b5260a7658d0826120c8087850a135f7fe5fd8a30b2ae7b8c3d9fbcff4558b267097dc8eba576a2270ce990030638b75b7d462729830b5b57fa46638c6c00d6dcab8381c768a80131ec9b059b39beb66a77973a406c9339b06c4f376df92b49ef6904e741bbd04417a93b388909ab029f1c5db8a19525995b328138b99748ea71456e7a413241b33241d030ac8dd5d5c4014163707b1cd0e9bc5f1b25d7fbb7c3b7ccc80b57226f47da9cd3aa090ce9aed9b97c99f4b96b177130434f5f044b6c3c5a68bca0835bcf0b8df831fbb12c7e6b41f4dc96f61b6636cd2d67b4a5f804ff482464b9b244922654a29bf05cb05c2056384cf83cb4f3f94103246cb4b5d903f84b0582e44878a344992244992d5e52095e2a2bc4ea7d3898ad39f2845013eddcb896047740d85c169fcd3f79c565229a8405788ce7890f1adf0991b0aa3846bf6fa243ae6f35be130df666a2714bf82f37a2b5e892b89a6b1bfe4a7782856f0a753105bc4901fac7be61d03d608a5ba1d90130cc33014eade7befbda11008a6bcde542873280cc3300cebb1d1aaa27d62fed80fe5f90976a821b06359bcf7db7e58adddba17bb376443947da7c5d5c2d9b4f628ccab04d134bbd429ddb44dbb30f6bc1cba3f346ddab4bb5bebeead9b366ddaddadddebcffa4157b0caa7e3b615acf2e938ae082c8a6cbeb24c4921c6b53056f988e83be8de2c5f9cdb40a390f320366299ea609867bfee7eddb59b356a35ab59cd6a5ab679b125d42efd9ae6477d352d13d9bc5cd1ddb4e9fdffd13b2a84ebbaaed369752ff5bc9c413014baaeebba7c34cdd7ce78c576180dc57ea2e9780ff1835df5a0c0758566d14f7ea233a09675cd3753500582601af4e4613860f04070030e5f5ae6b305b5744c0aafe0eb743a9dacfd0f183a6763a6f9add6b71690795afe7c26d3667295b7bee5262c302569134d9224fdd60a0fa6be050c3de33770d3fb81ca0b5306372440cbf400402652355e04920973349fb80933796e3299a6699ae6bd366e4c9527582854ea89142567cf2a8a8a8b8a429521efba2e123c9dd05ff6b9f8d59b0f9a977edbe72821b0d85c847f9120830d5b506e830a19a03df4aa4fa1de7c93d237e99b660875a25028140a55832bad8ef58c45e061be011df33561cbd0ee017bae39d3ec206ce489f59145318e23a9ec1142ea9c929488d47154a94a6e855dacb550f073b57a900b374de747b221af72d2b1dddc60bfe1bad15123d040086b0e1e3a22d034ae23819e711e1ae673d7f9a85a6185518676e27ed241142fc2ebb9ab1fe4018badd27185d7573f198ce3388ee3385e570d1528a59229c584086aa754723a7215e148bc896badf59215c287b8f9f1136ec4061a7a16fb8b8ed263033e680002dbaf827e72afdb0e158197c475a7c6832ac0a107ff93826b16c130003d2a5da552a9542a595b23f4b182529369753b462514ef755d2c2ca15333b78897e4f2b067b25c696a0b1fa92762a75eb2104ff53cb8036aea181e5c3f2f91c254c634454d2693a99e40d44a92e5ebb85bb783cb5ade9ecea853601d554ca1d28131de386d0a3c23145b955facc0627ec9c2c6831d8e500a8ba1971a60f1caf0b2048b311c80d6af069a3d50433b096faeb986fb7da09d84f55bc15361d1eb3e22f067838733c24c099c4307f4491e29a295003f797af0d64b02f2b390b72b14c81b9ddc2852a6e83c89e61ee7799224499224795d35700f1126241126b2bbb3ceb22ccbb24c0a07ba6bc2e17b9b841d8e8cd20f94153e9ee79ea184a29b5ab2acd600411908d10297f375bde0fe8944958a2442d14d36b250c846e0ea50c500080eb836290cdb68e0b1ca5bfe1da41b6e735296d910bd6063ae80715374a4d48ea4b247888e3dd924b66489849fa91d59cdda56f762ec7939836028f494d2cb0bd15014fdf0421e0b13d833cbcb711f98a8cc510e904d896ad4ef420e908da734e2c9329090115594463c58f644e3687f9891bd241adb22ec108b72c933f2f7a8568764c707ed4841375c21e602cae1d9b1b292735cf2ca97b3925b720e4b9651bd3acda1147ace096b761790e6dcf6e9724e0ecf0e973ce3cb99915d3e1a38f728c725d3c026954fcce1f4c901d57da20dc78386f64da0472ea01ecd9872b30cd4061ad6cf0606b8645f0be8078519594dd33444f40c2dcb233a0b7a648950a435605d526849672e130df3f9f244d1636b60c78eb9453aa67e57eb6299acd0eebc35d99114beafd81213987e383f6c18586cf3e6871d473a8ee368473b86f5a654bec5c465cce639cebe8481c57e02e4ad00e28811977dd019f046017bc6403cb8669b5da39a96fd014a53f46819759a8d701f298fb68f86e71e61370f9af77bd22cc0f75e1f3548911162f5125493f07307de65027f7ed087b756268c18b65ae5ce977b2f4bafe15c86e3388ee39274ccbb736e39950e24e2bcc6008d002e947580451f3fa1180a49ce43d770dce751b4cce71b8ea4c1ef3e97a26368a87d5e96b4c440f9ef5d89810b748d972e43c3e5cf16f09a2d7fa6a169b416ab9de01a2e53eab8da0758995d1e1db76929cfeeffae95e3f8abf1d3e273d9e6bb5ce3931d3bfed4f87c3a6ed340b563ee83dc83e30a40d45a315b310b002af08cfdec9b409b66c8b699e301d05371aeab063686b5f6b2172e71e05e620232c4b2e7a74df3ee8e5d1d0e232b39fe23f41bc21a7a156ab889562d485ce9f02af40097452c671983720b9feeea64c0fc13b90e33500ee1e59f58f3f6ddf061be40349c7b98cf5912d8e66be19b45d1a783a11fccb24face177307c7819592982455178896c3c0c58233472411882e3382ee7cf4745c64ade01c8387ac99d5d724bd6998157be729917508f3619a097fc0179cba7e3e35df8cc92678058be1ef28887cbbef21a11b4cc679719f9472f2b36bfad805eb20c900a885f5436caadf4c8c572d957befa924701957000298c4acee7c301c85683114f96731875c7ccf8d1c67d7806b843140f057a84734b969157f2966f68596d2e777b6e9101bab7e5e215efa2c16081d24858ad3c2e832151ce9d8d037444e066078fea590574298c73ff29dd2772b350bc95c9dff01f7a8696a4a6e9c65155852af543dc756ef62cd2abddb19a200ca267e8fbd03768e5618817f40dc2a6f1ec45150d856ed131d46c9a6adaf19a9ac4445b49764c74a6a292784d6de2325d9324e19fa087a84dde888ac52f51533fd22fefada82615559b5cd7a97bc61d46afd174681ace344410f4d4343f6ed1338fe4838ca7919ec60424000441a01452f8f154d69e9aaaa8d1666c4ad3383d62ecf3c7d17fc450972601a24b744c915a83f0082a3c8d271dc6204174580149891105a110405c25741883a800054200319ec6244e2f40d2848d0ba66a661cb78e11bd70aaa083b516afb0788deb0842a967169ec01f09bc0061d82a40c2046038c2e03ab88ceb8c54e772d2785d1876eb652d86a9986853ead4bbbbbb3f4702ee8cfbc3cf0a8f7cd499d6ca82ec89946cb56a619c1287cef4c595d65aff71b390c2a2af2ed18d274ca9b121464bd42d9e26e76a85d918f4f0d0d3c3c3e8299c9e6ef5e0ac56ab9567c3f3562b4ddbc14385094f7cd05a6b075e7c20c1627e5a6b39841449962b2749cc23aa26282524e9799ee7d119aab3e309c93478244a0025144956b4472b27d414249df1d6553eab758d17293c57d4ac2a3ad3de2354499e4ca5195a928eab91349246d2485a95ab7255ae4ad34fd2248f409e48484574828c438a189d8c41c62145ac56abd5494de7399a3facc6d509c6d8349d3a72498ebc7704d8cb28f8ca66a8cea7d0353448cbd0d01d466ff452892c91259205631ae487d2905211a5911c499324c91a42a10c8436e083070d3d42a150284492a927caeb254ae45484f49ef968d7f38f86f9ac7d62163e97826635ab594dd334da1d734ba552e95dc1cab2fbddeef77341462095600123e89a175c4648d35c3d3c55ae3b991052a74898f530cc285f28c153e04678145fc251a46b4631cd9b8186f92c468f934422e517722691346d070f179c4a77777777f7aede1ca5949abc887690144c24f426ed0799fbf943b52ccbb22caf4b8b5ad6b2a2ce28b5274935ab939aaa4c52a9542a954aa572ee546aa351c4094a52a32fe2c4893412c1100b5f60b1969563a10a7cb5b004ae496a595b50026399c6f5ff6421dcd6a2ad90b5907a98cf57fb52a48ff42454288a42b196f553dfe2add042287eaafc944d7d2af5292f371312944ca3ebab9ed37c7d34bad68f8528b85d86e690f3c341f4aba74e0b267c7d622d3b500e38a168f30d34cc58ca06a7b0c32e7767013c8ee3986b78d5fa7d8afb5ec9c37cd674c01555cb0759080277e832b496652dcbb2ac652d65144192e5ca4912f388aa094a094692368796e18ed13e5c75d0198c1f80379017587452c454872ac791cb95640c2d43438004e1cffca030ef425ce603ed76bb9f9bf513310c046088816878ae76c7e7a6af78d4ef668a1b5409b502149193c934dda04c138599a6699aa679af8d1b53860e7ad5cda3c70668e8a6d775b917b829752170a61fcd1887563ce86ab55aad78d47aba529038d01ff61867173dd0a104477eb0d65a104c65daf54e5afeb30603b30985301b1d5c8a7a201f6d1c8805284001c228078866c5c84d9e032a48ce491afe7d3e2f290c0cf7f9690c8c41e1ccf12948be388d72806c4c588dfa5d28401023ee5df80ce47918c268bb3ee0365d7cb5b68f9447da47c39a2c86ad5adb9349a8ce94a73bdb7d9bdfb66ddbb6bcdda6792c14efed981c83f79d7b3d3f315a5a71ba7165813fbb3cc1a2ef34cd969f07fc7da287bfe5a7b67d94480fa639e557f48d2cfa86155e6891c2c165ada67d626bd9d5b0ec6adfaf5ce673876a012d4183bfa24318117eeba4a413cfb2e8e797bfdabe5c6ddfafb45c7e6bcbb9d5e556abdad0228b89f9b39853df2a0974bed9b42ca3f289f77e3e11e3eee33e31b75a1c07d6e898908d9b8ed9c1e3069cfaf9171f4c96144b88c565064b904abd7492f4141c71c4e98b68bef32e84e5092c9fd862884159348bfd84e513fb0cc72c7379cb2fb0e4cf083080ca27e3dcd2322d9fd8397896ccf26d94a394858585858525b3b8cc7099f1c98d9f252443c60aa8c683a18eb121dac183860771721e7427722ae2a907959832be33a2d66aabbd31cd9badffa7c09e6f9ae69fc98366c7d4d4fc0c5a86e6b57833090ad5738305169dc6cdd987606b6cd3b80adc0c30962fe87234b016b4125e1f17e13379f0632c0ec2cfbf45cba85208038b7ebeea513553b106d488f5390163d96607c9086db6f92b963021e2a6693eabd7da0e862bd3c00f7e06b984b7090f839d5074d62545665d4e9e60dfd9d1988096b33c03368388c27c773842e7953dcfbccec3bc83713ae974d2e9a4d349a7934e279d7daef499fdc8e4fb890f8f74b9bb63185823e482c4464130c46303363616134ada41d0dddd6ff0d07bf0114f8e0ffdeb4f131004c15a59250a957a2245c9d9b38aa2e2426b8cbff4b07bf66299a6699af61d0e2c7f56bbcc65b15bee99cacd8cf33a508f34500db31e7da77d8ecaa080b32f14ca26ca35bfd84d09bb37a29f348d4816ba41a15028146adb68183b1b60ac29d87996251d3a9aa63b555452809df4b913bf441be91bb507e572a6046dd206ba59f4f30ec1dd24539c43601d55879f5ace3e1a375aa641811e693466c83ce20c00b0e234d241013aa91110da8339caf2075a4223d9870348619ef6608eb6ac65d1f3c126fac66e6c422ba1c15f3dc10b25241fc10ea7ea4b4c4cd5a952a2a4c7799ed8799ee779de7b73aed06064b15aa723534c52be54e4c717c2627dba4fd77517cbaac0a2b35827d64a7edc7d3eb9eb3e9f87f38ae7173d29fd0cf9e17c92c56ab1582d91889e8e3a4f2ae564b59a8613f2319a46628d45cf9375b2ce2d735974161774c5e4c1a74d5c8687929e22ab7f1485d1314d2a53ca4404f53bf74fceea4c2c16cbc462b1582cd655a38edbaf149165fe2b58e5d371db0a56f9749c870516a909cb70b295560aadeeee6b93650765d9b5f9db319fafc96432994c9a76a2678f55e7b8accd19e833c34d7df4394ef843d163a1891e9f50f44e9c448e1a7ae17b87492c7a5ae81e9d494015de0cbc2d3cd149abf644777787e82a1402c19cdbfd5d6afb1158f4540a0473f6ae86e323cd5d9645279908d08d1e0b23984b8c48b14003dc581c0109967b7a1eb4f91b7d39b67d46ba8fcb9a566d1c908d38fbbcc44ce025f0767531d40bac7181dfc5d00fd21c4225a1b761437ed5cf895d951281205523b50245adb56bfb05fab073dc0812518c2320da1045463c9e37202ea8afcb36713a91669323aa22292eca9e7b3a7912272fc36ac7dd8ed3a8f0b8ae0b39bf3714047a825fd0a61c271dfcf9860ff866b7375eb361b96e9f13d1beee98eb52b400bb0ccb1758ee220446084ae8c6bca75396ed18adb5d65a8b596b2db6c1808a2a701676a1e88516eb70703178775805d8731294babf2021438c9aa6691a160aa5f22766cffb7080bb58a5a0ca543e1df7659fdb5d16168c3d2f6710bcda6adb6a846c885eb0710087459bedde2d9ceeacd2dddd38c0526ec011515102a8e85bd7759f8822c5eade7bfb2f765d1fe63baff3c511a81110059cb45062b4b9d0e2240fd2329f7750e94174538ecbbc7773c4eedbb13bf7ee6022d1cd329ed389349b1c5115497151f69c4e2b1b9b3055390cc36c9aa63ba92801b2d1d3eb7ef423d2ab4c0394427802cbf7c222a27f813c9d5ab4568e0a6b4dd3344dd334e94c2804821e78c19013312851a31c200ad0190269c4e3194808053838473c5a1645d67e8f553162cff1bd9c7212e6eeee5cb6a00fb492d0039eb9bc7508702f412215f61224ca5026ec25488ce193e4c665ff9c84611223b9ce45b6c8d8ba2772022c3ee9650042dba3cb2d1fa8613cbb69e24fc5cd2fecbedc315e2a7925f16710be8b5baed7855d6e5a1b1bebeeeeee9fb5d7755dd7957178c92e19072fcfc88fe401a4977170c92f198719d9cba4fd8e86e7195eb24b9ec1cb335e5cf2f5edf0f20cda61cfe4cd57758c0a26f6e5931be80554432b096dcf0f7cb8c16867809e04b9cc7814280c7bc44bf2c12dba00038a49924f3ec992f1019062b3eeee16ffaabb6d60791865fd70d68f1387fe1d8e6a2ba537887af402ce0f51005a851911dd116a02d0ea23882602167fa2a1070fd66a87b53f4c2c168bc5fa11b2f1e1a1564abfd5067cd46bafa555cb5b7655bb691976dd5aedadf6baf7da22863ce6ee8e5dcc8235b831fcffde7b5d49ca2ccbb2b274f7a157d7d5ba4a4f728328fa0676c3d6ec701922f80f2e0dbab0fb6291893c51c64cc6fa86a57d03cb9e9b66a84a7778749e0daf2357b0539e1efef59fcb4d5c64714583249779d702085307a1cfb235e2943c4cd96a95996e19966559869ab68347c912c4da16ceea455d6932f03ea30116166d1b823ddb8cd3575f7d5191c5b0ac0a1004310631884bd6087a4813d137b24c81f01f7c6479211c08acc9215d7f307a66253fdda125238b0f454616df0832726733686615460d819587fc900a9272313e2b327056c99fccb29245af594dcea8edf0b18a505dcb5a11f075752c2cdb2643fb8cc8f872808cbabc8525217564393b060c7c84f0b38a11c2cf1f28210dd2cfa23b40216475cc93a592e82caf94eabe3f39f102d327e7833db0582c168b755d66ad6fadbd027fbc2458ec966a478808870b85df753c5b48bbce092c86b4f0e66f5c81b3f01ec1622806ec490cfebd3871d3c239b55aad560b27f582eeae5d5b2ab5f4a2f4ba905094124a92a5cd46391b6b6da8c03603010720ec254a9284b69b408f74ae6cb3d8ad1728e0ed72047001fe2e5aa1a396ece0e43d95dba8a0ff1f23def702fc9f93f02181c56ed510a769bc898ea9a23405141d128ca309383bea055224a2244992f43728176bca759ef8576e93fa5c8434112962e3505e08bd2e6e09ced12a702a7c65d246d3b4ce33d6c960f34b16d8412fa105d56e0277dd6bad09ca186a6e7930ec0e077e50088c57f0bc9bb13cc3fdb04c02338e89c88ba05bad6e75abd53af2048f154eeb3ccfd3da8eb91e93acadd553700267d75ed9fd687099bf9db59496e06cb55aad160e86854129a553f0f6ff5448ad6507b81a241403096fadfd2ec77605c6e1f770db82f3dcaec09e4bdcc39bf252447e9ee779f6b8ae2c0aa6b5d65a6badb5ed3838f7629c7316e1d0999c5bb9955bb9955bb975b3ad954195123aa71c209c12e48887cb40424490608d78b454a9d4342dd664537466465e59242bdb4412d65e3bd6644ba59bada6597b5df6ba2856b14aaf6bdbecc57da41691eb889ea12814132a1e1b2459b52c8acedc286090c242c5c406255bea9824d7674976b4452c59b2da05f9fdecc97e3ee29456ddaa944e415114652d2a8bac9106515e439f582788405116c5836dc1684b2b9bea9826e7ca96e8ca96ac2dd9922dd9922dd91286995e13ce28986952cfaf188f42dd7b31db11d1fd4cf4f32c014785f0ff47f03c8ce1192108660e1411423734b4dc619685e84cf9284eb4ccbce9cb0b9ffda8042e3b5ce9900000000001c31500001808088442a17048342295b7b23b14000d537442825e3e1b4a849124c9d114a30c328621028801408000c150892c2ddcd8ab999bd4543d9452a28be475855e6441efdf869a9c7eed04c8b24feead4d784bb5e98b0eb34645472f2c0aa6a5cb1e45c9525fbb94b0cb7f78143c9c394150da8d0fb07dd83214b014cbdbc732b77ac29132d9d931009fcd1a086ecfd58179be1a213dc83a3c45775a5bed482df17138484987626691f016730dcdd1047c6aaf9a6b54421a328c5e79562cbae5dd98150d7d18fea05a2d2282bd9da99e3b53515262afbb684310daadc2e33b5bc08160d9c1027a6e280a71d70e120f70c43c48f97d58de2761878cdd226f85980c9a9e93cd6f7ac287d8fa75c023f002e713c5b76ffd48b5ffd85062a200daaaf1e0711042b3a8126bc2c5640cf13778af074eaa29f81fd4e241a49165a50e9f539d751e5c906d684d935cf592db0d35020ed627c712ad834431c04ac64a13f7a72aebb6809974d250527c7c41f7f427597b5cab489f7c2631f34e88cf3ae4f42baf87af76ece5576c5bf0b49233e4484a6fcbc4d814942b2a9c99f313cd00d97a5482901a68aba5dcd569425b9da6c8512bda8a04f531448d64143806f621a0b7ea653ebb21fd1296bf63551cb58412662de6bc64232558eab703222b9166339d28217a538498d8c55f451fd8d1af76ed151e5d86b2ff932ffe56c4c59b4e0610aa12840804debdf5af4577aec948eb8fa239b7f47fc6f92f4f9f5753b41d7a0a1d653f6c4625c01e609eb15af69727ed58b9a14b2cf2b0ef42e4cfc1312b79cc6a86359867f18b96bee4cca441a7ba31888c4c3ca6784cd22a999a54e6700f6238f43715d7c03c7c9345e2eda3e80047325f9ecb2c8e083dc48427a206966e39142e75cc1cc5a3263331e9ca51639ae5996b82cc04e58f19ea44f3245cccf0ed4bf25b31ba3103ad980316cb264fe8bcc08934ceac860f64eefba4d5969aa5c18c1d7948e8424d9199def6ab0d9a1152cc7d11fc038e70364293e7f79e80d20d7d2f823710d1549f325459250e8157debd11b931e82c9662e4fd850176a1b6be3b6c7d3bdd29ac108fd47ef07dbf639aa9fb076792061d28b6dd82aa88d417f2c7bfd63498e3a1a9818731ccbb2b967def42f8bdac8fdd6c19703c113ab6ce9e2e2236205166a3a77f4f01d4239b635650920adc89154b0d635a23c631fe10436de96ce08af2ca3065bfa1789a704e79d6c8cde9cd1a1923d65fa01e373bf629356c1448bb36329877ad885d023c5b4dcac57a10659764699d3e2f7c2c3b128553b6913ac4f039d903de3a342227c0212916db8893c904313ff3b5a92336f6b21242afb37af5c72bfe908db124646186a3fb597694b6930f12dff4a139fbeebd09a57638f42aa3d5c33258f8565a29fa0915866561aa8e2da28c3761ad2884407cef8e13bbf490ecd17d5fb1be6bb9366b8fcf79418540bb930dae190e431c90dc9d81a97ff9f5328331a95eef4b243f6efc1e13c8af4d453ac47c1cad32f35a98afbdb4f5303d54434b73a45991f9ea0be154d7fe48a9634fc5f5104fba3e8209aa723ade8f9ca96ca9c2bb4515f1128312160e910cb9249ee7b93b105d91834d27c25afd9ec80ca7d056b381a4309e6d30d258f92cf6059eefefa98d76324424840a08b839113193246ca59d296b6819e6765a3480dd053fa0bfa54a876a85bb1bbe512c7c105c9499d51b7c7bffb46680060d06dfc18a9dd4b735a6366b41a07c84124ea9415ba8dbfc6fd31553f857b0423e67d215f3b52a113bf8348f4c407199978f5ceb1a625dfbbd65e570d5485b6eaf5a58597b2103a2b9092ac094289327835c09a18acdb282964aad6e6e65be42ab39e767c9349b9fc89f96a4599b857c6ccb6f70d3b8f260017f8b9bc50ffaaaf705bec76082e2d52cf42ce46832193772ed946c0d51f87d935ec9517a2a1dd450760926bd0cf24167426b79cab2e456a44583a3a89de85bada3cb5f48f567504b26db24e66c26e00e01529e90cb19c29375688e776d1f7397e4739dbe1ca563ad4db46de9be29db682dc5068e5d8b1f1c944094d5fbfc52d08e9886a38b2983efb848a4ba6dd9e4ab1a3c6b5bbb713cc4bb07a21f13f378c9546447b40b9d5c3764295d85368a96637e3cab8bdab6fbe0f8bec7eda54bc205bc2d75953d535cf8a21d3b812a47eb8c76f51bfea362c45f6c87640d79d2bdbe392530fd0d22233d802a058b8040a129f1b7f229457e0ed2aee6a385afdf7cb0fe457e1d320bb0a90068c6b9f39cddd8cb0c7740ce68d61e094cd3358ed99fd5293a661d13250147381caf90ac58f5bb87ef6cbb67aab2e7156537593eab8f1db81a2d33f5d87d3d1046075ac7858f336c9e4f54b03065585d57298ea3d6a206b5db8de10eaf2ea6159684182c1bd447c407aa4024149f67dc69612c511fe0413d63cafbe347419a88e88922a901567780a0174a07ed577dd760886414ad95eab06d2f1b01adc55728ba22793c45c155e69bd6a40fdec8068107cb9e9e97518ffaec2545a5c3074c384f3bf7e14c80a691c69f272ff146ad861432a21a8cda43a420e1f26bd1357e29e1bd50630cda39d6c6d58ae035c4ad6120430a39c3d2d08b882463e094073fab43fb2905a94cf4a50e6eca31c4b0493857b59174a84afff3f07af2e9371857c2c53c523a93d180eb59cfc3e1b56f35a5ae0e377840be332dcf11f26041cd29ca979a20e84c27b2ed612a9d4bc3f00f5c4fdd6e8fd801bfa3c0ebf2f7e28c4f406a5f472558a880c2568dc266fe86f51c9b9e22e62df55e1b0ed003f5ab3533641e6f0d7842bd1b0776a6cdd7d63b21185e4f96ef84ccff8611ee89aca01daff09e941101c89de345514507acf9635494e88e928b08ee93bd14951b00416b84d0eb61b10c1d2f73087724c45d8cdb374b85bb35c2dc3fecd85a230860b1093419bfd64dbf293284571adfb27bf951c70ac945e9a5f6b54e7917e025f16b1204595ea3fedae44f196ee001af608028511be53e9f613e9c844dda4741ef94333cdbef91f0f16ba810baa132ae82c70597166c28dcfe3f0d9f3bc01f78f62ea20a0d6358d00e15e32783a88277903fd06f672cfbd3acecf5d7f29bab88ea85b3498e12827d984e489f360583fbdaaecfa6a6714aa7d21c8f23334f281ba678af6733400fe9d11e5e25d0d1ad1497716a3587a749076624f81178015bf47cf0106e6818b828ba65a2a287ab12398b605e17f4e97576db31c709d88e8a5585b6a1bb512e628e73731fa8d754677cf6ccd9e9950874337f880ad364826df075a46ee444ec74cea06b678132e273041644d8966a8f6368390a121b8528966239f2ec58e798a9fa2b0a8b5e04d9488fce37bce285e27b803237a5c45d382ffafbb3a0be967a2b126917e219cb090a06de48a5adfd84f623b681742e860197dabc1f004109972f51651c495bb32c0c4a9b93eb99a331cfe8cfdcd4df2eb753ba9c34715886ea2f07814b2a7e633e0bf1fd49e6585e0e07e68dfd1051ac0d928acc8a21dfc91331f8472792227d6d9102c800f8f1fa35dacf9cf3a57122b5ccfb86489c049f2c6d27908adbdc1d3aaa36f1d4157d311ff0003f7c2baa78e4f4864161eef5ca101c97eee9caebae37532cbc6b034f320ee1780e3c626cab2df674bc978ddeb801cf5232133ff18bd52044ccd9ff0912177a1cb610924c1ba15a2d31a35b428223c89d55a2227e2dbcc2afe5c4f835d8e658dd92403a8730d87b9f851d70f8a6668efb1aa091b3ae5b9cb75b99173432730ce5e2e6ed66c972bd3085200b8bcfc257aa77cc964f483df88c311b89b2d19606fa6dc3b7953ecfdca90afcb81924870dfba42edeabda6b7898530583e060c6f27164cb67b094a2e3f60838c84afd8e95a5af628822719b919b1f0eca7a68046ae16bc17940aba218da2401ef4ae03d0ccd018e2808d15a6b5a0718b24e6d4014e303f3826ced880eff2f206ebfbaabfaf8588c3c2e623f2f51bf1cea41e7e4c7a13974921a5f42b346b01759346773c6e704e313999fc3e198dabd2bfc8935e5307991f1253156dc2a2c9c516f3b0d8e8871bac88740b3f477356c2160cdfa29863121b5d6dcb917415dd70bf50691224a16809f09b104b0ffaa0e0652c28484274c198be2d0e36a948f873f36c03133caf074bab48916619934d17319b20367ace9ced6e2505ceee5aacaba9241ac2fa4d5a228ce9a7192fa2b7b2de3581f858b11ee84746dc640b9d31403ccbc34194c1d59d2360cd937da21bf0e4267503cdb2e8872c9554f209116b6c60c7d0b15f0e2c2f854088734cf646a874709f241d82ca9c0e6c1ec9d90be5d7cfba4761d64520719a94ead7fed8f17e085c0dd17115862d334067be0b9b8e4242daf953f16b8c9cf1108a940b2788d7138ce0e281b20a4353b231744df56a1cb8c97af32eece387a3340096528af1d160b6bc4d2a1354adc74e520ccf3cac1841c0662c122b12ae26ace04351ca9657dffd66dbc59bc0434e5e4ea63b1a0a49fc7bc3034b8c780fe46a50c7f8c90dd1794df8c3233b61750f470c31005a899268ac887146ad8c11e16df532592c70cab5459eb768ac26a80808ad4d0e3711c2acfdb21a80982b5ee83354b2846450aa51cf16c798327094c5ffa98a28266571992ee3929c06432fe51fa14ef291452e77c8c32e18de83a195d1cedcb151281454849890fb730ab7642ea139bcd3c9a329a11fc002aef36f923ecb0c664112d8a557dfda6eb513d98fb5b6e2254d1364a788197055c422ca8fc1fc917d038c170dd88d7a7bd2d9a1909e1dff0695f854635fc37cf9f03a066a6f8674b48ec80253b1b33eee4cdbc32e8cf5c7663b06942f0103495ef4181f79c00b83240b5d7fb635d31a19db5ad1533d78ad5eb7f5031e779ffbfd13b46aa49088b8004b6d7ae3a15b8644931ba55e535998fc83cc252b1d1ae62eb713e6f94c492a2d9fd6103a2b9d77e78fa7588ca6c6b4c91b26a3ec974954fcdbd4d362ec644b2bd68a7bd4ac95343f73d898f26ee3c1c358fa5bc574b24ba47094304be79cb4da72e345b8f33678a04129f6652e3971ff22047e77706ed21b38e44113a1f8a347582dbc64bc4dcdab25067118a38c438ed952a323a9f83a3c375d5c5d75544f0432c7d416fa6d0919403ca69756272566d0fe9052e013dbc2b5287add033ac768518eeeadcb7faf3ec4b9abeb7538e2b836f5530a2fe436a1314ba486c41bbebebc2fe6ac95e0f6d7e9ad1065c1793100f255eafbc923186230c96ba9f2afe0f8555935a54a542bc54c457755002bd6c969ae0006003a0f2b73782b98681d45941b3c5d1f512126f253e1a1a03f249e0a9b59d8c169ba8ce5caf66cb16c74fec5e74c46097c3baf86302acaf298b6434926e9d337b30e5247364e981e2250fc4d6f2a4e5af3a59ebc51bd6382e86f35831ad7ca7ba4b6a95c1cfe746325ab5569f2561fe53156622ebf91d08a3c377fb6425bd6b710613937c0436c4ec796cc1c23c032cb9fd4d8ceaf6122abc18169e34e098331872e81a7caddb273a6af965b56efa1bed756313a8f8ee8647f24909599c4a2196542a0f96685b840e6daf1848b4b1fd9393409d76229d402340a325f6b1ce00297cc4680b79fbdad7c8bbd341cae7c95b92c1024ec2eb6f4976f669099f0a4177828589554a1e6dc8d9f47b9164aff79661a1e11fdd1e310d2933b224bb08ff5a86250b04c7f6653a0ab6ac9b1e93b9fea3ed7b3ac9c76112fc240ca3b78319fc140efdf24770d3f4306d6a33b1a49bba76db61c478be52fa4cf948fc51a6a587b9a27288a5ce44d857c3f047db005c13235bb79019d1fc894db43914083c9c90a2cbe950491fc22a5fee2805ca40da169e83fc1e6b82f5e459abb1dd35e1d6600c3b4d00f973c77325b9405b270ff2f55ebf047aacd26df7c2139698ec5bebb31c9037c183f299d70e35e8340072f4256dfa56d93a14b9c851f40e9b94b89790533a4a808beae3c3b83d08d105656073183c34f863b8f48768bebe057e55cb5be67a04f0e2d7ea5a99725de18ccb1477a74fc87ccba2915a16a593d49cc52687254b5ada3b15f61f9cb721bf1cf4bad678c2cc2b343893f9f0cdfb6566b0a14623f601185b809f957855b7a6f7a6a6544aa9456d3e85da043b47521f0b60e7505b0c335a73b5fe20d9301c668a083dcc442d65dedcd77386ef481be2c844d4ae8cda706627c9598a6854c3c77a6e04647e320dd7e887a1b8466f188c363fc31f9fc94170fe55b210d6b80741c1fc746c954dd99d836399066470e0fd938428a7e1780e1f4be40426d1f529d7626584d6934be930bb74393fe6801716ea34919cd327c5849e2da71ee143b1b134cfbf12ba1cb60ad5a49a9d80e72c4de474537bb21d27e0612532e872e90de18a426b08ead20b64bb0086325754a02e74b95cb9a45dba963f10b630d5a15a6e4c09581100aa30b33093c4098fa8214362fb676e06ea4cff1310b4d694b05b760519e5570fb1e522ff088cd2aa1cb3731797f6df1503a4bc0a7857f9086747f6de797278dc203b5f463c6b8133217dde9d1fa50e6cb98ae2b6902e727512fa332c0735b6dcefb3e6144c3756e2c69835c79b29fc05a15140271d86d973cbbd5005eaee72d9724048ca0b05bf6839488fa1e5002d715a943d2820a65f1a58e2352b55fb99f9b5f4e492a12e4c3b0ba06648350b0f240e0ac455abecb750644ec9064f7ce55073192d2ece691d217c3507705d6c7c61524719e9ca3222f1b8475912e4ee159ceb3b798abe032330945a539458135c6ab713e67c7184f0260702683d2a8e4c0b13ec223d61b9bd01823603a25724e2d174eb60681b8bde11de521de241c8dff470f782bf55abf5128ee0d3902cb002c74c5cae10e76271d6d81fd0475ecf48e551628ac9485143393589e85878c1374c6f24e2247285330b599a56670381222b54e57d3c1f38eb00e8dbe5e7046f808477978bf0ada4a7bb7be62b1c9aae02bb7934731c3be8c964805f3287b46a2ee216e66d914b916b130d063616a6eb1fa44d004bdabbe70860859c9675f89fd5978a6a7d601a8a0c6c1fae93419903aa3839e24ed43ecd44a80df420364e7ebe333a295f95328ae6f9a3fcd908345ad595069bd72be9058b281f33e45bf519c5f1714fd39b82e473a66ae4098982c6b7cbbfb7b30d949e94624affc426e449b924d16cb8827a640bc76e18b170fa8cb6548eba488d5fcd4de90ebf8437427ecb2906e65b061d303a29e66dc3fb44902e69ab1836a86207e35841309926d3dcf3a3e6b5908c1f1521f4fb9c34bcdc203d796a8b0be8a385b92addd0a36b247beeb210c0eb8ebc2f48770fd299055864fcc5fed0f37d0b0c8992b6c29d2c3af021779503ed1aa89ed2c3095c43e2860e50491439c463b290a7138035f51df94be4576dfed226544362c6aba12f8b37837952208bb260300e83525abbcba683344af6f7c164c19a472ebe85f68c54264fa30114a9f12395e88ef9966dd6f0ab5d1d3bfea1e8f8e36196769a885f841a27980dd7f47c0ccadf58434f82ca748728cb91a525f466290c34993462d9a71e7a47f0e5bc3b2303be19588d96e1b89b8ce24a114da4334ece8466647034c093855ac8539f141cfd72e89a0de523cd72f2cc65bc1ce9997dcb7291c4424ac7c4e6c2e1a5982d36c6279fc3cf437dd149b5971db863aa414fcd673c84b159828a1e9fc66412c90a70036c181425d6697b84515b11df40700f9d857f1026f711c71ee06e94e86c476ce1cc6cd1b81cb8c69ff05a416933e06d6d3cd18761cee8060dac5cbdde9d9f067b4d622f39e8d3f4c221f343f8c1ecaf2c6d5b9287ce4dd85e43a99148aadbcba7ad20fcbca2908c27a0742b821aa2fa84ba5df63795b17ab7a7598b87fb9b728bac19576f6d9a940b44b964924d82e765fa33ad33924e0db10393f5c19985a36f3c0faa42717072f9e2d9a34e048004167c9dd0ed4f679cc12158d91466e08be8b694994c934acd82e7d452a9cc2b4408b084341a74443863cb6713d2d378627414eeac776fbb3cd793d76ab71abfefdfca86eda324276ce779afd6bb02eb8a6a8f232c0452273f73bad5729877460ebdf9a663ccc4f27e7f559375d252d37a0519b1fff036b77863480d83f0a2b529506d045422c94951b18b221a269be1d92846dc607d0da70589fcbe88f9785c6e60c62f37a940f889d7875266054b07a596cab30915957ea5f201e44ac5595279d2cc7e1565572481f395b24b2bb880e722e3d738a166a4f213a06ba7dd128e1580a5893eab2614b3fbf6d6db963071358cd20bb2547aadf04537d228fc6d1a72baaf4ec38c905c04a770f0b236433df01584455731321862ca75d60ee4b5fd7f5ac9ed4380ac7d113bfda8f65de0d5918109bcf810a3b401340879b4f4e9571b2f5c1c9fb1a71fec99ee75747f6b6efe9a9460c001ecdd2a5ea819ac85a6e5dd8886937de53d55d81ee982bb5d682b3c0e921d8ddc94d7122499950407d112d03d8c9310e6cb3f58e7d31a90e47a6d7a729fbc425871ab26da749446f36b70c8838088a34c3dbf02748996daf5b45adcf85e57a88049c85b9e71f2147ca5dc3a8d2e6a1f84b68bea956fa149ecbd97b822d50913f41f6902d4c58823d9e3ffd03a911d04ea493690bd0d4065028fddd9c3088edd487b5887f8588cbf8b70d88a160cb90aa62536b6334c5dc5001b3e4485dfd4b8de407b1537299bcf6c36492d7b03762e3122d59d2fa0a610e8d4067a0bcb816417b52b34ef41807b65fbe7545ad51f11a82b4a395f498bd87b90915b19d7e1ecba217de937d3f68f85b0e23ca03438a623811b25505499286c3d6bce49b3bb4fc701d5f45d9cbe229b17ec6b901214eea6c5bc2b28e8695a111e9c8e25360b9dd536b29193ee9683ec8101c3d02276b85d7bedc25022a0ee8a5feebe209e568e868b66ab75febe44352b82e8b6155517c89c4442f265a25c38466a0fcba093ca29c4779b4a8886083a39ce39c6d6c836476ca3d497a43c7fc9621e5eee377f5b295b9aa40c0592f460388ba129eb18683a861b447f8085f42df80a4e58f068ed7df32af9078671d953e839581a456cca4d034aa923db9bd42b0723c46198a237c0d18cd6a6481e08edab6fa438b4743cb2474486e4b8035ad6fcc4530c03068da1c04d62c472b823f2f11d7a5e6007c84b2a93c9699e6696c29ae5d0a4937b17d0f4344053f481183087c2bab8fdc5b87fa62873cd53811d911e598ef194408376707b8946030aaf60689f790ee014b8de67dee1ddccfd149e469a9644a4a996b2f8a7a8d8ac4437209bc8df37ecf054c9fdcf2eb5c7cf87d2e477a9a540286e6d821e898f2ff22d5bf63bdf879db340f9dab9ddcf984a0d53f1bdae520ce76cbd19d5efcdf1ed36dfc1259aa6c202494bc4e02f60db1e8cac542162ad04efc1b77b4db45a73604514e3519e65224ac4ca4fcc4156680bc0a7804ba455c8f673070a4c3fe00b02d5ebf47598a635a18099c18da48e3c5fea6421b6711e9d211b437ac2ad60ada11d3968a7e729f6850e60a06c13cf2db1d17cbb4ffe5905a41f877bf454a24909238447cb2ff6f60497aec953c884b35fa82c4496896c765fecfce8a2e94f8d4fa7160d356a1538a0d87e80538f9f0185c38342c8e0b5a7553432ef4185b06dbde434887f6b2f9dee6d0e8bc59a458d226ed979d86a342b2b331133b72d4e89dcc152da2a6952ca3f67ca0b678d34b77dfca91654d5b45e3177b9f2888c8760ad99e99bf2a21a05dec8a82e574b1cb8aec136f8d9c58e1d921cbed385fd5ca04cd98b20440415916e30f2d38c211a2d4bb96e82191f7085c495f65fc599f30628ed0426078bb8fc2a81eb485213d6b9b8e3ef5ebe8d3dd2d2575a11597e50e26f7d32a4c50a9fc762a95f55d07b189f4039af12e4f3afb5d1bf642568007b70d96e9e93433b306dbf826f8340fe257444366729197fca98c1422e64943d46fa4f36db1e819c3096b59e9b24ac4e0e4940943f6599fabeefebdc6d14eb9165edb05f330ac5b6c0e27d17fa953c96a2fe53908b8d88c4cf76a18a8fac1641b9172768f611a7d3c904c7d0dd0a0f7f732dcf78983d1f7debefca4b0695f1c3955a3ea6bd61561a01286eaa89249ce4329ddcdb6bc11835d5b09b4072d14d2b1f75addb4a908b39fc3ba179c6c23d89688d4a374e8fc4a44bd846400cd0e57fe0ac52c3da024e82b94c3cdb084685e028256418cd8d57430617c9c14884bf877dd871c74ae9498bcbfb9173d38722f84602a18575e2f4185f5bdf44c44ae305019471ea44061d52c08564f9259d3d73d328a636ebe6132ccb7e8d6b6841c1aa00c93f177c4a270b52e3579bacb8c37d4badaaabfaa7758afdc594a2d09cdc02f66d89f03c780e3a001b8847aaa2831d97c6cffdefaff8eecde42659dce336870af544a12a0b1d58af12e5886ea048a275e4a25cc01c98d8b66f2fa2b5c774aa18528259788466897d323c54ad109d97f05763c8e2e1c2ccb7bf7fc0ce200cf596c6b8e28ba55666e0eab2e3fdfb6d5ad00dbd1ea6773fc56cea76d806a02ee0d8cdb632039137e56347d69e18b46715a5f4809f6200ebeeb8dff6f6838acfeb260657f58ecc0e0c5e6a6884bba4126c68485ba31f37343ac04e89e863c893f129f3e92a14acb844976f6175c01472b24c56d270116c7a72306c070b99b18822656006d40253b1a7428fc5b990b717c568bd05cc7b11f1c13b9c2907ce224bd32ec89aa9c891999dd2526d9addf0734c78465186b42accea6778b5f06dbc507b27886c515172a13e991a915e7c7f95d181b30d20a864f7b7c3d8614c6dda8e1475be097025355c8a49d671d9b46723200eb0a9658b803676ffd2d575841afd2336ebfc1f53ef211d4043bcb34fe88c06aa0c446706b8b3b2283671eb71f9568e39e1215ff4372088d534564fd3322fd25554710dc387b47f44bc4fab8e1b6c707e9980d9ff268ea72f0e2afb2f0bb70090cd1b0c94b3d61031d64e7d23110b6a846b26cec0b5560eba1d02c03e54320f19aecf6aac4aac952585b8601800acb40271a67fe84c7c317b3214d8ab36dc2728a8135a780278e48de7475467bb39e9b7343ec8f8d08ae9532e8800400c6089778d57e0a12a7cacd0a7dc5b5f880e7854073ff2109118c9dc04445ac2f0e7ff78b4a559008c6ee1b841a88c8d906b00ee5acf97466ec723495241af1ecaa9fe5b87a7427bb9356bf05137f80345092d3fc339b623a826e6d2f28213c83dd1b95032fe22bc7f2687b2c88380ac3ec67ef491b7dc6013b1ed877371b72028ab0a506ee4d36250438335c1f7f3cef52435f7f7ec7495431a1644f5863e4d1a4250d60aa2b5536cfaf7de04c51abd4de05ab98d7869d64df4242174ccda7d22ac7322379e4d19305697244e5124495030241406573cd425cc4ee9bd4d57c033f277ffaae35fa1096f3d96e4eaf36dd302bbcb80f64ea5c4a7978dcb8de06b1824c9cef5a7c72d741f6609c0c572b2a65953f24f71cd42bfc7d29a019767b7b5885e1485bc31a8ae30148020032cf944c79cfd3b100d76ff7c99ad6641b161f3432ca1d70c5db91064f52f86f977e71b5b5f489167e5ec635081fe9584180a5dd21855e35b95e53ad4f8d6b372ab4a9a39a6abfa482a2d19256d5f63b837c4f3188bad3785f4514d00a699850f37fcf53708d2a0c06915286d87adf1f5bf8d355063c7d605860e73e537f15f4806dc6bc08d1093b77a6025beb459624ed64e539ed31e95e8ca5ca440c5c5193455a43012b7885cad713249cb47ce2846c0283a0c490e6880c57beaeecdd5103e99851790f4011afa5f325e235877a5a0bfa96d38f535810f688019782d41a36f358e4265466a0468721eecd40f8193352c4f6aa20432475984255634430b6663022534997844970e1ef01bc69f4f63f2814369d2f745cd6dbb6089657f6eec3d081850cd36827b73b8fc911951ad2b761d81dad57462aedb1102365ad864f5b7559b924e0c086b05d425cf2bf8d36d99cb56add289899f8a7153e27c6a266128fbb88abbb8ee24c4f8f455645177cb1c9fafb5a549f95cfe69970c3f9771e732adce75ec10b16acb8b716e0f22481889b92b846525942a72ba408a11c751b59aa81c7504123e09a4162c554dfc0911ba01c62e4434b542c78fbc35f576520ec9d2115e4e4d5a7369eb72326276a29a5856c96ce2a86635025b70f0ae0d84f92d5a8442bd4d8c797b71d9f2df80ec33f2f8f36823d38a39bf37b77ad434e09704aab409291dfda2a8c01775820ab32aa38020b453c68d7bf2b9dca0401d51182d56bae2b78bfb411ec771ef526ed0323de1777690c47c9a20566f74d9e86f03b33a4613e80c45f1e0c341fa127e0e68d36d3a2846c5b4e944a2da195f784658acea1e9134be42dbea2206f4555bf142020aa876930b272764283095da7fe21ff07c27489516d9dd280c12ab7184c3c55df743977c669580e6703b0f98bf269730b4036ffd27bb32df59e6c8f996f539c046f880a99f85b2602917da7059fe718875de643ffce75a9400f7363574b9cbd3223d7d718cb7d2ec3f3e9fd3582dc4180ea186ede1831c07fe295a4c5288239fbae18ed1d11deab78d40c1217e6bb663fb742dbfd620eb36950a025045a1296f1c8cc58d69f6e99aa882101be12048017edc87860a4a9e53dfab05ab783ae6ea58b237d364f0e1e9c5871484c94ec394d6cbf4da1d54ddf72c08ddfb9f4f0ff393c5ad830534777bb1d4f4cde55f3659a8837f459e5d729ae3184105352b3e69d8fe44131ce64e0cec3808685f7ac4fcd40684646025b97caefd5464f295e8f4e682a74202773e3b15dc9c2cd7eee918a94fc7c454ec9b789291769d0d32ead9070df8284ecf81f0cf91b56f2e79871bb100839c550e1cae97a346dd6c62afdf4edd7e810bd910e48f717c159f6765a5bd2f3d601cf63427009544f0fa6abed4c316d45f10e50afdd501d33afa9e105a6e4a01e5d6c9dcdf274e015b7f9f008a259974f18b9e4d54aab50c16ad33831590e00c96f9d6af6e3c016f14a652b44a327787dbe7d3ac986e84da957cb4aff994b940a922e81ba2eac0b8f4be962e3ba8d554dff58e8b897ec40d0c8f4a680cb11a228bf3105e32617b096bf67b319b64cac1d4c2f74445371329a21c6d403f65529de61419a800c9b0247fcd3cd8f96dbbdcafd730657e651519359cc2bb5b08d98f819158ca983629e2239cc82d13e46631162cfbe46262b1c7dada16f2c36d9b0c520ba9059e92a496226f9736c94c39d266c98530f51b2ae9cc0f3a633011e2d730a6a22563b272306dc398d5e52ac580310883bb690595d3957542b4ed3a711dd780585f5982df60fa42d3aece90db5fadd375f12e988d65ee80b90083614da7298a8bc39ff1d9d918a65f16ddfe890ee74db420f8964ac240c120e59d942b0eff6f9271b56b23cba943efd4d439fc41da041294b8f263f3ecfc14298cce3b6b22fc6365067143721287443c2b33ecc42ac551b30a3f5f00a75410a94698a6f9a87829e8de2d9c6b2564e118ada4c223d8f44b0cbf3f934942d02a4d4d0511a99c530618cf69b5c9359f826644addd9270d0675e06fc5d1ec8bc2e480762caf181a47ab0dc13a95462d5cfb93c3150bce59c9231b7ed5034e647ef9d4b21b960d0d6a898bc528551ce0fc3a027ffbc48bb6de3167f2a0a4e9b34498774b8f03c032f46591f1e5b8e8900d1bc41b404b1b756afce3c3136dfda82d4cc1a5cd7b319a2b314c33790d4b9ac47c22083743da1428b803910891909bc200536fc5ce2b45df325e0facb0864356634716975bbaa784408a06219900948d87d54e7208ae128e29792e4ea8fd560097330308a7e8ef08225629fd84ca6f0a92e96c2178e5184aba21dcf7669ea49a2722e93145ea34e90816ca4306fbc759641a882854e50d0a4173a06cb1d40bbb4af82e278933a5030d220bbb944100b3824a05507ad6dae71861c8d38cd42d68c62c7ec37be50611861950bf32661865fba32df5c787b951a86f8d775ca81cf594534503a4d36b76e495251a8855801b0d734579b0f8bf4725a16508503bd16f46afbbfd8a31fad25ee017ce43b32651569f5b26d3bd9e4db1354910b8cf51e40040709681115b9a05d8c582ada63aa48b8ad53f186f716852eddd94ca08a40aaceefb10a4515d9930277a5f10a19cadad1eb3e9f5930cbcb2879ce29c67a6e08fffc77968e454646ceac21dfa2704590027552259af8edfbf5c4bba74853c5abea7f7b512872d2c338a0bed9bd85de5a6b982f51d10903e204afdd090ac23e4391db273bfa630750ce748308c5428873b92858a481e771b90ace55c5de1c6ecd36def60e73e43491c9f4c787889a619d90a82298e3b0969a88a03ac0cedc5344acbfae1d3d1b2313084a2da8f87ba1d6f82dc2de50c66cb43c0291c5c8cc0e7ec135534e3e26ed040915622d22c39f7dcc0a26f137b6daf65acb96aa95ff2b50a6c7ffe7f2ab0954ed6e923f1809f872857f44e54c264ed7732d28376d9d4a1a055007fa10fb923b28d259eafc47a89e9756ed4357708067e0f6de7c969dd6200818def3bf5c421dab786992512a3939f467494737d48d0c0d9c79a78b7af3c2252418475ee41573d6fc47c9a1801ec50ca36862b1fe984b313fc083b0d0f9be92476e760416115bbd4bd87da197e1cd83874cda87c0797136c5e0a578e55d7e71d8aab97ffaf2286a834db791270e217c0d9fd5f706db36e8f24d481e821f17ef33dd99797e3674fa560b28a1f38af89d1312020f17f146a36c1d23dad75c23992c613a9124d3e5545cfbd3051b91e55db54b1b40bd43a3f8fd9493dd1e3d5f6e48ed5a29bf429a614671f9bdf410479363bf5e4a7ffeb86d3e013628fcf8baba271c94e1bf6e1f16da3d772b39d75304b746201a950052c08f9e7d04828e86847d186aa1335601ad0204e836bd51adb0345e22508484b6cd3cdc9c0950916e318c33b0e74e7f0de57678c8e712b1c49ba01e7238a15686ecc70963a38636c5631ec7df0b59b85d593f2817ecd8a432bf6cc6caf9a9729d7ec93af35ea781b68ae94b550133c35b7da0c8e0f8f4b0b2ea4eea7dba7d39568f2acbf999916ef77f3d9de4ed73c38969bd3675a10c04c9c8902210671f88711973785f216f81b6be9043ca3144faa6767232edb5f6bfa7963ca3d1c9f3d5d81b28ae4d5cef5e22275433f5b4ad917a7f211bd0cb08b0ca7663a2153329423139edd4443597871300b00019ab45225fcc210cff1104660cf48339124969758af975e8a5e7cda4d37e4603270c6985d5facb53334a215b520a61802926db529552da0df2c0a1d2463628b36857e1e1d94813e212d98c984013b66246fff8bb094a59fe4bab6ae159bdc900ad4268d2cc7465d74fa49cbe73cf8261180d1c5b71f0ed938ae74eeba71cdc19a4a5dc0028ec16553fba0bedba34897f73a25aac2a8b7c79fe2a7e287395812d434c3bdbab6b0a81441d6495ff76dfbb55319af7c93cb4b6e9257b095d2c008844dacb0825f6022fde172b29b9cafb5e2b7e622c789d22eb73eb78461043a173e2b933e28fa50ab224578da1dbd6fba8d219dcb0fc7d15a2c1acefdc32a07dae30f0177b15265ec84bf153da268cc814640642cf9224341849e9cdae095a95328ca43743242924f9c1c61e924c9b38e117ad34c2d78e90c5fef223119947ffae2460a98ffda68add68482ef2a462689a320894dc1ca21505b993ede407aa849cda1d073298c966dcbfd935170382c4d38eb7a72f533645919c6a71a48628a91a831da57ec9c9b76225a00a47dd99ff7b93046e2f6240cddbba497e997091b103c0e144aa447641422b238adde70758c94311ed098c55ea92b407569cb365a8563e40474d7fa959dab10cf06a34392bab28821b43e00614fed85356c3a1aaa55bcf61260f3bb43e93d97394845a885e55a0be27988c2c48ae0737fd175fb38598c3463c62018ea43c5272098b73249ef7c4befe1448e86384c893accd48514f76da6e391d2a91e7cf669eeed8971b22cf808d0e20213299cff0f6f5860071ef14a431ca3c91dcbd96acf168933efaceee2b411c3a05215e3f23725e70a63ca02945f908726579ca97a85d468d75945e883d9106a53dd93265564431b5747abe0e48d0cf96782189dd99e06ae73e4fd26982f595c6ecb4dbf3507304c1a5511a345be9049f10fe5390c22dd52d2aacef0235a87d1c5cd7a8da2825b12d2e9bc54b91b6dd1857f9c7963d8b58f6c18e05c073a3224ca1d117885691f9458d3f292e54dc6fbe542aa982b9746f1788e8e0a318e7b0e24c458a7d2389646df1fa468e8a4f0c275e5949e5535237c57a8ba7699316ceb1d407f199ac0893679398916ef827ee280f3b6e8c027bc8029ae130d35de8f4ea640802cbb44baf51c8c9ad262720902dd02424ff5abf0ae738b83fc0df9eb46d4e17ea60b3b887a273aab899a30a0827ca0f79e0b8bc65829edfe9119cc504a7c2a691d102e74efc41000a039c7ffd13d6267262f82b4c85cd8986f274dee642e56e0009e97e887ca37137e0213be7c5c6d16f771ecd40f15f69e95ecfa5234cfee5a426aae4cacba826f1fd7bff17633cd826251768fb6b06f0dd44f50c599497a60015dee1f1ba9c3c16d5e3b7cdbed23ad6d7bac65004cf4f9613977563f6aca206135003781de7617aa53590432a14a841c10fa17d3b7009dd31b0150058d569b0d735430ca428c4a00e98d7fcda98d9afad85c07966b9d0374b0c38453bbc5c36c331a3337a0bbf23730783a31f860fd166eeec27db2eb80834f5b84625e345207427fc3d84633141c661b4489054fe0969d61408c6162f6f513c8160516b1aea89ed26516407d5605e6ecf9d77044c1da1e63ba72d49aa19b49f1e4844c70e0e212ff9467ea48b4a5d0760521d03af1081b83fb61ff05c664034c70e4a230ef8236b00ae89c80e62a7051c911d088c2abd88ec8033522a68fb87db47dbb1d03ea16cf1c1c9273d99ee14c80ed27da91d1d341b0c78d00e1e36723b956a09d4ee7f2eaf586707aa9b7e44ba615d7763ddc85fb3dea804fda11ffe45b0703aae2efd40b27e5fd01f7096f3dd9575d2325397c3e0e09bfc5308ac41b21ed448b10a32823f2614ec147dd003f97857224a761bfd7c87fc01271dbefd6b8b63831746132883b6c432b878881d462f8c64b907fe23e234ae8611747aac8dbed0dad83849d648f99cd6b6ea21ce5483bfa8c6a4504021b72de308264694001579647cb42e6a66a07277a56b8ee3a4c50e6cd4a65961d14a67a7b84fe0c7313e5fa2c4c43d738380d8ae5e23938b361a3eeb4d770fe657e9a198e0c4a623c17e337d63e9961024365682ca5634ae910e8e0d2d495300ef162c670b78368f3027a87398e2d36f36948c8313008f4e062b85f7bdc560c9a66e1c91ca9de004f7b1cb38ac571f9a81c587204b47bda16e60b7d644c7fee79f66f2eab53edcd93b3bcfeae6db6dbbb63c21704fb048c8723129d2c40539d862e6f37db337df49d1412695eaf3ed515111b2a4aa0fec3dd429d127b449eb60a25a9100f1466ddf30d9c76611a89e3672b56fffc605839890635541cfa5362da2ea532a34eba9b10c9629fa14ef1bc0be4dada92d00906f811ae3028297e1fd156f84fe4f0303bc77217be53897629b1142cd96c9601f57e6725472c0b3716c2110e1b20824cdce5ec02640fe2bedafaad274dad4bf6aa8d662b45ac47cacd2d74ba53d8bfcf92957966010e825a1826df349107d95feec3cff04a335d96639134e7dba1606dde82c2ae0dd9b81d1651c37ff369601587a6c53fd5cc8c38adadfa2ba43c934c129e653658372f6ddb0df3e33544caf26268642839cec97119ea1bf82efad609ffc42b8dd46d474136a7986eae95973f7acc1acb8195a70d0b3596d931c24857839abe40c452e390bcf33e975a4e4255d487f5f173e56bc05db85fb98a7c8069d4bae97a950ad51fa6cdd788a20e4d2afa788191c2303977955ba1939e5c8594670690a369f956d10cd266b1409f0ef1b30592a01fa2a6b777e25149d24de86446102c11584e61e26f9d37b09f735eeaf68607831bbb16075211d896c5d27cdba5f99482edd822f44042ae570fa249e19f50563e056e41cb4f019935c04ce1f478ad260569b721afe497856c61af92923c2edf16028cf65477fce56724b13ffc3d30991e89b29f101831d715e00ef4a304bcfa1a5277a94de16cddf5eae3c5fd9ff562312777e04f4ed4ea5243179fe5f44fa3e64f26df2d1df59d4f73bf14b82f2cde5bb9c5109faf9eef0893137224a2066a6f9aea3358f664f383d1b8b8cf3856f80334d3958283f2d7bd74902b28f1c888b74948448ca1be95efef9a2ad0a18c57fc9759c6fb907c41c89d2672f12fc26b90b376562288e5549e95aa1ca447a245d842f19fcd5197fc771bef00cdb6c4a56854b006f6448cddc84be01382325e85930ceb74c852ffe206421747bc45ec856dee7e67c952a78c255b9e6a0f2bf3248e97935a65cabbeda869884bc533a94c7dfad72406aa24c37c80c23419fee28364b0837c7d2156c3a50b051e2d1d49cef66b9d7152509b126bbc7d7801b27c515311175deaa8384a0ec2e3e715aaaac39ed95d7de7ad128ff1273bee0d7cb3fcee70f3819dbdaa1339b41e995efaeeb5a6a65e7015e6ba1becf7bdff67973b606b5c936b6245d26d0af47fc746b53a9b4fb3b30ee36fe48970febe382db3d734ece3f7d43d0c59299686871cec6cf7e09401317d21087284f384c9d9ce30092db0c5fff2bed078e0343c35b3011fd138de43dd35567822f7a422476a558a381c231bed794f72028b43eafe664ae5394d4db411e5203c5da6a32658a444b4fc0ef4f3c6f661e73f1cb09048b1557c8fe6fd5885c8b7122b8ab494329495597b1e504df7e399e50ab21de2ff8e0f6b6c60d792816273432c029b431e8b17a111a7a3c1e759903671cb8e1ab0d924d294be502495e23b5efc941ca720e1e0bbf2f56352ef8262f0a62f6ed87d4629e4fe09893b676221de295afca56bc3247eef64e262c9377cceafec2ca688dd873c4be3db2abdc246a28c7cba2de78675d7361d76c840a651eecc0a2db9ab4e2244c53ed942c3e2a3ac6910a710b39cddca4ea2e5c52b2bc660c2568a3c7583060b5a38bf4c7f3ea190ba8dbfd33db917b13c1bb45217b54019f53085be7e1de821d500a90c64173c43782a49adf5f5181c80dbb7f41c1f9c9e13468140635d8cad9f0486bd0a10b1ff21bbdae377caa8d3e764b8b2439b38708578e672382de17b17a20b7a7fbae90e62080a143073a48098fe0e26727a84741ecfc5bb473b59c71fdb84f3caf7b6d1ccd13c68f599f8fe40efe26871f641fd3c2ebda29736131809387d833420d65c2360541096242876668f6344351d469ddd307640f6d2f58d48586c90cfc69340d7758d3ce9a0d9f2775e0835a6781b6806871a5ab7151f2190168919d21b95ef3ae8bdfb28251d50d6650cb079bc6e248c427e34a7366e71cf048584a90a9f7d185180076d3325f4f2c30c1be23a48385e12c2b3af8196e47a183e085eb1f02237317a52f875576d062d2f0e9b0603350312819bb6bf690ceb789319728b7c045ceac783437796f38b75bda27b9a3d581a34c3c5d6f41b982b017a991b3147c019656e02af822f1b05843ba721b4ab531ac04c383c3385c0a76160c84901a579db7bf4604a20da31ba8ef88886a123fdcf95048fc3a184234c59a17da25ede799bfaf9fa3b7e6687dcd87048d5e92ff39a229655c0d55aac3bcc07fa3684e2a357854d0e4bb529d7af08128fab5def92e858b01e2dfe27552b3cfd03c25cff80c77490782cb0d657141537ce0da170c5315a42671bad21b472d2c6ecebf0deca0596b2af5111695b398143c4c717b1bebb7ecdffdb65c62a81d5af918cf6f0d58cbd655da5c82effdb54960ff63364658aace409f922f2671e66358953347a58481570d3c0edd9a9e0a52174873424555dc29ddf8b9a5594e1751004d016ca8570be745feb7ec6b0a47cb2cc79e63af02d06865af1ffe14576f562e536f7437cb70010b23ffe718649584d0507b4f63714be9047529e808aafb75de0441980c5035a980530c3e38886fe823c110e0b10f54a8cccbae674f1126abe51666a91d97814a6970a32d39ad5f76d83a3319d1865bd14fa2fae908edff19564b2f6d5632d9de0e7c0cd10471a0196629a5d61e99b09c4664f07a8320faba24164460e1fb4e263a4d2c8cc356f51a08189f95e2589db59ce086e884e30f5dd3e3902ef04d632fc530cc4479f8f166a3b8d6634c17c6684b2b1ee3a6c5b7eea07082fa4c2199d5279de8567161f48145f7de3af54e94f47ebf4c066ad4a57abcac1730896e23cad79aa8b5f8b57e4aca258fe438d6495649024f0e308b376744b5c662a6d1ee95c2bfdfff2197d486988608a2aba9efd1733342e704ec0c42c80ca78f4b6a4572106ead8947bcc8c01735d465d4c4b77ed1974cff9f3e28a04137b0144b52a7efbcd81192855b8c5f3b9ad29f195de871c4926d4a1aea5c176ebb4abc54bcbaf0563bdcc26bba15a58f9adf699d4e5d53c500d6f55aaff687dc70b78e0e3f762e240385cdd1521f13bf5c2d2ebcce37baf8b5118e905d15180be43f3d831c7c91ba7674ead6eaef5a18be999e09bd51f94156683f40afe48e87b1d1a77b02247268374ceef84bd1cbb8313c75d3819655e66fc6f8d522b94a518cf068e4c9f76d72ecd5910c8354f7d71bb194007723d16be13bf81c37961c4f67cfe9b853ca7d350806a6f1c758c47573fac9da52d46d6675e361f698d66588260358a4d918f59edc01488f30e8ac6ed7b5af8951aaa062771fd4dea41deca000c2eade0a404df79f19a2427905b1cde9fc72b0ada361dd9147a168e2fa1aa46304affa74a4e6cb3a68d3b9db3d248189a350a6735677869ca4783bd1ac7663545ce792b1dca963bca87db8578b52405837412154a84929027719f8f84c62a2933f452f0ea85131a970369b24df26211f74cbcf37f263ac32a22e128d80981151c435e4a24bda86b105873e3d8e660a8cc23e1698e8a146a5005f2054e9db911faa763fcbbc0205c86ddd23e47e91a76895bdf3f63192ce712ecf12c6d714cba02ad6b7c3810066ceac7da83c1ca30b34386e61e18797161fc774163e909b6252152b557bf6bc036f319dd7537f88b4358a241754aade0d866bf689c6749151dd9ebef34216107da9ae61a0ddeca5d3eba7ae18e4c9653d14865a645973e5546bb530b430039486bf4b420373355953677a5f0500acc856c816a874d831f3ed858e9c1e7d3e2a00f06b475f363a053e6b846945b6b53e8f0de71eb37a10d49252acf174a529d4298db602619e057e041044331ad64caadc7b737898a93849bcd1ddd96e9f81bc6d207dca8e6f1f187a0437101c8d9175d6ad37057a3fe6a7346500126370d06b8c1ec92aa651ea3b7cd17ec37912f542132d448c3024f53e8d6d47ea321e98914b0a7c394be700125276e155e7256f3c532c0fd5d1a10ac14401137a776be45ab08127d4b805f9c83506636f4bd64732f9875ff0bf5a69e0fd42935c062cbbb816107e9ec3ec6bd5688e4a9b414ce28fb04b31f0be7b5fc48b80d194ed333673a6b9a938a8260dbda2567726e1664fdf581fa5c24a0ac561909f5f2f03d204133b2a38548f56e1d750368dbd4dc1cf3dbe246384de6122e22e2e022202fc7b060ab5494bdd6a67f48383b21941f18d376fb4099998f7139dd6aa271573919b47466c16d0cad8580d00cbfbe55fcbe13a0efef82ecf1bec2592070cd366d9f721db3d9b48315ec9205aa262e35f2868c4e33b21a0f1dd016ca436160d6690116086294f17ac4c9e3f402dc04c940d509be40d54e10893d8e96a77eccd6ffe7a6b268d4a1a22a34d1d939fd67f525cb21b8d4c60a09a22470112fedfcaf8deed7e963597e885c8b099843db0a8bcb386dda43c9f9961da5e68b1582d985830e6bb5fc285a07c92c27c4a4c537983cf5d6e10c1dec23d657b5d612ef17650efa05711ef6c6f124bf152e856edd78b2a0f1f0a43c88f71e1f15f40102d9bde3a49a798fc85eb214e8a0f72cbd3b256d3b5180a832cd500359f97edc354cdb90466611ac6418ecc6e40c4f40df5eb56f5052e000346f7505e3fce4d5d18ee27e30114a96b17d02b1dac569fb06f4cb33b85f8352438b93d9d4116ac376a3d92d93ea66c69c5440945f74a43ee38cbc3a5c2dc35f2632d6ec78ef6479916d47f768b0fdf3715e402be01bb07b85e62bb1d8b466868a89e6a83a8f1bfaa8a2775453530e4122c9f16df2ef24f77b7a986ec2975ddda3678406e06d0ba7c525d6610e773c83d623979fe9cd23b00d67f9ce87f1cf2dabe327792bd225d9b3ee225fe9de7427f6c3651910958ffd13cde55eb05d90af8af11211745872a595e0ad787b6837055ff53b5881ffba8833a332ae57b13721815a47540549e03a9d38b6b89aa6a0071439a390c3414399cc49d0a27e33259696df06ad09fecf329718eae36f58219823d8f816a0764efde7542999aed9ece46319b876ec8219c4bc8a79750b6e87d02623e293a63b038c50656abf90098de7d1667f0569a36a5cb19f7f2baa481ea8f53570bb0d744bf5ec6716f07c0a00ee32d835a428ef30e3071c9b278fc19c4089c1fd1abda374c939dab7ef38083315b8ad9676fc40765a22c727640fb24635b86da0e5b9ee8faeaa1811c5152154195d1808354ad9da2a5ef80348786b0c482c7aa44d81f39781ac2e9e87616504ab229033de9bbd63ae5ae105b9f282ac1e82a3251e03b2955191efed4060db9455710c618f92f4f57f512e5eb8aed02d74d71bcb11c0ec2e9c4e299a8ca72c600954829c32ea7f67f7bd1e1e1f9a9844d9614cd8f5b78da4bc455638707a299050ccdab95ad4d2a91bd9f81288f09225871a358af4ae09ddee54edb7801bd51ee01350924555abd312590b106755314e86b4c6e4daf14fef4d4cc60e7f21827bb45d5612456206a2bc5059010ab52ba3ab568fe9a8e1ff303c4ad6a6ab38de4887af7107b9cd2408d83e154295cf57da5500f0beea88d89854d180389837902504e11ecb1f53270de9d5811ac4224c074463702917194b2c822b8149a4293c1f02c82a688b49a1eb55594927b0d051c06893720d4749e07a417403918c18c2becad3010a9badc01605b18c1e5e37b22c4f508af01ab719701eabc0a7489c5bdd0ad4e9e55a01bdfd295ad85128f288092325df61963020247e7816491842902553f9e4b05668a367639fc7cef98cc6afd0164891bdea9c9c25d386c084dfd13651c7ea16022db893f873e5072e599b55d627f513aa95bd8b1bea372c32893199219199753993a484ef18e8af7930c893b91c5206f254dbd28514a14ff14064365eb1449bfd23165e47cc87593a6a84134292963c87a0bbc8f3e0c12a3ea649bf499b87ec60845c44adea44009bdb273fc21d236ab7e01e0ddc267def96c6474096a8afe1a49f55a2da00a0f30a3fee65047db0d4da64ab1153a01b7c9f7943c0b8e30df564b149b7685a617388d5e2fe1564ab3733c899ab642e91da185d424122d84bf410f2e9e79064e70497869ef50fb9b9d8f463114c403296c93cdcef97415ce4c0a0c5a635d388547f47043c623f3abff46f9c14ab9b5f1c3357198c456d2019a69f448e52f532d8ed2dc474a96522ca1656f0a770f6626abb5384c437ee3857b212b3b88aad59e6b565d8d47b6b79543ad7e0716d3cab2907f512b9069d5c7de3785e068ce7b312d1cdab4765348d658fa6f539a5d8a7306517c8d37113868461bdad4b1f32a7919ad25eec686b1f8f84cea836856a94a07456a51ab56fc96a91be026c15dc5d9c07521a50582f99244e8750f9b6d575e83373dfc4e2605ab5812c920b9a643133ebb282cea0334f71e5437d98da1eddc0f50f36ee7cc78966c6aed662be312c8b1ea311f8ecbd349051c66e0229b54b499a77402f6a3a3f4149e629eb977c58ef0c0ff87f14c8a904ba219f297141efddad5617102021c61a5053ebae4d9c9e40123ca730744ca68a357114b0661da17092f2491aae12c8b9c8aa72d3327723554fa5f75c7a5be608e7a5674ff534e9e82607355abfed7b234eda1a6d6ab9ad3c35814553acb070dc85d0ceb806dcb0f69f71ceb8ce3878d708cc6b848e8319275b90b83a1a72790c117f7ccca65503c5ca178121a89eb47cbf575a7b7388b6143e8d551cf57c085590ad40f9ef56f84945457140875b882166d4a9d22e92a5779fc880595cdb47265f5ed1241bed76eeda69e00eb5d61b272bf792ca393bf73cf5b3a51646851fd5af9f3937981de9abfc75a7aee959e9e2eaebabb5dcd0316e0a7b13ec0a24e67e94cac4375acfccc01cc7496e80738c5d8f5fdc40381d05b8bda1e770541f9630ba1907cce783756c9803efd43f977c8903f59cddec74cd972bea9de860aa5c18db6e4b47e591b265d91ec7d476950bb3fdfd64c8022746c7366a060b451c0b502c9a9e3df5d74035bccfc9d16058f2ef1ec2f5c15c3f966850826cd7aef05814aa51a7918285702938a996dd0c643647b384d4f9bbfb85f70209d4bc1cb9a7b4100c31d220203b88d597acc1d6060e7b986c1b111f9d22a211640b5b8c0e4bb40482e09242ad3c80d6435d2445decffc44d03d8053028147f33ceab88dcab9b78592cf697893df46af231629a8c8b6436090e95ef88b66167b75c7b6fe7ee52edfe56fe2c97e78aaf11c57d9dde7d9c52627399313d27427df2885488164dbbd231b56761df171e81648c14f158de379333e83f9b7e1501e67ae5bdc9330f4d46fe320cb49d2b055d2a18ebbc4dcb008b9e41f1a72d54027cba7687e4419b658e4049b5726eb240e060cf599b58bc06966d5941c8ba904ff337ae8fbfe85fa838065b99e0a049a0b38d3bc5086095ee0d5a298d364eeddb1cd93fc380ae6764d2e8503201393b6284ad90ab557367dae61bd08b604d2bcf81979fd4a643b68764d4c387022799fc7be21083eedc7134f643312578f9fb2d2e6fb1598eca608ff3cf9a49ffd41ed1e525077a9b4f889692d4310515a4cf2c3b2379fd533fb12cd74ed248703ebd74bd544da6b8bfb83f97f39236b916760f5df44423479df36bc6c53c5d4f03c054ac0a85d9076444e85026ef7c4888c483b2c46c010350563f5381bc58b5af76f2698b0f52702a805f1a3cb9a7c5e423186f93532c686d54d9f39c0122c357dc5b01cf2b88b2eb8bc7e18576a30d46308c46075267bf043ad3aa4606f8ecdb15f860c69d4133c03e42c1775ee5ce4c748640e859a20502e97df08009733f5f1e93a8a8a959bacf20cd4b46ce47768cfb268248e00873d8e7e0ec1380948c087419910717c2a385fbe93b5e206d8106729c2b7e6e74896a472c953f9a2f80c82f2f285d1725c272ea735aa949244fc9f7005d2a43d23faac8e788dbe840436f21df1a5c0e11e16159ffeeeb6ecd8850d21ea0187c41cf27aec5783b2c379a04cb65a6c209337ecfcc5433d6df6ee600156b2043b2536eaf00aceb28ccd3a6b86ac0f73e8c9f407950221f1f77768339590766c967c617fc651e0ba92e2dd006d0818e1cd3df05a29d5cb5a5e5da07c69a3617f4bd035874718f4e7b437e20ed2904258405d2d3b1addd8f0c3e92507970281cff5b1618db7ad3a6405a868fa739c2969ea9864d8f1081d203b6628d50f6ceb2c26422fd5920974cb92dc8153227eb4e482bf12802fc626fba616b9cb30cf3f087ebec37f8033ab4bce2cd1e0c5e5886cbdf6fbff038784f9179ac2800608f0175a8ff5745361ba60d3835273e0d1eee2d1437e2f7f8fff57be2baf823d78bf19be36b1a485b84031c8075097e19a71e8ae80882dd92b507b67152011f2d3c737bda76db5d1d316f01efaf9e0ed0fa11738f5e8808e08adeca6ef235aad17838e0bd7cbf4b15c53ec793286025f6fff9fe46ec95637e1e095e5dbb8f8a115ca14baa15e373c5816d386c00acc88dd1a3e472e4692b1960d082ad5e8a062a953ae6d220529e4ca67f17df9bc69cc2903db8e41ee9d7ae41d63d56bc0dfe076790456f18bb160b7fce44df852d73d6067791eae69d6e9b06c0d8739433d988f0fc769f31e2c298b9ad0db0dfc0aff0a22f6b3c008d09c906b081c7131a886c5941c2d9e79c7db5303ec6e504c7b7e3cf24d28bfec4aa12247af47f3d5171d5d9dac0fec0387de709201f235138832da48a3432ed961ea72a140420a48a820c8676a9449b62e2cad85f63f64e779ae341898cb722d6b5242a1cbc49b43c43022c895d864a772881ac87423db7a94fff7df2d763957156e1b0dc2431f6545b9603ae4ab2838e0a5d7e42780ed6121e4548ff02959e8ac6581eb102060fc1bf5738c7321d4e5477cc73ca51388e1603e00fd6580b4064561c004a4796ce7c0f0d561e416a1a48ba26a5542456b4f46a38490c4cc5dc4f826fef82c8eeab2aee892b78dc7de1363c86b019d5d4817f067eb7a8722575ded07e5397b727081a1c00e90388dc9ba09c21fd16b23ff72a1fdaddb012e174579ea4290d4709511fe0572de5df6f1beba6054d3e8dddd03342e817ca82384b9c487db5ca88a4e1b73fdf500dcde5d47a419419212a025ed51b6e64cb18310994d6c36a95b7b8e1cdcfa4a27d917ac8f10247e40a03f56497894bc86cb3345863c7ff0dacc3f602c0275e46e4c58d126a59e171544622cdf587776645ce89df8007a086d9f1b786b7c50040e4bceab847c2d9fac05bea40a6848f6ffebee3fd053e30aa6803d0e9136b22639d1bca08785ae8fda927a81959ea3b13c84b7081afe73e1215c97bfee0458580d59453c853ccdab3447149d260a9f93f960aca9e5949f7a2ca6f7aeec4c8769a2f4738d79c632bcc2ea737ef4482cffd457f0658d4ca8874a7140ff6e76d9dc05616ca4ce82bd05b7402c3e18103f7e21b1db179a121a823043777d7ac698a8fda28be778df475629d4e64572b4ca5061656040ba3ba79cc3299c14aabe35baa2b457232c12d150a4e9e0d3b7a4fefea3e3815fe300a090e6c6be04e8fa511f7d9a65112d3a48e35fb97a03077500ca39f10dc249dfaa7ce67edd05501135aaf30cd2935eb06de6f204149e60d41099dc619a236b7d20634209c318138f3216a69a1c9770e4c3bc0999b33f23c2be1ac6cc98e1f48b4da194ca9106f257c8449dcbbdc525b7023261ba145fc4e616b1f0094559b7942176c7824f3969be8c09eba3fe4310ff76dd5ef39b018990db75217b3ed7577815e1b96ec5c271f1bb8d6ff53d859ea0c980335217e24324d4ac1fd5581b6483f199990c6dff014f0a6c7b46ffd0fdc1d035ab33d595930dad53607e5c8dc585e72aa45b8863fd60f0e78af06e43efed81b58131b6b27d4b4fbc55899a3031d56ec65d89c91a1060a27c1604690d718705a8e83f9457e7f9e6c1d0803e0fe7bf2e049fe9f8fd2464b9b249152ca94646205860574053e45755a29469c4cbd47d662f9567a29a59ebd3806eb9ab8f7d251278aab64431b924e4c8200b14aac6889946559966559965f7ef9e5975f3ecd975f7ef9e5975fbe17923165d08636b440acf811c9164869436bc3907c7d98ef67aa4aaee4743a9d4e65792a4fe5a93c95211b96655896362c4b1af35f9665f9e597effd7f59e2adafa0c39e96b021b640ca29eee28fe1644bb2a17b5d156c68c37074981a86a10d6d68c397ab34030c2349154e766fce7064dba8497cfed7a84d4eca904206bb94fdc514a394d20bf3b277af4ab9d9a3fb18dbae05c7fcf0eb303fdcd590922dfe8b81b2cf2ac8bf0b5444d3ba4e52fb730139ae6c67cf9bab0a5384385d40eb77398b4c8395bc3ce62ddc2bf71572104eee63c67ac4324692363732aca6871e3ae9c4c483003129119d084729c7711cb771383f080cfcd1673961ba143e7fd6e74a702cda86ff681adc4731c5077a0ffc89b6d1393c98a61a8073f5351318cd976841b37eb40d9f4247ac29dfe3f09e3db9f3e03931beb66aa7b40d1ad2144c01838ebc851df3cefd4ee5b40d6fa552ad9c0b7b8bd56a1b1ca6651bf66d4a350d7fae33a59c06d399985eb7ba065ef87c4c42071eb23c4aa93dd8ac1437e23ab57d380ab930f470348249c3075238bda0280f3dec74b84dcbb0e63167f4f0416524b9234a29a594524a299d18e7fcf9fc87a80ae35528346766df20d8a30898a04b8f7895af4d05640a2a910f2158562511f742784c2d51e76f673b140d8ad22d681628ea0485eae137fcf862b22ccb2e1a97c025a2a64b494b391d3a0c8d6a5d0b0fdadfd741cb287d8c7eefc0ec077af8eb073ebdd8fe3862c6d829a0e60a35572857425128cce650da36f8b9cea6c53eadb97ef02b07ca3f1c4551144551144551144551d4bda19110c2d0462770220bd4a3380c3a800043eebf66cb081530c678bb19085317f1da22d9f5393add17395618c3b21a343964e4755dd73499ae1d95da1db9acd4e693bfbd817df695ce15ad533401840483115a26922a884832917600294b20330048e43967dc073d938934994c26934966fb81c1efee340a72fab6ab967620d6e1f9f953dad54c8d408de3691545892a0999836a728de3d829cf7d918c580a96923d675b1ea198353899550c804963219988ef68d2c4a2f965d883e1513c67005a64fa9d8f233e4670a6625471f538f2e0466c15c2e73bda862b691ade4614610a57620425aa2528811c57230e57e24a708cd738625ca372857d52366181a1cab1a9944629f574321319ec548c4aff1472a5c9b142ad344dd33c1d4f87b1bdae9661d85e375585154d581bb76d1cdeb86de3f0c66d1b87b7546adb36ef25b4790c1bd0cb5ace89dc14881e33f84fc76b0ba2584a3d218212726a624a8245b1568cf1171983583948a886babc94fcda637d755d0dc5ba0ed234b80e420a1264073a08d28320a828c49448ae3872ce5967d5461a83c5b410af61ced42fb848824344c6a1f8ca552a8ce17f956a6555f831ecf157ac93a12efecd64013e84593d0a93cf875059b6e322759d7380ab542a95b52fab8d8806843585aa6e0200838cdd8729ba6e7713864c43eee59c73d79b5a2f16dcebe14904217e3deddbddb79b826677d3a7d76317c83eb6f4de7befe6850c7eea67738cfd3f14b04891bd2f640a81ac83c5f5ae8b8b32e79cd66698bd40c8321b17727d50a60273e5f3b7995d4c61b6ecf0813cec1235c3de5a6b6d6685ec9915727337441081ee8af495d1227fdb9b9a1f993e58e307ac0f9c2b1afcf3214992bcf7254496aebeae797154a4722453cdf615b95ab739b8901ebc5f6b9cf93db6eceb532f5d7fbb52069adb83738b1c201ea20e39508b38ec8b21438e5c6ee370d4dc9426ea9b3d67164eaaf03172a2078d691199fbcbe15199938cfa9426fea02e8c658a1013dc6863e17ae374fc9024cbb4d30fee614964ee734b877bfe3fb8e7bf83a344d091e70fc2f3f9c10683e32ce0f9dcd22a2a313a1ff957de07d7e5ce07d739c863f437b017f58ac6ac742ddac7985ad72201ee57de022a1fa30bc2a3d279ae9ba20e688a3ca029ea96c3b4683fc4a7817f611886611a913a52977aea247d726fac25ed63b8df3aedb5ecbb3522d5544b602d655ced50cb6853ac9a6a69eb8a700fd6d2a804aa715243b4711c4712d7d295611a892d79d552b6d512564b9ab6615ab66d9bb665dbb665188661d80f2e9381190c06ff055367b2a9c5bc625ad1812ec568b46dde8bbbd490c18126071ca81986d4596bd79e329ece26e3b99bcdba2b32fdb985429a0efed3fbb7d66b1c845a6bad1d155e593aacdd42097b10dc6a6152eb6412932426afebbaae2773c64a53355902164d7247c3224f56aba80da60daec89ce93cd7f512260d876927d3f3f7c6a2499324258720ddbb45b65ae410414c1b4d360de736ad5bd98f16d96a915ce7d2c1c241692b8c1285c17a7466bcd036b6566bed5cabd4225b64a9d52a795a2d4f89eb783cad96c78343c7699082b5d68a22c639ff6b1fcd8de7a8a190e7e5bef7da720b916ba9c1307cc21fc6e00cb75dc015007cce8217e459679d2dfdf88710cdcf067bfc36d8e3164c9ba29aadc51275c1c0206a218af7be84481d23cc39efbc5bb4966d91e99555f22c45d0319e0c2928c20b9fff006cd04ff17ded9b86c5b6cec7111f5b37b51d884ba6a0b4b71c8ef97518688b4ceb4f6e87ecc33bf4e31bb82ba239e77d5eeeb82ead7c42a7d3e9e42cc34a0c337c5e064b0c510534452b20950c6a510cdd8f23d8b3fc87a5e333c8685106b98805f42023842812e3697c72376a10f9597e05d4b2a2f247f011ed8710cd009aa24f86719b8e180ed01a484706c845193445db16e33d5088ca5017acab9d9597e163f818cf926198eb1ccc029a2dd218191eb33c986374169dc7d1438dcd8d0f397ed001844aee782787ec743a9dd99d4ea7d3c99f19c3097905bf4a1325a81edab74c974c6d24c98925460c31805838cee3a1c901877b3dd4d8b877d33fe800c2bdc65ea094524a29a594d29e349c93e5edd7183f6bf8a60058e0a35a648a669195b7b1a295ce8710a2958f010ab1688a3416509f20758396c89770210c51a4f9114c9c208a348a8223986089b47a04a9092d91664f80d30529d2ee14486a8012691793205c4125d230145054220d2b021454a148cb84ec201469dac602ea2751842b91b66d2ca036c2881ba4441ab7b180ba0826544889b44eee84c0f3d5074d26478c1889b4012cc94f54bee24c1bfea4690871184c9c3397e7b36a25cb790b3b4f2912d3e355b5c49c73deaeb6e68c2fe68c279f4a075622a52ac4fd49dba8389346eec0ca8433e173fb2bee7d6c2892413b6ab9401a4259d1987ca3380c062fcb8e62bc2562ce99edc5061a3a7634b16ca29e8ec807da519de29eab3a1d8b4bf2d90e94d9280d69d8aa3046476d10af87e1741ad2b08661188634b4f6e596d955be18eff5ec23ce0ec018a6d9bdb53692318f5266cccffe721ce013350b8f34d4c54e549da84a1b06398274a152428ebb5add253587aa0b25b0c6d5683bc085942f56f77a09d5f03c29c158ad30cef93fc7531ca190e7652e2efe8f13f185141c0018e48f98c15ead1ca673accd716f6e3169f48a0aab1386e9c8844194e3c175e05f57dd884bbe21efb460ce894321defa8155b9bac77814dfb0cd5952664c06006cafac7316f690738693e9e2bff2e273af24968f72fe7c7c544953e54bc8988b9e9488d9b91467b9776d6dc14d0dc3bf303d475123a68bbf14244aa22a70161593b88f95847125a9703e82290916c5b6d65a6e7bae7beae2e07f18ee66c2b611ad1e6dc3a604d75eab65afaa3db40e773219c6183f6e1b3a7a4c7c84c76ed6a6a6ea7a11258aa2288aa11a353659d45ae76ceca2fa824c5f730fab9cd18b0cce32026ee4ebef20d41b5399c1df8ee3388ee3bda1910bafebbae6e4ba0f253f9e4fae992e2e8009865c43155ef3e347f6d8ffd87ad42175116f6ac81a92478fa68bff689251c85f230ab98507017cfdb4fb40ff7f5dcb0eff5d8fb300041924d1852d82a08552047687795c2928a145175f37a7838c530627596373e303d7d1e2aa21a37531e7acb356ecf3c7d35a7b85464411a191a99a53b5aa610d925347505a1508ebaa54dddd1da2636fdb5328582ba20926910f219a481729d191d9796780e763541ea4513e5a2ad1122d8d4a9a66b79e344e04db69d756b56dabda76752ad59c69fab967ebfcf643883815ee8710691d100da94b8b4dfecee78e862d990a25659fb3ced3d11235512a326847d9db133dd9d169644fa3d3a87b85655bd6cd3963b37fb9fb58afb88d82f4823aaaac7553d5c861ee4a4557aa95ea5af14156a9ee6d194f5cd7cde5836a03d7755d97733756e4f999f63df86fa0ff5cef85643006d1e4e01e8e1e40a522c66661f39bd5d92ecf59af8b5bde139ff4095bdec4a1987ecac950fc496a625fd2232715e0d3beb62dd01b8dba4755f491f8d51a02716f840251263455494dc345da8d843811235ae7237519cd1944883ef2d168f4987a4569d6a2c874a6711e001dd3316811fc64568b22bb1645ee0ffc7c9f6cfbcc19ef743a38e2e7b3849a2a52f173823cb96e063d3a4b02eb01d7389c0e2bc8af850cce164e0cdac59190728044132d22c960e8a3223645418aa2288a62ad9d1f4c1ba0c8f33b5a9669dfb1d66e3ee6143e602214f9b85e080f293a72fb7998f6825a76b83f5da5bad7407ee0c7ba2258868b4075f48218d4757e1d9b0ef795abe97c77b8ac6e71f30495fdd168341addfb121a6952e8a9892909a694528a67eba3df4adc05479c2871a2c497cf3452d20ca5826b65328daa9c24a4911494131393c9f484c94d3e254ac95af156cbd432511c984c485a2d8bb24b9a4c319551587346e5e20a5df8dc3e685354455d4ca696a9656ab54c36c8df72fdfcaed4d5c42f158d59b99e78a916148fe9b28a19e3a4542a954a792e219fd4674fd4c55b4e52d99469cea04adc85e2c0549a4a53d932b5544b98584c399b4ca4c96432994cd70a0c20b40199265babaad86d0cc3b02539866f080df15f7f6d13a9a1e44dc6f2f939038446413748327d709236ee79dfc74fe96dadc66168cc0f3537b4cb51ae7a24ee28cbb2eceeeed6b29a39a736b5d63410f7f5c7075bde344dd3b4a7716d730fc7d542d74a69571965c6d7b5d61e31abfdda3d8d5f208caf8b3a6a9cac3975ec1089f0002214d262e9506121d77b6f8dc145fe0ffcd0f4efc075bf7ecdbd5173df723740e045188d829e73ceee401503584b336248dc7b2fbeeebdf7d2eb567bafb5b8de8de534978c4c4a46ec88030799d2c8ac7d77c39165a426c284c9e19ef5c04c5d92df3bfa7e942cfe74b807f381e9f9f370ef0324989e5b92ed20006814a0a8708232423a31b15fe9052253831ee10371f83a1a2c0f6f71407f1ef26bd9c1437efd1ef2ebaebf1607f4d7b2c34f2490beeeecf7a41225914824128944ba3744ea187177afdd3d8634a626c9c964c4f675f12b810411a2dd6ab28cb465abbf6f4eeedf98e47104e2030022b93ef83a34c78300be3a031872f6f87176cf823a3e903e109faf3e8d8fa036b9974b2cd94734943503b5d4faf9d86cdf22feb40de4b5d85246c6fbe914db2abb2bc5ad467bb04b353fb00efbabcbba161bfc6204feebd1bd5a06711797d265d865d865d865d865f8a2a2827d9354f6aac3322ccbb22c4b6b5fca184ca04e27146b0a9395125594d493d309632ce5ca329f33442efc099281c4b4f8449c928373c8669c7d76b91b7d5a32636a6af83e594c27a793a8042b419d5a6082214af04dd2de93b34e18630cabb141dd40ca1778d049e183dab60ddbb0ee31fe1504e6fe911a615b66b047d5da17952f68d6da69a7c51d1b5bd3384204492484d664145d3f2f900f7e4377b70f5b6be0e694c1900acc21b7f75e5c20bd7365ec7018eb27db699526398d27c8f56ac2ca8a528a1208655fc103d58884095648018491342a41c2c1109c71f45e42b4c385765d2fb9862d642b10d7556bbd735a4f167d5517c624d684d32a8a1255123207d5e48ea3aa474a2bbd51a96846158db9c944594959b8062bf2a42e2fc83a8fba786800a50cf6489be8aa010e64e0a655f6e80a3d5aad3b8ee3385e17e785cbc0b6dee762528fc6e76f593e9a61b08690b135c3bec4f45cc084a906a37164afeb3611482881d3a3ab464db9412142134f89d290bbd3a0b134e744067b341aed20f7e0e19edf7882f60ba533d4d3c57638c820a6251d6cdbb6b57a6cdbb66d1dcffbcf4a6470b63e70b2b2fd56aba58282eadce4a03a76c86053065b01711c4d0e387aa8b1b9f121c70f9ece6a73ec8566ad9d765ed8cf8bf1cda670041654221f42d0a0c24a1465ef43081a56c84288487b2166167250240aa2ad6fb801c4e1f3cfe14f83835540a72b420efd10419d3316490f69daadea97698c942fb81ba150180a3b0c851348c04d08019309d38a9950088970088e1234eebd84b073a75a6f46a50b46f7de1fe4fc00ca144d9053349102711f3781918c93e8fa16283214597c6837eeeea57a363e3428a24b850fc0f8c0a9f201111d50aedbc950971c2e0d122a3e70b27a3055d5da9266e4de712ccb1d9f4ff9293f234ea271eebdf7ca9052d3552c91b14506272902df8164361473890c2394423bc4aa6d35ddddf1a9187bf083e149624badb5f45a0ce49f18a3753cdcc5ffab3b505fcdb99da3c0052600030d683b546050426b5c8d754790107c11da71af2b546305061a8b00df9c12c5dd2f56b7680c0de70c28c6d7a45a0330258bd9635bafebba2e989c6f5c1de8e3bb78f8879f86ee91420a84843b0a7d5c3a4ce91e48451cdbcf4e87fbad0b627b6e7bae1b421404f79d0c743e3f7d95ce67117e5af2803a201ca2f6da6f8f3d2b88edb5b7400bee2ca0fdd65151744ca7d0162d411a8496301948e4e11fedeffa9a6538e6873b1ede3474984ab32830bfe811cd4a352bc5eae80f2125d13d275e16de161e0ed6c562b1582c16c65e8e62db5a6a69cb58eb323273a63ffc7692572783657e166152978f0a191742768cfd6554f6de1a342a5582d184c5643585848275a94bd376bd2297ba346738b144c74fcba7a2fd8794431f7dca074d29b207f1cdaec8a539d3ff83bbb80fee6203039386ff8c06e60c77ee060ff7ae07bb74030cec9b9c0e334aa67d373bae86325513bb8175ad2a92c12ea14aa55229c707f740aa9b39c33327d5cea6811f43a1b2ac860c0e3452604c92d9c74c4336b96d5c6419b68d66ce601f27e348c6e29250f03fee36f206c69d4291ddc6fd9cdd3daebfd129cd094992645ed180a13a94a8c5c0d62776d0597d630c04cfd71d0e3232d78533a4858316929648e2e93c264a85802924896173860c0ea4e6311821b5bb975d204e51d92d2832385b94bed8da897da23f421f6d3320cd39ebac5a5649b4da11574b29a55893b06fd29ce990c6ef0fac94c126913e0f88b130580eb30a50c06c8a0893c6942839547cce240559cbb08d524924128944b2f6a563857befbc531445ea7934a48d628be258924183eca1b73c9bf8b1ff74596eac2124113853b7033ff5ebae676022b78c26641f0d046708a70cb7484b5ad2520cdd7075a077832dcb39430cb2add124947a61e2a16c5032039939ef17e2de776df45b88d77879b1c1061a3eb16c510740684d42b69f13294d454585eb171d667ef4c39cc8ff953cc0f96cb0fff8b3b7d1402dfdddca402dddd574495dfc4b20ccdba1bbea5e0b71af4527f93ff1092a7ca08fa6286f5996652903671cc7d32a8a1255123207d5641ce99c18ff77163295a9e99691e971cefcf56559d6cf910cf6785d374a669fcaa8840e7a64c968040008405000831500001800068442a16040302094cdc37a14000d577a3e805e401c48644916c46008a2903186190288018000019299425500c62fcfd202af25a3cede476926b63f2a54c0fc9206d818fc040159cf0a4f6aefc8f07baa91e60ed749d43d2b2075d1742bcd3bb80fa7945c6b03d62f00a582e2d7e383ff660afdfb19659cc6015385c8a50af437bcd7837524f7e494b6b04eac50e64b6d2bfa44c81c8133c6b6b6e73ced05c1a6c24ed55d67c4e793a6a61b9a093193f59769678b8a9688a82c81b1de893b294755e589a146de29e630e9526c64172833fec060d2124d7fa25cf39990a45895a744f0967917d7c338afacc4d92b9f99e2f1427963fb6d07bbcace34e5bdacc0d7fa2d28aa0865e6ecdeb93f5f49cd395c52ea42f19c6a8e88b23f8427b54f294d5953230599815eff254d31dc54b89aec8180f0f077c75465fd946cec4cf1462a94c23935156412b78c13bc3b0c5dceab9ada90ac8ab60db5aefa194ea07c7797fe8537843952fd2c2fcfa626275d37e31da9e4ccf61327d44dabe18340429de298001def786b431a7ce3484191777928e9314ced8158c3ea8e836b83a3ac51886c4e8d470523b04b12c0e8dc2eeecde12a9cc60f7b6ebff74d1b80f0527e7c2677df060728f3455f7a41ec225d68c8fd8579603fa9d283b0b1c37a7e5568a19c1b3586e2830b848d02e99c4dddaca53fc844f1a25075c611859fc4e19206d7511e6e3c024201e88d02ca61076ff5210056b04017c2c22a71ee401e494bd4f7f985fefd0eaa0e459f1b64a5c723c562ea632c58793adabfded5ef5542a57da5716045e64bec5801589356b54dd105eae52abd44ac0d454f65a70cfcdc7553f8844295d833232334965459bcb2bb59dc359b221cc1e6541b33ba8bdd2994ec0e1b34f1aef368c5baf83d472599f6467bc44adc24ae290a6d0b8a8ac76bf3d42a0fc9f668b18bc958f481124b044e07f00618073b1925e58c15c162a9b830bd28f0e61c41b2629abac63472c652f087b0676e3b2d85f830ffd62ac5e22d87846f368b9a357c2249ce95e10fb9080af3a98176a217ff4d3d00a6e4bbc6cb81877c78e0356ccfb560260c3eac23fa2d9664fd88a11e08fdedd7cb6ec92ccd8b522a1d41008cc3c232bb64545679de519890597285d53b2671ffdbcb0dea41897c74d49caf1341b38640217cdb816821984cd168191389176c94cfeb9e17e068949687149e541f57a3f69ca67466f159c142a3af050b1549b8978345f8029501125fd07cc395a18741557f54496a191439f69def98e4ebd420bd64219404b58f3c91af362336cffa5c9eb0e42640bec22829b772c9eede40fd4903d2869df7778f7ecedd5774f4b100e746776a2fdde95ca10a3feb74a75ed01bccbd4516c332926999679fa8951155178a92b9c692a0ff1e3bb012689f538ffd11e70539114f90a13b0da116f6e3c87c8860ea453c91c4518a98921d5c6162d4972b74900ae45fcd8753cc61c5370c9d9e11ded5ad755fe3d0732817759f78221afb637ec7c57e3993e30fd67becbf4ae2db726811d0ddede8ec02734a435f2b192e4c8217c0ec681c956644890b25453d4b6bb720b1302676c43213334d24ad2b627409b327d1bec1ee3f06fcf0cf2811089ca9eb4326473277dc27d2523161c5617e954bca0df6c2a9654d1c3c4ac6719087917a382dc680231256c87b822c5a9e22c8c20d0035e542af3649632d6a533983ce8842a5e13b6482689a6641792c004890c1f19842737664dcdc43b4dc79fe6452dad542b3c48a7ddbf4fd26ec1b3b4be258c89f982de888620b28d7aefb09c469da0dda58e9282b58092d48f7e06fb59753701b436c87777b513159b43ce6aa785751a5b7a13fda5703f485c159a418ef0c1cb98b569e23eb32ad5bd151c5a4f75409c3e966de62d24c66c405825a5caf780d4868827bbb2efe6ef83e3543fada09ee8acd91b92a9b0a426799ed9a2b40bab7a9abc3c5db38cf3fe312c2424237a6ed5cd106d07b71e64f297a4626c30f4afbe78e2325258c0087b639dc9683ef76edc4dde00a1a83b73fcea0e18651830b82d60940785535eb302f5506faa736f3df332b86579a9a462e8880934aefc18270b8aa317628cbd245e60eadf848b366b064eceb7d199d023bf3f16100a7b4247af47512ca48b29a84359047501d7014628363ab2d0c0942d7f851b8cfc5375d3a63dad817a3b8aea4733952284530a9b16fab7827aa40cb3a437d74f5925b64dc5c9ea6ebba9a5c47bc79474b1cbaac42e3d8e96c8eac84225f706d16e113eed66a1b265f84ee753c6521a063f4b09ca749bb03cf7caa3a76c7f69e8b1f1fcfb99dcedbb67f5d3ad68d2390b39759ea25be59ba325308a46b3023a49c08630957c34f3ae33cb446b0b5c9b5e9526978bf55862dcc9afef56b072f2ead393efa23f8971793aca9c6213419acf51fad0cb2b6c17993ac0a27d94827d9e38e3a8725b527595ca7014cc4496c734fe964eddba4eec1b5bc25595712997d68405793ecb08b2cbaaf88c396dc02201d1baad3daa4ceaf59775714fa3cbd06802c95878d0f3431633bf964fe213e9cf56e1cbea79aff2313b56781c3b8dbf7e13aaa0849bfba71b82643208a9f129918a03d868e86987b589aa90fcfec0b7c3c4e4bb58691cb1b64593e2d5d923d4ad3175c5cc0f5173beb928e59f8bb6840abb9f8eafc30ed483b8fdd9d245afff0c2ae7cefa90b6d35de87e1e1ee29d862cd3885499143fb27d970e85722c5c52cbb3ebf78ad6d0e58a9cc5f238cb86d06ddc69ee718b9286c15cb7108c70aba2b3e70a0a23568e62a0943c745060c106e314443933b9a5e18adcfb1ad909891b11eb136071dc8c5507267982866d613a0ad7388ab6c2bc329d5ed826cfc012a76f19c9a3988218e8294067e7c5dbed236ceeb30619a490a95906d44546fb7fd59222729df91a7a510eebbdd71ac0972b124012f970c39b4159582f8f0850e028d6fb234f1244a00d7d4bc171e21ce81ca925d2e2afbd23d4a56eb6a5023d7193fb1546da43da033abc5fb0f2f2bc3f54290fa6d20c8bf6047381407fad8c58c7a92af6d5b0514ae1e97e74670e750a1d0d976830681fcc6e292f87305515ba69d0a87b0f01dd8436d5a65b0d7dddd1c1a4353ac00f33e38446398d9f5744f1deaeeb4e2e164462740eb0d351137a8b3e5d63c9362a538e21928fed3076071d05c96d070ceac4705076eed0a1f266c64a22826c8cd4769cee50b3a53303fc4a5bbd4e210c0d2645487d0fcbd224d63d8a5eb6be5ea590c1893c18a1f5a3c2c68d287343f743bd6d904ea00c0804893ecf34395237e5372b59889ba0c9d1fa2e302d13c2e94a021aa63df3faa3e80bf1eba8f27120e25845ae8358c62998a84a232c5b43d11a4f275bf5aea2ec8c1bab9842ea2614ec2ee030530a52ba9101eab409698f939c7e1206d1aa3199288e860906bf12451fb6a486c9a6c6bbf9bd75fc25246bb6136bbcf4719ebd4212226e7b97ec531c84c31f66904e631171ed4d55c2d0380c682eb5f7b8a837f3b0ccc8dca8ee36381b7f5cc9267ddc4051203afcde2315f9d4f4612538025cee70a924a19ca6620035decde70fbf2ccede068b1ddb27b9edb09e66d03ed5aece4938ac49a8edee848260b224bfd6e7962d97ee60f805d230c8d1dd279911c49c01ba0f7a87b04075784ed76de05730e121c45a9043a483b9a235152f0964b3a2878527cb45ebce69eac7dbb2ad2021d8d3e9178189e9f73a0b671b28a2384421a7aaad69ed778b30e8e077e63a7173e756f25240fbe40ad1e69156ef56843d75efa0742a11efea63ae4d076295fbe6fa481a0417f63b7b1e5eed1b5628f40e3c78686b2a31587c1be4a591bfa28626150f583d0bde714e8ab8c753552a4f6ab55f77010a542cba9d000980deb78a603befa003f74ba29b677d53a72da7eff92310c0428693d5ee7fbe99b32f5d4b6fe01c78a5563afef4336d82e1e2214e2db9389226a958270abe5b7264cf60315f5925058e87bef5637502b2313265f7a7d268c1bb5ada9008fd6c01da67c69980ee4761022d52020a4e2eea3a905fc41783f12068291f85803b834847ab62adc49313ed6f52c87ae37eb8f5204fdb9699cbcd6887dba04511866690ac16199ab8cc8c7b0827dd10608367e664cd177b3758d2d1d3a2bb8e7ae8e62175da57d71b007a244438b459b49ebd2aa139882d373b52acb6852b1bf4fe480a6e351d3a6847ecc255e889ab30701322702ac1f31cbfaa16fdf60526665a88cd1ba9414600720906d97969b2ec9cc8dbea16bb005cdd17ffaa4b2eca181e279fabd82e3734013b7c862760ce382162675d95269bc90612924f1fab6e883ac02697a89a58d4e89f567a4373ebd3bd0bbd279d5d20bde63ff24dc10cb2fe235f7a5c3735f09c3529571ca80b6c9dd9b078fa726bf31555992765c38c5c6480a32da180196656575e9bc1044b9758bce811411fcf7d2f79b2632ba4bb46e4f9c1a949e19f07684770459bc3546a743fc4daed6874e254238b7ec78120514ad4e40858343c960ac18ba84ba168b793da5daa2748615689ed5e1f8d6b3a669b61bb2c0755e472892b60e97f16e0e08557544c43e12ebeff854cdf4a867343e8c32c570b8549879b5f3e323d5efce881b44d5298a23f8d1ad7e026c2df0c58fdbad2a1d1f57286163fd8faf0414fbd9f38be581b686316684b50c2a5fa6a54e2b41462f21a7d503f3aac04aac67c142060662c32aa1273d0dc0f8fb4499947ea15c2d629b125694007e3aabaaad95c1c475def01edc2243c1529e16f86c6bee1cbbcb233b38414f8f800c2ed772f81ea9a89a67405e8db86dce67ac1e266818a31a1dae67ae4f0053697d01f3190302d1de03d40a878cd722ffaaa693647f36581f2b4427c7070a17948e194be98e3eee1b62663f5c03944cd88462c01711e99d943610a93f2351147d0e02f2633a9074efd3295c7f0fb9b3c6c1994c911950e2c2e8170e98f0c85656dcbf80bcda19af36be7951e1d634b7c154a5861e3df779586ad4ac54c34c42e00323b66e1c3f6ce7ae6688a4b7aea13d433bbc017a036ec43ceb13e264e04141a93ddb719f9b3c41cce03eccdadfb9e8ba4ab95dfbd3712054ee8c846cab5f936aab94c202c0a2949f90c9bbb9937ddca230fbdfb10a35fd5b6082487f18eadaa173926a8324017ccf81574eaad92f8ddc70d4585b75e34e82c643d70dae5a300e26ab120bebb5a83c12917324849b9b8f1c5bdf154af4ac99435cb445eb02128417149b91c116081bda59aaf18140ef2bc55207ae028835fa038ca06210bbfb11ac43c50a7657c687a24508b74ed3a693f1a174261006d245692616a5fa3618ef21138a308bc0b946efdd1d8fda64d15e9256b637ad0ef58f0bd7e7a0982f7ef138555a04b57c695924fbc242f4c9acb15afa8416d5284f21424517312199d119dde35c73bd8625e7a54d7d266eeedbadf38b837c9fee88fda35690429069b43fea9282e84d47117a465160878ac87ac67df5bbfa8345a3f86fee172bfff0c0a2184e9914a09b02dc3d5e5f9aca70c70c4db170e68cfa030975008de8a28e2e9b124792d0606fcce338d5e11dc1121afcb516011f4167a9f56430654665c78ce470fa902e53ae49807a477eb9e6fb4e03beea5c03eaa5423744e0ac17d1abc548ce8989854726e764ac4b1c109c490064d77c6ab5d3f9302370a9143a13824f53e13288f9d5b1da91cef3031d3074afd2dbb3cf4a6d7e9c13bae16a0e108297d07e69e248354e6d527f76d9a617475cb14085ac564085c80276dc57d4b6a41031a3feab429dc45e61b3d19abc7582622174e7f81d6337aa97ca672a64d5562679c80d9dccfcb8abb6397cd7f8527c7fbeb5af40ae8e64b4a278b23dfcd0bbb6030ae95940ed9d30f21281fb21abed9ee79ef14c78dceda006d7b6100514d9da46ca952809d4d42f8ae722c9dcbec8f9365eaf22820ac3b907dd7ccff00b164bb74fc3fb8e26ce70e49d8fbd5289cbc4e3198515d2e80ec75eb1f728a6cee7a557ac117f0cd8f189c55134ffe12cd95da9976b9dc750c1b48cbb805f6e6a0e8e928d4cb407eb2da462aa9deb1c0ea86a0a5fbdf9528b5af05241d8519c745ebf80d00271df256a2969e7c6a0be9c8ee8b8bba52ae4f9b12b2c1f7e1f6c6cce1241beec981d945d15d3557a61078c11cf3f229e81f670ab09f7aad3bbc055fb5d2d3d16912d8ab7013d1db96cfcea00e5d10f5c5201aea9dd38d4823f563839eb0e60c862e46d7f228f75acde2270c01685e8994854fe83ee3fbfe42350f4bec63245bdddc83de2640a841670c1e67965d181850347ce1118bc8e69f630e7036f374b6f382e7a6f5d065098bc505d3bf725c4128a4ef7e2a06facb1878d8d2db970ba5d807040a4a4e7d5ebfaf993092dc170719ebfe63cea2f025a64dba471b110192343732696ddef6f38e5fa7e8eac7115758fb971745998cf4e0736073a719a537b3e16d89e999ee0f0f244052adff6fdf2cb6a84b37b71ced93c9915bcaa99f23b01f674cea1600da4f57ed62664d4f120e8da4a1843612b108688b5938086ef15b7e460a15bbc0978e60c7a087725c212cdbb0a062b5d93e5d12792641c4f3bbcc128c8e6ed5ccc0851778ba5861aa36a35bc8fbc4caf891a2fbba244a7d76994c7e7fd1f2cf449613c71b72f16ba0029fb0191e93b45261e64a74832ae3c1ffd1982e5ecb7157024bafd75c1e5812ddc30591b09fd2e72e95fcf45b060c5a2ce914234cb65d1acf974629f98f274ed0903602a73a6391f4f6bf702b8cbd9a18a4ac92b075260403941e4fd136500848f702375294b3b47ef6e78e0499b33e4deb9cb658714d2219cbb93f422d78fa87f17553eba3224871548bf275b646056b6514009fb8a6032fc0e9409750f177df7f303987bdd75cccbab3789b56c794ec7f85e6fb232c4de00a4cd6e03d8ea308b25dc3dee58fa5762708185c82bf88278b96d8e305c9453c5b830103dcee14fd87d1f76da413cb7a8cd30f2e878fa02eae90bac34967f7120a7379d0e0f528db0382a694bfeec64f772e546346ff0170137718ec7d2a33bb4acf155a03f18eac426612784d1ef466f4a258081482589ad54204e5997f3e92c2c1b08190ac78fd80aff472a37ba9731cf50f6c9f56afe1109ad1af84d10bf5ce63ff9c609860912d3b6c06ee193d855de9ef3b41049b757f5ab942cdc0df858e16139267780795e100e04503cf320a1fe06e3a451719a441e40cb9d0e78dad4095f62094a27b7b437232895bc338f5ba0b4938f4cdc406942722940c851e5cfdfc4b93691bd718fd4eaddb71d050fb1c37cce18dc3617782509c7175bd3625fd4b0d9e89606eb7fb2b00a0ed54839804260142eb72a4477fa1c331734e13798affb63729d209edbf4a50c4ca900a98bb4a0f358291ab785632966ba14b57b92ad73e04fcb49e963d07fa266dd8a050cb1d6a95eaa7c18a8c225502e5cf8d4bcccf453f5998aa177e5a5a53130ebfce7c7d7e76ee4c6668412a52a044d6fc987dcc133df96880185254081c738184688e7dfa69fade9376b03d5929143d3e480eb9d3d79c42865384e3f24eca2294d5a8dd6947442cd3ee8c2400cf18127261846273c3362956c65b11a2ad147e658006d611c68fd564d557e73e988ed819ad84c9b5454455adb63458d31bb7d121ecbde3e5e98476d89485bf05aea48ac27112c4c6e1dc68435c69467617ef027f76b7f65ea0cbb34b5c44ca0d8096aeae18832b541f515cb59bb64f6a08f7d8b69314824368fd2f081db48c7ef890c3b7799afa9d2c18201ab1b2202f2e42dc8f672e13f0c9a2be755776c3772181490b98ebe09baaca3d6f4b3a64e93c74803dd2084e34369709fb7f5949c739727af81c1707ff4cdb8dadfc8c00814ae121090c48a9af2bc882e73eb046c1e26b042c46dc3143ad20a78110a0704374546e3884b8640a5b06b57ae60e9600b574d4838281571522703b89a54526930c68a26c3c23f53946535c1d93cb7dc2e21bc772fdb4ab067aa14da4b2719be6416b92c707a27622c55e204b34085a743f77148d6a88972d6c7c3d7b4ba2600a1f59f2b959927ced9917331e3b8e5cf5fb76bf1b2cb3108bee4ff0d0a7d01a882d87e30140c61af2d3212c971f7ce678084e8eef547e0bc65ca54431a0534cff6a4826982847f2b6a8662669b9e48064c6a7e7ae0cc52ae6655518ba5765a7d2c57f4a7c3850dbdb2e5b8f657820f72dc215e34dd75d49c42454afa42b118ba87e195d562e56c346d57d4c2da3f5b094fd492da6b96b41737a2e632500f8d0f67f53414132b3bbf1f17b861de0dbad2b0f1299f402e538ac08b200b901d054222e08f4828b6e9062094cb11f3578de02b4a15db227bd9a111416762043725c2d7a533a518608a0a00ed3608a1cef5b5b0cada9dd7f4474236a6561362710bf3350565a1d7dcef49c17775e161c3a720fdadeb4f45696ab530aad3fd4e190227d0cab95f0ef8553b98f6875b514696f119c0a18c7083336aa63912d980b351313ecc3f66c27a4e61462ee23a0a7303be455d81a6b5140fafcc1a71acb192b30a80b3dbb29d737b67a2238e9c7d8fe553028ebc9726f6391c81a88f33a83dc9e372dae6cfd756ac34336d1cec50485f887843086f90d11b187d6fe9e68062a59a86e14f646e01156911e652cf54cce7ec15d98bcb68b0402c29ef3f8b2ae24669698192896d29aea2beaed1fff9c63aab186ebd93b4557db92ba813bdc8edddcbec07112583da2333f62e6bb075bc12c88f7c87366230b7ee84a3351ffe7952f8c03a0affd90a56745a28dd8f3cabd53a33b7d0e5029fc6af0a8f8168b1fd4364b1c5e2ab7fc0a94a2b4bcc7904e3bb3f58d139c2dc8c5e92a334222ec27a10a1cee06c18a2bdefbde33645c916d10ecef3e38994ec8a8494c2aabe934a70cda2b8f31e1649082252aebc457394d42cbfd0983ff21625ae9a7004aea66aa6c3b6b70817d1bffa9e810ea5599461276c1afc51694fb9357da37fd556fd96de313731a7e92ae2446715380694f9f8f3a652b8f5cda16db33442f575c54c7f42ef0da60bbc456c8a5323a8c410d10b8a134a49954a0c1a6d7cbebe91463756f0a526aa7b369438a8a6f9c8110a68433f6c35097176ffa01fb59786f85ef4b2694518afa5813668c5222faffad826b97ec92c8b0739989096e970b366a2b2fefde632f3e199cf492833be9a54411d9d78c536022ce502ac1deeabbd86a49682275b51ba0e797c18fe92708457230ce35cac66d4701dd7ffcdeb316fe4522f27a3e099653808749ad7d87c7518fa02fee83c10e1067057961f5a4725127e11a210ff99d0f9065629632f4fc0e82ca94107886a2f40a37731c45cf22c160962f3d59129142d642263f280a9571fd1127679786cfc51b9ff4b9f25f0d3da7b2294c84f3024376cc0932069de82f3141823447403e555fa6e04d6511272cf0d2228c98a2749be9ccd2c0292d060e4f2012278271f012e2c32b652360bf6e4701fe2b84adce4a3078dcafc8cb8474215346293afe42439bf02cc3d0da7d92979283d6c8f1370c68f286441858c61fb266776eac6f8dcf2c36755a16f7801bdbc9bac2d4492e6ebf76efe88df38f0d3b87e8c4a3999236902fe525b2db33e36e666635380697508fb3aea391b8978c6aa6585a3b3201beed8a582167e97a90ac9dbc75a6513902f9cc9c80216ab400eaf1e7433c306129641faec246b2826fb711a2b0f5a0d7da4bf0a249e5c8ebdec98ba026563e0b81ee30ba846e42d01be1374026089fa1e58a7f3900c1d04e11d15307900b4c784a3fda73cc3bd8ea1eb81bb8b232613c6fe6344627336b5431e11041e9b5dcfca3955c858101333642a04fb71b99172035d8070b5315a918c639043305f214c083388abd9900203e62c52c9c8c3382c276492b971746b4427865414beca5f1e2610ed5a27e9aa4b453083c5652ef161cc04f1d49c3b6ff5f40444af49ebc71e15de033589e68c5b982e1beab107b85793864a084eb38182c94d0ca268cb4d59c54d93be162f6fa4025baf51eca72dade4d00684ccb84fdee4d5d6ee3e7c85cdf13bc1ec699dfa0018a6e3bced9868757a34e860bb38475586ccb3177fda5b6fdc859b5600580b531706db503f2bf55a7416289fed1c5e877baa0f37871be7c09c0d0ef7b7ceb1301920bd49902f834f0ffabaa2611f08230fb4d2e7fe6e075c0a1765e753b899b6bb6a5c5a779754369f7e4ed93ba8bb5bd4cf7194b9580d8ddb60ce85da4e0bfb63faccb5d4778750f2eedb84bf80c3616f1f8542bea8fdbc22eb978e4a030819d8d705c0c4aaf12ba3f1abe4ea7316bb8a3f94d0e694fce11cf6c935530474e099db288d3fe924b72e99f64aefc04314e637a57454e930b43060d314e992b58148d3fea48cf94663b07f71ab7f1255924d261158c472bf0dcc1630a642afbd931ab7d19d340c9344aa8f4daa86be9bb031a1ba52f730573028c50dd95fe8e7447d39832e3cc2d5aa740196573a802b4b9b70313b173f0d503bad24f0fbd689e06a401fb7771ef79d80d88dc4bd36bd243a4dc198646261176094746ad89fa779a74dbfd518c23d95335cc6b5299e0d6467788452cd09106a3bf62e537faca88892f228851266b1c6343248853388634e9a733005a145c6d46ce45f1921a120864c79a9e5c4ff0a26603e681341c3bb25bbc16fcce7fd242a904b81271a8b07c4c75da1fc39925d9baaaa8575286035fe5d24571ae28c0af6abb6c96171e6bfd9c4ab18527bb2d018c6efac2764855d70044cc800b9ede4b6b7ec38ef28738a21933bcaa25d105dedc687e8b8189650eec4f5d1db1dd32ff0ecaaabcd16caf445bf47d88261c2f869394c525e10a758e30999ea6eae752dc4917c6d1deec71265482f4626aff6845f47be3527caceb76c1153b235776be5e6d2a4a4ae63c21000d750c548477260fe0891eb1b9e9f1bff3bd9de9ad952f1b4fc3cb47d12d2dd4da2e585fa095755e56e2c9b6aa40573bfbbc6f1a0a34871e358454c5c9faa2908d4b50bb10f403f1e381b35c9ebb39d00aaf58374b4917498563dd488e341b7c0aea43de8f160de4cb5c2a2883998f6668a48e9e21d96d04f8f07311f34efa84c37040e92591d9feb84c23f32a7d7ec04f35872b51a8438a9753ce82171e73e0000f2d7beb6f236f2ccac0f548b1b06b4a254df3508dbf3e37aad35604118eb601c0f4a2296ed132268a9b805be5a5851cb76970ee3385bcffde98f07bd7a968552abe772ed5dcbd45946dcc5f6cd302ed6b8570a31f7d356e323f12f77e24141f7fe9c76d60dbaac3683013e17af1318282172ea45f93eda84fb338432f4cc5d488ccfaac24c6eb676c8be18f9a2ddad0c7c02bd7f118d7d49c669fad6fae566fca49f9d9adb279d4b1e6333ff0610e1e253d632e83437d359ecec21d3de502f2fe217923327761663d93a7c80ca6c2ce5993b71088ad7652650605e8d982beb012c9159c317839d61d64a9be669f10e85d98d582c2c36af66b5bdcadf66ea4de334682d559be1555348dfe01e8ca584793797476d32eba446061bc900a050bbd3676c3974934f974a10d3dafe8630fec658cb812e00bf7b81586474b0e25f3309bb501781506e676da8086f2924888cbb7ffbbbb9df2333ae069acbc92f069e56e916ba901b6e9d82067a262d6700f085dc5a802dbe0e99697723cccc2e77526c26f15b34efd455aa20374acc9b6114c6a64e36809af56de7f30e72e3c1b27f92f1ffa46ab97bd003f0ea39ee3e75263c072aa9b567572814d68a0671fe698c82ec6003f6dee5943232214b76d49e39151f3069e13c8a378baf3b4d1d08e0fcd63e09b8c333703669bb65250270f60642dcc63b0eb78bec38955cac4db336834fdda5a419e9352c371372cec4f59928b60ee5fa87080c7458df60f82162acd52c531970f0e3a8394d1fd6ad860397afc96c67c400ca3f73f869f892af4b1a046ee5ab321e1f65b650a76e2ab4ef6ad459b23600150b76b800d6d88d3b36ef11dbb710024165580b33fbc125f073b4e6462a4d2b1a58f4ac0315a3b5709f7624e63a3dd1ba468739dc167c3887b3a9ddbc456e12853aaf91cfc9e2a2259cacf0c5794b6ed9f3962840f5418c6b772cf0724b6d6e3c3da2ac764d404d5e308313cd56ee1f455c5f79738b885cd5da77ad4a3e8e2b33995aef7c456d0a7f5792f19c840e0fd9b67810e2f52d7f503870003c3cf4d7508d50e2b6c55e5b93849ec62b24bc929aa822e139c9b57a6df12b4818a15622cf075f32e9eb4952e6bb9510c109e4608ff6931025cd02bd96d534175587fc4d3e281ec845f68dc2aa060e94465c30bac79c2f8bab7cd2b096e3b2ba66c8f9b18ea34813e2e172bd55d47ef937194cef571262da86eb9ab5b32d1a317e196499a093181a8ffea317296b928df806c3f6b39d64ad6fb8fc8a78b16b1da3275f280f95b13021ea4740c91bc8dad97ad2fbb7b6b2787745aa5a46106c7edae4f062cf1254e8435b535f477dc9f150e5488c20d88f0473199146c83405bc8b5507814d8811dd049c4430bdffba1dc7727fd5a25d5cc547b4b36d52a4b4cb2354dce4100ccad5b59eeb53617671a9c6bedb62c6ebd901743dd9061a73286ca38b830deffa0166562a5b61fccbba29db1056722ee328bc16b77912e85b3d807c41b0d4956d295c6698e070645823240216abce102d212b3ce13a24ba87c5ddd6ccbcf6238743943edcecfd462828d7c2ebd3be4af91e738c60686a334beae5266079160d4aaea3cf278132342a6909cec0090eac12b2eb41bace7b602b7f4e23a7eef8ced7ce0996b3b9891bb51ad6f799985d6850c0225452228c159eec8056261ef2ad00d85bd12ae2b9c5e2642bb2606f092c714ee3c9cf04ae1e4af59d0e0213975ff9c2de2281884701a08c2806e3e876851db50256794bbe278afce23a36d95b7474a3dc80a0f7b6f64ba8d3e82f15fe2ed04432f147e9180561ee837ffec21a1a13bf5e304d39bfbcc6b0c4aaa71b315a4a0f7cd437b090cc280ec7d860fc7e6ee35315ebb906138ec05457f98b36530933e1d391c424943dec3701995ac57221b8a2fcc90063d8a8d12402561abfe833083b300c6bef70d9d53d1b79eef8ad7a91b95e7f1d810071fc6dc24d44f18e345bd4882f30d4d186a09aa3cc945293c33cdd60448b93432aaf85651dade7d436ba4f0e77a8bd038eddbabe862f7818be49d9816b3316eb08e47aaa6ad756fcda54138663c37475ef6184ac38125863b4066babe67e3759b7523fd551df3073cdaa10e6aac83c075303947d746e0bbe7c0d73ff5844b7d15a45e834601395651ff71c1fc2da244af3131809795685e3d11297b38f7b5ccb9b5663cc2aeea5664959d8d65bf9daddb1b2ddcdd87b2895b241a80e22b326d3563c80e56a769087346bbb94a9fd96c989f158fbe28377ea9f6b55684b4fbabbd525399ee01a086e08ff5483f33ecd062dc32b54220315d99098901ca28b3403e0f89a07a893d67278a02bd865366f915f1dda5a7b2c71227c5314a1bc59e8dfb2aafcf87e07433d25c54e9b95a526067e95fc40b6a6fe4bdfeb78f4606c5ac4ce2d1becc716dc2c987fb919d7cdc25d395f2b73d54c4cb6fae1351b928086be2694bbb87e244bfbfe15362386db0016d7ab02864a3ca2aacce0e98015cbefeb3a773e7ffeacc296df5c579b3d0f07052a1b9f48aee5f12ebda73f79b95031bd48f223c4b638f8d4eee87fb1ff9cfb295f2977cf8f269f9f93109573ff27ce7e99b8bb31d79d9ed602181829515d135df8744601e8179f043a86fd6cc057b06fef9af34ba30168e46e553c5b3e0fcdf9921db8a1a419f6c7babd0edad46408b9b270e863a32cf896b3a1ac7f25992fdde4579bf7e95ee1cb161aeaff8af849c32ef86009005829537f0a521ca54ca16886c3fba55476b23068d7a24bff95c6660dacea458e1006fcc4197d6b8bbd20b77f6b14bdfa37c5c495a6c5b0374f8bab7622b56039fdab072030eda1ce03d6a1330e0d33e0046d4a70667c273a5c61af4f0b193b896c5fb99a68b26f0a7b442001ab48c9e5fc04464eeb386d3947db3e14a2c38c7a25186e75330c5a816c210b3c65b43a6001f358bc0c6d8406832c32ad5a3002fc53b65f49ba405240e31b314f5aa1fa4dc9ee366fa7e0c4b4c5680672a4b709da37d2c9448ac1b8a317428590dc47429ae841e25d718682497dadc2044cdc57540a0c67e6c0f96033ad7ed71b48bc524a129c0a4e0735a397cf0e51e5765f56279c2a72d0dd1d59247f8abc64ca5d0519a691b710c8d5516f27b1cc6930e99243c1971c65d27414a9c34579269eb13b7ebc4e999ee7cdc39dcd3ba037af9eda42ddbcd9d882d2e816f85b6e7bea388e452b75b7841dd859f25219d08f479dde74cec802e86c81624cc7229137d0979b3ee3342fb7f949b9ae9fe467489b7b756bed08764e7221da1abec729c513bd42693470f36f84c8205b9e793515d70b8618bd0398b6ec7599ecd8c4995e481770d848d81b6a1d1384646521155f28833fba10cef0e603ab91a2ee3e0e0116b3a7685f474d41122cc947b33199d6262ad28b06047715a68ef2c94b329b38ce8d9e428e894c0197cc66e05ef783eaece0221a2437bf60084749f82e3fccf9e779e129c49f8ec1624134fae6852f8bebb967691ab790385e6c3aa4a35b88b9fb1c6d167b26a43e6d10c3ead4a79a5eaf8fb68903bfc5165311637b894a16a9c34eb438170f69ca781d6885d6a09bbf8bf0dab88a38a34f75d0f427d33b3d2a796156bc3929b30efbc1c1e06e226cebf61795a52104f5f95d470534bd0bc28bd19457a79a6649c7625820554d2ab695f80ca0c708f0cfd0e7d59515b81bfd9b0758fbd2b9d7bc1b59e764466416c7ac1cfa87320eafb891d73ac579d984a3a6d41d82e671ffff9221b7c57edcf2187bb0b2db16e0e445722a1dca40c78154dbcf7536cb2527d87f4d3b56604b63640b6b3978bd10af4ce70d0608c4c66c8d6260c8c802e26c4df85291528d6a0c5097424aa31a680df5ec9a41070144f342d30c5d8a4148283cfe5fd74a4a5be354baba5e725078d7d563fb4939b36681cba48a2ff5ba201ae93347547f696b5820b66e436c0c2731d895458878eda0d6d6e440d60ae1dd3a5d34e824b9cfa96dcd69e8329237df73cc6d8be2becee34b5d7edc53c9503a44138031a9be24f935b8e3defe95a8abb6540499a91385d55545dee69321fc1272d08e8ff0b8fe0a17e653f0254aa1f7fa368c6d4d5de4f29dfa8ff4eb976df7b8f554a571b34aa371be258ac0bd21078f044ab5154c9aa10ed56668627ce492905a42feedbcf234443820730740fb1ca9993869643364dbf4b4c6ff4d92bee72e44fcbeccb7f731f85d23195fe8015f0b5816b8290fb37505751b8868c5365152005b97705289c65e7315b5b69f76193c4f6dbb69fec77be5f305bf426917c0249982589d14a620c0685b22191c4a6365d17b8f92b7d3ca72c35f42ce9af50f627b0029ade625b103523a367a696014f20ded1862fe0e33ccb19092868b48ebb4ad43969951db46390c6940d8c8e80d74367915a7780044ac04df259b3db4c7dbeba6e6f56dc61edc215b69b283639aa5981de21d14b8a62599a0e59538442442b2235b090a1c5989d4687fcc93b9eb0c22ce8207fb6a0389ba0870738319a125d6326332756fe54bfd33f9973c0c35e91490469c317536ad3d848c878711dc1e52952ee89b32f939596fadcbd27145407313520dbb32e13c5229e35f9b857cd3d4604a8bbe63cd4cfe9838774a5d3a72063812d1b66e9fbf1591ea449964d4fd451e92f5daa1a5fd6e6e48a21a4814247ee3ed4e763511169e06f9c197fe00ab271b234f27f993c0c8011d1401b3c3db4754ce7a3ec6be141f91efc5a2de8ddbba7804f99987ac9cc8da33607dc479de58405843f2ae6ebc8533efd97282c32de3de3e835afa38d634d1aa87d76a9ebb0801e421959959cc34efa54b3cca73927fcf653b56de764a20564f4feea9a7a7c2603fb351a5934b33c0a278a49cf94a7822a52b35c4d70899e6d1a0e7b384553f4416387808b62bf3766ce0eedf077fa364347b031024044b52034989abc811bf4126830bd443ef833e5d92f47b1ba082a6232e46cd3ed6dde994c71ab76827e18550cee24921d0f157683a711cd58ef8afd3b27bca1f97afdec1eeb2ee009d895ea9dcbbc99c3657c7328ddb9258c1a347edf58200739425ab30d9c1ae1ff84bf291e616f5b16198da5f74ef9c1aaf881ab447b549e7ab1486cbefe1ca097e79ef0b868d7a501c64c178a7756f7547286aa0dedad17b2bf1c4d8608588dea2b765f6074d57e54dc95030e1a8601650ac749c9395b254de1a79833ee153339322bf006b01e7a43a4b15441857e808593d775c7a85587b56937194434a089469f741a236258cb04a3d5dfea4079e9fcb2711a1dfe68c3bc22d150fb499aaf431056d65079029454728b086999864e2e7fd1f968f72d37ce77601a727dd182715de56e0b79fbc661e66c289b0ad74037a5e536958fc95eaf2c36ea6504917550966164b5ebe2e668ce265135ac4b5c949f9fccaddee62f3d9e5905a91abf536bcc029b51dbd38f8e01cdd3c414975086a2124e23ccbb19818680b2d896a750999a9b34b826e45b95977c74981cd0fa9a64bda3fcd5ca96042f914493b8c8172f4e6558594275025dbc90509b84c5580809d22cbc017b9f923bd1c71b845a928bd91ebe31a50af6e3a9f38d24086e0f3d00688c88cf8b4ad315b6202ee7cb25674e5823ee5f269c7c281bcb207ac90438a56ec79a5cdbce21861819b798c98d326da3c06644a4870ed890150fa72fc24067cc40d02d856ce689b315b63d1c92a1619fbd9022bee6a94e88c25209fe68446a40b229005f70a4e45b509bc78fcabf4b0995ccd9e46d9058ee6e0acf26349a9dc36324903bfc6001880736541f402c5d40350d0e331b822d84ecf43295e28bc7ccebd75d1542a6b137bee79bf053816251ce6ce89883b1918e6f879f1a51324801c53b3edfeb759a41730f928ce53d70eb3a01608931723075b9030503eb38297d38f3b20a444952e7c4054a0971ba4cf911ccc8f3abfa0dff23fd170e0cf0ddab25f5ce308178be9678a6f7aaee4b1ff45bbffd4e1fd85d9fe92cbebb576bf28851cff3924e5ebff27c1fd184c37d64fe767f71f492abaaf7fc96ac23cb479ad16c5bdb4019f4c84fdf17fd2ef546278f4c27f937a7c1bf053772a53be0e7886572a930ba9a9cc55be9190a61a23b51486c4e6c901dc17a6eb4e7626fa93a7051e22163f8d34ff8cb2f151fe5879fc8ec3f09fffd50510b52cdad8cad8f5d317614a36048f3391ce800c49bd09bb91e90f47091f96fd59c1a5a7dbf47ef884e14bcc756f59815555016fa8cc0dc3fdf9de32af5f64ee14ff57aee0a26cefd51abfea360c8984add837d82b450da5cb2cea355f7fe47b63fb196b8bfec78be2756ce9eec2cae5802662eca7f98303388efdb864fd1640f6273d59cf1f32e1d81fcdfeb30e66b9cd800f5a33eb1f75849a41fe574d2c5f0d4e0cfbbbd35186c238f2a7f064367c10594038be2e51cc942037a7c5f2b1a6866239920277ba1a65e7a60c4a23912883c430c41a09d8e62aa53795cea2cfb61624c836fb879a9574ac9ef68bb7fd00b5f3ca7f94766e9c9a7e225502fab91b99e0b8ed631c1ceb84ddb012b8e93836fbf77fbd56001b1f8b18b61a43872df64e6a94bb90c13e32541878b96ffcad4a8ea41924ef319c0a65e6e068b7317be246a2d1744682bed142da46dfcf04fc1656829a733f092bec40124f0027eea838a5409fb4e1fc1b8e1fc245973fa6c53fb9a9661b0c0f9e1ff7536a92488d09ffa3c1b5a1f0a4cc7fe88ab0960d04b17b4d8f79bde38f0b2b24f1ddf30a3fd75b853651b4e73da1c840a1f0fee536fbabb213292ae7b1ed40dad312024338167b60528609f15457ae7b6941e8ab01302c72f6db288ce77f7161eb35dcf89bc84d70d36ee6cdd0ebf1c6ed077bf5caba58ea497aff1d9b3bc4cc9802a7b4ccf2f125482d6e0d1c6c4cd9b43fcae01f82c0562a8fc3be3fc2e534e939fcf2aeaf4aff5b0cb7aaea70a5c1480de76e00c2b35b3a205851ff1265490d126f0df0614250de7dd3bee49b0b39e673f2e4a62cbd0dea0e1f0421cc345f63afc80dbc51d1901135342f71aa1d2d5862118c869d050726d2ee09fef3e1384078a916accdbdc7fac1bc9e4042fa26fb9fd80551a75c67bc8b28c6db6072d070f54dbbfcf7bc826fd172fb42ca356cb4c4a9761107e0214e95cc482d756a342d66b4b6618d976349b25b263d2ec79b53c7d439cb1bbf8a68d0bb0ad484246f111a908c2be6adf43360fc50e093c311deeaec42e0c5818aafccc6c815d3244d88999daa4257510c34b43eeebb2a608b674e2b3bc4c38ccf2659fd923c0ebda89cb2d767b7eb9dc727a4899a605b7f5722bb8882b280ae252dfe0a925dd002ea5db098bdc349b2d9a57d21210eb44c4f9961c7f89d136fb095f9e0cf685788fed0e2202cf27780eeac7aedecbd2568d63627683ace9f5b6c69d8391a6a2b61d18c967a9c050ebc93950dbff161e59cd6f843de895d14f302161659c0018c49e36cb7bd39bb81a8eeabbc06540c5933db06a557a904a3f9c56d9d0786e4118e1b4b53eca846ae0212f930d863b8738af580067a3ee5b6c6ef1a64c1c27215324817ae8ae9edd62d0af33f031de707c06431e6e2de6f00edd47958444e5e7e7de3da0349f4670a6aa1f38ed2300ac7aa606d111080b2695042cc0f434870bd3bf710cb5255fb557f71ac6957f04684ad49ac63ae19987e04fd0981f4930dfafa236c39610edfc18040e8fbd7afe72dfe70a04597c197fb41d998c8449dfef34e650562586b6d09a1cf9610559311b157de674834e0b051f0faa74b196d14074e5d78b5ac6fb2286efa45a9a1d1189ed4573fec3323dd514af5d0f5de4e4affc147d2af527a69fce7b5376a90a4d86678ca62e56f5cb250fe3796fe02ae90c4865677b9874c40ace6bc288daf987dea8c841964cc37dabac6b5885e52234433dd6b00525f3dfea2beebc068bff9f6fba915231bc603b87d7a227dece951b89e2c2057babef5c57559efa59b2f7677e183d53e718e978ca1df9137daf4359a884937b40596392364a48fa217255d2180817fea2d3eee3352533e66b8c561aac40a0fb33c0044280c7059dc11cd783222a481a0cc3cd85d985b13ac204b790a357a845fd1502e9ff07ad4c1b51885e1a2a374748c00af687576219f57b49e8521f7e46055b6d1ca53111570d217560686c50c58615b78c04c1e217d69cf5d5966d6a6fc20a0b5ad2d5c541750704a9a072628af962b36de467b563026438d740341e4d359759609402c1935ad60eaf6f99d06b02f8781af16b0cd381e06f58745309c882490170d5f546aa9221348173440a0a8f755f335ddfb2680a1b6975d95fee57ae0990c4714abcf53f2bf79bd03e8a8e8b09489dc474a958b10e62c9992caa0a5e96853d7f2c490eff718273224720119c453ae3cf13bb8b151dae622a1406ec6d2b00913c26423f6d3ad5f16ea1f1940363aaae7c989742b8530d7ebfc07c6cbee8dfb1d7911c91f1b18e570dec5182dde7846af6ffd200231b46629dc0b791cc674c0568c9e4ea6b8f86fe1ec81ef7ce5dfd505b78d36764fbd5d17cc2e357f95e38e885c71d3c954f17dd6209ca7d83975b9fbeed37dfc13966708922ff9e13ceed8baf7881c543790cb87f5d2f80643703c35c84351cec52905dffe9d645f08bede8eac7b3377119700dcbecfe8850b0d07b1a710a90190b66965916bace8ed1d34855886ae2e0b0ec88e0f50f61730a87d8a062fcd810156c26a3611373454756110286255659fe2515023ac282c454b70f80fe0629c2a5353b1802d35e33e619e4e4c06ff81420ba10bb08d31ba1ba20e252ee90ae239cbeed027d4af5f06cb7482ccf30bc254b19ebcacad8b580c44206ed0ececa6682e8f7ad65e77a43c663103b3dc23cfdcda54e48de000473fe9d6cecec9bf20dcd05e7b32b3ac8b71d522029809e537f61b796e185dc8d63e700f03c07e997dda89672a6e4f6eaf9058f0fb884ad6a6d3b8bef13f6fb76da64c2c90233b4455769bb06b6f3b7a91dfd753c986ff6157f6a7e653d96fd135e32b39aadab067499268eb8650fec8dc0261412928500763aaab80224dd009827262106a2c900a6273845a42bd3d07c5cf9f21138a82eb3b7b2be3b7c264ce752edaa35d423eb374da021dc2b617f189aaec1a368202bf297fbb6011ff5c0157e65cda8750b7e3adf2536720b8cb94419bca4a4ac02de87fc9cc95c1f64df8f02ea3a05e8fc19f85d63cfda3c9257231064f9979553bf202ed6582d1dcf75d8ab168ecaa3860cbc08f1f188a72fc24754cbd51fb5fac4f5bda78107b25d034480fa370074ce14c2f98e31a6340372b6a85b2dd7d1c10b65872871a8c89bb5b6d6291f1ee8c83118fcf4c6876d2cf246139e3c829f00c64132065c272dd26f5ac72cece4568586c93564d70375fc7d510ddb0e60f86a1f0adf11ff636dc17f622a87faa8226278d1085022421aaee77122a234588227dc00dbbe8c6066c38cee9bda5a9e93c8593b917ca05a114fc24e03e5775ec6095f9036aadd1e386bb00e4272617657d12658342e3426bed1b2278c556ded8d22ac052084371a8558bc01933caa1188ad95843ae00892f1479aca1f8e0c1f94654fe6a8e966fb04ad38c19ae7398c83f0b65d8d28d656215ab5ec576a3b6082e9125ca956472edcd6a12502db97b0bba51b225cbfc2e490961f3f3fed7880fa08b59aa3175cb616083a360c89279efbf5166a5c151d8d7993aa16adc259eaaef8c919bb1881ac1a2c0896bcaa74d5b72bb06706a6ecabaf198a65b58b72209d2378b9bea7a78b779289c2ec7254d75c3544a945e6d79cb32f42bb8a4f0b00434151163a3a4d593cbbc6426d369380a067151dc55c3c44113fe7b1e8da9612806087161ec3c75d206ea41feefa987d925e7de71b401fa6bbade669e311a6bbcef828393d468030486ad9d006611fa4aabdbb8abe9ba4aaeb9847216303cda8076fbd851cb33055574b202204a0c3c2c487b8dcd06b37c294674a88fc99b45c6469ab17d8585d2d106407b08eda019babdd79f360aab765d93f407d2f46c367854779e40c571bb6e430fe9930201960b2bfc186d20616637db5bc8be8be444fb7c952140884398ca66b1e00319a88c4f6b36451b2c899e79d3f4a8c5d5eafd4156c28b2ea970200342957ad083f86c10fb690b3b74464bbdfee0b301fbe685ddd420971c29401349a7a5e61a7472f3e2e6d676ef9ebbe86ee1cb50fde19a33ea892cc59b4222cad73022a4a917b128a7bd6b60622979bb85b2556ad77a382574afbcf15e4265c35577811ee9148a5989c3870370ef610b364f21914145a5122ddeb6f87950dd87e3c3ab69dc869e68481ae43b4fd0b36868e06a391770e823e6ba442b8b8453d80d2c7088bd6aa039971a91da348582c4e51fa7eaaa558a09d72d0cb232b291826038f626a44e4d0463751c787c021f6f0ad2dae04ca9cd1aa4d2466026c8622499ef7346d7fccbe7490f2d9df3442051dac959c7d784330b081fd3736317d2cb69ccfaa5f43e554e348a07c7a095eb4101278aae78b6991289f71e3a2357e21c2fc2e0e793a206011848c528fb79c64f53f219d9a6c5b81a1650908ffaa9dc7e9d7ac07c647aa10b15a8fd9c31be18ce4aca22f00499341521cf195c24a79cd18a2afb1a332650ab7802d8d1fe5baf5f42471019d50091b5ff0592954c789db462c19ac469a16ee40393b308b58e6f35104913ac56f5bf340e7a4d0dbae945c56cb7e0e1d9566febe127029447e204513d76f5fdc4a470be7917d9e972f0e2afd2430052b0a9f4a2dd4669f739f8edf1917bcea9c4ed0079fc420fc25f83879e54cfe90781411004cc33676ef018a598ccd600acbe051a3e1093ea39ee4d1fef0718bf9540164a5be16a1d48fb887b09f902676f91636cc4d9ee83a4ce38032c88dfa74628a7b1251732d4ccee2cd4ccb1ccdd36111bcee342406ea787c79ce397508e5fb2503af2b040a824356724e30a502179bb8c6a336c3371d4fc658935d4181f5c1a793c8f89eb10cf53ba5385894efc739781f1cc15a12f910dd0cb5fe0430a9ad4ad9e4569ac71aef71079484e34082b2df19e760f2a821145f0f7048d6f4146aa939984803a547d77255fac21e1c2ac6665f153400335f81a60630f396225f3e2c7465cfd14e6760b20e9d6edaf1bc6705f4cc8cf575e2c511dcfb48c8297d7e946c67bdbdffa73a0207c97c0ab0e262cb5a7c0b733a4bd8f326439cd44a81de72989a25a3d10853f3fbfdd1650b725039e2c57eac1650f9b10cc4473dc3a04ae8f4c4dfbb087ea1c1308b2e0fd02625aa1b514395d709b3aecae19c0c31c5d4c0283126e959efa474bac198aec8a1a6c53052b04857520e8bdbce80c7f34beab607e660bca8bb97ff423e8d1dc7537b1ffb2fe2a115d15c5bdd556cb94fe4475856c94c9e296ec990a240a0d331fd0536d0722cebe172aac5afaf47f25e366b9718e26bf79987f9202a9c829c20745c35d6c2e852c984ab202a6d556dcbc04de62c74ea6ab2212241bafdce3345136362a721c1c5c2019b6718b0a7e736e5acc00333d014d7ad6a56d040afde47d361f19c93947b37c97e24d47655da3327a9f594e46c9f43c58991718232130a546c03cc0c81ac3b12e2361222ec87ae6b40b951a126ee409e849cf57c5d66555399ebe38e0b95e8b2020b79363c5fbdf73e0ddf2d0f86165ed56acad1c83ffb6a1192ce5941e28d3270113c5100fa50a1ce683430c4301531c6e7b1de339a102f4b0e6b6db4f23b16b3fae68f4426b151783312d294e22f330dcedba593582e6af622e1fa298f97de5d2f9be1593b7786e33ecdc2a6ea96b036d7e882fd37e39681fef2b7c0ca90f464bff5e2a1933be6d8547859e972b94957afd0d0695ed206fe0b75fab9f04cc21ec242fb26c8c09024949feba9f5daf4012e25b6deeb4f25ef105f223b0c7d71fbfca6d43f5663f25c5ccf86c15670b0434c33bd77cf31563bbc19106981a6557d2e29088d67c468b07edd397aa99b1a6424687092c6ae79045722b4215280d7ac5f07cb1180fa0c91404b1ffd0c0dfcf0b41d1dfbdb1dc6e2575ad61f401f1f71827f541f9cac859a20b6e699450c1813eea20903b01bb8c29c003e2a4fee05091ca637f9e1fad0ed0227512a2a36bd7e63aa3f66b388bb52611d2e246c9cb591142f0373b06edf2c9fd78b7978f6783a1a7f090bf18bc5fad13bccfdc237bbf7cf2512431cc7c5430f313f0fd7d4884598b9cb2f8632099dfa4836a4a99296f0b8a347754e78c3e08ca9216a0423366b4e3067e76da5298f5aca1827f1d4bad6f03fa2db26c1c2349f32c0ba210bbcf835823c8c420880a0c8ab1b4824158d21b1cccb65b6167bd85c21dda6e3e50bdbccd0888b10144041e8674e3036d6a178b31d18ec327ee9a943954383479c93fc21a8fb543065b21654a118c13cc0f2c34c7889a633f4904931d5ae0d2405b973605be9cd9fadd91536d990f5974d7970239065addd0db7ac20f966b58c0cdc9f814d94e6ad31580f27424b7189e1d3b7976e03d52238ff767396e1c4f92966747657b04611fd9d63fe2e0811485ce948c095fa66ae95417786cb8a647c6074dde996e4f96d5200fa995f495de60bbd321bfd2ae379cda28fc82506666f15e7672fcf57298bd7c4b90f62d4ff8c2c8ba5ff6d285714264c6a6821324f29d794f9c40a74abb0bad2045c327a35cac25c12a6f60f64e035be2b0b92fa2ba60f9e53e183229f99d0b399168174bee85f673526349e43440e568724b72eb475515c35feecc644627f181723da4c27aea1a9d9eac2474b71bd45675dc744506bfab468cf8a0dca0b2b01c517c37ccef474b744b3baf5cc8658444a1c87c849f550b08a2612abaacbfee646a1bfb6a41759b1a0b44c0de52b38311ac897d613c277d5efcd100404515274294d4e93d9c1da388c9def1ba4b5fb66c18451f11eff5a5e4b25f62257a84f12aca9a08de493aadde18408532f7646c6bc75071a17773b2963e8863a8ad04f10f1cbb87670858c9773ef6195aadc4062e7f996f310e0f8a4d4aec1a157e4fba89a2646b5ecd292a75c1106a549dd58f3835089d5b00e074a822f49b00a10753b5bfff2b12d574d4e31daa9faf8a9c348e65b610a61d3f22769962ab6d4a853f17c532a59a29e36f93ad5c9db2ecae4ecb64e59a838b57e599d04719246a41ccf12cd3995bc7766229488946189c972b15ce6cc5924798dd989f05db20731dd2d2cd1f20a94c1063bb75b9e4832d7e84d6a1a4de7573e5673f217bab3320e470ad88db461ef4a5d85e6f00d782b8db003be0c420cccb532a782b8608a898f451c96fb7b92f3129d7a458547f8a928e373db2134f70a36f491a42164b162ccf162496645d1d8d9c4158ff59da588825aede81c172a59ac534ddf4a873793b168c1aecc059d8b5dabe17a2b865b1d32d0dd6ff646195ce9e5f07f684ff2394ce5f6e7f449b19574bf66df92abb02ace7520c1a4444789ee12abb63d8116024c62c7abb87e640e79ef8f18d96462fb8dd631a940e300c2ca9ade500ba0aae6152183d96bb6403537878613454272ed7867e19cf02678358373aecf4b66571b0f83f850b5a7c652e674ec8269e56348e02be54ccb12db18cd69b23767e7269993eeb8d8c5279645ca11ccccd3d2fd1da18d5afcb718d96750f6bc590184d1854c8ed27ae2798207ab7c2a3ae29907e1eff4235f7ebe8040cb990a7051891757bbc9593d08699c76d50ea016a7aaad68870448f34eefd45660204fa03d463e1c6409860edebcc3a27cb4b508ae45cf2d2acfec0d91f51c4fbee0c1bfa261c1c47d152ea3a7aff3a8f065a3e6b192892faf85a03efc5b5d6336941fdf590607ef8acec096c22f39fba11a00f6672fb08ddd888788025d740039f11758817a72c055ec1889daaadd3e73baf9df1625a0891e750604b302069619fc0036ed6c53ee25bacf4ca31e1fadd68c77ae542f70dab8826b00ed10106a541f99b5f54a5fbabebd0d991ffaa927fa78d560add28fe08fbd66145349c2e2591ee4aeb1dc256fd4ab7352f44310240b89fd3bfdb9d289fc9d437379c36058bf256ac3a63483b4e20bef9252c8484766c03d68ae5acc436ba65662a80b8ccb08de04fdb449cae5ce49c4319e60f5ce8fb4972ab858ad2e602af963f92054348b38249379e1ffabb2df5b9c220cb702f92a7062177efe5bcab725c5e53943dfba69f310f71d429d497d96ce300ff1bb5f551f305fb3492fca17de04273f2bac0194baeb838bb000d2556aebe7d40c31255ac6536af19b34a8a3a040718dc58f167d3d16551c87a017f87647a27562ef4830a5c0430b673508dd90c55260248731939ebc4bdd7abbfe6e5e081fe0009e79371a580ddf7e0717cb251225f42b267a87b675ddad92aaa3753463bfd230b8ca0421a22e61f57bc33b0d0fa1a2524643ea262cf51251f016a331f29ddb3d8749606f57fb6584b77cf6b90f742b7c7b4bd0c0161db3b173bc0ba93a8f554e5f09caef6ac7e5139112a92528ea04e0be8099047c3e640f55db57bd8969c0b7b5a99feefff4d60fb8fad07eb142c21c519129a669825994fcd0acec5602c9d0bd3b59470f8b43d8c0b730eb4b5dfdef619b2c01729bf2d596bc9125db0774e08a742d1a6cbc53f436bc485b1ba429198ba7cb428f9bb216e6efd17b20676218157afef3f81ed0734e471f72d90250c17a8dd75614ed910756f64d01f59be57060ab23c484d8f196327c48346d1929ad0cea5c8ef4e918a2584c625ad33ceff46f8952f4d7607562ffeeeee633de6d7a2fa421ef27a980da427cff4d45f5962c1a70d6b89b8ad58852aab47af230092d01cd60c98321b4aeddf0027da7273549306515d914fbc4ce5cd25c43ccb5ed24379381801557f19e1d7d2e14ee0e256d89ab0a422915727d16cde6dd128d9d03d11b51d5c69d7135534ca6aeed8e5b05881fadbeadafa458af811c91757f29e1cff2a0c5e12ee76c5f5ad9e80c4d7798fea8bee7b8a3dca2e66e4ae3980c203378dcd52172416d9855a0d0038099755298a1ae0f0b86acc3392c5eaf17c71bde76a3e32f3963e470ae263c00438661afe371977a22442d9b837b99251b354b08784bfbc3e21cfc5134a2c68a94bfc1b8027819581db89aa3763b775864d27c978fdc8746b1ea82581d063026a2ca293561a8b1c0decf1076a18aa4fcbe73837f959b7ca8216874b03103fe1a43ec22340878ea697d5d770bb87ecabf7d56bace48c11aff6a9b08309cb341b7539e3c707fde42f72c2166a044824360e24638c31065ad1b82692c0521a8871ed51ac032dcce313f6510e0a4160ce97a3deaa8e68eb900d87b7c2726ef86962376a7e36186fb9175607a6aacd97b7c406c367e85bf8f9a6355da3e167b538bec7bd541f191b1d2a0176dc2c4832138bd293b54c93dededf8410af2f72e0e37c4e033f3f8980617a9e2f4341798a5ab15a798d1660d4028dee75adee4d0af74649470a228571e9d94b594981a70a84916add37da6026c110e9bfda93072314f35a18f956a49698bb5fd8d12cb481e51ae5dbef7b5e53222c570be1f9955b4fc03d825b4061e195b5ffb07b9eeb3a750f40e848b817fdf24694282d0e17fd0fb860811cbc7565c19fb4592545b8fd971aaaa25aa548479b6a5babdaab57ac836201179f129a1333f085388eb3986fefd370dc56b88265e303ed6c0c0c53fdf443d9502d28835768ec33cb110f7d9dd9ad3f01c39d6585f8cf0b5d2aafd279c421edad415dc82ca599c8ac29caf5d6435e8cc7f9a52ed4cf5ec25372c543812469789f28fd8d8d96072da1262fc9b892ca149acd93dc58f18fdcfdf45728238554a64821c356a1ec56461efa9926f4a5e509b7715c341f4eb15237c60eb4c7e2b41340a0450b4d1c0173e7dec2bf4c0a7248206192cc37916e860be965b151587766cdd785fa005d0b20b2357bf7717ef8e240c619e8aa01c627b16de979b3d56cb8191983cdddac1893911d6b4dddee1591f6a01126d65a492b11b074415e2c07590dc3f015c1182b92323d2ef456a1abe24fdcbc12cc4f17b7734be358be389844cb19537b0527a42cc7a685c4bef8e4fa2991f0bebb45d38ba4f3f44cb51b3cead60c764fb02760c51dee1e32a3bb671f67585322e23e86173630c0413383e7335d77df0a96d0ad6a6161aa14a4d4815a3d7f6cb74c4337da781761fa92a77e06934966e735eee1f9340410151d5de5f0247908ac95e60d67ecd78b9e0794afda2c47ccf319ba1389eddd974eb73c23cc763b884de374cefb9060dfa5ffd031ecee0b1119600ce1d2d069986bb1f099c0b036b1962c54a5ab693fe44675bd83850079da9fab5f3a073af9cbc2154779793ab22e7225a272f7dc599386f61ea1a2c148142d37150ace6786b2ce67caf2fb90ff46b99a616fe544088d99d43549b818211980f5e374d0aadc7b38ba7162aea7e785548cbda4ae85fffdbf7afbbba4384c634bdf9f97d2f1f5bd540689501364980a0e47b9e9985154f91ff9407dc2437901b9ae648fa30021fc638ec2af60846bf3123027f2bd07e508da449c3a90701a4536e0781313defe21cb11482933251afbc50b9164c01b75f9327e7ba850d458f7c5c27632f825c9c4585885ba9f735b8ba78c2b56740d6abd9460069c5d02aa71814c5e4010424e079c48509fbd9d87254ec77dc26891177202d14e2a3955c91b46bf28b6354fcc4f99f5ea70983f81cd73b51d11e662407fa4dede007b5248697cfc3e000c01690dfe98597fe37b1b3714289b67ac7dc86f7b77db724b99929429b704f104a80477766dec707148a66463078f7b677776efbd3317a14c9d973017b219ac07180960383c2d2ae2869033e9d3592ae188e082f2c4154c18d8d431ddba278a3c9564aa2ae6d9e83bf2672af98ee9c7dab1c88b8a6e2fbae8e26c36b3b163cb8cc717fa640bed2189fab0042d82c160303aa444049986408623f758866c48b52dd2e7ad20b1e5615e248aa2488b6614082ba5052a5a24d222f145175d74d1451769a92864a2289b55516294a468ca501351f48fc5542a95ab602caed2297acc251689f090cc61be63c23277e46c478e335a98f9656eb1b9154571c8771e3063642fcb2de2d0c762624c8c4df1b38781cdd0bfc83136c4846886bea585c5863445c533994c9c899fcca0cc4cac391363be3391c4c498288aa29128c3c58484a702134a2975efee9eb5d65a6b952d1a5488ff7f57ffcc1f49a3aa2bc4fa081b0c8e87367c17a539b42d2f586bdbb61582a769e34c6c7928d03b27744ff70a3f9a2a5dc75f69cbdaa75572b6eb68784ab8ee5adf29ae11030c8c90439c40ee20ab136c249bcc1df9d32f2cb37665eb8f9b95c8de9de04116a315118ac9623c82c631a8729c4c867f51fc9ab5be93a5a4f87f7f1434e0ac22ee50074ef0f6f696e0cd04df91220a5246ad76fb82c2ad0341e4d7a13e35a48c897bba19a48f7529a791283d294ad143a186784513bc6bed6b04293d51fcc21c9b0a10701cc7b54c06050f1ebe834307997ee5e13bd68e76a45f47aa82ab64085f69c4b2d609a5b4d24a7311f1f0f0601ef9f1d42aab9492561a004a29a53cdd0326b96bd624ed56332cb72ddf0e494e8e0b735a9f0b3826332546b20ad1134e26eb3b6b36c8646fefd4913b3566f774cd09b87ae2ca2cfdaae47e7e5923fa407804d594a83c0de2314390134ab2224231598c870cea710cca525a60c4590b8ad6de60b797b5d676b693373b4d34786a08811ea0943efd1e57e62a3105d2fd218b92d2ffff27219aa064d908c857a8f29ee5d7e56971dc45e9b04baa586d569bcd66b3d96c369a1a96bc49cfa3fc87abc96469562b666a561af8f1bcf6214d9d37ddf6530d431d3434185ce9a8c1290f955aa1c306a3b00dcb632b3e8cc23658e8c3365f0aa750df89357540d64b524cc3bd3c13cde42c57ebdb8fde99424cb57dffcb9891dbade5184b7932cb32c7fc566b6db5542adab79a41a81431f43385101942fce1808f98ec47ce600508db8f47a94f4a653fa5f724b11050f020f4336f3a1f23ab905c1784c8f94ad22709e9c3e15aa4c6aa8ff69161a45cda409eb8d29ab5dd51a5846f79625aa4a2294dd38fb5f7ce94e40d759bb7a1a10a0299705da247f754fc61be4bcb98d84bc798a69fd7bcbd8cb1623725a48c892b8845ca903f73e63b3f676f4428d631a69096f144f20ce336d80de6dc57a5acfa7f251ffa2e3ea890ffdbed769bb79c6ab3b1c1c3906e45c62f5fab1175cd03305d92268d0680182e872b8f2d1fc4b1a4945f721314aad631a495ae8d58c669abd97258695d6925b55cb45aad56abd57a28c116a19f0c988e1065fe020c068b113d293214246b2294e46130a2144e5c180e3da59340c81e2409ba2f1216ac1949605316a1425c6bffe9ffd75abf4787bd300c433725d9bbeab24dee2a56fd731c676bc51c0854bbd51213ee31752c36b1660fdf913f9d65e1e8b85c978d2f9c0dcae1ce22011934f0be1328e528e59842a5505c9696c6a5a571694ca152282e4b634d0a75023f8f86e6d6d0d0ccb05e1ac8174b9c425dd673014f2770e9f34ee0d2d2d228e5f875266b39eec32fb3349868e84629471a6818979696c6a551ca51ca71695c1a53a8148acbd2d29842a5505c96c6142a85e2b234a650291497a531854aa1b82c8d5746fb2914ed5228da9530b3657574e9c7142a855a1a1dd3cc9f203dddfde481cd719eed4cde079e64ee0c4d0dea53a9e04085940d7e1256b9111752a9542a582c52ccdb54e23a2bab54e645dc572b10a8c32b160b9b3b02949cb9f3e2967164b1484d2c361b0b162c6e5aa06646d3e8c511a9765373a52865b1c614681fc78202064ee81e19cc005be31cede346264c1daf7b4c4832d913a427376496127b0002cdac58b0bebf333317df197c71cd6a0e8140175c32651f8805fc64bc930dfc6c349b5846486ee44648b22732d993f9a4a8a8850b9a24e24c9e96a32f5e80408fa977b893f867d8b13a09674448e845786791196bd10204aad8c50743465e94aa03b9924996ed6028896c68064dd88b172fc2ee9e53b646463264b676db368b5c33cc0dc607e01750e9839c6fcb38e6c4f87c25b1cc70da6208c08454abc9c4298aa128abd0aa003819df0c10acab6b309e369231dec4681f37cae91e0efb282b5a2289aa11677d947d93f1998cb229b359abd59a0102673b292e91424c868666cc980142081505a51e4ab2888c8100020821d0a0b63361894b450821844063004ff3311c36680cc05fc9279938138b339c414e3880afbb71efeaecec804016ef002db15baea44fdfd626423718ebe880401dd6010f309be7abe1c9dd417e98e3cc3b753adcb58f8fb64da69b4df6954c9c297d1ec98bff0f7b0ef8f89db4f371a0e2effc8162ffda7bed94d96030189030317c12872d2e32cc185923e50e294676982c5b0ac9a59a8d1c6292a584c1602afc4813c84c79132365bf66912ca51c132583f8a70e8f0e08b3ece15e62c29a3a17e46e8988dc81e92a625ef85a9029b661bc84f1c0b54982041b488211207b2d7bdb9eb20ccaae8a8d62d692373f4431029bfcf8bd10f48061c10d6eb8410c90c01811213f9e3539263ffea993b22c14a16acdd60c144262160a304240226c322aacf049999d5a8879451481320c31898e636d20d2d13c2676ca6ce2346de2f494dac4e9fcba2a13b0400465488d881f375800a302e48614252b416644b622455b84dc18628c727362c80d22642a03c06e298068cd56b843162a4a64b1f242873b933b4a96248cc8d2c48b24ae4cd08b1bdc0bc307395c9a1b865c9413183029306e23123e8c4938398c4e44318a995d530b3831dc0fc90c1fb8dd8a830b19ee69042c48fac105946b734749a221d55e80b99f3b4a12521049361843dc2f7794a42c2ec4242fb0580e6aeac8562a779425885a4bb557acc8d1e10f733f2b28ae3ff247822b747c0a8e2dfe562958560a8f6b4dc04b695ae155c5dc63ffa16354faf3f3d8621d8f2d4b87e31af3a79f748c8a6b4caeca99d18aca95b439dd87f45e36b7784c3127574aa10a787dc34287fb0aadb53fdc0659426e63990f4ecab55163864bdc76f7fb7d79369e9826a960f1be6e60b8af36aae1ee3e6407dbf4e1f50d0b22aec4ed3f6e83aca1dbb8c674406a8c104c62c07de34d164bc96d2ca7c441e99dd6ce1e8e54a526b9a2f55818cf6a59ed58c2ccb087013e4bdca3d216441b524a2965ad392d5aa7848b2eca66559424299a32d464766777766777164700c8159f26122560820387d8d0223ffeec0e47bcd793c58911a70991217f8b204fe495ad159f6007140c65b9c188177e2af5916badb5d65aeb10b533042830a29fbfa3180c29c84e72e068f2eb60554858d48f2d41669828aaf9e1e57a31a2f92166888c6d26489153134a170621b00922991b867cb4930e413c116c126412bf22221d0e2f364f052d58946ac871da8816645758883511c3d145e9080814457028156d40c85864051c369821c1d104ed28880788e0606244e11544a31caad150b8d9b25feb2c094c98e4aa88b1706d6cb872051e82d89e1283a231bb700205930683c18e44d1a202203da50363a6307eb860ee285aa49440cb0b5c50b95cee285a6090e40a102d4ad0aee78ea265091b19b4b828cd224c6389e90ac79de30548dcb152e852d0414787254ee1c76311e6be46c8d415e4ad706cf10a67e998d8aed0f1987ad8b9cab231438a9d5563b278b82f55b70a5f61a68e5f2d17a5dcd13da92c318feee964171e93b58345140fa878078bc96dec49a1e93d4154eb110cf4e8b0ffb77c3c010d645abf8ae90a02f36b4fffc71d6b8489232d0f0eadf4516b25eaf6705f570292a7016d93ba8bdce188dc12db2c16af6fa4cf8ce57eefb4923f3468cc90051357e220b7cbafcf7d5af54f25e276585610d79faf62ae9a2a06575cfd5692c94a12cdb062d34a369961ed1d8e533b9b7cb2c4e7cf4be6563672a1262e4dee23159a6489714c706b721fa9600308ee4cee2315845ad0eecd7da4028c862bd325044209181db81f0c421e6e97fbc8470b4224d73b7231c68710889323372a37dc0f071832a8618ae8c3f5721ff958c104b7e63ef211a44596cbe53ef201a3b9a37499511bb8a74295c245a3e570d16834174d872b878b46a3f9d72e1a2d878b46a3b9683abe3f4551dfd5c7db88aa48d009aeb9e3a2d1683453cb90728a0aca08e1c4613b2146feb8bd132de68477174d872b872b29c9f522486fe58438e10c1180c879e9fd2d9ba391ed235bc68cc9d45d8a31ae5f07a8073febb2b56b1b756e34da08a12bfc2b8e42152b57925cef2e9a0e570e575be92b9df4d2c33027c4e9300c3f10fc4cb7939886735c2fbdd58a31001f12bfa40b395c345a0e178d4673d174b872b868341a0d575351f46decc499aa2f9c2a3c2fec7a2fbd7be68781a9232fd05d5e49ac42a680219f913c94deddfdffff9d524a29a50fb8930419ffd34b7777772ce54bf9ff4effab1e67b2de75d6c479edeeeff56b777fa7a07cc09ffeffc6656c58ab52d15a2b5d514a4998f7b3dc8dbbbb4b4ce9af7000e4631266f84e030306954c316d3c95f3a8fceaee6e4b6baabf97af1cbeb057ba12bfbefca29452fa2ffbcaa189dc8ca59452eaf8e5b793c194524b29a59452ea81df077a4aaf97e9a8dbeeb7335fb9ee6a739a46536b28eabdc8eefbfa724f2f956259777ac78425ab9b6567284daba69452fa1ed8e0e1779f3add3dfd294f6d7116f5594ae9d3cad98e524aebed0429d64c1d8952eae269e5a03ecbd9f99da9ffd27f7de03bd269becc75758cc63cad0f3cc9dc194a29d8dd327786a60675bf199aff477dcdff7f8f4acd7c3b5d4decdda2391da331a594524a2b4d0d8a529a9ad286e2d777b516d72a3357ffdf4bf1fd972b255dbd5ab955df2b85faff5e2bebaee28a1072ba7b6581edb66ece4963ce3973e6f4e9d3e7df64efeeeeeec972ef6a55f2bc39a7e339fd954657ed7dce9f52cee67467bde69c73ce39a75fd895787e375783faffff9cf596ad7f73fa4c25c5e0e7513c29ab398eda315f393a865677ec4febe931f8d9dbe3563a660cc5e17dead0ee6581ec983eeddaf5ed9873bc9646e7bd3e98d8c3691f1242fbf4c6f3f0347926fbada6d723db9b2debbb9084d0860b870e04341696bda9b9412c83db08374f4b75c3803bab9532bae72439cb8194b21e012d63e21bd646a57d35dbf8367aeac84a95bca3bf338060a6cad10c3c7490bf07c9165b9e34501d2141fa37412808216a803283211b55e194ffffc3c712875454ca01c8145b8aa4859b2e2f9e40e7883f715552c5c95083235fc28f5a95e106a2039951f10521b38420e28b1c3822dbbe8d1995109bdd2391680890a932c00c63d783aa735a29ad1fc470054a7e61a32b5492ae8c30aa5c8162063e821a1331519d1626ae787de3b5c91b00305c4e04dcea9e1499c33cddd399c31cc7610018b935b738dc608bbb2cf0e3e66648cb6a750cae95396bf220777409c575b524667f28e7ab1a8ec3e15fcd9793c3129ce1309e3a26dce18a2f873d0f3768b2d85911086fa898a24409b2ad768616638badef38b6f8face636bb15d7140826bb1c53756646c599cfde1b0b5788696e369cd90c3ab2188ec0e5ead153f9ee1062270936db7188fb0a0851147a0c0d8e182b98f8ef03074bfdc4747720899dccf7d7464098e0bae29f7d1111a5ccce0080b2e5e7069c2e080e0aab0d4702dd20b1a2ee782704603c2881035301244d1f5dc47465210c28c14d9c8600829bd69fa899a4f2557396a6f3a4085bee3d66788ec58eeffff2d27f32f4ff3ffffffffddddbfcf1de3ffffffdf29a51eedee6e53edb8eeb6ffffefee9cbbc9762050e37777f76aa25e77ffd7dd0efa9ffeffdf72efee52e6ffbfbbbbfddd5be604de53072e78b2bbbbbbbbbbbbdb57afeeb2ad34cf39a7bbcf5ebd26276d87e7ffeac5a2cf9a33ecd56b26b7cb4e8b27bbddddfd3bb7dddddd4d83a3ddeeee4ebbdf7ac773ff5957a652777759a9bbbbf707fa40ebfca4ac5fdf7274e94afcd57274cc3fada6af6368fda1e72a1dc3d9aecafaf5e95793f7b4f6f7e0385a9fe3f073958e01673f06fe7e4f9ececffda9d71e88b912d3ff80f5ffb49a68db5775d8a1b5d60567bbdad3e451295d5c29c1126696ac3779ef792b5f1779deac6eb735752bef0329066fc870ac578ffc2c1a13ca4df8815352d938373ff89dba6350fa2c21acb5f7fe0dc2ca580b42ae500d342ee46082792f147102222345e6c8080c34b2966bf04f1d1f138d23188e589c2c13832c834f2090cc494b11f80211ca046c054e6ae311413c61e445952317828e8488744cf95b1c872d132d20c95c01321d8283231686402ff2a53c62416c2d31edac90447eccc18d122b1ce5aaca15ab00816a132b5635638523f9710a10e8392b5768e48a6d40a07a332b12829d5c71aad66a73ad15dffa43ae18d72752a6a88043814095e21a2247e4a7921fd38040bf82232235cc1459f98b45e6a60643029938a8d4ec5de88e1136400013170000180c0886c3218118071339cebb0f14000f4c783e5c5c2ea48bc3a1481003290a63200662180620c410630c610632a8ea08003bb571b1b5d28e6ab92538f456f188d0a93bc2db4e411b91dfb7b4856b84d6e480282c8c87b213b860ecba34d473f9b735bbfbba91cb070e27583551eb3da938d2af070a9dea78e31d45ae15bdbc4b472bb0e231cad3c4b1669cb35b5de25156c939cf179ee56638e10ccfecb6a85f71ca3d35163060397332c2b945e7be8b899d412132c255c1f44537de41fec2f8aa318cf66b4d8990abdc9bc6ec35b76dde7ac80fdc36a53e9d587abf2f40e01e3970815631636c60ab0a1156e1d4f90f3bb46b4f06b1e5cd616eefa50cb268764122a6fa3d35d117befc737f84ea8b99db2c2b047e2f1df8604004e03229edcb7c70a7f661750314339dbff564fcc0e9c9a593a0df6f6882278635bc7ad7f242e6bc7fc8b650b4fe4b03d8bbb5a6a20cca8cfb705ff2d320d58f8250d4e15356a630b331527f21d78f0b09784f078618b31f88b506c5d3532bf9d045cc023420f54490e05374bdc7cf38d30032a38b8a40b693497c3e92b0198836f00edbe47f10128bc16a040f0755a466aa3360164d6d76a313e9451b5ccb67e7a33897cb09c30f710a3d73ad16548444cb207e87903444ee736dbef78077cd2f9adc6e9d6d3ed530e1a06a5634c4d4df1e24d7ea482951f4d033d2e2eddd15e64dead564dc9fccfab1fb39bc2e9c18b095510f64e817100070a66a3277ae0f11241a121fcb9dae7e9388d17891a97f1a180b4c38bd1126224e5b5f1888cf60c1c7c3f6c8dc5c77bfd82b912b1b53194cbb4a049af1ed9f20d4ed3bb4663028c538739f5839151ced87d66d92105c67058f6ac9c9f2c29ff0bdaeac1800e4455c7948ca6556a6abf7ff36e1a195a095bbf4daa9614e0733785d569c6900a7456c9b1520e50b3485d0470d4c4ffc09715281b1227c1a850f98634100e43b1cb279f1ef91e2a0a7458833734d31443a01cf2af6409bd49ccda11d47271ae8d5ea0e2b1df7e0d5b9e358ec19838921dcbd474a9b967b9494b4fd6918deead420956a79bbc567fa0f0f1736d0a0c00ab61bdd61fb4dae7c1c1dd7fc32c05bbc67e5e4884425336fc30b1fd3be75c93ed4f1222ea65960f253ca2846d2c0f4646142dee13f2dd0a4587877bb31b64186d40d1983b70503c40c61f9fc363133d3bacfb6e5a6d6eb386ba0c6d09ed88f1daf1222abdd5a1fc352bcd6c50ff4dc9dd38c2c09b5f1fe02413f3673684382a1dd44ecf827e7fcc956669913b75a0ae217bc764f8efb0a243667170f49b01417109bedef089cab7c89c627a9f7a7cd11493dd61ad6b4764e46300cc5ac8eb08f3b448148dd44a212f5437073bf71efff21b519d91fcd1729f4fc7684d2824d965102782691e37a21667a4a99c44e0950d4c7229be3e1faf9d1031a03029070b454a7e32543bef3069c915bac9b164dfd320658d64a7573dd8875b1376feb28e972e1266fee6bc5c75bfb808279c340a64e7c16e01d88954b8a5e38e6411fe04adcb71e5b9b20d20001d2c3b3489378b067930d9d171d2166ce7b6059692dbc6b14fdcd90ab2ada6cbdb63c0177a94aa6ddeb62a3139d49bfbca036d955ca5d145d29616274e6074620e8250891af575cbf83f6842ecb19b97a1e8c4e684d010dde9685cccdc21916e103fb0570e37e309a892693f9af27a698227b21cf152c854629ca0b34cc9a11a5b82278cab805ef2a2fb4aef2a3de8f203ab31848683d4360d87393e574bdef9e349ee0a42f7c1e13f0e620d005ee4364af3269467a237b46bda1e525da1d3df2495a4cea457a4b00acf0597da411502a56c7e9d3cc79a3f1d3096b2ee52a95aee1640880977a17450e8546d5ea6f0808b0c8f95c8815b50ab034236e2203c299503373d5acb9164df38d7cf932b14842ef4986b174a9b2e4b87f125d2a8ffd96d5517aecdc05c5158177925257489e9d90bc2cd2d0a534717bd0b2e8f6d4444f5464642f883294c9468ce820cab0c1d66012be6bdc7e47b871e7ee9bd53748e9f69a75a1895a1ead7aaf550686e75ceb529576945f464141c587a4cb3204891a18e16122232c485208b71c93edd5ec52daa140c96dd4f0b30dc7845f615e34a5a515e7cdbca068b8b1767bd0a3711205ba86ee9d3466d51622022cf2c34f7df617bf6e2ff800f9fe85e708b8417cc4e8943b75ab91e2f0117867ceb8c38142b34a2ceb90167101b8de441a66b77fd6e96f6f826d3006654bd33989cc79ed8582d574a764fff390e2e84a2aaecc89409f8dd638dbc1c3b482b9ef0f0c0505acaa620c53473345c9b22df075a3130245c7c962263f3b1911645aacfab545a1874317034359eccc515a07d2021d340647c1d7cb00555ec111cf988773c93042087c75c7cc67b354c5d2b3325c5cc260cf05280f81744499cb1bbf2556b89e3866e94f2fdcd9a112cffc07d51feccca81b3640ba1224109303432c4625229f5e8d87c620118894ce78261509d979c5a7b1285229d5c3cef4e688978c40558fd2b6350d0c15359c7e58d328a8326c6eca1802fce969b51ac6fea73488359b3c192ff8a0ad9862a79f2cc9463e5957bc0008058878fb6f122f4dbf4b649f0e61cfa6520f9df547ed9cece0d4cdfc2ca233347ec2337e9d0bb503c31b3c221c7080c828dd2b5439409105a0ebf1bfce1bc31032d85921c6443319c7b75c39cbd2729c9d510ddd074fcf1c422cd6adf9c80a7c3f4b091a699d1e5bec8e3bfab5201c630048b68043c31f3b66df91beae21889687aed006a7d745e82c50943cdbdeac4f3ebbb56b81c14922723d8f1e163ab24604b350a78632168fc3e30a1ff41d0073f52684cb9f089405181267286c475c016b33f306eda46ac0481d4fb529ed3c348860a38e373818b30e32f97b8bb124a366264276c5c5dd345b9b1fbede1ee200dcac8e02e2fee8dc9537f0c9e715fd6f6554e15ff007cbcee52bc1cc1e088283179a5adc121dc5e240b593518c8defdc1a41a12ab8ca33f19833ad77a39d0d80c2326f993ad123838a40757650782cd4660d175a2ec5195c84a008d94d24a6c4280f6eaee278807d2de44401291366e1ffb067dce109852b637b10695bd1226258241652a93be4959341cb5131f29e57c7ff4410f8551044860963b1130428e467c38a12858bd45a9504565d01f6ba0c901a2b90acd357d4e0094e1bc5e08ee580141088ea9d41bfd321ee81d8b055e759ea417e1ef71aa9f3eaa2a9d730b028a003cb997062e0cce01c6842ca64c94693d1a10ef3d0ced97afc87991acf5cff9fc785f2a13632caa1976a054221de0d73272465f2ca3eaf7f2be160f23a6a61b8a24b5b6b2283ea1ea3bf40f20c75d8de09753543dc80730bb09e6df2515280c52e3a4d0861da1ccf871f04f18a15cd8b00ed03fa5da1a527bf617a5d1e071bcb33e5f66559a8dd31801770a34e0acd35cc1882befbfb885f41bac8ce8e1bb42b18c16b5d28ac308b12d90a1c20f01c405c8e8f5c38a8e3b09bb614d92bfa3cd07b5f55ee47073e6601423ae0d1cf349a2eb1a6c3bd4043e8b156d764571a3b1eba08519a686bc0ba4ec4af54ade220078b463b1cfa3f5051854869fce246e841b834ec0683c589fb5bec071f3642bb2188dae89042bb2cae7c6f76cd42d1054316ae824c36750f883dd77d3341c56f9837ffa0c86500de8a297ab5621bc4162ac042093f2349de0dbabe6e93cc8a00978113b173012111db42b857dd4c08cadcf8a9f89443f87e9a8e5f46a5a5ea26e805729e8b8fd2053a2b84de1f9794b99dbc9c076c166d61b321b68ac2ebae1343e839d7436e9b27873c26988b3b56eed102b978223ede406d382c081d5458164edaab6c6da1407a417eb380dee5721459c8e641d68a30319bd2ab71c5487b42b07d183e763c98001f6d913e2f1a2aa269bbf0a462c8c10ac7825ded2b39c74d3e2f344cb2922bc3f61506bff128bbbab4e6a70257b0a5b5cfe7ca82c838bcdd291a078233da2638400e2b1a1a1e592ca09c584dcda74a0fd30ed18dc5121838921208750de5ebb6442a13e42127b3881d997329bc0223bcdfa30a29430c59b430f5731578275dc7a8b4e50e2e77d0838cf293122a9a680197c2e03cb49b35d70cccfc043cb5876e4176adb22f4905d8bdc2cef495263851d456c36deeb236c50b70cf770b28380ec20c2f6b9f9e4108759127261bf535613e42e2a3767e140bbbfc703f919427277591623c6141a4f50583eefd812f158edd7841af0d01316d1bc3e8631a501883b7328caf40244e9f005bf83c6a7512a4f51ee94de344602d96f05140fd769a3c351ed80d9bd7030dce6b9c0e913988a4f0b2db1dcc8feed0dd28253b91e57d19330738ee82f9cc5890617a47ad0bd3d229c701749d200d2eb8063867707fb3466ae9a72e7bec7df4e2baf69bf5f6ea0de4072a8c3280e008afe7617cf388fded2bc9411892cf9532963c4d4f0a888f743a98f44ecb7fffba61941e9989f0002fc604a06a4c00562c8462ae47d433040f0d1c90891ce0491294c4c5c985bca61919ba3127adfa366db86b6ef2433397c862ede49572217db7d3b21596af8996ab62446dd79eee7239097707ae3610d7deb6435c9bff8e6d565eb652904d46badbc1f11e393ad78ecd64033bb1594921301dc629dc529fa815df6601c1eb1fcd4439dd9a409a59c8bfba4990940a014137357311a94a5e73ee3ff18abe813048a9e0d483926f9bd68e3d9e5490b35140b0bb5e31ceba77ff8396bca321f38b385b902f493c3a5b5bf7e9afcbce86fa1e7cc3e297270f6a68952e9fabd6377b0e946901ad59895ef6c34dc4aa56a899aedf3fdc0d14d616fb08a5ecc89d2b333764c38a07faa87460d064f557512717902b37029eba00d92a44844a117b8374d5153c65346b3e22ebdfd1c20bcdf030ae244c1770ddeea3a86995bebcc219107f897339b5269ec8e7cd46c53fc1b0521b36f3d7c94db3e2675aa9ff644b4d8ec76b75d84f9f4ac72cde4a7c4e034b2107a7081866484a7da76656423629593a7ca81c1e9481d0d41967e3cfe00b44451936e111ce5ac1c2c64bffe56c05688cbd1a1be7a025db666b0d717ceac7e7f6dd15347ba1ea26f8d3221e68764904a5d1ac3792eec48b8d652a0e3fa21a4eb727717638d83d3043b3e7f4f32560439dd21b809d36ec81af37ed0b55d1b89a757f790d1a397846d84d5b46696a3bd6a6d12bd68ff7851486b0db7e628759e7e297239afcd881d99ed3234e4a13de9a74441b28c7691985d35ef3d06ea8b388adcfb0ceec20831ada9eb4e3f7e7e6dd1af5c29b9897ae57dba4e4714a3a5d391bb49c7672602934d403e6b483f49099910ee98983ab6eb252ba4267ebe742cd6cbde53de7b04cce4cfbb227c4dfe72f2d82c7d65eae4a7e3ec8cbe9afd0f97d1a2f56a1130635012ae1222b38d216204882ca83aa80131625dff0abc2feef24b82846646a9ea9ab2af577da7a720dec7a8afc11a70798c9fcd702503e217f133a1557a6aeaad46f3f2ddab59050e300515f8e4c9bb06a4644579f066dff9407293003862807bcb2caa5d618349f7bd81299fdfde77c1043f7777e7fd5a0ced70cadf7cbce5588020a266fc1fd8f6c8ecd0f50d3d056eced0e95c5e6c00d8b4dd0448adacaf0e69b5c067607177c61748bb37c4ad6f02eb6560146352417555edb29d5d1616a799ee5c9fd5c092ef97f9bc92646a9ccae6bd7324de5812d5d5ab96a29b07aaf86a66ff0b7e4dee6fc8d26a1e92e2e317991507a1bd22201fd552177d1e7addfcac2d686330095d4be520e15e94cd0903b5b9b1bbfa03edd82dc1871c9d12e8ca1d6a4e6fd337b3a64db7fe896f2bd2a525899bbd62b6770816c21cf0389502280194cd9f91c39083da68306f8567e6f70adfe37e4097225d8a57b8edafce75be8cc88dfb0c4118ddc5df05c32d406edc8777dd0e459e4995d5d1a5020e38fcc2c3047f134023aed8328e7293dd1658bee72a3771b40f9036cf06c8c644b5e5334dea15f3e991bcf92ed441ed4081e5a1c1fb9396dc9da999c6caa5bf237ad0468633090dadcd9b6eb53a635d3d92e8f572c9cedf4076e34601040c3797fd1b619c115b48003698612dd274322a0ba5e6385c499cdcd04d7d96aa41bcc5d958f03677d18e9e0c858c7925b4147a189c9909f24b62f1855db48278587d726238e474971208fd2f23102564415f1621c31b5ae7020799b151f659769a7e71f01baaed61567404a65dd1c2ea7adc9550aeffff50292fc1161f0b104cb161ea6a704aad0f460b244c109e476304daa3c2b3898c466e574bb6b08a5308e64c2e194f3d050d85b81ab4219fb074758b2bfb847047d8dd29fa7ae882752bc52570e8990732144fc371222dc249cc9acbcd1613cdba85355700d5243166ae8c798de09341d44041bfc8e87e8087af7ba75aa7d51eafb78e09bd1740d58138b81f0242c2cb2db38fa7da17951fa94523bdada8a641129395ab908721a50721ef5482c106fae070630c3e84126f2e7026e2cac916608e2c9cde19bd584076d4e58ebaf2fa0e416a30058348322c48336798a719bb8ef477d4d5a8106d437baca5adcfb22ef9486b7ed95a21fd11f5de0d52d56ef777b0f86faff9bd024772878758fe0ecd4b4906ba855af06d2cf03f74d715a82999b355edca070660d5f4ffc81d5cab272f1f3f803edb52dc222d207bef40e0751e28314f23996faf2f444c7ae53d6193bb016f9082fe5f724f903710fef65f740aebd792c13a7a45a1fa03e6da6f334c5258f63d4cc66950ff56003518be09529c1f3f94197486ea0ff39e67c4cac99904fc4d0baab43c29e2546c9c013d50cae6f2c49f67a528cf309083eb0c44671c5fe34541f08090dfbbc6544a650d1c8db8d30eca03e0eae5f27e2cacd570311733551af20eb8701fb885d50e9838f154f1daae4482deaa00119cfd741fa0953135681e38c633b0c35c4b419830863958d5e895f8f14616d5c7565d4fb6404727bc2606092825728b4865a8bbc548f55954552e1aa0a4f03930a48f64f8bbf242355c8c5f7a288b81d4ca01020f1799afa9cbd4f76d8d52651e10956d0aa1720528924bcad9e97446a1dcc2ecccd12493477e6994fcd031647126bcba93b6d09f80ef115d1b8f5652778a10ac4639454dfabc77057ac09f3d69b3e2998a63d0b5baa4fd16cb1d8cfb8f9f8fc496ed431aa7a5748605d6f74eb7c71aa5eac94662cd0a61da51a3eb3240a173821c467965f81154a185713cc1d94427a9284467750a918345fd158c7e1b30910b84dc5b65d2f8053252b006cc75785abd70b4263d62a80233ab8922ae393216a9d8a5674c12ba44111b3ccddf2a7b02e22f6ca7e5ac943ad686f0a4cd76c5a826fe61fc45a676c129b8383021bc4396917a802602b4271f407ab4978046c92c1ff39692fc6bee0e29c46987074c60de4820260195e75091838e8dec05f427593b0dac948a1d76c265f0489d4f68ceea602d18ce71506212d51f864e60c1ce9f77eda39433b7bbf1a0b2f280cd9d524392b4ff0222fe8a62acdd6b36c2c2a64c07b946ad2567cc2ced2d0d9e1e3d6a56184c10712988631762b92f137d3fced2037807fe6d21ec72827813d073f828a6c3b5bc573dd7a60d265e64dfb7476ccc961827600a891e58027bb7b8f044dc299d4bb0435902ef03b31fe65845581c192be887c17cbaf7e9ca897c250127141ba4c5f76c0a3c422999b39b7b52a923d0870078d55058891277ca6b3504582dafc146418a77c22c0dd1cf99741164506a70169f1855135760b3494832766a53947b33bb40d7f656b8caa6138c4e628ed40169c036c4e3e2386ee31e0ae55852b5a769c78a6e2a9f7dbb6141765b01f0502955608a78a7098ae16e75b19590c20a47359c6a144545628fc390d1c8596b8eef54ebf11ec2ed84b0fcf34e784a65d72f7a592c16cc4b693e6e14f0868417130192a5cf2323aae6c51d7cfe710678f8c87cd61d4e2be5c98af5311809b45be29f67eb5e30d6c9c6a02c5b5b6f09395b5510454600f6b673a21b2a9c50f177cafc02a20c63e23d06e898f8fab8fe0a693c8d3eeb800d390efedeed045a871110b5cdd158c8f0a0b82adc973fbf98096d0ac01dd8183ac7572251fbdf2f2c71a8306ecccba9b430027e74ad1f5eb755152d5bfbfd4ca1aed3e11d7b10e117f51da6662015f828b08a8c16f1168356d79a7a3d2611fe5bc0f0876129fa873f06c5dd54c6776ce2060883d41e41ca63c08141eae13a884e2059ff6a73ad63e01c127a0da3a4587e5b54ba8ba97465b216b997b6dc1bba316196c69d9352b10bdd0f94684bb6e95670ccaf6d5002d915ec185c8a6def1dd1194dbb7cf828ab5f0ac445b23a6a9e87e407069a6a5a8b06eb13084c5ba02448556f6680497be2e7fcac45743a4c492b69bf053a5aea7e28ca77b1cbb7a63c40ff29d5230f1470f22c315df38e99a6556ae4e8b6e8c39c366a8a96fb8bb7a8a264ba12d7e3d0bd689b4d5c3e2267adf52fed6ac145b50640ea6ce06b3e63245a4fe4cdba64454b0e182a5e640d50f39cfbe1e064a5e0d24fb759b7741350c8eedf6a4f64bfa7007bcec918f2b203c8dd2c7f4285f9a37b3e49a604ae703eaff2c1c59de380583e815a07585faa489448890bca0092ca8ac6fd9f9b93a9ce647b864f8213447ae2d045cef5568e5fe7c0229e33a56bff2d42bb75d1fd3acd9cf60ea464fa8aeacbcac788d094219caa9bdaa04904b148401fe2f010c0b5698a438ce50c7861b0096fca4aa3f871702dfae180c8249f25abacb8655612d1449efb10dc98bc1665c2fe33ee7f92500c2ddc59418083a4343a996525c044ee8edc0be298bd13f28be8561fa401dd0ad150530afd1108238889e9f5fa64f25a71bdb08e8d108e82888683d8ff8baf82b4f1709109e927612d95719e402c2ba0b1b9fcd1fc5bd9fd9cdb18600a626bbce6dcd9653a84b08eec2191420524f6678dcba412d422656b898eeedea9d2f2748d57c88b655cc3c31ed054a4dace0a71d7b4fd51bae7752b81311d65d42b7ede5e3c477845f7a06bffbca4b41e4305ae1e4c428ab7341e03af9a0b6ce8ee438b39ce09edf48025528c338b8c807b737080003a0884764b972dbac5fd8a1d196b480f6d5f1d9356a206a25ef7dd5504b46973418090c0265c30072b3ee3344a6f18d3d19cab8df175db8b3890d88d12cf097ea8e2f1543c1a0c06946f556b3c23781df1af9ac3fe2dbf781e09c614a10697c1096444f7e0da43015471de4d2bad04eae4493ca8a56f6cb8a4cb78c10fa4b138451702ef10394d19d2319a05412bb045efbe89a76e72b7dd9a4c0de56367ed8b2fd1605c9e5a4b7b5291a8cc992d2e2810246c8f747b0de7f7992395cf66dc180ea9e23cc14f5a55945c28e822cf1b58e4c7240b78b22e4e0973cd5726ce60fe5d20eba9fb791a036c29aeb8dfb13e22ea42418b06fbd28566c9746891fa8b388e8791c48c000b868181b06d06376ab1824ab776fc08c60a26c537d49d1f65d2d4f6830af29ef5b1672d0ef57c33f3fe19588efa84b41b71ebcdc6c474af7db3907f989235fe93297d39a50c528769dca711ea614a4f773951a3d3f6e1040ee7df39d6e922ccde0e0a8ca9aa25e29e03e8601a4956f4eb518588b727f21bae53405946812e8c89a32e8abbf7452a6697e78132994a47d69f6901f05dca76e278121f5dc4ab2f9228fa2865b47e93564094e39546ba2dcfa9920b84e2c40ce523f8f5dcfd91b25729b4fdae63ea89c7b241e1c596999fcfc03575cbd39fb0695d55d8e5152a58a1597eb72981311e4b9dfa368b8ca33c78977b54d9d3fb7525162866409962bd7ea34e201131f8f6c21e9a518e98fa4668f1dbe156cca4771886439bb43d4567ddfb34cb9dc318f3731c24f82df80305d1be941461806a6670859c3fbd984d197d53f253b32045021f40091dda44c0175408d80b235f82b40d708bf5420b6e1612c43bbc614c394a8056e818b82a0fb0645e94fc71411c6067aba2cb208c3b420e1cad140f112112a978947b8202353855158fca35bb8a2c201fa1ad233f64e8891cf0cdcf6a73b12da81546f188eab38bc602850d241a538514f839d01ca624d5a7b05496136a5a4a80fbf105a3303ded484e83f2e380605eb4162826e800fba03e24ee8082a33e003748787b10d426d980a89f21af41144c7d85cdb6af8d15a60a5819d31658226128875c0aed86a401109c64a37565b310a4306ba89614ad0d895cc682a52dbc0663ee9845e66e46c5ee09542140406e70a9c80b40bc92905961153b742fd27cc0358f9d22044411da85bc8dc264052b8d13e3be0bb9fff5be8dac7006c4165f30f349692ce70d6723161e0a716c2bdd6c29cfeac2468d3c8e81bec420dbc1f82849155b98a6500cb1db90c2a13fb8237578424368653da4bcde9f95bbae556858a874b739ae2ad6631a0955ca9247614b59e083784a6d777e5f555f9b1a0490f623a95dc651ff8f81ad093c29d208a832dd5def508bc040bb41d2775fc1bb80365efcc7c14911094c1865c6b9ebb71b58c02552149d21db10dc93f09043d9186996c0af98f3ad3a06713c45bc3abab2590e318aee9e0db39a807566fab1a0e17d8a0062d935d08d59882462120599e6eb945e714a131af453fa70f40584ae71d703197676c62b09afc5bec59786a72db2657265298f89d7f3d5d029461480913ed70caf81d9f31cae1495513ba0b39451a8591dfa0ceadb989d6036971f24c2f75d36ace8b8f298413dc459b9a7c74ec1f372833b21cf0f88500d4d61d930d0de98472abf6859082f9beab109e7b9aa24f80f67e2d273ff3660ac2ac265a037409cf83bb723840be1dd83a47b5946a12a07a3128448876cd0d456554e4a2c6d211009aceb63e86c0137ce21cbccc84c23d59131265004aade2336d2fedc26a1c2a9cc5aa272fe0cf5f33d27a067eba590e0b719e646292547faab164bd0c24d5a85bbeeae1d4ad72155f40cd2c72248bb0a10bcc284379c751a96a5acb54b027bdadb032b2ca0a54aca352b6b0921913fa0e7a0618c5602ebd6ccae333feb8fdc343f2d42f3aba3f411d69d26c3c5004bf99b3bf535877cb58f101d43d93daa296a94bbc8820a61569671d65e61979eac9f2a86a2ddaeb501fab41dd543c742da0e4527f04000a1c48feb4d10bccc079c4b36344416ea0948dd4bd7f0fdbd682094910ff468616913c01b2b07850e81eb873128683e889d785589c3c0dafbe61b2661f1415db244c18cfac9e30e86774b2b19e0508f3d687b4ca86613442315c42f1244817a7eb07aebadb654b3433e886534dd3839a6da9a58dda0e68b37dce520c9ee66b8fcb8ce6361c8bdf81d950821ff46cc7b40f97ea5d537e578859378357420f722a3420676ad204a8d619948677d93085936cf314a8f5bf93fe690c4740af777268f6ec35f0427b45f3cfa6da2374ca57a03ccf6df6b1103388cddb623884acdc4de051515d958878757e1125044ef03c9ae121ed95b353b00efcad93c6dde70bf12a077e7e227f01e2b5ebc00d0e0bb59617434cd40503490e9ac80f32265cfd297efbe64712357d5027a021f05a6c62081a890012bdad8a8b123b1a38ff706c0caaa50290c5bab95294c4c5c1731831ce932ee11a59f9ef712a080343d08c527263286cbc0975a4965e23d37c4b519cc4a05873e0376443fbfdb0e5d645fab842e6dfd6950389cd7cafb99818b709ba10eab352f3946bdfbf381cfa0e644df698a535ebbb98124d42d12d2b86dc702eb21902186cc0ff88688cbe46f1be0263ca1762029b85414ded2ff7010dfad105920f77cab0d7f4cda2c2630fda6d469ec3b904dd1ac5de0e623cf6a8cb46c709016d0dac2e5bebf3c0e458bd6203578dd9ee112a57b4915149866d828525105ba01ceb9f21da4d9c828f28eb8e0f5f877eb362c0bda0c6d117727344c2367b10ee3951aac6dd98d2759328f0ca6a99e7ac7d20f361fca569d8982d4044a028dce1d28bcf18d548cbccd50900298914726dd6b47200331cb7cc8b519061206db8b39a0ff8b8e6a261f9134f23cdd44adfa5e30b2c7fff9da6e6c6bcf86996a6535df054f3b58029f557e624d0d08bb1a8ddc1f195a23f4ec51c69cd7ff81d4257ee3d52abd59dbf4e6233611d14d001dd26cd1b077ee3c5f24f278b34e8fe201b830da21be340fcfa2d17f39924e569830e31f6d2239f7a09e3b9ee2990148656787baab78b42418742346653ee38dae9da3e2d363052ff6d704c7f667852f25862069e583fadbb1690df6e4be619764b1ae7202e9b583683ddec99b2fa1395e3271676b68df627c67d35d2774a0cbd91f65a021fa06aa6aa0059e3d9407e79ec8fa2941acaa6cf0ff4af99226a0dec8ebf9f3cdd36b099eebc434b9b235a519367d2d220fc2b96e065d4a348fea9e6cd2523c3a56c2721aaf8f51bc270345bae13c2da86b3838b8e2c7d708473d1f2729958c95aa65143a597c9d2e4b74eb82a6ed184147de7dc465c2e2a8a84ff5a0003d1e1fdf17d1458932a442ad009a2719a2bb145b3baf82c39858b5ec5ce8674599fff3828a48a3ceab0df7e9d86ff04d6fa7cb6e6bc031c2aca0b7310d090d812372faad95c09b55f28162f13835933c3b46a998600e87588ede951b513b77a1f43af5ffb1eef6801f4b93aa00e362310a02ba26d2dced2754a19156d7d7c246cbc939a6aca78ace58983c035390836758af77463f8f9fc349cfcc27964549dac7778a658361d84137ffa7d46c4518caa2dfbe738f7629abf505936121feb49babd1ac44ce3275a63fcba3c4c6b0d3fa99a5baa69dea226ee5b6d4fc5a92af6a5e52e97b135e54dc89b7cbb690a93b5dfe92df775bcceec12e88bd322e63e7200d213a0a9f3c4e92d950d63051b65ed3f42132fba7ccb62d39d5800f28158c2eed121b3a17fa7d1326584537390aeaae48f5d97cf95d3f584fa274acfbbae2a5ecfaf0ba6748afcfbedefc419b62b55e2efb49dbaa3770d25ff99d2aa31c67ddc7d5ecd8f38f42369502c3874e2d7beddc255163b98374571302598979ad8b2ff1524934dcd8f226717a37680e0765d434671d730f546be0b3f91a17a78e6f5c7c707297950a768ab7014d39b0986a31bb9feb2d403567f2fe252cfb926c1d6a20eb6f6e74ff8c11c7a06dc871c0fbae4c48bf59aab81557ea515661f236a4e8dbb07b38f824ffd068b786666002b7fb9b477d457a063a059f9a0e0110363897dac74d98adc34b3fd1d8621b28f992117bf00979eb09749c50e2774db1efe390935726f1a32da030e7f717da7b12b3c375490a6741e9edb81045d994a0a677bb87afaa66c4446bf55d68a1a11fa55249e671dcf97cd664ae851cef4552332eb1c76c1af25d796f495ea10cd49ca740a95dcc4e6e3b49e899053d542bc8ffb8441d335228fa17ed3b5251a8fc3590ce1fbdbe02135e831b30becb6438614d5fda70e74e730777331f43efc9a63348eb8fd7662b0d97386d002d8e06cac2354ce136bb82b5619ccc9f85df17f630c783912085bd1e259c69657249d72835db4005ce694427d4f0d5be59491c8ec4cf0112acdbb5b8b60da1ebafdb377af7097684703747f45f63db5f62e0c5403b497349d457a7dfc1f1d72dca54b40d38fc69f86c24f35f13891fee5b466f6821b4a0472dee3333a8c5d5ca5d1f0c18ade7cdb6932d9c75eb56ba342911760349dbcaf84a98dff196a9ddafc2b8ad6d784da52b1461198fcb2e318f71580bd217b628e8a119fba34b2219504d3b0ae0d39a41da448a85f2474f35462498f85321aee754e204d2e05bbc1e0d4fb167c85dd27583ac18f7ef81268bd220bf2b682b4e41fab524c55a78048aafc06934f9c83d641afa8c4e42ce80445762e5b3db843cc681229fe5b7330b50797105598237cac3a4235c397d81e0b6d22f4cb7c9c9cb341c1e7b494b9cd48a263b27f1cf1945ef0b44f4fc8c95ebe4fa0e6dbcf663b1693d8cb636dc7d2c4ad5ebef3c35b861db3d257c945e2ae536ac32de15ecd5369b8f1a254ebc5f18df7026cd7913706734a377ccf79617bf81b85f0e36776db11cb956dba76101a033d42e33945ad70fb7f1c6be0b9af58444c7f1943c54b3d485ea095feec24b208885e10dc260a5050c889fb21b68280aa67910063523b8ef200ffb1397296039e22b5c9b46cf1f48a88ee9c9200de0e1b98b8733922c72f7dc615f62d6456927a7517836f64c98143990bba0905980acd21df42b0658eef1e6b7c8602fb0ae65f72397c0b0b47f8474aa43fb564808c64df422d25e81d93bea0e04b646d644ff8161af25227172ae54ae674649a25f30a5ff42a92536c7c678a1df5e1ecc35700fda37599f7ac4afe7c2b81062b6a375f4e224d3764e1cb93812caf44508c5b4a2eb3eff02245f3803acc018e2ea94da9d17afe89b067f96b5195943c3392b8816f3b08e9e1c0b7ae7669409062000491bd344303f805133b314417c91969a181a339cda45a721404d16ded7dec0ae7e9bd9cd9ea9810c70a2ca6267fd602c27e4119779102d1e3cf98c9188111f8f60b4a85c14be980a14f31873567713f6821f3c5d52c5c9779472fbc0cf6374a3a5bc44d91f8ca6c85e8d6d7afb5f9bf7d65302460a01790d50f644db96bb809cac62b42952e0d7917983166df5396d739d6e871045e369403c518413586d8b27c3d7f350b24a83100c70dc3859455671e3679a5c9c092e15cba6012882170131a7022fcc1b739cd1051c018e1975274a46664e82583d57798dcd4183ee2fa6080dcc7de6f987979db612c6ff4cf1d89b76100b7abafa91a42d19151886ce07ffc557a49f9dc49229a889725da0bd10d60dd5246977b581e74772a33774b06ab9dc8e941efe114ed7581c616b66f0ba3a4dc05ddf48aa372d0cbb53c1c44596bcb14637f5e1121a48b14b569e6b86bca70bd01fb4a3a7277eeec368450d309fbe98ca9ff87b2c237d25d5a4149de38a5be1bb17e7fe666a068ff156d7b5b0cad2fef355fc14fce04e2496317f82db4727209120c0f3a2fd8be93e0775cc3c6a6761b8b75e37f99d4be23496e5708b92267735723443da89f0f96ce450360b9d31d1dfddf48055efd76941f07f9413e86d71c5d1df2e1324cd89dfe84028ff0c4be4a36d4b16eeb364f7efc2af51be8d1d7eb080bbe41c20a01be827d098f00f0bd1c52add0b82dee12b137753a71baaf8c30fd14ab81f33402690723e747e894b0f4a3c1d3b3050ef9f669c3d1da11215de238dcdc12381d8c65b2eddca014bea6d73dedbf0c232ec5e8ef5e4e786cb44a6d4631a99322d9ffe0c3495c196a35df44d56506448f1f1739d5dca53b8fccb3819e7f17f7673368c8b8048ecd4e3a6daa1072d75ed32d8bebc5c49199163c3394d926e24feb7106fdcfcea91599fefdef18d524e90337a92d9ad1586545c1dae1c3df6e040dce7f55a9f488e0011a36fe9460f8528fbb3e177127de898afd0beb6927c13fbb4dfaa78617b8ea234574b7b905bdb0f974feacf00be10cc7e0cc0f803c0e1e94031d30b37793cf72027675505ce053c3d537ce5b74c9b55aa9a2fade9faefd027c2c60d293d13ef0d7728680a70fc8f419041c9470b558396ecd2ceb572221bb3a7598339d2abcf1001bb59edba032a8446954d5f42db8fb5485f68c626c60feeb555da8df251182fd708ea05b834582f7de84012ceb40dd15bddf0ad3f86fe4de17585fdc5d952832b995316fc396fbaea639da06c606029311fd9251797a4ae870d137d329d2ee8f33bc59fa6c755f87be7e3382409c479c7889bbbb6760040889297f1a065469ebd96313e988aea3372293bd89b626fdd375a25b1fceecae324cdcd6a708b53ec4574252eda425044b255c78d5e21a3a1c29daeb68605c8be2fa4dee0a026d1f80ee24e01bda2eded0d8e1c07c0a3ee8e80784dc22b846d7be67f81b618a4ce7e186beb9f5fa6c8daefe87c2fdf58691319f0850ba2df97e62411f732b3e714a85c46dda776c869ac65caf1a74d493f55c7b1d8ee15f0be33e784fe7174b34ed3beeafd92026445b84eb7979050c0b2d16733cab7a2e6202459d61f9053746283a111294e593fa454c66749a7254c150bf507565f0ebea91417d6d20187ec42f5fb7ccd77290f46294acbfc67564d0242569c3090c90deb09200ec87d86ae83b83830960f96b5248e930bf753a9d5c19f59a135b686b42df5bcbe7ee9a9ef299b086c72ac82829e8ebbf5620d777324a5f94cb1cd57afcdb4fa9e3c3c4a1432aa1a3d826d92a3671cec4262104b8d070bb7e7a515061383133f906604a072141fc965bf98de1ff341069658013977dff786461b3b13621f27d4b181adde0072d163b1572d8ea08d1529612230a3b9d39a8c5d83ffafc6e30576b7796377da74a31a985dae10b0c7b4dc9954b3f7ec3313325c60ac4920dc5d19d93e5798189f7575938d7a4f2635e635e7220fbedf9f0356e053f4bb4866636ddab29d13b2eb767d71fa6115cc85b492ef5d7452ec4399c670f00f9b453dfac690d1ec00080b69305949de57acc2a1326e66a0078191fa68ea255b76a1357456f5a125187b6831afda8209ca31716a06d782e4ad4f3988e0dd2202ac6e31c3916edb999be0a17fd97a38e4e61c7348bdae9dc7102de2b788bbcaa36ba7221d3bf5a2d1afef867a39a1f64d59218628dcf9f8048c942aea766a318d86c902d31226baf33cfeef09248a0a4998054edb0e98c3a98b87d8f3abeac04db5751e6d1cb6ec93d4d36d65553700c782fbe25bf44f9dbfea94ac227ce586521aba6ade6c4a9c9be4b4f467ecd151f997c7c6255b09abb95098f0fc4f56233168f9a833ecfe0c7faa7aabfbd7573ca46f6c23d2d11dc0c51c61b56557cfbc10501d05e19c860f34f810ed214e774dc3c2be45e1a44f2c7e9538a622f821861c4c92fdf5281a7d0377a7e139d3cb9584b921176745999a5aa9a9e465fddec800fbc3e54c417d6402f525e9e157cfcdb6e864f83c8e0e96dbe54efb2ee0434485c96aa3d5fa1420cf0ad78ecd2943af11bf5f72269e5a64c879bd9c4f005dd5465c47dc4d13c66428042f9dfcfff61865a926a5032501cc4853f90b9a23ac75a23a943e7d85c51330a2585b43077489602a60a3fa82bd0edf6f46811adb5ae829102279f4b526ea99bf0796b48bc5902521da50b95aa89dd91b9288d9e00dfd2b804f6cdc9b08394273464b033bb8b2013b6cb7e47f8807f129bde855d2b7242c147e66dba936f735c1123a79efc6c44c03a0470310fc0497e2e17f857cc340802095bb10fb857ff1057868c6239c054f1d058889b50cee6fdcca11aae53a6f454c2d15ab7a16039702a2e43539b60ca68e562c13d4ecb565d95fae5c29e3e669565dfaea37b7c5b4b84de44580c17af18278e7a6d9b564c406857746e4d42560c0a1102d2eb069cdc01d2ef5330a2bed9bff252b9e887d284d57c89b52b6633969511723e48d627ecdf26279c93d6cf263bbe7370aad25d10db31d38beecc824152bfe11d6a713da9df7eab0f1b4c452e8d0e8a320efaa6d49947fd82dc34b389601d0f8aca9db686f6c8ac376f4445b705330038ab7efe3b3a9714812b6b242b2d6a22eb23bfe6e3a613f33d4ce3f3be2ee00e02662aad313031e3f790969fa4276d7329de32355f77a9ca9b50061391b232cf0782c946aa684b99c7170e367e1a72a3284ac33751d8c95f28a4081fee4c86a0d97a094c73947a6e435ccc81e3ec3d0e3498ea5ae586069f8193e63aeed1282f523b0bd5f0c93c7fe16aeb05f70100d4789a3fb2b036ed7f7f602abb478e5d63bd3381b612b61ef7fc1bfb3589f88bdf40dcbcc6bc95aafba8ed05296e40080ba6b79d4664630a21b62934cebac5fc73a197b0eab7b3976cc8d5674d457b5109bd70c71089cdbed50f0490628bd5c47bb45effb36341cb17bb19b7ba3986e3966b0207411479311b02189672e33c4148e5bb06593f37659d196eaf9b2142ca8dd5bba539dc77131e50dc29426f873db21e1f0e15c8e35fa2eefea8f6dc979c0e09cd9d7272c8ae678b90411c97e9d6b004e12a37adf668e349f52189c83554c356ba386542ab7ab81651ca45e6afb8c3453819b252625e595c5e317f2aeca3133081de114e370c3322baa1fed60877745f37d21382fa7a0f95641d60570eaf0f9930cd14ae03840c1caa08d3a07b4cf0a9a0d34770daa393c75bd769a76580d35d2e68fddc7404d4b65c3dda54a7b7e3854c1fa3fb9aa0b7eb14f9979e8aa4d0f7c1a16b1d6cff434f2c52382ba795289d40f41c3c2f31b977e86fae8310e71fb58672871e92bad782850aa25dbed375eebc901dd0bd9e9273c087d2de24a51434bdcc92629f2ae19aa69d0bce0fbdae98c03ee5e261950b4afd1c7215b119783a68bad0fd1dee23391f8dcb35394899a352832d2754275e99746677801ee5c2cf3329fe89f3123193ce52efd31056cb003d2743615bf3e7515b3013cef3f388569f47bbd5a0b6862bd3530ec34707f4fa14360337feae21899e100355deb735777fad88089ba3b921627a53d82ab89795e033ed0ef0e879598a3163d4229eb86145e8dba7db6b9e4e05069928cebc7cc49d2b02f4b2793d0a6da10c5945366e2aede6a1639678e3ed7f2a4ec1da5b8c26a78124960b70b461f82419ab75ec0703ac0286f14549c844e937920c94347d20e4582e45057d2b3e5baa3a51c9a8fc05407ebc2c5d420ff8823ee160f294323bd0005052d25ac938e05f4ec0eed7d3b4c9e087c834c02433fbb084f2531c414bac8920b45ea75f52a61698ce6e747bd2e018a7d3c1cd1b42f96f3dece717295958d84b46d8d75a4952ea4a176ee9a87696e369ecc53d7465e4d3c759aed2957f5303b0db25675c0d4b889ccfc4f9150b5d96eb16b49f61794aa2a97dfb397fd3b6662766a209ac593ed08b00d88eb0131bc97179612d911ef00fa49e646b6152a13ef69f3fdb0d424df27496b44cbc3dedc3ccc7e25c96d8aa710bdf2bc45e85182e202c5b0d23dd65820dd6a65506376152d389a5e282c8b898527b317256bdaa3be98da98527c510afd369920d9b616058b2377b9e361af7dd85bca3d35331dc9d373fce60bff7e704678fa1e3737c79383e8c19f8760554dbf43148110a6068817e9c8ac81272e3fd2acf50bc1e0320018bdecf258d48852e9ecad58cc3faee4befc393bbfa76b18d66c07621dadcc78002ef3a9180594bc2267664547444fbbceaf8a019d7c22080086c4748b5a020d90209b3acc2686b1fe14c1b02518bf891fec37823f95658a15cd83ccc8a023c71c5e8fb9021d9a3cce4aa48622bf9793f56e2b3f7f9a6dd006e803ff2d534bddefcc3b24b60f90a508330be8390941d8cac27a1ff39bdddb2dca07253eb8ff74d3db78837cc02e3d3faa41e01012153f2b15df2423cb48332bd4c7625ed2436a61d91f1a0389906dd6a74a40193f4d051fa7a61472c5e709eef74f16f307e42fae827197d22412ad6fb9c9a40d09a9c7d49495b5ce2836ae9f82ff8dd452bd35b004e658a2818f1c32e2bbc345f80ebc54afd32aeb33708444fd8fc6c9b43f312991b83a8c4c7d1189bbc83fa131559bbcb69c8415099c3b2a14737596183e465433ee60189fc42c772a1175990792aaf00c7cad7ce604002ecadc5f73c650910570eaa49a7d602c6ab799a87a256888310fa8ae2ece0fbe026a68c2ac6fb40bdeec8a921ed3dcd3d9af03528a866778a11da18b06f8f85a2596f2170f572a6f939559cadd9e7ed33c225c55e4ba9aef80072a550f0d85931ac021f68703657f73e8925f81cd779fdf4184bb4cccdf667bf03cf4eeea24c54f08f4d158faa2574ddbb9edee98cea195ab7460685eec506f6df97d14d5e5989c054ef428c2b462661433cc2c7be41a546b09c3636792310c300da66e4776a4848b3a3ea6ffa0ac9896aa4d0f77bcfc15eff57bbe5ea37a0981d1d07131ef6c333740e199a41d0e12ff0c49f0f7117b31c49ac91ee9d33b161bba92904026b665d63083c07905ee95d9ffb49b1df8e4f7ee3b92280ed13a3084bd324e3dc161787a73ad8b36eea42d90f332cd30c8d10c34e65790d59095946f013a3f630b81ada24c075bc00b0837c9c54bb275ccf57a2ec947789d0b1c6595bb7f79399f1e9dc68d804a486c19be164a450b431381d82331abccbcd0cafa1934206e502f76478904c492be848b6559c3e8b2fe65f947c2edd8f245bd6115afd0974873134f6730b0cc74f359f06047671ffc500f65432ead4bea9f1fa6ebd86604267d1e5b5766e3d77d3c526e3cc2ec9c21425b53390a0398d49fb9a3775f4b65039932a8a6d3673ac46ebe94706b4c004eadf4bc158309a55493ab94997836fa9ad91e698ae1372c7228d282db805765cd2d761d81debd680de4b9ec23d23381fc5fe2f6017c49a453a361590a574c1ef05349642d9d65a687eb19753a73634726d6c6b9f10b21bd984ecbdb70c2d0cfd0bff0b3f6032f4832df2bc5c22ca9f792d6543552d8bb86a6d1131a33c3f7f1dc5196c49f4381bac5505fb655f2f419221d6ca13758d257b20ab394964a711b8081c64bf7894e7446113c6a978ec29d3b19ba2299ae26d748d797a244489f2a42d5a94679c731e80c7bd899e2623571368557cd441d7a0af8936284ed163294cbb32201e8e38a45cafdd20e92c8955927b49ee222d6f56eafdcc7643b416d073f373d3c40dd0cd913893dafe9ba01b2b1a47e92d858f5047a12877ad75b38158c2c0b65c2b55f5a9db49557d2604fb5a0f6bf58c72dfe3c9df25942b568fd1a071c05c8fd5a0716cafd86b3d35d2ab520684a650d028aa0b88c419fb7ada13674eafa74bc41994d7d37aca449c49793dfd8933a8d7d3261a87ca1571a519712d1b34f683c69ee819eef518111a23922b17afc75a72f5f22c0b8c091de2d124b25167d80e723da6b31d4da07924ceacbcebb118cf27933ca317752d4b94eba7075a264d9dc6c1f2fa0b49ae3256fd9514672ea1ebe7899fd3a07b814dc1374790eb6554d4ca95e8df0594ebb54efdef01f38b85dcc3fcf73017f2a7606eaafb7d0e2b75531d4e0d913acc6f52877977188c63a4c33730bf18e71ee6387fcac2dcd4bdb7e56f4bd5a5c373f9c815cceb67d2ced52357a9771db6a96ba54a3eae5aee928a4172d5826512963128855baaea4d295526a91c72404a8734e381e9ba2c48aaea3defaf35283b3aca3cefef3a6b934a317e7e7e689665493229294b4a4a2a259592ea4fa9a816957e4a3fa59f52515151517dc62357f54866414212a6eb8e783cefef2c4f2614399b954f9d23d95913922bad2555f55b140d9d904d91ab1572ddae1081c6a3b53423882bd792ab3aa426916bab12b1db85b91615e5fa7ad4bd5e13925bc0745dd7e10f3a212857a05c3b5bbf6942b9a6d8934c922b6d8bc6d1597ac1d28de56a465da36e3d5255b52cb4aa5ec80b3a50f793ebe6936b85c2e681a7a1d322570d0bcec684371e93a954043724106f411b904c6a1cdbd1651a7a26d1383a5756b5495a4faeda0c727df58255c97832dbc18c27d7dbbb3511bdfad3dd80a2578f72b723770b8a5e7dcadd9044af1e7537a1e8d5abdc2d49d7a8cf82e44a631255f543b2242c916e893311942b52bd8bab194955fdcbd58e90e4aafe48557d96594b91727de947ae341ea9aaef4ea59f5c9f25c915e72355f54036a8133a51fdcae596e091ab0d8b56d5d77a14fc65f5167fd603b98e20d713fe626496bb1d758daa823fee27d7734cc499ce75abe79a88ab529254d5734b74492c92a423b9bee3366ec95614bd7a0d73ade8d59f56ae2f25d52ecbb623d376546f326d474f6c59fc9492eaa611895ed57aa257bf618d277af52f4ab09fc693ebb72ce20ca713673eee4ce2ccc9ebb7a3380373fd8614678eb6d8a2d892e2ccb77121d7d7ed9f6694eb2bd251d5c9b51ee57a4d6e2cb7ef8d24b9aaaf3ff0465ed15b1d912d25e55aa170dfd29d6ccb1fd3552e54d235e051f0291726814217228141f0db91cc326bbbeef73c996d3bcaf5a5a25a2acaf5a62b03af1387dcb8c18a7d7048a6b883121fe80452de8e51146c7300948323792b8294b7225b446f834582608ebe59165b5f6c31814724c9f0ddf83b62a7a79094b767f77bfe6011a0e86dd656275a52b5bdef44125d230bf6834ef01849e2d99ce0c9db9dd0525a0e84f2f6147cdcc95f4e90a64dc1246f5f53a19337888b00e56d4950be4e04925c4123494418c915f6ed441cc915fd56d2a610ca17fe9a8a9dbc61970823a9da0e8d24c915114852b57d7b864eece40d7f3d4552de9cd0c91bc5441c49d57623db59833b20cadbbf9ec2c8897fd9edbf0e3601245792b51d36112457a9d3210b07b250be1d1a218a33a56f4694e4ed42793bcab552b5fd74b72b5bfcd9bc39d1ca1beea2b71d1a6999f0971519e5ed2da191a3bcbd6336ec033a81a49de8641a59a963293c91a604c237c2f0235ee396586e0a0bf3b557ed55833c1fe409ca54889ef6348e93d3d31750251a473d7d71faac7519c995fca4cf6ed02b2d336233204091b32430394b22ce9c4e9ff1c41994d36744e24ccae9b39e6c8938833a55397dc644e358393db5226657d82cba2df2b6c3247a43323d6dc995d6d276d094073d633a3dfd41af5a4e4f85e4cac5e929915cbd9c9ec2a0bba90d323d9624579c516986e5dd3791ec0ed5f18aded1cf34f4449a498da33b3d768421c5192c08f3912bec545382cf5fd0a5c08ea0b3cb039916b58830a1be0ef31ed8535848ead853c72e04e6d79b958a4f3d8775dd54bcb98e3d1ec39ec238a963c781f9f51cd6062455dbafa0bc3d75b7c36cd7eabace0ec643afa41b34be974c5199a6be09c10ef3ed02362c8f5a7336da6ba2f6c286e5baf066458457645b1692730086533cb06387390cbeb9708ac7f5eba9a7369b882fb072202758019295fa0f9d5b7295d5d20e4cd7791e1090d692ab52c9f3feaeab317c7c7c7cb22c3b3a7a719b554292484825a4125245aa48b59515c995d6aa3ed5a7b68a327d6947ae342359020a92463b3b3b9ef7779db519cb679291dc82e46a23922aca41d12afa188513b82932e5ac68b2ed6c44db5644e4026f45529564bbe58ce4aa32d18670465a129c1167945ddcd45fae4b0b22b532bd6674fa2d081555f4305d672dfea0138c720065fa43a3db82327da32e391bed84324464a5b62c1a47e76c2bda582ed7ddada86b703c5245b72a5a451fe401fda7f3c994ebc95453421aae458745a65b1632e5764a2520d8526dcd23997240dc4fa6af8913a971d04f2d7a55ea6b080624579155da7822fe361764faea851717b24a3b59666d0793e33f98fc957632fde9724c448f1ee5723fd1a34fb95c1397038a1e3dea7247a247af72b9a0e8d1af5c0e49d7a02f01c9d5b64554d16f4cb22136898ec8b9254a4672b51d19657a17772b922afa97bb191dc9959665d61e65faea2357db4ed6551f94ea93e94b48f42d5bd419dd5b2921657a969b237af4db8e5c955a454fe92dfe32fad3b6f375cf317277b3ae4157e80b10673ad31f20ae2a9254d1d3d3e4e8aea0d47b6735ee8aca1d61ce287af4970afb71464831227596957a95654f6c3ed4e5f45b12d1a33cd1a3af78db891efd8b12ecb693e9b738637a8933dc29bd8d33df29fe3828ba38f37156c8f4b4fedb8a32bd762457f49a915cb55c6a49996a4699debe3790e48a266a3e72055b156fe415bdd511d98a94a912ee5bba93f5c974e542251712a1842012940b83e0912cb3b6eba4cc3e9a5c5b729565d6766d65fad295b9f9891e7c0a17e1728d883a436edc913756a44adfb8ff88adaf93bec8f3f2bd04630b26f9a0501e42b22e5c845461f9cb4af7061f58a49964753a9e7afaab8958ffeef3ae234a72fd1556d46f22d57fad848672d77e51aa1d20a7eeb4aa9ea7a7d24a3fe34fd7a89f9c022a4ed56f18d65bba76bfeb80c9254e074cae18967047a1954f7450628e1f151376cb3d04b404871f9be51e025242f412af99bd64d90b98652fb21798bd642fb2972c7b41b199bd64d98b245a96d1f6608430d2a04993096343d4b3ac258c11c6a15894936453f41941932200810a2ec880154190239011723c2ace7017908e8ece0e58f15d5c75cb1700e42f86c68daf93c896596cd14cb27c7f7088849192892920921bf9834994c025566401990c49a20a199790b1892311494cf2452553c85f5ce26345969734e0c97288065ac8f2afc110b2bc375483a3dc4336384296af714196078207135ac8f20c18628249962f020a59de88a11b504107073ad8c10119788a14a1c7a788157e868a8021cba11f21211ea2560e9214191d21dd20cbc3241da441e7063b3b60034f1347e85122cb1e3282f4e30411509010114f963dc483a32c1f731667be4d28cbc34d28b7d014497913da8c907dc82dce40a20cb7242cb825c9cdd9c4d2155d37e4a36404435f68f101419e9fddec253ea8424a9e73ce39b119f97a2791628a198c60ce20075d0a2613544d6610021990010c43621c010c2be8cce0838ef95aa8eb1c1d637a65a52ac295f686456e4455bc8c19ac4cd7d10091e55b75bd74bb7c1591e5bdabaf0d64e95d38124b298cb6157d4cb4020c482527d80069044d8fb410c1bdc71ccfa41fcc16d0132da0f1424b0648f9eba22cdf56c877f2323159ee2119b4e8921944accd3da4441bb2b027b987944022a2b50f52061209d1d09841a38b4ee491349a9877727970b62f8aca646ed0d050e5c8724ead7236d8c466092bcd8e863703001e958d9a7925bb2eecba2edaa815b9494faa68eebc24362f99f3a4f39a5794534e39a5fc94726612ce89ea1848e3ec0bc503adbbe17c9c53e2ec0abfb0e7f40ff62cf19ac8c3cd715baa240f7c81b9b806b9d3ed9cd23f8c2c78c9d95ca39b86e250a877af22ea5a09439e9724f6933c197ef630e529a89f6e6f0afe687c3437b9beca7a6f78cbfd6ec03f68e496dfdbfbdde4fb12f7433ce18f473edddecf3ee5f56a29d7e68616f615e67a697fc8a0ee77bacb4b9c8dc51d3d18bcfde28e5e0bee6ba50d5fd421d75d43dd0f66ad391d50e59eeef77cd2ecfda1b37dca9b4b4067abf2cbdaffd0d9e21b5a5815fcd5bb1c723aea5b6eba2aaf9129d74f56b939b906c1320a63d086cb6b644dcca2075d60df6398eb05e622c22c05c71f8b4ff01dccaced3aea792cff6458fed1d44896bbf2973b391b95a7ee4bf4506f7977bf9cdcb1e49614fce5e494dbfb5d057f30ab1cd67acf9391913c9247aae0abca57aea9ace0c0aafcebb2ca6ba2e491f0baaed35df0e9d8e926fc7557777b597e6a39ca9b1302f5165c6fe7eea2ce72bf6794157bb8726d4565e5d637a75281e8ac828360d93e7241c03469d26447ccf51980b9e21fa8af5c9827b74326a75ce5167f5008eafc24f920f51c411e2323a12322a496fdd745349efd2793abfd47a3723fd34f6f6e07e4c9292af88b4056b9bd9f4cb6aff77b9675d7fa1aa972835c59e5cdd9a86020327f30a3700564720afe78d87b7abd28879c0dca4fb723109d2d0e7205d181264d9ab4b209ff90c9278f3b72b5b5aa1ec6e4faac56fc6df8078ddec997e7933c196f71d5aca933800891e8d1ba71487b6534cb7ace47c80361e7c060c4e090d135e2bf1b06e0411bf1dff38c4cf4228acbcd43015d63e60d442f7f32594787862a80479228a3a5101262e180d8409c8155682f62a199340a3212ba060c401b2cbc7681c007a00d5647d7f824ccf276864d58e8c3920f9093e1a14fcb962c0c90abb74adecba48c5d7d5d04d334e4e7f5a169c09ad2101861bc380c6491bbade8259d64cbba3b2667de0b68b210ca0c4050a28b88a8c602b2bc5ac5e50b0359decba65c49d69793eb9039148221b9331c02c18ea9e5fdc6e98ed3f22a6a8e38c8954ddaf12100ca2fb987424064fefa25244bce46bab80c41cadf3cda8288792ec10940c81f3542434b6e2e2e93682a89392ac87e14c800f2a674c43cbf247a51069616d1d60c269e3f716662d1aaf8a905518e474747aaa0e17137d6c5c54546a665c4564427c3eeeaa0582d5707c5822b6fce86e535918888517ec94d44e40845355607ca53de33af93cde97dc234283b02731345afe584cab18b7abd29775ead6be5a812cab5e6b0cb9b8118c4f591a2c750ee970198a27807cae5738d440902e445c6404ea6c03cccb31586951c3434f9c80704a6264d9a346175d7b0ad7427d09d4dcc9fe8c5cec7757aac00353f727af2751ff39d2f98fb28a78460e5698b0201d1a0d40e7a79fa2eebb2dc51a0959be5a02a0e3081d8586ee7959b659cda51b37ccd12a78290f312a778dcb4a8d103666b12b576928841d18b4838ed2d1807e3f0d8812c97df3c858720e103cb05a7e40e64a5a4cb7ba4eee272212d4fe11e2e7ff90b16d2dd05a724e6f17297964b2002f448f42e6db95c5a44e5b4fd2146b9a7907b68c808326d512671c6f4f82c1b621f4fab50c9f1b4886a91291639d22ce47829ff6c892691bce48f59447d81fd2890c4418c381267604bc21389bff664689e9d1e3b6dc9a352504e6f59a76d207996154c5530968251f00957fc7979074dde2890c9740a34b31c2dae004dc6f00784e9a6933b91442f4a1ce40a424893264d88323689b6162acbbfe4eddf34ca4e232f4faa745c789e6e9f1fc53f68b2f60dcfa049247a1113faf901029a447312116597372bf566c9899d3ebbe6d2b9d6d27579777a7bb43c75ec0ed1f2141662e4c6e5dd85a4de22790c4961173c892065f9d91afa409119904a1b9d5402b59800922bdaa29802490a84bd33a53ea4c4a91d9ffd494c7fa80f6542ca679c8da42d7903135b391e43527739057249e13b7bee1c123df9895dacc17e3979ee64996d55bce46c36708420fc60c8a5933ab21f6d115d7174b493450f529cf926912de2cc377f72fce6901c5b4b620f2ed48a38f3fdf801eaf191ab26b2f3f95da7adc6e1e3c215b82e9168651a85c6d157e44f6e91618b1a5d17863c9047082ef77161d85272e991a872b9cd921253a02a02daa2401f355a82f6f4c096cb5b6e4abe59ddb1a3388321c955cbe3b124aa4377e4cac5e3290fedd1828d3ab9b38b7be94855fccb9d4952159fba13e9ce23a98a7771646dee2110a4217ff3c8e5c2ee9690000422f3088910bacbeea624a62dba641ec5792404ce884b0c3a310afbc122b8127df041073b20db927be80936e427bcf044d14f4b99a3dcba054e2a3430d04498c92e92ba89acf8c88a184708aba50a3b02464c0a24403188e1f3a29c72ce396717a44ca459a994d1186126e79c534a1b39e9906c49447461d817ae2fcc78c10848ac0470de0c6d2e51d367ad22a3226dbbce5a795df68ca7dcd825239c48d7135910b66801d0132420b2001e9f2764d08382a427828082999d4048aa3a7b228a152c00053a3a80b0a311bb30ec8261041b2377145d10438c28788105387cc1b2e48ec20b4e14c10b51743d48b62e22cecc13cef4dba355d76d77215f4ac0130e6e1a84105a6b6d2dc1ec1f4d861d764cabb2cfd4d8ededd10768b3961ac34abf6e91d28fcd2eb863348d3078cdeb9a9e91adb9878e78e10a360bf9fbbc47433b524516062928967be8881443ae9f9c88a717b439693721bd539e2c90a3ac79e2c800cdd81ba50239c6d32cdf37058165898174938c6118e711391ecec72c6e51d7755d5729f7d01126e4cf7ee640eb188de330d5fe936b13b91ee59a45f42a508c9f628b5c638c3046182352aeef187f72358254df874690ea8d8f317e12212455f1f144141101e39d58bb76ec12512455da8910922b228e2e2b9e42286b4652a5d5973eb803a1acfdeb298ab276680429b3b68d2065edb0891fb98a2c4d3bdc01529ce922ed2db5778cc61323cd82968a5a9cf893ff41e24b9992513e428886ec59ae509f90c77e599e2f8a6ce7963458e9237bb06338a2feb514ada20ca5100a6aa01f9f9d3c44d1bd018a1ef4bab33cbe6b39cae52b7749a9682a97e5a8fb37be69c2450a1d54d20a5286c75f4be1c828432914ada0e46c22c65e2335ecf60d2df02704e8f04280ae8bb3b988446fb6cb8d30d83eca31c60bd2a3e84d9a459eb185099bfde0cc277a970a3b1f77ae9e222bdfff681010504f0aeb89de757474a4f21ea9428332dd30d91367a60cf2bcf4996ad0e9c1ce90680434d48321ac83f29c8941974b0cf58027cf5324712615e7e74ff23cecb1fd8ede8ec9d9348ef826287a2a1772f488521a74a9fc3aba7cf2853f382b6f79c461b9cba3cbcf4fea86e5a9b33ce5027de42a75d31df5eea86bdd6de95a30cf9d4279c68e3a73fe221267523e3f8be40a7578048d60512b7fb2a7855a9ff168ca783f0a75a1905431498a1e44f28e1e3475324fe2ef47ec9c1cdf728593c3ea4caa7eba46aa8fbd71aa69d668d30873f744c513eea993933ae79c73ce39e7fc49e5b84f8e3b0fb99a5a51a61742a4492f26d19bd717a06a7e9221cfa9863c4faedd0c64393e1edd0b8bae31df42996af205b2a767c87eb2470ae105b5679d73ca25c823a0b460e1b116b6445bc1c2a2b460338de62963906da52c3be1cf5a3c4dcfb2ad44b169858db95e42d1ab6e1983691b0796a79c22cfd951fc93373092a704c2fcaccf354543d14e9ae998e9167f59663793e9d7e46caa50d64a375561adb5e22f55aa37dd1f4c2653ad37d592092b99ea4b2b7d714a3b764dbb66d26ebda95ec3b2c725639e0c8f7a8f05746f298058de52106917666ddb36ce86fe6272ed3a6a1c58f40a8b42abe667e93acaf39ad46e56deb9a0def21edd5db09095776fc1428cd40b5139eacdeade2a1d16d2bdfbca85a0aef2d4102a47fd46e5a8577cb3f2ee3571720a6816cb4d5514eadd6f50ef5edf756fc1382bef8ea302391b1e2c3db98347b10465f815a10caf72a5206299577951854df140bdf3d7513092e208a7490194e18b6047c1285f4771267efecae2428a3312338a1e93c696604558ab8fe2104552055f449cf95a8a534ebba6dd5a51b8130c046257748d79b1d6c5965cac08b3e2c87e368af81167e8e7a4415235b9cfedf3725e6e1167b417f5b4788876bea983b5bac6445dc594325d339d6ebad8d7a9d33b0b01caa6db37a7c3def49a78ba3f98ac35996e4d266b712a6551ac111a8a351d25eaa06b74b6a65b5392d5546852ca8961589bd2de9673ce0bc34e4bd74412e38c104278b718e3c4d98cd7fdb2aef15d2288914a794929e3c4536230cee092f18a18931ec4b0c65f863b5ed7bc660e8573083b646a88fb983300ff86cf9be1af8d72f6989b828f390ebfe1a68688390e4f41dc23e638a47adc7018bfe1301e00690a6cf6d835b128893d429484a0241c654882dc43486802094b202189dc4354d8dc43541cc9dcfd66e64e4caf91abd4498c13ec611cef2a5c93c9958753a51838558a8153252144259309008f817164ee6537ca30e336fe9d9c7236275807b762e3a6e065bc5933ae77d57bc4b80c2c44c663c8c0292e47c815d0ac4b55ec72581e4ec19b19f70eefd5780c8ce3bdc671627c460a4b46885291540ade06be078dabaec238399a164fbc9be262dc1477ee9e7715c6b171ef3800788cd410337ad4788af3aeba9018329ec3eaa1bacc65b0100f5fe0467519188706d748553c1052156be29b65037f4d44031b816f1600b0e44ede31b2779b756760bf4e7a76f29314134e0d112386eade853c06eee10951e14b95097bb8a5ea6ba19cce1a0e17c6ad81fb74b38cba7d1d9e0809477213292122520224747294fbc18c029fe12c86848a868ec024cbe41e12fac94976b60d951ae21e873be01e079c72003e8c18f77e13e31ec63172729c141703a7e05537321ee331304e8ac3a92166dc7b8f19f7b0102337315ee342bccfc03d6a7cc6676021315e03374b069671151662e466c655172203f7505dc6656021dc55b8a5ea44939c0da732e3a64c4fa5a49868524c29de4a0af7d44a8a938153284f7137329e4aa1c898b1825354b65b141977064ea53cb57273192bf886c655dc4da5527a7087d67ec6950144e66a514ad69eb0acfc2b87f98ba7522e9ef297a79e4ab9dc9452397794afd0a4c0bcc09f8c8b14cff47217930aa7b8d368c12915942fc8cc283fa9bc26e664538a3bb9a9d4cab9a71cfee4326e6a050f41e3aaa738dc8306567dc6653c95827bccb88ccfc0324e375d2032a79c64dc96aad355b7a5ca05d2dda4499336649413cae995b34139eafe885ebc4518c1c28cf21f7e1cc2c37b82bf994d87af917106e5b18838739a97717892c15dd51c96891ec763c82f55dc077540c8e16f66eed7e1551d3e3b39bceac2132c13bdb73d577ac3ebba258883cc2026c7711cc75d1cfe70327778af77b7ccf418387572d5735826ece1d4094e0de13dc66fbcc7f8c963601c2327f826c65518e75275f21827b89fc3aa91f0367781d0264d9a30d921b3c680dbac184064def007b38681c8128e000eb759306eb35ea260bf1f5d84b3ec628fb9cdbae136ab46cedb196313b78ecd81892fa630e79cf2f04a29a5d426ca35ed1aca0f9a0c3921b0b6fde446cee6243e27cbfb3d4720c39fee372f67da6e6f4e8637c8b55ddeef46deb8fb6d599b3ae8350c51d77e733e85c59cf3f31e0d19334fe25544eb984d1e420861a4810d3112610bc96b0def4723c39b60609b551f5f83c87c437e850afb6d25d4077f75ce68640cbf9382fd3cf983468e9797c9e2cc87cab285a609e0ef11ec0735001c28cfc3b8d6dc8e79183fb9dfc9eb8366a4e4ec7508c04bb502086c9251ac853fd6da1b376e683a04e03afc6ace2687d7c4d5ccea5773363ba04ea893a6556b6db53f9c6c3c8a1eacb54a1e0cbb2857351b7c92c706361ee5ebd5daa4dcde949b6e54123d28f385630bc79947f8d3456022ef50842345189277f80e45207245cee11fcca72da0489273780e876289c66dd8c9c9c93cb9e289cc41871c0e374e07cc395cb3a75faf185669d0e9302c2c29296f8e8525e584c36e6861535236cbd9d4aae3f4eeb5c26a391da7eff0eb62ab9f6ee7541030ef70987738ccfd72f20edf2108017c00ef68accc8e9765f6b7efe674c01ff071bc26621be5ea75b8343434a75c3dca8534a7f9e9d809e6155fd7f59caf9ee535b2068919f52d25057f39574acad53511b25cabbf2e7b5d36d6b68c8a5a45464618923b77468216b2c88d043128b1b9912006241ba783dec5bbeb020a26906c81040a22499664fa08c5904c1fa13852842d327d11aec8f4ddcda27797d45de28c193366cc10d23366cc98819343e35c0aa72cea299f05a203e6ec33628d15eb5cb81cc31f8d8cc538eb23516b0591282a6971f6cab37036b57e72db9bd38e72533a520ee328efcc72181e5eca711e5e13b59ae73c95c2373cbc06e3f4701e8ee3c3733c87d5dc3d0f37957a7eb372dc54aaa62663213d9c87d7f4e003e4ee9b7b711eee759d2e9657cc741a4f0162937d06d681e3dd4df7b3f93fdd171708ccdd258763ec4edffd59fddf1d1e77f45e70b76121e8bbcb7b81c03c00fc65c771940b738c9d0a6773e10f275f3511757a146743af410e08cc28f745cab19b8284c728d357242208657a8c08addc435464d1e51ea2624946a293e9afe48911830346a9e6c3cdf11e2e0f7f716146b930972ecc382ef67b61fc8147cf72dc87332007f6e10c38bd876bcd5d3cecadf7874cb6f774c19a68aff77ae5250f0e31317e612ef0310c8ea84b4e08fa8a534160c791a88b44b65a8b5142501f6e0e0bbb9d5fdcce289defeddcc3cd61e1fbe5644a2477eeac71a86b184cb9306f712665666b32bd394a4da68bcba2579f72ba66ef1724460e01f51988d9877dc7fdd0ddbe539e723acca89bb2efe13039ce728be4c029fb1ce7e1ddfd307cc2457ac0298b83d8e1399c073cc4880e01780e3cc4c8ea489c656426b56387e7f01d9ec335952d09b98790f864c8518cba30290b36559f9383d8e102b800b00fd4777867980a2287d757ec03f51cde7905f3950e872ff8fb75b82e8e934f98b529b76731d9145b537016bddabde2d3399b0be6a77b17f7833987a37678773f9cbc3abd1f4ed621871b24e61c0e7383c4bc03e4ecb31baf34cfe24c3dcd2f997ce3f6ded0c2d2fcb3f906cd339a67375ee284a04d9a3469922bcea277e3cde9a0c137be9ad921e8c6953a5c49240057e670e51237b01ffcc99a83c9723dfd84bf99ed3526ecb79ddeb9721c67632d863f1ccc9b433dce543c3b16da75428d03e61bb096aea32c375a8efd861baedf7043938b93afb7d88b0178fa0933a5e4a4d4c81b302cbbc7c0313860f853adc51fcc57095bfffff3bedb5e3140aa2aabd61b99a80651db80af7129b4c4ca4f39fe753cfcb331efb8f2e1313e6058d403e601b754c9e0962ad5ed8cba9d61b4beae0ffbd34fa7afac5cc3b69595affe74235ff57e1727db5f29c71abb3f6e4ec10180364eaf91315f077361c6a48fcab1a75c4d6e30299ccd75dd0f02d95ee56ad7c500cc11c8f55f677a733627db25194bb92b1a2a25db265945454545e55f17d9fb5d08e4facb9aae1f379b7000a00decf67e3a646c0543a213ee681a07ecf0977df52cf8eb360065fc05fe3299bbc0aadfc62127848d9fbc466600dc0f66188745366ee3326c5c067fd606fe7ed0c83030004ee3aad74800dcce32ee97a9eed7e51af79347c8f0312ef793f8078d3c4fe3defd6e320da824d2b81dbdfe2582fd32ad844f5698c8f525ab72ad7f78390bcb3597bb84fde2d191f77cdd775c1d2673c1b227c76500c49e823fef84bfabe0afc38a60dc895e123d70080b49f9e61ec2c292ecb3454fa6711817dac9306e3fb3761921a9878c4044fa40266c66b6ec277af51867637116bd8a82ae016fed0a13ec2751903f591467ba43974395c34b14340ed36947bc9049103077f466ae4fb95ffde99033611df51626058939eaa864e070cfb396d6fbf066e5780fefc1c37dc0427c380fef010b3172e3c379b8901e9ee3cd8ab906b7a813756024459d24265107e64f0dd1c373bc470f38a6870f98077c1ef9e3917fc8641818dcd13b86f119340e23c62d0ccfbbaad398110307d59bb39171a1920b7188f1c3e06f66986b37f9f47a0de35a6eba761e9ec3aa16a786c8711e7e93e33c601c23f638f526c779380ff039700ecbe2efd69eee07f329e5d5d6cd743f1ab962d36ba4e9dea7dccf7b7342c0b88df9e9de70c983533b6246ddc56b24ccc5e1302e048231f7cbf2fd2f0e312e447299d4e8a35e666badf5516f2d13ad96256a1129c100ccf65048e8542f54ffc12024156340668b81402660abc2d60b201344ad97291c11b95ca2be1e5efa1ce5b0208c98b75cc1bce52ae532390ebb28d79f52ea4d3030f04793eb636230c69e973fc92393e30e19e1486e79e9da4ffe82c48cba8b766df3af18ee9cae35077d603e1df6f02ff3e19fcdf65f97ed3f2fdb5fae78b87dcd6da972711f6e0fb7e50f997cfaaf9d2ef409900bf330fd29817a0c63c8266c0893b040c35aa3721ffa68783519da099aca18ae0bbbae09afa0417a45a88529b33c23af2967f462cf75daae9479e9631e3bdc6e68c1a68248f1318fca9d3b7f13a776a0327654c660cf77ce1d67e4f624547ca09480b00d4dc02e7a51ecca4209dc381ad6de9c19c811a3f89a1cc8f130cec8432886ace5a5564d9c6530c3160d34b863769baeac35ccdd3967420dccc8b25d2a6345d60c4347168c11b200e7ea406bb96261d89583102c56ce3c0246b80520682c0d6e57abe6c90296456fb3b0db2c0d76bc6eb396d0b03967841ed0e68457072694110e41c37266a075a9bd920660074e3ae7829009373c10d4829d12a020091f104187e107f69a584e11248c0cdda00966e831ba90a022092d4ef043a63bc3fe6e83fc793468aa60227f2dd44986aaa8414f14296862086a1882c492b28972cf1b720f1535c9a6dc434548f688d6cf826d2e421e493e45d306441b0eb48ef920cfbcaeebca2ad69bede6dcf29cef0b4462b7c8764d6e14723371a66aa5f78138409c89327af2317a387048f476a8dd400b11fbc9e46db2c06e7126420ce9135ac764119569e24a9b8176552a22ee207f4d09c87798d422077104b4b09f0c16f693c9376b15bde806f2754920aa906692269d60e155b4b0f0f29b110b85748dbe0a182c3c8c314231681d53935b080c36fe9a71c618048b54d0b41c67e39c0c71ebe8d93d67f7ecd9b3bbc140318c6254ca8961584b2963f2bca83c867b46b694f328e8c7a6402b652f3dbbc41fbc32eca39f5d83bd59edf89af304cbf097fda2b77ebb27d72ef7c9c38c524c7f7439fba4d8857f1421ef8f2ec74b25d06fdae18d2da4e672230c9b768880f8fe341c44faa83888ec472d621ffdc1893fd87de1ce4060ee5f37b5e37afdf5fad227f6d19fcfae5d3aebb33b2b9e1b86951e5f7a8d2c5d98afc38abfaa5dfaed66af77be5ed330bd2d61fc75af8f2032777fe384886fec235ed334fc553c4bf7a15dc336cf4db5cd73977ec22032633e801c41af8f2012bb3ee23b5f1708fce4769c726ae21df1fdb8a3cb5fd32a4a7d9230768650681d330fa1fc25040b1f2f2bb0e53819e9a8699a8f2247c8b08cfcba20b88edd4706642ec281eb9d254e0eeb7ae471e1ebf04e213a595e0f8194980611ade116b90f9108a069dd0ddf57b0dd4162ec9eda15ec372584337a57b0d9a78410c2ac218470369411e9ef8285ffbaecf22f71e66edddd36ebeedeb2190498bd0f2184597e9ba8f932e7dc8106000fc06bb0514353386ae5aeb1d316bd993b0a3028c95df41aff784772fccb148260458e570840a0d1488185ef4d87488370caee6e8bd45300e5eeee9e32c6c4c4995496b7eeee9630b08d7d3492fc804681902a78db51d84290b2a09021514da7e4869c0228ab846b5860371067e2e171e20c4df4e05519e64f468706f302da8364d9342746310cf380c019bdc982655858f089d82b04bb5261ad15ab87174837418a335be0479ef9b94d21996cc43c4bf70d7f7f07b18d9d8795e422205b44f4e6514e60e790a833758032c59148e4c178628c31c6083725b496f029f2018fbd11208d0862fb4e6cc27e91076a10a7b2c76738882d0e49d1cad8e3cc1cce66346275a2146c7cfd23ce00cc1f95d8b586339e60df6e77967f453a1669640552d0c91057405a0106223a39620dbb189cf9ab3ee283cc8c1dc38c88de3c8d94c2d94a944c1d29298c3a3b3c30893c672a08cc47846fae07cb3b8c8343852776585d77712012419041100bc7e5382fc7717178533b4acfb961b99188bb474e47841c8f96d36b5a844f5d23f4dbdd3175c4eb031ede5410a5c797bea3744af107e3212704c70096a7ae414e01cd6a79730e60790ae31c216f4094c44abd7b0660ce5e23e32d3dbba597ba8b0341c03385100bc7053ea2a7904410cb883cce0b3ee286198258296ca474177c04968424969193b7b038c1ce97ae4c5db973c89d3bd12b510cd57d6641e6cc6cef446f422b8c66963ac212267e8aec767b7a9a379623715647ab112caba8e8cd883f1a18362961bf78abc3be747abf0c578046f6615fbabd56baf1f4f06218a5cfb0434b33faef26c30ad0c8df4df69e9f3a53c7b4448c31e66843b1c89361fbed1661f9d54165b97de441a1c1da4f163c87b07c0e89de1cd29de52831c218233c1dde53778dc0b35c24ce32f2d2b19c8bdc351695b7ca63562a7dbb5f4ede340cfb0f9db1e76478bfe7084c085f57de5c94a5d39b93e30d72e5151c0068e3462ebd466eb7a3b7650ee51c8eaf9147dd6fe6146c44f47ed0c8273c77a6ce144a7189fad947457cde99608b4e9e7df6dcc4990b70df80c8d8558185cfb2d935127e592ec272ecfea0c93106b119fb01224d9cc93e9fa3c6932b16dcd1cb6663a16b58a16dcc6b175ad135e6e98557942e3cca227a33ab6d141fe329463f9a4c6113585932eca92c8bf391888b900e3e4b92f2bc4f134079c6a03ce77c4667a6ac429e3a7205ad88aaf979052c8ade8482fda68ecffc9ccd3242cb9167b24e0dd041823e72c5806cde8839fff2010bff02027b09a5441b628071f61704cb7d7923ebb79d114e4a31ce112cfa2b23555146aa6472c7c3932a1739b0f0510a1ce4f8971cb0e2e5fce7498f860b27d44352d0c9b1832c2329f0e4af5b9c8e148a90bfb6425eb38b332f71669281c6cb08905808641e73ef319fa20530b862152e256cc8c109ae147477cbeeee8edd0db1abb1eb6aec9a92045a1c4084534a29a794524a6d421bb023b431e5001ada90d25a137607703d8bd08694529a8080958680ad602963ec18e337f3978ad0463fe6993b69638ccc119ff2d76519638e97dd0def17f3c92c718cf29ab223c45840712e8c5ed725e31111bb9a482831d8a4dbc69cb31fe1bcb00bfb81c5ae26f3921884524278c2a08497d863298310c3221614e3a6e85637567adfa3efcee240b32ba6db867ca984bf23f2d5860cc32efafe840328c5b671c1d8309e408c4e194f5e34db221c006cfa2a4b598c56c26a29533cc4c2d7c489d9b8a49098e7b5d2f6755b561bc7d4b87b6a95fc76a53c59205fb133407326af439a4ba73b2c964b1848d79047e44b7275bb22044e402206186c29f7901236d0ec25bbae086722f4e0fb82d73c84104208af39bd6c622f110ee03ac5b2972c6799e72c4d6cd2db7962d9cb8bab94c15206e11bb3557cce2cc9946491bf4e52a4a40a29e418e42b265f57138e902f254ae4ebc615745032f97bc9c1841e26846109567ceacc107476094755c8df96278aa80479526188880b4b90420c2588c00a4ab8c2da2fcbb009f644470be2764a5089f800cfb682522b49ab415675404b4f604e10ca86884c70cdcc4e91822ea080080f04996147676768880d44e814a5d44026cac490813de58e420c6c802164b5dc518ce104558ce1055f18c30c66f4d82c771463c88137033ba99079ee28c850c5fcc001e2cc67a3a60040a0ae6ba27e20c08413af28818040a402851f9ca025a60d489aa8ec0401c8058c249028a11205105c40052888a09288a0029311b2eeeef6011172f7690ac0a33f1b675266314fb0f0fd3883e7212b7a727fbe5c97854b50824496f88978868e872965747663d735a38c538832c2d2a905c20b4613b412b029ffcd39273c651f6d62fd9a98d1eb98bcaed933a31836e7ecee19e48ad3057d2161e1e375cd6be294c472c4a2db66d9b265777777675052011e368700982057a4b4616268c30b754ddc3171e144cd84104a3803f003fb6519a8a58456286163bc1a9b33b330c88e3dc3b28cca2ca318c33d6397638c1d73288c4dc4d87dec7336f6c67e659916331a23ce6a60d1314a6cbbc61170ce6641291cc9f663c71c081f20e535e735fb03ddfd5386724af99a78c1fce564f9a923c2a3c81d68b2bb5bcaeeeeee8e51cad9b108730c5d843093ff72329c17964062d89c58b7a9d492177627463367dfae715d18c5e6293ebc2e2f6bd8d735fb7a4d2c7537be2044b141264f39a544a26577c309610732ece779fd82311a6918bb21ceb07c733912c227c42cce5ca62ccec0381ba722ee5cca16e83296d1f79db3c212cce095e1a71c81d4eaadf5b262b54a292fe7155a8c51da07d5a880200806913065f6f929bb67e4bff92cc64b39e79c73ceb89aac289b905168cef63c19191a1aa12c7dc83e64d3eeabbb9f050dbeb24bce970cd3c83db3d2bf790c675225e72f0c772b20a96ca8a46d15753d8d3a4533224000008314002030140c8804a3d1682ccc13416e3e14000e839a4878569cc9b32c88614a19630c30400400404000406466da00c0c436764055e2e393cb7f7b1169696b44dc3d53a14306f060f1015863a2d2a8e5843b9ffb1ffa8beda4fb023d1822bb81e7dbad20d60725548b59eca7d708e201e3b7810fef2df099633a29698dbd2f1ced3defba012367169b549e4d97c89dfa747367248fa832b38c5672abb70631dd62fb7c83312f247bb3001a6313212385d857242d53ca162676cccbb2253d5c5e75268c23f738cc0ed896aff9c3a49f7b4211fea5dd17ebcc4092a25af46e284d62ad80824a16614b6585ce602bf3971b0c8d51f74d0ae44034f3aea9ecf41d62ad7d8108397e3277bb31d0a1a1c8771c6c2e2776520bd4328b64ca5ef0d7aa8ffc40782d4e095f26371739baa153e4cfb722c8e14744f4cdca76cbb26eb4068f060f03935dc6e692010fe6aeb8bd090278383d7c603c47eaefa506271e63afa1838ed54ae28f32a6b9064e12c10b0b4488bc7adead5c92720472bc2420b75c37d19f2ffee648bed2445cf523c8b70c463f768135a76089b243a87348f645980f14e377a9cea930fc076a81638f0d0d90086e1d54713a8721f80ec81b7ef4c39bda043b160e3243110d5424069a3480936c7a4d954cd512e0642e15543b42337a6cbdbd8b8d281116e2510fd134f9c9f57848ecf632a45b81b40d5be89fc85854397205ee5d25fad1ae49424ceda8258c431a9d380e047c84615b261da9fd3d61af153243bf0aaeacf3c6b18225e8c690dcbe4416ffce18c230257e1d8cb20e0c3e1fe18fcd421986c2399fa401b3eca1ef13d0293c667ddf4869e7858bd67ef8bded878b01c03731c2ff9be456fff7694ddff5f69e73e8a185cc91e73b8fe6a044ca8a7ca55efd7ea8f8961e72e36431c4611d3fada9655befdc3426b1c299cb0487195a16511d77fe3b83ac56a9502e95d8a00ccdb971c23c1dd65823ac470d3418a6fba0523b28c099062a9e98893b143d5a8e1e9b0f2478495e81b84ac1722cf92302aa9269b36de546705a4bd228249def296ff7fad39edfa4317049cde183030ff9e1a30389330ed683ca5bf18a1f1c5d1c51b32529375d164e4ff80208ecc4ac8f2b3bb7c4420fe3904d931f937293c371d5466e0aa0e34b00d6acfb4e0c58f7f476a28e13f9884e0cdee4b5eb55c5564bcfcb3edad5367a6a5797caf0956978b41005a2bba3275d275c5d210e7f919a800383ae15989db5bb8c2f32433a440bc8ecf88a61e53b75b7ed8a01c2e4df9c4062b1c2b6fc48f701d70a8a87e34aa2014adbc13e7245a93bb0c2a6f41108779272ec56c733252b48e88ecfc0c57e7b989db3a5ccef273b165d5394961537143bd85c1bef0447647df647a9ddb3eccdf51f021bd69a5c4814db14a2df1b3986e44abc4dd8c2e9efc10bad6e0edc875bbff776c47ef0070354dec4310362cd23194b7037e939e3c6dcfda97aec58aeadeccc3afdc97f380e9a284383367c04da44e6f14a2f6f6046bf80c9598f35331f1a0e5113ba8603c2f863028743239e6fb643fff67e8948545b549626777658a5a50cc544b4e1639e4888859c598a9279f210a81dcaa528ceb010399ad36a9dcb4dbe86e2dfb9b1ba3c9169a3ca4ff1c4d288165573338e200b8e6140be97975c0a4a01d11b881ba1b0688513c657481b947a58c256a855e657015c8437fe54329753b0f14ca5dc2466031d3003d348ac380c969c5bb6fb579cc23582874b87202068b76b906831396ed9352a33632cb81dccef939a2960823a5a8714fcf13ef3f4521445ad7fa4d496d3dc4efb1c7837a2f9ce1089147a7b683113975e80d235164f2c02992f69340182eee9aea434f4c5b3f53f804bc98b2c1e60c6d0c98471c064e711a9cfcb5111fe990de1f10265f67d28cd21a74a4a6384d49e53e43b191a7e781f1d301129f523d964b37957d8e146ac0e673fcd126e69718fd540016b8314dee79fbe432bc35daa3f3078388aad066ec691bd0709840ed1d930e67738a2b355b4cfda2a494a9cfd26c6463e17aafcb5815b5b48ac8445e24d5f1cfda0b9ef3777c0f24a2f58cab0e4e63fade0cb9d2cb593caa285d84c4125bd80a1c6aa230d2c06e34a2c78fd74dac4733a1287122223f3ce7351cdb88d925b0edf02711ad3fa38f264d2f039299df95d04dcc0b17dcd11f1149f079538689e70eee6257ba8ba85532a9afb879e765bf9c64522a7f5aec4cbd9d8bfb1689f41dea405ad318c868aa5391754a78f8d35b47db53e8ecf87fec02ea293550fef24dc6e0cfc11e93b502d626c3afb2e1600409277155fd28a69bfbf18f2a09f67cdf609f61f8a3c890673951edb4f23d78920cdb9e08b157b1c168f45ad2f8cd73931a232c2b62d5c4cc108516dce83a4bb3260006e8848136064b63b69c5e8fcb9e3afbd61d9fc4623bd2487b5ab41c337246d643af851320faeae845109fdc4600f216fe429290eddaf6aeb6a8648754188c8b3ecd379e96ded7132c80288aec874cd785721725ca353b4903ba297d656f76292b5fa5f4f9be561c4de639a6aa0054f89af41cb7b338048ac33e7d8ba371515f93c4badaaa7d9222ab3d6dd2906da792a2769d17164a3ee090c88c545a3694bceecf4ab1e484acc4d232c63fcee98c29cb492f40352662cc0147d07b2580a19392e91a0dbe45ca52a0252f0d1fe4c976749a875e91a9824a4ad32df1acb490a2958b2b571c5061bb57b32665108f383c4a7d463fe69469322de535b6436ec0d31348b52283e2ac868bebdecc72e517c662ea1420e2ea0be47f8df233a9dac41e771df965e986cd3557f8ccfc73defadacb0c835c53fdd2f0fd4b802e585a67f29d292d08f49912853080132ccac600496561df98a1fdb943f1a53bbf403c907e392a3125bcba002b1581853775d46ad8a84d89b9d0c527f885ff7a1bed4a09bbae225512e8eaf4bac07d6eaf3db807dfa8edbe84036738d189bbb8e0b83da99150ec914475556ce094223ddfa764366ea61d81ccf668c9a81564ad7c843654ef76b2ed5bd8407d61621d86023f2d32b1d5b38784d4179f1db676e9f6f96f97882a70cd33e84d51da044ce43897a29e8010191dd76e3020d94cd3bd912696a4b2cbf873a099050f5050e1ed2443331784cd4da9d0dd116b5681b20de4ce509416829d191ad8f178d8b6a168a1a68f7a0a9d509b59d6cd9d732b57451ba7d59caa22d1c723552f4246b63fd06a5267695481dfad90f4a1646f68917cb45692155f4558c59cb9e6f1612902f88593d046c10915ce832aa5a74a0cf22c141fd5a75c91e608260d02db438b5ae0c2d453b39ad74716da369e58239773c59fabd7cd27ba89d90a52ffa0c3b4624ae55a9d99aa145307dc6f5675e79e3558f1f8cb09086e9e61f976c3f7f9de8331061585d02b49e0961dc181c4d8e048c0529375f4f8395255be020b88ef7e248a757fbddd76ee806ed79c8533fb2f1f8b00f0b42b8e62e22726a128239fbe2fe73ffad1d0478714e044a519fdaf4e4706b801dc16332d2184bc824e9041b6a6734ce7585cf52fdeaaa9498aa3fa449102819f0005b45b9f6667f4fdc400bdeb3c8d4f96a8144484ac9b8192bc7c2446cc3f370c42559c58fd2304f901cbc2cccd89bd5c4db98ccf407e05db64ab4c2176dc67ff2738b667f9706aaf55578e3980512f3c94e1c83fdfc096ca7b00ada08c4b9a7f2981dd8c3f3f323baa278672bc14f3d8d8db265e2b4c21815a78f7d19a500fc55762e262930f4b3128e2a7327b23dfb944c190fd25da2a7a6c2f28809f1e7390bb4a77614e8d9dd4d11a9c4412a6b06f6829beb8d73898743c877264b60ec764d5fda11561eb330f0fa6fc9e29f3c61444838a18f3b7b598987bf87f83cf8a0c707d900fdb815b7b5302e2e0a0eeb5c011cfe26a6475f8608b5ece79af3ea01222d31b9b3853f20b4569878eb9b01778bb180136b8917c6130551a2ff655fc189b32c56875b63e8277465b8259b2dc8a724bfdcb9645eecdb04da3c7ff11aabfe6a5f52026c4cf1978ef96c9f31a56c230882b9a2feeca8b39a187e28e1294e2f79aae36e05dd3865255b32214d4ec03e3f435724c100194febe1452bdf276310313add860c512a98e9de30fcd174571a482cbf73c78e5c08b4f9c49db2bd84bae61967dc7b7e7e807d9ebcf9af37e5c1af22459ebc14c8b2108d54b7fc92f0e415b25d293d9c98c921088d0726366e4762d5c16b62a72d3e058764ec60809aa67c49937576038955367aac259476368557b563c9b418ccb7055523bb40ce828e8ce4ae77d8b8e9acaf4cca4f081361b3b084f4f935099791bfd4b1751eec0aa0d1a604816ccb54923ba5798186c0690090ad100ccab762315eb4d0ee2fa776a9d09933c891169770441c83ec869ed7745f9ddb91d665069cce12176d12dbcca8b1048224a5119d499cd0082e0b24f74a6d6cc4640ef820b6ab6836cd6d374099f74421d39336dd554ac6c59a6328d5c4ebfddf7e5a1aa4db59b44912b25d2b1637e8a185ac0fbbb455a2cc51c3d06059d4d3bc9b72b419c3527e85cfd0ea43c1963f023d279efb094fa4a962a75a8812a24bf50fd36234b848566b364e135b53b81e8ac88f11e3898cccc3ce692e2bad8a36dde9b7d61a6aee17a0ad9ee49284a283424f4d9130023ed4858813e0347fb41d54f96f7986dfbf09875b67ab3ed2a2c0b4e485391f37334b7280ca971cc8638e572d60e46b5fe4ba501c40d5b777741f316c6fd5c56704405ea6bc294616ff95d3ebfbed3fdcb256d56946b6c04e058d732bdcbbf14c4b2b5465581d70a26202dc5d50b49f321dbb18bdfa69a0c0de8227873ee9b67647f8a3a7bf381295f219414cf7021d7b633b7f95b04f43857ce6998beab7ed66e02ce435f378ca9afc2d9c97267c9289dc9ab53f92b4fe7b2b506ce9f49b073d8bde4c82496ea32c16c043674bd820f5acb061b56b0edb407cfc93423bd161eebcc7be83b4127e1fd4609651aef10343abe834f1f164a3c949275cbd854ab9e294e231946bf9d5bf170a3ee72466d9a6562d7656d0525d3209ec8d839fa8834a3af685010b97a062ff3ae0c1a80a111424f8828620829497fef4953551fe52ee21f884a3fd53dee6fa17644471f1c59f7f7e01f228baeba95416b67d24cc975394a85685ec21e576c7446fbe1a4a701dea87f7381a10a929fe6a751e80f5d7a679b56dcd61db6553bd133de15a585c1cfc32babc38e429df36b9cb1b3e93c10911a0ac7665edbb2de33cfa3b101312a0c8b11e14b129197ff0eb9f121a617c44a805c17b44943f5cbcf4c288a5aa32ee2a5080ff8b943be8d6e0a68ab835a78f68c279e43712e350c34c502ccadbb24419da5c3bf22bad29696e0f3854772d50f7968b9ca069a2728d3905fa00329552a684e4e9e5f82d55121c1604db0ee006f1e0de516ab1d70bc0ea68472480b58334b11f2ad7a5ccb5a4032ba260cb212eaef0be6ddf4c95e11c346772740989e9faadc8f8c11876f861e512b894d47a39921ab4c6460c6e8bebc09354fc804cf9b59bdad3cb94ce9085005eac5cf49533945096844f8a1113b7b4af69ee9e75f7d0099d6e75bbdd39c240ebbd0213f73a4df4cbee7052df8dc2cc845f49324955886d000e51c89c8bd9a78c043fd1e48941fa253a1d8fdf06e00d28860ba268e24d049d96a813972283575024338d4c151e95c2a4510653434596a7d1d305581dfb7be6c5115b9a93152c70f647244f735a9298faddff763b70bbfa4d5901bea34bef9f4219f634fa35a93533000336dd0d99116e4d3a23880084464052a2ec469d321ece80db6bab330ab185b32a876637306004978b49bb01081d3a58ec5c3b2f9b3b5db17a1a4d2e9c9236631b8624cd2862fa1c324217ef737e0e46cd79c08f67b5f39db24580b8716bfb096bc790fe1b02ac658c8a3c33cf064d2ccb50905963826c6850e3a4117db24ee9b2bcd77171dab1bb4aaf63ca9847a0e70cdfdf3baeebb801c617eb6e7dee919eeebb194b238fc8fb64705eaf05ca0e8fc4f56510939759682aa7d5277b968c89e172ec3aeb851a16f05bc67c4a6715cd10a8db04dc5deb3457c757a65c8a3c667c5e3ba3c81ceb5036cc17bae2a9324c055af9e7234664c3a306f5450f3162a074bc5048b6fd7663501951c48015fc300a7a97dd7ceb05a8045ad549414d086536d6ba4fb877585d07e99f7106a36e009c422fb77d27df07a1e93137268b1bc8a23be72272f76ffb3a32bac5248c7ff8fc7ad3d146e27950700e3c2c59aa1f5c4a0d083d68187521a83e36b473cd5005f19b35e6edc23ccf897a4c3fb93f859dfcd1f0f26cc45a40859488c8c4a11ed9aad3d6cac4c0c156f8332cd24c01b1bde76017e945da6bd1e13db405e8aa020319a69b4826017a36a4afa4a00d51b3705cd4f3022e88353c8a5d0dd1fff6dfe234ac3abf1e9156411e34def8a982a74b9911909931e5338cedc5342f31e5e251b9739911c2954798b5140edcdbc72c2db3d9802807395a921921326292c6bbef0c4572a97bb5d7cdd5049a2294788648820a1fc9bf143429fb3379fd88c2ca5be114100b2711ae057f598cf75df8ef1c38865325177b55648a1d15b7a5252d04c2edfb49079b9a3b4046b1e1f87ce526545a018a071aeee55747c87919e11237180b5ec6e02e41a2e5f77de1d43155514b9942ebbbcb2ed59a8105e89fafcd38858f8ae336a7afce90c14e8eaa874e40b64c03afca87c1cdedb4261c9ee486e88f09527e4c24feb0924caaa40831326cb457a85856eb55d282780f5b939baf9264cedbcc435326cbbc3b661ee33848592d6acd4d983c34e06a7b5bbdb4af61f1caf746cca12648d9da68786846bbd6e645615496d98242df15a44904dbc2e4721600338967605d57fa23233cd0d4af629f0ec9e6ab90fd4a7412817a33467402b8be0161a62288bb95c135cd23402a11918fd250f3d6d0904f1569af6a54cbe389600542e2fe0b3707eba68556a9c522e8fdfbb31b6c46212d765977a0286045fafb3918d38c38267b0e3a972d811264401cdf3586844982dd59af7e0058031992c77450b0250bd7e5764320797d48a0f3f36030e45c1a21e8be1cf44814d080a7b15e267236f4740a927d028e4ed0c97bfecee88272bd827341c703b1d4c857cca9fbd3d10a96b3e6f9fb1421e1eeec91d1cb30cca8506c120dc7a6c616e370138a02f2ded6940db5c1e92941c416c2f2af7d50ae5381fa970c8a0a44edc0fabaafba29f38c902a34f9f523050d944688ac0dc001df3ae96a435fa621cd81a601965f2985b798ad3243c70765eb68f7f67e1584400b5d9e2729315e714ac75b0a0b32c194a75a3e9c0f0ee1acbdaedd40214324409db721cbff86ca6887b90b800e7860b9ada5e3cc499096a954134f4e765f6a58b33abc4dfa1e0221b46fdcd08adfe3953393f16a8a2a117cc52bf1d0f428209ba78b10481c55803e95cd3ec79099771ed3507e7b5f6551fad4b49f0f7a32c71a052187ee35c347df512ebc40bb7ae94a2389137dc510b694233b731af2a00bd1507e07c441d9c2f219b02e923ed5e5b7a1bd0b544e226474274ec8f35a85130468320076bc9ce0c26dd033b154356d9bb33d46c556988a5ec27b97de18f4915751cd18aba8dee4a73eb172742819871c40f9495d1121f4becdffbdb6617d1abc3152254489d6236309efce375519506ab2fb31c2448b9b32d91efeaf93b80251915292cfbd573dd5ad75726989e843cf9e3934eab3bbd7adc7087be75d787647cd70a5b69ca3337b327dfc7ad5569e23663ca5ee844b7480054b31fe72b96387aca843c0b59334d599441dd664685b56bb9f4db46997cd731d2da3b0089ff13c11b09f98e135666da5306a248611337788444c59ac0aa5c614035ff50f8272cf339acba389309006f8c477867590bf080bddf6bfa523027ab143c68498b11728afac88f684ccd8e04806c91d9312fe8411b6a4937d8102715a0bc838a49f1d0e0b9e27c047a1cbda06fefe380392fa1fbfedc21a0651d93b20c81a1111a7ed0c44cbcb8247cb703e575646a5241a663350e5ee0191bb9167a60cb71321cd7211ea634b735db159bb5b420b343d4073a333091046c703e45a5e43fb48b98fbfba7761d74205c68f733cc25bd16db1a4d633a9cc89d0cbcf3058f4b58e231da5fe8de53672689e03de0ea79afc6538a62d36d729c33c58ae66712493a44c9799d4016ca6e249e2dded55ee119f8d43ad1be5920f725668c8f96465db3a1c9ae67468b8fa006363d6d2fee85ed9eef9a113896a08d35bcf3783d121589757eee278b94e71e4e94e41bac9c0e7bb844740e3abcb211ad2060947948086da401d702af6dbdbbb18bee1375ac4b2f088909309677193aa468fc3125f3d6170a1afd7fb1e551afbbfde8f61d0b71d00ac1fe932c08d62382c1f97af39417f7cea6981b125f2f3b5f7369060f67adf4dfabd5ef3da7d1eaffc64e3178c0df4958c132b673b7e24dcff797937f72567034de94f3318ba0f66c241df9003c2f09f9f71b71f7974fcfb6e2459dafe8f2135090fc1cc1468b449dfc2e5b67d926c0af2be9a478da0005d53f3fe8fa8356d2470d01185b0e45067293aa82fae2ce8445117af79631f84375d7b4f9f4e7855a9457d3181c3d0a6c13dab0a1a41c8aac32bf5c41864cb436c97e7c739d749b124941dd404c9af42f60f4da322fa05dc5aac283f9fa612567b80a664763787b9f1761fa06ba811147deac1207d0c6ef943c33d29e9a031bc144b10b32e30cef6b7d5c7ee4a1762825590e05f6b3afd1212f95458bbc1a545cd66ba2adc3b9a55a2aa3557770c610c6d051239da83d277001dbbf035b77c7ce6da840f04d43030a3f065eb5f74a0f70b78f2bdc7bc9785c5b1369c9115d790cbbd8cad3d8a23d1efc6db23b8faeeec31c15489bee096ec7381f8729e6886be1837658b80a135c4ee7ffa6d06c6fa304994bf8ba9c4e7edc8f50836ce1e1c3d386a1c6edfb9ee95e5b1bb52dafa58f7be9ce5b0e882195125a53c4e33e795eefb3352da1c20872bec804997f96659f111ad109435b95773eb88bea1c124c4516ee559e7c581d9b1143ec5ee10f32c519e3227882d82c4e74250d429c23b044616e0a70cdfb63b616562f6231c37bb53a4e4206c21ff4d9d1c431a65963fdd765f068daaa97d009778b37dbe92fb13bb0e3ebab4821769b56b7347a32d1f0631672ecdadb753719d6a17949fade60ec0f1d942bf35eb5fdef580bbda9218bdde66519d8fadae2c4f36ff389b5e8bc79e67846aa4faaad24854e95a55e654cc4c4da3720feec8dca98950ba6598e9ccacaa09a404d52945f55248e082d366abd210594afaf5101cbda6b4ea4abf6e3efbece722946f79c2de62772118514a3e5dbff9af6a22b5ddd7b152eec6709d74341278a99637a94e297d4cfb40c8e954064fc3810ab0ea6e5a2b8d77f6fafbadcbf05385f82396fd07a0441b857f752c696a469414dc1f63fc4589df6a018d5cb6a54bdb3c59219ffb3570172b02fdd65bddba677814fb1dd29ae243a7f060bcb25b7725286bb3745eb7dd95be95bd7c47c1aac839153f2e480b0b1ff021e8f4a4cf3b34e5978093a48691fc83150f2e875c0cecbb37f6381de797e0ef00dc8b883d25f9dc24a2a034e05e45682bdd7fb3c865a501f63e52af077a3ba2501270af23b49502945e25c95c44e2a72753a338155f4aa2825b35ff71efd112e499212e3b7a81d00693c768c07a13e736bff9b4e35dc5accc57a344bdbb776326d4fc8e870aba582bb7f1ce91ec7993d40247a9e4491a9ef95a5853dd4551a860f1c5b5611e2d6adbc2aa5c6d152e5a546a87f6a3e5a5e0221b658e30cfdcd11b9d873690b833c345182c771b0a14f357ec53a0d611649b93af066f6ee3a460943cdb21f3724219771f1977b5f3846750f6424112a885cb10b10f48ae93756d470ee3ed54ed81ce8cae6c3877db6641b0643689973367125ef406f696eb58c67dac6f1c1767d4eaa82d0f4d35236c998b3c0bbec8301ef4871eac90dd66739b2c73936dd6eec169479eff6d8632302955ef3e01e20193c49115aa31773c625a1eab0d69c01fdbddcf56b6f6a5a799d34d86438af30624bee30d6aa1498514d436a73927182302d2d4fa426634492cdff758548690817c85aedda916b44073f881d0e1ce6aab2e7aeda4cbf24cc324c61569186dad962ec6de7bd095ff7b0c8d52f1b64c9686f70c73a2e3c6e0e29c283811b93e76f4579878bf19a1a65cac5cbf1dfbd53ce1621dcac6b4bf1b5143a90661d14ea2287de3c97d1066a4d405e76c20e8d9ce6a622ac9ee42d232c60d2ea1f672a24414458366e6e12abcdd3918c01d7e70aaf05ae487994a5b84fb97becabc2e6a564d1c0638516c384cb27f148d497f208142b358366adeaaaf229e360b28779999395849d5fafcd6d89d96b05267ada1ed91f9bfac8985d396d38f464407d46017dcb4867d7c5d1ec491d235a0d1c65233840b9f8bdbd237097aae9ada2618c883db74dffb7b2f6d0adb19c76492332b6e8c80d8f3aa6c582595464cc0ec84dbab790bfb1de86cb54bbe24e0ad25b19ea57cac39504a65daa8791c17b2d3479dd373ea8e9f0b7ae0388da35b29953c9d46cf08c263d24e66a91195dc748a67ab3ddc1d1b565acd2a55109b199c553d040501ec9c3c101470bcf49e45f9b40088dd22a0a40c2895f8e28d58871779e145562689e9ba8893931faad1ef3b13fbe728d11f0dbdab3d898ca387ad000b817166914a4dc89800c81c1b526ffc2901db2bfc615a645ea6d5d49ef7728900978c9ea1a02ff31545255ee28100e4ec7053a2631e946ea050df4559fdda37ba1b8ede8ceb446ee7e24ef41a7d0c7caf81b65b67262f7842ac705fe36f803b11032c3f4eabd191de8bbddecc64624c49bb0c098b73095799d5c69b0394f3f884c4be4bad81d892de9e56b8562be2ef4d20ef440d028a9b13a11cd8fa6fb9661524895dd322739c762bc7c13ab66d7912566709ab1f522c406dc6e3b54549b86a7b29fea9bc4604bde5d1b4330817d0d7647be40bfd5030cc6601df002854190fd186ec7ceb90976503dc76238653577055a4ad1034198b32d30302fc9bb6560af0705596ca06b4b6107c5003c225bccd708edb6cfb9e84defdef90357990be679485cb9f112cbbad0c9513d166aa8184818749807b2665e0a08234a81b8d6ae0558c251e684d3c0897d532f09a40b1eedf699639a1558f6c75e3761350465114369edecdb9e04f2304527a68183230327280e61d2ca7b0619efa07e98b133fa0b860a735a04619e2002e9e9a71732bc51bde299beb151d4d5b692711a827bbddd1e43592bfe844ef243065056e7f40ab7760504c6adb9d899c2a601eb2e44dbd635c1b051a8ffbfb1dd8e9029c9d15a4fea5b74c905cd615ad9f8643a9af046d59dd90121092022c0aabacf2a7dbcc82250f451e008646d51f0c655a6c86796016fd266ff7b2ce86f13fe6154a4665c7333fb049d6f7f9198ebfc7936e74340d74c3e745e6149eb31988b046f38e522b2422a6bd154ae0fe6e8beb7aa4c816bd11436a59956eb134426ec501ea9e631aca105dc86c151c0aefac881e0009149a496091be97713360f935337768040b217d9c407828882dd48091779884a834ca2999c031ff13681a1884d3a90819ede08e4b07c8fc5747144c598106e02d7064fe5207613864ab49276eb27a370b197348bd556d9881174626102866a2f862d6d6c10004f2ca0887d7f17f17343074c401d78ac8fd3f47ab55cb19f757a18b1e33b324dc8894f0307fae4575108d37cd7a08aa9c157df624a116a225a1aebb0fa04b38009a9cecdb28d20df2629a4346f2b48fca22bb65573bd28652d02e4709b663d7923586ff586f131a1c22f29f5303db8e5828011dab99bfeab744e816123123b66bc96e9e64e758f805bb202dfda12395c902566c5f506626f0e2cb038a9c7676817dc72e1bf196942893112c3468e306cfe1c0ed432497c921c6b7db911b823b7ccf7becaf0d1dfa618accec50ac6fcbf48b2e01bd3d781a7a8d21bdbe54c612ed8c8e433ca4b7f8a5328d1dd9098ccc63801d171a0f131db61dc46878a0923693c19f599dbb418fc85c7c73b7e04e3ccf5786dce0e06e084541d9e1db27adddf10bade7a791511e0481bcbf048da90aa09bc7bd019eeb51748644e9e6a923a363e1bf5c6b537775d5e722058fe6402a725e61fcc89a6ff6e379864cafcac0c03a844438d9aab5a97792ef193d7d5023d706b9a5b96c865dd4873b350e3322886d3a512bab9f27c9fa91b3b870e26647d52626ba26b332c17a22be9d4add760e3375d028fd10e7a6df2c416119c56830b8e0fc91c6235d39a162a047cb692e56eddf63d7138b0e26aa3fc693d7562be780c432dd54fdd8e18a57146bda6c30623b846f82737d685b2f42141c03edea0f4924e55a45bbbb07031c9778047e62463849dc3a2d25f5666a2b502a1d3593ff07f04bed875ce1105562492876d59193e79ca4135c387d005cc5e758faf234c8128f740c35ddb4903e5cbd69150b9e5e145019b7448c24b12aa0b60c1c0461fd0db1ba51eb4a1b81aced55864b569fe754dc6418de827663bffe0b38aab8cb0b75ffba296d84bb6ee7a90d16ff3ec936fe547877db655672288790f5b9290ed4f9285947453ee85522da2e033a6f5ccd52c828803d458c84647e09ca9e66c564d46b10c85666900bc5149bc5c6468341b3f737987aa0b7dddd2804e9f5d1f0318d910a14dfc9202141cfd79a95aed2fbe82631584c8a44af2584d8ffb2a56c90fc9f1d97abd66fb02bbe384d339fb7baa271dd04cd23f7ffb3faaa7bc34843f0f4353f21d3748eb401ce0e795831e0db60024f47884def0f5cc6054fd99906ef4c46fb872ddf55d3043f4e6c23b3ad847f8232f7555efc0fe5232d7dc7c5b3dac37be54f9781e030b2d2cc1f41ca1674b116127a7ddc50febe8eb00f1d14298791c65381eba2fb49474523e2ec5307a31bc65171ce3f098087a030a79a70cb844e88d1213cfa58e54904d86d2e0222075148152a7d1a2efa27041789aa4f8eabfcb5a43f2f905a6b01200967a61d15f0ab11cc558d388fd40ed4206662ee52f41930ecf87a0680223f8ee0b1f197e21e1666d19f6f4d5b871c07a92ffb8b8e90e30c16213d6a8d2a4367b5d207fbcebec1842e5dd7ce59a9a3f330ace7e29428cb660a06b3436b169ec66b92bff32f7368608a25a3ed7f16ec4ae410111a226c0194e7aa3a98e7fcd3ac238f6f34f5fa5711c37b6081281de0ab688ee667448fdad44ee54da9cf6a0f6f94cd0ed114f019b5bf2f9e6ed21622f3699a4437136159275c437736875adc7654931be3bb41d2e753407be0984e923fca1b4b086a5912c24b104e922c7ab58fbc374a12d75be1bd2a48285b00365bc3692314369eb1d71b85c42f09d747ee0054c0d9eece12f11596e86443013058c81843033b96f2031e8c2c39611d1f6fb4d384109fed2869b4f5313da0b9800b41ec60907fc9894170486fcdeb5835960ee31fe63a0d21e3f8b1539e938f775b1fed43ca09b0d6f9056384ce40d992008ab0bc44696cdcb99d24ab7bc031b40ef7ad59c7bc93c47bbdfcee8f5643c0504dfa659d794fe8f8643a0bc2f3ac9bb99091af3b0ae2784e23489f71d22f42a09e46b4de865befa2a346de0bc882642231c1f76cbf6094c23002be31429d12222de7450de501cd8b2af9202750593bd38b6c35e2cd25fe67819bd523ca87e5c24b7e517b746a23016f645ec988393a89f1122b62fe4862bceb1dea888c825bd5960d4029831af2b9aa1075c647291690fba5f82dfaf332ed2540c9bf3471b8744ff79882d22b5ae7d318d70192b5a12c4460d46cf1af641a69975b7ff07d41ef2a65ff1e51f36512af357c16c414055e5b3eef7b5268ad64650e4fd8c19f4f2fa3a842d1f2cdf0a49005f5d0350141f9490a5e2061dd03eda013346af81468b1855f1b9718020d0d158973a41b38b270e3ced6b50c4ff42bb78b4a3361b121ccfef2472d4c32592a2a3f4155dc202a8e784b661a1a28d224714853636900f10c37a31deb824732a3d56aa2daf861ed337d7cc89e54b648a78666279d903d475f7d0520561a4a2e1c25ca1a11ee59543d90ee4b80aefbd9d776187edf7bc35b3df1efd2f0c8410d5bca2536c75bbf08f976efdbebdef84cbcdc40916b9d38f1a13f32ce1f679fddd7c24f5f926c1a2c0a5ff8f7a657eb0bd21f1a10a0adf82e62abd75d057b0960a08773cdd04168a40ea6b9c8cb1bce3f101b1fd1fffa4dfcb610905f8279b9d2ab87f2db75757ec60c93937bba28a78d31753e536f04f9e84d6c7411adf693c26ded1a4451d08afb978bbbb2bc12591f520a5d2bbf1aefba606285c479ebe5acecba1f008bc9b4afb3503739bf1e6bec461d55dfda827fb3195dab61702d48c505b88925e2cea0fd0bc86eb7bafd2f480562bfed37fbc92b2e2e3904b07100f8da40494087a968425c85bc743e011b137129fedd7752a66f1dcbbd975e6fb14a047ebad528168f98d9491fa140717bc20dbeeda0c0aa4ee2d0498b2e017e21fcc06c5a8dd63dd56c7d93ac939832189bb20e7816c0e0b3d93e7dd3cd51c79cc27397565fc31cdb4ee34ef9365c2812c341c70e4d312e0076d0154dcee2682a1ae2aa9db1881acd181954a2e1743661cb7a3f524a855c6f05e4629578c357612aad2b23bf8b8e9151b14a008d4cdf7d5574d330706ef158b04f941249c139d7b2aea6e5bfa16d649055a7706e8b883c0d64a3331d08a65e56dac6fd367ea257f84ae464b3fcef0555aacfddd6f6fe9dc5a2c28f2b0382069deaf7cae4c14dde2a4af2540967ab8fed78d2d377d70084c2266d135b61410e1463f212360c290d1c7c4792f721b046033d6ed7acf193405b973818af0ec7e026c80d0a28b9fdc09ea73bfb0d0fecdc347d193d107513115d520c0739fd34ae7525dd795d0a4d6a8bd189042303c3944dc2c3bb913d40a918722ad5f08777bfa45e90125afe3160a9cbc067918fff1847147324879610249f643f88086295a6d7ef1b1ba0c6999f4fe41f2ff9b88d54445b94f58b066d56d405b452b3b38c8f51fea981f4a21da56426c1cbd71cba4dcf362e432481e4bcd317b5bd0a67db67b0a559dcc252b459ea1847dced7c8c8b153e3abe034f70e2b29f708783ac9c8dc073240f49a7609662801c9f89c48d55772ba037be420b47a473329e21e033021ae4da13729695a7bb563f6c277ced9bc63e305ea3bc2b1f9c0e7227099230376bbad2091e51edec9e4dbf0d2854f8e75aaadf13a5adb51a95bc19cf53f1d13716084390d1e765f3d4b296079700bfd7647086e9e01d4e35223a303b9a10fc061962bb29667f31261e7d6d00ab8b044ca292b91ddedfbe6877d260096660e23c6b8c41e883763b636c71d787c019b3eee8665c401178af18a6403dcba1c8b6fdbeec3a0fee6b2878bc03f30a82ea62d2cd60c46524e445205c68cce4a49f145e2aea07be1e7e38e41ccf7e091cddc2ab0f708b9d210c8bfc2af7b4d9b7ab67205b53667c8e7f9274e2eaa3c5e4cff1b6d637b802f189ab81b1528f912e0f398a6e9b6dcfbf2cf968822d95a69b1bb98f6bec02f8b2d4dd4e5ea78dd4648d4e9835c2c5d6ea6e57a633033fef44eb478a056a485c7523348583bfc549673c39768c9e0c51649f6792be29a213655f54ee2df44610776c42223ebf6eccc4fa6eb7f122fab17d82b85941859e556ec947e5af5ed293382485a5dd2e8fe0e34edb3e6a0804e92f23a4bf9892102abd65310a2d65b1fb7147d5a29155deae468fb8e470296c6a9c55f04b2dc6d42ebf8d65e6ceafbb42cdb526f7b1af844b7185234b687b6fdb64a530c5d63b60b062db1a9b2445b6d424f563f784e0ec58c70ccfc6c6ce04c70d2d7e48767ce7ac6989679918446171e50791dcaa69a6125c580e5dcc4ca1bce6eda84dc3539c95f658c37075b16f6843b3f5d306cbeacd5ee5c14906f58afd327cde5c43d5cbf7530ac0d510b206ff85da670d5ccd1b4c40365287bd48fd8ea07d33241f7da4b68fb0b4a4c55f481f24118143c7a52c5ffb219cfdab489303321cd0dda1232eea3ad777538a4a7ceefe8b01e7e10681d51bbb283ced841ed0d0df633d40fb174de1397c9b193c0e638828e82e2c9a20f59329ca4287d61feddd39fc3e476e4d5800cf9fe1f2ec61ee4313409af24d344c38c57c74b3ca3c0d0dab0ae4e8b91c5266605797626ebad7ab3238d4a7411d554c2c233d6c96f0cd15fff9c548cb6d38a7633359294a4c2d203297e0fe8dbb2392385632e915ae5d230d9eaa57ae5ab014b4519fa4aaa953795f9385ff9459b05b7f88f98cce6821e3532f27edf388d9d98fceb5b92c3276c4cd6567375a29dabb52a75da242b7a314809d267959b263df1e6f373b9c77d8861c95569c9e9797aa02b7883e0027637e1051995b20aa1e33db0bfa6a0c679088da269cde95258d64874164f02fe2a716bc6805bb2b5ae2e85f77508f28d09e5a493fc7c4b4ff811d0b205399221532c678a4fa0b95df74ac3c736a31654306a9dcb4e9465a15adc26c57442449a8c83319efdecf6d74592421c0860b68aaf60728912ece1ab8daa507e32caa501484fed83c9a5689c2de2ec0af973caf23d907b403a64b6b1f3c21c2e12fb07afb69b89aa6b81718dd20eb03e086e3cd27a9b64ae9b033b693fc4e1592387b1aaf070269e2f716cc694246582a7a7056c2ff46985a397770620a0b33c81ca8c908f889cefde81ab7830d7162800443649c13961076ba66bf3ceb306c45cd5848f8b6bcb6495f7013fd3e84baad8350d369f53c105739851238a9f0c3bf7e03cde451595445093100e63c376aff60a216a5d51c43ec80bf1fce647237a7f22bf19c83199388be072c3982af0259066fe01afaff41a285f6d990bf365f5546d455ef7ee8aa0c71fc95033068d0fb35e36278a00701525151b92729f20716ebca2a2a91aa73b8b3d7cf1095874df4b74ecbbc19523818c603877fec492228aaabcb49cb0c5f8256267b76647002d288a0d23591f620067e987c241bcd08ce276a073e21b3acf61331edbec6bd129c2e7ea3df45be5808109dde59d1baa6456912390779193ef5177f0ff4e977552ad603758a1373dd6b5094a626b55de0f336a058e390abd183a49cca8a965afc770cd8279be614b1ab9d1e3cf458490030411c2e1f2f04edaf1ff1a33d3e08961988b2ce49c2b0636a076cec93e6b2c90520cdedac14c4a87443ac5cdb189a42223ee196d21483486df2a64820c35ebd7b680b1b7f6a3d5dbb5756a7ae7d79a82ff82ff440b4ca9afcc1ed44dab63bffc93a3ec0d87697d2290374b472749fc19a42ea1db1dabfc41cd085fe6d52a1a557e8ba08e9d01c7db50515c2a32e3c5891a7ddae9223edb98edaedaa01915330d2b84e2e27a2b90ab1098c149a81b60b522e094923e158d9fee0f9b099a281d6ab3e9445ef4f4fd062624736cc9e620d256743c62c0d387c348c2fb60453d74f1a8a6164cc68b81077cb0d29d4d2846ae974afff20a6eb3df9e464f66c47b4bea18301c2eac14adcd9bc56eb6a12c7b6bf45c0acffab7a7b1fe70d69f6ae5093143d7dd900ca021ae1c97700ffd1b16617b151e8fcb7ed40af480580c9cb4a4c92c69b383cb88edf652feebd84bcf52b30df8dc58f485d0e74a8b2fc908bb69f2271a9412c9077331f537765b857be7d6ff48e0601b03755eaf7e5d2434077215131d55aa3a361ced31dd9f7d055e6cd589a5a48a2d43b0121f94b6a8bcb8353526b8c16ad83f7501a2df9bb237f25fd05bd8449b295775fbb8b6abe34f0ea66038f385c2451ea912db50134c77dd904a41ab0c54c1173434742c690ed384ad073ddc05144870c08ce31fdfb5b86ac5fee2f9e49a276613da33d682a862fa272236ec96c36015446e356d7adf5fdc197d757b7d7258eac95d90481973785b6471ac802f726e17dc824a5860dfd60f98f253aa6bc8376c71bbf88e14fcff5f1b0f473a03229308410fec36fd004946a8b6808219e95c75fc36e9dea6cc242d4d2f076e3c17bb0e7602a8012afe9450778acec6ecbe39d865b8e73ae85f9f3c448e0d7d5ca2bba4fadaed67cba29b985e22a2442daad690380f751dadc931ac9285a6054fd05e01a8ed801b0db90749644673383fb808a8adbdda51000bb08c522fc5768e8566b4280b0408c36d9a6d12ef4bc0a31095babf53c64793a3b794eac375708c3769ca46786bcc2d90d8b9e2f8dfe18453cd24f1a495fab30be5130fa2e4a5b1d22256f43176c4a58028ff12eaeec070eb35abc8cbb5beea7a0d3e390864b13ccf18d74debecb0f12e4db6b1b2608da8bcf3c4a6c85eef8db244b691d5732cf20f0d8aab1f5b8aedbf4777b4f4801a491f40ac7f5735ad60c42689138cb2d648ca60fd67548933c869d5f640aa29fc533c928911e99d375fd8a7ebe28309376500c48970cd28c020c7f3a338fe889e1766b276c6d175e090263edb794ac371a1a22b9adda656a7d3e3712cf20dd1413999b0ac37f0ffd3227c40d136a78c74592ad3d91e89becd842ab08a3d0b16d0ea230c5994ac0bc829477fc6e8891778006c50533b83a68542d30c36aa914408f9190ee72b73379b1ee6cdb9d8db26cb50233137ab3cbaacd0736f5ac3995804fe4949bc0dad0e1108f96f39c07e1b63081908ebbf9576235bfddb489460bfb94217d09d176947e8d50dbf4dca0fff975254a3b275b297b6930b2d04d9115e6865208cf1097a0cd1c41df0f8ab22434398a976fe8872c37d4171202fdd969cd66959ff487001c41dc62dbabef24b40a14e733f824bd4bc401cf0961aee662ce2c08e7e71dde9da5e7fcb0464ecd7c7b652403d712bb9200dc6c4b9dc80308b91101febeeb9d0ee049af0670d0205307a09d386e1016ff3e0247e563addfe562bf8f1b589a605cc713459c887111c1a6bded18b0a33eb3db58dec051796312261028fd66af69e9dfb822439c9a0274162d61a1a4c72cf0b2208404114838055e53ff0fdb86856d3c6e4a28365056c9d28b19ae8fcdbad74e631bfe053aad406170f9692583f09452b3f298dc7cf2158b4429cedcf38619e620dd60723a056213103904f39505fe4b956ac0e7e4b4ce3735d2db55e2400d27d5201fd2bc24cf45d2bd8878a0838383450e6d2826565c180a2cfc76cce131ca61a05bbb11fbdcb8bbd67e40d668ad90fd0a11ac827a5d07cfa0555d2b59b8f2f2b4f90e833ff119da56c87108581c2d9b5a7a03c70c39e1005f18f72845be647e7cb63c6bdd8d58bced3ed7df99f355492a32ebe824ffe90b33e8bf8eea189c64038f7870ef9bd1aa9fee79a43dfb806d11e55e24610dd3e0a635a2d039fc55e449d1b62f22c1662f619891f0ab0ea2ff76653c17985fd1b25881be516a66449f1832ee84562b63bf104f8d327b1e56bab6d6e14ee347a64b5bdcb23cf1695d7c85ea181e875c570ab971cdf2c80a15fb49758caf03da703063f19abdb6ce6e4356fd1c131efc9b2cf1d3dedf968608391ced7b96ee6d071c6a8e38ae76cafc922c3dd99b7eb5c25da32c8892435d119e8533fc3bf65ebd02015b7013b82996ec98d18793a6c43625f0ff004762ab4df9c04e83b4768ba6df27a8b407f5149907819b5344f0e4a76c433ef88880293866ff353ff4f4b5f35789694ea52008808e815026fa225f0cd3636f65846fed129935f410b495045dedc4e2a706cdc292203e0e4188a27690bea5f86f22b7b5a857cee935cafb9dd50ab51b32c6ab96a104271a12afacbd795976718602098b257abaed5d77d1eef63650f2db3e2f815b83a359f31a74486571335467c4640d5257d731515bb0ded783e589fb8559e3d7f17f455115860d679930fd5984411c39c2df51e320acfb8c2b8249f0f80501558bc9d97e4edc268de6f98b60905f169ead6517061521999f68d1e38c251ebca319e222f8e48f084eacc6ce695f847925a83d2db6b75ac221d6e092e7338a703e66f5ec3a3a4930e1ec40a7805b167b1256af10622fcf44b11dd191f4f145ec0ac5fec7c99845beed924138ae664b56fe112ca3ff0a2212a043651ad8b579f32710de1f11856dfc12c6be0f817fc81a0e9e22ebc75806103faf3bc26ab1854291ba3ac0649a8aadb04452e18456af98617a3fd3538f315e060fd875bef2fd0f58f8c2bc0d134e14f71637cf880c955edad8e8b611258b9d0895cf2304e46380b28b1c598043e82dd57e44ad06bc617f78ad02b205c9a0d292e0ccb903a834989365267713e54690647ea678a0e30f8545f43420a700b965204ef96330855644eee547351a9153ddae1175c5c3a49615261002a89a3c7d28061d6870254bbfcf8c4d3f232c3b458bbdf452b4ee34f22b3848515cbb8621ae96977019660a2a566dd107b2e69d8f88b8b63a3a3db4c384833cb5dec81772ed77ad64ba5d2f574c2cd0f344976ed58deba32a0351fd15b151547da3ee939f239e01c7243e77da80e84b77ec27a9ade9e837aece030d51662288da86781348da2cf9e4d91fb1cf94d77fa9d82927fd506624718b8cb4168d64f1be9d785abca0fae1fe967e8bece4a59e416fe8fcb06e2a6bf560d9025878d4ec80b8a1a000f3460ca67d4d0f389276b674c70b4222c1c22c5bfbde3e51faf73e1d4e1457d17d911bd02e2e9d96571a739353a1a39d22247711eb86f688155a2726035b1db07adfebdec94af9755e8a48273d18c61d81e6f03afe27cf96adcada8b8e2422475af05eacefd52e17a3dda8c655a41d9b8300f1e6f94d59a743ec7ba5245af0517981f8d9e6f8baf8b86a0c82fbff35b84fc993861b390bdae49f3c4c73768f4106be0437f20d00e5b95a3cf611821aafbafa8c73e48c18a7012c4d20f6cbe87e71f5c6fab6e44556e79f75b643915068073f7a1d94604f7226ad60633ed37bd4ab16e4415a7b80d7903b448f9031760807a180d55a7f1854579b5272b11957aaf1612d02750c1b0ed4a59f6a0260da01bdc294e39416814845ccda753801cba9e02968325471d550cc2b2ef8c1fa0fc8700126355ab49b98e12c2b160ad383e59a00692599dc3a35e8b9b4467ad4f78591a0b8fae470077f55f1cc14fa24a682c61762b12d9f60de3c89110c2408f3a83c4a2a9c87d0f3f111a71d5a3c35fcd49da62b08414d6d34a28878cb2b1a625dae9d88dbb12b6385b1ce48e25584b561963cc230d98d1c2b6e31505279a1f0bf4dd9f44a5b50108abce5b4903110cb5afcd61c89c91f2ac4be423f7de443819a9b38cef2b501ad2a42123a943856ca3e66f327b4030242bd9639c4901443a99f54c2c08d768bd4bf755ebeca478b2aeae56c936ac081d81c97b3081a4a48d49978870f31f7f774a63f0102348cd06621a8465bc756d11f7edafaee277d33e7f2c35ac543f025e1db35138430a298f796cb30bf208294ef18e18ed8286233e477bd1e21438a8088e5b88fc664bdfefad96158f5f8db305babc207f361aa787711edcd0040de5d2b60d38652981e2f1346fcb1af0412113ce3b1340489010c7f373f1b4218e146858c017ebd9305f3524de2fcaeccdaa814c7dc88b7202fcdf6aa417745bc1ed88fe3e2bbbffdfeae08fc3196641dbc86d76238e96d608cc0444359d7de34765505d899cc0d538bf10ebcdeb8d945abe5a1ce710b676394190b80a76b7f6aa56ba74f2a7c86a6157ce8890a5dfbe0a62ae28ae7347f0bd44d3b67461b7d85a6739215ee65c9f304f1d64d34baed53a40b135f1080c599e30fd504f462631e69f743e766f7a8514ded78feabb6ca781789b2eb83ebe056286d212175c9e08c0a5f1991b14825c501f3e7b8b59e242a11768ce43902711722b383c7e61e150d4eb1dc3d7b99dd14b1565b2f98f16e59e3f6d3506d1ae3c1e4f6b310da49462744bf307a6b1d361ab45835316aa96ba83fe8e2e5d5e2d0b836b396ea62de9b5f83e1f76cc1fb7adc9c30983ee0fed148a50489cbd1435bb0d69d2d8ee98754690fdec4ad02506ebc30f255bb96c281e1dad74ed2a0ac3a477f597d961b2c7bd0627a42fc11d00d04e5b59c950ca94d00b64bc0945fb3dc5e58241b4c3c13b846b61424c6c86c751c55749fbc48a2545b6375a0b09f5ad8927359de381f0c4b1294a50d8cc73ba487915775640afe2c3cc45a7f060cb1ae44b2931ac78a2e5539b3ba79184d775a5fae5df3d433e32c312df49171bb3c7ff1206a515562446b7a5a0b399d22247ef327a5487927fccb78aee4d40fa26f7c0757bccb233d8e2af61d588da5a51f5a00f32ca59af193844e11787f86d1fc968412c1af469bc8cccbfd775580dd646523d2fb63ba43e608908e372216bac21f61bf3a359da80ccc9fb3689d5fb058f793d2bbde05e6f1339677b48a606868818db2ed04fea2c00fc730f03586e116eba4642c404df12f6a09879ecd5d620c7af27ddd8e5b72a3790c48239ab4155e147d0c26085b1068686cf17b89e8f62156670e25f1d1b0234a2c8c2dd532606c3f2b8940066deadf66f56a922b8c9cf60da212194af4316cd4536a0de98198bfc9388cc1b7c5cbdeda337e1ba003451175a7b390a11d9e4040894ad34eadf3117b6b3861d7ce0de1be0a2404a40f7de0cad44410e0f892868a392ec0090cfa482ffe87de1dba5402550fa24fb045ed2efbc9461e05b52ae48b35f65185464cf6b462e063f4f2c6063dffeb4848b50b52a0a14105f89f0aad3dac2c35466ca7af93e8723ffdf0271dfc73506cdfdd8320a28137221b7fcd608d32ac486c2909c1ac125b05ae3f11281019adde1c1329cb3df59849f502c88f1bf3b9dbe218cad2299ee2b5cdb14715068dd52809b001e98740673798fcbb4569e6b557a9f6daf4cd90b4b55f6e151cc2fd4b9646e97136b108fde318263696076ee49074466211ef7c49c13ae075e9d83845ead3cc005304d81fb57cdfe489f2594235f94478622c8bf8383ff6074a8daa64024811500fc192f8c1a925a5db63022e2821d52dc8c53e41c5134433693b7f67e0429f6d0a93422a684846bfe3e797c3dab31cbd0e6dbe76f6788711d335c3bdc070c8ad0cb4ab20c22102d82989e9baed187e4e21df4b23ad043d91383869311668ebba68721586a097fa504823f94abf8bee2c60787b4e58ed29486b2290f005ea5b32ab0df41b648a4b8a214457f8d006b68db587d26a474d55acfe7bc8bb9a795e2c101aa468001dccf1271148b7818fd7728108d3e94ab8d42ce7ea4e38e1e8429e985c08a5b5e2112f514f35ba2f6efcbc52b672a1a6a1d8bb31a3353bbd89267469059d30207dde74a498105c20be18992bc0304053b1c45aecb1e82d652fd88a57e6d875f16ef84f3e627ec84d1179fa9cf46e212ecb9728c4938b398fa82b1517b33f1940bb31e13ee69adc6d9b1ac1c4de8c40caeb788364dc5bdef3805cb6e2ceef695627b21b443c45613a8bb2f2ed5a0f2efbfc2aa0d428179a308318c8c7e5daabbcc30e7849bfcc11c8db56ea1583f0de3d322cba806c9249c5542b2c9877ede25c23475ab5727d3543e7cb7a2037b9356ac95ce4e7ba518385a5bb1a752e9abc41d73b3f36286c2f0599d3e9f23895ad4c5c4b442811bb430c470e634d0751a5c5eb0b4eba30f482f35b67acb748c7a7df179c043f661a2a1531e30fa6a7ce50f9c2162097b0b3d168abbec56b36d2889ab4a8af033097c9aa15182f3f3baf6508bb669e14dc0fc26055f4699522b318cb6fed27025105446dd3c9e62d3d796934d0fca083ef3e54123992cd5be88cb6aa4acb41ef6c20e394e220d368258ebcac7cde12b2a3231441db814d82110e9a078cd9c3afa8e7cb06bbecff84ddaba5e21d0a20f66938dbe31edf9d6f0b28b8bb04167eca3b2ffe703a230e8ddbd4bcbe576903cb061a907e2d01feb3220be336bf9640965e64a2d71ab29ed35b0bbd0db739a0c3a686f44b2d3c4538836f9bd32c4921b8867036bf9e0df731b46458c0b24100ab9daba55026c39d8ea78eab8951f7248d77b119191f91efa5d7b698de7e209089d1b452f538762a8b6936a7da646460e43d49d78424a3848790bb9c2b9bf641b1dfcdd9ab695301333bec634e610165af8860cff21e80f301cc0053cb26351fb4160aca6e99fc9c1717d635396a8052fa97029219c6570642c519ca55d40883f1a49b1b94e42d44da967bd7983474dae43a0d9c106ab6957f7bd7e98f919cd87e29f46b4394ae40724246f783dde38bf5b286fdaeca31981fc047567e7f6e353833e548ba1ee51ecb2cc6f575737568f203bbd412c8642d36a14c10347b3843afe9079b67adf8bfbd888633c531ce524aa8c423e4c106a287a733c2dc49892493e29a394ca38c289136c34fc730d6400d66e56f5befb615a3cf83910b1a35f704e7aa114a843f0bcd23fad81276504b8f31298046e11e91332dca33890239c82d924439f258e00e3f4e621b6ea4a645fa1c451a0383913cf7b9f070861a92b4b935b6a513803dd7e65ccb44ae88611f7af66ec68ce1afc575f9241afb39943550afd4e8cb67ca4e6c5cecb86de427b290579a207cc7d8252b27062dffab384ba338d4cd6fc2573f02d4a0421a51ed218b19f2f0fe3d81eb819f81b4c6b735a31edbc59ebe5eba4b081cd151ea943052f72e036b76b07a70455ea383f291b6904f1f9eab6c793b645c73635108abf378a9571fa6a505de763ec58f9195c4264ba895c09c3be0bee4644b65b029d48f3c48c16859f04251fd2bc24d5d83fede56fb05d8ea311abfb620e56b13fba59fef5f22c98189d3a94cbed22b0bf73396d9ed71a986d07bb75e56f6eb4955ac218b1243c205ddc5b6085da66fec5fbc41953b27b7b151e7317c3e6f9fa9006f0f2f89cb53092486577244abfa99065e705a39e4ae5e2f9182626c9c67fb0c3c17870e6a3a9514a789e90dfdf977865d22ce65218a910214de41a7894766e9d41b80aed92573c0c12e1da0fd1592a78bcf60f9f4fb0c5fa1cdfbc792f78f9714ce6cdd692c76e05684158b827c2fa26f03a9dcace322b61a76180d8e91063a8807731bf46b5a4f05db19373b88d85e5ca06893277c57bf2c1d781aadafe2256b599f2103d19a9ebc7c75c42aba47e25e31883f138f7e5b214a3bd32ac84c41ea1c60dd43cf2aa7402729e7f6cd68bbd47e26426a839c8aac6faef6552267d0d7894bf5e95618a6d7bdffe5c5ede31515e1b4ed325f5f1550f8886138ca405ef357bdc79bc0115462404d615762d78913c8f9292bc007c9f9abde4ff78a6cb6f0d2640ad4407602afd3825f50af05fa65db34e8c8ebe1460f776ec01e512e4b64f62b81b3367c1572b7489416368859071baafbce97d325940304d6f58029294e354f9e03f4d03a42e4cd0e30b88c61d9399fa25f076f9bf896f4733a986d1d9a63d17e26705f1a681a36bf5b9452383fa018bc48d01a3f9d8344204c989ad191c1b6ab65993d57ffca0e9e931f34883821825e8378a74e824e48ac94607602f5f2659d35d41682c275c861afa189b898101bec6e1470a82a16ace3c95a03e878d8b76c6dad9578668fea2d0952778403f082a683c5df519c0a2580eb9dde228e0284cf84c2936d3777395d49a13dc50d38bacacdf6cf2003d309196c92c17983a179777451abc874331d342e02c115ea9147a565968cd52749918105793517e9ca35af49a18626843b6f1a63fb087e3b4133f55cf2ff79ad6b113f40e04420aa1cdc447c6b3700b6041acbc2a17fa81712445a07f070db66f4edb4408a8e499fa7cd821908bab367cdbe5f235e3023c588d872f3f415ffe0c461d2faec735a339303c63e74f57088cb89775dee600eaf9a53e6c9608dc9a8467d8bb5b4eebd69c2ed440927c45337184dbc906963f627a13f13185898faf4443dd558ba30fdcdc4a6144333206c945d7db4d5d1460596c31b2c00e435d6326e95e239394fd8e9bf411cdadcf6f9899195b0898ae37cc25720ad74042788885fd66da309c6b13a0d73bc0678f0afc6b0a71fd7414e880da125f5158d23fb53567db4a42141a121e7b2326c50d3ab3ba34bcd2032ebd41237c056575d26c85c426a8ffb575054ea3173f1c6833fe8582a10a269bbaca3d082ca1a52e5553c871f0f82522deb356c416e88538dad8e1b4b912c176413573507db238d1a725533db557c2285d9304e2b7d19ff4c4d24fdb48cbd9b6f19d9194ce5c3424431c0fdd583ab25305ae6cf6b25811edf0f01f7224df67873b293930dade3e3672055224dd0f9ed455cfdaf041268c8f49a7beb51de0aff27365b215a241d71f41174257eeaafa0a68beab5a9ddab171a9db0721ac17aaa90242b6943c394feda96730f8f85312d12c27a7a88e8049486f162b3ce5b02111db0fe360ca416d27796f25d9d2e78ed1e5ebbc0a20b4083120865fe96daf9125256bcc530a291541fe87c72eab57e15c9643d2a61e4db5cebaca8f52f9a85a0c78a40ecafd1526a927f18039af82075cf1bc0bba98f7a00402c1b803f4c574f6d40db76cee91506d0da21402298b2bef6187aee3b85f7e153386580b82914a4b3c69cecdbf1a108c70174d933c9db0f54bdf8f546b514fafbf0512de6d20d780a002bda80a5726055bf8a28603219d862fd92910297e4ed0227a3437e42ae3f78e8e6e22345dcd87ea404d0e29f6818bc82dd1da4109e030465210fca758bf462a474af16fab51128c5cdd66808b9e038eed7cc7ef9956a00bb082b1c4685bd314aa0ba2492cbd7d10bea7099d18d1d6a377bbf1ea4db13656f600611c12a84cbbed41d571aeb9934036ed40536fcf813125b2ebd953e25bbd2a45cb7a24ee5f6622e8ab37465619bd178175df9b7c95ac64367378c3cd0140069f1a771f53c1aee04e1f055038c566b91b95c7ca22655c860f06904f68b7e18261c129e2dc1066f3675361e66e7d2ab46b72a4c2a377378da04199aff21e80ab70b35db6770582ba46656d2137222a01a683821b72e589c8aa7f49217a74c628dd2017a48bdf83b2f3462487b2606f2f47b1eadd7abaa23616f5adebf77a39d3d323d14938ee88ceaeae23e1b4c9b3e3ce1f472632f5b5f39d76c946a67980a135458b3ccb1c9509dad37b522981d514b41b4c131642b50067fcc118d524317d9e9bb442ce396a86e5b428b6a40b0e6e9e857065be7c103a77ddd2532889c1354383e1f9c160afe5590bf756109964587b7c9f3d92666eb9783551511848096b8d8fd30f17c9642c58cee5c0d6de55c522906e7c45d0939454bb44fbb47348db92fb76d51b2e1d7b32abbbea0d179d49ee3913f8165dd8456d2ba61a5000ca6596b3b9f3723523e0a7d82bfd26912cdcd8870dafa7bdf5b480290a8a735d157012a965415686d529745418d21602241402b778291d72f7fc183896d77ee248d3fb8b61648c9c9a8e19492e106ae93b0cfc4306970a53bdf9059f151b3001eea9ef41e1eb894adaaf54a13bc734fa0e6f6112685be9f080717db0122d99faa1fe97e05fc1c57e6cc110280d9ab0dbd8ca86243f9fbcd6dc56ad9e77625902dcbfd7b5a172cda669cae253cbb95c3c97c18ec3584f70c4491f6d34a2c55bca6d25d7c99801f94e7661c0a03320031466d9e9adba4e1981b7261dd844d109016712db57388c1d35d1b999928634f84d5ca611cac5e53d2e2039b2d2c38a0d3ca438a9502964a21ed1ea5ed8c044b3e022a4aa02858f29d365559f77471675ef0755b25c5bf04c2f9f3b1f39d920e1b498a3f92020833c2755565baf15e96b2b266a118d40b39653c63033d31ba1db30d33b5f2e9237b2156a46bbb2c74619f06619a53ea93bd56ff1fe58669fe7511c7a990ecc1a5ed2bc9e6d45f87e5196d40abc44772e37ff7f101988e8a9ebb9ad25949d694f124c02153cc6970290d864c9fc72aeff8e522298c4cd489ce25e2789c1921c1422806bb805c617c8981f9af5fe0e4e9b95e6e60fa69beb19c5fca08a0bea187eed957d3893e77b59a91fc97d7290f6c23b4e17520f9430e3a898c7259cf76caa23d06ccf16d36e0c7900dcf3f1c0c6916d425e20f7bba9b45a1d09dd87e58bb85a621ba8d74406a767ab59f97334fb7bcfe113e966f57ea87b90f6ee7bf4ab3660f2436c764f87e32bd6a4a5f978fc6e9ca350260a4c1d4d1dcbcc7c059ff8de670c2a5faf08f5cea1d9ad4f931ad45fceaab8ca38719bf8ae152e302a7e03c453bb3338d02c226c1776fbe8e696def33cc9a8c9000c6b680a5d20055aeb5f01948480f2206be62f668247ddf0c7424ca4916f324aeea057e551b0629edc70cbb75059d714fa3f5d707c4602e27bae0361062da7c6e503e62ff3c30b0d6ea39534d6c23d2f89dc49d6488392305f499865b2e861f20775641888c38bac092a1338f422c4e159c1e1473ff24bd214cd639a5fbf5823bbf3537745755101814a4cde63c0db6511d4390fce353cfa12700aeef529f39da47d3d78b77d7ffc08871e5061d166580596586a33022568e0a95cf7736f611b39b315357615d4a3f6f86211409cb0cc64ffb35760123cffa28be2fd724596afd020fd0606d159ef9d5720fefe5273afe00cc8b7ed5865a5d488980d67ef2092d5bf331f2fe24071b68d51254e57c1881dbef8b4bcddfb4553081196965fffc1b05b39562a191b41e6ad1551f9afb575c21efbe8616e516d9092005a6084a09459996d80416e9ceed1877dec58fb910045aa73407dda5e58104366d3712aa903d766c352b84e78676f30cbfd99547d47ca08c2c8728e5f2ae3df8a8312186375af03aa99dba2af73c21f87ad675dd8798a7c997a65a3ae958d01b217cc4b98bb08a3abbcb77237092036d9bc43092367d4d0aaa905cc39e28e11a72a5045123d211ca54d98e669240dff4883fa2de45daf38c752977fa811c1b55609c8309b3550a367079c1f6fc8ed12bbe2dc4c9553470a59d54d323420762f84022764669e2bc16e67d0bfbf723c270ade8cbae829256ae252aae31387d096eeb18989067ff40ecf6d9be0342960df95780ef81a84951b907fcdbd61bb4d88492c590411462e5e1639a5fa251c03212ab94e4778ebcd48ad5df206b2fb4fc4033833b9034bd6ead0673578d551691020256fac43fb95aa6ae497134ca08e7d3518057f3261387cbddbc1bbffe402c25564a7f2af46154124ac783318364a6f22f293e3a82528bf3c284babc3d064f142758ea9d291de32f62ce0008ade2de0a150a61c86b011430a144588b7ddee8ac29f9fc767a89615593c7cef9a3e02db71efb96210ffc816057bdfab5fd9edfed807ffb3cd84a99ed564ecd5acbf159a7662b9e83f401c9489b65f88d28c97b3be308c3119a80eb23877cf281eb11a6be5e765cefa15ac4bcc8dacf47d8e483877609393d19f95c9a51932adea06a1ae4cb3c0ca4867dcd8dc487acf0cc0296852ec641da9d7c90adc81ef02981c82e33da89718949f34877cbe0787bd80b8a88a08b0d6c8e100a911a79aabc524e257890db7cb927f4305ab2683ec9d378019880afa570ae15f6a52e8e170567c9a91092fbc294a7bf71f5278c5f99b46b78713fcf3b9810f421acdb2b014059e9cc5627e96660bb8ceb2dd172f412e4f6c614bbded915c71ce29d7d6eea3da7cd166caf4ce413a5f66002edf6b1d496bde3823c26117940b9bf5f4949d6ec4df19310a57bc43a6ca03b020a28f1bebdeb251d164edd02169a57247af1122ca37431883469aa901e50aee0b69745fa977c45a9477c1f45acba96be8bf42a68e4a48ac6ea275dc87d5647e2e4bb616ba6f4586aa3a8fb3deaa7b8f082cc90e104a1611654166541f14826d253082135ead870a659606b596b8adf85934b0b079d1e7a348209359f8d168b15d0ef918bb3dafe822f91a9131008bf9bc199f3a422af1388d5291f23219001a3f3d5c5e109fc8d4ad62a06c63db3ec3d1f1c59bd61ca52b8e4f8c4840570a2e9e26665b3d8541ce32b34a5b12d9c425857fa1bec75d78721537a4ef452ddc253b79c087a28c5bf338978dc89be8f76cd64a252ef0e7d46944b1d89efa1889ca5c81d67d660f50610fbe71ad304d29f313fdfd898071a4e0562cc3b3a65c72a4341a59bfd92fe192d481032e53482eff4d94565562c8f75638a1ba60594a8156699ae300377c18afbfb4f302ea6b3963704a0410b565f7c971d249255883432743e5001523f663eed6660591eaf966200fc61e1b87911d4c7522d50ec5ec51c15578cf50f497b113e1da18444d50dc7e723f0363c352ed6ca3406f959e0f064827e72f9c80f923804a3555826927e11609a0eb522669404843073b098ae0603a2041c38a2f4214289217cef2c63ae05beaa00c4b77f7620750c01f1003331775706336f448ad32d03974ea0ed155c22e2c0b50284ac48930d58be043c9628b8faf8661d782ea9437cf7dc50820019faa5d8c33e845ac65b064d007cdf0aef93ccf25126d3827b7c60497cbfaccd4530e981976044008879c184324b2281f396bea0b15df5aef0a80ab4a74398e3110515c98a8de0caba4a43eb33607c9a1bd0776134292c039741b8e986de6cb8a66aac1ae7bb9472fd97d61c6d8b84070b1ff7096d4fdc52e66d17ea857ec064a1b77821eaba5c7cf25dfe8dd9188c7a70f327a4386953898c50515c5e07b0c8d6e20e0c40e749b414ca0dc4d78f302122a0d60d41c0d7fca4c5f851b06e55b183f78e629b3fd93c1677a707fec77251ee896bc52d6e13432c95e54ac7eedab5a6d4f4bf009343e6a283a80128dc03b60d32c47e69ffbe15c3cf1539a46079ebd954b9b07ca34564f3051b25957b3fd9c146a43835ec85a59bdbece417978db00e2d86ecd767eb9db491a3f74740fa159f871790ca84094bfe32f747885cd831b693d2e63e75e963254a313fd01e86d5d29436397bf7d69a7825a8084a5d17d7fa6f130b642e0e61f86b346e15fcbdc868f4409d046959b16662eb78ad806784ba3bd0f467acc909bef00a7acd467eadebe651ced6543c8d98538731381fd0a23cf0ee97170830e471309294933439d001954d21c72ce443210703b0805e073ab3bba107a02a78b87e77fc3c2384222163c35a4c46582b2448b3c808c48c862f1a2b4ccec42968704a2a951d320da2c846537b0fa1b5d854da779109d7dff4dc555ae775322a750112438bc976a3628945153369e17c1264478f227c0020a773c6437c7999e6764911aa5d8527567ff4cbdf0143e23842f5ad3c06050cd6c4de29450a9f2e0c9d248992872fcc9ed18dff47fc32527d0b6fe889e000d54e71ce5cee2188dbf37fc98f2e3d34873d09982e4011564bac12adb29f0e5790b47d2812800808aeb89821365525dcbf8bab4ff7737a89f634a93bc80acda41e358e611a024f02399520cdcd11d4486c0908e134c2f3c7c18f93a5bda9d6c5e54118598f93131d9bf4631b0cc424b11f043741ed6204a8c51808115b9e4b4dee2d50a31608f1414c3fc4de83a5c7f1687cea2eba3b92782603bfa73a54bc78fdcc752537c60b0f5f1fbfb4e05140588636e9918dad3f48d75ce931a02f39d4fe0b39a7d0eaa3e224ef825cb7d94d25380e1fb87fc36c760f3f6e6b62e2d52d4d1682f8e6684f49df629902262fd646ba2a011e70d14f3ac26fd3767c10709ee101153500b44e422a69cf21b5381c6f4b15f724317092d9fd7af23e6e97258ee7220020fde3f01c465d26bd888663966848540372608437fcb966a8d309a7d75858d131e72f173b6b85f1a27c80a88328a1577b68d201f1a77bd0dc113b061d544978f06dfb4fe840c2d8981148d625c85dd069744b55b65908bc32a4211568bbb20af3525d106d0ac97a0ec3f7f27349087e89dc5ed7d33f3bbfb5711904b085b6cb3e3346e0c901a641874a6de568564285939a19e317c7b4aef66b744d7ab0163911b1e911d7bd2f5ccefd9fb12a298240ef6a837f32714e3709c6e08ca9216c981c9b1a582984dcf0059310c09c55cda92ef77a329a8e86fcf0f744767a6c4616726bab748c5a6fc32f1a05e45a1d84bcd20c2f0275849aa97ad4d3f0451d0ce73a04a45016f760d36643afb9eba6d021ecb6e53b912cbef11d1f590bac099b3e98e8fecf332bc009c7ce15185796d3d2f8acdcbff84a3b11cc89eec9296df8fed6a231a8f41651a673f14540c1190baf6382354de66ea56ab686d7361281573ff327442f7a085429844b800364a662ebf996a6a3b21769b9cfcbaf41806d7cadc138b57b44a2abdc60a731d9c54a6c8323fcf279c2fa13c5c8e8b97896cf3c54be90ed130ec753757511ae6917b772dafe94f521461d63cedba8242e1105f28a261632a30db863d7e29e7835f3b71168cc8405ae199b538d9e3a5d89d16fcb1a87dada4f29fbb52b717efa0930a636924b530aa4958d20941a66ef0564d55ac8f667807bee96e083e2d6bdeff0d73807fb2e08a6df6154fdc05ebf09dd2603a9a387f5d6f0d146676f5274409f10e064f8d88f54a6cfffe2e69b994d5d69757d57c921983d16a7d0806cbef21ebad0b1f139466ad8b0c0cb8a54e53c3080c616b026149cf39c3acc29e759d0fd6b54dd428ccd182614944a9b71adcdfbd3e8a95944f79b1337050feed6ce72dcd4fc6b36bac51a05083d62406d0d4e83041632a9e84d3d0ac4ff393059f7224bf0ad5a4cfcffba0ae9660ae3f350354522aa3394da4ce1383faa6723b8063c93262a593a590d76d00f38c149e69925b9ce9ab15c3b5e88f94a3980050ba82eea1d90ff8530787e72564125ad5d6c9a2347d4d1b1bf6fb712fb96bcf2c20116c762b69449118546829be48b8d980e1e04712d4c90136832f2fc03bb9ace910446bde292d37e0ba2e228b80ab527406c460004db2e108a23374d737147b1cbc22532b8cac84b1bfa9a55ad8cf29fb11e04b18f9834763279aacc000b88650c893678a5d1f4ffd844f7ae79e04a33a1db7b89e7a4cded60883703d4c430ba44c7990f59b5e0e1537afb6caadc2d649b18b19c4b236314192e3ab8c5c62f007341ce35a86d809756859fa14afa6184296f65a4c262b14b9bfef9795860986eee85d52d25ce6ad99cd48be425b91d3b6a18236b5a6b327532a26d2c2d8387a338169fb882cf145b7e8434bcb7d829f22f5e954caa9e86a1d7bf1240feced94f80e00eef078feb402f008ff05ccb20eb1a74bd61089d92b519064ff5c2176cf5be544a2bfa705ba62bafda1c7b1551cb4460bf0cc233e2570b2068cad2dbcf92b112521ee8eec2d9703da3b49fc33fab217ffbe97573271b867b7e6649fcfeab4d359ac0e8b3d37b2eb1bdf4fc38e5a8e7734bc6e282b34fd6d292528a9d92740468988f9a2be8e47a838d538a0cb08b914e8dacb50c9e996e91cd9e63aa1a8df0533a60289ac23c577340e6bb490676a1f1c23fc8ca6f918049f05425f7d0d240f1562f8e05ab891bff85ce6fe67b7f265e1903d2e44d3c9a030cf1b61d62ac6cb6ea29283319b65cd3d1ed99ee9b00fa0bcef7f83076494857a1aabb73d8c8dab2bc97452e2a10a1d158fec1bd1babf8a836dbc0924759b67a1168ddea7ad06b73e05390e8c92b79703e6def143f28365b62e3c1e0416281da2b8f3c9b3adcc2398b0a7a4a75d9617a8fa5a27a5e9123056b1adf2fee36342c98329970c01b0e9271b4012653d4355ee0552f0809c288fc352b8b71bb2b2adfb224fe3c3fee3f6c9c236781fa8f452c1a3da1aa50fd8072aec2af1fc479ead2505224c0e7cdb00cf9712e282d964a6202fb6732c77bc425620b1a36a5f60bdcab24b99a5a453c5882783a1fd8aeaab85865842dd03ee87b3b4b7713b105ea4618ac3563234e2c2d2a249f7bc63e75ab93663b324ebca3775ce4bd3c11e40754d45fa24be8fecf73240d0208a446324c7f5e86c2a00a735a9c8e21dacfa4acc9673f33bdab6cd97cae66492989a4cd1f0a2431e58098515a1068a1bb703539672337e9b7b25ec0747737630c6e2b259967efd4b77d44d2a92621a25865b3900657cab83bd399557bbe6711c0fb0acadeb930f7a42feefb9e21efded7a2329fb1a00fb0288e463824882efc21cbcf93f671aa687e990f23191ce25f9a4d0d5f7eee8292bcd4fc031a1b9cbb0774cd2b8a792bb8d81fb55485873b875183e5f91ebfe9f1de1d8da605fa615e3b372b6d5dda3e70451c252c39d4605fed1b0f3bcd993005a2c398c6d0efb2ffb421cc4424563dfb530c7aef1292627ee24226c6bdfd1ace879a94f379bce15e2bc50071bda35c0beed005b269478aa892aa8f605c5556668fa685f7212ba0523881d261005b245b6301cbb132a45b636bc5c8d50876738073908aef2e92dbe881853e0b9785630679571d900bce84b8fb6459efe8c6d6227a2f5be9b8a0e274e6a57b143f3e52a8a3a1b36916575a00c0a35e238e3ff4bedd51fc1a80c7fb01e11d04d4898ca07fa9d641695cbfc0b7bb94595b05fe9fec182ab259ed771f4027a3a892bef38142c92eff302e5b4a3ac9c1a95d339ccc253766ebb29b6595d32d1190e23cebc5338cf91b4f4dd9c92bcc677d392690519712713cac72f3df2161f4e22e4c153ec8dee26b4918bf30b507460a93cc3d6cad0c40eadf6808ba37e80d93e31904f568edde2130984a123d19d58b59f02915942a54364e8540560fa6d9aa95025d3adcad447d05a09b665f02d8c2e319ed1f66f8b2e2b11392574e8d83405cff9a54b74fd2da9ed6e0497a530078d8d7832c59e37c813f6f4da8da2cabe89ed55647de9f912af9cad9100f4f1321cb856191e57051196aa9b54c0061c834be101a4d700ec16528155c16388913860ded7c62500b6098be0589ae1ceae8de53123dae708cbd9c8a88e96472e009737a1ec6464fcc28fe1983d8abc58f5fdd9353065bdc79ff750beee71b2cd45fdd3251b223a95403726ce4635c5fd20764ebee9e2b7e725afa457513bddae2d8468a907ebe1cddf204c831422bcb07c36d046cc0512e1861adfe67af02477513763bc8bb4de4f2ae3e04a201c9af37c4b8bed3e8200297795510a0f166b4bf301b8020615120a8ea242ee1da6ab60bc6373cb32da51fb3ce051013a7e20c519cf821b7d1c36ca1a0f9854d52f799b0454b5da006bf3b83c0853995887f6443a7e545b4c29495ee0ba8bb50f403ca75b35f61bfc0948c9e033afba4edbeb576322d49035e4cb60d113b40370cc87a35328e1f26f8dc18cd70cfbbe0abf6a81f1b0ec1760e683c2bdfcfa11bd40c2eca814f4b4195819a985203b41fbc98377f1a11fe498e21485ef200af052d2d8b7c40c87c8784e0799bbbdeab5de79328f8803f8d942a24e83e190ea1a0912fc950220ec17daf0d5928d2e8e2de07f2e076f778b1ff6a955f2d1602aa5cc1dfd30c3b70d0a7f74d2826c6792a6e211535bf946a4f50c684ffa188600acf10f00886014d881610f3c6b3df2c8a5a265dd2c45a7ff7482790ad62542af58fb8b339b82fdc171b28269acb4108e886842f7121ae47cc9fc472f4536506478e182201dc3e246496513c05920a3cdf6a8c3b47d794420671e592b93cc258b73e9a5d6901607523af77118d2b7e2294e2d6ab989cc80754359177bff28ea4341483e3b57779c4b80f5a041ff07ce5fcd9bb9a2ae1b624f6aa544e11c5c55f7dd8aaf1321fd9aa92e7640038545b24f0240d7257de4f2f4b45a08cb26eac54fbe52e2a0267256c1be98f6e7a6eaa3eaa5794d21e19b3c6341bab8871dcbaa5ad1b32916f152f7d5baea0c0a9feb50745a268ddd70a3c1f73e4bd7ff1362d55147c2a3926f92a4815db9c9eb1610fd357702d3e74cfa28889a6f3f38caa7962f5670a3fecaf725d0048036cc1b83b6f84aaaf44d5e9cf6ca300d393b03c517c4c08aef9924e26e7d02e9386fcef14c4ae018c91982f1944a7e5127acb6681bf4401d975fc666314642efbb7793b047d45b3dace5cbae92cf46b1e97428653ec23c06f208f1a4ef13cf8aab69e3bbd257e4e27dba671f5e128a4b47c1e876d192209c353f721ce48a55374b98a697036105457ce1e8ff732d5d74b10d1e68235647a86ad785262ecbeac5342b20025229dc4e2735552f37da064f36a573e0913993afbb98938dd4c7473cf71b0384a630c3d4ec85d486b69525095815f4797375f97a045fdefb535c683e5ad08cfe3c47a0b75792b35b6ad427f71e0106e2229a3d83aa9f22ae155bd75f84151f5e24a0c2352dab48a3d577cf0bdeda6d7cb8712e48a1d3e25b677ea3742f15953e39ab5621f869ea1896f6536c472d79b2369e70f98ceff2065cec129d1b389417b2deb536bfb04dcd088d04189d9765182e11e4354930af9a80361d397c6cf92f6d7427f2bff27f8ba94accfaa5e84384e45954d02ddec3a6504ef07a1c45f4268660d2645b258d2734d885acde6e204a8412f7d7fe25a0c3ae57bcaa747e6c8aa9225a71fecde5da8cb98ae17192df28ae7a6db30ba2bb1fa92bc051a1995e8d1c3d98c474af51a6ef010fc9ec1956400d1b6908a5c5dcd5c408d9b3e20807497ca37247f17e1cfdcb7d8e44556b32a898eb0d2782bfbb90d68e41147ba2170536329f531930daaecd543012cc48752177aaec84110dad6809c969a0ab6968e323e658b64538ff43c5af121e4f66399092acf200a25d932ff59a43dcd2da420c5ee72d4f52ec56e1904afdd7a87efe2431635a7ebd7d81ec5cb836eff8d4b22634ebf11d1438f91bee07fb1c30031d8da24c10b1f6b66d48c638d48e67af9887f7e59985698c2c1bfe48ef0281115a153d84c6e21bcff24231662374f7202c00ac6bff57307432222bcde5d86c73597deb83cdfd73bf2f3961308d2f4eb625b46d16b88ab83264a2861f3291a4929636885286d79bf9f45395462169ff6bd53e898f54509b38cf24570c6dd89601a5028cbe528a85639bf8ff0a53995cdbf18bb8fb9d9c9abf96699cdb4e7b067f82b8e34fbb7f095c98ffca8afd10c29b1b217a6d91e8417c1f5fba6725bbe3895db33948763429a69526454262779520cf05ffd78a07fa8a8997174a8d7b2fc34d6b39c6cafed1a6032546b2f1de727b0385932851a133acbf694ec0fc4ec9565958f480b698c81431924924c8075e56a52d00327c80ec2e2193cabcc2810b7bbf0b46e5bf39b1ddf653195a5aefa3ee4081a218e582349bec13c5b46ad910a7d036f0d2c608d9ac8feab9b1ce781818404bfba61f81394d4367bc8bc61157d70ec7d878e63982905418ab0692e4c5f7b3ab76fd588231ed030e1003665fce7c9c2440c421d28381098730341048d10df3dabf079eaa304eace1e3fe012408a8f29a844371f2546350d8787b435ccd2d014aca1c78bc6cbad243829972abe2acdcea7b9a88b50a90f0c9204ca3a3f9b54305e15251d2f4e10ee00105140cae798342b731c20e6cc34bb3318e4204cdc37d1219c52bc53e32e6bf45c1d6ef7bbe8e72ef9c5aedf5f175380a7e0a7b76ee2daf2633ffb1fb5d61a2184904df6de7b932de50e8b09f50879093a76447829c34abad4df71a1b6bdfbee7c3ce553cb49a485c4d6ac23a5dd58e7d27295dfa695d2c26b52db287b55a0c24b4ba11dd5d3c70a1cc147820fcf43e0a5edcdf3f8a95d5611f2d05a92c2c753e9b1d4e381b492f4159e02b9b582f156cddd0ade4a83cd3945c05f9af5a7813e699f4b2d3ed3a8c33c092df3e47aa6b33aad33061fe11a186637994da6042b5ad57ec587a7dae4c7f311ae41a789aad475d94d66b2b48d89dcf86815c12f55871612d5e5f391119c3a0fe91647e95ca93918ef7602eebeb614c00ba73b8fa8575a3ec233e28e9eb1dae384946766867c0821bcbbce92df380d65b80bb84e8b340839c2853cf2e31ae03a2dd2904492a4ddaa77fd94ff68521ef41ed2a4bc89963d1569b187b4ec65d8652d8d8692acb29b0cfcd46828c9aa8ddb0c15a9cd4458c729d650e41ee03a2dd600c59d9556dae2df774cd354a7572c4a7e529cbeea58ad187dadf49556a230abd66318f68a5ea66f6573bc5bbfe396aa53f7fcd6b7ec2c036f33e8cc269c52b1d38b321057a71bcbb4c7caf4ad761bc1cccdac4cdfead22c3be9938267503b49bb89b2963ca8b53a6b8297e9da5bdb6dd2b6acab8defecc79cc8f7d24a3974dc7877658e77a5fc7437b66f46c7d5c48dd79f0faeb1a9e05171b7fee38a7dd837c5ddfa327d9fcdf16e05dee1906dd3759795e9cb402e7cce909c1ed7c791325c2347a8b8f559d7d5707349d769a1869a4bc475b6aa26b95f5a084228d3577e93e9cb3a7c63bfbec9f46415518a76abe227c8ca742389ff1c141fd2b2a712edc4ac4cdfea17fc68eea97832bb595606deca6e3355738d845a276d899f145c637ad73bd98dff7ae2a0be67a18c7d302f2d3ce941b6bdbcbc88ee494d569a0e8fa8eec6777b52f00c2992e12c2cc2dde9687821bd6071fb431851069a961868a8b91de35e2e5b4f0a9e01df96b48e67c4ce69125b13908267f061ded4076ea82dc136431863a4674ae5bb80e82b5031c59cbe7022909997dff42d93d12a2290c9ee00dc0cd856c6ab38d3fa2e0878ed0f190c048ce816f8800b8580b77e93b9eb2e743193e670e640518afde1e6707f78404c11ea6762a445448e4a55ee0cf9012f2f0a50c0010e308001c48861125304f8aa995c3145a0947efa1543692da0ee021953044ae9d4640ca515614a51b9d6cfdc3a2b40a51501b7e4e670b2a29fa1b9d2222287b3b9d4258199cbf67240f44dec6572e9756bfdd3b6573f5dde1a44ad94b224105d19d17d175e5a674d60fa344331c4c1b932af00557eb25d4d32c249dba619c82a98a6699ace9adc80fbc31f62f8128a6086c69a8991f605326603ee0f31fc1c55f0f1509d132287fb0333f363d4f813ac9ad42298a1b9cc7f98b9932581bc3cf19df5f6304d30e7348114dce95369c9b315cfa14e878756470d2d24c12666fa4c8c8c26b1bb5bd6701241f79ecbf4cce384702217c4cb229b9ac47d4575ce654ed932f574df6ff52ad05da7e6e9f5e445b7b0186eaebb035527a33a2250b00ffec13554d00f3815fa1938157a47b121bb56e85486acef3c2fa106d9a5e71f4e08be94b570e9c656b8945a0c844b7dcc39abae4d75cb38c508e1d48c641068157a4a9b5ec80f1f4da2d7c09079c005419dceb52e4ccfd1b44960bfee62fa7152f641698f26d14fed0c593cd38be890517aec331f41cb8e20fc657514015a0d5cc7ac8ecbea704f65ce79aa59f3d59a16a5d6034d7a344ec79a34dd12a71dd1cb534a27ba750ffa48e50fe7b4b07bdcd114fb08d5c9d8200edf11f56a1e47e34c6a524da2f4f5d9da55280d1910da40b67fcb6cd3d849e99be6d1679405f254e8619a690cfd43424fb18bf89029b9747b492e3d1cf2bc30d22dd4693dbd4e4d4e29f54c5804de5c3ae9bbb9f4959a4f85fe69d953a1879ae8a9d09b6893ce3a7f69f31f8fe65e367f63de8b59866c13510ca3306ad679012fe478417331152cb954dd668a1c7ba5300c135d27041704355f313bb56da6c8a5aa3bab88eb54a5aeb345c465ad4d245ae9167a4ba3a7d194de3d7af7281de2d2b7109c10f323ea1555a94af5e9b3e7f24e2f7a2ef0f47f2ef1f44e06b5258863d5dc210f4a2ec24316830484281a31b5a007d388424c13f2a185ea64e4dc290bb91eefd655ef66f77d7242c0fb4ec47bef04702e0e36e03e06dc17c47dcfe43e00dc67d94d64a4b216c6bdf36f9959f408e77c56e0684632f89c17979f2bc3e5e7905cbf1e5f9048111ed2e35ed60ed1c2903dcb86121d7041bc1787bcf7624e6deb89ba392e989979729fd84ddccccc3c396747fdda3dd78e63cd9d5cbb5caf2ebbb3a364a2995a109a967d4b4269c85ae7e160d527cc364e9c7a629ce959b4dbeca94367c85c8c8b111dc62b08974018df45f4e36b8c81a3edb586302699a6254d4c44da857d94c18b57d32d930a215674a4792e289f40d773c13e659f4ea6e863127dbe9160684ca0d893394db2ccc2e920ede3d1324ccbd8c7ebee49e9e3b6acb6a69ad8497ac7b6ce4e770f19dff10238d954dd69c954d9b7d397b6a72aa38c30d65c33b3331dc08b9664d32184104238279c304208219c7114a58c324231c421977a9d46a0915330890b823adc91a7e4cea55eaca9e91ecf051a792ad4df42ec64390423b46f48b432a091e7f26c0bb13513031d136d87ce90bd9f5f0cf509c873a999a7ac8881c5a50e874cf7e1034845f5782a14f55aeb057074700c768e611733a9ed15b9d4331f59e50ae31ecf856b322ac9dd5e1697fa16e3526f0875f7843c15eaa3e995ad4ebde7ac5665555cc08943aa1d911db2fe4549447ee4f832ed443b32329ae071340e9c5ef7112adfc9d82e0136c943f63ee7cbdee31ed5c99833cb442492dd92b8eeeebe1cf05b13d79500c68ddf5c892fa59452da1cf1d0be491619b2bbdd5996adb339e0379e9fe0f9f33a37d9e688b68a79685d57ce4d2a6a0c1940844e15709de8ba3bcb9672d46f73babb140bde75ccc4bc4f1a0ade567dfe5944c8cbbff7ce6326e6591ef1d2da1cf5f3b4d2dcad135a27de794c3c9dc77be76179ccc41db0a110133f644c34f15c98a0a1a1a18979114e27b92625e14cfa906dcee630ce750faa33f143b6b91dd73aba855d66bfbfc88405f8466bd287ccc5af34c93d3a19d3734316930bd1104e854f9dc91eb2cdd9189102c3f770ced7a811b1125ff39f4d7d1238566eb4a51c2578b78a79772716c8eb9889919f1a0a24b449b0c0051c439d92f23c6662a4e5414f599bc31d6aeeba24aa90a7d23a213fe57c2a6e9e873c0fcbc3b91dd30cec6906dcb35b9a5b022679c8a66f434c5f70823a0f4a5178eaee53c678ea4eccf39053ca3f1727ea79cc57ea939eb24e886278501e4578a74e9d1664a8b9eea4151ad75d67053920e16e435cf739499fece49e6bd2fbbddbb19c991a3a4146172f8b5b6badd5a2281af593e607e3ffcb06e09515c02d0c158089dd4401b01f0b00eb9e8ac766189db46bd7ae15acb0768b6aadd5568b1ebe52971b393639363936d5fa5551d70d9753b1b0bc1f2c34301ae5480d75cb54bd4a2dbb5375486aad20842548d1ee18a7b690d8fa130d2bfebaec46e34ea7d1f2cacaca8a5cc12c16cac2ac4c7737cbb402a5bc68c83f4b5978c67c979597646141b2524f69b362e9ee66e996eea9592696ee696261a1c162b195841f4e55732be6ee943912102b9f78c6f4e97d0a22247ab5a294ba8bd2aa02d1ead4c5c235e8998256f56a2e33d50d1942082194333a569e15a5ab57b8465f3e2a5e0d0bd790f45bf56a6efc3b535b5919aa31335fd75ba33159d0b2406dc3a151978f26a14f771faef07b7cb565e1191264a93de1834ea8ddd8e2d6361ad5b23c9c5b2baaaa2aeab22c2bcfd2eaa726312d7b1af5e0a4b3e724bd748ba7b2ac58c896524ae9a5692c5ca3521c1a0e8d998f43a301594633099128cb58b06fd395daadbee1d0ee75eb553b66a75544f5d2559d890987c6c2352a16295fcda558409c5285ac8644f594361dd36af66aa5babb4bcf61dd1485d123161234ce4718db96a8bfc768ab943951e6449913658d3ddd58cf3955c6c6be31927a49cd292fd337cef909e7fc46cd39678cf36c23f5b6a32cc6c738e3678c51d6cc2a227bb4a5f83e96d58f8da00fe89ad70a8e6a8abf2a05e37d9abb549c2ea5c5f864acaf4eb5eb53939f346a8a320b75cbe4b9982d8651ec5b758f700de9b196aae766ca96e267e5395f238561169bf198465f2fe1bcccaaf5ebba6c7579dd3a52bd562ad218638c54468871c80f92758a846e57d2d2ba3e4a2995e9a795b049e97ba04b3ab1293d10fb7cda0f175981507ea319258910c9a244dd234261212917a136acc88d9752f2b425b8527d2845dbce0a60f26c41d28eb0538f171149e9067aa4de4da9ea7c85c9b7950bb2156832993604a2eac330cdddf71e469908fc68d63d1a251bc61378720506af8c5eb172e14bb5ad5c4a29ccf215977abc62e5621486612b37567cc5153ca3c8159f06d9fc6024cea2cfce9a7557df9cf3692549cdf9de8cefdd94e731921bef1a47d5f3ea9ed11161dc79cc3d5807c6c94868b41b23b91047157b8a71be15aaa3cc8bc798df8fe71e71ce0dd25b9667de5aa93a1ef4899e950944d98f87d2fe71eb93ef69dddcc33ad43ad3e8439ac9611e47abedf989ca62769b17cbdb52dffae4272c8eeace3ead4c7b3a97d0273ff1e8e1ff04d79887559502c5a58fd6ca86a3baf3950a14179e9fe02778063cbd9b2c222823b9b1bbbb9b9f704ea5415ed47e40b8755ce6f279153f6ba55af5eaacc167d7ab95ce39674b47cd4967654a62d562947e7b8fdf7bd396e8e51f333b66c7dc4a4ab33bc64e7237c8dd3af190b6e74d6f9a3d379eb302d2f617fde8a7cdae6e9e33b38aa87f9885446631bb351fe33a59cc6e1311f101b9954af9de7befc9091ff7ab43ed7d4e69f110be5bfabaaff4ade273d17359992bcf4e2cbb2d5755256de97d1e5a7093794d6de93d9ecf5c8138cdd9afaab375c49c56e6e153aa533844d36d954de66d0dc5859fd4a51193dda69b792a1211752e8557c62be77465b453934ec2c046ea145267855aa5966559f3b22c4ad9baae43eb0cfa654153c8e51a78e3704056dddabebbbbbb9b7ebea76a62a25b9e8c333afa6eeaf3247237cf77dc86efd04dd38ae6e79942e014d28e7294f51ebfc7eff17bfc1ebfc7efb1c5a798628a233333b3075a5df3de0512cd996522d14f72d3c6d6ac7704d7e8b365091172e555ea7ba07cd7bc3f51762be75c1ecdf6b242bac86e22510d8c5ff6358f40d5428206008f26867d34a314bb89ee0d18769ba2074fec76131bb2b05f1ef72fcac8ad1446dadd3d3d0cfb2c0ff3207f7336cfe5a4b81c0bb3a869514a29a59452b6045fa78d4c4c9c764d9b9999395e1a2b3373f3cacacb8b356796894494d23b1a798675782db9754d4ecd9b2e5a727be7e565658544fa45229b1a7ac578ad57913a7422086fe6cc3291e82791acc9a2afec4be419f1f24eca29e4f24b615b040f4f1a89f3c96c2871a35b26750fd5e6a9d4e2c3acf79e2c83f51e175c43deb2ae495e58cfca64175ce3559627f3489c0b99f93db6cf96ac1765195e5bf2467221bd90d68bf4d1923837de4d69a5945276216f2417f23d89433fa7e71df3c82e7806851e2a2f4b4a0fac26cdad966559f559d985e42274bdd2ea5bfbc81b97853b6597142e0b7c4ce329a595d6bb801b0e87830387c3d970f0bb56b4acec42be3e8ae14ed3651738ac57d5d25092c9bccbd6e329ae5bdc8d8a419b2e08cb6e382afb8feca25ad985bca1288973a9eca24172e8864b2abcb9151b028563a577ef9d53cf7f5a7d6b111412bd6b464723e9c3bc2e59eec15ffd0b5eb7b80696754f697d5ef0e6c250bbb08ff7deb39856dfeb7e481a7a51c2bee3c2aef53d245ce39d21172d6d0936f6076fe235e1cd8defeeee8df6d5dfe8db625c7e2a2d9e73378cf3b9b1270fbf7ddc9cd9f4ae5b7fdf3e13b0e0af3f6d93168376649d1fbf02f35c9800d96d9e844cde7b87dc5262c72c24aafbdefc09d9130bb26d652008e5256937b62c24aa176f621f5bd0c776651141e1925b2fcbd2dcbdaecbc2de2bccf368d4533494c3d044cf34ebafdee83757bac5b554a77ee34dd2c248278293c4aacbebba2e6c9bbfbe4d7b7d5155d7b7fa78c77cbd32b3a8522b032fd49933cbaeeb882a0f7f695beb5c6923136f92dbf578fa94cbcac06bbdfad63a5993ae8b50b46915515fb2ecc6d242a2bab555ae4fd1c774fd621f978cef2fb846a56c7fc133e2a9bb14de5c9652cafe62023500d45063bdfb55dd4d0821105d920de19ca0fcfc24c3b76d094aadebb3db34a3e3c94f0f08a6df711ff5b7756f93a16ca94f29d8ef51946b50b24fa98d3c039ee7a7f7fedee127aef13e515611d79fa557e419f3c15fd78476bb7cafb1e3a59abbad3ded96364f69f5308fe12b16ea96e90ece73ad9555bdb37cbc0c12d2469e5155761423d7909ff8f23719bed4e9ab0c4f94ddf84579fa39e37defef4d37421b79c6342bb676706e75e51b0890cb80ebb4c8c9b93936b7eadc8a91ba05bbdb2a4dc675cfe5130f92daa354422a0ff3a44cb756aadf21733c87b4b2a5ea155ea67abdce5bdf7a2bd6b9f0cc966fe5d2062d8d3301a4096ed7a195ff3c5db9efce3585bdedb6322d66335b6a8b9d5af6b273a26c891e7bc4a2b3327dafd3697339aeaad44ed465c1486f455885444d621d76d25c0ecc8370e6e2ea08960d25982eb163b343a90d256c2c6103f3a866d95882f9d948b6a1848d259ecddbb96c6309e78212ddce8d9bcb8930220d455bc2c689c634547d137a31e13c2efa862fb4f1369488dbb38194cd8d87d82314dd0b8675228b6233fb44300eba732e29f7c08f34f75234e754606822cd3914cd0a7dece6965c07e5e3355919081d7fbad1561978a91c78e797e01ad596a8c74b59c953b6c46c97e01953daedd95cf825780684f444e3188e71391386a6a16827f555279a8b715611f2c6a47ab495c4c99cf37f11908f274368517b79efbd373fedb3598287801ab486eaaa63c69899e185e4b2484c2df2138ca45b26f64bc3ecf604126624d331f313dd62c53be62835772d4dfebd62f05570c9a4e4ed7412bed142cb489a04374612cf4822c0976f51f17d6e59b6da9c4b76cbdae2c7ca2c1a4a32ca6e38aa63f4932ca2343f59eaeebab3d8af63f05ab6749d9a0065f9090b09689f885cd578a8c51810c2d09d8f318220744bf1f4f58134cfabb35be8734b93af22c300e89e3f90e6aa568920ed5611743275a94d6d0bddea52543c11dc7f8c849f58b13abbc29c3a538b43f8c89c9375260fe123131fe1217c44c431d6737933097c8475f888cc3c5acde465f62eb3bfc73a7c8412429f01c9fd755a980188b49b8e2b0fb5f8c8333339de9544c8770e6691982c22a2140fe63d8b88eb9876317f72374277e11f64cd4d47d4fbaa3c41111101e1291bd23806f4f164d6eb890fb2d23cbcef482e8cebb458c3cdad5db17504bc59b74c0babd0ab96c6a734ca5611f49174a389365b251e4513b54afc8926d2d88a003d4c8bb4ec28dae7279ae7261ae8ceb2d131a1c3f46348737385c6cb1059bf5d43cdc23c07e3676e9cecadae2d783ee29bc23361159655c73ec7b0eb309d61d9371010184d4e5044175f8472628279387461d7f99e0c7b523c299e1493a7e5116c460708f41110100602496c4405c8032b9383b42dbb333a3010f611100c34b2c204948140d64d4037b138039d848e594f9126d831cc9a3c115e9e5899be26761bc10cc86eecf9c763b70cb33e0a320a320a320a22bb90145a369bd1615d24fa645d348964f33bae1545a2ec5366d15b728a2815616589b42dbb333a325196890ef344d63d5ae9ba1361229147748fe5c13cbf2eca3c22eb338540d84766a27fa6d004fa605384817272d2cacb8591797e896c36a14c2793c9149a40d3679a98dd5ea8cb5f5ae419565529bbc5d339e374c2940b90f0e1f20caed3420d3ad4e62a7b7daa7f3e9f4ff5cfa7faa7b4e3560e7e3e55755dd54c223f339b62ad5ebdcfe792f968db435ac9fa609f4ff5d0e7a1ea0a1da631cbfac7e43af60df4ab7a8acc747d3e17945f36f4ead7517e7255199cbe5d329a5899be21bb8d6086b37b32bb615745f908cfa86c35817aa9dde0a71df5e564a54d77b7a7adf3118fa7c23cd83dec394c57fca9be65af144eef1a7af560a7af0f81348b89d48f87eb2dcb6e15d3f3113ec247f888a7631fde7bef82d2c4e4105af09649e419cfc48462138a4d2836a1d8e430cf84faa595aa4965627299fca2aeea323953186326c7ce33a35ec913c72106f1873d9c31c6159f5cafb71bf35d87401fbe2c1b6334615a85b6b9fdde7befa395765cceb24358c157d91c0539f53ecfaa2aabaaec302fa3fec9ac2ca3fec9fea1b8faf0abe715f594f8f9565596c2aa8fdd463093d9cdb215351f84675074daedd94cc2a036ec6eabab99032dcbb2ce3956b52cceb12ccbb2a6c9aaa6eb569d769379599c1b13c9344cb3a65b293ae3115166b504c37b5d4d3a51e9289da6191dce4d229452eaa615ce393ae77fcad2fe7f68c54e3c16c824bb2cfaf19c602093cca2a28732d18927f33cfbc75e009fd089282546004e3240010820630056d3ec05100000c418a5c010a19c9884401f4f865d96a2368ab2b72506ebbdf8de93efddb27bce49ca7e9772644589f608c89b2494721bbda845f958db6e4cad572debfddad7dbc29e61575b95a5941565184b25d5c9d8e4902b1fe37c71aa26a7e88c804c37cd382335aa99736e9bb555dddab4d3dd2625575e29491a4717e9faf74edb6e2949a6c72f489051107931c403849275a0942d25948f75ec1631ebd5f58fe6c91c13b12a2b33ddf8884c131fe1237c848fbc19aca118aa93e15c7c6e92da96f5ad264739237411c6cb4ff67db20bba6137ecd449e6a4ddac539b8fed198a1180ca6e2f77fb6d945025cf360fe65c7913bbb1911bb21b34c23817e7cad0419f76e301dcde39171937b9732e0438ca9d7329c061dc3917037c74e75c4807c09d7351b900b4ab68cea99034e7540ca039a752008d009a0c6d009a732a34d66af6767b11800d80dd56006063d88d34b229763b8c13bb65d26e32f186401fdbf3a2a124c36ca52c2b13af7ca5a56a29ea4dd196f897d9271b79c6cbd1baea4839c2a9463574e74eafee46b4cd0df5a699eaa9d4e254e465afaa5274aa8f8054232b4a9647a6e88c80700d792aee163aac3c9e438b3d20bb356466666666b615f4bc5b551c5951bd149d1190917cd53b8f82c05797e90ac05752db463537ba2ce6cc3291e834f2a50504692a7a0fad5292409af7f2b2b24222fd2251c35190471fa722293a232055b5c518d55c8ad1ed2585741439650c1b2ab194524a91ddfef8c44a28e508e7d6f7deabec28c808c8950c318ddea35d5bd36c538a4e671195d018d12d0e833459641195641acf4b69a594a320ef103eca51104ea9ee24f940e33215792ad3776e74725e8cace0dce91b691a05c1d145ba089592e4522c95f0744c8329f25c5e5e565648a4ffbd225de4cac72925c98d1f05e11ad528488a0e458d6a2e9552ca51109e11290c16c01ce86f301a2826d7096b17a5924a2aa9a4dba36207a554bee9bb3e293e94e2c6243f7b554aacda9275aa4abb4d333ae4e994a7534e17a573cae953b7eb74bea24c594a299595a5205ba51d51af9f522291234fa594a1cffaeba297b624dfb4d69005514aa90455b55237b75a1425a594525217a6657f9ae89386726872aacd7fb4ea308fe935a5e0cb96e4add75f405c29b8c6f478b2e702efb1f3b624e9abb4e4ab86843feb67c5d54528da89963d15eb269a7b139b8f508a7aebd53ba7fa641151d15bab9452fe52534e33577f70d059d41fb7625d31106fad9ab5a664a1d40a83a2a09cd45b2214eba2fa030546b5aab3a5faaea1ae3e205cfbe4dbfbf17edc780ba556ebd937bde94daf288e5267c16a5d1e26fbfcb81b8c1f0c639232ba07868d012346c5f5c634b2392976cb60882c4bd3b585ee81a45d920042870ff7e528e124348ce4e86c6ec7ed0c41e3c25c8065a016641e22783e63f880a8f02613a010e80f211316989c7caa38f9c4a3bc8080bc6051018145cb20d231ace8101513a572cf855ff88557483b4c8456906d2f1df8cb4530be906d6e679b2d5b63314563d144da8aa6e2c19051c6944f18b2cded4c266c5e919d9d9d1d6793813354d72d20e09a5b724dca0c10226d0c847b308d119c1b9b259d835f6c08c1a02c6c707ffa30a9f74932a4c87381e767c43c827a99b21092f38a02dc8c68ffe04351649b33f2e8f38820c988b647b819efcfbe7c608d2fa09b1797ac5578850ad214fce31a3152396803ca03a47f16869bf1a89d3da2c27d771f9d6c7337324dd818c1373733f4630a79136fe0cd0d0d7838a10d372419cc822ce00c8921babce3bdd7ec5ebcb6995b430b49b08999e11ddcac04fe64c1c60b1b0e831736d188112336e69c73259b73ce25d9e68c349c18e6b9c8bf1bf15ce2d4a47849e106373827cab83b50b58103b5d908597643348d72908958d0e366a11930b89febb4888318ee969dfd40732bd6f39660222db9a19384910a2fe0bcd8438f1d3b9c010b254062e00fee0a10ee26a2e26ea41fdcedc5077773373db89b335273210fe690e40863f0811a7e78010c7007406c01270a353c74e2202466c60a19c4600d72c8c210a2c08798feca737140164cb8828a9c1a306108317d98e7e2b2480213867421061af0200e31fd249e4b0370e690072c6001061e57c4f46f3c9713242982199450410728d82066016668c10ac0608517841c89699a1ab0a1f298020b7d40430de620071b0401ea8006150f78140951c105e6023f5c4970411772a0c8208410562c8021b0e10311f480033a08d98153bc81055317d04007287ee7c590374494ebb61892852147ac232c794ec417fc0b23a0ebb470c313575eb7c50ad0206326c0096e3e8639b8a49e89a20f3588c3139840042531dd5ce4478c3ba02e60430b824c3d842e4c95138e0061f0890f52204245c1092c48a18ae9c4c4872d64b006eaf270dfdb62055fd09b2d64a0c5c5aedb420660b8db23139c1093c7f3aafb1e1a7e6be59efddea3a6a99d13629a64047ed93a17c47b6bbf273778af708a3312018f609a3bc5799eb2ceca591096005238e9a4df22c7c8fc4967e4182b8cd2cd2b34855ae184fc4acfb175ee21a122a5749a788a16ceaef4add14fd3ca95f255ad1ee35df50d58d6bd95a90bd051d43c45e79dfb085ce8357c6fea8f60e6be379d9a93faa43ea94f869714457d4ed4e690f023988980a31cab505db760539fa51342462744844e08f89c10af9d101d3fd996e2dfe361bad497af5193324608a7e93d7e87dd7756e92398b96da72907b67b4208fbd49b7a85da564d337bf6ebdbbbccfede2fbd57e122c699e57869638c18dba955e62d6db38aa8eeb42e68bdad0850b768ada89de27c73be4f32c6279af46467154c4f359e29cd2eb5f2360601949055eeef2eda8f217bef34de9ce83451ca73b6caf44b736fabcf2c3b3569a23e69f212c6e8966a3759750b94d24ef2512b8114627ea377b3275875eca2ce3cb4e009363195b7d0831076626a7b010b3cecc4d477e30220f888a953d59a13030e919c980a6f728cc4d4a8e343484c95556bfc041688a013536790214284c4545ab5c641a6f0e326a65278d0c3196a626abd830c68626af5052700e126a65a794092b3862038e811533124b44127a6665a0cb1424e4cf564810b3631f553b5e6bcb8998226a6829c165f6c01276687b3f9820b45980d40d440c36f48034d4d4c3da95ae32d7440849d988a52b5e69a015b75793603f85554b5e6eca0879d9a980a0346ca1e84a0849a981dcc6f8b2f906c2949dc9ce634cda9e15ffca4c1c7865372dbd81c86c1e54c935d420c48e6bc1b433127cb4f0069244f0a32f01132b4ce9c93aad7ab463dad3e0b4cd32f7b91ea75bd08774bd7e3294b630ed9e888ebf157a5286de6520d87e8f69f83da4ce5ce030d29e504a6cf1731cddca76def0ddfe3cc7d7de13403998d70b4e69c73e64a6d939fe4ccb52c3ca30ff366203318a4e4ee9b514d93e4a8a649324e31c2a74c2949ea08488ace2808cf98a0803e608f2689609a373759f328c84dd60f2699baba4b5578aa82b7e0f3d139345e562aad52578081c015229c627c36a1132f25949406a9c944f808e49c0b2f2584d7263dd122eb4ffc28a1d40236dc82d4c403d224f98034493eca4ea2fae9956c244f8aa86dccfda2ad502756b0818140b7307c40ac90f5b739ab2cc2806ff0049b98429a24af9c429ac472c736032b1c3bdd542ada6d42f17c5e2bebceb998fcc2ee5c16f26837dee46c5e5e565648a45f14e5e434e6076f6c9a34591a4a3297a3c3c2c833a669c7754d3ad922eb6f2ee746073c70f5c443ce0322815427c34db74e2554f284099d9311c94af5b07aa5dea2d349ba05b6924afe5d1a914664196495a253ed280864db5e344e1b699cf6c2088744312e83d4469450a7510d16190e918c6f1612c5b80cd228c8888a0b3b67cb7a07270bdd8b6e89d148b2ce190599e01458c029eefb2848fdd64fe1ad73ee1b05494972273bc99caa868a846d86847aca66b148b68944a225504de8609ac82df154f6f7eecea8e9188b2615b1e1226cd32d946d4e90c09f70daf8848cde15814bc838068cd38a1bb94811510c1263d1840e915bc233a285d0081769e281de3645951136f2399f8b3cebe122f7c5ccf29b78d9465a42e592385d5a6861861e1701b7623b3144acd396641bcab22454d5215b4a9b4dc88cb879cf72f78aac240fef46ba150908ea43740b5579c0e9e0a828bee421314417c5385320090dd850e2c69350272718418124346043891b57647c8da040121ab0a1c40dd2151941011b3148403c7743e2233ce4c8345d73e2234ca4d6a16e40dc6a52cc7242f0090f323e5b19275d46b790ba25f2890fea542dc39f40218b775d9dd4647cdf7b7ffc77f73ec4fbdf65bc9055ada4ec66f654445374d2da39391bda11093f587eb0fc60f9c192fd6081d60f4a29b590702b8ee507d532c7f2c3ad38961f593896898bba0d7199c66516c9c233e02bbe86442864a2e2d5f4147ca75d99f6fdb83c979fd8677dcfe9a39068cec3d0685c886252cd53ebf3232d0586283bc9e2c287404d1dfc74ab2dd17a59c712cf52ab65b12cb52508a939f9d637ba0846ca484bd1606432226522f8dca3bb65dcd8dda218f7bdf7bae70f961f2c3f587eb0fc6031695018429f8f941f2ba5b41b12d30eac91b2a1e828a69dd0a5168a62da9976604d4781c1f816822de4ce77145d73e79d9bd36e32b0c77bc6ce06c87e3c8f6e240cb66082348f0fbd6452d2504c3b4d82dbb46355d5b403806f5900be4d013cda8dfa27c6e33633d03d02b0ae55b2bf56e918768e2c8c771a31bb85328c3ee512dd3997d14f465a8ae61c0ccd39156a1d907b75cdbd6e62b7ac85dc4b64e35d6d431fd1bdac876828c940f29ecb5eff7c3cf71105d7b82edb51cc40bb73a3e019f1991619098470aebcf08c2078b9a568b32a605437a25ba205e214689715d22f12c5ea155622238ad0b8c7c76e248f15b1c52eadded2a8b3cdebaaaad8f5155fe306c4b672e38b6dd3366dd336f3d166a20e35e93d74abb6b91baa19b96feedc28764e1a060ce0a4653370c22e5dce74cc22e1727c480d2ae16e748b3ccc8e69999439ef6e9a7ea35ba08f2b35c7d3b4d24b4cb6d25f58ad3393929d243ad38d0eae11a8a42d98643dc9d4880000800001011315000030100c07c482e18838d2242da40f1480108ca24c6e5219e86192e49032c6184200c00000008000a0499800d2c3730312345a41b15206bdacb84e2b1f029f9d8e502d16e8f9e56813233a05d7e6f9c8d82ba6c3e017cb304a39141e336b391e3ddd9753d16ac99b135d53d35460e5c9d4d87b49be59f3cf10ed73be8c02e28ca0009158e6ca59f306c35e552500df3a93e1c977f46aa097b1a5348ae8a5e15e4a59949d7195efba0dd2cb502fe35239603ae269b8975ed2594ab2ef2d008884cd6708c21b7349537e83bd1c95ea4ef8508c587121c40d06bda614777b35ece57c29eb573b2c5e39897c65f0be5698e40cf11f4ba729757a4f707b57fe60cc5f42ac8155b70a1bcd4f752e784364612e9dbd2ee8d85b85346723e0c502221ecd1a6545dcc4740916040c75e432cc1fa2a228b470daca363049e2b5eda6fe879a78d3d6a3fbc1f772b2e3fb96440008a3a1e05798919dfc836ec0dbf9099c5f7304ccd142332e09710fbe421ee299b6b2a787e60fe0b62745cd66ded1553cf41f83ead56b0085dc86fccbe95a63f976d03e45f5507290051ea7a0d17d6f510b7137c179850bcf9744392e16f609f4f113e7141b2825be0f6e829c0e67d2815a1fb71f4c3ee57ef1363fec21af9ee9d7a7b6d93a30e144dd6a10435c921a13e479a70816f50b96d948fbfdd0cad29629c63fbb808a064ddbdf5f285252857c0103cf4bee02e3e05b67950c87a2b964cfebb9679fe16ae67807ac185d35eb265023b73ee520530cd95a3631b4bd85714d8561ca9b12607418649635443037306056badf3fc80a1d5e3c3c0078ba0e3d15fd830d039a2fcbbf9e7d065dc1c5f025fbb4045110b3b2e64faf077a995daa30a2f52860410493caf1dcf1a4b24c0f2fd148402567e9d823f9f392cb5db961b7ba388d1db9ca20289d2acb5e88b4ca0a881d2991ae4af7049156f359edf613591c5a28c7bec4d3b288a4d61a952cf63fda3c8104abe4893c2ceb4fc686df7cb84eca5422aee0c8fa1c05d50f2fceab26e40f8b6377951a2cb9e685760ffde5b4acf2fe30e3b506f89273b1dfdb8b2cfc03ce8bca3411943aba21d2045e22d41b7e5aa0722241431ca49a19f0a838fe78f4e4f0bf36fcacb4c416a46d7dfde6f65da9eeda75dceb65207ac21f8f8bfa61fe3b77e0a7493eb84190b88db1c52d340a04e0e25ac283a97f2c1b7da38d628323c35b96800c3baebe1380615ee94a0fc25f33e4b11332a53a01cb821c571da192c18775f599c7ac55dc161352378efe0869e2e10cffa43352cd755a583d4dd4188519a1f0495b647eed4bc186d94c371dfa188a1eb1a270d48c9c74efb4d43c21abfd81c3e981af146730ad2f8cb3bed16782e0f6608bc291bf6e8a58f35953fff4a149032b1aabd3688b405e0e5c3fa4bf3eb96b82f11fdef11189bc4e1331c4feef2b1ef1f467307b6fe095ae9b2755e5699579148032accc1eace3054df08fb56ec6b645ca7969382e45667f8d4372954896f0597ea72e32fe50145e8e18510798543664576976520555ccf44354df9154622a337427fa80c5e87a45350a18341ab2c459d9ddc171639e7d8f68c5d270a4a383210ea2eba3920708022f04a45507e3ce61341110aa9f30bb3707b0574b77bd27ac4c45ebd2c8b61a3a38b619e9b341faf3aaf399c3a9f212d899f9b7e2f534d9add4469b2d4397f9fcc2df99f8d799f5fac7bf69492a66143b80fb9616bd314cba11f48afed0edba3232e68e8d2654e0df4516a7563708b9ebbd10d82c95c8c6fb9498461f3d2788b6c8ad74f0991dece840e90c8ca46a2b7ff8d68d1d677ba7b2a66d72254b86cb1a32085e0569978c770c00683ea85c39c16c55ee0a3515d9205d1235f2e3ba75020a4da072d90618259b4d7a1e890e422efb3347f49c5e8e8239361b2477cd28fdb5f587d166b5266edd8212a32799f223b098268f14b9b7200cb1a85daa48ac8a3a71b9a75bcdd01f440feb3e3782f5ce66033418ff16bac6d312e97451f4747c996334c916b367156090431c4b8c2b2fb195f87f1e6cdc62e9c61122cecea36d525a24918ca0b7343756ba003ed99fafb9fe3cbefef7e92577c8e7a8c85d4733942deaee85588154a31fab1ab585f3c21115af0370eccc6c6fc6e146ebfb2b1f9a5e4737741cf39488af3744a43f4195bd5f81751919f4f66e505253d3e04db13c7ff0d63c163f94ba0517bbb3e38763a508fb4cadb14016e28a617072b3ae29b6a9bccb0f60f24370d93b3a0b6ee37ccbc89e3cafe9d451b4c7e7605930f74fbadc11f612e7d37f5a0db49dce6412738859d31f05f8209661263e7e54025df2030ecee406a058066334f82125c5802d9205d7354af750c9c109bfa4dc64e19751268b37bf527bc1906bfe9bc3d06bf3d8b14bf785554b3e46d68062de684c403f4adb71fe0bd69a27507af91a600a1ec38dccfae80295a8f3bfe4f707e300e7885c37ece307b775ce7f38d6a42e998411f4422ab2b2bd8c39ea86368432b41ef1e6c3b0aa2a6442b76a8afea7ff39ec1c3cb3f81e24c3ee05b46c55850828a1a8e269139d5fcf2d0ee87eadb8cbcaa3e9c67218c33bd048a66c2a3cb318ad97befab4cc05f10ee07f709c54c9f8782aafe31c65ebc5e590c4437cedec9a31d59afcec40f02ccd9f9e29125d747ed2cb669d3d5ba2414e19583b4854aaed797e51e6a543ab7fc63cb80897c30c4961ff42ca5df99d769fb69106937cf32018654bb3d24a3a8e2671fa130fa8d3ea44ee706f2f85d1319f93a5f075510c5d11793b9c88596802c48532cccc51abc5db62f942d97a18f20428fb7dd7fc9b44f85f3e026beae560246c11571579f0cb7da5dece975c8bd20fba98bd6cea45ab3e31a6abf5fd59a4f3fbae4108c0720d99b3e6b399e42d3ac95e2e52eff661b8905a17c150ba6e1f359edc0b2b2ef6e98ce0b7808329e33797f4562ba2cb85f3424afa7a1be43903d96a54700df5880870ccd76b970c9b06ae137ad74e4156fd40b53aae42cf87e9b7b1365d510b5a0b735d151e08ec28ab9c30378235f119eb2437b09e932d4e016ab76908d933da0aec442c204e436a8d48ff3521fa9a2bf3021ca717e0b019ec7fad46b3207bffa64cee6d83064633ebd431ab94adf8b14717dc2086faaf831bb0e6f25c05c811e53d1087f85c97bf250422572a9efe9fae2a2af9b709db20eec9f498f344422a77bb7f2fd0595e966f64609892e1880d675f0a0ba59006d55eb64600bdae4e503ae2a45ca9a196806256def0213130050c4d15e5a8823b9b5bc4509cef0f39c2e74cdfb5a953038f3bff437e456f8119ac619d45af52abfd48fbfc27497c1c2d73feb9c7edba0173ab8e2b47cd9665cda557b0dfacebbc4ea7032f2bf57f69694c91d64d787dfd0991956ee2be1a645e5f0b4b30148b3b01bc406b8551784a18c2efb3dc86af943fa3b40f78e046a6cecf5e0355a4ebfb90fa7b14244316d28f43c3b3ba143123281a61f822a484f79769dcbd1bd6c76e1ac8f4b5d8e2d439528d707f395c1ecc1a7715a6b431a0f6fd89b8aa0285801ac875a99989f3e2e7630c6914e8b082b4233a3636039949dc5c6cb574d3c5847f4590c821897d207a116f7e4f5c14846aa8ff8f186e47bd9a49c3d44c43515eb3f34ddbfa99bf462ed95f17a3496673bd525367fa8b70bf479ebe4b8847c4af3c799001a4304c0eb826607120e46d61bc52f1275161e2cc84fe91f48bb50ee3dee807373d20fa3a6c5a5a4b755fcf8f031d34c5af19905c962426b0f99072ac3fcaffd9b390335e242adac4fe9f60981daa5f3921fb0c8761169d05782e3343b4ab290f4289ea918a6f512f9b020e804f3a64b13b4c64db384924f591d52b773d28ac046a4b81df9d24d3ca3a23cb7499db77b4e339174cbfc628b6b46ece7eda2b026adaae926031f03d30dd64b475fa820c29cebf8f4c75bb0d94a73b0c96f8c40d15247f7491a7be9162c0aade681b0f2675951e43f1e496cca6e8ce236e1eeb535a58fc1075a399e692e36eea60eed8880765871c2b78697a233f7aa17a975df36dcb7c5bab1e905893c32a41dad72b8f09152d65e20bab56584448164c2478015161904c0191d7cced300c98b438b6f5c857c2207e066a3f5fc04fa07aff49c18e77e59248211845faaccea9263f58edfefaa4b511f98d2ac3e502315d39d0d6d67f72ccbca371c88e5f429ca63ec39548e20325d98951df6eae992fa9adc8037347c20c2aecf5dfd0f06a1f653a3fa82e318e7760eef521a67816050212cc15852623b4964d531e1318c4d4411d2468aedea76da63ed7f4a1f7dcd03028917654f9edc46e39a778ebae52991488043cfff9b716e5ae7b0a0218a41fc1d4329bc5f32af06dd2ce15ec3f1c3e6f541139986693891042874d6ad25bf9525e41d2273b1006e84514238141b1074775a74b98abdc71490c0c96f0ce7e8a938a355502dc7c29f206ee7461b7c847a87e4b5b77d77d88d1e0828f312522104725f0f311b662f0c176668966fd7c82d3ac63cb53f82902e16d3a3195e8fe41337e651e58b285ba66ad358dc4ed77a68e2ce34a06b09875abb4be97c3ef01b0e5536b8648f90d6d0081614c4328a988772313eb8ff5612170f15480b0fd826f0723aa141902173dde1128721aa7cf33453a5cfbc6ed941cd8f0b5c5d7410d76ee17a8d5112bd03bef2bb716f59bf27374d171192df29fdc65ae70874c5df4adeb7fa87f625f569c996b84e04faee6c017b8e0d927b7bf127c728aa2a6060755cb5d0e930e4350dc0fc21408da19b7130075f2a5419b86dcebdd1b1382d89b4a943bd46f0640e8d17ab7d0168b277a3d3aaa453fc3aa47c7e31a92de240718a50670e3fb01824386c019a4a04684f448b01de0901da054a557027f3851d17924a53b73edc52ad55493505e017320f83e6e57eb514b2a72cdf470d0e8ee173875194acd0ed91d65770e2172c6312a4cd7d15b20a3eab600bd928077d55aaf086caca49a0dd68a6d5b2d564aa0c38dbdb28815c3402e313f96ac8f40316b28e9d428aad7c7e44807800269b2435f3da5ec446610ae5eb39051838018fb9a7e8ec0a74bb6381171fd99de482c8e8bb5e3edb65d8f157c01e2f2965cd70c164611664a6d01d43afd9b4a1b5469c90645ea739e132281ceb3308508b039ed6e2db4f9e7e97bbd36599010c313f36c18a1bd3518489fe8ae1e28b16e980a8f786260ea37dc95c889fb59f58230482a16d738cd50b009efe79ab0b5fc2212502000e8bad67b3fcdd3926a04ada27444ae69dbc4debeff9758405f25504dc685f2a69b28b6e0050b62e6667c0c114a18acd5e0d830f3493f35ea05fccb27b7cd8332be79d87868df6fe6d6ac5f255f3a69107ccb28143ec2f2213025fb087a74412df4024e4c2fe0901f01148d6d84d96a9d4b03fd8654db33bdb15d77236ebd135b254aa86f529fc3372977d447afaf24377da1134b8a58d8a6a52c69b20f7c2c2182fba4414587e05a7cd21cd26518a018a9f7ea2a78d789abdad06c7b9bcb2a845863b23bf39b82d4ffaf616022fc3ed961f46d62ff0a575f32a915ed9f7705c22b5227ced444d5d1758c7c52f870cb6e65dee78d959aa5aa40d87bb33abf9cbdf601aad9a8336b7e922e0c3dfad325ce257842ccba8f26dab31312ea462abb91594b73595ca7bca129d9958710a7ac3f3fd121a9cb53f69c913c4876fb3f2fe92f17addbe494252198f2fdf09767feb85353ebccb79f67ad39910fc6fbe93e0c7cb73ee5500a3c81db5f208430f95512820f053ac814f2cab2cf7aae262a89db970da58d807d0d5cf5a287cabc1d4b7f3769383c4cddb6a314b69ecc2be9f35d7d305a4bd94b887dfdd121abaa897616f7e5a537461ef11b979c2823349b10db0361c86c0d0ac92ea4489b2ccc7c1522dd42463179151fbeb184ad8263283acebecc87c8f58833c1ede47913be93583a57755fd16edc611a4075f16d029b7af9e4af2550022b33236145d0ecd5aaddd409a5097626aad88a2133bf1f3ef6272979fda28c3ceb9a14919e78d9028b79e444bf07b3f615309a7d4cac2406ca7daacb996461a54f06f959d153cc60c25e46d3d09170276baf4b39d37d9a18f092b8c1ab2f99cfe9dae28c4534d36eb1b953354bc992ef2c4b501ad0512c372a0b89d3382340043118f43e502913c247a3cf02982b2ad82d1876d31edcd3fa09f9905b283119a088f0ac4ba4a5b5fe53bfefc108693d132be8234385feebff6ed6bda88ef6d1a4a4710fb9a6798240d3e33f1b385c20a221ecd9edae3e407547d2181987e22587dc4e1f6a8a4d7cef68dcaf04b0b697fd8a1068bbe667c56d10e9141ee5974215e6a08c1083546377ba5f7228f6b5121e54b7862f9af677897cd92ba8de74677a39f26b6cc83a8479e39f644258a1f808fb8ba7aad54dc90eeaaf9cc9213cd13a6c09f443e83c19bc43e82c197443e83c191c331d30524d2bf03efb7937f4afea8216701096a422c5f4cd105e286bf982bfaf0a454f1755f80653392c82371c7ba7c163418f4616ca4fd7c8d2b5e0b8d5cfab4e83d27389b3651acb6766d21b20530166f91033bf316e71779152568b555c6c4a4d0a6aa75c9cd7dcc8bde3a8c09949d0b95c2849b6c13ed9a560c7f62e04456389952d5576bd5e11ed6609a8bd8f3ebf647e19f1fce29182be444f0dec69fcfa249a98338194d9f2d5f14aa70d6df21b9d74d01a3b1e11c71368282949ac53352cd82d2a43dd679e8694edd19b5b1b77940b9c9d0bb321b8ecc01a3768b365d814848465def84783350d6ec3a1073279a687e3a01a63e6933206489a3bfb9ec7326d28dbe684ada197e82d452a984ae58ca7eae62510f0508735743adafe18d4077144cfd6957f9176ff49d8023fcdfc2b28b14cede2c456cb06787f55ec16d74c3876cac91c13bab853545e13781d1fa4130e689905739b0becc649365f083e5cbe9bd255bc3ed4b005b17ff569d6ba7dada8bd8cc6ba005737e80f5df14c4a282d7757648a3b07e40af85c732cf4b3ab5b4a2ee2d5c46c74e06bddb50dfcf5be7de0133dc7e565b21d68e8e23560f59ceed05acec5735a5950adc4ecdfabb0b2b1d1f468aed0427ce672d3e0a5c6ae31c1329ca09e4e4e6b0c50ca2135a1f30e2d5083b96c20d74d77755e20cdb04b62fdc48ae20cd2bf7307ed21f7bdf0e9602ded2cc6899dcf376b526c40e159f60ad2109f435256876f564766bb38ac6dc0446e6fc5cf83e2ff6918286461c95aa67e7dabf5ba979ddfd96338af4e739c29a2be051a7b05991e25049c9c7d155318e9c421fcec1fac42d5f971767e8f6cc39fcbe5b00620136ef80f94511af7751eb228d2e00202856f4d2913df71c2abf2b02cbabaebbe4108a4da91f1ac506d9728768ff47c0a59a735c1afab2b85b4d6ffeb4d96eb6de8349c4848a83ee7a0eeda83c12f9a0e51a6d5955295552e0688c3e5655502162c54bcb685f156777a7f095f5b0ed9a5aba2e4966ec49b6ed9329c7dd1bd33adefc20ebb6d174d9ed86126aca5162e8861ea7f21b43a53cd64c12935286c1a6d3a0edf584b278e91165c2af27c4d5cfe13247cef088fa19ebb9b50ed04c225fddc2bafa4012e7a1e30530cd95ca51d52f6513d54ee1838a5069839b2625d84043f5649f3a6af7d8def5442e3f22a6f41c1d776ce8f259e206ae69d5327c537abd30eb971eb7479f3e754f42b0b31c2710e382856b6af1c9987e3caa24a75a08d8af8799ad2882e0931abde72cd90bf8f0d4eddb138e6ca4c0de55121e1da4eae8bb616ae1ad94dc3a00de1989e995d837d5d67b839b6a0bc13384460bd7c06b0a3eaa00030fa81d8d27b4d2b617068aa1291a557f7750b6e626459caec50c25ba8b9c96f5beecc4a30bd570029621e0bb26f52245b513efc320b1ede1ac634f2ae668b9a175cde54ebbe1209ddffe70ff52d1f9cb14290b645f21799ade1c7a018eebf2e330562a6726949a215d2a532bbf5b918b52ab648cce52337f403998e82438cd2040e92dc85f363d977e8dcf2c958b263bee7dd0fe6b3cd9728c423e79388aa498be4665a7256f2bb8323143ff55532a6e9073900daea1255a6ec75a12a3a072d8bb05b311dfccb10859eda8be5868e18340c3c3846dc6cce73215a131b95602d3c3a1a7fcdd0d9129a8a396657908bff311b4d940e36e603b18eae4733e61430aff35ce431e5000456d0da32073dbd3a5c5b9a402b9a515d99291b1843edc6cc49c9e8e6cd232b8242361dd65002f0941254297863bd19a8cf32e2035559444a3dd0838f8c6585f31eb0f67fd5cc9c0f7bdc0f264bda06ffa52e00c5345309fbc5065e26b3fe190a74f106886807dca3963c0d84da793e31d630c16cdbf49b53495f996dd68e5e5d11f2027b73ae3dc8cdd33b191786b9dd4b84e4471eb4fcae60b347a0ad9ff1ba45e3e02ba8301a445724e772d51e7d5459d2538650ae414561f0a6d1f8e5eaf03ef2bad5ab0d8566e45287f81fcd9fc78c065a27a8a05000224e2dea7515e42cd053402c2fa2ed74762cc48e02b2568f24ac15ab297f4a0f5fbb2580507678b903f571e2315b450626fe4f28795c2143739e7c61a54cdc714a9a82d5f4187ff3154612a522ca7bbcd2649d92723d1141d2ab115ea2f4492ac6210e05100d510c05a18507f983ffa91c8bbd63e898d70e87d5f7f97f90c44a345339f319d56df9611eb4e7e915c893a88af4295817fe6db3c8d33f4c327dacc2c08b8ec1b9cbd3c8ed079cf6388aa815d269dc144770194a4ac0f91a2eeb59ae1caad7033151ce527bc4ac6a28834283ed82dd8fcbcc656121bbcb6e1b5aeb92188ca9adb400ca769b23485c65545ed95a55bb81561d316c1eb9f6cc5315e935defe7ae12dc33fa1495d6c01cd52bfd77c78fc681b67613be429ce6d53116922bc3d0234328b792563a74b2a614fb2421f43f3c5ffa356963199ef295415cbdf9a2811d60e93c105ed23dd070420e4b6e667409a3184532b622d27ac28498080e418835a30b5479b8fb0de499b1fc80e3f42e4b54d0bf3fd1851ec1fe92ead42d50c6ab54e781de310568ed41399df2d478643c5aa11249371596d77a86b31124ac6c944dd0a9145cd2b67ec0cfdf8e3b69a7bfdcc66512ddb7e657df1683888331d44e65ab17fddafaf5cfbb3e0362cce8bc66dfbcab67eba0536e88d5a0abdb266d2347b029cfc273afb498cf8954bd3f210acbedaf9a21ebdf72103b52a7b7102504d52dd0d20cf7944082bca52a74ff4b55907c48927b79e1e5f38d70b9de48bf0181ec28ac1b95139a3cd13dc57faaacd3c18eb45598612ae8e36153699b1b528ac8c5665b3e397c84137afbf5b479dc22d6ae84770f1b67c6c3262596178cb709cc26667f1d2caac1608772b6930cd23c3e800e084f019ddbb0d8de12532b1bc08406077a32bc451f22406e59fb055cf7dc0a16861d9dc680db19d93ac1ac0d1c74272821a1a6a53cad80c6c8e223f45b2f1e09ea79bc24b2ba4b56c8a7ea8213e341884445b15c6bfcf7e8166684a94f80b0ebdb59dae8faa5222aa6812877da3c7f4790375901c5ed0d1b152f42422e581ee58ca20c0ffddcb60c7b3795d5c989e6c647983237cddfca4fbd6f5c94fe79ac2633d15c057018713766cc4e3dc64048fe79894a30b3c0221f92d95477994c32ab724a9e1c66fa68e73433a2a89e1d08c712d56da68ff1512b5e5a36dd0c2414dbb39750751c7ab3b59902dfdde7664544d0fdb8d02d002d4917b4c39a0ff0301b600f2e0d501ec6111a7be9a7ec61bfbd5af0b8a9e9e28ac8c3d508d174a21b74f80f24708a9ce52aa104caa2e4fa38827c09908589d607e2928d8716b9675f6ff2efa00eeb1ce04719a4e7d834dd37edc8709f84aecdfe374250a82d3b488273a633f390a38a0c51f1e7d5d515b04d8095d866b8ef06e96691cd690a6825ae92dcfdda05cd5354d49f2a01c6ea20e0f28dd50b4c118fb1cf2957e00608d7ea0839ba8c27fef304fb29f36ca40695c98defae48e8ae7467566a2233fab24ad5df834bae363d6bce1b4639b3abe7e984a9a687dcc63a7987ac4d0506a516f41b2cd84bbe7c66d942f650e936242f191d79ba72cab6c7e970524c73d63ee116fad4d8b1f8658c3c48871bbbaec31d1e4059be678d3f4c8b40ef9d0e3e17776068636b7a39dbec899ced2a8773a28e91210b236b4f2be6c5368a730c016eb8cf649561b694aa72bf5f58ae1c63c798027938e3dab525819e7f44c609e1c5fe0a32f6069ce9982c973e5224f921f25388760d4ca0d8ce0386266351ca0e3c4222db7e72ea55638ad22c74a57d53ce6ba3a5f5e1a46005932785d0851ea1a6f1e537d145eaa609d0ca03530981532fd0a04a6b4309b85281156c6e700e536682fb7daa26e40533394de5fb501527aa918671ce1e3a1227b975064bf41ee59a31bcdbc37082012d470e5ebf79d9586f6a2274acf5bf8b24ce15e78395740a66f87024500d82048beeb7e720f354cbcf8941be0cc2c609d510e0ad3157120ca590ebaa437218e8dc088c4a431911caf014226ed4ee2ae1836329a9c0905cf736a96e72532009a9e612dea2f3a501a9c2064d6e1ed02464a7382bea98ad208a8193a2360aa30fadb820fc416fcff7f4782dca64ce1ea177968d1c20d0276ee573dd98f8e2528b313efb26a0c05f7df49b4229ce9dca97766166abbc567ca1ff8c73a75c54dcc3f231ca8eb99049fedb3a21a9d00ca4dc0fac401105520cf6c3364a5e223e46f7343e8e27f8f8016607185a54d8e957af3a3732c018026fb0522dbd01913cef0f0c9cd6e0a53fb63e2417420d97210f664d205e212860b38e7c8d58a8bda31226d781812307822ed8546bdb7870333d9c2383a7d624b704f3ebac798e364dd5cfed960d770fd34088628fef15362ed32bfe6dbf53d62052300c9ab35b1d73fd6aa19888d212f6aa1012eef5624e31c69c387c6be3154fe218c5903586961eeaa296f170b295e23317a1503d4adfcf20348f2317c32469765476976644e05e2a9b63be363aeda872c73205c90b7a8d312dd8fa2439ad0c4c04c77239dfbbb5fa6f311327c6d241dbbd428bc707c72e41f77ad2907c2351fd02f47029f6eba31e737d182f8f46fee73aa2f7db0e6d130745d3dcc2576e6c8bd9c37eff853a285e36d41ec7dc7f7964311f80cebcb5266db0a48a9bf2e7632aecdc86e6a04124e890d03647c9b029fb3cf4a5fcffd2e4fd379a34bcc5e2cc52f392ea8a7620acd8f4c548ed52e5d9bbf4ab4794117c60c38a30022fe932861f62a3cc432d0cea07f8c5e2524a84d37a232e870a81cc3522f29df0b94de6c83547a34f7182069419fcc6e8c5b0718dba8d8e1eecba729f4b29b58d198854d8db401cfea8905fb30883efab5863cd17430d61c3807cf4e03cd75f5cc39705436e1139a0509401349ef7e2a3560a585d8e0fde8733fc16dd98163e834cf2b4e34f151dad2f09e25fcff4439469ae678e730f2c6402762e4d184804b07c88d7df017e47957423064aef54ce6a30d2577917cca79c116997f237c82e34c1c91f152cb25e6cd8dc38fed27922ef985ac604065c5ae5bd2dbbb0513ae2b6c80f001d71ab882d24e294f55abd4b4c4fd31c8960b97cf4226d1531baa897cc01584aabbb7a85c5ec55703922db3fdd7f5dae9480501d8b66ddf6c81bb8e81be69387c1c85d61221685b82db91822d8e8532b2c77bb4bad02760bca09a9ea341e8699b22c8d1986bf1813ee90c1029613c5bc3462e42a47102a7ebe14f4100c7815f4aa70290e683a88d9f4c1040ce706487ffdfa86210373d926256ccb3cc506d44b9bfaf77d0a81ec20f87c744691588ee7ef1c42f3bd44c755d4661369b6c45f7c2cf8812bca8e69aa0d7d3f817efe793e07bf904109af190f093bfffeaba66b6f0f3b51867ed1af86f649b7eec5fd7861e1acb9660b422d91bdad796afeb441837f9d7182c8b670c4b546031591220706ca905003592156d8afa63f8c1dc1fac676ba257bd55bd3212643bb95a1162f9143c9c436be3701ab6d8bc496e0fbb9dc94828c5885e8d045aeb3884cd08a1ef822224387d02a8960d33eb872668ff53e340d99ba243ebf8db5726dfa52f3b9521d1451daeaa2cef858c1a27b5c092c2f22ef74091d58ec1ffa1968b316d5b597cf909e5a5c9b1d9eab2aaae491ad87cbeabbabe42eeaef7a48a3762abe8f13d63867405ae6ff25d6f6ef0dd729be01391a8b52f16cdacd4a5d24e9f798a5db48eae76435583b5d7e44bee70b68eaa78631fb0cdf66e21e510721bf7918d8b85c944c4746b6b4688cda0da913201f1302df90623809ec4d2e64fd50d71124f4a04e420da47b44a02ed2e1d723c0f9c7a960426cbe15662b15219f88ef463b5359f0394580d1ad666442bcc4c69d3fad2939eae3bd6ec245157118d53c6c845caac80d328412355e1c33bb8f66e4b7dfb549773cb76a260f36505222af4d58cb58b3ac47295096a29d644526b538c819a148cf6464c5d3d54e2209e5b4b688f62a8fb3a0b3922e1d3b945a5eedb3369d76d731f536107d0402f9d5f60d11ae067bd0a6df04ed9f8f8d216cd290a7b23f43e2d6524f4d17e94f7bedf803c2497fa202ddfd76b2271e9ef3b791ba4a014330465f6d9be68b70560a3c4a5c7a19d45f8c2782d61a5cdfd738eb4fa202ef37737d0c1ec1ac51afbe203940c978aba6dec1832918074ac7289bec5573ab937697f42af6cf25065fc532d983f61034dcdc45b5543cf1345f472090e212ba49f2e82ffc54f442d2629f02eef88b44c48bf18702dd69fbc61621fea404615f888584f6f007afda443d564245029d55c8ec31f9409fad5a27c2c54e8666bf571209f3f532becabe16b7ca0fb34f48ef9c36ab7d5ca3a1ef4eb5abdbf41da1351d1b39b7d3f16807995a501eda3bf6b110a5bec5739615df0078663d3e53a73efec50a1519f015b315be005f9ae2474be305a4bb1d2eef89c83c4280d5b7aa87eff4c36459684c37a1bd4a66659a5da343dd9cd9dda9507b917c3b11ed9c4411d299675e9b27134570a92b9b68ebac8c3fa0f8f166dc68193da21f3780464fd6267b634982ca6da1513fe03021b4c6eb1237235489af974a600430d3706a45c3b0e34199961d209e5442c85ac62802b516d9734571ac34c5d6afc40db8a7b88f156c329647d4d0ea01ad1d4b166cdbc04fb8de59e43e4f25577c05b6fbd28cefcaef16dab5645fe08ac572f7068ad2359fc9c3bb51886b640782344e7921bad8f9922001cf0a751fe15f7caa441948b870e2ce9fd6d6c803ff7892bffabb0c0f48854287916cbb0ae71890aceb0d73cf0b1a03af6ce96363e9ec46959a53869cb954d2fc5d068a90359cfd7fdc86c278b1d574657e0ca4685661fa81d58744301358e60c3a228626c4ac8894569892d2a8f1c71cde57a94b2a8a88cb9a2c06822539e1aad35d062096f816e3384b92b5f5433af902a2bfd7f97b02c7733c8f8f8af1e5f8d773326fc20d775ce34e9047c4915a725607157aff08f514d1184ce6928abb6b0d39fb6b569d1391fb68c83ecab34a7ebb76438db59d2ff6e567a48af888f60c27b70c4067b20f75bc7a07b5cbd1655a768de92ee5b2f5476bdd815a9736158c7c757bf4618d1d18d2efc32fda7f3d083354ccef84b7a4d1c457e9c5e9ff01fc0c2e7cab690277c5cc5e72d4ba03bae321472a89d2c54ae3cda7195a51b6168718c23ee689d4cef1d765eae266bf5426386a6af8486e9ed0b79bd66577de2b69bcf3a6b7ba12fd672773a6b6986d7fed0724e3862ce34c2ff2239903a2498ebe2e652b172a2e8a6314608ab7d5ea9137fa3223efbe7c04a4f23f0cd36a6f0529952c25951c458a83ba0b9de9f4b178258286bca029108e013362bf2312ecaa5b12a5a5c3b6a1f1f774d3dd4e54072f2f65d0e5945ff792e05173e191624b230da7a20aaaa514f8e0df5c213766980d38ed5102568916a877417dd5041c950fc5c88ee898473a10a0a342f74fa4e832326caa2a8f16a200dabd671098a36a9091d5f269ea23c23cd26702cfeab76dd86335730682f54d146dfde1c2ae92cd4863e4301edc51afa9e8d7190e5fbca1580053e714542b7248f632153d4954d3aa1c597c923b4252aa841bc45d124dc4c8d54bb48e89f3d48c649d31a1a988146fa72f4cbd7253f081336d624b14fc2b62b9cde8696bf36d480e1cf62a30424946c06aa51d93d0953aaaf543db15766020e4888014e6aed9eb87084cf80596cd3aeaaa910baf60ff55cb086c1a1a5ee91961627cc45889c3990fa842c6c08c76dcb2b9115bf0dd4c34f420ef6d927f971df43817d7dfaa2a75679756ab9a990e22f7054d1915b6ace483c12ae09b4e09964cb7724e92c928c988ceb063b1c6da6ca599e3aa1c064a6f00d6c3f39d6837e5b787400ed8fae4067552115681e3ed505d4c7fec01b0cc4aac186c962d010ba1a5c972e7c57430a228a4487497f6759152bcac87570e4644657bb559898d272fb04c9cd314c8700ad6c4917290cb58d34ba989896b5164291dba324f5af2339d7d9b825f4748446e6680f0db4e3a7d83f3175ee6a077c94801272c3452e7c679b2bc9e28a87560ed884f349675409aec70d5c53fec3f980bba6dc8e681d8d05b8c42ccae51a204e7b7cd8cf38542abe43fcd733cbc172a0473edf11aebf7be106b8c0f9e5bf52f14ff80f83a164a677c2cfb016ac30ae28eb4fc8a7a5b2401a50ac882b223f300e0b22f5fed4d99b887805e581814265d7e730bf1e57f41d3865bf842b4ae80632e004b1b8a21bde42c776efe64be3ac68d5aa043283e1390b21aa759d57d89e817e7454f95ed76bebbad9426114963eb162c92344b3041bf729bdbdcacac07e714d16b775d8839cb432bd9541e6873ee7236e47ee27bf6dd0c43cd01b40703b0b03bb243323aa34df40d213a0c3fa8caf5fbb6d3d04bec6e5ed2f1b2754e5be961b5e98c658fdea053561f7358a5367fc9f73f93161d0d49807b20100dca7da6ddde64a9e0f15e92b523f687a8745b8f11ece51d37dbd11a094008ef235c8326c7bf09e262759ce755f7936878ed6b82fa57367a53e243977509a0602b59b14786bd0f2ee2b1c909cd7bbf1f597e9fd55a8d5b6d87f07b8602006c55dc2cb3c3c03c1ada255117dadf5064f43401ece3c8c2eb69684aaf34914793ee5dbe7bf3a5875349daa6264b55f9e3f88ccfe567b68d3220942e3e3d54327fbc9329de1bde43c4f4fda2f5045f51ae7528ea79fc7be871c32a01da368e929bf31b7756ca174b7203fffbdc1cc0fa5eb7ff71f066530c5b8154af1960e66db0514d0cc0734bc5e7ff0d94ce19b97f4441d793e9eb496f480c4b29d7d2e4efb862c5ef4d877e6795e77cc39e6314a42e160ef51d3f16e90f75a9648c8a4e075135e78eb9de38db2fbff5cd203ffd4ae2304fd3777117fd4154d618579dfd2955f5c88beae3f5c26b892f6bdfd811c974c7210b4dc83260a5d4fea4566b5d6371b1fc2fea5a15c801a16fdf275e17014ba65113c77d79f7ca0ec170507da136006220a24dbc23949bd644c8a1b7d26fd40c507a0a328d8454b55596046ed3305bfc22f81ed4bc3cd88fe8b0c00265f7d2d83979bba4f33be987f2af6e6d2201521a06d3e805e1c7147237b309d9eb7ac0e9e93f0b833146d6798f3c8f2c5ec742b43a2413de78b9051f8aa22b1608f247d979663670a3e2ca54d187ece2734413d79c79e2e74bdaa9dfedfe2b9304bf46d5d3830a99edb9f9ef76a086cb06816d66abbe79bf711dff5bdb72d2fd4dd7dc2de0fe88b06dcbfb614d035904d50cc3ad799f7ddde0a75c7e081c8165c29b608d816840a5ff49e66aeb68a6f482b429358a8e00ead8364a78a441074e3183a9da92466674210cf93093c7ae62a175530abe7337c0cc21b152b199ff471071dbc1fe31d150089ff7338206fd9954711fcdfaeffdb37242fa757fbb192430e1559069b8f39dcab3945eb75b5cafc46c88fdb865366efe5fa516581bdf7301817f3f55e68c47ffa60a4ab336aa57e114bfb83d2e6fbddc5a1d9dc9e67f16a2fa66886cfb6a1b5ebb5ae8abd8a1e6824b08b3a98f9e9f8f2c2c20c8264f0a24334cf3380909082e4e9df7df4f387f4137cad1aefa28da7f78bcfe3964005225450bc522464aa646cb295ec863c1b06645cf590de5b344612639d96b73c30250e6ad691eb214b07b5859f253456c9fe757bc9f38b6d63a7d5341774dffc1d004359e88987ece05989ee9ec2b33dbd732a7ad35a267fecec16de07d321e16241ded0ba67d34b99a11bcafc577cb49ecc3d241f57eff58ee8059e57afeecfd766232a2c18cb06cf22d5323ad3708c77bc7fcabaeaf94a2ab3ef4f58d7626dd513931f69379479b74f081543ffbed38db4a61bca6c9c1cab30e5e6c07833f8067b3c92e216c23318d7cf677662da646b1ec91e9459d7367c03a59ca7f5abf317cdb67840fbb78ae39ea6920d49aa93449568a431686c9c8028ce29489ef977c7b90fd78fc58f09b7403f4c0430075998a41b7aa7d18dd335c3ca0a47d74f109bb9524aab6a57cc019ccc563bdbdc5d00ca097cda449f2e92f0459271939484aee83fd1d51f6a7519fc03945818aaf835a1ab726faed994b6b223a8341ef1d09085513872a2055b86d2eb9d20e986cc9a2724309838967271942bc78c68c6fcdb55953fd9da2e6c97d3791d3c1942967fd82424b6f3fd4a8db88c4f948f385fcc69934d1a195091a518b0c7e8fb35c60ced3fcc545edc9929c1a8ca165f59cfffd509ca85ee81d6aa3ecfda056b69b9defd0a19795dfd83c0498831763c29c8316912a55e45495cfd1d2118a2b6efc117b744ee1f29711a1c754660e570429c1829a5f8869344634a9d6b05b6c9644b61aa8e94985ea5ef59ef5a67b54f60a4c450b850a1b22391df37626ba5c8e2c0f2e9ffa14055513b47266fcbc83b94153b366864662646f9068d32575fdd73bf699ae90a7b20723672180492b2ea3525861ca0e6014cf98a8c9040a470aece911cf3192737d042ec851c9665b7f8bcd830040162c594b354234f1a1604ddf8c3105712f4703310f4bf5efed90af739c85e4bb8f55328f4cef5f9fc3bd2c11b6a751bdc96705af171f228c473e2bed244103ebc02682c633b3188389cf8b8896f0c847b2e3e460dc3aa4ca80f52812517fd9375231178dc73c78a44ba8873b038d030154c9faaecebd50f1da10f1eb7f69729554025e88dfe9c1cbd137ca9e1ea4aba164863ae4b34dce136292abb78c072ad94a57dc5beed0dd8d6401f7b527722b7175316165f47b75c0b072f16ccd768e90c8c45278e3a91000192abcffb4d21e8189852f8a3f949282b618cb34ad5253d7342799692c3daa5ad070bc006508fe1af4b74ae7bdeb856141f93e514cabc3c834c5ca1b8755e0b7d5ce1c6ad6b07df4c2a0e8982fe91c5c2a67643c3c3dd2549a573bc14c6b22f87631dc01d4d3a049bb68de86f5a04339d5a7c9b8ccd68c7013629a2f850cecfeecdda5f4ea36449785c0c2a5bf95b437e873a5ee7fe6eba6436eca1ae50c1b03f47d49325d2dc40efe8592cddb7b3e1b45e3026aed7aaf5e48da524b0ecc9ae23bdaf29edb767f5a26a331bbff04ddb492f8a64e2a83836d9ce136910aa436c85b94161d95e43e1658323f45ee2229960d7e7dbcdb3c42ca206850f93c62a62295a7c638900b107c37de0811c8840042eb0a412ebf9ddcd37589a3303a31c373e45d79aea6dc1f39aa54dea88066f3fc6dd96fdbfb359b780441d6cc55042f562ca2bfae51fc854271595351e4b8f33ff5676e362a6125ae6948933698b9b1a720353fa6efb4b1b62b3edf9da12240a9a401b47de63744d0c05f070c83f0246c98b92ba58facce6bdc873f1e23817988da1232887cb26115f65fdf03f32a551faae98d1beb2bcff64390b57d82b671887820715b043cf87728889ea8040e0cbc17f8e1f03d6c2eac5d8c1de7ef8d98e645d383be6c835f03bb300d58f102d629c47a85f8777999ce2c34da9fbeefd3659993b93fca6d8013323d4b37ef0934e7a53bed3251e78b36af1fc4d48fe3b09f6747c1cb5d60336e998aa2fc593a0a9041593b79d419f394d8eaeb4cc6981c2c7d80660134120b7091decfa710bc3ba99cb92b8f0a090e39aedfbdfd6ddef42ac24c5027b50a1c4a8c2720a8e51ef90518832ed4de913b6375c3306b80a7c065e1844f8faecb5ea5f55ff1e08977741f0e9e2fde7be3c0108e5afa93a3c70ad72163d4ea97027c3ff2aea2f120837f41f616b48473b79df8cdd0eb8892adc2f1b17f37980e326e1ddd21085693bde25b9a3ddedc0c0551af368b0b88f98893468708738500c1b15f5ace015796b38cba948e7f533bf719c3ae414f95c39a3841e5430f93524c3e38f2996fbe93ade8dee9fefe89b8e1e2576d135137f33e5d669ee9a56b9c61e05e97e61da3db18ae7bdf239fa96c8b4e114b97f02f430d02f87ff370f51fb3890ce9ffc9a58242d990a93e9584d2e98e2d9a473ea70b91fe43818552c6c2cc5c1a2b02ea354b27cf2f990ab36b0da8b51076e7c3b1639c7e81852c255b705b96df329941dc49ab8fd475f2549125ed27d70f306edd9a4eff8b79109506d9ba3709bea94fd03fa4b7924dfe3399aa09bc7342eae1109cbb5bbe4002ce11e2b38fad73f2abc6c86a7c521a1ee8cea929789d39ef76624e300ccbf422325fe99b69efb38c3fd420881c02eb3e4d43d3ccd6814721fbfdcd914a02f2de106320e7ada640e9668a54b5e32480f1a9da13411272aafcf202d6f3c96578c111cd4acc894319b27b94ae244d70ac21740f12432251071ffde208ba19e4986e01066f70ea7f67d8c8cc78c34f0378884362379fd124ce5d979152fc22b2cf4aa630d5bec3020204574dc975f7a1df3fbd243b0e934c6e535231434304ac4a291f5a2f4e725b0648b40ba8d9843cbd87c4f471980dcd35b18bf4e09c9e21852be7de289303183e7575f38444f058ecc4cc6a491cbb3bc0c2b875da9c8c05d66ddb09e4c2d8b5cf6efb1dd3dfef0768ebed33a9c4bc832b2239d0f10062cda84041b8882da16a23d1237cd4f70288638cd85330e97aaa90800b84f05eda706f012cc442f3dc3beaf8088b1f3145ab54c3f9a9558b23bd2f1ea4883bb64e8ee5f38cd25f566ff570988b7fedcf25c69701b1f48c7d96c2518754996f0fee2ea6f9971363fcf3cb7378add722801b5fb731e0a197e04203720dff274eb5ae75a8b91be936d5c2e0d1d78acc6c16dca9174097a85ec3108a03f1034f1aa45e0022651d678d0cd18a04a84d43d068ee2566f452325662d274c2e67900a85ecc0476f1f052f9fb2913a393f3f2c0a6118939084c9b9936134881acf77de67f3cc4b41210d4c984aaa7c0b5384c8ed97d9e61be5ad2df0e889c072f84ce64a5b875e32a7ee0403d843dd2f56613555f9919d3078cbad61f059770655b5644dfe3c05bbaab56b21c2a20bd15dc85fa56e6517bd343097f6bef4bf8e710adeeef020051eeeba7c10983d8e82d474774b052cc0484504a1a831a1a9888c3f7128251b95363f4b4c07d5a7e89ee555e1bf2b1c4e9c9b030715e849369e8c3956d9c654779ac06f07c1ec3879fc76a401a7f8aead108521dea63a252fc0a453387c2b2e8a5d9c267c538ace8fb66dfa9b21c6dcfce0f9cad69f2f56c2e15c35ada0937078fa86d689bf132f599c3ca34e4256875ce3745cc8bc7434581f9e66683e999369f5c75930980e367d99dc0340184c6771f4d0e5a3f9c7fa2d382716d2298c3e6029208c50b3e73b32dd4a0af8dc71ae9e85fa03c8ec81c56cf369eeb60faf7f9c04f8a053511dc943332018372729fd368840b925e73777a7f177018ae09ca095ac19eb84cc52153fb4a61384cc11059f62a2728a827c5ce390b280cce72ced14df6eb3bf2edd9892b42a384dab92a9e47f84ada74a2588d73a0e0d645885a81a08881bc6da7b89c48a16f042e18b07c12069ac97be7bd49740a5e61e918843d7ccdb41b41073670b798a61e7ec5126b60bf443b768dec77cea7f0ee89f921f4e20807f58037d0a9bacda27c10c385889bac0a0838a6ee245f69be64b956a368963d4ee034bae244579a5023b7f34a1c9eb63416204ea38a52d240a0d89d6e9ecfe38661209181a88109daf73e3e0d1107921c9f235e0c34f12db0134e090bb0b7c3f579e3e05caf931f31d3ce2b905ecb39131737f3facf5b26f4fe7e6b8c04c84a014864cac690f9189fcfd25db6f85b133717b483263b4d36e59f34b3a3d9103922c5cea5349db183e881c3ba97d0e5091b27a9eea32c62ff8bde0d526c633fd08dfe2a581d9f764ea896c77acdf4e0790d942b9aa8993ddb8e923e2d6f5c4109361aa00579472ddada7bb82390c0b8eb651ff5b1bd2604fdfe5acb6c4767ed8e057c01f34ae6772e8e8b23fab3cfc661474624fe477f4960cfeb884fa353983725b2b2b4e94af1a2c939f8f24ab8ee7ff36adcaf33b46eaeb29427c57c49ee3431a027b635433ee893538a2054db5641063858146a0f7f1ef039f70c0ecff47e31ffc53da337a302aec793ec52a2c510cbd57f2521645fb87a4fde6ec2af2958d13d462747a9a5a86fa9fa0b99fef00f829820fb3a38f2a23c4e38a468be9683ea87429b9abadc38c4427cbeff6b5ce6db791fb633f888a2ce1501360d121a3529f1e5e54070a837c9ca44efdf4667d6a7f2f235001345ca372c6eae26857ebe89973aff7b17edaa29d05af280ef3bc3bcd378f90d5cf7ada6955dc5ea75070af06b4b788d39f9b05668e3413db5eb15073d03f8afbf43871f6e0214f9b525d374b9f72c3bdeb6266c88c5c92779b2a27397014158985ccaa84069a064347df1c1846fac4d170318f5be1e5eb56cc61985bf5243c3885e1cc1449ab69f31c9c261a61dd8a2f0559c7bcf9fad0cb5ec185b3c944aeba2a9dd3b8cd83d838d3ac641599a72c89034ed58d113348ab64adb0d26554cfdd40986c7bf7e1f8ba2db85d7d5d3cdc49ac9e2f989ed13136a3f01a7ae460786347a082a347a9454141c718000c458a4c5febaa45a8ee4bc9eac82f31602a47c8c13d94be9e9cd3e741c71a6e2a90687082ff2ab3fbb5cfb09d95ed954fc2b02dbfe41ea90b06cac6a69dc218ce6c6193eabe4af365c0271ebde7746d47474c385541a698baff630a7e91322a6e425241a5686d6f0a21333fe0a7e87e1dcae29fac9545859b7e91c23ad042df0ffec48b03290a4f78f080e59e3011f13c1325dcb1af514eb19cf4159741b4befe620486377f5f8b0994d19991199a327825d5ffa319f852522c45e21683e32bae8e1304b46964562f0944755d64b45b8e8ada1ae86993fc95d9aa179bef28e74c30e2983628a85a36f4796315f514894bc0fa33971c25bc3fdef25ce4c605d72fce41993991b62f35b74d2c6c9d91c3463a35b3f384a57b6468f05c63e06b711cb34ce621d7e989ed212026c83a9d71d8fe6a211d7205f428ec50ae048e60651cb8b776b75a160b2ec371b34fca664348b5151b1b52a8fcb352f4dd2c264aa13c0f973c62a28d39e031ca875c1f0413cb27369a495baf622b519082946dd111f3256a5a4b316768a9d8da1b9e6606e279436b4db6781f676e2e51f0035944b83b796c4f4150cbd94664161873cfe8a8be4d6443f0aa7e048a08ce2f736e23df47550245c63c91bf0c590b3832c9acab6dae5ee7bf3f210175e4c9461f75c4ab93d425fc63387697c7d70ee5d9a38abbe986a676bed2fe4d2750fec5607418ebd0cd82e36d93108b9a8e55c6ae0fe34dc6bda482e31799fc2b095e332279b7dae068c8af9b01069cc3d1bcd928c1e3c815fe98e4077aefb810e66aa40c471f68375e60f8a496ba81edb5692b8575d7abc8c0b5a955dbe6ed69c7781343a891a59671f48287f466ec02e3bfdf9527290d00b46bdd9f84dbf3b703e55b97b9f72bde3b1dae0f419fa40c0468fb727e090600ed503a0162b711f23daab2d8027c75801e12355686594cb943441b088dce43c582f53177a4f119e97c02e9a3e6155204199c80832fef00b046fafc8b1bf4f56088ee6077f6e73981ad5a235adc22d79ca70b5bb6c3918956e8d27aa39cfa1876680302a58584627516896c36a2666db867f12074276f985ba1267a696603ab7aa25b2920b204c621ae740d77a143b0a95a6d264aacc87014a0610c1e92a695daedc44192b7c893b4c16aacbbb9e12c9c3f3e722d617f70f4a5af6df88003aa8f037645b70c9ad9802e788223153dbc3b115ef5ebc6eb1f2536bc8c9fc190fd565150ef4b2f46b79c4ff7aa256d8943c626631a738fa1eb6e7327a281b7a4bbb53fc340ffd8ab47298b52547a04aaee5d1106c81a9e9fb1b8ffc16d8a40d0bc83650e42485daeccdf108f363a983322a55c7a5133483af8609d56860e1ef5c78fb75e05636a90a3641366dfa081d836a88e440416cef8875504a3c5147ce98cbe05528a1e8e229b611e3bb1a28341e47a196931ae1fbdbba9a92ceca542caf4db7ad4a7dc99a58ab8aa0d24bc1429162bccdeb9cb30530b9e5cd3ad4d1618cb29fe3ac0726c71ffd4b19cbf61e1c8e3d0867340e6ba57340502207589c7dc237a0409bf1b1fc6520b372e4e6965bd5def18342a8e8c907d2abffe08e5860ba01de9a2edfed52cf2432975a3eff07bf3679b34e872138993a4e5310a2b1fe5bd48bdcc481a8bb4143389bd73a7e7816290b33b9b609301ea29380fe44ce498a671954ee342e55ddaddf8d2cb15c4a3ed82ba5c5165854dac4f7fc82f82c37cd77022438a517fd01628f515e4c872ae25d8af1d07310ae848c36651d834fe4d1fb8f68fdcd2acc2bb2fdc9bead38713e9668b520900f531cdfd272ccbbb1b72e6e677aa66bd538c4f82eb3a1d5d349febd312dc577458ff8d397c3d4883e21c8f6a30cc0918db0f457900cd49523b067973d599de240ec2cc72c0b7ecf83c1ec4e1daeae01773b839fbfa7a38d521d75e18d08799eb645917a6aa95e548e0d19e0fc516b1f962da368b9dc33585f4c6243334d721d31ec8e8066cc924152fb52297aa3099da70d27aea79f482559c47d273d07673e0be0178d90800bd57e979095688ce5380d063713cbdbcc91afd044aa169e49483034fa0b83effb162071b9575b18da5aa792310210cacd5f06b5431d8392813aaeff41b4b52c0d1b8a0fea18b84e0ef542aee8dcb2272744eb6d44849e0a1724120f39c9ce3f5e92ce72f78cd9ded2eb0368dd331e215a619e55ba41ba651779ad324bd55b3eec020df8b3c5bb073854edc765d2cb7b8626506cdec7ceaa61338df51e137d69575a91e9d3f9a3a1bec997cea751080ca195b19483ebe8ed1ecfc2c7af3ac0b33693f105a12def795cfe64f0adaf2c2a8cc04194d6c88351fe077f0d10c8af5cbe57d912203632bdbce89cba418dfe6a2876b287bc5fa8dbb21ea4bc167b19c92973eca612694972d2f9321ab8b50269c3ebef7b3310204942ab828a2087744b445c042eb69383b451454232fca11d333426ee9d234af604529e7899048f6a2490ed8a78faae832d20ce3f3b31cd1c08eb816c8654822aa6a7e53bae05db4ce2894667a07189ece585c684b0d66ea7f3ee24a565012eb132af3686c9cd777fc9deae96c5347e292e239509e9a0943ee7e2a677d0bede172fa9ecc2f940e8038c7e04583c1887021f6a8910b9bd40bc557f6c729dc6df6b170075f0e2df1a62225ee0ea55fcad3aefe7c68a56f73408fc718f0d5a28aa3ddb8252e50fbd6986788d8015e365dedb90db8873317fc472f6530aac84d869974a0cc69be77959a3529836ab2cd5ad13be0b7b99949ccdbc320cc3b07df37f784c5e57f4a1fe5f38e3758cde0743e07c7e419d97a26c9f2d0503eb98aba575e723ab0c22f97c7320c950f9f2ca8af1208814f391d1beb29463fa68e3e5fbfd035b745477ec012c51cc8269d638689392a2ba7e658bc84c5bc8d0a0841843e79795bd323fbf68259b0fdda0c5c952736c6f6ac133f5ae4d5472c9e3893ff81473ba53904506a34640e3f6b5cf32719923eb8200607aacbb821d97fc6bc2abe0956773d1f6c6713ae40cc0a806360e838d5bd9d515ad6424a6ff3fd04618fe36bbe06ff8ea461fa7589abaff81ee8d4507eb1abbaeb771043d2989acebad62c6be310eba069e57f0269b5dae895e26498b4b14bae39fab4625f31739611f7b6024a43316c223fb158db6b13b87b21166b7d5e6f7606c61a433d7d64a173c696a39ee79f5b3b777e20ee67e9f01fd73e2ce587bf0f6d52c77e4ec22b69481134d07dbd952217d3e835dd220d595cfa7c24768dd74c8a79e63391d055e1aa9e8ef04d0291fc594d8cbaa596df39fceb4bed1ea6a474f4550e15e377f9c21a6eb31a97c682377ecaa5882fee86de1b854dca73b0d9233923796d3364fc3c743ff62d94201cf0f30c5cd2370a7454d73489db1c13c76c5c0ba8d18984cc1515e005d13aa83f23a670fb62650a576f4c9c298357085dd8d321660a689aaef300024440ed6206be6c034dd1b63f2bfd5e192e592d1793308e2d64096bc57736e9b4433424fcea1120f7b0f90cc1c30d507e6215a81913301e22eb1cea93af7fee4621a287a00c2588208ec024d5196ad82f34a8317457292fda110b7fa235a7525e758365f56738fd180d5e1b48a784203e0554f30521a834e837f2bbf44a7db6b275be2e2d185d9dc7ed7cde7478ea523ec1b987edacea7de36a9728a8642729adaa35c093f22ea7aee4427e7afaefdbc27487d06fb836ca7c7944ee6d0041cfbfc9634ab6e2ade2c13a823cf00d603569a3d0c8d8b251688860e9e225e300ee3b5699d0fc69afd6e6a95292304ac4152311359429853824dc5703824eb29309d5781aba626ed73337dbe189629248a99f28482f4157be885429c89292ba5ab7b718c098b47bbd57928c8c0a1261602ea3e866d3113354b00127b2d4d123dba66bbc728f7902440a3d89e9c4a0ce39b2aadf6df50dca410d5ef42e3c19fba01650c2b1c3be5c5ada3aacaa78f06c4f06d6b4bb887818dba24ef35e48df618b74d70cd5f32216b07d68eb88c621a148fca0df027b9234fd6a8dfdd5c31ad44d622353730af211761c518058c379ee52fe5e48250e885ae5d70175d768f9b13e40e4067bd75632c2ac3dded4587d9575b98bca7506061b4d270827ac7fd859cb75b3ace21890ba35a4d0a69e4738beb255d10192f64bc13ca2042393fba8398b28c59ef80245036699da8fb95228e29f682fa549c4637b8f2276250e923faa944e10f947d7a4a821be89943fb9f1911fdc38b430a3f3077a4bbf5a8617e34f2299886a9441466cb2af85765f404c837861ddacaca14c32e31e5e5bdcaefa9186fd774bba26863fb2b8becf7253ab7ba019541520c81b154fc9fadbda940f61cf42169cb27ce500d9f0edb6f3dd8217e0af71b662e4426d2b3b0d7f37e935a94d17b8a4186ed544d6879ed22edabf946bc3a5f4535807f7670c007d52bd4f466468d947138ed1a847187adeec84108a1ece2b01e184840a2a24b07fe60cb0de83dc76a4cf99e3f4fa5b4a34b340fe9312bf305363bb8d97ed4973302585c773d97e4374d0e0d5fbf208d716a77d44d31497f5e80893fc2d044d48f91821264968f2d9f6f19a2a3be8421f4acaf6459b455e5d76610e443ca66f9fcc659b4304133d5414a8bb875452984ebbc5e703328864bea78478a5ed3897a296b0037d90d151db3f79c19c64f14adfe8539a5463e2548236085075002cfdc6a543719dcab52f9c71a67015aa0a0a295e5838965a109e79b2975158e2567c0cfd11e51fa9d3ae9aadf2e1f9bfc76a0d4968ae2ca1a2f90fcea9689578b8db443086fc17ac09e411eb0c25aca4ea9c58fbe81ae7c62763d02026f1c53048fae4135e7c500b5ebee3e599e29a735abcf5e8ae43be4878be066f9c37f96c727c65f7d525ddd273555e0abdaad4a84dde0f3c27ef099b872421b1dd1dc53879270dadb699adf06ad37c533aba059963a73dba4ac9517ee9e526a47282ce14e9de4fb2195fcdbafd5cd7be8fc008c198ea2f2c02536cbfa0c7d9a80280ac6fdf6743a28956477bdd874a1ab2ddc4a6b850ae75d5eb9a10a5a891562f62eb6d888b38cfe879a45efce135cf1397d004fc36a1a1809255c85c55140a610900de2a9898dc490df6e01c189d5dcf7338e2851455dbab25d94fe88def9aabef3334ee4a1abef1bd011b49c733da7bf1cb1111038889c82039cacea16ce858002eeed57ab682055cb78a514846c29a8387c863e49e31bc7c0aa4e1b83e52e1e40de5e3eb52fa43d61756022e82b26091c2c5171746ff28b227f119080392384a55764e35f50f1518384cdde3844d90da4b99eb4541679e6d063eebd9b7d75885fa6d73442a94be876ff3c8c45e67a70e9947993a756a445589a46a3e06bad3434a89519f71d3ea63c8694c583420b4d498e899637102b137e0e30f6c2ee779584a9655a31bbfb3838ed5f0184bcc8e1d74282245bf4eeca888ed708ecd35316a74bb29979996000f90a6e2e68d6bc75d689453be5b9d13ee6d87bc647f52fe98c51c1950dbbc015e70be8b4f80bcc82da7d5bd0dd9d29f4726a793bd6735c9e56c7f3b233e490325c5ee23a66441abc2bf3968f4e712f115a154576090055a53250d52f0d16536cedeb34e389112a25b1a0cdd0cde0eb101a37dec22546157704f411a7ed00175555aead7f0da932532adf7e8512a3dd3f5bd911eec74a1a2acf8fc699c43cbe7c54490b88d3ec4f4cfd08759d58c27b380d05f28b6d215afdc7f79a745dbe3553145e300bb017dd2f0a1d8bca99b2a939229c68cae867de88d8a17dc0d26ffd6440fb183516b384fcfdbacf27e2d0e6fd05822c886f872764ede37ac1005405f918b590dcc916089fbdbfe3266f7d0e8c453fb74308a736ca14e46e04e1645ada74309ea90cdf9e45fcc2b6b80fc9e420dc8cb90ab4f4f83655345fee478cd8b020f500be19eaa8ee3e741fadc57a06f81caa08204d5f98356eb94bfe786eec711683f89a047d04a6ea3217566f3f25efc9ffc39362e0dd5e37260139f13dceb699153cb33a16bb246ae99c2cc2ff6223b309ce204384bb946a06ff82c4ecdcf5b5ab0e8cef268af51d8d4b9a1a46565785c5095071e48fafa3875e2c297a01b04b6b8e2bb56a7bde31d60462e1e4e28e4dd360b762b694e17c96ea150339b417c6dc70166bca55cc2639a71105366537b56d93a81d1594215b46fd0d13c12b099813f5a176849660b686f5464995050581da69763eae0871cee2dd0576b62808af46b46120d2d572d049c2cc2cb90cad13860adc57c5160bf3c1265ec28f1741a5631ade49c354cb05fb8bcc2bda74e625c93a4e5a35d52f48de12b4475bd4da1e824207d520942d1a684f4ed9e6ae958faac307fcc16013c9075bdc351d7daab10d728efef4dd1675b94c4d0aab920afcf7b86461da940a8856be0485a6dc2ea3d33e246d8003948d2f0a5d439b7a8727988d3471fe89616c69bdd9ed831eb19ed9a95be1d2d77d6970ced3557cc0ccb5a0def14171f84d2e50cbd4d6c0f36782089041fbe7af430408d1579ee94a443aed3cc782a96dd1e8e6c6460b261026f4d41bba4f93a14a18af6ffe9830f2cfc341330626685c17b10c592e7e4df47027db918bfbfebbbfacccce51177392acc77ff964e1698a88166408d18600a6220f3b47a97665e2d451a2e6a65eefb6826fe9fe88d7585177357aa4cc9e27d7791bd1763f26ca6db1fb0d1b837a3304ab5965ecb647f706d71f6272977bcb7ceb8e2354db9ed5bdde25f2ae531848fd707f8f0ba7adf7f099c7a454dee7f856ea1c31b06d606ff97d6e2454cd366cd78bf04c6f22c8b29e440f9017c2d9181253d76ad9017c0c7c9f233f404c97081e913b8310e937c9eafa57d53b85d07447a81866fb17855c8ab2b8781466df59733d46a4cdb4472d77cc675bd2f074d9dc80d7b06319f14f4462c48cb6ae27dc625ea8f2e8ec99e9fa95c14a7b0619f82a1da97092b2b1527b77aaa7bf222358e4012f0cf65def2a460ce3213e77513c405587614418f68e66e824874803311df3f999ab7f404f03c9230cbb6773e8c8c4cac9ca0c603ad1c453633f902161170f784ba0f3313e311d89620cfd1fe5c73967012b81de8d1860266bc739139895e911f38ad04664f7ced96d4394630d4d28d23e40a6acfad442ef3044ea219504bf1380b1202b044e85027ba2f150b832165e90958ca59940ccd552aa7a092cc85eedf8077c908482494faa30d0da37ba05d8f12d69a0e0d1da25a451dd4720f0d25ac863a3d486be908a1d5a17e35a8aa0c89a0903af060da1efa8ec99c4065d726a22766620feebe9e9e74d7fb2ff917a279ab3e45ba2f5906f8d55d518fc00370f112a370edbf3f8713fae71fb2b2621786c335d14a49f338e75b99d6e514616244ec244a66d9e25dc3794f4b5bb52f92e42a309af3aab04ee66987a8391e746df02c286aa1005ffc7c1371e1cafc120eff56494869567b6502166b0293b089f3066603b042679cf92fffae2ac317fe16bf4b87841b23a1767558bc9ccc70c8d050ec6ddded14b9683fd28a783198366175befd99302c25a4e886b5f2de63122df975a704e1bfbf5b97696f6905cdd1b2b2035814663c59039b23ad60a8788b6816a7891e68bf12f2e299deb4b401d151425bbb06b4005d4f8c6d187399adf053163131fbd744851aa9deb41bf1b199cb9db9051d13350d9f75daf35e52bcd8a79fe505fafc960f09e54f554b3c2c55f68eeee845e9c28506c543c7fdbd95211e55300f1aa41c2f45dfbf337b2167c36313e879aa8ba21ea14e38da60284fb37e68eb58fd5b57a2ac205976344fb91e0bcf15d446bb32d85f4f70dbb6df52428289a5172134c28f8cadebe84984a4a6c82017f34a780611531e3e1a491fea603c54cac59924069ef6cfb800d201266c45eccd40e93adca972449c8a6672337b2c254f6e1e1adb857845b4d3322c6376406da41e0c174a002a13a5f0738123ea8218a1ca670d87f1658d0ac263764c48e23c3065d564619e05a68632052688c552a6f15e77cfc9f0652cd214f9c0044463460fd4b562031d842da2e40f58584614e896d0cedec8a69f4021aab53b942b259b39e8c42ee3782165f4dc43acb1332fc580fa39df89b55ea0f931238a557c5b6d88ec93291ef0eb721ac7d7bb33c74443644606699822e74b32c1de3fdf2530cf44cf1d12cdf76460be0cf8877a50c075648b7303eb9d911e959511b026ef40f213b1cf5f56fb3bdc44b66a49e4d627ce35e7e52704db1a19fac9350fdaf64c6acfde2c9b0633e8ae8b6be2ff36b27ac43cac1cb2515220e5a87738972f325824fd22e6b7f8885c69e3042b7191d61b004364d89ed3ea65a1ae340944628a3e6f90c4aa194bb33730354d7711b16ac8cd7fc94c1b6589b151e3e0d00d25346654c9103b9de31166288828e105e0ee7b56dd7121542ec7c0345e9014309f9e5f86dcf932b7892805d856171551ab8840559f3e7f0d24c63d900163cce1f65a5873bdcc6546902a1957a68bc1407b7e52e90cf120ca87e05d41831339834858ef80db09fac0f7ac672761bc048554d8f1f9d4a03020d27b1af27e3b2b2f981af778ed674edc8165745239177d9613f72d6e5d65875ad5085121fa920b6769a6824485b8a73352f602ebb4ba36c452beb37c52f0f6a8d9fef3778f531d8ca712100bd19d36bf71ba14dcf2c63060af9c3d73e58dd67da15029d97a6cbbc746a84e8600913b1320f4c86dcbf278dde947f9052c4a865af96426c0ab3629ea190de96cddf59552e86e151a200c5ce043535fe10adaee7a537a9cb3ebfeefcd0befee356719664f43f6fce44de17865fa44b430739caea90d49129b841e6b9840faaf7bf319c6b0ae631c28764c719196f3454a2619ff5db129616ccd6ea684491e83e2ecaf26d1a0c00203de21af9cef4509b79961b0c3836889ffaaa7eba7fe8588d691276461612240477e115add24f036438bbfa9d2aea987000cde69bb6a72fb2dadf4aa66ebe3892cd88c34840f1e11f6d92a55d90306dc44d5f2fa5810f5f76c848d2d07ad793b66137a1a9026e338aa0c29d87e1efa095773fc58f4324c506bcad8c3401bffab14a606f67dc5bcebe14af28a5d94c2cc2a112a4ff156a2a901394fed2889d0b1f2474792900dc0ce619cb9fc681d01065484a8e21402476a1cbb48ba9e7ff611d969f839b9259aad21b3cf08f6522a2a72fe6e246a9c41bb2c6a20f28341712ac448b9ff69a352bf0331921932c4be73e90d063f543644a96f76724abb6fc1c6ccb2a141a03b506fcb8ac4cf929ed51c084ef662903b9704100540b55a488356dc7f082e1f0975556658e008b1b15f165c7619778e5c9d8b582468fbedf8b4473b4b4f175aa128ac47f7ed8b81530b81123820f09c5524d56b03ac7826fa3df532f89b110c4fd818382b1dc74dfb5421dc351e03231a3ae21aa500a68583a769dc4c29e6254e13616fbb41c9315f02c13eaece9710cef714357ae4ae8ea14a27adb6332847ac19a906a97fe12f91d367911a4c470d6c7ab1e4778b3d915a93454a7e4e59bedee0e5e5a14dfff5a3cb6208798fe22ae54a128867ac81f9a4f452808111459881a02789f266b838cc1fe7be3ce8569d2d8385fa19449c9884342249dc2d6985199a74dfeded4ba3ad0724308d5bded47e74ddf8cb78c1d4ef631c1fb143cc168d1df724e697bb7da3b8bd3afd3dceaa3cb29d1c2aeaaea024ae9b9f529628010f8afc4130f8e3287688b8d9f2a823af8a18cdb4819bff816ed0fa95048cb5c6ea13fe848b468883c41a09f17e37cd1d018437d1df080f507c0c9822cec49734568e78bdd684bef6b8df10cde6d803aa8e45593e8bec39a1e80127a239975046f1b19c6c6702a0e8070eae103cfbd5515faca38f097102d22b09525c7a8aff0054f77eebf5fce9ba00a226cff44384d256d2cbf646760b0a421ecc25aa96d1647649435ce747df8fe1933272f44139f2d2f37cc721e013015885add011d0208d0795c3607bba3fe1127e3a603539c272d62708d52d2f37d880e3726b0ac55b7406c1aca5038d450eaffcb31c88b71e91104bfe90190e03c50dc485131f160bcf75811115f3f57a3c12c12fbcad9a25685004f81b3e4e422a6101282afc7c3028b86197dd7dea1a61b5cf1575e243dca003a50930cbc517e7d8538606233c32ba37f7d8928aeeb5d7320c237255054409c105c2f75c3c60a36d7cb7a1632b3353cfdab53d43d73773e9c36c5efc847e0a819f2a340fc9e49907797d535e31c8a651ba480af015c98600346e04a2a97aaddcc2aa47af70d8f828b86f11e1cd4712dc4c46edaada701d62dd9924d7bccdef6d304be2a85656e12e175b76a6f353d8f4c6b0a941f2351f619c5e5740e5d9aa1dccf99a2b68c5d50f3ba8d167840e3faaf3b1dc4d0ff979d8e2b090ec916845229d18725b06f597b2f2359fd06593c9057f1e8a8cc475c0e4a3fe745919b721ccca99b888e444423c3a1494559e9345a2a901ed7096db378b5127447a31c518acb7fccb20ea53b613575a3b078b9b5eaf24b045f4ab110d996eeda9ec15d1b7bf89f4d548347849549ef480ef0ce0bf7ccab20411531220a20d3d77d876e105e02cebf2f129e906106912fa1be7f020c99e30d35fcba4a8b5ad342a228531d257ee47b67bc45398437b6826913abd58048399c490e033b07a917075800359e6f8949060e180a35b7d82574152a1e9e7998391f6ddb5b157003f17ad50c40d580ae3fd5a320b30da6a9d5213ecae2fe8215f7d0a26acb85f0c772d5603438a9d0edc7cf420c67bdac978d75ae132a08e518c77315800db2fa4c52871450a2f44eb94d70eb3eba47c7a28e910077db28a2ce404a29a9130c61bdd24cfa06ab6df2d688d7bf5a5a8859098313a4f057165e8dfb73fb9abe802cc8690a9141a6e5dffb2f508720ba006915f471ec2acdce5aaac040438f094b0ac947786e4360e5135cd229fe811520863d45128bccb41413d17d32f97689a1189964a009e0caedd78e264a2341b0481e5ac9414665501bc386e657c79b371a736205b770a67ef25174176893a0c9f2709e14363252a92ec2e10918a8bdda5dd8db433e0241a3cf1062f064b534a8c2668dd5b7dd4b2c1878a9f9c510b55d2c990f819d43e438d8e03c75ad39ddab498ca308bada6d51537826ca755870444b49bda83c51b4edf6283850d3465a46b7a5918f296c0b5040934dd76874f376a83ac3bb74860ba07ac7a00b267edf2638dbb85cf293a281fe73d058af830aef9d87c0170fa790c7bec95eee2595f64471993171aba06dc0180a89a2e29ddb6674d1054186e82d20d4f8164e164b078ed49772b78080cd5b955ae49f7bcdae20e45320a4be59874e7f591a37b46303563e99274777271316c9006d44737d20811ad68ff462d7cab94318d33e936fa4cb07d1a5c3d490c72e7e411e18f0647400decf95bc540b27702313aaa60c21c28c608930ebf40d629b7608a4fdd962fe78017f0fb0bd367ff2b258af13bc4d1e0b7d625c90d0213cfeaa9331ca72a1bc70c910deb150c0f5574d10324b6c5b09156eca40582bec81027ca271e4b21d1af2a4585b337042a3ca8b8cc7da9d808051db1ee8aa1c938894e54e2d9e2563d4a59d467e2a8a357293884617148c947c58a7464ccc57470228e7deef8e70146530069aa49fa23975f9055aa6b735a27ce4bdb0783afa24a4adfa493e1543ce6a567aff2226ff3b6541860ca091171a33b7ca9f4df459e8903ff845a9fa4d87243810d57d7ffada6bb8f24d247cbb36db877df7bda28ead8721b3ddfe147185140a8e9980631625bcfd8e55893d103a32e0adbc6877e28a3aac50bc0e86c65378cd44e0d240f4b78566d92f83eb0992e984cbc4f286aaacca4d6dfae22dfbc0f543425fbc903478dbab3343fdff9a94336f154c06127f43db2c87d3b0aa52e3b20639132b56bf01d871ef98df05966afe3cb60c99d0b4c785c53480e5c6d5bd3ed563525cab0e6ef924a158f2eff7a27323fe8def7763762a41d9b92c8f5eece23cb596efb5683a44bd490cabeed49e87ffac64e245a3e310e50547fa21a2922e67ea2dcbb9df44828a9af319771338945b16816bc0cc70a2d8ebc166d4ede75ed2028af56841e943da9e4d0d5dbc7520bae4c0de828773fb53cfa4ac80d920e1ef9db2216fbe7dfd15777833e24c35e9f8a8d13bf9e11e8427e5d2c791662e4c930a6f22f54e68538cb310bf2f85de14b76f7d2072a4af3fb17c5f4d2184ab904ffaf6353615e06ecf0c4c83efa8fbf4bcc6e40328abaf1403c7885a5dab800f2083f4e7a0d415bcb8101e82050a2f3329c82a3ea96e98888330d5e9dad3926189c03e8cea2f5283ef6a17c8dd2e40c8b328a12981b867596143b095abb6203141e85c623d48a67ca8107ddb7b3278d4aa0d9e2618f7d9edcfebc594d5c8045e8e49668895f1b1f54feb519a6d3d2cccc4e8238bdc354c92db4078995de9c5ce02d49f608516c7c4b4537a2986db55369f12b72b4a5114139829fcbf10f08b777b494fbe7b5fc6c8c11f4758cec291b9905d25ed3863514fc80470f0f82f129bfe88c28fcec4333686526f389f26cea3a525fe887cea7cd5d4a70d44d076711067639138539097b5af5161f67cde416e75ce085285474e485d1d59e2d003bd3c778a78b023c7b1387097dfdbcfd6625f16e435748c521ea2a4f452de0dcc18bde63533bb837fd213265c38f953ff8fdee911abbbfdaef2df8f5de6bd9f76f56fd72f1f2398b9aecac4e32e2f79541ffdef3105fd5b296705b925af93376a68972bd882ee81e3f4ffbf60c1aeca6743664f0ee5133fb38472a6c39f6317835e28ace65e7474e99465bc0c235819ab61ae6445fffd0159f2bf11da187ed9c9cc87fe10b67319fa6bfdf630602860985ad4784a18c9a36ff3f52a61ae28b21c9feb6a81e05085eee3d8c6cb9cf893636e5d1fc44664b55f1005f35b4eb9ec3ab93c4a6c01926c85899d17a437b7c7bd745fa2d36775c80597d43845884747f52720bbd4d9ab2129b120fb5d222908af7c17c68453bef0544646bc9b52492b6d7851837ddb1982d42c6a8a0a735b8a6ad9ee4e346bec0143619dfc1194860ad9861a8d5a477558952781b84481085e6be1765160240e26137f9fc3ab7fa7f745cbd8e9f97561953a9c02f9fc2d6a3c264e2096479106d956a69088c54d11655246cd93e12d4b810c33d930d9524926309874200a913b1c2755119f3461b39fdafd86d726887a8b0218c84cd78b716a55e10ff5764990d0870a58df4a8ac99ce847e9d9b5a61d1eace785f2280f460481a9501aff644c28660c685ed057d65f7465504273d4eaa5b3864439f23b1cad7489e5dff0cd567244eb0e49c23141047e6336dd1046bef4ff17e949168a21df1453a62a2101b179e2fa1acbd5474548fab837d4704d8328ac181b4b37f4e491b9d6c6821578fab7807c8d78642eb09535ddf778dbf7e3c1a8174a7fd3c86f90547da5004f371dc794a1f6cbae88effca0a6dc590d4c3f4b31c245e40e4d401aeb20609b41528bb8af929ba5bc4003972594b65571548e264a9af1f6eeb5c8722654d6d81b4a61aca5af2c42d5db597b8126a1276dc860342662f8228c1a0cd2f13c0709c6b8ec68e46f894ef28c775ee049d4daa253d8c78c2c2f77adaa869f68bf5c2b83826c181ae59b73954f131f4c3651d7ed0bb09d51f5893565574741a1c9e64394510d9c233b5128a06a76382daca3e18b778f8be8b2febfe94ed782f5baf445c41acb8a73a65ea98d8820823beac0a50afd1252a8641fcb8800c2e0694e185069929b9f8366450920591506b440b95ff6d931b818f6c8539c125a3032e493343c194fd5a506e7de9717fe8b43888d657d63bdfcee3bd19c3d021238c803899fa60d24e33b5c8263c434c44336a63a5b11713e9d748be5db1de927c7603757e127e912abd8fd42d3f9b6ddcb4ad2327462d1964cca8bbaa28ebc296a5de7746bdf516e82bf3065dc0c165457d3845258a6d819350495b2d3e3c303961eb8ff2460d9794845e5494f731c49940134a64fd5dd0a92958eb91ca13814d0c4ed78ec0004a581231438b66aa117291228abe2f585ccbf634e63516db435671f803ac3157005de9908284cf932fe373d18a8f0e0277312d5c806b4ab5f665153399fa7e1278f3d5a8eea451ed8c5d7d85fd4da9d70af5762b763caf15a1c0e7dae15779c285ceda55081391b4e35e224862593d219ec2d1835022a713958b709ccebbef3bd89e9d6111c6fe3a2e5c8d04e9485227396fe34fbacc317cb738451562f292a12ae42b106f7cccc1369990b95e5a84dad998e1c953177a40076759502d224128c2b9ea43c984ed1dfc09b6693dc2b4f1b8e399cb3dc1ceac3dbfad642a883023cea85913966618ae1648a35d4f4b292833e63449e42401fde88ccfb66100d462c9cee7ff211da2c09d26e453b499919936ee3493627ad430b2d9667016a6e94a65cc4c46a7d90235cf4a585bd552abcc841925b3b8b30b46e3cb7649c738f38228efd0747e7ebac029992b97c52654b26fd0cccae9e896c936025c1ccb9c4005ad5213ad1afcb13e97a60681bc50c0519bcf70a1c1dd77590a2b86788459a47f16a97909f78dc73770ae5de15a8364bcbc3e35b84a64e5e26d857daf71dbdfb5a55985579027e7a793593e393a33e22aa6959641305eb1227f43937b592886c52abd4eb294dfd22475b98e3a5b431ac678a2bb10f9967a02625250431087e5d13e4333f6c00add16799dd0f2943a1a68b032e7804d4ba4cdca1c2df58d927e122987c62091c633e33f5b133dda892b25ce8bfbfbb7520e77b4b6205a5cb0e79342f928f65420329477b4eb85c1d876368726573bd84d7d16c08351f793f935eb6fcc615d6d4472e7f6285f9d1727c6ef889301f3839c179a7da1159cf1ad7d3d4d576215e8152ec6fba631113dc69c03dcb95e9f8a06ea97f596dc9ce39658803a35eeda7880deda2eca4d81560dc0b80f943842fa54e81d78b2eb8285ee472368c3908e6c29a822421d6e434c8dac773a62e8237d5a99d2dff0fb1a805a08bc23bf9c737d53199a02e7f9ab6728433720fdefef05a79659f9798e8436fc634998a6bf77a0921268dec01a29e0ad821600066705cda322b0942b6a5fde571a61e0678d80ebd0908230757f6142129ac318509f59d04041249c505055e7d62698c7006d610f7572f6cb1a025124cff694152481f4a062a7435eb76759c4c8c60b0906bb8230e1addc5c45fa645e1b0543e1711ffbbec4468b207ac1ab1a20b54ff0e79a9412044469ed2fb5e1179d92e24be3dca770398f794f6f5ede03d79a7108771b1d886fa7a997b41cfddf52237610ebe1c029a8f89bb211554a488387298a3c21fb0d40c96909558920b2d0339e9ba249019ae390ffeb99b7cdab6d33a392de967400f7f024888ecbf1115b3033c948c52663a79e840bcb3cfbb1d20d631fd4ff50db0f3a745bf8a98c6edf330c72eae6f61b93ac97b93d6f55359ddaf76d3eda3906ae0e6ce2465a0818cb55ef155389602bc8e4757075e18b7269a264b321c00ef58f274f599a77127041754133c5891c58ca66c9e671e7f465a4bf7c027dd1f34182d9fb153816570f6f40e602cb2250039e5999424c738698471cde073df46a8173569c6db0076323ee137b5164db77c1a7acc560d77c9177401520fafa9413bac9e23154b274c6023399fcb301cf901099bfe0dda78f8fc8db75765d3a857e4bfc5cb79295cb13a7a8c654250f9d6cdbc7a326bc416eca002cbceb30f4529d9dc36d7ca90788174e5ff26af9a45764c0a9655f8d8dc8458c4b2af0a92d75f33a511554ad465cb3ecdfbd45eb2a5e91a2b74f51cd9983bf92bc2d32b3d4e034bab0479304e559e908305fa7add04b986404372cb39033d9a164695ddcabc884f72108b6d30239d4f8434e53527a7aa8a0c6536b86029bffb9228473df97462d41de9d5838d02f364d2240f2ff5046d4c611860c8bffecc35ba2550a2c447d14185bc09ae28bd59f2cd1969ae4d8ae010feab22a71f5dc4d3cdc5d424ef1393799ed5ba1f23e33cc93cece99bea6fb93f950b377abee6c80505f0cfd23acbaf5117fd54e5634e5bfa0a1f1208eee8dcd096706ac748005d7c64ae940dc7d72fcb849f142ca3fe936e72c84d4d521aea97dcbba3a74a099a8a8cffe0f45b52b09391413883eb161da7c38efe86989974d059c9f842a7b144f0e168349fc571ec2553d549f0de50ff478fe5ea0a24a0f106700e8f56ce22daeed89574087f7fa6b634673eb54980022c68aed03209c423a4cb53a81baec9e4b44f91bdae3006fcf61c9d661e4d9b342cb5a614a10a2d8fefd473c3ad56da07179083be44aca65bd15d999173aa933c1daa50258991f1cab2efa04cbaaa273c5584b6113f6016b8bdf79b8ce3e62fd28d540fcee28bdc640725b7ca1448d8fcb7571e30e91f5a6ba0b23fdded28858400f370178722f5fb70538ccf202e6beb26d81293227c3b651650ba9d8f2f3d61acade1fea2463b38971bae63298a6cb2ef4e84d9c8f21b2680d495cf2dae338cfcebcb3150ca238e2fa34173d5c6409bacf91eae00dc8c4a906e06f86a41ba571961e79634d0ddf4887f9f96d291e3da9aeac649266762213a347c88db941d3519249f661915bc24e82fcb0faabb0bb5ac30f83ca7f1e826e9828e7cc1bf480e710d66cdaf124e1bf8a214556ee67518131e4e7bd54527d50c3e1535cfc449e8f5a45768845093c60e9b9628c233c92bfc01747eb181a64d165776d0b22ee13418fbb1a172986b3a20a24dbe1165a637ad3e990f32a50ca8818493c062e1eb4c40a562ace5e5657cbe31424ec248815330ea675cc0a291ccdca40fcb5831a5b7fe5f2af6a52bad90ec2113d19569fdcc3ab1f045427462610610cc211b83e8cc62a3274dda7c07faecfe5a94a41686afca89513f265207470495e741b9aeae82690ea82c3c57d854766f0b825037652e87902eb676a0cff77cce229bbf0f5f9fed23aad95b55c13677ded6cf1be087137880e06bd0cf71b8ed39ea289a2329a98f48bc4c44d4c54061da9f21dbcb5776ae3bb7a4b7c0baae9ec94ece7ec8a7a8b80a19afea7da117b641964c94b9667717175754ac80d26002f3736e1482db3fc840a5da348cffe13308c22a43f4a11dcb9d0800af0b7c20d4640ec0b6cc2342af6490cf3017a6e518a198f1f2290b11ec50db7512961467c6fa9ec01e841a5b84fd1ae0abfa5e6992eff181899e142a1662e529f7a4b96c2aa121b97540aba5ef9cdd14346ad3c166c7bd18946a2fd8a2e6feea7e5238a2821dc0059b6078120b2f8cc6dfb65de819224593a4dd40cfa811a210f8073836ae4e1da694e72e342718e7dd355256323c11ba386bacc59ca502e401e3257f9c2e060ae047dcc4ab0325a6088708a6433a7fc00e2f0beb063b7578b381001a8a711a98a05dd2b591ecb05b464a073482db1fa11b49d2c68cf71825668a3ad87e2521673128cb306a815548d5e1ecbe66c0f74e426c55e1ecb0e12b48ad5e5b1a44b4280f10aea59d290e27059595e92088cd523fa2db62275624fff44773993fcd116cbde923274c58b0ab45e32c1546c034a158e6a5b30145ea503da7996d0e7ad34be5c6d5bb8cb595a4b27a6ce13003b19ce0bd01fe258834645ce122ae22511c5161d628bdcf0f801e33eb7bbde4ff37afda35e0ad72ffe8f269670e1bee17d834a7ffce22d3bc8de64cbbda54c29a5cd0683068306346421ef166a21168a21c68f6b70842ab696953f9439628c514a295329a47260be0ec373c498715877c55239b8fa67a91cecbf37dbdc5870dc8cb9c17f3e5755d908abfdb6b586bca687e8526ef69c150041507e45a66d69c2f9f29fdc04bed56ab558469eb59b80f06b3748e56b3fd3600ac71c2a9a48434b46488db33538f252fbe79459651a354e3885a8475388adc110f08f5262526ea80f3b15b4dfde533b50bf7d9cdae19f6ac76c55ffd9aafefd981fff07aa92406307744a6e668750ca47fde6eebb6973325bb1ea550c72a8e1004328575709872f0870021cb2f0828315e011c5ea2ae1d0831516ae6931238cc023acfc35e933c3a44fac4a9f137b29a7c4a4f499c9a86931238cc02b50c6cb74333191b24c37f33134326464cfbf71291c8ce2994c866518f3fa67c2180e4de09fd96233d8a20eafd96e2fc60c931ebb3119dbdd1d6bd9b1bbbdbb1ba63bef86114497c8ed5162324ab92b252633e93353aec6a1c2f82ea5e4dc93acb56024c7c86566d8cc30cf231789612d774a96f24377f795bbcdf5203d62188661f10a0cc364c4aec062160cc33029b12f24e65fb29c207ac430b98aa9ebc36b5ac76b5631468c433df699e3ac0ef73634d98732aa8e4dfe7ecaeb788b07c4f3693048bbc03630b02768ed058bfc30293b66e6f828c6e9be7df8f00192c2e19f0f12d02984da3239ce2eb2931455c8b0218a183728e151d49095e090430d798897542e7ac9e0f0030350a81728dde0440d99b5a2640316a6a2c5450e95f9aad790c3912d9d53dd38eb423ba523575653829c4471648601c81083f8d188961aa7a89186276a0cdaa1a3e1ec2a73d5abc94436654a1c894804612938e245415eb34a35b4acdcf080238c948ce0e086071021a186b0ea55cd902a90f88113c8c30fb6a042b3ba493ff052032b66c8c28a1c9470c08245d27ca6a25543a6a255b51857a8ff8186f3851c5c23d001ae1c1274d21a657cda3851a671c08fdfa790a08cfa55fd313f7bd487ab1b9c4a617ef6d9e4388e7bcfe9e7487051ae598eece79c9aa6693eab99fdcc661735962dd89666052e622b9b73c3c9d628616b74cd987b394aedd63e7b02c2809a00cdd7be0423ba757e3f4d7ae6633f7f9a842a28a002592cf505ffe2a5fac854f91a90f50522a06e7ed38b64585307f303bbc5c2d23ef38f88e6a9fce5664212babdf64a4680e021b2ad2781f918ca53f9d7333f95fcf9cbc23e55f62c60d9639f4a3ef6cb6221fbf9f3fbc1c01030f0e243abc5ca3e955c96f6bdd7f8d70196401419b1921c3c3d0a68c8454c1e1134ec22958bee927f0c8df3d3386110f971510a09aac373baaee1efd81917a7d59d3776c7766e5eed0760c188d3eddedcedd47d77fb6777f7c605c70884b8bbb179cec8cc3122f18845cfc89c25c6e8ede8e87883ab78459432fa17af702eb6a5a9dba0968d3916a4ec97de8e8ed7fc40c71b5cc5ff188966dcd238f1080c74a87119290284225b106088224e45b21079d2220376a40b1aaca06c60ca860021635ad18e6e51036ab5c56be3820a27451732c0be90a2b58ae08ea4b80a2353617e4f5061607e12a930325ca9300f238503a62b402af51bced4144d4d7d4c7d11414da5beb86a4aa9e5434dfdae004449b16d3475b3a9dbc7eda79724eaf67448ddbedbbc58aadb838db3495f0c31c56e4e0c153930e20b220b787531c4c58bae4ccd9ea8d9cf8c0b126c7183c5f12e1543610b2432cb22801a54fff954c593106d26af0ac39c161796640386618cdd4036d920a59472092c5a920829a1c54b1750aca0b224d960050d590d65862c0d01ac494fad17528d3f6fc4f5828b11473380410e929c205a22882d3ecf2cae1ae4e83a0d72185feaac68e8344eccbe307e3a4cb5205269542f6848690c61894ee188af56ab55e428c9155c38f1e2cac11169440a58b0558c5695115de934ceb2fc38c3801ad2744982290b23598a6accc2881a93862003e84ee6933927457129129465d1b8e0500336b9f81024776c119471118286a804e362c411d762cb0e2dba48cae504397486147772692207def1d4e4353bb9b84068c7109c3a224e4a337c914a32801758d440802050545da519ba0ce0896e759566d0a244b5ba4a3334e598814969062230f0efcf565d6f6babaea7daefbad5c398e83ed7908584d846ccaf8c671e388732f3f22fe77c42f40b79a96e128c2fe4275c2ca5eaf093da8c04887d3c8277016d905543a061ece91ccec2d33898098e3cb1836e6d79c2b21fa76c19f6d987e9c4784171c207c21996a19ef63bbd2bd49199b7f21ac6da6582262ac60082d228652c21b1262645998c22d98c61034f4e46f2d46234d1260a45050d5d028409456d44201ddd8004885ed24c9c4a07b93fb953739566299aaf30169723b99117c98d932104c4d0122a538e9870a9182ba80161f63c0df2c8fefb917d3c7aaef037ab071acefa537ff007e9d8c91a769e4a61fe8e6facc5afa381b6a22520e2487b47b96b8ff25ef02f3a2f1470a0d03930dfbfc5878109b30f39f662e488607edbfcd9f3ce87931f11a5edccac82f13ffcb587e1af3dc752f3b28f44f40b7a16cc47157fdd4cd7f46b2ba09d1419541745426713db3eaf4725102f3e225ea1eb6d6d6173767936085a4c4822b3f79af92808ec6f0efe52330cc3b22fdcefc06f7ce9c110eb8ed8bf2c22d4af07a3baa7ea9fb5bf393d100790e62b4b284ab08c208a96111c69ea8fd9dfb93144897bf8de434b69410d57df030dbb97122d980d70659a8ef10f7908480fb53044c92eaf0024862f08d78486eb14841fc837d72de58361c762a93868832cd4eaba2a46432ca12449c9fd8341dad81bfe06ec092ff8172f3bba55e5d780bde1da5e07ba4a4f05fff2e5cb97da5f03168c2ab8cb4f676f646dd6a921585986d2b0d3b0659f61588c40acd1b1280463be61e9004850595789071c146009edba4a3cdca0c30250578987293c18d5f07b8ba416282dedb3e4ea4a1e1ed7d5de4041c36deae17352da750f32ce32b8cfcfcf21013a122833aaf23659a0c7d688cf41a8dd3132a7a47b60d82cb4649bf99918638c3ed1fda36ec4b634616caaf2b7ce3e9084adc19f01fa518bd2b2d758d3b44c7bceb0d8621b581c32c5e2f45377b1a07c192f624af582f2851a477bf911091071282e699cf9dd854ccbf862c47c5e44bf229814d71f7b0b68b8efad103d1d373c14741a94361290e0cc1cf584f9974dcd999cc9005b835f3ec83632b7c1179996b49961a856a2cdec51dacc50dacc309436330cb54ccb0ff3a9df1ec59307745d4f4f4f4f4f4f4f99cc27e38bf18594c27ca1cdc77ddb3741d000314954326d8d661b315a557e7cb23596ee8dcb9f93d2ae7bf94bd953f9924a83724a95ccbb9bcdcfbc179c911a1c82ae8dec896d645f346a2eb6067ff1c9de7c91696fe44b25745a098c14c6bd029aa0303fe3e5c72316274eb1a07c39e38b465acc17dad0afd5cd2902a500e8ba19f12bcc179960d080c6f7efcf8be44fda715e94050909090909098983268a6addfc4c3ec641937e554013348c46ad2a3f1a21b9965e4c325b63a590b115e4394258f2a390e74496fca8240e7d2c8a4d362858edc7dffd5412908f3d0b8e7d404d7a16c85f7eaafd88b25f96fc653dfb11ed9837a605195e0bfa91f7145846c0c2753ab51ba10723f480668b369a9d95820842d0d09f78dcc96b4ad8010dbb656f1844a914e60ed8c5485cb4af255751d1f217c3021abad04e7b933b6571269dd76aa99b406f2667a55ec8012b21d085804cda096d8dd49c9476dd3fd8af55bffa1583d7c407e235d1998aa6a061bfac6c4e347a6d0dfe4e0ba5c2688a1a7f33f21c9a45a3ae24ac3cc799bc26fe9c9476dd3f08ae564c948a100410cfe9d7cbc90926323de938adb2803abfea406aa30353e3529eb3d8a1a01da0159b6c036324f6263e17f109ce4a7ddc44ddc87368c450a1fe5da917a35517fbe411f5efcf3e9992c0b252bf291eee1909fb908b7060518a28d3aa5cb492de6bf7b51d0150824d6e1ba7fa63f4f7e132fe7cb84ac21094fbc17ddcc17d5c887dfc2020e5730a07c7d40a42eac6defc622a05d48ed3e9612e770648ccc004b57db8da334002864bf5a76385d7c2b362df2f5f074f8fd4549ae6c3473e906725bc447e10b94d44aa0c2212878e704b57ba90daccbc165a537056290456aafc1b8db33ea8f25dd8c1098b949ec2812282c68a83bd0c8e2ca502f6330d764464fe3958056eb509c12a69c815133190f27584a046d91648849478108251015d25212521185816ba94e2b81e68ff2a0931a9d8af6f18c6428da3d2fe3114e771d8dca67c2e224a3db37e98c5bd4c0ac7fc28edbec33e1b50b56a50feb2745637b06f6713e1075a7fa0d8739dcf2d240d2a69500a3528352bf46bc8462b603a66a6d0551212aad86fbcc92859888d3c466a50be00aa501551ea97c53dcae3e9d1625640e3b1044d793dbc463ee7f98842c36daa12ca12757e412410277655f9233f062168b84ffb1d7d7808fb9529283666a6d99b1eb21f7d4e4add6d36a45bb338dcddbf0f40b32bd95a93d2676262626abd8c3c92e80ae1fcffff9f3c74f0c0e44f791a696664907037604c1d9fe051860e51c60892cd33e3d91926a349a49991e1646a68e641c9b0e2bb86a780523495d93c681f3a7662f849229c4f413334b403ddb523c4483bce42317ef3056f194e345c97cf8ecbe572b9a490cf8da741973b0d6e41c3e9e2a01df6666f76d9fc4960760d13dbb922ac18f4536d1f4f8ca7458f025ac40202e35371d1def4c3c0dc97d0033ae39391c105c5d88a3e1e0eaa28d58e50fbed53ede0df9e5f48155277baeba672506fcbc2c9c582f196a5793cd4200a6c834bb027f433d1fcb888461ba59a4341d3aa54f854fecc04658287ca5f68233343433a8310ff1ef9df4f93fd7afce3f7f32384a948912d32d4a7715a1c0edebdc0daa06117b64610ae2964ebc2deecd3b08d0bec09fbfb855bc57ef1eb582816317fa78f7eaacf1f3e5ba54a75ff1117ebae52e5a8ca67cfbe3b85a3b32cee0fecb97e347aae8ee8578e4a49daf863588f9f3f9583ab0f4c642a476318b61206dd1b8975330deeeeeeee763b4de7d90467409b06411bcf46468ee338ce9b7783a1eae158f2632592df0f0858d46b38994a01e3662a076bac699a37350fb5715b2a7aa738b5198cf0054fe3540ecea3810395ca81550e47f584ea0ed55d9f7dbdbe70a91c5db9bd49e5f0caed8d4771c0487130606052746fd893c1d1e58895c66c31a8989898182d26262666c6c46431588c8c311ed3311c7302bfd8c50cf38446514336e2a1d496cd07206088edb3623cab8028a80ba7a7713819266e18b8f2689c6f4229527f884151a4d07c94204f9e2821c5b69cb9a0092b4840b97b70c5513061b27df49db3bbce93a06d65a3fb1d25879928534cf041fb2c15666ef6d2ddfbab06757a1ba73b7e389d7a7737b66f9ba0057dbd48e04e9d3a75ead4977a0f9c301a5a52d42038a345431eda6716d72747c4a7c9556471c2a589cb15c58997902926f880fa2c158ef254c3a74bd35788c0fbeb4a297d77e3faee7e3dfb294a09ba27ed966977386b0e58e065e7c60c1d68b82e1d3a74789d0e28ee2e82b8bbbbbb5f5ca675ce3f7ae156d9dd940b3c4629dbc4141d9d0f596989a61a3e85120528dddddd1d73772cce06fdf7c6bb2c8d954d83fbdd206f3bb3733132d6e43b8e8a7083b92ba0fc73ce39a70735f161cb8a4667db2fbf95ced3689075a46c273c8912585c477614bfbb45a8abe4a40b126c9c34dc3e3831738f06f97d70f5f1e17e0f1f3e5cd0d91b7eae09ede183db6edab4695d274772024ce5e70f003f9290cd86ab2c450a17b91e9888a0438cbcb8ffc18ccf04e59e8d836dd7e5f4fef7864a7bd8a250d73d46667e0c8b8286ab1d5f89c2737431f624185058517612d0fdd5f2036b4728818222e2729520690853e4c95a8aa281aeb866239818824a08945c69024915282aa65eb3cfde8c42775775f7bb068ba06b43164e51fc553d9fe09947d2753c14c5a1788009e7c46c2b3498f1a8c094ca39ee72a171f6092447955f5d7a340eadccad2a4f20d95243bea18519ba204de1691c6e41e5dff53929f51b0d12cd5fc5b430c405f2573ea2418dd3534087a2108edc5d623724e6ee2ee5638ca57030f67247e28e64ce22a8ff7f838d6152a83f867dc488e66373ce1857f06a7a31755d47b4f1f4c47f148ac79c3c3c5e3d0db644794124cfc67ddb1666af6def1e797ad9164476332fc398962512ebe1c2d7e8f9e8ae9bf3eb71a3c5850665d6c37d9cab2138d3a0fc3ace5eca28d4ff553bfcb3cf9a48fbe8691a57d983cb85246bec065b92b610996982020a8dd31f3d09e5e6666460cd38a9410d6d666823115aad5641336040436e794f31826469fe6ab55aedcdaaae68cc0f5ce980ab07e90c82814fc4cb781a3df6b71f44dd403f05ada599a56e0a0dbb89441123468e8a1c0d79e9ffd93ec8d6e0efe7c0720ed0a2096d203e9e0f8fc70edbe8a0da3bd9cf148e2835ef9be1ec695a8a086ac842362d90866090bd41816d70604fe86f4d0b7a544316a2c12d579cdc9091274f505f3c61c26408131f5e0d2ecc0be8d72a3289155ee136c5cdc1beae03f766569bc69993c77baffb81c61ccf1e11f68bbd7fcd7a57b520e857285f549957a50d7612342b92e4430d509200a19ad0cb01326308fd979ca67d7326314b46d33c63b5d7467be34e360b1115435328b122d4519efc3d07e6b51ffddb6bbfed0dba7dabd0bf793d1af427a18924a954654b65a52a5dbad544b0df9e7a305ebb521e6aa2e69ca86ddb8c3a339a935277327ad0c948a7ce18427b66764e7376dd3f08ae56298f480af56d3427a55df7afad3414aa7bd25ce9289bb398b795ea0d45f57602c6f64e1fc6c873603c877eeb35309e4e08528db37d1e6e40088c944783609bf6dded2814aa67f6bd4429c95dbaa687e74c963b35e8de46d597696ffadd488605fdfcdb8c21df0f9056cb63f3c72bbc6373de6b74f0146b65bef6bc537fec07c16ac45e9b3888b26d93d8172e5663cc767fdf3518d03ae3ea5cd1073dcca3c10e2af47ba401bf0f08743ffcb8bfa908ec77e353edf874b8c2d54cbc22290906f47f65a48c0da5734257980ebf12164b4cc2201ec64fa741ef874c413ea603f641bc4af9d9476fbf5583197ff9f2e54b10af1c0601f9e964afe3ada47f343a67fe8d95ce8e4605c90674ca84fcdd395b4d7ff71678b6c68ceacf23dc205477ff95e76c1f2b995f94b287c7c7f341a1fd27a8d28b51a5b74b489654e96d7553bb37b2ab52feacf263ca5ddce3c6dcf3afb6c68ccaafb33524144e705f0cdbb75e83fa580814a2a4fee8f7d98c6be6bf59669dab95484a438ab817b2f5fc0889939b3b78da41465da52737d84149294992ec411ba4f7424370b9719669869716297a9c148df3ae55f73abc867f7d76097c2574a7174e15fc4b5d50872ff9cb2964ca2ed5ddddf1812f35fc69d5fdb80abae8d75daa1493d1578809932f5f5adedddddd9ff6a8466d956e8f8d5a4dfbeeb92f1eca300c23e6a373c2501a44560d45436b9e0685a0daf7a980a23e5c0939aa3fb42851da2729d79e5909b51feb2fd4deb5cdb25578f36db291826a2d8b14b8fa2f14285d52529ea4a43cd12289249ee8d2c4d2d258c9501aee2bba0e349c759bb33f206ba571c23929dd710ffc81f21361cfafcad1771f6c20e857a41454f9cde840c30eabc293199c407a6bcca8b1f6f311b5e75c7d50fa7df40616e7c7829da385ac038a66a95dcd7c41ff8e42b9621f0cf10b7d364b8dcf9a4fa4b1eb86b74383d0b75016640213c8c8ec1eb19732945232b38c531e716c7759d37380809a00654f81eca380fcaa3032fae7de70f4ecb47f2b30b30068a0fb11e8df0f05546a0876529c862a55765f3c7834b83c1adce769707757fe569b06b7f31aafd9d75e40bfbf705d2b2846825acccc2c9955df2da9115d59798286da5f1bb1f7d0f323a4e74748ef7e1c04ef0a614dec8b086145212cd5673df1e5f7133beff66e2a5c5b2af69bc4e54a9dbfbf836b2583515ad92589b667ec53fdf601a558d83ef5a90f889b5fa722807d60830cce5feda7170aa9a1f6a86deaeaeeee0b3f2108e67ae033f13fb29fff237b08ec6826557e33a9f2db3ef3683a677b17ba66f6d042c37dcd6c57270e7a784a32425d2514e4b0bcdb02ca7533b804e599066bd720af409edf1f00196cc006a7084f34039bd3c2fad81a5cf931b038d10651962455dea6ba5d2a7f0536c747f658d095e734c19e2bf77eac2d53d897419ca05ca5122ace2dd719f639b22f7bc9adfcdc23f27cba867b40df091535d4910197989d6de1bdd2c44e287f051a87824ddc6ecb8f908406a8fda1571b209f90f168b0f7b5e2b1e113da3d1a0dead8b08d04ec09fd08c09e5731a0a83a27a5fc3d8f5461bfac9edec67e56ece3b9c1b59253583e494a8202a5698b1042114350ba326504fdbbbbaca40b13264aaa50a7d6feb033298defef1f90d7ac8a05195f7ecbda9517d2ee419d9d16dd8dceb4caa2a32d550175a13852523718fe905570a4a4822e5e18cc0b6630fe19ce9959b675f78f20723d7cecb7e6b01f52ca7010ab7f22848c0f50647c80a2a4944489a5244bfe5c8f80c2748416a10a0ae84f038b653f9ffd1f3e8ba5fafbecfba781c552fb53450985727f74f78695800285092682824aa8abb484117fc1822d4f9858efa44b19dd37c77f7fd0cdd05ed6c90cea1ae999f891e5ade195df8ddce539f15f04959f1da9b22fb514d82f5569d506d45daa61a8ee60e4853f7b8b880921a0404dfa81e2cf0f9bc90b1afafcecbde51ee439254041819af4641f1f0828eb57f64c2a16a26abf9f263dd8c7e79ef8fdfc3451f1c49fc0b2a2b601c58f5bcf3df60179150bfef1e30784bdefa77e59d293f1531fd0fc38bf75a075e2b2f1901050931eedb1073202d23e36f21a1ed201ea63232ed8a7da4f4581f9d8f764af7d3f4df6b517c2eaaf67fea878522f84c57d13150f50931ed473a5c04f10b3b09f8159d803a154fbc1d0335ffb7e7a780dff0496e5e3e535ec427db84da9cfc96bb2af5b5e93cd07dabe16c21ea5f1872d5419fb80fce7a7daeccb1e7b1632ec81e4671f0b1890d7ecd74b610fa528e0ef4abc865b3ee42da45ef29ceea55e1687def21a969605fd1a7aab72f7521f35c84b6dd420ff26a49b0a4d71bd76f77f47c78d0697bf30e2a8fa57c6f622e8462d647e75ec34b87fa5f2f7f2224992224746a4808179b98290b06dc9d6d86609d6060a3bbf79a8a75e5f714531c462c2a47154dc6fddfe432ec291eacd9be12f64241aff16c2c9698855a4c4941a32d2875cc4b193cd0940d3efa618bf947ecca7da3ee637a0dba8440ff6243154340300000aa314000020100c064422b150389e29d2247b14000a73864c805234944643591224318c428818420c308400600c101a1ada2600cfb45151019851a3f4ca9642e3cbc9e9e230c410bddca5922151eb6290133dc8040710390dfa9d5f2ee64468b80d7bbbf9b50c6a5f8db9db7bc1bcdb5b99a8ab1417d21efb8839dd7eef530afce31d0b0d48aba7fd31c98afc201dd4ad87cf68586ae87da0b73c0051f036bce1c9f10bb9d9ca75d0a548cfc2f04b21e143bb30cbabc158702965b9984b789d054b0fe099a6802f25f61e62abbcaea765bbdc3e6cbcc26b135de1d173f2bf57e8fc0fd30dfe28c902297d465cd2c6071cc1711a58b54da2af8dcd35eff98c8983a40eba74339db4b835795e46ed6de5bf7680a20161c46f356cd46ec6ace0e307005ee094ef35939c959e05e7502ed346a00d948eb664b84ea0fd76602d2c4df7c0c0e85432409a2e4ff07d3efac79862deae4ae6633d0f8980bedf9e1d6d4f3f185b9bec6e75b0a20ac2292149b94301ff592d1152560019f0896466a9bc403f9a3a599624420d5414ebcbb4642be8297680a4394efa251dbb909bfb856a465519e302c1d58c73c26f1cd072508acb8e4f6c0de5976b654bc022c0bf059154ec50115f6a43a7fe5d5c351cc885a1c8a568492fc6688f56678ff62d926b0cd78a9db13e0437b320f81ae1533d5d9f233600ba074ebb18800db48727f031e718641a090c8c3051827e9e649f29567b897d1d03dbb5b1bda355624c9becb19a793a07af76844b36b903f3eed7d13bc65189837eb28f5a6ff06a5ae00af533206d9a0b10e636db6ea0df0585da3706480490c8821838ff5b65cac4af862f75ab69fb17df951268f7ace8eca935978cab224883c18b96d60c48f77c51cbd60b0d162becee62040fe7e8f281813cd569aee986fa4a2abdcd66322ea8891ed04b10f5ace5e7bdad198ddafd2634dac9fcbd12c25e01de377a1280ad60b6d78717668c492518025b6363f5666e28537bc547ce8f0b61814684452c48ad1b77e60a60f81578d9710730185fcd868486b2977a5b38bab058db322207ff6c23a064ce0472356f9fb72e5d0769ce2d49b3690636f2adb9e9937e03fbeef0207049a13003c28153d0762e5eb25e380af784f8966daf63e9870d52d2787c02fac858b4c47d6105379ae144801d963e187d1cddfca6730e8bdc4a816e28752552286f7d182c57429cfdc376ef3d673a9e8e43080a275dba9512541f6c2c8bdb9bc08e030479e366609660917d9dc516f60c1694faba7be3b49eed38f89322139d6bbf14204b46ed3c8c0477000be3d3e3a8529c1983019e5b87b7362baee849a4e7bc9e5798c2979f3909288113db26d78ad91258c30585b7fd390efa1a9ae0ca5af938e648e1a06021a961ea51a796e5c29a0eda16a72c8b298aad7af5badfb3dba5fd94f5da8ee00ea751e8675a6180e552e03d9f01cd087876a7bcaa3266fc40f652ff305dc5cb87b22b7f6f32c7d0a69ed5d56baf6924935c72733ec42e7a5342072a5e0c7977645060151b4ebf484ef608807c17baae0cce493f20bd65f20f3d00cd5857f5584a05863760897937d0b04f8ea5d85cf263fe26341e0d0896fcd69d58dbb6ff00514d4cb0ad7cdeaa005bde134efe0862e7ae15dfab73e63d81905206e6363ba1a3475e15bc721bc90e92568481d88b641266488435d6d3dde216eed4fdf199359e04c5ae0dbdf5c3a50de72f2f452cba382b003b584abaab53659757b51f6ccebe345a9ee57ac148f806c0f7a4b386e32a765651a45d14b7405708a8d8c7114db2b1e13cca7e9ed21d465256c6c1a6d0143bbdb3600287fac95b9d13b4cc504ab3e4e5d97d5fd028ae8a92557592f2012afe7990db1b9ee1bca96ede4d3c4bbdec8c979ce08569112729833c93d108d91b7e0212ff9f2e484f03d297edf234fbb4f1833a5628b9a1add0ce938bf5b50b1399b8341c17ef00520c6a10bcdb878826bac303a286e00be168961dcc83115f5d1eff3521c85569ea590cb4da5eff5c2ccff80546487f15e8d6dedf2a81c60aa8e103466dc75bf52c691f731dbbeb9044ffe12da857b36d23007136e7b24f1d3db28db579c0470ca200692ac2a3bbb79abf16aa53d97c3d4b2dcff097bf68563d9dd21be546e641da3c60689db8417fa5fc6aead8d4484fea1c55ab3a2b24b851752fcd4e74ce7473d036ef03a3df503c2947de0983e82648e7c9685b37f8d246ec786157689df0362f91b6887737efb7f4acea4707cae198add6e9e176aae46c956fd416bdf44e8d4ef0c1415bd8e305e8c3b52603186061dac74f078d86f0cefad81b6524dc9e89cde71bcf73ad0db24c805349958a17922452adefce8cdddaa0eb1f553b006e6d8825a41760241c8f45e6805cf5aebb45000187fc99f2c91879aedafd7a8eaeab9db19ae57a65fb9ace508b8253a279d96fdd3dfdcc9ddfa85e0a7fb57112417d9e741625f337ce2a6569362e8f87e159952ccf799783c830d5199443e66c30e0fc95acb1b431a30ae451a56c94e98039899d9f2ea24598cc7b3f6d363a5b6248425be3c213165574a24b8c867a3dc4b43643410a826568a0e1891131b22f42006136368ad666e5d429a28e46473f157e98374559d29223b4a5314c4072e1a8b0080c1c1073a484f09504e8f30264ab5c5c1edc05d8e2f9fbcd4b86be5b6774dbf3bf3c10c51705cde0ccfe45f19c056288801e5768da31fb4d112fb4a0a827164d33526bad5c4a38d966731f36d792f3636c50267a092c5f52150b665896f1941f2d2a6aea15033805ea2465fafdfa94d2450d4acfb45e6c91bc48c2807b50da164cca7d848e8211656ab39d15febff3678c214ae11201b4beb9ae8b5f075b4e17a0b08f1ecef2dc53624743e20eaf33da156f216532f64a4dfda7e2f98be5241c96426e9a4dfc500dce2f202e276d59ed82002528555407d9a8b216d7db0e4c79621cc76579e6cc7ac2e8ddbdf2c1aaf8f263f0002b0410a50cdda8eaee3fe413c1d5ff6c8b55666e6de9947c21b952d650f112abb16af715c9b3525a59415724ac4fd808fdef64de05d91f43a10a36da60d2e847e3694f82686c174a00c84de0207f9ba02d20b1e73dd60fd645372245041c0be35f37a46cc77b83240f882950a6912e1be9de86b355c99d87d880cbeea3426c06ec937927c65f4edf5ed52dc224a3d280714ecb67490569c92db668bb78c7ce42e41e16f28089611362e5ae459d1f105d11947dee239fcc91350de0e42946e0f202308a80445749decebaa4a7c13f634acf318b3b0a74327ef2f7890a40162969c29ed09152804966498ada0e7cc6c2d3c6345647c6f8ec41093c7e30b0022ae3111e80efeae238fd5eb426c3c2cf35f81fcf370fb93155754fe8763d7d32880ce330beefeacc904feb219491e1845e96a950e2523a9e6f5229aa90132d071b8b1e9cba1e29d56fdaca15c0b940731a31176ffcf6f9c3ace50877b5f3e2eead764a2b447442af776799df1092c83f7bf9b561783321e18ff9c82fa043b7067a06a1a7cbeb3a534bf9424a8cd89ebfd375ddab26c0a932800dd0000d53d4ccafc649d8ebcce4a54fad78fbed1f4616ca5b16100def77b8107b14ab05fcfac65f23d81abd3e9a2ce180e3c10bf60352d6b1b460857c52c3210baee9715b94b39ecd3c97e95f5e3dd2d7babb1e6c4eec7fed7c6fa55d5c8b5d615314ef9e36c6c34427e5a7e8fafbc99343030489ba20af84c7c3fae2cff247a234afa1f9592ded8203578b1f80eff5c3a07be6d3c0a94131fb4c10571c8379d0d422eb743a993848abd36accd3ed0629e262279b3950f20061cf3d99d8afb7c0918cf1a045cbb793b1608205c52ab32cb6a89361319f3bbd6b1fb330595552ae19954b7fca5433bc9e413ef398e41ac00e08c220f8b58eea709e4b90f8829b4287a2c770dedff1278a6ec97d1900e3c3e84e35db91841e11c3693f44e867f51c2188968a1a79d24aa8e41ea4ec0b9e6c9080922e1b75d8d3f00dd21cb468cc23204180659cfe07812fa7b171800367e00fae60590120ffba117dbaff94556f5f7dbdf5fd126e3cb1fef00c8893c4f60138f6863fc4278f089e247add297f86dcf4aa5fb0156196639901e183074eda75efe1c40b5a87f289f2e6a21c6213a8083369a1f835b74d6c8741eff024e7f1852c0ed554881327236c7b04e18d495a8e99cb22289207518d8d36e1b0f98522f4b376f0b30cdb1bb326f77ebd949bf354d052a1e52dabb3d0846d2f12ec85e44b32afdc50b8ef43e4661ee4f8189009517b98033f8fba3e58155fa77605fef0a0a04d5ae9224236d0c5228c695a48a67eb09d0c5a998bd281da0115c50d438f19331b42e51210506418e64064d11d10700c5bf87aed1e270e2b65052e98ddb6caa101c20b1a9f57c880435a6cf0a3ffea5c83694f2bdf6caf32e183a2b344ed92d9a54fbbc2d605a78edbc3bfa02b57da010fd9725b69f3863d0a28fa9f17ae66acfe5240d072e48bef1426f375c6d6875d0ce3c044eec0daf61dcab54aa04cd44f97fba40d4d88f30ccd08f26d24db57050c640687a9a199ccb1c2fe058325a4b9b43b3860c6abb49a6f85d4f6751f25fde8eef2241c31844c4bc36a2fa1f3e5867929f37684c1d14abf247ff53b1edc8507c0ff76464b68db3c12c3b5889fcfec2a47d0a35185a9615f8c8be63c95a7aff06f8f3318e5a2141746d8d41363251c386f09f4daa7a391f2e4c1a82583f4cbc73e9d5de5271786e73b2e277bb63d4a27633c902c7810eca6c2db134463b2ef38b21749c708e2d949157d97a645b792db50f23e0969064bba67dcb2ceb7d5aae4dbd60aa3097d979d361341146a7d343b42e51dbbebaa4eadbc21ce0f2815097cb0508c9e3ed6d8fb692d466bfc1edf1b2758e11f00acb397041d9f910aa401c476738145d8e2da15821c87acc3d95589fd293beca5bb9fcd1eea4cbec0db7de335e5fb5249b89a1688d9c40dd884bda315a1e55bfcc5bfb9370a17476765596d25dda2f889b8bc66868d209fc8638e415f0cada750ea232c6a793aa64e38c0d49a7412fe9948f31f867a0e98c026ba719eecd328b73c1f954f0b63085971cc1823be1ef9148c41c38777fa21b1ed374064aac6778a8a9e3dab4755928af5025237ff98b89661366bd702e2f70be7d67a4608828d86154271f9349b02751e0030a4711abdb4799d80bc9b34527baa6a58de8a1bff5e7fcbb71c505560c6e70bcf5c58642045794b7e85fccf924caf469f2e83dbd4dce90588ead3606c12afd46c1b6587ac8aecef66136370eaac6fbf9142d344448c9fa7f29a44320d8f3655847c06feef6d65a2a26bdc25cb2081eb7f98bb3f9feab89c6bee2c457c315e5d4b0c80c5e94b94ce295a31990d6a18b9b4fa550c82f1490a437ce3c90f3ddaca51e892411f7a4eb3648cd332b2f81a68b7a60a87879997d748887d5dd3a6a6578a98e8bc3eeb78b9e40544a4dfbbe2903ec7bc879f51b00e33e5b59defa5adc3aa39e668aadfc08b42daa5209dab4b9dba5d98c6a3f12e00a3c5b455d1506e110050a15f135e06790fb49cc5259a9eb616e600c4d27a279d6ec272f4b73b5a4f8165c2350523a1e0aa69ffff57e54147216c7ee780a0072513c430a29a1ec5ca7cf4ebb8e4595162380a0f77861316828ca47374cd61e3393b36e40f7c9e5111ac710ccf0bd6b0815061820adee301768752f0a759cb219343416fabc042357fd143dda81774a865dba41904349eda712121c5ded7ef5fcd131952c3d016775cb5b61593625aba23d041568d31cc7d4132f8fd644770a4a5fc9deb28d073f225a8ee7534701ba3d240c7a6605cbfd8155b27fc6799a4e1239e29cf110db55ce5e20b38c33b3adb49987dac8a5b877f7d067cbf721d7073879347270a528733971e87ef318d3386de7a77a87a212648f2fd6778de2988508bd9f4f2d99ef9a3f461229aa1d3aeb46581ec0f2ffe2ceb08878dd9c599a5b25fd13a57e698c332135f3707b5b9d64a0da08eae159bc9d605b683f6802bcfef7fab771cad584cae63fdbf9521db0e066432d8e7f17685e5f6fe92abe10fdde2151d0d2321c2a8148d10ff4138f63fb9b1c862c5f2afa6221472d14db06f9770028c9007c426e18658c24f6f4cbd06fbd1a5182c920c6cc4a2a2631fa4ddabd21e786ccb3215e87f24dc2c3159c693afca6416cb3168fb200029b728a23549635c8a8943b69ea89a113f57a448ac548c1dfbc747c8b75d888451a660a47e1c9278fbc5dbab6e843918d788c66ec634af895925d9522e9a060463197d5d80613841827bcc22d714c8643ddd12991da40d766314511d420743b59187815e1b06e63caacb6f673a944b781ae9d95cce0a684611d70e86428c421fa6134e00efab882b4e6e468b2018f6d59be986a198225ad01d20ae21a42d6006f5cd7ae06f67edd443201c274e99e0099bbc47c022ba01c6d8969872a5183c58397558e008ada6ee4ea3e4b80d9285eb390111fbd2a773d5e487d08a0748b5848240edae13de2db1dd3f0a7d01d8a962217a92003db2046e706ad27962f9f8fbc141aef1caaad7de40778b8b757bca3c4d340befdd50aed43b7ac2e1613bb337982884b47f75ba9ea8fdcb1968f939b2ab90f8ddedbbe17d3f345dca2921695425eba9d61b48702f17395e32d24263299ea9a35de8c49fd6796ce5342f1a2d26300d90dc789e3679f4109e7d0fa9963be5cb048786ff5559c5596e040290f1eb6ad1f4df3f93a01dbcf4855514919c2cfb174cc4f03a1aa3dc2a1dede485b16ac3a9749b9420761dd2d70ceaf04f92daff4be6f03834cc0eff37b38177a171804000d5573e2b4ce5998fb296070879f9f4571e61c2ed78598559c5b217c3c7866ce52e5998655c679f43ecfbcd055ac48a81af2ba7d151d295eeb933caa58c9f508c9f86ed675ba20b5cc9e7352208f939a103ca2f164e658dd01fcca7524e5e963ec9ae2517be1f69ba3ccbe8df1f65e565197ff9552f1428b0ee1445f01177f28af03ca6f3434c120f04154990a0f91f1090e9a323f0bae498b91dca3f14eeca78f210d96303343ef4235037418a9f7fdd72cccfe850a6e4c47ca23e4eeb9b6cee1f83647781cce9277b4f41dc6b7793e2b27c4c8c186688da8d4ee1f81f44245a10577440406ed496edfb96ca23c636f75489334a81ea58c438270d60dc8b61b5fa2f0dc756fe9593e623bfcb8ccd5516c906f9672c51cd31cc452606ac662ac1fe2d65c18798f40895d1016b98bad17745099d8645c16016153c11673d1cc2d05d083b08061e66a5a25ca6c07bf782200aa82f36d6e282f4d6bb036938e819df0247060f27a08e80b0fb048c7aea39ef25874af96b7cca606731d2315ef4ffae78280016124b092bf0e00c6d94c98ffc9a9ee11b02bfa403c2a9896375a501464eefe342d519541cb33d807b0ac8036d5f6ccf85f09cd8f79ade7570b7bce9641edd35654c38c3cec3b67022c40152d6d00e8d340025f95bd64b0132ab2925c7929cc692b5fec458a2fdc3817b24876958cfcac8cd4d3afcf79de99652ae9719763e3c4ca6947711581a25062f8bab47dfc0b20c171db507f67df9a22f28ac5ef24552535891fe7fbea4ef15242b2c4ef31df3494dcd720c088bd2cca466198a44f03c2f4dcd9a782b3434cb044e5aaa0f7512ef3dd32d9537e098b55dd33c18de4f24f73f7af927bba3c7915e1fc93a38a5b9f9e993c1c9a17b257b86bf3077a547bdc40fc9474384b0b50d912523add5ecb54ab1fc1e48b7154a381f5203b700616d3a34796103d0c49eaa2864ec9e4b7203bb0a3a100bba733d18e1155619b09619ce756db14e6384d23c2b4764a401285b2cf1bfb32888a1077d0de9f047a9cad26f6fdda22c65b947c521f247367586ba46ce3a5c1ca6091c677e56a5e0b9af919179a6cf9366722dc779ad4458d5adf40f6f0671a3f78d54a2631a6abaa489f9603a82f4b31bf70738f1e64bace59ceae66640f46b6e3f25dc051177594cddb84063883d6c6e3ab2aa3e2f5bddb894a16b25c95970a630e6f2fe42b5c1f11901273876310693ca6e19ed77602a3842f1b2069c01bcb13b16ed80d0342bf3de0b05662dcd10da1f5092a38c5894639a0db6a0e62058b00c53abd56811f7cecf3927fbaac1804853a478ee0d1b52121110e52ab8f2ba79771c864de8a3526f5430ba4ee8decdb81d60bdea0181b56d91a6ffbbb4bf0442f1926b3e8e1e15e71005e8f1a20e27e35ea76cc162497604dfd9d0ed3b542ba8ead33dcd7b830e3ce1b12fd1f0353f1f45eea6d62a423502b9b364ffa6b92dc05bfd3ab1e0deaa79a2e42ecffc9d57647f1f3e01ff4a3a7499f8d863ec7a0593a0ea4d94efdfc5fbc38c996df201f174f0b32ff6e8af22446eb9c2002d4a7b30ac8c6c5d77052bba7ca078af639a39f8a470870e57bacdf51018363cff4233633e5490930d98ae9471750e915d0a456e7f60a3f6c646933333c5eec11aa345457c8517bbd13acadd4bc2773c03ec7652e80425c68e8ab97a357ee35312ed0474bdb5a1539cb22d8e10a87c70eefd8b9f26994e8b3a14fadf39450459e4ad2136e58c5bdd44a861db1d8892c10e1523774f8321dca50264f6fb5fc4578418546975e68332dc42d884e5965be52bc45272020dde40fa65a0f67add422dd70d25d3ed54a14c5618b7ad30beaeaf6d54b9cc6631ba176a3e7ae4c6d4f70a8e92f2b40493da63b7c37a98861d90f29a462a30f5e2c4a7ab9699b0d104b1aa8279e87831e51ee3bfafc1d3358cb9ea7e3694269954ec3e8705d42703d664722059c47c1bf837894ed15e247e23dd745e3d8397cb728204482bdb5c614de4692adef7110af2958dde7144e0d5fa696fed12354895d931765794e2e4c16eb89b5b2265444bd152914f62cea7c9330dcb37f9a0e32aa0a9ff651562924fee39bc24eef1e5189f7bf3efb3fa6ff27c0009890f2db33c298a22c0cf419e576a058afefc0a8fb3f9078cf344c58f8b063a683f833d2d2fbb057f0982b88a87d2b3155cc32223d1893dda8a207f46777e33bae1f58b6973325fb613fe57e8001bff08f219cdb20a9314de5bbea6225b1e781aaf796cef47c3e826c414ca71f0f85da08b7fdce7fcd7613823103f6a17f4a38a87e144163fd8aa5bfb6230ee684210bd70f3867ee4154505b74f00c62aba397d81e42bb492dbbe697de556dd1d33df7de63ad51e02ef888121854a850f93d9a222629591e19ffe309bdb1b9b9fd3eb25dc1df0e8491c19cd6ff40f2b2da332896c368eaaf581c83e8bffbe8416c86c6a6c34de30966865e927895d4b46b931f826cc11b94828737435dafa4f9558dd97b6fb0dbdeb7b71397c106de0b04edc022cf3dafde623e9f5481a6b7502697268fd49fbaa4fdce873991b553d36616614ad0a0ed37805522e4af6a952c397cb54294f4480fd3a06655c15d88f1f8c2612bc696f874a128f4ff25468d726ece0a80468e08a2bb16f9ec681365690b7461db8ffb4445adddfe973b19bad28fef28d812069e3c9a07c36698ac665c9a4f77c57fb7670f9279a8b6fb030739b53fadd4622d9323fe0254f06bb74c23982b0e2525db8b8d0a370cbb062570a2aa64c15210ba0bf5a19052dcb86ec6cd2936e927a013a45fb6914a3318c59041ef1d5ac6aa08b39c0d5bfb5cbc28ac0e7da844b0ccf03db957900f1952c60ccb413f53d801c15bec5d7678fc9f496bbf36cd20cd8068dba111307d93428b1ce410b3e2cdfdf5493d43a0b3a6881b0ee411a0b16e3a4e65350cdbbec972903ef25d18c8470b3b594044766593d887b211aebff1cfe9e2f022a56ec4fd6573a04938c9cc554569f3e8e8d391a8defc44bb3098a63dcc9595f43d73da9e0f41554fc9d7ddc23f1ca6bdfc60cd411ba7d8bc2c4ad05beb66e6eac530df71d59287b7ab247e52d74d27a61ce98a4aed40ade9eaafdc282a8e967e24043f299b5ef2705b5ca5c1b34707c75976d2b0a18b785b3388f8b6ca340a7d3d8a5f7ca1e40e7a370d48066eb8a0a36ec4fd854aabe6bdc8f7431bf22cf31fdc79192a4003ef0bf40c2c3f4bea46609293d7b0e3eb8065a5d3cef62c4dcf053f12c1a857e65bd9458605bbaf99a93b9d987accd003841a32cb60351735979967cfade3c2a8a69aea7e9a0788b2e779272ce4e359d2e5359086f79aa56417b722f375b3477af4d2fa2df811a15ca84e2a2bb0445a452e70df980a8746d658a442415ade9985ee34159d30fbe95817cd58b9b27c87a077b011e5e8b68602533556d20e4d9d057a46a697d79882911c99949fb1d659f521dc3263bcf4453dab3ff94c7d8b12bd81d17e22a144ddfa6b250d6efd11fc906b511fb5541083bff7c71929575ecd4d830a8eebf03a136ece40351c6b89c2ad14dd6413031c7ec8c5407604f4c3821b032b280914ee9be88a57ca953ba77e3c83884e912425ad2d8a15a73b8307a72e696634bfc6b74c8da6498bc9153e8aa15383694d045f325b0765c1ab48ee88558366e18d46010a3bfd5d7595f9944e2e0f39b2e02a2190069f3396bc04d66ea8ee1aa719047a175048150cc4ed6b8745d147f1b6dd266e896c5ea1e93b357087837864f3e88fdc98d4ece64b14a19736483e664f945cb0e38eaf0cb50af122620833064ff7fb307b6f06a494eb6056b4ab3ab84dd8698672deb25c390b0171d19ee6623e4f47b0a9e64b8e36fb3b1abc2210fdba6f3c94138f66720a85be5e025eeacfcb80d75eaa9918bbebd914f998b9c3ef581b465445cec8541b96ec4d9299156730a0bca221fb38421ad31a90bdee4b4a215fe8171f531900830a7209a245b3a6b8d02854410b06289263718fc6d08a492ee5b6a506985ed8138b7e00000c6f4b7ded35e6fcea4f614b8916161a588355a063061c242c0a5cac779cf927a3f88ded44efd55f142eb8be316649e3b7fdb029a23d638abb0f68358877423c6caed110e57a76a051c287f51b87000acad0344270991de63991ab3ade4738ecdf6bbf48eac914086397b7032f61f483d83f535ec19a4e4a5eb3bf6dcd1efc4ac50de291e9a8d2d3f99f6b812b855ef641ad9ac86a9ac6336929de869c9ca0b6e2bbccd1204dbcdbc8dfa470f4742d783a92513f4a0cfd22731ef3b0afd14fbf05b5329be949ee4e3fd5d76c59b5804127cc1ef2c7ddeba106b33858f2f62305dc5b75951c395f3bf0f1cd4d54251db70a39fc6b631065f70d83454f6b5517ea49055b491cb0ca561b16d0ad241057f02007426e8148d9d4669cc47f38e1948816e8457152d3b59a74b315772f5a11ae842ecd978b150c20f336f6226bf0367513ac98201ba2465b9e4745740f3e46a920a75cc052b69d0d41a42c46695c76210d748f57e889dd77c0706ccb7d629a946a12c7c21d560b273618333411114ac4e933bae43c063e86672463710b8b57b155f96b2a8fe0b7614e0f6cc8bc9d76a268328a94b5afdfd134d42c35e6e35c506cf7fecd518e311063c929cee93f701844925b80503fd58513058e7308ba981b98fe5e23ded26918d81137923b5dda76430e5eb6e7cbf53161a160770f28601873fc0c73dd7b843142ca56ea388d8673a8ce160f4908c60ef0b49d2489f225c84f3c208c0a8e719e201801c19205156fbcf6926a8d60cf69d1bd28f65f80893a0535b4023c25d713ce9be17e4c839505320c18c2835237fdb6cc5e124c766e659a17637c6dad1bac49ad6919c8b7a1318c687513f876386da7e77a99c001be4499642d9922ebd3a302cbaee4cf7f5a9bd322e5c5ac58ab0fd250d4ce4987bb213ab5c3e75f07fe0d540b6ebaa8b0f92bc6d84770def2ce2c1c905e4e545118fd15383b8c7ace311869db2e6d3ea488509ac157328547c8cd2e50c88fccc0340c00948899be0306ee576999e31c0607ce173cea4853fb765f444a0d753e47f63d7ea6be648c1bfcc60308abe7d862c68a1a90a87bec1b8b15ebe16128d346b6dfb03a1a7ba90477a3d81a3bf434a4790a5137e1c7ed64304d75e026467be2423121e955a87dfe82fedce59aa263baa83a1da5f83c2dcb51292e5fad1cf24a93472c58160964f139e3242db3f75ffe4eda4825c1bde6ebd7aa2b503bbaad18072ef1aee2932cb7c7d854b2f4499ecac1a921e40c8ffb8e6fff2450d2e3430eb9018f8c69f2dc707513cf522d5734d2acb91f150a9ea542e5daed3449809f8e76723154e3d0c76ee4a656d07df3bb452bfd872a270db53e5439706fb6ff2dd88c435bb113ca57f2ffe70d9fdcfdc41340ad89803bbaec959dfe9a32d8138f176793b6040cd4c54aea0a34525f18efc6523faa6b3ec7e4b39eb491441f6ca53e69613d3418002d92f9ece907b50f1a8e3fe1c77368d05887293770bc692b02640d9e6f36d47c00217f4d199fadf75066f2fac4bd3a836de016d9b669cbb31c41d05a5c8a00b9d69dd8d1c94ac1092b891b7aaaf62c2e7d22766841a3bebdf390fa669791f24559dedff72c32fcc9c97bb9b8b13445a2d4f76c6971daa55c2284c41851629b88fb113f138a6a5ff521b34a845eed5b2904e8f5ee2a2fffa07007ad637fa7519ca5a315b536c909aced28a720d6f2ad62ea4c7b48399d27a32a20bce288e8ea3228ce97967043e7e1e06295159ab85d7d805e01e86f312834bbdffa02a5ff2601a7b2459ea9f030eff49df6d3962580917863f2c89e32c66d68b940c424f894113aeebb6d3e857c71540ae5c9a0dd96c491c43295946ad467902f196103d54a33523529cbabb8b82c04a875546749a7a975320d0c201ee704dcb30e91890573fe6348a0d0f37f79badebef3cd1306fc4dbb7db1744aa045eceb66fa66bb2e171efacb4e1f0758fc77b6aadc819b1a7d94d389600384b3eb4946870b5f9680c28e6734d8111ab4dcab7e56511d375aec6001fa7dcea48c3236dbbb80836ab9b6b5b75f4ec4eebe3d2e8d64c5ead9e6c0e6d98c89f911de90ff118bb6e2039f0dbb55bc820fbf9b436071ae80ae64edf5d8cb85fdb7b7a0e21f02d24df941da8c5010b5a27db34681e704391d3b4d771d7ccb471a303a258955cf4cca0146459c903d21854a91373d06101419ee3b52976496710448db0ed5f4b557f670ed2cf5a763b790e18ee88a8e2aa86e03a07d564a394ca4d8c98bcb2f2c48b9903d9344c4432a9dca485a15277155bd38a0aa3dd34f3b5ec24580b8cea5c45b2469ab8ba6cfefe3e7e639082aec95ca0ecd616ab9774b83a099c0632b4fdc2a23210486dd1b6889c4825e3285e0672f88f93a3481ed4e0545b85fc4ca31a2c584a2b4b0fc27dafdc337ef604c5dccebf69acfd0763c6d1b26c665c0616dee4dee5d2d7b80cd332cf84586382824072d7c3a9a71cf02f3406b7f11cc2004822701108c4636aebf80d2f07e55b38331b4e496fc05eb00ae9370d33720da213a1dde48dc65c94eab29da2268a1eee83c5d6801fbf24152fec6033c4fc55bd14b56223d5c48da0e78559c6f6bb31bd2fed400bfd6da3311e96839a62a3527a9e1f616124751451bf8e77561693f0da1f0bd30dc005aadeec77d4070778f469ea4ba277d38c871a2b8312f4100bdc2dd7831bff46ad639741fb1eeb69bd2130c3a20afc0ea4867f04c80d112909834799749b25333a238a434fe1b9a947110d260bcbd01e80b69dfd408101180aa984e0a5f99f2f6e240e3e8584ab53766170d13100b7c95960d0cd37ba3c85cf48055414c57ff8f94df64caa0d624d36eac6d059f11ef76cff51755531ae9dc235fe0b3a55e3a852e73481159dfb1471ef6ea06f97cdbf859045ff4dd7a89c2014b4d4925b96179739f0724fcb445bc3296afdb13024f9eb54be0712671d94acbddd88a4d27850b90c1ac76a4c255a2aa611ca2d16c58a383f73f86c62b61ef2be35864f9bcaf1a08b9b89a7605b93e6edd011875e7ca6587ef6cd2305199a5c4030c6341e559ff7d4cc87a87085e69dc70c230ca46327e718189dcdee089f7f72581b61e314c3b376c3072d8e75de464420a86f7d64d8245916e3d71fa7b1021f1bb1815baf4f4ceb1eb87a8dc136f17a8130228f559f4637a94295e9d951f1e3ac48c1a9cdd9c26bd407b6ca7efb78206285b7b76eaf6518d2decee7d6895b3d28e6e2873a896b0bdb5b18aa822e68aa9d91f1f5a70c489d5e3b7dd6815adb6482a3e8861cfc9610c1569f967607e0b4685861e6cab162d4ccc78072c72fc86e6325a66168442461eb5dabe01979f07bfaf80db00b0109274506f0476588f7c150d3c6a377c2aff2e08a7b316efc89ddde2b8bbdf26ed0876f478fe224aaf9ff74e094834deb59bcd3bea1e64c7bffd439d85ba11a930c5d53843701821a772254eca30a85cd43052341e72d19c7ce1a6fb91ca23fd3001ab526c1b9c0ed518857d18bbc1e2caa0b0b3a35e6a7853ef283f2ae9a2572d1ceca57b3169313aab34cd6a8d920c2625458cac4d57df04e48bfc16f8b974e178909535e26b965ae2ca251c881a995c6fb6206cee30a49dfb6e91ef822780527430c5ade57c0572e37f43d6a86d6a62211061c1b27cfd824320963cea0bfdc0e6123ef780afe27f4c0b5a3472cae09a9d1bfd5855ca6c6b0e214f2a2dd0104b027b518356adfb12dbfda7772f26ce6f9c98f0e9d8ef19fa4ff34677a3d233c41c0fa424bfa7e34261c39156d7b7328100db7fd1f3242db62172e3371b2735ca7d4e67d2f3b98e04a0fd74b9fc3f555e3ccbd3d024bb482758fd9acf44c8d88bf73105031e162bdb9ef7c2f9c08ae7f771c32bd945a0550e17c00f8c66835e9d7970f9850eafd31107efc955143254bcc9a67ba36013176080185504228c705d0a4e6c7c8f2c1792c79163206efa5deab2ab97b2986c4d8248e0b1368ef585981b11045edb837d014d0110c64d9eb5d79cde7192ad70d86c1460063f80abbd69c944ec1ac1758e2bd239bc49429300054f4bb0368d0cb30213b36d14c4386892fe4d10f19d30e075074f12a507714a853bbadf4f633ee90dfe85fd7939185afc14ce7621cc87e178ac6b9622e61fc09d29554bb5186f23447d8a35e9d36f64b2a0390381677a4dabc577b6dfcd942772eec29d51e1ff351e4cb792a234694da0a8fa4804d0892f4ef24cfadcb93c767484cb52b912a7d4eb8417e19406fa99414cdb410836a53841fe26ef0fc68933af2a73170c7fed35108f01157df71dd1156ccaf6f7540613e8af39196dda838705d60f1ed1a1bd8ad7178cdfe6e9ddbafc2e61650aaec18fcec6193ef860ba31bc6af99761f5dcde3972e45ac3efb17952a1d7be1792b06dc11928f60b54d856538f41ddb6d57e24f53c19983b8518c97e321720cbacda5702f6cb194e83d0a5a3d2342d262767bb78535b96134196546d064c927bb91b50e7e708f01948ba39158744333d441b68cbcb14416788596ce5a2307638d3b4ee925298dfac9d96475727a8e26a7b950ca53242e88bef7dc34be4461c703953cc3c2fece071e8d8bd5a74ede4b271735394725c28f45a3671dfc136fbbd19b37e834663a272b8421fbfc15fbcef3d18a2cc8bb4e9d9e8cad0f9cc75450148377a698bb949a43fa5067270e6c3f55a5f79da08b0c4a9d0fe4445f82b37497837ead2dece261244d4535e765c6f9ba336fdecbd48c75966d0ebd207289dd62fbd4f0e531fa24bfc4791d8ed5174367a2e16a43840c6aad41e3b93e09691f9923283d1115a2b451efe8a527e8f89b1401dde5161eb0a87f676894ba5145f7bc8b2a2a08e69b940d3b9ddafa9659ff272874f1562a2619bd04f93fde11c9648779c592dea291be88ae8da90c6cba989d911d0ab05250118e56e56395f634c2e4d45bd78d936dbd70100252e56966554caa6e51021d605bd76edffd8f61fcd03606f2318f9a408d03a2605117e2591a326f317dff9872b30104391a0a4ad3f54cfa769f4974168cba0f82ba17041a8135633708a68b665e357e0ad0cd7b1caf45e84ab0f1736336d08a7808109210fc5ad9814c1796bd82db351a3e704b5f123fe9f8f9d30d5685d16f01ea9ad21ca79c214d0bccc97cd9556e2e8d94295bee1131524afcd01346b482f17e3be3be5a9d02c7d4dd9b9fbfd6edd86f65da6905c3f45425b8582ae89049297d46363b7f0a544f80f14905fb306bc7fee6ac69ae40e1b24d9811f9661cec821e7df5ef5110f88d312ac5339a50a1c4e35251d94e0befb8967fa2b906744b832845ece13c1f8e630e1c281789b60ef09e9c5fcdef4e543f042d3c058b5a066772b240b5d1506d45adb3e8293d7b247ef76b1372fcb1ae35a16e24884204d62882f78d7bff054301027a5c6bf0cede50987f0b8e7b1fd76fcf72a8055e76bc52bc814310eb2c9f999e1aedb3766178cb05e81ca38dec64576cc80228e00f1422688ae1e7f56c4f6718692f1d7309f99cb2215b997012bed94b2f08d6a9f4b47e77452d50f50557b6e63d4f524439d35f7a054332857595f77b1ef290b42d4c31c1d2d039c69592b8c671bf57275e5bd72fdb56129954bd5fffedbd64402d9cf0e23060656f70b0d0a31e8ffaed2aa6c2a1482662c8f46b11d682a1835811d0095f85b0f3d30bac7b6784c122056d0058ef4406852339d8141a44eb7a01e4b50240b0b16812758d7e2ebf621afd8508bf8f427f4deb467574e1e9faea1cfb38ad45f19932eea0d97cfe312ba4295a37efdd62152ac47677754d0fd71ca9f355274246f366a1e88cbca7970d74e65d9b7ab5c1aa2ee4e950486a4f71ef0f992546bd326236bd1ef11a692f364788936bbd5a039b8e11df8b082a80737d102d88a92b79a8a151c155a0ca04d2baecdc0102699bb10e6b6d978714ad7d07e092e3a5768598071c76e04e187e285c6fc08caf8563864e91b4cfc884e532966049efb50323ebc8984d8a1170f37ff312af579f545ead37cc8eef25a52796100ada781da94c7b4d5a0a8bfdc1d6f7d0abebf4af09c70a1f9e22c4953a05fcfde3b16e7394e2a0ceca462ced744272ebf47d16d6063e87f730a673312fe1f10412eeb2a74f33410c6302bb4c1b86c2ff362fec2ba113538167cef340bf120a35ca65f74bb98ccc92f6e60efaaadd78fd5ac41432769266e7d7591269e4da2aec889a4a51cfb69ed5f66dab4d38ce39d8b380f7d09d17aaf2d36f0b264225e733581848528bd415474cf066a03503ce3e72bdacd10bb94a5ca304b455c1f0317c3fdb9ef75d7857cc4797b1b37cb05a32d05b4a75bf579ff595025390933fba4df0c9c4e6f3e9aaa423a7233167d7d7037cdab0f6a872c4cca02e35669bb252485dc0fc066d5d13b038ea9a4eab91cc5cd1db21615d00ff7f742a6b8a0df1712a3a74eeb38da4dea4a9104f95f3fe8291e355ac9f4355d4426fa57ac340ec7860043d027ce62a152d54d94e5ed143590344f664f1c0dbdc7b9ad532c277d76fabd94ff85b7f5feecfc3ff9fbcc84c294b073903ed3d098c2cdff1b0f2ee17f474af20bbca5084ddfe2301f0b7152df30e6ed3d7f2bd1c49bb320050c40f7c4edf9666fa385b458bf0a6a55b34d45f03fef9f72c2dfba39890428084c51a675c2507dbd760ac82d69119bda9fb7a35d321ee3bf12c589ec01ed324e05f8fb22f0271660972e363313a355f469b380e495de7dd510fc099ad40ebb169dc1a2112be88a0693cf86dbf47e9b81d2444dd845ebcd236e35e9833c08ea364c4c96456e44108264cba85fed342afc882eec2a273e9b83c65c97a8bba1f51ee2f4aef6f07a96c79933ca373ad08592b8f3f8fae7dc427b363bd8974e287cfc41c8aa62f666bb993d92da350fc1a0284524364fec375f98b9a757959ec0934a34bcedac2181d2ce390f79635b6fe0d3a2f65e471f65e1a99a702a5572b3ed3bb71cccea078c5aa020ca489d505e833c853dd155989f9dbd5619f621c579412d7641ebee51c2c548886a8a9ad18a9b4d4eb102e780effe4f8c28ee094a08a60fe4b35be16eb9c17dddfa30c24e98124429bdc06a4ed71919ffecdec856cba0ab2130739d9ae3267be008f4189a38a1d5370496e39c27d8ba01e975b55e9cc7518654c1867193d074a24b9416df456504780acafaf9a033ead10aa18bbc673d4a562199d32c08f0932fec0c81b941d8dbca840abe1babc68698ca2456953b45abbf823aa18a85a35e66eb7307c9cd4f29c29c4ca55f7f9588a885b963415adb22d0f033fb980398171b15afd2c52a8aab933c2805e32837eef01dba94012a18901e9ab0bdcca10eec7da348bd220fdafd8f35ff27f4a41deb57d04cf8b7fc12b4492f401b96724808ac44f263c40bdd650e945862a2ee90f556bfdfc540c4d43e49581460b48ec146ee9676156feda2a23390a03ec5afc990409e48bde24d00e1167e04f8a2c204211599d378c41cf0dcab8364ea75885520ab190cff3b324c7deaf16b367c17862338a1a4955f87da0a1b5da4ec1cb545d060458dd60fce281012f13e719dbc4dac4ca7f052881123ad6d4136d22e2a4225d85bb8333e9d1d124eb6b15870f57f63664961bb2ec86cc7967940f8c92d04191f2f9ea3ec4f963038bb4c36245e089815874517aa53cb20c050d6cbe57380a65d74b3ed83778602f3e53190c7b21819cb1f2168aaf869a5c57a997d9d7cb2b4df98b2cdba73d1d7742bcecb5beb234b00b6a79415ac596378e61a5953c801c87f467669b355b31bd347aadd7f4f1984ddf9d1de95bab69f2393dc4526db9d8feb911a9dfa805b462cdd825a8eb15864bed323e516fa2581880094463fca5e5f43467cbf4102874c0f228bcd3009dd05c77860c34767e7b038b35034bd705967ea781efa816e9aa97c7e93b4bc933ae9d418ceae0cf2cf42e9ca82b4a8b87045d11dd2c244d9eac00ad4897b9b83cbffaf46f91ee00092e0e6cc7cb533ff384374e05609e9192176f7665f938007fefa9750ecc4ec186d6fbb355a974dda7d9d97d1e9d7ae666b5020951f2d56f9885b9cdffb2f1b59d39743aca9ca6cf1988369e5aa6a0f065b1b7b9a1a81e4f0b77c88a87d709f94af9f15ee23b1c25a28cfc944f4b3dbab1f336883d86380bceef246126f0228e6ea8aa1be83992b91d59e2188a3c0ff1ea6a68b0b12480bd52720e6f2e681cae1ad9b98fcd03eb5d2eeac5888d50a71aee9f0387e09b1467ac24b69ff0364f3ee7e531d0f846cf37a4e36d98e1a7b608feaadce873cb6ef24852cb88043934c3bcf28c6488edee100de2c38af1f8b795f207a57fc5be0f8f81bb0326b8c3f738bed181126f103f20dc8c0f4a7a796fe89858e1da184e7676a2a38f639eddfb9b628e8cca1eb313b10946cd78b4c102aeef53e503119cd142093924846a51e32adf82e51019d4b27598c28b9fad71e743d7d2356dc984a544a7e32a79f4664a7a367933fcc25e818369f672734d7083dc68c3ce667afc8f179fc3876d49948142ce28a279a32a48241ee59ef957c14ddb92d327130f14c315945690c21021db1b571411cd8ae6ae61b042c046020301e89080f673ee0eaf721152d4386ec1de5f08ff8893f0b6bf3a665050703231bbbb9e516f057b56040e1e68e139d38c7c00321b648ee97ea8cd62c2263cef0f4da533140f399631fe3b8b081252414d8a7af9ee09989d1845f4c719c0f031a18f96ec086c1b0383b143e7336a910ca8183b112cca18f2f0e35da8d8382f89ef22a47070cf204c7a981b4288f697d4be99e7e6658652ea6ce4d0f91b2827e0ef18fa6531fb66ed5991218f0fae7fc27967abef1868c4aba354227d4cd408b1fa01921f6650983ea133ebe354c19e694450ae93f9b2ca7297bb4e736d8fc3b50868eaef9bd86ee2ef58ccee62917978b3d4d00dda33a215dfba9328c029b31f5f4e8df522ad3cc211e7e0a988c803ffbc812ea5f0173a2a4f907742e408498191b5a6c767cb377870df4755281d5a3ff99ecac9841baf88b09b45ed6ce5c976e4ef7c7f56c162b9098620b922a20c464d1cbe20d34e637f8624deb2269184e9bcd345b88c40dfa5918a5e4798206cb82739e0b1c4e9cb4106039e3b1017129288eb15a09aa50cc0375c12e31fe941cb6918121a2a1fa188ee45caa997066e256c02c333b3edaaac90b8199ce11c06dc62f18a3a51042957146f2cdeb179c8171f73f41a2694d6e65a79c41a2333e3686486137b1906099395164c3d845c06a30d2d3ea12eff1a6da440f7dd34ff895753bccf3130122cfd22873a4daeeb90732cb568ef8771f321d1c6086049765efe875f10bb7839d43b7dc974a4e3ea6b063d171a9128e4e983633dd20f04e2cd64584654b45e938d7ea7f08e527e2bf0f0a5b462db45d89adb7fc61c553ace880d2ca49fd869164402117ac28dc87c5868bab71fc203b84f8210798e72de57ea7de9585ee7f910f4e9ad053bde203cf43640496f3c73443fe4a8915d2196053ac175500e940f8e8dd487e84b5bd9e107b8ab4ad30ef8d69632cdf039e433032622b0c835fefafa45d4f0c41b2233e474107d20b50485da81339fbd20911d59cc7d9dd4bc2e0b47f3b1b3ad42374c0ad08d40626c076a1ab66491377d3627a17b984ac04d13aeab1bd4e43040060903d391c4fef60a458438d7c2fe63ae70b38fb8840c2329f2fa43aa03e562df0e1629abe281f63cc7c2d8a5ac7b075a3c2f162aeb086d9e54b0c5ef6134a5b4db468dc77fc1103a92570c44e648ed4131cc630c4f03e4b2f9b7511420cb4c00a0689964a070dfde5cf9a82357cd17fd6f574e4a26db6d8d8a78142fd45b5575a21447925d7a6256415202a0ccec04bac5a174a843b202522cbaf25dd125310a691bf6c04f83ae6c306b34e697b8337761eb6eff4347c62e9d035e1aa30be9b033ba311bf85cb1494fb70c6f23fe780f72db9c6c8b4f8c8093c516fb6ccb982db2eef75239e5579868dd55643c2ebe773d84b4c3b53feecd86b8ae70ed562cd9e7b4339fda497f2dd35cc8c30014654864a1f5c7568bb31f1c20ed38c947d63a1b34706d01dca23543b96eecd5038aec014d893afdb0179a73e5d7ce0287213013b71d6a2b2d3d3329482c9903bfb397f17d6b511895c0311840c6a055b445ea38c1154184fc64d8596a1db590d56b5b888fb9ddff83c083977a57560821c66414ec6de11f15a98a0b3d853df49d1c8a56026226e7e1e9bb3c3b716dfb864773c06cbd39c5009d5abaf5509955651b9f246d50f64f422887de398f92aa79f5428d4be9006bca81856210b7781ae9bc5ac9cf2de3a22b4197e57a2fe3619569283b606b446cf0422d314058f148917e9dad43265a326e590a0451a8a35dd9443269d858a0666f34150da644c64d8e4745211d013009fe4f04dfecfd7447e695f12454ef5b7c9f3350ff8ed0761ad73cb4871e2d22e6e749ceedd5321ce6012cb316ebaa05c9dbf9d5234a75315ed5df280c1ca916e121cdc236871361097716fa3b35a660fd5729bedbd139ce34db8ab29c177fc656fcff5af6d21c7c4995cbe4e99c75a567332bd842c339971b63faca21959943f7d2ce2e374286bb8d06a5582151850c71fcb441b50bbd256f34a23fa2283909e6f34559605293d39015f52c82df23ed39f8c37e6c15c94554f3a5e7d4c593e806aea1ebbcdd266584dd9148645c521261dd70a108b051d936a9207bb082cad684bcf30d9f36355c13169c3c38a279e2e257dce65d7f8c60ea11daedbbec5ef894adf4044260f15a2a9e4a725805d866121f171f384e666ac0169d0e0d5afa616e58f48c693263559aabfe6ab7dcd9632b481c40770b702346b6148b74b6324cad32b362398b7dafbdbc8633364186bdc20d0881ad338f73b1644a663a7f3c290a1f93f7e0adfeaa1ffb3efcc3c20006b3a4b31cd1f5c3c01db6d2ad1f418e6e78a400cc1e7b2cca06f8a391b1dd1d9bd35de692a06888d1dfab601c37808991d79a6cc5e87bf936bfc090865ec7afd4dd335e745523f8803abb9623d54a3a666d00d9b0353910b30f8afcb836ff7c5ec5247425984460b62f64caa234755d85970bed17782fc7c089a19a544a880b1eebc14c363ee50a9114844eb83cbc19fa662c39d58ef1bd82f1ac7ec5b29feaa1ccd3fcf197647048c8c9791f38d39c58d454cd7b694fe84eb67c3357336af946ea23b48f154c5512c21b227e63bcfeaaa04ae87e6027a380a5b706a22cf853a51cee12fe72e7ca7ec50de09676fd36926998d16d33f539dc1fb59e43a824411497b2ceecd1aef0615a597ccf57709ed27e7ae885e49a9ae992c9b5aa05165db4b1315bb997b4906519bddf1c8976ecfa6af7c9b7895272c2c0972203eb4d96247568634aaa85fa93e304e375341dad0e19d94eba0e1774f4095f3fd82a187049ed8a52ab1ad9422dbf3d9b6a70ff0dc527b19dce49b7ec49a0b0ccdee5d529a4062de19ee1bbd980e6adf3122d599344ee2371b4d7f15435a527b09d4ea3a1f8ac5d5b2df9a01390486a5df421a7405f806e4de1de8f46cc9e137a1b0b7c83ac53e4205ce2e7206cc2bdf39b2164c3734dadcbf2b669fc5b15bdcf4ddba31871963fe457857ddbb8ff884d7b0399ef0c604df356decc4cd68717bc29fb78fc66a11b367c1efdbca11f4bae259a1da674f5be6580650ed7b5455aa49f3ff325f9b370acd31bd359165fdbeaa13f31a64340ae631efcad27eda700bb479aada4654d2a88d7884547ed4fdb5849e2e5974fd7a768d6a740140efb3b52115675ed730c5f8110a6ddb6b884370eff78261cf9ff8ea048b47e2765d21126777f38f549c67b10e06cd870b4475aa9394c50913435a7bbde803d26413ba908cec5550b3f0e1d341e7bc88c15eb715925e66b3840b8d2dfa65045699c60b7c4265fcfe59e7868e6958174d90177620f6e7429744d95f4310320332dde683bc5576d9917c72a4441db07827895c9a80f83b5c9bcdddf1529cad3d7b6d385da6ced6ca54c41058c45fd624ca45acea8d4e8d397a9a743ec6b38943659431c2204d7d180684136a4a3d61b446400d9de162ad632f6cd01b48ee56e0e3b8043fc1a37f38115268ec2e3712c7a263e27853b6bcf28006b4b2f05d8e945242de1f9ac69dc96b5ecb6a9b6cce2cb9e61f4647f9065079f8eeb26b1842f4f26ff31aec8c9d601e2f3d42346b2e39ea550ac438a2292fc4b852f1ae43c67b25e30f101f8baf9b6004e0604e3dd88f067c0fc3f2f39d960f1f20ed173674409b6597102a9f6e14363f963d7ba694e21e574b397d501c89d7cdc1f17017300a9605e662759916c8c513243f786bdc6c5204578db07ca09f7a6e7ddb5418a5838a4d07a3f3b98d9a127cb75865edced017030ccf23633533455c63ca68b6dc2b046797c117199f4e8bcb78bf24c970e1d95f25bb29436478e14b1d6f353603f5a1c09302dc040ec7051fd5d2b67b6cd6a2ce3404f7c8cbb61b1a4a4fb27722638ac0de2f52f20839cd40b3de6c194cfda7bd0927c9e03beaf13d8912f0ebd7323831102f814646ae0df83f72b5f92ca8b0a7d021975bba41e1a6d6aed817e976c5c7f1409fff3f569fd91be85c415e1233be46844f648ade9e60a445b7c6d9819d9272ba4547a88299e87fc0ca23f61050bfabc553cab042091b71d813459328534bdea20cf55de19499be78a1febd20ca5220d90ba80724205c2c79ed0648b31e4cb357f3083fa2d40baba705261d07e24f0bd49c01862379b867cab68c5e68189aca39acaa01de8a864375e2b4d643b1dd73f92a55d94232e36b7525cd921f989896137314a742c402658590ca1f0a0e8233745b5e90ce628aa07c5a839a1ea6cf5dcc0191129022a06384e9852b5d289094baad6e35af4bc7a79237e26b34095e11491c9dae86468baaeb2026433efa38bb1f884db536bfb337e3fb9c42bbf53653fd3fabb9a3a1192f0ddfb08c1dc13283062428c3a3acd7921d1bfe0b6f3680bbd727feea3a06b1d00fbfd81df8670de150805510ccee254adaddb9eeec820375158e95d349fcdb57d77e37e4bf8f220cc7789e8532f33a24195e72af28cb4dfcdc7f96ae906317410faa957a77335271f67a11f06c64853ae19f0eeffd284e11a3f514a12ba681028b22825913816cdf8eb59b488ef06bcb118444a79a668ec6d396171eb9ef03adc121b9cd3436c92c4334e4d811fa59e2882eee1264f48c86a20db05fe693b61a38a0f410cef60bee734978f2bf38972c021f04e14b240ac9fde60399aa406a1245f39b5ebdf993fb3bb137f2c3941327e7b91b54d9ed6b1c59c95eb0d8dbb473b1442af4afa8689b7c958dc4579ecb2cf36253635fac682f28801f37312373147c8e7779b52d9f63bbb70ba58372cbe43411137285a3e783f150ed9b68ad4ecca9123cdb5c1e59551637ef484616d76ddc85151c5a912a0bbfe7e7c98e98b0293f86c5b4709fd1db455d6afd9aaf89c8b1fee09ccfea4daa25df9816a3a06ce1f80a24bfd1eb9f039112771467575622a342819afa2460a1b0d6f80d6ec42ca711d76cefea5fedef7727f85ccc09486a58b542f52e823ac2f34922bcb3135cae97bf69cda06853935ad638d55046894c0dad57c8f44807ea144a074e2fea4a0b8c8cc2dd3ebaf9f4fb863c1de4cb0dd7203adfab18cda6e65c0da14d9b9d0e1b0e6b7e483c19aae9ebdc9caced6937cebd1e2e512479c062a11acf774e7bb8a379535eb9505f4b5e16e2ada1ce92a2e8927067448e958180bc76652dcd4975ed48bb37d425d0811d8f41b25fa6ea00c45dddd20db14b7cf3c0d10b38a6ffcfa429bde32419a6bb69fbcb70fe5f800ed529241314479b428dd0549fafdf3a55ddce521ec03939955a18cb8cda2f3550b4f3d9b53d8e8a9c22150335973beb48fd8d26a367290cabee0094be097d3410a44fb28c9a21b164bad8ebfc8045bd09eec244d3ca8e49cf60f0d8a9e8d05811d07b2cffd7533e5e0e8f2c4631802dd9cdcee2736a142c7198337cb6e919eaf5b8337efc1449a1266d3369992436fb8ab8225c76594dd5e5ebdb0b5962bd9ef4f9e3718ecc1cdeb9f53b494b5497188efd2aadd2dd8fb192bc5bf14b1de22dc4341ad54312fb0eed0f902fce205d55055fefa45cdff123d7e2bade04c8853db7f4195c8c10804eb691d704b96dc6cb93259a23ae23e1c5f1a76ae9fa9de69996040c94646b9c9579f414b935d84d6bc0f70ff037780dbf987c23faa0535b898b4642d5145ae1b472ed5b9f57ed04ad3bdbceb2665a8a3fe6bd527d34913685aa5640361f52e00364de62be7c500b1adcaa92310b880306f5c376d7ae82f1b050342f28a2b54e28e491142604a43c98ab360ff070e6f457e51a37de4537e097b0e3ea2ac501a63f8cf97f3d6db198f673c10e29d21c688c2898b4488903c6f5ac3c4737b1d5004d137a86bb15c0fcd090ba5e42219d026f8d8f2848d31d0f90dac423cb75ba7ecd3700d6065c7b81d237c277d8062459df83d1eab50ba865b15c117983f8e9c40212d6de1e76b189b0ee108691d763d20229c0051247c30dddbdb3a14e4d69e09f914384fd5550b55de90a502db8f81df3d0bf33e8148e0a265373f93b1af792de3b69363f11912d170b07665bc849aba574dafeaed60a471255597ea544f6d5172aa43d3333d9f1bb68f9d8eedad3b741a2bd21f0ce6ab06e6c947b91a090b85c764231a898e7c315a9e1768b9eca83827b92aae43a771b7d1d66c8e844d36540d67adb50e19a89c9184ce7c7ecf955e7caf1f454d75044957d54d498daeeb0dcaa3ab0a5e6f103f6027b0c8e21e30b7279f06c19cc071b98746b8d2c0e149461372b430b0d3286262156154ed6916f0c8a4820dc8562399e971d4a12e89690dab4c8d28b30be170f9c8a534cd91d4277492fa45996083b9333e9078508c3ccb690c3fd423d7fe2bf594c8489e44fc929831bc199a219406885ed5f00b362aa15cc7604a17a38e85dc3dfd092c68038516f208fc452fb4fa88c9176d2af8557dd242c7682faa8da1e730168afdfcce77760de5780615726b025590d92da3051193d013699a5203571153e4be4ef16717c6367b61fba8014a301210526258d14ed6b73d60a365c5338bc60486c92a44ce103f55260c9896a069dcbfeb0e3834e41e494cc4870481e025d732e05faf0936884af1e69632bc16adc7ab70a7f955f7f82adccdf3e84e4249cb3559a1ea8dab4f732a3ead954279720de66a152dd7e6ac718381f84c28b42e64625a040b6de681fa543084d732d64a774653e33588cc9c8e92788725bc928bf4a90d122c4fda2046def513f6aed96d24c363b31deeaa2cd0bbc2167315301aea8a320778ac59a6a9a866a0638f6b2c8192d2d19a5d957bf8cf51036553ac474634416e14bd66324d9e6db380c7b057ba5813acc65b48ce8abcbff74ad0e233938cfcab854af10e0873a8710a5924ba4bcd07b5f1b90a7f8608608215062251e48cdd1f3eddcbb7280ee1bbb873418a12688109dd342dca4a07739e5999988e8883d13f5fc8d3b1dd2203092a449ba500cb1e25a554558d81b0393fc46d260452ee645fdd18eb3c7b0c68dbb87034c38feb61d85b762e9f87362208afec3748291114f64d3fe7a06b7608a0668c95249a704ce32d88c3886c76b025e4e3b11aafc2c40fabe81eeaa142cbfc79506bf292848d26c5e3b8c034e9af8980fe60761cba49c8d53c8c5f3d691a35178c40929a58c0d32889ad674f36d3234154e44f33907290c90e67076c4e8ca7e7dd1250c9e2e1eb010840bd276c6ee25e3da6eae7d8e1910a4ac7a42841ac1545b3d5c144488e3277f99fc201f129bd3aae73bd3c85c32a327f013e3b6ce40ade0819eb831147800b5745047a04b2cb07ea5e461e95d7dae88c499aed0488a1e563fab5da784f92fb4751da51349df5320a9b459125efa30e5ebe0efa55e7152583ab3dfee44685da5a8cc04cb91cb817cf3ee65e22762dbb152cf4dac949c56d4857616d74877b790f203f576995f85e31eb8c94910113758fb0bf671002fff176e06c4a3e2a58bcadb903932b727ab31e3482a386a774d6af6b778b552e07c6d9660d3b416e1c9134f9441b6e1b43a30ccf40a611b868808bb9c5447720081ed9a43df1485b5182e9071175e05cd65352936e2eb53ed2267e83b7e964d6eabeeec399c6432f30104b1e09bfee48ca514cb383164318ef063c8b881b35921c0135a310ca4f22284b9d0aeae16b1c9ee16094eb5e5e827442296f7c533e65235b1e511b31dda7646a4fd2cc1d1b67aa716c32bd896979f4d1fac53426d34d45a756ca25c1b518fda847a511fc3c9ecb3a9b42e2eadacc210eb8599e19f4f7b71e05d21e576a73ab0fdb4b829ea4a3853ccbcaa897b277cb0bca209963dd77517e430be48aaf020228cbc70d6c42e926bc850bd313ba0f424619ec67d990cb5442a7a206aabad19580e64ae12a219e0ca366872c991e41b408d628ef858c208d6796989061538f736ea05dd600ef095cb8007e170176a6e3edb78b7df27f077cfaf778e219d27712610e2151542d873817cf377b25d266fd765de3b05891f83808c194bad871ff5d45514c4fa0db8cc5d87d5c6402e4c2c163e2709475783a8056e3182549847f899c41c6ff5f3d442a536488b12f76e84bfcd1ec95405c08a73c7183189d17a1f125915473b3a9998480d7256d0298de110854bdc8a498258f9a03fba0c802ca2ba1e8e3501c871c4a4a950314006d923ab12a39c5178bc049f02283dd1035382e900d8adc81581cfbe1b4dfb75853c010a30c3257eae070c0979180961061806d0918cf31643ec2d77a29679caaef3ea9854ea33fd34426e8abde615240e4cc01a3e8d4800837f290f31def003304643b8642447915c5a66adc13263b727f2a8b82eb516d0a4f4d16cc305648d9cdaba7e3a5a1d3e9a96e5bad58275cd3bf81d1f91f8c35bc1813e8a94531dfb3aef671bc5624212697c1d25ead2da6e586968fcbf5b9d7fb3337a9cee9400a5732ab2e353e42438e4a44e818b7c48891aad87199c76e57b38213e1739a0d46ee5987504810d96eb5a42a589e717cf832e2a675aa776471aa3e4d6625c12affdb37eeb0711babcceef5a72e38f4848e6b650e7eb20dbe6197bd18eb2def3e16d0ceeb0bdca7cefe194f6884e907172b2f1eac18ac62970b06f62d56a2e169cf025c13ca1c27dbbd109cb2f0862b9394a981ea112c46d054a8ac48587dd59b92c145da9d122203ee412871598332254ce4300794d219981f13db341aef8c36167da1fb862583088ed70d89e03c38e4e65fb44ebd12046ba4e5df539b5c887801f22c47e611b477d61c55b2ddd94557ec9fc865137c2b0fa1959d6e2ad0cfe4213932858a6cc4941509f2f20193f7a940768f59e400f4231657471762e4217a1253a47bb7ba45e0859c082553995305ea5937d36047e1040e5be54c21c578315b553fb39729932c57ec87abb44a538dd2e9a14229a96f0c866eba8a520e0c84ed6cfa1e57e8f81a8db4a70b4bdaa495dfa1c976e8b5c92f2e59ed30d0bcf266809abc7857e795951c06d80deec776d4067d1553fbb6a4c696e46ef9b54b54bde4e9bf90bb68a952c89d99cc7cfcb00b050be0c9a476993c2c49e4ae5a54505ac4c3104e6fb995cdaa591658c4ce02b5921d121247224a14591598328279848a05daefc1a5290e0741df15efeca455b86bd5e615f233006b94086960c088b3c70bd6f972c89f3bc2e79fb93368a3e7579bb074880d0b51cba2a4658cf83c6a6fdd6d3fd54974297738b2d58be18c9e120174661d656a45fc2ef974def5c93a7b2db5e24481fb46771bdb1b8c1e1d858b84bbd984ac13cab19dd8846c14c643a83721093c112dacbaf87a74ab723909423cbff584dc07fbad16f981dd60d81178bd76d23566bbf766e77518cdd350a0199ebb6bc32dfc695e379843f0dd301d3d046e35a51fd7ed9ba4fe1e9b9bb5689899ebff137120af01a2d1dc68e08bf4e179c9418883ab82112a553cd506e339a1b48782c8891071796755dc713eea0c20a3855a69a2cd55aeb93ef5d442b139f8e69dd1f2dc78a4ceee2b0c9cf0df3ae1e9bb61ec21ffaa567fcb8d50dc174e343eb0ca3718312bf16888edd414a3ddb1d644087ed395d10767031ed792e0cd591a55028828a257d4abc7656ca2fe3ea0dc6ac609176ceb92fd629c28ee0179723ab8d174c821cda48a91a6c317e178626e53f16fb20b2742b8dd73800df074756eadda83af3009abcc19eff36b80488a527ae8bf5719a12c3b0bd4e5a98b5dfc04ccc31c23df32888ec1fc197d26f2e484c5519114dee59529425b481906e0cf3239858a986c0d9e93cbf28773a4e1f133444ca12b9b934ba6515239551f4dca89652285c2993d0f4360547b30f20e64548a4ebf2ca44dc0b481faeb59ea5a6111907b4ed2d1fe84148189c8b1a8d84a4cee667e06b1e2d2ff677de30e70923ef554f175e9011a373be6e99d8a8299c13db923e3f2f234d8477eacd8ac47a9c56b97478431c0f7993065177a1a1522cfb1c88c1e47b9a0d8b4eea8b9a75d35432957c5fc4f9a5b15d6b68d0af483c50d3e97809f782f9bdfc025c575ad7759546656dd39357d050de280852c6a4d3f57e037866f9838ae595f637d4bb5fed90a38fee1c4fc12baf6db24e83f6b11756a203904db334b6df046451ff267de3bf2138b61bdc5269b538a7e9895e59411a84bf147ae9e98cfd0cd221f1c40e9fa7383372a6f3ca5f88d43eba34290879dc7a9f69cfe3cc2459b819b61c627243bf58aa5c6a7267ac78cf042f46853d9b06c963057574fc01a8db60a3dd886596705cd280d543274e3b8f8e96623c1ac5c866ee533667f6497c312ad9ea725ab6f53478579fd871235a96181e1193637de84e80dbfc105e7572cee58b0188d7f1f6ef51f24e8dbcacc0232833af1324339273ae3eec10f8b0cde8cdeffc02c572ec49010786319d463ef2513f320146103ba3b82745c308eba9a0ea58266fa7dc08955740b5c605360b57c5f66d484a679b773ec9080c49501be08c87ebe00cd3cc310ec0ae14caa4340134e3a5eef9b4c21c36e17e94fcf1adce9e476981795bd72a191e668c416d2f6eeb6e59652a62465070740072e07dc0bd93a300572e1e675c7820a9d5bdeadd42b485ba43cdd82ee47b89784eea7d7fdf723755048f7938988119095cc0947cf74aae15538971cd6420eeb7b2794d3ef9813d40cf8a98b8a5cd9d6a71df5baec791c28a43eed7674617361f251c3c6b2a4c54e9a2e29b0ea59df48848afc5bb693c3dac9c9a9072ff221284f5072e64bba27a8b09d5af4204a1d095585448c88a8fed5bd9cadbe71f8ea42229a9733ecb416815aac34208f1f0e7b5195eaf10761fd2afc593deb71c8fa9fd56af5abb0c8ccaf1e874054cf0a8918adc21f11bf2a0c419553b0e3708ad11ef49d195d56a864e2985505c6de6254ff2510cb8d64b26e92a6d3ac67b319d5e32d79227dface5c25c03b64c6913bf325173c36d2152cc1489f1476c8dc60e44e3f09f43da99346bb81bda5b33ff6960fec2d43e099bd1f7b4be88386df8e077c3b663e410acc7ad58f8dd43497a8dd36afbf11bc67f2d175a9cf7e273bcff3b13d15f2fd043b157a4beef7b8e46e2cb9bf91c03413ad7f0a5d216f2473cea80b55d4471794b885d39e9528da09a8ad74522389c136a42e22f0d8484923914ab57aeba386af1f8d444b809b16cea816bbdffe8065142bc98f51921f230f4722d60799628c688236fb2912b29e1516f99945b4223faa67fdcccf204da4a22b27122ba4edc17cfcab1f659415385ce118831d366b4d4b93c98fbcc621817d24d67e8eb65a92a4cff6d652912d14965a1acea4a31a064f30004699fd14c8811df772468374cf853f463ff73b4ecefc7e2a1cef0d2507ba30806176286228b8be9cd95a6e6ad16e16c98643e05196152061f6adb5d6edbfdc9398f80226db2ddb9f5062748fcd91fdb9c5beb4d6328151629dca23fb938afd293f13e48e0d9f6a9db485912dd26802bfe8b3dec88c035fd47bfa9ef7ac9008ebbdf0e7fbd41399f93ef53faa13f2ffb4de7b16f8d33debbb1939e03a0626a2f91fef67be051a01e99ef53cbc87267cf92b9933a3d77d2034effdf673d6fe3fadeffe8608f09ee681784ff3fe3f461e02e9bef53fded3fc8fd116026985f77f68ae7d1a5ab017befc573ff3ddccea675e4030eba9ea59e05773813a2ad44c1fc7182c6746f4f3fee52110eebdd4e3f881c493c91cd61cf8833a288158f6a7e028ba9864b2679e91ad2b145d4b29e58b0a9e7276695a7eb100a7e020a5e38c1aea9e9f4535e35c629ab59e13706ebeca27305db8508a23539dce01ff7ff53466cc7819353443381c314e38ba38d77fe128aac21a8e327f854953fa1196118eef5f138e622b1c63b5a69921d6100e41f07e27794f083812e64f461613bb7c275d1b7a0e0040d9b4ec34da2686aebb4d7bb282c060b87bf794ee02edee6edadd9476373872b9a7cf321f8539d9d32d09dc6b4b8f05842be12f5dadeeb59dbadcab7d4aeb04ed579a6f485d2d23309db2c55a3f2d787e8e9672a72f0d3fe70d2cc051eb53aef56f0872ad4a3674c9f5ab7cc09b7190476f8a1a92100293e96fb8a3a8354a84926ca5b243aade106292e9d35aab8e1836685143982a5c706156eb0fb9d62f5799ab0cb629d36f117ed46a24268628a2706109125866b516e54ac549ae55860f4383951c198431e7c40cb6e97aa93db208da9466004388f67042b24c5a70a62a044393a002212a65c9dcbe6cf9c2a54eab4403112f6c36c460c06022d7748928c05e9659b278829100e36499258ba83c62f10ba727b4e5cab20516368f3fa5dca19fa3ed14789c436456b42642f6bceabb4f2993974c2514322d273c00859fe0cca950f6e7a3e33ef5db4b0fb73c9ceaa1bba2543887b660224666aa4fed806b1e9f0b7fa8c2c0e31ca20d557082a13a4818ad4d010593964c8fc8f4471911f4e7049a4095fe03ba47cab7639280c9c2e9697ecef5ad222929bb97dd6f985ce9095276e9495b949e38653adbc79c20384cf2a0603b09da4cbe6829207bf27c7f14b05fcfc969d1715accd101d71f71b2879fd3a23f8665ff6d0478944e3eba7e8c752e830a5dfea20c4a64f7d9b783c69716dbdb3e2549292500b2a5d6565ba96f1b121dc8a38b07198490ed1e065078c4221358059afb45e802dcefcfe19fe2c8602f13ebedaf17bba1a45f0fbad1c740fba04438ff948729d057e1e62977eaf75824fbb70d652cf4b721d1fd5a6b7783a0088f3733d92a53a6d054c184a60a2636d890840d33ccf032a74ed1841f1434814e2174ce06cc16a5218ec5feb5041e63fff37380346cfe30014ea5607c4808f12121440baa0d50903aca1160a2d86dabb556bbd99e5270dd68583efd1b06aee1ab7fe60e63e10d392738f64474cace19043583dc45e089007beae7e7108147093f80cc94edbad40c21070f1083ad0dc4116d282be18710f865503850ae6c99504a41c19f9b5639a7a4f425f09dcb90c8becde958770cbb2b05430d47fc426db7dd22d28be12f29ed6ed99422e1eea8975d38b4c56e2a84a951151b266fc3e4cbbe9b531a7ad98244f75e4b3d69690949949f63ca29a7cc3165eb88f6e30d30bfeed4dda5b4a981c17db395baa49c51c3454e96b5c67a6d6d12d34b73299de15adea52cdcd195a7faa8089f8a8ae0addcdd6ba5b5d64a3b9c929293f24ab939b53555069d73f21081ce10bd6d72a6f794524a29a5f2f502e1480d1b192175e10eb9dcefdee1f8fa1173987c569eb456bbdd71ec57e5afcb0e4af9d4e5e3ebe6da79524a29274d4a19a502a594524aa9d7b5524a29a5d4fb542b3cf37d18a86cac5c18a75836683c0ef42eee928b044770aca19452997f83b97524a594524aed6d5fdde01aacd68c67696ad4dc8a5975061c5399db6a64cc70d9bc6478121c0130c3456dbaecdfdd6c90fd3b9c9ef18d5073879edc49659f8181cb868deb06a76ce4fe8e86c7b97eec1feb3bed9ae9775d336db029a5e1b5b9a95123fb77e1cdcdab064e8b8667737f0700ef29695455cd8df355708ac320a536b36bbe8865595d4d4777772ef07c1fa59452ca9aeab5e54949b3497a299da192b2384aa9ace102bb7baae54eb5dbbdabcdd6ceabb4aabcefb374deacc32465e7eea56ef348c9b1ee8c47371a8f4a4a6dabd64cf95eb3943b94565aa90c8f4aea140a6af4dae5dde6a975ba3ba6b9bb53bfb91100986aab9d9133f65f5f0f6c29ad332d1a302d9a992ff6267405405691810c6a6bdd2a4e8d960694564ab3b0f645ed97d60be31b3b43ab9db9c27ea9f7d28e56cb62b1baae7bd985b24c9932b6be36d059bd6e7476543796565ba68cad3602b8e1d9dc8875ee9303ae034a847670894c892385060e0f2c0d1c0f78aaad0183f3e2e9a1d5bfbe2c0daf96563b64da4a3ff09922c5cde3a4fb767476a7d56e38346eb27c7a656d819c84d940a062cefaf007c3968c97326a70c277587f4d173c7ffc57e80a4000bcdb354d19c8c820834f47fd1a35d4abb5bfd91a2d0dea8b34d4bab442e3d3e12ab0228c7e58b45e18c33cd8a7637b1b1b78392d977f5eac4c242c66789b6c6021a12934a9e0a821f349cd04d54766470644f4be173f1daa176ddcc0deeabf1e7d801956d779988ad7f94af50d994fbcce0415c8c88070a9af0d7456af1b9d1dd58d8ea7a323bb4957d66e98306f34ce104e269b4835cfa46945c804a1c9ad5e304436b9e4709c5b643602b8e1d9dc8875310e3a0eb80e3af0a4f4b9dd003c297d068063436a1107081a383cb034703ce0a9b6c609e7c5e3d1ec49ad25266ff5822ac5faea9161b9483497c93e1df46545b2cb200cd9b639adb488a58f9037fa93903bf5034f4a1f1f4f4a9f248c5d5eeb8dcfeb66a63978824e0eb23f75f798f489c91d9f14088cf1c54e0bb3c316960d3c44d1f4d0d492e202950f543a1fb2b84b5d23aa218fddd460f21cfb293799281fb8c8aca7cd63e38a79f5d28725eeeb28f900743be83a294de48e0c2e410f2f5c2994789062edd74f8725c00e284852da61092d1b614daf88be3a8871b5e8a04408997e875d2efa2e7a058728a40ce145174e66f4c5e6a9405cb152e562af66091e4516f20eb976453a28c1c9f4ef3645173599fe96938229327d6a37a5211e32a55fb9e4e420e50465327ddafda083031513e4e042a6ef395ea26891691352e0f18a3a50d8cc8cc04d578c1607585b68a0c4e0021e9a8122f4c28a5e160f4c544d2c612a4e3e033411b5520af29c545328e94690f44141810ba9273c2859b8c07550bab80618c1500a4a18306c475c1420254c51624862002786a2387161a916258a0b062041541422036ca145a1c2845e2e3480134b51987819c53aa6650b316cb8803924b028304cc1ad2cb33cf9a08114d826cb2c4f48884cf08c2cb33c49914197272d32e0e2290ae604af90d4a8823f2736ca60d6908d21f08a080d76c038a9c613be4c3570c03335510b5e6599258c164c61c0a8410553174416b08d013606e69e9c00df285b4809e307518c510d1bb097651631546a1c65119374a41613b3c5d6a493392924302bcbaf5f18065f292fe82370bf510a5aa048ee14787bfbeaf7d519039d4722790b715a746f5197c5c4609fc205c4eda2058a5db885f108c214b1618c714be90616dcf09447fcb48ad32d98eb965d0577376f5c33601fa9c733a6e011a7bebf9b9e6cd93e02cdfea927f8738e965212a9beb08884a285312420a168610c5af6fb94e3387ffad465a8c54240e58e87f52be55e8242dc3bd9bd48909ffa1da9972ab8a42f4122cf41dfee0d456858e7f841ca0f600b12794f411cdde37d7f2ce6b21c6070151ef2289b7498b8269d2b0afcae16a58bc0c3257379cffd9bb70db4a0dc3102cb5047eec8afdd5feacd5d0098b08ef4997912f1a72111fa5eb885dfe22482df3f4ad5a9c019e5b04afb81c4b1c3eae3f7503aacfaff784f7f23a13ff5fd2922aaf0e77bff2dcc6971ae5ef58f55ac577d10d6ab56ff839f151209b2fa51fd785618fb9574588ed81830f4ab53a039a32c14a1e14f051c169ee0b0eafd98d7f6347c6d21fd1ffc1ed2573da534a4d1b0c8cf1c72587dffafbe9c85627b30df7b2b68ad8f630c7d7f2449e87b9fc4ffa3ef3d10ffef5b416daaf0b5d5d716fec0db130caec0090536cd61f53f1003e5fa9c18dc42f5c330b8fe6c9a4935e9db42da6227bfaefb0de43e9532d21f391b7881c7f76a10264196c9aa26ecca4d690946269d4128773f16c99386eb8144e40b8018439b11790551153902055ea2663fdeab422233cb0e3800cd8a7020050c41b38e6a0ffae5ac88e442862a42332fec0f9433d79125a425ba24c70b4573b2d2626f791d61e9deed515e774322ef91bcc76ba4f99130f34c016d246107da88c2374273e98ffb7602c3a979c6761abdc8a19a67742427538b1a3b6a49f38ccd25b7182ec678ffd5c3bff63bd27b91910374a11f8563913cbfa1644079826d942f28c3d85244cb0e1a41e28129cae40df49745cd33bfc7b778911fcdcde57228177605d1bc47ce80f2903bbd8ed80277c2118b39798f87c31ffc1f0e5ff3677e5e53f541583346e16bb258af7a396b16e84e0ee5b0ef3d509643d603112322ac377afdf03e0172a6fa9aa74335e0091f58019e54cdab7e944d56d0680eebd5ff1801c1ef7dff83c339e4b0a079e4b0315ff89a0b50bdf740beaf098918f9f41088eabdf766dec88c45f35f8df747e6ccfb1f9a703239ac5f334ce187745802e4cc0487f51fa9be6936318da999504d5fcdffb0bcc7615007d15ef3ab79ef83d4d484aff935ac67853fdf7be16b862f04785ff341bcaf097f8c80cc7ccdffbcfc695eb23e48cd4cf872ef83cc3ccd4cf8f29ff19ee669bcd6d3d474d00254bea505ba934371636067f2a5169de64beee454d4475d94db432ceed44950ee1464f5a3fad53b943b2d60155220a73477f2aa38aacd3ea7e9984b290f94339af43ad2d1dc21e9eebed7e5925e28a5f5012dbabbb7839fc3eea639e48efc98ecc529bb3bec965da48d7877347436c7032692e6a18f3f2665b247ce205ad417292515593e0a0e90208490a70e52ac40210cd5202ba58aec3fa5587fea604576b17e92303ec78657c8b54c762bddddaa6e7882dca92fbde46a240716f8a3c97348183dfac0989412e63547f697b0fa29b0eb8fecdd7fc20b914db7392f40261ab4e840c68b306ea8412cb14d7aa82f7ece5b31b48527bc58b550c33cc1b48277d1c2e54038c3ad6d58704ba48262b663b3d25a690d16f097a59210458c21c4942d4244b13428e91c2658760068be27440bb93eed5ae9bf8e00aa1845193d512962d43f2f9411982deef9a51941e132bb7928eddcfd7a97a500168a64f76e760a159986f386e3ddc2117b8bbea82c042656b64d22348f540a6229cf20bce45492d29424733ad7c4a9e3155869bd7a3dfabfb3877bf94f2499c8ad9e5ee656cfd4864cee06b2c78625348c3e0d65c3c601f08c2040691ecf80a4995640fa804e7d053a54c20f1e4bc6abc210155aa443c20a04812f7d2f2e2a32a514082fd1a73fc42954ade17e377b7bf9e9f0d1dbc66ba7bd96c6451e71be933623df9f136886938684472fdfd4bd9f0af1a4f590835d54ffd6d0fefd8e227de41d7bc98ffdc40b7b68389f72bd3fadf4fd09a57f7669f55d5cb66071519953eea7eed3200273299003abc0f38fa84dbe3f6fdfa121fcf23bf768173cb7344f33d5ecbd6f5fcb3ce21291efbd6f8ff09422af0b04d8887b276dfbbbddedd29f9f2c5f51facc21b973ffbe0264cf8442c29898b46891573ef8401441d0c686c5baf77edf7b7f9cb4fcd7730d6dddb5928142fa90c3a40fcd15cc60aeb5d65a9fbb628bc0435ee7dd6ae55ef0e762c04745cde3ea82bd86a5fe0643f64c2aa496fa4c4c5ab4c82b1f7c208a20686353b93c674deed4af453e44471f9252e4ceec41faf4d76642dea85f8b724861ca9d8aa536538bf53beca5166b95d4932e0bba1916a64c64cf0974932dcd5b30ff205b876cbb06dc2b8041a579f05bd6db6f26b2c785ba903ddee430e943b34dd9af35acfe3e0b9c605ab48f417b05db22b037794f7dfb2e54e59d496a81d2619b17712f7031e0f9d43c76c4f387a25412b875381572c73a90f441923e7e8473c081b43890088236360e2404044e026f368923913bf6534dc224789c4dfdf3de24202bdb5a3b9de40e7d9aef4f02a3e030fbf762ecae1702ead30f529f86488064b3995772672d18c038bfc8f6bbc8f683d0a709914c27c9817d25773613a2e0d65a2640b98588b2fdb63fc14481ddc99b869ab2c5d247faf474923bf6b3ece91a562061f69998b468b922af7cf0812882a08d0d8b85b36dfb6058fb36083c7ad9be0365fbd6eb99a00cae0041d320041843d90801f6c068f0846590400c836fa8d0f0430f5e7e1012bbf80106b10abc7a0116633420c236592a159d40dc01d764a954c484175434d001b3b2542ae2c1865091932745405ac4d8a0c953161867a944d4e5044426d8801605080606930649b863a286126c97304289e8034c4440d8d082b72c958878f0614eff6eab57473a6520696459abc9f293e5947f6c88dcc98084f573b1828c269cbdae7379333a9547af87adfd6ca5ab16f67ce5ad4a2ddeb6b0042379ba2a75f9f43a4ecea7a33e6bce1c8b43591c48a704e1d69aa0a6bc413d29592d55cd274ef73c2a6578d2a3299b1befbe365b43c16d9b7f73f391306987636978423a413940381d9d8e3f59432303261e0600e87e8f36a98c192e9b9b215907fe8694fef0b1e6914a4a185dc9743f980274c515474041c152a58244169dd36ab7f196b0b91893f993c78e7443cafbde5bc311d370e6de5bfc28b7f42479073ef83043972fb490c169e61ea81285cdeeee2d031e316e9c7657f3c8dcb31ebabd79db7bd2f3878c6a356d4e9f41d3c1f1a64079f8903d43648f321b903d3c96e691251a1275df605765e50196d0b0f9dc93710ee540bda039e49ec354c90c85f69caf21dcca5269862a799c41b98416271641997beefdab7fb7c999021d227de66637ba6ddb6fdbc681258077ca56cda0a01fd913812119909e0464cf1087bd181ce571b3d611ab40f9b5825c0a747a9dfb5bc2b7433e51f70d689ed8090d6891c70c2b37067fc63a416207d528d149efe92b5f94116a7532bbbabb7177775f8735a6d9eb6eefeeeef65abcdeddded6058da4694de48efc9512980cd49353d214ea204a29add45b4a995c1aa294e21a9e2f7f8eb329cba7b44b8bf273b4982b78caaf1183e5d734a5d49b524a699d492df250f711e0299b5221f49fe60ddb2f3b245264e645ba6750e041b55aedffbf56abd5fe3f6989e9ffbf56abfdff77d004a189f4b964ba073b3d413575116e72393d54510bcdf0ffff1f4c172e5b269625115ca97708171dfd44ba40ddd3b55aade8a8a8a88b7e740d045dab0975a935d56ab55aad56abd56a35ef367501438518649eaaa8d56ab55aad56ab79d01fe9ec745aed76b9546767f267e77d95e33e15bd57b5f26da3ab5837f32cd9e4a2d39680986a28788f283a2c0578662061f55960fd16f22ad21b8a0cc8f6eb513beccda709824b9ffbf26717f9134b6c224d2bcdc3bdfc7ea6a79b9ac9752fc62ed72ff912153ca548ce225a4fa12cb97f9c4eb2fcc9448230b1cc1bfd92e674c57c856aaadb50ba85baa4165241518193502fa95a28053912d63d0b94123697963a550bf92a945d03f2fd2976affa7a7c4e85aacf87ab64119e3fd4505aeceea1bb86b6e22aea1bb078ae610bf50bf5ea1b81fa1337fc277b0f9617f39e6d06b56a0cb0102247510b5ce00596284f3851c4154e30e960adb5b6061f5cf08219c22ca104083ac9cb096e1212a37ac55092263b34f1a4cb17274e6c5189b842cabdc208870eb2b8e00b185b64698111f5083741e1c15eb1c24cd312375ce1845382c3115a94184af08014461d02045c962748ee155090d45a6b2d81184b0606ebe58a1a85972c668a349822040690c00287114c11a6c9163329a7796e9e33c9262182cad01412601ebae01b9e10a203415d82a3329f3d8284e65176c90e45a61ae571d226d05c32859c8825398fd34af6a67214953d004d8628ba72e5ca0c2cccfc633c4e9072e4055f4039e1441033ff19348b3cc9aa8e58248bad73e0459dd8d6850a76d8c24b91951cb4f8a18bebc08154134a6e70128515485e70e1160890baf9f385807bbbe97dbf79de77537f5f08d86c98fa1b522e05e688b5d31008f75dd87e432e1c63a1c3a6ffcf7dfbc3fd06e4be0d8170bf85f8b3c02c937f8ce8ffd84ffd6cdfbd7cff5e08b09f7a20f653a10864fb2e7c8771e06bfe1b995d30f5f7132067ae90080e2be46cfbf153b65333fbdbd726a6a47207676fc0097247be6784e7c75a942f71748fe01987dc915fbfc0217da8b4b96a0007e562381a70824c862079b6cfb593390c662061dcadc9a59e2c3dc81c09997ad0352a1a19302053ee3db04648a63f45ee7b0399faf07cbfbf03784e4d231407acc608ee4d11ab570f87f4a13e3bd596872cb616ac68e10bfd23a4ca6502b422b43801921034e952a72c81258621ea0b2e822f5c1430d45a6b350192db4215a0285a40e22f7c0ece52e9a8288f1fbb5e0800093cbefccf1175ac064af866a97434248e81b72c958e6a68131c31b9329924b11c1df132c6568778ca5d964a4378916189b5d6da301f688d59d244eb8b314b527004e83b526bad958b0e1c145c8078a116610598302ab8428c099284f1c3064518474a66b8ae219686b052a543681e2ee575aa6f05f290b0fb52ca5b94650f7658d3af3209bb72c9089228e3910273ae091cf852bc2fbf1ed4f3f6f8debb59db63ae902b5117b61ad65a74a28eccfed441c47aa7bf43e6eda6783856ddbece3cae3ccf48f6c231a65219c92a8cf11bc9d88570bf92592564f51cf72bafae563be4abbe7d16a8d330fb1514b9d48b62f35831d63cdc5bee6e7fef9c77daaeed169dfd252592f288979440ca7666bd68cac9f62f879f7e3a2c70819953bf43666ebbb5077f5c0a9c92b2147024a9a3af7a5538aa8c641a8e3ade774672178eb1affbcf48fe7aacc6ef57a191bc0a475927a4be4a0a517d55a55eb5a382ae56ef90d95efbd95a6b3710079939ef9d3766a1aab413cf5a67752ab3ba2783a58023b516a50bc7f2c764217c9db34e20e89c73fad359ebac4dab774e3178fc1ca7230e32b5d6d818f27ee02bc834ba3fdf2bad94d254caa6524f53a930265bede05d1f62caa72395024900755cf04542cd1ee851fb77bbee479c5a4cfdbdf47e4e419939b0befcb617f5177d9a690c31269c20bc796013d162313451327b05f929229d88528299117d2f7c059929303935cde67b2ee6a6eb240a542a0bdccaf2bbf995febf101aa02fa8b46df844b5643403000010042315000028100c87442271402498e8c22a7b14000b778e3e76582c1a089324c7511404418c318618400820001162184254441c0020516c50695ce0c5a843790fb716cc6ea340f88e8727bec67ff44a591a7d4a03d016515bb9882701a944cf604088a9ac816dfba7aebf6559b1951f11acd87833f99578132e8b05894b0396bc3c14fda0d81c251ae4becb11b87d6df5b3b22abcb0321eda997ccf0553aecfa2271e5203fbbb049c307d2ddd77ffdd1754039b8b1d2194851b34e639d94b16d7181c34417a142328fc0043766f574ed165c011b932275e5aa5044c2139dae091585a8e578a2d1336986dcef41d8a343a2909289e66c6fb733806b46ba64a4123c90e2d87cd49fc6e03bb9a0322f89e04b7144b6a4664b0e235b373cc9dbcc5d5e9d5fdb4c8ed074022da12347a37f75f2637d809ff5aaa49c1207e4dc0ff36febd6f733da9323a466254a02390fdc1ab8de241832d2227f81dc8894000d566a6afda11e08d31ac4a34960b097c22b653a056ec1c9659af2a2c92d5f952168d6d5986da6a861728ed695f7c6c98bcca5dc585b20d0518e6d7556507c6ccb4a8aa2567ab12d6b5f718f3e062835b4ed068940d137ff25650e8471bd865f927fa139ddf988d7bf7af073e58f322439d70bf6c7bf81e675361d6008a9efe03c9fedd952df8c548de5ae9927cff1c0ede0e57e01cc7b5c0299081af12e7d99a239d46af049179cd0789f2245cb38d45bf2015786f07f8e1a444d1c025635f92dbaa09a50a1de1fdeaf02ea3ad1850150a7045f6e050e9a2af0c47432503e80f843ffd477f8bce44b7a47a9ec4daced89ff4d5e0b1d45d5fc0c678f68eacf4b061d677700538d4a1cf10b87e09d69bf802f9217aecc4edf23d0ace0ceaaac108501a41eb2d5ddc178b53990499e3bd7b804cf315ddc373618138c396eb1b57f2049a2483ff4f90f0322dd830fd256ff00c58a483c6fca47dc0dd3bae6e76f484a42bfe1f7a8d396f725d1c9a65527795a846f3d77abd5516e4b1c1648c87d555170d21316494f28c21cc8b32eba08697c5b3e01b72b4be9a80c61682a1861b4266e0a026a09947b0c78eed58bd7b674232d34f3ee7f09b099ec69e57efc7cd1c6a0907d1d0b3299df18240ac9ed79905926e52d70c2b08e8326c3dfcc503b8f21d7e589eb1260be009d1fce33223a67972f8dac80c55953eb04bfdd6b53088b008f77a3471df79b12c164b189474cf3efd82833d3db6ed2baccfd79e45b364011f2ad740de9a8407745e2a8d7de6218527b48a82ad9e5979aadf0ad542059db4e4eb07f06d3b5a0f0311f719d8e85d7f1080d21523f8b68c310950d4300d1814d8d7b32127e42d4b5553eac0874ad205acbfd234958e4a54458423f57cba213eea0326806bfd7a5852a4fbbad310b100e89ac16834a27c0019f7406e91b94b91acd056b1e086f0326a5e1fb51a64bbeaa56bafaed72b597588ecc825c9f9f1d18b473276ebdea571e43284a417ffad8d58c788d207cdded3c885732d27e8ba41f2c5a5d03f1765913064f5e9dbd73d28da823dbdf12dc756b1106e6793d369c239adfb7dd33f786536e4189798ec9f9ca3cc61a638e4a5ca04083d6548ef7bb3e1bab03d208abb117d6662c2e16ed826661bd35e3aae3426342d13bb8e7c569d7d719931ec6d173374fb16bcecf9b05870168fe1508c6eda0ae5867260ed3cbeaa26c4815302c657c4915a5af1328cdcde240804e073031cba83425810c6b8013a379c53b30b17e3527a427b35937213b184d4132e9948f5438601f71afc250e2c874f691eafb9a1a88252063870888bc49ccd9e60c85ba3651afc0b875d9e0f69f5910d01be54d96a5bc92d9dbe7c20450de810987c49b1ec4a39c71e988f3981762514d65a19446c0ed02a648abf4b43e7910c4ee677dba24382c020ccfe9f8c90c81c12fb4c9a675a66fe31cda40caf4f4698734d3d8d1041ab89e910b5c700634d049f665aeb12d6fe1c771995dd38518b11a01f0fa0a3ebd4437b8733e2628aff07aca3fa00d3b69c9fbcd178bae094903a04265bbc15b8b67701065c920096c17a21aa166da90b79884decf2d5da173f54201b7919997b71bb9ab38089fdfebe4cf5c88ad97802c2ca559d966c49b1caa2065e3bd18cc909659a7da867a78ab4566445521db5e200f5698186f40151831a1404ba072a1cdf1ba4319e93458fa4db89c9679a2b4bbd895ba381cf36372b3dc9bb3500e6dd863033007b6874ab93f0e2d795e650d0d768e9eb827b654bc44a5cd6b404ad7d646d3ca8917eb37868c8174fff3eb4372d147d9d1ff188e24667fa9ee0968a7366c10e2c4cbef1adc26085982e28947bbb1c907cbf8363e5a3c4a5daddcf20f8e96edd4c5060ce4b4d5102f4dbe2cfdc6b523f559a4b7b4df7592db24bb0fe1038d4813adcaa8b42055120979520b5ca66ce2dfb229f4be442cd08941a1591ad89622a79db854716fe4a94c5faf8e129cf94de03152c15338c9c68a0790bde558927e4fb6f28b26fd68c55a61a1a8906bd6302deedc17b2b996b196186e54a13cd3d7c2c407a9e284ec8dc8add9b6fd1049892eaa0451f25be43898ef8d567697653862cc6bc1628fa5672906520457d2bc90a4df8c8ba0d041aad13904562a33b797b1bf06b63a33bb5d9602cab57fa57b4c9c729ec3691d09be1f09415dad8cf364190135a7898d270a88c1c200671b8e1c767971b892a02dca774301a69c277232c08c7739d1a0ea04b05e44f67a84c08d1900afa40c3b704c9b44bbef45b57eec3fe374b339c86451ce7300f0d58c0c92cfc22850e9c33d3806099e4dea1b02589b7d8a2713799084703ca7f4e5ac476d70fdc7a6979f264d810747871fca9237808392b5bb4ca721f4c99a7a82070c65e7794c4f35bc4bd1aa66fe42e76a6de91544f5e6a63d7d77c9e190d0f5c00c91a5bfe856dd3770c5e8b44cc5a6b145eb348b578e9e2c74c6b9abf4e4c67c473c8e91b57f595d54aa527c8cf69020f5c195dc4f3cb351a8ff6c5aa761bc46aa706c7a7d915363791a760476223edf30a6ce021b82aa8a7c3aa20603d009d37640a3d91e0e26b0c0eac4d5165ac679aa2884cec34761f38dbdd1dd2ec38dc3a31b4fb88812546426777cd3f8d24dd4840b301bd1f0f7945cdc8efbe6fbaf30fcb3f6033def57b0520255f1126e4605fb55d2544a1d3df0f77c64eef6a49dc46d89373c6989547b44d06925186815edd9cfb0197be2352f67b36f602d480af3c620ed5a206320a36b1529ce2d9b5038061bf04e5de27b0eda846f6623c4a221fd76652cd83572c9f2391b4600e92d9e3729e0c005af50d79013f851d7c98144ec7d9733a329861b046ae76e4d228129d8d46fcfeeea1580586971509264008285f2bf81c6dff8e9b3efba76dfd97bfa8fa2400e1b00a77a75e2278d42852a52d3037e8897d437e1afad513ba13b24821b0f604640821f003706f93e6f1936c0802995ec54d54ed25b18e5a9e4877c72b7e3f9b2e61f8041f3cdbdb019f7f89a0e1af3fbbf76140ce2bd03b89e16b36e0d52b1704d020a129bb7339b01ac4398c614162c0be8b55792b8cba87f93bb602ef2ae0f499b9191132c82edaf336c43a81e142947d037e217cbd06c9256fb496e75d4cb0a48cedd2cd3ce05691a418996e99ef4734b59626ff43a8677616ff544f830985dc9ff8e4668a5ccda95efe497fce8b890172f6ed0d254119ae31f69affe67fe8251055c84bcc7c1cefdfc6a007dc9049518ae28c4e559c733f96acb5e5ce305cff268f0e234be81045a5e9ec4530f2ebd060c813ccc892bf88d395782fcbbea4ecf2f9e95f91d090f47b2c9d1ca48058de4fdcf60ce8ade0916b2cfe757f6feb9d2bbd9f2f66990ff89d46eb16f31827665765909e4c5d2dc21d2706cc273b9e69fca00db21273ed7c06effd3a3de8ebe8506f5c5626f40927f7b3061172ea62c176c449fcbd5c9f41e30c4f8818017b9ef54531cf731415c7e875f283e601d9d3234f4fec46018ab325e6e9fb0dd8bd58f741a7f7832f8bdb81eff1b8e30bb2d955ac7c7643ea6d1a99779963d6a4d811629cc1975b20f9af9eac32c67eb9b67ee3e18d48ba7c6d8cf7ffdfeee7fba579caf0ccaa756587dd14e6aa8e49e8d79062aefa82e723228a2aac0da806056f60346e1502c376fbc55e1c7223245e9af5b09312f819981dacfbc1105996e88f27b6d2a260f2b6ab12d9b3386f80d78b0951874f8cf63133dc63bb2ebbcd76fc2e8805d8592c5685ca52edbd920df6a4b53718ed2d791f9005e00d1ef679edcd3ebf1719f808bc9c700ec06ace9efbc31d32fe3d033560c3a88cef583e0e2ca13b574c13fb9b297b9d74effd5a4640313abc947bcb48235e330b49da7720cf9fcccd159616af63ab41f5bd0478a8a602d9bc9345c76a1f2c768d0070bc2df3b9762e401c97e8bb2f1d1c6d19058897f729c16fc1cd33a788d110cef8c3e94e29b425e7496b49b33c89321d1774aed8e672925c966d7903d63a11b64323fd284267a03a1d5fa3925e58e785e51b5fd4f6fdad90eb72e7815b31d30f266b8c2f81da0d6983ab8c9e22618eadae426de7031deda7ca17804ef99e46544911d6a769f6ac7b23e441bc96319da1c8323726704782029267afd29635a373c2f97ff12136392efd0528bd44f635503d2b6a7aa3dcb7de011973d9547c7339209d46e40af776701ef86499c7628ba36146d1e12433b552fe630ac42bbe30669a6e871ef3d47e93023ee883ff5300c865707eec9ee9a041f818cd4188046798c741828b83c06ba351ac3a22b6c5d6e905d38ae6e37c40f0eab05871c69e0fcd2a190eb4311cc53219b458caef1b33cf7a71a8e80fba422cc9bf201ee431f7a0b6e77f411ca25b0cb22cdec8c9042bf84d26ef4de0256ec37278ac8722e894c203f5feb8ca2797a02f9d3845afbc130b3d9ec75f427cdd27f7d0449b07dd2a95f73c79ce9038fb03d2af94f4745114b63693ed184d4443adc1c26e7d5f5dc574b4ad1ef626146834229e5c9ed63185b7ee020c950d1ca715589b0a95cb61a2637b8bda10120a0335f616e821e4c2882b6a2bd8fa25bfa88924d14d7e2292e54eb4f7233ace3da17fa6f32ecdf3bf3a4794438f3b9f832e73723d0d393d5596eb48501bfcd3280e11c7b70a73b08927a43c4f28ae722771f07780a46e16bab5c3c937e23d8b55397514cb3a5cce89459f55b72b4088b91caab967ce8fb007747b3f38a3377c599d1fbfda1d4a7ae65002face8fdaca2b083553e87de3f5896e02805156e0d71ee5944fcc450d3938016013a8d0d709d97fa9948ef9207cf2e620eb3f2bedb7529e3901a75719cc88517f5102c4614d6253d2bd9d7f3ef1a96687742503a0360a71dc85094c76be8cda0590c17f0f5856b6c8e9c04d9816f8fa53b6c8394a6c2933e093dfc453042707d7f22f6aa79bc4e0d6fe2cdb17eef233ebdeb8570bbf30a952a69d90df002c1a0480005cb8a6a12713e7de42142ff5848b3fb7ca268e3e2a3b68876b6393064d894b7326f428824b0042c324be77ff4145704f90978a4a6277695ee7ac18805e2ed13220491286fd1039bf11f3b1610a83beb79f175b014af4ffe380c305f36abd6dad40e8e3339f4190bad78145bff7d0ab424c4e3724da2d3e20512c82eeb3075a5f26fed40f12974b1644aafa62b1e97558fc072255533367b0746defebbaf63cd091f31e5b1f0a80e5c22c4c34e1ad68eb0da9b6e09e9df2e4b0e440f8f10812b210395bc14e20474f06d54d54ad78ff27565432b1ac53dd1d64e3d7e9ab7f50875a3c330e759e76a60d351619070e8a1437715316f07157f0333351c899deb20820ea568cb675b71c669325247b479216461feabc23f2797848c42651ab3f4976d9de701e71d5df03180524ae6cb38a5c900f8924638d9271e1d4aee733217a2220062ef1ac5a6bbc00a09b7bcef4cb41146fd734fe0021f35c9287fadb76cde9ecbf00a4f8639982f1e20e837f12e970b55d1111850b10aa575306cc6c88937e41ec789a0f81da85df593a2c7ee0d7185a37efc0d726ef8a8daaa73a9f1b88eda2da7a2624a503349499692a1686c99990affad100801a63f31e2500cb32ed3edd8d85746625b5d94d4225971d6647cdbe4bd87d8bee7d788c2e16218e7a432810dcd67bc6a09266c149f3522282231aa885afc0dc742dbf2a0a645f40e10621d709016b6dc03aa38218ff47f8449dac78300e3abdc899cc161122be8f82e7d86395571c8db99ddfd8a92c2efcd3c0e9c084420cc8b2aa7d4846800d08002259b3ac371590cf50b80d50abae4dadc004c6fc387daf60d0f73e51a4ebbdebd725381e06c13d8afaad461d4bdac6dfb347e95fed32dd84707d07f32ca6244b938a2df10461f6158af9b71d3a2c966fd4e73dea272950b851a9846c02d36ca02d0b4c621e92e8d7300e05c198977b57e34aa1f504a2cca1f7609b776c55828c90c35a604d1f1af9e1e7815fd1dc88852026cd817d3d94a7aae6155ff30f6903703fc50f9ff9eb9f32fe84aae19c40179be7c0e0d927fcceee2312394cab7500696461cd20543469c71922e4c15f3a2840d5407946cb9c13cca6667b9bba34ef5563a2fd26b26adcee9eaad40c506deb068c87c28a25ce4ac7193fb1981c7e03c56ccd12bf8caafe96371002092766ba901f13c105ddae20b71281e304e62c78ef5ff360869eb60b84e979baf76ded16721e89990fef9757c959cf270fdc9007a92d0fe5860f744b21dede2b55f9f9facbed30acb4f27b4623add5a6a1bd44b4074fd531a3e8219129ecc41d81e185dc3b0467fb2b3193cbf141a8f30baccbd51f155ca065344ce171ace7d4a80585a11a6c073a9e3282a338de6fd909d7a9acd2c9685806d11f6b7a7ec843690d08de4758ca4c016eba7dc9475158dd36f00990189bd5b07a54f0256b2b59f1f41a361447127df7aa29af93fbbb1ca757b2b221c4ff0b4c464656ba560250a491a1fddf9344815e6eb19820539aeb0d3aa57ad05424a6be231b5624c67f5a3d28fc18442dd08512d909714dc8874a1c284a204882677679e184128b933d9e96c3a196bc83fc902ed313405ad257de8eaf0c1ef734314afa34d22b70319cdc419cebc698275ad5a7e0f7d0e3ea6634d65714e8183f24c12e8eed247cc5246843acba50287daac8dca394037d93e7e675890364fade86dcf4d2f603b7ed025608e698181ade8fe74a183a460f203a03301d1b6d687b5cd9af18f1266299f29bbebd3d393958679948eff17f5d158dd1457c15827d625e69fb0d0994f255bec67998c9ed902f3154110514b6f2984cf68f5cb7832b6808238148056ba51412fb86afb38d65140d111bf3e1a0d6b5febb1cf09dee7ff98f06b893b65b05a6871d696b1708848668c8621a0858a0aea2316c3a20e1e9346114f45f2c7ab3ba6529b167b7dcbb1f478316de045103127f2830ecd763d92e2372dc5be9d1daba5e0b5dbec18763e8256adcd88c32cf1623a6f54e8bcb99bad1a52ad75c164fdde84c114f6257022b386c038193941422130a3cfdfeb95c416c53b25ebe54777de417e7a79865af4a207329b3f84f366d0a115a3919490b917ef14941df2c6f27cd04f0aa8106e628e92c76b386abf9a35580c325f239808d13633d2359c95f935634f16862110ff3dbb64eda2e78e8b3408b41df9a142ab8e066798910c42a2e2c86f778a7c4c39fe0536876d398fb901f780516ee6f9ef91c001a22391747873aa6dd654e70d66690494da4be7e5a218b911f7c3464ffff6ab5c1ab906105991e9bedc147b01a25e2358f3e3eaa9f7e2cc1d9d06870495f6b00a236a19e17dc205baece553bc2f94b87286bdb113a4d907e11fb802b7fe0dc3748c6ec3ad468e4b3ed691b59714e2f8d78834f7b986706e245d9c5cb9c345d7bb1f6a1137232585459feff0a33b540bbe0f55bb801b70a63ee3423c03db16171fb19821ea326dfe2b6b058de401699069f75d3126a97a81111305bd5b336deb48c95a6c1d60130176523c1a6c1cc658912e047c54912e0da4c0514ba39f9e0cc0d06cb97dd6c367b37d6e4b20fd160b7ab8bf4bdd8fd4ac9920bc6742307d7814a0d64e44f9b0270d492111e8cfc43606b7f509b96ef2e9b1afea5e5b380a4cdbac54b35c5d77e0a53649601884b4e9dcc7265c8e498f944bd43268364c9c57306939b6bc52edec8054d740555c151c6b366a55014353356c4151efe858e441b2afb29f095e4aeeca0a9ac9c91e50b5616c75e515fb0bf67b528f3938124b02d10729b82cb0f88bec6836f3e3548a278eaaf5e6adce52bb018bc2404dcdbe27e4ffbebb16e9d44cbeeddea399ee4662674a28a2ed795576d3dcabc62044de2618792823058d130f0f1509dba8dc43108731970f7dbd05fa5ff17b93b6ce01e5141f63c36b34d11cc29939564804b9cf98fa249f296e16bbef9e1a791500b98c12d3713c4ac9a4cc2366519616a1fa155cd1146e33d8d35c111406c1e900cdfeda1e2bda1602fdb3479910d1254cce02482bdac45fe2188feecdf23492ab460f7765237debf4fa8f7440004671866716f439c3939aee079ae57790828fa349bb9d263a6fc53de1aa65f7c8343b6522fc59a19dea1efc54fd92e99485c3eaa8bc392d5adbe0d2c742cc64d08d007bdd0274dfbd7e4e16846dd8fbc017e984929526eda1fe97c23e71d8381d45648df37bf40dc991d9685a022fcb2430f73a8d1b755e18dc7a335c21f25552c127023ff180623d74fb8dd498c7c0c53986b17384ca4e0b1a67b96217030aa7a24d6c39dc41cb2103491bc06e0cbf638e0967e4d8961d5c5371bf354eb9a6a7529db08ae3ecd5bf60a94215cac55d92a107263f92e2aa3d2f82b120e70737471560f7b132f5d6195b82ceb476ec9a9f86afcdde12742402a5c9b227e582e934e83f8e04cc31d5072c195b491a00ec454738a82b297e36e1b334539516d6f86356708a0ad91bd17a3e2861af30ca145f18c7c98b646ad40de9478993f9918c256e14240ec424ff2200c2c2e9ee77c057e3cedbc9139e2b92032df6e4764cfc00cb65aae672077e2949452beb6341536ef657f79690eaac86aa564a4ee53279d7d0d1bed754bcbc7a245f24a7af98b0d3441b6a1916bf360ebf583cb3968289a564e3bee2055ff209388f81058b852e52243c1c49d7bb9553d1a7b649ce25e6c4a9c335932c39808f37026ea32410be16d7f918bf9d65221268f8996c39bfde4374b02342db7ac237feef2f9ce33994f69f633361f40cd70a9e6550e6c6c6336706df0950c26c55525a9f44bab34ea4a8afd1217c9e9d685badc00a47e5b009e6b15417f3c4591815b1640ce00f2774ba163c94449cef009505adc4ba48b53c434ba1431f1f818916286484b6ccdeb4f76c9259676a760d0f2e9c4695fecdbcd208b0e41e48ed125ea7a28d9be7c7e9565f5e8c921f2bce7c1fd8b03702d2831c039864015159fe7ea8654fde8f5fbce48815bf8955762b616da05f0e0887f2bb9f543611ccf635d94c3a751da38183f71316d079c35b84d7a9e628466c05a04bdc88d3979fdc3fd67c08e578541e6bade0e3161a7a8670a9d294c18f38dff319506a02f9bc8ad80b10d6cce1fb2e68f083b03d83cc02ed8640bd439808fa0e902e9b1bdb51c9db84a41534b246d4e5c3ca981264787129b1164a8d6456cd57d4187f155311b785b7f2de477dd1147a6c114e445221a6ce380101048e1501d44f5898136505f6841ce181730c0e68bda980f9804f9de6be6d8c04235a470124c35c3275b6b78017d61b3f6b8d436161f09091c9ae7db61feec1a27c02bbef8b141dfb41c8e1e268841a225e1fdc6237f6fc61461c18aa4161d06920ffe6744c87bb25d75a6308343d378e13eb44ee71f45f81b16a12a7f16725efc8cb585028e814547180d708f0a2c98d102e0f5a93cd99ac08949ecfc28accfe672a8b9dc0b44fcbad8fd1d461c76a4785d57f3b04ad5f994c4f8a3f60829484df216ec4399961eedee8111bb59b041e9232cb2e5993bd508f2dd3f02caedecf428c0189316ba87f4fa5819c0a9da6a8396dcf9874c9bc4455af3a5263274cea2697faf1f10784c703a3a8079ccc0f26eba12497080e1e73aeb9a8f995a63cfe5a93ead4e1d7ed9921c0c21b78af7ed9d9d516ac8d00726dc9d5c7922829ff2654d64ac3df22dc3e9f27f78b38f3f6a80d63e1ddfeeb59c42768c893168edc5435f85e6a135ca7173c5eb892df138fe7099c7c8829fe128ef49ab75ebc582d3fec530e87b688670d2b3f51a59b437289555cd744da04f10a7100f8080d8d13915d5029a6771b63da6340bc2c2b6cf1e7d87b1df146480e60fd6c53be531c02d7f31a4c50820e5319c61b4931c81b57f89064d8a1f5351c85386f431286892426ea9e95c099215f68c23817d38315e580e39936975036569855f2024f0f339652b4c51e85c75740ae3d9fcb882437dcec022489ba24b4e6993678fd4c85cb6493e69b4ac192fd4f77afdd3e09c51749d9b93a75d90c5ece0c6bd9eaa3a37a5612c74ba301f3eff94add6417bd2204c220f90dfd1c927d606604f87ca2dea73556214ddea13d917414d96099315a11c3d302b2b70961aa432ee50dc165bbba49cf4481907e71258e3e5a0734d19c2f008206abe48c8ba99067c19fadaae9a0899c96abd2ba3ab69162c91a215d5da5881e614f751c69a74c5d8ec0541a44321a03bf1bd64ee391915cd5038d361e37ab2792ac553080363067d2aca54e2722fc544d63423332d8bf308cc08e3d08c33f425ce8e346d51f7e7d94c3cc1d1b7fa20bc3b0b457824f69f89454ab1e1384c73e0e64fd7801919cef697dd5c24df6385aa71062d7e3a04952949e71af3804bd0b3d400cd8cf99a4d4460f3a05c4942d15477e4143f86439ee2be46286be9d90229b1d7881036e0aa80270a7e47164d5b8fea73ffa9d7657d06ce2b364414c833e08604ae54943f49c1c4f7c89eb0bad3a643f4a7bbbd4814726d02b7bc29f6731ed9445a2060d0938178914b0beae8f7e099838356247ea574a3f9f003858424155aa5ec5f318ac715bd218531d2626e1eae94eb99eeb1660916db862ed52f8fbcb132f1c00e3c1376729e78b6e1d22f022392c56cb67974b5fb413a1cb33ca5dad651c35be0ac24951fbaf1c6a8b0e93eb9714428b36af1a3c5f6995523ff86ca18ada0e1b6cff976b0cbbdae3162c284d0474c76219d3142c86f1a0f83351ba91fc487d863d747aaf3b0da2d72cec230043712e2913822629c2d91c62a5338c173fd7228d4769866bf789bc1e85307bc81fa78b8c26c24921b415ef83f2ab4875353c289c387a9e613003ceca0ce96edc0430c8f7db88a81a27067ae909a2b2cd2c8b292459df237653802698c8097552afb80ca8ce6c782812248c4bba259aed93063395176eba28cc17072f5e74c42e4ea9081ee104b169026353b9b976470f4c72e6fddd8f1e26616b5677e805d3d2ac71d51f895544efb86f0793ff0c8b699ea4626fbb2336039e2fc34ca11fbf1aea1ff22461fd60bf7d86bcd6f8f9ae30059de7583b8205e240f05a6f43b61d1a23545c3d531801e60f5c0794345072ea829a7f5084003caa1404b90c9ed84876b9c9a7499308a3e0241a4715f779a33cd5f302756b22df7357fb1a26bab7bf02d2aeea1db427a784fe1a9d878806a85b1fa13fb44416ebdd04746a4245ac7b06423ad9b21e193d5bb0ebd73db5fe8db522014398110173f5bb90341e0d9d38ac4f0990d553be5215d6da88cc15fb5145562bd38466a40dc320aa757493a26e4bd8cc12c5200f4c601ec99795c9210c916bb8941452bfca5eab46cfa7f1f174f4044db3d25c38b3349c5675e004c4d29afccbaf0a363e9610678b55dff82947071db794d94d186aedb80f6ae695c2194f3c7cae24d635670899d996977f0b4e3d4ef54190f2e9eabecb611d8e7836551dbc35009415cbba97e50b5a864094a55b5f20bb49b14d7e15f64cdb496bd219f8267b205aa024299fc8a5df6a7f3f7e94a12bb25854e64b6e281aa943854dc3c31a41a6450c3e1207acf8af9259f792fa99350769d58b6df6dbd1522e7596b6677b66a3f76be6f030e06acecf5f68d8a40c61d20a2bb01c22d8006f467573cc7b600f9bf859aadcf1efbaf2efe1590c3541f316428d05647046be359a52d6328fecd3f17c93f8f6847b2314e552497b4d47dfa1d5c91966a806d1636ae7df95be10bb5dc3d0c5b3aa1157770cd26017947593dd2910fbee83996c68d2ae693c959c7a732c8f3d5e9298123b66665c4cc6e24cf14022179dca80aa8292124653762758480566c448f9079840b2df1d0b4a2b50f644264db1291326804cd95baa7bd0cfa24e649777d366b895cafd16a72b0208812025fa3752c8e5bc6818f5c8ebda7fdd367d7bcf3558e3c7e05de9430f1e5672e579c507279ade88a4b255c3e593f410732bdacd11f0d6ee8464b71c0023ef79ea2a7a406dd5e1be32e97c074e302f73b5d99661b0c36efeb5c721d8297b8b55f92ffe75640d633ccd3a44a2c29f639a6361e462db691cf6b32444d6fbb6c88dc21d63b8db2cda2f012b7b46bbe2b253f4a63e8d0f5c2f637fad48f901167ef8aed89c56b4e7bd5f515c605b809ff0f41fa93b1eb003b85f02ae24deb775aff054ae1a8ef034aded829c7a1f7ccb718d58ff522da9f9393dbd1f130bb1dd5cdb6ee61ac3822826f9f61a678d6f207f3edf9538b5b9014848674b5071b07307b715b5b6f93c871ff56b835457f63366df690e1f806609675b9b6db0af3571b0f04420ca7bff53cb0fb062a0c609fc715ebcad55fcd9497e4e898693c690d7153509f252df84b7e9df9533c8d022876f93c39e017aaf07be45c268241c50b613a830b550dd77e7c9180ee43bdaa5916cd223c1566e96044b96e8053556bcdbe2a5c3b903eea33055eb817d7c36aae87d795f168247f29f19c195617b2e40cd6179ec4bbc577f86cd74d46fc1dea01a4f31f0cf07a7851a87fe99d472bf65330d376ea7cd3a0fe1071380d19a87dfe20e16e7399a10ef84f1560b71b9edc08d4e2d22a6f78a89e383b1edec4140b84191317eeb39055ebe31782fec44a591466b45583cec81642b3a89a6c32881be04c743bd5483b7d9757e0cbc73c3eea1d1155f35bef6af62a5a15b48e58589cf7502dc6432c0da755dbb264a596e9ff0ea95e14e0b0562b6367b27442107acd36a6b2ada732efbb8346349a3cc2b148f8e5894cddd2dd0fa54087e800e8bcb067228008870660f41e9614fc98335cbaf334c659e3fc72b442c32f9f9e23840b860f11fa5bdc2bc99beeecb108f33be8fc359cfb807a56b5b661fa08b1cfd2ad182b3eb3d0f32cf68dc0ba23bff5e92fbcb72b133c1497be6a76886014ef1fdd09dcdd1d58094a7ca599d2c0fd99e351d9695d3dc6462e97fce7b823665d7c94140b893c51efc054de99e2fbd28fdd14b80515a91c98254199a9724b94c61a4d07c3cb19c8ebabe8e3d1fe79488b4652dfe9c0a491f67094c6b0602ac27d3e8e59a6bae0f71147c1d6da1bdbf6cb046d5f7d33d07d225e9cde1d3c43c479ec8428192e2563bee28ff769ab87badaea5a9cb2478527cca698fae8bbf59ac49fb63b13e712d1bc2591f2ab0abdaa9d3e11d44521deb07cd5705d453de9339dc37128e7ed3a52a8e8f8ae270ff56b3e9aa27b596aad85546b9f393cd7e05cf82d89f46848855f0d46a375b08c35fa8b37023f32bb39202bc853543d2b26be7e00dc077438d16d4adb5ca5d8cc13ebc0edabedeaab6fb9229a9cb80e6a4ca9af6df21142f93cd4773821d122a916530cc504f05a0e789dc6b5c4d45c0c3c587944c4178e3685b2c496e4f523d2499a8ae5741501b48646f4bc853c7d6ea48356c717311763a3b16e1e8119f78e78835681cfcc4a1d88308e58659ced19cdcaf467c6383ed4f522cd1292b6d920e4a3e8890df8d0a0beb3729cb54ff02580747172ed7e1a816d35123e32e336c26cb58e608705a78c6346d54f105dd93b8849f1a13da4733d8a46a65b54d2af3399994de7fdd3a6f05446c6a8ddc0e9908c15dc15cacfe11061ac56d0501bd066dd121a212dbc5dc880b641977c325fdfc57cc020f8ca1555e45de688208b5d3533425e706c52bed8dc4a47d5dd7c4bdab9348f25d3cc78f00d0dd9dcc4eba2c731b3f2a7f822858930eb8f8a5b24c8ae664f3b736fa65a9d7cb44e9d7f287492555acfd877544a9b8e83dfd1c2c53a7eb1f48fdb7adf90333a803b247492f5212cb69552b7c4e185fe58c45a12eeb2975309a4cebbad6fdcbe1b25d57aefe23ac25cf7464591e8abb495b4a31bb4ba73d06e290a70055cbda55a452ad41dd15add8b1ce9f8b1158bbf5a5d183bd5280393ccd0e3a42d1779d5113d01cb1539dad3aa061b9e30093babc42a2127fe57d97063f7798610b747f02c495b55f1f4a03a38c706466cdaf789eebf82cca093071bea8499e16fa2c9b57c964415419fa240267b33a50031f358b83de58360e209e0bfb43fc69979a47a799f8a5ba91165129a9f4f59e2d30d61fd6787640ae1cead847455f7d5bc35eb7f29ca7441ad3964ea300e5ef3ebba2bac00ad87d1886c8cc178bf4a13493b29332a54fd01f60405551afc63ec6f9fdff2b4a75c95d80d8d12210192192c6ba568b2d93069b8a8956c10b867d5e442e179426a2b88b213bba8cc037687aa499e0aece384522a29388718309f40d5f82942e2a0f337296f3328f75551eb46ae97225411cba07b7e4892d3331b9a570f154ee6cd99293d4e7d8525187915f47af3c6b395a6270a009b0b258fe00cb0dad6f668d1b71a335a551ec3530321c3ab8a04085574af56c120880866cb76a6587993ef5350a9642e810d2f4f32cd927575943b6834ea1785424080958a12a918d49d2a6be5c1a84d987a5fb3aaf54d8c51aa439b29aeb7d901c9d0107f42bfd1833a87713aaa22570a4f5f96103419c0771f667c33e5c4d444c38406c5562f7b2c145ef83ed86bf8913f5f070f3e0d047c5fd9106249524af2ce9f384926023a33fdf978a4c6df9a03533b524166c5c83334bf89bf4937ff87a76981b750070583c7919014c5835284a422a9cb317cc2fd629746718f3726df44b1c9198542d805a578327e6f1fd548ec43063922866ab83303c1ff9275319f10729824c1fc63a4a9d9b0c89040c238079202a7d0ffb2b69250761152e280c439a2248a70ea2cf3a5a03139a7509e1e3f7f59b602039686a616b4f5f9205e13084a0715fc243b0b8f36239c78bcb3f5fa7867569fc3fdf250e8246dfd16d9601105480788348641dbda7250e6dd392e8bace96ae0ec21c21ed4497eea5da02408dc13a9481db8e0f166cf55f9f01bdea053be32c85d1fa2fe860ee6aa0b9eebb58d8812cff4b624c8a3c1dd43d41e7dae38e94ff6df8298a7fc060102b0fc378415461f26c79721b8faa27f2bffc059f603501228034c3430c865ca3def301c5462462777aaaecb279418d7a7b7d688cc9574cc3ca50094ce3e4393100c51ba8d026eb1888cc988c6d6cf36d056b4e181798d92b630d43b25cf3f02195aa0d4883828a997c9616601e8cceecbff89af12881a496fce5ca5c218c76cd7511add428eba094f587f0fd928198e559c1583e3cff159b1f98af8d2851ee7191ed3bcbabf45348451c26d16910c2932fed577670a07b4308c53ea14ccda7d415d5498c8ace6a6460bad15ac5dcf1967edd2f14610e57630a089742f8a9b13e549ede8ec60dcc72d5360c1dcb25d3ebca23e3467b8830cb08ebfdc9d125fa27c2e588d08f20d2a06632d94224626f56c524e9368bac3a26b52c9a6855d47d72bf04ec0044f52131a431468949f7251b3589fc7549a89b931e9df73ca42375802ee658763eeb567e0698187ebe5f7c15843b7ef6c2f9b375341ef43cf77afd621ba74be86555d996fe834d8c11c1c753d0789ba37669a0996e68b59e35ddf31edf2b04c571cf2433c5727a0b32b1d159f77c60e29e556bb81bdfa3b6b3346f88a0d55a532364d5fecba74da018e715d91c9128acae6558a70269fc85e1d904b20b0aef87fb5b1566f1123053c9dbe3db0d4933a239d53170007ee0119558b90cf63d961f5c15c6992ef22c95b022134317106c7d0c56a1036ac8e167b40d2a44a4c62cdadd5d3c77b74a513b7401f98c682b8b020215be21cd5111ef0ae699946c75f7bd5577ae152761ad8ba03fc9f2f097e265a379b954e2fca6575a2e60391e2e84fd160447724e743ba2571b85126a1c76fe514a1c3de9a781b2da681954eb25662ac8715f2e5069ee3752e78185ef019f9cdd6da7c7dc8a6723ec04ff8f543f441d2661d9a808dd914b8cf7530e1d6de2d74c6a9de31cc5036250388ee29851f0e85112066f01a04fe1ee405592049484b0793105390ab6a5dc7168210d89269914eca8fbfea500c077f28a69ce1a366a38fad2093d0cb276f721ffe4c59c1ba6126fa8ee071af515b3de22bc96b8dcf6a4ade847a01d7e4135292718a2d2e0add0384d7a79d3e56cfd25428d885e55ffae1f5556d0ee2f5587346c220e8003bf1a7916dc3ca915a4c8e71b2bc18b5edb5e934e8625bd7c7c29189d842c36baca0a7c06b4c1ba8f1a3579306f4caf559f016df8a5c5ae96a902a7c040f91e3c5fb9848df1702bf09e365c663061b02fd199f3d162d24164533affc4c8f6f8bd8bdf3b6c901e2178e43a27301a1c5902a1eaf1fb4f85e50cb5a2c85b4c02d20a4a5bb47b118072765f140e32963e40f5557b9222666ce8641b8bba8e5c592efdf3d38c801c5aaeba71183ee74c05d48de3da28b21bf531eac910008b6a7c3baba9e60560f036c32c16e6bfd7deb9d16896f5369d2579dea22aa2186a3869be52b3f636f34ce97c0de6d9601f8bc195c59288260b8228852f382aee59d7b668a1b763ddc3134f99113ba7afaeeefaf674025afb1db183dce84c915782a9228ca94834e4cc1f265b5fedb66504aa60d1cd82d548a830e8dea02aca52ec47fed7cd5d296e693c9f7ecfc67a80cb721aa7419db0ecdc2c08d6ec1401428972bdccc593043a5aac9bf824b70ca074d7f63aacf9ba6e72c9a248f78753b509971f0aaf4e79f386e7c1811e8699d46217d87a31d101becc98f8f8c757e510dcf7826f05b43f969dc401b814051845c36cff8c00fd1331ef31efb95bfa324c0cca391282cf75258585e3346cd91b21fe5da95ab2caf814a6784396b7469f4acbcb3603d5af5bcfb15c84f3bf4c6754d404feae786d2f176fe7783effc714a0f7910cba6f00bf6bc4ca2da359ed3734c5f28aa257b84e3a0776281ce2d7902a65c96457c311c89041abf41fc61ecf7647f0712bed908daa0021b0700b1b0c68bd720bef443c118f0baf120fe7c5fa213b5d23c017cff4692b9dd95df857295628c29cdad5c08cba7ce5ba53514834d74a4b660f9f1fbccca1e83e10e89ec0578c0959668fb436e51189053dc331d42a1607c679e4090c6017192103872cfb02f300d47343d7ea10117fea905532dd6b61630d189c501325e06b64d53602cad5aa31e1fbc82c2c8682fa16dc798b0c73216b402a849b564a524e27e620e0855102f3b91be8434700030511c12e84a21d75dd77f95f2f05e1de40da2578d4875106cc53a0864cd573bdac96f65b36950b00ab1cb04bb2e6edeb1f6c4ba90ee0cf09bc347dd955379566a24c742f3ce626edf6fb38ef185be73ece603ca1d3466676a39d692c74f04436c495d269b866c09281724f914bfcf6d0d5be93159e8abc18a72206403c0b50e5f271d7d66a047584f1039157516e222941ec506620025c6981f4a6585424d87751a7eb762dce3a2ea1207608e229a3c72abdfeb845a2660b28ad6393c294f5bdd3ba0527022580a06847c71c7d98f16454a88799e90a43006d69ddcbafdc6a5eca74524bff1002a2ca910682fcf5d991e3173ef3fe1fdbbdde64fe6b2a70ceacfccfde4aae81e146ae88426669d7a754ef29fb52315b25c48e2d84d65d9bc3109bf3c852af1a87189891c9e3260989ce8920dec1fcc835c959d088fa1b5483dec5a5fb397cd273d77942f7389a656c00fec3284ca0fddedb3ad337e8476c8b0eddcef591187079ba00a7a14e1405ffce9f50580e6aae652b7f12c1fc4d514c239bf2a95559663cc0fc85be6c58b023bac754404064b778205e52d894c70d6b31377ad734e5081d885060aca23e4dccd3403c9d535b8557279fed82c690aa12818c3edbb64742ad8f092b6046be6148ccaf2e0363c7d85330eee4afa7237802a6820221863e51e3fd6f9f5c3989db6ebebad5017e3490e1b5a9cba19b40dc91b49f9e914a4ee728e6a3213f33e1c94be3eaa61781603e32ba41ad8a4c5afd5cb9a9f3579e4eccb60e4f8a7739b1432a81a63fc3b5258f0e791d65c7cc97c94bbece688256fe0bfcca66596bc717d75338d89925da126fc4b43e28b0c02d6999af0c197f7ad3d15c4738aba0092ae1952f60891813147fc45c8589f74aecbba9a0827c72bf14fc06253b1971f276c75eb4c1536cc634eb220177d8035cca3cab29519b34cb2d55100f7498bc1f79da8533100e7cb7e9a87b35b5099955e5b47300d6a5fbc880aa020b7096a66bfd34ec19ac5467fdb43552b501ff4a4de5548a9385aa40b3edbcddd0c6fe3702c6137d40cc2dc28974692ea53048e60ba53e777e7ef3f4ab010c57b996431925994d498b6d43c15960162296a1ccd0a4499506644b98dec60f25e7e3ddf029ff067f1b499d4537ee4627537e3b3adc02a3f46cb0588341f116ab5d428cfcd860aa4c1e0d8ab668e0e01471d9597e7e0c7674e242dff7bf02a161d79303d0267d6ffe279dae4e8d0a9be9d9e6c057c8678b79b8afa40e9ea24387e2a217f6c2c4a1e94933567a43242d3a9856c3eb5a175d445abc9a8d09a7b5c586b22d8d0f535a88b6c64b46b4c2f7206ae474fe843962056d41c58a70fa86dbc83c875a6ec6f9cd9a879084ed19a3999aff795a996c9c084b75b33e88f5f374fa92e1e03193c6e45a02ffac065d5ae1bd7d62232c4dca862914b2aeb724f14f498f11c528cdb68b16bc46482c5e5b3d13634d3ec8e67c3e552b4664fbc3cfc123082dab5e560c1aff0aebcb9f4b6ec8dcf5b1b231baa59c32b5578ccc54b109e43e7160ea7207805dd334c63cf758e04362c69d093c1b68c6ac2de3bd707cfcd8da8066765ea5bdea941139c0db092dfffea54808cef8a232694177ab17d7f5c97289389347b83cb33dc72ef157b298766295c4111f8ff25f8f1b38ba00af6074eaee86b17e192db2932c3165eddaa1ee46d355232ee844456497ba8e103a5f6e611e7fe72f900798b31747a88eb6800d09bbf09d34bad628dc7a1b00e1f81ad874619b5f1a8852aa0aef05fbb5b5990e672ab6332d7a0fa638c14a0a0ee024549459dad99a125d15af537c977802974e4944d1000633b8fb48cff0945154ee69047c5c1050e0aac8a581f89c3447aa458d114fb42239cfbd132abdffb87b08e1e15f3354e4944f12f4e85037394897ca3d0a512183ffca8cbf1092e98d3abcff28f118a3a72a0c4f6ee83db674a0647e513684846c39db1c6d4f061eb3b6a147be006d31a3eae30bd86082595a0f136d6993e0cc071c81c9b9112528383107648ce3aaddb6e7be075ba1f4012c601a514368008dd85b2ea506d8719b805112227ff171b2a6c4aeb290d42437939b2442592cdfe67a48ea5227388026a0b21283a8f870281d2fe97973738efb8c499aaf3ded77fb2819a82efade8eba95330e93e2405fb3b11cb012bbbe3a2197220eb55d9de7d63af674dbc1064eb63ea6facc21cb214a1fdf9d8e96f05c7946005ff67294a825168fc654335ba99bb381fcc4216b76da9ecf19989e7097df11dd7e6a4915717d7f8b2d924c35506e02318ee603c74061c9fcc813ca58c1af09d21c4ba754f020bc4609b728edcf2d7c2e4a3248dd5405719c9e98df80bbb63c40c8e8bb99c233688a6dda36e873189e228c9574d37099dbe2dbb8f318b86af32aae615e67e46d290b256fd26a398d4fca71691f8ca390b9c7af221f079b2e02e1072bea6b05be4bcf656704ff2a980bef27498ebccfe51e289a86fb44a365419be647ebd08c180e2d256aadab69c3080a499f9030dd9b96f0779117d964c0c8d0936c88f132cfeee15365592e46daa6f1f5c884264af51f876c169010a69dae6fbc3382f048de9bf61338b73f4ab5f02d2ca32f84f91c45a7ef25a34a9d4daf98d36a26a1592cfc366999369f75d1fda2262695fff49a071a14afa7bbbe72385e9be60a9b21df9e09f435e88c09b615185c564375cb2d1433dda29d0a9cd5eca59376dbe4ee6b4f467e2296a18aa4f81ac02213296990b283a1d36c579e8dfb8f846e4330d139c598fd94cfa777f3081f2bfca1cda029e63da1b946f213f9da70cc6e29afe479444673a73ba945a1802fd87f7f299165abd1499c79da2684f26c901677ea1e453cf7a39e774b128905eee31cc996dbcc17c040c9359a9f1bac8dd063436c783b225e722f0312bf93730a1f5cfe16de425ed030b6065e85f8fdd6d7734ec1981d52205fffe8daf6d5224b8137bc05981ea3109d4fca1be0c810e99307cfb8a4e131f1ab357b785ae0425e8868d71724b79f5a71cfe61b8cfdd9327de5a1431b1bc77fdc804339982b96e026d4ce8ad1f53cc98001121e2f5225b4fb84a22469deab4fd2780d8e76b3703d467a465634aa08f79f01e34000bcf3f011b009c28b42c75a45111ca824441c147a89a7cdde1b242cac3e6443f8c2dbe8a20151f4962d6f62364420d65fff06d5f034d2da4b2746818b286b09ea7bed83fc13b256318e407c81384a7063382ca1f8bf6bc4e48517fe08c6297b06d0cbd6019414690a29fd30cd9c4342854e4b67f347c861beedf4b02b3d424cc0ac0a4b78410952cf11b4f2166f90f053cbf38fd104af7161ee364fefd5211423bbab5449cc5e7f035f2a2b1bbb313e110d0ee4d1b6b58d44c1c3de90c0fd0beb54ad1dc064b6b787c8ecce420137a3ed3417039de9765813397e3cd8bdb4d0ff0a2b7d9a6ca0031f1950fd96f9012f35f4973175c656443217d9fc8dabcbb458d9f112ec68a7987a40ca812b17fc5bd67f6ca70d89df2fd88d6cbe9f44f2f924f355860541ae6f936a94a6fc65b636c0516b10c5029573b44d9a529926d1ee84abaf68daacb8d4af046de4cb1747fb7a8b9d23052118b534a81f5bf6078bac85b7666cdd3e3f5294c198a43cf0e9edc3279d288bbafca0caa7ba44c50d432ffa00869c0d3e1a859c73bef7c9142888e02a6188e5aef0f762b117949480a72aef49fd642f2a7a2bcccd4a20a0080b249aa1608392fdcb81c6249d32d21e83c2d04c65f5542243e052756976bf7243471efcbace1a614f4ea7ed4de64a7ccf7a5900212a51db03b34be2f41b563ddd989fd079a732d01569dbf802727ab65aec2fcac2df7a1b7cfd05749930a77644d4d55c136fe5aa47a2dee5d9004a373c0136c9e2385c666fd415dc1a4e4d3f0061d313db364f6294f60f2f0ee974bb3662bf87ed336634c4531f8b3d051a9fce19790eb924b833ebe8c045ad312ee7825df5b41d45516708d2f9ed2831f2ca1739cdccffa17a318e66b94011c975c1721d8b63593596450b23d0e9b6cfcbb9ea1c1285abb561b1cfbb96417c8b4f922f6ab7f2b0ebd44b9c3ea59178d252b384387f44bbe22e05b00ca713dc5e67367f98fb8cea641c7e803d7493737022d1ac1da6b41f48839342eabb19687401211ce6f77d45871e878f9d2c18b1b837d4611640dba82e3fcb827ea1bbc432541546c2bda81a01879bb2fcff748711895c0ce8d47338c150faec01c85fd8f7b8707f37707474b9fc378479f3f5b93e593102acce44de8a84fb2c62c350716904f1ebe596ff6874ce5cc800a16f6af99dde74494af689128fa7b4b0ea2d2b986504cdc4f64ee8a74462ac3b51824b59751aa3191bbb0e70af3a16a865604df4356e8b3157aa03b55f192b45f72d95fc552c96e033a827c6f5937da44d6b16c78c5d43824603f495ce7d309ac420e9061dab768eafa78c0f7bc4cf3e57ef391bfdbf7e74aaeabaa204e8152e0061a6c2a71be0e8aefa0fc6aade9e994bb5439b7ba8de53456d61a84d1d59c867e50ea969df1cebd011d801e9a3139ed3bc2d0524f99c2234461e22545a408d539650b381defaa4f9a35106aaf89c038acce3623a0e9d0eeb3d3471246e03720a60b6c748f3368de922502319eb716bd260d74cd03a364c97f76bcb97c70018dfe9e26f6982703eb3e3ce831deb0a2dacc92b5d8576e358da850fb49e084a202fdf5d97f57dd4d145e48068c85a0fa46ab1836e560827aa32802c61544700fb0e0a97206ee0dfbd650645e99c0a686fc7b5f2d9fd95f693ff61dd34ff208cd4f3c26eed4a6267dbf574c3f60e4aa680e741271bdc522d21eaa5ac46fdce781b6c9a380766e3ec3372c75f2c57014a42735d20ebdc007bc41dcbcc3a808ddbdd24f99af727c1e42b24d9d9505b3973164e6068ffdd8d172f8b1204a558a34d38a743e5cb88797a53bc4de440feec468754caf0e2c341679e6840dcb677103d87f343db996a5996a20e60af6355c6392af3b5c90ab0fb180c9a20960d0e07efe1df80c242382306ef787514f4c186bdb9a514f76cb587dd556e793f36878c9c6e725db870ec5e7c5d06244cc3e4e6d1c64bde84779756cddd44f66391dd7077618d51985ca45cb8010681b75d7112f4e423a217bbc403c3e4432225afb5356ab59f57109fb3ebdcc919dba08b8e073123a789de7669b91a50dbdbc5b866b23c783198f4ba3b555c71f2ec457c5974f358a687724f111532c3d9ecf3c947ba5c1476720ff0fcea5ee031a0f282ef3e319450b873705f0a12d108442166e4494f4d82f2d89c3288c7b7ac5177037682bf9d0e0f404071f1f2dd1848fc8df11f88a1f5be4b4fc098161b2233d17c92acb861e5e78b83d2add5c58dfe591193fcf52413ef7bc7fc3102feb4c87d8f0ccdf64177626125f357470ee2766f9f806e8ca4bd79e2311136ccc045bad10ab2d691de1cc6399433e4b1f77b2eb47f3f39d32a98f2c96a93b0303c96fd8a2d8ac0a37825f07da91a8d6a7a270f0d43717402620713050032c60267abfd294e53a0a9150eb65445455e32e6ed4dbbae7858be4d8841e28ae254101843e3f887e369e7668ac383c38924ea08a1eea05051ac7d754e87324c60e805bc12766e826a6c7082d65a9e4be20c7ebb4511f6a642345129e55156d5d57442846aa5c83387d82cbcd64664cb737a171cb1b6ce97b174e37166aaded1ef2358695be1c94ccdb91495f6692e1114ea21bc920e6380fd997057788767c30cfbef53b81a9f2289eca0a4804b048f7150b844cc93e49c3911e6257f9a3ac2ffbd669a9064ff28556c04215c11ee35d110c7b555b0ddddf12078f2ec44d6d95e3d0686098a6848f3c6a78b55845443ba6b16ddfeef16f8c6015328ed8d5c29ec088ecca5dea9d0cd9b68fa4200671e553c2955620e651ed6fb4efef1846a70878639ca22622116f5fb8b7617b348dd54b60fe3901027444abc18337eec0936a3a880b01a74cd97ee2be11d8972df3af7b2f2d384b22fc6ff64264f698a3d0ead5aa4e63d913c93f13bedb0ba8a5f7af021e9db01fc76c5e4fe944ab6b7964baeebdb6dd3c056e20b70615296a5061126ee1c6f4947ce69e08c4b99c4aeaed95e91b99aa0336c2ead865cd1e507aba16d2f88fc695a47ddf946fe0c19f511602d98ffe48b51ffd11f3353dcd139bedd76969ce674cc201d681c2ebb7fc5ca21e4bc53864de4ef0f96c8c1513cd01e26982aea0bec34c8791f0677bad5ef617643321e164506ee4c16cea4a2070bf64b42002c34866ab19360ddc3557576f9add31d6feff031b49eb6e490922dca732e7a368e6b131910092f574b5573760ec0cf788a16a40dcb9bcb91e2e1bf455e3e310563d0fc8997bf67b76f03b109e46e862bc27da116018ca32887896bda74a05ea5c111daee99100b11665670fa740cddd8278ca3f9eaa110385b60f11db22479dc7c6cc85421681278dd2200b23cbfa8fe618d275137688d335111b2823082cb66c37f76104be175c918f9fdcd86cfc34cd8065524ddc8e741195f7a9785b8b791d996dde34e1ca109887ee18def52ecfb4df4b759483442f4d0112a357e35321dd1f325e5e30eb3c97d8230d1e84c5ac2295f54f12608c78391ae7a69f18c647cafbc20832684d3c06f12e8443291b8072c4c99e1b8cfc1720bd5e19beaff324ae5f874cd0af84ce694d00dd84bf894122bf6a53199d2ea8057db37e14e9a057be7a7dc82a36a8b50bb9243e9c61b9843cb8867c50ef273781088640da142595f80997db8b485275eae9ca772ded5f9fd685ff701d2ed3314de89634274ffb921639ae2b3b2e6dffd395ba0d77c0722060bd2d94ca323b937e2b8056ac6dcf2afa5ff00be75fb102e9e7c947066001e80c7a519c3503a727a3df72ca339f8db338a7a6e2b974d68b5e4a2f75cd283571ed90916b2c619b09e3c9f4102e74fc9b479171f05676c35ee8b2dcac462c8c223fa371d7b3c1fdbe4b04d20ec20075bf13ce68a7d1fe73526ea8cd829f32d79e0b1eea0ec7b7afa64fc135f9c8cc002d2e2a90351102231ec9a2962fb96d8d8f4891e2246ff9130197047cad5adca757c74437d21bc9c805a837a4b62636b5149e15c02e26ebf6ac42383ca48cb489a5c08820deb1bf9a309e0111b3d42ea3cdf09b581346ea12c69a80cf47e7b427fe0d5c641ed1e23538b315cd23d267931875064a8f537965db436f47269a60d6b6e1464596d9179e3c82ef4851c9738c34062613ded7d4cb8298c60c9f7a96f4b109bd75dbb9e2620a1a9e8954c3c68034ff67fedb3adcea225a5d96a5e03dbc81934f53406b997f454af585772711a7b3cc9d3535f66c80d2c12cc3e3d1813975321fde4493058b784769d137e9ce2a4a66e511f2c327e93334e40cc3ea1fc6f03c2aea330ceb0dc3e340073948f5d991cbdb0d2715dde35a11949f013bbf3d4d90749db3b2849907eb584edf1cbd951787be304de7989053b9e384ef79278f749267ab4c62c946a260eb9e66fa223992b44e564ec5c45edc0355c3c0370a9524e4429ed68c90cc30d123bf40994bd14c25a754510940cf2ee9c14630de2b52efb7a3b8c7781f2ec77c2193a8a0941e37eca682b2fd337c74a4bb12a0f1477758d9759f3f07424488568e1ae9c706c6b08ba1b8b868a9146b9667f85e41b9b7664fb433d04d67ff32bcc966df0d2044ffe35ef26bc05ce25917c1b492822e9d4de0064696d9df6bd8b280e1dfb7610715349ed3ff83da7639edb2896ddb0ac3be364a6369e6449a0ec7fa322a11b6d66a83c205378391d746bf7e12bbb1c7aa988fe8c08be9a0d793ef08a8f3ba56f32589d7a2303d665c4568616a7e477a2975a1fecc8ae785e61ef148056da1dcbaae4f2bdb96d37bbe87894292dde0eec39c426a342190168a17698ca7ad319cee9ee5f26a0c174174588ba1b61959206ed371367f505759d6481572db2376a285d09ad2f92378797e10881072dc8463f4a2e00d85778c46642a0895f65b071b1803995420fbc871ad2a698552a936d99e7ee844b306c450cb021fd073532159225a4ce29179c47c506b9429cb28dca138eed324291084cbabc2c4b3c724d1977d463dcfdd439435132eff08401140358b5e7abcf00decccd5df4012ac2530a2990c6455664eb910c589bd951c91a8c30c7eeddd785993d835d1000f87fa1f046c26fe7a034b14f9beb1b1e89d68662092e629c149e423a359f7659696f27457496e3e2289c1d84321e371dcad42e5ea4cef279ab217b78dd2df8eaa6586f08b01a9ac77b200206e079f6ce107464f3568d586e9375f2d383a182132f99ac15ed8c2d15b75cc4e6c8c3148e6e3699c12251a83eea859cbb988ae03ddadcbce8b49d04372a319a446eefa6ee2da51c6342519363918aa982b18bc5700a4a5f8a5c1a77f38bdfc67fdb089df5380de99ad73fd168234569e22957c80e214b52f698cc912a0fa817c4ac45cf732251e4ac8180c015ddf2728f271a0bb63b40ede29c23487e5dd5d7f3b75836693ac86ce070aa6def697a6b13062f5e6d6a0822a5143a14b28e60ad60ac30236ef71e96dcde405d68b3071941b79c0f70cae1905a78e7ef9c73c4c167743621afff5112adb2488ab866e35af5acbd6bb9e0fd2f8174feb0e3e3dca055ba9429705d6c668d8ed95c88561c50b84e8fe5c69720d7eed3a83237963f461e8627a0b1ff92d492842afb7a14eb436686ce71e43df5b7fbe7c4948ceefd6dda4509c836d46d619f25690c2b8cc1f2a69a20456607c8da030ae6f9508d85508c22eebec9e79505504022674a2a9ffa6bb1e54724326aa91d41883c53648b077be2e9e5864a4d5b5bf29bbb283db8a055020c877aa42b08a957206b8b547f34b5b692aeed043340a3332b229d6824575088f84851072afbb648f8a0ed3ab031f3134107ca614880eab57acb8ff718a2d23b6b9b0354f76a1479fe00fc676a4659bbb04e03bebc62c60ad9f56b6d4b5e4c959e430947d35a1f75638c200c71644cb4485941e2756dc00f9df4ea80f8ab3f86af5a7eba9481116bca9b7d24b74cebae16955fd8ec94c1d3a2d957684188824674aada8da4f87a5d10683a8860a50e1e9834c6ff5544dae0ab7be4280a713ace8cf28b405f8ec4269767a74649e12ef07b5a19050d218c530d6c29ea1b18d2133cdab7f0fa43661851b6da737116e2dbc401d208b2453be61488c657218efc64e520466f1c21892710ebad3dd9b8983ae22c92ab7004ecfbd06933ad5d31d3094b0131825b10499aac357cf4908b374efd10c81b5fc939b6c5a3107a2ad3b5f4084ba4cdc24d13e43c57e2ede44e60a3bab70e71f709c4c0a8dabd805adc12c73a9b01e9ba9f4aebbfb478677b6f6460bb135297dce487435f47bea5e4532e3182be4d2ddd3f2f06440a93005e4abd6009eaf521242c6fdcd1f2eebb3d5dc853f591835907b414ad9b16287f084e8fb174dc7a696d70fcf195d4a511c921dc79e00659595b6550edff40083121a4c8ab8ab7875be3813e1c34e63877092b656882cc976f995a34cf117cc30e30844707e4164eb91bdff4c166e262b7dc128b2e87620fe26d3fca32a9bad41a95d1df3ce2881bf832416b5d6692a128c3dfa0a1b31136f669b4dee3ecd1a7363749172cffe0787cb6870a47e700f2259d43515406836181ad5776a8ff3cf5915910f586ad919cf875cfc3d35a3f814e21c9f4d921956a29a1ecbcb9033b54a817eb0725fb3931db55a027a8fadd840dd7e0e0c691a67e4c1adb61efacca5ce07ea28bfcfe5112d0e6c896e5687b236ae1f0c949f0c89ed968f07fe49297b2680fe27428de7411d3932f50a040d2dd4bd89d172d49ff3fbf993857eb30d0e19763662ee4f6add3b37e273ce65ca70b2693b88e508b53031ac7e5290d114abdd77432c2f8a7636ea85a2061337365374d623ce9812dea8d0fafc9a660aed715a386562846ed94a55f3868e0a151c186032f68fe65d038118f1b94e1f8fc3ce80f73af3ea65834d8556f459e9929086e65b19a44cd97081fd46071e82c841a3dcf2d76c1b23160f54ab5cd0912bfa3a23af989069580d7429db033ccbd7d5a3f4fb66f258b8dfabf16d52cbf992472b16cb8a193456e3c322d5f736984f7daa2fd5b0e63d3c191796954326321b8e94766e9644a5f79b3ca394bc1801a8abbf45241e6a3b0c36dc59030af7e385591bff1a54e6b622f888d034051a56c7c3d650ae8431f405021ab8949c8e750bfcfed5b3f1bf58e174e9e43f295198121a2fafe3eef746207baa44d77e3eac97d47a901e7cdb769e9144942a282cb7682351a744af2b8ed865d21ac51a3c331b63ea5ea00b35610ca36a66e9cfaa87dcb546d6e31684bf197221d16141a81455d64e628a8677efd0479cc0c47ba845def81d7e79d86864652099ac6b02ea28c40d10aa366aec23a5326b71b5e1fd66d78b813324008538efe2fff289e51c461a7cb218a7c80f1ba0869f89334564c112251219d7d849c944d57614ae5bb442268e24c9bc069058122b911e703b2c24c3e24dd65bc8bb350eaa8aadfeada52920d779f13e11b2687d73ab80044965e09268789a6c090969da3b0cada66c38bbf1995368660b35a83d7ae06a7b843ce2bece287ff51a02abdc6b378b9d65199ef0a72d20219495fad061224d241165a544a7d7df22322786e74f59199b682bb014a98c170b1a39e52e9ee645184637613838b0bcee7f792d0e03dbf492390f1790c107a2174864ccc009e34995b029074e0da5cb58f52282adbb03e9028c0abd48f6d5b7c9f01f98617ada1e93d0d45a79a2718f3630cb1e3c51846d0612e8c08560b304fcf4031ae96694572056b24a07159d088bb37ab4d38d0835da51aa8c37e30f5a145d4c1f95f6dc3df41cdc7f89ef4d0f2b5a280998d1ba9eb8412d2862063671b8617458bcf0b2f0f1ec2812f7f2761e7dfffffffd4ff6265bee2d654a29052f0909092809ce0c050a43f9ccf8d1c44ddcf4352971539307e1f0516742ac3d6a5dbd42724b7dd9fc3ca8fbeffba17383d983d887bd51c70d75eab85023759a5d17e2f0e1e0416ce54aa7ea1eb041aa30871d390e0a6a3f053d67ffcb2891992425e1cde6264dd3b4ef4971d4cb90a3529b73e0d8337e4ca0107165e241dd771772538bad43863772541f018ddcc568d62eb1ee9ba29a9aa2a2fa888df6a14bd045f40aa494b2e3af518110203cedf9c9987f64f899305e3d5445e1ad90c4a9cb4c9849163281ea611f1c877084a96cd42d1ac2b6d57449ed1f4965186973936ef5373b912d6cd01622691af600e23853bc71998a780884890e15deb8501cf3e9130927c0a30f5b1c72802465044a9850b932f11828bc02ff0e063434a82b266aefa0f6e43250672797b75f9ed05f000b51a52376c09efe3eea3e2266ef9fb94e0cade383c7beb277cfe33a23d5afff0e9d11eb80e13430e71b9c4c46dc83ad48791ba31fbd1a43e37c37bffbe272409de73136a845b01d436aa2d322d890b29d76f2203e8a2151a49c6e9edff9ca2a223b5fa444f3f0ecfc0fcfb42cdbf99dffd1debefa1d2794f27213c2d884decb6f0731d3afbff7dc04695e32135be11edc85d9c94a759b1f3d1e48ddc426ec02d6bc0b1b74816df917e9d80eac2316557301998f79ffde52cb473794783c3ff2110f0fe223a46ec23d3ac63aba466a529d06dc15c720d6b907af8e7ef758cb239a221ec4aabdfd349ff0003ecf67df4478be48892cdc164130ccbec33103b59f871ef96ad7d91d3ee1e19fc7860f79c2a29eff4109d80b75e67b106aa05977f5fbde2a88664f5bf43e87178a586887e71b7cc2f319f8c4033c3c3c3cdfe11310f0b0f33c08ad6a084f58d4423b3fb3aa31e11111c3802fe048a3e24153537c446b67db59366512de8a65124edf18b1947e32cc69f2be7e75de56bf9cfd59fb6ff8851e73ee5e1385c73e4516575cb982a972303844fce910c77149781c87f38437e79cf3bd07daf371e1ae8be33ec5fdc671e17844acdc770dc4f5d4719d3490882b8d3571dded5f778f66d6b1dddd9e725f9d205efbbd7638f650a9171cd7dd3dbbbbbbbb7fdcdd6def6e6fdeedac05dc7577777757ce4ca3a9996974cb34ba750bd26dbec875edb7c1d1aca7af48a5964d2a25d5b2d9867b1bee6db8b7118458d6d3e7ba66f681d9febb1b11397f58477f90ae1b4d6faba3b5acb8f087cae933ebfef17136862e071151e1bbe1e9f413e9d40bb4ce6696cd9612bc5977c90a2c5450c192153c5802133db0024a18fe194b4e9bee54ae7a93744529cfa49487aee88af2d015a53c5c4ab2945366736bee91fdbae473727e952bf0ef6b85ea95ab0ca0ca5f06d23ced3dee91bd7c0d7cb1454dd334eda56a487b5074e2699ffd1845f65ef5e4d4fe47b714c3355442fa7f34ab8064ffeb929f8121eb604de1f5e414eb90bf2579628b5286485e5213545ac1e447e218c21be9d10976000589082780810410d60b2a595260858923a27cb1031e1891a9209531690172d5a985b15a9af2059309aad49e9e7c8a55952750a8f2fbc91be9aaab02085594f09c78fc19674870ce3a42c2ca61d3ce5e526609ca30c489976551781e645dfefead0d2a00b7fc671886ef0faa3f0c3cfe1838d411c22f9f439db9350b695a74cf62e08d2c030c91610daf9f25a5f8f9fea19c3635ad8a25740828a92a8c84d08670da88c888d0429b9060c6b42a6210845400115332294700e19222796b992081028a60f2a2601a9c24555125081a58f0e4ada50ff3c34fffb444e07575ab40614104d4173e8881020ea0b4a0700694127c48c38725218c98c263eed147abf6be1d3e2cd981ded7a2949ffd942c9d78f2b746e1c9ae6357bbe31eeb7d2357395d7ede1a9ef410c90c8e81100294cabf2f50d58f2ac74ea344a5cb4a6e97fe3a92fde55355551f1d5413eb9c90a830421dc594142a3fd4714775679f3ae006f81085038fdd3d03def2e7a4e598f66662726a402ca5c494b4af557b47b5796ef1cbbbcccbbbee2f594a29a53fbbcbe94bf8944b48ba03954ae876ce5156ded1d7dd7d6ed7ed673ea1a2f639e62d89f1111bcd1a780cfeb64422146a9af1f33da97ec8321f7461fc90c4053318021b48b0f1c4162ef025234820fc208d0dc30a2c54502e62204608360c2a94e820a2a80111413461c51629e613543cc992bc20aac9921c3861841c2009c9d45da2e2045418415997ec52aeaffb0fbbfbe24ccdc9a5e694bed3478b3b7d939967ef99d30f86393316acf4f9b548a9d47c6a99bb53f7fc05e27f546366667a84d37eaa25993d70f70b7082f0f8a1b668f16056ee53cdd9c185bd9d7c7f22d520c1db976afcd775b787fc662224b23e89e92c8085e6b3d00c8f3aa1f93a4160aa3f4cf5704c529f7c6086d45beeee04b1723034cbb22ca39452174cf1831a34955fa3495514c10a57f9b31774107e90aafc13092a5e9040c2a0326f7142e5a5f27753073989caef7d4a4cb85229156b4e9516540e42f570fc9a9fd54032955fb008c112a1a5e2a3eed2882bdd3d0c222485a12eb8a89d85d3c3f1abac22bcad445cc765ea2534163ff6c5aafc3204d9170aebe2e7df262a767fc0b053f97128eaa0258201c870aa2cb20462142af38e0dc76d5a29a1b0af7d16703b65f33c4de129970bed7aa8bd7358973fcbe51ea52c5072994b1135449f2975dc2ce28e9fce615ffcfe1c730846731e86d7bf54c695daaa20371e185eff4ef94d4260d2fd532e9722597cab8ff53378fde1f91cfe04d90d77f8ec87496818d2a2ff0c59a101dc86212d36ebb4dca1c8779ae8209ea45dca12abeeee51aaf7cb65225c8a649101240da4e3d3891cd471b354c7411d774bf528ef70e4a3f61f4a0668a0558281d2376178232321212121f506161529215f7e92da034c93d0f65c4759ddacdab1fa4383194461243662a7f6b3d20a414a93d52285c6af528e924003a1f954cb32b044a7a713b51f072ee30ac99be1c849d38974007054e0c9dfd1416c44b776ecf0f161b1562b24a4f1e767859eb61a74eb679b81f7c3492218346852e43b25fa026fa49e5786a7d33a5078d5078f1778238fca38108166566c70813ea7d2c7f3993eddd215e73b28579cd3bb5d91f967bef2ce8afcddb6f85795c70fc2aabf6ae367086e7f59e342559875f9b30e73577f1fa52ed5ff874850007649698b231dc5a4388247f5e75e985e411d3b987ded7bdf60e99ccbcc54db750791cc5dba31f306aeb7e6fc49837431b8658d3f9472f85e1adeaf385948f0ba21b4940fb2094b5a1c5551a3cb4c428225253021e1042dda50c284c2092d2fe20c1b6981b0c61426a2a8c0093880811a501c21460649218f5220b865ddb4c06b4e22c47df645a9df3e891038c45beea4d39fd2e94f7d12a1a26d2bcab62442dbe72d29bc19c6accbe927e4de7b19702a9e0c9d0af94984f8a5b7fc930811f156f69fb7fc95b0818b94b0617e1616cd90c32cd4b1613eff0c89784b4847fefc2a3cf0c75b2ea512549f413f713390992a85711b55d5811ca8937d12213ff256160e31ea286fd14f228484236909a698d00a29c14f7f8557c286feedc322ef3bea578876a863c3f6fd423a94071dbd6a8067ba4c7e5405a5a19199c42d7370e3c3dfeff6d53bdfbcaf9d97cf6a480fd3d81e9cc43ae4b7e49dffd13796ec8093665b37b887f6f2c66fa0b7e28d1b52c78d1bcf205df1c68760b7e28d1b3f321255bebcf1db3be8db167e6f7f23e4a31691963012d3be364a299ddbb67d2f1fe6c79eeafe3d4339ccaf6b1f78836907eccaf2c6cbf0e5f7dc06eebce83fc6e0f871ab39defd7380384016c89f55bef1db86cfe0b8559877d5d08d23620dbf55423c90c5194c2085cf71770394350c290cd34ef4f1ce55439de893fd8f097ec4e1286dce29a17ce328979a1af33b6683c6872aa79cd27307bddef847b51d1e77779e2b4c13e4df9161864fa337f0805ba90c2e77c04feb181cc51df0d33cb06b71d5373031adfe7b8e763facba626228bf116e9449fc49c2d37e14abfc61256cd00c0bc5c43d6e60daca5032dcc03d90b00ef9854c4c5ac73c2a21abffe8af7e5534d0ff543330c8460cf5c37a16615ee4466b78e34679686407362ada818d36b063207701398a8bfc22483c1b703ceb7f3497c4f484373253124331ed0b2ccaf13afcac67a1acbb01f67c08fe6f20f845907096653e335343f33b7f464ce13371fc80be1fbfc7ce8fac9aa5006edbf2df0177758caeeaffb5aa8b200aa0d370870682edd0ff5441e8f3f71f1ba578c0aeeef473be2807eb7960d1ff582c168bc562e560e5c0f139fc7b5efe4bf0250f0c4ec334790dfcf9687a402f07b8dee209e98a86b09d704c5257211bb528657e5d270cc7233caa7f4ec838e11716edd0a227026f6428661e3e70f0f8f1791f8e276fe48e7117495ff33c1c373734a43720f736e098a3662111d780e357679e061cbfce844c0c9594c450ab4ff4f91199f5e327036f6c26947a1eeba9b34050a6004419b2775d53aa5c2c90b048da97d6473eb4230dcf816c6c5f3eb89192edc147ac43be6cb922d3d03de297c2470e76c7806ce5a4265a9453fee769cf494ef695bdfc1e9c6f633ceba16a39384cbf37fb1f9e038e3d95be0d387e5b48c4ffa37b3ea9276435a7a38537a5140f62b54f95b3d2df2143d1fd354d63f99016ddb5a11d2dca9faeb9bb873f5be53bd287513d3a3b365fd26cd3380c9a492dd39848c76ab93e4052feffac06daf9d5cbf769209d97dbd39ac7f9554991b23ae44f1b2d6782f46dc0ec73b80de4ca03eee2e01c58ad9353d37eaa86e6c3681c27b32c530dd1988c66dc38e0c8aa33f593079cbfaa4dc3c18356dd62a9fd9864f5dca986769e53694f44fe88e3959f06e7573c5b0f76621d47583943783684445a944f1f07dc791e50e7370e6c8b9df8e504ae727670f1564fe5ea6f562b1cd8487e28b32ccbb44cd3f833d6f8358d5552ee93012a0fa932540efd351b671bed1d84edaa866cfe47f37378e4a7fa3bc80fa312e2cf6f03f2fb88dfc762411d83693f323bf1b8789a114e72a285fc1ba83dceaf6a933a60afc0de01fba88d5a94eb922fd286ff9ee7a438e1f4c0e3183bedcb5f7e0fd8f32cb474c594aa42dda5154851b9addb01717e05faeb8039dc64555936e7bbf365b2cf62f3733ef54c56cee7fce855999c9f116bced36cdbca79991cd8cd4b1b4e4543f60cdafcaa82646ff33f5a03190a47d1ba09a640afad0292fab9deca09c7ef8bc0d7e12f4a22d4f33cf43c0b656fd3036adf420c0ad13e87172a7fcf73cf3bf8c4033d3d3d3dcf604f58d442e0ab6af8079f9be0290d84f3f2198a9ced2585e12a6f8f6d75f07b9f037e20b860e76d215d1787e31766fc37515a942f6d42761272528bf23d203cd6d802aa1afe8bacec9798bf87bfba813776ac911a481ef991d956edc11ab0e61d1c8754c93d0d38f654999f01c7afca844e440c038e34f5a563dc3b0c3f5a943fa481fc191c7f5b4d49234be5a74758425653d230a332cb9a00af0784e28d0dc55b3f2dca90478b92478bf25755030bf5bc149ddea1c435cf6c0cdef632b353daa66c383938211b754e185bc22276c596ca2a205d659ea1b8ff088e58aafeebb4c9cc99f7fe6ba06d669b993321cf99f7dfb6779006fc544333cfcd8032328fa45dc667405957b56d1f64fef632a091e9acc463a175550ca9f79e9b41e6b7e75a45c3cccb84d1a5cafccc732fdd107dc9fe12a4f9560991f9992a622ca937ea56f1a24b65150d313133e10e560dd53cf7a3e5fcf6b481669e478b3099df3126a93ed4f0c69f6a0426138e49aacc1bf991097db4e8dcecb6f7a09c9cf047ba8536e07c4ef8ab67214ed6e0502465e35024bbe4c436b0e655aa20335ff332a08f167f1a0816c3ccd73ce772e7737e2392b3b393f3ae1ada5435c83af3379f6364e66b5e82453aaf63130a89f91c5ea8db1725115a3d0fab3066cbf92de765c0271ec8c9c9c9f94d27272cc2791d24b26e7f13fe34d04c081b3949a68aa126dcf1f38337728c97c87cccc77ccdc7bc3fd79c7fdf8facbaad827e7ce647afdbd374d00f6ff96fbf3d6f0f1c5887ff168e5e8bdfe69f8dcd8dccff6822fe3fef8f03ccfbab54bfc950c65f158587f3dc736c5f32ef3ddf0703859301b932946d731970ebb675db16ea6c32bf2dfe688ec96ca11099f0090f398ff31b119c2f52629bf99c9c997094f96d7b9c4d666395ccacab4200ceefb66270de655ee61b88261cb91ad95edac8af79ce8dd8fcf7d90e329ffd28f3313fee506dfe03479bcf6a6ade553170ddb6c604a9091db0dec27919d026ac0147991f699d792eeb6a40f93423d79b99979151e2c1e3e74746e6c7af9bcc8f5fdddcabf9ec6dfe47df803a78bd9101475a657edbfe876b5566bf81317f038e3bd49ab789a9b951d1c01ced6ac0ad34b44e70e498ffe13bd418702b0ee88123ad5be8fd0f9fdac3c4469a3a3214aa316d3101de7a8f92670403f2bf6eb8aa21bbad9543926d1a94825b16b7a5a0042f539c52cffb3ef932e54ab7e422b74899e5eb0ca5d3944e9eb73a54cd19c6d055a98e1fe52d8b7d71d9987642e08d1b535454038d2f53b234d0f86969a07163aa3d76571a287b62f251c4a819aa8de8981326df82249bd857ffec0bcac95bfd947adef7fd8fe2d6a5c5dea2dadbd868a1eef3e8a0d4c684d5d1bf5bd4133ce9d44057f665d4405b7770f124d4cf23f7a02dca5bfd0fe54bf2984c244a3deffbfe9d6a3fb7eafe76344de8b180fc37c5bf0522bc19760eb620024f470759b587c1544d8ba241be16eac0d57584f0ccc0a548b8ca306aebe2a481b693500dd42e7582c8ea2fab87230f955f9e6c946852a71195e792cad3a8b2ec52f925970ef22950b349f5291ea4925d5cc988698937d59e46ccde5289246d4a9bbcd5b4c9839e9a9a68136daa4dab872a25dad48637f2539353652b4e3c51a88164f7d41bdf206da5b3ca999fa90a4a5b825b964ef6fe498424a89365ae436937dfb351aaf245529d3fb27cd449b5ec4a9d2f756ae8976f43bf0c8b9490df9f8536f06f61913f7fd315ae5ff66c9dce699cfefaa66dbaa6bb1ba669beb3de3ad55c77adea97e6df51dba7368bbf797e67e6fb69ea841dc30947efe36791b986959861f8a90bc78f0bc74f85a398312b51de58d2ea8423ddcf09470f271cbffd2f1cff261cc51fa7ba5f53d4e2fe0ca8e44f1ee4635b1b138e9e172ac184235585e3b79f0a9fb670e45179763c6969387e9b71d4e7ad56d5aed439e182b4a7bf7150aa53bfaa2156b7b4dfc06596377abd55b603c1f9737dc415c5d868a4557214b7bb9ee4634be14029a17400bc99a4c2913a73a92c95a5b2549651aa75777777a7f8658adbb66da3f9946af324ea4d5a8c62448b1eb6931671a078631f31a9de40485bab9e38e19653e0ad15509c547f19c340befa56d92d10e13943e1b6527fee2e4005b8adce5e554f5587ee45d60eaac2b4aa838caa7b8191b158e5cd6181e7deb5db17112b551db2ca441cabb0172ad3e0c52a7f17846395b35851c6165354e134c594de6f75ccf046f1f3544e58562d761005a255baf2c21bc5da3cc43a859452765048291bc8a594325c4e825b393993383314fe2c41b946b8ed9b167838bb5c6a531651a0c8236994e549090a6fe24ca2b858699212a597f491962c549438899b7489aaeb5477fcf0f30e6d28a9d4556a719f1966c7cfba606ab4f0ba37088e1a2dbcfda902c2e14ae9d239ced65b9bfcb232548bfb315ab89549b2499728272b4d4871245fb2450b1315279dd4b12e579ca634c1463012d491cd42061c33bc6d91856386275b5cf6177e0e351970db6266f9d2259581d7ff5503b9bae4cf26540cbefa28a954964aa354aa4fbc9c107851bc7eaef25bdc178cab873eab7e1fe22a5fd65042cda50b78231542142a8b5027242317eafabd1ed491a6f60f03e1858bc39d91b4e2806cdd17d755128208f56b71eb2a095184fac1248cdba83bd7c5ebe290430242d65d1a820f940d982d57aa4a8bd1db252d4cf503de2e699952f7bdee929626aa6a5ffb75a3b1e2cfebeeee761590cca0d2dedd2e8174b8b29a823e5a641e73abd7f3b36d7bf6766f21799bb144b62a866c6edbf6ccdffdd9d63c5ae4267125b81567055e566f3450fbd75715e466e4d4151ce3e12d5ecac3a5cf9e3b3f6564c183673b319596c9679095131b4827487728d6fd4f12fa78a27d87eff3f2c9d127a43d4df7ff4085b4e7ae8f635d387a14d6c7d18f90f6fce00e407b6625d57d1819fde009bdb000e077615be0ffe11352c2c31f2db6774b2e8389b68294272ddf500401aaf2b3b80ca4ca3e95df3d26f73625b8e94ae4b2ac331f16173ed78c460b3d18161b48cc5695b3a7bf0dd45ef7aa81565e85611fd5a3f9eaaeb81f9f25d6293baa1ae232eeb79c4c35a48519a53506ae0dd31da65823c193a31f5cc8074d48891c64edd8910f42b481bcbbb329a56caedcdd9bfdc0c1ecacb265f6655916ee77077252ba37e7a3d56ce53ebbfdb33a5d35b47582dad66db3f74bcf54190fa6bed4ee70eb56372584558b528aedc3ca2ab7fb6ae7491b48ae9cd23d7bd726336bd9d7dd8d18522ed7ace1f1eec32491695cf71b854152a5675a8aeb568479f985d9a1c2bcbc84635195a9aeadeac027319c16e92fa970d795fa1457e9ceaa2031af814f62429a6eb1af74b986cfcc27959abb160f975da35a66c8eb9a5f7d672699596acb9ae653669a9639e179443eb9be2b3aa774399dd022ad780c6e2baa72c8b60ef0949ad4b215674a07b0579c9916b2104443f2533b32cd69449f9fde8d61607efb1770577c81d9647d79f9ed25942d6ee1762ad949e66457aebb751aa4924abd279ec6592853d02e8986fce7d3ba99f4a9fbacee4e93bdee2fdbff684d0b97abd3cee2f187da04b9669dacfb72594e4a29cd6896895e5716b981e68622abefa3ccda4b3976ab59e972911b5a24227be0655cb783ebc6d5cb8f3430d91371a7f09f488b383fc8324ddb3939aacd15a57ce75f51be0682caef330bbb06da90dae0fab90685c00ced48c36306c2758802631ca1e145e5f746fab4051043489a4ab324e5fbf134ead9ccb299c2104f4d68e1d2930b6a963dcdb3b2503c42cc5b9b83079e5677e989c9138fd65d7a427a3afaa8189c94babf340426754324fdb520ad90a1c4b63e4aeb05174d57f895eacb65471db70b0b7564231e3275e4265a38195577271b388d01060bc05063290c2a6218218695165c811a03690c294b6364c182022c3ec0f224d9f8f934279c0f599665d90a7c985d202105d2873356f0124402b6d8c1144b68d962898dd9832ed030a2ebe20c1904f1a403277cc185ca954bc8c1199feb8b20787c51459defb3088d104fa4c106133c28411421c9832526b2a480f036005ec0a0cef9d40ba73abd061a797ecbc593359c40a50d17b0e08a286e708457c45bfced130b31d3acbaf081a6caa75e0aaafcaf8b23bcb6041e1f7fd44a0e9614a1c9833cf6ac5071842c82948c045e84a869e58a10bd058a9c568850e7e4a57286940851bab54d50283c2a5f166fa55b5b47b16a44b8d2add57858e16202056c69e298f8f85341044870e2815753b70a12889043081e4ddd2a4868238527783275ab4015b1c5f3ea56814a4205243c9bba55a09c48c251168e36d0ee4eb99276f777f713ac245169beb06e953482f018143985952080becaf9ca853ab27cc61d3ebc1b9b65b700403a2f6123b46052fd084b5a3061c907598c60698b2b517680c552d3117c588ad20265898b2e4b3f687a028436765f9303759f7a0e7e021bae00c2084f0841064ba060022107180801064f28d9c11231777767ef27ea589cb999b9a04e46537706132a68a209f729f5f424babb3bbf3b3716777777ee31a4bbbbbb73636131199e497777777632ba63edeeeece3f72952419eeeeeecefd947999bbbbbbb337167777e777e726a3c570f666777777eedaa18e907ef9cd8e458ed14c6e021f00d14c58b25041d1b4250b2c47685a38220b348ed020d1a8e623e6880a0c8ef8b842fd8a91f6d405c9080b946c09131b40c1b263c6c90766ecb822fbcacfcf2b9c94317184169c2406d44684932ba0b04829a744c2fc058371449447c42f852e66e0c591ef8a966dcb931b68c142fd4877a4f3b94182cb123e57322fbb728575e8a93924e12da8c00041451954904c0ef2138cb043243d91f4184c2f4da62481090b1289448ef15333832e68f073659d382e74c0649db0f0a05e83c838b1a2081e481c898fb16259414412ab7d67e993f3baf63cc2922112e62b417e0ae9e124dc9ff3eeb7ba5b802b929e01d7aa96cf2a24bebe2a863252eaee5ab7ad92322cafc1254a149410c75d837c4512672409ed165cb4408a10e74a9a100613a11e609a8a580444f08249a8879ea4c98458194a423d30b310dc72309d8163513582a4ab94a10e5d8d64e1760db8658dac04a9f6732fa04fb73e160aab56fd4b0f1cabe3a543d104de56191aa13c84b755d0b852fd99634cb1260fe21897e618972eefda208e3df9a0b168f4732c8d6d6d9555352cd30f269efc6d823128a02835d2902a20502b14e1414dfe4c6e4a8e9a5889518ca981baef29b6f34fe6a7b1ca1c638a516951c95127c18561e49852ed576a208d4a03f9c7a05a037d939c83f3e52526a67350a3a99c0de7600ac7c14ec74155652d1ccbd262c782b0313354313cf1782f61b8dd8aea493918199b1c1e8e3d79100cdc77dd4f57a7027df625bf5f876b7b541874e8f87170fbf96129030c04e851a7eca01fdeea1ce4aafb9299191a9a2536526c6c6e6e8e7096c0c1c9c901627583d5cece8e6a28e5cf4d9e4c535982fcf3532ee5d6e01f0487b891831b2c160b05265010455185292a743e5a3ca8475d1d66703e9d8f6a48ea00e2ef9896da9307937442878e9f9f12b0a003163a1654433eb1206c10c7a0bcf5145bc22e618376ebb65a50d2826a8895ac88f0465612eb3a72ec8963593a8895c4941cc5b6d46625310f3aaafd635d4d04c1108e5d1d57c92b22a80b520d718c4b8b354835432a1c532f3ff32d16c531a8a6e71897ee59462584fbee635441e677e1287f863a466648b7452da8a35ab64ab1a8065a185aecef5440becad0a6053eba3ae3820bfbdaea23e48dab34e4070c36c4a0fa09a87d71c7a55e542f324625c47fbe2743ca4a90b8f6d105c7ffb5b8a4c509f3b79e9c224afdbae0bc1b5329ed53dfa9972afa23f7dbcf7129493f05d2163b74da1d1a91df8554be67dbcb37229fa6a47cfa0deaa0d5961ae552dd214db19462b917eea6b6712a9898999aa6a01ab685648716611f0e4131fce392bf2135ec36e5e8403118a98eeb86e873373743eccbbb2fc78a1ac87f6a6fa4a808c9b64313c996524a0f2606a42faa0e4c894016c80631605b41439c01433c08b62d1cc6f0a0dc45a08c064e4c7184ca7fa31ae2a5eeb9a8a3e361705ab75a655a7c299e9d8eeb7878523ed85628a26763aafece5907ad76b4c52692d57f2553d9fdbf00814603c1182e641686345fccafbb71e3c68b239dd4e958ac1c2b48da71e0d869121bec720c29c263ff1cacc5c3e15540629cbc71a1c623ab9a3d677cb4c41f899452ce0e0520bc8eb1f68cc4466ccc190d278aaaa199f14b0ec7917f59cb40e92ffd0325bb8208542891dee7d1789e2b498c2580a18329a260d22cc836c0860b90886289255af083904b41a35377498b1234b8c815aca0026ffcea2fec0bf6420cef3f807dc10600c3fbbbb02f980b42efef635f301f3fdebfc7be603d06f0feaf7dc15e3ede5f00fb8209e005f4f283f6050b5a97ff8ef707da170c685dfe2cbc7f00f6050bc0bafc7fde7fc7be603bd6e5bfc20bd682cffbb3b02f180b29bc3f00f6050380389ff5f375ec0ba6635dfee1fbafb02fd80aebf2fff777ed0be65a973fcffbfbec0be6b32effd5fbabb02f980aebf2cf79ff14f6054b615dfedffbb7f6056bedbab49779ed51d8170c8575f97bef9f635fb01cebf27f797f1cfb82e158977ff7feac7dc158ebfa1bfb82dd58973f7dff705fb0705dfed9fb83fb8281ebf2eff7ff7dc19e58e02bf016086770fc0c7af9821101e97dc18864f8ecf705230af2f4f705232ac0a77e7bc188847cf7dcfb67fb821119e05f7e5f30a219de7b98178c88e6b77dc1880ef0365ff3fea97dc18868f8ef6f5e30a2219ff338efdfed0b4654c3af5e07468480e7f99df77fd9178c2801ffdff3fe30fb8211d9f0e183efefed0b4694e3597fe3fd63f6052352c08b8fc2fbcbec0b46b4804fe15bef3fb32f181103dee755787f9a7dc18888fc0aef7aff9a7dc1881af03fafe3fd6df6052372c0b3f00078ff9b7dc1881ef03bbe0518118f07fa00bc3fcebe604437fceb05f0fe39fb821141e07d7c8ff7d7d9178c28023f8077e1fd57fb821149e07ffc0befbfb32f18519117fafafe3cfb82114de0617802bc7fcfbe604414f8187ee861bf2e7ea20a843f2800f6ac8b7f0220cfbaf88b803bebe29700180150675dfc100073d6c57f0388b32efe078037ebe2770068b32efe068035ebe22702d2ac8b9f01e0ccbaf81700caac8b5f0160ccbaf86d0061d6c59f00f0655dfc080055ebe2af011c0272ebe2a7014cad8bff00e0b62efe19406d5dfc0600b375f10b010bf041405f17bf0c60af8b1f08180319957fe885ca0f0396ca4f8001547ea1312a7f75a1f2ffb852f95f18801895df851e95df471895bfc7abf2bfc0a8fc021040e5e701eeba824220a7ca1f0070d7b5036c21a8f2b3e045e5070050e5ffe9a2f2eb00775d2b80bb2e17b8ebf2015500f953f841e56fb150f9452e2a3f0ae0ae2b07b8ebc2118e9eeb06b8eb0ac15d1708be0f2a7f0fc8cfa345e5df59e9e46051f971c0ef8aca7f9342e5b7b1a2f2d7b4765d33618cb7c4ff52a5f2ab72ecba381c1b48a9a8fcda8dca9f4dc1df2b0558d1c8525b485ba95c79090d2a756bff04fae5e98c2c6a4edda53396a8bce1d45709e9a91c7e8ff3e4350b96089113cb51f2a4d440dafbacfe924a3765e164e5e94af54d4b6d0f37264a3def7b9ffe3e4aa78731f4fcaf4b675ca9feefc4240a977538aa746a71eba26d51393b24f8be2d6a6e514d9452598ea234715c9840d13d1941c9625f502f46e0d07fa1b28b67f4ed6f514c4c4c4c4c01a3daa884cdf66441ec10d1080000004100c3140020200c0a084422a16028186ac2b07d14000b869e4876589889c32088519431061942080284106008010081a99a1a00f9eefc6488e4606f630c03b257007b312e2ae872714fe80b28e7b11eb8ee7de9fb51e6850079288c27a492b5b8cc4e0ca9bb0b089bf9989a40cb37aedd12c2b831f3c51c25944241c49080b87349c3b3196f2756f4dcb3d198e2ca92cdcb0142ec2e6d9a85122e32f3b3add43d7208e66a346218d43b459036438066a326c6bac0197ec1a6520c2e8177586b9871c38a360c139b33ce1da8864f61120b5b3b2150ee3873c08193f2949d54853ac1095ba41d9b08498ec8f5c1727ac9b53ed393922d0d19372d94e093d1a003614dee8426b5a2ee7a151f27bbd18d3abe4f18e3775fdab7e6c3dc5ab68d610427098dfca8290f6bf87df1fcb8c19f3f5470c50ab5092b3b91e26fa60887da360a52be693d1415a9a9b4578876e59f20d6152da1bb68e17b847b02ea233e1e05fc33147ad4899561697016d0ae5421736d6450c4788038dbb671df1df7d0d45864706ea12ba9637766a89a6a626c072680ae5847f7d2207541c40690e54b32c3cc0b56d824ac5852bb0c6dd0736b673ff1903c942b182afb33ac6d1d7227518eaec7d4f2b6ab2111680e17dbaf76c521d58dc44ed52898414bc34162d8b886d5c17be1d1913a10845f76c69d02de0d37eaddc0b966968e51ece602eb2b6e5dbff1c89d1626cbc02416219ac459e80dff86eeb4ea4f6f02732c4450bb31ad8aa620a833d6f18fc5c2978f15c36c5d7352b7a285ca6c824933d01bdbc28bafe835b5eaee12535a7d930c75ec6812c69bad96de61e4e0e1b876a6dc03d3df6eca4951ba959ebc6004dbdd9e79529d42d151f3ea4da13185da3ededf38b31a153b2c55a8484415f44dea024194b51e77933876df34bd09b06f0266e5f9cd888db8d8d18c699f7cef8b5f12a243ab83e1628118d96012cbac3b7782f5f40b66e9ce58a3252305acb9042a757bac77fcb6d75c5614eebb15e9259538483d592525bd64ca04f641689c43cfe2d1bf972a108a94a555e3fce690c34696ead7ea767bcd61f08ca4236318919832d3828f02b1e4949dfab3a0afaff772198230a1883356505b8c45802ffe1a54d5ec1362a726f07c98c54585572940f8c54fec247823cea4e16379e0e25f19ac40c7eb86c431d1572332914274e5def29ca91e70cbfd20513ca6683ad34c2ab64ada6bc3620a8784f67158cb47fc9a3f3aecc7bfdb47d4d2c5644e5225f7222dedf70bae09f1c2fc1432f051c83cc8c3dfad0f45f5387988768efa311aa88f10c9fc5a2ef726851c20bc7d2e4405d39d057c3428967017d04d98284bb7992f1d85ca071555b65112092d52c7015e4ea5d53aa95f27498b5e20bc9be0d88f82633bbe908aab84ec82d91f496ca4ab16bcd68b6f144e1c46158a7a2d738b6dd9b98489e7b655454444b1f9b044b46977e7d1ad5f477e067e20dd9a6c3d0e364303e33c65a092e9b6f6ebec860a55f0f9de0ce7ad3c54d0f9513bbc754574b23e9f157b04780733720161060a77eef886c4380d5a3f33540ecc2dec2015f41035ce00ceef0460bacb043f6b0f7c27b84403513f0761dab0b0231a8b42dc3889983274a0b525c4c89a73b6982dc600d5be0f354aee607f9493b4f784887eae02474533726db297d12ea77290102158c9c490613faf2a861e75309ed024bbe9b9c708a79da204ef695ff0df6a74b70c0871ffd65672ac0b7eb68920e9c031a3f461bb613aba7b1a2fa8b41d178002e5b3ccedca14dd865f281f9078b7f50a41029688ea389303ba059932d58a0663e663b275a8e13b1df3f734a14bb94ba7c33799d75beaca92a1d490897e38b2cfd64b4c0b788475362577926fe0921033a0949b9a22bd037894db162657dae80072abbe851d93bfc3e781b07cbc2a50271165bfc27848db09f3f223c43227d07a412d214578360a672b0f9b31c2d5ff4f74c88baa2ab6f141d1521525f4e08e9bbfa201c89bbcdaf1495af381bf3069f145271671a8191b17422b12292a9a961087402df67bf614660199c9896d6f5775e7c567213d4c8ae730cc42221055ff0f402c902a7e6c875859e566414a9f56b5a1745a81122f0dc94265205b401c0ad2b8ecbe818f4854ef8ab42a0b53f3cdb4a84f755b75126cad72242d20e5c6337928e939902c24af9872da09704a499f320f751f0b2fbd832427214c3cc2118de8bc28425fe1f2d1690077c6a9a7f59ca0a2bf3172667840627f53dfea699579ff59f7928f3cb946c22cea9afbb0032008baa6b79ff8a00c3667ccbd3fa1c8282c180202ae064f858e3156109c5c79c3778102f78806289ae434d4485e0b5f18a4f82bfb40c60191411f01d0631d3dc190ece090fae56035c442ead1f6edd0803ee7b953be3077b134dd02c65c163b7cfabe11b0569d68b37dcfe6a7e7699d667d91793561df202c12728d18db0161e2bcf0e4dbdc8ad74542cd6c3f0811f2b1a6f2a40ff9c8073ef5299ff98cf1b1b468aa088745c1f8ce38da69915dd4134eefef453338ede853eef7f2941f48609b454c5cfbef3eaf2ea21db2db879d8f3c39f2b4c2cde497c9b1e84f28535a747aad42ebb249aa31c0cf213141734a510a31e002355e1d03902fae08c22ec0859df5a90c8073145ce05762c85fc8c7cde1aa96b76eb26fd81eb773abd2523acb6dfce923ec8f9bd96a727931cdb5b724e6266825226795d48c2d19d543270c2ce777f91524644dc32433de2f6153f60fcde82e95c01c379056fd61f34ca02cffa4a67381aa0f09d244b816e08168f404fc930f2c1f9783abf0d22a948bdeb9b8376189f24e6331993837c1b232eb140589a9429fa5e4928e627a964c2c97ef85d6d8a3dba18156d06b42cf0345ee8e120062bbe6888c552adce5bd291efc0618875532201727df082ca2faa11dd46262c9a2070ee5de89189b5fa9a6d55bdad20d79369f620b1da05ccb366b3a37aa27dedf55a4b4c6b25305015b29b0323438fa08b07666eff1ce21d398e0e83e00cd09196ccd0ee46de74a5f1cb01059ac03a3c9a4a082b65a3c8988b9eda1108ec9403b9c5de265d8efcf13a387866484fac43407a92385077f9b643d9a386149b17b7a477750ba42c7c2a9a77b3e4b79e61569902ed7d4173cdfe2b54a31dd6b819805667954e5a4751965ac08bf9e713af8aa85f2d6f8ac1b78bb0b1ba07cd5bf08527f1a4d294733337e618f0bb259f96bd7f2ee4a32a4e4295146287d4664c82e39a09588b403a7178b9aa8b91e14ba3511707660c2c703e306c29d199f0d9d953e5ff625c53fc03eda24dc81d0b30d537178b1908e52b171b9009f3652a26dafc8a5cad5ef8a7f1be640c8037b92294ce3a51dee1eba66188313b5ce45d8c357697b607e24e153a4d91788afda8fcbc09c134498c4e589928bec3770c5a6ecdfdb99bc73cdf0a911f4ecb0e75e5338b93557f2f16b1987ac160e414943238aafd7bfd936b1792adb65449ad6ac6bac2bd8fd289a0211dd0b4ad78ce3258a55d24560973b48cf55e5051b32432411b9d0d4b0e67e4ed9f9937aff6861c7d2d0352edd2cdd760ccabce0e70198442eca8df812948d8481bc978264c5aa9f26f5c01f5aac7d9cc563c09d4e1b70bce7c3b1dd66e1c26163b609890aa0f800ee322bc22f85875be551597deb6eb7094ec0a4eeb1945136be237bd1e009d463c8ee43488352c73cdd96773a7dac0f8bea55cba42d0794b64a73d2e980816cfbaed781c6aa06b51f659dae1c81ed85d36e153b57da9885a525ee9120489b23c276bea0e895b697f72c31ed88575475858a9e42afa2afa1d7d053e8d442676106e7c8ce4888eeb66149ed97d5def5d62b09c077714ab6dfacad816f1a1af166b6b2014583d5bd93f5339524035472d1d75871a9e68b6a83a67598284b1a2d176ccd7d9f5456268e12e4a6adc6789792ca3b01f29e3dc857202a600d6d55de5c07273a86788e8ee1edf582cb9fbde07caa546e9005ac7f1c9138edd6cde523194bb7fe258c6fd7f4a6ea0d409ddf62d6a53ff0b4c264b89dd520ebb6dcb16594959b863d38ae118b060b7cf4c1e62949e437cfc78e46c6ef89393f728459fa8ae08e4acbe62651f2c31c513b49db553df2185d9f12e23d6127341507a0a3dfe6e74889c072681955c5cbd2e4b0ea8e0430ba57e159d157ed6a156f3ea0d2edbbb2ad3181b4dcdbaddc3870acb39f0cd9c57024c4870ce01f883ca9b2315b980860476fd4dd4cdc5284bec02e60e95ac48fbd56ba5e71c16b9364bab8ff688f16d61625e28b77db4f7f17612f7b76e3798f95c03e7fdb8a4cad466a36e2f0a3f52cd2251e51432f6a69521846afa678f18f0b8e9b6923b4bb1188d79885401e82fa8090cd7d53d2a6144687172a51e6572f10cd5d1b0a13c8b9e2be11aed72f650471983eba2f1535dc0b3d3841947673bebc42caf1a57723072c3f0a6fb4e8ca8ead49941efa7f452b5128c1d8a4bd58be2174a2349c0b0d4811bc5c51b1898b932ec9d5e91f43e6be20130cdd2a1a675084e75c10e0ab6b8c2c1f6320bed5bc0ca2ae320472303e345f7d0639511a2df7f264cbe7d245bcbc99f16ba304817cb57daeaf0d8508a4e8f431f7b351465902aa68fa5c8c919d158e6a1410bcc3cc8ff50773182a89cf92e5dad4bd7ef09b1b875d11bd1dcff16f2c3b5907dc0918b1a86e341d3cbd05ee0ada485d2cae7e3a288b879e77c1db3cd04210bb2c88f55864b6304f44879f79473446bfcbdb62ecf68020e12d51b7e2398502e8f3f006454534f913778b33cfb280ff6af11da4a0190a74ff92c27e8a93da8379e5c5c9a0b9c617aa27d7590946cef564bffffd3df3daf8689e29810456a6243810e2f2421cf3c708223711eb42710fbdad89b38cf2ebdc78dc3d188c833fe8b4626611c9c373a4b3c08bbc0b51e2bc13a76047a8f26bee0332f72d3889a34d1969809c242d351106c2b97b1b23cc816693fbff5e52b49ddbe2abc5793a96f369318ac083a04b383fa7148e83e71a0fe972a368d910649f01642683b900a7d4abb50013c72ac97b46d3611471f6a87d3ed7b7204c68729557d883469f62a96e911e89752c798a0f2853ea596b982b4ae8dd6d92cf90ad3cfc796d05965b52a91f2e65a1167079043ea34ee9ddd40a19d7e7dfdef008e5a3b0745bbe6439af15b14b07872aed34d68bad17eb2c3f4fe27223222870c5f48a7f0066cbf9136387d53d7f6ce32b8afe50e4fad9a09c812ab3f0770e1e01fd465b212956ad9325abdcf3278a81633b8fdef3841db66daa5d6eb4a26a418697355f3cc448bbe0bb88c6d37b2c31f0aeae963eb307395c065d7321c459dc167b20b9882f47e5c56b8b84f6a8659c993b13b5a5c0bf7cf641ebdfe3a0fafbbc07bc76636ea1c0579078bb17eec81cf79402e009d68279e7506d4d13dc0556c98dfb0ccf3c855cf16ac55626658f47055e77125a488234a347f862ac785f936de0c2b22459cf21cb8b26d8da80ab62aebbaeffa78a291f15562c46bcf813fd75ec18f7a7db6044e4f70b4eb3707de20844f64408e98b385adb9a131800987ecda89bcecaa57ce810c9e6aad1575fc8296bab0e82e36b5ce272f8a36288a8b36603e951befa3c4578390ba6dedc086f83a2fd7181c8c3b3f17384b050b49a0ee78f606c83280616e6a0e7d01e8ed0d48312662f6a6933e2ff3bf89b2d7fb194ee0f1c374ab69334e65ef795d9d483ae21a57115084892259cfaa7a995e7ce72d8869667ca217b9399047bee81d797f5f5b4d657372620d8ea2f08460e0c1f57c4c78c182b517e6ac1fca82f6f5e736feae807622129a7f861df57a09c9b5bcd35a866bf7ba81f2080f8db1456d397d0ece0d0cd29825a5c344ca7ae9436abd65e2f0c290580ffde2ac9a7339faef3a930fa94703e1df9b91f4708eb086f1e44fdef492ea567e4f360596f88547a110caf8be7614b347c9f11a1b503794bb29ba52cf13e4094075ab0609e0922a7a35540baf0fc774517278eb801e7616336123d375bc427dca20a6673344a030dad468aae6260323a6ba75065b192d897c8049da355bae2c6e72a98c6d6a637c26009113c63a9390fd61cec4f583d2141a9654b2f176a6c257885d3a3d0044db333eb8f8a5f60f680fdce7e72e702ac750ce9b221047c73de797910218ca882e3a21c5b78fdbf7254d489a291d089a001e171d6e1fbc2897b33f193e3463ccbfef423bbc8cc2156d37e6fc46577a1132a1bc2147c55d8b320fb3c9093a92af11a55370945e2168345c6173c748868676e4f359c901e68214bb43c883d94cd7e793cabf9469c024c5ce585c0085f6734adc0eac894f07303377bf4a1fb731db83346691a8e100eaae3ff91a7862f5805ec70a94f268f6c4b4b942e933ecbf6406988f7acb525320cbb83f08dd27df781403de7095d192e9833f77f49ef347b4e57d79862a600c790a5ee528edb0dcd28be1b930e9aa98a96e3527adf0afbcaf029dd8d9909650ffff17a6ed426861c53d0901ca0f56fd995fc04008a7eb5a290c5e235a4de9f5cc5a7767743eaebc0b36cec8ccb52c71ef68625c43253dfd6cd2a12170cca252f22b3ea541cb23bddf0db0065a3fbf3527d97e009a4d3f4693b3e5afeca161e0b8dca863691ac7364ff9bdbef4820134278bdb1287da0da96987f3028e000bd93145b071a3582fb980d2d11b57b5a7f063523dc6dc418188916a990f023b01ec20d1ab4d1a31d2be8c791276c027eebaebfc6e8c83154e4e34618e63e71bf851bd8091b8e20f6aacbf9031069ea5ba6e9fb3574ab74a3c760d72340d2004040516f60e1c4fe96b7b61dc0a665013c2259e69954130e24a600814d502fccf0656d7d697d818afd17ab08558deeb858a242f58851649c3644b12144d55cd3cbec6a5cf4a6098aefcdbcd0bb6df5252a9a5e5faf3e9695d7cebf410327438924e63f3670631bdd0e432434e0959037c2f8a085447e563b3bc141bfc14b3d95f66cc0cf1ac0f1d7658426e743742504d482462496d63d8c567a5ca3473b1ae488ac243d002540ca44d1c8817fd53b41231731fbd8f1c36eca96727aa78b6c256dc5182638b420e7787dbc626d2b03493a9d27ff280718d0f376bbf4ac6e576101885938487dd9a3be01d7b92e1559aa9e2c2d53f02f91cbfa691a0009618a2297326c819b2c350636d6938ef01404a53c90b4a13d05a548a402c87d8b4d4aeed19f0405989cadf35f52538fb08f31e29f30a1f2e17a226628b4c57a0fcece4bb0caca823db2ea24306f25a54cb41831502f5d94c510dfb8c1313ba0063b85282bc10edbb50401ddc3b3a3b78799412f20d3af55ff7e300c06d37a8469944c8c79f4187411f24dae4ea3736ce0ce41049476a877264d28e853add467063c518011a45e89baa3d09ebb847059b9a0c68148071253fd7a0844b3bc830f27b3a937e3ac187cd8e8f3d9b3fc559d6105d540dacfd4c69bdce8180a8ef7211e3c2731cf0a6ea0d29f3df8ce2089551465a32a1fec8e9724caf9f6b5960f9729b56d51c26c0e3e64321589bd428e8c7338b346e4ac22bb360fcb9b89cca0be226ba870e6c32146304991433a06a222bba8e49882772dfe9541997fcfaff30468faadef75533e3845f7cdc7970e458855567e68bbd289b5349ab79cd19567fc0baa93894b2d18c4188e445c66d1d323de802cb1a11a251acd0d9498e2dd446fc4d0c3032b15ff8c1301fa474c37f7a646c9fb12883b3450af86a2132bc6de7f53fb7c01f90797ee618ec40642e1386c2a33ae710d2ed616c613b77393be485e45a6bd065a55ba4b0bd7febacafa65477fafc0855ce0cb18124666cae0b747b40243f07f6c4b6b26e82563d7528a60fb4158d90d82cb7f13fa94e5c4c7a7f3fbf7ee5ca1bb43f4aefae641446f00a160fe3a54671802e122e632010f52208b5529271b60780c328eaa1e11dcba426f9abef358139aadad7193bcbaf2216e9a8679489d75c6ccb5766e7355a5144c388eeb661d3a1b138623075a7ee66800709e73bbcb430d2ba48830cd610c225f002e4bba40621c78b67dbce47bb925eb7d9258d548bb593c4a2cb1d0d1034e53d4e79f0979b90b795defe507eaf8a6c6f9347a97a86c1fa5035042ac1abacba4341db92d34b8b80cd509ad49feb9c9bd6e4bab7db0086288d704be611d42ec8b1db752cb0b84fcb012f0080f68cbd8b8fd6c008c7aaab58195b592725b2bdf0faa4fec9a63ba0bd26d171deac847696d21ebfab550aca17c8c3b5f64982c980c5cb230a0ffa18bd6e545e63dbe763b1f8a748a9676e61565b1e0870538a29d9a8bfa545879e246441969c4b8935e6614b1bdbf9b2d45e388413cfaea829489c4b3c8b83462c5c2e2b6d4d35aa9e8bc5baa7436fa5e8a9e88637e4022c06f06bc5106e48834a5f8b07400c5ebbec14d4817d86add15679174dc482a01463ad6387765bc3b23d5dac8b73578e6f88714638316d26c6c540c8eee972d4a22acd04483ed7d9ece3c62fb5b26596004fda624c29ea860bb85ebc04677dd4b37b3e9befb1c8bad691081b349b2695c2d6ccf483824651b259604bebfebaef1b5710226c97dcf9e0803fcec037709fd757545eef2ebc770698043b3bb7fb08b120876bb88e4cd6d678dafb77e31f606a0dec0b4d71635500deb1650f55eca1baac3961b0a85cb556d80466369c2952ab1d9af45676986df38c404ab0304d4950f0e7469758ea3f4ecae494704e07f55ee1c0e5f74ed884d1a6020efddf5ada633448315490f69801958faffd25bc17e1d8e00702d1909e01b6e929a79626b5e0f25d62b3b4a41ecaace592cd78b07d17c818d903e64d50ff820dcf75528e8773b7f77c27c2feb6fd4937be255664ed8e79cdc1e4d50de3ad3a456356b6b550d66c17bf9a01a5cc836b08dd355efd7914c136a56b960754f56021268a710b282c072a260f5cc2c506b3d223465acaf051036f1962ca6ecd3b769c40233ea1388c8e27e6fbff44390389a7af60c7c71f252f993f11aab8b1e74818753eff1c0966c55a6fcf94ac237d3469258e753b08f6de14361d6ce50e58d27634ed840f71496cea0793b80a128414c4fbbfdde27ffa2897c94d63edf2fff9d097c4cb3bddeb5ef7bccff66824fd3b6d7fbe6ff34d9f83038ed2b5c8e81d8156c1687d78e18db2f055087f08043287082b4b061b5bd211d224a1d4eedd93f867b88c25fff88dccf87bdc74cc690d08fa162d9b86ab650cd8a6ae295561a750aa2a13070de131b7a55913ec3dff0f4188bf5748954bea5c7e4eacf81bc17a6a184ac632bea9420901a2d108d1a380d6cbfae33d0342e108d1928512e9f7469a0695c20180df06dcf58d73d1080327a3e3291d77ed418a963466fabe6b6d758370e63f6fe3dec28ad829ebac279bd8c6d838de95e91f98e020ecee5719a5246ba97b8f7572dae58fd0b6993affcdd6a43e983f20c54533237d132dc12ee4f8c8838502e70080346b24d697d433ef0b55d11624f2e4cb651eab2c1fc2896ef6ec0010ba55a8e820383439e3c5f42c6a43dd4362c87a3cf1e50bd6bcb3e9194e6f164c1642129d684a497584ad71ba09d1dd0635a7260ee724078c2b558bc5be82d2b4fbd86175717a993dd06fd12db08085ed7467c0bcd872cdadab301ff6e27b9101f2a6ff4d8ba8704312e2095f504569e87822476261e61e809778629cdb5dc55219a2946ea6374db0376b3f2904cc5dd2b501d07ab80087841334518dfc75f985c4a834ba4dd6e863e4345e3ed98341e5fa42f858b3294dcb80bad954b8aa8c0fe13c8c8f704239f5d4df293ea6c28240240bc637b9070d9bc2d7d02e32cd697d1d8521d3d2e34ce46e7003c6ab88e7a6af2a4021ee0c984c62ed3b927ffbfb26e8c8d6971193d2f1c5c01adc17e631cb359c73015735a3eae6f2c519198ad9f42f9a1217a964898cf6f7ce9c45534497db944d5e99358580c2d5b566e2cec050a3c48bbb12c1a8ca3e9235e13d1444a80031b9d362b287a3143e6c86eeff4eebf207160a949dfbf273bb6a794cc701077326da9c3e2fbc208d63348daea79e08a8a040b10d38cc7da4ac492b6e893325bc6b0d534dcc3a4a6188c6eb580b53f505fdd798893acffd0b1deab8767c53cda342641ebf82986382ab531eeb875fac03c1e8f4418d170eeaa7df3247727f04c7c3dfb3598a3c33e50ded0bfeeda9c0b0f87a0bf7d06ef03c474ba2048c0a2353b7c85b00ea7937bfc48d442c7b85f3e65037fcf2415c7d38d447983fde0323c115b45020b2800c2f1b14df26f9f93c250f0fee7c367c9fa13984509933d653f685a040d3ebbd8f0f91e6ab89c003b579254c758270fb2e7984c0d1c0239059a8e74dfadef16ef2864d250b6d7e33c902b11491d77ca0ae35b33e0a07762ad06037a1244103429a3c19c023c42c5c0412101076d6988d04ae24d6129fc7301cb7021fda98d6733f9d6d968d4ef1c53554ed63959b5c0dbbc4f4430a9a1a288bfd6a98319824ea338414b42bebb84a2a42dedba3793234f828336d83c8c991d386084a60598a4ef671d412e5343367a5daadbf539272c0c67f323e6aab78d833b378144ccce6264d4ba0f5f65343588ad626f51f6360087e93cc8e82986456f20173ab4fe75cfe6ee70c9178ed24c21561a7415c89cecbf6e3d16a51063a45aef0cf534dc7ce32ac8de356cc528a5aa0fb6ee16542842adb549669c141a50ab2d4008777827f1cb8a4c106e3e4a37eac07689cc40192e910d71d5d96b911abb75033b6b91a8ad824ce7c6331af35805076d3fb0aeb20da0432deaa61779b3fa0d5eada633e1ab410bc4e8ac05a809e4e4b90f3005ac1fc6e0d34e9154ebb6bfa300022b28ed9be72e3105bc3640b19595810076f3aab0314817979526feb6eebf7868aca4ad49b1649a85f228a1a7804f22551fe9da5510095888600f7d6abc7303420398f1682242ce20f2b7dfbffd5eb6c215bafa7ba553f71866b0eb4e47d257a1810166960450917f769c6582443126c0241185f7372e1cdb77ee061c6c2ac43a0344b65f6387e83084712137e20fc2a233360ddb18b0cfd10acbcd5ad41080985d9b5cab7965c2ab27a3f0529d9dd6d07c1d6bf0d0be707b5d69c683b6eeb6e6a9e8515e42a6efb75a62fab2361f235fde9080fc7d07895a7d65edf77d9f1fe52ce12c9de1a0570ad7716088da90b9fe7a8527999325dc9bfaa9078197efa95af252bd39ef924e96d1ca8e0fe7cff1d12270d396d09d1b160e9560181973cc70561c65eb6cf8ffe3ad236ee7061c4f02cc90089e10906300fe4c173cca890436a8ae6899cb0eeaa6c99a0fab25716e367ea814df9f2ab2ca5abadf652d70cc591416564165e9860da457d370fbe2f69d219ba14f6d74e2c4cb42892c0853e1dbb028cb49694f4f633eebfc65a14fd4374d5a34733e288e3ab314e922e33104f9bce6d137edf119de8ad5fe4bfcc22b3dbe2d78f515b9f098a768d2c032bb5041026579e46e422dd6640d27d802f2b92bc125b9df5b2bb9fa36a640290f1d4caf2fac484cc06236dd14edc48ae1c028f7a0513cb8c233a0b153021607eaca4c94290d816884008f728fa85c6a321b595b8b4fee7701465e0a887b34ce401ba93d93866cd9ba41c12c99b1ad32d7919df403ee2cd9e4d40491a4c55eefaf5108299b0ccba5c24e16eff6cd88c545eb8166c8374c73588d8104aef40806354900dbbf26c25ab866665f424995a0fd5cc1b83ea7ed4b9c24426875f90e66e8763a71a01e15c60261a70648579dc3bc55228bc8c31903350a34c1fb31e389824bdde9e6fd45e876931f54e988aadb434e8553a6fec51d1d14df848f5b39525bbffeb45ff408293a6fe090607702248804fb3b8400f2ea2ca89af7211fcae41bf2676c57a254770fc9db0cfdb4551fd382cc2628738f898aca16996fbcc76380bfa17438fc9bbe21123c81d5e0fef80c11398cf91c94905d6a8a2a1ded801294f22383fff60e2556c549845dd1848b96539a212f87941a02d6e15c16f6ebf063f91ba840c4372152220b171057ca18ac6e01805915087965ec6c621196193a9a1e285012e516de7da1591166c516f4d79e720d1fb2578fcf25941304843cec79647009dfafdcd3be4d29b1b2ea47c4b8181d8a641f01297f052c66c56f9dc7a0ae8a8547dd9efbf6ad1c9f356986143b7ed6504582b7010423805e114f7142bf1351a616184518425104a67591dc9a5b04de73d42d29021b34230f542f38442d10a1fd4b8b9c080290bb801f7a4689d90cd6d851aebd95457c39e807a13caf6ded826a85a815ddbec8100fc9228e3ee8588126510eaf84bad0015083c719c3956636e2d921b4f2df56f48b029de0b48ac5b236228fe083e031fe0f925b77bd26c6a6053d0077be8c6658728823a3c2b925ad82a628f658fa5f44b3ef8b478b8d51c85152c9e2587ac7f9a7be4b101a953900cbe45b246b0e34cb082187843a752793cb002710253fb2f7aa45e8da27edcb3ddb313f7b094c9f54055d2b61f501351a5ab2aadb0b61cc80ef314ff4ab783a0ae16ec626265eadf8c5d71f89a7b2a936209dd8a3e5779903480b159f6ab0451580983fd2e747f12d1c00943483d09296da2690cd5bc545f152fbcc022861901a4da55b5c74bf25bb09feea946bb3bf94c7b7a96c5e554963638e40e088649163bd41b05988490131af951b80ac287f9aec86ca7a8faaaf0e88ee6ae090972ab5d8b3134aed521416ff4fd5d64871494439f1009b53c67e7f9181dbd68d047b05e64c0b5a89446eb7471a00abc6c6db9c0cd4f8c10b8d1fe93c5da0d2f0c9a59ce4f5bacb0a6840fa2a669ce1425d6b7f3577b6fdbdf667a98581e89de94c9cac8139eda2ef1d769421fc202d869e6edfbe74a0629158034f404437731a2144f4e03293122851c5941a96f9da3a57e59aaada82cf5ae4e13266b0db0b2704ce674a03cc99b0829bd35d88577db9ffa83b2d461955140624d8cee3723c44ec857eafce821e9d5585f6c414d0f90103cd1aac26e5b0b08c69d0068e5b59df96efb50fe27f9ea3aaf8ef4366f8c884d573b9e7dc819239dafc88a3911cd3294966490a404cfea21b803953fa5398b60796bbd86a070dbf95b2b32b75d43485c8c0b8e7cc67cc4d6ba6cc4ff5989701e00d5968a4856bcac825b8b51e9533d53f583990c3ebdbc70f0404a5c05fc604ab73b245eefc092023d94a49998255c4c165313985e2651f1d8cd9789b77cd9ec772ff2e047c46aa9819c5ab461cb052f1e04f5e8764b08dc882b70d2c90241527f53de8520f1b451df0a5de2b1ac3fc70d58d9de121a887ed0be9f4181363c6ed3d346a863cc3faec6b19e476d29e134b7485430c7bbec1949173d0dc1500c2c8df96c029a073ffbc2e9654b9785beb439d203f0b96abd44a63c551a581acc088cf3d18d8e010e72c18a0a8a238a865b74fd47940afeb524338775c8ad9f0bc41c15d5fc473d6331dc94462db9443c20eada804fa2dc046ab03c1d8a7472e72574f924b621099fcd72407464f46100c1aaf40ef39ae23eb92ce237d2ec071ae441c2c7f43e8cf9dc4cdfa1b16336c57a53d474cffb718e75941df08670953fbeb05dddf38fcc6432f2dff5ac80f736077746014b75f77f1188a117bc5c42a69d59b33f76761e6bd636ac5467b723eaddae97917767a9b4764afd5ae239f9d65e9a5ce982e6357564dc40fae15b92764b568aca946ec6685957f99140b098d067c8149877d329fed61511c444c684c67664ff362fa85b76b99fa97cd155e3e94e0ebcf8b22805e28cbdd8b3c8da2d47106e2cda75a6fae759f71e6b6c33dbae16a6f3c947123311dfa6717883eb2e38f24867825917cc6aab32c8a65881e22c628a0d51d2f6aa66897b70e4afa400389ad59c31c530f7153e5a69a6fe296117d8d9d60775020f4234d1be5f5fb11ad42fd944ada0be201e1c1f9d32d42c4c9c496f5d3e10afc540f02913590433038fff6f909f74ef61af49719e4e273a0cfed51127490d9c8831cf2e251ae621c9b3cc53e8192f969047d187e9225b439058ef584b3ec937d948644022d099179b862fcacdbf88cb4c385baec8d5470ae8a43e8b2d04f843cb829c759f153ff2f2962ce4b48d0ca6f8c3187436daaac1f8e763b3acb93c5d36b28ed82571a1dc23e18d28a75fbbd163c5ae51e9ab74736fede2b11c86ea792d4b8efef8d806ed0723ba9b9471a527a34ab574044a22ae4e5e23d36a213f221ae8f0f7c3993b5c3999c2b7b859e0386e4065195d9a1816ad0905950254be89e7b597604c60b385e1d40832e8b90d5782d6bd600de17050476f1492aaad58c33d5c34686b9fc297aef57d8d7a29affcd6801e8539980ab61dfc8cd6474e18ac0123c6794459210dc763d8d939564974fdc4e1e48de9e6a72059717bfdf76939bc52c2ce104d519e4be91691e8377f29ef45c7d4ffe8edd2d9673cb86eb25619bbc9e40df2d2dd678427283b4e69b4c43ac9c8905b8ba26113031ff381999cd07eef14b27e39cdb7c614bb39a7e1e2a7e831f4af16da5dd432424bf35aad0a28da8de7039738c735a39c71f0d3a02a754b3501563311d701d5224692fb40fd43466b81d53748a6f55ae58cd1165ae2016523d31a5a7242e8ed5a11f162ae0ebd0f94940eee4a909620d4154121c507b01d38a9093cbfc3d1324407c5eb5927f4b349ace513f906fa2af708d88f9dff4ce2e78e4fbd4a9d7ec3e2510e63eaa1227e220f6b9ecf112188bd95d213b5e19e6d9fdf6be208c62a989a31dce9c06cfe66e2db644597fca6763d424ee4896f7d69772295ce5413d14525c0b9929e7f8c39b3c742f8d2bc5796080dce4187661fbe67215c35a0a610fb03da8374b0ee051102b9a3b72ec66798750f3c7bd6c874da0eeb750085235baf4a645800c479a2347ac2db015a27e236485496027de882f1a8b8a32150bcc60280231d6522e1d20651d591f0d4cc1c0ce23bb0194a414f4186120d5bc6de6d8140c1e2a8b297624fe124c18056b02c346988291be19e089615a37e2a1b21b1ca01e6c1694345f49196f3dde3785cfd9876f8bd8b5566bf0dc185cd26a5b1faaa41d8e248cf76aa3ab737bd5d1d83182d7456b747cbead6c4494aaaf93848c4d7a80695d5ef46ce766a58fc5ab40b44f5ed5d46d83a280a243f1a93bd0938acb7c0a5b2d1e26770c65bfd2e2a149c30e4fed0ae649fc5fbe306a77fb243e2b01a399639eaa23922e23ea13990daa8922522c6c3e94ac880d8707606971fccdd7aff6bc30fec947b141df86c838c9c2392b68d30ac6d8d3bb8e0a86b319d0d2502ba6832efcc8a5600cd1586d31bcba10ee66080482abd4fb46ea4d3678279c018a7399db99f81233c39e5f0723cd8897ccf467c89260c326b9c41e77136af26a3b972cc61874bf8c4fa6cf02c11df424022a0f00776400c49c1b0ff8c630361b9e3067239549e250dad5be14361bc20242bc0c7886190eddaf7e3e3a9d63ce6734457035d02ca859beb04cd0841361c4b39a754a9d33376287d90647e625951b1eac1c5e64b520509b9dac34e5fd657322142fa119fe1e7eaa9dac1a44e9daf93cfee98e6398c1f4366f82c4899f97c3d4f1b8b627244bcf13c62399a1387a8bdb82c350258edcb5509b7db00ef35082bc9c1cebfcba4d5aa3ef6c79442b4ba809915b16bd346708c16a02a95b220dea6abd819ef265d0e83cef9ecfca8e5b6a6467c9b167d18524e2bbd37ae05fb700aeb5a7f74f5d9bda2f1d686b3a54a254926db7b17427f85de99e442425fd723a0d5f8359d604533f0bbf99a0762767fd89941ddd922539469150aa4753110acd9bd52c35672de04d291c1dd17a0c4d01086ac0afd947be46c289eb8480c0f9ce12f16b9ee07b50d135fb404270aab9db50cb3a73bbbc1df7f4b29db6b432dcb6e3c1b1d261f091e5eb83ad5fa6703565567b9143a2d0fcb79a1835801ca29764144a769da946381d69d642d555e26c064ece57ecd1d6c11f049a8215fe35545e453868bfb9158f693c03f737840bda1e72d66fbbababfc4a3b0280634c47279a531fed08030e50186f01b0d37590781ac41eedf8c50ed160954606e26334f8bb34f8afb3e953390b213b55e6c436f557667f7e87d0e53f09d0a51a2efe167df0b362f9ecf0b4587864b594739c805c61428054fc40127b4a89661979808036c7a8794548fcf7ba76c9d6dea1990fcc159177ce34ce0fa9ec2b6598cfbb2c8325a2c49321714be67ace643539e70efa3998992c2f235c4de5c6e6be17dc873345f5ab9f75d6891de7dea3e3c7d89dd2d13d6d03ddf6ee1fd6763cb8a4014623ca256af7e7f9dcaecaa487e82cf163191d5d54322ac0673119351ca4380ea6d909dcdc5e6953246b0bcdae7a38a2ccb5ecba7521fc310656e6359d155cd6d976689036dad860a40a57f2be2c6e1928871182acb859667c3edc337d3a1a25ffb5f5f0a732c4a2f0adeded62abe871816273726c26d89226a3fe4c612ba633c329a9f491ca92faacfbe3d5a5d399a7e0dbc03af97d0408725fe74458e2a2db05d05c96b03e33d064ee358ba03e3df399962640acb927cfdeffe993716d7e125269755ab1bf500ae9624dd1c881bd8b74bf0b0c49959460af1adc7da2206d70dd8dfdac74415e3fd1011d9dae8b89ff0e04ff1344b303aad860aa2d248b78749548d467b78509e4f92c3e61a2480a36486c41fc9c3491cf10418d6fc9e82c97ea2e9819bd63c79b0614c82a4c1ff79746ceb4b65fea2baa6f7686a7b9389dd0ec2647332a50de73ac11c459aea451b949579cef6fe9af50ff37c36fc8f61ab484d6907c34fb994e3f918e54264e03064761fa1e317abd33d2b74684a310fa876e97630a6667f9e23ea211e4b1c6a494d5a74aee9a7bba607d657d74f96b735e3b0f5e21f920bbffe78866833c079e538ed7f96624d4bf98b94a9c9b549321ebf313e745555bb4d53b4e7cb48fee313b72e64b6acd240d2277fa2e695b538e76ce6cfbcddd61ffec232977ccbabe80df1c229ce2189856afee5741cd37dc6b6df01599f1ae6fb789f14e9ea2b3871271f96141b69cf7aa061dcc0d2b46eb76eb46e71980f9f0d53484a1fe71f77dbc9a09476abec4e3ca089196f10850298cb63502ae7878718503bb50bac7ce8586a7ce6e712e63f225a52cb6e6012da9a3aa43b4c30ad819c30d789abcb9177a902bc9a40c9c079ce4db71c2dc429f3196468a3a7f13570ac5b7e7d63cb1992d602c7822ce274d23c17de3656245b06c6e4733f265ed5f361a9431d276f45f8dfa79953be544377398733a8b3e8f2904452a6b159cc54082a3907786326d1eb864b0bc618e5ba79ea8df84e37a42ca9aaad10ee11249b1a759817247da7351d3c9c7b640560c619f23b30ff08e68b9b18ae2d94053f5e9309478f00a222c973ec9279ab53c7bdc16eecb89f53e3aa9cb38444403ef52d35c69be5a828417190d2fc315e30299b6991193736754659db25f16763ed5e8c37b0c0ceff456c5570a2a578741565b825d17486694306f2b6848069c7f3c19ffae0ae87664bb0bc9c22c23257741b33c5b8186fa8a03125861777e034ddb2e8b2424f73cc9725b118dcfb0065ab64f47061b7d7f45323b8d55aaf60e193cce5c104249b33513480b0f65bb87803a4131f839917c738295de37cfa3b1548e584f4198c055ecf23b2c837321d9c861d1ec439d0a0b9b85d8a268251248f1c329dccbc1c2f0272abc01f145e784d1ac05c1461688a5e2ca8a14ae494fbd187f847c62446fa52a20c97be9415c4beaa69a7b8d17f145fceb25db941fa401173bf618cfa47366b00249b193202eab9f1e80339d2159859333634f1c1a667265a6653b75356c8cb6f4400a6b884e60ec1dafb7aaa79f09320b3053e8d3559b0d68e7cc4d785febb8c0cf02eb979aac9e07f12566fcc2a9cc8423c1bb77f95c4af60bb1fe945222d1207a64a44c07bf8561c7122faf80dc0c12d1dcd9d99beb7b2cf80dce237424df2f13e63f1671430d224003877c21cc7b4e25e5501c36fa1d11056b5b866a958f3b9e20b43f03d5047c11547958962f6e96447e5d1308d720fa774ff67314f8cf7c973667e5c673fa08f6960d3f243d74f777ad2036253e2d492ade5322851df4407180a00189368b1b858417c7207a728befefdae6bed13226e41506232d28e1bfceeefa4949b4dadb720cc85424259ad5e858d8f267c43c23c660fdfe4566745b6addb15be8c03240ccf353dcf0fabf7b7947200e9a52dd02fec5a454a152f00b10e24aa89810ea6707ee057d41c883a5893dc933a704e1134cfdb2768f3131234582a2a0975357c0e1a5c058a6114e0ae5b06ae7c1267ec5da3da86ff8ac861ccc7791ae7cd5fba1fea287c2137456a51030fd60f62db750358c84bb708195afb69116ed09ae13f963bccda18a2dbc52403ee6fd48f4f3403619a30305de273ee783dcf033d69b5d2daa58fb56832d3f28ac9d869357489602e0e52dc5804bc5dc684abd43efd682e71759858a0020c05c8b5188538817cba910d721867af7dde666e9a1b6209a54fb5d8c3f4656a96c96ae3830ef2a2c41b8da17e75e60a8745f52bc5934eeff30685508be9ac185c7d9c4979de4b33cfb266993eb579f21eaa0018725473368a422f0272d8f090c677c8099493c16915ab8f45e7f88370afa20bc714c21b6d028e51b34b3607ebbb00005c5d4157a7b1f4908a9487937e2de75b33805eeb6817b144d4c3b9626f313cacff3f7971a439a41df490b29e3ecb84461b3b8fed352aef0880cb1b16cafd3d618d5e63fa4f09e7cab2f5399cdabadaee92e29e144bb0b62416b958cc0ac4dfa72dfcac18c97cbb75069d0f38149f81a7be1a98a713ab792b4eaacdbc7d6ecfd19d6f722386246f1e08d84b97fe53724865afd5408f2248b721480a9663fa88a55418b77df3e1cf26d4f9cc126fbc937992084745797e5a44d326d393dae0e221bb09a19c4aa23cf8a30a8d30b54e4fdf678cb82df834773af527fdeaa13df84fa2308fd1196985623f755911e1e0853ea2d9abd7d469d82a8cb63836592715f5d8520755b9832430a508fb476aca2d9da8c1bb0c30fa3981b39e7834a456e13de0f19d37c91a241125f35a34077f4b328638098294d7303092435529df441595886c160ff2f558b5e0c342b514f32736a6079c11eaec23e986f50ec9ac4d70f91a71c5587758089e17ca857412b5832f899641d6aedf3209cba44b3082a7ed574b3a5dfbf5369ba002554fdcdffc5b1f1507e686fe3d06d6271f780781a386f472400fdd5abbe9ba9747e9322c562b18333406326806f2dd31636407a19246d2f219e56435c7a72bd52d4ce3aef8002f82e000e5ba7694a17744ace5c107913036adfe8237d697354714d5519b848ef6e39b13a9886f333fc674d44ca5f130d57c2798dd83a30c5f3336d995cfeb58a4af7570a735fea9d66e846693ea2c75a102b63a0ae7b953c51cadb05fcabdf84d4520b692a74b840d10b099f327fd283559775c30cdb82fa93f2762f95ab04584ed72f7d829971a3cb955de0a06046020828b9d32d6de7130ba5068031eb9f055ecb91fee8c58eed8e9f9cb88356450c620ae8eda543c53666c267d839389c32b7caf1e9dff661cd3b842b6e8b64af819de752954e643369b669861a0d29bc5d8242a9caa64d9ffe1bea94687fb2169b6d3a82219d95652f8e78f95ac2b41a57b2c9a5512e7322b526640345b9200ee8f54ea0a91278ab849e943ebb390e30b95f1c6ab3f0c3a9eb7df16b3d6d570e1f99c7e10ec65fb2edf08a97cfe6acfdf911ce92127d0eb97d7050100cbc2a853b91281f56da2a38b8ea14f4f9fc3439ede7d2c1dfec4cc9e5320c4ef15aa351b02bdca1831248d2042bff9656cd2dcd4e619fd11a66586a88d9fc3447f437094efaba76577e1eab4e17c4a56860c9f989925b8d6e052f294a2c8e4a0d4bb535b82aaebd60e5f55279a1d314ad4b18d9b10387bc3694eba406d60f2085258c387575991f709dfba278ec8db674d2e9ea12fc2bd0c30d742977bfbee9920c24e452f4d45169ad7996779d2b2a956a3caa932b94452f3894a59da1c15c3bcf77ec6353ca6e3381eb121492cabe9156b8586d8b5582b33bc53b03c8c6821626f0185873fbc58bbdfb31072a9e4f410fe1dd8d542f735eadd3981eaf29d6ac3dd1323010c1b94e258d27c215c088933f81352bac5decdbafeb3abb243100f18c609e140d776682e93b57efc5db13c1df64417fe89c6b7704b08fb51eeaaf66830c823e02938845456ec538a1c0ebf8f91e6fb31596c57c49140c6370d7c153563b69f935d05ac705b60ffac7108d45f33ba436f4beb6f436563d80341fcfc3cac5e266cf8d564b9a1d1c897947115b09968a23d4e30b707d0f195c3060d6b71d4b367bfb7656258a767185f9f7f69d5bd825384d7132cb5b87fbfe28bffae397fe5c4ef46051e00dd07a9b72cd06f573dacc0b426b42981049a287dd7bd0b1d41988cc027699e6ab550e8fcb445759a09890773e4fc8541236f1bdeedcc7932b8944e19235aa3c65956fbcc78ec85c6b0fafc92d61fab74eb0b2d2ddce333f4289e91791a55070cb537a64b55f53cd558af5dcce24ae30b68b73e6429842836f4b35f9eec1f0df48beeb6fdf5ff79508e830683c8007c230a51dcbce0ce2c22291080850ae5a9a1349436b0ee3ecfea689bd1b3c16993fafe59a850a2c034f02a9a71f66873529b74ca318c8834986125f6795bff498e8a91e726fff3ef0aa3ef3b5fd028d23ccbf3e07a125f8537812b694e828edfd95878b0606db73339a4979422b5d64f42a01a68e1b8a16641203f01443b33fbac2a062a9f0b65270cb3e106c84f502b823cbaec2dc26ed0a8b698afb39c685ecea60e51c35794af2092ef085c1df74ccc3cfe188c4466b7a37e0f1d310e1b438e10b2c7eac248594d3a8adf9c1a68796375ce682d452d32f7091dbdad105a5581c8364013d542e0b3a0e528987c3c8d1d8fdb4693f216eb4ffd5db84e4be09f79b95f1d6bf87b529fbeb3d1327ee4560823ff7fa6c4b1202ba1e4e4794ec472e7bac40a610c451814a77b2d950146816617410804133272a09902bdc75aca7378202e100fe28eedcf19d1d13477206a85dec5cb72b95bea22189ce04608a39f02a6b45dfd3e68b8532076d7e7f6a90de6fbb242999b890612b057398dc0271a9d0be9c0ef2c88129d0fdfaecaa383f197bd731ba37ea5738ced3abe820f9e804b1b588368dbed309e1a62c0a5a3c71af07cc2039b7f183fe40351d6d82a0785e085ad31593ef885a53358b990c4cc2c650462a05a3e963a63ff2b5decd164022e07046205611a485f3704ad821078410afa13af1205963767094a23233c585473f1002b79e8c1f22d12f241c48078826c36a492b0438a81c414541668aabc1c3066eb36da4a77bf7234336dddc5402a03bf0fe3503de1faacbbedc358ce719212712d5dae67c294508a4cf7092648e738be41a9c4a48eda2e4f386c187c851255390630029e21a92caad7d54c9cf048138355a38408d1397e6eb4e35e259c95e271b815d682e7f2afe741052d1b70c0876809277e067c62211a0f3a2921b2312e4bcf4f7aa44d0b57ec3e1c8fdad372e13a94aa9366747c52554bf7427f72c586b8191145480a7cbafa2c47862783a41a0fb2ccb1f0036d0e9faf5e5631a35668beab75c36fd5d6e827f05a6a1e5c714f3c493870194d35993218a55790d5af757520d484c97bd9640bd7422bb1d42cb2bbace5c6f5fda69840d95b4d4e097e657fcded22a9d297fd92507d8c0ec7cd9371b704133acd1db8bc6c3e1ab79f15e985a12349ed035bd02ea14fb539fe51233565156a9bd6df98626cedfbc934b9257554472cb75e6b35c986a20b89d41e4039d0f2615345015fd335187337d48d43a2b32094087f2466356aa54b0099104f0a95f92591cae96be5761dacc8c28909ea7b0296ee4dd651d9557177c6fbac2b549f9904303f652d8e808b85051b3078e68c524dcb64f4b61805f697948f24076667af59af26696e0e4cb59581497f9828fe61a48e547c60f782a4fc67e84fc9ac9784d42beb0881345060d544fe5fc3cb0d2846e732b3240caffcc60ea17429cfc9277e6515170afc4b9ac4b4f9c93f81b8e556af197bd5bb16186b690bc9f1cba7d2a683ea5deab15d10ba4d09c66fbea91a03c2242a4e1a0733c2e029695a8fd10b18ae74ef255c72a1a9ee9fd161d3677f3bc4a2ce9afb6233e0b9f9aa8b98325776be92498eebf9b2e4e443bca3af48c4c57ec280a68872e52edc9e76caffbc2d55b7033161617880cebb31241eeac80211643066b0cc04e1724e48dbb60d545db168a55e778f902971ec6de93db1eb56600532ac31f28fe4133ee902d2a88c2947907d036080d4da0d35ec811ea84148a98645f7ff9716672dae14c0c0561d895b5c17f13ca97eb0120987c4c9dc08d0e10bc86194f71e7ff8b5df8b82253d08de99f58bde72b765908d4ba5cf493dc15783cc46e435e4bd14a02de3bb1425861674c903a3e884e8d703294f68ed54e7e3ea95038b2cde679e91d7b25c33007a41acaf75ea2f0dd5f75ff8393fdfde6bbe300d66a95618ee036f975ac47e8c9f4313544e0f3d2a4287b82b1473368304d21d1914f5a92e2a94a3382fb9d29008950c7f70a5106f36c910d7d2acda31404a656d92f8186f27fea35910a43e22fb2377254bef888ad473091d7b51150ac99efba4b1b6c0c7889c86c27c9cead524481344710a20e5beb252cc380479677690bd9d633141a8dcb3b9285304f43d390b62e37018900e3b512871303f60e8d9cd1fb6c054b902417934e01f3660b0cc8886ceeba4d13cd7b6bc7951553ae520068b110bc1cce3711aeb01750c8c1f31de6ac7280320135f0fb5197c40f603a46648e7325d45e3df7e21cfda9d63226d3d5cc2d810556150fcd89d32747e1913d0237eafa57ab7646a15e1d0f7e928f19cdabaf10c089226bf661f41da524553c29379b763949f8585561392d604de93a0194701a7ad4824779aab316b452c3d61245832b28f67b7116d684d5ee495a49b4676028abb3cd18a0d1a44946aa0764ab0d592f2967c8090f4c7b3ea737598e7771a59d6fb5527eede2bbccab8231304b8eece0870966648aae87450c12a457ca021e76a7c0419551e9a6da4b6cb07fa53cebfab1d381b577207849e829fc85b26aef139d3f02ff6a55276b53ff6826125340c15fddf869757b7585e72b217e43af610c81729876da5020a81615e65d4b392e02228d2d498c301d7be3350919efc6283a51ec580136abd7373844676835c2acb575b4de25ea6cbc245bb31f394a93e39cb53c4cb9312431f58c4b12cf24b3e399844f02935c1b5cf0747ef74256084628427e5dacd6a29898b1d746b20bdb7e6cbd32a00d5f02139d3b679195c22f74a63dae4774b4def34752af12978848b33aa92f47632375db472f05732adfbb2ae4520e6246081dc2c79275daee00d32d8bb1176d7ddff20700b2ce913e8df552e4c8610ccaf03bcc734c04bc3888264fddad1985a9cf389d56df72e3335e08b265773dbb273742697d6ca04f3c1e7411aebe8d56b428ef06e3324026ef17147e11dc17f68635cde19596806996c501f4b60b3f6fcdf898db9086ccbcc8e37d87040534d3ce3276956c96184a04f2026327c26ac9b083ad4fa37749affce8c434f65de20c83ef62926750628674c9c2d8d32fc49e3bb0461f0486580582636ca890fa84f202e097926584d4e496a7f3da8f5a34dfa565df0236b5a8aaa117f773d2dc3899d9382e9bf5cf07c429431fc1392ff3460ea28353cf8b53ae210911b72b0f70ae623fcfda213b4d5ec7de833dd1b9c8af60948a422b7a9c1ced2a3151c3a4ecf657f91ecf41bf5a825611c50f691d1ad49444dc6a8496de21b2568062f6dc6f7dc9662eb9d3302d316282b22483012d595be867f40f69feb582b32339b2b97590a509722cee918e409e8daa367d5851d12e23264d3f6d073d81c25bca2c2f94993046b571b3a636ca93cee0db21a27a90836831d103b22f772a06ff5b61e4e074f00c0cfb8fb15f108585960cff591eb750f91365622f60a6788b460b253117e2a5055228272f06c436e470d56ba961789dbd2ace13c127e3ab9e600728ed4acc51c0e04ac2dce67312a7cc8903b5c0eb3da16b12a7f1dc40d53f6242491a940f0990cf035cf4113c12edeaa9533426627fa8207a78af9751f09e4c9c6fd8bb039bff2382a027b890b7ca3dae0ed1755c202088e88e1ce8384a66e6a9a4b46261e0de6f02b91e7e38a373aad6ec7dc9b08cd31b0bca184963eccfdc0f5f321c9a6760b933a73cc00cd59c16ef1b35506899fe830f02f00a2894948c36f934d6a7ce046558d0fc992182c9ef8322cf96d38da0e2cb9561306a7b8c48ac0f55a54d48aca0ef32a8dfbde94b278398bc645e2379dd76ac6981b2a4dcbb994c313d167d6468a27a8aec462031529d543d7be62aac314d036c2dc252b905344a8e278ee4ee181f3097f7edc64d289b148e67b3e3593ba59eb2adb7ed728d464a9cd06de9a410c2d2fc9bf31dd4897ebc9ead42ae4a8d201cbb50d207a7429acfa30347616bca4f497715a2523bbe2f1cc1ec0631885ee1352fd4e5885a511f85674a423598de4df2edc6b9e956f1ed77426b83825d444e461ec128b58d25176648b07f82e6269aade0b346da6781fde324a19c029e543fdc5382f8557046ec60be8e9fce64b36d20f9180f1ffb07bd2878f522628e6fe996ebd7cae35a713813d0b2a6e49b4b0d2fada5f9a6645342ac876b2aca5ea064fd13d9652b007a365370ff13f0bbbe7dd010fd7b294d091ef0de48e30193faf6d0c55e54d3b9adc1310ca826e64261755e4d5034e56a1f0d1aa13fe38c5af61105430fb29a09188e6bd23ab2b66819a5c20155f7d1fa011de8d6240e76808a8888ceac6e5bd67035e9711a26a117d67c5c14762f3f94c1e0ded36adadf680b3a5b28325331c9ffde477699d0f03dfb813176b8c4e7627959d1d877e474a738993f46137ba1a297b2534e75e4f908256ceb87792aff2a1f11ffe99ec0eff0e2aa0e4262715de4b79833d3eaf5226abc5846bd6cf061bfd9583b216cf248abaf1fd6070913a3f707ebb26ab86cb0b130871b2f616e8f5141378eaee594765b8cf649f80af3fab7be17aeeb753aa64ef8ec49cd32fc20dd5d1dd96c27d3cdbb581712da6fce8f987986f0deb441f3ee751339d439cfefff96560b11842f861d5354ef28079106adf7eb8088560e4a6b22074a849a588d5c75042203972e32b2da77bac9585fb23d7db17d42a57bc60b7d08054d953e64554de39a04b9c24d7945ef22d7cad9ddb5856b03aa400feed5aabf09d1bd60d06f089516383c311f7f78ac4c6acdb68c419e039a6150bec2e09046c2e4995f5bce65dd36209c3f4e2cc8054292f9f009e5f2288da554c560d8d024430d22d8b762a16d92cc457243442adf25d219a0fc89b78a293fdefeccc77ebd918629a947aceb601de8258fd35ac83b5fe228a0f328dad21b3e75efaade1081ec3b5a89e615f2489d72261356f43faeb0c0e02484623fae1d293cf55210752c0ddc40265ec0bf90613c142577b0c4e5faac573d715287bd2c21454401ceecb45722f1c144530374ea460de1e6fe0c3c3f2b3c9af1ecae2f2cbc3f5ecc10060a080a26bbeb23e1aed0ddea806df98cfb8fca05e9257e1139cbe7210e427d6af98b5ff0494bd4edffa01ce8d848efc1e34498b8a9e38e8c0d05e87fdecd368ef87d9845d2b0b34706cbd67c2331d22548aa410e88f2a7596d4e2df9d59d165b2bf4fa973386d8a6a7d15144cccc38a436554e0399a74a854e375d2faae9c987d99cb436e7da3ba0bba64821e390098571d8c2fa65af64681e570432bcee2003ca1c0b2d0115e87648948fd30b6ec6edc1c05bceb6d4154fca13da8b4df9208be4c1f33933efb2556f88715ff7facd00044defd8cb25a65c1abbeeb4656146fab35f054ce56ec50f1ba0c512c52aa02e5688c5069e12fd97d802895d459cdfa4c06c71552f75c1fef78f1b2e5911ec819a004ce2ad3c5548b49d52e09e9dba0907351bc4ba62911eff30bd56a95358cd3fa08f3e9201e85069855657eaf5834d5d52544248e08d387d6f75c58d4c02e2c021044fdacbe06eb5750c4fa1d18631af2d6ed49d79098774d4f6ce2a6e44d3d27709e05331b8de89c57a76cc1c0336b35a70cc4ccf58047d204dc7a456bfba0041eaa8e35992ece03f2982f97fd0c5d640d1c550c4f8b8ca071dab771364b32407a967741b9ad744972005361f29fad3d36a36e7b7f476bb8b6a6db48e02beba9fd4b2415b71216ce091ec825515da0251456ca44f4a2cfbc00edd6507a2f44890ddfa91d96c234117f87014388b171ada3bbec39e8109a96cb0a1bbd6c9e2bb6223b64762e0be0961b7e1805e82993ff9dd181f5d13e5ecf52d67a763cea9859603f27b97bc54ce62abdd9d1e18a107147be07c8b53ef2488c208ba23abd504c51ee8796b24ccda856bcdc24cd2a82524bf032d74b502d14588dd3b4ff3b7e1bba334393ed6984406714eb0a67192dbee2ba5783f6b2c20ccc7f4d0f6651059c548f99e65287da537d0a7ef056d5be81031ccc2229290053dd106232a517d40013143ed9c40a191dd8dcacdbcd7a85c0ff0342ec32f8e2f65a8ad45ae53bbe4500cb9ff783cee8bef7060d1c202354082fc8ef0e8fda0b09f29144210ab08386d30d85872c603442a19fcea13d58b25af1abc43e1440c2c1671eaee9c9b8fdfcfe78e896a0d3a08917826db2d815eaf9751caee6230466f25fe00ec3f7aa2ea033698f68b830e702c170068b51c3b80270ed68831eafe352a5bc4d5f0608808bf2300d4517f620976234e846852c629bf5c1f0e836280f836d336e0e674de2d8e953ca58ec744fa4ce0f6166a6519d8881c37d3ad4babda1f1f06dc81746a0ba281d85ff7815c1d35d417fc7a2997f8120d1df0ef67dd5ad22ad6668aec5ad5a2d240254a74faf79d9f90ddec61d0f426bb1828868af387edf13a3e87e0409092e6564f80370591b80a078a2479aa6024a7223417141dfe94ac6b0ba87632773762db9676db70b390f0a2df2f63501c39195c3ac463f1aaeb0e3c05111217505fe3d4077b33904d06fdf348aabef16d160fe25bec9db8b6501ae4cd50fc9d038904b932fba76e68eac89a9e675226da5bf35e16426a86ba2398cdb5df39730c6697d5b0062cc12f256bd78e83b295be22181ec09280621f256113204f8e34c49acb713f850b5649eeb55d9580aca660db1ce28743ca196f7b26afc5b7b6b6a67ed140e4713c37b3197010166d05a53d27f5ad16b86491753d3e2f391a48359c400a1fb9a7403735323392e539aaca2e5cebb545a5a32017433245e5de1248a1d6955e09edd3114a9a459482f356280aa2bb98fae329aa57f85ab969fc55c11798291d3cf59b994dc555557b5795c9b32ca1b9442d99c19210aeec001daa39d94893d6a1e29a831f34a613c8da73600255999931d4c7390e64ad457f9b602e980400572e39cd1b88e5c9f052fd930db7b13e5016718384b370cf7edd755ea75a73c736436a19d03215fca359f663c7af0f16818115b9033cecb7072ea4560f21de6d44a0ec1abd6d9f3af81404a78d6bb666b5912105d921fc65febcc9f272db2d30002b616d477eb18e714866b6e41890aee1f3b4061dfe4b3d23905a67a98a882833acf6261ae426d0b4344795e1748248bc3e89ad48af708e13caba08cdee3d3b94dbdface923b309005973861868e7c9295c34521e0906ad854e2a1419a4e5b10278da3345fe65ee728c81a61dd348e2e3604680285d2402085b52009a98e1d4e61f75e17eef53aaf407bff9bed5b07b891a7030d7eec01a3c3289d749a6adec6f78b930b702fbd3a8bb0c081cb2e11cefa88c0c0c3e7bf036aaa59cfe626990dfd3e85ecff37a0786e25060b91933a266451ca90d03c73b174c7f00641e2999a7034344cee08fa7d44043dc7db3676a00a5dd586c4e6fddaaef302db3694e511aaf3302ab443525587ead793bf474c7d3b6e4a3192351e83275319fa6cd042f962cf82aadfded240c0aa2dd9da2a41d60c8ae75441575a7d1e638a797aa512c20ec2acd380c3e77d321660ef8eacfa32a4514a28fb601e8f87f357eb7d82cd167c45c4969a3af2a0b6055d046d866c5d9ad8920eb90e64d7a2d4734713c0915f12444d9782e768aadebabe43373fc139fbd605c4dcc64ed934c2e1130b2ee25bba24fcdb1d1f5559a55543bec4c60fa68ca079ddc53e9dd7e4f447052dcefc61ac20f8c0da7de6dffd62328740522d9e5e7e8cfb119f86009c0a0c72dec3a757ca64c64495d9d16a1550a3d74bfac7aab8221bfb6163d45b0a53009fba81f259d09fcff4a9ee3f30b4303afd87a23789bf1a63ecaae08578d09190ba5f68de5efe8c920a922c40373c139ad601506b2f4bc60e2129b78826b17ac5d954de1ac14f899a603bcfa2ca18742b3d84a66e23da145b4a3c42ff5c773a62226c8d6a8caeb50a208908222b2f601ef3c37599a48fd505bab6b90436c5cb2189641dc542603de80c1bee938e68a0c28b48e6857c5daa05ce25c4c84b589b3137b280c1df8adb5f4417a497947f05217dc888f684f6873793d12caf19dbed38cc967e408b900d239694a982ec62b7abccaefeed39feeab13aff90550e70e6e5b97c2f664e8b09d49df95b3729ac67ae5086f03261c99ce9893e7b7c1972822bb50a06395a4319405ec18a632b53ba958dc67ede821bb0ab7d7b36afc78a9722eb3cf92ce6619701f55333e845b22969d4a896b8fc739ff61ab78b66242f3041400e8045eabfbc66ef5c4082b2c0990b31073c1332480aad092714d30d082c5ca6a74b9128c413c873726cd010ca3ad4dccd442fb8551afc2fae2ddb82a5622677245814dd6c37342af69c895da809f94c4db3ebe4232ee2198ff218b17b8fb9cfb36747aafddcc32a02d91ce5baac5fec92107d7f2a891baa738867a0987a92f8c2407c8f54d74a05e5310a2da05643be465f374e90f8324638d86e7aad04f8e78e58532eb0b1baa849183849482f33c2660a9de2f5e50b245b417ba2ea706a8ce83c55543fecfaa8816301d98f187670088c9d9566cacc2941a490b470867085ee2161786d1177d07f673e2c0a8651d868a4ba2b976e0f2f8dd06f2281c2291b6a92844ac498f929687965d36d896adb294ce9c643d0435c05979d56d159ada4a441f6101b69b8bdbc114102f63bac7ab7ae99d62f3237d4fc4fefa46e8e44b0f64c847cde1ccd209f135b8c391c4a441bd2c2813888f62b903e46e6d6ea1f835818cbef94196323d420f5a89ba871b54982115415735db870d14297cf51d844e6c059e8fe85d6edeb533217611da6b19487b3aa91d41a006447654a4eac0a0f286982eaa3f11d1ef4c4309ab532bdd7202a4fe76543a2c481d450055fceb279621e445a4324b4a30cb73bdc817d6e160dcd84ce914226b992d106e291267e4824eee77c0a9d465bcc8caddcacc50b1b2642c8448e5a8a0f826ee8300e2e0890ba7c84500c22a0380a81c759852983bc24683ab87be4814ef38e2ed55a3e00400c3b505dd96238d178af20e18b40a622bf6974d7a3a95c01157dff989f8d2e2c9e75312064cbb8963ef7f34ecc400730d482c3e4a9aea1ba95ac8dfd0a264c43694b03542e04e9034f85736c5a14a6741115453c244c33d87d9829f102fd9f2db3546e166b3fdb1ac0d4e7f49e0e7cdc3e97e9b0a9d2b968ebc04edb20bfba1da7b56e33d8a51345864119e91be84653069dd51201cf312abf895271e2a37311dfb3a9d16df93f669992c6dc4b208a62254e84a5b65377632bf89ff7083db0ff0c332e9064eaa61b39512645774d0e229333b48aa845b4f4eb8f93b8e69b360db8639100db2b50ea1d4b0c76b8b33c4b620cb528162665dbb716581c7759d6c9d2cd8d631b594a474a9e21bc65c048c9f6716cd4b9aaae4472329f49a7b9bf8c5b7dabb606cf6e47930f0df472f604a2a62e03118d07ddc31746b9aed06d79387de62e286343f00bb5fd56bb02373d25c62eb8b9cd082689b50bcd40aae1b9782406b789695b073c271d4ee38b94de5c7d178b8ffeff91d46eea483089603f37804bf83962e656543c2324689a71d63423f88fc2dca29e319045b90c6050f19b74da2b9845723bbf2924208d8b65874a13aab6805db757a398497e9a31ce5f011d3076e49c6a271ae7dd147418b061602753ca51e6a2f7f4e366c2ff4b992719d174bf3c21dc1b286800a6724b51b1097d1912d3ca829da55ea9850e2fc19aab11bd571fb743fed9285790b98402741110da9e3899321f0647c243d5cc2c7605286a4475108446b0d46c2aa985409b083117aaec0fad22d080401735358cd4554decc2d09f7640b8ca7a719db6b129f72d298b6381d24f5ec83e4e9e861300fb2d6c00f34fd4d78b619383106c3aa5093274bebdfc230b8255bf44c49c6952e1414594f66af4361cf24e1734a3e36553297e296496af7d8db57c5af27243b959d51f20c7eb4654a0ea2593852adb900b5c90c17d03aa8bd8e6b9954ed47653882157d694853eea42c8cf59535e1a81f7c0567c45441d5a9b4fdd7bcc2ffee32106a88bf1921d66970313ee34652c7b2db0c41fdeae14d3c0b93832d497bb572bc004cbccbbbe704d10f2c7018fbc2aa4b7ff151e6eebd78d87c010c88c11c2e799e9273ecebcd3b2b4d7eb3be350bc15a8ee8d648cc49115a99c775ad63349caca8e261316b716a94b99dcc9b00a72dcb9cd8448e470cf5d90e9c5a6883390eaa4bdd84baa353b949145c98e6ec8b979ae700ebb7c70b0a2f9a86cd3d94bc6188fe4719afcd7394afae850b8b8a57c1ed6ae883a520084b317667408b69296bf68a92c51e0b00910f11c1a066361ab7cc40d01d83cdcfbad8efa6400c7b2b7df9cb84b6049808a74d860d18fa8f347274977067aac57790114c6ab32bc74e8039b06ef158cc5ab529e8b57b9147575f9885846d0b365ebd0e54b3d60171f0bfe7ffc2445f5c610b8d00cbce00e62b43e14dc55d2a32d63f795746c0d9c84a09d19b0720b6522e490447cb42b4619c3fc12d125e0484836180364b16ef6dea3403c74d9f92d93028102134dbfecc0f17c46a4d6317c5cfa69ff395aa84bef9d4ca8e4a81fe5b9e387e8663083d098f69e666294620842b804e0b10d7e5f0fdb2c30e7b19c5d7ce9b0bd54f5f5c4ef25fd8e83d22dd6201cf5008a0957ef1610e8868eff4b34382ffd76a5ad167718a0970451fba13a108728a21e040e8ddb9159e2a4d66990f6de00e9f4a49da729bc994f32fd21ad4379c602b13edc5ece29cd88c161fb53e7b5bf221fbfd1544b408cdfb9b69738c0f444c38af947f04eef7224ae440e85ce81132ed20fd6a08b7e7c7a22d5d731145bc1af3cba061f15d7ae04e76aa435bbf6d5a20cd051450cb00d054926f86e832992c800f82a449879454bf11d111e40907e146d6827956a0d0b635c054e844b43b8b8155af0a47b7c1b92f9c177f588afa6a15e7f2c318bea4268bbc11af70604ec9be9f6165d827ad68d513cfdeb919beebfa6f2b92d8692d4abd2c7e1c109e6c2513504cbbb6cadb2dd4f45504b77f8fa26581d6a7f5d18250f8289d705dc1d8bc2d46c8c8b56a3b6ec5ba60bfe37b8cfdab5e744706f4fadc4814ebcca050dce2a784d8fcc6c994d4854f977394212aaa46f915d9825b331f921ec956e6e5a679d0b0e4a4a8e3b80ba385d93016fcb835f415f4ae21fa8685c8df21ccd8c4ad0d20dc4cebad442240f415d6839c597d10f8117d059e0533017288bd86258f90a03710924b1558970333af678dce4bf782cddc68e6c849612a8cf84d7ee199579676266a383fa729b69c1bb3fcc99e42506f55293193accfea1ca602199655b13b20cea5849144a48da0d2bb7bee180f0043134c7496603a65a4863ee49c0d77b724096229b309eb6101274202e2accda05f0c0c3b034b533330c6ce3b3149bec663e2ff0ae78e2264739ed3f79bd4c06cfc0f54cd25f655cc5b857b92be8cc846f037fc398a656843de93789529a672d354ef5053ca722c71a628119cdbc89539adbc011256f4ef4013751bf94622331b18755b188e32079e0059158dbf2fca29fa918ef5096a93e27ea1f9e7b9586fb0db0e4ce103fa71927c5a30523a4a1b557ba611d5181049f87b5d3578efeb15ed62555c45c95e739dc48d5d89b1a19346eee9649720ce20be71ddf7cecec471e3790bac553678cbb848f0a2321d57063ac65bad11fd0fea13d44d12222989482291bd690760084e07b0073203ca3f72503621eac4f840c0f5af379d7e867b4ecfa8437fe6d613874d1a6b4a8fcc7d55fa56383125ac63d7755dd5d0dbaf32f63663d6630880bbbaf247949a2e65159675adb56fb19bdc7f89497bcdbe0848763d92f65fe7eeb57addae6bd332eb177fd8d192f0b2d30b76e207f8e362e211f4b1711fe311d1043bc62b95abdcd33c8d5ee2499df89c0d2c184a1d4b7b9e3427b566fea491a86661463b9256423ac16234e0e803a683e455310fd8ea0f9fa828ca96ef590587e2cfeaa3ac2af0a5a2c71b04499ae9ef859d197961cbaf681bb1b634e92f866dfa6d03024aa53e6f67db7fbfb36ddb7e1b4a42b76cda4c992933fdd7ed4c675baddb5002bcaa3c0b226902acb7d62f86bdb5d6643299be6867d96fdbdffc75fb9a724f19f8b587d956b4b79c846e0dfb2cdffc25d998cdd56399fe35bf7e90846e5d61e79c55aa6acecf3dbab027dc39d20eb955b9cf97347b8e30aebbb95ba77c2eb54a1527f6c42e480487e4c79f28a0860c410d77ce96b342183d9797c72eacdcf4da2aab8fd10cb3f7fbea150e81e14f5da137037d78402f7e0761849ed72a6bf4aa2a75304429c03ef62d60df02b744ca92eb97d4c72e0da50e108c5eaa8a1504160a61bb7d485eeae89fba62c04203e0eda6674c8c7388e34044fa56ab351d0825c4e8b3aa755befd65b5e1c41ce96357abfb3054bfd59f875cb4737d473c884518694f51656cbb2f4071f47f4e1d5e73edcc1e8b6657dc51b96bb68647d9dd6b2acafea4c22ddc15495e538ea43fdc1b774a53f77aaa30a28a594d2ea734faf023a84d0e974a702858218ba6c8f12dfa330c07a9475fa8c925616ad547644e05aa5cec49565d518e3ccb9d785510cc32686490cc3302c6298631886c11a42955583449905b99910d72a8d6adad4344d46d7340de20bc3988d0eaf0b5bb7d6420cb3f6664259a669dbb64d6bc7971046cf9ac3abf9b6c19979c41056964bd5d0b48728c8cf77fc32b05d6f189b4c27df3dddcc8c27b42324ee1cc8d309e108899b833cf06b788c31c618b5bbfc19a7749f4b61be54b992f4c481982fb0d003949a77ce2b39135ed9baeb6c6c6c6c6ca2436d03521fbb00906a3acddc1e39a7ac8935355e032fed83e1749a99e1381a9a1a35f0c6aa689de130e73457484d07d40175b1734a4353a3464d4dd779363637372854aa67e762685574deb821a35f35375046ef6cf00dbe12dab0216dd88836bcda6442379910148ee3407983729c6843dec09104ae40638ef9835be24ef5ecd41c570e1682bd317f292171dbab23f3349d6d07e6c163c29b96f15c1e8b5d3c3cd5e27158a37d45fb5e871107077338703e5b08b5ce9183f32204f403c210421041870ecfe33a211d6ec70e1e3bdbcece8eb6b3b3b3b363632313ba2184c3a3f615ddb89109898f234772dfc91ca1fc5c177de7e0703964f41c392aed33a7391c73721cd29cf5a633a11c5cce0de17a16e48a0075441dae83e66428cc9d5474284f803d4f4767c70e1e3b3f42266421beaa954a553435654c792a958226ed2bd2e1e9e87411da910989bb0708f2b83c78ec509e29a3f3c0aa7d4b3c2f13e256277ed43a3b78ecf08c20a343c8b343661d3dc6e831422b7ff59bd0dda7363f222866f3d8b163270bc22313a23c3221d72828f8bb0e631129401581e107459e11a4ec4164fbc748d4790a0001c884049009c11eefa9da5734c2087284e8b0070a85d4beb1a3fe260081262c8c6e44c6996c77aa69a414d248e98c926a0de91473ce49941373a0110906d260a7f657043f3772a31d03f6f73d938804c03be0f8dfc78813638c313a86151cb2ed1923b7a5ac01f5e855abf5b562dc75305715dd441ec444d8092184dc7dea5cdcaa28a5d4a97b2c62d239e5c3af43f2ab6ac99773da9b1e2f289d93cea9ef3c83fec420c5bf0ef94f2d44df7277cb5d4f49abdc3306ab307f5214a8be728931a4958ba4f690fc1bebc72b095b0f777c5a7754e2db7591d4aef4d07c9737d88ffe0d135809dd951ea25aeaa1f83ec3d2972caa940942861bb24c1720e1e1080e2e3e40022f5d0081cb126362161d30e388279acc3082262418244a62e0a5035998a84103369c71045a31a241135f9e30592209337e904598264884e942c90c2906121b4c0cd185164590994195320a10850c252652c2fcd0c5bc922305195e6c20081f34d1032ae6480f61c0600b285ad0031371cb912d3e948004484835f8820c19908104298d1ea028230c2c494954073598628a256a80d2039931908821a3054300010aa32f35d030530922c8a032c4132c64446024c34042811684e940131fc22c9d012684230f0021cb18198ac082e6e0c8ac02c9092ef0618b3159a0e10130a81847ca78312687107421811552fcc0831eca50d9e28b333e3066098914400105151a7ca1e18b1c03893efa000f9618d3449829611cb1028e61860e70b86203165ba8902408c3064e0091a481249070010e8a8408c1126472c032441857c0e8c10f860801164258018510f308119668a207625809410c6e9853e091a9a50b078a30438a1f68918418f40bdc12850cb4b84203661c81c313934a1a5794a0063878f24412497c8104822993c609c68ce0cb1667502fb48031c313204ce0050751ba4092c2165d6cd081862852ac50a5235420819409242d30b1850a25c48069a265a6801a01c41622e822461844d01b1c992f80687c6982e54910aabc400772043f88c00654b4c00a0e5ba2e002890c63c268228827be58c2872d907c51c20834c290c18a3368a05e60900ca2f040822bccc0e1055a403252762042074fdca0c50cb309241698e2041fd042891b82b0c2060f38e38805629630a3075e680d669214e3e3012caa4841175e84d1046a11812aaca46183204ee00507ba1c296201106980b105193a5cc981d200491454ac30da010f1ae08013740631d00004305ca0000733a2805e661648341bcc20450b30a688810697b802314a3ce921cc0d42d02d47240f31474c3027619eecf81188f8e323c6075a01e365c7773137a72c29fa7895e84379b0e3fb951c36ddc1beb82cd378043525c09f2bf952f46ef08071fc3ff635f237778d370229c6ecbbebe6ed7e6642366f6176f3a7fca5f6e96f7296bf157676cadd679928b5b38f9910f69f27d5f8a4d3d1c912f87327950cb8c6bf67416abec607c90aa3973d8ef74eff383e6234faab1be37e467f7e0c247f6ee898e1682875362db5335dbddf6c31a569ab54e9d93769ff883ab08a8d118b91d43f5ec7bf7127db7abfb9827dc79bea3f586503f9d20fff127d28fd1ca3edc41dc7cc97c2c09f4cf912944792ab9faa554b4a86061a68f0bfe63412e44646bea05de92fc85a7de7db9e31188707f8835a64f6e3ba6ac5b8ebfe33b8af8d999023f1439628367d0c6a195221f14396a44d6b75749d4201eae931e14dcb2e10166310474675fb58f153138cdb6b6fb529b0efeddefb4375fb6aefb5d785b3bd32cc6a1b5c98fe946127d3fd7ab7ec3bc3aa1635acfd479fa86947f7de7befbc990d2e2c135a68616484e52f67635fa3cf497f7557bc4df0f49346e3199a65cf68d9333371e6bf222af42b38a33fece929fb36e5df387f38f6fd4dcb593ee2a9093108adb5461b5fa6ea4e297dabb2acaa48ce105007faa81fdfc6c6042f6c19718e990026ed6cdbf3e3c76967d3b2aba4b28ab01859b08108b344f73697aac9356832cc33d955057d4929a592beeb9ee8590f923a99f0965d8b51ea4facfcf564dde34fa24f7d8933b5397fecd9137f8252330aa5d78362a27814291d8a01dad388cbf9fe010155203cf9032552f4a9a46c229bc826724acf8532f341d18b3ef2639229e22cd0d81f8dae2a897434f6855536d4017fd5dbc7feabd087c7587f75d39aceb47fb00aa55a89dcf46da5844aecf38954cece0edeb4eca6a20d49db6e94e6bb1b98053f2adf649bef724d9e791aeeb5c76ff115b072fac32793ddeae55996657fbb1aefbad310d6e81aba66dbe38f3f61968d31bc7dbf313621faf8e3a4fdf2a7fef7fb7b47bad8b24a4846f5dd49f4e2e32ff873244792187c17945c3fd951cc4cbc5d2cccb9aeeba29452eb9a3e57a67f5dd7755d9665ed58182db263557fe5b96bbe95b66103feeac4138a65f1a665106e1d1d1cdda6bf0eebecf8f6b2177677f6ad738b9d1ccfc39b96edd8186d88db9b18d9d37f75c67f382fc1f4f4b993def8b7b75b166d599f3fddb608ecb2bfa2287b28fb216b6b96bdbdaeebd22eec56edf433f1badfeb2f7bfb417263d7ea0f76b96e3fbcdf4bf06d6b6233b7aca75996595d62972e996bf9da7a5d6da30b2875826203287655a16f3f888691b5828454a7acb08e38dbb9ed9d9bde5d7f443b1bff7d7b73c5827d63ec462f76545bfbd6d3fc153931e9aa318d556ce6b4693965d921eb33df9b56e464574af5e6dc78fde7f4f70259a0ce71883afe34436aed3b86d94c04bb14814a50c9a1d276a0ee081503fcb90f108d1d7d9cd817e4cf49fe489de851fa0d903f3fe857ab8ad3afc3315be2aad6f710faf5c3080c922a92dadf0ad8dbafd25fead2f067ef5bce74fe746cacba2e4d94b3aba34d8ba436d54377a691fd4d5dde4e4eb5d65afb35887dec83e2951fab3999f6d95c4e4311100c981e860c98be060762d24b1c88e9fd6bc41bccde94ddca4bdb2d7fddf79f8e1dbf7e50bc377b98ddec7abfd7fb755defba48ce1eb2bad3385a89dc4355d71b3d9ca26558014365432b631ced6e432b6178b095c43d4497ecfa18e68e25895b49c5f2f5156696c6dfc470ccc61ec3bece8de9fa7e6928a7d4fa44a20fce1ce74ddbb7b6be045e637c35a6ab43d7f9f0671ff5634d4718c40509680fa5cecf20cb940122e5f31fe265caec21a222ae89fca1c0102475744aeac82aedf7dc00266d7a85942c530648a6c542f7a3eba856bde97b0f8aa345c5b3735b6b71b6cdc9d976d3b2ebcd222cfa0e8a78d82da59f43297efa3350fe70dc9f3ecb50d9cf3c0472d24b5099462960db6666def4309cf457f73dfdf60d98d1a687d9111666fea497c02a75502b68da3b10fca8161c087e07f2612d053564c8fed5307a1d04a2d5e8ddaff9734ef4b0d4a9aaf937ce237eecf40001459d1f55918df10808298c5fa94fe833dfbfca775da55f5c8ae042c49e1f87442e457079b267915b5d8e31613552814dbfd60af557814df557813d047fd2eb3fa81dd312de2118e052041727732b997beaa8efe5520a5ba38f125a2bfdfdf6b1d0a36f037d6af4a27dfa1df4713d7d6bb3fc18f6f13be8436eecafdc411e0c67571fa1577dfc0cea602c75aabf740779aaf9357fdcd657578da315ee64dbcddbf53fe2d88ef9176dd75f7d0a03ecfb8ab8225225e697ce96f988efcf8fe60f196387434d9dcda638e83bfc0972273b48fed4a50fe370ff00d4891f97e24ffd751b092edd80392a9f1f595d58e8357f3dbbdebb2fb72fcebe39fbeeecfbd04b80dee36a9b4d99c6efd94353c61868918d3108ea55911d2058d29e32fbaa7ddc5cfb8b3dcdfe16524a7736f6f52bac6aec87b2afb6b705c06f59c11e33219f655b5dcf8454ffed6c0f8abe594b29a5d4dddd35f6d907492dfba699fe7636fdc135fee0bfd4c24cc80ef601d285ca9a73caf8517a9c310a71c2aededddd7166c09f57e9cf4a0404747a82458716649f69ee37cbde5ffe9c2a9abfd4dea6eb6ffbfb35b9060dd6327ab5ab65d909706b7a9e4cb46e5a6541e4cf24d5964f935465ca94a95ba45160d93ef6f7d29b7d633e5950fd97fa56d8b362d8c2ae6a55f267554d19b140daf32bfbf153a832feb9422985a8953f98a4e5e200891fb69450e290b976717dd79f7cfa36cbd7d72cf74df6dadb2b13d22eedf2781dd92ef616dbaedd58f6f5c8d5b2b77f3d561fbb6c9642d1ce78e2ae1f5f72ee9c007ec88203cd2ba41894b6f555cf18eceed42184103e9c4257fe9ec89db8932ddd0996f9d39a724a6e4ba93f4b3ef6d8755ddcf5f2edcc84a4f4cafa2a3e5137777443767029824b94524cd70594caf17672e4ad79a6653ae5ae6fe5c5393b2998049403276e3bef964d6ffaed31beb2148ab6696b307ad7d34a7bc8331fee9f3fafbd30fa571577974f63956d0352749154b1d839abdcaeb1733bcb72db78b1b86fb2bfd7da6bb32cfbbe70df6cafefb7d033a1cb923f6fb8bb7c1a7386e05029e38b0a0afd59299d4bd38bd8bcdc9f385d010da3870202fee6290575fc973adc45cb6e129654df924f89e694ef50cca5c3132cf214e914f1e33b3440922d9fce4dbf4ef74ca88a2f33d1dd3152ea35fac49f918a20ec0ef4240584b7c3e3e04c20993157aa16dc450a47f33635ffe10db91f1f38ffbd0f8eff727c6efce7f9d8f0f15f6a93f01fd01f798f12508ff2d13dd41f4dbe79541ec0771967d764283e5fc3fee4018c1166cb975c0daacb10cbb6e1aedb6578c5e608cc4a972115b562dc75ff51ee141809fcd5db6558a52607e049c841de4716f2353200fe270b3d4e4efd08f9c6f7641c2f808cfa2e432936978f709fa4ee1e6f6fe4111e47ee795416001553173813a2b12e244319244779030000a1548690077a3d2cea863702576f97e10b6480058d11f8abf8d264eebb0ca3e09ee66d6cb8e7381bee761926e54cc1dfecb20178e872016cba7499009c179adbe51fdb5e81bfd9e5126ac5b8ebbedf9e974a755efc6420df651fbb264339c0d3fc7c8d03bc09f9e7ed4f36e10f90a3bc0700d2d5f0b0cb24d828e3f4f183628c31c6184f32292949fb1a244934c4f8f8a2143d2f38d9bb401e2d5227cb95ec4e64a70279b4d871e6e3cc7f914b0277f9a72607d4edb20f764597078071d1e59eec5f5023f3fc4fde8f93771e95773c8eacf35d16c0b6c947509fa46e1e6f3d5e2e43086b32843b43b8c3c3eab143271f8190c7480c465be7adbc34b9a6e66dd4bc083535b3cb01202133f1307100f149f857c2dfec3200382df876394526ea24e16feadbe51e9c14396e974718d3651e202575e37cd0c3e8e1b88142039b508f7a9ae7dea9a03ebebd910971a8f7501c0ad3649bdce51d9312feaa08b7cb3c1e6254f6c9f931972eefb071464dd6f135b2f73f39e8bbacb3ad4d969b8b3128bba703d3641b32b5cbdeded2c58bd29718268e893a34206335c1dfdc71bbac236b419745e87208d6043cb7cb395b086a72085f23e7fc4f2ec0e3e41c7f23e74765111e47d60f9409f05dceb1b90cc5000678287f88483fc238e9e8e82893f025641f06c84c7ebe8607f2a3a5c02772f44bd857a91c513942bdcd8b40f3dc5b2f13b2d129146d08211a9506f60821e7e402641873e89c6d641f99840ca30e01725cea94701712f28ff7914b781bf9df06d5657d9552b7cbb9ea80bf0a80dbe5d7b2a58b8f4c4206ca2ec665b07bc40f923f36cca872254bd4898f83237b97e879c9aed4651c1b33a2cb37503de8b95db6b19fcb507c7c7e7072cf002e0e6a7b54ced91598f3b95d46d964a75293bd4af42a19e06f76f96673198acfd7644fca5e253b8d8fa692e2fec6e6f43701f93354e213aff245208e4c2327b3e35f2f351379141fcb1f66d4a926f2285be2e003d296a7a29ea8821166694ce1a5ac17766528d80f134e889ec49e524a31aa6d76c01fc678d04257b042ca0b51ca082c44ba1c5ea864a4e3f0822c2ebc07c2d09903936de32f5982e1143938b1bfbba39414fa70337607b168f8ef5f1915c4fef5715f9f659402f0df4761ba05540bdbbfb5305b80c6850cae040474420a2c044d89492bafcca4262fa015b000da3ffe05f9037f85e853450cfa1416b629d1c7faf8275c81572ad00f79cd8b5ed575bd705d4a1ba752de77152e2d0002712a4878bbf4bd9db0c5f8180f49f71ee194c14058941fa720825dd522123dba2fe56cc72943e528c658f557d5917429ef9d4424104fa6e094c147181416bacf0b6b8555b6a29765458b69d9a11069d179a5624aa6a495722c4e2eb6edb2b0edb3b7d9b6592793c5f055ad4bd334ad5a18ce9f3fc9b4ecca6a666536bb19ceb62ccbb2ccd2d6c3fa4b6dfe24ea443762c7d732a49457bbced2d5aa1615d2487fbe67fec6dbf64b6dfb0169f64d883f2e7cd5277bfb37b20d1c8ee66d7297617d5b6766ac9a1a341cde5c309994f0df87d643ed743a65990e7aabeb8e968e8e96e2d1921b19c9997884d5ac565c6b05dab5d628d68575524a5f51ae2cde188f8ee2516675448a4947b5bad157603086611886bab1e930a3a5a4384d3e20a57af294d5ac2e549fbfddc88d6a8862845305555512f6769c28874a49a717c9d94352d7eb2e830d4af287685403e6a287f990b2f43fbc292a7fc6915ffefcd31e3b7a07218ebf6f3f3b8e6cca1e7573e2a287bab9c16167ef4a5fc6ec48b323102612c986a92a33cd859d6938af945856e997bc6a8555b6cd43f2e7e7568c16b6ac9a1f7af531a62f3d87c86da94091c4c0202c9fbe3771a320729bc0ba419c49b5a6c41f0752ab13d1a3bec5b7446f8a11d047dc4044ef6807ccd5ffb0172f4b4a5e941cc90b4e5735aa732324952b55934ac2a95143662643af8c3f85d4a0017620f3514ea267e56ac99c713a207a2c78730758e6d0e03ed4d0e2f5442fce1d60a951190b90e7caf6db4490092bd4f0823fa8e4829c3ef4ff5fce6a42f4cac0df4bcf8464cc9965e01863ec2612d6d34bb8fe8b615bab3fab8a12bc8f5c9f046fe83dbef70b277afed8855595aed14b5082f711ff24d84bf0aff9bd878c1173c1f2adafe40c5275c35bd66412d630849694f2f3f0756537d72a3a05014e10f0e747f15f70ab7a3742637f750355f94a4a5dba402db54a596b4de29bbe53aa5128e8214b13d144d1f34ff544cfdf03d890f9c5b0e5c3f0dd0f03177861cbff70f67cf9f2cadff5f5ad4f6eebb3b6f51f8e6519b176d543d6e70f495165af28f0bd37a386dcecefc38dfd25effd7bfd7529662de6ee1935c4fffa4b0f5dae3fd410b92f6d7da67fd56b7d51b9ed3f5fc2e8535541719b3b16e176d17477f23bc659ab1860df9dd481690499b3aa26c8137fa681e15bb9304cd74b88dcf5bfd63a2bc9559dc6950a70bc4c948e3ccf842b4c9ec0401bfb947b54b06f1b23d0864040de8ed6dfff07bb482995e613f80baf9eb63f99b2c72eec8d0a78e5aa441e992d5fd62c5a556cd2c2209b69ff75d8572630aa7ed1ae4bb0ab2a1c24ed6f2b2f1d117affabfaea11df56ad2c9d84eeaad2a82173573f77a551d517ed4a9aa8c636f08728eac80f6242068e91df754bd004a5c90ae2334e8d023ff6d2eaa21731fb1447c88d5e9cd782f46de5740aa13f67177db069adfe7ca3866c77ecad22387b08c782546afa714e3b5fc87ca1ca55747ab155f96bfcd7c33b495984bac936b9abc10eb05d7f5516d837edb1e7d7d05f0f0e68467fdda95613ceaec5a84bd9337f3ec6b5fde7799ef6f171601830b6d01e422bb6a6e1145ad52c4dd31e4aed09007f807e401ffe9aa601c91f1f03ea646000fde748408e84bbee3d0f2905b4c3401e1b4db0fc48136d0c7270c54a1949fb53fa7120622cd5d002fff5d6d78f5fef95b1871b7ec4aca1f9f3ba3c436168be1cf26c5af353520790528efef75fb73b1b9a69b4faad0aecbbb24c58cbaec5ae8a54c99f52dbb6ec2d8b94dbb66d407b4b6d58fef89498923f15f0b2457eb0e2aed3df7b29280668cb16ec5db4681460ff20e9ef4a385e680cf9c79f6f59b7aa1c8582fc0f921615e3c4b6d9d08a182d56651109817b88481691f38a9842d42e54a99e05384c7221b53dd79e9f702935addf58ef4f5d000442c48958fda0777d1b46ee6e79162fc1dd5d471b46d4a9ae286d1245208417e12cf01e368cac1feac3a969fa23c2b099da1ff6433a1b811afb548a2815c4faaaf5148498fe52d0339dec9fb2b7699e55d70ad999a960952953a68b3a7115020ba10f9a65fb4b27b6bf10b7f24892fa4aac4f808c53d704500d210fa5b9fa2b53c15f3e66c4dad588b52f25c3cb7677f9f43d53c13315dc359e720bf74be812eb2d4705630f3314b09dc1c03d0462ca309c9e72798994164e6ffad44e459f4ca36af4a2ebfa033b03957ddf042e34157d3ea20b81cc3c0ca6e79e9e7ee6e90ba9fe7a9aaf8710d2ba29b5374c600ceb88ecac8361060629dbc3c0bd897bd3b3c069d36f9a85199d653bef299bae7d135054a72e30f884a01c3a60cc5941c41bebadeabcbc04140ab24c19e9310cd6706e8771155777568fd07b58d1670583af84e0b437e2eed6ebbaae58aff40266072f607630da514341b1b0952923b7f5371b71abadb9bd4e6d0c2c25be5bbf7080ba14e7e1bf1dbeac2afb002a239611e99e87c059b763d1726256915f6613e93edfca34c3cc1a328dc8c801998618dba4628819620b104cb144c548ee6049054488913421bc4288a5a32962f4306f589268c0a008b7d86cbde3b0fde368e5555565966559395525bbeaa165d5b7189df5a77f16a4c26e5996cc558e87392bc3ac5b68699f910f87cb84dc5dad2bf3b72324a4da15f2f8756596f541715a9635bfaa2a2d334f4fc86642e49e9047e6af0add29f3778570853c75b31bb66ddb766ddbb6d56db3b66aa373935bdc7ceba12589515828a79c724a09a3124cacc0ee417624ac2884b0a3049a907ad47a208f9d99901f417c4ba9a1f65279d4244621843da7860a42bfb9e1a441023838314e4a679269c54208218410429f16662d66ede4ec09fd5a95fb5b1e71a2ac2aab56abaa2a286755559555ab5511e14c5ab9af555b4eab5955ab56abf20a7ea5616559b55e17d600cfbb989d93e60f0bd19cd13c2177ed866ddbd44429eba729ee13ce39a7432ef037b53cb21ea594525ed100cf23d275d67e73cf39bdf2ceb2e6acaa5a41f841b128494cbab88b5d183666f81ca574469c1c58777777d71046f85083b156021b67430821c4d9fe9002a6d40fd8e3eda43e1d5c08db2bae77c7d66cb14ce796dbdbe9e142a8a263621633995278f372204ffd4c77367794dbca9b6977c7dfdeacbdf6f7b34c639a96f9be7342c8536145afc82b433420a89431b32102a4e2a8f44e164435656648002000000043140000200c08868442c168381c1266557714800b7e8a4280661fc99328885118a48c31c6184200000000006064a6888300b99eb317ce9b79d38f19cad04833b1c8ff42131b0f32e2999964f16c2d046d4001a38a3cc705b6129d10be10723156099b1938d7682629f39bb180e7a4e2d2c460f8679ab9eb21c7e75aa9be2a3f29444e4abc12c4357b7388ca019d6f0536016a4a6b6a2df0c952d5a04727c83bca2fd4a46791d9583fc0bef459748f5aad60cbd08f630ecd1bf3e78deb71fdb9b88a488d7e56a2c31190e808912d857b89b2e5e7d88d13b607671d0055a047d0112ab65471546478f726fce304b44115771db376c2d161300de24a17c947635f8a08372eea69f7d63874235ba36f11928c8102e2d83a0b319f9605352a11ff330506663565ea2b0683e34b8480c03cc22410f2d752dffdc6a6e75f2e6f0acaa709710f641e7ac302d9b58d64e7809009f169525f499a0da11d9b2ebb1ed9804287635a3f1c7fd481be2d9f546e5f1eeed2beb031d6df1e17c534c4397884520f796cefa41de72489ac8634ded1b5de383636fb96fdb0e943039b398741ec865e9bab63873014c78a6c603fdca883ac74969aa6a9d9aa8ecc840eb18fc64f4cf1ca82469952bc2518cb80b12c5570c69b39e85843c18d4e585596eed365c90fe498579799d9993620c0be9121b5367b38a0d0c3cb5acd341f42a2ac1ce50681c68b60529cea113c53de7244aa31abf5f90f9768e2fee773a0046135783a1854059838adfb0205d481ef69461b784496b4b469c571a4a847451729075da4a38519b77ef07792f65f062481d79fcd0e6703ef3f37c09551b96d0539db6e832cb1a875d2e681078783515811b70ad77d8d1c89cf7c22937c662279d179915282dfd73d2a3b7cf2202943bbb2cb2d4b13f2c5c28ea5780ec033a514246f39863c5c889e1318a98d2dafadfde32a76da48dc84f0bcc13cb4493feb4847a22f2efba30b6cc1a396d9d191460f314011d98a13f76eeff5602776c6f393fe2e448e64b5a75daf31342dc435ad5cf831aedcc2d644f924464787187b896bf375023fc83fde3f1ac645db2f41ffbf09793fb3cfa13b42e9ab0613846b824c7fe87e11b8dc976e4e808d1f310cb5cc9e4bd099dc2dd6c06940dc3c1135fe64fd42cc3d414af1711f4c34796904ed35fbdcfa61bfc93bfea10bfce4db3894c6441230c26656b60c249f3234bae73084f2544aa2db933c51a9e337513258dfa1885f5b5bed36ffbbc3a1a7e7016dcbddc085219ad490efb794af754e34e9ad505975b89d5fac7fdd887ab1b4f8c858c755db5901678ca35840a0b4119e2298d90d5393773172fbb46fd5a961e0d688d0cec930db2eca6a999b6e071aff0beb04c9ee8c0c95f3c12e13583607e022c73030038396d0e61a889e38bd82727b4a2abf82ac1534fa47d426f855a50ec8e4e2f12a1be4f82ce814035c0d9b00139bb218e4da797e182b160f42a3f7fb8c20078fba474de297aace375ceb374e32a84ac996179336d731afd90a967f98c835f1e143de1950dd86014171af2ede66eca02362cc1ea2846a090c39b9403360a76b24283074e9a305f78815c42882e18fe63cd3603647af0bcc5c1e49ce8af8cf5e9cc29fb524a9fb6e77d5ad42601d58caeee6a8a032ce33af7fc2af9e3ff3aad83fbeec2a253ae6dd00c5a444f39b125891f9f81be0596e0ca29a5e9e95435912a4390fc43289bf5c651cc768ebcac84453f2e569ce56dca979aa0c914f794878f3a62793b09037c8f0658015a81bdbd83e4578e37efbf969f1f71b770750dbb8f8b92c23d1226c15ce474955c8a92c7717c31513180820ecd1ec0d0ab7877d414dea391fa0aa6571ddb028d2725bdbc5958877aa48b31983b30f7d51d3057e84db622004103688962f0acebc063ea55b806c152345e113a8fd096f542a52b1960f9c9f573a08aa1d73c2656778a9c46df9ef4924c5241a6f9575a5929fa0c09dce942cc689dd8712d33a3dcecd4a6294e70a0b718872d5d055c893ace9e74008cc0ed83dfb78020b32bec9ef40f9312bc424b0cd0772891755d5a5f789cfa31d18a39210624270c0857d85b2d561c35eced9e04186a19499dca5c2f7cee1b4ce2c1aa34269bb43f8872143c18010635beec9acb090f30051de30754d3f0e70bda9b70e090dbf10d02a1c7f87089890d07b41056c2e479760010c25e9d9e62725b9cbd0dce946b56b63a577e44c0c64f7206fdc814cea47594d266ab37e84946bf68585542299070162c63e4509677e0c98a657df302f302e024c32be17f36483ff47a3c53f933550398108b945cc74b75abaa3cbf72c5a99a5a29c1d57a49246667e07d462b05820099f7d848fa7df70dfb4ef5a8f4a5a3dfdeeb72041b424d620f94a2146e79f187527959348c3c09d41d7521253eb3ccdf8b1a7fd8197393eb51e5d3ac04c6f35a66a584b3a33edb06bb365e1d271761049e28a04105ba24588ee70c2501b55507d45dd9361ed1cd26738746092115dbc9e52783e22590543ef18ab2b15ba1038bb0da8329f99b7f505a6ca8c99f0774f1ed00ad4a120a05295abd4408bab8c22a04956d845c58de8fcb3e42d46657d10a96026dee86c581157c78ce6fe1af30ccc2c4209d449ca8ed025b0b2a8828a945d3b900da61609c544e00af4a0bc2fd827862831347c7983c0b6acb92d0a1a6badf0ed93b7fb35a9a54c916bac9767a5bb71088229472fef590d51dcf300154363d3e6f33a833838d8c0c5e05866571441ba315915654d5a51374998c18d2ded47066e692b6ec8aa9c6226f6b9effe8709b402ef81f9251552bc7f7d59498d17df6c8642fa5422ef28569e8909afc4484b1ee3c83149ffc643cf156f24e1662a998da5dbd83b63a15ff86e8dae5e0785f67c39c0daf205cbcbdab1ee3ad37ae23eb915083bcb36e4ab4add7f87fbd8b71946f600a6d4c15037a06bbf43c00b6813888eaf5af34d9372e6578394ba6a64ea6bef3f9acabd656a7ca6f238775e2895965412c414f7b75fc8790ab7a9f3ed5a2c8945523b866653396dcec6bced98392eedef3e3cd05bdec2b655577d1c431e6061be6cf25fa43591aed0a4db74db8fce72deeb19d48a7d12eaf49db8f5f983d23369a8fa23a3231fd638dc21f2d2fe3ec882b6a660085d3bf9810e5573212b061a03d0dd510882336cf1c57474cb50d0b29e912cf67edf09817affeba1cf1349cd885e5bebea78c52b8fabdb94173621213cd04802a45466a12d5c880f21365115fa914a46d68ecbe500aa537b818d82ba52567b1693ff9af1e5e152645a3131b42bbe5bb9eddba2dbcb67c62df50caa35210c1946c439ba983a79b2a947d5481b646ac4e25ffbdf552f94a9a67d78d9012e7c2489e89d861a81362ce9832a7315f1c17cc2154816d4c606d58538f178d0f528d3f70c47c9654b586895304d42c6d77a800d2e0734b0b9d184b89328d207056a4aa52828b35f72b626fe6e626331b166665148dcea3e85f6721e9206d083212db6773841ca4fb34a442cae70e4927d3053187a3761842005ece952c91b224f74399dc3895b2e7cc32079b63a73d256b987a4001df2606a269115481a06b8286947efe218a7940cf896e017c2c8eca100f805dbe6afb6962205fbc03ed798c61f8a42f0d423bf2145f8c70f32b3bae9e46735e195a4327cfd05712b6221138d9cf86a76bae042b4a5960e389bede0d80d5341f6c129fc9318b13308a012c77fc6ad0f0d95853e0a77b262c970e43631ba11465658b176e0e6450d70a08754bbd8b4c17396aa1f0d25ec1fa5d591a37d72fd9eca151a8d4b8801c78ac45912942d8c9e5a4b46f030f055fde15f343d7d1e6fe103e639254b342ecba69e5048ab0d605b88f7d32df24ef3869de4cb0268a0e4fc9b544e651846934d8703235f9d604e4cdfd15e6b4552e15f44265cf4229449ca9430523fd125da087ebbacfce07959863acb9a9f946c4f5b91106167cb1f4aed74661a4d46c48d5da407058b6b02e64568fe1cc45433f51a7a74615a83ca4ff58e4f070796cb4ce4c553b88a59205c1517d1c72e607e47e09a4d009ad335a5bb846d843e41ea5c4f0cb9f1c36de3dad3c67b9fc335a37e9a711222997e0d20c6e13b19f04a08718b8bb8c77da05e25088d777661c588beebaa10ebbf6e49807b008215a6aee5031f8613a160f99f6310140c9b29794b6b8ce91b8d4cff4ade7a970193267470b55853777f6fdd953d74ecff7d8a001f26bca7761041c83f35ce36697f865811ac6b5aca776b035307a75432d9a3b72a17fafe854d44aba7fd5243203faea55ad071e492b27403a554d725bcf3aaa2905dcb9d1bef3cf64685d80fce310de97b92be5bc2c3d55a51d4973fd60e5e9c3600f6cae970c2f58830511fd5ceb40ba50a0e270286e6067a65d21e7638e193afe5b3a99b59f42a9546245ae2dc99773b291b7d85fc537bdc3ccb8c9ce9825ad4f8a18c2eccf386f476d9702e623ba28083251ef712fa083ed3598b4c90182d71612d14465182f8b0fd49048a27a5e091747e47682cd8e6197fe0366e25378ff345d531e34ea3b761aa39b545cab93d7d040c2a1e254e1d9e3a68906140dc237eca1aeba020c6ab7ead9295ba8509164571b5ffb10c1fb6e3aa333140f870f647125b07c5d17a18e801c8aa3d6044ebe3718f2c41daed1568968ca540a3d78733678246244a2b841949669e0d2751322adda0e6a0ab14785bbccd4151e89dc61111695fbd254b1d5a33b146c9742f811e2e30ae5e63b370ac12a2f51aea517b17c23adfd0b20c0bf6911b6dfc23b3709d2f3a59c59f1b6dbf40920d05432013844032d413c07543425033e30ee4551583b62f611913e2e1de56c4cf1f6ed9f5aef7bfe7bbdfff3d3b25de134d3e1bf7e79df8433831ca605975b997e295c38692004043d0c0fda08e9269abd52aad7ae03256eb66053fee125cfabb04131bc56aa00ebe350d23629807ab4e9e93e5afcb42fcb72f5c0c545e2935ef17d650ddca3b1719cc9118fcfd62dfac7664cdfb0dfcf43403b69de86320102014c4fb0391134d6463c8045df4c8f118411a308a2fb4fcb97190a35d6a83c199195ee22dfa342ba317817db3e4c6595828065c4c700e9e3d37fcfc888d7ad85a30108e776347a70386a9281160f82c1faaecabd40d6c02a81b2345c122dc7644cadbc3cf8a23114216312da2e0a3a3274f0d942a73e553cef868a0dab8a4cb1795d54ad5aeea151b603f65af270c2ce2dfba6725056b667f2e2745661415e6a5a26b69037f9527bf9e5da708e688c5be8a6cece7e94ae555095ea2dad49c0f30628ff1c6edc840b1c5a4b3f857b8a573e35de19717efc83796a945825b099d376eac2cb9dcf76a4c687396ad4fe18d260db60a976ab88ef6080b33941433723fb3d94971571a61804115efae603ae575b619e005e72f04722f589b30c64777dcf4d79763fe9c06500464a26aedefd2075f0c007e64fd8b3200c634b369cd22a3dc916e7f2ee4791474a33106c0c8fca1b4d70fa81e42ff989e520362f7b0ea08bc9a0ac1f420e0ed93f06b2a99efaee2893e45452fdb27d1c8df09ae6daf40936a894bd4880d933b9648ddc14084b5a4b3c3845c1b9381b831329ef1445e1b13bf46df20888263197b88666f2c0443e08aa31ef3289e3764efa6ffd91ccfb9abb5e4ceac0a71ff0637368a71e6d315c7260f435dead76b200ee3db34d02c05a8c01a231d4833b4800748787a364938383374a19c602ebffe0e4c8d497e682708440d0c114aa444f93c83e03b2a3ddb3d387319482fc62a35bb93242726aea90882c53aebf01fe8191d93280eb6ca556aa07b20e088b78a880c24bafede68da0b3f9da7e5e91b32f19b32d839d2036f1373512b90e7d20384f1300c8d23835382d70ab7a1b49b048f96c62fce14e5caba34df71d8591580454c4931acc9e1019b6f512848ba03fac040fa15eb0fb372369828e71b5e5763dc6921b32904060ae63f7c2032d783465e2c1ce4d013c10d5c4ca996033c374527560dc0981bf81a2688abda9421d62e30c371a99871544cd46fbb822c2c444b5f10a8096e92f74d12bc56c28eec9fa581c4e97062e0de451bd807edfd68f5b234f880a90b46841b08fc2cc4924204e8eeb1015df476961d99cc607b1cb1271f2c55f1c3d22208306cf99f3bbbdf8c29cf04e3c57cb047346c9273645e07e726be99d0f7206bca2a0ba926f227573628e295b2dbb725d939932429412b5d9868c73579eb1f24e3da71b8a47baa6cff968723b0c330ec95019cf7c1268c658d2975af238653650ca84f80dc5c86969ce1fce802c5f84e63158ce087ac4053b31d11374fccdbcfc6b0a4693293693908683faf26ee7f000ba79551fdcb208adb2be718f16ea802b1845462cadc7be00c8905a4cbdf8b07f2a8b900e0b9807660e760b25fbaf890b772cca97150b3b518616ccb0d02361d86341226fc53a51787348aa1d75771a7de437cca05c38f75608b73c71f1112d81e90b457a3b61544d7a928310091871ba15ce31815084dd0e590bd1d192b1a29bc187623768576eac95178635e9ebe757c92518a368fe143d9bb6920278dc3360568a352359977ccd59112072c3a91857464c4952a885f30ad5cae12a4100173cb1600b552a63dc0883f5422e26cd4ac6bd044d1e63b1ca9c6d1471c60bc40040771e74fb11a4b23f2d4988069c9bd276e7773b437f4f69fdeefae14a5a9924e28a063d97b42fd843e81ae8c34557a988ec6a210719cf8ffdb5a9f9e918d6694e64fccdb915fcf98b62af8b40b79c6cbc2bdaaa6e4fb1c8a957c0efc09c61ba19093b07a1516a96e858fba65a05e7cf16a70f117cb6487704a865c6bf6edd606cb5eb6344be7f72a2ccfe9fae24ec93b1b3e5810146af75e0653b343b2a8897fd398041c9eb9f2f537a96e27446ce9efe98e1bd72439299cfc46d5da6bd520aecb4bbae01212b0c7672a600ea6295f4db58a5b9c363d3ff7349a0317f5986a70e9bc52f0edfadc2a0f61c0596d3c50413f50f56c4e4c51849ef403496a1f22c474d0812a73b586921840095c093351bfd29d4bdaaa840c94052670729b7b40064a28609ce26f3362c4b603d6360be79ec1b67847b69510db70378f9230d845b106f5550753ec23b87c8591766494d8fb0552a5e4a437bc62cea06ad937d72aed82a790a9d03a589ced49829fa30dab9a35e96e6ad6fa1e9f8f9f021fc7ccb921ea6ee43700092038f24a1e337dba370d90b869ff2ae9d307f92d1fb7be35ba88efb60f0bc7b32986fae188ae5c990c747092ac447850645950ff40acf7b93f4210d0090f33b9e946821a1d5c3fa50f20d2e443d8933ba42b6be7d9b8a6d3858467c05e47570f207ffe1546bb581f7fb3e790d838adca144639bbed26a8e629ba878ced081b9aca610b25a2f001626ebc0eef8823620ef356405cb6ef2dda04dcbb9968dfde6a8d82d50ae1b6d153c28bd3d4580ee532e802c3ff26f42013bad61da5c54ab3ba5a6d42ca5e482813c52473c6913d35f3e376ec87015947394d749c4b9c952ec50a00d13668b62656a7cf703b2a5ed0e628dc196e80e35b317e8d1b07edf7cc1f17f6403319c6115b3a28e01c6757dd4509495c6d60b61d83fe3e921ba351caf987b34bbdc5eddadc457f8dc06de9f2a19f8971bb7517f2459166947dcc8d516e5897956f5bb0b02d13686d46bc44459cd770a20d7e7c120ef074212e6a1b6d41d62af94aeb428f4f4659960c88ecabe4ce91cc9744b8caa596e6808e89c9264577dedc235dfc2e66b8ded6c14aac8e166e0a37ecfd4b9b83b12a52256a4322b04359070c7b87ec62bbf0153ae810ff32777f3e6fc552af48fe6da06b8ab2ec8370322dcd5bfced48497122a8462e0d97c7d401267cc8fa43df07e3c35bd7d7db9afe734bae24029ee0f27a69cc7dd5b41dd0904c73dd33898f49ce93ce0985b73cc1db77e66f112ac2db6c3cca9b49dbeb188fbf2c66ce01665839d984c87793e28c1199f2ce136b82f3af6e4de777e1e3600ee06ef1b56497220ecd0edf2ee279fc5bf24ec9dc835c4d55adbac878ad7485e442dc44776bb797ad79ff97aa0b763a72cd57f766af9ff69ebff227ef453661417b9d33c53f39f7265c8db667a99ce3c5bfb46e3df1fc0bf70b88cf2fdb59950ecd9eb1b7d0043be8a7d956d175e6116aed345f9ed2ca638f9d27bf2558aa7d8a7b840ad65f87d4d5c0481553dc9f81ba16ed72fbd7d053a7b5897a6f46d1f94e27a675be71ebd5635f1962c2a6027a97c44fc68488a1c14dc378bd1cc3d1b43757f4ae40b2c9bb5853f0a0efacb75b13c8aa0400672655c46f05012db3faeebfd2e088db1b738af8d0bf1fffeb628fc38a694b0fcb91cc544b7c32a4f60e024dc5540bbfb81024ef48f48392ad571e17da4eb69201c47cf5c37b87df77f9865eabdcb2d44c70049b4faf25d220b5eb80ec617041750e855f4e6687628bcfbb9e2d741d68b61ec99b0101206dbaac3821073092c0e1e00ddc3457048335214471d16b07da708ccd965efd74ae15c5135d172c4d36f9b1be0c47b9698abfe904614cf3a451c92d1ae2b0d5a405c8a86f2ffc54b82689b2b0bc7f06df474055da040295a87235304419a86fc42f93c77d8fa26f1913df8d8885a5ccda66f2a322958d80fea2a472f6a333c8ab66761b5e7d776527224c0185361e0ff97d92a8c89641190a0d6e2bf100e1d733154fefc33f8e0ceb84d06c8d5388c831a512508c03593a29fc360c5332222cb47d3f76395a54c96585b46014d66816d6302c31f03888f08e6fef60e99c347083d686c53e66014b2d7f3aa6a40faa7066cb0941e9fb0fc1e45105d6661cff1df877487dd0405b62e07650c704de170a2c4350780848148270b78d4ee5dbaccfb8a3239655fc7b1f97c5e4d79314af7156063ed6abd8eb567db3d7bc64e0efecb94ee6bd6a8da21c8824d6a8199b6c3d3043b27e8322ccf665126cf77e56be0f99b3e618cc69211fe20144a515b5f5aa9f992b7ffb08b36fd95e7aa3948024d7d424042529062b4fa592370b355b3a743591f9916b06aab3c03760093de1c6d4aa12e17cbded4f4ad9969d1eac0f06d09fb04e4c3868323b3d3b247a144d795a936f5a9fd5ef8e0cdce71d4b68891fe4ae046f192f3a241aaaf4ac6a8c16624679701a439ccd1c58a24fb31045d3f84914bc5aed122851dc2ec9874e6d3c0f0ce4a1a4bc05a9b532161dffb13fe440406735406507259db663d2d1fbed42a564a445eacf62a7cbebe791c0723e718177c0eba5d032e1e7a681ef1293f6f9f9f9fb9e74bbbc24eb88a70576d1a05913d5606564a3214d94198050946bb09dfb8657a872c2274d67b2b9446c74a6e9932d4f91a1ae45108d83d450ee37037e0413f360a6660bfb34fbc11f74b4cb2c08007cb5f64975889cdd83df3af1c046ca98eeee5a6d61757272902b513c50c2660b4522956a22c7ca859b1f2f19563ebcca604d34ca5a279fe6fb14338d2cebaa445b95c36a16132f750a5b38c7119fa504d877dc61f228076e56deb965cd3c1e0a119211cd4046c72f6467375d0697a549ca60617b29d60f5f5492e6d24b1dfc7659ac44e24f69f49758507994ee1cd5c3203c2ef441026c3e04a4e54c4bd04c8b18c8f294d41142f20a1372e27e07c48897ec7b87c69ad28608c46eab274141075611c9d38140c4c60f4567a4a086028eb46c3780ae886344e649a076edea083c1ea3f66a7a9bdb8e21aaeba4947bd3cbc2dde0764b28a744d622873cda3f88b65a454288633935a1addb590eda51d04548d0cfe976f2a8bab00c66f16775034b13ed9e9aa509a3ab4524c5fb58b305782cd345a4eaebd31076fb6fdace4916229def1c7cb8029da8eb939d63f4fad2000152b351edf71249f0b2d17eaa263f137a89ad82c5a94a9a388441bbf20f4f2a40694d54b500853cfb16d1982e2c94ba1e7b2e1c0365cf71c696b4d6c848b5e3240fb7a071f52a9ed934c56d2479fe0abd077eacd60bd4dbf16d451b6842411c9fdd3374184ea5215e4ad16c20da9cff2a005f3036617eeb33b50718bbccb46648ba5e2f6a16914d6f9ad2867f612b81d50cb9e5d63acc04891900a0e311ca91a9ea5d606838622777f96688a41a97c7fd095d36030ea05c5840a13ac48c9a6d45dcea7a1af0349f8981ac4b6e17c616e70d19f8a5e73454c56f498c8f2a29552c826c0066228a5008ad43bcf2395da2980ab23dcd8b49732ffbc7773004e1466c8b189040c3e7f24bcdf8ab8452df50699f1457bd4988ce941aa1e09d2cc8d30c99d8cf6ac6554f2a53f00842131021c14ba6ad314ddd5c912f12d7173401e16f04c0580875b3e2f45851d03f7296ca22ac7a4aefe6e919b5ae5c49f7c0d394b66b17f73ef2ca732b269e4c17324fad68ce4e6d4cf5339f92c9ec33a61afc76a573073b9c661845a32b661e746474c17fa574f194da3a76733f944acb529b7d0255ca7ae62d01b9b7405cf08e6d87f48277b60830e4fc70f893a247a080211ebe3f12e8e3465f4970f8a25adfd4531368b847d81a59200693ab4bf6bba2157ea81f2fa4a4aa8b672282035ff49e7511867a59b150da0cdd51e9ff4f52d4efbfd24b85086ef4994d6f0a495c1493bf36e8bc3a1a818f0cfdee61b623c248884acbfdf6c4500c074121a98e1682b0f7a1b366a72e5ba45101bbe0175e32e8b134bc5ed847435a7d06ce14023d7dcd0bbf2cb716b88404a286476b8419e888ee6beb0df853519b89ca7ff6c0366936caf064b1c5f1b2f8c09457d92ae1a8146142001bc60dfc05023f9127aba0f7a2b8dfe5e64ee53f29c31e3893a12ada442423e190911514cd040f2493563837a0aba541012651739564d2cc57b86a75661aac4a202eda38991f8e126cf74099a4222ed67d22b3e8a06baaac3b294d91379deb6fb5ec77c179b72631cd62460902ac8f34eaff4c40c199c0f6e75e68638724bded50f8aecd1183f4ff6d92455a4009857d2b41778faea65b53a570489eecf07d94b68013c3b296a59ccc39d12e420e02668a4873157e32de3645bfcd77663916e80bb8c92e8751f4a03a071f14efa11c01e42332838c8bd8d3c3aa7f10fa705f2ed537867f7101c6f82257a0b7552da28b4473ce54408706adc18fbbf7049ca5b4b511f4d1bd43438c1d6abb963db66cc378caad73431b1e2de595eda73bcaf5e2ff872fa6313c2bf673621b85ea366e315ca38520d318445b05b7c4585f40dd4beda6ff7847d50b6cc0b575d391bf8f083c291d288568bbccc0da89a001d5038900a4ca35f3978b4dfd4e064cc0945b2532c3e799ce52e36b46ee4cbd6f36b1a1a6da315d56a3b8948e87b6340333117ba62e80db55389517e5eff846210f3b77159c687b3f68bceb817181695fd23fe7470d719566c0c62e5cd69141c97c4f538d56420bda604900f48525179c7d4cd514206515d5722697c14c80674af95f37f6acffa2317ac376533e787db1009c49bb48f6acee3ac2370b2780630aa56862cec984b12d12abff05637521266f7da6ff97781e1c869f7298e320c31c30b296c064aeb5356b6d7d5ffec855bf7eea41e4bf1936b5de845e2975dd16a0dbfd44d16e8354ec76341f35ed6d7f795e4739b9eb7c8a8864d390286deedb7ebf8f97fa790713599f9890a2034044a77dbed0aa84b375589e644650632983e7a4e5d035c56ff29f2ce79181ef32bb67c888c23d85c9c360328cf5126c309aaa97f041f04bdd4c3be3efce04eba510afd55f7e9c2293300cbcf32d1d082dfbb7953b114517b3d2d16fb6f3a4b31295a96fef3606c1468a376fe36ec12cd93771112feb1a81588e040faced0ce8f08f3b3931211b40556d5e4b279831a0c0db6d3f612cb82e252c0487c6a115aa42983a06b41c2e8d05c44b5943163e80b2cfe5e70fbba3aa8633cdf268bc435cc422be60673819c46d75897712e1bf83ae2fe7c282eabc82e3a3588ff984eb3ee7afd448e789758a6f6776c4a27eb335c529d164741b4cd6a2a4c669fb64b7be6a7b83684be167ce376914fbeccbcc322577810241b0aae424b64580d86e1632be5d05d3a6b7ddecf61649b06b3ca4e44b0126fd6d1b87882acc47b88a7f95748efa7480c80c0a2f11a03d19d5e34b9d4aa29e482164df30021f1e272f7972b44aadaf7b9297af02f96a4eaf303a743829c675c4b71d777f6f0f4632914e31edef7a3226fc32af38816dd7e971f5c4a32170517f4941d766176a1014161807efc3a8a23e5e42a1d6eb8b1714835eed4de404eeca1349e3f077e09da66f80edfa9d8b82b15acc897ca200ec1d68948387bfbdc01e44b4e13a768dbb7e3102b7aaf6369f5f280a2d45e14bc35638d994c44c7c71b0006ab9097a1db7ce419150debfe9798ba93364c2dcfb0f909f71855f232360e6be38bc597790cda887e00278f5792fb53cc61773040782e728d0be49021ff68ba4b69f574b9d7d4c6184564d08850dc2788a90d14755538412278b9fc8b340a11ca64ab3edb14d95701c206ae1ee36d5d621e744d4394a99eb0002bc498d67e81faed6dc91c69f8f5089a68c8b01551edd80acf0437a7e2b6936387179b38e1fcc1d4ea94515abe0d3fded7b171ba5a72fea1fe1a1201947383f525cd41639ef787c5bcd22bff0982949d6ea7c152a990b94ba60c4fa0ea054102d1ebcae1d0da2af52b94424e229e2a69ccef43a11ce71ce7f8b19e05eeb1e03438afff407d122c93d430d8d15a5dc3c8d269fe104ffa09d0c7d6a1640ffd7aadcba9e5897d966f91efd580ee2a3757ea53955a5509b3d65bae22210e0c0bf9520f11295a53a4f573197218f5cb167b5cbc71b8ea2a3c3e3103dea21c81f6c0237150b7b75db481321fa39c116886ef957f7b328ae5f74bbddca7b6f5344fd09b1db1c69f820d503f49e6a7cb8810ea6ad87ff290511670a4738b6a0203b9eecdb116d4d80646f747c8d97ba311c0764581fdf98ac28c76210d4593d81b3d23be4a37ddbddee67e5470bacff2761551f00ef5d47aca184cbcecf6296137e0e37df8b38bb9187a6345336572a1cc34096771ae6a8698a68e5d18ae3d965cb178f347f606939b260e2acede0644bbee10189ef89abe5b0d7fca0d4020ee4dc8338d09b4d6e17ed2aa611683e6f5420f1da711cc5f5c9c86423e28253eda9832dd8db6233bd6e4e7c468f6cd7c1c03f8d53889e816f44629373553a1cdab5fdc48851c0d0b5c778784fa7e5c85a3e7e72d91815f6ae51423bb985ba596b1dd28ea32d9a9d344300bf54e75bd76bcc1d3762b57bd9ea6b90afc445764abd8fa4f3adeac6a892ccc91b7ae8b56ef599b0df8bb4e384470be7ca10f866194b55b90d12451406af1d447b14c8762f36b13e5ed937500a9463462e16ee2be628df16d1ff7855a8274010fc8e577c65a7e8cd6f2b66a4a2c848b5b6ef99ca7967ad81ebbb46ac16fffb7b235b008b1f89e20e396955e050c60086021833c3fce2d4e36b95a4d8faa574d76c6fd147a1e04702d3da269938fbc92185de559ee53dd0db0fb96eac950f01b39454317cf454fbc75ebd1d7190f5bdb394bf997386fe177aabb6f60b4d9a5b99d464f8c8b10fadd7fd029483e1562dd22da7874694d392103f92dd7ddbd4d89e804e6133495d48b0a240c97b9978362fcdb18ceeb8f39c64d4bfe4c58e6f7c7b69d73ca406102966e160743cd8be15649d6408e4aef42162eac6fffc0de44425cf5debe7de5534a3154e50e3a6a789d965242217c8b464480a4ac41050e96404913441f9b13611192773423fafdbaf6885252aa3b019bf35f325d3a5ee30295fa524e52ceb100b5df4bdc087e6ee439b2b2186581e0c7049abbd701e89fe00bda5c7c2795d30026b24a464b5e654bdb507e9c9c482a6654e759c998c8206b71f0a9627f59b0344f532792b55cb50f4f796c2b345b33940be328a27e1bccd1298d3ea569848652542a314acd926cc951e4229d1ddc4b2f728c58248f6258b153986ab68417fb008fd6d3a58e3a8d47249d5b055cac118afd30adba1a9e04107d04b5534c5cb77565ae04958ad52a709af8af0cff5ee8b715ce97c08f821627b17537d6008684f31de2a6c09c05655ed87d315a36394669f10dfb07d09f1008fd87721af0aaec924d82c8d246d20ef3f158aea12687d5c5f4d6cc1e4ecfab57b42e610cf870a9433781468f94fe50171b35da3fa1cf93e5a3ab3e8faebddfb1d566becaa841e0980581981fa32c9f8e6db4dd169d66052cb9d4925373727953a7fb8f19b14d0bbe703c93588e3ff35054398b27302b087d03fae6d92bcd29596840ce942a8edab1fcf4be58f3e3db8b52d91b243a8620390ae971908242bf7fbd5360faeb19c70baca3e96f3a8497acc08cf6df4992888edc6c67244a065169c118df4dcc6be1d44068c39e26693fb64f8df61f56c6c079e551f4ba93fe60842be5f61e015a21e43884f6caee37f962d3540c8d0bba43112d012f6d567f98d9fccdf602d123a249270ce2f59eae36b2a1f6bfcfbca9d9f7f44b13f70612366125fd13472b1a63708cd7477e3eea693d7e4eab06f3b971e2e519b2220189c406680668f9e4be10558ff819b58bc65fdc7587de86440f1623c3bc5baee3efed42207283b67a2e2f0f4f705de34ffdcff4fc5903d9aa358c3af4ded11743fbe071db7bd98bb9ce40f9d18300be2af0bc2341437e4b240728bfc42d66fea9e9ca77024c2bb671dd142047885293192ff78f48fa582763f3428cab6d6fe9770e90833b1480c914f88d0d77ed73aa3cabd85e101a9d2e8f109ef134893b4c840c15c06298c97d590831b28be4cf20710f89d3bbb012ac1459616d50b2b4c221b7f363283ddaecc9690e66a419c52fd5e84c228681300844ba7925655bf98d010006feb986361864ac1cbedc63a4139ad3a031f8181a0981e6a182dc7ab6cff79496b8aa4aaecb2b209f2ade21197413dbe7c7fb9a5eff83807657af64416300935704677b44408a6415d523fd027dcdee8a19bf969c0cebb8a776348c7bb627022a84d873bda054c5a23c1ecf3224ab2719fbb9740e6fda9626cf229d4ee323809d66c30e1fc9a3bb683c0494ef7f95fb2b060258a7218056d589be600bd8fe28a151581751915c782674e6ffb623294023b30bfe1d5f9ed3ea15c0d94fe2527148a4b1fc5458522480363b82d0aa9334a239eaebffa5eee83c0175c09fadf69180ebbda91cfb6d3c67effd3a7db74d6f53fac42699e8ed4024b1e85e3ec528ce53c772d9e483b249c64757696a3a389ab7562028a671ec60ec8329305ec4a2456d9eed294f0146aece6a59b79713c3db73ea49bcf0722ff33eb034147ffc5a175387e5032a4451d9947ed8652fc01f44e7f967de58c7c94f525712e92286d57397a9b19f63419089c836b68ae9e0004c2eda55dd4c82c4859d3ece3e6ade01a78b614ac3fa4ce12fefb52a0f552221b57a08184f021f71456ce7cb3371d6d94cb69e04f2ade483c7091360807caeff8e204a482e4181d2011410c78ebbeff126703844f5ad32e4aeca8b4eb4e3f305b8106bda8bc873773b81e7941168834604a42571596ea245852fab2bb293819247f52353bd9ab2450510f710eb540cfee3b50952eac8f0ccd3ded4089d4e2603691e8658832932946beb7c4a02d4db161cb8752858a2ef236c78f807a5cebc38b05435b6b3c5616304469a9c9fd245612bdd066308232e09a94485708497472ef2498e0e875d6707a68e35ab7f4a22633cd4b8f69f1128ffdca5c0624375e6e8003c0191e48d08f0cb659b0d08f7ab0950aa1e20c897c561a85630a3e2b18f8d37bb1f2a756ff8c927198d2d24584099fbbdaabfaac20274306087bc629269af20666dd7f3524c1bdfb8a1e49541d1df30b53459ce64e6cff92050837fd4fd93cab47c80e3b431b941267eb4cec6720534528d3628a6360f53144610fc4aed0fe1f931a7ecc9a39c2cb7ca603651d14c1c2aca9bf0c61069486d708ae2882f931f39ce619a5e70cc87e6368cf38ed97131c1145c8492ddef5676bd56a0cf659716638c7e7e8df1f1ea5047a45f8e5bb1b6045085504f13f518d410c7892e1a36909c9034fbaf63db1e0896337418c11c686d71d142bf4b445ceea2daaa91fc95fa69610f6a1950f02ac5db4582b9e472fc78f5eb896880b4a74e762342b0145927d6b5f9a6e43c6683226958b02e0fbbec4f0f3c96353da961fcfd1c39f9c368c2b0cc4797cca794037f9bc06da7db7bac34d203a9c06788649db16d1bff2077ecc6220bca84de9b2c183159f0ee2b5280ba525bfff3df986157965284d1890b3287ddbc664736a5ca7eb25e2afee50a940fb7e3a882586f6677914fa48ed865154753c7c524d63b785d374d4f53bac436b9c1760f55723be6d3f9d46604cdf32bf76160427b338587d8c0f46e06d367530f2ab4bf0b2e69b446f177bc75da7185d47f5dcf6ddee7350275e65fe0d8470bc5623a3ad6a0d0902bc21b06dd8e2a3abf905cd410de32925bc716a3d86267c4c04115a21a0d20dbaa7d3e96df04d8c7598f0e8fa15d2b742657e1b6fcd4fe14d2fc39f9aa6219ded46e4d3fd876e02e4aa7e41f148cb7181b6168123b44401b1188c7ebe7271d44ecf7c42c8b6eb529970e9557c202b4a553411367ddc656f85a06cb8214a4b20f7e934128af6dba4fcb8c23dd2a5bb15385262aee30602d13390e5f7af58d0bdb01366b3675cdde503164b9a75975b1d96addf1bf02bf2be712c259b7f3c498e77cf011663fe9e65bc98eed0a458490d2e621fe1cd87008a190b09c2f50e68e5167de078331734608aa5a3efe994d0b832370f99bf3e3a67a894707f98a2faec0dd8cd48a24d98f059a23774f793bd33bb9f79972a0059bb340a6489185a0db6c74e76dfc0e08e0621e56143b0e0f1a6c2298c1d76a3114510528f2e08d901b68d07772067170a05718fde10d2476743bc06d8e34a317ab2f4bfa927a1507e1ea18ac89de1e33d2c3f6da054d2c3ffe0291dda8851f1019d864128ced7bada9239d9f0afcd9b753e2c442eca4bd223bdcc490b42dee88b6f63edf4c94a4505bf8da54c080402746b217832c831e3d587e0256be3a82a3a9c2906f22298e1e395d5cb4131c5ba91657135918464e1e18386f3cac20591d5f9b8d1f0e89904fd163f3fcb631a1cd77bc082e6599a3f2a4f4c8e26954c7600a3c504fc05f7d167290b1774faaf86c05394b553805b7c4d70865c09230a43aafecfb1272fd4284419521b5319b03a598629a005e26c8fae3a9eeea510c3d761b0f53cfe1b4061d42431f48c474b70475b4abff4b99820163596fb38a4d8af197ba6832b606c1c939608cf1db118e3cea5670e4d1e0fb2471cdae58a626f4038a684686c68ae64a9f2bd74759f0f6f91ae0add030864421f0afc8def56f58f3131ebb02e99bd18327ceb0c3e7ca22c08296a5318ba31a0868a3e80bd4ef9ef8f5a63f2951efc71bce656b1f891b766f0adf619698aff31d5d11f02ce4e93022296c7abba33da3e83aecd24d791d24642ce0f88fb6e8c8286ffb887d22452b4fc262d5a6e915c72cd94c424cc98771194ba74587d8984f42dd0f5d2cc1a7e4b32d7ab0893de63ba3a20e54b266352b800dc2de80fbdf33598a68cb54ab9f38722c78ae0b425ea6ff031fd51e7fd0b27dab233ebe41e1b892f606ceabe49ba1cbc6edc9d2fb98f7b57e78297d3d6e086af4466bedacb4ca09776a12ec2b6949265a49bd4b6ddce37d9bb20aaf44b7e1284f9c4f5276ff8aacb3453fc2d2ba51c9a8e0c50e4fdc278ea5d839140e527de30726e8089e3c0c5c9f7d4b3887ecc5618b53da00b078a5e2bcb0c50884356eeb5594a1c595c8f74fcce6632446fab8dbd306c6d2aa59f99a01a35126919bcae6cd7a825a2cda0b3c2e542f41155747998f13e54c38f75d9e281205c4796e2ed31a08154c99653bafaf9d7502c69dbd0d3c3a740f3ddcd3b3e5f2786ce0c42f10d8e951c2d6e255c02157a94093cf4c4619b6651c44f3046cd0a2bd31ce0bd40f8cb2151dab3e13ff7acf1d2c3b82198abfbb861422461d3066cafbfe77cc489a52d3981f62a5c766ff6c2e29f3349c48c1c0ce748e2255e85d70c4161cad2c8acd3528889158ca05248b5e30d933badb774cc585c0a187a4b5424c9b15a322e0c5a6320ddd445eab8881fc7e34a7d751bf20a0a4f8fa6c05b55ac0e7eba2cfea298f5b3939383c24ead1a2c83bb5346958a5fce57c0e299b4fa4fa5601c06b96cba86185dd0bc115e215c7c7c9fc1d78d242f5cba099283619e7cf8aff8ee5f82ddcbbca6d33b869528fa4e3e598ca5d14b6251ae4ee0dfdab080d825abd6d08b91c28cc34cad010a3e6867c87c0cd14d00f2546d75e027765f88ac9e3dbde2858920ec6c6575ea103006f19955c3ac3cb5a8d41d33b8475bf17f05853d1b8c09a1b25784a66307fe7289388ab84bc438a46262f1aece39e3ca57bb1b2abf550d063334a1546812ea9d6c8a205e0e45b6ed2f6e115819a419c9578b1f2d1afe888c4b79b666937ec56d2b3144bd26adf100e41172bdaa1eedb2df12ad8006a66659574c006c344702e24b54fe09a3fd7d2a8a87ee3c55161467c80e26554455d2a0f0e4a4910c4bdecca2485707658734a6fd64483de1a901caa2984be1d108d66a9b5d04f6c2326b6cf8511ffd7a049959e3383604068a3e375f950850e356f5d2573e5f77a4ba2c04d04ea1b20eda36b88ea044f3706abbd37840b5f3787ef14094179129b54c283393fac80db3fd317a2b8f553f6459a7419d8b158589f04c5c70260255a1425be6a2de5dacd88961fd5ce8f49f278627b4831eeb3a6d735688b7a34124f935e03c60714db3ae3fcfdad8c8dc6ba4ac3cb206fbb7c4cd9310bfc0786f1b5e815b5360c49ee7e8d26f933823f05675343d7b9d53e90602b2aac9034a94c55c2e3210a6a9b6344e6d2ee78dc77e31fe38ce639f862654488cf0bb548eb32fc4be9631583c6440edc3327843cd80c96d27cca7cce4094cb60e3a701f845b02e9c91fd189dd9ea29c9e1e832d15084b59fb9bb9b213a02b70cd81c4328748b9a8893cd0bb1f845845ee25b9c1854f0166512cad266bf874687e298b8f42785c2ea1014d25e3b6565a9116941be22b8cf919327970bd956cdcd3dfd226c80e573079116ca1b223adca1264ab3962ddb96d0693942c0f33dedb2c9a662b9e3d0577c2f5b220892cf439be7c91b9fc89c270bd4f781bda9c1b97a8d5e650afa681abd0bbbd8c4c49641c0912a1a558a51243ff8a13fd7a1e7d0090ecca7eca19726b082de1cbf65a747b14a77889e1e998d769fa068f6341dfc433f85a41a086898f67007a9579ba3c29b5a899892221078faae6fcea923cf067a7d4484c1e2a412fd7ca898cb1eac519c3e00cbd8721b4ebb99dee40857a36c4db9ca470f830d13b5893788356ad0da70be61b0cee21197c6e74555fb5dfda90320a4284ab13daf28b1517552f50773421aaea469b2233b54bb2e7a78f526cfcc56c4d6040394b9ff8fdd1640d3b2bdfa797e66c22d2b29a155a2c25037ca0961dde875ee5f547602c66c609e8f6e53138cf986d80c78d0a5e8117ac743617797dd99970920daf81ab550f6e0a4f1caa0fbe1ac3f52733169a8c3a4bb8d684958a8c5029be4e821443a8f4145a04993ac4e20948642a2f35b6bd54d477f704a8ff3c7417b142b2b2e8591a6c0cec5c2de996ccb2c042d81e137e5b8c945e4cc536e678b11cd5c32be80e86d2f1ef04c897dca657ab54e4e4defdc425742c0dfef9383cb34c07b4ee36c5bdbeea8b84b0d25f58a3593b61d9a80eac846d89e50d9518ceec09ebfe11ac102547149125790c512d72ad759a36de382e7843f62758ea980317358daccb191184678632b5b5f1bac28e31ba1ac35605bdecbd9940ef1c7f252e73736057c43dc3cf543f284a4252f5fec770561443c5da8fe24e2481dca7fd0d38770cdc8299ea63a3066033626d8ad96b5393541a5b873aab6b5d53f8e911d02469ffa36e8c19df658716d0bf2500f3513811b7613eeb49488d02bb490858e2e017b17c4156be46083bb2b4e77d57cd1a716d0c249cc14ee368cc830c5698020ba66d958a59d0c1ace285f2072852158d12a856e9f31df085ba114c9a721e81447a0e2b93744e94117352b29283f8b541a1bd92f38221b339b3cefe0855819315b104d4cce7cc5881ba176991c26f5b3fb845416b30e7a3b2bdc139da18904c0161c42ee339cddaed9e88933bbf4c101925da4cad0ff333ee312e0decd57242d5f2e6655aa4b6afbe36b2ac9914e7bec2dbe0f8cc107113b5576f3c8a4ff7431110e59b26352e81c378118fbd9f70c1da569b62c64c8c1fe47da2deb45d10192a234d5089fc44406ad98596d915e87864573f2ff3f8484888c8fc5bda034b998a2b71450891b70c2257aff1a81f5ccc61aed5099702ec7b60f12985228763492c18322534ab3afb11105febb0a3f394a5b1e19540ec401127a76b16707273e39e80888231e373ec35a71c711626beb21d2bb07e413926454ad3d4cd8dc9381fff122a73fdb05d54b0b02e4aacf22321e2ff19a7e6bb9015f6293708a953d7c16b245a55e17c946cf08476fe4a0899f6dab3c14f7a6b284cea90375b9f3b7724dc781498297a398cbe274eebb29077002e863af2cba0c82e31562ac05ad5dc2c86331251ed000a1c830984e3c777df04c6dc178ad935e7683a4ad43294d01f6edb9e1797fa15c9191f88f6185992dec6ba7ff961be0c6400014790b17d50850406bcb019b0d0eb628f40a3b4366d68d7fb4d0cc4aa706bfc3c8f4030915b645af3957f1b469189de2cecb86f5236e225db0696937b7d3d56216548358530a994fa7fdf2276ecbebdcc42493b4fcd2fa5c71d9d6f166aa0b225b37e8031f67da4fc222164e2ba52deba42aba3566fe4a6105214376d70d1751f284ca131d213cd879792fd7ff1f2e9b1aa9f896b8924ef7a8e45dcd8fd97b9e92032850cbc3ff76d330dc40b45d46bb3543bf69f051c598e303b568a0e1e53a2c5542e8ca32f4336011e36a9805ea5fd446744a4e5ea5f55bb7a773899e43ea13aaedc9b53bc1a1073c3fa01dd01da8830228726146c8de594f386a4c920009602807bce027bbab820c95335269406bf82e703fac04638089b38fb446ea734d1d178fde7f1c4e940d2b52a8e68145445cc38fd55968e9fa3d8feb9b676d080750fa7b698947971088f12aad99ddcf41f1a5c93ab9ac679edfe8850c6ea425ac39c72ce2b5b814bb3adfb2f347c3e54fe9adccb4411f083338eddfde64ba2012d45a5058ff1255163dd71e4fa4ae4da46faaba14297ea9efd2e6baa41a1edb9508e3b67e3bc6e8975c0a29a2fb28fba630cad14773154d2b1abba50cbf7ea2108d8e0a8ed1593cb19c506dcb42ee260114e6bdf8821146933cf7f5e3272b13dafda40c0169a98218d85eb79672bb1b2e1cd0853262e944ebd01d21602514a05e342248d4b08e22eb43f8546b4dc430cf8a8450393ecb1a31b9d0dd8a2a61da570f94897f5beba7a462c9f5367805e043f235782e7e537c70eb4531f3d3c3f1a39be4fdaed6ead26b1ed761e539c2230655b14eebc7541b234a14370994e7d6c78af4d41ba467807ce2218c4d82fc1087a332d35d99b1176ef3696835e2e40cb4c6b7ebe60edb414cc331e8be095a3ded7e6bf81c5d0dcedda76d04c2aa7a1a0688db4fa6aa98f3c45d61210d974c0046fcb5d11904094c6700b73d1c48cc20eef16ca8dbbc0181e88d532d18ce1a2f74b5296c1c58ce32491535290fe453d41413d9449d0cc5fcaa79b88d8423569cccfbafa3f502d44b056b689911612580699422ccc95022fd7ab5919c285284bfecbff3a04e50b7614d971b542b4c4dff36a5de5de251090899c8a99b8b2ae10121dc2224a5ae9e0e84338545802c060681e0ce5893465ee1d2f38a883f85865d4b43c2a240dde6857ed476803c60dbf578d8dd1fd2f32172a9d02b3f94c95ae5f2cdf2b065452615b8d343d91a915516b930730a58147428dfa48064e4a99fe91d550bdd03812a92333e4b3a78649d1f69b484fcca9a5371c6367682e864194a4ca01d90eb79ceb9a35e34e9a58adbc528268d2e1580fc197a89b6b03086588fd187cc073898f437bbc669cb128e7b7cdfff8544cf517f2b833cbe1233a9aedc78a7b9f446d3530d1decceb6e3c1e8f5d6419cf025d289d75badd0f3e18987558f50b526cafbaf35a6d913aea65b16db180a0cde4c0ba6b463730267efd591483f515730fdd8c224950870f1049d3a0e0f1a4c4d2efc3f125466c1b318c394d0f134d919c289fb21801438fb85ee4eac5a561d20cddb2c176733a4b502370d1ea802202948f44349da347a7280f466c96c5242756b710a85d2e88f0251ef70031e3e85342a0a960badb1a693dedda6da76e02d2c0993235a9367a14e38902903663f6b3bc7033108de9c170f68418c40a3f3b9c90254f7f4372858715776d3905f7e2cc4db9dc83f2c9242f4d73e5cca68273ea8a5e9048cfb50091944f7987974b0d8d9a89fa6c8e81456c4f5e1240e889f36a26f526b753ff549a7b483c486407d719eee4855cf8e3d6da9b7c4ad92e2cac7612ef1ff41f5264711a8a797d6d424921319638aa1652a77a4c109a607182f9a0b22b2baff5bde75c20b990697cd60068bedf5463181ca2f820fba50599e12eaa09f97cea7f7768f1526c4dd39c5158167182c1fe9b82373865a29ae35e1d76956ba68ee21428da18121c268ddc9d38a2364d695a13250d139ac47f5619fb8afcf04fda0ad034cd5971e1d06038e18f431e4c07c3953f792d40e26c10cdfa523be712bbb263cf089c353df708a60d1e13ca5ad964ddc07e979b15b208471676a0bccce2238b2d5e6710a175d31eec4688a80c66056ff03fcd10fc64244551556fc2059a7c5058d4124fd39a2cb493a13309f1e49d3200f6e0436e0fca00fab147443b7fde8158bff75a24eb7c0acfb4cd047acbab1735b61a0eb6d61fd81f9e606a0cbf94a624f30649adacf1c742fafc048c25c8e1c08543b105bd7f576b6d38834673d34abd69007f76c311c4e902bf80464f914ae5acea4a4fdf20c1a67a41e6153e3c87ce422ad85c3595663c108bbac3323f791d275387bcfab21666c357078436d9a9f9ed2208320f0cb6322c32125ea1673579a3eaa76a8f0e726f9bf2c0bea7abf25aeef491fe22e674ecbce9a7831453771a1614cb67187d419a1ecbf8ffb5c108b085d29867d7e9846d4eb6653d4d99dffe46352533ea85e793fd39386e312ce8fb5cfda468903db37e52c3f3281d889acd0f2df8afcd19bc29b4d8aec5f156941432d679804700c38d9c07941fd17d5b43139f192effe95247eba61647b77caac4fa21584ef124b0bc24dbcac1adb18bbbe264dabaf339650dfd09f5c0f647915c15be98b165a8007e345274b0ae5a72883141e56722762750415c47d6f36ce0b0da24ceb7274ca6e1be5ce260322b2a698ba737bf7050fbebabf344a09f1cbdce722e7f566af567dccb030fcd51c9f667ce744f900b22ff84fbd3e87dac73e0035517eb2668a14726758cbd9710c944b9d51502442be1db150591dbe1b078e3d7dc020030b32feeb27c281600c928b3a36fb04ed2d077d4dab56e97e9c2707a14553b158d1692640ee8345c3fb2fea77d25e4a10ff8c2cf10df133e888d6e9f23f14d0aaa2bb7731cd578bc5bf541232736022dd9d0c7530b13059465556cdd0e5a4fcbf2bb92021e21ce9f4da86dc3a93f3eaca39dec791e11a7e6ca4f37594f36b1619221e90b7df84ddc509b920a610b61095788677c95f09b4867f988e7e3b10405f19ec6f21aa120c26cba98f05faa090a50d14288d5c6542fedc914db46f093dd0df6c61bdcfc5dea94ec72e647af7951e8e884701024296417074d71daf1f269bb7f6f077f76a3bd82f272c6849719cf20ef8b0bf9bbf56f7ce92ca2c17f0a217082387668bcfb0cf272312155d8a28a45d3fc9edd1e733fdfe1168a96657cce44b4f891be357f75dc98f826b4d4590925efaac589ded1edde8a25c4021928b612cbfd7c1bf46a7ac8f8813818112eee90017cd8a2d46436b6ff39e169a8869f69773f653ecc2032f57f0725745c9b986ee452a7f064284628f32599d3a88c429bd34edd4a489b5334f1f4dcfea84badfdf5311ed0cfb48d2bf4a9535b3c4a5b648e8085896783845bcd0f53bb3eee625082e383883a4d0ea9b3912c088eebde91def124e4cc76f808787156a62fd041cccd82c79c2d1ba2401661d22787125542e19655782b635b1a6f99cf2503d7f5fda5ea6e2a73b6bd5d291fd5e916418aa11fa78c2c68cb6036805224e562df0ac5ea32d3972450f5bddde9f68b7087328f846fb8b6f81b2ffc41fa3e1ff6e3e52a2ba4fc56eb8904b832a4dd51a31799e4aed56acde29f080e65f6388dafc04e0929ef018234fe9183c41b0d41694070ee547e18e77758a574b98518e1b5fc037d11a307ffc2af06c03dd84d68cafd7129c1dc855b0d829fc163d15bfa82fb13a929e3223e52b0a8b46e29e0a57618064d62d5bb301258ff190132728490fbb4aa5a45e741eead75352ad2bce7dcce531e20b9e5cd2c3390f1d2517139fff5d6b422e383ce9457571c8a1732fc160e02aa97816230adae105acac57345bb50959dc3f1635194c467068c4c05d4aee649594727181f8d8492e73862f5cd477f5e1823532ea548c301e85d372a72c968620546494e902e25d7922ba2029b7177cb8296b58e8dfcd16662e0d878c5b33c769df460822a6dc6e9a63612c2d439aee9bcb48bd332f99d1df7314a01f25e35cde0d85e89150e2039b0ad69fda9642c5095cc09f7d8ed98bd01caaac4bdbdb18e4c8deb0ad1b632198053546057cacdeee19b503e455d424c111852c65b1cd87dc726b9c5e6218ce5340d446150fd3e2317479120f978ee9bf60420033c040dc3d667e92885c6ddf33763c4dd15164c7803158194ce2194e88e94be3548225ddc1bf29625cc0eaf498d97ea822cf1dd7e31e67ba4d51a94dc327d85c4cfbf17340b8d99b73248d3c3cdc82442b338271a0fa01897b4489cc5a2defc5b8bcc00842c9cb252a60a03588e1294016b3da55fe866df3509cc94dccf0a410ce99e40afa883971bef29944c619217975196ac4a78166343d899bc0e76f87842695320178999c0ebd8a241f39fefafc583f2255973ce4c27776c36dd1bd7d78d1105686950561e9dca5d172ef96908c6ad7ec6f563fe314eead35309ccc54f983a0b06aa39f68ff588a982c3e1b23b03d4a7732a8324e2ee50ff43f98b3158373e9b470794c9b9bc1704340c05ed490fd03050e0a1f91a2d4831d4db04ae16db5b0117f6e5d81a463f52230ff8bf52e6797281089b4015a381fcdf019783c291b55965fee711f1437089a28d338722e070e8e3e71909b1196ace829e45fad7365dd8270f4d4e6a327725a1635b33b8c4a6734da08322cd7397cc6749342883c7ff136f0932286e41a5120fb12c2d1d18b23500c608bda0029e41bc0d6a038452a12d34641c28c6d42193ba12bebea464eb1fc5a00ba6df921f415ada821f2c65d87a254dda1f4a0fb3c9448e3e8fc4fa2e8f39ad8d20a91f7bb65f7c4ef62417feb761913fd68860b20978da8e4133a3ceb95e2388ad1a5bd10388a795d9ae8ed3cb979763f42b912a411cbaf22842607bd27417fb7a200e9f61133d1b4402183267f99bc0369f42580d9e90819d762e5d5b5ad0182cc1acd4f243f5fa1de20bcb921d5845667c453ad3649be0316e54d17adc98bea1bd4fc46a303c2ad18d1a81f721512be64fbadd6ae367c52d6c91f663cbc41ff79aef786ca552ba820e01280617a83059db9430f2cf0e9550dbc890f0af1309cead5e0f209b0a329b5f315a0c8df0408780d40f1c876dd6d7d973ad67818a0734da102ac34aea624e3bd6a54815e895cfe6f32a9f460d07b186c59cbe7b0ffa7b91aad31ba977733b4f2fc3bdb758fcb9c31eda20f69c346368bf1713100dad1932d0cbea5cd8ec141e68b5dd5e8c5d1205eb830dc4a78fabc0b80ab1698ce5fbc7e96abbb2a629b74db6488ff4559050c79b54da564e5305e21b10f799cf54b5e347b432ac60021ba63e53d0ada9e384dc2cac71afc203e2f180773c5a510030765143a7319a2bcd86513238227c10ab23ad11fa8f5628e27a555d548309017f61a685ba17ea7f5add012607a1e9ba3ce8f4999a6f12526628f7ae8ce0e709867e7c550d026ba9728a9d71a31cc110cc202d9dd4a61f091cb7852730fcb24b491e079198a4913b26c2b0f32deba055cbaba8b184b8f4f5a90900e8942e464ae1e00b52ac29f3e40b7704d9d074ed8dc368e08d46954a53ce64e0f3d99daeecf4af88acbfccb9a7441958494d18cd0e3f3f2bb704815b1c595937852a7a26c058665297d195f41b1cf3fa17a3e7f66213741450116e043025b6a56c1fb837c641b00cfc259b17f47b367be1fb6949582a0a0f8631f2bb1fa63f3b6f089b3fae8acf289451ec8bc2f7c832b5c29e415efe905d3aa3527b5761b4473b480e00e244d990100e3e88632491ee5d7bbdfcd69adc481a15098e42cf36694f5efe0882b005c5a41903f0f7f905296c1d3787e00282f164c2aaab966a788770263f095adfb748fc416d63043e45fe3aebf159352364de4c8e6275039b1d6a2e124280a03f5e6d26529d855f7aec10f8ce40afa49054606028dc465c9af853b3145dd61d875a0958a521a18a55f6d286e60d160b83f2cdc27b4235e650714ad9c7d00e0c347e8071a1927b880596e745354b28e82ffacfffc3a59a006e236586cbc74f1fe1d3cbece560e7ed8fd1fbf98f0313d3c1c0d9d34115e38d07e831a8f87f01b695cfa39ec8c3ca4908de6abad71b9e3b9c9c24e05358589708d413934ab1bac654ed9e05c96f3ee89b8070c022d6d61a6f7c55592e8c7565323c1bb0fc3e30781b485090d0757decc9ac2b3d09a1894aa213b74d18b588cf2f935528e8053a94f940fed7a03042a109eb702513fd9b57d467c1a27f27d9586d09c337e34fff214cd8cdc6449dc220d581ae25e2990d8e407a66026338b64a1842d57c292d466e305ecbb87580584136b28b3b8b95f573e723498e2a4b4313e0fc3754fc9b31bdbe7e1237f30aba8b6c72b66f3cd4bcbe2e01ed602c88bf20da00410fee28c37def869f5d06563cb232bd8d245f06db57deed11d1f59849f6b2ec8cb075e4b9c76c48b8ed47a1818884d306f2734aa8389c5cd28fa0dde97c13cec3c18cfad30cccb11ed9e213c79b95124ff1297b308cde9ab4ca097a0fad72e480b95d06784e572752ec1d31e0297326dad5725a8c0de32ccb4ba5d6f2af6f0e0aad26e0df52a25eb01b054c8e62e68081bb606633821f73d84c2d02df1dbbe98a22d453113448873f34e875d329e502a743acdd0e6f3f492f5874dab25d3c9a13b9237ffcaafbed1e071443c3b9eaee983586663964538018b2e12053a147584fb5fdbf5e51bea540c912f75cc332acb2884c1a3cd192b5026abe19e01724d8c9429b6450c14f4dbe59556c33d4e324345c14af86cf84c17bc26d1971752687f1f535065cdca38b7ca3a9b9ff6986b4f4335f0d1bdcaf6bba96482bb56384b727f5ea82b01ab96f86ce556012c03f06e4fac0e551a417dd43e9488869d55929df97404c29da98ac4c1d4952b0b25294a3ad89faad5438026399620ce36103497885a595b3bd4a0d526a04480dddcb233f07464ccd0b1e362a01365516deecde5ee9e28b329e2179504515b1930b6107a437a3d65a866f206708c879d88682c74b673f2f1dd99d24908c68604ffd81056a82a2b315b8abdc828a735b3e5a6e3dfe66e1917a628017a0f2856fe3002574b3c5d46d5f5b48a971a9063f1ae592d4f456f7411544c103d578b3d82be3a40c90fabead4c326b2e359ef86d07bcb7fa31ffa43b6bc96dc750aa05c4e7b3b4a4448457d806f9c8df1a5b0f53833425ae384e48bf565ebb45d119414456350dc8bf033dcc31663b2e0fdf523d8406bafa2010b2002b82823f15af74a3ad7c4c3e87fa4e03b63ba54465d5af2ee74988cbb32ee29365ff2083e21d85da37efc84024e6b51b541f8103a3f4eab92172f527d12360c74691acd3e77f1106849b51ff7f19a932900b531201875b719acc448b6b792741020ab055262581e78213a028d13c3d901123aa2c8ab098271374096ce0cd3ce108ee55f5e145c1f2a60157851359b7e5308ef576f08e3e9227233e868220ccfdf6ede96b6344f3541a141d1044791d8f08c30773a50df496cd3c4ef93e014870475091b88e36373e984e89994c5641430ba57bd7553582bc42ab21b88e179354b733c2e6ccac454b283ef2f350e02b0cd887fcb8bd9e8cdc70ccbe8024598fc03ead9a6019e866a41590211ea6a1efedbb79433e6020d83d6f690624e7ed401d6e90384a1e85d993cea9f83c199e16e462be0f383150186cb789dbe08f7999985d028b0b328708fb49bac9309f99266a1977b450abf80e5e59990f0690ebe02916cb5b2817982e40bb403afa0cba3a58f81ec7827f61484fdcf27d1169e597f2252c2188ddb984c8f4f0e8514f1fd90aff02e878401efe45b92dfb6ad4a317454776067fba0ed215a01e9238790280f33bc782272746de898dcdd85436a30814318ea9410618f35cc4877c7cad245548eee207d8225919594a024b8afba397e6d689bf4c15e87501e923e810d234799b415bc869a13fe4b1fa4deb99234ac7f561894783a90e447654df6faf1d98a9877f61a148aa1b2ba37d2624babcc86cd63497393681e70c67bcc959407ccc0600dc1f20f8770953a4f87a539206941ca30f24cb7e9d6062f8ebac08d840688818dc5ca9f98054a25af61310817e05765198eeb76e7c86487bca056f582fd1a39671f70657f1f59ba5622000e5443f6a3c442eb4315b6787451321f0e5efca5d19bdf9d0897b2e71d4c2a7095c2a13bd7591e1f55e7614d9deda69170ed7d1111f2c6216d41e8ed050bee96c7cfdac1318086c2915b955bec2821441269a2ed0cb5b114a82a416a5e61e2a3aac6a16af8a4854c242cde70c27ac553f4e939288e5e85c7a1ff319e5ad040750a69ecd917cc87418fea409359f757f46a28160fa2b457e99fdfdfa8ea7070adfac3eb5edd733c55e929ac8e364470da2ce336b8db6f55f3276d9da172c8a1f397bf59640307c2679060b7a183a6c1f4f1a5ecd19bc74c82cb7883ac9baad7a4c11cae903186766c33632bd780681f34bc6991c0233310b9e8ef70f6a946bd1186ad330b1668bebdd19cf5861fb06f4078f5fdc8df7d4893f208ed8be7a0050a5fd52f76337581ad61b9a967105e5cea8336efb52cdb3127e0d3152d4d1df52a94cf12a23076da06c5f63c9e725a5c23fdbced24fc4c8af680a56196dac59d8f2095124c0ee825b54ffc3348b5587e075a6fd6aad72b19a40aee821deb17be888fb4c0b3eedc467dc76481e01a506422bc1f2d977a98160923d3a75300934132e2184b80ba5d93b93fa5fac96db9eb4e43057bed1654203c2f3f2baf095fd335e970772e52e69418d363974d82829674ba0a3c064fa407695fcf82f1e691b6297df41d5312b8e67adbf4b2404e9b66e747cd3aa25abb9243111ee1f82fe560dbb4bbce29d9689f5f6da7e59f96dc046a7f7d85633b7210e684a767bfadc5ccd200f5649d0985229296971d5acad8fffdc2c1afe5b8627a8437e16f754dcda395d1f49ab7189988e3bd9fd26618659a50ac43b1bae60fc304e0c02ae1868cf7834bdaee9a5c7fd0cc6096eea06d17e85ec997dab35352eb77af98236451ca72018a5aab42ae11b02fe99ed0bab03222c82022e1bc0b2b0267f7572e3f8c4f6038e82642b023feafb046d7fd3c116be8fd7da587881c0ffc5ee8796613ddf4f82df91398587a629961ffd65da28963ed2eb25fe33962bb4b86b97849f434d415a21b473e6f0c9257ece9bd99ccc9cbc2c04da63a093a1cd6840617407ee5ad5a84dd4296d09ed2c52ac376e4de4303a4e3bc4aed34aa1aab836386f7a6658c3494b9f2dced9d9a96186b89c889d20a985266bb8aeed13de92a03e903cf33d54597003e49fb427172f988ce4aefff334f84f213eb76a2ca398b8c1135fa2d70f74f5e52a695f9d974c3dd69f8c473f5094dad7fc92e092cb212374182639e71cf99ad2fd4c9b97dacfe3e367ac6c5438de6169c7cd4dec5551bfb1e06be18cfa45b146b08bd3f47a6f105e54496f5301cc358aebb03d6ea5f7919a293cc41fa6c4305a75379eeee9080c2b402cfdeded5802e1c7d0e3dae484279350e1fadb6206e12b8c2be0041666ccfa3a927bc0267371cc849cacefc73b5ad89295708113ec15cf83efc0e76ee14d252ce68b2072b25b8814c2533c9b387e344dbaa3aed98fa6e886061ba3afaa42c566ea84e61d7ee0a9e1c3dc5eb74a5d818ac0356675715d48b9492ea2f7f18be5317227d7e0bd8163eb2cd7cf018379712ba3e23d47afb61c270c7c4cd25321da3669df270526dcff1a489fe1db9f313f8abf0e3dec5e7ebf5b01693499b011fa95eee93e3b471506597d4f4ff37e0d2bc9f1dcfe9b259baacc350f4d6ed4bf7b891f6d5500441bb3aa3a9fe7c8ba49faece7be1489c463664797ce8e279a4464162c22706888345828fe810774e4f6b38885810a1146e84e845bdac08a3eb5f35fb9916c73b0b1ef4e3e4f4948d3272169977558048fd795f11c6519b8b63e2d05d354d24fed29f7be3fe302cda5e24c7a52ea7d27b4f7988375d48b66d4dd0fa5da3efc27b562ac95d895ce51ffa7715566af1cd69f7336572ba4a7c5280a15f3373635aae65f5201b6b676c86dc124d85f164dc759da2d5fa4efbbbc5dd1c4f91413854a15876e3f748d2715f98068581421b25f8ae29ad78c69c4416895bdca8c46e03aca97be88e2ae480449c2640df963708162b07b6200297c07c29f051de67d817d3988db1a879ac6167ddadc78b4e61b831095e4e309a7082784d6afff3ea16ae3f35cfd7ff1288067ebfcb284b4f07c61e6feb52750c79a069a27398f4759838e6117290eb37fdce596cce00814bdf6fbdcce3af8466de3fb9da66b9d2cf9e09bc2983c0071f28ce3c67513f8ce561ac395ae40a1d7740c6545c667f94ab2301b361dd6925445b4c558d02a2b7503d6b185a5026001f7ea6fcde53a88e6f9be701b5280b5fa57a98abbc6578cbbbbfe9183ffa71d3de546698ff0a3dd8c85e19de7ec210443d5e84c0f774fb699c25ee8c20210c51c28f001037289f6d27f312f5f45fea8006b110f44c100fed60034a299e4b9b35f216d905418041a35b26140e196fd72a06c77f61cfce704164598b54f27b9959723aba4b8b2205a086141877b223f1cdbaf25f172565ff9b7cf077cad9163b10a1b68809ffa3fde074fe796546bdd39fd8138c5c8ebb503d69595cd968995113450f87beac4c6fe2b66251029a43adc74ccb5d5fe21993315e3434ed13f2d8e81ed7dd60e76fe52f347feb704f036470c720c28b965fc656808c2393c0b6a1b517977d54d17dadf34befb4fa25ea6c7cc0a12a4cc00aae7a174b443e483ea686f414049286f627a3aca5589e935fee235c3518f8f0c7c20d2319e8667dabdac051178d4a4cbfe77ae67cd2ab45aee7dd200ea90920efd30717f8bc367b01ffaa0a6bd3c0d8b8bf8550dd81ecd80ab3d1f4a248d2a527386223317471fca78cf6b619ce7e36f052882ec1dcd68b212727de8dbf39bc9c3ed0226a910bbc6ffe5097b28a229220a6382841d653707fbe69e03f6bbf280dc353d887b88a093c403629fbebf695022c720887bfa65772233ba09f782c8942a90cb1dfbd635c59390297111e4e646334a669c5e573f2d1ea120eceadc5da012b584acd9237927a702ea2f97d172d4f8fd0f900e6a1874800bed1ddfd771d644e99ee54c58c5e32b500b8787e6fde59eca28b8c114d14f834c74a1f8546fc3d3bc745ab9b423b369353d0b73a2b9c9c1ba3839b3b91a557fa7173fd8ee029698c59f0de3bfdd4fe0f70714aad4d743b6657f1ef7fe7f1e794d2b33d068a89a04d8051c858f90b14f647c5b1214e25ee8b68ebc1ca8edb6e386dd18ce9b45fae10e1111317114aebf4051acc57b53fb8812c68a8d00deb63f130f05896aaa38bbcf6f563aae9004a3eacf21874f74a4120aee8380ad2e459c28a3ada04ca520391d832e2d83e5de943b110679f3a096407dd3de0ddf802b0d98d3c1d82ddfbff4e7f3dfaf23a888e3b917ec717028395ce7372a8f05382201ba57d1fdc37126be791e2f22feb0777d4663a940561a2c457d575fa57cd5596c99abb3825d187dcc7e42cce4e7f2f644b6636cefb479f7f9012b7f0622ce5fc033c7fe846f076808a11918afb3e4355d223abb820c741f03375303b94613a16f926beb660ff832f46db3677982ac8967af136b65a8f5dad46a506485e3cf24ba69791961704161eed3413c376975940a190d2152e5b7f3cc7660bd0667adb8063a90d72da36ea8017647547bf07ae857f5b36d55e23656493ce74b4059a409a71b054a8bed97acc3966334cac1f98706240204f14b433e3d261a7b1d08a6d73309bc9fae4a3451991395ba6e565816f8ce4e752c7072d440a41fe121295398de1760865b178e10515e3cc3608139eb711df2fc9543a2287791342a4ee66ce97d4967d1b200f549fdb3a43479195541896cb4bf5aee709e8116c93d40eb0ff3b53519bdd9818bdecf69e7ce0013a4115715ea341b746a4c0260d3faedca6b0b89a3a55c7080054764d4e7147c5193e900b7400735e040c24e0f2023266b9f33d4d9d4a037b742a07ed223ff4640d512125c2484caf71e5439097ec2555377a3780e788f266d9058c33919017843aec43710e98f204fceafa42f6c1d528df1e2ce2084958060c6f078a4db164b9a4eb7c3e2ca2bb35ffdf49b0df7740f21f0c80e5ec59367c2d524524d09f32529eb4d3af8dc0f08e65b2277c3f2fabe23f3d347d8e3598a110d1c66860b2147e1e851a07270c4b052460c32cf4a3381f13e79b39ffe91962da126af94c9bff80196f0fef0a525eb4ec9f2b63b76bc2ebd3df1e4a3467fc88c12cdb62a24ff01b80eed8303564a02463c0989b52f669f70c37045823d470b8602fad1a40681e7b23effc6241df80b61be2369bf1580f260a414b5c87343b26e8c16fd510187904bf8fad3f5b1bc2ce905416e0aee0f64988f6269250882cf9dc832ef83b4cd21e035f7ed89c11d351c9a2971f5517c515e88eefa5aa76d65b90c5752550bf9bdfd0e3ba634129c3c5af487f11fcd480d82db932caf0fe43defa070a5a4a099ee2ee033054002cf5a4cfa7c97ee8eb9afddfc0dcbefe3a8f56a9ca3027669060524e79a6ba13c3eedc87cfb051346b8146fda85329ff6765a983fe848ddeae3048aa8911f322580e5a7dc36fec224d47f15a324e43fd4a091c691c28f79828c20461c14040ad48a9059305816a503f2460d49daa6f7c11696a91b2ace1fdec5ca0e4acd0c517debf1827a4a560c79d233ee01188823eb83f6e31fbf2120e805054e012fb5b9acd453c1ec3e0a9eb42c2fd3a71e37b3d6882464efbdb7dc524a99520a8b082f0924096ce3f2fc31b04de9b7ff0e70f90bc03f7adcd45c8699a91835a697edb1593aed47abe99f085a208c03472317d2f3921b3f15395a4d0f84505115284d8458b2fabc6b6a22c4922ba4be4b57eada51f1539ef76f32d5486986d5ee5372499fe3ee84d25a4da67fcf4947619af8a4e824eb2d7f01763cc4ee6b14dcf859eb8b17b232277cd1aca2254a04ab387b6444a21b185525ba0437c227c2aa91c58151d3464ebb1fb7286732a83097871899263e864512f5e3160fdd4d24953f3b69647b0bb0ca83a898c528dcf848fa870f3407c6f1c18403e3c88f5f01b6a11fff48ffd070ae8f6f3da83a0263e81f9aa5ed237299fdb88b25da48025e82bdf8f448fc4863afe0466ec59f338051a7d5712fc608551bd3f931c79d71fef5eccd39d342340c596760589504a2f8474ffb4892823dda477c2c7ef4e6523c299aeaab3577592d05553d3c444444695c807dc48f11034c13ffe32624619a780315d5488f7bf157c840cd3ec5d33f7ada477c9389bbe809e34699e44d5a4e44a41425da673dd9fb50b9381ecdcacfdeb9202de9921d4c7630e91d4baabfe60e37e8313a6c814629c76fe6523691e88d3e3f66dac7052ea55fdac1a4b27b2ef6f3b9f4b5b8757d7dc7924a5feba6ef14c228e3c31bede773c568dd7a2f97872e9699a664bf24977eff88c1ab24fbd5113733837b300693bbf7fd70778037da1c6d54fe90cc5c223272965984069fe5535aab49723ef25316f56b2b577e3de54a2b526c2f91d85bfaeda5cbcbef2aa5ce887bf2b7aea7bb0148922c27b9674e015c6c270de49efc1b3ba8d98fbe81b6e81e67d93dadc76db8bff131ff5118d5cb5fcc46476d2fb76deb71373bbfeb46b40d712eb9d0d8f60ff9b1c42a0a51f1a9cdbb17fbfd42ec42edc267c906e055fff0cbb4bb18e5d1f81ee338d3f4e7a1d806e2a061fe75d94fba8feb2fdb3ea4c52105a5683cc331fe57af9cec45469960a49561e662988d8e9a636818e39c6aa8cf3d03483ffafed6ba5652259d6a7079ee8bc0fce874aac1e5b9e781f9d1f3fdb970dbece95443e9b9e789f9d1dbc02b2641949efb20627ed45c90530da577f922257bdabe74d28ac4d8d3668b909494eabf3c4ffd17eb43457b1f97afaf591e5289b91d262ed6870a8fcb97de06ae2fcf3e80eb5dbef4fe3563b8d8afdf6342e8676fe4eb217e3d3414961196e632073d7a7818bd26f486a2853806b7213dbfce0c6e537a664e7d8c35f22fcf8d9cd47594daf5144a6bcdf8923aee8ede2c7bbea2b615292addec575df8650d5cc76dfae9477b3ad5b03df745467f03b3ff6e341eb7f93ed3b4ec6f80c0cfe93182047e0faeba2114037c1d0dcb201c753f2bee7f5640dc8395079eed39bbd9c02b1db8d91c1f007c5e610e2d1595dda3d67fba64cca5131a1fa065646ea497c43ecbaeebea2e4a4d1ea40db1c3184e5b2adbf90c2fef27949ea394de5c8a7d89d48d3a4dcbb22cf34dcbbe3b2dc3fec22c4b8f269899f9e740154a6b894f4eea4e3e7a9ed1e85fac0fcc8fdee7e549ffb3d26a77f25277727f97fa31d607e6ebfbbc7ce98847edec8e1849a24e08388126a1ee94591e785e1ee679b081573cd8007f87ec6de095cbc3581f9f9f950e1456cd66f918cb2b98b7a71d983f65d6065ec1d8d4cac57ed7e7c08924759dbe5f3ebdd4f1aa76bc2219711b6ae3cf41c85e45738a452a85d16b4af786c20a2b806c5a86d16b426f247c8c1bcbc8fc78771037373032333d6a6a328c5e53baf715db651b8625faa70ca334cba80ccc81af33037c1ef833f0bd0ca3b445c506ee132efccdaf0c5719d79ff20cd72c62422b92a71d86fea477f9d38ecb9f6ce855e94f455625fb3fab51fd6a3fd2e8e75e2fb3a4d27f7e8c310c7b86b0ca0863f04415517c981bcb9847be6919f642ae2d5bb6b461c31f39055c9ba9d248230e3448c37d1b3532a1c243df1d601bac2bf935eea8fd66bebfac0bed3c11f981757ba0173e7f462e7cc242725e14cb8000c9b0ebc7bdc1000244757343afd93df03c39af99197a4d197fdc3b8ad643d492c633d767d9c32c756fe0f82ccb328f8bd13c26bdc6dce8bb23d92fb5731996f83f6ff4fdf57af8a774a07f8fc949cdcda8f99db94392bab687a8eb2b0ba1761bb98ca2d55c9e7fa9a82a7bff1e32c398dd8b3fc81fe87dc557493f320e7c5a03d9356b3e1b172e818728855dfd7ab8d1e7c69883da3f82bf74bbaedf5ca575596cfb23a8d35205f81a1ae754524ba7bb41a51fd4b1419dc1a57db40f7f26ea217aa21d9d19dca6a18ef6e1ef704bce0d4ced238afafdf7a0dec0f3c1ee3bbb8da8c76d3ec67283c9543dc6de41c9ad37c4a836fe31b84d9b4c2c1d45d4af9a58cbb2c630da5996cdcf4e32649f39d76599f6cc651af69d61df18f69de6f33dc1e73bbf7f7e6f9bd6652719605b1ffc9da35b859164c4fe90c48e59ea4efba56e64c991be1b6354fc517c2ec6974c13396b993ac22b47fa909b3b8e2285a8332ea4d18778e10ffe23bd8928d643ac228a262e57a106d1355dae420da1abcd8d8aad52b799736a327e47db9f034f50a532cb94aa3019a6653d1cd146a4116544ac1e5f613a355373a660ed69222d510888a2101951374ac9d0b40c4208bfd4d58e348241240bf58854fffa7e97eeeb9503b9209ac6715cf771cc6d9ab669ad75d3ab75f7f5fb302f0e3ecc8bc3f51a65ce24e3dee6d20b8eefdb2503b45f920b3fd2adc298e6d53db7e95cbfd60da7c5410608c60584fa994c8f6ddd551847f56bf412aa9af6d95fdda7b19643ea6acfdca5659ed1ab65dd977d0ea98b437c987539a4e86557517825a8661442088f5c11218cdf18c42086c53859e8daaea750c5fdf526a822fd75913a18ca6d5e8d4bd858857d9c5807e328f818db4a837a59ca2b2c5169d462a4f3e1351f9e88f80cfca2664f214c72a1fde80ce0d7f06f866118b6759122b9f39b5252f4895009245ae7cba9e5f2155f984194032713b58c101a11bdce06f5bbb9fe566aaabbbb7b8ada2374990bf2566ebc1ed7ad855951112c9229698b8c7c84ddd9a0fa5ba9fe1f17b5cdf7503c0f591f640955a1d5242474bf2b0b64614ea06ab2202a42b9110b9a72b5645e7c980b6efcefcab2a36981a80883fa4d4dcb8d3f599355194ed68dbf234ac52edfc089d01d627141f108dd3ca8a87ff9d2c0f7cfcb57d608e2c6e7314585cf438a28acd13dd078e693555a1746eea018d48f85fa892a04b1b4206c412bb55fc0838aca97af44410dac9abcd48dac0285a75c58c19310b0d0a47a603e6149994058e124f017ac2c454d60c284279a587914ae7f8de222faa9824514222d2d289cb8c2440635c0019117b3ce14c040e3410aaa002209fa53646967a235c512ba5e6e4d31c6c52eb7a638632ee1964401cae2074638e2889567e00b368a5a555650831c1011456bb68c52469413aabcdc12a2410b51849c702688105b422a9861e880460f5cc084222ba2285d6e0941112a020241ce979fb4d5e553f9358b269c70a5fc198f16492a09130d88e81a0c31c485156674b9e58328acc009723425891478a1c5d009b24c2088b450e2074b10f14bb2c052ad27435c78b9f5a404330373085f620330890c942e7c53ca035888f0f324063e40620c278e085263b25670834b0bf9de9c5860190209126230c61a5b8c20011663e0e00acb77b0022e8eb82e27818b9607d0b8dae5561223b8dfa7a4179ab713ef543a33ec2469263ced7ce3369f0a08dc72bf4dc53852de7a250a625c1cb77a97ddee76e8eb4c033f36a1ea406666da1d8bb40bcb5ef38dcab95ddedc15aa5cb4bf6ee6d2c138ea9ad736394d9bdc77525cdea53341d4f59adc3431aa76dd8cb445bddc26fbeb395bddbbae87a155e15ff1da6a37ca344d7bcda52bfda8ab245bca3ea3ddd7d787783f1dae666d0ff1cacf58e8d22b73c9a28114d757dcc69d57d362db42125d8fb7ba0d13d10008d7b3d0d80b26975b5d10e072ab0b2b3709f44117f785cb2d1f44b9def6d98cc63b2e8344bd5e931886595ae5c605e1614acba8f32737445eec35312a256dc184228e0b82618df110ef11243dbc9ef934db360c8b379bd0b351f6b48cfad55c49ad8431044693fbe3728b4807d7c3b2e36661e53211164358586935717d5c6ef580755b5f64b9dcd222a8a585932bc513222b54b4b0b4a6bc6cda18350ca1fbc2e556184eee4d182c30b4c46ced3736a216308a89a2a0445554a22b626eefb8deed002304444caec96db8d583347a6006902cba3352ccffa2890b80cbad2f987891c665e172cb0b2d2ebb4d0a5b771fc52e04eec428655a7344cd6e6efa0271ef86c76fb0ed65b820482ec65650d3e5bacb7a7c3b172b3d89e3b867ae318c7bf7b8cff127759fcc2565309051b1efdf3ccfbd1e34602f93511257847d003e54faa998d83d17b82018666a1c9c69078b5aff8b97f437489f034725faa4cced4d7f4f8f7b2cc3dd998c2646cd300c4686de7284edb84d66638744cd7ec4da9e3ef6c17041280b580f0cc7eef180e168c85e875b3d381a6e68b820a4ef3b391ab2b7372f7041483fbb9fcb6e43b296723464efbd4cfb7976db60ed788897c3be2dcf65a6c1be2fb533f0509da7dcc51e062c286b815ddc90ecdb520cc37e623c37dc10eceed434e99e59f36c2b526e3c2da37e3757cec76c534a7fa326f784f808a1769895916f4fa0d27bfd8672f98bcb2d2eaab804b8182764be96795e4d0dd6a3e6eb713d0ec37e731b18c69118751bd2f76f15a62717a473903ad2b7979e392f35fd18a71f439b922aa97e8d89e962ca9db9dce24204976296ed377aca29a0ca50a737eb4edcf315261405d1ec4906ece963f6c4bd3d8d9eef0e90f41a471fa3db69f4a3cf3a24a30eb39799863ed67d29ecfb3199d49d76c6bd1bdde584c56245b1cababe64308acda069d42dd63031f9268ce2abc3c51346f1fd523a5c848069f83601aed61aa715f5b071d7a02f5fab8fd9cfbb18d0165d5c9acbad212d9752a1e532110d9e98d6b032a58563ebcea75926c72c05d2217194fcee8eb8279f0764c02b81189151b8f275a070bfed7e3c04733f1ef28e6ef176908cfe00714fbee7d5d4f4a87949d57817e769cdcdefb6c0b443e2cdecc634da0f89b7ed28fbfeaf9b1bb245f7346d76231b8d44b20f8485961c0dfdec5e4c74d3cc8ccc0ccccf984c2d34c60d696cbbb98921062031b8e4c47013b99b1e82ddccc29045fd642ec66dabca588692b80db786547025bf9becf4e830ce842ac85e3ee16adaa6a3c3c3f333f04851fb4bcfdc901dcbe39eff484ec7bdc805e9b1359765432c3704dee6283b8e4c4c83bd10ee694cf7c120e9993d86eddcfee6b9d9f76b5927432404e532d11466dc7a99688a1f5cc62244e6621b0c523037a4da9feb0f611827db8128f9dd3b5095044ec93458866118cfed1bae7342faa74c872475373bd37ddb4bf7f5f880dcbc97bac9d1d951f18ab254cc758ee55e8d769ecb9739a2cadcdeb62d320efb371df9b8a75ddb75514a63865858a8c609d13ef3ba947bf27574a0b6b4a9aede6064324ee9fd4d2c73b7d7816930f5291629a5305968a42f94d2178a75497cba6b56a963a6d9dc2ba27e48646ea5dab6e1c802d4dcce713a9c2c09e2b849c905e976db4cdc93929503ca57596e531b4afb111d90b88d3b71c20549c283ea0f01b7d97a6e30e2dbb68dbe63b8197e6ee7b8cde8e5c7e03693dbb01386b59452a68a6c6580e8ca211fb7e116104eae7c20a8dcaf9bf8fac9958fb5c7dbf2c1930bc3e5561845578b1c91fad4a9b3cbb847b226a6c9b2ecb70e89877141bacb76ae7fc605f1a75dbc3cd63b24a9cb29ba318e0fc72a258c922fdb7e321c1723ff8b49e29efcce89ea2f547207cc40cb1642b707781b0890107045a5b2986480b52a314e015a6700310d544df93e3ff0184e3061ade2fbfc302d15f83e3fec006a22c54a5a2afe3f9c90e0240aab68a9f4ff00bba7bbbbbb9bbb25d3305b33d0284263e85ebe8246153097afa041e52a216a30714a64326e702ff6304dfc1e8269e23ccd06729b18372b56b86a004f3aca57a144acb287b8f163931bb5dc6fbb3d04e3cc797ba02ad54050c580f9f282ed610c685517d1a8f8b451f1dbfbacd5a1c3e57e0de4d240d9fd98a853b8299864ab6a1c151f4866858b8a1df5e9b86dc3eed9fbd11437451d5a82151d2c97c8029b3aba74a3971df71adc5c84b809aabc99fe3143fb881fdd541fa6bc51c9ce10493656fbf9e5712fba1ced304d7c6e8afaf2a4d7a24296444a4d6a924f44462f474f6464a52881f997973d2fef43455a986abfd14bfb1d692ec8e8e50b67bf929c82c0ca932f6af6f1055a7c0d08e3909e5f875f98e8729c139e7bf0fb53504260c6174330e2076aace07f12f5a331a298c62f147d9900d195f642dcaca85ccfa50845bdfea3345c598681a88078afeb3dcb32bfae8797e501cbb21f825c9d0f7e31c62c8c9b7b1d8ca3b668cd6235fb88b3df79c8fc877b79f7d34b86a88078331ffc660c337b2f8e645cc805d9a1b708f99f7b7549ee9675356754aa79ffdcee7a80dde44b72e35f5434fefe1d30a8dcddcfedab76221dff41a02a56b447f85b33619c7e93cc9bd6e034cc30fda076c15ad498f821c0aa9fe123ee39048c98a0f6efc06afc68e0be76b5fbe8b23a308d3c03890b8d647152effc9ca2a09f73e67c966b8822212834212673ce391909ac1b4ca9c22ac210583810ac882d253cb04407a49452b2e042621221a594920821823099fc1586c604a65d6e2da16289152d084153de4c1ce932839bab73d30e4302872e5fc07ae372134b5b7ad069b55a2d1aa79cf26504f5e316141d776fb54c5e8eec3c881a39a1b5d3cbe436476f416186f0d84eafe8b4af1ea259d0dec1851f04a1402743bd03cd6196805e58e1f5c743bd1399a81f0f0545c9d181aaeb31acbbb9baa11eeaa1dee954efd01d541fdf990981cc936ec26468c883a8388b70b0019310a310810842601d6c00160d018628832068af92f04fd22ff767ff588beb115a71dd9db280b852807e35ad8ca3dcb4c5c4ee43d0428b085fe8dbbf75ed4c4878c1002ffc0a9a8fb84b957697339c5e466e1eb033840bffc3b94270e749c5d2156239c2de11a8a233720eaa2a1ed94280050b96200e64a1290e409287c1e9bb3c2149bbcb091c1a01bd2f6aa47fb4b310ee13d158a224d1f2b11653d5125f9878423e8d523fd6f24510be0c909a9afbb1961b8ce4403a618cd02e1731b61e333230148608cce5089cc9d832f68b0e3e2ebaf0a111f814c6ce2463cbd84d90b15fa8162ddc6be92088824f9b35a596244ed4efdf29a5f0af7f9d2450e55df65dac549ac4b3e2a5303d519bd0a2458b162d579a802549171742f8b109beac8d10cd43a935fd27a07f6054a856415a523fd306eaaa53b7673810b921f4d239a590decd795d7f79b2ebe109cd34a99fc908f5335d77db6148d4bf9f77eb90c4620713a66a6194f34a82d218e5bc28966914ab584629866159a66d1bc78d46a49ac154227db58d1bf568b4916238eeb71189546ba9e4e2f2f2020313c3059111a2a670828a0387c9044d2693a9965c60626e4478c36fdce81ba5928bcbcb0b0c4ccc8d1b26538e6b4aea5293ea1b3f986e4c381c070c4c4ccc8d1b3870984c3972e8d0b163c78d1c384c394c39749cfa9443c74966470a9d5d6106002cb4e0a15ce0d1a3c7d643cbb01e3d7a6c3aea0623733ac9ec484185ffaeb3768515666600c0020b2db4e07928940b2ef020f1e0c163c483070f1e3c78c8ec4861c78e1454f8ef3a0bbdad9d2315989dd9f9bfeb989979054e86a8020b2d78330480112c1851ddb6d082e7a1502ef0e841e303a3970f1f53fa88d07db40f1f3e5868c1f35028175c7081078f1eb2478f165af03c940b3c7ad0a0e49cd2615c30419927d5ad0b1c91be3d54b0525fa83406a18931c2b8bd20534475eb23150001c0d030d0d0d0f464a1a57604d0c44e53ea2f4e48b576f0f3217c1d05b043085d4c103d14fbb8ac89c7b46cda0183eaf282faf1d0ced0d0d05016cda1472882ee7403bc4cd47ccf347acdb75150cc8d989f4153b02a49146c23ffc6cbcf1903f3da283ee98b8c1e3e09be125237e1dec9dfad40d4dcf120889a2e7467cfefc4a8cdf1475f04fe8b55427af823ab840a0fc9d257c2308524ea07d52fbd074155a985588539d1f532ae1a9182b05041198c93cd3bdfb340d5280860f0c0abf028a8b7c0b55c9aa983e3a70e5425390255386c433171769b1ed3311c754d0451f349dd7cd9589ce5ded472a73371d4f4a02677ce6c0605050505ddb933fa2015044d79a9228a4934499fe32f5d5771b1429a329af34b9dd441fd3cc8a3b8cd97bae236e1361f5fa9122528ca6a742364481097c6c3863e83e80d44314ae97f24034c21dcdda1b7684d027ff83b3d146015cc04d826fe02d440b1d70fb91a78355f8b3fa80b80377e0ff6a633b88ce8232957bcaccfcfea212a7632399dcc41a5514606be3ff48f1f87a40fe66b0f5f4a7dcd1d0c5631f7847f869771e79c139226e9739c3422b19063c1e17090a036fc18db4ec76243afea9b60ec72523b5055faf93f02aa71554f9973d6e0ab6a5b0b44cdce594f1c08aabcca8c325f9b92cd06a276e55560155877ea8477be5b619c22a88a6fe241c5825671a7c6927d24a53404898afcacba055156b8379f347fd4cd975bd4cfabdc6e5d2b6ef3e1b8f3e7d756dcf9f3bd8a3fb7c324cec7c13393bad684c65544612da6ba4d216610f793b935f08a096ac70b2adff95feac6eb239f986f7c24442e50a2b8aa003db46125b2da38c2fdda89e6644b116df3c16c3d4666701b6825063789fbc9780aaa4ca6f89aa9b6a03244c123d0623fffea4e6e79307bf213cff51462d863cf2b2a4fa8ee04edce1188e215c686ecc4a81db12098213333d727b5bb9b075a4e0c53d2bf28d54107a8468d393ab80d5f2918041c85d99c2c4e90a81bbdd839295e161887e03e10830b4c8c1f18218740c500aa720835a057d890c17db97c850d297774f90a1b4a18418b9bec4c321d17449d7115fd7adcf8f165fe8377dac89e64f624c3bb83cf9d94ba0d845235339e4926422168d7f5542c503108e96bbfbd4eab590db400d6d095fa555335fdbbfdbc5a83c6f0bb9b7b98377b0cc3be31cf7e0713f54b5d8ca35c71ef9cf5f961c57d8e675d0f06395035ceea78a0726bda689d00d1d9d318994da5eb73520b600da5628c99fde0cbd3c8fa6ccdd1906d4fe9e8475d6454fc4c067a3f9f9b3d5b0fc69a5e4a0b0002e6e3a108bbcc651513ae818529a7f90f4fcb8fefe3a7d89dda9e6a80ef5f24beb44aac1225fed002271afa29e9a1dd81a8f927cdbb93664f0c900f5fd3ac0f0bfe0ff195a4a43d69f37f569b3d6996071ef9dbfc9fd5cf8acad0cb27fd977a5e916c0e0e2719fae989483ffdb6bc92160d2a27227de9f7a5f644447bfad4e2405fb35709159ef8a45772d2de2a89f674fd4923d9d365315b44c6f7374285f6c045d7536b011f08e143fbc3e8e147ab0344cd6738e1977d0ff05e492ef673aa21f28c3ebeb4cd8a3edba44ada096cdb411035e7d7a021834ef4e5a9066a79e49f78e25fb6ab448e75bf168aa27e9095e33a6a8450b975f97e70680a54f52a0668c40e75997250bfd8795abc15523cb1c216bb16b819cc6cb16301005bec00a095a07e94852d7633a4245ad862b74266a57e3176b6f542282b958b6e527f1b680713ea4763a782f6248a4381414d1cd58437c1638bdd8e2b3b29177d618b9d8c1604510d3482fa511f5bec4edd35907b4fdc6b92da62a7e3ceae9d74fdc45103a0976d2088f214aeb4295cc805811c6f95d413d032cd4308614321681042c834d43d18a78410324fe9ef90f414fecd5950598a00ca08a10cf54233cac0fae95fe1cd1ea39cd7d636878e085c18c39ecc21810bbf3df93206870bbf2b506fec16a31c07cc3108eb978fd3598860ea7672351216da404848a1ad0d40b91f674983d7b8bddd0b060927eef5f17a0ac4bd9c105da6a93a228b4d76a3e988a10bb3d48f7d84509531704be2800563a8e1a40652ca78c14a422c57c600ca957fd9082f74d03ae204373ebd62239ab1e2c65cf9b4827165cb881604910f85145bdbcc98429314dcf8728bfad53bd345577e943b50a144171f8001129240c51cc2054f5c90c78d50dc184d26d642064a6c37625f98da848171c42cc2093542965611683c2122cb101ae04887208a39d064060d40d1c0086628424803538c98818829401b116f6ad305e594725e39c38b39e7dc1202477114da84a3e496275cba90e58c222967248104356bc2fd6a3555982b50d0407d31a668c1779b1391f9e3c49dcf949a482e9f753a5c10051fcb16edf7e180848beecbe700affc972e076c2bba97d5b1a4c2fbc5e81c14a8327dcc8dff2a0e1badd501deecbf1b1c94dea875c441b9f061daa81f5774e18f9ec3c238d9c3e7cc701b9787cf157164b88d6ba5aebe465f7244b08ff2230dd84986f8d8c7c7e1e5a37cb12719220ef24b2f5febad748a5648e9e5cba7f44b5db51f0feea8e3a12f673fbad9af9ab6a2cb5a6f10420cc67252380a72562e8c10890a3f76f386b6606e6ae5b2501ac08c4a9d97e7cb37995e4e8c820f63fc669c1e1a4aa9fe1fe58860d76d756bea72300d7cd9e948d598dca66e9c05f5fbd44d0e8cd2f6d0d9f5cf201bb186eec052fd53eeeeee5f5cf525821604868a6a6aa3eae0bfa30815a3d79411fa476b819fab83ef284265efafd4abc0a1bf01f601ff45d32e3f64557740882ea264546a5ffe6b630cbb54aa948c6114fc43328e0a17c20ba1055282cbead800023f16b2018a0f3fe38244185a2be300c13832e3867037da8c4a85973929d9cbeb7229d910fa57f7f98df2e3d55bb48b034c03bfb92119957a5d08c4ae99465a23eec5ef537c5e65ef2ca86e84280650b2930cf179e2cf3dfd4cc3256a0ee318b98171e2c36f00ff507259f500154ca6528961b43e4c036b9ca480b88d3b61038cbae3dfe3957d270b1620687606b59f4f1e1f5a254a564aa215b2e255bf9351bb655ba8e3a2b2ad1d79a87340c6500ef291c02d5baeb4523cb2582b0821dcb265e55bb6a8608d1ca4c86732ae14fe359aebe118e0459ac96032c84083e4af792785452507ffa692833fbb3d11e9ebfdec3fdd16883aa51b5f23c9e719165c22e5b4532d7d7ada81d60451713eb5a79db9a24fbf57d4e12ba1d683a808df2f7b0351d1e1f717f16739e40eab10c10c6a53aa5258f2990196158b48cb8af6546415fbfbfbe10f90f084751b0a1ad30cd1a8db44d88d80160eb2dc1c97afb0c1ba4360528426975b4320e372d1e5161945b74504a13b4b77be469acf3ebda2fed12dad19a36234da229ee7d8bb5dd2abeca36522c40156d803f52a7b13f6d967ba41035a1d889ad9d78c7105d9a11f29fc48bf5f89126a7b6ac66022fafe45a875ab258916fad7f350eb4385c7bfffb2ed478022d03750901decb52c5a9f5e65dc8e0645a3cfd9688b5809a201f58abe6619a278a0f56122c40156f4817a757db44b7a757d0d1995fef5f1a137478fa31ddabbd5a27fd9d30eed55967daf32eb43c5065e3151424549665b6360581a0b44c167ff22bd62615da06e50e7e5161144440c0115911842689d9999bd2111124a184550462a0b8d67be54b4ff10de80c6348a20d283a296106d04418408c804d41aa24882c0d426178470c6d0d51982e8679ec0c48d975b432cb9dfa7588fb385c6333836f84acbae8ecbb0e6d0f12e36bbbd020f6a578710be91d9f5ecb8c745468ada4a670f59da9caf75bde209ffe32e43adf3558a21b7a062d6870a8ff6d9fb68f2a177d2c8e415e43c2baa7dbfd8d14752b677ae48af36ebf3c34ab3b36b2b3d05a2e0639d110aa9b568d4af592c0a37eb2c6d0438b6ff622ebffc41ff9b5c4b9bbd69cde2308dffe7c275fe991856997ef20fb9b10d86b33d7f896db4cc740056298027c09effd55120870ab00f7f78861ad79f70dbfb180ad75f07721bd75b88eb708b3567d4ecd93d6e48f6dab5c50ede03f00eaeeb34ca3921432e4ec80e8d456e988d8614512087f6e17f791a5a9e70fd75988debef5bb2e06b00ce0895c2fdeca400d115f7b2930254571ceb466b290bea47a9e6970d349ee12e8fa3e27677e20a4854f8adc58f85e4e7b88c3d76c73d2e6af721349ef99ca734b3ec295da59b7094f7138ef215a8807d785b7fbe5c109bebdbe569e116f5f3a12952aef721efc26da277e143dd41f01f541e5a87fee14a149181eebef19477468eb837c56de077fcfe243a40d5cc525d4d5a0a520a1da6aab8d7c409fecf8516f62a767de7f714f7fa79056d80ab695700aa2d5d8ad1ec2b01b48a95c8821b072251e5f54fa42083fab5909523f0fd752000a7e00d3318eef90d91bed31eb9611a2f2280d70057974d419415586ab75a0868470e2a7f771087304608234c615829478e48c1a85f4f99d21e1dbe13582ea0ae7b8eeb5fe93a659c78994bdcd59c91011e3a08104ce3ef4c7383f3fd9b4c371815f5bbbb3bfe8fec2b0dcd538c43baf33dc639ed29cae799ab537c25d7f34b5b43ff7c1e2554a2e5e1bf5e49ffbc94cc1d58d47e36991c06acb5e646a0ea9a454a8c1cb9809309b08a7610377e43a14d8b2660e4889306e2099742f1208a7d84d11c88da99445ad48f8b8cb8cd478f40c06dba280235bfe61bc7385ff64def97fd67d967178bf1bd0dc6a4c5987dcc3629a1d45ed3ec69085fcdd69c51a9f63f37a319ed7a80f7b25d8415282cb8b204145ba4b18a9e8a25d0e0ddfa87774b54e9efb90725848e43fc1901bca07aeec1a4b5a834ae9574410c15d1000000004314000020100a86c421b1602c1e95cbc2de0114000a8ba0447e529849a32008529842c610600c2080803100032033325b05e52e2b6ac05478bf273b1cc876a547901d81ba146452eef7bc0a948c6ed2dea62f4c9784d52eed030910924114fa59e0de1db03f7be46813a14b0483308478a33da0abdd88f57483bd0929767d894aa9d6a74997a1d1efdf20adb8322ff4b9f2db32957ea26f2727881446ec4a0366981f409e52a16cba27c834a97f45c2e8d2266ddfe35961756aafff73427e714d0be498bc34156c2712b34a8c19376272f61ccbb04846d1069abe353cffe41950d37bd97b971f906e73df893077e4af3278a08a15d69543ee8a40d25557e39c1447ae6f27d6fa8623ded381c5db8e2645ed5362123465a0da19a66d735cd0901b33250d21d3a40c601e869e3a9b7e400274800cf624a71aa248b5af2ddda3104e8262d332a7d4534f1d695510b5435dfecd623eec499ca60a19a64b673854e7e8b8351a8c1ecb49f3ec57b9cfcf6218b3142dc652067ee3018ee3f99e4bef8a6bd3149fd698085d9b26191563177429c4204ba735ae485996d66c534f02d8bea5a5f99ebf4df263bed1a7ea3db6ddcb779e5035886f68f9ad01e7e6a411591c11a285e9d386e9b95fe3849b3b131296689b60c7047fd6af67300e35afd4afdc8b1af0cc57d479aaa5bcc3b0495a6ebb1a4dee9fbba915a5e6b9a7b7a83e7ca942115f6a4c7636452c6cce9b2d3121d0873852869c1acea97138132297234ad9f71a7036ed93dce4a3d06876107bdddea8a2497b7a103032e60360b535ed44e2f434a3f286c8db3040a7724415e7855431fd9d2550691537de0b6b9ac00cf6060fe1dd1914837aff900d09e14cbf9b34ce17ad80f44f4cc1c7bfecd97eb4ccf1e734863287b6749e0a597b3217d375eea163f35075453223b0ad0463ef194305c5e3ae9d5d9bfb431a0b34fc277c567413af7ad0516f20f7526b81b41c14f0285746e9244f91818bdf417f1fd299aaa46dce45ec861de8b6ecc22c1f9bb604676a3429910131b10bb7fb15b3b27f806bcdd4dc9918ab7e5c3bcc653d35625686ca8a00dae6407f0e3abf8444079703b0dc69b0aebec2138ed0e46f218f23ed8fe9337ccc1d3174d3f22d25120b373ebfb55aaa7927d9e457a984be67937bd4400b158c16a7582a3285187737220644d1674744542e2491a3f12e3e2c208b0c3e6a31cdfdb8db67d6d421b0db3c3561a3deaa9b3300382a6375739025324c9f99e14007fa8255f8a775a6cd7b7ba1ed1430fd3e025ffae9914960d95dc21732ccbe6af91a7d969d7422103823d92b876a54989366723d29155b1b652a4d0713868417e99da2230a84b62b9ffa95df646bf920c6f5a5a209df264518f62e82fd04b877ec21c699d05a8fedd529a529a45777e211905de71d67dad532308ec29c450f9704cfef7205cc1d5b01fabdb8235f93c6b229c1b0ecd0316a9a37c2b468962deb93a00266bd779b973fb622e9455b014f10e126fde906222f62ed50787f916944f8b3c326ebb16f97c21ef00c3a881b683c196137cd1dd2181a9b61d00cade4d67256ab6c36811520dc8e8f598eac6b96bfa24807d0a526715456ad9dd5392e45d278fa52db44729ca53d27f8c746fdd628e7680b1ac639c0b4479ea1832dddffe9310f7cafcde26b1ce83ac0aba9fefde4f20bdd4a697e5ad76b4658292129e9aa3cf3a3c5e64808cd35d65d1ff1831043dfbf4e30da8f62e853e320e2ebaf6b4074bdadb306c5de1c6450baf472f59d1f579acf9cb60c940737e52f9529d9d54980e634f15b3732c56dc00204014a399d294e26a748e514f939650c25c9e4833f71bd3294c0602053a530d90abefd540f85f5e707211f476e865f51315c05ff6706376ac6b493cfbca1cd613bb8704c1c043003fc100f0b0c98d6ebde89a300ac9ff3cb4d9e179da4e307e3564725bfa5470c94d164049b5828ff385689b94f3f892c0f8a4de70594968634ea62f95b603392e10f934458131cc2829fb71b91d5ab7cc5ba8fdb090bcd6462d6d6b7112c209022d00c703b61ca3f70769d25dd7ec93c91aa1a3aa08b1fc2618dcf4bfcc7614dd6968549b6da939444e589d17260dca0d9defb984bd573771752bbdcbdeb245fa129d25aabf4e755a6d2ffe4a6070ead45120df5eb2ecee3b1116a37fd61d0bde355392efaed4f917cc8029f80aca4a44bab6f04824e7de31648a6a7f1bf33665d0fc8547a8d0cd6d5ce61e82974da717122f615cef89cda9cd04100a3f4fa2fc88e870b2d10d7a4ae535e15adaf48b6941a754789547fa6a793c16fcf49acc54866c396dd637c756f06d458caaf97b08192b89a957564ace6fff982c7a17a2e31c0e4393eaa2db87b007be308595948fcc286d4990731ef073d9cb7a3785dc08ee79f883b352a2f98d000978449cf4f78fd59966e09315f00af3fc7f9b408bbfd74fc03ae091c8e1ac83859f9efa1d1f78f1e10db9accba489de6a94231165a627439d5e81455eb98cfd404f86fe605e103c650133029087cbd2aef653dce4d82f41264787f5bc94d02006231e10dfb31802e9d52fb3d96277c0add8219480b9ec5f6b7a21d674f51b46d88d0354a802d758d6d430bdc4d9050da6b49b7f4b30ac0b552c13985651d3339aa0c309281050b4ac8cfea394236cc0da609e7e904b2159195e69959fe560b265d7682d212ed3065409136028c1381a0a6296e0b1c7c812f55d46b07b0fea6a3c346c3c451c03b24b260f8fef63aa97325c0246fd5ef1209533ef63d32cfcb5606d063cbed33632929786041d91eb23c1b6ce4f8538f013c0cd045ac3a21e793ff965ec171bd0a0537e42b9642b34c221238dac2a9bb72073ef45cf5f82a757abd14608ea9922b491ad78ba3bb9fc7405c6077e5c40193d65d9d5ff7e750ee19d2e361655c4e5dcdc4e5f09357e400891556e5ecb61c11823acb329a7ae7e864e5c6c8c23d75f74b9b5ab47844fd31d2aa0307b2dbee95a1d4c53cd2df7de0159c3283ed866c9232018ee686577dd0adadac3724742074a9a5f37a41fab171400a989cfd0c878270414f62927f78d20875e2028ce5acd0a66db899a666ba5aa361de96b9da3f26c5baa4cecb276a4e5b79978f005b3c25b44f3cb2edaca9b53fb08fc9e1084eab2d037ceca42956fec090a18a154383bed00d6a7d03ccde11317107e09c2351e99af5eea103af304365ec0f94b65a30f7d228c5bf72a36afd4c24c1efc99419f3a0c0fe5db33dd2358f60f78a87c52402324e1dac9722d94b5dc62f7543d5a09e03dc74cb3ddabe0228c297a720f54a740a663202a68d0e04d1367602598a391c92ff047c8d34f4446f95dc3bb60e0e5b86a49ce615ff5df72bb576a04f11d13b706aac6f23f4c81e540d31e5c0cbed861ed42e1b2a948a2111fe46a8535d1f168f9de235ca0c1807d8cc2dd870b0705520a0fc511a2fe5d442972e5d88a1ff98e7965ac31ca22d3ad1ab59b99b12703389017d6c1ccfe2df1abfa3da2c94e9e106b9bd9b64d112e9a703b389c8b3c9170ffd7ba022d5255ba58b040b37b066a79a934e97b8c14e99cc02c64d5de8051d715edc14114f4821039c4a7103750fab7d994471a32b9934018ed0c73b1637cbdbfa5ac8276e26179f5a8826018534ef1b93aaf04b00ea485c9d93accbeb24b6854fa6703077bfafdc655c67cc7565c94a39ce94922c5d64e5ba933bbdc1727df3818fda7d1cca32445f04abcf1be64a10f3d70a47026c02201fa35cec8c5692b88ea2ebcb178a51568d406e51b3a418c592a246fad460028ac0519be451405a592bdd065125d37818f459c1679adefb20963759cda88b6f52afdc628c9f1bdda3471d5b02344d492da4a48a83befa10ef1b8944782701b3c16360662ebbdaa6564130847ac848941251c5b41301c42a43d12e0c6f3defb328aaf8287fc051846758c866c5420f50325ce3a81b8c038780f6f81f11b83250b1ed750f0d2732f332abab1f854f780c34ec4af3db42b048ad3377828785e680d43e4da611d579e97de4b8b2c7c7f8e4caefea89e321b5fe868c617e68dc3ad178bacdac9c04a71a9f4f6e0005d1755752d04bb84a239b5ff2cd50865596899ca1cf3e5fe2238ad0d87e60f9316e150c8d873b08f7a08cc86576b2c79d5acc09b8adb4009c6528a54041815ad12a0042d1a7f5e3dda474554576152339e9ad1faf866494b9dadb37ced17c7c4d0ed7c8ada71d3202246697637015ce7c71d3bd6f1325abf119eaf2fef79e2c15c9fa7325a1a638fbd5028136684fc7e76092aa31c3f3550255fc22c9f1c89817236b743bfb573262098a462b22a4596de23e096f79956d744e9026aecdd18fe05af37ca753c6136534ab3de739f19054798923a4bedc1984f5e92e18a090ade04e7c8e8d41171e32d38e41514000bf47d3b57a52a07405eda8a9ae0bb5f2f329467fb89c10164176e2df92ac84c578c384f9bed282e0b07e3e5a46505e2d0f8e6ef0afda3d054e7e86908b1be913253285f1115b4e9931aa0f7c11823936d2cac2d05857e0b4bc0f558f2523a93f02dca963fb21a3eac080c54cda404946b72f727cc8fc6990d624b86f2d92ebc50d73eff95e6f3d6b9774a943e9c42f027669b6198a80fac4bcbb12b6df2fa333fa408dcbaef4016c3860b18274903728e23079b04d026968e5a3a07282190b052f0fcfc130e0d433a8eb485c318bf20e6d88ab6205521991bbe3adb22fe3c67eb88676c5fad8b9b3eb4a4fd405bdeade12df9fe364edc2114449d2620257ae4c46d534e2a41e5d09707e814995c550c7038d47c7249db13c408c308f782bf85f55d97f897e37a61e813f28e73824720d7517e9a17cd5320f8edb31ed5980ce787d3bc4c490b1067caf6c20448176731f37f323cc8a1457c04f7f26043a3f9d1b8d814e3c62b7c454b36d158da504addd16639b109602714fa48cbd1059970e4b7a2d4cd4e07ea37dfdf7373e1a18fc6a9d5b31497adb38cdf641a8837ae31fa397d79a303731f4ead154cc48aca45f0bffcd6d64684dd7dbaf5c7b87b6a04aaf049400d48c1a297bdf2621252653aa9e6638a24d39c06fbcf75ec2f87d72b15614142d422db44cfeeb8a15c73890a5b597664220c451cb0524579543bff334149951337c918623c4bd5a4b4f2327843ce48cfd78e24b716f18e2dea98361256ef990714f5db2f767dc5343ffb88ebe8f7861d07c9bbcdb843b66bc696174c421a27bb6e98b1b114fb515bec98854ac57d9040de57e57130816135731b67295d3923796e16aad075132da0947464dd314b4b2646d4e2ff48089b4fea90f0461d6b4cbfd8100e64523a02773ce0a3fab64e6955b2dc76ed4eb52e7231cb328c714bbe4ffc9caec215593343167eca95d80de326b113b0f1352add7b31d634103b7100469be7264a03e31a9e18a44eb0432510b6ebc53bad80323f531a8108c7accc67da2c573fce609ee4bd78cce03f17c6e24a31f37f2594b5d1ba0d4b573b1a4341635da765363f2840c748850c44c5abe535e0cafafa284cdd83facf9ea77ab4312dcfbe7079430c314c669efc11fa9730d3cafdb5a700bf5c1dc58443b76d2f1ef700f9935a57321f382e44e6b92c3b700ccfa43e6b9c4caafe48b19672062a126e26f3092168983a888cceb61799fdcf46b207075d13fdce31ac66a0905b6bc7fe3626d19a51b461b3a6887be4c55ef37f25a431daaedbdba49a0b14e9bc0ce4314c2dde4a2f7e8db506d6655a851ee2f2c350a78a5046b25dbfc326643802370ece24a4e445d7deb158c71a9bcbb02e6e180c00fb9eb3859c676d9bfb5e6415e93505454adaed082eb2810f364a619b37a69daad3431e0cc185d5fd28294b4e01ceda81d819f527f032771e97324cc8c94387aa6b67617ad4cfacf611eca215866d6355b14a6013cb2dea0c203d685bb19a6ee84517863e21c9c4ffbe2eada1ddad0430cffc8b49a6f118ebc3cf73bf846dca495129d3be32f45be73d2b126c500fd6e4fac65e5f9c7ae21d922970e43fdb2c32d507c99e60b2d67a5efcc1125302bf2dfc6217123bfe65005d9055ca9659c0fe162ac480015502b28d1fa26fa605e6a1c409096c70e0027cd9d214c8d5c82b8ebcb06cc80c05ad7e8e18cef5974e9f07032f889f8656e7a8187146f73911058b549f4d673f378e07be6dcf456db0f6168fd51fb2916d6081703634833e860f601737315c6ba830b14a3212b7e30d3b7d9b7dd7ab340037b2a9a60715e175acd103c6067dce1cb6e65127357410a9f6bc4dab2980c3bb30a911623d193d1be1162243e4447ad47455db0e3eb7e036f1ee08bc825ff2f43deed1791a4c9484525e3f4feeb73cf85a3cab289544c588f452e74beb10ab51bde1d8cdf162cbe246fd0a4958dd75713cccb3ccf6027f71144df0263c46fd652f25a15c81fec0739798a593dcdddd56db573a0aebc1556b45da8f826de5bcbf40b3760f6c8ae86c870c034fd72dc27333da0c62e04b858c1b0bc2e04896a7edb1bc9716f065f681e97724d7b653f8952b3ef9dab0fcdc95709064aa66041c19153ddb10183132ef5700c1068ec7669da674b56f3ee2111fb33e8d02ee44f8fa49353011cb0ecb865e52d0116480b9673d063f9ca93d33cc429259b33dc6ceac1d09e8bd113e80957871b327b9da37c9f1a6eb120b46ff416836669400c587eb62c3762c35744c22494c6c97c0447ca67b6e60c7ce7aa7444046e40849b290bc8b37208c395251a26e843977eb2fdf64a9cff1aad991be60d5a17d1f74248813c77863f37420065dc4886ff338bd69cdb46346e2d5107b014f6ab990e7169760cb9b9aa42a19f6428ec8fc640a8978b1564427dfae96f63602dd2646a14efb2b1bc191d364bb0c8ef68f1301de8e2edd98260a2a98034a2606dc383fb36e208524e19d799c18a913ab05ddce6e89915e29a26df4be867b87379d22af9b0b60d54a7799782ca38a1f390f5da577087def7a70b9b501729ca66a08e7770fa695aa0e0789415d7e6dc901ca6b75d769a52a86bb42d8de711fb3b83c4931f07638bccbc113c2b5de1126a45d0ef455427a22d79c5c22876cec885b88e80e40f6dbe3cb852057e0610bee421d5b02ff0f956a1a027ce331d581190187118a7988e594c16429df372c76704bd81951bcbc5e109fc56336b71d4caf960808092b06d3bf7301b4839954998e16f5924996e79cb5290c81b96a34d6e067f894cadafcbd2e2ca672cf96352e6064ab72cd3c7be6aaf35a9896b76ce81ec1afa927a30c2562bf7982aae4fde3ee893ae1b137d9c01cf19621788ceda0073592ea93b9dbcd4eb9f8697bd6716c6b3a9cb9efe994f1924f8306c34680f71042b0804f4dc0f600721efdea709803520bb08bea44d79e0aae25534d2e58ab3e564ed356b5a7c4bae03fb3e8683e0e507b37f7e9f1008ff0384017ea1ff45f2d46b725c10ac1b457e8c0dbc245d3b630eeaa26e7177c92c0d3b02c7a364e3ff33bb0db938f51de7e8e5933ad8ccb64613246d12899651599b2d35dda96e99a179bb4b15acb1a3508d1f7b556408691c5f169123abd9c66237443d96f9d4d148bf5c199cf283b5db45b0e7183e884c43865c7f3567d2f7e937198ef87a6266697e3daee88a68e2d374eb7b4636acc77b9e7a8f3cdb7a42fb43b1d531b2011d8aab383c5ed3def1059c01245a681efb10486e94570191376bdc20d663188519153dd063dfab66bbd551373c0672a3d9487d029634cabc5876413b4c7785c51e8ae70dc11f050e3b1a64d02a683094124bf966628b8e068390a815f7f79358729a59ce44697a9c11d2a43a5cf1572287d3835614391608cbefedccfcc730b17c489ce03c5d9954f2f7a24a11236a346feb1d3f3250204fa0eed4e8e8f45bc8e8ba9b10aaf9cb8c086137a75589328d3657bcd94055b85de9971b430508f1f824e7b8fd1e969caa6acc22aa23fb2e904044239d1779a0bccc0f6525acb21e760b624ffe5a645388865b7c5db599d6096723f1e0a11a8109a734ee1f21e84058bce70a939426bee69a1026111c802593595c890746b195c18cd42acf43986405f82389520df7eb85605b81c3d5b4516d771f22a6a89824fb651eba0a60b624c77ccd50a1249b6ad692183f25917c96e447cb60122b5b911c774692130347d8deddf74d9281a088b929047ffd07fddc94f6f59c8a249a7d0137f038bc0c7ddb825a6351636ab377a54217c148ea145fc2545f779b4181b8403fa22a92389685c9a8542682534c26bf4a1847962bfddd31fabba703c94619ad48e4c982d5e71643cef7e1259a7109d9e5a7d281a0ebc4347120a4244192985f3a5ca245e0f8ae86700ed946f00a02599e9bdd1d5dd3be72c471b0f3074a15461616ad8f8048508354b727220b2959104d84b80185b159302858c7a139d2b17d0a32c9594f4207ade5b51ca0e30eb67400cc8e85b50a5f28feef9b5be983bb277e40c09fa40520957205cbd7f3e993383b518d2eac89c107aa03299086ab82c94002590122d423526b08d0e6fdae4b4b2c7ed2b83da3428fcd8984030eb5bfa2a093a9203b6954ea25cc151d73c182564d38022c89a43f236e86995f82b923dc5ebdb0402826c969d42fca782b95fe01ed3379a50239446922317e67563af0033351bf28416815746cebc787ba436d66ba23a3d0308a2346ee384b94bb48ba865127928b9d220b48c97efdca93fae75e1433df6f9802bcd50becb760302e69177285054448c61ee5f76b9d570f9066220534a11d86deeb35f7ee18b9d82a82e06721c1dff1fe039cf0faad120edb8aeddaae051777bf11aa57be06d74615d0772cd1783234d8fdadb3743057f6422e6ad6125ed2292834d149219f63e05f7cf258f0c8f5e5148409116ab83d7f731cf02a553f81887b3903eb4fab00aeebeca8cd29366ecb3c91580ea15adb83aa02e02e07184df61ef5f15985e1ac6db9d976616ac85673fb471c2eab814a2d23c4f83549c1ce7c0d8dfbe67789fa2b0b09ddbb01ec673e709059306244e9db32a7cd0f4f9f2cd4658c68a1fdd8e6010e1d026bce66ab451045e18f861c0735c3a60d6f2bb220111e90223f5125166e66282b72db65c4f4f581eaaa7f2b79fa23e0a33bfb27f561346031fb0812a2a1c6155af99e406a80c33baaff903441c69d96f0a3904c56c7e35ea3901fe440d13c6716121fa25d7e49448a88157eba6f650d50e02ad89d0e8dc02ab765488e049a1e701afb1061de9b4390aa12428020f21bd9a0a23f1b73bcd8de32a4d076c4ed6d0edc60c52fbc1cb0c4cc7850f1d10755faed489edc0b925868d0981540afbe5ba5487bc28d6ded347b0d0a0137d4732e5cf996161685018e3c7d2b900330f2667e9a82bbd074b4ce64bb85e6f2f3e28785e6b0e2b99a4785c3bf403eca880bc787965b5079e63f5025e4c4b3cb3ca4d7dd53b4c30c0322b1370ce06fcf188aa477bdda064c09cd63ccca775558d45c9d127542f3b63134b80f82a53b75091b826dd0d446feaf9e97eafbdff7b7eabd33366b5310103c652141d439f577892f5d0eb154eecc3ade4eb8ad9c26eb314d8ea205e12d17077b752e21292bd69a9e3a5ba9b2a786956328eac0d35432dcab5b009d03d35f7a34fe39c42fa9e49d5763a734e8b0d3f9539d1bd0c3288bd6c26c4d6a7c202286ccf43145d921d206c7206234557603067703d32c5257bef912083ccfbaac09bb3846417adb8dd823a047e19bb001633d6591ff6565caea25db2121e10ab7a7b25ce6b28b05b821eb41b5d1ad819fe036fa53e8817df628b4b7681810fa8dd9f2eeb6197ee37f12dabe44791c2063ce607c874e79683fd441243d54144fd2a40475b772154dbb2be2330df1fff6db04ffb82c39c8bce50ccead992c56c6f09dc36197221b7fef7ea2bea65b7206237d32430578188a4ca203f7b1ba94b012d16bcb1485d754912f53749c8d760aecc70fd7f8a35b346a6efb530aca2d1a7bfafc3404170650429b07f09f72140ae078798680edd8071c8995d0cb9796a691907975b6ba8168d7e9973c287397dfa401e8ad47bade0eeab76fa47a102e707c147d960aa870f99f494c4143e571ccbdf32f79cf6134187b3170f5618ce44d5be290d31d9a19738319a00e66d451987c1acb5bf2445fb02b5771193aecdcb086e1281e6c15c8c13c7f8b9bddf936d8ba73c41335b3807f493a4e581e8b7f8b066c6405e0562d0f9737014be10faf2b3f36dd0fac95ff0022083e00425cb96bef9b6477dca946fe1466c367662aac4e83c2708b9ebc283e4de28d92316d62d335ea005fd531c96dc34d10e36af8e8b3d8b6a7912a30377c8ef8d0b7fa914b95ade0855ef8457a313ad35bac31ad48059abda2ffb4895598d1ebc2bf805627f193a4b2bc61f2280fb75aa655b0e427a14a0e79abd5ff2344c24478885eedfffd461216c5627c268089e8b5a16a0e5a41027543e0fa31480c212ec46cda9dd4797edad82c9fbf385825214d9331362824742a45970dfe90b3a21d9ea124ec478f86011689493cfec428f9e78477c42340c207ccfd9088861f9897815185850117b8fa94e9ca4b8684746816948d47485dd40708bba1c218e0da74801c05b190e0412c20eded8216d4871d6a4b869e65a1ae2462f1ff983a71b757c8c42a8dd375130c6a32121d22bda395dceadca9d2bbbf0677efb43fa0ded84bb0f40aba920317f0436b35f96c0d76ac9be17bb87886d4c745cfd416c4e1b10aa370ee30174a760ea796a2d265af60eae5f6a6245bf28a8c3be279d4a1781e7e1893158f133ebf1d0d7460817f465765a0e545c8d61b0d2547cc023e62ad2ee741798cdaa218bd753b6595c6076c8d1f0da89589ec7b07f3671d098a0479b70040fbf3437cbbb81b60433434f2795328a0e15f58aa42a61654e29332cfe10d6f25efc1b5d40c0520b94344d9e463a501b9393e6cec1fef15a55807dc181bd0b75faf9d0324c9c216ff41813fd617de51c93583ec0123982bf6c1749db84152357d2ea545087d48b89a033f4f54a8372d4ab56ce3b1ac450d81f69053ef372d379a1c7a0540ac7a24114711e08f85ead3870bd92d92db746df7cd7ba24bc6ac19eb8e1a08caffdeca19502f4c90337077113f211db1055bc0dde8fbd8d5be02aed29fc06962e91aac9dd3d8858374f40dc06db90f9a9e588e6f6fd90e20b9063e57183cb544e726ec5a94a02839308859f2cc3a609639647c80e81b0ce86376bb8b1085080f705295010f1d3e3912634f6b603d158acba7abf7a9f815e919988e16aa9020e927da69bd4adeea9afc705d5735e81e5adbf47643e88f9629a46b3971299bedbf2e05d1c0ec7d4e7c3219b256500df450d9042c2b2db7fbcaca9fbf282514d673b03514b03c706504d281c1fb9af02419aae94e1dae558341596867ad56a2e0d3a98169499b61e9c095be1ca01b09be153adc014935b2ad29b40ccb45f52c2aa089d9288f5409038acb2094078045267b96bc6596e498ff730a34f6a4fa6e2c3828de795c649a2866029e009382fec8a0d92e90da0cda6c2b84992ff75dc7be6b8e5f39be7c1ad5c4fd4ac5704bde5a2a0ed77edb3cc47779770ff44ac4f7be53e739bd0799a420f46217d1e6a9fcf876111c796708b2a508b37088aaa3975ca087a05ae7c259fcec9d83c3153d1f8f5eea9f17a8d6412950c45c04e91c8738793e8e21832d7a2a2b52755452dd17b53b1520d6868a7119f94b56ec3bf9ec27754e1f8ec30ee56eca4bdc4009a60f05d3618ebec78d266e4da293bbec28b05999fa9cbc8abf8c2a95634d1996c1745d8654e0580d41d48765eef94679790861f22f428872c64180283038dc0c741573e28686907140df7d5e299e6c5b8a2ef05ac1ffd1950ec858bf4780ccca2bdf06b42c20c51df415976a08fdb1dedb0fd7d021e3e1c4b2dcc5d5b5d77a24e671260a4237b29981e0a5c43558a1b56e636f97ff5169966a2ef2282a1ee075b6e00431a936e130e9a820a8d9ae34191240e7102eb753c8263f83afcfe1624b4065d3cdebf60c476c1b852155f6f8fcc3b2bafc64d9382d1cbd11d6e59c36f1272adc52ce743aa3c3d9c96b99be2f071e2704b32291bd74a80c2ca9ea9a26e25475cd658f864678efffe1ff456d9276370dc58315333e6096c1f3ffc30a1c4159a64c8591a4b997c24c3a32ce7c1bdfe84eaec3a07d0b7b6fbb8e374864cb49bfc3ade10d9babc5fafe88279ba5ddb805325d88d7bda0e4f229cf694e2a2187f894df0fe1465bfa997d8e10c66a35ccac58dedf0d3a0010b24e6a2c12867e83edcad13cf7663ce119bb8d48c0c977e3319fce73a6d3fb6e9b10a7fd9893e3d5d236c9cb03b0b0ed3680404075212903fbb664189ab5b9d3c5489349dd64a81dba502dffb2f9ffe2e171b36f98eabe52934f7d58d4a893da075e9cfb61d7f80d53668f764bbdbb2a4b0822df2df6beb583810601d36bc0c180e3683e3cbee52cb4ded0e4587c4e86d9237709c9e2c93c93e133136c4e3188bf25b8665368e489bd87c0e407faf38ed0f8f526d25d073aee60fd01071defb843bc933eaa99d4c1a5bff5a650ec5143ecd050a360f9e75cddb7f711fbba8ffbd2df4e509f0d2614d0ef85602262ee633725de6d102101ef6d8080c0fcbea500ea1fee0f981b53ffd6f77b735b2a5522b212d201f8a7fbd79081ce748a4f95779db0aef77eedc3afe6fba12fe1a6414c2f0ee5133726827bd1dd2b788f759cddf5b215878a2cb3aad2d420a6574352d733d389c02d19788e4bb9958bde5cb86dfcad33c24d195d56728b15614ea4a4553e290606bc8f0103ff3eef8b7dabbf1cdeb0db1273f37de761261bd966393628017534dccc4f3204588bfbc37760dc4a263944fc2b35a787acc4f6c6e912c458a08ce238ca2e104b6f8d7e7d43dc03bf26e3ace8ea7170e18a55256cd694ab3f32a3d838351ec47add1443284f26f0f13656efdeb73ebb211cb726b28c5f1c6519193212b8dbc8042873525d136da06596a3f4cfed931766ee502e6a1968b5ad5fae3e23f41aa4eb59ddbdaf57b75606eac5d2d8cc14adc5be57b75738d49248e2e611e8e5d88034b2aff775df9f7d36f132dc2cd385089ac4e61c331d30d995144211ff08eb37b85f8aba618c6d3102971f07c0dda6646de24e3f92fa323a029611f0b4f9a5ccd6e14c1429e4e10948eeae99f1b40e460a17e29cad00a11d88f1a4fe7055e0131a7b2091cebd4d2cf1e0c08264fe128cfa2f95a2910b37d4ac2c86ea313e45e02bd49226c3ca7c0e8e3573b788deb087f94337b62c134b12a3291de3d35848974f950ec4d77822c8d0fbacfb3f814104fae5c3c46bdf0907617a07deb27bafb0cf0e82f2a103c0daa6897e9e017d988b103842dd3c258b4b5e7a99f77ce3da4985507132212e56558983ea53e23c52ddb4fb149daf24cdee054df3e3f3863e40450f2ff1d892306f934d98e029fa929fbc799010883e7f5968d932bae83613f008043a3abee220b67315e0bb8c6a89941de6d4b90e1664d88cbbf4c9a78eabe9ee1809fcd8b87cd61e8caa50b663e6b308921fe509f29bde6deeabf577cff906883ec57eddca4d29d5bc4ac010ac5ce2a14ece0fb834e5e18b7b26ac6bd475119cf9f0421625071817b146c5a0e751b952fac022192f78050370ea198513055291067c37b37dc3b51042815482f41dd007a5b7c80fff57c941e1d7b1f01f0b196257e536541f3a29a0723e718a19a188aabe6a20d630a466cac365d1f95be9484035d100b48b29e141afa16df78d8e3f0f1c9e534489be19d2ee6389811e86207e601fe5afa1824d730b7665c0ba55958d68f7af6a7eab9ed802cbc32163a2418fef7276d2eed8210729d0829d63b1e5a5222f55dd2b392a8da58b34754f3606cc2b723a5a3ece8f6389baf21c95d91d4743e1666643ccc15969fd5141714b30a9a73d647f7dd4b4b6ea2380b9b2a33cfe202e2ce94f615782dfe4f4a61c0868be12d6debaf37318f32d3c59812542576e32ce58b4aab773f2d24ea282acd03fed7e727bb407b2da611f8c1f59ab4ac8cb515a1cd96a39871e5bf0cd7237665f2b6e7e3a805839e3bbf2aac6808e8b0434eea516d7255366e13754cd3cb6439b6dd03a5d1f62aec269ac1cf670d4bfcbc297d4418e823e8d63f2a256a142a31c327f3e6ee40368f465e07255484f8068a1a46f5401c78a17b8a4c0c39402de3cbd71cb294f91c5a3d578fbed0207a363d35a8bf7fd5ebee5f7f3f5737adcd4c7d390e04a24b87137b36a74dd91ec62d197570a677cb4bf4b626056b51ac28632302761c27f6e8f4814ba7f88ff15fabd97bb8a4f9872cacc1e970f12b118f235aabd43fa8d5a5fcd509abb03d46c26b300ad24488c9291aa43a086e0180947840f0f5775e8c9b4e5af33e4897857875e22c35de80b0d249c0faa929f73ab4541fffa518549d436de8caf339b1f3a6456b35eb199cb6a05c82fa9e96b09a68f930e635e204ee9038e280094a783348feba6158fd8b41e3f8c66ea32e071e066c0b9d048caeccf5be097367484985fc5a843d5b0f001cec072df05745d47957a68a1121b0a7f94ff3d732f865b7789400641ff9a545f2cff2a750601a287c880f6b7276af38c4c7582acf5f41461df3fd5d2295e864e97a1533bd725654f94291737eeab7629ba4750f9118e8b131fd0682a253097fd78fe4267b9662cd7acbeebc82318abb7886688a835b18fc85b4ec91ab0207a4afa13f6ad192c09808fa5ceda217b17b0c8d5e7e20ccc7088ded78678f66300a2a982ea80f0534290694b16ca53e9b8e389480e7c2e2d733dc9e8a2378b7a3157a0bae8233885003ad7ebbd501fc96aa7cfdc08fe688c06dd261dac840704b43542b9e5389422846d5d27d1950c6a40e800f03b07900fd9c6564cd312480bc880d428ba8fe4812475a41c3f301b4af8f19ac43d371687a11cda8fdc87d4868f43c9991e94a9b53c51fd67b82d559c24451933eb22e9dede2e0946d9c61cebf2bfe09d94eee6f6e410c595d2e770fab529b2a2f9607b9b2280e320d7d6b5ca1cd6dcf9850aa300c5714f4dfcb6320332552bb45667b9aaad4118faad946cb3bfa1c3daee34b99756c7eb681d116e418fc697e0eda2d872b2962701caba7942467c097f3bba2068860181e3f935d04292c19816a4d46bb1dbeccede72b1b00474b1de160731dbb3029763efaf1dc8c5c6a2ea43e15118896686563705eb7c364d9d800912f1447dbe0a5ffd5fd92234eeb1e312132d7f1c7cbc80065252137e7f842598d870d800fe2c540285449058c09ed2f1b7f5171e8ad80d18000caf9840ed78eef4e07914efc0b3829fac53f21ce40d17bbd8c2ffc9ace978909d5dc244d55fe03bdc9e1844696b4f4d801ae426b0ce8a86ad3e16ad7fb324039be10bd8162d933b09ae8d9520be283a500dc9353fe8898b70bde56d449fc091389ae4cbe96d2c5ca8aa791f838d40dcce19b56ef6c92d88d79b0c9e7ae87de26d47cb540487b80ec513c7793d904038891068f0cf1698819376fa8b352ce56adbec09293568bdb4e099a58c716ae617b69c78c731a7038166a43fca05c2eaef19caa4c425053f957a47826175372a125220fdd58ab6f0d02b12da8b56926e04ec4a8edfe9fed0321aadbdd501a94019c2bb96fdea3ba2645d1197841b2add2fc5d5c837b3334714ebfdd60ea9b6d021fe7fd468cf58edd8c6ed1a90222c9874f3de69a26b74d322bbc8942abdd1fa622934526a0746b69b2483032bc7a789fb33bc94d826ae63769222b50a0a67be7f804ed819eb556fb35bd260cb2857a50cef32164bc6c414a78a1504bf3bd08059109cf57e9611f55934e1179387266f1ec47477506e326f7dab99261d568f659379fbee0cf38ae81c0cf988e250466cd033a70de8dcfbefa0c58c2ef707448cf1aef0b7be9415b08e1df101fcbe2b49d1ba5e1c22db2983ed9aae7a6502af143a479cad1c3221750fe03ebc24057c111f856b36dcc3b01f127bc283c69a54ea4b423767d06d7a535f4c51d648eaaf655343005c03e4713733f39715467c129436c627b526306527dc8d965421ee4921310441ebcf07dcee60d92a87e0f3c11f1d436681e176f8e81a56f78b20e07608a114653800c8241194c14217bedb270d0a85e61eb993a29576cf77cdaa2c79a4c9b5026e1172d0a30a9c57bd3236a770190846d0be519b60d058300a18481c07cc0d342691179e2ca010aead2ea8dabbb103a2a14b3fc8aea0f9944f75cc2bc48cecbcd0d254f89fd473f2f19ba1c40cd0e2d26a1b6d98fc92e3d585aab68d2b38ff988f7a16c9064f9bc968137ed1c73452c009a228b8ac0d224352ca052617734cd24c610cb1492250854adcf81469a4701f8d0d02efc3e944dff76e86efeedb3d8c8e9124b42fe6c81a946841abc3490341ba4ddebc39dde83466e3918398f393d66f256664bd89cb8b57eb423e425035bcbb8486a8715445c80fcd6c8dbd335465fd4530abb41f6105525ab9d83cfe30324fece74f59123eee3fef4f25fb25a9189124b55256fabe9365ef435e16b48bb78e1b75fa6a0ee1e4c383514446b4d72e95c2e36555a3cad7001210e4fe7a67c36cd58cde12a657b1402ead77dcc32db34c1dd34a3628c9b518e5c2695c437d9d3e60792960a7ed673411feaa3cd07209dde7e6c0156283eef6dda6bb9aad4c57dd05c1792c6b607825ab0b47e4a9e0c267748328477920056abde478941f12b0a8a38fe9bb5f695b84b82e80f24a74f13e96b1a8e0b255022170b2eafe70d3ce53f65c9afc4fb8348b90598a9617b66591634b525657e3e24b08710c06c5969bfc6ce0d24ade764b4c2d857ef0db3e50b5196f1c5f1a827ceb5c7cfbce58ab28d37ab1dc9ef3a0c8ecf252b806c684fd4f75b18279bf812e51e4350b4069c9e2ae22dd8f181cad06258a8c4543d88f35bcb540c95e13347d560a0ab67a5a1c135ccc23c490c7fa3c3e934020ab6b3652fb1c6b5c819c514b582ad5a66c4194ee2a5f4edde7d824fb48e8371ca629667b84219cc30b0fff6759aac367349d83ef960ab6865acb24a6a7cc7eca1e8452012f01dd20d2b467ad84f033c7881c262fbdf4e60c071c112a9962102c8002d3aee0bf2378ca56f129da8bbc9c049330010936b92dc63e9f5a21b998630eb5882e2b8bd01517c0daaea8af9aa2b2e54dfb53ad7852c95c3b32a3a46cfb7cae9fd5340afb0171f63ae53744da451796bc30f3aba41f2bb99bcca0099fad28ab7a813f54677c639b4bc962b5a9b77b24e0852a29e4a0b720a926bae75202b9f2a44d811e7c823b77d8219fab97015e10d8e549aec085aa7927df32b558c02fc4db9c5c7b81f5f3d9a29663c3cdaac81f0f1c167405ef2e8e2abba60a463ddf80d1337c55d133038429ab6217a81908f5b9b9b23517b964a37fe090ef1efec62ea9bf2a14fc7e18ef3165dedd63d3f1bb2c64b925b6bbf51fadd04de5836e74ceb5cd57e2cc8a741b6d6e24145e159d1a852235366816b938492f085d98bedfa8a955d58c7cd73d9ae548a7e5ce6d0c8b7291548280e3263408800231299049872da1e42116a7bfb7afe14097301e2d0926116728eef9db938d209d888921b8aaa12993f6570e728081aeb50bda2c6ffb5fe9e9d98e33bc7df9d952a43e140d6a3b06e76220b769733d9b81bc6c2c7b74e81c33fa1b31e0dede5df22b7c189e1848f704dc7051eb83334187b2112a43bc0628f802356719b0186d1caf84238b2af6cf719e61a27f640b3ecb06d33611f929f6145050c43ef8718cb099ee9ce4ce008bdfaeac68b59ebf36024393e5cf679ed5271f8d53539eb40c316ede5009962324cb1fd7a8beefc1ed507d97174cd7e7cc5a839f133dc90d0fb171a8200c3fb463651dd033dab012b34415ed13a3afcfc25ddaa462d1420c6a86410be35776359938bf3ba99cd195eaaef4709754cd6000c7f0e0ab62f49a92117f2ba9c603ea143f24ddf45069b263db0fdfa2f09697ecdcb2da448f9d53e0c029e068e539b8c2dfaf76d382f9ea8d95304f57c5f0171224e85262052032ea7c2f1a0083bc4822480eb55e2e09b504a5a8bff361e3378c38fe8c20151cc774a8af9558cfcde866f858e6459fd3608b1e13db70ad36cce5298769b27a8bbece2c99dc99f91089a506e36e42d6baa71d396735f3cb2abb0b3d6250b83c0528c2b412ba00be3c95ce0c83e50ef944f05dcb454bbf7c60ab8ecc2ae452d0beb89693385bda25e7f87e19a0cade78ebc2ccc1416076092a42edc1b52ad8f1bfeea5ffc8f91a245cfba7bc607184bdfee0033361d118fe7371b061395de9c712bcc649b4a95dbec8a29ed3339f83d5418484730916d243f7a3237476e588dc8a5f6c72e2d4aa88b29159d5fef08291ef07444d588221a63af7992fac83ca35409e09c5bc23a72ad641221eaaa098c90cf6383dd0219c6fa8a6efc24cead13fe4999642619c61f7858b484264fa17ae8da2ad05e86f1a50b537f1fc47ed14579342f1db00b1b85d2cb9cb5b53590a0878cd7423866961ad5b776c6828fb819d78f5a2ff62792a53e8ce6d2ecc94a3a1cfa635b8bf9a5a3fb9e61888299662ae648047151c46e303264c517b5447c3a095479edcb64c65b76cc7c5d98b6d191797d9e9605b5b4606f379761fc669ecb196aa76c9165a8e80e2c021b36605729d9243c2b6f0419fb9ee1a905cf82adee5bf298d297156f1e6d943dc70a3fc40c0e07c59e9a9866f6b3119c7549b05bfc0c1bd3e652f4751b8d56cdd52060976b4db19fa827e895efb7698ecabbd038c7456e29de81e1e061f65075f4c8244b8d4c004943b266402deab8b2921e55c63c5fd751782cd0201c78070b68a5ae6a2b21d9fcfe3ec6ed896f4f3386c4365fefde1b6de95fd9c185238b206ef6e10ea6dbeb4e1f9ec4686d6c5270dbcdef08ed73bd33053e2f84df5ce6bbe5d4678c07df817f9e0f9a9baf629483209dfda20577bc5192c09c89238e8c98437e22a4b46692f003028a86f8fbd06f251d6ffc0e9207daa01de51c1563843888744a73d8b61a505fc576d26265e4c5b5d232b2308676189173f20d26127276e98d40b9a3ede0050b2d7c381b7c157555bb16cb36a9498630a6aea33564bb99bee57596f0a92de5f3da3f8801801161375ac220c96acd41537540fc6397098681da7fc45d7b1cb940959f229320d70ac517ead4c59077e46e9abc8acb386008f2474e8adfc9162cce5f7375c3e001e84f69498b4c7b67b64e62996e033e9ab04d7b439a04e8ede2510431b08729ece639c07ec3c9e5d7dc4ec82668e08e1b7f5d6489bd065e8fba125f505301951b0a985c7f66cff44cb49c7b62346c0301fad1a61c6db6f5b09ef16ecabb60a83a24398412f43843ca833f1f363f847155d5daa59c17728f8146b315d12ca8c238eed165b0fb01141b9bd65f0e6730a32b3b6aef82aeb4be9f14b993e7041b327fe9f6142ac7fd3654c271005873a6a41d4a404bfbe05b77c3d94abb1003e7a9daa5f6e52bbdba3eadc26aaa4fa43be755a6634d5cbbc6bcc87668b4245d8076af5defee1593d2e71e0ae0b269b18ce6051a6758669b4eb5a6276d280d7f870245c3b185c92166d43d6f026050714332d109fac8ffd3ea3ca511740b6d1d0e4d47ca048761a79946aaf5177c8335c3a622133500d192f412973a8160e464548a00e3261c8ab390fb2474ea18dd716bd9b062261e7e8f6e99249642e9aa618289a3fd9f6d1b925067b0580ef27587ef3fb9f23db0bd91b3c166d1be5e962b9320261cdb07a8f9df29fc698078a46b9c200ad9cfa94077537d8b1aba332f3c361bd0f8fed83762cec4838dfb2d861f48f1dc41636994641975336f0a5e667964951c40aa070a4812bf1fdbb01d8d0b73b37c3886837a06522a61d8f396e4509eeb0d238bfacf05ee7afec6b713a22be268a8944d7f0f0a44e3480e922bc0dadf40caa44542c5a2759e4331a975ab10f9094f1b56bf23cbf8d15386ff9d0c5c47c6e0cae4ffe5046c4da0ed542ebd3f8869fc872b1b71a866add2f050d7eab7d293eca5a86b072db2db7283091c218eb969220fd5a3f3d18253a23c0852fba7520593d00fbb7b03a783bbfacfea0b50c41d4549a5c3582f0299f0d5bfd0f8724f06fee71eaacc90724271b09b482a3ac4ab3f14b5c4b356a0b87bb83c55bb812130ac77fff131eed246bbb5575c355c241787232eb2c85c09079d01d20f1dc3f04f58df90becabe2ae8e4dcbb450b3e207d64be969a4fd136a2f8a051240f38a6f65210a14e3ce9eb575fb0774b838a8341fe90959a29a80a892f5e86a819bcc41120162f2248a13da26ef90785f240bd398039063e7d748fd124885cd07ba3536280ba47baff810a84a828e146b5219bfd08dd867ac61d67a3a85ae181f3be78e15d4eb74737bf7f79c168cd836de2c8bfb2e21d4fcb049bfcc594607c425de3ac4bb1459e07dc1e28f1e02e547007825fa1328034e7c2e18d03be8b713b4f21a24cd132e14ed7cce02537fcfe7696eb7b95b8ae96c0b6a8e003c9948517fb617be3ea21f5678336078c62c68b460a88541e235890a90b7282ebeac89c44b700d3f1513da84e1c9b8fa5819f5e6dc916acca2723db81fb1557659c8ccbe2b9e35b997347c4b5dd168d0ef4113a60c1e1216114d7d60585ad20f651c76abaf908d6da96c20017f26f6702ae133d2cc70bc65c43bf1e65f697d2e916007cc0c68de275055c71b0b4a35dfd21fb7d64633a04db23f49d20bc194fa4f72c4a5e08be701d0f325a0b1340e3ace5c979606571cfe042cffa80ca1eb922d362d1b968f8750f1b95d200c45e9ddf396b9f5563d7b47a1f1fe7db27d31bb6f415b9de9f32950ff0b443e35bb8d974d1fbe2029657c4334db586e8c440021b1119a8c87a3430e6e8d05978a21ffbb56347c176834fb1eec0da0a6807743e814e575f3a1173d6e11409af62e7ed7d160ea76499b3849dd551ba9ebab0a1e4f7e89da279e443c112569c9ef0848e9b88ff4b72ffef58c9eebbf0073fa80e4f38892c6fddf1e9ed68a44ec631e06fbc12cc8106d7ce3c89172f5fc37e65608550fbee699a7e788cb95e0fae5c8a36ac4f47a6207fd557fdaf3cf465ddf79da157652a67562f66683668990200c75138a4a210e439aa8a249e804423807e69890ac91c33febcbb36a947dd85a2106f22361e9d93bdf7a259a9c8f9b4e0818e432ebf4ff1290b31e282237ccf5cb17f42b8cc57b9e2d73db46c8d8175dcac384283f3d841c802af8ab43051b9c9ffac2148e8da667ca6a2b10ba1ff67ee4062bfc5fa66ae5d7a542dc197bd3bac25055683d719bbec07689aaa7099c3c00558745e7c1cfa938e05ceba3d5ee9cf2e0b7048750045011b9133d8d63ab2fcc076c41fa26bce3caabfcb5949af058951d9ac53c22c838d68a4221c28b3180d38f1c8b46f3cd4d9f3eac2b941dc718d40916f8311380703518ed721c1f042d7d18268f6e2239166001ad003339fbea7c3fe9c9a203a50e3433c8fe633879918975a8cc8a5774411bd959f69d573b791a2360bdb8c1ec23f7d5e0427b7e6780199c81530dc8d21c12f14a024f03e220a49b4204c88012c48397306736c16394d090c096fc0d75f5f1347e128077abdc0002016900d5fd6ff70e360b6ffcc1f2bf3c03b6d5e1496cc58e8ad0d6e162847c1eb282b5909620187e6800a636038096b4d4cd9f097b8d2903e531bf674e9fb159e34b1b1050521639f9d50f083fa5128c1ea11cff78f022f2b9c6729a1732e93258cab6f88502f6d7a222ca9ff41cb81703726a7f250193ce455ca70f3f918388562e19ae35e374d6aebd4763d226caa9bb28915577eafecde1ba5f28b47caeff0fa4ac42608066a6ecf646ea4231001d0386743d6462769f81f71967deba1117282c90958d42bc335215a451f3fda094e5c6a927a10c10312188944cf17a4706c05ed4e344c37d3f3e0b50e6f3abf3138f3b5e2401c84e10de31f09754988793241dbc580e656837604d156e3d5abd96dbd549e9d31c04b4ec33de7418904545294910ed2f60c70d3aaf74325f38e853b9a4beb41ee442ba49525fee31c2d4e4f2acd9913a7d584a13e6d793818b80202ed4571a626e7bc3e4e9fdcd3f44521049f63bad551b6c733f37545abb4dc07668a2f51e99f35d4338de4638588c64d0a17619c96f6920884441bf7d563c744681108fa96223862ae7bdc4dbf46eb1c4adaa31a40ec489ebed66921e3d51de1a31dc6d9aab594dcf94eedee1ec71ca4196edc8a7674ec33129bd56a616339bb502113e16c4e888b5ea4aba1c5520051dba1b438f691deacf598c3c9151c28df5961fb637feea239dd576582a441787b5f364c864fca9c4aa1679fef747ae3f488fc032921a30be9ec244585a2564eb7065fc6150d1b621b4026013e5abf5d057b53190f08bf10723373487a637355cecb13dfb6e29313157f248c62d3dc2308daf3f254f06f3f70238e671e7d9440d80e6a8da5ab67db447d51c519121fa412fa23d011afff5f8c5c0be0fab2b2da751d0d16adaa32cad97e7b753a7ba0111ce340114b38145c66af14b10f34d600a5782e15790f72b7abe4b214d040f843e9472679fdc9df40679c7da2177a6b9cbd087dac25433e9e7e549df68eda3221fea3f30d081914b7c9a204986c846db6ee2941661e60874f8b752afa147b6440c53965c1aa75d3dd457c9afd7dc687829e85c384efce6a6b0988789320372eddad3e957c20b7c03ea4e777219d0b636442f2477f060dd6385946d2df75bb47cf4f7afaeecf1e57b74ed179e9aa025a29e435fe1e7f7b7c3e8aad1e88c6d608bbb49bf0c07457f9820d8c9efde01ef6e8e72a8441f6f4b98e02c9a527ba270bb0f922788b11bfdf93fae5645dac0a6352bf39ef36729244a0245acf3ebedaa4089bef9a624ab56d18f03e602f773d8e6280ba3635f55db76e6a00fe2bf95e564bd954f1403dd3be0cd9ec81f185298d9ca704de1ea97f7694a973b1f5899bd67f12efe210fdc0a670cd4689cd43ed8e56383b01b84074205f22f47b8933f5954018ac8d98e61c6573372978f177938c1e446a80284e0c28d23103adfaff4b27d24329d1d685ad791b957dbfb0fdce9d208adeb927d9874aef367c0004c13ae0a86fc3fa18497c5fd8ef2d92efc176feb21ddddb02510e9888070ae8a517ddbc7742bee4b3a1a03a03caffdea17fb3c886de783adbd0750e388d207babb1e7de82bd80ce0bed9e949fae977dabbfe6614a4e881d0a51289672a5ead9a75dd32238660e11b59c81e48df6a45407582d593f8b3f34f79fe26aa040c5ce6849287c31384326c94edbb2744472929b3412b4b084b996b987afcb18c24b8ae4e0550b5c0eda1110111a011ea270c18852e70fbc38b29722e43fb0db79bd7736b1f0fc519e3ce6da2acb6f297bf610f9a7bdc60bc318ca762af290043af03e799962b1018f497b132476b87515dbebb7eb14cb1c28e587c58cbce3d33d66e9c90ed6b768795c83542308246582d4333971824364a40ec7c3990e73bc0b9f5d4ae59145dec0809fadc3e0160475703aeca8a9088530bb7c95d4aff4b6ed6c9d421240b7b815248c823f03397c85e2a41c29a94eb3eae0232027c3d82c9265dc480afa612fd78159eff068e81da3acd5a3aecc341431e9d86a610f2bb8e056707cb3b9f044aea4178e78bc7f0d062b51a77b41e6932f133d11075b4861ec78b9c2ed8994e2921597a07a488468ce35fa15ee4a5115a5197f62a66329a7aed8962d0e4fca1e4e3e7f92286fb70cc29f96fe414f43975e9f1379323f2cdabd545c5e6b6391afd1f2b30ea39c5affb62ee9f89ef15277f7dfa2ad35921f0b3d2b7b87df6922f8dc7c4524ed7bf955a554bd5ab27b7e761078daed1dc56bff2b50643c44ee6a54dfb705469fcc90078438e330365e89996268fa47d9792841c7b09f9df2ec14074af02cb26b708c85943cd94364167e06231e4ba6c31e46213787ccb67e6fe47cc5e3b6bdae95d6741660898ca966bfdc8b434b673385ee702dc321c93e04563cf5cf29e95e190411f7f1519b0a3ce6339759d0753b56028f702dd83be8c7db0893ab19dd503967060607b7425838271edb2cd2dc74dc530760483186771ffd0c9bec7bb086c4f420bed030b5424c1f781f3f9582156f54cd54a8eea0371bf2a39fbb647a9be623314c706390d2f1cf636b883c543c08ac7ba16aa77ad9a4667b93cbd15769a0cea2c7e92d600cce287f8b73c11497ae1f04b54a482e9a7573cf022c468a2a8b5b02a714cff14ac4c7bbf127c0fcfd47f23f367226806faaf7682b73b178e13429154edb5e544c88fe63f4305ff4baf5e7b95d0e53c4885053be32053ae00db3f4f052d4a30b05486a1dba7c1ae2aab3bf215078dc9a632442f09d8b08e9b7f5106eb72db85f72d7c493624505abd09c32e6cd49689cd0273510ff736057bb1d80471be62c7fc1507c11ffe57ee1147eb8d3e2cc2dfb8a3b6006d9fdf8bf67270535d3ea01fbc055c7c3640ffdce3a9cf878b0b057517d7fa73ce7f752a731676979663b6321f93e6c32cb615ef3c3b2892e16a83b1dc250f8902d28ff9163647a1b2531d843be84368ddd9ae942aa1e1a912462172cca85e91c173703a90ac2d0a65266a1828639a47313bc239eabe79412b44e96743a004299cc418c7a733d5c1d5940475d0898c96274632f5811cdcefdf03ec5b1b852b89a350eee2b0eba0ba749e872bcee48b8991781ed4cc5cdc4c5c7942ff8429f3cb818307b3e9e359cd3dadcc8dbcb3e0de0dc05b0bb814d065ceda06f2d07149510131107202279bdc7e3bd2677d51211f5865da3c003ba4948e5160db9404d879ef3d19f6b420c1613f10a2dd068d0424b18b7dcc36535aebf215aba4ec8246fb4c833dce17c83a06d4a1d00960bb1c51af5d1c57e5fe237a8d665197b2e42c956f8a1b262871ca2e791d1a93918ac3450284f2b143197a36e303a9bf624a6d445384457a4cd8bcbecc86e83af04a31bc05723f1e6cc7728360f2905e2586fe02952dc6489e33859abb869df56b6d6a46ed518a7bc9d221e58ee918444c0168e74ba8ea96415cd1390a56837a2b41a6a975af0c830bfca70a4f25c644a5c83016fc3b945f40b67c40d4328fba9aa4e6b26acfb27bc3c9ebcd8efa820d133cfb260101ea5b83ae634200bec90366eab172bb63cf01838b26d2004aee5829c1fcc1269863bf9ac7836d1f74f9e9ec631a9513d2012752c610043966be300618ed5aaae82b05e2ab33c1e0297fec247169bce5b62ffac3614721f4818abd7943eb6e6064fe2eddaf09c2f31572e26ae93bb008b7ae3518346548de1db3676bacd119f3c2d2c9d35e3794bc0d95d788b785627f69534b48c82b073d39ec9621821f0221cfb998d3fd1329e0586fa1909553da42c83af706365a35db5cffaad4e830bb5c71f77ce9920a4c7029a406f6bc022fd1a3faf7784e6987b8927d4e5e382254cb38320fc2b8f2a7491b29a5f33eca1e84fc073936b6b53356a808934396c738ba00034b8786e6a8868512d614efe9b33c8682ae3e56efc4832a1b4cdc178b0f865e3eba0e0721ce80209ee56f076ea7b622c39981a0243e5cd7e378d8832637f13891a76ab7fe9d8a5774e5bae530dc96bb60eb81ca340177e51a562a3657b6d51286eaf050dffa9845889ec3a9bed78fae9c0dca40e52b31e04cd752aa97c6779f0990afc40e679fa3d10ede239c3203bf17464b0366172fcc7647c72ac7097f79a822194c0e52fec351e9664096ab892be59ef697786a5d9e1d91c768037d13b4a289767bd53f241c499a13f13baed4b7a09f44ae5b8f2d4c74f1e259f9fcfb987e33772e1f0424e9d0470486df547e10617e8a08f1fdc641a83eb4aedbff2a2f9f4aadf9f6d1503719b862958c42b4f1218674b47929b136aaf84cff9de88cd10954e2ef9481715f941bc38a8db262635971e359a3b1acdd6856d148d63696151bcdaa1bc39a8d67e546b0cac659531b07b152091549c06cac0213b78e07aef383d4f5e0753e409d1e5cd783d6f9c07572d0ba1fbc0e7cc05be707af7bf8ecd479e30e1231514c69cada36dbfd902c8f19a6143d8bea66a014fd10a01debdd63e222e0f2b33930c137ba7be763440d00c7b83d756c89cc02a6060450c696804245d50ea43794cf10b03db03f21ea3c7a1b122e464cadf9ff1400fdbcdf1c9e4f7f043b4da142a898c56af9454af79d857782f7636e58b4c8b5d41536c325002a5be2f4f864bfccf4ca293b152b5c1a72cc1344e64996d167ff1cd4d774134e2176a01ea4f9f678f3e5ccbd83e3343782d9f1c87dd193828aca06ad874e712f65d9629f929ca9d8fbb16ef6b4d4cf2b12e84e91ba20281cc94adfe7db2bbd21509e6e482e004853fbe03f5a0e422173e95133eaca3d979fa0336f0477d478651a9a9011f48aa8b053e1a00a1cb6cade011b03225cee9cc0227675e31d3e16e0fa102c2568f577d0a1613cc4643c24d0417a7e0b52f1d038a361f0722c10271326eebcde6236144bd1f5518c3dea46eedc3869e90942de91ca9bc2ed7ff2428c6e79380a3b1abfeae5dc9a358887f90cb10188e164e4148d8b97594a01b85f6815e2a483f19577335e4d91bf6f784e9e0ed0d97dad7bcd7f0ea53afb6be6717f8e79b6e86161245a8be2811a339dfcac83db3d8e4720baff9e0d5936b79c75713ce2c68b5ef389cfe8fd9d683dc112fbfeb2fa5415c74e265e4e9fee8663093eb4b48bd4f681800a6d6191d17351c52af7ffc8d2164001a9c4b20d9be4781ccfcb0a8ef2a54725d3b9e00568bc4a818cd38dd5005abf2ddc3ea2b79378aa0f48424ad9e0e7a09c8064d2a20c111afa95d31ba7113aaccc9067e6c8549d640dd307d79c53727e6e1ba9b854a3204901ec76db04eee47e17540c092c4eb500ad60e228b8a0c6d5c8c0ee9b59526b2128e1c33253624181c06b51f0a09fad74efdba1c2121eea0239cc40e9130028bedc45ec61d975ec288fd0e7d2eb5af9274a0d6f91227d9b1ccab9d0154845b639b524ee5b5a91b2eaedfba29c82af83a616b9d31e6d8efc9dfa4d2513e8ded4da8b17248e2e08687ba6189f3a96ad847a26de7f3659b89c77fb972868e1fb547e080edb9c42edbbec1f422f7d46eab45d1ab5713b516ad95a22875906ee8c2857806c4ee33823fefcd92df0cb8658ebd950de6b58be2a1cf4fe9aa827f06622307924c1bb4b1b3b59e7b8d5ddfec7322387820884cfd860174813567db4bd4027a91a49a7801504782f37806426f0e19f74a4f59c2004627c1df0ee635b2fa6b20f3a82dd761ebad1272e58cb1d82f7965c320a0306b3d767ece37077d5cbba293078d32f357f0eb0b78ed9cdcd921b5346ed56fbc43e18918e8c772875ac17d3b30658a5c90c0621b22d2e4ae82b8648c146bcf836673f5eea9ba5896051416d84268f7c3a5f941d615f3107d763a26d914c1b6f04e59fd8b3e88967ad9f94fd6f455cb8b571ef473f5ac9a1e44b760e4f1ff15ad2ade6ee0104a53a98af813119d4aac13624fd6a466195bf6505f6941f25d7730bcc2e08bd0c15343665c2fb2fbcefedeb848994b6b0a927819873583a27c61a18cf353aadd06d2426825469a1b4c5fa3851e66d82aaa6783efd75b88738e2ca7156e209f8d75355572d5a65dcc617122f112493ed94f263033ca4e908ae38046c3d8f2bcce0ff1ae2c1b26db62f4db4e2dfe08cfde841dfd2ded1a96b6c15ba2ddd00ec5f49d6ae60496bb8b36806469ed07a2391d2d692bf3bafe08aaa1b2a5053eddd499dcdc9b323ce93997db5123135a8bde95285883f3e3d0c5ed3856a52fb79ef0cdd06914d52fc9c1c00bfc16a9e9248b2ee7f85ef7a1c1775a02010043139f828239b722178474a97876c431302dd573bc85f357eedbe6d71a89c2d07ff155c62688582d18cd591e351b3faa04b17b142f16ade4a93bc6c1f01c2b542baa8d92b59e11a88d34d0b6f47a7665e9174f7bce57e62ef90f7c939f2a87266f01b400788defaffd5aa46631ef391bcfa234ed8179a9a4b8a74d19bfbfb87a122abee14fc047e65700e2a3c0c3c3185edcbe20c65318278bc1b90824ab1de9a32e1f805afb2c00c0a156c5fed2dc98601534e145903518c896071d02e65a9f7e9453e39d1914a78d11dc2ff8390272e0225a32f75dfc239f938ca5ca29e568e99ab18a301071436ed07f672e29ea893fc1aa78368964a99b69a4820fa1ecd2b5e983c4b1685dce83d01b301c3a146ba672a763dcaacc96bc7be4ee0d54dbb35bb0c4a23f5be655dbc8e61ab15f9cce82e750673df208d78ac87fe3a149802951309f5e7b247ac1eae45d263e8905bba61a51ab771d43c2d23ffc00bb0a4fe9a8b39083b31dae12da68c408b61a00328687fa847cd8afb8eacd465fbf054acb2c674c2c244ad50b4af5afc9c1f666eb836545297a7060bfa7da8bb58300e76e4d31e5224361e4b5e45ea3b3ea172586f46a95901462ee15ba77bbcaa867aebb39b656523f6ddeaa9b6a9dcff8c12433380fa617996c1774ee499986c7e6b141e37f1d095f2e102cbdc4b06b655d5e03de7990250d3f478879ed20eaf74d9285be921c1f3472befd87120eb9a968e5c6c3bb772ec329a369376795351a89aa0d294f16eebf4bb50418448a7156dc385a5d5f5f8abdbea74f13ab2681ad49d4a7bb4d4d406c0f2fc3f0993b498cefd1991b1f75c0858f96c2e49d0124aa0e2ddbfd5b0c5995db19e23d02a222db6978cd045304c266c623fb5e4311df671f70dbacc03fa16ba58007701f6374fce0ca1d8772065779e287442a30ee2bad4e088c503d85d2a4e71d2d666d170dfeaa851a38188c399344ff04fc168f902e9bb9237e159d3b48b5c5f609f147826967f05526b550f06d5c2cdb200126a350ea6b54c84bb185876399602e85fe9a3124f04dedc454e2e8ffdac819505c6d02ac0949ef4f739ddc36733a6f7520846d4dd4aa8e618977a2343b2253d0f7e617bddc79f12b0404b6f6ff839bfcb00498ba49afc0b3f7c4001da0e7556418c0bb4d5cb3771c88573a6a4c8457abfeccec09215eea152c4831c1a024f20897660fad3ea0d2f678e9dd897f73fe8ce398babf8a87a00650a148de1e07dd59ca1433c15ce95cc18e65dd55a26f0776e51225ab8584abf80752f44ee6e67c046a10e37360e196fede0fe1038b5d2b6d1243d8a5a6a5b8168deeb0204172cd553ff26861d5187dd0b1848a192f7efc1e73453ba348e7f788f76449696fba56f674bf9d59818f58251325a4c5f10aa2812544c2fc806a14b370b9c446abf86adc2c98dd83ece888a78a8ec7407895cdd33d8cea1b9cae92e7f9f4e8fec81232064bb7ad8c37f6258d6dfd0a760ea4f4a695d734fb841b760789b1ad3c8e7934e5b36cca5bdd53dfacd927a3abad36fd7122722d0c614e4d282b711281a1ea444275157265c6b7714f6276876c5d34c8ff3ee5243f800eef3a1132cd46067b39caffaea48409536fdf4b09acc148472185d6ce77904be2a7f25e24f500527b43beb0f0efa1a4bfacc3c92bfc63a8b3f9c06759b2fca2297b65984dfd4ea47c62db8a08395a99193686375e2f4ab81257828e1069e95f4fa12261ae6dfe55896bf1c4321eb401a6945c98e234b312fddbc527e367ec353fa9facefaa4af46d8d4eb4376dcb97dbb74f90efdac7656938555eb49b47ee78eb81456501ca11d6df07c29f19acf71c75d9868d3f6a346642aee4d1701963eefec5ca446370d11d7eccdc098220779e359418cde4527a0115c1b0b9d3d22800da87bca60184d04a21ca40015b01a21813115420377200e3284805600befbbf0506e61c9408ecac7873d75c36d222463fed21a0935694e159c31293b6adac5e28375b6e8d8f8ddfdd317467251da698b8429c019584e7e1e3c7b62b590d1ef9396658ea5ce3080697b2d0352da18366454938e8e7b6967489d75e70628bf7e02cc134956693a4e575156549ba2d2607108bb34fe78186fe4723941d11132a799e7b6a6e3042dbd6070a80ee9d048e7ddaf19ac4bccc37984909e4801772b7cd1491def5bbbe905e4424bd8e6bcc19a2d7e7cedb793d75efdf173b0b17ab4944fd7cd7143fb786b67a3d1cf298177c0cb21e82c95fd0ed039786c5240eb9f2b504e5262eac612f9872fd781eab41004a72efe87ea9dd45fdc17085569afdae8fa4fdd1cecb5e8685b544831171aa89cdfe478ecf517f6e464fde1987cb019fa3ef4e83f6a9909f7f879723085aea16a374a2f0ffac47c5980711b12f8676fea2e752ae33252f626df3419e7e358a62054335d447329bc43860836af0f8b7154d2c5dc0ad05d2af46092d0959208cdb6d5bd24554fb94bc2a9dc4960d70bdd673d6e03d6d1d4964735fec078158822b7cfe44e99ff5e8249854b11a047c18971a49cce6b061069b02de621dd49060e9d8ef2749dfbc1a3d10ae775dc7d9ace45612950fff995d29b26de8c6bf1196d4bb52e9126201d4878155131f45d15c2d58207387d6fa28ab1772a5aed866f4bb46bc1f16894589191d423379b27b37a5ab4f389a49a72f728264c92eefd8c04afa85e8d1ceca4eebd7a1664b48ba68ae99cf01ad4b861cc533b83bf6d4d679bf2e113030fb2be0079832fcd115a8324bd1a7fc6a9b45723520371f3595b21c95c067040465a69e7387bf96265d710d6cdb4e089e35add86284b09d46b6f3a5d4f7c7aca86ec6913dac00b17b00975ad8b34c07a2deba83bd630542f280b22d768e9fcf7c2a4a3a8b86da35da3e3836a0b71281fb687de0e6abb54440b77b599e58f4eb163433985b5543dc9dd784d428a667a5787a3f0a11c931011e137c607dc3fa9f04ad95f6279ba63957cd576add37bb27cc52c0c127e25f7ad67ea4db2bd43fa52ac3582e159d726c0d432201ddee8e36eee44a53ffac797a95d683a9b42488f2c1896a773af7aed21c287b678045a99f16f724b3dcbbed1ea075726b40069a31a8bccf178e12cdb11dc3aa47f494ec00015095e3b0c586b79c46f0ad7ce1dc362f518d8ec4c628270417c565b6d3f996acb7fbfad6f81739681280f7d3f2e1ab93fad83c74e070dc4e099c6db654e9a0f7811ffbac96e853990481c833092b788cc624b0ecc0557a529b771573f664216a4462a5af7e7fe9f904ea42112e75f4fbab958a2439ae0b624141d1eb5a4e5cee7a38934fc4b9483c8a1adbe2bb51933a21adc42b1b0245cb42825fb5c6000574f7d0f86d41695d05aec3f6308fbd3b3de47f17e23446f2914cb83c462437a373c8522be3422a96532bb254e3fb80dc74cfa5f5af7075db85e8868f85b72e5a9c114e8bcc5af3d9680992312a0cb90fef5e29c0faa58fc72c973c56e8e24169171399cee3359587e7ca71a225d0932131587174f4419ad995d433e24abb8b156eeb38de9515448ca6a820aa9beca337b53cd666b6503e5b01b08925dae3d91ed9f878895ec6097885c2e795acb11913d93a80ad2ac4e2fa2a3ca209197db4887a4909664feddd79f97454ed22c4a02d9ce0181c4d466acb828b794773819e80f5837f6fb957202ab6410559a32a97643e40b927981b7578af8f4799f19178353ed0a3b41067743e46ce76ce3befb6bee86c7d80f32595c76e7ea33d4ec87d8b19c6fa9b1a2d3f69858db9490e2400ccb71d7fa66cff7c1e669711abb1bdfde74c14fac9d04a126caf9bb5ab5a84110d5ae16007d46b15fcdb46c0046a1cd50048dbed5effe502b5858fce71fb8d55686e6e59ae21f0477f687e6f33a4df7e6805a1e4176049bc7f297544ea8aa4915b5a6730e8b2c3b2d200ff0b2054baa6d26cb46cf87ddae15aaab8cadd5c1e2d835adc7c0fcd81e42a6a72698d10d889395e4d6deba38a0bc77ff9442122033e0e247bfdb225b825f2e1891dc57b958e57a83b61083da7d1829d235e5983cdb253ae86b32bc4998c9b00a664e471163d80cd352c8066528ff34c1943a4a07322bc8176b3a9946988d3f494fe5769b9d97ebb447a4b5f60ca80073ddb6e324b8fc73c959131f1b5823bfbb85c27c4ec7a25e4f846b7e09afc532386c77ef36a5ec108e9a999c0c768acb0b653be3451f989dc2b83e0dff812bb86fcdd4050be19bf70b5ea9553e10b134f642f1b6ef2fc1ef0aae8dd16782ccec29588fb37b4fcc3c58b6ca06a948dcd88198ded0ad67cb45410e06554f9856e51880f1911bf3abe0c4c27663c7f8480754587990f23e01ff25920c8996177d652a2b8900a8c28d61f7ec89caadbd843d1ba7792b878a7dd119ecf37845ec9267988c0f3947af2ff6e118355ec3aa62bf6878c5bb41015b3491e361c151fe2bd4ba6162b93872f4cbacc439507509a418f1fd05a9aa2e77d5fecab00554874638061349471f2a0b9bf4058dadf5fdc8aa236e62641a90c2e5ee315c377f9f52d83811a97721bda5ea6a326d397cdbd17be3a81e4371ab8e59dcadbbc9ac94da1c50e4b605d5431338ce34ed9aefe851cf15f8e029c702dc1ba355f5deb0068dba91eb2c3054b42ded2ac2ba15bdb3baa42259ee1cc50844f020022deb1c72c3e7233dae06c19eb4dc0623c3b9fc9b05e6c4cb1f4cdaa33bfd033fd46904275c5bb873064f6cee7a422bc8569699f39adb506341c6f0fee328f35d9a966e9320e4ecdecb3045ad2ae246714b103951e55031a610bd89be241bd8921cec4307d29da4e6e03e89087a28d7af8a104ec1c0795db59ed657c459ad73a005ef9759977a213b95ccf20959895148d969c988825a75e0da30e990573797d1a16adbc6372ba1ea149dd10078a1cf817db91b32639e9b7e4e0d3d8080818c1dc44ac37572aa5308ebbbb9f804c85136290c71bbb7c17123bd4e8c8922294f4a664ab15241ca9dbc1fb0e06850c7d4208f48d1b3b3baef8bc2a6cab91ee60a7a8e9424968532d1af40e6c872afcc7ab75fc08e27784f13dd4f729502566a138a723137cf026ccf275cbd4c05bd7f5ec14e24ea7fc0679e5acaa1d7b01a783325b9b1c5cdc12e30045a1c4a8b5328376b252d93c700544bf93c224d4a29661e074e05b80c997ccc3f869b27287a575ff300205abf720dda05442179b15cc62f4c1e7099b664b095743ac5d4e0953298ff7526950c1a3c728750fb93a77abf94e66defd6d214ae0bdb7a0fd7085bfb850bee5407f3c9dc1a973cd8a0607edc5e042939c59c49009bd84e2e5886427c7b26864e1e51e53b7a2be111be3855370a067c22f7a65af10c5c7307db899944755676ea0fc52a3511c8c302bf6c2342369bef5b265b11fec35b850233673cd70a0491b91a777a3ef3d634db61532158695964da4958c9b01b66e08b0dd44eb26c744535939c9865445c80b2f6421efe5d75299afd016c8bc60aa1783bfc0a356ac17477b2a85da4622d3cbbd496feb5089a7ec7b81db171f97277dc24ba4fd3fc464d603c1f49ec032d08e742accd7542671d5914c163af8208d1aabc614d264623ee8ca4c44359921a77f9ba92928d607815b8c6461f983db426d1d0616b5b333ae1dcd392977ecf181d5258d5550d4b6b39bfdf14596b19bb7b6d77283fcae385eb5f1e2363cd66987f2774e6a3daa64230328d1a8ad6a8accc6095110dc05d4a52b4cf7d8d6aa7e849c51ba043e0a823f57295f66caf769555c3e24df49850f388912941b94648012d5be687e576d3f5bb586c56654f748b48b26195e3f52f18088fb0beb82affb87d7aa0df53fa49ca086edaa16b4614b543d3d6652bfec05f654725d0b9124c03d278efbee4e6ecb80875e511a58ecdfd7128ce61744963c6e8f07ac783cea320dadf749066dbcc391fac9a9bdb651ff26838c9747b7cd4876ee717610ee7865ffb4f6cc853bbb5f6db5fc7f0b89d4af15500f2db06518de6939a10af925da60cd3b235f128bd1aab5e070d1b7643cc7e2b885be673d3c39ef359c6bac70c3104a3b5f03f3121537c78fd7a8aa6a4cb3fa77af704301b0c87f2fa5224f87711772e62e2e9747e52b7edbed1d8849e03facdde91592090ba9216032cb8aa12f76621d24bcbe42f40247e91562ede15ca60e0e73cf36e34eeec7d0b972db486382914e00c06b540a96a4a1a15754213f8e9aeafbf78ae17fca807ffbad584ce691ddd116db74608a126b4b2bb7b07280925093009878f64c89faf29e986c70870a36f874d293c75f83515bdc9e1e9000e7f0570780e85c363130e2fc4e4f0480270f82543874761c9e189821c8270d8a1cf811c5e861f87aff201d209494a9492f0806489c861cf7d1c7af097971e58f038fcfce8613db487df083f720880f31c3ea6913f5fbe3efc76aee3d0bbcee12597095485c69c1c5ecbd20978890471e4a60568a5c75a784e6e5280bec94d50b4d2634f7e23372140b372d301b4d2632a7c959b0aa0b9dc64a4951e23facd4d457a2be0262ce040501e04010f3ac08914e0468c7e24173d96b50d4977412731403bb9f4177b082edc85ddc48501e80fc8052231fd0de0db85105cb811222e0429e0420b88b5a0939c72dc8fc845d82100fdedc75010daa1a9e0a024a7adbf1d990206a03f146e08f73bbef7d69f0917da424f7242417fae8b1082fe727e11427892d30efded0bc004fd091d85c75c3872895c2341416e420b408f692a5c0b26c472dc480b381ed482b621c9e94f720aa23f13de447fb10fe024402181059d9400edd4d2dffd072c18394c53b92c10799213131602a03f120ec402d01116989c080b1f0480c883b0a0bf20076ae1421040c2139de484a33fd881682af73bf2c308d049582204c87fe0273f9ee404a43f58d6c2d07f682a9789fe7edc25b0030101e92fe84234150e48c8939c86f4d7fa124d05ffd0df8d7fa0a9e01f1f007d48c8979c04168280e80ff600682af7c87d0284c89320fa0b3a094f8290f0242798fe700ee4c9cd8d3c810179921311fd053913fd91f0007cc80186aca0930ca09db0feeec7e33e3495bbc29127399db082fe863c4853e1562012e463051efae37e64051e4a8e9cc80afa23f2a027ff29c010157492938dfe4ef85ed74712fd057d08921f1f9a0a7ee9cfc77b682af8f524a720fd21c99ef4d0542ea7bf1e370992070505fd04fde027e9a1bfd579f4e0f1242724fa0b7a929f23f990158c9c707d5c252a10d19f910f5181c89027399da03f9b2b51c187fe587fa9e0e3f524a723fa23f213f437e44a5e82510929e8240268274d7ff73a9acadd4d295c9e148ca460444b21058d3ba2a96429e8efc88da8f022994ab69b8a4a20d29fbe0e4de5f2e828c11629c2a3a960ad3f9eebd054b036a2bf9aa97075ae692ad7d61bd1543823468a1829f224271d3afabbb73a749ee454f567e4b5c8ed4bd054b2dd9402bd3c97a3c21dd11f7d099a0a77a4842739a9f4a73a47c4a33fee5a53c1db8624271efd24a7a9bf239ffa2be1f442b3c90004800293000c2d394149122426e4111ecb247c67a00b65213f9247780999841bc9402f92859c481ee14332095af2205ff0411948c3ff64215a02215ff041f2085a2ac917bc0879e72164efb00c0290ec13634efe23effc83ecdd47ee79650f64ccc97be49df3c8de79320074ce5566cc894e72ba863bb47422efe826a2eb648f4877398ebcdd9553cfc9d97172f7d46fe48c95b7e39cfa2a6757e50ecba6a5969466cab4dc225fd066bb021ab648b36bce48a0c4022936cd330b0d5034d833db1d408006061269861b2b0390fa059b1095741312923f14683bec0bbab7d6c3251f30952f68067fd08c9671eade9b5f73f6744d3f037fd04c14970b6321f9032bb53686242fc8577dde00a65f50845d1152cceaba6378010afc052dc52520848290148989813c3546f8bdb0a504a955fe1092af0d52f943deec801ffb87760ff5845b9b457bcacc9eca1e94e5a0fa2053b21d81b9a98439828881bfd4a68f6bb6fc96af6ce71e10d1ec18e26e9ac0b65dca6ddb9036ddb659bfd42715e035e814358928d6180a5f767d9124b33f986606f8bb512aa828a5690618459f484a67a500d296b3d62921851b9452eb5c00471d0586cfb2419ecf428966d494d97996edc44bc9a4e4de235fe9710f7a1ceeec42d2831ee7b81e3d1ef34e8f2cdbe9d123fb0ef723eea8c175e7316731c6b8f3e57ce736eeec1c764a72ce390046edcf4a972d25e731ea2931c61863ddf9dc3bfaab42b9d89d9093f3c5ed8212235f59b7f32c6f3b99ae54c897dca94b70c8ce65a6eb17f9c2227f2a14cf79e83800bcebe438941cbeea3bba3e411f8946be7ee0b2736c789e9d9d9d9d9d9d9dd73452e0fdd5331b03816f7cdffa3bfeb9f60ede3bf9dfdd3bfad3baaa4103f757d15435f2e78cfc992ad04e908a334e789eebb8771c5dec7b2ef00936fa3b9975a83594af9defe84a867cc119a94a3fc121fa3baf3c348ffe5c00d03af487f74a477f7773ab1c38f42757aae3ad755dca75eb82bf8894f445fe7c53693fc91ff8e40509b67c85923fdff2144afee0b83c15237f762e4fa326508fcb53a50924cbdcdcb8f987f78d9b9bdfc854e97a87fe5cad7f5309c7639764e7b0a34ad04747850257285d01b0843f59e6c975f91e19caec3b5996c1b98efe2ece3dfd619ce728f345de8bb1cbf5bf5e30d817b423ec7068fde5dcba32dc391fc5c91fbd915a608837b2120c9407d7a78f93576518625797b8fdd5a5a56f9a994a53c96acda30bfea81255923f4b6ab63c851b045ac86c18bb376960798bc42375aec02f36ba2ecd6a96d5d71398db10ca026178d8c00221d8df6f012b78883ca899b7c0123d7c07353c3019ac70c8384f63e424a464245314d04d0c7e8b2d180c16020c0683c160416021c0603098bc71ef4ddd7befbd5ca4f04e209b9818f8a548908bb1fcf9512395d3470a31126675030c03fd91baf7a6eebdf75eeea6eebdf7b2388ec25b44ead01d1e3e71fe7407f2f011a2037de25d96c3ab584b1583e7689c18771004304c1783d3255f31062790168313281583f7d4c01d776f90345832cd73624ccdb4ffba344e182c082c04181c026130d85dd96b56579140aceaa81d63d448afb592dea803d35257e75e1daf6b5ecccad5f8aaf47256522ee3a0bea01fb0204499e783abf38ce7d2ecf5c5f3ea51af65b97368b7f66a2909fba0c72bfbd537bbbeb4529adddfab8704cdd4eba5c15ef5be226dddea7a65daccd125a95aa5b5d2d77dbd347d656e9787069db2fe7eb384d43f1d7c09947d2645ed6618a31986d938a29860a8992a023c85fd9285a065032d6e9cc0dfcd1004db4b93e1533ed205914bc041261ba1b9c88aa399881accd13c643765d764d37da6f458762d27ddf058a6951ebbba6a164733097bc7061996c803f4d1b265cb1c76803ef2ad2a7006caf121ff08c1e1c6bc82ec1c8ee61176d0c01fcd22d01c420e8e66187ef2389a4168858066203b8dcf179b067f540747f30f56991d1ccd1f442e5aced1ece30648981182b504d30d24da28022bd910a1b45a228a85c40d2a2598f0129d1250ab2d565880e34246b505aa025b5354b7050515d09ad0705bc4e021c504d4b685064b978bb6a58d1e889a404a82071fca1041c46529892474205ac24c1250e84094849a24ae50524a02044a444c984922cc0f444d5c72d0783f2c1de3964b2703d2019e293c2df98a3aa49981926ad75a5b2e18b561176994f100e9062f2c69d6e841039cddd0a305b8ab800722c02c0cf808036b4df4e0a00a2270b621183442e0031a5bd88059649090907e40a38c1eec5cdab08b36c6ecd71768a4410234d668c9c10e5128a17936c4062184104208218410420821841042324284f1a201df15f830836dc07c8044163d5650851558db100a8926a640c28331f0dd100a09227ac4e06c43282480f0629352ca29a58c5766526ee84329fda69c73d25aa994724a29ad94126fb9240a4a4965a694ca2ba794320535958b0a0c2184104269ed9c41a6a5f605a370a296ffece79cf39bb79452fa694b27a573ce7fd99cb37ed63ae7dc2a47d3e06c2aa7def47b0d01ebfee69c733e421ff8cd39a79caf5965a5130758d21aebbdf495c4a5524e6ae9cd6c5d73e9a51ad2bbe6d24b335bcfd09bd9bac6d6ec525bb333d5da9aada1d7d635975e7ae60cbd6b2ebd34b3f50cbd99ad6b6e5cc9ae94935abc532f6c5a6d16630d5b461abbd45a6d4699905e88823489b42012e88b16a01fb01e286f8f84e5095165d2c2c46491b0543da318242c99ec329753a9a65f28e87649ee6f778284d9ddeea2180245a6881441905ad3bd1913d2182631910b8d484abc540ba1cfbc4d9a8b71b4914b47648184d2768408761602117e80f6c7ed6a64d7236e30220c1641881140ec29718c1016f4579669b892704a08e12319f8c988a495b5d6c2664f7cace2880d5ce18123a8382266add2b6d65a6b6d50d06b7f2da62c76e02f36e5590113103d6bf0878384d9456c20db6a8004f3bb94527a420c3050031a41d040882e4a88c97410812f6c43c51a5bdbf2fc8837ec2f4811f8655b11ec0f8eb19ab59dfd6177aca5d6c62d2dd8918a6db394d9568b6d7fb1eb2f180cb67d90d01222226eb0ed9f403962db4779c1896d2f0306ae40d262859219db42282268c0a4650c9722b874b9b22d84ca0017f6622f62b6b50fb2d65a6b7b64e1c0bd9d076012a679f1210363260566071ba6cbf562881a0629c352460e148bc572831fe6089e6a96a40bc826504f7488206213305db238819b8c008d7429fd8075288049d8186a18e1011835baa8a106163d30c0aa0dc1a8d1850f23f0b6211835c078f980ef8660d4308303141217c8d9100c1b5b94b0fd6bc5bb6950a2440d0b54755cc76198109109a2cc182595627e3b929b3eca5e77b6b4cdf96d9bd56e75d65a6bfdab6e72665de04fa7428922034483f47a990934ed0f50505faa8e1ff0847042a8a5c45077f698c2b4f6846b179a98ce16a4b2473e35c67ce268ac8184a54b9d99cd7296d15c245f2ca4745c8a4af0009882aa81e16397c472306315a0062ffa090cb56f179217f38040ad0c7fec06c47d7e3e19c357e5bed12f587be27927962e775838252ff504f89387eae2cb9697f67572437461c134a286e002239a2070902a03268d96c833bb21b9ab974a5d0e490b16c102a1845862df6cb92447d8f2d5a60ea14fe5eeb32cd24aebebddb093ef5e9044c70f986e4be40fd556432d44f312263045a26b75419f3a035c796409f3f5d556faeb512d1443227bea5363e827b00b0ef194c46d2b19ae0e6838d82e1b0eb5d65a71b85d34e104c5e102693629a5843e74d2092f6574c176e50f84b0a0bf30b51267905286b1d18927d0937618a38f59529b669a3e92f747f38b503bc618e352f67b6917a3d0de69aa539a462c942e118d80116ac9eca187b14d6608a554c9cec84a4ce84911282fd4280c0485444949f7d99388b6db0c6348287dead2141b78098cc92529ef0b6212c6e6375967ada78f59c4e244c6a6ebb387c296b4826c7d1ae36a4d2a8416586ed8794eece78de636bfcd6f9e91fc7699394f49dc5edc72c3edc566f6e2535e6ccb5ebcd985a49682cd9eec3113ddec37cb32884642b1411e2fc2a889ea679452a289346c90e766cf3aedc5ec475ed41e91ea29c098eadd8faa38191d6557fdc8a9283beabaa77495edddab7057dd4a0cc660ec1ec6b6d82591303c8049dc148624f644a90bc978b3176b517ee23951a9b25ffb5de9a3ecde8bda48fbf58c52d9bbd76d4bcdab5c5a50c6068e422505c1a691524a29ad144a144a29a5dacca44501a5748b0d0689b4a1b673d8c01149860914af1ad883da73729f7ad17d4a577182af72e474a43a3db2bf87faa83ef5953e9a3b5be0d5aba84e6f57ba4ad59e13d5e9bd4d17a9b4b73dd1d7a752afaa2b94fad41ebc7609460536f8f0840e19f822765f349f7dce5bed44b347fb4b0d342640230c24ccd02296a9741558ff647595a96151474e45a9cf1fd17b2d2a0663993e4a69cf89fdbd077591fd7d51fdfc07d33ebb14622c3b9c324e95071f4351f6d4bbc77db3077fe4b4fd28f5ec474e9d2ea2bf3fca9efacc1ed41ea73df84d17ddd31f51ed412d03d2ecd17428616ff336ed39493dbb51ea993efa117dea463706b5a6ec4252bbd7525a5cb249d4ad84edda29942812804bb5ca5a291492b5d6babdd65a5fb3a7ea084d69eb6b985a19207f3eefcbf142945a6bbd078740b873c021f465e8195bd40287c82a1026f100a39658041c120f213c03a11816ece18bc0a86311d0876660533172cc025f458cb1650c228b0cb6bc05e08b7e0661c6968f715f1d97a00fb5400db67c84102ecdb02712d22c6385495a3a2595b27e61938254920542e3820637a8ae6c61c5997a450d2ee98cae0733d6e4d0829a43adb5561dd81c542c11a8ba484d81820c18d134031bd460072796a05e10517be0806a731b4205f1441a323d5833704825692b488091c314293893431850c82eaeb85c9c01020b986146cd813e08a61fa99b1d90b698316306f26c6e674ebeb07cb9cac03c32e6e00d4d087da2a69312d9aefc81504a2965bdf9fbb561841d84a2505c00cdea05a00b019248427290fcf9a07c8970f856ecf0ae7d781da1c3bf051e067c012f177e2800f6c307d97148857cc18770f822120eff04e8f02c08393c94270c48c0a144913f5f130b4f1d3621e0d961910f3924f2a0c320ff6152618b017e806f874d2b3c75f83515e0d9e157a484c34732f2e723a2e5927cc11b397cfc42fe7c418a1c3611bd0bb596912f49867cd517409f7a9d31f017a3caecfa28a64c7d952f1813c9c817c021364731d58ab59672d9edb35b2dc3feee69d7823e57c7a5ae49a6a5dcdb674357dbfbec6aef664deceff1afc6f28573fce14f71ed7b3b2538f8114b37021438fb1797602a95c588c56adae52e6ec121705b6db16427e4ec387f566f5b8ae3ba221ccfa1ab38d9c3fd45d9df1457a577ca989a65bc21fb794d4a8fe178130e3d0395426892147243adec35529ccd53cde56c9e69e4eb862ad51b7942654185c6d96dfbc23d51a8ce091597d516ccc4d26283e50610ada51b1e709472925c9ccd1509c71a39d4786974bcec50a1a3cb0e343f93cd6832005086e70b1e647a8cf120ea25a6078b0f9ca05c7e9cf1e16c9e6640d802630a418b085846e06ca64004e16c9e68e4ebe69b10cee6f9245f37f7d10dd93cfb06c4470f10204080bc80dcb46ed8701b10203e3e5aea0201726f06044896d90a8290114408418810988f8f8f90880195a6bfc9ad9c314b6391af8a5bae1db18c9005c3583d527d646aed2cbb37cb62a09bde52aca97c6dd9cd0f80adadfa223457f4aac8d55b6a7596c5b8713b460d73b4e02f46c52f7ef922ab8f59764fafbecf3ebba1d68e5f84dd907d2a73406b47fd4dd9574f69ed98e9f845fe7cb41b8a5fa895765a0a63a6fa64d0da3bfad1fd4531bbe6c8f214d8bef1cb06a486fa4a757d9623d1ce6e65c36e5edd85eae805880f187f3a9773bd76762ecb2df9aacf9104cefe71bb56224bb2f80241807b491623803e707f5b48de7b513856ca6eefe918357beaeb925e8a51f255731481618cd5323beacfb5a18f1af88b513baa4645b5a40757789c00771b42618145191f5c808a170a7085c203344d6460c134051630b0580a8389ef2d9376564a2b9d954a2979a49411afe6953f334a29a994f272369093569b5ff313c279b3219c509b32c29b26ab66361a279a29291a0821a438986dc468a6d2362a3d234633319aa9b48d4acfa06a6cb322118295ceee55ede479e6b287e59bbb2648d7b8eebd37621a35b95811850ffb834f104a0c0a9ca298d00006d03cc1c36cf292e68a2536231ac8ac5146cd0d67ac985cae5043857ca0a905300853060c282618b7032ce056adbde280167b75ba5a750087bdbaaa4bb282647457acb1bb735d920e7eb9820a1d5a3069a82b7088612079e1e588e8851559d02ff78c0d60993744696ddc0d285dc08b316b54c181304e40c5ec54625b0e6cb16d6a5b6badad628b12363de5a1034f154d6c7b2d151cb0d65a6be9611535dcab04864958e67401cac53e09319d18a14622c91eb8bf8ba948c1929323a27898c1131531d062861717164a2a8049188f1164a0870bae1b82d98193193b90c247961d6851811d98000736c2e031c271411457ccac59139b37aab7d393a79e8c41d86403c71c5faf18c5e002671b424df18507434031850a5c504a0821a432d628bb9871ce99d93a29a5349b76d639699c73427875d8a69c137eca0c3999e79748e78c311ecacb28c116e99c93b26084c1e61ad8a54c770a241ec86092228d1cc6589a820725319ea600a20230589ac2081ec6809ac2e90632a26a193268c0e4400d17186f08260d1df6771cd2c08018692cb1031ce016b918bb18a59c52c6edf5028128683e79f5f888446e76fd5dd3734a2112ba604bf92412612182208fef16391a6f2bc7c2b3a8c50d053b5c601965193c378c0c782106195e908f686478216628398a9297d4a7f6b844b36060cfc33875f001dfc727e910e2834f332249b821d004726965308d724e55d376d919c9d8762dc7a739b9cc1c9880f69cb71b45b24408004a48d769bba9018ea773de9c118b04c9d79c954a092f9c3d70aad9828a405953546ed5d4da2a9b3ec218dbb2d67cec7a043cb6ba2b48fe84005fa99ccaf52134c15be60440583369a780ba014e6d0825451a3e8690e28c1460ec6e432829a2aeb665f4a9d4a65d0c8120dc5259769ba57eb56b7a48ee2f6e6fbb67543f9f42d5d333aaa74fa16a7b6f964d2b76862967187b6b96e1cc663c5b4afc7876566bfd3785a7d6ecf6fe8b99f6ae1e82f2f54de1d936d6db5cab151ba70e5bab556374b58838216a2bf5dda44024983e9e9eba4610a3f6b25bed65ba08ce9e59290f4f4f4f7018f18293524a338dab9e93ca182319b576a952d62e55c71438be4a69350c744f3d05b6e52c82ca1b1b3480e1c3e0cb426b0d1c2fa7f0ec18e3149e3dcf13a714f16903f7e9be60eb42afb843b463522960e9b63293598aabf976d92929678c12069b3adff13cf2e7b6648fdc1c2e93590d60f9ec35f37cc600d77f98eeda35a148481084792a9b64b2ce6d730432ae7602d011bee6ab6c4277f6fbabb1968f99eeb867e4991ab73c805fd76d60082505d37e9a3fd58b33a4e8210db659e3c504c6673e4872c1fefec396367cd0805b5b6489c2cb52144cecef4544e103de36848a62a9e5a262a622a5f44a09e79c73ce39e79494d26cd23969add44e29e5945266f2be6094c6ef7b5dae9b35b0f8e037ac5f26ad36bba9596bb5f225ef8f311827ca7fb5555fabdef5663745b53937eebe6ed00666760c7233b17bea267bfaddd45aebeb9ba7347f5987ba5258bbd93247a98b7694d65af5a5db96c6255f50c5adba24f05072f3aa99bfc9755be0c8d9dca8ad16a594bb9956df0843d549c9cd0be16d3229dc340a21b4787230c0f1355575f637e7cce8cdaebdf207de4a7180a5a473ceade3b0d8b009f8e5527265e008e19cab2cd35524105b21b1c6524b2b0dd4d635965a5a69a0b6ae5943abad960c5bd7d0325450c69a32ce9401633c53c6cc4119136a4d171c37395a5bb5569bdda036752e417e7435501d2c9ab05bb2cbe2a214a4c496ff766cf81d48246e8920c821104875a82ec378263b60e7248ba57494d9338613714b4c8a4848a94deb5210c5002865b48debd2f2a203c5a170bb255b077b71af1712a15be7352d15bb244d97e7aa150eee82b9588129dcb0eebee068c375e1c2850b17c8850b9c40383155c76d5a54266f78c117632c9960192424a41b9aa0816b820ce73406eb092b5450a4e0c6179dc4b277ec8fdbdd6119bb3bedba64815b74832203504f8800a7f9b89db556e044164e423441868b04504d54e00699a14698113c098162424c1c038a1928818118bc98c0024b21934503496819620359d81c3c80a4451f3a5cd26c7afabb04984d8f97b0c1a63c6c8051118c0ecfa64d6b36e5e2b4e95d9fafcd8383314a9c804c53139b5eea005320586bd3245ab029941248b82e165603aee86a0527581981034427040e2f749cb1c9a085458e0dba2daea441a3b855dc242db57ad84a80a30dac04ce96ae0d17746d58e1eac1b526cbb6869a6e0d3170769093a56bc30cbb83141b2758ad41828b46b5668bba0136d4746bba986bd4c099a00d1b562658b3858574c5f502098acc0b1acae03594e8aee83ac688d41536c4d8aea051c65e69b9726c08e5010f4499800607f07737f528de7e105949795c3b50603829fe04d20e537fb2e93fd134edddbfdea5bdab6f2c51460aae6042aae2a4e9abedb38bb9632e45027be8efdd6c96dd669aa76a29b019b5411e3c81644c27661ef9caced26480716c18e80e627d09910bbf68d3de3dbd8c3ff29c5c6de419d9cf6b8fba48fb165347927b11eb9cb6124be922ed5d113ed71dffeaa26df39cb05e5fc47ad5de2dd2eeddec292df0b32cfbcd32d6b58d9b167792ce98bd5eead888754d7b29dd2435fe91bdda357d548fb5778db6b3b41f79f746dab973fa086bef6a8f88c5fa1136d2479c3ed2ced2de2d621deb2a4ef7ea22acd266cabbe7aef69cb058f89c3eda8eb7eddebd11fe9177b551f7edddb7145665a20c65f664d7f20bac55f62ecb328c6941b3278b58e42b68674b4c536a4d1be4d956abcbaf3a1b1b9bd56ae5c47b77239823078e635d25e7385ec57b8e5b8949d8c91f79efa0777ca39cab728e737ed4ddf3debdc87b77a98b72367c2bab17b5be7afceac6b1ae62f31bafd2bd752b31a9d25558c7afb2baca4a0c77c72fea8e2f8f6daed255726ef32adebb5b896115cc717c231c57e9a39ce3c8398e1f79cf7118935d124f7b91ebaa17e9b46ef491cd6f9ca5bbb7eea55e74f3d58bd4c70c7a4ca27dbcbf70cb6faae7dc087f471fe91c3f47e7f847aeab72b2c77de730e6658fd39e13d7736ea4f31d9de7e8fc4875d7a63d4d3b715d7503b8b4a7dd4aec06d0d19e86bde39cbbeed2559c8a5cf77415a873e81ced11b9726238349e3d32277b9a2b7b5afcedbf6718cb89da8b5bd7dd888573d63b9cb37e74e369ddcdbb1be1b08ef38e759c1fad7e93d24e6ebeba016eb497ba95d50d80a359bfd15560dd9c1e91cdbda2ee30c624de7eebb2973a8cd9642f05e4053d4ef51f8c2a923d267adb2cc53ebf90a1e46c639927ba70810e9e32ed31a1b7b75a4ad534c6b2a2c9951a2222e882572f3902cf675789dcf544f2e7a2205ff0dbf69b67fe22929ddbf6cd6e5151db3fd8e6dab66ddb52598bb0bd7d9e955d13c8357bb61c047decef9c73cb36752d9522ca02a77e9ba4e007a1b8772b9b1cb77803db1cdf86e3baaee362ace3ce3a8c6d94734d208eebba23d6b9c318c775b7d968c7499b89595fddc8c6e62b7de4347fb4ba11be8d66d91cff88f5d5eaac17adcefad445f8361792b24b01c66e646f7e35e75cadceba951b87bf916d329c3dacbca93a4e952f9e3d54c70af0fcf743bfbbc10e4ac2a8e9a106259a6a30c40e492d08030653982fa830636fb03a2d68c286304a6394400aab0318558c1b5610b5c54c0d586ae982dbc2cb952bb6060f2805f50086085090051a25184115b11578e0863ddf72cdc3a0b2508305582e13e6e2ea722faf27a8a079844e912ff839e18c9762ec72fd305850107d3a3229a5b4a5c33329a57386286f1adbd4b822f88b4bccc7bcbe809171e67e3a1066308319dc6aadb5d65a2d7de40e63174e7f3344cd3066b395da0f8aa182c6d7b64f368535b395521d635652334869b3c43441676064bcbef818971809effa8179a0b4caa0517391b09274c5a5a02818547c8a5d2297c804d1ecbab4e76193d8658628a6e8c40c63b643910f0a92d0ce9066cf25f055efc248544c970be309e565cf29e1ebc99e8f51863d9fb62836388120661d679bbc719f6bab609324ffa26cd5b56c73b86995feb46df3450922e7375025e0b259cff1b2332a809be7bce626dc59df62d62eb3bd0e13e09bef759800cfdb6b9afeac703902d31b8ad175d80920eaefe611a05b4a8edbfbcb62e521eddc6db04d86d0475bb1ec6a65594aa46c36e3d8617baa57aced3677dc37eedd6137b45dcbdf0c43da59f66a18ae24d25c71336c284aa4ac0eb7262db4812f6c7889a4bfbb39dd1d4b24782eaf20d02449ebddeaac434fc926a5dedac36f96bd4dc45ad4f4070314a41d03dd10b0f138373404ac705e8e81f5ce1b92c27dbbd552585f5d062dcb2d7f43aac3a8bf21d576a1b9cdb0a36c2599d35f448236f90171d35f44da753b772119f12a07cd9774c1107713d5211c426f1f5065775f6596a6b79a9eb03a2b4b4969ebc5572fde3ea5691886b6738f7a6875d6ed3f2b48dbea08d06df5d097b6d552bac32ee7782a47a4cdda3547a42de5e639cfa199b09e73d90ddd3ca789eada6dd6f2eab06372f39c9c9c7d31d055f68658bf39eb25c002c505991d332e764d6e76d4526c0452dde0ec7532de2a8abfc16e88fbea36774d589f8da68756d71a2b472fb3dee5cff5c9b0216641c882c75c406d94bbc9ac1bfd459b3f6ce1d6c9707299953f2b4838ee23d2bc4b37c9defde6f84ede6e471638daa7e2eebac76fac5fad752931d0ddfa77e3f0f6563f40eeb8d29fdcab6f5cfea06c2e8a2a43f1b27795cd0b5bbbbd97a1fc91e190b5ba71564b47206e9ae48b9bdbdc856412ee5df6ecf190ea9e3debabcf72df70b657e5d50ae7eeaa5577782e7fac7faa73d7b2c7d24338f7549e6a75f89caf3cd5f16d6eb377e3ddedb79c7c739cdc3ac769f9e639593bce8da6a9f4d0cd3d8ebbea387b9c1e627d75789ce377d95bbd3bf7cd266fc7695d95bfb8556f1d276fbfb1d19f95bd1d6e57e5ef861eb2b9b7fa567a8875acfad665acca71af6e337e97ed6d32ebb01b6261fd5959e91828d7e5edb06312c28e31c429735b1d01b9777400efba430b1c0fe7032c7c96e385663774b3e373e40e33738bdcfe5a0f889b76f837e32ea5303563fc1253293d3f9d9de97ba189e92facdcec4ed8ae6961da94ac54a7dd085d707c2a03c2f12c098eacc304584a03b27fc39de9b8458b7c55fa6d76f84d38eeb5c7b93d0ece715c38872e1d97628775131c1db1e4fc669c692109378e2cc9903d395a96e1e814570bfa581d976aa10ea894ec98a972182a44230000000000d315002018100c09450271300e26b2aae90e14000e7796406c5099cc634990c4300a82206300208600630820840064942aa20301946a70aa9e4126bc9c963159da9b7e6a1782514880c1f32f774369bf5052c700b13e82cb399fa52af277b9f0d0be18b0876bd0d1747de2522fd6b50b1a412694da9fa8f606ba690ea60c289d1859eb9757a711b4702dc182bd32a8bf5bd29f58d408607197163c02efa19be661da82597e4de90c15f52dd204b4dccbb155ba44abc55220889d5250d440e75fd6a27da565ef7305e2b31502c2c19f7d8e10781857526cbfaac8d603e3898e6577258a12a014bf51ec1e95ca69561c00a6ddc5a608be431d301860c8ed0e9787ed2406c2825bd58d10a623630f58985a1801676ad2893ee0aa3da594a1d5b4b63cb02e826708cd6cc5497ba94dd1aca2a9dd5dc3dd3ebba452329d7322174473a262d4a6f510c7818802106581ca7f830da512e18d059778e5591a15aaba37ea057c195b8ab37314dfd9e7993adb4ab593cd51fa3c57d402a5b839d5d9a2492cc4404247883acc4420601484f3c3e32509d7f4d2c15b8db31be32fde779d62291ad12f7c08e24d5c84601ac8688684c6819f30fa0b6392a7619a5db3e8078d97710c0c3f517aaa1510eb405bf551329e288bc2ff9056fa88ca11fb7dab724506fdd8fe764cae53dbd5447e6898da82e3324e87191b76b3fc09ad65d42f271fab29f0b484c439502f24c003fc647a0bcd03911591df42bd02406a38b8924d50c05a00f190840ea00711de30518268952e84556ec3413eb6469482923289a966e568a7dc7aeeefdf159baad3f4b8d5e50bde370db8674310eb77e59379d9a708bb8de482ce0fe90e0eb41e9f366bb18a15b55730320d591aada7180f4708bae3668f6e0678307549de09f455d8c0b6cf12b9aef5a36b5c8e461425e7cbc1261836083b22a328e9ccd70fe11aa5da44b57014ebf535d503372bfe085f122aa26f168e462e048cae005da3d801e6ecdc0fb443e894dad8b204ee41b52f491bf611459364f61598c5ed6f56646f12232159dd37a3f51e093754c77ff125fb62f8a9a21c86073ed636a8306528554bca2a25db1278d603e83e8a7aec0f352028a6792710d15705a2807129821033548d75ec52cbbf0c7ccb466dd056e40db05d28c9066c9710da27c56ab21b26747771cb5fd6ec1d4afd5824a310322a27c516079ad0322ba7f33d30d6d017b8c47e0c635085a7904eef619e2333c063995a1f648d4af8bfed8937aadd61cfc061820cffc6434bb763c34a9469f74464d9b11014c0d82b88f6c3275a18af3fa2b053eccbc81f34f059cf05e5fa10286f6b4eb64fc53d442c55ac87a72a648b153e835fb66d132b61ad1adae757066402db534052afde3751c88106a10cadcb854350d5eb2d0a31d335feffcc303e46f324740124ff816f40f4aa2d945578ddda388c22a4bde6fe2942a09285cfac04877883264e0de93c8f505097a28be9c0ff28e7fc4ac6c8de4b23292e46474a3888090fa88f0a431e962ca8fc4829dff3d90755f0dba504acb0ff256e4643d7c8a090b63591f5d81e4bfd6b04b0041be29c93317113bbcfbb55815384933a3291b2f08297ed41297e88123c8732329ddbfc545915e56a7550fe97e658ced39b28d4099f935b00b0f5e443b20b0a2cc3f68fb1b4e3f42936b35be4836c0877ab9486a0f5081f347c59d72f0940ec17b1deb8107098a7392149972c8dacab1655b33e7f99a6adb094374b432c0d9298a45e82d9906443b380d9063ac1eb9a80363b5814adcbca7232f47d5cc19b98fc726f8ae8f807244683456a59b43994f645e2bd28e0f4ad7926517f646f4998c70d332c7a56300922c1a5e3797e0729fb9d1f8aff46695713a835c773c1451123e07a2a04b04f943c88c9ee0b687c1d6aeef18e71e4a3338505bf8109201099ad46bbf7c2837dda08a6ab02508bf0b3d5a1ae930a8ef2c208a23340ed3ad630e46967a73cb17c45e148f5c1c9a9cf4065f9ec912ac3f9ee6d11830f61eef026e2365957a02f820415dafe6ae30738c188b31204a109a36d95b03b2215fab322183f36f5934ba754137d1b0ef3c4afa1758f90fde37819d434b84c74011bf0d6f5883406a5742946e507d3c0e5bf204f09860bd9d2f2ce7326f982be1383b0d8438443745c9eaf514c7ac95db1d521151327b6c8d50063ba8a5882fc7372186824a45a886b788000e2db420d801a31c8fa1d76bdf45f84ed82478a347920e89bf93e1e4fd84ae03e90aa43c32a7c4da37295fdb19269b69b50c0fd179dfbb1f403f33e297b3bb1df44318c470ba591bb154592d76eef54e5b91e54aca063f1505188fefac26c045bd6d53a82b32c5d48e6995950a0a5161dc71ae261c9772400637b1f6bd1d3a8c2c58516d98523e787c62e072c7f421e206552147ba2a8286f120fc768f8504ddd869b109e1929ce61a2c7315011398dc6b07cf5f9f80647806d0d56fc90fcbd6967940dee1e67a841c703847d26dfc27babc58244805092230346d4b6c81c9086625d49577f793a64fda86db5fabc144d5e47de5513b60eeccdee0159c5786939a7224193acaebdcdb915b3ee50f2c71720b3158c7fd940343018f99931b24577086451b9856323104308868701b0ea87945cba099cb6e789a1fe861cb7a2336cef279581d2e13c1b889714b908074e2028857e04be0ba074e77f7edfc0d4022476e3c2034199af049d206ea9da807521d3741495685d4d77ce4dea8ce1854cfa64592bbce8da72af921d075f4fae73a15beb57742f29773af7c84e298ce4496ff7ad524ad47b96d3d46057b4db5d3de2bdcfae76123ad6456fe4feff92161ec38e7d4374d572448732fdc518acc302e148ce9b98951f47d092036369e59f3264b60ee3423cdba8bd1c846425ba95cbeea80b7e3e296b0badd524bb8dc4152fc7fa8e9f95434e31c54367177a2960930e2259e490e9b3b03298787912c0303d3b43585bd119e2686ab6899081d3b6bfcf5bd4d23a10d760879f7d574848956e50e411c831b2e5e698828b9b6171471dbbcc1f9f03ab5c84d9d5f7760b13797d82e5755b71f7017e7d60118f914b1926e8ef11c59286b602ac20fadb597cd132fc4c40c4594d3b7acc7e809402db5066463e7e5d48c3d8bc678e8519807a0a8bce6ad127a1e24d452d4ca096b373390265b2954b8ccc8d4b974fc361668f8b47580d2ea00c879dc83e700c917592d8b91167bb59981a29817f69b9ee6a806ff97ca8c821180d09468c0106221275b05042773577f7eb8fef0f3fbf7d489b68645de51e027a1a9b1c9ccf2616f613e654ecc0082bc844467a52a42f2c00c1ca99479ca6fc297dc4a235140cf204ed843676cac14cc7e770000d6fdc65404f03142fc37d715e945950341ad1c755fbbbff3702e311cb9450f23aef20dcedde5e52e6f02e4bd2fbe7fb0c6882ae633e0626e0f7838fee265aba10dae4817d1eb425c0d77b1a57846c2cb6c15bc93833a7cc250ee94debe58db9a8c0a6d83a014bac2555eef64801b548eb46f7ba60d2993688d86fa79cabecaa0721be4eb4f521df625cf7fc864c188afe2baafcd7e99e3e17730515795485e99253cb35f7b10075c878086ea5b58931bc33e6260535fcf1cea904697353ee7a66969854768685b721c4c67e97f950891cf6631f34016c8004ffa45ff2561350747fec1604d219e3b26e26de4a9882b55494af9706cad4a88f73e1f9574cfcb85db1e183137ccafa14d378701222c9be12f621639bc9480cdea0707a13208a91ac6b208c9d1f20981a3163c3da617b87db3a526af0625acd3331a73e0960c6110ac8fa81d80baa82b6b5480ca1353523f79f5f314ea0a8334e2814371860230a1ed33d3a98efb10b4a7211e67aa1c5b9908ba1ca54c57c877c42d66992ca5e601bb3ad8c34c9d8305b6554552cf3de2f6f15a1ade069c88f83355cf4a839a04d83c11e395888b6275f71518ff1a0679768233cf483ddb2bb3d3e326e6166defd884c6c16b208ed2eeb989469529213ce01b111826905af023fb7fd6146df1277b309dc28e102203045ce2080d9cd81677fe30b1731997effb4fe988f0b34f96c8920c117e18485cd32eaaa74c1c1f84dbeea2cf5096d66ab9cfde0e65cb24c82554e9165476e9d4b935570cb0adf7fe7c15951bc03c26e12295d8da204220424782647902575b6560e172535669f034f5664e8d9389e9d93f58bfeb290c4b5d39084f924bdb2456a75b7dd6a568be9531f0a69d372011842c20567a6f1ac496c63ae4f9b48bb1d285a412afc67284a350d5bfe18eb049f43268b998e6980155e8f231c49a5bd4e8d4e8aea4b2ea83d252c156b08c973bffc8b4498bc9ab33bd5b0fdd317e160b031bc5753b6950367b082867da2d11a5d34c5355dd642993c54b5feacc3b1448cc72f0ad4df1159ea12335115e7bafb71bb0d76af44c9bedc2070fcbbfb36fcb88ab86684929e1053925736ad2e88011c731b293e0fa73c202fab60adec36dae4cbf0252d6c46ea76cbf8d2f59122ba5c01057595955ae2d9acc87ab821c423460fb5be1034fe9aeec9561adc80d95387d82b0e924c6ac4af58f31a20541537ea762b2fab57422b684ca95204188d823d2f7c9c900e0ea445863343847e43520938bab887d81538e8eb936bc4aae9b8a9be5f18cec1ad2cf1a767b2030d5f1d85bdcfce8bb6d21806c9e7f0b9f77b86be6f633d91ae2ece2e826ac4c4e31b875e25e476b2ea89894b6805d349bb99d41c1108cc84af010bea728dc5768a9dc8a3d8f977299e0f76b3ee3bb3d4bd727c569fbd855e410b93475dab51d61e42a40753011e3190d58b53e4f93b6d64fc384e2ecd106f16fc0afcdfdd70849d953a037b60e9eafaed1768446fb468287d11f4bb42601f8e3e41841ac58826c6189acda3fd0a70c9d7792f368791418c8e39e4e26eefadf0ed092784ceef4799be02370b075032c3179aa66558db0a2397d5c8a87b50ac49661d149e32ebeda5b0edc419afa4c63ba19e6f71eb3a1c2d2b41d5a4e357eca4c3974bf00fd300ff66722210ebaa53fc0bbb239ebc3b778e603c36337ef5deba04ca0c9d388a917907ef7539abd1cc32f9cc4f364449ba01e3b7c11dec29590ead6254c078bc35cc368b88a9074775575c4b084718b99af999e57599e1c1f619a740200aa6caadff73508544da8729054cda08f6c93ec723ef55e7a737fc8d35c10d6d8ba7930755c01014d1a930faf638b151c41a4d93a982645264c9c6d1a5dbe08b4d937bb900e7acb4ed2560731fe6bda0f946cadcbf4708fc2e0a2b097b0f259ccbe97460416baf5dae28bce08d04050bfa6cf886cd577e3604a42af3c3507587519e0ba5dc98eae3c1e5e95925a5de75320d65ddf7163de8d203d00d12cb197c4e1093638564893641620fb3bffdefc88119cb59b7a4790a5cfaa07e76f1d71716da62bd8c250e082ea9470df3d462259532917fc00b5fa8d9f9eefc917de2483cdf2fb5f6a34c0fcc3bd0030b7fb0661486fb452f6c508376b55ea3c0512aabe3cd9e37676dad4f1119aa4cb12574eaddb5ab31a4f0caa7bb268493cbdaa9e4ccca2e1082565e55b6a3d7cb33282a6a14e64b95a7c4272c5a6e43b1213e360e6ed236d447082d97eafa04a58645371a6990a78a2fda40f12ad972e1e5d6aa9f0cd3498b93096ac25c89594dd6f262e006f185e3a0e811ce53433dc0cdfb887b3856044e7f3e105b0f046f564fb1c9cd8820c381dc287e714e0cf0e14289fa7db38944ac40bb9a15b285aff73643e5a83edceb5cbeda46b44503638bd7fdced406e75a00f1012f6742c4395dbb78d0b62073c117525475de6c41a9979a659ff6062790c6cc20101e43f59026320631cc26855fdd56bcfb43692f9e85e9390b9e10d720b74c523304a049f6d5a25595cbf820c52a41c5b683af0081a627181712e3597b6d002a123d6a054bfa532eaddaa1f9c2fa43297d1db09da529ba77277c7fec848d095121bcc1fe0ea2e4d71b7804deeb1194f65b3a3defbdeb6ba0e8d7be27454f985105883d9f19c009c25ed2f558c8552055d4fc4e7beb8673e5feb4354df06238859f31b5cd5ca2c1985e9d7dfd6ea5e4cc78b32783196a30052813c453d402707c9dd481d22d66a6c454cd65959d106b3961c1fc04838219b66f3a9c0d745895f849a2d68e8bdd2768ab90099289e4ff875b174dd9d0aab3844220aed91f4ce8c8165a5cdf54cdd40ff0b4b683708b18ea4264ec849a159cf2500a62320c49be9d0908afc423d8ccf40f6f16927c7c9e029ca1e27ca8963c20a8f15eb27cdc542102bde92dc18bcab89fd3cd6689f698741cb659681d73beef9a44d50cabcd6ebdb92a88f164b6352d93b05d236848089ee5f1a07598f33279907e2c1b9fc55bb73df30945321dad79a141916b23296d07b9d2170dddccf9fa146534333a9985739dd620fb3bb3c88c2822f7bf4133e9fcb6cb960605fcc06cde5e5b94186d045bdccd248845f7298358e49832b4a3ce2c0238747aca0e883ae39af6f4963ab029ef3d78814e6dff8220f5ba41be765470fecd3209ba44955d00eccd9fb924ac175967c264c6a445f8fc5ef76651d571fc7e4ff731f0a564b408835144d87b883d7aa3f24750404c06d78c9f065b57a7033331883a26fa1d3de69aa65f453f6f732b623b23a21d6cf1fd9a35ed77b144ccc2cb0ae39a7b744f8eb4856303818e5c82d2018bf22a3cf078e359753930dea267f48e4e9d3db1d5002706c724e494e462ad471f7eccc734b7dd02a384c4f402b662ff33c35be93c06889897d57657e7977dfce32a0f6d02ce3adc77b34af9f22263ab404f88d1d9573e6a1f1b1607927e81fd79a4d1e8ddbf3a2c8e1a92f8141a22c1a22554bc88ba5be93af5a54ab608d1fd8cf2ef04404b5f8aff50c82779c3e0e68150535ce4e04bd97aa28541bee0e214e14a204708356bc113cda25fee0b1e50b9c00645de6cf6ae8c113225a3274a6303b34aa7408b8e5c5e35c5cc80f10f24cdaa6c87f18b4774405a24e301b712408287d9e48a72daa726d863790fb46dc3543c8b7cb7a3a1394b70afe84867141a6594d2d36040908abb65d6eb539929de81e27217e49450411fba87c8a175df0beb3f81c64559f45532bae17626adfa837056872bc8f51628726817274d0c17b6703aa0c559397133aed1a7b12bb1d6029112b79cf5a26529069098aef22f0331c814159d4bae0cc91db603c5bb0e3481b479f951c67a06f075937d19a4e2d4cfc7fc2e604f59c383a88f1775fbae93a4c22c529a4581a0ceec498a782cd6bc6991f4c08133f7b14a866a7b13861ca448d738ab9a8e60a2015dbc2db192097bb1d87df887f85cfc2d462cb6e1c54ca4090374bb12e91d331c83da119cc96c8dabdd859546c3c69be55a6dd44924ddc6941e219f2880595749d9d70f9ead23a6838d09a5c48cfb800aefa1d9978105d344d13eab180a0e578018e103145a6445950fa86728cdc7c59ad19a7030f34b25f27f7fa0651f8b667db49140dc1596c6fb969a6fd2b99d1ca04e3b380172b77aa7262d428127937d0d8dee9f40ca82450a11a197bf7c4b5db0b1bac56f7f28d629cde4694893d7ae88b29a01bd2a2944a8afd05fbc0adcd3c32e58047433ac6449c48f360bd922d28f180b8c88629b92a95bb77501769136a98b3f2a12eeee8e53804cd74351a6b2264c2444a240b25c9330580d820ef0cbd726f6e1749f6faf279e37d1663976312a4b485f1e18abe117d2ecdf162a1d116b18975bc27b6e806df24cbc0618574485beab41b8dabcfa9e0530fe93d20147ea837038e13072a496be7c23ef60a074574888d979b6a690a4cdd5b0f67921f20177ad9b782d86ac95c2b4acd297fd34d84e81be44750f0503ae406e6d909e9d0f46a9009484942124af377600b4a3037f68948f14240406a38f501aa1257f4936d3a0736288938b80a2110c6a2ad1ffe29445959a62ccfa95f719235e4cd94c83a863f75098cfee97cf6c7d5b0dad3759b35db5ed8128cd0322919e2fab0b7d08ecc302708b99df12232d1c824344fe3670a0c21534f89e0bdd2f7740dc2ec794de2728657cf141e0456cbe33026be29b8e544f6a4e655bc6506cf9e9540d80a3b92bfc78729e5523c8f06d4a942d72fb1bf7cd3451a01c0904e7980ee45956d23cfae32144941d336cd397e37d509e6124216742ec8548210b9a6c9cece18671639c6d704f63bb6565f7690f7678721a690af9fc2987d0548595fe30dcecabf6192d83c78f8189260caee6bb691d9e5e1c388a1a4089baf06861450ecbcfb02efdf7cbf0a8ceca30eb394388959f2f2375cf46470a9dd6671e306563d697e89c7b427bfa7897273292062565a4b0a3f85fe76a015cf2ed6e4e33417aec98284e41dd54f517c69324cd5892b9cf478a8440b876e37d2b6bdf2d6833e91cc56071aff6dd82038f0a88bc643f7a64bc074518f8e200719813b7a096f4e435f632ac612c6657a4ebe74d23aadc5b5134dd160a474a1a0034352b1daedddd909917d152ceb277cfa11a74973f15c2803abc6d71fe45cf1a879adc8824246f99a8c3e00db7b29c5e1b3058b7878fa9db805fe1da0f2aab3e50f687b5aac7023f69c779d41110cdfb54beaad3db9b7e139be161eb7b381debd203c96d3b71dd5820e229067e67bc44cee6f5416fe2043f70a46a9ce7a88a4a41b037f501374cb9968144aa8606ab69096c65d3b6a6d6d9f9bc845e2d09011a0961b64011f35a737b46b4679b68599013b56e54b5e277eaa384b819ffdebce902a64b8d002c094124e91e1f17d4b2bc8c20d23510b6c9817e45ba782a94284683fd4dc18e474dbb636981adead3251354106dfa25c1ce77da0c0130ad39f1977d592629e1125846d6a56336a105d8fb58d1ceb641ae013772cd3ecaf0b48acbc4bd3ff9b70565709f5989960397a587c4812e8cee5d01e27ece34f5b16bc86c37312ef8cd7307aef4e6b6b66ba1fed527dfd5ae2d9c77f3ae61c6378422f422e9ccc85541904d391dc4fb7a0153baf24700fb94965adf575e1596c694a3d3a381c6d2db755f630c490017e9a4ddbc505b0bae695a6d42dd2a492782cb59c5d5bf5922af9b5f3202120c53b3eea8c9f2021b0dcc3c943e1ddd0e843a7d9a8ee0ced8dc87a668f6deebfa164db991e1b032fb462585933b6751032b651960d0f2d026eaf07565ffa40cb8b25ed15fe84544923eb111e29d2efaffdbabfee193a5dcbcc5c30def70bd7f585d37cadf6f2a8897b0a5ace33f8302b64b284f547a59ea976592065a23280b35f2780231becc3198b035913e200e6e78f38a3ef9ae646877463bb09c326537937639be1320652dbbc72cf2b645055171bc9601cbdcbaa70eadbf64c54fde5f78c42f17d03351f529b2f3cc55b1bb9466889013c6074210694ba8c3944ddfa8722929e668ab163625f7cf03d3a61078fa779879d71879d9f35c1829c26e55e83adf9cb255ff4bb0ff7fa237899ddbeb2b71fdf93fe59de5f6418793464477730cf1faeff90781cd1ae17df7ed625dc71e3b4256547fd8586a819b0f26dc7f49adbe7f09fd7260259d5845b50c43071a2b2346410b054df91ca0b1ef371adba99a9d556be71a95ad49980d26185a8c6ae7808a999a34bb9375b423557648d6ec92d1a68e8aeb3152257fd3573477ef62471562ccc4474707c056d612e2f1863fffd44a0685990876b1a7c1a6c68fe27a1127102413b432700ea794187c6f042718ff6f6c0d5a532514fb5c83aeae80856d64f0d5c169e4119e56cff1e2f878855bf37df1a5fc22cc0c6c98a933efb111054a7538bc1c32976eaff63040876a34e60eb67e442f4c126442abdbc764ca1673e9a8a45a766e22c30224a2c41bc9a86b10d6d741837914eadb275ada129bf185b0b9c46eb35afaa91f133d5428d1fc0d251ea7e8e1e9db869301e22078810d9a459a8974cb822724f588298a4b0b25c69fd6888c80b94df1086714c726af358b756f1fc6360b469571aea4556fd16e8a2760a2507d92a05d2eb7f6e35e9ff1ded52175d7b163de694a05307c59ab70071fc791c81f0b8ff979e164e3d0e1bd3fae6d44677e4024273174119f23bc87abf1189d5a34ce780d754415e295301f711fdb51c80dac45cbb17f40095220a97a113c50aea2e979e044aa17161b2ae9289f408cea251fc0a36f84174c70dac9d7d4aadc4c3ed722e7c2ab3362e7e02751cc9f7145af7821fa032d5b3aba9e7fc3fa4e358501eda77ef6138ae9ff0e0d1cf1bfa184a350a85b5fe1e75293357819acdd3afd62137e1ff59077f0301d32eb45ce0f98d46a4d46727b091a64f9a798093b97b92eab9c249b00ad3674e842c58fa9329f1378297a8a75f1f41961ba3d9ebaa2ac65354d92af723edb1140eeb2b557117f04bff12fee3807f9545998edb4cd24ae37ffddda6a15eb750be48630bf0147a7c0f44ed909d96bddf04658fe009600344284124d14327f0724732cd16d26d9c4271653faf0646318bd4c9198fd8a7014341a0a8bb02aca93268aac4b99da82c7e5587e2cd51c45214cb7229cf9b43ebd20c72bfb14f73978d1a42c23e4a19434d1052cfadd44c3b45122ae519d2023d8bc19f61fed2f1cae851b94ee122aed9c09884b283524967ef9e0f80fda203827de0562e198c2e1f0936a1d0dc14c53e4a64e2de08e5cd384e32caf568e4954579c32a2fc83b6aad4adaa702b0e8d64ff2ba18973ee6d49a35f3c805393b71a1c8a3429d2ffdb623b166801409c82f00374482053462dd309db084a50b73f5ee42de462c1d4faa12d3fac9ea167dcc4b7803e2315bcca7a75154f5fe1802291b5eeb94647c580b297d485e8cf17d47b74dc55632fe149cc098dafa4a8c577c0d713db689610726ef5bb95f3e4ab1efff63516dd143f51ae6766f91c826df31f9a80e75b5ee97bea1e04d80677ea5ab55e08fe736d5854746185d1adc0ad50f3867058a3439d6d38618d85018251831d37007818056263c73993f21dad787ed20e203e3673dff800071902fdcc2089529557c86a5b842e7ef5c7f84022a1149122a8e17a059c551802f07cc64bfb93b69b116c247f26b3e6bc5107af75af33383b87313d3ebe6753b6d0682f12a4ad0b79b4e23a8760a8bf7d03fb4cc6e65c954fd578471313115ce7e2d22898892ea363828f9f1a5980509bc78ce5d32e048a0d86533c881edb05847e2e922fb12283e738f69c17d79229f848e923062247ab94b8d17ed6012d258695917cbcdd64a1913aace0b10a61c6c947798f42ec81d84f2860390d48ae9bcc269998f2c79e66ec5bea917a849283c3c705851b90043dc9c784b8e5762c99b03c4696258c194991e64ea43ae20dc996f1f86f9db8e670e56054d126a679c15eb911fc048700299b6ef609c9719e946381850d8129079a058ceb6252aa2322b2dc797415e196663f7cd40c5edb42583769dd8a547a4a6cf0a1d7f169796506bb6cc9eb1e6ab4badeb91d4335e6a9f680cdc4060b9e2fbdb87fe950ccb19928ca1742f99aacbb63c2c0a64d7698f654745d34155ccfa44c18c3a841390b6d38c97c0c2cd0510582ecc6bc3ad17b26ca34a2fb215b1a6e112ed79508be134e09ecf97a84ea5fd9eea2c610e4aa977da1cd9011207630af99bc0ebfb13da475e51a8b92bd80ca80017c1adb0b53d66d009cf97e8598139cc072c423441a75501f6f45ad4c1afdc6b7c18ede322a5adecca571632a7ca23e259d0b3aa7f207305f23a17e45d4a20deb6e684c9dde60ed83b6e121ce158c704ac6ee642644befb05667a4b5fc4c01dd37e4d476adfb6ebaa138e93648f17f90c963a989aae13e793d29e1488050d44ad528692c5ef8444193c4687d984ea17efedf49cd452264ff6916c5c33a5306323adc1f4859fc30df9c4a09dff6eae7240a7ed4d6885fcb63ee56e975eb90915dbe883501308aa36b0eaefed2da7d5f5e7f10e37c544df6f643a7611c9947346b59d71cc60c46a1d5d6c41d450dbb410cbf79f17e202c43788d89b275d838352962450fad12b2348404315c347c994688b95544b9f85be0cb3ebea3d961b99681a5b9bd13c329aa23d0a6d2ca80551323394e1fc76ef27787d0eb4b89606161cdb68e5f538a41c7528bd9b525624db2efa1dd18be7f14e7e858cab45b2306e726789d1776b30347fe90d023495b923b74d674739702c9b9901cbcb9a4e7d3fbde930d6ef6c1775597df630baaf859171dc51d1d93fad28e8a452ff234801a9ed7d2cc2b1684453bb99527263b9a8c11d654ebaa5c4d098099e49332a29dfb6113293932dc50d822bd19af295c1fa8265262dfa0a5973e750e33ecd037f8c76538ad373ad9f63b9e40e4dff4b85e67f79660e27ed1e45d10d710ff4b92e0e0a887bc72c915e5fdbe6a5f2648ac95f163a8edd061bad1be3234b27308c611b91043d99acb0f64ef6f6ad04d56bbc4e779248775e1bc128fe0118e33d3d6a44c0efa759e7d857a77b3436f6f03d455a29286c20e6d9162cab9a5a0d24d1c31fc7db8964be9f4fb6d7435a0f2d165ba0f50010af81e0527a6170e738ac0d3f3c1ffc77b2cd750627a768cd1200c86597fc8d7671a41f1fe151ea7437534874612c25cbe5a29bf7192c5670b807de735659a91990d10938e0cb80e9a3ec6d5f53401f3670b9f3c2cc31ed0e6cc1311a0eea6989f92c9e8ce89ae97073a0e84194827076ed2e7e2e540485e5c5cd3c68ba16aab9b28346116a97cf101c815257cb0012250658c798a256a8e8144d3eb0da89423721cb0a25132217968207a076f8e0d40dc0607358a35963e6e74ca502187012cd8405efe5070064d9f403f79cf56f66a0c0225a7c7a1fa97d0ef6563bb6a42564e43539fc60006a717829a05547a3b5af02c43cfbd40f196ccd5c9e4f037042c46439e805dbeffaa7ad0b5d3018f2f3dc72ec8521e1c5fb974b90503d5c76b1a80404695f710028f69e1f87d34deda7b7b28058a70ad53a5f74eb429c44a52f046500f5fc9eba780256c6961d14835dfaab413b21fde04a2800dfe89096bbc878648bb6880680d9047479687fceb201b1d57c0fba429aa967c96bef8e6f0ad7136670656078e3ee3fbb4d65cb0af1d4f2a0a1b85fe8e0862267f748390d8d45eb1d16e0fa3631fbe0933de0894d3c9697e5ada267cb8c050bf80906ee0cf5fafe4517cb801a1951b17088ec2512afa0f4be5ace3ae61c343c627f78e354bb97cd0629d1a6e924571008a63440fad7d5f69cb6378a2f3f456d2ec4f617f5e8ba8504dd783b650c988e5b49585048602970a1b5642a00089405d71ca4f7b40f617bbf36185784fe04ec4d9b5a83ec0fc96e1c76868e8ffae0e7532d6b7402e5864dc77eadbe9275e403bbea8ada205f2550c50880e9b0342851c5c53007b7d8520847fa489c60b3541aa4c35a7856af6496392486cb14bf83a271a3b693f742bf102c2635b03c601cd23efa33646f5fd9b46fa5e44204727ccbb221934309c111ff8758719693b6ba2e89d12a3ab6dbc7b243f4bf6c8cbbb5d257d00e40f3e1fa92a9b8e9e46493256de71d1c9163922ab0b2a7d0a9f5cc9a8ae335d000918099ca029229a66de2aa651815c8428bfa1b94782f799057549f606fb8ad3d58cf1a37065da603094eea4653bc593ba402fbd7b20a3366c246981378dd291aa7b44442e78bfc2084ffdf38ee82b8d612c7f020babeac14ce5e3ba1fb707dc997652417564188382db5c25be645a6d41b16e817488c1a5120fd866885048788d075226599c81c1df626c59c5add1e5fc1962baf239237f6430c0fcbf97ca33111ab99144d798e18e664d5f8e852eb48d85396620b0f19cbfd12e0d867aec51d53cb01a81382e184fe12b8e90f7ba568dde8721f7abfc30ff322cf097b48b8eb1ebfd004fa5aa9600184ba35118a8cad1620626be68c7bb9592970a2785759d6e86b80a0d39ba9ae6823d4c810a286bc913df00452d023c6e0eb2f04453fd514b413683505c662c005bfdd9be192be185add7af4524807145492000d2ba8426b0bfd8f5de09834e0ea1f36cc59e79388f0c9b695fc273858ae101d3bfd2464bb53854f9a82418dc01f374dbdfbc5655b938c3da8dd6a0a0ef05a0bdf496a7d24a919181709c5ea58313e4f5aa1c1cdfcc38d146b4d784bc92e95c47a132b7023b613795646873fdbce42803e05d0cd01a9456a3144b18020e76e185d232c6edac45aa67b135c050526101ef051fbfca73b21c0a02cc5a9516dd0e04ea10ba00e3fa2e674c251450122b9f63a24cd1f262344f9350647719dd8fa4c24eccbaef7c4768a043cae22a5bf7a659198f14ad7cb7533818cac48bb6fab60a25723aae79572e14d3ce7bb56f96c38ccd7074a86c5743ee6ce79036e66c7dcf7e119d5cb789e85bb10dcab84b35900e4d40d66c1c34c4f2f821968b3923fd314bdeb55be17aca04245380daf4d6624866311133b40e4993951ab5630f9940e8ae0502f8d62678ed5278773c3faf6fdf7721aa02af6bd7a7f8cf2f71adf29087aa8b6b77715765826b9f7cfa73934d1c16c50e8f9101de132a073a7b3fdb97ba216314bef4a53bb8dd17bb72050d5e4a7951a176a57d6a9b4eb16bf4aa854210b7496ab3a461c29ca6bed739e81f59e071b53447c40be7ac99bb6d166de1f99e073f392a193bdaa7eba1ef3f7f5bbe1c9e92e063a8a816e8ea3f3ff2e70ae67c4dedde7c332d6b01fa00b3e8c7b168791d82b8be9a15d6118cee92786ac1743914515100db77d168a298b3034ea20e4a4d5d024a470048598a83695829585f56d995eaf536ee0dd0089fb9c28184563dc83f1436837b83d7cc3729c3e9e10f26fab415d501835712bc23eda7a28c49a63a5d07d202aa2f6fdb1da32dc38bd24110eb63c8102e11d5ed1280b7ec3f741b7da61e7eddd1b044a973750132aee7b96c2d839e0d3d41d506bc4e2cac0d001170cfab6e2aa593b166b19b9140a4f472f02a51d0b38e31165294dc7a274ea029eec584048b2332d551be042a60c59cc91149f59b46162de580a2dd2e2e7d225f60a215f7b96b89968390c1496c075d1015fd598842b8612607d07212a77294fcb0a3ff122eff95e06a5a208bfd4a6a91622d34518b43f5c869335d82009033422fa0383c9a47c21a2f00a80dd96aa3545e1928fc0e47935e2305da3e61e48ca4d281fbb197c0b91c43cc1696ad70d51197847dad972cf9238f10ae36552ea649d176f99f987554654a6b24eeb74515a2e909a2718594f4a3b47b385aadc00ea8c6ea49e2c2f67233f66e14014592f92cb2851836052b393df3df7690ff668a34144b2fe60917fd8ac04d177c3669d12cff0be796aec9e94ccac0f0e024803def499f42c8edcca491055984141164ad60c442a9e344b62ed9d559095745ba141602fad45d1b0562d185e6bb8421ea34106620010d574da18ccfae55d55f6a596afff2b474b8ad57793be1d888fe579e4eb6047f7356e68ee30c442403bba346bcb94d66620b8d24ab0382e818fc5de51b503c6f8485959aef311a511dccb861f546a9f074dc0ed2028b02a44805efd094051c4a1e01d221b7bbac524a60cac58667888073bf6c4803e037cacbd4736bb1759db6fe3ba8d48298e8adee76750e04a2a4cc2c3bb2292f3122468a9b4774e4e91d088fb524ebfd01d29e094cde2009fc7ad0ea755dc1048f53dedb49bcb3d8a128f61c8f6ee56d8ec2355bc5af5e0672a9a0f41349dc3a8abea87c0d9deb8693180736adcdd35e07e75c98941db24d6fcf50bfa9a76055313fd48a8b6f5e2ff3312b9c492c18ce7a02f6cae990e7705512441fd1ce32c511127be3b5c6041b76d3bdb196affeb68a85dd6ae813cfc7ffdd8488ca98227914a2bfd21edd4e80e091bc8c3258540f3a9055edc0321476f940732778d9108ed69971c0c79a603cc46a5530199d638aacf3edd41c8d3714e6d4489f31aaabf52fa0a0d64743e87ee2e5d8f9b1b56365dda61731c39f528f477c2d232d62c25ea7bca7eff94333e9cc22a9c127b9d5e46fda01fe421fe41d7fa742c5a847bd351e9681830a2cfc31ef7dfda2d8583bfa70189164754ed51e284893471c2c27277a98016d5a330930fa3247ceddd90474f273a09f331eb38d09bd3152b1c44f5fba780c90be1682f4315836691597fb9f43e8b3b35240b80bee139034eaf42672b3b19014954e1f04ce9552d915dff0a9492a37f6f5337d4df34fe112d808bdf25ebc349c6f39ecc1cb74af5d09c193d11b3c798f07254258fa60231e6994b609c0a8688d707ed82bbc1f2c86ccfe380785bab3864d9de6eecb703f2119491ac75ece3b445323b0eb24c81b6890d5212664a8eebf31639d2250ba96994685805762541f83e458e8f92d603c08ca8c17ed410f4807b06a68ca6243052dba3d3e6a6e4d7ac1160f9e83a6c4a9653e718fd8a0d5d0200db4f5695ed3ce9fe5d74f104b509e917a9f537191e36ed33b7b42100bf2eea794d8289967b95e7e37d79be102ad82ae718160f1afa88c76ae2b6a617f7e93bc7db88e16793d2ae0b400860a8fc6eda1952c21931799da4d7475828ac4e29daef9c261d69c4e04aecb4340959db8705445ec0069dec6130f1d18a097102dab338325abc82800d14818e9924d351f44f95773d04f1646dbffc889a88bcd28467d6eff739443b8823d9a4cfee693a96fdc15da5a0c17566ff6dd7400ef44e48088d52ffca79ce68e2e23d73458f65bf9467956c74bd504377b207b4e605bbda5c8e6750d7b5d7dff79339e0895e314a3b7bf063d8aed54dbac394b6efdaf477768559e5241082529a7a1208e2fd5ba55d85e992ce90d1c5e44a2b47a97ee4887b4ca778d408fe721d0f9354bd53cf17c969f398a76e721a2f92e0b68e4fb10891dcf060102b484532149295345eefbd4759c0db7d8cf3dc88c6fc34e8193e93abba1622f89840f2d21f72ba4ca447e0b6f73222a32e56b5193ae4f2d2771120d0228072d7218ce77ee8197fc01397ed084346eac458ede2413e411fbc95b91e78da772091de8592d8b4356d43e81d1aa8651e463c219a120e154abab04ae4568b463f104b57296a9bfb39100d49c28cf1c719806fe0d79ee3d5e32619b9fb41c510fe83ec729f218884e7bd181eea68f415fa688c4bb37316878ac5c4c0d666a5d8135a3d6c827a00e2b9433325ceb6d7c0696d8feb1c950fb150ed54a0dda88a563a84df2b5e37ea0b678cab460c84411f1538d0dd65a3ec5de4cf0c3ca8b487da1445c6e1a02b97982a719828c486b34c59ec0c16f140e44813e2c38e1da7f54dcc7c878281ab1492167021ffe40a9b5c56715f051bf525becc89bd97e543a5120f916aed56d69019d8c1d703d1a19ae38f1791c4da632f9d0632d000ebae327488bf46391d0abc3c1e98131e95823c083dae1a30860761062cd2d3cb9c60463cbcb67953f019077f52419e385f410119636220194d6d1c48cdbb04d933a1e591ee8f3df70d33a92841a57383610298606a421e121aec7e35f1222585328614fadf7674414e635b36459bac721c5660a70d9293f4fd64d9ab6265e7a4de49c205353c8f20327dfc910d531231da5a562a7e28ae1192545238bfad2e616d6892532dbc09034984b5905956b2f2794bbeedfc3678764ec104f8507feffc79df90c00d614914a394954f45575f67fe4d6a2f823bd476d5ce8d252b55175f698d725bada9424d08b47413abf077ec37c03dcb1da1303b8d97e9f1a1c227a51101f6d75921294074fd37370a0d65541fb9fa4977de1d542b98d94742d08211b97a483ff63e4976a36f51ddd197a4e865ec7c3bece84d88fb3659873e5a2cb75a18288204276614bf7b516fefc2300761dbf29007e1dd84db6a51d5d02dd5ffe26010f2ccf569eef88e331d4d6e9b1b6d3be695215ab6540b5335691721decb8bc1301c0e4eb547d008dfb916c49debf5e3d5c77a5b97cf756459c5bcde33af75a1c9f5b432ee3a79e77d36bc140971d256e6a211d5fa17644a06cbd00e7ab791aeb804920d8410b5b79b4e90cb72a6b29aca3cef5576e268f812d75bc973f604e2b6b4e5327194ce84fb7b284d560589a67898df7d06f950f1300de90fd34dc1d247abc374610ae63c971482350d986ce88f111571a4165661b91800b72be620aad9fefc82310034053811a08f0f0aed56a4d8f9206f11514d1f0ac16db842515c04fc15be54b047ff9dcad7be144dc765ff566908f0044293ae69f991733cbe38652dc66fcc9413af71f4924e36add19a907756c38b3b5b801a561953994a3befbc082d13941a26ccd8e97b8fbe9d9edc7f1e827b0ae786657d97e9fd106d8f91e6897ce945c81932437b85ad516698b6b1447bd8a5298cb87cbe8616e69017a2314f53ba2af6c6ecc00fcf9a0da605a1dd220f483d14593ff533bb2e92cee4746b4a833330c9cd3bc648982e176d41d0e965ec1318ea6809e1c64c63417f87983714d25950d26e0e56fdbb8550baade8448fa485cb2d804b12016be1d9af962fc6f715af9cd141fc0b58f3912f599ee1f8de42053688b0274cfdc207c413296a3a768088e1f4e0bf6e45a89133932e978dbf5e3a42f71781a845be8b484f40114be285a63da57b6e9815bfb9062dd707f8e1716f7b527550b807bf6285b2707e9df9de14134906eaa0e7409bf4043f20671926abfc3d6b417d748df1cc1be5c688fcc91349a224196e9421aaeea1bc67845c58843e1a92e37fc903ef76e52f1b59018f1e4b1178ca28170a622bad08664350191cf3f90500244dd754327407f8ed1b3629dc3e8c7a2ef525899a8ce551972cb290ce4b0006b9d45e44375039b0c194d1ae29381500e3e8c51d3fa971bf48daf18c8e8b9d0763b8f141961e80aa2f1ca4ea20fafba97909c669fa4fa9db27cece60092e3ac5c7349985d925baf86db82c86295973d183cea0611eb57b4f9170d6a4a8f066230dbbe15ef97d14f22308496b62b16423af6c4e3d32d97539c01735a25548d0ddb49119a6989196bc81f372e2ede51187d0f1d1c7789f744de4a87de6d0112206268057e7fb982681acdeb6511bf2da70ec3a391f1542228c3a23b9025c158b83e00f03da1bb9e3ec6c2fe0989c519a9e9e21b4f0d8e07d2367d1d5aedafb38e87be4f808da21ff13417f8be908181af67ab3b51c8c121e8174e13af04fe85b93d4651f541f6db745b3718883726a25cf9a0d9283d1e1e8d598d121859e8b509da3e64aa798ad086e29028806c2de4438d3775a060943d0af375bab9284e3c3a131d981c8cc3785faeae24622e5f87b06fc83119f3f728400fc7d790e70572dfe909d11013218ec3e5ba52884bed9803797f11496292f73d795ee0206ed23225b5af1a9e8c722cb081cbc97a68a450d455e382fd2755aff05da5bab498c90abba44b3f03fe9257a4cbbee1291429d986f105d3d8aa736bdc624444740e3c744576994fbdbc7a1bf949ba99eb113cb3d90ecada91d6b758fbf07fe79c56ced06962a3d51181d8e47ff0a66bea5d4fa7f3d4d9a7681b99b497e57af3c437def6360a44f3ab9c8b7d3ba0f21d73eb093336846324a120e47f6537f532a8e7a328f53a9a8be269318f31ceaa25304a0c4db6e0ceda2d2dbc504cd174ba6f864510e628557f13643afd593c2e382339ce3c6fa24c00221250cf1a9e441a35af53ea6de4d014e37a7cf5484ac45156453a4c5565e74369115fd505e2ff7fe00a296712612d3e9714a6a38dc4bef3c308f0a62f5095588d2957f362fe5f440d820d94040e628174b28450f781771ab234b03a282a0b93b325fb5ab4456a32e071ed83b539efc35413e5734fb527a73e4e094407fb8e1dfe2cb5d7e6e1e4335291f5fce22afd1661185211a5fb0f6497f331f7ae3b061313dc274763de4ed1e7b9feee9adc1d319fb2874ac162d99cb4ca56852017cdff765021a388689ce8ac35b771b5acedc6f12e8d377a3fb10c126e1277a503af594d6976c6d010158ab9d8023ad011742b7e035bf9c29d113912b514ac01eef3d90a27845a4094ccf63c8cce7c3abd5aea13aa45a18bdc4aeb6fb72e489b2285cb736f556e712a6e1088f977bd27c953385a4f1db7cb1a9dfe14774f3b4dde20bae242d388c90b4ea63fd515330ada29a4b0968873d14cd98d0cc88d20a67f0444dd8e9486b0a957cad909885705deb791089b40e5e8dc4f21d830e9aac746c093d2f1923db53ee725f22da3ed90e0121ccd0a42e169586e0fca06c3e4e9fe7dea2c232496c625f6011b3b6bf8e21d2bb61aaf28f7fa3afc03b7e15e5bc40f858d723d1367e65871d8b25b8b917d8009084e69032c0a618e7b5b218928b01027b4cc8786dd2f4d6a846cd8e22f585d985e0b8300710396beeaad4cf252a27576f1459bbc3e4eb7c5f48cc44c1d5c1adc721c538c18a432293a310e9eaea5a1d0736bef4bb64c6dec56fcc2a0d75ea141722fd2f8f9ef1e15b70ba4d678fdb167356613e4e264181fef776b60a605a39629ba7c8675c456fcb211203b34ea72deba70129d399bc749c0411c7722cffaf43359c113454c07c5dbfe846660e374bdf84f022919ac66f9b73c3defb6db5849235548dbd857cea9e3005a31a13ec81c7a08e14398ee23f54beff73d8a8eaa0d7a658ea1142b219033070b373bfab879f5e5ee9a9dbdee9060d68f5e04742a65365c23685db4d5ada6785ccf70c96c185eaa177e407236e27bb4d29b011a76be2f323601103524a6678d4f88df32e5855b3fbe59f0b24ec285e85576fc6538a7e9cc75534e70816766729c05198fddb6e9d6c248d4cbb5492f10f8df502029027823f808dbe6b42df07953648d789633607a5f1d9eb5e97c54abb1c8f74f1fc14279eedf9fa96a2090083751e866af3c9ee394fbc464bb5a5922e65722ab1523502c0e88077f7700861148da0410fabbaf00ada3c88eec1de7667cf5be321f77838ba587be1414e9ff540ee4b1829d38d06930369fe3b3cb206157aacdbc26e446bc21a14d49034627bb476c9b620091431ea590dda99280725277e81532655e7f1e910470eb26b33373e3ea08d0c76b4424ecb0d79d78734df5934b548574b5944310697556b7bac23071ad838482192c44f7cf829c1a449d4d4661ca3a6862350ba1078e63619c5198378cc83fc1df7168f3d4b775a923c1287dccb4b8dd6280c5294ba3e59dc04adb14f461c1e5b7de9ea9aecd4550b85b681b66c6b637d8a607142f2d69ed1c25d6ae0c5525b48a63a13ad597303b451be63ba66eedc75ccccd40765fd9fa853a81e63e83292c2de8c6d6f415d8e6bb7d6c4bc070eb9a456a2cb5a6f59c532aab890a2f9dba868a1125817231eaff7e59268376eb51a2dc920d182d176897d5847b49c217f0322e22c0aa6ce63d67110bd3944a982125e1216505da7bd61cf036a548197034a7cc58612ea387a6a9dc9fbe14908908f40c06775da13e384ac2ad72e404435b387fe52237082e8e708d87f29def0e6f44f89e9eb85f3560d5661139281699a8f970408881320c1402bff78c3569c9484e13398030a464d8d764f6f70d137c341d5fd111397a9cc0deb4fff2a253a6148fe01ee9676ff1ad3db52c073537e72b869c4d247ee53461987b433d50c176b1b26bf032b8384944290d5fd8f6c7e9c1e90b91b1c15bda0eaec5dd6aa08b9ec32852c60ad47c4a7c846d6954e88da3586bcc26f1271e90888266f54b54e3bfe31c02a88a50aecdca378cd81c02189c8d46436ebb4cc9695347d33536bacb80d6666b0cef3f3a3a16a4b631d197ba1212aa92164d61aaf3bfafa3bf7e691dc2363f121db81e95c49c8f84ba8e26f54ebb543bc7fcc78bfd3e83d550b30b7e55f90b1864aea21c4babebeb3a09013c37a02b193d15697104f8bc56fe431f655eff81170712f0f269812600215c68cc1ea446548186c3c86c43504cbec79a8a53aece6c9d683f5de3c5fd588ae52096e3d9c1efab578fa0aa902257546d73420bf6b84954d7b8d9997e9f204279dca44742bdbe9e2ec542e69ea41927bea276dc091dc6409ce3dbcc514944961ca08e5be73918f6431acbedbbe3ee1443345a5142eac0cd457fa51671150092f3f9137f83866abe5e8a28079b36e8cf042c122d723f56d7808ecf26b1e2c3ac53a12c3247b13a13d5c0790baaa883e8e696b799b23ba58ead308890676b35c466106442e3201418618589c805b7fc2fc2a6b023d8471dcd6c083c3627c90964ef5313771e414cf48cf4afe6b6508a99202bc95eae717769e52ed24452c267b6a789329e351aade4756027b14949a248aedc23aebc17afea089924e913c6830cceff3a670460ba0fd0d1cc6b96e0cb33ea64ceb5b3ade67303547b7330c0d9ceeb6b2f71e6d60cdb2081982483567da1a1a7f0a413b4c6e720035550eaf902f34594addac78826b09b7196952eb72d924782296790d6734e0e3c29b414224564ecf307fbc8466b70ff638238977e6b2b1bd0b60dd0f1949adbaedce51d778e3a92296f96cbc047007c457de78093d0c6072d4e61430cc89167fc073d2dec81923acec6e5a896ece6307b7c4a62c542b4995f3e16a81c6fcc70b58c596c3e1879fed05c1e3639ae61504c48ecaea18e2f255ff09ce0568f1ad9ed298022b27980fa9da7b5d2a84e4be56dbc6f3813bb443892bfb698da902a9d7b3f85a86b9e6f34172e6be038704ad825e8636cf341e9a5b1c34d53b7636be62e2cc3168fdcf99c6d84544fc280918134a5a6b35fc3b817da4dd28711ccba44864cc4f74445278c841be91d4f8f8a6594a5104199e97575938dfe086bfa4616b742409f06f7df7da00ca54b986fbd20bed4bc881050d7b5c62a9633a778d15ff959b2832aa5c5565a55c5d456193ff6befde5f7be58d0054210fd9579ca64ab835cb1784ef6028df3a65c236c56ab5e960e1d8b1c7f2503f5cc5ac4b25e58ad55b452917a9f62d98e94d1fd58e2eb2a52f9269c14826cfd2e983657f83c1536b25cffe5e5c753aaf6a6ceea7c94302949ed7fdaee5feacc2f5d4a5659dd673d9fb45b948e8c36a65b1aa1f2b90c94a973938bc185a87d8563f9a9b3beceef98d3b4013b31f4fd9c92c6cb61bc65617aaecd4f5ad3dbd49bf93520a77cd506e41c28226aa6dc16f4c25bacd16bc889161b9ec39446b1e88e9d65b1dec8d575c568511d748d1b2e3e977b3fc91f2fc1190f0473601628284d2814dd681197b9a5244f379ef286722203997978cf5f830391ad1acaca6b910b28a3a894f807d02b30bdbc8a2bfa649b1a0b10956c055311facdd3d5ade6339834c085543ca553d7008103f43b58cc96a4211f35f0de33033d0e73d8c490e83334d4e7c8b0a8dd8bf686f4cd26e79d191a6675ed85f72c52b4a86ebda19cd6ed01692fa9263ae453462e331961b2a862ddb0b79a3341cc727fa27d4202a0bc98cbbe698848b58a0ea195ebcbcd2b58df7e628b69615ccde5aaa14f8eb9869769614c64e55355e7a64fccd48cedfa2076831a0c0420d736ad59ed31a65e55e15255729e2eacf88ec62f0cb69476ecec16a814f705452c5ad6902f72f8e3559a838fafb4acf35d5edb502b9e5f2c5c1517b616a1eb76c0f9d6240b76bdc5ebb0ea3b40145eae000fa9d42412fd3788d9e7817185b930a6eef4895c61c37fe7cc2e3f8c71e5575cd44662e08381f314e3251e35a24a680b97af984818d3eb8871967ff84c0409c89a1c70511bc3455379204aa6f2764eef76652335ad9a6d1632d782d3b955081dc72f9e2e0a8bdc2a42c95954d9f7935d0598f104aac431b09d73b58cac47e2a36e4e207fab3773390cd83e50fd37c0bcfb587ac99b6f30375e980a840260b203b79a7afa81823cf02287609d4fcfa146e6ac642b4158149f7a4cca0557a69d3ff5f733edf3e06849a0845742e0e11432d494b6bd65f3689b2a67d531ab7c5e82fb70ad2340e30f2c49a264496d0759224323f63a1895a43fa3c44c83073d943648fd414b3f74f10e46f770adb19f5470b7da00abf5ced32b191e3decac62d7a97463ca5244b40f915955df7fb20f662431676038156331062ee94e1347c5ca0f181a65049218917bc12405e33cd2fe3ee1f468e0726b0c409af029bf214d61dc0c0cdc26955765397c77a12336224854e61959e735b0be7b501e4271f0f19b2d6b570a8cfed4093062293ec7c2c18e22c7cadfb4e2fd62f5179b32e60a376cab08319b6a348108d2a9deabbfc07b9526d75a32ad05085d9c3a9b9f47e6e0410948793a11c96bfad2820c6dbf540a60620bc0efc338dc9522be3e8574c422f7b0f4bc128fcd30dc95fda6a4a73a5c2887620e5192a54339703d79b369117d603c9e1a83d924215c7aa3eb12bed2a3bab202ec14067168507376f9fa2dc4cd435fe57559a934d0d50e8574f5b811ea881ab579de04b4d46a55539326847741eb13dc4b400b5cdc55367a0dbd46060ace696a280f638c7956480fda1a8bd91dc95607f2bc00c2247b9a5eaf478eca8d1d8bbb312f9de172b5b6f120ff914c48eb7de349a497f4461a02f9b5e5eb43457bd2240ba523ca04570121b817d007aeeba11c17e756ddf3364bff5da359806c705dbdf8cee8b7e48dd417426de632d27fd140a53aeaa62293c5dccc2d8b6f4a9ac9b0734216294d209a58a788fa18c75ebfdee7a92268f108b12f4c1b83c9d5be8fa4e346877075b41d51a7c6c5e9c548b83740995a87fca255ee89ace12a6493c9486eb7dccc9b02d67f53b846bb05afc56b1a064d86080258d6175492516995a19a634c37707721209125d6362cdd600adfea90bad40b0eb3ec7f8d9eae2488f5a86915a29d3447e7597478530a2f086ceb2d4f582cd676467804fe98e280c381dcb2932889578ce6a8990d57710ad256a6c8398ee412649c14fc7fdd1a0f3a848d482d2e3b770e00d5eed8f26a12f044b8e57578687d4c93bfb88df125fc104de081b3a5b801e26e2edfb4da4e3257fd7d10515a2ef164ff78c627ba5380f704c3bc0c093d9b32cf024487e491f4d2beb110b8aeb8ce70db4006c240088f4d1a60e414a84d851501418b21eb542bee74d24fd3a6b7524b19491ca8724ecee9ba9b96b3f26d3e4776ffb93148c45d493a789d83de6bebee24461de41e017039d1980b67eca5c8489f14a4a75d2221bdb6d479b6bc9814e5b312d2aa485700190a83e0df213fafff6e158e50cb05c570f29026ad700ab9508df1c1c10abd505952ca0e6c0c6bfe4ae3b9ad7d5110f11325650a41cc050c28e90ce815c0ef7fb4b1e327a5cc2fe24afdf46e4db41517350372b77381c69b8d00a98b4ccc451814feefa516035f0b2a91bde09db77ca8057d4266b2951775955dd0541cb34d74a4db39d35de5f9291f4655c29a7babac2dacdad8cd37033b9cae554f05da38a321b205ec0a0805b85edf40966b9acf362ebb585c58bf467e4d5025f30dc1d52b997acaf80358711f41c4ee3da5c7df582e4d87029229471c5d06ac69cb5f138558ad1a91b2c7e5d5308856642827eb4799233ac8a58048dd2ee3a254a5a13250328a35ad75c505aa6ed342d53d0ae11b2e91b32f97aab90b0318a6be6742987eae3fda663b44812b8c924db6c539a63e74c1573b22b4b52dbb1d3a6e64c2a07248e0af5c7f446470615049e9f6cfadb2989eca66c4bd6877cdc4286f4d0eee92ec82a8185af5203ee8368730dbb0b9257afeca0a34aeed888672ca74b2900ff8204b8cad939d07df4c215732b11d4fddbf0fcecd2f41bc3028674bad903e4b0e2e362dbfbcbe471771de895363937a63cb5086678e3594e7c09cc29ae4bfaf2137e086d5d4c28a20aff0e24777f5c5aa0587a5a3e82fc009a9a873a1f3a06fba77772716228f1c7c5abd2a1cf38de455ae8bc2c5b08e9fd2e469c4ed41bc27de3caa3f82ce00d8f2d76089ba66d4f00d13d0c5c57287aa6b9fa1f758f8b76caa09b662964fbd719488ef500197caff04c751384a5a83e4efc7693bc727862c04231f9d1ae15b38e70cc710ce6d4521bf6e4e7b89c0b369aeb0c8c6afe240b22d814b5738936b6495f33b5f5cd4327e264a1acc9f7d2080038694af34dfeb4a69146e8b872917c6b5ad755e4338b3a191fd6ab53f465e571d18f5e8cc22f4633afb92d01a8408247e5449f3a41eb66c959bbb9ef416a0a790503f534801a95e41dcf8284b2ed1d91f2a4bf174d264a33ac7d82b188006c8510b0e394fe60b84f352c8f67029bdd15829bb65413f0a650ce13170c7a52d61ce26cb36679ddcecbfd34ca9a934bc5a801ffaa8b62f78a2add22ce17015ad01b06cfbd1c5c1c00ee4b7129ed0a142394784535ebb24f2028d9632d3743c63429e5aa5ec2f0bf5939632a569cc31faec9c0f962678c64615f7eede107911a7feec98884f94160e2527541c728e620f708b647d54d96e3c4e55e85807783df46bf7b5a9640f71c8ca1b7f35d369817625ec824efb6f64aaeb98a11f3d5197ceaf3f2129720536761d3ef4e0aa6e9cd6201b5393e55ea6570849cef792461ea65303edd41e202d279555107e2a8a81e135be8acef324c421d19335d1f63f7b612623b46a182a1d38e9f8e0475800e010f586ced1dc8dbb49751023ba70c27e4a7ac8c6cfc045b65fe54d7842b9eec6768d024670413c49eda57d780e3a745bf8fed7490fe974737a943cdbb9a1c7e309fc31148f1bd0aab135e5adf6e856af3383e1d7113491751638caf37f2ea9de3917e680c77fd255c9d938a0080bc9560bd889ffdecaaaffe432e4bc8adf53b0f99015756ce4c5e435094c5742e751526a59c212e9042967502a53cac0e541ac50fef424e7b19bdfde79c4d13d53e467892c91edf86c69446a5940ce242a0bdb726ca17945544e3979aa8591a090c27534cffe9a5aae4bf50b39ce66468bdfc7601e2ef9d47ea32f63e3a91c22fa4960332565401c977c98674d675c281ad91842aade990dd7325360aba6a77b60ccdf76beea285c15a22233906ce039b524d730af213b3c5139355e8572ec045d2392c05f0a1c82440b3df97b515d912de448646f8bc63a710dd7c05481eae14e120a25ce9490f7000d134fa9cf3e5904c7203137e5c6b7999d073950166a931c06454014f521c3c5280395cdf99786d0877f51f800b92774853c0f30059c8423771ea84e06bfba1610257ca8c989aa7ecd5e73def82b538d2986bacb6b0f458c067934cd29ad551ea422742c3e12924a7fbcf1165beaaa039cb5fbf55eb05c819ce95f3f4ec4b11d2c3655b856b53e106607f9e9c8cdefdcc88cece54b01c5f81b46146cd146b7826c7d9ad93fb9c186cb46bb7e258e5e83a905348171b0b0824e7aa121c53384844e542dbca334b7310436c0fe4d1365a2301e78f79c900881e124fe20130319dbce3d4c68b73290677495eedba5caa53f8ce246a400412f5f1f4be8b6f13f6e575c1571d5ff6c274a8064591eec224ca81146ad772d3603b10db186d22c6839597d89e6436fb28c4d8677010e7458a65651f928567d4dad0d28e1c4728f056dcdf30cea688d929f439986247e173c685394b07bf4b8d26e916874af3e0a6e650a39e2a3fe4a9816016d5aef84e3cd99ce6c1e93d7d56238f53ad78dc0f4c386a5c21d45b243902607a9cf730e4183518bd2d968ac6ca82b2fb67dfb2f46bde8478e5c10a5cd7167221e392f8478ffac9787408f35c64a3009e904186b1179b94d571a5e01d790dc684eec09828914f9c05facc660b003d1b98b9301d722f6198d040377f0b3e8000081676ccc0add35383e5b2adf3d3f8a461109e678e97697666712eac072090eb94511f3f97e905186cd32eaae0e6f196db5c1123437884480b2ccdbb95694bdc0feaf1f2391f020c9457b02d1939c83b386759c47316d2cdbe8c765f2e25df05995f8a3eae348d3c5609642417015d966aa991974ea66ff3176d08d00849d88808a21028a8b6ea396daa24d99330cd1d3f390db7ca46c0b810be0420ac4957a0e14a453225320501ca580345cb71b3b567b3e487cd764cf441fec6246e89b129004182b374ea4df53bdd15f4227dc88ae00c8216c184d75ea8aa4a5d604b0c4403ef80f42c7152bff9ba9a22d30e34487bf0033c21a29d6407154ad64e87e13cd4e2c0c6d0ee0d59421f678252840cc19723ab54803f1adb66eb9aa56465c079887d09101e62b23c4e513242dba9994dbeb241ca16fa8888617b6cac2258d507a4bbd8e428dbb8ec71d341c186257cc8c0a657392a239c9e2c15771d14e83fb8818757704d07e07887e106b37587cdf9dc269a007a31d5fab398ccd4a09549ab9718156a892aa82a26327347da40a065ea5838f4b208fcaa462f29f718d981253f769071ded21064702f49697ecee70965466d56f6c4e961b2317f379f657ef561a6d86b05535726e79cb89a6582ba228f29402913164dea1580003ea5c17e0bcf44a26d21dc189f1b5996351ebe9a9ba9eb08675d167208e1f7b8f3c655b05a67468ea6c7d8612ba0b7a7cdbcecf735568394b404c0266f480d1800e7935342272d346405ed2077d4b16529302cf50be2c4150a112bf770068914ed6ee2cb73b4ce68c80e087a31dcf01f53857ee3f04bd3d6385bb3fe4eb47aa682a9633f299ab45504fa30bba25a20181ea50365fee81889443650d29450a0329046b6fd2852c97fd42a8d6288a74733fb5daa8a5734901a1e8b0e40602a430d721efe6d486786ce9b85da93d80e8c0c12dcc87f72017ed466d1482344eebdb72444ee2da54c3205c10a8a091d0a1308cba1b64dc68eb0d714614bf5ab5e0e1d6dc5835a870e09fab0e97dfbee9de3d9e45bc132489ce3d1114e7ff1e30f3cbf6f228fe7348ed55471ba8b0716decca75e101c250c8f1d613e9bf0c40b7a03968518443cc142842221b0603efca00584161fb21bb020818926c876c08204ce5dd4576ee07e61b1015bdcaf971280d00de1d323134b99ea51a7582855d0475d3ae9bb4164e7c60e2ca3b1ffe43ff91f6a471dbd02d4e69c6d4347af002f4ee3a04038effb86fee6e104b1aa94ac815299e4df8c73f6c0b1c8e284216459c214ed20adcaa6ac3d928512848a7670430dbe60507c5005113ae860adb5292f70b6b8b1e8a2c5931f9e40825112580f561c618c0c0c1d72d87a10460cb8f8c1890d37f01026c9078717d20b0b24271886611804a6c082071f2051f485123e8412b0c801ab825a11461068b0c10b0f7c40a58b2864c000dbc1042fa31f54f811f358688ac30eb04ad3a04783fb25c50e1842083d5ea14165ce89655224ad70bfa4d062d24aa552c954a158cf81af570babfc8395d3b66d474cc22affe2b61991b84b8da37fdb5880f13b8f368ebe24b0fd7a15d5c0fd7a49c14f8750bd94e2c704710047588afb2545ab251936e84816fc19c5129cec203d4631466683fb15450fa2c892443d5284a31d18010544c85206abb528acb8200b31b4a0610c1aa81811a910e560ce395357c06c81c208cbb75108a9748840c83be79499084dc909657b944c53652050d1875e06fbe1959e11986300810ae718700f7c7989a832c5aec1fbf4522b36abf2e71bd65885e3c5994e5e3a70b53419a3d795a42cda0ca0d71357b61cbd9ef882014df11b29425ec54aabd5e1e4e81568e9538161bb10c202a0e8af4087e025136ec0b1044b107e94525a81a7115172f4e6681cf355c0b3051c6dfa663ee7cd1c3f5234d5e444707cf8cd99b95e20220752be1062092928c0747882f900290618866158bca1e70d3ef002888d0745d002872776488253ce2909a0c3133e5a580cf7cb892710c087971361d897135f946007a9c54910aa1356387105899a52428c51ba7faa7eea2e31eca252cf11720501fdc4169824a4a32d46af22a221215710d08fb7c024211d6d317a15110d09b982807e602b499118601812a407cf0ecef72a4be30d6d9f2224c51525080ad0931f9fd90a03e64b9217a42e475cb66831caf2ba526485a8cad0142129ae284150809ec81fe9235b6130982f495e90ba1ce1c8c5bf2d5a8cb2bcae442b18be4cac2273641cf20f36a055a9e7c0c7b056a95494cec7eed481339940972b68d950f6370ea861d80fb3a8ab2ab61fd288f147e3801826bf3bdfc02adbdd0dbd3b5651a9e774e350bbe9dd6982edf78657409fc6d1bf42c2c6306cfc9294f26569963efb5aea52e931997d2c956ec81c52874ddff44b69a5c280b319638c47266e2fc678638c5147e3d0c2c647c2aeaad8f89d819f4ffdc78170673103b2f1e96331fbf9547ed693bd7c2a367751cc30ece6ecbd2ccbaebb32170aea9bbe34c677ea39100ad1385429f78edd1da571c0d9ded0c334170cdfc6dbf48dce417333f5af1b626424f12fb61552cae8d0217c6c4305dc10e78831c6d88ee35f3f0d42ad34424f7637f41a6608a3c396d808c4f16626d82f74e853d8c611e3f412c4be144208a97cf83146195d89fa594a8fa671cc19259533f60d7a851b8d634e2d621fb10845504d1822125eb1ddf276479af50eeef9a7083d6b658c56222cd5186354417728638cd325ab0eee170f5e30f5dec6bdf8589884e49f8dbb5f292a65b15008ba7ed502d4bef49ce784fb2ecbb86f4c9534617141b8cb7de699ae474d5ce9b94c268bf52007f227d8ff86e14ffcc77390fc5d2e21fef96b5e10ff6acd1238ceb3d38b306dfd80f1561218a4a4a38c3e7dfaddf46b2398443d4aa9c948c42068235cbab9c91026d246f46256544158f82ecd4d3ba8f33bde28638c32668865308319cc604e49cc331235ffba6191c7de4e187032e45f3b0cfe3915eb5ce94df533cee6f937717f1edba1e4246e9e38afbc99480a639e39a9fd6da3b54b395b7677cbee38e38c33ce39e7752fa2e085ad31d41b05a41217f221d991e5ae78033f85969d0f1f7ef11c5984096a7002777f1912496929ff2004821204e4aef81e04545d5268201272f9073f432ad65d10097ae9241c5da631e2cca49765524a8a69190644624d85b9749ffdc5a750662944c77cc8d938e263790458becbc611fd739904991cdc638cd15d42f7ee6e82c148c559d3e590869e02f78b065ce0eaf0ab77a418ca17f2414b4a8fbdbc13a09fbd054a8ffd122a42b02ffd92ece92fb9b01597d09ba16083758c29814ce800c40f2bfb2aa9bfcf9f71f698b3747bbc9218af0a089b2110108540f1e6aa58603304a28fbdd35f82fd5c42450866fa55fc25f4aee21582bde9b1a75fba4bec53ec210a4eb858a5a75fa262601727de380b99a784092c3a4a428845456585092c42c207894505aa9480503c080bbd4277bd826b627705e75dc1f916c03e7b0bcca793e54a661006146fbc95c4bfde02817a2b02b56861f8ace935cb814c4bb877b7673de7a440d8ecda60118a63d21b8391a3fe61de0e367f37b20da689db8e4c857d8ac2ed471388336c8ada36d555f686e794aae9bbe3f4ad058861961dd91eb44ac76d9af7e8b0e96df60d91fdd1f7cc945d29318d086dc77322c690a27cdf7c4079537e63a39277020725580d840314d6b6040e9660d5504103ab9e208955e32809563f4ed4a971031a585dc50962c0eae7893a359a3062d598020c568d2935b0fa87449d1a47f8b0da280545ac0a861358fd45a2ce0c0e5ab07a0c560f01074fb03a0b568b210410c2b0fae11735b01a0e5181c2ea87425147c715376cc16aec0a56aad503ab1f16451d069c008a17ac6e2e4760351080c06ae824071eb4b01640469820b0ba817004563f4c8a3adb1090b8c2ea8760a2ce0c2bac2d095b7c60f5fb4fd4b1f185d50cd0a18b1eb0bab9d081d5efaea8d34f6869620b963ff1a18b18b01a5e8185cb15ac7e278a3afdc4d018276075562507ac7e7f459d28041a7c7e585dc760758d82d5375a2005ab511083d5ef495127e78814b0fa1d4cd4a1b185d5363becf06383430c58fd3128ea94acb04e5a94f8c26acd05464060592b395ec1dd6ad5d062e598c5b672d412434551abd58223b072ec82f918b5688062c4cad1cb5cc2a8d5e202042bc72f9468a8d54a4207568e61729c50d46ab5845859fa401a865a3e43706165f964fad06ab55e50042b4b2825318c5a2d22a22cc1a8d5ba8207569652a018b2610b2c7260653905cb51ab25e50656965588306ab55e70042b4b2b520747add6105958595e916206ac2cb35001d46a4d798295a5162cad566b4a1656965c8060d46a4d9982956517295cadd6942fac2cbd4cd751ab65840f2bcb2f9507ad56ab0824585986d14ad06ab582d0032b4f9f1db45aad2d64b0f27c5284abd532e28795271428865a2d2a62b0f28c82671449ad16951e58794ac15d049ce794c8c59b121105064ab8683084137e68a1e086ee07a024474a10a3862dc2d0a2450e48c440e1435f09e20b134e98f8011440604f4a0003ac8a124cb181e27e31618299c54998cc09866118564312a4644e5c590d4a603e3870e2653a6902f37182c5886c87ac86221f319ca8c009941a56e083854fd0124e843003ccc70a4c8ae924cb747202d30ab61ab0d87c98e0848b520d5e309f273024d42838273d30dd60d2a20626947cbe2825ed207d8c40392182fa184d2758780d48d2490d309f32680d5a322735d48004adc2e704196a092c2b4a90c29ad86ea0e2414703550fba329ea072123334c1dd2ae6e177f7f5bbdb737aedebed89790ecb486c68da69d358d0fe64e266688257a8efb1df3dc779317772777eccf7982e1288ebd7fa266f65bfbe49061f9a0fee63bed63aa36e35dee4c1168ed15a78f3f29199af41e36df733347e06024d5adb68fccccc8c47bf763450dbf7a3be7e4dea6b6f3dba4a205dcc57cd43691705adcd3694d679784b79a798467d95b79bdc6bfdf579220daf717b9ef5aa97a1501268bcd2ea6bf5b91b33540e50a8dafde9f439a6c66bd7decb4570e5acbdb948cd6ff6e65ae365319f9d22865dd73dcab35ce5b6cf9eabd63eea3b7b5731319d8dd96e8fc6797b24367077572894e5663c279379ab1e8d536f3fe6372f23b181eb5d71cfd53ae3ae667cf6b5a3a152a95434ee6a46ad3277d575d90ad5dce937191999e7644ed9766580486c60ae7bae7b8ecb2bd423b1814fbfea90d8c0a9bbdab2df32eeb355f7dc67dff6ae50b747e355ea7b621ef5a998477d4ccca3503116d5bfdd1e8d4fd77e67bf7b6bbfb3dde59ef372132b57546ee308198d1da9ccb22c9b32fbeac9995189bdc96b20d208c43e661018f612a9c2cd07166594df110806047b1963bcd9b1863bf8c1f027180c1f8b3ee6bb40b38b4120d35b09e978e3f21e8138462410c326d4593ff328eef0b67137f372924c71a642666e8d6c7bcdeb18176e5ea279a8d7bc7e2de6ceb83083aa713bde7030cb31cca83f83665e04647ec6631e90eeb7afd0ab368a4a6fa3c8bfd69b9b208998fee6ad7cdc9e52c43d343e2b7de5beeb7adbb29ff1ead665decc0cdd4cf79907b9ef381fdd73d9e28c898ffa5a7df8dbc60477db37ae5f2fc775377fb769db6b703b3dfc158faec77ee32311c2c6a1799ce7318ec5dc9c3df7ad3dfc2c4391163e126b66840946b1e038f38c408ccab8ef47fd8c77243e5cf9b83ddc779fdd1eedb7245d9793601822f5aebb5948d73d4fecbc0c5bd87ef5320cb82d77336cd9af50832dcbd16c07ea65f5f2aba2f5ecb79b5da8f1db6f31a713fccdd3eefc2ce2d376a7e6f59c2e1288b35fa14ede0af5d99fbe5e197c74cf3deafad85efb2cbb4822ceec0fce6e0ffc7ed8c21a677b647eab3f63860b333366cc98e1d1cf4af565bed2e7b22cbb19e2da5e861477ab9ff92cfb1a5e6f40b6ea75f576bf09e12ae4bcecfb67b84a5da8b1c9788d6be94b5fc38b1b10fadc975ca871b99bc84526b2373d8f73dcc3af35e67b8e445ce37af5b2ee6b78b546eddf8a6054cc968f64db8eed396f957d97f1787685d4d8be765ec6715cee3ea37efbeaad3ad40af5fd32df7d7dce5b718ffa98cfbcd5e9ed675f65bcd4b6552ff5325e4dd5cc6ddb738ff2561beafb538f7a6b7ffb1ae3699ff2627ee5cda43c2d06e5c9004f57c8ea57ddd7f899cfdd1552e36736eb75bff2666a78339f79dd5b2feb4d488deee6263337dbb4ed884724e2ec22716c4309ac09eb0fdf48f64fb1d62a4ae501bff4b5e4d54e48295b21f6d27853aa9f6d6ff2b8bb7d7ccdeb29bde94f57156f4cda735ef6dc9b5cb0b7238d3726edf6946af7b5a4752e9cdebee6753727c10f79e2f6d27ee769dfdd476d092e7d73df516e2e9c6ec79b8ebb99892dddedf4ad952a8f92e7037ec97a27ea82fd936f3c4a3f6b12acbdbda5ef2fd19c04e7fe23910eb14bb0212a0ff826887de6955694529e689ade95b4a7268ee39ef332cd4df0f63909debc9ef9be65bf651a7dd373f44d4f4ddac5b6db33bf6eb908cef47b66dbb671a026d99163c0d8e72218bb997e73df83bde9b96bfa8e01675fbf1d7bb941a0095e75a6ef4ccf5d53fbb7dd9b99e04bc4e9a58e3d5d7afb21967510f7b6a374794cf8990ff8f3963c8857a65ff9b8d8c49e2d51b7a75f79401ff4e13b2e79f9c31a863f4d25ada4693717f91efaf135edb5dbfed5eea10fff74fa7af2b20a9fe8d7a89dbc06d2bdfd9277bab9082e55d5e312f7f2e310acbdfdb8eda8df7d8c77ba9989bd72f3e19876d7f431a51ae371f5e2ca83be0ff854f3aac903a27dcd9007fd69fa7ab3e91e91a5928f1e4cf001302feeeedeb50df6ad7910620d279401e2f852cacffec88633d99836bf62a68961d83542b33b03f63360d894917a0c43a876dd104a2803c4fef1b13fb2612cd29f5e9c7f8d6417890772130c679833cc4772c2f3ce00ffc826af1107c3c33ef6d682ec913e9f05bf0d53c8472046e23fbd8629e0e8829a24a043f718a59c13c3324a4bfe512ad15dde4ca394d11d4aad524a391ffacc4d5a18c2f70f2787841f3ddec0813b50d4b699c1ca145c7ab9054a165cfad209c3557c8927865b32188768290e15c5a1a11987e250f63568b08da314fffca97fdefed92d72cb9d9fe116eca85780d86112eec691a11658bef4f6a48704627a73fba77dd98d4798946a8306b604553318d2b6adca703fd5fc53f506e5b7bb175092a8e76834bd83fb5337b04fffc3c154985723088bfdbc99f6883a4d55f87495746f6f4b2e36f76b02bd820c1070fc20bd02f522bea3e0c5f2f817ff42b1f187449d8e415e9166c8e67e0d7905c1b4927743a757a08ec10d48f6f2d634c1e62638cb6872608564d96d9b1e4651d5793bb17ae9e75f5954c1a67f6c2ad53719cd943e9f4aa58770276e3b7947339db49d9d5ec171e95f88c173e2973e01ad43e34de96d13a552a9542addf0aff4d0abf793a7496347ed665aa2115e161e9bea4308e3f6a3093679d2bf4ea202de6067bc7400d4ada3d34d5c83de0f65613f3d21de6261df5e66821b89c4f3573ea00b4f29c4b2b039e52502c3bc8e37f1a64b8c3addf166d88addb171b401ac804f98e8934e13db13bf33ee221d8630c49006dcb73d24b2850ef767f92b1f262caf912b300ece5d06ceb1210bacabc0426323b00cdc6d44766f2c50ed8533cd6b074838ab6854dac9f60a2aff3aa8de48c10e58c01becc45db443165f149c35ec7d053eb1f0e59d510bc0c58d1e0a40040bbfb5da36392bc231c26d488e4038027928f0f78490d2c60f16c3cfaa9fa803595a8df30a8e39d8c679fecca9ddf9439b5a193f3e1d22a9a492528993c373b2a7b452fa254c353b7fe68fcd8ab227f03d258000d0c5ca79058531ec7c41f8f13dc720a04f02277e4ae5396129009ed8f70fca1f2fc31ffb36b039fec420cff1279e13dfdf15853c67e58de1ff60f8ffe339fefd8a51081a57d81efdaf69349988afa5accd9b70b08fbb0847881a7c7181e784dde9d18f43a343759fc63fcf47bc4a1370de91b2fd5f08ebb9ecbcaf9ac2e66f35bf1ff03b6e780eec07ecdf63becb2fdaf9f58d63c9e2c252088c8b0984e5f4a1819d3f77b600f0c4629fa7f7640a24dc2f2c493970bfb02881bd28ea74f424cff9e239d8536aad4af59f7dc99330c6f82c60eed1344deef14449e341b192c6e873ba43b1be333d27fbb983f30c4df24ee6e520b2133774d8c05624e227bd817d9c77200b6cb6d8230f2a9511a4607f9a96299bf96d039bba0afe190faa3f4d0a435e09c8a6704bf1830d70c0f862849f1d0ca8c7173b3a3a0b3684fd69686cbadbc6a87245a11f8233b0425f7441cc2dc1660c0828eac496c4801a03c2802612306582c568c0fed15f13a971fc7847d88c8393031ba24540571c1afa420bf64f55e9621176e872211f7215fcbd1b6c76210b7d0862e853a80c611f5a41c83f77a1298dc387a20f6c8e4371c8e3908d2245684a169b5bb168b6aa0f95f9363c0bfbb611b28408c75fc5c07a44fc359fc8c23b44deffc1c691cd2aa3e789371907e70b2bd83f878a46472aeae0dcffc1661cac81f7c17616341ae8151a0f11e239f05a213635a968a9c0b8b0bf121ff9363c8b3e0621ccd8c4300cc3ee4ce22a804912755a9c183653087443f5b1e16790abe02fbde97215fceb0d6c76232ec95aac1575e43bd21637b253c8735e5f68f11c0f8a32c5b93061734cc2fed5b760376a1cfe52e6f862e1169cdd08c98de4c55aa61cd86c53d95114b66dca46f3a1225f95020c6cee97e5c2661ba5b0d94ee1fd1042082184dd72f6ecd9b33b1e51c28521e7c3a3961747d83f55e408f491574629a38c52ce38b18a6118065d49112fc93dd247b08beb7ceba936212da24256db7047b0340cce30c8837e9e508d0642894285f5f716ce306805bfbf0a2f84b03fcf8e0bfbebf0e207b3dc85c0b9afc8ff6c3a1fd82d7ed34714c926a97a00e65b7ed33c55fcf80d069c80f19c24f8e0238e6790b874c2400d40b5f2c40a352712c28d31d0b2e2397d8597271870f2c573561870f225eaa0be7bd95ff2eb8eac8b78a20e8e6f363552d8fc7f6505406c38be6f3e6a188c79c4255fb00e143086cd4712c2fd42e27271bf9088f0c72094e765e9674b64e1e72560b07fe45183b1db8d63debc2409e725449888bfe21005fc3a0d540034c2a25aa9c23305431d104ac110429d4fde07f0d44461db891b965094420bb500c718a54c410a9e7640eba85a075509f46bb0bc9988bf70bcb4461296c61b252c8da276d47126e8c0e5d55852f033c452d2647c91c31616930d08b6a0f809623181b003b56d4cc0840c8e581546814511ab8d78a084114b053c60e16209c065049722569d5ddc40882156c54cb04412ab662ae04110ab9b8002c688d542b0c16788d55f04e1082256ad5af4025084a41b92584a04d022a208442c260bf029c20fabb1f0c20623d6f7050a767f1bcfa1c1fed45ff3af2d27e5552202564361042d7e586de3d1871a1920060f492c252a5811c6118b09aab5c5ae8448251e049630462c29fd8bb025bc42861118575094167c253d7a83a10130a4b67130411404ce1667095f46081d32a1b60d2d515a8247248636efe0ece8f01f9e03b1a79023855ec133d3f7a75cb31ff4e4767568b7fdc6e10374f88d27a015d0381e4feb04ec65af5083fbb71da58f1efd92e7a3e1675007bc3ba723acebf09b1d1a50b025d4b6f96edadd6472ffee99be898ffb73e933897dfaac61449f4253e9a6fc939a855f189ba9dfc08fa988fdaa1a47b4c266faddf0bfb468e2a07ae907ce340e7fb8b1007deb4ef9d7051715f42256b547d7a9ef697ed3ad00c8650c9c1d6741f8b0858ba3219c298e9716a17295ab5ce54fe3153aec57173dc0ac975b64caed11f6039d8a4aa148e44352e89314abe1353affef31f9ec43ef51a9f9f69c9a87b0a606974a5a95534c2e29bd42728a7f9e9442fec1cb43c2d2974a39353fdf8f681d2ba7749caa79a5506e304afc9b9fc4bf195f06c1d02b34d6817d53f3b34b566a3ea7bce6b367993e64e3fd08147eba3fbd816d024f14bae0599ace05db76d8a8f16abeb71d36fed53cf4e4973c16e04b1ef03188829721aeb936fed53c8fd7ac6116b96e1c352fb51a221f721b5658d3ffc0ade636163ff38691c34ed6c6dbf879e239415127c99c70e298b88753382821b5ee39350fe1eae1b683e6874005603fdf850c748ee9e767ea7db618d5f0516ff2627ff0318f0686ff1d84355e8e2f74d212c6e3317daac18d855a9a621a1212f2a12a442f37f22d6ec5b3b8162f9a9e93b10fe2dfec998209492121cc83b8cbc67536de8643b75274c58750f81a358ff6d8781920aef9209e93e10fcfa1475a2ad745f1cf6a5306c9201b33b0335ef5331f5f0a094921cfc15ec7fbf9b268d69f2fab78ce7605cfcf320b9e443d1febac149242728a1c62c1b124a2c9a7f1d987e8cb8b04d2fbc33f1b354f1040838d5d3cc7c6cf8f4851e73f3718e9aa79d37ccf931b0268b05906f504f16ffe11887ff4c8284151c75d320837f42af3a14729b1e9e62518fb98e4dffcf7e217bf99d9e7f6dcf322cfadf837df5d13859b29ae71570d2f435ce3b18d4786b11bc348b1f0572ff333de87b46cf19c159793ed52cfe334980fcda743f2ae543ff3b9c1dc0008d702f73e047f760b1c1288e5cdda97bed478c653d1f088f89fe1c9789e0c30c6cb5ae643783eca93211b1267d723eafc9ddca659f8df377de502c8416d1b79b2fe4de95311b083cd90c8debe90c8b30f3de939ab7879c4b76f79649915a845eb582f30169180319965df798d136fb0a7168b5f33af6b11cdf4321eec9bf8292fc683561a75ca2ea47a94274f39822296619909c7bfcce413630cb55608f405679969ca2eaf2c528be422bb74af2b451c07adbd48208fcc73b02dba544aab86f2a015ffb0c77995ca62367c605ffbcc7f8eecc582fc27eac43cf60ec573a2788efcec841d798e7dd4634018f3208c611fe36547d4b60c83b3f7417a82b39f5070f676fbd104a3ecad5de7446cf0ca08c4a74722717c231d8ea887017591407cba19da7bc3bf18fcc39e03fe61db860027367b286ce5348c728d655f3b9e7c3c27d3bab6297af705ffb0a71a3d71dfafa32f3843220989b85849ca6d74c57330ac888655cc84758fa5fc9b10a848d4517552c47060c0bef4190da1b044cbaaba5ff58924f19cf8f57dd4afb5d65ac3e0fa4d1fd6d7d115dc5e70bfb2d8822bdce6170c3f460d7a595ec1b008e248875863187d2638bb32a9be464fa9571657f0fc1dcf51f1788e7ffd1e5555359aaa5458efe15fedbe81945ef93d6afdb6a9b707b6b0252e300327607051c51554848912813862055bbad8628b11c48041104198c11170f02148881daaf051c1ccc28814203184215cc9d283186300318f3065052a3f4f4822cc183208c2420339ace04b0f2508eaa10a96021370f92268e04cb1e822bfd287d269d432460361c4a8ff0c4db089b5d05af0bcab161cf3386e8241cf72e79c73ce3c21c5f36146fbaee4cb246cc00afb3766d89c73ce09348e7e991c6c8c3d5b7ad1b7146d79d11d5e5b68c1bd4516dc2d01937c93d79b04a8cc62fc58a2b494655966929b04fc8bab52896634e062bcaa69b6b5afdad7faa79b93606fab45f0f6f6330ff59d1773aa7faa9f699bb6755e6e125304f7ccd3e87e86c6cf68cf3df184c6411a35be964a5f4fbf51ede6ed2bd7695fbdda6d0fe16b5f3da871a7aafd8909e65ef37c701f03bfbb99d6705caddc37d6b6ef3cce9ba1098ef99819dcc77c6f5a0ff68dbf4298bfc678272fd73fc9a03a542a95abed6eae1f83656ca5b1b57e198665d8845de68427e88261199c451815a51a9e0076d12ab53f60aa2382e1cdf32b0438ede38cf7d4335ed75d8d4b693210aa64361a3366d7fd065f06de4c24055393d31ece7ad2b4874422707af8dc77deeaf4f5bb6fd7b4d5e9725fbf3e470477b0a630f7f0747bb6ef52b8bb4452d86e3eb6db2a1a57ce9832a914d4b40e7615c22e057f42a85d6ec26e42082184282f13c1288a632c8e89f91a73baa70ff51c17f3a76fcad9989f93a6f0bc99480ae56522a98efb69396ea6344efbe9715caac3f3bbc97199480a6b29f88021449a0834006207a926020d80a08208462919341428385ec16928500e10a1409161a0a86cae58e9bfa3809e9ed669321675b279a1fbc8c5a44cf6a22e774f73ce79bbdae1a8a2a15aea53aa97b1aa4f69dfbda6c99c7ed6ee352436b47a35cd7efdd879b9ebba17509db742fde93b4a354d5ba16efdd39fbe3ef7272fbff0029e9afdaebb446cb8db23a379446cba4bc4065b1999542ad5a53aad6adfa53aadaafe55afa2e9ba17e87ff5476783e21ef539aa5da5ba99ce90b9a993bdf99ffb19af370834e11ede6c83b99b89d8745df7bd751de7e5176c1e431a0c6930f7f6db7354d86bff50a9d4ccc39f79eba1663e26e6a2ec678feaba1770ccc7c8e7bc8c7acdcb2f74977be8698ff24e27cfb166d3a3bd041a732fd8f080386b3df51df7d6a3b14d2662038548f53b48e0e265b383042ea4a0368bcddff78551a1e70fdba1cc44d052e7b7077fe51f83707c611eaf3202e1f6a3f8ddb862db8e9ed3ddfdca7ee9d0fd219c4d6210c4ad1939b09926486e2d10a778800a683ca1d7dc10ac651b9a54d6f0b77f98b3f67f088637737f02623f88d6533ffec7496562a6bdfd55894ff1e5576dc710863fc385e1cb7cad70d6c80186cd45f0f63602333ef5aab740e055f5d4b75f3dece373430061ee51588668e1f9337cc4fcecde7e05f290831ce42007b99f0fb98ff172fd917aed2377737cb1f36bb511e87ebef6a7b7945abbeaae8fd3d56e1e82e773f5b31e10a7b2fd989be38be5b8db937aedf6a09e7b1eafdef4b2bd443e9c7a5444cd78f8dccd7d258d7b2462998733785cc6cb4cf0b4d23f0e73af453c2390ebdbe7aef4efe625986adbb6c3f44022de2260aff48ffb7ab59be11f893be66b0fad7fde839dd087faa64fc2404c587beb0dc1311fb71da6b6c11c4d4e61eedb5f7a2af5b6dbe9db3d4f4c7d90edff69a0642490d46dffe03545c0f4d56463eccb08944c9ec5e202171ce1fa36428ff3f210cc7d47934c8cea3feaccd030c9a86e7eccd1b83350375b999b8ab9f99f279e3c2410c73ce765d467eff6ebd7efcd879579ce47cabe7c6e0886da43eff4315ef78e4f5e465d5a737dedf49c37c487c675cf133b2f33c1f56a57fe87b7979b29fee4264343b0840800220b128edf48208e3e64acb0f99f86d34082111536f70bfe8e0e1e8feeaf84a3ce6df1bbd83d957aebedae92be4d58a62bb59b8fc4a01804c4bb441e2250e4e19b51a21882168c833b8a214809426afb90d5316f9f55a800ee4d5b3ee2700b6c6bc184bbede7c642f7f4e186e439d86f2fb71d5b103679361fe79c318495dc4ff9dbb7a4bf3ddc1e6e011500f1b67ddc766c4d7694baae7b16fcbbcdabcf794db0c435cb3cacfa54a27e663fc76664b1b4c78f209e331fbe0e16f59aeb344b7a2688e49f8ccf04671e12962859706309a20b5e006e2c41bc009f1e7af9886f9edc76188165e0550bf1edb310dfcaac04fb5b8ffbdebc0976ef8863eec22d600a5a15ac3d4fdcfc88ac127fde8629cc9743fe491f700b9882fcb943b5b63d932acdbe09ae52cb3e635a9db89a30186b0eff6edc10e0868773d338fc336f003005ff8a6d3c20748f374e4f320cfb52c55a0bf1b3cf10630fe3bde11f8df76b1c3c7c45b388aa695aadb53ed5a6cc5efb1a3dcd93d9c758327daeaf51fab546198e64b8745be832307d235d06ceb2c46e8271082c3070cdd77cb09f0f1f43081bba3c1b9e05855e76c8c6095df1ca30f11109b1d80c5d2f03c42e1d58f80cf879d67cfff7b781d3e61bba54345909be242fd8ff864dd9e4584db12f9b2d24427e5e6343a737a85654060e4e5216ec9f2388902e3aea9bde2524e47209b9a440178ecbe58a49415651d8243c858868ad120c12f2cf8d8ca04ba607d005849424c465250616167e4c7a127bbc7afc78c0d10fd5878af419b5ee1e416c606310608f30ba60ff1f3f640f56f3cfa6781e8025684a1ff578ede8c83255a881cd36017de34f593b8dc38da4c80115acc900230e6ca62d486db05118f44d5f4d1e863ffefdfc98624d0aac114fbc811f05fb13ec57608741a28e6d1fb48ee91d628161d185ad7ec1332c77c9a8a5fa968c116cc1a4cc08368ca01bd9435711ccb3e159548a24b1f1163902049b3ba9086c9e8f3aa55799262cd18bdd8e37f9db51a4099a8b0a55183e54a3a13bfe2561338d5b6cf7079f8c2a5d38fb910c024202fdd01f22ea47447e9421911ff99117ecef5ddc0b9574c88f2891fcf123223ff2a3272da5ab8bfa72c7e3c934efb8c7d71be1fc38f39ab08ab2ec2ae97893a3500c6ac28a40334dd878e54b62c1ae2c8a3744576cde21a23f06e5080494654747961865099b77e27b32409c77faeb5ec2365204f2276ca6389a3472c7be4082a14a10215d62908b0ceb4f630516c628d115831ac74c1376826142e3f0998414dd592e5bf18a85374b2224dc464141f3c8bf56bffc7bfcc05a3d5430ae42eb09d6679eb0f0711cccab83b0bfc4c971251e6d61f3e73f5bd5874abf0dcf2abde69f7b3c5e0f256ca6168a221838c00323f6b1deff82fc117cb0bf0dcf03b4dc20826a7ea38ab7fba879e2d314451f30700073ec042d4ac148c2fe5acb070a1582dda14f6c862df8b303ed1476b6eabbe969bd41a2e9be406fbb7fd65f94f0cc9dbb53bbb0721a1164084c0f2ed8ff07929730ad658b43a65716a424239b61bcc2e608b47df7a7ec43d14571910a84bd077424ec434343eefae2d50822253dc6c1acb77e1cc883a0f52050bc29e2b697ab8bcd146b911221e43f2fa129561c0a7c1b9e657a77a1a12c363798f8039bfd487beeb3bfb68fe1155f18c78289ade8f0667be1960c07c38144b6e1e6258937fe9a67823ff1860b9b29a65a12f58c09306058e9a29ce8f57062b7c4de1277b06048699982fec91dd8577545f6937039d0904b4a15a3e8452b6c7697bba45004fac1591205cd90416404042a8c3081135b8001f4431345c020c51006fb13f9b2a323862265d84cb514582f5d5aa6a0f4b420db02a42d43bcbcb0ff0b54a3e932c43f57c11f853036d3a8c5669ad48497216fad228c9708ec9b35b10d88ee8e2a15fc197498e7f3b90afe363c8b4a868fe3dfd71e4e7ffefae2dcc0f95c857e1eafd16b6bbd0461ff94a4f24694c1c1e6ef7e9fc5e68ff6f7e9b8b9af7cd8480b0fca947ec1fe5a9047f129290bbff2d830f66a1cfe364a80b9a20e46146fdca3640f92ed4921a2a82387a4101196539e0c2baf0c722914848786a43c9248f4775446b082fd69bea688a894ad7585452d11d10c0000003314000020140c094422c168241a536565fb14000c93a248745418894990c32084900100100208000400000088c8dccc00bcbdf5763e6c71bb01c0cee3087158de58af47fafc668d52d7008b50c11dcace6ef541765362c9b20775709e16b79d1e2c8ca5fd113d585aec72495f95a9b562d016689e6e6d922c58f60627a7e5170064bc88a92bc017595dde71fa0805c6b5fb5338e888b1ce8242a363b4dae59a0cfe25656837fa81860b6dd383116b0544ae81af24ce2a5bafdc4a8308f5741483cc46319365a504c6be0e5bc65d12d3daf2fef471af7f1d91f59de9ef45639e56ab34d38417e9494cb508995c9744f9449a6a3909af86e09a94982a0690e6e8c28aecbde3bebd5e8a9f54cf5e83dd01c61ec3403c0ffb3dd6b1f750f5ee416ece557ddd8b94243f0ce583c9acad7be96f3249ed9cde7e4707c222cec723d0bb89738586c6904206add0bd82ba833c64027d57388382da5eaa8340c150adb0b3b07b53699df40684ea7d299eabbe986c4f7d87a0c0d05cfd008b8dfd5d85f6025c6f6ceec522e21b48633100332bdbe1040cc59c693db8a589a7dde0c756affd0bc1a6fe293560497f05b6f2870427302c2298b9c9dff58a90c1563f85691b21146af1fb6b6c2f7efd8b5ffc321fdbef62171035ff6cc51c694ac1af619b8a96c0c9d84000fe920376504d4acee79413ba024f8d9cb34fbcf2da288c33154ff8e28d18176376dd4c91a0c3e4969c85ceb9476e2574164263d7395f3a9fa3a7686eb5a79cada1dfdb82fffc84143d670e47677262eaff857ff6532badcede4f8f3ebc0f8aff899d6f4b46d11c8a819d0b96ed2a7898ad8b98a6f6965b06fe988f04efaa17a1520d020ef7cd69d983ee35621a4ae0d0f997742e366d3ec9c6179193ee51c54aff24ad0479472076105a47773dce41488748fb927472b8eeb82ceb988796236ab76dd152ce500cf95dd060a41556d6e03ff9323729cca2f563c671790b4c4335e868ba18d520c042d23214509e5718dd5e9a6a6b566be52c1852624b4e9a721df7cf094106ed7919aff9f1f071f06bc886188a6388081bdeec4f752ebeb2879cff93dc511e1fc92ad38a3511a483f971918cde9ce732846bc7cfb927631b868a5571f61539dbb0e13f71470ae4ccf9b0769b06edf3311b561bd0f337c9982c39a77680f6fd7483b10eaf55a387369f519d6ea5769b0fa9a5b6b0216d737e565404e89a7a8625a9343e25f753b87941f2bf64f38148b0bc512cafd94440e136ff4c6901e8a8ee9e1fa149503e02fb40d9b1476046497a64fea740bf5c9bffb48fa9756d1e32328ccf4af0be8cae66c24fe16e3ec865fc28df801d155298633e82815a526e2f779ffa687a0ee25a9f2f15c9ac3c0e7a65266f3467a6292e638f1ed0745895ba109b088a6074749acffad589c30ac95b854add954e3dd31e384c874ce359f09ea159a19feac963e71c660c392a1873510eea586f5504ccbb0b53fa2c2ab43d3cfd85a7aaeeab5785cf7715c6534b1c23af9b221e53910aa53b475a07810bb32476b1e6001b5817cb5c9b17c719a6736118962623323c10e32a486a24fb9cffd444c3397fca3a52cd70f0bea66e38cd39b1fbb6e22acfabcc9ba169e7e45f97be0e9711d0337f89ef6340cd72ab1e21e29e81a0feeda5064feb16dfb9bd6b128c405ac79fa01c6955df03f79cfea36f52f7079ee5b4d1ec9d50f149f1c0f6dd86658f832d60e088d234e3860a66423b3b9be9cb60d3d3a2451371c8bcbd32bde333731b619d906a8d341f009362dab908ec4980607b93d3a94001305c7d0bd5822e959bbcd2868fb30ff3b0dc88b74dc559a8f328fec37a1f39bbd06da88a34b31fb030b1e5cffe26e22af74b5d1e45a689c9811d4c58aec15de935c61d40463f52c8bf9b1330fd0eac0cdcb096a69c0766b745a810a546f79e91cb3ec8fcdebc8985e2f7bd05cfd34ffa1b62dd312df30fdaebddefe3d495d032dfc4496398498b61ae80bc23e89e1fcb58aee1052ad20d5aa1cbd0993abb70fb21fbb735605ade496bc58b80d1963aa41803105e44a49e782b48602fb8a26697874799b3c4a71bcd2988d8187643241c341a6166f07156f5b41303f713d488e69abe29b2d413bf940df1e7f56c14a7959dacb56df8c9b85dfd5e4b14cee8cf8a565d3f9fa11d3bb9457a3a782f12227d3ecec7b87b706c9135bad7415c47a48bfc682326992b439349301585ac1023033cbaf14586a7dffa9d1d17bdb975cd7517aa8c37410cde23c208f28783a0972997a22f00fea8051609f5ad58e1d8b47ad8ddfe1c64ecd3a6a119e75e2a1004b24f15a613991bf90411eb3461a34ee642dd4a4b9ed255e4ba05c64ae9c8368c2ab8c2c39bc6c44bca8aade4cce4235c2391de27b35db5d113c27251a382e4336fe64804d8ad5b13f161233d29a034d2257cea0ea8664e0d4b7662530a2d4a582a7de90239e8486faf5dd8453ef9911ba36eaad8631a5131319769c4b0473e57bb92252b6490c1cac908bb23adc8a9e830e91abf3a24576d7ebe5d8213d8ff942ac1c5c074a675942782b2ddaa1cd08605b3952af210c2069706d119893499d79bcdf9018dc59d72754d0e398e86f3015909e70d13423543ef2782ac923817c9059df621323f33ea39e7e5b3c4c1f614dceb990ca6ba30722ad6a7e183dff41f72ada08cb49426c0531f8c37a211b13d1b5ce424212267ab333a4fd7c9819b40bcda9d15516624df0a46ad4ce98e0e5eb5c8dc636fd0d2d58ca86c3ed73cae0d307d72b8d703922c848148d41040c6e4e7a1f48192f34f5ae45f79215c30df061682a07c3fe089f2b3b6754cf4635c5d0cc6c70501098278e8de5d29c8f0c6381827bdca12bbf22d84217eff3f7404ba81ae8afdcb818c64d9bcdcadd521281e284adbf2cfd9904696189b8e11a370e9c2fcdec7b08287d4a26ebb8f0b349121f2b9165ab0602a2a0ddd4bea3ba918c5381042bbba75d0cab849d66b1851677f2d80ec9ddb9d3ea4980451ca5baf77e003fb8a0177d2a4505e439f5cafd53ff5dd2073e1150bbf84366d79bde689588fee9ac52ce67a67446aadf09bc379cb106d1ad60b902956fbcdf3537e9309dab6be41b135e86034955f0a108bc753fdb584fbe2dc2fda70029cada1a8dea300b986ab35f26a03ca6853829c84cc864ca023c3d26752c1a2db0ad89a52ad9e3932a3f0a7bcfb5faf5c7b9a7772b708dbc86b2f6a66e626975a836d85f676f12e4c2227ed68311f29d812191224f0517526739bbd30cbef7de5570093dded20bfa76daef648e194abccde1b8f0eeb6ca48371f62f25929023190d0981f7dfa946767405ac0cd840bef0dff841cbfec4fbee1913b65405b751e6c103957595c9b2024437de8685632aefd073825c6127d4bfabebb3fd24dd3337302a9e1d7e48a7968fefa6b015bea15f37216868eccb46c37faa5b790bcad875b6c98d3dbd9fea891a711a50f77f2399c0d73ec528490bc1894b0eef3582d5f9f12c76f80e10ace64b4fb189b09d1f3f8b397d0ba0dcdad2f84c257ebe2313d3b7e9b9d2e98cb80ab06d8a60738f2ac258a52747b5fd0050167f5efb745223e512fa089e6d2736205c34939f8592a478e94feeddae146de36c96159713b85f8fe6eb75611f3a376884071362c27414d16bce21c536c7b2d54e2cb5d5c94401091f497d088d88202bf9409590b3f67545145e7816932e7e7afe262efa42c874d4c136b94fd46ec2d565ca8acea621ed3843e4d59bc831c4d1d554254fcd417ea6d0224f7ae40fc02d4fa587f37bfc605eccd990f8d1f80e95a4f83a15f4d466f92c87b1372befcf7ff9bc278038f2aa00aef575bd28045660ed57fa98d93bada5a14562397179cbbb048769f7bf888d8a8b7fc6266551d8c396b35b82a09c8514edb8854076b8b7c82f29a46b59812da87560ea2b934f9cb062b0390be579df51869a11aed68f06cf40fefb0d1e9db875a9edf413178213c8e717a8967780e5fad8be9c27926ad3438e85bf8d98780fbdb35937a0b571d0b755f010c483c97a16fa67730cff49e55b38bd615560da418c0c73fde0cd06657b1b78e2b86ac45efe18ac892bfe01d0b2829039f75b80f66c172ed913235c221dd7b2ce73546a9adbad89667b466603168f529acb08d2b6b12bef714af6437797072a58277e402ea2c9eb7a64c4ae5912053ecde75f5497957eb98f90a0fde91251e4dcc12f089d4366610ceb8178baa6ed38ee129f83955949ff37ea7dae43456ae2d875a9b26a37ee2f69a4c97c3fd42873c5ab026d9dac78af3337a77ea0b9a094913b0ebb9c840379795e061cd88b5ad0229745c40b9cd824967801d4b75f53b1c6574b57fddee2d9209c9646391f643c939b48fc4c2ed03753fae15da873183239cc943d60dd7e61e1446f4b66b653b7cff29f481b0398b82c434e919aab04f2fd21f67c097f71fc3651b5cf772545614f3860ef8251b76da66e435a68c1a913b511d39a9c2f141d4c9f44dade3c4f0cfd2c4bba2443248d45bf242836440dace00c92c106c5597cede299364e5248cda8a02c2179dfe03365ece914bb80090b7e3367a80c1b9452014cf7dc5a1171cc0af17df33f618557aeb01ef14a7d529cf190da28fddd1270d7f1bc4773cfe665b1f1d9020c4a35e32c55df1d934b98c8879ac9d51943632a67b0b84c77791f813833f906deabee4894c1793655dda5fdb72ff2778aa0828ffad5c6b2d03eab0210fc18f385bd319d0b8a4df5d6af1907a2030e497c9e104110740d0423410c5c126983222aee559ca093b5063894843abf799b46d943b2018431edf113a6e6b9d47c30aab91e2760ef7be455040c9596e9637a9d061dc1bef7ac06a4bf5c0c05155a5bc5532863557ba890bdd350f3b81406a042de67f8b320cfd50d4a1f6e1c478ec2ddfe7e48f3e1f222d4ca2313b09b39b4cc57256056d8e760bee7cab961b9f4ca7fcb20148cd7dc0e39a87e6169ccfab6b10537702ecd7e60c503edaf671d5796319db236c3b9432b92b621053912bf51fae699800d6045c8a5c0569c5664c6959a02cd172dc55e5e0a7c29fcdb450d10658528b28e9089972695584dee4c89f1602616bc765c57aae40662de3f6a216e8218678c9c6f90718cbfb40625b2f377c262e862a71af1afb431405ffee10f17d790b14c686fde64bca4455eb755a360353a81c1c3f3700b7c40bcea213a0a2aadad071fe16a37ad5e8aa28295b4aeaac4891f26fb2d1f2266da1f73181df6ad8cd76c2d89512e12cd2a498dfb0539f8146072f58376138006177472f901a3a5e885b5da22c7798e0f82b50fc3ecf53486e84f3a499d3444211220ddf027e64418f8b1d603227ab351e564a486f436cfc6e5f4ca98c73670dacea3042df1a217343a6d97d8693a6b115b9a7810af3b4432b8b167804a005135895d1bbace946ba8bbc199f6b0dc2c333ecd2e054db3b4bccb5f0a380a776c05ca1dfd8bcf55984a9785581c2bfd0ea79666325038ad436b5a627dac2281defd6a352ea7bf1848033b59653e9986eeb4b173e72edaf015fe94d1406bed8af9b3185a865c34005460c67463b42ba4143181da0d584219a0fb6d0c2b44d3a469deb7e3e45793663c837ab29514723eed0c88d734ed1f3960a04536a3b023b5021db3f3b05acc76b3194242a157414c37920258153cc9aa3cb1a9209224ae19f7d222015d37313c76662a8ded9bbfcdd564ded0c693d2b7f637ec601481ab1bd8a30158782528c3ee190db110d5244089ea11d5b34e3fb196a644ec97acf61598ff7e57dbae3ad27c79be08f85e0b4add6e2d845863c3a4e5e361ce03f3f60b32d08d97d19efb6f12aa4b6608aa2bde3353591ea0e855429ce829d50d9fe7dd02c5d4544472976b9db3b89073241d899236e1c7f021f2a31f5b1bb927d6097b502c62ddbe9f438f32302f572774ecdcf25a5e62bb7f72762781c8e28f32d056642de8fe2168be17e77b96c26bb44da5088487794177ec8fd1e3fb03ae797705db034ddaa6c421e090be3f82f805f5a721520e54922cfc4584c2da675761f0b26c800dce8528ef89ab60d8e6c962edc2e8ad3b455051ac350795f55b49e896243569540e38620f58ae9318c82513425a4e5a0b00c880c8df865bdcdabec578c65d31a7766013a319adcd5e08a7c393744c04124ec55506e093e8a10bc81a1022c500660c2b6e11372a852aaa75eec54f694ca101136df74a591fd3076d63eb7068186711e3fa62100f8cd583044dff7717b4382a46fa60ec84ebd6de0e5ab58759a5dae8e6dd82be47991b72e33195b76a49ce5549be04329ce0a5edb4f4a441f481a1fb6630befcddb44646bc7ceeb49e0c1051c04fbf9d1afa108e789b22ab61284549c6d3b43fc8abdb64d5ebdfd64b1e2239513ffbe136deea5e41cb046ce5bcceb09d949d60cb224562673e000e60f28f86ff0f64a4eddcce9b1a63e58a0d2dcb24f89df13202f5baadf62964d6fa3a6bd092b9b516efc9c2361d403355beb7a7e7606420f968f991fb279cf536cdab4310324fe01685f5cddf0882e10a6b5d463668a61ab986bf8d5cd9876a11f6f290dea7f2980ce94485ab250dabe997c02a473e399000cfabe4ae5eff783f6d281e4f57e909983c250cd3d1722b0d6c915d326b4ad57744ab6fa07adb81b578de5fb8d3cbaefaa4525a8e84a9900f2ee7a4ac2f2fea36137964de3ef2a524a30aea830f4680ac29618ec860567873e82c30bb54cda869e676758b27a360bfc99bba472b505dacae2a0c2b882413f8d737fc882b57f46e09950adec77578cbfc8c4a9facc280644d60b5d49be8ffe70479d610f50422f813aff62050c56b53f3dd860dc6ee6d37aca382b673f09aacb9a195ff80ccf6fabf93b6ea79212a0dc37c4c7db5cf95978d429977b152adf80ca9956d07cf80fd6fd3a69762ae4fd39d382e540e837d5d019ce8299178db971b7dbadf2b5a39fa342607eee133fd1ed9dd0414efe3c47acadee50ba6205f69ef82524c4cbe793cd73bfc6628b010a9344d626f85076b62e41afa88b7811101f6bc02d89171c79145ed83bc87328ae8886ef772a31fa4270d487c97f6290dce582056b4e3da0b60e666a9f9251ae843591c79cf7f4d519e76baf6b7171a90326ded473e6465785bb40eaec41834773adfc90ce8ae00d76ab1da3f16433b84799c26d1b9090e65ec19bc7dfae3d403b1a8f3592b02196102399580887b4117cf8a324fcc894e4fa4adbb83737a66e5157d0e130254fc2c0d673bc48b34fe46af4cfcd35f8ea6f8981a7afc32f3c592dd2a37cb879a89a1b5a54d112b29fa26e5ebc95d10bf443a691e3c1d91040fb3e5477f8a8559acd64c14d970bb17bf02b04184d426a068df17a5e31605307bdd85f1542510732b20ff8dcf39427563d9bd147c5b2e0acb2e8535a6ffeb11680671d62126e5baf9784993ad0f50d23f98aa56755585898e16d2623230f584acee1b1ce551b3e32e007a2124c4afca4970c48f646725aa770f7976c07d0a817a2d7d778fc4f5261374483b5cb6eb46ce340b68cbed4ad9ad300a86d5ae59da4132340a3514911f7deb56f4fcbfc88c940eae3893ddac04d0990c616f49d262b7bee75c2269121d9ff9bed49af63703d6238d4263f59163e2fdac8cf598e628f80b320517ed7ef93036e27b3526daa65530063bb707cb7eb5a018f28151b090f053804486272ac002764ca34e2a907dd091755b4823136a525b5c78e90f95b171cf8890524394912bcf068447ad868f0d4444d1474e4e3bcae03968dbd503c16797d0542aafcbdfc5201e26465560c2bdcebd33d0eff34536670327786342855c6c64e7d224eb00091a5fe8f9631c4f575754657f51eb2a4ef2ee780a0c2ffb13400af9484d3b86642649d00740a26fd0c0ad8d9c26f56f9b83bafa44f4fb7e0f6d93bd4b7d034f95636ca01566e60fd584c4fd6676afb592e8cc86f6c016c4b6d2c31ebb4d99a524dd063a7791de64f796854799a825ebeb537c10c91b49023c77594625d2d36d3e06365977e2863f29f8f1e6254879550f54a9b90a64650716bebadc514d06e3384380c9003b5290e42989d4f28ccb4bd733a0e5dd88e08edaf1aabb02aa09ad3ac24835b8043bc7c580bb9d061971e4fb334402ac542b17b54a641c47696988f3ebcf9c33980bb39c73d005b3b78619454ff35e1ca763443958441a1153820de26035086c0c012e787e797f40351738703850a22f1cc198a37ecb3a07e2b310ae52b57db03ee03fb27602d6530dcc1955b696b2ff0c27646af7e21fdcc14589c2f3caadfc98b273c9574b1931991549cff4dc5b657a51419e2b19135b07caba82a574c092313188015574fe605c3e05a275603f3ad7a0d50955e3e29df7ad8d91a28372297fa11a1f45249fd7e173d467f7fed9aa699621c1509875e2096c5ba815507c32d33a99ed598f5a14830fb4d4ab9fc1392cf97043e6ee82adc5a8eaa91af973b7dd19381a2fa81957b4f921144d9ddd6bd61cc4f18f432e932fff65d4088f85827cb1c5e2d34ba0267f52593aba9deb026229772971d928ca843aa407f027137dff4b13eba0ebedd147e23ba8a02c03eb65a3dada1bb84205450a7a9aa25d92ef5854d54e783fc2fc445dbd04c1fcb8bc73c85579c12bb271be3861fe027c39fe5b1cf080a4d79cc7c5eac2e896aca823fd8eb09e6b0704c1a086b54d9f463540e0191e000b74442d695a1799a4e3b955ebabca6b3034eca7b6c2b3bec138022a5b25c8011c6f5646c81c3fa844b9891597dc6539987ee13ba184238f0f2857348218eb79455fbdd88e500d5ddd53a9ba62c881504abe4cae3303daf32d9113bdd196a02077b24c919c2015beaab82960ec3b37578aa4de809a62bf3e8f7c63ba898bf0c9f3cc26914bfa0479830785cd17578ddf70306b4422bdc151047fa90386e8089386adb24b6b8d15572c7fbf01026c5af2de7eb0c2b5adb36c25b9c74dcdbb061b131e38e0bef894f90c3a36634e02851212fbbbf8ec840a06893e00d5fecd986cb7f6fd24c5c473fe7f5f66fe582c52e2b7f23935f19bd81dd0961016839db5f21991a58d70f893517121404f8a5622d4c0a074c7bf6f150d3b373626a8c88f27d5308e6d48b7594147a1f16f88f3c8f173a5c8e4390190d6cbeadac1e8cacf980becd5e9ba39d3568cd8381cecfab96dfa91b10b7b58bc89da82659afc7990b1e3e97f1e035e92449c97c5f6e7acbde920b652f89f785207e0b56b92c8db69d80064817bf5ba94a32227b959755ed526e7e05e98581bf23b9e3a8368b03508ca034e49005c802cd4490aeffa99db98a33bb15fbe8f836ef5752b14eb7078a1c43225c3d2fff9882b6895c4a3bab235804e6cde26d6bc41bcc6bf0cd72d33aabf709645b3829428d9a39512b1e76570af0822f8d8f878203b8346174a61638943c54c4a2ead1b40e4320211ab1d5bf0a0868346d582dac8986ca3b9011243c7f85a851a72cefc6d019c5a82893f5b84222c512f5763c73473ff3577a9274791eb64f101b1953e0c22ee1e30b918d815690c3836e779d011d1bce269ba653c4985b5b3e2ef479d2418b081064647d19b84aae48b889e39c943316fbfcf47ae349b2417dcc27eefc2be900cdf9719d693be3695664a53771fef8654bdcea05cc41004c378fa12a2cddf50ac98f43265e3e29328cd8a2222dedd8cb2d0a96563ba029b66468c7b8a56c1f02579af90519a0d2ba936922a254094ca8edd7ca4a7ea9f0807a074ad8dd9aa03098d469fb5df074d6da54fb92968572c024cb923006c87a22fd81fa59c499a3d0e773b4e68bebcc2455756380fe895e78b014f0545d3af69778e40ae15ddd4532fd3460808262ac9d30ea1994c422785cca3e629e9867ecc1855d80d799056ec73326366399e8656c693811c8ce653f1c07756c8ef1097d3b9496f1196e0a00eb7924743b2b8152a4953d11e42ad9abfd39499f4be64a833dd70daddab9d88e0ea1d46c50d83da768497574e74563eca8bf5777be0ac635f584cd65b9e9cdd064778df888e18d70f92a1574a904ba7209a61ec8e9ea2db350b2b764bbb78114e8c4c40d7828399a097ceda9615b2177c239981cc333a1eb5e75b14eee591eb486f87e41559658fbc9f3a83840a72f79dc19c5f30544c80212c36cd7c633c6064d527e3144907f87083da6c76fef47c49d85837bf7872fb5a3fb68ffce50649e11ff3632f2130de24fcd2029101c40a517b8de2ad59ac9dc7b5e85b514e8b47b281ee310278a5a4085633c5b16905ddea50fdbc8009913260e8065655320de44257f6bb86c6424acbbac0fe8839895d4fafaac62234d33125b83082864c40749d805fe81e70d4e9f6b67c1574e82d0ae40a8a829adfbe0100cf122ab347a56239a0052a5d1c1734141c1667fe9ec8817d2f6d7c62db5e3b1726eb44de3624e9d25907093d8080c56b1dc81858b6a36d8fe49cbba0291713b03cf99ee70030e00f3468eb2a1231d51f18abea950ded7b3a59c28714476b38e7f8507281315cced5d2130ed5ce20b5bd82004b3836f98b6e3172d971ffc5ea0b3276e6ca3bf135c9dcf49da0fa7336b68ba399708c3bb89836b104fb69aab8a9e3c431f21453c013b37a21d25ed2f3aade04b71e1133b36184bafe1d4c119642d280d81677c5867ac4d418fe2358ba8296ee4a8f0f2cfc9e9226823c2a5b36b1558fa19723d5f3723dd3cb2a57ac4cf185e93a7d91bfc4d4833c9b0cef64222965c9577134b3f5399c2e4bf5a6d3b74143bb20a04530371fa8612cc16e2c26a279553eb061504b860e838d85807a4fe685fb0b8ebf112014bee891d7786eed29ae0d6ce127cda968be7faab74a86761d727fbbbfe483630b54e1771a59fcfe7076762c00f27475f9d9bccd1456e65f64c9f7952f3b8cf5a61025961ab9c2f28f9322e95daf5de131c27f026755bee9f136230595c0e9302a85d1115ac6a8e785b4db2cc06b5e55282b81c720ccd3a5c6a4aa2a7c3661de3428b94782e36cf5e2dfee4b58777f38496da8ffa05483c22cc126d4c74af752cb35d22981a3147767685e515267b275320877ab5d69c66c8240274233c04771b59d4a9faf952ffd8b48a894e59087d8609285a738dd3faa752c2ac53a195dccddc5e6d4c9089507e2a2bcce59310c2b7ca15aad2e35b2f302936a0207ccf1da58143e4705601ee50c6919e430d6b039d4d79805614ee1db5ac9f2e5e0efc603a3e9b17fe90b60f11a781038b1eba91949c04bd49e4ac62d60a8fd374d287c649abe7780482399d05147a29113b7fe23bd5d3f9723fcd6adf25d5771480b111e7cdc95e4f538d7d6b66a95fd994256aa795bdd59e7f3d59990a36392c19baa6b0f77280f13c45eb0d73dcf1da213e1883256b7c71a00e8480605c0241f5e8065ce15200203d55bd87f360ad5b640e84aa34120614a0a5e456fa942aadab667848337d5cc9a117f10897d8cff7164300889796776de4267586dc7f647be27308af6aaa74147b31955c9ed5d6d528db089511ee643ee422b8c68ba8daa06c463f175a3639439fea3f1eb5a9422d6da4430b93bc9ccfd78c1868216c745cc6a865a148185d86a13040cf8f4029e99fe8511e69d52d974ced5d8737f24b5410529c3de2ef4221231098eb8fd4f42dc92ab85b027a300803647f805bd1838a707658a76f8955a7300dcd55539970dac5466345b9b697397dfe73dd8a9c33b6ddc8d7c5a0e74c6964fd7bfca9ecf1da92efeae0fc0c31f741c1ee1771a9ffd78f0c66d009e1e0e7260029fad0b242cb3417ddb607f20b204b8b8396f25249e18c6839e4e9a76d36fecbc7f813ade0ac4b68074a615c0c2d47d98bf12b1824e6187dd0a27bef1b0ba43e257624aed64c7ebb66f6539246cde441526fbcea52afa6485049cdb7901db46aabb57e6862af9bc93c51a4e104384a9e8f41c5b49dd40afbdda07daf023f8fd1dcc294bbbb709b8a42dfb07e46a6696e7f6cfcbff343aa54e471e2ebbac8a2144f74fc6b1e3cc56a71f2f34c48193d6c9fdb8d6b1f21c27ca74adfb502a81c0916ac79861090cf068b4a77cc07dafd7b65d18973d3b414b658d644a66ceeb914b1502de40dbc9e8d4fec7f214c11a8bc0c940fb79fb2b3bec90e0bd644d0b0510df7e7c26e759e8e867d657bdddc42a5b3b713154b64b94e0037a05f18e46afc587760a6c5bdd26b50d74253749ca59afbaf37c90bb74a37bf2ea46b37a9b0418f7bdead514d04fef50eb1159b99dc9e881869e071350f4fc21ab915a0da775ae5f61d4c7e2c5b3bd94cd5d39678b511b3c546af275cbf2691c692c7d48fc04ea632842c16549e632d3f907199d84f9caaad40bca46b809f3482870ffbea262fdac543f19d0fb176238dd863018a7a4ba2bb6b025eda03a8561e7b3f54ef0520ab683e32ed13c4e085d00845bc5580747a032c29db7e65d5e65dee425cbfa1a170810b5d1b0bd6b21ec90bb9f60c6b2e1653dc07df8b1205419eb7d174dc09d8b0a76111db1d50996385d3605e85885d6464ce1a0136eab729452b5adebae5addf0e1aa1a8bd61388ebf57a69f3a1d59fd4a2305cef3d814beb1dfc705656c003a0fba8b0ccb9e49e5bc2ce10dd2c0289b9509bc925e431229628ac0f26e2a95f59aaa7e188a2ab64b8a4114a8212c8caa7032220c07f5ea13a4e4870f92f2f35083443bacc68ee1c94b5f9f0ce784b5b2b6673be54a913ef889be364e1e2313464cab6738f7a797714894c3f48a1374212714a6ba2cef2251871ddae1abc1196146178b10a6eeb7fcd5a0186cd9475960133ec2e0e235c485ccf1672f6b4d0c9869979a50bd02574c77e36da2eb2c85cce22f3a4cd6eb00d1191c93b3c1c0af0be5965158e153c873ff8086b5a05a2d06a3a59502a2b98b7f7f12025e72fe85cc511f0396fef2053f9875a4752e429c7a11097edb0c56e0b0cf8eeca88ca796bb13311fc6cdf3a198697e5aabe7192e1f666cc86c08cfdaec702a506d8c46e03ee9f3513c9a8002f3786cb5b4fa83234bf2671c32b65745007c99c02a8827da804deaabc33ff29c39a25aaf6e7ce24510e7c0522cf222ecf793d018e19b4aa639e930b9df07879c1b9891306daf1eacd6b0eb9164df44d6e2e033de5e70173815c310626679f2b20bba7f03d0f1830856d970acc922a04f4147456881ca0116703379429663df745db1ec3c4bf370390bb00a9d8df5317f1f0dbf458629d0ae7ebd3c1632f39fde2ac412eda147d296acbf6f681de73b78c47ccd037090f51511208eb6d026e499af8196f6467ab17c0ede3c3f50b8e01f1d626d49e354c5e4d8ff9ee839061b92079a77b9d6f0372be558dc652c0f9e6a788591f64aa93abb59cbc014459c423250e06835f90e624b73f5f5d1a1e84c37852edb3c26c1f4abd664981f2d5852c9e377039bf01de7918687c8d901eb3a1ce1984db8f968303ee066b6a912c51c046fa7832df2b660ab588bba9737dd33d6c15a9bb5da75246c86520a8a0490148e078ce25f25b674cc05fdd1514ba073408252f414eb4d3c791845aec4424770b5a4513cac9d416a67be8e075b3dc5925ce50d663e6108c4eba29144adc2b08eba0becd5a3d2f5e36683e7aac4f453150863669c5072472bd230db33d06bcbe0e6a8eb602257c4f10cfe03e3f712c238125c587ab72bcab0cba1f21a2ece27431d3eb12c760eeddca04f41bc741179c3f211619fccd0ae50379275b4cbfc4ba6570262bdd8ba3face03a6e65d2fc6bd9c1fc4856a279de8a0c5e2ea58304b7af1b95a5ba6c2098a0debe67315acf99def2bd16adf079cc9532fe3f50be04123445ad2cf72e855eb36ee3ee3af5c958ea6d4436f397bf106727bb8dacaa0a0a044cb31f456a3eaa7e2c96800a3c59b6c3255ee8326545d956c9119c2a0a697168e06acf621abc8f4b81b49d40f25a1df010bbb1c423a37e0425cad5b2012ca5d4e3a0a33809535c4a730221ab583f478be52edc5f740adda94558c02a05cb0b56c88690e729bc549b94abcd6c2c8625ad95f31bcb22ecbcc88543bec00ab75aa7dcb1060bbb0577317bd8cdfd0a967d2654543e5eaa9f33aae3e901b2e4f1a97f7d374918f86ed083bd42c5a4b996d2739b7b038bdb46bcacaaf79bec7578ab39d64ad25f73f65773e859e2256f225d23fd74ee4ba350e12455b79330890dca9b7f42e8415bcf418991255b2df27434257b5f79831b7f2c19d930405c1f06b5e75a503e0e68398b1b0023e21f1923b34a75a1abc787cab4f2f71cef7d63915d4f5603d508159e12379ec711291f68b16399504dd2b1467a97397febe16770c0f2be84e1070bd7fe1e8e1e5ed91ad8d01ff3d9fda9380a4549d1ff03ee8e7199adaa900de48ba7e9716dbc5037dfe3dfcdf8287e58d41ba0b0974b342d201c991870db7aa1025987f13d1684998c2349877e37d0870fe0afc7187a0cfd23a91313c4e80ca78d029708da936e8b639735f06ff3dfa3dd4c0b88b836295347dbfe18db44f88f48083edcb1bf8d9b6e631c8c024199ec4a742276a570b12d7f6d9817a641605708c51d556f44f2410425b799f17c9d0e5598c89c75c86465e1a7c2fa137e45e7eead8a23058afcbe34ae1faa1797524ea3d5ba8cff0d807ddd6186280c5d452a60ba9286dafaac4d5462a6ce0accb9c7f2d9a2dff6f8e655d24213e46593ae40cbf59ba930203b0494d8590ceb027611ec73cb4af2da26f59d3158d51b921011e0513376b951babe06657128980117b3236b8a07e1b6339518c4bcf802621f2935e2541ea1510604ed5568a79db93029ed547322b7f491d814cc97b3dd98e957eb595f210c2a6291a01afd7f7322ca4547445fdbf605986ebdf5c1737dac4e0a070ba15efcddb901c24df73ee1cabaec7fdabbea8dbb7a21962ba70d042eb7eaec4d3d6a4b2c4ee8f17a12b7ae6057ae1d8b7f5bc74eec9501c25193300e1281f59df0099b98d44595c0d89e54c7ca284127fd416fabe89988564e4b669135d83f9ffc5c8b83049e2f0e8bbc813640e5953558df94f3dc627e1da26a1230f6caa37681bf48c951748b61e686c7fe2737a89680c6356ea4ab9fe392bcebd71d6439764467b3cb33758bdb38ed7e5dcd9d5ec9826a81febe0f5160696ee01bd105f2d693e5b3607a3e60b370fc8213065ff51080ab42c1bde746d3be6cf51ff385a9cc6b6a5ebc25eb4f82265ad6debfa04af85cc0433e6bd81dc9b841c618844604312de794c2c35a40b00d44f295f7fefc42d6245c853c9700dfccabaa12921e732e3bdc3316ae6d2288b5229ab0994ae45208d8106fc81be67429b16e51b58c2526a201e87b0c3b592b449df3c577d71f8a04539b6db1bfadd365e8e1ea1f857b310a7269f8ffca013ce0040e0a94402d721d2dcb7144842230d8ae5ba6096a0ef0e385442a06cc3a4fc189cb29ba7c73f01bcbe4578f2220fa8e9d8eaf2b3b30e44bd345fec1f4465cd4174d36df8286691f7de610c68036a1da277f4f4b6f0dbb9af096e28143741fab33a66dd42986d0325d7db58f8f3f1aec37532b5fe98f4f6712b05132edbd7a267ed2b61497fc5326fba562c135c5e3a7cf6e69b5c79d986fdeb5b5cc4dbd2f2feb682ffaf7b3db72c769a910c38a84479df4e6f44c7d965313fdfec9d38de5ab865afc6bc2f54d61391c793408189158dfa73e1326506638c269a3432c8a6a5e419617a7703406c8ecfd28090fa106b6fcd4aa0b694e2fbd71660f3c158f1ed1a71dc6308ce5e20e554460b5b6aa556be16f32fe045605dad9f9284a2bed96c0b38a5d4e3dbfe65669253d5ab09fe7c3f11499a8fa8946ecd4a614920d903daf0240cc858b286627860772bca0fe65cebf983a77b7e30b505f9f441a956f3a6dcdcff57d8185c2a02b625ac154d9a0c6bff61ae24d1e922c4356b5ee11a261034ab120f1c0d57b0e0ff17637de91264cbe05dd5bfba08aa52305499d3d066024c992e30ead93c16a2518dfa4021fb0642e0840e5b278d7b83130246640a831e05218332971a8f3a54f534eb50d421b7d53b055a6bd8278b46dfe7e5815cdeb6246eed85dd5fd7f696b988dd8e956345175dd20d87a952fa740653813bf5d6b61fe75d4f22cf02fe8b6f174f40e3fc6f5bffb2c390a69b8d8d4c2b57eceb9ff0cd485ef96ba1806728d714ecfaea3ae799b20a9005f3097fc71a5a35e225b8ac8732a79ccf701472f36e3f4e4eea47516d88cc64c1392908e19247c44fb364024b8d423a8f38c2fe59c47dfa238253a0e6d79301d9d776320b921936acfba6ca962596d9dd78b0988a802556666f5433b3e2f6eac21af4ca7913798aca6e28fc208aa14527d3073a77d12624deb7b20815ab75e1813c3519c1c5c37520a20b6aca1725d068671cb5ad166759d49905853a92e6c2490f2178feb5e8e7a215abdd4c4bffc239804416b105be934b40e1541934858416ea4cdddfa126f4038608496fe05cc14880c9686f4cd2e5c720282f44893c8b1ce3d65a78dc57b40bdaaaa452873b9cfdf65f872bc031a2c0c70191469a362e29b856639a90f17f131393ffeaed7f7d5e60bc82c8f7b1aee3fb798511eabb05e370cace1a987e43fda50243f5f5e7af26244a28e05f3d530fe25feb942c82d3d846b453a21f02f8003ea688a09eb4cda85f5db4a84b92a203adb2b91fcc1e838beeda0a61bd634bb4d7f3e07d81e70ae5ec0bc7e19f46d14da93fc3aac6270c213b42de1dfcc2214826946a151df09f67e61465d77b315040663a254059eaa2b2f7442217898c44e916ff6930ae8632d576d72680681391edc4aa1070d28a6984ffdb07fae5fe720a84e655682fccca14b3b95fe45e3534d2dfc9a8c33af0f85e9efbeea970d7ea6cd67615b3cbd1ae6fa268b3e944a1b257542308ecb256693482c425a72058f851080a90de600d140c17db9529c5f1ebf25624bcc4fdf21632702463ad80557089eb12bb31f885231372294c6b89be502b9fb67970b0e1342eec0f2e79a978e3ece3da45e3710375d4574a7d37b7ea180012f55c028287d3f196292b8f15cc730148c01b945c159079253081b0469f3f173969d10373e8fa3e1551be375b6c7130257dd0f0c64454faae33038fc283da2728131ddf19092ed4cca205bf64b58efde89a5f2588c80813b57c5eb62935436ab33317d14326d6d1a8ea568fdc2b6ed08ac46ac01a7c6947b5bf12d025d82b0d09a51d51b3706b8029b2db32204e8c14c5419f7277aa22177da15b9548ef6a1a1021c546c0a7ac5a55624793ba578bd21dc25a704f71dfbb7e00f0bd3a4d66f2052810cc522e9e6e2fd1fba9b82b60aee239697fb49c3c5d70552d7f5d19bea8bfabc0fc2b0ddfc9af698f200d9eb9c36c24743ffa456f09b23e9e5ed53aad1d7fd0580d173ec03e6ffc819e846c1b48e11ab6f5affda2359252d08c1d6e85e3b1ad4d54b987a3972609006169090f3a2ecd76e36025e1a63e586f9e7e3ac7056dee318a69c14d43dc3e8d10b3979b0a1ea2d5d295e1158f018553ae51bfdc0dce2773b4b5b40dccc626ecfa4315d5ceff2a04fc9bc5cd17155260dbbfb6aa4d8464d7290cc72a8b6dcbedff33af42ced74343d79ea8b0ccceb708278046f390b0e4de0174542c8b348f49e974dcc7fd668a3b60584681de095c4bb2459a0b4137e64a3c14254d453902b02a538db34632bfe1b01ce2aa901669e666a5a729a3418750525523195c1a880397813006ad911821c16b8a8036775d650b3b4171eeab7e2bb31cab766b05f649c881a2ed1e7c75c14f31b14128c4612a88809e212672cebd6e33722be749fc0802a2327d7cc5754ca6c4ae7da09a891c1f0fe58f9b454bd4e0a51af5e2ecef75f772b497423c4c649c12251070f9ca16cfa0738aa38968f569de57e21d23ca41e19f2575b819719b570ba228fd43bdef991de75303c8ba5293209598e9ff6b0f526ef6fa43060f12746dc9a07c8b2a5280506d2d499218a00488ce0e065ad8863dfed034bec077bfafc3161ae11163f774c9ec139cb2d5645518a76590f1bce60bbdac2d1cc4fda17e58ddb79968b07490841ff343cedf3ac1a30457350b99fdbc68e947c76eb6f11f1a6e0a5b5ae848e1bffe2dd4089d334657116ca14ffe2eb60d124ad10c009a9bb07005b3bf789ff688a22326909cefa80538a43198460683a9e4471b1a53bbd8866e349b387703335543677d9a4a54b02491062ca06643ad4a2f7f24b43dff7cf10b6143ad67cb1b94057efa53d0176317d56de1f6e281d8f69de842ac03dabc5548a7c980f8c8a21f6b3078814fee14aefba6045c5be1901993d17487fc98217755fbb946c6c411329b65a23f1beaa30c486814c43435bb9c359369b3f51b18f1a93f5dda68888037f42830fad7cd6950c6a76caa3eb0aa1553ec0154a844d5500273429f0f5099cf157084e086401591b370bbb965798bbedcf959deb54a07e91ed9a85943f7859369dedd6d94f3d6544386eebbd81189de3d5d7e804ecb2743fc9e2b1f55d390ecbf8923ef407b8891b187cad86a4859bbad945a5bd79d6a2c3dc5ea744dfea26af63501160e57cdb707b757c2b6f7aacad8fa76e36279837d4b118865a31125bf98e4772b2bbb74a397d1cd0ff53edfd81498facdab178efc1abe1d446f8d81074f6ed8e0e4011c36de9f15ea607049fe08e1a3d5e9edc7474ad2407c1d239ff4b0bc3678446e9122070ce4adeac8f87b5959189db3099b04c8eae02728c87591119273e30f7a02d5666093552ff32f35887b66daf533ab82c2988d4c1c6a5beea8a25a66d08982e842b471793713aa60b48e69c0a2a0e8e3d844e287e928afad1e0182897b98cd191355c60525231682082aec10d9edbf30243d076d89a3a9b10b9852f603b6d3bf65bddfc6dc7a9759f11715cca376b9d9d5e6fcc3b32da6b6e8e06ee65eca0102b82ff39f059c6891caab193a428729acd9d4bfc23b7c215c7358ca0f72994cad2a3636f244bd555399c8fc738cd689127fc465ae80fb0c14a23cffe05e490e4b2a671236d64b7f8bff6dc556664665174097238b61ba621725dfd58a6fa1c5b75df1d7ae3a10174c558603399f5c3ae3c0f5bf15a307d5c0cda1fee964db22b8f89768254c97efc8142d324820a856b1a00ab6aa4cea9bf90a75c5fd2f4e896c198a65b3b502722d5f5f333c066deeaf55da4814831026585a4bc27922c3f4b2b3c3ebad9fee018d5c454a7f491b09093edc15283e58d3f1f864030d00374f745f38ddfe4c28dca9943c9f5b9c3c368f8cfefd411a186a12862e4cc28f79b594c44b30f5b3dc42bfda773ee74147176acf1a2b1589a03243cda07a9508a02c9fa7d1b3b9b79c96b5c9f2d3f5ca7f88896a7f1f652eb43708d58a65b5b9db09456f17639dda832f0996f46c15450a8c404dad293f53a5b51b5201d72fd818bb8cd000d4da8c724eedbe4c84fa14f136676a679252d945d2c7e3f3349f7a94f9beea5afb334d341079e415b691620f70f04e0dd33a974800f6a81b68fec66b060fb7b80f2a6be16d0c484d78c2c88a129cb2caa3d7324d82d42a70328bf8262d72271a79dbdca2c1827292b4bf4c19cac9dd90b150d1179c4299c13a65226bf94e2a25cb5e0a44f2739f49c932539721a425806efac7923b20e85931eb52ebe109ff57261b7e026e0ed79eb54fba47504a94089da386ee0975c206cd5335497ded0352ee7b17aabefd6c059277c127397212d0a2619d6a3ac15409bf529a1bd7708ac51218b7ba7a4385c83bef7c2e2c74c0d823e220c930507d243a2b9a5c2bb944ce17ea5a0bac841d96af901769472de5ceb2dcea0230b7cdb19d76207f06815eaf8a6e9cb98ff004b23bd05db6ccebb87bcce47052c18104589be143e2523e7c3231874ab8ebe862ef4aa39405b87d512e4a113588aa315e72a3ca3ff692951a38e7532738c4f7de9f903bcf4b49ec12115caa2bbc765a706b32d9c3a7fda899315ac053a1b9f0882519ae659be9325bcbdcb0a5e8f781b88442d7cf0515fd7350887d2243e28e51352adac496b8d3f80a11d5de5f029b6c847d5929c985d20ba849ec6b29ff50af08b7f8936806281d2142383a45c1193efeb21f025b3581d5c3e2c2a025cb32e862812469bbe785cc8f4c9f5f33e0bf19827380f193fa5b4149fd2cd0c3da989d7130f4090fdb16813f460681c915ddec339f0ba91b75e50556fec47a8f3ff98d20132a371b23747458c783c76b3cbb991d5b0d65124b21711f927a5ad4ec04092a709b53c5057dc5d2996b50ec75a134e08ea11372f79ff577607c973cc4f8ae6a659d700b81d517a2e4c8ae86ae58e270cfd8730007945a36e2a961a9ad62e910a2f49302f72e37b5da2b96509ed24e34108def9699c60d764a048f4b15bd8c6dc5929832bbc255281f0d1b565b3437d8d5f79c38daa64e202f1e2486b6a225d84b6fc8cd10c6a1cfda57615c56b56493c513528e1db1f698336880c37dc6f28f003734293ec044363692ae938aacb95063b6e836df1a150ae99e4b620500ffc6f02d3c2c5ab76eca4e4f5f49be4b62b9d8429f7b119dbbe8f5eaf32378c6c974d08dfc816a3adebea48ef26c87f6a5a31ef4baa4ad2c5711bd842fc4f35b5b6bef928bc034772e29d7d12fd3b3b61cc39288ce02fa2aac3f5384d7795d09e161981bdd706ac5975169f5564fcde8730c8e9e333aac2f6b34c82a265896aa1f0cffa2c3922661c287dc70d38775a6102b0362580cf630bead344a7151c89a78b38b32e14e69e7e9225651d4d5e029c1e3ca3dcf644d57ba33a68bfeaa1a0774624230c57310576a5763e20461afe83d0aa7633b40abe05035e1227f91f23e20b2d2fb35738ee96a9b25cc1f2b4d5fe9e0b721c03c2658362cced80d794c73fe4987831793fe54fd9e8ceec69cc7f42d1ce401f9ff3ffc46a6b4a3def35dde3169f11afe2f511bd129bd3b98cb50a044d759978ccf24a5b2c36735f4a8d1ee949d3a7d2b2e6fa6e04c773cd9a9095188c777ba2faf365212be1a127917c8890e51b967bffb5d795ea2530742b83ebcaef03f0583b5a4b25dacaa5b0ec576bc8c8d130cb625a00fbdb9280863228a6175d163175dc7bfdad5c8e0f0d3bbda73b69623b29362c63783b428f3d7922a5199dde691332522cc5aef067f2f08f5a50081e761c4f2913036f95efd24994adbcbcfcc7b67f2e954c773e824d3d95f8aca04cf5e52bc671387778f56ceb445f671dd88f421e7c434b4977ab40ee5f5608f9b7ea08b23f2d870dc6266c3605194e09a9d6b9501d488008e1395ded04f2c8d0d744e23bfa87052621fedd6fbaaaca5ae1b386dcd2261468c7f76b2c289ea6e72743e3fb43f8019dbdf0b4504878d7b69528f44718ae4cc75d8038a4c2327acdeb3c6a6c59245c59c82f2120b46149093f23a21709d6c33e8c9df6fd25c110e7e4e248f7e96b1f914a6a53c431b0aee78db8ee06874dd6367473594005f6165249a87e8d5393cc1e1ea229a97170b82a5690513ded5b63712d0ce5d205d0024198f17a228d8f22bcec62a047a6fcbda1963d5d21832ed074457f62a30bd8f21aa1aad4284515117ff9607538eb51d51cc531d0fcf88ca9900bd28a07ef11551a114a2e691d76822e62a6c6274c8a57a33513f4f08d815fa6d6c4e69cb8c0fab17a8f8ddfe12c19a92aa13223213437ab2c1a8d60f4445a4017f2939598dd3a66ec29b695e89d79a5856594134095eca45f19823022a4c667b5791d28359c317c523090091f4f931db7c78421370ea8a7db22efe62cf1d571faad191899379ede566f02ca7d0c66215a9af4e8d8eaee682e4107545233283eb5fce62ce0149a554abaaf182ce649a4127df77911efb59e15b5ae5a98f481bb0ef1c99a95952def60ed376b73996903c459aaccae7f91011a30d6f7012136000dab754e0069367732339d2facc095341c57c88862ad0834fe7ac044dadd64adac246ff99569a120d11ade2f87666c8f801278075d0789038a7f70966c77d3e2eca2ddfb93524ba5b7b7fcfe082e6f3d6886b3b42137225509d7239e61520e98c0231562b6c1a48bfaa595b97eae369d9fb867b9d2b518b5ad89d95010aa1603afb5131a64f2c77524ef052659fb2d28398a995494ced22d049a22e76ea742391895acdd52ad57392c0b5295ea0f3188329614e748262de426f468b782a8be5fb653de30e49a986083863d93a004bce83179b28551d2d637f9ac90c28eeb637138b582491f55ebae4caf8fb76fc4614bfa141f62bb84b3e2ebef9aa8cd8b3479500e4b8c90ee94c49e8568d48f70a97f810b3f92a302e475bd530d5287bed51551d208922e93ae7dff3826546786d01ed0187a239ec9b8ad563622c4d849a7e5f74b7e1f2d1d13eecc1f5eab5ec6931d34ae1cf0649b4cf3086e85c48e6af65d3a2c97ce4b90c21c1048dbd9f76d47f3d77303a7d4d4228ed7329207655185cbd133a401dd27d6dd8936dae049bc6fb4a43a661700d94cd8ff9fd2a72a5a1037d5388662543abbf6855c2bcce3ff48a120208fa26491d12899d0c65882f715ee6e93f28bed2679a5aa7559b3ff172a82a96b1282f642d40fe5ed612e91680c93aad62000baf15bde39069cea3150173aef8acdd9c97784c6adcf93b5dfff574021eea110f85e88b446ac170a5293dd211ab2b12ed2aaec3114f309c2b4c13e883d91327ff45e8421ea22af943ddb9c214dc95a94a7624dc40faa378d1ec3c755e25c30329de3398ebe0327ee892ceff16b5adee16afc3806f8b6bd25739f23907521c06e90320bee22d3f754551f31555653323a9220070efa5242b183fb3365a7d8fdfbf8a95a3138cc71673b2432bb2b54ff07c12656c1bc10066a6a0120fd437e91ded602f30e13510dc192d657d4e6244189caeba892edda033d490732f8fd562c1f85dbe9310cd7df7b12cec8c21cdd4c9995de536055cabe1913b4d1d991e154b977a19512cdd7427b68c9d53bb59be4fca63a8b4d4fe9ea2714ca07cebbe733bf3550b1a9f62105ed08e7e1b329fb0a9c4cb7ff26a9470a29cbfb283543aef326aae261555569bc0efac348f9677f67df59455ac5755720b9d611d1b571db4b1086d59b8ca443fd1eda4197616bc8657e180ac710c3d8f21ba56cbecdbdfc4336755fc215f552fd1693e37cced71a8f242d3328456d0ad64f2ced4c33dcb08fe1dfb71fac591a99c151c8fc9017b175a21a04aea05ce380dcf14aab1ecf42e4487a57329b73f176c9b87ec17108fecd0480ede99343ca5caad7826f11d8903cf63b10a1b5c2b917ce04001eee1a7fe8aea78e1c32d0cee443b16e6d785111ea8813960469687e1eddc4d8b979be86295df22e6918045cf3e533e9f93a100ac582e3bab559e8bec866405f9d55369ed8768448232a148336d1253f6d3debffa81da1069eb1de59a8d955f8e00ea8168ea8658c16fd9ed04892e7af2f523cefff25de209e56e9c3b4c448e7e32afb5718778d306a9bcf61e6677aadfd604f15d433a567671d63f43019e94204a550f4b356273e5133f0aa468623bd8944236aab1c5e19c449aeee9c620bd057218a9c6cab1e1bf80d0e8a6ebe48a0eb35204d2e951bb9c752c71acc3259d5567c8f82babdeff387965e59caf39c86c53ef1f400480067edb79b70f388417f09ee989d306f35f8297908629f13459d2094d4c45f252fe6eb9212cb8d77960191d71191c03fdd7aad5d5aa7afa696e89c99d120179732aa8a3e6ac933abfae0606fa0e078f761c1f09f6b0cc64f0f8e167545bb22232e773fd268bf9695837f8ff3fc90e0741b4fa71a50cff68d9e460e851089ca1cf66640038782fd8c80738ec6dc1855f74d0cccabb4d84e5f2af83a98a44f2075759b5c23745d0e33b730cebb73ab9ed8c8c6e0bdeb4996982b13694d66d6bd341074e5b7e56a1466e559807ba23c1a2e2373b6540f3facc01aba690805205a8f11bfc74d4b2701688baabf495d5b87938f0baa45fbac3736f024880386b85009edba18285e07a8b46d7355d246a1bf846934a464a611e3a230512fff853999127e3ef347f88b0c563627502fc3de9b11a4a80e01e14fa6f1673c824eefc0b7d3f1aa1a8549365a63a95ce8bf166b8c8ad282a1d9a5b06f0132059517569a5a8a2f7b534f822c7315536b0a88a930a3137892a6a06c86d2522e013a4eac9832fa08ac24e462417e40a005208eb86b691d58f4c8bc82b1b75fc6d07b48f56854db1fe061ea5617dc1cdf3417179056abf928eef12563a60360d563c9daf969cb9737a525cd4d974592f16594a4375480c2eb41978b41e03fb48a88c0f2daecb9376ef900d4d47a7dbf7d1e3f7e917f889a3b2b4710e595d386b1e1a0680de56021a9487e3f9c613075d839febf48c5c3744ec44fe6552b11a6fd6fc485290145bd831a9497570557013b7067486df6ac1862cdca39fef15d500b7e28c2595923735bcf4e3ab95509bd45e52a4bc3b9ffc38d25d3e27854a3ca8e4e26a4866eed9c6e3604fba0db65a6c91029707e0067163fb52f72abf86deda90c7de18237fd17660ba92fc427806ed598d4a3359729750abf70645f8d3cdc5634d60eb338bc2281bd3710fbccab1247cd3eb7963c9c46820da15cf66e1fd5cefd9ff7f562f4a72aaa15abda7be8dfda8435662052e36ce1d1f4fef6c1111650267f682402ef3f9b97737c5af86db8c0c246ac0fc99c43995eb8cb5b4353079463af2a90b865c2041a111916ce0830b195f0a00874912f3b771f39631836bd29057b5ad4dc71ab517c396cad82e9d31d86a691e82afabab71340dfdab0b2677ae437ce823723902a3015b00edd6639b1d36f669c67934554ed04e7beacdb6372fcccea641ca77779ebebdd308ef4c764ab61f71b27caf467fdcadb2d36bee49f103c4df75571b4257c2cea459c15a2bd52f2c2bd7df629ae20c9ab853f25890be9dae831087d2161291cccc48d6bfd4143d19bad2922a20ac0316f29b277dac55017002327b050ba836131257ab0db76aad90d2a17183901b325c6cab9861d6b593aa447dd3ca07ad9e4658af4c51d782308b1f83e892b04c749ecfae959d68f12150cf309f90e8247eaa7234b68025fa40728422af00ce7d27ae78c646ddb0083eff09f72450b0cafac998427f618cd1715ff8c18ce3205cc47652c2c993568a40345f5eb72779b0004fd86eb2c1764525afe3d44d1e5ef3add97eb3ace00e9347afae4cd5f9511c33f807362e6f855098d3aa38bd3d26128dbd8df44bd80fd95ebc643f328a62e1a2f2421642a0c95a7eac4e85ebc41002fa5cfd2f7b40de7aac2c749dc7b65400625748c463add68c337ea116fe396e13ee1ab6ca65108bc8427dc1ee73983942f75538651245b4b6ec931413bb4c13a6bd514943fd65dbd27171183f6aa2127c8449369d30b6f87c8142f7be3fbcf1ead38ddf0c6157b0df3f852c1172663c8de5823db9b351429a6b176687428203e0315bfde28dec6596b15ed03be9c8b32fa4616dc8424a332aa680f9b53a1502df5ddb13bee822c83ae4fcc2f332e1d3a57fd18a5892b6d5b8639bb5f1813560d19240c3b4810faa1d8bcabeae02916d83b83474920a261d51bb09a8b871359647d173a61cecc81336c525edb5dc713e8d37046da3dc58687a93811c13bc4c0ebaedc5868ae89f85b59da4b02d751af3e7986556a75119e41753d10ba14a1116a127c62bb841a668642b763eaf92c03386436e1be91e3d10e6f83106a446e96a338e2ea698738bf6b8b34349e56c0dbd9d4994f4633ba2962f0cafa978140ad480dd24c8a521004c373f3797faeb90e1e9ca4b3e4b5c470a39ceff250c59248714e0d0d6e8381986fce4c510c3008725e6c1e6b04fa9dfcf572e5f1a120721472dc512c74d2ae082a4942fcb8dca9d6b3ee1764a0f3c4c212a8e30260f3d098575b04fae84a67f97e5fe89ea784a0279fe26f784848a2e4212b492bd6e24bd4cd5c14d0cc2a3616202fadbc1622e94bdd5d7c85f9b88c9a0e8ad273f0591c67ed80e626bb1e9135e137a0a49ecf77ff6cd310973c6500ff9bad5b5787b15e49179987fa88f077fd12e32e9c04cc217b587fbec7ec833d02a131e705868ae52eaa64d83aab95dd497c681b0d2c7e502d371e776cb27038fa7b094286daafbadb96429dea74f4d8e8f8e3df30e72dc6120509f172383d77d235c20373565d566be43eb966f8121fe23cfa3824e1ced9bb1091631be68f79f7a0670446479b462817c02eb3c32172d057557dc3172b12dd868099eebafcea2e6e738d213108a4faa0a7c30d39f5e9552e42477fc0704b9314b14cfdfdbfd6854d00c2d4b08cf33c52caea7c264433c68c41c6e80c51911c70e93f9c6d338f50d19965bbbb6e6a37167c0d70f2669d5d2feb413f7245f90ab387378d8bee0dc4a55fcb5760f235d0687b51b9e2a66cdb9a2b76520dadc3b58b101da6092bdefd940ede63791edcdd93bc71e82ba79c579e631e0760cba65f32417d977cd339660b4ad3698cba07bf385b0235fe192739f05167bc26f23b33cb891db00ab20dda7aae49d8eafb080829705033f324db6eeed74e327b98c736e8d91ee9c98ada6c686ac3e406771b287264a3d0e53095b835c723a4dade439d8e51682676ff8860b94499e1407dc1d523e8640b7751b2a0fd376cc50730cdb65551bd5f64dec28f7179538337346787c68e0ee50a240d563758714b06ec483e2486885d943d65ed65292434b69ad965271caf1f97d62380345602075bc3a41419cfebd0d88a681c4342b9b7753a3634fc19d561ec449598621227c032591e40ca818edcc5dfb3aa86450c4416c3c92a20f48bfd1421a9b208f56ca8cf8e58278c6077a3f10ba37413eb63783aaa089b217e755692f1b0d1e6d7bc4455153b60d3e8bb420968181183967b4b942fe0db86b1de6a7c1ac63dc9c4227a5ce1001950b6bd1c65cc8ad1e67e3d664a06bdbcf820e3b473cb09567a9d6f93bd24be0880165ecfbe206fcc5fa3e2affa5b682337a7c16c377e9c65500a7119f621220c68d46d55e57975a25b5ed45184d7c6e1cd95432db77667cf31cc57f6f2600494c1fe51be80184222db904ed2861a59e36fb1ace1ae02c068250ef9f4e51c2c235fb2f94b3b00f7f1802f962578723dcede3ef035980bccb6d38133c7936b2e3eb49ce18c9f2c0965ea153260e59136ab627c154b84c9403d45cc58e882e1cddc92add480a26ce86b8372848c3ac8aaa2e1c320220b52a8eb08eae20ae68aac994e2a88824a5eb791afe1447d443447c15852a16dac0f102f6ec6cc8832924983f4070cd22551e7ebee86646707b7e3b1d7fb08b816a7f77a68d9e28ff43d3264efe0497057676198446de33f15baecce729ccf3cbc77415a5d64af8d3a0dfac6d0c042ec1c811d7ec4e973049dc6a0eb9e0b04c91ad08fc7e0f4c08df76e33986c8da0c7a97eabb891fd996ff3f02e104b5dbdf9b7831c0326b8c48956b200d8b95ea7fb30d3f345a0447c39a3a5db56a664420fbd6e4896346f4888653f7d72e813cf8174b385feb65679c62f0f95d0fd3f88c4601165cc71f47d43f3b801a4ead5876e08903b2f523ac97733e25e5f5e74b757406165397a0045ee3b3eccf8513ad704a08c732c921aa775c7e36c469d20e97947026abd1778493790367dae22b9d70e04cc6ccb76b5faca3e5d6844e0bc50b7c2c910c53cc872cc5c010874379875a83cf0abfc92e2c4a57b644fa0ab02ee43c7e8cc328c8ef1cdc04bba8a29c0ead76d08963d5d089c0dc31aa4968d634f6dc803b7f7ca42fe10656ecbfef6f7f98faf7024a6d5f5049d3d16a97e23f366243806c58119d2b20188d0a9a209512ecde8fb4d6a1cc3b3c12ea4980a19eb3ccb7b53ad52209856cb5ccf01b73e420ec7e213f24e47bd9198f4509f9548ed496250749f49dad347e4043f6dce0b9735826d4a554fc043be7dd4d722b61aa64c7ecb3fca0eb59da5ebec9664b5c3dc4755d2647e4d41aaa9aebe9753804e38b5028096f964fed9a5c86c68c642a3b04a10df45d79cdc1a4641170e84b07d7067b07efd713c11c3c08bf401cb185ac46b4d4f50d69c5426f180f5ea342d7cc38e214d112c21a5b2affcaab8970480308cd3289c468b83a4f5b8ed822e2c2bdadb072aa5e8e3c1f399ca90d1de3f4cd9a00d474ac42e05295c43e51cf4320db89f78a8a59caef7f688d9a20f42d20065d9a19d3db3c9555da4680ae3562a7e2b612b7d7df47d5e447ba40e166d365a9a4b61cadbf99f16c3b75793b43751df1fd5547fe2fe44ee3824e85a54f30d0fc0f0fbaabd656a87a197625e1724737c18017109960a68f042148cf554615361fb46909140dd9ba5e0165279211b909a8d0eae444f9a099751d0cd60cdfe4b604c26a05850d247587165af630eb2688a9bb0e86a23aa7370408c4fe739bae2f1a63ac329eb81d076a8ea3f57c124d6355b44f35a2875cf390cf4f62a8bd1ddc14b825e4bb18a4fa236a949cd991efbd6651885f9b0caccf96c8e504be8cd53c722ab890870816744bd8ba37b25b59503a92ea64c13b296168c9d25de7104601d726e6559e9eb466d1777e1f79945b63eabf6ea511694d22d915b4313b9fdcb34ad9c2d9d5d450fcccbf82d1431bd991f9dfc05cd95d4fd877473e8b5614859ece1d79584ee30ded1e5676c76802679b69fd6cf9c9413feeeec8fff29c5b3dda9972977bd7c096cfc83ea76475790f04a3de4657ae229b7c225facc13ff83a6599aac01e25a8697d487febba0df9bff4339440462996045cff0245aa5c7d69b0dd04af41d0e238f92be64bfb4624970907077d2029330b864ea99315d9811858d58ab58a404bbf5485161a1612bc47e6a0676e451fbd209cfd024146d456f39139b50cb5f7df726be05da8b039bb246307542316fdea80fd80ceea02d0657ce2028021626f9abe05757bc020cd009a7a764ae70e82a917ad45cd24a193cb048c8d14be9445b63b7dd5f2fc084f309d1bd9b19d093e7b09b5cc927894594ab1a683e0d2ff510e7c414e30036c95d308c5a04f88036606ade109e013e48019612b30097e425c282368b5db048b031f201798095b0193f00be24099410b7002fe0638206686e358edf16bec1afd8d4ee3b7f16df4373a8dddc66ee3dfd869f48dbe46af1adb0dfa763665178128689b75b0dde187220af485a14dd085f09939e78cc17a9c3c7e66ce21635a4e93d39722d798395b0f13e3e7c89d330d967372fa9cb863c6d1324f18be47ee9861b60c13e677e2983246cb71d2fc19b8c6ccd162e6e4287d2e73206724d8f2a17f52f89a38c6ccd1629e18fee1e0486e091b4853770f65f1f97be0ce8c9375aa895121d573ef05cd9e76df3799ba14a82dfc5053b97d38009eacdad67af1c8c53e1d92883a5ffad380b420cbf229f56115f427e85bc3d2c87f7d1f293b507bbccd5667587ee23b807c1d60933f0325954c18f2ef11e725acc54a522370da8206f7435630a88d778e2b60aab653263f866d7211eb82031e018b8231098cdc8962bf5d82a539c7ddaf7494f2972a24d1c04eb3012101a0f3043e2959d42764987ee2f5d1e11afa4ed1dece78d48118c83b8991810f822692371e713fe66b6b2912e3e04a4fadeb90544590d3e7d18581f773e1e56f61641acc0573de12d6af6a0d78a59f4037767d25e33606496cdad5a83d215993fc27270dd6d22ba7927499afe0f3aa77af935be6fa7680965757c7cbc57c42cee0ae6c7833cc01d6b72eaaae5180aa3e852b02c973a85c017094b6d0f05bea797a0247fefa4cc50a5dce370471b0d9f6d465b6d002af78089e6aaba1dd5c56279b79c0357350f8a2eee06d2084140c4b1d805eb670f6d3bc43f1e54d8b391898aae102146e2d10e5e1cea833c895fff409fab2b184d9802e5cee2483544d2aa06975b483180a0f4fcb2928ee5ab0c1c775182f8ba15a882bed8c18f54483fac31f9bfd65d67c7d3c56f49194a88e742f9a92bb641c829a6608558975106ddbb6dda87a00ac68a70d12e5e061d2ee0674031d836b29db95eaf35676312dae63eab2f5d48c9ab1840e06969e395d80ab766927e3475ee314249585a80749d980c51c2e0f1d74d63b9e6835859f47ede59bb2c80814173d427d94d84741945cbb4f7d1a2a3bfd01fa4b512d40e1e36dd8c0c05554378ca76f78865f39458902a6f3071bb5fdbe7cd5f86e2511f5b77b2efe85eff72f5f65ac020091516dd31002f052b539222fa2f84127c6ad675d7b505b1621173952d648942805f969d7e4a3f8bd9cdf338b5f42f5f39a80e50345f3dc5504707b78ba7328379374be3c4344101f7b24e78ca78f6002977546776606c0e46db31b84757f95e10959184830e28ce5ab43250401e3b022f7340dda7db83bbd4d4e81456f6f82d1240da1cb35d077cc185d141b1c7ceb204581407cc6a52c813b618a04c7f806caa8df3d09b04a1d1ba57154867fe95318446e12aafb1b0d77cdc0236af234f7724a65454ab80c144f3775c92cc15006975936124b1c7cd40cd6c4ee3013195452dfa1341cb50228cfae44bd87812e15a0e514f5ca09eaef397dbcb84a35220d686f59b634be8810cc306c03170223c95054b99b8f33c1b14b20233cb3df430a868cb390c1ec34d3644fbd6bdfaa555697d7cb5cb24726dee2f5ada3c4da530ee15a693ed31aea1bf3a5e937adcfb1d68ee301ef9e76773c0674bad3d45a00adafc360214523581fecdf8464a40481cb22d541abd2e40b8ef0c6b2c64f2bd60ac3953522a148321ec7ff786a5cbdda9b39a791e09dce1fdcefbc08bd787c5aaaa79ca9602cd6e0f78b959163bef69198ac99e8cd7f9a8db0ac46df5df67960829408e2fd72ab370d786214cd223374d57cddaa898df01f7dcab64767004b9bc907a697cf090f10447c46b41506910d18ba78b4920dc3924dceff96b412bf23688150348a0d51cffd1d413b1aca1f142394e3afcb46b02a8682fdc88b15ac753d5b6f2163a9e5b1c492861478723700fab7aef7f9c3c7859627491a888feef4943067df6c42040a9ba8c93acdbde4bd03921b6278d39fa69e13dad6ecba0b7464c6b70ec34b93451b05f4c4600098e8b600b4681109a2c7340ebed12e62b301a936349fb7dbf7b0e4e7cd1ba284a71797a4dec830c731b37cb65adfc25e8fe8b27221b9debbc7084b026a1d9f53b0cdfa5fbc066d5d2d97311b27c8ae715085a4cd42080cee17c742163be37a9c00495978f9124df0075a2d8d77b3b575c96568a64a454c20c733bdaa3108d771c809e8d4a577d566f6e071f2e68ce086978f01af5eb88f80c990bd1154f98c607d6944bf6ca5984a8f4298491569d55942a62734836f07b17303723ceb98880cd87f3e0a82094cab9e73f7973ce217cff33510839860ea318856af9d58f16ad101c2a22d722e456f77c5b5dd27c5e22230a384496832e095297502587130b11645065f821443d336a74f310b4add2b779c18afe515f513abb14f1aef373d4f20532f612bce97183c56da0fddb77ece6313092d8fa1fc45bed5fdef6f0dd3b68b82024aaf760625dcff38a9a49c8c74d0cf8e1e574ec4e614a12a01905863b599398275b16f12e3d997c5049550196a893bb4a2ec5f5b6eff2bdea83b986d1e7a94145cc256979b5f956bcd9767498fa281c368248c8ec512a762d76aaef4ce388c4527d7c7b7fef2f5ca4de219be1f66189ec17409a0818efec1e3b1dd77c15a05bc63d0031041439487a46bd48e9d05a352734f3ba923d262d0af8a69ba2b4c1cc58055932742516311aba55c8b8196837e8622e1fabcf89002496e234019ed7deb3440a910209f8917e2ed152aaa86ed67618de87795fbfa3cc32e15aef20c1c46cd599cff0b030dabd2daef1df37ad186a75e2ce2addce2ae876876c3c0b823b30515f434243ce88baa3b9b881a669ab4a75630a774227a03a866ecd04f178be1122d2e99b5e00d5e0d343620347ad070e341209ea49d52914ce47111c809b802aacb43b88bfbb9a568211df44629f642ab2401623ba348d3ca60ed8e619005e1b9290b08e04b2ac7213aa7440a30e903847d6eecd39f7580eda3ee9dce0ec220c05fb2c51dd34725acc8ce054226c6426e942f7f53f24efc8b1a4605fb4e6b86cb4d6adcaa8bf53a68512b1814773b77557d8f6f32caa4370198910a00f99e9382967342e214d981edbdd03d83b91513fdf576152a2e7e70500c63f1ee95962dfded85fa3047526fd03398c5abcf3a3e1f02dcee7dd60d1d2d0884dd6631de69037414374dc5667e1180790e46449e10b637610e78e4600cfcfd6c7e1207300b0e1dd01c7a1923269269c866f8b6f075f3d5ac56904516f9ee9c5937a2002e66a0ff7c9c4c18bc9950c9a489974581e781d2779628435592d6f4b6b998259e910b67df459514a19f9445601155232449e94d723a6f9b92ab9d6727430c99c6282bc79944a43f2aa476efabe79332e9baff489d26676a4ef05f07964008361b60cfb10114efd31a910886d93d72ec3605762f722b55f26eb894e91db206d060ee4ea8e9238b974c465cea1c14a6fb06543629ee1165a34ce39bb1ebb617e96d80219105c3d35e3ddd246e2357a1c893e4f660cea2398632d567c28883d2e87d99baba04af7bf04542c24b2058ce767cc05232b48ab9d61eece5868b05533401dc2ec8bd7682de66ab711e89848bad04f56732803b2c3fd76080f299e7224e05b0a9fad8fc250c608b29be452ed8d8b6306556acf9f389a1270836a04413609a1d1ab6e1dd5d9d235057235390fad6faf8e21fa6fa9fabaff3fe86ae8e16ede74fbbaa32f73ad664d9c495ac98eea0e279ae266b9be1be102fd47c6f91570a91938ee7d3b926e76de3f3d7ac2ace80d4cb2d12a735769c2113368f28b44ffce9649faedaa6b98b7469a2fd3b5664608d66d6154ce85e4330bbcf3abf9d513c40d3d9da9801482019abb7fcef4e749ca616b0978a982d3e9c866bc8dd77f93f510422bbf4a5d47502761436d0d6e951822e396c3ea2f8e02b8c2b14d00bbae9f9cfb97c9d4492166458be0e3ca2e31a663b048bafc4cab50015039f67ffc3ebab48fd1ad68fc7106b4f36dd6f69e6b75264fc11c5b0c791de3ce77f9ba2b7239feaf4a87f7afc0bcced94842ff29d82192cf7daf49dcb93c2028b56ca886177fd293591807e18384558ddb900316b04ec3d623754250071fb8b6af2a4d87d18fedfdffb807cd408cc80f380030762e57a05d375b465a73f5fc798c68f54b4e809a4cc519618f7af1a468e126ba73d1a07906addcbfac2296f0d03de079189249d13c7377b9968a38ee2e0a2f6413a0c8df57327b2ba920f7595cafdb8fa79b58ec9a0ab4f5604d95ad1f697ff02e33c5f76e615fe588546fe0645ba6d1af5b6ca803184912f778b0db503c8e9b44ab8f98089b7294ef0ac01a60a4f1187a34fe4262909f561fde3d3ed1e6a5283c15b9964b198444d106e50998092d80a547d492e12f41a0c023fdc80ee111c946dc629081a3cda10a3b1e85c424ad107a4f6dcb99cd9811e6b225721990f41add00ea8b35b85387e09132f7e05e3a0ac49c9362a2a56b63d10f7c511b4c20250e9cde6d876114608e5d05eef5fef43caa203487dc81f6b805f97c80a0569e57b159e399600614a1ecb84c013930e49a7f4a9294f5c0b51e682cdb43676ce46f299b344ff2a8ec0b8dea68df35a3b10d5a5498a561a9f73f8679c7ad9fbf213321144d11ce971fdb9001581a8274a7003bb88259a7079903779b33dfc77dd5e2c4e247448261498158c4a6e2cb858a29cffdf2449b5f66584447d9a0381680f490accacac57bcf6c0ea0815357ef47bf7427a59d0de069675a8c7772d4ca9b6f6489b1efec5849c33ab7fc125cb50656e7ebecf740ba9ce542581c42a27bb853517d283e0160e445096a44577905f4b75056f4f86ee24e71e7a26fcd67309053f7a27cfd25d5e25cb7e152b2593e52db08390b96e867ab683cb6bdd64de1fe0f3d226486d5260e21c98a3c1fdecc460aa4589c9c7e2fe5c773c307d0a126c0ac11a4eb59e36214f7d9cf588b5da94fb963e3ac5e1690bfb9e794fa207e2a37bb1c92da3e0c611e02c73c9800c8abb6e3e96e9914e449d4ef6a1f531cb9c04b8bb0254dc6b99b33726e85d243dbe6afe96bddbb7364db8f90ddc2c55c56b7a8787cec8f99c2fb3016637cce6cd02d4c8edc45dab90e92470757516ab626ba967a81fd753c543e85630b70d7af61653abef4c880877201e7686d60c24773bc15c9a8fd5b4a2539bf3570ed1794069d31a044eaf39408a99bed0502aa6de4356809527399936eb60edc68b1be4921f5bbbd45c5ed17540886310de573e9024bcd290724386bf95602391dbf5c2a3b3c232d9d38a67422c80dd2a46f04b2baacd4b89c52986a90a5bb3a5e41740331f57e28f4acf81b60769c1e4302319c427dd1856f10704a8457ea09a50d7dad41ea1b7cbfbd428f3c7c2baffe07804800bcf8aa33785bcc42c8c910bb16217f466c237eeb8c9650d606240dd641329c2c4a641807a5cf4af5c070b261e4e3b3db17af687e2f946db01cef665837df1cb5ae982815b0e072ccc5eb6ea4820a553460be7344177a439c41d4eff30d84d8c69b360cf1dcc3c571b4b37b685ad6af7e7f30a7cdd4bedbac884bbd3b2d6eb4dc4d68779abbd387eba064596bba0c1765171b336d0e6c69a4be90223d0bb6f287b517b76b7e1ab65690b6e9cb6c2a71722ee3be095a78b3d4187e205c97e13b2f9212549ad7ff06a72ff5d0c7755feefe737097489ec6006b38a3414c8a8993f9f10bf5a5a0e9904edfc24584a06992e6de2c6738370cce0ee463df57aa4b77a59aff5ac9ed54fe137e5c6bd996ee8e6546481d5baf16fce1b74e3bdb6f7ee656f0aba21de6b1c017d88b85367f14f656a5b0bffda996dd180b98fd1d16854290a47847a04939bc1f9f6081828da7351104faf120eb2338274de14f873d7a7a969857b31957f1e323c82184b50b6abafc0b446889e2712db8579f42dbc752eec51e7a1bec5de6a4b7a27f678dceb3128d7b4a897e49e75b84352cf4e3d9374aba3be893def7c9f20fddde25ec7a05edd92f6b385b3eee562c585c2df2cdf2f41fed0d2abe7c2e2fab2e297e15907cbc50aa3f4e3d27d89c21f593eae1bf0acf657c5ab7a710dc14a736771e5cdaf90c060a5ce37dc5c518c66dec5952957538a577ba599cfd2cc4bb43206654af16aacd442b19a798b2bb9a8a614efed95373ea3999768259a942dc5bbb1727b60cd0e45375756db89b7f24a54fcbff2e8e8028d9f433f905edb8b0363fd5fffb90dddfe47466656dcf036f171a95ec15a377913e0e325eb8a5517b4dfeb54330b3c9e039aa3aa855b3052aa9a74ea14ae59b46ba470d6de23dbb6e9045638eb56919daa4b16edde55cadd2669b5a2c429a0621a8c1a841fc2100400529608e28a8c5c5e1ea20781e27fafd7eef55e12c6bc4fe8b1caae37b3b6d612a2d636217b6fb977e508e4071a08d3d5c93063a6f70428304134ade323c3ab90c4aa726154ac90fd26ee31c4ca02051e68c07c56a746a353a650a1d2f05a5792fd581347f922b613726c3134193e653493647590c28e0c9f2309f6abadec35b9d845c49f179b712d57aab7c34b21c37755ccc8d0c464f8ed03351226c3a334f003a10e0a199e7b7951c67824938ee24ffc9155bef803039213421d9ce10f6764bf0afbf1726e86af49d8afaa60049d3c8112447342863745f9a123c3bbd6b0e172d4ab65b75981ab11486402f6e8d33bd12cdbddc0cad938f1c795e1332e70b82a71e28fd59125fe1870f3848f8ee943391ec77aa932f48c92c68606f6822a00e00a226fb644596baae596ba6a3031352bc4d4acd082878367430cac5981082d980183e3f52b9b34934930482f47469c0d334a22986143110e36dc60030c830866942237ff2cacd79ea4b36389b2560abb59aa5a666a1f1d4c6c73de4c2980f6726d75777777b79431a3b3bb71f79d73c6ee8ec51e514a306c7c3f4208514db8bdadd37bbc72856d430c55518ecfa109413e44987ca802473ccaf111c9a7a5813a56ee5e72779883dcbdeb7e1022773f80e1451047b0c1858f4f8cdb5879dba8e46dbb0d236f3ea4206f3e4d70d00417b090b5c336d0c828ed912965824fa64cb041a66d84e00a0ebc9a1fb478811442190abde4243cc9f2564a964b4862038d2ce5490a1940b104a38d04d5b26125890c18174c36583093e784a922724ae8000e9450865d2204f2473a401cea92e59328813ab03f293e225ff211952f0db046fe88c421007cc93560f2d540470d24a5b5ad96ecb70e2c0cac819747f2104e2c7b0b14d8efc740a687e99b4803b38940e4696d8f1e666eb6daa3ad4ce7040206eac82f85dcba17038170b1c7bc95f1e6c09a590f03759460a58c929bff4e799e7042ab65ed5773e2ec0e869929868135b1f4ec26f172b64d579c2c5cd77ca90d3b7f8900b9d820cc566126550b2c0e7d13719ba065467b1ece0c4f3ce95c99613fd86bb5b6d592b03c3529365894bf24b0cab550a7b521ad8a7603ad8a5625571f6d48aba255f1628311484720df92675865fed9dbfb0f8349b0b6d24674a8854025a5437428d3a436a24374482bc106fb86cea6d995f436195ac928d7734a49a59452ca7e46339a6536349b369d4d2af31349da858c8c12d205ec66dfd992ba9c4497a3f6baeb4f292b97cd3eec322a3749adc8ee6e39a7fcbc72ba9e645795bcd3f2ba1c7541a6eb8926a59cb3bd98156d104688124883d50f5e6dfd633769ab924e94ecd47c581626d8278cd504ec8985524694230e803a992764e8c29ae8cd63aa0242424242a236dc0013e20398902a3f5202a56f909090909022ac616541ac0c3c071c5720f08aa214a1a13caf0cb1c168a9a252b56aba9d97e23830fd8a515830b231a2318ab245571e08a2427a91e50d07884068769a8e3d22cd545f1401348f4304d234d3b2c841ab2a14d4920cbc52d5aa66da81fda051a402eacca01ca240b1816ed92dbb65b76c198dae1a72c2e0c0e0ab6f61366258179113904498bf885d432ebd7bde943833d6dd46466b7777d3ae5bb7d464679dcdaa6514d367df289d31993541d5ea49fcd25efc8095313c0476ce395bad5ae984dddcc056fbe6dd314653de24d7a5bc4d4e526ec21a9ae54de3b2ca69336f25aecabc99b8d2c699386eeb60e84f53a96ea7086be067d10661a6076b20aedac4301bcdfe699aa6497a654728259bb3c8890decc0892644232072e287a8893432972191134300b52a154750031809694058102106900d8608030968074700418a15238080046486116140e9170c324018525a5fb4b42108815404243c1a08f10321bc60d2da322412628bb90358cb22592003322db0801416f0895181dd32240a228d9717b6cb902888a3208c0e932bb89665190f8ca094d23190fa05c748aa3efd823ffd82325158ae06444dc0c0082b55e4cb5b020bae341124234413506cab89272e2840c05a9adc618433a0384a810704bbca70e88c19c83439a307af32ce08e3c76e190e9d518433d238425249ea17f4f9017232001b3ca12f1f9200449524606087164970923d20609905329a65b406233489126589295714418a200769e4e00a1499cd3ab0840c5c800552e4600b1870f144e3828b2856605944404de45386444045e4cf7e8600a21184d08f1292f82162090330f1092288688827800c1044510928853434308411c4f8c072190ea521254a1a53764c61b30c87d2c8c11a6914e5c0b41ae3bd980426d7971a6918e1215c202221a55f5068a84a919101c038a23979280d339a20c1450f9080381a52034a9e191201c144fe9e63d6c46b85268d6a9a0788d08630541a011199107caa0a8aa05682b42b8698568a321a1021855045be604dd2c18f5012183f0308824f52108418c0109eb4981cb1321c4ae3072220903a0ed4564ece6896d11d32b02c19121921450b234600c508275e51ac29432223909899c2d60c898c18228527b6942191113e438a48aa7d038980e0402bc321352c906986444c9068b083ec8b21542a08c328096900d10408d90b8260d37082524a29f5a10645449c0f42d0807641240411911055e45586444240c9c0061be76bd958637422e67863582d43a21f1f3c614b39466984221aa29f2d887e84b2cd90e82708099d26c020065460618231b6b002762101318020c6154a88220650aae813642ea0598d28d410418449b135c321353a60a5e529cc73d639e9a42d3bc3f0cacf4b7b764398bb7be291a452ca86f204310a6a6db568b4c9df12aa840f980fa9048da22961e3db4a53ebc369b610c6186b8510c28cd65a82b07ea74bf7eb2157ac69a734f6a8a7771a654a9f4d082b841aaeb7f488187494db89510c3a3a12231e5589c10e9c32d4ca964a14231e9dec91ccc596b5167f47e8e930ebd262eded6157e4845b495aadc3c0e9dd5bdd3bddfe74b256d5a24552743b9db6abeec7ad4edf4eaadbedf6ba52e75028570a0f3992ed37fc1dc991db56aa956d657bc2495a79d5b276b3276b397bb2f69e77ef301175d90531ad5e254e8bea36a53aac3dfad445fd645d4e27a96ab5be242d7b249fbe42a14ef4747a94cac4fae9aeceba4356ad2399a6ae32e1242d4a8f504a69abd59242c3913c7f4f4669e960043a20410ebe324116ade4562283f84bc2e5c943f6194f5e6997b48361e2af475e6d6e938bf2ae3e6f5744c5624d6b97b4ecbcfac7d2e4ed3798b5c7169c211e8b1aebdca7655d6a3bcad5e567afaaf638777ade263a224a86441e18ca5ff421f2405046d939ef1019a1c6d98b8a1135c48b11e3af872c53af29db4b7872fd112526539b5a08cc8d75e0c94b622e9d967209efe4d4c07ef028d325ddf23e7d9276a1e5f44794f0b0b9b0d8b05fcd137a347449cb9123fb459fe8d2e28297b476a54a9c167c8408fb4558e4431bdb108158ad830748d954aaa1d6fa392b2cbd5edbd0b0255c85fd603089e3daaee5489caae10a68e7b473d8b51d265fa68a2319b0c6749369337da7ab15ebe1b767fae5c242261cd668d8e9d4116ce9dbe72b761160bedeb56123f334ccbb4c97788a02c0189379790ee7c897e93058637a16b604435ac24876d305c2f4cd74984dcf3293e9f14a1384d2643242c34ddba0098394601f83ba54a511cf8305b5621739d6b05f0705b9b8b05f0cb22252d12e98b029c3a69214b2aec0d22089bf28f412d4d2500029cd32186986a70eb209547b2624871cd8c6a15a39270b8311c2881f10a3917cc9d2e3c53da55f42edc94fb902cba47fe44b66b87ddab30200f892bf425a6e47ca1848338c0e2437f87a81a82fc5580f733d84b53edeac529afd19968f6cd8cf47218993235ff252ca8db2b0618d5a48ee0c657767a8a83d9823cb1af68b463627e7cb89460be897bcec97b4f25808b6d7b0972b38326219adc07eb625676715daa8264cc861613f2e77e9f51c9c0a308a9beab36f56577d536587dc94df917d6b3abdda7b755557a6306c0f6733645f222f12ed11ef40b3499b37562b1c93a53a0baa57f2f3f26ed9252b6a3ad4bcc34b86404fd62e85c0ace1782a6fbab2934175d3a5c49bfdbc29752d85e54d513b2755df698be52546a2ba09236149bc446615ebf5dd11c95818ce4b16d4ea73b58a744523356997a7ab29f134e16fd219e349c618a3f693fcbc277b59f1d7d3b7f6a68baacd5a5d1586556ada94f3b0a39485e55feaf5a6b7ee57b36bda670c167f3d64fb1bf47e4a3255f19055acc3c669b1f0973afdeaadab24abf08704667b61961d0c31b3e01d2646328964d7aeb14e57afa7f67e3c6493bce9daab6eaa3e753b6b37c99bba260cafd99fbe25d2528c7a4569d9e3915ccfdd8f875c67d681874c7db2e9d9e9ac37ddd2dd81568c645ec21bbd7a02deb8c2de6897da391b141081c01ca3ea281c2916d1135572e9b36bd7ab7a765195e5d46ae138b1a42a4b6618c95ccd194a574d24594eaedf2267fa2667e3c0588643eb829c2e0fbb19703cdedc48bd85e5b55e53ffc63c0ed527fe9278a8cf241eea15856754c9d093f56c62d7eaf328d5b3ba425d7595eaa2eab74e6567611b346c868ba48ec2486ebc9378291c6f1029ddc02d38585866df49eb1b3559e6e3a90b72fa9ca8393f3360513f1d09d667f774d6955d90d33728a5f4b2d56a7559575d5befa26ae16869c1d1ab54b7565917ee7476d865a5a350cf6cc8cdc27acbadc471b93cb1d81676d9e17ea96f6f8c2423523a0a6543669d85bf245e5f55cd70afaeaa73bd5f0a73a89f90d4a3bad6faac7ad945827ae7c6daed4e579851f7f452a705d990b598a9e6d26737a41a3520a7744bae971cf339ee4b75f984e4093d221460828a10a0e4d96f400e8e6ef96122216501e3d1e4c05e2cab8f40caf4ce6d6b1df6e7e4e453a491461a69a43021763ba158261c2d2d2d1c374c2cac154a754ae570ddd01423aba5595690f59de6b8b3dc387545b673f61c8d34d24823a5f6f4598e7e3b6d1cc77d5ea69c7d8a3e753f2179bbbd9f907cb2dc763f7a14b641c352ccb19c4b92f3519c2427af72b8961ba7e75a386e64f6593764ce701a2267e04ef614638ca79310976ef58d863de72454876c9556d1234eddbea45870b4b80ea5cb057fb505e3b8815930cbf330ea2f3939a7d3e92424c7c60606a3a1f13c1898974c5329fcb5562f2f17b645a55eae4afd2585ba769b3a9d8464d555f84b92934f9fa7f77e51084d5d6b734e54488ea739a79c534ea6393d14010911410e0c511221c892e505dd7769d71064e8eeb6e96e9a39a5940d9bedcdf92d838778d2b477f9c93cbbbba59415ce43082184b0b1b0f15edf05c3cc9d638edddd52ca150864a073ce49e3e1acad496e42fc13b249a79c3383c910692279341952da40e69473ce09e19c734ee9cd39672c452a71b43e73ce6932ad86a8539bb46693d60c0b4d8cacd6ac0d3a6bd6c69c342b514a33adce4cab6d64339b5ae50e4b39d59229a514cf9969b50d9ad579941dd92c7bbc966571ceda4696c11e95873933b9711c47b336b6d66446a306bd5a67d775259ab55192198d1995117758946a7d9c8f5aa4996cc3e462b29964367358b0df4c6c3dda68464a6fd9c41efdee121482d58ce4c4d2cc5a3768d846ce49b312a534d36a96d1c09bec309842f7ade3b49c1cac65da2cc5eea62cd8a314a7a6695d106d562a618fd852cbb21964ce88c879ad0b5232c98de3b8ada78cad96a6698f734ec945d3a4997c74c969c51efdd3a90b92fd3425ee6460e3b78823ac291d962e21ac29cd5caa9ac45940df007bf47510d0b2a1c8b4997c5c6c6cd94b86bff0a646afff132b371b6736246a398116db0c7e3a289c0c32ece0940c5b9e6d6db0f863b9521619ce3bb3ec5ad66d935ca9656545412c323c4b140875e0155d90599a32058532540520c3774d562e4c6929b2df64e9b490210bbc01c4494b0cfb554d27c7aaed08800c9fc30cfbd5b354605d707060c07593e1cb0a554c3fc86153e558c0bef999f4c7cca6f853653287f98e0bbb212fece1af872cf3ff5b22730a7fcc85d94b017f3d5906c73ce6dec3dc2f49fe51b81f0ff99f401267c624fe4e6f18dfcb7b7859f2c539173604fb4da01374c49e03c809bdaec7ae4b629a14a357fad52f2161a7933b86cdfe4da01a76dec265574300ee32e2c2f333e6891828238a50cc85f7c476e4cb85b9850b63aedb933f28d4ba9f975db838e251cb40c3e2a359dd8fa5fab4271348ca513cfab8fcc5a389c50368fe68527f60ca03a894dffa7ad2480b6d5c402816007c172e8cb57061acb5b0df4b3e19a2d003d703a45f58e2b90f757ae4fcfd55582925cc95dc3832347d03899c90c102bcf92a111368e43e0b5e041998729321511257f2869af09008102726c199675c02c4c185fd9a8ceda6331d8d3c3d2aed75dffee263589c21911256e4cdf428c4952ec5e50a4bcf4deed18af6e6e9277b6dd0b0d9b9974ea58e08fd40760de17014eac9aaabcd60061f108aad2e8cd13c69c8d917d608eaf4c82854de2e045ff35ba954aa37a7944da1de57ec65b5e74a61183aa7acf4913f4aacf0a489932c63f3a97b031068dc1b7ca4dc1b7cac189aae2954faa6bbe89b2c0bdbbdd59948891f64d8d1c0e43a3460fbaa734176dee83edf4e248eca9a7092770343c982f1178b2e5ff47da13cb5d0679b08590e91e74e9f2ebbec27eec6a1f66646e9bbcacc0a2091124ff2cc3f4646454748502091123e793e5e699c199b2c325857a816167633c8dc425c5724fa904df1ca7663924b8cafbf7081f5fa2f096c521c457fd13730cf2efa665af1a34a1256a41c8a55da9b309b88058c859cf626dea13312fbeef371a86fece72395be41f53773f7ee1bdc9a333d93c25dee54a8bd69cf5dfb93b53826a16ebcd2836c833a3023319dfbec21cfdce1ac339dbe9ba1c3a58b8496cec52f2ea1444edd3324f45c9472b3675be4b8c89db647a510d93e01a3bc3d0bb97604b0c66422c385c0a13cdfa44a864419a0424786444d8272ed23230b54f90132f1404a224a1bcdd9423e453f5434d013560bf58d8b0623edcd33c9f3f0eb22f2bc227f2ff98b4938cc17cd204b398b57fac5a47f7a3b71d95dd4549a79bead50c9f33d7718f9f8f8f8008990b022e94a9e9ffcc9f3891a59e44f2a416f2a6531a96fbe5894e75d70664279beae31b90d76a54b848abec97a32ddaced8264575dd9d1771d91e893296e9f7825265161a54fdf449f3c332b4d46dfc8f94eea9b2c0679beaf40ae0b925123f8ea8250a23272868d1660cac1a8e298c48124141fa9c2da2e86ce3ac4256425b0665e754b5ff0f0d0de844935f47970a804c10ba1580f2a2d84388a4d91447b16a970451f1f2aa21441e30fa7ba5b1a484231d8d1eff4eac258a4a26f287629311b294f3aa393f6e6a3933cfb531e8711c2f089b5d1eb0914d4c9269d51e66b03e3d1c06ce8945067c6676159edc5576d6641676c1b9d53ceee081f4307598cd0dded75c37477b794db0fdb766d64f2e7f23e578d5b6c9b9492b694b3bb2184d0e64e09d31ebc9452ce9b29e74d7777378b1933c6d8ddd9c60454d671db35a5a8a9b4954cdbc695b614544d2ab1a026163060177a3108c8b22cbb1a8dc0d4b030418ffef480d2cd4c3b64f938e98dd09b593725b69c34d36ac984ca3a6ecbc1d40d39caa6a8a9b4954cdbc699784add90996ab5d412947153c1958eb449b5504a0f4367162fa66cd8700ef98a93cd9291c5524bd544e965e9565abb212518fb5431a52c5a76ba32bdeede012b7f704a6b0651b4a1812a489841132bb17eeddb1f7253a2223090e5a7a4d99338ad28899092270df294b80cfbb5e2df3712a7c2e25b0bdb928d484404144ae1b4b48b4c7f8fa8064e64d99c19064174812c88886022cf4b0ba02053fa6eb528a5525079decce844885ad9204c865289f8eef21b0a36b0dde3eb86c21636c3b300e35ea49cf234f9949d7e3a9d8ef4cd119a4ef58f85b3faaabbb0bdee50da0c7f47724881adffea4dff2250ed2b9111488c3f59266529e31131b4296fb0a87d72761c72b0a1872f720f4639fb7a28ca59b7d3ed451fedddd50195d39d7d3be12fbba6e57acd27d767328ad4eb5d40e3a4b425fd2acd9c83c499b1aaa484848d4eee18361e0730723f8d1f2107e1d45bd256354dabb5d67af85a6bad75d62adf46d0d7d80a81e54037c9357badf3d5f45a7acd6a56b39a55ad6ab5e5663a91984b47b0116eb29eca6aba34d55a6bbdec82546bbaa9be845bedd563262c4ccdc0d0b22c05b046fb27a59c00f6d00e1b6a34b0466b6523ed69dfe917d92f067511500766ed3d05d499d71ead0415c52fa25133c9da95aca19135326ab536d33ad6ab430c30974e24e61aa98841b046bbe90856e62f0611a9efbeae7e4fee21f55ddf93af4bf3b2a6bd6a1046c3483a886eb141984f46d3112c15ed49813a11eab4f27c4ba9711e28fe54b15f0775901179be89140ee4393b0479ce22604d0e1bd8f8af6310ac99e768e267add606750e1227fecc39e747137fe6eb5733fc593a23eea22b869d8f41918ac681735a213527991af66bb5e47560fb72f6105bced6b8cb69ca696fe65285cdcc46515f7e1ac9043ca49f33c2181ff19c734a29613361d30eafd596f059649b854b1a47083d7d292332893fdae96dc0a16ff2b6c939bb66edb65cd23b3932c86e4913994c91357cdf896ac27e1d254e429327a641c80de050922349bcf6280d0f4f90c6dfe4c951f69671a5ef745f54910cc7d64aaf9f37498b7cf759fa2cdadd8dbf1b3fd21569ccca6296eab3342e229f1599d73eb34f9361f5794de2c8c5db1fcf0ca8f75177a1f010ab952c863cb95fe5b56f99bc0adba061255ed2a60c23493deb159e384bb57cd62d9bd5b1e3e4ba23ab2fb9ee2c4efcc943daada4edbb7fa4af927e92f6e83b3db26b181b84b19fcc9f39334a5bbe4f46c8cb1b833cfdb431c3fe30899bd5b2b5c4818e4a803929aab0cedbb9ca93ce3927b637d0c70b0ff207f3923f1a14963841a66f7d8c4c899cb8608923583c60bf7a030d00654a89342094e9bb05b1408a52831f2b404145d91414f06056cbe5d01c019b1865589eb9c670c6457c10d30ea14f64d84e296c1499cfcf1623955fcd0da5644d395bc258fb2666b03dd93489ad5619bbb9da77e609a314aadf44ba34e37433510961686c5e28945f6cf4924a29a59cb2b1946163d19523c8404198ad8b36f1944a7db04e75ab92f1b46948d8fa79170cac2aa652e7696197a7700bf3a45218d2ae95da5c6e4fac757b622e41628ed7aab575f26a0efc822d8cb52e8c9d7e52dd0f16a9345cbd7e49a011068a98f205ebdc65bdf6cde95bbc2c1dfe7aa06caad4bd9cfa25cedf72ed0ac75d375c5c386e6017015a7f790d2ecf812bd07297bfe00a4c61a4e52eaf80ebade85dbe4e77b956be4e6fb956be526fddd6679363927853a943a39cc22cf5f67eb08b7c8268a4bed35beaaa3ebb20aa14fe6656d9afaeebf4d5a395eb3adde52f6f5dd7e9ade7b8ebba4e775dc75baeeb8461e051866df9098f462f9f393e1fab481c1d9fad4f97d5a7eab3e5fafc093a72bcdc54aae59eee725bf7e3c9dde95d27bb225a0ad7f6ba4fd995ce42dde20f1a65fb6d83028bf2e9f5d6bbbc27d6faea56e2b854980626aeb7bc75971b69a9cee3c2aeee3d312117ccd3825ddd7c4f2c5691afd9c29607106c8ebffc84f3205ff3e799c288cb5d7739cf144674bc75285f2d98670a232d3f01f3b4dc8579a630e27a0be639825d304f118f10f99ad7818f84fec12328a70bb6f2650f632d2acde578e9c9b09c041659d4d5eae95b6cb53cde8a0c893cf0247f3143220f00e59e58cbbcebb6bcf59e584fcce5f6c4b6e65cb727d6727b622e37c65a2db885e3c9f4ee96be23bfea1a1291588dc3044c78518426a18c13e209e50d7cae0fd7cac9adcbe43241800f251f175a38fc76f9eac462219cbc850b633344171197eb30bb9eb9767cde35249b3962279c4a29a594524a4c23941c3972e4b8cc711d394eaf0e281ddf6989c216f69b4a344eec32c05c73d8ed38cd611784c7bb570c8cca9c1e7917c9eb3043188cb91f4da6df646ee797fb45a21f2b59c7656afa08befab5f6511fa150a878b4d91c7641fe83dbd1d65a9965be513222520c71f3ae87e311ac690e8af63428da13584393b2271914f40ad499aad3a45bbb6dcf41c57eda2aa35264bd7bf8f3be09e4e32426665d0c32cb7ca35b0e1bd8d3e351f7f2ed41b01f4d0282afbecd5b2d2929a4d0accbdc06aa3505e1514ac66ea35c03f50d8c3906b79356a2bd0934a5f44d6645df08411deffd7905d489691c9f4050a7f51f38fe1d078e7f15c7eb61c4a142f2d527cfe5e3f92ddc85ebf2811f50c3ce33761969c1c7835c88cb078e22860be02f3cbf2796b1eb0139a74236f807feeab1900bc3bdab09c19a7eccd5ae006279e1c2f018ee0b177235ef76197605e8580c587bf2c2d5a0c070352903fbd52a4faa6d5581817d92dbc763de9f494420548dd803ea7c22017500a09d51b54308849e71d8d5b07397911682e0d9c27b62d06524ff85bf8079048067c62ecf054304c0231b30108a452658098af5c4a6d88f266dde8579fb71e58f1f3e6e43711bca1be7eb5a46284ffda4f336b95f16eee30279ccd5b97763a645126702c9d71911084da26a4420da13ed45b4e88cdcdf00c0c2ed27b0a60fe43614edf575f2044aea6b4f2290ee40ecd11a4d6a0ec09a06c085f9476fa081daeb9e026b1abbbce7bb30f3a556f40afd88a9942dec179de0098499b03782e0a4f0afa270085bf986cbbf13f28df714a813f3be975957e15f0bb30efb887cf559ef22fac6c7bdb7cdfb50e7c76ffed9dc7d857f35775d8f7f9d4f873918763504e02e1862f69ecfb34d198a65ecc289793e0f2c0c1c14c5f25d784fcce64ed81eec5bbe3cf18735520014eba19e119be2df7e7d7c8b3f5a602294f3a54b10e113f37161daa38771fda211c80d5e017f35f7c03117079c041c913834fda277a187c1f4f42908d15f8c8f54c05fabf56da3dc0b7f31bfa4e7c93cc7635744c765300c33af8bc47bcc3bb286e63cbcdb93775c9867ee47e3c275d510801674f02314e371e13db06640149b42e29c980b329f919efcc743963bbc1999dfefb4f43c997fe6c2bce3fe97b95f4fbebfdf2287a5bc0f791e314efa464a1e972a7c02f9b8845d7eda5ce2efc72790c4d389777aefe27bcf3b4cde07cde58ecbd3ae08bd5764e63318c21a19f997779a5f7632d47ce6927aafe3d79534a7f7bcd72576edb8bccce975edf8cce90e3c44e6339f91c1de77a4773f99a3e0d57ca729cdf13d8ca4e6331809ecde775ae62e91d9bbbc5f0d7ec1fe7747e4de7bec86c03054012f91d9c7e93dfcd97c3ff01299799cfae0c1437a7f7d7b5def255f3352e6de5f3ce469cca5f45e9799c11f95afe9c48977893f27f2530999c71c097aa737862686493e8f6fb18361067f3d7966077ee11d352c9acfdc14bcef348ffbd5fc7afdf5172eec155ecf778a9ac3ae480d7efd15f37b1849cc656264be2369ee4e7ba7a7f9eb13eaecf8ebf599d35cd8deccebf51e3dfef1f83ff31d77c29a99d7ef7d7b5d24b07b19995318fe7ac8b0abf099fbd93c739afb29c934df71d83731f7b1037f4bf28ebf5e7321ac79e18f27bf7ce04f490c0ff975d8373f6e73087562eec3067f3ce41daff98f0bdbabc19f92fcf2813f9ebc037f3c4ef39ac75c086b6af0b724bff0c7e333df9134f757a1e630c37ae01d62e621e36124f432f732f432ff8efbc55c739afbf19067bccf5c9ad7dc1d34f7df71fb93b907bb22afcfdcbb1f0fd9fbeb4258e37de6e55d99ef38cc01a13ba8846d979435eb149140000000000315000020100a064462a140249808bbae7614000e7a9c466a509c0bc44112c328ca20640c308410020800c6001821a21901b02068fa44c7b603af965f4e0776b3e92439e6ee0df3f9043d0ba2916888a315e6157695466e2f4a16c7177c6a1cc7c508d3950d20e02481be892c2660f0d4ef419fdcc044cbfececdc2511a38f95a2efe2825a2e2ed5e42266650b9a123184c883a5985dc84eabce2305f065d9498a27bbbecd7322f50b349a2c92f2e591998dae67ebbb9fb5a98498346369818f17daa06af4ea3b9e2e3ee3d1b2f9240adec3664146f8bd6d5695ba63485d14ca530f552cb4c6fd15505d5be01c3bc03cfcb9d94e9788e729dc460dc8fa174560f28a237f4f44b96f716055e376589a1544f00059fc8abca1c349aba8ee5ec02610197c6f217aa1735a350b00aaec080e719a366ddabdaa7ae547d03a1419b5dbbe2c0c01dbe09070e1549ecf5f3cb5f819cfee76ae6d199e2757e38286671c5e0f6022810b3f32a86e6c3fc6a4e144ec95162ec4bb6bf2f85ef10518b454c17488d565d4221ff5f65c52cacfc016970e7b3140ee3e25f4865c7613e5397cdeb5c4db0ada37f9bc309934cb518f52ed3ff0146e557ae35776bd7e3deb7018a63c34eb7b4c1ac7d263d249e85fd60c762948d33bbcb8ce8946607312a51685b29f83b344c73b300da18ef91478956b4fd6377205d8c0a72dfca52cdc7fe47a5e80415542a9c802c4f94d679a9716dc78ae3f102c1653b2adea0e183061f3752ed685a1d88e2bc25dcdd565f0f2a1b81964c5adaeb4266dbe492c2269614ed8c80b0fae7642654bd006fefae302f749c2c96a2d873b9cc1786fc2e482c6326fd0c2e36e18618dda6b4aca0597a408a3f78815d2e9a00590a481de70484cb6f8d6ba4d0023d6b0c22a14d5876ee92f73c7b703c28d6ba62c4a9beeee1ec4a3e06d529de1c31e19c342dd879ccda2ff965a389b5c5ca79d834cb5fff56df25967095f1ff54a70d53b8983f5dd55de7cadaa146e8916d286eb4833f1d1a123bf24e39e5db4936262573fc28fad5369a46bc26dec02a0621ee02b1e13f7fa5896ecf3609c4c8ca5fa93695324f7e2d138916cf3f7d57d070ff0a99d71ada9e80ac8b9cb366cc399dbf0b8ceab1f55c7befb385a686eec46363e992967f1ea8416963410bf4f09ca5601112f1a0fa208e779d3f869a4493b048be70835bd1f6d6480cdbf0f75a27dfd58dc3f32ada23a9bd1c5b1ef15fa442cf400bedf203dd468bcb41c911a33837d941f71a418a2a96d3daa7e235fd29e71ed169f77381e86b1b2a5cd05fdc0896966360e1c621ea85e291ed2810410e98916b25f054327e2d7a5ed50d5fe8f5f3b5a93e52d6a6ae004b79c272918756ecef181daeb60355d748f975a7bad227bcb252f700e5cfaf9ecdb6d44b17144c155e2ef25f6eefd6fa166ab5fbec9900b17b4a9ac4313f0ef70c1dbe26a7469db161806c76f41e4f67550a101151da22ceac33fdfacc80fa9db3da808ad6479a05af102851e1e1b840c572ebee8f06eae4a6fc0eb4ac65f7c93144d98fec669b216d1b140b1f974ab36eac82fd0e1247b03bf2492b7237e6b7412b64f566d79c3ea4ddcd0e41013ee3a51d10af92f9a2771245d1d39a4c4a1b8858dbd38402f77427f1fdaeec5575d6dd6c5fca8f9a092f760863dd6e2b4af47e5f8e6050396de8972cd01d24d2bf9aaf82f4b1f9b9df5f217a21f4a22244b7f4f0745a3d5250e36ba70c5a592832e39960c15793debebce9dbd577826d60755aad603239865e8e4cf58851cc09ba5c8e6a2581ae77dfc27739f94d0cefd8e5c96bc4e10c3b253c4881138c0f4baf9f441e5c16a46130a90125618ecbb923494a6c27ad25e0d7c683706c3b9fb186370fb4c813e580ab3da85243d3b67d57b34da8f1b473b214806209dd225ecb78840b1c15cc7bffc78cdaaa108af8ed90e48e9fd1c7e6184bd1d328bc8153ca03bdbf3c2de2c50b60b5d06ec36080295bdf9c1c01fba71ffc84c06f67102f109780e0aa37f88b7c4e105db150b328c4fb0daaad6fad8368cc0b38a96dec46ec059bafcf0c56faf5d683a41226754a5ea094c6e05dd889b59bbd0a39aa8f870af1af6c19575a83f98d013097e00f1dd8c1745a6588e4b5c8fe8cda2b5d1e092a7923c62308bb7b14e8c8de31908216d89caf7a5524a030100143944549212aef0b9a0dfbbd7503f78003bde88f82d2ab8b55c555989d7efbf6b3ffbeeb98e8cb23644c0b5b9bcd2baddf06f1798d07b484cc6a6ea7f38099f162393b6867c91dc844cf7ab68e200dda96fa22b835aee20a135a349fc91522e4939b0a2248fff9b982f7720d0c4a1ba5a004eafa3c4f48776cb6027ad64715d879259c02660d2cc768cc4157d78e33a7c460b270cc8e5f372459b094dd6f9e36dd99101d1a3ad0370806813ea517d860dbd89995a2ef3aabafcaebcb0b56e293ced9d4aeddeec9d84856c52779acc58e39ee0d223debf7141e440ea059713e20bccb8e292bc0f0b51252ec61ca8663581f1280f81c245ec1cc7977418b4216fc57e90596fd21f8ea9c76d72921bf110a570a7d5aeeca8678de1425c72a6fefc3c7d526a557aec32801de6effab5d326c49950e16a56915182b2bb77ae37a2995ba27d7a5e7dc4cebf07804ca590e512e6f0497cbc8bddf992f8351c5013befde93cf3ce1ec75530b77946a453ba6882e26f13fd280c6d2c2a9b941e8ece17a4150f12d0a7861796e4461283eb77ceccfff0c3e4119dedc9785e19bb5b232c3f750967d825c20509f3090bd2b8d5592d298de1bcaba35a86998f366f484e85c9f790aa64e1161b65e314c551255ee1cc975f91cce014173bf4f6393e67b681cfee8571c3c82fbe7287665489203ede7879c856ac0ff738e169c68c47ae597811fc1a97fdc31c8ecbe470604d8c944003875809ad1f07001d117d4bf41857a92e9257b229b5f0e3318f1ec45b2ac903f3a4572d2136d37d2e0ba93bed7949f719b95d5fc55e45163092bd1fb729e78a9157299862fccb460d12b24c9edd78512a725aaafaeac63dec0cb282bd0e7fac500d7a9d9357058482800c6f5de20d0034bcb860b7e178165ecd39d90e1765bb39e3f82694a29ea30589469ee19a8a3af6d06a1edcdb574b8238b7d1b60a1ee3b0b02a37db4bd5f068d36cb2bc070cba265c377010af6c8669addee3d1d16a836e666a2a1e439307d036be7ed505033db9dbb60918a99360b296529bf9fff472ff87dd20283145cb3452e47d540833cb244291429029c3e71855ee3cbce409e16553e1baed26a875957b7270910a90ec1e021015e6b8836af1e01bcf6db986d23800d2c0b5edd2f9467b2e5fee8fbfc4393f15b763e8d2d9b0d1c5d9d9223cbdf06ca6dfaba08dfae1b9bda5d35eef451dd920383a6190570c17d03d64a1362ade067b8e975165d3825983264cca8a17eaba7dddc8a3b0b63bf1cd0cfd4e28f2b275a0ca6650d1f999e4bd822715c4148cbec4da862377a0679ecc77bb38b5ca3082c4446d5af019ad54a74526c3de0b0d1d637f3ea900bd0f1e776e66b57f97a80a3eff39d57c45393bd6a2ced250544e518cf086299b6b5f296d4130c9d9e80b9ec55a27cbc8680cf4eb0b55512489908ad637368b41bcf4ca700ee22c84696a5b73ab419913e9b3b64d6ec5603fa793f7fb4d24cbc5ada6f707b029f8e87f8f574cd1590b0880296d27446cbd45a38f532e4abb51621b40aefe864adc4ca0be1ec84581f2b0aaaa036e86ca1876bba5a30556e50981cc483375721f0149ca674291607e98ef668094e200ac068fa3bad6e6d046d1ea357ff37f743fbd16408c3e68d238162ad19d0b4273742a2c842520815cc3954bb9b2e0eee5ec8ff8a2eb86463dff758d25182754e764cbac00124b950667135b4e9a5f1b66eccf693dc8e3cc8ba6709a8ff8c5668af6bd15ad455dfb8b1cdcd295c4ca9937db9b1215cc07faf0660a4d0e9ab56fc481a6482e17492508167ca0041b812cd62b4eb015061120f2f775a1fca969af74d37da81a5bae7b8a318a6260329924495bc617cab2942392823ef4bfecb5de493a6162049225133400d3c10c815a0824a8b937de7fe7e836878d9a13bc5cce7a15dd2228e04148aae1b38382cfd7fe21a922fbf24e79515d01fedc6d677c81caf82c76976e8a55cdc40054dec6a240019cb5180393b207e357076f05cde25057d3fffb7181a273dc280cbc4260b7cc1356b76e249b759197ef93f1e3638f7488af8b46adf11bcc19887e8fddf322673de1c7bec2eedf12f31b9ad0a3003836452c572b3202562c8e82cde5071ce422396c10ebb4a6168742ac850a430f8affab0182c4130484d95e7d199a629c8c8cd73062c2661c4d143bd218c32e2cfe99f07923d6adced813c0afb41d836ef6d6e6acc09d375a63a1607f0340feaee97def24ed69acacfecde6dedae6eaed93b15677143ae87da89da0792582d9437a7c23be25ffdcaab5985ae65e26fdc262683c3c0fb892519ac27549a32d5271919e4676313224ac2755b6132e280956ccf6c6d6a6ebf2072cde802a3b5b0008372c4b6edd349408e74106f5b222d6136f5d6add4cab9350698107c1e026f8ffba6c4e75f070fa84cdc2ddb1bfcefe156932bddcda48abb79370f3b92079d35c9c4fa50d24a344705b227ff5a50d2e83c26088526e5f36745e30d1200a407a0147b889d7f05cf5825fcfb53c4c60e3388327a471fe42f91dc4441349dbe205e76e9c993feffc43864c591212b019558eac49692fb46949e6242d63bc8cd57b5e14d0170c27c569abd1cf025bf65a62b86f5a6340b4f03e265fe14ea937e51715f4314ab830239220c504c15615a643da015781eee3cea4a943c7f57b05a409245b93a1985ba856c0b50ec4779fb3e55425d4fa3defd0c5bddac73977a50543c5913b672ee039fc54e3dea3524caf3b7373dd9a4aabb657a603293b800b6e87d7b38dfabb00eeff5f6b28af5907621c89e5d82b6401403aef75a7de21a7538cd39dbb3c69b81cd452e8bb1e510025d04e7358296edad4e258137a2146c36a58731a9a9bfffaa915b4cf3cd06329012428317524330812978d47acfdc3359eb2400a5898668ce2807413fc3ee2570359c260d4c487debdd38bf9f07174f7206f49e23dbf6fd5a8490f8bb90ebb97af23ba7373ca85e8fe1ef1c3ea5b5df1b44952b850b67d9f68b83fbfc760b40357cd3eec28f634b25ab5c358176170cbb1c00bf74d4bd3f7f3e1ddee2417c77bcb0267d55db500e398c3cf6a05407ef0d03c9b04243cae235c4d319a76cb26e007aa40bf2122abe7e70c1a1d3c308a2c523a7fb4d1a351664e9106cc2674255f7df56e8256ce2dfb03e8079dd127b5c9c36502a9562f163dc76840d594785978433128b9b3eb835c2992650d156763670139fcc2768e9c2cc7056c7cdc09d8928f7b26ce7904024cd3a34c558df59368c563f7c917235182931c448d523f278dda44f0a3712a8a5ddb87809d2d72478bf5d1b466ae39f83c648959e191173d04e6f42705d6a281a6bfaba156598f58034359d6746261e1439e3865130eb07452cf218b39cc5334857ceb5bbd33c2e35e7090149de3bfa9c5340b9b646e817ed0c5bcd0f36a3cf1650b2490ffe9ac2ff05cacd54208e80ad08e9dec17358093dc7eed1192173e62b593286525b865a646b09266633336c06bcc7ca48504094d935cbb6290e1436ef075fa26db2902265f3d46b92937d2c7e1474cc8a4b5771279cc7a595153baf967ea9a8b50c84b2eb41e30e1dc1d4d99da4a5a8ad4c1caaebcd144ccb6b3846a04079b56e73e02e8b15d7d334d8f40a4aceade42e3333d32de4a2310b14f1a3b91cc6007b42f46b25a11f4839db46db88075cf5c01dae1af370580c601577ba06bdca77e43b2059a15269ab2c48f70d7d137361cdfaa5fa53c8e6292006722b63822fa0ca3b6be7dadf4b1d3600c70a77fbd24867202940b735c04813dbee21bb1b94d696eff9d7b9bf0168938580eabd7b2ad8911de8949511bd92071db1d0dd4c80f95b09e78f637f06d112a11ec9fae82a42150d667b55a4c03d8d61cca31ec1899993ae5a66bde19ed685e210fbdadfabde97ff5e01991a81661a227ba94641bf9da21095867aa1579a468f3fc187dc2c7023a7074548ac090f68cd1926d27aaad2ba709d2ecaf13d015787526ca3e474016e9aae3c5950c2d581805a1202cf5ff54e16a601d422065c4baba8ded193d825f3e9ed84230d7643e5b94505a732336ca7756ad47549f7cd06185dbf17312c0a285cc36d290c8e545dd9f63d9a7ee87b7f3d761b781cdb58abae61ddc99c5202d804353ba22c53cfb79066e2b4efa603fa5edce43bb5f4beafd3f0469f996ba161a78c893b2c28f5da804f84c0fd615941028714f3133c6692220fef1436ce0fce5d98a6aa38c16cc18a850f2680326aee68ba3f8d9d53b6cbd69167b98b7bd35e992d88e27813980f32218a3a66a0ecbcbc959db9661bb004c98596bfb91a61358d87a099b3aed0c4551a5cb42041149f101aa2e471818f793feef44f1174d7555b69179b7571af375ab28ac8f8f1a33e31c41335a8a18d8cfee8373c7845d5cdd3975e7350c6224ccebd87c3e70a81ddcc184c8ad6114159be29ce518285bdeb5808fde507751b31807335727d4fe4cd95cdfc384f6a4d002ec60278dd209405be92d4259a7e38229f3d50980c40e8e9141d44e2592c092d11d63f0360fc83232b6c074b7fafa265ea498d337ae6ff9349807e688668b5399d690292931c86fa51e33ca3202a9a77d68a9cb326945c967376a97c3d3938ddeb0952a492eb3b16652d2d473af01a4b0027858bcf837a424f989081634bbf7a11b2aac11f86eb03d31526ffac2b82dce9352e8b5ba1f26aa6d477b641a59ae62d7af011feb251191a627382a4c3e2ae2d8c05c1279439ec1793e4081db183ff46569500a9157f3970f642a37dc79bef4ad142533d43a0a24d75ebf7fca1d8ea65b1438dac006a74e6d7a8b238c64e000e846e63f7bd08eeb1f1d3e4ed812c710205c106fbf6a7e2d29d03ee7cbfbbbf11415fa5430fcddc99a95bb947153dfb373db0c0723c299d7cb3673fc7db6e4ce7a3d0076f7044b6c39667bf435dc5cc346d94bcbb05960045cb5ecd32d12a29dc4f984ab8c199ab97e51f77203b22bec7795071792321d3603af129574be29994e96186e7df2f5c57c9cf9d4cafa34e47054261e2bcc6069f094e5c1e1b1e2cde17e780ba90d113b305d8d9bb5913f7f3e489c0ba1d9868f3b816b835bf242ae9be4818099c2c8e6dc6b17e31235949ca12b9242b1a05323da125b2816710255280f0cfa6b768463bc4017b82305bb6815095324ccf5750c2d829552d0c38527c00874bbb6d6a6a4ddc8a65392d3bfb1eb6418be3c7ef0b464bb3d42bd982cefba7cbef003e4cb4c0e1ee01cdda7a0298854012a826b4c9b61cd1d4d0351a0415a8d810ac275c3e365563d8004ee64455b13e044e1c8951f8b3d8f37b0fd057da759ecfbac0a724e6abe63d01c662df91d42b8d1ca2bebc0b9b601fbc0194f49a7ad2fe5fe1a9136b0abc104bf2a2056b15ac89bfa2ad91e0ea53b116dadc4b4467d3b6bfbeca01e9172618f2654c615f4c61523f7e0a7ef9ac5b0430cec126d63c7af3ef0e0173d0c333437380175f68f096ede2f42b81672d3fe4156ee26a6c8dd4f241eae5b2f2a2f7cd8e544cde8813cf45fb96031970ce7632bd0820f2bc77deb00477a490eb47e2701d83456b2a08c4cf3158c455c8e217301ad11101fca9c80a1ae0da80ce68928b70d70a6caf878bdad5736d36a9793d0c8f605101aa4818caeb61806dc6ccae7bfef71affe90c02583e6873a1e1ea05319952a6561f8631750ba03c55f83698dce94ae5a8c7cadc299fac95d54e738e22b0e88ce40a330619c44a720c1ba2a844a07d6655dbe62e5f40fac450ec50d9f22404c3b624275373288065db41ee54921d27e4be57e1c0d8bb01471d7149a452a8d0d5a731ad11eaa1c37652203c88d2bb84f393f3f59898e48518f0ef98d9d6e260fcc29323efacd3cd5c17d137939c20b20040f1328dd98e33579f201d04339ff4017c95d243df3aef5e566f25224311cc6cb073d92f584e4ed94d0265b53a1e0208a6a4c996a3b8fea42134c42a6bbe74b4545c31142fc9ff13a08b0c0535486eb5928b4681b92482015c14ee9ff7d10791b55cb8725a024ae8c38d0f449205d38a198195d0fe63bd72f6f408b626126c93dc5353752e1a3c5c591e9efcd33efc937b4f128f48f9228457932695c3cd7f27004fab7508d0b2d3d539684e268f4f5906eb96337fb7aed9a89eb2c1537f7471053b9bc4a0bfcbe488d6f75fea79d30dd1793b00480d8e8c3da3e32acb1269a1c0f7930e89043dff22ce348f45a3d783b239c8e22967a544f998fc0b06275fdd92a0ea1a06e1f21bcdb68dd1f2f782f8db3df79af89214f2aaf20ac040f0f7cd3389357ed953df2767015479284956ff6900536feb77524a738ff418aea4c04cab2bd0d7ee14d356ebbc9ec07f2a7dd0a7e1ab7a65bc64d1bb2b0863835b08420669ea0407c0e3d37ce99d460e0030475e0ba4a470a07903d82981787ed991c565652e4c4ed6c156852f305a749e46c241e848fcde89608f68b823d08013dfb81342acf7ddba874dcc144c10d8257d24a3bcc8d2a936d7978bf89f6efc4db972e6321b9060a8a59c671348d3d9a2fb6b1a6a7da31c5a58bf38e01245e297108d0db23e060e19538eaeafdaaf8cee62f1acde682e041baad57d55b2f4f10773af3bc098c0772e45f4e15f8f4aa3a7714cc5c6b3ab22fb5bbaa1b16c11549421803cbd486009e5bc2734f3059c39479b6e7a9cee54d42fa56b67af70513dc55fd823c2b29111ac96247c4b531478a82d7102555114ad92185ac0b1cced4b084bcb20c5cb8f27bf85738d7d99ec2da8f5596cb5f5c5d250148adbc8634a17e68fef426b25f9797a85c2c6d9e175e96258af56656bff9e820110769060218a383f7f02a9cb56a5200b0b11893dac17a4d84dd2de42143ed0807201cc328d97c1645d4a0c6ea9ab7b8f7e9c09d3f13b00ea9c812a860af5fa1641b171e032aff3c8755b956a38a8f074a79a3d3571a1dcf10450f997c4c3a46c4485dfc52ab59b1216b5428e5322824b24012066cf2c857f044744156537ee79ed3fc9a2f94a8b18b1e160bab61e43df306368d30594f25867e4b220ea4640e11a64fad3fc3f94b537fd1dfc1ce268d1ebc5be5762a03de9a10058c137f913ace1121e1d11de1c1139693aff947e1fe9d734244b0459dfa2efc19e1fdae752d6c53c2fbb945cee06b882210c5db15c132d2f1f619bab4a734b56319aaaa1ff10bc0821d6634c969b0b29fa06432f2422d1dfd82edb74e482df624d0721a88b846d28d9296402eab19d0ad6f0a9ddedba7221dad00c84c33f1d16715f9842b007c8dd7231cf75310cabd2ce5d3dfda69daa7ffa79ca9f23c1a64eb1b66c070b6f1c7b9a909d4cb830c9582c6169dc100b188f1fbae69450c80a319533d4f2efa2e1803250bfbc6ffa61216af8dda157763ea727ef9b7a5173e8a884f39ed250ffb64153316130021725882b3752a37169df64b16c88ffa1b9cf1b784302eff90f006f02beb80e0bbd760fca8a2cd6a235d85d9dae54e384484f1220ae12851b8514e69d9e6bf1a475a8adca139b8fd7443aeec2dfab20ff7c1aee889e572817ded39fdc9229e66cddd4fa8cff1c7bdc5e58c43f37f9b6b7ccc79831451c53b3e7a17a810a42d1b8322da0bd8df1aa3e12ef8f305b1dbf8fc5a4c54c7b360b3de04785e97f1e9202b361949b3c8aefb3f1da0ed894a45e254bf20d0fe716ad321ef782fd02bdbebf3f25b27b1a66fcaae62683f6c8cb951222c03274dfa0736ed5a7e117b321e3fe16a034c40517aa4386d4e1898d8b725f298a99cc4eac79074bc99c1ec31a638c52eeb8ac6f48ccfb245831c612e81b733585c6c0cca2be6507d9f05e52e7087c64e004a065c845a7d724e786a5f7528abd56808b91b04f644d54aa09e1e5970ccbc44a36616af429b902b2c0e3e461a6cd492c69f0367446c9da40c3b09370b00f9c72048bae54d2b5300c5753c87389a2b65f81d636b5f9836751b7e34be400bc29df146bf35e8f78be6ef5219699d05886a315acd0c828cc63de998ca30c6fcdb285d05322c03e7d7f7a2a33ac2d7f53d2f063ab9a360511e721d47aec7e6ecd3ca3ffe28ed76bc7ddb89e0a64d3be9073b22654564acd9f9505e75c2728533a9671a127113cc9256b1557a26b7173d614d5144f6f66157bc2ec287672b10b1d3122f1f028a79bf6d4e74c7d426d2dca4e086de05401b0a9c8ad7f15202132b1761682ec6ab4a0264ad49e5c74146d40d4b92880173d9576243f578c641d63289eeeb22eb9e12eea32552d3ec026e0e7d89035155b8d5e47d7b607eb2fb2bfca7fea2c81ec52f1182cb1421d057a9079a420ea274a93c7b6fafdd1d7dcc886e4c8c3479515faf485a07082d5780992f524a3a674ff01523ac6010c453978eeb06417df9c72f486cfe88e826ff24ba2738c39d218b395ee884b772e14aef9bd615bee5cc1e9e8cfa7b4b627367733e755c44ed69e2321107fb97c68b39bbd40e54bced37b16655271c9a6d575e433156ab80f9e2be2d1d1f55ad959d87dd4bbb1c33140088f927382363dfa681710517d850a1171589da3b5df4b691404f733070420c7e9bce730cedbec68f032d352d868a815ed7ac43ee5b26e0189f62aa67989423d8c0bb8240398fef46469b9d016e3642f6a976ebacc63a2b6de541638d8ee5ee16777f78a7b62ceee5e71277752faf85a78c82f9b38a0274678964e9f056eb843e9bd5b06c50c8236c71f19ee0dccb07b2cd311affb8b83b2e4bd9a8ca6385a1494726986aaa51c2959e791f1720263a2e3e1fa9b26be238ebcd524fef1443a5874a3bf36369b7dca90f3969d70b869a6bd68374844880e5fb849704073d16c0877b35539f94e6cde74b351828d87eb4ad8dcda85cb84bdf3d8623fc6f8ec2a623c2df5025c666ef5c637f70b8ea471bad36d909d54676cfe99e56e500bd3c984463082ce1c58dc80aa7e577ec9ca3f9c73a0582f13ab5a86cef34fadd02fe0935667515a2a17bd6146f0fe878faf163c0172ff17f46eecc87192d23e961fb4b711da473a2166ffb21d49cb647a42bcb09d98cad42f628f4bddd12d09fc8731322b9f45c7700ca2897761e81f98d03823e4344bae104143574ca3ecef34f0d048f48ccf5889e0898df0527f9032b0a4d62c094f23fe38c78c9d0b9ff6a31c6a73cbb06f09e16d81b28e34703d869cd234532a4f90a91968560edf633de1ef7edfdc02157632debf0c71108713b30e143dac30d5ba72a55027b9721b7b04818d46dbacd8c6c9b2c53e3ab73f1fb2232118f5e5e35353bcf59647de5e41347aa9da68356a6df0ea20a50f236bbafc3eeb0421e2832e6de699a4287569517aab185b5dfa1502a5ddf6324e3428c90e97cc5c69f8ada10252c49671b277a116af7666f6c649570e6933f58211d8d7f50b91fbcdc36b0b84c89f42a7e47d68d612920c454053d4b48bea5f94481fe43476c61add25f8ea9ac634726360dba16e49f002fa64b70db2232dff0e020c940c441e659b9eaca5478fbe3345b2afc961b1418f01f84c61c24fff478abc556c8cf9182e7421ed7d5ba3e353770f60fe5d15c4839f671ed2c816194d64a588a24871a59e6a168a314b9d714db9310d6f99573a27c7a17be654ac317ecc9fd6ef11cf828a71c7b4e7f62d3398a759ea00f9dd82d94928da72cb5fab68da11c2d21e64d23f96d1834e0d0ce8f97aea3f24cd735903bbeae0cbc36d66e3ea96e7f028d066361c306aa914119015c316ab6617c0f932d881a518cc22c708cdb77157b96dea6e8935dd7243c271045fbee044ff88336d1059092067ea51342678ba9ad0c285de1165632fda90d50e1b7209c69d3c275404d3ba2177f6eb63e3fd5daa5fee0a7bc8ee9a1a54ba4d7eb2358a2048f8019c16bcd7578bbfa48488b59b8b87a188a0ced4358bcec8d86599d973899c02c7e16357dcee2d54f7aeeedef295685a3d2aa2bdd8dbb4eb3293755c3f02b6f76166dfa9d94157874a8c48243785c590303d3334a8841abb29f287841b2fa7cbc9ba280de3883246a91ddedd47c67b9d013424a055c0c24f28cfe6cdcaeccd56c5c744b812cc1ca50a6c27086ca610830def270da47468cbfb4c4d1f4260f208d36324787cdbf27a666009f760f4d36de1d9466dfec6052f80508e3fd17981a349b40e06ef05400250df235f6a9134a257937875bc11bd55f52dea1ccd927c51489ed4e8948ca5b86a8315e913a95b2492e725a029d69a13cb646b044006c93233672c9a586a803109b6d0d208cbf8def49d2897b03ed20428c4e2b803fa0cfa37d435d31aecb57737e76e4bb76679e4c7435d2302f77eac817650f735f069730d6cf2cc64c052ece401cd22eb4e24f2f122a6f0c16f56b95802d516a68a017cfe9d50d00fe396885d529006ccb32864d1a8b3041c149d3514a1800609f430caa7e3775e45f629b8a8b882a0a627b9a791ddd3376b499bc5edd20c2f73b3963876665434767afa375e1535699096bd9b63b31e43a846fccc5a99446c9259ae26cd2ab6d046f1b40f136ad4c9085c20323959c775c575ff12a1a7f3ea338f991e65822458955ac38f9bba68e34235e02db4c68dc73a70ccf4cff33636b02f34ac21025084bf42048332e1641a4c6b4b11caf4187808d510174c997261fdd06a5a8a0443051edcfa0428f94c32db3e7f89fb140aaaec66e2d2af45d4f7ef224d488cc488d17a16615d986c76682840f6b08bc44e66c60e8b0c75e4710ac75354783c554631a8a3e0607e090157e3a476069d920ce3440351e175b960f5d542362d11cc6f10be071d1b4ea4de1bc554402dd9c9af70e7265479ddee7aa94c8b97b7c424e666ce5235b519c478fb450819519c2f1f1054351eaf23edb19092dc5b96b674fe8ea22622481730f3d955183b5b66d663753c19d3182b72cb8344e63ddf0d4da719d3cbe513d6f13ca766982648ac48b669072157753abd61ff11ccaca0922c0fb28790db39378143cde2983d44479fb9c2fe50e87e83f11078ddd623f0694bd13708784bbfbfc46b46c17e0b5fe87c210bf3034dc3d1a9439ce9004019c138be7d6f8ec5bc010b4aa7cf01ecadcde2477964810d87c52c609a25bcc1001c0af10525f9654138dbdaf25b24a58a22219bcb2640f26cc4a507aa8024ab04de3a07f34032307e1b8d11224080724be7bf4cf855ae2a95e5a6701ad534149e920bff64a31043b415cbfa7470091a8105091065a4af8c7dcbe489b2de24858aaa9245d8b287309ef17f86b1e570cdcfb01c7ec82a2f61767d1c94e47c5f0bb2c7510063b63298a1e8457e5ac23ba3726d85015ae83ecbd60b1415e9c94dc46db990325e022cca6de063ea9215a053389d7b49b35276a49325269d0f94e96862821ca4c655977251fcd7fdf6ba895842c782c2c89addc2f89a5026bdbb9f48e23d942273621210fc2d5046a07c156120e6b04926d83b593e53469c61cb736e6259f95fc6576fc78722a05a1382c7be2df1fbc8bbf7f7237d0c775af540046d53ec7247c0de200c70150f7e7fd5127390442da085bf0367af3ee2f89142a561ea05d4775c4463d821d92ddcf3bdbe60cc776d97339e25dee77bbed116f4da22da6a26e30bdfaf36318b528263d71a2d07f1db31e18421c5d6a1f02c6ae4c4ee723489cee042e21ceae0c3b1da6acf9b2d3298ddb0335d2f75bd9593006f22131c6fcd30f57411c00f4fb95a6665edf27979c6e911387be4322767c88844b431f1120b5fcc595fcff81e5c92a3d1f8a1a64df3e82722c2530a8f817d481d231590ffacd4420607df6ca37fad9196846ea5b51d62f8a9637c40ad852b5eabc1aaabe12a23988161c0ff30bb25851089d8641f11efd7e8e7146030800a750badb7e4ae18910b9c796c1039d656c806fb38b0a3477da4940519c800c473b1dabf5a9957cf236f97eee1fdc002700779783379cb577c7cb3b030cb9e56dc00fb7e7c265317d7e96533ba78c01b4544c1e7171b9758e2a465950559ac6e902574571b553e8c0033933e7750bab6e785ad66290e0699cecd744f86cc1e3a28a2a3f6e6abb557cec7613cc49c33ff13a82b127e2865005563a44dce0a2a114d523f24f03f4b372ca2c40f5203f5858a9d3bc6e97b31600ec94898bd3bbc39d76dc8ee513aa7588ee3b152790822963a341285685c9c8cd095020c74ff3d1378ff9ec6e52d80947f723b438012d01590c2d897dfd5cb778ee793dc5ca7d7e6e44da4c0d9eb2f5a5d6f376081cff9ba45175677dab13255a6c0498c3320b53353ad4c9a4e18972ab2831e9ad7b4608657b1add140a8aafa3d4c923c04558e1e30e362219faa771a5592e01c68b0aa4149cd86873a8805a38f69008f1747e6ca3b6589d5ca524ae4ab40971520ad293c96e01ef592188f2ab977f674cd1917d30e911411ef7aeddd3732fe53c5bc49b72d90cbc09f3fd116e11438e061500c0abf121c5926f3b7f209d86f4dea6553c5692fa0b903074b9829b1ba0d1261ce7a7bd9fbcfe69521f1208d3d313130b21bb95cd5965dbbf549d39079973a237cc393218359cac66a14eb71c414d47587a4d8ee6930bdad911a3a2e72beba01293ae3781f4fa442d440edaf36a75999aa8373e565d65488e42e2f536031caf9e90a05aff63a621e4ae4e7c41aa42561db13cc50b353bc08d8b1625d33e46e6325b3da2058a3b98eee5e0566518a793842f2665cac31f32e523728a45c62cd19012c11b8877d84a0a6cdb0e74dafb450ae330a2317d174bfccfeae03fd09aa4e264f31df64d28dda21578ca331bf8738682faea06b7d45fc36bad03f6d4f0dbfd44d0697933e5577d1ba6e4537a7e6b7a89979c155b01bd8dce5867e287c4c988ea7d748e11df60c9c40e5bca48794f546268fa8ed0b068b197badd674c75db7d335694736869e557a6591859039cf1bcdb35a2f3239c29c3818457d8308a623260e56370861c5d1f91b7cffb07648ed4b3b5d51c3115e4771725986c33512f16735a5d6da85a040cacb2e84147c8af0e3c800fc722864991ad49259432d75e0d729a9587a681ef98d242b4db20bd95df1f3c079d4c98c05958f809cb3fe9d9e487c68edece4c489b6f2aa1887976fade781c44236e1d71de5cf59a64bc8f483384264f9ca1697dc5454c027811d29ae28618af915b62b2ac280d8ae5705d879103afbf99e0a86bf24f0ce7798d61d7efe5ec7a26cc95d0264e6f24300c491c89cbb52b144d873072fa34270c1aa25d3d7b4e2c4520587d9ed06126198fbe09fc6d32ff3f786ad29a4094c015270f10fb78cd4c4646cf851f903162e8608b69dad535a02040e933b1676c64d675c64f21e70428cbe12c06be37838bca025caf060850b217c46efc0f86c9a8478af759f71cd7ec9d5b51060d755c63e8e1761fc1feeff4ef3c93108d3666900ca89856d0c8170045850dda988b1122a50e50e5dd94cf39a98d28dc133457a230414d86c91824a4423498512fa1e9dbfb1dd1467eafcee2078e5189c4c2c131d3c7046eb1777f574ca7660a84a895625edcd856bf7adc61de7ee5806d28a399d54310f33a8acfd6ffcaa719fe13949f2b2af71f2df36043920a3abe327558193ae4022f196e26dd89ba84ca78d7b29e2487bed123cf01f32e9b392731cd0af8bc7735e481f670ee52c263362a687f60ec00dcf561020bc3fccb073de519e08e5c297242d6bf7f9ee3fa434ed0269f7ebab64e0a69c72e693e48204ff1f3e55ad59cacaa88f7cbd226fe11796217ea9eeceb06205cce67c2d12bb05ca7c6eb97d46c743d4a6bb44e4b891c5c32144610dff67612ead7ba95aa5e9f25d5b32b3c55197abb85bae026bf2a252ac28b79eecfe6096b08acf263def8fae9e39902b6412e5bcb3d5026d78d6c28a9823fea6f3b4c30f3b862c6c9ff50686b06c23d6f72f17a17d3735a0a602976856b086f53ca34353ae9e4bb0cc4e4a153e318ff55ca27c7219f7ac44db6f2906d88f3fdc382f4711c6f40dcf25a4e4dac4d6f6b1c809546c234352bd805bd5cb222e031824e07913aadccfb5737630d89c8c78d0ff87abdca010fa12ef0bfb431563d8f582bcb6c3a809af0d6f8a492e84056787288dc7f5f1c3e50b0ed1847cb7ae2ac003027e04d88047720076c46f32e11259137838f68bfc98c55637617a6f6b4aa570c0f182852f01be59242f525a1eb54f922e38695a99fef75a40c7f1140b6eb9665d30c3dff2a948882ac700c83669d8c2cfea21fda7fc2582829ebe923a810a8627b7cc7962eacb7048f2051344e2e656e357d4992d095e60ea0a52e7b4039e535bece44a7b42830b45468752db46c0ffc7250a71b8c26581bc3c89f9f4ede2b8843847a8e64e504352f117f026a5561340765a7901a71221d02bb3fd4c64a65c6200c408ae71e751b924bb92d5482375264e8ef531ae536cffc09c4d2fb3bdd1a2d727e8aa5c428ff47f69eeeb22b65820d1980ea8acf7b479e20747cb207c2a3b64ee49982346200461b8280b5bd1b0f9510214348582ad93b821f6dd69451c41356c323e9b75ea2b891071e1a858beb05e6e7658101b743013801297888ff787758c0adf91a5c3b4767ae292d5673c75a418c07ad272457b4f4740e103e9778bd15bd741511526fe62e28f6e0965b50a829bda3d69a6d4bdf318987a8fa66c76cd228d2e540dd5c4741a095d5b02a417fb22d7ca4292f544243fea08c42567772c28485b514a16c2077a4b9c81df7a8c57497e01cc5291fe29e05f2a640a03262920b5f2870432dde660c4d99f10a2f94b640c972c8c5cf27d4053062884958f496638de088513398203964fe12b51a08ead32600d9e02e4f50b177073b25152e53c876add683812f6ba6cc44c87807939f048baa221d200735c02acdd02c58579a01e5e3bef97306c4b79bc58eab3cb12b513791822ef92b84211318c1566f553f41fd7108b495d87a9eac0817ab9a34f3fd7f1bf94f14ee0a834d0c01340af85086367af9b47d4f0b0c8a784edf9dd8de2e697a7363d4d925402b43ad4ab08a619f6317e666d504fe06a2622f3fe449cb6cff387e49f59c641d7aae56cd5025246d896958951e4ff1ac80e83f35623d37ed0c517612be47d96f1005b21e4b680a6d6dd17492587add0c634f0e67488e10c5edb30abf2eb7015daa3fbccb94d8d81973174ff86760dd78b47bfc3a957977c3a7b39ce558e2353183a50bf9eb72802f3de1c06a7504608a4cdc8f8bedc3291ec6152cbb71603d0155684e29a02d218925086c97ea100e5c280458e9193dd949230f5d4d081fac95e9d0d62a7916e8e271dca11e41485e6aead38da1b65766d3d312fdceeb28c6fcda1142a1f7025697f436fe71919bc47b9e6e91723b6096b4833510431143cabbbc579500ac15ac664ab0d6cf3b43ca2a8d4c086d50b9ac8ba65b5caa0300aa23851c8498471038afa8eed0f78acc1dcae0ff851e530ae22cd32580d46c1d26a3e09deb6ec72aef402e643f63fe0e6054d0c8f413c9ba1a209ce7cac41a742244785f58f30f40edc3180cd98d8136d3e816aa4209d2d46d9edaf44736f1bee359fc8ad2f47913fa4c76dbe689f5d301211b528c0e8b364a790039c228828df3eb460a982b5093f1f47e5f4090a0dd1150440a2f26b63562c8da0f0dfaf186c8b7f7868189726584eb56f0171e1d4556d209b84360e97fd7240caf04885e2746215c7a09b157a0cc8cee307bd4db08ddb649dc1e8f27e3b81bf5d42865ff07fe31f1f4230c11f4d1bd065f1f9f2de940594cebae04412500906897d400312b36f1145f372e23175646693bfede6891f9816c10c2cc122219fa35877b28bf9b92db5f4d77f1639cd12fe69dab78f3b7c52b83b6131daddbf204978b220001590833aa0744408b3b1092c12aec207b35fb49b5dd9eab616093d709a4280510b3bd5b3eb02d8b5d5d75507a33d981cee236ded3df00a67e0bb2b56512b5e0e8b848a81e34547675a0bc88bde54bacd38062981339358f5d3b43e02a5e6bc004813b2c5baedf4449b2f7ccaa56c40889d1656f214b62d79feb3638b936315857dc31aeb6f794a93765dbe470179e4f1e17f0f452540dff1538b0409bdfa08197c51a92418c91c86c097f50b3b4981e293893b82a8fcd4c1e3a693c057f480f40ebbb8e0e5bbe72e07cf8d70d1966672560c79b9362312ac623b859f7c7e6fc3c680808d344c82946e1390c3f94d234451a936954db84095cad206d7a781a89c8fd6b49dba45fc32e09d5705717a8d1970f22cf3b772f4e87bcf483af6f25200a0b6e6bb250ccff9fc4c03aba70351910fd5b42dd293e999c0d3d514a698b27fbd689a62411a68d10255931f0bf940fbb62746ff45ee238a300d02fb11e2b85266122237119c0c4b37f18021f015eb2d6fbd6e58cd3de1ad5d8156c4692fd01132389a3df001b6200eee64b43dadb077fc8b0f8ce3d714cc26a764f8b7a3d8c30ea04bef18ab8f6189687f6e589ecab22b9f0349a61ff695555571a8de1eb2cc07ee3729e393f83c4171030d7321b65e80ea3cf71a1c7740b20400ba51c1ad3b3f122a4f83cbb1021d1846ca5c059477d89feb81d55dc74d389b4b7abd76d56cae32a9506c1198a8fe2a168ce27069d16a0105b19b226404ca39010dfa5da48e4b2ee27545c288d96ed643118a6b0916e459889d14a2105bd6ee75c65dc7c80b072f989e913ee159625eb230b2b30bdcf153092654f06693475ff7bb51d5906b3f9ecb74cc67f46047f98baa8b44a7542ddf776988762a6d66abfbc8dbeff6c3314eaeb9ac9d12971d92a689d58e8fdb0f93b395008433ffc876fa4ab638b874e8d404867da41955b068b59f990f265bfce2466899584d147bb16b96aa568e3ff2efec3ca73a8d27db14142d66577e4a0cf79dd634281bdbc9199e303b374ec928beae8d162c9c81ee96ddd9e5ac6ab35f88c46fb0753e7658b17253ad62039c6f843b0dad17eccc6b7bdbe6e7b8e5ed9a717b9c8c673e9370d21903f4921b85e982afe49396e5bc35686eb499d99cedb4becbfab9442baa14d200f6e8e7977a6db458b86eb143a55772a9a13856371a73b8fc846622ddd61d4cb4fb18d4546665692c91697b9719f22e9ee7d08119f76dd3267b8b9337e836e31894a07bc41ff9a84739a00f8cf91b51504ce4d6e538a214566a8ff2dfd355433fb7f1732c358a4409d01441dca68362e22a257ba5d723f7cd04669c09b47633c8b25ba49d3bb5f0b8f233ebb875999759aa1908368a33d068415394fa2e3481119c00506dd26e8b4e1c6d3177e4c3e75e14193bf933887d798a02219676bd71429bc1d10e176765f71cadd8e0fa549daab12193139a263aba7f24beb642d7b1002c13a759c30840978c4ba097c62331d61b281db82f2eeb29b92c0992cab28bfa9be1d52ce87ec06ef848f6943b6d2b7f872d19753adfbbbe95037d2d4d057872be6993884a612d24eac7fd854ea7e87548e05b595085942e0281cde4194c39d88d7f681dab247acf6d412885346f4707ccf2c5dcdf7bedf5dd002c03001d3bb957538db3ea7fbc793ba2cd37482bbbc3466aaf1344226fa3799515777dc0225e1fbb54e22d921ec33654102ac1e8a2db9b7bb4f745c317ea8bb296889d75e19692f86b76ee90bb266d89a2c09fb02520a1c581378226878b1474f50660f78c3eeaf3c260a4b3f30c2c23f38a1ae8a8ac7ca9222b417a796a021582890c817ef97ab63fbe5466255a0c3f1b684f8fccc7e6eb3c47a435fb8d1cc817421557bd5331a2862134aa7dabdf5e72c4f595aaba36d8447ba617722ec28f9484738ce3f3ff8c3543c9df0120c37f9d303181550530b6d36cd7ba0b719dc0eb47ad0c4c9f2cbfc1aef7b96e80d215f4426b34f6b2ffe33bc2a1ec878d5cedbca4060e06db58c129fb3798ca7ee07dee4914667374f93813afff3f772b6249bd649b781d2941f049832e3771fda8c5fe1d0c891c991778f63a7747cb88b3e05b8b884828885440f2cb7ab021d330bc4d4d0d96ba6e470bf7318e6e6157e1b3addeb2eab7e6b2299743fad1cfcf03fdf026213ce48fac7f91693d229e64f103702f3b1b62a033a274b08c765d8c3791dd4db8f04022f28f57ef4cd9bc71616db93d1d07d7207d3cfa3c83a873491095ba3acbe5da1a05d3cc29f254508ceb6476a4a1bdceeff6ae9f9f31450afa97f31667e1004329f9a9666ede9e806caa4ca1efb2351f7a1af6b378ba37507111c56c2e4d76b5aedcf944b9b6bb6fb793aeb088513836d475a20fc2ef361a1280e1079d5747027a5efc5d623941d4fd8d3579cb17dc42f13e538f5645608cf85ee5895c195325e247e5824e31ec5f83fd6d5b868036bcbf4f2c24be4100cde8178eaa66a034a357c9a1920bc1d70b238ed62e33cf0e37f42a49b8b2f9752433711d94a3e6ecf9dcea9b7c8d4ddb7a7c0058ae04bc61bfbf7a05bc7acfc1823d559be4dd06428cae8cd392eacb5896f2a6a4100b3012a8ae9f4f400cd1c88a02c68eb916021891d882afe5e623dc27fe1abd55d1c30f901e40019d65bc9325c10ada4dfddf4b59dc19731f2a0aae1385ac302c8f5f65aa73bf7a4582881b3d27b467d367ca2530b40864f471b57d13809a7dbeee4461033bc99819a926a084b735c70369f9e61dd347c97a931fa5167c3d51700d7bd79ad25681cf152ab9668dc982309076927a1f85e08e6f551a3f89c10add3602bb2f5e19a12321a0f204f7bb8d8ac5a3be4eabaf01cee1f687a29b7fe33e84436926005e4dc311ab8a44e581cef9c88638d5fb11274d8b1ef1e6e9064f409ac0b992d31e99d324031e09a1cd0f82855921d2d2881f0f5a4207748d10a403a04d465c008856251c91b0f3af112b6afba0332f621c6d25934a273234057948019dad33947af6d962e226857644bba37e0c03151cd3aa38293aa3ace9e2a9bdd16469e5634a4fd987f30612ae45d6a067edf7e51e56f10016a4752208096722e8fe6dcac78f34a975250869359c87ca8eca7d230b01e659769afe11d4fcbe4c964269734cd7da3598e3fa6f42303b19c450f983d1b973ecf774aff043864df2a2d2b31d160b93824443e4907bd8ca5c3f07c7912101510bf13b734a58d86887ea95b5b9baa27c38c487151b07d3381db4c56fe65b49abc9cc76db119fca588c8ece62a6aa28b00273867918bffb8796bcf3f0884287d8d7830e4c3662ac45c1823f34c4e5bfe6a98184e378fa9153b1665be9e9f0fbc610e34754aaf5c86a9f03798e2487d0c61a53413e0dc849a0080dce9ec665a04b63152adf34737d9d3e6d4c582d593dfe9c2d3ace9634555f339d3ee17ae4e295224c6f1643bd99d04eb33ac7416d041e9a496491c241ea668a806534e925a33f199a5cbf83392f4deffa37239ca8e07c7f171358415640ea4683fb80cfde05c6f30f3e8f9d2f15b8c3a0e0ca3b73f95bda3705858bcb4947686fc51c2fae87bee5726642c8b1a8154990961250b6cee87f9eb1a32b3657cb5ceff8048d9bfdd0a502ca5271c0c56e3b237a782496ba620809eb15efa34e0afe524a1a0b56db7c58d066974df6c1dd24a23b4a0a48bff6a10592abc339644316129611fe9c49c0f751c44f88195fff0353d69731c0a444e4aa0f7ee350e1fa18f12e575978e25beee04c2b042a0ea206ef51fbf0cc707e40a904a83e2a19c8904d3d8bea774934f138f720bd88871ced7fe8a1811a68d8df742a608849aab7fd90b95eb8a6970698430a3c720e05a2fd3b174cb6345ccbff282d7da3356d364ea437f859c959b9d10639221c6133c94dd357d45080d9645b1e804ac5fc24e751e624dd233eafd9a4bd46e45faac314e108ec77b940bca00be9caad4671107c91883dc79078ed9d242214bd5696484d8786fa7bb4b303263b8953a8686a2c1f07f9e306d844a4afe6c245fac954f8d667a09b1026cd8d67af985fbc8f969efa19f0b666fca97553a335a06e12df3b583f21b8583a9a79e8372e1a40c805c70fa402573beb132faae42ca492d80fc1257952c24ff524025716a9dd5461c89af73c9bbcec7ecdb7b990a85489c9d9960c7bccd8e745b880cc709e7687027cbf02702dab7260000df6df86ca3314693964a7147de667560bb3db2656ccb2cd1b7493220a9488305617330ccad252db6eb094b581c2a69c06cd773c3c611a33ce5bfbda061378a657d1f6c31a2bd1f6092ee403156ffbb3334cd49a67e47a5ac9b8b751f2592ebe512c3da705d99840d246dae7bce7d8154c2f35f9483d0e0939d1b4ced99b6a47afbd99a0d3c4a6036e7af1de05b4f4d2d1b32cb7c45d198aad21d3fc484e2c0307b89b8628dee366ba2e96b0c2a1f580a38255c17192792aba80badf7e978e30e42b346e8cc93474df35e2d0319199c0200e2f0c168ad9803aa83408ffd9c458802d226956c41913c17490fc5003e00e67925de798b0cda8d5eed7431f7535d0f1d0f052c5841f13396998c49a48a37dd00a4dd03a4d29561f9b311f436fa1e5740ec6ba106f1631d0e652278cac462e6afe78082a2d18d0109b926633c410153e54eb9beb1a1ad23cf6f1e577ac8f1b3546bea0c6d0d01cdb98cde4e356ca1cc2d0d0f897978c6d1a91fd319ed55d914169d32c343406945bf228ba2ffe2c0c7ca5f888b19f9742435946d01731c45944dc6d2c665625f0d6587ad2de39716aa244fccb73369412bcad4ccec3237ad9d0aa63009eee0c9b5a0f334eb31d73e415be6455d70917d28b6dd632fa973a1a9c63df2d45ecf2c4a921ffbd9b4235e441a568c8abe79927889bcf7e7ee417b2f23d3c98eaf770ea9cae755ab006cfada004af056026f401e18ab5b5937f0034641c92b417f59c627ccf2539f2bf5c4064767ab39ed6c01dcdf8594085856064481b430f8b2cc1c3d167ec61f22cbba8890d5f17baf63bcbdc505776797c635953dfb126624cc7a9ddffd784963de0f4f3b300ae5728085a8e8f2c2ef9618598eeb1b8daf5b31e6eb67eaa46f1521e250257b1e3188758b78a21f7f1144943b7e4aee978bfb1dc28a95ea03b6321a0a0e6b5f53cd1d10527d4176cf93525085e97427478cb5ee6abb5d6238462df3a2041b9aec01d99f20219a8f00b011409ca22a7909f239b1da1580b6edf8571af32ef8874c0a3780302b83c41f7ed57e30c5828bcf4bd04b8d9b293a31cbdf05516803134eecbc0df37d697382baaf8c66f9cb06621c23da3ccd14edd41428af45302d0a0ca353fd16f30f8f318c0fce43a6bdfee2c330f8ff0a80b91f3273e37b6484baf67a1a3945a394b944f3d165931ea5a4858c560800af2eedd82e9c3812977377c6c6339bad9351e3877cb5864743b44befb2a1a98708016247f8174b1413d82efe76f887630f660ac3039f4101458cd25b5c6a05e7bf31024c78d36f3ca53b5c91f672a964956960c775e80228c81e73171e5ca34c2cfb15d98f78b270a93b82191a0ac5482d882884c4eab21ee7f5a3f3158fcf6df191a93ce10bab165b5cd33eef7b3675ff2b2262ac5f2fc9dfaa9f5846e0a1c8eb23ffda8e459860426f1ee2c49a5f4d14b62d80d48d6400e6a42fef3c77862148924258fdb7fa4b0be1dffcf25cc8ba475c7d3a78f051c20350c4be802608ca1d4fe8afa390bf45e03bb94846786e42e03ccc7b7f842cca21545df417eba1e7469273ae38c4e2117f81f772d1acb24c4acf0c707a600654b21d96f9ee1cd82577d650c46b2fc243fc8a92e9c4377f25c8256b981afc17281a2d977578fd6e7e5ad2d5567b2464996508dea7544578541efe250c95fddbf958a373b80c57eb1d04fcb13b14cfb3b5b8bdf76e83713d1a4c320406af41fff1ee23e906deaa6c0041f1d9adf5fb1bb56237f607866b7345c6557bc119774f7dddd676aa0b1efa4a5ba8f10d7b6741c67311991d239e2318db93651af27e587d3f5604f5a0675d24b71e931b531c7245fe27d248d5d5ae8a9a64d62b341b039f90ad395a99f7f014a3daf22f6b0d24c1a38686a055dcf94b2d8572cf6d382444cd31ea8af32c1bb011a98b8b69df8cd243511310e481bfdffdf59dc9b4013ce32b72a29497f527c0be9b2393813e7b55cc0f5a1d3f9037950fbc53af8b0c185c411f5f880e0deaa51287a719fa18b82bfec6be3c1af461ac16f981cfe7ca86c60f8110e3ea286fc0da5dcf294058f73e5e3620cf552eb074a766e2b054493d12341c299afac1e4037213af44a8eb785b2b4bcf3e081c49b9685d3e7e0c0b7d9f4bb50861e4e97a83216cd1ead54f12f894667136d05abcaf09dbab318ff0904bc0368e3805ac82d7df57b57a76ad048f8a5c11c11c23048cb810c0515f63d8e3b960a64fc4d09f8a491301f0eab4cfcc505a86df794c892c095af8148d84b48d4635bf7405dd5ae9f35fba1de27fc18209f8b924e0d9be53e172ae94aca3bb26dc07f650c12614c479b1163dda2d08625c1881272be2a36c6e63b6412a67d85d9452e5a126c1f46d699b1b1753ea684cdc30a4777a4e520ff0610cfc484ff24f4d8c29219f33f660737182befa6e623963890ff53ca1e3689e9a0509311ac7ad383a17f95a6343234573f5c62970c9c3fb948fea27f995fffc4e162b55896ed0526e9fe392c077da2082c68fef00e433168ae3ae8fb6109908f0ac9b6fcd409d415e45375f0e6213e16533d626911fb7b5360c10e328c04423a2ab6c106f94ae59e35bea3903e235a29f4f10cd642ba33b09bc7a88e4903ab6157cac5b255e161c43f252ea6d26453128a18f4cfdf3b68e8e7cd61abba085f7c9d99c20f4b9116992f3eb36331f599f6845c4a8825e3d8002c33164799075bc1f9f3373ff49771179ab89fc7aa56cc60af0d474390761114c38d71870fed3fb9462bd63c736966c78b45263d7d26e17981df2e1baaba9dda2b24d2bd5591fcf2892f9984d128084fca1475467d2d1da996848948c52f8e7de949b9e03cc46612ed03d1dae1c704d17998771ce7af4ef8fd1188882497323dae7136732c6332217bea2bf2481ea3b4e8a7cc0596333c5a5a274e3f9e29096d3ab72b3fa231d8415b2d65cf362ea20bf43e3141e62f7c3312b119d79d365a93cde83494ef914afe180b7178864592e3fb6dfbeec3fac5b8bf680ab6edf411335a55e939597d0692c0bee89402384896516361ed06470a3e325e9d9a4279a1cfaf0652067a2d413f0471c4220c5cf8e8291fe8369f6ec633c9f7d9477b07aa6a7a10bd1da89565df506f25718716080a2a123678bd00e1557fce34d72793f8d1885c05f00ced1cea309cc8f0c69e8003675230a0ff32a552f8270cf5dc81afbb35ecb5274655790030677e8dc96474a0ba38e6661b573a873f4b0d7d4f75b9cca52cf29005222cc8211e194710899691afbc33017e9d5948c1cad5592f100ef1c603d7aab6c80e486f191795922c5cd3ba61dfe254adb74e76fff95c03f6d2e423a9c62298941ba8c1a2a42a1411005f574783983b6fb1ec8758318f35588fa83e8dcb112ad1558838ee0693c06bcbb1a7ee5461f882c292bc6f415ef068a64a889c1802f195fb3db1526494436142a5d3d894e606c4c33917721928001a5ec743fd55714cd366a71774b0df8211fde296c86eb9d174b1347cd51ed7fa73309e72edd4a93e3502cf31b1bd00a71e6a0af65dc8e4030e7d4a6ee469a0c67a9bcb2e24873e972ddbea021d65ee11a67cd296a4e365a0fd13e1ded90f219181ad20ea7d3ee2b6e773fee709439beefd52efff063776bf24e57f1cb9e92edb54a8bf904b46f70efacf844c4415ecc7413bf5711a41c1e12f9044b6a882f900facd184f0abae86dfd84de4169f4c508162492d16d858ffee2df7f7c4bc6ab0b45874c700c4636e706a283db902128d610e55e1dd3c41c694bdc988cdbb592f6445495c64cff52e3e37235c3de85204f6775c82a0810f39b0968993e4b7b70480754cccf08ce92770d60062cd4fd68c0dda4472beaf89fb2cbae928892146d4643b8fa367f503ccbc0301a83c190aca98f5c878fac41bd25c9149e0cb4c2b6247dcf99f859d307ed7bd2af9f3988b1079b751967558c42ef424eeeee43e5439a00d16aa98f9a727c699f033a7cb2618be02738c043186eea545597050865c060f5b0a154e494974daaaf0daa8ac4c2cfe1dda1074565c41412902e8546d9e752d4c352a0b4b5d1f4ac3292b687153ad9fcc93b2c3035532c26a96b2a7e69c5f982dbfdc2655cb3cd1f889a2a08bbf883980fc41b454b33572fdbd6d9ef24cb080a03f8bb92a150f9a53c12f4b393051e0516cf233cb9583abe0d26385acbd5bc1e9c67755112a739b9534f4c00c9a55c6aef0621824767528b11e3c066c9adb185efe676fb347c2a860ebe8e58af54d300a9b304d17b38fa486ba36bb7b61cdd655091451bf55d2143e1ec897cb62a5d4a3456361824e428517f5af97a77f69e580dfe6b82842fb89d0c49bd3c5f36922ea7c890c55de4faf2e7c02282c159d5734bdc4c45a84f292c721f2f36461b9d5ef6c107663cf30426d4d1f3160d3f86e101dc7f1642b7b092e4c2ad91c7b8408935282197bf974c975d201e95b79634e5c33864eb958273f781cbc5c6a11fccbd9a306e048c6d425338965f9728ef992a969720747325af16b48884f3a87aaf8d438ac9bd906e97b82954ace7e2ba378db35179f949bb09854e7705fa1fda630ce122e880b457c68670172050ea4ca02f2be8743135c77d9e740bd26194ea78885476dd6ee42125b30eea87102aeb10c3841073436a7d1402c69206f4f0802f9baa8bd67f39d0c27de9db3a5089818a9d2fddb2c348a2232dbf7daab43bf5cfe4d2f73f32a2ed5c5fd29e4a36a25c8eb6d07421c6de2a7f485b98f9baa861050cd7ccbb541368f73668e93208312138a528bb2336d5671a429747517c712e452e0cac4c18d9503b5718c8d97d6eb3a5b8e5923ba106039bf4dde3ebf2a01879ee3b668d9e11ca3851ae06bbcc74802c2393c0c7996907342b4ef20606cb52a39cf591b3fe72d67a34fb3f681de528ed701f8a40e0359db72be58f12c337f8bc7135ad3f3f15385a6148d2255d7a1e5af3c5387d494c6b97772bc9a7b974c46576719db46d5e8ba12e6c15fb3e4294428170d9e4866331eca07f2872ae69ecccc33456ac6855200a7173fb0aa4fa828066652ac1827ea4810e6d5daa94aa30e134cb9c841e6d85d961c2d86c38019dac91487936f77e5658c3234b54addab6502b8870e91df3b38a00b3e41417f55f49b9a956ebc265b5722dd684eeadb3ba279d0222b78964d9e685846ea4a80ef7d10f575c8ce21b51a29e81aed1a935341ad84cf4ea799281e035fb2f6e81ea599950509d224b8ff372d1997cef86eae563bb0a3d887a737045930675553f9200e48c9dac89d21c1a154bbbf54cb9703f29899032d6516e9dcaaca79c75d2dc761816fbb6875ab6c22fb79b9917451dd6bf9ebf0ca8ed822489056a3befa110cd8f5c95225395cbf0157bead8683939f48131e5e76ee3528a20d8323ae619288b8d77dea8b9964b1c1b92d2c49c459614ad50190616339b8281391a5b6bee82f2f8d098c9bbbcd9947caf711366e345c126f6a2ed9852eea45175ce0c0c07d089e70b7d8ccd3fba09f3363311ed55904aeeddef3f00dc3352bd18e24c433ec658dbd02f3a013893885adf7b96b4e1d899bcc91e0806790dd4978d8c59db5d075f40e5744f576255bd7816d8217cfb58c35e4a16f4b1018d528fb3468b5f4163969c78f45a0d2d5a32a281fe9c492870eea5cbc3d9d5f151380e46a383add0c5cf1ea679fd026ee68f42dbbc53d973cdcd530cb381aaa910daee7822e423564a6a757f0160745033b92854ed4133523be8d1683d369b6d980fc590606b3ec3a3b201e6fa64b4b1e02d3d2097291e0f54b4a059519a7b1a4347a3cb4e288f8125d357dae726638b95d4136e5222ed1cfd3fd5c62329f48a0fea5a1553a2b14cba21f55dc969ad86f1d28246d2945c719acf5c590412df332ee4e4fa1dbf6075c46b058f1cd5d873c67333c12c91662062fe879d6aa0e4fe330ef1ed06c92e7a9ed6f74d8d704b79fd37f9343e76962267ce9b014d51604557c3cf429fb43690f4891801fbb738a2901c86a64fbbb08825c7986052786786dd5d414c32861f2ae4ec2e0d0438c6a146764632a3dd25e4e3791f9b3d1e35ae7f4ad6cd17f0e004475781549a9c971954390f3ef0b7d310ded069e6896381ee5dd8183f9d69adce7f222380d918fd70435e5088df77150ac73d820c7d353b6a9f9a8d2a53793063242643a17385555e0eb9163b147fc9be7e208fbed7406b155c4336afc7dcc7a671a89b7daebb6a8574a95e3af8d73b7ddd688df10d0c284a0afe6a64299ffca6beda704ccbd12b24b6176eb888cecf2219c7b0c04b495b334cbb7fb2d82648229856f71419bc62f494d51b6dc9937caa690394fe598f3182d11fbb527e12b1a8017aa004f64ad4dd2f9721d88a2493abf35f94b65d025107d0d1c7a466a08e90ceac13eabee18337a8869507fd1146680ae5c66162aaf64134957c7592c485eec09a15fb31a56a6ce48c54daaf542b2878383b7687b2e63a7f411eb805d1700bfc56d072c9a651448073615590c70eaacdfe158067512cc79e6e3261eb13d55663b82b65b18282c8508dadc1b36776b196890e47cda38bd521ef61fbcaf201f432218df35bbdca3be2280dca04fbc575b5fec3bfb4e45505e6f4e03dc5a2295f2cfdd929619c3a80a92d3ca9e799cdcc6ddc2bba412c43c568aefe0909857824b6176f8728627b898e99b1683b124c65c82bed4cf8e5f177a87ad263861a0ace1efa56d171ec5c5bab5a7d70b4b1e609e70733ff1a72eaf1516202ebbb2517c1ca2a5c44f9f7e72282127882a977cf64faec89a235592698c73bf6dd6afda36cc6f5a9f31220518e956b3d3ced3f35157854c4925006d22bb394e17ac656609acf1f69b0e8c6ca12d63b580cf1336f733e34ce992a713ecfa3184e506c80be221e500c383112008750e509a883d70e0875aefb2029db9689a9048ab9bd9a1cf5955682669f85e164ece85ea1b3296e62edd4f22654fb26bb4758339b66f242faf49621dbb644b5a6399ca344099d9fa48e17aa0bbabc6f9f2c6dd1147dbfc777f53df961eed49ddf126583585efe9023743f14232b1347a183dd76f3a45c5b0afd89896bb12d5b702ebd31061572c10f894cde200b654171027b610c193ebd95e82565b5538bc00f69769f409b40709f969a6530d984e5ea22e0f689912b09cd6f796954e15e4e91fe09a862fb2d35fc38a34dbaa978511e74d0a26011b121c07ff2dc1172a23ddbb6303233f2ab7cd7749f54ff2723673d173225d4daaa092af0b4158830397061b2b27565e1ea7fe2dd456994f32f5690afee26390ebdf8dd67776d0b53b4634bf81e2fe734580efaf1b8e96d5dfcfc51862e12273270167a2c6a8ddf808f4f8459eeb8c0dabf70f39e347a38a943e073375aa435a8b6e69bfbee85320a82952e32d3839f56d31d647bde2c52422dbbcafd0d416c3a80956b1a946dee704085f4266b0a1ba43d043a1a1f9a5a305c15351d9981a263f758ddd46dd4f5f7dad545b35ba6d52a844a7eed36a439734fa8ac5fbd02c2071e99211c00030b60ca0084d1bdee9c330ad85c00f4001e6d6bf884261f632ffa08f661bf35db96969a889051237bcbbd777309f508dd0914239d623b3a15fde41487a563d4bbbd77637b775defcdfd60c3180cb3d664fa51287aaf77d7bb1b932fd5c5342a7805bf53d74d267b8750f94ad783e8dbe5556f5dfeba3eba4eba56377bbb6b92e3e17615c3ac35997e14eabadbbbed9aecee8750c117c7a651c138f6e7d5d464abf295df2136bc826d64fb9b7cddb03b664366d1adf683e817ee21fa867b8c7ebdbb3e62f2752ac2a347f96b4423a625d2e57997bd2eefca7e5d5e67afeb9862ec2a81bdbe1bdac8df65c3dc1f3f44895e5f595c9c9edecaf920f27e9663ef2af8266fdfede554e075f1a86511fd3159723ea8264ab668717c1aec42e52d4ec3f2abb46039b6d1295a5bb438cdca555ae0d8a92156b00a8ee91475717f69bcbe2a6f7ae9d977baa961ee53b2c6a12a571c62217682435b42e17bbded1db9fbb7b82c5fb9f82ad7050f5c02eacaf18750b98b3777cab1727c1a95bb68f17b9a16bf2dee7f4fc3f216bf1f82a5850b7c67963ec48902c22e30feca695c541bfe62081bf00b5c6f8bdfe4ebe2aa1cdf95c764adebb29925d75d931c0faa99f9af7c0896ab5c72a71cffca698e574ec382af72161617c72c180fe102636c3b557f9323e7ddff342dce72f1f1102d70c4bfc9337366aea8dcc7c8d0468ec72ca52da9948f3e28d38629603fd891ac795506512a67c823396229bbf664a98a41a9a44962cbc21695d4c28ecc17f9932f4b620a841ab139383ed6c7e463c24c39312726873227f644ccc7fed4253144512cc2d86861478290c8217246fd15521b65117246edc6b2882145f4758f75aa5fdc920c6c1879ec44a15e8c883076a6e2651147f0a1961563376e1cfab8f9aa17e56a5cafdd5267bef4adeb32311cf3b22ade262a66091c8da1666248bba34b84b13145fb6e188e9457cf7c8142cea0aff5f2c93ee8a504ebbf7e4171f9cc970b27d72b93e0e8d4fcb513031b4a9e70e664b90509836921ca5c4a228c4a7ece0de4190653155450c8533221cfcf9c1a8f1d003aa6145812c8224c66b060c8510b39c6cb0d48184c6a000231d65c3df345093e3972b561244f8ee461e1c99949266a5e20b64c0c3420a6e6656a0a24301561e506e6bc0c19b173c74513368463a7a475b16da2304f368526b5276b9e4dbdac96b4256d29a93c6273e1505a7d35166874935c6f0f36543860202f8bc82132070859e3001ea6c6b14d727cfc04b2a625130bb547faf03411190a9b086661d60ed9b2e843968caa92216710892a18a88e3d2e35b0d1464b53c5228df1891d72bc8b0c1adabc0559289040598749fbd8a64c122986c35196d8ba381eb24ce32dae064663a634d6fbe2a519d85035b34d548c14065bc91c311f1a04ad5eabd7b5ee9e3cf29440a84b72d7b48f8d3eefe8e3a3ca99528b3e78a6009d74e80f5d45ff4c54979460c3b884dcc74153f3c3290575c91591bb7265b3edb4ab8b4c14bdbcb1f796bb2524d8f0cafdf71160e3b2648dfa0dcf5ba169337368d533a07553c919d9eb89e4199fc81816976057765d5886165556bd33131533511876591aa31ad81e206a7834cc77611bf3a5071c9fbdb65374eef0d2325ce24be8b3ba648c7b56ef4dce64c81821cdbae488645765a2228d5844cd5bf333da8ae1409bf8bbd7b78b75915c37ec93899cf1913e1fd2d19641d2bff9e678c832094f2cd4209d7b64428166e9922e0ac644d1e310e110f349c0cca523368c3d618c0d1c34350ee01181eddee9b7399a30a589053943e659ba71a6b267573681bc11e95abce88626f0d68899043e720ba8f524d2eb4938147dfb453a463a7612965c0244b71fdd2f8b6eb2f5b66fdc76356d6241a289f96419a536537b943342df5ef1862d19437be56af4e9294743db4626194389ac6a9a96b56b59bd1addb6ed35e837bc4d99b357ad46f6d0bdc9968c512d2a35496f1039ecd3c890af44af9b8659c7cea4f36e44f6b0d570e863b368bc62be2293f9729d0b5dd355f944d5dce1512ed1c0d277cc0e13e67b3daa5e1527cc37fb56c819327296e87eefac6bd866e4bbe876e02b26422126f23562f6f0c9be07760f63b7b7b8b83d729c8f2d6f585a2163843eaff8a25e28f039e964cddb7028a42787dbad87b887369abb6fe7ba6fddf6cad5e87e3d05e85444ce88b9eacc977a9f1cba538a89a2efeef49928ea44a697c3514262c319c47ddbeef6942be6cbfcf614a0f912f3f6530ae40c99b7538ec66671b766d775af31dfede4add3e6c6d5d8cedd9bec63eee40c9f522063580fdd30e58a6c552443e89e2c57b161ac6a6dde2bc6236f8fa21bfec81b0ebd87a4b6d96fdebf7ffde1d0a6e6efdeb4d8fbbc57aec6e71d7be7c8193163de2947c3ebc9db75514dd4f579fbd25b6fec920dacf53a7f5d47c06579de64e27d2ef1de24f0bc7b21fbd0354dfbbeef35e6bfdf84cf1ef7cea6660e6fa11a44262e59f34298bc4acea00fa9f6cc85661a96216364af9d3bcb4e391a19932caf092b31f19c3d7b942167c89cb964a793f220afbd86ccb2d06916bac936335f58868c41e911edba76dd38b1df647ac3f3c8b15e77562c63a63b4ed98436fb864172bce24d8eb74920634c26b9df37979439a031a714b0886152461f9b2c420e298249e3585da04523489c884a62f013951811224f6c3373054cd9c694b3bc917202bf028d2db438b5162da24c8b162c2c518685656525caacaca8a844191595d329ca9c4e2929512625050525caa0a0984c51c6643a3989322727a55294299548a42843228d4623108c32202812451991e8fb3e6ba38cb59e17653cafeba24cd7715c94e1b8d8b26db165ca685a9645992c0b85a24c28145b30ecbaa2cc75595694b1ac5aa34cad94764799ee39a3cc9cb145467e5ede486909c104e8a70a287c789e48b2736489247472884821b26c92c515414b9848f12325ce1563d12bd30341a91461bce28a44b04215991e063d55ec9e2aadd78609c33353071a4329c5e982166d3062c3f853310cc37eb09f8e91e590962c8324905c226be426251356e630027b2387c8481f1313132fb52ceb9a40b5704c471965bcf53246a5ca22d7371614f3d496b1ce6add1c88b0b5946d620e43582343b055080707e41a56a1cf4c17d4bf19b1218dd9b558b3cc14c7999219111acd71c26c745249295529820d9f290a063da57f31bd2813e7fc8dd6f5a17b93fbdad48c61193246fdbc8dcd46422ddaaa181e949cd5a2966559169667a439d0faf29a942b298388af51e6ccce224f6b725f0338808359b81034777a16d19158c43c859846e44924cf2b7c4cd49c3c988e649922c655cb25661892a3e4287e01e3666640cec9040b47004a120435ec4451038b0832d87440822c18c18a220b491822054cb010638cb2bb37dad87c99b13b7637a594524a29a5ddb17b069452ee1b1762f63eceabf21095efbd76ef09bd61e9cd25a0fb09c342144d0e4bf701239f4e3b03418ce9ef3d39dd996949890a9ec8f5f4c5fbe4f4c43be9520b96d2574a573979a9f4caed78711baed9303f14141b504c9fe92b5d7b71633295dc0fd4647aca0d6f72cab5de5ea484348b5cc0604fdebdc9f4dad47cc232640cd3eb0d5db2e9338d82e3448d6ebadf090e61e412e9c689d2bed1b649ee878d3b0fa1dc9de3be594b0303857af1827a1e087ae1e87b41a905bd172f6e9c29cf761a0d8c9b0dd7d36b2fb237fcf0c5855c476fefa581a59f3032f7d0bd4b031bfa80912b07235399b78d865b16343747727cc46e2002d01460dc4004202964f93b6d3802f7892c49c581a3ac54ca48230b8a3e8d52cef328776f87ca4f1aa651c19ee6554e3bc7d1c44e698f9daa9a17d6ea795ead9ee9a4e4795da779ef3c4eeb3c1c59f4d1e93c3a55ff712a1de90453b92715fbbaee386155a72a27e26ab5a2d368441ad9fa5315590e3c5591e5b8d355c141a3824fafb59eab1d47e34315444db3548612c98aa84a011d38ca4e4e4a99157db5d6d1886447b556558761d69a4c3f0ab579efea3f6b2b0571d0cdf36a15e1eddfbfaf6a15f7b0b5b31da992ba3a1a8d46231044a12794aabe4ff483eaeea24f54323d364c4a8aa9d4892cc5a12a77e0c88a4ea3118ac99e946c6647d64a1c22eb6d9b8a7b941908c2714284aef34cf5dc8e2ef33653ceb28c4412812392c7ed40b9a97298060577f7c07b60e76d998769baaeeb700ff01e281a91482452d7913acfb3342654d7ed309d8b3b4c184b795e77af13bd870dcda277dde8ddb59ee79148249287c3eff624d2f72e7e64459fe9a298ce75dbbbebdd5e2e9ecb36d3fd4183824d9c0da5d96a48f32b83165f70a2ce3ee3911b87d9bdec72cf3e10147d190e4dd144b1567bab918636b0db87ad4ba4087e66a6b86061b32cfb68a3413c5b20e5a1e5ded9ad9769efd7d6b2eeee5dcbb2cc46f4ce3dd3a8956937d432dc63c4d1daa36c949548e006825a9659dc0dea43c85d7b86411f344cbdacaf69a73c3051df1eb8043c466c27e7dd4d33ddb3a311062d16711d531c87439baa51aa510f8737dcbd1ab0dcdb02325b9f5a9665f778e4d6de97bbb5a91aa59a46b9db542eb4a959c371cba1909ce1117978641b7a808b92c06176a2b089e298f0de81af4cd64e940ef41e078410e00d6d3278d1fbd8d75bee3a3777cab2efa60b66a2ce70e33851deb6813eb64d2385b4921dcd9ef49d466f9525adb7eed4022d32053cef74020fe2eddfd6ed7d8fe0d69d4de313f813f8ed21963f7c02b18d981dcc0e3ec3e8f7ed8636fd6dddf67e05718fd2777d6cb97bdfd062afd495e8bb114923913a52e77d218fd49fd733f4ee3b9d2fa47fdf356aff99b87bdb4874b2ef814dddb9ab8936d2a5fdafffbdf187c1cdebbc5028cb361105414a3abde1e85696652f1da4b7fb4e0f7e7be9f6f840cabdbba29344371c611f5bceb230fbbe7df47636d93b78698f0ed35b1f9ba5f7e8bd631f9b8fad1d00848d9cc1143370828f2d5b40ce608a194c71b0061a8eac659444414ae9290ebb6f9556db3d76c39470889146f560b5f5ab187b2aaf44aa28f444d64fbb77dabee3f495ef60b94a47e9874f1b5ec1342cf766da0bb7c74feb28d52a3e59ed9eecbf6b9dc9844f169f729cbe729a130d8eace1d0541fee2152a9448f128552cff3a84769ad59adb56ef68638b2cd40100c5119040f5ef35431df907f1cf81e7d2822d2e9f41da313dea182a3cf36adb7793872d7fd2405e524238128267b52b299c892ac5da17693f1047e74d2cabfbb912ecde923f0e65059b122ec43a5cdaddb56aeca4f9765bb3954f0cabd4bc382e35576e52aa759c12a98e684bdae533e545127c7f88855953c8f69a284e0bb2190fc715c08a4e32cb5f6d64e6d3be9edb449a7a5531c8a9a36f77a8ee34eda28e57ef8fe59ee5e73f6961702c99cd55eefa9c3373e0d73d7b8ca719d394cb9136cd35c49b471b7d72c672d77bb71da6739daf566efbacce4c9effb6e770bea903d72a14dc665dfd7894c9dac36fc914db7131c3de68ee3344dcbce5dd2b37b83c4ddeb6e3df07e3814619bf6ba73b7bb373ecc7157f36c9ac33e7e009196069ab76d17512cdbcff4774578b30dfe7b87b189a216f7681bd2bc61edde64f086417253d228c3dad4186b1c961e47f4deadb2ebd63fd87ff8068edea3f5bebd36959c0fdb1b9fb4f749c3372cb5d76ebbcff2287e05efe11ee06ddf90721ee79d50d268e4f5d6dbd6ed7d1bf5d6bd511c1beb9e7dc320b96d08247b07ad873b7a20f9fb4c77789b280f7cf70f6313e5dd7bf779d47adf4bd2edfb3cba7db4f33c9499eebede28d5b6cdebee9dd2eddaefdeb0946a1dd5a6b6d13e958f2d1f6fc1d0df39cd0b92696d8be93bea7d97dcbd5b9a17cf8536f3f346948eecebedb52e37ca9d62fa10f743fda9fb0e949fbe43e529b7f76e48b377eaf0a7f23d05d7efd486dde3f70bb4debd4b6b101fbc537cea4ecfbdd60e9f72a0fc741a144ca375df431a3dd605c9b5b35564b75b7ac38aed462da5d45afa7978d451da7d1ea51ca59bd5a4773311a5d7d2c7a3ece88f6ed6729f9974fbe928df7142d9918225f8a8a23693bb386b6d7c7d77b96bf6ca0e7ff5745b7fba33fd598cbbaddeb54fedc41dfcc87e23909bd67ea6439b69efccc2bba1c69dba7fb728f7f41a84e68463a3fcbbddcd91627f7a6bd7c65d8dcbc20c64edf494d39c3c1a149c929e6ac319b50182591a24bf344fa8d0dcd5b0de369bfd13b5bd5eee9e69db7ec8b09da82d7236d43b098d28c64a1ae91193747bf60377efd96bd753876f70d8c391defb7743eef16ddf1eaeb7eaf71f3ed4537cb2a7f7bedd933df72db3f806777a79db876da8e5e11ea25bdca3f4ed3393bb9496b651a4a40a8259b6d18df39e7d0343d9768fc361dd6a287ba8de1f39d4358cc966fa0478b8628ab9eef7ae7613b5a139f49885425b88f36e2fc7891eefdd74b14e79f8a10dcd75bbc6dd1ee063ce32108719c8e049f76e77431eb9b321eea6100e79944e4a38fc91edbf874c3814dd8b273547ebb32c3bf8ed8a0ede1ba21fd9e3eed9789b6d34ecb7cbfdb8c16d59e761198e1385c30cd02c7328c3a1cf4c798ae3478e8f41fcb0a4f949f1d988c9d7f7e9d58ae5f0d73729babeebf2baaeeb3c7c5dc44d527a123d985db71dd2932befdde34a7ea661bccbdb6818ee339d92ef6e4da77870d8466c628a4159ca08b4e19015b6626ca27866628c266dd22ba48dd094c5b044aed6afc6a185758e8480340c860384a988cde9db68982cd8503ee1c08ee1207285fd66c523ca707986308f4ecd03e9d4bc69e60cb1c252175fb0615cd2d6112bc051a2042272e844d949a58ff53a64be504bbb8f9462be08315fb29989f326a6200b64976098b526535c92b5deb488fd0822c2480f84423f3a4513c0c5a01f5186cbf4fa44a04e94b1995e2a1165ae402f8970090399864c1fca3164fa5076215329852ca74842a65c963ac814479fa892a9f5b09deb126fd7bc3f36943a2af43b3586c416fafb043b846297f499424829268afee8a09a3cc844a9a53a211d580b63132575e4a9951b1882944c21043948304308da27b70fd044054d54c7051b4aa06eaeaf4929e62402a353856c222ccd3e5186abc2a2204e27664e9461c9fdd93d6530719d3913d55fc9819539081334dcb507d98e8368b72692b9c444293175e6763bae260f620b1aacfcb952d83851f28a896a30581994fb73620924a1882d7d202020a03ec6e44661dbe78a4109a494b25b36edee96e10e748724ace1880db15c84d6311912369446480dc417cb23c8f4024654c7c49656c2368e4e755eb9810d634c0d13638d189638606b20a22e53080af632c1cae7d0215afc0e98e4013be325cfcf2000888619000160dca0ba005a1ee3383cf5500eb18e43df7ed8f8882d3387088a066c3873a65c71df68e623ca649f8fc9e1f34088ac8cb758394bca63343d4610dfc5637f8fb1616450a772b827ed3a3cae64dc93864f3964dce53a72b80e39dc25870bb1e1321e5777795c692ff029870e77b90e1deee2722101b80e38764ac33a5caec375c0425077390521b3f65006659f993208c705c6f8c696f95f20266a3e07193776aa050e51319d9a2c388c91658c1cca1d142a0587bf099770682d883fdce1cc0396c31b96475c1061b55010190efb584e177ca8b0c72bb30a071c7050a954383cae04704f9dbaa7c6a71ca994000420800bb1e1a947ec12464b4b0b0cd461a00ee34202f096c7d50df7249fc3e32ac63d497cca11e332aee386e7808500e0375c0616c2040d007ec385d8f0183711a0c88c1d260a35800be3dae8d4fc0d57755b6e8c8bc3cd38dcb852ddb88a71e3ea861b572d37ae60dcb8ba6ecc03a83153b7621bc6c400f4c53200ae0dd7c5ec7a9eb042cf135638810f0c0cc330152a8cb1d1c34f8c12248001a358ec819d748a9e3040a6101335491e2801b69a31cadcc0fb94353632c6943f0d037e8a5aca020cf96a7b289bc8f31207d200db470fe5111964c5555d49ae069781c4969969c17af77bbd46c05bd7c8106c057ebb427440b5fa3ec4aec003a1848a9f6c3373c5272c6f39c87ca9a71cdbed4fa1930e4ff4791e0d730a611ddbedb7db875227f450e684b045c2d67b8b74f7547fb3e2eea9e209d07057756abec34150d8e3805cc38a09eb71b53d443d5b6df71e9aac0d441932e4c981f842447cc9260b268e9c6123a708220c378fc8b3a661e28a1447b2c995a27bade65db9d3a91bc496f9eb4a2457267165114964a2e63c42c3b29133e4084a105b72e8ca5c8361d95a12a2c2528cc3c6445d2558f9309b1a0c8a80c4bbf6ffdc4a7c7a1082247890a80286945236866158cba6dd2d553ba07aa28ffccf44c5989999989923e4e4d0443125f24420030e7549b17a58d775cd5f3c72c7eb560f375986cfd20b368c3e34354772297354a2842a72d330810d314a4513ba20a2020c83a80917801f20428250980daaa0e9a805d49452411c74c5c1c1c189a886b1d13895cab91a89c086126789d9b4e79c162a478e20c6e80b4b1c598279491c216cf8bf982d67cf77b71665a62414d8a9c4199ee059459410d8b9842a46a0b3924300421474565189108ec0596975a3777ae0034728b2babaf0269f6e5839cc40c630264a7e07497a70566d25923f471ffa5b3fc1d573f55cb5d65a6bad97cfce5cd26dcd25b5a7f6486176b7a58a735e2eb55eb556975a65b89c40c7d2c9eda3840db71c755a4746ebb44ef5913b5902c9242a974deec82676e4ce04ca5d8449c4c2049a4016106850ae3ad3886d64a241330434880659249e39ada83ca8a1cd933ba886a7791ed03ccd9306ec48c67ea8851db17ab6755380381ab3bbad6e7aeb5eef3bdb6a2b05a84522c8735a279d2b03d9c2575b97b6e0a433516dd5478aa38c98b47a685c92650e8fb8e4013c2a0f2be877af29b6cc6b328a177cc0a7872592f8acb4ee001337f05969549ec00849f05969b5e7a70547569ae5042c663064a55d5bcf112772561ab60149c1b3d2b0adde134d0d129940e4089e55454d948cd911988004243b44622044d5348a61d8abc51e0a65c65e6f45f7fb41cb189edb7ca83ececc8a6d990b43f7369bd1639ac5a4155c8dcad19076648a17ddce46928c5d912790b442c6980f61184603bbee0eac0402ca92abd41a4111180cc13ccc091802e8ad6953656b94a996dd588f6d974e1486d5502814ba7693af4b2e4e1476b2b01d65d942a0efeef3406fccd7e79b9614b8ac895dd69453f6b02c7cbaf1d97362cbb22c8c7aa19a2fd3b22ccb0aaf8ba27f81cd2dcfda018cca4a9bd2534a69a5b23695b9be6fadb5ce1ad82badb4d25a2b0cb6a2d9a78956276dd95d67d3ee39273eddb8c2be2c8cfe4d9b36a530daaa1f9bca6682165f8419a5216d02413fe9a7920833833a456fd109058c760eae4b42b752a0dc9f411d6d6d7a051b5e38b92b9389eaba24b6583d9dea3fd7ead3934319106c587d8e4c597daa143f5950cb8699ab89335f84c064bd62a6ba02a9c0ca26dd6448ee954ca9414d727f0275aa59a2b0a16c02947b7234b02c9bcc972c70e68bfcb5a467db208727d8303619126402992ff4dd6f988a598093a392152891c3d81395a8e08a091357f3a1b5d1b9c646c300d17303096c189bf467a6cc01d23038ab6e15489181f851d3ef1f551d42a8923a3c35353535353535353a74e8d0515353535353a343870e1d3a746056a5d9d1a91361d69af00e150cc334b15335db6aad12c73376fb7d1688873db1a7fba14caa4e81a3930eb2a87ce5a39b43e58461262ae4a715dee4ec212b6485db0f1277214da35aadb5fe264b59bf6119f2862ed946c3ad6eb20cccd95e10dd90268baec53967ca34cddb9626839fe91f7b4513a5eb94bf5e1a581819c60c7dc0f0ace63616154a555cb0bc45fccc2469dcb56ea41c05ff403ab7e3bb218cfc7ddff77ddc51fe5d7b7139eb9e4e180573971edf1e46b724fadda2f42b2cd7acedbb28f8a44bce87ef28f8548f727bd23dd57b2761584a4a4acaa9621a1bfe22936e714893519e82439a9c72edc5a9742747a3f4931394d3afd3c9c9bbaee34eb89393128e13757f724d076fc82393aec9cd0613a613755fdcb89ae97b4f9484618c4e718fd12deeb18272c38a7dc0f856e88a0b96d7d3b75061c1a1cc2a57b1d7ac8ab5a00f16ab60dc8df644a09d74eb0257fd66e572c36962fc86cbdf80c3553808ea383c48001ee3372b19f7242fe337ab1c6e8e1bae3acd0d575d5ea5ba0c1c0400573d880dbfe13738a860c4b8a1c58a2013c523771afb25777cb082dc30bfcafb53672a315fb61e1934711ae6f44e61d189325c6619819d79f495539ffebd61b0563daade84ca4c54131657465ae982275dd19da09b8e8e4e5ca5c4d549461d2327df3c651fddf4947bcab08ed14d271d2b4ff9ca532eef094bee58197c7a2ec98e53ee12ecfc699fb9a46156c209c40903e28a470d5e7918814ee4e36af430fed8187de561ecc98d250f228c5e4294913bb12507730711e6e43d97903170d00521c288c087272b57f248cec8c953ae3c5d693252fae476581c9c21fd8e28ebbf574c599749b4f46918d23b943ff2d3a7979033641216b7b85e4c5967b12e77a24c8bd8622d911b473c7ba6ce9da73b713ad54fb9132574d3a87f72a576a513dd133b05fad0c82e87b49cd149e4feaa74e38a74e36a74e30abc713564a56558eec49639244485c5b0c4012277e2e6dd78d343a2c51761c5e9e6e9d69945bc775c983af3257a98c5a2a9105b0a39c345c628437c41437ce9236223117b07b17d109f105f342a2219e48cedfd1e4394e1de2d3a0bd974c58b1332cb3b0849e40c1a19830511a6a65344fa501841471379896cc402b1a53fd7106180c89cb9634413816147c4549f67e6d24397f4eb82b7aee8d45ef2ecec441996fce5fe7c22a50925a223cad01314f9294293d026624b9feea89cbb31b69cde82e5ca23220c7d424c519f4e5135649ac54579764dff9158fcfc5891a3613ab9d65ba649148c541a5deb596777727a826e42a49b944824d98488dc44a0373a6dc22b92441699454091682659913c512672356acfd979a73b0d439774aa0a3983662163ace02574872ed9c9134f21f7357be71222aaffdd898488f291319634cc8c22a65a362137cd625291db9b40b1a53f9f0841c1ca1e9eef4b1a66a3594cda853c0aa91ae47da88fcc51395d79651228a66b335140666a1ee7e7e4fa285d1ca4db0316728604628cd9303444be9025164d64938804223662cb3c7861c8ef456c51cdd4fc8c99491a8bd8d2e76e8f21b6f4b7db6490319e1051fdec3615b1a910532e72464bf1e284dcef20c4543f0ba62b4c468022a67710db07b19188a8be75fb8888eaeb6822d3c8199d8405d146ce6822b7409f202ff1851cce1d34c4598688eab7b8f3e72ec9730d3175c41772bf81763ad56f2372bf89c8fd9d9db91345c5595983145738d13384123d4284a1064e044d9c23e008e28c789f997693b10a9ad812438018bb042b63da0c7194fbbac194410b42ad71b307c7449d64287778b7a7e9fe5dfef3b0e9662531695d550c8aa14924cf1c2c3bc2863268c917ecc4456822163f57f830a9a24891bec4b00c8aab89716856c8162a08c68499420499a4496654c3c8d5270e0cbc3083b4287a767777239948827690c8254c41f2874221c2483004fd04fdfc502c836415f45dfb72466155da54042919423e620a9f385f26206f83e509d8d82c7d105bfa920731c684913b9bcd0f28acf56a447bc368414131413287f1c746187d76421782854e8f248b7c801c95d820284b4e869e5d8876ec4242cf4e7368c7ae23f4ec9403bb761dd835eda1ec210d9be46dc8277cc427b2fc4c1256eed022cb5f3631280605d13c658eb56a1017689d97143a4a7c8ee8d66182c57efdc77cc18c881a4684636a9a0830b84294a1292da74882fc81d40167a36144efc7663981053fba10d149affff9a9a9694084912d883f3a37b042981042bae8f5a7799ad1c1d3902e7ae44e13e718611007618206bce83a48d8060e0262535c31a1cdcc17d90f0390e56d8833a40a628c3e6647a4cbbf8832f4f2a4fec804da9823d8981d6acc6067cd34733eb4c8da8fb78ef4a4adb15d5e9e6e5ce217b1e593f235629638a4f9b352fbd4dedd6f363314ea50167746091595914e8e99b19161a973d56031ac424dd4d502454d1d6f762fc8c15982176ee0830023da6d4c549f6a60c3c86363c665c26857990608f20307a771e41ef33e54f9d2b02f582c54354723b47d08eeb153563643eb4395352c6b59166ca4481c59e28989ead9d34f744ff360938707db393251488e44196ed607f1aa77337faad66bc534df411ce47b909b5588cad67462727227b6f4e3ec79e4889c3187e496526b91687411e95e0983251c4464799774633ad5a3eb7913d38c46d6da8b623ef06a7434127d640a32ba27bf5b9ff634e02df80f07b1074728d14d28d3e88ab0195baae4ce13d4fd79c57ce18932a1dcda73b6b68d63aa8285827c820aa89f9bb9e9c3710f4598c9d3a966429e3b1665b673aaccf950a5f05899b54f80f61139033322cf6f9916ac7422893cbf5db3b6d8309e05bfef8237766f573e617907af63748b858c22f81dbc8eef2016c2040de9e085c44e7d3ac07fffb01012963dab4943ca9f3cb17c42c3fa137d9f083cf7378c45babd90d2c15ba4dbd3906e71e920b60d630fdea29cc803ef8db090efa35b17f54b570eb10dde3b0de85d748969be8fb010fb9177d169bc8b70ec14f8efa11c228b8097c6298777f034de413c318dfd085f744ff3403ad51360405c7d380810f866f5b8b28f40a25be3ddcad8192957ce876885acb5d44f9e7a2ae4fe09a70f0ff3dcb7abcd356459a3bb7c8dce872a6fdbb34b6dd2d0b013b7cb5f903b3b4d828096fcf8c81596f1e4892d54d81096488e4c54b73c92fb579ddb4ce9014e963b71623151f44d66d0bc42c76727f3c1ce8e8f4f94b93f55e820622193cc9c91800a9c30740089945276cba6ddddd285ba58392af14952440335c6ce52e4f0b109108ddd48f639e79c73ce89a53c92e7e90d6dae4c7ffdba82f0ba2f735e71e412ec2573a80ce51902a28930f597e71ab2c441c835e41313d8d02501d488f6992977e6cbd430dd7246392a392f68864fb28fd91158ab4a9e248c01a358b52eed9a9846bb8957d42bb6a0601cb1e13699ac0d7d62d544c584aaec32511d635355a1abc246faaa186ddb3ab3b6b7296742b034dfd0acd6758955666aab1709565e073c2d833e7264a29640f54347e20c2901349b0911466aa18166048a2d68b0611fc97d7aa49768249d2476f7916f8fab1cddb7ebe8be5d88761d9c90ed9926638c38fc68ecec9eb28796cb30131ba23cd61128a04082fe749289a2bd83a491ec20a1d612b1859a7e620b7d88084b7f58320dbd4c2189f4ed2c456ca1a71963622d1c62cd23c40ca080a20a3aa0a2044248a1831c244890f8f4b060618dd0914148924c89058e13990faccca14492f9c0ce1c4a2448649034431259be590645999bfb210f6820f73128260a934155d8cbe201425225164d8276ac8462a2ba39196465108c9e257a7a7a7a321250613be7f280165f348f5944eacc588247a684953953c26648d896417c8999a8b89a1151fdda84c7090b6c189b0c6131c1ac41c87a6b96481aeb03e9543f74b1192d83886aab890ad5c407045fa062b0d288c61796437070e490a6e8a8740d97b4450b158d0000000083140000180c0a874342b170409ce7e2201f14000d8ba64a7e4c18c9a32087510819440c21860000000019001860b48d00628607bdae1afb40ffb997e327352707c5c08a31b0c6489061496de9c085263ce1ee420974353c2c846dddaa2970138d3b18366d0fbc58a44e6f2755c2a99ec67717316a3968f5c2933e9d4a07a9509afff7b4d8c0072a1b06556ee68ca99b16357f77514715f4bfcec3981594865e7c74ef684e03124c027f2215aada7ad1c71c1d48158e77b03cd4fc2c5f47fca94f3a3b503a6f068dc3a14d770f61384a75e19e8350a5c96202734b3c1e23cd2563cc4858b4615c368ac40e99074db6073aff19db91e526668a4a7072c223bd6307be64872dc40879a83d1ef899ce4bfb6b618c07a9be7434516b19268ca6a26f768c7541a9fac9b1395b16992975874c8297f399d93b2bc8546075c5dbb88b3094877b48c6ce5ebea85d175ac86f32b60086657cb4dcd95ba2c0381608813623b9345baa6bd30eb626d18c83cbb42ec939fb0fc90d535306a2a58205c5c511a1a5091ca9ab75e852704458f038fae6d9bf35f610fee3ae4ea846008f79f9c09d96d92200c10fc09486385854f58036b3fb8e650b2e1ed5cad70fd2614b82dbc82c225195a5c037425d75298ec532e34b3dac180fb07c17d37d9907ced04282a239fb43ab9e2727a1fd3026154f51b048ac9ef95c035f76782d4c597402d3a9d849ae540749b0f83a42a8d6d90c57e6d61464600f2a1f95574651e19dcef569e2995595c1efee95463d23adb4e1dc57d1a2de6e3917041a4677841e0d66b28ba49bc5175b51c8543c4b9f85fe166ed878dea8ab12655e8557bcb1afac9ea702558d69e64262721add1b9c861405efbf33ff7f7cd13d4cfeb2c795ac646914ad58a8ccfb8d15c581c7a7d40f073cfec2318cba85327ba13f730c068da5b202a9aaedfd3268591242487227c417d30b10c7591f0ac52c27b329bf3c217d124c148ae91b67433e3bc51c1ed8744d2289ab68817f53249a9e0e9ac40a71fd9266f51df2eee8a13697d6c8a226179a17e5640b9319b345329d930945838988a6d2b1c567ec232cec72f6ac0c7b9341589517e5ae624c635207b53de01dee30683cff6824f9fd8cb44cc91d345bed990a0c8dc0dd2545aece2162ac058f5990a5906c64d92d397ac8303eb0409117a34282b1c09f12035caa5027c31cfcc875681038f0e955ea9954fa93db312722d52529df8292fbf3ffac215e7c5615f635306ccabe11c97c65045162946e63c9057a3898b4e1b6782efa7c93a4ec95be695438ab73b740398d623f8d223a59820819336974526c021c28877a57bd7797f39353d1fff4350d8e1cae2164946f6acf09304d23b83869f0d0486503b7be90e812aecb82af5ca668363cd0a569900275cfce2ab009d49336b63c6a101e24932b70b82e239e16bfb2795cf7261e54dc7b53e49cced8d0e171a252640fcef3768e04be57755ddf9627e0143dcf5d536e1254271380209a0b18a602e8cf3f9c4d1efe12272acd42c954ed60825dca15a191e53d4a3a7385ba96ff26766a173d0794cc660df0fe26156fc029fab5ccb1262bedae6bde670e071cc74896c7f38fac9d5682547ace9172d764fed0504e834d9629ca27d0201d5c920e42c882c6485eba7d9224c6940e44220959dabb4a007a6eafea42f4b7b83cbf27bfc8705919388248198133531ffadcdcbcd56f9abc1822647196122029a7be49bc44c70f27d12df41546118e97af53939bf11e1cebe8340b1782d65e3b5875633abf152357bd10787073e6740d6ec3974ff5b4e4dc5fbab4a08ad7b963ee6b44f8f9e2fab6e2a120ac1ee66b8079d50d8bbeecea329d7f8f4cb4abcc816d77d9a3a407f0c786f636303394212d41cb90aab2a242cbebac4f6fb8b68f862c64f8995485fb4d4c566c09c6c928cbf6f4f4f775522e4f0671122003f418dfadeb5849d0ce0d775d16b852b500ceea511325f59d408aac02c3eaa75fdcd034ee001821539ffc9d73c79918ed6f981176616bd19494521bdc5834977e4466b16a8493e390eb3dfc251ff5ba78d2f1fed70467b114f50dfeb7969c8561238d03f4af733406d58a33b385cdba9062060e76790c65d4e4a652e92536c0249c3bbdf6cf9bcfbeb8a2317257cf0f0bf72bf651548189d29d586198623adbdb8329db4b4102da44fc92c9101fa8d40734f338817a3873031052d18e4e31cc6ed614822e4ee1fd7330e85259e1f6bbc3a49d534e4ab8b95882641385884e24e4cbf0f57a1551935c6c313910e4d24d957e54cd17522035c54238519f022732cf265b1fdbba166561e8f75912cc26d2389e762fc476b5eba6aaefb2cc6d87fb7742ab16807a8024882462a0b81f5f003e853a8af3760165530ca366954ac30601bb138321b6091c7ab1771b82736818a41113157ac72e446cdc877a21884d9e049dcf0a1c8ec227d75518a4baf78bfe9c60c8a51da32312b2bd00247b101c3a0c83b8677373f1b5cb4c527dce9df333139d690971ba4d263c570d21d7e14e22f70ad95a12d3710215d0c4ee0bcd3f475c2aa0550934d93feafd5052ab294d3885f34e0a33c1aff9f8442fcde8b8288da1144f2dc59cbd148f0ec47199e49684cc99fbf0f9d34cb47e86d0b42124188a2a9608fc1412ea4dfdcaad5a170a62428036542499f762a7368ea7b4ef9929636000e27ab13cde83b4c686b35f60d700d9b92b8c81684a068730b64dc00007587f7651d9316341b6707be0d78ca87c031bc46f60ff0a6a3feb8fb1b15d0a8b3024a0c20cfa818ffd458f5f386dd84e71df6b8561f86bfa9162384394a0fa5191dad7fa402ceb7eaee813d7e708a166012100651a13c761f4fa95355414d5b00e99116730ed2ec688d398b195c8691212905c3604e4b3fc171aa9098f86281bb1f2fcc8b79bbeb33a876a292bd1615ffe92f6875e6bd4e92e30350bdb859a6a6c30ed5ba14932b74540e29e3393735ca1805634b22e24f749396948c614e402f7221eb8341db72904d642b8e90f9d81b4c19e7dc8c6b9044f37755eaf65836cb796b7d5b2f7a57e79e95bbf458694503e43010ecb7e15194e2e5e8abc69d410e9bdeb47da050e3cfebed7bb28d6a0eda9dab852211e3f1c8aa61d4a6b87ecc2c0cc3d96200e086cb06a057355030262593a3aa3aaf06dcc05c091e4115da068d87211e456e48e8670f61537cffda54792aaa078bdb8a58f804948875811c155f0c5c6bf021162b14b78f017ac709d942374e81675084201990bc04711fa700eae9bb4139622beb02511e0368077aeed34718113eebaf255c0cd9e84897a0216f8f0d80439c42ce08b641eb4609550c1a8dc839c583a72b46c259c364135cbf95519ba2e6c07bb1126cdebd02c29e35c413bc09f3d2ab7192bd49dd8322d8c41e4246273c63db828c8c4a871590115d0c47233742654423fc0565dd3f745f59ad2800020eba82f74049a69fbd2ae31f4719b8744594a360c7053e621819262fee971119ecaee6417c5a2e40c984f8ba0511ce55283841a48ffdadde6034f69a0481da5356d607128adf1239e86c8060ae2ff24a230a3cf6869e0c7a1dacf47a5d7b523542d17349c9f5512b4ed8d9273d23684e6c953651c35a4aec9ad9d232fb29ec33f26213e242950131f49b21870cf5d13e943f498db245856e3e20631ef9e438027d07f35b8f216871591b2498410ff4cc5c2a49fd6cf44928ecd20a970d1716e4e060066dbe4465c5475512cac110eaa9ccaee36bcce727f7571b18b702ffcbf630e2d839008d363dbbb8c04113077513cfb21d616b9e8a57975615e217b90194a05f6e20959125dcc43562ac889ef8f15d87f61d35acbce8484a008f1b3addbec08bafcf7c5252c390ea0102a4d8ad9286f1c33b23890c77628a1f1ede59e88e41df705e8c7800435e2a33026f0c481eb8fe318112365407d4361c47c2fbc6afc9ff2a0eab5312528a3a090eb894341c9e9a56c496620f617703bd1dcd92d05b2eafc65caabc42ce362a121fd3c8fbe59c3263abf8dd979c0a25ae772e1bfb55a153566093f4dede7ecceeb347b07d90ffa5c990a1226ef0398666faea318efe3bed2be149e85db476684276718c4247e04f7970af61adecefbf5d971c639af891e5e079eb98e8e3eb27a8d1f540e37fb815a27205661236db8425d2c749e1a7fb1edad2cd9a9ce07ef05633e0be4c8018196f2f738e1f1db99e8a3f21655858e9309016c50007f9f38593bb32b81286d4ee4771a64bbc1b59e259b467a845383acd5d51a285d68e63e56ad0c58c1819459aca1af798c53cf05bf7bbea429fb01759ecf44521394c9f69b1c1edab754c8f752eb80942976c1f2ab15ba9f956d347d036d9fe6b1674dadfdf48c127bb2807d227612c209d8c370eb07c5297abfb93d671c7969004f132f4c01a378483b45fbe74bc9dede740bbc3a04be43c19e2f6baa03f662661e28360803f26592a234abb6c8852f19dbb10db288c75f89ced5494a66da9eb9e44d4bfde85244d64702f1182a9b867d22b0cd8690b37ecc1ea0532650ffcc3a03556e49cb0ebd03d5851b10fa199244231dff624088c4a9f6d8f622b14646a672e4c6fba9ea28bb27e6734922b49398f15d37ec9b6ef7f94916abb4df63e5c802d0ef67289a5d157aab46832c5f281bebba26b1228b94baf9bf8f8240c3088c86c6f089da104c7106f78a3d13aa6918e5811cc74508c82ee0b472d6e55421d64ac22350535c4465ee37cb3d1d062ad3bd5e960ccfd89905b62684f9f063c239536c8f370964f866e7715ad2dde7f03729dfb203a4849d3320dfe406bada3363f2fe0e9de3d9a1928d06932471682d598db0abd0e28bff96ffa41b966c8b162e335c1ffafe241bedbdcaceee3f695c9bfe9381f35cac15b0c38a578a0da2760fbf93f4eabd2d1ed969caa04709f57dc274de1b35120e30cc68825660a31e2a5134f749b2c25fa4273d21a51c7a8aec8987a9780c1a4c69440a37745bf360220bd646fd06a710c3f9be977b793ed9a10a89372cfcbca3175001505b4f2dfdb4dd6c00fdfc623299202b95e1492935e4eef5241c75919cbe1d62ef7d49dcd22beda0da22c26db1a98c3250207254f40e2ca469788abe28e60541c6219357e7cb6058521b352756f68d28c883f70310fd94e01178ca2925848cc952f7b55fe3f5b2e00592b4a3e900032d46d1bbd40262c05a78ba3619e26aed24bc4b681ff97e0515e909e26fbb8270a4c9d97829df39d22f1036834d31a7b06a9a398f6018cca5a04df981a30ebc332ee016527a101bf9f537ac8ef50cb5bdf83d409fb1a96d72608da24b9993687560c33879029266a53b397bd6621856e510280ae19da8dffb1da775a51857979aee9c1b2812f7287873e8fe6b8fb3f95dbb15d233a1f3ed0a818ff671c3a395ffd9f954674800c3af45f2d94b8443dcc1f3104766083b71082aeef22f40e8abab5208af1f79ebcc19fb841b0f3c0ebe5ca636a3edf111e79404ff15cdb62c9cfc5a3d39d76d5f8297a13fc11d8da2e40ddacdb6f4ec0b52bcf098d0b544405b1b243131c23c0d48e9fc7e7c5febaa2a2875a8e5c421045d6dadf5b904944468f5a0fa93a71b5c41dad3fe19fda92723bb4dbd86e4f7f3429e66fb326470daa4d047c3eb23c1abdeb3bf91a16b67e0fe3ec023f76fc99c329c2ba05d75812b313250beb0c05a049c04dd74f9222db0bc29c14a2fddf76a60012114f913498285289cf7f96149c1e66bf8ec66201a80ba7b479d478ac6fe18aeaeb96a692bf36547c78ba32e97f59eb52fdcdc7f1cbfcd9677cb896fac05b718cdd3492336468dac9da2705b63d08ebb5cc8a9e52983358621c5c3ab6701d80e7480fb10966b6a3624d1a1bf94f7862477df7abf62af5965f984398216d8f4930e3c6160c0b9c9bbb771c5306be56a5a10b07973207dbb42afdca03c045241077a37151104085067f980f54cc70544b16187d45231a718018fc8131182f3c429908e426e7b8ead2439d1d4761b4d516dc89a71b6cee25ca89b3083944b19268bb4b51a2c3d49c020d9b1d1592297553a38cca8644e2231983fc526bd7f9a15cb36888f5f08a6a8e21df4c959b1f6b6784d8dbf7479821c47c27917dd804b79cfc96986ec1df61b8bd04d7637ab6b39469a773acce47ac4d34f072c54466c978692a1e3c85a7975f90fbba33cc38b257638f1069cca3b47ca15406fba6af7e8ed127de7f3074331f232fdb18f12a86e29e7f86ed692c710c6ff74e07ee390268572264eb0df42e504801827821136c2c20b0cd670e9e92b5fb730ecf6c6abe183253916875f1c37c40f035befa1050afda8adb3fc28458aa113810f2922229e229f08c299d4a8a8ce0ce1866d1a0dcfe7bb27f21acf24c43033d295ea8fa097b94c83f3816eb19045e6b1b39ea906d251993d53d55480db661563b1ec6b0cb36d03e55a016cdb89292da34e08e179e2eb28818d95ef5b881cd035c3dc559934b9d8bafe4bde69b865cbd9be2ad4ca7fb234274d95a2b7325618d106e54d8b4ee736132f0e0854727c15be2794b37c0414a54d89e60cda5c7189f213a28025646c555f2640759771a6526538db1c2a41c3f95e6e231ec59e6e0c64a3f9d590bd703af29e7546f8c8a4d680e8bc4a756e0557bd719aa0a885a4583d9b1653f6e01fc9e65b225c12333a3709809e431f8327cca9efb862253c64ca2683773eb78eaacfc1c07bbf07cb0b987f0bd82f2ae3ed7ccd3493b4151d7748fb640b8998478008edc8ea9c746ffa54703f235349a9f040e6866b1989113d064d0bafea15a88625ea7d09c923a8940b74944c73bbbdc9ca18a3ce4ca53102436e24a8bdbcbf7e2b9ebe3a9db201bacfee7a7fc532af8e73a1d7f5917f63b52bf9c36cb5da2c5f4c8d90218b390ad98579f7f661c2afc818015eefd707c9386629e8f4147ceef50e4a4a9de77a574980947bd891146c0f88fb6636c1025c3491ad48395fc1104b4f819124354c26347a5b03230cf0c0eaf54269bfbfbc7cf3ec23480a6a9909c1727db3c0392993c332c9efef8565624840dfcdfef80681c5d803009cd2abc50e0d33a5c120ef1b93ae73756945ecc203967f25598a90c845c2049f5fb8da3bb952187946c820faaa7bdd84f24bcf7d6b3cb630d2302aaf334651025875b762363f3f0d896c0fa43bca885c1725411b32619c47927d7cbecd6e16e4bc216bb0c6e8fd85fcbd9786abfa4fad9f0803ec11dada9a971a319c17e5f4266ac96251ee9a30beb28ce8d6cdfbf7c25596a48ed12112499580306b3425989eb52ac3439b96916467af337b6d6831de854af6e81884c80e187b9975ae6ad9cb9779fb310ffe17c9b2efdca7a835cc3532883e36c444b9909910108a65e033abbb7b050431f5ce27049108b97f4a3d8b5efe5e2fdaaf340429b8e4c548468f1bb312b12832c1b8dae39db1a438b51bb4ef492594664aee7e694c278b8a7b77de51fabd9fd938265dd22289ad49c5d340939f9e950a7e0d14473c7448eb6bc8ad2131223cdce37689592259ed4e6dd0e32e8a6344f88928ff66a1f5136c9c4b980693be0de0af7fa5cb0919523d55078a17eb8efe8f6b5b1965d35f5ef237eb8e46e2336cd437c57c892393259f241705b7bee0dca7b7a80cd073ae8aaea5d8a6dc89dde5109be94a2ed11b35b4d8cda6f8d61c055492e92517aaaec534ed527c0fefb482c8a2288de0330d6ea5094ad2838aede9c554859fa0c22623d18fd120166e49ecf970e63a1357ef70a7c830a8ca64cba4009d94639b29e6c95e3925f522bcac6b91b4d5ca75ed383f4dfb5063cb3bef9ca551454c044d29f618100a7ec1a78ab22582ee6472829230fbfde79cd54fbe284d893b5e5e2742b60f43b91528f91a1da137d64a4a9585be30b30e8f77eb1be799d8097a8990c6ec04c9d6f7f1f99e8678cc4f21a26f519aa3c3a16091fb9470f882a95957ef828c85c6415925cdb80b4b08b706e25dfacac1748d2cf3d77f96db445be5aacfd4ca5e755606e2601f042c45787794452f91d7a91bb4f4c5e42861d542b75ec6a10017436a247dcaaffaf751cc0389bbe19a40991c3c33ae166f0617d0ee1a013c49d5c4159f1f068f1456acbf894413f8330b027bc5845d93c84a5666e2943cd39b0f4dca5e87e38cbc53aa5e904d6ef70bb21f0b6b2b3244161b990d808a66826d04eb60f50da8d071d7f47e4a5c3fd2d9f7b4e1e0d8c0bf8a96dd7bf4b0d6c10ec1fd0aa18f524d97939b2749e4be3edd4a603afbd8be4312467102d1c5ef0f2107d514bfe681f5d5b64702bf0d4aa00643d1e13b30512ab8e61400949639ce12063e6dd402666e3ec437a24aae3e864835d4fc6fb38542625f60d5ab26bda6d1806e4b70f85b872819906c3a43f5a23c084962958adfdc1eb9a84ac70d4ad690306ac0c33ca56a76d1bad5bae88feec72256ce13578550e1a6b895ad964073ea0c2d571aced296e48c92e1fb358af3f810656a0da77c47a681eabe1c36069b4c7b0299b0faef33ff828eb1761f7f75e2a9cfe921d882ee73d262050d383335e924e0588ec6265f1b380b7b3957ef0c9ba0af2a51729a0d16484c9263d7c2a8e960707416ace6a1f31450c8263c3531beb2ceade9f05737180cc2723685368ae1302cd054111ad9e82bfb0ac0054c1946e81c720c8f83345d749d29562debdc520d595dff094aecaa3b71307017e3665c50f5044747a4116feeb6af777ac391d60735d04739d6b6ffe42fe970f01aedf0d308d965cd4bcae1083d6b1fe7428e8fe6e6003702571e299da69044f30f6547cc7565be556c517e9680ad87fbd339b48bdd93afa66873ca2f0e3355801d64d7659a050b7704fe37acbb43a237bafa8f573facad95cd93aeb74e850ef383f866db75ea8672014e23d2a1f217e984d2e8c1ccf85dfcd9837ad3143d3931867fd56d91f118d5888c04267a79cc408890d8739bafd490bc3021d5738497ebb59952fb28d18627692b51125a36858dd7f121ba7b8e2533fc70e9959c0188057b24c853c5597cbc484fcc741d16d30d35a69abf55471ec44cef6a7c28e04134105488fa66a503d20253310828d89aedd00137d1c24a6b311603104696dfce1ab0d69729d676acc8613b8c2e718e601debcec66092ee4727784e94355b6701d42de6e0605d90a983c6635a74dd9027bc5f57b969863efc1f6328fbbb1c8f2f1237382bdf13c01b1a68729fddb928b73a23e579b9d60d9f6f6a13348218f7bd20819e9a9293ff7c2489e4a69f98f77b12eea61bb57df466960334794f41589fc96261f28e7cb3c807808f18adf09c4fd3e6dde7500590712400b0d3cdf905a24b1c5bcf9a63134aeb1827d71debd7cc6dab84187c7e3c379847de41a796567144b00893d94b39df68efb733746b0f8028fa83640f158ed8b40bda609cb7f53436cd55f9499a6daf7662cdcad645e721b0813e3f4bdcb57fbeee427ae10ad2e9ac1e852588cc261603e8b984f5e4e94f3e97f9d8b4f6bb44d2b0ff7e9f93468a8612a24f0da13b94874f1a0096eb23763961a99116ce80cd3cd1ffcefc8ca8b33100cdca2f4b0091a4c05800a4a60914debae28d5707451154a325447d4cdfd6eebb9488225ec69cdc962f93b7e1f952ef5c6ae8f8326df8e362d6c1ea2efffd7579681734c23b637824883943b588a757eef5de1181081c07495c7c3ac01092c0baf4d648a54adf7ae347ff9c6359c213b49a81a795f64a14400b5a8fbdca5333b80122195d96709f8c9e3042c2063c8587e3ce9fcd1c3ad0527144b2d99c95cb1966b8c2648c9c11c1a30ad7c5bc46dd168aca9d4527466b2862991613f10fc96b8b225b8bf5a0c941e0a7a47ac3b19fa0f02b888ae93c6afb0729b52c1a3bb038a8daa25b73695d8ca4a960331a65267c0c13ccfa0f234134ae8696bc7846e37c744859718411a7658fecebf6c371d1ba114dc6d7e19e92e2bc772bbcf076fefa78ed5bf916c7431490e0c49801d2eeacf3d8e9f6bbbd2673c7836c4db574eaa25fa0626b82085ebeb8721e98dada40716b49bc47c77ceb46a40c6ed8e575e75c3f96c3fc186e328050d687e57fea9586bdefb1f29b32fba775fd5f7b2bff3f5f109d243b5f45516ea67de051c45719003d14b7940c4f5ae016faeaa00e7d9cf900309370f48f76973a6d41817cee190c4377c18e37639673936e865ca289b498a64f1457e8ad064151e87ddbea0268786fb15624ff1b5027fcedb9a1c7919856653a2fcd76f5286965c6b5c284691e94edbc98fd19cb81d92b1f11f9202464084cd3a645814e0d0568396e02ca72e64709c0fe891678b2a280d78ec435b5e65cf80faf27b67b31ac960098bc9f1539f5ddd76829adc8c84f529230d97a601ff8831dadf23a927826b169b4fa450678ae6876a81b05168381c21ead4a65a8475b657e12fed4eb040ce8e4358621e61cbfd79762478f948c4c98d90867d244b10dd3dd917c844f111f683a39922a2ed0c5665b1f40c17c21c4f5e34d4ec1202892fd68cdc390336fc7635f067121eeff5894d696bb22615b9ba04b08aaae208e70056b5cfb3c7f037176951f0b42719a1871ae12635ec3faa2740cdf1022a6c7597d0d09f243a19b2320c4e4d94d6e1bde4af0e310ec4796b178af415b80ba4780f045db65a3b8484f65556d88be28624466a675d6ed55844afc335a9b6a35c14d5218257b5bdb2bb28f481e5055307a4792da78ebfa5e5bb1b8aa77c55aeb27c515ce57739dd690ed3b77348150467808aeb64dc2252d8a8cd83222b599a173363ae9f40c1a48ec84e93c0009f2acad20fbf9295d03cc597e28ccb27022f861b8e0d895b28d597ead89ad120a269cfcf71567f984c1e29071bd6e4a46f00bf793a16770f899f2c5080287495df92945972b825897c96237b2d42beffe64621e9068ea3d83d6b75930d57d40ea0fc88dd22e5d0571ad8c181ebc05d0ffd8c7aaea29eadd323c57b405ca2c5045ff53aa3b12870b42ad5af5c69376ed4c128213ae66dbd9ec3d4444fad85a7075513bd444e0f8a7250dc0a3741f2b4af687ca3251e9acea3a5687e4748f00a06e4e490e088e40ce20b732a3e7ebeafec9a6711db1fcec9333660171aab313aabd25696dbdc6443e820a5f1ae43a3a9f411b321e0ce47ed072aed688ba36cc6052fc231427974a93e83d91d25ae8d9322abfbec95a875df97fcf56bc679ac7f062584d3f244d6e28bfaaecdd78c8674e88b55c2c97730906c3ed27d1cb97a1566b9f0f00ebdaec9019df914719de311e1a98010012b04db445539417487928dda744d5a72daa1986921f625d0282e94fb8e671d8bcb76380a8d475df23d3d60e7bc83e2361d860be83427592e15864c454eafee81397d5a601ec49a5fb5e79ba18722bdfd556f7978c0afc7bd15d0b01b2c0bea72af2383dafdb9f2729b2d976b71f28e8ba86b8c6e0bac7febf26b6e2550aa2810f2efb39781981ce990dcae355caef5f80f62824cf324f901c8011b404c708997a1ae19864e3f11e050959ec6b15aca471b17fd62a46ea7625f4e1b01cbe02b3a511a185960a715306f3b6658e3fb2fec74a1da54ae2a8132977bcf40759617e3094457ad059f36a2446e1f4745ca015cec3ad6f1af4c7c899d258af398b07c484b9040e249e0ec07d0b7cc1a4a405824a1e440cec3814da7af763aa0c42854161e3979b5d74de5a4449886ff8c36e22859072351901993ca87422fe7ffe4193164b185346dd82b89a2f7ccf60237c3bc52241cf475fa2c073fd639869f07a89406f75bf97f1d6a2726f1f6e065e382f700c4b13977b02e26542bf9608668310175ed9f69ef3004ab41a3994319a9fceb397b3eded87c3942df923a102e913e92d9ade92d6e39c7a95b3de92eb6192d5d3e2a9e81df30a9b807a51a4ee4e89afef2438bd146341b5b0c21b863b821b0a6ef4c36d104ea08f9d294e93059400bc9e9fa5387ec31f9f1b81a21e331fa0b96054e9c554f867dc40223af5cba662018930334467196fa3ff599e0dab1522c9beacf43387b0cc8b34f033627e81439d3f8fa5ee3729c3f57ff6e937d0952150ef75c728b3e6d67bd9843482cf48f9aa1d004c24977b56aa024f7518ec7d283e83ba8f7e511f9c0f50baf1368d791f805f52e6b8822f98d9bf91bee8832ec104233cc007700b6cd8d8852a9efcc9ff5bc8fef8d4041207a7795af176472fb0da6aa9a85f8502b70b41c2fb70ea286a1424e1c84537da386753c3c2a96666c521defd8be2082768e90f1109e677c4c836819cc88d2ae85cf5431a0872ecba05c421d0c3ab473c0e2c0f7c63a9fc55839a70b0b93e8e51c25432ef1032f8eac30e43e3aeb7df872e8a87feb378637f7104746ba3b77e1a6b3304ce5aa88ba42d8532bf064a911589b8eb8436b988a4bcf4174a2066e714d105a6cc8ece993df3a6d91551d858603c853e88fe1ad59cb64540e0ff0cf53da6258c87e5862b8d8edd13fc1e4713fd16f2aba3bbd356af62574d3c0139fc55559a6066d908551a34bbc576e5cb688cbff6acd00cf49cbe1adb5c4397335d40b0071e247c903eacc0e4a68ca3afb62e4c4a650d775fd5e4a4dab5ee27883ddaab2a1c0b5dd7d1998270e37ffed63f220eb1c6d9915a78c5cd2b3954c3bf0bfae030874e8fa17b5bb59c141046e4c724c2e20daef4c82e1306484923990bf7185a4bb8c2ec5595accc2e99605b865ba8dd15e0891b57da8264a71ab3fc267e1a32d2054d1817993d6b596656c65eb635a8cd0c2bd255b381dd6ca1d73753f20b59178cd1bda4d6a612fa15fa6f62419f5ca5947a5f666d32d790e8d60cd064373654ad147a47f401cc37d800311dbbd2ae7dcfddd1f2f8d95de384d6efdefc55e3dfff87a111195be01a1b59166d8016ac40695e8b50e30e34f1ab02338901ae5f101f011bea97f90386dffbef87a6de33b64b6a6db42cdb134d1505cea1aba117bff7927b6d32c4d5720c8182f699c1d3cd073a68e6ceeac122c96d1eff180ece1303b0ed8c254501da78a1c2f1abebf8e9124fe81bfb08c84469c200b715eef0d7ffc7871ef4ead83eaeb961d9602769c104f6d37284f4a7a5a9cf13596bb34fde37151e8df0f21970a3be913f52fcf9fffed0943e4fc59275d2291a87cbf3e71738b359d5b7230754b68a4ce85709ebcdc98f4e6f52e66a02f01daaf1d512a416a375982d138696206c89f31568c8fad663078d804bd53f657de6c7287effff7de84aa063fbb8e646cb808da45d12384e6b84d0adef87febcf70c9891195d08d4e6bf58d1a21ae983a01ff8a0c4b1a59970aa892722f4976139dd51304fd15b291e05178d4a63ac3655845f23bcce9e1ed9eec8026ec74da1fc3cc12fdf59df342160e1829fe90286226758fdf284e4d6e286b1201e2161c1a7534bfee7885062c1960d390de077d0ac3d5895d8b43af33c4287b34e5fa7841ba73722972d566db4d9fd28276ae28c3bef3236fcb4c6c7466057fcbb73ab9b2ff250df546101e259bef6b91b9bf6fe354b45660c5b05c36bf9e78c7a9c7269cd1ffc7648b285d729240b1c183bfe36c9dd348def7b44bceaff1f1b43ba1e94878722fd1744e24097a2bd67a760ecb8f31b1d506085028f63562b716581ccce300ed36f9b87d78498bce9cc63ad17c58cc6da32bda4a63132ea3cec0de5534c770c4facdccfb73f97245a2700929129aa3e774656b18ce47f44f5ab4a89ca086265493e1f45abdce1cb727cbdfe9dcf90da5484788a7b330c3d97d01c7bb8d4e051b6a87159079599b4f04b15e7f08ca4bc7cb2128d018c2ef5ddf4517ae5f35f05bfee049eff138a9bb8a717997c62ceb77d91cb9b1f517c0a5aee084af9f7e22b586e210597d33a5d392217f97e95cbf30337dba09ff5555631668a87ece94740ed49f475b82647209a400fba51baa9e12efa475ad5a456359be11f2f9e7180a61dc9943d5ca236b5f9b4cbf7fae8be445cb1d189c310ae8275e6b24696d1ba5a9b2c12ea22bb10d80438bc79af361c4066492b3d4ee12ae3b1d03dad55f78803a395e30573ccaa678c54cc6aa92cceb5d90d5a90d4063f7794f3d111c8a413178bbe4bdec5937e668268f2b3dc8fd5065313795b6a25167e3aec9de7c9bd1d1b10b817bc2c34c375fc71f479d3051bf6b562e013f9b0f99c2f67a2278e4cb75a7d2be0c2075fc8b5f33857a54ff423922f4acd89f8ce79e3ba4fdceed7719ab91fc361b647b79dd671175dac08b2e50f0968619bac5659c591e35c8f6d3e9a935b8ab8d5d82e0f57bdf9fef91b9fd6c0ed88a20571c619c9e5eaeb955db03e94eb2b1a435876d38f8f767c4d0366ffe8963e8154ab042fc94f4001a5397150b12e169d154930ca42980c41945b31025369fc40b839c275517cf4268e84104cbb83a5e85478d22181537209e56d0d37fe4af4d162ae371aaf6f63991f8233d77dd2a9d2d66c9391cf7f2af6f972b82237780303ff0acd31be0bd5eb1f37711868d430f000d4a338330d917ddbc8f059abdb0581005e13fb645f1af29088ddb3457d2259898c1fc54c83b94bf2faeec7ccb34f40df3511c88549703c0b361a7b0c3261dadd19f960e093f01abc235983152a9e14ca00e06d9cd19220170d90b8fad7e87b68a6b64611dce2ecf05d54ad871dd4684cb57330e5c0a8b0350e1610fbc593125a338fe97949ab427fb3ae97f33d08e12e4d3b74302481691c06fdd3ef1ea631b3cd7ad9ea1dc2689081e4f609959359d9c5c4ce268ec23f967cb2ef53af6f9d04029f05f7fda2d4a22646cc26cdafe5c0892012fa0a6753407fd671c1a59d73890f6481300c04121e5ab354448bb34d9870c1dc3d69c75abe124010becf4b456b444d0921ce64463ab12e933c971a930ccfa1678c86b9f7ed2eec857214f463b43989008a5c165b0c24cdfeb7e1860990b7135fb8319a7ccfd9a1104ff3ad6b5d1aa3ad51a734781d1e33dfa5cdd0bdbee9b26999a3f776fac94cd39ae19914e0aaa0744eb422e9b98d84ad5fc7b47da148c88926c916331a1d51c616352cd4111ba3f3d77949347b844432210af0d53efeb1ffa78d30b3820a08ec9913c171207c56a86a4e3ff364a4e8774fcb1c30c85fcab65f4ee540469e1e85b4f03a167940cb6099cbcd566e6197dd6f7110bf087ba164479c5fc203fd6c4661836b4dec8808a7597d8ccd43dc086d3c0fc87885546b21b1c58df4b1409267f82b4c196d93924b4bc5885fcd17d97b2b751791fe64fa21c1044c9b905737769917efcaf510a2b257a2ed5d197f536a009bebfd82c5a3c754fa5f365daf2a075875d92c9df63dad3f2c8dd977803a46c7363eb45dffeeedd59bd2fab8dea7a949aec59f3fcdb58610d1ea35957e249b3ffcf39491e4cf50b9fcb75815cfa3a6d7b6eebfc61e8b226b054f1347bff07d3c681fda6709ebb1f54b5a2eaa087c7a48ae7bacdd8a6012b8e866ad8e25b5d271d11a369462582a686938b79162ca33b8581242c40f8e623d274b6b030808daddf556787808c28148457a3f4195d5bdd4c60d8ab9d2add4fb49c1d5ee8630813ddd8d4ccac2bcb5d479db2f8d0756acac1e4b84db705d3fc54d0f78c16d343ea84d8e4f6dbfe64bd6ef6982dc2814e19dea1e8b442784e86bccf37118343ae302e95a26005381d43b4846e5873e1c815c18f456270f1c5ea4fb9601d01bffe4718745561397f3e132f14df213d42bae99ed8b13c4bea4fdbe026ab82c345d19429aaae2c00f78dafa8a9799486c4faf4f487c91b1f4f0de324b9f580989d0631f4f74cf6d63f9dd727a94a94db30029a06770f11be353ff5e71d3635d47592fdfb1bed6d1cb940eebca73c01c0ae17d7b9b803c7f9ed8b1e333aa6deb53a72b804843a31d10fb74375d378843ede6186da44ee83be5e8de78db31e58a1180f0f7957d4e21e9c7e5ef046f6e2bb291205ca674ea22915aa36ce9faf73a856b63e010be1d8e9f5924f6668d2f144c3f3f35614dc808101c0793877b3f53a7f8b96c29d2c7281f45450c27a3b6f62ff30bc51d3667f1aaccd18179dabeff0746117c47247a905a4b564c4bd5d1e5cfd2b9667fe657498026ac77dfc22df02398351d82f4982f7741a6fc9fc790bd3116b210c020d7941f7404a4733e950453dd04a8e9bbe48f3c2eb3ed7def4be2f172fc69eb551431ab0e9b530c4eefa7b5d5e42f7f26c7973f3eee7dd5c65becfe7387d9b2ee3f6fa907d19c2df3ec01401debfecb1d266eec8283ab30401d17d462a667df3e920ffe9af30e2259ed8967a65921988c96850e4786da3f083449086d50c02b9593441bb72ba7c1b66455dfeecaa1c79f021e3ec84c1b580d928a2e3901fcc05c2f43eca28fbc12c3c8a33a0ab94ea3e53f52e270c024494b9010c2fc945c5e11b3641c7112420be99459fdc2cc9fdb7336bd5e13882d6c2954819a04a05861710c4eef55992a978acbef0e040a0408c836dbdbe4061a366c36fc6068e8bfd9c7ec889af00e72a81109b0482ccf257b660ee7b5d20f85fa8abc3333ad29e1a70f8d2221f6989fed0a4951e3d663374e388ce0dff6fe171507e53cf8a8fd3c85db761ed251fb599d7d7515a657a0e2400f20497fe7f51fbd8ff9b1b8c67c145738ca58c57b2cf38506a243370a3c71fa9d5637a337855a8b78cf610613c94c419447526ffe84d9226c102d2f29daba57a780f1831d10264baac003bf984b3f47f18e37c37cd455781d7b3a6de687af9dcf18ba8086f1228f9c49dd73818793ff97715ba3dc67693fde399a8c6f0ba498ba420cf2420135214cfdd89011f710fdd80af0f288f4061b62dd24175967fc9045203f01e7ef298092ee97d64b8db07fbc335acde38ea0e201f83185a3efa0d87aece6dc907365070ee5dc5e0e7c5034e9fea5a804ef7eece687d6f088e7adee2275b2b888bcf0d510b3ca98d550fcfb7811306d8c9bacdbe6109c66355965bcf819a678996009a8e8a10b41176a1e368bbef54ff0a128b2e8c2d4a52b31243704101d71beac519ac3f10aead0e9ec6a5e4550fad8c54151f35e5e4b5bba53fcb20abc57c413a2607db266d6b5be8511dd1ee54bf7c83313acfa2c606305f0c701fafd50b58188ffbe11c71f50875c5e9201f520aa7f0b6a9dada402fbf6dc3548b15317fed91cbea69c8fa3a1f426e206c5bbb3f7506002824bbc2b834f28bbbc6689fedb14d6e14ecafa532d10b8f328a1cecb28402affe93b5664f5302a76bd085d124d656b6ccab8b85d1ba21c287d68a1284777de096be4ca8f89e98e4ed65404f5293f966d179300708f97c7c2ab961d5e1202afb389445add2318ae66b554b8d91332a782e4e49e6a473fb79e8466b34e16d8f3e4864a31e53b98840a65cb50c01c8030c7952966618d8a530cfbeb29764056f2c168efc00774512338169e582347617ba91bebdf60ac71b8371066e1b3f5573d3c5df5641f25b57fcd4b572f8a5a9c9b5fcc57ba58778653173d5fdf71aa87e8a8e7e8a4baa0002246c176efbc41d425ba12db094b8e64c706865931268c3330fad6effc93ae9e662d2b99ce5b51c1fa265005f25f15346528ba902fd30a0e3066b24608d677a850a14373b904e1c38412ac7fe332266b245e166301a26db75baff4a675aacfea15b9c64cb9add13b2ceb5b588cb3e7732a8546d53321002a384013319da24ae808d02b761033a6ee1fc57d430c54b4a0f8689c344e9ee9e5a383a832c54ae5e65dab3a16fc56f200970aef5687587c055e35a41d4af49dca9425950c7b03fa04eb8a665c34c1802e257ef3df5b002ee01a709584ce6e7c230ddade4691b50622da9d0f65cb4bcaba29b902a2da60eae7a467a9e71ce51632795416d279872e267b26bbe98396b9ea6760459fe23eb1af443f024f4b47fa5a0b4ec2766ba9e5ac8701ab033b536335917aa21024947d324c04057eb812753f8b77fcb0b0d490cbdd5c487ff0c1b916fb1620e4d6353873bc7775b755626f827352dd3dfcca7057d05e3db356f8519708239e63ed51035742498451878dc444eccd3ab5775b6450cda8742de5f380548f5e769fdab294ab3b4356fd91fbf0a8bc10c2e7ad3e2e55c92156d046af0571d9da3b28d460074e35478c0df8d7902e12012f8c61454b8399232538206deefedf20b0ef564a4eb504bc379ff4fbf80e38d5fd03f37a8cfc3b853f7546c879aaa6d21c99c9962555dddca49cb2715cc86f28fc868ee023dfc724bc89f075d7af1d81ee88bf4fada419e2e6c016fcc5073369c186f4427417e150e2879c86112c13f61bcb9a97368832af2a9e06f182ad3556bd93b434f03e8bc507dd231d7d56de8a0de4474318f9b7a613ddb4357ee4b37be0333d0f2c8d747ec185dfe7f69b9084d5b6b53910b01a74caedcddf79bffd3f035cb1d900a38739d7f45b29e9f7418fa07353f7a3ff07025d3fbdba2621b6c7fa0569e0a74292fa6d792af2b25f804176651387b73b181ef324aae94168a8f4f81d318f06f9ffd617de22821bd28d1b9017c6e7bdf0ececfbf18fdfd7bcffaf2bbadb522714c3d67e7aa12bd20299c20507abc7e2867ca6b39d0c253ab94ad8ccc02688fc7a887f802fe5f5a8c284a3be640362fa8af2c55a9ab38e923c4246603c39521a751d04930b043ad947b5022617dd64ffd8982c3dc153abce2937d5c544994cd69a2d54302e69e97a99e9f42ee2003dee33c67545c6b4e57b6284fff0344c7dea9bad1f014b335d7d39e2a240b6183e17dc9a0db7c17ba5cdfce15eb1f0733d059251e390353211db06071e909907af6ffec9e52e02eba2def6e40e340cdd5cf4dbdb1aa9c3c257cb22930936376b16ef0507963a54570e8f02c7e0525e83430889f33ecfb024ac44cca9937a9bb746a8ccf279e5d7f748d8558a774aa7e3f2803f86b0715d49345fb36724d06de20f8b0606a18451c662bd35601dce441b86ef1907022ae11a7c87341f62d063e5dfd6be5dd1225101f5412d340003248945c9fb9df7fa265e84679e600a1abb15c0dfbf45c050331f43675d8ba296ff00530754fe991a46137c216298df5706588bfa80fb779ba20a3f1f94c14f5832e6ee1afe190a1708c773796878f9cfd4b5a6f6ef531a31ce784f5d531c9ae1cee7c6b611d17f328e69953199c48cf902f5a206865b5ebff55090c66710084e8f0372f80c51419a77d12b388c00cc840428809a6b83050a2a660e3e5367badc8572db4ee333beeedb0139d72e103c9d9a03ed7bbdca9d9a06f9a17d4eb714cee7ed62df778772e8a81896454a1cc8f58c34e3fb74a60b19691bbfa238691c624279862ce434b8ac9e786734e2fcdd8acfc085860cf992eef37b5def6085accdf6f284a824984cfa1600ea710114949735afee0951e9fde04f09761c5a8a6e9064ab8f69bbeebecc5ceb070af858e9837c0747e4511542e21cdfc99556051ac94fa44ec01cb2e14b5641e5e33a229dc858246dce5339f74ec46d44a5e1dc8b45cb5b51e075c6b40d395126c5883bb87a4c62cb13c2b7d9a25a47afd0de4122c6d15cb4578539fa51a43f1cf6721c770f8fa4e41db134df9fd1af59a4b74cadc5c3420aadf2e02024780ddd1e320a1af632b002aac3635e75000feaf41b5758cf62eba81783bb7a3dae55af842964ef46d1747390d3f1c80e774e42f53fc760e7da7f097fc231942e06a91deaa8b8d18316e7d610a1aa27a73a58cd04381e30222c033c3205769b4be4de8545371a9fc4b2626b4b165fa08a7d0262ef024a1724e06077f1b54c6c4ee5dd9dc6f3e6a22b17df717326f689cd014fbf1e14800f14e1d4b04225288265d303ad3a167951599b43ae2d0b0a111cbebefd654926a4774eec0d3b97288167f6bb27e0b96a0f82faa8b2e13d0d4b8301b16aada9478cb8539d3da5797ecd60206f6295dac05a809b266ee39965116d346fc8aa4e2ea0964d18336412a14d1fefc763590d972acfd70e39900602942324b7ffb2142a1abc461dd50717125d06b953373f88bb64c6f72c4d5ba14a740d68733a11c9a22f386979ceeed2653c5d5b13b61b8fb3c67560a0a187b443e4fe5aadf7dd9dac47390c4437569894e779df2b5a7f57d6a4ba449ffd8ac9438e11fd3c88bd327378b4dc410fd3c2358455f1a9bec3241dae84b3ad5b6e847c370b47fe2d82feb88387887595ed99bbc1ce21dea7b189e98eee403315b48fdc1dbbeae94f72c9cce4d8a6bcf420c57bcc13265fdc9ab4954f52aedab343de063298f3ae6d2cdfb5ddba3ea6e27dfbc07cd807f2f2b817e6cea1f9be30dc53ed779730973c903925c69df96ee75ad45c9e01bebddd27b72995eaf50f70be3c6eaa85dfaa490ec1aed418531475c64231c2eb5fbb9b070da55a27191703502c632eff3fb6e8fdea0fbd0866568105b609b9806587af021b0e1f2f827354369587d78b5e7a7db95e2146887f4d4ce1022c670f269a2abead3b17199fbaf0ceed703e06d6e56891d6ab642782e7708917fc252d0aa663a8c3e63d8b5deb91f1b548e56c0aa7192e82826544aba0bc698e10cb4e9d1c0eaf9bbdea40ceef248bf896f25b40c7fa8b762d7572d197f4ee686e018bbd064f29f2dbffa32ed90726d183e05cfd02a84767336a1fd7c23663815093f2ead7620cb68f0760f0c2d736c9fa79322dd66f5068770fd7eaff4da3a96c887ab32f2d00454efd616e464a4f3518491fc0c24d2dbe0acca9aed5fdec2becd6910dde915dd61956685374929a46573a2dc0beeb81cf90f799a1adcd1324f547d5650978a904bc17270f8dfe584f6d3e8c67a959eb2ab7b952bab14511e45922a05547d128d1ec686145c53c3ddeea28a36bf219e18a95800f6231f833e113c0c832e21bd480e6a906eae3cfa060f8831e3856be25caacc7f8e24f9d68a18cc001d85722fa9463ac83eb58945d778c474bc1713df6a0b7a00877ca660ce3842b31f2540288ecd9f263d6d4c5d7739a968edb4aa81f7b945079434c09050ccfb2052492239d0e509590c731dc1ed1596780c94cbce128954f3ed4b5f2f16a280d1c5a0ed3ef01dd9ca46cd0d9930076c4a36f95d15e4734f7473e9918935b63e9529d79562f4fd9876127d95bb6c3400fa97d2b756856e6ca37a645c25da54aa1d785afad3c78f5763e4af2e1b038c02e3e62dfa549d230206f6db499367703bd96645701b1b82f2dfbb5fedad839168767f3ccde49841f8d901be51c2369ffc9b86a7b57b58ea47aae7996c80ac16beb51ec75a8fbe390a5f1d566c03947540a3ab66f7c0578ab3c5cb3d1b599cdc572d6e425665c1122b3cb52f82073c679d6f8ba987c3c56c3aa3d9258e10eb988f595fadaf7a8fb714486cc032fb53824922ec3d72f13613dec139e19c86297f5b1b80066a3e7c6b3d875ce6bdd0a5e4f59512ae4fb5a830971e8ac84609f2ebb0a9ac0c1dfd7d7e475497d42c11a7040ecb5b9e4f9087bcdf643fadce4ed61e6c17aca59ea785bd7f4f6f9dc3eb675bda3269cbffc212d62b0920a4a947815ba31b22a7068032609208024fd1420b86fe928dcfc91cdd7b306f70a6c75397da793aa2eb240ac0499aaba8ed640acf6ca08ba70110fda1c68839b2796014ca340555d0ea0bff51a555d06b2453cecfd1c3fe040457be16ebc0d967fcd158437846a4e39a6d094294b018a2e3ac7d59e105ce86035f05c938f245ee1d730298cdbd17c55a4213fa39ea93efaaf8e0212750ebd525b97b5eb24dbaee862cc7de73d9020c85bc78cacd74e6aaf500ccbb657a9aeeee9819824ef74f6558fb850570dba49f38a33510ed58d40eb5ed181a347e8815abf4e7caf5707b9257554d49f0f950c76b047664e448687285da13d0eb8850b5fde767208872ab4b66770be68a5594929f497c64a65d2658f007b70c17ad8e28ca3949400a8b369b57b595bd78a5a56e12c58fe22ab7b8a15bfbc2cb33c4fc03beb67cf206bd86809d09b7d98e669c3eb26ba485f8d5f794d0046fc360aa4bfab02a50c129b7b390b56414eea376526659e01b9f1b923965c25b1404c98bec2b654576aa70b30214b4c6070acb71ff7e8dbf145b0a912a829940c6ce1cb2e8da003060d50118ba6de5946039661342c445000c91f4bdaa7a343befae0498e685e8c4be658eea3c939322d3177452eb0c1c2b39a13045d07f336216b33435c79aba815469009191840ffb406c6fb583434b3643d5d921c4fc5408de8e16430590a4e6681532cc1690ca642ddfc79104b053e859b4645a9f9a1fe4b27c7f07532d8588b512e0124326405eecd1c5377b22619c6e24f29877f6f36a0fcac1a7a3f8eca614067a55ef421497d32506443d5b1052f479eb164e908172796206286dd576049671a6ace25607663c262a0a2c06cc0246b4a1853f26e53f00c5ee4e3cbf2940560545c9ffdfb9c60f2daa22d0b2ac7977676e6ce159411b00147a51a42c7f7b4c9e12cb0109921cac212b9ccabb2e7b10e17f570e5f2b2d95a9e511a246461eea60dd847b70645d1eb8536d01bc0816dfbe3317f74785ced5409624fbd81c53c49520c4f0ac13555498f97c38c1eeea51ebd20fb2c126875911478662a22565d50071a8b85e560781b0b50a49783212c8c65af3650693129bafbab400a3790e71d65a16d62a00cb3e64cc0b36f22d665a666f73e28f8accc080cb490b026795f3ac4a49995f6f364a2c1c8e4d2ab97c1d2faf12f4ab92d8e6b6e35e2512f70c67ea236a05c55a67ce2e34ba708f324a21ef50609567d910cf2d0079b6418a758138f755a1e848d198b9c1a763f244436aa7305272fc5a708df17fd982ea707dc08045b9a2cbbf2a8a9f3adad3bae3046e42ac0654b468366e2e88943cf33a363f29e51c17639f5cfecd9916623415abfc58928428978cfcdffac16600477796885a2e3eb75ede17cbd1ee4d2923df5be3e94dea46e47261ff987827c74050368e6acd15aeaf17b8301f60905ecbf50274d27dcfd40cec0fd189d9ec6fbc1c61d593ca8701bc32de304eea365189ad683195fb42b7c62562c4391b33eb960df11aacd957d11955671a741af1fcd1834ba832506110a51453387c7d68f049905550120684db6093fc2e376ab92726e944272f92c54ed9f108de09ee8b8fc8762bb926c04e459b476d88fb4b9304216b5c2f738def7589368849250026f14ba30e2073c2b83d8f75f702318a42ee8aff18fc6306c6f73e39f63671bdba214045c8c508936db83d8ef349b7b12aff222a08295618f1222b40a2f30b3626fb3930ec2c8445f902d689761d7b71bf445006e3c723c1a40a505198e6285807898478a5d12763015ba061bea3341ab38faf0fabc9b8b1232c2ac4c5a37da047491907e910ff3d82c66e3320283ade7b87a0fe48aca078952b4af222fa48e8a59577c7a9d49e0a814ea0b82d1db792e2a218c9a7dd92f69d556eac2a221d430443c53dfb9e766a07821edd4bb66400be005511986dc2ded50aa9fa4f5a4c466ed5ab0ae34a944f40a6c06d4862b848df4b893deabd4920a8f9a0dd99345a665923bf33790b35ce07b64b2e8f3f6d2aba5f7e75345fec4630164643cdc5f41fdbfeef62384947023cc67375febb2cc75e5c83c21424a5fe24a15b511f98f2981306628ee197baf77d7830c298e7df2744913a80056b9d040aff9af96896fdaa437b7bb82f64e0ce61aa06c4b6634c180a6b0da2d68caf2c1e633ee9cf704655f48721eaf962494d7cae0e7fe1cb00eb4d298c873bc6d761568e661fee4fa06638fc86d5cf25a607ed1d53a40109cfad398325e70afdc48ce9bbb6f093890f3967cc2f6d9b111b4689651dc209879d00e4e68538da47a9f067d0a11f1a0ea353cb93a4d182e363d673b0d3a59ef13ec08ab6c4898f8496a8a09f49e9cb728284b1844df4629c47d09c90991d20069dedf75f889fba4704c0963e27c7f9a4f6a7d06162dc6ac10cbc07f4fd0e0200f34cf26bc24d782d0a026e0e30e8445e9390da239ff4f00486f162c45b86da762ba40fa36896bd03b190a50a06b04d0a05ecc379014f4937e6c98429938084b45ef3bd2efe03d19879148692429ee40dc9bb4e476511231e930bf054e5474032daef52d61adde609f9a84973890783277862188dbb69a8613969f551f6228e2714fdc8df000ec92a988d1882d865c8ccf1ec69b034d2cef704ec510890e845d099d999060f0e96b5a10e88d556060745c338533eb7d0b838116e555818cf009735b56cbaa26ee2cf2b4a897de93cbdb0d1453af75f5abd20e2619e15369dee064b555ea1113a1e28c6e516ef465823c781c9b073600539376c9db1a829b1b0e4db98fea241a1d81857194f9f0e6e52a1b9b09c49f46c8b08623865ac8042a58eb62ad996032f86fa38c95a5951aaa39674f83f82cdae16468429e2c3282c63ddac98c38666b076d704dcb4bb72bbdaed64356a8c56000b5453fc80ad84021dea26fbc9483b0bbb0f993408918de67402877a453224672508dd36972c00a78adb2004df56ecef3139d80ea9c2c4099563738dc152b7eede3413f938d53a7c22acd1db359070d4795498c8cb2330a5ae21e56ec9d6d66dc590ff49c0441879826cdf5d3f5d89c8e8710f178e135bc1ac8cb24de7fd23d350c2eda84b01a6214a746efcf0dae462686219c3805ff66494ec4d69cfeb7e608d87619f9f3d5ccbf019e5d228c6a1d9a15d902b60dd4a6d72ebd7a0c0eb6710e5ab013f0613faa090afa930898c25cc09528b44030d2af60de0c8834a51370f849cfded966dbaa61bf04d1b1d4fe485f1122b3e6252513bddbbc5a3b5264c759a49941f7d7e214586ca401cc9d4d4dd1bfaaf32350fc6486bb0d22d0e8851afa22dcd0dba8f3d0aa60190169b0980216f34252187a5bad08b7b19e2a2f8e59233f69cdbe925a2e8bbfa635071575e30fffd6d2ad0dfc864ee86d9bb14513cc8202aaad7f82120d525b00626a906b7d852c41a6df1c17bf1073e109232e30f3db957d7e7566b7de694d0c673754298e8765a9d97976f44cb0773e0566740a1e0489d405219a1ba19fc5cc9f8abef8b7423862d2779b8e9abb19b109dec7b5079a253609afbbaba7879a03da8612221f0c8a2c4c3d204cc7ab3a8f1965374388a9f7a94c1f2cf022b3fb5cff8c0a35d7ff0a51d2f902a295714621d819aa7fa60c1ed787dea6ccb3961541a26769039be9e9ee6b7c0f1469ed8030f9d64f63094c4ef0502b20f1fa9c513e65e66829b1e7936b18e9eb9f7c180c80b025c96d49c22feae016a16650a5b099f2c0ce4db4bf5b86c97467cd37345403060825cd333909978d93e57a066ad6899acd09c5c517565202812342cda186889f80391cd41a0799d657388749462d9ce25138161b505fee4938ba17770d04c3b689eecd51159dc0c02d0962a71e14e0426f04eef5ff5b22d4d1cb5546b1a58b26c0e2c2b5bfdbe0992c51cbd7767600fbad66e6c5dd182681fe9c613d68f31fc00bb00b39c681e411b2396d125b852c2e0adc29c04541354499feedd46329229b3ffd412ebc37646075fae66368eba2e237ba646c61e11b8e14e1fcf9abb1495bb614d1d45390ae4414ccc2c991e6b0a1c6fc20eb4e2c3dce8db1998ceeb607321183e4ddab3ec49bd2e94de4965f43aa0de3b6eb7632f8ec3d8ccfeaa33a502f7a015d0b79681ca9caaba5ad6d182d27101bf14b5b0786cca9a3ba025ef9e5ff4df7598d0462ed92cd46a0bab22793148cca27b85b1ccb470b05261f0c3a39c4406de6fef7f6386116ff5b0b5b56b752fc8ef18194ec4d799fcd0c0c6f61ba22ebb374a01783dee533df1095cb6e91d775bf1442c8ad7ac447768f39eafd2058ab8e91e2604e0bf82e4405b386e92bff7bbc11f1dcfeccb2ba3470ee5fb8b9ef2f550dec104b991c325075686ae4284589c69a07ff948f9d9e4ca544022a7f6279ccb2ed352ad4bae9e6e65e9bf34e6de1941209e93bd3507acfdab285d961d473b7b16d9d76fa0a5adb04373962582c83098551d512a6baddfd23ea4181e401647b799c38dbb9604072d617edb9601cd7bfb6dc912f96f8f19de6a01e4f61806d986737a7983be290e3b417a45dbabc81dd355f38084812ee0e2fb66159fa67aa63efbbf157044ea181062b9a85d29d26de6301ede0d1c096a9ac16141850e834bc6905c6ce17e12c0096a28514463fc576be070ac037da5e30454d24369620b5dbd3b4ed6829d3060bd02b5a9fbe10b18e49eb926d1f2f6cbc714cf49c2a0046c6da30713d62f44dd7d71e53bd98a6a86e1f446c325bcbe1290d598476aa1a3426b62a7e248559bfa573d03268f9d2a8fda8138efdf7b7276ec25a51ed1567265414af8631dca963e38631e93df9e6a5be373a672760ac6cc6d5f30662dd7de7dc7a75784fc02bb9fb157bc3b76d9027bdd5e195905163149d795bbe36538c00287f67406191a462c6db3b3d62740d181fb6a7697ddce33c50bbe574df0c624085791db6a8fc3a482f651fb613f562eae59d23f3dab0dd2cca8ceae4cdfead67e6bd9b05a2c82b832e1bfd75c1cad825e7d2550b274276740889b18e5819529a98047cf3e73cced1232151afda058c6cfe5bdbcd6a230c3ec0a63b332769a30124806b1ab73b7945091b308a3c8c7c452a6ee2526d2d1d043518282cd1dece5b1a778d978ae3a1eab2b96352fb124704ff7a6e20f3da9a1a6123f4e984d33e9517949eb17da46825c5a83e4215446dae239a015512a7851632a3a202f0ea8f8b186f4356c6bfbdd05a87e0e67e78f713334998990ddedf2000d18093088372202e96f22ce482ac68c11d239c5076952be9548dfe642824905b24ceb58d49995ae0214b655630b44473c0db8b6f4f15160d936cb6179b43ddf380acaef00875f0de106c747a3c88d419fba00135e3dd579a71346f4ce33cc2d7a9dc1f1c88d2d585d74a98a63945003fc6f9ff471db7ca582098327f2217c099843bf4ad2f82e12542fd4b2900289a3aadf1e81c745db4f50aea27a196057d68c0e7d450f4ff72a460a512ca60a06bfbb4ebfd1d844c5a9c1c5180177d86d40efd6ffdb47310cd96230babd22ba62e5fcb879e39193a1abfafbab906f6b0c14fe2ed9f2f15e76bd84d2e078da2b61cb13023e941725d6ca63446eb370ef99098d3ebc9c6b2e5605a3aa24434ba202be22bfc9c10ab01f110e0c7dec7ee0673a087703cda24e68b33df6592c62b3aa55013a49306423b269b8db14ea2ed051c839ac3c5b57bd01d717cc04aadee10dd53e30040728e723185b9bc9c9b813fca7b9d8f0e06b665d1add0390f369e31f0034e6b7f93746407abddd81e54e05c8167e6ee2c21a5751680d6d64ce0925647a50ae00c9434c80bc34224273bd40722b3680fe26ed73a990f20bdfadd20612340a0f8dec82262bdd910175c53c457f4534a14351a4134c213965c8c5fbe9e776fc1abb9c9072af9616d2e934928cc6b4d46ce86f6bfeeeaf059e3c6c67b726f3ec960a74dea364ef2e607e276bc10512b6add49da43e47de84f6a1686cae93442a740109a251e70463d79bff20f6a8eb31238b7ad0fcb0f425a1bcbe6a83e1afd11173e365ab8b9191c1b70eb3fb979fe8a4f0c959993c44e68789a89f52b2bd3cf4d5a19bf85575a9c97f5f66adcdd24416185ee936c340738f68e3b4cf3b06ffa69a74a4d62b966b18387311fb786d6361b53a2d4ecb7e759011afa0b6ee86103548f48017d5d3028df992e21bd264b033edbb0a1f2f70f6323eca4a85fc15e5fac1d3d047fc5e762490255ebd8c0683976a6f2e6451325d6e08bbb8340a3cb871b26693c6796e268d926e5d54fa1a8ed277989e1fd86b892e152a106b2d6417e4566540040ab1ed099818015dcee788d7ffa55610d63a31507e66397adddcc35d9f9a82ba9ba4b5b1e0731d63fb1126b521fa7d758c329226f029ef6df9ea5ef787b25ffd3843cebec7b7111714e06501f4740d5ca2e61a24ea7f7b42d9ea8b1b38a8e001d706326a6015e3dd6f77604c0a19c532661406c4905a5cd5d616c483c7d1363dcbc505463f97652e08ba17326a1e807e3055e7b2d1ec775d54f668799a9523cdf8d2590f9bfeea4de6c2cf8c3a17334da1891d57a9c42d8185e425343f41a0ba3b98ab9a4d003e5d0a4f0109c5f04c6dc48a289cd85078539ef429297428f5061c65325528335a7b20c867f0ff38dc455b583bf1f4d83815e2a96eb34c966af1677e36d9bd6dc5ffa9314df9a1c9e5963ff85f431f4734ce22d3a8be55e9ac810016573ac31dee82810be687d8c0d45d439ff32c7eee9c34a55f6f20d116701b08a3d48aa2b99feb410a90abcfb328ee655b6f6f2de5335e95069c10613c8bdd392d08e77f629cf6d068b19e4146e5d443b48153285d633f9d1f1484c2dc75e62c4923b74f392afe401f215d81d285dc9aa5b8bfb6f43eb2633613a4539e1e5dccab933bd410f11c14853c60d2f73537a9821d230d7ea0c52f75ec64ce11d51cd4f19a5509c462d18f153d5a56a8f9d867827d80eceb02e7d439177a5d3071049762228f7d6d6af60f1ed7b4829a2d053e1e683cb2ba12ab57227f894ead70204618ebe08d246c52d11cb70f15e698302ef7b87ce31c5aad0a9090aad6589160caaceb93e8299f27e5715459967f98e577a20052c2bc96f5e5a4df606b05dbe961d90a68a71a55c31d8903d489d7078f8a9c683ed70d4352430478fc095c57ef58fb322560a1501ad71b809046a763b8c70a43cb983ff2a7a1415c6b07e991cbbc1a7445e0798aa6859735428ef049363016f4d988105cd61e3c9908c4676badc587b6bd1a26105057fdbd1e699b9a9b1f2b12c526c2ee279ca7dacaa990049e7ad63f0c53a9914b010164382c2f9687fef7b7af337077beb9d640a1c9d9cade1a972b1ab129efcb9fc912a52078d03f98cf330c7afb64cadfab2b93477788b52f3184fdb6bb6f712f86982c7c1eb2803a4362f3cd218e2a7ee80c7633ddb64b087092351ae700b38b5465a057e2e8efdddfd47a2e367af903a313d9a8df4dfe203169e7c0df1f881c4ad6ffe63d2a1610ab2b147b47bb9af58d3deac4771d64a9eb6e89e0b2cf20e683958653a18e49dcd69c16b36cd39034700d28eae67b15f05356c3f3d701ba69e71bbd9ce66395f1915f92039c0135790dcd492719bde78cfaecde9c6a93803e4116c52c67bae250e605796c7b9cb141cdbb8c85aea434e8388f9a84357182de00297eb62e88917fe1b4b5bab71fd839918ef48d6022a5cecbb706b92b56e1c9fbe49b9405a88a2584340c594bdc492908ba41e7479c479df6d3f6b75ff88a4b86ea6976868d66378587596ce93faa25c66a837795c27511c4cb3f6fde6091614f4cd567bab274c4993448de70f80044f008c76ce7174d4f85625fb4dea6f5b45a28eee96122f2d3fcc4ab02663687036bc3d9608e9ccbdb0773dade8cf4e911884d9f1572870cb913caa319ab42c45804a468414f3d40113d1bb04950bbe93bf4ad809274c76ca502b3c0e5db2172b3e172e239b5d163c60f578dd934100b62fbf009bc3d78bb31b4673d7213a46da687271ecac2d04d388653094dad14c81c147f4a49ee060f38b5173b4128b3474eb3a81bfb1f5846c48801ac068f0e3225a38184c1cba33f91a0a09c61160974ed849622312589a5c7da85de78be4768e1363ed1fe5218a26ba0905f6dd7fc7b111f050e9408adf80bd00f8deafae2bac60f19ea04b664fdfd9a24b9ffeadb0ce78db4a043b8f05a8f178adb10ba2232e30bd5d7cd80999be2cdb89ae1b18450a5a40a13373c2f232e3774c9166dca8eeff625504c8d4d5458d2da0db043a5cb190829cf5d090b3a5262a181075bd071610f1a3febc70b38e6858714508a25c712b8ca430709e191e5605c79c82abe3f5dcd156b99dfd7c53c0da886e979373e141cf8977ef2fd280df6c977a83838d08558e78546c3d0a93c57338aeac138c06c26172fc4fe4b38497eec5f834caa65fe4d5145b3048fec4f812c0f66b37ea11d201dd0029783b900fb21c0327cdd166a1e1c307c84364d012ee39fe04059112dde1ddf05454a7871238e45e69645dd649bdc921f060a2de7b68a8d7015350333450a3e5cd57187e5228cc9b7de5ca5d428bd61c9fe64abcf1b43bc9e335a76f3885a0ad906476904b1dac781fa9db05a3d1391be2daaad449cabdc483a79350e909847990eca042c538c4c83b74ea1063a47112b6af25ecc3add7cc6dfa563adbbadfc63e619d9b063a8098a819cdc45194f70bfbdf7901696fc0daf5e407784c158506d370564b1a814a4a7182e2509ea139beac8e44beaccfbde739b6cb3ecc6019af8ac6d115095cb56f039bc2202868f644755abc9c21e60cf48b503e853d535f417c9171757d716ebfc30520cb4648437f9ca3963b04c7da77e5fbf4f7b63ebe14bd113afee73dad00557547482ba7a5e0c46efd5af86e44ddc5332bb1403684b537f1ad9d7da06d00ce803b1934548378d1d06cec777b0befe9257e14d327260ff3201fafdc7444f5b15c546e9d55363a75302ef6b184358c678c7f6afea592d017abff6a67ae1df8083e75667a423cf2033b83678f2051d98edd63f56d3c5953351871486e5bca5df552b7f888f53e2d087ef1457f5813ee8529386587a762adf2c802f0767cda402916ed9586f5f8bceee5f433adfe7ac1119f656aa0ccc4cb046a18348c61471f7986b2e84af3353c60215037d5b1386b6cd95c5ab37d215353bdd321fda85c6637626f86294838f21b3bcd6bab439a592784fb83247345c51894b8fc83f39b5db053107132ee40090799cdc41900f577d627062243fb0f6ac2fdd021a828b48402c46ecf090dd94978fe11bde4d40d0f00405340280df5cde43f1ed2a025657a744e71c22d25e04bc201ddd20beb8eaf32b30f690d6fa9a1a02cc626704e8b32138ddbda631c9e9620d70a3a3e83280dfb1487bcb16c3ce81a810e1611dbe675f6555d123ae87217a27095f18b47b8cb58dd44e551eb4b54623c4282a69b88d54fc6e04e0a13d51dc9461a938f931f7fde18031bef785aa16e3278e13cf3dcb712a447432570cd78707ac98661033c6fb22fd44e6adce7fe30a1e308020506c5c73d25e0fe75814dd831155cd7dde542a6a4f1287dbf9e1ea79ea3dea1e78fc8d4f20c79ba0747d187d5a132024535fe86334aa388f762eca0e4ce498d978576f0307419e74c45998ae3e73ddefb84de251dd37bcfebb579b95ce8664d7056260f5bca0e3768d01b607c11321a2cf2187c2ee4f318c7ccf4dcde900b3c659727747d2ec528f3c9c13e76208f4020778d0a3c0c51e16dbe653346ec71d8cee71630ed69b4097b9f78cbabd0bb05581b8956dc853cb9a3707edc49227656060c34fe3f60b994f6e487e1b1047f105487e8898b30f3ea1cc2bc8e78922f2ae82126b7d7af5596316c4180f1e0a1bedcda9be7e82dec06e8db6f148030b832239c6b5c629afa53225ef50b4f02cd8bc965270fc814b67f08b76dccac8d8f2650da286d6845e603a608a455455ce66a02919faa01612c9f7535ba7fef713309fad078f2e157740116d02f17f14be0f4677fc5931c5d9de49b251811fa03ddcc4c5165136e41bae56a1d3ffe83bfc800a263dc6082fe2ecfe15ef5353567a824dc3703a6afa96dd0fa395758603a064dcfc72d8c4149eded1841efe314a01e9914faec47084272cade2bcefb0ef7b4d30ea927be12b1551d2849b4664d955a381db40757e530d7b4a3f6f86d33073ba4333bdb907fa2a3a63568b217bcd641b8fe6ced657055b31fb9f037f706094d1df567f60f39850a936d0ca4c81aa4532e987c72d30f9e59ba57406f7dcd1b84017affe2f9af56ceeb8fd45a3d9bbc98545a65bbe48712be9fe960c63a25ab6a6999b54bbac29e8f1f6315dc302541a060a3715bb2f91a949cb510e48ea8bcf4cc1c21768bd3d2a12d40d01489c910140c869bb9897594601820ed3f3feccd57b7b3c503c0d930f1182b1b1a38aefe13ac206cf910035ee7e4df6755cd09454b5b642d3a21a09040d6a0c42cb6721cd91a8c894b148c232ac224a41f697940ecb4aa220f73b001efddeacbb642d4f56053e67b2e4c560e7377047809fb85ac622c794c212b85f435ad6c4884e132f22c474768b73fa5ca69d763c78ae74192ab88f7c8f67f8df8ae381ced2769d67e23f6ed00d86473c003609de6d07a3d884a32f9ccf8684652eabb3dc08e0b99f7e7f5b31b83d2aadc707f536eb9e97f682e46509262337d1e5e17c627f8ded0148b15a6764708b00601e4615de3027212e4321abfa73c622d85317c88e5d9584614f4cf23680892c1c506c11a0908e7e6b793ca49191ac00038a7775e6ef0cd5f3e3c7314ebb16ea6698dba5e947cc808b48b300d7462956f6a3aa1a49db126d2a612b3022592ca24638010569d2e69d43843621e8ab09f4cbbb66b8734fe2d8df62807f20e17b21502f9052a101e44c87e5263a40021faf533bfbe313974b7661dc2598055c55c0c83a660f9b1417aeafd372fed6a202344e15e4c8e87fb0cca3869165ef0f36ad7170f57c09cfe824b671be17166e360dd040317fa65b6bbba50083b3d782d8eb48692d646700f431793e29d38ae8df0238a4f5625113e79b98e672130b4b8a0196464627e1edfda6146ec714f906083b54bfdecccd65223ccbd07fd86870cb4656acb541007021a7bea23027c6be2f6e0d4f91d98766f042fef26998b50f52a2674205d22396a59eaf2b8c71649a8e056189c0deebcc5f405355333ae3419941c74c0561774b0b14007ba9079ff9f40c4df4d788a094bac77f5fadb24aab7074d76622e47f28370887aea4c6d1dc87d523b365252d9efb86fc16fa321900616046ad41515e26c6f49d3dd3f560ccf85aefc5c48a04320019bb596fb3c901c766bfc86757f4725176382b301b2d360d9d120c16180ec60b07436b371757f4e824d53132653417600e15775de6f1c8e6f36dd5f1e21f71d0f50dd116a059edb803cb789d03c7b431c0b003ee483bcaaeb971b072382b703b2d761d9d331c1d67a3577078b18789a7b940f17a643429b7192d3c649b89951286f1275db9475d55cd21a6796a68ecb0fb5776e0e1eaf9f2a76d808360ef6b3c51f76bf1d768c7e56df7d677018c76ff10aaec414d58fd882dda02c230ea249ae1e0d1b886cf1cd93d5318c4d7607b577164c8b95a819e4487e99da2763e6a6d55f4159f66f186092d80f93a8dd4e9d8022f075cc01b56d424518bf05fed964fd8423cae7dc25478968f5ae8448bf6134b1d89731a69c3ba730d505987a8fae1ee1759272f6c5fd112b33a4ebca4e122ff67475f659e562a66c84ef9a6de37436a4acd1aeb5725f8c6831416cabcf8c4ca3aaf2814fb5a7a10e6f94a77789d01d2b71fc9396b3b6d38003be261f7290be1ca2c1018f432c0951a0f1f2a9e1208558e4563227be3c332da12d26bdac7ce02edc29c34da7344600448b04c3ba059dddacf0be424eab0ef2cab9e4800eddd247571cb18ff6d07d1d4a2c01363d6a8d19872d748e29cf9f26b3800310769dda6ac68319c5263ab0711c9a0fbba4d271334baa9739e4ce4450e38b4517d572498585b54613a9b5ff94ddc35c1ce11d13f3eb60332962022318de3141c39d000b03d84039d9c00ba60b676d997d99223eaeb3fda3f2ff36f3e0df25c58e4976536b8b3771073a59215f4aba9c2e3e1713bf6a659c9a06ae6220794de25fde6555341e00aadbc806e442260faac721d9bacdd710e887402d99dde28284ac60dc583f0d36f1fb2aa43b8dba23581ddcda33e26dc5ae09ad356da98940681fe519bcec25aef6132e54087f437ab9d941695d9c92adf9d8d904e15246bf2d9cca2146a29b7738f71bbbaf0f9a44aa8564d0e717afefe421fae29a841dd9b1b7f6baf1c1e688d7ed23f47c0c8ce5189acdef3422ce7c58b01177494da04dd31ce7ad3ccb9f78ee1e125d2db4414f5d15c7f09ef036ef9f2e94a0f80c402f0264d44fd9226a56f229ca6c576e2ff71cb86441f1c689b06b8ceb0dd7caf85b82e3a9efbafacf34591dd73d689fec463a1f11f2a85349c7294bc99a6585c1032db728cc08691d99dc5888f081601243ef02484e938af4ed38bbd6bf0d349e425800a2e424b602088d67c8a9970b158dadbbd2779026fe1e877e036eeef79ed82f258ad63cfe5006174ec9da4fe9d22c0883be069b9d20eb127308d31a363b7844aa5c3c3e405bfa6ac2dc5ffa74be0c58ed62f1650208b0cde362cb9708578904628c80315bb0d521f79dcbafd177527cc690c702d9a16a193d0b655f8c3ab92bb22843650dc74167205404713f6ea64fa2d0b70e8a0098af23d6ede4dbe26fd38a02189654ed8c523fb3d12bcd3665345a071c6159594a84044726ca62012d9547fd9c5be115c85b1b8984ce0713415773c0a51b8e135aa4dfa95568959eddaa3266dacbd5fd106935e285a894a9d7d0a9e5ac28d63aa3a4ab7470b29b6e1cadb0a3111127f96ded162420edb795c13991dcbd3971ada597a0a4f0e895dfe518776e1e9b61939fddb0123ba5d75501ba1983b5711894ad4a4ed17edcf5fa9a442930c2630f23d80068ef6645b7724e9c3b0f1318a0ae8bc3a7c02672281edc9b16d630fd4b1d84de422a783b7ffcd758d0b04c684b4854a09b2f0a39470f2555c858ad088f6d57cd03a9e676896510c15cbb44f2aed2ac5138c3522b54cba4dd5a53bd5a02f34d40d61f254723b05557b0e291faae9aa6fc056b6473601f8a882a261567979df3b08421dffb10ca6296e84fea9f1c5bd3ec6d011bbb6f4924a73f39c3ad1cdb011847ae3e9b9842aa654f4edcdff8a63e17280597e2b2aa5ffc7a0d8ba7b45c68dff41ecc6fd99c4a75f56b616d9109c7b86978b11ac9d8c1a4e4ae280b9712024aabab8b22f5f56304ea6ab78e6a3b029d5c0a2e61234463fe89506b44a4af04fa3874c86f6ebd0ca96fabb25ad8fa0311906e00fdc65c0785d9e9a3bd053c9952e5a34ffcc5d298a35cec3cb9562123a026e8f1e4e0c3839cb042afd09d35ecfb25c61f332521359aa7f6c9240f9cf03e82d731f9f5f487c6352aac0314d3021adc555f5d30522a9b0ef1e28426524ca8ab663d160dba674e3ce9ae2b07ef3299aa251505685066cfd96aac86c2e88aebf742986220d1c260a817bd5a040af1300a49a1878ac3a36ee8c6b98ea1cfd6ec45363dc2c3881006697befbdf79629a514f205ec05b305bcc1aa6f321d9658d2df45ec244bd23699d3b4134d6c46b5ed88924d4868a64454341372f992679b6c33da8e6c421b0c969c6626d995bf139e127a45f589e44e9cc9694e482152cb9d546772a6ea3f7da6cc6936b02bff15c3f3292bb72935e47b20a7acfa2f973306ed4f6304a095181512d28c9413261f274c4cfe32605e5c5a586241b11382fc6867fca9e850f00d7f15d19fd819234b125144900aaa3f92ea7f1a8d6a5852044be2b02bff203e1dc6ae8010fa41142f96e462497f1fee7994a652ff2c9a5ab650a5a9e536096911c36215344755152ad86847a5763763a2ad7e63d0d94d6b9f20744b4edcbd930e688082c61c6b7287059e1d9511d485c9c3d3625848335f3e561f17cc916e8ed067128428c8d177baf9afb95bdce11102ed6f74706c1e4f3c7ade77ba59c0d25800696767fc4b7e17d072a1b8ff8e1dde9722eed0817a17e6a7fc875ae1e32aef8cb747d5c3538b5bed10d4b7f1503c3d288ebb33de7fe20b5c5346158d0951a211954f51e93fb15869a7917d5040594dfae7657ff81e3e2bfc920c59dd0a47f73c4a6b18ee0afcf04330f47ed206cbc349b2bc479c26fd6f9af45edaf116bad5dedddd9ca404a9cafcd73e511f9c73776fef2697d58ac024454535a31e5a8c2c94b6265ca9d53c218618328218b80bde82c80b3943414008f1d9284dd6090e2d6029bd89113257152aa8cf76581097299c4d66a276c9486c1f765de735c88a60f275953b13a9b00d3336628193daeda4b6f3a6b03577cae4c632c54293debec6a063f7919055a8a0fdfb251b19ed380dbf7896aacc7369ce1d168e2a3f4fb7542a03d134bc03ad856e6dd211231fbe823f5ad2911ad42621a63a7b5ddcca335fb10de81ed5ad658afff58d41474fa401dd2f3d5a0c18f5ccdcf4fd295dd0929b18caacc9229f752b759310e8696fbeff6e44108340552b8c0c60dfe6994273543e4785a69df1dfc6f042cef33cefdbd7f721d8034e15f0555a54a15248814853535393d89432a2787ae2a94997265331bf339f128e5fa94923b1318d59bd99a8de43781f48d44bda08e56d14f6964975eeb899c29c4fb8ac03dda4a127d5b9981e4dce9f58932a1650fe79b58ca4d2f78b240ecdefdffa8790eacfea968f9e4769ec4b560a9e47e79093ba4944c84ea89b34645439e6349e47692af54fd24a52c7d6f4cf3f000fa9738917069dd58529764cf56b117b8ee4bc8c2edfd3f2348a501dd7e1f710ec979f2c3465748a1a9f54c00a1d17957548175dbe4c81638f60046d7997f7173ba6ba89fdfcf21268f99751022ebfbeea98eacbdbb467e4e56d34cdcb4f16d2ab493a6be46efc948b4aa37e98e73c75ddc19973ce39e79c5d4bd7c9a5630a99f3873961384ea3e226a7a2f2a8ef49993eb5e5e72e94da32ba5646fe11631c63ffc6719a14d88523c37666e280f3e7fc9df96541b7295a4165a6d71c0d7474c7409949e8349acd8ececef8cb0826b0d32c74eb7bcfa18367a88e584644cd41d5391acdc66667fcc313db6c0daa04c28279192fe3431aa2ea05044710550fa8f1345ef532f2a8f134543cfe47f8df9d5919550b68797e7e525fe8ba81ae726056fe960752b728288bbd33a597e2400a1be0cad230ff29fa80c9e543661a7f5ffe357e5ffd32aa1ef05fe379fcd7a8f13d22fcd7f8ff1f7b667c8dadf1e2f3f81fc71ed5ff8b63cf911cd5ffd813f335c67df1c85166c840cb55a25e8aa6c02e28aa964b5bf958f8de4029632c4fd1b2352c5ff2104e78e28c0354dd405751dfa807bba0a7ca309f82498daa1552fff22aa4c66d52060ccc7bfff240eaf730e2e732f234b9b38526b75a001c3bd37f125d402cc460e0892181681d4ebaffd00474541ae2be4610f71523ee4bf579b5db978e163398a63fe1cab8b8870c031428309cbeffb3719ae7fe24daf8f046da7b11d2041b279430734300374455f8ac07f21280a80a6f7c8e00fec6877fe3c6b36ea0f040588fc2e7b01e85f1c71199ff71c2b364c61cd6a3f0288c3fc86701b9210001bc0922eb4f106f3c29a2f0366666666cbc09e30ff26dfc8f137ee68198f0404af89cd597f0fe2500e04d187f98f000f81f25fcea81bcc22e4124c09b200ee04f10713c2916e00b20aa38a44d0735e941429b6c9b55ffada85ba51fcdba45f4bd1f756bcaa6d256444b9739cc5d4602ba7de92815168a0afb44856dd2fb243b653dc6e6e019ec0d7f0fdfbfa3fcb04b363be34db6a66b939d014717ab9e8630b963d89533d9b08e01f1a7a880d5324505cc886398f7d33086a1612a1eafc2f97124e75ba972def3bcb1c7cb540dc0717df58d2e5f398f8b391e4beea1fa566bb8bdcb33a5eca9dcc8403be33f846e23ce78d3e4d65b1647449894c44ec0036cc9107c9061a526fe61d09295941aa502d7fd2a003c9abc05ac96bc05ac763e36af79881562613db4ccc51b610d1bb94993fecb83eacff15619a5c29c356c14f79d08564f754c0bb5ec09a526bd95fa951c1c42a78f4749c29559d7d1a36b7be609db85fe685ee84f6ca157fe9c98819df1f7440cec0d1783765defa679c2eff9fef43de02f9367e4ebf7449d1ebdf2f0f4dff784a7ff9e47f8fde9797c7f3a7d189efa1576037a5c5512b45c261e4ea77b50605b0758d27fd4b133fe9b8b72bd35e91f9c1c96252519aaaeba494900a102cb8e81205210c3d49834e121d03b2684fbc42488ea34c94c63e11a93a6a1cf29292a2a2caf32aafa577e5f3d2e9f32aabae579a47ccbcaab7c4fcba7742ce3ae8cb4855d46d95c79069ffdb949b7fc9be55bbee507cb188295f108f840640da482a3a3de1f48ff27d3e4c3ac44600625163908d5e2096419d3f1855ef17b3bbe62cec72783944f797e1ce620670939978ce4a4b20e8bc5c2c961d96091a806a3bc4e932c43b8bea27aa139ae7d7aa9c7acf2ebec740ba6f2c340e303d68c80a23207618450e5e7e1b6f6a1f2f3ac80b29af4b1355bb97befbd6edc1718841a89fdabfb7e1b4dd37127f6e895b7d3640fd761b58d6e7d651f652eb8011353122d60814cc935a51a55e2d7f62f5f4197669064ca508ffc31095ab23c2f06ceccecceeeeeccccececec3f4d9ef8c1120c8911c90d03bcd9d9bddb1b8b203e3423f18a27962cf919829f109205121a9ccc40d4440a2366109a2205480cad00c80a211560b14b8ea2348164288a228de44807283baa7852e4480bb890a17a90c44fcd071b92340144d4440e4ba408c202206a53d8c086fe6a30248aa1708a2234253f0005315bf2e467c8cf2c92439325419014418208dd6700ad0ea9adf833ede73add15ad6eec93d965504f3407da64044db5251d74380ac2c2892896242931028a2555bc000914330025d54cb08276e2892f7a7bb777bbb7677bf7328e6ea5e65094a41cfcd0474562dbdbbbbddbbdddddbbbbdbbb35318a6c3e0b850c507a77b4df6cbfa3cd26de6c37dddac6f279e38dc51bb6d971c3db363b37f34df3f6f6762729a9010fa1fc2bc3738c7065ca19e379a9909190883890ff78fe333dd2c53db72ef315f820f8a7ef091fd503fe49f56d2dda6256dd8af1c7798977b12b7f1e5487e24cdc97ce44c55951b36e0d6d6b386762695a881d52ab25252d13063000498ae28c192b2bfec38d2de33e3128d7909a74ee3bd4f729323561df09c249b757211cc1ef1b4bf0bdd1d5a40df8a50b649b19edefe19272cf7395bf837ade7bef5ef7fffda2bb54f7dee55a66eeef7b15b67e63f879cfdf89464eefd234a7e79ebacb5bd79237c30a8ca458b2e1081b64d58b8a8a8a3847c7b89bba514ea44612edbe8845ff6920224affd91a21b666bb695f9b118d8b84d0b29b98748be35105ee69547d5fe2201d107eb79db8686b9886add815c91dbb2b716d0c42b92fb9569980231379230d328fe6b1c744b4d3149a327e9616626139da1a2eb6e5c5b638116cebabc1c8b652dedf89587f626b54dedfa1e01cf4fdbd880dc261dd8773e4185547a2820a040f41aa7f87d151fa07953573691167fc27a69e13617e135f9e672d24d4b3ad49a9eecf21a12b5f6e34baf2e55caa48ec846f30f9ca7ffaf00d26a698524c89c608ad168b3565b2297317b896dbb4c9362396d191c21431e651a2ea19899db0f44c8414a1991251d14c28e64b9ecd52336488f0cec4d433522966f2e11bfe2c4c3ea713cf58624eb3c9b4d81c9b11cb268bc5e60c605e5e3ad641ddf4662e2d2cbf4b61be9a49aaff36c36e22d84d86b186a5d964be82718ecd886ff8a302375f10a8d731d833099529e6e8ecd6a07e64e2d6a854ffee616bb83fd6e4b83bd3429a746ff6a91ca549e6906833b1c307f2f2e7ffbe0fc71fdd7f3fc0f776290a98042cf749d79f9f213fddf7ec13efc1b11b7f80db0528dbe709a862f04fcf237cd4d8e385370c68d7bebc574ee7ec8c3f4369928beaf705dd4616e99afdd5e0ce35aeb112d7d6a64316d25ce3a52e7f546ee4d919ff79946a22a209e7740bf8fe5493ffdc6ca265ea26f5a38afbd2b5286e544057766d0d379ebe24ba8d3adea6d3f188a3d3e9743a4de634e93839364dbab7747af8f42ec8118de3d435a2a0dd77834968d7349bad112b5d9f5f14fc83782f7f478d3a76e6fb8276638a8e59501f62b6851cc303cafd4682ef32ddeacacd61836ff89f3e9c4d22c0726d8db73cd82e7c7d5d8532154b20d57b70c7b9abea6f8373acf646006ad7502453314dcae040b9ed8659d8db5077aed2d5bc28540a503420f1135b33674a093e12c40e218bdfebe8967faab7a6605229a430bbcbc36c9ee3f2309ff3f2a95f9787791e2e0f33aa1ae665bc7c6a54f5ef4b064c932c1fb67c384fa78d85d296959516951696efb422d2d08517683d3d7f8f2728941304ec8c3f8b07d81b2fe28dab6b580f964e53fc0441c50e3f4d3c7952cbf4459d7329e5f5c8d3e4e4f131392e683fe9abb94caf81e5d91a5ae7b7b035f3a7d75d6f403dbf471e2ca83fe934fb9aaedaa3aa7ef5b301e5c61f996c3184a157feac49a2a29e3957f967673ac811184d5b88f301d1b32e6a1943018202e463c856bed334bfb8891d08317bbd66b32e6a23f07fb6860b4f10083f3c8da2e72b70f4888a7ad69dc0cee76ce65238773559d433577fd9b36de49f9db9b1a9cd3c31361c20f8295ed0a288ac269bec221a6d224d21f307e6d3640a3893b6046d9395dea4f96a095a4ed884398d7bde37c392aa3fe581bc548d5219fba76ca31a34977a3661d2644d9cb48954fd5fcc1535bbe8710a9593c6cfbf094d19bf50b7d8f368bb029f859a94cda029e38d43a5c0db269b42e537e9a22f35e94bdd2a276c0a75ab74da1c72a739ad5b4bb37103fda269a949f70eb717e107da2f739a09e3718eb359396130d50ae1cf9f4d544e581b9934186dc2605ddd7fc07ca1c6d904035afa12adbad3684bb425da52f5e762b4745a1735e9bf421335d9335a1bd168b4179a2bb139788cbde17f7a7f37da1a5e62094eb21d25cace84e015d33b5117b05998000a190cdaed395bc35da38c9c9e51356c666666661e4b162ac1064110fcd0719af410f652056511fc0ec3adb9707442b25b5d99b9bb9b6178a1f3b156734078cae9953f07e27c238b6cb21b6348b7626b38eecb0e22e18ca3d3834611fabdf7fdd327f4f91ec461f38bc27c4f0ce2bdbc07c520decb27c8bf7c82d01b042867eafcdd0294ab98ebe58de2aee602c6948ff499d0d92dc5e41ca8baefeebe49cb5630123ca33d763847dbe0c2f6dd871cc74d1f581141dcdcedc4af9ab3dddd45207377779fcd9b37770af72278639962eab123b2d0a47f221d83065a0c4124690a307c50aa0205330cc1233aeb3e0f5fdd75980ff90816b63531b1ad99df0b09e14043aa7b91128e6d0dd7fd37c28c72dd976a1b550ff01e7c1ede83e1e63d0f301c55db6824e5f7857af067b5cd27e6b0263b51b571ddf6df7be1d8037aafdac69c6f546d1f760f82dda8da461cd49f3ce63029e8fcd261dd7ffd4593ee305fc5be316837313549035af64c24a2a5c3981cd6ad6d8288a0ea5dfd55a40d87910e837143ecca1f89fe61a2a9899734a9c32322adaf4e25082ac776c67f08e5d1c685e49afdc1a07bb7fbe60d04b76d034fa80de4f0b481fc1bd8830a4f1f828f7a1ee0a3c653f827149fb6499511dd9ef3d8fbf80b41af1b59a4cb0b9237293e1cdf0a9acc24740393d0fe44564fd9944da139d4db9753c6c44253c6513e1aa8ff2e69d26bfe7dcfa32379edfb5ab7befdbe5df9f721287aad919a5ce2481f7f1c92d71ca95bb56e95dbac2ee99697be4b886aea085aa66ec881fa6fdd7ea8032c00aaccac270d9b51032d1bd6b186354109429747fe1f304292c5308ed6675d9e688114a5f881996b35a41d983908a9492d46c3a0297ada2f29cecfdd5d13d0fd263a8201121c363b6e6ca80eb45c9a0dcb85c4ee76b1a9269ba363aac95e124ed0316c32202de1e8baaeeb7e7b9bf6bc6e75dec6799bd76ddce62c1da5efaf29d5f28774ccccbfd3e4bfd840cb55e57fb18167078784176c8d8778f8197a9be69a060e9479773218364d34238872111045b3a259110c4533a2d98ca8685624039a01cd8488848a8c8478a1fc30d18edab9e4ff264926654eef6f83ecd6d25411ba35cd02e367cf903fb5710cf364a2fbada496293545f4f62be02a2a189ffcd80e0aca485d32d2f6cc48ed791cdb5533d2116db78924c4b4a36ef5126666e6187b50d8083f0943b48f5033d0466ada8f44747fc4f184d6401032d2cea800a41af1cfd95e3efe08c1cbe5aba01951cf84d0b2675dd4b396b5d00d347eb2240041f702e1ab66f469aa49268e8a08b978d3e4eeee6e775721039224e1323bb7cf8deb3ce5846e935bf3e6ed9f8668ca555325fc50c20f5984ac9202ea620141f73dcf474f8905eaa72eebbd238e4e4d87524a757056cca9f5eb34b7e1e8f8ceea0f4b70bbbb2c8fba76b89c481d22bf9c39915f8baaf9208a154504a55c43d4c7225e607676677766676676afb150e369a106456c8a2390581f77a03d7a23120b78109e7f1e8f3c9367a7c9de259eff7f1e5fda6181679b3b7ec33bcdd3c26c6b1ff3a9d41441d496b400fa82871f9808a5bea281f2c840b3f907887fd88128a514e88789fc004d77ff719afe2939c63ecc3eb13f516f7e6143bb45a98bb5a36f5650a9dcbbf8a09df84d6e2e624c933d95e09fbf7371b04df7418fdece30b703fdcbf4b82bc474ebd4a44d7b0cc29529d746b7b6da58afd5bf2fd336627ab5a586a0278f8996d45bd24fb57ca1ceb9a47f7b759630d4fe90674bddfee6474656b7df19cd48a86eaebad18c92d4cd6773fb6fefd2adf9dbafcc06841b76288285926b89134860f1ecb25ed014093950fe0ee830ab22072fe020ddddcccdcceb62c540ad20e2c4122d6214394110314c6f6b31e0d06464440f458ab868a2429644142a9210516406126858f213daa0ee7b1c6b1e19c6318eb14f73cd6db1e6d9692a22abc74393a7d960fe556c51cb57826e1ee7799dd771dbb6b9bb4fe6cda793208313473b14b5348184431bbe4e23d34bee73415dac19ebc00721eeeeccce1b4f66f776253da91d014612417c3cd07dcf4ba57e64f0191181388c37784ec42b8a9408519188a00454f480c81731081a628914454a569820091a9e7c5794a0464407198d99d99d7dbabb7378c40a21b57caf1ee1dbf438cfebbc8edbb66d7edfdc260f68b948373898210521995008a1b933cfc9734e9f93594da8b8412d7fb21b75ed535a9951f76f7cd53a9aec6e1860e4d3344ecbe9d636418488466d76f473bd719a6daf69a71a8711ef594f4bc5a880f21351e0088d2882848e5e30272087a39a0d6666f73ccf73f6e9ee9b3405915aa650e09344b4248908a8d5b56c752d5b2dce61b444cc0aa35aa66642c4c2f6be267a33bdfbbbd605922ddc87de6cc9bd8f364d36c77936dd363b96f3fe9bee5f990e4258eb13ed0889d6b414122d6c9e328aa0f375b68679bb14de4057b98b421c3d7030b033fe2a4ae8f6b3396cf20183073eb035cba1c0564bcaf3a8bcd3dffa79bf4223639b9a7cc8f89e948c6779fe1e984f7d8f8c7f7916984f7d0ecc987a1e735ed8c5260533aef7b7fc0b035bd39e4baa49199514d1d5e46260c579a2a48d20d06d3261b174f7245c19274c4b5b33756bbde7b8aedbbca02ed70a3a4d2ccc1d1a45481a8dc6756291d3eccbc325a7f17cc543cb223cedd74bbdb494fa9c7bdd9d4be19e6b7323f3cfcec0bc1bb613ed0889464b21d174b6c6bddfddb1fb1c705c5fa57ce5cb5b4a1982da8ddce6b51729c272eef771db6cd431f55b3be543433ea55c4019b56c847bda743f25e81c3d1fb706749f3584ced5a4ab28a1deced20f1ffefe3b3c5b73aafe18d89aad66becbd4251c4d93d35b4d3f2a45a69629d269fee43852622d656a7f7f9abca8142e3745b9746846020000d3140000180c06058321915840281c2d7a7c14000d77984c724c98c9c37112e3484a29638821860000000000002a008188010df3fbc11416fc68e1939ba6d428385c039439c70c73e9987a22a438b8b27cbd3f0ec0bd2f1f22d8870c8ec036211322c125d046ffcdb2a9682ecfd7848c359941eb62eef31ea41a0e9b0f22ecc16e6be837be6b49fb4794791d7be959424e05a7ff7975cca5eda5be88d77d379a1029b74aa3b986c2e6ab6052ce5e6d389b260c3852d523674af5e37e735140f685ce331425c46ef50458db95b84efe0fd76345e183d6e036bb9725c2e9d85b0a114569fb336e135508a236340e3d4f9a84c68fbdd4043d39cba62339f6697f30b53d7440adc6af45b42a9ef1c7c420053c20e4b87035ae92f842a1980ca84a01b4146da423fa5704e52259f53c57affb6d941f5ca24f58482a051301dc8b753579501af73808271fa9c0c101de25bb1341a86e21ba0df56907a5f7602ee0ca6f61158c2e1171b889bbbf67d5decbf929e574fd363e6f34f6f033bbe9d0ce6ae59df543f4b5ad0f5cd38eacd8882e9400b8ca96134338d0060ed4598b28d11be4b90407759965c2031640a104adb086765c590900c830007eaff2eb4dc9aeebf581a4dffdbfdee4d2df10eac3c7f2dfd6ff44e8faa60729746b02a1964910da4b533abb72d90939ff7afb5f288cbc1bb2c8744846e69967ea7750d08d87093ea4586b234ac576fb484b9a2b67f5000dc66bcd8d11629fbb0868d2861964711ed1c7088495f57397de8d4a309629a1d60c37c9111f46aaa07df2f60a789a99d601eb52b2b87eaf928d464531cc7e616f056b63c4425681df837349e18ffe0665ae9fb253da2fd7f7ebedaa7053793adc4433f30d94d30558bcc756befd89445c16753f59b64fa10fed62d23c4cbcca728eb1fe505c37a1dc8238ce0b6547026e71310fe90e73d0c730e421eabe4ca58f290e85bfc7207c840ef50cf28491560f6d9d8b4b19799f6d4d1cbf5296b7227dec1b4af47bf42b52f3b52852821db91d977c65dbb011e82fbb65e80d1b6b753668d8185d961abc42463504faf64a8ccd40d40da7a643e0f953cf77738fae3b8450dc3f88744e504222eaa0c036d13661f55d427d44c2b46cbcc2279e9fe2d9e92494a6bbe651ccd1d5af1906c83f25a542fbbecf013867219334dfd11a35417be63b4c2bf85e68ec4c21eacfdefc7902456f12be23e185e177779c3f78d9a0803cfbd8dcace043d3c748d10c6cd1fd9f34b0f55003326deb343fe8dae37e632b0803713f5b0473dcfe09f2d421053924c2eb654f1ef0897079a1909bec637fee543fec201de7c8caa3ee2046af66d309015204a001c4ea0f83865337b95722c98f149e227d09154853184e3657e2f15662ebeb3477047081690e22c62b91c12207ffbd4acc6a948974686815598c5a787fb28dac43ee0d361bbb0d3e945ac7c283e46ad40634900dc1350ff6f9fac9c285b9595ad7f4c281831772578369256fdbae12c7c01f0a86554d72faead2dc2d584589a82fd6b3739ae140685a093398e39ab6da2d3aef3bdac73a219bce352b3ed8a71a64741e8d500f011dd18ea3b2a211737d0d6b9ceeec07f7f58ab2a8bfd17484cf7484d9f9edc399df64d1d8329e6ee816adedde4596aa0ed2ce129ee8ddda18fd757f64023078535d1c109bf4eace3aba2b11e824656104e1bbbc0ad1c7206f3255041dcac6317b8cb230a81ad5ad58c196afa96b160506dc04acec05d3350029c34483d9b8990c9d32aa309adc08f7b491adcf3e47a45ad764f6024d1ec84dc78dfcf17038cd800167c74bd155f586ee9a626db3ec90c8a89cc5695601388dc52059cdb936c6c1281642042e301eb352ddb5d6a7af88ca9bd6fe37567816108c9eab58f80525ddec093759e7e9ed9d5f14954a5b9ff4cb93ecea763485445cd3ea8ca0ae5853ba7ef3fef741627d1fde17d3ebdcbf5f48bf031a2b2f27bd360a4b536e4efe4ddae0ee84e3b314c11f98ae123c429195f4fdede52e9e6a7f7c0d867ae158eeda51c704bb242a5548f92743812c2124edcae58c59b47cb3a6eb33ae1aa8f309153c7bfdc3c07f5f9129f16ecca4e9616d0ae86298611aaf0939b63e3e16cc5811e971dd290654c5506ea473c3c5a1a21434f1e1dd52a42951a9923228637f30edce85fb6e42209967c60848484b5e8db2a00c53ab31863cece850edf8ca16109583c72b0dab416c0f9bda585e091ca3829c40c0b9432203828fc4b3c3db08ff4093bc61e8b02a22a75de6e7e51fe8a4ebc88b6217ca056c90ba61ac70fa9372bfad57a9b937d3aa3fd8088df73cc272f4bd6b96fc5aaa1dbe4a61720dc781225d90b673814afa0ce53140d51ef58cdf15e7533dac44f8d8388fa25a89b94f235a44935f5e75ab342908252fe5c5c0ce5700a8009cb8061de7a99d0d6a56df6dc767e725ef29978d1e62294b940a6fe088b1b9f29f3097127957996fdc654a89a6e4bfbcd04593f2ff565b9e794030d3d9d95ed54703e7a0e4762f4a05f10174f4889fe5126645622b1e311eeef268d62ed3555e1c38529359b29cde014619720c59c0d2e8f7a17493a140ac916335708ba24eaaddf103ad728f2e7a10b77b5c9a737b76026b17acfe11e6f6779852dbf661d56762db623cbf2b8050ffa974d53dad7aaf9566b919b7774c0efb0212a41dfa65e84c27bd2b5ca9ae31ad02a34c7a00db57b5b2d81f113350a10b5fbe747f8a51f74e02ab8b3a6238e47a8b877c9c63a66219e6b0e440e35ef9379467501042493ab185098993d052fb57bc502c01e9f2110c4618c72c4678947ffaf2022cc0d86cc64634f68bbefd1b0fe8a74ebadeb1013db6b19a730a24f0409a85c80e5759d0f8d225288e0430afb41c6f48c8d9bcc1d6acee1673388346128589a3eb01e6be135d13eb4c042ad5b1fee5fc7b8407ad6a8ac11778a785105e0da8ccf8b86155908791f15f11c93e4dfc2c9617e4a0b246a3cdaf7d7c8e31800d588090eaaabc54490705670e4f726ad1caacb41120cf8062cbf3e00433aa2855a9cd4c72aaaaf9d85c6f015d7001194346ce6a9411a74fc147068890c2715d6fcd06e5d36cdb157f6e206062edce0499fc2468dad53d73bce1016f06a5d534cb4b9b227ef86445db74de10271c7a88a014c344e6911240ee78b4c1621e1b1f7a87964034a6f5bb9a7b5e8d3a7931a1f53a748209e099b771964db42dfa653315290639f3503b06347def8d35d579c9e0a6fbb0978615f728d1eeae36e6da27f945cc05c8b29d2b0752b68c04880232cef1f964e66818f6d1a2a044030d23928af467772af42de8023e2f503a37bc2972e2ebbe8cbabb05f130a2f4db22b6f4452ba201ea3c16d9737a898de8413056b292d1e93e18b393624f1b6af4982db65dc955ed442d92fb2d4c44295480a50f4a6763c960f656ab6d82737c5b4764317905846e2967fd1fa144fe84e828ef904740b2d3509a15568fce0733469a0af51749040467c9d8abdf3ec86678da489a86c51ccdf20d9bba9c9a10a21493acefb89f4124a01ae9b5c36f2a21321b192b18c7910a134bbcb8a326d3a6ce1a65a4385aaf1b0b5c1a8130b925c92fdf42c98eacce4d8930dfd0459bac17a15c2275d1f0e214bb9edd2b674fb403bc41598286f41ec868fb086ebf84341617d1c820cd5301caa7eaa34906278e4d4f4011aff783948690480b6e30b670a58955b24a82f8e8a940a2cb59dd548066e16a04ba71cb36f78394bfcd1453f49415dc2855ecfdb4f42d28849ed44c9f51e23a53a25ee003a6d933cd0781ef91d7573db0f63ccf87cf0ca26be8495eb1e06d104eea5a87fab87cd974c1e626a745ef4685de7261b4496e5a49462d3b67568ca821d8f2f65c9577f6fd594ef10a414bcfaab2d96d556a4f8fffd00cf0b3fe662de8b9d178203e0c6d861d95f4c70e8913a75b38f60ab00e3abb0aaf7b5de3629a8d448297982a21e20a019fac1db5e10a33ba3c00cc301a40af6cc506deaccb982b981ffb64f97a769b91b4de11acc8ffd8694e505899da04900f87f65d37986004c1222a81ef06be634aef422a700bf783c7b3500b2398d3ebd6024a70cd67e3ed21f1c2c27668981d293d9b0ad3c9b59fa1a2b38b32c5e18ce0e5b9ea9491807c5caf9b7405f5e6a292ab53334be0f03f8d750f7f82848de80519b34628e62fbdd9585c772fc459802705df60fe0831dc399ac70db73c6a3e542e320c9fcbb80dc4a3e29a010ba6b5bf5f4cebccc06ac54f1c33407e39a45507e2cfb3bd5dc2e451e36d7e1b5950cc3640840e89bc45c0174c59fe31a22486cf2b62dec2fe1a9ac65ee04c82ae9c3946d6ddac1a8053ec01a19a5cfab8afca6f3e0a7f9bfdc03c568a5f12d166e503659993e619d3b145f11c7254b8497961848cc62c47714d43cf7f7b84e643dd1c2c363b73383393b10324bad722fc410b60c6d38b44f009ac425500636acf2d180b34acb4c72b3b0a31f2be2eada2c785284742f21b81938ca1a52f7e3dd27412434d316947f9c2457ba69b9c5ac75cbb81ced1dbd0fa701a19c76d3942fa5e381f2c0c4f274cec4458c4987c3d8903458e47314903657956fa29af88a22cc49cc08ac33a9678c5f318d4074689d12b56c90daa79cb65e40025946822e6103e18c8e9b8910e7a59fd788c31fc30d51a9734eab0f25e9090e6a26eecbe8da317d7d8a8b99a60e2dbf698ef4bb406d391976a69f7478027dd3d5db0ca93dfcddee1b8892a4ec8eb8ec66fcfee2593efa570ee13fa7d26b7d7b6145899bb7c0ee822460ab2aeda0b219cbe3d678f6e3de043e3d76d1fd1d233497dabeaf31cc47d48591677c3033e7b0fde8047fcfd1d12415b3dee8d6f06199ec55c04904dee665234f66f59ebf7ba840220fe5cbab3637f4ffa9e8a9c59da675b25001136619807f7a5acd1319ff2ce814bcbb01c3928bbc425c40caa166eafb78278b116879c98756018b8bc8a94922f4a8eeddcc4c5c9c3de741deb995dcd50da11232bf78e242916cba97ea1fcb7ef479d55209e6c48913ad83c8f110446f7a1166c44bf180f1bbaaa104158ebbad2ea2a4236f44e658f9821884ff8f90cfee783d4a161c9a0d12386d3e27fd98a27448748ec9612ba99a66258300558863ae49d1ee342b9be15b06d4a4de1246d8adebb57ab312861647ed5ba9034fd49c4971346cddb1b47501dca38fd799ac04c0cf62a765cf339815d62915197eba18fc5959dba18e731419e55eb081613cb29db10f4769ed8c796a4fa5a2f6df7708aa7ad6b831efadc91b9013ad3c4c976ac2c3894096a117aba338b63d1c61ab4e049606b054989c751eb89c4bbff00a5aff4339b6c29e421e330014253f3358bc34926ada2b54bd483e12a9800e9297e91bff59abe75cf90fa2c53779cb012fd061b25e5ce26370ea529c42a5ee0bb88961a61f4d3dfeefee4c03480c6870bcc18e42830b5bf7028eaca7d9f6c3d50378d47c0f7b354ddd9a260e9ea118e411b644082e9a92994e94e665bca2d0670db440672c70b0027a8ac42ac6437f400cd99dccb6c74089f382f314dc486a2f5e3af36915360642600f87070e3bba4c06c6840b2179d1a1003ee9842fecaabe753511835db8df110998418100b370cb6921e37949d9771b3111c2dc74a86fe276d68619a752f332201ecbf315138f377eef90c7761d78c6e268ac2b2b9a9299ca316065f6a1b75defab79ff4aaa3d1722a406b0fae6686b6ba8ec1a621f58644ac702182bf5d9b274b863c83c7c608df188a437eb6823b2049135837851a590c1c728e5b745788eb0f4b5808975b31701f4941b40ec6e8133b80ee02a69e14e7bfc1149fdfd10a62a70fed82cce1e707e32ac6a11f59ba9ded4e25796024b1c729b0e9eb1a9e5f28f7e29ea2a7f2c37474df742470a44ddf75e180414b8a10290cfde0d97237c67395e942d233be269c6410554e2dcc5ab313af66b608c2aeb861556b383ae4629ce308778595f389b974b24f5dfb9cb8ac9019650f80ed15f94c67dd048a858f6ebbfd8551b393bbfd275495eaf6c4229bdc9bc885bad1a13312a8c6e73cfb003b18d924c02af490f4e6c86d3b8cc83b8f493a2f89a22380a5d9dea0e47a68d950b697ea7bb8f1a69878b6d870f14b99c446cc67265c2c78152dd674e4ad9ecb4c76b62b77c0d0f58655eb1b1a0144150a7926bad4a49c39b6ef8af0218c05affa96b0e31ef895f9ea0a684c072c18cdb7c3a6d833230eb9a91712fee75167242de473aa6e5b35e6782982ab068a5984aa944c7e9c85bb1ed8cbb05e5d140e0736fe3b4b774fb72428d714a7dadcc9b5779e9b7ac2c22d0e35471af7d2a3ec91bc49b5b58ed3c85e415407df96cf8fb67634b8b35901f299d421f8d7da1041f09580b2babb23fb6e8c93b16c1ce6eae2c60720211843db7a5f857c7b1ac0a4a00515a138934bbf88774314ade4b2beb1ed3f14dbbe19792a026dadd2c3451881689e228cd57800950e378647520f372b9d0b866d953312e1b8e9248cc12951b4cfe3e32940a3911efe1773dc191f220a154fef99848803cb8784cb8d8c882c8bc7c15244251553d13167e196446b554053df7da43d06042e5ccb7a30b12a6e9eaa6a988c2f6748dadea5c6ee8313657fe6ec84d5567cce4b24ccd760fe080f4f465aad8147d8fe1a317803c6d2aaa841f9e8e85983d9dd9ef13ea14b104248559a6d4a790ec178f57fbbeb14601983daeaef49c06b9658d34599b596b548d7d161482392eec030769aea81d1efc9b2a77fe0ce54394775e9b9fd4aafbd44db4cc79e8787c862e9e8b3c794e9200521abc41c4952d3ce651949685340ffa65219bfdb6d9801c26f58c9eb53353e5d4d085720e2d445b17d90551572648b6941544171101571e88216b74b077384a465568801c5e6ff331bdb352f2e97a7539c446949560dd1516b092caa3603a946218a40b8d9fe36957196de6869564abf3f47aa19e833ef78e90ab46e1590a113ee67c415576651f3e91e76481e1919c35b12d2a56755b8e5a44127162cc2abddb09e09052529cc6cdeb3e58cc03cd0e14fab33d0afa33a93e170c6a0466fa51114a1f5f3768c1f23e4815cec692d8662a0bcf136a623067a60f1c9093d6ef8cec51d4b3f65217b9a9b6f8a5ae6598004943279803464c95fcad3a3a000fc1f9fbf002f3d26873b4406d6224c261085d7fc4c1ba9088031e5b0e5f1f483d7a1a4ea80da9083a8d0bd1e397ac591886f855b2de7c375f0703b5398e0b0a3440b19f3cbfae6e09f492f4328067205035224b6a4fbc44233d78f18cb43a13970949f5834c4f40b1495b8e548efa78bfaf29955bdf5746e76aca1ac9f4b15e4184ecff0a35fede4c1649c6993bb28136b88929f0dc17260419ded7ec09d8d1e19b4037e48f57d2de6ca730eef147de7ee11336b3594356a2ab2657f2b1e720e69663d3fe36882c5ce9daa39a988880b0d1ad0fb73f660e15f6ee0e6cabbf6624669964f2d1207bbca2bedc8997697472588cfb9bf14f993adec19cd118909c29f31416200e89b843e74d79d0df5c610ac3c5f6ee48889c7e1fb01490cb1a8256ff117f837ed28fc761e81049eea7c45f6d130b29c52a065645100c4b000bd424249490a1d37b6443dd88601288d22f39b894501d4c1c8b64495c2df3d39d7efb21540f646cd9be060fc7c389e023752955d64bf53cf5da8b7fdf5552194bde3925aec7d23d1b46b814bd0ab50e82da3e777a1d6b278b71ae994a0ab2e140e14b0659979a56c2d45149dc04231f9b1dfd1942fc36a95864d4fd4da580e187c3b36e400fa8a70f193fdf727ffad0d95248bc1e2ce03ec11d5d8d3e1e32f331c047cbcf737da00bc35460330e473ef7166fbfc75dbcf387be533b00e9615d86a430fba7663af55690463d2f715a8715333b1ef6aa2e0170c4d2e3e912df3221e861128efbc10eea160079bd593ec5bf4af22eb648c8b45bee1b2da6796d50512177a8bf1025f1a4da4a144a5d8341bc40d4d8837327f36fed53eb1eb9e690396539f699cf9ac483cecec692175d619371b974e3ae5de58e2dc082219fcf1f033664986f15bfdf4941b48686c549143012e42f6123f4d8be8c19c510f3b506a1b68c1eb5437dba20277c11d94bd94a671b2f0f071c5b43c3c1dc2005007022e4c1b5c45564005f5bbf67b8a09eb06ef25b36b38945730f1d903fa8445295c71b9a706212cd02cc04c9a7ba73025dfcab49faa1776fd64cc2419501071d20d37c7b001b5b0a4b21955be26d966eb4a731ad37a0b9c8cddc0cc27def34a06a00cc8edc2d982c4eed931cc894cbb3f4cff3933b7151b71dd7f132a195ab05f9e420f3f6ee5a6bd2a189231887b9bd3b46f3a7b8864df31537c50ca7500f13692fd427ddb1453dbf872dc35c36a7f88bb69668d8672b9b48c3bef9e99e9a5e1e4d2101ae32bd079e144039325070725f0609aef3c552d03e5fa17041e3825db33711064a59eb06c2f9b7e36834bc715a4dde151641832f11efee1219db1419c1000fd6f221b4ba9f31cbad579905c6ea7dbf142c9da8950065a69819f99dc4862146bd2ce2d48c2a83d5ce0b1ba64d7baac7fc7a87254fd1ee0f762e0aa608338393eec2424f6fc169a6a6969a6a682f07a08006a03c797c0ec2392813cf6e75fda81bf6c3c93e844b61747a1c5d72b3bcc9982ef8af861e5299fca2ad589ec227ca8b1030b63a8e83e4bfdecc7abcd1864be4b3b45267731dcbe4e8d9752413689f2e1c50f009f438fb9ceb0e39296c816c124d44caa09bd2161db0f8911a094c1b487471575d552dbe1272e996a0660d2daa49fb03dff9b1a1252ecaa70971217b4533a0e7e59d8f07871c69f8ffc3399cd04af434440a8c30ffade43a287eb3117bc9116626f4c1005652d28f5468ffbf4f4a3f17290e27b06c1a0f4a37760122d4c283be28dcb9febd4b063c1a5343f134177e152e99bfda3fa150d25c15b6a18c69b8a46c953026731f4721853fceac236415266e898b105db0a3121b4d682d90f44770eee7901096b539863155e3e28b8fe235e5d474b4b0529f0611f060379a3e4f37d8e0eb397c932a01ed678d9018242fe6eb4b5d36be482b957c0d11e7ac0cd842261417289430d12c5d081227d207facc291cf02d22a75087ec0d9cbce192600c32fc62c5ed331a8fc5e463dba0d4a0711a1545b4a50acb31a43f95991d9b746d162c099f7fd8f1221224a8c416fb84a589056def4002369655ae7708909b982b4e7487b6d6089d9d0a9f7bf113468af5364ff749831a6c407cf782f2f99927150d93ca91b8587ef3223f2693fcba2074ac93fcdcadb7e89ac564c4d16a83975526e813790aef8851ac4b6adff1e1c41f84ba7bdfafa026da3e291802810610d78c34329825710724dd9a5367515d5813ed59b5c8959392ed4c462537da136ee3695e2495a737e5ebb0508d569ef820045d693719f549346aa410975f73a1b2f062bdb21da90df7b420a55a0b5948b63133ca6bc586d5c4117d8f1877f3f13832b0ed040127ab0873a05d20fc06e857fd5d43400a8e6623e5253e0a8ef4d85087bde4fd177122448e6abcf6803832ea731aa1c95fdc574f60328eee7304754f625f27681a37264897c84df8cdcdff3eccaeb95051646187ef0b716d64b5043189928a3710ff9e2763b91841ce42b10489414382b319a65ceb0a66571213ca6d2f546df4fe7d8668188389035e5b435d5d719a83d8c44079dfabd196f61fc60c26fddf345c7214cb6cdc80050a7a1212e9cf3032be97285421af45af006c4a28bf674e487d13653d141eaec1b729fc085faf2d6c6f3dd8769078bbe3aa86fb8b4258f6a344a2cec17070dfc698413a5db57ab9ed6ae9850e6b8e460b6d6c08853d287950af928d296fe4bdc7ef793f811a326f74a23eee7166fdb83971e174f140f2d243c9f98a33cb8edbc18faf98fe2637196898be92a3c94aed3de3b5a30d233ff5b4a22600a5b91174c649e5e956cf66becf2f9b741132ee7f8391ca5ef43d3f45f96f64a00b50b9e087589e5c15c2f42d57e0a95e1ccfb449a032b6f75a196323eaddcc37f24cb75a1060dffbec358a00b0fcecea97d04d09a50a578f14c92c71ae60ea816c4b8daa0e43a61c9ecb19c2b557b2637445416e91b1ac0d7c6bedf4cf8298e1d57dbbeb25a25e3321c2af5803a4d1a14e3921e4dd681ce948d9ac27b82a43f6f23119b0de4ba31108cf02ec93c53038a7163f2539588f0262eaee92e66ed030cf299fa03dd74a3f0571c66b5e76f95ba204de9d3b955354f53bc7509dad7f8e7169de94c534c0cbc3bca43e853482439b71d5c67a01bd0d036d65d76e5fe1854d0e923985cc151abed7e4ae614cb4f20aa988924f0b0bd7ec597629640001583632bd388419db9e27947ba6e93427fc3082de2dd24a2546cf3b7024f9eed1b42df7a56b588c888e88816a1dcd43df2b0793856693bcf97abd227ed703653ece68694f8d2c07495ec490c722d02331b960d59c9c0fc7ae2b55c4da7ed976918924dbef442795c2cc922f031c995bdc79173a291c0e13663f964288efb98d839289a615f8ca700101a22c7ba52934bec4f54fac46b11f955469bc14bed644e40184d12a353945c624a4c04f2f8ec36ba18b1024f4b01698c1e5f644983216ce2e3af9a85e2206a5c683c013c1e9c06ef95eff5ae4180e3c9c923eaeb40e7b57180702cefb6d368de9b81f2f6cea761bc7a4f55fa60eacb19229e5026e68e0892a7dff4183db1ba46ce0bcc19e0fb994accd11e87915984c1a508e2c3487fcf240e721b0cf35b1439a51757118b1c1481c0014e1c9d78d7303623d9ee86291ff9589d9a82c7e2d28b14955a7e526b096a8b96df6bd71e7dfdbe6a0968bd9d283bc7b347c39854eff2d18407e77e6d4365230ae1fe5e3e35ed5f49ee1e0b8465004dc2d0a3a559615b511ecb0c0d88487908ad1b29f9969cbe2935093c030dfebaca2454ee37322224fde714d23e4262e08f87f0e063a0bc9fb98fc9e2aae10812e2202da38311851983a9d9c901408159b6ddd435b87e4d29698496557762d9e16bef2b71260ea3d507a08db74187c1e8270dcda32bd8a543a47b1705df594dc0d1cff4e0e3146a0fc3b0778d912e4c8e34b56ce63e880558e2fe6263a4f5a80e963e5b0ddabd64c5bb73a6cdfac1bc260447d243aeada03a64d8dd5f094a2636bf62421f8c25d20b4b26d913508c9591420143211f55929e5b539882047029dd47d7fecd7809fc434b1c3fb8a4a940e9115d2081023f38bc76faf1dcfa48b46b1e20e6915c18ebf4328ca5f54858fc2f4816df280569903e81e6f68db31796c12d24223487aa2a178297a14e4ea390fe483bb8660f24e962dcf05687402390042d30a2c35818fa9de9316b3c79627400688daccb7d23d96e6fff42d7f63dc560675861cc35f5260f6236c922dad351e69ccc0756f8ad67b6e323a13faed0408200a0fbc0dc3780b22e7677cd3b232237aac64f862f33f64084ae221348546aa298c789a0d17c1caf968d3a262a08ee9bdd7653747dcdedddc3dfbd79be29c625f919f786811dd8ea280a060b0631b69941e50b0085f1dedd87ba954b097f5cf7304b2cf63160351c78fa4ad3396b4e58de021136df7c042e51440bf92556677cd630be115e14070e272fa0ae6a6f9fec24bca37cda4a40ddc37c9c204abfa6af193787b6718eaff64c0ebe362171dceaaddc6cdb3b88d92613cecb7c832ab7ce503aee2a0a64ded8c213b91ef35556b84f542792f9b5321002197392f180ee9a78cd21cd98333c305eb1f53372745721af6deb742a1aa622e7dc1964e377dbb9d319ce33e94d11a5d211964bfccaa969003e1d533537ea2e52d46f98bf8917f57247a4fea49c91f6711361f04bcbb320dcc97ccc81c84eccf956111de122cf40fed5e855841a1b4546af842fcf0a4d1645c3fb9505e887ccaa61389e4825dbb23ba77335633c895b41279e46279e02b18e96f566753825a7fe98c2c62fb9527edde51e43ae85263a1ba44096ee8135f2030c7efaf90720e8a7cf44a58953d3d6903d7390dd5dabd20ee242877b680de21fb206a75bf68834759d4a87d31dc2719b513ef806da4519b6271411bfe9afc5b8f7b1b6a0cb0ff02895ef908066ef2609a9730be939a87ce91cbb273e7c442f724593e24b06a9ed26d1ab4a009e67cb218ca5798f35c26ca5b71a2b065c7f52070d5f5f6ce7389f3654b49e888bc081df70334bf20e2c7b2276c07dfc2dd78e0fe6f260f2205c60f882f14180ff33400f5b9badac39d18f13ae12cb7654028ba0d88209d560d02dece6ca161f31249b7282b149b84d973de88b45044d236c23861fd6bc3884989f8a667dd7226a65b7419a1be57b9f50d40c73006ea32745945deaa4a7cd2cbbcddfe101ca46c72129a295db4c91f21895fd63dd4bb9cdaabecd500475633b252144fc64b93ccd6815bbfa47e73833511ac69fd38559a9a08fe6bf67e6197f2fffe35d51b0dca43059e8e54d206b7ff5fed050e71462428f233764f9cd883067ff7477984140b0acdcabc8ed97b6c001a6bb506571f5989e750145cd7182f8217b1e786469987e171b8dfb6007d39873a0c2088b278a1957d20d06073cf723b09c01008c52f118d5886749f0625dd612e5681f8ffe209a0124e6d0df07a9aca39029feb3de5840e3e61754e319a7628628ecc7312b19ab64cba12aa665c25348be574315432a751907eee057ccb1655b97718795713db1a76ae05bbeccb77395c9318e8fb539bc6790098a7190775ebfeec78ad4fca06954db4a18275fda419023f85bfd0a2fa705d335333ade35d661170fc0898a8f0759d3b2bd097a2080119db3d99493a626e3d0c5e23e797225824442b5935c28e2223020639764006eef088eb8f57a9d129859025f2e1d5cf16ecb8a6bc6141866192d813765ec3c215f2cad6c0de3cf190d94da301551af1847db2e0796aad32049ac830c25a10fe15fabe4fc74af39f9285fc19d6be8a76e55b190609581c8d070d0f708b8230bd269ea6c1f2d7e9681009511c0c9d4394a90b6548963b35399633bbb9b054a6b36c44f28cbb1860b1fcf65998b991c981b528b27147e7000001ef66a784360cf301a1bea9274bd7ca70baa9ecd245bf84fc825de6e579c629aee8f7ec0e867b30f742cdc2e45a9edc8c890b5075a8bb4e7c2df6c7e4a4159c989d941d59451bb67695a00dc60474134656936efaeaff697739af4a57f9272a9a6aeb2507b4b536be4643ec2189681bde910fe99dca4479c6681937a77e4f1432261a064efdde8819d950b5b00a4bcb1a4eb5b1a696ea43aca006ae917eb0ff5922430eb1f772f6b97ca30a578b4ec97585ba188025fa12ada180e563e3387a2e2d875e6db425555f31b79dccb1475a24fed96d52316aaf6a5cd932f85cb107c7f9824835859b396ce9302b104951c9c736befb0704ce8f5947894f4bd204065d4faa47f212dedf21149a602d261954d7cc52a896e81d7b578b381f9c0bd7694ccc7bbe1806537cd04354c002680976308d4f637af2d4d988beee962611a905c8319e3d360445f3741e7977eda96c0678465a7e08f367be9924f75bfbdafcf078b89221532a0bf145e6b5b9454498d4b35c2f993a346b39bfe603c57969a17083a49d724b09b6e2b92adf050c6e40aa8f90d38b5bfe7a3385764c05096cec3adb24e6e29fed5199b2966911bb70dfd6801ba3288ad9728f00ebc8aa431ee24fcde9f0457780e88a57a7872734befd65c282c5385c13cf1b7e20dea9f92ea843e015f2553c27a8697e0de286f011d7de2e5f185bba452553ee65bf820a04309bd75dcfd79eae5366060f09a9836a0723c4e9beaafd9f59ef4c2adcafaf8d0446cb7f84699a7efff1d32411d807e771e2e36b7156613f36246b20cc94ab67013d613b6b38cc7799445b435f1f8c0ad3e8d2a051575de7f44e10f00f320e664aeff8d9fc5f4ef2eac3b64a6db536b18d5e135d0dcd30746fd57fbbfd3c5c26fd1062e76e9594cb2dcc424cc8145025b79eff727ddfc86b24e3bce3161eb5a3471a1a60a12333c7c49496ea072ebee09659f78f7ad3dcc29bb7dabd0b1a4233f623519f32b6604c9feb7391181b2f6d304024dab983b833dccafd795e83f1817a87d00618d12008456ff77f440214ba82fc88143e5ff403c07a82a3fb39ddc2544d7d45ed2ffc267034b3a60291be53480a266152a8a30c16789d4f90217a19f7e5b4fcbbed992bc6b064bf494888e01b2b91d04d362478b4f6a653f4b7bba916655cbbebc8bac47745b9a16e34e4c709b8b05ecc39eadb585c847a02bcc593d964e63c423e414ead3113cada04b6fd6db9fec86f951f3a7b51193ffd63c8f81dc27106535c05c26c0efa52303114f43ac43a16f757a8a9e67f4d85f1f5cddbc190dc4f58f6f6333e0fc847ae275addf512e75c638f9bbef4461a0be4eece9566d315e9aca6265c8ae288fdfcf474c3e4fe3023cf1d4fb04e1222aabb1920cc118b7f489da1a1994649d644482b00764d04064ba7d23f054957b666d8012eae22e413485bc2a8d3ee75fe0a8bb80582f50ddd3f5d6751d44c63f76344f6d220aa133df4de18d86b5df2fe00c6a2fdd0233b1849b5a644dd3fd3b3d137f1a4597402c6faa9fac072a9f9c55106cfa8f4a36d3be334585445be77da1e8c072b20d8da1d464ec5053cd0b562f183cc8d8f1a1363aac40acef5dac70985f2842507870bf9dda91dced1a5c2c9a74eb0be67ae46e4ef49945208933da97b2a177ba5525859524f4c394295cf25fde937e1b4c02441d128a4345dfc4eab765004af4a97e88343dfd3e93521815972bacb25ca5b7226feaa98986cb2a1d4fa6634f04232adfc92cebb9f66b7bd5373c4a37c323f3301fd88708c52a01201ea30e6194ff2109128b318dae1af48bf420f4afa8e5b18236acd8717fbb265a7a72bfe1c631906c4b794e707b5ba2f94d243709a599da6e28724bf5a080b193315f9bb3f268f3f0a2980aadeceb715d091d83b5f048556b8c65adebea09ce19c6a526c00f44f18cd92a7ddb288bde3c681a513c099031b9af5da8f94388e36d31097f1dd3c128b3a88d941841c5afeb9cd295752766d3e85353ca02e3fada6f6c785d63f715bbc51cf480b4861a3feb90280b8b1276aab953290e8c30654f6fd3d11a6dcd1891dc51e6a51e5859a49c7e1fff56aa0fe80d9eb4d97cfca6490ba583f388702a3a41b23787d1b4d6aa81546e6eff9cb013a3fcbcb115e3fe7e068d8b21c420dd364283e4f1a36bc68e9139476546dfda5982cf3aa138181aaeb04f7d2b2c49276e90ed4d438214bd8d471df05f61c706ceae72ce548023919a98f7fa3169d0d467f982154a0f714c1f7eb547a58e98b57f43c4c5f33f6ca381024499232988d1b58b565ab2435e6cb9c35f25b1209669968f2f587d4a73aad5eb9144dcce87c224f6e78cc906b9525cb50775048c6a36263452d3af46260b8f72a15036431a1e6830fec2f8393935609f21f119798baa429fc4a201fd789dbc597fdc1691e8114849d2451cf3772b9178fe2712b59c9745ea4b8cb103924d3b7db400e3d9ca1bfb912daa478008c21c2345ef9aface9f66000388bfadf97ac2bdd523d7da6f48f88e828bd30a5bf9e5751a096e5de821a194d30a48c430c34da648eaa5bcd34ea197d40854be0e927de87d5e3a93a8519f5b56e7a978271d207eca08f90e0197bff84adb1db5c48c1c899540f2066795462ab2d86a01870eebea1f67cf280b03ba5ba14b0ef7cc42ee7083aa1f373386abc9160c50262d10f93556daca5a180bd1213564d6bac95973d0c9519c0d8559b38a2b334645a554f2d563069e7b72e3d3bb89a89ddda15b31c30c07c373e39b5e674863b72ee4e1fdb42265febc6c16a9df5f2f8819fbf7666f967007effc78408f46fe50f619187349984d3f59c7ed3b46f27bce1d9711ce83e43a6f657d05a47f3f5f4ca39da20a6a947ebeae524270ef6fa44fa952dce8f527eb6bc8818319e73b05a063723d673108e2820b30285d8f83eb689e2eccf6ebcf2ddd63e313bcfb3e9497f814993a251420e79efef3004cd65f44cd16ee16c4777dd44abd9eb8301342b3d53ff223973471d2ec5d2720810eb5e1da51ff9d583e1deac8d97aa84da47e315f31942480d10b8e3f7aecbd0b160a11084df7b12259a0d99ddb6e606f1439551202b33c5bec2016815ed70de6b3009901855c7a3e90c515a8662bdf4827a25ee665ca178c151ab0ef90f464e42b9cfc00fe404e2629087cdb0b57210d77238fbba36f7d53bf5d302580c34805f77a32ffaaa06df248fcd36edf08567e5c99286b0ada10138bb8db9ec1e7917e5303eac1d3b7165aac99d97095718f43d1e1e21f961c8604360639657878cb8d2a988cc6fe14b4838471e93d9b5f4000d6bd16096b047656f0a3c4a6fca24b4ecfc37a1e300fa3b13b437eb3db4112ae99913a82eb91ef2dcebc719aaefc0e0301a1d18c76b31ac25d20d8837c504df01834f6a7a03d248e4bef6deb4e409a82fdbf2cc780073f4c748503d9a881cec4005eac9951d46c53b792d3c6c732168496899510370765aaa9ab611210a35bd7bfe0938d4a685ed62e1ac8a09346973a91a5a8c939eb7243388edb0db00673a351b1733beaef82776b4b567812666fe0114ee0617e2340b0d4f0d4358080c7a09a961f25cfdcc539ef61621ad90036cc9e15c009aeb6b252452f3e5d3f5d3094ef5c23e793a22fe130e3898f7632c0278ad9cf005ac99510a95d48a03afdc33be9ff03cc32c40af01b2832ea1f51d181c14b186f5d155afefd093e31f94be008be92bc005260751aa4d83009b20357749053ec65d5aaf98f595c1f185807ea0ef0ae10572e683284cf7f4dbd88b4def0249eb4f946a578153bd4866ff0ffd085d7d6768c37c65732b9355e67356034f17a9079541f243c462b031951cae285944be967cb6148781a62b03fa70a7d4dbc7a1a755c2b4d1e90b0d47d97c14c3272af5edfa3a6fa87f3c0a80879883c2a4cdc96c406b3e461c7281a6c26a1ea040428e70d2e74caa11eebbac4639f8decc0edcb82ce7b68c590a9b4dda57744bde3d7cdc9e3c274ec5b73db9642d10e3f47cccb4614017154daaa39991191e2f27352180cb10faf3cceab4dcfb10e5234038d9f61c4e06106ec690af1cec6921170f0c623e4e04337a7be0ef7a0ee1230da2734211c5da6a171237cee84686c0ce14fc6553531cacd0e40bf13ab6a12841f6833d39481fde961702522b84588f44be52b874fe68e5fbb461d716d7a9b49a923f02208ab0f55920afcede5c53f3ee39e083c9e01b997d9a6e0f04021e8678dc8f6a3648f8783e7734c6cdc9b8d7dd10a4e79435b3fe402733bdbd137db27667a7266538da8747be52d6c9909721f9b9a13bbeae1c7b014423a14f18913403b0b1bbd2ec02f1485641a9286ebafd37018471432318e0871b29d78683042d07c6bac0a083c06014dee087606b92c2e9219759d7bf85673c7a398e72682dcf681f29cb410db429081be670285e91eb4ac28c70d5a9504eb9a502f6382b9f6f77c250808b97d1f5071b1015d55002acf2f9f3a09681050c58f9b70deefb7addfc0d6b02057f60426e21f6236cedf3d9f54eba4a743f5e29d1139ea8ab6681c02bc728848c03e290bbca49dd959b82ad7defebb7c9d789696dc215215cd533684f108c8d24b2016cf0f39e0636645258475393cad28f784371b83c5c3f7772a4a9f7dab0d241694cafde3a086230b668b27391220a6af86bd93c4264d9a1b676c320626ab14187f51caf9a374a9961ad5064400834365d01f6f43405128d12353200506d6d3c3bcbc184c7defe8346c67f45a8fb83b1b679cec59a613f762c992583b577be8082fca01b3b230b4546301e02e3b389326ca9eac9abcec968451540b68171a2ec2b6751f8218e2063df99b88ef45c76447dc1c6a6bdc886ee0fb7322578d10acb78ed89f2a9a06890b80ad54e0b48a6dc8ac41c04c35019f06a57bda24a7866e461ccf5055832ca556880bd87a418065eabbd111f1f6006dce20aa55efcda4387ba4ab633d31679eed833ea693f82c6c6fb7a9b826fea1b3d3d1655b442cc4fc08eed39567688d5a10178a766d115b21a1f2e59dd32e0f7c6a0d7c4f06de1659aa683b09962e31a863dc582b2946a1de2fbf5c5aa4d01df379e4a7b78ada380cdd52ada2fd737e043546c941d1407e156953a217cf7f7711aee380bf4a8c6bdd176efec9010a614074131beec2b52718696f623212a6c01d18ed0e23c6b8bbd3fd63e531999baf804e971e1de1e4dbb439446c59f9da1b097a2a95ee30bd0b2c7bde9a7d03c46d8e6ab01d7a59e5267704fe8d4668b5c82fac7192d91a60d547b123dc8a8255ab43672412f15b0f1db95f0479fc2297017f4336fcbd9faf54bc5495a22de5b0d359c6c33e872ce0fac226d0a1fd042d0c6448282955b92cbefe9844d7cca12b4a19167461109b20552387d25d3a7ade56ebb79441d50497b923651be1551c5eac20100e88492a54bbcf211861b0e41204c5336671b5123d2317e45489b45abc79fe55e0b5b9972d21f0199994d979e8111caf33ae07d13a15853f88aee26a0460522a3f9615954e35aa7a3d9fd064951b960a9a15914e2965286d56639043f5d4dd29a364dd73414d0643a9550dbdc940e351ede8c5bb304db3158c28dec2445cb016896227985d7588fb225afad8707771f0d78967d2eb09f6efe21c8c648cc8867914ce68e5590d396c74bfdfd20fe8aa53cffa8b14b3091d466139a97c82b6caefc0ff078818a18f8ec208c20c84fb214b2fae3a80d2ca189b181d6f2a9850b5d79920069086930a0298df90a71ab052d52fb2507164f3c1b7518c71fbaf4ed5e12d4dfdbee5b0199f4b7d0cf1e237352891439c9aab3852ddd268f52ce00464f03b6443aa40e4fef5838f2f5e90f3dc05d52d8a9e2d7d279615e5eb321260fd19105023763005ca06728d2bbb5620abdd05a5cf0cc8c0c24d8ff86d5ad0223b3b243bb50ca3fab25bcdc39760c04d8f2a0bf814f19c68119b5c8f0fdaa0bf7aa75274cfc30b1672c1810a7c42a0f9ecb7c8db58786ee6a34b91f792ae2f7a19085890aa653f182c844819aeb445b387341bfeb21129731307fafed2e5177b3664611e9b805e242207a2090498f8d3b41f7b4f03083e21dcb35713fc0759fa9ff6f67319c2f6377a7a95895e2fa699737cc390bf02d15be435e2ef4eb4678aec76e69264b880090eb241c04488c94ee9beaaa43e3f6c40d6a8d637a048477170818d598394c88540d07c155a3b1baed30fd878edf0828862e5dfc9147aebb178beaedc8e3919e2b33e5493cfb79f8c39267c8a8ed757a6bbdf93bd0d2ba6e643d076fe1fbb5746bdbe755cb2a665cdfad65fc150f7058cb38e7190095fa859f9d51abddc858cd2c86330b585d53f80d717af937454e00f735ecadfc0ceff89c2a0d9e196ce794d25e8d72a55f18bdde7fc8ce1943b08721bf63789929805d48a3ab52276c320006f6ac1e0db86b8703ba61986ee8950a2ed1be38a44defb2db55393de7aa1486a1e02cfacec5d1465a63007fffc92c5af01fab2c09451eee72fdea689806842475a2a518a982df3aa8fe691cab893add33330d7e8a17e1f3223a4b0c414303b7415d90fcad51693565eb4b3fe26812a25befeef5f5b73fbdfe182f12bd73c77061949c82517d30cc1e22a49dc6198c4211af38838ea5b622e5515568b297eb1eeb2639e09582b1a3704b2d636335d85e916e08a53b1f8f175155a098cc6330e6307c7466f8e790833be31ad2bda23d935b7fa5f68d74062a8f1a18c9fb7b0f80392ad1f78cb5b40f61a7220fb79caf4b80eee42b0f6c17df375e0b4fc9a7100af0c9c976cd33a37189c9ae39d853e4e9603537be8c69a6eeff1522f4238208c0beb20ff3d474a47196b0433ff0bbe60ec47e1157bda2b753de0dd8e0784761f146a80949dd0bbf526b87879ad9320635b3bd9df280018b3dc1c65f7c848dde78b2eb20e7981a9ae7ff7a91f2a8f5ba347680408afa6b659749bb26c9c48f72665d097445d2e7e4dff201c0ff010f48fdc207837713eea25af7f158f73eb610e53462024c2c9fbe75ccea90d13bc7f1e448c4b36cfdea86c11641f7e1922d00f2f9e1d4864c91d40607c97ac8e2d8031ebc7f5ba288f5e1337dfcfeaf0d3d5a12019c0fe4c76371811ca54069801aba595d32d7538ae73707f3612655ff26c88d4cb4d8831d5afc0833563d4ac2039d2ea97363434801717a8769013c11ac0ed6ae54b034d4eb059503c60106a7e21fc60c36b599fc90ef24603d84dafd0c4176e38c3ce392f7fc0060960cda47953c2990e57ae671ee8378368294ee13b3d59439897668c106385d9decae81d59278fad64d85ca62f08228ceecdb38bdb70f3f1197f809e9a9a30a6234447e6526f07bb7d535471cc348e7012623b308df1ac4816a19b529cc81bbba2c438872b0da2afca4d3496a304c56ad403a6070ffbad1d02dca4c3b05d90f54f1d82f20c09a1e05c7bb094bbe282e06ff6fb91bd5801229eaba3c1d71676d787b026f485785e9c17993d7ee3a27d53736e86c814a754cd144ffe2283c1359bdbb09422b45c6d29f592cb46da5285927d6546b4554da13cc65ee1fa22740161bdfedea00c7466b2643f0c3005eaa968856b49ad193fdd639bfa7d1e3674c91c92b9aac2bb01bb26b0a6225e6da9ee4f4ba6dd4d75d593ce761abf0998d6bd6cd2d9d54eaced69b7423d572862cb204970875912faaf2350f53e0a0d36e159c77a6f91603a4902b2519dd0d93b259571604dbf3d55765335dc752fc94b23599b08b050c2ae0b5448f0f97dba61425e89fe7d4f692c3e57d0838fca8777e9b514e9af1ea5b4e804608a616539000d469c7d6b33ae34f0f729c360f204f912944639c82ad312c4f31eedbfee0e00b7834297eed56e23388fe37b328d8ae927b4a8efe216611d8d97d8b835619f899c9581c2e427ec6915b2d2a4ebcfeeb0bfe9f9801f4c0275d10144548d8bd19c13e712d93349e3141c881a715d76259441ce4a2195ef70f99707f86991fe35b0a36561d9b11ca3fc497f68c613581ac83b8cdcc3dd9d1bc6eeffe13dddf0f6b95c135c8fbae10b46ba6fd8b91b427cbf79dce92b382b5142dc4469d28a65ec97e83913bea81ead74abf065ad254eb6d3bebeef60a89f5a25cf5d00bbd09ad583fdd17e7a6f186f8179df9d91919469b5c82e9045c8dcc59aca244253ace5f99963aa04ec1b91588041aa28566a89a220a3da54eeaeb5f889d87c1d75796bd00f5437b901c80da7cceefa3254802e8e2d62050984cf78fad896c8178049d84be4b4e1d6a1960795bec6df3e9be32b2c7ae6d80041627b398600d9eb6b7d3a25f718d40b5f18f5384d27782b4de90bc418b5c232b1614e4520b9fa6b47f5700806530b95a170921e1a53c4fdcba30f9aad59ac8b28710208d5860a529e1a1ae1208dac52ccc0dacdba22230d71b63b32c857fb1ebfe939d5fad572ae0828836a8d9fbfee7b880cd3a4278e5a3463b394849e731c6ddc8387ab43e443f6beac6971730dc49f700632d089cdc7e00deb0593caf0ec76d05df7b192f73f23184d42b4f7ecff851adc419d75c077eeac863014de8a58f9fb325ca546421fbad6c62aeebb8959f51e7a1ac9d29b9910ada085c85d5f1837e1b57ae24b4b93f5df9997cc73e04aa36d6a07e0d550ae270cdb3be37da01e4af63c3931343b912cb7debbabadb7b522d5541c335ef0a5d0c712d1e5d38de53f40df5585322467df7845f810c68c76dda9da9fb5a6b7d92fd5b00e9019dd88f5579c552ff95aa491df6dd2fc09cad9ee085f17ec652a4a385ee91732c0557620bde0b8b1a71d7e6103a8e90330d7f82aa9872d9202a630e76ae9c1737d1b658b124a124bb19e866afe9ccc25ee99b0e00a8214fc37ddd4600b27354bb58b332c9d6d78e690052955f4abb8cd7492714c59e1f1a848db44fc601834a812196c18189c36c1fa60299c464e1b246264be61436c4dbe08be8f782c1d1383b32b84e6fdcb922d348c2f6273c4c8ee0524989d1646388fabdbdc56fda910ed365a5cc8694d6bb314956ae4b39dbf999381cd7623de15b9becbede367f99c1db1d373769d30db38909b162e4339603e18e8fbb08d1b416463454ba419d9045a350749ce859abc5cfa94364b688a6939f88b325fb96301319cdaf405354b9cd62f8dd2c2fb9b90189a60bf9ab11f3108cdb9bf0fb5d7537f67aeead166028662ca07aac57fb86704e0d83217d64bd7fad12acf24dfecd197e25ac6bf9cbf0cc65c9bf148ec0cf7fbfd71dd6ab89358a7510a4f014879568fbc7aa6c6391c19f026879578348a59c7d35786fccac19f0bcc5a7d790080459e0b63d50606a551bce726cbcae2c01949aa3d35d47a5aa461d5301fd0b5069c03439c8304e5e76258283ffaa5b01f32505105f740db868ff561dbb0a45b2e2b72362250481d05083b10862da728fb926bb0b8ddc35de8cf87d4169562febd1a524e9b533ad75b41e59e1c8a7c1cba1c9fdcd16eada51cd5d86769b9073a9c442e7acff625a7dd10ade5c05fd17f1079c86334459d97ef4ba29007a5b4a64d804ce84b38bdcd8e02c61d1f793d50c60c7578cdcef582ae4dcca74625ab6eba6a2828937c2f9e6ea9a56ada503ae4d900b0d4ff84f7b01c51972891285f8676c659227ae3861b0efac63ca07668524c3264ca2d3ae502a0a342f60856bdc840d4a0d81f4018378b36c0cf7805f6b52405f25a29b75417622f25eff1ea2337f286acbae0bfe368d0c4580b941eb97328ad4623d743de60613f6cc48f248905479e7467abc63b1d0d232c3cbdd3cc0b05a7d93b49cb47e1bc20b05e4be2c807df9dcc11ce60e8f85c6d8b2cad1e9fd424b5e65078c778c41de4972bb1136dd8acd57fcc7f5f62d57585eb39d43d807705ddf6e0b25bbbf0ad35e417c713aaa90d1e75a3e9e411b583137f019b9453bf00d948ec7e9b88bf6e193e0dd3f8286bec8f32ef8ac2c8588858bab1c984295b7a44a0f43be0a3bdd44cca25f2c6e344304047e94ca94bef7d4567f71e1cf7660284223276374c01ac173b543217e095f77ed05cacff9b88752b540c300f6ab1612f8c8009e470f8e2b7f3853244fe9342640b5705949f58279d57d5a41e2b73ed2942981cbd13e6aaedcb0cb56dfdac427700bfabe36698f757af72b8ad9ba5a25eed143c1bfddaf0f0a1ad613d3857212e6a152a0bd13934a7f9fd567a5230516468f2deb78fac82a90909ce81073f2ec935291c3f09b3279609283f490fc758819e09d92de5f3ebce545a35d564e576f67f45158da1d4646f8701bca2063db25cb02a087817da464a2a48102e3877e02aeea535fd4da1651a1dd565618dbda9c8de4c4fd77c41818a9050688b2578ccfd1b4e23c17de61ac40ed2d61167afcbae548a807fb67c010eb26b9fbb4ce3791f228e70e06b48e8bb44086dc5f4072352bdcd1456582f206bb3c078d09787ab047ef547eb688f07e30c7dc30870156bbe07a2cb6f716758274632606f0089d4ecf3d73658cb392a0528a80f19779e538d600323ecab97a0e33e9a25d1817902306e131759c315b6857453287c0c46930b4e80f0a7fe4ee082359b21a222a1bc1d4566762e9dec8f5dae24eec8ce4ae9b51d492a20e4f923aeec1b74660d4b5afa370eeadd288e63943c6c25806f60a77137546ffba9091b0ccaf2093b6ea353abbb5cd03c56ca06b08a4743232cebe01817d8f75aba377972b0c7386814b35c940b5b1243e75dbe67d8f434ec204223092f4630adc1ebce4f276c2604c0b9785106138d63df3fe69681d790d1a054d1c18d4ecc2583cf7fcb087d5311404e5a8a51613f932174ff93e1bce5580b80abc9a025281091d46340a90c63a0ae926344f531487a6dcd78a6df4dd7fb8b419a6c9d2ca3031aa8c28b5d30ccba9a0ec5922617dcc1ebb501475a21a6bc70491b98de1303dedf668a235f05dc25451a34654439ef38be72d3c3d1e6cea9a2f3a7aa3040a48afb45665745254483e64dd3bf0f21a021ef8af767beef6fd2dade7b6fb9b794324919670867084508159ce241391f8a15cce82573d99e4721215b0e69f32116492f872d7b82b1e7130e23ec1d8a6c5761cfa71cc4d0c721fdf555917376396f38e47c05a91b08220404bba6b0ebcd3b8edbf88d0d39a72b67a753994e4d3913131393eaad16325f2b538dd5e9baf47495313131c9549ccd76739bdf820809827f88030df156557df97d9021df97f3f6e921425c3349fa97ced70f5299aa4e22e71f80ccd720383f3ecda87134b665dbbfdb6c1accd7f82017e69036af43dedc5811799099f7b75a8c968b5aa53a3950c5189732ba36d197ffcca9413a362f833ada88be74727490ea2269527551261a5d8e32bac4b54a91677454ce5fd6589783973dc3ecf944a508ce133991d3245a8489ced3292f60a638207b782bcc2115e044b3ba847e7e5aadff71ccb97e2ee70d290781726f8abb6a1512fa11125acaf4b9a319cf01e3e75a2232d7653ae21163cc43a61b7f0d32027feaefbcc7737e9f66e1b0ff8d7bead2e777d8b1483211bfc683c4af9f45b2c75d78f44e63f14642f0e78526267470ba56561a0511b267ed7ee62df339dd6920d3b6e72cf2965bcd04ffc45fe441d8b1952157ad80f1ea3ce6398e35dc98c70935720005f53eb814972e5251f2a42f4f33c98125792b47d3189d51fd64cf9f547bcbee40d2d122cd9921cb38214f5697e9aa22fe39ef794e0aeef0f01dcd2ae2f99de7016f686e6e6e685c2c0ae1b5f3532ce2f91d6dc4d22c9adf791e2328453ccf7a239da74639cfa3270d196408c9d344a6bb88e76368232834cf13e38f5e34ba88f53bbfa3ffe8455af03b3f027ded3c110bf45797b3a6ce4011eb6368a30de60b5797ebdc6258f05acfea22f5cfbfe6d14444a014fdf3b09ec86b9e8fa17d54d78e26b2f33c12d8d19345b2a69e3734f3e666ded0cc247b3e157948223188fc5bc062c578124a510ccda32d2089b0b4479f8764d17c8c9faf1d9245a3591aec3ceb79f07c0ccdd2af2745f67cfa379466521a1a4a3b3a6f665ee88d66d2190d79c81d92488c67e9fcce4b20e7799ec863901a5717cdb348223abfa369e88d2e799e88cec77831e7795e7422a6b5e753932e36bdd5a0185fb67462b030d68941d2a51f37dd79fa19c88393a44b3436714c2239cffa1d92f544747ee7a994148ed40d95da8941ea3c0f99f3536469a0f33bcf43e777348f9c67fda4d134a665c89c8369ce5325a7b11c927271973f5905cce2d0db796fb5bc2585e3230da494c65458d08fd14af3294c1b3594066b01be699ea563ee3987687e262fd190b5c8f4a15f436dd414260dfa744697350434d3a7359cc77ffab331975c75d618095c69a8a555afb5d65a6bad4cc250e7ea129fc5037cf1411edf8f19c4efb94ed0ddedc67a02196f501a9235dc55b1cba02293d60aa91a214170e74136220265e6dd841944542f3083beba6acab905de4e65a02eac204e2f5e359ab56386e6c397919973cefcf44b9a65e67c99cf794e994c43ffc7ff0f22c4c8c78cd498a5b254760e09aa770c31761e78cf3d11d5ab5eb45b728e4934876ab63f03e690b7c73999f0a5cd73439e7bbe549ab5237c9f2a529470c4fc11e44021777b4fc1a713739cc8fd383a753a6e6f15f520f248407ec99c95166a6cde62e17f244b0310d4b3ba42fdbdf72c1edf7bffe9210ca82ec7f97ecfe25ef5472f4fb32e0f56f7e37bd5177dafc29d2e12fffb4f1b893a08a82f77b923a77dc31d44e5ac95dcd37d1fecc8f287d57d24abd33c42cdc21f3eab7bf18f5e1e8b8766618d9fd5e9a2f0456d04a57ba30ed447af8f7ef0b3af2e77f4e81de09da20ed6dcf66a16fd72d6e8d482fecfa169abd17e708cb9734f054a5d8f53e720f27c23a55b7da54c1f865cce5a8f1e07b0f9b2c70e4bb78dced555675ceefb9cc39f9a6c2197bf417f7fa10c727e19199907694d4d4d4dcd1fed1a7286863cdaf4ee194d004a23d778aba7ccf8f14f31973d1867f0bd05eaef896a06d2336d8fbbfcfd26230579bed338e7654ed81caa2d6ff5a81c9e400298600c24597cd5ff84b5a6227790020075eba706f9f8eabcfdfcfcd4e3fc580522c6d179297871dc79a794cd49085b4af0e18a06e8a65fedfb73d0cd2f69be317dfc9843d5fd68535dd20c4c1acd8714752a66d55bf365a871a0f11de87bef6b70e06e0f480edc8d835f4562ee31891f879c791539f3204896cf7a500764913a640e39a74b66becdd3901eccb77970d2d8d0d0d0dc7d43f33536244d8d98f34a8be2ab4abcc3f99ffe911cc99ed68c1a42b46cab8c29b91cc739c739de382e019c3f7b621ea3b573a649ce9ded4fbb4c707eaffb3c4f5928b6dd976ad26cc81cf222ef3feff1732c0dc0ff5e02a09680a785b86f85dce99f96c692e7972d1c5626cb0586a6249854d75a16955cfefc30115fd4f993a2b69ad0aa7c9a55b40d0ed9355c7df82a92a5c1eac3950e593c444a021977ad1f8c1bd4e58e0d64dc5de7e9ec2debdb3748c351fcbeea12c8b824cf5de6397acbdb75531aa30375da03efe9db0781fcd8ded34969800f9640c6fd7df71fdda08f93d2a8ef7df7def4967f4c545fe341aaef6ab8cbe61a845ff6c7834106152239bd14402e5d6c5ba06a332c539c644f9230c59468d294182f37292e5136da6ccf396d92284e2f66d25470d3443c6923793e408a0c14e61bc9656b0aa1e5219583214186ccdb10212121a1214184dc820819626b90213ecac965bb73e9600a5187c900ce9eee098b11d410eae004f9870f4c6f4a18e7dc026343cd98261f64c4f063e70e358c7bbed39eb40c310224ea8fa48f15b9be9d35deca795e1921c8f4e73741f10ceafe665fe5eaa2df91a3eb31d32c3cc9db3be77c3badb5f6ae6ec77d3727be42ba7d6fc79153dc2f338932c05bb5ce5ae7acf34e3be79c13055b6bcdd95b638db7eaf8f3738d07e15725725d9b75d639c588961662a081d6724d87f1e8f3bb3927ee640c81a95bd1b39221b79eb4e2c7176cc894882cc3c8c4fe018de145a64bb116688c2679e09772d9836589d326632b4c1a2cd86c537559186c069b59d8ccc26616366b22d3a99bb764907053ed404377bd12b99cb01ed56dfb615b9876a5f6a9f745f7056e194d7269c19e2419e791abd5a095e6a654535c4d9ce26ae11457fba6b8da9411d989da2e51b9be6572a0259b85b1a5551f32dd5cbc55bb484d9fca79315dd56a6e0a964beb54dbdcd4ae5c6d3b3950978a85ab511bb689d2a8514c1b1d501af5837e385057a5e610f7775251a718b7e428efc2843113a5b3aa5845f705fedc4cc06d39240e26666afad8bc55bf036ae37a3169d4af5bdc755740c5ae17cce865d7e7b22b4db25daaab3ebdddacd3cd3addacd3cd3add5ce64cd68969774c9cf8476fad2e52a95e0cc53ff2de282c0a8f9ea8c2c96892cb7a67170bd4add52099b7b65ddf3a554bab41aa9fd9da76a95b0dfabeb6987e698ce524298c731ec77f0ec95bb5e438981279979cffd1e66033651e3919b5b134673427cb7a756ddcb57132991179cee6d75dd65b9d554e565df53137e33e094e46c1e92d3b9bb1e8ab9e65ad18beea45ad7a2222c521cbfb30b47615eaf9b29a45f59c3ef44b9f85abaff9c51aab41add68f63ceadd6ff38ca623333dae803afef3fbae5ce2e964b232f945f6bcba49591d689b4b4a66d6dbd55579daa4cada58f8d49bb3e0ce39cc7f16b9d7948642a65f3960c156c5cadf39514f58605164eb3d96c369b952e639a61ecb719bdcde8cd6b22d74a4295aa37f0e7f392e99e52f5bb881b8cb01a3366cc181ef665b5d1075eb53e91db29de72a95d7acd69d5e518e73c8e4bbee42191ad936df296bf0c156c939d551a387b26b561bf14aa957e65a25f659b665b6bd3a60f54ad2e511a54575d0a3975ea692157cfa272d6d65a39ae723adb8c33ce18678ec6808ceb679cbdf5b80616ca00d32c0d6f418328eae1ada794524a73b05f605c6606549c39cb71d776ff5383ba9f5151c85f98c277b2eb2182a00782df78f366f8148681873bfa8f45b6df3d7d20de83e39ceb541ffe286c485211a50e7e08f93c1c9233dcf579b88b6cfd430e7c70e01fd698607ad8aebbbb5f5b0f9bb5e500ce1e5b6f489caf64f717e4549d4af5e148a9be8eeb4221e28d215ef27df1c3f70fe242fcc12eab9e95f3ea698c6e0cb627f1f126c47f08927f5ea998e03ce87ddd6c776fb5c01dfcea5578ab5ea5cb957ebd77e28dcee66b74996b3eab9e136fa85636dd156f745e87f3385ff3e5940b7a5651ceeb60b104ccec959375f6911cc9eff90d828f7d71c89f19def2bf194c1f7f2297e55b3b20eef27a83780b4847d627aa371e791dd7dae5c774f95b5bf30c360fda58a82120f84bb9fb297aff1b74a321b025d9932948494aa0f55fcadc7758b2f7436ebee36ede717e14ed88f3f6e7fc71fb569348320e79430e7120f0e983460e3491863890ccd33772a0fcf4296cf5d4ea00bfe671805fa3774de99f679ee68866c65b2b585efd78ab355d572586de83159c02998c86d050197d42a750249a4495c0ea59b0bdcf14e73c8e38eff842c89e0d91db904614667443da10551b4cf66c8e9c1a3284088aef518daf9cc0492bb520644a0477bb373724ce0be15485c1781b57c8be3343e2663dd7e49d913aab1625a34dac69a9537aef0d0a83cb65655df5bfbdb07bcaaa7f854f5f2b4bf3d5caeb05b32390ea8bfeca3aad766ddf03b5c5813820de739ef5dccee37c0f9d1f9fc82f4b039ccf791ee3b334119d1f3f47138152a4f3a376223b8fa367d5e58ebd7a276985cda119384f593c5fe218ef896f693528869ea00ec9b279d61fbd7648968d6669b0f3395fb4f3396f63a38b749ea58d705ee78dc6dff9a3978d4c4d6263e3394c55a66b4f4a28bd0c8dcd8ddd25072a2f9102aed24d427fd6d97c5961369a01f4d26a9095c9b0954d1ffa443e3ece4f7107d2f8384f6b8ca624b0d826270762fdd4a035879f0c84223082e390d7e62f17072aadcc81eca67fa11c683e1d9164d3bf3507cae9726f5436fd3b75c5781012387b3ac2894d9f43f2200b6637ca81e653d4d4a67f6d35887bd1a7b1b19c549303952ec6c9814abb64e640e58dd1689c9403b176143d7120aeb669cd61534e0b962807e28ad8f471988ca903eaf6bf4b3568d4383fab0b07e779d02f548680e16818cee3e80fb09e48901fb50f0dc57ece8f5f4e2928464a694eb39ae7894c7ffc9c37c27919231aab2efaf9f3e3905df2ac2e1afd95ca1c9279fa76c981689efe172b6f2c77311b2edea22fc5066fac065d8cc7f1ffc67c767963565f30a60fd78593f2168da64f38313b2b12c86772c76d2ca7ef359ce791f3e3f3c0799636ba800c45886961d444a014e16896e76896eb1d398ff3b24f72c891ac49d5451f87f4c0c8b6c9ca2a8c3e7943f6a79756832617382449a18b2d7ca952993e14ca8322df9a7e21e72faf8d78634647fed5e3c8bffaa36d146e9ab7214bba6d7e454e9fa2dbd4c8bc2569c8b267cb4cd7add9ba4f9f1317d0da20186dd583dd8ab55a55195285d5a4ca549ba6d42ab5484db2b2dea9de82adda5161d5b54556ddfc7d7b4356a4ebb72679ab223d0e79539d36fd90bc01c91268979706e4d1c7974683705d6115e6f75eec15565dd32515c67947362e002720931927f1cf880f6230dea6cc271bc46cfbf84bbaa452894856eae9862a9b520c367dea54836848e0cd061836c5917a9a12934da1af12718c2fd972308740a03bffe775b853ad38ac9736fe6d2d7e2297799aa791c9e48aecd103f45820f87d0ffa3528cda6bfc34707f48178902a03fa440da00f7e5ec5f11b8421db3e91ab2cd8f38efe434bb69a49d2bf66de897c86ac71ab500d2b43de0c6a58fde32d2a02ede77afda9d57fc22f403c5b38f006c1687b886badb5d65a23300218a72a3e052cc24c728f1d38640ce8272b70a9a21e357aece851eb9173ce3d7614d57614f5b876470f216fd11d0ed48383a639a3d4a9d42541869111b8121a62d304304c774ab3830e5ee825a4160cc8c129a54e67b0369b0d2ac80bb974a6ed4c381f26a4b0810a909cb0c194131352174b4b92a49e9cb04198272b389cb04117b35188bbe7930964bbcc2f83821fff01402dcfecf954430e4872def3a9862700ec90ed9e4f3530d16252c30930b89271f67caa610a0cb8c8377b3ed5f005064932b7e753939809983e882376d9da4118f1f3d4e4896df77c0a22cb2effc72211c2fe8d6e416f357e684de6533f326a432693c96432994c269b426cfb348a6ec102de2aeab8dc17725c48e61a2e871c076ad61742d1eebd31bac51cba975cedcff3eea55b68b227f7094b8a9555d9cf8fec3ec634aaa3356a1b41d4dfafb26bf316a63525b9fcd9f6e7caa2b2f7fe6595714f3c8846d9264ed31ad6b449466bd40ba5516b5fac179096a907f8c1efc41cf8efddab2c32f7fed88696cb9ffd8910d0811ffc4f977401f8131d007e1962f2febda4ebf89e7b1c9fd6e57d0ed08d3f141fff10f086d8032f28d6f01f070aeb1377d9fd5383ec4bacb24f844c65a0906f8da38597546dcfd21a9555998ccb94d04daac3b4265bf27e6e8cb36c2cab7d8c7f7e644b41e66d6aea66696dde682d28e7f5bd87dfc3182fc59498c61d5a1bdf5bf6b7a53177d55fc232d90f77d5bfe1f903ab3f4e5e1559a65ee89615d4cae742d16899e63d7eec698ae57b0c7edf7bdf73ef69968efd7d9a45e49f8f92ec3dfe3cefaff7f83d7ddfbb98c5d95a17f97e496b58bc55033ffa6546a35e6acd05067df095a0bbdc4235c87b8abb77a1246a63ca31c65dcedc385eed49d3870a2565406dcca7424d55897d1afad21cca40d51cc7dd0feac05df62decde3fda97e671a636a6aeb6193d6748dc7f1f57bf7a5939be520412fc05e5fe07f7ce9996dabea44f92cc913c4f644ee7b195efbd77ca5bd6ae7e7a6f6b49dd9747ae7e5457fd624e306bbdc7d883e9a0df7d9df2d6b4b86e6135551bfeb2da7c78ec8703d9c718df171f3f381590c59fa28efb62102bd47c78cb86399bb6e9be242bc7fdeeaf76240c2359de6dbc7b64c873a685a9fe7b5f6dd8615ee891d5b38fbfa55c4e29cf61db83d5a095d6512191579fdfbfac369b03ddb78e64ab5230aca914b539aca43fdcc81ca298f3481c7acb72da6132b070da5e68f394a907f7bfefc41cf7f183dfd1ac412b30c4a2f844fe7da28ec9e56e100c6d9e72a981a3fdbd0881fbf8a9a8e33ed6e2026e0e6ecbbca72120fef7a07843f51e693748c57b498f043db2a45946836086035446fc4b8a1f79ffc7c6ef91e5b83d2aaab4e7912009641499e417c9efc03359b7b8cb3ede3e6a107e85d5e642f6245d4596b97924b8b915595f1ea9da5ecbc95671b54d1ffb9f44c67fdf6e9b44436de88420b5648bcd1f35e847a806e159fe1ab3dfb5843cfbfd2f91ab6ddb47807d960eeef1c330fe74b5551bd374d9c738e7d1be85652772e96050cecb3e2659dfe3cb912cee3bf10698b3bdc061298b124eb25011c5cbcea72a4fb6ad71e40f3773577d1aae65dbe8f597dc559f09cb72d3e8447ad9f57b68c81ea334be8d1d40c5ecea91de86c1e61006495ec4811c68d33fda251583e9944c88c3ede202e866e5c07fff6a0a06a4625e3dd645f9655e461be53f7aad7e54d74c4bd39ee20d16d644afd5e7bf1ac80cf3020a609b95c36efc7663cdd241a996dabe02fb2939932b301e2b8703e87b9a95833bdaa0b8017dfdd08dddc8f4194012d89edebada6394467d0b033d00571ce6489e54679ee4451ce6b0fb778b035d2ae5405cbcd6a25d5a752ad77f3a356d2dda6ad1a9d61cb25ce89649a5f6dc6293e026f0290d0acbcd974c706ebeefb857fdd7618efbef31c73ddd9c7deebf27a737ad0762fc16bff79da8c33ed656b3ec7bbf7aef891c7b7777f0c3813e6ff5f777d4a05c5d36e5b4edfb7bda68511a57e61be040f9ef9713887dff670ef9ecfb42431910cda1f0a7456dcca8d1337cd34c99e11bffcccbc8e819a51fa6192b34cd4aa1cdc29739343708923e4a72f8f8c507c3f0c110fc50b374ec30fc4007a859e0afb417053e7e9508be07fe07824f37087a9e66853f37793189c36421fde3adabbbc8dc7f24ad79ab7b16dd5ed73dc61df54269d06f927151497775e8fa56037463fae007a0d8179f7b20d6f34992bd0faa4f926c27deb9e3c8f34466d9b7f9a317cedb7c11cedb682328f68d6c6eb4d1cd8fac1cb583a37df7557220d5dff1ef5359cddf2f2993cd25aa2e990761dae821c481c4eeef1b7d39b9d818ecfb3fe690b53113640e797f7f86f418a5e1e37ed09c5b5cc5c53dd277d7819c7843fc2b36e0886e8fa43ba434fa3e6a1c94f4874d5f6a5fbf403cb12f9d4d1fea4630893fe78f5e2c5c84f339361ae7b12e1a6ff4f8472f1cfd63247fd8903e4a32cf13f95fadeabadd83fa4afefbde5ba129b92626eae0bec43177900f381fdeb24fa5541e328194feec1e634d044a91c703130175d6ef1d49ceeab2d406f63ecffbc00982a27e0f5561a87aac33febe7b173ff171f7de73f841a29f5951f75e0b3f58ce19f73d66e9a2efb1ce2208740c8bfbf74816a73350e4fde769efe70b7b9df6e93345d007d0079606dd7bcff2c7f8e3f19e03651d8a1070cdcae16fdf6e513adaac1d451cf4b01ab841a78f156ff8f4b15fc5397dacb621fd942c9313cda93ab5e122581da6ab5aa71ea65c72b53974041735c5944b677272a6ebe4f489495cc935683aae39bcb7de516881426f81d3a77ed9ed59bfbc78bbb73440434f674b52f04aee3607e806627549b707f641a863c64c4ac3f334b65ef747bbd3737bdace21ea85d38ec95032379dd2b0356ec67536fc219716466f30ff0a951f67cd894bf7062edddb126c093687a610484df5a32a54857258ccdf22b92d525d04a424d8f4a9e1835f86f75683426d911cd4585bd86d5b98087259a796a6e6d017d446ddc22d714b4a21207912ae23389dd93974c31e11e492dee88dda006361b0593dfc341310cc5d7299bc75932c29792b367d02fe2ab29b2ddffe73d2f007a56a10385dfe17cc8266fbe3f8dd89053092bbf7bfa26692f42f03fcfd02a0904b260678efbda73a039656010510720e4a5597006c752a80ab0a352b87dde1db1dea92c89ef2d6fd21d2c5b8ebfee7449dbc75df0024ade2aefbb8bbe0ad063d2875bf8252fbeeaa2b92b7eed7f70fc37a54c369094b407f70b5e78d1a5bcc9e9e16a5e0ea468d2db2f59608d62099caa4b6cba0613a08e298f3fd0390867bcea8135c89392ed8ab8a63ce39e7cc60cf05503de7a474ce39ab1017b470410b75bb2e8d4400674f896f168c07e125eef2b762ac1824a4224536bd4a5769d3db2eeb33b164cf2b7b3ed9a43678410bb509492e31d4f6c7500e549b1c33d5251f6e870ab515e32d5f926d937bc923b67a1e554a4df8be7e5fbfafa0934cbf76b5ab5df7714fff821af205dfbbaeebba0f042b58a93bfeeebdeefbeec16f00bb7bf0ebc00ffcbefff48c06e85abf0026f4743c20d9b2c17724501b7c47e26583efcf3de824d39f18e76c671096c9d9b30024e4fb17d490edf7e0b76a1087f3c61bfc48b2bcdec23fb14c8fb7bee79eee398740a0377fd101fee0ddf4afce7101cde10f3e48410a6a0ed00dea06685b0013aaeee1ee131c0c91448230823852041058182145f45b1533850eb31d5e68f2058a2ec9085937ed0e6f29ed700205296870d2430f598410a22b2106ef488f274640a2c5114d767842c2b64f63bac0965841142f4628cd89050c2b4788e08624685c3a101851041fb1e285d203591246872637dca0e48a0ea966457ea56cff61c8fe5697970b058630010f5d58a01dd1a41ba126e5dd0bc05050124b0285a8147422d46c58cbec06a428aec49a88a10ba196053c62830d2928a288305844d0a183d576a0a1476a0f15a69890984a32c6c68da94de198e4a815ac0842052b5d48490aa31685b3b956259a8070fbe2851794623a7814b518564990a00b1451b4c46ee0c0f0e891da0bb7c9044249102980e1e94b1556c4d490d85a922a27a93e4e8044851121d030821b56501be132a9553bc50aaec4906a21c4f0851630d65afb46f28eb1ba8ce45aa9d0ca83521213145844b0a289175abe702e7b1b8a5411831329a418a946b4508195b4446103432e47ccc930048e0d159640291155c44a186e4acbecbb4942a0a549971f6eb089208c161cbe7b24532d33d0e4249e444b0ba1529416116c8ae06265e566518497ceb3057ab86551c11547c2e8418a1364594060c20aa618020bd74511537858977e6b0a9e84cd051b0951bc38c20ba78222b6747ea4c90b51b531379cb083162338304520e1719574627b62427241072e382e94ace005081f76f832858a6fe96e96215172052d0460a2102326054530e52bf32506206e43d41053b205e74b59e856d17a1223c4174d285061845b1125a86ef55202272a2588218c089c1663b02b390b3cf4c0c50909214449ca62e64802bef80085890995159c705fa400b9903282929426b65ca14316599210a960295964b952801e9414e1f4830a9880e15464a1225ac942823c44eb10173c48d990c20f27c8e2258b920c9309446df1c4c6b43404150e6a0c9e4018148288d5848872e3ae80020372d34a1434ae64950081ec3df244834c0aa72b2a4ca9370c111ea1800e26e410a50a132454b1026aca4a890424a258c941845b9410705da0986aee110a85e403b27e641a51220cd314314f5e64a9022ac67147fede7baf9523271494e0e10729da123a380aa0eebd7763d764cdf4f1b7b73c87ae8bf92c3f846003942861603b7054101106c621635cab942423584871e10a264b8480438117d78fd401200166892c4e8cc0040e5c88d862ccd3c7c6841a5875a18b2b218922060726aaf8a2045db829a0f08e14e96207134819610a14332998e8c00c332c524ed084165d4411757d3a81029715580821ea85239c1411b4d06a21e20a771d8718931980b08202a530382888a8c2390d242c9488e24452d416dc13449400ac4cb630c97828e10712e08965b6f260d10483ad8a2a49ccc09d40866dddda975f212289c68a063688a0092648c022b6026e0b11307ca9fb8c0bf188148d5b6a654631d101d97be413620431b0c005942c60a858640939772b26e894acb5d6e71347381183a2e9052a489c280178a402575491c2298523312e4d2c11876841c458487001092e464040e3981822d6b9d2bdf37ebe3fdeff5b45b02f09dfbdf7823268c073885e24c0ccb09e5c266b7d66a1457d7757cade840acfe7e47499afb676de5c75b02a7cc102172938114105596c4fe0287984791de167937a6489ceda24e53273bf4302b660e2842b5d84601ab344ad6b22e2e7a8290c122eac70c10a09342580105725c83e5f2da8d5cc5aa11a84adb5b26de8c49624820f25f060c5cb72496cfbd4c3b65fc381eeb6ba0432330bb9c4e37629e0cc1864e1436b86002c11802f0090426b842727d70bd99312002926188491710c00a892710b4764156a7882b9a2a4208a36050094c8aa3d9f68494cd17ab8e04bb6d9f38956c3055eb2b7e7138d89b62484ecaab0f29f3dd9b7df696387d2a0efd5bebfbfcf397d7be9e307d874cef93bd4460694067d9ae9fc0ce8d379c3891c4fdd8e727eabb575fe4cbc13a3d571f7bd960e28dee8eecd1cd97117efe018db6d0f95ecf70904573dac7a08c1cfc3d539bfe00ff7feb8add53bceddbde3bcd65abdd66a2bb5ee6ea79d6228aa9c521a1c9deeee95d269c15a6badd6ef9c40f54bbc7184506a963cdddd67786b3e56d27577da8eebf0c59ef5be0a86d37edf773f50bc4f2c8ded8fc505d8aa050c7113f3fbf9de5d3a5b5dc6a1f50f745eede52e77b9ce76b8ce983fc36e5a71f8f8b10801bb3d2ff41e04c3190ee4aeba4419e41aa48090da30402b4a559d70b57abb7aa562ae4106982e7f4fa62b69585d6b9986331ca8c39d9d1ef550208e16dfde67163fa420b3fdc71f9670cec7ec72e5cb9e60268df98c12c1fd73eab4e79411255d3869f20313a957d41662d3a84d8308c116df3a90d0161f146f882a104cdae18be2e73065faa26a47fc4fbcb152893a0376871ac89cdaa01e91f87e9635fbbb32667fdf13104aec0f0b94fd3d166f7ce3f6be136f7806c0f80a958da5367e4ebc8127d00092c00cf083086a96d96c5b5cf36dafa8b7432b0a12c25851e40606edd2d0848f4000c60e2e3c4d75310b02091fb6503a6bcab3f594a504b1fbc41bdd986d1f639ff2230863892b6ea0e104501c314495afc3d16996945cfeb7ae053b3ac4b6fd6c9f7c90b22dce6073dce7a80d04051412dca0786284941767c4e6fec781b8afc1bd02e6e68e0ccddd75dba78722db5a2156d7ca0c3be9e8e704166d267c2a98855114f1ba9802b338018371fac29410ab12c6065cdc02a103a8942df6553d0b11d90800000023150000201008054462a160349846caae7614000c7f9e487c54968ac324c861148490310410420801000000034668688a036d8f710c200871e6e8a3c2fd99197feb07902cce524cafefd92f2272bcd65401e29fd44a851cbb690287d35105a34ced90c269de87d3e0be909d91bb5fa76f679e3117fbba73089e70420eb9c6e748c104ff861eb8ca2b4f51f3746c329ef600837f76a8b554fa6763110b7f4471eb75b4a8843c73b2372d6fdd865942867896a2d7345abc89abcce20d52a29b6128bcd81db8c86442338ec234cbcb83b6365398fedf854fbe56c2e36f1919cbee65ed49651a84b2d2021950d80245c84933fb059f494e33b854c2b17733857119ffdc11fbc0a82805171c16ef79e67f9e508bcab21dab9bd39fdd34e89117ceffcda36a55d60a51af47ead2570ff91d6970548457d049f538d49fe984f55a7448217630bbba23ee863dafa605f916929aa8c9556831477fd2d67fdf87a78a645e24d71f83fecb1ac1c4fba479b8a441b2ac63d25686ba86877030a0368225201cc865e5de05230a1a5068326f85ae1db86da83a1b84dd5ac66478224ce7c46b31354232fc493dd4a20283fbc2611d6b827ceac5992aaec1f014a6f3c4fac1a279c44aa76864b811808fe53ba7669060cb5a591fdaa5d1593f25a4afaa50e077acc90d1386c54e71e81d4c865a2e3e2766196e6a177c2e6d2aaf5f70402d7349561510db41f2151cf10e2a10b00f33e25c212184dd76d121bf4b8884e12590f16df0aefe8a6304f006d9693b9f6a73f5e80ae38a013717e144eefb77d3705dc29d984dc27a6cec0ee48796056bfceaedec36043ca5fb045d17d472061b98c4feb21138944c98a089c2cbababfa11c4827a16999e6a3b28b1b1342e0f87680392c503abef768825b451e818765757622b81ab5e217f49e4da8db92182f14121fd66bca5ac8726f3ef89b8b271097bb930e24d9eef729921c195378342661f36e92d849eecd130e7c7bc327653beaeae6f6845db752730f65a72a78fc49768ce0112f6225a100578128f489e79d1885b9f7bb00c1b0dd565cc633936e97440197f426c243ffb76c482e9826d733c0e3646f34fc6c67222cd93bfca368aac23def846c5728ec3b129774bec3e2e4d0b649c49368dda9644eb1b9b48bab135c1de477c18ee7221620335ab8a53350ca6867735764d98a5c238056f043fb133de1817074fa4834fa1297161212ad602aa122bd622b67531cce05f4db869de9249d103eff160a216b67be296351a73c72c2a1db5fd7291fd89b5a4b3db780b28a22dd354c8dd48c5db792cd964413b400e6d521bedb08fa8aaa006b988ed2eeb0ce3d13c48f88270cdf57794d4a4a5b0d35288332432c4e6de9dd37e9323f52637ea01d43b4b4eb213b224211288d915d5192c82341d15eb23c94591665a3b6007d41f901e3af918fd4be2e548e833b5c30ab5d456b8b90d58a1b11e01e170cbf870024d1e774975734acc1670c4f50496653161b7488c5c799244005f420b4e0585e7466a0e51aa980f59e468eb3f42eb36006b50aa93726482f5569b95312cd5489087d340e3b00d339839f8f88fdad053e7ea13d8c9031b388dc5256f34874541a37b04672d2944331b4eb190e0f665ffe24aba897b774ab1170dd37eb49c12b83ebee61887d905bca2fee42a7b5dd869d9725bc5f8cb96d3af5258c4e73e9759806f80bfeb254a4e61cac8551876fba88335ab9cac5c2ff0bf3d0910cb132763f313fe432b2d06c76b958cc9398e9a4694c911cb32c6168567e2874c415115d534da8e3d836bf9cfd92f7521fbe09297a3dea4465612352a76cbabc51d4e78925eda8a98a86291416b539ad401209a7864744a5a3013003c65e2ff738b6528d7b8c404ff0637ab0bb45f3b8a9e4cc9f0593981256370007c416025a8ca3f3a329754d015ea4ddc946922488b0ad28efa94a8f453a8f6657241b86640952350a862d412d01c35369833306f0889643f44a46a468659483a5d84ef7f2aa297eb72a8aa46c5f7b63215e395ed2948e3d05cd5e3f2a5ef6bc28208d2186b29fe9fd4dc77494f40476dfa33314401025e02da5111fe31baf7155acc08219680ddb1a54409f1b2510cc6ee9d202e3322841bf706824106fd43652eb3dcb47c204d3ec8b905d7b1b2f2031b13439eb7f887acf40d21a70fb149fa59c93cdf295a897643186806b32be00f7cf31ce2bc369c9d4f35356bb187f51c289e4b6474b5e2062c6114f8d95e69919c89b352f09514d282bc828404c2ca8e753cc7b705dc7b2471c693b62e9420a6b981402c1aba62eaf8b115d1f53d468bfafb6d517d1d9d6a2501e571d509a3eff881e11de5b7463775a0002d7093b55b24ca71acdc3be4b8f474a6fa64bd24b98a5aaf99027aec3e0ef6c4b7833c81ab30b7edea79ecc071c2ea37038870a228971b9311b9ea2ee7910f26f5bcf29655e4b85e89031b5f81381fb279dcaf80242a0bee71db5506125d5285062f242725ef1e2c30c78abdd8e7ee8b2d374a91e0243d59c7acd54f46d2be44c0b7b27cdf1ac684158ab40c58e6df6a2a3ead8469e3163be4178ecfbb53a6a43b7a4c895246d9109f0e0e58dbb7e596217ab5804742e86c292728964f7de04dacde186db7f09d2522751f7e021596fb0d4f8da8e5df75449f170178618fb34b60a24c43586d6217183e275d9325f509aa248e94c9cdfd6c1c2bd2cd3ed692ff0da7f923146fdb2b39ed7a835aa9d174a672adec0d8936cd7222935e0cf19db4465f0c99efc30418fe5b15f8eaee5f9021154af5e8e330ee0c2983fb1c0d811c7a2bf6f744ba0d54b9108a13630dac02bab1af867a87a5d53402da985c12b9dc7c25b8eb96024a864b3988bd2f87b917d19737f8f2a2ef98a492d7085fcb34a90e9e09657061d901522b85e4c391ed0c8f083c7774841bf96ef6b9fbd4aa248e42c3b4cc206d5d55040124989029dfa364c8432141044e462f9f74329e06031bc263f792c4d88203bb0841ddbe2c6815fe09d01c2ddc6de133771c4a536bb97abc1efe29c7b970dbeb30e7e6d6a9d2a88b8419afa7c9d33be8092e32fbe897cb11a2308360a465724d24b35cb3e7cc167193fd0383b9144214092eb5964e8ab220d5c4385d6a15620befc840c3f1b6035aba29d32d11e33a14a7dff61bb931429c3931f29a994b444999a4e25a0114ae58f5e406f947acf1e494796846c1c816dda64d6729874de08856120e43a2db6120af832ead6bc970323e358fa5358b5cd50e8f194f9e7af149fa7be620ed466a74607c66621292f0adfe88aa038abad0086538bc9038ac66c41fd1fa31be8901988b219a5bbe18615a36fd6940097221161d7a7175c87f99b85e48026aa096c8454404da8972d8bacc0ca388c5d64e5ebfc9d16b448c68be0e1d2ba9ba2e3080a23f41623edfe3af551659af70b9524380efdce306a16f46e3c409195f195e23ed018fada946f30f6e871461c0b732d16f356898f072022ead6b864ec4b721944d809c6ad3728e469e0f375b4ebe0d1ac2e1f8b82f02de4f023fb37ca2466ebb0a0c5c7da2603bb893e566dfd6dfdc1d79dc6d2f4e07e197703dc5501e476e68ce57bf2a323faf2f08a6f86933d638ade6fd8b8b7e6e78b81f78169ed0ce8a3578a6676e518006674c169481a8b30be9c541519ae1972961e2bd8b729810dcafab18b580cccde253f6bf5386fc86c44e95071b47f632f19fda19f2e805858b8973bb426539dabc414195394169b693549c9c2074ac903f0245e0da0ccbe553bf07821208bd1f823940bb08e175d42a68ab2e4faa8588291332694c31cd210ee6e3a96ddd2c4d5ab7384009e6ad5a6c93ac577593037626fa88e7cf92672d52d324c5d6c96088c37a6f5fb5bf00b9543cbcced90e4f84904da2de0d46f60ed4415fcd54b8fdcd0435a8d16d5d4010808fafaf9cccbb657014bdfd651e5adc7c5cd75d514c1ef36529c6844ae9b31ccf9a7c4b6efb3670e11f2b53307f0923963de024dd8fb8180deead008069c27b10d299a84d9ed1be6d545e560681688a0bfa8a030a1995f838ad76724519024bb1c4a5f9af344f037cc6f48859c9c2f44d5925e65f0d48aadede6812dd5f3b77e6f90d6a38c5fd0cf474da55c7b768a6b0673454eb32731f17f4f8140ca2846a640c6d2855876d4fcf9b4df27197b167e251837b7e175aeb37d945980bcbcfbb3ab07b350ee533fa234d0c4bb22ba140fd9458b1fb63029c5ea1f7a37416250e553d6b7eac8f53d4c79154134c91088c5c19ea7276df25e519326bcbcff9c10e93a2a7ae5d11b3d7a2bfed0ab03cbd130a10391f87b1e8562519ef4f5a46be5e5f2ec1af93ecd8ec786104230bf4db371927ab3b0323c7cc853adbdd7bdc025f08887230ad5144f855e8afa121cf0a919b6ed61a1ca4d66ee6ad03a9374ae0b46a0d7932b700191a815394efcebea5e5ab7b783845ed7a72fd88c9d95d35b9fecb0080d36a5f92c8102a6182c0380aa1d61f3d956818174caf9f764c8d22b1e5039bf27844b9d4ae4d8a808e08a984a384dd3c99ab9a21b4bb9ca29dbd2fb3aefaf0ed3e4117221cb8d9a42c72da1640e6a6667c0195d92b54d14b802c961e4f31e7b3138245b85f9872d36624cc29f254d617616ffb5dc348850184f162305622343c7b1061ca69db8baaba312471aa376df5d78327dc650704987df93577c0fe832e32dd2a6cd5b60208433173a7d41bfc98947a727c0c726d2d70278b9899ca3be51271d4a9eea132d2b7be91693bf8d17347ca2a34ce481958b9c06589e7329b3192160634a420ae91a14d62b01c01622994da47ac829b4159762d5a45c456d9f5984fe08070a2136323d20831b3f76c492176975158148989f1064b25d2e6c660a7f8d6fc1c8d2cf8986483a2963671cf3b628752e265acbd42669eecbb6217dc5acc344920aeae4ebcaf63252835efca55c6054d883699aab499087d42c14f46c96f0f94825e0519e47aa38d7816db244346fd4cff28e9ddf5fcdd81cb525e7457deb5f4de4af15bf410d113111ac6b87b493ea43948c2422d4417143680a5f56073cec1b177d12aef3381a84079785f35c8b02da768ef2673233a18baf719a00f6b6049e897a377604f01b510a3d668df8e7ee6952464396a451223ca0429eaf7efa3d25e267ca04e83dcf350563cac94046e59a8e3679fab9f16b02813ae0d4e98d5f65743389611621f6051afdec4f697f6fae3367c7fdce313fa19100c6d596c33937d06ad2a875b2a60d3bcc90433ee06e44162ac5ac41c02f6f96e2ca1e12958893104793125b10c0d891577ff0c18c6c4a21573dc159cb788c67d8862f73604cb5d50e75421a14a4147d62f6e2f0f92bf7051aa4721a58e208e31c49037979472d1557514b7483534a21550498bcc95d88d3f813d5127d82d786263e77939904e550d76f72e8b74aab3607942d9eed3e7317b1e98e5ab5cc178e1f1d01757f49bc3c20cb1ebc546d66004f303a981333ab505889b7320a029cc63fc3a337750a876c65bac26e82976778493a943deec4bc73c1ebec2c284e57a6ac0cddfa6c3c5ea55ac1c7dfcce9b7a5780e535be8331b323dd7286d8ee090ba4c6c9cde7d2996a38a0698cfe9813f3cab6610d4f974c964e41d85233a6c8b8c05b673fe67eb04fc31f19fb36f503d51f3679933c137fa0d0290590c18b32620155b1023c388808b9de48df91d1dd87780b6c70426da691d7834550a2016158e3256354f58a082b0afa78671a0423808744059d32990555fa91b6b6cb80be5d9a7b599c764450ac90a4608ab145f80308809adf3dbec8c2d6146286d9c7dcbaf1b07da8e11384f603eba4859326d156ff6ece92da8c6e406bd3456bfb315eeb386146708298679951248c8caa31dc0370559407c32e899673b52922a7dce31d52d7d35f0291768461d326722c9074c9b64618b4f26f1c57f17bc0a5607e0294850ce26dad78e7820a866f2973e5852f79bf3cc5d1449a39beba67408b5a42c50c91d054e8ac9df40b01e2d20e212a97d4259f0a88808cd0defa879ef11c3e4ec28e9acdf3667fdb86658a08cd11da9e81610f86ec02125e81c733a6b3491dbc0eae111b6050e594da4dc28310bc0875902ec4e1b692ad73e984bbe83a601910115b6cb3a4ac1dcd080d3951b941d55914e9293b33aa02730b2c232694da072e341105a699575cf523ab14044927cc8c714c0e0c26da6352e627c76670cb35b876cdb04c24ab7584d07cf6041830cd0578f380df3d9e0e0586d2fa8a1c029703d6429317e6cf0dd08ebba8cf243c9646fb3b6969c97a233816686b72088732ab2044209b1550a309dce7722289f3bf8aef8a248de09c7fbacc20e7fb775ec535b86bc58565426e5df5ecefd09d29564aa41a5f707f28be0d1531fa17c41e87dbe76a74b2ce9627eb190a5a8a62f6bc2c3aedb778378f18b5593477a45942b6da568eb2615c47f417cd0a954b3bcd884f680e96754dd20e0b0577dbdf039682875c0c6ebe801c5821a776197d26f9f5337b4a9c217155afe6708ac80d55f9c155915b68ab8730983025824f3d712fb8d787780d6b4f7219c21b77e2e5e32579e63026066d29e68d3baf8e919e54e1800edbcd8e104662f69437f217d768c58e7d09e35a09c23748251392646e1b56183cedf2b3a44ed73d74c160e6f473f2f002757b0d4a79527641cf89fac7b4202e9c9b4ef1f1e0cfc59b3ce9d87cb3fddb6c8be1ee52c5b2166d063fa64b8913abe39e4e27288cece83d183dd9fc8a1c6150dc0045f2eef76a206b60c154580e39f4c5ae5bed93c282a60795905a2aab3c9fad55e4960a30db96ab82d4d91c3f93a36168d8b5c703c2abfc37c69a455de463d2c31596cdbd768bab16d060810665c9df288da236319d763910b5cbc549f4a88e04ba39041d55be33d1490bec296e9bd74f3d27f90f8c8a7e595693367a8ab7cd19bafa03a9e0b1b1072df9014ff2d91874516160e8035439da747e4e3a1de180509e3660d077dba87dfc185a2a0d8d4b01d84ffc279123ee7fd619cd553baeb6348341f391c6431515367cbfba8a4f9abfe1d345a283880dd26cc29bfb4e76e2fa68c3eca4518f1d4594a1e6d2edd7c8245ca90735dfac80dbacf99f58d063a23f884913f47516a157106a122cc9de5d63460ecf0f6565380e9610da6117378590ac4ae726d276a69beaf2fde81b8b0c2326492769a6fa57af0a62ab5105bdbe3a765b8dfdde93f5f89c762a933463b412497cb0c4659c673050e12bbea44ddc5e50432b690c37801dba76c973f096484723726ea2c1d3e1730f2ce7a06631a4b0f7083a5261888fc691d3843f29f631781f6d4e475490e8111fa08a3c28963a52ced91484441c16a5a5c1e1abd0a7254b621fc7c7c847e975947de3318d52667add960d7c1a659e347eddcf6d36a3c27edc22a853d734311198959d471b20d6ac00148c48828c90ea6cd7142b83a520e522fb7f72c89722581cc1de63af0b058ff6dcb86ee09f0237fffd486cdbd1e4ee818f93c1f8c99b44632beb11f998a9d16e79930cba43d691729bee0379dbaa8058d4dbcf45eb7500e267dd3e88bc696bbfb1e2feb6c60a022a1d7826ed24ea77de0038578e82809238578e88b5a93720dca22235a9134919e0ea949a0f3db03283b7b0bd468f07b143f56f1e0073ea7fdba5d85088ba210db497ab80fd7c68dbe409c4c1853467d0acbb5cc21a442d49cfd634d1118a251884becd7c27f63b002b979b1939cd9ca0937248ca431020190e2fe7b3d10090ec1a88b3117c7a1b0ea28bb3a391fd641c980ca5d0fe5c4c90ad02a7915a9758d28d42538e3fccbe117adc740e3acad8caeba6a4a6d3414a39850c749b4d2703bc6b244b5d830c4ac647e4b6ad74d7a785acc28ae0d5d85e1e90d589e64755ba6b9c6ede53ab4a89b84b358cb82a794bc2f8faed871e0a7685e059ecf1618de400afa4526b43ed5de41d767c6b827cca2792d3112f5b5481cf86527919ff69b064935feede3e023882b2361c2548e8a9c66ba34e0975bbdf2a5285366762239fc725335b4cbc2412d1018e336c0a484834e7598d1eb147cd7c46257178b34012aa80f1a9c306c6d63d4ab613357f47090fd42844e596a824340b3680489457bf366085cae375733d30b61e4c64f4ec6d833d1050e120badd0259df9f1154de9865955b733738c8996aaa1cbe091966e68cbf13be8d9ca71ce17606a9738bffebd651c38ba6b23410425d1bb2b8eb91db957a96409c33729636345d9281c1b320651f8427e4a8a97282cdc9d57a2d5ad34e1e579622e9e48504aced3c1bb9c804e5d513cceebf69c67b6e6efb63c9ab0bde412b46a6e884a53f98cc2d817215302c7f5e804bbb9d7434f551f287c419635faec5497de2bb7fd319265ea31cf8bcac5f4b9fc52d5c4c60dbac2cc244045cad802b64d0310881ae4b811c7d70e70a167a31275e12185fb901f18dd254b79863a352ed85dc4a1dada9c7143b189710bf845c32f5685f872cc34921775abfb74f17a32f85fa7ad99a78e0d9f502dc5b479043d531d84060c454ee33697f3fb87785225091e6460b48997a89bde974e202e57caf7a6e4d84b555de206508655deaecb02956bc52a50b9dbd102b73a2818ce8d5b24fe28e77c10969539505d5c5a9571139882a2d2b9697496914335120c26fc917c3ccbdb1d4fa08a19f9755be20e44409fd7fa6a699198aae6314c2be68c8d17bfcd156043347c335804541a288e0ed573177f9fe336755b2394de9bd9a6046ad8fffc825de8b6507774001fa222dc46ca404ee0f9ee05b032bd900183d587158c4aa81c80c5be47099911e36dd6e1ff21e6cb36c258895fd616744426461f9c441e03bc8920a1df2034eff5de2a8f6b554c61a437f4cdb552a04d6f62b2672f23dfec82c71e57c5c2ac5d60812d353b92df92b41877bc289423a6485b3cfdad755210248ab7324ecffae6f0a30feb9b26d0a4f1749dbe10464de05c20fe8e58861585010b50c6ef69d84438265a80005aa960ea610d425c433f4fe86dafa281860e27b5921346eef35596eed0a3372324e98a3620e684096b49b32cfddddd03423b14ec50847c12480153070b4923fedebe2e9e74e29af29fab189b643ddd67b3af9915286c13e69bd5c8da852425db90ef02af3eff628d3513b8b90203de9c28b7e4a2f191b4bfafc65efa0db26fe78dc60ed5a95403f28f231fb05006b75ceac5f1cdde6d47c73058480bb8dd6ea5d0527854994cb35d99842b634249b01e9360aad971fb54123f267a2cb78c90bc9394f516543d0fe79d5bcb447dee6d13ceee72470dff088ec66e67981b40b50bd90f499452480d9be1220c53d80eae6d5b1c362f4bb8e3efcfecedb5fd621671e7c32dadc987abc3a51eeeff0b86c8097eedc06210d4177a959c6aabaf0ade1332c7abc33e267d1f9cdf0af150d87347b4804e15fee3bde26bb4760f58f5efd6733b47b7e21b781886eda52f2d20914c871bc9aed6842218a47ecaad0932cdc6f4a71a44166db01f873b5db97ec511448ae13d7a18bea9c14ba4a004400d9b9f4bcd59110ed1b8ce6c0ecd195dab4ec9fa98da84adc0c37dcd0ed9cf2f82625d90449a78d34d09bc7346f579e981ba7d21c29aa748f7815a5aa8c7ff6a16fd90ea4169237690982119dffdc63bc501fa4095650e8f6590e6c34fdded79eabf797beaa983ad183515369235cae4312ca01e3920db2a510c17c298fee689afb94f7f54fd79f05a8a46f8ff3364549f1a21af4224c9bad5faee050c4fbcccb16b4c832243f7a493e8a71c5c26e910bfe08dd322572a85ea26b5efa2d630fcabc8b54bbe817a72fc6981e0ba285f55524ba2113cb19a009b68905cfbcd6757fb75f569f14f297cb6ead4c7402c301262282a644081a97b35e0305febc42eb70e132c9c7e2c6e9fe1db2865f796e8c4fab8062c16a3e8ac69a2749359f68c465a1a42dd3de2de2af20e473c0d85f6df729b69cda455f6784f4eeda12e1f8008b436405e5877b2d2b2cc2f71e1822049cd117660f86032783d892b040bc52111dee68b8fd05950adb710b8dacf4b0f3a732622a22d18eb841f0df15a70365c4242142dd0670cf257db043cd878cfb6898d3a49bc27fe859db052d47840f8e4f406bd7ecc599a93533928910dbcd45f871475cf839fc643b470fc8b1c89805e226b100ac2fa986710e1720266d7148d2a55bdc0e70f8a2f10c19320f05a9ece04d13631599749bd954b9813ab11960385a9e55e04090c57b4a4a0e4318aed26a947aeee94e360a72ed4eecee06e7b04b24722d5c4808e647bc6e8e1dbeb3d5c5b7a4d842c4b7c2e0ec7ebe99137fb0c238238fd34aee8b21c45a280055da9204c670a5df10901c8fb228b38ec71427dabc1e54c8b2601ca0d9e4fb6198b08385011c97e4f74d6f9811b17237cf0d2db135a188c99ad81736fbcfffccfefe6771f2a60e98ee426292b92543abb636b1a2a8244106f2ad7721fcd19ca66171c6ed70322bf162a705ce8eb7a95a2d0494881ce5907cc328df0a155cfc453c0057f405c10240ed393e898e8e507e2e443f663fb4508a9679e70984d6dc598c4f1d603b1e5e8605d70a05849059e6dd6caeedcd5dbb051008a81fac4513f74891331e5bb94150bd0dc55a87e6d5f33f7740e051604109564b8b49c4b9c518b726aa45f460c9aa33efc2335ac8573edeb3ddceab85a4a604684ea15248d4ac273359b83f45032c7ebfc7d0d568557d261ac2ff01a42f0f3467583837a6011a62634323b59b107957daf7f68fe3fe947fa2ce34e591dd3491890c1ee75aebb9ba3d90c1674814bf8a5af169e4bf4e00f1e732a78c9b0cbe05bd01b8a704d76777bee7c267219ecc7b5affe90b02bc7e09dac7f4d1975c9a8e7f6e66351112cd80bf16e44ba13011d2a0f5d011badb03789366574cc8f0e60d29ad93cc40f58360eaaf619adb6df42c4d4e0e6639b429647c9f0c4672a5ddcf7c7204dbb1b0d568e08ca0dee4b5acf3ad746a0a13f6f1600d64216c34e69a920616891de81e515d884b80f49f9f44aca97859e79b42d3535a1f2007e83cb70d247be91eb3aab89ca9b357b0ee84f90c9fe3717480185bfb7da6c27256c1fef6607b6346257df31eb705155d27bd341647421e26667dc98482ecaa88ec4c50c84451a0e4952df50c7c540a09bb490ed13b0fd6686bc1e92833c1806c67007f1fba87f10c49a20604eb996cf479a8543bb003111baf87b8c4316620f360d492dc26f11c4101cc274653dc155cb045f9f9bb90f17b9bdc54aa84ede78f9837e4816ba654c213634e5c55b8e5a0538baa4a51584f98b4b14186a70563ae4965a812a6d290fe2d6b02b933d012e6e06d53a259777a86a5c8d40c496c8b6851db7a7be7505d74193d4e86cfde7b5b4b147634eacbd96f0ecf8373e702119357b6dbe10e43a51887a52d75007cf1ac203c162f802f77465d6ff9257339231577b7e4388390b6a2bcd42aa2a7b27d1462df3dffd00f92cb372ee8592cde9fc4db6ab044308a4709dd38d85bf319b090fb53011ddea6dd4d703322f8014f7dfd7c9e42de6a98490dc36919be84b09625ff99593a81607a21ff99d80ac5de1086828d5e10a45d500f5de27d91c041e03dd348c7adeb04aa11efa968eebae1012c79cea5ea6de996c4f8b2038dd579f4afc71873c4fd9dc4302854a26e5557b5e2cbc0047f9249f269fdfae83388af2e5909f79b1b2df13b2f104f998009dd206140519f8267f284c80fb535634f289f81a81d49e7c2713afdbbc5ecee769c2e26919a5142cee8669879c467d6fee0089960d84af82489f0878742b61a9ecf9de3201609bf453f482a6171d10d7516f0e4c93aa75d629435b71a352f47e9f08e2d6c29838e9e23ffcae87cd3b70886581210558242de111134bb7584a2ab3f9d168f18af167059eb2a2af2a461f300c7518b33c56159d0d978a51a1a096389fda3df65dfaf59488c862d2be5762e1a34bbd652ef43a7355b50fa7e47f5b306c6c6816d98fe1b0f0c6f2e12f981850268419ed92ae5ef29308c7377ebb7d1c9ccc2cac28edd3cebed585c3fdffaad14f085b43e78ec5b1274e910dd72e11720a054e4c117d8c4954d120703aab5f42ec2c8fa5ae455e170f61d2e59e288d21721822ba9a6d0684f015e36a60cdf80ec50d28b6dde4d572dcc6263cdf015e40d50374952f8f8adcb41e8760b9de7213825123db2978483f9d22c1106894c9e850c4759a8dd4d592cf8e3d2b964b1ae1a2caf9571701cc2eac65e1130bea9d9dabec0c4498f4300c721491b3aaf95f3d54cd2a2342750c8beb5c35c289d96e61ecdf84d482237a4c233eb4c9bdc5005b92afd41fe9d2bbf6fafbf3b38cce7250f592fbc52c90adfedd5fc4a2ad5d734c3858a0a06d553a0de4f8586b8655321dd980652a9bfb8f1586fa61d3332d3948e1b5738ec7a2a73542aeb36efd8ce806025c2a29fc21db88138ab40109526f1514ff1ab0d35d9f323265f4bb09d59769acaa6288da21b3f188e0c62f4c7307ab466a6daa1518cf375a9b037de6743700142c23d9f1f11a01a78ed735104ce10a45f78ded08cee6d4e0cfe7d5d8af32e258b43c82de6ec22cb43aaf3ec33ba4b19752d4f8e5c04245623e415e17b55149b63f5db00889d8a451e158ba3e867290d6816f33ea5f10d54bbfdce0a6cef939db5c694646f85b0752aa6428a2d05d2ed8395e3d3d476692809a7b044f0d4fc417fa741c5f837c609934722c0bdf518599a7509ca75b4ab4539c6cafe484a9e9610bcaee2d9c17fb872aa0c23d26b1fce5c043a0d174a5c90c33e3e50fcbc34438f15fe7c3b95b637922d2cd4448680ba54a3407d3827765301f7a00b8b15280a3a4fe5327a6579c31b81c737b192c0d0eed19486bbdf532d4adc63d10e6e79683d98583213522c0c08c1528b88f51dc9529eaa5fc2e1959a28385a5d6a48d25e891d8b033f378695c0eb15523f02267cdd728b3fd08bb42fa3d8f07df9cb5aefceca2cdd1a106ec25185b75891e00761a78160dddbe03e88d7597fe0613a6e3486c341343f789d68f7f2e372aa7688e9bae12136183f6f7a92bdeb67e881bcc38582ae26fac4f8a9329fd751e93331d5fec6c7ac725098341daaf34b37480f8e9cec1f59c9095d9fd1354461578aaccf2843249973c4c9ddc9bafb33ce3e0c4d098bd079ea8861a7f15a019aebe7c62b0d4e242679592eafc949b84f04d7e16b89b3da40c83d607c218d2c374e74023a7f44bea6810e14126926710e5929b84f8cac7fd6b59fe2c936915d7f633cab9d400fe0cb3d2a1b57a5b34e332395453172e9e05708d5e5b5bcc39c1321df7f071236380fde011dd26270500aa519b2731c398a384696c81d06a3022a6293b5f7587d5ef3112ecd748bb950237f4937be3b3eb206aff085485e5dba38446925ef4ba835a196b0cc0126f1aabd4b4c07823a12ce845452d334582f6bfcb6a1ba5ba612b9175990eef9606d6f47ae4661e97868a89b4c845f1bf950d4f98fbb51b1ce3305a5f893dffb315c4cf95900a0c2567a19913708405c0042e8dff254dfa600fd76c4a242dbdfd08cc06eee27fc3a2f10048996755b18b67ff419c1fdc04abe3c3341c06922e83da7997058857f7e79cc50b16018f309056fb7118caf53fa5061bffd8bfb35e9dc2ee93e73f235c1ed48742350619c3e99fe321c4f96731288234f801a076e7ad65a7944519f70dd3d4314b5a5c41c1113889da04f23db4c87915e0124e066ff9ece35104f7217cd2ae131abd9d335ee583b9abd66b0b56719e0bfc242c98ce6cb8ec78bbea43f6a8667b20ec84037fc787dfadc9c0d986f8d9c4d4339d0ed4bf86fe7e543297569c08a71e928705bee168d2412a016dad6c2b5345a51df60f9288080b07b844ffd9cd41998a9c7c7ee05d5e44d0807880acab4b39cfaa44157fac4a0e6ed29938a01fc586b3cb3a32de53117aaf55b650441a8b4bc2eb179fcc87e1f50105c177cacd33b9751a96315a4869ea779257f4cc9a4865b53ae60249db0242ac9d83e408940675e22347357426d14a74b68d1a18c788e30f35c0706a322bda97f2069b571e51f28e3c3c59588d3dd24a8de4c11af3a939e9a0e60248eb9b323fd064f08e88cec5647d2b14dbf99473c914cf2952982388d60b3dec2124b78d2119210d326fae7e2e4988ee40ea7f138925e3e3ae884849fa290f00b62965ae31db3c2bf13d05daf792a7f51302da1e2719613bee873331678720367c6ef152b7b34243a406848074f16ec6a3eb40a7588a6c8e1f4de399b899eb807402fcda1fff38b1580eed0f5fc0b47da9d526e8a4031939f4801d10a3ae242a67e66c24116065849233e116d74c9d8033354908aae13a73cf137c6ec0b40fe464836345c17628dd7f586bdb45a4d6c2c86e67286234e548e46628595d2e87ea12ede97cf2c652e54d99da85b20c150309211c38717f31e3517a0ed4f294d9055bd3459e755e2bd1bbc1cc462fe1198a287a27165ba3c6c10a59050f91b319454f80e72f39cde84183979a6102333f9c403b698f9d3fc01c2449bc8a46d3a469210553b227898ae1036e5ce814b4cc73c8a0d6b412a79d769b31f7a1fc869570f75c4212e5dbb6be6b4dee99c5b4b656376f925d079fcb70605cb936096d0beb93639e115ee4810b271ca59cd55edd4737e761eaa7ed90a1118621542011abbd9e36ff4a9964eee76ce62b6b17f7b1dff4eec31a7bbcb40c497ec175a81dce25e7008932facbd713030ce1f75030ddf17db37a56af37c0ff28ca8c1503f526384ee4a2e04fb1081efa6fa34d1586de26c6d6f43a99b08e0737523f9d47a0bbe20070cb23cf04eff3294f8c88df955c18ea2cc91b263a9fc7026c568a586b4c1ae78e6482ee154d1d10c95170db63f19dae95cf08871d959dc56f2837cfa66a9c8b1d61f012480822d831165960c4ff9b9681c566472bc60f5fa520199de14d2bdedb624cca0a9c8d24ea21c26832b9353a48729affc205c5fe039b9b1ef52f305038bd97bd4b13cd7b3a247be40148927f1ed4c194408965c0927b7a2966d17a4a178459b16c01ebfc4fd4ae043cf7754bba6a131c080c9a2151799a1870da1b79da09a2583f4b3147255ee66c6e23ff9454b20ea6726b97f6614c139a376a49cb8fee32ed2441c0b4154da16ad885eeb4e2631b5da6c40d44ad475baeac7f2ace1e7901f2c465957f8fd929f2df134c6ec3b0b7e953e5d0ca45a1a2a43480033b8811c3bee2f2b29f62ba5f36f4c293299c9bedf24fde4b11b4ea9e83001976ddf4b760a07f4097bebe0a562f666018eecc31bf67823dce1c02d7ac28096283a0d6342a8f4a237a3e154bc52d98c381082ebe1fc17aa6169ebe3af05d0aa35b2cfb4efbc6a88c006471847dd72bc4c3057498b1c79f5da2db6386586ea2451bcd500983385aa7233440fb126f352068b06e1b50b477579e7e81743a56f2398a65494fbfe15409f4bdb829b69e255c26102675c3ddb8c3d1cf0805ce6f86251602252c366eb4d3397767b4a0a2279118b4a1e9b34336dd679666ae3ad9f98ce959b3ee4180904ee9a40c511b808025b18f71c55d43457b8340358e3e8aeaf2a28093633020d404780d89b28eb12bb999098cd4091f2cc2dca0bbc39e5bb07be190c7bb2889264dba7bd013601dca77ed76debcb6039a9be329c2257d709fa004095c8666ba67aafc0e63f8e0f0efea3718ce2a1c7255f20f8e4bbb7459f480e4b1c9e7e910f99625da242c64180a8a3c153519882b1b836ba19244e1170eb94c5b3145507bbef996412b10a206c648b716e1fe9c085d9f7e660f2e21b1d1fb58ecdf8721cc9bb318067f9468a91efaeed88462584c340ccfbd9608ff46fe2ce7f6b39030bb6ab2f1ed2dd3fb61794d48131a17e09b664753e3f60bfe441597d0125773e75ebcde6f526b98c0e0ec3d59a406d51da3d1222ddb3940f674c98bece6fc8d38531f23f876e598b65307b66eb3fc1d23f21eaf406b6467dedc07dfd10ff36d0849b4262dbb95a172c39251b2c00ba2d109e0e603eb0addaa1a21dcbec670d05917ebb2ac95195d35d0008fffbbc0047fdf8cec334e9df575d3ce6cda5ead503da56e489d90255e0e872d8b0db0635adec800fbcef58138c39c353144012007337fc63f38dfe4e82723ed0b09287ea2ba6bedbe05ddd4257429aa3304fd764c3b47282fe00bdcadf3f37b730193c343da06c80b9015536be084d3e341ce2b225e037c9a0bea2ddb76ef97d57cec9d7f2601802571fcf5b4143aa35183cab80c6b7ce62fa25c557e61009e72ce9fa5898c6578572fbbeb6591cdf5de9bbbd48ce89f1d0389d5ae22d465b6759d17258453577aeaafb9c6750bc155a29f144b6cb68d014c39ec1e4099d201726271e95ef2e811eb047bb971c1688fa4e8d6eae1350c50dd60c3e296c1a2287e4aa14e3de4c5de840284a9638806f3d0206871856b14f8bd48747bf1ebb7cd5283b09c94208b37a71c4cd38144230744ff9d15054e5484f795c05c7d25774bcc89fee821d095070db7592ddf18a84aded3b59169696daf60c997a2a8ad2847cf72bbdbd0232f73882f8ccabe44aa102d2fc61efda093fd21e7b57180796032d3c35e0d684fa1b1e0bf83fe84eab8d3f865ca56b54128c8328f77cc936bcb65cef8ae279fa62085d34877578e0c5837b374dd106fbfa35f955c40bb5a5f87ac93d3c1ede77b8ed85368e9c14ada827a898b2b900ccb1c7876884e3d3f5186c5f31ddb8d2e9393e277034bff8a0f91dccdb00047d80aa1feacccf1e1749e5940c5c99f85eb4ac1c0256abbfb4264d07a77bb1f7f3d7ec6a6883b937fdee1f027cbaeb4220d814e06b66373768c580f988796132ff93b7e9f2f318133d286e78773f058d0a8d5b46fab4ce94720adc581fde2927fe0ce443577c50a7aedf8fe75e21d98eeed93567833bf8c878b5b088131128a7456b593c21c7f0b8c80dd0012cd65dbbcf6d3f132e097081f1cb04c9385e1444cdd836e2f019702fc856a3ed1ad0188af8637f830320670f0b331342fead9091f1edc33c5128bd259d9a8ba89b95afd984e6411f7a2ff19440657edf17c8fd071a119901de9faccd44b07bc9197b5e8d72bf587a583cbcfc096054f0f78f0f43686ff9e7e95457fded4ae03359cf0db5a98844e7a5b563096f92f0c96c463209a51cde59c5ad4e3180628b7a2912e50362801433629dea3d3a9e41438301fecdb9150bed31b03751d5861f604f33697378c396867988f925953a2994b93cad955f42f8f07048a81f58d47f3ed931cdccd80ae8ad54d063ea0a0c5d3d19edfc72d777276cb652d90b307f2d1021edf9212542e54b1dd7c3d2efd90f81831d8801b68850b3471536298481492ed68d2940a140f8a2b4796cf91d151eef277e2eb0302c64212eba6fa5c0b38a1570f309a2f79e4372d09dff4ca193339f9686c635a7cac4929764d1fbd1a1d09b29416b72a7d3bd0e82567842730562cdc7e6ea759d79eed85b0ef9591761af20ca076700e276985e25fb12ec662f0db86c6e801504857202d6b50facb149a6f445449ce14f62480ae455eafac6bd218873b10daaf77fedf387a71751418bd7a9df80501829ebf41b4edbac835a7a602b1cb334798d0bc7f30eff00acd3502fbf153a91bd66e37a372ed3e58ba073d2a06dd1fb539cffa98ba07cfeee901e1ec28e121069922a5152793c5cf9fc180804a0e726a8a308167989cc9654b3805762c194a693acf66c3c0e34e7dbad11850f1bb6fe1d408364c4cb10f4f3760b686adabb460bf486844bd2e67eb69a10eeed5599f1bfe41e11a59110451a1e914d6dd4e0832ccada086a36bf620eecec50993f63be23304cf04a0cbe725a35afd39abc971d049b65e0c4fb18f285d382256260eccfe056b839b8fdd70b2237f7b060b32932aecfa2600452425b2009bcff687be3814dfee877b012bafcd10b851a9e44fc1fb135408e9b1f9f3a910bd0c1dd88c9496b45fad4dfdd97bc51e86265d863cbc328b8ed8c18e511264f894d4c668d178b5d86811e6bb726677296265f5e494fa9a15fe058628c06f87eaf3bf88e0c2036eac63e0c91ef34f50b0595bbf4072f7224f83664695867ae1bb678015bab4035e2e109b949ecc6d66a341839dc7a25d8fc84bd3c739b90a1be9e3ff519571d624952e46bafff3ef676debc25ecaf377055694cacbfe9acfa7703c946da7a0383ea2eea88cef330c855f7dd8a107b31e45619a4a9c5b15cdadfdd01a5891c289b70372b6837a44517e56066bfaa205928739260e66cd3fa8e6925b1b1fbce097d3e0aa33eab0b7c5ea4c07e422449081da0cf1771b30515bc63cdbe82635e3025713ffc0f56d6d1900748c3244887d7c68d9b94da5cea781599621673046ff43f8ecbb14e53ea300921b16e5b03deec222193f52b3b325dd9ad631c6e933cb147d83cbb355ced395242260f66e87059cb03568922dd0c4d4b20ddd90f3594e823af705800bc4b4ca4b46ed4544e9f3ec5dd01fcf74e28426042237b53c373fb7ab2ba08d7784b2ee8dd6548c3a4f1234ae6b8e3d630b52e61ab4f8b031c349f124caea74ad91ba16e1ce341bda6abde7b1ddddcbad2762666762cca329da72292876967ee170366736cda2a40e9e3c2b3cb523d29a7c4bdab1b8e130d5b493ec3d7dea6a920dbbeb0e51a5c55a6605b7125c8d0ce45db87ed89582803e338efff9c748e30ba310384fcfe1af1f7268c5fc5f7d3cc280d6c903cfeed9d66110a02af41a2661128815f02498b1d48b0d8a9eea79a54ddea152b552b4e566889b5003f6069e273e49ae9437ae5d59ec71ec0cb865a135693202bc8c646a88256a0cf712a8b1d3bd57345b148cd4e53171af122dcda5d0af1529621a0edb20baad2accbde7b45ed1f02433195802c0af09bd866e6fa8fdf9e2ad2690dac35c5dda13f24f37e2b91a3b890bb53814b40e32a963771978f5264235dc7f63fa82be5645ec084dfd211f57c5693ddd32ef309ce0526e2d226a56f498962c4b7bbc054e8170d8f8855dcff4ac4245d64811a2e580dd662575bb33a2d72973736a41bf55830ad71148335787eec433525e068093e8cfb2bafc5b9691c3ce2397dec4b1402682a8103b420be13475ad71ba9f8a9aed8d94f7f7f5061dcf987eb2d3c592253378fc14d0a3aa0d10ca2cbc59fc1345ede6b5e8b9aec74194974712a33a46c853cdb52d61c6343c784ac5e6f77be5263de5ee219e9bc670346edf8677756635c386ab22913393c9fc2ee7916b130897a55e2b9d322a1185212556c16b92e45ca748e0eb0b0422e27503822524a7c9d23db635a49ddca2b07864f2ab00c0cc0c97e212e2d35db65102fb97fbfbf135a6cd391078f7fb81c85cf2b7f7c9e36b0d39161ce7f4b5ec9a63392126d2f3b1085a10500c2cc860c8b24ab5c14b996467aa3c1a45cb8f48e3d9935ec51df6973fbbeae3ff0bd2bd1f2d42386d183c2ae4d966796a6773e4da07b73b34881c627ecac67a7bf3ed229ed927582558d1c75fbe91588ab00b2c160de0a456df45981f73dc98e95be68899d8d13c7acf6017f02802fcb034e168560d1404c5ff9eec40adcd935180b9c33ffce7eadbf6e571d741dfd3c0e92403a109ff6ec9b7f70535c6df2c1e60537fb3fafe6c99ca6c8b0acd6c2b6756b410630d3b060b3a58d0937a9b042b6daace8bc39a0f87d122c38209d96553ca6c745d74c6ea889b7dfc20508033b81c9aa083a0c93874038905878fbd84463427651a32acda86d16cd58f92e2bdd0d97a46866ebd28cf428accd2463049144cff229dbf3368a6867c3c2b90efd2dd5199fa10f547bbbe1e50e0951c1bfd086d5947976d04c2fe4977fe644319cfea2112622176327f4e129714d5dbe33cf8bcb95237a7e510e1668fb7f5c51023ae3db2b8ba49ddf9f0eca1efec402cda3c2d054fd682187693578281022468b3a6a604adfcb66b6a718344fd0d5a1ae03173449ab78a1cc829980e0f6dc5d91f8a07d1ea32c31b1ad785205e776638523f788c314347c11957bbbd80b374ef397e5d3a31a105daf920493b9bb3beb701ac738bf906b4fd03ccdbe4b09f923e5551f7241f43381cb5a27602af570624c14db3774dbf9747fd800249c192e67e9e63aac9cac9e48057fdf155a577fc35bf9134317099b64b85a8a5744ba9b440872ef8e6d7abf35acbd04861c2d59b53496632119b0007a89312cfb97cff6d4f57b2fe35793677261abe12b459edeb996f74c30650a0792119ef9700adf973c00b3537aaafe3c9b448707c100b30a24d3f012d414f36cc291b6af2ff94cdb0f76cb6ea6b129f466b702ccad0fd6d8b99835ed8e6cb3b481426c2bb11e57e117fe590091c4229924c34ef030c1144dacab32ef4fa807afda534eafe958be8892b6e843f0deeba39d2f711851a4aa693feea33fc437744459e105712a2160bc5eb054c35c35b424fe6c8760c4bc8f925ff452b7913b4e416749ee48386d36e3e6e9af29d9feafe3ccf9cf42194b2d24774e9da182a59e14268bc9eb81cc2dc0cfc232d5362afd0da1862d12b0264a62c0a9ccce61648967759e0359ca7f0ddc99e25682de13876c551f23cf4336f5d88716008f9526af3f14a99e1514872ca14569d290c9d9f36f655040820b1255fa0e97b3f80e17417959aac383f8ff197638a47624a058f704e1439c13fdab94e900836fa3911a13328a2347507b0cb4ff63c686a122e23b8ba0ee8cc21966aa22db1b92d58c913aa876ca8a9dd60853a4dcfb760ccc9e50e710b4339eb01bdd9344f2a30cefa95317b017965bf447100b703a07451085657c8df483679788121d675c2820ae1070248b46284036925edb7a06132ce2a943e111b585123be604d8ecc0b1777af93a540bc5f9e1e7cdc5799c65d7423fc518a862fdc698c5be32bac20fbb1d0f2dc41d011d034319fe02c2154e064cbd204fc0860cfed60aae55a8ba9230780f31f8a9631c9acf94ee20730242f7b695fca20b002086a4e04a300166947cb6d7812f754e5a83d5c76faff07a0072b7500c7b125e2e2ef15f6bf2498f4b7812d2e83149ea24a50185e09ffe5078f9da944a60a391365c0ffa96e6055388fdcda03eba851ac03e5d736651ade4aa54529d0612cbadc5c4351d28a5b7dcdd890d0dcaeb5ad2d8b048e1cc8a4466c149b577aaed0a357792bb1c26419fc750c681e2b5024b1392ddbbc84b1c501fa5c622ca68a4ecbd62740e5f96c65387846bee10b14382e177af167c12bbd6756a15e64826bcd3df531406022af9e179ac496343dbedd3cb7532cd23c6f3f429a5ed1d0400f42eafddcd34a6776372416486b5009cba5ff45a70c3104aa7eb6a54d66ac272bb83c786e4e3364e1e786f57083013d89721fa7e3a192e1b8633c40cdde621615498ff3c5f1793b704a27bc6f36580e6a2a5c1799ecf3b2fb1c6a516ac4a12c45c7ef87f19bfc750cfffea3b64c34e9d7fa75c8b7219b70d92c6cab6c13311850d18eefceae8df35d00642f3a7f79a8de06605c93fc23a9ac45a419e4308a89382675c9e79aa7833d9f52f895b26b0309938a7af24520e061c984d3276a136b5d094532d36d452537325942e7e7ff4c6ceaafa25ffebdcfe1b5b0cd7e1fa084ab3d18713cc8295edb83c64abe890725728f5459c01f9d46595013c41fa752db2c6aa6653bdcd0552384ccf118ab95d9d232c06df5ef249132161791026c1500853755faf0fa6caaf099d90526e7859863de08dcca5a5139b1ee568ae9d9e7f0093971d883122b9900b382b612094d05ab9746b332212b5aa40d02003f66694b1a77f52af97420a43f2df22bb29a4111a4912bac8fc8bbc4251de925f96561df87e38875e6b9fe69c1053c7c3019993f1ee0ee11504cc0f19810b0a43ab4fc2b76e71bd1fac498cec8a12509e856d6011e9881304cb23cbae4f84b5aab03de24141a7fea7da0389e61e37497a878addc42b5c8dfff061727bf557c580472b3351ace57e162b1d731f1125c5ffef82e93bf7bf6b7b4de5491f39cf1de74aae13d6e1f1fe30235a49080046aef913925db858efa3012f9244bac90106393713e26cb871b5f27171c1dea719074323faa6a5d900409e28500b0f057a3b576d045196118a634446f23802d29acb8dba93922543e846f905a3e5b1470d30c9d95b808c913a6ae0178d0cf0d8481e2cc478250ca4b44e333e3d6c0dfd7bb8cdbf49be5833198708041afa67e2bab4ab2779fe9c34c4b5f5f3be759a5eb9d9ba8d50671bb81231317858daf82ded9663245d1dfcb4164ce8d738f02ac146cc7d008c1fdb7f54c0f4803a0dbe5f8c3e605f2c547b89fe3339864ed1b2da0bd991ced317c40376c5f2a354e4627881315db417eb20a85c08d1bd5c4c6955273084307a62b9e42af0f55262e54c5981a6e110df34e8e1fa0b9904628adecf83e4fbb2866f491c85f8106aa1030aa96146296543ec21e02945003fba134e46f6e25f393dd0a6612aa102cc58965e9550e48c389c1c04a326470cebedb427e442f8b848df82a8c5d55eed0d1446c6e5d6e0ccdfa2d219019ad3d400fde350d690cf04d083844adefe5069c7066b0ea24854ef3f5853328d7bb2ea735b370eccec5f0f777a467c98f040c423fc4c3df237ee8b1e9cee6c859c860c0297667809ffc0b73af9815b01384834fcb56d3e782ce11ac9124345a3d34fc22ff7e0c3149d66f7bc8feb9743bb54405ea88902011cfd4ed07ee19c6b8e6de6dcb08e2e86427e5e675dff052652af14d7af936f032bbbe508c54fd4dfbd16921e7b1c1471e96f3a521b911e32a5888b5a4083be97a3ab843a1dacc19e60f161fd84c10fe94c9952829da6979a83ff25faea14df6f6d5c876f3103a8a93deb51a3834c9da185355a8b189585f7c71ca082295ba29e326e60b9d08ec5386deca533a03b903541380cdf616135e348c6b09a5cd4a074d7c2e3d794e44a0c4ab8537f3f53b12ad2c2a996c5ec0a1b6d9a25d920a782bbf2120262a71f816a66ffdfedf5e5dbb868d37517607e880d697720a0119077b19df4e9e8709a177bd25508b00c6c79d4b1c1ca7f607aa7b18e6f93e40c8ac9d8705bd9deec9626cd4aa06491416430f1e204177b62d1bd18e9fefa0da4d6e032f785851dcfdd3e2a2058b1811aaa976c30a067d9accbe4504abb7c2a39492889fe518dc529cfb481320dc05a785cdac3fd225936716b149620ce252d079b0f14a947bd7efa17868935b6483516f7653fe108e5c1da91db5a58a3aaf920ecfacdaec9cb997d80860e966fbc4c2cdc52f41fd3dcf8bfd70fc4a28f99128b1b5e0d412c91fd59a9deea1d9b5170e92e1ba12064847d72f9ed9a58874ce906252c6679851b735cdd5f3f17e35e0ec6117e83b9718e85bcfb608428bf03df02e2950a07e80844403f21b8b0e6ce349c5ca2c260aaa780949050d2d9fb90f890e0d33b4a8263b0f3ff72d06ad34072f3567c85a6e301d5b374d9a78a94e5a3523735e3f9c2db0734aa7c7c5787879687b485f1fce35966c742b896aee8f0361d98ff221b58f0746a0bb4ff1443b1f21eb26e1503187f52903a842a278d3cccffe3328876cada9acb5f109f1679265c39ff58a2f5f63162117f63556389d00b7ddb9cfe0346c62344ac0c9f130294d0178425920cf8c5623e09bd387d8f1d1bc4a7df18f8f38f20680ce2734505fccf2d7e13a0fa68ae5f7f949346bce6896c992cff605197740913534fc38ab50d679c92bdd04e6682ffb8581c3de476b13bed9e72cc7807e6ae6a0f0fca5cd9a03086c1a5971991a7e0a074c128727a4fb8e63240df8d4e87ba2077b50ca0c1de5ca6b4a09fd2d16022aad1342b0dfcdf706d13d433db3f592bb467f911fdd09969d1fcb4fbe4ac156a4227dfba8999642bbb7239cc6bc02d4e1cc5ffa47642171b9807bc2e62027befda4cf5d0b994e36b110580f40ae0b8505bac989738219bc3deefb4fb85037482687f8f196ceed78ef556907987d952b042016046c57e36e47e9d5e4c71d5fb7bd2327809e4663d75a402c9b6d89857d2d07375273e3142dbfbd1c4c658fc64e2436ad5d8a714d9a626b8c6a26c3ca5cd8b7bc75162e5ea63a1644e4365ed6b16107b8462e7186586b0b2c43f526f0656c544b70f5e59e809462b1e00853cae8bb57e39c55abe0e2435c53bf68c0dd39e3bcf6da3250f4ad1d47f1e9813b22b109c9f2ca6b06b362f8a0c11774cd90321561ea5633ae94828698a5b87a338a0a1ee58aa9e3759a68ebce835ab5bffab1cb564a704c220e8f451d02ca511d3a61071e59d7a638c6eba218fd186a9abe7144e21dc862d71cc14fbe19898710ec7321917cb26df10994c2d4980eae0c9c512cfaa4068fed52d0c57c9dc3fe75b51f333210839a37ff90e8508bbe215d7fd50cc4c90daa00e10194fb660fb38b9a85be80afd5232edba10ab7c98dd8e5ca4eaa6fb7828b529711682b92e5c980bc877a83b9d7f0b848181110e370bee7ad434463f90c954705032d56c0b86305b83f61642daec190941c8b687f46d70c0c0cb4d627c0af930844189d3df40c1ac2c5e0f19e598bea0d6405cbb41e35fd850f26bec7aae8873c883ba0fe69c268839681796ad11c090e891f6cedb944fb4118092d8b4397dce87fb4755b1ac74217d12597496c41370c4653df24c3df308c2c9605efcaa3e8fb55250eef97ba85bac046d6aa82d249fdd348bae7b1f6e658b8072a2aae3dc22920e419e656810cf8f80398bd4dbabc4df89b4b46328524ca43edc03677156dc05a215d2c504db8b28e876a1797ae0b57de85f634151a8bde6002948ae1f540fe4d5f53186fd979992d4bd95c2fffdaa0d02596e17b439ab392ae0f50e6bec0af1ca9668890801d5dd1c9fa69c06ef9fb04b9b0260e8279bf93f1fb0de27d60b0c0d07329f986aa78e6660a8d0785903e7bd71fa74fa1ad87a952a22ca0c215d035817ef038624b5445a326d84ca96a7486058add15801596906b1d78381b9092f504db0008628d32fbca6471359d445a248c0019ff3b8f6157b7b45c14c76ef673a927ac5e425c0a2cb71cabda5b2f323aa037543ffe1c84c1833ac61c016bbcda50b219bca8b2d210914e2e6aaf5483c943fd4e7c68228b26bf751cb466667a66529cc4c19812a8306a25776f5ceb24a601baca327cbaf470a61955474f3d9ae0aa8fedef83fd62d1d1e843a835c3b993a00f09faeadf015cb28d01b01fe5ca49864b667ba0cf0ceea8439d39cb2a9ce71f7b3a5a9b2774141bfd68baacae775d48ba40cfdeb1d1018f77ec090a44ca5f4672f8a1b6110421edbf5014dac6469e980d3e207f43e25353c1a7d4d010974e145a7cb8a5e05d7d79c7f4eeaacd410dab582adff9b9ef8ffadda3682651dbd8ee69d60464070908bec020c622cc00cee15aed981698ca7d413b83b78fc1a2e6c85bc11787374342b243093d26301476c94e671d7008c7f076dfc7d5ea5d765cc4e82b0fc85ffc8c6637909142f4f3fc943170002ee6e4ffb8a3807970aad74a2aa0faa7a3bdfe4c925757497aee9bd3c1ed174e3aa9ef62d6c8df963d0272545e3a19aca824d7ebb9e22d1818f67e98d5dc3e1b3c45fbbaf8a5e053db3fa77af51d975a22ab70321bfc40af2e3828542f4236adb4755552c9437ce84d39332588d33eae8fe5119eccca99d74962a3c9f09ee67eea15f24e58fdeb5536db348f335c67ddcf19dfe848cb1bf5f2be87f5641032816376f9dd3a983822463898a9ac4fa1c88294747715251561bed2933c08be3c006f05a7b3fce71c179e9fc1bb1de53392ba96d0080179c058c441b9e370714526fe5a01dd1ceb43fdbd75efa6324d799955a4cf9441f50c25e456c6436f95fb183851782552a4e3ba51d2597225b8f2b84dbd01ab4bebb18a49712ea84e86297c4be4e394a3d88646bc8da23d09373a2534fdec05540253bb9435ce0f9c1ee444de9557f880d3bc81ae16dee47085dec4022057b0d3cba15569f542939f58609cdacadf9d5055a9b123be4fdde7985a8a4eee0d37032769527587fa1e09cc7122c8323d1c7ca23a98dd63e970031d8545288d6224c9cc034e60731a9212a89fc6704e67f4ff3638366168abe7c5300fa1dc6b95f56e079cc9b97595750031d8d346244a5619031e924c5eaa8ab82200032737621f4e5684fa19c40de1ac18cc6d416ca42dc59e52b07e1a69f3dca3ce63ba55a4c1a3cc761148f83808c62b840b9252ec3fbb2060b9e7c75f6d94891722056d24771bdc8806d3c5124153b2e07ccbb16b02987c0e0ad70a29b48ddba6a3201ed15f4c055ce2b9e3feb5a7ff082215587c9d891c9c02c2eae1c5efd8625c6535ec57be13465f5d4b5acff1945f0a7a11b0e41546b1e8f3a3ae85fff4ec1c89c2dd44398d04e7689464ce2c631929b4652c9e7645684a0857d6c2cbbe2363496c88a5d05050fc76d488ba7f953959cccb5ce8e062c203df001a542cd5e3ec4fe97eb15619a9149022c9ad71b9de36a3a5d257a0d3ccca684666a703ded560df69a53ba546dbade63093831c306d04bf0ab91ef00f96e22edc0e9745ee374693ea38e7c9a66f766d395be678036af3520d65e817f05c7a9e4b5ee15decfdd2c40e6a75789c112a2cd02da7e7aaa27b57b50626a8f989630b47550d39efbdf17d08da5e066039e2be80c51a0221853d0d840fea4e5d0a818de468b455d1a99b98b69ba89c118ff0bdcb250fbfaef760e3eb3098b92512e0cbf2cd32052281727ce17a1d55824fe953029190dab087eb179c5981c1e785a2400bcacfb5fd63025983d3841b2123e21b529bcae8f9162068db42e1280053dae8de583b3b713f2f78738df67188b7a01f40f0918fa1e51ddf85757ce251e903bb996d87ae4c845a420e6333e0a3c292521190d1318d4840446166d1241f4a837b47179ea554e144991857037225cbcb44e782a9c08d58f166da0e7dddd3b05ff2f7cb5ca53e445a3e6c06a1e3e03c7912619a8418606b4b5a6d8df274ce2aad313d5ac4305024352e9219046a0ec8ff68f6d7ce075490b9bd41fc9940f8a73fadf6577a4742f08d0524f72500d944e950ec1a7b45d2bdd46df4bedae251dbfd53c97a4d3c746de80214c46675522ca77fcbb13500597ad629d5625f9c2ea4c38d1334225b00ec20b9127dc4a15d65f129f4f95668768b51b02341df16c8430c163878ea13ed24b683b993732cc35b987c78e2bd25f1fc6ee4e152bd489baebe997a247076d380c092acecb79c91213a29ab370776cd2c3b3871204cd156e2ce3ff091fd31b65cfb824f14f400f6d9bea7894b8e2744e60b68cc0c05084c024e1cf64867a132f7429c9411fd0c9e225f4828bd9f523bdf3f5a8c21b09dbb8f4770bde3a488928ebdf0ff3d2c300bf6f4eccc94c5b1e4551ef25d144cdf78fbab3fbf37f01160ecaf91b153e6a9322575c082c4eefcfcb41f606eacbc87e9ad7022a0916ca782ba8a2bf4f408d135a1605c85ba1e211a78747ffbd1ba7c36589bb7cd801166efcf55a8e2e9e24bc6cbcfbf1ede191a777fb4a6a67a39bb92498b8d06b287882c859d668a7757716572334aa19f4624fbd7dfb3cd42a34f6f12da60c850a21a2e9998bf4256b961200e57621dff71ff89860ab8f1388b889e6836fd22f120d9f42e08f4999454c0523038e056404d989a3dbee88cb59a57efd7c5bd3827bc85a0bc8c02953ed0d7dcaa108c115a48ebe00c19ac6a0b7daac1b1468d6d8252e93f061bc381523fbea0f248d4de1945c704fd01510d54aceebfe791ff1a44852613dbeddecf2e7fdff1e981cfad3c615f65ec413546c787497f2dadcb2022a6a2aa463bdef07ce1f303b06c8413357261f8d662a71d344737504ba69b8be1ea8252e6838ca8936dcd7041dfd6a646d1cc0b12436f3c89a7feaf8f57fcd34f860017798b1cfb22395d2f2836dd02988ac37178f82e5c543a98b8982e59a0729168c866526ce53173da0b9300e6c17ce85a74032f052a82142b290911a0edb93bade04baa6e061678107143823fbfdbf3c06c0dd0de671ab6567cc3ee3a657e7ecf6d10acfe4ecb89f9698307623643468e0ecb86d9d9b18db9ebd3272d674b43d42784367f2454b3759ca6bfdb30a9001d8b0ec48ed1378d40a33524c3a81de9f331833c8a3e9cee970f651dbfce88b26ed8f6a4240fa2907529e11a44d4b35483310d25e3c006f2d7d51432acc216d43a4de48db275262f925ac1669a7e6e9317fac48f5a8c60620767062e78bc4d93c3fbd5dd47a332512d2fda7447f76a7badc77f862f290ee4b89804280f591a6badc290d3e128c46b681e69d71c3ed2a3b6cc4c530e0479309d6287b692e08529de31d830126afb4a4652a8aeb3303d3547d00b93b661edc1b226d6d79a7761fd1e43264a090a0d8e9cca3454ff74b8257714e299ed3c6f5b6648b9c26bc78ff09121b9a485282e4c5c2b240129ac0819c8532b0b9cca4472c180836f7285d09386581375779cb546d4c8ac6043b3255ab1035c1d6e07647f453130bbe2aaf04e5b7bf49d0cd6474c25a75c67901a23870ae77c32e61af3ffea207f8749100649c3cc054c36691d4127bfc7ad18e1f018ed75f0609001dd83e41d6e2ac66964c248eccb2802c378c9252146c8674ac23b81fc13b0089add0152a1141a6472370df94ae57e54ab1c3a26c55f24a1dd0ccd360e794f0a63987a08d50ffb84a76d3689ac1211ea5d8917dedd6abf81476dd0ac1c7017aee6abc9ee1a41e6f5edd0b89b9d99983857dc32914abc1e20c29c2c2882c21923c947c980e43393500716ba97ec56ce33fd4d01240988636baaf5aca649f87fe606606fecb888b6a7c62dc99688774d648982ce1cbaaa3282467050963b31d95c29f55d427d4166b142f767a695ee5be116bfc9455f405c12a1c3e7dbb14564f94c73dc0a7af0aba2b89c172b2fe5f9c059c0a51fa792481ba1fb6f97faed51fa1e1857eafa818290875f34d876e2a17e5adcc7bebc7b01b941b9934c2e4942e9064d836f976444ebff2dd6c52f44fd9132f4a4a0ab659f052f5b80e6696d217568dea33b7a90302d011384961f7809b0238ed7e26a28492676e4368ee5548a3f5be6b7c3f4342ade03db48e82bb247dc95b52638fc38802881d0c2691f2801d0be3a66700ca06e22070d3987ff4d44db8f952832f0a74e43f77b7874bb68fa67435fffb3a5d98b034ae7766999e8c9563366a70d86110deff01dc7cfae0391be8ebad2fe2d816a06daa82ad16587e43c91dcad74b672541420d12c50f82f737de005ad7235436f404e87ae5b3ac732a92a34bfa3c20f267fd4c7ab07947232044ed716b52a0eee6bbd8388d7e4d15c904a4ac17bc8a7c57032a9e8e8a5c30ceba4a078e335cf0db5a938e3233d9e16a503d741755da53cb2b848c86c25199e1245000f93043ed0b8ca80200a4d1cd64118869789d5e90f2b393c38faf9492f91051c29563e737b8d7c5c704dd199696ecbdf796524a299394015b080f081b083dddfbbb0e92e54cac171d082fc24500c43d3192e533573280171d8acfb0e33fc3cc2ba48f17e79700bc38bdd079718ab17b78f8e26c5abd38b570f0e2740200fef30889f313080d369831481685caef5a062fcea0a9e47b518a91645422baa2362f4ad98e17e5171e456408b2077fcd8b52a900dbc50e7436cd8b9f6366bba86dff1cc9aa4168760028e60680a22e0104c59bad251901c5cc0050d40b004700c51b8d480450cc0a00455dc4a5116dfa2180e2cdce50208062fe0014b50730a84d3f01a078b3f3880050cc4440516f10146f68363a0028660380a22e402b1b6dfa4240f106cf7c4031f780a226c06bb6e9077961261628661e50d41d30316dfa406694857f80621e00286a01f88cfe8ecf70cb0728e60080a2d631c2ad4dbf87d175ba30baa20f0050cc1c80a25e81a2ca69d30fc7bc012866ad0128ea1c5054c1367d1c50bcb92ebaa26f3300c51b15088a2afd81a2a6ff44f90614b3e6018a7a0798b46d40f16657998cb26c0d28dea87480a24ae70045adaa59e300e9cd162d28de6c51dbe055ba1615499d99a40227a67136b3e19bd31a5112b09766d4d42475269426457369ad198cc2742a8f5dc49c9868100d923ad9680924d86ba63edf5c37cb3564a1ecca2d2525a9c314862ce6e4464652c777b7e1177e022761240c0b1386c32d5c05136121ec72fa7c6f4e6540c96257264c8a3109690ae5ebba3f5ca32b044605a9336363665032398620757cdfcf375791ac601a93449c2d933a54db5c446c2fbccc10238707fbf9ae9f6f4d4657f445215949636df91d8d4d8fa40eb67c20b2c73f67b1ba7b752315f46e7bce0eda5fb6a9267b2d49007b326dad71b66912d4a63ff67c516362e747142005d8b283098a40f6fc1f76fec654c294404ca94bd3d6db9f7ef69c2a5a7a983d147776a84a2582ccf6f7917252ea5cabe420875486568656665b9e200fb1b0b267ce13a6e7d3393fb9bb3d6d0e91aef9405461026da74892ec49bd6c31f7b03939e80955ab5beab9d30f7e53eae1299cc4113ba16def4bf92738cb47bf50d65aa5fa705321fa725aedc559dbb8ce4bc9e899ba6bd2e66cd0dcc081812a878e1a9b1d3c6efec3ff9bcba0cbc02b92b327160f2d0e4e475f3467ad73cc3407e3ae38a741e7f3714c74e57405e6a17d24586ca645cec5b99c27c8593e6f61b287522ec63ddd7baf067f2f0777f5f7de7bc3bf37c8fdbff7de7bf3f7b22ef8f7de7bbfbf97e7dafcbdf7de9abfb783cbe3efbdf7eef87b815cd5df7befc5e0effd7175fcbdf7de1c7fef002ecddf7befb5f1f70ae0e2f87befbd37fede9d5be3efbdf76e7faf8ffbf3cabd7706e0de7befd5b95368e6affe7befbd3deebdf75eeeeffd1000f7de8b736feaefbdf73e8de7c1cd206783202c9e0e80fc188000767c0440a7070034c0d10087831b2b1dc20d34c8c1c9c0c6df70cfdd703540efdbb8edb79b8d9bb1e96ab66db3d96ab64df3e0766cdb66b3d56c9b8c6ac360db3ea523874c25c340e6d1641be3138d8d0e870e372e8d8d17a7c376d452b9361db455c964797399ccc7a7f18e3e6ee08ca6b5f6cbe59a1dd49f6f0ee394cdeedd14f7b6e7eddf896526f9d898eca1201c398bd26a85d62b58b687f3de572ad2a702ad5eac55b6f7b548f684ef7d6d39ab6697e76d6086f4a9473c2f5234b677f35e7dbd9e5e605e514ecec3a30ae953953a78915ad1247b3e2467d5714c1ac791e98af37c11d2a73e0179911a01933d35ef3d1d725695c968d191f754c87974bcf7148af4b1403f5ea452b6b703ca59d6356b79ef609cc7e6bd772fa48f3d7ad1c1d81e064bceb2af57d3cbcbeb69741e1c4e481fab248017fd0925d993e3e52c3b8eb011c953bdf7ae83f4b14f3b2f3a0fdbb3f19e9579900f156d2fbff7538cf4b940d3879d63c2c89e1b31675d974be68272cdb6477385f4b94701f0debbafd7547a2dbd9ab647dffb7984f4b94ad387d5797126b1bd1aeffd2472d61dc76934bebc991e2fce29dbbb4fb23000785186b1bdcf80f4c140f3bddf80f36cefbd0ab207bb64ae984882b3b0cbfb22d2071f4d1ff6a5922702d9de6b04e7d1defb10644f7def43e749bd062f6eb0bd773c7ae08b747b9f237db0128eec71161ee9cabee7fd943ef869fab0ef79af81e78197b4ab8bb2b8eaca711d4d1fce0acf1165715cd5ae97d2f4e15e1d286dbbc964a36c94d5a7e9c30101a94fdb7e9551d6368e553656d9586540d3677bfa01e4a2acedf572bd5c2fd7d1f4d9940670f4a2accdf57abd94a6cf762400a56d35996c948db2a7e9b301edd8a76ddfca284b1b472b1bad6cb432a0e9a33df900725196f67ab95eae97eb68fa684a01387a5196e67abd5e4ad3473bd2511a292bcb64a36c948ddbfe7d9a3e1a508ffbb4ed5f1965e571bcb2f1cac62b039a3ef90900402ecacaaf97ebe57ab98ea64f56e2e0e84559d9e57abdb2ebb5ed63a5e9938fa6064a948573d65886c76d1fe7e39e9ea64f069a3e641508c8b7889ff653d9531995ad40fb3494d98083715634c801713200410ec659d9f6736e523c38ee75f3dc6bdbc7f9bc97714037321e321907b4ed6750d3e9189f6a461de3f8b4ed833b389beda554b3bd746c2fa56dffc360c3b1b9b6230c36178ecde56daeed68dbff1c9a4ab6016120c321f3641bd0b67f6323e7f1c9c6e88d797cdaf679dcc034da4ba96ba954faa5b4edefb8976aae23cda5b934d7d1b66f53c3ce649906d4b564b22cd380b6fd1a239dc7a73c8ee3530d9ed68b872fa5acc197d2b6cf693a2a9d4cbeb3ebc8b52d78b4eda738a11c3e95641968fa6c2328aa545a63d9ce40db2ae98f7b926de3f4e1be481ff66d4bc5c5b4903a761bb77d95f7816f1930a78aae9b6cbb93f3881369c79c47ecfcf3ef590478fb53698e7329ecaa8baeecbb5c1f3817fbb8274ee6a22c0e8cafec87d996737151dbbab898d4b13ba78a1637d9b6bfc99c07cc06c5c168ce5a4b0ec90d50b995742e666dd6aae7643e2ac3e2dc323f559a0c78019c1054903deeeeeebec3f3c0531f0a1e62145cd91c6c990505aecde974f373ceba757fcf885377b73216dbf5f3a79d6ea79b1e50fb1944e1c62b32c116e6b6e005a48cba165fb88eb65402e8aa3fc5acd0b10279c57568e31ab4f15331d2474a1fdbe3a761644ff7acc9346663c7130a8cea098bb429f519ff6cd2a09851e0e1d2fbe0c88f15ea7419e5219612fcd1cd8fee681af7daa6713bb6d7669ba79b1fcd5aab7e0cf7dfdc600acae7e119a9ef3b3c112a131393b7349d4c934903b9209d134dcc06e3c73b4c745535d734cdb70f3450771ee6fc6108c4cbc60fa429c706cd01e92efe1adffcaa5d8105bd2b2075f05340fac05545592af80abf93e8318fd9e0094e210cbc22149c4473c83d83f7834c1fb9e3e1bcdbf4a9efb258de728c93e1f08a5cb07a78856cb3baedfa2777cd5da76d910034dcf950f594898eae83c81eb977360d695efc1b3830f091db878ebec2ab1b9a46e5ab95d672784634217494d19ebe9812e9c8b4f1774f71784552600b73cb8062eabbd75ee519d1de035b981ef3108b1e63fad1ea400decb4ea7d0b75e74722b3f3dfe764073e7d8e7e3a609a82f0f45e58464270b8f3a1ca5b9476ef19a1413ce4412226991327041584ae38cd30464a2e0b8235d1592daae17970f347e319c9e01c0245ff4964348de88bf7690b48c82b72535c900e7ff8af52693de60ca1ef4feeb989bf7b7102b16b7846f2fbcf18394f77f49af144c8294febf09b4393a8a3e338e6ef5e14f2c022fe4da26f0ee550c18f82d4c1eeae4e88b350a02bac04b524674d58ca1fc0182d4e214b97a40e7efad151882f31fc9f23c7cc0c550167d7b450b73f1299edf9b387ce231ae1c04ef4d745b6f7231c38893238877c0a4d21222e7bceb30905ffa43c6a26a78c02a5ed15f1dec116e607f953ef9e7f4e7d2ccced81297846dd0764fbc40eb60bf18cbc4f9c401c89418c266c638c9fc39db79c07c85d1a7822e4f7bf224773d65a2ce4be14e877812d878aa64b7404e188068f70e0053cc4cfc2dc1b98c28f17f0a3e03cdb63cca47ddcf6e579c5c6184856d24baa9f4c94557de5df650d631ce2e778ecd3af7e8d4f888c64eefc3b94e54fbec20f66e3a8240fb33106daf88336fe1f4fb4e87f57a8fee4f8bd22146c61ee0c6ab0fb68cd15c6390b37701247ac42bbfefd797fbed350d09eef5836fd1c22cd45a9e09df781ddf9a5f529377c737cd022654d222faa26bd9484ecc9811e217dbce88acf5c70e127e8338a44dff31630ffda22f3535e91f917949bc23aafc8b49bca7bc11e1e52b08e30412959142657f591b4a45de98823750059813ee2ffbb3ae82fe93fc41dcc41e8191235729ea35a93f66d39cc75643ed2f695fbfaee84ece9be7e37df03c5e9b2bd790b98bf7945e63b9483f1996c86690c6afa741a8bf5a0459fedd8b3524f531f7df21585499a7a5f39d59aaae87f28f34b1ff19887f55998dbbd7828ba93c3809c4774a75dab4bf6c8fa4960c6a830bbfe0f18b4e84eeee43c1e73e9d291a8bb23d125aa44b160f19c4daf7858fdb9499f3cac150884e915c8c34a6352a7be10fa087d16a62355094495c89eedb9dfb6bf9fc881e274d9e6b0e8ef3207e361fd9c1e747d975587c252a9087675905e79ba3f63333663dda657a897c7b111298cc2fcc859da8d5ce25abffead4857a44ea558bc68fad023a48ffa957af926d592a64a49489dfaa2e7b0eb733f5c5aa43198f388f4efd72fb2c78f50ff90c8587fa7a1a23ddf7d3ea5e01cba9da8556eae503757bd4e596d8a7a719e1e3416be4ad39f4f9f648fa493562ed5f99e9e8775856a77f6d01271a0ed3b149c3c48ee0fd164687c04c9058f50f07ead427f86eab306ab874c3879438b9656cb3af3429cc77e0c170ce11b2104e7a9b1e007b66efb41926d2b0d61841c9f5c51f76ad4ae4f6badb2d65a6b7561df2c575cd9a21ce5df0fc179ee8fa0a239abaefc6ab0fe21839e2d0fa5644a638271cf33342e4a29e5e74c8f3e2769473f107ce30fa2895cad0e4a991227845215826c0d04d96208fb88fc4e0c617bd769da431b5fe34f903df9ad9e2f93f26eec39ffbe8d1a9fd42627f3a53e51a5f70557989f0a415436dc092dd0b267befdd944f638cf7dfb53c8ce2b2205c50f6c79c54e20e731c1431baa54f2e7bb6690ec9992fbb7765224e9c3bea863b59c55f3d321849e20d878686d9289f4f22d9d394fed0312a5f3d39f4f73e6e867bf15ac7d77495fcd7befbdf7de9ad4791ff8bef7de7b6ff579e9bda9fb61ce5a7b185e9bc569698ba1d427482badb4f2f39772b6b4f33895f1192dd55a6babadb5d61c1974adb5d65aadad44b22db35811dbf6a5d7df62be9fdcd509cb96599cae6cf7a6b8ed59634f1d53f64c4daeecdb6cc73c45db97dbbf8ad98413ee0ff10bde90e9743138b9e5146999c50a2b5b66b1e26873dea9bce8a6a524d1a7a391d9bc907c2041640f1a6364687fe44abcb1e9933da93742d40ccac3a54d43038af5b52bd0ae11db63173127262c5b6b50a4443bca630a4316734aa540d199f6eb8924249895dd75a0e8aeed5406942cf6b461528c4948dbc6e1d89819942c67242b98c6a42b9bb625dad93b5b4be36850dba62f725bbe4f9e3ee8ac51482964382b1572456b8c8c8a85d64d4f0149f6bd56a98e7bd22dbd9a4445b28238e0c5da43035eac4294f0623d8204aff1fed40cc942c1c88bf50506bc589b2ce0c51ac3086ea30ac99a2e115ea42950c08b748b222f521684e0ba08c99a30105ea422f8e0456a020f5ea45912f02285512892359d10f0229d81c88b94ca7e91f630c4535e4896b70ef0a28b618017dd8c02bc485f1022e38464f9cbe745d7d2f3a2574180173d05415ef42725193209c7599208be3a68d0f225b883657b9c33d775dc10cfa2de19c43f846e1e601ad504a7f6947e62b735aa499f6e339d765ad5d1e049aba6b1d91857156caad56854a1a6654da3d99a06567b6f9d9fa837e6b4ac69793e0627c6396bda764268a9bdd652fa73ce3927a53f2db5d75a6bafb5d7da69a7b5d65ad05f033bfb48926ed68871d2d68a55e8c40e23a163bad79b820e4ed061462bd44de3e10d2d7a6aa973bf86ff2a95be5ef40929489d8b8287f77384d0a2def763f7fe910d50d6101530207d24307ddcbf7f5fcf21b13dafd8f367128b9b4ff82183963d74df9f462fd0dfee6f1c0625dd91308d9fa6e0f7526b41fc9c6704532a653b9b42e5e94634d28b1bdb8dcfc627e5782754eeb49c2ad5dc4013385054a924b881db089a90672c386b8cb2868c4e20fd46e0e40f710a66106824db390f96c9f9358953923d9e13b22725f3a91428cefaf2b8fa929d95ef7747cd987bb31b38db665af5219ded189d51564542ca39d248cee37bfe48c791ce2315e6e1b45291ea8bce26fe5918a82807b3e7ff8041d797f36cf4079a1fe22c1af071e813f5329b3c9c4b37b468fa1cfd56a8938629da602df270cea4ce3c729f85b96945aa583aea3cb282a92c903d5eeabdedbd979f98023d707b2a6e4f917eeefb5cf7fdc61487c1b2ed3737fe56f02d526a86ec997b3e3d63b26a8caee6cb6098d5c99e55863d5bf8452057f34db0e767d9136a4f2e629dedf99c5791a4cefc9c299a22c5f6fcf91628569f8a64aeb9fde63c582e6da24e1e4eca654fba14c659f3e9cc79f03f8eca662676f3e992cfa7239d383634b469be3365cf033ac58abf89e59b41334916c6de2966e447328ac8cac67fb7ed3e12996d04ff055b98437cfb8ed0df6610c8c29c51b2a788b3985a8ae9a455fe10a775d3bf20dd860ce930eec08b69e8af02de2dd01e73ccaef4936e7ff6f0d07bbafdfc193567d307c8f4d1e56c247828e5061bbf9633b246eee654fd9c01458d6303c59f3efa3529545f8e5c6dafa596bd3d069f137b7b1c05d8dbdfe8607b379201c59c02b78de6dbecdbf87e6c3ccd097b1349d81b68e3e5a64988d8b06103c4913a1b48f372d31f9a772109119ab79686e6b7ef7aa0b5294d0992880d319c2158c1eefb8979cb9ff4ab88b3e55b210090b187b0fce9729e2b7fb65c30611b412a09d9b549ea95c8a46472a8294b6b194957a9d4cb4c29864bcf820553f5c019811f28394ad1b4ebcb3ae794b5f370669a5b3fda39f6c22581edfa72f7d8f291d81739b03d10891cb37fb0f162fdfca1f31cf13ef450a652a9542a053ee8396947322b985f4ad943aca037f39904afbef74368fdf29e013d1089f6168362b69e0732bf713232325aa60192c8e55effc63da765b4d6325afb8ef33eb1f380842593c88dbff1338f648ed95ab6f748e698a5ed3da62fa33f2d23da2da3c1f7d0f33c24f6c5d4b740f70f1dc0f172d71a8fe3fb99791792903003fe2469251909b9806078a145e4c7850f8c59420561948186983144665e49122233a0129abf910291d8f7b81f66de7e343640570e22336093999f81ed0cce7c3333df05e8ca312801a9e3afe399408b322684fd99b742ea27765063066ca222a264e66b804d32112599aee42b513203bab055d1e1081b6658220a23221f904e2f314a9a9eaa4843082292aee42ba9f14a667e03945503d47425df41155dc997719926ae8a2a3bdd25655df79a4384ae4fc2f431926082ac596bf7604a1d9f2931498d8273ed39b779f9dccd6bda8df69b767301674d28bac23f299eb3e6757c8e573d063c387edea0791b357ece6821431210c20824384f9680b3fee7a7e03c746aee19d1344d48065050380370c240700a7da0e6f1353cbea6be6351b4555b66c1026873b5dbf1dd3cfdb4ffeffbfafdf0f6ef979ffbee771ff7ded77dead3fa6bd4781a9ac7f1dd507d187c8e4ff53abe1cef9f8eaff9fc6d3eb96f7e884f580db6d9f1e1afde0778dffc64a2fff8e70ed0a6061473ed6abe9b9f3b87082d4ea809f5a263d9f8455762e3175d48083fb7e39b9b47cddb7cf58cf0f89aa73cbee639ef7688c0e36b7e88efa8f95a987bc7cfa8300e14f443fcc6774dfd0bc8953f940cc5d9b2e1f1edf8b2873b3ebb6d3e0fb4afc1afe39b613cc49fe3f39687f8559f0379881f83cf5d9f077988ffc6e79fdbf89cc88b3ed79fcb7cfec2ef7d0ef32b8e743fc792e44a1e8efff9927b53f61975721eed77fdaeee5aed27b5cd1e11623577affed683ec5aa767a4babbdb26772ffee4b328143c6d99a5cb95dde5685b6b6f68d1d803c1e737a3b0bfcf3c0cc63b34e7bc71536e5cbf9a9c358c71ee7276d0339d87136a688a21595a9ab131c638632fc8e59e833b7586fb09e53cf9797c267bccf846b0a0c433aa89640322d84c318de5f01d408420a58a27050900e931e29e160eb0852440f2e0dfbc6eeff0fb9187dc73dcbddeb4b7f7b6efb64f4db1b2e4bd8cf6a7d3fbd4adb53a6ded3ded53e3ce4fff62b132b494df6508b33508abe831d163a2c75a942ed5d73b897414a2ae1e3836236da21e1803c18c93e331ee7307e278453658d5caa55efcce73ca4459381ed3590d6d882a1ca03f81220d0a6f809906f428edab0ef41507e617f3c679de7beab74d6fdb96da5e664b6daa6ddb3ec8b66ddbb66ddb96e319d9ba6ddb64b6ef3aaf03c189e319d9c0143cc45ffe21ce851dfdb66f6e0dcc86e99c4c9db75c4dbed7a14a148baf9cbe90ee47a9481ff8c8431c16491dfcda4789fcc96555360633141415a39449f6d0ad514da323dd9af653fad071fac0afbd967a24323bf5be395013b2a54880edfd8e8cf7da93f1bcd17b21cec3bde7b3bd2780f43e88ece9def33ccf7bcff3641ef48c78329ee7698fcd3c967951bfcc8d5764060cad56eb094d4113aebce5091213bef6de7b2f045c509a26fbb95694ac3c011440464b3c26d65a6b9178f295041365021261804c482208ef689a1a3f4b96905ba8c0b0d87105587111490912ca4c7ea680090a98c8518a1f7cedbdf7de8b63df7befd52266b6efbd59b4e82c29a8416ef1824836114608cacb154ecc96f0e0f262975c5faacca62934686826f304370dc99e5cb9f7de19165f49a5a526ed01332f610d1dc0884571c117504d88dc1df67dfd65df961833049530c43873d7f5a2a8cac507345cd5015c185da24a45174552b80294305151f282285230a94c38456152b493f1c516638ccf10a22b99f3cf0d32dae414443023308808dab6018c600c125f9c44b0022074706d3238e9321be221bee00756748318980f485ca1a105dc1623c238d9a10902a8254304c929c080c26310e957d1146ce402261915d43003bef6de7baf962186f6bdf706cd24b0d8333a202bc5ce40492042a889097624c3740415453a218b714eb0b04e8860ad566b0a26da320a588bc849511dfaf071feef903bd18c4411bb4e6890c517638c3186a2096a639cc31014add2345adf5087cea801430e5880d1058a9f31c65011c20816dc07ec300baaa207275c15474f3efc4802821611484cbc10b1c5cf84c2618c1fba128ee0a18624ae1841144ae6932e320419618c711090af649091a021adea7e5250c49210c8926a80a24395a11b4034f9f071fea160cce42e859f31c61896e42b393239d905c062a110205c3c18e1258b2b58680f5d8af0ba94c0a5559a46eba5314362965c308c31660213b431eea1cb82461951b41f262e6ac03180382f78428b2d404c61e50b26921859c0822c323198145d2c90c08c20ca920ce30e328da32516482d58985c18635ce5c3c7f9b7415aba5cb10d6d0da0220811784d00e921a78d68cc9596eb0b580e38074b74022a122a87555e2b4843a9e80730309528f785289632e00a59138ca5d8bb64ee501c7c1e91341fe7c3c7f9af42450bed89b5d63e31f2957c6598465225fd183ee009d34e102fb90aa127202a85dd42d3b8269a2685144d4dbeb811205e55a986a46ee9873a8009d7bdf732f1d68e945454996d8cb355420b0d8c1d722ca850c2894b8a6108638c9d6839c00917187ff2f4848a1374618124c61833f9f0713ea84b0a0aa32219c688fa82a50c5c44654c92a6699af653e42b7964e50a16a5127e9670184230f1e104569c0cc1840c430a1745d65abb84155fc92b198b56522dbd91259ac29d2ad689fe9a74efbd5a64f0b2ef3dc2044a206901c58c9f228c83982c9a946c0892df5a6bc388f94acaa08a84316bb98a4009e12064c87eb44ad3688d6fd0966d015ddc34848238e8d1c245d40ba2a2c002862e36fc28a1699aa66521e42b4964f482212519c9624ceac249ebe2cb931fe20e5cc64c7162cc099e98627471e24a54f5408c28ad20664c5c60a96734a518d074efbdef23048d9a664ad012941d6ed0678c3176f94a0a11d9225b18fd1845c8b0a488a84b1337bc649210d22a4da3f505bf20995165a8082943d8862dc61a59b640810e5f77982e8b2f166ab55a31608c31aeb131c618bbb6dc2283d0c6d8b593c060a225017df83817e3ba25cb0d395ca37ad444ca3d62ce643269c8702706891d8b2fc618638c316e32c2cac6d80a4d0ba4705ca0c829622fbc6028081fc4bc8892b840c92243030e5aa4f03065054a44f105d7d02445152f0a0d5cb23c63a4186717bcc08698983fc6788c2669204dbc61fb846b63998d31187a581b20c62593f029484c1c146f26c5698b202fb27851a362c0d7de7bef55c0102d4dd3d2c3089a3811c2e8c7059806241f2a52102e269911cc7849914c235dc96cbb9c819dcc2636bc144394b404132a4ba4ac00cb11627cc1642597a525268c317e828bf6908d1248100514315aa0d81002a3218c5a60b92c1947284a10dba161009391d5b20570400206298a20818bc98aa19264c91353d3981fbe98155130b6502e387cf838ff4d59c420858849c489549c1882660b4b2d529c5ab70a30568c2a3b425b6a88a2822f4870c49319943c29f1a24a9221588b0a0e60ca408a61280bce0b4d0372460f49d0e0c44a165e10c153367e5db497e8a00417b2041e8ceebd178acc86dc321446b68778b652f45333a8035e18b5ec4d4fb49c8a1f2daec75c98e84ae6265aa569b4963286a6699a56e42b7964e50a16a5a5052cd19414dbf7feb8039a8062b2538788f94a0e21cb4340e921662a225a4f842bf42efb4ef184114245f98bcc842f505a0b0b70d0863e7c9c7f210fdf7bef76b7eb5234dd1054a150b282a12a6ff1c518638ca950a2b531c63570d1fd6895a6d11a1301652230553af8c08f1645428c71c4c513938c222b5eb884a317141c143f0049e1d2c36c630c055f7b535130ba925bbb4b2d8021480a1aed892c964cd932cbe2880722a2789112810a2334ae931ff287f7091a829aa2e81283c18910d5034baf2d34887105891db00c398c51daa116162be2e1c3c7f9bf181812a30727c0b852051522b7a6b12f0e44eec5185b0d4fa182102c696202511469e143154fb4cc10021aa6e4f0650fedc841e34806335e512ef8c20823820033b524b19480a21ec000d3da320b8356d1524516a9a0d1e28b855aad56138c31c63936c618e32d474c1be36cc7259a949d291cb64f348d8a29464f90f8ac598c313ec3e52b299489f403ce3052bd6be609eed2e2a29950303ea93c542e4442331d232ccab862044c284144858b0e2e4e8a1aa880e2046bb55a4fae6482b2e2c485c9101eea92a4699a06f395444a1a999c620f1843e62bb9c52049617297178a6820818c66354dd3b4fb9ab7354dd3b42366be922d971091d16d00122f8ac3fdd162888240f518638c957c2597624dbe9256ab2110415aa569b4c68106dc84039525fa6b0c3a1830851394fd7b31de72451a1bdf8dc128c4c4ec96518a14a37ad444886dcb134948f91d7c826af1c594a9d56a51c118638c319eb22d9bc288da188b2562d8b62d4cd0821ae38b26a204e1189ad208639bc64499819e41b110143f685439da4952e4840f3f28e170839527a6174c70d102a858abd58a6225153324410521021fa298587c31c61863df18638cb36c1ac18f56691a4d0375103e4041b1a40b204d9f08f239676cadcdf9adb5d6da28a85c42d4ace51222ca259061a47d9a267fce5a105cd62a1a560933d8943a672e64bc76cef96d9ca7dbf91f27eb336625a0d17a2c72b6399909d56ab5a4dc2bb534d1b4ef6c37b9768d2c6440fd7815a3195e4489bd60c51437c81dc408e386fb2f7b780e60c6921b6078418b491573563486071b3235b2e4a22b99996427185ba9513c11e48442b9f77eb7afdf7b6b2d4307269e68594195344a40e46229fb76a1b20315306b5dc539bfdbb8fe9481914559ed7b1cbff2c5108d0e3f186f50687124b3c86634bc38bf7d7db981bf2ffe8ca1f8e2858d9f461546c9c66fe3aca0c5a864cc184a7b9aa1a90100000000c3160000380c0a064442599ea6499cf5f614800e6596526c50369d86b224485214c510a3000000000000208800829073b4a3001789589a955a9b67b75d52f2f90cb9b4157bcdd2c16ce3e00a990a31292226c739bbbd9835c20adcc6afa81012339a8037382fdd96c7f08b065c974661e27fbe4b6b2600cee951ed6d1c1c96205aba8556c83643ff8511e10c604d7a368661f77c56de01b4617dc87331da1eb9a09829d58134a28a237f74e4ca32aae8855cf3505a7cdce072f6b98838a5d6a375f2bcd63d2c995f60756cdabdf3d30f62ae806482f2e47fd2d0745d633cb442a43114e0ec4bcc81e0860d4f474b978ff8c71f480d3364e88b3bd2e3bab5e32faf69da18b2cec5c44bcde9d49c5e95099b68a5a701e4e6baa1272bbd14fd1e7692dd4b3bc99b8fba5a9c3c8ef5ec7a01abc045be1013800ec5369816f763a72e882d5cfc32bef807ff526d70d39601b99b926465357582a9a4acccd80c1d7c0992d1a68bfeae692239d12300edae46f6ab7ca0bb8d1ee94cc9925dc131abc92cd9dec37e20944b2766e17a123882e69f99e7e34aec1c67275835854084012c2b051d2f3360ef867c98be957e8668364aea0a8a4054494ac64b56fa0f73e6a633ffda7d13a6344c142b028d257aab535d8cb8d4842da4457587a87159ef481344ed96963c519c67e13addafd15397b633a8a08a34b8f0ee2193806ba69aa9f7974550bfd34c867623b14251abaf7165845690ee8d4aafecc1a9c3d4cd2b5efef7c82a8e9adb37d6935613b7d97c1ec4c8d7f0a486aca200fb12e3a03bdf243d0cdf6b57e274dfbed096f8dcbef9150e58292f0d7dbc28fd5854239db3400c10d241b4e16e47881bf28b7815201a36e38c706f89ee09557e7df2edca497860a1da903fe008c478d59a620c59a6ba01f05cdb7e18c0433643bd3feed737260631c9e07d006b5bf63808adbc7b45b7ef99aa0e5083a693e85183120e430db11e3e40907ea4618c467097b8074336ebf41d69d1874b8927312a54df0b10ad126090f2f62175a70ecad31d6ac2c30535e3e16a8ddc8948978012eaa875417b41318f703dd749607b67573e026a9e06665b282c4fcf8e299fcdc5c45993af3108d9f7046db141719d84240fcfdd6f09f3a1a9efe7603bb0744354e9c20019d4e9f5e7bbd596b9fc885e9e5e36f9fc8a9ab77be6c6a20d05a692df0b1253154b6dd6d245696b2afc72accb89cbd07d6ff1f4797a35be9f69ef5debc61b848a4c37341738aa729631219d35f0b839edb3b0d2e07523ea99bcfbd208cffd0ea2b9bbc9596451aa0dfebd42dc888495b4cf1db9a9ad6a0e38963ac28bc74e88861bd68a7ff8fdefaa4de013b5af3d5f2a02ba7e43255b2022065fa05515dbfce106f54db4f28bb7552e39881a4cd65865cf8fb0c5a1b38338633248e159842ba32e12268214f8a898b87fe3865ee5ce60ae80503f560080caf3abfc94ba346cc56d73435b2a66abcc7a44d1a1cead361b9838097d26b0ae0d8c8740f7ee85655c34356d631faccad21663422484ed4a4f5fde07582a2273f61178228dcaaca68055963f8e756ca37296d4b64cd06f6f05d172a7ed8de872a3081d11de94aa91798c980f1db1d6cada53246d0cfb194a6f62a0241bc0ed903f193288c7ca587c734b5be99d57619649cbe0f4c3333ece7b34b58c9b4e27f03f5b974ab95e9c89218d10b1ec4939bd4884953396d851d368ddfb7f13f340bf227dfd1741bb8fe5af4f3ff34e5bc49884ab6eabc5254af84399184029c3e5f463426b2c7c695e5542f3876a1597d79e0ffdff15a0a423cfd07b6eaa2756eb4bff2e7696b6fcd01092b9f5ecfa9e43cfed87ea1b0cacaf0b63910f719b5b5424e60ef026281698ffadf90c95bd336d7509676ee0250887152e543fdf4d0ce9b2835c2d8cd087e5b6e6f6c4aec81e1da1d356a58ede46d3f906226a0e856db6ae22c73f686e3f4bef09d476619aa291edf112a6db9eee92f22dd96cbfd36e35c315f161f0b46d324b0f879bcf98adfd8eafdeedccf22c164249ad8ac917983e181f9f3915ee441bfb6ad680c9b45468589bec364fc56c0eba51a864602bb0cc7161784c4224ae9089b7914eac4ac63d78e58190f1d462b80638e0bda7f4b5021af785c2d7805526776e6f60c979ce3d52ab4432dd815e35e4a0c4f94a25c16741d6911b6896fa3168042e74e8193560fbee3803a5716ef90d40c94fa423e994f9704d4563e9c484af9c5410bd89c4d94e3b1fb3f4e0493d562533e9b8a33f7032a42b646c56afb7b85d5e98267d4435a07e53b1f84a77321bca95925b94017437c005b39a486aa3415ab3194553288c478e017678604c213751d05da19359bc4f7ace368bbda50b60392e5b505e63b35aa39bd0d7fb811f2ee6a0c232cabdff2f178969e5c7fb3bcc63d0a5266cc2af47b925b1fb997088f34e21bfdd7ad8fbe7c0d518a52d68a54158b8e57d8d853c9d7b41062a71f60a10af8796db6cf4f0a7be6c8f36d4c199cdead3c01f747b2f2b830947dd087a8940e63b820f4ce65f5fc8b2e2d0bee4bdf30ab550cee9425a937136018405d5ff245d7ad8c077f4018cddfffab03b49e78750b570a49f50eafc38f9a12d526bcc88b46059a4c234ad28fdc13291b2e6cc106f6b4f5aaab4a50201a6842fb2bb6ded57dd6ee06b5567a8dcec04917816a71c1be608e44bc836ebe3958ce016c3f9857777952765a778f18874585ff4b64e6cd430e319939db0887f30c11ff5528158b08e1792ea4cca196046a792fddd925973b6012e7c3441355007fdabc21890579fc706e18737901ff960b62c22d05b65ccaba1d3d969ead8a4af0cb4bf12d6815562c66d6f3e13f2c54fb4b6ed0eb74c3e5a099abf3f3833b79d176563c9530bb040f2cc04db2c351e6f998d0e69b4396c79639d498a5b2dd351e306d8dc62280b9547fb6615e3cd399f5be9f2f5b9f7dacaa9699a7068a0361a48466a4c4cb17476da2f5f47ea44a089e4849c94e3d0d3597d7afce5193179f4ebbbb45296fb3e1e059b747c7340866b8e310673e1d5fb4ba63b2911115dbfdc595574b2fe99dd5e26680acdceb8e799a95c836ab0d95ad4b2b908c03427d96985045c49a4cab93d0f609765b4210d4aac2933e935c8d6fdefbff8a8f753c03b457ea60173cf748bafc448e1b4ebc7fd64d839dd7e7d5143dd05c1b32ee9e004b6c6aa99d00dab977667a1bbfb1ea856257b7c49ebf00824f1aaaabdf5c31433ff30f503f9635521c3bb9f506bac5431512b0520d378e0aaf4d90fd8022f72d806b13fb283189e59191a3e6c091c75543cd6cc87466b42842c45c1c1e8d0e71e93536a3fdb4d1b8b998dba6df603ce243cf117eeb6817d587d830e262b6721cd541856c8a0347fd4edc940436c308b33634fb4e99ac15d2d5f6931fd3c1c26026f0389838850355c373e04e41188ef2f9f49cbb6951ebca41ed52f8cccb902750158c937424795facc0867281b3268eea29f3f3addad0ebbc8840512141a9eeead73452003ab6759f4d68225221076ec90ec1668c69650907f7fd8ee3af136ebf9e2b6681b7dc42191c1b33dc6e669eaff2a3ed0897a3808ae34541d35f771594ed5b8ee6fb618a21cd6c3ea4006d6783b9f9a58fe76802bc45df94f7f5b16767e193a3a9af43cd6f0968d75e8a554bc605cb00399ff6365158bfead1b489b280ebcd5ed20869684e1de3128354aea070461f9c7c2c9634ce70001e97bce1f355eaf9948ac0330701751cbe76efb18859098b1b79ed39d974a016a58dde34f0e0c39ddf12b8ecbf8d7b40d7697e1a5424b94d7f062f46e184889e7d4be6b0fcf064bceb37c45909a679d3826a0cb8936ac8b26a0e45bfb0a4d22689f3ba237fdc72e41bfa32b6346ee399f6e9bc1350b6a9ab827f80fd3cb6f2004a13f6e02d567ced5c13344306bbdc43686c24447436d390603ebdac40a0a44c8f375e1f30a5d02be287f97b02fddc2aaf64b879c398ed31eac6f900ba8ab2528816cc480fb4799602d3fdd8caad6684898ecd63211cbee13733b51ce5fa9c21b97bcbf4ab59b7497cc855e666d904deab169136a81c1b34a455218a8a74388eaa106eb05050d23cd599c0b1b91e4e39464527a120f8fe91a612f693794c90321131a6bd42e4f0c08955e7f4d9a2db9112b83faa8317cd39fac2cb94910b282f74cb23dce4143925841abad3ca5f1dfc098e2165c3b5abd46d07339e8b1737cd4f7ab84d3250058e04982db947a6231d2ba7698b342020aac7fae284ddbffd43d9e816a87a3de6dcd0aff6ce0db0546392b5fa8b0e9542b6e5fd3c944ef5eb794f6aaa5a3589b13d059de1d2c71b6ac6cf0c0c5d72449d795f81883f62dd32c97bd8ee704a7d4367a014b589bed95bab6110b91a8cf39d23635d994c7c8780437ffbd4de259f678358f3e0e2738adeb753e3396dafd4ae5a3b16f2f30894027dff081cbe640300bf93240ec925b0bf86a6efac326311762adb8167f316cc358293a39821bfe952bbd81b4b6c2dbb51619cd0d6106261c7323a41ca0dd5667c1d9c7f535caab2da27f06787de384f4ecfba96b6fdf15f4ab0e08eac7fa3f6cc713b323c7361bac2e96280bec301cea58518c880e4db1cb61e9ab1488abf04ca7c0920c8aa3bd7984ce1587e6660f2b0dfa42bb0c5fb48eb78037d22bf0aece3dbd3f15c8e073605e04e427f4de09dea961ea93b2a98966c2607436d0a554619bc09bd9de262669ced06e1a2b0cc061ee782dd2e0f851c74df6467246127020c73703a1ea980fef963cbb9048867fd464892f49cec9a1f5ff783117af870030c73c4c37f5d99daae862c3cfa322734c74e760c8ee0c65b4ea7fa5e74934166754317c63ea0746c6d434b585eebf15dc4697ed53f178dbdc65a672853f4a6ac12e7745b94e53429f3bfae444d989a450304f4a46ebc9c491fe7c812dd6c941342b3196dc54fdcc9385e2939da9fd842a90cdd0fbd9348eece2503f9592ab468a8f864f6d41ef735e0380ac00e84e11d9ffc7ccbb16b35a83b6cf030a042873c97dea4a22394a1ea657ccff9d20b2515e133c75741df6091256d2c206b8510ac14ede483a066513e26213128eb84d4a4ca4d9442134063bdfeb22e64e774ed8f77b9be1d70e9bf37454037eeb53ad91c6bc1df58342348ce0ded737d76df5a3976edf231b2df75e38dd26e397f2634bd9acec8cad7dfdb84fe4ba971430111f13619fcc9344e55fcd7619dcfb4b427a1da24e10cab86da1785560eb19d8fee95ea9766f3e71c0b87c4b20ecc1f8e572973cb560d5d3920b951670218f17694b82b30506aa73890abcc8b7300384bf6b258932d1f9205c1494e44d981b7922db02a1742397cd3d8f66379bca28a990a2f9e387fb25e16daebe96fed5a79e729851c9eec0ddb79f4b673b6a9f4ad2239a17ffb39897185b4c266d39778f7bfd4d4ca694d5c2c3b4fc2dad44465aea4297525e633446c6a57e5f781983ee1021776ae690926950c4d6095ab7620b78ebc894d4f8a1339f109a79956ea64caa05acfddfd52c5b2af1488ecdcb0b9982297219c97846e9c14f7c6b2d561059da05febffc313935ab09b6e3d3e6fa69bfd06cb36ca4add2df7e66cd8d5bcb0a6f1801d39b5eae9b1bb218558193518f763a38c698a702df231f8ead8bc9d6ac55cb495488b18386c6ae39b58433ab9114de31ff5d1f4b7a727aa9979e19c75de1cd68f2e01e3e4f3f3fcc104e5361fb654c0c2c0aae4c202f308f370da17e580750c075e1c2cbcaf86101a7eeb99380aca3a15c0465b9375b20b912bf46c4ce9dc691f34cb057d28f458be7b3b25956b8b0669d234d2497ed1122ec3cb84aca600a4111ddd0d13073647b901ffa5becb4a8e354435a900668c127176ca3d40301cfbef411a268e7218f7cf23e50af1e0e4e3a2b2c323d3a4312265cae7a124d426a09dfc6099eb50a25099703c7da69b261dea18cbb6455e2a6cb76d283ddaab5328afa244588b52ad98df7ae3200e1558b00b1cc95fe3fd5ea8b94ac8b1f98ddc17581c780394bd45db415e705914c22efecce660f107bdb2ddbe618168781ddd0142890026c3ce6f55278c0c5911d3e6f9a371e5332f3c5d8c707217a9529d742266b51f8cf069f3471b78feb66cd8cd56ad1e78a873e44ebacae533e0ebbdd7e118d785a67286133ca6023264953a19ad6a215bb961b7b1350058e43a35e6b22619893a16e45c8e0575ecc3cdc1aff031900e37c9b8fca8b1265fe15bddfdeaca365ace8cf540189f30de1ac62cf4688007a52a0ca3199eb76b6180ec718053d6cf00b116c20b9203de1ad8cec04d0b8dffd63b28aa32f945bf6703b0140272cf50939a40f93d342d2cf143c3c1d38d573d0599cf963fafafbe1672d7587ab6cd9b7ee641f038dd12cb9b93f94cf7541290d1ddb0258159ec7105697facfea65202212d3f4c6549731712c6186ddd32888562aae5a3aabc151fdb64ca73b84b9180b1a753e9da5ae2eec31adc1440d814ac76b75d0510f7251a633234d0801f812dfb00b73bf1608c6471e0a127edb5fd6cc403d0c30cccb13f2a7918a6428428e11f40c90b3bd7121d717a5032e5791c714fa966e258c99c8c529489ff5606aa729cbd7f865836680a8edcd0ff887766e65ebaf81f215009b466ca1295afd3626468d7bddff5af49e8840da54e7901691308b91e6619afbac60f621595c6c7ac3ec7ddb00343c1e4824653b9c6aab38b30c052236b0a39910517957c391bc801fbbd8505b9294fc0c9682c53537112b056537dbf7bf2e6d752d349a679f0a021585863183dc88d5f02faed84cfeeda1fcbbe2899e2cb38098b5d815d408bb03d3b8b5a6052841f0eac59b9914e783ad42ca8577caed35c3eb485be09b41c43d08fe53acc92b763a1fed1f8a453de2556860c3b521adf769252364068ed6b730789fa7a0a66fdc475a61e1a93c0b8046e4b6bd11aa54726faa50ad02f00936eea76063a81c2a22e2350dea6d6d595fa30916d7f1e80ab7fe82c21336cbc289e3c5e08a6c3f2e0d7426ab58e2b6b953040a60bd8376710b639f5408dcbcdd1ecdb3501a3564ff3beee3a5d7ba0a6758bca2dc81231e0233217306e6283071a93875903b49955ecead296480b233d18fd9e90dc1c06dc621c1e1e37c8f6d7bea717f5a48cebeec09a7cf974ad3eebdf259f9731ffcfc732855afe4217b9190d7473185ec11bcb2e56a42cf4d57932b7a5fbe4fe0900e4e1c0afd7ddd3886e4564d801d9bc023ac63181ee9f913a0c6e013c317474340e8fce98d6e10837a197e636f782fed760c1d21bcbc473f8a18e12243a15aa9bc69124080c97095f74544a121e55fcf38c4de25e97d7f9ac047f3927910d770dcf00d0df614e5d3aa0537dc4b695525805eb702025228c0cadd5f7bec55e0aa4b6b64d4ab14c6e41ed9771f07b6fa135764ab2585988bcee7ff00f6d4451ff7f4ea4578244f5a848d496cd4ee1dc9d14d4b6109be34551b7d781d92058c43b8f700ce53611df569fcc1f615479b6b31dac4a62899897dbd3d066095a32aefaea928bbd9ba5e367406dd8359b9ed0c1a8c15ace934c229b0e8f0281671b316184261549211124506650e851c03036b1ea8c858c428de10ae205115a1cee0a593d4e37ef14eef1582caf7a8a96c52291772ba28a51b5df6ed897527aa45ee514a6641fd3afeb29a390247d9ff9a3b79599ec9b38301b50ca505f8e5bc9db5a69397e36a663db6524bfe555e9ee726bffce6352a8877ee90a17ed44da4f4028892ddb5b9ac9073635a79c7a04a62ba8d3a196654e07ee37fecd2d94a4bcc10c81923b420d8bb30aa0cab28f384d2e4433214219d123c72474c1e8cf8203d9ae303a22a5d0c7c8a29cccd9e357e8711dce9d01628d59a5f1019a24c518c02865ae754996d5877c66ee5b9b8128314485706ce39a8a59f62198088ff674c9db5304feadefddc6a53ff5753855e1743124bae4215dc1df5786896e80330cd8205ba3921a1f7800b16049dd546ba937b7b1b06e0d92f4e496c2e5cfe16eb2de57032cdaa0c92840d04e98c5c58a05821d4d29b6370000bc76c7bc9a303d4aa336b6798b0dd11480d6916f8c164502c38a598bec0a4560a6b7ed4dd5fe37343951320dced3e2af9c44665ab358d9dd4466d9abc90e06b32119e3ef818a82536be931c2c1bee502b4ec8d0293c78c5e78707d370b2495f52c60149a5de65c05897e1db3aa52fae888a47bea337539644803957c5ecc7969473270fe7ca7022678b75e6447e7753b296166e8c0c0288aa5dcbae9718ef1003f5b850bc0e09af26ace3b98d6c94e5e6c3b31724f87091d8f9ff2d1892afdcf6f28f44b0a4fb1cb96e8f9671c840c20a00eabf249c1b2e4719f03d3ff9216616e617eee4eeea27dad466666b181fbd87a26a0b9acfb943b803a80ca30125506721cabfe288e8defa16688228a8e977273afbeb419d400ce206614c5052b257976b522809d31aad04771a44ef1235c3eb4022135ba7393fb944ee74f767f899b392605a93a7b2c1d6ed32ab85699afa22194e6c840b680acd09170a72357f7716cd9ea73dfe565a6146de9384834c24d60a176df7ff0e7b1fd2a2d7272a7bbb47936f108cf377e0c157eb8ae1a27278d613ae701dca901e1a567bbf152845744d0c5df4e370013e3dff3c91aa8d91088d25a3adff19d341e0423d33117bacd8ac2d3b7c5ec8576c8e6008227ca1bc9c645bfb190970d69b54b11993041dfefeaaba69ef6f988e71f4512502626b07201d364c84d56c90fc3f619a9b24b00f2d19eef175fb6c7c9db3703019e000c10c5ea0be93c3699fc5b94a283ba89e13f2b5a8afb2a3af5853d5070ffe843a1e9caabd8f2e3509da9316711ce0d398dcc19c3ad271ad5cc3475b5c11107f739ef604550391d957d662fe4a50e34726a73fbe47120a1e247b545e8def59e39976046985750e79abf9b4c5477cd508286e1011c309539850ba6c9520bc109b265b6302a0b170a0bc35f4f59ac0244cd82370abafd888d4ec14f56e502d53ef24c03f30793c010daaada864dc5aa204bd4a30b7b243ff1152533a945bc4836f89cf813e10fef31c07b5b7d0dacd43ccbea61880c8bc35c5f0b4f5e59630a8f1aeb822febd9320285119d72f15ffbaeb11a4324331e2ce0a9347af1e9101209f680e00fabaa0b4645a4e04ceab5e373e54acaff45d57717d929c69cc0c14fa55abbbe0312b563e829e464aaf3d6635ca1cd3b2d2de4a39e79efe3f55b847fd947c36a13447afd162213f1edc32e61caed08ba90a20b5e6da074b74a2621a0eb29e6541db16ab48534b772cad16738898bdfd3e842b890a6369c79b399f730a6507b4087d1c5eaffa76078fa59623b9aa813db321c290032deab6718561743f2eeb1853ed0315344a00ab4a423c8cecd8d146b1535ed25c0a9ac2d15cc31142e7ed4cb4151a6dee7a89c36cdc3dda901a771b5d23654f2fb767d2819d72d20c37795e493fbef4f9add9c6aaaf9103a6c179633a0c10d7b176b265ad039a53e0e4cc37057a2aec74f6061e2b3ec963f18aa9b0c74327c9c80a1afbf5cc133c2e890ade8ec574fe1001752d77b49e83ae1982e88f0516961b742e0d5044a4aa62db5eee43b47da06be9839efbb397d0bdd8a174e4ddd364e5a42d54b15dab354199c7058f06817686f30a907385fbb0ae55d72e44564ae994bf3d9782d1483d2180633772d4bc2d742488b5eaaa7fba0027c3460ad5b487be964988395d633cc33a7f3f94eeefb22db89413618f0502b875abe51a563b8950aefb3f57c4bd270ef316d762b7d7ab329e93a19a5dfd506ec63d200ae5a63d6e02d985611481c64ba2613238deddfe28f1eb0b2956934395b06c5a61c1bdfeb857736a3fefab01756d581a4cd30b136f763f6cdf2569456f4e04439f20fe90c1485031132a9552fcad82a3899445923a5edee0307867e96ec2e7541d3b5897b0de141b01703a312e0c2a543d9e50df7434fde4857117dd54a436845d57a7ead81f89e54ed113903277db3bdc2a233deda93ad255f118748b2ff4c9b8e190aeec224a0b0ec9c8e3aca01beca1f3435584fcb9dc421c808410f17601c3c4622cc40e481dcbedd3a18f464794159791bfd98168fcf5e7c9a2fe2a88cd955f853d0a690e4b53095c1b83fe1f72d918431b218f9f94f900bc624bf65f6e2a5180f95bc259802aabbf352c83a2a2cf586b3d4cd2a5282cbc2c96aa5f402954d7db7224c611a442429c39d33b0b6c4f57f077afb388b46d666d8a9290cddf9df890856b65c71ef967e03d316ba7301edeb98276a745b202e45e1eecc6ca12e68804626431a4de55328eae00dc317887a8d28a234beb74a7cd19650fd06da3ae4d006c0e850f09eec6d2d5549e46f0180a21e6ce0c8d997e327787723caf2e3e346b23a9d309f0f16e370ff47e43580429d0888ba247ea44a034f1a7a9588982170130c0c03edc250f928f669734fb7c1e90bebab943662ee26c2344357632e7aacd0cfa5d47c512edbdfb70cdd173aac1e70427c81f74970889e79110b91d80c3d6440f49bae8b98afa20a27ca8fefa46baa837ff42a94f952f15342798e8ff3f9fc773899dc29a00336144d71bf7854ba10142ee4060303af38e77a3e5d3b0832ee792228e2c707b03edb572382678c336979426834a5d1b55298f91296e9cdec3e6cefecd6c0f43d9308b54ab9c5719fc0d9062eca721844d4f6eb6fea7e959d720a06d48100c4620a3274615178b1b4a4d7b53d713f0139b51a02cb46c1488b587051cbcd70cad1674047382e9234828ff8b460d5e15e194498abe6e51143f6516eb11859e6c8e8e8dbee3c976ec28e408d81c9a5d390a75e5a5e2b06fbfee77d4d380ece5015ff9e0d4b9154d3160f627fe2bd847fd1298ec42eefb6d029e91cd7f2060f08270a56b6c04bcac807ea68e3537b2c4d0f1d4ae41d0370089554c840b586e59cadc9594dfe893119d0acaf1bfc1f65b83392ccdf8f1b847644c04b4d6ad7fd5d4ce17989dac28253b6e2f3232883f2d8ccc30581a68a5c21c1b10bb1c93a8936a55fbea790fb8aa7a1b8a5f31c1e39e040d2c5b457b67c3bf7e4870f4677f4a19c58fdd3a6c82da9929b4ad5484d34d8219db0c9a4cbf5a606232c40a137fb50e0c2c85488b1430c5b39f72674c12276e356a270cdfbec9fa705fa874653a611ed8e245c7ccf69f9d1454faa1c3dd1d6a94397de4c79d2f0902f3a5262a16274edffcc87b631b3948cd4cc2947542cae2104d86ac5f896115c782a00ee4a89177da304ea6ee50ba0aad21c80c5c34f787ca23e1003fba884d2625b3a4bee767a0f10b2747ca10dc81777d797312079718ec227476d6550449152b3daa840d252f6f5b10e82f25bc9c17ed61e1bce605eb46ce8758abe9f0dd3911b66b212f1390d0506d2c11857bab27525b5272a5a4b95a0357ae5f0d2c4a8350b2e8042d740519fbc09de395c010ee6b4e22755e694ad5df71b09b033b765aa3b22d527eecec48cfb47e39097770a09141e36e45d12736344e32ad630361134448d3b126e990337d485f2279f0fca461c0fad128f530fc15f8b923ce006407785fdfe2a06d5f4194e016d6f3c57cd5ac661ec10a9a6a8f7ed9f69272d136376b182fdf60abc24f497116f4d572a1b636f9eb7e026ef184484e35a07eab254173a83fbe147312c6106a646d9ece9d448e440045e1def6f90b74466721029b409240a849e98ae9646342e3ad809641e74ff6c92eab02023255043d1f0e0e67168acb766272c1506bc14e2164b4ca7101ca09d33b6c3361ce6c2592526bd50990ee93235853096f573040e6daa11fe543f02558e453fee17af8c669890778e7b2c887b3ca9af3f419347050bdd07088063703ba12c100239ed2e9d56c1ee7d00a832a0b5713e5c0f2f45fd227757aafdd15938fde3bc5b417880b7e49c89eeb35a46a68d94468f7249077eb55d1b9a39db78d86de774aed3e3e7b574e61363daffb5bbfcc7dbb1f049b3aa9e1949dd566bf9d31c9ebfecf8b1c2fd5a66253f62d554c874cddf04a4e879f30f0428b6b9990b36d68f1314dbf3d1070c1ea71745330e60fbeb19ce7f9583de72b7cbb76d79b00991072505162a4c4eb6d70444ca030b88416de653057f9f1c6e1df800e13ef3d456c6ce9eaf825faaad51d7031f2a06f51d23f475e89a6621ed9c2d6a9c38998ac10d1fe344e90a106e41843d1176883a62d35dd119102fc7428eb9baccfe4a786dc0364c5920501a97e176d7316969f876f6739c4cbfab26e1251cf021cb1dc48bfaebc7c2a1661e27221c05315d1f41220f8c2835dd4bcc4b78567bea10c8ba4090021bc650db5232ac295337e7d40d43896e5d733f5fd8d95117c707a8d5c662681f4f3bb9bfc143d06a2d248108fef9506536d4cd3980881ca12035c8604f2f32161027ce85c4f7507f0873e2e7ae53bef9467828504d4e3675b22909502c79bc87394d48cb7bb209d60dfa89234ebd8eb3772631f80f01c85790db234ef58808313f398ae307c6f045a3f1ebab74bc9d09339e7770b569e744937bc2763cc4d6636d3bc682573ef2b996d96fd699dc7cda1c7c6ee590c6366666636cca774c5156e6813420e5816906a7a41701fa0dca1419b42d543b2695d649ff95f67ba61807f370200635939b47dd3c23f4ce54b1e5c2e155e9496418e240f31c7b2462efbb7579e897432e4a1664e357374a246216ab4426f97827616306dff2c7153692b3a8f433e40dd47ac317836e98ab48158b0daf241273c5b1998eff9c2728ba6575a8de0d4e5506ed77fa35c0cb61e4f899c3888eb247b615ef28ad104820a97474f8d5b2c430c2560f68b9e27b8411fe0fb85496d3c5b508c7828d3c3a536412607372ee4ff630671c31047b250640e72ed825d012aacabc7950998774a54156f78dafe42781fb9a8ba666fb8c4ae8a4f6de0e43508321dbb0e0a243669528246c8cfe34f41c9e1f11295c46ed444e1825b8a076b0ef8376b6d321ae0bae95d83ee51f95336304fe008fd93f82b58b36cbd5f822dff0c78d63cf1eb2d40e9d4aa7f365aa688f6072bb28f2643fa25816012b3d328a1f24e638e4c016f43e31856744d88586d60ab2c6072f897fdc64f9f3bb1850bf400f4a378dc6bc46833dc661b1e586a0a869c826b54d5dfb1d7c2c9f2a21bdc44792ae0dbfd8ac8095f69b919d4f58060a2e88f988ab14871c0cd63f0efd42403d717cdac51f26443a69e1933386744ec296d79562831dddbcfa541b5726ce8eb1b64cf3ad9b35cce735e90ee36865fd75c97e4abe6aec350fd9e043835ab4b026857d392d8b09cb41d5a4cc9a35346f52abd1d989a9bb0d62829e6cc4ae43ad77095de51a73fdb46afae55203c86bc182cf1e1f22981e93851ee4e88e1b9a7ca2ca8d1faf6a9576bf6547b6e63d40f188b1c52c48ac51d7c215ba3fc77c5070790c41a409a2541979493c9320b851a44767df89a11912e661a85acc95f226283ae522b6ae63592fb868b6b74a622d80e80e96d4d9663eb78ed2a40b2d824a4acd9540db9a81c3831b0a06aaef679994d5f2e10c4d71264b7d41e3d9c67035789034f91c479d5410df09ac25deab0238987124a67770e26ce4a54e42352334fb10c9ccf3a7d0b00c34f3a2e75fcf1e00e52678fc3210c6228fb8e510a0318075a6c0082fa8b8ce72ed2a54fd8904734f199c77ec18d217a34d1a225c2e8c682a60599f0aa0af2649974306992da04e251559a4e7382f1fd3d8a4ac6370e46c20abaf6099d2d84016e9f2e7ad6b5cff332fbf7abeed81798cfefdf44f2cc700e6f62ccd5a2006922ff8461dd0d892630f3709aae03f3b36daa95e53b4b196ceb21ad33f81ef200c2e57b83664e44279bc9f4fdfeb5e6fc92f408298ebfc144551ef4304019ba7b583111f9c30ec66082de8bc081b90ac28d273857f285e61aa311ee13b676c4961a28d3f102b41be004d188ebbd6ff37feafa90bec272ceb2e1ec33a0099770c744416d9e5341c1ccfc1a588b6a8ed54fa65e78466ec6995df8db07a0d1e44a801adf1a85fb14b19d30befa0cd0bda14357ce81536c29445604f3775831e43504717de0ae52972832c8820d74611b1a2bf0ea6483dcad463f2d0adb56d6a45b6c4281e32c715e9709edbfa7089629dc2dcf70b4949632ef32dd77f1245a60c9c48b161fad4c855ede1c7ac0604324da651c362a776bde28fabcdbd30c5108855420f776d40b10c9d5dae25c1ba3889f8cdcd54dac626df8064bdf56e765519d82faf2bd9124f804a58b2fb0fec80bda3bc0ec798848dae2621a1339a1bc2802a628f5259cf00ac225f6ab086b6786278532562970502f380d49b3954da170581d96b3bd1f79d34afe3886eb49d9ff2287f1b5f94691089d46fa9587799e8718ee1789515ea918f42f8b11bbed6a10451ebda1d12be87cc40b3582971c9596df7827b1a32fd45f3d479967ddc34d3370f8e12b0c43f5e6d49a87b2596c20a6f47a4612bee31ac43da2f96ec073ac1da3bc56b731fd774d3f822008ed3969df670b48d7223108c3451d193ff1dfc9de0cb000642a8f188b5550118ea17c95b21f68507e705d6d125a078929fbccef65f63d16e3516e1cbc4e80aa894dd00c2afd388199ab9de1d1e7352d889c8b6d3a637453d0ed844ee3a01ba52fa16a147783217a2029cbe4680d14fa0b5ed0d8058073c18ae9851a603d9fd02b8912ccee92526e75f0c42d89309de25c7a3dcf6c3801de6550e908c58537a9e41864310661c61e94672375efcee09389dcdc5f66717c86c744ee8d50940f54c85f2fc9a8ee2824d22b362c507ca4e9b7dbaeb0c80864c58a0d3358310b769153eb580d47913127db0287d75c1e84dda7f1e8adb3c457e010231e23be631a2b806724ca20ed9581920fd857b32ecaeb0a1006774e1816b983bbb29cd0351c6d1373aa10e8923ae9fc94ed108a52fabc4b0c5f1544c59c2e0d4447e50e5db7d8d07024d204d597e0e7ff9a4fc7a9e5b64c171939c21005819fd344ed80529addbcd97083213b8783a0d35328a51954c085bd1fb7416e21e4ec2218a2423634bdcd969cf5a593beb36ce4cb7b0354c6c42d0e4a870332fb0a4b6da29f5fc4bb5ff2a6c355ba6825addfeb60bc0c287e97e6c951cb19be1371a419e5bac0b9bfc3f28690afc62aefd0e9f18b04dfad528291efee35fb8b4c66fb9bf954b9118f2ce1e1276385855ae0a2267e9f8e665b2c6cee23a5d7b4b9a7d82409c1b1cd2fb1af8f0ca03442e0761c8f4e3ea25e86a46174ee1ebbe84613534f50e4e1ad2b01645d9122082cf84d589198c717c228fff447c95be7b5e558a85e52a2e94c55eea20ead7fb64e565d32b50b7c110bf4b8505bc2f1e07d76b363472db05391359fb902cb97dc265c6cd52727704e6134297bcd346f58d4218dda55f9da213796d347867a569c5105a40ec6f7ccf046aee230a361082874e115264bc25a270cfde7a198052a3c24a6e8e4f40cdfa66e9cc0abc9410fe492b4cf60af66437d5897896d8e5592e86cfc651ba058f8c87d90d4cbf6270f1e46aeeb1c4a3e77847b169b27c339a87b91d66507156f3e87a6331ad5e4e22bc89e3b6416739dff4813680a8d0fd9bf9ff9b52191dd985754f271d4cd9f21becb512408d8531304d380c80da54ab02291326d27c6defc6aa9ed1cbdc51c05cce30238fe112e2f3cc326877d6aeb472b3bea01b9909edf4fc2c16a54d9bde746590652bc643185dc07f3f15347bb2acda8dfe1cae8b9c914d4a3c8e767840c7ffbf0381df9c55ede8ab9298aa18428d5feb46410f388b846ab63da3c946309471f5b0a982686a5988502d6e8f1dc74c08e7ff1bd320bb46e1780776109c2208eb1417dffb95a487597740497726180bbda7dbb831979ea8a51b44d70800022a8b4223fc942327e7c5754739388a7f76d4c397805dd72887c8738756ad7ee74939376a8d49d7cacf858bf0a08a5aa64ca0caf348114b309066c67a6868255465d31554efb2bc42748dd9e69484573a032d9a0c880a90e3e12ad2dcef8ad970d8b04e3eb8bd48e347a658a892c73dca1c9748488ad029173fb7d58b753ba7dc33005f4e8d3e5f3e9e442da81be733bebc9733b95d55ece240f71e891c79a64bb23a8647f0778a845858ff85ea61aa4a926cd5bbbb9d924e76017843c0e35186f0aeb8ae12098c4caf06b2a5331d83006b47d39f6bb84f5add049e7b46c744ead670ffd58a2ccf22a618671783c387bb810662f1957d4e079e2de68f1c421a6ee779019008a2e39814b144a6578d579e121819799201ae4679499b01213c686037a6c28c35d5a1b686f1a623c89191a19358ec71bef62f6a04c4fb52b9e1399aeca00d993a5677e3d460200cc2372ef0dfb911543e44165453f1f23f6b787dd77772c9734a80443aee6a300da711e271c9d70960df3ba5f5817321da3d434d6c1313365f709340946ebd6b458a061b6eb73eb91459b00ffdc300bcbca89a16068d22d3e910624543c395fa9b28416518f4acb060ecf8cda51427c5f15b8a63f1c0262cee1e8a7ed95d7264b5f43170ada9ef062fa6a3f3bbe428ac9b42bab5bb8c6fdff66310611422fb262f6c5e1c9bea9a2b3a45c6b1dd8ebaab36ccca1a99d75f82fe1d1bce7c1c283ccc3db84842ccaa34245d895d7f67fb379cfd6613226ee557a368cd37974f8eed68e8be29321ec737d5b524c1e73a25f64f1589679b2ad1318d6dd2d825d27e5abf1dfb89b8587bc288d5015315f5a54e28041e73749d522a92db017d75e1475979b91da947d821b21723f3db9295671fae647e0309611ebea3620bb31d7f0aebd4655df43ac39515daa521dc14f926a59a5177e338b6f2a38a4459581af11b73f58b9cb2e7b05797343ed813bab7d56b4576d41f3bde6e27f6b9ebcbad079f650b66dda0518f4b2c86db180d81e8b5eaac61da76509846def8b79d8b64b12a4e735c16af521cec3ad27b15cf44e82c46012ead88bf4485c5b60fa94110f14b54f12c21c3ad3e7114782a589e79025562d2ef3a5d33cdaf40ced8c094d900824663e18ae84263c07840536c220a17d5c43a6e85fd2cc1462bf1bc690f48c273bb01b4505a8da50464523e594c34734edd07e31e8f93163955c7ca056a1f223d174272c59725bf2a6ca33084abbb765355a19f9839c3d6d87f7ff2acc55a79552b52211d1acc5017429875516336307e3fa8fbbe2cee7a817f2c1aae411eeef09ac0a4ef27b4ffa4cf3a58ddf9037fe984af5d78ada657a779e3eb3ee20aa910e1ab38681b03e1ec76e7613af7ef9ba47350265158fb494687f2cc55bb6a2d67e0b53a334bf585243e13af5c2452c5e0d2eb6aea38cd91c4275ac567f8ac729d47c61335cdb6bbc4317e9679436e5bba709654e49d96763063ffc58282a4fe1883e4a7046913bd508344e2e4a2bf6f6b62f6ab44c099d8948988d3c214179389f9bf2d43a42c5ac20ebba0d56865a292f1ff3c93d178df2ad6b311021af1c2d871aeaf2ea40b1768c0ff3cab3da038b08a45e1019ff77699096470c044a48d727bcb7182193401574558fe58b61b56c7ba3585a3f4400c4720206ab3b0570e881637a0ecb05885458c5cfd7929e13ca5a14951b18982e92945e1579a6ae36884547c38e0ce353195ec03e374e07f65dbde85b2e8f174a0603a579e2132496c52466d1125b30e68afe2d96b546135cfedb8adf98e8e882f2d5245939ca446df3985394ef080dc324ab9eb061d30873734f572e922d3abb2faa370f4fa27d59b1362fe09a9494d1c1f015120e0219a610c8a582b160178c142eda3d49e2f3e44eda428ffdb546b7af3b13aae2e80822c3752c041a3932aa0bf2e94492939a6cf95961328a6450beae94aa1bf0b5effb754c98cc1cf492edca4859c5f4b26fea5cabc9692c8dab6308091691426542c378737db809e28da8cc34a699b75427a76e2f2e6493c1958a35fb75665b9efa57297b107468c987c12031b34fd6b47084b59f553e9833bd42c957faa1125fd1981e644fb2e738d30dad10c473949dcbfe1d3855c3f0a32a2268b990c7443ce0c3817ffe1d0df8c74428ef154f0f904af5799954bcf60d85137fccf076e31124610f80cfc1131cf42225945f469c878573509c0702920cbd0e1ee56ea69a7d490580e0aee677ef78eb05020282e97c7b2548856e825c67f0c35fb6185c23da3777acc48636401519f28c93c93b875e8c09ca28d092315189624c1deebe190746df0fe88082551b308c6303a3417ed682c9f1716b94adc72b80787f0697a4062e6f891b0701a7a1ea5e5bd66c9baeac354de33ac65e0d995e98d91fc98d79c350e29659dd93c7c1ffaa83c0dd5e70312da0137d228abc1f074fdc606caea84071a0d1cb0869d705137135746e68c05260471ee501b31bdb490e6cb7d6a170a87274cf30003d1262642c2372fde55b048486d2dcacaecf8cb280fcb530a3074bfba8b8e823ba41600428cf91605641879aa3d1622b5be95b98751166a27011f6debb0803dda2305dc5c3120986da95839ed014d2fbbbc92466991ab207ffea54f17231cb2fac40d9682c2e1df2f48417e11feb2679f20465b474202cba751a60afe8651da7f84d118e50b4d38f275aecdf2ef7fd89022e3968074dbd00d14e23ac3c533a82c1daeec2ad0a729c0ab65c5c0375c0234fa9d0cfe4b4a89c8e3e20cc522b18c73c56d62638b19cbc7f3a0b5d03b108fd1b912e0c5458b14f3cb6bc49cf6158a035a77cd38af323618f5c08311d77298ea4324f08266a6c561c0a0188136c4f47b16ea3603648432f45764eec0b090b0ba6fe03bdb057e1474e6cb369fa78a2ee484a13aa2bcb88452d7977b4fdca0d28829ed07f09d3177fba494240d11bf0433cbaded6ace02fd2d0e7303f0634a00ed92a6377e48b14a0483d560bb94ab55a4adaf5a34e2338483cb14440e9f8c9b172d52d59f31aee3f7b73f1f714048fe511e496c8550e06a700ade3b983a0b426d5cf4f6e29746893c8717946c88f5249005a271637ead003df1b2cd41f41b08dae54c00d2d4d8f42a3b100aed136485b260844d9927126265f7a1f05d301499df38d4a003d27a22e4ab0f382b559f66a87624ded8aa84e7e623730f26da39f20075f6231852f8f1004b1cc032395bfc362aa9c067209ff305ef02d2c6644579a9664781a903c2a45621d8ed70839ab84f3e9a952293fa5e82915dabf83f07de1ce2652e0b5506cfb20f1d0648ea33180f477c69e451a7b58856312409bea0f6e2274e65dae8420d8bdc060adceb745251edc9fa068ae23006276eb161b7098a5432fc9d81e81b0ca498b24820e5b53704462a4a655c0146540ca16009db6b9c5af9b52d23b05752d548596c60834878fe92e070fbb5daac7ada19a6564d4fcde160b013f20ab5786d29ccb5d05ec4d1a10368c2ca362b935d5b2aeb19ca10120f34403efbf78b6f425070ecfe16ddbb993dcb5519adc999da7da9a7e3dde8c2cb9dea2fe843377c538dac473e6c06f812ec5314376ce44fd69b872ce849ae27273c392a5965a03674da7580a229b73263d4b7f48bbff652cbb78b6e69cf9e0ccc71363af5a23a084c6effd28e59ed35dd98ecca00e2c3f866a7a692665d3f89899d95e8ec7657a7955f4498dc06e62a4687655cd99c119b468e804b0307ac311e44aa3b007e680098e1f1f24d4c8dd9fafb3676a45212d7986a5e2cd3310c09ec7daaccac3590c8a3677ce9c10e20801d47294dc0d74da03b6fc0bf6bc22e6cf576d1ce6d25c9cff9c2369dcbc99732c72dfbeb7fe361fbfe4b2c4a11f8fc51ff74f4e4cb51c428c0133020a005bc4e94807c27f921a0c8e82b8154fb2df29c56aa6ced8abfa6439b8d02d55d3fb5b4f381eba5f3f536573c7060849301f96ab71dd6cb24f59ee5103ecb2c426803595d3ede6979f9161a9d7c2aee61463857b7f79da891926eda4b73b87d794c9c6be9f449ff19141cf65b29d4e93b39c77cd4358dbc4cf6b4d517cc52b61382f91ab660195aa7a87a4a28926b3237ac437c7b9502c91e17bcde2a847e4d19b0a63f603da66dbd57ac7c11c74ae130db409f89e336cc4d86bfcb63bb3f062b255c54cd7d6356656dbb3c77997c32b36b126343eebcf0ebe2762ddcbfa9ed03166a55144d630970207dbacdc3d072172b9feac02046e8ee44ad24d3caccd7fe2491cf998c16061c78819e45952a040e1d1a17e56e8661cdd292a7b6ca1c27a475d1e0850512388f29063d46ac41f2347ad28ca1f4129104685b2703c07dbe18553a8225655971bf1fa2185b414fd12ab568ea40af9831639ac47532a31c62e9f2c967eeb4290c44de9ceb868fac83a15e4b8e5125163c4bcf6fb7ef57554d65dac7da1c15a03a4a981c476086c201919aadb3931f35609cafd067ca20fbf98879713a0c87fcb299d710060c274cd3da7f0a4f16611cfd6873c429e504474b25c65cee202c2779de260b7c42d202609125f4a9b6ffff35b97f2c3c21fc08ad1523dbdf64bbf65a937ae8729371c039b59a97c0ece0c438c2efecfcfaa941f96e0802a464ab1f4fa931d03ce0c07040e0c03f33da93132116f6ecc5dfb9fdf9a94272ce8802a9414324f47e6c14617fea724e5cad009c310fa03073f5e46c3d218a9c7cd5f5c94adf2d12f26023c70f70131e2c2be3e2a3b8f73a62123ff1f9871f9e7be742747d5f8825d5c29868c6a5745ba28a55d7aba30fe2caab02f4ab7638107e4cd629aca00a87abe0b5b81a86ee00b7f5d577a38b2581b1ef34ab46c47e3c62a4fef2cc02977549bb691b55619ea0d80c6ec46814a159aae992d400ad34ca3f5d719ce9b97f61a0186be9ac02700494bf4e0acb11ab2cb4d833b76060475e49600c3a30df85d221107f8c3ab0e485e02f41907a1be6cc627e90974060c54c7928dc3b5b07c040823864549c52d100acd95263c0f78405389802256be0f66d36d0a78a608d909b4236a5f59ff1382fbd2b7fd5c5bb6d1586dd9399ec46b415f6330b2bd9b83c2ee55dc045759223f394a1974dcca9bf72ce36ab44f7f0671f894c47b836c4819b6fc47916d9d20de9a727d8342682d80d22e2ec2ef56afef612ccd31eaff59cb6c451c5c2985c50e836b65d1e22e05513bcf83be4f9d9cb44fa54859d38007174068f305513f2e00d43cab5abfb108c16e39c41f6cd19d2ac91970867433db8e17be369ee72671a052ae556f8466aae55ae132d5b939b7c2848a6c884fc50cba5ff01a7e942355f825d8340bf000b202c2be17de0cf0bebac8b3f6dedd69c0640a7a8118a823210440739526302cb9c47706f50dce50934dcf4e5cff93c5e8b9043c6d9d9c18ee15e8431b4f12753f2557882fa29fb4e80d72d8db86877e4e17bb135f62fbb3fcf9539b0307ba32d1fdb14d561a464dde926e626261c9c63608303157b68143136213dbb413fb2d347e396f2f048c2be045b059c60dbb255171dce29e764bf8e961d12c4efd4d83365eeee69ca83635d7bdf185ca86af01fe972df4ee0ebf7fe2c84a98cd2d52994131ffbd34b39d8e5beb60312312743946e10dbfbd44c0aec1412fe265fd0a65743c52366c4989bdde2dba576777ce939bd132a6128cba211076a45c070b5f918942b7d5e0b9cfec2695eb6f8ef4cb36f98ffc4faef6a661a64787d9a9f2299d0f4003d375a29d527259a539292337adf7e389415ba9f73135e8416c589ce0477dd9bc5bfa92d3808fb5bcef1284ee3082c53efd4b3bfd2feeb99817637b8857f14a80dab7840ed30ab4584c087887806940d1e3d8e86201e9e97112cc9c7c110ccfda590bd825742733f437b9888f068a70fc23efbdb950930ab81f9992c341c47b73638827e0ee4cece8e3a1ad1a63414e0e854143102ea69dfd75ca1741496ef2bc9408541e1ad6f6e58b93217a3ca8541dbf4585e282b4b277e7154b9b805c43b33bee0468a650914f324feffca65063107d770b5f3e87fc931550b2918af665cc91d180b2f51910b969b2ac50562c16996c9fa0a160c22a19ad734759747afe6cce98b9ce9807b07601fd8fb05c51f4c55f46f2fc31bff122e712e51f4d5e25cf58b52d07e6a9e51cf1c1c28803d4a330bbc883a08d3840fbedbad55a1f0e4a89c25f42cdc8cf3a4a862eda5c0cdea2ba741e00c31f218c94231c64d475ff24038b85a09dbab0692342cb30685a5618a3eb5fa322e613b896aa3b90c9a57ac0ed2adcf4ac64a71132223222e5904a8cb391f1e1f297da3287cc276a054a4fa0cb2e24a1166f2be2ead1d03a55b84e49dd283c387f91c0528166dacc5231263173c48c6ddadc01f0e8aaa79dd00a2ac9c05ba432c2057ca72b9d51fda11038fbaf546d558ef17465bd32fa4dc1484e63006ae48b113c60c6a5f0a440af934349506a7b57e6c002493214713ef762b9b0c4dbe15f63115aaef3af893abb55591063996f41fce58167b74a303b0d5df7780d12d558ddd0ea7696b8bcb509b78e1bd8fa9302a5ba3943fa28d9ed46234e8c621174829e22c835e3fd34515e5e55d2b65a4075235543d58028c4c74a64f28491cb38ee45617fee85984c42776829f537c0be85b234974f6a3e8e7d613c0015b817eabf2ba2fdb93262bcd16f443c0ede0078550b362e849f31c4d7a3fe6420b6182177634c1dd57f3aa998a01651bfe33b0b81fc7a18c48515870c1a1ae88b4158b41b5244f89dd9b5159237a8123be905a36e8b40e5a1705ce35fb74df9f8919e1132b2fcef2458f05171082a0327818affad2fa20d0bce082b0305728a008c03a5990a1ba9b6bcea0792889c1d62c2890f4042330bc71a81c19be930b9faae1356287928f2351867c811ec40c82fcfe44ab8e5f94901edab3889cdeea6c9aeecfd5506af9e849d2f79cc765952fd6cbe79d9588ae3bb33b1ad6df653e0e9086d6a3dcb84fb6f2dc9a8637996684518f43e2672995b6424c0936a95b3e3dde2669353de7a2d140923018a452efc8e2f4c1fb4b6bfbea0150c701788c07600cc1442f73586dda14054a97bc2fa5b881d9014d8aa4971fa487da281e617020c0b68d4e2c48bb381965b63c5e0a695d5c58d0671cc496e430c787104e6fba2fe6f29d34f3b1fde236579f52ff44ce57f7149d8bdb7ed3f7870428ada5055c921dbb3b466adb907ec6a1b6a990aab0d7ac04e6e6ce6df49eabdaf7ca43b7b1913ca94e8dd1b9401205aa90c4b36822b391329320c9539478c1e071d77e8d011071c3becd8a10e1c39e668393038d7adef08be63c71d39748443c71d3be8808372e0d6a1fc3bccf22a388987f307072ede4a5f8e4df8e2cf5ee527baad4a855f9b59b98f7a82d4cf1756ae2955f16756096d056c75e1f012c1cb93e7d6e271044171d4e2a96d09c04545d23084a3152c267480532930ccaeac78766da09b0aa9159733ed4c092e7bc4e6c2054a1d9f2aca981eee39afa134596875af74774bb8d4ce720b594e5a73d6ac07eeca4a08adcd9a61915b49bb949519663cf0165b85b26ad61963ccd6d451d69d31cb8cbbb1325a2bb366bae456d22e656586190fbcc556a1ac9a75c618b33575947567cc32e36eac8cd6caac992eb95525a83c1a7048b33a1bcc50f975c53ea2710484f4fac26b5b69d5943d2a3f105ecc467fb9e913c3669e39254a7be09664257a951e954720ca3c00de277ae9b976411645e567df59ff5acd045eda356aacd8969bedb64b6c9a756dc5b4ee968bb56cd1ac552bd6fa719451d959f12542f0dae8d7a73b4ae59b87b22701e66a075f90242c2ec653ae791a9d224235fa72ca738273ee7261339b12c2afd6d63092bc9806aee44e00356d86b3772f6569b2e05219310f0872115a38928b10d4dae0e17ef053494dc4c5886c94901ec8213a50ba90a0b39afb1aca722edb1c801b9daa513fce47ab708f90c2aed1380f51b362a19c408cef9e9874b45376036ec1a2f11288c07ebde8948b57a4d2de8c5c019e18db290e1cd28e50123eb0fc2364b962b8745071da645ccc002b69a070c48e080d49601f1cefeff5fac933fcef1073cbb7b33b9a77ed0a83d1eaa8b6316622d4bde0cb1f03153adb0b1f4cf6cfc55d3e9c019112e55b38ac7e79ad21a95f930bcb651c0bbb24528c474aeb49eb00b2ec22fa981d676968a07b14c55cb54728d31e6d130142b838df9ffe0773354ea5816e40c96f5bddb6d0eacab6daa465ec3e911d378ef8d33a746ba2439badbf72dc0dfd020e980ef23496df2a0345b899921f73fe8cd7604be6751d89ece9a2f97bc57929c985633c7c3203f1b5fa81a056f8b952d0cfa80fb73c93a50e626335b61c70c40fc813ac5c1b1b8e68552e05e2e974b36c32add18447b2d2e177b1d14f05f3ed31042e8eb8dd186027b4ac3e2e4edf0d7bb2b2b84f45a5b51d9d1b0f0511bdecb33a88fca40ccf9bd601d2772319555e43858ae9794786a41c85f1ace26db60e4a73da45eca6d70ec50188855603818ee005100c3cef92308b8db5b70f11eb1e0f0ca0dc758992a783c8119affe8b87871040649c5902be2e2e4c860ff47b3f0e1e63bd38d9c40720139bcde1ded593f2bff48333edd8895abc437d7825be87b1976c0d15a813d4f22055293035db3e895038c1c31e143361404714eb59e27aa7813d3d2085f61e18c174c2260689f317ab3d912e5f0dda6e9bbd8985d3401a4059e4e5ba0f496c36008773ef3e4d3e2d298947882372b6b5cba7ee2a2709ee1b1a3672fb4a5a1bb124d4240fc64afbaaca3f0365acc1f8b03ffb723ddf4431bf3e7430b97092c2f7dc31876c101f114c3abc90f4d2f6252ce98149ecc5ed8acd140defa71dd636ca1455be13cb5e9cababc4def79878e231e33ff1d7fa33cdf18befab12f3191839a49dc568e4f3883ebf7b90d9b0b1d63a8b95c5b5b20afb6fa3b0cec9e160773cad9030412343bfb00b5ef33206a03e5d03b661e7ed88613431b2040eed0aefc126997e7336ee124fcdc86cd858e31d45caeadd590575bfd5d0b764fcb8839e56c0c02099a9dcdc16e83f6c40b35061946a6290149643b4578388b4ecfcba63701696bd947ea762ee6861bde1a765ad8f5272463887f756cb8b3e67dd97a5715df29a0e0c5d339a223f3d9d26af0b3b6bdfc5cf5be095eba5a84dd27928140ca026cfdb1065040138038fcc890b0cfb159dff8d76385cef2e880b7091d06da2810da3b9d68e30f4be18b8deb236b5d16918c458422d83c68bd878e9410a2fe3a4a76ca4709e7c62febdd8608748864c5e6a8c87f49e25193061881e7701527d99d4083633f1749b4a6d86baa84ce8bb79a48577b58b8f866b283c566230a3840b26a7150ace4181b8320e06c07bfc1b181cc8439aa33ab0cb9a890238d60a96bab9e0a1d157a152a09f17e4ea331a96ed1e031046450025809b16a26ec3c780a4eb9485aee49549e7a9d2bc505cd06de08b3dd0ee7d9a474bbead9791b69b68b64d0a23dde3b17d9a16bacf56ba96d857b561310c53ac43dae331958f2b2476ba0e0428ce6f3417c19b8258a512175b58fe9c75f79909bbd4ecbf0033479461f63dd19fe943dc395a0d6e5ca99c2b98f5ce3ce4f9f3a60da3ac0696bc84f04634c159501c5515f4eb2b7ec8b0e3091a739a0b8259673959de6cced29d11c561575e34588dba84c7a76665f90decdbc1f9d8d841705ff4a688e0d231ad4ecd6a1e8466744b1b4240a1c2f1fc4cb86e19a0ee2943d448a0a297ea7b27a9e96da16edb608246a4d5d3c1fc8a7a5349aa46163423eb0e15fa8554454d60846a3cf767a340fcd2f0b35b456c44282894150461685fea1cef0ea0f316fdadb6373b7e882e835b7025a236544b84e753d6a8c1abf1a60940dbf970be16f8cf7b5a67139d8adec08bf3dc1d4afdcce654b21a3ddc8fc4a9741cf9c29322507b176991554ef53a71ba7c6068f1acad74da87a6a47856174631ed7e5a20bb122055ba38eaf43fd69856bbe98d2fba8cb8cf45e649a08c3f767101cc014c46aceb07561c4c04a67a4017995aba4c3790325af2b52cddb4fd990aed8464981ccbe9c4483ffc9f121c579047ae82c9282ab67f83394ca0b2b013c5d010af4dc355770ce61750acc7240ae50e5c6eed0e64552951712ddec19e28f9907ee30612477136af386f61118d7dfb570de7c4c681f1a17cbcbe442e5640ae7627934cce10ecae6a60ee50db66f3adb8ae077af16e826774a726fff1d310353034603bbd91abffc38f9013491ad3faddd27ebb42e0a815ab25104e6c8c69b1841e3436badaf84d45b4a84c494f20daea8dca3b05a62389b43522d3ea7e8c72edbeceeee454bf596369d4f280845d13751c939e77c216eb5eb2cdcbae49c732e06d55b3a241a8fc8f7504cfeeb160114632a525e623a322358a5206f51e99218d7dbbfd8b1ddb54dab893df7fe5ddbb45a4b654282836539f671ec9680792cbb1a42d13ccf6ac2076868beef8e919022393c2e4f366b46f1e60d14026e7c26b97d77f7a757bda5c121d108e2e9f84074adebb60994b4ee09aead75dbaf623173aa4ac22c2feb68df5f4d0a526fa9101152fe208959b2b4c64d388e3c5e3d40215b8df242415b3846476f06a7d06050573713ac8cdad0ca2006f3ffbf4b918434501865e6bddb3e0b93c403bb9510dd21c32b47a7a9882964f4a5e4a4fa78d7366def7ffd9b2ddf61fcd4bebfceffff1fa0cd9cdb2521c396bd01f5c13313beaa6214a198f8ca5131817ccfeeee6e347c71eebcb603b1a123693161a59c734671aab7f409fd0f28d1dc1bfc0f29c3e4c7bc20cbf250396041e15ddbb4bd8bf07b767777a42c249c7b4fe7eebe33a1213a24472867e3c50b628e0b0a510dbe6727e672391c77777777f7202e45a2f1c4b907714076e7f9406f79efd96b3877770722aab7d4a839001db5f6271c9c3bace52ac6d58f7a25963688745f6cd88d301d399ad1e5ee633f50398ee4cca880445afa1191437d91c15ddbb4bd995eb6e9459a59bbd62517311185a42a2c9f2a1f8f9755c60739b2e433f4734b5c9beb2ae97a9a58aca666347d718506a31f2490e5a91f8447166fd9658097845112381fedd004dd4d582da26b83dd12d7e6ba0e5cd15a6b2049f5962a974de7f30408d42b70cf2f7067edc0427304deb54ddbfb573282918f530b41bc1c434b30a6b2dcfcfeffffcc1d1edc7fd631710861884168bdce05efdaa6edbdc232a237e3e07b76b5c5dddddddd3d884b959ac4e02f75bab2345592daad2e40b28ebc5ddbb49deeffbc5c89b95c4e664d9734904b66d48b5fce90231f4515d8e8124b2fbb62964400843a939503ab36b304cd8a22b49195861d58402c79027ee1220691e97892e1f3b58b8699392504b24d5b62ef481ccdf07bee6469ebdaa22accc2ad8fdd1a6e11b78c5bc72de456d24ddc8133eeee24c434ce4ee3c01a27d6383425232e30d6955b3ac4c6c7552583a9b5d33484daf9704319c673e7fdb825aecd759943ddcb4fadb5f6edd45b0ac734451e10bea09c73ce334cf5964a5165759dcc889dd0ec5ae5114f1844e697ecc17a1159660c3073d0d3c00a9c94183c3830ef4e366ab1b5c23291c31eafdfb3bbbb3ff5732765815dd05299624083d05411244c4d5490cce869986293dfffffff6f2cc5b890915b41d972c29b8246997fe55aa429168b3cc5a0a25091a88854646a560928eb55aa9135dbd1b0f1003272411f71244e73ec4312791ec1c4258466bc51878ff7eceeee4c285e9c7bf03dbbbbbbd18c13e7ce33519fef7a4bdb15b7c4b5b9ee9531c32c1c81abec98e80549015271e532637be0947307823005757757712084ef7d72090af311c3062a2689e297fdff3fb9ded20c9c7573ce43e0213bdffb493e7c21592e930b38764ca86b6b63e085e6d18326b2851d764b5c9beb12d9620f98bec1f596b659a78265310192e20aa9eae7ad1a3e65bc8899c96514a2ac788ebef0aa6924516e4c315b286dc9744f392ec664f411926819ffabbef5c4c9b80e69261ed30a0cd06ddf3f5725d55baa5c660e554dd7b9e00c9390fd40babbf3dc6cb5536f291ceb132b1aad81447cc35313fefff7b9998318d0dcfef37c81102dc6863a44468071d9d440aeb04a61ec040f32c566e728c4696cd8d5530ca291330386870ab6e20945e5e55f07f724393c1e8ec35ff332a5ab088bd34d915a109d56bf3361c38eac6b6bc788ebbfecdf2d716d25399bb43d77f7a41a1a9c3b2cab81758ddc32153b7ef944249d6822a1313d323306486fa6f4815f1519083da22dd39d791585553c4392a8de5263e6903cd60280ea322cd3911bea04800a0bf2518304588f1d3771115186020d4ec0e44a70d960690153ae40116080686c5ac134d9fc40be2c19309bd1110ad205f463e1844b8b1b0818f05a19723c423da990fd789249326aad354b53bda5ce27d4034b34e701f8aeed0666d2bdf5e9a6640a366af6fbffefad37c6a06cd8cd1ab6407ae4e55cf9cdb8d0ca11c118cd84181ab934c1a69c463f6c58cb2b513d97ee3f7548f4dd5f49885c386106754b9cedf45a1ea9c771a8b523f366b311ddc731eb04a3f9822175aa01cf02459c197ebb756678d7366d6fd7efd95b9d5b92ea2d55b61d5a96bb16c248840550aa0b860dd205fe2970fe42585860435081e637b10e25730f28c011fc6cd7a312523e7777f7b8c697c117ad91c5c1f596b62f3976b76b9bb61d8ed16affff4f51aab774d9747e90f2f4921b37d3188b6ac75a66c2ac20502df4cceccc3499c68c18728c6e896b735d1d31b3fcffbf2a12a45e51ad183b6ac4dc58a135c3bc514fa6920afc98a4bcb4442075df33d5e399a6ac66b4d65af7bcde13f49ea1f710bdc7e83d47ef417a4f32c984738f73ebeefe434abda554595d1d7e88ed3a54c15fc10a6cddf663fdcb56eb0bf4c05ddbb4bd31ac00b0ccf994002061c7468526a08f538c98b8c5c56d75feff0fa2516f699127731014e4debc0ea9e248584700f4065207e44a41e8e05ddbb4bde1155c7777e5abded2e0507fa0246a1d858348486444c72b16d1b2820aa8a753cc8a698d94a8962bbbb6697bc7231d4c0c77aa663a1440129dd24e13834ec693526f29555617089e18887717ab42761d08817db4708a95814b24b0495334e9da7819feb9b2a45c87a477fb1e4e617f20dd3cd98e3094268aac64ec70295dd860b1462c60a5bb3b8f8010402eaa601848979ca1e342e28576f4d3f56c555fee9085d46dfea924274bc6ffff1ed3d38e16ce3de21bbbdefbff07aecc2fa432e92b6c967da0146559d98b09d22763cf2f6719e6d3028d4c0c7725aa9bb66b9b5693edfd2b091203014530203a3e2b462ec213575f31173cd08d207aabb0686c5878666830069deeeeb323142b091316954284104aa68965450015cdf32034eeee4094989669c8e9be6bdf1febc50a6ea74eb3ac36dca25f1a172e71906a5e1362553f532b869e47096a6473584efcff2fd930e2fe338fe5a9649885d906a7d74bc3221ca524c1403183a973f4a29725fbffb96877241ca872ea0f1ff9c99261bd8481129f2d0f832e25a70b9c17e371a5015de6b480493acbd199cbe55ed4232e352221750c03ba25aecd75571ebc382ebe50311383d34c8704616c0af0a0e9d803babb2fed1071eebed4a38cdbf7d7f9ff7fb9ded256657bff40adb536a2516f6991274808841191bb3bef3dbbbb7b8ee77a4b5bf6cbab60a092fb3c1c5945474bae1b37b61e05ebdc1ded162c2a63d3966dd7a089caa45c6f01adbb7b902cf596767d0822b683e30c7e84e4eb5d5b12a77b5cdfa3891584172873f88efc766dd3f6ce3f150709a2a88c651485081d9c98c705ef02f72fc40264bde00b3c7ce01da11a3122d6236b66246548887ae755ed150b295750e7b925aecd7575bcff7f9f32c33107e36628e377241bf13462e7844c0ac2c5b8c2ed8861924437a42899c2ffff41f70e46a83becb2cb215459c3eeb8c6cc96505fce395329d55bba6c3a9fd00da8a239126954acec11ab2073a28627a6451126299e8f4ccc8acc8e64d218f62ca2a43453d48f180e50345b9ed25b2533072be5762e38c32939e79c6984d45b4a84c494a2cada40d38562b66b9bb6b78f75e69fce9945a2e085988ddde9ce5b89ab556ec5d7dbb54ddb7b85317410b582cc9325684515c49a31a26cd95d31c3da646d7a01bbb65d5e6979b1c97b4871746df091c8c26e896b737d85b58e987a4b77704c53f413238fbb5e79afd65ab740546fa9f1884c9eb4a074770756d07ece39db20a9b794294595d505828dd8575044f8ffaf9273ce5f39f596bec121d178f4f08564c36e9e96d4647c75199e81f550656042dac84e988830861eeba64caf67be20d9a35733f6a3455cabd81234bbb6697b8f2d6742d7bfde0ebe829bc54ce8738189e853b3719622f524d51d0a115b2a502d18797e85d602ebad0fa452503174f0f8111183215b412648cc1fb690d1e77f001b2e7d252f7cceaba98feeeebe96242aa6ded21ddc012cceee6e8d3578f0d414ba2619a880089d1c3b7ec2c246a4d0a79b212c95f79edddd1deb897307aaaf6b6389818ac26f23e9aea991109adc340d64793430674eef6c802e6bccffbf12972a091571ff4a9c056a9bb36fd7366d6f1a361e324052d21328b97b81ba7e5804edc080250cd103244aa80495a36a840a6631035385d09d64ace4ae6351d82e8851c70fa8488015b7c4b5b9ee53f0c52d716d6ed4f94e09470c39edfc8f58002f5b6eba444cc6bbb6697b67e07b76777727a025cebdc689c84aa70ed912aa3ac4a54ba1e7cf4ce5bde02a0b6c05a99899a13fc2c8604442a849e83e29022c5feecacbab97e37d6c6624651b881cddf3d1901808804a1e42b2b0cc6617785cbf614909b7bef7ecad9635b5866bd820789221634a450c142c1b303f6a52b462ffff19dec761e2d803b61d8ca2be357d6a0d7b5390f2a8342d9e46c5009d00331a041c41c3401cca12b9a6031480070d8890bc7888d02c1286c6c180480c0086024100180c0602018140202c8a817096ca62b805e646dbf3bd2e64f64fe4f004eb23ff0e699e3247d24b954b5088a40ecaa685d8258c2a3eb4ecfe165df5168aaf83b3641af522ff11f7da40c0a2cca02c46d2efcdcc6a1175a1daa9d70e2a750166303407f0b645b3fc83a82b1e4899184fb508d9357cefb368f6496662150a6f7e785018b411225e0e15f5890e2d8d344d1149d7f438da024305fadde9c440f6f31737f3568755bb2fe44eb98682b9ed86ba66f98ab4db8a862750ed262b4417862278d552ef5a1ee7874ac9ff53c3143d4951a8845e4981874b338fdb6644167f70da9070c9695afbc2886b3fb9fd8c545bb6e2da3c96ac914c53d3127a343d6fafc05c2dd69c4ce918a410957a367bd3c9241d7c1218cba1ccb4637b47115544336634360960ff0568b26be93a44a1a2d9f59b24d4d66695674084fdbd875a244b6e018a06c2095e2dd4ab8dc170c6fe37ba6bdbdbc1e8b152458909ab6d0d8a7ecbca1261aef5c8f04b1c3068a2b35b45a74db7b089e3dd78d2b48c6259262ccc5d1dad46da316394643eedd95a6410cd1e4fcd54fca74e1f6da5b8bb3250970d8d5cf4a4a195d4643556a2188b7bfd5559311193eef6871797c02bc2de8bc8834292b0731e924411129b9ca537a6ceae2e270dec2c56a22b96e463f562dd90156539a401cfda7ebb33e130c2b32ef4653f2413e0940f5b53b2c237b31677e5fd1a5ba367da9a8f52f3ba211cd0a86acd14aa4534574928ada454c5c91726a7a4cca5c9e68a194a25bdd2e1ff64f5ce58c21b4eaffe332f7dd0630929ead5abf96f88b98f4712bb4d25861070fa396f6c3f228aa769d1bef21e9e5f3ddee813d442ae61f6e8103da1331e1fa9e78d1736369bc1bb1251fb2176cbdf28b32e55ade7e471266c81a4dd06282c44d1aff58c1627dfb68302d90a51f44d311893b313a8307cd6fb1475788acc3457c7b4fd399f0880683d5c650b11cd9d249aff68132935cc4ed966f320996adad48ae4546194780947df9a4e180080b6741118468028346c2867ff5c8cb30a14e029c09e75d282ea573c268928293a1f81872649162790292cfc5167a458b89fc6f0fd6686b2a058e8390076939b60b212624324df61daca31cfee89ab31cb4570f2e01b2296c28f8a721385c653b853610477395dfa84c8bd4a47210579b988cb39a3a2c755a18cc1bd73f346275a053857a265e82b441021e8be4a6224d4d03359ca241f3d7c14887a47646ca2c411139ff02fd8d3318ad02125e321b6237dee5811d423c8a9a8510786e2f6c731a10a01da3d9a5796898a7ca49222908098242196da2adf276c85713d91c840af479be33dd44a5eb0e00c6ea0f66ace750ee1db88d1ed6f050d177a8d4d6c6088a44ce2b2a490949a94b4b2a527de01514f2f3a3301a46b8f2609de770961ca6bc649fd8aa25cdac6883f60893904bfeddb91fe918bdfef655f3c8e517069c457ef5e66a650f89c7757ddf4bd252eb8bdd1c0613bdade3b21caf239f0030c93d7aa99a04305b4a17589908f2b2fac28b7981b3ae9e762258d3f881e1aec599b58884cf5cc63bdb190a6736247b98d5cb9fcd2610614e180a3298dde507fbebd8deb27dc403ec12cd41cf3fd70695f9192f71dfbf654235c6e90353490315fd6c832bde9802d0853ba985356e9db8af0566a27858c95138b2db3035d7c7a3a75dba3b647d4c995ce53d2c5b4d91dc8ada94cac2660ae2d76e22ba90317ed99b94c64fd6e32287beb800bfca12f1d2a2218ad7d1db5ca5d3b15a28269a39f7cad6b19a4b66f7e239af7f89607a8a796e0afd971daf7767d82898e207218b3bc828092d7b227d770933e0ce683636435391513bab68dad1389cd709cfd3c40e78d02454f3c51050c97d335cb8a9278364abbbcaba81e076ad8261218b934eccc8c43dff240fab4aabaa8d5c6efdba7c461f7be65bb39cdccadab8549a5b52571d0cb81fd05257f52bc54670ca95a3f890155712e5ed711a3a30a6ddb7ff721dc7d60c33917ccde9916c22a0b4b04d0af2cf4d33c4e6e10b9e3dce44cc35e553ab56df458700e79afb0220d95858da2acac25d9fec14943b4a5a1fff0bfb26a4dd03fd1d0b18b36fe593955a56e6c0b044fb29e7ae1b62415fe0edb3738f03ddadf16285f195300a2f2ee76deb793c71105df2539ba939f5340d31ede2c94a4d025862142884f01f8b598b61adddd5408ab29283531086f384921340b5dd1eb61b37b68394340723ded2dae6516f96f14f7a417ab1907ef8f3d8d002807e59119c18490349de164614cf2a4d018c482df8a54fadff007d1eb27bd59e53fb0f0af55089995afded158869ab33264e0d9ec7bf7a2abfb5b2d0686615895ea0b03f339048da25177b97eb715f87d1b76e542097067eb609b821735cd01863e577b6046e6f6ab46eeb5e81bd192f6d9586dbe510289c53f0e68887b0360b42f22b057fc969c9d4526900a413ef5d1d03f08bfb46d36078b080c9db4de95ca92f557d53820708327b4cadc8b2892f67e0abd2f158e8c14f38877a6bc6b9c4f3276af85a56859bc1a55a67fd2bec14f8b438d341d5082006a530ba240c0df3f9c5422ddddca3933d61c22138dde9184ceb36a9cbf6fb9b5fef5e3ad28aea8c716ac000560b91113db931cc3057892624067762b3a6a9b0941a5a9c4c7ef8dc2f56ac24df912b4161ccd44b5ed0e896a88f89219c826ce8f87bde318ea29d098ca286bce340d0a3ea2b03a4dc786543814d0d7e91bbd61729a3651746d1fa26c0c61c4f34605d342b5c3ac9f66ac3c78bad3d11a88b7ddb2cd19c17b8dce701d600e729e31978ed283e17bd13975471a3cc41380f61b06e6398572c969e0a97c8f0e0e1ffc1e75de3e8ad321dc86edf9aa0ae222941c5ad99472e7b497fce170223b142e1d9d710f84883ec8f038cf50403ac8bfa5be213df902c8c309038fd2b8b108378a2f35bfbd9111e646f33569271d6b03fb15ccd2e646434a6bd7d12267fb3cff5d27d2e98334a71d985bcbabddebd1423a96cd10e7887b26343f81de4cabc0c072afa62e8c7cb05c6aeed6bd1769bf89179a93f1a6cc33976e5b49095f86a79dc57f7cd358d583071d03968b122cb8d09a05fc47adec2af778011f7c542ec21fc2ac4299c316b9b112b064e15331e6cac305901a167eefdd1defcaf6816b685ba73f8b3cbecee1f82bdd2b89654323073de92f0279361ddc40b851462f2bef68bf7c6c788e0b05565c089e13c681f12679ab7ef9ba9ff896d673ef47529ac26095eec0fe4123407ab6faa661484aebaa842b7201eb6dfb528c06d760a637fbae62f1d3bc14d90c54b814df5806b6921652d24ab8e6143eada637b0cd72fa85511925f5d25b5019bc983960a35c72aef5d1235a162eea205db3afa039ad0d2e604bf6e5f0aa5b5d8b602d54635bd41d408a472636a64855314e8282d9b4bbf573350423b6d42693728633f2df5fdea4fc962764d5f80192fe48a89bfd148273cb239add4821e82f9643abd542ec7632e379c8cea7bebd05e38fb9e072b7da4c52bf436734d31fba1ec750e77db919b597124bdfa5214b2c8ecdf37ee72fc8b79da76f87306ec947a989a549238b1e6af86b9577b39aa4d7f14d3acf0d74b922082611b0eba19c2f31d3580b2505c2c15283ef06b9132264df40f716c2c541561bac5bf141f24d724920545cceede2df3f42b39d5aa37946d4b5ed98f05e1fb0e30bee5a504e93f4498f0e111d342b496ad2f4e1f4ff849c982949182dbad8a5fa4c9801369e0f9fc5680685ac05030ad4c4241faf9eb0a0e17b0b25f92004ccf3f3f5ac6bc5d61ab9e36c80a5b3397a18d538253934ee2c38bc13353534c1106bfafb9dd6d6cb96c74f050444df427c6c0ae8fd0b2952172f5f981c4cd6d23cbd4789c704e0d6f09bc12e080065c7516174ac9d4a35b5035767f959234c16fa345d631204cd16fc04323b557bc95c8ccc5953e3abab2b23c449f7f2660da91a9d322a49ce4fb65751590f6623eef1398865d64680c9156e7910a949b7f4048c7010441292de7129ce5036b030541da3d701c3fce1c711ef2e44b0e8046bca4094dea630ed38264db66adaafdbbaa81a47cc44616ce544e1419ac089e82c1be936dd76769eece46f515713c1f02649320b810a4062230def881095b3f4937fe3b0e8c6dbe3ca7818253db8ed10c6d2eedaeeb1e1ab8f3be1ff8f77209a1a6e5c21860d572e8f0300173fc6c2a2347e456ba045efc66b1abf12b2d76760aba0ec363e19c1a04e44733a3ea7bc8ad605d8e9725d0d49fc0c25d494e0344c50b616f398b342edb8a1894229c75ecd67eb20a2d7687cae4c330d13435ee91c21c74aa81054cfd8170ac3306e3fb097327717c6a0cbdc5de3d921fd7ef7a56c2e839d01a4b883fe558446cf79df45115ae624eb16c1960813dd326f3cbf8594aa969d497a53f2030e1964eae09908068ffb047e7ffa76a9d4564c424e87b4d7e412f2dad17699342f204022683428ec9295c3ca27e0ddb0c2f6e11701e9cd20969fd2f6c41a10902704f0ac8769bd1a50d1832c23d4aa888bf3c5d6bcda86761f92709fcb0c60c26f20e1ab9a0955c7a446dc5a28e9e1e371b81126b7c9588b349d0642927c3c733ce462d4b41fa86eddb5f655e5ae883ce7799b4156466c33b15f4e0f4cdd142eae599fabe121b1cd09c5fbf759726074cb015a22dc7dd33f7e1dd1ee44b9b9999cf6b7afe8b95e1331cbc12822a14a6b76411b37f65ffbff06f45ad9a19d4f7b3dc8c2ab945aed68f4d6a80bdddb98040e8fabf9ea2e33939ed1f67f68f7711d1ba6b4090d8e1ad131584f88aa1b87b0d1794ae4e9eeffae272335d065c65885e150a41a0983350131a91f648dd8ed9750e39c62b72e532def6ea17e0bffd88aaa70451cede72200c471d3a5002c5e0f6fa24180d1471824492dbdde688bfa41fb4029e138da56dfeb755a3dc949d459cbbc5a31c0aaebfade577cb36c49acf1af887f6679dee08e0e36bfa2d64938bd418cebe8c1067b011ea30f7dbd88d884d65e340493895c03c835bc0ba48e1c402839721a7e20a414691b12ef4ca1ba04fa31f71ea6a357967a29919bc7e7fe5edb61ba0eb613ccec12d7779d4cf61a6380d3dec324e84529b72deeb6bf2ae9b31323744956ab86e8d7bc0a41493c245c0ca0ad88cfea98bf6a97582645ff908de9a238ceb9c1415b68eadeb2f8ab10624f72c6559612ba7fc1323dfeb15bea4a857a0f56ec1353ced24deb1172eefe871e56575a0bc12c3d50b90bca175f125b9a3da0bf442cd46a68e06a86a547ffe5c17cfa11b977d968e4a02fbd41d07ff9e4d54d866965af5736f497b826c02f6d9d3e1e9cbd13fab1286ad5c4965502d99cf32622d97a200ac8f446cd0a477a938c0c13c9703a4dd57eecbcbc742fa1944608a93744ce7051996ee05a4239cfda769080fa6744df4ff541f1d08e784b07876778caeb692bb9e788673d9b17bf49fc5dac918d70377f1c6c587b8ba233cc12320a303b55b31d2b34a115e96a5eafc5da000152a60c3294c4817b3077df6cf4f3b60db39983e05f13e7c66e084105d287db7ba5328224be105f81cf482361c6d34632366b58484e8d25ec257da93ff08871708b6dd9ea121730964a1b8ca3e88d1063efb192853e840942130a0669a653da7d2df75522648aa574bd3a29257594a111c53b7421b60b088916063356ccf5d84fd6432eebe295c3552803800da55593b9f378fc8ffe76e2371bd072d3193c91b24adf9ec7b751630309762c578eec13a747e353128e64daa4a423933ef1e90a451973330c923cdfee5d7712d0ac9426173e69ed3e21c4b2cbc82d5fda3292b2d9a5799380030ab75cc9f823bcabdfd466e66a4f8ef611c1c7583d93470ed5c1d64217769222423cf278a34bffe5e1c513f0fcd84146f85880f415c520cab65967690184994116c5216fc10793b5c5c415896083570e317e7d7ddeb3719e333f36ca82805985976c9e4b50f355f9f194840ac79abd232f7d7d32f9a6efbedbc36b661bb782ecabbfd9ce877b745b38e77ce3e681d601763490bacf0a99d8c177aee097ed7eec233aea98077c7ac2b979e385d474805fab5aa88bcd8a964ecd4957841b07361c04408e03909bdb6cf698070725ba56209131b194cb54404694c68f6c36a071ecc559dc54e5b87c7c05264aa022c965107a3ae4cb2f0c72bd56eb113534f7590d4dcfb928264ebfa28f548becd638e42fdd4cd72429abde6d3bf20c95220a5c6a481da5ea48ed54da96b1e8577c332d98bc5a6b6d73267ca80bce40cd021d4447ae98300aa46b93c2d31a2d2246d8c45411993f7cf9215b7624817d8779a3c2db8328d10db2204bbc787500fdbc5ebc9bcd71e28038a7da15324eedd453fb6a54e921c908e3694405019695788ecca1f3b46b20bf381b859732ddd868edd1a7237ade96a05a5cf12e093438f1ef7f3b33b5cc7436835a6db765cbb14643b682b0ff9dcd4e4ef8dbf1af4097881b93880b6456dad962ab116944774b732b3f1c45a0520ab8514a0e5700cf36510c31584b061f1836b699c521ffdce1e99c0e89b5dcfea76c532f34f0f92d811440128a9bdfe03e2f4d24683d7fe8f183977ea8f2d944bf544358e0918041d55223dc07b43685381e118c6a3ba1a4fa713d1c2a4a3a97839c994f20c3013ebdddb59b65bb0011f6051f586c24eaf547bac67197cbfb47e939d5e9b7dcde3c5d4ea20b1f7c060741c76b732e4bda7ff60d96ed4821e2b971b86bba909b6939b71f8608eb662e62914c0d4b538c147a086beee2d3dafe979001300568cf821027573870356c330c6e036badeb53df3d357b97f1c7f9d7d370119e77913b12bcd79dd62c0785216292327e3a6880af7b6d7807929cd3342eba9283427020456e980d1d643f21d73522a0cb0ad4482931688409d813baeeb6ee34f654c2cf8cbe81eab8dfbae134ec60deb1b3ead5e5eecfc8cf8c804c49a988d5bffa77054d3b6fbe58bd941948de3e200e1fc316a70edbb85925d469c5e2897465d7c3e5c010646c36e09f1593e3f51735adc6bee6f9fa557169481a8695dbadd30c6f2dee99e6513c54376ede961d573c1f3cb16db9bb8185c3b908e91bb54be0225aa6d51efe24857de5891a7709bc9eee680c756461af9753bbfb475daf342e6ebcc6fb748536c58fd5b7dae3d2d8abdae2af7f8a116bdad5cb00d4a8215a349bd917ff1d450cae6d3b975f40630270d820fb983a30d602c66dad4f0c1cad0ec3e58a3315bfe59bba5018e46b956bbba8c77281aa25360bc431f499e549e8f928ba59527ac5cdcf39c07d3042e86e39d6a6ae8ef0f70a08d1fde3f7ec1bf6f66b9dad0cf8ae90428b8444168a90c0580156220318e5bf2e8b5e70e2bc6ece9cb04fa0bbfae26f607b804aa5736168509658c609c86a0cce70ae5daa08b14feab81e48c9bb3c59c1b0f62ddf690d91db364ea3286cf219e29f0f005579897d1bd9a8a1c97a41b800825c44be6c736fe3bd7047d0a2bf3124d921b7254bfb9d5993a440c0954d4c6ec53301b96e1735344e1c425a189ef90c7293dca0312772189f5c57ca07e950dd954a766d5779a191922e19966174075facb6308c5726174b9510075770f7915f3b06f658ce2a5c7b60d86ebd88574fc55cc1c02b4ac3b4320748eeea6132dca3dc6f5ac179fe71d6bec523be767cd55a9f31f6289966041c98313d957871d67fd236e24cb549ee258f7fe3171f1b09ce4b8f4d696fea15fcd087c75248bc919c76e974643797a90056c9b6398a340bacebab26a790fac76ceec942170938318fd9cc51d85817315db8580f5e34d1a00c1af6d05a5cf14e76f8e84477425ec910a3dac1e6c098c1f147c127e95b3f4bad2e01dec8c35931dce2c7bee53598b6bde7973071a0a6955d9cb9972566a80cec26f0e8ed81e7951a4efbb575ad6610a864e58422045f40d1f252564ec548b5546695e831bfa1fde8b6c5f919eeb6c8ac9e52753d0a6c678609984a35f7b19cad9d965d343a2b71f34dc84040834cc3d4e2fcce21788c995a6662684ed2a4be0e04f9acac09651a0754727b7dbd694d2a53536b13af58c89bc8f73397012d16edaf370a3bdcf4a5328e898a1626611c9f10af07b53c1deda04033e1b81101daadf8ff6df92ee534e5c8c3bbaa20b44253fabea55b28d22d2391346911816d0d8cc248a2140fbfcd8f2d0fe273d0e462acfff6244408d2c5b54e63afe35b07bf388cf2d7daa7fdc18785549b578d659486d0fb1a18d1809526af40485a1a19d2139346285d54edaf80860de4d4ccaf17529a48a69c4e4122edc0994dcfb1a90fc88ee511332d5337d4508933a67a95d0dd4a23250ba18c0c1235783de853b9011daf25daaafb7eb80b34e1f5a26cc4d3512b453fa11825a5bebc5a20d0910fe038ad381bcfdd14243566610fb1b5a3352cfa6b5be72c1704e45c9c956ee598be33456ae20458f125abc95b84b80240f89842a3138b5ccc9822bf3179799844872390fb597743cd1aa9d2b44d4759fd48e2d162ed7fb41c0bc62122f892364cd6b72927fc6061d4cf26958e1ce168a1919b6d894173dc8d85412268b0d379eba4528ce085e30955786f12d57962fe451c2d523d51cb9baca878322bb7e297b4bd87e43b7f6801cc12245a7bb8d7cfd9ac8ccc44795035eed38ad0ed080afb4c3c5485a52ee4f5e620ba11240addda1868e97c3bdcd8a83282330f2597b97030d425ff6092396afb002591b82fd07892c47c68bf3f62e4081783b7a4d67486693a735b34f2eee3b1746714ed4125aceacc82d19c9b343f54535b23619509c2cd0420c1cb025183376bac82afa30eea09ab0c9ed51a644b4ae5e5a863a63f7654adb046b295240b0e88616e53cf40aa602bb033d908a5444e5a8b78adc19930591c01946db369fc3f6850c874119197ed6d45624fb2a56890498be906d1ce405ab12ff4ac82ce1e23002c7a366128a2f758c59bb3d6bd306e7f4e8efbbd3d244b555c0a5192564390d69a9711fafb7b379ee72889f1f74cf58806bdfde655bc93d6b07831bf75cb4c71033198f2e8058f188a297a486a32835104968cf14f3d755d9bdecec0f94035c8679618a245f22d81a0461ad0e024054dbe3016f1fcf2a879ac891fd5106608ffbdcf3d11f45ccee091dda2cb13f2aa44f20f1ab83914b7b0aa2ba97b88d928a4b8cc0290f25af77e643422aae968415e4bce91a313487745c8d3c0505cef3be10c1f036a336c9eecdb3d4a6cc3d0e51cc8d0cd274f0e7242fe5f3139b383ff3f9515d9c97c000128f1522679070c725ee9fc00736a3c7441915bbe9c3c6ea7bc38e42b1d2d6f17717519c1b81961ffe69773e700549e494b90ff1e010340a9d813f2eb6df8887acda12fb90000e0e505db744670a3208f4c0e7e920f7ce35834657f4ab8c0184cab5bf9f0232a88ac0051e5798174988806eeea46858b5ed68cae539ea970199c98b3207671c4c270452761cfdc2c7119139629d19215776be4531642195195a6abfe50b50abe36bd26ac4e9b72536890598f4ccea5b5bb026c21ba3eef3f14875f10b37d783f7120bfae425dce01f2323a04515a6c9ee957f91dea4811d11b7f188ff5a272d89bc507bc2eee213e03917cd2c8c8fc27cf6ac5fc6c89dd8b629ece1f6a754feb15d595bf71bd6efc3947040427ae02fdada3d6579900ad5d668c16804ea9309ec56a54bd70502cd7a8a787833923604a3565d7b5fe2ff4e17e53cae04ec8f7a783b4fff7744826a42f38d87fc31c88239e828ea71d96cec115c0fd62a611daf325c5b310ee38c6d306358bfd6c1c6943b37aa6463083c843acf5a56c29e8ad8a2b92972d33d2ad507858986e49f9d4b578d2d02bfd5bdf320bb32fca19adcfdf3a1ceb49f3b1066b5af0165e8d449fe64a3e206270fbea7495ee99a4abc3eed2d591e4067a1a5a47655eadf13388bdf7305abf9385585130b1136a61b853b6e18118905c18629862ef04ce1f9139aeec31c2b763aacea6371067789a8f58c305fef29f4f6f8cdc789e5d7755120169e858363d8ea82ed17da2381a03ba9a4d94a8ec3bad452f278bfffb40a2879205aef144deaaebe4bcf2ca13d15911cc682f0a0cbe43c023f742dad5ea478ab83d98aeb6ec983b57c0011f22db7a8cb99f2782e7d055ec5ee8288f62d240627c95521277bfe3d2e121ceb296baed42a2fbc8819e343492a39730a110977e7d1d8054f6fad40ed6dac8c31eddda1205b087243335b323b969591237811282f7e83e6639672f9ad9fc553c37d93d946de542851b058b3020664141533e76557d75ca8fc5b0ef810ec596079e81d1460f3091bbda7a7c1efa3aed6003185ca144617f87e3a7ede9f743e6e977786f6fe53b4fea9a3619261d783f946a13c3fb9114856aa06f18b8c3be73ed7e2866370ab06f7979a58c16f7af20ed76d2d6f91b0af738cc5264d6f2c6a786aafc1c01d598bb8fa84f6a7e454d0348b8bcd41f3ae1f7b028337faf664209272fc7ec0611a8172dcc269acd9f607e26acfa24ff16d8e772dfda4283a63a73a372ef55226ad58d19144a526ecbc8419646485e042106076b482d87c9648963d2368ade1b834caa97552b417043cb900136df1c242e3f7eb56d79ebaf56bdeb6e235090f971905b7f2e182548929e025697e2edb295f3bc57b63a16f9efa707c277dccbe9ba94087596c46f533dbbd05ce3a6d605f37f1d3358776ffa50d7228d4a5237d2ed02d77a834fcfa7fc44c1102aad4e244a6cf26724aeb15dda5981cf8177623f249b8b763ba4edad621d119c4b017ada842f58708e25a503f6a3b75858eda21f429f7aa0d80f9444ec0bf5ab0cac03d0c682caa3257748598db2963fb767ee8393d7c5f631bbd4b858b236b4ce4599c576b9d8801cc9dff2af3ee5d67be05e4a5137c263b04d64f6278490f802c202f70230305157835e2d6174702ea87ecc213b267e7070ca091e77e6726d5951d6937555e6f6ff3bb8c59c9f73ce990712a59949a5071e4b9b07a42e674ae95cb0544f6722bdc59c1e8e471d4986c04cced04526e48825672ccb4430a78fffff4d2ebe953f97b541d6065a98a7aaaaaaaaed8ffaaaae1106d0e6eb05aa295befc88f891210a6745865536c5cac54244229692549abb2964c2477944a301972b960cdb411c2216c8a563645f5c99868533389a46555d814b635eae3ff3f972e83e0eaad3f9a6be0040fae9a96872786232aa3a3af1ac618bfb428cd7c717a8084bad60e4d702bca7ab2ae555b582d0d8d20451897f91ad2605eee91f9d329019cf1d8da8367b0bbbb3dd1bec88a61e179c191fa6c01ecf88211c312e300ab0cc74156db5b51d693751dfbd1fdf021d5c2939c2140d61b74621372a222a25122e1c2ebe3c6a6a6f6bbbbbb3ba010629cfea829943526f115326b5dd30865d5b2a2ac27ebfab076002a143a70eb122f898b369b6dc5995c318b5043c9169d5bd489546fac0a9bc2b2972003ab13461ea28c32ae13c8140d63580153dddd352bca7ab2aeed29b5b505c4465c3f13292ea09e8fe3865b7777d48aa42e2b63570dae271ab8da08a9c4058e4b77b7cb6229182d3696dc9278dceec32e5ab66c5ddbffbb2af84ed830fd9284c0d29a5e52841d2fe5ad47940f175dd45392f4c678ac7954ddeef64c8110774337f6ffb18e28cd44263d60298b584b9c333fb843b537e79d4bce39b6d6387d0504f3ce30012e3039f4aa0ce994450301de8ab29eac2b0f2de608012128bbaaa1a94645950c4de4d443b49112e0032a9d4bb76b8ac061bb9935c3929715653d5957fc12d6c7ffff9e77e57fa744f0007d88ab592308930ddf970d163234323864f87f14c39c7d5a5c162e276fd99aa41bcc38b6c0a2cd669b494da72041e0180faebbdb4ddf0c052676400b30785cb07462109da8ce14c12dafeeee0f3d1dc61b5a93b6ff33862494663e19ad368861eb1f72b1f2e7bc588c802220b960ed9011290a6a1933b8009821769ab090d8de7f96ccb53bac509ab9d5e56187d82c67360d4d76dddd6d18aa4c69a6fabf10d562fbff4c4294660e3308a662ce6fc953b2f7df4ca621b6a47a6b8d6cb8f16289dd97354f0e8ec063d0e45804b3a2ac27ebca7b9b73ce594594661e91496587aca5ad8396eea58fffff3860702bbf0e1b2d8b8cd40c59fa4b793897125d379272c920998f1b215217f15694f5645d77217cb6a6b6e4a5bbbbc99029cd549f32fd60e175bfacf8733ea91411e3f0ff8150261ac4feff0dc00986d588592e07dd750c09142f70090d21239a351853b06c77f7900fa5993f6088a160568f6aae45edbe6aa4436966cff7fb6004bc0ac618639c5bbabbd95a46a1f63be3ee6e2b94666ee10e325d286ce35815368565310c4ecdb1350cb41a5be3bbb229dffd4a5ab56555d81496c5ed77523d9f6d5d328258b2c26b7ef9ffe70280e9f6ec51eeb8c4136d58fdffcbb91473d3b7b19aff1fcb86d24c5d4f032cdf8f76769e865c923bd2610fb2fb6079fbf8ff0f2534b4f2b7b8d6ddad944c69a69abee4803cb37703c09b84ec171b390caf16c22ba89996a797946606cf30ee8131c637cabe59368ead71748dd36b1c5fe3fc1a0728ecf7ee09fc727158f7d41dc7b52a97aed89d7b61cf20dd7ad2cbba36f310b6a42d8ec8e7f032e7bf55f3ff2be9509ad9f3fd3c5002fe3f6f841a5b6245239c747c332335f5cffdff3d6c28cdd4f57cbf103d805db37a8b31c61877dbf296addd880132ba8e242ec618d718a234b378442695226a2c557c9382e2c17b51067892b62bca7ab2aebc921b43160c94d01325b613b2947104caf7bb3141614609163bac5e7e3ace760ad8fbea1b3b4598c7aab0292c5b03005e77378ec40b39dc4995245b7c97430a9cab1897c5fdeeee6ea916dd4a37c61d6731631fbe106be707a29e9a33bb73e6f1ed8992b1f4f1ff9f461289e4089b9e8eb6d7474b12a511bba99c730e16519a794426952182cb1aa7deeec52da705590b8104494f46ab7bf06efd3d4f91c32c901b784f8b218e9a8c68a05c0cd13a8f3b7eb83a154c62329634f4248f43ad087684305ce398f0f471146488cd022bc8f811923b2292c3e3a846850efbff6f3184d24ce1f0438be2ff322b9ab44769113c76e1fcffc16a5cdc92654a33d5d95bb25c4f36e89eeabc227470569fab730855da6cb69a99596c912872dd66deff77e8c043aaeb5f1e6753532f898a2bc8c66206f9b1e85249810848d68b209e196228fa884ecc540437f0d2d5e9e888712372bb3efeff5f97338e8cad29221a6c36ba860d163d97a5006ecc38ba526c94f08731cf3d41f410b6d8a4694811efc61e308dfc5a862472445a384ee494d0f755c345219b825d5cd50659dc11917839a71042af8e28cd4482b84afe38ae942b3760e5baf45dced852300f0613cd6870bb181508993671ec97ec7e79250930206408955717d111e70c4eb930f2faffaa224a338f1eaa9039dc345ce668055f1ebeb12a6c0acb0a91f4b4d7dad16f7a8325af407a5891347700cdaaa189d1825a6e93156528cdc4b52f4e4f0816406d8117071a8c31c638aa09001a7528aba5458f251c48bd4444aa5154342d3ad478a4fd7f18d44be97be9eec6f86d0b3f2576ba96c8ae545c8105d970c09df8cd7a5cb09afbff9584509a5994f464eca0648577aaaaaaaa8a337bdf5a95daff1f86446966324cb9862d51c46cac984e45ac57b3402522449e488f9501820792373d2db723c1125a472d406ee648ea5815368565956adb4ef0eed4d0b8015b21c319b60454b26abfbbbb7b92509af96414d16385c2b6dd3e3b2990a2ce8ab29eac6b1490b21cd54562e66c81a7d301f3824caba8c914d21b3143c0d6d4955113d412a8e753c4cb811398b2b46010f278f05801416163fe08fe3fcf645194c143bedc691221bbe15b427edd30b6d2afd8c7477d39c77004df6e47621cb16952ca51559574238a2498d24cf56f4dafa4f9012a996b915d581536856571cbaab029ecdb4c5d6663d1c7ffff1cb61c22872e6723e4520c1d442f1518bc69acdc7835e49d36ec9e2716d030a88fffff01ef8fcecc06d23d4368853c3e4470158cbb0257e002a6c88b5b8fedc724e34176cd7a39d7c7ffffa82572e5ffdbffff3bf5509ae9fb013308a7a0caff12e0e4c379f14ceec9399b90455ecbaab029acfae69cb38f10a59943b5b81e51902c083e49959a8bae2ca6254b6e68d316f5e043974b956a50ef58153685655b75c74077edbcf08562c44c52d4901f27b058b28bc2b12a6c0acbe217dd993986b86555d814961debd66505807a594f742bca7ab29a6bdb8404d4ddad43820bb025b29b2043390da51563657adf740b57c3d5fad121ca41e4f6c562654a33d5decdff5fc48d62ce3fbefdbf4c12a5994a0f64966f115343195239bcd8755dbabbdd54f9b7c45bb0375bc21155228eea85ffffff15302436214a3387c52332790f6cca9fe4869f7ae07e1cd0bcf58aff8c4ca78fffffc5b0b295ffdd4035030fd44c6f85f24d81f5758e7530b662d724fd09d6201fe3a2635a35e6fc254df00e05feae0257316163238af8308a0103ceab86fa529aa97eb744db59dbc7ff7f61cea80957336e37398ad408eaa7e12e9733054d3e2762f070a167c609d70425263c7182f39bf5b8bcb5d4f8432cd5b5efb74f27889baf1baf28ebc9bace786b075e60415c42e38e19352a88cbb3bb73a8cb8b0b7c90a674c4909161a49b8080b93881bf9b09d9ef37c36abf33eeeefe4262115fc995ac8acc07b79393d14cfd55d653dec0dadb060e54b5fdff1fb72c0df81e9596924f3227118d12274a4b48079f8527231f1c28ca48109934f460d0c1579ffbff91921ae9a9918c8d64d5485b8dd4d548628d54968998ec54555555754bdda563099408c20092540449662868464cc786d5ddff3f0a08a5994220a28a5694af92165e50f514b946388854a72ea6c80cfa04b595ba6ef75b53fb9d7177b71630a599eadbeeee96b7cfee99931cc298d8e8b101b4aa6deb1a65a4ca5bce2df43ae59c734e12a599ca10394b9baee7fbff16530a08885b1c331bb639e79c5f21946616059020a8946ddee6c40079131a68040d0371248cd31863001400070c6a94b4787808311687c5c1a0480c0484026130180c040040a140182c0a82d068aeaad17800a9362d9b755087dcf8d252e1468564365bc5a23186ea284aae53a43daa469d13895e5178dc5b2b30f6db8c5b8ee015ec4a8f461befdb5090b46549080152a5f5c6c1719314fdc262e01b2f7cb846499bac1e5a5c8b5520cd8497002e3e611b62c8d6356057eee490bdaea48a573a2d93e28830caef4f278d631235b561e51fce0ed32674e53f5140a552cb7c0d081c6388e0e53a5effafcadb1e9bb7b2e6da0865e6d8d3fa48fdd8523785e51f71ea1a27128cee1c5d7b313a04ba1da2b55f9be41aedc5ca165f290751cf0590cd0d4fda27e79761ae35b87b26687011cf31c28ad9d213cb6344da3e3f74b2b3537c3c235bd069f7683ed20d21d4b088ed678cb5fa2a8b5490f1b7bf61818323e03ed030f223019ad1775bb4d2eb1c7b0de8168040063925f1d163b92332dc60a11e8fa243ab93c61fa4c3ddd46864a2d2308e8fc72fba05207a5cff261d3ce57fd7f153a8add024690786bf3c69bd9e960280f148bfdd347b2c4e8917a4c69317fbdbe47b65fe1897ca90aaf0343c7295c6066ae25db25a775eb1efc34f746a1c8bcbd876ca1a2cda61554b1aa040360a9311f60f9eb859eb6db7cc115a2a1a8a6941cbebcaf6f168f51d1ad31f04589a44a940b87979d0107e60ec29246a8ccc420d8fcb4e3ea5c9ad027bd880c3948e6b7159b4a8a37f4cd55e4911a95427b5d31f4d2e256e27bced380dd8d246cc8829b585e8f429a07f12dd81c90e4aef2cc53877cd856996c1478ea4231f03dbb9cde6d8de7297ec59b50b45e032049ebd53d24e41279dbfbc974d67b9938564044581bd86a8ef7d6cdc08a29870510420372809173a9fafcedcec4568d34eab4f895b5024e18176a716b453bba8d17c4aa98641e0ade052f9272f7b879a028af2df79c3a056ba73b0dcc0ab1dbfbb3ecf2a45e574a9214208b332241ef642a9b3a700c8f059c4882a07b51c53c0c4c948530ddf491f68f199e39d885c90506d27e3097393314eaf300cd5dc2bdd5d2f3e57a48999a80f83cbf9c362786b75587cc2c110b6df4957d4e698db840b57f3990871489c67d1bb9709db69cb1d53706044b9c4beb1b1adb6a704c44f90b01ba8672f30afb5ce0a199edd47bcb8e111e93344e453b4d2244f262a824b6193cf528a7639103ac8b8f2a9bf48c2343523120f50b2cd953e8adc09dcbbc14975bd51999a584ada2ca8feb61edad30207495f2dceb01a900e462e6039dc910c907c662c6d15f58cd2e8df6e596b650c42f533dd0d81d1c710855ed25db4128e89420b34545bcd5aa3e8d1c07cf9370547599d25c9fc3535068d70d49bf3178596ab1957e640d3c1c9ec30ab08cf814acf3bb05ca64ff945703c097977487372036f25de21d993cf004ee36e30c75fe07c8e237a9a01dbb35788df885ddc18fa956f48bfe02d9850367135038276ad7ac5cfdd5aeaa97facc69751b681d13c3fcf0f0452f8018b861cc8eb837bdb995d8d04681627cc7ad38588b3024e671d9ad1941ac2b52ff4a94ff9ec9119c77e26f4f16b2da84947bae7c04807e6d7896a4eb000169b8967d635e87bccbb421fdf28d726084833494e7f3dd1f6aa5243fb3ac63ed839d08a4bcdc162b3595e9d5ebf4459d602799f8bfbd5586690b47ed354eab043c80b429f3b4ca1c0e42edb66179c066fac66bde8536217815d0c77fee1a07f688191d7f3b54a0584cb0b21db23e415fe7ad635084a5e405de7c966d880a6746f69be38a57145cbc3f38f131b5b21e5bdf0498a9e2bb907d5aa73183bbd5e33089b4311958b675a65fc285b577710993c27a5231644a4e96ae90a487ee4b5f25548fd8b6d66f546e5ebf31b5b22d90630e8e9505e9479a09a0b589aeb9267946fb14fe12e4b5bf927e8662b339ca794bcebe7924a432b6b215078fc811dd261095648c9f765445061abd52791a68bd1ae7496b0272b2185476bc1989a6dba82cd1e6595ba632c3c2539e2cc4490fddc1983701b68a2790f7ff8a7b6f3504497669a34a6b5df26ac7103b1be2d273be43d06cfe8503da2511ac3b9093abf2e5a23c034eb8629158e83605bf704cea275cba29d285a1868e5d6848115adca25851956892766d702a8f8df05f238a80c2a402072804596d9116cd5da5f2fe3f834001ac6bb2609735f829a9729c75aace0d836b8065dbf5c8df4e036076bdbc0eec5596eb839aa9f283ab945c837d4e89aec18423f40e74d8cf50c31ff70db8457a528c77a3e540551713c65e776e3272224a12720a9b9e434ddd663f81bf7a6ee289d5fc5c00297698a96aba2e380fea4cb7fcbfc438db3b037c9112df4f081eff2c5bf86c1c8ca5e279d4970ce10ac5b53260a9c2fefd849d37021d84db480268086fe18e2e5b029c72a3852341224da2635397b4231b8fbd5efb58bf18e9920bae9463a4980e06a20cf274249c6005bbcfe7ce8dd18c24732cdb4ac1bf83d11b657c55bf551d7b85cc81352d7a7c53e89bb842e069f8b2c124a6af601f9b69bcef5e6740a0ce981c6c7714b376ac1ed6ca411b2609a0d4efddf50162a9a18c4213803c0ed22e26c04dce7b9032a2229a2c083b04df26a7f4c657e471792b80fb7e08dcdd5298ea718e1805344b41e197f95e6edea21c20a06b24c5f28922d3d784a3db550c565354db5df30631d0935751bcf76da87e0e9a011f121f4da51412404c9d533ea8f1b47c2a766ba97b8751079d3abc46d9e1afb396038767c27d5737cd76cfd19027c2517ace2a75d1f2d7da2387c4a568d9c5904311c9fef21808ab53b5830728ccff0c1a15829d66e8dc39a93d514b76b89e25e9d555cb043cb9d3a0e67a77c8ef637ae9e59c1be788c702cc609d62950454a5d9c578b09ceda25e6bf646822edea84c8e59816c400a69df0178f8bda50a373bfb87b442a100764cf27fa86762ddb6f1c5aa225543fb481039a155063cef8bb3ff2e592becc16f12b8f93d10ca7bd85a644beaf8ce26b7b20a3ca57a6780188e2f69f9d7eab8449aa11e447e81c35a2a2c7771cdb03c1d4f793c81db60088efa7525a972757d5d2eb1776feba731f8830be46903f5f1411464cfc60e10d96c79d2503bd6befe426afa55f50d91c298ecb41f2cc0f06dd7fb4a868b05a8a9ef77b074e8fba84274b104ce035f24e70b17b13a5dddc4b3ae4afb24ae106e84657b1ff6c49fa936154f1752f996f6ea52be089cb271a71c6f783c5997e91a0552fac57f96413a7df75af1f4f8a66abe2e4135ccbc3d8d8d6fca963f9f533e50307e01cc56d5bdf4feacc7a481144a30d3c7c55c6ab2a5c9ac38d13b0cb04ecc556f816d52db834b498546e7824764d532fc61e67023e4d178d2707147b0092326e06550ccb01985b2a541513973be2ddf77c2c98099f8990cf5b973b5286c9544566989fb38bc5247f2d5a1236d6beb0cb0f494e67b19d4dac0e73700df4781b55eaba76e47bf70066d446295b25417f50d0814e4b3530c7024fddb0944d737fced13c0d7468f2a1cae92ba079f3a212f1c0875d95c9f86399f8bc530c36c8a3da191668369fd1b569cb210f73b09820cf233bbe24d37d370caad446009b2e668b8ebf147e6fee3cac7025d0a2ead12c4e9e4d048658313f79ad5a630264c542096ffffcafc920a94d3ded10ef4a19a576f6e80444ec71712de5894aaf9d467b4a712365766e2347beb00c4b98017a2fd4955a3ab7285639dd392b77110c9c1c1b2d12b20a6db882c00473798ffe2d7b3ab67acdf9581ac9484a5000817f0b57a48b9ece8473f75d62ed4be91653391c90280e4be7b125992693464a0a244222174232851f3db684db69d822b1b8c75f36af99cd6babc646e9796a2a2e1551f9862c5df57abbcc8b6873a900b24ce7abea3c9078941bc4807f073d624a9514c8b2146fb8ed92221633ea1b5444cd927035792ae8e2c22a206cac941f7da4616aa0e32cb533bcfc704b421a5a676a2e93b0505c95b550d4c544e00267dbb6f72c08576e2350e1f469f3e98483749111862081de8772d4b56e7a49e96a234abe8eeea3e116b5c24746bdaef6b7d3493275a86ddaff53e254618fb4a19fb07b06e30ae735850e508df75c9f19de0ef29821309f3215956c124129bf0e4098b807229ce8086074b272accd3281655a57a501733a1da0399981da2ec635447792f9e548724a19f09c3fdbb2b78e747385b38d78a995c203d80254b4994420fdd4e01a32d812921ecc8b9c7d183ddad7d23d1f49477977a961f6ed52ee658fc49db2bead3b00d4445d8cb97b6af667936aac950647d04f7dec399d5bb2afa1d386b5c29a41583892242fac073acee0c7740470225faea9d56a87c6215b60c2c7ca9734afe6bf501ef2b16a25b8c64276475862d9a795aa5e5e334442f9a253d1aa5a930b88a83970585559b7ee75ca8a2fe119d85d7b8249c9ca40a079b1b873568e1b5551ca752b629be3e06ff7eb0faa4b490e11f169d15fc97c4dfa13f10fa031ae24e8080137e5b3690ed6ab8a7ecf87c7577fc2d8ad055c8214e103cc8920ec43fadb5e332b4e05261adaa0a2413b37b1ff24c2b81ef63b9bdad754cd1737d28904bb5670779d624f5bc1068cd0801e6001b8f0306d27a5957f15f60d1f3b443ec1b2d9802710178009518133e01a4fa23257e2302ff1ddff9750f6fc024a837c6af43b46a17aecf7bcc0a5d980bf7e91c36b631cab928e7652a3e5395289179e82399b02c978398c4e4796c2efa5a6cf4fd704ede56334970e33d447d6146bdbcdfeef36d319c0d40d3cadfe267a4bc688acbc30c9fc52689aaf22b132504da6328d3d259c692c8614c6f114c2136c651b2849ed57681cbce5d7ec868975d13f3b22e2bcb18c369a150158f43c588f848518a1c3503f525491444e881a8696f16b519af71ccdd9780c76e973e452fa293057a143030a0b4e6bd895823cf05a6dc82cb945740fa2e2e85dd61fcea1f0fa746c15674086a9839964f7382b9a0ffe83fa03816808fe035a21d6a7ca3675d7b1bb7c16eadd24b159d2d42ac8cfdc552389d1980bfda9ecf64ea08426a51851b7d24f05511f813af01fb2d15ec806d423e72ed88249a22b5c3428e0e51b9d1d6b3b180430513c2b90157403a533edc59300a243854217afd93138c291a9d91c861a66597f1c0a75708ce831bfe516e8a23f9eead92a0086d518d7da90b5e096652efffb956a443fa022a07dfd5aca652255b4bbfa4d6e7bb38778a0ecf9441718c9fd6e352c12b38112bb9575bfd5bafbfcc2bee0b8d36cbdaf4d8a279fb2f2c4688d7900602553a9d939afb7bded4c3c37a5d2fb7bd02ea964bd9a69a5c263234759936adf5f51f07cd2cdaeb75dd5ff76b4902adfc34dfa2ba87d1eb5bf0bb7d3aa9ea8308dc0156b5ee68c85c67cb39352aa13391e126a2308ca6a4d75e5110b0e9ae17cb0c50de55f41dc61f0cd5ca6e79715841d7bc10692cd9881858bc51c94e9229bf1992361e2e2bf02015ba3a9b1cb2f04f2ec93a44956c4af931d28f597f0c6ca20278ea4d5888d53971a147aea2cfa9aba84a0e82fed663cc3f65ee777e3e125eddc757ae872a6b7dc2560d07201882badc1fd2affe4b7775ef80d45ff2feb7cb12a9121ddd54807c1587bea92c8ec3bb40d154828071b6e417fbd5511957577aacf68db03863d4776bac2cafffeb84b7b9182131aabddc536355432bcf0f696a9aa126619489e1c2f837e56090a568740e2d036e1ad58ddc669f3eaeb25d781b0ca4a2309e5ffb034be64faccff6797b8a4fc845ba4f183033f1ab983220670ffc2231999ae83ffadb834c048dbb4d7fa5ccc3bd941084927cabb0c7ae5e10f7fdcd441232723b42a53c91c716cfd60bd1371d858f58b717353649911cd818916db570b2c071169ebb7653c9c590d438783eaab595ea2702f0ce7b618fb342fd2e44324ab75a30a4e6d5d41dd8d926328e96f99d871e4a368dbdd0b747bb8532b48be47f39a153c69b843532a8e93d7af5d643312d8e5b5a0c4a25f42219acb58f2a70185476e6e08384c5c6f49b77819579789c11ad80cc72568b6c9e9ca2dce874dabd6bba4de1b94886a49fec7cc5493534bee914bb968949d4e9831174104147cb09ecb22bc02aa12f5f38d0b5f26f0053046901c43f244c279943ba89b11e1f1c79b935d56d06f6bef29bb9aceaebb31884f5044cf3a013a91e663af156b02a26eb6f83c8cfabb0ba9646523a610d6fc98009973a394195fe11da460de87f866fe5573402d801d4f263ff9965a7280e28bbac1fb3a91532b116666f1014580a361bcd554368c3ca907f8255487d14c049ee329f36d1c965f0fb871c65390ce44bb2842a5678922df7aadef656b933226b0e5f49f1a87934e662483344f5b90192273be59a78d50521104002e0bb4d70665d566e48f7448cc15fea67bc89905dd64d560c9edc3772d7fd0fe79f04e1e16e153b4c198788d4958a48c5bf6907e77553abddebc4d936111042d296b4a8cc2094514829e441437056cd6627d8e24d3402595c750e0d6bdaccf61142b9eb40d792fc1263427c75c4804ff7a085386eb563553020d5a2d91f2b938c451d0e1e46a5e477f6fdf6230c4eafbddeb1e129692601de45a6c59a2902133e5f6a230745579e1ee33275b7949954beb877d6213b8f9e936bb6029697b62096eca3b90903a67767f7171721fad61db7398a629fc90e9e847224950390feb0d01424edb4a4e35b638e838aa595cb525d25225e5b021ec60f55019655ea536c72983be55d13bd4e96587c7ed40f3b4f505f0768d27f3233e3826a779b6da96ea128905ab30ae2dd9a9274f0d2b6d99e1d25bba5b08dce4414451e17b3fa4c6859ba8c4afc647dbedc69b6fc8b76d45f0224eba4fd5c40dba0b542bf719df330757f504b21a1aad7f1d401e2a5f83d2c6d2def10155855e5956be4409a483234b7c34f32756ffc36f090c50992fe760a384fe8b8b759e16c0e65b8ce2469aad7cc75aa3126b186eb7be7f494dac0d612e66872435f5ae50ab6971f21e6e8e22a4029135a61b7984c9f5f7c4e18a0410c3badf31e95fac7cfa3d154312c3a4682813c11462febbe9dab5402b434a4f05e49f052ff85a0d4f45bb7192106f45466f5b20c3c70847587331ac70b6d0f4bb56230fa6e66c50038cfb4624fac635162f6fb87cc1cec3726c00722b670a1efea68938df478446285c70505ffceb73aa508ecd914b96c4918556a269d38f495a8251b2b0be5adb91bfec46f849b060967363139e2d45f127b22b0f8439cea55ae51766bb3b92cfca3f4180bc8a1ef7f548bd86c4cc348b8544cb3db6ee5cffaf1929356d9288cb80407e847082711ea1d233184ae64a78a6a46ae59a4510ca760ab19d7d4e0ca3059ec005c0e864e5589b654150b015d2d314b519eafcc0b80c768df4e54836a95ea3ba878b035b0a05ac8826c5306e3659bd8126f5a261dae5b3851472b3cb8e118dab83603a556232584de2ab5d5cfac6d967120e469e0a249c2a84e7c2aa22391db067a3a275dc2a092b81d30f0fdcbc34faaf08bda5adca3346ec6454a80d366e899c2f7cadb8f4033ef6801f4ce7505fb9f5e9297932d4b73ff34b69074d344473edea2d1c4925f5c2b53c8436839466313c99b431c4a191275219dcca464842fd4a8352f4bc28ca6816e5564428a218d1396eb5f4fb77fd978bb38af36fb6e95a205e34cd60cfdc31d8d3139427e3707d7c278e09dc9b8a779e465269b1a008776d0858f259f86cb188578370b958c4bb8b76a169daeffc32533e6dd1c2de30d379e0bfb66a448b0f3060859cf1e061ee028af35bf19db4166d67846564c600ee1b32ed8ce2f2804d5646aad46f6f8777af521c4dd6a0bb77abcdb88c74ed3e9aa987517d220108b1a922ebe9bdd0598967c5d22003d678dfb92172a40a02c641e9346e75e2312cd96e7ac7691062d74ed5b2011007f14b9d6efae4e95b3ac039efac873f07191ce29a3a77aac664ae8246c66268b102f78c60330563d7a56c026214a8af6f2dab6207bcfa4f7edba740107d51fc2eb52afa264c2ddfe1827d1a1d7748cb4445b2f45b4bf953239bf7e60864399f74f5d24c1561c1176b8b564bfe086fe44fe158da0ec3a66ebcda0345bf73b5dc84a4698bc1c3b5bf5181f49cf3c818972d1d5b58802a4b7314b83be9d99ec89bb4015c386d96e87e99b3ced7eee25b9a7a22986e0843d77aef9caca912b5d0c88f55061380ea1529cdf84a222eff2e5864596c8cd9124646384f0cff8ce257aa2eee2dea3c3845c968e7b1c794963ab7e0908141a0d262886a99bb5fb9cc2ecd67c5574ffb4e7cef3e257c8aacc503f343ca9f02380b6e2726d982d1591818417dfa0ecca45fde0ed31a94b84e858415e52e22f5b9766a6daa8ec656da88c25c5c79700a6b9a107647fbfc45bd95232a2bdf60db1fb6bdf309bdb0ccccad1f11efb5dc1711d7cc3edc0caf0ca1909cc8283cf2a0042aec2a386cf7460c95d20944ab34213b702d777f31df7d266c3b12e63de1627802154a13eca949db37729d8d5ea9638b3e2706bcfdc5f20f2f822940ccc657083040464a9f93aba30924406880913b6f50cc7c28ca331d8d1d02f0e1def8a485517c0419fc11c39e23914fad2699e57923472d7145fd0f06afc16b379d8bb8a69cd0273254d470cf70030ce3fa02f1baa7213f2c34953515ac2e0ec98348f36fca03d91e8697cfd74614cfccd74c7e4798cb3d28bfc961136e2ac71ea2aebacb81bbb0829a0c07f672be14b67c03d8d9f31f0e2f079bc71de86b8b96a0d04e057fda6d35a7bdb49db820fd89817a7a9a28a5521eaa2d59858b96cb65a380b589ad04836f715661cd76a7eb5fa6c9f6d0a2d59634a960fc11538d24812af0cd6afc0d4b093f1801b6d001c24ce443e21590c524d303000805b45bdbb0e03447da1360ac21ad213a6027bc06c3e10587b4e26967b33564b96b530a58e6a5a8051ca179fbb5547e2e57a0d43287cd018565b6b75ee05ae07b8016948de2c4ca919a920991e025149b093a8c2fdc9ff78c7cc9406c25da988d7193b2bbe45cd379fed3a6ca7c322b05e4bbe017f1f2fdd3b2dff9d641e99a3d566d6134550196467e4326a20f8d1b090b8009c3633d80e776b2179d52854d461e1a8929d1e5096dc8743cdd1cfe7ca31ae14ad046ca127e58a3097e81c1dc164bf8e17d4829cd8de665a551a0b1de6c4d5e094ea71ee568863068de987841de2327e4b70d7b87d846fc1e05d1939bca72c93146344659f71332aa2166e1ff3417077cb28429b10d1c22da1a2ffe7c673ce6ce8fa1e66f22b1e28fbe63a915a507b095a8aab9bd16244cd369d39451dbb5db4145a583f48c2d2a7365424c4e77ad4999163905a029b4ae74f9a8720f310a7d4012a44aec6af7f92c71f53f5e9a9d92bb8329157068338468af607b2e87c5e3a455459dc62ecd7a00fc3a18cfc04b5e46c352bd863720b26a9369ca080274574e2766041555b8cc21515907e700c78a89e0f619a757e999b034773ba04951e3f7b70ddb668d91c8c0698815e16abb03d03ca9813aabf069f6ea2a1583eb4ef5288d43257e704ae86f80404db7822f605e894c5997382d6adf78ad1d86fec29589e76e887142ca7caf53df09fd1390b84365b0ba89bebaa1aca0fc5510538954961b137296bcfa152db73535223a74a4ebbf9d25eb30c726e450229ec2bf5a7d06026856c6281c0a62e534a486ea8f80fd2ccf5356a8e50f54fd2677db304d5220fbfcd29548d41b91a9971e84594ee5bef6577bec7127915eb0d24ac0c82b0d207e565d5b130d4bf2f1b50230b381934c79ef5cea9f8ec62c7344b17c91b3fbbf0f85753f70ebdd44d7629623304549ba870cb87bac1b9343d114855e38c4d9ada3d145541990aeb857eab77e2f70e400ff1a8bb12a429b3647749339e20a044d26bd685974d10be43e38266dc96e9c543670040e9443eda9b180d4a8a7d95f7d05ead92a4ac3d23723de7658e57e3d5693a945dac2d5962852c65fe9eb597ea9b06b3395f5d1132bc756c03a1b5da16d1e87705053bd9ce85a9d73412ee9aab365298c5cc7b0dc456282424934ed9746e084c088c62ce9467c5b0b06338b6dd9215b763372b481fafbabba955234d57fb24d9e93bd9e06afca8855a6b057f998b3e58f3d5902dd95cca4b81591a7bd3c8ce56b2915d27dcd51679cf75d43925efb841a040bf357f0d0cc86abcafe2456937483f7d5b58ddd0dac538fa3fe2342ae65669f760a288f9f523bbfd1e24dbc76b196aa82164a287a63a2970b881454a346aaa0dec14f963cc01bf266e801828d44584e73d3b94320fcaa79691c947539aca8a24bf6d9c9c693876e5f9cf7cc807051bb4d4c21b53bd5da722bf7f58a36b964d03786e4f165e04faf96b68a74e0f09a628f297cd9c348275c32d1dfe014aedbd76714faef4d670835d13d71bc14a868a5249d5c94c8f9a698afdca73b3a0b8808c4ed165f9a5552a9774963112457136bc5be16f2c70510dacccbe8a8dae3b917518f6af4a772d573e18b947a8af60a601823eb85ca0d83d429d7ef7cd186b6f555203a9729c067e422178ac293c12158962c6c03842f021ac12960562090d1930e50943f6b202ede345de177ed4ed3b36f485cc931ca5eb7bb0efe1be5bfa857a41381c089f7c31ab085328e55aaff6455cd76bdf74cec0ad2a706c47222ff2aaa7de08e034f88fdb6c9265b4a29a59452060f064f05e8056fe9929f4ff23cb951a8526506cdb77ea32d50a8e2350d30dfd61da62ebc4e6eb2a432f6d8715dc1376b49e5eba796c7d66bcfadaed88e55d08d22ac42d349a0c736271980c342bbea6cad5334dfac3fef37eb37fdeb60db21ea53fca9befb767e4c807dfa1011ccc62113037aede8fa0875db05e091c8f49f3a6680e9c8fa10127c18e2c310128c48301f307d82286c1c8eeed8b4b3761405c2911d7958a2322a53b59487274e4960c4a06f735d8ad7a4d2086b243e3b0ce86bff94e8db98f08baaa331e85f578200d37ba309f37712d276eb49d5f1f873c276eb2e36055d40a03abee3766fbe0c76bbddf62bc6a027d0d7fee3f9f5f99e6f9f3fde68c2f6ebb5ea288c18291ee79194c18cbf30e6d66ef7495777dd5eaf1e23e98e3f4a736b0783578192086b6b558cf17d0d773a9fafa3752c924915063d12104186e973249201a62318d62740ffdb19323d86b5adb5adddee2b1d79b0c9a0153fcd39270913ac3e4511767392f0ed38518281528abf5efdc784f9b583bd734ad5ed18e38e247debdfce6ece4942f50e6e9500d46f55013c6ab09b9384e954ed2f65e1ef18c3c4d7516b521b7c2c4c9f63d57427a4d2d26eb77bd2a25d8f419fc4fea3a4a9ff589faf02d3579faf441f8fa41d2140abbd38574defaedbbba1edbb51706e551d7a77ea2675e10d476ce709c9b945e2276047d269cfdcc20ea356af7834c13a75183a9f9f801d61d09fec30ee6e97f4934713b05787f143fdb6dbed7e97f809e01146dded766fc71feab8dd6ef7e16eb7fb3a9223d8ed76afa34ffed011c9d365afab4f479d12fd3b924c33fec77a0c134f3da9baf730ee6eb75b7bdd8f1d91ee6e8e2aa04e794cb79a3e7d822e9474da6eb77b3a6a65ea79a14a7053880b7bc2f0525532bc33be513c69664aa03ca7f9d9c0565a6b6dc38dbe23377e7829a648c1a1e6879427301a3b8ae8e0338315192bb12d3562778ee7799e1785a40a4d1db4a2744520ea4bc8961874e4889385871a58a21c3132b342738351394dd92f1b5821f6c2b2318354a13903121c7632c49adb9c1ee004e3032d8d0b61d6c4a0e5c0522bd346cc6c5d34ba72be72846c25192a6709c207f69ef09495f6d219e79c73c6b203c9e76c85735416d09c78a05f727659da861cb6160491fa9a210c980db46e121b1ee440eed54a6b1cd3ca87d5102bac2dc46bba57ceb060396d3569af1abb26298a95f31496016d870796730e2ffbb53515f62009db4c59e51ea2c072ce5987a5b185c5c985fc14e2c29e708642e4d01e58df7703dfd05c36ec9448648e95225934cc98c1e2a4c79490106c8cf1d8820108a719dcbc91e2c3cd072288e3a508950f1fd28cdca0851b865c2a62419a3cc881dca93cc881bccae9172cb2b04748539c1c3abc6e13d61286858700a283e389d5cd063872ce19890ecfcb996a4e7d4d894d8d4d954d9d4da5e170ca0ab03a6269c8c25b6bad776455a1b9c585e5c50eb01c84f7de7bef1d984ae692cab173e50712ec39799003b9df9cd6749855c656396e6c9db5d65aeb2f3055689299e10c7ca179d72d87f94e799ee7a1d1aa42334ad797d818129ab29c6f50ac0de5fb0a2cecd13da692d868c0f2c2ce9a929c73b6a17b6435e51db308980f6b15e2c29e30d4509e3170669f51f3a4425cd813864fb58a191f39e79c438be79c330e1daad0d48ae2bdc0d1e520543583f2eaaaf185c52c3b612a32990a4f210085302d64de10b1b1a6254d142968b059ce535e235a588295c52a889919179048299b52662fa4d0bc6c28d953daa3d20526c4ca856bb5ad9688588098f51045446dcdeac992303435ed2b2aecb1c156b69293af88e11757c6c23651c07ec0e94aeb41447b29e1f182f274b5d65aefc0aad004436676811d5a0ec218638cb1a8d010c5a13144091324374c512f4faed8b8e0799e6725aa0a4d1d3e866029c9ca19b0b2b51583b132ca0e0d8d0894a3acaf7cc656b87a54b3a979430e0f7220c7e15b67adb5d63e7455a1f9855ff820860b71614f185a5d1e39e73cc40acd9d33946faf365f61cf5c43c32c076160a69cb9b141a8a992b3508554716ab86b1ae7d9b5eb8aead2f1f365ea862e555e806839d124376429bb6d74641bb6daf03ccff3920ca942134b49d6169705926091e2f9408b0c8e140e4da684d1209f3d0ce41d75f5ef08f28497f0eff2b8bf8bb3847ff4e6e23cba5f0924eb493dbe9d82483dbe470bbe5081e98d88befd13fd8ea4ad033109e7b89194f1382fe15714a3fc48bc263cca8f4437218e4b23584186fbac215c17dde623d82b562775fc7a093149c9fe2091257cc745d1667331898fff884a1d8ce4895157bfc7af9b709b97487ee867a965f7624fdfc7c7250fdcdd472499dec74571e90317dd821d9081c293f8b8530a177d042b8a4f7ee45e41f71e9164fa1eff7c4423a2bbb8820c0f5c1c771eb8e8e2e89404b799dec5a524db93e0760a1fbf8e134d8ce4f5126f93d1236adf587cf2230fc62437e711939464bc55a2494936075d474c02475dd55510c484369f7f9de66c5e08a4aede4692c9366d22dee24cb28ee9cbc84cb8aad3e6b3bba7064d1ffa219c4fde7e7efed56fd4d5cf9f4f1029467decd99132fe3ce72ae2cff3a8ab3bfee9781ec9251df1c98f76becc32bd9e5d0b923ff1b3fcd2f2dffc6c37193b62f6273f5a41860374c61de83ba3d3ac21507ff2a31d9f479febaaf6efbbe988f3288b641593643d2e25a5907dfb1e5d909d8e3094ac2efca414b26bd7a30bb2ef11468cf0a92e7c3a82a54bffadade9eacf1a34f7d6596bd1a2e0a6aec1f036ab8a15412b705668c807ea4655450e22fa6e5a67d7d1c93fd6ab1d9a12e2b04854837c070d4109f5a894e2b5ef3197dd8eb80d4d09adcd37ef8f7e2ac8a3cd75f5ef6d86b7f91fcfed5655648cb348a9125dfbc93e9f29b7b5bbd8a31e993e8be4d267d72299fdf6e59b8bebd86d48b7ce4db36f6dc2fc3cdee8cf1984abcfb086b5d65a6b69a5420ce5a0eabed65df53beae8db71522f59ca1e849f6596acf7448d5d5749ecd5f55d7a6facd61393741583fe2dd9e6f644281156f0a044b0ad306b089e7b62f5db6f9deff883649dcaa84cbbd6b16fd4d5ab49fa4e3576edd397e8d2d31208aea75e7dfbd6d37c5bd259cf2fd0e9acdb3c46f53ccae0698ceab6915cca696f73bc455db535ebea6b9cd3da27282655a78e41a48ce9d674c4baaac017d709d66cc23c81aedda7a01e93aae7d18278d7a01f3cce5183f926d0f4eb79c612b02f62d4c7a3b52246ca4bd8b5679164fa3c7f89f41c8fba6ab361512242e8ddee0f21f6bb2f98cb9ec5189e5f18d975da2df644a5f95a544af176d4d5af172ca12255c7e30573d9b32761d7d5cfe3985d571ffb1ec9ea7be9eb579c382425ac0ebea83d385bebf883547dfcc17e6fd97707209ce59b45cf27b8f1c6f72798a95ff10af200f8595ea97aadb7f92dbd90bcf5ebdfce0ffd10da2add493afbd775f5c9eda0ef7182255ca4ebb691b479f5adab6ff36f484a9874c78b048a4950d8595b5b5bc339bb4dc4f7e623ec55242fb9f4365b92aeeaea83180841ffaa67723bde23597fbb57a3fc0824ef7f1ee547d701e0b8346b08365f9a3584ea37af3e82ad22769b98dd139564bc9d3f95c4a9777cd30066429bd5818b5e502e2d67470146418e0b6fd43eb2d38d58bfe3dd7fefbd3731d6628c2fa698e28bf1a423a65c18638c31c634bfd9b1d65a6b6dc5855f3dc6feea2754b7e35093903ecf4f33326d8ad0a8b1153c61da396647d2da91720de120fc7e9657a27e3a53a5b71cbe09e4d488d953aeb20a98a75c4fd1beb4a2e4c96dc5aca472f6d689e8eeff05e5fae9942ad13525a0a74e9d9e5ed15987b2c2595ad1a4a6547ebaf59b751c96b78ec2ab8a59768179eb406fb73c9559a4442d28012ae5afd73bd67a6bf5112a9d32595c914e9945601d95f653b7930575ccc23781b8688b4a43389d1a992c54a04e4f8dcca2e92c54a05366d1747a5576ed9e725d3de59a2c5498b3684af93b2a5d9172cda239d4249ccfc34565b2983f47af348474050a55b24c21aa02852a5c66d07cb2443f4b32459e0ca7e0286e4d787f966488fc0b7808cdfd2213e47159645ad0f2659f40b4524b2bad14db4aebc5bbde6a2badd4d24a2bfd284833ddd4a3975e5ae9a596567aa9a5955a5a69a5d8565a2fdef5aee096c5695500e66c0ac0dc5cc19caf259c787bcbb9bd53800230972911270073db04604e8f71a19edb24a802fded2498b3360198f35a94a08e718d4004604ed7b1253c2200735e084ebc70020463521f70d3e38131617a3ae0c5c381314e466c80c4cf72cc11129ea701132898f8598eb132918131347830b07381bdd366a72ab7b0402de1a54405c05c1633a5870245ec1056e5cd981a54da1ccd29b4ab5e7c5759c504ae18279f04c05cae62b04a44404c90db096272801e04c09cb63c7378906e6b6e1e3601cc691f311f17602ed7305478aa4ac881396db5741e400298cb340c92f0280c91efc3f4b079de083a57228491d2a9724003be2b068039af0518c209ab588039afc502324f199e2a05b0b02bb6f7c5236d2ac09ca76d08604e7bde170f84045c30595870002330a72f98ad112c30402d401198cb3e477c88866e7845000d064810cf95e709008c140fa90390d33784131e01c008e6740827bc126d0827243da7c9f4785ed61f8039ed0198cb148c44f103e6b415a2cab6b967f34e8039af0af1e46301e8f916e96b1325c09cae42e0f020096a16b807869e9e1c2484d8f1d8353b79841d03c32f60b71d9d9fe5172a3a399d45ca93c57305f2fc2cbf64f1dc2e7804ac9a5305b6d9b6ed67f98588cdfba263c4fe3263a785ae56cd56a9c837a3e52b15f866b47c47941961c190a0ae6739fc4892033956a094399a5368d35ba5955a5a6da5957e14a4996eead14b2fadf4524b2bbdb4e8467b80436442ec57af303ac28e9b2cf06ba2a220be7a5151d50f2222fdb3f4d2f57a0f81391d6a855a679de990171bb6b641606e5b2f572ee8bda900c0dca640800ca06616f20bdad620fbd9f8de3aad12a2ebd7165e6ab8c06f9de2aa21604ed32d04e6b4cf522c2dbff53a03055dd41643d54bf3be14b616f583efbbddbecf368bf22cca0e7af0ad9847da5180df9a2fff5c151de4b107abe63ec102b7efd58fbdb5ceb3487b9e45791669c7b328cfa2ec9e0952bf76b7534509d0451e730394313f67d0fde1d303e6b405261b1cb85c59d2a6c6d8d9d19c42db00604eff6774805b058180b9ed731655d0057d17d6d6eab9972fb5950073b69c776f60b75b09f8a9d7122d7c6ac8155ef580b94d02cce9902be41971afc29cb61f0f5fd501c19caea012f08ade28a8048401cccda2ecf7bb4734053df75e679db5cf599447bbb5beaab3287b9d457a1665a7b328fb9c457ab4d9abb61f90efa330dcc03c6e16dd3cfecf52ccc757c73f4bb12a1a0474819f7a16e70b600e8435e1ed672906f533df9eba531f6bbe17d605eda12092756c2faeb859441d378ba6634ad388cd781223e769ff2cc3da8461664d62c29cc48499691213d6252c882c61c2a4a6be84b130f5258c888d2f6147a4bedc301e5e07a91b0bb69f651891c79561476a7801ea92c5a52bec8bd70416c407e6a50bd7ee82a509acece2e6757e965dca3ce946f889cb962d624358b0167bbc25eda98aa5a23df8597249c24506babf608489ddb834e9b02a3a5c747e965c5830c285446e7b5c452969e28252a48b930b45ea7a9003b933c1ee41976aa77af47ba9950b632ebca1f1264d7339a27180727707b23f4b2e3c9e74231c85b9e8a0c1858a06d63f4b2e505a3603669415fba8dc5256966a4358f0254be811e40895314ca444d16052394790148c703831c61ed2788c4bb0a7c74d47f88e55762ec1d6bcf7b30423b36686accc6d8354e0b2f9da7bed9b28cbc6a986383acb9e565c7aefed962599bf77a82b9ca11df3cecfb22cdff6b32cbb7096212a5f52004291b5660c884a0a463e346839928291d84d6bbf9e97b35d6d133ded83745d7b76d6a09bf6fc529c8fe3dcc7e636dbbdf4ba09b789267c489be3fc2ee96a7d1f138e73138e53e1a3a5ebe95f2d5baec7b7b82392f7775c4724975ec74391a42a489453412848823ce15e0e020c10609ff6db7bb494bdcd7b2ee882e9716e13afcf6bc9d0b7dbdc8adfc5b93b6e0cd96755412fd5d9b75e7dee7105ed19037a9c56c80a51eab75e2919ec2d3390d82d631f080a7806ec50ef06fa8e488fbe0956a082db77443aadd075901e55318b7e459be79b45ed37f18a3de3d4592c5b763e2470bf7c73c6b85c732ac0569a53bbd3715352ae613d39c5f0b55bc7dbbf4058fdbb4048ddfaa66ef6d55c830098945d19fb414a199b1c46787864d4a2e6b8409416465504d60f31305c3655a9e6e3ef258a23809fa5da1335264ee4c08173f3195182e7629c091d520f4ee40e7676b5811fa4f8f974ac93f0504c5b7b6830a76a3787aac6d69c1d95cba91116e1b4d3ce9aae579a9a1a358d0cca2b2dcceb428b2a02088e0808341f3888aecc1e7eccc131258e952c376c1c695d706940e0f8a8d1dc1ac104fc00132210e44035688407a469a5657d0e923c693425f4668892064395b42a1fa8421ca449ed90e694b5c624ce12375c663a1041c31054c2d42096c3161c80e8c1ca13ae1bf8a0c4890d9868e98065c30d34fc10e222368478089220497c34b1dad2c1c3d4912828729ca4c8d975a53d6944e4240edacf6aadb571cede5a3b9f9c5b2b6e1dbd1de28c11051152a15cf587195fa3ccf8ea1fbe5dbf275010c484d6ad6b3047b30e9b3c59648c9da4d41bafabc0f4d7317d4ae10c29e3383db9b3d0b6beda6aadcef4aa6489b2d8fc6d60cedb1ef69c8e6412f6ebf9d314c479dcb388fabcde2c7a018b152b40568cea0aac2535d850264c0d607b6ac43d6dbd600398dd0b6bcedce00104b5e3e7aa488d16d09c9419b3c58685001421bcdcdc20062e3548dd70e81143181c9c68b88216150000881b6ac7d5e981c90e438c64e192b59f7a44e07186eccc17133332ec1aba0612235fa4685185d94e24ce3491e18c5a94263a84d84d3ce8931f3eb2667003856ac8a6915d20a64717acb118ca7cd93376806ca95135264a8d72ef78ec10e04401b91a0325e4c99a138979099b51840d5f566a1e600992034c4790afb1393c3e48116707355b7478128395b41461b45a984104d85a0c7276a000f2c4860f1d48ba1479128707cfd65690355a3b9098ed008747070d086288ac356072680305ad040a2e4dc2d8a80147899c227cde802468c264cc4a0e6590b81971f6a19064ca922142e03809d2c684561a1498304b98e4c06687b766876d6681c34406316084f8f2658699587821082a24438ad090a5e644106b80f08222c30d333748c3234cd3c30b674d5ac072068d0e9117998eb4af1b67dea8e932a22b4195cbd75a271065b26d88737c31c645583dbe3d38b28a7111548f2fc618bbc9222a52c4eebe41b3d68d9bc73f4b37664f863e2767a218c29c513833f33c22ced0c0d24d0d1c4432e833448c8800c10043d566ce72d04424c428c4b90715a0c9bd2900110539d33ad3218a5e7b56c313d190eb40672c9cdd78d28d6adc13fe555ab3ac01332b239a5aa39bf4106bc8f29a34529b524aa9d2b54e73e02caa3e8baa4fb1cdee6910ce928dd9d7323f59cc59e267c926cbe38a588326c566061b29363b9ed8f48022b2c126091b18b2d7b7066dc6962ad9ecd03f4b363d2e9ee19b75d61e280be41ac1b71cbe9f659b27f98631c6e2cc5d2bb6016b436593f859b621a36de46c9d1fa4fdd6ebdb919cc1dfa68fa8ca66d1c5b4379e9f659a1920ee6799a64a47fc59a639b293a6eb71651a227c843f4b35509ee7d93e355b267e966ab04010d4d9517306809fa51a2c5fcf8d8afeb334737adc8d8a297e966633f4dc48902041a2c7a73413c34d16277e96663e3cce6ff3fbdebe1d4915be7a6abe59777e6e21b3f138141f02ba6e10451901114519a1f1a25243d3c44a0d8d112b35ff59a2817af0675916a70c08b5322a6a6550d4ca70a05686835a190d6a65576a287e966536ca769ad2595429d2dded763b8cabcd741a00dfb7f43f7cbb31ea67a46b2bb53adaf588ddd65a9f1819ed8c88661035116146040d22a7b5126564b839738ce600cda13866bec8ccc0b9beefbdf7cd073fcb3354fefe2ccffcc0e5242fc1676a88ba6ece5c455937e31918a2dc9c6921cacd191e4e6e7269268d99312b381c1aae88331ceeececccec86eb41650ee4d8882dc847960324ab01e776ef55632b23d3579aeebd60ca64b995f172a30c9781722b73a5ac24f3fafcb3249bf2a41b8140d839555427edb573ce592b8cfabafab5c5bdf5ad935557bf7eb55043656988208208a3216ae08166082238d00c71e3bf9fe5103b3321ca6895917143e68ccc1632568e944132c496d9c5f7de2f7fc9b4fede92cc87bf40d59691d1e17702949ba8c4eb9a2a6a1022c50810000000c3170000200c0608244194244110835cf8011400095a924e543228a10444a130140c8581280a621808821004621004a3108603599e4379006f08f625a52f948835d9a91cf4e87e805b4d6f4df601d52d4ec33bcf3d2d3cb2ef4fa9b91f13e453a7286cfd7e8fdac537da566343a7491b1cc373e4b609d88932d64caf92684f9c1034e1d0a249b244afb01cd0faaf5e890543d89466a24a107bf452882f2f7655c21e63184f5a1211b5b7854fde71975188f7dfe82e7626de93b73ab7205a3e88db850b9ed2700fe052e8227d43892d0f9e0a890df5a8292dfcdd9c319a368becad0b221fe3d33c420a543c767b20ddfe5c764e092255a42feed35312f4bf3144d892cb770951a74d32648585e0da50e8ab43760ca2e7ce409b4da4706f4b8b06731862c939f45b5a5aa71b3e8867c6f5ac641db00cd6ce4e1b222e12dfebf302f45ee3e2d9ac0cc6ad6d7d4ab823b4b06a5fdef9ad22c8adee66d72d36d8ad786c782661414b245898c148db51440d011450f010ee8398131faff942ec5208f7e5ef2d1ccc21a262a20cb37a500841a3031097ad9f31483a2882124a7d18101198160045036a53e505710e7a3168e594c5dd7f64d1398afcdb0fdc23f5ba786357702997c9c5ddcd6d5dcffdded81ddeca7bbaf9bbbd6df7bfdf1bbb83b7724f377f376eeb7ef77b63eef0566e626a3f0e16c337fbaf1ffa39f18cee60f6c5246bbd2b22f01f85bfecebee5079eafebd571fff9aad298321a14848d670ec65890022d8cf7d4f62be8c0b3618661945fbb2a405c71d2c938fe25d95ba286e9d4f2331374906c68f5be2daa789e8528d054e053941107c14d5c678e05c3ead5a18ec07b3ec040230766313faa8069b20c3fa51d5e9eb27931cdba7796860e2f58cbbe8ecf560470f7310e3cdeb508a3d87de9a87aeca0e102834ab3e11b9296e0a3a9b298010e095f65f4ba53c2c2cf8600b69d2458dc159b07a96aba364a935308e1d0268d2e6f9bf189eb43cb4d61926a1c0073c3823cb6b7d376abd199cb3532de9876240c4c7401d9f8193c9b93ddd927f3807637c0cb07eb8e2639ddfd99c5bd22df986b29663626a20a30ec9ce7826e278953010f7f2300f5556f619473fcf97638470f9d64532c1b2e142876991e660667e5105037cfacab5670b835c418e009bd1fea3aadbc60b0118995b0b90fcd06d804e1eaa2005c4baa5e0ec0a7ea697e289f063f44252ae61e92d5069a44c3f3c0f2c192f8fa8edb0c10b20be72a73b5ef8c765af2c9941fc0a8db7d2d321d8214fe2c548ba653ec3cf7c25dba3ce1155eb54748f790bec9e87d2d11f41e83414c1a35d1a17c99e47ac3bac0a1b3757a0258a3aad9b1f0551b16ddf8498b0eb2715daee53d45e4772fb3dd9fee4368de2ea00fd45bf955bd2b4dca24bbd71975b113df686187fad43635358bf0fe976cb36f3cf86a3de28fc03cc35f141da38c9e6450a1f4081578f3f04301d68b7d5a2800960bb15471668714417bdb2039d7b2d2789f11ef588a2381ec7f122d7eebb1c3157087cf1e884ef48f14b7a032a4e607fb04706330273e0dabb033e68fa6725ebf0962426a4d04df6f55eab0db04f1c406dfefe849aba0c61ea22ffb307c79d75940ece2f8cea004b9826b80a72533d1a795a3244c3fcfe326120233d650a87a3b4900d8ee18e7b59a8f7ad35e513acafcdf96cc1a5283cea440c46a326f85bc4d489b05d0de1db35b54b76e4b31bc76b159c3f7ff51e1660e9e326cfea4e88e5e376b2152df47b7386967e694e57f1775a680f416f8bb63f83ae6219b423a1f5739e91e0f645fb4b84a2fba1039459fea0e70a618044bd52f66be2a7c6b2e2f8b9adf6b2a3fe8a3f2f3a7ed93d59eb3fa9eb137a246f69f18415f05ff76397fecb955367a248a54519099e6bbd81a0b21fa5270b0b85ff6e7d993e6f75b7f67aabd8f9ed41485f237278ade530d445bff18c75b85ff7fc2f9de27be68f78e665fae71601be0dccdb7ee91117f18fc46ee142690239f18177ad42eb53847210a930bff3a0d56d72547cd9fc03a30dbfb49dabf82fc7bed842ea0f92e9d0f90d41b320c2e329d4690cf682e8ae47866d63c0c00bcb07237ebe1a216ed20cd2e9570d3efa86ff968e2f962fa923e2b15671157ab70c8fdbaf07bb229e33c2d132922d035f529dfe292dfb8956c26c632bbc66fcb21e435e7409d3d27da04ed2aa043ab300a267fedcf7a96ee874bdf6ab1125ef22a33c8a36cdfaee5bc0305c94604e52f2a4da592a6a59c1f4ca2c583f0c87459c07c344b4a48de1dcfd77d0f08c464f42ae4e62002637cf83a0eccf104d644ec545c9582047d19b027738d00f2ed5510b93c27be604146f3d95e207f8dca8eed6cee43786779a57831fd86de207a99c683182ee11bb6e1acff97e521abdf913497f063ca2e616dddb6a2bfac013dc1a982ee576bf4565af01f4cefe7412c19ad9dd912fe737913110040c4de2d85ab80db42ccab34779d582a09e8522a70104c8d88d12751c020224d481dc7651f0bec65e745638835c539c06a90165d6def00526e1a641277fe3d17aad37c3229f345c2deee09107fd449ff066d17201a95e194cfcbed970359ecbd949f8a39a83fcebfc10b75d046603bbf8b83f6dade6e002116f63d82f71f9c3784abc1c3f2a252faeff43631d7818bfc486e057c117587713b4b5b11c6989e10ae4f565520ef49d5811721a5e2dc8033c90f31299b78b83721a3a39dff6dd94a441374635b66b3ca41fa23fc105447415c0e561e45bc2755ea714402b7e2e1bb4dd55a6866781b6dcf21d705221bc764621fdc95844111d660191010ae80eb3170c3a47aefae9de817d421010892f9af0af0086fe30884891fce2f9f14f4f8cea0edc00bc96bf4a3e32704131b6aba03055e1135c25687890a19cca4b8b63f20e7842048daa4534863b80e3d39a73c03d12f49e8f265262a256f36651730e8c4872ff782a1200097d92203e24e1156ff35937922443dfac89d4b6ec80164959c4373830417aaf5db1ad5df4b2561695b89b5dae157857c1f0b69635107800919e869959546152853edc074579282773d03043e8f9ae5d1e5f4163700e5441bb6fe4c9de9a663dd70d03e7b0915db4a6fa5c582c71db6b0a0948c4ab3b4bdf01d249a5cb5b38dec3da6f88c9e2186f95c3ad0425ffece3e04e380fcc166865285e67d20f4c6e4c4addf7c05fc1061f13841a2982ea494a8354d27827790d5589d111516ae393bd6087192577c8d57dc9969cb9825debdfdb12fe70b5134ea01b85b7f14ac0bdacc11adfefd5baa661de989898fc06e6592c00e29700e0b32ed9bde950fc166dda832ad7ba4331239a281e25a61337fd5feb61900e036470920aca9e2d67c2aad8cf4727f4e613dd3f02c7f802c19318df719d543fe6d3517ac181a6a347b4ebb2f9507367149ff3895d96740aedadbdbd2f44066c564a8036f731457f571b4c0fc706b476c29b772ab2aba1e8f62f9d43a716fc497b602f17cb4708555721f80ca5a46a001f17dde0fdb01c7b771e1f02d3cb73b833f601f8d5d108c43fc9479017dcf36f242a7c4ff8639b13585c9cff49e3d24fab2e47253d7f39cc9a57ad2546d5c53fc6f9516a2b14f1c31f832dee4196f1edc98d6402c949e3a1e7cee8bde2880bce3a582f209ff609c7f1e285ba2c60c6886b82d9b8558c6120451aeb7bc254adc7afa8ea87ac48a52f2b949173130f1eb32d208a10671872194d3cfd8d79fec66015f1ac3f384426c6396eb9eef3144e459c539b68e9fe79d8f0295c504e78d58a5e0377d513000b0d28dc92b67c765a906168544ce77bcdc3b5ccf06758c27c1641103c5b86f0f5483424d44cf614894a71e02801eb2fa757bbd5c0a661d40047c8752ad9087c3aa2e42ea5990d41a63efe3f40e15f44b2258e3adca0c7beb74b35873a70395eebb7b138ceef7e8c02f9e26536f1c4ee7234bf51034ce338f65c04fdc1c57f08f0a72a884b225e09833430f5d2565566edbf0f28f8d7a16097e31711f9859e7c9815c63f17e6f5e4c8b3ba1ffa74e64f602ce27fd408967b8d11264c8b0f283fbcaf3a4751981e45d2ede514808974f1599df6516e71ad2c8a0ede32a0350d1abdd6d238d537594124f384f6dc7bad8172ea026a376b5d4ce47b144f6b861249c80af9949c9807850ac769d6c7d57bb00960185c899fb79acd3dcd896756d5842fbd2937c437d3413d517f06d79df13d9d0a82a310577f76115cb7ce8f183a0488c29acfbb2270c5dbb873d63e651fc08a0a2ea50b9300430fa204f4d527c93bc13a78f8b181254304aec9919c15a1b27cf16e80fb954c301857b01e7f438effe7bd7d9f1d9b77dc9d3fe6ff58269d59e5df21f3bcf57f2cdbc4cc43bba61feaec9b6e5e360ecd3baec94f689ca7ff694bae5b1042127e91897e3842438bfb517b16cb48c9194b7d7785cd6354bc336d879323a2355751bf1d66eff21d7393752a040f2103d5635c1a8ae0c790ac8de30878b64ef22a5bbdc5fe652e9668de6c7744b258d21e2e7e9bcd199effd4858c2956fb182175e66c579809dc0b0abeac765d1b637818b6f4f32510c672220788b7a25b4e2bdd2e430f69d893881d4ca51d274e36514a3550436939f2a9c0bd90ec3c53fc63664a4c3038714a5ef0667cbf5b318b15ca28eca3c3c5cf206da3273f211cbf2e9f8dbf5bfc651ef5021145594a72cda05965ba0d5800692a8b220f104db55839af75c0ceaf16f4d499025f029762a8276271c3413a21ced80f784aed850c286ed166c69744c0bec04b0088202dd3f3cbe6a7ddab11bd9e4919eb08510d48d32638a3c97d01eccf7aff0d902d7935616a35392fd9ff1ff6c3d0b05bc362c63d466f0f087015abe01b838d07bb5ccda1a6c653a6d3d912098b8414c63a9bc263260a889259724a895f4623008181bee3bb060e97fb40e9a1c45f92876d28281e855352949800f2f41410638338aed668bff597401d05a4b7132d88b4494adea600b8e511fa8103bc62143fffc39ba50b69a32f1811fd4f05c3fb3f45e312e8aa374494acbdd5ebed202d3e5ad841e35568e081091c1ecca26a4fe73c74c644301117a3faf662b3dd8dd49055d05b1691958eef1a7cb3e95455d8712745743d274070b67654a0f242ba1e3c5b7d94333aeb1886256290e8b0383326fac8cf4d4f6855316046979c9c705c4f6d8f85dcae983952f8a5a37466220985a8db6c9c79c81308fb1603f8afa5f631d01bb6b1ed0910498fe369f44cfad48fa7338dbecfff4aacf5b4af05bb3ab2bd779c46c139175c39b00d03844580f37bbd0c3974170a42ff3a77781003b754ffcd2c21e82f7461f0522396e0d3592ed83ab75a7ddabd88ed66f08e5b48c6124963897a829c8792771e13b8ae9eb53f7d2d3b05188705678a5f4a432cb55a7674f5cf23d34994b377aea71cb9c5b570cdb2c60fd22103c79908875410eda70aa732f0b9f997feb18761c70c9362f0d8ba5294b580f534d3925f35b0e7d3d9a1250d7f05830894ef2e45d06db64355b1fe17b0a388429ad61e864c93b72a1ee94bb5c48c02941a578ef17a81c0c965375f333dce1d7af1b58a1899265dfd8d866268ed80ddb500f320475d38a06459d4879be976e8fda7f657846a8e822293dedb4e89a93c7a965e48e21b58df6d4f019480120112204db01082eadea8d3587279845f21e9fca1ff6ce0425adda94afe106f2b3089ef95e088eff329b3d69b1e68ae5c78836af78e2af38f7bf3cebbffc7ec138bb4cba69fb5fc3354438a394d721b5b2bb9218d98409ca79adeb7a8ad271abdc95e036a34de06410d5187e480ef7719a17902fdcc970e27903b58d10171efdb31067d98f72605021ca9ba6fe8316d59588e410edc4e21a5fd58687113823b94f49b6f8e67d06391640dde45ece52890794aeef96927d9c6f826c584b880d8b25c0702b888558a8896dbad6135035c70c2826bdce0f8aaee34beba7df23a229628c9487c9b814fbb34384bc14e0f9d1a8b25519c376017ea0522201a9002ec2f0ba8b1d98903c7ce8387106e0485fc0bf9a25dc0c3028ee35e65d53e7a0348892393e599761292b3b4589d231998ce01d7d70813711dd4e8543bdd9c631aa84d51462dd4c85dece81a6baf4791c0f0c74fd7673827b6e8068f4313b96f4006b7061fbd7e7bba679b3c6cf1a3984d9d318b2faeadc4db92dbda621a0f8fec3b8887fb4332ab5dc64aac7d0e9521cd3a3370c6867b3cc5846a21a1649a76734af2ba22a2852ce15b0ab53b6022d3f6f5c2c5d52f6d20299302e737ab6aa4f788b785c19fdf6284ab9bdec3d55ca22c9039e83a809b2cae9ca098013dbf489fc3b7e8a3fd68ad92a2a47ba26e478d49f9c55c0427a9e2bc970e8c80465b30ae794be41c338289ab6102a4d108059e03500fc88a65b5307f4efff528134fc3bf3ed0b3f6dda14faa9a5218e194d6d2beeef229795c8534313b9be8a29e56f3d0363cef8814a31a13b873615f56cc4c4ca0cca8013ea56a1632e52de396aa9dab565b15538221aeabdd3094e22f9554fb6d84e3e2d39fbefd30adc835b8d0b9b7b96ac0ae194b4e2612a466f1078bcc59e50bf17330882382284735daf404e55a5e710cb2f92e8e21269efacbfc9171798ed1a39ad5bc23a59613ede5be283750d64b3eb62cc2b49e8201a62a2a3f255668d4f75585913144c832becdccf64a1dba7494d94716e6f695e73185f0529457e7c967493cfa6fb365c50df115c33aef0eee52c07ffe50384a208a9662347cce083e28c48bd4ba36a9f185f4ef91a3bd85fbf97b6e1c96b10f9f59ce03468035899bd61f9753503a4d74105935ea8c2cbd206ddb97d5a1fc1f4d4558041f427a0c8219aef47a1e05109dceb79e3eccf4090d4520f599ed31346247c5aee8e09fcfdf8b4d84cbce98bf32def5a5c2c455c672ce30c1f31f2d3fdc21e5be3bd85555052d991f125e4509826ab9ff190ed51c7b959d636456f20111a569fa29075d44c58df552227a5bc2815abbca36f535b5ef380d14ac95826688542774e5b7bdd7f8675e6a0e4e9ba85368164a4f508023811c835df08c85fdf908c4f5f5c099ea6225c7a1380914a33c65c5287e392993afc3eab4a91baf82c4947ce631d09648998f534f2d2780d4f4e8b2464cdabdc7a5ad5995735a44b080ab6b82ddab0f4f36466665929a9ff34565ff06159becd0f696d7ac246c750e36d7a6f7854b9df58ca295dad97a2066af1ca4c706b341b8cd5d90c5c5dd3f85042707b66e47405c19ec9a37a7e9fce015207a761c932f11cc6aad441341f29dd6b6833d490d4c6437cd36947fabf40cf55ca5888498d774033adab5d92e766807896948cb1dd4029d3278370a24e8e28c8884117195254238d531f6ddf04d634f8239745707938c581eb95658582266563928be82482a1f22c86c4994a14c3c12a01d70d827703e090b0caabe13f34cee6e1bf6ce3747ed3835589e7b1a0e4d0207e3bf03baee1a4f88b1cd9b9f229ba0f47be70e85258a6759d36da31e27c1f017480295217f2a5f6af7b026246696c99a7f8bf49122ceaed3c258514ee00fba085f6a2bee10d69f2574c27be352b5389b1f7e1232c055d8fc5ecba40e36785dba784f59696f39dfaeb18fe6e738f2896b3849a3122cf36292fb9ffa108ee0a140b0a5ed177c06939de4ef1db3b6708707d16b094ef7ec3059a454d8d443da37d1ab0fee2bf4c0cd2c31cc6a667840df26d690dc65c78e14d956605ba29beef803b87e2bd550e101b0706cacf77832b56674d5bc429d5b9fea85a919e12f74d64ab2851f54821b9f84789b187dafcd813a4d73f9bb7a869ae048d031eacb48bee13485b910d88268bf068d753ed9b9bf62d2d2bbe9229186e82b3a24a3aa10cdf4045484ba4fd0b0c96119535c5835fbe17d821fa3e76e016d5a67755f9cf9d98010b50c95ebda505f2754c3ee2d7b38bc398dfa81e9d4b0dbb3a38c0cf2659db4ac786a216fabb604639ca7833e7d39011c742a12c7dee8cc14a3faf8b43d2a29a69c6bc3e1eeba9ac3469e4dc672b360dab155c84db6df08ef16b263f2ef264bc56092583431252e1bcd0c7e4b8b689535d6cfebadd0eb04998ab505d93e3c2713d4f74ba7fa12f429b674c3f3fd2b11369df79667840c09d0c53259edb1b9e99ed7c9da418b9ce3346b03b80d8d5ed68d36745c12339eb03bfa0f9f47581dcc67393091525429b08842a16d53c57211e606cfc9d2c64923932bb2560885f8ed8149b09ffc2837ac7f654ea49ea2a03fc457fa3c98e78cb4113763aa6cf85a6559f4842269fa96b19026a33e0a93f7fc4f42405eaae74f2f9b3de7582af42db3ad747c5ee6a72b28e36ad50bdb5ce98d2f9043b6e42de9954e15c8f4f1686ee2652273b9ec7527b800e4b2279dc242d4c653b7b8934d6bad3cb56fedfe5ff560f2328160d4ea4f30704026f3974125939392d595cc7624476ae9f66ee1997cf0d3e395e67d5baa43af7dbf596bb3380341314081a3d82a0726006ccc1f4c5ab85f70585d7eb402f2a13535776807fde8cec59141882cb347633c198cd31e6a60664c4e749f18443fcfcdbedd0e52c4d1276440c47d8ab9dfba245bce3681f83f552db95d4e9e95883d007032b2638ac1cc972e6a796f4852c5f3b69b7eaa6ebb26ca62b54bb181533fd6ee5ad331cdb711227589ad63b43254284f79fe478acdef813cd26b0f86b3b093325f2412e1bf68589c401080d833fb97113e741d0e427dda0af9721742e2ee89badd512d9effdb9cf8bbccc1db77103974f07ac4512ff07e39473de93d8593be55cdf78c88fc91575aca8e387dd5c46f152ea3fd14ca040e65e1d7e48e74716ec3a4df6ea7604b5dba0eabf15017cf221eb846a7e9545953906e3d868f366017f08f76d53dbdc550363c6ac6f57e19cb34d19acaa6e8adf510967a1ecfcfc00bfa2667a78103d3be1fccef7d0a61a66ebe4294c7563633f99eb50c38c4dee1f1fb9558e67478e072efbc257a454a716cb1fb7bb1b9905c2c55a9ce7e0f0110fd853793a1c8082feed4e65462e3b9e49eec511e0da82171b0baec5ec8073600c5abec0d3e1d482a71f73c42cfafa8f1dd0d63fa3ed483dc1b8a87698eee95e6b9323dbdb1f2bbde05f48d0d9c7e4e596e30da07422f458b3cdb8827b41d9c9d3089bd1cf1e9dcfa429c6dd5c2f8fe5f20d151761a73267e07ae3df15aa6ec951b0f65d69db94139fb9c76ac6ca00db0893dc880b8fe81e8e1f900787f90596aa97dd72acdcb00ef67438046e38096398c53349fb95a6919efac8d03d14c41b183205d5568cf86f7e36ad2ae17ebdd3abe6ddb00ab775047d3cc8807c21cff016025ff9f145ea3b2352e975cddd8bae00f08a0c123ec9cf2f31ac75f45d30ffcf9b5d65d7e7e338ff5f400e80b71ba45eda3f60be08d71c484c8268b26ebeef92ffb3baeccbbdbe0355bd5fab1220f29c08eaa40c96a8aeb53fcdf4ac84585dc372e95eb1e6060ab8c6730b4ec04d05690966679167e79862304a8fb717f4d05432a9ab6082f7d35e8646cdb3eb69a31bba7868870b7871ed44826d4fe400f1c5c43537f80173a49a1088f8abdbf171f16e41368d3dfbb8c7b1cce0a85232440e33dbae5f61fd7ddd17ebaafef2e5e06617880c0054e000b2030fbb5ba4a02073aca13eab276c1e874c376e2a2b76dc7d4923d6905b65245297165d41a55e95c30e623c0b2d8815b5c9986bcd801706f6b9261fa9b0d26c1ccdb8e283639600a9d283cc8e4bbc4b9564ef7df332bc4f9905797a26e05e5cd7af38fd655260c32ff83a26ef1746433d23dc61259ec835af1322767f06703f2e6548d858321e4ac4939f8c2c77bba97c91677b3607b231d0c774fcaeb9394dfdf96c9a899341421c90f4e14758c8a9a048d125aff20669fed7b0d474bd44caf74b52a336a671c493db06c7c92a8c1f379fbe2a8382bfac44d244fec0e84cc0d61a7c30798093b78c538158017f884aa3347092aa17ea04a0e3151fc40fa48543b01e00b85d8a71f6aefba7a299a49827fbe147f9ade3a0f052cec21a0b5de196599f4fda1f050e6633fbf267be3c63d997e12c00f9c84e322d22c6b94a226a31dff4823267a748cc81eb9ed25589685e524f629c5c69ea8a3fde99e60f68bc92739b5c6e76c6dc1adb3bbd7ecab4897e753241a8098f1c2b97dba8bdb0adca96f9ea5e608509c4d44dfcb60eb73f40254aa577c1bcec7eb270f9d07b4e5dde04b9cfb41df49120dac2efeddf431725c44bcabc887a98bc5d5bfb7e873e442bb1dee089a00b955970bcec608d2851637fa5d0c11c88b5727c11fd2becd04cbd493c666b77eef24949390b5df72ce0fadc30eccd3027f67a2363fecbd4285becabbba57688e361fc1822ab6d1046d67ec5c44ee785a1eeac309296fcfe39b33c275e7e502372bea67d7e4b8899a573198e0194ff835b19bdfc91ed42687dff87fcce6997338d735b1c019194e72f9efc8aa4a2141f45371790d2a6a4c9b5b9dfddd693f556cf28ebf758ea235268d712fd9a9f1ee0e7efbc51f7ea49e15ff3cc3a138c00ddd0559e6c9d93f649937516b4d630667a2fdc345c1bb1c1d218e5bb96f924271bfc2c359e6089f136c68330eec2d46c3afdea2ef18aaf9c35f5b12281635f88c8a6ba24b62dba60682027f826b3117365b3ac7b37da680a707a9f955f98fa417fdb1589e36a471c4b7c7f66f9cf73a619885618466a4db06782bacf095a564ee030959ea4a0c4e18f861e0a61c657c2afa8ee3a97b98e67bcca8bff16d76769cfddc16d37d163f74691e65e79b790ba4d3624cd1f3afa601b50cd72a52067077d31a24145638b9269ffae4ff9564d2388d3f63f917a95d3407850b3cc464737060a4bc6bd79937ce2498fc21a0f56963bcc95b34e578621b9246604a6eab683367bde78ecb4edb56aff1e3f11b71cc3d5bc75279babf9bf726c96ee469eb290793d075066e2142fe4d03c09f9e4da606077404f91b0382baebe1513a7c9e78fbdc9fe4d53bdd50ba2e3d8e2ad7039e61d23928247b29ed788c7fbbbf2748197c4dd173c5576c6443d630ba44f702429924ff2751666fe2d34e266eb3234fe3e9714c66aa2bfc16cd54bf02b827a6f16e41a67bb87c8a87ffe9233faaf8c79274eb1ba74fe85fbeb8c2619975e415e60df508bfe7e8c8f4cc26e34f0367aa1070505f414fd9897f828378f7993f380e0f7b2d672dd2fc5df4cf200607f63d5a4b0caf05a001a9932a53b00a8370802fa03830a95e4ce2578f304746103c5d9b605f0d6bc60793165b214dc65e507c31dee160af1f207ca541d98cc67776368152f50ca6fb84ab326283d00f220a93e7c931e615feff41bdc56f73a73be4ee12531407f25887fbe693b0a4b6aab279ee25858e139838c1ab0404cd9407597d45c833aefaa2771760946c16f1e3879a9b4f29dd8c95d8e713f11a3a49406bbd7d6d828e0bfc98bd62cf1d1bf8e36c4725fe19941dc9937e89e32f0cdba3b8946c7da54063260ed9df879c827c92a529796c412ab0c889999c50729d28f042e0112978e7811e2a5c42fffec9c68668d577d89fb78229fdd5d97238cb33259b33c700f8ca52a25209ec3e10c742618e219105eb9bb6735cf6f1fddbab1bfd0c8b05c6e9484ce5599a819779a6b81c386730a87e39ff12023df3427bb02522f80456bb8e2c7bb6d948b8810d8a80acba3a34ccfeff4e31bd1c2671b0e555abbe6b498deb0a0d7d07ea096fef8ce84e4986eb8b7004141642c85faae28193616c2fe7b76b9de48db86600b8981c5f6ef747df083382c2f47aef577cb4346547b7f43ac0f41a7372332f2f3234289daea64c95c769769895c7340c38596cc9f5e31bdb5526d9bb24917b5ce6d354c4186632a9d6299e0c8618b5a2fe36eec5e37f2801fd6d84e7ca462385a1ac58f486fc1c9d1832ebbbadc41a3fd0f82503eccf798388548c348210cf69f4dabcb6f3e70c332acdf7a5b54a022e98a81fadca535bc7440f4a6e2aa361d68e3cfc733f679cfb2120f07f63cdadf67f5bf748a71d19d664e555f76a3c7e4614c97555f232439625ab73c0d8feab4f534fa91354acc90dccfa886b3e71e3454a0ad183c0a486c219122dad0c7488d17c88f88f53d65ceab9834eaf8166a982539b69b8bb82bf0c3b30e9a2e61ca91202752277e207319a35691a4f347bf1d6fc56190a3e43cb59e447c41e2aaa2054d3fffcff323a42789e3f6218a4c4162bd1e574121b69294acb375c5da3b70b8b010bd8a629ae64054ed83d63802813bc8af9782146efca9565d7d32ef466cce972964afc1b6e1190708292ed48ba12085844f6b3a9d5a31b0b2641271378b5e5d216568db0e19c735932d15ddf7ec63e91a59de4e3797dcc628ddbbffa20af29563e64e78313e4f2656c6f57ac414730df464ff451e603e5bd2d2b8bc6ba62eb3b2e1e710f20faf2a0c232f4f4c2053dafdb14bd6e4fac6b212e81d23f510a4755e8dab7e8f543303a1494be1ed505b366f28eb0a93c476f02605e0ca082c928a91057112c11d02a602c7a37623cbd4d599da03434f1884fba8701b9323c642f0dcf983e39b5f682e014eca3ab06d1734aeb415a714dca15188dd88b473b5b06c985cc481f4e96ffc4d54f1774d75ffa9a7d58fa7bc53d5bc7fc4e465a9d8e105900ad074a46ad711521a3d4d5bf278acea9a887ef789d962b17d91dc082783d0314f67e4952dc5e0cd507af0d98cc92ad91f6e2d1b14b395c70f22494713ae3cb38ed9e6028e859bb379fddde512295d8220cd7d16968dc3d7db1e81f6575a7a63988839cca6ad3857f1198b2054c4a775f756d2c3fd60b922ab2b34fd3065cb487ca5b0f19a0ec198a45fb2b4b9efaf8dc82a260a741c148f22acb2aa7b6ef0909eed5f7292bdba20195ed81014e2582511b88c7c30b7a0334216555d712149fa73c7cf034a6363c3fe1e18687ccc22fa64160ea2165933a4a7a09033a2a4f71945ac18e70aa68be25493f37e19d9e2adbda64a9b3db6314c47461ef63c69d024d5d1c9bf5ed32a350ef6787b722bd483e131a1eee097f49508e45fc519b2c0780bc95f0caab77379de21097aeab9e2cfc5720f47fca642370e17de94b0830632b1ad3a28c98c76776a019d3708d0a6cf276777330385716cc014e04894fdf4c0b52cee7d30bda21a1dd22d4756847447b57975ad120205f30ccc1900a5a0b9b439e46428b168c2c05350ee1c4061e7c4de9284aaca9b0e2ad5f19fa3314c26ee93a79b560a91645ed7a6774a2af802865dcd6eb6ed4621f96ede841c6434803764c3bcd27cbf92ff7ea5b76d77a40246c274cd83f37d7f3ed70481a387e1fd6deb790004dea14dcb062f3f5975943ea801e12887f364a76a8a0ece689b2c1d589ad60fbf6b1e3105bcf3b111cbfa39f6b01af73e4cc51f2162631e79202452c805423938ff5c1685e26ba5e0882f6d9e1eff0c465a5f571f3a181a20dcaacb49078dfdb9bc9aaf63d25d46c9cc683c352e40d1e19a929bccdc4a6b5125d2a7929477d57756cbdc1e9a3e72655b5029aede61c395a29f566ee33bbe66b0217b04c2597e4cd0218b436abbbe6d024238d08e4cecda778d6e3e50a5754689d3bb4aa8668f1bfa0a101dcec9edbeb730c6dbc1e83264ab96b6ee75f7ca748c876f72e3bb75f053c879497bde09092dd653237a79515b4d856563482a13e969ccc9d37a8627d7227fa78a7f8a17939bf92574aede9e7658a80dae2439228f95b2e3e2d26e29583da6b80d3cdd3d23f025729a2322dcea557d531583ba9112dc0e061bda12a9dc07b420d6f7d9ed44e0f2eb8eef8fe34a96180e4ff7a3d51a365a2cdf8add5a7569f0e01a2398c1413d3bce43134b0a43db1dc09133ca6b7b4813b7bbe553aee80265f375a0e8b0219bc710255e9c52199b9de6547aa4da874aea2d5ed1552e3cd13102ec625861fd9c0d25c9b7908440c582613b4a061d8b19611b0b25eb7f1623a2584ee9f5a64fb9165047756f7edfdefb841b41844546f918e694e2c46b278f30801e370da56434239909ede42d6f5b61276759949c9f9ba347ac972de480de83d49d55b2c10749f41da528f1750508b263a956a5d3d3b35417881bd9044a97dbca8c956d3719e38f34a9767082a2eb3a299381ee90cb65485f76c76848bf3f47ba156fb9f9f2f0c869f163b54f84583fc84e74c1df5f0e5c708afaf324d24dc20ab3f8d0516f30df92f869c4a4100e318abba7540d5ca3bac2424cca56c053f0a5837810712f9462fa8ae765a5139f4005d0b460f318aabff72a651fd6b4700946804265eac12461b7703386c04fc3e4904925df87d8d7e35e9bebd192d8fc1c04854d81f9b94d4c3d2196e4498f85067fb1f97fe7030262991fbefd912909e6041cb7def18c7e8ae85aece40418ccee42cb1f1843327d60f1ff419316584a2a67771480e89334cbd1a6b33fafe419f10d55dc34c597003f2ba75043be6a725f83aed41ca91c8d709fe780145f4201a76a54bda0cbd22030350e89a3116da16a6a6ea7b763eee767206d057dd10216c39bc1a51dba4d007b23dbf2cd6325c8ad3aa82d6cae6a5287806447dc143273f500998b85400cc27b350c27c262e0e38f0a50033e5e4a9cc95587d6098fb1d2bcc104df3f1f5e8989c8dae1a48540532045e742987591e2bad48df05036d30f35ef3aee01c10d983dbeaa944ce5f3406a141ed59d5fcb1561397129c48323a965dcabd89127ee444b01ecc83aef5a2466dd2fdc4b59a5ca3abe50477f42bd881bb9abef562a7761f9eab54c04f6af33eeef4bf240d158b0488c4c19376ddad59c4c01e8d59bb022824539e7a00c67a8ebc97a3aa9f582c3ddfede0fb47db07f297a6340f0a8e9651bf416fd3ccabfc12f69ffa81ab0cb04817cb566ea7c6f2e98109d278cc6552492bbc8b6aa67b885e9f38694f970f7504cc35091f20a97ec324b8e912aa3af3d03701c0137826aac74c548dd55a05c75323a0f950efd6d29717d2ee7414725c5da0660791248fee222cd0b0c02dfb61597e0ee9e51b809586e01c1390c60564554f1b9d0f1ac86a74fa59834d0ccbf386a0cc6cf644fd97b4e795990e53a5cca75f7a86dff1ef33b8deb8be9290a7da49805921d3ad50db89d1a7b3ad1c7ae03e2ce9642f69993c144cd8e5965c9ada5c5360098dcb008d84bfb33e10002b73616e34cfc076ec826d8cc02879b42f6fc94e501723797dbb816627ad5c48f7e352794feda0cf77fc1c65e4dd6e4010efa061c09d56e7ed6e8e114676b50a14abbad14cf2a664127b9199d42c543e5ef4692b9ff5821da9f9b6891bc74880d07a0953d504ea3b5d27fcf6d062d1ecd58f495a60458a4061ee440dfb8713b34cb5065eb18392851c69c52420a5b0615ec80c0ad1e54b7297504273aae6a4c434b2b83ebca82f80870862959315e11292a5a8414c99d6b1bdbc7ae66ac0468a39ac90342357159307b1580b2883b6ff98b4e0caf6f8816f94e94a0390493629de113ee80cc56670866aba0ff70c43057b0921eaaa3a313cd090d8862b60ac688c16f2731051c1844eaa168335b6e884fbe093f1ddc0c707b714d750aa4909a91523a8cd9504a2e3a20c0bbffb753ba4212cbd3c3e0e0ebdb6a6be818a149e114c5fbaa9831ed830d80196a00c4be9ab8d4e2f3c75266288936cfd0b27fe1adfcf500f4d2cd736165e80b765598297a57f28ae75e54480c96d3b4a39206f9f900f993909c28697b553601a150d33fd921d36425483618e00d07b953ca7a5eec7b9e0cbf187b6be811a159d0d30bf94e3e03f209d3066dabc90a71c92ab37bf6c8b1726ebf32adaa58b8a9ec1ae9d3b0d5df3a504f2df55f72c2c4c7d24405b55f81430a339b74e40e4ba5adb599ac60b1934a785ddd2b7a8140896571ad23c2038464c8f087d4d3c81902a14b282695f3027ca72add8388c5d21b8257243d666eee44ddb1b36afb76c05361bbba9087ec58f3a9f5a993fe467d2b8fd674a66cf05264c09a52ed99342145c9615b3b6e2eb85a6e2ef96fbff37f0286fe2189325627e8d9338f4805d089edf52626d7be864964406fbd39ac2ba5e3125592a7a338d4a5808e9b3961de474701222ed554ad18bea31b4286b9d2f2f2a19e34f0f71ce6136cfa5849f05032660014660e830cd012dc1445ffe19ff4c158de1216496446ded1793c296578baebe6c4d2e07faf117cb0a52250589914f2da356311186b53bb6bc2a36f2e43cdbec8114489f9e1e128f0eaeed7b59a531fd45e91f423b7a26e3960ce64cdff14e48898f806366b1ffb6a00468e6095034103464d86b589ff2bca59d92467f245fdfc69b034df08ef5f56445abd9f50cbdc19e80f0e55c6dcfc6d19ac5bb598e5183ec69d7767f5666599eb295c1ac3bdf2e735d86f094955746592928aad4b2ef59cf815107248a3cb00d62141aaae8f9c3a84322e25f1802030ad5114f6b4c7f20ae4d70e1ca57b2725e2ea060e5a49fca82bad1a209e6508bbfe56607cd1ea35ceba58d02c45c036ab4ae8e5710400b398d01e149323e741ce94282775c1cbe664cd0cf78bc3d3e3038041707c220e96dc40f08e2196ce00e3a9c734bb965461c169cfc91795d7063c9ad56944c24484b530c129166c027bda4edbdf7de7b4b29a59401be0976083808ac9353cd9e9740ed11037f37087ed23e38a1f688859f341d4faa3d62e2ef1663e2276d76729eb1573e727cdea8f6b0f7d159a07a778e3c69201557b7b97570cbac0320ffb02ecb3f9975200bde9083fcf31d1dd6330e1c30182c76e3062c0683e1c071a29a33396e1c7ae7ac4c26dd9df31da24a61e10db7cf5d2e3dabcc759ac970bb7c5cb7d9e7f52a16b9ceba158b62076db893797ec5a29d83532c729da8c6ec9c7356ba52d9f890509c89e26c0bc5ccfa4c0c75e48c0306c3913fc5a29c43aa830bc3ccba8ed0d20c7e9073ce3860301c19fc3399e40330b3fe41fef9160efe65d669fe60b00ff67ddf7798e5e0cbac73907f7e7078457b9bb778f0d3e79c33ec200c070c8623e74c2679107a99750fb2d65cb805688bec9e58c4fd070cc5a22d003828166dffb1c71d2091615907aa1067d63bc0f63f99836fc9b1bacdb1caace7c85ae726a918ece02a1c6b0f1c27ed66c57cceb3a393734a4feb653528ca681f168002a954e32880cdadb3f278904e4ac18f7aad95ea8626996c1bda27cf99e78c757bbef29c2e9d3d653cf94746ea107aed613faeb85015ce5d69f5e34f0d975e6350e0ac330093a513b0b4e795bccc4f9a5417327016c648bffa9cb3e452250a971780a85d239aea140e58a26d57e2eec46927416c192597a62d658ce145470f863e51b1b0ac3d4b2c2eb858cec04e9b0cdc0e9d6a082f54e28b022c431688aa3d4b1cc850b5b09a325e61853eb488c81197d031b353f278d153e61003570e3678814eb0a8180d3e586cf070830b8e4d887360f297847e224727c50f7705076b3ad8ba0000f8464606101a1ee810e703271d51661b0c415c0d3bbe1c84b804a0fb22002ecc00c6f0d89e00c14c8f2a7c64f183734300170c6d6200c16414603bc30059d608c1298814224e866d032dcb01b61f10e079293242842d09214c8c5066081509e0b020c28502362f16805fc0806d8c226518d9c106475c20817bd28028231a1cb0617980c743095d906c4440e00813c444800909909980190aa0a9c01516d0e2026d30f045065ea0013cc606c8e0001a1de021ce094e1e8842c2705443920d870ff48002e60202292525588204d298149e4832130215a8508a60e362052f580869ee61043d8841821ed4e8818cae5645ca55f2a20564e28416319b3e5c4ac3e446dcb3d402a7052d3770e173d2c483a1e9b3c1c9d3f224e5c40828259e744f4091224a29650553c0a062c60b3eac11e504860f86186e90c1d352456a06303424514315ae89ce4a1457bc2a6cd8e2062fb0747b963f8081c30f64e4f0031a3a401967a9c5cd9ee50f37e8b2dc273b6c5378d8828593a187eb458b962a5f36a53ed8227eb8466ca94870b967800869a64fc6596e11b3c970d72d68367d1844b9e58a2e21cd5bd4d02e34080a04e542b7d01fa80f540bed81f24077a059a80e34078a03c5426fa036d02bd40aad81d24067a055a80c34060a038da22f502a740a9542a35028f40985a24ee81375a24db4097581b64099969828d5483002165610810a21484a0169891210a0f0812447a4074ee8000736a0810c60e00216a800052620810898000124253cc001460d20e18891220c588002882460c80842442842c001689b284808062800902102fcf0d103041e03104000847604cd747ce001908c7ae1e1059c75f686da4a3fc51e33d35d457a2a7a818728b168993f188b0ba071e88efa5b430a640b412eecb20a75c80debcc8bf16e3224aa219e43ddab8cdcce11118990606fc799c443ee3eda6e0f762156a1ee6e88bdd4aa30d64becee463bd61280d4623dafee7acc5927903a91e81eaaefe69c75d634f0efbd07f1ad9a5cdad75e9188266dfd148be6d0b5b4d2004e2a83fd5662a9b2377c70ac3db66bbf7dd364bd1e527f74496ae935d3e6c7062a6e6c90e2829b2b6b5ca141b7512d464bc616639581b5026705576220b45d79c10ee32fe3eaf1c5f89663b86779858b2cae5841668a1d5dae33ee4721acd4cba8ac041ab88ce5952c54289c999a2b51b212ae4071569e5869e25aa8426f996ddb368ee3b819a2700933581967e08267909a82c50c59f00c3e34c1a2099e5d51420d6f3a2c35c0296ba001951916698466694a19d29431b86056451a5f182a2aba1b64f8029732bc6046c5ce9e659518ca2a4d68b629a680e14dd40da228226c6226862e3786219a988941871007331886336270010733314811c312294881d099281bb80045d40c9e405146a9894243e687bc67f608c65946899965d4112fa0a1d2c5940b9a28f1829b5bbef0c54c89d59e651497282d4d4b44e5f0b4448e3dcb176cb0c73dcb17c0a863c488f91123342ba2a4c2460b9b4549c58a8dca1927a0d4134ebe259c7861ba22382fdb0f984a96a74bc586272a559ea85079a2d2c2940e0d318a31a24c61c113a9295c40494db1028a14b76739e54c9d22834ba3a9062e70cad2a40627dc7456baf8c270b20418181833c41a6160d0c50c42d4104319058fb809d700d54df9d24319a58c32ca9319988e8627700aa6e012b426103540e9f095529e3c990921658d2dee594ea161fb01bc1dbdb7c746ea78fa88fb778bf591fd7634bf4ca4de9b9b7ea9a3f489d9974a67523321b66a032f332f5e84bc04f113a5890da0b0186f9cbc3650d438e902a58aa72e50cc38e952425162df3d4b284868f9d12234fb014a540950ac64114b285252663ef4f024ea095409e504ca05a129a2c062b6eb02ca666bc289a7c56dc249699b70c255819b70e2546736a431830e0a0264bc18a18316694c896206275f6ca5131840cd6ed061fcf62c9d14b1c96719597b964e76d8e438db611cf72c9dc0d093c6c66620b15a40fdbcaec92c90fdb474d746210b641f8b19e14ec2a43560d2b8739ac802d96fd6dace02cd1891796d2fa5df178469f12908f668fede7655f6c5fd7473e380f6a5145cf66bcfd2ccd49c7a0b1313a918fd3c08f3415f8c731fdd237a3c841eeb9008fdd535b479fbbcdeb269265228cc4b5da1d8fcdcb121b7f4a1ae22117a1bda9c635b6246dbe79ea209760d18555aa06d5a69b440f3320b546f81de8c732bb92cd06c02aa8fc58c6c2761d236dd8049dbbee96981e683da4c9a1bdce68ad0951fa1d1f5cbf0b57736c30c66348c76cff22906fff9f62c9f58507d289fb4944e47ccaadcfb11cc0ed33483a17c9262877b964f4ccc62289fc438cd6098c9308bfa89aa325b69207419bef85219b93d4ba72f9bfc65253871f9716ab2f19e65d31a9bbcd0396e0665e4b8321568a229a149cd78abbce9a87432b8b965d3174db328a3d093262eb4000b16512e3811830b61a4b890830d38f62c5b88b3557b962dc8c00550dc38712a5b58d33473ead9b36ce189eded59b6204605b3a69f0a52f108f7edf786650b58c0883922617ba76bdd9ca25d1dadeb1ed3bad7365a775288a375277f4cd188a3795bb6dbbc853b087ebab644fbdee51aed4e8d7cba0947eb6a4e4b340e09f77a63f2aa71c47326db66d26efc4ae90de396b137af88771dee1b99549f54ad97c9ba79e0ec8d966ec62ca60a764ece324a28c7594c0fd2a9a9da23e73c94a3534aee47b0d336932fede9efdc3724d6078d7a3da6c91e982647f1ae1ead8647df05e05b4d0ec1c7b714883dd59eb524ec1bf73a1ed9f37c251609373ee5a2c6bf34d9b3d2a2ee71e9284bef82e915be4a14427fe469f122c523eef44bdbbb7af48ada8b21ceb2c1106fa1b5cff67787d9de7e3c6108c1675d27733959759ab7d71efb23aac7bb73a86bbd63fd870d7f58efc7eed9e48fa8f0944671e948a1ed79da1bb577f26e6f0c0a8414dab85672bae101c27888814f4feb022e3dbe97c9a4290b747b7ac6118ef72d098f1d9e4cc2638f5f9d14da5c7832a9b2b26bcee83b5148f8a35193747b07cf8945c21dbe262d816ebd3cb6f79516f51d8302093599c2d2f60e7e78db1d0b1b1f9cb4623c04dc9cbe63d01d9b5e72d17341c20b12511b5c81734271c76f1229081e6311c4182b31d97e1f625dfb8e7f2f88cfc4fbbde045503f714a4cbe5fcdf43d7ca89b9eb8dfc7eca1ba8334226bb311fc2f7bb9c9aac39f342e370942c3bf796efa096b16ee2d65f2d11a46100e73da16f62ca90ebfa1b3377416c71c42c281e3c61c42ba71c3c61c42b261c3670e21f9f8c4e610522c069b434830d86b0e21bd5eae39abef9943483d3d3c73088967ce26d2ce8ece1c42d299b339849493d39a4348ad166b0e21b190c639ab5fcd21a4d54a358790542a710e218962388790c2212410fce610d2f7797308c9f3ba39abdfcecd21248edbe610d2b6e1398484e76c22dd399b48d6d6398454e7acbeced91c42a273ceeab7d85b3d972c135a2f1990f6501adbb40c23a53c224b50963065182c5041584a1388d977cff2082c6ae89a103b6dca54bb9174ed490b9f73257c235a6dfb146b58d76ad3027137028fb7df1b8ddffe4d7d17f5953252bde36e24fe1ee37f376a1d1ffcb273f0463adf3e6a1ae57d3c4b8fbab675bac6b9f97eefc11b71bf1775cd5e4aa5299a9a94d178d55bbac6b4bdf51d4dbfe0e7e85a4bd754ba268affde690bd4a48cba83e7748dbbea2c4db35820fb51ff7ea56baa4fd76a9f91dab4405246dd435d0375add3a3127b0bc46481acb54016ce54944bc8cd97f11d1a8e66d9e074a3cb0da74734347c995a4bb4764d5c3f46a130b2ae9b6166ad79c86d7aa2d56eba6bb69bc8d24cf72b3709427b95814dc50e956fc38656a25fda75b777b0c87b2b9374b7be4cae003ba973925a391232b7f7bbc57b393956ef02e77e8864f4c76ea4e32f5d938addc675bc6643d79ad0383429fc987efdfb0d55dfe1519de7b121aa87573d3c19d3aebb32a94335c904c9e8f51b37fa5f52484636fefaf5d44a2f5d7bdd86a66a5e474b82ec7c09dd54c78680e739781eddfaf89dbc84b28680d7d1b24dc5a2159c39be79e99abd05b24216c88e87d16c82a6af9b60e33cda8c9306804f1accd69e4e833df65786caf1d89b6c5091083d08c66207ab88a4c9462cf69812130e0efb8d14f05eda266042f2d2359fbf0ecbb5251aec20169134bdcea483c360afacc4c4e730cde4f31bbfa19b9e72fcf598911c87fa39ec93168bdd464c3fe5386c72f0bbab26b98b26e8e72cd1a658046faa49d53d4d2f8e5a05bb49d93eaa43b62dfe836cc402d97b909158207ba06c010b642fcb2758207b00acb0c90e72931507fa29c7f57f72932034a51c9a05ad270dcc643da23ac96eee5527596ac58a15fa653fe5c75eb7b0db5328ebe3c6ed6fafcae48d5cbbf1a77c92aad9b406fb537eedf5a77c1baf0cf5bacf6119ea751bbf91a15e875dcc47cf50af4f0bf43c693e36b2a7c9240bd32a6c9bfe95a5ae5e1264537dd47d4e6daac6fa88b9b946d0a8b0ed7ab049109acf6d1c6bf0b0dff807e5a39570fce1b43e9e9a04a1e1b88f37e79c739ae08c09ae6cf086b73e9458a0d1fed833688791a46194582ce46e4f937649907dfd84e3361e821aa9eefa271c879df44e52355b3fe1f8eb9f263d9d6477d52a6cbbd35b7068166e5c93dde8d22a6ce44403b393898d87607da48fb6c07eb7bc8ef1abbe2ad3066f9e531b9659989985d7412a1a79e94e24616a4fb1c8c84b57a65d7596782a2c0a905ee602b3eb7dd4d8f53f3a8ed8f561ddc048bab6cb045e76bd8fcc882abb5ec79d4dc0596957e3f515895dbf6202d273f182a67a7963a5a0ae141a2c55c6568513d309f1c6abf20d21a682437c117e613262d75fcca22ab3fa0267acc222224ccb4d0e1167e858d929228c104f11687a8a28c38505cccb8912c08ad8f58f95e04c47c4aebf4f09c2a835f4e9421b3f6a0f72b442c75a6537ca6c602465bb04f366d7eba8a51729bbe6791e26b8d689ea14774e547b6253f43951c5b1e553b1e8a7a27ef7916635f9b32b185234c1449b4cfbf5a0a89174fdbcdee6f8eb53467afb23fbf0a7f6f8d1640e9d446853fd7ad594295f8b5a8d4d93aaacca6ed8c011e28073239f60238c18cce7f3d1590255460fcb6ebcfdfa2b1bf5f0b83a179a9e3c02cf199d9c1d6e47ebe49ccc1a5b5b4b68e4a1125778a563d31f51067ee10d35fd7c3aceb3455e38e293f786db8eb3cb41555e8461776b10942028425a64e0ac207532762fb08b19651735e6ec83336fc410420f82b5522b82dd5593b2a2dae96b6fc539a76d0a620d4ae9bd58b62ad65a8bf1ec02a68b178a8f29bddd5c24e8e244e57400679d73d24fd102f1660d1067765dc2da0fcc998228c38c2f3679d7ec3341a02008306a04a125082c4148d9358816bc33d000c128206e00820b07486a054a0a65a24db5246befbdae15949cc0711cd759dbdd7bb9241aa8b2eedafbce765df729165924dd08f75a6befbd5cc6c70aa8b28a801f171299cc474703fbfa24f1193b34ac74a3eb32a11f96c88e60c422b11a489254abb4494a558d098261245dbbf688e1df8df127ad8393e3f6bb37009cf4d931ee7773dc274d567bc4badfdd019de4b163deeff6bc4f9a071fa1f6887dbffbfb3e691c042a9fd5b1988f5c958d7cf46bf57195c4354e98365a693289cbba88f6bc975e3af2d49c12a441900983cc1764d69464d4b852261921c818b15d5546a689edaa32b1c85a7b2f1932656243ec26992ccdaff1043ece4beea990797baa91867c46363ed212da66e38b30db10d96a4fd28d978cd9b0bda4c3be22cc36334c2e3d41c6cbd681e76da6db6791abc95a4c84f94d54afb8648526175a60fad1bcd54b6a9bb47bda1e829c18a3904481c1519b4e61242b6c1c45a144d1a8bb46a98413a5182e3c6e18bbde314a3258ca27a22e1c7a4b409b435caaf0eb36a702d44981602057870c757e18bd93a110581098f1de2704a8d36a08f5aeeff8e0b66d0fa8174f42bda897b6973fef987ba7667b79d6183cc1b4b977f4c87e567104a23d750a74177520f8caf6ae6c9f936fde41b3b9c788dc73bf9af41e3b5704e3e9ba91bcf79c80b3b95b27dcecf017f69b7b6ef34a2ce285178570dfb99777deca4721197e7c4e0cf6b95d1deb5d8ec1fefa3c7830c788848f3d7c4cc7605a84a5adf31891d7592cfbed3ef73cefafac7357d6794f2655f7ce938f5a9fdc773419de7b8efef169e523eff9cb3fc2107bfa7b9753a0db1efcee0782ffe07c48df93b60dbaf9bc10b87692eb66701ba3c3fb262ea03b772b825095ddcfa9ee0a38c1dfed6e9be5acb55673f4cecae3c7be97ead4dfe625d4356773da30f15d749b4353cabbb5dafbf42ac5f976d786f0dde25ff6203123f93d29f528f5b890e46e3f02026a8feef63aacb5a30b88917e7a5d9559fb201fc6b9ef9c33341c131a384ab0eec2a9156a0f4ad636f7a9497b255c469a5465f5e1deb24e95e12b49f2a1da5565415323793457034ea2f10b51982f15e3cd23d41e56d7eef3642b1079199520203c3d39d11059fb638739d4138dcb5569d78dae5fb68530bef435c90f5a65ceea83881875aaac5231922ed797129cf48571962880736febb69dfb100410cd213a87e8a6dc11d7e31289454b689ceb537be053fced604eeede7ab77db1f16344ba6fd779eb5b26bb93db5597ecbed3d444191b0c37b1a8f52e8ff7597d3b9d7346ce59158b6c45c0779a5c0a7f445184a5cdba4fed71bbdf1355f137c75acff9d4f94efe740e5e47c75a8f11112fd2a0e60c00d9dd9e2727b3deca222c6dd6988f56faaa7c24ea4d35a867956ddbc34dc7865c2626bbbb734328d3eee8c6224c279898c02e2fa17190964c384c4c3ba9b5bfdba4707f4a7687b424c84edab687e43d692b6281dd1dc792209b8a0958d2c16972bbdd0e7ae208447b4e1de417525184edf76ee19cd15f1e73ce48d52e1a3267f44ce8924eed986e410f0c2d78ee734f8fbcf7265dfc39758380b43a317e155e0cedb55693dcf157994719e3eade571f3fc5d57857f7aeaeaa0b37f86111b8d77349b8d6a515b55c942870a3ea3ad5491d7cef05bf5d95799431aa1e923faaab4ab27baaf4e78c3eecf2b418d3d1b600ac32da755dd7755cd775f73ecf3b97bd9fcd6df73c6fdbb67b9bee964cf0cb28fce08cc24fd0970dcacf4f10f7feb85c5d5c231365302106136b9a687ae1327166cb6a8f0e0926c4f8a8341b54c558c97ba918708a609c251352f62ca7b26c01ec598e19635b4003dd2d0aaa629c5546492a72b4e6a02de3fded829a18f161468c6a8f4b373ebd32268c7d5f05382b7ee7bd83733749adb5f66a926a926e22916f7376ee3bc7b845b4cb0a1861eb98b36a64e69187919c6fc8a9a6ebc6f122b993562a543fef18368b9a33f6f72c91107382375b68cff20447ec316bf6077b964ba0d92092da63e277dd3924f748a2ba3c7af7529d1e46fa2934d74c09d41e36ebd833828cab7707df913e36fe23d341f270ed1177e1a827d7a9ee6a65ad95816098b9306fdbc3fbb56dde0eebc422efa0e775a0d779777361b661ae9b2a1106d9a031e3fdc765cfda5a67fd06054f2541bd7d77c73a3cdd778e431d34c448ca36d639c639cf39fe8f90475fb14887874727e11dde8a444810274e1c347bdcc93af9ee9cf0adf0ac1c7ecc2178fb2ed424f80d1cab6cb4e1528bda34c0ef344f3a3339dd6cfab3a9fdbe8368d22c99710eea2f1f71ef4e43f2d3a4d0feeaf45d587d8c3e58b2fa31cfbcaa3a1eea805f69f23b47bac60dea2fcf4d392d748500ed838c18c77b9ff60ad9b9432b1689a08eeb6777dbb98fe3b88dd3dd9220e3eebafcd34d9ab78d9261789ac9ef902e0972ebbd7462d5f689d0ed4de669f267671f8ed3a40edde8ddbe713f8fef62c662d1d6d11fe4ea0ebf1fd60785a25142412818e7c711bad1e5e2b237c5bbe81673901023495baff5ad30d41d9875aa6cc35e4ee2dadb7de80873733ae9120912274e9ced537bdc5d6b5556c7aeca683767219971aca2111c0d1262acf73e394c8ff8d1d212850c3f5c497eb424e19b8483b4586a6d9b5b83b4586a2bbddba7a236b80255d9674feba3155ec79539906afbed765b47df6da758f2d177269b66d2ee0da476bb1dbb23d0de6f47e03f91ac7583a326936ad781dbbdf86a122fd536ba6d14cb26f1bb7c64cf64df7c91d07724adb249bc7145c8baadcef656e049efdba6491a3541bd6992d3db266ef6dda59bce57c786d0df22f4f74828140572bf697b49d6712764fb15b7eeb2f4d86d611e3539d708e93eb1c803c13cf7ddc07cafddc11db72ee67095bd1359ba21494aaa6412ed3e7d74c9ac43a15020780d39d71cdd6fa7dfde515c414a528dbbe3cf7b2b4f0b744cce351b7f03bb7fc7502810aac9ef9eb7e1cd6df7debbb94d53287407be4ce892aa8e2640b3c34d4f8fb388b1b241d8b34cc24d125fb66ccf3209a89dc4d4067778fa338758dc75f66c82b067013a0ea60ff0cbf5f54862309705c1d0f33c2fcc47dfec3c2f0c5fa75f62f751f8af087da7c9babf8727aa96ce2cacb53f569aee8fb4567bfa2824bd935693176f4b35262b6cbc052c30e24c9318b65c41850aa2a8ae6c19d326aa0d531a4be8a06123031b19b059019b2deebd3b76c0dacc0e1a54e082cb1316fc0046091a3a2a90ec1a356bdc4cb1a9114cdc7174d924467aed9a3454054e382976c884146c9a9cac0973860b35d600b1c11cf6bc55765411da820b7c31be343466b0823245b0f1024a67868d102d3653556ce0650d2d35f0618935d6e852c0e6068e0d0f52ba30b808830ba61d3e44c1268d931d336cb1c69a1748b005182da0d831650b279aec88d2dab3dcc2cc1650ec90b203ca0e2818632c05638ca1f0ec596a41841634dc90051a38642186942cd66481e60325c66ffa510b5b4ab1e73f5862ac65137bfe0331e5127b7e0e81dc86b76ddbb66ddbb66d4bb3831b1a7cd12587285eca8889aa200c4e64740146142d5aa03853c375bcb8811733dabc81c1541764ca266219258506db0a153da8c1e50657b0a07b028b3328166840b14135c801c6932e6caca81203369d1358783143100d9ac61a039d2d60d8d1640cf72cd350b1c3290d133b9ed29c200d1120ad61677de0d1de90ce3bbbe9cd29ce1f0f4ca0fa273218b6d0aef5549f80c6483fc27d9d3540cc780e11374e614f7b2bb52a72697f01ebd7b4b36799064b53cf9e651a2718c400c60e4e51bcf083161460d1c5c3020cd4fd7f8ebb26ac7c3c3ce1eeb550601175b1a8d2744518ab2b6c3083156058b105973328b5e18a356964a046898506563c61c598d91560e4809ced79f2677b9003888ceea827b3d783f4117f58a07a12ef793a8118a13bea4998b38a4fde15c8790653b7da24655a9190c3364281502cdd28f3e06eb25b6d72b4fa225183825bbac5943161a140e814dd515fdba841ad78a18939ab27690ebb0a608d917e09bd00d61845a05e689b393465b95aeb69166b7b90581f9f40f6554d0f8ea9c3fee620538725daf653db32794d6698f16346694596b20a2382c8b0e2cb0b3228abb0a18a2a33801304a78a261ce26af18558bdb43359497a7f846f871c71f7fee17f07bf4ce3eced1fdd2038456b6b772ea9ba6ad326d58da92882e0e7ed4f18aa549fafaa9cc71849a14d647d048931f250a9c2f0f334488cff541f736aae3e7e3eac218c9ff3a178f04eaad811f1e08d446da4a2713658c322234da29126279553a8418dc6ab1d0cc02ff6f6895590666fc74b58c80d0fce1ac2ea24f74d2cb27d92f6e2b7af32d4694b35b216c24ad76aab33991584fa5941507de299c32e5bf1f75ec81d4caa966e5cee5ec5a2ee134f1d23b22f96520565ec1558ef9e3cca18aba55badf5081fbfca2024c4a6eb84c04e889b29352bbaea446e953b0be4ddb31b05d7de7412d70ec573a73a488b91fcc1719947191dd771b6be8a4482bcb12a166b6419b13ebe356aaa5b44c273b1d811d77b1ee3deddf66425969411eb3a571a5f93325a5d47d75a5fbd9673d57b726c7b4f6cd3b123e3ed1fc07a8f566a29f5dc7ed2d46cf19c5256ea79ec48cec79bd0eac95259c9953b0be4fde6696f6cb2a302873dbb14c447815ca8d2b5255a4d8aae9668abe9810ef62cd164d968ca6c3176c47ebc093d67bdb33e4656cc84d65937caf99863d43a4bd728ad4524dc44234daaaf94d493747347ec5937a1e7741cb7d7723e6a23d6afaeb5ced25624121ad9f9dc463cd7e9b119dfb36e643f3e288b31545a29f55ce52adaa4c0abb292ea3b42c4779abc9be3b873bb23855c737a625e42396f87ef9680d968751dae735920bc6d22110fae08e20a9ee7c87890314e1a8f96aadfd14a5246aaafae94f3d675b492eaab9332234d4e393ad6b5748c7352e9d8f758a78d8c629f3ec2fa65fdc61e30de7ebc655d95c757d15b8dbac611d9952ae9824b5e650d31c5384193b7674945952e69446931861a4c6a58d03101a6c9146fa6704393b2076b56aa9f349b4948816eac5370c0a435717772128456cf9da8727702c598fdf6bd1a71ffea3d13ea3d5da3b4dad43d8c1df13414a5c58e78ba064569debb1b7d6288892cd07d988dcc32e211a11ad4867b585f754d2a76a49ebb513da76b52f635ababeef4b440429b6bca75db0dd27a410c8149030f52bc55cede493b9513fd6afd1ac0e518be9320340feb23f49e56a29fb42526daa7d8804933526feb9644c5720488c65a29a6aa684489c93df7cdbaf0d138cd74bfbd8e31fa983edaa69598e0dfd18ed955335d3d2d90c5126693e3cd6ca9519aa7c4a4bbf70028136a5094d6bd09a57577a13b372f53a7a5ee39cd8426556b914d934b8e92e0578d023ebd127c7a229b56825f7f330a98da59af6a098d8302be1a85fa7a2676c9d6aa86d01938e0f77df105f7867b33a788b271e61451db942cdb942c47490cd034b5efed99333a4abe8d82019aa6b635f3e628c9ed42aa33b366571a7669146e17524c5b8893c14c83022e87a926db9ea51456ca28b49465c204855146b1840b416bca3371ce9c31069c3f9df5517f4fba40fa39c1b97acd3529a31004b591ea56d7a858f538f220e3fed34d55d7a48c787acef3daceeb29fdbd11fdbda7f7b491eb56d7ec5dda8805e24e754dc802713cba46a46bb740dc7534f855a86b52de6be1bf7bda687515f7d5e9a90e754d8905aaba46413d2d10ada7f5352923faaa6b4c54d72cf0da78d6d428c4faa44d375ceb9346395ab8cac9352923f02d5da334f0abb3b252f8ef635692320a35cd6295c2f368b3d29a7eb1403cc818b5524d8a8449c3df3e699f56c237d2544f53c0250553fb0fa0344c9b3fdc6ac9560e88a02dd86cb185150f82f7de7befbda0787aef1559e238de0b8aa2a8fa15c14f111441711445d678a20a8ee3388ee338b258add63bebe3f5d6c156265da35095b56eebf82f5d65e32852718e5a3cce2c16164f1031c6d8a51297c2f054960f2af1b67e652bacc9d541bccae291ead4b5319e26c05658a54ae2529565b8ecfb9db28c15d74ed8c3b3dae8576519a8bd7a584271c6bedf61a9be8a81ab71c43ac6d23150c7b491cf61f778cca408ae34fec6fa8db10eae56ac1b815ad4e409fb7e458ae756392a955e81fa28fcea44555cfd86e1d5a46ba7876747b55aa956ab202edebc11bf3a61b36e3beb03f6f1e098b15ea9ce3acea1e8da57f599335bfaa56577257189b48442cd06bf7a3de7ad1c4d8e2f55a71abf164bcce40946ad7c04a65de3a793b8c4d545708a4531f1ac079cf4a8542cb7953d4d32a56844000080048315002028140c88c40181482c4dc32c647e14800c8b904c6244154a22418ee32088814806a1184388318600630840082169ca46001418201158a2d577ecb846043cf14c7c438620918a066b84dc99b810adb5b4fd522608dab7562a9c3434482543684e2ae184f7720053e0fa25bbb099c630e86ea9e253d24e22cf2a5520fb06205a3b3072bea38bdff101383d761ce609962d3c15cb319fbe29163cfd34a72b841244ec1567e48281e58e78dedd6962e25c31f5d174f9984e107ef44b6d9597dfa579430bb81e119fd5e5ca611fb0048bdd20c01136cd6520cd1d5d2f7680965d00fc0dfb2ea7be4641e0fde1537a128c00e5a801cf37a823355a3366cfdfa1373c326ca6440f74b9ecdb7a7fa4cff0adf64c808f8d8e820dea28595f6a786a5019bdef8f85b0dd0b91d8ad6f2c15b117104d2e9800f1e4f54331d4ee7fb973f5dc16bb608988c721082dcb6c09157725a4d5ada288a1613cfad6864e2b49e5e6d61884974da39bb45d670f293140fde30e14e353c9c228dc34b30adb9e86469172b7108f28f01d92d6ad27832cf6c4bd1e7f026f380318cfa1f1ea6857111a25e84f96a5eb799640d1836f89bda1c3b99c4b4a188072fd52e4225eb2eebb54dba0bb4e5771a738717151e011e3e7822503212650da0f504e75b55b6d0672bf9b9e38684aa5d5780923fc4ffda11e942e141755b0d4c3db57c73aff42cbf65bddf4d9ea6226e14a93d5401862af123730a1d581ab5ab4540e6fa0a46e2ba4cf3e1ae5568aef82369a1505e04df7939b6f3a3a9ddcf5bba07370867aabb44bf228e799f37739456c8c5472c455441d03e73192f4679c9155d22dbad5bdc11690208bc3a31a55c2672d0bda8157957f8dbb8e178c961c6e803e4b1fa72f35a52243dfba9e6142873785c9643631bd9acd931d0598658d2f025e1ae4e36e6c6bf4afe3e3c0b4654e3361da24632834b6c04764095429bbad47d91ab1e92b163266d15577fb439948d46f0e6b55dce9a6c32dcde79c6521aed209409fe2bcdefc98b4cbdbc5b23c4cdadc6d1c3b8faa7ba3e387c6b1bf7f1193d675f9479417aca3d35c84145139815c5943950309f8b5767069cf5a6c828a2cfe29f5dec48261ed07d416bbb18931b4a70c3b98aa20924623461b92225dc71330e809ec9e420a6cc45abab3d36c9055b31d17ce2e59a1ec4f3fef3fdcddfbe8e784dc7a03318a3bc16f6965cebcabadc0f45734ba6c0a7828239a31d0d5e29b2c83ca48cbdf03a5c1c0dcc573cb47f073baec4a8579203466d78788264cdb333e353061ef40b0976bcf502fc2a95a18cd877b695c574000df50501315e9905e2a0e0d0eea9d868795231005a79b337d7e4c7bfc50de8315579b2ef2cf93c9feea000cf22632f0a3bdd2f7e7db25ac11a9f2b9520e7561eb6794217968bd43d754cae53266c9ba7a84cbe3e823e2d4ef9df0afa1d6b7fc9dc719a6933bc89a3ea6075dd69131473f3a15c54f8a59726ac4cd86ab6833b4c77f4a57ddd59ccacd97f8e81f52dae0a6feb685684bd4f798dd99eb0b492d364b22304da8f2fd6a6f342a3ee8cf2ce8959f6078cc9615537dae85888671579d11596cd552a32ee40982e86110cdbbd534333e5b4b0d4dd821d83fdb99434342e0d6a4220a5d991cd6ed3f1bd32355552cf0455d48161ec5eca4394e0d91c76b41c0f5e86cc5cc808471854f70a0e83bbc80176579824aaa1c05a121d56bbc80abfd80d42829f246270492f334d6590c0213fc29e1630bb7ae9d2169dca6a4e62624281c0c7cf88ab8d0c95b4e12ddcf76474c59a4cd54918fd262a38a67a4ff30278d39a4cc396b0773f2845a70d8dc884a7a4e94ab1f1699e044458b466b8f7926b6762e5cd44647bc7977d9600407386f4764cdd8d3fc5a6141246a6c1916c75713d117a8088d5c0911d5589e13a9f905d9691728878f3716430500992e97c55ecf3aaf48426eadf3816bd7015f66d469fc836fa6dbc8bc9763f9b34929ee790370359082575303bedae2ef7100ea15307c9124af2b487f4c36988dce6dc4c1110ff6cae36a44dfab582f39bae77ed0bffda5875a43d70b39df6e266c190b6664732cd8a59dd5cf99af8d22c50550ded7e01e467aec7174e46f0eb511706ec5bbc1dda545b963ae2be154d4867522a3ff6c4bde7ef707051ab4777b96d2e3796cc529c578f57007023492e112defce4105e17836e5dd9faf2392c9e152b364d24f29196bb3eadb04e26c8b120eb458e02d5570e745c8989a860cf2bae2d7c527fcd78fffa2a0ae4a0cbcc3e5dd689b4b15e4395bc90a990fe72c06c49d8d57a74a838c16f50a422c023201350c8e2eac4c65ee0b6ea579a611859be6da66b3a8ebe99366857c2cac83d6303b83a1beb989b578e79c505a0896315688a114a406c372fd4a36d40ad32c24d29f665b90db211a8b7311484049be543d6035c27f10754b1bfe2ef3dcc57923dab2819ce3c2de0002208ccce3a89c81f3ee8d88645bc2c3bfaefddb1c286269d6aaba2966de2f305a97b90c64bb67ac0e0933cc4cdd861d27f8c54df2e4d775d8d5ab7e48b825ac5aed491819c0a74168230109b7220a1ce231a59dc2c77149997806544932a2f59d4eeaeb15bbb1d4f064949f863e4ee640babec0d969ed3c9f51a1721015759d104e9b6f83bdd3f2f4eb557ccb8e9ed8afa8e211a48defde0c42e55bc44ad102611e5104370eca4a2b28bd1216debc0a0bb659fe6a8d4b40f2813c9aea27cf7c006386f049395bd50c77a0a83fcafbfc79600953a9626dd3ddf0e30ae36e7827ce8aa93aec9a146e04ce289177cb2acd8d38aa80d2e7da2f6e6bc688c46ff53b5494260bc9ac10ae3b9ad4bbdc0c2ee156e737dbead3861741e58f12b03402c1bda38ac4b9ae58b312b468cf7e03e7a3d0769724fd7a24c2b6c37026158e80ff0fcb65a31cb1031f471dce4f2719bd4cb56773b013326b18cc40e1b982a374ecf29673c75364da7445a747e6e2bdf2428c8e7137bc5ee923c60526eaac1d7d89e77c983a9469a43299272fa4662f8786957720f988e1e49071002f79c4536547ab25f50cd969ff643cb502b64b0a7e70668926d1b86d0193416498134febbeb97d571d89e79fcaf044908a129f82e9b0e8911ec39bb08061abe4e224f8487ff0394b22f2f46de9619bcb45042bdcd3396b0be0d337dfd1433444775e6c17be52892cd9d65428db381c5879bbcd9699cc0f16190c1ecdf217d3761136ca413878bb2a874f2c5a5ede8c4c1940aaa66946eac4789163c02dfa94e3245aad9b124897c8a9098e444e66e1aa93990f1437d62b2d95c62fbaca8615e7c0ee5ac76887f2eb9865b3dd9b837adf70c69bc516efa27db985e04bfc04944d5f1d81d6b270ad73cd80b2a72c4f96c243ad7c57014fced287e3055560118a88f8c4f07c266528686030f458f58dad06d2e6e5040b411213eaccd3a820bf7d82fb109b8af28b7b86361445f0488940b6f7ca48fb0fe93c716b6c3eb253888830e42681674514552f80242fb5d08dd0752374e9eae6ac68387d7296c62ad4340909c900f0c25bc84b6fa74884b502787256d75a6a74d780ea423fe456ae079f0da730ab43b0970d0e55514f9acadb6596ce46841effc8a0494421cd83d84da3d50952ddb4e9f3dd2cd4f7d13def6a6960b3948dfad36577137c589cf2240a95f60928676ac26b6f03c1a0771839728595c2bcd42e0c4b0d205f38d120e534a69e4dc4df04eab0a3160a6b81b598f620b8313bd4c660ca0480f4a5313b02c324a169b45a5bbf506fbd36b269bccfca182c9edd56139f1bb574c15569ffee7097b54de6cd526308db0392cdb9dcbe6586a013d4d54b0d800c1143cda812d4014206724322e23089c2cbb3dae362557b0d5fbe0db21a4b8cd069a6bb435313c514b6cf1bc984758b9054a5b741be6a67da1e3f13d3b2657633b216297ee20db866a7ca34ad6c9a011286b180d5e89d450854d21e6e26f06008ed6b486bd635e50f6a71a04467871806996965195405b05586ca45337cc5245210597b0770d6c9fb087f0841c896650604d4a5be54db55b682d726e0045e34888c6cb3f44ed21b78e5b7583dfabcf1ebc46138f6b59a30f816ce2ec9288f7d129591f422e1264018696828b2e5498d2738403ed8f280b071c74dafeb0ab27a5bc22b70c1214301cd0abe059225c572581aebe581c7b71ecf2cc7481f0acbdcd3e8ca0f02c829f2a9312c5bbf4573783cdee6df8aa512db5e418c11b9840b975859a9ac3bb962c74f92abac648af97556b435159b6f83a4cd98651fcf45633b749aaefe26ad15ba565d3b922c927538524f2e0686e6be7e3879f6a88436a4b798bdebaf461c335563335d7ec4d4ef810b524d4c883cddd8c1656fe480be8f63bb03569ddddfaf0c2880dc1d17530d9a832a5bef9ff729aa5cbe59c75372846a79ba3102d47cba719215c25652ee3ac264fc1b496ae668d85cb7083d4ddd77c79280f4f5cbc19c5c1dd39b1f92d3acb8d83d865927e873aea288941e04f51946ccce313c62eee9cfc26130ee18bfcc5a02f4ea19eb3c0f2f4f740366abb1fc199d0a603c90fef13c3b3ede3d4422b714dbc150ca278f50a2f7132e0b6c3d68dabcb3af5e2bd93ddd8c013ccb24e3e36cb483ab1f5fad65ae8a24a135aeb4516cc29349de02b2334fc42e92ad9e106674ce3d4d0287d80293b2897382b954f8f040e67279e4c1f116b6b5b777b51e2a0bc80438dd2406c2da00cb04dbaa2c3e9ea9cb7315022fe5bb03025fc85e4b853e5fd49f7ae0f83f83addf427630dafd03c5ab391734f255510e166c3adec2325989a51810d715e031979de12e289ec574c04536aa56cac1a1bbab7de94b918738cf103b427c5751e95da33b2a760d41148c411674cf6a0542954a44307ebd4bdc65a653af4f80165e60df92850dec7a84588959b929f99fc9432ea48df5a593fce625d3e2ef433243ece4230cc3d015d578b41f183e8d07f1e999aa09e8beaf6827df7cd003e430b11a8a89b2097b84662b77b1a24840537f1906c183a34f7e997689597db11e924fbe94c22e443fafcdf2050040fad4d9d8ff043643a136fadb908f8edede1bd265b7cfbd621eb9676d934917726cbad248a53a33caa5bcbede8cc2901136bcd575940e08b076b0ce328b516f9d496a21ec416c93249275e8db92d267eddf462c26b36caff620ec9ca86b48fdb624a6fa65c2b86b59345be98ef171ddc0927b6c6e009c42d0a32b06721b798e82b8ae916435f93fd95bcee28a8b64cbf8602d11f48bb5bf78f10e331701629ec2117bf278912667d8c628fbde47f0ded3068d6a5c4c575e7b581e920ab8341bd7c0d6c424059a490321185c70336757bdfe1df9c4ff85f4e2d9cc6dcd82c54375667da9f20bac3464386d65da88e5a709231f7115be4eec5059ae911adb158b5084448aa5fe3426e4a2e492af50ab050a146e7b89ded71c1d5938fe3fef170b84c08ddf2648905bd214df6dd94398980d2c6ef7ca0e8f35a3b4d2c78dd6b95fa31a7d9fabb35f215dfadcdef395905b1389aa782d163e49626fcbb8b8187ad981b3800d331f2a384198b98d4c6e095db5e76c31e0949667014c98efdc882d184551cc1af8f608d2c18aab8063491f0aa27206ddc796aa0891218c583e67588164e6ab23f3c18160c143ff67638d85bdfca873ea2b7a95262648cdb8a3b2cf64c0db22fb8c848d455c6f575d2e9af63795b44b10eb773e293757b14c4ed552517f9baacfe780932df19c18251201ef67d5a56666e4fe7e06c3d622fcf2c6331fbbe5790353ad622191c3145436e43e8b33b8c45c09db93f80b77b23ec31f25f6148c466f41e4d270b04d4c0beba7f6a7788f79c9e7f1b4ebcb06634dbdb20ca283ca8a8596b28053e56bdd4723943562e542c2c88d73689e50b096d78c74f04390e3eb10f54097a91ec29928a9207902b73b037408594195ae0b9658f3cac217002e5ab71e5b448a32175e4cd164e355f11ccd26441964dbc3db7eccfb27bbb65679789a10ec109edbc60a2e8793c842d7b0c0a2219ec550c8d9d04381a431a41e1d4e5c7f9f9f192be4b2f188a223bf0f9f109396eaf57f0c55a5e063b34114cc9df22d8ae2ddb49e0c360079a10bcbe59624c96bb6202a50bf6428c4363d516ca8b33e750614ca58e1bb72717060220fa2d2cf3a2d4e72de9173a9eab61f8f464a1e56edc1e1d0280a2f7594edd1abe3c6ee2c8ed41938d4feb4d50574d49b1168e2bff7d74d76e790016faba103c30900278d58d5ec2327bd980dca03c7211585f13d78f06df3a7f54beac95a8fed34d49db5a080ef5d4242236ef2208d0fa9e731b29c10e500972d776aa751db54ed50a79e232b253bc4652656eb74386e08c5931e016adbb3d46d735d1172eeec6ce23b15a4de1c318861f5621cefd514f798118b52766f7245f93bf269f7a6eb501837f38134c470a4fc591c54d0fcaad7984f767351bafcf222cc1916d1dec2bfa0f188b2e62586309ee71268d6e4a2c8307f44485419bd5e3e36a4737425d4ffa2078ec0366bc60bfa4e0d5179b05de949651af3ff17f593a07442d2f407353f0dea9154f620deb7927b5854cacb40566bf67c592d5896012f2b8395ee4cee2f65a723ed0c776a90c2c24ca457be678511ec67cd7a19410112c472848eac9d020e5bf6c0d88b2606806722dafcb323325703efb9b44ce6045132c3a5cf93b355d1d4762dd8cfb590df85e192b8d675d8e54b99446e915ab480321634036277003cbe49fe2606f5366955787a23ab085a59306b1f3d3aff61b5ea80a2095ba25936e8b6822253b0155ae797262ebbbf49253568035cf625925c07087d8494088f983d8a3b5ce31749d8e42ea0a01b4892c48a6224a17904ca21798c4ccb9f12b3cc39b9d8f756701c0d66aba6c60043a012b81f6bfe850ed993211a5df900b6a8f473d762b778680b7a049ff91ab97d520cf4924d5b01d6bb42c4466d4d2c63725f83ade648f3bea9aab74f96b58812ba31876f8d054f32d07ceb63c4127955087ed1b53b5f6b4d753d274d1790d3795b994a860002f97f369ce6042a8c434111caf0ec191b8b171e505abe32883419ca136ed99d77e3429cab897d5b2a46f77dddcf15e81e4c292fb8130e094a1b13158b4d315fac1cb56784f8bfa8cc4bac21793adfeaf43e3b72f3b458d8d81066fd9d636d490f4b733ef160cadc8d890592727e5fa6a393977b0c57696511bcb776ebd7f976f322db442186ce6fdded6097697a686535d09cd98c0f6a95f6885d761fc7f1f105d377f85584261f750591f1f94249139367836d1387dd25ec235c1d700ecfe4fadf44e911faf1df6bc5e12eae2961050a609f99fa4c3f66239bb980a2a492b5a64eae164324b5d7761b49aea69c8adb37d832e7032d0a041d402201e718e29fbfe3eb633185995e1e848da250b7686500c132733b40c41605077dece7c5fcebf10c1b83976f9dc912cba624a08b64cecf20df211a3490bed2f093edde5fc6d7e4957d9c74f09dc88626a6136bc3cc55f607909a1e9c5af38d4d9ef16ed6d92e2600ee55d130872db418fcbbe23a8d37bd4bac0e688f2d669858b4f5c258a5af97b26e5440b13f7ce517a9eedb4d6ad897403979644596a1d306f02a277e1c9c76d89e9353c1d7045ab90ab6197a0647a433a6c21218795b57bd0d2427962d057c1b013c2b03772ed100242fe40818444c4398293ffd87422fa2c9f83548d9169e9e7b578569a05c89b245e22f59f4c55758e942fee57c42db33d874993d496263fdd146162674343e5852e65136b23b98a46ab0c7a907e3c8d175e76fadf384bc60993bdd784fe919f585f6d105c39b299b80f39cf4a4b44decc421371c1db23d7cc5ba70043f73b4501a47e6e43e9cdd6853c182e69d57b657a370a80ce30ec4d81dba877bf005bade09d84f4e4ce24c3d47d180b4a1551b4eadab3ca8c0bcd111501c5ef9ffceb915adf368f364c0f4abc48e0e32325eda3e139b904a2b01293a88c8bf8da8b50b2bfe4da64433c66b50a7ba47d56882b81ebb733b8a4aa5d16ae8de623485ada78d5c87b2e001c783b8b84cb4b0c2b8964e985f04e0218c4e8da8fd5576ad25735fe70371e065101982f061e9197b75a5fb87bcf7871479166c1eb420f96985aec42e9f56c01acb10d7c091a188caaa7758449fef068c420ab9fa7299618899fc4d3a0dcd00b8d7537f400839e8e28408d55f9a99fe6d0050a5de6dcba337544c108e2ae71e883e3aee780b812f88edddf472073c377c5452969952a537e5de6372da1c2689c18fe038a472ab5e742ad61c7d4606b30d98d7ed0843d7ad4690f489d901fc333a893a3e8fa676dfb51494a94665d6e2f3f213b8c04f516704a216dd47c6cf2162085dacf9c06376fe60f9e688d35e4c97c8d20386185cc48f556f1cd395c7f3a492cc2e136959a4f05cb0be84708ac56e1aba75129f1456d874b74f1788db8c8d1da72183a5b24519d0264eb7a8ea863d96b2603c76e592c25a71cc0d22b7d0c142d047a867e43d4fe21b39216dd2a2d4ca4c8cba9f5a6bffb1799bcfbe3e6e5e41dab005d285e6a744d39e0425250b4528244b80eda2ddc4d2686dcdf4120d9027b14bb70ea2e03c32a68d71cb586feb421fb806ff089b90a9eb5a809b96ad9aa8ece3166c7f415c2dad714fa14c6f344155b567ebfeba835b82bbb06578a17959ec13189e44807354fd6eac811dc674ac748c28b3b6b20eec3a97d42d948f8456814512f440eb16344d79c5dacc02f9e5859afe90e051e8cfaca03218c6695845968181991f5869fd9d57fe7ecd53f5cb2c7141dd5ce9d9646954306d07efea29fce502535de8953d5ed681b1872241eb7589ca5c79f0d42ceb08794c56b7ddb869f75fcc8a28245ce3198d4875b4739b02ad28384c65b8c2740e43914d591d6eb064ce622f95feb007592082472c02a5b44ac2da580f5a4ca73485803f4e814ce40b65b71586231de1829694535980c02ba85566b9e54bfc34a81277f0bbef96e4df60546382f8a1dad379549136133da853646684e36bd9993cb6692668313700ebdedd683a65babf356e9436bcc67e513221dcafe34a092d113bb55223644eca266129da8990c3140bae2af9f6a452e28b04298d988139225646683112c64be939c2f7e5335eb328e265744103723aa3f30c0c4e1e1c929a6c96290177cd4e06d2b44a671c0d8b45357cd1134d57d81acd39bd0ebf62f3765038bf621448d10b0bdbd858b1073cab64a6c1bf7c39ed10ec1ad36c946bb09c71a66fae7a9fb5a013aa2f45e4c18d3a3e76d9ca9c381eac3325ec67f2eaadff6c01ce2fc0ee08744a34d447fd0a52467a8382d2ec745f8bc75cc57ccf53196000aa4f6da565cd8faa726d0f6dee6264bbe46400bdfd2f6ec23f1972ecdafe860d76f397bd135d3a74349767d5d7155dba54c409c15e6e3c71212225a1b0f2039acbaf8883a7d6bc0e09903a2b2bf518ea391e897e4426c454dc570946fa7440bb3ccb62e9225eed0ba25b35508f137627d46114fe3afb1091d85f7e5c1a2d50ea3d4993aeaeee101d7289e74b8b40716756b27ae4c9aa5e3519d059e303878a9cf7054222af30afdbe743ad99f53058152c24586b06133f836c6e16c0cadcb9ef41fe50ad84f7829f216e08a0aa25a3828c992d92da3c72a1eac348f9a136935711fc83913dbef91e4121f4037749868819045d4c97e9c8df1b348e8ad724dc0f160f7e9ac50b7546b45fe6d72cd91b88b1180b80e7e87b261c17cb4c3fd172dbf078f71cf1cd60114342dae02810f2c390f9cb920451438b811c93b68fb0d8dc2878833930d27172ab53ed1f6176e1bb20513727b5ae557f3adc57edf1b7800238aa988699de524570809d18397ba7ce4b30944a91490846d550d0ae8a762cdce2df65f7915191bd2f275245026867150a18a51223585513afafcf13481921fb3f61dddc35b4e5454d6d11762f2306e4c7e0838f05542207a1254bba376137115c24bb7a4399ee50e2f7dcc668fb888ae82f37e2d594ed567387abdaf284d7ae0e4e1c56fd75d8f5b24eadd3a94f107b02f02d37c226f679348cf3d3c0d7a42491d21d3f98171e75e0c208a47ab4b4a32050c3317757a4cca29fd0d8c7c672e94eb02c85696f8d985d79c8b21f624c31febab3153aabe275b1729248435e6438b9f7a8e2e424d5754d69b44fc73afa6b1d23a7f19617c1b5a7130a902a267740a5f7e5da973969ca48afa4516e34ce2e1ad9b4f52a6ef197030bf27663a34d673fa6ced37fc82a044af5f214149c2dcf99b10834866512b16db42ea2f93ed44376f88b0844583791ca04057545e66cbad13d2384b5ee738c47546b64c9c765ac6cbb626e52401da95f315a172a284a8e4eca5aaab700d9fbe90101144068ca09940837a1a5ab9f3f494801776bf5a9750230c98be899d98b6d8587f7e5e2915a161287170c9689b7da15d99a01a9a3eee6422deaefdc265cd65504531114fd30d800225efd3311195d0975b448cbf4928931ff70f1fc1fbfffb33f8937e2c85c0a241868329d434182959e123b420dc5004580d120fcd3c8eda29a1e98ce03e780881d06124c559fe0ba64058d82ebb831732dca707e54ee41bedf0d2f02823877d015d998818a3a63cc845f6afc6c82023ed95d8b90925c6f7a18edd906da0a5cab62c85ae9c04c209225948b3c4bcc5c53ebbd872fb3bf281e5b00721f9dd2344f0c0b5a344f0916d02e4ed0ce40a38e6af79f156083b35e1116223d5eadc98ccc9b3816b88257e6187a0372709f26f9f2256fe744b7a49885e41b434e0264b441aa1a98f0e4d915d89856d1af9179298a7654851da3b642d9cc4131c9a52efba9e1683e772a793e4d2edea95b20eeb2883d212fa42b4795be85e1580f71ee2eff8458e3ff2a1b49fcc1a0b4da76e04ea6ca9b90507104d5bcbcf62318b2877c62c24cc11eda5c1dc9c1179412a4054b4f2028193a67096d2095256e9589791fbe1edd128ecb805beb82a37639c6b0c243b351f93b0fb0a892061eeaace2fc0256c84ef0032e3a8951d27d1550897b07a21f5e2ed31e671fa198c76d5bf12ce1ff6f109c79cc48f8015af107f77f2b862a9a3a12e48e4a6b4bcb74968be534688958bf6cbf2f694aba2c0e50068d2dbc9978acaf21e33c2534a48ed044735b1a57fb75a2abc68a317f0beb8e799e3aecccc5198f7b39cfc1f330c66583ffa7c3f66122d40c11cdbe53818a97856daa051e6e2b03d221f9fec210822bc8705fe26e20c0433a41ea1082d8dcd79e0adb1b623c78257aeeb6c79abdfa428b436ed940c64f0e40ce61e20dcf14895f1c0cdd80a7ee22a09d3fa91316219b1ac3725c7559b18873be6c730d65e7e2ac1c2ea6c228920531adcd85e66daa411384fc76f780ed06837b331607c8d0d1e18d6363e6e5075eeba2212e985b6af168ecd439794c183d38cfa6b4142e04a877886f80a578642a1a55ee1573d5ffd61d682ab2cc57dbfeb234915dcd13bd5ed6a2d50a8022a2eabfb118135086a627c27016b1ca17475ec31fab5c73188e67bd9c1b540984bd4a70e46a62917a4500f0b5d058c995c74d5ff2676f897d837e0cfc11fa8a408061feac5a8724dce74cc41c91eab62a48e2be25195d66a7f841ab135a56a5bc9e64ce161c3c156cd9bf707055bde6cb889c28afab349a93832303c08b6f82b7a7572d80a0c0efb6edf9123a3c5a9513b53b13eebc8bfa5da07b2a5a72f7391849e472820bae446d0808d5bbe4613d4d8b1c98adc4e6206d90840ee460170a9cd28ebf41cc126b54227adda5dd26adba8fd874dde316852a6f27d7441a2a3221fe46ebd5f780f21d77abe0916a086e4968c964efa937f2f2486e014c3094dfaf186054babc7864af938623ed3c0be3602dd20e37b11bf5ec588c1e1e82707d9bdc922baab90d8ba78c96e0e45556a40425d639e3e4550ef3c0698e541046c47b85917b521ebc18c8398516c0da2ad35f0ffda6fb9abaf0b8b6f5ff2636e5b5086537a6f512a2137c5b209bb94f7b092102067e52426d02d87622c3a86d81fdcaa9b571fae25c5f50aa7f2111859b9bb6b200f838fe36486b935eaf20611f27381665a97afa43920ce3013b62f0160dbb52e64dc9bd31675567b4c8b97419fbcc1bbd80e342847de462911897583dc57898ddf4fe3f9d2fe6fb75187b1021ac35c2c10e4dcb3a5cc2b15911e1812b921d79b3e9d1f39d5833c9de929d0d06ac6c9b71bb0caea6ba90cec9f5b3977d83fcd0412289c800703161cf40b7c89740f7fe1f03e226d97a30474f851d402a88cbad3e16de4079f22e0baef28003cd11a8a82b8f489fd9df0c9c713fbc348202e48f3e24bfd4e8094701159a97f35d378c4f926f535a11c251c7372b0bc6b527fded5c4f3de11d6a120bc44f0525858d99ee036aa3062ef140ab6355000098c37c14e167713f485c28ed1be2e35df98fccc84805f15b74c262beb35c9c148656086a540e2b027f491b6e08ba409b070ca0386940c1cace44f2b4e4a81e4d38b404506adc094402b6beb329c24e578844e0b0913398bfa3741f64e371abf3bc30b737e6cdf1da88eae298f859b5d5937d55cd680bda55811f9f24731b4997168de5e896c1dc83032712044ce90294a54a5d703d40ba73523021214e29292fe4217c53ef313c286c0861ad0b424b76606c183cbfb0af1cfe945b0d117e58ad30bde837887171dd11801ec082574f8331e29ca3bd752582cf4e6559644af3808580304f0c2fd5343b69c9807705fc98db600d52c9cee43af5de176495ac7ee9abb7886f31a1ec5ee60321c4096bd7fa513d82d4de573ad6d91fb1dc8a57ca4d24509d20997618879a585f0a06ee639ca66ffa8a78e5fabed09cfc2042f5ab71e2960df79936d1346a4a1631ce44993bcc6fb53bd2efd5770853b081dfa6944879d822abc8984a6bf1d8b4b190663a001dfbb4dbd2379ec5c21a0b1309713c0a63ce8e0db91079c46525d0f27434e3be2dd52b9dbac8d9dbc5a0dd613d5a3fbf8bd279679fb019ba519fc7704766bc44d997eb98efce58bf02a2481eb83ddd23259b14a9a92bcfa0af23e4739264df77238e2c25a0a26c3fb564b2a6aafdbb514917559c7376c07c62c5aa3da013b9a001b7f19b0db3e6d8fc0727cfcd26be6929f721f204e40dbddfa2ffa45797b08f870f6a3f0ca2738507d98be8a80c2ffe0b8a07cfd80dabbb48b9b9ff9b7eb8ef113973307e8e2c5a50f261097d54c0e435f6418148c733281cc31bfc9ea53484ead400d4462927cc812c5bf2aa664bee315ee6b409900cc7e71baa640079768b7aeed6f41f22efed0792493dba054f7e43088ee9332c1887af7d4e2f5edb9511294f70c4a1f4ff82e3b5fdd0bb3666d92fb93b65590c7b068cfa378dfe5e653f8be329e0f86d60775bbe4fb665c6a20be4d0c995f0e1fa060d1328802fb0846baaaa88fc736bc6d73986c94f9234ec521ddf2fd9fc32aa851b38adcb575cca8b61bede1e81bc531ef2f194972bd712e8a3b807bda5175799b2f9693261316525a824f99b7b0bb95483213ad8c153ed0da04c353399c26f23cf90aaa2c0da4db07c1272c4db047acb8e39636a9dc0d61e5d2bb3b4ce8321146e823a6692c3609fc0b23ad060024c7c8301d99a05f7c418fd2202aeb1724ad969fa5ac66761b1a4e0dc0bdca8d5133f2a5275c4f6fa6362f428a18149a8e551fd49a90263665d82c88363c201e451f79906f5047ecdd1409f959c288f19a5170cd15a8265ae0e43a8c27f52811da31f5a4292ae01acb9e990e333976597e3324061ae3c258069a8bc1696b102014b27dc607222621c7c2c37d3a0185c555903dfcd69c12cf7768ca6643a59887417ff0cd9bf90fe8d3cdf14ae074e56cec4eabc51e723c51a35008124d0a4234a4240003701b3ea2d9639847f2b468a3324650f5a537071f70f05c3ade0bb071beb12c6cb7ca73b24bf4d5e6f4910a8225e62eafe155730cede643cd362247d42b5a200e23f7b6fe46492f911b01f910c05456c0b210c0e697e4a4ad432094599e1268a7088cc5ba9a6ef48b039e418ae512d86e96e86e7e50608d3bda774984e2faa22e2703fb2d1991c2a48c4da7b80dc28d722d83c3369a57ebd8a96c5d88deb65e40812872d43cdbc2707d0f70c67063f06c878010e11b7bb58f863cf545b81818dcb14d6171edb7e4a2f48ebc81d9d1113d95ac78be7aa964b53b0630e680307c42bc2c1fefe16b8e0e748685d9719368dd1b7ae53774e14bc11cb22e6152ceff88ec343e56462344d79785e60bad0a081ff058caac14814e8596b977c7f924260b502170e58d0a3c387b50861e4c615735f69da69301e48159cc60fb238ee2b378e51c2537781bc32d492a0f57aed8e12f296e20da5a001e9094b0e312dec8d0bcba0a60a0efe6044ad3a94553266559d86c1a3a8e4b451fc065aa24995ae40c5ee381ed82a580d983d865d83b9997bdd02c570f0a9879d1158ec059c0010569831e78eb3c482a77f2c1c8fcf227f0d7128a0ac460fa1c634e4e1d84cea337ae915392ca23d252d320cb611511d0c9febd06795c54e744f2c00227959a67029f340f8e8bc51837478f2c4aa5503a03774e03926419530cc3c372fb8249a7a2e5370b22cef2110712c2ba151dd6279a91a8386cbb435bd9392f22c508304b79fc0ee10b5497b4a28594bb697f01c4caedb62fc3f3be271b1c092dab0a4b8a3d9ef890bae7284a0a562b115c5ae8d86bb508878059ab170ac245ac291c1406a79c1edc7d233d20298fba9837868a42848540f6ebd8a06b04a1e91b07f4900a619d8012c4d1145edad88f1c07d49214dc5b75b516aff81fb237d2849890b5b3a711bc7c661e9635d44cb550ea8b883289ae737bcdc871e76dce438d2c415080d4eb8841c9ea3d72ba0d5a493f81574e256bffa7ae6848ac0e75aa0e0248ff4a28af4b49396290600a29a8dc88f4f47ebe2cfe06a2e2049a02f4e45dc4bb1801dc005347cb83ee469e32bd301f2144978a5a9018a0b6494e7cb6bc4918437cc82fdbde1139989cf7856ffa11e400901b009f45d150d020f5e74c15a2fd1a4f830e650225c31604b74afe17d662a568173590ba710edf45edd4769a5f42a709901a0d9132789c77a19069ae3f5e19aa37ab47cb5ee3a3047a6c36059a88e5012621737dd004639218ebb134c45bcf09da211e6dd592972bf3f44894be9ce4607014e4536dfb343898762436cc712947905cd7e8e725151bad273cc7e134bb53544855bd903e19b4e200cfbe4527594d5733937b02e171e311b2e2cdb5bc0989af370095f9cd03221dd0bbbc9933ac862f377dda023ebbe4d1e940875814da93074d84437018cad2abc1a484a26a187d5c126c2fdfe460b46c89976b02857e086aea2e61fba5eed0e4c4c0f1e843524aad3723f5d55180701bb94b87229e9753fee6d56b03e8966697e69b605b941574ecf0a733941d86861c16cf935a2a514f88ef40a870088789e811a43462a81e5c85208021086f6ca5fda9837051ecf0a337cb68ea3c136762b654279c8c54e590041f968e371b802038e36d8c5df3570141671b5cfeadbaffd7fb269b428db56d31174064b119508b971e7917ce6fb5497195a05ce5ac8975bdc266732b280638fe83968a65c7e88e62e97e0a9a17fa728824ca35084c55d88da80d7872caa71d091774707b2a8d3e93a2292db0151f5734402f0008db4a08b7c2d8be43859c006a62f0e7fb6537f6ac8fc43d09b88f122d7c5432d06460b30c2001e340fbb4a0f323c02b8b412a447181a116844e1e24e11887971cfba6638ed6d1bb13062e85f8623e6f6936415eea6fd264d9a8e3551712ef325d48560567a96c6ffe962d00f5a059d7bf33da7fe2279eeebde8433b00ad5f810d7fb625e6b8ff205ecc732434406f51a5b86a62a33b3c35a974df0d0e128f47e5d49c0d2b856718bc9a30451d148c5f51e77425fd6a1c37b0d797cd6cc029a8ddedc020518f7c2c102a34a8b416dd85aa7bfeeea400ec3eb47405c0d611547925780f6a67cf6ec26464b70d8927a20d1078cdc01909d1be1d52a77707355b61ade20b1177861d8ccd01c435d3910b85906c78e6879c02288d5921ee560d7906f18223ac797160110207082dbf5ba5faa0203332d3eac7534ef46162a25742a440b13a882838b091e2ef1eaa0ec1c6286eb15f18c57b346dcb058d93a085ca04d7b24460d148395efeb08993bb5a67c800752d4f2067a00798f67453a921e5672101ac6f0b3dcc15e6cbd97f3dbfefbe76e5e2768d2272ce7782ed67188bb5158f769771b323e4fe838e566a508e3f8bdc84d1475b449da6266a665c098e195ed38c7d54408c954e59b78ae1c0f2528d779380f6a502cac503f89c02f5d1f46a8c56867e5526b0e604dbc1a2195c980d61831ff9831b8647e20130c5f3c900259e15d1da5695fc89aa2a0b1f3302c3adb87f068f868465af72d2c264a28dea23538cbfdacae66038d525c9e6f5b4b1dcae87ae93635308431adb0f887b8494c650b89f5b33d25ce5f5604dcd87cfc4448ec077ce6a152d0c954489c8be4909575b0052fd516c5305cdd9e01d9294878a4e01ed1cc185dcd43f318c79cbce8d09f47e57e1da7fb1741035de0dd0e2f4fe8dcc184da5b4977dcb84f94bf6e3c5c1ad2850e413d075c1f59b376cb0bf9c3ba1aad0fb4870945c70a4f376f67e24b04a640d0c4504fe5f13a292a32e54df1e396046768c641766cd5bff9ba508fec52e54ae1b05a46090004a69995b01d1a754d3c2e4a5b686f413b5a92e2b62130f37f1dff12d29e9861366a1d379a08bcafe3b7665457c56508e642bce2c202256dcf200cd7488f3348fddfd88529b0ab754fa9dc12a5b545355fbfbc65dd206635f5f44009a1a6a4bfb99b0d5990f33dd67207c2f14b220012cebec72616ae02f60420ca6a6b861e9613d4413977f618590e4f5849a82a09657ecb51477076b1826a6861c21755b9e25111417c13aff1d109f3611102f514487b92700d19115c9d0a24593dea658c53a061cdebcc2f93445565d83a1eb2d8fb8e5a300a98af15b30618237416ea8f41902f6f9b496d31e8d6c24cd8f5e9e305e0141dba80c835802e8fd4a86ce0517b2b90ead1103ddf455a75e664aa3c13046eb53eae20d1f0ec2171e531245e571c25da123dc77e1b06063bc2d890c870fb227839556505a418331498820de7f84d0a7eadfc689f63095fcd0a9b96d80e20a96e04d79f109f59daa0dc831b4f31667a84feca68d2c9bcd0ec2df902f0232e05dfd8f80668f0d8863105171586d83e878d3ae9e87562e2e0be0df4a7540bb1f62d22b28975dcb143384c9ffb7051a7377fa848816a1a6165216f299ac9f0eb3c13379a9a65a37c29a08f7b5ca60e703388040ab2e0f9f9edecac72f4450fa95024c13532a6b7679e1444e62fff8a9f4382d198aa1c0e4e7d0913fd01dcaaeacec8411fe98e9772d2690ea211e8733b68e596295fe0bd30851e067f3d5df139d10e04f95182923dbc7a04d6c17de6a5f6c18103cb4ba19d0a5262f85faba3e9aca6cb5fd9b4d3ffb29ab2b45afad0a6d0124b57629d0c0b1e2b71e859fe745e9254dc898a282beed28c409adc68705812561e10ff93b62177f3a71620b2aebec38c32ef21cc0a76591b5d1a22674d002a87203ea46e237119404ed6ce8ae1b39b961bb33f6eea42d498ace063f1a1f2bc32a123d865c1ba36d0234e472b9a5f7bc7d37d40cd10b08742de7d0923ddad89ea3a503b838009acc9561881044293aae5cbbd4a19190f23c064e97eed720669da61f7c0752ac2a2cc7886e6ab17453299409a888059330ee742b6322734b89791f550bb40bb6cd9998ad51508bf2f47e660dc2b3f922d45e58b98c0528ede4515d416b711c7f4a12d30532aab07aed285075441aca0b029060f93b363fdd34e704ff392c5d88ebbdd9c93f34a06842252d65b63b1ec5ae10c3b6d76c35bd25596fe83515d2423c979cb01c199d2c657ffa60acd52b6dbbb5b5cd6a560155c79efee534d6b158c0a41811e292878cb2f01e257b200730a05c943054e2ae1726ab063ea6780f3838782f41d8cae302566cfe669a47ee88af71320e551e06332a6bd73038e08f24f55b0a01425b1a2ef917f3217846ef50b2dfc6ebfbd9f105c66568c5e5c7551da47065e5d659cd92415b739257a668c958701491ec3bb4266a9061dfbe8be448852f25d525debec0316cba2cb325d1fe09dadcbed33122953fed9b0fed4bf6319f810f45f6b1f58a5ab2dee38b6e777161af5b8ea60008d75154d7d7354ecbbb6b7d4de39877797def1affd8b7ed4d9f0fbf43e43c7bfb116b76ac33932fc27d4107fbc987e42fb8597d8c4bf8cb26af6418f2102cb245a9792760bbdecab359e43905034e646a4affada4f844e4536d3c411e9623ab415aee61f215922b004d98c18e71b74ec2cd92d58433287efbb9700ad523cf24aece6b30d8965c4aef6cc41972859d0be6473f5ed05f476295ee252b5ce5fceb6c932d3e2bf695ba16716b8507a87db37545359747b77426a969d7f10f2ca4d06fbc73bd752949be25b6a56f1829087827b2d715ae272b90d5bc20adf6475fe1aaec9cd74790df01e540f8fd3e93ed9441a09eaeb52c73dff7b71b3849b84ff893a0391c9f0085702b11f16aaba8ff0e3604fb50835b140af2a742b352179c89bfc0d4e013a98bc0d816f7d9c93f37b40b68d3b12835b3d1a759f50c8fece6258b5b11e2bf0bd0f9cf160c5d162b51755ee79d26218120c03909aee1633c3757a3eb91cb3a401a387ff8b24c18f6d31f6c92abff1b7969bbc4ad2d5b7d45c2cea1cfa1e622935c00539f6475204b12173b017887401e4be0ae67061c874d90b05495e68ea178adfcd1328ff7c08f01d61e4c389f1efbb1b462ff8e205bfe74f3c75362fdb5626e9f389455ae4caf39b00088fed13b1c3d43644eeb04f070d57e6b620a6c7cfebb6016c0897f4bd7568dc50cf105fbc9311391ed6bc3f9a93467a151c353986e030228e5d69068b9111dec876a91f4afc5c1c13ad3b90537f38bd235e915eb0b85168199f58b4c6474504bc562771f0833b41a632658b5bee28f371ca848f1636b73fd8dbe0fa1bcd66814b7843ed042d6743ebdd707dcdcd39bcb330774a616614f698a01f2617d236e2c8891d4860373f1917d3d4de40dbaa2076d69394033d8dfdb6caf37d1f53a030955cec1be6fc131cbe153cae0df6cc8646e5cf289d96c4e7f07bf035d10702e39742cb724f55299ab3509009c42934188929030682a837e984135e84bb8b08a481a948e63016477d93a377adc2a804cb3278fac40387bd6677205f9b3221b2ae8cbbd43ea3965b58c78be4f09c71ebaffc76e524aff609021074ef9b09a274b7ba62d601d05a50c31869fb23315d6c5d195aeee1171e15d20454eb4da390970222290fe81b0c9c795ab15a48da09ec80edf7067dcd1e488677b3546db280fac43a7d1cf00af8e7ba02538e711329d1623d925bff89b63829990a1e878c38994d687d46700e2417f18d087ea7ea9698c432e3101b16a0a4377a356ff10838e9c358a38ffae21e36865b199a215b9b2332bd7c920603e27367724c6c2df1292a9b13160282cfdda2518838b1098ab036b4f3b0b1a2fedb939fb6f3e4e5f01317da779f0e780538334fca2ea1bac5821f8385ec1f2ec32b19140c1c6b02860fdde082e5e446c2c08060bda3223c2e8b8d5d2648744dc435d2287c97e31d4ecc088fc2ce16bf4c05a8acd1d59071494793b80ee41d44432de6b8480b664df153a8020e6c140d182561b8dff0edae34acd750c18336bf9edbabff981c2ab4ef9b67d6e16ec5975b93575221e1a8054c811da5dda424dcb9a37c873d6d48c7b3c885fb395892390fb84e3a38fa142fe24f0ac0d434ab14c25072d2de9cad4943718fe1b228592bdd69964c789abf7390c69c1842ae08ec325b6422017d5d23bc69484b70815219f3077b966253dcf87cb17250b4ef00c621b25e1f5cd123c30f04a99516a831e3ade53cb3f224cefcb900d5207e26797d4a44844451c0d9b067485f68ac6fcc03db623dc99bd6395cde143f0d2a3744eeb1597435ff1ad5bd2b50e8a5ed591b170b35415414ce271129aabfe8fa9558876ee508f92e94eabcd2d755986d5793dbe36ef83b1117a7264cc4d741aa6135894c5f5cf751d4965fd55e3b2e17060d33f45a91583d9f08278e4adb71e0e26e864e4e079a064d3583d96871cb60053f611c0284eea9bbaae7202df7cb3bb10e8565aa827c05b307209c890f73dcb4ea156dce923d578fa16fd5db779597454264772701fe9e9f858758750102f7da75791a8a1294e206e0658efd6c26e8965652d4892b7514c70ac83f0b998d7024ea34d515ab93f85c82ee17e43d01f5b7c48cb13b687d1ca54b1640141200800a2f56911a8b8aa82853069ddaf66012cc3f6c1f8a340bff67ecccf45bfd6a9f031f6f37f87d6d963e7f2e93c557fd3f7b3b28f4a672c4ea00829584abfacc4efc1c1ff78574e5b02a8bf9ff229bf1e50bcdde0603e3cafdddb374f19a5dbf4cdc7ec994745951d71ef4f39946dedf04b483c4e8d9e39da357bfef40ee0914dafe5369b2ebef0cf18d4535cf0ee296ee3bfc6bbe9040f71cc361bb368b68e1f3b38a5d0f35b357d1f3e7a54792d9b1af5a84f94d3616e5b9c577d42072adf36e96d8ce1f56151f7845991e93cd2a5f023c42e254cad1be990a36396d0200a21116a7afbf10c308dcb202fe115a264f12084b31b32e1988e892556aa14b68c83d657cb9fd74d80fac6266c19b17aeccd579c48551421065f59f90b0eed6e51a8d381e3ebd2a5fac1e93edcc52ba959fe687dd0bf15a62d271691236bfa5614a2d4bd80a91900b91bce59b227ef8b8fbc2bb3c221b1c9d4afe1926d7fcb90a5193671d2c0bc7f0f9fade4a8c742d8e9a8252056f937a771d53cc75ae83824c404fdefb0dd6dd4ba93acb1c6fcce3b7e0770705d6cbf30c9cdd9a02a6158afa4d92043ac6a2b05dae97856fd0008e417d6345036829d8cd37be6322a20bca1cff5ae6fd08c525c8fda31a151fb1661080cdea5858a99f3a5e25552b194d025048441370bfd12bd187aea4f08d8d340512e61a7823723b48770c7fda02cd45101b1c276799180bc375a6910383f93b60e62789c3407e587322ff0258d8c25b5ca3800a59d5d61655c919dc3ec1d2cc3de6da90a483b23c0587dd8060f586c72d02525b67f6d3857eae8e80ff881660026376734314003ea52e3a3654ea6b3c8b0877266d6239421926fbd2d53dd87ab40df0c19e466c623534acfcdd593eb5f72af43b400712ab7799aadb6f6da7e95c97310aa43d9451097f077dd6cb601b6a4724410864696511d90ae181b71b23af5bb7a2d0129da6d43ab643a93748c6768b5f5e91128106a363e5e020342a7661e8455dacf528d5b876b59a711597cd26110a0175b8daecfc4c646b395342debe32b4028e4567b4d7533b4a5bd22a7eb48187b1257b53e49356e85058dbe0f02a1d4fd1508319bf588ad3e4bc77a04565a3e27353784a3469f0752ed1bc76b49bae667e9d6edc955c53ddca6e9bae21e56dd0f4128f38ce76875ebe3238044eb5668d0e0f730a5b9e1bc2ea5d57e226dba3dbbaedd866cb4ae57aec32633d5fd150cb1ddb84aa5b77d4a686f0a071abf1ea6b5b74e579274ed0fcf408150d359f55be735298df6b3274069c3edd1752e7d732bad8f8f808110b3d94fe1aae62789d6edc95522bdede3293020746ab6eef674ad7219d6738b9e31a7cfe01564f314eda535a6bd02c2d161d4a8d18df93344becfbec845f89fd4a3acb91f32e5f7ebdc5e2709f29f0cadf0bc7dfc0759f5707a7bf03fd90a0cd1dfdef8db5bcfff255bd090fee84dd827c9da6ed737f704e010c4e42ec41f7b77e82f320b1ea2d33fc92a70487f7ba7fff4be1f8028cdbe30b103431fbaa0ab7fbd88c6004fb9fd4af5e0c1be917cc85d73fc4163f909542ba244883507167566c96021699e0754e8d9fc0f5edac2c2d4046b4a192a2681e1430b18d11d2454965df7dbebe52e9c90fa5e0de7efa61f5576fc316a36a17166d84f674080348781eae1d840772156751734d28d90cfd8bdc2cc791f874dfd7afcb572f7bfa39b94fefa9aacbeb2e6d8b11fed667f56b07329463e306c5efff263ac4fe08deb47c963970032bb1160c1d422119b9ad2497ed8a37e040fb983ff5af2b1fb7f80bfabed6dc251e13015dd984f99769bbaed1ec83c941d7e880834c29eee585be12f8bab6978e8f5ee0ea216f27e9daff5079901da399756d327c192f6a48365d869880322e18c572370fe3a0f724bf22fb7abc157fefada15473cf55fca1653a56a0464150784821d6fba4b0b0cad77b38815423bde72eaa24b5eb38a67eb1549061309d134405e7b9fd1d8a27af697beebc6dd580c624a21d7acc42a5624a22ce972f16a4a7c9c401b73501a611e07f285f42747c157ae801b8a2de289924794f86779ce4725a62d91aead5948dccbdd752219682119b45bba2d0c6854b04919639c40074ab1907f894662c258b4c6268f2ce49acc42c9cd23a5c674591dcb8bf0476481d205f8dcc8e8d0f3c89f0c2b5fd1619be27f8accff0745c3f9525a6865b10885b359a4d42f1ad2ad821a1a64818cd3109047398d50be4a96e37b6f5e9262853ee67371d1f8fbfa4e4d0ea4c31cfe6bc85dee47fc7439fa2b78ce2803172d9c5b5962665b162b28422cb943cf1b5b9e78b5baef3a517a9a7dfb372b6a7b8685c5ef8fbfbb21e8000d7be14c738ccb66a631ef7584aaaf4860d0740bfe0fc21dde115d4374e8d5da5d58e96d319179a91168d93c79f1d621bae6d1b792bd9f90812053ca4ed4a90502cc2536cb80008f171fddf736df8a7a62986899c8fd7cad17028b0ba10d08dab614602261ae2b98f31d3f4c47d68de2abc3eb6a4656437eca6b205bea11d53e8142ae95be95b3da8cd18ef76ddec7cb851b7622d506a87aee324bf452277d932e4b7f795e41d434ef7058459d3d0eb7ec64ee8d4954ea0c4ac23a448a20d5794dc2c380d9bb3cd28561104a0bffa92c15436b516a7d459e265472d9540c1c849657fea4b25db5f08d377f8b0a1dda891a8f582d5a585bac33aef7026b17b73e43d8e1f540d990ebb9fdaa4399a9aa65fd4b406bef88025aa7a191dd2554c88ab39a93b696307d3656fa01474cdaa63fa00e04ef19ca1d428e60e2daaafec19b7b505fef43dc6731a6c9e3b8bde6953f40b7678c6970b825e62efd77987ac940706b21f5bc8b4e69a19b717a4bfc659f88d2579cf97781dbb9134bb82dd5ff48752606c331234c1a71bf3adb953b59c563fc752e0fb1e3982f83d01845e654fca040e700e69b193ec82fe3e38eb87f456078e88d5390f0b20cdee94b3ec55c343ff114e57efe2fc35ef73a7d62848ff7dd405f6c6b769349df166b12aea1338054674c358903cf8d8b48bf737394b7f744544d2feac34c37e72c9f5a59bc2d557d23962623bc62fd3efb72b6140e3abf81fb865ca7368ed6d46a7a85f224ee5e9f6884aa0d9164302b3f80510360bf169168ec1a5d8b38bcf19e32d84fcea3be09d1bfc7d701b3fb9ed1d0fd27d9286928501bfca543ef61ed20a1d4bb7631c925b9ac320c5830d2cd81df5f8e8e0bedbcee622a6ffd305a70de82a53b876859b3abebc5c901de69fea666d7e609a0891b7ff40f467483b87bd967f0c6cdab30795e5d715d559c9fb8fd95b789651ab5318a1b92cdd0db88b63736c3f12e009631799c125d08ea60d12ea03e806a438a3557d2fecc8dd28524555f863638676a8df56ec46e602e7122d517ab4cc876155f1fd07a70f50f71cf09a230f5c8864f3f8cd2325a822734953e5bd85aa3ed48d4772516d543e691a7c759ffbbc39d0375e4972e4a8173d7edb990a66e54fc1212888ba79c1581d7bd47e255084917dbf56f8d26058f929534ffb48ac8c558bfa9a8b9db2722c52df3085e1ac2a87660af55c4d5685d8c849c8634ea0cffda4d91ee1674e2018cab89a554a6f8a7d974ecb45ac30513631651af6660f9f45c7b1919bdcbe29fe62980ea659c28e58ef0f6440d2a59b764c30901cbf4afa9d72b9ed69d275310f02fecc99548619ba50de5d1252ceae54035be7437774dbeb7799901171b54ad0d6540098b1667e450fff2ab2e125998ee843e44e9a6ccbaf69aa42a7108ca0ad3db02fd1ce0ee376ed3d0300b7fcb421f11af3330032b4d9a7f22415f3cfc5761776e880566d7ebb32956d0d9a33534d1c3e326b9faa744da12c1a491fcaa50fb5271250a65ea70eb7a5d67523797dc0ac05b7593602a46634c29781b6325e36949c508e8af3e76d84f534a897ab4ec3c124abaa0e367cdf1d06b97780efac5528e477e88ba1b87ff8cc8901babf44e0b19d6f2f0e551212d12a7c995638ed8f86457e555586b1d89ded3506731853815a27fe195ab9dd25788de93121aeed1eb4bf8172ee91990d8b7c9b3dcc48e6ae6456b68386e3c91761d6bd0d43371515b4134bd8a59886633ffac12576c5f3a09d7424de3ffbbbf4793efc90446aaf3684ce09a50e73430aab60a5e6b588c99da6fbe825c7c9ff45449df600b20bf77ee9d039497d61e2d8ab6ed6ba045828635d4907ec5c7f580701c3049b80284817bcca4506eb12cc7b54e97e483c21ebacd67e2ca1b565e119d49c6e84813ffe9da21faddc3c4099a151cbc04f76f22472703e6ec03f218c3e5722c66d3e0988b2f49108a13f32f5445de7e68b10373eba433ddda86816c6bf2acdd40bc07d9cc31f4fb93e4f2c4c0c41d57daaa55b40b8eda685bfa3be43ef755d875e4150870f48268eeffa84e9f725ac38360fe6c036d711cd0d67cbf85522a2c3788fa84d802e485ecf7b241858c48097f055432227d19ad9b1d8a0046ff16f668c50a9961e4d69fe24f2eb0f0d8a215c99e104c785c4f26970e14a788c8ae84f3b3cf111f016610b17805e6bfc7509dbe5111a3f69f7281235e1e91ec8acd47d273ceb0b05740cde61c2c8120f0f110808bd24ac59d11dc3821aca83849cbf868118bf0d7d3f98633f4a407cc4ed7a43d3ead57bdaff4eb2e5bfeb932fba6af2f7bdd0bd4c60deb887a738fcc0dca647b4959d1ec76ed97f1e0b72edd5a63924e0119a1e0bda7706e1122d0d72c3b7e0802876cfca8714a0dd5fde04bdc655a8b8a984e063bb256ea33c6caf8017a2d3b6193a868f6494b506c944c51740c6e1fbc69be9c859daf3f16d2584e374f35fe6b8521828f6023f939c68842198291ec47d82d13c9355a837cb49d75475a6af0c81b1bdeb81c42ddd4b186ccea18a89ee699bf8c0bf77c626501dadd9e59c4ed5aa4d9b03b8e89121bc67dd8dd84ba0f3c18014b75d6a7d5f0eb0981546063bceb4fce36e1d4a869a4d35e10d9cf3b03a7ffce7e8dd94c45f83688e1fe1a4f8f0b3712865e2ebf17064cdc3dec5709d3a1a1b2b2426f4846fe4c19e7791b9b3116a2cdc3cd84cafc528a3bdd167a63b372f9721a46aef15663c7e7615d6023ec6f3a368c1c24661a128d0fb5f5ef0a34fb7a68339d0ad5a78bd3a1fcf0561291ada4fd1269709e02076abe9eb848fffce711b73ddd557f01aab18e773dd45825174035165107bdaba788abae04bd3b2bd56fe1b4107deff3e2e1eea6bfbbfac25e1a277c02d4eaa3f9788a02750468e6b09a77083a6a047e7945c50f979a82f21c49b4c537359682549599251ce618b011554411cfb1b244d6980da2a69a45ef3d1c0a708003e96e4de7e4796bc52ab1ea4a2104a50955d5cb989469db0f2d83230a7024c2be5108e72a04fdeefeddf883ebd6abbd52f757d6d7f25e51b7bf181ed348a838d86c4a54d208a2944326018cbb01fa3b254459404c31930e92f708f42ca7254892a7b48a3d650cda9c609b016bd8103ecf350f35795247f6966aa65ff1929d68ec07e65df15ee9a609331e46676e78508e2bf29a6564abb910a462d88c01fb43d329d436d964efbda59432c9e20370049f04f603021aca40426d32bede257ec8f48ab60a81aa4157d2ccdd0d10cb4ceff566b5e6b9905716cad83dc0e0d21ad9839858a2bf436640a637cf6a0d93600bf996dbeb02ac4405742d234975e5402412c50464504480cc5a6b2d50ad592f7119888307d50e90fb8e186480ec430681206dc82fa0404005f88024401e12db5af08548ab2e0d13bae60908b556fd839229dfe8960a7c7001103ac0554bca21df9c3dafcec16bb797dd25d28a446b06b6edec1b570f6cb01561db85a264ebe11066b6b62052a135b97a259feab4d43c2500fec1ed5e85cc64ece02c6b00aaf7822ea2d60a921c3292946f690ae2fa976908fae1af59e2065204c1592e69e41bf8a0830efa0c04414b53d15e10ec85e400f2e74852d8735fb200638c31c618037170dbf75a7b814a24510014cc8081174a5a59df2f94958562c837bfcdca0ae2b6c13718d61e5435e811fdb7a1efa5ea1544b523093b8ec837f06df50ac2da0dd5a94e6bf7f42fcdda06e1738c3fecded841f7f97dd8bf8afdd6b63e0bafab9318804c6f05d885dc640d35087f4023e4a96e8bea3178aadb92915dc8f549be799341ac576f1200f9067ead20da0b05d666da4276a8d6acd76acd0a69c9e550adb5bbde0cb97a45412cd19f33fdc412fd3fd95620529f8c2485c9183e02a86660cba50c456c2e324f7568bc7ee8a90e0dd5d3f184f74563165169108d8038d3695175104559a64e3d3104aad72b8ba73d05b22003183ef5b61d54b7ee8d2558fcf55bab5bc763071b209ff644d7eb4ff5c1edd55adbc482f6f5c8ca245f5a85aaf20c8492db6fa05fcf17935c2298e905bfc51f13f4afd3a00dd7e96f28d17fc90bbe4978d0cafdb70bbec1bf8086d000742f19e47311155ffb915f4692aa640c1f416b0637f0bb56514abdec81d8b5efaed59a50967cabd5a8b5f65e8bb3d50bf16624297b9d00e2aca621f25497060a83270106d5da750e252e3b10870aa2faad59c1187b4c53d1df1ec473ab1848ba3456df34aae3f27a3a5692b41949aa5a37d1dfe51ef770a5b49a91a4aec7f01152d891a4c09a81e79e974b39c8a3217646926a135da29f66fa095d095d39096146bfa4f0252a84995013dc2b70184c82de0a21279e8cb434835e07fefab58d2ff83cd208ff256f69895c8b73a5dd80fedeea1863bf98620dbe1066d62a5fb71a84e2e4b6d6f6f5be77f6445f3fb982f06eb55ab93a7decb5d6ea4454441a7433dc5a9b0999c94f240a29c9ed336befe7e16bab9610bf21e857129156db7d868b16d2ebce84fd6df6f5ccd6d75ab5745a37bc445aa5f840d2e5caaa2b57c78b935c560a4ecef4c89a5241770296d41a158ebc11d3e58c1126a9ac5c162e86317cabdd2ed06d696eadc5350bb0a4990293142142c40319c4636a6510ac54e30585cb26c34c149d39c296d284174a2d28a6aeea6f6e53a273e46f6559eae810512acb058cd1a93107690e4ec69c11c2847861533170d812dc0d9382b3615c706594b892c2bc4018be5e589a7d61cd10bfccc890993ab2b9954b1232ee4165c303abb284bd345d1b52eeac031b9351c360e0c8b026187276883aaef7f585f565c65a7bf157d8979a6fe6799ef7816036c090c2300c65229810b01e198c0aac0a98979f9f9f9f9cc1bcc0d0808dc1d0a04183860a464adb86e9086b12755f3f92bea270412878aafb52c266cd1bdb13dc8604dc068f0fdc26076e03f5c2060449f925c3502e99626392e304cb41222748154521ded49299941997b032615c1efeb4441b95af1f5f510f546b12f8baf1851bfb1b18f65427078d9c3272ba7cfbac922410c3e8cc419a830b81ad6a8a4d08d5234629cf17374ecc4c098788e001cdd5e71b449f398b111b3e18dd8782e0504dd0af510f35eaa1c120d9c7212888839d7d08b3f73c030db924914762cba5ab0a98fc817cab0501790909faf1d5f38826623fbdb42bab6bd745064806441b946c6b926f05b8304010e95714ba2e23d6b69567344457ab37f26c9c2ffade888271f6edb55b7c5104dec8fb69916948445addaf83f5da10883626b97d66abb61f41a5add65a35bcf55aed07272c6a42d040c66b3d14eb060b55cee6d14d74535a67ae0d9493ba99727572907b01038f4a8e474e890c3b27d8f9e5ac9c2470b016c02a1255c74a8f330e948f25a7184e30e70372755e9c7abaebca19811c97ad3337766e39c99cb95c97b37339b293f8e4a29c5f7250289e3a6387c971a08d0b4d6294f92145eca90d1593932cd725b40e387dd4545184349533399aa74d2873684ecac6022f098a4e812125e5f4713a97b301b90cb9761246bfb8fa044aa795a8988db38d20c06a03a60db927670b66fa85b3079133b73586926918b4502f37627a085503e6dc71622585c8751634e700725761de50aede42d784625f504c60319090ece82221e754e46c3a676ec9d94072d4ca996b1c58ce3267063406addd99cb79d13bfd8467860a678e3e69ab14ec60da0585734c379d39386067aeb3c6ce386797e91044a95c600024272dcc7d9d09c869c9d19d9cce33078637540addd3317427fdd24b754c8f8c335752acb042a72e1b3bba8a9e51e3e53c72fe6893739c233820c849bb7214a4f172774e30c7845ea15927f5b2878d99d30590294cce496cce49ab206970d234f77e3afe63932729cca163e3d52442209783a2d12ed66439c3a8983387651627eacc39e1ce38556270985c4c9933c2c3f19ee73645de9b31c2db21a7458d156c4128141b9053a4ae9433945983f554b726ca8f4adaaf9a286974e50d3b1998e2844c580dd6a8e60c53995b03e4c7a7ba354ed5b6ad55e55936954d69aadcbb01351580dd76c0c2097df29708e3ae569e7a74f0a07a49f5d587a27c78fe8d627d6dcf6f50ad559f40b68e1b9344d7f189ebd80357670f63a9b57660bdbaadb492ade5d75dbcddd7fb3a514731c1370dc4175f4cded103f286ffda296289fef60c3654d043105c41677fbdd28a0278b4c88ee8e08c5b688a02ee9ab01cd1d9d938c106d49c393638f8032fbabaec50129ba366840d97bcdd7a20fb74c794f5796a58d1c082038569c9c834e5851bcc0404000e2822c606cc489a1f7242aaa75b421213d3d10c0b4e06a61647f7de3434dc5c11588d45dd71fa121287ea6a6c097735c2d0b0b9710fda3181799fa73ba62a7ff35274022956a8844a035a98e244513903c74992375e5ebba5b1dd52938d4d8804a703e378e06c06e2ca1a720e8fe07078876b4ab271ed70562f80a73bdc1010bced374afd5a15d501df5ffdf12561bb9ba4fd2c6e5737698ea041a3956fb91a5df022b0d0a0dbc988b3938164cb1af2435503638cf1ed70ea94f1c0b5f8763392703632bb195ffee7e96ec694a4322cd8c6d8c6ec94bcc031afafcea12d50e37e754aeb0fdfda1fa291ad1be991d65a6dd0c7ba881abe25e9102e5bbb530af3e2d39d52162b0fa8c96262430718205be10a6d90feb651f29eee94aadceeeeeeeeeea63a6a8d3e25bbd80a6206d415a8167d6fbd679f375a073fafe14802246bed4d4713f5ad8bdfccd2ec539b01032e7a3cdd291d79513692189293c3d184b54e7a60146cf28215db7bdb12b5c57e6ba7b576f3a8607baddd293d398db0d65a6bed968c9fee9470947894722b28c9f091f7fcc5bb24342f7bba4b129382dbb2dc005b0ecaa15d1294b74f77494efe56ba90e46fa5ed04a932861f729ecca35c799524c3b694d4428d18d51b130757a9848c102fb61956d23ce14155fa50a19c03048a470a37cc183196cc3c315e64b1c3244e0a6aca2e664a295faeb0983daeecb460735ac1dc09f92ac17684a3ac8241030e0ca43978ca3a5f43d8985c593274e52e0b10296617931f53259714be4c305fd0b10389a9dc428a619a90472aac44a16b4c2b29cc912d245009d3c47603898985c8181fb67387c9e6a849c99152a9678f39858e0dca4d0b68ca27634aac2e495e306f58915162a351c47c8342c906aadc72be98612be1858b72471d17e0b84893a38c090396c9c295f20428659e25a610236282bc4082798e50da71812bb5b838ba72078a9c2f6bcca918cc2c30b61830d8784429a5aa4c24165018d2a3470c39b0d43099762d605c19b3f5009b6a23e74c29b6339b6831974c797281c891b284a812cc092f9c6cb83d364cab3d493ef4849993c5ab44b265961163eee11255a58472528a49a2470acc0fb127734dce84a1474639a6a785ad8598e9e4cd132e3364a47809b3624679526651c551c13403a424c3c336c20d332acf525925cf0b5b0e3b5de2984e6a82982959f8f294432c5e7278651aa932674c955ea24a273e969e909c34c696cc2263472ae0090266f2e82acf6cd99ec6bcf0a2bb6233e1aa6c5255de99ba1365d2f16112792a879c65f02cd5c073545ae1319bc06c4d5d65922daf315abc9463ae985e57260955361c53e59e28b3ca8789e7a954e1b4b9b8b364cbdd392aade03901ccacd2d5c25679648cb98217dc9512cd559baa335368a24c2c1f2d9e6c36ce387696ca37768ecc1c1e9b0e302a5d495b25d718938917b3ce95d2cd559b2a38536ba24c2b3ecaaea71a67589d251b8c3a475478cc12c04c2e5d2590ad126c8c69c38ba974a5c85549a76aca1495a812061f604fa69bd34c23b654fe103b3212ed9e5bdae798835aabe5bf0736509d12580d3a005aa7510fd5ab530fd53fccc822ec065f39f8aa0297b556bbc90e94be1d010d61bd7a394443d0c7b7471b4c82bcbae184e71774a72d4f773ad63c039eee743071acf7a7bb1d475ebc333be219fe661eed5e0ad0f71cf44b43d06f4f71ab8ba8200e7aef44fdea462060f1f445d4149e57cfbda741f6e2f0edba672f066b2de8b1cc2fedfb482b0b41ecd73dff2ee897e679d05f32c85aaa3abbbf5eabfcf5ddd31a11cf9a7641152b8a3eeb4645df5b3ca2c0d6abd75eff76704c7167753c71ab4822530fedf4b675f2b9f7f50718d93a55cad741bfde3444e8177c9987b4a29f6fda4d067afd79f8b6980e281db86ff7c6beddf37afa2c76fcf8023cdded40fa158d45b0bd968d24ba7be620f8854dde46bf79ee5303123978947a18fda3c93c9016f41f088e34702cd16e5d846d1c1a5ddc0dfa6d44e1b9d7f5236ab7fe91e2877b3cd1ee919e75fa91e8d0e4adc353a71f60e4a29f6feaa1dbc11c93173d0791a72f6281c23d7d1c632ff3d0739079d143bff9f82d8721a9211465b4998fa1e8216de6e38c06bdcc43da8d05d8e1cdfb79a3fb335f711f03cd380061fc83431f1f692038a290b948fed06e78863d4f45d1087e74a3eb9ee823f369998ba3e8230d4d84a4e83ea2288e331765b4cf7de8480b7a198dbacf38862842b0d6c21926c70e2e7bc1040791a7cfe28b3ace53fc2376a03416df23099ae74d54bdfd03699edfebb74a3159d46f9d08457bb56c70407d88a7bb11b27ee714e694f51d3aa8e8dbe79ed7cfbb794ec7122568d1a2858bf7c8d9075ceea7ee7d14d3a0ef403d50f77639afbf4ec35aefb8c147269bb94fb563079ecf3ae4b16d588915fd9f7f7091653ec296ff5c7683cc5ff1861ddc121b464a650ecedce83ea52e8e764421238dfa3b45ff8cbcb5254bb47b200d6560fd3c046927bc15fdb3b65cd7ed05afcfb07b8e6d4561dd5e9a11ee6641b463ef89e0f5d89b4c1396af1e3279bb3b897cf5d0c51fd0fb1b4d84dd32df50d44fdde87e7bd1cf37e9e2471a759346fd94bc591abd61577122bf08d543ff42af5eff0b7d457fe8962422896827784abb854e43af2e86e058f4f32250eae1665358f2d63145f5108734a3fefa3d82e486131f1149547d453f2eeabf41441a74fdc3f5757077425d10cc65592b55dcbf95290ef04d0e0de0c38d6cade592df62aa00a7d4baf776f616c4758f8487e997a2c5ea15df4a5e3a14f68d1eb0f803807e1d743c9e188bdaa81a358aea449804bd2c22ad208aaedf0bfe54500687d935cdb94d5d1f3edd35698979156a674349d3111b53029023a804cc983162e8146d800093160000180c08060422912446a250dba90f1480076ba22a604026a74a0261280a83180662188461000040300060100041188ac11854fc696ae111e10cd10d4adfbc73855d6c5157cacdaeffab8fd83d5225acdcdc68de077071832af5d2cdfabc90ca8e2f7f8c1279d154a6e33d9d7558cb590c132fc61a6a10901aa598ce0cc1f20c0ccb2640a9b6728ea42ba70bcbbf03fe651d285140cc105c091dacb07029941d5b2f1e33e25c8b669a1dfc76c6e6ac9840555cf00274f7292556e0b781ee185bca54e5e5559c2475ee2120161b6c648dd381deb760b75ee8d7b9eb6ad3e9a0d46f6f4b2f1cdee79429846ae5f5beaf9532df5bc74d7d3181fd89326ed2c0238d99ba2300cf3b1c8729d8563f61c925b8630918259a2b756a1069717ea2177a486599dad36d5b4743f8d45b02eccf814f269d4916990b8615c0150c1805a6a9cbe9367557b336dc615b3773ee07ec408d282987cdd98a249f89508a3bed15e2d030f1b7c65196289326d671f83f4c878ac08855dd3d15145450e449dcc2e46af93e83280e881ac1020d2cc3a45c96ef1714c1c9b4ce3e988238eb9141308294b8486afc40e39761217f810a6ce77e0eb6bd62d73bb0bb5e9de13343551cfaf0293203fc8ed9a3d3179c0fceae403a7d1ed6aba382889dd9c365da81c119667005bb2a6264678abb08f9c4f86c8377f47c0c10759f5adbf434f2d7a12ac4ba24b2c88528832468a6dd6d7603127a32bc643541a8053100f150193110540072110aa43d4d604e40eb86f280a677056eea8d98a8091b66bf68ac3d5bbfce958c2bc68ddf448399cb0e2736b27cbf2c090e7c3447f81609b8fa5236dd012b3b2e7092ec10984d1d100d3e4cbdfacc0a81f6b55b82fa622ad9fc8283971daacc47ac8a602cd2167804472ce35b200b78f860d56d07c8bf43cc5c36226dfe2e8603a3e007e1fd3ddf6f00b8a51595b6d6bcc8f6586c39f7f950014c6acf1d7ee5dfc5b21e7639f2faca85c490d85232a757185e1379443f4766b451b3978dcf28afe121259f5a428cfb9b8a05fd9dfa241b6f91df05bff4a848e24d692ed71484f1d701dbb6240c88174a71a434aad0b97aa508af2a69839902773466c15aa40a7e8ca38ec26fb4e9a88d3ef3543582d0950342440f1d07de537c36772a18692039a61e08724eca09b2e20a6bfe040f4c0cd8cc82f0e68cb5b8cb10f300857a0de483f3e358fafb7ca02f03c68657034be02aaf97dc25cbe11021142143908d6ff1517bbb0380726303058f17ea7a30baba110dafee98c9a78d0289b6ab0c425e5b131539ea8010898a0ccfda467de2acc708de1b9305bed8fee4859cc9b998872d7c3d40427dc96ccc69cd5f37ea15ab0c19ba41203c47439b7dca07b3e5849fd63221580870aa7f1b82d297dd3be103b97117fe3305da99aaa26500d855c84a1bd93cf9264cf7434dea47152942bc4684482632cc0d2a8da1d03804eb8638036b6985d590f6dc058877b64e9487a434499188dbbc8fcb1a8e226da167e70e075fbdf7c048916f998a9f18a96f32da0bf692e218396ae83dc27fa11a79077bb774e01c0526fdeb10ac2d3c9d01d230d23de224ab256f81d95cae2704eb805268241aef58b49834cfce937034b68750c284ef428d3655ebf60466ff44253edeae876ef04a7308533c65f3a2191604fe675815ef8ad254ae12403751020103a396798a16f409de6c177c113fb874b652893761f5aa8c06d4372431fc9c64b4394024a02263f7e842c4a28b36ec22ea43c877f561526c6d4223e0ccaaf6eab4b6d5a12e11af82674ebcdb3e5889b5ee4eb65b828ceb40c77c219825f6613dcff4ea2a0e0d16d1664db8be1aac149300db70f56bd3b7d8406a156b11107e30d626d10ad5fbb75bcca7bcd41f140fb3421d85e5103ea54945bd62d5749a7a8423c7360205160497a5d01cf00bbbb96cf0a03812aefa0931a6d6917321ea4591dd0b0511ecbff0c3d2f7b4c230ffb2ffff626608b94c6fa52a698bdb39feb55787a42fef2ae9f537adb7d501c308a5bdb9b989a9fe6b57f3b49ae23be0e1cf1cb01ddfce3921218a2dc91280dbd7b89357640a411a0b9f52a181364e7790298afa9213bde4ea2c53f71d4bec974d3e234dc72a791404ec71b1136e8c7613bdad0a6905f138d70b201d85633374c3f9731ef882e7a96f0939c5238d25c881cd8050ea74cf1a34c6df452c976e59fd4e40d99066c1ae90d6dd1352bc401759f0e42a8abf4adf5b6a0631ad27b030c6507a22a05c8971705026832d817aac4ea137775eebf5199d576358929b989bd6673f3287903d8509ff64299b3ef273ef634a9e55c20e7dc0bc7199779071513d208746ea4342d61b51297f052a79c589f141f6b48fb5885a62609d4de4aba808de60b2bea5497b2599df07bd949890766321d1fd058489cf8c6007b19694f57d25fcdb1a1742cb12875d87a381db63700d6f236b9dc7a2cee5c5e7f93ff13bb92852ce48c39ae53f3c1440ce67f81a7744082950d5d7e2a51a26fc946437189e0e40de978a6ab75ee422d02036efbb1b301b35b071867907547f39288f674ea7a324062ae8cd21a2f510d52a46d6ffa945b3991c109be2ec2d87bf52471c8f25b4c44964ac3864e66c12b6cc4b21198f8ddf31b33da55434e883a41ac67fa30a872049cd9cd3d8845b4de12aa4f25ff08c414f9e142d4bf7ccb32ec6b4830a392ee26f58b33cfd46426017271918797bed8d8f4bdd09569ce95cd8224c843345b67e4d1bc6643d39e1813bfeb1d249249c56e445d599ba67895a07c43fa7164723078dd1d15c1e9a6bdb2759666c06d0a48b9cd36ebcc7aaf844dbe2783cbcbaf3826f36b7bd63331829a9e5a261044adf67f1cc81a01331cc06ee82b106540203e234cc3e20d36c6c69d5ac98c930b87f633efcf8945b08d4a0c9a8a43c37d30eb00a4dbd7b61a925a5ac77bd835c4cd7e3ed79bf85bafc44ec9d609af201db1c6bccc60ce906ad489d9e9674a526cab6d1c23321b4c097054f62f65244e6c0c7b559d85a45a8030ea72505a4fdb5ad856177eaa9005d99a8b42a9885af4d202eb0bd029488a5019b0f31abac32b9376389d784f8d4375dec91a61cba3fda995a65e3d32adacb5ad33e1819f843c288e2cbc0dda463c69b0653cd530da60a1c59792b1ecf899bfa7a9d8fedbca79893e047a31e925855e70ef875be3d1eb4294eefcc6d1b38b092d854eb75036bc24bb5475a066ae517b0c869eb91caa8a24442f68899ac572c3a81c16eb4921d276afb4ce383f741f8086f2210e3f8797928702898b743a53c5b4d59d8141c420e221db033f651634ecf23cd438eddd1b3d9517f1ad3301b7d514b68d7876e6fb230092a1b5eab1f8c9dc942364eee66e1732b188514d13dfde661ae15713916075a818e245c694e46fbad8a73e80f074caee4ec23398a30f83b0e76731f2524a8e1893fbbb38cee05a0f159ff844817bb5e22801c6eb222bdd7b528476a6c1920008cdabace58c39f5035be4f5afcd1a294a801a6f74d42b20aea1440aad492cfe492a60c503f4eff54473b9a1bc1aededc5249cdc72c7d5bfa1440ab67ca8f334ea48c93f7616a9d4b9514357a2e55b32c4f63e698d22d754b10bfb81c97966f138222445ae6959923db6693ccd474dfa64767cdc863f20f2cd1682b1a82f03e652a9c5f080e660ff75e4549610143e1e35dfa75d5bdb1c1bd982873057734dbb6530894b52e6c9912c8b9d45182d89d03208974d0b8749a1099cd4a3c3317a5c8bed30eebaedb7dac9ef639f070642bd6013df7b5cd1e3b71685bb1297cc5853610912173779da50f3f5dc400d1b30f55208ef98e7e401fc5044421fefff76913d8779e11e93bfa38059a96cb755ef7878214bfa9d04526be9866ec0d1c136fdad2da0d20b60e4d5c5d73f35dd8684354afb2b4a44994f63846f3a0d3b5222caa64010772638ce33f271a7f03b649bd8ae339b5a2c18fa4f87398839c87ec7cb41dcda1fece1a80ef23c340593706486b07b1e18d80f827ceda83351477e8ed76d2375135df7626abda085130034f22880e054d6f84f18528d81c5adb32cd85275d11758c30ae049c7225ee1e0311d04db57dd4af396edd1bbd36be9ed649f12c82e1065393afe5f314c8db69cc2b4f8811ca4e63115843018ebdd64a6879c86fd4db45b5e452dd8c3b58490081cd7b08c9d02482c9c20c3d9bcdd15723bdef419732b5c417dbb7f9f63d471a287a80b8563e2c19692e596e5038abe631affae8b8866e02085530f33dc65ef6031ba69c318ee631cbc0515c723d82113835ef1d998c264b4909698caf265a53630897a2a495c5c716d5d8c542e4233ad5d542eb18eb04f0d00791e082b988b574bc3f128f9704ead41cd77a9426844103a98167d44d97ace544a52243e87c04e2d94d18cb89f0754e6b9a69b19b7c7bf4c58b3a37589bae0e8c8ac3e927a4b25190d030b0bed72c0ba734409e3b68097504ae3b1f8a48ae31e323b0fe4e2a4d7027d0ac60acda63a2df71d58b61c418ba08b0ae987e774c204c8ec405126d35e30b300a838fb01444b75f7fda0e2838a3c749c6b9c8cf04dd644420a278bd85a41d38b81376fd08300f263e09622509dde9e1d751835efe0d7d56559986d160d432021dd8df83f3e41e32a9058c54e60994f8cb24978289123316b9679a738c056994a4ca0b0aef3fac7013f7057a4bcedc14765d0ef7dc85013dec130b174e3c13e266cfe592d74496f1decd8598c8db4763abcf863c878c6cf804f4642f306171163a8ee22ac2d1ccbc1474467f20f508bdd7098f732c60c8f41b303fc6113cc74afdb0d8a8af79ca06ded9c1497f6b439bef2e08d0d36a6a03fc0888bd6574017c5c9bb845aa2723878d0857f7ad68bb4a9695c7ad8f94695d6d7e4a38e520ac37b7c7c1862419144a37df5c014bf1a6af88d38b2293b0b2792c52a82f7c90081a0dc47cb1760521b1e52259aa8452a46de052d92140987b1349d1c58dd979e0254d7f54ce0c772c3dc9f5364f3fdb2c89de47b390fe3c268438b06a516647b3aba8e9959401ed982bb16b901f496afa453e5d6b32bf9171c93f48cbb3a2acb7c85c2ff7989c71b011db0e9b6d61b62acf96b3f08619e84fb1a0a5cc13ce9aac1bbddef4f8ce4f285c1b975271cb9c422f93cd869019817d34a5eaa920faf2d4b24df84e4a0bfa8670911c6f3a2c42d6d46c198a021dbbde9d046e1451c5dd60c5b5bd27344f4a80799f54c7526c7f4b2746ce44bd45cbeeac757c26fb9660a3587353c0aad0633aee0e4964d08e25def8072bfe54b420b050d282a0c3aa32fb2b721e96d09bd1f9c48d66cf325de169cda579b32f3ce64c525c773d0f79d54b7e17e0b17eeb4ab505d72114f250d61c5645b96e7f612524deeeab54c6a0bd71bd661864fb08baa6e2a078df09d9c683f13249f2655f4d018a83bdf4562e57874e1e34323d47a49e67cfd546deda6ff61d1130b1da5694c65723f416081d3b6d89f2a7cfb4b0adcb46f6e4fff19877ae73cad32226ed0458479ac746d41a3c22b45f1dd622856eb457ea1e4a0d283276fa9d91131b4e4e02072a17cf9c2b6e5d4953de16e98e34052b61c3edc5efdd4a22989aef84692c3eec2171efac1a43d46c4804b506a4cc3f20efd2e1a8383cd313bdecb2840899b0c49d74f753eacd82fc3f1cb1ee71cc385a84837be940b9a5b16da816af903ffcece73d13f6e993c40d7e9b9190d917046adddec151a39315bc2f9550c75f0c34d67d42321da1b751fcdac4c4de99b907358a19584069f280ed63ae55f3dc88eb41bc1a75abc9490c5a8227dbd6a79ee2d481c4fdc1989d3c4f751a0ae5e14b9dbf4ed15de08ef136c73e517c36a28ff34f6b5e3a4c940e6f5c07990eaab578b23c8faf347eb4acc01177534c20596a8792fa5661ee71b96d0dc71419a2fa94b71f0641058859fc6273452ecaaae827f53be886484806f7d5764fe0c38ced1bec1763a8c6390b2563ab10bd05a245b66c9af386e6ca65d23ca45d8f8ace2fd12423e62e9152fee9079d7cae11ee0c46404c63f16ba36d3269c5da10f215e23e5cc3bb1bc26bedc6c97e77903caa6f4933c07629f00943aa6f11a79c443bef83a0bb521de7439a2e061cc09ba5d8739a15a5196e7d58c9a45f178c59dd9162efa08e0837dd0d3ffdb3f8dc0755158a8ebd9e7d482e1221b461966a1536855eb9333e1abc4a5ad08e5771fbab8389c10e5d13fe08f5502abc93735d579031df138cfd4655067855640cd072c7ac4b62673cfed9288feaa01a539c6e1c2d0783946eae08666b6efcf5ec235a83213855303ca62777f8a70dbd9588bd7b2c55f4702e113a1442f600ebf58410a41a685c4d8a99dcf81693aeb1d7fe9647aac1cc74fcd4f9d3a40047c4d99f562a720041283d6325943605fd7c171ddfa2bc8c82cb737beeb172c02b4ceb2bc618e63a86bd1c3d95cfc93ace95110ba10286d1830410fd85efc91f18a9cad9363b419e3a28f62fbedd09c648f5bd30095a7ac99ec7fe4e9ff83502a40a6581eedcf45a2d591bb0bfdba27f6b2f27486ce5a095102841bca9e1c09043f23b71d2aaec20dff05c63c222536acb6efa65c672062b23fb3f3f334108f6d36e2ec5fe0df601ebc87ec3a22a4944b6e0f34256bd081cb00673e0c6fbb9f47ef25965bb915629560cad0a42028f607b5905aff98c05a7e2ae8f57249a5040da96205f343ce035a89809c780b81e47aa17243d11083460aef2f99e399fca13aca616b53b2f895e37aa65efbf75a30277b8834fc5e873149fd7c666d2a6fa281806736265093ef5ee44c3ac18a198bd0e7b582d253388ec7a630ec1ee924b60721f0b48eec1851c2826900b68815eda050274b4f6dcc7c6dfd4f1e0cea735a12bddbab9a9b3d977907889782200a117f75b1b8778b816075e543571dbe5c96d11384bce3f971772bab81c616dbee9f29a78acfa3c5848b5837bad7bf192660a403dc88ac997c4e941c812dd4889402a349e02ee3f56ad1108e8c824c58f2b8ec01582ec8239e720f0ad16f10b5e14249364631e181e626ab5b04dfba6caec86a3f05f5027171c62acf2e1c2246e4487d39655f218faf1519a4b6aac9eeb5a2b1de13c2a8591c234a89fe2e04891ede138eb07296704451920370205497dab2db1055167210c6345eee3aef8045d2997921ef2a240d9fa8540b8c183c1ca36f44d5e8dee48a79a20a5a314609e767159808b47a4c2e2c0389ac983be28ada68a5be3db009d2e233058a0e9eb887203061f5b0b1a567ae91bebb30cd7a3dcc9b86782b838fc2509ad9ad6cec539bacb0970f19ee0d66d95ff0a3e7de0ac74037b8f9e73046e59f95bdb146499a176687bbc6f582dcfa49013d47a66a0a1a393c10cc2efe68854a1e66d3a25c4cf8854409dac16c0d82a44de006faf8133b9c1bf2ac77aacc6809707416b037a94ace98895a81e7f3b815a2d03bf08f6be3cb2a5799fe1d46fea7c61dbf9f74fd86549e24c686199fef9275c49ecae94726cc59238b2ada8beca99b882ed9c6b0b6ae9829ff8401b8d28edc4d3996bb17f209fb07f446e0821b00f1dd3b00c78c214c09d2aa3d769ee8539a846b1dce63d83e93ff6ef37b4e932b9fbdf5c5c807d02bb9f9e26ce61c44a3184f2754d61a5e791cf609813e68d498541ccac3e5a4fdc134e8fd5062fc075cecfead1b846be30f65e15a95619fdd85a11fff33eb5866150176209bb004aa0070190cb867409e6b01e969569b10aa9d9846f32209423de08368ec038fdd46d29217c11b408c08b003499c526c21eb776ae72370830e2c7ca05178141f819de12234413218bdf0fb2ede2e903ee0610af440143f41b30411f18e7609abf9dcdbec32dfaeed8cced654efe54bb2e828a2330709f3d3816703eab66bd880b27ac724df5108de342f9d13936c40a84de311a120854373bc648049c15579f3dbaf3e13ebcd62e703e6de78f8816e64f1a9712e2fd08ca699f1a6a17899f9a438b78ef5b01c1672e762ef253aa0e43f7332c07ade707610e2808fd8b66c29c115f81fa6a47418e0effaef627bf0e43fc33b5250594d6bb759fdde53eab960702882158e43f747456e07faedc73417faeedeadde2fcc039822196112f840888310501c1a7b97370d11fc372d02e458c7c2ca89bdd92d667b0bd25e8020d2ef19e789ff5ad0f4231021f041b44244255841e842322c5113f0df3cf9a2d0dcad266854014e4f35e0e63f629ddce20d4053a8ebb6875e9afbafbb2959bb2deb13039ee79d52811bb11e088c0207c76e05820f8d49aa54400fd7f5cdb2e9e3e076b2c849fa4db59c43bc4388269884d107f10e940203e0283fdd96c592128a09a7411a6407022d409c102e1134327b4f8437351237e1055bb5e7e6a49ebd6880b7d29979b870bdf02cbe7c78d22744238431c8b3081d08cf823d485c00f016c0486c8cf789d15621f89a344ac4e88a0cf4f7b4b4704a04f3e436f17a84f96ab4680475c422884f808210e61265c248dcfbf8b17741c250cc048264bd21dc6c2874edbf6574b3446a74892fd915f8731fa99de9e0262d16d5c68ffb88f352df89f8a70319da245d6c7f706a31118bacf263a16909f55e383501881f808b598fd17ec2673f70e2de957be63c06e932b281f8c5383c010e88a37ed6c8422e21191e35f3721fce4c2816a7fbeb462207420441719e14054a1502c84b70d32a2c5c347e39e42d4e9074dc999136707f904ba154658f14aff68b140cbb5ef2bfcd06e2915d1e2ff09b6abe2f919b7092116205e208e20cc204c1b01d4f7c96afb84a0c2f4415a3739ea936d6d1174b1baabd20bfbc7eb680c4a1f49bb5b5fe573afc98b70401446e023b622a0405040ec8350cf8816a34fcc5608840294d4900db0df68a55fbafc8c65cc02f5e43cc54d5b118213f14e0446d18706ce0a854fad43477c10aa362268fe73e0e221c48df093f823b841019416a6b9e1c4533e99561501200816970f953a6a9d3e15d92e923f2bd70da13804e0d715c924b9f94598223623a6b7be0844f976408d98a1dd828db8618c9cdfd743e1db1d73004ead119cc5fad16eac880ac4dd0807083128be19027a4b71258e1ff68759f0d66c994b3d18a323dcd18cd3fd406a67b04d11f9a6ba33f81fe1004676014597d65c88155df8aa582d9ccbe104f904bbc208e5106e448a44b460fad41c6a08f17db5444ceec813217e562e078218818f48d60f8a7db20ea351f273e5ba1157fc73551fef001839445f18f8bcd0e4a3d14d5431848ef013f80fd7883081ce1ad144b06810c67adc093bca4985829345bda9710f90e7d9e0b721cb61c9668aeb3366c6c2656071dfc0de396942d496aa8534524d91816a37785ea7b69e1632d42c2a8082f6c12f6023922e74ba70508c6c3d8dad4b0feabbd3855e720de3e7c033df67e219269e088187828f76292525dba9f2f02273c4fa3e72acaeb1f17d5d06ac51f942519e752883cc8c104a31ca6dbfb0d0ad27056cce2c74281dbabf04b164849eea78bb0d563a40e03af63efddf22790ec5ae19baeae5f51c9ac1cae8a9668937d4fa622593724a7cb20ba44965d7a2e73f0a75174dc61806c13c60756e02f90537bc085b4b5bc2f02329b9850037f6e4f22f9af210dde652fa91af1d5f35a972d2c2f29b3ff152ca6208cd670a662f7f9ce18c40877aab9f5a23f04a4b4e3013263b42d0be41490b6735c105bb62f59e221a3f7835e5a12cf6781d742643e8c94c4581d6ed1df6022d46aa8a570c44372f61d8473c759e464480cca582c34cab1a7341215aa45f418e9bd52486a3e347a6ead63944e7dac11010cc17783a52b2d843d0c56cc17d75cbf045e3773eb550c54a4d7b3ce7ca5f0c3b308e821abed32e312b104f1977cb2ae372e25ac8bb2bab65c1bfb128b14497321398e3de11c120044641a31b42fef43dff86cfe76fd9cebd7f39cb4d455496019d4b289f5da96e04d061397a11243a1cef3080f5e1a9c1e15da744691101c4795341f017cbe057837d3978085c2387a53d0c06528895e1e428fbea0f59518a7c0d26fb2674c41453445fe7e7beff06ea43a92e791cf61584c5adecaae6922ff22125a0eefe3fd6b102809473f59ee10b63178a7b177b358d86db064f65b867ca6e8bb5002a921841ead9742607aa4d03f7a8aa58b66c18066cb0e22572294f6ee02d45289e277b0ec81e36d3d36863c9566473e18689a202f15a576003f8ac00f240d1b0fdb6bcd0857a6e7b86eaa8d277b99e50c9399fd48a1cdaa10b63c57506a039eef84e4e922c267376159c66abaaffdbb186b6d4f691e88e01096f081af7add35a6ab5d5bd259549e9672d48f7b1c8be26f6de0cd6fd3eba1220dac1b416752d3a4b46ac7713fa55b3ee3f300c2df0f08eb5992ed682098e77128e86de69978032b80a0f26b909b04c3b546eef6e727836a12daea981ff85d0f6d3e385c7668be1d2e422a859ec0e921e7dd6bccf144ec4fa805fdd037905708732b7f5560810661d6678496bbdc706201ecd62c2b1a02302605dad60517727a20679aadc708d1023db52dac037851174654d5aee99c8c1c633e150c39a0cf06aa4dc5e2cb630f4d492616b288f3ba90cb38dbae6ccbdf9e038dee09d196ee63df81b309f644277cac67154cf54da4eb71fcd3c1f5789e73a8f9eb08d579e2b5bef842f0330ccaf29662ffa74787ce4fd8f1e29dc46133088960ec5cc62528f4dd0109f5720d5fb88d13a3415c1be9241085cc1bbb6c5e7e13cbcc1d5e340e91037b99f62001dc4288ca577e6586e5fc4861e3290fbc9baf51d78ef7f46720e16bd840c451e99ddcf172f27a7b35c6fef2e3c82535c9aa6f9d92384ecd130a49f6454c16060525529f68ee21c439ea9b1193f8a5cf7af1d0a09f4516a905b138283c05ec1c03aa4ed05d274155bbf5d5b7fad5b1ad1218788d6646543b7cf5d2b85cd366c53ce0e4fd7287047c7b2bf1d2a79e956f0af1d99ae73c92dbdee061f71e4f661646b1c8003c4cb356b5f25524ea1fe5ea07196b40c2221dd2abc4158059b9122be16b618c64d05a763106bc07882ddd768ce7bc0650ae0baacdb227a7514bffb8336b7783c048603927abc8201cc87214e24a7b0cffba678726b8d4dbbd590124811b1427c05fc205d37730a9914140ddf0cbf8573b05753da8b48dff27b6f7c7dd5679db2f1dddae9c7af267c218c62fb9a7729c846e2cf29a0f11140ecd658b5ac6e36b8ae8490ddb84a07214e22824bc1da031cb9fe4549ea348434b81c43c153a70ce1cbd08a8bab1c8cfe4b0c052d17ea21f209e1118525c287ae01a8dda41e658d16e8f4c015ba3fe94002a376311e901a18d15a199ab6e16c874089284775ce7594970a56836ca23ce68963c9fec58e96590a81b41b37f17486065e0e3f472549d33683d2ed59d6f968e08e311ed075b19590760400b20c23aca3d19ce1aeb9e844a68602b4515855e5f1b24ecb1c2d9aba5dae071fe50b4863e3e9723be9fcdcb60da082c68f3d7758b48333eff20fa89bc0aa46db3fe58df6a19f7d1d46ed781522c7cc0abfeed35736572dbb640fdb980e604b4ae5c6aedd02051adae4d77c9e3ee6985cd7542c50bed2aa89658e9f3522d7f47baa55e9f13ef23cd98b79447f27f1192ef038aa2bd2cbb70ff4c05e27dd8c645dea92bd070675cda7d7ad8bc0c2e3ce6193428815ebd698c6700de565f4ce8adb9812373582755924d124f5a8dcb9d81b2f44eb2acbb6d73c2b272bf310bb9e67acbdc84f8a6c260a85344ae80e3850c9a0cd28d2225f0bee6bb3023adf19fe1c224c16d3ad0c238b5472fe0cd50963c0140e592e9a25ae7489ac89c109492c885595f80b538264b2b04b96e74b57b9fade342c1c9b6b18c9149665edd7698c8e446493459060e618d80a9b8d6619a0b3c8b2d621f75c598de46004895960b53f09fa9d8cfc9d3d110f0deb8ec5521d51953ef6f5be2b1a2dcda9a5c4cd3452bf3f13190916eb4a5e1d104f1506bdc8e8cf770ae7a2bc2d6ac5b79eacbf4c6c05c45bae4f447058d4e1fc6e79769f0624ce03b8d267841ac2d2fa3bc7c7c62e1a634660ca15eacf306932c5462a6005e08aaacdb4fa24818b911629ce0294f3d5026c1f53a640ce2ecf177011235d0b119c3f957e07f1b41189a265c89d11c904ea69bf9c3ca62ad86a17d9ca1adac34d2da70756712e90dad7a4a66fd6bebd694088b53e77b6ac51a9396af2356a77c5e67a6c53abec0a6f8a0526332dd61942a4cad5bf7a9a8ab88aa5e5fdd9bec59f9a216d90162e1d64b5742ecff9ec71695a1ce4067978eecdfbe9e02a47137370bf21b931963b21002dcd74eb6d227419154b8ef69a70eaf013eeda25eae5e2137cb7e56337b32615bea5c5745d20da9013f264ee084af59f841b34cd65228fd7226611f2827be14ed1b0f5c84c56f3af448be1e6facb0a9dbfe1dd1c8160d56824dc12f5177861c7496cf06868e4106d7e14eedad125f216b6712818fe4ce48606fcb79d6f31a56606384d57d5429394dcde3da5c62259d35262b5c5e6f89c7694e03dff1adbd75687d829a46809679488135536786406d6dc269d4c0734f04f1478fbb1cf39facdc42bf87cb10450acd1c9fed1f5a10e56be65eeb4ccb19f4036de83023047dcc2de521a38ab690c6499c113c0751a8b09c73539c16030e9689d52bdbd0cd8c4e96cef17b8b7fbfed1f6bcbf61f9384aa415394febcc05b1522051710e4647fc027e8be625a2133c691e48a309e6f03fd81af657d13a0b243f5a37715b31d9af8d0e45d98122c0d1cc3f5371bcf25ab655a3ba0aafe770f0ea8d463f18220a522b0827f52685695ffb9d470335e896d8501313ed174b78bf98b3ca6bf0a0f1bd34a814c4153ecbc4db6f4835aa1302b2e41f15cf1d5604b730cc687f502f73dd15a84d490b298c8e9d77cf0d3e78199f63084760959e1ec7fe0158ce978e22e99714840f1f425ca2e3fadcd58b268eba294b89f5a6e799b71dc4a42b47376527678ec25558a98ce88fa1d0db7341bfcfcbb94e1c520e5c608e6417a4ac1dd03d6c6143097460de87e9c5a3d880b770a294140ccd9b4fd4ab73b3b4b31833a4350974b438378614420676ed08f09d0db01b8360f6d51a721ceb74d91bbadccd14c122612c3388942f7272515262179a08aa4d9ce0353c46ea7aa09c4609b7d4704106941a5687148bba795e1ffb2cf3e922ac1f3fcc448131cf3f9cb21b157d88fd6bdb633b8e216e4b3f3e6680d689f11124a8fdf78506f78682978c367354e234dc8dba6ac475e7ee6fb3c9878e62f9bf09bed28b7899423c99758fa49ef322b0851fbe24ebfd2314095c9ef755895b25439a5f7db90a99521d1e7947db30efe84c51b5983329e62f99dfac60327fea0790031d69e1f3fcbbd2b0598b9c6f2d318f26476e15627e26b0d6b27ad027a50a832a892f1abb7cf21d4bf9a6fcfa05a62fd4da6aad5ded61ddddf405196a55fc552a782d2ed840a065d0a925a1b626cc83f3d737e9d09f6af0f678609f301efd750755af7efdf383003f0d10df0322547aaa1cd2c0c19598951da7d35d1abeb3ad4b720f1dac250075b6fa5010573fb8efd79ce826e9c97cd73d78f088f4a13efca13751095d35d816235ac5ec0a324277032bc9034422e354cfb62c12218546c9896316b456f2473f0647aeb29aed0463389d1d98c92518d3081c49116005ed6d9011d45049c448fd8bcb6fdcdf94545df8683984a5c762654b391d629b68ab236b62d1c3a00e42eb673a2ffb48b0b36bba70dd2b1789431130b0bf3837e302d1dcc45c5bab0aac1204fa193ba45410380b4d3a958292b819245d14f8bac8c1917fc8f55059c341d6c367a511eee873a983b4bf2a3ed17923ad32d6439de64465637772e31287f89281863798f56d40659be0800f7dd3d79b10b9e5de726f296592329909670ac40937dba261d3d9a871dbdaf463fa7ed51fb5404a80e39c9a0a95e63eca79fa33cb856439389ee6e070a19c108643c7d400c7c775e792b0bf5973a1d152ed32d7856e48ef175e172d154887a8a492baaaeb615a6e1ced3beb51c93796f6c1b723576553ae0acd48f92dc65866abef77a16743997db9c71fe21be771f4bcd13734a8c72633aeca0bfff74fcb3876b1ab5cf66ef7d5a6a676f797d3b2ee3babf1d55ed85d3b2ae1b2749c032fb0fcec72bdcc433c39dd75e5b58069f4fa4e00ef9c57ca4efeb679dfcdb0e3244fd7fd94fa765dd8fda5434a1d97e4f518d49cbe2e7aafa79267be9cdfcddf5b379299aba352959f8bdecbdc79b7bbf7c7bb3fdfb230b54a2ec27200e923c92453503b842d6b59d66cec1fb54ab6b72114fb5b28af8b339425a994f2503a36896dfaf82505cc7621ce7b99658a6b997d0eb69549d9f7bd135bd68e58b3b3d0b6fc62cb9a14135b695f7de9f75866297dc251dc7648f7f73f5d44bfb189b8dddd9dda9724fa729571cfbd7beeee491c4f8b85116be6951bf1d453a5d0b55472e4fae34de2deea3185238a084ae26e085a0d8b02fd79eccfc3f982d18e76958523a02240ae6ee0b6dbc6e3658c87de997d12e028ad8aa82b1c7fb6cb8ff8228791fc9c1cdf2d6d8cf3321fc14ec04fea66521f078efbdee3f81aeaf891d2211e5248cf04627300ed6b0f6bdf56ac4039394d71266772da9a356ace9c3143864cd69831565bb64c59b102e5e43465324da64953523ac104139628519204638c43115ca445d2470810fc187e8b35d00fe06b6323aecd0487a00892c867cf2417381bdfb81096443e42a08b509268680ab94c336b9a914478d31d379bfe5ce342f8a9cfa6ef4c2e347bfa3e85be4349229c4d71a8f3de4b99d6f94ee31d7aa6af8b5d8ed7d1b2c739f04bb13e0f7d25cf9440ead7d7d1b3e994da5f28a54ff534ce773ae7b117a4c726df0f0e7e9806f1fbe3e8cf458cb5f7327bb77ab5de2d7313d7b6619023c0515a1d7121efe90dcceb91eb73817af4a94dffa547579edea6672e6e3a08c8082af777e40757bc53eb48c2c65ff147edc45f7bb0be17e4a005506e22225025bb3e09bb86586afcd3d34d7ef6fd9824badbb669201dc0ad7abf69ece9b1674cb26baddb05e201dc9eabffd551c9c63e5b126ddb5699cf86c02f7fc7f8af27a1c0b93d97f52bcd37942ee2f00ea15dbcafe0ed019c7b0e000fe0bb726f38d2edddafc3b3da1b5ec18fc318e5a143d208080bb83dbd1fb5c2dddb755dd775f75eaeebbadbddaeab33ee76dde5e4b66db7ebae54aab5c9acca29a59cdf757a84edae0b9dd039b76ddb6ed7dd6dab72e3b83be6a36e0451f472c582e50ea516fb47abb848ab1938366a6b9b61cbbbc3964584d9f793b90817e2efb3fab571feac9e3a838da9576aeb66b9ed726fa7784526c6e9c938c40fe7f85c39477ef0f1ec9bde6f3bdfd41fd6f9808800a5e8e6429ede42a4ba9dcc36738a0daff4f164432892f77263f19b1a96419e6fead92b16f3f14dbdf33c3f32d2f7d5c551a9aed9536fb0373dd6bdbd72527e309481cfc4beeb651bf77c5617b1a16ce328f97472d1a56fe4a31c7a6175d1f33104785dfcf14d1d04fbc13ff473f2910d83f4641b4e282b59407f11007065cb9c645db4e19c62c322cffbedc73905cc36248239f8a65602802418c8373509f9c88623d44c70912e01ba027a930c3030b5d28e137000bea9a1b8487f837c64c314c40db0074c216d0a7df4779aae80738f730aeef931978e8436f87c88b988ef219eef878f259f7ca423c88faf271ff5841ce8f80048073f40be00007d2b74908bf806e1e7f3f2277dbcc701f8bc2ccb49de6fa1ccfb9c2d807ce4e120200fbe39c585f2910df1feac96b522cad838d90bab6be3a16f4e11ca453ca33cc4f7379fe81be5232f9c4f2ed6a2a6eca9736c1ce483b2c7a27c64c3f9f461cff3ba7cefbd2e6eb337ea0d0e85e1f01c311d3ab2f9c18ed9ec0339a55c5b28a54f372a39256d3f43d9f6397be72967cb8ca4fbcfc52bb95bef379d7400e586dd0db65724833d36996d5b6d682483edf5f3e873ba0bc79fb16773494625db86b231ec579bc1a65af6499ffab216b5c496fbb5a996b5a82eb675b18636c97e8eac1151266733813fafdbbfbafe74004309e0323b8ab69d8816ec9752ddf5939c86b2ed9fb3e9d109e1092ed207c12631919ef084e65f7e1550ca70e3a8d4512ff67ece106807d0e5d2b15d86e30cd39ce459eff364cedbdfb8017e4cfadc07f5cbf5f77efaf3eccbbc05491f294baf69d57cdf7d1bbfc077bf7428632a298fddb8db79f8cbae1778e30607862327474c878e6cb6a3c7eb10003b1f978106df75218efbc73df9e8761f11b9bbf0473632dbb46953e41e4fdd7803f1e3348f8f1fdfa6710f8fb8810619ec0020d4dfd3c36d3db6d29e1e9fb2a7a703977db9c61e93a4fc15e692e75d15419c01222a0832fb67cb5a10426c22b0f68f2d6b4358ed4aa368a896a5965a6aa9a569aca5340dd572217a75110896ba58b508404080a3acb9bb13b9aa56abeac90ad3f660cb9a1058423c6d71cb5a106bb610521bef4f6be317de91b01b2fbfc78774bc0b71372fed4bbb727264fa755dd7510976ddf7e1f8d98121930fa46946f052ad3ddf8ef2ea7b6b434b6d38564aada59b7dca86e65f615b6ae948d5d8d1777e3a522dcefbd1c30f36a433431a8e124be7836c33e7b7e1927b414bd350ab471c618e5c84bea568a6106badd61e73502dfb99fee4be28165a5d2b1ca19ddde7e40871507a63c9a537cc09c710c78d90a6a94fd65a6badb539a4692690ede96fda7e1185e91b389a7bfbb582e04534cd8759a25813699a2c5114459aa6880e2da13cf563348d28ce5c9caf43bff32c916662a2199a86a6a15a340d0ed7314505c22116fb99b9bb3b9d651ce642561508876a95ea17f5b19444cf66cf9768b6dcb20675b5e57355f6ac01d1b4e78fdcf7c409b767524e09640338fedeef42236c4774a17dbf3a827ae4be43c23df732042592a64a6f3b241989fc2d23a13fff0b6b0d61341fc90956fbd3e624fa3017a23f5f3cef3bcffb8e8aca0a4b92d9f275bacb5926dd7b45bad0b3dd7f437c6fdbb99fb9c8e52e0ef7b9396673dbe6c2a03520f76e2b13ee6f112ebca18ccb479c6f6ba3ecdf2a5137d0e770b8dadcdf1a7dfb03d5b6bfe16cddd6c1703a9c9b0a62b910dd32270f99569b0bc7efd6fb7e7383c97dfb37b2915ce4de2bb77411fbfef417dbf901818892254d52609af214e5bb3ece61f317f5753776df9fc97dceb7ff26960bd56c64d67ea8dd5ce4825f918d7a9d925ad7b47a5599f2016acb5a0f637aa8b2ab13285c9b366dd66c7f2272bb162ceb102c1dcdf61f97760f4ddbff89cd7623f2e73be1b6943e54c909b7bbcd3db513c9f61e72db943f7fc2c07bb276ae7cabba03399807529a10a6cdc659898d4327af36fbca073dded21ff57b68199e5f0ffddfa34708f5df8308fde043207abc0cc77ad41e3ab1f04b1554b024152ba2bcb2658a45318abdcc0890463a51ae0bb1904a4ec223c849d8564145159f638d2063abf3bb15d8aff81c8b4cc2ec672f33093b7e470826ff949c646dc8491667e160430d5938d54083163748f7e123d320a50454a4f80c4ea6ea471650ba0ffbf6addea26ac76730339a9492006168b31f4880b39f99843034991f10022d480d58440218275537f0f8d9f3d060709e879ee160d72f6daecd0eed248dc81dbfe3f10e4d250c4d4a0250e1f13ba8ecf8998f2410e677682a3c2210829492003cc21b763c952aa49404a062444a49801da14ccaec67dfc6c63cf4ec77e85908267361b513fb1d58da198cfd6a3f87b222b2cd76fd93d1dbf997b62b63133871bd077a6cfb733a11c196d7f0678c35dda2d1b0c676db77854fb0abc853a0d16834fb3a44dc477d223323b28d8d671a8cb5386cec0a9fe4d8f604d73de882a33c3e831732cc204399186488e18ba6189ac080a10986305e80e105332ebce082184c2e30e5246cf318519cc9a3d88c8216d044692127657c06c7340bd3d34c775dd179aceb8e6969a413429946ce42b664d0622f298fb3e0b49c9471194bb1d7797b060296684b46b12f721dac6b2ccc4ecbd8a66085366da05161b6c1861950d8d84a23823342a005822d47432a85ad355c05521f58430d5f81d4133562e06aa43c100336ce022925363068810b3048c3054c69bc604d9417acb1f90527a8b1066317e4a46c711aaecf2ecd819b972e6e4d778d73dfe04c1758db829c84b385c1065c9fed962bbc925b7057c06ca43490df6e99915258dad98575dd32e7f08aa43c210b7252b63929631b831524e5c9af66056aa8b00215ac01c31bbdf04650548086ddca001b18f0362e205d44c3db54000d2d9a05fe7b54e0c31ea1a43fb472923d232759cc0205ce48d3820969cc8852821968982620e98ffc92fe40930217249082325ef8644b76fcec6558864309ec0867a1741f2e970be1327292252327590c0304c838d314813328888104148c21c303a4fbc82fddc71862cce00031cc48698099306818210c306a6000185fd8b0802fca4c5140192f46a0c48b2ea824a08b13dc808013d49c0e20290fe5a99900872492f2982087241370a18301b8d8a20a922dc890e0089912ec60a4045af050002db2782a9245560f44b2b0f001098b2b7e18225d0cafb0c24261399a5600414410578488b212d3d583ec635ac410f6b1cb155abdb4b17f33898b5c4ee262953792b8583f3f969e8b888bf57318640338b3c84778661181e509b847daa6cdb67f84cc45f0cc9a581c1185c511565c215584155255606131a20a24b0b2646b8ff86a7051918f6eb25c4d8184540d381f7531b3f1e3e029e4141629a6a28022892c502431e6092590b84f28e18418a025c0515e0de990479ccc540d60ddae2b464b2e62df158eaeb7a1554eca3fdfa56b189cbc25090fc2e423bb05cc124a80c94776892f390967259af8c2449516aaaa26bce4249ca996e8c00b972e3929632e4cfc74e9c2252765cc0490172ef9e8a60b5513df9d01a832c02472640ae926101da101260d47c9c5ae9ffde64e2154f9e8c64b133909e72a2e1d34f185899c9431123924529efa92a80322457d44fad4072285a414698844f2d42e57fecc3dde2b8998c049782e919332ee126609305bbc7860b5258c962aca23e6d69f5aac94f8e2123de8eb111b1209a201ac5b9c4a88c945ece770cc8f13ce2472120693434cc37c3a74acc8330637ae7141b3658dcbcf96352e519b880bd95dff48123a54d5d068b42b46b54af2c831170b242379e4bec20bc923f7d863d39f4ae423bac19619ebf81cfa4a8c0b9badc196352a339b4b95edd4a963225ba2327d22d3c79aa34bf9a955c66fb5efa598c662635aca5e17f3c774900f4486985319091124f21056b224b1fc9d452227d9c7e1a8c2c63fb34c2c5336768242f1053d05fd008ee2ae37378f6f6ebec8a16c8c839e408bb5d537373fd68d83c3e69ddf7600a9ee1c7ed207f64875db10c7fe9c19c97503f637b42ce7717cce37a166ef6c596b628a7d5d283fd012201d123de7cfd13623c1be1f2fd6370bcee320995bae8b593e9f8b29d68735ed410178e3c3cdd7b7f928e79b89251f49e558943dc2da27827c005f145db48fc371ee6f1e9191e0178dc8491c11172a221fe530c4633eabed7e72f71756176995d207052570d3ef2410fad3888cc4ed22425991fcf4732829a51308293eab7d06f181fa4aec5fb1cf3199b18ee9ab6ca372127e1b32718d4bdb85e9148fafe424fc396492dffe242227616bb3ae547c56fb967428f6ddc7f2db70d6a8a030cdfab0e6f6cc45ece330874cb6d436912d59bbfe91fa236c41b3b7ffbe9f511909fd2f1c71759ac5949b9d572af519e552aa45946a7b39bd7d150a5581ae50976075ae20065886a1dab2f6456b6f59fb5266d620a0a67489d6aacaec9b2d6b5557bb56455535a5a5caf6a3a5cd05cbd98ec82389ec960db1db7fe3426b61dbfbab412fa007023501facf5bb70fc93c8c19e1b7fafb5c8cb9582b8db65ddf4ecd8b43eefbdd9eb761e15e8a73595db57b8abda7f4066dfaa6b0c7ed95e81eb9f7be53a2bbf33617c445a0312067eff6e4f442ee6efaeb026a27773f99edab9da4b0bde7f413babdedfd7571ebac68b4cde94ba3ed4ddffd4387ae91bd4c8e65e3fe93443226f37dcf876d39cebacd761b4b1fefaaae9bfede76a48f2d22bb33dc913e1ee4a27fa7f78f2b70bcdd7cfaf631ddec36b739e76c739e73dd7bd76dd37a0145b5767d92e1d844d4a25a55d48698aa597112291a9aa6a6a5a996c416d5a25a5ab82ca022c0ed81b4803a404180e38c7dcee7bc0e3438723cfdb94676adec1817ea1e470eec6b3ef26ecd431cf6f6efbdcf7d3afefe876327e771fc38db76ecd9361cbde7381d1d9d7abf3ed2fd1a5a3dd6d9cb8c64ff5bda9e92ef998ea635176948cbb8e8e1c08123680d98f3f5bb2e27279cdbd373e7a836775716def8aa618fb7afd356eb6c998ddc8761acc70aa4051c41a70ac79f8df3e07f2106bf778c3d1fe5d70b17d1ac713cd6399f8b1f0dc7d9867d125a5354ec211374100c5f5f445f300b1ba2f3301b8ebfeda8e4f53daf8eb36d4358ce17b98e7d986b79ff3dd6361f61dc853223dc778fc47df74bfb8af9f3b7bfaf7adcc11ac77ff5084966d55c04847deda7759ac0b685ed1b8e4db6cd099bc070be623ba630e2502a0e6c00c759b3db47abaaa8a4a4a29e9eaa5029540a6ddada62a3a585a64c991a16d6555515959454d4d3531597e252bc696b8b8d96169a32d686b34c6de642937b202be0c855e1aa38f7e442e0d3e7a05ce8f5f4392b2e14c549f9d08ea7cf6d71aeca85acb8312e247bfadc1587e5423a4fffdeb7d6eb3acf52ab54b74c532c2b058d8bb4aaa96bea194f5b9a65b2525ca48fa3ed14eba46d156d9fb485d2d68ab65156ca4e511e5ab35476ca46d9a91b3b65a5ac0e930b8df639269db1fb6dcb458ec907d07ef73a9e4917724cb4b9e51c937352c66c66e88666d35243e96f6c249113a5592e44b35cb45496ca5a55b9500efbf629968b54774fb35cc866bde895d534cb458a44b13ab9eda5575859b6b3d862706ab9d06d92443852aaf8539453f995a37136be459ba8942af48946512a498463775c0ca0ff5d402d0c3261a009238c23aa6a5848dd1a16524e566a5838cd1c2cb91ba08b332b5844050d415f5a3b6b5830edda021a3a0c7c7a16f5c349a3dffd5e6e8519acac8dadadf2256baed7ebf57aab9dd03b34b73b739ab5da61ae2d9c5b538d9a352019e7a91fc6983d4edafdda69b1c3a8daf527533e723dc2c0dd645ba7ae5f7fb5cb0b5fa112359cf6a68a4fd87604f3169e3102c7993545d6aeb0b287a851a5bb3e91aa242ed465b1eb2b39c1ae3fcd58b9c806f4e6a472201880f42f1d22522489fcc798f8b3a590696602a93f694276f8ba726d210ec71f3353881751858cb1ebbbf628e953a79a1f57388aff0a69369c520ebd201a45996d8cb070415580726fdc1a1c7e21d32b1c63e36fe12882e1f853db4cb5a16a63d5e6ca6ad74b27d977e9fb8552896e1cd2bba51ac923ad607369924736491ee9ffb968b9ac8dc071aa715aad6d31edfa738d0fb9118dc9df3fc7d992726a8f5bd6b0ac6c9d1080b286e5b41d8b861a16d38e6d55b165cbda14517b0cb2eb1455f608ee3973af428bc27adc6546eccfa5cf6b54646d599b226b0aaa8d5fdf77b511388a9bca5a154f43d4883e08b4d61a7e77cbedefb63d2ce643f7b77fdfd95617b9589fe621419840b9e70701c185ec66b939e75f0bfe136c848282762af5f7e2a12cc0192c1d6389a574f7395f4ae91ece2c5f414fe058eb9cd405c614b425352cab3b9d56bb71f7ebe494f73a4d9973765d54b54229a59e67a9acb516e3acefe3388efbbe8d8bfc755dd7e56ccbb83e8c3176b9ae18af2fe79c5fafda9519afd70b046b5756b5ab346ee7f2170bae685bd6a4b032b4652d0aad8d5ff2af5700ac4541668f5f83c114ef9cd86e345f7e10bb85a00dafd89f3a0853d31bd970c779fc03c179fc7d0c326100e957bda38348008e4182b87b6d02120314e6fbc25550068dac7966bbd33403f40538cea63d2ad15d5fbefb9979668c33f30c972a141403388a206c2db0cf19fe7d5bb775e307acd8b4eb2cedbe7694d6bdc56d928edaabc5dabc7da79bdea8fb4d2fe0d5c58a28cd493a7bb56cfa553bf1dd81a57da5690046f73b2da3f7a3bcda307a611add67ba51b8f04b9ba512b828befaf241d8cc797e5c4cb3ebff0405b9d2f446f7cafd2d518c19b3062881ac00679248a604bc4f7feefbfe600dc7d8f62dc4740efdfc70027c62b713dac6cc9e396c10e6b37eb1988d7d92886e0973ebb9c8cc61d7a7da89ef273c7607969ee4d8f49d706ddab4b195e6a68f42a561559b072cbdcc24cc9fef5b14dc753da514767fdbb6bad5eae0cc1d080b1cc59f2049c4fdac2ff6d46a7d73f73bf7fcd86ff6b9cce51acaea2f6da4397fec21449440e68f3baa3f28615b76bfbe33f1eeca9a5f5e6e47fa6c9bbd57ec09b29bb538a410bfe36b6ff7b7c7d4e3aaacbb6a99fdedeb6452dff7116cd372dbdfd76df58ef4d9dccbbc50d43d4175c666dfcf07619228ffec7e736baf75ab5d2e5babb4dea7e7acc6661e7e0745d49834dbfb3eff700204bd2f3ba0d2c097f9e8fa3bf7d51f77daead82ff2a3ee6dd697bb1bf7f6feacefdfe9edafcecfe9fbdee7eebdef5d7bf937ddbdebfa786edbf6485ce8bf415142ba9ff3ff1803e6f979168b6dddcfffe12eb75dfc713636abb7ded8ec9f009df4d8575e7fa5c91abdbee7c7a9f72f50cb94bcfe755f19ca12a3d7cf4c41ad02f85830205dcc21942546e0cfec7f5d1a757afcc2d07bcf3dbf9e87c1ba3b5d77d01aef7bbff7f3ffb6cafdccfe557a2d0a2b1bdcb20605d5c6fe79cc4519c39b8fdf96b1ed5560100b402547ba1eba9c471658ee602969bd2ed211047dfb21e667d69d0f7fceeb2e0491793fb7bd3f2ee49bf7d4eb3acfebbcce9b92a86e32fc7333b1ef9f93b9f187d508feedc96b7f8939d7f7957c63efbbcf7fe622fe4b7b7ad37f8c01f1df4fd7a357de5e7e9288e32a955523db738fb47d0d47285fb5b908c65daef5b1add4529713baeb7363de4e5d36fca4cffc4ffa383ed38d9956b3d2799f60da9452f167df1e637b661b561ab0dca9d1f98db5c89da87242ca2e722149eba54377da5cebf4af19c9d29ebae62217fdc56c51316b36a55fca88d932375be9f41eae710321dd02cb2ac64a90f9b9e3ce29a55dd7751ded3a988b414f200a75dbcf5ad84be8c7c5faf25f624cccd39cbbfecc56ead405ba58ab0c226b566a86dca8fe111772d0b6b1c3ecf1ab5f3f4912dce5234abd7c4429ce479466bc6d5c7e24b97328733d931cc402902eed51696357e7d1a58d75936f7be11c832949fd0ffb7da2b6bdd6c07cb1a75fdac5bb74a1944efaa4c7eec0d2ddf32f165de817b098569a26e8f2055017d8bc617bfa056bd33bdee77ebc746f5eaf745456570da7d432f9db1f3901de97db6545c227a3127d3752e48677055fdadcc9c0f8e5e3a01ec0b1eeca84993d6bd8b2b685cdde9ed2bff47195d6c68fe3ea9edea7f46fa6d8d3f9257e9c70ecc01275590abed2ddafc79c4fc9ad808293d9667faf74f78dc7292022bd2ac80c084686f3f6f38391e184b58c04c80d7f0952011846963ff63a1f46e7eb62ffc2b139e76c6dce16678cb1cd365b6bede36cbd4c11e369cb9a99293355b6179a1a8b93858333b6cab8cbd4d660cb5a97a68d7f83dd54fb22b5ede32f4fdb7e96b2edbbd850d176065bd69ab0b263574e4ca8d9221a34b52f5b1bcb28282d5adbd2aaad9da9b2367efba5ca6ae3cf531bbfc501bb954f63fc1e95876cfb3106f595181157a28a30c28b741f477491e222290f16aa2c4d4817916042d21f534b24b145521e25b4685142bac8c316aa2a2e5c7838420a4b961f9000337dca9503ebd20587892e436cce63ea60e4a4d585f3765b2d613739385ebcb876c8593e243e15745e1a61397d4ae743269da598c69ec467b502965cef3e6424dff9259e5f7e25745c3ada6aba16595db0776b5d39195655758343e501972e60c48409e3250c145658803dac26d0e36f70aa5cd92a1f59d88d0d9580b09d93f3312ddd0358cc9f90d3ab0be775b434b25ac26e7270c488717db9e9dec5e423d71739d6d13257a8048412d32ac87eba4c014b46b247802c64922ded9856c092512cacee817d9a91dcf390b9f3c7ea7477e96c9996ee8195696984a54b31abac2ed74b23aced0e02421de18804172b4c1f49a295489ffa405bee85015d01ceb0deb6cc0f98dde0389820128459920990463a0a582241152e545c3eef522527611d7212b631adf3ee057bd5e75f72093dfeffc3303ab8870ee33ae4e0841039e0f0441038388d0142d21f3fb2d30d5040f90d4e258a0f7e4c8192fe90e2ff6325488944f645fe2309b0c7cf5c421835324f20043541628045b2843051be00a1b5d63d5ee6231d5991bf0e424a22f4837fa8306af43f54086a663eaa40987f0da5ff5f66134230a343203e94edd0e37b7c91b761a4a3230b7bfcebab305162efc29291ce13a11f40219d90244aec75429912ae8d91ec9ba064239d5f3292329d708afc61d404fe1e8e75bb7b38e7f436f0fc9f17631fbb41412e607777f79d9e0f8c92b57b827e071673ecee2478232c71f1e8494a915b6badb5d6a7136d322961c0c5265068d4cc336e45e4c80ee0085e38ceb6f759793e9a735a2f66f3519d765aaf42d1683423b46a5a66b4d00819414b8d04729565b1f5e1c393d9291380df0c7b5b5a4ea0d6534c8b494b4a9bfb094d2c52f4979edda6d068b422d068010d19d0a04234021a3b481fb94751ab055a6a481eb9399e3d33cff65c25a536d3b96d8865e7b6e196e88564382bcee30e05e55330169ee246bc9f4ebe23d2cf0a8fd70eb97ebc9e8fd9a69d52f9c80b4f00facc50f4846ba7f62b1fe3ad61e546bc87e2a27b3e6545a1fa6ccc7d77737ee5629a315b5e6d5933c3873464368f2d6b66d036fe3e97669a3fb5008d3389ed3fb148b712f233ac7462dc6fe68f227948e83fa19b89fd8c94df4ece1bbf90fb201d402617b0ff5bda198e998100fec044cff3685704841446d8534f2bd1ed791b80ed26b0ddbdd5f94bb3c6a6d9b26730d93362c860db4f73c6a6d1923cd2676357d46bcf252490d7e77aeb0a7d0ae509a758a1e16e755535c6cc1ebfed55533e45737733cdd2c52d33aa064a1771b76409a766842556b5ed242c51c3850e5506e8fdfc51a281ca5ce8563e46cb6ace3d4e2d2b9f34b5340a75e70f77958e4a3292b5f6b367ea0e2561560922c58726564f0f0dcdd0dc02bb7704c31915f533f18e985f31900235e5d12268115e28a5cfe7539268066d012671d15fa96a2ef4e69c33045d7a4a398ffb7bd46ef2cd4d697b3fe73767c6a15bb9e86fe4542e84b587dcc87dbb4f8d0ee5504d5c68eec7e1940b4df7749369bd30888b6eed2cd2b6ce992409c544927c01bd1fe5d591efb116c5fc9ee7fd8b5380dedf1dd145ff3078c10f9ccd84c6ebc16658a0f75d6ce66fa3820459017aef85452e42d9f6c799883dabe9ecf909fa71d1843ddf5a1be4a2f778fa0407aa021ce7cf2817921a251a6b59b027d6533799f9d4389c9eae7b84fdcf1e61890b49179241c41fe95947326c596accd4d04c810ad22148871a1a5a2d055653413904e11054058a4a5a535881f3524bc194329acaa8613f399dc97232d85032d46c4a51b0b5291952bbfed46345e228a594ba4615b6529d61a5563018e953ca29ba65ad0c2c9bb3e252ce329c8ef02d6b655839ad428e81e5639469e26063bad96f62ac2579e49a2bc616c814932279e4185434d8755a33341a2d8b917c9b8f26077bf470b4ef36dcdcbe2f06bccfc43ecd48740d9540a1fa371bf1df68341acde650060b4b8951b5b777a92d6b669a6c186cb4dca37fe6be0ea003c1796c102d37b2db7eec8d4017b228a8b2ed1ff1a16a44b7fd98b51f34b3f63d23b9e1f6b022efffb9906ff14f6efb757ff5eb827800ef57ed142b5502c980f49164fd5bad24b25512552a89a84b22aff5c8927c77a79bc317c6188763936f672028c0b933d52f7757f8737bf5c35f6c02f1ffbeef8b4d21b319def63b0912e19a91e8c63fbb8ee7f7481f7fa035c0ed69917b7abc3edb9fd317e62edfb66cdba6e461918f1ede6aa5a5096c4d1318f6a7be54270a58eecc2fe809b41873e198c2fe0b8e31eb2485cd8d2bece984dbdcb67163fd5a819e00e757f965297db52bce34f92e8dd66ddbb6edb73265f6b66dffdb6f1fb4d5f6c664fc1932b15f5fd8c9acf4058fbbde538ee3386e72f3bfc97d94523ddf6afad16f7ebb8eb0c96d8ee3b86ddb40342ca5da7e2b18d097f6f69b06b29a77537d7bc0f3fd3fd8fc7009969503e36ad39f4d341a7403385429f79de6ae7451d226b00f89d79cbeb052466b8b6d6cbfea4274e24e02d938fab8bae4b63d92dc8ad89f219322f3392ebc2bec51896e2e8d335bd6d638eded83b6aca531b5a50bc9dfe8f66c48916c3849369e646cab4d60347db1820d5650c8c64e2551ec2deea4101d1248fd106c01942e521ffa55fa50243982520a906e7a933e4b9b7e5b248fac926324962423cbc82fce482934c217670c7153341acd8b9114b265b6954a81c1a80206141851604c491ec964fecc74d2bf014ba01580b2e6c5d31ec52dfa9549840f41ad54216c101b101cd4fda1f3c1eb013f7d3ce41d5c2478550175b891c30d0e384eb01b7050c919418e29311b74d4a043834cca6c861d32f088a147d3c3a05f085d0000d34e940c5ad060b2b0c1a4896d78daf0c1c68fad9e357cd4e0200640d8fcc0a0833402f002a035412ef0a005422c18521364051fa880080d215a209c21803403302304344529d865189141803322a0e0688c2162209921124611300af085913247bc40d285014e90544b6282037081802d124046490914a0c502b26040d6085834e00a0758f1002c12aa80001511984202574ba49840142540418131263c5101272c802f6085811032308051004c4068224403441bf88003414e1872228482071d085202f240009e74f0819f14808080835d1f87c067d7c722e881f243051fbbfe0f5e816749dcb40d360b1ab49041941d2600b810bea061f8a61e31f09061c70c3329321a746ad061436c4a8e11e450c17103cc0907879b1c6ee800567991c06577701ebeb99f640fd9872f88cab77fc0501e107606918fb60f62012cb28209f105d1bedeb007a80d38deda15185bd6b8300387a53976fd118888ef471275df105d6c15c5ba58b3ebf704a92f42ad9dc069d75aaf50fbf381da502fa4587ae5036aa3678b3d3f364a04da026908c406387f02bd001cc51e203640a02d10280d50ea88202a178b67a9486c53d7fb6c46a2405be07c117ce886d579b65742895a6dcb176c59db62cdc69e91eaa661934fa422901ae0267d828c00fdcca7e59b5abebb059979b5658d8c947de9508fbbf291e8a2ddf26d81f948144ba02575d8b2a605995d14debac45767be5214a108680d90fb1da02cc051dc3bd37ead61b5e18e0b855a8cd9b2a6c5963db5d8b2966566772085dc90407a7e2491c51bef0f943e1f13f9888614480d900958133954312e3a5d66db66a9171e55559f8f6c28f6c400b4f38bf82504b353c36860258af1e144cf131c8cf9812200510449217415640a222a40a86200584556185d21021643b2886451002d8e94c00064926c8180cb8512132ca036c2091cd00509d38b08dc324bbe28010c13c2b080190c88318ed104051b387302192894a1948227685230230469a09cb182160d8d1654c0b48217d434b14086164871410d6ba6bc804a1a4e30c8814d9518eca0c6d31a3e6c41b111441b56661b2268512c18d18254942c4c532e28f1c216189868a28aa18b0c5533809162458313358cb1218a295723a0820ad60d573865e1a0450e6474e0a24a8d045dec508607309eccf430860f677e28030a0d106982d012420556d40cd10222d65c49238a4d116a18b175c46c438a86a5852c4c48bc30d594840c4a48d152c396294b5061c2a9891ca8aa70d9a1cb93171faaa0be0401c64a1822aca2c418e184d41359c64c41a144145ba460e28a6a8a2e5454550106cbca0a27ae1883451459575950a1055609ae2093b585165c90e9e1221fd1508c02e93bad76e36ee7e12fbb5ee08d1b1c188e9cd90e1e3d5e8700d8c940830d441e1f3f7a7c3800f2d3410080823c101a0af201911010043080108ab6110144381a8244a448018c1c416280a42407404002942860010c18a1010e78000910888004964ca0040a9850010b5c000319189934d1c00638708213143aa0e481271f480104211001141556589ab4c9c26c6146994cd385f9c2846136cd18a60c73862965d2306b9836cc29730493cabc613a4d1c660e538759659260ee3079984fb387e9c3fc61424d206610538869650e3189985766d42c621a21e71153cae5c40719fb0b03f2024a3046a9ad3e04969f9535b140b3e79c73ca39017caf5b05a4eca854ecd8e992562a9a110000001a5315000020140c088542a1509806622ee61e14800d86963e6644950844511aa3389261209a310600838c013023403052c200e2bc81b72899f9e7cd6fd94238a6202ef7316b79e56720c2df59f15d4193a3422d7f5c7fd6e72626066d5eae68c65d70846f165ad570db2644f984d2952ba1f4e0e586ca8c371cdb51c4f6f77d77b6616085a60f624cdc9e0dc6c06f929dc35e5b3213203a3748268a061ebb5924a00487d941f763060fc7d3ba613e0a555fbdfda1f2bd8633d15304cf0398122568d56bd3afce8293915f1dd891b9ec8eb639b13be4a9e945db66fa17a9b3bf4a9e6e04f2513a4d8b368716b6dc3fe600652f29387dbfab43bdd8c698d5a0cb29b303139af69d500d30ed69d5a0f3cc21a78306b43c8ee9eb42301d35d3f111b422b84340c03e52ce0800c03c5d1aadd1103ca840326ad89d14edae928aeddf06655fd8054580bf7fab038a354b85f296a9918481b5f28945d9dffa1c53f85bee953d5863a4601803ee49643661d45e041ff98531af7f5613b878f8d5d52e46a3e2865da20efa1102ca37fa4a4e02cec7d743f9475a8dcaf0e14e6fc3f4db09727d561b4b742c5a77bbacda1dc07866b5a3a32988de12b71c0b9b48dea7830b802e65f00dfc029ad1f82f5f7feda24371e01287d1db568c0255e39d00983baff1e7269ddd2618c5bb79c63a748679a82debd2c32c79b9ac3f2f755277b8fc2ef4a11311a5c8c0e2a0560a138217524d607c503ee1a4d9efd70ebc87c96655eb7040837e8ab04919e28a6c623b96b0b54313a53227d26357a8ceeaf5450a9699dc13a7d5bc691205c0716e5b6d42ba580d86ab6232670c5c8d1a06b48a0d346af5be24a4a5440b3e93278e1f1e152bdd4b198efd6f8cf45f53ad1aa69852b31c8d4881c38146c0b028b21603bf50a8f0cab564026c09f369ab3b91f7c962e517675f7c23f9f3c44b7c1574b2e6799a58d462330eab8c25dc34d6a9b2698575f9c379eccea95d9b3ee5c14cc0d3cdc078604a30c0aa075d0437c5c5d3c50504ef991ea190c5ee833435e538c176c606662cd193aacf527ee6cf4fe6a2852ff3d025d218a75801f149a5484cc8d703f25ccad9a19947fc4b56dc33cc3a60a2d88f42a0375cb49e7f4a18c5f6ddcde3c3b479fb9832bbde149554f6f0d7f1ebe1f3a32f3d722c90bfbfc9f25d95ee9fae61af2f68cf847731a078558e5f9858d84fc4628356dab389a8d38cb6d26c8fcf6311a43a8de227c46dba0d34b1daec67cb564618ecf124c93eff025b4955a2d3f738915c805796a65e3a6e0a7674ea6a89bcadd5a89b3be58fcd3d69de8f59370814fb7ea02cf7f1b00694e9b31fd00fa807b07d10fa4e9f0447df7e93033f2e0c3c36365993e1da49fba9173ab4eec947c54e6f0f2c184d855e9725ebf48be60afa19053011a43a0353fabd99c4b43676c5610a55ea1bfa35ba5325a750f315f2f13d06b113cc67a18a0d547a5e85b02a76b01b1da7c35eb0871af840d7b91f2c60b1ad80e5351a6a526f49115c3726f0ede861559fc900d65b5c675bd0e548220760d68d41e127c26a11e1aebe2c9628fb2735676dcd6e423d1303d46a2bcee761964ca712c3ef1b58f8b12b74fe0bbec74da5bfeef9416f90c34d028ddbef4c31a6a5a39e36fc311c9eebc68dc756398c1eac625070c1acfa8dfbd737ca4d600064b03ade029a51040f6d7efb1ad94241d662dca5776f80f9518c19b154c8b064b1b87fba8981f0bb3ba40fae8dd4c0c74c2c4c2baccd0d9c97446dc773b4d53cc9a60d72383a78acc78d4e598702bccc80dbe41e740e60ade3c209b57cfcee2a097d661a57f9788353118e2e6944f81a68a750c34635025b81047c3433d011b8ff9a7c262bc1f383761486ba3ad7cee4ffbac6ce04e405e454e9695045dcf28706c5fbfca4e6948cf41cb353b9d15b983130a1099f708e693f8e1add347df153023559984cee54ec537866262c8088731f39283370ef6c9cc245d2e4962e3f09646518c53bc3b61188f5c044e45e91260fcf9b7bcf6a06df0c35902601bbbcba0a0da24986afbd612de7f7720a8f1cd5145cc91358ddb0bef95df19f6dbeb02135836a1f405dcf40b85aa04e6ed39e907429dec5e1cdea3472e0b7ce4938b47012a8d0755857b8e80ad7632944e3f322ab2a7fb2d56160a9f3e1358f8584c399bdd8b103afc04ef958704f4eb73bc1ff53b89a2782dcf13efebe0ca17bf3957df2466148761880605472c82f24f3dc662575c9cd8dca3e65f68a713321d67177de77e55a965644712ee600d17a760e724c5da0da5d41a5a799449b9370c1281ff496e14dde1f5069be1799405be2554b72d4bbb836a9e5b06d31288b464ebc5a6c76569269ff06e52a409b6dca59a37fc7a102e8d9c359d447614a880409e8c5fbc5bc7c3c46536103e650ea0e0856a5aac4a5e1147c4fa46e9d7eec862e76ba00664cd79aa1944130162196065f914d019bcd1b55a00d5cc12efc0b9f1fbcbf48790ecd4c5ac4ebe89ad469c4bfa4479794b8114f1cd04db45ac61aece26bd43c51e1156b4c3c499faecec5349a97c9304edb9dfb44140dce5b07cbdfa8abe5fa7869ff93e38e09b24467a9970d43c77e62aa7d2020c6e613183d3ef7a630ef56446851267735e272af9fee95ec17c39b3e589b41ae20461847f342c8d22c4b3c28d6d1d723fc7d3c8d9ea04365266ca2f6dfaeeba9662e91c82d820bc157e222f70abe265dd3ffbb236990c8fe485e66860d81286a402ab310950e700f60b1f4ac262a068b292b3e3cd558bdf128a0643590b7aee983c538408edc7dccb1a8ca5791f9ba5212e63b6a3bf20e51151184497ada94a07f3c1c2b4d0aaa2422b4217cc9e1cf4eaa66a8bce14cd267bd6e60d13fc343f221852206855b9f71d7428936b37c0411d29eb12fe61da96cc93b5c4bfee701c875e6e79f4629f42ed817c38abfdeb87d6be6d82af3a342e3ed8b8b341776b23c5edc42fc1e9db4de12ce3d93c9159b9f6b6465e2de74a3d496662d0290d8d11efbc0a94a7da4b84d63838671389ae4aee356740782152d9565383ea3a22288649ef2b7045c9c5db760e1b05e9e112b6e4b50e0e9fdfa2cb9e79d7204a42778af7b0fbc061e16aa4ff9ec28dd39a248feb2d4dea6e84cb2b5c6d4ce19a453c1dc51d0f40c3065f7913f7323b0e79122243e8f6e481cc5058fbcaad7960870327cf722ff0947a260c8e5f71c7f72670f7883d64ec1a2fc45c88a2199f84e7c5f49be80d1c1392259b7580268f38fd5c41b06d0202454ba5e79d5f6a98bb412b6639ff57020da4b30d7a13a7b6d0d86685a55a629e10c940a8d2f58ba06403abafdb4e916c697dec40ad9b6c2c336a1676e88c0f00c65e445ba53614c3064658fe9c261781e36afccd7884808c97604bf4d485be8198d19e4ba3134092864bcaeb80f29cea2973c17e3d7873cdbfe54dd48ad7d311002e1c9365e0cd7bf4ed9d94620f6528c4c2cf3ffdc6dc82efc1a9a1cedcdfc230ca473f5fd7e83ff62834d36791115cba1e96a503af9d223eeca1c8ecc9f830348963098ab221fadf84c87c2a765a45570d4eb50d7f830a65ba0157e842a23a8f9abd0c9ff73348735d3ec253cac949a5eb40bb5ff23568191d0b6c02e2c8925eb976758de3e6fa4d73c2b409207bdcd096c1f76a6e06b30217eb22772b8ad39bcc819f97f91124240384ed84733141a4b54d5b96759bc4e90b3312c9b7771e8f535c8986d931a0a9b365b101920956af64c19f449ebcd678bcc7efc5c73a92197f5fa5629227d883c4dced4b2fbeb1ae49de71f6d6ff052c815d537f8b087b7c6b0cdd914b88cc104a10355ac69f383d3e3d0456c1cb22d3772a750b3c1626011eb3e36191baf8de2c459599cefecf5b8602917f15c8eb3596847b2f1f21b58b882995023a5e7cac2767dce1a8f9f16a5e8d95b8445b4e949ba84932f0b90cd15320fe3d237dfde415e6ab17d9f3a3afce9cca17b5ae3a2e706c0faecee3750f125cc104d5e95a16e6e481da1c7991cb9127801e43c3e0ee0280ed0e1f276d93da76783df2d360f54962d0ca421812e4269b2fe3b43f86debc6bbda8179326201011e62e6fc5fcf48ff268e83ec4cb3b1f44a6e0e4080bb7c3f1bea8720e7620f45f87cf35dd3e05e80f357f87f70db8b095b917b38df685a4bcf59a4686a3847828a571d019550116edcb2812f7e9a04f0d6267380542503804048a6ffd2b3b8f38c05db4ae9f462cc0da1a963ba847b0df8a0ec775f7817b3a7a24b86c7e57a0a4a10f19d9509415089557846623d1ddf938e1d72242743114aeb0e4c23afe0d7e56638747dea688a4431ae834284bda82f6cd161c620f6601ddff296d6c65c4a754e09f5ca02692d57705c944924b46aef351ee4bc2ca11bfae85e06c1dc4c59de534875e42a14c499a5a0a55f213adf2d4da62c1ecd55e0dafe9756133e86b3a038b7ecd0db0f32de7e3af94eeaa0d57653adf62e131b085c757585a7e0ba0be4a25a8a23df3de50d8dad786cef7142b2bdfb24d4b1fc205f8a450ed9e858d3f8240ae1972f3e906080f852a926bf25315031950d0f1f66720499f819ff31da02143f676a5318a04470038a9f3288bbadff3e00e028cbc9d1077b201bbe547be96ff810736205ce889171f2749ad182003d0ec8c8ee2a82b395a41b3e8c90b48a937605a0d90a3b8da2b575fc5496e2a24e04a4c2c8465d34c99ee11cd1c7d09b3b97dc65837547222c25eb5f8a9b87095da22870a2b1475c9306f7134a6a23e3893a42f69249cbdd3bbf97a0cd4bda7b64a8366971b6c215494d6fb841a4116a5b0f9c7c68cea28f1c973ff276566544fef557c389b13846d89d572094f8786e6d19858c4538697eed2dd0be18d2a14d581137ac04a21fef59a7697c6b37abdfd733a1c7f5c9aaa69d9e1e69b6b494ed95eb4f1a577683e94b9bb1631cb101284c2c4c9bc394824e1c3354a8215b9f512147e5bfdb71c723a7bdc60361c0aa41c676d00a2b7db66e93eaedc344839167dcbae76bb076d3d1beb383d8b5406233dcf0439af87f7e86bd73d42bd63bd86d47c2c4d8c7eb223f86c400b902ec0d55e3bb744eb2fbf8da782a49dced8137292f34623b034ed6c9da3588b1ec938cdd0b894407e1f811d5ad5d61b84ce5f9bdb8007cfb3520d857f9765f62d8ddda5f0973a9ac2cd0839190a434e5a62c7f67ac52560c47e2a2edbe56f6fa0660d8652691841966f69d88856ac048b93d1538e7ec7012eaf9d3af9cb716a1c13c9e20caf1c152ca5465a1be6df36b7b05d738c009f4dd60d720526d772375b058457cee3825413b021663aeb17fcc26b7759bd0f5e1f1022d7623bc47ef50c86ea07c5453cc44fb9452deb8c11ee8c535b52901513b031101c28efa7dd0fe62b3d53bb53f5a6a8a5ed680413c2e722bea9e935c6919fdbda6d5ed4bb8f9b891f8f045b60e77ad31dce4fd096011ec46a95f1ac1b7ffcf39184ddd4eb7bd82e49af45c054f568bc5f22626c512e397ddc93e023e7379d357ceb73a6447e5bea952f206553409643bc7bf357ff60860de76e6716306127e580df9e25ce2524115b0681bb4344bbeb76f49f7591f842b1ed698e26b480a78f6f0c5eee593ff2c5a8114018755abcfc5bbd4f11b3bbc5590882f8cb82c1e00f614db9e6b7773ffe1cb84d0141a6fcb85cd7101dddf7c211de38c05756ebd0b378884e28de1ee3101cf398010e5242a1f2d58fc81bdb937e76c28689e0c743ed976bf23de71ecdd6f501adf74ba9f0e4f00849b98371b3e330e49506bc13a37c5520a5bd2c3b78c3c9ff1ece4dbb7c87c99747627de3941dd0703a1c4c19c42503ecf6edabe189d8f2ba864fa9f052585fbd82fb9d863217421de006d2200b4377880232a199ba26e7c39627cb2fd2d1e16c81f96a5b044878a8319ec215b2182df011612e3bd1e3283997fd82725181bad0e48d7867d3ebf3312aaffc0fc9b8d48f61afbb590b197aec69df6c0968b90ccd11e45a560ec4aec522bd5440cd43d3542b37aac71db94355e8cea6583edeb465684b99178d30e2de6de19a45224584c49cd531e2d81d3bb95fa97569d2a56c39e38c9e89e46ce130e6de1867ffb2e5803f9e8805734a705a699666bcc0ade326b6236cbbb056289950494bdd34f0d2f6ec26f88ad67fcfe028954557a8a939c42484bfde452b644e63fd2dd404e6e172088810431525f89f7026e8f6bea92a27af34032955d78060083fd40e44bdd507c011c4e68eecf9a13ff40031b102d60a7abee8bba18a57076e3a3c9b070b03a6ca59684ef810ade6638bde1bb863bedc0a1da6a8278429f41e138a6766ae122f2ff014864d3d6ca0e17293d5baf400209a633227e9e824737576cace05089c6daba68a0600d23d4d72150bcedd66a158e2265a85445830b5532a67e9f000436edf6ec90a8d2a3554a1426c38ffc750418dcdcb5db40c1241bab2a1181c2b5cc243f4740e146aba55d3856f2a44a050928486596fa3f0a0ed9b058b242e1a54eab6b910102148cc87f67d0d0ed55ab050444d2bcae8e142a58c948f07100176f5bdb5a8522250e2aead060c1744689df83c0c0369b9d351c5ae2b0b212092344638cbedfe67840e0551151c5ee111b76faca9262327e697e398f59fe54fe1c3e196f39bf24df2cef2cff0c9f14bf9ca7bcf0c709e9d4a03d30f960487ac69389d2e20bb9cb21c9f288f2346fc273096c34f946438d861c0d3f183e26cc20b47168e390034347c38f84180a371c6e18e260f8d8f0815046a18d430d861c0d7f53031fbb670c01afa0760822d2aae28824b125904b23b04874faa18979ddf2aa5a31b7b392c7c9f1d406517e9ed0ca538ed43bd82b53a4e23010c6a8ed15ac7b5abdd874b0f7fa61cf9a1d267dc9025c633c5bc5855a93cb13c5bfbed84e9eb51c0ebb85fcb41ba980c40457629d764d09904b9800ddd7060ec6456c11384b3c06f4d4da0a22b942d551fabc8ebb6e6d0e7accd4168b6449114bfcab358eecdb0c0ab0a07af0e4c840a755152d8af1cc9fa9fafbe5040d191a1d04ee13664c132867aa8f079898dcfdc1db1e0f60d73aa542b75e860d72dc2df1020cd8652a6ec310cb6f143ee63b848df5ab40b254ffad4f3f2a33bfe7d88a3251630d93be51cb333c6ddf6edcc6a862c3e450da8ac972a306e23b74e8275117fad9d89b00420337c66ad01104f15bbb5824a4c4c608089730b4b0c9228075365139fcd0b9bedb38704fe1c7c28c4e80c7965d3751e6746038fc9409cbf32ee2f0d3fc911bc6da33ed04c7155800a800929c3763ea3f2deed7fc97fdd3f61686b14126a995f074949e622156fca4c88333ae414d1fc8e6b0ef9b1cafa978458d0174dadb79805743ad61ae0c068c5d1e7ed40f1767232ed7067f004ea14575b20ca0f04898a73b789e1301394b4b8b91989f38d36f6bf33725890bae0ee3994de5f87c60b6b68fc5df2999055468af7e00003c1a99682e2bf05b6ebb6815f67f27ad51976159dadeb8de690cf2635a9f8ea67d5ce848369a1941e00e2f815c8bc6199effc3c70b000b79917fb1a6107ee7e2489cf11d8446fa1ce223eb29698b484d47468e3f4a828ef49aa9277dbde84b6f0fe436f6d95bffaf40d592a58887b1c746a660df8a694d0ac050a9d01e1b38cc73e80b7ddf7aceac7c0139de9883ffbd9ed2ed57bcd4b91e6f24b0aaf15a6dc124b271a91371c862575ab3fe10f4b963211fbe877e7f6f09ee3d72fc000ee43370d138c5291ed3cbe4c73a4c3acb9c75145916cc3fa9ae775443c177584949c0c7940090525dda2343e937ddda34467563d703d0e30d8ee3a0b80e8af320380c80d360dc0dc671a0b8078a7b001c0cc06d70dc06e274509c07c539001c06e16e304e03e33a50dc03e2a807556c9ee940dead9fbb2b051206fc950220a85b2067c91b5b9d3e5fd100384de83a9aab7509608f2a5b54479e5d0aa28d47495720adc03482d00844151c5da0b402290aa6100c45306ac1a805a4149032055cf4c2921dab2f2af9fb202f833649ceaa9749ff7cc89351331927b5c5e4bf3df264a899d079cd12a97f8fb655fd42c9ff4ff9996849e4a8ba90f4e7b3fcac9a9338525924f9eb915f56ed449dab2c90fcf4c88b5d6b52c7b58b257e3ce0c5d42ed969d565a9bf0f7860684aeeacbea8ecef87bc0c342438575f26fdf7515e468d091cd42d93fff6cc2ba306d20a26e0a4b298fcb7679e0c35933aaf5920f5ef313fa686099deb2e4bfcf2c41b5b534287b5cb657f1fe1c3a42dd1a1ea52b9ff0f79b36892e4a87291fcdfa7bc4cb51371525948faef395f46cd491dd72c90f8f5cc1f5b63a2ce5597b5b487f05f3957a2e2bc3a19115fb4094434904e5513d1fcc07e9720f58bce8c56f56f9a127a3291a103a03fa19da6a481d1b667639227cb94274dcc3f9200ff85a5f316e5e2547fc8d7a281cadb2300401732b8b42a4f28d77d30731258b5b647e1639700835fd4683b59d99a50a28e5a8506e2133753073b8654689ed0dddd208f95f159f51caf8abda5cbad49180528bb7ff87bbe4df882a563ce084310b3b3e8b85d559ae817785064dfb9bee6ccc6f8b3965aac4f4fc5ffacc6b04bf82d5949d24ddc836a211d4a8bc5d6aefb50f9e3c058a910a429a5a5ebee014e60014fd62ca0e52b2657c051464d83270715eff06f62ed35be36f0d5b534eea3217368f4729b88ab505f70d821e26754b37f5e46241b30bceed67a401bacd48bbb2eab814d5601040e0123b3b23009e84f17a6931a59688cc6b20992d08210e88561646c34968f540c471894321444c60e53ff66f4caee184ed262684ae6ecb0bb45065b056c77c16eba925a13b11b582562521fbf94873d619eeab70531e24714acbe94356bb91915c0fac77c542a93b488724726e8d6fd9e1a49216a7631e54a89d4da83b200cc283bd4d5731180441606e3d7cc53ed285a6580eb22dc7c814bb801b0fd45c3a95f1d881aeb23c85cbb818bdc1267304b300fa1931a04c97265ced83100e11f14e58db4695f7c1c8f9154906181106d9835d501370c59e9948660ad847152050f176cf790761b770943a707586b658461134187b090bc5d141d0b490e01861f715c3c5723190abfe31685d8a2f60e098b82359419927ef08cfa9f1257c6a0c43e8a1e375b7a460c2084c5c8c69dc9315dc12a80a46e5eafe083b67a826015c0ad9d26a66fbdbc2035ae9cfb0c37387c1bf329c9827c7fe557029b6add91d76d70298e123ac84fcb22ea6ba6504c237bb872d875024238bcaffdc7da628e79d15d5b93620315093de0b9da45ab349c77125e0025d3e14192ffdddbd78c992ea16c449f177c70db36dc6ba90540e44ad7eaec08310b4eed30a3df91ac1d72625c5f80f1e1c68b700c63bc1472d7fac01e7b1e1e1d5cab15ea14c89bb6cd3f14a7e2074df41270dad480aecb3004e0041681fd598297d441085ee3104b634c22c2b123744afdcc0a9ad4e782f5e7edf042f138c6300dbcac674bcb1c1aea0445cdeaf7af129f5d9a11807c3999068be878336933957d889cd239c8a5d84869ac317676cb639f552d1ce6872a78a7c307e1282e4992e07d906961041e389fb11d767dc59235451f269a33781a175ca40d697112c4019f772636dbc157e396be82e5d36fd8ce34036fc3d0e34f1824c5206f6c0f7ad4623cff513d1ae8b997598678ee300ce48f30125de34e5ec7ffe71ad0a71b18c0b9a297fe0db5c3cd66c66b940823ca88e66194138a1c93d979f5c5497187c71a826d3789886a1e6723ba6f82a1c11cef5893ca3373868fe4625ca454c482d179f2d961b4724a0d372e84e8e47f24c2c08c32569dc1d69dc6e9f000d4939d93d25b814ed3b709af4f6e2132bbf7ee55157c27c9fe51f9bc8efea51a8bb93aec27ab903a9c277db20b8dde60a96d149e539fade01961f450c9521889251468649401d99e3538308dcd721a4092ff426d1dc4e52de7a05a902bb29c8e6cb4c6b400021a4be749c5117954894d4bc38d041c2e025eb89df769703c125d2fb449d3b9f825e20e0aa4cf309d77cbdef8d99d7d19fc8be3c44b942beab9e2dacc55fe5dcaa3cbe4402a6a29edeb54433a59c542172be559018c2b2cb972441f3078cf0f478c4b3ea98573cc54b9d39c7a69c7eb702ecd5ba52deaa59da39c4e6db914b92693c743facf9cab8481815aac13f7d9bd8cd655aaccf55654a1fa188a5167a1dd5c7da4214970dd09aeb67dbd7e6de7b9cc72a491c6d0e443f655c03fb3c9d27585162f326ca2bea75cba0676aaa1f7ec5661c3f898862cba4d0d6390992b98d475930ad4219128f516753fdec5e9f9a3261f88c3d61bf3ad11795fa5fd8d13bbed798f3ae5c2ab572aade07c861c7199fe5de3e246d6bcd7685c0c16cbee624bf8358efe934a0443d68be4c9be174e730b76c0261e92439a23dd8562f1e627c3a72067ace8fcc744fa54ffcf29a98ac765225a52e5c64f165bd3171e2256103ea07815e661cafc66621aafb037eb88be171d14db7b3fbf322f2ee8ccfc69e40cbb637fa6716fa5601922da82231017411fd955f291ff5b60f9e6aca056464fbc8ec546f582eca333af1de4f8be44004f5f49e37d8629824a304d5736822ee25d045c4a955c42cc154e267ae73830f73fb4400ca8662a96ccac90561a3651a6c19723c0b279ec9a6b10c600ffcf6f08802846d2358ec19624f369fe6c05a4f5c5fc70f1737911e444edfa7d1b5c79630f852ee8593381c1572ce2a01bfcca1b7d0d2760d39e25463f917a216217f95b7480f8c35d1ea78fcf2399c6e8cc74486bd29a4ec7aab838a5ddd2da8336f85dcdca54ef3e71ad737f8dfb02eb7cd92a0bd07e861bf766d8a1f898cfba50b5f9da3215224b78b2073b94e35e81557b6a420bec86ac754f18d25a279c6753a20e9cd8619cec2ed7c5e40f3fd0d91deb6d5b695c30839cef5afe5694ee893bd8c98ee16837e97ff8619d76678fae59038a343171f6e48881a14ded0777b8f31d467ddf88c7396e3c28b5a0c0b1130bdd357d4f57543cd76bce087367ddb90aac059bb9f7ad5b7b7864e05dcc0912e5e001fbb32cdae097e6f7dcb8f8ee8abc40d111d336e43d78600ceb1654c6ee7a2cf58a117111ee599ca301f8e51d390694c6852b1258436e3b04ae4dc61b19948414e7769919d74d76466c0c5f085272b4aa891b5615a2158fe04e2c0bcf9947c9d22d1e7c08a194ed6516285f5b22743f1b3219755b0ef53d2de56c62207b9865319c97aa71205eb1a538f1dcc31bf7d1acd549d4316199187d44f553d8f4ca4b7b37148ab57383e182e2fb1df4660fc5acf0218b81df436baee404be7a864e0456bec5e71e16de4a6da1e46a3db9692ae2cf9b3eef3be15c99c5d270273c2822b3fa32a769a55b1bcfe708df6e2bbf6b0da0711953c2b8f0c994d21a2b6a0141ecbdb3461eed3f8ec0d40fc4cd5f41728ed510676822062f80bd7b6b3303fc0b6abd4c540ebe99cbf3cae1c2406285d4d2d8e196fe5e32471e96ad92874b4617179ffb70175fc3faab89ba677b890e7b54eecd7b940de69829815257d0d18828705ecee8d1e1ada10e3c4ca96662d1987e879c69c5fa8ea3006da4a3acc9ad13b02cf6c9d79cb094ebcfd47826f4afcdbc443e6cba6e952acd52dcb85b5600fed6f06139ad32680b4552d272c4125d6f87e8d6a10aa2aeaaf64b83f21fbd4bf11b7135ae9e7160db71e7c092d171641ddd2210aeb44428167e1b1f474942481d646991391424788d606f8a12e0544bb11edf5e53413b556bda8acf173b43bf0a80d59a65678c5435a356746fe56990bdab94a57142e3d472623cfc1d71cbf21da931ac49dc89c53c667928155a945770d529bf1335a7869bc80588461ff00e7a4b7be008851b841f29c2050a0aed7bf5d9c8fafcc42baa72df290ad1460150a57c55699ea612977c7200c375657df1acdef3a79437858f541ac3d2dc8702ede5f19fab9913ab0983f77e0f4c5c0a7842fe316c6094f303cc84707f018ddb5fab080a201762fe80d824b7be5e314a8c0d071e20ea23f470162765fb29875637c24725d919eb3c9748025432e9d100f2ff89c44757c2511ec3fa40c4f2fd3f78bb6640696eddff515e7e79e9d2d2877505dc676e6d8f20375f7c126739b5d634082f53d68a29b1929f526bf701604dca66981f86a23af3e80e264f2750cb38731807453791178c54456fca431418662feddc54784cc29a18e5942485f609b4250c7a439553b91b4ac79397712b8c711e8dce38a6243495c741de7f4ee93b3022dd89e03c0ea25463854c1c6c11c6be59a07833e5b21d671838420c4a23d66dec9149024d0425e86718e431fa799261669ae56685a03c2b8c21199162637f1effbd81bc538df7cb13e204bd2470b042f2371b542231ff1db1437efbb1a7fa53dcb25a1213c96ce28db42568cca10984c75a1a8a2c27176572da05cf340fff011c729c307ce33bfdbde6d7b315393024c2282bc5ddfc46814a12d41760ec5f96df39c397d54adac182132eb666aa8766ae9f5f680128105f99410ec7f50859c95f61c5269a63cde2bdd02361958a9f1ba3bbdbe5197113579560252aff0a57119a638af448cdc2ea2fb021e9dd586c6b519b73d974044fc3d1619f30f3e28219e3efa78f54990ab470b95bb035c8e01a31421766157e5544f5c5d615890fa801adda41379d19b1c5a3cfcbe92128644abd19ba41779d93590e6492c8e906e7454805da0cd2679ebeaff1f941a278e3e34cd2cb76918dd238faf48b943d4eec898381394a41bc3328518124d8b3a954089d52c9088ae045065fd54058d9bb60516b11a76bc3c24389a0901f80747210278c631e381384edd8308b1c7f866b30852a49bcb74411cf8fb2c1901729206b55b077c3ea573a6ff8d26e6c808942ccb88c0222670bf09b3df601cd76e344a20d53feb9f016cd34d9394412dabbd1bd7fecc750dc6aef2a40230633318f76019b0e4c89b19a17d3c63b6c73b3ef5532f67942bb4a7f4a16c16a0d60c412b311501d0d51f3a5a0aa8d692539b87eceaded56ac132e2acf2d9738ec4944a45a44c40a1eabf38f1149be81277190664186be65eb12f61b027c3d3a0c842819830d212ab7635d58c976c14784e414aae792c9d283302a792809b2c02e5db13afd385c2e6625d9f79c07d58f6093bb4653d3d0c172a51c94a49c0756a9b7f8533499bbf3384a925b153d06169c6e02367f8d4ae0facbc659ffd89c3121efbee219445f61dd6eb9a057e199a973627288034013206dafa58b194eaf76090d801219e77cd01df6a1504d5f57ea58d351fdc20be8a9ad5ed4f2ec78320c47a754ee8b0ec4617a3935ac5139d188a575c3fc01f52334350e14d65891dfdd2615658da107bb3b5ef1bd177828c96c3d9df2cafd10487eca304507ef4ef022b157d4e2830eaab088f6e5151082f7f43b0dd0a983acd8d50862058db0c3fcc3fd5863bd0c7578144eb4e42431c2c4d6f435ce6f795adf34e919c367bae02b5241a32e451c8db62e7a1bf275780b85e7e0b8996a0127d920398a6ba60531d7ce9cab62e3d12c634f9cfb015cf027364827718d40891abec56e83e4ab53bcdd1da577583d8b2ead4380bba0ac41e8b817b310254a56957e14255320257693c97fa87266b1aaca70d561cb397bfda00dee61f0488c7e01295375aec4fa7483532aef4c6d1750f8b9e2f56d1816fb3aa83ec428485c02f2170249b52d0c24bd5854c8e3a46a92ba5410b709952e55c3673f58c7d166d5bc0bd547b7a17347ae9cae38e121b5c4f182a955e286be5ffec09f1032a063c7d48784518df844fbf46cda52aa51b1591514f4ebc0e1260219c372d5cde8c922ef99c5e5f5517c62d73d0591626287b34cd1ccaa6d35159c0ffa71b16e8eb13bc702168e33ba90185c946dde7a7a08c46f79d731d7a6a0ed0c1201094fba0f53faa6155be8053aa1b1a7dd85cf350332a20084b86c4482af597e17e3b3920fa2cce942185c9721636dec466f6f93660b7464c04f861d9aeea848617792ccaa7c5d520381bb1d360d38b2794b1ec9d9aaa44094ca90593e9ef3d7f15a0601477cb852a8294bcd4545727e98fa5d138ecf05f86c6f8723e886985c09fa9d6491975fa00577529f7b638f6d086ad051e3d952f215771cb4abab01758fa1711ee5313270165c8bcfdeb63c8317068d9268b0f7f6f22108a16bf38f02697b873309489b038c6c40280bd28bbaca0486a5adfc90dd0017ae736ab3bb0bdd306b8003c5d413fa2809168bc451b6b61c310af53f64b4d784bb43c532ee440d5409dd25c0303b4402ed7b67b94231a0a1d86afbf5398a48a2c024ce33238e93e27673f3526e87da6bcf9a16e991ad0d13c81611f4d5650d77366a17de0462de76d02b82db9357e23171c269c65dc92b215864b5b4e91ae6dc23e0bc3643a90103b06dc0c450083bf1767b2875fa0c7c3e264b91e3a5c0bd58727282493c2f87f4af126172e39992b8c331ed13e5048e8fb5eaa3efb74032fdd44e007273274d3662ab306bf8bebdff987815ab0156a6b8ffa0da1c7b79b86ab5192fd30972b1c2032eb2db38e0809c44c76538fe910e1cd1a4e785ac2f5150a0752d584b2bc658c8a01b524d339a4bb970bb5b6ed43e82e986a1fc048f9e2a491cd9bf2c78b08ef486aa02e3917217c8b671c7b45f8c8ba700299ed127c3d0fd3f12e8bffb7c03647876fa96552241c9eed3782df6315a43252a4508f12aa200cc080c7e3bb8ee8b8810b8def132f395fecee287250f6e7bef415ff10119afcbfa5ecd1be4add1ab234fa30b8fe5350c13d8c17908e6728bae1ba4fc1e1c072b8c94f42faf58efbbee59de4348271fac73e1dfe7d33ee46b7558f5c4d20bdfbcee3e82cb9f1618256d501a2e0e9a81b8d8f0d23c04dd23fb6990c884b9e026590f985b7b1d31d6cad366394c811a88fc52544147dafcf8a57bc068a26949fc0c26256b9fbc7c3f503fb9630a2dad9f2802495eb3b898cdc6aaf95c1c70bf3630edd9352a5faafdd8b59c78aa4de6a33af874ed960854ddad1495940564679810673f13cae7f9cf014664823e5d40ffd8fd6cf0f053f6d4fdb8a938c9b6784c72659ae660422036e822910a608c50087de16aa0243f3dc44511681a42bb82d9d608ec7b59f56da555af749f0f1a524d28e4610ecc15817b9f4da8370a5f98e3ae3911b0fb12bb3fb1ceb70323214537a74f0516aa8726468636e5302645dbec7b1fbec1f0006efc71af65f4c54d84bcf7b33f71ce6e233ee13c743f169279595000270ca94757f4f6a3f2f23f636b40bd317fecec2243fbad6db8ffb3dbf1a50eaba69872cfe5c2e5eeb6c29d2637faaf37aed8639fd19f8bdc51f9b1341b98ea34baeab3ea9689dbb02572dcfefea6efe9eba3ef0eee9d9c569472deca19cd46b1040753a4967e43b4e22243ace19a2c03e5d295f28df8435253d1f85abfd4dee5736a31ab10e155d39544596d82845fdf3aff5fd01e9a4ab2d3409ee730406192df3f389f53caed958614f1bc1e69361012689030b0ee149b52d508ffd7c21905d1a9050709f6efb9c53884318428c4858d1e84bfd64d10f1d6a601f320ef75dc27ef429e329a90884e58fba1f772fc0f5dd7c210f3bbdc3ef860851841fb59f2a26d249150129dffdcc5ba1fefeb7fa19dbc64b08bd8e4410b456ddc15b59862bfec4086dcafdf66f97f538585d9ade8b4735f8d084c9407525491555cc01a798c5cfd8d6915b653ba1421e095f9f36d36d9d54314e842dfd3e4845af1670a8b444320281f2100b47dcaa3cd6e88f414716585a23bcabe91afdc83aa9fbb4d781f7cf4a93931f424cf7ad41d3f7e9f84dc064ce7c3166bee18272e8d234196161b5f3700aa67c2cfc2473bf94adbbaca9a9a5e6d2768fa521fb6359db929bbe74eff0906b27e5654c0aa82ce381dfde34df49cb993be982fd633df33106db0ea409144e9d8af5099a657d6b3e7048111ef0a8856b7028255e375a118f55aa4c75ac2b912aa09fc79e8ffc4b9ec686b2b7c5022ba457fb392bab81e9ddf9cf7919a07dbda1f41c7ee671f4473deafdcfb01f24ec3d74992d38883508a31784d8eb87d995275d791bf8975626935584fb06f55c3fee2769115e970228f6b7f4d1c2c6428dcdee9083a82026346f49d6f21927895cdea9b7d85d8e79b9e044d38d72e1c925f6e1fbd26958299c4a6c2c84205cbd03a12a57526383052cc0c24c90f62dbacbcad10c44de686572c99702552f8b1b37a9bee72d7f2e7e20aecdd73046c95c818e66b66e6142a8523679822434c4221076fb208746202dc2f8abe131d096881c366668de033d150164ad7ba27ba1a3ae5eaaff0b994323413ab7198536fcbedf2ff627a7cac37bc1dbf624eae3f8b7e8a8805fd163144ff5b9356c87e379eec00102d365a4fe0fbfa650f0708340a39020d484505342dddb0f04658d637f106642c9b55fc6f26933468a51049b8ad3e59b05efe56c047357d553e9f428c4b44dac044f4485e5c85f42a394f96532c795071021e297290f51724e578b741882ca0d4832bbb48dc05ff6f542601d9414462538b97e3df592c901a4e754b7e4a4a76ffce0dfefcff0d54264302a83fff43d7ebade7d0930f5fb038945503c360d5bc206ff5ee18369bc7aed8c57d61fd12f04fe29c8a97c14bf6b434223105a7694cc71d795c315f3e37c936a20cfcc42600d05e0d0b936a2059ad9eab76815c6a938bba286fad6544e463b660065cf476d600ff0fe641cf3e1ecab36ab16e30892ee8ad8c18a724b8759a7b718ce9ae94728b2dbdad7198cc3ad36fbd4eeb8a1855e14d989888b6d65b34be223d6a152d3757723621886ba44e380f2ed0082086126310996e82ec742d3d52045bea78dbd8dc37c5303e583f18db09f8e075586237f08860662393fadc0fbc06afc49a57ad50a7fe9e7e9163566ff93850b988f75a1294bc1ac150be1f449883bc9590124193dd51410463aa68afe6c1b29f4509c660f86e75dffdaacb14f93188543f695f0ac49d11380853c84e2edf88bd83ed99dbf9012f91cc251a6856a240eabc5755dedbb71e30b8330b80b41a75f5c40bbf3929b7e99a8ed341cbe01bc1f824b8c0701e3c00795581cfc9bfd4b5f7de1ce533f9e60106009a1748f5e1798be5b3184dfd696dbd4249aa32e6846cb5817da8280d221e03288b93eadeafd768f4b0d2055ef2a32369e6f71eff7d8db951a88c2c2cec294842de1a62ac0a7c47ecc6f3c1f9eb1337935dab2fbb8e63637cfe067084ef586d862e2e9a48d1875f9b2df6bafa846d10810d6ed6422d8e3f3115f8168597f6f0d7d87bdbc378da3db6a32d2d162502a0f9eb7940ddcf532ab6182f57b7bb62317ec7cdb6ec463d6c802747482951a55bb7842247aa2e847af215ea81e93afb1095cd315b839e4073a97f717f9cf251374fc192ac190390c66451f1769f2b895a63fe6092ef8f8d9ec09a793857ac85684e0df92bfcb6a8fe11b69577b23b0addf2a6cb3806c7c643397de7228e16ff1b4fd8f3722d5450027b652fc7c48804c71ed239b773c48b72594db00576172d345b50f287abc1284ab52c28b818b1906429594439344c6a4e5585a229b40c51565751d52e659851fa1ab908d237e649808be24ea99b0405e8ababe1ca765307343531db4187335b096c689d668d582edac7047878825840ed90a00f8ef6681dd759f34462992265498c09e99f4f779829895e02041b45d43b525bcafaf8e600b33fa5b4f8012059284992b1bc86bbbea350597a498abdf3effd8d31ec6852fed4bde085665bef81ba98b8c9777450c473bc033efc8b7ce275868d1ab9517abbd105b9fc2504db4476eb44203a62aa451ff06f8c38697b7aebc416cf000bf6c17772f27122ab280afed2a2a81705c7fa12754d087973f7011c960e17fa3cf4df062a10882a923b035edc3893ba9d2a77126bf1ceab18b383c53e3f0f81b0caca25b0ec797312a8d57c1e02c096979b40d9e7e625a06c2b6884f990776698c2a391b8cdc50feb8773050fe4c8112f919d25b08647e972010000d2fe751f230b254e1c2e7162f552154ee96b0376523227ae1e8f3602405e3d0d0769043b35c76ec6ca95d9603ba2f8214038b98df3d3e65502f5f3105616d003b5d22e35a91563fd0b2630fbe67a14cc1c130240859c88d04e194c0db43c3cf40cb408ac76ee7e8a761c38c3e90272c712d1254a4f63d9dbb663c7e4b6b7c6ddcb6f9b45779f73fb6b748f1469e55c5970d2fe586e601b75ade37bebdae9fcde5cff7ed381d00f5c40d1876f5b79051c8c040aca7324ca7f83646348f48c1467e15e19cc18e4470b2d4c73acf9d72df9e3c8a329b951ae0da3d18da13229b40197f94e5aac6a58577c7be682b66955bec4f2a0c8aafa07ddf5efcdaec4f35b793f17395d791780630cbf6fc5fa5f1e5d15bc7baacac304111f49b7140c2733d98166e027945feae464ab690e085f60a729981d8975e68c2cdd5fec1ce27e964d8f7b5d8a0a9c23eea98c323b36287297a4bf55a67a6133a7ca4dfdb90d42c8b54f4a11f9e76e4ab3858a3828a9bddcdaa6552b7b64c2571f0464898c05b6f6a6b747b4b5d30c156e5abf1f956f6e26914dd8bb0f42cd8eee6e9c5f2529d9e66e27a61d76e4e0ed4a0196af29ba99ea099453bc7f5529d9676ed2d80f9f270feffd5505c99fbb99627f78de6cf8f75728257fd66d9ab2878c7c52597a1a983d52152027aabe702fde2ee6f65f1539d9e5b7a5da9dabb705fe7c1489e497bf9568f7bc9e1d78f3a12493bffc4652fb734d6fd84d8111480a44b634bf8ba2c214061c08c5c742db378beef95f8636321fff326c5b249c0efa1d682aff0dd9557bfac0739484e920afce4f1c01147ed3661e81413e6fc4c584a48ac7a54e9d3986cc87a81ae2edde442ea4632ce4d0a6929f5856a6af0f56eddbcd9ae7b8a668129fcd2d23a8c9bb8da47d4d16ae987099d1db582c719f7b87d02c20cce0ee19113ca715f61e08b0510174da6ff7d18f7956db67fb09d7987d98aad837189535117a8637c0f15d67009477cb2d6ae2c22e01c5d8d892456885dd30340a6e327eb032138d28c4fe50594e6c164419638a1d74c7afd4132b53b7772d8aeea61ce16159c97867544ace78921f2c1b4168eaf6506cd9514622a98eed4cd1ed3ad55269e2382448742a1c7689484db4c011bafad42dc73d5d64f93b03097a0f9ae5886745283616a789d2f1e5e0d88852acdfbb920581066f3d28336ba02dd0887a79f7ef3b2b055f9bada3d5541f4fc7cb708a3a03c112c19c3d868c525e4f9063946c7740195b7ca0a9e2ae213f4d720ea413b9a2e3abaae397ab33b06eaace27b8c3dadd840cbf5ba6d0dd6f19d8038ca627b818e3fb9d4951c7da80ed3bcfbc046910776a87389f367dfcf3b24c0c1312f8973796161ee298349cd2b5175cbab35f89372a179fcf2ddb5b798ec6f9f4f6f389c69bfe99a1394020321916afa277a4bbdf2486bd5f17d1babf8ebd59f4f2f8bb3bb7719ea973d7edf2d2871e6c796df39fa54cb17aa50e6a6872d4eb9eb8e8e8be4a6a24cb590ab1c5e517c7b18625a022387c174d22b6618d2f582ba289852224c9fc69cc3207ea084305cf5fc1301672e2a809331fa7ffefa04523a67b6fc43bd5b5319c4ec73d10cf44d74efacaf7939a755aa0a683a1aa5db6388174242194fb1bbc69602a23241a81cfe574e5245c556dbda03eac64ece5a5b19461225e3006aed1ea401a5137c07a50dde03604889e7880917cd7da84df57e9e70b41bb5e2007180489fa8bc11e4e8b5a407ed72ae35b15c0df7a0d3ae4a532504696e61ba6f9bda0166b2b8d7fa49ffdde1eb2414418e1df07ccba396dca45d2cbdcfd72ad66c54a74f9c87d2d8fa006e1ced177a8645d7b171f1ca95789a8413de4536d70eaa16e1c24cb1066947de1f78a3bc61c60d43a7a259c3fac2c88ab1acd05b89d7fca604c872103ecd34120ade48c48ec79b0f934c07e47b167163ea3fd0e07587cac6b01923b6ab899ad380eef4221f5b25d736e590f5e6754b8b526b3f3ef2b0f3607c3ff3e8ce465b32826e98132d27039d605b9dd9879f12692667763020c2f10976797c03cd1d17181f0966b1c28e3ecc02f21e5ed3c5e06af70544eb89ad87c4528a41142a17f64ebf53c37b596fe249c24c05a82089e627cfd0833878b6f0e42fa30154bad0e8e60d86d917d300a5813967eede2371672ac81cecfedb7fb665c905b4b82749747712bae563e28afd0464039f17d232d581f42e2d11d6fbb86ecd97e88c260eed466455c4509de45dff9b147036af7b13f2224bc02d95d399279ac5e4be329a76bbef6cacf5135988aad925d772a87af5a5edb0b4afd1250ad4a816ddfb33502d620cdf8af3cd12a99bac594440b70b449a5b9cc554a2d346a41f6a66573fddd506da59e98bcda9f3fdfa4f2e0f296c427f320db8f664ea695a14c39e5fc6ac557e06d6082f62a185e6b46028ca4cd3f5bfead0113ad9f5c5481ded52605c2253d698e7ea006260b63377ee59c46c62e8f88c628c09bbe306fe2d2976946b51eb0c6ff710e08db721f1385101ac163a52149970892eea45666c2b78e941ee62e6ec7d9a66828620fe053b607fb5bb1634a5f4a4890028f14b8b4a835ab988ccf2159ce73eea956810dcc221f6c88cc43f70a8724c6c748123940cc95ab39ad8d70e47aed04d303f3aa07d87e83528fa008618157ef03ed4dda648927cadc3ffcc0407f0b8d66c80a6b158115659586a5ecd8b68814d246a9fc4674578da4299a27eb1618fdb5bd4fa8d188b84116d4e4df7fad24b449f54d696d5344f4a3230b29e5db91af1d6f2c6249146b1f09444db30add7f8e88ff56644e834ca313fb7cb25e394af3bce32102f9b362d73aaa16b9cde0d4357fb3e5161b0b4ddb7c351321cd904626be85561da98739397c20339ec68289b5e58b83e0467a0ce8274e6832eb6e43650224bd2974c867ffcdad9440dca8c9fddbdc8b6fa701206ae776e55908691fd9a2842dd136482f139e1afbb4272de27e0b43df896a91e0fe088a4b2c2bf2d33f11c30c68a19e196cd3ca97331f742249d85e8a35c6fd685f28fa3e66afd842b8e28865035e071ccb12f62dc7100ef6952c032e1178f8db0958fd2b20fdce1b5ad8c04d65410646bef32a6b28709b5d8166e302a6e8e97742e158b353e26b0e9adbd6c951dcb4fb6155f24c93f5eccc17bf9f20b8751ada81f2a1d1d2489ecc3df5e8bb7c288fe91be75c22d6a4b3a33e58de84f6bc2b01a637ce05cab51484ed0a166bb966cc23ee56431200c1366c6f18f4fe64a382aeb357c7c9647c9340881f6ad95b6fb66b2d3e33e6aa1cb041ae66024b0e03ddb2fb17ee287be38977d06c267ec9025bdfcf9f347bb9f1490f2e492c788910cbf486a1b5e87588f4b4d6c31d4f140be49b8d0c689adb3adee6a82e89e9ef1b96b3f00a4b3a81853186140aa4cc599f61882a55ab5cb8a818acdb15a6e6037f85eb0e411a85ab26da0f994c16cacddbd562dd5d9c11b64e4d297bc70cf39c32c39e5b514f30442637573a2d5d5bc45367c74168e68a45e830e72b165b66288af8e19d8d2465a255c7d966a3ae693f92f20269ca9588f4ee5130c91f8cdb4820d022723fdf40b916b2d1c06cb2c9e5708e35c726644dfa2b90fe627befbb83b30a5a59cb119d0f6c663d7b69dd5b4bc410ce5050685387610f70f983f45e5d798b0bc6845c6998d7888412bf77967103b6e399099a41feb3166a887ae81b1b4e649341c9c9e51e6d6108f3bf4ad754598ff0821673ab777f87f861a09fa27096be0ee0b098377719fc331bce8bbfe02ce9e2b24f767a56402ab456f37e0eb21200575135286288306fc9c9dd4a10ef4572a7341cbeabf61d6d5ddaad70eaee1a23ddab6ef09b9c4d1d61807439282c37c798894d692030d16e8e98b9e18e1e7a28934b626b4d105e22494ce31642600badea37e18b34866762aba2c8f9dc4fe641e99c38045b426d6e40069e08378cdeb32d0abdaebe8851edf018661d4da4f875ba70ca42fe75b48cb0edb58e8952f04d181e5ab76413902e26fd1a0e93382b2e87da7a5aa1402b94ff02cc9d2a13d9b56b65feca5f5089f74598e42a5c91869c25c432482fa14f218b60dabb5f6bdfdec9cd2df10ad2d750570728fb69e244ef6734612630215ea29ae0c0c02fade927e1fd177ef2892b95fe9392f13550ffbe0900c9a6f7603e2cb13a77f70ff1fed2b4f4efc2396cd00dcc344809d8ac9f9b0517ef6b9839430a1ee307687a72e588fe8a926da4aff893636ca2f8ce337c7d8e30e7650868e440edf1e1f1a0efa9810626673372228e1350ab8179ea03b9dfa94e9995b3a3b6121418b48af77a4a2c087fdb014601fe736ae80cc26181978f466b221967a2ef7351d60c7878c2353c8141a334c6ce5521b8efc5a15a0b31e6152ebffb9dd5c3ccd35a5cc4d39979a1db6c296a171b5b4e62a97000ddc05b6f0a9e93590eaf8d09468900a2ba254a9dc21c8579009c427b485e96406b5ec6fe0d6ddfb165eb5714aa64036b1d99db667b8e66cc196c64827d6d967c693c8bbc9015506b93b05b317b76ec0eed64889fe618dff9aecbda004915fe88aaea7d9d06b4332245e660571f4fafe4da9e84d32261fb3216bf3c2355cfb18396844186eb8f55827beec0530812aed470a68ab3fb9442c9de9ef26b3a405bca2ad5e97e4c352b7c45cb32e890c498bf870804eb68013a0b3f8ee810182e4aad47d1d65213d3ce905b966726392ce69cf3955198bada521cdaebd77d538b3659c6ea428ad96d7918ee5b3d5d50289add16e33378f28653fda087a527ea08f33e8a1b7241a3e6770f32f0d9b78acab098f8eb1529553e88daa6d68619337a1651ec27659ee9683f36db19086fa73be70e04548dc10235a9a29c18c0fa48d6c04dc134dede492089619a1824587f1a9526397483f13dabae8f2b2172496b66b8c5d860d940216313742f3323a9e3c2b03e59dc7ececc679c49407b056d6c3806b9c8d0123913b6510314e2de36953533ae63e76a5d125dea4da9c5ea42e9f3a9e25599d958b216c2e035c13f04b2615aec119dcc812a6b17b1ee4a09340acb1846521fd056a366c9c7479b49c20731f886a56c21e0796d5ee19c0b6fa4547fd89d653c56e0cb5f3847c15b29eb1b9863982d94f20be6507823e57ac3e92ce3b10a5f7ec1398200a1fb9555ac267625f9868d5301a25969ae2a8d7bc0d19fe4fd8730eb7923e30c06e8fdacf345d2bfda7adfa2cc5652b8abd4ebef29f3190c3dc36f85248876fa2a3387d544ff00f64df30534458aa0381028baed1fda57a5b329ca2a628a30e834c6f7e09af9178fa2eaf2fc49348dceed4f9417717142be3019b94ea5a9feb4b2fd082e1b099ff8350ccbb653b8370b4f9ea4ee77cc01a4c9f4894453645944cd7019e4a09f647024e843e4a0a06f1b639470944c3e9b5f40e28d49858f86dbebc5db762bea9cddafd721e09b8762adbc1eb3f8c0a026636e1a943874b406804ade017f5fdf223a380321c5c98618afb3364209ac28d130f3471e4628473d2a3b23d6329bb11e2da10068d1d6b8374bb4f740919bd7f8cfd9a5de82236dd38332acc8e4440060f8be477c7209a745a4665b8bef4d7629a18813d7bd24ccbfdfed9021c0227a7fd1ac755f644eb46bc9d18c8ee4da56d2abe4595594fa68b54c09502fd59694cbae8dd33929c59fdf546020954bc63472b26f28b3e321f306c91256be8c02a7cdc99e6b43d350fba9d24df29fc8a93030f93776590a357e49ae0d03c40b5b300e499e90a2022cb8743b9e1af3834b633c8a8a6320f34c5d9ca0f298c6a17738ced89c2b4a1f826a3aaa76fa93303a979e3a04250ae7b211cebd2d262fb4533c9796e56d465e1a4f4db56c5027ecfec255186b21e31b5991f615164b2682d3706374d6caa680423159fea37b475770ec849f0534c9a516922989aeb2e61bd965ded4210a2b28e7fb21effe49ce119ac426e181f848bdf3fe6435bcdc9e114b5a6b0576adc87231ba064798107f311f292bde1e62a0f6f79c33bc7f61820d90d4ad01180a4a7096845f8ac9c2dd09c941843688cf3168216ea6e8bd5203853f6f6b5ab978950258a90b2bcb637ec844f9a96e8a0dc4ef08e4327e8e4a2ad493e1560b2da6645792b08d316c40bcc6c2f442727679eefd8fad4c19adb18e07f8bd74537f06eb9530330c0b992a91e0d95d6e62b3acb7be3bfa50ea9d83ad1d00a0b594a813ff505bd01f55381d386c0978bc589cb4028ecd7519d91144ca24b8b7e699c1975c5d5193d697d0240a382051943c2444c1a58f5867f364cb8927cb55b475c0b445f5a91821b175456bad3a4617d4e09ef4ef756179c06611eb4a49cdc0be82efeaaf5cdac56d3fa1507e285155d40212bb8af207b8bfde03c4956795f187a121cef8ae1750865d4e1914bca7710927441933b80c68ed16cd388ec6c8a132573a1e7abba1ad17e9f8e0b9a93c9d0db11e406c7983c42e394f500bf20bed9cfd781c9d57c2c3798e3b52722cbf8e603cd82c3b7692b38a02f42ad838a2ff4930ca63b8fe6cf37a56d9a48cf5878d23ef04178bab4855283bde449035a147bb4d108017f1aa777a72272aa7c389fc5a8db2170fd820991d8c5070834a17edf818828da398614b6aafc9629e4bab6c1547801a826dccdb79f78ccb38b8eec2872c5bc7d6a605831bb2c67a8c8052a65a19eb049a63606a0c1c2b67d82685dbfa6a9b3ab76dacf611c516c62fcfc8de84825393a6fb9d42ee38d3fc3c53da8557769b5a98c6528c5a50146c61927cea5089e9c4d596b529e74ddd3d9d13cee41bb744db68b753894486c6e897c2f5392e1baf303290dd72a530b8192e81c25c66cce8dbb0ba02196aa855bab08ab92774f8cd8262c3ef04f0658f30bf56142999d0f75997a18ace4045b5d1da4716ec64a3b3725e6f252df4134b2e405b41a06d669ed010ad204fb250861bddffe08f5486b81a01d95c5e5dbb01022cb05094c981e73a5c9cb5e9e5d03df8d04cb8129731b93d2f8f9916c2303010f75a17ba8f54f05a5508380159ff21084cda8d5a55e31ea9784b666c4306e82a2115d19f9ed4979b3774acdabfe5bfaff6874fb5c24e1053b42fd5892a9bffe38901c8ba110319cfeb39a03f769b67aca52710c7e88fd75738e1aaf37ed04b2b295326cadaaa6dd7346e530ef88484b1bfa769f50f672b3b82feb7d11e946dbe8c050cecb6ae9a441109ea7a17d7ca98694e4dd149d1e292123e28b31055f320b0f4dfee8d3e6e2520ff74245e1bfe344a8572c5b441172adc12a8f33b393bbeed8c0f7e2624b7bcb57b7da8a1f53fa5c8b599b7778bd85cb1e8b90cd987dea1170cc900c5e80db6450acc99fa4c8dabb159ceb1140a9d2aac75468400494e733781294e93b38273324cd3b9260fc7053b0ba0c69d78bcd230467a9a4ddc5d8c06fba4da7e2e4983aa63498dd69c04a5feae7a93f49c8d25bf83205a2cc0f6fd176d32656387f33c83ce4eb96275f532358b9e45bf6a2acfedf0147f17a310f8549884c3bfd80eb110ec8ce29cf41272220fe960ab2c59964e20a9d4d2186b84b560c40167412c0758c51503fd0ba4d3ba864308742c75b05dde782ef0432ac37deb30add13dac0e6021705649e82d2cb8e30b23143e04c643738ac69cdda9cd97f97cbfa1baae2b076fa78c3feccd32962bf2e9339893301b94f30fcb31e8564afb067320608bf2fc177624ceb4a1612a5ded969beec3a10e00b84db5e8180579da0abd40dcace57de8705d80ba468a365ccd0c8c29397fc10a58101a0b71c4524f8b8e3e85d6b720f08507542e71b29501daea58601a2f8c9ec9971cd07b38a18f3f2bc68ff3b6c7532d9de6c7f0a9a69637f427f2bc787eb8ff8e40bdcc9bf18ffad53c3610eba57a53abff388e44db0da5db1367e80b51fa709a30323c59ea2e0c4bb7c9b4ab335648d49149bd827e9d13fc7e7c977aa5d38dda79c7b9cb600b73a115989527e80f9759ce975fc544bf5e00454763bdbe29c47f2cc7d97aea1368fc44c3fc5d9115372a9e429188985911900c62fb737308e290cec5dd26a37a1d835414d620f17167cd15dfaf2c91c911c26ad604b79195bf96023745a32cff21320bd862cd4b8c382d92e8d1bd75e120e27905ee7e1748507fcd0fbd8cc395c46c641b4d881e1f4a7380a7abf9d64528ae1a0bd256c41baab928948172a5ea1c50862454782b70148575c771211488a495cc77e969c74b4fafe09711c6d7093ce993e1f190e4bc9645352354517c34bb8ca173ac6b7f6e91e56d16a6ed899020cdf524af9e93dd333b09b48764117ce6eceafa4a4a13702538e667f8b04e99ada0b28902161f7edd4f0aa5d13be4582d4553e409425091f71ea261820277a1f3b392e5e7bf6857c3aa5ea07f07211f31203572012654e67223fa74f351475492bfca950119b4a456c0d9a1938a56181b6ece68e5cb76509a6ff4ed0a797d5b55536190baab4be3855014104c153e9e00853e9596f5ba6e5fb6ba70a6c279c878609faa35744aeffcbcf3e230a0f945db6c042ca2fec4ba59e8eec387f50a2dbf815c10a229a659ec44b63b3f866979d17c97ab4d34f0e0819ae8f627bc5a03216b7c1738513aa8905c8763ea82fbf15d4a5b2e543a30a913880f81702e8531d9f9e3ba5a2aba1cc21a1c1201f9d6d3984d6be271c24567791a708e638ec311843eaa32c93b89971d0d0b948d414899597b7808d7360cd5cb10eac20be53dbfa3ccf25984240e3accb26ef25a55a3d4e40f3f83b978032d24a33a07c78b3973eb5ef8f7dd4c63c8c2fcad8cead4589323cdd8ad1a4ad21b9d087f2154d954c959ecf3377c2e3665e9adda15310fc12d38cc20ab519f7ae365737c9b6ff33512a8f82efc44c9b171fa73f85b7fb8241ad0a4d545ddd6c606cc18e70006e4e0d534815d66d7911161ba83add966935550e28e1d90841a64e494143b21c5ce32e664a6487df95e2aa585fc49fb8cbf32bc2be86957dab37855bd4c99c45799a1d39835a02f47f4bacb97aaaf3b6f19a82816636a2f80bea9e4942e18087dbe52b1ec92a8663ac03fecb21747e7b0d2da2cd2e9bb80cb5840c0c27960a577b4cda60e26dd948b112d9ae621d81e2a56f2ee0aae1a270146179a6593246baad2a5fe5e65d097c66e90eef4d04a0c2d4ca9f9863fcc54ac54d9065758b8609d958a5c65b7c49de60847170dce5e6edd6590943189853c27ea5d049dbb21ec523d46b5e0d14a8f528ad5c750ce35580c3a61b4a6e6ff68a6326b9677178fa67e84c60b15998e339492af73ad20005e7b0ae34c7e1146d7ecaf4874fa4ce97dc541b26aac593349b32020a8a6ba57cf188cf3607170fb101f86b4310221b0c20fa290d96e9c42111a286e64490c3dc45f2e8dbe1546fbede92aef6a51fa8480fa5b21785f59571792ad4ca1d7d6b3a5117b5d20c728eaf627ddaa20034a08e10b6538096375847427270c646ea1a797ba6880a0dd36e5d00490904022f9643f0b8fffb53ccc01546726428cfde3313d66d98468914c75230fbd51e112d38cc50a9c27e6da079282c651f9eacf760e907890bdd26f1838a9ff1915e20fd357008b0a166934f8bc4f83d8a71adb96ec23c6c25d95812a28d8924e8981bad767ae1e8e426b1af0dcb24f7306a4617d25598e3188525caef981c4dada077696cb01c2d3edaa301844ab3270a22addf3e2a8b59927e4faefe39db21ea7c8973ffe32ccfa1a245895c513d8f329c6a5d25126eb5e215f53554dfe601e5032be3b7725907d4c5b9c3f96995f5970c6a2e353535626c7e3d8a60b4f402efd6183a6cfee9139c5724dfe2bd5ea8e9c70c3f52b2e91a23bdea04675ff7651c06dcbc35215e797ab1df2a2ca2fd6f0c9aeed0700e01f5127578e807c3cc1d86d41f79f355b0124e0af71bef97f0b3bcbd17cb0078548b656eee0daa5cff37c2298827e7bd3b03050798b2517c069ca36c644bc8816d6c0875cab47d22fe0549d0bf73fbcfc44bd25020e502b0ddd32022b065a4b9f7daf4964d86fd3d8584856001e6c480cbb400da434149dc4b71f6b0d234497f840b36ff8c1da4638dad478c276773ce83ec65074ffc67ff750c22b449b4c40c040cb4966e9b7e56456f3cff643a34a5a135f976773473fdc3e159be69b6b87604e4b04385f9abe759f4b7a5859ce79531880c78018b2277113bec70c9fe48693c53402fd4c1f8cb8c4a371be0c46cb074312b2a2a1f601608bc56d09eb47c9010a0a0cb428865d521ff17b757f6c9cd25a9cfb45d0cd751bb4676869d73aced65105a1606d94c9a023731cf4c01e9dcfabb27a059678697ffd48937d81dad0bfa98590f977e248b39d17aa2d9fe2edabf51a2283f8583e17bdb0241992fd89a9007f0a923ba675320a45daf41b7f0b00490a107115362aa16f1570b9acefbf06645a41a3c868774c7249ae2b77375c94e93c4e9e2a29d8c43a60af2c1f9c3dfaa6a234810105db3795ede906dfc19b7e9eda26225e4eed4ce43e4a4e9d41a71556f507e78b55c018e6a6f6997e3051bda142d4b84c530181b93920c8e258c4991ecbcc8a06eea8408184b88def4fa906f59d2eb096532ea2ebac20f4cb79efae1814086516486f35de3459bdeeb8d9f12d5e95a08141638128c063bf2b52d044773427ef5dee7360270b4a507bc36d37c8881f5a86a99ef3abf51594c9bf079f391b59464c96fc2319644a5be30a1c009ef9c205b86ac903c21c11092daba944714d2d997e18b2e3502a7ab56661501c4c7cd210678f42b6ede3005168d7b55e3c5e70f8770243f9e1be5d489b090f30d9ec24a31eba25be0524fbe5b710306395bb930f7bd3ed4ffe0e2091be6495f4a40ed063bb2bd5ee21193836273069e9a82744d37c9d31b8d10d8b9eb4a87d6c8fa47b579519c85ff500f592df69984d18d40ecf2f3f593aae4493f84c69a6f3b6f09b4dd9bd81d3ea079234cf6ee08281cb5de7c6f1894c5d35757d598535a83aacf5352f447abbb3ed109c1d3601122ef7f6645bee1426f1039aebefb95737363a73999fde4655c093872dbfded9053c4752d364edc0a1be8668eb8278004bc7fada6e1f286512219da67f59ed3ee4562b4c3ebeed8c9522d32db4374feeb79dd4f9256ab82104d13267d0d5d05ad4de6c21ee569f310158116189063624cf8f687d8da80d2ecfcfb5390b568c8c941bd30b7d7d2ff1899dd792138601cda5046576ce52b82a112745d6948cde41b28493571dfa3b80b0ee792468bb009e9c9ea63c6397242dce0cc71666c25deb59e1b4f54ce16c610670b4343bdc5acf74c36b32b5a06f3e6cee020e8493935cadda985761b567cd3b394ea7a1a9c19cc3aa64fcf817e4a96a7e7fb7c81f6860d66213cf187bbc0dcacb429deaafdda5757a41d02918a122103cdaf0aa6558747fa4c32569e9ae490913828e10be0e6956c7e1317ce5e46823f9df6f275cd7eddde90f2ecc1ad638928e4f89d38beb5d7d661d44c3c099e22d5af1cacb7ceb3584d095a579600af5e8dcbe0aa166024377debdf49cc82cf03e2b786fea659f3e58c55917ee649b530caa93a3dc78abca9d0addce4d17bf5e74f34719e58249863107751ab8e964acc9749b568e811bc71c35d67faa6e904397d57165c09491ffb2bc69f7394c9923e83cd39337bdf7982a9ddb7adc1603da7e9b98b91a98d0f960386fe0dee54f01f3e8ff3af17690af8728ecbf7ad2baff247d9c9cedb8e07e04c7663cebdfe8f47d200e119d7a1b43d2e482ea8d9425f27fa32746a3a5cdf86fdb034d182e5ed8d6de535a8a16f27f361ffc852287fc1f8ea312737d35a0dac8ffbdd4b044ca5b84f3299c900854576290dbc266c830baa9966ae14b4f81260163ca8e9d0020bae9b32ee93aa93fbbb7a628e23782bc002c1846b87ccee32199a208c6bd33bc004c92a42a56640fafb6ddd2f34567dc5d606f117c5a6895aaa5708cc2909a761bf988c6e033be00accc897f2f0000c5a326d0771ec4008c649b4f25501305f7e2e6312c142ee4b47615bbd649479bc2be7d8572f091acf1358309109d61e47651738a4ff4d5d619cf0e6ae30989833ef2377ef907159caf89663eff8703c112fe00f10e93fcfe834addce21061a032aee988c762ecf6cc2a1014b9bdda2f7739425e0bc25a0818b2860b16ea7377aef064ad52e85f7ea3398ab808374d3e4efd9028028085ab7be4002b38a09266691bd868718505c36c11e13478ddc35c7b5691b09300c92ba25368fbe11030a2bb832adc916840d5069d92514c3cf50ca1b6083100c88e92b7cbf84051a7877033a754c4391a4d0316dc0f41308a79af4606db8bfa7aa8b00ee274b2b149cae04722bb7e0c701a088bff2d44399191901c69a394b2988f32b7e0e20fd1d0fa8c3772ea557c39c9e8fb553327e8bda430fa2aa3be8334156dbdddf01ad0ea21eb0b9a107e84070f1be01080394058be145811efe5a5d1502fd37c9082b369c40dccae3244282c08241d092872f204ae3aaf7b21fec48530f7b981f29875cf7d4a0ad91ed091ccd8266c4e45b93acfc37d34e81965d356ed50aa22bc7de55b26f49642248bdb744605deb38162d30fc2a0b24502df0c95d031fb3455f60964987088fc992d80bcc52f55c66421d3603ff9eb1555ee0e9ca4117ebff8adea3c2959c1ced5f0cb049613168fedb8aeead139b57284a1e5a62b56fa88ccdc54ca34fe7675d0bafb6831fac4f96869a717b688fe82f71f4117b846d1fd80eb692cff378cd599ddd4a3445fb898502a00abca687187461f2d34d8fc08ab5449785e395947e2ea5d6a817860afba6cfbf0723d100163adac3282cbbddde96d95cfeff4e85da9b4b6965bccdc1ce203c10f64a5fe6dc33a09439cbc5eafaf7d104c26d36912fbe55a7eb02aa0f260e9dd0f763d44753836033309bff29aab095be0fc70d944f494f170621abf4184f908d78fd945d44df28171fe43d50bbfc9cbfe7a7b45478e3d8c0712c9e6f8e509a5610cda471e6dbc1ebda75aa44ba0821262b16f9fe71f2a616940556b7d116ec7c0bbcb560be6c24add594b559094e0234e9302a6cfe8e38954615a3195ea7cdea8b36929506b793e50df0d3b98a89a6d823d0ea8123815e8f297250d33ac85ce0df2e55f01c338c547450abd85542382cec31a165241a29098ddae78129196488981e1b5e9995df3699f264e3470feab7656598ca52ae1ea71c6cd1c3f60491026bc4dc2bab9bd929fa5bfd00c1c893f6b7b4f04bcdcd808a619776144c89e308fd88681cfb309bd2dd7203da1ddeb6c08abdc051ad34e3adfc86539bee35d5a423ae301396736da34189d96982adbad2b031ece7ce3939af8dc4de689fd2aeb2e8a9ac6a2230034d6bacac920588eaad65a4ec5eb0e39891bec00a59b7cb957a0a49cfd0e2cb21fa43bf2ed23174592a41d33667ef5ddef028e86f899cbcd5b78873cfa6cf27c1a918cde36ff40d0ddf646c9f7d339e1a0ac0040ec096e5a64adad5b347fe40038bfcdf95d9a99d003dd8eb5185e0d9a7b31dd4decc53af4d2856649e62ea74e2f2ef373aee9d7cc15889473d724d809b2bbd45f7ae7a179ff682f29aafee556925d1c3080bb65f3db3388195d04958d674fef3b5528284231c95991735aa5d1b64f9300c8980c749d1cab0dee9f89b621299be67cc407da1e058d21e7df217ac41e2a559de995930b10342bcac95d02c7c2f981011cf505592aa2f9f4bcd1cb3028d1b2a82a79215daef167014ca99949638b3ca5903dc073ea50f486c695a35b43b98b6600a7cea88aa6ead88248013b7a48320c1bb1fbaadf40177dbfa50d2f32ac8f04bb85c2942e50f9a6a0e43d208616f32c26b98bed6a34ed8da24071facf8e199ca173602a6c233a40268bf9c9b4db9ac16d0580789f42cbd13331945f54bfb092aa2279e4f032e92cfabd04805a670ba89eb29349e015f36d34d3c9aff267f90f45db44489d070f39fc787de66dda5e6c32f371451af3c6a68417f6de7a4ff622ab3367dc64acf039266559628ea6a73935560b439d2750418678b18588647ec1c7a3cc4307c32f55ebf73480f7b5c43fb56d8c49871374d85a4f38c0fa2df8234b5056efb854814551030ed6a3a0c581bee38d40832fccd155c40f303b5048c0ca7d3e988fb81d36345d58afe29c46e29194d64174fa891b4bb45f88b4f249bce8df5e3f3b0b70b13abdff33aa42b5203fbcd31b4fd40c2ba096db2770a1216e814f9125e91b7f27c3c1b2fc7f3bc27de05dfcdcae5bd40eff33c98e7b52cf87a78e0e7b140cfc987e3adbe0bbcd5eafbc00ff49c7c9f17e4bbf16cbc17f8799e07f3887c37ae9507be40cff38aa8f703c90bca6a0396b7f26c3cf087676303c3f922e402af08e87d5feb73bd1756308463c5f33eeff33c2fc85d9ef30fc8786abca8e1d44b0f6778e185870c1174a96328b1458c303c8a47030ed5c3041eaa4ac09f7aa04287271e9c454b0f61d43855a229587ab8a00456ea9021273dfc107252751c5124868e91229e1baf89181e0a9accd6ecd084a6c0c7991c1704cd88f880c2100203d121241bf000b40606339a8301f5b1e33cf000e333560c4ec132bec17d5386b72c77ca8c6a7b8bbb23f98b9b1e87a1741eebaea5ac65e626832daa5c362e1b50c7ab89cb66452427ca84a69e974febe66504e6ecf0c09c960cd4ad74562298a6cc0d552d1d9fcb0604d22162a444d50d979c1204d261c2472484b505f45a50185015054b9258e6036f402c3f27a802c10948bc30c163c1440ca698f081415641398f470a6b832faa5a2d0c9ccc54b0e30885551513005005c4a64b4e8f9c1e2250a920f7d2376e5441d936556632842e9b950e4b0a54a105135ea08e16116fc71213ccf0c106c905ccbcde18808e0f873545743901affc17264ee0c1f2b9a172a3410b041089cbc90952f450e504235eb0201c32a3436259e18a2a9cb38643191d253b3c2e43564f5c409a9870e372d2ba79e958152d555911b9a1e246d58d6b4907ea65458812951b1b2b3950251429aa7c80404d6e5a301e3aad1b1ca59e1084a8ba7959b980c642156b15b2bc9696d60deb490b8994239cd3e6c8cb4aebc6054427c9c608d864e3a3c7100d825880e4b5c195270d4cb8798dae253a4b8a969c5c39a02b080bb66a6293031ea1535c36ae1b50887505349ae2b184ac7858160cd9bcc89513a5273f5e3716d8149980d48443f4f2018d80465a465421d10126b136605d6063041cb223c98ac80955a390b7aaad82c0156b849e10046005be4b28e1051a269630028815c89040a5a56a4fce4200e1030fb86c8172c2d2811598d1121f0d322842412c1cb0660d1198c181940c7a820071f110012e8610428b1207302215e4e0b4aea0220149103104103ff4c0830e5b7c8e088d38dc1005b5660e13d03e58430d05c8b028c30bb626e5c98d8b88186028b2c9409a2288803969e2a307cecdcb35440802a000e1cb2c4d1d2c5151da21002a0060270c26552ca1841164ba70296af2a30738012f4ac0454a942636ae56132924c0091f6a10000b231460871d5ec8d224e5c9911c4f8e551cdf1ba01aaac6770668c627062b0c4f031f06be0bd87c9163816f029f043e2abe26564b7c526018cf8887c18b086b880e90cfc75781d743e4c1daf9442f04757c38ac9bcfe6f5fa5c2ed6077a2bcf6bb9ce8e9590951555a00b5520961612eab9da302114a28ac5ca7169a00113c01e92803e728038a2b5421588c5c6829b213fca54d978013f585d80b35b392f2a2fa3d6cdeac98f1bd61655af28aa7a8060824dd14a073672c0a862ada962e504b94055ceeeb1a2cae6878ecff58425c49ae14c053840067002d842d50e9e1d3cab2051e8f5435c73026b8397910bca6ac70aca0b88aa155312a1d64d0b89aa154e2b0808849364e5813920d00d15d6062e2fad20ad9b56989c1e393d6c7ed858e0f2b242c109ad202b264e60655195411810476519100161393b5a22e8ad825648a0538e8fd6e7eae212e26a6255a0c36be1ac5860ce6ab5fa56aed56b657333045cb9b6b8767638dd88ae96cb5bb940225008f45e4056424cb0c1807544950e244c105ba09057d209201827f4c8a8af498119194833012f2090c569838a0106a5230ea214e1bb861a4247c21d2fd7970fb234ade9c20214c0e085211b0630e50630302081072800014b0c21346a50c3b95fd0b90d12a8e1c0171670c001c8941002081f7890a5a90a150c2ef061011553905942891248901119822f063ac0f080185cd59a149cc00d10bef8b040c4c003b0588002100045132f04400559085eba64695a9240175844a00a1bac6c4003127880031460851040b080421912a8c1c0170ab0820a27cc547db9a424eaa829830c3020e0802912f0441131b8f0a52c0410be7459527a02fb117524d0050474c02106335f86d0c11215a527301d3aa097418604bad0028b2912f0441345c8100033603a588af204564494e46747047d4d196478400b0860e1802912d0441132c4100017cc8c210303020742e31c7260b9b243470786c0d0020b1e7419f2c10516765449d8ac59a5e043014b8e2f8ed711a0115f11df109e922fc96ac81b7182561baca805187c433c21ae202b20de0fd08767810d8f9d9d5508eec8d111ea04c9018233e446b471bd5aaeafd562b1569e0771bf09739870779dc73769755f9b73425f62d2de9388bbe7ca31e32d0f73b884394d618ecf0ff5a1f44babafa5dad26de9935daeb9de485a2dc57103878d10870cf719b55dfb371dfda151a0509f2850e8b5b6a7e13c11e214e13ea3354cb5a57b4703338ee397252bad2043eeac273dac23ee8e818738465ce7f1e6dfbbe684f20641100457abefdbc0431b316cb8b876eb2f29ddf852fdb8a43f3e4fe613ebd046091b1bbcbcbf2bd5a1873654e5fdd0868a0d1135690d539a712dd7ade9db6ecd371b50e731df48dce3849eb4a6b639c1dd2f70b719e185e6b5596b7fe61f77f771f7235e194e92502934e79344e2c489919322274d9c307142e4648913254e92381972e2c4c8c8a8c8a88911132322a325464a8c92180d193929322a2a2a6a52c4a488a868499192a2244543454e9a1835296ad2a4099326444d963451d2244993a1264e9818312962d284091326444c963051c224099321264e888c888a889a10312122225a42a4842809d110919325464b8a963459c26409d192254b942c49b26468891325464a8a943451c244099192254a942849a2644889932446498a923449c2240951922549942449926428899321a3a1a2a126434c868886960c29194a323434441ba21a7a7717e2a10b059d47dc798536aef6199360dc5d03f0cb0d90cf8d0f0994043a02a54037403723504a2975f70cdcdd88bb17717790c7354461ae9c1908c29606b27077201eb69698cd28ec066836a3b05d7b93d29bd9cfbed96ca674d7def4995158f9a6ad355da34489c2a3ff46ee8aebe1095b3b2a0a74e408dd95962f45da5b732d2777582bc8dda9872d1da7daee9346a9b67fdbfb64d2e19cf151c83ac37d1cbb70779787ac07b072f01f0a050a4de243ff34eb149dfdc54d335ae9c574f6e393ab59774f18ec62bb735966b47cd3ac240cee3e86e01cac9355bafff8e4b735bbef974b9bfc30b42c0270f72e1e8273b8cd82977bf9b88c6b66c5d1a4a52c45ee2ee4ee50dcdd030fc1289d474de6ea641c0a2a2d0edafa62d2dd7b90b9923966b3471847913966a424c9eb7ae4ee3cdccd7a6eb296bfc9cf51296d6bb349b76dbb8f45933976b39df82a6ddcb47192ed5ad3d61cb5db399cd2cdb2317eda5f65dfdfdaea8bc9bbe4ee629871ce4a9ff1862a7fe7ce9c3192fea9fa584a6bd6a9bb9431951ac6d9e97e95ecee501eae80e83cd2acb933a65577dfe1ee3a3cc7dd71dcfdc693c1ddb778f899e177fb16e0ee14a6cb7b621aad61ba4f4cf196e93c0e8d49c62441faf78e26b4448911f94e68a513274a9a90e42709c26172a49db76d6dbbbcb5b57d16c2b65cc951a84a89a02d4ee871f82644a340a1fe7a1955e0e1477d5b33a7e96cd7d98e879e09dccd1a840f0fbd27dcbd87871e0f1e25bfbed6dd75dc5963bcadf358629c10f953a1e7c191bb5be0a107e4eef74d0a853e8d96e6896f9afe506d7d28d597d7d29fc2b8cfb25cd56977b771ff4a77ffe1a107ea3c6e5cade5ee9e679cf3d35b69f9379ffb33bdd8eebaefe3decce12cddb6e64d6dd7ee5d7119d768fd5aee3ec443a77277d1439fc1dd75d8ace59fc274b72d597395d479247f4aa6ab5988cc5a88c4a6598576b9669a35dd9db502ddfde3c0cc17073840151b1f6890f8410004c63875c08aa89a0488d0c831957c784060e4050fdd6b8cc3061134992a006163d4f35380245ef000b2c2b8cae924231c843983c20faf0a00a98a02c7d15455c57c05c48c0d38384467bcfc4b013473c6a3291085600d2b72de3e622c1ac63525c5a25e071e134355d5b3955a3d521db4284b0a4b6b4bb5a817fb5c3ddb8bd9ec10426506779c1d3478d4eb99c1a3cef3ad78563c5b8a45bd954dec6bf56c2f06ae89b1c01e2a7c7bb1af870a6f35021c213492080defcc19907ed4e3317306ec49420c07522b2ac6d174c159519c55cf151c5f8959992f332798e07df403bd038020084a7dd4061c33f55156cf5e51d62ae6d1970be49162f5881913b3e9916a51d69415eba32fa957cf981808ae562b70058220b85a510ff43ceaac2270dcf3bc559817b5b1a1ceca1ba4ada98fb6280be411f32326f5f578cce31163c58bbdc4ac3cda23664cccd52305d28fb65a3d62563129a71ea3ae7365471538424000234408e9f5c011a265b5e3078f7a3d3e780a30b3a26652203a62d13154ad332dea3a5bfc8845cb90a9aa02573cad9e174f1488b3c307779ccfd3f1c0a945573cad568be2b8ce961665f5ac7870583a4e2e123ebaead2a2df9702092dea1d7d2e176db97a52c869b5563c600a24b0a87704521c9c1565f18c2173c43a5af5a4907304d2291f4bc989453d58d1564f0aded18e35472cb0a70aef49c13bfa7aaaf04a687d200e38ab2216d107429042c1a1be2ad2e1f9705639383cded1475f3d551ff5e88bc78f7272a88deb06a4371ffdcc8034877a3c24d850efb3d1a17e94c343a6aaaa8a27050e8e56f486c7cc19ef684553e0e008a4ae23440b487568d4ea0887474787dee0d033ded10df5e88bc74c0ec5f17848b8a19e8d4749c0a15f4ec8a323848a8bb6a45c3d43ec3edaea1962b7a21cbccce0d033d48c0e4d811edd504fa7a76a453deaf59859d19b9e2a3329d0231dbad2f940878784125614a7a76a4575b4e844ade877c363c373c63bb2a1383c6652e0e00887e27c3c3a2b1d25215a40aa433f58d11cfae23163d385cc914e0f0994841b4a020eebc686278524c470106b51ef88888d508caf89b57aa486d87d74889d102d20fd68d48a7af4e5b4a274f5b5a4c0214a23fca84789ca086d70848000867aaf55d19831257c74454bf02848c72411e5a22d3ac6cc197a14654359b48417bda13e26057ac4ea1953428bdef49ca1472b6ad353c2ab87455d3d25b43ccaea29d3f26e06aa8858c3c31a1b5060460df0f33ed002de1c4f78ab700e1318f17e2001fe00636172629f8ff7792b2f470e325e46af550370d05cc941220e35719cc1c6cf8e385a8863863872880388389088e309c7f158211c73b88ee741ab1d8671a461f580ab1c560e1c5a787050c08343031e1c6378dee781ac9507470e7000010712703c010715703000fc5a28a0f15eafd70f9082a0d11b676220f8860dde8a7e3a5756d4a3204501e7fbc21ef405d27ae0f84794055116a0e7795e16edad413dd08d39dc308197e6042dc4da30b3a24f629ea6046956ab96c33cf6a238613eeaf2c0d8176bf57c445d84ad9694778515868c7f06d820063aac0d11ecf8d183c562adbc1ed08d1871d88f188b4533f0271e63d1230ef3d80cfee36de4f06a0388b00d247eb4f1046d638a232c26aaaaaa8e38720aea286d10c3017df5e908332616c67b85f9562c23282cb0e5020816b96898bd22dac24c122b6a26057ad4ea49e33908e6803daf2f8ad6ebd57ab53c25cf080a96b0c7aac56ab58c5a2ed7b76ad196165e822c3e1c56192008b672a07c3facb0022c232deab2f96c40b0f5d2c971b9e84b47e7f4540163383d2c0f02691530e6eab90163208e0dbde159c16c28ebd371b128c8638487d2d0c5fa7c86582c106c5110a42d90b66e22f0b2f93e9beffba80d0fd0f7b32a8aad98b810ebfbc0d647592da0cf670512f9a409d18055d8785ecf8fefb55af5f8b4284be7f54d59794e73404f07a43d3c90b27ae440f3796872c0f93e96fbc4b4cbf5ad58ac6fc5ea01f2201608aebef0c2c603592005592c10044116c862816a8a7c7c7c5e2478c3f5234c8f21b1154841230e6319b91c06d2211f209f17359263c40b968d0dcb8605d2cf676504054b0fb0e56ab568185713578b7a8cc562fde09902335005c3ca87e903af7c14a42c5087e5e2a161fcf359c57af8be8f8705027d31acbcd56a459b4cf97c5661c80611abd54b07908d19b13044b195b7c3615e0f140f5a515087c3be1ea75032107ab18fbedef83e8ac3e209c3a11378432c4a8d7846565febd3f97ac2901a617d4394d230fcc162b1a6f8a0184531f2fdb0582c168b0d13c4582c8ae5e5c35a7d3e465f8fd1e7c3a25f0fb562c4a250b084445f93152513db1ff5629f7b01c6c7a24ebf8f05ae562003beeff3becffb28a53f28b85a7dabefbb22c4f1becf410aead06a79200be4a2f5b558dff7b1be6fd5fabeaff57d9f1cacef6bb1582c568b25c4cae359ad56463cf40182e2b55a2d6aa4b55ab5807c82a8cfe7e3d35ac901ba3e10044110044190822008822005bfeffb7ad0ac84f0224aa91b3c0c7d4386b0f156dfe7f91a3455aed60742f1a0d52a8afb185d11be62af1e9607b97a7a8c7c3ee12aa4d4c8ea034d80b302f220162bc87d5854c7a31e0f088a7a7c3f2cca3a0ac3f8c45814e88302bebcd52a67f5d1950b9ee785a18a85d92b4fe7079c149c112312f33428382386f3e540f97e563a4a203562a4275c03430812690152d0e7c7eaeb6179d0e7638445874e80650804b1d547575f48519066e5a373586fe01039200c12c359812b6781617c629ed7628134e61ae2412bfa83e54d88b8cf7745e831d0d56a40f8d12ff662391112e147411e9607b128cecb49c00409a220011a17f298072420c27f5ce90b12033d88f5d9bc1810b25e37397ef4830436c45674489832622b8a839383b3001d1c34e1ab47478e8e520ece0e1d0a087758118a6115e18e4845c863678a1e3c1250410f292ca8208ad0870508087ff870203f5e41807c3150489055ec3544089121de054430b8c0631fc580877a3d3c457a3e234532300245e8c5400d32008f68f0f239f2c5c01f9f55ec85e4c7db0089c73ea00dbc20a06f0c3a40e8c5c098d0f8443824648030c9902b49e22d51f2112d71225c31216aa20993a22646454e8c604e9ec0a03c8902454a140ea4f8140e9a884d398a211d252129255151aa42c54a95252b1d2c79573ac07285094b13539626a72c9f16a7272d504f51505ba2b86c61225c75e1e241172f1e7ce0e5cb07207c01034208606421cc647546ab24ad24bfacbdad76b3b9bd85b152619630a570e6c5e19bc36272598cce5b9f7bead44d51e9765422ecbc114418330209634a20814c0955644ca83ac18432279829838299145000400a6700f0a9706605155858a105165c6821002ebc10802560782106186488410032cc20001a66a8810625c2d5006af06c1800016cf86e20000e37ac72c041871c7c071d0ab0c3c743017ae0c1871e7ef0c181f82108203c2182580d210411437811441851847784112b248ef0d89704125e6ca544125fcc975022897015f3623945433e6f091d252442228e083feac57c3e9f1f5f8f9107093124844e15108cb55820cb83be1e222342cf0b42e7eb212a22043d26dcf38cf08ef090f092f09af098f868921a38fe799fe7b570c6f3bcef5b83873572f82e80e31f0e0f26741a6081173b40b0461b62190b66f011f3346a8c50b3001e70887e48a3c61b3e9e6d0905c230ce819847b178e1feada07c3e1e1aa02120cf89ce84de43c641f0cbf11ea0c762008ee779dff7b97b40e0e0b80750f0267f8ad69f9bae5660b028baa3d1f2f77dfd39f7d98792368737adf4feebf6d3a8edda5cae32d1716b6bd299942828331cce358afbdba6da34edd6f42f7e1cd6f47525e9b574eb334c0d07d9e8c6970a1fd1719731ee7141d7d2b7e56a562ed8897e356bd7d2d75697ffb63149f712cdf46934ffd45ffa19d73eff6d97b7d27b526d29eeb78529456569a263f925d574a4589b95026dfd369b44c7dcecf7493ed5cfe88e46f743d1b17cad9fc439476dd73e8dfe6c4bf1d64774aee27c68ddb5a49a8efaf1a63a579980f2dff6dbf0a6fbcc99f547ffded1e8b52399716de3283a262de56a9ea4ddb9e668bd96ee7b6292acd434cf1afd5b147d5c6d223f07f5ba7e26ef128ed2e57f1395128e7a1c46dae6596b9f7471d3be2746aafd13ceffc1c54da6a5629a158965dd1d8b874dd870f7809cb9e97a7b7d52bc29fd1237a13005d3665398a64c99e264cad0142153804cf9e1394c7f32f0a1302a447f32a01428030acb610a9401f5a1140644c17cf912931c8c117290c58f4f95c1a8b62deac98baf0c06d3175b2dfb8c492d2b7feb33ef7bca7027ce5e8b334ffd7947deb7e5c7bd6cbfde16473bb5145969a6596b325b5050d0eb7acbc9ec364f9c4c26cb057d142ca25c41f1a67f96b4527a4f4a0d308002a8a1608a7c09a354b9e3bb7b29ba7b29d9a6fa1b46c1e2ee3f40bb97f259dd70d3d5ca0d06236dfefbb6fc657d2bdaeabf5f85fc1cd49317375d6c757e2e545152e4df90b4bb7ff1d06805771f8f9268ad96a5fc8cb73e738e7eaef4a7bcd527ffbd16484bd5cf694c5e4c526d6f9bfe131393fe9bae56e8f8e3f3b72d82d574dfcff944a2e3c6f8893e3131d1ad7f572cb4525d6f95eef24f298d74eba7d1bfedfcdaca68f9a59dbab6dec86be9d37de4e6bf45651c6eb4a3c6fdb61953fd53f5d26ba9ae375ac3389bb8aaadac56dfa465593fef5e4af6b65b6f24cee69c2cd737495892bbfff01006e44e6174574af1a6bb975aade1c4012ec3597cca82aeadfb9e1817f4a6547e5cc6e1642b94c18510c5c3221e34ce2f02b55dbb332fa6657d93e24df5b634baef5bd2d66aa7a6e5ef9abd69af8bbb971e36190a8baa0c2d094109bdf5b6a9d66fee6ea5fa71b9ea13dba9cf4ebb3e6de7fa379d475a509322dc71145f8a420e6348795cbd34474f283a8fe49231c9b82488fc1293413f65779db2f94b99aea65965baca6ee4ae34d99319d77010ce864cc6b853d89798a46fd2ea8dac9fef49cbcfbfef5398596ffe7dad69da9a7e5bcdc972f56fb2fd5a4b917f2365fbc45f6272bfa6b2b5cf3999695aa97d7fea65b76d7532a9ec01c0ddab42a14c0aee1e0965aaaacca040c68cbb37a68cbb7782bb47668c092578644a70f748f0c6d8b48a0cb183851934eeee1d8800cb147fd99866452a2de692df342bd2b5369bb3ecfb534a2f55b7be5bb6ae26762a5fead6276d62ec84c34d17db8d999ebcd59a666c6b6bfeb6b72eb66b37e662a72e4692ca15f74fb5bc9fbff64fa5696f4836cbf43647fdae1b6a6b8b25ffc6a7187bb76cd356d9e5df1b63c93826ad73364abfddf7c44736abdf5671f6b3537ef32cff4642d9b8fcd36ebf2531d46ee7ac49e5a74c8ca4f55f1c2e6f7d322b6933deda5ad14fdeafd5b2ecf24f6152dba4ddb67fad79b3e096707942e94dd6bc2f46dae553d7cf513557de9aab3c0df74cfa7f6f8bc361a41bf951a625ef89917664cd24c67d92dde6c94415b55febd8be8fdb55a728ad9fb4e55dcad99bcef8b6cf580e57b7a6d5a3ddb6a6dd5ba05aee1e0b74f756eedee7ee9ebbb7668e14b83b0ae658b366cd9a356bd6ac51e3811d41d07490f3317a18a2e6cb1743fec5131e8a5c98809167c1030748d8a20a0f9c8a2b2e807326e70c6f22072a649600c37d882132f8788115ba0e4faab0010d32ee0250535ac00010b0e22c2469428a32f3e0279c004a04d504463e8213aa31608059c0b59a2b72222079c271162c6dc1ba800baffd60860d178dfa4c86a812c86069c13fe04009ba0000f9866f21a10d1548f0a83be5a4e87abcb8c2af2ce14060e072e15598406181230120e1484e85788c0039073750a0044172e44f9caa8457c4c086177571802a3868428d139da06404272035e0496c38a091a901f27184391e20440a667c032a5e90522543e93f1a4041e29e1eae0102e698a3042430c28d5c1eab2f4178c07ba86c81238384294ea704e141024202fc020fc439c2a8220a1fd2c2075cfe00250fc281344e24b1011138102a1ec482a478c07d3c008c27b528a15b30fb3e1d01c2f00a74c24c816abe701e5d5c4089129070f8ce0f3e2230fb32858b2a8469962815e021990330a143180df88e146e74745140e83a70a0330001c305ae630510358cbcc0798e1a45e028536081aa1c243b6f728348154e0e618e38be38c36f1ca0c119392d3e54ddf400f5883aaa729b33150880074b44f8eb0d165a0841115ff82ba705193d607155b94810a2f000244bd0b8a83ee019c00808d0b85c5ef870ca41cd94960e26151376e4d0b49c3cd933709929ac0d14e172058f31ce3a018513725ab8d0b0848c24d1c1ce195560184dc810430b4f54813588a1c38e1826d0805a2e0f4e4a48e26068010d60304064ca8a0238802047192e61ac6c6040991fb43853b5a26db9917a5a4357421828e9e18703f44b811a2c3ab88d876f0237a87066800c0f9f106c48e0cc000c345f095ec430c48c32fcf3a2230401d040c1ec6392c20f09b373f6f5f8f184c36ecd14cf04407851c314aaf23090e3816c2799e24d41b48117b10d26bc1ebc0f5c5314a8f2ce7c30479014270c79627e7cd08d71a5cafbd265ca122c47428f8a042cf000a80683b784840278f174c6cce3712ae10c1a95175ed8442a031c68000f9e636004cc8d4995ab910304264dc8aa7c0c2a940082891639ff620b0c0930a2829167214512d59305d4a9d800174e78651879134d883184a7a5ca87180241075128e0e43a3479000910350b9fe1234de004151f67e18887324cdcc08497711d893064051e7c042b535ea43ce1e33a056084b89d271c572400739041430e5e63c283924106239fedc0438d15de08fd83333c2a2a6aa2f02d67beac41abf0c29d44708df0050b16f02b5130a9c1880788bc8a94595e8304261ce9450501243471c63910cdc05de08a0e7fd2a584264c200081177d41c68925e220c389ced470e4869b1c3c096e07270b8ce1858f2600f1443411c2375880181d3cd57082ff6c808010c4f18305ae01154e5c51039a13dc4836c1cc65c108efe9c00d0fa080c790d3a4d66e882e0bbfe00b03dc2813a5880f81010423527c013d481844620fe8d1c0812c4981104769ba0f2d1ae04511111db78096002f661b08f10a76c4c143842058701e13e08085a33796f84e1020284981dd719105256bbc1a21f0d0040490b141d7c37700600425eca0a1e33a7230233785180db88e021c608610379e3c670d288268c30584e76c500230644fe538ba015356d834f11b2ca6b2448004a5df14b111b1c11983dba83087084a700002fe82c30711e05c89c25f622680a68808d6b88b0d170604504214eeda6df1441ab013b8eb75844d50ad89b776805541f24410de82f58862c464c7591bc8c0136b5838c1596592fc80033480b384b0c0608ae6c241319676590c2b1c1c404e052b601839a8a50d204168910107431a84a4b921f45505766e5d2c5184af08a0040514e078e02b9a15b80700b1c65742277c51f2a307ffd630d930841948f8370136b42461060eff8650b23519f1c23f3217541942c60dfe79e172850f4e49f8c7448b36c41cac7f3dbce814c1f1807b2610634a097e28710f034a413ca00136f7a6085341014258e25e0f443d7007d8c1bd332b40a14651927b62b8ac50822139ee7d31c104213ca8dca3e20606d248d9b9b7e407d7132ad8dce3d14ca0f161cabdb08b0a42ca18c33d9782c50c104bdc49f00309317a38701f230d921305d871ff029b2957f0e29ec5049608634607ee54b08145911cda706fe20164f0e8c47d0825286e7c2b771d685ef8a2729fa1c72b19e1e1ce02540c60b2acdccbf85072021408e13e4297d3070514e1be73e4b0dd10c51d37f40517ae22dc6b54907152821ddc674558808b5c18f70f4a108ad0e4343194c6b9a66fe6ee4e1e1e4912439f949f4f9bad5d4c525ae94fd51bd594d58618fe73f34aa0e1f6e4062ddc2b4107a327554adcbc12361005ec880b508fcc4f1a2713f821c22303001b8ce038c0cd2333471646432870c6ab72c1a9484a4f149e09517e349931208d77828f344cc8a489c22bc34345c4030ad47866ac0d4bd07031f25090438d1230aca01e00cea049d6fcf0f25688319184522b9e0b47c218e240c9140f06285e42217441e3d1b0c3692c41270bef865a55900eb8303c1ed8b00244c5088c3c22e60863030ee8f0c273228d131239a060f0ac20c11b4882e03cf022a0059a1f27ba2a0f8c149ce1e3010f67786e6c21e288ce89303eb10a2b1ad470459a6fc9076832388006a2f840a02167c4026fdcbe17901051c4043aac7c1170322bc2834e5901f142448f122546ab290578c1a305ca6c8506541a9aa372063cc930c2e0052726583d51682e50e28334ac36c4f048a09aa2777fe562abf543d9f2ac17e3ecd32aedd66cb35d2b75f34fe12af96bfad61c7571d3eec6a4aed5f76fe4b6529fdb45eda87076fa421f23ee9ee3ee373e3d7c42164280c14f664139c2dd3d0f244001267e80f1450ceefe79c93d1df1458f352570f78f081f8a70e231451645eeee0dc101047a7a9082e2e6ee1e07327cc902830a3a50e1ee1e0356642ad0810544b8b9fb0780223d0af0810cb4d8c2dd3d032841731d2a84f0e1eeab3646108213483880002370f70f8b120765b070848513b8fbaa8217bc50630036504101776fdd40c31b9e05602998e2ee1e196dc430668e017ca0c8dd411c662e02dcb6080386fb97f8067d89afbbbb77640677271281f727376871b331ce3a8f34a12ff115ba96e6ee42a8c119552fafaaca84aa9b2af7aa2affaa7c55e52a54390b2cb8dfb88dbb9f715fa1ca6daaaa4ca8aa62a1cabdaa6a85aa133c03203cf0bcd048933baedda52f6bb6e5b66c5db1d86def9208d6acd75251da99b95c4cd79b53d4932ca71f57ef266b0e87916030f24b4c4e2959724a91e5cf51559c14894d5a36ebc65b4655715415475a7d6dde542f7b5d6952942c39a1e477a2aa387ca3703d61f23b69184c8ac4e69194f273399bb786e174d541c9e2218f936ff273c624ddf86a4a6b96526de9dfa2e893992c63d9acfc9bb6d7d668fed2b4e791cea3de16674ddc6fbd73f79e7c6bec846b776997f1aee5ad4c66cd9fcb62565cc64de5ae3ae9f7829b16e0ee57dc1decc06d75531b8662d179dcd7e2dc9271282809f9608ce813a3f38b14287a579dfe6b32bdab39adab89742377cd699ba47535c92efb66b3afabc2dd3ff010031a4c7bd2928c49462541b8766dd09b95d4d766b5beedeaa4f36856b382e0e105398ce37864bf09b4eb671bddb8898e9a9ab59a27695692deb6d551dbb5e53de9e74abf0bccfca9376555df9a374ce7f1a6ebeda6eb8dc81bee3be39ba618ef9bae370a7b9d7fea33752f7f2abffea7ff4c85d4160783e9fb5278c3605a9fbb6ea8276f35ebd1c556e7e702e5ee4b56623c5eb9b4df34ab130e43fdc54d51ee4ea99090d0ef9ab7a69d5a88bc3b1d94cb5517b4ffbea5e1b008414c868476dbe69a2bffa6ebed9e30d8ce38973bb5ec7135d7de5633de1a067b9cddf7cce1101e9cee4a7fd7ada9bb2be94479380448e7b1bcbfa9fe89bb87e0a1102afcb7fe2bcbbfad0c87734d467e4e0b913f25b4847c1a49d6222325342743b4a2225a7d2323263f4454abfdd00f91b526444e6aff4542e4d6671612c283bbc7dc5d5f6c37f9a692c6b926779fc241fed24ee1ec54774d72f72858e8f772f7206b0441836ac8c756a39a624a58b264397a52aaa214d5b4b47454a569e9290a8a4629452165c182654bd393d21295a5a826a5a4251a85a4d4c151162c31a5a724a5a8d89312d3962625232a515b94909a94b66851828a5282226d7edcd9e4c424b6f4381b8514b5e57136aa7c11ac59f3dfaff226cd6acbc5766dde504e4c47417ab8fb17da9465292a86b484c5c92906e40cf72f146989ca12929213545094074a514d59908044e08af23779e69fb2dbe26cce012102481021901cdcfdc78782f94295a2625c969e9c1e67a37ed7242af74dd97d53f6bfdfcce1307997cc4ada8b6f252f6e622a6d16772f2a2d2e6d16dbb5f9cb9c653f5496fc5359f297f59fbec44cb61af534dcd964ab51eedee4dd9dc9ef1dedeaf095ba5b6c35ca76edb515f7d9dd85ca2f31f965ddd5dd898c6a7b8bbb8fb6baff342b17775f72b1dd56e39cbb2b49e2eee5b5523f427717bab8c9ddc7a0c761285f4d0940081b511039c8c5b54309a50deec2401537ac983272af0cbe19c0121470971b3c2c8d300a59e36b44e0ac1a58285aa2c600f7a810d70ea008ff704f96e860e7e3ac1a560d58a20113677d6044d20898a8fb8f0b090b1b487197e2428b2d6a80e15e03c8c0e044cb8cbb801c81450f736471d0660133c81630e5ae14b280018438d6784b0b4e8d92c51a7757fd36151ef817022b63970a38714781115560a6a4c1a24dba18038a35ee728205c90394299c65860f330fcd8f7b44f83ca9e056e12b262d7878a1fac1bf29381d1c805be32dddc203a6ec74be9240129a55d593af9c9ca6907440046fe13083064e90c08b7f5128b102ce41c45d28d0204415961ddcb546083954913373ff2288395ef8a183b7841ce940070f4c38d0b559b3be0856ef13ef2a160ec29dedaea66ae62e9ccb4107a378eee2c12b59a2e7f21d1ecb024f87f7520216f96a06f002d7f77ab1c095e7b98f6ff4cf3d2d20079ebb9eb07c47cb73cff3582ca20fe773cff3569f15cf73799fe7ad5a227cdee7b93e0b9e3cafe5b9fcf374c6d5d76af9dc500ffc3e10060ff4bcefc66be3f36c9ce581dfea3d2fcce779df6bcb27e4f3be16f87921f83caff5795a3c1f9eb7fa5e0d60ad5c3a3c0b3caf82d7cad3c1fbbcd6e779df4ae67de08d0dd197e34979792c23ab289eebfbc024ab9beff37e7634f1460093e05059397d0efa178407ae7c40d6e7ad9c45833786e79f8761e89e7ba0f7796a78af0f89e77dacef5b79de124fc87b7939dff77d2d24efc8f7819f37b41a7180bc34f07476827c03f0581f100ff4569e7f4e1fbdf140ff6ccbe9cc7361e53c0df07c0a16dfca6b79a0cbd3f156367cdf0bb6f28c56def781f4cbb1f1f1589ee71a02936030e47d37add7e7f23c98f77d1b58b53c9b0f5c4d793ddfe979ab20cf06e7f35e2eef9bf25df05df01159f9cabd1d5eebfb3c1d305c811f90effbbc9607d63c1b231e0eebf3589e8e2221df920bc7e6f368af1cd7e769f15e9eb7fa3cd0b3e211f99c7c433e9ccff5b1bc95f7791fcee702bd156be50543421f3a3a3d425146868bb212b8285be3e26c878bb31f2ece885c9c39b9389bb938d3b9380b808bb302b83863c2c5191a1767127071c60117676a5c9ca5c0c56a818bb5888b55898b758a8bf58a8bb58b8b9574b16a176b0a2ed6195cac44b8589970b1a2213244489070274890ef0499e23b41b804a9b9fbcb46c78d8e17d0452f392e7af9e1a297222e7a0172d10bcc452f4a2e7a6972d18b072e7aa9b9e885ca452f29b8e8e50517bd10c0452f45b8e8050acfd90152e53b4074be03a405df013283ef00e9c1778024e1ee3a383b3b7038e3210e34788803101ee280000f7170000e5e7888431a0f7108818739b88739ec789843110f7320f230072477b7e0a54347c7cd6b473cc377c414f8ce8e10dfd929e23b3b3fbeb353e43b3b567c67678befecd07c67e7face4e09beb3d382efece0e03b3b41f8cece12beb32385efec2cc077762010eee84143141ed2e0000f69c88087348ce1210d6b7848031c1ed6c0f2b0061e1ed650c4c31a843cace1098e0d8f9d1c23dfc9a9e23b394fbe93637d2727fb4e8e19dfc91980efe420b1c3fdc78d0e1e54f4e10a226a4972510b948b5a4c17b59871518b005cd4a2838b5a9a70518b025cd4420117b594e1a296375c7ceae1e213918b4f4a2e3e7171f1e9baf884828b4f33b8f834848b4f50b8f874858b4f5db8f8f4858b4f1e70f129042e42b180fca88085325c64210e175bd871b105212eb630e4ee366278d3bac9e942878b5dfc70b18b222e7641e46217555ceca28b8b5d8071b10b9b8b5d8871b18b115cece28c8b5d04c0c52e04e062173ab8d8c5102e76f1848b5d38c0dd71c257053b3b3a628e4e8886150fd180f2100dd24334b68768a0e0211a347888c60e1ea2818487683ce1211a5a788806181ea231020fd158e3611a403c4c63030fd328f2308d240fd370f2308d99876988f1300d321ea6c1828769d8e0611a41789846123737e08e1cf10411b87842095c3c01052e9671b95886878b658ab85826c8c532442e963172b10c928b659e5c2c535d2c835d2ca373b14c1917cbb4e0621902b858c687968f17a8f0f0050778f8c2161ebe90c6c317d670771d3d6e76585e7c8765f31d96f61d16007c872583efb076f01d16112f177a78e802110f5df0f1d085200f5d60e212b7b8e2e216d5c52d762e6e11838b5bd8e0e21641b8b845133a3737ad1c7104352e8e00878b633e17c7ec70718c0f17c7f0b83806c8c5314d5c1c93e4e2982617c740b938c68b8b63662e8e315d1c73bae3d8bc76a060e03b5090f80e1426be0325e63b503af01d285b7c070a18df81f2ee9ec3c383c4a07818b3e261ac8b87b1301ec600e061ac079b1cb101402e3680898b0d90e26203aab8d8002d2e36008cbbbf5eee363a44295070510a175c9462002e4a510017a510c245299670518a2a5c94620b77efe13f2a403dac00918715e8c0c30ad05e2b8400063a81266a8490a8d2dc3059c08f9a963339f8f0717777cd016483bbfb8e009039e3ee3e840511d2ac59f317ffd7644a5e15544c910029bc6789300ad77934cd271100841705029e78e2092928b2701b28c078d0dbbc83b874a1a3edce92b22c3d2939c994aac49eb24441c9a2b06c8951514a82c1727a0645df56a5ee792369f974dcd12815a48d9bcad7fdfda7ba6bd2efba93cadfb8a98673c58271d4a6fa7d3152598f5c8c15039c711f67abf9960bd25e020c50827b5036cd7a84136fb048276208aa4eff547070e215549af646864d04e167d0d6b5f6fba4d9bc77accab479e8ee3226d494f8dec0040c486552f91b731162d49a56690d676ca7eaed69f4379eda3a67fe6dfcd9d17cca5c6b146baae968bb16db2ea6e34dd75b8c8eb7df980bc6517a772b1314b08912403ce58b60931841120a4802091f7f7ce88f0fd57d936f20092cf507210f930091c000121170172a4205891328d535a764c9d2eb5a0ddb5e23f1b27da6478441614fd69c3ec201eef4c17ca1528228982ff4733bbce9085ccd1141c4d027f74d992c4a141a8587de376532234e30a274f73781a8b6541bf1b9eb46fd9a6a7be2923eade633661bffbea675679a95ea53dfbfaff18da4f9c45ee8a8f5b96baeb95c4582a4eafe888e9a8a036d8b10f1fa4244263384156f8c33caef04429c719caeba7de456a41b1d6d9646f1aeb67c1cce527de44d5a8dca475493d8bc5f969696718d6a4bafc566ad7c3deafcfb7135d71cdddd8ad35b6c43667dadaf7d7dca64667d0dd31ac774e44869beadd1bf6d5cc6356d561a366db47c6d29dd991796c3597a71d67d6eb7ebc5b7f699ea2bdd6133f7a5ae369dc7cf35f7390783e9f0b087325f62a4f16963a67f23a9e829e69f70ed2ee174d5c1606f9e2566c2e9dac5490b1e8c0c50001378a9c10ca7ae9fb7b7410188dc33093b5c2067964a36ab754f5599469df1262b95aa6449794f9a3f77a464c9eea5663f3f148802f9f8d4f006944867d6b2acf4568ac9f29bb45963b849f754308eca5fe62cb52cfbcca2df66bceb52fef23e958d9b1e67a374180bc6510b88000e2f57c2d96a22c51e57c93f0af34fbba5376d0d0349e58abb91f78fe898df29a9ee9a34669cb33b7fee5a264a55cdaa318e665cabb4fc769c5d3ba3aa4c33fd3a6ce6cfe54e6a566cbf466d75df27f3e7e8ae4ed726e56878d35dae96b4b5bf4fc3367f8eeeaa3992d534fff6b7a829c6f2cbdfd18d6f4977369374fcb2e234dd35d1ec74972ed6f59fee16a47f7a2a4e4e9fcf5d719f9d76d54ae9706c9a066848a26599818c7a8ae12242d10c4453ae8305dcbd04016cffa41040e841210313ee3a94e18cbb8fe6b87ba90de8ac5cfa2b33fab7dd4b5d1dae7a26bb78762373fd6bf5a92dad371d2d77eea57e4aef5e4a1fd15d5e53dbadb79bdda4c5e18bc937f3974bbfab25b1d631dcb4fb2b7af75770d391f085ecb69b6f32a7e285efbe08f83315aa2fef520070eeeec2085c9861bc27ce9d52189bf46f51b18d9bf25f5d968d9b5e6fb94b1b37edfbb7e2f23bf5f0705a00c2dd6b184f27ca9701c0177a9f4f28d3ac485a7f2ecb98cbe1b3f37d2e2fa80a095fc28211cf8a15b058817a73783f4c48e107ef042e0498c0a4822f881745dc9dc943326276e009cfa8f11d15ceb91d6766d079a491e0eebbbf62cbb12b4e001881cee3eea58478f67ddcc50e819cced92d02a0072e4fed1545e1a6b5091d200510dc69d50be241e122582d82d594fe94dd41543b482827a3da55a6fbfb39056688c0e9aa23c778688647ccc657f7170663b2b979f2b4f1cdb3c43819add63ee746f2a97eeabe8c6a07bd2dd71b12aedd258d9d6edb76c93867a5ac24954529eae97fe3a9d2c432b36a5bca64af710ee7dc3d339695b9eaea2edb1cd5cb76b2d28410689bd54964b25c95e92a339fbc95a495517e69a768eefec3dde570f72cee1dc0ddbdf2e9cebc5d4ba38672756b9cddbb97ca670e67ab49fee75afeda8bf09f6bdae284486d7125249570848434db0b220c770aa871b754ee4454b80709c15d47c8033d9c2f4410a3830d170fc7784182061437e93c925fe26bf3f642afc7aec434fd4487cda751d9b57a6b6c45ffb53b87fb6b83e89fd7ee8b49fa64b773b820bacbfb3ecd616cd28bddc930c3dd87689428b403236cd179cc7fef99938c433058fefd391725ca58335fbb7b30fc7801f40260d2ea3e71ee9e0b345a4b0884225819afcd591d9a703747a5b82a76402cb14b9231fdfc53621c257d28addc36eb38e04e3ca4327f9f544b5419bc08f65a9c2e8cddb6a6d54de1ee473cd4cd4033aee9a0cf3937743aa478380543fe6b71e114964c472ae114f8fbcce130199e599c30c0f699dbe76ddbf0c41285d2b1fc6c4f3164a5b5b367cf41cb3769f53ea53b8c4dc5487321ec5b19f43947a376583fb35208676148c9994217a1612029108549a114262b479ba5e9253da4fc325752db9202510e804c327320cc298cb66b6fba9a9a0295f7c435aaf3088389a180bb0f7928c6875dcde69fa278973785c9caf277ae1bca842abf0c736ae8d717e7f4677a6d7e27aaca14f526ad72b15daaca346afa5275eff6b5414f5e0ca4f7f91b4f51dbddbba0fc4e6599abee88eaa7af51f356fb7c5e5b6d957ea678c360b32ff4fe943e546f186cf685d69668d55495a96add5fa02cbabf663dc53ccd585baaef53d9d6274e464fbc3be98977b4b644476db505ba4b74d457874baa3759f359526d6fa5c553555345e5bf96e969d44772b8dffb75ae9a4f3513ba757db33e0e88c99b395ca5aa7f8b2a4d7cd39f6f514723544ffebd9fd64375bdb6f6e514ce395c7d5d6f495f947136a3d54ed1fd1a898e6fd2acae5f2be9d36cddfbc891fc37f235dd996625ed2d57b30defdc2e93b4ee23f7c926bf56ab3463bac9cfe19b5f9f41789f95de5cc5ed5e0af61b5f4a85755174bcf8a4b66bdfb4371d9de959141df5dd42c75d29ce34cb5bc35f31b9ab398a3f1f79dd6f7b8ad15074ac7457d376ada6f5efec5a3a9b7d9efd0001f9cc806274fcfcb7b2fed677898e3a6c6a9bab4c3aff14a6dbeeaae9cecce1acde96026d5d73f4c97e4dcbaf541fd9f5b681663f3ef7cd71465f9ffb48173a0e01dd2c74dcf5c949abb634f7a4b65d8bc39b3e8de24df5e53df1d3ec0bd5968299cdbee89d79b3bc2dd75d7eb6fa934cb392b4bc95a4e3c5b9f3fc530c05ca1848cf28ae7ede3a77d25be9aeff64263f3f8eb45be36babb6a4362013e34d6b65d097e6597b7de65fa23b3357a52eb68bb354fd2e9f9d4cf3a4f2e79f5a9276d569e37b2b92d67fb7ed72234f268ca3a06a56b25d9cbb986645d2911bdf74ae5e28dbb55a5b268ba39de5ebb069c6366e32cd4a6586048ed27d9502c0c26cc954107931ed6ec9556762ec443ba1f643e5306eca65d16fe2271363a7fcf72e99183b955fe6aafba7ff4ca5bcf82848489b18e7645756c4dd7375e3ab7154b9a4dfc64c249d5faa6e285db352b984a3cad7b5cf4eba66a55a96adef92be18a966a5bb74d3d584cab896e5499b9d70bf9732a6a243305f5c6b96f54b0a547ea61bd3fc5219ebb014894da120770ff2108c096688decf61301f086c80c001770aabbb96753f8e0251204f05af052077cf04ad71eeca721aea6302fb86dcdd8b8720d8b8eb208d735748ef70b833a944dafd95fdfa9f742e577550faa9fcb2fc1975cd5220f2b9d0f281cafad98c6ddca4f56fcc0587f7ad3727d94fe92a1ba01ce10708f88008779fe2432fb696eed8aec4347acf1a0dbab8c9abc20f2c70f29e3526e3505090c5e9aafbf1d9ed1cee65da8e5264dde3a62af5e36a9396959fe57118aac4b88a69c6ca9fb24ffe53e885ee6836363637e5d32ff46f5136363637509cb68c5a9b39a08c6bdb6aac6b19db9c8b518fc9582bd578974b5c6652a432d6ed6f2abfbc273e82f2a7989acb923f97abb9cb8ce27ddb676c46cb5bebeb2850c654e858e9eb59fe5d8bcd3e9f24599fa65fe3dba6ba52a0197eda54df34fb5d7176eba75a7fb6e19cab74bf8de24d4d5b6bb4a4ed72d5fac98d2fcdbfab49ffb6819e3c4b9c73b6ea28ad5fdad22c4b8bdb9937db896ba7d5f47537b2daaebdd7da3e46475aded7146f2a85a93eb22dbd91f6a6a3f9776df757ac94bf2b69cddc9984e361d400a27451d89dc27c288551dbb54f140c857d110a1acb2fff2f7d1add55dcd66798b2d2181defeea5e8678cd3b66b6fae5dbec44d4bb67a0475a604a81c42dda066545bdd5f0a446d9546f1be96525a3e982f3487180aa0868271f75a70f758f054f0ce3ccde1ee545b2cda568fe8135ba595b6746f044f51dc7d2c5f0c1d6d954677556756baf589bb3f656d5b5baaff12d37490b6559ab6260cb6b53565da5669b2500b07dcb4b5b4f8a6a395da2e696dd8a4ee4ee5a11610f49f5adb1bf99beefababe99a34fee3fedf33965f5fdda97b4326182d5d21264ccb852a730ac1494131a77ff1a7d6262ca389c530e7ed3678e3e313189c185061e308ef93535eb7971497514e3306ed76ca92dd04c8ad109857c2e359cb1a69feb0e67b159ebef9a1f775e253a6e6c6afa38bb6979ad548c8e7a679cfbbc7b29aacb8cc9cf949626bee593ee72c5d99cb35d6bd66a1836654f310f7b5aa555006480bb931e4a796ac279c8e484dbd8d8dc8c363636373f423a484893b80cbab6e284b01d474de2524808a6737bdf7cc0e82f1487b73e916c6c6c6e64b251976f9a1569772b13c6519576ea5dce2c31ce44da412643132770318be2b5a23796c0506584a2260f9dc8b0883263de00983061019fa6ffbc946f9af68aee9bcadfb5cc6df9122369fd2479425dc9c07dec000519e7acb4e4610740b8fbb8a3d1a7d15b499a3f47f7ad36d729fa1723996645723262020535da4ab754c551bc69fe32637aed896995eaf095da965eaceb3fd191fc9cae26f925ddedfc399c73b467575cc6548c9868dd435633f7595b6ac4040a8a96bfebb559fde5a88fecaf426949e34be1a96be9ad24d575d712df74b5b275b6b5adbf34b10fcdfd4be128131d7127ce5255dca8b5ae340ad31ad02b7ca4175bfab7d9e7dbc6b5bb14dbf8d29aa53fa50f7d6d562a749c295972cea8b67436a3bbde36c59a96678ea263f9f773b97aa3e7d6b586e96c369b7dc61b8a8e5b63933e0d47f579db369bcd9b3e8d9aa6d5515bb31b5f8aa9feee8bc99abd7fdb74f6faa4afa3354b5f9f957c1a9dfd507d79978060b0289f19fddc6ed37adbfaf36f6bdec8fdb51ac6694b6dd74a9135efb77953fdb6fb536f5a930cda379b35a9d661d3ac54db5b141df17d129bf46d95b45bdb6b71f9f797a6190b578765b8fa5bb65fcb642fc3e5a9c5ec828725b744312110438628a614f3843940613f35a5bf335e1f10718ebb2ba1484a13e72a798af95246fe9490f65ef8bce4bc38e2fe49e02ab96f8b532a31d2d23be17e5b3a56303318ac66fe43d1516b4bf749a3d79eb65cb1e05dee44a8e498b3b129af54cd6fbb18cbb63636f8a62b6f2d1f77dad0efa269362a574ab1aeafabcddbb4b5963bf5b6f6da6de96c47abd1ad31d216b6eadd54fddb94121dcb92ea4a6b56a73f8916d1389395de1387c364d54d615aa51b5f3a96bb343fef4c2b423569f9fbcdba2b2d2fd171091de9a8848e48744c4261356c4d13933f4f5e7c295069653e375d6f96becd9b522448487bf1c617e39020a1556fa01d8dfe6d9bf55a9bb555b35631cd8a83aad5cea37de66e3bf749a65962a42f31924e2aa3f69bf6d625632afbccdd25a827d2e67094d2b5f586849b4cf3a4929431d25d2aa38ca84431d94eda27956fef273d796bdef7cf7aa352da1667b1ecfc53ff7497c6a0cf3224d76314121a4537a0982ee1ad31be91b4ac345a4fa09d69c713ef6805dae7111d3d8831c1604d929cf5f3b64d929c545b1caed666651d957c316eaba9d051ef74c6f93fd0549569e3a6376975e7f26fe4894dd36ea81d15cee52795d7e20e76a619d37d13aedc0ff5e6f9a4fba62e11e8c2c4c58d25d3ac485495699c5155a6d99b38e7cf69aaca649ab111cbd3165aa919baba6bb6d18bafc6fd97678ddedf516aa3f8a6fbdc6ee39deddff47d1cddddfae689f74f05fdc5d4acb67e50fedcb9f357f26be69969d2121285a2e2b4b4dfcbc64d3bd37cb25d5b2ad55d7395ab63e56f6db16cdca471bf97ccbcc5767f5b4dfb2ee58dedaa99d336a9c4b84a979bae56dea455bc9fcbc64db17a64bbf6fe94adb27153d393ce4f83884e1470c2c2c90ad1e9004e41884e40388d426140b4e695e194e41fbeaec99f326d4def6b6b5632eb59da29bba54cfa7878728011b35bf29e98fee2268c9f9c3c3756529e54053c046207aba52786942859a2ab4fe512d59757ebc72200bcdf5e5bde4ad3b67cf3dcf771b7caaec56176a65965bfebd49bffa4ddf8caf67d9ceca7acedb3dd52a4952acb2ad32736cfdc99497dcfb26233777e8949d3aca4aee5ef1b79e2299cade50b097959f0c690103b7811820086b20c93c8c8156478f192c6dd573a579c33775f5d40e5f396086854a102549859d02447142d2531a85a491c54dd88415e8460c498c921012bb45c85850e0cee5e1099fb1702980f0423d18a189d472128f2a764e5c3609f3129cb69a95c10ee06d5f29458850cf7efcb0b5e9a0fbc78f075f9b8b8fbce7a678854ae70779dc71c2e7285ea8b4d133b5524291263d9d6cc4195b996b76ea8df780a069371d992a4757512937444241744a4a224aaca34eeee9333faaff3efccfc5398de4a81b0366374acd5b08931d2182445d61cb575a5328e3b73df273fd37aa3d5762d05caddaac36128bc2feec4587e632ea369ebbe4f75b6625e5ff3ac690d54c33be3dbd36af8b18c6535ebcfaee17d1fb7c97a95c68a4dbcabfaa7ccd7b8bfed29bccdbdad492b7ddad20446f3d4a6b9edcfb63e7a8ae21cce4e4e331a4433a64f6633255dbb945b572c331a4461fb7158b775f97febb67fd3edcc52b7b3d570c6a4d604a81a233f7931b9b48fdc99121d69f7a4f71655ab54a540f43fd7be56f5eea528d0d7ea54141def163afef8e830962326282bb8a97cbc9f0beefc8b9b366ec24ddf943f97db62bb387779d24ea5d04b551a853d65797a52a2484b55b260d1e57d9ba938e1b5c0840c77a7957a669830e1f92032a1721f77884ca08ca5a5e9884473e0fcb9dc8fb8484445d21a221094b84844dd475bcee0640cdee2c5c50d606711387c8002359ec64712fb16a21206f82c6a466b67eee24e5d6ad3d6fd49356f2a25b39a6f052a3feed41723e576aff5934acf830ae28fa954774dc2b51b8583192949a2c3d72693ddf6cbf096555d92ffb6aaf5e364b693f6a59192244a5eaa9a34a94a922fd584891299927ad3b29baeb7276f95edd732bc652ffb8bb7a6e1f0d6e1f2b36cd7de94e96afbafc9f096ed9bcdbeae6299b632d9d5e19bae3799b6d9acaff799bbf677ddd56ed3ac3625667d9dc4acab28442053e7f149f9629ee81367b2e2e80cccd47dd99722b39b9cfe9d619f7341bb52b6db7667cc24139150e12fdb6d9b71988a93c9b6ae35b3de8cf74fe1cedfd5f6e697f7d45b5b538aac264de6791f8ffbb883e0e29137968c4a928c4341578733eda6ebcd027b3582149aaba44cf7d71b722f26664085bb5746ce4a337a8f84a399eb538ca340206ac085fb78b1d5a7495ebb6ded4247ba2bdd57d4c0080d78a074a741d5b559adc1cc5dd4c0c8dd450d76dc8dc62441e44f9966c569318359064614c8dd5b2e66e043cc20c7c81cee0e44a94a0ba39534e3702e178d84e114a6716f7ef95f9ad8caae8fcb8fcb1fa5fb262e195f9bee9e99aa32514d475cfea8f14b4caf05c2f94530cd9a7ba99adba273a76cc4fbc7a7bcf8c876edc65c46fd1b4f9176df6ab3365a77b4ba77ddd5f2e223a47147ea237f73a73e127480714675a54a546250b9f33449aaa740e5c5e443d1b1e24ead2bdd99db92f76f2533a6650efa916dfd3459c5b92d74fcd9da874add9a736790a634466177898ee5ffc65c70d3ee5626fd1b73d1612cd509476dc9475b9f4cb92d4f4875d7a4df98cbb54fe2902cc4214cb88f60be50994c1c8254fe99b740fd99a5b4d5a9441282852b45e97ded587e06434eee9b95866daef7494da1e89804a6ab619db18e3ead029d5a5bd95012ba35c6d1bd8792e0bda3d53069f7e36edbe659fe9959f5adb3fb393ca3b7da5d7310de417a2c2d3d62620c4ad9f2a76cfeb2b4d45a4b8fc44cb3e69f52a29d9afe8d02d5dc89b38ddec8aa44c7dc897395af3d0e9354dbfa64cdbafc396cea2fcf7b8e26c63d8fab3629dd436bf8cc659c4d8c73380cde26363176c251da76b1f9473bd33ca9ec6e0c1f4969fbb471d3c64db66b77386ffd49394bdeb8e97e2ecbc64d5a5355a6b7dd7a2bd24f552b1b37e9c7494a493b53eb37f33b55bb7375422abf2c632355652233fe146e5756243a8e74e3a6b734729ce9f09dcd92d00da89e0599f54baa93222b8db630eaba504d9d5edf6cd60ac651e597a749be49de2d4f92a73e731aa8fcfc3977d7f1c8f880eb74eeaee4ee11f1395ac3f4f5e7b28cd9ae2d317995caa5fcef4413738c728af889ffe29c9576db9af5d4a2c3587ed7a412e32a5787ef953769758b8e5155266d2bcf0ea82ad3c576d7a76d71164b69bea50283ed70ed2e5dc0bde8b1637f3ee428815781cf480aa23802538457c3cd8a1e2b7820031e2b42308128f643957fe57629bffc9c549a59ca2f6d75aa59497c69e1ee321955c56da1aa4cf9a576b72ad1f1a7ea0dcc175a67b66b67d91ac95ffba4fb53dbde13d37d62a09d59b37488e20db4a3d15d6ff868fc9a95f23be951876f9ace76eeccb42ab35d4b9ee5e719fd4a9f6649a819f95cca9ffd6c9631ae6adbadfdbe35d7d336bbeddc97b2202a85cec61f97aaf9e54ccbca1ff3dbcac70235a34033aa2fcdba7194ded7c2664034887e99594c858e3b7aed98f1e7988c3f3324549569e6437f664832a632f3a1fabeeeefd03834164d69bbefefcc7a2bb5edda7246e2fbd987eadca969add5309899ee2f0c96df566f6522ef4ed36b75a59d9896b6e66ee489d3959ae6ebea4d3fd151df9ad374ac396ffd379bbdd5fc407a06863e91d9ae7dd9971985697d32d18262f59e3f3e54e34e325bb2ccb8ee68b4ea6ebaceccf2d65b26f363a6a1a1da121d1f97bb7de4d6ac54f3436121fba3675787674d3e74d4d966697496df29e3a81998d9ec4b352dce6a3ae6af2d95745baa976efabef92595324f1ad561d3dcd12ad53847a544c719989a95806810ad59e9cb8ce6ff817dcd4f6756a29c9492645e9eb244412d59998d60661a067bb2d6f2ef2ff9e9583e59f3e7ba2d05ca785b0da5c337a09a9f966fd6fc3b303318cc342bd2eccbce2c7f77ebcedcba62a1637e5cc6545b186c46afc59f31131d731547b59dfdf88c3f3e7af75230d8cc9a399ceeb30dfa4c77401bdf5aed4b4ccb16e86737dbbd946c36f536efcfda666b3fd75c5a3033aafab76dd26ad0c537577137bd3381b22df76b8bc3e4c89cfb795abdb7ea7cae74a16399abed33c5b56b7be84ff9a70fbe14a8b65471b61587c3e4d32ea6e99e1e5abe6956bdff6efda4cd5b7fa6f9c4359d0f35eb8d3e79f3e77ea7ebd3cf47767fdb9a92cf65898e527467d22c494bbdbb313ae2ecc524d5fbd69c1d6fba6ea88d9b8eb2ad4e171fe9cf98093749ddf386244562f36ec14d547054cd4ab52ce58d416ddc74dbb94fdae95b7350b66b97be1e95f5c834ed0d496ba41da2c13ae38d6b29d57f061a7a4655d6569f0175869433a09861821faa2d50f93ef43735a30a3372a035bf19db8c29666c60061133723405d259e3dca5b4fc0d822940d082ebf0a59a4661b319bd5689cb1254931215a5a4b17e2e57631778088271acf9a16a7ed96b58195a5051861265cc8037fda1d7d26b6906e60f0fcb3075191c543347a3902187b364cc408600dc69143214400d05f3e5068b6fc903bed50616a020021068a08a3044f02b7a946002d896d21381980fc75c838b18b450830b2118101ae2bd207073772c4b3bb2da1e8bf6606e029dc7a0a08b4d0fc5f02f314e3ffed24e6d2757e3815b7805b4d8c0e3e113f0882ef00037c3cbc019303ace4330a090dd6ae66460fc70778f7a4b55996a98aa32d1c7d9a8f167b773b8af9bce481a4493cc7ce88c9cd16dbfd27476cae66d5a5aa5e1a7291dc58eea789652a4cd34ac292e631ae776e6d6d5047a9cdd77fc793d9b51bc4fbcf301ba38bf083b6d6f7f6aa1e3c5f4d637cb5b6bdef7b7a53a6c858eb9936e7c81a4347dda8d7cf25a283afee84cc378d3abebf8a3f5a1e553d91ad5554777399cf73531ee326b4a12d434a33b13a87c2dbb78f69a6afb43e5890bad741fb9b8f431cd1cdde55a5e4cbea65abf794ffaa479e6708e3e4ddbfb9f3f476b96ce1e87a16654ffec72cd3887fb283aeeaa14b6fdbeb6cea066411e64e91245c7d9d08ce27dab69d68bf5dfc8faf966a1e3cc4a549526252cb2a82625a62a4a50b2a62c4b51485b9ea2a09ab220c99e94929ab6e44e5ac3d706e52fefd9656b5babe1a02f6bdeb4d297aab88b2d6d22eb7daaad3573b94a475dbea9c3572ae85a4c06557a234f4df56b9ccb676e97abce3f55566d2b694dda99a3fa27e862fadabced97b2a60fd5f6b3aed476b1997fea75f84681b48949bc71ced16bbdc49870f937dd19dfb43eb125ad5971b492f74fb376aded5a9386ab369a712d2a4b138d82dac274920f458bd01109926cda7d4f3a54feced479d7abcbf2c5f01d61e9cc34add48c664c672f55f7ec46e29cd24780717fadea9bae99a4444d4e5ab3f4c95f4cd4e4bc9138f72ba92caa9800cf6c637363535fa5a7d5239d475aa5790165bc56e8d20c6e0850e1ae67d44966bb7647d6d296b792b227ef89efe729d997b25bdf24711859696526c639d9ef3771969517d3eac5b4f24f99aee6f2b6adeeff7f5773b2fd78bfb63299aef965f8ea376935ff35cfa96b65fbb5ace697e9fecacacff96b5fcaca8b699f6fba6e2dcbd5cf52a495d2329969da1b89c3a4ec5a9c6c67e672350246221024022fba7ba9f2a730131721e0228b17c1227151e5eeb66bafc597c2fe9e19c685c94554adbe49f16ee2a2888b0cdc9dee5e6a579aeb9b483a8f19870bb798dac26e11e5f4a6eb4db6efe79aa354e31c85edd7b98a93d9aebd67ce651caeac32fd26794fd97e9dc5e97ea58d33677c60c226c783591a16a248410a6e3e8454d0c3bae361a51ed6261e56260f2b081e56ec612de36125808795080feb023cac1c0022a651e4621a486980e0621a615c4c63bbfb4db86347f8c4ccc327c278f804091e3e0183874f14c0c3278cf0f0890478f8c21a1e3e8185874f7ce1e1136578f884093c3c802706c1710de1808b43d47071c81a1789ec7091088f8b4490b84824c945224f2e1209c14522d8452227b848c4051789e4e02211215c249200178960e1229108ecd0218e61c6c5316470718c1c5c1c430817d30071710c03b83846152e8e81c5cb25fee02efef072f1071e2efed0e3e20f485cfca1c8c51facb8f8c316177fa8fd70baf80309eeae73a4021dae1c20e2ceccc51d9c8b3b542eee14c0c51d225cdca9c2c51d0ab8b8f301177748e0e20e1c2ef270177954e0220f1e17798c2ef280b9c8e38a8b3c40709107ce451e23b8c86306177900e1220f285ce491051031bce262287331a472771d56887cc7ca91ef5861f21d2b5c7cc74ae93b56c4b8bb8ef08b91875fa878f8258bbbf31095d81e2a01000f95b8c143258cf05009273c54e20a0f959880874a6cc04325d2f0500939dcfd95138a3aca7051c7085cdce1b9b843c7c51d405cdca1818b3b9ab8bb053f441cb68b38ace0220e3bb88803142ee2e0007767f9d849dabe93b4f39d24169272707642f0c07742a8be1302ce7742d0f94e0825f84e082af84e0835f84e083cf84e0840f84e0848f84e0850dcd8bc5ca22836b9808b4dca70b189085c6c22878b45372e16edb85854c4c5a220178b602e165d71b10804178b6e2e16e55c2c1ac1c5a2165c2c22808b453fb858a4848b450a70b188022e167dc0c522365c34f27604a8c4a804f06da5999a744c213333321009000000931200304024180bc70312c16c9e86ab0314800372a67290521d8aa32849415219c20c0100000000000020981a02a5295a29c7c8d19282f33e01009b2b0265b1c6599152c7f19b177053c43555c0be14b1bf9c5fad8f1a6dea9b6020874aa802915f6811ad2cc131fe698eb2978a280d50a1ef92c4c70a46efe9525d1ac4e81034e235d5337003df3edf50b9ecdfb7fc52a17fd7f4086af45247e6af2f529cfe8e3149cd0db26bd903b6e488f4226b19e01250a3e9a2110a17132954b2729741f1642cb47251420a7add4522169a8e46a998080f4d3c70dbf53a0f36dd9ed1c8f0df14b9ebe397d2791b889d13924dd5ccfa3023e766edd6e5f676fa397900b4def30b070fc2477525eed178d3873c083c285cff25a8309d66ea8a70a0cda27360f908165e7a25aea728e39205ebc3182a9f66d740cdc774053a8fc169e04bd9730ba7ae045646414bb46fa4aab1c482844d99f544e36a4259f867339763fe05898bb9a20a5658329e25a8d15c75f9d01add8f8653879714a8aad6362c8b67c86edf38147d9b817573d83271a1192d830a836cba0e6fdba0230b64a236790111a66f81a5c10025160bf3b1c71baafe84642c27f24d5aa5b18e4a0d42349f848a78a8c5202d01ccbbc8193300d990b5dc5ef3a30dc7d2f8c94a8fb15806e435a5310fe768b2f226898bc334e1510b7a2d8832e01c3ad6a8577600183ffc3dc1aea0c6f80a6ea843ac6c2739af045a022eb631c4714cee200558fa4f71291f4ddc0f7c327e2b8899b4e1cdb3329b898df6cd3ab645eba7a92d95ec51ede37df57e99b801ed5c31978614f484bdf085cf2f9379c6af1120197c6cb5b66bd50fa4cc28e8bc48e48d19411a1545469298215a4902f6e8280b71a16f6ca743e3034371caff99d6ba142902ea7ea1086f52c049b0fc08ee310b25951c59f3b14f485ccc16fa5ff90fd808deeb3a1a08e59eac455db4ab051a1e400c887887a0bfb39a36a4e01da402a3c3a68f6a2efb681b4cecb44ec43a9ebffccc0595e83e47958328886dd0ee15aacd5d04cdba3deaab3a039a5dc52f0f519ce93515b2dc2513e911cc68f85a50fbc8fbb01215320a1f629f5a82146128b840010e72d8235bf803c66df8c2769a9b6728b807c3c830ccbce0954bc0b7a6c81a5479db1e6b6a1c1ab2054f8ddc9786ef7c608c6aac64feca2dc8299441eac3ec4006dee5b87a887605520c18f44abb9208536d5ff3a004775f8087e46a35398e9c9bd99239b8dd985493b305d7bc1dfc36a84680bb83712ea93ac6e77dc19b02843dc5658d2a48c3656cdee3e633a8652e69e51d218c104c913ba5229253f3b5f86fe348a62ac219d79ee8eb07221073e3671eb8a0e38b5b1be86b644f52ea8aede9db96da275c18687ce2625a8eaca81e37b2c1ea06d007a0eb32feb6e9ee7fa8ca87d8a12286ba76c42793dcb7842e72b0161d36b22fad1f79c893a5cfee9a3e5bdf39de13c96632e5a4dfa92d310fe400b42884e1bf8bc7d66877da31a00477e4e039009220603780f1dde98ee7f890819d0022e88a8ae4203cc01a21c1e19541288e058e01e7a016e78c7dd60600bce0e888096c3a436ff7ebe513b3f3a7cb90bd6b244751329e56b5e45f5930781b959a41239a2796118cb91708a260dafb8158d5bc416e3d8ad1a2e8eb9a4695851d5583db437d32eea0098e4efff1c8538d7b75b7b179ec8909901f5c4bd627463240404c14ac09ebb49dfa20f840094e90038886fcde1a7fcc3dc8ba721a727db6f1d62f32803a81673d13991381179cc736790a9155f57f35e2266486d9f7b1bca38de118a5c8eb9098f3c9de038e6af2da766307d48efae1b6e13f86d6ab2585d86dc3276cc781c28cf08a2ec7501620d10b0e2bd1bda1f7c9ec93531806e46d096a4521a3ef7fb00b084a6549150e5f2463db5db0e6da1a1c2d439b35f1c7b7062be2c5a844adeace61be787c05ebca890a291224cf00fbb807edcb6cb25f99ee38d82d40af621a3611f1685c7b2af18bb111591b4158ef6f0f334cb1e205439a8a88f00483b1421695df54f7fe4cb310dbc651faf56b3c6089113f87bc71e8011b0eb24cfeaa13e71c87319ac45469861e8ef0c66dd44eba1cdf368ef2a4a7fb53fee63260d5f839034786a9388b3d635b10174966d94df2d14686954b5e877c1bc53e2f96db90f8712979933cd632179ffc90b229d0bea9c5472297da974a00976f8de68b1da90c550fa7f98ae401e0ad26dfc0612ffaa83cd97de3432c98f8e8840dacedcd49d146b2de82944d8bb8ba11a581bc28573335f946148b0fd5aa7bb9162d183911dadefa20fdbb894b5578203e7524ca6d1869e0296931f0cce558f1431c54de2ce131f31149e4445db510120612a2a2ff227d3811547ca8f1aa21936d55b39b3ce73b42347802869f2287c36e9bd5e58c0b13e5473b2f08361a2e82357501170d42d7b3ad97a92ccde36342c70b4b442b8d351931650afa7340eb4088a34907604de457bc0bd4e77e585d152591cf9b366dc3dd46ba6b64777e2fdfc3e35e71e1b7cecf0730156c9c5c9ab70412c47c1be40be0da9e5dd53f4e357538d3d62570ada641da09a5f071f27c4aa9ee8f295d61b1aa2025a69a62468270ceb18b6def77924bdd6e97ee68d29cddea60a01cf9f529e77fa3498499ccc9dc7059a0bfa99d54fbb93fd9316266891df4f2429432624cb5530787f41792c433c1f2100fa8165b49d4ae8fe60fde9ed641140538a16078310cd2bfc96f5447273741d92b0eba157fccc94a8c22483acc34d222f5df2324e2dea7fb0367e354e8d76565969d2cb84dc91aee3a58d28ecdba617dddd6fe34f64deb4455192ec92b02fc8d757f90caed2538567840a37ab042fd0f91d221e0c22ee41025aa123f5a0a6703855edf03e4ec821f2a06ad04872b03046f0edc776d0035040448dcc7f29277cbb9ad186731b0ef6556859b9da7b5ae7651af672ec568a241597883a16f9a553d031a5426d87534edd71fc0d8c1de4be2c5630cb4781a1f40c770a345bc2e9d3cd23cc154028cf0f34efb0e84beebae9ff904d60ef88098bb49138caf8d30e15e2e8cbf035939a9ca1c1607bb793ad8efb3221f86c5a0e80f85e9ce1b5b36f69acfcb5890cee7b7043de4cd954f378b5c218a1a5cbd28585f7f7b527d303f92c92a5e2b7ca3496ff9cd2fa7fe91b3db65acdcc4df634e483fd35507818e0848bf0c69dde68d580e176f59aa23de20f1021f2eede580327e2963e955e0b57ee1b1bdf42cd74bba8149927cc17d43a69e12d0ae8ae63b550780397835ddaa317434d1eb604918909ad781231636d1140c1b3cfa67530fe761ef9b2a98ea0cde1c51f1769845824feccf0f9fd54f12871cfd878f0780fbf1d60f4ef606df7e0d4e16a36d6439c62a20a8a5cd7014a828e69af6a1800089a0671460b23438acd3796f99864be1b682eb30f5d50e90922a99a35049934a92238c8dce91cff51de3dfd934b783d8ccd7be13bd319551841047369a7d41671cedac2ff1c6da4b0f8922d4a394d442de5fa35c64cc6f8fcd322245a92cfe6a7b5b7fb10e81ef4e587994876fc98b3a2fb7c02863ec020dcd82ecde9650599cf0ff767e152b40d0b1cfd91b5007911aa8834467ab8048eae88771918c100245fb8d2c3a0e110169673a9b96c3fde2ffb930d2019db13224023e8a27f168e14d59166c8183710ead7229bc7a3e6b3f780111488e81897b0aae6c6116883ffc1192c84e6890a92148352b2c5d35466abe150e5bae7c34ccf91726ca13cb2e3f1e1c13af06f3aa7260736b08ef9fec83988549592c14a872ec98e69e05c11ef3e9564a6d90516ad899bd304b88d8b75a480ccd2e1c7a1cfaddc05a3f5ae3427d6079b01ffe349e67495e128abcf630ba66324532bacd578adb9cd99086dc15994f4d1f79a4bd85eb9359e6b0df118198f55d99d841e54f7fca270b7f48e927acf9a7daf36a5cac2ea0974045d4811f97e21a61c4d30177074876aad26316a95eaa476beaad9678bb64a326752da93c346c878c071edbd15f39636dc7da9621a8a6ca71973297c94afa2e5580bb27f5a3e5794f6be7c5dfa2a1f71477a0c5b8da0461d4183de6800c3724a4f023fbdfd1c70b9b7acee58d28cc2ec9c81996e13ad4e09c771ed94503fbe24b97f30215c7f1cc25315cc01b6d1e7bb2b28b8c6994561c4ba5fa605b35f358a0518b14159140c06934cfe69cbf0b86730630812fa559818e81608a55a02af318528ae8fe3d5c405708c9329bd78c36b00e3a2b45b31c4982513dedd629875a026822fc2e54697ac53b636ddb016519463e1924ba9640b02c1e42eace837c8b3892a7c0200d97d54de3ea9cf1c38d6e8b5695142abdafca574dce53086fdaaeb4bbf67690fe105df6319a1aa8d3acacf51c58a8b279faa6e7688613f822b87717733da453eb9ca6b52861d13699bc35d3a4de762515c1f0098218d6b8c82793f899343cde6823fa06f12a2bafe42185f8897a7b8e0f944cd0e510f3486504eb821cebbc22068640a3160d34c41f0976cbb3e710bf957012a322cf32e4e8ce574d1e4a2a404484d2f3ab355d144a703781422113c92238adfef0f48c356e9017455a77464921212c1cf496a528c66333d3c7804435da3d4b6fd8dc197fdb3b2f43908700d5f619ed33ae395a9925361f82a7df1bd1e8b154139c61cd3e8651d57b2cc48ea71a1411f29084c65ca89fff7661d0d2ad61a6de140e82448ca7997c066fec0eaa7b58387d7108a8c1bfafbf54e8bd1299e2608764891abf95f6eb6f7d5c31bff1a49c216b7ce8aa00773547cb592c57ed96ef8320ea846810ca8a5ef45e64ce028663af4fb2586f22cd354a86750cd9bee1b345ecb213e36ca183b3b538b928a54cddf5484742e46e920ccc42438580f71cb8cc9410e884c1e95191796b0ff55f07024941630d6ed2450a90c5cb8d3dbfc41b8e38126148635e3460901c2e9d2e3dcf22f3029c1b01a6fa8305524dbc8b9f52c3a87ceaeb3ed09a74221ecbd19fcc6e4c21d92855e936a902aa6a724cc817c08e5668ac0c7c10c2bc4278d8e57ab0c28094ba3ac20bb5692f4b7fb35c30aad25a952ebac0fd084cdc29a499d1b74dc2472f23089ea343465a12094566a9ae347fd5f38a78b31b62ad89ead323a884983d1bcd97328fc3d08081662bcbf0c021e7594624140058de19c854f9fc248aa069123e25218884fa4905dc1018f523c8e05c9ccc241f143a17b214d4a7099d7cd4b381c603b9cc94895d58970422c182626dc44197544388cd6b92a9b0612f683084a53b114c91094b2e5dedb992f2bf4de0005bf6deb0f0bdc143b9757f720778c692b474cb985d1022d2d5e7c9b639911bec47134fb36a3160449ff29823dec41d34c035476cc4406363d480de3e12220242b653421a15a5ed521f3d89e95da810e47e87a356a9c0837f19d72c092b2912b33a7bbfef0c6064828675706d9994ab3ae7dc235d9cafb852356300e951c8b662b1719382a78dd900856fb9d6b6a59557f38f7516ad15465e469e3ebb1707c97bfb060e48e71b39e2f5173985b27242d4c12a00d755a50f7336bd665bc125e8a756faede236086949c3d5ec911ea6a0b6dfd16e4fb2e4050686c38764a35275a0506f65a920254c173243675610d5b5e36404ec005e93e43a3482972e500fc9ffe124a0133690f08182e830069ca1310c66bf2dd407e8160034ec5098caab0c84a1297dd45d59d388093e9710b6fef01ec03556c745ebb103c72a805f058bad4de22772743a34a6d4c4d3b8a1116c7d4c06229ff4a5fb9d7e28dae5b4915c2268c0b9e8632a5bbe78913f569325ad9b329b6410a3cac52b8927548bdc64d00652796ede21570f3f2fc5c0cee8c0a2c2a3f90b051a11d7812b1d30b1bf8d544e381978b903f008cdbf3a0d13008bd1d80b0bc40cca00ee27d2fdf56a677b1bb9e757483e09a2df3de737c18286dd7813efba4d9525309b54d313ca9fc01779acf153291250225212a284eb69e5b521a11fa2ac38458338725ba40ba2dd9d7b7ecaf0efedeed42c03007458ca80f6185db70bf1d59b0faf906fd07a821fdddd4189a1cd360cf76fe4d8a46823d16726e2715b68c6c74f826cbec7b893f2ea5f48abf73109c2dd111cedb1816510885154d17d0935d62bde262898d45c5c1265a7bca14ac19d5d1a5ea251592828a246d17f9d90cb99ab4626480cc614a8812004f88ebe8849a830f6c29d754bfa2c732f14f3557f4060c2a4308b93536304d19626656af1622784cf0e78ee96bef16c465465c3d315e9055dfd49497c12f6228da394f56d95bc0f0644260eabdc14bf0a7ea4142b713113541880880405656484c378b00ea9bce23bfe17c4116ac23c0d8be3ae81138d83a533d45f311d0a10f8df7813dd3ddedae798d7243deb938ff57541e3625036effd654d855f8e459b31b83bcd6b08a6f3946899e113c9bd1f119318063906d6e2f0b3ae2bc9246e436073a20b3061e223cba9c51d8d7f7ef76e02e01e14faed7d77e2cc5652496d850520e96f86ccd3df7a03a946416e15e72de9fd83dc605516721de3767af2f9e518067105f4f87bb4572a7bf328fd390f1ed2b3ee51894deddc090188a1bcc2f363b2bb2f3d307254c0d8243056c789c395dcb1562c8b4addb53942970d4da5fae223045644c5fc6dd31697d648f048362059b5da8dfc6f652754ada18af960e30de9ca989bbd83c97d301256b37c92ee23bec863d9a7f9b07e28fc754c189a50bada349e56f95e326d75066dde76b855e16f792ed8c0178aa992cbbf7d0b14494d7e85ee60e9d05615d92c0e4b16f6ec8d9afdf610bf311c0a31f23db028c46296de47355db2653b57562f35a8e905c19c9e126a43a0e07adf810a5d66a12c9623ebec70a1d69a5ece3edab920b6360099a9df2f2088a1dbd2c8e0dcc9d0fd5e5949ad024d0d82c402a506ab8fc4d25290c5f20548818bf6683d12761d566adc07b26a6231f39ec1c5b1e26af7d594b17313101fa188fe718b009677dae0c8d53ae3e04142da5f6d3bd4076c54f3775c792d073cd84da7d7025903c5b908cac3456dc8c4a7c60a16af90159fd6ea02f0744b2bc702f1ea05646683a67648c7981da39354f4d258abc3aaee0abb458e39352c0e449282c57033d189305ab766fe04f79c35e02dba19dfb56fc3e6a75b3315c59430baa303324c0ccd8317482ca5842d23251bcbff6fe5b585b8762c5b906cbd60b16e0ca0ad2a837b7fdd86047b63e1b239fe2267bd4b61eddd6bd0da6d5c830a82d1035d1a30d9fe73cac1120e86f1fe8948764b9e73985de4b542c8ba75b98b275ca4878ca9025d8a3b40299849f41b7f01dd3f456c11fc919721b9c06c0dde4b6d9a22ad7abd2da1e99729bb383bef075e74ee91e41f76695a467f1596ca92900b6d3064edd5d3f33a7805935c02d98ea99efc922966d0d2d7bd6bf87fda18937316d5e5b7c73ef4978c34e4ad41b96fd4beba2507296ead3a778bfef7e1b4e1be6dc856dc3d9102304dfe139a2fa8680e5de887d3cac6418ab65f51f03b3e7c47f57320e3ea2a16d5b660270189cd275fea9d6386a7d5bf491c161bc28ec2f3663446fd0e4601e832257b976a08b631a4df8c9c4e6278c44038ab781e02ab1a43a91bfc2e6760464cea889a51f1970bbc07588a9908a7af5807963306ad4a57cbe6864d5d85e2598b9c8e5223e1ca1a1522f338edd78842ebc824699e8697f1f708252b028dfc4c7165e8a56b0f31da73ab71eb160569f8a5b71d8c101e79754d5d26230d80ab5d7a005ecdfdcca1c203b7f977dac8744901efc6069cb10674d2884baf10111157f76a10c3f623bff044a0d7f271b4d4e12c3590628806a43f3c2a88a87f84e9949369ccdbaf68a879740cf6f38e18b8e5247558f734a9ac52ae94d6fa159bcf5a3d193898c4349298146b8ade3cee785f7691027815cfa0690f7751e856517e1ad27ecb6fc44c4f48ccb1e6fe45b00b556f1f8170afddc15f31bca3cf78a23d8569ec74f8b2022f0700f7a62328a11945163121b79decdc5156ddb05e50e01c3aef189b61d1157386d4049098b5b94f04cb4046038145a6ac3fc1d144bf9877d9da82955461304ef72d9cc75ed5d81013f92461907c8979e11cb2f301250e0d1a05dbd317312b6711f344571ec461a3f7455af61413600390b751107c90c1f1affb88c68d3481071dec063cbca549223b6d34a1631fe1d2ee644cde5af17a06352bfe0fde4d7b2da0e3daf5ee2fa07f196c15974897bff81d61e435d489b27d2af986be6e297564e520c167617d323e94d1c6de1e859962a4b32074a63d8c8046fba8e3eccbde89c8c65a8fce93abf3db8bf2dd82a68f38744cd98c663a6c1e643b47b8ced4e8382f4f9232ef24801e6f0be047252cda4abb5d78bbba4145b2c6dd810fba1ebdd891ac38ecb7441ef62625bc5c86ef723965af821210f2ac7783e20ccff44fc0d60b258be4f3078499040b033918504eccfd647ca4f410a1c7eddc080e3421f4711933928d5af62f489dc09087393bdff1431ae54943b3d88a8882e9b1292ccbc506384b963915fc1610a1ecd41d36504b7cb8a14cd5ddbcedc487fc7600ee88249eea728ac6b8b78fe187aa05e8ed8216f9d107452a1cc0f05c0483074c5ff949301f9fe3c3942b6b80cd55ae5e1c7e18401809a5ce6b1ff47737540aadb96f106f7691e931709ebda44839852ef403659d1583f5390e5cf83280e0be6ee837d6b7566c919c95696ad77aeb91301587bab76b564f3088cea47caa69794445f5c2f74e4d1a034c3661a32ec8270d2d45b7d9bccc53204e57eb8874b932d0c4933535106e0e10593c95e13bbf42342209fe73ada9948470098aedf8ed810e607adfa7a7b37a25a17ec5dacf3fa4525d3f1a029b7ac08b64068cbcded6d7266ee2a550e8df04a1561e3ea2b1d9c0e7f1782f3838bb49441119ed74bfa7702e54a88354999ddd77af9325e073465fd0628a627dc0159a7391da9c322a6b15d802af107069d5ef217338767259adb17310c4cdaf9913d82d395dc7e827fcd0d27c493887247a9cc9a157c373f8ad9d76adfb503c03e44a795f499b823f7ff69b9c479c23a7f11f776436915cf735b96f07b2d63a52d7bc834f581db62c36a43346d7d4218025550935872da447019bc06232b34c1f710005988010cdec2eea65df145025e2c6b55c50b77a467b91901ad36056b203372be10fc682d64d7bc7fef30cfc0c0f9d20dbc14aef366739e3f9677c6e3c00c371de4e70dfff9369a230c530db6293c4fdfabd16895bfd64b44f703e9eefd42f8d3f165140316b529244787d0f11e321e4d840af54b0e2de66df5ed6eeff61b9825894d7dab9e9ef31b2a5b3afdbbd81e9ea7517154725317107ae2b530838061a34f0c546a1325cda3658f00fd7858e0c3a476796434d16f057d1188cc3dcc9b0341b253a19a2e8965e3f06f61ca9d3e8c9ee6c084ff5180536f3052eb38543076843e08fee0d3f62bb2d7bd3baeb27528bda8f39c927b2b2bfffcb9df83c96302ed5e82c4342e42cd9f734b8318aa69be2e9e201d47d78779840c179c8ec37a76d750e09dfe7093674021b4f55b708cff85a11388254d88830d4e6d1e8f63ac43b2610f483ad4bf95309d47e3583825bd10104a1ba3b5ce830e8c5808930ea274284c0941304ab6509c64e90f9aa8d8382d3c3bdc88ea2fd9486e38c93772665d353d2426e32e69778abbe50a342174d4b25ec58bfe550f375ca786e6c8f3d5661a1339ad41c227f8ca18f476bc457257d6ad6b6a9fcc564c6dd50aab81b2962ff5e3d034e1447059d00c4fa5d4936ca004aedec2fa03259317e05daa1e5d04b1f77063a4b314a937c0d04426cd991dc05f68dc37f99f151c6cd4ff7fab42ada690df2332724dc168ce9c5d33b6ef201b358b764b37c51f6ffaf884695caca94f556087d26e82fff1ba2434af893b9052aea6fd1d37f9cc490268535e6064f07b7682dc8f709b5bbab8867e940df8fadd940a8865de41ed839a63290e35dd577dc2a89ac58824e8cb9ce37a64243fe5447b68ec3a56a96202232e77196bee9f3a8db17f7b3854dcb871440b43855bce9d6e1fdc9485f59b2b33f8a8e1f8a8706aba83fc199317b8fbacb1f8b278c6a92558ab7b3c005a71c22fcdc766d71416c50e7e5905a02b4b90ed6350f22cd012007738df16b0d473c31b4676dc1f4a837d15993193be17cded6e673922f043bd2b455ce4807ee8e2ad64cbc45693182239433a83d44a8648120c66247c7a530c23b4c478600878b14c74686193f5382e921ed7c1d5b97d1bda96c1e2e852b5be654df1ff2a3ea0a84efee9c70b20909697a2e2a6ebb2200de5e82e8600b5b39261e9ac22b41706a02b0d371c344ed7e665bcf55dbfba1a78df805f1431059b499fcc9bbe0d835470bcc224458a89bdaefb2592531535f31b61ae10904f533be9890e0995d93590fbb4cf5dad08d3c16cf2a8c5b3eaf51b19e3b66331f55a2321e1158f985955991b794ce182d52a4fc450bf54ef735eb7c7d84f256979b6cb24b527877cc01ed758ae28850e3c514fbd9848f15135ae7feb59470336d008348c7b7f293611f6d3c439060297ae29016f12085057487388e8dc333b500d59a0cff3f2f3cf5ebcd07ab7414cabdf15406dd99e22c629cea505742622f121a21d679a40b559143edd23041c6866d33df1a1460b79853ee318666455ca8abe60c2a606b3a13f3be46d15d59ccbe4db48fbcd19ba517b3e9dec272fa6b200154117274da09a43d9ccc93730626ef9a6a40b89449660c03f8285bd03f16652884116e02b876ed62e183f5789a580763efd60fa8feb4aa6ada391b93c868089b4658c8a795fca8e4df7c20a5ec6bce3e63953df8a0a5b2593690d0f061fb9b0e8a13d4626ba5ce5f5a2a5a120c4e9f601762068c31295ac0c2206e6090f3758f163171fef3f1842c8e48ad21118ed83fca30a53388987fd77bfbf0461ca7be92fe4c77ddd27d3e381a87a8b3f93258be15e43481f43975df687af40b743d6c5e87766cec57a0d946a6f46fe9118f6cdeb68fd1650bc74948325fdb5de23901345b6d7958747c262e79249b88b3c423d5eabf767a3fcd6ed80060c1759707d24323f41fab51405edac29ed4ee103bf90c494c6ea381954a2f0c268f69aa394808472e0f5c64bccdecc7b87e8fc34a6cb81ea685140ace3d0eb36cb8f4692786da468aa84572b06655b1d5d488f4c35c958def19a31f7a3aea1fe5e3376f8238b79656b54a668808c7f043e42d4209f85a9d95029702e5ddc9f5ec38e4b09f8baa002809855e6c21c15883c8da6b95acbb99023ed0276975052022109844d216872252b3bf3a2dbac0b2d46deb08fad4fbde0d980c740147fa22b8dc88c8ac26ea98bae55e6215caad98a84646105982c15b879c83c5b6b6a8faaa4010f0e11244c8125e10aa0d6aa80d2b0c5bed83b554f813bf95ed2e54e6fd845ac6106b32c1921e06274280897936a262bf86f8634b023982f166a00a54fb4c3a23609327e2c02c00021fc19350fed96e111fa48912fb2a250b2f0f6c850fd698ef14c7ee9e764451e50ffdf2e17cf86cb1d4bfd56929639387e1459e3f3e4dcf0c2e0f7af233b0c90ce49f0a3d8b26b8ae43c4e2ddc4e59e3f9f27c759afc68c58956d3172c0967a3413a231430834807f85f734459b8552b33b45096803bcad2a1e04079fff6984667d0581ba0221032500c173da12f621606b564b00e5f5f57fa64cf0ed0c350b1357aacff45c35925f29476bb652b8fb606104c07245fa575a5fd00801a03361673721af9f2a0031cc4510a6488b910d985fe560062a65f8833277ecd0a9baeddec616cc5dd8334fd1778dcf4f9b66e71e69c96510f3cf0ee848dbd73d327092640187220e451df2da4c531a1022848296cedf69fcd50f6bab042bab36c68ddd0843d2612ee7c92fb517ac3b1ab37fb99c57d4bcc02d743d985380921cd4d8b0a78063026c720af59e05192c973d36463a5561db939423df2fc5999e89e863538df06fdd8a42fba346be291ba10b16b35a14ca539db0b4a0317a9527aafc05c147bf80f0f39387bd40b950c6b94e84216867f98e2c59e5b53e8c42141a0eb32016e1cb866a25451a0e33444f390a87babfbbc1784f54092a41685c0e78eb9d8413eacc21ffda28365bab4dc0023aa64e725a35d1698995aab2f268dc0f870650701717151bd860b4f962273e50936f6f2bc733a8091e4583d93da75b194b724b78146057eacac9c35f93df546c7e14bf3dde6464f85859d046faa98a437e8a136e10d0df5b95365939fe61038ca788038162c12053a60223e8cec033d986c11e02b17a56e5ed2d9cd7e6d0b45fefefe86a21af0a9f0e50e7afc8ecbafbf25c53f88264ceb4650790abc7b6a5f7cfdc8ed53643e16586f4125ca3cf7af1c88a9acc19e2951c78d72f2af47020c5b600cd8fac92f8a22cf9a270caadc88d1663a63e3289f304f3dffc26f1ee79af36ee4d6d5a5f05fe6d75ff65473d26386727715ca204da7eecc2453a25101afc33901258cea2a825223368c13db01a4135105899ee2a4a0c0b41b70cf2e4cc974c380401f49c30ea7b270aa0d922db7c72ef27ffd4c8bf2a10c9958422f7cbc2a7b94d0439d6a17157284c1e6725a338d38c1ffa4f6ceaba03c1774dbe7a3e0bc283c9b2e44c94ca1d16f1b7ed85cb1abb280b6bd82efb3020671b682e071e8cff8f38afdc68ed8470712fea2b908eab5433159f53314f28869f8751afb970bee9bb769db23d8f3b06a392e7bf5050adcf841c8ac1f702fe0ffc97e3a8ea77879e991765c2a20d19628dc69f6782c1d23ccd5f75ce1c8d81b4694894d56f30613ede0cb37262ffd109043945b9e6facc2238a5cc47f61ffa5ccd73988fa83629c6cac00cc7fb35728253405745c91a11380e476bd01618540e8443c3301ce825ee418ddcef67f09d70bc24f44b826f41db1c6698cfd4b8a046bea4450f0891565ec3b7efc550d01cbc8f300cd2dd9ce388b43a3fe94b0e85816c4b92f8c33f2b762a8521d962dece5df34e99a3ae686aea1f168d201c65c5cd273962ef517ad83c8cf6ea259c75b28299f3d9e9088847dd365240d0c0734b6bd91231d00b3f5776475ce9265a86ca4c13d747597ccc9dd0da897b14a3c5e46227d697a7ec1597d018b325e8fc93e14d1a2de9f4ff22066d7ebb8318713e3f4fd977f9ffe94b8c5305c8a2014fa309fa3f7e410d48b954e88fcff301ae85e1ba3e855458789d3b197495d069dcbe936324c46a5cf12507e2bebfcb98329c3f8f941bd2d8878f47438c00d5f879db370569e0f13740d3e1d798fde52a9a633af5e5168ffc88013dd2af1d397cc8408672a1ada8905a9d0d8f43412eff5a893fdb6a653d768199ff98020dda889ee9081c043db59e09e789622ac08b99c87d03407fa4bb6de3a7579a5d756014a710d591b516df34501135fa3195bcc6d6b198c86e44f54ba4738af34003c85ea49be5f70bc3f1c95296b6e049b8b88b7650b11665de106ceb6fb48ba77e81f07e0bd69a1a30f4d12278900db6d4cbed0a950addbfed611966407a91e0b7461c88332bb0225c2905ea7d2552b2727ac332268ad8038afd2d9685fa15bc6257f25c9423e3aa1c4b4b05db0f7b122599f2d4aa430957accbbe8a243246c78082da2211fa9073155e6e3e1bbd688058941d131c0e71cca84b24d41a9ce4476a2e290b02bb835e86f4cebe786a56429d71619dee7a0c04930af14e4bc4bf45dbb8b19e0a057e0d17469b566f450afb6dad06ad08cde0dd414c67b49bdd490925af05e1d5c08ca5d518957ce39354cfe2975a2803b6e949bd61ab16cd77db6a76c1579dac5e7a0c17165f7641277bf11b86ed5705bb66f1d53b2f40fbce1f4b3e55f8b0817c7125e4618c93b9469e8609fa82ae220e50c32b4322f0ace8bc800167498234a4633da9a717111f984f0719b405b6fe8a3ea66b181591baf4e6dd4187ee0555fddb0100484252ea8c8711728073c74dd47b45748edd9c0cb6ba028f79cab38d5c97d478745e73ee64b9a52c52ab1657a56c75cd312a9df548e5fb084b7db3585e0f0756415cae17b10c3060eb91889d66d84eb365c658c16d856991a33b2d26cae66a0e1367528297d40c93e77ec10425463c878289141df2661ad374005698e2544870302e0655a32f45007fa69cb3499964240c02658fe3735d4907a8cbfd17daa80e3afd991cad35748cd248ed4a973d3c74e716215833df7f4d130283269a48c9e662669c56e964be558c0d2d7bdddbd4734880e341acc2a2a2fc26f1bff619414ece0b6c247799d31bc6ad8cd7af42013d99eaf4cf7341580c909502559ebeed4463233df5606c6e8e169c3edf2a5410cbb0d13b5ebf02ddb823d7abf05e932e93dbee65c6aebef06db71442b8c1c4b0f1ac6098d32d017a05d3cdd837f7ffb335020fe2db8d0fd4073af82a3e40213b5421f9700fa50f747603a8e5fb7f82da1ed61cdf3d6a57bf1efe4e01f40ced79ba5426ce7ab5bd84aa783ff5623453afbf19028615c9610b09e4813b39bc662dde8d5f5f504cf7cf2b459a7f30c2ac81272904cd1ebe600ab92c0bd12b2883eb7164b4d505b2f27838b1d66398d9a10eeb9bd212736d555abae41bb441885f7a070a6ec6b68a951b37bc7f63eada6ffe696e460ced8d05e2bd6ec8a8186409e63b762c2f236e9e9c2b717e319d33a5c6c172d0e36b2baf0c677b868039bef68558d0ea381006215d09174a586def6f309a5d7d209f3ffe1685938043bcc2ca972ec7d4a1e418e706da36a1dbafdd4cbbc0b187b936af694f44962c38d8ffb3a8386dd50b44ac7dc2c7298cbf2219d94cd18019df32477eeb8f7b62dfe99f268b8616e7e7577db0c83b93f2771025280e86ecdd9ac94e940e99141778a53deeef584b99a7eda0e0def498a4bb9670fe149a97305e9c804055025720ca0821082141bec4589030148c093200d5ccd98e49409ce910b29b1821af64a1d473c42e17fa713576cb7a620ee32b3fdcfe3c3bb38c93090c77370547a5e330f368bcbe8d46e54918085506bd7c6ec03db423a7d60fe0db740796d211ecb51d640aaf1da43a753c7ba4d14666da9bdccee1b4379881776473bd994f762fcb4f211d0af5a3599f657408536ffafe15f666b3a4db544744e70f22fd63f446d3a375a77782aa2fae9c93db612bbf508e0212dc1025fd5b93f5865bdfb7fc48b7193399ce21dc97e1b3e839f39cb72d824337b1c926643e87ce835b1cff22dceb4a87874dc790df12b5bbd334f5a471b3ed70c9d44fc673156b727256c3ee0b961977936f068878fde313fb0e1e54bce3085ce62ab3cb4037bb3d57f51def027acc4c8ec5a2863d1fcededb5b38b2d94c322176edb135fbbc966f13fe2aa3e4eb4497df8684f75affc4765eb386969828de234775d3d9f203c60f81829f41cd66a1f1e523f53c702a5fe2e4d9ca33d022fd2bc09d2a517772cf978f3edb8b107ce37a00cd5fa31b67e7bc7a6a6fc1cf48fed7470b5d70d4c68fe4dde08dd4533bbfbc28bd725c3176663e1319e90792078e6b7b6672cf569f8bcd5603749053dec3b0c60ba9861f38cef523974018f38c52f7d7c3e2fae39151f5eedc5efc1b78916ff651cff13cce3da58b657774e2408ee20a74431bcd75ada8c51236e86e0c89f600d62fc1c0d81e6b983b8147fb5592c3401f0ec6a17be3969ba705785e6890c735dda9791b9d3115ebdbb77e13f13e5cd81345aed5d5d9a75ddf41ee8e17c48f9ef3c7e98c8ea57e24983283b868b6d44683ca8bc3bb347f4f6964887dbaf1aad183f2038ea4f6972ef2db371a470c8f40700ba284ed93dc75b7541c299694cdc976beab9b422a9b147a1cdeb716a26bead34ffaa7655379532637ce0aa6ef5905f9a5b229947a10c60d5efe6b51c0a5913cd40376036200da732f84f50952d1b507adbbfa489f58d49275e084cc165a62d3e3f7753a1dd2baab16536116cf8d9a73be3957498c471f407656b3e80a730a3ce280b2fe5f88242cf636e176dab073e0fae4e3e0eff8cc41b097b8225706a2ed68b355626c1c26f2f16bee2dd8f55080fdbfcab60d43d0a5683984e2d05eb88a773ec27d18bdaf3606f1d6eb9bfaf4ed973b40ce05236283cc90e50c98f0f94ce62675f0bef5d522441e03c0633a3e59aa681778b8c14672e7714886313a55ffd32dd99f9b9e7155d99a052b48b7441117581af151929d5c380ae0fa916596c716889514e6925ca2c2d739df4d4d8186d4daefef2d5add409eb980ff670166d286ffbcedff087ef85a2971f3bbf96ba315f9d50bac0c7fee089107e0cfa54abcfd8bd2092baff6ed93b621204b8edf9f3b39adde28cfca3bdcf40b2d06de1b1efe726a4d878171acd11f96c5f4d46ab9da20ec2040fc42a6d3d8ed1a7fe9821dedf2929e3c10f5590510699a2328a046d545c71d1b8aa9a953c046a8bca0115c3daf4707caaaede9c552515ecfb40e7690a7bcd10d70b435545248b87b957a74d8c4f1320c7bfdba0453ee320ad832b2a9b3d9da7215b584ad709469a89ad272663efb4b54c9b1ede8cd8977e7d9e3f581caac677e4189f441ea59f96bea003f8f7a5b22838e38786d7fab8b2a40c8ea29801637f7915ee6731535eee47acf4a88646274d3280edbb8e27706b9c92550e848662ec0daff0b1c5b274765223d376061f2328c817b6bc51c1115e809ed41e1edcd1e63c2c2a14dade148688a15b881ce83df9b4ab7d0149a3c8e2305f02fa4f8ef2e1b5492a8f97a0f82728a0c7bbf0cbfa8dcb4882658b950fda246fd78f77bbe7f1e626492f60ab6da1a02192bd4c814121cdf169af1247bcb0e4eb57280993ffad34213398eef69e547ce6a5fbb643fc658b618eabf3898b37d7a729168068c786049b9ababbbd4d964eb22adc3db0c78c514eb6360402687ac02ad42644b14d07da89f1d07f101f3a42ef5f5e02025ee41e4bbf0031ef283323d2257b3ef8eb6ab03c2eac79a2387126d5b9f4b1c8448131c169cbf3d9f814e5881991d6981750d7dbb5df57ed15da96d5b333a8a1f44d56b0b4325556c44f56111a95e193b7c713f21de7bf791cd82f09e0118b0d22132ff9a6ab406a27c82afc57678c33f41a36c019c952e4a8e0696a769bc0416667b7a839d7501864fa622639e645c764a1b9609f371cb2e18e59fbcbfe1f94b2c1dd66e62038a4188247a2d3d999fc99414b307c83d8121a80364597fb125187484e676fd793e69f9b9f93b480353b8335d7f7d8d3af8319e5ec694568e83799b2ffa553f2b8dd2ba1606a53bbab07a16b2d99431355320e81004f18c73d851504a19764c0fb9e00d860ef5ba38051f6cf9c5e3a9155b5e5fd240463cec544eeaa23f5a3b033faf9c05f2efe42f78ca17c3d63ee769c74b0dbcc8cbb10b199d4b250dcb15e1a6aa0f0772da15690f08097ef239b7492d8a1f698debb94e03cdb3c28369afa037149f8ef4bbba748bf3c47542a97cc6bee1f9182dc959e4a1d1f6cad492c8ea5a8509a0360984b01ccdd6650f8e56328c6b3ffc0c0da123e321fa79e017fd1ed75d84c446df576aa241e70dfaf73dcf8708e62bfb84ae18661daad9d9689e9c2aaf5c341b8a861072cd961f8024576615767c78f70bc63139d4f19f86e7adc0ec0c2339821441b74b9af4de5c1a93056140e5c3bac990e692a75b941b36a33404a069ef2a30db953041beed4c08f4da8046696574d7e16ec20792e87c885034ebc1c272bf7f70b5b3dbf0b6f4aec9b742f9ff569765300c9489192f01a9236798e51abeac7c5cc7aaccf4cfd142ccfdfb37ee800330ab03fe8e5df92b2c2ebf768a463040f8d234759f75f0f96b6555e161be384229cd65450961bcbc5f3ba0196283b1a2b7bc33312d396ef2466b515fdd3ae713bc7a5ea1a7b3f7e8657112109210fec788e5fd705799f8fa0b286c401ac754392d14e3eada14edf87ec881d5fc1e90e3b097a272a56001773c1b111003232aa31d44491e80d1424dc182998d79c3387b1d98e63fb804d8ac59a41b97261b2ca373ca784ab9186e9ac0cb6cffef6e283384d810e68afa646a1d528ded0da549e686940755a125b2f6488ef2a3a1d16628a31ba48a9d2788c519956598e695a983fc583011f136f64794719e7e11407e40d0c7362048550f8f2c49e4130373a2016ebda8eade3804f73c874fcd4d53a686ac7e2545c803340477034d120ef7b369b245221e924194d7f587bf62db6767f45df9613ff3363510db929f8aad83befc91e50335bb13dc8c3bc3baed84e10eed5e8d20c8d099ea33e7a79819e237ea46cb6c090cb120e8c62a59a9bafc45c69843d3f0e7cd6e22779455f2fef10f2a367abc72631e57084d20956a8217c0e0a97792105d830b85038883b0ed2d4886650afa0582e16b677c4267ba46bc3571ed7491a2ccb28621892af552c4425ad933d443e878ceaa7d1b70e16e0ddb0c78c10c63602d804ca208e3b348a987e44d36aae5f02c0a4a505ee5ca9d8c8bd5c631ba0ef37f4383aac774b6031d0fc0baac33b83e95b1854fdd261e0c45cf297ad9c931e4c04100a25b4289dc5959fd48ccbd4f426e0f8f7abbe16d32399f0a1c6325d3b6cda2ce53c73bb7f641542b0ef8bd7cbcb39c4c81831c987d7ab380b40e91813c83c561f098c6fcf7f0e97614476c763f0950a7448324e155e76d4c6f4b685583befd23575fb8684434e26c0edc04eedbfe6a8bf2e9a3b1307f29230005559742689b1aa1d6414d5b422e0c86332a9c5a857c6f1a8c5b911c85018d6b36ec6b5c83aa75f9a90c6c7c025e88d7081adceca07ab1613cb4611869e1d622f3b33d0a5d166fc4c3b4f7b42ec46b76c1e34305359f33268d43b3db5ff2800889d8f43b90380b22f19c07c7c38f199d859f41e470d4501c5e29c51dc9153b76964a2cf7c054d360e472260a363f5dc859ef68eddd7e9ec5c1cb127396a517be0b18370ee509558817a622035347efdb1935ea02cb9e654e1c1ecb08eafa78e2287c60c9f4a946be43f7d14adf8c303315983a86d7f4e4c1588a48064eb030cc05c2b66eaa3af6aa51b8f32e92f2e6b5fc55a2ead9fa72138e2c547cc18ab96ddf1794fd0bfe13306123fe54476b906d5423cd05f0dd72b90841afaa149861801cd2cfc0895d1bf2d0a2e65453a2d2ced8682e78e3d8a76255da354846227be9eb18a98b346ad7266fad0b70c9a1f7cca00484c79cbc383ae39c3c4aa1ea7992ae0e40b0c94718b95171c0c9c00273eaa24f81aa11a341e6210048bcaccb07b8c73b735ee8dbd0796706df803e2a5bb8b825991cc2dd4da543c110b6ddce16dcd2b81411f4f1a3b5f5dd1e5f7e8613e14dccdb32c215230d72a949b41e5eed74c1e2f330bc812cdb81211a5bc16b02d97a547bb3d5dc3b1521f1c308cc071144d6d6195c460c0080c54f561fdf70a5607f8a7090edab11e2dbdc60dad6d8ba940bd975438dbc1b6c0b595d1538ebae52b3860f569ea786b75cb7e4067754b2479d1ccbf9886dc2da6cfa6080d14efa3dd4a952d6fef83643ec807b383a9d65540e7f0252f8456e1095527ce440565152fdc2bae1bf1da201a4d2905021e33ac0692e300ce5acdc4cd316cf9296506fc0c3d1d9d1d0c9f936d9c0bbe7515309ce20411ef4ab77dfad988c38d96c74b1f0efab33fcabf7eba317c929b71704171e13a108714b4f45e09cc02406f961697747667d5db00adf870a115ad4366c96bd72bd009f6a1a194d205efe8adabda68d96a526d1d242856f28d6ba70b9fb7142f2a15ca1201ba572d6f61da6836c2071535accc9ffbbff37b71e5ee5e5edee8c941ec8482ce04f4c7fdafab9978fd0763d32888e9803641e18e78dafc0f89791dd08f4764140ddd6cf2855cd408c6dbbff117ecd2e82c05444805e57f703ac8222720321cbb4743efe56a76ccecfc226e4b287f75a0e58209f974a5da6a4e5d0eac8c74957dac09960ebb102b2b05ed6738adb4c24c14b24ecc2da436df960103bdc5d2d39e5d032fe162d205b7761cd49e966b83118f74bbf010cef8286790db3396ee24ade17720f2e2670b2083e1a069941b48de58a1872ab0116929b5bf1fcc9cbdfcb1d61f22a0634d91f48c056184f9c99a92d47c840469d32dca7c0bae9572c9d082604c761f0af30c1a45689de4dd4482653162324454e0d226407e1b8ec08d57ea9abe7eb3af3d5768c1967e091af01da1edb98c8ee581a6a2d3434328b5aecb9c66bff89b60d988ff9fbc9488e514e828fa6fcf1cf219f3d49ccf2805c09be8fe3a3da368f5319d4d16725733f812ee8b187621449b8a1ddacd7039d180022692aa95ada864c78994f97fc7220eb1ee1c762dc9e4910859c5d5fe7e133bab771740a063f9f71ac03d32c138b13d2872d569b58393b6cc5734201ca4a6820739df66ff041944444f4bee59ac051a33610f49f9ec1e857b61eea2ef39eb73425aaa73a69ff871be0d795f9efa9d52b7a8d40dd1cb2609f1e3b718c531f416de2d142ebede5edeedf53586e907aef3a54b333579c6b677ee1f6ea111aa616ac05d6892c9234c4f348de55abe4633f1ffd9fe1b55b59599d2f0eadef785cb0d419779b2e652d1ed6bdef3a9d57e2f4b98672ad88a3583a936e38580fc2dcd0ef8311f79ebf607c8d611d9554674dad6c27e3c05d8d318a1ce1f73188d9d327b10fce1a709c2368b6e1049d0bed51e2913dbc2de7d348a777449a5256cd1158d40ffbdbacd222073591f572df5f1ef1239254b17e50f0b7b0e88fef73a091f732733cc95d69d319241a70422e1a6525239ec872f0bf670b7337f5f785c8efad9636a666cc0046902eae8eb0e95d6e40f2c023d5a405726a77d1a7ad3ee9d6344ab4b48c2bd441c1b83410bcbf7da3a89fe3a26bdb079c9199a4067c9616c411af9cd97309b7122ef1e1fc7590268bda4837bff7b4e4d9a403b0cf78bd09ea63d5ae74df5954ea57d6d403cde7415d33cf365f921354f7243645b9de900480f177f983df3e6949b79668679552d1870c5968ab79bf751b1337c6eae8089ba8262367c4867d8ebcbfc3dc470f673408da133b67ea51bb93ea11abccd5f9e7735312454f604c2a692578ad619e8ba324dc5e849a3c8ab93c8466f0ff22caf67bb8b03f743af0e5830747c67be40c9c28ea584d52f69a869dc0dc14516a9a2b679244b5b70c1f186443f3257b6d146be78958decf68aa1b9d2de88bc908746c2d65a31a02dfa4ce02af64e38a295d83ecc49834e2f22df173c107213cd41f95e3e0453a6d536599b52f11941ef547b181e6136390ea8e8d4824321dac7fe143211af79e4903846767ee2f2d6a78433fb2af5ae29c8c930d2f16616d569d7824dbec08bb7108e9c621d364af3dd3f56bc7afaa03ecc232c0371532dc033fdda996a5d51069875623798dc94b4273ce6192e3a60bedbb3c0c7f2d487656edde1a2cad5a8ff7d34b27dfc579c8de7448bd2621ee1e47ac6d82d6b8eb90576477c209541c4f6067e7a0aafc1ac90035032d82dafe55f29264b4863ca5ccfd383357acc6b9a4c69792b4e14e30aa08f03854509e9040e5b1fc12e42ac6fa66c32324352195138f0880d86dd83d12b0852c75b5249b91bc339a5ed86f98330d064e11b449be44439a0529b556b76ad7c3405388971cbb083eeadd1b07b67c9fc660e852260e7c6bb686a2c095cd023a630a5bcf38a51cc86ac7920d3adbaf9c99a44b61033fb25e53366c67f1856aa6bd5c574c1b55f43f0df311df44b9e567a0350bc32fd8699f1ec5d2fc03600a2dce51917278f94f71e429fa273662ab5fc250af96b6854d99075458e225c1cc0d2fd5435e2126fca7aa6ba7ebf8e1a74f628ef71b98487bc11d4a3810492a14f09a113e6d191630d1eb4d44ba4d8380844e851e4881f208d21176c3d91509148958c6b5187b140afe3a8ce1380ad66c40f17b1b82a876c7d71cccf2b04b588de6fda296e84a71bad0c228d08ddd778a89bf075ed3326795343d7e0c046479c779d8013d217e559709f2d51a02024be9d861ef1bb072e973c62274c02aa6b6a49502537e90913c0e17c504fd6e6a586209b0452e6fb48ba97ff8cb162aade0f0d8542de017ad79d37979ca42e03c8ae5bc556faf2510661216cd6338e474481656d039c04d48eab98a09f7ab2c479718bbb6624236832defbe44cc122f5c36c1a178c1245b09c7bbe06ac468f18b085fd9fe21ab917d72c92f31e4a5be48bd2490750084eb4ed06a9a9d07ec6bcb4e34a903f013e7f429f25f71451659edd2f975ad0de32e05ae3364bc0979a6aafcba2692a36c79ea44041ec40d0059d5cf73466e174610de40335c9ad48167a0f7512d97a2b6cb335ee992d83b639c01d9a8fb01a9cb9598629172829f8989f70a365bddbb97d44aa990c5947a9ac07e671eefe3c8682017850d75f460afda209e387084ad8e11ed5cac5ec3eea25bd24443ae1869b030d6f41a6ff573048a19f45c463c7d122ec16bd7e32631af79e16359464da9380e800373dd4e5e844a5634bfa129e015663540ddfd8b4da3c5b9ca7f01131e151dba39a208cc56adad9cc70182205ceb56b9046ace1e2d6a244d548cfac5aece3a0077990b9915d3778b7f2441380f9509fcd89f0af3dfe54d44d05a31198716265637d75b4c5088be49930b08333469253f64dc15ccb9b995e15433d0087eb869b9e8d4dedd2bde5d1bb4eecea9b20c740f8c190f076dfafea718a3667afd9d8d9e2b2ce668ff6d346685a307d44584684982ba84cc3e8a213e005922b7777c50d8d3720fcc5649d9219d065e98d212ed5e989d10f96a7aa5921a5ca3f362c30c89d805e81f96922686377e4bcc5435b82ca75f3587758440af27687a408a0b6a15625424a9ed21c1ef58c7162d7a703bf5e36c061111adfee4c099351537b5d2a355cf4be00cb17832a03893de4543931d1f6d3ebcef84ef61f5f609ff7fb9f85d2793a787df83604b88b2ff7c6ad2f6598abd4d39596271b930005e23f602d042e4fdfbcef9174fe0c2b061f35472db3e97f10ab09a1f4dc3565231b48d39e51e002e5cd644a08e18db7a3be901b6f52571dfea13e6c7cfe179b52f8ef6423e3919905bd5e04daf08827c9bd13f6e1488cd0a04cfcd850443d5389c4ba251a3c06365e48cdc1ea5c2af27d262eab393745d1592c211b8dac952a930c3a2e24707537033da6f8d6c2e8fb07f3b0b0e6caf8aea09c8a105a8b99c2575ad3a1a4d7667e7344c1e6bc1d247c65f8e9770fe0c7a9951b645167c9cd1604abce2fcfb9b30dc15cd9993d5ece2203dc7a0a8666ce3dfe87c2ac8a6fa67a684e012f0a9bcc5ff25cb334f4fa9a76ad3514ff5114664557a32bc55643851f21ef644b0992d4f28e533b3ca43f8758cb88ea7f989d96dd91b965ef639ba60f14b892ab6de99bfba5c437dee44a6b5c485be7cc82d4a8ca08bb0de5c7987122a566589bc661e62792fdfc168c0fcbdacee2add9789f2e5ebc0ae92d0a235ecc7873ce1b40bcd74d1c3b6d5598aa0ed5b5f5007e293e395f2c2921a6e7f446a836155e4cafd075b2f3cfc60ea07893ef8eb40b9d59309b0601e3df57c2909340ce8089e9ed2325deffa7b310cab43ece4e4d0d27c773c10075228ab59e7f8182965abd0dcb6b652050b2d365e7b1d05f649b19ce7b62f47ff95a31d052ad4ee397b2cca64e292c6cb37dacb1aeb0f547ef44c998b4b1d7980441e01b7446e164fc643aee74afe9a6c5a8e69a0a34f1829750167641f1749da69f44809109a2a4c5d0312929049f38f9929fb7191ad69eb2da3e357757973d86362bc6c9511a347ce88106bce57e35c4dfe9a33d5d76a1a6d7cb74766356456b7a15a66b7d2e483647cb594768c48402704e09206985cd644a3e61a51bdf1c1f451a55910932e37e1d11e7e3d60929d96a29f93c7c382870d29deaf4666f9c6498becb1dca7a0f03a63998377b82d587aead568928700b483b71483f53a2543c1eed3b9b4bafaf2d45e10ff99da3943aa77ee5c2e1a84a6f0578654ed576171308d00096ab25c93f244ba3104662f94298bcb6a7fc1bbd7f3bcac219b574146ef64bcf0cd1feac4b74bc276102781f62ca04eb2c6d085012e0d06a2c2412ab1be32698f304d73b0a533c64920d8b33530b65e16fce14b4d615f1bfb236fab226c9c90b9448490db19bfe5d529963885ff0938a175e112d72c6c4327cef3f44702cdd7f83ba63ddea8565b001d6a23fe51eef3471f828f5568faed064ab3e2390c86882b5a6ee8782f0ec6c37d98acf968e5bd613da46c36bbcf9f9f0707590a19c28a509b27a8bfbdfb730032a64bbba14471ebea2c398a506612b785922597ee76139034cee2ff3e74a4d1eeb471cdd7f43068bad806a26c8d86412362793c7823e1e500fc4495399b0011a6988eb76f3be8047a849951eb253ab9bc2767db88e5cad1100b1fe331b68968198a2e033211de0c804009f95c409a4e13210a30cf12d725bae62b6f6ca513b8e7d9ca8eb0cb9b646bb178847fbd01b44b4fe1e6b15b0ab7c2962874d5fdf70a455f03d2e4454163e89b20e6a1d8033870e1e177cc6d856457c3624dd76227bf6b5d4f0c2243dadbc11235dd58a95a272903af1ee6671b636d8f47e90bc36d5c6e070d9067e7d81d504f566d040c3f193aee5b48195fc5910ecc4926d1ebb121c2d451d3e99a2386a69104bb5c15171ddad5caf8e09d7a051b33c1db342cc4ec3d81e59ff6f19983a44ca609a48d86a053d635ea49fd90b0bbe55be786c28205cbdaee73e6ed957f8e93b8f2a9209555609d3346a1b044750221bf76b3d1c10504ab8aabb28c0aeb89fbacce4dbc40afc27e0b3b9e86a3913cbcc9bdd343045e0ce24e72c6f52b6852683fd9a61533e5994c107ca65a0d81d4ee5322c0f7168e4c2b32eba8a7fd783eec9ef68d7f20950595988bf1f857bbd3e184aca1ee2e7f5f71fd30a1075e59ef1103345a8835806dfc6a8a246dd79b7551c26a9b16a7628dc65ea8c930abfc7a7cf04f1e475664e1373cfe6ca0396d4c750d114081f22d33d7981eb536e60ed2d3ea5fa72cd046c5fb110fddfb14466f0d8c35b2658eb69742505e7d1d4161f1d4c1b9af6e373fc984baa35f81392bbfb56c201ae31e2b6fe2a22680802d51d9ef98e7ea830eefa07667879bc93921d4bf4f117fe0d328d1586ad150b58685eaaf61e704a2fc6ec854d19ac27a9d236d88a1fc310c23255187c88a5e2f7684a02098fa671d68a592e2096466c5b87191efc3163193123feeaaac57b4fbb7d78352b01f5ddf29563946a45c325c74c70e2af45167619af91d10088f0699695decdea4b41d43be14e0b0fc95c150e122d56dcb90ced5efa1ec926bcb5eb55287c855f215bf7dd0159a7cfffab8b8f897ecef49764928f3792c5e100c8a3fa3044361276a2b987f57624a509b2a119c12a678d25791101d182af43f1d44749055116496fd0ad78598cfd78bb185d0a5b02fa302f3559a5f952b9ca6e639da088792470e04ce9d76c431d94f0633b7c9893c3a72e01289b8a7573e60cec814bd2e2a553eb1728a9f629cc9324f93f7e440a11a39a437bf3ed1ed4ae684904cdc4fa3546e583adcd55d48a8d0ad228e4eca534dfa0cfe35dddc7b817f9a01d9da79ea45cc49915a2935d6226b7e0b99417c55e29c070eca6c394f3994026fdffe5382a05ef7e348dfa260c790b9549d5ee560c7a83c1ef7f413a46885df2a15f14d81d83d4fa51c709d5ddd62a34b6a8d531e04c48920e525e98875cf188e8c800876a3186d081472c3e3c5180eb3f8b1dfe1b2bd18f271262211601f7b0a7ed0620c5dfdfcb981ba7a33b8b10af6995bf36b19889b9938a460659e2454ab63e1e0d423ad0d984d4d3c0874aba21623d301d12f606fc3296c427dd4aa1bd6dce71c0f8b31b1c2be774382b8db3f518ffa883b97da0dadd6dfee0a647ffaf1e89515ca8a6adeee729e35a3a3b43cbd4826397b4b7b627e41ca18eede322eada538090e4b924104dfa67909d1a4d4941ac4448d911e21c6068c8d094fe3359bc8a26ed66962bf618c6c93f9177d5f93527789b89ba3d68a9e1b467d3616e26af40dcf7e8e71e6fd1b88aa1340ebea1c0e8ed4400f13904be8e90cb4af01bb7be6b8843da9f878948cd705f2db20ff131ed1cfa4695d6352b78a2d9bee47e45f19a30cbfeeb561853cbb0ccd307a5c95c9824001f9e74ca4cbe5ea9448f3ad32cba1087603c3627ec1c11ce2d2a8692240d650735dd67199fcf92bfac80b38d535d4c40063632bb63ce185a3c5aa992b7a28b761f0683010d3a3c058a07d8dfcdf7e9714c9c639cfb4de8a8ee7bf4efff8c5fa8ded4d8d5bf9e00efe6edc2ffc87b886a071b6e65465192361c76ef37897f7eeb2d13fc3ed6fb02bf2b9b7dc973d4a5239cef90bf5e60fbf5d6fe601963d3d39fc92451d5fccfe61d8873bb2ec8e386d2752f7d3d64f3f01b90f6a8b13ec9fdef7842f7d7efeabb2e6dc7a2279860fb434b71fb32eb73f0f199ed35e4832a03f1409b38eb0b76df9f885aa7d741f777b24feac604b4dee56aa9412461c5784182c78129ade4459596463f7f53eac7e8eb8b15c2747a3dd1a848c6a5ce7974a54d6ded7b739ada83925ab0a1c7cf2cd2a1871513c77fc80f8ac1c8b12ee425bbbeaad522e8670902a42a597f04db17ce3394e0a1423ec869dc9de9f790da539d84cdf51c4b98c5803a02c6141d1b42c2fd896e4cdc9b9fc2854f5d67da69304f70bc3c4dbafa5354a0b896c60de031a0fceb8d8c1c2bebb7ebf1feb0d549dcaac1ed75ab7e4e6ca0842ba63a95fb17ec222dc836f37171981b6b15f6680a67bbead684b46ab654d35843f036b0a51c24a73d0ad34104b473c59cd7f6083cf94079024b5f18d50b9515dcfb63b4440189659718bd1e288348ecc7df7d80a9e8f65a8611049fd9d8ce67e831283a524fa8893c9d0d907c05fb8ea777c015a1b707008dc17fd1c2646fe9e85df960eb1e8c00e6dec6603ad15190860e1f1cf1f61a332f2df442b7a48e59fb5914ac307fcccd938ab4eceafd708bf0fde6d8017ac1d2e00cdc3c240978173f357d0f80847edc43d1498c1368e8251fe4ad885606a0078415e17dd3dd3ffd23d1385c5a02fea1688941bd1dd7e547001ae785bed2b7d02b117b4b665ce3306a37af2017009b41e56ea7b23e8a7c0f8ec0766a690f0d8dfb105156ef8042413af70ae21d1e75bbc6cf8df1017a144d736241c745774935344ee98b7c964c2e522ef4d2f71f7560704a505b14fb90e5b1fabe63b43a17c3c242dd49c46135d9cc8e1e118d401b64410fdb89d04b851870846e68db8351733ae52d52bac06fdb52efc13c8ff37187a755dabfc3018f6efc4fa1fd06aaf544f0f2333083af3dc6f335a957824187d3988ba57e605e43f68deca71724add64be8cfb852099ef7382343ffc9fd367e881f3b0aaf60f7c4d7d5c7b38f687be5027a7d675b827e4aab8856986bf77858fb039a83dc9cc4b10d281a01b026aa81cfd5ba674039c9cc6301ea3a7f32a4f28bfb059bc530d5ffaf4192a0a9eb0fd1137380a195ee1f3ffe308843862a6bf97e4a071f00791d7e7ad63f83ec2b22e3ddf41437fe96f1f32068481d3108e6b47849641eb7dc8e969a596fa374e1919517129d9d0d6d78056508c39e0df6b9eeb2982c2d98033193aeea3ebb47d7ca0663caddb4dcbd63fa8f6fe4e64427bf2ffdafdf4b89bc2625f4e9fb31e01e894321a337e3cd977aa1dc8fc5fe3fba2d504dff188d77e898ab92cf566377ff837fb106b8bf986c903053ec44f263acd65661423d30c33821061f32e594110ff80588f33315b06f6bb1893c25fc0a031cd0cbd3370f532c5572e06dd70ce7f3e9a1f0595c6ec10f5de3b2de433dd9c99e5cf1c6ee3762f30dca011f14be2629f56322724fb5f885e3785914a1bcbd017bef734471916ea0fc99cf8fe21fd6120ba7fcc1466ed1d7d570ae0e4e5dbc7602331de15d9ecdc821d65d79da065a8744cd47f37eec88287f9a1f3e8db1fcc7c88913afafdc66298b6f126fd1bee2fc3b0735baaaba2a324d607ba179b396e830e238d8d884e8d7bc018e1d731170dd447bca53a2b5a7bbaa8fbcee62bfaac97eaa96156d67395cd5140e54c2d2a2af27a7e2441758528d65e5ec7de319fcdab11ed2500de72962e81ea3d297683045dfcd54856393162bd9fd2a25313003e10d822011f3d30df0994a752c692c6233f60b2c8b3c0529bfcc878685bdfd1aeb6028971a0b16b86dfd40f6f34943cb19d1230e2ee8be4b346748377b4dab8de3a2456c22e06e0c0c72a54207fb0896fd02538d305e53d20b0ec8b7c8d506cfbace3c43a778f9e60b076ee3f6769cb070ddb077bce84044b24d69a8bdfd91738f48b62d1cdac43f20f7f56ec55794515eed0367dbac7d45f2afb47c04491455d41c5be1b78c410bdf11d4ad2a53b4c854f9b111babb072697727aa0ce0fb907f1d500f8436b57fae4511fb63eb9f84bb327cbdc939476cc577c11e6b4fb6c02f5c122e541003e2feef34b763424b3f66b9600dccd931e38d2475b0edb929f1288515b644abc3327e2136944d835814498caf7553c3f724d4c102922a772db3536562766d0b06b8453ad78d139d426ea5f882d11d24bdd728e1432ed77c77f3fd55b740c29187dd6f2a12d94a1a9f096f5cdbd00d754f24a23efa621338ff70c9aca84e4c8673e6c20c630d3e315c223fdf15ec03d1968a67b7593d1fd6676c5b586a40352270eef173badbc307a6be314255c84414134650469a960f0978dd09b711ad5d1dfedadfe916503e9c7d2b31b170012a7192916e54d541ac5ca57a4571c5aecdb0894084d0b95fd4673c630f7b5d55681174526928b8a9159fecd90c6d8e50c5f2285c1a10de52e5a3b8d273e075bdf8eeaceb75da6ad8120a90e252d9880271d9b61469d08c8fa02b4ce64a3379c1bbfe1fba817488ae9373e425e0f1974a9147efa9ead2d4105662eda3737edea4c9a63d17a8e567aac50897a0ecd72906c28dfc2e41a5df5dd61c17d7f6a60604fad402c8cab492d26f551585c095ce39c17e0fc598a3140f34aaeb6e486b2ac5d458a2f1cd1c54b503d34623dee4b93c9dc02fcfbab72f621cb0e90256ad537da4a4afdb38ef218922723d1551b8bd581027ac79c5578695975b096d0200d48b0ff1aa6548badd57fadbc6b60648a4f8f4ac2699d98343e7dd3d0632c2a0cf7a6b3813a0e21e8eccab9cda6a91dc71c3c42f3c2f564d9a998b107b93211ba01ef7abe7bd8e991bb15daa16745427db628ce4cb393599bde748c1731260609985c0e1b3dfa512a42f051a7510dc3e26a387ecdf236569ea6cb1b469a72336489fa5e9576c3d93fbb9d7e4b44216865aa75afd9c27c3fa497910acb90d1e36d3e958fad04fc2a4f33e25148ae183579c210fa8bed9aed5661943f52dbb362e25b036aee90ea2a23918228e466e645d878670c81e4b1f2669c1cacb0585afb9db3b64b7ca2f948a48d8204fbfdb2994e1e87a7d2a8a7bc49e553f844b86cefb2a414972f2a95b6b7dd650b18298de4122a258414464a5df39e162e4cd4d4de5aa5340605813ebe403367d7f157a93793f595f53aca8e2a4d7ee4074012a02cb5323a417d8eeb494eb0cc17033de1d08d65c4a4f9ddde4cbf28698699cc94163a910f1de124935da8a45019f05898fd4fc183863573b1f0d67572e29f8b97d6f2472f8b711b7cf173ad7f50d3a810e506a2ff93e270281a5ef40dde744ca6ca4b71e811c76d801457935455bdcd5f855c3d29d2a7d3b9d78b5c48b88df16362af28d795643c440b4be67229f7ba80c4bb4881cd168195b3a196bf2e5531c60d60dc6793fcf3866d691cf8cae131be330ac3c01830c027ccb88d1527d6425fc37f48b27e8afc958e277c4113910103c7d274b61f22b4a04f7b0c975385979fb794c20dc9b2ca5f8cd90be81aafc8448fe77ab128f429740b51918408ce4b4f3c05423e52a0347bf44ef670812a7a9c1a9bb93ad9854f1a5af49d0bff294229004042f513808a35fdc15d07533ec9f551ab32623d2dbfbe12029110a141e179e4d2efbbbd6e4212fa114b78ee6ad47d68534d195204d625040354bcfc573e98073d8bdf549a6d3485c382716bcfe1ac369898258ab299ab2c1d1ec2f3d79482903038841b46663e68ca4d6a4789f0ba25598530bdafd0783c2bbcff336a54a995f8f67d092546acc1150fcdc49b036bda364c1042cd0a88a19b9aa890001178a8b63edc7b773707e26ffca4bebd34c8cde6362a4afdf31eefb46bd79db3f49ade0b7a5a9e134ec2c5d0104d3848607b04818f2d42c7f07749c4d571d550c5023442af41bbb78512eab19f8f7674a126fd20467509033cd228564d178596f90d0c55260a20e153a6f5c6da7e1cdcdbc5a192200bfb1715311b7ce8f379c802673459710d3d2682b1ace45be05d605fed6552f7f77a6de7f6eeab7da6e7ce8f78a69d67a3fc478bfe9d7fece3df9f8a13e95e0cd73cbd49b3e371230cde67bf52a34799f978baf0b5ab12e5ffe67c2f027a8cb8d59e610e749a61eafd76f165cfc1649ef71f48647b7061e1669de833b89d8b5cf95e3384ec121a1b741b13b7430ed13e5307ac34fa1fdde82ed4f34bb3164292f40a57dba8d8a34fb76816e746a2c1b85197dc3081273fa7d23c6d296ab2218b76353f59388064cca506d4d95e486ebadab684e182f53a84d851e0facac28a7863c485c039e862ef22a152e74c17b250a9a10db26196755c0938a193ffbcc80e62d93468ea1998481dc5062a3d89ec69a2ebd7e3cc9d739145bad5a421896eb7db228eba4d5869885a212a382dec9184fb2bb12f43d4a175414e6eaf22f5c77ddb3488e539a920284462ead356142bcf3041cddcbeb22cf6a8f9c5261f769f22b5cee8f77b3a0580b44a8f0a72ffdf1251abc5ed4926ffc98851e150de81ff441238c21a8bae46611d933c3fbb94fc198502fc0d639b45bb04137fee531b1cf9ea4898b52fe3ac9f0ef9004831cd34490ba5b957070f302c8fcb117076f67ae27d846de2ebf9bd1ac7aba319d39f3b362c774a666225f58652f7dbede7de62e5d5d0858dbd5c90be6aa5dda51889584019af8a9ffdf3023f686ce85acf977a6e2cae426bfbc516c432f6cfe1bcaae638808e992e1bb47b3fcab9b00c75a8173c74f589730f38f4d6087b5440f413f12ca5612e095125ac4b300e424008c16f6fe99898d129bf596bd25b17060ffb061b3b00d5c43454bb21f063c7b03d062cbcd6be4ea4a86b8deab28c7bfeb87be73c8a8959890216864a6e34a58ee9ce02d5999ffc9decef9cfffefba7afaf3d92b490efd4a83c3483591a2748b66228cbdd1e7420fd46f1d26b0d8dbd83601e15a5d76087b89fddd684d211da4fc42a611ddac22dcb3cf6d6fea51dfc20f0cd3c3eba248ea9967fd84c248ef6b434b16e0b50447329e1ed4ad799b1a0e1e89dd434cecae57d6949670520c67c9398ec2220a77efa2e1893420bfd9afb9d50b2d8e5173236941285a45670292538054ee4fdc9effbad56206d54a78ff9d12916ea0f1a44f8169e209a0a3ee0fa71fa1153ab5ac683770a1d48e59da4ff59a8feb9c364f7a99d25aa57cbfa45b76a010cede3ec6219965f0550bc1443f8c6010a8298339343a0da30712d740cbc81d24fd937674451a1993bbd75aea251f0b43e76a4333aff96ac2b34df28ec2a9fcba1d5a87884ee61645558b3074812f4f53b0884ec568f5d8517cd01cade1e903f784c6e78869bce9e2093253f6407452ec3ecd9657efd68191d648124c2392f0597022c91ff866a946a2a1fe2cf37d61b99ec177a85efc6cda315b1b3050bd70186123a8d1695e5d927ac39733d84024910da51c09a72aaf082471980db826fa885d6aafad98aa269a65cab6b0b2f992940c0fc6fc1fb6ba1e1d79ca2bb15c0580bff044d6076722dcf7f8cf5fba79411e6319ac2686fa8d19298074af70b8bf8a241076ce88b093cdc27699b66127a3031be25b6d82f0543a5006033d02d5678a3870635f651351448ad649e90092cbbca12fa80262b42a9c2903454e30d56a1aa586d20f2494347a5738cbb5aecca0d6b226a7be8a595337738b70ffbf523f47c815732b0c02682e417c3bd3f3d5984cc04daee30c98b5d497234c12f598c79040054874b3ea8e01d91b50080a498c2025cb49d590dd207a6ccc7fe26321814095f28518458d7016925b4b39413882ea1fb1b2580e58fa7e69bd549e1b0a1648440ede71cca2d68f0fba44283f498c3c5acbbd885a187888050677f87728a62493270134ee7ab158ea1da10e82f243908e25e8908885a2746b8e448d3a02c9c3d0026f36780c81cf052efd83b1c9ffff815fad11688a308ce38e52c632eb9e4cb59c26e22e8a01d8cba3148c1f7af3ba17597cd95a3c9b78865fdff3ad553d340782be52f929d83f6f4d6044ae82731e51ddc9ef43bab1e4ae9a22bdae4e98c7bd3de47efaf2dfb54719408e404da99e5c834b5f3b8183fa553fefccb5f2bfaca3a4e5338a7810b4fc1d0f97a13403c7599a607bc7bd121beb627c83fd37283487df756ea7d38b8db9fe57ba7f9ebcc6cab3ecc7d70127a0f0e80a111b4309ee7a6118085cd548e8b797bfe2c4570a9ebdbfc2c44cc8852f45d3f7a7e6778b553f42a24c6c299b5fd959a111cb9c97b73c23a13dd7e22b980c645e40cdbe23d0ed56dbc18b95d03ae0e698162182c9f6ba881a4849681c3ada9fb6c906e7eecfa39e3d43780852e42121622f84235255fb3f7db690db4c3d1fb8d86e8b8c4eed38e05864fac37d926c0a29c4aaee6f316e37bdedaf8eb1fd3d957b9d0a24197a3539bc9bc76bb314bcff9e84db94bfded0c195e28254e6042e6a563e8bd12793134a919d48d012fce325c9ba590aaef758e70bd43757a60dc65a6a9138987008bc14718be687ba42bdb10654a00bc4a644f65e00a61238e892a70ee5d56d89b1345789a6f7e5000c82e5f9763385e62e1cb0864e1a2e89a7be3073adf92c4e8854a1b336c8c5414a768f3ab4a9eba29eeaefc1f221ef954297e597ba3615d3e3792a332ac892a0899fb259039fba984484cd435c1d8bb01d4bd3e63581dc277440eb28be7f1966315312ed1500e9b07a39ba5e6ad63ffc146f1fcda7aecb8645d2a29a7a4128243041bc1bef1618de2f9746160f47c28f6852e466e2558ec0f27607e9ace220347b6ee85d443c8865c1c782c88f2cee8556f6d37b7a1de249d3a3c52ad60b4c7fc83fb3124a6c7da2a1ecc2e9a1f0a17a5568287e0404c60c9b108cb381325606fc88043352579b5e3c11e84478e8ee72d9cd989e4ff6e3aa1234f7d01b6cdc03fc7c7e1ce17bee16878301c8d2de0f64de9bedddfa953e85570aabc00df6c5e8844c4ae92b82b2001c16a60d582f960e73514e19a1d7d97fb1cc82ebeb0acac2c1960c8144a571076c28caaed6cbf89f803a96254ee3588fb6c5169025046de87a04460be98b2f22da176a460464229239549091ff904654dac96fee466eccb16247b4bf75b0e4fd1feac1a67548d055705e75f82921562f76c5d3fe9823c76702c33a8b0dde91b4e9de9541882b6dccb1d4bc1fc8bca7d7bbf5e930f94caca5a7d455be1ff3a05b3d3b61d6c5736b9ee8451623d443bf977f558f425bd6b9ffd58cabef15e5f6e491df483d4e1fa493d5415ddfe79e1de7b0a0030038ce77a30822d93ff8605625319f6d363f81d237836a2ea2eef526c53c92d7a43100f0184195fe42e0636c0d9e7dcba9f69d905094cf23510a63003a30d874f7aa670566d89ecfadfd4622987d5e4ba5223828cbb662ec7c2fbc881f427c354261d028688879378dd18a404fd82784e63b983968f3a8af2d76ac10c66f8c8cf336bcb4292ae1bcf565d0ac5760f324bf0a78084515c034b32c8d71fa53f670d0cd479c43f16aabce9febb19edab9b60eed8de41cd5989a2ffbb5bbf1e32936f805e0e3845abeadb68c05ab6b8205c860b73f76572c45da3cccf247d89249ba60d3c72cde0ab3ff9ee1b025b3948adbc6e02179905eb6365be80ee3954ef3a69bdebee464ad0f1a49584dbc88c496ce703b18436259bee9eeba3596a13ffbdc222103788ab1d322749016a8879f4840f52841f018f87f09efa5dcecd0e34932d73fb92ba4b9580261d82c63eca0c56b0f1a6d25d01b70f661fc0f7d7ddc84f14d0addddb46d8cda3aaf5c2a47152135280cdc9bc45dcaccd52714e209f848bf84d1a43c37b8fdf9f834334f65e4ffd1f6f18bd3a0479d008bd179c9ef18c8baca0a2dd1e4d79d85858304dd3b61aa7d5a69b3910780cb355f8d01f33e13f4335a95a21a6729857bf1b2397d9e2ad270739354cf8c06a3137d6fb74b872ec25ed45534881cd5818e044ebf5b540210913abd90a0b29c28b69d1856f01e01eaea889ac3f67e058ea8d83d5395e3ca98a89da33eec58ef9ae016956c3c913a647632e87bc54810966d85442c0050325cc681b9122a2fc5b842860491fec9eb277a0dd3ad7958d2ecf91bca76bc0374bea8a1caef412040258e846f2ae86aae6edf2c96c7f6df29b9bbf1fe39249cc791304b4b8a886adcf68af96bf853c6df5a1c3d48289ea36041113896880178dcfaf39f10422de08a79af3272a95621dbe26231e5e5e9101d632291231d127fcc4481f6238640038bd525ba5dc0e18b57661569bee11712711cd0bc4a70394f55207e7464c7caad5888e680baffcb2810c7d1e95314e322b2dea7e024132565c788b293162ed4b586cf327b7c1f3684161d21186f0e3b87f160517884e9f2c9340a8f485ffef92129024c15cfc82226102e74560bd567fe2559b679526acf95f6b8a75a0601b81a91dc6382f59f912bb40211609d5d8cc201b177e7695dd2a8b5bc5fa7c19cd92c024107dce6a004d031f217d68d86fe4685c850abc2fd0f34a6b6bcc654317b0b125be78b863494ddbf6519b245f927a4673869f7213c1458717c6fda6b884862e74b6523de7af15634197513fa2b4706da848ab6bf8280de1fcf7dca7d7b127075bea38de190a33d7812ad6bb09f05dd500f75fa9a1d3eb76a31262f690d359d82e437d4b752c4c904872144c847f0c7cec02ceef18bbcffea4f7b79a966c6b566bd0d5278d48ba69a2e8e286422d8df8647a78755e743e06bbc19cec962033237b3134de52fbdb470be8c6f2de7fbcb0619fd679b4cffd9c6f830bf0f2fbe19fbedf0d8f9ce85187fe26d90b3af33de3c6b7d269c1a6b474088596834cedd819c29566442d925481809a5c6b4177062179634d4c22ae52cf659f28ce0b52d79ead2b242e74c2d7e4e30ed7839639a4222cd41b90e166592ca0659449e6a6634cdd459b24487757dd2c21c77f6df3ec3bf3ec2e2d387b0f9f7115e3e834e4b58fb3143e564a689acb3926e42062ad3d4a4e6b0a455dd81427059aeb8977ce9f16e3f1b51cca924d96924abacd385d081cc1435d724ac695957a0094ad3d1b2ab3ee3d0bace40117453a2998db18a357bca834bb394230b9b63192b760725a0399956ba348d452cd889640fe592d9a7794a91810db18c25bb831c109c4c539ac94ad6e92454a033859a6b0c2b5ad725d004d954b4540293ccf7109555739550b61be7fe4f4eba0919a84c53939ac3925675070a4137194d6c8e9558b333a880e69434a791acb24e17424750e3bc1aae00be0f86ccf0699a5264b349ac63c9ba5aa0074dcd764f39ded9f7248184fbc73575917b750977d619b7d44d6eaa8722a0a8ad3148bbdcdf5cafebdcab4bb8b3ceb8a56e7253dde1ca2a742c21ee650c6ecc1c6e9299b89629b83393887f64ade69b7fd83bc9e214912771c7ffc63f1eafe0086b5bc28f082e5ec50dff10d7e8bc8fdbfd092eb178074f585b126e05b0b615f7fe437ca3f33aeefb27e147a3e5a5f873c6c4fbb8ed5ff089897770cb7fe10743dee166c6ecd51490eddb390e4ace73c4fc1f6b8b8cf9827d49277cf18a93cdd959fde0010f925ded112bd606cf3044294d4948489649e5bb3486bd5ab11fa6877828302ed88ef0f3ea1012a9c89bf504ec3ac41e20554768931d9f4d430457f5ee328c897c4a044650281a3c60d1a0effd447f59460569a605c6fde96aa58ba462391e6281c55872fa8c1e5ea89deb10c3b21e8a41a09d52a1cb95c9bbc2b30fef0a0cde320669cee13566186bed2ec1385ac7208d6cdfebe27d0fee09dfa9e73bd6594a84a343f41b6369736d6285a7da9cb5c97bd1a77b56ddfeea0293658c6a7ab8a822d0d928237b5376fcb37fbec6101e2be50f2ce0dc4e9a390a62ec6793e8a3ddb5a52f6a04e5a24611d3526c86af495d23553a16564e4c47e0896825eff448b00616d7d47323d4cd928b92ca942754a2e3fa3e0025dc855e2cf29b51aba72f549d44c1f737bb9c2c5594a073c1673a9dc41777b3bea2e5b7e01f8cffc4dc2344dd65b5ee655a95a741f750c53c74b722e582528b03d3637f78f320a84c0eea6dfabc1b095776570d3546aa9f695138ee05aaac3ef8427320ea2d225e279fd407b68ba4e017de3b4957a877b1080c2f051a1c6ba5551048cb481dc419bc348900023f1a70d2ce4fdf84b8eb9df6510e60c22b079c4043120119812f49dc52926d915c2b2169114b646ed29e0609211eccead0076a416c002b2fa01770a7fa0615ac3aaa63748516f17f0adb09130a980a3838aeca18bc5dd77954a53e9a51be0a3df0aebace697fbfda8fe68b65ccbacddefdcf601da65de797beb5423e9a2f5d12d2757eed2c530fbcf9ffcc5b2bd4986cf0458d243576d4f8d11da57ddc9ae961c6872e70edd264ac65ecb3df0c2b8d308d6fbcb75b9155cc26b355893443a58b31a7f3a75599fb99e50db65579976c55da23a4afb6a85a6aab12098d1b62d2194d74b7b3a60b86c12a366798babdd9ea9756b42a9192eec3eeed06fbf0bdddcca042c50c0194e18332c69421a68c31baa3cfac4b57e1f06dfed9ec3ebf024ae424d10f61cf6bcd6a7f6cd17b20d2acf6a7525b43a544d622fdb5b224a5f740a42246943c8c2fd1bf50cefdbf507873ad94087bb652229c2dcad67befa3f7655f53de2532fb2db942352c3dfae3ca9268a88665139c9344951261fc9277c9d1e37fa1cfe10fbd4747f86d32fac2e13b9917dba39cfba29cfba2f09de0fc4993626c33d89add274a193fce0edd3fb22f2cef926cbd24fc7368ca6f72add03c4ac2e13bc9b92fc24119cb218cbf7e964393063d96b5a30c1acdbfd1bf59223bab2e9b4c5e5aa593ca3e4868565d299b31a234be343dc2bcd336627889a1274615e3bb6f6ee8cdf5fde6c669955aa14fe9055e3aea2cc16c86e52c4d01d304992e3bc4a0bd048004448aa040aed140fb73fbecca9f245bf993e623e54fba7d76c5f09dc4f06dd70a11a28ab7cfb7cfaed8c2dfbf13bf471eebf44be7579cc5940747acb2455569be4d6687f287def7dd3ebb3c9974abfc921e83eefaa4ee3d5ca64386b8cfac0bc98f85e0a77456892b4539ee1ebcb9f3786d4c4d95272b8d6294b31c83f2e806e247aad62659fb82b1f0537ce34cdaa4200d13001105036cd077809d04e80691d66b2608d513021d700446741b33ad0292259e4075d37ce145172a480117345b74d3a0a09b468b6e9a2c684e1047b5b30faa61d9048661f6fe1518be478ac49c556cce07fae8eba32fdc17b93efa8a2f843ffa8a1fcd9686b3f3a3af88ef7f1fcdbef4b42693f53f2b3f5ca9a4b53cca2c27bef199f7387bb1f7bf5dcad670ae4275f39344f8a32fffe86b562a44530023badba34cb24799cc479af4e768d21f2c148045cda4b14963b02b76982efa933dca247b9489962068a2e0497f729228d664927a3497feb119efe370a6b59fb53cdad9ec2988f112ae56a852a248672beb37f9615b338dc63e866996f28abd334cbdb791c6eced66675428769dad46422e2197f8c8eb0fe524518cb7af9428563b9b579542799486278d75391daed6c3980a7761ecda8c3f0fbdc7577ed867f6976492c7db673af384132350a17193fe5cfae596645bf4f466d86799edfdb2bdfdf43cfbc13e10663328619e857d36cb608fedfd037cf46fb5b7cf343f9616e67d1f8865f47eb0fc2118bb59fc38f9d10cfb8bfb0afb68fe6886658fd29e1863bee7655b675eb0712237be11e360ef8fc49cd50d4bdc8a0600432278234b1a5d9233b11fb8af3d941450a7a8544a7c94782a37292acf7e88c5ba4679f643eeee754a023c3729cc0727c0a287133a28f199bdd7c3014a7a9c086c7ad64b05783c691f61643c651713f9f06841135dfaa7ad364de41e22a0e32b25f169f38148691b1080b9e1e5026a1db580bcc7739336089e0d088874cb1b0e1675b4f083046614e008160d267cd122c7e647005f0837365b70c084b0e504590a5bba1b8709299070d1dd3925a460730c2055595c701b264ac0305aa5b78ba6b100cd966e1a22ba692ad0365e9eb0f1d28566886e1a217ed050a0bb939e38f9e40df67f73ec9344fff7f533dfc6cb0f9a0948404b10516880c8d29386668a8d07c8687ce377cbc9dbcdc603583acaa4cc03f3fe9267f1916e1b0ff858628d25ccb0b7bf36cb2a78b3ab70ae7f731a5fc2a73d4fcaf08d5dc2609b2e46d41061d3c547171edd3518982140960b588002361d38e24193a569f5d2257abf9f1fbe6dca58b6d5d2283163eae59957ad27417bffcaaadafa184bcf28ff0d53fe244182eeeed136493c914406922022891cba553e74f4721f7af272157695d2276f3e7fda6e9a1fba697ce8a6e981c70e56a620510211708056e5e5d1f11586f114a1cd87cdef217600432e3cd02aad34276f2e7f89cef8e89623061b24b2c81fd84356c59cd4d0028d378de7d96c4cba6964d348a16e9a8ea6a3194233e48e3b66ea98a923d2c0984b4bf3a4774b867e5a4d805a4b908a94b098a167ae68a1674a3053848117bef131b06383012246f4002f790a158d80626344ca8801747b9e04a2c99beb3d2a976455f23c095495b22dc22e4f0281718110ba3d49b34f4fb3c0025eb28d05ac74871ead66d95f1a14e463b3050536450c4002a12e79fe937830c5f773efb323f452eab1d9d2753b2be64be6d36832f648f7eb7ea8f32ca15099ff4ecf7e2aec2e7894e577954e11558e8e5feb39ee954a8cd155465c55c4553a523ac73b478a449dd0cbe5e4142982e9928d5d70becce7774790384dc63c2f85ca4f63b1304dfeac1ccb661da6c9d80a77f73fef6bb6ae4be938919cbcc5146c885341b912254e45c789b84d4a8755f865f4e6bfd9a7b9ccb79b95fd7579b514c85df06871b95a8bc32ae5833c5d94165152e7337bffa3defdafca5c65be5f6e89bbe091266319fcfad96796055bd1db6398df57cda75e71a6f826674c93d42b8d5641b779ba3068e9954b8f1dc3e2cc7b8fca8c3b9afce96832469331a79e57fad3d616ce49222966b2348bf58a81b8a6052e4d0071c40608158008a1fb87357e28e3872b9c855fe52c95b3f04c1126f460b32442f704faa186279512c5ae739bbd028e8b704e12e516ce0ee57e5617bec92b8f28ac064c0f45b8c70e363c84a184fba2595d93c6aa92cd606bd29f1a356c32571750c436991dca49a218b1e3ccfa5f52fce8ebfe0cf2585f56a98dde9c52c96b515e2d0dfa4993622871d7ca68fede869dfefc5969cc257e3a6325ced4c7424984729f955f9f954b998a27e6d743cfe3a4313086278da9306ad298e39b9c7bdcf288dd7966754c3df0b63c1e4df993946d912d9af68856e9a43fd916dd97df24dba21e3c39393aee13c3ed630a9a7b1f533cadbee7c99aac7da030df8af3dc3e671eac4489cfacebc4af16e623063ea414c9968c295048531540492fbb5628683e4ed65ef36ff25ff3ff8218bb80b0007145cfc66e21bec91a715f73046de8367b9c2fa34b5caa0a72f9b5b90b65337b7f26a3332afb0f4fcfd6bc3ace0e29d5bf62af90bd7f004ab4642f0dc2b6a85ef0677aa085a204ca0844402a105298a94112e166670e9b8f88951e423e5cf727bfc62ac015dc2cf2c4be9ea8c8128bb50a4960135e0943c77110c98300c346038a40e3072c68f01044b541b865279834e90493725fe494e86e3bc1242c617682303b416c27886d722f2cdd17d809da092675c4b15902c35953fed03c66a15736d9d780b08cfd9d5958aef6ce6095c232f8d1d8a4b10a56f0b35d9a15fcfc6110c39e36c12a39992bbdd50bc696a82761dfbf0d276b19276b394676565d33a3991146ba5608e36ae9fd59959e26f1cce893447866942b7efc1403fd3dc232cba099d1acd449f8836b5836c1ffa13cb2b1d6edd259b541322664ab980bbafb15b127976e577aad385f56d0339551efcb2df1886f3878cabf1ff83689cb5582367806eddfe82be2c7587e61ac52da0eb1cbc91b8bd5e1ce67f3bd866593297f3c0f149af2c706d9972daa4a3c623550f090000f20a850d12828b589ca2b7cdb6781800089b406fa570b622c73ef3b3a0e8379cc347604c9ec2f52473149c1d2f8c6088038df558332e078d5ba4d37a0d1dd9efde48dc562b16ef0a1bbc3b7b13e4b0f577973f7096e40e1da283ef8f4ec105170ba6f368946abfc759e1c0cd66082e2a5bb3114af4d5088f4943f4d4f74e81e8a0003e2928d659ccfa7343dd8bca691297de9e6a1bb7fd4ecd0d77e4a44aaa5d8a3b61b58270cf6d59a5e4768495ce01b33786b05212347072963420729734337120bdd311060862071e4749038987490388ae8207184d141e2f0410721a342072103d441c8c43a0899b08390e1d241c8c0e0841d4e50e60520657c20c34577f78905091c7577cfac208709a94b371bdd3c4052f57c7af38f0d5658ca03e887470f8f1d1e383c5ae0d1c3061e4348613ad28126073caa697c230e903146471adfd83e42cf65cd50778d931a665e5034c50d13d11bbdfa51d3240662d8877fe65f7bef1213518d690807d350adbbdb5947aaeebd9965ac1e7a354c3f21b92664e66bf8a1060538eb6f569641eb2a9f954aba8469f78c0b78504dbc709171d5c01586fdfbb96a7ecfa4a08689104f7525b9869ce50ad2a48d2667b8ca95a8f09b9a2ca0490e98fafd0f66330ccbfbb6080826466c214573400b031020f4c5fd25a3d09b42551a87358a889f1e59729b91c85064f57364c97d566e6429dab01cf258adcf8f859eb13caa2e5bf4483533f0aed29323a69878a2e8eec7e050d1ec322c18acc8c89584b4e4098cb56488204c3c4033409a0ed30c3998173cfa015b70b48ed841d2d5b06cd2b9aa4a243afe8519e59df4bafa1bcd4f73339b42c5ffc20cebaecd3229d4d1e80cacbdbceb7c663d3a69d30c5cba632a7c1bcac39cbca96cf689abd2ac4a33ef936c110c06833d71721f6662195d0a7ef56f13c66306043128306104129c2146890148e8ee26a10914ec8c5087aaf66303b2813811471620345657c1e5fc280304c48d12ccd8c93b2fdb4ece4e096d4aa2834e12268915d9da0bbbb71b976e8cdf839992f81026c9dda624af243da624deddb0ff599210baedac5258994ea3c3f49b9064e179d24b7723d9d2f829121dbcee4672d4b09acc7e4876ba1b89b70c74846f83c9904577c3bc744faaa5730d93618a0c418d6132a01acb4042f791326d3a32e648982360ba1b049a235b1a85361df1da6d9ef2a77b660440aebdd787139311312623b51e130c5a4c4654353324311999b2d35d93a4bb064977cd901a196a33b12504a2bbe6484e4ebebf54adecfb3a10ae9874dec03762d8fd0f859a15e8fc2fe4e972f2f682f7782a276f2fe0584179f4658ee356ba2f3362ac718236e56409ab94535a2ff43c82d276d718e9ae2952b30202681c60abcd1a0659acf91567f4d3167552d65da3d35d9353b3020d269c283d2606b18c68648a44daffb332ec1566938f930f85860634ab15cc8c11868a0a26a0d04256c159a6339f71c244a4892e6284fa1a3338009165a6015f835313bbbbeb98d4c033dffb98f45a33249850748861425d81da407763eaff85d883504add5d429b502d136ac7934b30130a05d3cd0f6ec62ce9ae5975d7a84c37b91a22606682689a134c336e74175d9051230210244c3144c9d7621a23189248a1ba6b8644dbb5b3b6810986ee5ead5635a91d7f9cab5ae1948f849348dd3528a1992a6880e8aeb999b688c55a329b19d51f2c6b4add9dff8ec3e057de7cfe632c7576925c480db1751454d44262626ac1089bc9c3e8d6c00c2a7423a04d0ed44d5cb7cfaef7645509bb8432b64df21d3c985800405b9af464ba323d2a6a12667a41138da9b1a4cdb4615ac1d5b44a6158d2ee2f59cfb348b95ef08756a9490535babb67f4e8a9a4d1bfbfa4bae04fbc602c85fa2b3f7c14b1ff1205f151b4c9646c7efebee5319625cecfb628d779a3fe5ece8f3178c516cdb7d9a5478a8149f395804ca09da5d32a55455a7c57e56e3949e431e7bf791ae1b8acc7209757e93d8d4fef7fab188823c6a0f739ad3732398b81385219c5f247ca6287531e9555d0ca3c59cb56455b1eebcdcce538532131100bf186c082863b31b299e66c8b5ec816853619cd493130e85a21a4a934b11dca180c9a8fb3b32e71e52451adff592d8a14799c55aa92bcae73f993e2ce31add2d9cc76dd0d0a70f7f1e9915906b9ca553e3d3d375a4bfa5c89bb7b029cc5727f8f7e372bb3b5eb3ac7995610574b1f29cc7452d00afd25eab5be7f27b44ae50761dba6005c117f263118fbd05501f0e96e619bcc0eb9db6432cb20a41e21f868757748e7675b27fda9c940fba4522793fef43099806820aec29bdd6b62e8ae81a1bb7fd4bcd05de342778d90a7f73e36fd48c3f4434c37f1e79c248aa177a9b4510ff765fb6149636e3d70da5b4d8637e36237a31eca6aff71e7f829feeb441eefcd4c1db9ab1ce5d1654d76c14fc96375cd9f7549c69e87e9129df2e6821936c4d4800e1edd261e6faab181a9264b4fe08c3156b0032d32d0404031470a4c8ce916c8d1ad563830d8473ffaaaff199966b484d79a663ad34c4e77e70fdd3523c2aca09ddd6861f3e7fcd8ed592cd887733636ab343592a96d30750ddd5d73c95af2a62680a97fd8dc5183ee2cbfbf77c880ba03053bcab4b3e67dcb627df8654a76987ae98232d0ae6677a9d2d5ec2e09213da961d94408e9c9acffe5c79e2761303a96ba8215fc8109dd1736a78c81ffb0fc55603110c3e694b1fa3110c33205adc84147cfc7a00b06ebaef1ee1a166a56e8eea0dab291e34877c7db67174c8e0c0bc118f63c09837d36db94a1dddd3d58404607dd99e2ccd01ca9834c945e7a2f16a320ac200e3a6ce2e002840d1c62e048011c5c781873ef32818e0247149b37c6d8bce145775fa11856c359c3d94d33821ace6e9a1674370f1a30fab3d9bede4801cba1ee4ed9b80fbc9ca8b3cad1dbea671247a08bb638d2dd5fa957a91b5984a159018f14ca0d2c1550c2c68d26ce7a18cc0d1368957ef1af6ca34c1b61b8bd6d08c10adf066b0347168bd5060bed4a3c7c1becb3d9bfef41998edf835c0fbebbdb59e13bc9580ed9d7910dcb97cd608b8d31366c4051f36a69fda1f09de424910f8eecbb2b499756ab95151c9c9b95457a85de98cc15276b38e270382124331c41e22c6751e956ce7a59d491c103a5c47469cad5fd259b3d59ff734ffeede6674f36e95c7a3e458e20d1d1c1e97156b543808e907c88bf52e851ea819fe5ac9f69ec7e92a8a893429318fc2bab367cdb12a2169290db5cde689cefd8560cda5a845d46b3bc59f7d9cd6db6f869357c2753fe446c33fea84ccac775df0d8cb9ca2679ccf5b1771fcdb8eb3ae74911711e1fe244fc7f0643b912ff6886793ca98f6694cc93329812cfef05b2e658d65a37a875772833fe25ba74418cbb01aa5b0d31dd1dd5006352234babd175c720d74b8d02d8000536f8bae36ae63db66e031ad22813d3e09246678bd2d8498384ee1abca03b66fc93c57a4d178bf59a140d2bd028020d20344ae8e28c069cd1a4fb263fe31be954761ec6fe2f36430733aa98d113432fa9a8e8f3ecbd32ae28434b370dc6a08107688044031766d0c50c8e98419319b4c860838c1b9021c4adb34a79a3cd64182143003220a33b7615c459cf6bc94028063fe81203a518dcc480070cbec0e00a0ca674c72e7f52b53486de4dd6ce57f1bd4bd5f762fc9bac281fe244fc314b7ae0edda99981b88d932eb1864c6d0c018750c14b410c38a5183182fbc00062ff0d21df14f1cc69818861017d8e18211b800e602a216906941981674a005575ad0d3dd75b250de640dd358579562e881a10318303062981c84f1120601617aba3bce2cadd24a6fb95222167cc10213b0a0b6c3821f2f1bab5bb522be76b602225680c30a4e5f50f1c5952fba2f72ba6705595dbd600c96a5175478a14377ec028e2e9ee822d645933854a0c4ec3a0f63f86bf95a9f5915ac5240c7ac52958214c890821e5c8ce1820a131755b828c0166d6c91832db66c81650b225bc8ce579d12c79dafba148e2b8f187f55e2b2ce572ce944fc73222e9335cf37e9995679f31bce411b82b3cffb9acb0367df85f86bd9ad2c625a05673eb3d251d04201102da2d0226b21d3c294451d597c208b2759d49c004c77c7d0fb259cc398bd559c8dff379bbf0fcf5c33eb5dbe16e75d8797c47ce5b7ba3f3b410a587081851558502c6cae40e38a1eae306245195680b1225b81002b7e7477e4e1f9190dbd5ca3516f5639b35765894c5001135013d06002ef8eddfc2bdf9385b55502232588a18a31aa6041153854714345185460a142670a1a4ce1c4143e4c219b42680aefee88333ff7a95ac6d94b7bcf6619b4c4abc4602dbfac93996669bd18abc39fcc94ba32066f61959daf705f3b5fddce579dd792628a9b36492184149f143048f123768f71dff92a1a01918008cc1d603e00468299218a39a24041146114a88eab0378c6f6f318fcef91f3ac32b647cec23f2d51f6308d753ff826bcd91bfbf953fe6cfd60896716090a16406105144140f103858f66c58ece269db4f3afe5fc18cb59c10bce1cd3a0fb572abd557a9b128669e8d303c3f46fb2ee80d893372afbe9c957adef7da55e75cd87fd05bf6b9f10d3fd04982770e82cc312f704932748e858cbb8af2d27c2b49ce812e67c4ee951aec526277e447c932b6d89c0daacf23c1164114127829d10a4417b8f2ed12b65f83d09e4c362bd90e8809e040a4100be60f1654b47fcc5a6892f9ac02156fb8519d6ddafb6891540c00508bc74c77ac1f94ca0c104154cd4989031410213ed65092f4a5e927c208d0f68f9c0079078604cab5498e68f41f198315805b4a177f706b4a12b794c752c5606bbbf494c5561eebdd92f61fbb5fb3356c37f672ebde2e497e481214b9cb1c40596b86189205dbce8027639d279f2afdb7a1fcb9faef3997d7545d1debff2d11aae76fe2cfe0533385bc90e88a0036007541c0883035dbafb63b055942914be3435511c686103606c4089fe9f3ea361ac2a2951a6af28d17a43031dd000150d0809230908242193084006ecc88017549b32a083acfd05bfdb79540ae5bef355adf3d52ba793208dc66e12d3e9f3bddbf92ae20b7e5d18f358e990213163ebd9d69021ce6252e42a426a418917fce487b9c4c1e5082e52b81c718981cb09486cd11d59ab18e66432f749ceea609dafa2c73a8a298cc2b1eb280da5f7352c6b9efc6b67d585c40e1226f4116558dd1161aad1115f3e893b02cb6c1d71a46593ca28988401336618d0a11d031d064830c2099311b9eeba6b8196c4dc1bb113bb9fbf7cc2b7791e8ddd3f9a5616be932348409f77d223fb271790e2025cbabb94ce055edf4dae7fabf6d2a5d8ed316ec51e8a05e6b0c0062cd000a13659a0c723b6b30815148183a9889dee8ea197a3e1db6220063d0f193264487c1bdeb2c496275b86b6f46c4161cb08dd6d439b88a882082b2622a274f4bc1bde0cc6727d1abb1410caa873d94f2bd3f1554cfd12c595c5b214f6e10ee55d2a49c7575d95b2cebba4eea795012539110742194d2b23e2c7ac550133ba3b7a1e755281fc49157040a6b7bf6f93444b7c5e8f65edc3f8de252cd62b8336acc13e9a8730a3bb7b882fdd1d6d6b88af3b0e41430f4142377e1a0dc42d21c07816220bceaca09d499c10b58f662148c0996fa280151d3f9a294081ee6e1f97ab6a58d62630c50488304de0278044026848c0879b1b9f59a44abbae8bf597b494400b125a685a9e680940104f04d10501640a0208103e00c20820baee9066b686e4eeac95cf6c87e4441ce9a379fe95ade21092d26a6725f45272e93c1fcd3e5d75edcc57b1be4d667c63abf3e0befadf2c931f3cf003961f8e7ca0c387287ce0a28afe61eb01f52066043d2ca0075b0f4d786883071af000040f3c3cf0d8e14b775d90afdcbb944e902ba6ba6c6b18fb68065d915669b7fa68f66b69961964b9c294e5872c48225046048488404f0472202006021a80c01104801ea0830708f180dc035ed0a14c77f833bd506241beeab08a85a77ca45890af62a7b37a75917a38d3eea3af2af35c255375afce67b6eb522f9451e7acd057b2ced67095f6368a3ffad12057d77d20ad6159eb7c15f363ef64a5511ca40314930e26981c40c6015238408b036c1dbb178bf5ea3c097aec5e9d7bec96c48c1fc4b8c562bd3a49143f9a5755d6b06ce283fa68f6ac8df9e0994f0f6c7ab6015da84c9132c5a3cdda56038e7832c5612a53eedb09622953fc6baf06c4d0dd3e2c960fcdb1f4574f4fcefe789e9455068460c262069621b034e978bd550c6dfe5aced622e9b46901255840071640846901411d73727254393a4ec493b2cea1f82aa6507eb3b7eb72c0410e3030e570450e52e4f0c59483027208731082d3e32efc04f957235f455fc5940ecac8573e3dee4284c1c2b7d909a63adcd70ee5b996c1d674bd600ad0a2805a6d29c08454f6280de513871e74475c0b073034f6c2414b96d3438943cd16e1e009a0a39b4902b848008d558ab39e5b9b31f5982901347cb5a62b7774479f57cfcca88811f04a92e98a90e98a4d38453833852818e47ac8f5e44ce88ea99cbca1a848c12b9a8b5da7137f62597339fe3ac7d9a3b43a3df4268df14c1aabd4840b010e02381bae8437565de7333be94a4ed312104b499608005e017a31af62f628cd56e9ade1eca53da67e671ec154764186c274f304bace57b1abf4365b5d5ccdacdb1a8e564bf3f568ae14b472ff684c0b6fe9ee9609d3206bcb8483442aafcdb92ff2f161b15e3d336b7b72f6a767d6b258af6b80394c564670adcc4c565c307d68983e2e114b5a938138d5a13c530fbd6ae3f43c8aa357be4f2bb321a6379c307f55be124cd60a4b3bcada376d2dff4d16258dcebaae5aff9877e473bf47f64f303662b1eeb5f72e995557c6f6a392536452296224f7b39aea923beea0a9b2a68a88dfb5428d89c796377c10be0dd642cd1d4a4b92d400d15df3c38f0661e8dafbd3d6f8d05dd3c30e5e6c65ba25ee8b90b051f1c4649bb1d5335376305549e3892a5d5a70531559054a15a52a475568f09945b9a9ca0f13f582461163a62dd8ea59fbd5d430d558505b8195dfb54238578a69f227633a24677d5a6b6684636052f8d1179e19e17fa1fa776674ff0393aafcae15c26096d70ad95975cd02b10afacc118fe9e98158e2686de12fddd486bb8c2f99abc4fd3aaa4229e912c694ca149594291e5b7707532ff2fbc38a98eef82d2b56b0745bc9e9c6d40a09dd31ffed6693be32f10b135ddf97eef881b64c77fc9bc5368b68bb3e591ababbadc7a46a46fd124ff5ab4e6e6522a6556a8b3730b1bb69e9be4589d35d372f4c4789ab96b63c2f318fc86687ad4b77bc56565b29980a63d6b6d45502cdfe7e458c803e3e3e9e47633e3d30d80dacf4a32fd4d0a8fd5073d57e9c685bd0be8ef16fde7558ba2a762c56a5d403679947e2c752f68a5e77adc7229176518765eb32066747713c6fa6c40cca2c8607e3c33732679065c6a60859c812203b8a5385bdcffee73659c436c7f94b3c761e3f36b33e640828cbc9592d0c56e9adf321d1b152ec8cd817f914c786ba5b4e40da709249240c9d19dd0aba06743bf16b39e71a8de29ae4a924949187d54eb759e2d0c3f8c30a23a33baa42ef334c0758d7ed081083001f2a6c5031e244c501548ca880709a42c51423a604650c4ec7d2f3d31e3683c1baff507edfa11c5bdc4fd0dfdacb5791a8eb62a68ee3ccfa077a0dfbeb24650a293e48497280340e20e60058ba63175699aa602765561b4351e966b5b14e8ad2077673b66e98e30631372871bac1deb0a372168eaba1d410ca08e9069b28248852eb686b38e950ea800206142f1eb5b9cd2ea3352cbd2416eb0514fd890e9ec8e0c9104f983c01a234859255a2e1c5c6ab03afdaeb3f2976b453d54fcd28956a531dea97ecad73cf935ffd512c963c253520099624c209490d24213a7bb6aac0d47cd9b5286fb9bc6fc318365c4002363cc08604d87073b281c7f48c705fa472564a07657474e5c87674c4480d232e464418796d8b7c151fcb5c88a1f799568afb7a8b70d10aa7a21188a42092111960684888a125a7a11f273f383961c3c91627312721505183d7ddf1710d37a337cfb6e2fb9fe36a7f2af5d5575bc39e9337efbce54358d7c80e61e5bfe1cef3680dbfadf2ab0d61d662f9d5d0f1da2c9333294b723dd11d5d374dd4e86e277d6a72812651dcfef82aa670b514e52f17916b88c56a6599cc52962a42659abb89f86d762d9838c164034c8c60626322c4440421129c847c6867392b7c9b1773b5d22848bbf26775f92aa630c558a23cf452ab47422d096249cf92108272109446d0114114089205bd10040290088066402afc74f19325623b31c5adee7ff26b47ee3185f2bfd253b44a510e942a4219396bbaaf52a8228c3262dde8cb5771465d55a58ca7d6c9fbdd953815be56deff501efd985a55b47e68b14e34a841030db918daecf8bb1139cbd62b71ab866596f7bd9f451a086080384e06f0a2bb23954e26c56c2dd24feaf2a1f2be8f8f8f0fae96e2f91f88e55d5229cc47f64f7c70765298cfbc4aca9c947451f275b712a39e32dded3d61bae74bf76cf57c7dffb6ea53cf4e0f093c5cdc2ccf96ce8fa94cc9c99b94293c94a784ee8ee04d4d965bac2d5897d259a507b91cdfbc268db1765077b6582674f70c635a3370d19156e90c5c66f8669801b553a63b565a74dad9d9a911edd0b0e3dd3149991693248916ac94e48bf3948486a64bd5d6561215e2949f93b78f666cbf8be408121264104386214e3230408624477870440547b074a78c3e85a967bb1667248d93112f46964e466a30c2a373f29693b7979111124ca7969344119f8ad08a149d8ac4a0b3860e17295fcd54ad3772aa38e53020474999138e08706e3845701cbf07ded96a76dfca5ac6740ac524e203a2778a1f495849715a6d49e95cd00ae1292deef5d57ab5b39bf29b74b56c631e58eb4995864a081592eae644040d22491099272241447a9c8684b1be9ad56dc67578d29faec3f6fb4963d77a0e7f2ebd4306302675c40e29a0532ac829d5a82650b7136aa85340734a2020a0506256f7f91483173160200629a7184e80410630100183100c51062f2c717a819e5e18800b57b8705d4841081742721d23b61983acbf85a00d6bb8d847f387b3074e6ab3ad97d230665b48727239dc8c938fe15abc8a13b90a2cb880852a58c8e1c402664185130b21ac208315905881ae50e4a44299930a635410e2a482014e2af038a510c529052c93c67c858d7c15696c0524023911ff4101d9225fbd8a948c806041ae1f589416d18ce2e0dc6f347f96651464f44279ea076584fb4a8432024afda08cdcf3242b0534692b56c1ce278d5589420e28c8503889713ac18b13ae9c4e507242905301d028c00f0590a7020831010c139030a1869309dda99f1f6cc46d264aa11ca3dc71a655fa9eb5316ff9cabbb04a15add2e92aa992b44a63b5140fa088d3001230801f804e10344e415e700ad24310a5ee1ea14f41989c4a80a3041594a0815309b8127c4e25fc3865713a8de0a4c3c97512c134839309042713ccc46363039b246c8a4e36454e2490712241cb4fac208dfdf8ca5771e20c5a8bcb11488a28d6f26330dbef6b407c15511e4595c293c67eae5d79b77258b514c368d2d2669593c66a93c662fe389aabfedad9941d15c0152701e4208029027861041d9c465062040498fa34c2d0083f4e22e440042544304284a153087474a7a238113f72224e44b39e1371229451ea0865e4310acac8a3e749998ee7c9d4518ac869d6431911a18c5247ae4a619413392b7c2711678ac336e34c6f3e3db3525b085d8a42c062429f42e86208a8b645a7008411becd6f96a8f74e70005800401a27004cd1dd51fa0400d909003e27206b9c8050e004c4e7042484c6ff85299d94a7308892d19b20975f2b3f96547f84a71f379c7ee89c4088e3044218107c388110e50402cac719271f5dba5993fae79dabba99d1745d8bc293c2c2b7b158387c2791669b6387c3b775298c0adf96947b1f47f9b1e7a1ea635b3bf9e858ebd4434c0bf34f3db8749f7ae45ee8538f26ddddaf530f7ae251a61b9f787ce9eea6a0bde1c4034b6ec9fec9a9a6cca9a689534ded54f34204fa19cdf2963fe9447381eeb6a14f34359c66e838cdbc4089cef2874439eb0f8919bcd663759d0f8956362476b74e9f664e38351ba7fec0a96ba7ee4ebdc21d34b8838a076de8aa2cfbfcd3edcb3d8a551f9db922ce14cb1a823f77cc3b64b0238eeeaee0fd3c7365f9df5f3bc0d881a5630ae51fe8f3df8e9d2057cb8e3ac2d4d1a58e1a4e1d293a78e8a8f9c11a3fc8c00ff00f52c8f5e947657f577f319da3ce3134470b73f890e38b1c5de488d2bdaab64a582d0b95b1658a9489a1cc0f3260c848323b644088e38b3872dd9d42a95878e56e957c1559dd6757b63aabc37d6af51705cbd622dd4c2f18bb51ef6b705c01c703e0288203d5ddb9cbfdacd2dfc06f746fbcdee87963006f88e0031df860091fbcdca8c30d319dc28e33e523b98eff04f92a56231df0f619676bebff0ab9c1a5adc56eb11b51badd50a10d32ba636afe12f5da48a20d0474c7d412f550f331283fcf37f5faf8b8aa86650f8ae881941eacc00619dd5fcbcec6b371840767f0c0071eecece08c1d04b183243a2843075a3a666b6f8d783aee2b6c66fcb10ef7b5bee761a69fe57de5e4e4e8d895ecda9f495ca3d1da4b9b5d95a53f6d4a9a7f2d873e3d19d3a1d0a7681665099b486428d2440724748fe99883ae65ca010362a5d6e69bbdb31cece4e0c71a62566b6869adf175afd1e4263fdfd648a12785753878a34b9cbfd461896be1e02885c201ea961913a67b4c97a431b93eeaee380635e6479c4937b0a23baf79a8e413d7fba0756a4600002028931000003020140bc62332b16c3ee9fd14800162b856b05ea1cae33cc821648c21c400000000000000461b004c9b09795e5624098c79f82d8f62a2db4da8cb9481beb753c7d4fbcc0011a86a0442ea728843db6e9ea28405b06369186c3adf84313ee780fc84c70dd954eafb8e16a8e4389d4f1da75f9f31a087b47002345f0c1bbfd168222388e873103723ea63ca1e609a996a569696e0a3f60d3a08c7bed33fe313dbb6cab83436bbd4b8b9952d20984220b5d43340e31c519134d91a32b30f0eb627444280abb4106955136c0a1596c7216f454370f684804fcbee4ac7a7682ffe0d3458cc1405c2943dbd27b3325f10f50d2f5aaea27f2d3b72e4adc5bd847ac9a6dfdc7c27041afe45d39257f942171e1a335331236d26797a7863c63e830af8a3e51cb410fa0ac629fd6f4a50cbcc48f437a1c08bf086cf3f58163f9cb40e3945e635adbc8350628b3b7b34966a4b2e01bf64ec1854e4a8e051e4bfe512fcdcced905a14b317ac6a40f5b2cbc00f80c190bd944b6bb630ba7f03118c8a4273cbd22cc8f9e6087bddb30ebf7a6b6ffc12d590f83dab58de83b9a3782789ca57a4e0fcc97bf2ede6fe54c018879a7dbac20827cd0cd8d97e935d4be20f409bf7581c2daa8bb29a1107bf20d7880db2d0f844e075c715f4eb36a621ebe4123aa00c065e400bfb096963198a776e239c4eb1efe551a5c82b0586a3f708b58a917a50281ed99a5f7e1e5e2939348ff6fafd01272f01f80fb315c175e3f219e0aa4f88ee3094e8e263e282c9b577ecb4e8a2d9d0496310523ed58a01061e5acee370cf5a07ae2c32029e430d5fa0cccd63b5089984902d232b511ff0eaf841fa90869876aab058e62c0870d821609caac5541eabbb8e42da37086971958920080bab497b46cb2b4b68a49260ff7573c5c9d89804227f2851aecad918ffea473d6ccc8985ab2d3797b4b868f9e5d6af03906a6027d77b8d71126b606831de9d2036ef4ddb4d2f4ffb2f3f5b5226bc027741a26d284f4251ada6b49e69f9378b523f9c12ad2b5288de3218940d0866c2fdf16cc6fae6b6c14deb20bab4735188e10b5dd66fba11123e901c016571bc6568980c9d96d06a1d3181a3a6ccff54eb129946118158fd231f2becaa3123e968f6fdf47ba0de7d2268d9c0903346c1cfa6df49ba212a7a520e919f5ba354cdf68a17b40caccfa6e7e030248d47b152b4c69a91594906cfc4e562844088dc11cdc1e242e82275d6da4b42adad609c6b36451a54abf7dcaf966c0c7a723f476e66e78f61e497f9bc700caf7dba1933ad0f604b6da4287284346d1e129fabafdbdd33bbb7a329a50bd8a029ca7472185f82b83e1e5e16d4a754b7fa3b3ce5f9761c0c7563518d204319a113d57f10c8c30d5714727695f60e7b8e66bf57a61b0b7b0f366c1791d5fbf3ee4fff9cb26c000aff73799c37f20ff7f192b7afd4edf03f814d57e358a5c53422421669ca69ce5550840b8475b1044c1d1c204a61b61af3ea82cf487e90bb4684b045599e9afb1bd551b2f6f1571255d2bea727d2cdeb2bc96045e717d3c866a2afe57b57e43f018e35c37a231220d8c2e3b74a2fd2bae8cc5cdf5f295a3ed21bbdb415af746739cd5a5afc47932751450118c85348455d352f8d61138536c4f6eac0829a3d7c85ae1dce77e8477a2180176e6dff21007ec543ba808a8ee9014fcc8953ae3228ded0297b856cb8babf4bccbcc238e5646c06c88061f154331648b9e51a5db10e04805b189393d592bf228a6764f3fc123a1f6bcb6a5c7a0b6aa078491fd3a65b78381de1687be99254ec0937347f9568980e70652b0fef6901549db3442fda73af177c3e07d5a6beee297f16a4fd0f942a58447b84fd2f8c1d8f721c126c6815bc626cb88eb2d44e92f2cb828aeb9b5f82120e6f7c5ac12ca49461ae18b69806e75305cddd443ebc832826b65fcbbc911366466fd5b8621399cadf3f5e59c04d0bb89475b7ef43ff753e0867516c47ccd4881d1921591c9c102a82371eec375745867e51916fa99dc2ef666257c8d665e05d9098a59788388babe2adf32103ec6661d728f40c7aecc52defd20a2a640107d9963c0abfe1497f9ddebf50b0fb74a79d9f683d5b094760ca50883e0b9f6ac473e7b17535ffd1b6f0e1991841f89a8253278c4953d68994ffff131bc4d17f5f3db01e74df94e0bbb7a21b7821b5d8ab51ce288be1a8cb9a6b6943d252bdc6535a151e6693030f5faecccc008e18042b78f14b4b082db325c21f58a5c85e18248ea611059641e32f41414727278122948112a198d05d14091e53d46074dc24c7ff3b3e3ef8246c8067eb55505655ce1ed4c27ba980a17d52fb6f41352802a9bb3c69248706bbc8f96cc7b5fa03c1686a9b24f82ca13a9491cb727baa70f123f5fe141e90cedd2b2e3c112cf6c86699d24c829ab3ccbe3a4d93b891e8bb57e3dab70076e508882aba4b2e0a0235922f89926e5a59bd352b65343e8c3e2682fab57b36cc73b18141ad8d69ac1149820456831eabc3dd96f787b163b4c5c1e7c5c4e4219c14760a74eddce611a3a7be33fd005236b1242c368becff57eaee707e31740bd999bc1afeabf6508294894d57b3eb7aac9f5222ab1b1b314731cbc2b38a914c266d9ac507850da4109eae721ae79ee1b2c222c20306ab08e04d7af322ee1382f3520da815a522ba98b7a3b82eb643363bfbbb2d4492da5980923f37153be92be0074007448856a67883d0044b52c135dd7ec6804f2777ab7eb848773adafab7f2eb8b143ea30cc60c772ed3d6c97f38ac89cecf23fc41b975080550e7b8bcfb0937643968804a77d67a1757e6d004bf122554b31cfae2e3e7afcd5226e5487be980deeb679523c47f5b715ff96c69ec96f56c5cf357b06ba36c2afc30df38c1f57417ec03ed40913d6c490e4cc3f70e21b20913007c888aa63a7b39bd732ca1be9c8482b151b7c2ccd78c1db6c7483d6c10f7bff1dfe091db70b4b1903695e0f56dcbadf44e072d3dd6262732ab6d0f75264f3d6c7e05533f3988b9599cbe3c4638ff120ee6d0859ad23d1295689043680d7892691fd6444ccea62717e8e11849571c493b2dab75e7b62c3cab656430ec5b6bdbc1363b7a5cefa14ce5a4abc73a2ba451b333158e906ce1129bd9bcdd1e5b524a8d35d43c6f44c633564bd7a2ec710cbe008e89f9baaf3cdd27b83306d68ff1f85598f4139212a1daf97a94d0c12b4d0a4fdfffdcb86cb3a4dfdc78911fdf2d661057422739c62781c2d0985d66a70e40df538c2566ad29af2c75c90aab6aa4f1b2244e2bd1ac5f9f17f857f34fa692e8a921e8bd5762c74db758e23555ffcd8c17acb49e3f6fa41d3ed2bc42b8b2711fc59d0f4b787416f30f18b05db9edd3faad4db22f21e400818c6ac4ff389c9acbf67242b0da4652ac9968d101d96e2a158fcfb819c7d6a0a44607448150a16d1b5a7c3d4f53b09f2174d7f1978512d3f7b1bbb8d3d73c28d627108b76cc98403cf6e52374c0b976c54001eb770d821c59586c4c3829a9bdc765c410316401df09282195f8e2cfa066a3bd912201e8423121ce11b38fcd9853d39991269b63d2d0920cbc629603b68639c8175808f3244162b5fbce135e046104264f16a336f290bf9b339e6ea99f0e9176d0c3eeb11635cab78bb81d04db82ccf3ceef2fc97ddefb3b8ea30bcff557f003c8a464687bac1ed9e4d251cdea62dfd71a2151bca4a6bad751afd2e36fb60d4f8f69409acb329b5e58a8418242130bcc76cd4ef2eca071dd23d1c053a50a6594057e1567f4ada5be2ada1f1e206c39f7b7f80402e3da83c594d87ccce9f0fb74a39f900aaf5d8c2db75db186d4a3f6a4394f80193d7139710b50a59bf463d213963afcdb5058605e454f6891ba1d6c6a3e1d1046b47b83537a0c44f3405e81cada1bd7dace161a3ed676abcfc717ce3ea444b70c194899ccc8d3854d2d2f9445f1b2d4b0aa98da0b0c6236c8a88d1e7b0d38222057aa45e223f3927064629209da4cea3e7c5c1478817588b20202c5d1bed513a0af75aab15e24d40c8ade1cc8c066517a460d5c65d137eedfca6f9a86449a200ec12cd4ca441a724e24eed47e21c414093faae6a9c8b6ad50eb7f297d646637a810cf7f92c0d3f2cf7e8a0df0b1aa7bf03aed13bae12fe6a58bf1947ece4c780918b3b7a926125b1610b56ffa57dca835baf1b3f54c82f33aebdb9f1f0c9840c83e52b87304bda75842a3f11007bef835e8c4fa3358910e54d7c1208fc2c750bdad7e36d0bb3d2a8d60a5defedfee6fa28ccf95d430085705e03f890b5b2aa871387b1e1ec19123a6fdb1e0d3c319625fb7829b804d957a0fbb5f7f926de6ac6ba994a8e857e5e8cadc3885a4a0f57d32e040511fc3dbd86a160765cc251aa9188b267a5225cf23b20ab391cf41a126d70b0867016a3122e3f971308aa40eb913be0750d3522f03e6f0642f503202a4706f973392abeb9f161b5da47a2d82eb47ba57f4110ff5fe78366feeec71fc9fb21195d8ff39228cf55f4c0c2fafc778e1ed5e6151ca79d71ef52ae0a87f77015615658d9f4915d35a5f28d2778bf43ced6c6415981bdaae586ad182137c92b1b65ddfc9cc0ca2fcce039fa81e6e5c9adaa7dee49f4996d696204042871355126cf3d6c6cbda28c33d91fc311d9b870b6ebacca7a96d6d9467e0d4b366a03c535c1b76c11418917969af3d5040807b4588f90868a4b018feeaf743cccf0e72001013396fd42102340639c8353a9381b9a2797224dc589ab87e6d184386814651341e8aa616742e8972eb20194156d2c6a0001100648761083c26fd712a3c8e0a9167a70c6b8da4bb00f1b7ec03d352d2a3ef1399cd5cf3e9d24f970f773aab39edd1e9f6f572203d272b2a361977c81856a0291e106a298399c6b6c342f1d661690a3fd7a4bb6d46c180a99ef183c254330c2e1b0398110e7f797ff868dc323c632afd0924f195c86965285315e907e92c7603535db1ef2a7ebbe6b31266df92478a7d9547246af57067757511f6340dc8e2819414add8970566ef7b231e9a860fece979579836775f3f27af5b0a106eed61c579fe37cf4e40fe09e5d1b3b9dc9dd8a344b3baf93b51b6622b4b94309f6710c0fa7a756a2aa4d90102e4cb31b21b89e5a24a8bc4a5b73bec3a56bdfb82101f80263a25b70f83068dd8d1e64cc98e63b3aeeccb78d6c9e3878b62a9c41abda9f32e3164453e971e6acdf7f29f55818e7dc5cf8d5c1a7bdb1896fba395692a30dee4dfdc509a42c658e854c1bdba8dddd1aec59e43b8a2c0a6d0fb8865c98d269cd04b978eefcf844f76d99251a999e2df85daa8352343c13bb49a0d681ea4c513829e8131c939ffa81a34aec3aae07773adadb9660b79ee1f063b8783e5f4a833a405deb1f5a7991f87d0bd131d8f8168600ddbd0058c3eb0017b83c1b05588996f8ca7ce0562878a9a8266d889a03b5cf0f2fb63be78735f9544ab4cec7ac59c16dda5e488b185b62bd528e9e19ffd4a52e5530df56d0f0a407be88f4de93a16986c0ed4e3e6433a8158e71c20d23c0bbfc107c79526e4557e05e681754b0571f8e8a5f7b03bdcad40d29fffbd6ea56a614b41cea3942dd73d6ba7c347ea9471caa6ebf7d7ab348fcb822b808929cf9dad5741f9556a6c73af196d4bf904222325a45a9e906976e93fe647b8d8adf09e5861e510a821b54adc469d9d3eac678229742a0312da848336eb6db59955c445d3f376f6874057af80d7dec8bcd18ccf140fd6b0831148c775656fd9fdea9c539f62adbfb21f3bd978e3926f4e64fdfc806779260b650e6d6cd0a0d534449e428a18620c98e070876f9a3daa5e5c5c8363ef1b6f4bacd049ae85b09707c1a5eccb2b26e5deb424523ca53d307b01855b4b62f416e2513eb84ef45f6a4f2f4d6d03edbbba4b05b8501561907c58cf8b106d6e2ef3b4bc1605a2ab601c36be51116a617b2c2eeed06e44027bc7b1f4cb023e3aa5de92803782256b75c5a0c7e9e30ae6c0812ece56e00b160d1a47562fbfd22db64204ea2657f713ff995cfec26972b056dd41671e17bd693c81feafbad81f73022d5f5e955f13a1de1a6b2f4fc4b975d0b1b21b4a213e4c67850abd75569df51a3c516d11577f2ba23d320b1b2e852469f02d762ef1684d514a8de7c7c7c4068f2475c52d2058964a6fe272491712c254e183cc293667605b9afe4c7151d6b79d3c4eb2f493e2fcb1afe4753e212fea6daf32293597b00035c4a0d08268ed71fb9deb84b5e5dceb2680026cedff5902994a259c44373cf7b15ec29e0893994772278f74280f5068023a0ee7b7b03393f0ef95f6acf13b6f4f3d3543124c867e5ea070a4fd85fdb7ff604b8ed13bc6a747abb9843f55de90478b66a21861d86efae0a8e53d0fb17fa9d055afe7a9e2c8c3f007c874fb6814077fc863f66f4141a48600ff7236b7602666a599ada2d22e6e0a968c803153acc98959906c20e6aab31be32554f4719a89b1a2680d12e9dbec0255699f3ea87214c999ce0c86fb1a23d7dd6d40c225bd449265bf500f6d6a01d7b50883eb7e4d32e0e657b50e39e36e1118274435dbbd6b30ce624509cd7894cb910836478f7fb2a15611ca792178d57f78984459496e97894409337b6fba4fa1d807f21a1d930801ec10608091e3fd4768f5f4b513906c11c750b15e72d4e6c55ecc9f87ce9f4100a29ed52fc29d936356e72a82f24966ea33213db9ed55439f90e7fc720c516a68e6a740d0c08cbc83f5aca4259cba5b2adce4b1fb689ebfab5ac149ca9957a6c801dd93b64fc75b4fa8f9ac3930145710c63f3e78ca0fbffd058d447b941815fc38ae182c1ae539b253bdf1d3b43829bce332157d12743c76e2a30826cb9de44a8415097f876b6822c22d094d35618045444bc515aa0ca28f3f14c24f0fdc1e2d3e0f6d1410f37c88e1057c35d679908e8f50e40c91e350472d468d34590ebd05a11b88587b8da6c8a2be46370a9bef2b2d42cb30e87904b5f6e345d335336bdac3f37781f8abfe29f85b9a4cb8d450a78cdda1be4a18b3f31908f2ce85805a0365dc7677793ab8d68b8c7af6438afbd211ff9109f0d322ed630f462f2f954b63d2408c0b2847113a23af6d434d0e746ff24299f9eeb1647e1fa4da63849f01379673dcec6875d470d284a24f9db9ff890a47b1fe0b55755fa998a6b32b88102dbc84f4c5796e7fd2334b6f15335baced92ff0a4cf253a6676c71983cf893eaabd3e93cfefadf56fa4da19a0bedcc46fc5b479fa7180307071475cc03d73cb686f2de4c9fcfb87d14d1cc2bf4d99fcca7b2a3127d1d0738579b8651cc32e3778afd3c698c10c4c1bf2d64a1e41fd4445b1cd10ad427cfd91d0630578aeab84ab548d00ad4a03d85d04edc9f4e8def432ad47ec3ef7ac9d20a44623a4aa3b87cc3a07b14fb0c07d313d02d1bfc704e01999139813ef1586549aabc0c1f984d3cf7df11b3e19ce06f67e36d4093110303fbf0f4668d8dce7a512ad94bc7f6008c98c3b6c036a0c7cb68d983a3c39a7e0d0d63c8a0ee75c70da24dd1d3484904804ad6e1755c92148c51b8d9e90cb9289cfad2180275a015408d83bc7ce12207bc48a61d1b9519839e081390850d51319855e220c5df296c52f1fdb01e25db2d048866b58de962590ce337cf77f986eac751857f1392a64f79707a3ad42bf6f1186414c7514cc5a5e2394c4ce8ecafa598f4f0740b7e06c982da5f7f6c866e4f12b07db104ff3f264504643826048cf83355b0323765b9330293837056746fa9cfbfc423e7eb7e96d0b784e53679e557bd2e24199f122a1c849de09a72aac58c58a18d1f44e116fa914c129b325f1c2e01cd00a4462d68f2d5765cd794064c37e278b90f351057fc2beec202c946bab29efd3693ca8fc6904c81a8ef85de40e3c3811ac6442ded8051ec73b2c8660982b8b271145b8d68477764362962880474e9765358c39295a8fbbfaa0c74cc2a2081888d02b6f094f9d72a9f722fb1ed0731a00ae9d41937ce9a420b850066b515d6a96e209c03433857fce0c51bed1a1cc8e8aadb4a60c999b8a894e7e351f5d470c74a5ce15c1617dacf4cd5ad97d738365df496fcabcf37998b52604ac87304a0ad52b5ed19b720b66216f59c48e8ecf3dbe906b1b271826f2c5872c55778ba6cd9a6ea1a42fab8ab515d39f6c23ad107179594ed09078d4ba3c8c7e104adc9881fce03190c68cad30b398d88c24f4f801f46252b6f12343084f844ada05d13e1b33c220904e913a2dc63d3dee26f15c4cf27533a8fa7f8e30d3da3950f93229f4da06748b773c07c24bd0d59a0ea502741418a980389a52ae296a3380219457e9493b46400291732e3fe7ca259a25e8c58aa173ef66abf170eeb4bf1f2e591b4952182315a9860a117c97c3ea7fce33a1a9334d1b7d7862fefdff14f68c0f1606f2c51524bfec7d4297fcb2d3100d1a7aedae7e05333a16448d3a7f0b4829c60b330e672dcb38c356804b8790c478ef74f61fb96e3c90cd01c19f0ae0a6094b7c3089c6e1cc396573d8c0783d561b072a6a3bac71d8a391e69be35442737055691335886d5bf2b264b7771892920140ab9c1ba4d7fd81c6f561e8e1344662c1769566d87101806eb9e1b9e5eb21a7b92c2e5ddc85d98b758e8935a37dc86dfb6ec9f460f80feb6ec7c2c5b929fd6faa2d7d692377f3b8e4bb33c898942c2c23e3a332f2796e88e22f720af86f8650e7710ecaccdc5879bad1d5e46c41ff96ede80bc0b69e64d3dd167915d149ae8e7c3bf8cb5fb0911f2794ce0bc68237a881231990eb324cbddb9b575f86cda0678d39c0aa054a20b2521396f363198fd1acffcff81585cc255115c2fbff2e3bc218afc2b4da254ae2d337c4e1faefb532ee53d8065161495441ac587cfd391717979bfc274924a39e4dcd2554ba1533a888da1cb52a47ea8e082b4a18b86e48cfe3acc54d2f4c64c82d22429eba88b1e9e663304b95df3e22509666551bf971dd3cb5fc054a82b2e0212600e549b476e726010037c6615cab92849bd247046008e9dca88207ddc5cc36310cc88bb284d0836a66cd231340f36f3ff6fce1e5bbd74991ae4364442d04635e6a9d8fcfa52a4425ae7c82df238a8be7e63217ffd6ac3104c988e2894caf1a12450da86b29599c4fb17097e4f9a8e7ee167d164d1990ad117a08469aedaabac3c919c301b5babc1fef4e135382f3849deb3aba67a045319c5b2d61d8427f138d741b8179bd8f6d36e73e4baabfef963e208ff419e65143c7a028394e227c53502eec93591522dae8726ecc0d5baa77e73f5ac39707c27fb1004ae16bf10fc565d31d4eb381c6cbeaea0e4f3b99ab9f6e30cb455a017996c0fa7ae1eace7dd644f8f6ed2e9d9171461403977559dea507539d8157e52a698a82dc88ff53678c3d0af010a441bb0107dfbdf19ba403412bb3a41bfb7468b6258a77f2d1e18434b97e09385bb74e90b03abf7a9a029d780ba2cf0efa68700a99343152dfa6adad5123f70c3d9eb4c85e3ecff798e54045b3dfe0fffe428bf31c611ab08257d3a75b296d2da6d7b94c2af28ebe1fa78b4cfa6a24762cee53b29b85cf10f3c42b401846fa1d800e6e549afc70e9884237f520da7a68a0bbf765872b57f26bf29425e10c0770dd192a94944d50d6a0654bd62e3513bcfa1648e339abcda083f8a522e3ddb0b4113c5b8e955f267a5065b64eed0c24c983cedf3a36e101afa0ddec9e7a2c607abab235b13f794d2bbe88e585dcd959693a93cb0118f8392a649b26f16ef1f93232a1fd95c522c740393310ec318d5a37dc382fc3ad1fe3fdb64cf44a71053f0ee0cb60b57efb47a683eec6ef4abff5fd41d8b055abc79364e2b960376d26ac7300ee4ea583dbfad6f2784362e8a9489aef24c4ab262b63df667dda2ae6d9c3eed0ff5a445d4f031369dabc861db4a74b0c5124f082e864e3531d483c780c009c2a66de1d0be999ad2deaa746500c2ba2e4c797ed4f57376ab2d2ba017af1ccdc1ff343105e4450dc9172bcaf03966a065669982f443f3cc572154758637eb7b02f3c396249699b59a461a74df339b3f967b1269d1f5551e78c8a40bcea004cd0fd216664868867f29524eb75efd9bb71e0f08f9f21314803697c583e9384ff5da01b7692606cb6c51356ab399e3a41130e782422102cfc5a095c3a918b06b1e2869730590f408d5d478367f5721e368d54e75d727594a778ac4a3e188a44305f0c611cf1c7ba90b0f284f52a245ac0e5667b3bfe9bfa32d077124189fca04c8fb7fecdb48c99d96d497c1fff7945c48c2a13a9c4ff0885a25d5fb843e7f80e21b7234335141d008ea78c3df60959c8467398beb19c997128ed67b122def88facf5c52f86f7aa1c65ef017ee387344a35c6e2bafccd256f35d5ca195cc43e88deec202bce1fcde419fd59d3abf12067be1d67d06c07adc87eff05ef3ebed3fa5b9621f0f3cba6b19d26009952968f7596f313dcdcc0ca6a423578720a1d430582ac2908a7bd295c8992353bb14a092dbddc4a2b9c6264a4dfcbf26f0e8fa4bd8d64e97081c7d1477365f97f79f950df70e9aae1224462120cb029c635b8cfb39b3653f13f795e3f2094937cfeffca4ccc8c09b8334ffaa1ae8750024ad9fb89fdded472fbc6ab425f20e96dd2aea6acb4f2d15830889a0531cf9dde2bcd713eacc09648bb7609be257521d59f2532de6198ee98cdecefde9a1751916c76494ad36020b95c6b8e0a83680eb4f44297ce15fdb21c6be70a170f6b3813f63e1eb0ddf1b239e80e95c1fc49f25672cfc0d90f849fdde9c3bf090e6da84e30e999500ee7337e691d71eff4df09e30c3bb222a55c1850df266e1f74c2af02c69bfc06c2f46d8656ab10151600a57737588e18e3ddaf228643cbcbe77487e3b9b5f14d4c8464e7e980d406efb926d465f5cd51d1c1dbbf12fc3d8cd4e43cc8eb91bb477679b47d7288e8f0c3ecbc2e52df50d882682b8911f6c5a05b27bae01988015d59ce3c3e032ba4ef2d7c2d9514318021404a9cb6475c559344fb1450b148bd8de464b2ac2e2b89cbb4b7ef079424a5b4705817ec876363262181dda41d8001a071411987a54eee566b1608ba445bad5ea61eb6fcfbb219dbc2c5ddb90a2c502cc9370288ac84e3e6d54ed60c690f1198778c213f9466fe8dfd7037a13744da90bca11633cb1e4c23776b90383b5ec52abac49558aa2e7c74d1bdbfc58e39531fb0c312705d4ead7e6f1ecf709a7173a8ab4e97cfe5ebf2644cd4738a9dba58f948316fc4dfa301186144c8a801ca7f889ef6091c811d108ddb5721b4684acad063fbf0a28c1a1b467ead6d45d7077af719219078843f3885a8e711b4be17123ace7a5f845b8fcb4da74ae5c847ca4dd3e49b65eb28877f1c89731902bef392605724ae61300a5f573f53a74f6bd9ee47ba098e2656df384a4a1a1d9b04df1d000a89ab229448d7bc6e62f9a399e30c89476593f5116b67484c6396dbfa9c863342f2af43cb0ed016852c07a1a6e94290fd82a901d2f25d0940a4df13a90a82d156a0c6db95e7ac70e622b829da16f6aa1e3d6d50d491d735a308de22af118d610934a3aa71189c5c3579f7d256755cc6379cabc02e5941225aa76a406fd3bfff7040381c01ba0fdd52395cc6567860ae2c47b31d62e9637471072611c886201253897644fbafbeee42b7512381d3bcb76d63bb465cf8b52c0bb3138ec68f3da34ef533edee7fd38877fe1dab45308da756d0a0d4dcf636d6cd5c09c61114a4cc28548121e9775b72e9fbc6ea6baf2ebf2e11a650ace454382e9ee75185a79e4e1e8cccb83f9987b3ffd946391d1724dee56532b60fc5e9c304dcffc8fd6d7c2638e87b8e0c89f227f28962fa9aba2ec7daeb5fc9a309d00ab4e8e0c4ab70bef20077f5d47794cef872f463a70f1c2cd99f50c6a176febcc741c9c1751e9892c73bf40be3b5471fb7d01fcb22397aae5dc2eb5f86bfb5d1ae5c85a384c362d1f9e58ad5840321e911bee8c449bd489bd07ff9c7442defde6ab9827fe8b20c4b105750d5be9fef585193b761faffb2a82ce4b535f8fe30c77b2ebf178dde7f0e484a4be4231e00a31dd514806505c1c46b3e6882fc31305073cf71b490a1e6eca614fee30c70485a97d470e1711e7759fedae6a25efc99d7a2c7dffe2fc7ffcd17be07d5ed178b2611152c82c69181fc751cf77d3b7fe8a93c7a9c04df6d7f1dd3d3e7fb2da6077bc637cf9b7c880e21e1cca517f0817da785997eb97c99bc08adccfa5610b78653c20a12888404470bfc896d4d03d2d9cf6396434126dd326a97733998f11e82ba88c456a1a897bf512aad9fca3500dcb2528128101a395e63b5bc6ffd24c069b8f5efc7de3710f5f458f48e279e9daf8011b60936c982df8733c5c275fec22222a7101f5c22c985ad1b890ba73a82fbaa697952833745d871d710b49bc5730a4189c90c14dbdcc1a0a49c3535a6cba9d394480ab004d2eed7acac25ec33c0eb3cecd59e98d8db11a1d84c15b03779ec0bcaabfbe04939211e48fc40244dd0499c3e075753e6159e0df8b6cdcdf595fde2531b193e435fe0fea9aec993d7f0b6d492c656904fc509f847516510e3109bef7f93e5c441845250ab4cb3b3d2cafb7c0d1ddc6990f33f94abd402c1755ea57a2996e1b774e5ab144b454742140c7243f8fbcaac21a2308baaf947f5971ded9372e0203b26b53c379d6fcc30e86de854320554b32e889bac7396b40561e7276de5c79d3c871f33878f984af500d76cc73229b39f2f6604cd5035d96dc396174d9d854461042fd80edd7ba511eb84f5bce64f05efebe22d3d274f4947b5a12a2002174ca5ccdcfbfff1064f612a49116e17d06b2332b310899e8e04c2ebc55e15523d411f7bc3249eab2d3d0ebb311dd86f9fcc5fe81ea109f8bdd57aa0030de1cfb89eb916cf9bd81e786e29bf627709d335a20bdfcb332a7bac7b5bed134b90e9e094ab1c2c654c7898a5ead3c352b313095b55ec91cde6aec6ba0d4643a65266cb22668dd9b8cd8bb333c8765ecad3a86bca291deeca48a15d7b24ebfa96954f699d41d1b624b03f55322c605b0d3f8f3066b79e53d2c43315e5cd14b0d8411a5378a7afc745c5974799a74e13c5500e2831a0e7353d91b0fb64a2e4f7cc3ca6d29f06f489827243b0299d19665a3fbc1e1a4e3922a7b83177e5cf012601c6c4bc460676ef8dbcc47ce367e4dcb2efd596f0ba98d688e198fdcf488c94f6fef27d368a419684b3aa1024f7c7c0d884aeae60f66996b998fa8b29dd71e46d7a2c6944426dcba89e9447d30afe444f69924c9cbf9986577d0b9929710928da1cff9a8b85cefdb79c1b21bb12c513119bf9694884c8eaefba81dd4893c93e0d97bb8b70ab0843e0d36a24d17747a7e7dc26db9bb61316f94113af354b21e46b608e7d6a57b3aaadb3402f68b8151cc740aa0eb10ee8da1e3003bfb004cf0132ed0289fe784d7c8af65ebce7d86ce1e12d438219b85389e7c67d727c9be6683a12871975e3785ed7ea43f3275a3b78b08c8ff8bd2cf4c2d3dbec2f39544dc726493ab3ef2536f313e6a77bb6d623d8e8e1b925035b53a66b429ef77111b22d3f9db082c9e24d5953a28d818bd47ff27b602ff680bf42f98461e12166a841f4e1227f83a97d0ba85f057257243dfec59ff6e8a16238188228f8d416be52ed655cb0f5b8d7ac508023a981cf238d385a66eb102647e6e2185bae0c4568c1efb09af0cea464cc2673eb0dd5263e473529a6b66e643a68bcbd5a15a0d817ca9a10997debfbc8bcd4bd0ccece7fed8b3d5ef0492dfe676c7bfbea2b52e792204566c96c39154b4a62f2c031cd0761a21ac84a8a9c694d53251b544315675a40e9b407f4807b8dcb229be9a54fdb4eb0a8e58ef6e83f64e60c5397ff2e62448ca933009c111b85c53b247456a8e0cfeb56f9f0f31db62cfddcb24cf35a54951a7724a5dea6139df116a6102239d2d6b2734e0b9762b3e0d11cbdb7ecdf3ddc8262504ac39e0fc33de223abea3e3bffff553220fd7c449afe7c0d88a5218d28b0ae7c597da4638503d427903917faaf9df0df0b526bbef8ca7427706644f8fa3e83610206378234a5605d68ab44f7549f7bc04bd3786f33948b60d25225c619da3fad7b76b38cde5bb24ffbc6f36eee4d57117037851707b10fd5b2345c786340c2156fb785fd1a24277bfb9a82f52be0c448104281cdf1dd4fc44bbc0ea535b918cebccba708f78637e2fc23e67849ca2da7055977fa38c8fbf2420b3d68df73d47f10afa87dcbe4315d8fca16bc62ec365f7ef8584d43be3cbadba65bbd11889596c90d8765e5f632487329acfd2192b74c4bbce73869f68da7e364b1d87cdeccc48547ee376fd39bfed6791e9df7fb7618b71342c74d4cf9706f9a4cc4c7daf4c59e5159eabde73f4db0c164ad5b5986d614bf8263ac728375e2a722c1db8ea82cb74aa312b5d85b66ea1fdf6bf2a6c8e781303f51d0d89995364e86d46b70f72baff39b3e822933376bfd511ff4fbd877ded65a629cb433e8cb1b313333bc0336ea17069d8c460c9dd54fbe16ecb198563e4aca3f98ed055befe295a58bfe05018819cb973a327ddc44c0536c1a8aa511ca8694549dcce404661bdbd14f915df2c6ebe782e73ef988a31b96a025608d021882b68244c841ef86217ed97146e3d59e84dbc61290cb312d4c20271f55f2a8931a4b1491113401ab6cbbb94e8a0151282eaf34eb423b31bff23745a752e1aed2fc57568ce222b8efec217ab499146b3741eb9433107137326b8c5d3411ce467fcb4fbad9971f5cab0334025f33a6d5eac4baf8caa953fd20418f3a08296ed1e9c69ad84f9f726c98465cfc0c440a3ea6b57fc0f8daf160dc557219709cab043432a9dc01de9f8bf4f551a1ab22d802d66793c887da0c079b3a2daf731cbaeb58cb648c6e350b3118bcb80b5be4fd7f2dee182271e7935c0466aad2d31a12f339c0d52029b5108d0702b9ee9aad2c1d0cda345408f90cdd2d60ae9bccceff4f921a8a323d3d5ac6af26e61db8cf7e8a0d8f00c907cedd730ed13a3182ed2871c1c9a2e49d40f5454eb101e9cd94b7a805120bd0e948d34bacac14f96d8e3dc6a262f3278cf3fdcb0e460618db29ce2df78e39e83d9c7773b3ee3f8e24f4e985e78ba3e307972d9fc277b0687365208ea4c1d38285bf1b1ebd6c386055c20145d8e6060d297c67962d049aca38828fcfe5bc8786c74cc5c2c21c0424839984708b7170cb78577aed3690e62041bd03748448f749d169cac92db3e24de44a5bf5f108c379599d42cd898235c907357437c2367167ca841ca4652ef32556f590475586821270b2cbded67fc0786905064d14c580608bce0255d33f21d2949fcf1de07eeb63ac3ecf8b9e8d632fe5baa3997d7c2233a9c37bce1c3052990fe6ec4f1a84fb037fb17a2f0ff6e90efdb52eaf07a0aedb8f3facda4d59fc12611e01a90f71f3657abdc33b0f7d3d02e772f32cc8037ee3935d6b32935830d69c034a1877bb73da3844a5e4a9f5fc6cc12692ba6eecae7c89bccdb462dc7c81edb0a65a97ab965777f8dd6bbed9d734cb36d2493d64012589bd6f529b157c893c866343f17bc87021110dac1ccdc560f257483b5a9f42ce5645f4b773fa84462d7227c85334834764c2e65d0c410a134b5c82e0aa4b35ebcd80987d907ed47ddc5fc9a3552e80bd0ab51a1201e2468e1455f3e7b1ca9b63c6f2dc1641065dfbfbda817b65e6553d74a42479739426c495dd81ad0ece43abd657f564f1ad5360222c8da00d1da0abd66c88176dd4e9ccfa113630606d7817883765665dd308e3ffb5a44a99f0561c2842e3b4e0cefb64b6b01a23f18e5f6b55c04d5b2202091eb47bf66bf19093e0392c6b0c16868cb8e698554ea7683c516a9e6ca7848de0018b77e31d86dd3f06256d0dac0312ab5bdcda836ab8e7cf663a01a2a1a2fd0cb7d5c5f1a8e462519e58642d1f4ceeb9afb76f59f7635fb051e116f555b1378a4432a0633ecf57368b993ffd94e14407e35f9711aa62fef293e824035ddfc3cd5354e21fc9576326ea79121ddd05e12a268064e07d0e023828f16fdb72920c5749765a32afe788067d0a16f8d9c09ae624b065d6cef8e79bcc44c02675fe54964a8236fce226ff020aa951bd64826571ea289017e424a53997be347341abfd865baab5c76fd44475f885329fc7457d2cd24c4bef6163c0b0d294905ca9f3569945a2bf191f72519a05948d7a60937c73628493b0afcb56e30bc0cb43a7eaf02f564dcc00b87a6f18d3372cf3d795b5082e9151e0854d067ecb439a02b17b352ec0374c31177da92308e8a294a00f2b70876d962f6fa30472e909aa6ca540627c651e453e8a3dc8be31fc86b78a76d527596768d9dc328ab584ba9c3a838b71683ccf914184f02c9b86595b556edc67e27d003ece8525105a4497b75b2afa1729b6b3cc5fbe8f03bc7adf08bea68d4f1d1f0691b3dccbc1dc52b44e9247326ac61ad3034e66d3cf1f648d0e1cb3cd89df5fa1dd0d1703be6c78093da98bad0c6f1a5632415cadb8ee7e146804d37f48136a81efe221432bde0a79a0b524c56db635c5dfe6220524a5e2028cd055397a26f85545c7eca12b78ca10faa0b2d88717032d7e816bfea16f0f16b589770f19b8fc850cd2e4e84f8717dfe2433fd774ff40c53f428eb7b89e4d52010334c1f9d27944070c42c64b59251c2eb6117f574bab20ae84404836b346d8391b25bf4236dad98b1b63a7e68ec0aef40502d4f8fc7261d7f63444b7622a10816899e8b8c770db00027133d1cf56716172b3f639b59a701b37af34dc76a7de4776ca77cf504ced0257c27a57e77f274532f4b217177aa9cf28b6bb5523adaea03985391a34f67f06edb10f13e83e7a38279b893db6647c8845a4c0259883577a83e4d3e1c945f044f3d1cf1e687369c3ad036ddddca3b6eeb42dab8ee7b9b81ac8f13750324d9583a1b8b5322b47cd4a040cc5d9f823fc517cc2e3e405aea619c281d02727987a7b134a15de2ff0b560c1d0791daf024011b7340df5da612c44e5eed676debec01f2080390883290a1ca257e103f15a8288c2db9e230f0b004600f6fcbc0b1755ceb073cafe3745497d4f8867d2d109856a73e8d16ed037e07fdeee6e3ab7c67e6a59713e8197ba7a7e8282b82e7a0f9d5ddb34e82c20a3bca7d42a3386c233825b5ecae0800d821066169f955c3effc34f0badefaca5cb16723644d00e4c3e3c564ee266c9c53a66a9d9c05dc2106b15f0e4876d42e342641401e4b8730f323aefc626b4af118df949e027c187f312f8240545fe6f7f14f15fb70388da8805f16d27abfae51cdc10071cbb678b26f6f4299ac1fc26a500c0e9c5827c737070880462100695918d3560ef30a3a41df5f9b433da349de06762e0507e14ddbbd0962c245dcc2b9a060bddd3f41aea6824e2a160b4ce4983e04ff88a1e524c56677d71305ebbea4387e46b28dcffbc20fc7db41a85ecb305fd5f204320f0182fe34bc02ff9100ffbac7e0a6a969b621b1486b9787d4e4ad0543bda6c5e43debc84408268df2b1828d14d0bcfcdab1bf52051ae32df0baef37ea77a0e311b0dc817146643c1b5eeffbe85ad49c757291895b08b65ddb39dae54bb1e0639fdc948440e1a792e7d12cc48bdc7f5bca4cc98f8ebf778de000e92bc5e805a709cd9cae0f9830be3597d545561d3ec418e3a8122188d250cccc578600b39b542ea3e1059c2b563486c897842a89b5196a1c35c480847eaea307fc1ea0ec38d904cb0224d2cb8f5d53afd32b917a4c7fea376030e6da56750540dcf6cb23d760149f7c16344a42f7607e097a3cd985e2b35fd77afe22e04fdc5b0f1c2e483e6b7a05b675c9f6035e29723934d60f050c43d381d328247a17829cf025431b8e7c803561508ebb35091b790b72fa5539927a21ad090e2df510662b897307a424cd380cd252f3f231326bcef276adb13f3d52e461ecfefa94ee89fb3473afbb62b0969f73ffb99d67b21444b644e207839278c6598a96dd5fbc1a185e1abb6395ff4927d14b707a2f1d3faf58f85ddf6ecf5329d8561f814c51de8f6c1f19e07f32bf9323ac5fe6f5bace5b476c4ae403085110bd2ad0585b891208a40b54c1fcb84d33d8cc3d9c47cdce5ae1595c4f80007cf4b1df3b644a123076d9adfe65f2d6a1b22393e3d01733a7185b04cc5f8b6204973269affa3494a963efb2dd603e7950d6056610685079e5d95db507a5c935cd306f02398d1564103613cfafc2a0ecdf7f793f0c21113d2686b6362a6e40f22773b24009ab6e91ab26964612cda4a36bd20cc1e9615cd0f73422a2148ab3116537ecb468e4371b3b65c2042d5b8778946d00c8ed0f8ec2bf70e329b66bf0fd1679d88e35d1c72361e3a30495efc0ee9712edfc27f0b6d6fe539bdecd1d2ed3f40e74792e74ef74ee3c8704ca4347af6e0f44d7a622aa6c1bba98f4d14643754156300cb84fff44f40b36835090dd16e719fc99e694b982988d8f24e9c3a8dcc088d95a7862d863c426fa48724bb0b90f8f78096b59735d7ffd708754e825fe405d3a71c2dc42eebd6099e514dccbdc75ac613c194ac9f0602280a83f98a7563bdb7ac498ea6d024d28719dc3ba132f4a5087a1b8d5d0dfb10d837a17150d1877b87eb3689fb6bd60d373111ddfc6a434983b6a5c0533ad4195359510df316f64046c7117e19b31685e6c60d4d875ce1f216280b00a546b19307ad0e381d007783e58b793a3b5b0e6406c992d0801d0df6c99ea6d6d771d9256ef949b507887a923bde54b2eef110861d33c1558870321d30100af179b872abb3c207d311b7759c32ad6d06daeef3280264afd14814569eb10fa9a18a25b78ef0e2aabfe2660403075a0c9a1c6fe3cf9fe82d8dad96ffd3f407cebc7ed4704c8092e5a8d95cc2e438cc606ac1e092d6ef72758c2d60017803caf0ad413bebd45eda701de08717c768da7b440b433d42d04dd0f6f973df16506a246b2032cf24e01e0826a0262da609b87914d4368bb16ab0c35c16c8cfe3a3cc738ef4e3a56a810c8c62cdc40bb121da1aae6c911907e75f42cd5e0a756212135650e0ead81f63ac5f8c521e522d86f0ce45eb8485f9281bb138b93430395f5e5e7db556b46dabfd0b15a9a47f75d65264f5123ab95422c8e5f8ccfbb55d481f8532eeacedc4f45d86da88a31ae93a0230cd3e45ea2e91624eaa5bc3b63d74f868be2fdedd83c1fdcd24f5c9407e7eecf780c5bc74701b792c788a146dd1107348c8f4cb69a39a93081361854d99546261afa9f2e7cdcea7e3e361063ec8f54e47bfb5cb382690b5036d20e8127437e17053ae7dd9ef5f302e3ac9dadcc197e37a346b3845d95e50e2f023fb184c9948a2bd441d02d840b3baa551082bc50f6c2f5591eb2f94ccf04e2e92aa970d2a53ec382f09c3841f15452f331062e3a5041d89eaca6464d24171c394f3f568962cb119a292da9d6d0ebc0836bc6a791260feedd878947863fc2f30bdb908a479091a50f70cb363740add9b19a26056101634e84226c971caab804dda3fc9475774245ba63453bfc01d3a1ea4771003fbac56a7d9ed25c1032ad0a72d71490e9c0f1eb888c04ca2446af89f6debaa211f1cba467c66f9b6a7f4f541587414fa11df2593eaec07e4ff0702e3716b723e172a41a4e58738019e2c0c22bb8b0daa92370a6c2533899dcda7685b4878e452d22c3a679a60e4e8be9e9c57eacd51d914a3dcd28aacc2b79b2e19173d3bfbc47347ad9f79b704e82b4bb1790546763ebcc0e79965aa6b207b86922d1b24279c28ba44742bee3892b74bad562fef0477547190f8af031c33a1a2a32dc4de3cbd3ba7fa0141ec0d55fe0ddc5f23d423488e13811d9b7b03356a9ee70d1e919252d542f4534ad0836817c53a76ed9dc4d45980654952305b73a36ee7964e7f94c7f33c22ae2e9d385505ea0b89fde8015c7a687840029af9eda6b109a4890a5a8ee18842210ba13602811fbaed726eea2d95cdd7834bc9df1db190db964d058b1f985ceb10b50f94fe1a7e65747bbd457b9dff8f80eb00539a7336d2b681619eedf33a09e5f4f96ed3fe12c6e93a7e259386865e6bb8d0778ede5c08c95939e6958adc40eafd8189cfffb2c65f99f4c9344bd7b29e470f32c874fd102b3dccd6bcca3e9c191ba38e3d2c91a0801a2032907f7c2c920085ba8a71b7b9939a0961dc9f796c0187cdbd07919eee538f47a6bddc982cd49c4ffd129e76933de8e158f44e1353c704c26e42891897f58cc8b2349a67859289c30e9852c974c4030d398932ff5a1cda80abaabba6ce93ef20d8d8392d4a0a3e6c7121c9cc24190ab68dcc762df4015eef827acccf11f554ceb6594ac7c2cb6e51ec7c03c3e163b942a750bfc7f4f1539c33073c142f0b1be9a69965399411dd3f6c4df9f5d9912eb3ed09e1191e3093dc1496e88ecd03654e65bc1ecb14ed14a60ebbc913cef32bff7f8f063f43a242e4b3402afca766719d56fd5325b3f1788d49b7fa3742d5e3d1b0c8c7a1ad9ef0100035f7d10a50ae442e4d2d9c6c8417fdd3cb3919b9a2bed815238e33b1161a69aec9ca393a875fd823e8ce9221a276e2b6c13b3427167c99f768b31db70f8f56648071e73e257eaed4756bcf9ef34286b3661a23f93f41eaff6e00b6070257eb736ef34aca3e06002ff8ebfe27ef0f3d65411087707822f40139e3223cc1cad7af9dd21afc0a6632e0e87e838fc3c112a695e1634eccf67dea9e761fcb4c24f0a7ffdf576b1b1c1d5c6734a50b3621a1768330275714d8ee24e91dc05f7e6871fbf2a20b1a7346fbcffb614e251bfd8fef687dfff77d06dea4d1e09ef2fcdbeebe6ffd56f4f9c84ea71e97255f819a5ce34d406435f24d75a1e1f2454410768a5a780d6cda24647a5f968b418c5739aea413e21c8739680824e1cb4f2e23feb5c30abe397e0e0da979fe79918f4bbecee5ebde3df7ec169ff1001f6c8a8410eb5c146d2caa3d36e11c7ae20a651ff4c49999c0c76e19991ef4ebb247fe84970837c9fef1752cf4da64df791adee734ccd1703b1967cda82c63dac5979609062423bac67a1707e7dee077330c40e557b5dfedcc785a3621cc2fd423cce8928a314575b0e3c4765335e778be730f55decab94424099b482cfc29def59c8a7dd88d6799a77390c2fa3af9a6d7d60461a26be36525d32ea93333af46bcd989f50878685f61081e87d42ef12d8c8572eac67ec459d29fdcb1c19ce4429163f726b4d86de1cea274d0084dad4b33d7b1c09541fc568b5444593207912ee3023feffecf97234473aba21b7232e6a497f003be931e5542ab8932dbb9450515ce2daee75b64cdc541981cc18baf1dfeedb6d3c76b00d84f9aaefab307b02334e24f24124432ba8ca8d32b6a51e62bcdaf707689bf170571f2e647c8e020d5a7b0584127a37f91bd0577dee6cd8ce19ca30d65a629937811977d423b849c5be4b3871194d13d1c0030bffd4091944b0a488022c9de8898e1aef743643b1f9913d2c2ab610e470fc6bb314b7a80763ed6ee8f8a585721fb1405f6d0c6472c96c81ed766bd466729178dbd1808002445f9ada8057f9a205ff6d03c2abc99b34f9afec32d14342f6343a02656981d58fb747a3b75b15ad7eb40ddf5d366e548869d231f900e85fd774feafe173e23977d2211692c3a9b67112808758cb1c5a6003548a0d1dfca9781e5a9086e9c53be47ae49a18d2bd0ca12306c2ace63d73dc5b9c2948992d06b900df6206930ba312049a632877b351eb4d9846f5de4c543aea061be8bc207885324a38547e7f3d59349d1ec99162d72b78372230daf2a88bd5458272240a729c737d4da7e4779e26221f1b77df5a7cec0b8b205dbff86f71732eab9423b990f2900a7f1d7420bcc7ad82fed3c1b131fac61c6aff72897c9d01cbc8e3e298a00e480e129cc344a236a38bc6e2616df6abae7c1523bc294e4853441792d57728aa18e234c195082b140f8b73d751f18e209a04b2d246df6e50e78c19e752146d54174a780414bfcd8ac2722d1b642df67df3126720a5e47f9f3749f790db51967dd570d05a50559f8f2308532720ed24d2da0840cdf964b575daf006cb5ed43f0f4d53c03f0962c7ee926d6dc18308d79b6956489fa64f7ecf84e123eeecd35f91fe55b3d8a62828db98ac44a27d72186deeee284d268d951fb1a5413bba5d9885737b54b19fb039a29b2e493bd6177cb8b8b6cffb5d130b4c9653f1ee3046de38b05db5966be41298d0179713bd666bdc720a4892d6656f8abf3d8b0f072d070649f09080f687f63c1ed34b7384c3e6b0bf6c18807109f1cf2fa67f3bef9d16c1ea1c6bff3498f6492b1267170f56c789b957ae4561f3d123af3600beafe857d945e7c8433463dc1e965b03ae85109ce253d331dfa4e3332bbf5d443c29d1936e7fd37c0bf41226c40c0d4c3f8d923f16cb9c57db5f1ebdcefcade110f8b40406d8e4f63d89b86ef0a199d8e21b224d3394322833c95ce1c12c20c08dfe018b4c1e5dd42c29f953a1f6734af19240f4632d01bd12c897ab7af67a58e7f75430a8a4fe6ecab10b4e8bf556e4c82f1bbfbf875fb5986293f516c9fecc4cec5bc439ebfd7e16eb935f111e5eb20012fd5b9f0f9033421c1b6836560065d44084758f3bebf9a3db94e3922fd9a1e4d3fe7f334225864bb23f7b9a8597bc0e627669a8e7a748c09b83ee7b26b630eebf43485b984f6fd7865ce6359f7623d119bf6e645d34e58e2fc7dfc1c1d4baf8c543a57ead500ce6d6a38657585975d34cdd9bfea4ea6b2b46243545f914f8f08d8c1e1e15d3b0a6884813e0947ce2a3a53c628b9fe87e509a0150f32cbe9d2e8b056c2429538326e4bfb499ddc79dbc203f1fff4492d53b02eeb9320ef3195dd7994e1f8c1f293c23a76a3fb13fce83dab58ec091e667b16cc1c557abfba1adbc852abdb1960476099d3b01adadcb883c1023492aae49404338730b75e4834e12c3a3573219da09d93a296ae4f6b7f5b127dcd245cf2549c714a24ba6f411373e1ed0be7516296514a96c6ee3c3ef0a4de11b38ba7c6cf9af282cc9c45b69803e45252a35c5c4cc950bdb4b1764a371a103a0454c7d43a1f60a2ae90b246f9023a2b642382bed9b0c17342974c85778f0fc67fe577bf8d1f944fb70d7fdbc589547c5ca4221772a83e7636c87e29b9445d1186e9b8ad585f1df53b2c92f788251689fe36e5564806ee450c36f1280720d6147c027f2fcc715ebc7ddacd1a016730b03f637d519b31a17d691d0470eae8bd36f944f21317e1bd2cf1c27a8b00bd7b9040b88341dcab28c085564b7a37b6f9e9faa9416db9d1e45f25056c49b8f81520f0382ba1ff8b564f2b0163221e13b54bbdb745c8081cbf9d5a6d94961862696e973f84a009a309e5b6c4dde339dca1df35a2d7d09273e32b59fab9863c03685cbd98454817f395cb899b8e4a0650990d3bd7585807853f12c26e50e1d04168efe08843b49fe8331c15fcb0b7df197be691182aab05bd0de73f9b45fe874654213e93079b68b5515a7db956066df092ecbdb50856aa976e3434e7e0c6f93b478202574555744ad7a67412f8205e6fb1fa7001d2b8a78fdfd01455303b797b450d895829a4d5a2ba62b02a1699a8853e8ceff64576084917b0b9bd90a708d8c22a469a245c03c9c4e8b4d608535eec1c0a8d28c9d379f8908c7a87c2e3792c55a697ceaa1530f66e05aacb55abd2c5e8c4ece658bcbc22a63e6378c3b129887dca929ae39155d9d2a9085ecd049f5514f8eaee2a50215fd10ad34070b4698b316dc88a65f651acaa023288aaf4644f456c886a896ad93a369334ca22e6370f1ed929d48417e0aad3612bc022e0ffb52a21d1fde6602e1f59da088ee4558519551150a59fb4baa4c05bc67222bea465a8cda8e81f897d27dd35dc091c96972e69f0e0744932bfa36816796d83262378ba47ceb4e25915c68eb21d1d56840d6fccc3c681035d0a16d31e1581e10ac338f0db408aa5b29fd4b0ad1b31536c5a0995a976bb165d6ac0f90be033ba95716b36a7482315a9cc79e97827b1abc28dd232c2156f70c4d1a3f1e7b18b5ed02ebffaf7073bb015020725a9e26fd291d43a3a18f2800f2e61b1f38e9b76f9f062a093674dc951eea14732d2d2ac93fe0ebbf79f5882a7aca7ba57e0290a1ff0a15c5a1cacaa78d6b2a56bae3b79a1becf7f837d8e4cf9ab559e08fd3c8ec1f34e48ff4376525defefbf46a85f2325c913adedc433e2e7a4078bc5e2fe9d90b6f62f781a914127744444b7ba0bd67e38b03f38eb4c50fd659e75f6c0983368ffece99a2392fc42e23e8f3b173d7922ef3c1eace06bb8748c0aa13adfc19b2953e196aab2b7834dfdd04f0520c03550bcf6df4ff5bdfb7ce30adbb27adfa0ccd0e1d6895745a21682d5fbe0ad39f5689ececa7d1bdfc8c1b1adb9286a6f0e9793671841244b76e723e94216e9a4ee6f8d2f42843eadcddf36912504bde40e683a38cbf970af2d4183f1c78f49d92b364324dc35b0c75c8cc00bcd02b8f818ec91e1f89df735f933e4ff81fd7c2cdbafdbdfefcb6d2467b0b5910aaa84a051780cbddf3d5fd52910d31be47256e5be39e40fbac5965af40d199210a9f1b7e81ce6c47a4f3b6427ded880db6007a2bedcf66b1ba6a7710dfcd079f5176a00fccc25b12c2a66c371a271710c3dc70cef254c0c341daccc062dc7800570be1c12b082bd63d4c1f2ad7cdb1f08b5a30e1b8973ff18040cbf1320f0d0e95b564fcc94dd68d97a455e464e69c1062b85679623266e3183c94e06eabfc4332d634e727a0038e59109ba347ddee28c068d74134992420d2caacc2c1bb8cf0d8f14dcf8c930d851b08ef59fd13e3ca3c2466cd912a0091d2bceae98f102f065a8566b5068b2b1f5da2edc7406d58ef240f780b45448d432d8c780d68f6d3e0b11a2c07fd6859804c8e28ad5342c666102510082c025e0238991920be52b21a3356aca954bd6eb9e39318701395325c5930271206a7b6871de2a5c37037e45e07ad5c55624f14416063c160012a0817da1134829299e3e370e3181a17c6054ffc56ccf902c36a8dae8d5c0fb6e9ce87d395963012805995e43275268ea440accf2617620e7f14573de637b27ecfd117cc1e1541bc859cbab0158238c5b54da9561aaba7d1875a62264b7650de83b32e588c3f0d0716acb3a1ce6e6cae2a080bbbd4b3e5b3609234c41de6681ccf7f04eef61c9030cb22f65473feb7fc878a5f7fd83475dd2f4b3ed77815ac595867cdcf9a9060b71672024ae3609cadd62d5cdc24483325c58e1ad90f42f012adeb74eacdc1e8021c7470fbf122618bad4c88876ecabe808d531a85de449a8271581be4de728f73f02db9adc53e64d674b90ad61994a4dc4eb16d5e3eb8c20e997247413a366156a7a4edafe662c3c3c0801fca05799c4f878301ab0e9c9fa6cd40b3e092b26788189c625e59e2f69273501502c1a886cb454180812a93f269addf13657a67e282b59e06c27a0618c129497386c99379edd48c6b8a8a8ffbe982ed66f201184e1fa0d8141168211ef4568c4c4720404c893fffe02f92879edc8ceca3bcc7fb6bd62cc4368fd2aeeee7f88f248694e8e7afc4a5c0f5bf8d61625ed227a1b1a0b9e9358b1dcf92f2138fd483127ea5046888b389201555cee98439f08df19745a69e9792057a21b1f4e75e447569916d1301505644f0a8510e970fcf3427cf22ce6f28471d88cd6bce768ca7f4d0d449316b9581221ba501aa5d9fb58fe4d84bb068c8f5f20af2e6fe3c0a3046199a5ec2ef5d6486d7355a76cb5f8790b3415c0931ca7b32ca065e36174280a6ce2ddc919951a7464ac6a4db61ff61de1f8e6c89eb23ded61bf7ddcd32a4fc7db45d0d9891684cb414f759961ad5a41ad3bb14186261fced6feda0479b05bd99a78d639a3066df1f5b08dbeb0c9c27da8f7744e3d98b9d4082b17b10a5f0593119e0cc63c3cb48e253636ee70b3a84faf0876ef0b387670e641b5fd2577fe838c920e2e9b9cb98ac698c832c9fd54f5fef3fff77c06c41cd73346751d4a7c70fe5a4e41a05cbf9bf8fa4edebe16a52c4c11b2416d30537691bfeac03b28c85341cff57c7fdb21bb1858d14aea4e4a0ebd69f1df88770e2dcfa40450ecf8fa3951eebbfec871d043295c0173ce751af4e0650e9842a69f58b0a1a0a1e795cace27e05a821cf4dcef531d31d0ad20f14c75352f6c4e1af3d57ad52fd4f57d52992e2ca6bedf1a7d7a8e97ce59fccfc40976264c844f881b0cfa9c107f351ef2968e53f8c84ec5db6e40adce48a63ea09bcdced80cdd57427f643e15e8f862bb02adf726031fa2653ddfa1a30f9af08abff25da4b45bb8a122dd3cde29cdbe1f6b0c24b32a94fe483420c91e8c130fffcef401fe8f9ef0451036638f6650a337da5bf11d1237f8216be2b09f3c233672c1f87a57ee27fbccd3e828b72172c5f2872dc487665538c96e1dd72ff394598f69e5896dd3b81946ccbd295032d9815f83a0d026cab3c541a1594bdd3e7818b743047817e7dc11d50b0d01751be0525324fe270d7e917acb042f3a35ccdcf27b9497a9a4218908c3ba264e88b02cd43e6b8938f3c13f03b02047125f5f327d0c6e2125eef895aa3d7e66013556a4c56cf3494f20a5a6160048de5ff8e33f605367c062c23f17ce7f489e6d517ece617e1883cac7730f69baba2760b71484a2723a5cf6aedbe68a33ddc3ef7791279d16b785e094d6ffbedb998f54fc060699a373c7dedaeccbaff5c696ee854b6556e04505bfa761079b2c0cad0ab2cafbac49774a7050348adce7584e07df446ee95aa46ef26a6138641b099895f97c90120d3320d098259e62c2ece5025322272071f92a95161fccba3b73d18f0485d3ac91bec90df3b30dbfa6410bf50aa7e74364bc4f71797cfbc681886eaa0621159c0707262a705c8f42cbbd165fe83d4aa3ef8686dc3a603e7c4d192587fa809a7c19cedf30cb51ee58875b508918bc411dc98ff163c9d7ab2f12403f440f876fc5d14ae2cb624a2e7f11c15fa9f49105af3694bc88fe1b3e49997df81e58fb997d339fbbad324e626a583282279cdb5daf409bbeccbc080f91cfb4c576722fed3bf574d918f7846d857245fc73457e6532a1cf991f0c9a41429c3cd33696396a092f4f5aa84ee710d89e9020cc064c670ec4186b427f2c1e6cb6555d4822578236e48d70ac0ac04ef7bdd330ace409a38843ea2e4ace31979df7eba9fc74c35c149c7c6a88b357b92c1b75d59d512013741b45969c54bfefb89f7cff1c35d858f0f1c2a2519b46e33937f56263f6b9ea349760dadf7993966e557cde75b29ee0cfba9d3d7bdc41aa9cf9541695808b3c7833d3aab16352fd8b749e9bd5c457edbac0f92d4cf71a8d96b47682a78edaa0d467ebb9f355e6ba5e65f9c7ae668e30b29dd089ded68f6b2df10fbbe472617596fdda6c8e00e664348a25d8ae7cc4af4c7fb7ff7368f3b1ec0cce33201ad74a300c39067802f3a7669db71d875bc3afe73d429f74eb2cde3d2029fc82e867610dcb487ad1df03d3a876e38c496bed99c4bfb9eb321ee7ca7c8590839b66fc3a4ec78c335bd79153afc23b0a0978f052beb25d714aa11caacf44d80d0b8b97741b5bb84406b7a69c8d57acb06f0f064f9aecc4de8a2c2b95f1d8b8b508e9da3ef637028582f5baa7411be43cd8b143887693c4d2b0c7ca28b3efbf27bcbdcf19be83a27921ad519a6e411e9970957d04374d9d60f8f65774d1a760a9c1eef61ae07a425e66ca735c7cd0ba663982e23600c8f8e287586cd41f1a886d5c21b03a283976332da9781a3ff87885cd539b0077701406a6d62e6515da9e2a048491f05c48a49f0d0436c6a10b36708bcfe0e2df91f851d7343b05ead9dcceefab81dc74432b84687ffcade5b3a5d3ba8744fa58d2fdcb4a366191ad292ae840b9a71855db2c1c3fc2a88ca0cffbcf11cc12ff71192b37b5ac15cb02a1b8247516c52ec9e7e1a0bb82aea480619518057c8ac85799c60c7ac8fd8ec3eb611a467c273ecd9108a56d6029db0420107618de084edc93d09c83b6232f5434949898ae9f826433eb3fbbed52b1509bb48cc084c5acad143b0d62c03953bb0f0a17b7e5f7e7c63e538cb505172b98fff2e166ceb5fcc525a9866879c87dae3be5ab65e3d8d5779da23cabe64ccdeec47d382475412552e0541d460bb19a65a2356f27acc394d441341416ffbf8572018183ac46cd1280022115bb1d51b776c61e005559738821c67226b73beccbdd4b6ef9eaa10df43f76d1d4489c59eac32c2c6977ef2157f84ff7a1d719fb681090cac6702e9d914d36aa8d6b5f0cd2e6378bd83d943bbe8376575b3cd78a7ff63b4424e9a1f7ae415048ecb6202aeb020011108fbebde7cf001c03300ca0135a56044f35a84502ad4e68082de90e6006ef0f5e8f0d1e6480d4025696375cc8dc4e9fed3799e21edd5138d627152ccf01e411dca1f8a83deac5df4ae736aedeb315b8cff43add3ebc97408300ef9c59d20277f77a5b023b79f6979c1f13f8090f613de7b6869cf0366d9cc7fa621b1ea57a83fd090ef76c3daea76c43dea3c9f91b78f84da99882f6db30dc984856055eabcc486a2a92919bf9c9e261a2ae020f53d35c8397e8b5d7fc5d3534f5aa68ce4de91dc068d8fee3898c95bf568b4eb06445d9e806805570ddf189d08211827e90559cb7d4d2dd2b9ed79a2363cc42c151f3077a339b3e2b5512316f6f3e4a30921af1d37ef4c42e1b9888b700fba6ebd4c7483dcbd6ff67fd50fecce49f1158149a069dbf459618efb2d401fa8109bc8a305dae68341ecd47146d2345df8f70dade6e8ac94f78d7b746e660a1f93fc6bd68b288970c507fec3cf080a66f8b7e45ce19bb579a6cd4ecbf97976770074c45be6f7b3c9fd32caff7bca21d921ea418cf19fecfd45d2ec28f8dd8bf4a4485e4e16f07635cc1ff84a0a0baf69aff2f6df0e27aaa28e13add852b72f69979171b47ecc62669807c24689ef34caa5e960c56b802be3338cd6f81b781918f17d670d4ed66358fcc0bf4341f8ac9327f340e67e400886ef9ba03330546d586b71068bcd17241d7270886caecdd8db48b953c1a2a9d4e25bc696684801413a57993883018f478c4838160f4b193bbb62b401cc4f9b35e8388aace39f82be8a9cd704033a7c68c657bb1034802ec60969e1c3f11963c37473c68a6eff74dbddb4e5bcd8bcd8b00f8b0f0e4b8feacbcf7b51bc5ab13675e636dfaacd39606b38f1c24cae8765a027b26dd44da7ef872c20bd0d36e8559f372c6dce3ad666c805258f92336b79cbd96340710e6b1916d0f391804c9846b8860eace1a39cde73784533ccddc1be5700c608f21165eff24fcafe7069f08fdaa371fa84508bc1ce1d89c1c2beeed807e77603e7716dd0cc9824d07c00c829d82eb0da413666f2e1b0eca2ec4ae1a36c2dc6672f0b2ef442e5c0b18ffaa917fdc17d56ceb3512cca352d659dbf9b8629d292cc1a7a630c2648b0998e1b3c3b9bc169a521a614138d89f579f4e7c2714a4f57f57e38730707ef9516f753130d44403af3a277cf413dc3f762aeadb0c918fb1896acfb4c189cec9c36b4671d8803c5be4f1cc12d1c6983e95d8f10509c1f9a61b491ae689195987e856931eb384db3e9688029d3229f7fdb2f27e092a098805cb6e1a2323a63ff6c58f370fbcaac70a1daaadde1c5bc1eb3feb0fd6e68e44fa0280a9897cda9798235bc188622bddeaa401af18f60e2e9525250db8c7e56dc54cf00f4abdbb9a71e00cec93505a1285fdbbc5187567f5acfd81e5cf8173532db56da124a29938b7a60aff8fed7f4bdff67148cb38c6ce416e21c36d0398a1455cd037f537fcae49fa79de829905732728bb1ce510cefc1cd6cb389fb3e35627ad3767e89c03bd2ab8da14c69f08d76e7ce7bb97d941dfdef5061746b857d9993f835f9e96075ef911d65d05cd3cd09419c0f2efb7d9f05ee94528b1cf6006f30158e70a751bac1fc0e9c60c03c231ca8f8f24e438d3a3f3e2b39e6795a452b6d870c0b1f114ed9f5c61c267c4a377600b301b50cd29d29c585b386f9f7439b375e6876d44814710c1e2961aea3e2d23f6bee6077d02b6494e67003cde03953666a98f259340f20c7bbda9d183eca7e0eccba974474b59f00fda4dc586bdf7c3f330fa1a60464adcf296a057e58d090a406253483762ffc07996fb9ac58672030d46deea411067d60afa0aa30082949d64497def516a58d0e490c5cbc86f11d3042938f47f85cbc7ab6fbdffb418fef709f5e52a25cd0ebc5552b1ee1fbc81d0dc764b3f87d06b02e49043395e7ce3fd95393038f3334b41dc55e0ccd7cbcd4d9af5932f58ca0c3ef9d34a670956596bfc06fa066b0a1f2514c4d2f8c228a17c7ae2001c967b200d1ad2dd1f96cffa2edd21836bb2d4a7effba7c99557e14e589f79d6679eca9682f1ad1d2a502b85e6a682f3baaf030bc79814dd5cfb23a65a6cf76895f992fbd935f4d3832a668799d9c55ff087c8f07cb4faa8446f164ba5868164d647f95818287bc120077f3704d6a92257ab6947f809c13bf407ea1f26423f41dd980630610e391b6463c8076c1474e267688f1dd068b5a8563bf7b465d39d8ec1ff8f3a04e0ffdb4fe1612ade3cf00abd10010af1570a6c690eefbfaf256ee7fe32d5c6489f9796bdc46ef0d5cbe7728e204a234d273060f61c74b0219cbe5f3d8da244412230276db2585e4839d71f58c2d0ae270c02b9503a1ddd54aded0afb711f866c0f46a4e62f184104eafa95e47872f3b482b3d35beb1f62fb1a83d35440b05395d0bed173b63fbe4b554f8ae7dedfaf9b0c4a415520446e8a6d93b55ec9c418a45dcc9ac5850b2105d813b8cb335e6419e2b2e1b70cb20c928cafe61c73da6d28ac82316c43db0cb004c52a833b51e6fac2a23c4f88ec53fbe0a4ad71e6e6729aad5070fdc393ed6058b627b4b42f407c07ecf72ab91c237b6345136849661a57ae89b3ca933c68dcb8c5bd0a549ed900c49c0086bd60c3ab7f5379ff5df1148f98e64ae1ad1c24cf0e6fae5ffd9eb852a718df05ee56dac13c675092d7c664d98641c83d45c39c913f9b063670b5dcc9c5adda2103bca43e3b2e36db3d3034056e672c5fd5325e193acd69dc82c58b366769484d6fc2efefa31733418de6b12c725d15277a975623540f84d409405441ceb02a3f84108e8b17712871e22c16243300b42462384f391027f3e03955f4cfd2dcdbad39464a647a90755dcca10644858434f2a12fba3855200a6d8ddee54fe960e70195f3b20f5107e4a1be91eb88f996167dc6e232031b7bcbc85aea537d5907c2c2ac0fb13037b96baae283f6e3577dec72e23adf2de724ac59f52d44ecddc1b6fdac900cfa7528c8371e88296364d2a02c585638f1c759d942493072717e875bd3accd7c5b431045a9ea9900b9db2f06d2a04bda0088f73817ed04b7be29370439d2da35708e2898bc5d1e8434a8b4b012d971087269393e6fd0945ba1ebcd4c687c8ca50eed0767707f7c8b979ec26d2eb1f05620381cc40c537248f49b2785f133cb86d397b8257640dffc276e9462cfd1dd4233f7a95cf01293460543bbb6342ae6c798b95c94838a0bf01ea961453bb899edb63f59e6aaccaadcd2bc98bc9fb30166786921e809f45be7fdded8f031efaf70caa77b06b6882868ae0474c4ffdf190f3b364e3ac4a6fd9f9c1bc2274bd7232c10e004bc03247390412130923c92e5c3dbbd13cd8f8d4598ea616448e8dd4f8195027c241ad34a23ce720e740fd702af0cab783832304b91f2c2ddd14d68cb07c56eb1384768cdf40fc68b55a8eda7e4c05d89475419402b1c3faa212fcb3dcaf9705f55717b88629d5bc7dc7ec3b4b82a734fb62eae974ea7ec1e939372d3fd6843bf3ae60c6fddcc7953a769f7c28766dd1a9039caa2b6fbc75d40b75d87c5c1fb91bbdb8db5000978ce03f7c78aea767600cdc74ea6ae8bb8899979a6b513ef5add17b2c4aef417bf8ef80527fb0cccfd8173f562c66603f99857a2d572bf5b38b7615900ff334b8c9f717c05a30a041b31bfacb9008957f44679bdf2e8de7a12c28739e0114fd40ba21db041860f5686f40a2817b86984f6095d4c63e513550fe0610ea3be5880c43d8c48740ec34b0389a0aa9507f10c7c5640a1e85c852ee202a3dc9546ea9531e90b25c14e3e0b16709497e9ecf5888ca573b30f9f4e5a4f4405fd47fd3a6cfe3410ce724d1baf3117a5b6c8ccee50aa282b8e1b745dfa940e07fc8a8af4d2107f3d808309822774a502a8c774d0ae71b19a077bd704211756babcda608e0d080da536d642428221ed66d949b4d390b44eecb73a7ddb30c66a11f7717f70800fbd11bda5db75cffd68c001d2e7b14fcbae6475142fb33ed76a699ae0c5c2ae54f8c2b25a125d1936e9d707b0c24dfbd62579750d0d1d3c0a92c991892c88caf91ee918e458fb27e1e2fe6b462c873d84e37983fb810cd76204e8d328759a1327456b38336c22e0f34b468807ca5fc79946337fafcb87b06ae8dd93f44bd37771d3eb805d997e9e66cffad20ec9390d31c7d9335c652fb9c195d8f7708b7d3c0f394f828e25f5a653f6ef00d3eac410f65523a9448c30b9f7c8a7752a078ea248be98036769a119fc97909180385d6dd0b431add4d463816ffbc5b72cc680d2b859491499cc680474ad490b7e030ad92e20bfa2003d6f2e5614304cbd4acff73a3565a6afc5e832f9c654a53c645eb08a7ef13a635d5402fc780ac0dc541f1c593a3ce01e5b09cf93d664215400d3fa3f153c44f47e50ef988c73b4abde12e46d3b7b9197b6353204f19d91a309444a528c9937361dbf0f4df64a1e2fbd65ee327cdf5a9bec94996d30700aa5ffb25d664569f736d85cedff8d52c01f623a3f08b6160a3c6ae77734a1a098aee24e2741c28e010788f0042dec0653dadf42e945ae4ad1a18a5b44eb0335deaab18c19d04060dc417ce632aec07f8c665d8c7f40cb0398b2ad685483051c50fd7c580003130af0f687528f83cad622f55ee82d20de0f0121d0eef55d3cf194d91c074fce47e1e9395e4741021b2218996ac9ff71d463a0f083d3a013d61fcc7eb3efb5f915caf4e7af380fa968448f2f00841d904ef2422db4794771c33aae3105f6c9c4176480313f6083cc9357d424af6e74cc213b8186314a3c6020ad52a825ce16027342e446f59e58c7055633d468e1c6d4d578af479390d9c4bb7707ff4cefe279125a3613fed160f8dcff7aa44776fcc6d3323e38842910ea3497af7e54884712f4fecdc356f63752ecb27aa6be4a6ec6380a2e659be18d4f68d4d9fed9e5a8789413c52171b4512be72c62b9d7ecffce452a63ce3dbb6ffe7274b4ac0732cd900e281cdcd95b5410f126a3f6b0bf1fac1661da073b5d55c5423b6f855ff562ce88c0e48b523dcae35f47ec573b5f4d9a168bd469eb9c5eacf9f6b05743ffc6d643082cccf52cc3a94a793a844fe40da8a768c240b82f78310b1a03c5bbf230ffe3646378690d4687e4f30fc06f5310a1027e570be311b8669987c9257ef5eb7e7bc6850fe0295315275e6a37aafa8b1e2e5f93dfb46dd10b43f4bbf9141b116275f01556668f6c3000d3456f49cec0d7fe65a1e113d5893f0848b0da91b3f1208608d0452362081c5dce062d3e7c303b0b40b26c67c1a64304e8e56e1b921f7557650bad38e59faa5c9d741ae8e1fbf504c067f8b1a4071169c77a23e610dee5d87e52e3f7f2cdc9889b928ef06e4e2a78a1785ce1c3d4fae09febdec70c1fde4bc45c1530a4d106cf83b7c7b31d8b7e1f318520ffab2d78b3a68d7f0d28721c373606be86b8ed81b8e7b0dc0b3d5e51bd3b9a10f1947e31ce1514c95753893f7dff997e8f1087993118763012ee3fbca81edb1d72c413a856f65eb13d7613b2be67efd60bee9022b52cbef3bfcfa3539c987d7232770f142df7bfc557b977dfc157cc3be421948cbd6c91fbff204404172481d9d8837f127e7b7da2eda72fb9fbc224b3f841aa948e2d07989b3035c12451be793239f192bd7718137cf4a065c5e3603687393704326dd4abce59986f9c74c59aa6524f6fb490549e8e9e9dec42894d4e5d7ec5de75a538d320461be86979a201264f33f251c39ed65ffa74c57f7bdc803f0fd7b09250c61be7796b41c5e17231fdd706fc5adab8eaca494cc5f06b205c105ea8fe923273db5bbdfea62c3babffe72e5f49b7939be7a9910c55c8e32dc7987ceaad2c40001d5d458728e6a3d676a4aef296d7c3c255ed79a7e56ac50e9c0a376210be388a8676e121a7bb7da61d5ef0c6fab88afed2bf02e33854c43e8f14f1b7811021777bef2cd3f5d965979040b6e09d9fe5501c1612892933f30d23d529de17ff9d4b4718b645eae623f96833ed5452c8ed039a50779bcc665439e7db8f59fbd1325b36fa741d0079c431c1c1db25530e8cba3a7ce0e1bf48776260e1425014cf9a86ae30fe6c5a3fd0144817d8066da3b393514d49d025afca0c356f3e2bebbf8599632b4df74e8e8c52350edc41cd72687ef939269764f6c45a45a3fdd73483778f22053a1d9fd82fcf549d308a201d8dd126347e405a63851cf5554dd6459b412b3e0abd19f9fc9bb42614f1ef7d328e919991d3dcbc8c62bf7971ac9c82ee101a7eaec4e40398b264f35109cab8514d18ec1add6e04f127ecbdb0e8f34014ea340b18302538d95b8a95566678bdfd03213b0138676c67693367012f0b520bb3113645b62502929a944445cb53b08d1915a850e0b18a2d05679cc5c2c80e6274b638d80bee3f1c67572ac9d4b3e6c6ea95606d4c3bb83ba1e4945c240f5a1913ec683e8e9cb4209e3108ebe46ad5b055274bba1752fc606c2bac2b0c6128ca910499571d3a0b6e4800e42404b5d8ce49128d14f5d402f7a25bf298bd6ded4f8cc1d17bbae658bb05a8b69d3fabc7ccf20e173e5b5fe41d3b55dee8ddccb15e65b40126fe786f84eb4b036acfb74311f884548179b0d88dd246306ee42df5ea5913dbac269594b8fe1a0d8f0c4a39cc402846ce941393a7e4e45b0e2173dc1495cbea2913c46467068f06516dafbc78653be054e8d772793582e80e5573e00339041e4788185530b4fa7747d1b236c25581ab3462a235f4c7ada43f5c032e1d63651a3c81bb45f3c7fdf2311e56fd6f2b2f5eba59daf453d338ef5024141ea92b94ae2e79043088880a099a45209e52dd812415c90debe3f1eaa2a3ee8accfd405b0c06c7057ac396f2f92381b338893405fd2b4be98a37a1a9d89c5df54c54e3e049c2b1f8a42af8a58f0cbc272d887e89816b21fbaf5898b8e2dddc58f0974c68f3248ed9f7bd30b566b478d5a96f127eee13c13b787673953e0713a76005fcaf35ea7d3da343da225496a3634f65c6b6a4c8b8a393c9425af20fed69df27f6650ceb5040cff7d997c3d7e722792722472af730b8f55791ee78de29414a1deeea4462be62f9022771d1c61d30739f6db1bd0ef78f0aba2db2131d4714f7f1760a5193b1ea823aba146ebbd1f88d43f90471e5278526966f79bf03a676a11839f4a83cd80eee6c2604723eeb1b4d4b95538c6fa0067993d4bf8d0e6168c414112698bd7b3a35ec98144f245a99aa827d9121c92745ed7ae8b61475f5dcf69bd21ca4bc90c0038b53d5d2bcac6dc8225a182c671c7a3efec9b7e1387aa14f56bc9561feb09a804797f08a42dee6dbb652e90878330701cab614b1efecc9a69204ab859be2826aacd9a27d579634ab888333cfd319354c7f58c6856b583c536a5f09638506b864146241246f2dcc884cb61fe0463229d78f6f0af3857d09c022a59f30b4beeaecccc0bff4f6663a0e48d7dedcc8ead42ec383557f91d86f1e08b3d42fe10605b22e0c7280c69c4ae670eb61c3cc5e7f6f15c5f9f03a07a71ae2511c7cbe54675926f6b96c06b1f8aed70724122b720203d6b18c6af7442ac29f87d33b666743521c1bf3fd36b5d0ff730aea22e5d664280116832f8e16fd4096f24ff6624571cce426066098d5af78d06da04050bca5b4a060faa42e0bd156557f1600ad9978f52c3cd8e4a879910e7c320b971e61b755a2b930f2f150d9f548377769808a5afee0b2051a677b8b0d4d0daec9bbb78cdbc4d623bee1e224585077c7eeb458aceb118ce1bd49e43c2c578c11e2d0c6421f57380d496442893077cc7f0db3b5421d784c86c45f4ade46ff8a008467e4681126f6e4c912778e0d10f9b7dc4bbc4bbe4a0674b1dd0fc83705171cbd12a9f6467806d10a03b7c887c943237333891c99b03d6eeb0466d608ddc9ba7792cfcdf5062f06be7b6191a6572e1a8195aa1bea7abb550969534f05b369a4e882898b79accf58443d5e62c476898c2dcb768f4f348d6cb36b9aacef65658d2aa0a1297b734990108d0ff144c06ea1e9d3a7a79ed58fa3e1745da88a00b4adf3da41ed247e8d61dd98dff68352a157fae7efa20c175eec2344b088a00e030cd14225b4a4c4fee992c1fa7c64647977ae93e2474945178c9765a649f8f8549305e0196068661061032a37093f304c80e11d44eff503e3473bb1ced4d820253f109972ea4794bd0c6bc76410c1be9429d62d360b8ca2b525bb573c591988ca65452ba3b249a03c7d5199ebcc3ba3f79f0306841bdccc34623b5ec71737d06ae1ad642ec13ee393f4741a33a667dab704be3c037fd20a512b11862a897a33813738693e7920a2484f0294ec43eeda8812b5af0b4418387c53144cdc4d9198b803e933dbf23f6355e9d372589108e12f4e6c3c32155469f5eb601fe8537a67dbff3b3a24155ec66c103aa2979cd852421ecd6da2468c03729fe06b587d949835d7a8d5020d62144657cbe1e8db1162206f1790d898a8946f5535820074afc2ae6d3e81c7c7de63ab55ce460c56c2fd3bd29a366f3979e4c6c1910e9d9c9e4931240f6e8873a63c786aea91d678cd96e2d2400d72dab983c2da1170bdeda68bd359dc2f098479a449a62ac3799fdfc188afd96f8cb74f4edc6ee227c0152dae700c436082842c265fdbe48dd5d43f0e99e8b0ac4c6ac640ff3b931a5db2705a3a1f4ba6efb1a15c649eac8230930abae799eb8e2044df54f474a6165c47953d5e9a0dbdec4aba69671f15c776902794dc8557fa7513a33751b3dfb4499342edea0e97d422d196afac73e35e03dc38e2652961dc4dd1d46273574ca5c4b3d00f5b4c71ff7471e4626673f8cb59a27b9c6c8292c5606f7333a539b7eeca3a7ef2a938220315bfa5bb8f5b882723fb7ccfc19250b8391d431f4d1778dadfa3666e65db2bc5deae4a2e02e28f07aad2764d272efe0a6fdc3c0a3cf3808810eeffb207bbac00b5c0870a07283065e6fbdffd7f7fae1ef12cc9fc1eabbef49f286c28cb2cbb3025e866de0448b8454b7e744648750ca065e95579cc1ba156891bd3cd3e8059d2b861f9485e25c186263956337ce10619aaf48aec5e20a5a43524d1971b6200718c18f9a73b25e56ef73f3fceeaea66a0d3c22260f4886714feea12b51e23995dbdde924e184f8d5544a613e2bf43b1ee263a594f70ca88b33059a1d04df485e573b6f37bce6f62adae609afba7c489b67436e5cf91b6936cfe350441439e074e6a7acb27fcf33bb7bece54650d601d3f3f7fe6637504e5ea989001eeede4d6bb988ae749aebab31a933df7bcf6fe32f450b11b76813c2785ca84399329697a06aba3a4d5c69ce27d3985ed318e51908dec231aa343afca754caa305b714f8df450381e2e9ef5d8a11329228775d7cfa59c5b065f36fb4cbad2c0e7282e0db0891ff35367f512b39308b5d25f4804487e40dd9a00cfd71d9c3bccd5597287ec39405dead1d50d6904ee96629b0a3756f30af27d9ecaa8c937f99a1d70391834e10317d8e00e6cc09b4a253eca8fe42e68e1098d4ec9eca411e015aff630791ba73035858b2d043246f0139fe535fb1baf51180d553939dcc56ff930e39c2bcf6abe5ed7cb15b4c6a13fc95b0475ce69896fe20c6ad987d89e5562804f1abb452f2d9dcd16b5b7a87eaf54411ee2c48058d08073a67b21a935840adaf02496c1ca2c3b618c2432f4ae1bbd3e66b47a516281cba014abd6f58cdb590238beb88544b8c21c8b6b6a0cbccb34715fc85cda581604ac8822a1ed680ba9a5f922850f12b2a6e51ec2da7d557e14d729322db62739129624d114ea15c16027bd9248cd706d73b984cc59be405b25677b91f60d61c3aab7867078390c6a0c7165e6cf1cae47f9a68046ec85d10748fe4cacc3662f60397e856042c68f391de94d02cf0b62b2af4eff67bcef61dbfe0b62f061dfaf74ac383ac6713b4c1657abcdf52467fc4bb1b8bfdc25af84f6286864e1f695fc433d2d40d7adf5fe5f55572304c16a20eac4aa45ed8dc1410f65464b82d20b8587e0eb023324cc7709cd39bfef1f9458ce0a4127fb441ae3a7dcadb5c41e834e2c50b49297bab7df75aa39a17ae37d7441915c82783ad0d8fed51ff672f2c54e77b0da6200ed46cd4bf377248a505066426a17eac38ccafbbd40603a88e4a48bc596858dca7631d4aaa02fcc964f60c46a72e9a9f649e90926a4738292fd77f27696de0eece6ea6e89075843613fd5c5d2a413795c6b646eb9ad866303c9e953a89712ec529a41abd9d105cb0e77fd951a7257d5f668546204b2f128799dc7e662c73138deda8e5dc53358a67044e256092a5445f23be2e7c9dfd856439861cdbfc25c1993d861cc0aa05a2bd1e1a924407d85fbdac9d6eab266aa4082a751bcab26887d146e5ed381fae7f7cea4eef8c619138d470dc2c6faff92a762bc1d3465f041e1ff32e1611b303b2f4e49ebdb04744f8c96793e69ae0d27a915a4d966e7977d33af21b425132ad6743f6657d4cd6a786a7b902bfa01c038af536dbb3b7f0e5dd210b29b3b0d3364d57446d131de5510c0fad9987c8d6e0e1d81ed2a46128d778eca411b49539eb548024a13e7477d9a6f1a6cc3dd879f3cb2c89211594b0645fab966b05188b2d34a5319682b1dfe544a9453dbf4d31f6cdf9c4c2ecc27ffadba746cc892f7d2d2080ed858629abce0ef50d4771b8570b79ac764a3ba03b81436a25f4ff4a9b8bc928855c63fed5cd8679a68268751cddfd823cb78f65d74373b2a70334760bee2748c3d55a0a683e00f7f263924afb67dad80156710d28527310609baccd156f6c99629ebd3006aa8559f63448908188386caf629a05306aad3a0fdfc5135858413a3b296a1f1a75a70e1873618bb23f639d267a00c0363046d1d0f6391499d4d8f03503c4debc0e6225a40f20747ce70d8f2b00ce6cb04bec57233433ac958a570759f7c43842bd0c8ba9fa4e798d373331108f074f319f2b5f2771cea7907e9b5a8d4469b9f8966c2b803b47f080fcb5318abe4a0050d08941f0fbf5e0a20ca4cf4731f7263a1a8b7ed32281303242694f007e9846c5fb368421272e06a4af0da5c452f21f9c10acff627e0f106cf1328030aee69789010b87f1db4796e57f69118c9e062d80ad3f06d65c1b6729f6eef17017521956af10e77d6cd26985e5c00ddd29db6cafbb6669199dafb158af4e34b1a46736994323c3e2c09ae7f9340f955494e2758e5e1098967b15cbd9f46058f3ada060ee40d7191ff0930371c6c8d9fa95d593f07f1c5fe1612cb11d00d4b26d343b5fc63548d41007f961f1434dcbb0b6b9562e67deb7b13e40cfe5f2df99c26f7ea7882cf71bbd092c9022231e52feca39781e50e03c8e08e760ff9d9a8efd41f82637e7f93dcf41ffaa7276dc09a91f4ff23c0fe2c1ed4bb5b387ec18809fe5908b283064db48a392f60e03b7eea7f0e12a6dcb5c38689a8b24fcb7eea8407b8aa97afd455cc1a4b9ddfd30dde064cf35ccfef77e8034d494847b305d9598337baf0a386c909e182e67f75bc9f57c58398201a794c4817d3837b580fd4101767ab197e8484e8875ced2d2373bfc30c1a1081cfb74b6dc68046d9cd784d688894cc8d5113b9d1196afa6cb8a28df82361c53300a003000a001600d000202a00800316e91e0f0a564ffd00da939301c9295966a752d0822ff881f14a664ac5b74fdd6f1ad272e38b9576c0b4bcb3f4fa1715eb7f21ef2e4bd77cc0ec89d302fde0a587e1ff9cd07a11de95afdb1b9acdfccce99f743c7765aaad2061437e72fec1559fbf84997b9d05a31708f52d674c775fc479f78485597be3d64d87668f771ea4f2ea9ed6e36783b110b3134f1e12c4bee6e186aaddd9509c5ae859f7affc40c4161df2678c50a5f8a3b43b5586aaea1200dff9e224c42442a9edd96b1302e7ea5f1284ba70357eb185c25963fa94823fc17609e66266a5707ae96df9025570d34c88cc0fcaf6abaef588bded6f29d3f22e03b579db8e1aa0bb317896db3c237893a0323d9c7d69d6f232e807bff04590be0a8fbd74486dd8be2468966ef68ae1117ae4003cff53facbea2eb97aed4c0dcf57b225ed0c3356be957983021d41c14bba73a785a8ca7ab3fe8f0c3889fb2c7a1c96cddced5e6040f2bedcfe41e98442a4683cd01550f49939b4048b432009d36ae8b4997b2bc783546bbc569d8ce64c761937b151fac08ca1a091da6e21a3ea69940c891facb6d6e7ecde2b55a439a56290e2efe33ad89a10dfc97197486f74e900861d0caa6e747a47f9224d33b9d6492d87f4bc42ffd9759247add2f39080e72e8e01ec567dbf83b708d59a351ebec73433a1a19b79e3f3662f3b8ba729afc4a57007e80f044bc4349a880616e71f1c16002b6eb08f9f01a61793b8c133e1f72f1195f30a8a7db4c037cdd850fa1f5014edbb0331863d1692d65bb4039d29d812373d4896f70420bc6a3744cb43d0aa2d5f4f643997ad4fd98cf81081545c2cbfbe90635dae8e75eef2b695d77578390b350fa1fa4b64f226b4be7c54b066db735e4bb027b6e95900091be946d33e0f37ce0337a01e0b001e202d80c8e6bd3d47d89f7585f0b668d5fcdb66a48c0ec63a76ed0766d576f695e1aa12725a40ba549b1bca02a5a9db5038407ecbfa2f05aa8e62f37bbec4ba2c60b43b29d5c3fed2c8ed617cd6165afb60f3696f04baa98647eed8efbb8687523deb0abbb48a85fc20047d12f629d84826dae0a30c7bbcb3bf3787d186d86d9c518718dfcb49cba91be9ce48fda10fec5a78d40037fc7078a23c59e32c8f5cdea85e02e24d989370ff2070ca087a1617fc81867bf855c986b26163deca5bc745f4a25295a061db6d4819d8047cd5545dc66e67ecc24af55fd00deca200ff46dd0c43aa9383ca05e924dff743af420182621c34a3b465cb7b5557d3cef8caa1a8827b1795c1267ada3f2f37a0ec884daccdeb1ee61d61edeb3677d2ebe59f502e99ce9ae652883786c1fe657887824aed13fa852c1e0ee5c4706d583a0d884b1b2ee26a030eb44e9863b5375823f4c12b980dae77dd7c448a0228aea726f4e5a8e11759554f8e6f72e7592acd47a1620dc3883d4af230ca975ca87f03ea13a7569f4aa63687eac28d6dcf83966a546487797c452aaf7d9915a649d01f690bafd8d8558566bad9abfed313e293023d1490207ce971d6d85742566568e1f08a802d70f4f2070acd5e2e8f691b955fce22b59fe94d49bf9817a29c58c74b91a16c5ee50ce7bcff5dd5be05bf250698626f290b9d943fe319d563bdfc712fab57ea2aac38ad57236ccfedc378eae9046b09527d02b5aa5ce8ea38b6b3586e6efa2d7224ab0de5b2f36cdc05d3bf5e6f9ad6921d1671918b8653033828fea71a9bdd92a4175f42c9f634055cc4a89d950e6809350dfe8940b137b3c832672ad4e5664f9ce7213e3848e3f7d5ee88be2e9fc17aed09feda48a3a3a1dc94c9ca45ba0e500f9dbe231e90bec78f91b89336eaf70a90adcca493b67b44c37f8fd6a7f21afd06d6164c8e8af28c726460fd46ef795727b8fb030e5230ba72312dd9abf5ffa5099c1d3d156e1ff43ee649857417fd628c53ee78aa6b8f7fe23fba21da1bebaeaf183803f4dbc7e4cbd9ac0f34a9fc1aa37ea20bf8e78348beadc665d08a469d3d40ed5c307a17140c418ece6fcfb70aa1e43feec6a49762c3504c7769f27679e5fc682a5ecc6749acc043fda3674956f67f1eedaf65b29da8bc899db6d48decb44278c3c0fe17de1b663f4dec396d5d5d1fd352ffdd5426bd2cfd4fe38a026c32314c11deaad8548ab284a6c20abc53952dff633f99fc6163e15778f72314984d5417106034b0a671ceca2ce9a2dba12559014c2039c19c399cc55a4849ab99c565b14b74c0564d2c49f04b910054af2c500516ec8f22538f1456e06a3f88e7ad5f3675bd422fefc03405d594171ed4f9684958f092a8d16c987c84c3862b900a46b92444dfcc108ea44e249a6568dd0b4567ea70f375a5d98c25f4b9ed900bd76eccaebd9c376ea35bd0e073ffb2b7260509f3fbdaa26dfc1c1ca92c0b6f581078d86ada9f1a539a5f36e7f587534fd73078eef37bcc1baa69253fc724d6336c7e261369ba076b2930f708615e32e6e52ee8258a0390d242506cb011c85766f1111b00eeb07a6900b9c6b44f1eed594386cc0301d223a919cec928f18de709dc7906cc6cd4ddda0bafc40e6147381413d96932e97f607c9067754bf0ba9578bb21363e445626ded6c67766f33deae67cdcdc97571deb4eaf1901deeb8f8460ce4e1830b6bd58035c1869862e5e3a55ae10387e61541eaea8d4d6b861e3d4d4b8aadaff30ced160074544f941648e41b72c165d3160538113e7d031de33d89c4aac68c714c13b32c5ac1a8673028090762cc6bb893853f5e2c5dfa13e9ecdd6cf990fad7067c60194b585a11a5e68a767bc8e2c0f0da692d2703e6bf1044a329210dc9335291db43d619a9f94589665dfaf5b59adfefe88004575dc67276a00cd40574ce6c608f0b963d53801030f0323bbef84767988951bf0075d5ae995f86c8affe0bc9898e33bf4496d10e00528e30d669095d0c0bb68ce281ff04fb968bdb2263e8458ed215dc3bb682c916b70531fc9c1e0c157859f4f8bfe18d65ca7676299d2a06a3aeb1e9829a67c904902eca0183f5aaacb1a14ee40898651aab968ef6b3a3a94a6b3e86b8ba60318c08721993225d72840d7e651f5f014d87d6d96e3817a3f9cf899a8a6f40fb39287c8802825df1d0e0cee488399646f1f78a266c8226a73111a6d60b32de2cbf0cba142a640496f90a72b44df20bb41a179ad6011af9bfad62f4f5681104eb31393280558fed38752617d6d43eb2b7a02eb3f50261f4262225a1c49b4bf6ff3f6ebd6abf3457862c8369ed1506f1715d2a901c633af4cf378f757747ed57ddf2c17c445b910d7f6cbf789cb609754c21beedc871aa5ded75ab19f994949d93d06b880788353d908854c21f7607480384b0878fe0d2d4bccfb9ac9d7f65d318f71d4524aa5adc74b49306d200cea4952d60af73b817151bb5119effb0c3bf9429b77c11b19087e89165a951b743e7a9688a7c5a04d813d414c90c78dbdc0425c0bfe9f1293052ae88df1b9a60bab5f7b883ba0c312e234eb026fc0c9869898d982a3ffb2a98da8be4b5308e94e1cf72938a5a7ca0034cf14833731a4959cd18aabb95177cf4c8a092609044b4dd5ccbd49760b6aac03edb8379d53283e0e47e5719b7596db74f6d946d72a6b2b523ad5162aab117132d50ba338c69be3ef4a1f62f50702c18eb62971b8fe5a746beec7b0582c8c127ae69b07f7e6a1f8f4621fb8c1b43b0d157d47f948c1a7b1250c776649ccc9b3310f26110ace85c76a04db80604b6dd06e40000bb691e6a3890966dc50301df01ef9b2c3d2fc4f419f7d72d711bfb9d68963a972859b7972e1a0db3e392b576ca6e23147a232284ecd9494a75bd0e3cdccf63bfc7bec32404e22524557ac751b2dc6aa33cc3929397ec75a8d290c2e0a82527eac5b62c43e3b384ce3eb5dfebeaf86b55fd457161df2004d4c8419a4b3d24becc1f17aa2e288db63b55a96b3416d4a3b2bfc9a6c6bb8c7c1f1cc0a94273161888d07a91227387c33d240b17fb27c8a8071ade1f11b4073e6e869efe27347e52aef54cd3d482767a30b846f6863c0ce6d6c026d835300db594635392134032552511f85b82150d57ab3ceb49c803916248c1ac1cff59c1cc29504c1017d1d7b6789eb8858c545c2f43f8493a4bfd3d9ee9894a5d6cf8e5400f8f97a69414e680891cb32823e8113adb154ad77f02ec3174456121aeb04d15046018c376791155f2e45f02f1c3aedcdb5dc9d3582a3487ccd9a4cc71ed0e22b41079b1b70cc380e5f47cd0d2e627368287346d0efc433084183be92fef49e0cfea93d7ad341f119dd2feec3d19156250b7a31133e812511f34dd00019c5205934c22527f2ada2e0f99d875e3a90a0ca489fa42ccbd732aa3c99939183dc541223fd1839c6601ef004f51495ce73e86b17cd991086d7969f2b2768c1bd5d72c79476d491067443438ec60548737cf538081a99ca9338353b5600db9d4a3ec8b9d0c568965908e8d44f3467aaf654f592c9b10ed32b65e690172fe34828afe285e994f115291396530f30c82e8c283dd8a8f1b60427a928fa3a756c19a676a519c079f0a573d58551edc3dcd2fe69c78cb735dab07decb3b2781e6c41feb573e1f823ee2c13dae7e46444e892cc49ab1808c3867bbd6ca0746be316138a0b7ce661a87d183b083b75b922006caa161c5c08dabc0da06a64a4edc96c4ebd47545f378e40831468b4dc659a272ea6ad15b7e891c090933ef3371d9166b7dd71b0c4281671ae24bce535ddfdb13e43d64d500b1c1ca476a362e189d34ac6ba856c5e6832fd003e6783fed439026c0d2eed3e0df85fed9bc6a4b7f1647f30047706e58dfeadae31d0ba81d5db7c2354bdb3dd4f4dc8c6448a9c3a054a93268f4e1010f08a3ae782dc87c35491ce8f784e11da89c83a80c5d90e3aa1a20cd9e38d46ecdefebd25838864d442d26409117168fc07a14d71813ca0313502a8f3f9935d3c0017e56a77edbd19147296020709ba08fc083f94c955b36539bb7bacb187167b80792442496a923d747b00fdbfa5bb9d3b7bd5e38b1e4ef45092071a792891072e8fa20f96ba8cfb69f2ed636eede3227367a7585b8bc7173c4cc0c3c42368cb8ead345bc02da557cf3d585e7ecf2b9deaec73d19e8414940321241588fa5026fa438788866a0734a6776672d5cc0cec3d5f2edb3b9d65747cc99cd0b1778e4d3303cdf2f27099c3c0325f1f9615e9cc7f1cf378e6ce5c46c7d7352f121daf79915c0900faff7a479cff577247d6d21d64eeb863c97fbd77d0ff9ae560fdbf1c2fff55ced4ffefe424fd57b2cb11b297ecd0c20eabff5bb5a3ea2b931dbf7f3b68a6ba3a12f0f55647ae0e10eac8311bc5af0fd37155e938a2038239103047d57fed73fcc431234e135f75712c90030f39ccc831460edbff5f5d1c69c471260eb2da0b871a38bafce01082838237aa78c3ea1fef468c7778c7bbba07b41456f91e73d58d2c37a6dcd0a00d30da30a18d0dd810830d16d8386283c87f25733f9dc6bc5c6692e293dcdae7eb3db4e7f25549dccfdcedd945eb14cfc0fd3b6919cc6d1228cf3d074d1d058e01e05c8143548d7047b27e6252ef9c797127896bc2916b94fff5b5c61035b27e4113d79d1a55bfa3064e0d9dbe4b6a9e9bea91a601e783b9591a61ea2b0daa3480bebefa0536bdd9fa7f73555fdb74d1a6375c7e466f92fe0d7d34e2fc1f41e38aa28146d2ffde261a05fcffe3805863cc773820d667d470c6ec8c0ecc78f335783985555377a798986165860a5f6fb51a53c5ba9c1913b8d17243839b10dc7c196dbe5a736f6e69cfd645310f962f6b5df456a332b294b15406080878a30e297d66afd2982f9b1b78e0c185b26420800c27c858818c236db4da00d1864a1b2063dc31069c31c08c011c2303366cd818c18604362f31ecf8af3e6c8444b7aed1a8e005c2f4595eb39f48b1d8cd325dbd63b1255deb144669b02471faea7031a64aa7348dc26ad944352eaf2e9b99eb74e5dbda915b2b064e0c08b4cad0eaa245b4c6cd9aab355cd64cad317280ac034c1da0270c337e08a5d5ec3c1b199dd0173eb9e9a22f17ce5d1d1d69595e1cacd67307c7cb474b751f3b0e97b94ba3741b0ac63b5dcf3e8cf92e5896b7e3feffc9ef8401465613ba4d30ac4a30a66660b8bed8fae2ea79367b5fd88efb1117ed5f50f3dc6ad0d06825d550a971a901e285d6bf17545e3cfdd71d2f78febf6661bdce9b84acaaac5e9652175b5f499ca37c971878bbb8aab60baa97eb76d105fdca05b9378f7281f55c503d142e92ec6c01e7ff2bd98d6c81f5ff556a8baaef37975b24556bb7e0f94f03e7d360a569e1abb532998c56b4ab15e9b053afdf1e59d68265794f4ee6232da6ba163c5968fda6ac3d77308b25b2b05f75a6dbe4bc2c807c182361610725710e8b3075ebe0a51a0baaaf583cfdff6f2c8ca071534ddca55434366041834343bfd64ef2bb737ad3717685d68cee4a7c8597285d7e7245ef8a0bac00e3bf623ca356dc6085b642c87f1d476b2d76aa028c2aa8fe2bdff49298ac42c97fede4ace451aaf8af5055a854a17a4685182a6cfaacba29d89822ccff578ec9dcf53ed2f593da296c53e85ce04c0a3752c4f0bf779a16852e8a09b0f2c052022b0b16396ba2e3d010144d401100282e140a3cd1e68584fa130738a184134027ac13449a98a309ad87a242c76ac926e8993767ae3843c3192c678aec1860ebffe9489b68ac7724744442ea2b65800898d062020526624cb8aec6b8c2ba0ae2aab6441f4b44b1b384124be09608a2841925a0fe5f08f338fea12f9779713566855e38a11ae47a9a29591ab34a3d738f98a7338f635fb7424196ee68fa1c7137a374bbecf962a9ab53827b26a9f1d8318f6325252a78592c762b9ada4637895c1240ae7e717ba769b1d8cd8c16334264202103124596a4658931797d348b7ba6be74ece9cc1b553b62ea88a32388bcf93b79df298059000facdeec58dd600582d50e01b42040553d3a72d52ceed72816bbbf608ef69e7b3717ad7c739d5dd4c6a8b975b9b9cfb74d23dc30228d115346d022ba28224c114f8a08abc5fd5aa1201f1b2f771b840b72535fe0b983e70e565cb38bee1eecd22eaf06f5264fdc7f9ad4b8a9e30ec4ba4c56193265a6ca2c512a83001158b59b3b445461222c113a4368e9f41056bf330497ff1f62082021dcfc5fed08c1e5ab105688255508325aff64ccfc3f991ac824fd7fbdc11c19d74e105a40bc1404d54e1049fe7f4c9cffdfe7183463c8e43154ff558f791ae31a03e4ff81c8faaf647680a07a2034c6393176ece0d4f5c962b11b8ec4411c259391b458ec46d27cd8a4c562371f36f300fe872d7e70e107a31f787e681047b94cdce4030b3e3cf940c364852153751800f4c0460f34f470f64079d88287137818daa18d1da8f87ffbca26ad1a197d3a20ee75cc77dd8773b02cc9cb31df1466764cf28e9976180213074c1260b28041327193ee0bdff982bf4ca043153ae8a0c3eddf87cd0cc47a27073239ec7278e500e49f6ed3d2a0e9c5031cf6c081091c64c041041cc627cf5cf0cce932effddae80d40dc3075c3941b10b0818d0d3fecd8e042b52f17f6ed8eebb9027db8675a8bb3e1470d65d400a686df7fb5380a47f14d69808306313450d150c00c59cce065062019f2e842063132ec6428ba3f5d2673ce52580d9e395cde7e06cf1cdd669510552d544955415545a90a12039a188c88414a0c406f7d96c2acb61416f3d11faa712e667bc71a0643171892bce0e685245ed02f8c6fed6e53174c178ab4a0a6053228b430a585a11682b0f086ef1d16645de2e8f244972532f89d2e5e9ecb175cb47009dae14264cb165bacfebb111f36f316ba821d2b58b1020b2b7cb002102d2c6861d2e2da518105159a54e84923052f290420052b296880821d2850f15f2d7f5d9792de0d0507042080140420446507950f54552a8969d5874d9c3b61eb8434279c7042d25f18660a809a9d009c09802e000fec98b08709624cb0b5f2d2ad29edf9eef26ed39789bb8b9ab8290b145978960c4a18a3041e4a482aa1032c6760c1fa7ccdab71b9db5876825004b30461c121536d4c113175c314d554d15712e782d707abbaeec3666ca6c4fab0992dc53025b0d8ee08a8052c03840262f0ff3158b5b6779c0f9b198731dfc9e898e49499e7c691f9fe2ec73829a0ffff73ebf4f2ffffeafd8c72fe2b812931b199f55f7914f36be4668e316d5f03663007c41a87cd608ea4e1cc6f64c6e1cccd7e4da86242583335b3c091254c35739991b29cd546963b4b922c40be92b8842d96c212aa4a48fa2f81ab81c5eaff93b0f0d059504d904bb0289cdafaaf98df5e96d77769309c9af2f23f65a78404734031802c84c0df3fd055cbf2fa3adddba4d966525a7c2b498579a9258ffb792475c05712632cb949e7738b93eabf9e40d59cc2d96cb3dba1994d093a9cb093397b972a77c7fc5696e7ae93df25e07038d6bb5bfef45f494c7b374eaff4ccac6d57b45c09fab9c9a56e9b94c4e5ee7aebb6e6b34a86bf2a0ed35bf378b7dc456d29fd4bf235092c5bca3b73bf7047b17f9df274e69b735c37d04c6bd59da69ae9f17d6c7c29f8824a389803758eaa1dd998e8cd5294ef5e3bc7529787250fe5d37f2d79f6521496e5dd7217d54394ad5abacd282015eb4d827944c209ffff34db8c9ae5ed32fc0bde623159bf49b25b51afdf244ceea3dc940be839d19ba147ebf1f0e4e0e9c0a3c20bdac5f9d1e2acb975596e3df21ca9716ef4a9758647a51d98ffdf25c16ce01db00e47109259ffbdeb8bb38f0fb526dff5ab336de4944e8ace486e8d9c0d39107249ee19d789f05eb943f787edc262b11ce0ce0871070871617022e08258d9c38a15cc0677f98399fcfa6ea71877fe7cb7d77b758cf57e6985b27ae3283466cdf276e0e554679f4ad22324e6714b7d6abf3c9ea53e40ec4387d47dea3649833a1fa94f235aa1ec0f85b2b7d7793a5b91b242046a0d9497af3f6cfab02e77a8a1ff7f4b75de65cc7f18a94a5905032a5c5099a24205c99433a6bc306584294323c019a1cc085446d879d2aa50169fdcf45d12fbf0ad665c4d9de92eeb4b2994d5653316b354f0e9828ac52c151d27b7a9bb519e76788222a58fffeaa27c5639d6c0ddb30fc9d7b30c93fb88c453b7c44c25e65b174ab1752914f0947a86e224c67f9d39dd9c8e38f544c9238a9830cacff24b61bb5cdb6d4ad238b6349334da8d707c7323bc8d71eb12de8cc29baca98da61a6aa7dceabddb556fbd7937172c390e9663c799efdba33d9316c7bb39730a6b29cc7fb1d88dbcb857e66bbe9ae8e8e42269a43e374fe291678ee3b2be92215398df6da6a9af4c400fdc5a0ad37f15818cc63f8ea5b69226119644789a8900544500f2a1cd46c35732e36c08d4d8d4ac086b586a4098ded3b684c412d5925e02fa587f0529bd51a2416904a520509480c2a5c248de84e39d6db216eb274b3cd13d59e0ff13f8f0c9014ece70428493149c3439095ea0595eba7b79c78a6b1e6dcf2151589fd919ee86b41e6859425aa6edfc7f0c86ebbb4cba4a7a4ad2811202560821b83e98e3bbc95613344daa824d9af03071f353d7c7c40bf63149fa0f320182e4e6bf6a1cb5790ec9cb77a4a719920e3dd23afaf2ff7db7cdbecb232323378cc2184d31d2998151cf1da43498d39bc463e79bc4313258f6d059389332a3397797785912b524b6040310b4fe6b4f4fcfad5663022129048101d91ab21e42991559051f50f1726d4ac30f46f80082a233455bc2a2a8a29ea2204a7aceb775bbb414d6d343af92590c8f308615cb12c66e1506f3000b0f82a107503c3820c913611215ea8be2dcc5598a73b90ee074504407be0e8088d80889b2422217be9eba7bea3ae6d61acd3808830314420ea6381832b4c5d0008644181a82440d922d2192a0ffeffdfe28ce71939e3b6871bb8d1b427da8b5f487da20ae772138a110d6bf9097ff1a0a3d09b978fc066585415e8292aed9cd73cf80f8d81a076f2800c180747e041e39e2083f82a4ee51771b977c9bd7d21ded0ceb0b35090cced7cef386e9de83fac25008614d962ecd926eb4898912ed469930d594e8528d22318102657644991835d1924899109293a7334fe711ebffe48d5575b43fd2ff89f3b5bf30df3e170deafb1366b77f7a0fc4bbf087672f853e702ae953f53ff3b17df5e1f97f655d20c7e42c7c51e5a8694467aa8486afa7af7c53a1dbebff9f977bcd850574bd50cd9e4b59d1d4f515d152c4a988920dead8a08c7003321b3411e183c812447e4490febfe3123635654a595efa439bec58e6a89a0db223ee6714dde39dfb0e29c09030e110010c5132a4811e37c21e227aaa843d409ef6b3b4514a8fa6d01f3ac555ab18766948efa057140c2d814285148130833032a0fa7f4a474b61c172f3607ad311030f3058e002362e18407881ed8208849021c4082150421c1823b4404d688196d002a6d0820bc20ab0082be8153c5500840224420ac6841448a180011e2e7882b3232a31ea437ff02e97b49b3956edaba9a976a4c9ba8a58ababb4c955b3e3d854962e9a7b367f2f17ed14c6b7edb69fe58f8ed6065118b5bb7cf99e1569dc03ea7c7de1046e3e9cc08bc98d7c38416f827e811f7c28419cff0f253042825e28c14cdc0ac5abffff99c8e57f168abf2ada44a09ba813c609432d8c9b8464be29b4ffe3a74eb7c390e73fa82fad4ae1ced6ffbf041fee68853b56e14ed5d71d9beb77be2902381170f155262b9ada463257eeecb9b343f0e667101ca0f326d429a383756ea18e90ce030fe8f1c098f0812af505d38d30cb64e469a781588fa10354a103b6d0010dc206daf87f007cd8401a0d50d1400b0d9cd04053d8001006900819a8aa2f1bc451b8586c577335bd6c94beba111285d50e8391e5a6d66673d55e40ac5db41b099a3d77769be33cdea541dd1788024cb840090b38850b1c102a7044a80009a102b250019d8741d9bdd3342ae4f599b6dac2203b0c32250c127ac0411092da010e81680981140199204c008e300123c204aa9ec952582e4c20294c80e7bfd69e3b7b8880508840901001044200688500480300600800a010003e0784718055b52f26fa439f5c354b71101dedab89c95a8bf1aed697cbc4bcfa72f5186c9be7a53897ef0fe3dd2ef3bd9bddd0003d20f8d080364203aa080d20131ad0141a208605c829404c580094f0c71e5f7b13fd9d662c76b33e6b4baac4c992fa863f7ae18f26e18f22e10f0ac28f23fc1dc2ef127e511f73fa78f34fbc3e7afaf83957735298639bb3644e057320e0e3007c70a99dfed0266b852c85551826b70e669f6024bfbd9e3b3bb54da40bc62d138c52db4403fcfae868fb2cce56128d8305d3671ca93849ffb5cab1f535cb81f5726cf9c7c921c611a7963b0e20e29012c70f38848083eaabe5b1d8367376b769af3c0783e5b9437a63cd1b27bce17a230337b2dc38c18d1f371668c34c1bbb366e6cf4c1061998f34c831948ea4b06e99847dfa8738977b4dab9c6baa7cb3b1aad5b6fbbcd5186b1e4a658ec46c7974c26bb15f1749eba4ae62e9bcc5d768ec98b7b38d90b4ed6c3a98263fbafc00ebcc1f935b4fed7a046746d8daaa5dfaf71fb7ff2aad1871a6dfe5f8dad46086af0fc63a9edfb5d60532c7623c96bd338401a574f92b358ec66e2591ab4341a78a3554d7dcd29bc4d9b0de228fabbc03755e11ba537ae8e0619684c8186feafb6fb2cedddc45b771c44c3e88c38ff729dd1cff0c08c2d1c745d9ece52179739ea3203cb0cfb66e8287193e5c6ea9fcc6e7a5fbbedbb7db91b9b797d3d2bb90152fb2ed19441a68c5e19495f06fd100173fc63c90878820010c868830c2c3254f851a23c9d6d647c1b356d826883dbdc360d8c71660c2fff97e6ce265a6f6cccb0d1c286890d0562a0214612627431686234a0e546cb072d520b8916903575ac19c01a14d620bd92d1aed63f60aa313149bad198c48c90826ccff66585e80732a1207d79eec5f7cb0ad122eaa2353c009230f608638e30be84f114c61130f800c30a306000e30a1844d27c31c517515f846a9a08d574351a7841871761bc7812666d3d45027bd9209b750951a35dcdba68474261f4655f41364b47fb52a231eba25d88c2846c76b7836c19ef603d93678d846cf48706d11f6ac44f3b443ff880be5cb1d86ee376e7b1d8cd5294d69ffa53492c952f90e29cee76bd33e6b9cb37a96f173c74a1d445045d24c005125cbc10858b0bb808c2c56fb1660b14b6b8a59993c68e304d99344f698ed21cd1420c2d7cd0c2a605d0ff636dad92ab666db6bc9472a099b9ab66e9685f4a945a1b106b6a97ac925da23fd4a6041b5279575f5fcfcc409d0e7613f3ca7387f9d541d96ea95033e39ec9bbdad2213558624ebbb6487a5792e29c35c546f4977b1d4b658143165ab258ca22812c7e6041c4ffaed669cca7fbf4a9ebb3d95c351af3a1584ce98cc592ffaf4634163c51d0c4f90fd160fda321533b1a9d06628dc656fb4e86e68a2bf20a2ef55783ed25aae48a5e7805fdaf405c2c760bada8590142156b54f1a58a5d154e55204085175464a18257ad893b8ee3f245a3ae198b59badb2e5a5f354bb3c1dc1dc912fb7254bfb7a87e4d199410122a781eeba6d8fa29acc229aa483c4592ff1bd5bb146ebe02b18eead794428aaaaf522491590a200fd35b875184717f19fbee5254bf375914bfbf611421d60b2b0b8bcc7f25b1a8b096604960a9d0a8ee0beaad6732ecbb4b396866992c16d365287e2114c127e0fcbf9ec07aa2ea770f183ef1abb42792c462b7279cb8aa79e704d557276c5f9d7055276e1356df9bf8fdd7739b4d2cf926787a3e03a7d228ddd2992b7e86ea4cd21903a0b906e08275ee66802524135b4c50e193d1e8c8040357695ca1f9aff6cabcfae08a678937d5363d29cbdc97a05aa20325e850828750092c4a24a94a5e58eff2528e8178079c254146125e92302109a1248a98c93223e6ab6dc2516b668a191090d8fa4ade1aad7d4b9133247a40a206246648547044968fe9887dc4ee88080ad04601c014e0cafed19ee9ad1b89d2f96cb2978bdff2cacaf21ef528dde5264e675911f6e59b6ca4a302231d473a8e244d26e36637bb912226dfbfdfd9713afb703afba4f879a4b38fa7b38fcb64b7225cfece5b910e3b9134dc35228ede4658fdcc88a96a499a35e2a9067194b9978c20229b6231d9ef37eb9792b422cc22ac14a153268d32539479a10c07968ea31d6db794c911264f9eb86ab632a92e6a7b103fb14f98d01ffac455b3380546d998e4ec5846c724671199711ce31fc744e8f4c221dcfcff0f613544d5104f43f07c0d85d8aa24e6098146882a2184709181f35fc9585532543adc69bf3d324f644232f4fa82082308aaaf63994d7de61ec4d3fff374ee4100d97a0c1add49eabdf518aaaf24dfbbdd1d637f0c2d331070f0145e02e2ea4320aa2a1053ff0fc4d3ff3b01e17a3170423157525ec4f4fe5f2726898ad991117120945496f7680a939af6dbdc3680cac60f667ea8e187da0faeaf967c59ebf281071f62f001c90707c2b8e1d4e9e5e472da2676da26760aa31406d6431ba49b73301896d23cb8e101061ea2f4b183103b60d9e1680720601000060d982b606c602cf8d2e6cbd5971cbe00bf98ff3e3e58aa0c5edfe5586ac3603152df1d4ddf5ab1b9a5b636cbb3c328df74dcd1be00d5ae83153a78d161b799e84b9b394891430e403958e0058d971fbc287929000702843854f5dbbb4cb72da56467bee948626b39c661c80d5aff7fc3ee06211be8b0c1cd5b5c2c26bb15c5629d7e407fbfd0869c0d3a358c514398b0862e350c551286f90f47031b210d6668508186dfff101a1a98018b19bacc50e5eb8839efd25e5ecdcb4d333020835628830ea10c31c850f4d5be8236d0d4550d5195a5ca15c318313011432e860d609803862560c0c1c0c0e5bb499020e5ed3d9ece96eece1cd69bc4658e5f1d0c162c83e50b48bc90e505272f087121cbdc3bbacf2b5bc9c6c18bebb962734bd9ede482052dc4d1c20d2d3461610e16c2b050020b1bb000a44b01c22e2774f1e1d2e675366229ac1bb13dd3b4a7a5e696c2fd2e792468660da3946faa2487b90b898b932d7a6c59638b9a2d02d8e264853a56c0aabbcc7167b2244fdf6a07ee1586b4bcd1c2464b172d4fb4e8a870c70f2a2c852a8090421cf54561fade9ee9a2f6f573d52cced158497176ec7987b9e5e97ca9de3b5a95c2e6b9353fcd8e83b707afc6e6760a96e535352eaf997f578724ebd8dc4eae221d7632b7d491ec6a1cbcb25b51efb25bd10e67f6dd1b22ca587267e7616ce24e5c96389eeb3e5cea868832df53434439c84d8d8590e4b31c22cafdf4613e44943970731edf4344d9d4badffe0d11e5ce7326ee57f01051c65a9bbc21a2dc4fb31c22ca389eeb9c24ef10513e8788f2ef72a010923c44944ddc71a5b9f91051c662ea8688f22e0fe1424872278788868832ae3c7d4344b93ca5323944944fdeeb4344b963de105136310f87f5ee976796b7e338fe01b7c6e1a86be27c9bd49793e5c63cde71e5d56133981bc27197eb2c15cc54a16c2c86cdcb75960ae5beb393fa52286ba990d804ce64b7a2a87e6f51fd9abf6dca8af4ce26c6923bc692bb4c96a4f3d89535aee47025caeff71be10764a3b165d84ab41b567a048d812fce9b66e6408ea536b6b493c1d2de0b84b2b15854bf375f50dfdc2fb0d3f166caf73571184be636aadfdbedb8c7cb308c77b01d895d514633e35c39a375ebdac4c489765b6272b444a32330cd6e4c966a4ab4b6d4ed91af26fa8a945c94c1b2272aceff88cb5fd6e9cc7fbb97f7776a5add3d58eadd336d6c46ab99e92f47f5cb6fcfccc09c33a770bf3a9d9b4499f9a8a7a82424504102d557acf78c840c721699cb07f57d41599b92a5e2a21c2be5a7cfaeef6d7deda1f9ef55fd7ab6b35f1dce057baedef3f8cdfa7f1e99caa3faffcab3ff95b7e4bf8a3c9dff17776f7ed7b41b773d580d9e0143f90a041494548d90783ae736ff515a7905527eb1ce5076bb475f2e2b927890498864183289fcff6a84448325cedcecd9c5dba58f1ebba575ea2ad99ec72051e7842e8c4ed44d904b53cddb67d602b1ee3adf7acdbb73622ace776adfa9c5dbe526b93f360c6b8275e1bec059e19e7042ac6461e58c951e30bfa8505a6969de71d439868456116a0050b52a7d8855e254d1a14a09558a50f182ca1154aa7cddbcebebb4badb8db8974ce8c94d6cc79e477d72ccad796e71ca11e21415c42948532818018dbeb8d4970c8eb080f894c49395a71f296048a9bf0e8542599cf93be98e4999f91e8fe0deed37ab525e4e7a38b989e2459420a230450921ca04e2ad0af12680db78b340bc01694aa2c98ad85484290b97386c6e1c2e868496a54f4aed3cfbf8dc6a4b3e3e4386d40d3429edb9ee97ab48879d38362fee4c404498238255b9f9a637dfdd4c04aaff1ad4358940e4ff83b960cebcb8d3992d8eed8bcd494d4e4dccd79e9981dbc49ad43bb779335aef14a6789b1788758d4b2d49b5966fba1467a9ccd20baa0a952a2e1fc7becd77afbdb4c4f3d55a7a2989315752bafaffaaf4fbda332731b72d51d2f9af50b2a090f99f9308a50765498502646b2d7d323d21f364ea959e24119fd0cab1b99da2f4e54eacb6e8848b139f131e7b2f2ea948eb342f2fd27e220db869409292acfe6b52af2cf72f842842582184104200a1091c4da2109bb8f05f5ffa02b18bdad7d4f5b96a96d298bd348a4da6262f2672884cb4b699b7be3491c91626529814bda2f4e5389d7d4858482820e99018f8af51faf2bc39c612a5af7991c423258eaa8eecefb652946874c68804233a93f3ff412fcea818ed2b88627ee998631607afa5b05b734a1d072f0ef39b9bd987aa32ee1e904a153ae35982f55f73bf4becff9913972cd9b6253a48342a82c0e6ff65b2de6f7924db42d68228db1fc08ade145151e4138b9a8afed25e9677ecf82a794154b24509d0ffd77d448c85896931e6daa2075b3c30c1830d92b4e1bb031fc40e70073a446210392112e54054428ea8894804fbdfbfda2d7596c26a59ee18a9effed5b2dc3f3af67bc4d3481c407971688c212e434890e481240b24412444840e206445ebf5e532854ea10cc4a03541565f839a7a262dcf6210d5ff2cc8f6ff391168ebdf5e8ead080444f55fe91581aa1c89e3089afffad219783919e4d7d467b9a5ee91a96d1e713a52b134ce2d8995cb57a0ad1689b03e6056db0ceaeb824dfdd77e05935784b96ab97754cf9c8ae31a2394ceb3d11c5db573acdbe2cfd6bf5c74f663f5ffe20f95167f6cfd3cf2e3f249f37a5d26a20f113e4fff7afb344f8b3e406ff3f9e7fbf562f28a4074a1a93c4d45579877f5a0acc65044174f2d6f9f1981639a7bf75f0d887591208a9c453610379043dca0890db46c30f424d67993a0f1af168b592a3e35d31f4a49736bead371cf14897041248b480436248c2154ffb5a7a7e3a82e45af7939e517d75766aab9781687040d59a027eb2b25b3a53ebb6dc92cf61cd1404b832fa20651a20656340842dff8ffba4dfac2e11c6e9bb8a89c897d9857a1b1dcfb578362d8bca645caa04d062f881910612007063a88184c61b0c3a047c4c0820bacf8ff0f5ebca0cb05572ea0a2103942d87411b2a3512c79dc3bf6c2bd3ca4f2285d8ea2243633def1bdbbd8d7bb49a3b51bb14214b0c08c68410dffb5dc9b52d102a50af0a8c0870a441029d8a35a8b710772dccf600efb76a74714740a9c8814bc441e3e78c21079b2441eaa0a65b1addcfbd7cbbd6d531737757d306aeecd34c19c09d64ca0459c60e8ffcbd24742594b652483b8b7f53612253842022ba20440a2688688a5b099cf2b9d16659769751cc7308e182a218655621882b8a3c70e13e24e0ce2ce0a3b48c41d0d2248f32486e1da35597d8ee890fa1a39d6510e411f22044188105481800251e78da86346d4b1a2ce4dd4f9213e50467cc0870754b0b81fae64d4b40a65a94f858ac52c15da7daaef42a13ebbd3dd7de810f10110c4079644076a70a0141db0406ca08fff11caf672ef1f2df7fe755c2779bfa54c762bba9c49cfcc527ab965b7a2cb316e6b8e4b1e6f9b38736f2e2b2a37c7e6353bc7220329880cc082b911e31dcd7626932d90c5f3e20256e20253ffe20274b6801515b8caa2025bea2d881931c896204d82182002c1128178f9aab798801e62024d245042024e0944202220c78c8840504420c97f0fd5992cd28f68de4bf580350e10e200de01444403f830e08c015844034ad100971a05882940271640452c80e7ff672ffe58f3238cf843ff18c57f437c23c4078acf81f83a5f3766d273fd9dc192674aea2b85f671c11c3ce6383107cb9c2a73329813f2a1c587152af061850f217b68fdbf6e6c528bd03eda6c2dbfb406617b04d1830c3d5808f540410f233d84e441471e0408f3a8210fa63c20c0830d1e5ff050c19cc23d3ddba419caeab214ce45a96327f5b9e34568b0dc5ab395668bcb5693ad5702da4840990470a9346629df774c71c70d77ac7007d21d3f42397bc8b9928345ce939c0be4e8d8f1851d63fe6bd05218ed99f5d06de619ad3db3a7278a6f60b6ed7293a0295360a4632c265ba2635291ec725c47b00ed7ffd77be940d32fc7744c753a9efee9006e4dc93a879939707324fd575a350eb135a8349545d458aa19000000500053100000181c24140dc8a462c1644cde3e14000051b47468dd9836d1649d54c81863600600004000400002775171a3e24156cadb10d96309df5fbd43f80c71507817fd707ca2c8e3c1d2c485cc87081f139026bb817ed313d887db583c563a9ebaeb5bb7465f92774d263f8d759f1c612a3d75c6e395969eef524e684d403039fded06032b9b8b89b1ad7039aab78d2d2f47692ba1e789b1137e6601a9be07bc8d895542b0971e36218b2f75be69489b84c1fe475eb70f9ee2f68d428f3f249d366b89df4583a6d4774b7559d03c9bdb48ed737f74ed6c625826a0006c7c21caf0724b86ad3fb229fceec5e1ccf3fd0df78cdd3e6eee6eedee483f8216b7e4a2dd6eeaaed2f7bd3bebe526a482e5357980d1cfe321c504e645716361f4761349d1818a174b657cc657a067877a3280ac2c82cf37b81a2e08cc74e7f20c4ebb55bda8aa05e39fb1f2864b60b424dfe96a000b7f94d84597095048a0101dd28cf37f4742b1717e4d0aa7bb14e47820446962155d27e3b9561af6014400add1ce74c2806852823a07782bd282522c52989188714c5fb60f17be64700c3be4e71ad3e92bd352738e569f5248fde93fbd02fbb45553ea760903b68a5da9b11740df2c9d7b33225a60b18279bc82351f7f7f974a1683920d4c981b42fe32395ec054b2949f6a39a3ace33cd21b2e356352a0a25343403a9037cc39166fedfce56c18b2b50eb9f6b8dbda5265a0e0bf4ce92e6aa0aa908736a8a57602b8a15f037d8171cc42a87db3094f7166539737a90b43a84344dc96d1377cfbc4f181761ebf30d4837fed1d28f2f0b81a23b59bce23fb8fa34a3fc048d61b171cf93ca840a4c69395ac7b4fad4e17b519e9ef94c1f3936f56fdff8441122b00ac6e16696e10909e7aa894156852d1bb91404fde7f1cd93c394617050641433236c309b9e31659f93dbaf9c143e3626036d248dc84a010620012796412a8d6661c6ca4a8a81a74b82e95e32a80f3d7694369ece556fe2148be8bcb1f3e2d4ee2f78501e83e229e331eae567489bfc48ead1b6133be1b837cc62c0e0de3a38a284ae8509a241e0ea0ca3d65b2d287c6e38d0ff6c5cfcba3375cd7cfc2f82f6f26596c900524ef851710d66d278b03d4903f76b00ddaa26ef7fcb507a889d598e915baa8ed2bd0fc63e68aa2cc46d96b8fb92625caa608a42be71154f9808222a06d62f4941b4907235e5e0cb6fc428297fa84e3914fcb8aa21f35eb1f4e3efa48d33287e4b1c525426070d5ecbf09e71ddd2051dd77b7b0d7dedda1b2cbcbb55ab504970ea21c04635b7f6d536c203f3d8a4cbead514548e382222dfd9723479271b35cf7887374495ba6a099ee386472ff770698215588c601b4dba6a8c981967ffbda66cc348bb3639bb1bc38bc1bdd7048808057c1bf480403ad0644329cec5701f92c861dc4ceae7755e8b3596465cfcc913fdfda9e5c348a921d980833cb0aabf0d0af2d233ac23c7f743e86033314c91709ba6756b364ed92bdc9d52003e54953eb85354500b251666f971fad0521fd20812e405fccd99035add92a61782ae43bb93141232aad6cfd8ad71087158ccae296b54447278c839e8536f0e86a55e2ad13e7c86df20524abe12cdccd9d45b144ef69afb4d6b1e0d50b99ddbd7187b808395f77aeb60e6f042c8fd21e501147273969bc6b4abc81744d90005d96c48a4b57bf18b91fe7c1d7a5258fa78b2879d15b9c6491b336d8b5b549573ee5c65930f4049f751bb77edb9bbf836980e34317c2314a1abcec9b11beb4209ee15943d8bff61b0b6ade42d640bd7ebe44ad29394855fc3fe6b19ac91b4d55002d62887bfe83fc7f431fbc3b5354f67e420a455fae7b4f572cd23e2d8a22cdce13765a36c309f4356977becf04e0cd9ebe9644c939131b62502b0676e4b20201db11e5fa8758c84a2f739c6ac1da4462c11ea5d729b9e3a3109166e6da97a247816fd0dfbc9a49a4f8996cb12f007c272c1dfe870ed836a4bf793e00ec2728fc7f1ed814d35f9384dbb6fcad0cb8eb2adfcc713b22b5b6f167a81ec187402bdb1ba080fe264942221a2b9067714f6e71dc0067b42e36b36ca7fb45cccb6739f75c0773b45bfcc395d0435eb8f8a125d7f1cdd1897982fb7c2b5a18919b3ee6e490276fcfee9631ed40c5ce0d822c663d996d823da258e0405d234af66b570e482f394e9590dc7a45afaff02e5bb4531429ab89aff67d69a376a83b935a9ca5b8157b7549994e1a09b8ab34bc5f63f2414f08829a599f4578deee8e044d68354970f442b13b9614a4ae3b7781411e13ad77fd496a91b72490e754019a7c78aa39782a073d3cb5efefa9d2f2d5905dc7873499e343c3e61aed628795593bbb4facec798bc7a4496508809e61e024b2b314f4fb35136312fad3a05e615c1b9eb706361f10d2bd919d7f1ba457288068e3db68386d44569b480dea4d8cb86702440cef39b136f09491398c313d2d8696d268582cadc5ad2df883eaec5d9a6c72eecac5fa2358745988923db4f7d585aec6ecafd99015b41fd0c2e393d81f081665b89158d5f39410969ae340685babfbfc2049d2fae3a3e76fcad774217616dc9d659dd46ea19b43661991db2d885eeca836e411f7ff34c034102160019910e831b48f54bc834c59e19962e952f6fc48077fcedcd2695dd280a687bfd30200ee1aa37c8448a0c56592691e48d459834139723e0c74c8bcb420a655a3e8d01f27b54ca76e627b8df283d809da70153c5483cb63e9801cad5057d7d1e846b512f6efcf1fd9b8a00210dd8cfb2af26287610d0e7096d6229e759c87545c77429723e4b9b1cdba6d30f74b67e46d8d73ecb0640e483c4007b1cca60ce7618a8bcfd7ca907090b16dd427fcfc114f471bfa1d20c8faa9c1d37bc9d01bc9e746a58ea6304698e5c5cc9faaefdb5e0af3de64831f63bf00451cc1bc4b68fcabfe1c62e029ccf3f9d82edafed7b461a2adfd28594cdc9a18e47af01d18fc6c6154cbf9acecec1d4d94be7769cc7f00cb771f49cf6463ce00169763628784172b58858c64f2ae55561ac55372d9c8ed559df71f0d0449495c81f12b77fb3391c31cc647d091c59c437387d3e0c54b4a1d3cc93572d6f4b942e41c83f67f8ef69f30fbf3216acf155facbed553df092374dd21211adf1331561c033774120c487b4f8880993e186ceb209eb0f2ac68b47612e1b83851d7c0ce61f90e669b2e3e364659c236871ff0ff5ac45d51904d0bb8515b40d6cd2c2f9acd54917957ac0dfbe845c9e9c915a753c5c33ce3b6ca9297faf3d6c8f896c91c1a58492b36934b3ad9d0e29898e4353a958e67a98c8c5a5d29c5db1f9f28ad797380010600a83d13176b3800a36f1776b94916e4d9b2b86448587a40c896b1e266c4648e2ba99176ba86e42b251df4d19ac48921d7283c834d02be558bf76b9c06ea22fcfaf6a8f7a3540c46f73a7c2d19dbde919c49c1f6f5ffb217fa421fe838393009cda0d358f2bc242293f1c0268eb2cc6a534196bdcee5c5358662e5ab1db400c9441768d050bd24ecbaa0f426f437e03b94ace7124ac2d667106dc9df2e05923249cd50e949efa52ce557ad99edef7ddc48831be8926dbb9d63299e09a350d4acdcf7034745fb19310180b52485c68306ef97d896f010ddc39012ed162bc5c07e5b47d2fa307974227a5cd3ea77b1351e0913563034fea7429e3f0aafe13a349e4ea1412db71df8200fd5fb4db617c34b842bc1b500a60c53153893bc8c74039ba79115da275b0d949c9f4c90521b9337972eaccc7b2c007aa5416e163665b51d3b22c405e61bbeb2465196277331caef2092e6f155e8b4ca1a8fcab8415f3d73096f305cc4502bbab3503cd0e90acebbffee6f1b5d5cb12c8c37cabe37e2ed497a4c9ca3475bb2a4c285638979b04adc41ea3405475cbfd9afb140bd7f899c855547b425dee813824694dde1038c6f22ab98cf4ae5923ec5709428eb27eaa863dbe40fc4ff665edfad82effbb1e811a7fd2141a9c46849f63063689aae5ade2d51bcdda66e335856cce2e66b1385d372393463290cc4e9a9490bf7843ab38953d2ff9437eb9d27690c0cc955b9ba451ca57a628ccf47709ae496133c905cd751494ee9a4e68ac14618c51c11cb1e6e0b83a90547542073e137bffb261c59008a99f9ed693070adebacb8409c5c4bdbd3d27303f4477e9e2f4a1cd4671b03836165a42d5a18b7855600ce7183eababb78327e1b097d06df400a421d9cb6afc5d5c9766e943f4f2c867d4761d840f4b4e09d6cbd0ee7ff11a93d81a7b4103dbcb8639c4e2bbc198667a3af4413f0fecf1b029d757b60d9da83476a2ae7d4a688b5c1b249e3b0ac94f3b97d71b690398ee64a46bda2edcb2981d1dcd227cf429693721c9efa560e9fea303ae39671d1df9132ad776aabecfb7866319c38cc495ae9568c30100ec09e02cc67353e868ae452f3f8683fb73a630ab79ae08dabb7ff4f65b683e4423ba5fa1abd67126c0346e2c80c77f0f634ac16539f8a994cce7ea77e7f3d21cf518b871277fe1923105b6bb9191e50595aa81c0604eb3c57bc109927363ee99f2c4db9ddb7af2e2bb166aeacd4857962b18ec4e1af6c5398b7e2c97edcd1853dd1798e86900a7406967194318f950c7115b2277443e2daa6d1c028af35fb91d7268857122687b0fe6a8b21c962fb1e371d6406b390313748dffac8394ef2be8e7a8a5409de1790880aba4d90b33f9974800c05cda41e21d43ac572d5d9dc1d3d301064d20acf204e6d44d8a6217b63a8c7b095cfb5088f12e2821d6d61719d13a82374022551b8f6bcc56c1b502b84eb9fa0deb0814eedc76308e83c3d2e493c2cbe96d7ebde5269f457f3511e7efe6aba1db8e6b1a106ef1f64c5845d9d7cf099e5872bfae2c9fb752a057057997ca3a0a203e12308d67fbfd4ae34dd9bd03c9fbc1184e3e866f7101569c4357808242985f5d793e9ad5cf91b69be5817c2f2d4c8f01757861d62f4bbef7bdd043f8f8fe9ee1fa8477ac2d2da62ee0cad16e9aa10ea8a989c909c7c5e48dfd7d5e500721d07a527f4f860ea3c92b3a65223646357bde4d1d111ac009c065ff50e68d6974e32227193e0c0dedad1e35853ef3761b1e029babd9cca9af399e0061643c11a65c42af84f2f8e3f38aa69d045a7f38cb18302b5817eabe5248a8b8a0d5d8a3950abe3ff237c4de42d16d2c614fafe6f3007bdca9ec0d2e57a4e82870a06bb56bbf3c1329535beb2c1773e0f347607daf93c2771108fe77073d8abf04379c17bdd89f3fa896df8890853ead950a3b40b1d200d72ae57b999796a75e3aea310c8a78e7533ce3b9467b9b0ccdef0c506464d5d1c46b7ea7a4d48d721375d5eb1b055dcd6c676562305f499efe83791985f600f54dc91ea511b0a93baa7e73b856ed206e6321a3df0386b1367e058292818868e4bea19f844bd6f6eaf38896e568190de16a487086bf3ac279e482b0913d5a2b4c7d0641bc48ce918d1ba6bb1c7e9c0d58a0eabad985efa2cfe7b04bb23f5d800d0de0ffa4c6c5e5061c192d4673fb5dcbee650739aecc817c64792f6ed9a97705d75d475b0a908aade2948910662f85acba260d617191717bd2f8326d92fb1728e93198d130b6006c25fda320d32351f912f832869a9a6c31af5d04a038160b194a0480f692195dd948f07b848ff42b3c378898d22b7e33d4f8e8f29a083ba70a5ba7be9372ae7acf753e42f5ab88762d25e0810f847d7b84e5f73506562bb5c6d815c74b84de897e8989dfef4330a7c0d06ab5a52fa8fad16913d2df9cea779553a35c2e7f41c6177108fb31fb5bf953128530674d1d37c8ad88b7c60a051af84d8437a9491fc8ca0311e78646af93fd18521f3e609387b117d4c0207c35d0efcdea697cc0ef4c96bc7cd639c9fd21619209f11cf635a92e17fe39df11cd2a0f68d87eacd8967e5a0feda6e7a7b18ebeebbd82e5521f98aa9f50763b981c3551b22762ae161805a1223a55c5e919f2f36b4272c0bc229fe64781a91a46e0e96256754f077e090855b316b7c336060cdea31c33433a5b1c6ca7fb66a2ed8ab44a8c6e5196458403d36aa07d1c7f0d678c632fa7993b20b0880d58e611b801154ded240fe3e649f264bfb04bf377d89d5da43e14b07e113b3770fbe69a3ffcc863133f826537c62f555f0ce22ffc9d84326de3592ff116399453711b6978da7dfa4105a5c2e7518740990d91f297002b88718ec311988a157922a7407476925ff325bffea886fe94e54bf5a993d0d9ea1c02c81682ee1d388a08579d75de603b53f57e78d5d53bf0c5927ad7891c9921482b5bf6892c995e6810109197b42db6f3e2e72f8563c989a865370f050b332209c40aa0b273d0c923bc440dd7c1708ddb98e1f1a3174e25ca082a96607728e86c97b666696c4e776430f37f5a754ea6f5a73648f2462bebaa5167c23ba80065d244cdb18b10fef334d91d1969d8ca27721b25e90b1233e8b44b8e4894912bb698b6d680d5f77dd81c4c02065586147f1be5384c36824d550cce5194cbf1c42d3925fd0cd2e816ea209b06bccbfa55dac3e78ca5a4be0e3f33181e3c6fd9300d9031608c73927e06285bb8075bd946a51785dd4a9c6d5d7e7e32768070797707b9a70d45d5d2c74f1f708d0a69eb50c231a501c6702639cca7f5c09da976f8d914230ab5c5ff788fc1e4a39481a49d737408d115a534c344c763d94b459879174a05bc8240b439153b372f0d516f89da1a804df2b65a78611da9d1ff922afccab36b82f6eb30e6f850998fd335afb9d29e4ece7709b55c7f7bf8f5413a0cd236e3edd0187dbcdc9455eb35bf0bc69d785d5141e92c219ca33d09d64b4c14ed0d58d9f02233dd4ced9a379993c0c8541c35c79c1af4e6c60982dd8cb55899a787534a69c72c00822bd0df36734805a65419fa87c7103fad03264e11307d06e614c1a34aa0884ad300dd5e5308000caa68e812df133ca6f14a8abaa185ede3ebb59041f6c566af611c46d5fb7d2b24b1e0b92d9ac577007b8489e6f41927a38fbd5b8690328c73b8a4e65b65c3c01c205eabdc3207c167e07b08b88a2b7b26b01fd1725cff7774df0920f5b76275d8fa2e0d9272494260db19a2304c01aa9ecbf699a21e7c3f6532cbd6ce926fbd4ba2c3a58be347304dc97f99783cd174f42e53eb8a9e2fee9dd2a995ba554d7d4e8ea475725390888cbb95119d9012b2eeb8e64f749d9783c902ea548d2bb17160b0e9c34ed05e1af04ae9403d7cba9588b0f8eb7684796e4b04883fb5580f6142338d970303248f4af43fcefeaa420f86b4630fcda9d6bef478c15dfc0fb2e733f16cc0848d3660bffc3443543c2c15ddd13e7202260bf07e6070f035cf4de1bc80a33ac174f870f8c009c64a57c4d4e34a3a62f5af16289c8a69550c1bbc7ece2631cac9a2001bc1400549b4138a051ce3c0f654e360fd2c0dabcd50b0b7da3bdc421fd7434b0f43cacc242138f5486a040a41b465cdee75ee1b27733260234e164e529d10e187ab413793dbc35b3a1979ecaf13528bc6e65e358dcb53c725de6e3d370aa58e04f6993298b87adb167187715659b2e85f755dd0648a3f3f5f009cffd81647764e134f8f32cbafdd79b00764ec24b02dc02c582b23fad89c39ac54d531bece98929bbfbce8c08f4adfc8ebc0911c5988cb0df10d8feb99ae89fa8f77e0fad3a8228d2299db807a695632a047f8457efb1e535990aeac15be2d6573cdaf0f0cea54c7f0baf0d5280815c605470119add45f0ba2cfe6af5c18ac63c75377891f458381eb3a14cb4ba9ccc397c67584e41a7ec17ee2207d48dfff7060125a1006fb1a2096e20e94d75eaaa0771c567ce85aec684b405ce200cf429c702508b899c74eecdc95ee08005d0fe2feee3b15b07728535421f9ca401a27336aec80bfceb6872f72865b07b0f343909ee7457d4a96142dceeb161a727d23811c0b71b986bcd54d17977f1996eb6b293b896232303aa8200c3f277cc5a79a465e127647e49134bd2b47b7c6fd1e2ff863dcd29d77363deb15f098ba98d8ab34060ee7b3ee1e16edb09f83953dc9d3202763e673a0653aae4a5006e39edc963045ecdbab1495c2e44b36dcab62694f35b99f3552ad5d3af077dc0f040ad48206eaaaaf22020dce7f33153a31f1f1e2cd3d6a85973b15f320ea047616cf67d2007e6d0e8b924fb660fef00f2451bcedaf860e5389474abdd8f06e40c1a7ffdeb8dc6c189c1fb6c74ee7a0c726b4f86cbc39ff1cdb88584be247c17e4bee8a1baeb82fff42c1fccc3efc857047e721870338954cc167473ecec22a7552e3b16b7d7da5b82189fdff58b3598b892907ffb496f919a471590b04106454b22e490a7027e449ae3379193e4670891575e9dc661796a7063ff789883ffe7b9962bb92f4ed55520a14acdfe49ee9c563fcb1cbc006097f2a2da17edc7a04e07d17137f3e483d29f0ea420143c9c43ed173f52a292aa941c611f9f579e0282501e701c5fdee386bfa7e5b12ed140bd15be54913c94d358d95405402762f0c4eab6e2f2c21baba3bb722887ef0ad7eb5157ff07b865ee2525f27263101adcfd8e7c9369304c8c2bfb4de777bff0387e31361c5e28a65ebd86ab835e89b22c67afab7c76e7be5fa8cc787e40348607c3e0b3cc394e1453d098fb14c9e8973f5501d72077cb3aa1f82178b461a087430fc62f06163ff6411eabd8d7dd19f4c6ba6c274b1b1b016edad5c87f6fd16ed7267d70777ef19b19d8d40ad560d5e1739eab8cae4792a7b5d89812ad88e7c475a8459d69262be10ec1f91c3af1d67fe77a6fbf7f0d4ebe6ef0bd166de7dee03761812e2b1858fb944d7cd5a22edb8fa5ff83fa1be9c5ba8b8e549cec2505023d195758713388d22c7035dcd4354d7aa33767aebb2a2c587b7f42f70e337791afd9547af8fc8c4bbb3f80d2f36a96502ed3e965fdcb566fea2c8a2253690b9f5a3801996887af6e44c10340469a7e4149407de51ee2e9eab83fc854b5612c13d0140c2e4d01afa309a353d007e0442283e07ad6fbbdf2507d9cf056ab1de56c919c71823a43ad718a1e45221dc2ebc43873db969d036e0950df683d9d3273c08647089cabac97e551e043fc87ee82edca133daf03c00070603a4fa91280d6c0366f347795597334fb68ea882d87ee1f87f4d1a9f638429c3a75637d78262143b10903ac4123bb1e8e36a56473c15d490fa19066d17e9c45aac5c838cf4c8ec5ca20208553c672184ab065802d4c959d3c778ab4c5d1bd93f5fab5fb0e5cd2d12dd21cffa1c1bee77e29327577669c64f005ef8fd06d8c3a44e0f032b233c7fa3fecc6bf2ecaaf87948e82476a97ff2ed5a830af9df585ce74a097dbf04e306ddda7926c2217eea6c8daaa92a33f95799daace88acc0b9aebf0f85cde627d9a58c003821ceaaa52245c59670bf8de4190600af0283af4d86cfe59a8c7f90edddfbd9ae15ea04021f3c0b8bf9259f6cb9a454847708755e370094511e715aea178c5d3ce2fb3afeb3456f891cebce1ea3e768a49afc4a7f6828d8036513cd1bbb5d07a327af24af4c7d8daa816a3c1a9be94ed60f70235f30ae3f3df0e469eddcce81bd2c8473c1f8d3ef02ee93f93367e53ecd005cf440cabf0203c08b06cc135c0e892ea47e571af10615223522013ea483b35137b6c8eb492810c6fc6d2c2dede45c22ffde58a3902cc5be61cd95100c3ac9ccebce100a3ec1c315640abbddae20eecdcb04ffbc9c58b7be1c60a40ddb15cd640b1b048b6cb462bb1c0b055d29a27d1391f7edb4264bcf52c7c9a9d4ee00e8da32a0b6876e82b11f41430552363e3eae4c4435218d95a09deb2f576df0efd71b34410df5a81ab656d6508814cb4702e1b0ede6fd08c03d1f1499ad31e046632a0472d03297d86444c3c6bfda8a4b8bdb748c683edd71551b1e28135637e064f00dd2720206e471813d9908fc5303d37916a54fe4509790419baebc00d33afa6aa037eee719b95f8eafe38f0f1267393fe60c9c8a1ed911a1443522edef65e21a9f4d90068a878b7855c1d50fad3ad9881bfc14ca70c4602352e27fc991ece95b7be797939d6f2e79e94c41bb70c2cc7e7433d907dd7ef882f38ceec0a43e648b072b19efafb84e60be3f5ee478c235385ee3fa59a1d6a324781a1b39fc67c9d1a956163e20c2fb873e057ca0703f6e1dde9acb60bcd2668b9b4a21763feac09557918ffc4f4eea0a4f0d9cc44eed83429381337c8712718eb9a927ce6cc0293bf836cae45d535a45159196d4839700f6cc604f3d2d8c584c0155e30cda8c8c01717fa0c7e5d9984c4c14856f7767a6f730538e669de833de781c1b271fb9a232d15700145b955f363550b57452a63da8dcbe91e46a1216106cbd184e90eee6ff0d15acc2b25ec79a74aa4f71d6b3a5005fedac263db7ec10f5071ab64bca6b59eeab8e7e035c4ee68396e79c28f6cd911798ed0d31fe99f342178078322a49077089b0b03864874150a5c689190c20ff20d2022679d1fa1c6d34f62e26ce115cdf2599e9cee7c1793f4dff71a43a40a56effee4d863233d7a6241d1fa82146042cca02ea20d2d1602c6eae8f158c5a0a60be1360dcfee05a38f682a99749ef3ddbacad74a9d813a1248a4bfca18e199e164b58a4e919862a287aa91a63fc07f7a07e88d0bee25109f496f98955ca29a89738fb5b3c33a96f1d3ad6b2ee027dc4170a339cc9b6e0713b9bd628f098fbbfbcb1a3ddb9436628998e592f72548ca331cc564ef923f4d834cccecf4595071a8c235c1fde16ed8e6823b9824be2b7f030fbe256b0dc35f76eabea2e804fee81c82dc47e262610a7697e2a5a4bce754320d4d44c30859d1f49b848b0403ac81841b9c660718ca144d3a039da6e17c39375be90011f2099cefaa288f46623856d77f6587688b8e38a1a8f5c204ae9c2d88ad622e89ba77061484eb283625d18aee09a88d852db82dec238b5803ba6a9309297e2a37ec457b29273b2be5218752f5f77c2b86e755a05613055ea2625b407018b5d088328b92e49408263f8bc8fe4ff2ac70b06d4006baf4c7afb1f389453574bd72162b12cc8e7f173226d165af8735e024371b730f4674135335e63f0b25d131294b529d9db250a9fb84b16c7373a116b8c16efc1ef63525e89a9063e09d8547781d7a24126d23bf138049d621daed9bf5b70e522760cf5816f23b2031adadd6ed6378beb1d596f3f7b6c509eb57dec36c6f78decc1c7b4c1eec68941ecf57ea3d5881ceb14220d00d948b310348ffdc03557fb6184df31324ff5504c56f22f8c056410f922c32bc1990d1ada45aea152e8a52aa58d591da4c0562c8aee15182408f5172f8f5a35675a6776610ea051930b52b39d65da2d341b02fbcd7e84508cfd7e0dcbb5b4054b936d41c91948b89c00194ac8f23d087ecdb4a508ac1265422edfdaae7bd768cc67fd19fe75b43f70a8bbd913895cd59899e4f020a1c64ef2ac2cbe46064637873425782790c2e5ced53bbe8e83ac5f56f15de66ece8a748f15402bb7d32bd70246106f97f728e36baeba596034846168b81921bf21f90e3ade509bf411c9576281979e61851f85e5afbb1b5f591b0269582223dd51b073ae5106852a4dfac27e953fbb4fb873668aa015113c7613d56bc3524fcf02918f95fbba16661198676028f3a0229a68883a6ac6c8d8c77e878f73fbf84f54c5ec37bfb9f25ff0aa00f76f9a96217d21a23a3d627edeff01e39000f644e6bfffd25fd1cee1f1bdc3de6bfd0010708781f28d2bb777de718c22a6c5e4c6189a11719d2f24a18b55fbd02b3db45270d4488aec686b5f6a7afdc2d132832f6b947cb6250a0e82204d31e3933ea780b8e90b4238a3ceb483b0ffe4760b0abb85931f74f3211c33cf486ad7c7b8cd71d6662479c8487b6b92bcbd9c81b3236b497911f132d8566d0a07de0f8e6cb0ee0c80bbce90dd211bd0439d123506de95391bdf26379c641d8e577281d7719aea805e5a0661576ab69740fdb5b5f578eb5ffa614b586c7bbacd7269afa70ee2abeb92ba1587c5c923aac7b87512589eb92d1bb1404c9d1bd2b4c20da610242f4043a7628c21827249f6ad51ec799c2018f0a6c3c0b501008f14ee6942152f843569b1ed03d866d0945e3b9fb819e4438006513695915a3035e1158dda51a6393f7be1ad08ef88673315be260c55a88e24a89dda96c308afa221e0a10d08d933006272088972d2dda687f27a873311c30a3de6573ae3561e996e4b0b688e29e6f40b32f9481d70fc4074c975633cfc71a966f0eae175e2e74e3026fe4c9bdb1ad0734061de6d7e0c52af17648faff0b7b861f19a8c50e6fee04514f4e4d2095157f5366ab71a00495ac353a5ac6f6b0b0c56baf80080356e16786042c5e72dd5e29da871dec73e6a1f68148c7117a84bf6cd00116143fc865b4d431edd449b5a2963e9748e6d88908f7909318cd48fbaa201dc64b87d518596ec00372cd3638f7fc326b623a1922db1a59d77be8148428281aeb063b60dc8e0a91df3f2a49d2304575a5f6d9c2cb8e7baaecbf6f5961d3117436a829a43620b859a8ac4de1f2e79f72e30d08122fd0ae2e3447e3ce626d4c71f1a7a7c126a4f55ad6fd380ba9e99cca42a759bae5304d26f4cf1b53d88cb112269b547d035d482990125688a3082401a8f1ce8e3d20ebc5517888c4d180d44c5108ab013f55106fe1c8eeb4f4ad70964ae6dcae3b82c73fcbddefe80dd4280ee3818bd4ae4bde751b8a3a0747d921577ad0f7936019f23378bf850a6501e50b19344e7734cbc462e0f492c2d36343c13785988e617429b96166108c12920791a3ef18b7f5e252631831a9bb7664391a998455aa7d742fa6b49fc52c7c759d63e36152ca18c6ab846148dcb351b07606333ad7668a6ed69f1d6acc9a6ecfaa8515845469a426d64dc7483d4d90b1e35e14386036d680bca3632e9403f385c2b463dca9799a3e57cc31fe40b633744bf5f7cb818c5af7a8f27c9a4d88b7daea99ba1db01bba02002d2bec3075796991db30ec1dc2f98929c0ef031b7446206c9454ad111226f19614f391eccad26ca805f039f6d3a4d712528a00408045172bf502b5a5c90488c4f2c6356061f01ef33fc04763c086600e37b65f581bd24a27c9b39a7f0c71b9cea5430e36e091998b19afed0741a66bc5c06089689e8111aefcece76e8a5c3ae27d1913ded3d60f17c989d019146871c37bfe619287d227453baae9b2020f46910b821c276fe3266707a64679050650a22e2133aa7a0f16b34345144c4ae87134dacd0e1ce3abfeab8a55a7f9827b2d0892a369d4051bb0c3cbac10d04f254f0215cd1cb4438293c497cd186130cf701ab42e94ff165ffc43310fcdcbbbe5fc60a25a8546e4274199d30d213708a60f739f2cad37ee467e370a3d517bd96ff405cfe44406081334a00ac618c80a681892d6c77852a57ea8ea3a0184b8891f25277d80e941b4fad9b3959fd37e1b4af560bc46c08c868fad56c0d58baf73e6466d959e7fa4047aac032ef09550d0c748b045fd1799dd0d5a3274c272c7291af54c621c1d35379f8b17b5ee8ccfbbe94e88ce136c3d990b9c0e2e7b2372080532e836a6340f730e95dfe9d74f031fde53835a19943bce7b52baeba50b8a2111fa65be1e97b5b46c3c0f2d16105a191dbb0ee22cd5820c28e8020bdc2cc92b0021f5bbb78e8d5b1045b43c482107b6cdf2d0dbf8f9ba124e761136e84a1ce9b0094d484fa620957fee615abcf8441348e477fcc64bb493316b0984de66e4d773e620a22dc8919621606c78ffe63b4d3db468688a05d2c5060305e203ce78059c49118577d4548c462680702fb76910eaff70e27419cdfc7b1054d1da93677efd4ca53a0becfea6f2d33880c4c117e2d057e322a7608f7ae3323eff09622bbe1430ae4eb25f090470ed5684ad9d119235ebcdb3e3c2724f2acb589d57fd55feb38c51f5ec2343e1305a75e0660c875c17f820675af3a382e2c3e47e5347f4172610855131b863296a1f0b887fea519a57bc76aa6df23d7fa723d3a749679d5f599c76d130c9f97a66f8d83313ee7c0083fdf5caa5fd459a72ccd671c3d54cdc681cc82f6982ae84989e663caa45ae7346adeb36bb7abcc2736b763c7d827a97c2f701992f11b90791307ea793daf7b20d0b57aee07b39270aa754d980a0b600946fda80db8432f6dd1b420ac08242ca0196960d12c2a00719c1ae439b94d43082d2624046a2fcdb36a93826956b827e1c2e6ee8aef4a5c5c2d5442252e5fded5a2fdb1715943b656dc2e84643bbd1d7e85a66d55d6678c1314461a71ec7635e8f94acf22c15f903c2fe3df71203d07a2bcb2b58f76d9b74f5ee302abd2a0cac12ae0abb0ad118db49ee5632a6e3afae38cb07831e5fd6243aba101d532e58c70c5f5c4e6f9a30a7600e75254ffd463fe55f947ca6d2af283cb5f3c4e7cf1afff93c707c4d037723a2be99b4bc39e9940d1247c9f48752772e23344cba813cc76b9ef7dadf50b7f51e76744be74741017857c9357cd9c09910f34ac55caa1b5a768163a6ebe8b289e315c090769dff8c983ec2d66e65a8b3131cc81812d8336c5170671867990015d7d66d12ef26c17c48d40d686fdd8bc8c7f07e87d4dbc7583a7c3fc85ad396adedb961bce0d497c2384fc8432ef0ae40df9b45d5b09e811a1aa5152035b26d4f396c54cfa6661389b37ec2a48711c33dc258a1f53ae0281633a98083bb118a7508d114fd003156cfab92284225f7c9f2c46db167386f730d7ed1e99508baa14c300e337013a6633fea98b4a52602153186d869acc0b44461b8face84c3be8e1856d51b71f38908bb1e57b09aabadc53ea2445fdca47913840bfcaf2d2854a0f6a18adcfdf0167d4ccf450e4a891e3485f6c58837e983a25d310392a5ba70acf99ad481f1f830a3b256ccbaee8b8227a35e8a58b28dc0d1da29a6be70ff16734d580b26606c1bdf3afbc7d2bc21ffa79928e43bbfe1ed7fb481db9d1b1cf91c7d7abda83ff750db30fc7e8bec7cbfb369cb36fa021e943b6b47ca28c9c56765e9f7c61e5d5110d898b05918bc778c726a64ccf68a60a4d446e104a32af659fe3eab134fbb3193f83b3a9fd39ccb32f2e2dea2da23cf9abbdc8f15f224983506056f87469511bff2f01b18f25c9228f152fc2310529a28c5553eb71a7a6801aab79a472f5800c4608be08b59f9e7152e3687309383a2d174abc57ba9e7267c834e657d741e73709fd77f76c0289d568a7adce14331bfad9a0f33a4ca976804efe23db5ced0182e968224ce30c924bcd082e995de57faf2573d4fda0ed66eb3ae0d759865d4b7741dedd3c69981fa17dcf3b8ba773bfbf75cd2445f642225fce3203d24f965ddda233fa41d66710b6f154cd4958f3a32a819881fc2ff1ca757d3386d408db447a20b68774b0820074fb97481611ec3bf3e264b01481fd107025c770081994c532457386e1dde683397b8f28d8307af81e240eacf4ca8a513044dee4ab9ae80e89c23cddde6ad871345553c3cf5a80cb29106d71839d1085a4b710fbdc5bc82c37f033d2be65661c56f33cb905bf0c12b4bd18c8e6f786430357e35daa5693099d67aa69c036416c37519b933c37ffd02a5f63e7090771abcd90f7d9e01bb9a3ec919a7cfa5fe38c82a80a59f5ad1ada62613959a2c1f3a7a0b7dcc2e5a2a32fee6e3a8f58eacd2d840b624199f7d1c640bacbf639708e3c9025d19c9bfc6794b5c0bd33aea9a67d79897e8c0e48f2854e44a3f0f6a9928c3ae400e01afc26acbd75282f76e5024b7af66fbd3097f6081cc020d62773e03438bf0d1dcff01f272f36ce1de013cd8e10b1279a375dcfc95bdb1fc8361cbe102636390cea7808793be4b2a13744110a504731e6dd06f0b740d556ef5891368763ffa4126389fcc256ab8cb9fe69d47493a615559a3cfbb059f7eb8e1d77859acee4b6c48a401b60123d4ef0296a888fb67afacb9cc5da7f09a912beca4a62b023f10b3b64bf9e28138d9c01f87c3757cc8b3cfbaac6358feb11cf8fcea8515b6268c34f672a3e83de3ddef7f2c5b5488546d26108b28e01074f50f180133bf2ab757ce0aaed3793727f2e987fca522f29e8ca35ae335544a7b9cde7b8013cb9992d660560b5e3a603f48907773a405e70f56685b9c36504e30181c096a0386a98a03aec70705033154efa3aace2c4f39474751e3d34b084f692fe2b0069179f0446d012fa9ad591608cd8da48a7d9c3eb06721fdd00e020618ca20c2e9ac66c59777c38088cd9ede70eec1ecf8ceda63d73edc792cd4414360d684bf57241b5d2dc6b81b5ee4956a6313fdbd41ad6d5e8edd070a21e755d6528af5865961676dd9f5940749f36c41fb8fd8e51b83e8af26d88358526b2ca4e1a2e1bdb7f9d361e6b33dc095d18ed43be423d466d004be044083623d22633eec7af79711f9bf9b8b18b47c4924fa9aed721ce2663a7dfa4bb13f9138e28f91c9d05cd88c698a00e34a80d0cbc402a7abd1f00457f2807404e5fea8e51103140ae88a2fa49d76bd4f72d6152104376652bbda6fa30dbab2c25a0e3417f61c985d7c90af74313fd1da67ce86adcee4955ff4fc502d24b0bc33cbce06ce002b7e5b367d9de5ad44f6b676cf27db35901071670afe22d54c9b1233db73836c4e6ac1cac0090b5c3a7f4b51db9de5d1734c631f49c18ded45dc2652548a659f19baa99a63d62f5cd9608b8661cf7fc88ec0ade0d13568d8cc4091e07c7d9d8544b4b521e616ef141187ddcb9f4caaec7be8d90cb66ec8ac2f78a19c48f7d18b55d596b7e6aeec7c3ec1222fad3d5bea16033b6ea9ff30f94e97d661e922ed23bfb9557fb1742bc36dca6b202f9218b2ff870b64c7aff4acd74513fcb8b1d456c917adcc57a88b77c978093edbdf8a5d4cbca0319f731c8b61253a77077ac2d575cc29c65290174ab6bf04860b8168737dfc9102903df24368f1f7b2e178eb3a0867537fbf301dd75b00070e5715cbbbef5f1164c30a0acaf78ea75b958af893f4cf76def228bc6ab77bb89d7977d26dd07a957c35321ebeeeb8e8b784947a4c5c44c85ee3dfbbcf8cd429f2cdc161c5203aab4b572b63f2e40759197311856661a94e1cc9cd9aca266af0489cfcbdd653a6ca84cd1b70175bd6ce932840f5f9dfba39dcca3b15b8bcc9d7a077cf38b4e43c2d0579de4186a7db488367c2afd8cc8732d7b3dde96a334335804c0bba48fd0465286160129e4481274a79aa46b54e93c2e6b557fb2d2e72de5f0f92079de6b46cbe80af70ddc05dbf944d01ef405129b75cfae13b113425d8444715edfb667ef8228415d7cecb2402405401583d9a714aaa3b8afb9b9b1626e82f85bd8d23c1677f9be212935ca19d341b726495f50d178a17db767ee7b105b922361938e6ef2420cf5572ab2cde3a05894170bb10df9a35a2e5a0d9d5a9078f169825924259a9ddd8cf0b7284105c4ac8453aea54056c6ace84413998ee6af9e2d8cdfe06af335164e90275613a357765f1c55c718d037941820d837b766264d093bbfdc7b703e589a9db324df79612fcef727e912acd2fbc12c395e98c7d8b1278d5a3facfb2093ba0a2cda2da673c300c8747da11574389142f859a588005ddb716964efe42cab10f97dd4a04a3260a5a6026825e1129294e92e7f63388d2923e31d8fc74a34a0a42857e41f811d3c74131ab73ceeba63417c3b902d4b962a476d8c8323527f6af03dd7aa2add82d9e5d21d4bd3b63f8d5508cc8ccd55c07a3e10328ba0c51bcbb616b001141ad6ccff3f3a52ae6bd1fd4ca26c6d2c219c7bf9e79d7a2e3c7ba9257c7b5092002ecd22082564eb9dc786681fe513752b2064882ce7dd52c19c32984ee445399c00e09bd31682a5f0d7b8268c65436ba0d4356018998a8dc55b108c85c25e42587866757b4341222cb7008dfdcfb23e80fe0352dff5687b3b98ef8289650de50556b045ccd304befccdb98564b82a096291f8cdf2760984f3a5290a44e3871e8295d4ce30812799d74142d12bd245dcf315f4b211384f454e489e87a80855f5edc06f7ba2ebd1219103f1ae4c0ece8e9e7b86b196566358b05cc4df733a2ca3e5cab2fdc14807f1aee61f8988252b09f975d591c82c0db757b294e16594f050824badd4fdc72bda7cc0988fd65817435a9cfc5ecf0ae843a427087ab7c2fe99ff5d4f65861a8bb8355a059593c638fecbf1e3a826ecba88b6706a738c63869960964139c3d0270f6aeb4a99ebbb0167d39f4efcbc8d84c7b0935899900a22b627eb81ea21dabe8162c59ef159e27d7df1fc13d46305e063c08e38fa1a2f902cf4a1ef9a9283f950a2b9ce2ef5120a77f313e7e5b123c64f0262a11e2327d243d216cc9c58fb1ef7b3994793308c3bd16c10a0d18170e663db168a09583b91ff6e79fed89629b3d856c6602382e5409d99925aa9c119ed429896044003f6012d99094afd538de684beba6b7652791a8a5cf3cc39ca1b042183b72a4339e9ae4c3196da559cc8660297bf7c499e329fb91e7279aa905c9257458f8b6d393ccb510c8b509b941841e1961a04bd5ae7bdad1b7132039f8d7582d268021d3a9ed91be2b17950d7a099dfe963834521e13ec9a009ef037c908b8fd40e854dd14a69eb2352ff34b3fc44cdd4cfdc9b2068c69794998649b60252d9ec53ce26c30323a7be0a1d9d2e8dcc9241d66c4f8baa1878a66b4c3d20318f7cb8119a5a146e839291b1a2dfb1c458b63f01f802ebb396276b7631605d285d631b0245bbb3efd7c7e23feb5c8456d6cee8430299591b9e3b0aafeae5fb0349ee5408ea192cbb605ca9957d1edeb73c077b7f08c421c4156c966017978faa5301bfeb8174e71731e1e08101ae94f23449880823d054c3666ee2df0d44641641d218e3c297868bb7b60d9d0a92abf6f012d403850546b74f4f85c1a0b4216084a12aee858dcb42edffbac874d5913fc4c19c893c06c9afb179fea443106df3a19bee90a03da1acb91ce8bb69102d4fa1c5c32eb3bbc478b459ab40428ea0d9c4381b988e037b5714621a2c733015a3240eb88844075a1807ab8be0318244ee29076f71d9f8a70c88e30f36c992efc24cf97666adf3d19bea51ee0ec446856ea36020bab08b7a543c33ac54794be993443b9eb60dfd9e55a112f64bd2ea993a220a46dca03c0d79634f6c63396940b1e7b052747d1651306971e7ef68338af2c5dddbcb20bab86bba3c2b43348c31284d9b759c7a62251a47203ade31ce59a9ad379f21f9b8279d35140f3b8c1b02a0fb61d1c10f7f5f8cf8fd72dbf29fe5c51026a557d536d2eeb105b53aea8897aa7a6f0670429f948c44e550a0d914072b73a8014b2010a6188e915f83981895bd3f5a0a3493aa1dc054fbd7f9d990dbefee196519f2ca6883d1118b85ebf42c4c50b655a7201d13516671a134d50284bff0ad0bdb09a642f3c149d889eb587d73424b1a32debfac2e237cc88176630518141aa95eff800710bbe87ba9ddfbb24defd95f2b706d96acb173bdb27c42d9b5a0198b2eabbc80641676ba36470a070db368460d3923af702771e00ec74270081b3a0bd4e043147b9479bab7ffc6c287bb0f5995a3a23f49393ee0dc99d4f9c6368b10a22322cc73741c13e90ad22260bb6e01ca9849e002338e225d1603c0f31949bc406f8a9f5594225739d39227158c362c3708b0ae5132b2224e2d300ee728f9917ced6901cac10590fedea57360968d08e0134e50abe98d3a12acfd393e93a526b6d6cdd88673aabfe7bdec8abd88bd6d07db79c2025e19661fbf91cfaf830f763b38f52a7448f1398926105ba8e4df2ec3e8b5089a60e6be3b649181c949eb2f9852670ad6ab8a9b538aa4b69d0ef48b3b10b06dbc8723b837ccb1d522a7ae506a04b72f50cfa0d8029744da6d3633f95df991d2dfe04842c66a06639cd166f741b5d9d5c794fe3761022f13ccda325af6e7a574a012bc766bd3f88ff20248afee366c2787572fd475d9f2a9ece7994603213016e52f93b13429d82d26d13b2bc0b584a4b19a5a664cc0bc5772d40f77cb956666e67125ffa396f8927a77bd2512bfec6ce210515b81ed8f56b4be8b677895b7e98d3ce2eb7959aceeb05926b0b2cf7c47c32c93cdd464445b4983eaab69ced1c1e33e60aebf28cec6e2f957aa635516e881ee6ef78862e828859161a6f2cedba7422d1f6b35d7c0e6be66e29510698b73d202c52dd1e043800fc32ef58e5b08312f240765450dec88fec10d5131b04d83cad60f921ebd85b7379cc879a4f33ff23ccedbc7787005f55e0cf19c39af55315289af8ae296630e85ffb7b3df5583ef8616a39011bf9e3008e02148d589c904ab567674b2c46ab30be054f9ae23201323e58848f789ee48d6d5f335941c3bc54de838887327dbd702d2bf7fa861dc1421bf8e76bbb4adf1207a43a155ed98cfbcee1cd6cebaf351d124c1bc1179d3eadcfde0f22a88c8989aa9db91cb79d54171d796877822c3bc2e1562a2443edb6ab0a2a7f37a14e76b028a6590d4eb80c30ccfb5bc114b4c4153b94e122fe565db7be43655d8b88053aec5eb9e2f65bdb00574971e4b59cfbe40db65204821fc04df783278f6e99e77e3888ea5591bbce12810546d759d278f5c90ff46e33d3f2ca3651533e0122c5e4135590d486ba75d4c6c8013cbeae0786b06c4aac200f828c8a6961c6cd8b538a82717996fe49da94f8233ad294faf9c3b24ac6737ac755b44be07c2fc96f6b688663dde191507238f2bceac46760f726fae51697c06e7ed9b5ce2cdb499388067a40388f59f7d87e37cb9053921ca5a26ac03b1f533367da375c4a86d21d7249a66257a9f6bfe3ddc0c35af0d945d7863fef070007f71c151e1e22bdfd4494841a7f405a87fe6214276c71bac5a6f959e7439650973e4072467a063cd51174a4373ee278e1eedc3b0525b8ba74abbe0a51bd950ee7a0b7f58503537e2931561179fd81f6620d96d05a1ce12a9588bd09bcbd0adba6a3b836432dd3950c29c582df42872e21225f9ac6c24cc0cc81add0518f518b0745207957b9fd8d4f974dbf1367bdfe6a757b33d6a5507c9ae0bd8483e4a5333d164d88fb4bba5d5280b4fed5edaeefcb198ff614ce7a3cb765dfd6a339b1d1a97f9a3e030d8c540eb64322bdfd77ab8493c5b1804716a94e973faa764e88fc59f9557ff259c8cdcebc62c6630904b0baab372ed174ebc92128aa5f1a316defeeb9768d8953f195a8a08e29185c56dd5624f975ba1c500d9e21e82ba46343579b241998baecd1d9d840bd48f094573a6064612bb4cf730c76199051b14fa2d882af6c2bccfc70d068deb1c24dc1fc5ced0c4f967b5b58408d1e0475d7cfec7395c6db77ef08abb88f7bf2aba975dd7f733362a3b61a1dd84d0af2fc069d688b404d460a4661767b7c6e6ba056ab141ffd59e5a39bb96a6adb350989016f8c6d3dbcabffc3958cd035aeedafbb0f1e6976eaf42cbd8110a3dd8b6871779a9b4d39618158b0876567b3306c12a1027ef9a5c4cf74f486c6e4d4f808d4656625e7c05754a54b499ff679b9a9e37d376f67b15f10001fe2faf3fd9f89a8df44ac7bfa64a7901fefc5a4232201eaf8d61ffd33814e7012e51a7bb1847a35849f522a00889dfb618038d4a35bca21f6a1292a921e0e7c6b87b77a73d00585df2a559aa3061a851f40c4d2d9af5e398a792f09bdd8b72dc03b4f648cd2b31ddc8610fda382040e8a8262ef3100d158888fbb2aca235482c1fd05fbf5f15ed8ee0e39bd643f3fd0963e77669a72f86f04157134a56a59404fccb4f288cdb5dd6182523db42524102b46662d011f34240237a017dfa56f857e732c8071e6ed4d9abf67ecee7a78162ad46393da94945bb9e91291b15d63871848a79122f652cd1311b5fb1d6e0d80b47c27e9179e7fc00651a8a4573a71ec348fa120d90f27041cfac1a3c3df5ca7fadd77b0c1f64f6bc62af40f5e47eabe93e4cbe0e25442b0043e3f55b12fbbef210827b03518f8401cf9f7d2090fe9c889bacf0c3b35bdcdda4e22a0c098a72fe06fada48220109f57d30a56a498c6b5060629f5c0859d98a5a6735067cca06c44e9351d531a26362006264bfc8c1bceec9111b157d582abcef55cb9be5241628dd22bbb92931ab09409f9d5e04f90250f9b4f16c648781d4abdc988716255429a068798c64497d20b22d0e380afe29ba2ffe570c9f2509c434964869e4800366b89bbd3950233276fb561e940276338d5f485953b494c32509e14b7b584002c889fc6cc68a92f262498fe9ec3288d2eea7a4288377af78e6f29a8e2f68501a57d0d9cdb246eaf32240cea76f93145b24a11289e0a143346f4f09285e8cb6d64799a83b307f8ff50d83c2de70e4d73ec80fa8bd6f689e53e57a6f6e5dad847d0c0a1168eaa546215fc45ecc8662427a15e44c356809791542719226eb21977f46c680c0bdef68f167b67af47b7d8bc8128e0d5b1a28e854d252f5b20b081af2a86369a710518a754092d1a3330205341c31279a96fe04a60c9abe2b97d9b953978cc7a12f30d2a0226f8898f7807285da2268f78cab075cba6b367af136caf5024d717a5cbd15f99e441c3afeed3c6f92130c2960ba487250a1538e7e1aeff17ae4451a27d51bc6943a6b1f56f41b27a56c8914944ea48cab098496f35ea1b8d44aa81615db4328fd9aafd9488c5fee59d2046401312dd60b3efebfd18f8f156168025c9a1bd64bd79303716913f754b8f8ed156f617c0bb6c28e83998f2414b0a0daee0f4ee3b0ca936616c638f3022ca543508ab108d4bbd342cc4845def43cb89beea0106eb8d748b6cf4c95c017e4c4a3ac25d17df8f525dcf903650e8eddf931554b6de7544e8f751ed159c2e2f5b82ac46240f60867cf508df4a693813f89ca9d0dc54851e27491527c16f83e5249e4b3f22c2433080ef379b5bcfdd5cbf44648dd9559b52a95dbf395aaec5ab17a56f213c2c69c2bed246f161dc1cda431d606573ddd67de005b2c9dd71c9d1a8f2da9bb7d928d76431b95f3e60fffc6c8a52f4c534489db616f207aef8ace4b05e8267287cc63357e603e2c377b98e2470a7f23c7fe7e86e80df2c4768e64ea4952c696606c15cb24cbc32a69866c524166c55d0f81e3e46fca39bd4e5651eb01c90935ab000ffad5d6735e85005b80a4cd24214a5d6018ea4b858a2e745c7552d999ee40dee0df7ef9a01208c0094b1794871dfb90ae984ab469038802991a76687e68800a764ff3123b3f0da7a4fca4540b379c45a779a0aa9f935336a453f87ec801d8b00063867ba8be5487ba668bc881a6a704154756625499248912dd347e642bfc949f7e801b158a3444cd9f06473cdc06faa139a002c3551667f22136dde5ea14fd273509d0ea69e2a14712b6f151357c87d1c558c75586f548c7b871d780a425c14ef869e8816993695663e226573700d9006aa4f4535aa75505f2a144e2ed4134376485125184b1f73a9da58a34b12226c12265a0ee0b4ccf682c1b3779af32bae8be28c10822e4a027948ac60f2b20d974c32afcafe314563a939ad2d1a6bdd1553685e0ea359defa12224e5eac09504edc2f99e3290860633f9e4b63bd8f6e6aadc1ef4cba681aaf996ec242c3519e4a2fd64d78c9c8de488e96853f347dbe9ccd45899765898c7b2e59ad29ce60d2b43c5309fb2a70446e1c0e13ce58bd58ec20a69911d7655e984ae43f120684b0f702d870c6a92c349d949e9b39fde5c9b62978d4eb8a43f6bd41a996b60af63218ae4403cf764210cbef154efdcf6df34debd58f1b66ea750079f0a97b9368e0a360d92df70e09365714acf2114971e912dd5777d1ccbf2d2a83d5c038001846bb18837b74ce525150e30bc0b079a353eb1b27183372b1ac0be01fa3e7cabd34f92318d3fb5d33e6e8936787da645c29c41fb3cc03a235a85dc4bcfd6b4e98073ba2d51f14a70b65f5e62bc007e76d90b3eb086e91b6bde38fdbe70fde2dde1272cc665b4677ff6f5b6da432aa221ae4217aa11be315f9391895f8c17ffacef7630d64537896d79abe4731db3dc2af978b478f43bc7bae44e06b61f9a528035598837062f7807e51108822fce16e1727566768a157565b7369c6151113804459f7495c46648bcebab6d8e187149d98a2e3360a0ecbfc0b607ac48160418bbcc1864f2845f26712844c931945e73fd3c819ddb145163bc851ce598770d4fc1f1f298d2f32d76709df7142bf3f29c5697e7c421b0baa043de67baa9e14043062b53ac425091b395a975447678fd136746f08f592427478487c1e99e52e9c75c2d362938bb478333b6a3a60d518f8f15222cc17690396145d0d6f8cff859aeb94371b12cbc0dbafe8e7be138020143c1444d0211f3aea1f861ef1922d8a15380ba9b46e141255c15e9e4aa08238d9039812855e3ac7bc5e9bb84dbd3016c94430de1a0d53ca5ce8c135db3fffe2a53e44e1b0f29b629bb4f52fea7c0ad3dcb59a72b569a43bfa804e05d07c20b7813f1902fd2b07983cf9a13fa8655fcfd937344779f21d62651b891d95ec9520a409d2eac6d3d22466c8be96b65512de6fa4f6bc0b50b6e6c48394bfbc4362d3334812f328ab4fb6b372949f6a89a23f8b2cf6a1e5447f9e9a8854f462853215981056e5ac11ad9384ee58cc6e3b0c79b72c800288a01ec4a0172092cba8cdf5df0787ebbb0830296ceb513f491f2cee7e01c5744800d66a7436f01106966c5d9ae21142efa1c065c260d18fafb302f3d46fd7a010c6c546318021e1ea4167b89c43689bb7ecd0e6f6cab5fc5fdc489233b6ca24a210eca212d9245d1edb0b80df7ea805d6564a3ba0271283dc611e72cabadc61848cbbedacfc66a08d84716c35080f97988d217223aca933289717ac1cb605a80f7e692225504f8951b3bb4bd4cb2a7f62459bf2b7c976f4044fcce3a76ac1f7d4bdc5bb0b6c5c2976fc84b5e1047cc41ba48093ccd7b6b23b43ab8812d90dad273891877f558444037165d04f67b00027340f337e0ffd68836ef72be029b6b089f8ac86f46f9403b40cc267b7edc5e2ddb7815bb72bc220bb09cf91bd00828a0c3cb79d11b50e9dfed861d15e38b6341957f32f5f19222a18435d9d02bd3eea26b622a74bea261164a8130d977000d9f7b855c4ac05f6d50d43b79336d5bf7ebccbc5fc42f9d5049035f92e095fef308da00045dd39c8ff63005e488b29f6f7683210412896e631445f1d7fced33075cd402215a67d31767fb5c0eb2edf1df30dfdf6b73c85b3ce93cab4ca9be8c67d9214073e821d9ba578f059ea87c4f921e4fb7e69110ecad840ea011e9bef87ad8de6eea178256ba846b0916e1eb12b724e04014598780899cad7fadd7505c3e55d10919c0e0613af22f526e42ffe9b8d149ed9b1b003587d2f46038100cb3f93b4f2eb618df9f49af6e4f322183db85644a1bd13f333c94d7b4a05745cbdd8ca45a613c6f6708a0d7d0ed603b03f98e95f33a923d2909804c77dbce2aad0e329603fb034ae7ecca9e006104d4650b3cd5f81886f219344af5d823712042a726a88b301d5784d40c67f20f8b1b2a8e4c93dfd5496581505204cb7fabc772f393bb4c25117b5f322247d585cad46044c9c3069904cf25f91af792840dc898a0e8c83df7039bb17c433d929a5919a80b974c4b1823d9140094c82cdc17a800ab6c1c85127f9b7b9accab494194f216763c21c1e1297dacf22fc8f2f8154a9acbb2f662d032964aad0c98de9320da00a936efcba3c934657f2903ba410718864d78d13fc9014307a74d05cdd6d77ca055831f94905073b51dcf0b571360728311f78ea3cdd3ac35dcbe453e28906f9dea726dc6181ef81eb513c993ac531138935a3c10856c9418accfb0314997413689337e22407cd0a4a188778d25a5b557e141cfd5cbd13f5d9dd114be4df070bb01dd30377ef16675defaa5b2634d0f9f97987d9a33c5167e3cf8226c9c2f57baa730d3ea8b3be75ff9c7f51929643a770c87150365b7a15bdad94f72a526ead36c52e26fff75dbb967b9eaa1161746e80c62192cec76a7d5538b65f15af7580513134284d11eaebc2c83f319e5475980b605d152f8b5c0a34be43317ef664f4f00841135a93f1336bc9240fe752d4564ab1d83bdb21aa396d925df00975963088900745b080a8f6ac7217839cc4c8bd65e9e862160a12dc36bed1a7e0191399839c92099c85cc943a8474c0e4f0bf8ea04a10b36bb9e65460cd9306dd48258cd62805136a6dd0b5cbb9def29852689e3b7aaccb20cc32d14225f67be7ec94a1b739ea941455cf04b96931dd1d410387b557f9949b18da4ca7531d311c75b5551b744f20181513e250034d67b528ef99023d58a2431a8e0ac195c3b38c6731b279eab0bda61e37c29974c14ef036c25629c674eededc587df5bbd40529f3ef9b98b7f889ff056904943b07b805479bb1c6714dc8fa83c87a16091107cc1f4a3cb187f15c074e071d96b3f5fac79af477aa3b8b1a8691cfce9784a0bd73eb8bbf9d8b881e44fcf9e8a86f1167a97bc54d2a7f7b447398e33be97fd2ece3f8ced7c835f2aa344dd2a74f6ec88b2b6e177875c74562ab6567182bfa4abeac052b6afd7ab7bdd2fc8d364a87afb6efefd2d7eb26227de664942bb6b6f0191c4df8ed93d3e5d5c1932b08f6234e3a62e1ed49ff07ab498e3417b7920e17eaddf159a7417e6ff63cb6f39eff3d4ff5ca89a21120611c5677c2c0efa2b78ed6b35a444797dcaae8539c45a2c83c843dcfc35f833f10091418bced14e3eb7fe4c7d2baec7ade52b2ea1ed93f351bfe02d4389f51ffede91f5c33f66eb2693d0e98bb59581da7cbe951747105682d232e78f46f578303436c2c6c078afcab31957af13d60c4c31155cc97894273366230e0bedf8963a423d48313e250b80270d828ffa5cc9b50a708a4be5bc2f0318b80d5fb5de2d8425d5de2dd5b90eb5127a8c2c9956388391387954b1047aa056b6c94b13bffced9075ab059ee96ab4614bdf341e80abd4efc7d122f28787ca53ccec0011deaaa704ccd2c4215347cc34da525b4f937188dbdd137df599754d246648e0bc791d0cb215ed9e88f70246779b7db2985270a09812a0c40d4fb92522b8b2155ef3f5fd4678bbd58767fb7d7a5a7b39bbbc7be735d04f61887bdda5492d3a9d645ad176b47cea41a26b120bf9e2c9f79c5d0faa7a164d383852d3fb7ae5171d8eb4f77898f1c82d1a244a3e2aedf7932d4588f267d9b10b85fa06dcc4473a8ddf1614b88445a2aca1cf7e9e9706bd5aeb9b000a0434fc835404421a97a938dd017a82c1826410b590f457b284bc1fe4de550c692b20a31223dcaf1447f70528630b14a19b85d4fb48458f75ca34b478435fb83e13edd79c1eec1de17313c867bf4e00b61b56f633540552c6f0b9ed45230eeccc4921719c470768c45e48c209bc6fb6bd4c38afad91fdbe308fdb24a5df4b28d739902a4a7094286fc968438657e99b1d7b621f0c7affddaf1c1938f18db5ab59907114e60c06a24b861be315bd0d15f5292d0d9ef43215a895f00bdb1caef75b614839221d5445966ac0d030d9a4233b4156d8f0e83aa7860ac7967e167b21bbd7586e4965ac9e6a4e650b0d9aedb944d9862afffc270b5c6792c84761ff155047291402ebfb7d26b906b65c371e07a4a065cca6f8bb7f1d4183244c0c606bdc9ce633cded1cceb6347b3670433a942f2c18a877c536f775072677e25ba9cb2dfe0642d7cf8a9db7d628a69e15d4c15a28e034c8a3f734046b3d09c57e364b0ec4b2ad7bc36dda91f0ae51b0545a1a8efc67d5c13936358bfa6971c14239db16d21aef2944785371bf53c47669fa39a30ab98865b0b007c6eb1095dbedc267a820ba9e56cc3b9ef24f7a440ea970e0899b57ea5258c43b2b4dc02ae620ff65f0c48cf0c044bd330fe86e80089976599c3d91aca0a6a08f5f33df86c8e10abd7ecc1850b3e7fb7946f2dc763d6fb362db58a970cb7dd82e9aa6b81f0fc2f873a204bd35b6d1fb8bd43cb79cce8c6590e1c19e14154b2becb426cb685a6b0b98ef9e56167374979120fc4493a4275863c52bc41033175cf4e94aaa6944722114712cf0f6a571e31cd8144866aa2602879659a307b675f0e5793877b32b6d6db7a2db3058b1471cd270fd99ac88cfc09996f18dda4f9bd73d08cc72d39d8e54bbef4509a2f758cff232611f0474e336a6c42ef9779de2adf6c8361048a39cff98ac3eb37ffddfff2e68d8f1387678d839be716c4af8abc66012702f504edd87b227dfcd4dad71c1edc236beb3308d4a237c990697e194a0aed0f8ec71c140e90540bada5e1c19629d76126b2c858ab6370914598e68c71b026865df9d6043d2c591a2fafa927212b69666cf539a47b3906747d9feac5fc6e91621454b08c0fdb43ed0c0899268e16597986216fc83c79e1b266cad42b32d324a0fbfcd501ec044b6fd181f3e7142969996d0b7f93e6149955e0b9309fbc3f0a4d70a1ae6389c6688453b4c4f2a85e85bd0130ffc169b8583d694d565e58330d125b22d0d961c8638919991084f6d9e96fad1cd844977596160083fe7814ea6d4456389982b24a0ce6a39e5df2c53d1f7162c93d8335bad25b36898ead329848e9b6c5325d4a8583bb3ff00495d4f138f7733816b208edbcabf7a5543fa1764a27995129494895d02de29a10f12db1a7c950de8d31c2a86149c1e0396430a1658ca220a6755333f9178b21af295fcc8f5474e081d83e47975d77374b325f68d8e276672783ef168238e7683c8222e1aa601108ac7edf415980faa1e9f9820dba28d4403e2d78767564a3231241206ca6d12496f30314253b19a1a477e314a16dc8c0223b60ed823606d2a0638b19178a8ae690bdae60c403c76e46d8c97b1e010a485c9f062f0cc4b88deaeacde714e84306296eb837140a8785f9dc6acbb879de001f2517801d7e0ece131774fbb692932c2c92be824928adf23c24a68e7240bad554aa12a44fd5d4efed2d96b4766b4902bb57ec0afe0fab1a2ee770b191efe87395fee284ed376ca7aab68ab2370a6b52e49e10614dea151465a99fd761f89f31392da2d55ee5675918b0c1b0493a83970e6238965149d3bf6d3c16bc093863db6e293f31678f18073938584531608ed6e5a1b11c3b00228af7def4593494e9b00bdb3390c955554a6874267852b4b3d5eb5547fea55f2f77f868bae4ff4b505913147da4f4aa125540f128f9cc9b2e557583e0b1511cd3d8d1a96ad4b6c5d90629780f618e6503356159ea1121702eacddf6094079bef8e1c792cf95fa2822cc46909bc4e6c2c70d4c0b1075e4d9aeaca18d2422c1bc5033c84a2f2911dd956b7298c26f1f17f41b0ec0ffdfa1b8dbde474d647b59ea60903f00c33b44a6d190f388bea577c344c753b47766327b9f7bcdb80bbdfd5b309ec5ae66917998478a3c116f60c389e00b380f9b6a80ba3ab5982be8ccef39e30c396517050890d877c72f816e541d00a7d7c070bdda59408ffd23875ec2a0ab036e8bb7090b7c7e08e83d32924d33d4ead57010e4024df5fe4b02961ca44117c246cb442071c95f664ce7692e4be280d625adc9d3ff73b846a6bd0c8f73ae0a417ee7204433b5f92bda4c93902e46d6349945a86ce54c2b3b96f3ece4d505d971c0d73bae610f82c6f3d7d61a3fb468b8386299edf0f5c7ff3bd3766bcbbc8ab09195a66ec34c41c251ebe3460aa3c1eda404d33d5e910ca065b363b8e5de961ba3ba00d74dd0d5943f23b1c55d2a45e657e9c63833c2ac3e5e80591770503957c9e2ecf8dea6bd3d2c56515a273ec8994cfea9b2a9cc8c27b764d3d230c9af37f03d5ab0a57fec6cf4913418d66a8a92629d34183be83f700749106a22c193416030072c9cd52656c8a15dce2bd12ad638d1d9148861aa9df8aa1b57996af1bd945e52379a333d1702b3ee9bd5e73e993ea99ca998aef496b4b1d2297d329490ad0773e89f5ab38c9f31ebd7d136ddc87f4183374e182d6dc633f9f28de847ba364213c905f323dc221ee8f060e99fb33be1d767afdaf25b084b012850a0c6117e2ad7dc803806a5d2a983bbd3b2a23c0199cca25af2b66dd9f4780f617aed3e8fd8f1b9d73ac8f59415db5e97f14c204f710ca44e42139bd39eb3971e13e9de3f48772220b2f1cc517abe155643f8ddce3bf437dbd5184655cd8f737047e88301ce1587d069dd7f0521e476f29a9856def84c282c3f87103e0a51b9dc997cda9e24890a496869e1c444626470ddef2dadc6a5a2bada4ad2b7d2cfaa7d539c6c738ccf82df2b1627c28e9d729e49ab071459e1fdc2cff09cf47bb8a77c2d7375ba2ca98aac738f18a55b372b122eb19dc42d29aa356fe18e0ece19ad052083ead5f1a17e996a40ecad1a68e683fc9b419b27d8c00439a1448d8482e1029e6302b525070b7b67b4e7aaf3cc6b9ce703c04671c52c98689b35ffeba2aefbb6d6279cd0b6dcc88b9180d2a8e0a663e451ce733850a38dbb278ba4fe9482b2508d9eb164fd37ef25964e9ea7fbc8446b6c4346d51eb234b08cc5fb4e57d49f737b9b6119e051c1b0ba3d6c19c40ce64b68ac04fc9f8a97ef972ebaa0ccf017399af2e0815d518b8ecb4d19ed7db30e99dd62064b136f2d96e66edfc55fa20f1cb3cb70a12868ee1e5c17722654c15e74da7641728005b2a138e9f4b930668ab5163d05081f18290e766d24a4e34609d8b235a4d420dd1b54bb58d90e3b8f4682250b8f4f66c1ddd8dad6cd992f6bf1854a8bfc3a72207c95dcdaccbd2a971d28ff0cf690387235f7203a1ed4febc7e8a69e4e73b58bb264b7c010139df84c80f6c8b63dd277d0ecbcfd8ff93d66d66583d29f778b81aed1c11092868a1bc72e4634889b65040830362cd2773fd2efc38bc9457c8c75bbd110a079130f38d0057fba390e750dbdcaa18ab8fcc679664cfb0345eeda3b2f90f2655e8592b95426e1a91c2a00b1e91e1478d618c3a75343489e00789b311aafd4989291a0f95b05b6c642e42eceb6be82e3df95e1b1725db9c3dc5d4206686cf390f1875bcca454b5118277196222cdf04c5d8cb1c8a23f35844aa329ac10753d02dda2ec5f2b0b6283c4c91125f2b64c9ccc000ed29f756128551caf52368aeca6465afa203550640fad21c79714a3d0704a13e2bec7a89efb63c57664343a3192d43caa2f04e49ee2022e85bce5bd810358fbf90487e8d4011227c199a9c483066e4fb317dd8af46c6187e55b70762e63bdae226802d20f3ba3f6055e197465aefa6537acd2c0dc78c0aebbdb2d4e8b34ff00070e12ffca9748dfc6764482b1f0937080e4111de8b9a400e03590c3ba718e1fb7568d627b16bb52603751f80af05a79024ffeadcb24879fa013d7210ec6b5985e63ece346c5e7ce9713fc40bba189d7cff44e5e228a01952785593b31469b3269f483e48a30f1d0ef2ca75aa2fc2b4ccf56fbc90df8ea4cde65494e49aa01748521a6763926ac71b1ec8c26f66b06fbda6e8b43e43bb8368588bc61ed09c5efa72b309ba37076c0a0a4e1b04ae2fa4c2140eebbf19953639284b67cfe6ee3e0ef1c82f154431071650620dfef846d2bad030e6624b8392fb2e55cb192c43d2f0e373f7c694d1416a3350ad63f58858e5935823efb44ec484c5db24c452080a90cb24c7bc9ec20851b4c1ab90edee04e973809be5f748cef2f0758cf95ba89a71ba13d27f13f2f1db1885a56447fb79e260c56b8131905e9cc36ca676df6b4f7ed31b0f3f7413da720b83161994d5137459b0a6d6f2193ef3717cd14bd349f8c9c873fd594e7c03543139071053086089904502e0e9a41eb1f7f5daea68212ea0d6e9e42e04c0542ec969c7631ba49f3e443aa5c7ea96c40c60bc2b175abbed4e0ceca35945210f22d773b15009d9f5a616dd92946eda518b4ea9094c22157bbe71d4b0371c88e8e9dc0a79fcd14e4ca484f1eb7521c0aee2053d83f0b47864252ee1e983dc92bf798490fb7f2149d5733ce3db3fea3c905ceda983833cc07f319e20eadc69351407965adeb381ba45d80d414d21fdef32d062233d4b1cea905ce29676e99cc79dcc002e70d380e60f388d51acad0c5f778107c23e500d47371c9ca5e596ecd715ec4baf0d630a23a4153af80891a4e3b4cea2342969a125457135710796961fbec09a93075171ca2a98ce2391f02d5c4bbecb530930aa5671ff732d6d330d42eb82dba70d7bd5799b888026d53c5ab0a5d63c97ebe2ee2ac6a7bf3d85c8bb84d481306364d7401f76ed5e040500b462780616bfeb441ede9055bab0e410d2f676e68d346a4e5297b8d3ed0d239ab155728d5e67fe5d722154bc1cdc60f8597d7799987c0b1021a4c82c9f826b7a7e0586079f36d3c184be6796956aeeeafc66a0e99fedf0b6fb5de52c42de6fdc1e6d5c013a43ed71be613ff6fcfbb2164dd16d0c0765cfa9319d7fd0382792d3eaa2f2fe778e949d62a8a1c9aecdfdee82baaffa125b5522a0ed833d06b20aaed71f446628125747db601d03c7314140f8aa2005e64314f522ac6d7c82e36f2a6265467827e2935ed017e610229c13b575f42b2866658a6c36374b975135a37e9fbe7db4404ebf810ef7066f7c62ac1cd8c8ff3c15805370bf3510f2fbc87b34b4c557b11db1804422f332fccbecf0c39fe8571a2be6f35692121d960c8d8bd8b76e2b2430c9990b4f818fdd60b00337ca18d4138dabc61a40d575ef55510215882ab47bcaa44d5a993a16da446173d044a06e9511c83c2dcb63fe08db0127759b4cdb011cf1cc5d68f902cad88424948ab067009ac9bc3ebb62151e3b9a5ef92c99243f1d795d8407f7de18354da2b8c9b7349cda0487e7118927ff53b2dcc54a776222d502092cf93c12ca50910cae16bc8d57bd42b489d87865961a7f769bd325c4a068c36be9505e65500e453d827ec9b6effe16901479d78b74a816df89abc9ca93ce477c3af117fb5975bb11deaf0fec06cef16b86b68ca3f13f7a60b1e4929178d35f5e645def10791c560c8f064e3b8c3bc01ca74bd809ea5b74dc685b42cd0bc8b3994778cd912511cd0850069afa8d23162dc8609c82743ffcec06969408df0452437deb35614db518556999ffdaa311586cf7173c55ab77db58570168c273b829072819ba2c2ae355484aa6fbcdf5a553bcaaf183d194fd8c6ce51df58e0e7746272561ab3478b01145c5dd6a3746551e69a5cb75361dbd184a6fe3b65f92bbba6988cacf130407e37c99c6d57fc276eff14c40b3045862e63e63b5b9fe81f583f58d03d02ea1ba19c849d429aa79787a56ce6e7a86322535aff634a644d359889f0475f8e6b79800471304cbab32f0f3ebb733b325f5edb8da95df78ef6ceed92377486a88ec81b0c37257ca3cd9fc769f23088c3ba4cd3605f77ba308e97f7fa6766dd4603c7738c356e1d7b36f56d41f3c25a083e72dfd969a852fc190891a74214349fb69562ffb68b36aa231915512658c3ac9f2a2c1377712b50cbcbfe52403268c1f401a565a0641c7bb1ced2b6fdc09e4cc722ad83a687eb995598f8af59720d3fa01bc85b4833563f096a0caa683741f4cbfde885dd89fb7b20aa2d7024987bd188e5416825301d86123bc0ef39135c7a3f0e28dad8de98f4e02f0240554d25b5ca6bd76bb6225fa5a08e49244dc9988be5d1965fbef9e94495a6747298d7f33b9b8a84e2a4c9ef6af4b802acac18526987619e09ce86e900b64e83d96ddc3ff6cd375ffdc58c9f346cfe26d2f7b48563c37796df6593b274ffa3dc35a4dba545f20ecd6b2e4874bc55bcda23ef12f39c2d1e7ae8015193df44460618157465b60f6c1c2c0fa5046920504bdc10ed654508c4bee9e00bbd325f6d5deed02c32a53f3296e5654372cee007721f13b916e43657b06bfa66ea1eec0e2afdbe0707a064bb731f5e5802ce3900d8c0603d1eb5ca11bebcafa0bdfd3ce04ddae776707f916b27e8224557f806e17745ae9df26b413d83013ca511e96027fec11412de148d4b673ceb0c5df0d8812c13890d2e3cb10ebd460f9c620e1a354d58a36fa9dd6218ed939b02cb23cc04b087a7d4aa6d601d36f2e6e1a03e5f497c969e1744af136b51761eb3423f91c20b35b9f02bfe6d0fc2af37f68aa7a494d86118295b40236dddfa892dae337cdd2bf1cb1e085deee0d256d723d979fc74fbb7bfd8eb2a2eb4364ce95c63f5b742fb20ff7992cef6f2a22defb1f747959718a0269faea870ab64408df838c4c3edc618e18af691445f64fc382f84bee2f8b46b6285669de8a5178fcbeae44cde5affd52197f54c8ccfcc8468a53f1d66024a870b6c71664584f600e83029839cb8284bb774019a173665ed29f11cebaa0b387c074d6803c6e52bf083a5d2a0715f7f2d370baff7b35de4f753582daf8c247962b1c85ffad6c891ad7d2d0e22daea491500a4cd5a0cb525ac656598dc4c18f8e27eb90f719f8c3f6e7844d2a477767f7b869ff1045f0e6e938810d02a1bc4103d7d8cc204e075e65c47881b10398a570b50961b4cfdac2769c6ac3d388ed4cfacfe9587e5c4e209549684760b9f7d78afd8fcf98ec27b63885ffd7bd74a329919a57a104109562df538d05bdc067cb4ba46ea178ecef47babf30677fbf34d273537726702d37a0f97fae6d17443908af94a4ea457002e89d9d1888a254bba1eb5b364f4c80da30050484b15bb7935a06056143f32895225ac77119d25b735c1cf6d71a71f101a0e0856443170c834b344c18ddf5323e305d9db55f7ec5939c711334dce1d64f44787aac03a04cdbb0156729b40b64ee7e3e570a709b175cc5b8a7078bdf6257a4d434fc332df57ae191e7239899fd77cd598ec0fdf31460d4b49885a68c97a1933aede95cca5614d5e34c4cbd26c372d82f883ae3cea8a31789941f696edfbd6c7525db9858e0f82de4d019ab06c2c7d89a52db13867b6723966029b6dccc12ecdba90843093845bfd5b4a5d859788fd1d7ce6e28cbe9a5b40a8c3d508cccf6361512f47878637af8a7810fe61f306dbcfbf6bb88ea8d7f16d2ed48133c8600660207f4525fa236fd107983127afc36dc24bec5649912fe65fec13941415b07ec3ad859b05a695e7b2791caef5e49d0f508bcfe4783cc251d8e1af023c236c10456058439025a342962b3ea7e763610cdfc6b3a7c96a2b945cf1ff2cd2c835485bff97672439f2a9fcedfced9f106c32b09b59bc60703f6470087f62dac55e77ef457b53cf326127491e571f026c2f8cde2d3604c52e2a45832eb7647a5e2039d0d1f509834ec6e9d60e26ec5f37a2f7053fa29f1de51e47d130e5169de4fd461cfb4b76b8f8595c36b7bfaa07a0896a5b6f466a79f6c5b4974750c7762a8c2213ec2176ecf59ab0cc2effa63b113caf753d405f610b415435aaa3da48d75b2da2bc2d1dc3dc3c7e9a63e3cd6375da722ac5a73c4dbb05ae8fb602e85c67ae8d393b3ef70b5f8eda7eb93ae4aa0f824d540de5e91a2fbc4d25bd07d721e5e629084f71a04f1d67416b7d7185c53fe39dd436ceef9d01241b4cca952c3cb46bc2e88744d153f34c0b591fece10640a87211a2785892114c0f1daa26e722b7ee39cdcfc1c147f76efa76a07a855f3c3f0955ff9cd65fce8e24e9c973db5887632ae7afec037a50e17b02a799f2bff9685c3f5ffeee702e99c4dfc984bb58f51d1658103acee5873bf82cc3bd516e2e85dfd7d3d755988223f79699b9eb3125c3fa95ff5fed1500ed2b8b0cad571dde47fd5feac1b9f776d5c9414ed8d26ec04b2651e1e1f0b10e48119f9d59ce38dac16b6b3a80fed6fee2cc7e474400abc0e5875da4d4c40277101ff9cb3d6564ca8f6f6b5d4dbc93eb17f586283a6c2c33f036bbeae61e8008c62e7fadd92d151a50697c1f23c697d7a8ef38a1809ce5a69f39ba69f017272e7d34e2ad7b7620fa1baaa9e764079928bfcecd5c4af617d4ce317d562ea232a23b1b19d479d083cd57e87f55053c4120317557b4ccda8e3b19f815b119226dfd7865bd680644aaf2cf33a47da526a0e81c78c20910fcb669efe452401c53b57356afd1229afccbb99c9331148439c93c643d72b861838efc8adf50006e88cc8be415b64739d55786d83f641c97b685426640deb180c454e1372228c6fc6167e80e01777b975a22e3c48356b74ccbb399994a6f8e4fc32bd91d26d8f0e78c91d4c853c6b6ff35c18ed93a3b40b71789d0b045299b29f37828daf43d3d1ae705526f0c3d3b42083e847471f66de3cb018c3f50489aed65ea2dda7f8e2511eb6aa12388fe80b68d897db7277644888d8f7e84e39ff78e03bed918b727ad35269335e68555d822eab7c7b38639a4139645f8205fe88349326c8faf2e7737b74c5d60de2aebffbccbcbacbb58df7a5a74cdcbb5ef90aaf1eaafd862cc67f42dab73855011c043c78873f3af0216ce1b2b8032b5c23b0a43e3160f9f0e6e3e8cdc07457c6fa3628dd72b5a150cf3fead105bbe9b841bd72c9d801227a29e7fcb7288f12289c730bc2a1ee4a6878e56c9f4bdf2516239026b88d4a5ab0817411aed08b12dfadbc76e53ddbea7b615b9d87a4cfba4f9ce62f594aff1a30721dc374c2299f390fd4e3e9108bdc4281f85f068b8a832fa9bd64e712544b2315b42d81c3e335f8e5759ca5865a1b45ea466a2a7efa82d7f4d421960fa6c53b11215839e20d65ac47468cfb7fb1f333b25292d54f7842290e8ab22c8363d3212f0b0a165237294ab91c6f58bfc88300d1b0baecea2cf5babc3b6ef0f973a234ec80a7a2f5b559b7d91c99f82e45252e7a7b63f69cb0d278269bc523e16ef2d7dec10883f6a2220b1c849dc731d13abb920d59fa4bfdbb18d8a9abe71e2a31f3ee7175388785d1e44a69fee27a820e5e7785031a05333878183a4168480256406890125fed87ca77a1fab4ef6583b4cbecf1e7b2ff2b604e3860bb679a11e2ddec7f993abf2905e2ffd5ecd9b5711f0ee042f22240af2101b5e29e62985b1a2ac0c51c7cef44b62476410e3976b326db1fae13c4ab4b5f5fa6bc1e20d14d2c83943386dfc4040db1bec83fdf3e7ba7e1840ba74738355ef57a8aaa2712822247c9e3aff77bf59425458445e4a0a92d6992a7d0c22b97564f83ee6ca33931389186f759faa395b644086654bb9affa5301604f708e5f0af2441b269131eaa518572a2272d148d9ad32f56b5ace8dc96093c4def4d2a91c33998e0b18e09cdb1c2a228946655f69277224fbffe10881dc344261664ab005d0224308ad77b84c5e9e7ee7b71cc40cabc7a201086572bdbdb6d7a5b60fd90e4daf25778c7da75408336e93e00dd5f206a2e2de0c24284fc1b0a5ffebb36b766c8298ce231601677bd04476a86efe144fe6e580f904020ac9d228061f22136a093a343c3cd442a54428f0e345849345af104f6c0a83cb44f1bf76dda9ec758a4623a120612097c74aead060778dd39629b6c4d772116b48bbc5c7ed4986eec15465201aff25ec63332beaefbf9235e2162e9cccd5c9ad9a08e58c96d4075488d5e383086d58f1c2dc002ca94e09339fb901c3fd6cb747486cb37fe1f20041f9c6b2ee6cc746d28590a2bcd01fe04a3a801f081d6d00769255e584d7af5b1a043e4d700b7560d405557c3af67f1838427c01648847cb29d05c1693d5ea04f4ec3bffcd8fa938cd6de857a49193dea3a1050ecf5a0bb94213abce7934f31bf644900e9465cf865868edffa4ef92bdba5a16dfd48a997cc6c4b2b6c4d616b4d074c74e166dec166c9a4af99ed5692aa419485cd3d7953e18698e139ec7307b74d8b84c9f94d86fac73a5dcf407a2b6456f4a7a111001d3a48b06a881e15f171e6f7eaf519c813a9264a86dc2a7d7d45c702101366752bf26ac066cd33a337c65c76c93f4e1ad7fc9bb0f0ca43a83ed7cf35fe9ad932d7bbfd79340c3fd8d61f84b8ad4c2cb605086ed891c5fc3da0381183866a179fc955b0cf88f1460e620b492de69d53a151c8d44e35c3d65bdc527f1855f13b07d45bc49a48362a2d64512432c362492671ab74b91337fa6590b739483e3a3484a2c8eeffca75b0461628471c25da07ccd4db3909b85e5a20df09d85ac01fb545625dc9cbdf78806796b5a38e21b812851dbbecd92e3b3594c4bd8f39e59085cc642e6b5a1b2356ae15f4a00ff9cba9e7c3ec742e760e0e4520d9c3c014b677cf5aac74c1c9500b94b02a98a106d0e8357ecc2f2ab363ae0d8c270c9a543bb257f33469b02384bf1a4843890ab329943bb10c43aae35e5d358f97d5a2a8f2ab8c36b86dba276f9fa4e607b04afdcc308850fff9c3eb46bde66026c08c89dedc7b6d96e91bf5fb3eb550182b39d5c89ac7554bb8fda0037d29f89f9392a2fb35c35b50efac2064f9f540fa8b78307c3d7db0a0d292c602f23f873220bbc5a34c2d3b6dad603b50b0934c05a6db27e46c0f85ce7493d98bb7ac56b24c54e94675d5517a5c73616e178eb40d5833d1f021fa8baa4e86160f1bdc8ce0d0ca102dc2e36008b27493dc0436c97d6e2976212f229713a2d33ccbd13921ce0decc6adc61bd398c989b4b37208cca4d57c9e524bb6976d7042811595439f4d58a85d98a36dad3f4112aa44b13601d13e0e97de50d4922c7d6f3508147c93e620cccd4225c750a539c3e482707112e5f8a79a89980a3ac6f993f7926f7ea959970a7c94d8a3b11e52658019ca09c0e7d8a0aadc2f322cff6707a65bae011430323053e7d3807a01f0cf0a1dfe6b2641a0d3e2e63111e29805f95cc3475ef3115dde93d3b0933b2de91a73d8df686730cebc7942549476e81a42bbad9c89a9e21a23c975f09d64bbf2f92fa5db19f2945f723c5e6d825ddbbd6ad9b96dfd7d510f3092755dfc7b759d08f8c37aeb1ab8bd445af960d8296961397e063418a41c36275670e65e10332b7a43088218bd836d5d3b702575a052f31d340034f64a2941f261e537a311c2c56ef4fd539915c0068d7f1ad0145acb88af7daf1c6ff510b76a405644c84babd7931bf1c09855705f2985beab880d6a30bc9e29317e3321726d4e10220cc70747369c4cf71a2fb6fe4c4c8efae276959a4ab33cb909a1ab307e6639cc65641a55badf6eb734199213c440289a37a1d936d0ec9c870e7514c6eb1cc3130ac659382816f6dbfdcda1bacb3b0799a61feae3be4ee21dded12048e4d5766a3ad9237d2aa62cc636a761a28868d1be495206466d1a99266bf9ba226ece9e8484b8c5676f1e1cc2986284aebb60c94b19c531931e2d0c23f09a471755ea49d3d53c4e3e4125db8cfdd7a8a09ee1ef9a7b61db2fe122cdcdfa9b750dedc7c2f329b574ff42d0934dd58db76f6796fe59b7312545fad99b929f4e29f4adf3f5c68827b446a87e28398789b9c98125baecbfbfac1b74a0103bae63d9ada8bd72c8291c22432db0935301e7cc2cecde1ca47b27e80f8677238210fc86a624c34042b68e1589c71df730c42a3bdfe2ac27d7ea7d15ab1249d07c6829bd2a9bfe710f3df6a8621675d990677b2f3381fe1bb132cf352a36b557b608bbb0bc13adaa04eb7c196393fc09f5339afbdc647e8b6de66672fcf9a9983191de3ba96133dc3bc2cdfe9c73e3e8c8cf133f7f46e7c3f2adb80197dc272ec44f95176580b6eabf159b6cf45776244f3e96c8c64825a6eadbd29e3851ee3ae106dfb0ea304b973cd4a136ccbd70dec7a5a6234fba70b1ed1b5a676b78fa5e187d8ffdcdbf9ef083fbf5f0d1e07028fc955efee2d7d1fb0f94716cada0a610c98e68ccf903a4ef5ac467173e8e0771d39e1a2267898171d47365f2c2000e6d93930dcade2c56d3cbfc620cdc2fa9fd29b960c2aca0295fb176b1618cc8352a9b6f160f80d29dc29a3c1a5138d39c97c36c9f0b59a1a5769ca450cbc24067dd65000898b6ff3dc41b19bb9a17548f2c9cfe2b30e4c8b2a1eda017e22f884e5697aa8d89640f0ce10dabb4132c001baf860f070dd2581e1b286c89fa8eb84563483ce08372c6cf1310218027c28e2272e927f46be9c444dbf78e27846f97bece201152380c2bf774aaf6d50f68721f1044f3e7837d864233c4db90b40163171986b574b2b258070b6e8b1284763613d792c257a12f5ccba391b6e26d06e7c5ca7009ec4837cc0f98192a9875cde1ac1d229e59a765260e8fa4807629311d01c4fb0316ba857fe05f70ebf8e0f260177d9168c8c03ba732f4214178f0f8df92a3f0fa73962e6ed2525dcb49768f51dbb442768824163d6fc7ffb059a75f8b8ca49eaab4a2aa3e03bf66f4ffd91307d75c6f1b09b53b29f2f2773c4641e4323296414a83d773913d15f593cc07c0c1bc4abe486aec3a48c1de23164f2e229ecc48a24cf20581ec64dccef38491511f79c852ac2d5457bf003e89662a48cb5dd23871aefe21f155fc9ed8bf6fffb6c9e613f7289c68b3dca1b0ba294ff6b0b1aebfbb05fdd8a65424cbcab8e11736776ca3b3aabd27044f949b970509b732cdfd4c9419e22f18c266172026148d51f6cba006608e035fa1b5cd74ad4666e463c87ffd0d58c173d02c2c9da43bd751415925df6cc2ba6f68d1894cd38e44d079e7f596d3a42d135b5f700188dbefb8e25dd83441e75d385006d239978968ee3c0d183bf9a60efee98fb78d1a50347d084674944f78781216ce77ea4f52a0cf0aa6c264507f34cfc54517b4e07a13197e3c6438a96d76571c93f0e040591e4d1ffed0f1c2807d2138269246da0cfde522f38edf7b370e03fe1885db5d3539aeb0444a6176f4f24f9e4c482aae8fc4546870b12f1b9e418abb48c41e71528a4474f881496cfa32d968522ac9acfbf35d9104338a2b2ac0387d6f44677dcd5d3453f318d89ae0abf4c88a724eb73a803aad84b3dbb4a355ddd1eca51e3968df81ac779318bfa61585f3c38c30c026a08e033c06955f1e4b743b38466b6b7200f8c9252de85ca491888fb5d8195e7d11d8596e4b583a4e63b576443f446b9f46d8f5bb4949c756164730496240a54f85e416a5552c9a93f38b5929706e2903f52604077f9623bc7927081cb9722a66b81389462b8acd7781e10a9880b41a3882060036acc5a371ee26f7e29f71857d73a257ae7b90c09ededd1044da2dbb2576052ab6a51dc44f00a6982a7b38a061c59ffd588498bdcba05853faa5d50cf4d03960c9344be7fdf68b44b56f65328e90972c10f748a35251b4812bc1b904d68e9d055a6d913860a1e2ab4a0e87cdf0bb89c67893cb8203784e2771183a3da68a319a39e15347b13af0b8d0392dbce9dcb6903a4f25b359131cd9e956c935b0494966438932bbbcaed34b374730e0050b5ca3f1dd82e8db25ae72db57d744c1741f18b7377e17c6e9186b6c71a9d46313fcfaa0026b0fb62b601f708e860742e567df188f44c1597ad8ea2fb0060346cebbcd0387c1f17b4711abb03f3ae1afaf0f59df867a4fb5767efd9f8cfa9259dd29f5bbc90cd7873cc076ec1f6c3540bfeb9d723929c4aeefc02f265d40f2ab9c35692d6cb3ad954cc7021cdc2cf875084e3dc548db3a0c774dbeb2315f3a9aa3221c33923fbad00b692bb984f67a437dcc4802d6e93a801442f5a13234f487b20bc40c5edb0d280878305bfb8370dbd5b170adfbc6392bc396106b3920bec0d3a63e2c2033c9fc41cd79282087d46019bd0bb17bee52c833d998db6b18100a551887b080b3ed9442ba30af4382a5406abd472328602b9f5bfdb65ddc37b6eb419bea9d9d3756f8d384820af18ffa02e32de964e0a5d3b1b75fd048da067390b5fdffed94e5a53099495c3d5d728d05cff30658ab80eb752a323b4b3d1f06677e858183d0a433c031451d9401a9afbb0bfa563ecf11cd2922513b52f79f0852a07daa5fe6941863a300160bbe07cfc5ea23d438fad2e4aef262ff687dfc376e850290e472ff55ee8107d4e8466d68c8654c9b9fa35e1fbf31e1865c5d1a5ed887d13b32076d49b83099286c420ab69043b9db3ed1810d97d372869ccb53d4e0458170aa6376c4126be983e4f3211e049619299c475e2852ac42daf960112153a46dab256f426463c17629a436362b00088a953ce04566d900a2a0cb62634d9bc22a05c84791fe1af05493bfe59243d8024ca91d7b0be5440343dca336a71fe205e02b3ca39b5efa0979f162addf292e995229142f627437e5882d92fb9d541538fdf9cf9f5ca790272e12f691da14ff1c3b5a63d44f8e3bc9c693e68c0cde53ebcb17b9e30fe44f4866f60e23632bdc692ee9cd6a8e4e0a00db836e89acc0e44aee9197261569cbb3766c6c619d376df36fec7a77f083e6343de3121c4276efed0c43340559604083e7e68d21b07f1349483918cb0e8c651e1711406e492e567cbc09e3b8ff7eb25de7f14cd2e20d1aa2ed42eccf34610a64d2fe3fe11b723a8e36e3a95036bbbd5b8ca76bf44764f657add728d678a598299e53ca7736ab1c1a39fca0b72c3f40fd74c6739f5caabfa60afa45f463d5ed7fe4b88fd92bb5a411de657efa3312b001f2edff252677969e19f3b19fc41eaf9951efff7144160968b7334f93241b6074ca902f16d780a143c294ecf0017b86d03a9bca96822c93b9dd085038196fb82e81bb4393c175cb2a559c92545c48d346b5974816a67c3017688439f9c1c6d1263b7481eb83ac581a88005559d73ccf6f68382cc7800ebfb65fb879b4b0334235195ad3e7c9c3c7f45bec6d044c54b3cd50e8512ca2bf71c10888baf14f4223d7455ee945b431e23b01ae22af99b58422731fe1cc4dbfe75a36da9b44c0cd1082e941580fcc7b6df20cea445ec9d5c8ff0f318f03c0506fd330d5db6cfbba23c73d296a4e49ed8b9226b631b7e5d8fed080cf5139a1f8842d25c35c5a5c23e34329fee4e64a12d79ad01697ae68596979b1016bd13d6cd40803c147a5224d2cbffda67902751a154ea2dc10ebc20df068d429472e697b60b67ac023d8ce6723f457c78e93ef87be2421df03fcb841f8d2ad5a5bb9e2ccf9d3032537fc9db16e1b27df119aa30713ea5962850213164d32c4175e934c56c5a00613488375c4e39ae1176606bf79e1733750fcd8aff65983642ac60d1271a9c4365af7d48b59bdc1e062eabf4904e181646d49eaca52d071d65c4bc436d00a7b94237404953b8b444933c3c5ee9b4d0e18de4813b507a58ae86a037aa94e81f4e02b6b5e01972ee68d6a711c85dca653a5799247a10471d5b0fb48dffd0f3caf5c90201262df96240f0848c02f5ce82dea42eacaf96882c58dcb4999c35753b733d6009ac80e9e49f00cbe633b7f4249e947bfd5618130e150d292b12e36c6b3b3fe8a0b8159cb5a2f160e3ea9ec271daf9d3ce3f82055384b3bfa081b78486cb6846601341db24867505cebc9a508214e07167bcf6877ea901102ff99b0a21f58c92aab856ee4e5bd579a34b026cdc24d09807177580afc0f5d5c210ed795707c6101d119c5e7ca334b4b3d7e7cf664464994f7d44e74ebd8d1d6e0166e75cf61df8a3bfeb605b059bccc8b0ca65a20a6cd62f9c9017e62a24bbc887753fab15f5198b1318c4318b57ff4f6ef39f8c622fd3491829350fd765e3268684d40510eaf26bf68b3e1da64e26e60dc1f402dac64f6e3517ef51b37073c321db4fb956c14adcd5f5620d565dd8e7ec916dd14ba60cb51ce861c55b7d31892a79a8e0c42ca9c32e0bb82a239ec55ed3113aaecf5172492f65d26c135b977a4f5c3bb396c4a2c33355918da88d80b852c39614db94a9a3b95d4d7b16c813911f5710c38fafb709966baa9ab6b2da64b8e83ca4dffb33ef12e818405686cbf32597c04e114191fea64c5b398c0901a17d0d540cdb23df83ce0d94cb8d2c1f3a24df6af2d18776114d16cd48a60bb674fafc53bab6ba2f75e1325f3148ac83c0c91d02d02bf81f86fc01ce554e7126966a937cc7597ce63f86ec46cecedc21f1e08d3f7992d834505bd0f1f9ef2c2e03b063feac80bb57da9b4650ba5eff7759df73f074a0a5f3b54630b080448845e4a90df898c4ff53d3c02b91e5dfa4d67acf9f589cfba25d377407b79b49cf7c787da3caa93f42cba758a78a42797f387394a118f87d9efccf2c19be11653275633fa849eba096c8886c845fe5f922a2001add80ac2d6bf306b55a8b15db4d0c1b1c39ff25ee7b8407aef21772e783e3bff3f20be2f7441c6e1bf1dc012cae1873f57389863dd240c335372605a187f05f0b51dd69678d452714e151eeb2dce75c330186ea3e0c9eaa87c632218457c4cd1cf2316e70717d81cf5df97421f6d3a41cff1916b89dc4f50668c665ff0e873254b417eef95a88066b2b0a1f1a2801890b5a78e117d3ae1450981454ae09c7c8b8fbfd1c8f92f839bbfa2f89d816ac57d12c97a677d8dbdacb261310099b5c319b00c49ca4d73afae45c12e30dc4d9dd39f0e5c5c7aecb3df1b9db88a07577d01ef7cd9ba172eb0bbe82cc97b1dfafc8d216984c7e24c3bd6ff2eaa7f3003b4abb3b689b43c81d423a1d80468ce64115487d9fb35098cfc4fc6547664a582bfe94a28a0b97c97a839b7f49f4fa3aba2e6adf8e38de90e46a7ae1f7a791cbdb318777264646f27cce7f8fe9c0c73bbef402bfc7234238dee234bb1d1119828359a5665cc715b511f9aad8d3810a925fff520615a6f687d68e20a7bf56cade375f389b700adc6ded373abc4a979fd23f54663213c91026245d1d814a9bd63888e3c78d0a44d00f6fcd0837f651e3cb3760ba021e151cf9825bb0608a637bc47663e06bf29bc3cdcfcd8b0f1ddef13f684cb859cd9af580b17b0c4485e82202d43e92cf8ad3116ac168562507a57c0d5789e525dc108160f8f20c43bae08fdae24594b8351f0705162d86ab3ae44d511eb11052db378c42b1df8c22ba92315d217cbfb95188d58bccdd13d62deeab55def673caae5271cbe55f020fb7993320054d2b4d27ac59334efd384de0c953f08be8d05d437a831aeaeadb1cfd02d49371000a8af56253f53877b1b353163a020c3f84a68218cbb6c23150b6bdd57da061720e3b70d26efa31884a5b627aec0fed84cbeae4ef97cde04cb5a207a96b6dd9c7fdc06e54ffaa9f737306dc943173f3d601c58fbf0f6d49152e4a6f346b67487bf6665c3104efa6ef4830ac353a9ae0bd9bc3f38e96cb60dccc99ef8efa64d43418736e5a54304b9f54eaef8c625cd8f5d46dca98fa81178cbd12eb52a2b74f4c9993bcaca369af876fdf36f64c717b0fb0364f27f3fefec4d9e44fa666209d5e21f24bb1bea1ff16d4d776fb35f9b731d8a5a981f0cd0a413ca41fb8f77479faa48d542889368251969951ba302a8883b511d3b5e37dbf8d713e579e4dc836781d3b9ef11f707b708e7839720fbb0b96d48b57fae034fdc875bc5f6682fee2cb87cda41c214b60ee573e9240071bd34b6817729c7ece5122ed824131b1c5b3f25a879c3aaed700addccbba69b3cc1c830462733d7e2f489d511766038c2a30b982c46676153b1d7d6e2470c8b7e90748f9fec97379f5b4e37f9bd3444f7e9565246f3ebf72e2cc45166ec2b4afa3b94fbe0edbae7e6cc19c5eb13112f864a28da29760e7831779b4af8c9f0e44d6dbec2368c3d1e3fb6a7cb31e3c3246fca7a6671080f355fa489f2b7a1e9c9e9e9ef17b909b3b7573e3c089bfcfe43395f5e35ceb1bd5e99a1c7226db1edb4ab89e450c49a29ce64707b2edf45123baa59ca9f9f95988bc289e3b8f549617321f055105a6d94f6faaf2164517b99c001dc9a1504aee55acfacfe4848951e81af6adb30bcf3d80aadaf1f17337df4aba7560f0787fcbf823c9bf9bb8b761f16df481d6a36e574c28a5786c7acc41ad994eb74584188f57290d01c1db457e4f49ffdf56acec90fb95737722fdc70cbf6e286b37c985f63e04bc1786f2793a929fe4ba9b7344cd1f47a61bfe4b8419884a42084c2bc6adac46ffe216ea2cc2b487ecec9c9caa2c4cb35b5dbc3b29882886452736b6536e9e973ef4d4bfce1ea3229f9442034d148be8b1d00099b505b74cec877a6d39082da9a35b96982d5d2d894388b42d4ecd0cc66bb03daddef08ecdfe4fe53eda98d70ae0a236c2038ff39e4bbef85a79fd1a75dc4aec1527484d31abc09829951d01876d9c777abce7dba14e04df89b3da386516e674b95bbedc8a48b6276476dcdce623da8fffa36dc95bb6d22b621f017d544404265c8a9d81912a6ace036db7d5ec43347005beb8097a434662f5f56aef1a6c717a9d98fd0d4ff958a8bb2ec7517b715901d4a9e22c66b150451682f3f1f52743eed71290ad60b41daccec84abfad4971c5a0a91b2d39ffdd199cc32f16161ba7978f447360257ed3fa6f01fb61836dcf9ddefebaebf003890d54173a07a2dd1d9d28d1a8fe2fbb1936e63687ed46a6cceb1610cc57006e48b58db5ca9d1e6df1259098702b692f7bc04b1e357f78920405a181f95f726e017849b17939a7ec6f494f288fd003ac2f430612e4fe0fa86cdf358228fc0c9cef4cd07759a54721c673c14fc220aa51a3ef9943422c88e7919580f75b6eb4dad912cda9781cc3f549caecb61c387d2cbacbc842c13a8a6a3cfa8f16c86cbecd3fe9a238992301a8c42024690b88ab85da58a1d5ac5861a7d7bfe786f3b8c190b202c3893c2a1f8d53606984964fa073d6731a241e7729d37bf301b063674fde91b5007dabe42e897041081184c4026feec0313873514d6a218d6df6c6f09356ac950f237a65bbf48c47d73a038f210a1f15ef1214f4accc5fdbc8bf1449c390697b12a9e3d9b99db6621a356ea273d833057ac2c58ae0ded3678c378eba5e4885b4266441fe9f82e3c119ad0118bb940082701f7dc057ebd9385a42cf58cda71d1266ddfae9a1d2e185274c7cc8c006ab160a9cc5d8a77e263bd8d98703daa52ec1080cf71251f70cd91efb74ed4c439721d8d7b0504ce0e221f2c98f6bd60e3d5a3f002f91c7588b5d20aa8d9f7f6fe25680c3563279d903ac8a27f69de517bd162a07ea64dc775940d1594c7fb642f8e258c62eb9ab176a8760c1511e67df24267084f1165c137aca9150b5adb093275d9a5978904f79eb638219568df090c4167dd67cabadc2a432625d5032648b2d7a225dd36a031612326cd45cad626255d2e6b66dcaa4204f8521b54ff25a91d29e5b64bf1400fe25f98fdf1476e1275ca024f811947886ba212108f63403151e4f5e6484c3230868390c45833821890c36432197a253c51918d26e4a3af8659abe29b807034a2fea248ee37db7dc064ba3295e4b626021fa79a16f124e16affa3be43d057ff8042da38d59258e50db158bc553707ddef8fd270a0d8fb431992203e768a174c81b58f96c9a61cf8eab72544ba42bfb0be70b8e93c0ef131315b12d0893d3982dfef0df5e80ec8c231546eb1c066a830840c7237097f307b3bafc85cc1a4fc92491f601af9eb9c3ed07d767b92c98ec53ee9f0f0e15698c05d985d06d3c022ff0a8a8f17a9b14747da009c1838901b2ca8aa4938baa8c8b037e6644150d4410a0b5491bc3300c268688858a0aa6e8608e02b668392d8b1f5b631b8d9a8da5db4aae6ceb002fa27907dfba4d782bbe000f8aecdeb4339254de1dbac0bbbdfc5687fd24eb0f9e0cf40b27b08d139806494279d00c8aad3a5c9c401e9c402128d5e4fc4099aaea6bf5f12112f31eb922faac502f1a3834831084a8a2b63011e232e19c70e288609ffa2071299274d2d438695438693a3871429c38cb89af13f62389ed54d01f585c1c0d93054ffa0b4f883ad6c409fbe184c120a1301038065c86c704d3b448304d2440a1003b610938d69a9ba1288f50441c8250c3f2801ffcb0871611c5a2a1c415419024141e705ce1c58b66103d7898cf0c555b68261045753279608200ca8ce763c5264eac70e3c40a2a7cde43c50e1ef645d5858d2124e1a48a227cf1a3d0cb5dd9802811e599a128204a745205c70d921bd5733fb40849b2c4668a0cb02469faf0c614202a64bf9811816250088045057a51e5630a4754a1e9640a3948523592240d1f2449e3461b7b58430f92468d3c744213094a4c07e573324514275340713285025078509101314e9e473a799474f242d2c91b4992c60e92a4a983544d219d48b106a90627526c7122451927527c21492c28410a20e210070d1d2449330749d2c8210e1faa23d2c0419224cd1b4033f422499a34dc20aaa82d4e30c0058d1b346d90240d1b2449b3068d1a502a7081345688b2271710802445218828d488020c2751f4800349664c9219731285e8240a21ede1c0c49e1c1440f9745072447182b206499242a00f553f1d29c78989154e50c43841f1e2048a1440bcc1861a7690431a6b38031a50cc2a34d5cf48e53d749e40f14ea0d88024492b404149018a67164922d1605f860a8528fa441c9e08c2133778c206663c918227a82772fc139a930a2441b20f060a16d5dce20b97203980f00372949828c2119a3224a20f6a98d0c1640e6e300943124ca660c203144c000092244d5fd8cf7f811213fa509dd9f2269c1309404992649c44401392f41272c14904825085a659759470128129aa1308b4a00a4d473e238ee8c867347d94884e1eb0054962142b8ed455f93839e18124893e584c4e12dbd9545888a88f2864ff379bca332b556931252b40312314847c3c68e6658a4fd5794bb180a80f16270db0815485a62433e68ad057f652568846d40903129172c2800e9c28208d0cfc60499258208303b420018628590423dc2841a3840c2709f080a4714333831304a821499f190d19d080a20331384180002449bac401ec19064822499a31942000094728421124c90c498a410c66408624955146a8c7013a1d901a450a94cf7bda09013c484a1620090e5042ba42152e70841f42c8010ea42152910e50e064001ac9ce0fb91b09400492d448363c78542702c81180499c04000e2a50785c8a0a7d4c47b4b91fdaf122430101557054bf48d501f9a83aa0e901c5740010872405917a9c00a0049274292af4c412de529f138d0f4e341e49a2b6902aeb99eff2a12133f43c78d4ce0cc9d65a6badb9bbbbbbbb33c618638c31d6ddddddddcdccccccccbc7af5ead5ab57af5ebd7a758c31c618638c104208218410bef7de7befbde79c73ce39e75c6badb5d65a6beeeeeeeeee8c31c618638c757777777733333333afb5d65a6badc531c618638c31420821841042f8de7befbdf79e73ce39e79c73adb5d65a6badb9bbbbbbbb33c618638c31d6ddddddddcdcccccccc8b237cae396be62266451a01269a2049d20cfd15b5633f44a8d01b99f9a105c5224379fe878609a1e78844d4e7a3c1424b45b1549a2b4892c60a92a4a98267cad0cf4c21148b2469a820499a29485290a459d92a2515a0cfca8746a2d1ed4c8a220a7528caf4f18caaa9fa0a0b4aec9024cd1992a4818224699e20e9a084e40449d2304192344b508224699220491a244892e60846308134b2e2b2d1426ad1051016b969e9a2a5456ea410225a74c1c5c60b1f5cf8f08c2cc5051cf58879d10a0ce5e901472bffe9c07c241049b44092248d0f7a603731a3ea3d33121c2a764892541201a9e40c48a8a00a4d3374535513a49141621f0c142c449ff9e9c4744231a3cf3f220d49b222029a91e4197926b505cca7230a51d407ca147a84171a2f44204992a429a221f2224992678aa68a23b4901a8105fba11e709445fd2226f0e69c113ad0c1082f6c872ab2f220a8cdb8a84494a772375a841792f474fe506929623f3e66423386f2c82402119224c95c217ff8f8214af2a32e3e2b2a2d459ece1f9588f2b8d8a7c2dd08a50a77a31df552d40d21516929b2b92124a1078d2a44b8808ba8b414516929f2e94ccf10974a543dcc10106856a3ea7308151068f2e0b1015552891f2428c40089219214620cb09988008c20499209241d847843920a1137f693746e10e2708424491e8f6322a11fc283c7065411c223499214253ae288e30d499274c43102a90b38dad0a1b079535d5143d515b523fa1836723c8223d83c723772d781636510660091248d073a20499e5048564d0f0ef0a7f2418940332120a24f871a8281900f04310641481a0ae808440fa27080243d118427cc084403a44a93058fd04bd20c208af007454892540249072056159a38a209ba62468485864715fa4e0b0a473441281e8f0f1e3c74fc21057e8843871f5c241d6fbc21bd91224992157cc8826bbd850034259274828d1b3d9024c944d2c1072aa4246b4dcdd3b2c20ae7064842e181d2c5152b6e0c91dc409124e93d9d3b61664c1b9a9024e943a40d38d440d1b186019ad0860aa436bc90daf000cc075aa1f242c48a0fc582d286244928f6d339c286212410c5c61924141e5c8409483ad84832a4191b3b24c91dca870d014892f459d983225078d88e1c244972d1b18726ec218924edd88310499276a07cdd438a24ed40d1b1870668828a1d6bb081c223f4301d6ac5435923079224893e6b8024141e6b7821556baccaae610022920e3dbc21e9d0c31f241d7a1084a4430f71d4cf4865e6e38362599124cd8e25499a2ba4c98a07cdbc4892a60a49d240f11e3ac3e854df22499a0d5492a4d140cc7bfe41332f92a4a16214b3a93a92a4d93185243d6846f4a099299a97925334b5d0a1468a068a0c4892a491423445530b22208a054451422449937257bef248fb91a11f7725f443923418780f9d2fa11f9fd04824aa1f0251212d5c8288dec5332b25e4ff25886752ca1344f42e2a2a2e10ba40e842c4b10b9166765242dcada8a8c0662bd0b1bb15cd05242e64a8501049d24481b222491a2844d547923416a88024aac20043365b7916214244414441840869b6e242e483345b09030ce96ee5598408110511051122c4dd8a0b910fe26e050cd94c4524a4998a2848339517d24ce58334530143ba5311e24e4514c49dca0b71a7f241dca984e101d2ac59b39595951517222b2e4462ecc747b3955017cd56429417cd563c2ecd563ccd56c2f00071b712860888bb9521ee565656565c88acb81089b11f1fee56425db85b09515eb85bf1b81009715cdcad784222aac5dd4a457d346bd6ac994ab366cd9a356bd6ac59457db85381f1741e883b9510457954dca9a888aa0fcd6771a7220a81e1e24ec55a1fee54e8c8c59d8a67c4853b15241d2ddca97c3a5cb8534932b970a7f281e9543320d00c89a059339715222e2a445cdca910a99f51e8c5dd8a8a16cd549aadb8ac107171b74204c810772acd5456dca9ac346ba6e26e45f421d0b7b85301b284396041b21398c3169224e99803cf410159a0a0f0f80284c24556111ff6635eb412a2427280220e3fe320461cd6e4c0a18283186cb3111c5400872924a99a28554c33ffe30d492469d38353cd2d50aa8992451a37e022312fea4892460211903e8c4e15f3a24eb3d187d1a9dc504992c4bc38c2e79ab3221f1fffa1649e45a5ba1f1ae2a1286abf873b2af4617ca8cf045513e4c28621fc70598321d63004697a149967594305663649dcadd84fd2510951a23aafa53aa1ca7efed38179eae97c0d5194e77244309f0f813af55b5ee4121a0199992c3fe3230d6974a1230d4310511e978fe9bcd84f0704f6d339928646431c68d041094494a7aac27e3a47485082890a2beca7736487fd748e5c6ac60382cfcad70972b1ff79501792a46180660167c8e20c28d2190a80c22326c60c1f141e9beac87cd006049a3c78446ead435519a620bda8806086783a33468aa84e0b7d117826cc0b7911757eb8d64766ad0f02d77a725c5c6b4ae6a599cc6c6126335b1693992db165660b6c99d9f25a66b6b896992dad65668bb7cc6c612d335bba6566cb6a99d9125966b64096992d8f65668b6399d9d25866b638cbcc16c632b3a55966b630cbcc9628335ba0cc6c7932b3c5c9cc9626335b5c66b63099d9d232b3856566cb929946c8e0802a34a181051d687840071a5248d218a820d98f1955a339a4fa8e8e31144092c4700669b262d8c124aa3a42445f8961b2341b8188e488e34554910f513294108a7aa97218a21092247dba683602c30a2429471c3e3e44e0a83e3464109294431081908e544a8865f91025aa428fc443b9f0e0f13c4413a5d90845542728e66d17782049d28b2824ae39eb242ce43f140b17c2f080debe67f36174aaea61266853553d9a8d389b23758ab6108298da114d198f6756fb9bcd666dd6a68baccdda7091ea5b3c1e1fb5ea70f1af22aa3a9ed07790c0cc1f1f335d3e2b228a85a5d9880a7d7079b11d205c641569c6a92687534d4e911e3da0cba2191177a3b754eda1630a389024984f67c6e3f141b550a224a5240a0a40a0128ad8c2195638a20a4d1faa138514e83843ea3863c8342945015285263aaa2469650a1d5090c3ed702a8903137540c1495568ba42f4e98c603a54f4e9c074a81531a34f35d7c44850b8d0c113b220bda07c3592410e9327c427a048f6613e2820aa330249059c8d740227882449ea694d8c44fee8a2e5c5e58b12a9e48c922a343da542a2aaadf8743ca18f59430f00804d384392a42fde43911ce984ac98f9238f279f9615309427871a9294230f9294030f928e2688710749929078286a088b085a26912042beaa7c803a2f9d992454a80865472e40aa17899ece1f445cb208514078f02080ed504578f0d86c389b0e686e4055d58335379bf6139a1155dc3df8916c1c3333f3e2089f6bce9ab5c86233b3983fb2783a29f5928252cd2c8aa05401820d920f81cab084244d2865a0a1a38c468624c870021949282af428a03ac880128a8e17c02149d214eabca0063a5e9044aa4414cba4e3053b2617a4f1a1444f47d7053990241d2ef8a2ba940be01896f850a11f238d313e44cd9719832349938e31c650c0141fdb411103109224e910430b301f2a242302205d7c18a11e3d7af4e8228b2c92503f363233546d92cc98169ca0058f0570b0e0062c60010ba658011e56f082158460053b2469a258a62355473402cd78aa98993228339f593b9f09f2783a321fd3114d199499cf7c99a8a876a06840031ad08087a240339ece8ce7fe87faa8600d1590a1024b89503ed6043c787c353943be2001ca4b0a38a1230569e8484111244a3483f29c2f5270002fe808630961804047180f987184247d159b8dcb0c0f663a90a410497ea023892889053e9d19125d41a1cc7c6638a2102523aa461765a68a992f3ef6333955f8c8a272a95ca8f8fc40a9c2435174478f1e2f59802811109922320298bef8e20b2aaa0051a21d4190b071a49a2324399024c98a1085c40b898241b29084466c48f3c7080cd38fd18f0020ea822846644575081d151a3c78d8f6565e2e4ee765bbf282992f5d94b8415af66e2fd6eae8fd67bf0d92e3747ce3a48fba4b091b9e2ffa6ebb3e1f7df72d1494ac414edb8eb60b19fab58e3afbe98000aa213216a35b2e3277ee3984ce756cb7b9da1546cb6ea64136aeac513bafc7dbde9a25689077756dbc286d4a2b7d7b06591fba7a6ba3fed331ea7ca5c40c3246e896ede6aa776dff6590933ebba6d768db65bf22192475d335b3e5a8bbf442ca7930f3659a60a6689a426f210b89406848469fad85cf698d77353a06c990c51bdfd106a97b3dc52097d7ee56effae6ebdf711e83f11b516d292f4152c0901fd37999a6f788e8a89aa669822c4636a39230c4e55c8bafdd5b33d36b9bf2b2b539eec7791ca2904ccfddc0743c9e779da4040cf241cadcf47adb85d0310a5d48c917647d4799473a632fbab8398fdfae1620912991e843a2aa138a2f255e90eddafa59bf1bc736db7bbec3f248a8d09069e2caf3968ad9346fa2a40b925dbfdd26b79f9cc7d64e6b7d7c3ad41039d97f420917e4b3f6b167df5e6f8c31dc826cef3d76ee55e8d6c6398a619e1117d304f150a205d92ab5f1d5d78feb43879cc7475a8602b52c48b7de366ef4beea4d9f711e77362130aa9ea67783122cc8cb6ea9f37a70c549a95322c8cd239d04255790cbdb9db596ddc62eab97f3787137e86ec4dcf3a2c40a72b6af715a5b5fb3ed68398f8fd409f2364dd3e46e344d9ed9097d354df6f347eaa4d3e4af648c922a48f8d5c6d870d6f88c4de63c7671a1e999b57247de33ed23098daa6316239b1e255490f1ba696f2fd666b3ed6f0ab2b276bfa953c6d7be8342a6490af2d2bb608d6f756bebc209af88484854b96331b231414914e4ebafb459c7d67dcbb4e40c16978d913176b4a785c2bc7632abed1032af469f10695bf79cb9eb6ea55de204595d43b69e9b9fb6d6604913a4dfc996564ae9b3bcde723762825cf37fbdb858ec5fffbe53b20439e17458bfbfceebbeee4809d22d8495ff45b7d6b976dc664912bee37af146e670f1bd8ff3d8dd03c574181224c7492b638f526699d796e4b708bd0c25a44f507204d99885d727bd9479d53a61e747094a8c2027bbed59c7f9f3fe6a91c8344d53cce8e3588c6c684911e45bfd1fd9b6ae0d3ad8bc8408d2b9e172d4dac7b859ee583204e9b8b1061f5dd5edba0d398f65fec342ef1212b930bf90a862254290d7d5fa2bae7819df662fe731bca251ac60485431561204c9ec91ef751c2be5c83c66f379cfe31910559b6da3949714da4629b1bf0408727d5df4daf92cbdb1236d404a7e20fb56a66d5fa41432ffd91e28f181bc77ce06a9e3c990d1c8af07f25f84cdb117df9a3c5db49ff71f253c90f72d7d1effc5d0260629d981ac4fd9eb59613773bbfc79cfa69b16253a90be7c460a99df3d2f6e939303c9d6d25ae9bd1cdd2e4a398f1d8744150ea4c3e8d0b6bab8365a5be3bc4dd5698e253790ce46c673c567c8ec98721ebb8ff9c6cd6fa9daf98cde074a6c2029f5eacbb1b3175a873124aacc90bf9cd6d6e0bbccbdd8d44351748b921a48e75864af51fad1b1edd53490aed93aed5ccb456b9b35b72e99818ccdadb9536e0ed7bc8bf3986d363023fad6b50c24bb9fd45b5cafad5d6c82d854120339db71f7e2777456e8cd79dc2a2530906fc61b9fc2f916b56b3dcee38ab2ce2d24aa5c4919d25a16abab75fd5defee9221636d7d2d6d2cd2551fbf921748c7b5f65ab0a3b3b3d92e71819cf6db3facf6ff17f7978c21ef7b5debfdcb1c63daae084ac490b741d89aba836f396cc779ec992198177d3a1b3b41cda1174551cc65b005eeb11dadbe2a33ea9cf318368f36a2980b250b2a8bcb276d934d7addfc7436ee461be798d18709598163754eafecf69d3777cee3e6a202e91c8cccdd9eb35ddb6a5d2990acadcfe82cf79b963dc679dc5c98a128e6b22cc2907efd51fbaca3fdda99398fed6f9c5d8b3392521629dbd6377ab3d4f9b073c83455143a16231b9824325af85c7de83ad6c9e064ec3e44d59691357e7bee2de60b23a32e3616231b2f9044760eeb7af4d535db659b91640fe16af5c5791bf2f5888548c6e5ffdc8496357bec17e77105b9923ca17b6cebf5ca666dcf79bc61dc42f2fdc256237deb9cd1c89cc7ad0a3024f7a3b76f8490b9b6064110bae7acdab5ea4706d9a4a4f78c7f67846ed95bb582623a8c7e248c77bdbf8c3efe5be9c7c8e6f7da2ef66f6aafb7158f7431b2b5b05d643c672fea7e566ae733874cd36331b2b9472473ccbafb4e069945c6603e9d2371a140b63867b7566db4b42ba48c29d71df93d59c3aebf5cfcd79a3916239b1270e4336ef7b95557a3d72d384d1ecfd769fa108c74b6eb55f6eb32e89e3ae7b1ed6c1e34237a1f1fd334f3998cc5c8465ee97445ff45ddd1e66c9df3b889626e065e72858f3257e383d3195bcd5609acacf7fa7adc7ad2ebd3b2247605e6335ba6e9612a10b5e1c76264632b7b6c113ad8cd1d8b8cdb6f33cbef4e4ae36ce6cb79fc222425f4a29569fa109069b2df0151759aaad08b40d3cea9178744a0122550099fd97b778deef176fd50f1eba78b8f8a831588e231253f7b93a17b945d74479d6331b2d97cc19c37165fec059941e8fe9c57637451e775b1a61fd98c3b8b914ddd480b1985cfc2a60e42fb28e7f14c4804ab1af2e1550d4d8f2c46367e02c79039e6e6cd7163e6a037c3d8683b1bf95deaed1c13c86fabbbfda573f27a7e4b20ff3d3285b63d7576d049201bd7faec3ae8aab769dd76a88d6331b2198111f9e89cacad5a997afbdb11c8f8b6314abb1d737a1715e285f479eb57766f74ccb4af08e4aaf7c5c87e9bb1d58ebdb4b318d904292299766cecececb3aebd4d53880a857e9adc6331b2e91071ad57ece7e05b8b6133638fddebf2e833c2c7cc3072de344d93f3900884821779a3d3396375adc6089d398fab23f3411bd1c344b7d9bce748e86336f4486dcd626403c4455ac8de7270dd672b6cdb388f31d022adc717fd3686cfb5785d0824e3d5b6a1bdb4bae7f035f3907f0f176d96d77cf53b86a00bdb5e7cddacae56af375b4bb5b02c06eb738b42beacc245570b1792553759b3fe8f596ad9e43c4ef5d80979104e7eeb7174cbc276efa113c4ed0202796773b4f536befdde6d9cc7202a64797d405e861fbb317e0621dfc979fc1fca5337cdbc22df3adae2bbfcdef557e63c863fb6801c39bef5da41f61673b39b6290783c9364bb38cee66efddddb9585d1a94621ea7a40319d6e31a30f13c55c9920b2ae8efcacdde9566bffeea53651888a7c11bac3d791c2f51cab52327b993a870dc6bf6d4db7a285b4d32b64ebae5b61b376711e6f18b3e3fa48581740e46448adbdbed8f3d3d99cc79b66278ab9ccfd903e9f8b753ddb45db5f1585a0077cc8666f3df36963a4efadc579bc79d003d21d3ebbfedad93e1d759cc7905f072483b3ced5ebde1827e4c9792c438560b87bc837eb73cbe6536eb0c5cb791c12551c90ebbbf56dcdb173cc59e43c16c5dc48240b79dd5cded0b98eedfa659cc71bfb991bca72bf116021a7d7472b37eb687b66c879cca946a04d88ba1be7230548ca4bca8b9094fa45ea23d9c8ccd06b2c46364278c87fb345c8a8e5efb72ce43c0e4d4eddac491473a7e9435415816814b3598dc5c846045142b771d186937a3be793f3e02845a52525e54548cae6d3791d1281d887a8ea2c46361c80b23e6be37d675ef9bab9388f43ff79922e08e7746fb5c5ed59ca795cd9ff6a237a98c6292f41aa99b27a94e2324d33e54548cac6238b914d890c5c6ba0d9d780f3142c02dd14159200531a5812b8c2025304aca04015bc6303ddb91f025d400313a082023ba498428a0c5c408a2b1aa5f0e6391b0a60c05d052e9084921159200a0ba040e15a5b80613307a502cce3e91c5914986202f3433b2430f347aa88c01410d850f10051688aa638690ce880e954513880ab993fb2d9d1002918d03154dd6cf8886b0daa5fbd056c7628000309d86ca440c026c98c81e20030946703f3e9c0c0509e081820c60205e0cd87ee2644892605083000dec44c118a00a80880fdaf36170040ca13950666478e8dfdcc8d9bf0460325bca93a9b8d28c96340f249b0195028f998f9d1b0197d304001a4365ee0081fd20e7490031cdcc00666d480063390410c605006192f70c11862b480052b50410ac298495285c000519f18cf1114743830f76da5f38bcd094c500212181981a4a30966483a9aa0891c602880d4861860f02179200090e8801d24a96a44079248928402820e3c213d128a7aa8da630d3d9a207a981e64f4b05af448e9e1000e48e2840376c082c4811c70400c69118a901c6892cce2115920e2d3a158baf359c902491643b2a0408924652161f1862461e1052ccec02208120a0f2c7220cd7c7c4892261188a82e92260c27583880872624942a78acc1c30c28222a08ca34adf048398421a4dae1804254cc8c87026d409468f347664c54c34934038507caa72324824ea2094ea2072449a26207ca099aa2a2024ea02002af979d8bcdb7f84d19c8da8b5a56d946763dd218c8c9f8dde7bd60b35f87815cad39cea6abf172ccbe0c19977bfc98838d23fc66c9901de17d089d6defb5f802c9eebbceefcdf68db2ea02492b6c18977d7863f71c4376743a2b74d4325ff7e51043daf6bede8790a3b3d16b27a475b4c2656f9bbcba3527248bf1cec88d2dbe90996e42b2c5fe99efbba76fba2664e4ebe65cb523a3f4ae9909c9973e65b7b7c18e7e3121ddaf576b74d3c2d96d5e423ef7cbfdb3eff64dee6809c9ff0c5a0717f51befad847c37ce76935aafedce2125249d8e272fea209b4cdf2464d759f9dfa22daefa4d1292f6578ed6c5b6bf6024e45d8db2e59a29bbafad07095923bceece603b65661f21a765cf7fbeb8e0a5d61192d5be7fd9e4c9b339d808f92cb3f1da767667d76b8c90d1bd3dda8f7b3d48d91721fd397be7cf672b5f5a1521dd178dabf93367b3c144c8cacdaeb5ec22651e9b2142b69bb536b798ad6ca33d8464af56dbcc3c9b568786906d1d5aefe6f6d9dbba101246d6737e74e8cd1242b2c81ddfe30b59838b3b0ef9b87937bef7d1d5ecc22163bc4ddfed7d2f3e1d846cc8b7c5b6e074ccad1784a4cf5ebfceceedeae61c0819db9b2c5e7ee88dad0a0849ed83af419e75c23be31f24f3361f7f74b4b9c86d711ea7bc04892c46362c30f1839cedb2f5b1ad7b591fa4c74b1bad9332b6be46ee37e46d9451f73042e66ed15a01f11d98f0c1dfd1775a1983f4d5673898b821979b96dee66e7d5f5d534f790992c20d0993362adf5ad9fe7dea1a3664c3ba76ddb9afbb6e03fb0c267b90ec8cd558638bd0aba56bc89f8b3e9cf3d2ba685d1c4df420dbc15f347a9bafad852f4a1335e465bcaaebc7deadea6e1cd20224c5ae4cd3102129ce358b918dc919267990af59e85875f6dea06d95f3382482292f4152aa0f202922aac8e763545a5266422faca182091e24eb55fbf1a4eed141fa9cc77e0749996de62284ce1ca59529133b48bed4ad66f0ef7ae89cd641ceaecc7e2f76fb68ad7490ef6e4f7e6ea616421add03267390fd60843edf84d6a77b4b0ed2a34fe66b9f3d52bf1e0709d74fdadc2f16ffd566e120e36cc6ccdab61a69ac363233b4ba0b9337488f90b6f8e6ab2f360b997f98a421edacbce663c691d947a90b17dd5b98b841faabd1328b3e277bf33658039336c858a3ffa38dcdd896b187619b206c901056c8bcdc5b5edb83eb6e8ed4190292029b47292f42a6a95a839cd5a37dcf986b0fdbbd1640305183e479eb6c0f2bb5d6d1c7d2209bbad66ebb471a29f5478364d5e37acc395a5985ebb9c919e4740cb6eb7a5adbbaf96e4ccc205fa5b6b93fc75665ee1e91212665903c394e37a9b3962f7ded8c98904132c71afb572dfcf518da24d48f69b29f84a2f0814cd0e0dbeeaf1fd20b6f739cc7ac81613206d7fcd88b8d357d7ecc793c93840a8136949da6bbb1764e5367865e9849224cc4305fb5b45f5bac3de77d6854519e3a4d53e83d9e182aa4b21e17c2240cef3a5e70ae581fb4d13d189c7d733ab53d2b6cfef00b72b1757d7673fd66a5de9cc72ee525488aa7a33245c1c40bdc5c65cdd256a985b1b92e3c1bdbd23abd4dca1ce33c4eb16f9412d3e154139214fa4629cb45265cf8371facb71db37651cb792c1ac540d1888b8f4adb026c6ef56aedb9c6dd1a64fce69bd746e79abb4e3d9e59fda3d22030d1826ccb1a3ac8fc9f7d6fb61504932c4867eae6643a2b6d079b731eb766662c46362e265890cdba069d4dcbcf98f6e43c66579071c2bb38be7bef627f3d04132bc8ffa737fae4e8f7f97cce635705f911367ae15f375d7beeaad935c82c46362a26549073567693f2c3087f7af4782610b8e13805792dc765dd84cdcd27749cc76b39becdb118d9a4984801f2eaf62284efc1d51a3bf77dcf2d8fb53637635b6d1205e96e8b7771bfb7cbac3e108b918d8cc91972b1e5a08dfe1e3e9bd78251b90f1328c8cb3f5b651446fec93a4ea59f201d65dc3d2f53187d42a6448e7a6113274886f6e73bfb8cb5fa2ae53c8636860aa938c1a40992bdcba67dac27b747df5db498a669f2314dffe9dc3b231bc184097245a78b31857cdfb4fe388f3715ce783cf34e936b7d642d41da67b638ce18e37cd52fe7b112a43b07aff3ba2abc0bc69504e93f9fddc5fc39caacd6161324c8f962534b5dacd4f9b109f31f47c4e408b24e678f56efbecdb6d08701999a1841b2b35add63336be6fa721e7f189de8854911e49dbf9a6bcfd1c5a87d8b08d2fdb2d141fa66753152e63ceec7ae932cde5c5eec5a1f7116231b6b3204e9bc5ccfe9edf2377bbd0c132148e766ff73778cf673b03d4803932048369fb2d71c8b6d326ceeabc919f2363c630204f99cbdaf6db40d726bb5b24cd334b118d9844c7e20abfbaf7eb698e3846f721e3b2f9a890fa45b3a9973ae9741d87f7b205b7cd545fb2e65d6c1f64c30e181b4363ed61ada7676f19dc90ee47aba28eb782174d7ec7520dd9dd3b665cf368ff152931c48777b2783eb31bb22e3e7e2c28184ce5f63ef39dbeab3fb8603931b48fad839d28ebe9ef5d9e00e4c6c20eb8c2ebef9dcc15ae77aedb118d9704ccc90efbeb7dada0bdfe4781b6e4c6a20df3167a753da9c451b8398d04052d88cddd2599ff31856cdae99c5c80688c90c6074ce9c6b7f10765cabad685babf1aee5fe276b9cc7d3544d5343622203596f7d75dd8ff73d378c233089819c7f9bf9c6c9e8746c2d0c644fc60ee374ad52669d97d1984318dd45778e5f5bcc316ef1cdf687acb137a7bb266448baeec3ba38b63ae37bd85108262f901c63cfc50dd6875cdda10f4c5c202f75edbbe7bafda86537fec0640c392b6dd4b67737da7cb69939649a360c6d6022863be7b55c73ed357c9039b8daba8d5aa72f42cee3fa5564b5a413322ee7b35576ca9abdbf9c57411e259c90ce36666e578d1f9aa3209e394dd32446c926243f1a1bf2b51f1dfb47ab91688aa6695abce15a7562dc394d48ea169deeba7b4e48d933212fbdb1cec66e7d7ed15ac79890942dac7fffc218ed9b7665c3979014d2e50e2ea74e7b5d670969af853e9d9dcdbe52d69590df78be77a947cbeebc8b12f2c50b639d8bd955198d91eb570d48ca8b9094990701e4c59bda11813a1ecffb24e4ac8bbd236b6c424948e7e9ecff47d79e832ffe480192e223e545488a5b33288984ecf6565df48ece7dba2889f4e1a20510394dd3344d90c5c8268c1248c855175cb0dd9ef436b695f338446d440fe30c1fe347445f0df9f973065fb7b51c33c7d5f4428ed4fab5f03942ae76b7e79ad3679bac9df398ba9fc842d983665e5e63414923248db0b1fb63f3dd1779aec0c808591b65f4d9e95eb7858e721ec7182aa4521fe4b2796c11b2d969335bb718b5cfa822646cebd9fbcf5bf516991b414922e465cf1d72bf35bf794f4448f7e5fc6f63361947f74a0eb19c47e8abf98aaef16bcc1e650cd665dfbdfd9ffe40506208f9d37943d86075866f7e2124acec99bfc5bad967e12384847f1dfeab1edb743ae390f317736eb96773f6b21eea8628d154490192b292f222240534b99826d08ce9324ae090fdeee9a3cb32c83aaee83fa41907258390fe587baf7d9dcc7fc21b75502208c93f21b4f7576366cee683665e88501208c95ffd7f51870d99afc8bca9420920249c175a667eaef7f99b4c09257f90b5698dceaeed175f73c779fc1eca42d4104af45999a699d0342d1794f841be65b66e9b8fceda16bb73913ec8ca13de1559a3b732636f2624fa4817672a94bc215d64fdf74e36d763cb66737c908de965efda581d8cad35b8dc90b5fa7dbfdab1c6ff1c4e9333926962deb03312e656286943ce0a61bfbf8bcd7e3d1925fa6c28d1a7232a61433eba383a6646e9622fd23dc8dad6dfadaf1f46d8ba398f535e82a480a89016d304a242769aaa69aa8f6495ac21efe2ff77bfac46dace2ede70e56644bd84123dc8051775d6ef5ecabed52f324dd334239aa6b678c3a2cf9b1135753f9d2794a8216d63f1babecc2a3f742b461894e441de6bd9a3ff36ceaef7effd16519dcb8c123cc8562be5fae0ba6e417fb889d3b4d9cc696290c5c80649c91d2483d646da5f27eb1669b483bc953ebfeb75ba66b7da3a48171964b8ae57ea3532ff50d304598c6cc028a1434718577bee45065d2f876f45c6b6319dccbd2ea8d292c24222d01c64335fac358badeb7cb0c941aec8d7c26e8bcde96f31ce6318070929bb93f6b4bc22abfd70906dd6196d8bebbdbeb0716331b20941c91ba4a55eb9b11aebbc0c574d43062f4252364d038d23649ddf3e46c7ae1fda081b21a3ede9bcfd2dbb191a46c8c8eea3b4c50b2df5e7e822a4ab8e99f7b20e6173c740a3084967b5fdeeb17395e1738990eeba375dadad5dbbd5102161eb0bafed09b9aec9da2124ff7dd3f5c7387dd96a08e922e5b7babeb5dc72ad0b21ad63466f7b3769a5712d186808e1bdea8bdcdc1ce1f78cc3c5d68dc1c8adb1e7eeb56efad6a5ee3dd8e87c4e82060ee9ea5bec5a7737725bf7721e6faa8dfd7cd556a019847c666dc1e7bebecd5717e7f1a713f3a4a011847c3376376bb0d90addb46ff10d348190ec56fabe3d63ffd673721e57b5534dda0c9da0018484b75ad7ec6c43e6f15dcee3c647429408182f012841f307f9f8adf8a2c3469dcfc63e0fa2366f0a1a3f48db9a2db7dceb56576bd5e480b81d15347d90adb2e50aadff7d96b5c9dd469a37e48b7ff9b6bbfe3d5d35721e579bc62548d0f081a7a57143bef59e1bb4f645ce63c647d0b4215bc3778fb6ab76cef63c76e5d3c5345547288ae3adb5d6dcdddddddd19638c31c618ebeeeeeeee66666666e6089f6bce9a81a4acf780462f294384a42c6631b211800e346c48f7f6359bf0d9e9cfd5f620e3e2bfcfd56b3d46ebb8d9e84dcd1a92ad2fee3a6f63ad3646f520ad3b9f163e74ecae7b5ba3c6f2e570b1079b7384f1c566462773eaaea3f63e7e1102aaf8bd409307d9d3be6e3cd9ecea98313c48c69eb7fb6bf6838e69c71f9a3bc837db337e34fea26ddd0eb23a735e8fe9a477cdf60e68ea20ed73cfc566975d66f05a3ac8fa3ddd5747e6bfdeb47390f15e66d4c27add5bfea61c66f3652cbaa6d4c541def637c2e53436beed3138c89eec208cb3ddf6e3c741346f906cfb7eecf726cfc830529f4d1af2b5b61c6cf3ad7aafabd70dd2adffd7cd93da36c87f7d216dcc3247a78b970d32b668a79bf4bed77adb5d8384cf2efbfcded76c9dedaa4146660bf6856cb548df6f1ae45d0c23a4ccbae69af58b06f996bb95ae696b3357d73d83a4b4f65b77c1cbf0f6bf19a4c7199b7de7e5e674fa6590917d652dda66f6b9854f06f96ebd75dac9dcc70ae1a3212b5cdffcf15d47eefe31c8f90e63abebc1d8dcdf8a4142eabca67f43ead1551b06d95c5c3fdfa37ea1756ac120affde6da8d6fbe38e9d72fc84b678c76c667de62acd50b923ecbb4f2ec1b99fd58bb206d6d8cb5eacb7573ec552ec88e76b1b5d3f67df55ddd82ac8f29336fac6a41b265c8bee9ab1f6d8c340b92cee83ef247cb20a38e6241ba1aa15738bf3d63cbd12b48f7e2bdf0557bd77b736a0549ed62a6edec73dbdecf2a4846db32ebd6b3d7cc7d5241be5358df7c5fac7ae3390519d775eea96b8fe9ec35a5209fadd459bcd4b5e7ed4641cef91d6775bde0d7f6ce9035fa85f0d508e1bbd7452848c8ce27bb6af92db72d3e41c6b710d6bf3dffb2d8a213a4bbcc42a6def4459e2b3641da47e97ad0ae09978b8f09d2eb8490f56d0f2e415a7f73ad1721bbf3de0695202fe409d9196de7983b4c82646eb3ce7ed6dfcfcb201264b3f9bcd9fa864790d1c5b68d56462773fd4690ce1bbbf894de7efab408d2dfb608e3c70799ad4904d9b53edbaaa5add9f8e21064b53ee76b8ed54b2f83429097b63b57d7b7af36c320c816ad5bfd2e7f9bec1d10e4ac90f9b6b37bcc20fb81bc6e3d325ff7e9a48bf94032e89ec1f72e75ffdc3d90f52bafb69c756c35ca8f07d2b5f6eeceb7dd4819bf1dc8f64ddf23adf6efbcebe9404ec636c6c9de0bfebd3990b679edba66a50d69b338900debb2eead577703d9ee3eb76d5a6add84cfd940fabb5f6ffd67f75b73ce8cda6fd1afd0b9d740c29fb0b27a978dec6f391ac8f6ae5f9fbf9beed29f81a4f02b6bcfb1177b95817c7ddfd7357945b89c8d8174cbd8ec4921bfad0e0319ebfc6f6fc50927645a86f4b71c4f47a3c775a92343fe5fbaa24f1a6d6d97db0b6465cdda36cbfc2d57ad0b248dee35bcfdcc3563c8bbd8aaae27ab1ce784ae1143fa5ddc225bff1af4e8bc13f231d6e072d6debcce35e7847cede8dbda70bd5ed57d1312b6ed78617f378cd35d1332b6d7ec3ad8d5bd789967423e6be3ebf6d31b42cb1c13f21d73f5fbcef64bc86967bd7e2f83cc685f4b4867e17ff7476baddf5a09f9f7bdbeeb21656e394a09b9dc3abd0e7a7bc70a27216f3fdb9a316ffd6d1f9384642e3a73cae6eafb5cb348c8fbb73e67f359e7e6650609e9bafb3aeb1f6b3767f608f9fffd6ddd9d73b62de608d9dc3f658d6ffb657b1b212d85ebed5a333257fa8c9090619dff6b45d61eed22e4735b8b5abecc5fe354846cfada6d77e337a77176222465eb229df0355eb3672342ae49ab6dd0a77de65cec43c8c5abf6834d27fbc9b00d215f5bd6d969d95b685f77212474b4ba181fe3f5e6432684b46db6dff65ab3f5b28f43d246dbbdccad166be387433eb62c9b0e5aff87d10e42366dad5d6bad20e473eef2f4e8de318d3110f2efdbaf8fa3f5c72820e48c6eba7f0b36cb6dc23fc876aeedaacd9b3af3e60759e16567ecf274f7f0f39efa48369173f441322f8f6ebab518f305b90b39de9073725f9eab3666bb32c879cc2c0d39f8209f3d5ede7aaee777bdc779bcfa0b39dc9097327bed2edb7541db57c8d1867c2eda6efc6fcd79a333a79a5b8462b828401672b021d7b42ed6d77cb97563b59cc7cc43c8b107e97f9fe1b4eded5ad5ddb5de629aaa14205ca4ea6ecc626463801de458433ea73f2bbbcfcf1b7cce79dcfc1239f4206bd7e598ffdb4ba9c3c979ccbac83475403e9ecea7936eeaeb3672a821e18dee28ad2bde08b945cee3694a22da7cfdfaa13e33a24e10d1344d53354d4080cc70e1a323aaaa8f21326d804cd334d5ce34b9223f3621ea6e3cf5ed34857ec30800478e3c48e71832ff1bdfbc8e617540c88107196df51a1f8b34b267ebba83b4de0e3aeaac33c86b393bc8e5ee9dbb8bd55e16610721471de4bc17d267635cfcdcbf4a07e9ef5683973d5cd6798b73905c9f33b57e7fdd385ddf20871c64ac77ddff07637d74d6fb221172c441fe6cb7cfaf9baf3ebf8ef378f3e01839e020ed8ab3e19dac2b85eb43a056418e3748d7adcddb207ddc2b726f380db95ae40bd7a4d429576b398fe1e3400e37c8656b75932f5dd4c55579866eba3f44a6c9c275841c6d9097c1fb1c63af45ebd41fe7c9e460836c7575f3e8b1b24a1b6d1bd1c33c167d9098630db2f1737e6b756bcec5feaa417eabefebfb6c0e7fd99b06b9a83b5ae3a37da1adeea241526e7459fe37fffff93d83e4659fa374da7663f4f56690cdb3f931b33ce7b3d396415a0bab63abebaa707a5b32485ef3dbd5699fa50ed9a221eb9ad3ad6d95f6dbbe750c92b5f77c7dde39fd2dad6290b12fdb7fb4b938b9d21a0669179bcb2984ccd6d6af8241ae3aadc73add3bceeaf50bd2b2ef091757e610ba55bd20ed74d4b2f7ac1bb37e6917a483b6ce7f2dde8e943ee582b45da3ffe2c5fafeb2740b32aec8625cf6368dd629d582b4afed6b5a5f73cbb549b320a38bfe91f2adac9f6b140bd27eeb369f3b579f2da35790fd2d7a5dde627c0b32b5825c6bba8eafddd51cfd45ab20179bb53e66deef61a4930a9299bf76e7699db519e714246d6daec6fe4ed6e6d32805b95e83d456d74ffd7bc628481a1d5b67bd315cb1bd78866cf76c2d7ece277db52314e43f87d7adc77139641c9f2027d308fbbd06676d6b4527488793c6f7decd9fa50f9b20e743f8d8f3e89c65944226483b6765cff432537e0f2e414ef7165f7b87b335e7500992bddeeb7132d88bdb7d49909399478e70fa74bdfa2141be175d656c99df11a4d3a68b3238e9f5690469d7a2ad394bfbc6d56811648c8c3a868d3173ab3a11243386cc9e5617d7a3ed86202fadd0b6a5d3df53674d0832bae560bb752dc3176310a48ddc6bc1bf0f3a770804d996a3cc2ba476adc6dc7f20fdf662d3ef5bee6f6b1fc8fbccd66b117275372ed6037919474bb93a7b7651ca03795f73436bdde78b0d7b07b21973e5c8e2ac1e2bd581846c9b356df3bde5eb9c0319efbd8e3fb275f7d98a0309e1f467b13d7803e993ffd6cbae8dbf9e17e7f1c7cc8faf20870de474c7663fb61665d3a319b2df556be7d7e991d25703f9dec5c9fc60b3fb5cbb349090adfa1de15fe89abd33901e9788a864f0aa959196a22086310010425949150063130030302c1e8d86a3f178a2287af203140004597e6a9a422e124983c1500ca3208a82180662100008208410628cf14a116e00c03ef6a440347b8ef61d6168e8db8d0df74bf5611d510b68ad2dc4e0fd4d8a705a5d0d20b5810f42cc59fd9f4544d406b19c83a5727210ac88d8bc7a22b7f22c74413e376766d43f788a5fac2fdf055a20aaed78093242b7db8e7c7791f20bbdc6d4e1d1c0af715c1647479b78593ce764b6f93fdf909a5f5470cd7fea27029f280eab52b3137df15661e3323b8ff7015830f651a7273da49283635c46bc941e5f330b5c53695aa4c414c740ac11cc8cf434f43e3b88e4e300cbcf1b5855b61443e3b7cf3ae2f58cbe3a857309bbf341814fac97189f5c7dbbd563afe96028de3f4d559c637775ef79a3917c321f061cf708f244ab71818e38d3693729bbadf51eb454afaaa0d78a3f4d96679d2e21ac2a4724c040e4260cf2b64988d8840a4f118c18df8bb57c4b12d0f1378c3da0aaf7845d991ff3d2e20506a60f0aa374a0c8efa7fca2a0a21527897b47f660b144cda256ae37b42d3e55cd014e24343b0245cc00d7683431844a4d024634b43b04256600d928b43186524d014344b43a0635a600ad515aa79145472ba4a62af3940685bac813d562c2a15454487a9b188e64b508086641d025fc6b50cfeb6ff590124f46d0febcbdae95a0e40be251b52f6d3c1b83e9328941be548d995566b1a4bacbc4fb17900195418442a82bab0fe602070a2030b4eed4f5c941dd598cb823f387efd4d4632b82e965e5d48ddeaf1cb73606e2728a1388010a05ff86fe03848fab7cf105a2e4006f4b5c860909ce6cb43b4223b61ad1179b067e396222d21b4b2fb206a21d49117b35622ed207421dbb22a26e4e92315b2af3bd8e0d743812230636e22eb60c9c3ab2a2440bdbb494cb10a390de587a252ed413d3d1fe6ff0381dd8e5b83a72928c8a309d4fe6985bc7bfc47c0397c5f1dbe276fa2f2b5ff4b24dac5c183104e9264bedc585d4cb8a6f1d058ca38db8ce6e276d68cbd03a55b24bd0f5d2245eb95cd7fc4bcf0aad93978332a153c81bf241fd5a11d38da48bbd066e1cb1474aeaa8c08413c8ccb8a5ff1bcd97b5b4daf0a490ab1173b17d4c28bf2cb7e87f9bb272156230d209961ab214a29b2415dbcb2d9a5f38cb4feb8525bd6b510ddf74b7417f656659966b0d9b666a9e068e85db46721620ba2f4a001204182f961cef46f5396b295ef6f0725dcc37df84e951d1da2c706a31db74f290f1fde9e2a18c31dc6c1ca3fd8cd71ea7da9dbbdcddb6d970c5a861734295122e6558f85afbaa0ced3d0e494ddca948262bb01a15bd7ba69d12db681ba49b30cbdb7d19f28eb2710b7b85237b6b0e9d4bde82f1c80913ca03e9e787d9c605cec4ea6c6783853117b6c7ce70855075dd0ab7eca674514177509eea1601f155d06c868f7e9ac0a2bb4a93744b2c62e552a7df82c7c80e9410c6568f1a106f5926ebb53c43f68cca8287dd6264cde7ba3e28ed5506c217ce7c270e662b2b5907a87fe8cbf965efb3b7b4b5c7729ea531371476482df40841102bfaf61c052b0f0f36752491b2b48b4d352190a2dbc7847ac805d697dac9d4db56be954d37ef10cef6614f290e60e834e594ac79483a807ecc9167e8b4e7fc17e64d6a7197a7ffb60324d2c0f265701d05829a8c5336af89c889c2e384a5052572bc0366cc4b3f92f636866a4a0ba2bb4e41041b08b68d12286dc13911d2ed884c9befd5c8c24c76df134c28b0aefdbe99986f8071a010630bccc416981aba14c7171b16bdf4baa4b93303585488bca03c33f1fe37cec4ed5e7db1cd7835346c12ffd18a84c2146237de06cdcdc199f64778ebcd2534020bf1c675f868d73e0457b31e2ec063f3fb0a85487dd6f5fb2fd7689e767eed5744420be03cd8cc05d25fc961271803032f9c728593fcde6332a54317018b5a471ad5e0677b35288e62d90ee373d126c2e93a29f3d340ac41f68f323ae6e2f80e81b27bcb68aada9e470c4716f437ef848369151d5cf6d460e9a38c27532573379c0dfc3517c428f52d4c94ae18c3bc42254650002d2c6493ba240c163a89265f3d0fe4f44eb282f3933c701949a201f1c217b46b28d8f5f9340f6559debd6f3a3d304a6926664c1c7740d4ebe62c7e155015dcba450bd716f65abdc3fadd02458bd856f5b550c362b9c58c56695bf06b51864573ab2e5ad8b6b8d7e28755e416315ae8b650d7ea1a16d32d68b4e06db55c8b362c9c5bd868f5b6c55f0b342ca25b55475d0368f1440ef9b59d3bde22f31d0369abd85d6897557dec455c4cc6a0f8559e314a7dd11cc36957b5cb6c70c7015b75b281a61ea2d4062f8d92666d82865b3a2cbf715deb6b0cd46144d7a1ffad2adf582b639a0c6ab5f23da3b046c3335cbed52e8d6b32de6aa03d6be437b4d3509f63115927af415d07ff1a85606d26c3d91b16695c36eb171bc86dc4df0d3dbdaa93b17e8d9977d0a5959b8c626fd8908db0ce78dfdc349ff6e9ba2abdbc22ab74781919c3ce111c1ef12dfe652bec7b42cb849dc1fa7340d3d0f77f6d6337f7df82cc9804a31b7468715d4016c709787d4f16e4065c7fdb19eaa279bfa83073765a6739bf1351e54f40e22a2ed8f7640d0d477fa262f489c1ae543fa3dad1213ec7a51a841cd666717e315c756d879077f10f392723212f29cee423df9a0c0bc3faca117b65bf562bac05247f0d95d89e1da5722ffc705194fa79afadfc08b0004faca5e3497d63ae05195f38e2262756700962671bde531c050685e24b445c7a0a995f26d17990d010f188d9b926e1d70e778b0f1e1411ccbe087cbf73c6a8274169ba76a8ed86ea20f28f3d7f27e94f2ec26f5cc5086c13f48d54e9f2bb5f0e7aac40cdc85e5c5522d0d07c8f135a0d67d9ef80b87cb7c8ef882c1dfd379e4b1ca17ff286936d98fb4fcbfd43a428c3b888510f14cef3f8a1228446e62f3ebfbf801a18e91203712601f84ebdd7b4c8d53ee143988c3ba2e7cf07f0de2e122141d06a40c9bdaea3c5d667edada6624e0edd34b520922ba36ff7db796b15cd379c03b7eb0cb5923ea410a9d47b0e2f223fa4fbd6e450354e7f2504f4df5cf4e1ac89b8eb197ca51d44e6c78fe0d066e627ec8ba4549b6f0a72cd04ebbfe59cf1eebb1e294fc75bedce8f02c3c5ce6769e661f1af1366453ffaea09e3e2c3dfb8dcfbb9def19990f05124a4d3bd87cfa9959ca9249122ee17e94c077ba424750a2a93e1fbaeada94959aab5b77616f436a9c6f788db4ad2b58c1a6d0e684530461ea6ec69e43b661f939b7b3cb02792844409aee219971f726fc7e7d87c8991a18a7adac404bb843238f551c28e41c55f69e772ac4eb54eb212708e75e70f176c0addba40d31567ed46f177816bc26d2282a95b7ef80148e8d3b689cc47ce52f679a1435fca2503b85ef17607876b7f92923f06f74b9908c0cc0730b031422c631b3e7a26ad511bbebfe0a908d334737b839333df9933a4b779edcf934dc68fd7432a623579ebe5cd3188f5d1aab6bf1ce093dd198020139c92dba6a4850e0596c1f317978aa487884803257c71fb8e8bbfcb2566fc88572d71082992bff27a380da0e51382d7f438f4070dd56fa239e89f7e4888d5c9ed7685e2290dcdf23aa6a8c02fde2cd94903d347eb7033a77246c998f064b19f922b17855903e69d553d04a0f6713a78de139d6d1ceb4694ce727a5c27ea06a3249a2e2a559a6da78357142b20e0089356cc31a9083ae55380fa68403147bd78ece1123224cc9f5dbfa4b07e09f8bd21a114249896b4df49dae845a4cb3cbecef597936000d8be25cd19e5b88bef4a557c398606e21965771450f4a5aa10597598a6fd4bf570190c308bc353d738c6f7891c4f12ca7b93a81fbc00505211291fffb4fef73b01f66eaac5a1bd1756c0818ea8abdee109d333e504cfa007d240142d0039dc1dfde81437d3e7add96ce88716644aaa3e275acd46d28fd9dc73f345f6b3f66ab40446a8c05e06ddd0845d07bc27f6b7cad87d00408eae632c5022bc42de5f160def1dc433bb5fe55d7b31e80aaa249219f58926c5970b2ab480bb6f8faf43ca4d833d97708dd997e0897c4ffe2efcb8f305b23c2015a9f70502c42bc0e5242403c3c90272dba7f8fd2538604a5e6221148eba4566f9af324ef844bee428366f32b279beabe6d0ab7e9c63c7dfc2e59e9281e8305eb71f0391a8aab77a1fb73db179e58d100ad2b09be65dddae58f344dca000f71200e27b63e0e7f9563481aa3dd2143e80d118a5aca32c02782db66e6439c9cd38c4fba064de9bc0de147522bc701f2e00f04212ef34ed702e017b623e53f9e48fd659da91e073b3ae75d2861cb3b41a77770d3627fb83aa75a2e88907482fd8586f69c8acce86d35a3b515a06c59c3e1e16c5944bf4e1718d6261d46e2fec908b569dbee34e195b6d751e188d3c60822849889cde55ad4c92d74111e0ac2b65a50683789c797e0d99f3b8b9398b744d2cc17c366868104f1b9f9db742325431149ff2546b7a51514829021be68331d8dd47b31d3799476ea3020419016cdb2c37e6a0a96dd19bc7e99a554f2a2ca1227f5db47b7e749526c9d65fee40e3fa2d6c0a6311e014c430a0f3220de787861ea4478eae17993b2ed31ec8fdd1ca7884d399f2e31fc8c9fe12c6c38890fd6b190bfa1341e63dd6f167abe9986a0853e59c434b30c1582a5385524445e2d7beb7176add1b8ff3d1a26b790c03697bc14646b4429f71eb20ae4db9a8e6b2d5d05e33fdb4e71caa9d35f692746242f49b6ccf5d44df5fd1011df591a66e3b9ce474156ac66113d8332499af1a49a1bea188fed2952c70de93d1b7779edbcb4c5e51b5c3816a728bf0308616e637cef76fa6d26ce824c5930dcb0dc1782df32613e8c29dd89461967585c0073f204507682b1cfee09e7cd246e0259b780afbf3fb8e297b2df2898245b5ff37a816a148cb1c185a76798c4209ea1a6cb3bb71fedf267553e622a49767e724aa594ffe57652577ca2036b1429cc9e7a528185d4302b9dd17fb3ef69c66a59620a9ead454d36ba99a88a8b94b1ed22a5677ae3fba95d37a179571f3d4ff693c1de9a1a36bba217ac15f026aca5ec0e28188eaf2cc243f89bb9591c44da6b52e9d773d17112fd1eb4b9df655206a6b87a074a0c55fdf375e319590e62e4969c93b0e254a792ee253a25c9dcff4d506ed53961066aaa304f2b18d2b4f965137a6f668f9e2914cb8b78f8590d852023ef7afb80f030d5659ea1613b2dbecb41277da0def3deba0051b1f5e71c93259b7dedb64d844c61cedd5a8c377739bcf408afc50546cab65551eb3d8615e6f1a500fa5bad569a772507b12a557abbfef016b4e869298811cee56683b7be466088f2050cfbed4cd922dc70c3753a04dc841acbf06d11da42057d57e45f57fc304edf0d22a84a55d982864e8c754e09c40aa1fc9e134d83b965702b8a48bd9075ee7108fe36a68d18034e3f5bf1997d1bf273880807d32fcd6487bac28315d286ed401814f921de50198bc57604ef4674175d442492f921d0630d261ab364cb8057aaae69a6b334aa85d99754146b59264b6cf27be1b87cf894fa7fec72f3d4be3dba0344647c0dcd4fad9a0dae4e20a12947f02c2f33c9ee5110e8a83a04871538980d9dca4b797ecdc32a735a53528123741455be5d05e27968fdfdd2cb8f81e75d2d902be426a9ce9e718a14bf41134e6e93b4e3e0ae32dd9e1bd8cc355dc6c58095a4e90d8b3169fb0ca5cf2c76dd4b0cc5bc19b54665370d63e51191cf0c7863d68ebbc1f22335fbd4247b004a43ff3e5e398e32b2b5b00fe91668af55a94639d340bb836564cc5503e18b7423fbeb9204554b9b41987bbcd82afff1362d666b76baaa3beebd58451579bfe256c66c5291132383fe50a489c041394b6fa2501b98b8d9ad5cfdc79a3a7172817c0be07f91154af6125638cdfa772e5390a4014952440686d30e572d1242c68d4fa8e1e4c381e1c461badaeb023523944d8d49a3599240faa8fa8462137b89c17a6117f2b3a9114421b9a1df747148b22681bbe9617c0a6647584499be813f8474cb31fbcdca8572c269770c1fb721ed75c3be1d0bf36bccc99d533b007ba7f80ea2035f5c5587f28bc08da9185a7e80d62ae65e90440ea2df604b2fd2b747feb45eee25eeedff5ff7228f4823e108e7506d4b0b8a864065686a2fda4f6b056480ad750c41e436abef1444eb1201061109633e14a99f081d0df7ae3ed84a69f8ff8095191e9f35e7a936588e3bb6e518b1c8dd5520ad87c6662381c920a44b1368709cc922e0763574ad0f8a5e106b4ddf2cf90331013318ce0698922771336c3e778b6f92f8298132ed5519b82bc9354544ccc3d8413997b4e641973c296e87ace7f9d26cd58a13461fe902626f4972106d7c1d4b87e6d33ef76f8a840572bd0762a0273f4beb07e74e48e481c7d61f3c6c54e758dab93d8525966583625153c95e472d537b64b9a4f532a830b43043700aaa39c8a7f6e54bb1f3185200f12e9e24e31a827493a4bd3e44849844d0a617b77304829c986729ec4b6c0b0fd58e2703e6fe4d990328d6c30f0ca073a0c8da671939601005ce50221ba2c4a5375e525649a12d86d8d6b67dd4dae83d82f2d4e519410a4b7285480feb5919d995fe3bd95752841aad49190b4d809316bc0b658fc75b9979931c9eae19279e5eb6fdfca417fb9a9f6ea5efe4ef1a370e67c68f2e98a3695be1d099f8731f5aa5f5a14b534368a4c2b4c7b5b6b542709b4becfcafbb8e73e6ce0f7e61edaeed2dd28736ebedf03e8132c3cb8f3c917e0f95cb08c28b3c93fa4e1a468a4e967e8058ed173fff9bc1135503c50e7f6aa0b6a80cf1941a4bb1216db06d8a5d9387c8451f889420a5b9d78485512e496d262e2c170c11a5fb88abfe294daae3615c6234a3b443ce6b7ccf98abe848e7cde138095329f9bf2f591a577b1954dd07d5a278048dc3eb1a1ede406bb26b7b8def94b67fa1e91a49291c11225936b163cb38a1b24b1b2504ae35ed4afd2010d96493f0a2e8c791a596fad4dba977ade6be75e6b32d8592363b0936cd8f9e47c9e3a6addcfa17fce0df7b885d27a64dfd6d8b2ab779470afb259403799c9e50a4e2024d09b92b43ce18776002c5799925932a561ea3512179400436170d10ef6866a5f2cc22b97c81cb495ee77379ab21e4c2c4b5d150fe7c5327dd6bb1ddb9275bd95cbfbd760462a798f00a2787c4366d2942fa8c2a779441dfa3a40387e1b5831698a9b4148380d157dc25f9186455146cd767dbbf4b858576b03dae235e5e9bd54039e34f55a7e26c60b1ce8a51b4de9c0d82fc766a2d032de07011ea0732a90431bac4dd5abed3e11979e3ec6614d12041bdfbcbe16e01f370e9e2c3887385e0ea7f50cbc3cf6e4f2dad01c243cb7bc6267e100b6c01ab62b2f0f0367287fee581ccde8adf52ef81fa2a5eadebbdbc21888550bbbf25b110b3e8f17720570f2421e5ccb58b3c687f050a20eb9f853c9d23bc9e2a2c6a79994de238040d1dc7a0f266158d08a800eacef02346932bc301f712801f068d24a095192310014fb0d1723eff46c802169607eb100908fc48247546758569e9f109b1ef79c5c4a72cce6c4e8c841a88e3b278426c307c76872285f3a058df5271786c874c2afb1b2f8b1fc73bf7d72d1b341c6585f8f9fade1b6e5d6bdf442ae84a7de9d14c82a49bcaa16aa217dd2a1b625812c352cc0ad60a958382702c2f6903eba36872d22582cffec8d4885a1f7ea2a8c21083effbad3cf83d14b75e746c67a69c74fbe61d8c6be7e5455a24f92c671b98117011c1ac04dd9afb756cf440606a1ac349509f3bdc171f51fd526b06fa21d41a74176fc92029899cbdd311876cb419644facd1d5765fe24e06926bf1c2a3c5549383c287d49bb9340eafd09642634eef18504e04ddf0ccf62b06bfc0455f1c52e2978cbc105507d43c5d391fd6e60e243005886e9082a488c80f09564067f9329d546ce0b47435484e53bfb8a3010bdd463c8d4901bee7d2d21222f618e5714580eacbffe81fbef2739c0713a880e8ba7111650da432a158a6ce78f77644c1ecba2cf34915f50ce62d35dbc9103e0aede0442700e43935d1732f89e9816ddf920a10589d0502ff690d3e25663d2e84f49ed758909865c01fc44c568d0b8bba6e1f9bf59e56a146f1dcdf4e4d458e841d5836a6a57c2ae2e04f2f195093c09372dadf73ec1ef940daa4603f770d4ac65338e0f90cd03d758184879c4d17767de5108b0d4f22db99048f10f46f0d321284058a158a716c077093ca5215b380644d1d922e1145a7dddf716015dfd7499a381be17f4ab2ab9fae43d5db30973aaafcc5223883940d0d3b0a7833903c90904293c4b7b88c7e6a8fd734f5428f0a29c4648c418a6e0357f2ee9c883daa3135e28eca0a75e06b18b51f8081c452114027f1b64006c59047e96c200505405f048f82d108130e593f0190a0241d0178123e0b64200c7a9f2fb40a87ccf1755ebcbb25c509d595394aaae116e3932d53b538c88877f023f9863bf09f61898f179bc670cc5efec43c1f319c1ec5d8d737aac1a2286c1787242140145936f5397db79dc31f8626dfedff3101993725363c3246bbb538d2c454bd0a25cdb69cffb77f6130391dc204e6d7f6fd2bd7aaf37f649bcb48f6ebfb5533becf4bef2e5e4530a49a088f88fb1581d153fb0200621229d9f3b6f87b6d007c589f3e4b8241b5549fdeca443fbf6fdb5f3ca34f45abf8368f47e269ce28e1091d392f91a755e647abcedaf931fc270206837028b605727b0649f35f92ff79edfef7f31971628892ded4412ffe68702577d8c0a008cca2b21dbbdf19ab264a423fe5105c80880bfefb1b04635a45ceed05040a342edb74ab7298c817ec3a69fce4c638ef407b43a4c022839aa1542ef34c57aaa6f86ed755e9199adc08ec0cca900b9f9055148b23d931eb70a9594e72389e1e639be4641befb49b6283b53a6fa2b48a27bbc90dce3cb532319a6fbfbb9c132e1ed0e52ebd1d627472098d895c0fa10cebf8d7f3a3911e0e5def01884ceed6d2bd854ab07808e83942d3b37b0feeaef0f36f0a87abde0620696634cbc1466917b0d2ed67e70bfe1e5e0512cfcb27c80e8d7537cda2a9d93649fa61e2fc705df0b6ad3f520bd8faa12140f6b52398b8b0c503f11a6eda3977e60cbcbb8fa55b389668d5f6e258d8123608a591d9cd52dc24a7f7f8debf662dfe958de04526bd4a9c8c37b8c44b1b7ca7bbfff6357afdf6edf047f13988dbc4cb4641bb9003658e1c763c8fd206b96821d1281d2fee0be074c3b4b56a48850e09a8eb9c165631d805d85f6d238b847a676428dc9b04b3b742021d7dd890972be0a32abbc913558a4f417fbfcfb396dd189dde5623fecf9af4dda686518cbd2db55081fe335ad8081db398c83421cdcf230ffd96721e7d8d921092d617cac5a8bf4dc3380c0d83ae6f739318fe3936f4f021b45bf1a112c9167a48a04079b8422ab4e70bece405eed0cc0626fc4bb1e5a1cfedd31c74abfc41b64ec5b6a9419a002fd88959e72a605ed59206ae936b79ec0a9743f981e128e05f709a83521d048c3fc2fd7f9607042476c06ef5fabc2332c583f68de3c4bd884da90996ff53012dbd7e66ed4ae4ca24c7e5461b4221fc0e77752678ee914ec852658452bac7c7320bcd5c11f32b09bdcfa49f714cacb9a2076eaed96c46b1b95806c65e154516a08832d769fea12ed0504340d1f8799d77757b00f3a568fc137fd06346bde0d06ae1f50856b6c0d79c1ae930ae85c9b9ce4d3d83f6bed66187a6a6703346b27bfd6bbcb0daa3801ea1cec5af7b85a76c7ba94a3752ff3d6083e5f4ced826068453092c869d74847ed76ff96f6b8258b2f752d1041431af1d6847f51ad9911ced22d2c5ba38aa970f63c7bc28aa647caacf1c0db3a612a35d5fa9b74efc917b9cd8d727ecda576f0fcd0f92fe45e0be1fbcdeebf68f460d09511647b6448a2a791fe7dd2a392defcb3d7e461f68b0b42ad999d645549e2411ffba6f120fbac7af9c24e72d818e96a8884a75b72eff36d0e081ae6b030de0c3037d1fa22e8a99b29616cc7924b0319346d756f3ce9eb78f62d9fb0a6319845546cff6f395d16e19e0f370241eabb1cc453170fdeafbe019f0130e28814890900510e15cc9d3bf124b28bd4eb0018a8aad49acc320cf08d58f7d32f486ca56ffaa2c83b4b394cd1d5d9e39cb303ea2de75b2a3f5c7e3261a345f2a3919d2ebb0e1a873e9a76d568bcf8eee7649b5973acf71bfea9e1be04c6e36f387bdbcfb65e5efe2d1a73c70e79c9569724cc3fcbd7ced46ca039b2140a46307f86a172b558eac56da7922d72378db41c14ba8b0d02f70c436c623a01828d724342d000c5d6dc9e70f40013035e4d1c9a5559ef39bea42c5cdc001c6e735390bb9370ec05e99fd364b6b5068be035e66edbaa08b38db961fa35dbd2ab754f1f8dae74c8d07cd36520447eb6d52e78981a22dde389761af78e72d7bfa7ede68cc5cd4f175b5b6817119e9db4c71f2d4298bcd5223f37d85d72e5dedd8466ce5c0679e85ec930bc8da509be3654062107f0dbd5789fed93a1e2ff2398ad48317786135b7b10d3b8081bf62b3bf4e26f338bc7a38b8727e083d4ab3839bf8427135efd0d82895bbc9f9e5397b117beabcbdd403fc0c9f13006e2a699819352b73a9627ece9df07df6b4e93e8f8a3bb9ed5baff4915f9987dacf7a409549f77ba0f8e58b5354921994b0bf061a32ed41e3dfcf4d534caac4356eccae07c98a338af9245ae7e1addd5dd6c0c534431875f09cb334c344966eb19066d6b150b8198f40a6d66afe827fcf8cef3f3c3b2f3a31c992e11fc1fab3f4d802e4071ff7f1dda64cf41867347a4d25d98fd5557a34bfd07b77efd1796d92ffbf28bcdfbd3b8ebb38ae393879a8c44d60b8de1095c7462fdf67077bacc80117e78ad2c4cc86081f24fcfd1238d23d1d018e194e50f287ed4bcbc51aa836cff51729b9a019fba6ebdf979dfb7656ac33a5ebf12f9524af9d68ee00f30a1500ab688edcf2e495afaf7504a8e340e5bd8f9de33878933691f04c72feced32bbe92e301d7550b2217708cffbbe632094beb5a9bf23cfdbf5aff71d9d8556ecfefbd326ded2d331e1ad67f25f966e604c89445dd307500817c9c5f9d5fab86d44fa7ed2737c43d3782e759da40ad9e8418cbcfe50cf36ce4de3e479a4ac5e23c690b73b69f0d27c5983ba79f37d4d97ac3dcca5ed0dfcf65f11b6a7862decce17ed67689dda38a4df71563a9329991b1db0887b720a30f28a74ece4e1a96ccac07988f462854e67f9380c242ef09a8efe95a6be4c02706f8a767765b67a7bad4e8bb479482e163264db6521dbaf70ed6bff9820e3c1f850a06e9b37b2eb3ef95956ca3677c0c84ff827c61cd492197eb3d2e0f8910ffc73639e9fcc2978aacdbf453d307f5788445cd48e339a0bcd69e4693bbb078598b3370fc9a99ebcf8217dcbaf1e6df993c58d2450c4747bc637db8d7d6fda1a3beccc7b28ebc28e5638da8f94a997f6aae02aee6953dac94fe83a89800394ca57f00c68c63dadfc0476428cd7ae79ae796f362a21dacbeafe232d827ea9b47b8d88cb18f9ce661148c2dcb03e7aa80730bbf4b12c9b38e77db696593c1b9916ef633bd1bf164a9e70353d5d73bf6d4ba405b24700917aaa4076f11d10e9ef21268077620b0c9fd4075feb4d4c298bd85913b18d854e909371b241a2b4cb7b6bade9fb7fbc8dcb67f631955134197d30f13b7a8fae12b7307426f55ffe6c477d4bf90aa352da52402608ad4e91f14d414b0fda2cb9567643c8f6994a6a0d1704e7bbb38e9007cb4c52748e7b575960bd572b1cd338a900d8dc2f4b95a2029c99579767e666e17b98f2ae3e438f99c46a420404039b0d0cc2f151fd5359a1ce6290169a330b9f5c73b7fc705ec9831fe2b949869b74ec5e83adc3101a7a6886a72fe89a748eee48d4f270dd00f1e982fbe3da37c00062b8bccfef710dc6a81764d66f5d05906166d02da05b041e7fd4e890bd5fb63d717f5e03f6f8271f8e32fa46e753c073c878a0fc3d2041f4b1233e3f077e6e22b99265becd40641939794df96b46c6c78810fc45949b6054245f53ca2f71e2dc14f97b32007710852f07930f0b2cd3403c85cfb83e58e073719f05728cedd3bb2b3d194f96d3f0bdaac5fc67f3d782be3c84c7fba177c6ca61f307addeaf3931510fc45d31b9504ecb6baa7c2dcfe637eebd6d6203863f3fe95d91a5010dae7950ff0b6c14675dd77f8e2bd9b37f727af36be013e00dfcec11044c80db44288f783507e69878ce26e0a9c6e29ad5c8e0a181ee9ed023824f12035680596bb80758461dd835597f05605ef5756d2edfb8f1ede05351ffbc2752e1f3b016ad321a362abcd28e251fcbb663d246d1402f1e10990faf604733ddf1ecae3a66649f9dd3a1b9ffbd132d4bb1af11ccc174106ba9df3dff558c03489ec2446776e2e52190492e3677fbc865a4dec930d5a14d185ab7bc0284581a4b32fae82e1b384cce3317d7e8409fcc7201be49c10488e2288694d029070641f57a0f8142b559a5622366c4f91f8f41f315b905711d18a3fb5b310107d5d000dcd57a641e325a7aaa283301becbaee001fd693f2626aed0ddd517d39048fc4abb656841ed2e669be012e160271bb44479cd8dfc83ab08427e845060c849ad94db01bd5156a8de42c76f236cf1920e56b8f7798c61d1fef9a4588147b4dad0d3ddff7afc5bb02f4157ca808cfff53b0dd86a760db56cac048ee18e3b6d0887aec975dcf9c1aed39ba265ed82ae74101403e46784fc96f9a7af9444a96897f7a73e2d8718abfd497ec01215e841d0055022443f0d9ad14a05e097e12380a508e89c760496aa059c03ef8104419aa3f0292f801b06e1fe6c81832d45054316c108901d5428463b35885f8a87009726a1b3da1078ea367016ac071a0c6b8ec45154b369f48538087e65089ea88a4147eed153813ae0dca8722812429f1ac56f4503e04bf3d041650468761b3a8b56ab3bec12c0960d73d3631b9cb6c664d30b1b886b0d58535a0d22d42a2890e4319a7e519017c1c320f662000729470184aac04f835c000b8bd09f0518a0141500be123e0562210c7c927e0640a012f420f00ab85408c571e0097a9900c0cba003402be2d02329c68025ea6107c2780a84746a541044e419b9839fe63a538285e0e1ce0686965d0606c5e0fa05f9317632c0ec2a7f75871c9b7ff2569e640323df9a8af16a107e6382da6bfc5e59533c6f14cf03a726b0ff07358e2aa814a3fc686a78aef0fcaed790115fa9eb3264d024e82abd80d0f7a74acc55c46a8cdb3c593cf95fd08a08b6a659bf02883543418f71d2607bae5fed5207952f5efb13ee73cf597cb8c58306bb16d4c7f59d25c23ced72a6bd04b0ed87e2534233e2aaacdb04e9c0c77ff20235d952b1d9e69c8c7abbcad49ee595ead1070fbc4a5938bc1bb1b4ed431185dcd7b92dfb8d04d4fd0ebfc0aff2f17faee4309abdd8b1e6f2a995208112a5ba83d4fda2cd1491bc9e199bdca4223522bb30dbe198844c06cac52414a4b7f46c8bb4e74c9d4fc90483b53c348ffcf9ed89ff800ac23b2957a711031638dd9b21751184fb3b7c3924499647a200cf88888c0ecda7d14584a7eb5dbc02d64bcfc80eaa3d826c087a67e6c4885939f74f23cd37808172a3ae9b79134c040da756d6da5372617d339c8b5fcece04e71cd32cf605d7cb84fd98a3f5e10c6c844207c88f2ed27e838d0d243af92d9e7aae63909863d5493ce0e0ef45560a0eb9ae0243cbc74da16d171fdd1bee46a23f07c300cb726c60dfc23e271b623f185f69049fcd4921e50defe37c4ca777bccc8174fe80797015468743fa65c57f7937ed54214694d69028287e7c7552e976a23bd5c7c46f7f52d1b3473333e136048abd60f26d47fb65d7ed16814a7eeec98e44274b5229637ab96295fe0a579da178f26631d94cb012e0e1fa37facc309a51be243292a89d42412680d2329ec4b901747be18fbbb520f9a4f6e6c181881ddc5bd3f773658c9a160475b9b520a8cc5fc6c470c55e364bfe6263a07d44c8a7ed0a045456992116ba411c0caca952377d9b58b27d6758c597cc89ee5835f0848af387dbc8de13765e2dadce1fc03fec394a6d5b747e8040e08010ecb31ca4db31c7d985e7d054823549a65cee90d3d9afd64ff61b97eb7c079fc453a55c4d97379bc2bea3b92c6496a265b012a3d3f35ab0fb09ba21d3422896065612374eaa805ccc417c6c2f8673b9c33c8b5717b042d9e0db14b067ca06c4ad2f42c00ca7ee9faf87c7b6ec446f8243a85f218f4fbf77410c8d741d3b0463046684fb8e1af3991fa593d1693ac60d1ad5ab4e6b0982a20abb6796f9acd62ddc323d76d24f03bd37cec28fbda6430494361afd74eb3dac0c9bb227509b51b0cd5e4a4303844c641e091976e1bdf707114ecfcf919b0688038a73a1cfa39c050a4a4fe8c1403fefde5d778714353f6dc412f727c54a2c4a9180944588883af17b55f6644e906f7c5de55da56464604c647175a2e28a290ce1b284090410b8f990650c1da1771adf39d831f2cede93121b745fcb95b8a20d428103ff73d7578cd646f65c869b86b44f0b2be734b387fcb464ba2c3fc7b59f8cb0eff2c6e92e05f6cf5dcb173df2c5084ee3ca5606abf07222b057178d722d3fbe2e4f20e277b6f9fb3b4de253680b48adb05a8bde23242d1270b66989e17f365d2d3cbf7c22a1b11b52d023f1ea4119fb2aeefebe5bf7b7d949e8abd0e57048dee8979fa8f9a923689f5399e2691e91dfda84737a3957358218f174566e5a07857b28656c36f624bf23d917ecdb60b68fa859d0b0fcaf511b0deb591e137131542ccb16436dbbf1a3aacd7008e7237e8d58f9d026932331668169d0ddf7ab3a9c8d73c1fd305e7513bc7f12f2182f9b58bfdc36a56c6a6679f3ad8875b493b2c5bec3aa380788a6d35c4ce754139e74f2627efcba8b838ac86085f3ef65b12df9145656a71bef88ecca6ee97a02b79e2691e0e9036be9d6a3b10441186b426bd7338ce79e806733087a7b8f37e22bfb3247ba09399f6d696c85bea41b139e723c22f918fab56ac96075961f4b787ac1d0a70bee3736d882b95246ed29075db870b758b8e07e7e87e6c4852e3d9b45ead8383c59a08ac2851b403557dbc3b2237556e211e8f50affd7bd30c6203da89b9f022e4b267c037bbd31ca665aed9eb1ac7dc62769928695cf1556b17d16ed57ecf342bd483fff7f4e80db65973fda918844498c6fd469154941a01bb734d950e6b590129eb34626b0e3b2f6079ab3c41d6ce99f330d782e76499e23e6fdc18535eb0889759789ddd6b3a7af0a74a96a5fb37bd9a3c6c040ab2441f66a4d0ed1f14d1dedfc59af3f68d8fc3c98596a859033d7bd3c167e4313fb2d12dfbcc7067cd2308f02e73bbed98e412059b129f5a73fc6f8785c1708654789d09d28b46c747021d65f592833b9a7768bf3e2df0a397128f9f090b3011f5b5eedf548c04acca020192319d4c3f77d95bfd5f82ef1b2f96b37471c2fa0dc4a5a7c1cfa211e378e223b495d0f9cab91d85a2614bd1d6614dee8a37d496ab68538f788d73d28c9cc3cb1eed4a5b76b0f335c9fca8e68f37ea8d85783e7a935248f05bea224f1522797347a3ce77445a3434d5dde8e119f4fda400cbb37d91e6fd6bdbb6cbd441afaa21c1149b5fd04fedc83bcd6caf7b9421462761a29187c126ec80c68bf04de83339e9ab521fa28750d5bd8add669ba83d2fdec9a1e0cd0823f263e7fa25a3ae301731c4aa98bdea0d95bd4eae0e0630b73f315007b71ef4ef344d7ad62ff171abaaef55dfc82abf1d53f136cb859108cfab933036d3372c1e5b90d022737efe30c27f2e1c833fa655ee2ad5fa0cbfcf895e60dab807e3fcd3861b0467e3fb6f007658af778aa47a66a5b18ef77897989756c0c99461874aea86bce804951f47f86cc8e33da5f59f5565806f18066aff4ceeeccadb52e530849838132516863e7c44c6138f4f428cefd85952202805b7df9cff2fc7a9d502ffa304763b8ff578efc5ab580dc98b4b99fe5f090ec1c58983e340075253120916f10e6e496142b1f4d6627434094f714a40fcf3f8524de0ad21584b982bc3d74b3982e3c0647d59b471906934a7820f8e65a48214948b4b3f818b5af0b451b610cfac76ca0c2d301aa7eb92000a894793a057eb8020883764718075e0e2761cb025eb0b91f5387eb73c44c800038c182604cc096949dd392206804592ece1bf5ce6f195d83aeff758142cb7a8d19bccc43b4366ab5834638b1db7c2ba783db2722bc811b1ca4c61d0b14deb70fc48d8ab896aa50a18581f37c38dd83254d6510694daa145052c84b78a53020b2117168deaf9663b72d18e6adc5306662f1005a338e0a04020598bdf848894e1687f356fad082532d63e4fda3f5c796c836a1f2441b498767a52cae94b92207349714b4a7d3693e8b6f0bf7fab665db7ddb0fdab158c4141a7781c8a4c672f57838789925b812de7aee0f053ca88232ad582e98af92bac36f3943110cf07f96c288d3df98d8c515a29777ecc10c7aa2b976b2490df83365a5ddbf1994991e9ce856958325024411c9f7f78d02b50bfd9e73038af47bb1480d10c2729cea20cf4df1979f3535f3ba04f0b63c352d62230ee4e14c7032078026815295d3f8014b0bd366f2bbf5f91101fb2388f7217b072e05b41f270739d5bef78bb8a304265a9f32b153feb9dbf16be6046a15c917445ee7eb310b12b2871e156e0fc5d0c9c26b6e571caf9618b819e42c33a82b583fbb44c150ff333737b1439479f12b51352983688060b7c29cc260962432318a955ef92b2e811b2e89f6e75f20e1708b2022414f8aa5995ea3a15b13c25c6d4fe327aa2654b2798670ea8752c07fb5a47c6592fc2bf5a9a52487afcf7a2051d3bd53ff175527a0015553335aca6c03c55c177d9f94c88dbcfd3efee47bee84d36bb7c282354c7c0f84716084b9e754c3ebee02f4d027df4b08131311d05504f5c426d961a24e72e3b8bc0d717f6c3dd9a3991bfa53f4f2c448a18701cef19701eef285d252a85edbdb9b502b196ea77c5a95567de216097a34ceae75aef3c1360a84a8244381cdf0edfa73b0fc76958cbc2394c54c11417bf479dd86577dd4a8cf4bb52848bb9997263cca7bc9dd599ccee7d0aec1adfad55aae38cd38c5eb40dec8ae2518f48851129d3d7e38bd9d767b43158c59e3bdceec2fb327857ca6780227ff3937d393272989a76592999db2ac03af9261a0ae45b6627872a0e528b6ce6921c0e974678d446887821ae38a8798bcba3706348f6f0ab780b6c77f50f2dfb0ffdd2874a30b7a3ea6cfe38b75105bb34a7fbf39b482e9fb1eeeb700bd1a9316f6acdcd3ebaf6349460924e130856920974aa020d9c6295f11a6b1ed8dedfade8653233aebe4e2c0399aeef49169b6da154cc2471694a613ef60bf7cfbfd636dd1da0b5bb05b259715543710af6126a5242a6f7d4d7e324887a08578eaea5c8938cab7c5e3e4317122e7d08aade36614c01a1f5d36a54ba51abb90a433add9247384874e7d2e001d86c6600b85b2343b0f690e310b825873f91141921d9ca266afe4c63a244023150a57accce96947b3bcd3ac39125d4ee472e75bc831becc3c7c651aba627976598f72bb75834ab83ec878012c8355abe7ad876a2ef96c630fad84c96f710c1ae2f59613d3c52d38f054667c0d2a9259ba576ca828c9fd632178973386afb6e845c8a2e1e3194de0af1a16a4b04349c9d154a4ca39a3f8d8c4f138249e41d77179a99da09f9e4a73b64041ac16073472fdfa89d1ce7c15946595f0db3f9972484f290a9a91fdffbc3c114eeea4106dd91b89bb5f5f99d01323385ed83d1b5693733a5140b06d832977036e2d03721c7002425845bdff156c3f519d064e1df2873fe72a8375a50c6d5bf290249fa7a4dea6b840f0a6fd5a8536ab3238eea474bf74ced4771158a8c7ba1f32401cb8481bb0fe5d259a16abffea8f8ff1d15b0542122741c32088b7a705e96178daf28379ee9bc3df3ebf3e624962493f6750cf6e82009636c24f15cfdaa8620dbd945875664ce01688cbf318c2500003e9246495a6cbe91a0e0a41399b4d9d6c26509ace35442075ccf188d29dae494da195ae388e3a6c8bb29a1dba574a1130845468714d97f91b879ee28d2768960740bd49d43c94b0c002e93a52e3d07e0a447b26193ebffe2a10ebe0cd518d0221a2b118b3f6c170b0f185780880d7a2f324ae4e207539dbeb167b6b840281de93191ddc5d9afd9ea50838d8c3c64671047c4fad289d5b887889ab42e50731d16cdc1e630742bb263bffa6a56cd445766b26d1f7640f296a4bbac8404307cca0176f0a51f0d8983a0a7560f38095ae39b4f588d0de5ab01f419454c424064854ca8845cd36464300e277180bc74933ff8b15e0d4d47344e9dac182d686a1b4390bbb68b10ad57394f83cd480c4c50510e3c9038f56bd4d061e82b60681ee5fcf9a1c722a4e39c7c01d7ace184b9f2c38c8bfd5bd99682ffe893650c6c0f83178d0064a1bc2ee449e3ef2e71490b473eb80ec1efb95d5c3ccbf35fc755932528351aa6c50b38c9ae5eb58e8fa009b47be9279b5c3fd1bad68b95960841197d52ae062e0c4c865701f26f59ffb419571fc3c056cc86dc3607e4caf2406fd5154c064118a3482dca517d7dc6f6aca2acbeca999a3e5ad0df9cde74b1e9e728791ac3180d9fbe230c5ce73ebc309d457532e1d519a20b491f3c8282cfe2ca6765117c4c92de8c08ff9fd11abd2e5e1b186dcec0372c8ef3d1542a7cfc6a5344b15a56d13b06fbbcf2a8f9d416c98ddfe04d96a5d9f90d8c8e9e575d51b772302c41b3b16b9bc2ee9f198863f8f5ba4cd7603135dbc961cebfb34b473ed4a367666adf2b07e44ab1fcb10d4217441fbabea1eb428bc7045f6f1ea9e8aff9db94971de26ff960e4226aa964e21b8804d5536cdb05ba46acf8689183624aa0ef0465c2b963d1ee809379cbfd6a98831af3dd9d6629e3de56a084277f132b67c17717f385cda1566f9dd9a1daa4def780d35d5827dc0f6ac2639ab78f7f08a480cf18bef0e69e34ffe825884ea2a015fa5c5ad34d1f623f0822e9a15450cc367dd8078bd75b71002969a06734dbc47bf613a4c744006e8aa37e01eae1070041b5a119fc7e0d822e04660b21a16af8c077c59ec97d98f75350bcdbeaa548c3006da4ef08918ab26f16e1f8bb5bb88638a899514e0009573196ffbf510dd0981f02c61c569aafba7f025602aaaf5cbe2c517cef47a219feb00eb44119ba8b2df1109b655f1eeba3c4e84b80acbb2c7b5df040c303f311758e22928fa2ade189f1eb232d4940ac1361d17645ddee7fd893a1095d866e0d461201c08d3562b32ec556b2bbc2fb01db08c671fd1ff9a64d33d082889a0ad53af4d7ac0f02e01fc703a1baa7145e2e9123f903c5a185fe094233cf3bf18521960b11932b412bde418e556843bab311212ae173b6f0c1e11e2192d86b89ebe484df2f7c56215151f96afee4eef2eb1f225af644dc578821727cb4f28e19046c0a0d1be5c1bfa490fccb8ae8478d2bc424df6d34d6dc9ed8387d41702720df1c382c0d44bc3fd423cd4be54281e88a6da4192870c43c1f2eb7fa711fa4442a66543ac4f81e90483fc3b1bc5351c11557552732ebb7ef0f4022ac4d17ad720b3975029daf394684242fe4a03e94421608fecd0e51a0ecaa5d6e82e08485352503305ac470adc8bc90cae9820008abd270a8368871721f487a6c518603b7a5adf1d1111b2fb34196d35286003d19dd652f979e137d79ac4932d541ab2a0fc05855515bf0a132f6d5b1a3d2a21bdba1e6732c65f9d5304853839942e90184c5993db5c4a4a22a86cd323a89becb26a4a6de39b09ee77b798957db5a105c1212514d3470fe412d64979222d99c49e6114b1b7bbcf2a2531f5cded156292d56923e7e673d475040bdfc54c4b6b95bbeff75c686dc8f57d2cb7d496686e896635a38627e83c8de3abc2787f0b4e801ffbfbcf33628e816baed975bf2c60987ea3c6babc4c723c0f9c8cb91514deee9e6947246f573e4c7d773901e0ef79f91796abd65e0d5e732a3dff06a842fb4d2c9d8b8a7629190936c3fcf779fcf36f1451d55ca24194ce40fb5472cfb10cd51c69dd9a17dbb6ea4e1ed34f668e20ddb50a1142bfe01bba81df274a3855aaac96101f9ca0ddff95549483c6ff9abf6960f94b206c1caca4d548acd3f97588806bbf432f73147ea954bbd07f457292bca089de8040a0e69277e07e69a1cc9af124c1ec0318372cb8045ec7a52953c346eb8728acb1e2117f7c85401f322834281cfb982f24af2431b447f5f27ee579185f6e7c6e34579bb27d13f53b894f9fd9933ed8d1318bb06ccda1221af2236f9ef573e7ad68d6309f988a028ff863c275386c425812a24e18a80b07df91b9a316228a92e2da39a3e9f48213cadf61dc25647a16a2141a996a69d755cc458c321aba0c748f666112400d473d4c11617e70765e82832b0869b98528a33ef8ace312d96f3f4d25be8f2c1c66d07dbebfede4169174be0153cbfd9568eaac4f9ba065095786a87e5004f07fc71c085e2f5740698113dcef8f07738ebfed0dd736530d3931dccadcb8b772f68be37aac959a3ce9dff6180941f5ce55665c13324a037185720764f3737eb0030294b91ce519c05f3467e76f8164cb9dbd287e034b6b012f93816d221ad8f9cd68a03c2e3a8ca14bd40d79bdb1842e52e7cd094c7f329efe79e02981def22f01d1117b0650b0e04a2be79ff942c6bc751309fe40f7b7fbade6585f772c617e3c890c2ec07f980b16027a68b46c926bc8f205613c4f1acd35dc9158a4a6b136f745cda0901ea9624cfec022b8f034c55ce20a3b1a3badaefdd5e2602731221807a2ef05c68dfca3c88caeaeced8f973ea59828fc9b50b997d27caab83936ffac0de02e87b25b9e1133f12a90341c7df3917d21fa7ad18eb89f7b300c75f10fd712e6fb217bf36d3be4d8cab614ea644c026ec29e7f087a1e93e19bfd371fc035c519289a1004ba914541b5ff63d786680f7da09139a6397226c705bc6279239afba6c7f53a6416556abe8680eefddefe3795158054039e9c1095d23da86022bc49b07d2abfd97a94574d6626026768b21148068095d7669e8031e242a81582f8597aaf31325312bc2b8c975020743d0e22c9c47846e3c42d65d4bc26580d1ce392f629568d11d74456aa8609ddb3af0d9f72be147300a636c97b0aff027282e449361fb3c3d5f8f26978d09eaddcfd37327684eedda2970b8bc13608a547a473fefa09a2b242cfe106b75ce3c64e6c34cf1c6ca183c19e4fb92e146f50496a4764c443b8e7b2365b7a912454b50b02015d7244a0f66c5bbaa9a50377524a0b11e4a349f3720c2f4ad2e64a749d66aa9ba0eda7194e4bcd391ebc9977855fe2c9cdf41bc630180861a18f308727dcbd0d39b976d37a1dfdf904f77a6a40ed06dcd94738374389027d9018b1943c5b713325dc8b5de53e34db7cf819a55ea2fa52b11b05b2f06f31084fc2a47a1f72d6098df6e66181ceb8d40135120f055587a63e793dc731c3439b83d9ad34d6c234c11b5e368983e17679ed558a5ea7a3ad33d5b9ebe300778ef8b8f578f6e30d7363c82cd9f03e1d780087c4c182d72e0319acec822f2de2a32f24733f57413f6d2e693c7de3ded77e48fed03176d03e7629c68662b9410a68580f98cd4c0ade2e5d113f8d72379e78ac6038525b81ef549b934f85e4714425e6990805ea4f011f7e62088d86b11de93ae990135dfda335ba4d6899d2cecc2c7cd8497f5226b3c59af0264c537de2ee237fdaa594788747be37d35c4755475ddb9647ceb63b2066cd4ffd3500d1c8e023e5a04220b3760b46439330f0f0f0f0f0f0f0f6f4337426a6b9f908494a454aa976679010b644a29c99492d81dbc0b9c99f87466e2d31546ea6e34e301030b400bd30a89305b754ea153cc4f17311a1a68000d2d6854c0c3c3c3c38bbc0c801a6220c214d28388d6a39e7fa625c4388441e5edce5e2284ea63058d011b39ba7880214c3a9430d9298b440b63214c21c78b914df249fe104218b465c813f91f15620cc21871e5d6434b9e902208e3440b19a91e545479a2102310264f59952647c8881a157284188030a5e777f438191b6b016084187f30968e74f988efb9a75363edc3c647c12d4b31fc6076b7083243e465059386161e1e5588d1077357fef6f47137b6f3c1246eb35ebf9237ddefa26b68c06fd898c0923d186de28afa0e1d3d18e5524823aa3a7f3a711ecc5f174b955267a972120f8697a4b4aca5548086062440e3430b1ced12c891000b2851438c3b986ad27c74ad38f91b362002e50a31ec60be0c7df524667bb5af83792dced6c4fa09da6e3a986e5baf64752ef5e139183ce54ccb19a24a29530e26a13e57b8a89e9519d6588b83f14a456cb56ec2292538184ef6d8c9d0918488a637e8337975ebd52f23c70d068ba6bba5847e25f3b4c1782a629b087a7ad5c26c3089f59c82129d3c8851d7b09af89d69d3fbfb5d0dc6d1f62762470e252d4d83316757528ea8f360123418f542e3924e6a44fcc81990e79e7592d8f0dd88194c9fafebc329b7951896c134e23e23f4d998fa6430bd560e39a29ab0a4d9180cf2246987284292490cc69ff9d4ad94264cbe6aac1962848131b7d9ae20536c3430587a3cfe09791771fc4272a23de2880929cfc70bac96e87069d927e98241e9d349674cdc0575e242a272ac3d2f919152bd05decf52e447e9f4c1d58229e72454dae4f24ad5c982c94212972fe88d05632491b3d1174a4551b942fa4b5e9f1a1d4f3c620593aafcdb1dea296787ab7067cb13dbd46a6255a86052e6de267ddd4444740c31a660c48e14d192429784670d0f69267f4761d7125365924b5ff250307b2425df15c2ab3e9e438c2798cebc4dc6e52427182d8f7c87f2fc155d9b9078710fa1cc4c2618c4b6044942924b583ca565c7d2217fca9460b6317defb0d57f214930f68dca496adb87f00e09c6f8ddf3aaba54b61ec1d319b135ce74881ac1b8af27c1be6e2c9f72885104e34a34a14f45869e1e11c1f41971d72dd4ef538660505921e5e715e517662198aeb346eaa80ad2471b0483e855f79c4a6dafac4030999950b9206db573f20786f7efec4e7af744f6d00d317c9068a6965ddd0373b6c41c939397fb82789007af3e53a24f9c24edc024277c56ba206f92b6bbd8a26f241d982aabd675f47091d29203c385e7eb087bed220eec0992b642527cd9788353fc38ba446f820ef2183630ba6e8b6e0fdb298aceb521460d887f49f4d7280f950662d0c02ce6e13cae598ae4a1b121c60c8c5e3aa5a81246eeb8be8618323069cefde76f856889c5ba9f53d8cfb8d2aec1c254276ef73aebe597e91546fdb4edca31b57923572073ca9369bf4a2b0ce7a3d4bdc8c6fdafac30dba7baec905ff2bd5d85c1e444e5e6fcc83cb9c69aab1960a8a2ce761792852429684f2accf196653997fa4d1f15261d523855d7317e3a790a5418cd4ea2744c5863ad057e820fbe1b3672743185b13b6591f11c23966534b4a0d1821c5ea0c07451011a5ab4e0867f71011a5ad0f02fb8680ed0d082c69db5c02340430b1a76c39d8bf3850d2df3a251f05186c3bd68418e2c85414f7a0f8b2426297b5218d56cd4a8f4f1f6b98fc26c71d2cf88c5eed35714c6d1e965fdc36fe49ba130cfbc8f288f7b8b2c0185617f3b4be7fe2cefdf270c2e4946d0155a3ea25d066078c2a04694e5ed59d7fabf138614f22c56a8958afbd4d80d745181b3829c30870d911e72e6dfb29cb809e39c271d99a142de4713c60a7af1223444ae8533611049c5fbe69e4bae0f26cc79c5de7b74ec10a2a55cc214b45c4d9f92aa22644b98d46595136182ead866f2004625d491cfcfbb1682caa2008312e6a0ad2797ee5b93e1f8c8f3008c49186553c4055d59e46449560086244c1529ec8e55d808ebdcb8617608302261aaca9ef8b521b2eef187106040c21ce36e73278b47109700c6234c6d415f0e42bba9578405301c61d8b7aa2ecfb7b0145463edc373d8e8e24e05301a81d0191e3e6444790306238c713f62d1e43efdeb35d63e10522f602cc2544ae26e9b84a4425a6aacdd5084a954764cf86c3fe67101231126b566592e665c46b4cb4c000311066d912da851fe41a4d3210c7f61db43caa5b9681bc29ce467e498a51121a51026e5392e9f449810061d134a790ae141982508f5385721447a2c087329ebef2f5526e60f8439ce6ea464656af2640161b69446be8d8a21e4db3f987d62593c6bedec52fac164f7df69fb631f4c29ee6e65adff50b3f1c16049eb6666df8331458ed029b2249f5735d672b4e0468eb5ced10bf0e223c905400c30f460bcb4f1faa542ce53aac6da471d0d0d34600b30f2600a6982a4b82e5539b45c808107f3e81e93b318dec1a4646858588a4e96658db5b230ec608e26579b3ee26bfe5263ed830d07a30047af200130ea60103bc23f8556eef5c3737c617e18061dcca924a54fd2f75ba489e760d64939b722bf65cfa68f3b030c399844d8a9a0ff63df851e0783a58689a7541bfe4170308e507955fa6358f5fd06931033ea6bb47583f1d37376b8d5aff8691b0c1adace3e87f8b922369882fa4cf652daf4e49035183f2d98fb051d6f92d460887339fc7327b17f8d8b56810d143806baa8000d2d380dc6d02222d553f5ee99ae00030da60cfbf57af7703eca3318b7be26ee8752224c806106f359678b37eea9457b30ca60f2cad24946844f8da700830c067517ed83b4fe1ba53406e35ad871cbd7e3b29be50186188c5a5b37bbb67d9d3d6130a7883fda42ae99f6d100030ca6b3b00b914275ea60d6ad01c6174c9d5444af9b8100c30b86f43b97bffd9e7459140230ba60ead4157ac7cc264b8ad987a11c6070c16cdd162752f27a1bf9ecc3181030b6609049317a1e52d809920f3336c0d08229291d26ce8fc9979033fb30b5d2038c2c98f7e2f3558a8afee75830a8591ecb3d59bd3aba82f9564b7b5cefaaf3b582e9b7a3e413d23e29bd55c1f4c9b28856bb5890142a9854e764a53fbedbea3b05534d2c7d77aae2e7775230a9a06137d2ac24465214cc7d1a298d2c75d9520e0a062d93b297d095ad84fb0473cdbfa5abb658eed209c6d5b4504ae57cf6779a601a6d61ff45878ffa2513cc6992b07fff8ba054b40453ec0bd3d6ad3fd7394a30789add480bffd22d4a8239e8a860fb5fc94bad483089bb9f117942749b0fc6114c49d99a488bb011cc11840a2a87d1cfdeba08e6ad6c6a3f4b53438f4430682f11b211f3b22f3f028c21984bece28afc8a259df6f0281f8607430826ed4eb1743e136f97140473bea978d6ecd68d05046377f5886b7a7779f903c3488ab964a13a9f181d0e183e30d75d075d6e32ebb33d30a8b9a43d7479903d2e0fcc155ad41d988358499ae02af945d68131e4c73ebb49c2c4e57360743b717eee57a16aa3a1c58729da62cb60e0c03c16225cccc98c8ad40dcc1f44880525f46f5ad60626fd172d47dc9aeceed6c0702a3e8a4eb942be80410393b4483fc2d7e4251d9d81712b23a7bbd58fd41d18323005a97dff932a8ec9321646d3f2380f23a2bb25b0305df06afbbbecc9f4fb0ac39f4732f3d167b1a72b4c62a284dc5e893551d28286161690000d6d81005a6148fadada644c92159b5ab10b08801546133af5abd492d72cf00f1b393ef05620805598c2da6ee7d3a810376320005518e4e7be3ecd5f68130502488529ed2911adb40987aba09d8b0f1514c31b282801a0c294ee84ae4bcb97eb2fd2028f403985c9c427ff298b98c26057396e9696ecd1430194c2204566e6ff7bc8be202408801426f7bc6769a476d2e6e8628b1a450b0f8f519852f8879265f7a62ca6111e672887243dfc2e5f7c7461833b8ad0610643d075973fa67a8f9a40e828c32a2a3ce928a24e7e51e82003ee5f5e9d25954612133ac65072bb2f31cdd0b30b5c4287188ebb9611cf7f346ec1f9280b833945131efaf24608dae90083214938713af79c599a5f3086e917ada2aae7c4e4dbb9282fe8f082e15bc4bd54e42e186f74ce695ebac73fc905d3e4169973514af6f45174d0b105939294f522df4d9cc65a3098ce2945c991d4a0230ba634f12a4b92e4ce6663c114f428a56c47f44b7e35d6cc6868a0010ea0a10109d0f0f09041c7158c3a493c699153b357a264830225d9e8a2eca4a500083e0cd0610573a4ac9491a89d26710f0f5e0a80e003004ee8a8824175ca972e6fc99354d5584bbbe139fc861766aa800e2a18640979f398e421775330a470175b17b4e335cd8f0e29184777ac185636f3f9d482060768584002343aa260f41c6f25c5fd8ad599066868416303342c20011a1d502874864861fccc3f5d634d058e010f0f15f80db41b39bcc043c7138cdf5f51527f36d52d7e31812e18e0e1e1e18163071d4e309c502297969610c4af8e269844926a0f777e6a7eac4da18309e6642a590ea1b53721a9c6dadbf8e0251872a86441f95a12d26a724a30ce4fda14f14f27d54c82797420c1f82bea25071d9f4ec5fad071044350cf11092a4a90df8d604ed1a5478f96fbe6a4a308a6ce26259d8aa076f5c2367410c1e861c4e517216774ea5e740cc11442cea3152d76ca2d4bd02104934a95e6d564769c488d0e1d4130c7121533b2e59ce3b36573e80082b12ac6071ff57ac2439258213a7e608a9d8492d9fe8a7caad436b8f0f020f6611b880e1f18d447f47fc7fa5356730f0ce2a942a57c499bafc63c3047c822c67284a9b2c80ecc29fbe46025569e832e9fd0a103b3e7fc1232faa774e7e4c01cf793f3466a383084dcc93a25f5ff0df50d4ca9ca7476dc49133a6c60b29bd1f7afb14b538aa1a306660f22f9626db8458e7ea18306e6206b92a3ed857ee5ac858e1918420a7bd723c553493a6460d0f5c1f452ca1efb7d2c0cefb13be446fc8bc8c2c214b73d6ae7707e2987bcc27841ee5225a929617b579872aa3d15272e88e7a915e6d6cf9654e58ffb5cb3c21037437755ffa2e4945598ca3ebf8f885615a6cd946839e59c0f6aa258c82215a6cbbcb99c13ef0a59a0c274ebf6e154485b3e39a730c7ca4a4a23ec1b3958604c61f0109552ca1f254afea5308ff04ff18d70fe1eaab19611c88214a6109479ce3e7d7a71bf1b4116a330e58e7b1a4134925b4a8d355118c54f951eb57f2af13d01b2c1c586c270e2262d9bb4acd0528db58f0485215e4acac38ea8c6da65208b4f18546d3dcd495acff2d558bb40169e3065ae97764f1225bcacb1c614c8a21346fd9113ec52a6fd7d1865c1095359fc4fe2d69ddb6235d69c8bd37622c86213a65431d789fb6ec9ae1aab09e3ed44f5b62dd3fba61a6ba90b1ba78b2f361326bf8a1f275d5f5ca45a70234762c26041a50b2b571344446aacb5e0460eb2812c2e61fa9c3e2e2ad5d60879324b98455987b058c23ec4a2812c2a6108b2697fa6b273ccd696035950c22074ec7394093126ea933086850bd1ba6a24ae92306beaa591266143422261bcb738a2539daac41224cca2428c70df0f6a52e711a6ab18177cf257bec91106d331e4771aedf183dd0893f214e18410c16cd28c30e78f9dae5f21f5b96511e65329fb9cc9274f9e2ac238ee3da3edb7f2fc441862a7a0ec65e554658908c366cdac8dc9da499243982cce9ccd07194bdd19c2b0ef49cbe6c2e4d9ad1006d51ac22d564ce6a93c3c70b8172dc8714701107c0400085910c214a367e4d6764b8a21b40fbb2c0661bc783d31fa395996bc200c49de09f123b1cc4e0d8461ce65948e8a1ff40f0863a898dc172d79c59559fcc1fc1366accc52fe3c310b3f185fd2986f044bd9c9f7c1105b2f2595a4d3635e0f0f3164c107b3af873455d11e4c41c8d1f1e446bf4bab078369dddffd8fe855963c184eb52b5be8feed13c18361bbf3fa95f60ee6ca932d9cecb0371766610753aa121242aace33f70c1059d4c1d439e88837fbe5a9743a1826c6554ab24d5cead11c8c6f66a3abd255e4242407d39aa5aca7a7d42774e2605c0f7796173a7030ae99d9870bf274c4ce1b4c25cbb446abf55da5dd602c714b4145a9ba384b1b0c1bdb299dc50a1bcced3b22ffd55e94145d83b14ee48aa74feab35435183f452a593339c8b7d360cc095ff91192a48b241a4cf9447eca10e6198c6ddaaf636c9abf04cd608aee22eb352c9a50aa2a64510693ba1b212f7e4f0653ccb17062d26ca6c8c76036212df34b2589c17429a87e1ded15742585c190d3d6efa4ead494243098b33e77309bcf174cd9c4a28a27715e757bc190824a3255933f7ba574c1ec7f9def42902729cb5c30968e6f2642b21ecf780b86a81f2584b0ea13e3d582694dad72fcceaa77370b463951a5f379b29b5ab1601cd5599613a24d4af30aa6b0fd59478d6905934cf68f3b4a8ee79454c1b835794d7627557d122a98ceab3f2b9a369192640aa63d75bd5f4ac63d77523056866817f92267b68bc2b1c32585d1eba0603cad94ee53e8cc0bb227183e4e9e30fa932cf79813b4b2cf394284ad09c66d131e572a74d29d09269d3e2c89c6e5d32fc1b027df4dbd64cd1229c12446477f3ea1524c4b12cca9a76a5fb3c2642498365436cbda826b5716904216473075e990f354e794e36a239846082d22d4cbcd7f8a60d056ada0e324f5e7b03040430b1a75011a1690000d2ebc40c1166a4430afa7d8b6cfebaa1492c30607ee3e90c5108c3732d64dc7ee3295f5f01082498e65af74a3ab1e4e48c82208c68cd1d9a16a9ea51d0f0f0058210b2018eed273ec4bf331e12106b2f881219ad6aca4e2f4f42a3e30778970abafb6d037d758c3f1e1c517391cc771163d3077deceb58dce4ab68d1c669b050f4ce13f7f6d9b8b0ed9da813925fd6b5e39393e6f4ac84207a6246e23f3126543c63930e851973c6f527d4bd60b59e0c064f5a542b05c69a7a31b18b4424f87da883a216f210b1b98438e962bfa05a5b4493c90450dccdf9d45c4cef7d1b28d42163430880ba7d353d6f0ad9c8442163330c44b5de92da84f56a2608b1b5e98690bb2908131c3b5d4d743462ad5be102316a620d1935cb45426b65b2ec480854925c7d3f5ab6b4ac5f415860b2a26bab64711f95d61cacd4a4a08f1126df256182396f8925e49cd66b816831506959c4e091d4ebfa4508d3557c1163752a22ebe78d2858d2db640018e5e0189b10ab3255dd3adf5d5afcb3eec0f315461ba3c2b39ba92f2a7570b1a34b4a0a1050d2d68380a9a021e1e681f568718a930867c864ef19239f10dff40157cd8c8f171e3867f78d12858bb618018a8307f2775dac6235e7ec8294ca2d627a414e6bd448708314c618813d383e4b7fc214f928518a530a88dacc84ff13c7c0e298ceb4195cf8fdd859895e9284cfea984509d5fc4a5105198a49afe05a11e4e3ccf408c50985c4b948c999d94da9a82c21c44d0cad974fc42d0ca270cda542cff7896212fa29e30c514d33457b7c61a0bbee80f1c5be017313a71c8a6ad478f87306d08313861cc104965dc566aacbd9f0b000e626cc23cbaaccf36de1aeb802e2ae0e161ae88a10963eca7c8eecec494adc69a2f51c19503c4c88429eb7b4ae1930af3c13a25c4c084b13be7e87ac1930c317b78e4c0b105171e1e1f312e61d4f6bb0a8babae33046258c2786f229ef77fc66a8f5109b39a9a4e5ac3ccbc932861d0e72762446848b10b8e2d100bdc930d0a4cc210627f98999af02177bab0b1c547310ec4908461562b89bc7d593ad901312261300db38ed725499bb68504562161160f13df7212de1344ec1e508256805a0e1c5b70413a10e311a6bc2345655bc8b11c2a00f010c311c61f75df31ae5de72a1f311a6150dfeb104ae9deab1703311861fe523e267f2b4a387b11a6ee7c29fdc65c6dcd0f1c5b281b6228c2a49f133f8450d7d93e0163b06b542449d1830c311823a41c429a2d7d1f2936920d1961309d460e22d7c608e1078e2dccc820030ce6141d11f4b94ef81a71f105938c116df11452e507820c2f18fbeed674f67f4f3b5d156474c138f21e724bbbc3f7cc05639cf7288b2d5241c6164c414372f658bb5acb6ac1706739548a3769cb436464c1b43d49697dcfb7a17a1958308f34ede929ea46907105e39c1c5da645a78ecd56307c96be28afff6cc184b6c8d1393290041955c827b5d5cdfc766190410563ffc80e1d65259ca59ce046a3c06f988c2998d74cf252302421dac3bccf838a7714cc637fb1f6c2733e8f0d20030a86744a6a990433e1697f8239ccc5eb15a1ca3b742798723aa19d3dcb92ce5213cc7d715c46a911b1549860b48ab5adeb4b1eb46709c6ff5db7121f3c5ebc4a30e7d332d5ac78398ff20b2f92606ecf2d39c6073569511948309e8e246549e49bbf1a20e308a68b37799b2ef2846f04e36f4bfe2c7f8b6711ccffb13e92ea49189d08269d3121f2c63f04839c5d8a13a24230574e9ffbd485ad6406c1a0276a9927395a8940306d9747f8c85eeafc812927a1b4cec49095d8fbc06413a4a48b1727e1ef81219dcd5dbe9ede34f1c0785abd25f72ca47c7660d8fdfe55af9589b60e0c96a735442cadbf951c18e4ab465c9771604a29172e37b981a9cf45b72d5be77236305a4842a5ebce6b60aabbb3b3f78ff697cba081e9f63c47ca5f19e272193330859a9d9e58c182da65c8c06842627c7e512c0a69a74aecd30916862065724e69a7571873d5b63582d29bbf2b8cabd7a9b5a6e4b8a91506a5ea2fc590eb131756989359a7ca4dd6d3d9559824971e95f2f9a4e0aac294525a8b7ab721ac4d8551542f5c695d2935418539dae81021a354c7083a85c9545a5c9e780c292253985b2624a16c4f98cea15298f2670f2aa69228f9218571ad757f3b72eedca3309f49cb232f8bc2581d3af2e321556c4361bed355ca666ebfce939fc87e9e13b3f309c3856cb933e2d7f9c713a620d16f27db9d30f78ccae1479eb4b339611c3f933549ba095376bf2d9de029775213a648e17c6e24ebca9809b3cc5c7a8753553a870973d4eaa4bb737d0973c8a7ce5a2679b4ad2d61ce96ee44c5889c9b75254c7b41b99d122bb25953829cd47d98e92761cafe9096462d4f58256110d671a2e935ad279648182bc951dbda175b59818441ebe8d121afe7cbfe11e638aa6639976fbec511e6942645e5c4c8e26a238c9246a5b1b29326228c305f2e616245a87b087911865827743eed5811e68bebd039f57d3e281106af78ed517911612e4bfd126631b6c73d8439480c15a1d22d4eb88630453c3121d9a38414dc42984c77c87b77a5d7c32584a9e4984ad162e5e4dc0ec2143a65975feb69782b08e3e7efa7916d0361cad0102994a97aef0161d0b19444134a5abdfe07e3cec4cb0e29723ec90f66391d7eef7592eeba0fc60b25d5bc2f760a5a3e187e2e74a5e0374a64750f6611a52d29554e4f52d583c1c7bc52ce97e6c16012827e7d13d5764a3c18fd4556843e1d3f72f20ee61aa5ef2ccd6907e3e98513b93baad696753097ee7ca53da659793a18b4a50a573274b2d8cfc1ac716159576ff1477230d7249b5119119205c5c168a64ca8fcb1a363070e86fbb871153335b6bec1f8c1e3578a923b65d50da65c7a674ae9ae0a4ad20643caf993bd7472b6246c30ad5bb8e59b4ee126640de69a942729495e0de65441271db75fe43f9206530e42a913d16bdb7244835135d3eb3ad8095bf10c8637a1bbbd3da2f58666309bb4d116452b8341a8532989d1cb7e2a2483c1cbd446b8f14aed8fc1bcd75eb27ff296c4c560d24baea5544da91c0a83b92be8d23679bd94c0601ad393e2cdb466eb2f9845ad83c872ab1cd50be62de91ff183e75eba601053ad8b13b96098a0a4e54bb9db82415bdcee24cf23f93a2d18f5ec27dd5e9705d3e44fada15d39873c164c5db2464e5e8d35f915cc296f217dac3d9492158cfa15b154073597ee2a98e6d449b5f8ad242e5430b7685321f2650a06bd9552ca69a1cf220573300f3337d9a260b0f568d95c8382d962786544b9f330da134c41c48f7d2a6d04cb9913ccde25545b5049c653d60443d637cfbf9ebd6f6782c97eb4ab5eec4e3f5982e9edcb7427794ac98812cc27d62992b44f72912418336d6fd5ec73f61009261521a84d2b1dc13c5acc549424a22719c16ca67eafcbdd4254044390977366d224c98c08061d41ac7efcda11a91a8239e6c4ea24a2e71195178221659985e510776196060c2008e6fdcea346628dfd2801c15c39e4fa32747ed07d095d42dfd828aff8c0246fe16ff969db43ac0703e8814196840927c663a97d82ce417630001eb8225a3d5ef54d773430801d68413582ba3ef5531778662e18800ecc152c7f0ab2b4f7d44bc630801c1854687c9e5c153d49968401e0c060276458fefd907be1220ce006a5a553594e8c906766060660039365b913ff3c9e44258930801a18238e4cb83c5e0106400383b6163f378b1eb4245be011c0f5a251d00511c2006660f814b157d953ae08fb00646098d892b3e85d64b13716e652da7c929cbd4ab1030b738510c2bbea5252b3fc6f91f6bae315e6385b11827b52f1f3b7f3b000d0a0c315469dd176399c9599b66ed8c0f131015c0f74b4c2a04ce850b245e67b973a58619e1ba533f12ec9885b598549479f12c24e52d05176a14315a66842c768951f9dac4d854962a90baf734ad829e585a10315e42c3eda6ada276d5c1a10011a5ad0708087470bfc0486868e5318d2861a5f516df9c46f0a73e84fe91e762d8579cf65ec53ae3c499f5ce8208561a4f5a5edbc7aa98238bcd822070e2fb6c8310ab3e9edeb1055e31f3f36d217386ca42f7088c2f09f3b848e3bcac1c51625c8c1c516250885d9b3529061a7ce521a14a65425b98298c849253f61dcb1742aa9cb4a2192c40a1d9e30ae6556d76aa5147fd40953ecee70499b862ccb55a18313a64b6da9fb713d04d111063c3cd00d12746cc22827a731c2df83ce1a0f0fe42cf0227468c2149a963aeced99484c18ae3ae4ab8aa2924aacb1f6710963f5966ecd975029a325cca6e47ad2a66b47e95f09730cd36952ca497815d558434a943aaec4728667cb4551cb4fea63b44e5de77f564e051d93309879b614725ee949649230e812b2fa431821b1bb8c844977c88927c47dd01ff6a00312c611b1b3b7a542627798071d5af8cd9fb7c311c6399d45ed9aaf97bd1d8d30fb8cc821653f31c290e298bc93ba16473bad60e8588421a94b48563271f72b1d8a30c7b3fc20b612ce4247228c1d45f4e6a868a3bbef408471648a3839d96bd9e24a42c7210c3f5252929b9763fa39011a5a78785c87210c9ee22eff25154eda1d8530bf5e24ed22272f84141a5a94a183100629a3a346ec5bcad5a20047afc0c30305387a056410c69c18395cfecaa7a60bc22841b74cfef4d1d080046804c2ace2b936449dd5870410a6ce1dd15ab1c6d5f407d3c8fe68932bc70fe61479da4542fa60ec0fdda253ed7c307827a184b49c4e5edb7b30c90cdd2e916b7e62ebc174f9913b87388d3cca3c184fdcc9951362c2e50c0fe6dc503a6cab750753a40bea2145b285f8d9c1ec21ea46f588141d3b753005a9262aa2891d7430d8c955cea542e660d4d3d972b59a6e179283219e69b7bf98f99cd7389827ce5d7b4a952d7fdc0107a3f587d0e9fbeb7883d15484f82f67ca725248e87083a9b3b9c90921049316521d6d306b4891756a724e1c42071b8c23f4b9a4fecdfd0ad0b10673be7b48296adea7c4c343081d6a30da450e56b9fbc34b5a63cd16e0e19106537ebdcf16561ae72b1acc957209f510cf3f6ed6582b868b2f7038063c024320c0118c1dce577eb535ac7335d60a4d312010c008e6740bd1907d93f6322305018a70acdf9b134135d66a060420827962c65c14496241da359653172671f1858d1a19f0f050f3d3c7120438a4d1129773dcf25e40002130d97ce7b2778a1408100453c4c9aaa7957b963c35d63e706c0104536ddaa6c80b277bb25c70f1c59fa96941801f3cfa6dd573f09c6404475a00f5cb81003e58b4859121ba3dc90e6d81a38b2d6e786a77400e82003d30083d96a654fdae530a1608c003e3a57e1aa154ce65fadf81c94d52c8d949d781396c7c85b86f93accd81d192d01b42c6a4981207c648f941282182b211961b18dd2dc6842023cdc93420800dcc791d22972c754ab849011e1e384a170850037396c7fbe42b42bf9b6860b0da89faa193e9f119025120c00c8cd9a7eb525b3dbe3402c8c09456d2c5504ad5079dcd8885416b4cb58734a977e219b028686f31939fa4bbaf4862c7965ac4b4f60a2965862b4c25f94cac3a74098b7e71c38b3b2d683c400b0f8f1b284001eb0f66b4c2f82571acebc4f6c7ae3061062bcc15752429d5a37b3f5aab30e5709e52b2bce7742f0933546130ad8ff73948b7a4c244c28c5498f75dc38490ab919e438419a830887deed02927a475afc6da47b261a3041f38ba066f91805232cc3885299b8821c26e5e3efd1a6be8c3b9485d740db4a1811c5b24bfa18587070540f0118055cc3085b94d564e720a95752a2508334a61906b5a5a1f7e56749881308314062df1bf54e5745d4af72fb8680e8cc2e0b1bb4327468a284cf1f65772b04fa1e357426150e2f4e99fb662300314a63065a1174f277ebe19f88451c6434fcd44519d843c61566f730d99e3cee884a93c5aa4582a48eaf2ac31274c17c73fd207314956ca26cc9dc27c5d8eb6260c3f6e41e57abd9f0433615a7f397539ed56ce1f264ca523a83c9d439f50e94b9854c6b8664d48726fb18429a730e51bebae61d14a183e68d16e71d348caabb1f6c10517fdb11f357278e18905332861b034361e33cf547d28d38c4918c485e420fcd4b6fe481286b5fa8c74fa481845a724f14cc84bd69119903049ed097f2ab47a9a6bc6238c59fa51aebb43f423331c611e376634228dab8f90bd749fb6c61ad96206238e9e949794d1293fc48b22331661d2f0d1c82ade9e29a24b6a62673b2dcab22bcc48844124c49b0da12d9de820c224fa41c49ed8ea0ef321cc21c4eab54a13dc3f8630c4cbfec82ba33aa46c214c6ace62d5fb87ff132184494e777bc8f191a3c8660cc210d4098f587922fea28d98210853e8f5f8c17357ce1c91dbc38c4098b48ce714237eefc68285198030e77fd3d5bc325d769236ccf883e95a457c7ffc770b397e30a62761f1473c7f64990d33fa60d6dd970f337a3e98c7a45c9e442d0d33f66010aea53c6bdbde776f01175e78d1650333f4606e13af1fff5973d619c18c3c9c2b54e9cb18dfc030030fa694ee1e543813415dbc83b1b453e70e9f676a5a543b98e5834417651e4f82e4f20e33ea609891d5ad20f3437b8c0ec64fe95325516225a56c0ea69ce3277a2521621e948339bcf7a99b7822c8ea92e461461c8cfefb123cd672bfc739cc80834967ad9cbbbbc68bf4e30c33de6090ba1ecdde34bb196e30674b2929a5f4a53af56a6983c1e44d8f7eaf173d6283a9e3e547ec3416ee396b30f5e82aaf48a5238d5a0d268b1fd352750d6d350d06b127d4d5040d0d660fb338a9973f652d04cc38c30c3318923e09162b46cee69d32185b82969482d0ea53693298743cb9fa57650ce6d8ad11f546e66973c56050ad7c51e24388d96130a5759ff0b62518f0ed9359f51232e30be6f7d98a97e45dde0fa9c20c2f98438ee36d2945081eda195d309a1097c9e15752fde68249bc24b595976405af6cc130b952c5113bd24ab45d70266668c160a2257e4e938967264f624616cc9b577e73dab31f52f81133b060b6d2f37e21be2e9a0d1b37881633ae7045b2deaaad9067d5580fd7c2bf7174b1013531ccb082d9459e4ade39fe96622412985105c3d749f556b1e449785430078b71b361af12664cc160da258267b887ba902fcc90825154e5d55139a419a5ce8882e146aa8d6da90e95d70c2898f7edf4c7c64497bf673cc174419fe9a0ea7f37c6194e308c9ae751e1cc53ec74130ceb26f6d7a2a9347799607ed32df12f397ef2dc8c2598cf530e167b7a12523843090613d367128c3aea3c7f98f03f2b418229ce4d90f5249a71046368b5af390bd2427f8c60ace4d9a9ae7253f45904f38f989f50a7afa31f36127f31830886e855317b524b3afd0fc1204baa8948faa6d46f2118a4e4594f25bb73c26843051f36d2e69811049376f80f6159cbb72540306957123331e5a5c4f603c38b49d28bab3835a98fd445670e66f8c028294e6be59ce6b39e7a60d059462387d1f4d12e0f0cd73a314bed8a4e4ed948773698b103f39f8e45d62b91b4bd3a3049d9bdd0c9ddea7fcd81415d794ed73d75ea331c184e828c982af777756f6010bb11271baa849cd00606f3db53e9f35ba5e86aac7dd8486506336a60320b0f6926b95a142d0d4c6aae22da08f5fce799310383eeb0ac9c77a13b5f3364601259fd2c87285af9cc5818bc732e1fd7de6ef5790d3260610e336184901ecb40c62b4cb51a6af53f25774bb36980d440862bcce1d923495e6798c4c8b6c2f4162dc952ff64a6a2066e68218315a6decbf5679ea6626833a0058d08d4c0d10ee0f3a25180850220f878808c5518649f24990f931a6bfa0719aa307eb07c75a227e1625f63ad0aa981a36b905418dcde372ec70e16b373c3c6ef7d51010f8f1a38da013570740d09f8163734208174c3e3865742062acca2557a45c9ca2c55d758ebc286c93885d9920841a514bf7462de43c830852958b63f616b6ed9ef52987bb393474ba9d4682e831406e9177ca2ac6d895491310a43eaa0b46acd9808f9230219a23028eb683149e8b32482a130dfc5ea4f3c29aab2ffa10419a030041b4941ded7d3e4e41326eded53ffd6371bb9278c92fd846a9b14d13ea9138611caca7276b9cb71e38449e4544984d39d4d94d3bd7388b264d5adba0c4d182fe4c497efece51241cd8439f6e9a03bdba6cb24e5c9c084b92ce7afec98923c65370d322e61f034d244551239794e3901f21a5ae04186250c415b2bcb8b76391369250c7a4f9ed74bb4d0e651c298a15ea2a85c8892a449983bdeaafd841589b949c2a4567e31c5437b1991309fc895b311ae23d117820c48184b5cc9d1e6e31e43081f619c147bbb43a538c21467fc83887b712bc55690d108a3e58ab6f9113a5e486284a93a8c2ab91c3ac8b86f0a321661c86ef292ac07f3b858086428c2242c94fc7c0a41fd53321261b820395775fa3071224106228c1727e976bcec9e2dafb156ba90710893c5d0115e2d5d3ccb8d761c1f072d20c310c64e592f7a59b6c46cb990510873c81d2689d029abc70961f8339dd5889eab84103918c81884b1439cd50fe5b1c2bd9a2a9021088396edcbba957e3ccc390619813029b1772d3934d34c650908a3e8ac9dd35a589c5f760b32fe604a26f258a7dbfc60aa0f594aff6ca873530b32fa60c8dad1d2980ef3c1202c8eea76d0f649d92bc8d883e1e36513225c8a5631f221430f26257f2e6c6e555b8c0332f260cef693e38308614cecd9041978305ed6f3964b09a2fdc30419773029bbbf102c9a0aca4576300839313546e6a9520b7274f1059aae40461d4c215a58cde94ff16cd3c12444ecadea8fde1964ccc1a0bba154a7c98a8fca0153461ccc167496cfeddde229d37c830c38987b25560ad59fb3dcf806e3b9beaec7d3718351444e7a4433de93966d30d74f7a75ef9c9316b1c041061bcca2f4baa9f5f7e764ca32c858833174e4cfe78e3ce2924e95c544728f3a4a83597d3f9dbd550e6a3b1a8c9a753a9728ff0cbdcf600a71d1d76fa10bc8308339766ad3dff1fdf288cb601a3917226ad4ba332383e1e4255987ec1faedf1a6b1f3612a640468d87a8449165d2581c0a8542a130280c8360f97514c3130000000c1e144763f1589e29bbb20114000442343056343c1a261e141c180d04e3703014068403623028100883c1a04028748ea6700c8b0f2515e935d557e99e1353aeb200d9fcc6754ce80c44c8119e6eca14f2955f0f1c331dc4d506d130fd1664da9c86913a19b432400ec18bb911457805b235891c4adeb651768091eab5d77e70eb293d81c4e3c2663444d433d431c64abd4c5e2ac4d1c74d6a65fd83cc3375796e80d929b7b27a360695d2efaa2e71a4927e3b85bf4b25079595fbd2e12d5ce34315756e9604bdbcf2447447949e31e3d015327d4ce6ff8eec4b19a3a68e3a2824240fec1a0c4a29cd8fb6e60e69df702c238fdf5a221c2e4854653009cfbb492309094f03eaf9fe9a44aef6c32dd154193276cd51fd88a713bc8bbb72614d62280f0dcb61821b33646137b0ed5c93179a1cec5d49039ba3d9b0fda804b3e9f375fff67495c531f413d2479b2969aceb4e308b44c3595f73e813bb039d68c5d33d15d074468af96cdc2007853353c5e872a516d2328d89ebea6ff34492bfb54746e9263e4f46a88595c6eb656166e4b4ff48995183760f133699db9bd3f91713e84bb02dc6f0280d3e028b4cb443aae45f1c59f868e386af9883444a0c3313163316ca65789f5ea051f15275dba98b19f039901ed51a26979dcee3cc0057f7ce0115f98c7c50561c4c70dd3a131d688e4dc0c8dbf95b9318d566b8c1a7f13a1820aad3e997bddc246f0501819d6dbe2124d360abe4e6f8b9d368b0e6c9650340fa75193d3f6165c390a5645f63a4630ccf23d0e988b646e2c50832237d45d706f09fd133460c2820c85317b4b310e3f2236f200911d6195baf9b946e95aec8046f4bc1f070cb369f9d994f47d747526de2682ce100b47127ff8a3d2a827fdb6947e9232edde09dc9d118655613024789b870a8c4c4a9023cfda92f006b7e5c2e9d26fce8d3531917d86936c09666eeb5d85105f5d96a1285d0cdc6088b5a9ce6545550fc62a55a82a94c5285fea0553886d36acb8394807da585bc695904589de91399533c582c41d09282f086e43284ed66f127a2d58407d58c66b9c3921c44d3fcd24a15ae568a5ebe6f550257005784a41641645c8feea284388cb28047a9670165e2f8fb11a03a18ace39a114bd716a330bd6276af016d6933466fd716a0dcb83e56b4553be0fa08563cc701c9322b365491d6fe6e067f4ba7832e5027bb66a42fbf982ccc6768fc7dc748ef8e74372037cd9c2e33969a5a8ba4340cca6fee1aac57efee90f26fbc8d5fed521609bde34a2c38edbe02fea1995c710f46cd8926f3ee054665cdef666013642696a1346dce3d9b935fa5dd876d522b5059bc58d8f7019d0b133494c18577e1ade092c4b7e1b12250b93e882fcc097e2ae27503b3d2c0545f0c15adc5328f93e951e631230d6579f7ee5aa358ed8e6ebb9f50ef288a543c45723ff414f08891a6362b4a7c585477a951373813a589b3513eb6ddff4d1dc76fbea8e4b03563d4f4bf6943bedc84aeb862c66254a72fc70a4f997d631840619285488e43d4e4b0618555bf6ff7993cd9c8e83d4507d42df8ac79ecbe7cf2cd1c8d51ef005c319d1b591c3dcaedeee1909129f14831e8e934bd575423155c6daca0b333ac0a6288eff7190aa94d26df0fdcf706f610be82a7eb81c69d36165f0f97435d6808c0b1cb38c91ef6680f65f2e8219ef2f12c2412c80db41909203cb5da2bf76d21f0a6edf92ef1be0a0dc7415ae763989a43686280f82c90a64bafda406d829e67911fbce7e50f8c9d9e4886e2a7f0ae954326d3c32b98d18ea3780d645642a76850a5eb633d09e8062181b846d2463553631a11bde2cb0b24489d5c41f0e67fb1e1e37159e99ea2a66f93fdec382ed9b60121641223d50946ac1edcf085e577a3607d2305510bc6127b38b6ce897021a09a554ad83c3d3d47a05f281ba95037af91c7229f145b624c8e36600b5adef16bcfb3e1760774c91ec83d9675d492ff9d7f424f813ec8f343d935f6c7aa7cfc9c9ad4a26408f147452bee24bf1154bc1421e669da917700f30d08c8414dc3d346bba0a73dd70d13a03c2c17d109ed09a71b79f24fdb04b7e9f589a33452ea6200b3c60c75e108fb01d33f2326022f2babacee5cdd3a9dcd48a8142f5dbb74c2bae7f146779f26c070527dadc04e5142a12d06ac44d69c68bf20ab902b3411ca990c250ab4a8295f5cc92e01c46c6f8313e0730889f94103c04a271a1a9668810665cbd920688daa2ab0ac9089d20193eca01b8c49e910e2df46f68e6512ad5385b1363d016da0c30f6def5453d35149ea2f30c5454043b06f36702f4f07841ed2c652a2d80f84f250e051e9685d1b9bf4710af4ddd3b1d58fa546fbb26549d5cff4339a3fe2537e46cd1a727a1f3f31cace2767cf447b6a6c2b2cd19c2803d01efa9f731c22a779f5235b4e70027e715161c209e23408ee15fe61c60367185730afa1e881b4be630e3034af70f8f12a7a902977fa47676b95d68889364acb145d639177c06c402624e91f0de01b5dc7d81f6f3157d71c7eaa54ed09b7247420260af12fa8d1892c80b00edbbf50cff96ad8f070f160ba02ccb6cdc5422419fe282f4a314fc05b20ce8d96f4f17d56882b6ebf66059e8d107135521051db202c099b7307e57c67fdc9b27b44e03c49d1c0c37b7104c0a645017d4c3bbf39d81951e3fd03ba90de3ac1ec34e460461009e16a010e9b2fbf61e8843fea3b97269bd44ddcfcef2e4f50978aede1bcb4735261489dcb44ede40c69ab926d5ab441563a5cb5cd513c0f480d8247ae1b730a9ca315ebd32be660f6efd4c762259ef8d71dd7b3c4ccd7b401479be91147834f9d154b8f4bfd1783a4174d4dbe951736a5e4549c86cf4313a4b6b52a8645720a692995df1f2ddafc3fca341e4ef76ba08b57f15a397087c02db6ab1caa3c75426fd433828c9d4dff765c57a22196fac2487ea9d1ec49c876ce273a353ff85278af8ab87510bd80ccd5a2a3672c6a1cb965cc4b0ace8757a1d06370430b48829dc1d645c47c30e91d02628f193ebaaaeedfc51f1bda6474eadade3e208cee33da6295565679256c4d188b64fd6f31b0614a508f9efe35e025317eac65e6f1b12ff2ace24a92b0a39e8e280de735f5e47a8ea2a9cd582c7c9f913def21a62c0d9708ac19216f7f90ec15018c5730f95e1f3b416bff1787514842ab6e6242c89073f69b261dd381c169785b0928962393eb211141e728da5a1147b02fdc6cf000f60b8adde605862ca16e03b1bf6e64e4f14ce7584274415967a248abb91498aad5e26818ae60c8a3985822946614154bf53ec087e4a9f42de02d4853b0b5020a2650ef0c9a8866091ddb41163b0f292e0dfa48426251b06f839e40f4b681606e5e4991057489c916c23a1a10f111120ab4a0eea4af2f70dddbfec18ac75d8058ad40d59ef704ab045c8e0506e67794163844b9efd8016364da9804ac9febbadd75aff27748af82661223f915301a21dcc370238d0a602024bd1fd430247b53534b3682fc35b9613ebe0830be262ba420825ba247918cb8c481a0ee359042660b38e7d2380f61c534dd182473045b738b3bd88d0f7cee823bf926103a40ecf63ea4bd14bba392e0725d3e2de186a6ed7d2dd18c0184147882d7d74f20a07f02b5e7c63e49b7d6586fc4b740f60a502dc94fd264c5691ed44e71655069eaa4c6a162a7f9d272abc898c52f2ad1c7f8a443fa2a18d66d8e95035cab372cb177a34618be41c976fec7648352223915586f21a5d968298ae628298b34cc729542169ad6216c156184b117d152582cd571ac306c5c6660a165f72e05a864c8b45e53dd71d6e8f2ead82e65944f5b7e0a3d16f1b608bb280a4b308d129e041a9c05d1260d01661bba70b3bd1596006a0c0e61dce18377031308211085a10ce0fff7f2d175e34669d839a773b2ee70f4e5ac544f1096d2479c1c3d1e8a42363e4511da8a34528dcd5a5986636ac1f1e55b5597d2fb1c7e13d4884e80a663246dba34bad54f32c81aa4d1a664651e8ab850c73c754189b59218b021d5a99db2c9cfd4eda91acac26cab18ad5c587f90ea981b8b1105e91d4b568ba85fbeee8fa609f2542566d22726436032c6f448b381725f00d7f6da63a51e2e5bb3f2080587eb64acd05a38f7b5faa830ccf81e6d83f6050098080b0a6e49c80709e02b988b6e97c2361c40a28eb5bc1f3cc321f7b2dcfd0d10510144060a3d04a1375e0e0825c87bfc2fc3cad2be668e87590abb907db333a2fc263766775c14e4c38ac3f41d5effc1410dcf315b1eece3416c9780ee738e6d0855aeffe1097e9329fc55d3e9ca9087c6df6b80a17e541c786e827099ce4b58a149e602dc906d8922365610ddb843ae98151c14a236db415ee677135d1b7075275f7097a2c7db3723e3d758d21e5462c54bf262b17e835eb50eb854909cddb05de2a3a42e75a28776ce6f754706652b4c3cefe11a91deb97fe26dd998a738d10a1fcfa3090139df3e1792db3d3792fa1a799d5734fe19a0ed81c15a46af7498e80f9e7f4dc8631d6f358b4fb7ce6d8ef496d391fab6b460156a256ac6030b05a1b43bfa89002589276a70e0e265de40dc84a84e5c84865a088ac1bee1ec06abf228b313a4ebfbbf9dcf8943699c0804b3d9fd09db19451f95616d378139a8d9e406c494208525791223aeb81cf08efd360eae8862706d403ae2817bbfe4490fc935d1bb4936a7d0c9544246d4d18beb20606739bb92e84044a44f27a1510d425446305293c1ae2b314d6feffc1b34a3638c94be379af27d12542d4045a5dfb6c7b559947740d5a75e6c831d8220cd4cf8a7e00e3812dd86d3fffdd6d5fe91cdcc08177ebd8e7c15948781be697d412d29e519ede69afd26dbe7d7d40ab6ba565eea80e62448f634b9b4d3ec6d36086214007381ce5e45158e66f6c7617970635580749fbe6003ee96cc3aa74de57ea131aca128ed9258365d8c49e1ee9bebad8baea4ea045a1dd445eb9aa551bff1f35282303aaab55f3159c040cf6999ccc99b2c93d965f3a952315162c2efaeb5d8ba5ab5142e77a35ed59e91f440cfe965d6baa7c729cf219e87ddcea44aab19f5662da7aea85642e55cae1cac810e8ce49c94c99ccc2dc588be5b20033a670bad09ea292df6aed65a28001fb8419a0bfa913f9782bba69d9c96ee5889373a889929155af5a87cd6e6dc1f13309c0064880edea01dda712c0691a2bcdc7a8dd32fd9d35ca9da2a44f5592f67f7b44a519e663a2d9c5b17032bd5cdbeaa0d0a7d36e035512c2eb62b309c35cd4b9408d1eb36395c47f42b69baa83781988d9f9af68c9693d0a2cfb19685467f9358aec464b1a400e3e90b4d15b63f6c618fb20b0e7bfca8b3d223538cbe49551a50f524d8696eaa54bdecccda325b59721ad7040b6dbd9576c28307109f07c6a45f02ada4021f4c27c70ad3fdd457f540fcd71ed041b90b96e85629e021e26b91fb357836a29e1b315ff8a662ceaa88cbc2dae08ab4cab5781264a89cf863656dd54a781afef003aff17b00b649223c61b3fc4ed93210d4083df7f2054ad5f8916a11250776bb474afcde8070a03ac3ab4642a82fd0d8b21d44f9e76c5f7b4306a0afba43828c8f86006948b2a39793e2c5fb67cd36e357a3ffaa4b5257f13d519c84c7e16c014db804ae7b16153b2ab5159a22ee0a8e47d2fcdc0c58a6f5bf55b235a4d367064e0e4dc820982ec17c53e9e09d18cea18a9b89ed4cc921459958cc60da9cd53225ff0e63ed03076fc4a041e6dc7b4e4a14fac99986f362dd8951d8eb7b95d7a28611de36663c2ebd3653358ca005f881c3d9897f0a16e74072eacd5f118d9b2a5efdb9b7b9e891cc2303021a86e3a6c8a1e43f0838d29c226cf57ff04dec33e016d6a36252c36ea35849c8b21a9763f5cfa7921011dab0f91be0ad109e2b39683674bf07674f3dad160c776503f680490ccbce93eb4cfde05655613ba1a611f364a06e2c4a0adef6d9cb79d12ba577a44d7295a8af828c9cc08b0db413592262d83227468524b572695a32bb50bb6910c25f221d1e459e6ed04a760fa838d2590b68433940f58691bdd1f17e25022389e0ea0ca70c8f94b603dae629bccf5a3dd7fafa071d093a0b6d97fc204a4c3ff45e90b1cab00874ad7d756880c480951be64e1ebaca40f0d107a5da0f1d81d059d59379131bb2288c1dcc769827490f4395a5248b4d40e0a1738c6c7df960866c8818bf2f167307a65a474d0e4e7f121d42dae258bd8e368c5f2520a4508a530495d3ac908ef6073ff0c535069c532deb887e8605b2867889a39b28730467b1df045fe000e47e3989990ba1981973806ad4085165a4bc1593924bf2b67ee49a022238f35b57b614c78c50f3931289fbcca9cdcb914d25302c994c1975870e2564a21ce049701d4afadc798e713ade09bd7411a40a316586aa3726e33c138cac22a532ee7c0a93fc9aff14bd712bc8ac13544d8efdfef2e7843779aae61ce72de0f97e7088bb782d4c6e9896a9a7632a536222338323a231b66e690cf92f64e8bbb466abee417ee2713178169814ce3f3cab878fa7828da4eb68c204976587778f0215358ff93d86c9f1da7f5c1a562049cc6a3435ba8543f69b84b781a58a98b04a45c9bf1f81e90db6a5a88153d7df27f23b4aa50662c433b04c5b20103079344120d91c52b119c1bb22f9100ef26cc7d746f92798e276ff8e7ca09fd068f4be423fbf992c0f99d10f7766b89b22c683c64dc34cc33b35d65871eb3f821d063403ed749c9bc0d400fea5c9ac30075cf431c69a462b1a7b219f68ba782255c7e683e988dea42343b4deada812efc2515b95025b3c5dfbd1e36217cb6fd280f0ea49fc22e81368b2a4fc6950ca1ead6c41c756b5cae6fda17481f4cd02a363b2c0518ccb650065be36a855cfb91c4d72196970e151c9429e25dae3d601bcbdea7a8468b85b3b2dfcd06e1a4d8f62a5f9ba3c8de9dd1429530265b37467ac74b3bd920d6b3e86f06b758f4fdc869a213da35b2971ae65609c05d6d6084e0d06e1c838a1dfeb6e0e9981011a7c0e427f88380cc0c2cacdd5752df7ad611a0f182d975ce17712a9cc292b30aa502c2ee3732fa41b2645d9eb76b7d081b0a24508b99c398440d7745229514a28e27a06002167b822982287535039c5f900163da00abc06453a610cbc71752de78db24f47e2841492a81119999032364964a5acf9aec81ee548df6ab3843717447163c286d6a084cfcd2b9f4dc1449111b2b9368afbc09e623171271f8f9ae165710844a9f0f6990e8a43c38f90d9b11560ca380ffe0eb9b59b411e0f65e1c8c6e28f2a1e8049692e181536899aa314129127804e3cbcbb56df21fd5be2c03c036039669bb355c3162a2d55eb00a0c9ee55fdc4e397f151504888d76721fb5d70e156d8a1258c6b39e6bf19bfb5130b57122f4b3b31b9d227e542b7e08768b3ddfc906067efb8909062ae0341bb0bad6e9bba5ed97ed8236beb408a1c2934f37a12f3feb891a1600f14ce07c2e6a83553293ff1441a2ad5e526a9a1cc1bfaa2e0a0097797cc20903967660c36109c602819029fc977350b10d505799971085720cb2c3d0cbb9cd37ba15ebeed57a3444fb18a2c4a10f80bd3b80240124d00086ba8f8576700a84c17239c5732c7a5725b5a22133aa23f7a9d9de905924c9c82c19adb4ea2c5575e61bc497c11f0c04cc23a32fa9a003cecc551d9ea042384a5f201ad5cadcae108a6f41aa960b032dbbaa1a7911ac62da0d819b7e744fa4ae22652b694bcd044772a323281d90205c5d5ee210a6b82251577c6ae0d70c99148ada5170d36751954b0bca23d7de4e8d8a033919278656d6e21f25c700041b0d6296e629f5bb8405c4ff6710ee00e56c1f7a4763b50ca5f061362ceef80e1904b2c69529064cc6b7c5c548fb3b64f259dacf03b36d9ddf5429993ae44100a51d35c2596505a5c040501a0f17751d00d8588369aac0cb8094d3e8b7ae995e87a88d9a3154c393762ef11323a406759431b868e3836867b8756c5dfefc509d8b75ba9614bb62e242becc15a7e25a13b623c0906d6a7a563835424a72c5f0f24e9e428b113c6901459832a3faa68543122575a27282e598e4acb2094be296b260f68461de88f59a22f600c0d4faaef59df66ba38876544c45fbcba2a6fca748dea1c57eb3c297f76d2004cd7a6d2b1001d19559189f29df22407539e9d4a396221bde703d8a83f2aa3c7650da8986bf9018711c782343210861750e0a1ba40ff641ee85635ca4642a6950fe3542eaa1fe3fd05ebee38f56d829c4bb9774623c4aaa54368ddc6509a01ed3334701e80e6774965fd7ab1199de4f99261b602e0d6549df6895d56053b1a492eefe45a0f23c9e58b5eb4af03fa7d6d9ef477a23754125a9b0a8e48f0253de535443e94eb0d9603118d0079697ab395ca1f16c9160c73600dc4bce18130aa31073abbcc1853ebabd656e8d6b432b42cd0597b70f674ca63111b6a2ce57ce8a60fe24597b02aa58fed7bdb80f5343cdfc92a225e8b02fb39eab7c6ef4e5f3cfbbef25b67bf053f58fa5fdab7c4ef565f2c7d4ffaa6a45f91a57df278f53447bbd75979c211925976126a1b251a27ffafa7fb836955d0e6f734b63f4ee894414c595b994e62f69f5dfc09093d7a5a1b410e66c398bc6f4b47a5a07eb14f0cef5a8ecc660f3f7dbc9226d7409b5368f9eff0b0b0c6bc9ccccb0347cf5c992bb49e631458b127ef44c6eb62acd7b203d62621f2d79834a481646816d50cf5669330dbb8d911dff6730373b8ff0674dbd82b6d95485bbf93ae338754ac7d72adc3897e2c41f29bc42a124704c92725e30bc7044937127d24963712a3a2929a8442e22bc9d625924d8c4625518955ca5383447c24aa2bed158073893be9c9b8b4a6a3edb07970af3dde535c082d078f661e3eeec771f892a7c89c475d1e2d3d08f5f8eb61d543aa87411eee95c77615349bc7c523a687821e1e3decf410cee3fd75b7ab207afcec71d68fed4d21c73a7b1fcb800ced88ae215601f185c8a9718ca8e8fea2304402136852e773ef5cc6dc38154709d11ba8328f2ef69ba23cd8f38e0917f7fa4d3b17ab02d6d936067d42722c0d223844530d6951c4dbaf4996653eef3684b379659624809d510afd6d024c57b6b4c4f39aa96ab5c3f991a6838adcf05bd98c7e00db019324c72d133e925ecab8105380e606e7c17f6d8a48295206ef1a84518b7de68e2e209810874e1c2343320a40f1b4dbc21222d3592f062ed80ae8c9a5e8611c534ddf0bacc3d815371278144dc15602ca81bca77d12b599654bb48d3530dfa0894c2a0cec0a33f31ce4b295491e9a716dd2b44043f846b544cc29aa5b420353b830475b0ad4b1d921f2742b8475a9a468637eb2c9724e430dd83247386e389c7a2d01701a0b6127b160a955e938c289cf05c7b3e2973a37ce871adbbdce2e1ab2114a9165a43179437663c6b010db77abcc2786499a1254e337a76a58360c54210ac9fc503d6965dd62437cf0db39b438b5e38219f22413635d0cd2dad7ebb4f8f680eafc362daa48e534991ee59ff25e409cc2097a5bccfdbdd82d9a0af8053c796d80d2482e28b3e47db119aaf2e005942160600ade7379ecacbb61b786d23e501ce9966c9715392a9d0c443b8730c07e787bab84968c58414d7026386141914f631fdbf871078f5baf3e6d6c3d48e16f255407b8e434084640a7c4716e1215323c2666ff88b68b6bd9b11a482cec660cb8586519420036266ed50e4a46870e6a49be064bb1b2fe617a189964cc13a7b6f55350c9e47a48efd563925ba6b746bf34499f85b1ff15f89f6e9148fd39c4839b8f5635a0226184a7aa63ee8d26ee9b4522bf0612846a6fa71cf5a4e7e95cb70bb944e8f0a2083ceed422ca8bf291d12eadd76a283194730311534b83d63c31940547b61049726078751186f9f6808515936e46c375436d78272173d80a20eb96efe242572ba38394724d3b7affe1894e34c4a46804be6ae3a2ab85007f400f4d00ab092d0c802ee0f9f1936b154aa37814cfa7de1542c0e2e67328d7387b3b7615ac044b68e4871e358000f4eeb2736a2abbb01501f26812c729f5cfc034b281e89c10709c5000e29e3ac5c4e65a59f09e34a7257560d1493dc1669ed86e005e7c7c2eed258ffa9cca61f7ae1d1cdb600b5bdb86d501c78206f056b279093c4bf34f53a9f7b40f8065ac623c7389285355f30ae06b429715bbe542a81fb1db278e316c68bd5818da16cd9d2ef063ba5026008fe0acc34c156710c480da7fb0e34668e5876c504a10e8fb7c4e6f07238189ee2d273f5b785ef929d876f94422645f08290457f9b1233676e2b6d51c6525448b06c9988d009923c72398bf297d971300f41a14f2951fdb95a06c4961c8ada0df257e68371bd16c010e43fdc3789c5f671e770f36a86440c45758b44034ff1b16454adf482ba65c0f93c26af075296796c02ff744904ef533db4090cd329522b2053bc24489a4ce527f9c783c227482d9110368caf03081ed464811e98626af381b718793196e6a3439e036c48d52360bec0432f046263ca3e706345dd7c283151ac431b06a5d9bb21278077bb5be32ad756c55b166646b427c3b6a6adad3b7dd5225b3b9af5a103a7d6e99d328fa5b986427b6484f5c5b1a92390a2607ae0a540a68a1f5e8d9193a4fd969267aa04b919c53642753ffe937704d27d1237467a8bb68d66c881de86f74dab694b0cc64ca809fe4a20bb3b4433a4e6be4a3e31d41d3fcac39078512da528f71927d7dc0494c51c15a490fdb2b8eb667cf9e5898d82f57384295f5aa0d761a55f0915048f53ada6d1515c04f93a579fa1d761a47a3639708c398914f465a8e4c3061367ad1368a6cb4da48f46070460b041ff58eb43d232355da918aeb9cc26f9cab1ccee9352a83eafc84869b782abf711c145aff6ce44d10b77ec1ef51193420ced8dfc141387e2c201fda4046f30455b2ab0ddb4036c4541a4a690e27247c29e9e5bd67e90c1627d3e7302ada05801bc118252935b9d6fd729c58552b9d376586f1308bfcccef22092febbd8ed82b390135e3154ea3e7e0fae5fb6a088f70c5c0f2f1d711ed60598fb8e9f5bd388644d7b493591821bcda8165c9ca8d95185676b71ace0a438e9585b482291764a89f3a65e8d499d080b48c851b94e44a410f8d8c0407daa6485209474185cb1711ee3a1cf3ea0dfc4645478157512e0433e4256a180698ce52c6e88255648aff76ee29943c60257aed1187b9a5be03a71ad645440c5c22a8a4542ea834f2f1362820b55135788acba4ba50956084a7ef114a81f87eea84e022f79cb9e30175a4804c444969a55df25710177434ea8a4fb48337c90f0dd289c71f3d0f00214229f0e9a381ce1d38bdef8056cd6e2a67e19850308a02b5743f285e818c56861ea407b2313bf1e9cdf8ab7193622de702fa0e09ee882b84e3c2c085d42f326fc4c423f783fb2a93b223540823bdf4f3762589803485210cdc40243ca219683c6a0a372b6b32ad5fcc174375c931adb1a6d58574d697e45a66fb79181559c8b71f816a90eaad50be42f3f741fdc7057f5e9544c8b8e4d94acda85b543398d3038c13f3de1697219b3407b3519b8d266024ecbcca858d4c3d2788c22b0ddb80641b18ed807b5081df10982f55b10c4cc49ea976c3cff91c73449f665d5134702930e091782ff2f88d7e5ad6582a0d0492edc0f9c3a52f57c00fb20f08e607104f2d0b7b96e92f97211632e90998c85d0fe722d2adb6524728f97f6802c85ea002f3b884379fdf4f23f8dadf5c0582ddce2ef23de637d3bcf6fe6e7b6b495e266b758f847d9d83dd179e38705a9ab87fd8fefb850bb4038a460987e2e52746597357b121ba6ece14ad9c14dcc082aa3d8a5320ec01bca340dc06cd1269c3bbf151efff71bd48901bed4d84905f411f3baf9166d0ab7cd4fb7fd40b20f4cac7bdf161bda88f355d7706d8eb7d4ceff8b8f11a2fb87a852037dce3d5c5bb25d156d5c92020d886c6b87290b213a4308548b3ba0cf6de6190751fc72032ad26acdd500fc1a720eaa4a762a274048c70c3b8cc2c3ed7b7deeeeffd78ffca3dbeb3f8ab9ab7579653a85aac3ff87e421a62fb19b6d99adf42cf146c9967a0e52381cd40bc2d0b75b7098c37d644725581eb609e8cc5c044ec81dd044c49389bf0a85165ff8a24e593f4fff04477fc0c5bb2de8c423ea20969dfc5d95a4db48b8a18bdcb601bc2a6d66c0700d63790155d884e9b4fbad5242e16906233635d2d8d453fef428faffac90deeb00840d88de0dc270024710739a621fc6ac206054925b84a81d3e89f10961b21482f37482a0fe20d0842ef222aca9c29825469a7d5bdf6bff881e13124dc0c6e5402750450015da19672fcc76340c634d8037cccb65a58caedaf501b047c3c69b794a256b5857c0881648784ef3e1517033a6d15e33111774898956608481597398027af7cab65075a5ea87f8909b13ee98a0cf1a40c443a51fa3c0bdb119a11815c7ca9f7ef86f13a1c6fb4c8038c7961c2320aeeb4e758895cab3cddece684873ad1cba72cd9aa3a40283c117722a0d197dfc71833ba3b1bb164a52f4fc7a1266b8a840937a33eb338f33360d475859b1d0dfff8dc3f88190fc4a014cb31b55748203c6ab6fca35a1b1e64c1a3eb2217454abf630c48495fadcf049f13e3306f652bfd225de84581b01bbee778bec44af16e551a87014bf6a1037c61f558233492dd320cabd87ea73802b3237cc792d2e520fd46380fc17e089cab21a84e3aec1e561646071b01731ed38f298e59c784c6a4625ac65c1123505716eb5e22e8ce81d03a7019465d22849273208a9b5b722f77bd37353bb48349da92b91bae90a610fa435d58f7b4ada1e16909c43de3fc97e094c3de8843355c5c101c60a0767679c823b7d6b3b7bde87ac1f262c0196de7c755e705b049e05096ca9a6cdeb141029844fe645fe976a0553c32ece269c82370576322f4ab1d4d8858dcdbef59f6e2ec0370d2ba9f39b8ae1e30766c2cae199eefd86c44759c75f43a2eeafc5fa4092f909c967278f689a8384cf8b0dd3e040fe03c2598811955d1301ebf2c6985e70ed978b83e131afa13c6af2b5cc25ec6e97733292be305b9a537430c2a6ccffcee4904c813933dfa228373af89f71aa0d6d216dc6d2ffff748a2bc0c527ddf106149a52584fbf05a780b8f179782300377280716d916ac67813ac52964e22bf1f453b7595487f3fc078e24c4f35cfac6c27ad708ccdab1bf84a8969bcb8243482399106f3b0a3d280e4187136b8e65811cf974eb94ab2fcd433aac47ddcb36e61d4c0f79f2cf17269290f1f3159e2f75b1f0dee813eca4021e89848e0b3660b46439330f0f0f0f0f0f0f0f8f3121b5b54f48424a524a4aabd75247e420a524a54c2989b7483b7a3a33f129a6c9de6498f8040402c20bc70b970ba529194ac5532a28a5c7a80127ee5f214f5a8e783a3168c07a4a297878ca32d5b663164c8ed729a9f85bf27ae3396c6c60c60ccf614305336698a143166c66448d9d4468e4d7c4823fedaff9a34760c189ee1077731c9d745baf489ecac9cdb74757703a42ca15730a19947dad605f82662425ace3dbc70acecdc3d44790ef216dabe0934a4a664a4e1e3cffaae0a444492b62a954b09a76a742aca8bd6799252a785bcb1d59a994498c769c82ffa484d211377595af29f83af9a33f9b8f1252540a6ee2a65df797284953527016f4925c3f4fdb3419052f2612c54f6645c1f9c5dc94dbaf34e8e0e1e80805abab13420e25bede9b147480824d136356ebd99fe0d4fd57f637992df6da800b68514ed0e1095ebb2477ddc43bc1c41c925f98162dbe419c603d922e696b494d66cf2698e469a1e67e5737d2046fcaf467d7f6c7c8e94c70494fd9e40ea57dbfc504aba5c77b83ada714d24b30392c55292d1ef27f8a25f8ad0c169e1daa76639560547559b885790a756180c60942072598bc41529c1c3ad4e23e6346c724b8b5f8e31b31eb3eac1a6934eaa6d021094ef848c8e1679d69523f414f60c60c2f3a22c1d786082a9a6b4ec999ea80049783526d2288fe11bc8ed021c7ecd31bb2c8118cd60ccbef49d4434f7e8398024e021d8de034e4dff43da943ca0d6211e86004abc12b8bcceb9e47c72c82efec5082418722d8efec7927294b29c9b023119cea94dd4bc6122ef22e0e175d74d1ef051765800e44f01526d3c4cfd095cf6c41c721ceebcba2eb4e372ae83004fb1ad2b43f3c2479ea1bdc51082e67e57491a5ec20042ba23db5ad8e490a5dc0050e1a9e6c98391737726cc720f00b49a530e5a2a26e0c3a04c1994ab595f54d67aadf11085627e5b2720b992de21d8060628d797b55a9945448c71f38a1ffa305b788ada1593fb06fb62629546366d3fbc05fafb7794bb0ccb4f9c07e8c6cb2d4b4072eaa78aa4efa3cbd5c3d30da79a2e7f4f595369a072ebf267597206944060f5c063d12ef2f596a767760b4268d3177ec16f5abc30e33e8a8c349765042c7545a0ac90e3af03958c88a215f4ea2b21d73b0191d72603fc9d131258fef9713904003a0868e38701b2c8d5c1711b225b57ff1451b1278c1c50d0a748e66c0052420811933686400ced00107f672f2159d624cea94ae60a1e30d8caba958a752c8775d631b3adcc0d7c7e049d3db36f023838aa0a116717b3674b081754b225685a05e035b6eaf6ea2a63ffda506d663cea1be7e3f8f9b062684a42fee6890adf92fde810636e7e5a4824cb3b45981a0e30cecae8ae6bd3bbfb69c02860e337071623ecd1c3aa59c45eb858e32707f994d591695e4c46fd0485e943b420719b84b4dc143b2181c5c181f748c814d31668b90f24bed88e4b0a182d221063ef2fa8dd96ec4be48018d30b041481229e4244fe434707071050c5c98fa4d41a62b499e44838e2fb09147d4d94775f111aa91c44a0076d0e10526ad28d15841684613e902a7b5b784a4bb50a1830b8cb6eefc93906369e8d802a74bea5f67ffeef4592d30aafbb3d783e7deb4d0d09105ce72d04188125a648c3916b811faaf6a21bd4d4cf10aec5a0c1dc945a9521347d46105365db2fe0ec2bf62765805f6ddf4e7385eeb163aa8c0bf7d324b093a22f7d33105c6826e0da9e33987d0b09156061d52e0af920ceaed453fa64a0abe880257a36e528aa8a3aff324b0fb4107143ccf5fb5fa136dd0501e743c81f7495a993a7a9ac72cdde81518740263df1aa4c5b1bca63d4d60438f6bf64d4a3d05bf461adea083099c1cfba469540c9a7a61435b80bca0000ae00e1d4b6092d6e49a827e97b549097cad779654913faba808858e24702ad47b2d54590ee16f193a90c0e71044c8bdb1f65dcd11b864392d57cc15b91742860e23f0b529c4226e4811f8c937713787e7583a18860e2270c94a9d48d14e770c818d1fb1b5e4256971371a2dd00f740881fb4fc24e488aa03cfb0e7404815359a966f235d79368aed001045e34770a399ba44e3a2b56e8f80117fc3d04b52153238d469d0e3a7cc076a4944a074fdd7b658db416acf5800d21966bcc53513dc303fe92f6ca1b32d4b10326e6a6354f162fa7d420a043077c090922ea256f8624e580af983daee4b30bcf260eb8bca8a34fc449bd7f75dc805352d3fe7609ad4ad7068c52e33b4144936be91b1d35e03c09fd697f6b9dc65423cd4632d322030ec841070d18b7affeffb190aacf8213622a88adbe27adb194051bb7bf2bc62ad3696e0660c4824d69539e64ab1efd9297b0e0bdd7df630c39e60418afe043bcb451ff25e84b2379d1e45cc16669ab6822061932556d048c56f0371e36415465d18c16197080b10183158c655325a3dadd5b560b2360ac821dbd92ae2fa7a42a7acf8dee95ed2e239b0418a96054a4c9c9f2078931a660a082d5089e9d95a2ed22458b2db4d8420bf30818a7e093d2eb2d49957809cd14bc4f4e5bfae40499925a0abe45e69d2521318690cad17e72dc80410a368b7efd90745809114f41c01805ebd9eb7df1828aba9fc11005fbaf41dfeb4b67356d8d2c2c1a80110a2ec4fbced39b2b928ae2e8030c50f0ad31c7d4aaaf9553e4e200e3137caea67753be9a2fe8a400c31368cf76b24dda453db5000010303a91a7eeed0ac13c5e3f80c109f6433669e5c1e2a9bce826b86c3a98ca21f754a4cf8dbe40299a6033fe691f9591f2f51f061899e0da6fbf52abe4fbab6082d3bfa395426b525a62b904ef19724c97a24e12ffa025f810b47defc40ede2eaa042754c794bc36e9a98a53820932fe645162b973266b128cf726a96ff142352b0926ae7ebeedbcf4b596014624f85361a75b7df6714220c1a5b6f4a4b324791e458f60f3ed72cc19b9bf73c411e40fc1bd73f746b0a63ba3a6902445513a23d82a4b5dea679d37ca4570327da9a4529922d8a094f64f113dc97037115c5e6f48c132e76bf8886025e62b7dd63985db7b08ae93e98ca9534ba5983704db9382f9067d39f7ad8560ef93daf2b28d105c3013135372b389b006c187875022b778cafb7bc31004bf195ff3dd0895589a0ec0080497f306cf3c75a1f29a040b3000c1e48ea5cc2649f78ca32bc0f803fb9927e9896b69681f0330fcc06898876c17327ddabc0f9ca5b6564ca67225e52f1060f0810b9195d734e7db905335d26ca4f4018c3df0b962e6deca9962d10327a964f2daf423b7926aa4a5d4346c24d30318796062aac98a936e6cadad9176c34990bc0bd4010c3cd89ff95fb91e52793968b4e0468e25598071076e82d4d518d592aeb809fa0476605c84ceb7119279bc8fe100461dd8d2a419aa555474a7d448ab1bc0a0032b1a24a49cb2eaea8e36ca66ccc0d145172968c0161478038c39f071640ae197b264f2a01a69280032c090c3b61be32565eabb730088028c3870494d44dfa4a275f90b07f6b3a62447ff7f48ad1a09da8b968041018801c61bb8f83d312ff807bd34ddb08132100b186ee0b754a760992f681c2260b481d32f4fb596db647c370301830de5a997875f673c598db4b741e3d0c05803a7329e92372a4e022fb830247f80a1063ec4cfb94d6ee6268ba681ab89f599a496d22112c3051868e0feb285b28d24e35ab600e30c9c45aad211a692d000c30c8cfd071962d41ad174712307a2d18243a30cfc7b99672b4d3949ca910c30c8c0e6fb243379cebf51df301b03373ad2bd2e26494a4462e044040f7d15d1a46a65038c30f09541c8b6104769a81b0c7c753279426e48a9319906185f60fb5fbc62975a47fc6b24046078e11113c9fef9ffaa3287d105b6d428d51f5754d0ae6aa4599a4ee003341200830b8c48d7a98269ee18ca13dcb8a10005cc98817c035d74d127c0c08c195be03d87de9e28e1e96987a105f64cc7d041ec3e30c0c802e721079545971a4d8f1d16d81c796326216f185740e74c1db28bfd56e02a66f68a0ec96973ea0930aac06bce6221a6f206993354e0aa468b0aadf89a9d62028c297039a4d32a414bff27111a0f6048814b49640ed31b31e8e93900230a9c087a2fc4d39ca43d9f000c28f06a6a44ccc94d5d502a3304184fe02ba69096f49350e67921c070022342321d794253232d078c2630f9c72af37ba8a568aca1000613187915d4af36a95cf5daf8c2d1043096c08e96fa9873df35d26ac050029faf3fad093d31a5bbd448c3190148f068059bf52d66ef901923bf1eace06aaf764210b9c72a188f9ff4c5948c9a6378e0a10ac62a77084a4491f719d3399a0137f04805e321b2c6b0efaed31954b06dea962789a6b47c993123070e270117094fc16a8af92586a89a6448c1c0c3144cce7275f3a8ae79548f52f06ada31a4d51f7539b413f8000d16789082bffd0e3dd31e09ccf01805eb39da26ed639d5b4913f8008d2f3c44c1a68bf729df42279d6a90808b1b34be7037c1bd4728f8ecde762a4ba06072e61a75f22d9fe0f45bea88dc9954d248199e073c3cc165ab77d027833c61f94eb0773a832cab0921c939c1b8baa88852f24df0b9e2080daa214df0216c7754b724ef0c658293a63ab2a6ce23f53e98e04ab9e48b1ad44ab29c4bb02151c342ecd38b765b82c9a92a497ecaa2c6dd4a30394d7e68087aeddba504374a2d26097253fc5d27c17f8dd08ea0a5e67f4a82cfa8adf7613196dc4d24b88ffeff9699ef7e3190e0e4782c31cf1174102a8f60d7f3a71ba5c4930c298e6035d46628651db61d6c04971db7da649fe7df8e119c4a4149b3d32f82ff68317ca32711324811dc774e7921672d119c8e57e90c4ac8eab210c1a9a484d4f862a534bc1a695e3c0dcfd13772e038880bf03804aba1f7c1c79432dd202f52d080b3f430041b736f8e9c4699f6da0bc1e656cb1d25d64ab6122118f91d6f7d62e6cfb11e04eb112be9d19f20b80c49738f504b1de225106c929982b0af511b6904045f7921f7e9789327e80f8c6adb68c7eab7d1cec30fbc67045922aa059dd85d7af4e13cf8e0b1079b31060f3d9c7aa33fa5e47469c005b420c7068f3c9c071e583d3df244526d2a6f907fe1450abe01382640812db4d8a2015a64200236328064021fa021804a78dc81bf0d6e5b25a2259196871dd8fdd7f50e0f41e3df1e7560cb5377ba9c3f5552e2c276e0410746e926d55deabf23a95c0088e03107ded42c4ecc7d3284ea75f09003ab6a31d364c7a0db937160d399507949b5396c64408b2de0c05bcee94ba998ea2f21273cdec0e7ce23fc94d64d88f90624e1e1063eb5e670ef5c9a438ab581bd931f6a4c4653a173b4d8821cc2830d5c9a103fe4f4e59f7d6468f0580397b32521c57cf2070f35b0d92e53f576877c927273f048039323270d41b99fb7bf72f04003939406952f23581eef68b4c1e30cbc66cb6baa63c94b9d3703139210adf71d595a82cac0ae07e193840613912032f09d95425afd6360f2e4cd21aae7564c550c9c309df933b7835fb084810bb5b2d21002031b9a2f495745be53ff17d8531aa4b5e6eceb96e405ee5255b6d6dcd0340f011e5de0367b68470f1616e20227d2eddc37d85b6074eedc9c72b25a60ec46d5e999ba9c72cd0223ccf46de5a6e9742616f80f5a91b3d66fced75c811f11f57e5267d660b202a355edfd29248f6d972a7059416d95ec8c1a3c4205ced6f2b628d3794c810f3993f6bc9162324f57800a1e52e04b480b3d5513a4f5ed110576f3e514c735a45d4e99c0030a7c861063984930eb9026e4c2e3099c9b4e22688eceaafa3b81dba429a7984a9dab83155080210ef36802579b635df44d954ce916e1c1043ea46c9aa563e6b10446dfaaa6bf4a15aca246f050023b4282dede5df90725d982471258f7fe2816af3ddd5624703bdea7bfedf4678c68c1e3089cd064fb7d2d2286c9088c29c91a52d4eb0a1e45e0236e6886c7495a821c041e4460834c49176c73fe7beb31044ea60a91738a71250979088111312747b5adcc23084c122aa44cf22a0f20f02121c7b6cf4954f7a6465a0b6ee45063c3e307ec7dda34fe39a66e30053ee0dd83728baf21dd644b8db413a4007909bce0225be0d1035e350615834e212c49be465a5981070f98aca24b34da6ae51e3be07a5dff4ab958238d460b6ee428393c74c0bd8f10aab27257ea9f032e5db598a794e57a4133669475c10307bcc6fe2e3d6ec07e5433559bf2353da7461a0d1b393c6cc0267d6f955c9e46b68b9c056e47c3a306dc45ec51a5ac2d66b088c08306fcf7a6a74ee9e324b8d135d02c181d3529ffa859324991460e1c292841eaca400c59b0f9a2b3a59be853da353162c1c64cd66964ff38a41003169c46ba9c41ad826e88f10a2627156a375fd4158cf4aaec20820ac973e7857371a3015a6cd182193368588c56c46005e36b1152455256a95b05d7d93dfb3e6570f71055704aa64bb13685f869cc18a960c7dc3666f7a9fd9ca382dd08c94e6737113b055f6661f984c590738818c314b9aa55e52c8dd1d42ca34ed618d26dd6766aa499c0868d1a34ba485cdce1214629b8bebc3751ea79498514c4f4be979a6246c19b50eaf52b8735d2708b1a39b8e0008e2eba5080165b68a1c5165a68b1851618d0220311d0824999ab808b220a46a407b5cba6a2878c8682cf2721265332573140c1e51845e5ec4d9a945e7d88f10946342519ef3bd4b37ec4137c0ac9b736d6a89887189de064ce75fa3ce48f5613ac430c4eb07e9e3668d9654e21493818b07088b1093ed3636a11a62e52e50a1b626882d7789692a9a568b14506228003c71a62648295e456ee27caf276d4628b2e1a139caa84549a218f5ec9b900a315625c828d25d4a5b78cf55a1e4b1435a9d363414670e4701c38ba125cb692b13b6f55de2053236d8d023128c176fab84954526692a449b0976152d46411de16920497432af9313b4511033122c1a9bb2074eea0b682ed376cd0b03b400c4870d952ac8b56e3997edc0208311ec1a70f96a643e893f96b4770324cae5725a9d9444412a3114c6c537aad47a6f4d931825127db2f4af61c82ed050d37bb8bb10836e91c159328fd0e221e85188a60cc738a693fe2798960f74d88a4d01ef48b880836289d79b2e8e468216bc1a1c145dd03ee109c8a95b7c4daab9166086e4da84ea9757c73eac210a310dca53549323b48fa3d1182f114abb64f445cd42fc41804af6bde71b437444e108c972a59225e786bcc6ba4adc0861781e0be53d49ecaa2e91ebf91022fc40004bb9e556ff1b56bf207fec2bbd2c8bdb30c215088e1074e864ed0aa8c90009f10a30f5caab547d172ad97748d5c420c3e303a6811e11b74759a7a0facb85568868c9ea3c50fc4d003a3217bd6504d4b22796083f0902e3f2fe95c1762e081dfd35c53c29412ca3bf09691ded36f8e88fad8e18b22aa73fdf31a69756077e455363b9d0e5c5fd4117aae29a84cb939f0f6197244cfb9dc532907ee2a6dc516370b1762c48133f5a733f7a4706064ceafb42b421be30ddcc4cefe65b981bbe0be9e326d884fbe0d7c1c25b24ab610830d7cee0a524f6de7b57e6aa4ad81fffbecff4ce376e5500397634bae1d93c68d1b9e062e9d4efa13cfa0611349f7ca83e40c7c9410724e976fd4c5941a696660e4e94b2252ccad0c6cbcbe9c734ceb924a9aa3b9487e821b9ea39c200619585189227d6d53236d0c671e59694a2d0656638ab9c9ae114134b00431c2c089b098f64352cc3e18f88f16169479ab4d8e91408c2f302aef87d2ccb92d6e9404de8517f80aa9dee3b9f1235d606c94e609e5f5e29ae4029b73cd6d4cd828114f13630bdca9f10c95a216626881510b651d923784329d2cb0164310125c628658e0748a3997a8a0235ffd735760b29fda6ef2743926252b701f2aed2c998a355e57818da59134354becd1392a303a07d3f9da3b2429b11a6953e0c2c7ff3a6a6ecaa954234d0a9c950c49a7ccbc4446a2c0059d114385b4af13d51a696b218801052ed365ccb81e47984fe0b2b86aba31218244538e14d810410c27703a66a769319926b0a33d3f54d289099c6b6b277dea2cc325303176895e9126253022b609ed96df22799e04fe235b4e503b2652be91c0a5da65151162e63ca523f0f6499d5263954da79206621881cd74559335bc7b3f5223cdb010a3086c5ace7fb7691a3452fb8d3b33821844e04352a9e933aa246b085c4a7731e9979043525c084cfed1e29152a74d9fad915670e4c061e30c023182c06afddff5be8554c2d222030ec84004baf8e2040f68c08c19ef89860abc701578c176851840e02387b5c6d5fed1efb161e302c609317ec0a59b6c95b4e9bc9bef183ee0eabff7278d27460f38d339692d57a8a044bb80183ce04d73e59113a4694b290d2b7a88b103463d3b2fc92b0fbb910ef84c32e68831b988a63a07fc6bce5477fb49e4d662e080338f9c5493f73760e409adced33f1862d880039c08cf9b25e97bec3e158cecf15477f5a5af4605233f6ad67442648af6145c060dd994b6ce501353b01edbc264d2e9631d96825196ddad4a65fff6470a3e68d2ae4e3712832419551b05ef31d7c79052ca8f1aab91562307172b30d645a30c5170a9628c1d42893a335d8db44caa38b6033242c1574a224529710d3223a0e03ca449572363b02ffd27f810ddd5d77c927d9072514c8b0c38c0bbf8220519b8fb820c4fb0994b748a87529f773a199d6092f0fba821d489dcd5066470821beda5bdffe287fd65a12063138cfab497fd2fc752d76568824d21fd6eb5780e299a8c4cb041bbc44bb2490626f8bf20e4e4d23b694bc4041997e0fc3b8752d7cfb5ce58a212ec45d7915ae973ccdfcba0047b27c4d742f2c89804fbaa27d126e73224c17f8dbd28cfcf2163908c48305a2a5f8f4e823e2a03125cacf348224ddc2ec87804bb7efb5927e9e4b9ef0826fa9b66cbbe89a7f346706bd9e79a274670275f456d1cb9d79d5d04f717ab4aa915c16529a5cc3b79ca5ad944f049e93a11dbdc537244f05555715b63a52c113d04679f4fd4784ac92b260dc19e7a89ff1d3b3db68560624413797dc44ea247083e272539550461f69a41702129e5a9b7b1bf4e10bc650a2a684fd5039c2023105c7894689faaad363f37640082af3e15f33af687468e147c91e60f6cd75a249d5367b3f2981fb8cc1941c4d5f4411fa5566b5bf36b5c1c4f34bef01b5fe05824c8e0039f2b55ae05197b40aded84f25e53da480603197a60edc5f4b49d87a4cf3379487b9bb4ef3c92aea3810c3c305a53e4a9ac216e6db0469a17ed5d2075818c3bf096d3856429febb586d59906107f66a74529d3585a424c70b1975e03ce4f3b428f21a8932e8c0765f2a33515a3f9ad648f3c2067216b8c998039719d6d9e46a726074f342551c292a6e70780964c48153aa72678e1fd93c66ec0a32e0c09a0875a5335310163926e374c173bdafe3062e89147c9372977c226d603de22515c911e375cf062ec8f83942eef1d0a0b30626f88e760941d6e566d5c09d4649232ff4594cc934f05d2aa297ba0822f468e05cd2441749f2abd233b0e9af36f456e4aa57ccc0e7a9feab495f414e481978d33962b628f53e3224039b33e62c495a8b0ce518380d316ed5e8ee754a254186183820230cec6d8b16111fa920030c9cd20d79a695a1fd5f20c8f80217f2b95712ea933686d0f0027b1a3e3182b264e0ae0b8c12215510dae45c60359dc817af94b6c0e8a79c1bb5d4f77aa405de5cdb74446ada484159e0765fc732af57e70e6181bbfb492b5a934e10cf15d8d4ea262ae5ea50aab502174be68d21a8282ae25a054e0615d5be4f757fe7cc9821830a7ca84fc1c44598104a3a05b65b35f6a4cea14d4c2970e3253b8ddb8b484a13053642b45819dc4424cb4081dfcc1e2a8ebb2425234fb82f67ee04eead83762a4fd9bc824d6024e75869344529e5392694efb3658d29a42c81db10aa4fb608b5053294c0d6ededa72f51d1b93256909104fe5350a1a35208a9420709ac67b869485abaceeb2338d691d35ea669047ed4ffc9319d9c31e32c0e328ac0b85f36ddd490085c7f705bdfdd5279913104fee45e0e35bdb0b31b0d3284c069845c55d922230849ad749dec723287175c68e0466f607b200308ecc4aca53f758a3925f90363704b63e6dd1753b620c30736c368c8e841c9e0017bf162d555b56ffea406942063079c576b281d7453788f3366b4e0460e2f3c083274c06a66cc3984a0e1a6fa1164e4a0dc7e3175ff8e051938b0b345634e704d31fb1b6c29659b670649deaeb962c84f8b20c49b820c1bf09ab531638990242765041935e0b209194b8aa56c70c181e43366e0281cc8a001972a7808edaca79de41fb3e084243522869cee8490f990056b23729b50e1971c7cc482512958127d13359b5748830f58a0ef6a820aaa57d493b49a3ccb1e4d57b062a7720a3ab5db0a45957a48c242061964057b3a66cc1fdfa4986a6f7cc102fec286aee224355228212fbeaf0a540a75de49fb099954e03f298f28212accb415c93ae8ebd66e9080d8ad59093e4ec1a78ed0a31282d0112153707b766934c54e29188f144b7e1c99b4a73429b80dcb2958688ba697320a46e9fc60f92a9ed3591fa2e094c79f9433fb72d3130a56744e4a59e6a0d1e20414dc79a83e0fda8f4f1462b28db1fcdbdaac91863a840f4fdcd9ad734d35937a1df8e8c47d7082ed3ed11925d5fbbbffb10956c5f24788e62e2ab626d89cda749490d68f4cf031a78da619417aeeeb295070021fa021801b7c6082d3a172723b9d3ab1342e6ed820c11962fab804671da3c6eca492363dd6489b3163c68c0e68b1851612c08002dc1b90fc4af161092e5432f5ddd6a07f3c3492175cbcb1c0d3096cdc6840f2828b06ac81e2a3124c3aaf9843997f8e9bfda0046ff6edfaabd19304f524f8714dfde9dd2aa693241811c5837787de3d8f44824d31b9566ae7cfbaf003126c2ea5520ee54978883e8271cf9e2cd3bf594efa8723b832fff8fed9f4d108f6745a8d765c8b91941f8ce07227b73f09f93a7ef063119c8668ca4c89a24ead0f45b031f55b5626a5f9d6fc48041b64c829e59cb4acaf43b6f0810846e555d08fa1ea53c80fc16e4e272187e8c3106cade68e8a26f4c4d41f85e0b3a6ca9244559b90dd072158cd49f976f613fa921f8360b527dae9d54b3db9fa1004db16d4494c8baffdf98f40f0e1c9e4269deb0720186dadbd1d524c117ddb2f3efec0a80d322c5e103d513f303e29650e1d7699bcac83c1471fb8b8d7975797e927311a7ea38fe10337d69de4988a8468e11e78afa0df752ff8a107ae23951069554bfde9e0f8c8036f1f2b92f094f4c64e1b5d9032047ce081efca6b394dcfc23bfd710756cb4d6f527f69418ee6c30e5c52634adde8e8764ca903636d52cf723a912fda0f3af0312499f39afe1f7360443a2d3f21ed36c6fc871cf8afa064b2ace79dcef2110776829d483929992a09990f38302a26a1e3e8c9b13ac67cbc8151dd793ae712a279ff0f37f021ae96c689e2973c79818f36b062ff914c722af92967cb123ed8c0fe27fd1b542acb7c9f123ed6c0c9d8a984d20c491c5cac171f6ae0fa4d997e0abdcf7da6c166d4f840032f9a9521585ac82dffe30cdcc99824050fd10f33701e296f44cdf6471958eda02455068f9653f0830caca4d8c9d5c61f037e8881099af268efcd787dfb4718d89c967b9f2fb5ed8a3ec0c0e7a0524a8a9b4654ce7d7c81cfec761df32e5161faf0026feafea22eb21f5d60cc3f075315838841eb35d2f04a0d3eb890a6a45649e70d8eae912ff8d802efef9a4ce87e2c65f91a6938b8282df8d00267e95e35d384605b1678ddcb11fa29c898597917366ed0c002ab959b4b42eeed3ca181830bc2828f2b7039989652d32935d2f0c30a8cb0cbfadb552724c96ba4e1e81af751052e26f389969ade23bd393ea8c0a99c838be7f4a9c24a16828f295c7d4881539ffe63786f28f01105c6b5cefb92e9943bfe8002e7aba669924ccbf59c65c2c713780972926f50c92685c8096ca520d4468914dc6296081f4de0ececedcc474a0e8f0be183097ce50b3afd268b153f3880f0b1044e54b99907e996dbb4317c288153f25ce28d6b08258307868f24f01394298d6216eb24db850f24704974344fc1f25d2afbe3089c9d7b56a8a7f248b9113849933798e5ca471118a51db47eae8e296e0c143e88c0462e2d42771aad1ffd6bc2c7103895835d8ed61b5397324008fcf7557592a3a2dc844a193e82c0e8ed52f23d8af85b3a0c1f40606f54cec1e266d3d3e7fd80310f26477f1041552f1f70935f538af8d9470f88de1953cd552cab32b6c7f01c644a2aad91f67ee3cee40a3e78c0beb678a50ea6c55fb4032e551295830c2a4a2cb50ed8108fa2b565c9d19e02143803906f60c68c1933707861e32307bc85a45719f69124c4940b1f386063d6179d379fcc6a9d0ca4143e6ec0fa96fe98a23fb796f861035ea4a80fe22afaa8011f16aae3ba994c42947af8a0011b928520ae51fc63d299055fe7aa5e2a043bb1943b78c88211a637c87a3b8b6beaf400128b42a98d31e8178f153c60c177e8535afe1921063d7905a752b44eca21befe8ece156c0e52fbce621c25540c034660b246ea4d3ddfd6eb8bc0d9e438923de514ab9e08dc55bceb9359a6213f04467b7fc8dcf974d0bb10124a973e08bcd65f32ede974aa4060358a12aad631acfc01db5bd9da366cb3877cc0dd081935633c1573ba075c44d752625a76223c60bbdb2bfba885d276c0be08116c475d94d4ea8037e91fff4348b12d25079c1275e341e898f7c5019baafdb5d2ed4e94dc80094a8688faa7367fd006fc8e8b0879a38abed48051a35bd9399632b402d080514987fc591b29f7b3e072c71169b34f845616acd768659094c782334d4987da0e0bde4d4f92a04fc96bd32bd8db20fb3a23858b5cc1c65115720e21d3d256306e4944922521c81c6205ff12ad5acf4c4d735661b2e0aaa9fe2655f09e7f6df487a454b0112fa994dd3c882c49a86054cc1e32675db749d22998ece1a7b326b72c319982f5b8a9a28fe54bafa352302a640549dbe2dd3a22053fcaf49b0a32e42073340aced33f9b3ca5ee4b098982b3e0b14a864877a38442c149d09031e974b92642a0e0c736c5fc63a15f1ff409eed426a6679ac674234f70597db5bcfb62451a3bc185a8ee649ba29e082758f3ee64ff7b3a68bd092ee55431b5e8e4f94d4db019fdd3645e6a4f4d2638f59758ba2ca9fd10136c0e6e962aa86a3ad9253879273f830a5132a7902538b7aae41f9a45f44ab09f16646fc85322bd9634b7ae3e097ee3faebe9cffb133f9260527e3a2d6a234acc23c175d61c2dcfb4165a487015761f43c8a052c4a047f0174476915b11a3ba8e6037e6760d2286598c368293f43ee249533a9711ac9e5a456c11a96d2e82ff4a4205957e2ad75404a74ac6dd74ffa85f2682913104d1a33aa2990c22f8daa04ee792f9c6c2738833ea7bc7102891b1f772af5308c6ef53e9484944ca09c1760c4aa8d1f126c02018a55df42475775abd092008cee4673a61fe23e4a809100836bf490d299dd4baa0260020b83eef0d162d2c784e13e00f9c68eec578e9cb33dd04f00313f226dfa46356fa7a1d40803e70fdaae555793d8a960f7ca89c83c8a7ddbfee1ed8533a2664ff27c9ab1e182b8d225cbf4d4c9a07269e59b020647b87140f8c502a478a3596fdd33bb0218ae6ffdcf4aba71df87fdb10849e75607469124ae7ad9c7d3af0a92798a64f4977690e5cd0294ab6502b21c6c8811bdb507a648d3e691cf851b5a3e3a83c2584032333d3a95fe40d6c599239ed836ee054ccf27b450c53b10d8c46cfa4bb535e8e1f1bf8f4c9a37e1b9244afd7c0ad5e4e509e1af8b48dbdbb9252779706ae425c2de88b896b8d06fef365c59c381e72aacfc086dc78d994a87863b51958fd98eb4fbf5344be0c9c9b4e4fe6fd92813753e331df6fde7d770c8ce7a9241649589eec8a81c99fe65a22dd30f07e2295debed62475c1c07632f97f7fba5d93fb052e6e9eaea02c45af5c2f70be25bf53ba0ddd97ed026fa6f7d2225ab0bb2c17b8b4e69daa73251d25bb0526b59b97855467fead16b8cccc9723699294b4cd02af31fa885930192fb558e073e8eb9ca87fbafd15b8ac29079dc5ad2e7b2b30229e43b036e9fdf12af0df1dec6490ac224a546033849482f9a46c6a4a3d8d9b72ab921478d39bb3461b09ea465160db4fd53ed8a649395060b37c54f0c8392ba69fc089144aec4bc809ecba68f8abfdff649bc09d90e857f1e4df4799c0a88adfbde5934a2f4be0fc42e5de88d257224a606cd773b0d34147962481cb4f2aa2aa4dc5844860f4a5dff020fcb67447e0f45a963693a4533d3502e7172632fb7cb3e6b4084cd0542d2aaffba54d89f07b4abca0623f0436598aa2eb34a488bb10b8917ac1f4aa53043d089c85a85dc27320b0eb5b17cd6bb3b9e807ecaaa94b0cdeff29f201df22a3c9c8d9267fa807bc5e92d57f5726f38707ac8a4e9a4209ff08393be0f488a42dd557c8bf75c004616aa7195295da39e0324b1635ca2cb969098003d6c6a4e8e9ec66eb12e0066c90b4b6b6173b882c016cc056b0983ea5a8854509500376cc2f5945ca909f24000df824c382e6537b92ca59709ddfa53b424a7e1759b076a6b641c60c522bb160537373b5a5dab44ac28271ef60b28469935992af602bfa75bafd75c82d5dc19767325532877c3995ade064a41cfa3cd5534a252bd82832e56e92af828ff77f27732d784852056726fdad3e948e3f4a05639bf756648aa71ea182cde5162258c58b203a059f47f209a5644a326f53b057693de7c71cdee952b041e5181e942865272505ab19644753fb9c951c05ab9e7b629be40e188028f813e969292d9a90985070f9b369b3112aba33a0605df3080de9ad82b27c820d9ea2acbcc4ed2a9ee044e3998a1576824ba52767df585fae71823b4def29a538b6fb26386df17b4f838d95ca6882179d420a3287ce142d93894e49ddf7cd31c18810fd4bfee8a5892ec14634f330f75882d5887942eeb7128c58048fda796b2f4b09d64b42889663b77b26c1f6ada5e7ae24f5488251da368904275cafa4e45ff59c16487035bad56b928f607f37a7183db9a4be388213b2bbc472d48c498de0f2ef5a2df3525c0923389d2ac4f4b499b4bd4570a579d3798cd1f46e8ae0bf2fc6cfd024a94f04134f5d4cc92cf305218249e199cba2e6113987e0437f4fcadbcf905531047f52624816c5358d5e08c69274fdcf55999a44083e95a70f593364af67105ce6da82e0b296ce9cd492403021e8da8b360920d820f9435dfa482195e40fac961a651994702d11e2076e74aa3269e5153b47fac08a12cacf54be897d113e70faea6a748708d1f13d70da293394e4e49a263d70d9572b4d06397ea53cf0ba397a7b42dea04a78e0255be5a6e5fd7fe80e4c7c5f4d13f3b8396407fef692a759882d1eaa03ab55c2237be8c046fdfb1c648890b4670e5cfaece6e37127e7550e5c921d446853d58b6b1cb8c929489cb89722513870912708cd19a2e4ade01bf894e9bfb265ee0626a8a50b12b462d0126c03972a752911dcad830ed9c0af7f3c0f31e5f59ce11ab8ec987b29c343c8ba1a38fdb739bf47358ba932810fd020c100d2c09659ba9037d9b77fd0c0a88c1c84ec4dc163e70c6cbacba944e47676d70c4cfcfc94acc192d4b60c5cbccdf849cc92a62819d8bdec185449ddbb730c6c4a691e1273c8184d31704a2b881034ab4ac78481ddea949426ffd5b380810b1e3d8bc48e6842f805be4b822a617b810d6d3a5a43e78917ec029bd449cd1e6348ae8f0b6cc564a62fb40546a50b6943c94f0b40184016d858395c6428a1165387055eaf45555cd7d45777052697c7ee4f1983bb6f0546a89b8a14325ee8be0a5c341d4beaca2df26e546034d9d88754973aee53e0b54308b9a69b774752e03c6ccbe2e6f5e09e28f0d1ca74a6fa483a7aa0603372004fe0b3ed56d079438a41ea047e937abcba4e96f45e9ac04f2e254547caa55e6502e7d9efd746dbac93b6047e4350358f9272168b2981c9196a2f51f34a12b124dc5929a8a44c6848602c990613f61ad2373b029fafd6f92a42cc296404f63b6e124ae494497e8ac05f87b2e021a6a63d4418c0106c86090620044647b030192369d6741058fb1e151d2d6e9206022f4a74fc983b6e08fb078c48e2f53d9a6f93d6075cfe911ab3d268d5b607bc9a0c5db595079caa0afe41f6968cef809131bcdd2c7e854cea80ed986e25541c5d269303de2f8ffe18623a6d161cb039fde37a5ad0a32637e0f7b73f834a9d43fa6cc0c9f7cd394ac6b425ab01b79b7a5574a6d8e901d08011ebb4ff2131df320b269d5abf0c9a6a4177a11690210b26554822a5309142751f0bb6ededaa72c5b0711d169cdf7755f06841a8ca79057ba2927e4ac2e30a3e7de6f2fe2b916de956b063aa6962bcb4b7cab082f532939e2d5d7bcaaf82932cc1335a44ffdb8a2a028daea8b4b065e2481c0e0643c150300c86e193d305f31308001838268e4582c188a0c9c27c140005462c344e3c2c121c2222101a87832261181c08048461302818080302c140201c0c0fcb0a3d0f70ba8f5f491016d864f976f89f9f6cc6117429941c168278c0b9b07d0815e404de0c45821520e670e1e5139aceb8b6510afd64fcfb39e4ce9fbb2013ec291e18f7c24987cb2b154ec964de2daae97b54239ed0ad7351dc81fbde55ba856e92bb72ffbb4b17c79a275646910142c82f341eaa41b97b68e27ac682828f1c8ed83a29f60620933f7c98077ff8c5c23660953125fc191e84fbe020fecf5a5be93f0b2486d02df86a78cc77b6b8e483bdd94b2bd69876c18ea9c3e9b8bfba31ecae906f3034c80c7a060782f402fb1d7c662be5a09df06fa80eac0bcd3aae9906d46562c1d45d0c3f2365681b6c0181b3efa37c48116e0115b0e65eb8022fc6863fe4a0d763f8b5de50f777e8caca8096f7719c8de7cc137b751e9237f21e3cb55f4d48255409658606a28d3c6a5412880d5143821c3e4bbafbc486aec342c3dd306a78126e0943c014bfdf2fd9ffbc768945ee80761076b837d7b9864e17dc05fc42e2a17a082bb419ea09417942cfc88b78ac3db41025e402cd790bef83b7f570dd4f45ca0b35c1c20e81b9503d647a987a15f4198c099742e804a3b7063ce5b68c772b397239073d8303417a81d3ce2f0b9484a6c08f50cbb5f9557c4a2e5edb70cee08a250e1e1d374c4933347bc6402890220472ac522af9fdd060527b71f1474ca16e3143847d0023a34a28333400f989c245b4c8f72f13320909325cc1b101a820efbc43c2d5a4655adf62fdfc53d0f5b676af1c79cfd00bfe584299a141e82fa41eaa87cc1aeccf08436b9da1e03067d8273c02a7287f9a631cf4bf3f725e3cf5cfc5a076eaac93f035292c16b610ca441f2f119c84a661ab00cc102774121209354308a15dc876c2bf01dc48c5f7512f285ee09a81af08882f2eb120a570cf3f5ac4e9a94703e96d4c5ff2c32cec270550797e4294904b8893a0065426c1af2b1c83ec1fb8460349ff27e0a12b72a9f95304a5fbc2d961f4a20629415cc068e654e214fdb546c9c891cee1cca69d54c4a07118669813ce09e1de0915941c0ce00fc382eba0d3a06cb01a44014e82766a5c03693bfcd7112c0272d12f62eea86ff4ba7b6fbec6b15e309a31356a6562f1ae8badfb56acadcd8aacd5cc747f2f97081490c712fa1c5f8a39ee7d7220591a2265feb4b715eb5f0e2ab1021add3c48f29fa4b4f451ff77bb3c8e8c08701c73b9772e720a97b8b690712a86b69c3875324825807cf72b681be8888ad73b25e053ec152aa72a4f20447dd9e25f5c4f910f5f588d9d391373a491bd0f4807514725378a640fb1cd88b9917cf0329a302a1ba8b535dba013232201cf5a5b87e2974edb1eed80a2aad8f699e8aee1773c94cf5df2063acc00c022b9b900db54fb2fb96be32f8bc82d66c77e572182a8c777095db6e84879f0c1c4b91fe6443a4ad5e4722d66fce13534d8d5ca091de539a65b59985e316c2a8cae81fbcd2ab326f80100310aafd155cb3bdcb99ad4ed9a9cc445b593f849c592be9de4ad3ae91a3ce030e74ad4a5e55c39d6b5faf9597614b79322e58f91828ee657da92d9531ffd93648bbd4a812cbfe527ba142e6b4ed819d968642400a1d9e8150b031e7653e983d2209e94f8ca91f889e33ff6f624ae3989c830eeed45ef2dba9d90422194841513e6a2d06942a515724111cab1d812ff6057560d02cf3f4a90b1ec6bb134bf5bd0732520061c29e3113b1bc40f61607a7a08c1848c4aa153b27c708c8aba0d9dbc9f713e81d7ca9032d8af3396d032ac59ec61a1340280c58d192117ea89176d1b7b498168928e093ce7eba743e3ddbadb95acadfb5ed98da9af6ef7a3db279ce88a6a7e6af10cc06cdd5f2c32456c144ece54c0cc9190028d80926471a24623796b91389ed04f6c6f566d0e16ddcc8959a5fe8e509032ed539b38d83c9c803d6dd24db586f08fa8f2eafdacc79eae9d06860c42e295e0d05bae40b3e46b314daf094539bf80180c0ba573ba1835ce2964cac961a85e3c580c5feda6dbcaa94b5ef2850c357302fc11dcffec3860800fca504e407b72fd923b7cb1da25148ac503fc90d4b3b4e0464ff9ea0dcfd58dce9ee043c6f49b1ee0c1e9239c8c5a547805f3d4504601493944bcf9307907d60182d40802b9a1feb9638a14165650c081d046848e0811270465a18a423908f9115236217d0a9cde4f16ff327c68710f33dcbbd31c94af58edd4686cefffe637aefe4b6a405483c7499cc2e07035820a26473d083cee6b561c953d1a211529e8d3ebe7407ad73fd316328e48918d144de870ac3221ba37b63165834b3125ffeef762e3434340140c7273b808311b62dd835191475fcf0f3aa7c5aef663dbf6b955b3308e298e85e3acea2ec7bd46a2f949d805b6492bfc63818d05a83342614185ae81061a9a299a2851a5aa490088d80cae64deaffe05217fe3b47893f8664bb16c2835e803e8e9d1f3927aa60a5aae012d3c5751a50295019481192141219ca4ae09b6469bcb85f67ade63210000e10b4c56ad48c66aec4a5b1575b37196a23dceccd8811d41571ec328ae81eca57a7dabe1a4f635b5a10905ac8b32611af6ec7c027d574a090559633b95de2ece656234bf422f2f9621e535a6e3940b322791f5f99c4ada6ea2e1ec3e5b4e715a660a646a68faf9cdb92f5b36dd7d602bcbe6cf4390bd87626a1618c7d9751a3f40a926835c23d525905d5d5be3b9ad2c6d8d02256d755f6692f0f710c054064598e0df5d47e94192eda34b7c1603c8732d6deeed3e9efc0ffbaea61e78ecfd22a2214e25ce8150096d90ca5296849ab31629926554339c101dd6f88160be726314416170260887ee0f4834dd18684c104d2fdaaa53e351d64c034a730af7c3d3c8ba64a11d6c121aaab4919fa90994ae1d7443dc4b69dbd7daa9054592532b53c10e36207650e0630c1776d9fde6ed60a97a248e40f4a42ee555341d860e64a3d13955da00c5b9eb23d732a908474ad49d80f2b0d767f813add37042b30ce9dcf8eaac7d7f82f1100cbc123cc06206fd97e78d155decae172ae58a8f6decc3103587d4d0cdbc87722ad7f9129bb66ba0954f4649f4e224c362b9e31fa9f88538d8c39d3051d2b68475da531fc0094ebd60c52ac2e38170526fc4464d64cd387fcbd677f3ad0cf71031c179b0a5a1ca049b86bdfc1b55b8d926340e1e42c7e6d3f9c345f84ea7e75d7f9247f8e116d9099db5cb9d53ad727af78fe0347643149152c5e665b8b402a76cb87ece60107201bcccfea7e5df35d6ae7f075186a3531c667295af6ed3fad1e528325c56f5dab99cbb470d78c502bc7c43a63199b0b8c573ba3a3b6669dd25074bfd4e3e6b6241135cf710f0a496b9d9fa1f89d68504cf65da483262183aa10a9080a7f95c62ab7743b55754495ca2361141f35b27d13b898d4fe498819789574301584fff2be37d434f7dbe30ab11d8f603c4648e2a1c5e36ba86d0252a504ce2408cba2e9338bf0791b6d2c2a9af4da5d051c906d5b2f9e86cfe91abdb7ff281adf8f188dc48c15624d70f908f33d9d7e288797b41b5846f0dafa65b4bc8d81653346ebfa19f3cfec6e3c743c8306255eb6b4addecd55feb25392f55597f20db544e1dfd3260d71cb5d44563c657a365e580bf8df1f9fb3383ff4d1923012272d67427be0d275922c2da74581c7ca846600397a2e58ac1548343cb0b75d07a946ce2ca9f2cd5fcb7d3c642b1bbc4a9890a6e16093d3cc641443b7464584612baf3bc824341458ad8e02dab48a833d4b6bc32822a4c17e03ed5c4b0fc9cbb95968acadf06880ac2c6b14492faefa1769b704c89b202b27f93d3d2c675951c6f32f07d9f96718d55285f25be7973aa2adc73aa46587cd51353b1f17b3f2f5279aa86210b5a9c3b18bd4fc878020f0d2ded14f6011188453b857bff2161ba5a6c73040350dcac56f6a0611917619bd9ad03a4ab53ac8e737b327a2fcb86e38ada87f115058f64b4fcf2798fc10e690bdb636c2adcf0355b28b9b09110c19455d8aa6d7121b28d76797d2cc6ea797dab4b87c376127b7167d51d2dea67d7f288b4d10442a9a817140106ae9e3ad25041c94e40cabd467172548b8e5190b67346aaae4ab45253f2aa68cf3104d3982c2912e086d4681bc55984be9b8d2e578e69a8b2364dc8c56a038cc7d7783b5f67493afa521eaea6092d4b764854f9946100ddf67b775b42cc84245dfd1152893d2d11a3a28c42d52a72fcb1a833654a8a548d5854e725d4c09611b9f77b0356fbf4cd4aabe061134a0247667b231855219b21d394e66a3a8fc3b8d330aa1c60fab3379f1a93d3c2323c2369da8493e746af60547391ad642ca084c4cf179cadf35ea3495c2694ddb220395bfda006f6e31119c7e02d0d66cada4dade822b09ee8601c3a8d0867b09b7a3155749df05fa874d12ce557e3c9f9fb2518c31a1e86686e597e20a72b5a3931883fe62671244b3ebba5f291dbefb72fc9190ccb37016c40dcb635ceb0587a3758a6a3cd6543d5182f1982f0347fc3da6c69bde2b636f27cea1a4fe6d8cca77e0a54e961bb4a01164223862dd4181010e353d3ac76c414c3d2ba574f8a12e4d0da148bc0fbdf07f41f85b2cb699ea24c5ce5e8e9d0ec10cdcefae347e3c4f2dc7e1d36e182f5c3539a68c01c94a2d2616c626236b221ff9280f9840b299b1dbddfce77080029fccecdc0ca27826ecf4a2d2463ba44f33e3ab6069f4420ef133784a51e4c966cc107274824dd62d0caccb80b936b01dc483035a216c6c4a3c88274d5a2179f93c3c06b42c1a44249a90c60de23bc4314f3b316a0b0fa55568f668a8aecf609d501e29e9277aec0df93c809f9638c40d766a7efa69528bc9d140d52a9b453c939f6571c095113098ac0f2001c41968da1529510d14f915c25bb1a416e5de4fc818d5769f94a55746ce3b499e2199309f965543ea3a25cc87d35d8aa2e8528e878f0ab7bf9eb488947eb87551dee5515f45554a98d2edca78186a4127ff35ffe5b4650e75d940c2efa3f9da2572afac1bd884f1a87a6ca08cef4d44a065392a0264612ff45c229b3818c49a86d28f9ed3acc37400a2aa010450f186d58b103029dfc21d456be086c0f4d8aa5c8f75d79209c419c3a92dba7af37604205779f82885c043791c7ab58cfc4e5686fe831e62cc821d84a7a992d3dfd1f5528c0be028cc66a8d13b58b59a959639e428cf79b244e13b0143ca6c568e55000a3eab6220ae32552799f898ba569dafbfca371507e0799f2a873f1b8590dbfe9104d72f481b53e1264eaf7d617691560a823feb120806f0c38bd6f81d6b029e9fb0fcf1be4c6e8cb494f8ee4894ae4de48857a17a64ef09a06160b6a3cfd373f8b0564f6e364625a9f698e29c4770d7e58aca888c1d351af4496ecfb33ce83a385656ab9cfd8250d6171474f91b92a3a9f57312493ee2f895f6d2b591cb849ca9c4ddd2ea73e29dfc7a3cd7e70a9b08a601ca7f4efc11b1ee83965cfd819e3323459c45ee23bfb0914bf361928412b0956a130d3faff8a0a135eb985c1f0c2847f1a0dc1160072b506076f8c347a7381852e0083ae2989217dc6b735946d5e6bc029041e780d9d72b757e506cd4e08f5c7640c65c997ff331ca9a0585f63b76c38715f5dd4f15c82ad2e68e1e450d5ce7ac2df7d175fc65a0158dcd02dff4565d8ac24ceeaf885458782c7cdbe78407d742c099b77d4c3a3405b58223959807db53f9a3e62d9c1ecbe31fad605cfdd4778bddf4a4a8cc8eb5b4bfcd18880d8407bc56ed43367b6e37332ec8b9b293d5abd92aed8ecb341c526874dfb6d3ada44b409caa6924df96d72daa46893cfa61d9b3cec66cc096d72e42e2721e7ccc2ab7d88e336333af546f03374c357f152153c391abc353c518c94055d0fa1c072bc965cefc95e1c6471578def335f1a371d63f62217f7423ffa45e36d678c97c265598ee00701a19636308103c6bfb6bd220e5d7b71bcf61d3e83f1efc7cf9169ba9330c7a6330cfdc88404af186a05be6e90e38524a116786b4585acbd4026c64ccd092acdcad81640469df7fb0c38d690a107e1cf7a305e41fbfda779e4aa5a3cf11d3f0cf208d4a2d4676e2d123be85a9b62dfc6205ee359cc382ab5dde4ed6dc08fd39666181df734747610c207b2d71158fe8e75b64ac8de9528ef107d27ee5bdb83d88d6c328de948c0d92b9949b6c8e4b0ddd6662041da419b333240515dd66718226336a9728fb205414515bacda8e0e8888833465108b42a7da409b4faa1f4da78b611c31ea4d42fcb76736363e651c0ec1a097d47561b581ac3f580378ac39db31f9eb50cc7978e8a95c76dc702a4f83032a80f3721119e1a5c15aaac7379272073e52cc7079aa5638e3b0eb673c46c6031a58323be060cc195b388f0e45b1afc45e0df96f3ea6e2a955d97a47343e62ad193f6391301541db3ba6301b3faa16466351582d9444e695a5d178ce842a6bd6f7a92507c2f9243a3425df218082be8ec18f288384d2e073ecb93a87212bcacc7f4bd470f2ff7a4aa70597f52b4812cdb4ce79298246b2a6ac9b1114db1674b65f44012c6e204b51476eeb1879683190667d6e73a00158102033024595516da4def680cc36dda08f18113e6abf6124ca84915a7a810125d4bd0b78316ce44c95200b0f154699820411dcaf534c49b214ba6a218b991be40ab3b5e383db51972fa382deb818902d46f16ccaa034dbd26601fc97e33b5b536570db41eb00dea66509be6dbf65fddccb36194bf20b4cc371e0a080969f0fd65060bf0e64ffa3928e36ef5fd246cbce35539384836efd3d5ca23c473ebcdae16a36878f3cb06abe378975d565e0390c76bb50065d890dbd386d07a044f6354f9272812b4eca08bd9365b47b1be49de0e3b3886f16cf314641ffc15fc508f46efa923a094f3a8bc375bef412450298879b4d748677208e45769e5c8992e75a1f5642b2aad4d544bf02a72efd5d55e7ddd022f8b0909962a9b16600607cb0edfdbaa4b005b6a2468d51549d2cc3ae5764747baf8fa223eefb5e73fb886bb6b4137f7368b34a78fd16ac34eea55d574c339c0b9b48e37acb522f50dd37859a2573afffdd9664864ad496e8bdba7da1b36bfc3b626c5d212210360872760727ef30da783335fe8b1737c41017bb00ee45401ca59b5cc4eb9e92153326314b4469b3556eab840fd0c21e8ed94afc1585c2b84d973d007ac707ccfa198b0e02a4f1858a10a54a08fe0c67c9d61c280cb6a0b72649f15b6ba258e1b2ca093042dea9c5f46394541633b2ec86a17014d230bc6ecd105b753cbb8cbee3c07b59bb7c800fc0ebaa46f9dc0335ab5c13546de116806b87a2bddac8e24c609c0b6f5f9304197a0db82d6a3a4eb675212685b89d1a64972b656dc9c6b691f30713708628147ecddefc1a18aa860a8adae579c01463f9a362976d069aba9ef7580866639c7481b9ca9933445abfcdc445678839157645b6f9949b0dbedf07447f3b78b9352915dcbdf74ad882ef2c6054bf4d017e90383a1817fe7c9c5bbeb3c7a1976b22874570436d64332500b67a511d6308ccf9f1230493dfd1cd4cd03d3a6cc3ac93e14145b7e368d87ad4fa8b21436071b910215b571658a16647bc7b64e2758ac084821ed9f00122b45dcf4bac0039020299be99987d90443e68be7def628975479732951dcc4ad6b315e19519b3f7eeb329adb56f0af64168e669a8d7ffbf51d49a5e20c3a1abd676e73ea6c0ea9ac04f7cbe3efbc8007f219f69d05deb114d617d0ad815833ba716b12c16467222189bd1102ff13ffc759ead670b5b18868dbdac8a85750fde785e1a23def49794d5621f06f9826b78c9de596cacbffa02fc41a3e0797a160bcac175a710e61ef9e5fa8e3df44590bb2951fe048140cc9afc38a1db64005f3c8bf8006694eb8abaaea883a72ec2b002eb82d5d394c87e29754bd29403913b45c39169d5817400a1f924614cf8573904e5185fb575d2f4ced6d452fb7e8d5086676cb48efac17063a740666f0a2993ae9a816535792355a989eeb3265a1c62dc22de1a4a7648672edff76dac6724b005471ab3f62cb282f46b975eb4097ec61a16b15491a77c17fbd01163f5f219c1df6b953e4ea807edfb3813c1fb4ce69caaebd4693e26089392e6ba5b6ce4c8173220bdb8762ca36d53170f2f1ebc4cea5e71a82a1ae95f4ad34e81d1b01d1484fc24f4e9df436d0c73a204297ec1f716922e77e7d8769c61e94cf51c2ec5da082290d98c83304fb0060bbf7b33abc96cab0ab3117b1bf6b125671e7bf5a6bdcc532752be94c66d0c0090750151f90bdeb24ee63c26f540fe6020cdfc12fe2f9eae2af22a68d70b15ebdc4fe626a6a0de792d8a375e826f45a848181888b855b1b73b213ee52e0843550179e1c0a68c6b44b0ff3c07f309406e75fbe33d904d2c3c940c24281a6a46aced01dff8ff905128a46165688380e0c2d209a4a109b1bda1614a5fe380d4101eaa14780a43602c14358b6567ad16b58007a1a23d433124b0d888c6ca6fb8fb083f403010f3911c06a034c033b82162f797a4f99b7ea3b6a41c00053b4df0b803d0d99132ca704882dd4d20ee014e0de7e708f83e974657f0f6da0f8c8adc6455792fd900e69ecb115f9185c626d200a45851c6ee269deef68858dc0f5309ca795fd5806d6aa533e1d03383b27e1d6b300040f2be852349237d1ac4fe182cd00eb1a5c73155c35ee949e4846f8d95a89c7d556d082427b686b4fa1e5ee01da1a961ea52b7588836b10e6101145db80d327d0584393592bff00c37d0c7b0f6cd9805d1ce70bbdaaaf68c1753477dc7a175ae0a0254471ea334755e8f07104d2733614802d63b2772c7727e22a3d2e369b53f5a8eaff865a68f90844a65f474e0ffed6b9848286a93331f8b57a515b1aac94f4b1c4b75e99a7c5140efdfb2e82d2a4a08adc40b01779ccdedda1a5fe6a4727829a79a5d082742a0771ec88b82813559635d0e758ffe82c80991473f724bc61ab29665c8480e53e4d4bb24ec1da62984b4b7799a3c10a2c9bab4d2be89bd0b971d8af469aacd0673280eab61fef85d8119337f68795f02571822c5606e764a197534e24140636ee8299a2c66b4bc1f019f9aef0a91619cf8258f972182f4f0032c9dbf71834c41905879c655c06dbdc0b4f166f62b38f711c86952943947da12603096f5c51573db48947358515143519087ba37c1c07d6be56312e29414379b8c4e1882f82fc2da19e509e400167febf68daf17409795f045f1b7aa9a09a5c25f7f21e0074921f1fd0d0f7a35dcb91a0e1640aac10c004c131175f4e93fe877897378ee476b417b1d9a682edb8b454f803d681e7df350bf4bd9e082b48ad60e02a032df1586a11a4b4916e19803ac6a0e9b2f2ec24a1e0010f0b3e12d8cc7a97ac360c586bfda0b4487e1ac1f08601acffbc4f291016d0f510368a51eba8b8574ec2184e4eec92c311c486bc1188fce8027434708a46c2c3f21e23c47e5d5a49e9c20448ffe258c98258ca7895d89905580a01ab089161b1942121c3d2d154492e6500c30032b7f1f0734b2f007f97e089e18f657d045c830b8c63b159a62c0e2360a3081bf0668c8ad6004dd9ace0c15601571b14e954c64e65133f07cc87497d7548b2f2f0e484e2e7f795cd067c464686548668f8d81723b8427d8cf85d74ade7e3a1a36cc6d140f73cfba4fa88c2c7df0548762eca7ec398889d69e9440bfd278419e7bf81350c4ccf000f2e83a5e069e2839a6fae4f8faf1f1f24be217e5438456928a1835a9f5d02df7973421512e1c3a6f7712b583ebaf2c02764d7faab2971645037b17731bb2f3d408e4cbe348a730714c7942f01ea9e8187ac4b320e20c24199ed9b549900952562fbd7434579645c1788b96ee5ed4be32339a3135f52b209c90ec0fff9e1e26a908642c74a17b79081190970517153859d2029c148c457c04fe99d3dd1bac1961faf4316f2f30c221a26846cd1b0486802e63df3143f6144555c09349abe3b8521638cc37993c48555ea5f60de1f857bc366d711f17f6890ca5a22fd6ac4f332cbb5ff5ca6a9c1e77c98c06741a34499f44d8c6ae074715a0909283a28637c1f24f5e7381a1293fa8e753d36ed198e9ea70023c3cb8be0e7f7046382b1d38d61b4bbade954f907d3c420066a9cc37c5906bc702693d6f7e9d0666e00cf7d66aaa58d5097c1b63b20e192e11214076b048b7b23c765f3b379a00b0471a5a260aab879057cd630cf0acdaac222a53a9866da61c97841ea67050addf463d95efb1b46b06a21c717624864a23aa2c512c1087530c60549623a53df694afa694df24e9ad93fb6a2b5637a187d9bea30ea90cc0a245215d26bf8cce53497bd00441e1970918924562eaf68b547b0ab63d760205927ba5451acd96d80c51edfc163247c3f0d7fe939c793bcc06601dfa1ddb2274448c3a6279076df8b779753685122d2794a99a2598b14bf2c65b7a1645aaa157a8d002eb3304a59e0412cf8d3f8a08c283ffd9ed82409897e26f5c4828772659ab347e22d7e921a3237b51b16ea134909f332474f7cbb3658a9f57bd4f5e45812aa9767b7683102993db0616192740fab0809566d6fbeec361733b792e475d96b7b26bd2553d603da20f78400fcdb5965fd0505473174ef239cf39407c7fabae2f6662ac2e3ed5f07184584dd223bc8fe908a4ef10182ed367f32da45153e78851d45175cd954598b5263540bc9bc4dd2c14ff169b1d5aab148f0d0777c1c321776f0d5dea17437a111371e9e61bad0aac889c7a93f09693fb519c96b452a7e486fe9184ea4e906a35619ac5fa45ec82e07870f7090cc049ecc624f37516cd9107920635d45641b65b45b4a1ef581807774a49f31104e6971d4c71413156b29b14f39d5fac2180d2e6de38004296f63410232d95ca1c11dc9f5b546423f6e9dd8c6e4bb659b254bcc2482ad9328d1c44384237390af69c2b65413d703c9c9e78d588adc82415b55933a0d42d1dc4e4232039f2d369bb16ab214b2869ef1ff231d7f26ce8456fde1e559af494db7d3df30e3beeca0eee54c180e6c9397894c6afe93330ba25821e23aa9edb29aa939cf10eca3754da50d4c6038edb04adbc05d7638680318f5183cbed609baaf7e3c5bed654fb335ecfd76482a56b98005c10206fd665ab4407a525087a29b3d42e122a45c9e3f743ba6ceedc466a3e86305a39808ca56c04cae69a7a205ee907b72092d4fd889c33e105ed56e485e14bea958ba6f6cecc7cee673cbc84bccddc662c2bdd334752d9d5b1f0ecd19f8e3a01e69f44a27a7ea05e16ca234905d243840303498212a83f9615a984abb1309bc07eb64ca98943818b9de52ecdba481e46d4b64f61d471af7e0c7b0e054be389a8b1b7635c284000085d81684e831b977f0a18532dec98d1883d7561293bb43949408d057815d420fa1462d3b16f417dbd0d94474016c3187d406a14dd9cf2700f21ce0c4dc7d44e8ba2d66c911484b059e29392c845c795f5e319ae10bd6fe2815d6f15787f08118fd6047ce993441f85648e3e44fb802848429e33eb08096d46aaab8807f48ef8e3f79d602445b4c5816b9942fd7075b7336709e2232cda8415e9e224dd891441bf4849f9678362744983b0e2348669bda4206986721d6649afb7817dcc1f6a50f7a411a2241984425887dcc03b83ae5f7ee320f4844dbab088553f4058b2771226037ce7faf4073f0f6800ef4a8d69f73256cb707b152bba4e470d57ce9c142d9f288fecb1e41418f2ddcd5e9e5e4d3bab4a23833d5086bcb4d97e6b549e465cf603643e3a523b48e83b7ea2f3a2d1fa015f2779fe271c6e7efd34ff100048dd842571ab924add6256e142d5ff9f192349151ad215129946e8ac62263165f27cb58d0fce9771b92fac71305d48e56a627c91dd530e6dd2d8dcd4c2a8ce0ffdb1038e75d33e7cfaf85ee3fe31e21ccd5789d53c9c9c8ac0e58456e81ef08203088b04656a2f6c1772158a21602fb5ea06f5b9a85e3d033d9e616343ce928487d5fbb87aacebc0323bcac3b41faadb610aec92a3777686a4f7e9b72d358e7c388055975afdf31f59935d8f17d9019d41cd52a4da3755bcd07dee3829ad370808726e96a7689b34f59f2b93b0331bb068990770b5b7a74abcf79241788ae04de0a3b1225763ceb094535841f5e22a9f26efe845601e7f0fedf8c0fc8c4dcaba9c98a06b8369132df4254de30e5e641ba45ea43acf7c410001e92a8dd1017c4ce3bc09fc4f7ac11769b14e0a86626c7106ec6c498ea7bf3e975eb3d090bea00ea65dd7c91808b0af15221fe364a398b81bc02c4fa6c5976088717eb70603163870be2e2010359a1b18472194128c47782a80255c8b1eb3486a8122aa1a2c80a870b1d24842ed7367245a1177a0a670dc2e9195354056fce67b608ac6dcd930e007c873bd9a3b950b9cb0b634b7fd8ebf2027fbb1e8eece5b82580edc5fe1fb5be43fad4d1c4c235f6b8376124423c2b2ada5cbc80b0a23a3f571d6e9f1dc132c3a6f0c5bf03c5be074ca18c266c9ebcc9da170bbcdbeab38ae09d061c7060f1886d5c6fd292ab2ff6b0724683b17211393e8832ba08d6544a4094ddabffd05cae4206813246f5c6c20d134680dd3a46285810fde053033d8eec23708a709b17218338e15af105d5dc938c2d4c52bcdd903815630bd56ab09e79a1c0b437343d4dab09e282a56f8ca297a8fb409e3eb22c561ca4b9a30e5aa490f90811c5b2718c290d9b4f040df8a3d01e70d4d8a0581103cb713db0d670efbe41ae8dacb2408d2d1987938651a2c2e850f523a642df26a789abe881ae21d07fb17059c355cb0a945840866309e783c5b7590829ebb1363f7d38d0cee8f05c27e102e268d47c7b52f737e0a8f942846c1f1abc1a9ef4a099dc2893f1ca01a0458735765c8c3f08970e59a4a33c3f41b870d23d9d772956e00aac8276152022d503d578927b9a4d0618425d3de94bb6ff87601e68630b21ac07eef95c708b0ce07d90a80dfca2ddf3c7213140cc1568a30596d1bb093fc64f85ee6e68ea7292d435e11ee041e13407c11015a6a07386ff668ef2bc26a7af9467f672845016982dbf37d55f368487ec60853ae288ec3037bbde789fd0102a4b25d120210fee66d60370fa2c5cb6b03832094ca8b7c5db58695a0f55a0e8b80dd9cf61ad05abe543af922d094e8f9bbace9a66b18e8185a2717ba8f94cb303dced1e55cd0ce2740a822a44a71fb5625ed980872cd5af1f126f16f7dee4d591b142ecfc77ee26d8f89b7aa5eb9794dc1b98c7e3e473a04ca094ddc8f92abf9147b9dfc9939a32441ddb816c551eff16163beb5ac283990d0eaede71a5b27803c4e21a3fa87c633242ec80af7d21883296180f29751338d08a21072cf812ad73e699ec72b1f5d7e2c62d44ebd65a7540a0da1c514da27e5ac6d3cf13ff5499c161d86876f49659e7c90043b2324730db637430337939a52f5fc28fa2b870066e3b1053fcc6b80dea7b5a179233b810443514a2bf0b5eeb1f533ce1c9c3397cee5b0f5a3cde27d6db953bdf87a7c99d10d165ebe381fe6829f61f2c60890eb7956218a0d0d6922033f802638d5076bb9489a376b6aa8ac67f25c4280922dcad9819583756eb7714b40b86bb8adfc21bc4268a4f8a1cdf12708080b7b98456eea30a55a6ff8bc5097b9e586382c47db412e438de5bfad90266ee2639c3dc2bedb3a94f9a84dc0b8859014486015382105ae040fc2514ec7802fe4044df0a3760b46439330f0f0f0f0f0f0f0f6f706ba4b6d6368024a49424a9adf153f8ee9029a594648a8433d417ce4cdc86362184d1863fda080d02010bf40ac50ac9f499f2b5ab325cc1873eb19c2fda07c868051b529a92123cf3a59820b00219ac6064bd6b472a993a476d6ce001362820011b5bd880c0183256c1a43e4f3166e855c1c61acb9f53da53c19f680d31c8fc7ef9265430f92ce750ff21afa77b0a268e8a96c73bd8b6ada6e07a77f46be99c25eb2d059362481a6aea99de1e29b8ed9027e4cadd28f8205a9265d09e29658b28f88faf7fb6d9d3a67c2818d3f8666a440c146ceee8b952b0de0b1df904bf25748af61bd2a8c83dc1260b59c53f923e25f24ef0f9647a8db69fa4fecd093ed8a866ad64294a3a6d825162c9dfe228799a9334c197902c5a24277bf55226b88a215a44537f25e208136ce4d0f71f73e275e55c82495a21e85e907973722cc1badec678997542094d25d81d913975ca5ea276a504b739a9c99e96d6f58293e034b7492b957eefc59304a373d25ff59e48f06d25421242de9f881448705192529f839074df23189521287d9e2a6d8a992378492a85a44935b6ed8d606c5c536806d5604284119c34d3bd2d79a47fde8be0840a26b2e45c5322a22a824f1354aede4ba52e272611ec560a22654919e97b47049b738a0abefb15aed14370c13268bbff6032a225c3109c14d1993d665536e11582cfcb9f9d2ea7641082dd2cfa73cca064705707c155f610e99a5434b5a80c41302a7b6be39f84a4ab77b1c3e8588055faa2053bee003202c1081193fbf9aa3db72203106cfa9317539ac4913193f107ee4a4726c30f4c12eb517a55374ef4f481534ae8535dcf49883ac4088380a12351061fbe14f5141a5e3a4765ece1f275d3b496255af0764d20430f2729fa2495b6cf6a870e301cf0001c376e84c1011d1798808dcb01cc41461e4e061e4c9b335a1aef0e8c48cbaf1284251d499b63c781c0160c68c08d1ba87164f941861d72edba183a090bfabd066edcd8a1038c3176dcb8b163c78d1b3a5c0c2efc04376e7419c3860d6263d84036c6172d6807e0d0e16274c18518a70b07dcb8f1858b21c6e9e24b11400c32eac06fd22554acab15931ecf72d482430162635879e15e14d70146ea800c3a3041dae44f8d7539863e073ed6c64b6152f3c80fc981f59c444c1b458e4c37f9e313e8a28b311c1007d6439d44cf312c37e370e0369ed2759d296508a63770c2bf4f3cb6ae471cc97003b7f77f9db263ee48a78c36b0c17c63f9a70f2d1dae2081a12090c1067662b59f8c41d449f30332d6c026e9d95c443019fd35db21430d69cdc135a5e995430b87abe0ec28c5011969606c4dfb6e64730c32d0c05d4a2633a325b520e30c8c9af2717dcde61b649881cb9644fd5f1acbc0c9143f5bfecccb5d2237c820039beede4698f24befa731f039a434e919ba83369535c81003e3be9e3f8fba06adc130f07d26ec5e82fbc43791db820c30f0d69fb55792f294542c878c2ff0232baff6f208870c2f30c1d4b485f4503131c8e802bb49a8532143e9a867c220830b5cf4283107a53c684b627761811b374c05376ee028db838c2df0d9f71b3d564add6b818f29f7c40a53da3cd959e0e249cd8c604158d0278b50be279e2bb0fa95449f2e09c9feb50297525636f7f414f42a70f1541236ba1a29c5a9c0aea9905e9ffadd53700a8cf29ca2c4b558c890023f4a5f27939f4d57d089b1838b09686087efe080b9848c28705e22483b9d37275a1e0aac5b9ff6e54cda4dc99fc0e62611c72d74c6de9dc087bc632da2e926b0aa96eb25242526302a3285ab9bcee8c9b40446869434428852c93fa4045652c81bed6d97174349e02b67b4b43e993de206097cbc48e3e621e608fc85749aa2c734b333023978deb6089c58a848a9b359f24e128111a6eec992a8f5dcfd10f820737da759c960260aa1282a276da7c552818c2070f6616363397dcc07029b2b22ed86d2b92ffb03c6f622e5ec5bdd26293ee0c23f72fc1b0f41a67bc0e7f8554a1649a23b3ce04df379695bab8f15db01373af39bdde4a4a242142043074b126f2d99262707bcfb6637355183034e729217e468ac0e326ec06b72b7aab497954d9561032ea5bc9a9625dd0695caa841b6412b92d438914103aec7473b0b4e7eedc8d49bf290052bde954f23668dec522c18bffc94549f62400a1eb0e0a44790f69af335ad690b1bc40236b6b0412a60630b1b840236b6b0412660630b1b4402362e30011b71f078059354c8316b4816cb84af06011eae60bcb5caf2ae294f9e6d05a739ad24d3525975b783218616f560c517e25b5269d15d8f55f02571729694d23278a8825dcf6717d306a5673b20031db871a30b47810e1d607c9123edb871e375a800061ea9e082ce6f2a29e615edcc0e555470ff1949b54474d4a46a233c4ec1abee6866f28e872918ebd4fbf020ed8292799482bf0a0dba5ba204bdfc48c1c90e161a3125798c82cfd5a33e652d3d9aa31ea2e0f562a5fa1c52a964268f507032db574590b955bdf40005a78334117358baefec797c820d795355ec8b1e4ac9c313ec8590d247f1d31325280f101e9d605490da994da8bcb93225ede0c109369552d1941d3d356463f0d804bb492413dbfc1f3bed9a6025d9e59dd8a273867960f0c804eb6bc18205d1a14665c5e081095427a9f157c97e31868e9580c725f88c3e22c326059d7181c723e47d06cb4be5183a2af15bd8bd9f679b128c8d92b9baae3777d4bf1843076ac063127c0e91458a5bbfee3872ec18230cc22848470c0d6c2567815f053c24c1061f69226ccd4830ae39a4a037dc8404a3e2263565ccce27fcfd82c7231889c1435bef7604b71f6a6b6ff75386c9a3119c4efdaefba57a30820beeda9b97443ce0b108268888a87f168c828722d8a4f4c42da12af7c41c143c12c17d9b56e9b859a445cb0311ac046d77cfdf158eca83c721b890f2cba2ffb628bffa0d1e86e0a4d999f87757082e87c6ce924e242f21941e8460d5d3a59844dac9fb111b049ba2c6cf79d46c33d382e094509bc54ac4f2897904824f4127a154f4e7c8db01c1d7a63a9d628e1172c5a6e0f1072e0909aef9727f52e843e0e107ae3704d11b5f1bf5ad471fd8a0db69d48be9b4343df8c04b0ed3bccb252478ec81cd173be8d254e5d0c2d17d881d142430bab00b00103cf4c0468e6629b45f27ab5efce09107fe93c633bb94c9e2c8f0c0597253bfd1be6c7d2167048f3bf0716d2d2d640e4916ca2d78d881cf509d2ce5300d95d781d321655656cb972548b4e04107ce7474bd749df4e50dcd811f75dde65532d6b8eb21073eaf280bb2627c8fe92e81471cb8bc9e665f59d4697239e001073ebf9a8e1435291e6fe06356341942f28d091e6ee05bbd72fe0db24c9989a305270c331978b481cb394951cfbfb1aa325f78183bc6d871e5c10626c9ec5e4a94aa1ceabec0630d8ca757f430b563297335f03149fb8e96df64d27f0b113cd2c0f765fecffb3d61d2c62c78a081c9299a9e2382d23a4967606db227a146d89ec528163cccc0b82921e26e2c9f1cdb32b0c92f467190819139e93791e4e7381a2a24f018039b338410d67b31256d1bf01003fbaa498a5d503a3b84b6048f3070a66c930c1d47b55f0a0cc7943456d25d2bc1e30b6cdde8cde9b1cb74ee385aa0430cbd828717380f6a7dbfcad3877ebbc085d7a9884c4a7bd0e102a3694925e854b7c0f9980e52e2297f53d10a1e5ac0721e0d2ae446aae091053e6fa8648d1d1ad444565df0c08297aa479859fc0abc84a851cb46895edb0a7c90dfde2e32fea9a90adc066d7df24ab8fa54e03e43f57966bacb4e81f7493172aacc4ba18ba5722995321f055e3325896aa5172bf350e04db3f376d929a1db7f02a73a7947c545855cdf09ac5eea076dcda263f49bc004cf5144aaccd39f3e133855f12c4b0aa1f2cc5f0223dcf472c9cddf48be12b8142237affe78d6f093c0968e65bdc89b62d23d1238b9e329c935f99ef547603f256bf650933ea57e47a5c949d34a70e71d84ca9643095633b86bc8ec24f88c9a63e79f940497512d491db7d4798491e083ccd9d245de8ed53e0d4864aade848aa351748f821d670336091a8f60848c5b413c54e7c71dc195345de7666a04bbaee7495e75868a0a23f8d0ab20624417c1e7a9ba20661d73f614c1e54d0db6b9f636b49208b6d2e9688f31b6f588d84c6434134a7608c6538a489fc97208779b8b2d0c0d43f0d9b549ff540aca275508464e4a8e11062118cf214cc5d1bdafef0f824fbdfb510b7241b01e96dd3546dc1f650a04772a846c49f99eb6090204ebc14699aa49273de9fc81f3bd1391ef3c7ee07774e3d5fb875cbbe9032f31644a9bc6bccc357ce0fd5753cb93660f5cec8951ebdf54e8bb7ae0aba2a8542a836ef6681e8cdc12cfd7e28907ce92103d31787ee91eefc0c6ad1c4c5abed8818b39cc3e3de705cfd78157cf9f8489c6b4392b3af04175ca7819a4258d990397530a49454c264a47090b68c8819598c13e84150736554a4ab27a8d5b88c3814daf9cfbe1f71bb84b4ae78edcddc089decda0cbbaf74edd0636a6ca2fbe9577da64d8c075ea5222d89fda5e740dacc8f6d49b37a806de7f84083958c839669706ae2496d03946fe247434f09b4262d299fb5eac7206ae84f6cf6f1e4a249399810f22e554d9eb32b06e19926d940e19f8902c54ee8da977947a0cac78796bce9253a5b41818bb3ae175a623e78ce068810e31c2c0ae47fbcd29497eb01218b8cd67a9fd93f70556f32af57684c5909917d83ae59d25a9c9415845031a5d602ba5a6cf6a4ae988991d6870818f9c45e8df36dd10475e70b181a5b105ce6dd369519a94e8a4a3052ee5e7fdd5dc1d92a259603746caa0eea7e244110b9c5b6acfea96bf026312526aaa7117216334acc048099ef267a5142f48a30a5ca5bfdbafbdf5b594a5025fb16c83690795ad73f431ba382ac017d098c2e291228aa8a454d19002b71f4443d787a8161b1b78c016c50b34a2c0a9260bd1b41e9e46690c1b1798800d30d08002175fad339b526a39b883c613381135bff42e7a8aa71750aa8481861358df4f0bdaf55354d57194c181461318b5cde7fe1a732c956101183ac240030d2670da83c48c6e4a62eab30c3496c029ef13eaa9367b4990d15002a7dff25f3bd2e4895d0e2d1c6178914a79b145175f58804612b8d4eb4a492b8a042e289534ea0633a55febe31928a510a071043676964ef622358268530a348cc0adc44b7a22e6b459544da051044e5409cf215b9e38a944042ec35a74d774567c1110680c81afca49bf52c4abcc7aa9020d217039ba74090b324fe62a08ec290926c1454408518106109890e495e89646aaa0fe80afd69c534b8714ffb328d0f001574aa594f4ea95e9b422a0d103ae57af92a6d2ec3b960cd0e001db63a3b761c98249d61c81c60e78136197ee62e80fa937020d1d70e2ff3175ac0b3adf99432b0c2ec45893018d1c70390691d73dd3f512061762e0d811061762744103078cf63bcdba1464a040e3068c77648d314516c976db804f4b216b9b29dfb7c91368d480dfb6d23ebf4d3d7dd1a0011fa459fc6c153263169cdd9bb6dadf376139b2e0a4de8e48f2cf34cc8805ffaa9236d7f2657fdb033360c1495131534fa65598f18a728b4dcad2d9aec00c57b063dfa52b2c58cc21cb21cc68059be49769d0bfe725439615ac66b4ccd851447432550366ac824f5971efb23e6dda76862ab8a483074bd974275d71093352c1be86fa4dffb9fd928f0a46435747e750b9b5834ec16d52da1d4d57bcccd514769e1434799fc508334ac189ec7699b71bc2724a0ade54667c932034e576678c82db6891fed385cc1005a73972758a9332a599a8302314dcc8bc4d2a5eefa5e08282179dd926a9ef6b62ceccf80497530eb641095d5a3ff7049784befc38d2e4a77d3ac15f5bf747b335c78e0381d3199ce0b46565fe379dbced83a3ca143163137c648dfc9eb7ffda6a08d8d8c2c603b6b0c136b6b0d1802d34c1675226f72f7dbe3023135cda10845ee650113bba0516666082b56c11746307675c820b41648af9f653841cb28019966062daaeafa0aeda2cb4b1c5186654824f7192501339c434da86125ccaf190439b9981044617ae6312dc067da6a794d6955f39b4ba0b303e083324c196de0d495e3a1b21ea48b0935da2e64c419060b2281d31974ee2a6848f6025fe577a9852e121770413728aa5f8e9d35a4b663482d31bd916538f8e3083117c74cdd74e593daa25bdf02202691b8043cc58045bd1ef2aa9529e79438ae03557f2aec816edb42711fc5a0ed9d6e2410463216ed01f2166d6c839041f84c4cc546117ed5a43703e7a3a53e45821b8d0e3993cab4fd54d08ae8450bde412f39f84e81003479587d1820d2462c62098a4b1d2d5f34316e90b82abd49bd9ed8329b33b10dcdf6e0ebab29724150182fd78edede611f278f40f8c69ab3f75b671d32a40c1e62366f881f5ebeb11d2ea2c5abe0ffc55c7cafece5515743eb0669182f0f4901df2b3072ee5a818214e1296ffd3039b4c3f72929a5ef3a57268a9000538fe781738ae3a2001731580e185eb08402066e481d39a1154d2a022a6d5f1c05d06559363d21a9edf81ffdb20313ceae474db0e7c2cf1d7b2cb1dbda375e03705b5187445f5e9920e6cbabe9873fbd69412e7c0279945e65dcf4cc927a6fd8b15580000aa98210776426e491294478ec98f0327b2e385507582039bd386beab3db7d1ef1b1855c942afc8f7b6f204ed08c60c37f0b59752c5bcb95deb6f0393763d5f48b55945c6b0819359b2fea8fd2079b26b60b744e8babaae8d9b570372848c41e8e86f1a1899befdf2539e986488063ef6e556aefc9693b2cfc08714da64c87631490d320397829222476b4f2caa6560944ad31084480c79f46460cdabb35e8292a5427e0c6cfb65a618835c0c8c25193a657dc8b1b31e0636a7dad0621a4212afc1c09eeddda8d2a72ff079eaa3a36e4a2add78814d7709a61642aebaa60bbc78784efda6e102a37394741fbf32627e0b6c0c4942c98c76fad1d50223536df69f8e27c966814fea937ecd251618cd88a9be976f17b91c5a27f8828b1d3ac648ae03479da0991414665c81314f2999e5106b7df3de0596cfb002a736a7ca88a12be860e238c1175ca0209d40877b5186821955e0728e223d847ecf2552ba382ec60e1c28e8620c946563030f6080316f30beb89f41056e83dc8865a332ef1de98b8303477f7170b0808baff2850e0bfcf109883106056edcd0e128d071bc281670f10503c0831953e04678091169d3bfa2648614b8b4416dc40b966d6b93436bfbc60d0e9828b0af395993ccd2983a0a057e948aa62a3fbf3c98f1044e099154b9b27437955608339cc0bbea086d79a46e507130a3095c08491e6b27fead884ce0a3ed77e7cededb9212011da7033798b1042645ae98aa4c6707515202e79f747d103a1dcc48023b69b494bedc9954f410099c52724379d01dcaab37338ec086c474ee1743974660527a8a418847af084c5caffe4a3146df9815e30b2e3870e346210263fd357a3b9dffc5b0cc60c61038916b4cc4d19f35e9940b6608818b7d2e4a853ecf82c0a6aafa87851ac78e436ac7026a3003086c28c949691fd359321983193fe03e65f41cfc7447440f0b66f880519372fabc37cd49e66c1166f4804fca247aba8a179ec61d3ce0c7bba36fe48ad88e2f8e0e318a0161c60e184f6a21aaae9f04e1660e66984eaa246da9949e03be72c774e1a9ce269970c097dd56ff58325def8a0d66dc80112965b1a0aeed554b1b705a7931e36a8ec9d3ad01e76a75f913626d0ce50c1ab09ade5a33a485560b0319b3b0c3b36f5398c9dac5f8e2a4d3012bb2d08245b5bb78569b2423167cde18740e1a3b5870a79dbf6486e0173b5d84e185eb0b64bc828fb12f0184e025c5531a565223bac6c60626604307c1ba9f106db59932725210e64caa83d0fb2924ff77081f81e053df5396a067396777820f40f0f9bde6e33105b533b1e1e30f9c773495f75250093efcc0c7902fa5595bd9c79429193efac0a7d7575aabe8aea0c307c6fddc4a3d85e41e58d3b4906741add6d71f7ae0cc3a06f724624a4247ff9107c6266ba747dcc9a22d1f78604c44fecf154d738595430b8cff820ba2838f3b70aaeee65e5ffa473d36b610400e3eecf0f9a638d16dc4b31c5a2b383a70b8bfd58193c147a452f1e4093dd1814d2e6abb746ce7c0244d49f7a27b7268e506bc0b14e8700a9c073ee4c0a8512f21670b922cf42ffc04a6031f71e084ce6bff4da1b36f0a072e2328ab0a96477aec38f0f1066efbdbdb424e11512c6ee0bddb46787814d16fdcb831838f36f0e6c9d2fac95117526e470e1d384e7050290a6480021420a6c30b2f8a083ed8c0e68a14a93dfff4d28f3570b5d9be59faa5e5fb871ab8d6f02c916b64d221fa9106bef7bf9392b42f42d51f6860474566919474d37bf6e30cbc89a6cc6a29a6f4261f666063652d4d32bd9652df4719d8a4845f977a503a499e434b4df041065efbcc1c03dfab66427e4e36494d7268a1e08ba303c78718d84b217ed9b985d8df8ae1230c6c6b2e4fc1c3b4cfd361f80003b7a75f728ed61633828f2f90f369ce21626e8ba60221c0d11f5ee02bac56c453e66f497268e1c8808d2dc84717b8d2bd110b1d65ee1d2e702a9ab698d47e47af6c0c1f5be0a2a5b8a9152adfb82106185decd80f2df07ea3465e8be6230b6ca51c44b4ba5ae4a4fdc0022337d3b78eaedaef908f2bf0315f658ba57b52d2b815f809b2cb3dfbf85105c63ce43abbbdd2967e50810b5a2c988f58f89e3ea6c075468f9e3a434a7c488193626a9d7a2df2c75013cf131f51f880427e31eea952761727c761e0e309fcf9dba64ebaf7e39999171f4e602d87aadcdf4a11d9a2253e9ac0240b21656b089120a41f4ce04784452dd31c423c1502bb858f3bc894d2561c9d600ce48de304607461f0001f4ae0aea35958974aba52b4c24712dc16d3bb112a6e60023992188701376e4ce103094cd011a39a7dae12253f026b2e4994c80db5592123f09573cab896828e6b8ac0a9acf02836e61584ba880f22f06d2a78d6d05be1ba6b213e86c08798be1f2a3c4d16c78381c330c013172ad0e11a2895237d7174a0cc0d7c08c13d7d6abef7dba1a4021d636c91868f20703ab3b957a94060af445bd03b293d7d82838f1f305a216d52952e59d5ee0336a88a646eb71d64090350838f1ef0f93de7dcc9d6d5d7c4032604f53cff705bf1b1032e8390a20e387d4164c93622fb8765630b1b5bd8e8557ce4809718ed3bb73c53c50f1c70c2f4a4511d947e52495ff8b8019354445f93b89fab83884de0c306ac4d7a2d21847077cd7ed480fd125943ca8bf9e18306dce8186a84ccd8c13212851ab3e0a2272931c82c416551d240b1430d59702986d6abfcf70c41e9c51874a8110b4e459219a9d75cf72758a8010b6e75344c52a6e41eabc62b38e1f527b45e7ccb9e0b430d5770414da9c896bf2b06b7157c6f1659fa9e55f28face0e257084144ea5bf09c55b03569432c846de88b2ab8eca0294216eba81b4a051b64c648769a6dfc34d77109811aa8e0f5b44e8ac1cff2f9478c8370eca9710a7645c6cd8ba233342e7c8c1494aa610a3e7752dee57c8b399dc610354ac1e6502a8927350bcac73cd42005df159a6388aea87aba35d41805efaeea2198f47cf92d68a8210a26ed56a5e5e46d691dd60805e3aaa6f9d53e3540c166f178d27cdcdda2c62798bce973507ad74ba9c7136c9e7cd283dcd4e804e71233aa44bfd0a12ca8c109fe6d3c27fdfb20121cc46a6c828de6f76d3aed4454870b1d61580d4db07dffb9419b094e78d69ea9742931b939b42a063530c17a301df3c70fea4daf4bb021d8764848a633420d4b70aaae9e63142537422cb750a312bca8f98ba81af364419460ac430ea62fae5aa831092ea4cb9433955fccadd790047b4ae8f04832640bc2ab1109c673ed8b9ca06cd4cf1c5acb831a90e0afbb228f0e41dd9258e311bcd9b8aa988b0993780d47f0d94386beccd22c4ad70836dc4f07651d32a10623b8fc20ef42d59563c721e6801a8be03ae7c5494a868fba48166a2882cdcf5a9b58969e16fc070347f72916811a89602c2421d2d4acaf236e705003115cd22023c70c22631138e3a2c621f8ce7b4994d68a212b65085e23778f2cddd933a61405d42884f9cd27082183493381d15b83108cdc284ae4f4bb210779d526a0c62018c929df7e754a923e6b420d41f029c2bef2b90969a5d608049b3428a549281b108c5ac664b5ead6f803dfa731dbe990fbc1ec5e55bb27cb1a7de0b49bee7ade4e1042abc10746b48894d56a4165f76aec81b37613ab7f6b7d8d1c126ae881ad4a6f13cfa6b684d40535f2c0a778a523a2f7d608ef0635f0c0ad69932631ff8d3af91dd8eecc3156d96d07264b0eddcfd014a1461dd8607282bc92acf59dcba1656450830e7cd6c5a45d42e4dc9e9f0397eb94ac499e9d9bcb814b9b344aee7890691407b6ec4dd7f78dfa2c7138b051d34949195266c4dfc095e63d91e2686d44ddc06778528d1ce936f8b731d69a8f121bd86a1d393a5f7bbd92d6c049c8912bc4a44d7c4b6ae0e32569a93508a1cb4a6960359d8bf6efe7cb104203b7eb163347d252223f67602c47d2bfdb1c3330e66e5b1dd275828897812b2522932599f44b78c8c0776513ca3f6dfc0d9931b0daf9b2978f0eb14e2306565f5d6f57fc523313064e2591d7bf3ed7791c0c9ccabbe165ba52b4e80b4cfc1b61315a1ce99ff50297d466536eb92ef0a7dff6c13ec7acd4728193d183f9a515a13f64b7c086eda5c62879d2a6b5c0698aa2524fa259e0b76b6d62c8799983140b6c348f9f4765afc07af6fc31c7d3a52cb4029fd3f44893a0a24d50abc004212ca7ec954ac94da9c0bec88d39a81016c934054e66bc1249e74b152229f0e51a4183c8a54382320aac9b8514445fb9a832a1c06da860aa2c9d89d69fc09932adaba43b81df51ba62cce1e9d3a8097c85901acd6702a3a642be3caafde359021b2fc6603906d9b7a612f811b58ff9fa25940476336af85eccff202430a24c9608d9edb45a47606d2f7e0eeaa1e349d008dca60da57ff222b0317f478e9913811f573f9554fa29350e813555710f293c21307a27679f9c267b8c5d1058d5ca9072b4030267ef218b12964564d00fd898e29d2afb33a7d0075c6ecf65b2ca2fa3567ac0e9602a7fe2a4f080c9a93b9a49ba3c95db0ef818546dd7064df144a603c6bec2444595d4ebb11cb095cb4a72f6ce66711c7041cf7c736faddda56bdc805327b2a434211bf09fa7314f87906fda1ab0935b47ecd574f4b4060d38f513aa2f79c5b59c053b6a21efddc9a8db952c180f12e26de6c7b87e2c1811d2858a9be9939081052f31497c2f9d4235f90a36bbb3baafe94a52bd2bd8a0932e765d48a14c6b059393ca9a83b5ac60fd4cbd0a3e4b08376d49a7cca2a30a4ec5dc935372489b924d055b7d49988e39890a36861092734eedac693c051ba92208d19ef89f33145c0b6898820fd26209095ae3dbc74bc1fee668427207d34c2229f8d2f9d1cc64879c9a8d8253dd88792354be4314fc6810c9724d3779c943c18b44fd4e32dea0e0a2c5db20ba235d2bfd092e7708393c8614c26ae409763be4ce58163a69e67482ab144bef7258999887138c6a93d9e4ae4896acd9049b2fa6ee3e32a5c78c26f85839ebb3c61e69419960a4efe51482f4d2d7c18449249172df622ec1c9143cb3a6a5aaac5a821149a925510a82e07d726b5ef2afa0f94070266408f393f963ed80e02f89a0a1f4d286eefc819164eba15ba134c8f88109f69e3a338d7eae7de0542da7de562b9129c6074eb4a63d95bb228910db03233fc7de4fdaf4938e1eb84c5a73c84fefa0993cb02ad613634af1c069c72da59eb9acbf3bb0f97c82767fc60eec06491b5ca3d8491201831675e03a8a75e79c2157254d07c63206a5936c9115f4670e8ca7ca206388460eecd686cc263c64d17be3c0dfa8e6e63af9164385031b24e80f2a47c9667dbe81b549b9574fd44c65ee88e106f3fb6fe7f70b2e8e18ae23dbc06ae44c3ea2d3a7feb46003934efb95fefabf3f79166bb1063e8b07f3ed77b38fab811321e58a1213d1917e1a98e42243772cb9a7bfa381b7092149db889a75e93370417bd0d4694f3b7333b041a8bc1a2f8bd44b3965e064875b2acd8999364306fe4ec99222bdbbbcdb31f0b931ad7c6442a08518388f563fc294302d790d037b22af629b0c4174a7e4d04a2dc0905a7c818d18a225a8e4926397fa85165ec01468d1852b560c92cb2aa5985482a50517d2a5ca936184716e145a6c814dba6b9fbe628f086e0e2d1c8866630313b0b1636c60021cb05068a185d3220ba605160a2981165760b466cfdaeaea6b8bb50019066861054ed6d85dee5e5125ea2ab0de952e89f85a323df4002da8c0569508caebf2efd42b052da6c0ebfb69a5dfd96b74a5c008b541837e8f16b4a951e0b3e429b5dd5947d4f5042da0c0572af51aba792d9ec009a54330a1326f94667368556d2079181ab891650c5a3881b1caeda7164f4de49bc07a0c399e3909372162029bdd2445123a889ae812b8512926124f25707d2bb12cc34f021b39078bb1d4048fda2381efcf9e11d7fa2370595a7a1f9407f5593702ffaf49e974bf6b99ee2270359aca6dbcb75a6b22f0515f84a5ec8b7eff10f8d29f6ba38a84c0c6b21d592f9a93dc04812b619bd12a757e3281c09d4c3a7b24d30f98a0397ff04a412b7dc9077c8e7977cf54520fb8f748f5fd67a1829e079c1e57b318f1be436807fc4911ef5c121d305a2cde955273c06e0a1952c896d702075cf95edc4b934ce710a4c50df8ab7c93b694bc95dcd1c2065cfef71ffd8a17f276b4a80193269824cd7ac9bb375ad0800bc1268594de654a6d66c107ab7849c8989105dfd1ba946c9360e9df587097b935686adefebdb0604f8b8b77d03b4f7b5fc1267da3b39ff0cb5b5a57b01a74db238af58ad0b682cda3fa94d0e21f27baac60b3630e65c164ac28d255b0e1a643f2dc54f1185505576ba7b3aa8d7e8d9a0a36e29dae1ed724ed525470273db55fe490ad969e82b118628c94276a0a2ead56cfbb735ff452701e528a112dc7cbf9430a2e4dd4d39eb37b8898a3e02a2fe535756ab52b290a2ea58f299d122ae2d6a1e0ae4774c49c82f60c0205234a63f013fc089946a8969e94a3e8095682870ca242ec049b3f2775a2e3a7d61c7282cb7173b668fa4e63ea36c1778908955384741e2f9a50d2c84efe37964cf06b9d930c15b1eaf498e0db43ec4b37e61fb376093e76c8912442fccaad5982d1c8ba5582df929a9ac3cc7d45a3042742c42cd974c658a29a04a34aa62043ed2da8b52451b220e3a75e5224b8d6984bcb74a9535a48f059e47be8603e828f29b2950cd13cfae8087e35457d75e27b758de0933c53afdd63ed298c60a4879c91b2bc736364116cac521a74288b7944882238cf9932af3289cade26825395af6a3bc9a415728a08ce377656804330c9e42695f431c5c43704972ea69cbadb7527e71482136b112253660eb23d842863b0b89a9b6206c146755d13a1a729a95410fce994d74d9d8e869d81e08465aee6d1699f441010ac59778cf92b850afdfec07936d7bffb2a15acf30393d44573d3362de84b1f3899f4f5f8ed5e755af8c0b5bad5e40bd97e54ca1e38bfd431b5edb607ade881310bd3e6eb77af21250f7cda969cf8e9747a53e181abde9cce844a4d975377e06ceb742b857765b4ecc09a4850d1939cd4b2aa0337d1dd4a3bdd4a448a0e6cb699aefd909a03a327eb5637269996037feda6e63147f41ac5817135dfcd6295f47be0c009fd953d6955eccbbe814f4a081f0b4ae77817379823c970cbd136f01d5b37828a101014800dbc29fd418479148976af81b111af0a3ae389f4d4c08a0c7da79a9a543594063ef44ee6cd29b134b268e0f55465ce9ef9b7ef33b03af2ba479decae1833b0d53157363dd2b72b65e02b68d357593793c4c8c07846091e54ea1bbf740c5c9fea335da23fec1403a7424ffe5c4a448b2ac3c046cd1959ccfe4566c0c068d0567b4104bfc07586e0f182bcc02599428a88f9eb02bf751593d2f47181b3a4fbb2ea2d85e5650b5c65fd20d3a4ef85a4a205bee295d41331bb4c2959e083e5f62fb10d8b55c102232c8ba5ce26bb0227b3d4fdd52651619a15384d1fcbdcb2d9e8d1aac08d4833952fc92a591915d8da167df7a4a64c3d054e7f571231674b0afcb6bd8898c98927ad28f0f9233306f118a3490b0a9c485c09b9d3e94bb39ec0f5c79c325dccf3f5ca09ec579b664b3781b5d12d66723386f299c0a9f79026ba2a33be043ef8a4281a456c728e12b898ff944e891f1e9249e0a3889853c7cb413f8804b637447e5fff09ea1d813b5da739067d79296604764c453ce6a0725e844ca000456037d4c9899e2775d7446093d0bdf5214534290e8191e32124a4f6244d6542e0b373d404d3d0be292e70b818a71e508020a0955a52ca2ac1c3ddd328fdace06b4105000277a2471c42017ec096674ada92bf55aed1d1a0003ee04e64d0a1f35e6efd0d0705e801e7a22663c7f1b8800b0dbca0003c602cc80c936f1253e5ba450e0ab0034e9dc64b29b5c69c357643074cbc8b41df69ddf353b7a00039e02e549b524205c001ff1d430711537c741670e1050e34c60e6501175ee0f03f0628c00db88b1eb3fb4325e8e5779c85c059060a6003ee227e964eeb9492fd05a8011be2e94f5a2359f20d0b4003aead455e8a36d3eb3139b494371815b8fd9805db29e6383abd6e0ed5f9172b00030718626091057cc8828b933d66f4ca3e69f7c1b1e3c610e368a0051fb1b0ac7478081e3432f880051f4b6b8a93ce7292267a059f49a72821c6f6c3157ca5c66c6923ed06f9b582bf2b1d2a241f3f58c1e6a86f4274b86afed22af88f3c42574cf1c775f4a10afefa46a78e54f57ffb2315ecb95d7896d2ec6b3f2a18ddac9b60ca7d349a4e510ea6378a6ade146ca90f1643bacd91d4a8146c5b881ba6695dba37a4e026b5f9dec56e14fc8d9dcedd561105973ce8cce9db534c950a056f6a5f5782bec9a0ef0728182147fe5f0eea4f70797793fc623e3fa1798289924d4bc7ddceecaa13dc7a2475f31141098f7c7082cd223429996983d2b13e36f1a109bca13a3e32513e30c1c5a08386c4bc5832dac5c725b864ba7372fb6b89d1cba159a47c5882bbfa90548a64f5163f8756a9faa8045721b46b497dfba0e91c5aa4b6bcc1f8e21af04109ce638c28d174ee9849e863129cde04914d968e24d88a112346bf10178f5d043e22c1eaa411adb316f7ff3e20c195da7595eca08f47f0df1b838cf963b6baa00f47b031e45831a51311a34a1bc1bafb687dbc5c9bc6c2850f46b0934c5dbca4758c41868be02ce4adb4bd493fdfae08fe43ab55501ac2e123119ce6fc1ad48990d32d09116c12c1f7538d8cd4f71e828dd949dbfd53cc0e1f86e0b4585a2abb0d19ca367c1482495ebebe6fbba5806fdc08c38b84868f8c7da8a4f024e25824100883a1703810808102e603e3130000000c201486429160248db465fc1480034b2824443e2c16281c2014161a8744c24028140608038160180c0884c2e15048201ccf84bcfc23fccdd9b69cdbc999e79ce7382bda9ccdcd90cd990f73c6dcce96250f9f0356c899d94abb0c693383abc7709596ce29ca2e9d82b9731b616f895c47837bfccc3d8f7b0ed169fade7f1c99303dde814deb1166c45d17335dcd2866080662750208a22d4acfbd8604ee0af7cbdeac53946a23355256678910c3f65c9854a1168be89b326a1661224fd6afd2d834fa7f6ba163cc780669085c05be215e24f785c3c2091c82a5b011009d7eb9d6810d19965687ffc01b79050cb0f5b5b7672bd90d49735ed176c4c29d8d26ff6656b1e3c5e68d6ccf32d42c88053d878cb4d89b356121c6e908fcc0d1bd5cad382fb3b985f4189e1093ff24a0eae6b9fdfaa5c7a996959b0743986eb3e77bfe4605f12f85557bcef57a853fb8c2e504163bad26ee3c3ea29dc52ec3ff66161d54e2d4b1c5b3e2b1d8a8fa2dc1c74d655e42884f4d4810f3bc45686720a124b49317bc4b00dd21d03b6a1336613f500a90229a4311fc3d17d50eb0280a5da010519193d28dfbc28a775be808433e704c21984d39b0c669aad8aca0c5806e182d8d867bbadb9df3cc3f86b525e4119e3efb0c8d706a78dfc143abb1fe5c0be0c2c521203af53ca677c9ba39e3cbeca9f2bebc27be75013e16e90f2092a199c3f5820ba5d5bac5913d05fd3d76a36e59f99f62c3158687dd53c9fd0d0f09e2b431be040f1436264a3ab96e5837d71dee86d59bb134156ffae571f766bcf11e8cf7cbbbf24c79a93c40de9537d1bdcf1cfd78a3c48f9d5008e8e819fc591a6ada7061db859d298fb06cbd5afe4de88881a8bb791ade8ab79f6fc28c1d2a15f31502527a13e44de07ae7b742f73c0bb357ef11f662e12d4432e6e2d6e105279c8059942ec486ca86b68539070ff4f306dbbcfb8c7f6469779a9ad6d6e460e0f52feb163274ec32f5c5b8c9815381b6604c5444de1d710bba30f9860b3a6929b90bcd9de75673efdc656e3f37b43bd4ad706fdde56e6f37843bc48d7add0ade9271a6ee3e7ea8e28d8a169d272a257e744752c67b9c5f0aee9cdb39a6a5d6a90aa9876c593a757dfb6dfecde67b6c4b5627db17d51a7852e9d76d7a612591324a962f1a4ac820d435cb2b47c6a3885148b1210d1152344927471f21a5202279479bd1ecae196a8e968b5c85bba4161d4103d0b8457b982332b1d19553c8189acb7927775e74317ac0cea48f51a9c552f9a8b1e799c1364f4e29153cc4d252a0a897a4a537a33a6f15869f05fb91614864694b76b2e641ce1cb30551477508c0e4932148e488940265835ca018c424be145e26d16c32e43082fb265165683c125a0171f9de345d0d14722bf73ccf4b5eef8122d7d0dd48bb5130da3845b20b0ce1fa21a9263f386e59ae48006dbd0dd2fb4101030163b313ad0e806b7b9135c8d4e8b36d2784b8b4ecba2f7e6fbcccb7bc7e71d0cb1288cf4d76b2f0555c40df0435082727b1ed7296cd0a83ba6c4df8d4210763e4ffece9e133f723b60a90efc57503079ee3f01ea559081746cad4dca70c00ea7d8b58dd8bb06ee401d05e25a05eb73dd78d934ea15db7a1745097603af90d5070b4aea9f052948fb361c7552134e496f19f0c34dbb77ce8c0d557251e7cf83215a122f935e5bc50db6d668269bcaab06e8297114998b432c92ce1d823e6783c1aae200af5ef57218fa4fdbf9dcbb015d3dec5fa2e8ab104889334ca906cf1b43a385ea9c07b2c09dfba501a262c88e36d4460cf7c4c3d4c0552c389c1010e92b78295a6b1e5d9495c0afa9a342b588eddf8989866462f8b5b2440cd9061b5c69132b7c48b483c7767d28780369438019d780586ca75b854e7d910baa21e6ba3e173eea11140c9b570b904fd41ecc560a217958c710becbd45d5389aded202876af974244a67c73952ad23619c2359f59b6dcfe3bf27b20851dad1a8b476a1b437443670d596c9630e547ff648a3749d2e00722ef2c6299394c8e993409bcd1d51553acfe093925723dea2900c7a55f6702e5f1f0a5cb3a2e8c8da7eaf2b330320861109db08ddc8add9f8b2359bb21ad000cf634ac2f598b19572b5d7708f19919632f6ae6ee4c0193252aba1ef3f8d4c441fb35297b165a611137747194e85e0883819076371a71099cc6adf9bdf4987f02ef182fae849bcddee61fa210009f1bcf999142eb03226982cee916ab5b02d44c8638000b246e30d3df95dbfa1be68858ae49e3fd0867190ea866edc860df2691ead54994a8555a2810f9e03a87b8adb40b4b81bb791cf86d3baad762f010aeed10190c80f89f19d2021873ef935831249264f3377a1dc9c5696c5c95484ec51fae7c0ed7a521bd037d182153ddbb0943d6f5440c1bd0ceca4fa4256974d0162b8b551462b1798ef7f3d5d5f44ca9d8686cc723e80a2c24496afa0f1d15133b6cc24fe824cfcb0e117cfea3abf962e31cb05af36e1be6dda2c07ec38d240c0761465fa1274c1a449b078c7b17401a5866d7a3468687e756852de462442d1c01cffab5d7f9e8b21c98e0b29fb214d56d44b4e6d41485d8d840ea2496a5dd51c30814c6f83c87ada6c8dd6980db039807197050b388d3433f6c9168949cd2d6bd8e0a70f29b7535694a600fee9b95fe98d8f1a6058cf8907852b3ef7ce25afaf81217188683c5459a21db11b15543cfeb47038fe752987062bd70956d0fa79660bfe538c4d10506ce825ca1ec9f18ecfa36c6a13045040410b2442bd5599307717502e0e697eb016517d8b090b497808392dc5c5a9bc8bb9d83fbe2f26606ab7520f9aa8cab5345cef62ea4796f45b325e6350c351528a86e3341311be125464182f4c566fbee8a3685c6452dec82941eb71c65412a74d56baadff13ab9b36d9c4a1ee4ab0575c83e8b488d15d9d3da1728f98bf1c840d621ffefdc294422da4424ba5e55013bcca5d07a3841724605c56df971d060567a16871405fcd63ae10619c3b8a9cc4f2eb4f6cd9182de961267e1278c9d59e06d00f5ad3a38fc3f19846635b4ac57707981c1b374094bb306cd73a02b7ed97a5d36822429e2c784579fda9809789b0e06ae0114ffd2da224e36f20126057b42f015905e4e28c09a4c915f4e2cd73f5ae06e0c45fe7bfd04b68f4267c235863e814c442c77631c9f9a34274e0b1655836d63fd7febf448e5ecb4e9aa1f103b0aa1bd456b3727e60278f5587faeec1aef32fe58362324bd29f6e4d061b7a9535998d0965b54089746c243fc63d7214d999f9a7f864c94e08ad517a298a654263eca4912262adee08a1b85a85cee0b35e8b67ab9c8e60216e5a5b67aef7004410477468d6126bbc8a81240518a7332a8a205f5dada0225f270174a03284325868ff7e2e03d05ba1b6f23533bf0a2aa8b73ed36dcc197ef27d2842010caa5538c60eaa81338aa1a559043f5658963ee5da999ab2847181ec470666b9ddc796797f29e3ab2270833f833991556e4b030611163d0ec60baac74a6faa4fcc27c226b87b2700c9e5a6cb4379bd3aa6b8cc9254b43eddb05e61c43ee4a91a1311891fe33f358e8da3178d6b49eed1ce3ca810fc8f4675039a7e6af4340a0e8440a270e14efdde9276a19776a26df890ee0ae41030858a7bbb4db02d4ea274cd846b7151ba7449874a4c410dfd89112d21f9cd127049c80c59dbdc98e8a95e8d72bfed25cac77c01ffb338001e970f2beb1e1a1c812977ff27238001b4d8522051521641e1e23e3480896fcfe198f6855ba8f995bf1a80e8bad7f4adc6143967bb1806abcf8e590abf26801b2244ed42b22fc25a3f248712961bece57c951a7e6485e4e4553c6ca8e61dabaf409bab6bb65cccf867e69054d0f621b84066e0f219d3f34702d9aa420139d0e421509e577c275e59fcf874c6acdbe1a741a6102e9f9464c478da4f748e9e83c6c3853edbcddaadc405b6e3a0bb8cc7f1d1dea915fc142bb8868bd9366b852fd7918f263e359a32d118704358481daf2149749c8e0003034d731cc498f0963b52301352e8d97f3528518e120c98f967812fdb5e7f95c63f57ee74bcf85af6a46e4d019e8a4b4318db5023c221cc603934afb720f8d4dd6fb2ed54700339a87fdf43379ddb237eb207ae32695bfdd68bfbc8fddec44cb117b95a286d37e49eb5ae809417641b0e7ca3fcfe6c6eb8ff424da114e99c39f4674c7c55376e0864a7e7ed14fec299d727f223e655b7caec63ab0535a3d14e349cd31247c70b4f472f4577851691f627052e77b25932965753d54abbb43e051ee0082c9026c74c450ae42203b2b47bd9c6880c284a0530edba2796dc8962b62155ad3dd2d6f16cd0e7036dbf80976396180a58f54e25c63a46b57cea14db74d96ab12d3c5e754a7e3991a0f3081a5105e3ded0cc4f3e83e9522a11daf3d8876f3b1eb4da137463fac6b2858bdfc14b1dcb80d0cc2dc3ea1e6c4c21fb0db448df5116580b6e05c40590d9240cf3521a4e8c2352f837302892e1a94c834369f51057c6bd385d786d3c97cfa524254632d407bf81cab69648308f9bb6c81c8b1daffecdcbc1a04c040d53b12e167491343c9244bd10ff11e5f2049c6a3621a5dae536c88de633c4556d5253f9d170516d98e0d5b654e72527d520aa0f16ad7903bfd25a5b1837c20d7ee24bb6e640e5cf09d0f98883787fb0cae54ca35f87d3bceb2f08857d634e990ff8b2a32daff820fda3a9423459f74c0e662ec0ec29b68fd39ea8c840160a94ce98cf1dcb405cceccea4317f8c473c0ea007198e6880ed9a8fcf4a83c2fab7ebc7be473aa0136eec07269d701849a0563825409352a3b0104a167275254581b92f503b8c2ea8518f386c8b19623ac78d146d58447b1d32fc08a355c93a9e77e16e99a9ccbff2593a2afcd7911958e9c2a3aee748522a3927e5e8712f11214ee84a11aa37e3a19365e9fe1746c86a377a96207a4615932a55eb100ef6ecde046f73e6a2a5b309e53ddcef26ebc6eff80d1e1935d93590974c0f1464dadf78ac48c95ed67f996f064bb784496ccc348cbf448aa313222be76bf78f292e4b81c1759dce6bb36adc3548e6825e20dee8fa622b0991e17915b8f8c1fdac02257dccc73dd8f002ad3061af9497b795b4d80b0084f9db04fe7247c9c0ffa97804feea0a05bd04ef0a0d7a6287c003033e40aab411300e60405b63ce460cbb452481bbc0e7c4461c193649fcab96ccb365aec8185e03c7c7cd79c094ca87856ea12ddc224fe4a8652c8a4b7126d55c0a6b7d70d25dd3b9e0711489252245dc9bda42d29c1290e7d5744b9225d4b01246aa98074f3b4c08a8adad3d23eae3cb180425d25d24e5ba7fa1392e3c45e92c7298e5a96ca3a719510ea523a78bab45a4c5d484f9ce679f5c7e26339f24ab053759973a37cce2bfecacb5361c0c0bd66a9fd3105b61f8e6837a87f8a2254a290ea10a9fe2d1aa7f228595dd2fe6f670b2389c9baea04359da53f024271ef25fb93fa9aa5be2662a96fff3e7696a2686435b2fa4a152f89a0e49a7cada4b30ad8c48fb003fc8158cfe90d24b314a0efee034d51f831a85f8c61e2a596954d4d70803ab3f3ec1b4d73a4bf8e55ceff43120e5c184d88d16054f6790590ff38ebf95f2201ec106305819f1beec2b43288995be639f3cd3cdcece819ead019ed9c7ef93eb51cd0d6f8f755420932c72769ce1c4fe8f14356b5973fc67714335cb4f3ec88ec299de90970f5dd73418865d253dada3aed3f96b829bf2284bc8cebe52c673a8f426b1888e493ff4cca36103a1009f3ee2c537e14fbb89d81313347fe8370035d514c86d40bcd159683b6053302ff9c96d679a30d68f33e669c78a1dccb4f0320df894e9a9b54f462d27ec08834efe3e400d221869df9cd1c220c1d7e235636327b4cdcc1d085beaf1c2113c30cd4e495f32e2bc5cc99d1bc637da41ebacdb543a2660bc70f20e9df33a1ad3566dd64a21b5475efa082e88b0bdf3721601ecee0025e3dc4deb67907de0c53efef0de38b020d7a42e71d4c8898673d0e1125f36859e1f51c1c6c185c7eca1c289c5848350a435c048cafb790486545e2c1e61d0c5e7071b13e7363184aba2434849911e806b327f01c4b58117ad9a256c56112184b25ff1187f54210d93ce74256f0f48ef5393044dfafb6751e71d80bd8822b506472b54caa1199a8817f15dcb0165e31a1a9039a00f9797536944cfbffb99801671d38f2e91e39a4efd422a11d0d8715c17562f42613a7461f90e6c42f9a74d86309d63c1c4e4877bf145f5a7a25256d64268cedbaf2c7661ff060d8207405e31db6c642717a6316b8cc16c27e944218dfabdcff02df4ebe2e7e7165934937e983215e16314a0a8d79cdcc05286cb6cb894de0d24c0069a9d852e14bcbffc6077234a2366823ffecb7f598eeb98c6ee7039c5a890baab20df2a49e4b2a59766d26480ac8330726356198778953cdd4b3eabb5400e8ba341271c30578f3f7a18a7a7d6dc6837beb0659bbf598dc4109112b7251148c97a06ec0dc844dc50f234e5258b828d78a6f364ac3261e2d2a60ba478c32af82743548901490f42eead5dd515a1f97d7a11704265f15fb8b7af19608aa9fe8509069d66c172e09f8291af272c3effcbcab6ab9fca97076e60628f93afe921a0b7e52b3748f14d5e1e3491281a5621d096f04a066f9fc2e306481aa260acdbf4067db93ca7a3f06be8e6a61deb5a681befc1d310b60a86c2c443a03c720aae06a260ab51bae780a53bd0222ba3cb4f927769fc084178f13aef04b12f5d1f74e43c118a49a0d519508a115f5541c00fc904813f3300135cb35c21c806ae3ee9111634d7f9d8f3c5750c4f84a06b5f3c9e8744444e590137f527afc65c7a02750d0a08028c3321594737515e0235dc67f10339f949467c24a7c3d7e21eb99a524dc37867bfc1af616ae3613652010d5cd4d05b67e0b2165a472b8e07e0f35a4914234747f81c67fb88684cd24e66ef858f545da8249b63525d37ffa641c20c5d6bc0c7b14e0d3155cb7ac6c0c5bd7955de2430101f3daed09c603d7350df9f4c09a813579cf234f9feb00117b9507bffa46135451bd260b384aef457b1bfc377943099bf87753ba518e0a2795d583b017f217ad58e18ab08ef3c2757d81348959b1630a97cac9c233790d84ddcbd94a404001295a34115cd63ee9b6201c79d720014110c08f40664d240566c2bda1b5c7bfd148953a56a4f16fe1fad1a26eae501b49962a50157555bcced0460fe98e3ec22c20ad98b7c8aeee7c284df811bd5e36d021a8defa91af1177e25391ebd5e27a6946184ecb8845aaa2951f2370586cd6cfa5fb55a6b6f9539fec900388af9224beda6a9c2c8bd12d56f7431dbf5a701948eee12f1a36fee9997f7d1067ef4accef88a92088a254f5a39287927a0af24c43f9d9d54bd043c404182d8a7eb26a7d6c5406cb700b7b47ee9d0f21d5bb3fea7dabd72a92a41f5b877318f729aac74abe9160a25d123c13af47541a53479e17158cbccdab65970878ced3a0ec1bea7c997ba7e9f174d73bede04133368b3719b3da7b199f52df3696e6f7498992c79b6561aef1ca30198f2338862f1df0a60a61c10156025dc54297d3ce78d848d3209c8f49b24dd8a036f7e6f96b1755a8a19802e735a6fcac53c7fb899137b083b22e5edfcf46521b0e6530995ee7ae497010c462ac6d2ebb119a04487be53dba42083180fea1454b32bf2dc165dd439301729c7d0761e49dea2717f64673411f439057300b270c39fb61596b13d0c10ac48a4cbaad4a80c7ce6e4f80ecfb72a8504071bff29f75dba42709c43424583f4f57a6390c7ff28c4dd06b91eda67e497bfe01a8edce4f93f612149436c2368c82bdf9b7426716ac4fa1cc5e176126f9a76516720f119d6637f51bf27e1efe978aee0b513920d151fa2928031df16644c42b622dd6158f8274e2512872bbfd6feec1e0f4215e0995db5c179d4924bd25543a7bf9906fca12504fa3a394d413a56ea2c47a4d492c343f1e5b2f90241e66455d70d44a01b214061f6f862689c75bf0d80b1ed54b150fd5be1ef1757fddffc72716ba1fcce9a4f62872cbda99d3a80cb7f213ca5356ee6f36c016c52259fffd302f28b13cb23173f0aa0030abd1412f6d972ff5590f8d67e45fc7bdbb6ef9850e9b93b40caffdf968b97165dcf725c360df884d2810084e85584c8374c4b5c6f59b75c4362bd01d2ce02d2e8c9d662b640b0c0bf76641ea4d0b637b0a97b2e958f0160bdb7b17062151805156602f7013067b7541e85119467240c9124e239861246fc75108cc77596c5d5e63b143916f5e221175ee1295ceda8ba483f321bc5c275aed647182b655a0311b7fc4da579f939bb29e154340e7468adc46f198c96c64ba9e3914954704dfd6f831cdc13da1f1281a46879db31a3a5a9afcd38ab73d52521ed4a191a7df8d845c3b2b4fbc06585c322c4e4e0a2c48fe3833cdc6818b6f02ea9cadb61619c8525302055b594db7de4db4ded5b1e8442bdbe73a756c65d56d089c9535301867813d5c8efce87f78eb745981415a0963208730d204e2b912d1627c7a48e4163aec994d160e678a7bdaa9ea4e8659b924114cc5d9270d57a6e4ed1f34dc5889846260fb2b16420688ecd0408268014ebe2600eab0f03a790612183687b195f9f6975fec47c3146a7f816d1d1b23dd610a23acbbdf419c90f19c8f7028fb0f3b1c9a64a25cc2a7944d9bfd29f76aa05473cdb075de04f6a1ef2b809d816080d885c6036c25f7d26f9e903e1c18d9a2c690f2648d8bb050da8c4a2e310a61b3e61f9cb08f7fc46528ee248d68174c490fe837129014ca4e0ec3506b9f0efbdc38cd5b39be743d4a8e65d5063c1a880685899f465b4784a730b496863443775f0351153267d71300d5c79013346b800889fba4d8ee1512c6f92b317e50d753d76e4c373c4cc2e10cca8ea7c2c120471e93a32de5842ed50479e062816ac6769f781a2a47fd5d25b9dd7fed580f473052298b8770e50d566d2f9c0c8ff2aa036f7d6a48a1a538a6258e581a5f0e2cbd3fa9a0249c8d6122b60b6aebc811d2797b44cb80ff27825e2120ceb43e045140449c346dceedfd4f5ccfbc488d65ed8e282522b6b2946f00fb59979609db58ea6d03c2569ef1a1340719cf51190368b557ba40fe7e21711349b696b1dc0012241c428b9420b7c8811f71c35648c9da23ae92f952f8226a848ed611deeb90a5e209ec843d614df82dbc0a3fc2acf05fb8164e0837c2c21ba24cad43042d08b6824f43da41fe44ce9a6bd66a111c7ecc8a84100c0990f481cfb0b0754382a2fee9bdae163e7f2c24072fa4ce9450782f33fa58c63eb75bf7e2c420476291243c88091a2908a405e1bb17f54f675d08ba7c96204fb097dc26bae259b41ae333a5ecb4be0415020b24eaa09301498f69898642326b1d2aec9755f26846ee8cd210e5bd491d26f8cd808656e44eca690ae33e9b6882188fb299327dc88753a326de4eec2913dc8e5095d7dcd963872dd4e95cd56468a83bf42586b56803cb0063cef42b41c5c863e691d22102acb329ea2d47f5018fff59caf96ef219e525abd6a29599aec65dc650b04c327c1f454af352beda3a5e22ba32eb0fd7e44d34fd07b5d2b311def030f7caeede5acc3eb5536a2242406faa2ef235099680394da385e27887c3265959f760f80980c611fd3a9566627a32ebbe6a165d2c00d84aba57944f1ea4cef4d592179623fad97d2880e600e635311233b973952902bb62b658a7c5184a9b21b370b8fe60d56c3236b2a00327f4dc556746a4323b0d17559d6fa49878230f58eb4d01f3faf44d67e5009c7f33dc416c018a58c551848797444988cfc275a8bd2da85a363b0a366d9a52086722cfec3b418f8d4702f636938caaa574259fea6148382440c79c528fc09190b0edbb0b9cd02c8dec1fa66797405aba8d05a58328e3ce3b37804b24300a9f3b875a2d8345be2d0c30d9e2e40a55a5e0760de9f02a66299116412797f21adc770ee9c3e5edea62d19306284a0b9fb72c65f5c1d14b54ec9cfc9a5080a5c162be5c52eb15930cb3faae303323fdc3ed1780bab1721fa05c9b72dc1e01a1c55dc7bf16a804b31c75b800dd1c6df8ca914b40022f0b26130c1dd8083c79fc546fd6f8eec49113e4ace29fe1dd1b40a255c412c0986827e8ead4a25d0b36f993f9e187574e9167adc002ccb28fdbf0f1643a3a91621fdfc0d7e7de909600e8d9cea1b92abde5460f34b0d313c219a13d62137338ce96cf2c3dd6c07601270d178d1d95e15d042d8ac35a5f2f0aa294aecf4c2a681fcd1e92da2e6b5081f766f281bfc4d27af3152b82f1b1427a608da3dd2751b35b1c6f9ec44bd57036974ca64ea777ca0e7c14fcdb91942455d7dd46300c973166ce03631fe6bc8cb7b801a0a171ea0c086b474bf6786d7462ce501a4161b1cfec274839c29599c99eb10b2542a10f52fbecb082e9ad4b52657afdd8670043a599568836db4903b1f1b225dac8686c7fcaec5c47dfdbacf94954e506fb6013f8decf2620b111829b3902b0b1b5035b2d77c3d79ec9661378b51b25d8016c670a4cd0e68813d9933f8d024e4d4eec4ea895fdd6966ab3817a726cbaadd321f029015a4f65bf482190de98a213feb9815a65caec141e687189d56712608243c6982c7eb0109894967865003a63b1f83f84f39fb1031a1662b3dcee42e2162940d082a25bd3b3513a31b20c2530e9477a4fe9c056a49f9f5ef36461daaa946f289485470061560fc4b7bc110253332e90621105bca9d8d9b386a7ad1a675b15206daaa00a2887a7558d5e9e3656bbe83bf25e8964558dbdd2344a0d7c7ac3ce03750bd054a46fc29e8bc11d97c13cc71aae8cf9fcd03d8c784aaf62f39f438689035ef0f96ff406b4e4b98473cce6b9579eb16ec327bca6bfbb6499da22364a10312ca2bdc5b08344e0e1838797d282b8043aefdf2611f84e3d717e06bbe1f6a6357fa453852d4a6407f4f52ddd4537c6982a9e2af7c5901d2c43b1092f0b3819ef564f37a6a04a8d4d81a1fa7a346187a5ce904d719ffc6efb74deea9ff6106e4907577022cb1868ee833b23c5cb608cd7b0fd308f207e4b9491538069991c3d1e00861801efa834f6a89de69b647fcb9e648c231ae80cc31147fadb619e1b480dcdcb43b58c1cdd65e0f8a25cb4e25cea6123bd5ca4b60eca7b0a56a92c4bce58463ce48223e21de84747f308097df3686e91605f7971e1e108eb7b974b29e48a93d903d65bfca9557523a3140b35d7e12bb234064d7dd704e9e6df68785545f580356d1cbc54e2e53ada37445e24b173370a360ade6dd16cb994b1cc358c9eae0e1a2b26361b66ca45216dd374f8f9d13f6b8f871bdbb9de2445afb3b04104b479fad1779449a092b9f154d4302cdc0b02ac5f660fde041baa3162988bdbcc002de380e0bedc3323d07050045dd3c6beb68208850196fa08e75719335321bef6d8bd7a22b784f4e1712167cee0e471223c23a5c776ddc9249a5bcf4a71090dd04e188f7949481e21f33ef96cbc8c2b96db23b55f6f6358347108e185d2e4f93f0f1120aaaad6664dc4079e945f02553df450e07a40e5f8ce3ddca2ac00b6fef4e44e6a805d241a167ec797b702a0880220491597fff8dc17b098f00bbd13516c9469b39182610e92e02899852cbff53c19325697d34d573cfc48c76771155b178a3cc8e56de086fdb830923674d9707a3186b617b29e04466c919a8e40dff20c41baf878c79bb1b11c7ad855de0864a0d5b7200fddc769a6364a32d9c922c56242609419430db85a12518c273ae4f42d96cde2c90d7ce90f47b92d44821743f443ebcda91c62048588b59c67db69e7d45355e3727cf0e42ee7a87382c09f94631427b910681c5330aa82c01cdc0767ae4c9cfae5467371bdd3aeb85b2ad2ce4f864a9db95ce6d71ce22d22188cbe5b4132374ff52f40495c1e914d66e03ab65cf49f79dae419102e5c47305c04e98ca4da7c03ad1adc0ef4e3f841068dc861f24aeddb62b85bb83884f1aae70fa0d6100b6a087a25ae0098821562d46db8bac21b4c62a9d093abeaa546543429f02ef404f1a7d32a343cf94f468bc9798a594756c889aaa314beeff83a9a44de5efcf9ec528b738c7ff559be327244aadb8b67bf8868ea7a808a9767929634c99556563cbf7a72813e570ddcca3b8b6ae791702e38d793270b2426dabf358627e4d78f777969adbe8af345a845d211b3a44fb070cd139ca575ddf27f2d25f23b67d48444357ff888f60008015f90336a8d59969c005e0cbff7686203a95207121f3ec5f691dae75e29a5fb83a82d9fce81cc6e1f641d445380deb97657089c741218ddaf56d3b1c91493041bd1aa3386feef390d8f724f0c070da501787f361ea0be9914f7b08de820ce6d645199cd232cfdfd5df43f76d37ded55b4c512dead744f18755f300aa1676cf627a08ebb10e0b5645493d57ff93381ee7efa7eabca6410d49666e884f89ddb65ce67eae91725133a9cba5ccae5f4ff8c3ddd9374e14e9be46e510c54cd9abe842384b8973010117474ea30c673f0e0d6928b5ab803de511a18d851dfe4253c6ba6182d9398c2443fd5d26954fc1c60ef59aac3f7b9ba9bab19796e229b00dd517d61ba51a1ec230af124a97fd046ab2e9282a8d14915145020663b0634bb8f8b29c0a0e86c23145514597781bea48cf03f300daa13dc0c5256806f8beb40b65fa3f8503a59af32ba7fe79939ecbc315fce4f73ae7d539fc51df5c81f208094012c89023e1bc4920a3150b46439fcffffffffffffffc2836884b6196b5f2699a4d43fb65e9f93292599524aea8a507fdb7bb1adce6bb700705002370ab70a2a0b6783f633402006064ec07808a3a48a09795f762b7b3b7018c25829438599f9948102331e8d11b081a310e628ae57faf7251fe28430560a3955f2e8312999580d1c8330b9a85c29994ed23e98046112426bde9d754e218a0261d07d7969a132cd4407104693e521f7d357d7e40fe60ba2e53fb473d4b2f8c1a0f7df345674b793d70763e86041041737efed2c1f0c6bd97abda71bd6e93d184497ae9efc5c8c9f9881430f063993f263296112dd1603471e100d0e3c1872492a49b12d6b2a5d068e3b20871d8c132f3b826ea7856a1403001638ea6078ad98aedfd9a225a7834955a4eb9a373122c77d1b9cbe2570ccc12c794be95eb864acd982430e5d8bfa49b2f3ccf19a0c573150b0813478607860666046197130fe7552e3a1974fdfaf070e389842ee11d52945d7f7eb0e1c6f306e8dbe9896f466a204898101316c6c1b38dc60125f5ab6e106071bcc7d7593ef53487a13101070acc1bc9ae57741d7a5d21b047567dc020e3598d5c45354f6e3ed48c958ab71e36f50461a36520d1b67a41a957fa38c1dbc7f192420f63ab091032788230de61093bb64954b86771a69f49a064ca08292010e3498b387c52461225f83be41195380e30c061dfe9e2fa4b012a5b4c1e9b7810dfa0635920d1db0251b3ac0097098c17055f24d25a70b950f9571018e3218ff928509db5056bb93c13022fe95bca4c492c818cca9bbb2b7544c072c050e3198a3e536e1f14708cb3a0c869c336554cd4704638ca154e00083e16db4d5271d9f274f38be60f894945f9dd6923eb91a26070e2f985267c7e40f2a2718630ce50347170cbbebefa72b574fff655c000b1c5c3057906a7f41733150000213ac81630b465739bf1b09deb5d7c0cf000187160c2178fac64d9e4923e1c8827135ecc297b84ce0c082c12ec7df8591db298538ae604a5a44856eed2748638c31ac803c930bf1c55392048e2a18c73e575e388d3d1351c1246fb174ef6939a6604a634244106627cb13a0148c56aa74a9724f0d237044c16416f1da547fc4fd13148c21737f36436f434d4f3007a1baa7f3236278de09c6ebeba4d7e72618f29d0863ea7cc276ce04d35dfce533a14e657909a67abdaf0f2b17613d4a302515d45e5e11d2c328098657fb71fb2072b86023c1d43eb69eb49e490e3a828d911c46e02882f9b292522907217663250229824ee710cce152cbbe49eef0d86e091c423059ecfb750ed7dd49b5040504c3a419174f9d4812820c0cc35f28ebd2ff22ed41c55cd0fac258226fe4dd30f5c2242b2cee93887861eaf91369e3ad257476615041d72bf2a90b53c8ad203ba48d94839d0bb27857c8d6a6ed1e63d973f4c5195b3109e38db791831a4b06a100bc26cc7b5d8d7c0b835249453ce7d71686fc513c4c8749a6c5ad85717f84cc979b1626d9ff9d90d35c3ca9b33059c8b8f0105516c6f8adc94959c82657120b73b00ea33fe8242c0c3ff163c40e93d542f015a60e5a34b55baebfe40a536e919ebf9f43c9cab5c260c9266dc6dd5cd28a025861d0cabe52d12ec53dab30a8d9114ac7fe51492e551844a6bd455c3f1559292d3fe975428521dfa7a97e855c21994e610a23fb22a27fa776c9146657b3acbb5ca6564ba530a5ad0cd1331e24a94f0a43f851ba4cedcd24ef4761f2944d5d52e5a5f14561cab75a290579288c7212dd84b8bd8bb183c2e435c2528c2c132be29f30bdec7dee2f1d2996ee09d37e6f558ca4d309e3a5668d50677db23c9c30c7a9d23fcf3e56a9b30993d25b39450a61f683ad09739a8a093a6974084225135ad70861c23023f1b2043ba9e1954b98c56554f6c92c215ac268651523e71257c20c5921e694982961708965563a65ad09f224cc7e966c7410af2a2749984f6915356b3d267a244c324ab456f81bbfc842c22897bccff28ac7fff61166d1eea0ac3ea7a4e408e3248addd908437e4f759e57216c4698e4979658f2751127a1bc3c8408524598724a1059eceee74b4d84513f449c7017f4e85111611eb9172e589ce8f9218730cebd5d9e53223f7c8821ea1b359284b4904298e25fd8ab6f5d8e242184d145dac5f828a195e7208c25f47da49935152a8230d998aa88b6a022693110a6549e4ad47f29b32002c21841cc6bffff07c3ae78ab5ebeaf1ff9a130eda7f4b3de0793e88fd65fdac34b870fc6d221f7e2a9f76048fe313c62877f5b4f0fa65879a62f25793089ffb7d3e21659abc38321d7e4ce509d456e7f07838ef2cc0e66754f2289b7eb60f4a03da4b42cdd4ae12328800ea6ec10dffad91ead3207b387d6940fa2a5c4dca2003998fbf24452c943e26048dedba17f3412a4a100381872342de35b6fb9737a83f9822ef5f0e979544e6e30ac6ec9a888ccf5d1b7c1a443bcefbd9899be3e1b0c56c235363cc6f885d660c8b9f9e94ca538b1e36a308d4895eb2fea6930aee47cf1a9ffd3480e1a4c419c9ff9aa256db13e83d9a468c93035aa92d56630ccc752132929cb099532982607bb6b13e299a3420663878430a6372a5a5dc660f4dc29463c93c560f211b978fd881bb286c1385b51422a3d35b925188ea12a1b694f5f3077aa7fb76a7fc88f17cc4976bd85a958296dec82b992fab64acf3f9ec305a35795aa0bf5313ebd05e38d57e70fb95c49755a305e3a799eb3ea3afd62331490057387e4b69792d2e94fc282b1ce3ac9f8f824e2e8af609219aaa532defcceb702e2773c96fe1155c17013f594d4ff3c21712a9884d6c4b4d27fe94b5330e80af627642b05937cedd25e9d4c27d95130bb752cb3ef0a14be74332f215ee509865b8f717146b632632798f774cc12fd9eac83b609667935ed977a32c12cd721844b30b5b2e112cce925d6de3a68195109061d52e6bcd905e1d725c170fed1c727f9aa9690604ad53152f8ed9e9c1752c01130533119c170a942d07d9db37d9e8a6048c27a72ca257be3f40a208241a28ca88a91ec29e7153004a3a96895537f4a59880284604a9e7a3ec5d472134ac13088a50b297e47c0305d4af2c182d07809fe2f0cd739d4e979331dfefac224b353a530b7f6c278313232744f5e9842faecc5d83995f3db85715de5e6f279498c5917866c15c53a56f8503a940b53ef4e8aee2192880be2c214645e97e81423a8945b983dd6fb920ed726c01606196d73f772511e24a016c66eddbae461e634946861f0cefb984bf75039cdc2a04c58ce963c5bca7564611cabfa4c11722c0c631fe729fc75953861619411ca530435aff6ed1506f9f3a554541235b62bcc2dc122a41ccd3071b5c290a3479a5821ebfb618549fddbdd53bb7fd87e1506cdb8930f2a5bfa5d15c64c4d0941881cfa74a93045319d5efc42a830e9b85fa9273f8541f25cc85cd85870dd14a618e1d44ebf530a8350572e661b290cd1f6dd763dcde8708fc2144edc4589708bfdb6284c7a31bba183426190dfa1e6d2749e561914e9c4cbded922fc09935dce8e16b395728a3d614efd6a3bf2e2f5aed2099356779ccbe179d3b39c3049d4ce92266fc298b7d6313ff5cb6435618aa73aaf6d24874f66c294a447b1d4b09c53b5983025b30ed94a5bf457f412c6dc52625da3a3a65ac2e09f442e91c4f38e48254c395da570e96927344209e37dd09fb2e53909e34bfe78a6e22909d32789332af983a57889846946470d4f199e119c10f7d596c118caf4f2ba875fa64a06c3ac794839e1ef434cc760fe9338b23ea204f5a71850296c961695c530983774de5fe5c748f20383d1d2b8cee7ff0be62496e339a8a4eb6e73720ae2b36c85e5d105a3c950932ea9d86c2b3db860b6d149c731d3cdf46f0bd97552ab164cb26eaa652b5ee66264aca14fc306b2db814716d0f1f3224c23076714d3838207164c65256e94e7b42d3cae602e65639ea2468ab896580d53567858c194f74a4df8ab2c964c457854c1f8d1ffe2ab04ddce122a98cbd2c80efba78318a76010b2ffca76c7837b09111e52307e89119b76f9fcab838228182325fd9b955216f0808239c78b9e9f72f48f952798e5ddb479d0179961999d8387130c3329cae51cd63bc96f341924f06842422fcf621c030f26982485cacf7b48a3a3843c96607a5753b31234069f87124c51547c3cddbc637cc85813030362dce06d604c108210f095f64882073c9060be8e707b3a3df668c97dc1e308c6fc7cdb17ebb81c3f848711ccd142463df582ae24d2078f2218dcf334846bac6f8ef2e0410453e7aa4a975b1a824988bb4e6ff11082e1a4ee894a21f4c54e308c7dbb9643b9db48f081618a37b12e59857e61cc53162d5b12b71c725f186b3ed552c3fc92e5bc0614111dbd30ca8b0e49bd041d7288f0c2fcb7b26f21780a964cbb30d90911b4a4a02da8ef7591e75cd92b9872a1e5647fb612c7854105b311b9c27912b2dfa21c31f2a70eb3a0c316e6be9c5417fc24574a1203033d18630c5344472dcc9d35dbce9456684f6961d02968a8b78549299a85c15625260b53ce49a7d873652c4c3ae5ca93ccbaed14c2c2e069da74ce64e5f4b98e5718bbdacf7792fe77571dae30699af4371d2a3ce7dad10a434cffb8dc69647f7d32f6d3384304638cd1c10ad3f864356bdb5c0997d3b10aa3e5fba0eea49e19e85085e174e8f939c041a331023c0f74a4c2e4329f7b2c8ad0b1827fe84085a923567708ba7c63c5e544c7290c9ee6f24254ccc841aa91c68d33c8404d7498c29436fa417c45aacf3db071c6096eec253a4a614ec173e62d78e578925d1f3a4861eebf35f959234ffe2cd101d1c1758cc2a4c39d48e695547aa92c0af328e195b2495d0c1da130689c27bbcff2f711ae403b40610a955eecf3488aa1b78e4f1824071d545937de0639b041b6c3132695b835264f85d1a771e34590fa848e4e985e23453f51fe196798e0d4071d9c305dcbaec7db0f196bc4522a2303d9b10983f6a94b8a569d674732d68e8d336e9cd6343e043b681390232de8d08439f27ff220642713863989f712a29fd26562c2f4c94eb2dae9507fed1206dd79424a8f9c3aaab584aa23e62b4db850072a61d2da2ed692844cd94dad83128618579683b02c49e19540c7244c62419c4823e37fca27634d67604619356ef40cce6a7448c224af575db2bb3fde8f84e1841ed562112b749f206188233ebea894479867c4430425b28e30c6964e12b2cc8d3027dd2108310bf3fa3123cc5d2b41ae04a1e5aa2dc2a4de2ddc27e6841cd48a30b6c77f92e93a237212619ee41255b54584b94aa5646f7934d0061d87304dfe9027e6892779ad210cca2f0511b9301b3b29842959ff7e8ed157f33c210c9ee3e792131984399a668c87b06d7d16411864e4a598b33810a653eff944673e7c5e0161bc4e3aac94bef422437f30be75886a79b0cde81bd4b071460d2074f8c13cd79ff695ef1d731f4c3a7ae3734c5d7c9b3af8601eb153224da7875adfd0b10793698951e93f7e435ec618a30c1d7a30bb8952ba9245ca65e7c110d79385c8e94e2733e1c1bcf93d16376542cc10093aee602eab8a15254f7630e959f96c48899192b6a30e86a0b23fc71ef5cb693a982559306de95547a890be3107d365f5f021e7b782fa7230460e21fff563bca6280ea6b9601eb7930eda3c380231306028820e3898fbb44d77fa88625f7983b9e3267c7b753adc604aeaed6404a196efe28e3618741cf16f3a5eacc975b0c15c322a5b6a0f95f8411d6b305d57c8cbc147fb5dd5a106534e1777429851c971471acc29b376245af09c67d4810693b89265f1e2d67106731e0f3ab23aad7b3a7598a1a30ce6da8e961ef9e62fcf64302755af9274cb8ba5948e319894a5d457d9573d9a5087184ca6e25e59f2bebeb07784c17cc97b84ea297580c1dc9e6309d9d1449e24ecf8823154dab0681ee75e6387170c42f99ce890e30a7474c12caa62c988ab7570c16ce15497752a756cc124776fbc453fc2850e2d18af5ef74d05fb3897ecc882d9c4086175fa43b0bc93b156b2091d583078593ce541e92041d664dc681bdc48cb29745cc120b664bd8fb0a07492c6df60247458c1249e9752be824856e111dbbe362263ed460dfc8c8b4207154c4ae7f34a7491ef9b2103c10180091d5330c9deee284b21edd26a850e2998d2547ab31ca794fe3f0a86ddf2c841c72c31f291a1030a26a12a28efef70161d4f30d6571e7d227a6adc103a9c60f6d4a347848409b9e464ac1513424713ccee275e4b54aa850992b176b68b0e26984daaff4eb0cba3bb97e139406f63cd3a96607cf5908210da11a14309e692ffd68cdd8f5a0d6446d748c3df868d331c2f0523400108c6188334a22309df46d01e420551714400f0840e249842fc3ec9ed18255f54888e2398c37b12570949449f91fdd0610493d23616ef2f8fd277923d7414c194ac2e2bfdd9b67ae8120f1d44308b4851b27c5e8e4a7a1d3a8660f8d7c8edd194086b4f87108c592167f4ffb94bce81812318c6eb30c2e2538255489bc0010c773e8ee46f512612387e61b60a539dd86eca26cbe10b47cb9caab16ad4c0cb40a30c397a61baadf06217c6a485928c355e9894f6961c612732d65e0767d84083ecc2fc966cb764f9cea582347270460f1a0417c8c097610305638c91460e6e705217e6fd78b23d89989eefb3326ca060066694a183336c90a0ae56c0910bb3e849cbeef87061f25c953c67d3e9d3ad5b98635bf0cbbfda41cdcd610ba3951ed39da487ad7a6a610acbf38e60e1bb744c0bf3b55e165521b48fa924143866610ec26b525239fd39aae39085d9de544bf4b2da4a411cb130e8b855faf6179f4212072ccc398654911b59626285e315a612ad4ed656b6256b0e5798f4a7f411b4b3f5c511472b0c2ff973be37915cf671b0c26c2f42eca8a45444876315e66d13fa626dd35694f4c68d37430f8d326c906abc0eca4011b8a0060018c1a10ad3b6c9a7f6df6eddd2e04885f127d68358c5b67d97a83064b94f9f2646d0959392e31486590f49e280c314e6f46b4a59104ff1692e85397ad22108f70bf9107c3446200606cc18811818e8c018637090c2f8f964a8a8898ec214d4d57a5f885887958619efa2c83cd6fe509834b6d4723c670f7080c2587ad243d076291f1232d6d0b6031c9f307b780c612d2f7a47ed9e30a5bb1c1fbd7119a70c393a618e3197191ec2bde3be64a0208b15383861ba60e931c7b38854934d18437877140fe1ff276263e0d084b9e4e64f503365c2144786b22bd3bfc08109c32753b1d2449aabc0710963aa9ff097fc1de32e352c6132a1449f0877f996304725cc5f9574ce7f2ea38451ee2eb6fb6dd44426b1fa9998ee08faf693b1468ac02109e388ddd115f73f1a9130868cb8723a1f27fdcd0109a3e9f0ccfa0d353a35ce40c6f10843d2ce12ea16ff53ce7a60e3735002fc0087238cf1d9b2875ce2137034c27c65daa5df7eeafcba4119c8c1089350a224690ba14347ed171c8b30c8336d51fab4894990220c23f52585ca3825a3cd011ac57024c274255b95c389c958eb341a751a9d81b3438439c4d39c471fc958db47b7349694868d336ed80dc26883594250dbe1c43ae80f1b4c6147aa4593abf1c1b20653f64b951f5613c7623518bee3dce28abc9d531a4c924288cad0a2c198163d480b5b9fc12022e6b283f97d4a9ac110abd2fd7bd3329854dda4d86d12321852f27ca3151e4f98c6600e537fcdcf5a621783b9de47fe23c9ffcd1806f37cfe9f705142550583d1de4b46f768651208e30ba6204743ab68ef05c3c758b270739bbf6417b0ce26d404317a4789b96012c9ea2b56ae101e4f1b67e409630be6533284058fe4215ed1824988faf82d162b744a66c11027cb4e106e95ddf5c0461a663c89411858305e5b95eafa3afbabac208c2b983a3c5e88e65ba1d5b182f1f397d896ac963ba5aa60aa160b299274cba57c2a1854851439cfc147dd3305d3dd7b1493659182f9530a2e63428d82e9f4d9aa7cdfc51625148cb17f925372fb1df5134cbdd96155c24b92f085e104539ae7f5b0939d208c2618648616e126526ecb1e0cc26002f6de273bff787f7210c612b09453c4f7ca49fd26c377108612cc7d236e7e157ebc2c1784910493fca9d3eb9d173f289d9186191d20411848205dd6da35753a0c8871c836d240037b10c611380c23a8f9e93a240f855104d34e6e65ec056da4814618443098dac9a93a23faff52e36d80c60dca40038d36e30c33126da481068631041286104c31a2f5f3920e1f3a45c69a06c6182318a6687d6e23929c6c42fc018c740827dc7d2f4670f0f10b435061ed93529523a4f6c317c6f413c9d94ea6ff5b7a61ceb7f0218f5e0f0b3f2fcc25ce639998eff0b6efc25421897cdd7186c3872e4cb32729ffc80e2f415d7261f6eb38aa53e592f4d4bee10317862826afec736b753bb730974549410715a4a6986c61aad634fdf079265abcd4c2ec914ad6a79fe546190b820f5a9874d8b8dc7df92c0c2a7fbf1fe7e9e2c8edf0210bf37cd995ca444b2cccb61e210513172c4c25b994b6607dbcc2b415f9b5a4e7ae305ef0fce941eb34444a2b8c559b16174197a710b3c21455a26bcf9fac45c9c72a8cb2f19fb2a8bea99c25636d35f0a10a735f9a9790162d7a0eb1c0472a0ceed9f49da77b8d7f64a4518619638c199851061d3e5061a7305d4e397448994fe2ae0f5318258e38f9a92b87b7df818f52900f529852860a9d6db370d9761406d7d1511db449a9f0210a539e3d95f2b89e1825e64728cc215c298b1eb2a030b75558fb089553840a0d1f9f30ad87917849a924af2f9e309b6993eda4e2de32a265f8e884794543355efb635cee8313660f3e3a8470f98f4d98ba93c8ac905532d66a70a3d3a8516ae34313261d43cbeba578e1b3f6e02313e63d19c1d2363624e8c607264cba7d9dc289741f3e87c6c7254c29e5cb49930ddecde81b669c618605c618037530c618a800c0c587250cf249a9eb590f495755ad84c96425bba4bf38418614111f9430ede8a5511d2d859c3a0e1f933024cf8ff6f24149bc21b14f99928cad8183bf71fc1109d3c70f22debb95c6dfb861010c70400c0c8821821168a007e4111f903048cf8e2621761e611295b91a164e7bb54a8b0f4718ed3bd88e078f7a154d679c6183046cbbf868842145f21073f11da45a186110f727721e7b89f7e5224c4129ad7f31354518feab5a23774c909927c2a4cbe646cfafb347bef081088367f7202c99de05391dc2982ad142fe4ba4da785cf830c47d14c2a4a56321f444de9e9d091f84307fae3c158bba222ae4c2f0310853b84bb5753da7eaf282308a7653e13c53d72a1bc147204c2d9e1fc94b8aecf00c3e00610a6d12dc428c94feb7910334ce061f7f30ab8974fa6247c6a9948cb51ef0a08c5484061f7e3045494269fe763efa60922c626fe9bc2284341fccaaa6246509eb88f51e0c1f64549c9fb01ecc67b222f2e7c98339c99e252d953db6bc2a7ce0c174f59323c7506175d28f3b98b3a5eb10dba10f3b1896e245855d4cc6da1563c1471d8c15cf4c7c96243a986c52994d1a1532d66e2033fa0c4f061f73302595836f9c0e231ac21ea45106213ee4600eae5931b392ce103a7571c074459cffb87e95ac81c68d3a7cc0e1f5eb9873667d51926f3042ce7c3593967a4fe30469860f376479e27ba54c64d369433733f14f48bc78c992870f3620ff392c8d1cf93da99e1a3ed690b2a85a97730a4a203ed4905645f0f865aa19c23490beb6f78325870f34a0426cbce362e9ec1952a1ef74e912bd916f0d1f6628ccb9fccb778847e7f0518666b7829ad193c2a8c4c08018221003052010030377f82043aa6a219e923de1630ce82efdb394b23664031b29e0c387183c73dd0b27bb33d20b43aa2f1792b42fbe3330986639463b2baa46cc8ad9ed21044be1e1e30b065162559e23e9875fcaf80037e1c30b0695b3e4eaca5df615ea8239a8357517a16142ee5c307ae9f270a65aa9287c6cc19cba2d651bedf92ab5160c9264f68d05350be63c31dfca7a7bed2c5830298df89aee6123c6750573be8e2ea2a276df3d2b186c4bad2aac5527cf84955f86f041059350495dcea65bef43ff988229e74a9db746968241626b8a897a11d1520b10a2828f28782962425a8da806cc28a36d6440a16008ba744cbace4eec0b0a1f4f309dae382295b897f0e104939abd0c611e84c930d9f86882c707136ef4e06b50238c8f2530e0430908f84842033e9090808f23dce00602f830c28d1b6f038e8f2214e08308370881013e86501f42b0810d1a0310f00886033c8051a30c342c40820f8f5ff8e2d1195e2307bd3880072f6c6083f60178ec82c3431765a06181303c72413c702186c72d08e0618b5a24c08316350ce0318b1a65a061811b3638e30c122cc043160ef088057bc0a2461a08f078c58d2fa30c342cb0810e0f57d428030d0bd8f81ad83863056178b402fd0c66d0288880072b6eace2c3431509f048450d0578a062001ea73080872908e0518a007890c21c2ce6e7be2c29d6ef0a048f51182f646ea5e4c87fe692b1766383e0210ac34910d533b146e68743612efd1a4943e5010a939795bea825f4f8842188fd91952304356a2a62a06003c80c0b8ca145f0f08441447a4bdd0a69545f88e0d10973ed6b856fcf17365f74c605dc8c1c68608c1f7870c29055b4e38ea4cf61271e9b30d7759ce84e5ae5c08d31c6f0d084a95b2e4fe4f4f1eb7c076760608c3170e0910983b25d55cb63c00313864b52dc7c3b889f1cbe81c7250c49dec48a914535f0b08431aec4884e1da37b66b5107854c298a5433db59f2861aa39cfa5b233099387081e1f4aa83cc2968479c4c4c68275f49461240ce7f9644e529ed35307097358f12e91bbec3995c7234c62f27eec43ac7a3db081027f1d98230cf9449a96f9eed108c35c3c7d532fad6e71469894322daa1ed4a5057711a6bb0fbeef29238ff03c1461b2e8e2315f65e75d7924c2b4399ea59727951ccd0311e6e46e2a4832a14584ef3d018f439836e5c3488d943394da109efaa8daee17c274263f8f28bbbd9315214c725ff9fa3482463f195c1e83f0f36c49ed3c046188752a0e84498a560c08737b96f18963c2e61a68dcfdc1a43b82be9b14fea94a7e30e8181f6fd4c99cfbc4a30f06655afcd26ae8755ba306fd364eda7af0c17cbd22136b2f1278ec616d78e881a453120b0f313e66f8028f3cb89664a747ad8ebefd0a3cf0606338c2e30ee6203ee94f6ea2ab82871d4c7bb22fb6f809cdcfa981460e6ad4e08c336cb0251003036280400c1480a0e8c0a30ee630d76e6b13a2e731d1c17c67d7af1e3c8f39182f088ba24c720a49a1871c4cf2f9ab3a2996a59c338f38a4071ccc39b669b57791c71bcc7daf6e2a2fe8f627b3031e6e387d8affb63b95b6e191a4d54b2663cd6dd4e881196d34f06003713f69d3b6ce93dca0460fcce81a37ba3230c618376cd448e346bb193b3803a1c71a4c6fb9748732a9c1aca743ce97143cbae9a4c13c729d2a4c84892829683097aa8f92e44b1471ee194caab2ddd26a78bfb966305f4dae907a30a9bcf72123e6e1bab0248456c933e1c19c435b78cf967758558488d2d9c15cb2ab73964f12ecc63a98828758212b6685db74308baabf8e16f2dce53998e279793cc92feeaf1cb8582faa447fe26090951622fad4a8b41d1c4c4905d7fbfe10cd4c6f400303dc601cbd922d0989b5c1f4e5397c2fc60643983753d3f521a4656b30ae88ce3ad594d3613598dbd4bec47f7acf621a18800693d07be94756673044cd0d8b55fb494290016678bf52366de16bff736528cf579678f82af7c9603c393975f544977cfa184c97ef3987cac8adff88c1c9f1b63dd49f9b1e065318e97a39444f0c910306639d99327f516ae4ec2fa47223e547574b222fbca572178c3e422871cb664a81015c684f655d4656ce16ecf3a0f447bab72d5d0ba5f39c6654d6d6fecdc2215bd6c8cd8b61420103b080a7d71c193978fa5ca1ec17747c39252b14d143845827a2df2a5c1e7794120b217fa860921842bd6be9cebdff144e7edfdad1df3a2978c1647b4a416707191085435ab38a58595a3b28607f3259d4e49ff8099f095f1d8fd59d7342365676a31d235e450c6802327475989409e414ecd4bcbdc29b4b40bde3ed56deecaa90014af0d2884a27843a71332009a59633292a0c4002f2e3c595fa08c6d1972c45eca4b4b2114cd1f524c50929025a548a949245b1141b110c42c9f814bd7df259870143b83d82bccecb16b34d0c10824107d321b32b899fddc140e959f809d3253960984388da294bf40b436eed911dd717e6f41c948efc25556a2f8c1bdaa176262fcc1f734df4574ef1bbdd85af615226e88aab31e922bdf1a32d5a59bab97023e9911b5e41f85db8f092ef9f0a8d6fe155ce3cb3493b3a5b90e7f5926ab530d8a828c172e4f7f8d0223b1d2a84d12c0c415285121e4c59a43a480b1553fa7b2c529193fe38963b395868a63eec45ae3a855f61d2397c8ed45859dd15caa46829e47a044b2bf8be5049c9911c2b5afb4e6a3f8818afc289a9754a45d57454e1f75bfee55829ea5498c2e6a4921d0b3d294385c14743a7687f293f7d0a934a21757eb1cb7e2f0a0b30853959c69c8dd2fb29924a610e93e396fd8c07ad3f298c7edf4994b83841c43f0ab3950896c34b4dc4f84551bec88c89cb6b288c236eb3a22561541228cc412b451555a14f1892cab7b9e81f12f5e3098350d9bbde743e7afa74c214cf6d5bf2af085d36278ea434bfbf4cc90d954d18cd752d9c12b226cca73b2cb4d794fe8b33618871134e998e1f36c5c47a1d2c7c76a77bb92f61d44d3d6521a7a4476a0bb0844949cb4105f949859754c2146a65f2c84b29615e8b2264a77021494a27815097f36479fa699230473bcf22e6bafd4a9130e48e94cc2f04a57d26244cd5e7c1eb7de7477f8471c259289323c62b4447742179b776c5d04a23383bcb95ad14762246182ea2c7bcd32dc29c6d5bde4f8a307f9555b8f6dd5b3711a63f53df9e3e879e1043c42bf1b4f34e0e6a3b4431a9bb5f24ba7c0c61f48a704a843f1d6654089334bb4f2a2949f22d5563c1b0004218c2e85c219b31263b6510c64ba373d2058f2823fdc2020491cea8c9d9de06820f12a2e7ea7ad30362dbeb2c1ee1dcc72e7f5075745ec9048ffac12054bc4f1f9e758f9b741525870f86a0e452b22e8fd41dc28505ec61ad2d9110947a3858d03e696363ed3c984f279d922aad9d85090fe80c2dfe3d498864f13b20d2da32353b989386fa89abd317aeaf83a9374f74a8d27fca79d405cdc188223b25650d9197433237794b88fba97148a86ca9f0fb210d07934edb177c674d5aed6f604288a6748aee92f2c80da653428a9c644adb5cde0663a968699122365c2aaa04b9db1accf9469efad8cb97ac06c39f48a583103969b83a42b85cf30a42868682cf758844abaad319ca67deb1b47274a66d06a3e5b0f859d75b6997c154414b87d2ebc89029b12be93194b52fa6a9899dcec2627075c6b32aa4340a83414e6acba9d34c4f70c1706c91ffa6fe73aaacbef004b112c7d2f45e30e55877e99d4a871d912e6031c4ca88a813ff5f2e9c75733f29fdf3d942e761f611625eda73b5902e2fbfb2c05fee4fdee69d16164c61299994246bd7737905254553a3c368d10d1d2b982d455d2e76a4492b56613797943ae8a95088262c23a94e5f9a42e2af33e3ea2c2d05d3e94b252feb8b422259758ab8bd408124bb4edba40fea53fe09a674314b926c277095527487f0f14b13cc2656742cd6ae5a9609860b1aaa4f65848fb3b6b0802598c3cb271de4eb93ec4a30bee59b28426c88d1a62474399ea1e90290505297bc69c9439ab5802318f3928909cfed93928c6038b3f8cff98b6048dda5eb927b2298820a226b5c12b1da1e8249567cc9e593ead287162004931e35af95b907031193456e74c0309d9874e661ffc220bc4e47febca4ea7c61b6cb23ed428d900b61f4c29cce4a5744cdca5e7861ee8bd61d17f35df8f15794c812d68549a84baa77252717a60b49b2246dc28529277b95ba5ecea2ea5b9892127fded52962a98a2dccab7a9a922b5c0bb34dec54c14dbc63480b438e53114b446761d2799de593c3b996b228ba08eb148e852a13643c448717c1c2bc13b322aec809dbf815a60f4946da89743922ea0a5365bb9c9cf89c2bc55a61aa5211b34e1d46c594156978bc8c972454d7ab30e54ed172c98dc892a20a9398e0ed274723473415c6f6cad3a67f54186b52fa58e74e61b214bd6db9f4fd2a628af7de53bcc25218e5ef629e5d69e47c92c2789f5ac9e36514e6ec14bd7f3d8ac294963f8c94a82a59140a7d4ba48fe381c268ee6945825be8b57c828b5f732967957cf27ae21e2d173d24ffaaf0e984499f595b291155173d4e1884458be623b409936e957a50353bdfad268c575244c676eadc936782ff2a516d499830a9bb49f95a5498fc12bf889b0ec94410a9f49628ae47bddd5abba412c6f932955a8424fdcc28717cd3218e9787f52661d05177bbe32e6f7e4920ae3e4685302281c93ecb275de6d49030fba85239151fdd6e91b1f60843bec8a62e7e658c46df00c370049eea6147dcad2935824932e691bdab2a8597a0a1e24f55901f7ee5a61d86c10893a7702742bc24f36a2fc2e83977989a7db310175b43188a30277d229e68b1a04350224cc9f3bc696d57080311064f41a9e77ab50baf1cc2f4621e57c3574318249d909594c8dd33b24218b3439dc97a09cbde12c2242c5bbb6ea73cb9a04198b2754f6586ba76d205611256a35f94481372cc0361943c4997d5a5957705100639a264d49af40fc6d1b553f14ca77799f8c1f8b9f6e1aa651f4c91e25f25f93a1f4c49a848496c3c5c2e59187b305ce94e6a4bdc30f470505be16ae4e9f82935100d61e4c1702ef36f957e9382e4cbb081827c4018783068939fcc4324a5aa5abf096e9c51469211c61d0cb1f77cf34cbb8248dbc1a0643c3b9c97e585b80e26ebed1cba5e9e1cdc58d4811f844107931239e9fc217ba553a13998fb23cb049192eef33a0c399874df53437785187799a9851107a3e6884923adee924e8283713635df82ee1094fc6f3024cb101e1e73371843a7f0ba038d5ea8f4af6652612012070402711c045248f51e00c3130010404078441a8bc462d13c0e85e1071480035228245836301a241e18161808842351201404844382502010088541814028240a27e196ec03ab41f74a5cbda0cf38737cb323ed8a86cfd25657810116da0600aa70ce296e6ae67566a0e70b7654604720f737c5c02e0d64724730741c6dd034c8fc50bdd6880191268b4923507cf74d766582231df89f0599770a1a4c373db28b2b0e747984ad00cdafcf08c0997b5e6e6eea267b805f181beeb6aac9539bb444f24f37fc683c9ca949faf447fea535fe479cd290c5f455fae73b6e1d5cb06d98220fc824eb376fd0c1de1d4480b743ac6e74a47b0f15e183e4091e968a808de6f2541c8e584911c341ca0bb86b6c938d8b7c3c2b5b544b4461523983f31de5922592fc69c79a4524c8671d92de4c7e09eead39f5d4bfe1a94df4278e6c79a33ca999541f6dbce7ee7fb86a418d54ffd00120f8140dbc9d22f28d7ebb9f1dee3f4a15f72cbe0681c61d3aeb4ed422a08aff1d39bc1c530481076fad49d9cbd92fe58118611efcd5e88ef6c36e3b08c946c14b908e148a6dc8692dcdeb6d7b5af9ff140f940d20c69f84ff2d9748fc199f7c0bb77bbf8d53bdbeaf305628eb7dd3512db1809933c2bbff7a5fda6e21c36a472e0fb4d899ab41175cdde6bf844c934671899fafe9b6045225aa6d60af4015ccc7662a87ee9f1d9487cfe553ed082d1c63fd550089f109f0a6476ec7a7ad90111def3be9d273a26aa725beb92225aeee3fdc6b4808250dcc5ef550e2b79094d8a6a18a5a039dc6d8357c3774190f03370365a7a63c1c251171ae9748682c174f23718da31b7e8203a5cb808e5808638d4d6dcc72b807b6a18fc51b26e5a233c7511c35f57d8d463b36ca40ebd4c484661f9c80837d1b25c6513ac446e73ed07f0e9d13fd339a4114886b7d702ba65328781a479cb5bf8ce1ec300d47a91f363af189a59d4e56ea9f7b9ab99c439bd905f5c0513afead53f1b3046c811da319a4ac96a56eb9ed2007c14672098d6710e0e0debf6e209b3fad0c9146ff7e6189d501df8bdd8147ca7b8f21e8e05ea2633757f4e6f3966859bab60e8bb5c1be05cd7c762000b61b38b6124703725a8808cc2d040efdcba015185262701af9e67ad7d2d63104284feb64d6eb5f0993002109aaaac1112dd71c4e6e0b4bb5e4d97cd9d90ceb3f0e98260ce2bae69033045f53409dfbba11a06654e95522090e53da0559ce056640975de35c9600f50932ddd94450109a84a94701587bffa21592dfb9e65012a0fa4773ae11140ebaafebe8fd28132685d21eca13d6a10f9ae18ec94421dc56084c35c66e1d1eca59547ad0fc0ec170bca1abe70d078bd5c17ed7772e7effbd63e4f37c520dc8aa5b2a5dd5887f3a93080e6504827ece1014f80622f0586fd0d16ab76c4055f7ffbba49c96edef3a47c98e35851308cc6ac01b602cc3fa2f23a0a7e6a87f02ed28826339280daa37f1d8ef6e28012ac3b7992e2db11c3c4767b0fcd54f9a2def88673a7a85ad3d44afb14ac087e5771d3c87903115f818a8250e062f6d1ad0383886173cf08a56cfa2c142da31174c58dd48e3914fd2ed80b49b531898070f7670907e822dc10d19421bb4d67440104da63b2a891a3ca4d51acf651f3c71e361870a357836b71da9ee74a069a5b6fe107877373c9b81ac41405283634e106755661a13990f1ee43a58befc278558c50436c5fdb45d569720729a7cd112c1206b628641d3171a19641d5baabba99dff00902c5ce031d27cee7732841421211974f0002e3e1cb08387e50c1a123dd7dc2192f560b40032b1c1f30413780ae0e0715db9d5c76af008ef83c6ed0f548e6a0d9ee7a387811d6507cb7d0d40fdab60c7a3f11fc20d9ec428864318099b40e6b307b4583b067722f1f9925eb156d5cb4058ea76f8be871624460c1a0669aa32683c0155cc4212c68ee001f6e97a29fa702c27bb2822a855719d837524ec18bb7678848d649a3dfd5dbbb5ff0073e0de55a38c9edb7b04a6dd12d71b34ae2dde6aac54b5f57a3d1efb775e284666143f458a510dce73dfbbec702304ab4c344334181886046dc4a1c66408a01c8b2d70ae21424e16835246a5346d0dae1894169478c33b565351cc4ca7e176a8e929d2614cc0e98350313f9e1584987a8375820e80054cd8f0c08b0e06505803113633f98021e3e088628c88c30ad93daa20163c484fc40afd50a4bb448f3255450e5a401a0ccca1b83c4e32bd7500e94f16a58d3b472e6c8135694c26de69913c7710d4a8ca034d91f673434fd44fb3e5691d2add2003467379045a5d75f175d3db4231ae012afab4ff57c033658c6d6d4f6eb167658f7e374eeff55ed2110f629d4a028503cb647c662edf598abc8f49fe9b384c8d9fd8c05cd5af0d549d3c550297945fd5da01e83faf6967c602eef7ba0baa36279709254d0da59235a64a31b69feddba8ab7b6a2354f20fc11ebab08f3e441faf066b10ad9b25ac15ca5516837a0861300f507c4e244389afa32cdffd7e37eb3294eedd42b1644ccbc68a20f37635b74cb661cf4e9445865d99cbe342c009b91a06000b63ff24116ce487b11a992c81c9b9db81761434f949930bdaba7bbd6c038d55283df3271dd4e7520c73008b4737df2c31aa1888f3b0e1878b1cf0b921327884844bee5a714bccac1ea25bd7f0f11e1b6e82f1d96dbe6a0d516fe8d1912c35f05a0e75b787ed813de8600d653d9c6b17aef7d2fbf5809de265ff366719869ee80311899639a26019e509f8151c866ae27e19840b2463f1408e11784a253050c4c141771070e9670e5cadc8b03d1c743106f610bc51c4fb0a2262485030b4fe61fa81a9fcdffce8654d55a8bf96213db4db24e8f92428c50414d5f7ea1db0927440a7dc31df51da2554386a7a54a906b88bc36eae965fdd8d8657d007f771fb405e35798557e9a6009aef56e2fa71caa281d2d71190a7f09990632fd0a90bd39bf0d50cf8b1a02981f8f9c18c838a061083a9012486c106702d84a56ae81d3e989721f1561cb282b4b0546640a1ea5e6d8e9deb6e2e06331afcc76b697620892e0bbe5e4b2457166de73ab573f8611a1f80b5d6c422c073900b3116aad24de0f3a0acbf719c3ea3988b7180b8014c160535c3871bc6433615e2ece25ae9c9197d090c624b1fd1c0c0dc0a8286d070801706b12c6e587ff95a8150da4896b50d079916720ae98d2bef454ed81c969944bc4257c8bc372dd3d215fca33f816fbabd579cd2d0d56a60667ef624413aa08a31415638ea0526713b34d30661cb537620f9b9eca9e0ca09059b34e11691a16421408d55bfd206f0b868ebbe6e9524a87530e7eac8c8f0a3b3d3c0bb8ec320c000eb4b950a0f5a89df0e3def45b0507e33fc65716c7f25654279a5fc2bbb791669c662cd9ee4aa39ce62389a39c175a76af872761a0d7d6ba436037aa1d7973c62eda5b1aba73eda03bc29ad35bc4e73cd0d34fcc2344ae4f6ea2aa4ceae9b1271ca760f1dbc0a03bcb7fcf552b02ae762167f9c545a6a41dc9e7235f35e42152451c14d5d2e2473e2bb1a7663b038cf79f831fbf1a41399f39950df4cfe176f8f416ac5a09f7c098a38c98b3c927aa2fbb697f0b31de0df2935f1839ad316e184e6e2be53b26e8ecdd88875969f73193c263885ec0f809f6c4fb0f29ccddc163e0a369d4e211774edd66eca0ba7a4c3ed95a8ae40cb70c1c693aca14c43ed386b24c54a524893515afc1fe2048b2c806b04fe8bb54d320e34542fd88ba4066eb37e8d2dc3d1c5c0eb4aac5923d9a76f3f610fbace67f550b5203e31a6e93cf4aa2ceb2eb429338628bb8c8d74bde9079364008916d853126280f980d9dd74e40d3449a65c58bb6e46b691fb52791582cfc56098ab40016e046131a182c29043533120706c40423b3d7a72b4dd417623d49548ae078f503e39425e044db78c0b65a8d5c12b5968e9c4897ce33b75f273e1bcb07ba86b3680161be25abeb05cb2cc30ea5db9a3ae57f41bbe72e94f6d8cc3bab49f93700c6dee1444990c542a8153af88f10494ee60e068957e8b5f945f483b67ebadbff389931e049939a0f6dca66cdbcc92fc7af95ad9d400f09e415a5ddfaa0ab5b495c9848644c8e68e964b84bcd453f28e142b58ac7795d12f3f0f47f20d966f0252cbe851e5e4eb152a546cb880600923287414314b9bc651bf76675cb6ad8129fb192e57bd2a386935e1352ee250d3c45bc5b02d53f201f0dd3199001ac0c98be3486af99261294008cbf83dfcf5f828e8867b750a5a3f6199b715c2a3b2e9fc78cf446b11896e53a15d74145014079aef2c1db5058166d1039dae12685e5f4e9caa0f973d08ff0af43e3310cc9a5e573052ff7610ee045b505e49106ee9dba0a4070bb03f007f417c967e3c455356bbfadf7ec49e47a40c2852004a5ddb1ca97bdc04e43cf650f8ea68bacfd829b8c90f0c9b24186e76fae090eb90a0007ce265734afa1281e43bc97fd59f05333e36138d5b1e2f802f83d18091015291935b2a23e02553970a05e55fa032c6cd4580f27fbe48db17a7788e5ee6f4074a331de655c63453a71d691f68a42db119e9c977de2b076dea2d63df8373c0090794bc017fd689b3bd7bb3205c9c8b9b60ae44a9c961ecb7a156be601ea334a873a870dd16fde4c2239bb8ee4788ca3b839c18cefa2c59b21f019f0b37e30471098be5daf339f81e07688ebea1e0a691e6851d422d3b74aac8d33de2ec6894006daddeb1b0448d6165971ee04a4bbbb7465093ab6950bcf93a930e7c00f8356e9d1bc67da851e07b79e39a579b39caddf4bda6333dd9c46c2a72cb2b034b261e209c301231cdf434b7e828f2c7f4464fd6cde242445cfc43c77ffb02800603bbe3c6fa133f04203b8a7d5bd1cec0efee9dd082435a3fc13bda89336040fa736b11e51fe7aa5ccfc20a6507c42bdf69fab2221e1e382593c02adcbf45b5add7a506c92e9ac02f51e620d37209ad315b59ef012ad22d3b3bb85ae67a4ed1f1a4a12c901c2549273db085365ce1f769958c7b0f1bc64a66dbe8318deabdb8986dda60f4b6e648a3dbc21263225b8b325402b39f406b7d23937360fa309a5bb68c60d1beeb67800a3100047ab552c63c5f777bcb8160ed2d0bcf74bd604723d4fa42f45b13874e9e95186c43835b3b80b5b1028acec69d0f71325de08d5327e9d8e0009896f340190fc7232b2991e1bfd1ff4133eed2cb74ee46c98f7b2a170847355a911f9cdd4c6c13ce38cddf9f9da12caac149f750c72238ede31641f0183f2e2bdc266a4f1823b01a888fa2f31316897220b27bc7461daa80cf6fb489f53d9f93ff6482e016258325523d4ea4d421566ed4384a3db5f5d987aa9401250734f5b7352f0d87befc1dbe41c92a4101e73a0b485923ccf99520071d634a14a8ae50d44d118de7a11743a78e936444da33f07ce3fe6a5bac02c14ee24de0752df349db8d0b2c2ac6960b8c58d3338be231e3a0a641c3a8326240b4593cde9804adafed63a74f0fd12b1a9ebefe57a445a814301addd9afe8522aa3f6f7206153ab1e480d043dbf52f9057adc890c5942f3801b6852d1c845a1a404a83efa945e3860990f826ed5a85574fe5182748320a55046810e52e0494a23c9f83c18c71a462c071b3903cd222be6baa84c8b9e44de1be90a54b6ddec20ee637e4e31337b734f05942b1e473d587bf3a711b1ef22391f2f6601cc8ebc6a92d684e72b04a1c99113ba37d665d60d8969bc13a5ab1da250b79960f23c0eaeb799deb659c22b917ec462a4f3b1a2b332cb16885033f106b17d04d12d2821d354305e6d04ad0b3bd3fe31488089727e858e118a5882e59628975ef7ad0529ad1d58b22b32c00a852d7d66b26225fae6fd03791dbe0992d2079d71b5e93972423cc1c3b2c4750307e12b136b6826583a11450877eae119c3ca6d26d6660276bb2a2d51445e14743b1465846471ebc9a8820750ecdd4133e7956a89034b7b6b427c53840f5ba764501366f91bf26cfcd4f040c261466dbbdf1880781125f3c2a946a936a61697763341490cd65e0ebd9c712e71224408a6210b7762fafd5faef3a9a5871585a6e94033c199d77f8e7989771fee7191990da6b5afacf4c3f5c67e0fa39af96315f44d15a02fd8e7cfdb37831e87e930a81e882b293284689ba1a5c3e7126bcdb4498c5b045ea120e4abbff1b4eb03c1799ab56e1155ae0fbad636244d1a9323b50fbe84836e19a98e52b5a490432a88d2a294441f4d16d1ced6ac6e02040fc82a20cd1b63b2a87f13c12441a199da27b8da08a9822f645096078ab13d8ba83e78a970596418829f786a24274aaac14ce13bb6909a26a42ef5ca50e4af0810e51f85df0ae9e7e0f9a9e749fca9f2a7cf816abced80cb722490ce22b75e441342ef96ca933641dd02cb38aacf8820ddfd85b9385822e5bba7ae972a817df8a66f96db2666e915ae768423ec88f188968a321d62a8178964af08cd2e104d774a34a87c4d4c00fbbb3834cd3a8b2626b0a015b393137efc39fd82249d0b67ad09043473ed2316bc27c142f254b0edde9f1805ccfb2986eacb51f67499b124b08405fe7f824b6b39651a4f9d9ba8753a5b525b5a8ac00b4ee70f035ccd38751480f8833a71680278183e8aec9d776283fdcf445b71abbbd05a6896653bc7d651ba5c680841eedc27a3266ccc67411c0b458d67f63d5a6daa13f31b62eb8b55f5c155ac30873801bcda2c0c6726a64f54527511838329578edde956aa40ca0d8db018d20f5a86401b8f2f8d5daaf7edad1667e97da463b3451f9e66606912225bf228fdc820ea3db5d6baad7c2905e8c22a22ab237645cdaef6db8b36dc9dab536a4edb4b8fdb24f3f250daa0e47cf7924e1a51b890ba5d81fba2d363dfefd2e90bc52a74320796f53465c2683f8be470ab5b2739c76cd445a8f2004b672115ecb8a44c7e29e2a04b4b5c07a8201c512357b4297056ba1eb08f706e259408c3fe2778bfe47e5cfdb356dbee57a0b07a26938e43e3c81147328375778c26e7706c74920e3f8c416dc7fe525b4b781f7de7cdcfd38649ffc9e71914596cc2a1a8a9b1ca11d31346982a5e898880c5dc092585f19bd2d171811440a85995b8fde6b4b1646a1e6557e3f4c95479690c1357fda02fc43e872074bdde2f020ab9647e6c9210bd745e1fd1f98974459fbd8cf1eacef6fa9b5513f524b8e203631c4d520f7da9f0f27153f976a125374edcabb5ee2b6024c33b19fc9fe2bdde45f3619a50912b174cb0603c186e61e065092a62f25757e7a7512276899aeea41c12eae45a019dcf612222d2c1b0d273a91d172cb93288c354e1c76293fcc7d6058169a804abd08557db0a5ab1086082fc9a4b7a74bc324dc109486c8778003825dc43babf0f8f04e2df4c69863747907ce3acf49944c82032de235bdb5a32fd364e9f13812a59aa92c1471b97eb3374791cce52a1e011231eda1f1b87bfd4b192eee36f40b89ac4525f0803108f2738964fd711cc844025c304b5d48020616223bdf31aa4dd557ca1931068551223374dbe4f2668037d05c35847884055e3ab5c152ce466865d15a01d3d5c7b02f2b1c42db858cb49d39143c96426b9a6551b5b90949f2eb87631757679534d21a64ddc36db3dd172c3ab28e378646efab7b6562cb76fe7e54c62ad2d6f12e008c49df8e2525a89169d3f409075e6221e99a93a6a7f463960fd47524e9954df4f609c1ecbf7f23e546e6c04dc4144778635ba1794c04b00af52d6d32684898e9317bf3b460627abab17cd42a055b28fd6e2d58f5a9c6df5b70d09596a29272329197c07b0433454bdfc25c02934e00115eddbd462e4577f2ceb67c44982d2c2b84eca7652f46466548bcd9fb28a60eb0f2941fbb67b2bbfc6d21be3379eb37bcf56c6b44ef24f50861b00de64cb3d6b0c060d955a50f5582222eb2802b3ed1de51bb8af2867d5989c45a92e7c7ddaca24fa404690d4bf5dfacfac2a22c0b7252f2e57fa74e02eea5a1b9797490ce100e487ba3bb892dc693cc60c27720aabc9e8057dd093b5d4d20505918635a1af736eada7b781254afbbd4a94c720f1f73e786d85e86d327affc96c1ceec4e1b28c70b113a61d5a5d15cf859471f435ec632113db6421abb55c6dc95fc8740acdfbaca88f5f52cb5bc31314b791509b1598e3773dae0ed3df6e13fbb43d6b91a1609c5d2447dfd4c8032d083b921e4939953e954a1c63393416d3a1d83708a9cabdd1e34b7bc53c4983f97742da9345aeccf5ee4f454e77c883d2314b1c6c65c2a926b63776e5f2b2c95f4d47ffba37c9b6f722cce51252cb2db3d87c35d2e5d25f778fbd950aa35a99f94556eeeabe5e60212c8484b072b5881cf2791bb6e618d4a407ac5841d1d84ea0053f32eb4d4e4abcf8dd8adb4b8f7d8e4122b4ded650b64245d8363663f109ed85315872e1c3c94dd2fbc6841a0845564b617d80697d51267c3827b588a48754838bd51abb13825cd36b931d0aac8503dc661e99c20946f185361dddab351e32385fa2ceee6c618b20a4d58cac8efd71478dc3821f1b44ad685a1a1d05bfe0087ca31db53adb69e9a4373a72901da6b761b2d5b04a470d90d312607eaf6189a71e1bcf7f79b9a58cd4a763a225197c3578f2f79646cc8b05c435740658e9065bc7343a21c4accf676c40cee25ac331941db3d2b6e27b3a44f56a9019e9e3586225ddd1bc29dd9b1a29a384e151a30ead38fb03236ca6dce87d46081ac9c54ae9254f70d22773c86f2b8a151e89f9c1fcd37dae479dac3207c03324a6dd0a65bbbbd76482a02eba30b02f58699f2cae7246e94b5e2a98c206435dc03cbd31989c0a83292745c8b5c57ff0749402fc3ca04d964d99a6fd5797b90ad30eb9b7b31f30b9fe80e2e666475596f17709dbbfdb54212d0d1a99f1209dbf446610e7b7f15370c45d8af465fd70c690045e0540c0500a3b81f489fa60bc869957c5f51f10e2e3d38beb1f8cce010c5b01ba2422421045219cd85c8ff667c460c49a519b94da79332ae6af53c562859499f8be6ed3353721e334b5087eb2ebe2c1114d9180e9779a9d3f1ca20477a6ec856c423be0232afd67689ba661cc549e08f75ffbf24fc42d234994e66470d1ccf7c48f86a1b48a81c4d61181019518afefcc281180f5d19c45e3f59d138f45c6ad546715851dfb6b8def5c350c277d8af1b072bba022bf1b1f7e1f8806df8ed2d6f6dcc4b30fb6e1700ffea230b5874bc89e9102d1629c0056438c1dd1e08c00abe1c62cd1e48c001535326ec0727683cf4b60bdfaaa56b9f5ba5064c2973f1fc833b148588970712a192edd4ee483f698fbf81a6fac471423c4b97aac52119ae5af7846a74f314cf587c0d12466d756890513df5c7fa9fc18330832df9f8473bd3ad7c1bfb6e6207ed183e4d015c58b5fdccdcdaa1fe1e0dc8b9792fe1c8c5933d91811967c0fbb31678d3fc578f5546f90389e232861b30088774d8a459628238c8554700599994923bbcdb7137eedcb76244b70f044c59f7e105a3822bfbd42e8e8b73b93f2c54cda5835738b51af0782c0b50fd6464177b85e414aa2b50071e2949954e43b0d24711abf56d6e800ae6cf8231d20a8e9ef672128b1fd670cede931905f65c8840b4c0c99d70ddef68663272021b8bb387ff5a0d7ae1b24ba65ab0783ea0235f20b54bff568acf1ec016e7f6e4cf6babb5914c03d55299e6c6b84bba1e92d4fe9254b982bc3f76b53c2bf3a007a6be2e3d18c0b3c860392acbbfdeba93aae1d1957a59f1a809784e3a791f428a3fdf6183f99039506c64624ed6e74f263aa7c19e14d1dccd51635f5e004343aef20ac11ec979936715701a820f9b34733b456e29e0aa83e6d540ccd037f7eb10c9620686ff5a27ac04f2a71271908e01c6f6a07bdb7cb16d84d8c1c7a18dbed310c2610bf5695c3e95dcdda912cacc075c44714d4bd0a775f65d6a69ffca7a7e3977890c910ed3f27fdb2cc51605f7446d9fe5a7e13c48c921b2f34d70f8e84469e6d9b43b4ab2854a1caccd81ff6c2e0d963dea992902e5144288d16d0f8188d01ebf147849a7b1e9b2ebb155f8f2902cf5a7f4cadd768c25fb907b97319fd7e897ae89caa42d9b6a8c066fa17e3b3235587a0376fbdc7bac3afc35c8e16cc58e5311ac5beae69e8ca7e94100268553f4f76a5619f0c8fdfa18eb468af8d51b8928dd351ae37813c47afe73c7cbcf928c808df3ed395a0e7e0cafe003dce4eb74dd71cee51574eaeda133b1fb0a3442e710a6f06ab29e7f33c0b31ca3e3b41094bd4c48548b8cc1b4259c8330dc00a3dcd8ae70d0a77a6669348ca8638c116ba91e9658d3e85866f77bcc16400438b68a58707ab1fd4b02e53814a3c7e2ad4542224d5c597e5842224290b9ea7a9edd8978a8c8fb94f85f837ed90d075b7c04992a167b3fd3e1795b97d87c3a225961b1f4de9d41b6b81f11ee6963a14bc8c048e9e54260adbef3537cbadc8df12b7441ae6e1aa85a58130094f186aaea06607c1cc3d4bfa06ce304b5c268977b03d6416a6748ad3a5d9d4ec8fe94ded80c0a2f0d0cd3d052a69b9129b217819fc2c4150192bc729b5edc0f7609d31a936365ad1f306a6aef0d892ec27834b9ab217dcab7b3a82fbb2dc5c530dd7018b2e102b7ea288afd850f1aca3927042afb6c69937ba552121f5b2c9a78fa21321eb629054e83eccbcfa490ab27717d435126ef5c9eead9964cc3376221e000aebeba8c9d3b3b041be98e9073aa21758b5ea04d0832f04fb99377872248c54a67ee7bcbe82db24a0edf465d8654d0c3ab5c41aca66a2533c05496426e11d3c658e0a773ef5358348c3526acf586ed06d857a2b2b19044522f2811db6f5e35f22f0a1edca8c8d49ddb32fd47443d2394f556ac9710c510ba4d793013f3063c7e78973dd0681cd02a6209a0b4202b596720e93945e4ed1ccdfd9490327a9a90d7fbc23832472af6e420b18759fced10ab618baf16c4043e94d84e296d3e5295fdeb09fc8ccba2dcb41274cc62b9af00f95a0885d51521fd9727c9a24ced543ab38e436ae80ccf88c4fd2ab1f58046132470bb8058387e098aba5b9361a140c824c8ef3ff12dbb787c9d6b612eae4c248319c3c865dc3c913a47efddb5d202d61f45f921ec60513803fc70afb50bd64777b10f7d649554eec1335b980054a1beb72416d78a871fc323589a6aa87e89d07b6f282de5190cc753336c96126820326dc6755b92e70ec41ffc6a47856c204223924c42f7d67ffd792fcc3889e63f5c600258311b93510ee600a2636b2579357ddb745b8b6489dc1ef29703ea877eb23994ce8afcd7f6e66999f30a06431f46e14e3e5c1417918ed5464d2b723fd0c527ae1e8b04e8e6f1dcf5e2b03cc89088f7271ff5317d2239d87f25df731f2c829d2c8c5e57912ebb159b72827ee8389b35f75f29a6ad16fe6e16c44b555aa9944dbc96ae0b1604d59038216957ef4fa29f452b5b27657431526f66125cbb6c2a03610ec9b82d0147c6cc12643f1143a270b9dd52d57335adf404945093315295d7f489ff562949a17b3bf97e1c08ea044dc581cf06d94c156f831e137e0c928ec018772da783813678286d8a0089c0a3317bc723dbe8bd8610a045cf614309e0257014c5b4cfc82688b70127d68400c8a3305523bf276903dd471a6a6da0faefaf07f25d0d97c713c8c1770ff55602d7dac5ab097b26206133af8bb155783333144b45dcbfc574900268996e2477bb7d7fc3b8171a2ea12d04a465af84e82a42f53a555cfecdb13fe2526bffaac5de2197c3a5dc993ebd7c9c77f14b3e86bca1579f2eb38a490b700e7db049e685b4bf6ec9e23fe9910db357521408aa0978d43b66ad8d80d075f49f89147287d0c3089df397e27dcf21f70f82567237c0dcfce6b85f3e3333d4eeef15f53931641e927830e7a0cc89c5d11008edbe92f904218d371beeb1b4f9136828205f1cb710e29b8115da70396a815cd9112791a240742ceaea4caa9a962e5cdc1a7f753c20cc7e89026850a342758d04ee47b4814b43ceb5236fffd5cf328758afbb723f92557fdf70bc16b3cea036f2deca4f4aa2bf7a1576b33d79b110a09f6b292885bccf7c6805e21b0748488ab60025184a53a47bbee1fda045ce314cef2e9067044434ef088a12b3d6c1ce270f2b378ce9436736e21b38c92ca8244ef3ac14a3af6e5803cc8d4c81b0f3fd412f3ef668e34ed585b62603322cef5bd8fa79aba174a447c8f9498ebb8a951545a2a735e0662bdf7fd29cac541eaffde43b21c429ffa4b86ec1725d6e832116c3f6d979641778a698848cb70ae22b03b26abee697fea238f8f6c61649aaf73a199e9d72fd3e4d4f126a17c802a286803884131fc5d0b14e93fe56586d542ab511f6d0e762e83560a930361e55fd88e1a18a7cd2120fb875bdd120b73f3161908119fa0d709f304f9d87efc53a2ecab3f9055bba5a70524a91cd3e0ee610e55bf8be531d90db4d7d949ad615151ae345f0fa522bc393c02a9796d7bcab3fedf26f1e1662e319c12173b200c6f72cfec3913c7cfc58c395d3b025a6ae4a8135baddcacb538e195a2b5750f1cf7e90227273684425e01d8fc67c35dfc8ea2f3d768c3122bff90187d207738ee4d758b776e53cd68da3118d063a1d0f5bf2a2234969fe0d76416fb69693b1e6badc9160d6b36dc69121fe2661911e704be85a8ee1c6d30bed5ddc3398bd76e0180674c9aac92531dc4ccc3c3c1ae721c152258507a92cb3dce4c6668fca56ccc6348c7cd6dac295010453725ee9694c2ed040525f66690b823115f13838bf5031d7827480bba37a936e151d4a45215c147655c01b5ea6b2cc3928c21dea76594baf491c37ab402416b2a244c99b8ca18046c01d22a03828946c15246708e70106ad758347c2f6728d04028a278c5bb2fa491b30737aa950fb2482bba68b5c12a7435a515a8e890088c4aa2a615a804cb91d968af8a7a82ca2c455794fc53b357193a46b1ea1adfd640a53250b7255d2eeaba76095e6744c7463c031de7330c3d83434d8553522cf484a1c3a19750c5a17a5147a51e88f5c49183cd373afa0afd1ceaa9a3b094f7afcb701488a8655431d4b9a827ee08ed15531e869fca16a84cb08cff9f241f4ba8f0285f65c42f346ba943ab6fab32d1a244b1652b6c987374c8dc11c732ec5ad6f2fea1b02efb1dd8cbd1cad184519ce80fd09c1b9db7ef07ea3f7432a999aa46d44d422bf2c4f9ade8553db582f75f8fb2e47566af15f565b95b560d37a9a72e109848ac3633f5bb2a63d00c882c1a059c18ca30c54ba7284465a04e75cb4a8c8e4695416dcc018d169f8a942168a6d486701d30f79b58279cb5db3c09a632c18b06369a218be336273cad4b0fa10a9dc27d41bc0386ace2214127f248d3a4f32149e19d6e89dc6af5f07cb95bec3cdcf3b884982df87ad8609e354a6c08ca6bc63dc526c36e88adc6c68645d2d8ea6192838fc62780eb764ee5cdf44f346d2f41cf5ed6b0dbf0b46dc734563e5d6730a2d92ce4bb2a5c2a8e601923ae4604a3e05c13e81eeb227c5a918498e897caae8a611a735141f7b59ca22138fce786949d91d9c831b418506c1ca03fc8bc5c0c63da50c17a462d56fd724401c0d66e5c85d05a5e48ca310c2b4ff902402288e3a3f6030b26694086c9ff4c1f0d4e066ec3024aa10591d94008b37af412a40d7a0c9814b8095871b0d817a845a4831f3af5dd66be611c05b01d7977c159a1431f0dc1763b774f348c8326176d47460d8c9014bfc7263c1f32a0284e12c6a2b17e64a36932d79cecbdb41a4feb715524f2011b14790be7073739ccc10e38335c4566fc709bb14a447a85e0444b9b597196626524361376c9ef1038ba6cae039b315e6ca9711067e837c3661bfe0a721bd86d2cb61191d80cb6c5d5b9bd91136c399ee3d8b691d98d65e51887534f6c6677d6be0b9dd88cc9a128cdae8d7af166dc144cc86ae5c8c6b46caa02beb045f90d3660b0a4900330333333333333333333e3ca4bfde37ddc1ff7de8d60c232aa45279a9292921209ac35aebce01de7e01dbc8377f0d67401ed0da10d1f0e4d52abe0757486b10e62c41ca48223a94327bb321b1fa7e055a63ce1d2e660724e0a6e8ebfe737785c565f141c4b1e13738c50991e149c94426d5585f6a5ee098ea47c5b29c7098edda4077297396c821f2ed492e698473a98e0b57d479bedef79094e698ae918f197b1129ccd6695ebd2243829e68b15296548706a3e6bf050691b2d3b821f3ebb9d49eab09fcc08cec713724cc9f4712c5911fcee30daf6690c11bc4f93de1ee45552ce109c24b143ffe8393cfe08c10f6311d467d6233d4170e3fb6e36eb2b3b0304d7b3cac52c5de59a1fb831ba6a5f7ce085cba91a626726b7f4c0b188eed1d5b47a5978e0a4c6e6cb13d9819344ea6732248f611db8793a3e87b4505a7e0ebcf6d0217ad8e3c0cb4813d66e3c546ee06d9eb7cb1f04b081ab5d9eaed2b33adab5f082d87f94ef83acb569e1b6c725211d3c0baf652e4731480eb46659781b24180b2779e6c95154d58c312cbc489a7f2bb2fb8faff09225c9a1f9871c6deb0abfe3284a9fc754af6d2b1cf97854438ea7565b56f81a3de4f918415388aec2bf64112d4398e081aa0ae762aeb8acfee1a334156e69baef49bf7df944859f3a948ea297a7f02579a648ee5c1fc4148e678f9e2d867cab580a2ad4c986258f144e942011fd330a5f2ddfa71ccdc7cc88c2df509a156982c71d0a377687f7e8e0592d28dccc21dada625dea3ee1f49d947ac8924b9927fc8ea12558b020695727fca05eb3a74cc509672285e718de849325a7d4d392ae929af0439248513535d57932e1a71c4ff89c35740e0f263cf7499b263269adb984f763ee36d1e953ca58c2dfd80c7fdf1e5fa412fe86ac1e49ce9a630f4a38496ab2cf5c26e1ada698aa6221ea2b92f067b3860f5f8984ebc9936d65b5ed0f020947cee6db72103d6df2083f847f2c094f911e71847329dc86d481a7a46984532187240b33c2bff0d03767c851c72ec20b29592ffb304554116e064dcfaf19bacf4f841f7bf0a0437920c217b90b73c1e3104e6a5bd6beb74a1343787fa163f3cb66e1e342f8d32621dd29ff84f0c2079d6254f6993708af3abe93f1141fa515841b358636cf5aaa3981f0ca3c27bff1f3ce00c233ff20d774567cf40fce775027a942747cfac1f50fa66346abd14efbe0fde5caefb1458b1c3ef871920d8f7b0f5eb7e414ba23f5e0556bd01a3bf3e066a4d57469ed2d9c787043dc6f23fcc776c13bf81f77297898e2b6038d29d9071d07621dfc4f39cec17d460acdd1c1f19caa3e883707377c10739a433e084f0e7eaa34ed992da5b7581c9c34ab9eb482e58b191c9ccf9c2db25f8c31526f707cb2ed322d37b83982abfbaa4fcc698333f39f4288f6d92d1b3cbf98c2aaf755e6881220630d6efb848fc963560d4e48993e30b7ec3fcd64a4c19b481552485ff5c6340c178421030d4ef504dfd8b0ac40c619fced38168fdfcdbd449366011966f0524e89acd441a357b803168601a30c4ea4cc1f59c425bd5eac066490212f937073e943c618bcb4b8decc95a1ff3b2eb6bef0a28b2d3220430c95e6b0fea3142eb68c8c30f8e21ea4b4a9089721cc850c3010c3fb2455fd525f30a656c6e688be1788e497e6735e0b97404617dc0e1b724c4939d892b8e057e7cae361477af1e82df8ad193faf355ae1046468c1ffb19c3286adc6908f0c0332b2e08cb77a78cd1d7e230b032fb20232b0e08590c1be821ba92e68f274d1257fc8b08293c26a32976da4bb8e2fbcd8c2aca08b14aca00ba4808c2a781f89a7d45e953cbe80046450c1df4e9273e8925ce00432a650351620430a2d230ace5cd0147a26c3c5568d1a99749001053fe23f3e5189b858be31c87882d31756db2d212d4b8e2623c87042d540818c26f89299cf238fc2cc4dc6c542c074f1850714d72083094e6dee4de7d31a1daf8c25f821cdfc440c2a5143274309e590638979a2e3586720230947e6f6c163acb83a073290e06dfe9c25a40d1f117304c773f81023a6c4b88a11a86ed5f4f4be087ea8b6cf1fcfa9559808debb89440ec9330427cf769c329a840bb1230427b84b47f3b17e529d20b895dded953d40f03d677498f0d19c477ee04555e9fc99c423f73ef05faa8349ead1d7647be0bd664fd61ee450226878e0a4c8a5327b074e86f71073c4e69a4a077e900d39c8a164fb2293037f656cc35598780f0ebcaa8c0d9afd22e3065e4a15edfd4b82e71c45860d1c8d1e5f4ff239f8e8520b377264c4bcb1ce63b2d0c2b9f6d68aba6916cec9c7b45923a1a52bb2f07290104453864f6d2516de7c8e3b280d8fa25705168efdff6726af8e1e79857f96a5239f9493d4872bbc1e4d4dfb186a3d6e8567993e9ccfd979b4125678eddee5a1a9526125abf003adcc9a93d554481255f8697d36e498c35a8224155ebbc75a1d9ed9c1ffa8f04c730c7b4df6e6fe9fc25b93e41d95b973646f0a7f2cdbecc77394c20fb12395f0b1a884b449e19ca71ca588ee8d3b7b14defd871134ea3ffc220a3f720eed22c77328fc10ed339c87b1fb9941711c99c7c19f70433e881e8ba6d58678c28df6618794365c6ad209d7cc2549ce0ed207ff72c28b5531df99d4a3fcbb09d74396ca13a2ab09a7ec2a64dd0489566d26fca0fe3ce68f35cb6a30e1d9bb745f889472b0f5126e1e0d9fa36bb58417251ecbc420e991a795f0dfaade3e085f29524a09a723db7d32fa78949293f0dca26886895312fe69ae0c1e1d44a66846c215d90ed70e2b64c925249c1829ddbb33a5922e1fe1a51c87312186565c948e70a23e78e9c923252936c271cd718a5ad4a41c898cf07d653a74e416633b5c843749b3e414b25d21a1225c4b216ca203a99839897025367ddc610e39db7388f02a5d468a9eaab4ce1dc2ebb40e54428721bc1c237d20e139469314c29b4a3f214751199226841fd65fab669f2c293908af2e0495a0412a624e10defdcf0709afd61e7781702b4d88b163f848313a40782672f75761d2a4cc1fbcdf902b85c5f62d8b1f5c8ddc954f34d607ff438a629b35ab6ccef8e0c6584915d6d91efc389e1cba87b3ec74991e9c98825d5a87fec9c195073f84e8108b1dc777b6f0e0e794356f26bf15c6ba83ebf669726059b3a65776702d6cc2255955072ff769c7b9a347e242073fd688ec40dad7d3630e5eceee961e678b62b71cbc4a1a25a925264b8c83f3f663f963ea8bebe0e04cdf5f86fb4fd5aa4911e30d6e05cfa8e571109f330911c30d8ebce6ded0b8b4c19f2ca99307f5fd5f151bbe10ce53071d522cb9585d839ba14722db5c4c88a106bf7c443ab6b7480d49831fe608319a79ec65f5e130c44083a795455624bf60887106e72fa9484bcc47b61dc30cde799aa7e89872989ac528831f2d7325cdfeb125916290c10f324d6fad3706bf277ffa24993e77c7108317a1e53c36c86676334618bcf940ae03cd124cd3c4781c31bee066180b2ea576c966e20557d5524564bef34f7e17dccc79429c489ca70c73b1759683185cf0da5375852017184c83185bf02ace3f36cdac11fed1829bb53abedab6919c3fb64819c4c8821fa2e2be3d858ea7432c3897f264df1837358f71b1750557d42c64a4325bcbf62186159c1c6677dfacf6f5e657c1dbd8398e3368baf78de162cb84e1c50b900831a8e0df98faddfb7de0999c8217db248449a99e66f2c59182638b300c181d460c29f8fd3972d49c3c59c48882575953d7696da9fd5070d26a44e592cfeb63f182055b1ce58a184fe8b25648bbe49ce0d5f747e9552fd61a89d104275eed82cfa4907e7ba18156c46082779b43878f30cff0314bf0a254f5775039281b318612fc3084075feef9c24d6c8f102309fe4fba0ade59eab23b48f0d6fe55a5031569d31cc17f995eef0c8911344611300611fca822fb3f6a6d086eb7c79184c41cb9c4b5841842e8da73bfa46304c18f4655e5644323463e06100c125307296ac80fbcdc71322dedf8e08e37a6c5b85c7a40e6efcec14cf43cf02a25252ace63077edcdf9922bad681a329f2479be53843c639f0b3e6385eadf78eeb4371e057faa0b6de73032f8b86908378897677c6b0814925e7ca746731520ba746e2dd2c2b5af8173dad66e224327766e1d4473ff389b62c6e93bc19258e85f7e95aaeb18485571da444b779b5c89157b831d53be6945f336c5ce1a470999c337bc8f05be1c7d6d829bade53dacf0a37a510555931ab36c7b10ab7831c72982c5bc9660f55f83163f9b6844db726a7c29c474af2c72e7563a2c2f73c1fd541d3fc3f7b0a377dac1e3d336b8a536ed55c653e61624729fc6c39bf5d7497983325851762dea8f48e2c878f1c459646f2460ea273bc280c8b312387394a6ff443e1791023e4b01550381b3165a3867cc2c9f1519e34d2e4709527fc888f91d6f368ca612736fb73959c533bc6092fee4f5bc262ea33da8411368410c4e4628b0c03d08413d22f7d1061fd539e4c381f7afa1c652dd9670c261295d26097bf84f3398a9d27ceea52d2125ed234c135bbd587a152096f43fa8fde424ca97228e1e7d618553e3aae8f3209e73aad87906f3b7f1c92f0b27d881ac3a5657723e18739bd234374dc390909673407a17a62e411841b4d6e12e308d77ebd3e8a4eef5d69849f2ba78df0b072dc3d23fc8bd5dae571ec5c2ec24f7f4babab15f1796ccca525c2d97c215b9e17d91c8a08ef3f6b4c1faf5fe6104e84b7dca14c5b6df20de16be5cc8a9d42782a1d45d4ea3808e1f6dc6f068d109db3c7208e209e839298d22505e15fae79fbab74200a89946eeb3e8e2640387193ed347bf41fbc8f43e71cc9a3fd4084f475b91493c7edf5c1b5e47f29a7cd714735f3e178fb38b6700fae87afee20c5d5839f83d89a87b3bb8418427454f93e78f0ef53761c5479e41e7707bf2c2c7c799437c729b583339a3bb68cf920eaa30e7c8c8a31e530c71da3832ff6ff9dbeedd5b49c83511573dc217b8614b61c3c2fadd70a9e38781f793c34724f761e0e84a87cc125f75418dfe0cabd44ccb176f5c92c089552f02ca4bacc32a131c22878193af41c778c1de51c14fc8ce91d85f4b149774ff0c3d08aec0e7382975324f6f6868ba135c1174d299364d487d162821b7294a3e4b496e049fba87c903257564af05245c8d2ecefb72a097e10527aba8b69ec4307129cba0f59f5417290d271042faf5fba8c7418c10d1da607ddf3299d53043745998c670fa34d0e11bc645d15dc21b81e955d730826590bc1cd1965b662d9cc1b0427be83ba9f9b6513089eac445947da4af0fcc0f95c1f7da776b3cf077e84a76fca6678cbf4c077b94f159172ff8407de5f8e63794739c00efca8e3ad4992538c8e72001d385ed6215d8b79b8ca0172e0845039ccd9c73f29e40038f03dca41c2a6567b0939c00dbc288fa255d286f2200938800d7cd91c2b74476ae1d846b9ca10ecc3e769e19dd684c7f9cd3d3c66e14713424c394e9bdab42c9c9e0876962b7786742c9cc91bf75148f9c9372c9c35efe0ad738ae9ef573817c3c71b7c57f8693ac5a887a487dd0a279d44e720e5ce97352bbcdb8ad6395ac50a5985f31f4a6d6c8d4aad0a37668aa7cc4a332ea7c2f76023a36999dfcaa87063b6edaccf1fc7fa148ea57bc8a19885aa4de18d67a57043fbdcb3fca3284941858cc20df691d78c2b0ab7deb447c35068bf390812ab8282abb168159a7ec2f598bbaa247b2a0f4f381a835cf8d8eaf46527bc28293ec55776f992137ee8f7d6482321addc849b3caadf9837849b50135e8478554e294cf62f139e4d5d761c478bd51b269ca834d9a1b2be8413a2dd87d1375eea6a4bf8513a97927b9f94a7ae84eb2396ae634a53c20f52ca42e6ca2c1bf524fcd414434e1d95fa7b24e1a5d4603967ef38b427126e0e326f4bf44f8b1e4838993654f6795f34cf233cc93efed31ec5fa8e23bc10b52e6a348494368df02bb52a4c76480b1b46b8151a953ea3c2ad6611aef4864647b5390c1945f82942fecd914984137a2a6787c84abe20c273b7b69aced4f09743f861b0581fc28518b518c20fe672fc9bb3570a2185f0ad627658dfa7f21342f8311a72c60aa61d4c06e10762ad599f20fcee50bff271a1251208afde526c594b5c0f083f8e393a8f473a4dfd07a7cc3ca60a17c362ef07afdc36c264fae065c8c79afae083a7c9c6638cedc1f114317f242322293d38f741d24abfec6a1d79f0623c6aba089ac3e8c08397af4e43dbb22ce60ebec4beede0fb658ec3b5c73373d781d90ea483db95b263344799369e831f74bc695210e5e0c6d439fabcc6c1dfa4b943f1150eae654e92f9dc342a7d839721d9f12de5414abac10d1d87d9632b5cfb6c83671a39c741d2d431996cf0ac5243541fd7e07465956c1ec658caa9c10fdb614e558fe9bc4b83ff7190c3b8d5d67cd0e087f07392dd3378bdedd1a5ac0e0f33381bdd7bc3bc6570bd83f5b05346062f25e6495932ba778cc17b4bb9376214afaec4e09d057b0f6518bcecc8476390180ccefdbf77c871bee0877e29671b8f17bc145273f061da2c962ef85a23bd31fabbf35cf06354262651f1efb7e0a5ec142cc3460b4e6bc654a9e262684d16885e1d7c482958f0b5dd6247989bf82857d8ae6445836a0527749810217c7b1456c14bde6973850a61b64205e754623a4cade1a932055742beec41ecaceb102938a15fbd3af351705cbeec3f780ebee3a1e07b0e3b753a9fe05cd01056511b6639c10f2ebae5ac9247e99be06594778f3f8c0e1a2678b933640a1faf5b64095e84d09b11568267f769f1ef9104a73e7f1c7ae88104e7fa7344f5f4b1cfe3084e0e3a42bc4c99dd6d044722653bb06c566a17c10f513307496622f82769a93ea423cdd921f892751fe628c71c9b2b0437e58e62f28c06c1f730735467962e4305821f27c96129da64f8c81ff822b612c2f47a10a50f1c33fbc91b246687600fbc4c3158a69b8f5b451ef87d1a6fb9fb8314b20327d9c7a1e7f9dbf6381db831776ba596f9162f075eb4ec100f217b640c07aeab4fe6685bb63206b8819b5fca26967d5c6f001b781df97a35c7e553d7c20bda21244d7972eecaf058c93ccc5acdc2f98aa134e7cd70175938123d3bfe2894e68b36165e7ce8133d473e2cdcb056a1736d7988cf2b9c303194cb755ce16a85bef4c85208dfb4c28ff6917fda9e70b16185d71f555cfe2c4a8e55f8d7b1c74345b0e05154e1ab767c3908396ab44a2a9c9e994b97b7a35454b8f5a9c25a8edc29494ee1e49bdc418839c8111253f8ef963c8e42be147e8c9ddd36ea34073d298a985635cb1fa370bd3ecc3c7fc4ce1ea2f073ecb952ce23147ed0724b33d11dc530289c1ccea3f9c935a7f127fc1017347bc7ed61c69e703e481eb6aadc0937b9698e6cd2478d2c27fc568f327290183ede4de09303a9f50fd584dbe9cd639294cc5ccd8493e67148ee9a63d78909ff35c2574a6dbd6dea25bc99bb54b163094f428eeea38e2cf66325fc28b6e3d764172585126ebabece7c7196fd49f8c1d29b6f4f648c92f0d652847f0f6be922e1479914113465c57490f043aca6f031e5e0ed23dcbca5da97426f089a23bc28a61d474937b3aa11fe878c9d3c3a9ec830c2f30e3e9c644c49c3a48b7025b2cfa25fc44c114ee694e1eb2b89f02d3a8ec73c06117e0c3955d33c840e630ee14a6ad792397b558d219c7416ca3fe410b92b85702b7518c27f74ccac10c20da95f4f7910aea5cc9c42737f50124178919e6adff1658e914038e3b1fa67f324361140f871d47879349dfff3073f6c9c5ffe2d898e1fdc10cd41a3c61c65f4fbe0c72c6ad71d84d2f0f9e0e5a9081297ce93f57bf07269d80e2b7f90cf430fde86ca520dc9fb3f79f093bf44a494c6833f371e9d64b21bb3efe0aaa7e710edae1df51f695e8f3267b90e6eb7664df1618e89321dfcbba43ed391de4a9e83172cfbfc6a2c073fd2ae58173193e5c4c10be396fe29c2fa0f073fb4ed896e1e43a76f7025888a7bfe4e9aad1b9c546fed39d536f86e1ee788930d6e6cb986e6c91b9daec18f3247fd1e199d326af0a312ef8e47ab7325d3e0fbe5b0535a5b0f3e687025ddc392cd61a9e50c8e4d6a0e22df9ce4308367f159b56337ff0ecbe0498cc86f6bca9a0c9eca4756f48cc14d93261e3a2ec570598ebd30b8b93e0a9ed181c18f88ff5af7dc51e60b7e468de778096abf17fcb0a93f66c4f4a1ed821bf37b5cfa7555d2b8e07768161beb3129b305af42a37cc428b5e0474c512aeec982df9192da771c2cf861e63c76472186d4b9829fa3beebb11cbaf35638086fabe0a73877f31012fba6829f72ec9b704ec189704b69a191829f3b9889cb11053f7b700b4bf93ca40b147cad309adda33cc1cfc93d4c158ba810e204a7530869823716b3b2e4ac262d61825b2949aae6ef9827bf045f353a7b234b18f195e066f449bb764bc93992e07de68f526c4ac99303097eb2aeb5f18ad27e1fc17f9ff6a8e41d7dd846f0c27806499ddbaec345703bd88e93c6f441083311dc9a8ab89b5893cf1d82f3eed2df9999735e85e05884c672d70e490d829fb286c98a09047f237bfa851ca4cff2077e58e40c8b613eaef481272947c991e981abed9653a2689685077ed0d1367fb13f0eb2033f567c681b3d126975e0ffe63953150b90032f6cfec366bfb2fc1500077e249d9d255d3e89ae0037f023bf5c3612726d8a15c0067ed8d7f93cad3286ad165e6cb41c2a365af8519a986d9259a7c92c9cbc621d694bcef943167e858995e314652bb1f0d45f2be7e8520561e1b84792263d5fe5fa157ef0dfd3ada66d63b9c2d9f48186fe68ec2aadf0d62b47b0b14829cb0ab7630f2b7d24e12adc8c728b2947a80abfdea227582c9b8e3015be5fd545e5303a8e0851e104fb0efaaa62adc7398537f641ba2bc7b1bcc7145e6dc4d4ea94c2ed305ad424e37711527895434f72f5d1dd3c0a3f4fca986286cdde8ac271f30b17257d6a86c2eb3a3593cd80c29fa9d7f8cc7cc20fedb183af142a2d9ef05288b38b3df127e984177f412c956685ac70c2ebb1f338a6ca26fc186e42c2868c29af09dffeb2df8924136e6a8851e22398f0256d5427e98ea27309cf434b59f5bf25fcf451c75399551ec757c2491f6d78743c259c143cca3a940dd932092f3c580a9e9364f99084ff31855812b6634a1f91f082a58b1e3cb49608094fb3624e533fc289fefb0f153bc24d1edb46f8514cc5a7d258b95e4638eea369c5738e83f02ec29f0ed3be43c7b1ab5584efa16a089dd22a443411ae660e55d4a453f78a0827c4b4f92b26a3c27a083fea682bb93cb5c7aa21dc786bf5ac4d9e2f2d8497aa766df3b9ce4d42f8a9b9d36b3a085f543d8a09f2d6a320bc694ddd51bb2731108eb8e4b8de83b4660908c77fe5d4a492471effe074a8e17fd38c4f871f9c4a135bfbc32746fbe0044f95cc32ed933c3e387ee1de7bed324bf6e078b40ea2a64eafad1efc73efeee8687bcd3cb81edfe6af110f7e0cefce76d91d0ca9af52f6783b90e6b73ab81e5ad6e0db35b92a3ab81d8748afcc1d2e85c8c12b8b2995dd2671703d54ef8f573a38781fcaebfa63c8aa746f703a7a0e2ef391f345e70657d2628769a80f2ca60dce46878e1e877414346c7072868f6369bf64cb1a7ceb0f79de72f5fd6a703d7be4a04572be701a5ccb7739c75f4183bf2134a4671a0b5e398313a33d9121a6ceaa98c18fead0d724a40c8e89a7c5ecfe4af927836f39ce399aabf1a8ff3178926e2ec4f42858ff6270c2fc6d75dcbacc1f066f2a849ef09863c607839f525ef320390cf71c5ff04337d5140f29217d78c18f3653b8ea4bd1bfa30b6e48b19c2485b372990bce59f684a40f72d0f1161ca91cbedfbde318b35af08367faccc741d566b3e046bb1cabc574d074b1e0d55b78c755dd26ed153c099b434d9f90c9572b3861fba543e47ca779f1b0a3b4c20d99a952adfb2353cb0a672efdba8ac52cac5556c5baff63ac3437d31db3a10a2ff664ffcf9b6e1e7ede48859f2de95108d73aef3750e1c5ca1aa9627b8698be53f827d33d99f2fba5e698c28bbba41eb2f3c4985429fca0f597a23b59be5092c299bed8162dd9a370a3e40fda91dce5ba4c149c654578b95876677cc7a1ba22caebe650b829ddff7564c7b61cb2010abf446c638aea486df9849b428ed581470a911896c28627fc8f5bcd42a8eb550b373ae19c78960e82b1c50a0e521d48c20627fc2862c71d346724e0c5c6265c0f1bce43e227c7686bd4d8a270b0a109b7f307edd8983f7a8f63055e8071180e6c511b99f083905c6d5372112d4c50e92932965d1313193652f89770babb2445788dd259870146172940b584bfb221b572b08401461717d8a8847fd9f5b17b4e295157b4997d887a7a109d7b42cbbbfc4938eefeb9225473f6201e614312cef976678e241d093e4e2675f9e28684973aec3a5d5269afec1187f1b87338c29678abb0b70ef70a79aff1289bd036c2550be92b98472184ba1b8cf0e37c1693a6cfb1087f725853eb137b091b8af0673d7c18d357527f4d02612311fe9a7af9c7f9d307416344d84084af6934c2a52c1b61e310ce8c4c276d172f4def8621908fb78314a23c0b001b6c14c2db681e2ce6d01d734cae0e3608e17b1c678cae0c51a9a941f821a4b76c99b3e5941e82f0831c66cc71777ebd06a292abcdaaacaeac7c5e51228df87ff600e1af44358b31440c6697fdc10feeda2b751cf7e4982fb65081f9628b177451aa0a3b60c30f4e4ecb24b12f52c7aa45b0d1072f870813d9fbaa2ae40d3e2053a7eeb61aa6d26de961f4506334dfaefed88d3d781163aaec9f8fb1adc2c596bd0bc0c0aa056ce8c1ff402cb43a0cbfc8835f21e4683347cfc596a5800b30b6b00ae374c10518c9800d3cf871b9a475de1cc3a4f9c25841171f3841170fa851a3460dde2d54e08215d0c61dbe08030c177cb1c51602d8b083a7f59623dfd47182159814a4e0e08264d5c129b79c3938952437aa0ba81eb0410727786be6f76b71f54e7080018651c1165812d8988313527ef3205c7a6ffa2a0c1674f1052939f076112f2257259135356f96b3db448c1e0bbce00d6cc4c12fd390d992c1a3a6145b75a0cd7bf1451860e80aba48c11746058a81116c711b70f0f387db0c39763ce98336dee07faab75f8c1eb9e106ada32eee4ecb23d4253eaf8a791c39ecb68f8160a30dbe7a6c99f6d1c63cd9dba20b161c5b18166cb1050646b0458d0d36f89f39a5c89363b61e8b8b2d2ec070410a4e5a60630d6ea6314f79324586ac1729b80d3538d61dfc88bc5e5ce02eb091062dadd3ba34c35633cdb6e66290b953b58f49738213787101167881811a354ee0450af2be0883051b68702c9ac6a0622f7e1ee4622b055d187206ef425b7cf6278fe09a2f5a00066e6c98c1f7d850219fd4d25c9e8bad93822e0c29832713730af3fa4bea09e38b1680915c8471a80055f05da4003130822d686c90c1dba4314721746757c7e08ac66cfa7d58a11d31f8315b8e223950cb09831f7f0ea2b6e251ee3060f06cc6265708ff3959bee05784201ff786f178c10f7334ef318dfb8574c149e96f51e9a639940b6ece9ec1453ad58c640b4eca665b16ee344cb4e08b5d6a0a92d2a5f6f70e26fbdd7b2c389d992ed9edea9d2b38b235bfa1d6a3d86105e72a778ef139b09c1d557033648d930ace9b7cb470e9297819fee73cdb43b1b414fc9118b2759028b8b6a93f8378471681821f89c6a658988fb59fe07ab86fada8589ced044f52da48f1f19a857013fcd0c346abc87124394cf02d36422563489163096e481fc12347555a2bc10bd1c166869cd2c649f03227b3489535d521c1f5207fdcae1259b53d82e3a5213ab5467053e5e8e314db577711b4cb9ed006113c3b931ca6979cd9d3b3310427a70c95b4729c3aa4674308ceca7fe4f164f74fc9b3110437f465cae1a291f3793680e06d0e391ef994424ef36cfcc08b6079e22323692acf860ffce875de4198e46dc1b3d1833f7bdc23d1e581131e9f63348c45b703e762b4f7adeaa0a203bf62088dd530078e7814e9adbe0d1c789fea714ef213a6be8d1b782aee5d975ed299b7610327b79a4711e9e31baf165e8a0923293b8ed26b87167e471b169ebd269c7666e1857d1c449ab2f02a3c76670a1b2967b1f0259a8ca51c62d607165e0e136b3ec7ce9257f817f239ca945aa9e50a27e714d3e5dd61c76985b72efd59c3c692301d56b85146e3fa833a4f59859bb54d3ac5b8146355f84126c5d87452e15f7d6b06f3a0c20f16730aafc7dd6352f630a9620a5f632bd67df4518a29851bf31e2ba490c2b3f0968c12320abf26b4c207d1ef3f88289c4d3d69fa0c853715bd4dd3dfc620289cb6912c62295f0a924f7829115390a858a9239e707ab3739035b30c914eb81aae1e568c8e909f134e5a86ec3064aba0fe26fc38720fb1f3cd4bea356125bf9cda1f4726fc54291fa61ef1f83c30e1a6ed914b96dcc2765cc2e94b1f65d7b425dc0e72b678f88e1ea42be1db7d18d971e71c7253c2d39c695b622b33d793f07360725922857f9925e149c664f69fce718c23e1c61434e7ce3239430c09275e24856675966b1f4184fbf3924d1de17d14c226767dd49a36c215f54f6da119c62319e1a8c744d5ca1e4de722fc8f467324e36d174e45f841d2491eef12e16f4c1aa53ffa87194484f7e92d857d203165f0107e040b734136fca268083723e51842f028c28485f0936407a9912384ff39b3cd86078f633708df0397bbedc958a320bc8f2aaad53eacc50a849783b07eb36eeb6105083f9c995fd6fcc1fba01a2ac37399871f9ca416aa434da60f7e289363f48997d0c8f0c10932397d58397bf0a37a771817a207ffe8c129cb9d3a79270f9ec6589f6c62f0bae0c1afdcd9730cffe023e60e5e7b7cb183539a3b2454eae0873972f4317d70c1a583ef992a31690ae123998363f9a3935c297db372f03de54aee7d1c9c742ba6ea3d1c9c90439979a455abbcc153f5a0b28accb4ef063774fac852eed82dc7d106ef5d3eb00ff9f38d071bbc8f4e6a9dd3327af41afc8ee73ebe540d4eda8a9d95638f2ac569702673e821cd46839f912c26979cc149e7a3d616dac3bc197cb3dff064d3e797c1495531f75493c1b3b33149511d8393c94672faa468a38ac1491be722a1d3a34bc3e0c9e4e06d29f64a8e04832bee41ff57a4aa07bfe0f95a88d029e8052f7b9691986ace65ec829f6ae1e319f34873b8e0e7cd9888892db2b92d78b93fb5848a18fd3a2d78136361426c89e7c8826f79f278967df96b58f0d275fc5a26623969577022222bf67c58e295150ec248feee5855c1894924a6145eb93a54f083c9db1e3705254f8e9143450a5e6a5289e935240a6e482ef2713c1628b8c96da225a67f7c79821fc6c58ccb92db3e27b8e1710ed5e2728cd56982bf39ce379b63cd39c304bf54ec249c4bc8d6c743865109558ccffa7c26094e8e2a4729a305099e851ca61c5cf9d7468ee0bb472166e690b152c4085e08398e6899c2f5e58be0a73c29c7131e4470f37d184663de48d13104b743c81d875e087e5c21c79572e430dd41f0e3102ec7dbea1db440702d8450267f3167f3074eea891dc5ec286dd83ef07e26bc6358c90c750fd61c2a5a2c0d0ffcb2b90e3a8ea6fb8377e0e6aaeb491e1df8a6ea1f07570edc8eab3ca590c581f315be56ed0dfc1c269329f769481060033f3e0a59f2abb570724c4134a6ce725269e1c76130d114d159f8df79629ab01256230b3ff020f7e6138bbac4c20d19636bbab78f21b0f027d8b5759a0c96bdc2f1d86453b694ef2a5de15a8a11e71f6c851fa6ac3c6b6485133bf038b29854307115dee638248f1682670855e19bc731a46473ee38970abf5a3e920f2544a643856b1e473139fa3cfad829fcaebc21a5c542d29829bc4a2e5b29973f47560a6fc42f420ab7ad4b7286ef706a915178122b872963f7077922a2f0abb327c4431f0adfc3467b8efe79c20714be450a0bb93d5e8d9e4fb89a3656e4303a5a763ce1dc8da758673ef1309df0443458b0bc2177a4e1842fd9999673d4ea39b309b77275889af346b2144df8914afa8e3a997574c9846fffd92c5b65e5ab60c27331b32c0f3999e6124e4ae7ccad29470cb18413738c1243ae849761fad206cfd9b194f0d64cb352ead6ecc824bcf4edb61d7e49f869528cc9b28f849f72ba9c3e9258110f48b81d2654943693db8e47f89e82aa457438c20d29738e432c6af67423fc38fa2883947b349a66846b729eb2868ae93e7a11ae67d9e09f61430ab5229cea286bca5227c28b219484b31c45af20c2b394fca14b88d6371fc22d93ec3996cdaa8a21bc0ff5d01f47918b6c219c1c4426757c84f06bdc73902a1d8493d7c3741b9ded422a08ffdd53e64eed953b32108e66ef9421de2ad70908cf23654df0f30f5bfec1d7709f29b2e32d1ffde0888ba528967a7cbe3e78a9352b92d1dfb6e3831ba135dd6a5f9c670fde64694bada93175f4e098650ec5c62f36260f4e5cdd5a0ea3078f030f5ea61c6bee204436b63b7875de1f840caff0cc0e5eb40a390ec283c831ab83df1263989842072f4a4a39889123c65b3f072f7d98e39e88c90aebe5e04627390e6e4e6917f5beeecc818393c7db3f9387cfe50d4e270b6e91376ef0ede5235aa749744d1bbccb1c25a2648397c390cf18d5e39e5983e3817f320feb715d8a1a1c1b19f1acb1b672d2e0fa892509963b98074183932ae7e6317557cc193ce94e131e7d33a02165703c89aac5e8f155f964706ce63c8cc1f2e6c818dc48313c3226710d8bc10bf9d80e3eabc5360cbe44c8299face4283bc0e085c9e123491e31a45ff03fec0e2486da94587bc195902991a84f92d3053f4afa63c2528ec25cf02a7d18973d795bdd2d38e9fd2b47f7214b460b5e856745084133250bfea754b9b3ad58f0b4cfa34a41bd8297572b86902243f2482bf8d27188ce548b746615bc8e9db3974905ef3a96d95c15ea564ec1cfa27541baa30b0335d6e04fce29a79c3e31c73fd5508313323b7a98bd37c7d2a7c14b52eba1e71c26b9bfa0c17bcb29575a98902c6c6a9cc10fd45c2c977c7e50c30c4eb5a492d58eb5366519dc4c1a1d7358ab99f385b9e200c7e00bae4106ef3dc8df352b1d440f1a83ff95917cb3e5387fe41083ffb16dff88ca61f0cb6d523078b162eedb58096a577dc1691993bce0c714d27f7c1c540cf9d305b727d347b221d6e0829f43b68fffac3b47c6d4d80256eda66a9fb121993a72ca9152430b4e287f0f5972eef5ecb2e07dc584a5a5160029d4c082d71e76567d566feae4158c2dd917b493a68615fc1cc40edb516d35aae0dda58739f8daa648550d2a781d9322f685cad86b4dc133f1b39f4b661f41ab21854a225cbdc4b3db3f45c761f25ca79428f81efc6f76924f179f5f64208c2e9e6a40c189317956091ead553abb45d1a0c613bc0c691f9a48ac66ab38c195892cff0c25175b2970810ab01650a3095eead452dede71b155bc50c1162fe8a2aca67d00b7c81a4cc0446d6525cd3d6ea4da530ea15e61420ebd1a4bc0c3ab3a66a4bd1a4af0a3e418d523bf6b24c1ff782e33410d2478c95cca23357bb8ce41358ee07cd011933a0acdea670d23b839cdb6f2dc45bf0b1d1f6a14c1cdad31720ec254938670c0053588e044f5285ba7ef188217a3d4f26d9ba7206b0d21789b377e7387641070950bad2f0f0f912daf48d95463f0fce7670d20b8f943baa5af508d1f78317d1c8597dc686c54c3075eb28a3c217610f56bf4c08b1dd39e03ffe0f3b13578e0d6467d798efe0ebc4ff2d7b93e7fecb8d6812f2556fea1c8f9a6a9460efc157b8f21fca4f848db410d1c78221f85b49023dd6adca069cb3ad5f07899f56ad8c0e9f4183643566ae157a7e4db964fe7a9a685174d93254b9b5938d1cc276f92ee78a3280b37326bc5dbe5dbbdf3a20b1ab1f0b5bd43f4f54fb1013460e17c14ab932f890abcf8420229f0e29c8374e0cd0a345ee10a67a4a245394b5be1c874960929fa8b4a8815a0c10a3707d6410aef1e1e73ce2afca02124e4281d55f82d39e88b1239346f4c2a9c50cb7d11613c5f5950e17cb04a1a73189e39f23885e313293964ba47e9834de19da4cb5c67bf1e79b0145e5aaa0b69aa228597f2f45cc8d1cf7ab246e1895864b5dbf049461285e7bd1d9235191de51e0323d8a20b1aa120bcbb2ea6e6ccba5c3a68a59453d88e06289c641d2264dfe827f6ac4ef35a8f9334f3ce41e5f65852746c3ce1b4af64acfc49245cccd3e8841f29a7f021f6458f5f2a3438e15ae80ed3d6e6686cc2f18f5972e4f46868c2bb0966131fb287d9c74cb895d583a68eee474303c384118307c48006263009198d93b4cf6040e312cec73fd541ce1c96a024625cc2e34443e6b633ca448e9b5425dc4822f9bd2e4c0947aa7e23c3497e406312ae6a76da761b25e175745e1725e6bca69a48f8a1e55053884820e1a58491508f5a2585f8115e24f7ff984c39d2d83ac2f7d0d73c8e36a68fc735c2cf41960d29d46784f7b92ba5c71d5c4461e6716791f1e63dc9c358af082f04092a398eee72611a89f043aa7b54f76977c88108673de6f83dc474eeef1cc2d99088507eb51ed6c410ce673b0fcb3b3afdef42e4b6a22a59ef6521de5539a8ca1e2ca5c8488f107e1c7b5699746d15680cc2f3bb10fe628809c297ae18a5a7c3e88f628158a542522542d6ace63ebe903420fc384b984e9321c337f8072f49769c2b578c4f1de407277fce2629c4e8e9238f3e34652d27ef51976a5e26d197eda5154172f0c1fb38233eaeb2ecc1b1b4f133db512fa0a107d73bb67e992a4d1eb677061a7970ad2622bbe51c68a08107278878184248be71e3d1b883375152d49e790fddb71dbc8be930b2265407ff553ec8418e2a74f0a34d26edb183e409cfc192ad16abd6146f49096b8d918a395a0ece07a13f556d44230e7ed2ec5959b4c39472c0c1ab8fb6159115491de40b2f24805b031a6ff0b2e5ec9d3199774cef063f98921c42da1c297ae6f8c2ab0d7e1ccb79ccae90d35684061bdc482a41c634668af28a69acc1cf1e39b45384d5e05ca808b229d633a6541af2940fb9cbe9a3c1cd39a38f7a449be990c6191c09e571ec2853766c9bc15b7ff140727f06b9b60c7e871c7a90c10fb2cdf585bf1c61b531705fa2219231657116eb115b44424aa798187c390ffad42a0b4356b1769e325612369f11338520f6c126248a60f03587f8ccb3e182b8c00b10f080c617dc54b38f1eede8b56337a0e1053ff9df588748a769ac9d018d2ef8bd1e7c5bce2c122b840b4eff871ea22593c61614abaea9913497d4d8b6df88f513a9a6a105377518bdcef3a65c9366c18f5268cf97333b738ea48105bf2d6a7aceafb973ecb98213ca254be890ade0a5a70eb36c39c8c6a80a6e5db8e49155f0cec1a854f0e353796c6c7aceb1e262eb042bd805d098829fcddd33cdc4b8d88ac1910253321540430aaed445394b9675952e5170c58309e91edd52b98602776b5b25325257e3a7bd91557c825f79c343a8faa8734e2f136838c1ed28933be6b553f9c409349ae06a872d1afdeb3bf630c19199edde90f925f8e9f279f4b14b3494e067ea4ce96147a6393322a09104ff25bb47c1e3be889e41829b7b735839a87d84466dd553bc624decbb3607afacb9e6e3a36104b7d3ed338fa56814c1cff1f44732398a06117c8fe9e3991ccf07991c34a03104ec3e4aa6ee89da808610bc770d5e1ec60cb1262708defc4848fe7cf141f00061ab1b95956c2dab8de84afe33c973c77624971f387296d2c5687e631e4cc3075e0ee222a5b1e84d6147a00b347ae04a38891e476a8e83845790041a3cf0d64224a4740bc933b883c2d42a3ac6cb5536694c7a69e860cbccb8cb2e29bbcce8aa8c14c22b648ec3252eb668e4c0f9d06f1d7ab686988368e0c0b9f671f1ec48534e1b1a3770fdfbc4a3d9102eff84860d1ceb9cd13e6ebeac4f2eb6bc08630b3050701816a05560462dbc943752c59c6bb2f7dc8119b4702d3349aa68698d1a555f80b13366e1a5cdd41dbc86b270227c74f5314962e1a47c9329c33278871558d4a215dbd52255ee362f390e8f36f2fb0a3fb4d0719a438e2bbcfa9446f36d8c291fd30a6f4a63ca9d31acf05346d8a8b461269255f89dee293586c7fc5155781333bf59678af4b1920a673aecd248539f6c54385d696424b8f97d4d4ee106af0991a9d9716a4ce19987ac3158cab210520a3fc8ca07673e299cdad05bb79d517877122dbb32224f8828dc1c07eb21797684c2f758631e73ea008553214a92b3530f72e8f8849f2f8f6f867464966a4ff8416ffed0622abadf9d70343dc6b2c709bfc62b4fb466e4ab78139ea598796e6e4d38e79fae836c33416b68ef50fe03137e0a2657de1ea690f5125e4a0f35f96b7dea534bb8e13dc8c16f07aa15530967d5633bda9794f03ab68fcba1949370726945cf1463dab428093f8c65f9bd031ff1c922e105f7b0963fbe20e1fd47e4d4563fc2e98e93da54d48e2b48331ce17534b39e7e723ca311be79d49683f530a964b88cf03b70e9e8e55e04d9a723781ca33314e18b847ccb895ae78c6724c2c951da76d0b1bb72cc20c2894f95b3d2d9f57bee105e0eeff5ca1355529a0ce107b7f12ab318f3854e219cba0b3174744f88b32c4dcb3be32ea55bac374d06f3c8caa4c283f03b44f1118bc8917546108e66fed01dc2a7e5c01208af62d68890feb2ab2a80f0eb62b68f273a3089fcc1f5c966b13d9ef8c1c9e01fa3f45dfab0923e38a5d1b3797ff0c18fd44335cdc27bfa7f0fde8f45cb79fcdbbf7d3df851a4bf27f67fc5c89107ef3d0e9d2b4bee8c4be3c1eb309447d25cdfc1ad30f93e779ebef1d90e07d9265b07e7435d75103ff2331ddc181ea6e093d2d46673703cba972441e33f2296831fc4b4f153afc9cddc3878722fe629f7a4dc3170f06efb93f4ff779027fa066f2d438ee4a7e330f36ef0ff7d6dc2e5c891c56df063dfc810739633d8e047464ab9af424ed98233d6e0686c984b31c786f7c0196a288b787cb2b5310dbe475f479d91ef230dd1e084b449a288f765ca9fc1cf72c93c58c80c8e7daa9ca9528644580667d663c911aadc543a32f89d345888cb6163f0358568c65c89c1f14054b335fb6c0e5918bcaeebacbee4e69a0383ebae5e31878acb53d517fc943c0a1d741879c1cdd453c9c3aa762fcb8c2e78ee1b62b5fa9f7a79580833b8e0c7305ff9349b2db82eb2c12635a5091e99a10537cc7868a5edde285f169ca9c98e3e87cb2fdb61e1b2aa78cd4e891a29ab37b96e91f20aae45becc71b48c153c559f8f3fa70b39e5ac0a4db47c4aa5c7cac7bbf95f7d67474a05cfd3d7490efb7328dd14bc34bbd9f00831a637430a9e7b581dbb07761f75a4e1408d1a4e9811052755858d51161dcf57a0e047592343d966b7cf3cc1bfd41922d3d638cc70829783ce1f623af72c95ecc0173498d104472c46df768f8a89640613fc38b630591fc7db12aa194bd02b2eb6eab2264e666653c7a8b4fe511382194af0725dfada0cd28c24f4b35951ca2f8404cf2ab8a85a08d6a8b10500dc30e308acc86c744ad6c59667a894657694a24db2314930c308cea44a9875190bb57946115ca9243ed9fb23bfed10c14f512de5b29bc71e3d660cc1b35c29b7577d9c334709c1cda1c3346bbad4586d10bc105d913768464bf00082ef71f420da27e9f3b366fca0ecb2aff77439f5d841d4af48ca9fc2337ce0c7fa383b6bf7356a7c61460ffc9aa88f1d59c87970171566f0c01b9f0fe5993eca5d31e2c18c1d3839fd85e4b4195386ac03bf2ea4106be55353c766e4c00f36513296c77bcc51b89881033f4d4ae49f1ce5067e2c19daba932c821936f02c4c6c6b8e8a149d530ba7430ef28dc84f0bacbcd2eba3a3dc453c347314a29d2db3f0e3e389d948933b458981116cc1820d5938dd414cb5a33f547446868d58381d33425c7f59f48e030bd7facffb7e62c45ce52b7cbbf2f90f993762785ce1755de8988ad8a874e903e3e10182c161c16824128642c1cd7e23006315080010541a0c45721c0792381c7e1480015d1e1428281c1010120e101210080a120a060806060008060606000006080685414276608e65301f113ffb4f02b53e38081a6d1e2e448eefe4e0fb5cc5a118bde5a418ef40a7a3ff30dfdc617d9b34ffd7f073d12f7e1bb37969b31c27467445e227f755a721f8aaf4ed82f77e9665f5bdba1d93731f72fa089045db88560ebb5199a4d834c95ed3e0c3d8e404d1a98cdaa2134f16942e68ba9fba41b2ba300222fd6a06b1c1ca6a896b6ccfdc63360f18c3951a5ac915597f4aedadcef6e00fc63a94a3a3b4606bbf1e2970253b672a21a18e88f40dbbad6a3435a3816bde8308bdcfcb169b680e54db13f5408b1acb24ca84317ee7365b9dbc93794b5579120d7a4ae5240048fbc521b26c423e8706e73d5f85f5ac1c5afa60d3a589fa8152aa14171dd0cfd013d14c91443aa1ce2f0943e1a836035a3a983c7980437517be3861a1f8f79b8c1b1f927fafd06f66e40a472275af5edc8473ad22bf37e0afda5492f7681368876d3003b81786e5f64530fec6c8e0351b39ae5ce166f2c92c2e4f8d4fd982f223b601fc623f544a3904486588ffa2f4609c33ecec7c0752a2af78c9e50cae72365db4ffd4d9d5f034c4951e28cf8a206bc3158b8034ff1d147bd080f7bb7c5215e1bf86aa9ef40ebca6dc46c27dcf35d31a2dfed9e13d1ce94590fa7dea84d510c01c78a5e7e03ea7262b79991f097b16d45de0bc047f6bf565f0d5bd5466c0150d689bd21e2d4b011cf4ce4d925ee8b33a8c9d29b4da52c74554706903e0f8fc281d6b396f1f8c7a4b0b1c7cfe80e15baf1acb1670945e9f36ab648e2ae2c6d954997c2cc80ddee4ee6cb41a4e12ede533a4097a029fa4a4ec773ec05976c55a48b8f09349043b5b4a28a671479ba5b3069e22dc94788a66345e7fb8cad240ac505a4a328a82ff007dccce8d4ab68283ef9412e3b125435a8180fa0a4a56afb162ed4be7443bd5c403962e29574c00cb41c01e849dbb75a9b68cf96f89d63dd92d6eed27aaeca953f48c9963ea2c04db3bbe3d7f183d25a25d32a480d55f84827834a980560455393d3e25adda443cc509046da84f6a044407c91208f7a3f80a52b9c0cca6f2890cdd31822bc35c105bcbce2f53bf4d765625b1393ed2d44b9268cd2bc06ea4e09b5bcd5bac084fed0034fb21abf6115ab06e62168ddbf0feb95e4f7a4ce9cde2074d78a9d21c6d57f7b5cafbd44dfc3f328e2e5b5ee76589391d0fd824bbd2c3b7d43c9e8a2ad048888d77a5745e48aa7f2d7e3a12101ba7a136ec898891e432fcdabccf66ea0f52ae4d4dcc70754345454b8a8052b684ffff4a5f26add98134ee9460064916abf75c718583de2c9ceb02e2b4e15afca12711fe70cba5fb1bc39e9e95e39764a8cbcc907b0dc5c5486c44c9ca42be1102f402ba5b95234f000fe40158a79905ffbc14f40d2525f74f40a85166555322f1f70d2f4c06fb2b339a1b2af326ab74f181a4ebcce5d6e6b32fb9051a7e9cc2341be933e18cdf05087ece950e94975163b55431635214680eb1e45e63900ed1901c956df73349cc845b2a216ab50ef40049e2a0fc6b9bb803e146d5aedb7e4fdc789983c9ed8817ce44849c0ca78be6c68b159b3b8a97609dc37edcd8158226241d48b004d8f039933a65a25fa0236cb4cd74d06c94966ecad561f4a198f8487c8518669a09c76cc6ab824819b89d942325ca44e8dd2f9795174188ccc62a4d2ea26b5656cf15d7b2eae7a0bca35a67ae7e83d26ef945f036f900b1030d8f107ec1700caa943234993983d18a22a49650d76d20897aecbc70e29c154e2578275b2af301cd9257af42bda9126b6a1b51d3cc92457abbf8a38e9985799d8b2d951ba41710f283d174e059d883163a0ba2b624bc6ed34d99ce504e31b2c173a342ffb6f102b49e09585ad229b0cb2bed38bff2f439d37a65995dbae0abbc1048961f62ee362f04b4d213c22eb7ac8b7342784be7ad77a30a41233bf7b46ecb290f83833f9bc307696ea4777580c982a941c4f715fc34589d90f834a4adbccef9fe469290344b86a7dbbea28281f0561a5fbca2408e420ea552337eac8227057a935e8a52d892e0334c9ce596c635652108f790a16cbd412e96f3a9631fa5b76cdcd1d096178a1bca5a55a454cef8f0f51949590312af52fd24695dab7da521e9811855046b01d728180095e577b1c659665fd3208243b8f42903c07959e8901640a990bb89bc9cf2b1b4b0a014182183ea944e1013da0aa376dedf002b4136c0533c1ba5ef98054da57ff75b7a8ba7f0905690241fbebabec72460bbe53b34434e4158a7a4c3bf7172ab95a54de9030704f411f2e3560e193d60d7a90b8a68fe143a8300f0acaa5600cb64c89291f98d8fee99156c19c26cb4a4c86c005c5b4c74286f9e05416ed8adc9b0443dabcd45031a54a44c719b5c5a3f1d93b47208fd96a81c9eeec29d02c5bfb7d31cc52c95b380ce2b6ba652f96cdbd52d64d609064a090f33b5bf85ac07c2019eaee010202013b6c352bb2ada2e5dbe4661697ff80a0678af24fda14cada154ad109d768a34502f1ba57b035dd4df1e3662e40725b987da53ee41685d6fde29cc4b342adc9b43efd6690cfa5860dedef1a4361a948e62504cde6d35ba2d5a49d758aa21ec1439e477e9424faf023dda2409af5aec88c2b99ef188836c7cc52ba3de648ab5b38515a91687abe5cbc924935d37f1407150cd2345a7b90f4f2e6af4e259950ee6a07676a7f2301b1c4df9ebf65ec7e7ad5133889599596d0595e355e213ea6e7bf67101aceae57912a7985c82d11e8475c5e4aac4c3f01d09cb25441a6adb32a478309590a6e8a47d3a1c16a3c61608f78e70e7b7dc2dc45af4983f1c94cccf2669dd08f98f5563319a15505053770e6f11298d706013bcf3c60e3c727feaf918fe988819a1a215ecaf25eecb1cfe29232477c21f97a611945678d33728766099f9a14ab62dd78cc888b346b0709f917598638607ca9305263612d850c308be4401402ec908f0454546af35427ec40a97580069739498b124c803d968a10f1b8a7afa46ab84ddeb2511df72a696ca1b55be0bd0ecd58ec06909711c7b5a46a28d5547ee7cf1daaffc286401a45201e09ad4cec8b8c0513b6d0f097de3e6358420431f80bba358630827fa5459c551b535731f80e59c2cde40c25e39b763f82009b4f293383d5ea81074fda72bbc32106e688a10450914041825764d7fe7f58f2e0081c24e56152e6e8e475250be06c6d984c32752011dbcc593b5fdffbfeeaf99c5022f40395dbe3bec2e11dc014c3c3a2311c13d063a2f0fbad1447b00f87c80490824da5260aa5c85ca450b745158e263cab2ce3196d4056012db99b102a3100c6a3f99e76a64bac0e628ae133b3aa59006bd2d43959391a90cdacc87ac62a02ee4288121dc11159330b63de8a333fc1d77968bb7faa4b0166a25258b4e4310767b7a0ae651928a396b91d6d7048fc6fc437a0ef7237ccd4d4e66b00dd59f29ab01b4c9373985b515a7d989d8d5c8afad9b9b72a3054e9f8e195ca45e01c234ecb5d4994779a860d15374497bdee5f84618095df991e2744ae8a492ae497b846f48d88e4b58ac7ab46dd8912832d97873e79925ef0151a2d5a415c4b0de7a664f6a342d0ee6b501e22044b6513ca105ee3ca45117bee4e33cb01d461e78ed9c4204f99127636cd27ad2995adfe6206925d63354a8ce1679490e0f7895f46a9384f28f8c4a9cea12b48b675492948cd1c96aa7a9bfd9cb71adf730b7d83b4d41c28781d44e55213cfca21db544ed4b01a96fa24c8bc80f16b34abd5dd1b6899832e75082d3261a560aef9aee4651f5a150498e30e4fa30acb318fe21e917892ff3621c4646ad88b2cfa491a410c4a19df7c6091657125e3f49297b7a29809c2f7812f1e64a04c27dc801b6248c043de9bd5094749de19cd6007d97af0837aa29414e5148890be1f44c0550d3c8259770c19462f8b426bc3daa66ec46d72955555e0daf4245bc289eb0c5213e4353d5014c141575761f954003e3d0381c8e60a9a3fbe47607feab92f4dc8c66a6edad89ef52645c7d3f5570a112f49ec6a26e92761f6242c5ff7634567ca4fc4754e64e5dc591501639fd3c03633e8a2c63ede1316ff31e4988257ef77ffbcdf7a1690f58f47c9c42d73bbde0e289a73074cea6149252022552b3fdb1f9229034ea5747a56744e6707b8d03ec9245596b9a45173a2e48c1e24a0e1c0a6c41201584a458099c7f64a85d894fd7c98d51e352810e725f2a163144a8d3750888740a5e9439186063ba8a88209cd34aa2f4e11e91e0eb79f4ddba3e334eb5128b6cc825536940f9114ab0de49509212767c01867d7b918bd325894adfa7fab8669db630a03f7f3ea91182dc083cee7c83b1e644a082ebb1ad0b8ce949f2a433e7986f08c20120b1651fdc53667b0d20fb9a07bd532eae5700d443a401ba89f34502ed9f5477b62a52c0c666ae6daa0a4c659fdca3d28aa184d1994b09d9ed5661c919d488dd708f5cb11803e6132da66803d121633adb0b90039cf3170e0b37e65862bfca93611503c61074734b1535dabe239326746a2902cd32a92a0ad1aa9dab303e5c74bb4b2713989cee1cdaca26c402c1c868eaa0249d7ad4af0d6795e3d3680d09b79dfae20410ca217cda3c1760ff686ac454c08548961c5996541617154f0b87333c72a254de1e097bb386516a314600e041c444a7699478e5b34b5385e3f226ae00461af8b234efbf4b22d1e89710095321397a22a98179e92936eb336ba64d1bd35f7f30d84d07f344595035b30978e9b6c9311cd1f7723ed5346591f1188be49540c62932a08be7228441999a9d7a9075efd56ce0034a8c000928ca8416f91dec4a7433f24562e75db5632be999334f2a6726b557845a773768d8c9b8495dcdd4e474c6913676198968f139478a3f7e4da5a1821e8d25c52de7dfb4358ab744c8e44ed8a2e70a3a749341c53b230937dfde8cade31f4db385b80239c1e65f29b74681c5d8f5e876f113aac87ddaeaf0da31c1ef83695c3253864d4d8329a37741aba91c3e8a664a83f0b7eaf34b87b879b1757469a62410d51059f44711276347a1c5a3c7c7678d2f3a75368ba8c0174a1f834c1dce04c7c4fb5455f438e008cc656046e1ce7ff5c44b86bb6ac6fb3438021ecfa34b8e70ae7718788987121100e52f5b6300cba7ae0f7e0aa7d9326479bd643658ffd181b0c1f01042f5029cdc15d051113fd001a253c10c78b3f10357907dc7407ce136c8ce71052a0370a826f2a24443da59a7a38c2807410f999029f05be30586edd3b7c76dcdb8cf23e5c88df94e1ef26c93f972c6cc04283f90b5cc8f3afe258b0f4f9c19d1791ae707eaf9df318fdbf526fa68cdb9756d9f0ff85c2b923ef549a5ec073d4ad22f2904404ec439f7fb5898e27ac347a2b0b1a1500eb7f6f5635118d18852ac24ebeb50868c9efa0ae0cc5d007a401778f2e11cc6877d98036bf02fec3dfaeb801338993300e53cdb670634730fc83c9e28b1e80f620745123475ea5a4252ff5d807aa8542fb0c6f03bdb04e8525d45e9e91a3ec93c55016a322d8a7f02e8aad2b2be3d708ddd5d779dd63b89385111d5d8367e74d0f44be72d9280c1cc985debc2eced4503d3f7878fcc9b1bd1904df9d9f7eea4bd11db68b4f84df69ec13e23c66896b206517b34ebb6a6faeb6aba287327fb50c167388ca8f4cbb17044f47e952efcd10cb1e9d56c017fc51dc959d88c5bd7fdaf374f10fc9dfa2b812aa11ff6a9280e32e91b4a558c522727a8faee1a7ed56d7f00d2debcbbd3d9f15524c4491ce740c818957da3f17700e6f4d2deb0a37628284503368c8ad4b4a753eae0a4d637eb130700519400d800ea3c0c686825aef012d8b8fd9c8ed0b896918621602d239a05e24b81cbf602b9d0fd0b50000d3c38c7af7b035c6b9d8b56f782f5957386eb766d713d478c5f23e3e2507444eb57a78817369d02eed898104002d7ab2bf811f05f0bf1ada8770030925b691310db3640f63a41718a91e4b5d5a811222daf022e668e0cf15b5f4c1f40f4a14d36c3c7a7cc897444652ea15844500d1bda8c6fdb8c9946f094d1a96906f6970711a21cd58598c5d391bbfa0da0d26207503a85844ef6c57bf8683cc2400b9cb0df71e41fcd2ee2263fe17adaa5ef808f106af4cbb2a01c25b09da9e166c64c1749a1a04edecb6ee4285d50607d1a546040e8f2671d9a63500dc6a8577bdae4e8dbb37371dd292589c2163477b47401eacbb169348e6f2f1d141bc0ca8d7d2aa6246e56a4949c6e45f2ea7a064eb745193fd209a9c2fa0f38a01437e719a862ad0dcf6e347ad359e0685f6c6f138a069fd5dcc685f5d50031d0f9607636e61910b61e9e17ddc846dcc89508ad55a9045e1b13b70a17097c4022216d2102e80c3c17b6772cdd19298762b73ebbade239b2146a8db532eaf6d378ff39acc89550a640a46bf1fc8d04f7105280a6858c3e9100aa50b2f32b205fda164ed2faa9613b8b34b6ac1f1fb26e684c67f17ab955bc686244bd6d2e4124e669db06470e9c2f1a9804ce35a3eb54d1b3137bad0f8cb6d1140f8c235c56955be911004ca25d810472a90df4b6d1d0cc026440b77f83d2da8f0a17e009b6286dfb5d3f32e22bbce92081572c018b5839740794c965b8586434577dd6b4ddb3b36c6a77ef30745dbad89608b3ffd70f06d442ec0da09164087dba36f038c2820d3e6088079a6821e09bbea05c14801a2e787160dd9db28b0e2414990c6affd7ad95ee64fda22f1e1c8d6134e2054b4a7956ac8d46f5bf2813e45ecba3690cc10991684333e92900dd4fc9aa2980a385e63174ff12f998cdb4b39dd3cd4a9aa56d61e93c5113eb3473ec4d9a4c3b55d865d770c1dc69a5b6a8810e91c955d32f3208a86098500cbeb1628c9a93aa33a9b4eb22af1f7e33e77822d73b0fc3059bf9ba5f0f0726fdc4f4b639dd30a748eb8ea9e93e55cc35969d6d4b6c70345c5d16588c8233799272522d2725a20f106f60950a3eac8fc60dacbbf0e0e270a38f44f1820697be78ff8630b20a7386fb94a5ea3c5d11a0cdb9b79a743bf6f7f7de689ce18a6eabc4cfdbc4062011cb263a198ad9f06dc8364a2997469db87f15c8814167893b3c7b649e7c27ec59825a18a57a6c71852b23968563e12e22de09ac620a5db2036cb0f2706a4b579c523cf402a5b41fba1bb72953e281c457604453293ea7001e1b9147763d2a8ec587c2563f7ffb65c8f217c7395b56d648a779bbd6170c0e9b99337bbecd9ac8a82ec1b880eb4b33a5ee01484550b3a2456a02715a5b77c2c3207c6c158a69c578a549a82c495e5aabd192f10566b7a9c85941d39c1c580a6883081eb744b320304d88213f5fe64b0012f0e665dd7d62d9be9c345334a2fa71305ce4e2964071a768b7506f17b670a94ece1ecdf2e17691168d6c3ac277e2347525738196b25356f602a42400e3682b33f497062515a4bf4fed6db51d3933d5f4643451866922918cb67fef684d5022948a3515f854ae1d8e0530e84e7f274041d60005b25faa0f7b9e6137c68ac301c8dd56771048f7a4ab331d60a333053a139c4e21eb48a94dbd80872461441c324a515d0e0fa6c52e5d70e7d7e1ff1bbf41ab3d5b778e0e8c355e323b6fcec0eef53063b366676e23a35971d3510999cd83d27721f01e6ad1bb7b26d37ab5f8826089200e8fbb587294f18deb220b75a1b437dc747e26912ec11934b95e1551ff8b22e060eac8c09ae15d0b4b6be9afc75dda0deaae5e190305338f758410ce49ad9b9b75787b61a42e5dc2cb6a147a351df04e35d38c992bf985dc1cb8e87808ad4e54012de7ba0d2a593f142807ca71dbd6c5706194d3be79c0c6c11e99a2190391dd1970c88e76ed7dba93a5913e8bee33e0b6b32af9ba6f62399a6649ab915e1d6381083dea087d142d8171496ca623808337a0e0ebde307554e19b96ec224d0e9fdbc74834bd0a4a5f8dd8d93582a7634660a9a11252200046da4066c5bd4298b9669ee185d029c790179a43fc08b2ee170beecb6d3f57b19ef4e9e14720867500f83ece013679e5bc5ed613b8cbbbc4d5c9664aa790984b227b2d8df330200f0cc0a16c167a0225d6e1c1bbf3623e19077a6fb8fd20941a0b9309196968477e8c9a12e6cdf7c8ab8498509b2e7baab63fa76c25c4a5cd06b5069e952157203c83654f51f5a2b2ad1a434ed5ba2842e875d78d06dc8f595d91cb28b81a0bdff4da939462c9e045f8e914be8d359d3eed869d42da1694bc64ca56acf6000486c8e844982ca2f8ef43139f6e93d76016772d40177d16d7c457651ae4ae45dd2cd16a30f8b8f2dbf30e942c9011d8a2ae5d2a2dcf237e24e84445b37dd8435f4eeca89af80e7f6c0386824180445586f6ec821d866ac93da463624e075f1772cec40b134eb44786f78a96fff28e09468c81594d4c71260676f3110589e879aa0731a888f3b14428a4d5422d63f4076c15a77c2862b420ab1fae43b6e5f0c2f831379bf3af7fe9748aac1842d262487139e3550d54e1801c63445ce6602a56b4998b828a0c49a5485a24d2fe624e86b88d66051cc1a01b960f1cbdbe3cfdb50290400132a07819de3ae92c500584fa09beff22efd3cc9f6d7db49e5516f0d70b15b4168441806c818284fa3b031d5c5251a70e21e28e4a6ab554bed883d617c2418cab0310a7e6aabe1ff60e9ef71c54cf7c51e99d4ebdd9b48744321d5d1bbaa2ed6e2f6de673a1d97bec65d8abc57b7a749727fb5fa28cdf46bc475dd2fcb79e907491f6b935b90eeae631bb3f9576722ca14b48b7be2ee3aeb1d7bed76e5e5ddd6fba1f5dde7441754de9fa55bacb8751de8913bab1ba82bb94d37b5e0c1d5cc7baf6d3ede5bc2a0b435a4e2bf2eeb0372daf015d36b5bbfc43963ac8d635dcade75d23bacbdf7895d9ab6e48dd1ababf5c776b650691c7e9c2d415ac4b52d74e177a5d64dd8abaca5d8d783dea8ab3dd42e87011d2eeddf4d6f476e9f5f0f2d405ed9aeaf5ddbde744cfe0f9583720d17dada1678d5974ebe93ed4fdd7fdd55d10bbaff990675408ede6f4727a7d7a817a35ebadfbeaafe2a66b9be1facc689bf8c930abca77684f8956c0b8e719c67893cbcf07acd96a53f5706355fe36225188880a23fa090a0983b42efd80622050158e645920a3a3e79efacc0535e24664cb277d86a2b1fef7660e7f141ad76eb950045eb3a80522ad1dc22b8ab5b73c6c58ac4cbf9b9b927bb5045957a867ff01ed2017181711feca5a8f8696be0879c9662ba0fd6f2b3215cbedb600ebce62638facd876494f9e84ed5107e8e6d857f580f4dda4797c5757f5cc8de220280f2e4dda454c90ad1cb649e5d9b0d7d09af97b2e89b99a867dbb64a904208b51fca950279fd0046d09cd38f5ee40d794bdca940b38025a5181532d6c071840baabd90215e000569667e851533f098d91226053424ecc8565812c46ba5997b570300abb2970f659d5a6d528fa2578736588e78d00ed9a2555573bf7ac19bae4736776cebb85ef1df6f67cccd87173c51671ffeb0b2a98163707103cb76c5f70a4a6f42e04897f5d591c2bfc5ede80097d1e43b30ee56f59ff5a4fcab15fdd6cd74f8927b0eea5398ef55fe7d3f44d6bd641fff3c20beecee4ec0903f129e187add46db60bbd1da525e3033eec967aabcf936b6c2e49fa8003dd1574f501219874cedb2632f573b05c430c4b21e2471ff5086a4e74c6934d3f9b8368e66a687fb288eca34891b8448e8e2cc1b5c8e438694800864e62d8bb3d1cdd1b9f2ee83b8a2798a4a75dae39b5d0fdb0f59b374aa7e72ff32137519b284623602b02a7755a09f82ee10b290d1be4ad3d814fa6db0ccc198eda902a1181439a20f48686f5f016d9334c4c375937569b7ffd5523c106436c2fd8c75bb943e57a0c54429001ab84a78230814c789c1732e94046e8c4c017a30399598114fa5581e2126808ea8e405601b80c6418e6bff97423c83457052f37c1effc7dacfedd74108147102fd5fa380bf3ed070668e82ba913204d78e6272d5ffab557d7347489406e20b7e00a411a0532ed422048bfc0af00a0b1a80be0815509bd41ba5ee0270aa55ec546810cbf0722e39a7fd5ffc005aea5af11c90288bc48f03209ebf526023c0f64b247505134a600e5d7a8e7194f18a3d485c363d1b58e491b807a3bfc3748fc143b25120b08c5999247fcef837a74fc149423b1c2485860e00632697ac8ab9eb3c1aa39f64b0b029001c102d902b6026481a4106432498381eb0f049169b06924441db2e7ec6b6ac12881c31a647cae7bb34108826c1f85c3707edc54d8f600ad48d08d505c0632f9a6f40035952023490215d22cd0eb60a01e373c18580c2ebb02610f4d0913f8410135124ab856bbd78c8f1a972a8155098d446776e00d44a7a92750511cb095f42fd205d9ab573352e50bd60dac46cdfbf659e1d2c7807d94fb0ef2360932c11d28838bc08f1235000187ab2ba806eaadba654f65ef868daa2029c195d1347b68a1c87aeaad0b028ab53b972f4074904207f003fc003fc00f20db0889adb5de499429c9f2a95e21e722534a29a59412c3d7751fce38df70a4d134079709030935092849abb65d984491a3fee424a6e2a73fd8564f1746d50dbd3b9fb4051d2acb8569cee2bca8a43f8ee75de8c00597d4c6926c49cadda2f0b4af6ab999afc3166693740853f7512dcc277ff20875afca26b409c0600436669420081f1011392cf01a20e03043072dba55adbba8662db216c654740a22f24255981db3308aee1953e2d9202965094420821a23344af0e8a4ea90c58c1a353c7410e2e181808e5898836753caf4336ad4400974c0c268723ed9548b5f613a59a7962b2a115718bba40e2f4abea9e9a81506b93f71fb16962459b3c268b296ebe8f419f1d32acc419930419892df249d9781d44e154e03e407346e38a02315954e6a54ad96f11e21353c6c9c19666a830e54e8f2d9a6b16919e3a5599f3f5e44ce969119a9e314a652f9920a6d4ba2b63264809c8083c314a610a679b2c80f35cbf9606b187494c220bedddc454cd0771529cc7ae55f41f4543d3474002272a330a6dc29b92d1fd5ea1685d94de9c99f243b140695a49473d4149d3a897fb0257a07288c2e6245895ad3232ffa602b9f30594a1f269dd88e12c4f484a99389df9315d64f8c3ed8d63a612eeba4dd7992d6a5241f6c8513a6b53bef52ea3927c71f6c3a3661ca3b2a558a73fdea8cd584c92efe255325ac8e124a5948d09109f3ff870902e19d0688475a0a3a30619244d733bdbea47b4c973069359ddb36276809e21f7458c224b99f08ed163b23229530a7493a8a50514c5aac3ed8da2861ba50a92f9ea75caaf5c1662be89884d154c7bc18714ad8820e49984e662f947685f3794522615272ca387d79623d27618384593fdd95595ee41e61d0caf124b784913dd20fb6e208636f9a6625a1a4dc973fd8ce4464d89801f27b35403c6c887434c29cbda2ab6ea92ff7920e4698edaea477d30f223b7e4de85884a9c4f1f867e1977c4c14613ad1392de82ceae78e44986cc484e9a65a07718208533a5954f81cb7435cf77176b9adab62a525cf8ea13f091ac27c27ae5fe5523a9e2d84693e9c924d90760721cc5616b4bd9f18b24feb1884c184ba98af5d259bccd621089312ba3a84b0a04018554b892245ff75923f40184b527be6268a8fdd3312aa20082724e4e81f0ab36929c7cd9c5bae5c8c396b3bfc6012dd52a85a1377f4c1e4256a46f498d09d8422aa821a78c4a0830f26f13e42cdc9792fe5eb83bb6f64c8888d8e3d98b34bc9b65e930439793d98af32cb3a85f3141ec22c74e421f5c935b4db1380c1086ac08083e30735424254d0810783ca89a73b18b6949ae06f723c39be7630db6a9f60a5e44fcb50471dd00c2b4bd72a97b36c2ce4f88f2a41caec4e07f3dde75d0e6929f44c47c4d1eb113ae6605e7d0df5bfe35e6b92834909ea5f64b8dd5f34fde360f44ee2cd3e880d07e3096af4fb83e90dc650928e39a69d6e2fd5e106d37d3c21f465bb0de64bef954ac5b4adc36c30fe8d09195f4b0d5f91d0b10663854b265a54e6684b01e149c0c10184ffe85083f9d6f32fc813e75d4f3ad2601a17bdcc4b9ec3554783712c8993cb44cb9a1b9dc1d42d26754bbcd196630683ca9757fff94cee313bca604a2f222da7920e3298540e65c9dc741a135f0d19cce81883297fe7fc8d0e3118467aa83269fd92d8274e4247180c3aad5ce5e9f99ca7c4c376091dde9c86cee9c4afbf600af1966eeef582f9c58210e7e9a4527717ae7ab313b7994dad98756fd17392439570c1a44dc53cb1e537efa28e2d984d7afb8fa6e374bdd81d5a30ed7d527ae6dd3fef25c4fd7cc8143ab280a990915dead21d583049a635cf4787c99620918e2b98326d2d3ea592d74e4ac60b38389a091d5630763895b3b37c324c4a47158c1754c5d7621d543029c9566684c7765653c714f28ef3ba9495d7935f171f1374523ba460cab1f4e7a81b2a5ce88882c953b0f6b8b5143aa060b279cf13f3781e9c196a19e8788271942499605234f931718269b404dd1e4c124ac95213cc3177fceeb3f466e799604e41899730af6309e6a09e942cda2525983a9cb8f87e9a76720a868e249884db074f7e695b4307124c723577e4ee925462551b388e619254924cad9cfc388c61b439658276ecb929f972068e6298b4f4092bb292fbe89318a6f333311fbd3bfe05710cc334b7a2ba392ac9deaa55814318a693175efc4d46048e60184c67c9057d9ae3b10103d31d3c484be62f4ce2e2d45ce9926f2ff4456ec9526d56854b8b7535f2b282f7961ca6ed854910f9568fa6b2534962c3c6c13b0e5e98cf3e872d41d8c6077b17297da5dd84fd521766f99225d989df0825cec59ae95ad1dbce62c75b5792df4f52427333345c98bce5c63ea5a758da988170057de6020e8e5b984ee85293db45877f12c400872d4c7262e1653f6ab8273fd86c80848c88c858ae85b18332d554911686cff6ea9372b8291316c72c4c26e7e027a87d979c9418b42cccd9a4a44b905ac99249e2e00003472c4c9296539694c8115a270fffdc12b4b980031606a54774897657c2c0f10a634813b30f0e5798cbedb35af34c5a61bbdaca96b6654b75cf3ccdeece25439f943870b0c23c6641fbd4662e5c3ee158857176f4a792649978b104324315264d0f4ad250f231482e70a4c2b4ed39c4ce84bac0810aa307cf3ed87c00e21882d2672f23b951c34b1a9ec224dc67c9ab25c94a6599c2ec1dbef2f7e875f1bc14c6b724e50b7d5143059b145bae2eabb4bb751d9e3da51c1e85d1475b4e59beb38e2a0a8385eb9653ff3842612e25fe277f89bb711d14a6ca72594cbcb44bd18280e313be8f4eda4c505d042e9880274c27b7569cf8160c383a61545d51d144ab50ed45e0820924270cfa4d7bd28fe979d2de84f16af446b343cb9e18248980b489c80019b9a109639d0927c73b7b763765c22cfb6796e34149e0c084a95285ef94175fc2f4a6cade74ee78be74b1c16109c3e79874262c8921c408a4122629dbaf99f820b231250c26464428256f1abf4dc2b4b26179b115d44d2a09d348936276e364ad9f6bc9038e48987a2c6c54ec29c9b40477c00109c359b0923fc1843c1765d4a891c8e07884415e520aa9e15102b6906f157038c224267928f996653fe97cb089fc071a39333c6680848c74c88848238c96529ef49dd6f296bc0c3818611e7195f7d361fa10bc8d20c0c0071c8b30474fea55d7ab83072545184b94a45b4f8e2311a68c7867a87aa8572f5372124ed7111019365ec08108639e24fa872d9d43986a4457f024491bc29c946423f3528927d7c85108e37bed5a901bba73bf1c84307a0c7593d5ef20cce339f24e0ce5f971148449a92027ad053d9167b22aa881c7e1088479d4847eccabd97ad00d191f62839b0310a6d8d9d3e7fc273d6a7d8c1c16e4c7c8b1914118b9e4f80356b1ec6a634cbd5bb37cac73107e69a2fe317258c0c1f13132c2c1a17e305f366972beae9bc5f203ac0a93f6492ac928413ebfa930bd68115969c162afa830d8a7480b699652509ec2a0e24f990a52f468690a83dcc53b154f5c44a530e5ae20eaba39290c361f74bcaaae52988cc21cd6a669aa4b4461f435dd925e234a6a4928cc967368adb1d4410a0a63c5d2f1e3efafcaf409835dda2755923c6192c4c4ce897fe9a64e182f48d1b024cf0983c79ccfeb1f59d9df84b9a468116abce25aaf09d3499fb9519e4c18f6b26e9c7c4225318409839e494ae91111a7722e61b293827a7ac5e7e558c2e4392a8ad2719ea25c09838a0aafcb2f254c6fb735df97c4f1741226f5f9fbbe939230a53f490811ad2261bedd5d4be13a90308993d352546d8ab6ce23cc335b7ada29b47a92234caf7b4932370b96fd469894f849a8934c18614e25c9b13bd48a5ece224c175774db3d5bd88b220c625e45ceec449872927e6f225dc562441877f4ca2cff9e68da4318845736c9f7358441e4986c117ee9e52c84494a55c1e5469f1426218c6d3909ba94386f826c10a67c26eaa912cca365451026d94356c6c711e656098439fb870061b6bffe2cffa46256fe80074f1955dd0fe6fa792b15b7b5d3ee83c92e8e0e9bd712223e984e3a0be1fe274c76f760d029087562c57ac57a305f8b1e1d6b1ecc2e7ad4f9a5783099ec15bff6bb8339c7495a449576305556f2ce72296bb93a183fc95972796c74481042c8f3cf5acfc1f84969a8d5fa3442d57230c9a8feea8dd697521ccc696d9f544576551c0e462f9d4bd408bdc130ef234225533d4ae406937dbc29b96b0f0fb5c17019fa3f8657149d840d2651c7732baf3598048f3e7b6aab4e76d4605092da2739c53b7785d3609273eace1f677f5e643498a4554ad94f9413d9f1198c9fcc44d39db1190ca7f38c302fd9affc32984ed465a98eb7e1276430783c75d24236bb4dc6603a7949145d256230e5d35af154faf76c87c1204b67f3e3c67ad082c15c2697d2299a4c4ba25f30765730c94b5e30ca999e57f4e4ffc92e18ed635fb7ecc5ff920b66bf4ae2762ab7600e7d1d4a27cfa99d168ca2738e995fa7f27559308a2ad9e7795b2c9884efe027bbed15cc2ba78458e8c5d69315cc41df8ba59baa6052ded9d3b253d03351c19caaa37988eea8ea4fc1d427e90bbd242779232918ece4caae2ec9841645c1dc37faf7f6de2a28818271ee5a4d499a6ae9f20483bafaebce75ae753bc19c3c44aa5eba09a6607f1f3d9f5bd033138c6a32c593bb4b30d78f4a09a61b694a2979b424985c2d0927f2c63d8a86048392d23e8eeef079bd631877cf4ae82842c6620ca3afa969db8a613e41cd7897f061b4a6c43088948f32ae0dc36c5eda73ca63e8662a0c734e1f2b6997eb9e4a83612a532a0973a6835e1230cc298791a7f3bf308d6c8c7a2f6194ecfb829d7dcffff47b613ae195f37249d0d6f3c218ab5aa12e8db9eabb30fdffeb29f9dd924e7461d86ded24654f2ecc23f37bdbcbc4380f2e4c2a9e3b4e7dd2fa975b18fc527c7f4ecac2a5d8c264e94185c9762d4c6a61f2c930a13e575a18d552f6f924ad5baeb33096bc54a7722a0b9370e287fd598a99672c8cff7ad2c68dde37818559c5da4d5d2e5f613893f2f44f922b18b968af1ea65698479aa5ed9c7e84fbac3097a68a7dc719b39c5518ce7e2df4e4ad68a20a93a47167b25352618e514f4a33541843c9d36bda97baa44f915222fc047db229cc39a6e9f025a514e6901e3474b2f029aea4305f92426d864661364918dd1f11da9e8ac2dca33b4ee8bc1439148651da4de78a7cba101486731925cf7d8a957cc22016432825c7d013a68bdbc104a5c24e184fce29e72f53c1c7424e98e3bd5cbabf8739a54d98d5e4fd88993ea9e49a30c82bdd75c29e09839fbd27956f553909268c71a5f774782e618a919febbea48f53b184397e99c99dfaab84f9bfe4fcaf4b09f39e64e296ba9c525027618e3f5acdd3f98f1825615215524f4c353bc945c298f2a9c4c95d694d3b481854904f9d5a2b9cccee1126d5f93d7ad6aaef758e30e82c3541da9b6c5e5d234cf9f49274ae7e57d531c2e426a7ff1599351b5a84b9b2945cea278a307c8ad7e9de245549893056aa4ef52375748a0883c9a57b74c58a501ec2a0a4943f076d6782aa18c29c93bd5ab6ba10a6de17b724ec57384b7ff1c38330d7985c2e72bfab654198f2a4104a4e6a5a9403613e91f1e649de2f95058429f8772595a42f53d23f982d4992a0e412f4c48ffac1bcf9bb21d45c929df6c124d42939db9412cc523e184f8af638a54a1247b907a3a9f423dea2be45d3f460ce4fb597d3cc83d96d47b6bec9fb56e2c16079754dafab787f7607934ecfad346d3da9991d0c3bea92f4252c8a685607835a4bb24952d492974407c3bb9fa0533acdc1242e49a1bfe29efe921ccc9adb41e9949224d57130557b9f54c2c16469fed2c28434417f83e164f9fc2eba1bcc7e552a4ec5d0d1416d30578d8e2174101b8c57733d622d073fd11a8c9f4b2853f293ba6851832997905d49fec84a953498b37db455caa2c19c4cea6798588207f70c86ef4a65a7543318e4fa49eb6b49977019cce9aa372cc5899592c1fcd94c6754f2b4dc8dc1a0c45f0c79366bb75589c1247f0c154d8979f5255961307dca5652f894625fcad7402f984281c1b836d23a97dcbf605dc6bbbd785ac8c5eaf86c51f289ac4982ffc1565e30499d8332fb924baeb5aa0be6926925593e8f6122545c48aaa7aff821ac2d187dc6e74eb9a985bdb2775da6c6abd7ebc5d3f569a9da56160c2346794ef9ce55410d3c6a5058306a48efe05a5fc154826acddeee18ff90154c67294ec6e560150cead57639c2945052904851c114dac376baf2d3693b3505c35eae79de393fd8a4600e1b65926c4af688b61f6c782021231905c3b5883a412e37c6836c302828982bcd9224c90a5a6e4e912718f54a3a4ff2f555e96bd47082b93dc6a68d58dca86e06d504c3253968cb6ef557ca144131c19cf27a4b92a4be874e9ba09690a4c52a2c2518c3ed7c734dbe888e6f25c1dce7a6e494d57bb70b09c66cebb174c24d10fa3e3b86495909fd1e5c94bc26c518265982bef0dd9e2d86717b33440cd3a9ecbadb6d7ec8304cc2e30459329e1fc46cc230ca49f15db9aea4124f1f6c3ed0609843094af283add3c88d326098e4fb13c424fffc5c930fb682444066e42f8ca162414bd6764b612e41872f4c62e1b405ab245b762fcc76268a67bf796198bdb45f8613afe3a81ecf56124901e2217d1684ec5bd73ed8fcef5806780793a4bc4a76bcdbb8bc201a37928709d00ee6b0aff77bb2223550d7c1b0196332342f1b403a982dcc7f4e594bbe2e3938076349fa4e89e19e1fb3837230d7971c95837e1de360f0a482d041ac2465c3c124a527a9f49c341584928d1a6f307792f44dc5995cd51c037483418f29a57298c90949aa65886d305b3ca9233f55de6ba0e7410d1fd0280107870818816c30aa992c39467e7efa6b0d66d39ef4a8c5a806b34793b55cb2c8fe5b300d064fdafddf4af2d1602a9db486e797eeec9c3318deabeae7e33efea56630088f23f65bff83924f1a60194cdadc73d6de3edd514206939ce3def3d7640ca69cf3c8d28ffd95223198fc3b89bde25fa353270c0659420a06a3b598b0a1bfc42f98dd84aa28fb9f7126e805c3c45ec3c552b06daf14b4546fb6dc74494bd205f3dcbbe9d91dd11d6711b151c3a3900b66ad68d5237fadde1d8d238305885b3076f05379f1839ed3e1c7a1164c999697fb3e6300b39055d66856cc5bbaac7026a79cdf4b59c482c9d34e094ab89c2b18be6409bae72dade2bf080216a040042e98809a26d00a7cb977785d6d886c85d1258daead94c42a2c77a544f9091da9603cf9ea94ec789eaf94e0140c4add892daae45c4b270d11d0484f402998c410b95ee27a2b58ea83cd460d8f432460140c3aacadb3cefbc14603a1602aebf58a71293f07133ec1d8714d977f3d22726494ed009d60fc142cdef67e12bd0f0ac22698ca2413cd32edb4ad432f036482410997bd8ff9f62f7a1f888c849c11912598367dafa42474b76cab1aa804a3f89f244c8c8b93ea43a3c68c1935108660124cea5795df7f1dd038211e6a238804e3a86579f224aaaeab814064bc40051c1cf908448688d9cb4812101a770c63a95c6277d06fd501a146e2c103746424e5658c243744560535f0a8c0196359ed12844a7e128262182fdd9e891a9d2742ec32561084238651de2c98ba4f0dc33c6362c9134bc7eca84e1826614de5557ad4b5985f304c96f2626aa2c5c1c1c131850386490e7d27c99b17edabe417c6fc53dbf9a2993b8dbb3ab116eff255d3f13b7e9e9ccdbb5e1876adde4b12345e183cfdbbdededc85712d49e275094a5d1894d29f4d10a57d827a2f1706d5d034b58f7f4a3e8b0b732c3ff1e27b720b83e7ac7897bee6399dd8c2942eeff5d80515cb502d38d178f9acbaa07a5bb93c7a4f0be3e7f50adb4fa5fe4274b859983edb28397d9770b230f889a6ae73f0b8658a85d1cf47ffc84fbb9d5f5898ce4407b7bbec15461bebca15a6f30da9a2f7d30ac42e2cca8ce5504b277a95b4b2fbb7362b0cb282ca13254fee746815d65636bb9b4ba3f19d756fe1ec842c13cfa20a838c097f429c1c97479c0ae3792a49e7d36e264e438559dcae4b924c7a8a4259123f5318ecb7cc47c7afc4b74b61ce65ee152f67cb49795214b5bb3aee2bd7a76dad658892b398d5a33075da553979432913af1385295dd8863eb19d47edd9830b85c153570afaea2bea754440e1ba5b8a5a49ad4f982fe9bf699fd21f4dda13065b3dbd2b4149272849d7097357b8a09fa4ead239bf5e384e18d46bc7b84ba10f3619c7ecdce881b94d98d2b7a5aa9cdb7388f35d5034613aadfde741492f13c6aaffa417ec04214a4988e1e038210f72983098a5d56c0f51f273b62f61f4b10f4afea44a091a42219c258c9f4227259c9c4feeb815e12a61f8b060a9c3dc892fdaad0a6ae06183a384a9848659c951547616651c25dc24cc2f4ac57512164a9c931cc249c26c52c5933f6ab288ae46b848942b5cca974ebcc141c2a04baf07a5fd5dcdef7b8441eb99de7aadf4f88f239284d59ff8a88db811e5fa12b9ee107b7b59cd3ce11a77a58212de3946982ddde52aed27d494d8224c9e54f80a72564ded451179892faac43bf3126152feaf972daf890afa21c2f425871357f62fa9b97708c355db7fceb69e214cdb77ba5784acfcd10049f60a61ec38d144b124e57ac9470873e6b789bf3519fbfe06612e3be526990ef5d3f69f208c26331fd5e402618e3ab25f8210f5b59d0e0e10a9a552b1512bfb0aed4e69f13c07d3ae87bc0e745043c62d10ee0f6ec8b9bff6d12b91c1f9c1fce147e4ca8c2cf1751f148bb714626e25df16d54a506a3c4e759658f1f8603c133de588aab894f3116e0fa63ad94ecb98d827057170e8800648c88888c78dd343fa29492d0b7342270f57b2bf92d5925f94c6e121edb157d24299279d34031b77874cc35a5ebbb3dae325b19e46bff4ea23221e36446670eee0ec603ab7ec7152086509ae0ee6ea4f82b613db5309277430aa7b8e65793ee751627330b7c94a9e2773474c2707f3f625f18adac5c1249ed2d5c1c1e849e9e93149c91b4c49861026ba17dd3de706838652fa96a349137f5d1bcef8545bb939ab4b66d244ad6851d7e4d860165929cec7d21a8c76764950693f4689abc1a4be453c76c54e17940663ef2549c9374283a99327c9c4efcae549ce603a25bdc74fd946891e3318e647c7d22e6530ec08919e7193c1d41a97b28dc1fc39aec991264a3ea518ccd7e361e6bc8292c63018cdb4fcdb6779972e81c1204dbb2f1844ebe44ef67bc1b027ac855c3bbfbb0b26a5d484e90b71c11cd482103b275b309d64668210134f44470b06b9962a3c56b260d0f9d35b5d8d05a3e737256cc65730fa5bba7072ba24955ac124447a6ead4fd258f2ab60ec92fa79a194b426f6543048b91735da340583b070c19485f2517a2918f6635ce7fb5130eaa8d86f224ab47728983ba885dc18f917fd09269d24bd52b932490e39c1e8490aed67254d304965951e6b4cae799860104ab4a52429f7a02f4b30a7a6aaf6f77c4a3089b85df83709a696d71a1d91f2be1e124c49990996963c865174cc536951725bd08d61b494214edbb675febc18c613f6c4b3b29c180635af1794cacfdaf961182f9a7af219cf345d18c633f5f3e8a76098ff656c642bc030a8feeb906f3a55aafcc214dae49c4bb6a074dabe30a8d0e14e16a1f2a8b917c68bd6a2836b658d14f1c2a4ca42dd785dca268a7661146149ed6249b2a514e9c26c99a7848b622ecce19df359958f38e1c2b4fde14d56ad3a93bb85592dd693203d4e3c6d618e596257b9a96ecd502d4cf5be7ae2b9cc2749b4302729c5ca836cd7d02c4ce13c78ee139dbd735998449ed83f268a85295b49f23142b030456dcf35695ea94a5e6110aad54a1631492eed0a63bf9eacdeba15464be993480baf92c40a838725f511b29d6f5e85b184d01f5a7c76b316d8ba80d905eeea22f0a103101a17280e5e0ea34001021084e402fe22228f6a84d858000046446eb8800001781d9c1b3aa0716420400022218f6e788d101b09880100020000000040000b00000000a080f71a342e20d2ef35683480012b0262e32c20008900808848c24100019c91e31c0508c019395e2384e300001800041210f21e0c0040001e708020d8e005828cf800c477812023323e448e87470252173666a05c24af3123152071615cf53c13363d086dd25b00e1cc4804485b1c206b812023211f22323c3c1290b430c5afe8a973bdb3307d2749127a61f2a7bd6561aa3e0b2ab7eccd95508d19337e06cff8199bb1c8aa64f9bb1cb38166fc8c9df1335013168906c88c54807c050d90198900e90a933039efe53fce2e5e6346fa1839337203d90a0419f11a336e7878242059617259339959b26398f083fbecc69987bf1040641c10f436448a8dd00041111a202332406e241e212dc8558cbcc88c9f61805485d798910890a94840383352011215083222e3c60c0f0f04e4294c996b623fc8c714e67eef20634adaf81db314064f5be2fdb32895a693a41885716c8ac2943a7b10f2f4e85bf364288c9e2dc8bbd7b7fe17144611622354e446e315e4274cd2579f9f245e8ff484493095bf53fc2a41cb101b40f84e9892bc8e4f52d65f7a13274cbda6b43de8b44f3a64426ec2e8a62b3c090fa6e2b7d4c4952aa558a92e7d651bcd36794866c258f964dc73ce0942942270c1041213e664b2c7eedb4a55335ec264f52727597c63d52a6909e3765ae94f59a98451fdc4932ecdfd9f7a29611c4fd13357ee244c954f98d60f3296ed9384e1d35c0a3e62dedeb48c44f2f5ae2297d6522be4b28dd07ba71adad9848439bfcfc4550ba33dc224687a16154a6bfae97070a4238c955f6ed1ac64bb20fe60f3b05163cf04d908f3a8df761125c60873caa8ee9ce453d7cf2fc2f4ab57823a71f74b5a146192f784caa23d904c8449ae54ce9ba1eb732d8c08539e7ac9a3a64b16cfa143983aa7e792f25677bc3b6908e30533adabb2562a540883ca1bdba5122184f94bdb9b0e2ad7c120cc7f5549befdb5fc1c09c270f2e93022fe48e3200361d6bea43b7a98db5c8e0e006170cb5b51a2a585ca655243860e3c465ea4d81f8c6392e82728a52ecc637e309ca04a92f298c925057d1fccf94f2a4916bdd926a7201f4c3a66265f540e22eb0f6a84e8600fe6dd3693c3789204bbfd834d0fa62ccb97041f59e447b4069907a3c55392924eec9c04b58c0fc183c984efb2587ba972971b7807b358e9854e2e27fd441a20891d4c1e4caf6ea7e8880f505a1d4c9220ed9467e9d7ce061d0c7736d25b3cb6ce723f0793a404d9498e92fb602b72304949dd79cebb566a486226838c8371b6f333c7a46839367e4424657088c68d942a483898f20815d3c193f20daaa8979c87a757fecfbd56da04991d0e0e37184bca33f7bf62b6e19465477f967daacc68241b4cd963625e0304366c9c909155410d3c6e906b3065c4c2dd67cc254ba5de56f24dd492d4e239483598d693f89877d134985d3cefa9ac9dd4c8190da60c75722c693c4b797f06c37a9c1394ecde0cc63329995c921cce949c530673573ce9697d2383612ffcd8889534f623442e30432167390663f52561f721db90111b2906d3e7effc24491eb530988338c94b54f23269a604832673c962ddad5adec5ed5a56944eda7112e4174c3254099e37cdf482c13bb848f5f4c92e98db243769bba28dff13a8a0061e2e482e98542c754bc7452fc73fd86cac6dc1a467ba3d94ec95fd93c8d91101c1d4827188c0059d055350c2633cde050ba6a454a509f369547f2eaf60b090a3f27cc765f52aad6036314ae6b3831ac82a982ca6c71331f53962ccc54052a1b94aa55ea72d6259ede5144ca17aefe24af61c264f2998af3ca5d352b28a783ca360ce3115fcb2bb75be100aa69caff760a97c82c9478967f1b2934e30951244454d5213d7441f6c2320890648c88708da07b209869393eeb3133da88f950e24138ceb2979c96df15c82179eabe7243d359e0f360fa3412ac1e8a59f6295ee83d13c904930894b7fba6e3a5b094a9e4622c1bc2545ff1e773fd8f818a61b517aa55f9d52461f6c42e8c17b84241e232033decc18e6fb64d9d1c35a9f30fee0699462a0426c8ab4301a0f6880bc203d80c43056ffc9e1243fdb123e1f6cc330d8a7cf262bba73e3000ac3a43fa4cbfb97efbafec1e6f13e001939323ea42e18d6ac59b433710fb54ad1732895a4e4e2df0829d6c030f8a8784e2a5b481715d1b8210210fcc2e47174cae7259ed2657c726478388d2f6f230830f819274404692f03847d61d269eb63ae27a47fb017869357c4ecaeafa8517961be8ba6d2a9b57117a6feb292e2093a8a757461182594b01667920bd3769f24fb4fb034b9425c187c2feba756d589ad6ec1c69bab5a0adfa51dd75ef25e50137eb0d53822201c1c323e3928e0e07819203666d4401c1c2c40c1a22d0ce22bf7c2dce42446570bc3d5c591abf849848ed1c29cfec4ec5de66fba6916e6184b4a897f0e29a69785399824a8fc21be047142b1306a7ce509164d4ed21f58184c5578b4e4c19368e32b4c9dd4ce6d4cec0a53692dc93636bcdeeeda56186dacc489134dada88f082b4c925ab14f4ae9e0a75d5c853989e96c71848926070668daa80a9368e6a2ae63d2dabfa9309992b257befc537e212acc16a746cfe675d78d33c0536061561d6fb39d366aa77da0298cfd5be779f6a4507e82a530b577f04b625ddf4ea79014e620c65198c3a5d47759944461300bf5ef24e93db92ca130697a0963a269e75853c9fdb48f50e169003ff103f44410b013e911a7656aefe43349c809c3b48285db8ba5ec953a4775f1e0260cdb167af5834c13c6ad784947e4a5f5e83013869d5382dcd88c983086502a7e5749f2323b9730ffecd58e7f32a5e7ab21a3aca025ccf296e3f2f9c70e0faa0496bf4af5c196dc10c112e880064872e3053b05a484d1eca4a9f211da4eca380993b0f8d1c46e64953c3ed0c899718792304d89956a374c3ed8426c00e13d641c1f7c62244c76af5fb515e4724148ce1ed1382322344a900609b369114ff3a21f7e1f3e42b170e9dd6d2e887a59c54fb2ffef9ca90374844168d7b21cd637c274c19364d7297950254698e452be2df33f96b4651186932d5b8a3028d3237af47789308baa8b735751829039228c95e4bcfc5582fcf2d0210cbab492fca8723f416c08a3aa0725cb4e8cebfd0a6174cfa1795a374218439ab60f2dd5208ecfda56595171d30ad71022ae65dcca4f4198468bd82dd11d1716d141c8f1b00b84c1646a494a673f893c68dc08f1a8e108085332d1d3abb5ac05ff60fc2d495e4ada154ae68a7e30e9132e9fe8174fa50941807d30f6de9d9ede356444d33c66dca071c807f3788f2511d332a2f4b80783b0b21cc6b41bf22325b002eac1246fa851f2a8fc1425f6c126e2a1c6031a373e46540598878951a8642c858342d27030168c44025130105236cb0100e312080020601c8ac502c2509ecab9aa071400037044263e3c242220180705428138200a06c3602028100604018140301004851e12b5466aec6dd202d642c7d1043a3303790457422b52b1483765c50ec603e390758149ef1a47ccd51a256ad7a2e30d23725ebd5c390a40dda5cabbb9717f88fa83d8b896bc0928eac4fa97dd102efab30dfb58fa3bded1b9d10e8546d76a118e1c7db2e8731f9f7d1d4d1ccaa4110e4e65f18d10bd829455e32ffae1b30f91a700bc1ca8a529d8343d6a8c7151890a723baa76852b405a0c5136421b3b0652fa88f6dfc192d60c7b43bffdebbab681df7f89f73aea123ce3b6576a6073f0fc6250e4f2cb84ccc00f8aced3ac643766987c360ba84482a1b0f5c1aa89f0bf35e10272e09a962168652212740c44ce96238fbd12658eda8941beef21a08cd2a481450f73a0818bc4417dd0255067cf95fa01007124cea80f88831e7652235a0a50afb1d7e731cf341e044ae71b71316280a05e5c349e3fa2d75c7f7a3f2d8db63885800b15fbad77d2f0671046049a64c10145aa098011d16299e65000abd35f9542496231ea457845d2a067cad9e46a030ccbbbb8ed374887fe5c083bd8fc8e6cc4ebccc5cb17862b9da243a72582a8118a599d8b36ba711a87d89898b4002a655995ca2be404f2a23bdf430e88093b2a0690be06977f38b56e30d0fab96c7ea6cc82c62cff16440f2171544c2d025c61f1925ad00fb72917faa9302493f43b14ee2a6f4e310a7bbcef9458daa0e7863a7c43752e0fe720907224f53870c716e0a3225ffb68efb1cd035717e80f26283493f19f6d3b39b8414abe59f047bc24ef9d6d088edc2de906c7843cdd04319a535bfd982e4459fd26ca2b9b1228e28e41497eeedbaf08a387f5a87a5e51bfa44cb2b9465972c196215d675b0f2e6260dcd11756f37f755e2c86b95d9a01d8102b782d16da29d22b8ae7b4e6f8883ad1f322e26fa57c80bcae8b747476d411b7adac62c233c2619ed943a4b876ea232ad1861471462392ef62494bf68e048d312d54568079b57794281c91f827e3c0a18f157c5b0e1c65d24a58a827e17c1a5378c930ffd84f3238cd837c11b905fcd88eb61f864b6079f339f45faddd987b29f6f8072eaaec4800ddb11689b7ecd78fb5204973113050a121e0fac233b40a106490989d6fff2515f0da8486682c5b705cf471df6279ec4965f206ca8896e32b9c34d589a659f18aa264672d106e0e19b5d3b1c66f6390c4519a8cd6d17f805b2f8677b6a7a8bb647356f9bf3effacac6914789ef01a39d5d775d634ec2c8921437e56501c775ea6f98e4ef902b0adf5ee88f9aa49c5f7010e6b16e6efebe134896b0c5d3c43afdfc09ae7f0588987216b055276cabb102522c103b7badfc9c42befd4e2deef1f42548e55c7de9985927e5a47be46ce1ddece4bd331a29b5a9d035deab7216ddc26c9261fe9920ea204740d41889a950cc5561d63b0070a4f8848e66172d69fb4f4a9ef5ad9a29ac9fb3ac05e14932e6ecae241ff586980da5d5d4a733f2f2a57d089ef538953137aa0883dbbd042f48f1de869728dcb57129f478199153eb1a7fd9760b4d585c6c808a537107d605516310bec2e7388d483190439d129e099ad6b04d5548a42ce1982aba0223972b107efb78e2568732db94ee9bee544b10f31adb6b1f9d8867460ac1bb5c450e40a5985c0c316ff80aa34138a361bfb291b466255a3210c72f296335e37c5073a314e7775f146eaf05ee224dc4393f28a7e8ca114448643bc0083899467574d3303e26854d5aa238a4786530804fb26961674882cf1a3f164063260b83eaa32e434b781cfd15f4a93c3bf8358b63dee87d00e9828574a92a5d539b45c37f24bd7a8c5d683da32b2f45e6859b6bca23221cb529d871ad042bda4cadf28ea4ba5bf07521e0cb0089868bbac1be6d46010ff54b331c81164211d7baa4711a898b9b49a27257f7e4017886c659e9aa19e4f9bc9bdda25c66d0fecde1dd224c7b9eab77faf1fc35dddf7aac41fb3b8102a30b9442c76cb10dd6b614bf1e3e692041d902e9b4e035a1d82665a484b778bd1bbebfb73897f9e8e0f23423eacc2d750314760364849fc49bfe1496c7f5671daec006a8f4b8305a75c00b937b20c78b4a94605cb0ae9324c8529847636b603f7ad512d5e02c681621a52f767082127b737acebb3b5b11fd93d8039027f1a47afda0ee071645304ce4bd77e458ee384159e6b5b587efef9df2066adc1e2932155486c8ab88e3a39f5616307c6ecaa44b573ebc61c2081d89d8428e997d17d016ef43d30b788b71182ab1e471588c1cced97288a4640029a6f51a74a070490db2c59403c751c0aafbe6102aa00dc361b6bdec27aee50f94a7be8695ece5ec5dcb98a80a8e18d4dd63c68bfd2bc9e14d42ff2ceefa39cef1e11084f0f1a99495a9d4c9f412748abb5e2fd1e0f45c9bd0608118b0a4460278b3723903530dd94d965419d70ee3a751e3e04a9e15008f8e51223fd921cd8a55f2ca5702231a0f64920d6b8679e79eb2c9ae29045d1bb37d4905abbafa59cbd9c5b197790ba6fce4a497be58a6a2f7a1cf12591b29226dfb22d392429adb9abc66b59f03ee64fd6d081af2197e63f971f24841804c03b129090293e14dc23bdf2f50bcd29f3e25e29e31f0b9ea46ef955319c7d788e140e97cca1ad466a0785adee2a000653f7b5b09b13463c8368dcefebbb4e761c2941bf36b6dc215e57731fd5c6633297dd722db240eacc4c98632c89e6a23d3e925db23fa3c0d4b176cd1cbc307bd7b22f6081302011e1eed53f45c63cd3d845e220701a9600d2670f78b802e9fc65c602827741b57fa7653382338de1e8f7d485d20a0bcc46f2472c9fa2bebf602c1e04ccc41210268a32699e42e3b906e50bcfba8837ca9235d17958ce868c2615f02ef8e811ae58cd7ddb196f550b521519713a543e5f8a62024e558258d37082aa6938d7e701d01b83d938945a8c84b4d1cd167b00ba7dd9edfe07c50e653f2844167133d42fd970dfacb889930514cc0581bc948ef89fcf0bd66b7968021791b468518ab65870c72a1ba2ce420d3bb897c5a55d275278d0fa7f67e638e742e83e872b2302b4b5f7bbe0a70d290cac1ac56c52d24fe589f3e1d3afcb49127ddae7004546bff062c62ca2dd8885450a3219cfd50fd84e4da6fe0fac56bcf6f9c6bcf64278b465a209adfed5c614a057ededcb7bff2c0088965aa85afcfc4d04273366da26af227c9971d84092bebdbffd14a074121d1ba617910216d1bf8edb6371c10b601340450413381867dc080cc733a50fffefebfafb7f80b51b00fdb7cdd170e0f13237e0679bac452723101dc83234b5bb1196f5165dc2aabc208994c186295fbf700b7d18e255965977a86f0eef1a2fca416265cdc114473f318f992231e0982fc26a1f35c3f8f7f5a43736b3dbddb3d1056673b6da7f83a3b609a38a86d8abb86a566bdda4413ffadaa1d6551aa6a0317812f3fc1c7769a3b8417da10e8a08cad44af99a7a8b45329702d65d234dc41b0d419d5e12c5abbb88b95e9f8161b439610ea18a474f62c40284c81380bcdf8c038a89ae78c34098f036c5047fa69d3dd1b878c53dfe695b5f8864d32d390a5d7ac2f38cb4d087e5984056ea6afcfa9ee0234576a10a784af94d92fdc6f56543da896a18e9d798f36a8506ea22f48f3eb5c22052a76de41527395f18b92e0b41ce1e4f41026061715a73fd0ec0eed3ffc31e1fc66525340bae443a40628a57f349ed51beda8ae2359c5f76249fe3f9f8429858fa18208315a9a298333d2380014232466f68e3d545191ccb7ab62e2a2984d5bc7ea28cf47c366a6218b6e0a8f67ec25ed86fb8b580b2cc49d5d9fa7647a0ad14fdb25e430260a5c28218c6e48745e3c70a16aacb1e4f074503a254cceb27b9cc0fe3cc191a1c72d1771522c51ec0a18d9cd7b6d9991028474346be9c31ccc2cf988bd23c0ee7c4cc1f4f6ab499061df36abf8824cd42b292014f9be97db9a9331eeef10ee40cc8561cfcbe8e4d364cf0cd954ff8d7ef613bb4be68fc195bc2ef2477dc962cc25551bb74b22d0477100727b0964eb70bbc1ac0baae647db86ddc9b4ab7cc4d0e12f150e764f73ab808b767bf438e3a5d42f9fa298dc7abaa9639303301689d189b64235f0eb415965d1ab3d466d6c6d1b07d4baf6075793f83dc77e41e28cfb80885827f8a506d32265c5918d036c3b23798a08f4b8268671e8435a73d7d9b09eaf040dba1459bb5d3375286baa334784e1864f848bcaeaca8607d2d18571c48938125c65eb8dfec2fd33904df9d443641eea5c250f71caddca2882c2824851a965b2751e525cef9efdddc11c54158d7dcf74f83f29fd681d17852d9d57f3948befa84fbec052cfb8109234973ca65d8d9e6bcef4f9854e5803b3aba0f2e8abad37568cc5464bde14ca3c5e76839ae278c151449cf0bb104080756b907292fe9ca1f72a631ad64e02e3066e31aa73d1b795b1c0ac4939a7314e94416dad496d5fb159fe49f9a1e5eb428c573b8aa35b47385f21441503d741872fd1730b2cbe066093f3d511c0dbe264f381361cb6f93e62da6e55c6445320de65a10040c8cfba98f908752c813f049a27450466a0517d21ce714b064cff6992cb05c330ad441f9b7862a904439ac5ecbc22b8e72375c6fe8d7c955391cdb338bff23904a681f7176fc53f05aaa07bf301b23ee5bbae34a9354369c25aafb7a39a7767509f09f5a364eb3ef5918d91ec179b9b594392f67a8fa435de527bc133ad6b489b2cc523252e7101ef287191f1f1b9854e4d2b16034c533418f616e6c3a96d426c1e246a90e70b8edb2bcd8e6e21fba0dbf250ba4d465dc788d6b750c00cbfba7e2477bf29fc19015786a729b9e3058c35d4a87b0236f7c74341f05766b4a6c51b7f990ce6736332bb7fa53b9e2882e5ee4ed3cdd0379cc9711b47fb751849d1f75f8bc1b060da4c1fadce78177c2f5c4daa6ff1c6d23eb9d9aa9b6e71369f96e243fb31702478756c77a7bebb81d6d48d478dcc6f9b44f43f9b8f29626f7d994b2fbfdb7c55d4f231dda56dcb0a04bfae52a949e6222815543d7c8a555e8241b5bb7173f9dadb2bf16c6d359273bda357b1ad603dc39140a0c02de290e0ab967f7d379854037bb712fee010c1b6e6b09d8e791fa9f9cb3bc5e60486070ab8986d4b3c480dde0e139601c63c3db6e80381975661f74cf32d8af7b38a2c15aa16710675ffa66547743fedadcdad5306fd14dd7813f249c0ecd44af802d327629e3f81be6b1e6010e004cf56a4faf4880a5e88267aa3a6143b4023ba0ed8f2d6bae6b3be370c09e5b89816926aa207db24e6c87cc073a506722c5a2d12d164a4fc0b025df68d9a52341d4142cf498c1505cbd386eea446a0dc7d8882e70b3adaac404fb45050d1eafc23d4576b21188fec0d7a55ccfc5c0b11104abb3bef167a6e10db4168d7bcd61d62c2df5106c33f57ce2cd51f9c26a0010e084986ec05be05b01c67d8e24fa75201be42b8ad29d07e5531891819b74cb2e78aa619632a0569c3b08210530dca661705a0b594a0f7b21cf172b7ae737aa68d87521b74265216d15274714d8592723b617e08ac5b7080ff010818583fa4619a6327d301130e484633028ec95fdb9c1e4906da575af185d373bdb36a85b4544b350418102531123f04398b8476dea4aa34d8c916dc5766f20dc60760d6fa2cd0aa41b9241ce69291ae44cb7ff4c2570c5b68a30001c1dd0fa442f211b1033453a6a1d3dde5b2298cc981ef9156de0659c54ab5fe378236de6c201e347b168210166de6508e669563220711a4702d104c0553efbb62bed3c724155ee6b7833365d579124d058ef11269c5f0f9eeee6ee19ed91bd1bd456d8ee55ef52f6673fc3bdc53f5d15d61e617c144c35d3752333791a4327592d30f0bb0da70f402e6e2790a3fbf842fdaf8da4b15611049a6b1f4a10f5446041f13edc03c0ffdb413a5ffde64d99e149fd68d044bc15b2c549f6ca4ebb5a80e1a4f9123eee4d989aaf079c113557af7f72a2af066bb5f58bb64e75792814005e2040221f6560e26ba7f67e8f86d98916a0442bc6a16464423454616b05976c11325b58510740ab5b4e222030173489cd49ebc29db438166d9a4dc29c8dd41a9c909833e22a67e56fdd3ea909ec3134f92edd68f6fa546e32e9803d93be02884671a1bea34854efde78ec6ecbc2487b5e2e6e48ab7731f0463cebb7bb9f6705b7651e911ab10027e22a19c9dfa324bf79f58f9550a965bda60f8fa030a6b25d7066f22df78ab82c01273d5ef08059ac93da83b522fc007601385e234f9207022f1bf4d96ca922b3d0fbf056b0aa5917e05a89962c79944fa505135c0339cb9c0a628096b65abb3fe79304a144fb142a8e0eddbbd63220c0f5420e1245927826e4124f7c2df0c75c9d6bc512680fb4bb91bdb0ef343ca5ff242152ab8f9c9d92af3b9913036e290d36d60ed53254d15ab979b5a2069914a0bc11fae5477c133419a3f144dd01704a3e7394026ec52d8f0dac21633949149988a4313cf04aa59ab45a70e03cbd269034fa25297cd3f4cf0185e94cf02cf8def2d91642c560bb061377f9ac56471eb2e908e0717acf103b1987701ba470dcba4c3147be0a26cc1915c99eefc75186ff1252abec10e15a52c67179ec0a4ba586ea31b0642303260191e6e2d1d19deda9d37e4cacde5ca9526068caaf02b6233613aa1d21b1473d9ce2e5d95ce5fae69681356248550d7eb45ce136b8028cbe1df541cad7953c25b197ed3adf32d3f9dd3442552f7767fc5c25f445c1a7ea7461007a2e3c30d76123307ac379982cd193ec6cb1d2a109ec509f0588a1b70a4fb0def95285a750f55987fd7460a90a46fc30c4dce33ff4b000f0e63bb1298c4681830dcdaf23c8a67db30e028f07db816a5ea9606b94f235838a5aed97c9fd322b9d37e887aa7596c4d79b6c5ef6715f28c44bbc4abfa191fed1d3e4527f0e0ca7865daba8858234f57140e3cb1e754f5c78370c587dff4c6e5d8f2418142ab553573f18979b05f95c489377cfa275a50118d20c6a33bcb519bb26b5e2c495b9a3a6749b6b4f921db042f860729ba77af44107b6a1d676c4a7c99b86565d489f1b302186761f4bbb386773373ad5839b53dc23655a6bb4d20cdce7d4dd7c0ab8e90211b3cc0cf6a2308ebfc83fc0c1e834d6dde20581862b576c5179b4ecb5f6a04a3f784bb73543a44b59408ebdc6a1ac8031710cf5c31171493c14ac4c3f9abb283cadb04a5adafc9bedd363e5fbeba67692caa69abe260c0d791cfa6d37e1055381dec62006db84d9f47421ef5e7268e5f2a85b3cded468531775db7d6c33763add8c7f2b89682527c30070e44b4d54102b476757c037d26d21613222918291bd762089bfe886d8172676723bd8c176f67a69663d59d06d2ca0babc54bcabf570a740b848f8987c959eed4a236bbc73ab7ca7138cd3962e80565749aff806cebe8bb2168c44b8d2d3c1c2c7fe26078956a5e887925ec48289f394a19ad789321abd6205972db2e6144671c9ad757a31db7fd97091db7e875762db7c01b601e4862242eea8ba4d980107701b795616499789361055ea7da88d4b1ff4c0455740b9cb2290e2d6c69268f7596bd5889b86f0b92823b0e43c4955236ef6f26c6dcd4adb9917de652216aa62b551a55af86dab96f4263fed1278db316990c2ffc914b2fe6f424254cfde29d37699582021d6708ff2ab76f21ed6a39b13054b6b3fa60e9ed2b681b050dd4b0af3efaa0ec45a912e549b4b682d289b1df507464d66ff2ba8f2e45e9d3bb6ec63c10fbd82dd9a6e49c945233587e82da87eaaee4490390263344fa1660982dc1959f12574ffde37845983cca07922fc0f75319ab217e664ebdc79b194e02ac958ab816519587e1acca4fecb0bd963aba110cc0a754e3b1413448113ce9cc9dec2b2c9880ab7fb3fc4098a8d445926786c6669651713894f8ba69b0698d636d372b785030a76773c2ba0a11dadacb9cc33f18f76e9134898c88705e007f12d45c3f696de4481a13c4486fcd568b47437371ceaeb5c3bbb211b4f9aaef4c1e3a0f96683ef45aec90f51bf23e2dc2dfb9ed2d2cb7fb80c7520b9dca4032174de30e58bc7f9d9eaf40e869664e87d170c6953c16d12b4758d79324d47c9c34f97aad2aae7eb61c798f9af34c2b96625e0536c5b0931fdceedec387b929fb164a0d5715f16f3d2de3bdd5f7d282223f65dc46e093632d9e08cedb10ed5d3554c263aecdea0540a43a5d83c29314bad4497d3e7f1c1edde729ec51d853d29c15977801fd36064ec15ac8fbbd59c7114f4dde54835c9ecedef3255a250cbbbbcc45151c92a692a04141c321052343bd200faea101ee8c72d9e605146904c45061c7a3acf1d34627048a871c6deba7dd1a8e9801162eb2b0540608481cb0e7bee262d2b89f93e462ce078802405eb63f2695d4edc9d3cd5c02a22b6c7bd95d37407b29e2a113da40679f1304aaa5ca92aec08acdc985f77f232a0b0f9de32c0fed3bb13b859e65913248b6bc2b71c186f5ac48375fd05bf7f45ceece8ca65b4ce327e75264d1d12486b1b6e709726058d8a0068a1107ac1e01a1b6cba60b1ca0054543059e9b5da1ba58686329ec3245355cf99e2d04e27d07f2446e8fab54a0ee41cd453004aae1b66c5d69e7a2a8a9f87dd546f7321d027a2c7aa358d0405fec0eb110622567ce455278607f05c1b032c04f3f1220deb220e2fd5f5552769bcde517a988ce1354fc0425935c8d220ea3c853bef1109994bebc66f2c26c29614bd832f0d890382d35814224e0c173d2e83b37cc3d8c8779e6a272c324ff5297d09e2f234b3f3c256219690a43d4c2d585a94460249e5c0c09d9448e457cdd9921bcef82f63ff8c0c8ca4b410345011c01f28db20a6d39865840299fa90757222b5f0da0331ec443241d43b115a342ef2a6c5c3395ee0b243d2bb52c3b9a82fda19439d382d48894b31eb3a24fa1cd85f42983a9c3dc992a52230a8d91e0e4badd33f5fe7471d01ba4b7ae89b7ee66e220b4288403e51640a34a984a3367834bb2ac8db6bce2341b144808087bf0cc3de51b9b0abb71f75d34f1b124c4a6b5b1c95897b20d828842804c2141cda623d4a2ca134e219d7dfd0f2754e25900a3dd8a30f1fdc87e27f58958cd7af7d8446a7fb3d96ade5e1bcb3f015de47e3d24db8508579347befe9324125afada274e2981d0358d5248a18122e124b615985a6c0eaeb99689270c2626c2868649c5ba7f6f17a0c7438e648f89d0cc57e7463b43a9262f489b0e650b9fa04306300b20632a90e1b6f4e3d69b3a4417cead386a6ad8bac776f04447afe5c4d6868fdaa95000ad5e1ba60af4460e710147baf586fb7a8816adfc98bd6d43932cd16b56e1d04d9d5d8bb032f57e89cca12d3cbf259ce0a8b4e00f8341494a94aeae4915a8f8bf7a202a3ca1291fc211451a6326810a12e25b1e4f9b2b41b44eac41bb016ac6c0d8c19cb8558052632c3892187a008f60b18d9471c356e8082187c6c16af703249cb6ada558ae264398b686694036bfd2e64d93506574dfac010bda8652fa7792b4a1032fa3b77e7db3e9a9a9d665b50ec1491e483b6b93959870cfb8b9a3e2c5d724ab616f69b970a425ac3aba6fe3677558506eae0262bc934d8a1ebde696c56230e5b55ba283e9c44c117a9e745f38e26cf98c39a435e1254db2813ed291394a19e866139934a3623652fc44808d60891689b3d2a35be87ad5ebd891bdf0c03d1bdf495c5604e5461b57736aa4b802a43d9b406ca00adcd9f337f13b8c64a7e58700aece3d08afe38918b9e9bacbcc02e67a94d16abba965ec0c53090747b6e93864c03897375fbb6ed9cce93bf84511dbab07a8cbd75abfdcadd7b0e099b19bf371dfd0a", + "0x3a636f6465": "0x52bc537646db8e0528b52ffd0058f4e905beef87021a5410300c4d3af80cb5f7d3877f3b7940cf0d2f1287c7b999c7b71af4e246461b7d5599548d4040702298488e5fd3e3493c7f067db80064bfc2f3f4c3243f4d7288212f8d10013a79838636217bef4df6965bca2453dc1e7417711899fe1cab8054a7d56f2233fd397ad0997e8f40da69a598e72f7918f6d8e1522b77efddf2cbded35bd26fa779bf44bd5bd65cd6c7a2d97e8f40ba5ff230ec5188c565cdf6bff76ef9d97b7acbb22ce9b7d34a12b2f7edb4124af6be9d569e90bd6fa779bf44eded4c6fe7ef56dd327def9642b97e38457b3bd3dbb9472235d35ff225ef6e15cdf4eb6da7cdef1108c5d569f3977cc9977cc9977cc9bbc8311599fb869637690c61d89d83002e6d9cd6b99dd6df2390eab4fe256fa1b01d09113507460b104916244420a101490d48b8209900121b90e880e406245a90f480c40b922090fc800408105070240d109c40f2054917244220e1010916242e801007841420d90282991b085120c901090e204071048a2320386206840f1c89e28814487c3842c491228ee860240447b41ce172a487233c1829e2481723143832c4111f8e803182869123a4663802c3911d8efc70248623588ec870648622671851c1481c292b8cac60a48a112a4658905263648ad416524448a529720223664871c0081c29278c0851440d290d4859400a8b5405a4c248252125462a06a90d482921b584d418a926a46c9022436a0c292c8ec091d2e2480a52203892938ae2880a5254489d40aacc9115a43e70040529111c6141aa0aa92e8e48919a420a055221904a819414525c48ad2105c5112a524f48c5914223e5c5912d290f1c992265e64815a933526ba4c8485d2155841120a46e9042422a8b23491c41e2c81147c41ca9c09130488a301284940e525aa47290da62e48d940b45e018a941aa062930475e3872c5c809a4ba8ca0400a03463660640d2324305202292b473060440d236918a98054068c98a0081a52341cc1c1c80c46ce30f2c508155270a4c090ba8014135223286202235b462c602409234a184102490b485e383201235348652992c6911c8c0c11c508d7910b48c9307f288282226b489d51e4cb91101cd9728402478038c244111ea4de18d18011334526204502a91248a9216586541a524748e1f0810e1fd8f0010d1f54f94085a8353e48e183dc0728449d20ea4d541a5170a2d0887213654614185161448d208a8b282ca2ba885213b54554165157444911a545549a2834515d511888ba401413514b44291195449498280b44d51085258a88282e513244fd10e543140d5140441511d525ca4bd40b513344658972216a02514344e110f5250a09a733a25a8812224a0bd418506ea0c8802a03ea0ba82ba0ac80d2022a0d14135016804a024a0c14125015803a022a0c94115059a06a80a2016a06282c503240c5000503d415a817a05c806a014a08a820a08080f202d505ea07281fa0b840f500c503d404a0b640ed00a503540e505d504d4071417d815a024a09a815a03a0045064a0b140e503740d90055041411501c80da009406a0c6406500ca0928159ed6784ac193194f267842c1d3194f27787af3548227123c3df124c6939aa72a9eb678cae229044f523c41f1a4c513164f1c7822f3d4c49399a7289eba78e2e2298927249ec43c31f174c313d7130e4f3c3cf5f03481a7219ebe3c51f1b4839318a7319cc87012c3a98d53184e669cc0700a81d31927103861e1248513154e1f70f2805307260c53874901a70d3871c0c909a70c387571b28013979317a7179cae0c59630809869031048b21590cd162089a21658688604815439c1892012734864c60c896215886c430e48521568654698a3324370485a6143c4df174a6898ca6334d633491a0a98aa61134b1699aa2098ca6364d5a3471d1f44553089aa4685ad394a6494dd3154d5e3465d184a6698b261134b969b2a2a98c26319aba68a2a2c98c262c9ac26802a22988a61c9a5a68a2a1c985262c4d579a5e68aaa1c98a076c3c58c2831378d001214608a9801022848c1102468818214208e9125284102784700959420810429810f24548134228200403427e109284902084202164082117101246480684f8204409215d841c21c48b100b08d180101784c8e084849017829820081a41e0043923c89b20630421030241c4081246103082b0b161b1d560a3c196c53603931a52463091c154c6056608e00b06390c5840d2e2821200b9b9200c0ca65c80820bd0b8200da22f17c4c1a00a065b179c806905a52d18a4104ba3a703240f179cf193010cac3049a0870348634085d141194c3108bdd001063a70a2032590c4000283080c5019486000b121a2c00660845810da62c241088b504ea8850da8cce26c40c40d1a6626b0c1b9a105e90c1b163e636ee8c081161c6c4144848e25846418b2011e208886c845642384a4200485250c2c31b1a4c492180eb878ca00076a8c7010e6f6e054c606650c49d9c00c0e88b8376cc0c4061dd8c08d13955a151b7031dd406484100c348d0d80604a934403d21add0e1a64a181161e7ce183020dccfc502133b0f3c40e14482910aaa201056a53ccb40c9161480590a810009700841000172aa02a04e0c2cf163dd8e44022471039c4905f7ce0e44862e70c8e24845c18c2854482191a4a3efc30c123c48c4b69859e3637b06850463e02680dd30c3c9a506241001498a500488d4f0680bec8c106488c190a36a8005018b333c822482e9b0988b8fcac305b4303373c52927c087202a1187accf87182a807a1157430415404d0183960c8617058408705341862a7072137ecf080b4c50e1721597626b0e383101b84a610b5c100060c5ac0400218ac80810a1850c1400a06285c90820bd6b8408d0be05c60820bde5c30c6052478aa72011917b421dae1022fe6179e106c7001210de468c3630608173b34b083cc8f313f36b02303433f0cf9b063033bc6ece8dac10123617a6c71e4cb094257788ab8008ca72598ac0849d1c088212798a5c16466489a214f0c89228718b510ccd4d09104d311b313085901b226a9890d309004469213443c200581248491979a144340f80a1e64e18116d7870a66b83fdc2d1707a41e765ce0da9053c35006728c91038d1c6018e99023430e161e321b70d9a0871d47f440f333a60336af868703394690034e8d0a272943d8f0049123034376c841258714a434922490e34b0e2190da2095c103821c5bb13631326261c4c440aac2070d1c4ae0c881848194e10615ff222a8e8be1a30157b3a3650706ae0e1f48b901450f181d0ae80ca10346e78b0ed70d2e9d1c6e7cb921036de1d290230c1e28789ea056762cd1c1183b94d860090e86e040881c1a84c6f044c1c117a10c70d0c5e98a11dac0d5722770bf5c36170c0ebc383dc101180e7eb86a88a8b85b105971bb204273b92012c1f582688abbe66a41740551151708273417090e82e000080eb86e059eaeb849dc301c50e01ee10485900a40d834d9d0340354099a70982e409db1c1970b6eb88086f7c2084c53960d50403483ed061b0e4e55107911c5e55426071943343063e2c90dd1046e0e97cb065d426478a4b83cdc2c4363807421d401a127862630b4656887211e867418e232d483d00784a0b83b087140a80c101a3b62e021622704443f0c9901c8044a2a10e9909150da220a62c818242b74e440e44307636edcd0c1123e39a411107921128264a2078c1e374c3d901460c2c2544647134c5c76ca107131e930a40d93160eb0600a418f05989000228369cb05653055210407a6304c572071c154012157986a601202a90b26313d2660ea62c2401215a6313b6498984082c394c34e0798ba208980c906a62590d2308161dac00d1c98a440f24287991997190fb32d331d82d60471c1d401261f80daf494c18426c90aa01130ed902402a02d80ac904121cbfdc4013a23c3800749e4d8908343ce0d395a3cb0802c043e5bb2257ca09011d1b3852c099f2e3f61f46021bbc1470559971e2b645d3e1390a1d02385ac081f2f3f6d7cccc85af0a942a6824f086432f81821fbc1a7cd0f097c58f859c3c70619191f0fc834e0634516838f143f27f0b1806c8b0f1719959f1b7ecef0e941c6811e2d6446f8842113e3834566c5a7851f337c6a9039e153c40f193f36c880f0b9806c033e42c858e8e942c6840f18590d3e67644df80cf13386cf0b3f6c7aa6f8f1c2e707190c3d6b642ff874c93ee0f34556c68703320ff8c420cbe2c384ac071f2ab2ad1e2e7ec4f03942e6c24f0d32217caac824e073e5c78dcf086438f8949175c0e70b19057cc09079e9b94236011f0afc80e1030219169f0ac852f009239be22386ac8a8f0464637c7490cdd0a3468684cf123f26e8492353c207899f14f8d020cbc107881f357cd8c82ce0d301190f3e3efc7ce1a3e5270d9f0fc8b4f49cf941a3270b59057c64f881e3b3453684cf0ab2237ca29081f181e167043e63c8b87c9e90d1e093c4cf1b1f1e6441f8b8f083021f256419f8c922fbe24384cc071f1c6436f4a0915df1d9e1a70c9f29642bf8dc200be393e5a7043e33c8b8f8e42093e28301d90e3e64643af850f1b3c6478cec02b22780d2005d019405101632105c216e105163c8a4780281141a469e907a414a0246402035841129a4603072c6881146a0f8c962881717d8f0e381282b724c893ae247ca4f0a3f28fce47ce2f8a4400815d76267033e5c43aef49cd123468e147ac2182201a3208c86e81181d11723341889c2c816479630124208961b597ac4f420b183099e293a2083a70a1e2a7abe3cc1e139f344c6066a209d8009881d0ee800c1c365c70b4f186002811117d30f4c4dec90b1d38674a176a95e84a880648690ad1a0884d4c014844e1033384f609250d02943670c1d0d448189ea014a8c9c38395b72509033819c1972aab85fe40c01c40ba92b395c522dc4a600a226e70a236d72c07c30c3d318461400b2c590970fa8d4ce001901921a2e820e68b8200b1906c81717d4101b432805a119c82c640d3533640c445af8190104419403121aa22d3762b86183530b73889c188068416403531243a0b069f1034cce0b4c17e879c3e42566c68d2090beb065c1a482072388a131840231384d5a86c01073d341134c2ef0a4102be3c98ba6294c30109519c244531a437288da01c90443b2e4886188195125d0c08c0d841802c4d30f485734498029cb4f144f2af4b04152c3d303141743a8f48c207682a81c784c80c788271f86b090a3081fa323448f17405c08a912448d1e0f084940833186681962c68646930e3f668674c1f4e5894ad2147762c8123766806a63bb22c905f202b11230f100e4c5101d925a8891a0a94ad41a261a868c8184051397901d84ccc0e4449417e40e3b39100141d48507051d5d8e262a033113245511a282f48627c77486a985242b3d2948522107101a9091b4958405898c242d4d37f8ac31a485a41b76ba24a5d0242547981c46e4a840130a34e04208057a0654163a74f00c20adb1a5e941a3830d30158194c5930490dc749081a715989e807aa30109a228d0f385075b0c7121c71149599c4ec0044507669272c0e005243482a4310487a41938c8c20335495784d000d405062e0c59e3411c1d5ae8c842871a1d585ce0e6860f740ca7349844107b938388a69c93113c96b09dd14425a646d20b49316050c48d1a62675c2046558162a12ed017e815aa434581ce50733406ba434d81c240b7c8ced4192a962ac30d21a28248927283872416a0d4dcf8016a8b1b3ddc00e2c6961b13e0b1c2b495944342c15317cf0f486c926a400aa3c680540227227ac8e45cc971c1a6c6b6c50d2f37ba78c0856d4d920c493830b1c0f401a6179e28f05444120c4f44f07879fac053194c5124d990b482d3114f6372a87063872811447d7123072717a274b8c145c70b139927359ed2b091c3d31aa4384c5344a9e194844e971b436ce0c30e123b66e051030f1b7864f9a1e107d78f217e5060a78b1d2f76d6f4b8a2479a1d3eece8b2e307b20cd20cd24d8e04725ac8b1b2810d1be0b0c10d3f6af881430e3439acc821020d84d0804b832f3fc4f8e1e6b9fc0fefc3062b6c20810d58e01982070c0f1d786ce1b1c38f2c3f6ef861c353f168be8a9f323f50fc3c81030d0e2b70886047103bbeec1082c7023c4bf02881a3061c36e0c8f26c3e8c07c307133e30e0e30236a2b001021b667a98e8c140cf05707cc141011c5c194e5623a3914f90d3c0a0070c7cc0800b8f303c2ac0e3081b706ca861238d222f45411401a1810634e080061bd859a289871d267e34f123033f9c50ca416907251d7e8597c0b3603bc28684ad024a46281da11466480f3b67eca0b163021f60f810c347181a5ca101161aa4c1b1058e2e707081a303383e80c303368468fa62e34b075d3a00a2032f1d8ca0832b3ab0e247183fcaf8d1e607193fc6e860ab03163a5841c711432ea0a30249522485402905a5294a52ee0a570297851e59fc74e55863a3c256856d0a1b49d850c286057652a043029d12e0a8c09033701c5144435196a21a9c2ac03401262b98ae306980490926199828c0440513114c16601a8229034c58307980c908260e3c5d000a8b27189ad678daf2e484a3c047e05d38167e8567116584a771309cc278144e859b71103815e14f384d7122e317702bbccb9bf8608aabe0557c6bbe711422e053260a669cb986e7660a261ab3049ec23c63aa314f30d398269842389933cc29e60e938a999b58e698a981b981d9354330939817981898344c1ee6959965d630659852cc32f303b809a604ab26501a3082082130406a8992240b48c0019080706466e0c9b634a42948063263e0c1a4818f1e938bfc219cb9e703f1723a75b5840149a02c99222149927052119c4c2549022625d1722234616202036646717a0a6bc9945508428a8c5220c29310a644b0618482be7ac014d5d503a69c0c708dd668ab29ac2b26234c59259962c00396947082202335fa6a4a84274e4e60524292ac292b283f4669f49509584bb0aeaea6aea69c9cc0044a6604a7afaea69a0c19a1d13b4626e8331ab064aa498fd19bb62aa18412a0624625c06144829a91198d3575e5a6af985c3da00153530c68c0d494cdc7a80c212332a6b0ae1e703546094fb0ae4c68d35358263080891516d6921c2331a69a34791282cc288c6e0001462330948cd83469b22484264d96743082be9acab29aba9ab24a823535820da32fda8bb67ad28024574ea6a89e6025c10a61c9095349a64260620525c914d613274f3aa819ad21016b0427534dbae8a9a90624798295048b8411984c39e0c8888bbe6ac26409d6940849a6a61a6064b4453f69801326491e6035654255122650329693a9121eb024ea8dd4f4d4085af494084f424822c292274da09890454f612d6182e56409d695132632232cba4993252184b0c40acbc9930e728cd2f4d515d6d4d5550e32baa2a74270f2c4499225213879428010f29091154ca0e4075c31617a40be46220880119a22a32afa8429273a4654f4144d42084fa04ccd8cceb4950923306980932721246102254f316089adc728048de5c484272124991a61099424575653544bb0ae925c2db19ac24652f412ac27265425b972928409943c821326544bb00c206404827e8295c44c4f85e0644993250c48f2042bc9159613264f8a8ca2e82b11ac963860ca2ac9084e9888e0640a4a122650f25593274fa29c3029e10901b011140d8509095756534e1cf024c903a6a88c8c9e6811a69c8cc0e4ca8909584b427892c5c484aaa92458564fa04c59f5302ad32230498235756565420840461fe8ab2926584cac9e908065c2922423246102252f81228293255642888c3cd00e6002255b4d51593d3942e41a75a00d20556444a6a7a64c9832e18322224c8d30c29222161871a0afa842982221840df415969329ab29129c3079230d3861d28099d1980e81c99513265658274c2579401328509624b19a12a10913136c54213c69621332ca405f051939d14b92081935d125245982b544842558535039465d1060d26409132c264e98f41861a0a94278d2840149a6b04c0861ea84291da30bb4d5930ec49e534d18b004cb89090d488215c2941513119c30499204c8031d33bcae2bba88c9ad1576572e97a71605b26417b2cb8432bd2a34341312229a753321a24e88244592ec194799ac671c67e3d2d2d06c68886826349b117544d6daa6149cd65a4bbfb6d6ebda75b603bbed8c815d8e570ce8158bc562d52dd84020d8fd81df676de71ff8596bedbde36cdb54a7d25ab18f3b9011add5edd75dfdb3eeb65a6aed4749a71e250682b6a9d7afada59456ec76faf87413b49df5cfc7a7da39bfeebaee4647a9b56d5fdf4b00d6be6c37ad9d9ded3a6b6747e7e79f9d5dd7f9581fdb75734edb59d04e3badb5b37ad74a2d3867db6eda55dad66777dbaeadaddeb6bbc3ef7bfd7c1f6d4b3af50a7e5e2b58ab06d5db67e398fd51a01abe7bd4bd57add6fbbc92d529bd21d93ad411e8a1deb19d6d5b9d4eb76137a7b536ecacedeeac7f6d29ec735badd5f9aca53bbc3ab5ddb6765e2bb5edd46db7a5d59d524adda9b594765b4a7b6cdb766aadb594fa4f7fd6d6b6d49d7e5f75daf6d56e1b020fa8b55677ff28eddcbdfa095d9d75d2cf0175ce59bdceecccb6b53ddd61ed3dddbbadb54d41af1ed4594e4dc0baeadab579e88e0daf3672603098d5e4c9b11366a3bb3f4abf2f2787030e68b45a8360412f4ac1a0201d3abac85f4141eea1c37a76bb37ddcee9cdd03b0c3bec0e1b47d8dd1d76bbc3a6bb7fdeed74cef9757b87cdc3636367a78816d1a2a200c0603930182dcad9e931001b7600393b393b7a7a603d33b6e3a5d44a4de7dc60ce0d6aa5f47b7dd3bb5f95c76bb5b6baadb576add56b5ba72f9a9d3939dff7edecec74b4ca7693fe50f7ef03419fb3ead40ae5899312bc7aed9c39c31ad2d7f7a2b356779d8f7eb4564a7dd420774a015041132afaaab4a494c98b7eeedf0dfa53756a53a74e93ba52db1dd5ea3ea7d7170995eeb8fba4b58215f45a7dc8bd52dac19cc268b5d64ab6db5a6975fbe347f5eef1dadd64ad95d25a29a5d569ad74844a69252b59c91e9fd5a73b0fffbc01d3bb9a0324c129074110b4d682d66141d577babbaed66ac13727add5bb5a58d7d7d1740f6bfdbe76afb6daafceb65d6bf774f7cf1dac3cced3d6456f5815c176f7ec10aa3b0c66ab57fa39037a090c96a3545dc9ac14569de6395e679d496addddaf6eeab1179e7501b59ba7bac3aadb5a3baf7e747a6edbbd5a2ba5b6d6aed57aa5f6f57abd5eb1e93ee7f7f297c762fe7ab9bf1cb41d383b5b6ded5a6d7bed9ebbcfb62f6f874d1b4ebbd2a60af04aa90e1f5f10ed9eddfef2def176ffba6df5eeb676daae7e7302a01a191919d5ce76d63bb74d29ad3401df473f0b3e2a80ef45bf9c1edf475fb66953ef1e770c003a79c410406b8d595b3beade55fa51ead63fafd66ba5d646eddaf5a3947aa5dfecaac37cce0354efdee9ea48fcebbcabb556aff6f3cf29fdbecf5afb555a6ba59552fa514abd27a882d0ddd63ab5dfcb8f7c3fdf0fa594ba03e9fc586fdb4d18acbbd657ada03aad5ebdbe6a4deae9ead378d6e95d7767bbeeae9b9db7bb4fea6ebd565b2b9d75c260eed37d5277eff65aab75b7b6bbed7c79fed9ee9e73ba775bf7b66dddbfe973ceeeee9edeeddddef36bf73a678dbdbadbbe62edb34e6addddce7e35d5d1a1fef2fad1afd64a3f4b69db5aa9b5356abfb6d6b63b7de9b8c36036697a0068051564f0caa076d74642fa26adfe49bd5e377ebca98ece0dff3172e3c64ba70ed5eef66f4eeb0e6b6b4183b4d26aadb757eff69d39bfaf52fa35ed3afa7d9876dd1da5b5564abbdaeee96da9adb488016cd73a6b75ebeed6daf6eeea5ead7bf7ec6e9fedd6d297cfcea75b771ef7ae5ea9d759ab3bedd9d3b67bbbdbae6bdbd6d6eaee94d2eeeef6ae757a75ef59809a53dddd6b7b77bb7ba5b5db5aeb6eddbdba7badd5ab579dafd6eaddd3daaeab5dcc765fedb6b6adb5b5f6071fc500039d99c3467dd4daefabfd59b79db54408603b9b2306f5e494a3b35d0c8876b60eb14d94526abdadb5d6924edb7a95d217ad94b67dc19c56cfbdadedaa77dbce5aebd5dd76de8d84082446d09ff607583d2961aa042b9b723255c214d612ac2b0084bd632a6baa4992139694606384274d928ce084c908233c6902844193264ca8943c3012421b9146231e119a3021218424584d4c58d28029118e78de1d30e564ca0a473d614a04274c705c7023c8084caeeed103a6a89284c0a409034c8042b3bac221f60557575356504a78124212aba9ac27214c59eda0aa05e00228214c5df1b8e0860076042000178880c3076b89d59493a911922cb9122184a9244fb0a03cc02a841b401af0e4891594240f680013aba9ac0a984498b29a12c1ea49925a002e9862628555c12ca17bc79455034278d2a4c912211c504a58827535550213acbf0c30e1ea289c9aba4a52c213119c2cb1c23d57b40e6836119c2c493265b5044a094f32209b2c09e149930ac227584b4460d2644956922b26499c30594242080d68c0931b19d486884e78e2002ca225245c11512d09218429aa5a002e78d9053b925c3045b5a40903928ce0840909574b48f8a91298603931c10a7f8f066099305482094e84fe842912926039616205254908574c4ab05a827565c4730574d4173c7962154415c212063469f2c4aa82bc64ca2ae801535449b04e98724274b1a64600925d615d3139614ac8eb1d4e9e30c10a61c9959325565849b0989450c213dad8179cc0a401535650f05b2d996a12c22ccbc914e5e91d499c3c6172653595954404275350a02c493235c212ab27585749b04e9812ca7232457be86471ad899b4aa2cc28534b54d222c569e1604a5a4b4bebb3d66a85394a5a2b54d25a53eba6456f5a5589d6dc8985b84a9534ae6a511c0ea7e538ad8aa34a70530be72f9ce3b4b43c255a13a785036f5a382dda381c0e87c3e17038ad899b8dc3bd94344e4b8b2ac1e1a656a7e4366f37af4aa2cc28515c49e370389c969696d6c44d25ada5f529d19a382daaa4713857d29da7a4b570381c0ea7a55595e0260ee74a70ad446b5aad4e49b712ad4995b49696965655d25a5aae446b6a4d25ad3595e05e556677cf12ae967499feeccaf4edfd6e96e7faa1fb6ca4d7dbeeedadbae5fa5f39e7fd597e54ee7db8acf9fb79a9bf70f97dffa4b9bcd2cafdeee120fdb5622afa1453f53baebae592e67e1b27f4a7ef6d2687216bcec965f6a7df45e5d795ebd33bab90e50726d7ef9f479035975f2ed7a7e507e6ebcab4761dadb5565a3d00fd73f42e1ba664ff2c6b64ff2a667a27ad5de723905abbda35d5aeabd5695d144ecb092715d27377657193e7378c521ef56e555b7d7a8b90b64a29ae8ae52eb5e991bb8ba06d8ee8b4eab47e9e300b099e0ad93f3fec5bf398a5131bb3d83eba1b3612a9b95cee9ffd2d02b1fadebd18e5eadd49f6ebcfebbdbd6390f9fd60fbf0f07f33a7f9decff7f07c304f0c761215bbb0fde7ad4e73fb5e7792ed07472221063bc9672edb5b7ed9bf3bc91d856c942ba677666fba1366f27c9cbb194e1f9fc4f73b5fbc542ec47ffe7ce7427657163519fc34623298c50f432ace51c8f7afa70a1ffcd06f09de5953cde5f2f835d3dc631399cbe3fb9db93cfe92bb187627c5be7bbfb08fddd2eb18c41f86e9fb18c49ffc254ade99933fecfd61f8ce9cc0ec0f66c7419d443d92f2681b7d8f3d4c7c6f240266f183da07fd6e2432eb24fa220e82c1eecce51e85cc5c979c5f7292f2c8c1315c7ed93e953ff8a57f3f6961000441d0e71864be7b933f4805eb24fab14ea2b95cb5c89a43218f1fbec211c7be3be935c61e269634870f0b1fcb66d878ad6031f1973c263e2c1cc57f8522ee460af1eb977cc9fbfddbe7b7cdf130e9348b71ee300f6e6ac1dcd3124e2a64cddd95a503930ad9e5eeca322677120ecff33ccff3bcef22af8c70ba77f3735af7b3fbbe130ab27ed7fdd83e80f877dd8beda3fb2eead8ececece87cce931ffb9d9d9d9d9d3062b118ecc7173ffc582c168b69118621e87d18866178266cefc3eeeeee9eedde153bc9fb79e713a4f5de7bb17df87bdefbf53a10766f7129fad71ba4fcf205bffb72667f286006b113d06f89cbf5f52155133077d809e8f9f5e52b0b97dce5d7eb7b2462f30bb7d3ca2abe3a7f51f1d575d8cb2ffbf77e7deab01fd6f965fbd569d6fdbbab86354edd951d974bd93f7c89dde574df5db9bb6a5893bb9bc88eabd3acf56ed944cc5d07a4e26f5635c2ae23bdf685dd6daa1f765d776bf775aa603f9c0ee4f5f67d04b244ede5995d58b366aeddad1d48359f3efd25afb8c4caf5e7ed6e29e6eec335397c9a3d876fefccb3a686e24a0ebfcb35f7d8e4b1c921eea9a3f4ee43176df7614f6f0aeba9a3a3f5361173bd33274a956978336fe7d755ca0fde99e768bb3b5520e7f3380dbcdebfeef7f3da9f63d5f7e1c6157fa558d7089bbcaf1fd65b6ae5faf57af5bd25afdfeb97bcde99bfb7ff2ab5b2fd6ae8795f6fd6cc9ee77de8fe9d3442d5ef7ec9bf5befd7f2f5d3be5eef7dfdbeef3f5cbe7e7ecd55b7ec9dab7f15cd5e270e5d6377567f7e7dbfb3fafede87f57ab0e4fd0c5d9c63107fef6b93bfe77dd58c638525e62a0ef2ecb1094a9392fcfdd7efddf27baafade87df2d6bae4f5fd8aaaadde472194b277f4f2996983f2250c06b55c541f64eaa8f6533f8a5e7faaf6b053e96cddff7e89424bf7ec9bf5b65a38a833c3ba97e38c5d7ebebbf703752f53148f7f5e708c4e27abfef4eebb4ceaae24feb9b9e98b0bb1cf16937c7d905e931b630d664dfbe15bf131f14fff520785f97bc376be679b366b6f3da0fbd677b854dfc9dd4bfe4f652d97f915e0bbdd8cc618f40dae6904e035f298b3f4720f3963353d97f79f73b4929f78797745a7fd973b2ffc231f0bbaf2ffe1ce794ef412c735abf88dbfe7ce1522bbf5ebcf38ab704ff05e2b266f0c39f977a39b3f8e5102d0ce46e241197e0d3f056ddc0db9948cdb48ae68903499f14fd760eed2dbb9fffddd9c455337bd8821c4ef1bb49d9bb424eebb7b79cf36d0a613b8ff6a3c9e3f3a3f9a58cfcf6f19d34bf5fc86b3c7e34df9f0749387fde114875da7ca7d5cff63f1fdbe654a7e1128be6f9afe7f15ae8851e08e212fcd7839ee8350f7cfaa177670ec1dbe2cf514851ae4e7bbd773b8b178b66f0c3e93d29ac9dd6793ecd6b484279fec4a50de99cf6767edd8f833871e2e4ef627579f264b7b83c21dbef5b7eb9bfb639ed34efdf691eeedbe5cc55334e9c387172a995fbedc5a2b97f8a1d269df6b47a3b0b79ed337da4f64133fda20cce8e4b385120fb7978c2345c3208b60f1f60eea9a3fc72699b879d47f497d254a035584a13a675742e6d0ef3c4252e67791ec16ae6f92f1e900c45f11bb32aacecae2b7ac855b13c9f7eac7d340a327d3b35e84c4bcfa515bb7dccdc2c829c1fce719e21fd971c8a5c8f01525573b95653c57469ec9a9e1a4c366972bf4f1e6deb07a70635977b0cd269f2fcb0bdeffb3eebdf47674783cdf7a484ed944269993a74c821c4b226cf3c7fc97d56cd4c7fc610763fa59054dd1be5b2ebdc5d34a4c9de79aa7d5829e52efd5afdc5cfefc6164fa99264b3bfb5639b3cb97e10122ac8b249ee5e29973cb96c2f3e68db14fb735a715a7d0790e5b492eb97ed45ae7feb27e9d1195a90d80109306a72399bfdf9f6b66dde5c15c2851e52e08109db942a49b6f95b3bb62955dce6fdd6006cf3eddd1a80edc65564fe2d8a1ed59f666e5c45963c7ce32a627fe2db63a5cfe597cbeeea9a5fb69936810a1de8328615416c21c56bcd5086091d7468024d1125b0b5ad7f2cf2b99c6d5af19a5176af3b840f20e9510f0d65b250ee2e1a28909572d58a756d02eb3be93525c5b35b932bee6c7d0f3bb198aa0976f2f64b8acb5bae3fdf3ebdf57b24d2505cc91677f9befb1297cbee5235e935d9fbce49437125775f42205b0f3be935b9fbf2962d2ee753271b4ce9ca1dee1205a7a30a277454e1042e4fc8f4e7edaf07d05185135da2e07a8dedf55d45e3c4c95d72432df880658b158e2d4390c96141e935b94b4e47154ee4b23698d27542aea1b862eb2f2190bb147a8ded8573bdc6d65fde7287cba941b78eb2bbb07c91b166ee92f3c982082960e472b6c651701fcef5975eabb88492c722395b64f1430aa640ed648a1be75a9d5b21c22e2ae795a63c5e5f92b9ff41dbd90e2c629b1e755cf45fffb93ef8df1709fff5161701ffab21be85ff7d01daf6eabeb39dedc0db831ed50f2fade991f7afab448f6a0f3a3b40f8df1701ff05bec54542fb2106c1aac8f720be79809b1e755f80b64559b0d1e48ab9e8b7edf55fabc9f5af9b5c7f6e79adec362778ad9c5bd30a14ac359acc2b55abba978299af7e9ff75fd7b6afebbaeefb0ef0fa0fdfb8ba7f61193daa0568db5befdbf67db76d39dee5a2af94917a907952cae0079219ea1d0b611795ade6a33c5eb4ebba2eecd06f5cdde3c07fd18ed6ef7b03ccaffbb0bbf37bf45e97bc1f3d8aca16fc727d3a02f1d76d9b779bc24c3f9c6313999d042f177daf55ecb1ebdcbabb77b7d40abbd78dc2d53deefb97b594feebc3afebdebeed6c675ff7e9517df0cae85195e5fa16c89501c07fe128af07df48db5e98abfb02a8c0810dc4347a545f891ed5ff3a242220dbf6bd0a1cd85eff7aef75db9693a9ffe5a2b4bb727d10bc56fef0c06b65a349c0125397f9d16a72dfc051adea1f11f5bb7d4ceab52eac6513fadddbb08ab37d78ee0fc31ace9a4aad1db27def3d5c6a01912db6faecbd56eeb109cc1e764ac4fb0e97f63ddce5f57e4badecdd28a47397adb7bd30ee7baeeeed4884bec565541d81f82fd18e0bccf4c7a6971399292e7d0c32b37fe8ed93c24a23b93b69ca60a6d6aff56b8d014dae33d7faa18b738e377289cbb47e17554ca554db849486b9bb62b8426390e21605b48353bb1a762e9cb12418bdf04ea45e16f495bb0b8629e827526fa49f48e76c18c4649abb0b0629ba2f0c64727b1fac3b494a3726d6d30ab2bb5e38933b77f60fa9d8b9a190b95c0e05db746a34e8cf11887f8f4468d9dbc7ccfd57dc64a34ced6c1f1d91fa1497f44d90652c995555c7c9fe585eb61fd2d129d654fd762795f4bf0fad58db87775f85d0f768397349bfbe77674eddfb3ba6aadf7db6a39351ee7077127d7a3fa74d27b44c671d9d1a8d4cdfaf135aa6787692bf1d81d09f23115aa6b83bc9f1e7cd0a266c0f63f6bba8ecaeec34af75970b6b1a4c9e2311faf3e708a47fde59ff9c2890e5f7f05a29947bfc40721ed3d65d3070c9fe455ee3726699d3fcfdbd4b739a1739cdbbcb737b945d9992bbeb8537b9ec91fd8535b907e551e440ca99e9fb08a4c869fe4ef32af2b37fee2e9a44f824ece6416903a9df37abe6fe7a9bc8dc4f69537a3b7b00a65821f4b1bb977cba0b645c0686fae4ee72e186ea82954eac2390adcce3b4da5f472055334eaea390f9593aef8482ecae16d6c80e9651d6d0e664e189f3b660a66d57a9cff6601d96b08baa7fd3ffeec37a6ffdb20af9a4ece3522bd3c7d9e8080404ef2dbe69d96ef4dd46bd7bd3b2cdeadf9487fd128be68a3b5c9de6cf84ec22385b15ae2a0e72f7d3562fc5e5ccf5bb5bd25cdf5eef9768bd9dbdebb61e8b50dbec6c6fdbaaf3f86cfe2299fb06ceb5aa3b1324d4ef84bc864533fd7277b1686e9ab95c2e97e7d78b456b9e5feb9c5484fd947e38bbee29ed6e8bf45291def95a3ebdca0be47c1a50d853046477b5d095bbdc5d56d4e4d619332bfe7017d1134205904e8b85738aec718856ae556b4e26253a4832260c8d79fb3b7eaac655b8dc5ffacfc6edb426bbc29e1e20bbcbca98dc5d56b8e43296eb5b90bb4b0270720d678f4f5ab99d56d6ac95674847209d8f4f5a59b4dddf2a6466fb796d166466fb167f797e57dd875001936a7e49dfe7451266ce0e12f694986b0e63f61dd3af9df5f7da2c883f7d6abf7b2a6ab315f3922fb9d69c934cd8536418b3529fb426fe9c56bf7e184340152ed79e793e03c2761aa37e912c41565ae954d85eeb2e099cc9f4fbc5be617b08cbddc5021b2132b9bee5d16372395b7f2efcfe3056bd66bf5f4aee0fbb7dc03e0cb5c487ddee24119721902acf42425c7a0e7fbe784b5c1667869557b81c7e7df0bb7dbc1ed649305c864f7ffcd7ed4e1a71293eed3c6f9517274e9c14e4fae22db5b2fd1e83cc5c7fc9c3db19bc541567cd6cbfb44d9eedd3d1a9bee3522bfb770e7fde72e6f9740c621ff6e19d35e5d23efd390a11bf3b69fe125d72f156cd38f97bd89d8d42bc7fe172e6d783b79c19fcd0de7266fbe3d791487dfb3d02117fc9c39e4a90ddc5029a5cdf7ed8a18b3d0a193fc465cd21f5ac2fc31e86e7d854b3fd30ec11864bad0c7bf1667d59fcf0963387dfed43c4a5f84d7ce4eea4f0c35fa2e10d2ffd1e61b88a66fb40ec8fb7b45fdf8ec9a59043f0fbe72864c6c922ee4e2ac3f0bbefd183ce21ee467a3d056fe7d79ddf9db94eeadebba5ffb4b7b55ed34e099ff2a012fbfff69e8acfdb4ff2a702f4b007007d2a2bcc97bd8e6fca830a10bee93c0d7a2a363efcfe8ff2a0a244e5e781be5f467950f1c1379f8fc51e28e763f77dfee6836f39450ff4379f173ff65428be7ddf93f846be47ff46f1edc32bccbf7d4ff4393f7e3f49795001f10d7cf70f81f00dbf77e38ddebd07fa9b3f10be75dd93f8063ef937a00f9f4afd207ce3e1791d7ca3ffc2b7d7dff06ff7437ca3f46fe1cf7e87245fc4b7ae7b10df28be0d3df8247df26fe293f8d6edfcadfba3c7f137f271e01b0fcff7e05bcf7bde13e11b0fd1f7783d8fe36fdee3c037a21725fadbab08af40dbc1b79defe9f9d94e4f0ffe1b20f84443201882afdb03e4934349cf5fa00ffdc29e2e763bd13fa09c987fd72329097a3d6127fa00f97c3796d381af170d49af2747247d5e22508ee79f83b1dbf5d0ae07887e461590a1c76ef816e4e0008d8c768042fa3a3afa9bffd1d1cbc7073f8dfc9e265650c1dfc0afa082eb79b1c77f24827fd4d1687fbb4f33a27db11ef2f1570094f315bc057ff3790b8e8efe16fe118ea3b7e06fafcec828bc8f9fd6f53ccd8d8c8c2af89bf715e09b91510e7d0b70e018fa9bf843afc77f44f443377c2cf8a3bf01fd118d96e371e01bed6fe0f8a3bf817fe36f242efa9d1d077afc4643437f8388e8673f74e387fe96f343df1b3dd2df628f349584de82bfc5de8259f4372c78a4bff9fc8dbf7d7f441312c22f74f4427fbb2f34ff16bed0e398cdfe0611be0de1dbd0dff819d1cffe26fe6cfead7b1c4ffb1bf9b499c3e86fde1be15b0ea3c7f896e389889ef637faf86faf47c2b70a2af8227c9be1dbec77765e08df82827e866f42bfb3f3b3bff5fc0cdf82661ff437112ff5d1fca2b7e086a8f343f816846f413ff4a2f8f86fe0637cd3b9f1f86f2186d247f375de82bf81f8843e9a6f01be5580579847e1e3c037107c1e7ce3f910c7877f7b6110427c03c317c237f0c5d78b7fbb38aa8fe60bfdad077bd047f369f866d4f339f00de31b7e1cf78bf0edc63fc6b70e634a1a65e2e4508218b66c17042a6089428d326ea002021b95fb4b40f8eba3f917df1ebf0fee3e9a6f03373dea271a027a217c9bc93e08dfb49430420c33687e08020a256c405a38a460050c4e88200d343bd880fe9683657d341f08df64b8e9910e5cd272ff2d86c93e9aff833f7ad4eff3378a49e8a3f93ef8d6835798362a39cf836fb1dfc12b28d9a8d0d7c1b71cd8c7f04dcb872e28e8e2039c37639861a37d851b237a800107384ea461a3423ff63712f7e8a3f9317c83e1a64700c0658fdc7ff3b0521fcd1fb18c1ef5df1c2be9a3f922be8578059a8d8a7d10df7e20b1041943bc09811b216c2fbcc2dba8d868c2044760c08a2a6a8861a3e2effdedc3b43e9aefe19bc54d8f9270a994fb6f1dfe3e9a5f31498ffafbb528eec893e238a5944eff25a7ee3fdd9dbed339ffcb13cf9ce6d79f14c8c4e5cc4fa667ee0f63edb5f6afe11c81cc708a93d6a73f9f8e4026ee9983002e6f9c46c57967f6d1bfc78adb694b4e671961173514d94e9b3fc72027e4723914f2fcd045ffe60764c993e9fbd72fbf7e9990d7e6cbbcd6f566d9c8575ad9f1ccc9bfbe7fc558334f5c9be63b2efde77b608534b9fc726f99c9bdc299dc2f7a6db6ade4c9fd5dd498ea97c20ee205d93fbfc1b00940ceefefd7a72073da3423a5c7aa9a853a69e29e7766219dab669cdcdfe3d849fe6227f9d3abc2945cd6ec6be4f904d95d55dae4fe2e775795359fd83ee8fb8ffe74fe98bbab4a1599c769f36bbfff7443af70d79a9329eca252c96bf3cb2f77eeaf5eabdf1f3614e93f73d844c8908aedb5765af9897e44bf3f0cc3ffcefded876efd4b3153dc5d24a7c964cea3fa117dfa34b78f0f2f55a1a2933a979ee7776be0e1a52a675a47e7894b7f8b45bf3c34fb3b79a6f2279d467fc979bce6b89c6f9fd62fed771fdacbe334fadd159d463b9722943f297aad7bfa3c5eeb4cdfdece9dfb8753eceecc3dfa8f40909c467fde22a7d10fa7386fe77ac78adf69743241969f3fafb99d354d9531130dd95d55c2e4ce2599c52cf35a4943f2daccdd45254cf6e7f19a4f5b2994fd7b4440171f3aa9f3928b5eeb19c408a4b650d81e4e14c8f9dd35054eee6f58589f7e587b4be6715ae3eab4192777bfe46177bf4ea21ff63871a995e7f72d67ee9f5190dd35854d2ec54c5f5ca23d0299bfe4d56bfef4bff6d13dfd57fbe84cbfbbdde5884e6ba795b2ec3f737799b192799ce65fefcc5d443115398b086713e4fc167b5a80ec2e2c67f2cc65fa61acbf8bca99cbfe218f29f69d5248aafecee5cc79ee2e19d4e499e7fbe8347399e272e6727fd8231132d7a737abe68aab669c4cbf6fa995cbfab32630575c15cbf4bb8aac94cb8e93cb7eff25da9dd41fbad8770641ce9fb97b47ff1cab3ed3efb18acc140b396dfe92f76da7f5cce5bea145a7571176409253d04ce9f22fbf4ce953fa94d2295732a59452fa5d44afda483933ab20bb4b4a96f71acd6b6525bde65fe4b599fd3faf75570a56b2bfe8355a9bf979b8ad1473f965fff65abf7ff5da7cff2e724ca594fb86d69c5961e7f083902c41ce2fc5ec73ceebb92b67d93174f1f35a39737fb78f0290f4fb7b14529dd6bfe4a18bf3d62cbac9555eced219b3c43cdf1f166b1f563397ab38c8f3fd432ace4bf3d83eac662e577190b36c9eef2fb60faba926678979be3fac7d58cd5caee220cff7ef9148cde5f2fc259f631399cbf345af75f6efb169e6f2fc255ff2255ff22e724c45e6bea1e5d3b3083b7f5e2bfde9f707215982f49f5fd26fa7f587f47e4eeb8f22fde9f7f748c49f8ae2cf69fdd569fd4bae352753d8452599fddb6bedb4f2cbfee597fbdb79b41ff9f7870d45d29f396c2264d8d3036477a150267757ae4c2e63d91f83dc5db92cd947201305727e77e572d9bfbde6bd7ff51a7dffcf6b9dfd431f8178b8670e02b8bc715a67fa4108e8c2a5933acff1492bd30fa7486f67efce1cce917e482fd60cf53f58810cd29d54ce2cc8990509275b33d64ba3f1b678a63cbc2d7e44fffb485226cb9f4b6f4b69e15833168e35d36b726973d68bcd5d90cb0e4c87a60353d5745b6a787259af5431f50a984bdac5a62bd39f5c905d2edd0dcde264dc4da6ef64bc8cb771349ec6d9f8195fe3665c8d6ff1e078f1692637e19839f346cd5c33ddcc34b3cd4433d958385ebccc2fb3cc14339798646698396682995d33572ae59943a3547e99ce2d48ffd2c2c9d4c2b16bfcf8ec68f15a556c07df3c3641b69ead9da7ef59f101f0fc4d8a8d2d209b2c8bd7aa6c786ae811fd2d205bcf1499ec3d3158bc5615eb790f4d4ef6e383bd2d5ec07857bcd6836f5b40361e7cdb0ab2ed60af8b0c3da2ef99a1530de95f7a5b3c37b96fe03e2dd2f115a1104f9e8f656d54c5dce47243ed23cb89da4716b803d43eacaa6239ab27838f5583da47569db58f2c51c7a77d58557939eb27cfc7a23f321097393bedc3aa6ae62c590e1f6bb68f2cafa77d64c5f2c425f9594039ed23ebd3691f59a4d83eacaa38c8593b197c2c4bc6c6f691e5b0f69105c6da47960eecd53eacaa6ce4ac9e3c1fabcb6016cd605698415c8e9f1564db8755964fae82e572b90c3e16f5da47569767d698272ec5cf02cae0f7d3f661554573962ccfcfb219cc82651097e16705cdf691f579fbc822f3fcc625f84d76f28ea763737055ac236b8c3acc7dc45531d103303ff1c3b7effb2ca05c86b8cb4d4aec56bfdf0ab2bd3e2b28973b19c45536e2c48993bbbcf04d8a8d3871e2d83e8cdbb16d01d93c7c2bb2f8f61dbe09557c9301d928bef17800e66f05d91c931e80f9fd5a20ee733b454d18fa1e4499a93dced4a73cbcaffbecbd7dd992d7ca8f54e235ef7f78ad82ec3d085eeb2e2db464ef13e0359abd4693bda31ed9eb324b2ee435bfde9ac945f63ccbd4905ea3ef3d8fd7ea7b5ebba141843dd390f569571666724f2705f0597435edffaa07940a0db58f2061430d418a58ac213435981cb898dc5591e787b1aa99bb8acb89cb29cae45a4bad99535745ae4f8194575ab9feadea3871e2b856f6ae4c9e67bce49b6feeaac87e6de4390af9ac9ecffe97ca9de259d37cfa42e6538c15e633643296e70e97fe5933d3d7ca37d37bb36385b95fab9b9e86534a29754acd5ce112822d99c769d4b98460cbb68f5af44ea3528091c28b7dfa4842f5e9dbaeebbab102b1d49d89b0b36d1f9367ec02019bcc239a6193e993b24c9f8e9487f7f49184683cede57e5a94e97bd55af7ce76b69394e80f21adf5763fa7d775f6e97b5dd7d52bc48277b3bec542b5ba8780d249bfa7f6a97dea3dfdcfd2a7f629a5a1ad52dbda9ff667f567f63cabdf5d66a8d8ef2caeb5deaf93fabb0b8cb0bffbda3eecf777ed63e60c9cd699c965255a8a1f50e2017ef73fbeefbec7d1f7455f3913bfef32c8ddcfdac7ccddeb0a39ed7b8a02efbfa79fbb2b0a355936c7ef67deccc3dd15059cdc5d519c20f3dcf9c2424efb6ed7499dd433d32142fff941c0ecb4f147dd2791d07e68e708047c71fceec3f00601737752a9954bf141efdbfb7ef1d228dee4da495d5ffff17afedff7e3fde687cbefc50f1d871fba285e3083210dc76f3c45b1ea4a2bbfbe74c0095010275fb5192f5858c82f2ce2b21ffc251af60939bc1e7e0dadf85da7119727e4f0fbbf1b838019a402bf1b83df63d397434cf5bd7ff939f9bfbcdb572b9c550959ee3a522983ee656bb2d78eb28c677651a1798d3ea551a0c994d2ffc40404c0cc1779add49167ad2ccaf333c8f3c528bee4f9e42c9a0408a360210e146fd674599456d833148a3162321458727f98bb0b0a2e0a0597cce3269cdf45a5528994fd657d91bc4642bf9207c664cf8e75c89468e886a2b934f079adac4f559ffeecde9f7ebdf5c37a9d525c7a583b6babe88d04e8c46f24c0f7bd4621943aa574826215ab6657ee4e9a35f977df5d505cc9e558e64ab65fbf5620cae4ca5cd10f7cc9d433a51ed2faad253b9495ec4f3df025fbd35805fff5757ceabe7efd7aeb2b65903e3841da81147c2abe481f049f86773e58523b4a7d1fe5c351beb7ef8d4e9f3847a9ef0055a6edfb2855a6cdda8f62df1b41f83eca07c2f75e9d544b5e23d3bfd9b103dd836f737ee29cb757ca87036ddd77fbf0de621c68b3515bafef9eab8a83298604bf8af75ce1e7405bf7f563dfb903d70998c3176f1308fb3a0699aff3e29797aa49f8e28f4fc720d749f8e3ebdc522be7cc8fc59ebc55344e9ca7896354f36177168e1de04266890e60c945b9bbc8b821a3a613c33b838da31d3d31bcb3107667e1d88ddee8347e07c0642c77020bd0368ba57cf8a665037115efa7ad1b6f972d4fc4e12fe50edf6cf7decb625cd7bdfd1bee7b8bb7de661f6fbdadc355b638b051d1b2591a622a235addcfc28a23bf1b79428767e177ddcf89676187b5b664ef3adcf40867fd03a3bac71e07828d941a1fc7e3b2173fcaf8b2efb188ec457cdbf9d17e8f208c2fbbe2872eced7f78370c3d97011b791bfe43d168912f4e247213fe87b2c12f4225ef2110492035a327d0e58c9f4bbb1c8cee7bc78c787dd283b0ffb6e3c00d08f6f6f919dcfc137d8f77cb78f0f3bf16dfc0d06f423beedbcf86dd3b951c4077a1b370ad0ef7ccf8d72137fe7bd5b6ae534192877d706dce4ee3a0173f7de6d0273f73d1f86733c00ec7b3e76a3c03ef639f706fb9c27ef0df6e4f778809d07fa25efb9b7d8db78f16a654fec6ee2016e393ffe2df63adf63919d07c237f2471b37caed363ef9b3779bce8d72bb896d8bdd1bd1dfeedffe873ee746b91fe53fcad0df7051845ee77bfe26fb9bcfdf789eecc622b0cff96e0481fc1d7cd3b2c53ee8dea62d86bb5b04d67d0e8e427e8e94f84038caf8b0f7468b8bec7c14f1632fbbb7f1611817e5e76d80206229402f7e0ce3405bce8f1707da481f1d2e9572972dd88b1807dac4b79f73634fdef197e878a74dc89422f14dfc1157813d97c5544dba9c5ff210974ad97b109733c87cfade754263570ad0e7e09bdb308e32c3b7a0bfe57c2f5e29406fe37fee4df63f1fda16b6e486e28a6d614bb663c6e406419e5790dd85459bfc25591f8b3469c86c60035af206ac68200d07d670e00b992f1c78a381321a00a3812d1ac88d7133e64c0e45b1bbb30f3bbdb2fd99c1ecb1c9bdc663936dafc97683295d950bae5cb6ef659b4398d8dd59f7df9d75b829db7fe52ff7d8a4a30a2772e2d8b4c194ae6ca1b8027b1bf8366d23be5d6c83fcdbdb20c238a1eff92112e384b8bc277fb4409e9f73b7de96f3b3bbf536f1631717fb9e0fc238f17b72302ef6b11f1fe8deb46c3bb80a0c73557190a9ca9e3acaee4a424cced326bb5b6fbb7d3729b1dbd6db70e2db76fee7de7c304e14bfe76f389defc15b6f833d0fde7adb0ec6e9e0adb789b84a0e96c2812de7c51fb19458d95d4980c91363d506419eb804128a5c765dc0e4266d26bfd696fc12c5877dfda63cbefe374ac13ef624e52125f630bc9583b9ec6bd9ea7be39356b61da6f2b0112d1be936d8571cf9dd662e479ed05db3ee615fe56db0b75f42c916cf3a5c849c5f2ac9f3e737e511c351c617bffe373598f8ed7880cf8d2f3e1d8b880fc337d88bb051fcd1fa9cac224c424bc6f166cdeb49fc17569a00f87ec98120c57f4d244811cf9a3c97cbf471b95ca6a2dff9e5d493b36a6ef2fa99079d5fe277192b879576619a497d52d8188e3090dcc9d92149722727a6a303cb2161b0188c8969dd6b21fc5e5f8ae2875ccc6cc59411a3258bb162adb5afeb39aca2169d285ebf6dd364fb9fd768b61f5ad1ded7ad4efb7e1a417a4a53c7f7484efb9ee6b4efbf0f699447067ef4fd9741fe3e2fb40c9cf65580ecbe2f3368ea14566ae570e69fe5e5aa99cbe04ff1cefc67af9fbdf010ad0ce22e2a70601bbfbbc4a890bb4bcc56ee114888674d34bf9ee617c6e5d7e3f6f1faef7b92f298b6ef659487ce7fff5303f1bf0fc19fbdde0165b2033e9075eeecf5d3e6b6d89dbdf0075fecab4c5bec3f9ca2ce9db6d78d225fbca5039ec860cd21f5d9b4c24aad3c8b82fd2cfc9a699e7d90f3b31047e560291d07cef8357b9e79c96926af94698be11988ab62717297ad0c6ce34b89a5c05665dac69ff2e572391896e2c5b18d4be6cff132317f8e5064a6d9fb0f53b5d5eabc53e34dc666ba90d08284957c737755804deefed64ccbdd1709bde71e2b953ffd92fcd2bebf63a7988aac543c37957f7d3a4239cd62a6e492e429857287a9e877ff89b289e9ccf4a7069e299452ee4ea260c24904e943e4ee32a289ec3be4ee2282874ccbdd05468a262c296e72a9b584cda509306c20f7c726112475227717d7953cc7e4ee12a24c46cadd15c49b390a019f5093ab94806e74c85538582eb1b8c842b6432eb1bcec1072914b2c0970d1e5f24a044758600133b9bc126326f77fb9dcd81427f77feef719c2aa99bd898584df7df7debd9ad903711067b20556585faeea3879fceeba8f13772775d96f29a4c1db1fded27e577f0c624d1e1ffcb0031d08e8547ffc1e9dc6ff5efc79c507eff83e3abd82bc7e968e6727cd075fbca5e709667db98aa62097fbbf5b62cdace54d4a250c5bd4a2411d1ad1b2f947a14f85621538b0f93bcee78713836a944b20be745a4d60d77d5971f9ea2e7287bb7cddf7fdbebb523aaa68228eadbf765da2e01a8a2bb60fe7ea97af4c8dfa7b3c8051569a5a9d7b08bca4c9f441db953bb00c1541500497c8f4e7100f9b40e6b2e672190b04c15ff2f97d3933d57cf0f3f9d88e40aa80cc0fed87d3cd74f3d5bdbaafebfc9bafd7ebf52e8677e607fa71e6658d4c1ffcd98f5eda64faa228be288e60501070040283c18688be293644149b6060234c1c7fc967a437cefef5b3d9b733e4678666b3d96c768774baa1f7f9a12f5e1b1a81f0d8985138331be2983334fecf8f1f8e77f6c56bb3ef3ed4a19aaf9427d61983801ff47574a20fce311445a1110f89d7aa49247a31f64db0ff5e24c2624c84cd66bfe4e3ed2c74ab669ebd387b1f8978b62f743b8bb90b675f67e3cb7efcd056a05bce1cf43d1239ca63d0050292fddc2e8bd3baf7b9f48dd3ba7fdd9c5bdeb2ce2d6fe42d6f140e8593bbefb278cdcdf899dc3d7de3b5d777209e35d1a7b23f9f7e8f1ed8fa5fbc367ef7e1388eefe3cf0bfb39cbdd75030680b00284162f5fbc68f16285dc7adb8b1f0eb481f8f1edbf35c2397e288ae3f84b1e8eafd7c3fef5b0b74b780df6dd873018ec050b41508c89e293e0b56a02c1f0bf07413014e705ab7019f69d4158ec56cd0c83fd48e428c3f0cc69fcf9239e5f9cd6fdff3de11fffc538f77fefbd6d9b53bcdf5f2efba0f8cdd98d40ba8b875c3eca13db259cd6bd8f50af0ce2d20119fcb07d00b90fe72d71e50979fedf2a6f8b82bbff9fa369c4c092b33d9ed21e80efabbcedffc3657dfbb76d65a7c5fe87ab689cd783977e78cb13f2eb7b84a2e517a565a725776f9770334eebbeeb2698dc4d2dddbb9909a69b6172c793bb27ff3b773fbf7cf7a20fe0bfab6391fbff742cf27fc3fff8beed9a390d03614f25da805b72fda0efffa606dea7c9f4836ee979f6b00ffa259fbd522ea75256ca3dce7ec9bb7decc8be23f7181484840ad2be529e2391a02f3d8f73e2721c83082077277d5a1ec45ead3cefec61b70c7a877ad8dbb061c306b561e3432adab0f14b4e924444441f4e91bc4444ef231022184c1445f18732423fc5a15850eeae1bb6721824027d2fc4e2efb5f2bcb01f1f46db88b6b332836a2c161b8164f2760e67e21ce70b8d04e846024cec41f7b16f0d50e87f5ee87f8484848440a11f1a1212fa257f2121a14f08cf9c6cbcf836c4586c72097a8fe8c5271285be9cbd7f3806a13f9b59e83fda66a81b891cfdfcd0fffc50e94376478c7557624343e2d0d0d08d81434f4722477908cf9c641f7bd9c73e14ba56350b7dacf288368c188bc562bfe4b06c5fb18fe19913d0c31ee8611fc2aef842f7cb738bd7c4af1f7acf9087a6fe78678689b0db79e856cd2cfe283acd6c5fe876b638147f76837e8906ddce40d73be3b4fab26bc138adfecfed420f4d79cb6077c58996453c73f279d8fbe00f8ed3eac36a0fcda587c64393eb7f70783c97368c0d93eb7b67bcd659d9b9530b3973d95dc9f52d18afc1be7e48d9782d27070441365e03bfba3b19f07d0402be8ff1dafcfa244992dfe39293212d27974c3e1d819039b733897d8cd3ea87afd77c7d7ddd9fd7f65422fc1f96c849b9bb7eb0d2254ce691bbeb8735baac916bb9bbba8c59434df6c18c0f60b20f5b7c9892439d30146ff76ebded8adfd6dbf0ed3e0eb4b507e0fb3e0cc55bdf7e3314c5d7cb83eeedcfe677d6ca33a7efed0bf9689b89cb5b9eaf9527c5f23cff1b891c850ffbf061b8b3e2b4f0eb87e1373a19e570da9fe3cff913637986c13e66ef78ad9ac6ffbe49e7c76faf7db8b46afa3ee79bc8ff7ed4c1edb4f1475cd69c83cbaa99c7ff7049c24a273356e160b7f318ce1c76b62391a31ce29913a66c9c56fff541e5b746ae0f6af1da0bcf2d41b30bf95dba742127f6be73f57ec9b59054df772e691b271334b590f3eb87e79b40662c325bdc65eb6d370fb3e58909e46cb8caa6891b9cb04579c04dcb56f42a28d9aa28d9b8e67756bc46db786d662db97349dd642793eb7b991b94cd0d27e303b8514e2eb9fef4827d0c9e5c7c007866c99dcb2fd7af5db6de76bf67161721ef7bf6015cd9d431bfbb418d34bf1ba18ae0bf4fc7227fdfc70fda760393f468fe1c3f681bc61f3d9a17373d9a0f6e19721d61c4fa67b9bb7ac0e2b0dc5d3ca4c99df3babaab82f9a099030f5e3299ddfbbaf5364ff43c7cf31ee7799dada06d99a1dfee96c9adb77de2b7f536fb169775001fbe7d8ff3be3d005ed7c8b5ffa35d156d0f40d95d134093b13cfb164ae428535ce5e589c6ec390132b1dc5d13109379ded49fafc39b3c012fd93efd441094e870a6d6594114085bb6d00ad2d099fdfaa552ee3eca6b65114d89d74a9204af95b2dc7dd77df74f5e9bb97b25af75d70e6a72f71978ad43caa598cb2663412e3bcd9a0a72d96d72d729e5ee91bc56d277fadd9cf3e7b44fed77cfc7b2d9efcc455eab9a71acfab16cb63f47a724d9dffaf7744cbf81cc0fe7a5a2fff43d0671a23fe92de97b1f7ab78c40b67f8b1205f7e13c883f7dfa706983d8a74e1647f9f79a5ffaee44df62a7f9fedd0b794d4bcfefbebb74f892eded32c9e3b5898214a420f718a791faed9d71728fb946ea5f727b3d87429e5dbb795120ece903195221a3079dbb919cc714f0a7707d18be6e77b9872eb69a5c373ed59108cdf4c1db366fcf7488d60bf923a2d46e08b094bfa7a393c7b2f7e1ec6025ee4ab6bfe4a3074bf97b1f8538c955b8ec7d8f4d6269237b43b476c8df8754ac6310ad2db94a49fe3ef459e2b664db8d547e6f47ef13c1ef2582b76d6393bfc521e8b329acc4652d5fb27df2753f97cbe572368ae95875c2941450c865ab769a7d8b4bea23915a453315f5b0c593ce9f39950fc8fe9d7b0462bd8313b66bd192eb835aace4fa2f25eadb25da64fba1126972fd11873572fdf0bffc11fbf1fb7964425f44f39a7d7bebeb25be44f13d5114c30f63b76d3d865433a7efbbffbe0ff63d42851f08fbdefbf0057ee717888378fffa97f8de9df9d56310b0fb40f03512a90f62aaeecbfa5723912bad2c3e95fdfa1f2eed8bf8f59e56eeeef8e0d59a39bd7efcd78f1f6a65f1ed8d5d7b45aaf1ebeb6377ca942953625fa57bc7f46c7fdaaa74ef2869b678da9668d52d76db16de2a8ac40a727cfa746c0adfe272fc10cfc2ffbe7b1f9b463c0bb193f7f6bdb70ffee77d541e14f5bea6fa2f5cda0f3f0c6f29feecf53d7be120dd871fe22c86ffa2023fc4e5cca52512e2ee24dc49e5eb2991fa212ec1b77766f07567e70cca1f9f38357014723f4ca987d7286e6a812eaa10521a35854a942ca898b942850359acb1353da2924150840c65d8a4814613b6a647feedd869d969f4cb252db71f9564bee18b5cbb5941f657f25af9f5f01ae90135d99f87f68392627739168b4eebb098bbeb062b72c53cb39bae46d894c7911b133851468e034ea4b159294890c21a3464f8c014b6be81f4a76f03f9d369d4827ebf5533dfa6d6f40d42ba25d7d7538c6409726ec9f5db0aaa04f86127c2c0ce5f04fd6f20f881e015df5ecf7e08de0edb1bdeaf1b838c0f3ebddf8b37fc25fa85ffe1ed3c5ed8f52e96679ffffdebf513bf7ede0f83deabc579c77fbd9ebe3ea4d7ab4fcbeec32ee42f39bddd873d8ab8bc6511a4e4dd7a1bf9ed0320f10d17fbf600807f6b0f007df2e9d791082dcfff79c317af3f79db16bb5ce287f38ef87ee07d8d412cf821784b2ccfdf47e42877df21a1829c5b72cf2da25b17b4b28755bf9b3a3c9fdef296adb2beb718abbe7d1f89d07289cb5d79422efbbf5b658348f71397f4a708867277ddc0432eb57249df6d809369b9fbb013bd12cb73f7fd0d84e2ac0f53cdef6cb1dcbbddd3d1c928531ceb9f5bbcd6d55ff22d4148a820b13ccf9ca6ffe7596523cf5bb6df9d93512ea92dfde977b7bce5b21fcbe9e844c3738bd33a8b0898cbf32919e1fc2aa1f9e1eb853fa7bdbceab4d78731d7cadfdfd91f7d9f73ce7ef7aa5b9e2f22950a99d9fb79e70b97589eabe61aa1dfd23f8bcc4d6a0e855cbebeca5b03853839ebeba8ead3ef9fb824f3fcd72dcbb27cd5aa6f4a0a2864ab2c9bbfcff2f29556fef0bcf65fb773dfb2ca7393bbb72f2ccff53d3c6b9a5d01648f9cdb39a45ee42424c68c2ea262b4a74720569a19f64a4f79e83c7d1a7d9ddb94470f3064d96398bc263e7d0f9ebc167e5f93669341a5f0e9d3f1492b8bb8498f0c3e1d9d74b87420860c82f8f312e0b459db4ccc3d09840d458a3fbbb27da49287c7ccc99c8707f4c87e3b7d21c507c169097012822c7b4db6efb403d9de1413c2c9f62797305e736c3b7f9960bad40c02e551e447f6bf8f2cc98adb8bb245e3a404e901e531adf8917dd1be1b41968d264bb60f82d7c4b79f00255ef362b3806fed4f2ed68ad7e68bd84ab622c6aaa3e3765a5127f97757e65f26415a9b7da41ecea36df6bfa28ebe7d92f2a86fbf8b2ca69a5ddd06c4dc4dc4279a524a3bdb5dd7858d147ead1dfe994127b5cd7d0fe47c3fd3df75d7f577fd545d7777ada40b11f6d7d329ae947ea5dffda4ea2aee9982b08b405c6ad5cfb94123261be5ee32e34a36638d19647248c58e4bdd42b57896ec79d9622c19fb15a7796ecb9ab1bc746cbda73c6f7109d3f9f2fbce79fb3b1f8f9db7cf834bacfa511e3bffe393bf73db8f62af73db8f481cbefda63c7270ec8564091286b16af6c4bf4896203f8c45b327fe888550cdafd9c35422f66ac6aa4148c290583463e17282e9f20b53f97b4d8ea9e677d9eb425c6ad1914897a75fc9202d721aa589b2ecfdec9a845c9be4da56964b1272fd25f7aa66b6d8892c574c35bf62fa152fb91b32f9737795e125dbf9768e2391ae5c330feb7d9d60f22c67983c71e9796fdfad789e7defeb08c4eb5aa27504325db0d56b1d2ea76fb995a94167efdbfbfadee5dd2612e6ceb7c2ece1fb037cfa0d7e9bc93d9ca6852c7b64fa1fa5d16ed9fb7a71e7c2d451bf7ab7aba2b9eb68d58239f925dceaeeeb574a2dffbed3bbd6dcb597bdeedab9e7f7773f6f5b69ec5beec2d431e7f4eb57fa7afdee7eb5bb1a44d2798cdf1ffaebfa7bb73e08c4ff15c4c56fe701fbd07bfab0eb7d91d73c327f99be3ef0923c3e22b182b4ff12527be1a69e7d81e36d3f02df6fdfef965f299664ae5fe4351097b249ffbbde2d499efa4538d70abd967125f7bc3c4e93bdeb409642ff6389a989acba3035e85cafe4ee8a4b90f43b8aecefd3694e3f19c8f2dfffcd54af7575bee7bd5e9ef7f2aaad59ec775d195b64b069918e4d9586a9a37bfa7ebbaf65c502a4c34ec3d4e121a595de1148d7bddf7ae5849a857e186ad5aed26fbe5fbba544f3a6cddd3eeacf4eeaaa2341d25abf5a7d9a3315ad1453cf25f5125094a54951ae6f67f8894a5e4c57ffa39442296b20e753ac9a6b511852fc79f64bcff3bcaf5aea76864ed8afb8fc72ed9e7ed9dfddf74faaae2516cddd57211ea7f5771d2e95e4eeeb7531e4ec2e56f739cdbb499b08db47e7b28675d6afecbeef901490541dfeeae72c9001a78c2cd982dc5d6354203b96b55efe70b9f42bde7b17d2afb8a70efb7ee9db5bba15df7217a60effdab613ae347dd9faf52b4e73fbb6cacb56a4b76a550d34de819c5ff6c8b5eb470359f2d0fa140b695ad759be1509727ec993fd79f0b74508c3745a3bcf812c1bcd0fa7cd2eff5abbaefb9cd6d9ae0ae5f93c57c8f618c8c665cdd383952764b70039bfb340fda2b065b9e27266fbfae961e55936c9df97502a399baf95957a7420765282a49f81d37c8ee277ef7d3f71d968f2fc1197ade61371d96c405cb61bfafaf9dff7c233e734b74899def2234992ccee6fc9f079bce67df89ff320e9917f187ef59a8f40c25af31c6bc54d64154c11c41499d2af99e2197dadfc4e23cb2f3b29419e50361c385f311c0c27dbf77f8aa2f885cb56437eb86c36320f37998acb86d3646a87f1cc515c36a1e5a83902a1d803a7f9f7094ef31bc8f965c399e20455a021d5d7779dfd423114adc56593a2dc3d08beea7b1e2e3d7bff7df77751edbeab66c5e2ec0ed69d545fc869a4d32a2e9bf410675744ffc800698ca31186a152372ebf287737962cbfd3ead372edba0f43adda2778df2390164b9edc40baab87d32a2e9bb4994cdfdd8610fc6aadb52eb952ae4e7ae4f0eb2d7bd01eb916e519f6a047feb3c7ec51f6989fcb1ef3bd0b29be7fd923fbbbf8f19042b2a25c91727dd8b7d7ea8ff5bbd8bce0c3ee784ba5dc61ab5a7a90bba72310307c914ecb216e52946f62cce8c24bee6a7eddeab41eb059d184595da6b2effdbf64a1d3425c7ee12d7be4f06f4b1e42c9a1d34aac1c86b754ca9fd35e647ee112abcbe277625697a9baafcfa3dae67fcea3bb72b9dc14dbfc30fc70f9397cef962fe4b5ee9d1ef97bff794d1c9ffc52963d7af4f217c8d72379ed837def4d7ae4d87f35f0fd6397745af8dffd9c163e2c7cf2cafc280cbfbb3c4e0b7f8e4044fcfd127df092f53f8bbb629156aeeeab678f20fdc3cf6bf4d65af6988c6409b2c7e4726eb90fe4f725b995c17e93cb3a4720205ea2563503f1badb7976b8498f71c2bda0821370725773f8f5fd45fad75e270d277798aae28fe269e6e55e854b802c793ada449667cd4d154c1104154d64144dd8b824738bdf7d69bfed1d920272be7da7b2d89120fd71576e600c2f93d259c549c7c83286953a02a194d6aecd1a6dc69835792e1f504220535cb554342d6009d94c31c67cd9eb2e31b6642c9ae97b4711c61b28bcf6313bc93ba93fa42f34f503dd12368c23c2f832c3d0210c18e60d2385703c43a42418bf3060a09a1848052905184dcc0b0613130c2266979e2d3ee204c3069f1e9e1fa5cf8bd0a97ccda590c8d3c379d8fc979cc7dbfc3d786a1f34fb47b5d9ca748bad6c35d99b8debf0f7d7d13eea3f914b592e934b31d76b45df2aebcbfd559fb3c23bbb722e8754ac97288755ac3728879d58af2c8756acf7c727879f586f4f0e5f62bd3c792787a158af4e0e45b1de1d391cc57a95720813eb15731813eb0573488af5be729823d66b73a823d6dbe57047acb7e69047ac97e6b047acd773e8c3b3d3e3f303c3565864d6d1df956b0ca14b610347c84fee1d9a20c59e606cbd996cdc50ead3d9a099734e1f29ed664386cd185a6965a3049b306cbcd4ae766cb2646783850d0b9ded2c9b29f94d2e67ee30462cc8273c18063e9bc40b1c02fcba8422bd23d0228ee0ca081b6123c8a901ba8189744d8c8c91221a52a4931cc31c32d9bf70e27b750e99bbeb8b2f3a3b3a3bafef0b2dd9bfb8f245ce8b37f97b512fc2c83c3b22bd5eace111699a1d9d1c32061bc5107c7d1e0f4c27e745995cd6eef2628c176172f979c1e585979ecd46cd174ba0f15e1b80175bb28b79c9063060a9da925dcdf42e0787f2a062ccf87f39724b76258bb1593e34a41a191b7a54be9bcc835ef1a31ce5e16cfcc8ffc9c8ba4831f40a9b2ec7a6cbb1e9726cbadc9cb76ace7c85f268db47e692aae9c45ce9b26285cbd6d69629539c46739acbb2c61a58e0c0b9f2e68d15376e9c46736fe3349a5f751d76365daecb399b2cce26fb77b99e52b73e2be215120b4f169916a12ddf71e9725d64e0b8f12c6e288f6e4a67c54d87c54da7c54dc7c54d97eb24355d6e0b55b3858c1a31540d5d63a6bbd6c0c9251593fde7162e73cc0433c3ccaef9652e31bd4c310de784d7fbdfc2f79f39af95de9c32b7fca79579c56b6537b1cc2c5e2bebd4e2b5b2c803a1259e1e2212f8fa6a67671734a4201f209ff77feac804f578ff1f3e1e78adca46974197851e7562e85197dbbab2d46de9bc7460ba9c193fea3568be356ac8356c646bdcfc161ee771e3a3fa93a28c47a828f7d7a84ef2a7943afd3e2bace8371cda1397b7aae7cc93d695fd67165bb25338fd659ba9b8a4515cd2f2546325eca2928a41960ea69b8d83f180f2f83e9a4ffb94f26c323d261964f95e90fee5777729a366b008bba8b4b9ecffdf976de6f3ca7aa5aaa13cdc8d1ff97f6c4837b20a27e7b27fb7e5b5726627e3b42b944707c68ffcff653292bc52c6ca192c69b4acf123ffb2e392bd4df72593b992cb7ac54b2e7dcb16fe1d9a3467d4806bd2b079b559e3c66b58df1b38dfade1b532dec6d1781a67738688c8d7cc666e866848c8d5cc8280ccacc9e5d2dd7ceee6760296d7daa456116a4d40ad2040a9247461a8c4fe7cf3c6b588a267996dda3896b9c6adcc34338d4f9967e699b9861933138e28fa1551f4ad9cd3fc8315c81087ef5ab464c98205cb952b56ac6c6d4d99e239cf5d89229e6b5c89229e702e1c332036f3c2663e6c26bcf54a277909f2c28c1e32084e73fb84175372029ce6b229b060222b719a532f585cc82238cdbd1c109904a77938021064c94d9ce643b93494c8509ce6b024bac892b19ce63f2c8c11279fe03407b7e0604476375d80c9a5bb4193cb7aa55e11bf568e350bf8b592fc9caf953afffa5ab953bd7c5f2b7dfee76ba5ecc3b8ec9ee0342c284c4d48f82182920c12a07441b81f78e716a4bbf13743404240ef4fb100cd72405382808088de9f5e99cddedfd72022a25666338743342444b76641404a94c7121757fca8b380b8fcb6bc70497af970296b304b5c88f1a3eeb2b8fcc874b824cdf851e7252ed0f851679bfbf19f33c22e2aab9a6cc54a98ad2d3053a6d49c9735d6e00207ce96376fb4b87193c5694edb5c791ea66c9cb271329e57c354304f5f9898b8fcf8a1c5bfaf62f93eac54afcceae503c1bae5456b96b9862c95ea15cac6dbb459133e5513beaf599386a211dfd3a4a167a899f1fdcc9932b0a7649c56a6cc1827e364ba8a14c142af78fff464856e7dcfc444a7bc9ee65effe387afe170c0cf2083374a4a6e9ce6579462a4255a8cd3fcaa565c148682a92f24f48587878b286ab9ea3a4cb3b8fdaaf95716b717f2ab26a6ea7c45e2de72299b2cea952eb67239cd742965c9ce859aec64288f09c78ffc3f182e3f72c425291371296b3ae164ffd0c994be253b86337370fca717caa362f1237f2d1f17f28bac86c93ebd64ffa905d95d6adee42ea1594513640b0292c97e0bc8365465a39aa147fe5b40b6a0a1a1af5ee89157c52a197ae44342335caf64d9428fbc8211438ffc6b179d6ac892b2f19f5d90315cb6993cfd291baf955d847ee7fd691b7feac66b6597d98bef4fdff4bc3f85e3b5b24b105dc3e7fd6bce6b6517a027dfbf4ef979ffbae5b5b28bec75debf5a7993e717f9b94f97c969fe3df74706516ef2fc9c36793ec926cf8fadc9f3616af2fc314d467326cf57a23c8430cd8fe6cf405c7e41b8fde8854b1208b71fe152964b25196e3ff270f9f9fb3a5c92b9fc70299b4f7155e3e33d197093fd7b665ad75cce59a6939e808204a47f39cb5895e924fff9c434e347fe6e9e8d4c4df68926fb4f33c8f9e52ce36eea7415baf2fcfa659ba9b86c5cd272e3b2e1643ac320cbb9650b36b96c38707844f9913f1a346ad4b0c95ece2de5f42f69e5dc522bebf4427f7ee92969fe3b577673ee8ddd6f74777777f7aedc37b476664d21eca2d2b7642f3dfdc72ffb4cee6f58eccb4e93fb9bfcb2d5e4fecef9b2d7e4fed6f9b2d9e4fedef9b2dbe4fee6f9b2dde4fe9e65dee42633c774cd25c4cc3060e6172f4e1b5ffcd8c3be44ca79f24ba59dd7297b9ee7cb1e3feff3e50fa0977dd95db30ffab2c70cbdd0974d26f78d8bd3e8975d26f70fdd139c465fe8ce2d4ea33fbb584ea31f74a716a7d107ba509c465f766716a7d1ffb94d9c46dfe74e2c4ea3df7349701a7d9e3baf388dfece15c169f475eeb4e234fa3957c99d5b4ea31fbb09701a7dd89d539c467fbc20388dbe7867ce69e5cc69f15af8268bd7403758bcf66a73c56b1f1b2b5ef3d66c79cdaa99e2b52e8de7bc56d1ace1353fe334385e9b669c46df8c19330d27fb970d27cf2fa79752e9eb2ec8f9252d4f717cfa24eca9fd98f764f97dced3d7eb3c057fe7c3e7792a7e0f8d7ecfe5b97f75aeec929784dd4f2c93e78764c6e4f9df8f3cdfeb91e7db0cf2fc4e29cfaf4879fa96dc37b466f3a340d84565bbc9fef30bb2a4cd1190ddb585167f12debf890f606bc826fa8b000bdf5f890ff8fe09f0fe367e151edbf7fe206c0dc97e3ecace177905c9c2d74feca3dc448ce360f65141a22c0cfaf928307cc3719013b3e1bdff5317994c0c43f0e7a38cf8d6f343cf13838dde47b95f85c7260b451104bfd7df7670941bd0ef845e0cf651fe475014bf4fe815f4b7198e02846f44dfd3e38121eca300fdf889dff77a0509c95e7c7d414142b2bf21f8b7d7db8266427fb3c9fec1d77f7fc3f91336a1bf8d1f25e86de028444398cbbe177ee0dfaaf0d884660c20580307db0cdfb6866cb720fc7a9c4df63720fcfaef71b50c1152d86458cac4d138b6d7df70340454be48c1f683b9caeeeb47f1c1371c0771e2d87a30177d1e7cdbd1c15cf373306e62ae8a8bfc046e6490802d86b9cafa137f182e5c7c618361ae723ec54223e62ae9db2822bee1260b4894600c9bf737dc0c01952fa4d842ccd561b24fe046062b36f0869b71cef00019b617e6a2b84e23d6703102db87b926fe280b4894a08dcdc33c930d39bfac3dd3ea5c4413d6212befad60d98ab48fa593adea07650f63c9f2f758365bbdfe275bbd301699c3c79265f0b15ed94a2479b29588b1c80c7b2c591e1f4bcc56b117bf9fc72a2b275bc5301699751e4b96731e2b96ad488cf565f263565961b6dac1585fe6792b2c59f6792c32f73c564fdef9ae9a707258b20cf456586496fd8f1516996d74d2fca1d6716927cd97dd9fdbad63becf9d75d2fc9e1bd449f3792e5027cddfb9429d345fe7ea74d2fc9cbbd349f3c9dbd349f36397a793e6c32eac93e68f37d649f3c54bb68ef9e1056fd849f35f576c1df3bfeb75d27cef7ead63bebd3f9d34bfbb3e9d34bf5e5927cda7d7d6d6315f4b36e914e17bcd76def7afef17eaae5cce1f045fafef7b7fc2fb0e0a3534d0bd2d438b1834d8afb50c1152e4326b28cf2fe708aae83246a6e1537dad9a71e28021f85442422ff0f5dfeb7b2a1e1eeff39e8a243baf7b2ab16a76b834c146ae98aa9a6023534c45f5bd66cd85b47d5865c9327dacce2a6b96e76339f83d9697bdef2ca0ec3d56cdd62a4b28dbc79ab9b3cafac9dd63d9ec5941d91f8be64ae90cb376fef5cdec65bdb297933d2c3a2d66bf9fb43cd962d2693b3c1de6f1f9f1ef97399639ad8e42ed23ab27572c44e464f6f7269d21ac309bff14aeaca01cf455ac8dbe14988fedfb7e59cc567f0a5716509e5fc5b3752f452897cbd9aafcd874beffb39ff7526c84b6d74fd9ea6ce157a136f0a5c4d4e472b62a3bb6d800a654d1b1893fc6fa85461bf953b6a84de7ab74b69c9712cbf5d87abeff45dbce4fd9aab69eaf526d3c2fc546572e67abc263031ac094295540dbcf4fd9b236a0afe236d94b89b9c9e56c557482be9f6762b269b79b361fe80af58ef9b23bd43be6ff5ca2de31dfe7dae81df37b2e50ef98cf73837ac7fc9d3beb1df375ae4fef989f737f7ac77cf2ca7ac7fcd8157bc77cd81d7bc7fcf1c27ac77cf1c67ac7fcf0be7ac77cf082bd63feeb86bd63fe776def98ef5daf77ccb7f7eb1df3bbcbd33be6d7dbd33be6d35b7bc77cbf5def98af357132a76adc7ae75ee4d4ddab4ffb454ff4be5f48a87ab6ab94878b8aecc7d9e962845d7b727872bebf28877e25fb797472727e0b88766f7f0b48f4f1dee7f560ffe713bed8333eecb7826c3c98aba48a394d07dfb8cac9e3b41ccc5552914ebbb10bbbf58af7bbe015badf159d36dfbbb7bb5f7471560be6748bb08bbe8f2465b2ef3fa54ffcaa579f3e52c5b713e811a52fd4d5fa5b40b657950d28f6ab621e1459fb2490afcfc34af4887e0f7a447fe9bd866f51f4883e08f488be92f9a5d2cc4defcc84edb5febae3b7826c3225d90dd793b3030023d0c6d00c88bcf1fd3c48372cf82d20db8defff9f24fc444241de9303801df1c6057fc35530fbe929fa2b33ca81e37137fee8fb859292fe86fbe9c9d9c9f1777c99d1118ec70d7dd1f77f17ec50c2379c920eda0dd907800a7e6600a860f683a34729f6467fc3e9f81c458fa3fdd1df703a60b41b1700d54605efc3a3f3b89f279390f06d2bc86601bee16837ae8d0a3e48e6c3a3f3b81efc7fc3f5e41c612eefefdf703b2ffb1b8e16be11e612ff86bbf13930d7eb6fb8a1c781b9bac7d9f822cc45ff86bbe118e3bff8b1cc06e68a1161d2033084b9609814c2df6cc4424ef30f127191d36688654ef397dd703f453e2f2cd483b93eccb383b92ce6d1e970cdc15c1593f486d6e85f0da192d0c778489dc7854b4342447fc3fd3ca9f3b8598f40cfd564277b8ffbf99dbfe1661fc35cf471b2eff97e92fc91f1f8fcf838f161dfff41e4d4f91b0ef6b0c73d8d08fc18d0df70e1cf1e37becef7f7c0e5bcd0df70e207f1fc0da7f33f8f9b794079dc70e20f61aeef6fb8f1853097fd1b6e86b9823017f8371c10e6f25ef67adccff37cffa7f33b8f837dcedf703ffeb1bfe17c30577df171e4f7cc5b9569bbe17830d7c4b21d100be960ae1726733e5c44622e1ea7cd8f61ae263bd9e277dafc1b0e86b93a3c569c88b91a7339161fc7a3f5f2ca157651e9b9e161bdf811fdfaa568bfe4c9a550ee27bf2cfa6005d2aafbd8f755d8135e89e2cecf1508025d8d5d6e5b41b6a01fff0a06f3f9af8ae9fc3c9df3bf7e7bed838040d9ec09452936febf6faf5de57cb0025935b385d349f43b5fe5fc0fbe7151e5f8e01b1715ec357ae4cf2c483865bca683af7474b02d33e62a2707b7d3c8f7ba485c5a3299be1de33518be82c1b01db3c488afc611db25c278f19a88af44115b2f5bbe782dc4576188ed172e368cd7407c0582d886711a8dfe0b5fbd5ed813e334dae5e12befabfcaf3cec81719a1593e9d5fc2ac7545533ce557dcf0b2e2d18abd8fbcf2d48cf7568e074979a32f93fe76df1b8780df6b3c56be318afcd9da2305e137117305e0bbbbc06e22a1b3d4f816c3d5fbcf692894b78edc3429e17af79b2efa77251350acc64fa9e18af59cc4525e3a2e2995c54649c3871dc7cb002593f3b2e6755a6aaa884c9940ba4a99e2441a7109a299226003400d3146030482c1a0dc80382284aba07140011a5a2505ea0c9c32447524a19630c02869011010118009819802000a06437b3b88b06ca113af6e79862e7c185e6e24ef73a68c1908215ee40ee9f424725ce944890ff64131ba712105589b985180339966aad0d4de1852fae8208fe3e822614da9a080a2a43e90f76d244d4b11122ba88ba80ba7ccf79676208ed3e891802dbd010f2bf010da1366e975ebc426f382cb040e4d1cdc52c56686d7800d52148012818163ed4f59180faf03851f820257890ba7533266a8b191fab97c02c04bf85d1380863df59dcd75aafcc1e7b93feb777db5b0f479d7cc04424274331989143855f401580ba0bec1ac6de17090612f4dbc147e10fae016bb2e27524ba3c4575980275b75051c1156235e0b1b8805b7e5e933cc03ffee3777921ab734c37959e48d8ef5c7b5ade88f74c398535f322cd15bad440c6b3ea3c900d0589cfb94c388f1a1bcd3ec62eafd290bd4358cc7cf2d988af1f1c456c7c11ddf0d9a84f9079ad364c7da002bbdcc5f748641ca04f480784ce9b14dd54bec09eae53965062765ca8eaf151746da5166ae34b53e764aec2638a1b15e8a8de0403ac7aab25819ee61f15208908c3f3a0c98c76a55a53b4a2c73485b1720ef4a13fd862cb9d8da5456dc1c900ad5497686f4fcc25a267a884a0a2e5964bfc34d8694aef7023ccbb0d29ba04a1cc34bd1f04222d07bb2fdea4c31de932cd847358677d443ff753cf1c5e9feb182f888051afb9ac75735b5c3de2f7422c27853284a5171c10e6750a41e04b3d74b04191512f53e9bc36251fee3d1c58ceb12446461b06d48344396c2392a2ded3548a09c8672fd0f70d7d3705bc4ffa476469c44a5f9c9902172a6741c6a02284e9bcea3999c939a30d2a8517234a8737e6dca3172a51290b15a1be5d2e28714c1702ec11a90672b8f7cdfa569a2ea70e03436cad2d77a79a4f309ebc066050f08af6d6ea9ab00384751ecc6089da78b413b286cfa494baa894e7c271a0a103528b318152b337df6cca18c717f1a4914c68216a945aef297715e1ee23e0b66669f16407c089d1b661b106c95c84a6f0d09e644e29360250c7e7e4910793a97e7421be451f22a6243fe1f95adf1ceae0d558f23262151e3e83fb83aa1a676bb5616341050e0298e27ba6e0b7dcc9100788c9854fd94305a6a9bb0e057659223e99a5e37014a319b54a8bc1b8fcb818b2d145544f9116d1c7c7507ed941486ff88f1a1327ab7d5f0ec2610cb0c65b8d1fdd4032e9125e2be979a6f8bc54cb5309c83822fb1b46ec48fc46e2043d118f0478cd03c1bc2e10322252f41f245f2548f17e6d5b27c89e10d1d8b3fdfa4f1b0c8497e268418968515db5e705478405cc9c4cae1e1cbbb8eccc5432f64b5e67464fc1641f4f58ea7a9fbe40263f3ad5ec803c3fd02d16684a96238e7973cbbc9323793c1b1ddafaab2f444d4e201de7e4a0d4af90454e16993bea525549d5a3c2898187c533c5dc116bca764fc166cd2df22e8237455a0e54a456be563345f6cf44604c1d033049d67b0fb5b5a987dd6a43745187cbd0ece938a43d647c4774fc4c74084a0aaa7609a6ee8a8e8e9004ba37f518d778b78c74bf4859d03efc4a30db89eb57e4040457d8c75464ace76704d0d77c724eaba29e4cf7bdefe1ccd8dba4cbf5ce154ea11a3c3ae89cd669d1d21364fc7a7a7ad9f3a26bd876e6f047d720a3014eb93d20d08872b352e135828c9347518e0134db6c49b8ac8b263d46f6b86380d81ed57643a39222b390b29a9012f610a712a31ea400dd80ac1d0abc679001385f637c826e712e734c8da0d0f9e550846c4a1392cb084a83151337e0ce02b9d52bc2148c3c96535dc0808fba594073e3ae49919be2d7c543fc366061ccbaebd3a9262b001789b92cc5de4c0b4d9944b906028db1a55329c15da7f0c65886495430cfc762111152986e26cbf1e68c209989812733d04b8c96d3e498a57d628673fc8d633a1f6475c40c38643db0b24232e7b70ba7b9ee274876db00d03a76c8c6b1765902a0f099f9fbf9c23fdcf0716ce1381555fb44b5753ce9f50435ad69338cd57be9849c5862b033924a53aff3f770b5b82882a27da553e0367746368edbca1451105a40d6c771b81530708ac3a44dc83f0d8e0024a285d2cc60a95937c9186e758fbb8b8e3e000c8df2c2cfa7dda07e016aebf68146bf2f50ebb9d9f384cbd07a0c605b4df0d02536e898af7355872d3484cb63283235bf0de9904ec546067ce4a7730349b4b231117a73406158625d8cc8100a68c1a00977d0b74a2b3b71d5f3731c5923a8f6f4e3c4a68614ed26b5af5e52ff121d5011fba57a24a00cda962222022dd5843dd9e26e7511557b34dbc532d7e9fce175e11e1ef70e53759f315d165476408ea10bf9f4ddfe8955dcfadfe337cf5e69cdd167e3a4684543289a4b7a143733960b3fdae72e8754c8d9d914b67a742edd71ea7eb723dbdc29b352cd05cebc34f6809aa9b11aae8aa243052f155ad5a30e6780d0720def7ff88f2b1b1485e35aa13df472e5b80a0a201df5f30eab2104e864ea2839bb8013d711fb377ffffd43eca8d4093e69fab6973fcb17092a1ae4f50370a9c55b0b33063714340f227f0c388a70cff78726920cef5e237ffac950055c0561ed693349537e0a91f67f0b4b42b699074693c455d94710ca5c3685f8162afed875f308c03f21ec3333114c5951461e93d27233899ad4e6598f4f3ba5ca02ef83f19b8483883296b8b4b844f4da4af689ac309a6964cd1c0bb5dcac33d7a23d8d24e0512dd81fc4213336525b109b698c249f67cc8cbcfb9d06b31a8092c07547dbfb84ce60c9decdbaa0fcf1389a718d3d3b98479d04fe0e6919898b1ce0007b136e28c2bc4e2d2976969cde80a98c2a3b9675d75809c22ba5f48aac4736926033e1d22287bf40c13114084d384b08472487efe0971fb073eb1494613c323d1342184dabf4c80f381eec9caeed51fe002c5f4866d685b4666ba0936abac5124b51e70b9da59388b14322169bee25791878f86d469969c5592197b88d5d837503b39566e80859d523117c181355006d86b4db69c80e1859c2458e929ac991a86f46e9be88242822dc9a9c9ad5195a21227cf1e442f0712038c79534ce0080933cc82ad1c54f30e42f1892d240a75613289ef7a18bed291c99289ada3594e633351cfd390b9282d8d07e0a3cdb9722472b2e7c7b23c8200d7ca3dec7945036e4c39fc486331231f0349a50d7815750e235e80ceddac37f98c4490e3bb2eea9382bad9c1321c0be33ba55f486782edab4571dda3038bafc724242bc82cb8855cfe95d127a481c8ef2fe17b5501591f69b7ccec4d61895567119ec680618c9438f69e44416d54889a8fb8f50a904102b00de27b6755ce331a375ab651fe42ba45be13ceb169f1c77f4d16542ce9a682ca06f941d896fa1a656d17093baa3ce527f76383c7921206022d9c5073e3c1f0ab1db64c6444cec44ecf4339d9aee9a117f23aad230321fe91e634f405c871103a6425cfa20862b2c4b5626dbbdea8b19a608fbae91323864016b463fbfae5539768e7435d093e0d0d3a9b19f4cb9f82d59df738334401aa6230eb599bd3310ef6c955ad49cf15678255a9901567a4451b0356c7b248aad7468482fa531e936cab9e00f2fd11f30a938d98804a5bb5a6b5209c997b4342871a6174a87ce9fdff6bfde8dbe39dfbef22845d30039ac1a913488be56a39327121342e069f3164a1b1b14eb5eff180e6201f013eb635f8cd1c666e3321c81db8285659625261031d34cba4d2172a0c8c26705517a11a2404403e81084b4830da83eb1b20ad12a41537aa426f574822ad583f027abe7f922edd8471db6a6c739b7369f7a077019e14708c21280f33bf0cc4be343c9a9b3692ffffb76ec87378e33f84c6a9719124909e9f7832334f23379763a135375b5018fdff8f26d66f9600d79d770aeb7541707c500ad970e26b55127e6a3a40ca2fc5045567be4094ed5277df674c5b04ba59bfa5360b6eeba5802b60e43c96f68a33f9db2bceff8b1aa0f2906b0486e7623184aabbb4329aa85fd5db76205fd0de6393a669677a0ad8ad477a22a750be83465d6d213f6b0296218d4eea32110d68bd2347ae3319815ff4d509906cf784f1ef91f00b57d7e5f78043d2fc211bc756e037b7f984abbad52831f8d6b8deadac65b096db275c89fac56f4b5055b638acba39831db86ce2def983c199a9fe896712141e15afbb7e3db5906da355d04608dbba91bb44be74174007b37c0fd1ebef81d0727b492fca256a7abb3a99aa7ceff8b06e06f01f32ff8274831365267cba8bce93a17226310af477b61584bfb59dbf0cc68022445c9e382844377ff586c463b7a9bc30746ca66b87c1d7354999a951ed3038e56bb4446653d24a8a21799c5d08a79f3901187f80f9c8ec7ffb3dfe1ae04b52d8d953032325b824806eada4662c7626cb34b0453fe475f86684b0f8477f0cdf49e66830c56b040e832d879e5f92eb74167f21d06e7f00e990eb207027a43ac8ff12b1266cca6c1520e560c1eae3e13311897e2c7b48da5349e0ec93d3331c4abcfe51efd1b1f372bd419b5df1cfd8dc7048aee18054eccb1ce1345286b0cb4b2b254a0d8ee79668685a5472c25253ecd57f9de378549b1099f5513bd6588eee4e9587928faaa9577b1689c10ab973aa7a3030967e95400b14e1401ee21b6bc1d5770f14f23dfbec69b0f99cbb86e0b627e22618b8ae0f5995d1ec788c88d7da2db6c25feb917465fb3087c7c63d6bb7ac4de70404f5a63c4a11b52d8a39340ae7046d0560bce522b55496fd724111e037fe99374381b870cb878f2a30aa6d9b6a2854b7c620022fe045e1f9a441e65b3d29a0604ac983f681fe9696fa11309150877981eb92d1e08ec24cb999f8211d955e85bc0641ebe60a9950380e251053c3704734774c31fe2b3c950be2562d881fdbde3bc69a26ee5962dbc31e8fd52a108ff4575c5173c092d210c5c87dff750d5c23a2e150a045fdbf4d34194163f8bc1faf5ec41c82f3faa7b2196d45ded7c3ad4d7d8b49af18baa9a801582ce917587cfae831258c12fddeb2deeba5a3628dc7164b0a08b771568f97173e959dfed4f1eb9311763842e49116dca48360a343ba4f75a28d6ecdf5f7ff52d0258b86eb5df72a928bd0f32004981d154c7f576793c7bf7d0a436670d5408357aff4d24e8f54a47ffe077a2f8d75fb06f13c33a771ede8012060dcfb792fa3dd9c4d308f67be25cf91158a5eb35da18e34da4ba54bac375ad3ad6ca9f38e7b87f65f3039df98f9704fb2ab602ec5fc13f7d63a5b517d128298360f2c76287afbdc6f13df7e15bd86dc7f5d8a9a63973e81eeb0e322918f6d297bfe54b3dec6773ea58f596a111100f4ece1de560836bc9c83e30846befb0bad501e5ac15f681f0b29ceed312f5bb05dacf2c08624560a15862cc31988187dd1ea064e855d8dbe4c3b80d2b7f5c166e166cbb84b8c966260557501b456df1c27b9cc2a26eee6a55cdf11d8e56127b8570131973b2d4e1bb0cf77557b3b46a6287ec693c44e64f362c2dc1947c0a67d327afaa547c279d770dce4cb91ffe548062f7da0d80e9ff4a09daf4e044e5c47610b7a23f61e30aab2636d3b349cf94a23c0a46ca8fee08f3fde38e3d710c5d61e77a949f5dd2c3a00b24344dcbcc3e6b516aab89ac68dd28fd540028e99367ea479a8a3fdd701f79bdcbede694b9bdc52d883dc52619a4c7f4b5b15f26c6ddf4b39406d7d7fd2822f333a0bb9265f53fa279517f131b707a4f78d95b2a6256ce2d13d0e284db7b1b48c815f5765a176a52f656fe7b13d92370139a3829b39975f7dbf464855f4e81c68962f4799713e2ba3482d27157690afe465cd809ad85b7e675dd26f20e27e084678da8109a15ce648d3a9f10fb9d20ecb767d2a934de2ddcb495ff5635a27a1d2a6a052b904874946b247d591fa96f0b53bf1650e84bc0c286b2b707f020e6c04e84fd93b80b853b6330b4e2ba83572e254cc0cb896cfbc9970c773c31109386d454f1d45f2da9b01a5807cd7eb6650d0c805c600bc2ae922cd15a74029f8b6c225e4d2fb00e4d5b9c47c61d0c6042bc52fe893f303986473587a6c21626d8cc65b5e6c6182581a054e9482c39dcf1f88376753f16d59b749b8c703c6f1beb559e0614dddbca13a5fb6c0b0257c2c0d585a23b3be49b391269a04d33ff12d5e191160e954c5cb120db982dc170ecc753677dae1a94d291eeb542e068ad204937d2e7627295507f03ece6b7e18ecb770a8ae1828073a470147109e3c9bf1ba99364555d1ce891b094a79e91689c7c5a1fbe2c610139245b94dd1992a44a4ebea8593d1fff217b2ed45b1962141837ce21dd9a41158e017f545881aebcb928c809e61c90488744546f0628df6eb1f617412095a9b96898a7b2974539616ae55684b7b2233cdd0433311855ec25625349ad54df4b614deb7dae2a3e441380e4bdc4b127dc40c41c708ad7de763b1978d2b6fceda0fa560df597bb1beefce1b6fd533add2c558807f2e87b9ab7e380ae6dd5457e920d59ca405a24df416ec9dc65fa7bd9edde2ff080e81b588773b1819b173a146845224783275713cf477498624c24f59fb0902f061d5aedca94f53e8b0304ffce44eafc8f4e2b2cb51d845bba3ea3e7947c0bf456ad9de331d8e9680676610d52bb289f55ee118d9854b18fa13cb0880cef4299616077f6c49e507930021df64719a8f1313d374c2ae2121d56ba80950e4bec4874e87085db2b50e02031be314ab0214a5ce328011abd1233769f2056c0b820cacf93e92bebbc6365992270c78ee595e97bb2e3552b74251a15cb4fa0f22f489132b3820b98f00d3c4dc8b104df9130008f43b6a408c2043c54f4135ae162d30b8fec9a61ad0449a7d871187eab6b55f1066bd8ffed4ea1d8ddb0454ede1b53eb0c56036030449dfcb19e9cf4c58874bb7c7e99c3ba5dd036bd7d2155c786d66abf2ac0da938c869cf386ed2f0603ed6f3665c52c5b75e26e3ecf8e2378e7c1091618e38aa6e43f2354e892b9c43e27e00fc07d1acf6e10a0a3920642e0e95671ece36d29ee0932a71d73842df1512f4b645fff8dc1c4ffec189e62d32544ec9f2d71e11afbc975a861c267434a56e84b866ec7e2ad61b89e14e4ff0e06c9c1d081445d4f5c4b32ac7135634cc3f3ec5de5f982a319f5f857907c1d229f7868b05c380aced9f758a76065d83b12587b034405936b500553158f5ac1bdf633abe996960d73e16b7cffc69124203bb4eb6db37fd2d3ae6a23c7e0ccbc92eaf9e9993f5bede73a4d8191080b69c247031c2da591004a892d9dd62f3ff3e163c63ecd41907480b15f291bd9f15921db85d919b12093c009d49f0c041bc40a31828ee468557e16298c179e804baa23df6754cb07fd06e32f3419d153398a992ef3244cb33635d8908a0e2a0428a0581c07b082b824ea70f04e74fc881139210ca4424d17bbe9e2f05ea59222e890472b90fa9e1e20fdde6d00e61498cb2a981348989d8d5a72f3b404eae6dceaea4d53c6fda6c21923647922d326cc01868c267b68e00c0e4aee7a1f32028855a3f0bf9fae2a4d0f027d9824c0240c9ab37ae6cec21a3658ba1c3825caa7fd93a2b6f9fd6dbadb9b5ca4f40877271e64a3ddabc24b78260415def55ed37ba950802777d12be92fece18ad8e1153fb09de81ac0ad0abd28ae751f6a90a99d106ca5b75839f0264188dd98daa69b063be3308981d5e6642ed37049c0a72430ae97865e5cc5400eb7a0b34a51d0c7bc9c5e8a99dacf36caa9dc19c055aa08f173cfc4973e3a082b06053116e2cee8598d401207497606617fb053a6d8a364dba3f74137864c0f07e4ed37e2747407f22b608662ffe9948853334292fa8e78122a2542eff20cb598c0c9e55049d3381b8431017ce970ea528fcc3262905bebc85aa442d283fdfd615acad81156c4841f5e8405fef0cbbd0d9c9c964650a0b162f44a00338c35fd5f48bb06a3fb3d96a358b5dc473e645d2c14e629d24f2cd9f7c507fd6999160684240312907666bb19de17cef4d75868a232a384330e3582df19a9c9c7c0288d2bbedd6ae409edb2876d1db6aedb34a63dc064da96bd4b1c031b9b00099b706d318a262d6db1696fba193e3d8db380794107b00a2c293aac7f108e057aa2e0a60a1118bf99db227c46aa84df21350238afac5264d230a0eb0da91abd6dd33b1c8d4f4242a3a1adbb5ac54c4d4a9f3ded0989549db94f9cb40cf1da78a9cffdabe4c2dc270c59d5001a26ee99539263c0335b2b6105cf5e1c040cd37965d635b100ec86d70e41d01dc0e8b8a114f0197afb574e36ccdf86c625469c4ed4ce668a4bd4838d45d08be3590c84f96c658898c88890d3545abaeae7e92ae7e1daee86e953a8525ae9b43345183dca5640c5b9a7638f91efeccbba388039bddea3bf10df4a0e4afffa390e9f227ff18f814fc29d4298da78f1aa44c541d986e2b564a733cd758e0e5278aefd7d197b3425fde355453fb3f286d7c7aa725f9f1dadba101cdaf6cdaf340de3cae5d9997e8049205cda2da82d18229c8450b04168029d4c2b154242d89126bb60addf8e8aa3ead6fc151c1090a1e9451f40946bce5d0e875f059f3b6a662cb3840644c9f3b1bcbfee4134bb023313e73d6e087ade5280c594ebb8f692c6a1fa149054e91f3556f87f69e6fc714907e63d0e5c790e3988e155542b369559815d15eec6e9bbcf3135209eab32744139047c4a4b8a099f13532792bd43070e6b2106c72d9600445f09bc10620141b954a1584fdec7777852bd1a65b0920bcd3e9c7354b1d26c4181f1138bb8141bc5731fb50060de7e24569f49dfd382d3cb88e899e4e747be59f90051c8bd0760eb8107aa830d287756a13e64d633baac61dd8e781e681c8ad6691dea5589c53e5332971568e4bcb292a6f01ffef7f54e17a728348f68fb0ecd0825680a10d790ad00611ade2c209b217001ee66d85f10b9862506faa36100b25e101cf8c245a3a1c62cf61f17baefa16a3474bd725daa9854317cc07beaad1eb6747f1b3a3b1db6d00c34f5438124ac63128d0c4acd357f4e39fa54bb2649f4edb86eeb9d6b6b374d51cfb22df38555244518aab32e6247582845aeb82a8a57c77956a36806aa310e1084cd6a4ca861d4383968d90c6a49f98fd8c35f50e39bc0c7e4643e385b9cb165b3330bd86f06ae3182c6cfa9db4164703c40dc5bc73bc63dd53b9b0127d51270d6e2cb47e729c4c61e6743c70cbe074a40819d9a5cccfdeb3803e5c70088e1baf0dabd4bd66b34b4015f3c1a590cbd461a71f7ccc95051e623fe831ab2aceeb028d38da9bb8e8256e74f8d6af2dc6e95813214740bbc61c0d7e725de04c565a0181a5216183eef0dc92719f0001bf9cf5d7b0fcee822f6d8b32107e0b1cc0aaf8fcc6203cd48c5a9328fad74f82b139deeb0b01e9d1955ea1ffc5fa1579756d813fd22637986758d91b703510fe8d9d522f76edfb90ae3d322b9fbf5d5e75ee58ff9b79559c1319322e5cd8f88d2932575cc720dcc873616e28cbe5d20324ff3cf64f274388885a9070d6f73cd2efbae3b29c006131658ebdb49e14e1ecf24c77694ca8c50026896af4fbe908e9841a777c0261613339e75b8a034bec23b45424dbbf89e15c761a8219b5bebaad083531ea640ab031fcdc1eba622301a919bfe907ce3b9450903333def5022f13e33e87a89c12147199a263f59932e8f6142bcc8cb51fef3b8cbb0cca06494ef94dfa49b4ef0154369589c3d8948108ec887d62e2626b545d3375aa1eb552bc04603f136bf47c6176c42c81024f04a7ce0fce747fbf4b76697972e12b60acbcea7b43885b1aebb4c19839099b2a977aa3f4aa32c27a839b1e801fbf6113f94b6bd2b77428d4efb4bd8617e8c0fa8e05d3b1ce54cdcceb1d8799472389094feb0b4f7124aba95cb0cf970f3ba9f7011e0ff115f04cb4a6d37ccb8d2785276c3f24b1a9afb92b6546f44725d1541850ae5ddf58460b6c2a02ed94178b706112b12e0ed2f0abe30fd30d9129424203e1233289b10370478381cf1f088fb2472b097ac70b9c405f8ba220bdc5a8c501b2aee8a6fda415682c06b3b3d027a46006b1604c0a780f45c36c5792e55c1309fbf26ad619eec3efc8399e618ac9806cca0d7bb88dc4a88342101de4363aaff9ff8ea85939f34465bf7900aa4774b24325130ab183f58bb36ede6642932f247bd2e382b7836c03270d8c1ddfe6eb12e90e6cf7a84c0100c62c1e1270c0dbaa15924a4e10c6525511d7f16fc6708b0a6bd9a0405ec6f21b971c05e38b16d662a486e062862ce56effb3dc4370efeb7e0e31604a1f1b12b76b421de885c282eaa5f5d125f273be52c5edbfbc248ae0e13253ae3285aec87e5eee5d91b1b78d2b5215658be5e10c7a124ac6e30146ee88d844a7875fa1162650a52024a5afb1fb5a278b99b03df4d2d010ad7b1d670c8f28dedbe4be87eb4682650f5e63c9f3ae4909ef2f6c88b2604583dd366d8000670105c3be0b119c17bd7ae7db9c569c34b455232bdcd1ad65db6def6e605049d11b5fb597f45a1dc2f173a96b0b1ecda1736c13a516355816c95506e387aa8d79351478e94ade363ed5d4d5a2b4989e1af8d578b932f826bcfa5c4206b5971c9e77131050800025e15b3eb2be5cb1f511f2b16274882a481b13d85827e46aeed120a90d58c36f2892bae716ec741e66ad4b8850cc258a147f7bcf4255b18abbd60772dc0fe909a55272225ab690df2c75dc100a6c456d8ae1705e7ff4a69fd106e50f148f7fc7fe4446a982ebeaa580b07807305b00789e38dc68ca5c8da3f52ee9d92dbd468e157899140e654e502cb742af1f31577b76ecd30893bd08c6373aea343896364a1eef94ab79c00773a855e848cf6dd8adaa2d0982e2c9d91595d1986df402903cbd01774306432752bd2eb80742b4b92a7f5fd9d7bb358a5d3d08d38f98aa0128bc914cb7135cbc6cd3d218d19077a9b6f270be8452ce58551d79f206aafbffea74ba3c72d82660ae14d37ccf71e796619f248cc2864759e2f9720960b6b2918706a1b8cb4d72d7294f91499d23f794dc52836444831f69ed921becc6a65ae36f0376cdf22f251f1addf39879e47cabf53ac5dd34f32ba7f9076778704f3fbc6b0485fcbd022d4173efdbc5d9497d42d370d9d9f9bf9e1fbfe037adb997eef80ae2ad0bc0d34fa9dba87a23143390b02d513174106e9fa07cdceaf75e22dc0d44e89844d2558f397e2014e66e24dba57dc09664102c92da95cda239b5a981234f6305c164c8f6e711102ca4c5fd76cb4947e896913c169d98380fecaa33229ef0bc9737c0635fd93b9a7c104e1e54a86693ec567606ae8a918db1748e72705d1f9954af9ecc7cfe40d755b77030fd7deb67d6ab6ed95b6e7b7fbd5565dc7a4dd3681106d7f1008ccdf7a3af052b2fa594399a14647a9a53325fe3677da4c157320d85d5913c20fcbcecb823d9e60869f642298f0f8878aa10a2dd7cd5c9bdf60951c2ca331ad77bdb4e1c79daa1f7b33008068d1938ce7760804b54a38731364de9d45082aad816ed4bec8924dad5cf0e00d16405248bc09ce590b3d6818b2ff5220024285bee6e2d8f6b0c7aa9a837dcc8f926e09825cf5427b013eadaa823eea9d31269542c61f344bb1c606e1624e09553225e4564ca80325048c70cb38af521d8707a723faee0469c6516c56c24a4309b83210f80e00f8d153c53d3a18a8400f9402348875a548a92a05b052da260eb6702aed8e2be40466222019bfd585e9e94c32bdad487d426c8947f6db2b60fba0e22319cf0fec4d05be78555abb9861648cef8bae2f58895a5f7a9a1d14c38d4a8def5fd4850dc3c267c013cf31da5b9d4132cf8da93d1c14fe3253f614d2543408f137d73c141fa083629ecf05a03672c8212d4f3129cdb0652f24030d99ab0644c18c24124c53e8574dcb36d433918bafdd59da5b250d14db97c0e5d50c200950273f02297a4199142cac65d8da18e846c7e61be8eefb2360b67934383b81dc9f8b68b935a09a9f91e5fc0b43f96a97d67bc71fc883e998d8497e4ba5e1d9de8197101410642f2769ce08c7f445c88cdbf3ca3f26ceabba1af6abddcb1fcbe3b29bd40d3cae926d8e5324ad70d9f63ee508365d0d2067d3d45a55bd58bb1b955dfb23289da0e684d2690381a87dc2abc1be33ff32efb738b76fdf70315958015e2461dfa90fdcfdc7e59da840b0be5f26f3c789d09d60ef93f18703e54eac86075a6eee64cf49ca3e977081f9707711a96f33bfcb42e09cb340b0999d1998cbf2b251cbfe0f9ac977ee4a3e8a8884d634f35f18559b03f0f7a65ac8de241d6c3de80cb5f9c8c652bf1939151eb4bd91357d25fc31059406b884461a8d7030066e45b3805163cb4fac61dda176d6203180e9bfa4b2f9990454c92ac4ce82885e808a60ff2850f4e181f17ad6dcc82900bdc9356d4753d9a0481bcaa2329295e05cf0e8834f09f480aa0ed42ab6ecf4078c92ef623a9d38e9ce846b109c7426287d832e29e66121451a0ea1ca9974f4eaf216718dc5bc855f608002850b513d5e0983b8d2b388c59772948520b7fde56690c66015d8ed9ccc061978a0a5ae88a1aba0348aa5da98d8ca68d074f1798735d13f4fb14f9032b8e95580c410883d4cd087ab0a5f272905a07d6e7191295f49a14a3e87c94b86a3e4a1120ecaf72ac287272b5011b17455a5843d1a5fe18fbf585c489ae7389b9d4f64170735add806980c31b0422d03329faa097d85e5b8f95b6081af512f0615766d90937fff9fbb342180bdde34997ad7c275993a41660be04ce388a7351fee14d8d94383cb125ba257997a05972de67d633f062758e5d6ca02f923ec12004206bad5762538ab45da29f3d71c8a6b58c36a9afc824bc1583e4b9d04d2451632ae02fba62e056e8d6267daa1850e999bafaf699a3baa01030e7e17d26dd1e1d4b90fca914949e4530f36a32c48754382b02af18c601b1f8b5d8f20dd26213215f0b3457bb0c3abc7000a89360f25d0891bd6c9ce1f34b541945389d1205cdf81250062926e64702518f4d50a87b5c0f7c153fc4e6b2de0f70341aeea83345b0ea2b18ee21d427a71048f43e67fde21b881a3bb62e5343ac4bf5942491bcb638080fff4e5ef2e209aafd031c0b4abe34cd96f040b45c6231a20ccc25f2015ad208b3973e3e0d0a45134675d8877f74318135df48bd4b51691c524bc61f4b45f3f4662aa21c2415fb81f6ca8aa52a4c91fc12fe6c8e43ea8db615e6e340009705d7a61c0190abb102eb55d3bf054bef3371be79b1466d8e788e567cd5838817d83daa0774178f4391224d662fcf081e267d669a8b788aeb013a0b5cdbc82261760add291c42b16e4e500966c1e0f7a03b0f58af0b61ebc4e77808c5af4c68c41cd56c27f11cddac3959be3f8248ca0061d3d8ea36b957e3da81793afa4e29b3d170ac70099f40ce880dd7a8080f085b1f368f1da0a076b838f36413d9e5218fdf6f7532d771c3e4d8e90e6f06c7031e9be8585c3fac41a6029599d80419dd5b893d64f2a88c19ccaf4531ce13b33d060fb6d9fc07a0406d864dc08eb6a01f64a68b9f2f51458fe50d4411858f59e441fbe1cc2d68b8928a57579c858933e51bc717349a1be842ee5488c2899588154b58ba75a95a42b265633b1252996606e2d3fc4a81cec6976ca3cd5968f88af28fe2d6135a6734997806dbe338a497bab83f064c17385da75007986ab1462bd380eaa515b8260a5be49e000d5f5fa5003fae4803a4d08a015940e7fa16be740e3601d7f61bf8a2f8cd07ac89acdf67b7468c0136f50ad8947a62b7a5ffdd35e001be051b087f470e34da30b3b7c5823942882e4f7ccc74bbb086b22eacd4cdfc13d551580a365e51b835065261429458d06fd8fab8b1b5ea360f76c5114af3323ba1fe2a1458504a8532aa00ae431ff3ca5b0cfd42e4fc85809f20d4eed0c7f05bc019cdebb0bc15ece85e1f3d5d5508827df7ab1a8eb9ed27a2ed3f7f355f45420df5e73fa393a7148f6a40e625cccebf5c4ce22098920bd14692b218c844017f8438a8378c8ab10ad18dfbd76df58c56d0f33ce90618599781f8bc53ee897788d210cfb2fe286df55b15690347073727ff544134914269bffc1919ef2319f02362289c00cdc1c91b564a4bf4122245c9b5b3ff21056898bd556ea13221bccd545d2c811e5d8e27b9240c8cd08c86eb65df9fdbc9aa878024443c861a2d348a36c63841947c016de714326cb4a12cf811c9cefe4de0dc4642d8d6699a37fe88e961bf03af88c264116a43c41278d5f98fbbc984fa4dcb876ef3cf2086aa2ec811e1e9e106591de45fa09e6c82d483ab739882616fbd23314e7f7ac73df0e86b6768f47597c76eea13517828eb09a5b4ce5829a73aedbdd7b0024e4f1741299453823121dca3ed66fe24a577c21c027421a35db30b302e4e50704f7ed22306e5787d12db50ed0ab88b8de663b80b44ebc199bdbcdaf86e7daa5bad4489d1d2aba53498b4267ff1ec9cb60906f6a54491d0533d7a0b602fb5a00420ad1805355eb5d7c9bc7b975b9abcfb0688df3acd848a37962b39bce80391564cf8acea654801853ad55d0e9a35e83be6adcf1f7b2b8ee4efd348b08e407fc7fd8bed2afa0fec8c5e6f88c9fe5255d2ed0b090d33a718684d7102fcee45df4e80d3a79e1350e495d2393a4fd121e7d608df71e606bf59a5402aaf786e127e0483f0ca9ed099ca967fe9b65aa27bb1ddf18d2ccd02580d62b2e2a7cb6c59ee502cbee7201a018ab9e0809d21a30d9077b22bd2fa7b87e583a9b10ca244419c98ace225b7f0dfdee5cbec03d89879d7af8c814f9479e01dde25259f87d8a38107b19ce427b2cc03b438927251dc0dcdbedf3264a89f4723ef8280639905af863e04d0e48762628c1ce2eca39a97e7aa7810c42befff4ceedc203a8f1c2ea818b87f056496b0087d94d2ab89c72dc3686f6c1fb7f0e13c96c129483660e142bcab5bcf671bee90b3ed95d4ecacbcd967d635f2e5311ff2c12437955030670318370801a2cd1879070530194cfa4c8a214a0d372af60144eaf90f5b16f61463124e0853396c211f73703232f54113b9b5c537c00028b6beffe1de27d9c77463d7815e04fdf07e80bd2c8b490ecbb05f9616a0d164dd66f8024aded6b97b100c4eab7f10674bbc6699d5326dfced3a8972a43dc9f0428d00d56aca91b349b64dc4f942fa0b18d04ebd6b58ea26a0786a6371883d66821b995bfb94751d88fa70700b9b908798fb93828ad4825a6a477137c218c53cafade1c24fa68a320e863b6e58af3669d914dbfb18a4ad5e1108f27d173a3a131e2a00a017044be7a8515670241fb1d4a258addf698cd74e6f72da771363b0e88b4ddc64e0bdbd192e16a7cf58738410e434e821e8510b17de267581150619e8e59c6d421b798dd7385aac61692d23e7b22b5c74852fe59af38f9fa4872867de534533bcd8d612a5755b4b44a65fc51528aa1fabf076444d92084bac2d05c0ff1669feffa326069ff3e178d951d87d8a6dcf93f4982b8e382842b3f6ab34d155b44d3eb91ee5d4cf802ff25292f6ed22d229d4c54e8f47c74c0664fdb5d64e9ba0cdd9ffea4f233296377bad104ef191f710a4f7645b9f8e2e908ed871c737e519d6147a20a44e287b4e8177014b734103e12c1f34ba4a0f997337a9c0ec4989dff7f11efb4ce1ee68c5dbe0269133c118230f9c198ca558c8830665c22951d3bc8dff37a1d767312a181825ae221b0f5e192ad1f13835306e84fb055d209ba8a769c7a8a8d91326b869dec9b20bea154fd370e1e490c16adf6236611dba398234130824cd71a30b4bb347942fa31a4e10635a447b9668c59252288f557818825a8e7844633218c435ec350f5d31eccd27f254d88ef1fc66fb297779309e815b09efc89ae0c8861c95f087863318f9b30a0950084bc201d1588a8cbc116104451408428118320de4a414b23258d055b87a331d9039a050c3d1dbffe319d8692b220d0be8facefef82b57fc173270b3625edf0b00a2456367c9071e8e9895f8359e3363c011e8a5075076b1f43a7ee5a6ae84c4a9a563d62db75af0ea10909f950e43132717b0c2e437ac50da0b1fed7f183eee49e55d2f0f448e5a00e44d194023e81a5838e6802f758e74532e28f7da43dabe92b9773ee64efee38df188885a52a9558aa8dc42163d46b1000ba87472e9e61d8fb4619c5ba96aac16f4c4df731260b8ff0988effaed3d06ebd10b3862a3fe5a7ba57ade0b93ecde13f39901b71948f98579b487a1079321494fe42f47bca7a6b178619fc55ad1294150b3c2de93560b5c711a1d81b44d752046d1ee314c3520e31606983a46adc7749e06a6a760a353bcb8775bde2ecff511daf85dc3267af07dc73963db5a89b9dfd892b98001cb5b9d51810e5100a3bf72392587ad3f389c8e470f2479911d42aa6dbd605504e522401120eef5e716656d3e66b83cd54ba0ce07142d0f1c97abc8c435d72de48c0a1f1d5170cf5cc9afc7ecf346f0992ab61c173d0873cc9a1304b834176e824b68153d56b3bd4f333c78ae26a9bb41658d77cae8cf09bf56d726d1a07df16d3a92f1798540e6606b23609f803413d403f6aaccb7edbf08bffbc16edcb571d6608d0ebd395b86d9a39bb26f150ee77a3a1e1c3f989b1b9be78fa705660ea1556aa3e152db91509d039756050161afd41bb4b18012a09cc20297bd97d2974f36dd27f0458565f3607ee192fc43274826147084eb79fdd5c2dba8de2a4f24b837b07a3c52ea74ad725fe9760bb9bc5d2093d39080dea92b8d8e0dfa4c15a0b271fcbb0d9364405d216ab7f07861f3e544a88e65c8d5a452b10705b9bf3333f637cc2667e1d89e873870265125f5e8660f26afc3231bf8fa8200b9e387e18bb0d51919300b7fe3d4cba25e38e20dcc3b4f095ae4270190bde45a51211206c1624f44180645ea29342f181a21b7521e815eb09cb1082ba453a51a27a511bd40858232e89de8f88393cba94dbb77adf1827b73de86a554ae8537dae61af57a82a8636daa6cef0cf19c04edd6001d95232af5df5b5cf25edcbcfc09a08f278458890b4d6a6f5328f73f91f0b3cff502f1850e9b207084f59486ad1c6ab1a9a36bd847f09e1d562e30c580681385a440508864afd9290b03088212480f737b3c14fac20d31b59f1dae9c50e301ea6cd9077e13f46d36acd1b1c3e3d782c1a750e71bd37ea66094f4871f142b2946bd1a0b4e7b40801b96b8fabd650929f40a7b10b7982ece6c566c6985bd845be6bbc2bdc844c04003b7e840cf46398ea9e8c863fcc3e8a33716bc863add63cfb753dbf1da4551a704bf526ad5148db191e348ad737b15c44fcd80a65321c671f08c1a5a617d6750e05e3a2eb075a1f5cc24462cd13f11678afcac86aa523095b8f5855961cb8f2e1172e0ec7664cdb5ddcf07759b1757008b13961358c0e191db77d1f1b6c1e787fe9336fbee3e74977fbe740de5ecbcc3130aab8fd24314cca984658d12551afc260256fcadb4d790dd9ce68ad124d8d479e802060510cbe2785d520ff87b770a5efc0c1a5f338ff32c0ffdd6e6e8ee4ca0ffda9ee35fa3117f0ce7cdada323a824466af58e494103cd2a22a6daedc9c5341abad37dddc4ea0ba626b0f4f2558d1a6d4b2c86b856d373e741d1d120744e3aaddbadb9955c41c7f58b31edfcc61b4a258d36695d75488dbb47e85bb1bf520d55a60a16c79c3ceabc4e782a91e72dea496138c4140d2cb562da741c34bc8350a0f106ece16101fa593884adf51bda6f7bbe79c1ba4ca697f0373443b71c5607628a41d041611eb7879f9f52eb7e976eab16bcb40a7c2bd4853571a87cd66cb6ff39d37a4481ef2d47f5d0c153487b7898d882325f3fdb075985495a7ee1cedb768cd09aa3206a8604e67a5a3f292e6525baee4aa201e934760815f95e6451967e2c9e7bed1aa272c04da422ae233b510371c0de836a66780028ba2dad60dbf634c67547cbe06fc9f62377ffb8895b51aa98df42f9615094680053c60287da0d445e8e23077e94122d6189f217bd47003b3a68ad906cdb35f8ae58959026abf14f7fce489f7e5d739a4437210d716ea377bd43ad2419f023eda4809812f5f4046c024115511a500fbf9ce552d20cb6fa77f67b33e8461136f11b31da156c9f000c8aca37a06a2c7df43c71d607ba5d4db33b0271386976bf4e487a129e8a2d19f4fc866512207d789b47e983347786a278d544cab4d094fa66b1e7a93c30a37683e7307899b8f08ad1c3596a921e7c5308ff7b51dba094e6c8b22364a4c037e5978beaf0e5f4646f8cd9917af5cea29f3132a915266f10b1aab2dd1dea556f437145af0eba60e9b3dc190fbf41978088471ffa6e84c64c46018894315933bdcee474c3fc0c3b1d81fc140c75d041f0ca361ef1e163eb1c826517d9a43c8731458f8bc47b45050fb90838572c09eed612a6c4172ca6f03d9facd0b2b8b27c227aac59f1f8c45e9399c0b29b3cf323e101ec41c1938cbed58e3c51890aeb166bb83a2cdc1d889b01f569827eff38bb93db16d942e690a7210d38b0072ca0e37e96c0a2bdae85550bb7d16228c5e2e88f8a71d35ec0c196f46fd8ee7a9800e79f44a8a9263485a7c0f1e688140460813ae0a2116719e4d2cb0b6da83e2b9dc9ea833026dcf67674452bf6aae334500f5a30843729b340f31d6e614152a4a18c03c7a7ea9b8bb5f32dc817ca105713a90e31b42fbb0ed014c06835837189ff72031b10555bc575f297bf7e66fb984d1c93ad796493b4961e9393b5d2d4320f85cfca01799e7c76c0785c406add50f15e328c7909b8fd2b8f3f8d58e04337a07638eb3db7f01e70f00008028e2f5367ea23f236a31d85a602fe0a02eaec593b5700c39eb12a138e4262d37ce06c8755ae88b657fc084880f8b195c8610c911ab14444301d794a99cb11aa4a2eb90def070bc2c25427b1e8706c0a397c7973602d3b6b06359d6e704ce029f0cb0b920951de901329539a9607a9edc1928f5e67db870a901a497dbd87a5ab0187541822b46386343e81dd50a60bff83ea101e9c8374304c6a721568d6a6600f299041ba91a04efb848a5895adabd6a74101bb21272784c8a30f33c833ec99146433639d507e2ffb81084dc3708e09b7c93a013cfbb636247cd5641cab8ab75f38b9d651c7d03f0340a3ca06f18bc5303a2d7006192c098d6fc1e40edb846f2ad1b7b61b9dae53b23e02656bd39d002f46fd52153ae86b54059bb6f878398ebfde6c8be70567102215e582613b2a3212082e2793480bb9a8926f90135bfd978a251e6ec857686c9a0a8611b59e0eb250f5b7c308e68e20cdbb873f6c6a5db8d4c37b1d4c5ddbd8f1a964a2b77b1722df9b0e90b7c61074f87ead9bcb281d5c9980406fd1327ab20673bdc1d2f1c7e58d9e51513ea23f28aa9235ca9a6361288c6e3213c3c9f1b4787ab91b9a97c1f54b089bc9536042eebec9ae9e343a5d00d59c3410f2248860b6e432121eb5cdde68fa0da90c85c91317e8c97e09c5574bda6aa3de9ea78b174800458935842b271f1b2bf9ebf78e70df2f01047cb16735c16b51d629d626367eb80ba31bf247a9a586faeae4c72a58e3ee9b14f1f9f59e633ac25873f5027aaa6c3dfc9b4c2d0a01494493d7d71fd4bc8923d84237999c8b137a28e0d443f2465cd2f509e28c02ba1e1736a6ebfb26796d8cb9537653b0f71dfebcae825179c352e04286924083f6e0342cfaa10369c0fed7a9f6b5d1b85c520bc17fc1dfd7b6f19e01328cfe33a1524eb7769bc48a19c90123da8119ef5a9ba54239483e8e04dda18ed38675164a2674b174f8d80ca5e158fbbaa6e8d4166b732b1670833c4835abbde657e8d366b7ed2063bac598a64253ee0890e84ca074d233dc8843c87dec5a5a31c3b29649a6bcf75f92bc1db6320e281b5608a5217718f3361293c68b2cbd9ae24643704d78e210fc6beba7f94c92788aa943d418ac7215d0421b4716204644e57ffd099c4ff892ed6e3abee84429c2bfaf4c12ab170dec3a932ca8cc3d20c3f35ec4c50e30d2b6cdb977c0f23af2e497ddde0ac31d5ad909ddbff3c7274885c68ec1c4805834c70a250d69bfa6676788c328448bed3170ba681a745f9872468be888f9731879eeb9684d82e6f23e0f449528ac828b83400dc1c0f138948e93793383472ff89ead3a908db8caef5392004613faddfd604a8657c31fedbce34066546a6ee2d8b64a66542196aefe2d7236ea41eaa6e4cd49880f00fa555943d09138d7122e318e25f77bd29dd6f1da0305cb5664e8e09e8a3a7241bf6572399d05adfadfbd22010b29677c30db53f60547014053f4116059dda96a6d5133a0d37ec6dcb1fc18f5905ff7f82eeeb2a9983a8735210d0cc3be3d19e17a543c31f2911f3f915e8285540d8004e8fd5b9f14c7458b35b9409aa005e61f04503f90d59591e2e737e3043cfe9cf7b8a02c61e228c80b71b88d7e590733ce25f38c44ba3dc4d223b3be22c9b5857ffcbc15395e74879fd603b3ab14745d74a7260bc78c30cee9e0e6694e7e0213deeb7b8c812187ad44e1d3a9bcdddfb509c604a2e957b122fd08aaef1c5f0f2efdaacce0e7b353f6e9671193193c1f64fd2e0da0f6e3075d6ee31bedd7b670d6ca8ec1f9a563300f8db8ece3faee1d1f94867b364e0bf0f2310ac137859e80989729a360d7a7dbbbb2b7e5cede627b296aeaeba9b3fa4b379cb5d4476b403001cd4fbcab99b2b78bb6f5ce05084457c91040b837b7e9a684906b8606d39b35f8f0327720b6e49c095e322978e756466630b1de94325724fd53caba7aed2d9a3dd5bc377910925fd0882e62d30e74e90704c8ef0dd0d3e27db16c3b583b4a3beafef563898e86182169eab7251e077edd5ba525cee6e763360c174677cb34ea125d6cbcda0c424c8b735defec7b86e1c7f6bd53e1787793016b1a22c270b7856da9a3b33d84673a87e0046e910104086b12b581f80c00fc00541190b967151fb4b4e6886c93abc531a38c15852e40f3c3f99c1712bd665b9bb752e81df4ae160251592bce515ec2082a1c8407a81039d656dbdb2d19a696d90fef8b478d0ce2068317ff9db22aab09586b0e88c1e2e32978c0c25f0d4bcd1d7ab4614a6b195cb91642cbc943e18a0f4e849615679e3baac05fa584a9dae72da7f545094f6b80d263719d034bb5a5a1545f3547e44deaf449fe325e3d8deb08ed80f058b3dff6ae85ad46230d8cb82671814f40bd35761a00ced66bebf33b70fe11b1dc20b25b3c285c6f66f5b840c002dbe3b8eb05f7a6a1a0fab6580816150bd8fd8edb96a33d338074d015b42c13a3c240cf19078d3fbfc7f68209564f767dc2eace636cfe4008d1f22d2b2c889ad846dfd32da9f5e2606ee86b54fb39a05695bfacd81abedfa919b600bcaede581c9b49f7387c8e65ea5675440dccb98f136b34fa5661b41730ff89c98d06f8737b64623953ab2bf4e4cec419a8cad2588f084eca713103bb02cb81f268ed343dc7666e78b50c5aace070b80e1fb6bb15329100d0fbc4540bdc0681cf5e8869cc7498291c0ce58eb180b5f94880bd2946322773cb15a006e58cac03bba9eae5ade3ec5363547b59da41b38741a70d94d6d887bca98e7622242c14dbfbd0cb89387f26a407ad27c82e907c3a333c12010681f195e9e6a84478b04bd094e1555b448bbaf6189023710cba82165ecc6303e5f725ca92009237d1ca09fd85d794094790e2e609c045e2db4e209a8210231fc67f9ab2f2d5578563356fbaed603e09d1ac57c919a1f756dc671148c19ea5da30f8503262e256f1ff96594469a08e8fd5cc5d4d96f0bfbf443df9bcb3f69ff36defc58913a1b9dfc55e294c0ff227c4a4cb463acd91261a69d79ef8b48149dbd7a9f243bf44cce3bc3f1e74b67e28a9b49ee7c4599f347a0143b74459544379d3e383cdaac5978c06682c25d260f35be62e25b2ad183df0ca2caee69852bac9a617289b4013d490065a822e83a872cfcb509d52b1172e1925f06274964fbfad5bded804040497db6bd7e2cf975a1676be0f180f041f97e158c14251c3773fa1e8bcb14182e0faa4ed7a3d158dda7de3e83ab3ba291211549361567470d335f0eb4d04dd59811cf6c29c18931ee6d3e52458eeab5f7b58663b05e6d835a240b8eb6e2238d009ba7c67156f9dd2842d36b566139db447c240195273a8834190be92df25ba04f66b32c2af393b1028248bdb367c69ca42c5971bd04ca02a63e3dbb7dd5438d4561086853089e531c01a20f345f7ab27582b0125617df8613c958a4ece6148300281bcdd4ad4cd54832b66270d630fdd388fb33f83302ead1d7567836dd18de928d5f9e7e07d92c4232e6ba669e20f714e27b11a51e2db1368ba5b8c8a4ce41b6277e98e382549a262bf84d4a2bf8b5ba94bcf8342a1a307eb6dab855e9f23859d3d4290ee2f4d97d56aa2a4dc83ec43bf200613270198c924ef62fbbcd3d84d458d9789a0772da808643ee0ebe43590e2be19a850e55a559ea0dfeb6240e679ff3409d49da3855be5618b65c913e96349f54e44864af14e2e9d95d568be58d1441807d45dbc02e5c615c8c66f7176092dff94a1941b833c6ce071ca70c8bdeddc8bf242f1999241f5985248a0bc559db7aa30ea8495f0b58ff1eacc1eb492681dae1c9801f39c8a6bbdcbd6576a009586e9765b40d61d460b594ad94939e89691101511396ac4a7f781fe2bb46b4fff20afe1501244782911fc55012792f4b99c00b46d9b44587f9732e455959cde1967d69aa6b25466ff42949e31ce1149da13555789ea31953dffff28571a748a32486c6ad9d2556199b66c5e522b9d9f78e346028eed29d84fbd0c483333db167f0a5ebd9684c8439208819b29b243f153d0145bd872942cd077533a82ae7af69d0662fa3992b475f7846b52e596ca44721f4b675c0fbfcb093ffeb2a5d1a7bdebe49f57de01849215b0fd6d4d302e0014aad0d80026060292c2f95255eb1024666cfee5e1cedd5ea855ece52b9ce24bcc0bd0617debfb4a5f4c63b7690c002072d3b50c81577b94fbae3c61dc642a445a8d1dcca3446586105f896ae4c39ca70a3455ffa924cd0f365ca4c495a998009628274be236baf7eb12c75657ec1ca30d4f82f95257cb29505aa67ef9f4a3984d38320660bda2b03f3c789d7e100438902953eba0fc441fc548ac34baf9c8366a616bd2a8dc6ad632b7079983d3d532efdcaefda60378819ca7291ebc703765caf63eea88153ebb622319fab9455e2f79fc34788a88ba3cb0f42c95d76ff402e1119a308e8fe442987febdac0562c56c759126a153b6e733a7434490f8243cd38e11282247d58156af416c6de81cb15d2b8e4309d6b84d945b1c31274009a64dd8282be032ee49569b20a703404845ea6f91a19372c2c4eea12cc6f7d4e2c364901c583c3f2cd935eeb09f02f4bd04b3e9551ee257bb20ce3956b71146a539041f03c6c58e8bb47e5f9f4f43c8772702074ef9e6cfea60ef3112b6893c58b015c4beb79b7d8e2cca05fc97fed126fc28e11fb2a692c10861a4409d6a733098310f04829dae620ea37e64c01e823bab9ffa8b78622402ddd6217d18362eaf670238c2c0d229acc340de8d1d2ca352d88ecb576cf3e8382f72dd699ba3574723e0d18e0325754b15cbb6ba0baeaca33cc29e30507d03f3887f26d8b24225761960a51bc8281453253a1ca8fa75eb07be7f2e4fea0f9135147b7767b2934425ceb35181ace1ed88bdba4e0581032ae60d626af9c3cdaa39aea9c0a70c5ed7343cff7033523038a906e25539fddad011d4d06b093a613f808fee6b3b4804cd8086e1a45163bb84e516e5720f48a11a22fe97a8aef03f38b88064f18b34237273d9397f8f432e33187e62c068af7a35b6c109e221305231a325dba6489ebb36eca130f6c070b758e37a561ca125b05c310463a4f50e1962759905a4035a9f31d19cbddc7ecb734be4ec2a897641a541891f227202a5e979899bd6350ea97836eb526231f318ca9d3cd8eb78129d752be5f31c5d7b3458ceec3977db2d793d4081538bb9569764b7116384e31eba692d5e7f5faf071dfa0af256fc513ac56bd28c2b1a944b67b56a1e3473e0f5fd605528cd818715070fa7831e75c6e544b0d6c2c8b90b7b3ee522a4cefbd1eb4e841e81966c30cf0c88319a7165bf58d90975eb31c48055f0f425a1b3d024ca29f984af8546230fa9f89a20654aadae0ff997054e042c15728a6a2a00e0f673e8335cdfb040499b87ff8e9837f810d3d6085aa83611d05eec1cbc4b0b47a3b6f0ad11b9a0943b86b10883b4ed2659f43b13421565f72015bfccd9cf5a1d3ca137c43fc926439395a83fd9b51fcbe313e9049c7b4509605c129461c962cec9d7f9bf7dee7e6695cd75954f14b737dbeda412980cac25d411d5a5c7da81bdd5cba3648f2d6250d9c76da6a1e30003bc908338fa2e909b401e5ac70d2ed82b7898807968e6f985f9cb84626a44242a162417e8446c5097c904370a3971353bbc7ab4717dbc452660c5239ba7c8ad4f295e41b106efa8f3227dfdd2f3c4aec9fbcaa5ddfbbc8aa0dd9560aef413c2748e28a13e40c3ae665774b45efd3654c96e2101666dc85d8341501c5719ad29a393669816a2acba9aa1882490a970692fff683293b748e212ea6116321d798ca4784fa2d0d40f97ddc8aa1d22cd20e11d050874e4444342e0fa4bb1b624463134c2ccdec8348591074728da088f00d79765e1eb9aa3b3c3f41ea1b38f1cdaf17309fb8aea391047b5ae7a122c809f1d603e78be3d0cbceb368811c2b5f0010d51621738badbbc08b1d9c74d7a4f6fba0ee63de8f0324bc2331eb147506b77cf5c13af2125ec676bb5c7d68d24e18226372e5c601a1cbbd3aaad3319475aa764431c0ec3f9c3e03b2289bf501cfebb028352f13a06fac4affd1c51a2b3098547278105e2eef35fe89060c542c4743f71ee66d8dd8d24dcb157d8b1ae4727a1ce7cd09844f9da0249c2ef9e27a10b7dd8c64c8daf8b98a691c592d3b03d98a35dc0e14568c24ecebd8976b5ec4731b3a55cc837cb1cfe4c3e550a080b957914741329206d912ee54909840cea93e6b990bee1a5960f2f920c83e63c694d2c5df53eb001cba457c85b54e214cd8612ff6d6434673ea8097ba7a44b79831ef45cd41f19d0bb128f78ecfa0b45712e68ce90ecba60d800eb9debb2404c579d86f95081830872890ff4e871e490901ef45231ee9651cbc4f5faa787365daca9bf168688f8007c8caaa40cd9d8b2a8588a49f189acef093c5cd7e98322666617a54a3b35469abdd4ad3a1078eaebbb4224bb9ab35800bc2f5af33feb2394bf870f5ec5d56dd45f101ca3843f79a6f3e298cd285b708ea4aba51c1049d01bdb4a50d1c8c481b363f647a0a6bb192ffd982a59932a209a43f3ad12e92e4d2b6006bc080c97a4cdb0a5fbf254e3e6c5d2e5e6e904ef6a8551dfe81a557287074e102bc09e578bf4ed478c59de07324baf88c60f925576c3894dca88de96ef03532a21ddb86ca3bf88ed809e9d51221da309cb2eecf7cef91194bd46fb0808d144a2e606a41f12f1aff2737586503961d6cecf490dd15f50af18834a2832336a8745d55eb8562333519a0699b8732b45cbb1d7dc926e59fd3cef2883c52d14049465c282e49ef651ef2122df77608438199ded4d02384384e048ff19df41ebecc342758fabf78619d7c506462f5801e2fc4e64ee259c7eac72a98b143ef06fe9062da4f9ed964473200a8e9b5b21456f5a70da45d4f1260648d2fd168c461145be6103297aa765a1a747916ed04092df6f59742a51851b999166775b10ed7a1471830624c88d164e971a75dcbc1d09bab185d0a2a2ce3765458a6e6fe1742b5150b8991d2976634bd12f4715972c142e7ff96d2d14ca5cfdd36850bf049f46d90e6c3b7106cc5c61db8acd2cd7bedda75dbb6e414975e03ac027701ec6fb4db9ba0a07c68d5e6022e27373bde5ac2b22d05ee31ff7f420e7c1752e075d1d04e230102d3b524c97e97510405741d0b3dff500212c9d06da7c53ff9c46b6799f9c34fb0da0b077a6f705d603af16db7904ac989e3adb7ccb0a0588fd993d09b014a46e7ccfada5726baadb75ced71b94c3dabe2ca59be6b1b6284f64a30f6130f1a4862e1bdef44e9971dd5be11d1aa807f45bec755dc8a77a1fe74aa5a2048a8cc2669c3cc6e2553dc6218beb2c16a72d438787c8cfaf69b6f5103d00f473cb7a34c5b033e8821da41395db2bfd0fd94de607b158cd9716ca6cca6642b0b4feda61871dce070cc63f88b39d217c35230afd874413e2b54490e4bc8ada683a1a79625816a22d11c4a233f66e42b3e54f7ef80a61152b5d0b5a683e4f3beb80b3d9b6edbd67335874f7b47383c4a213303788dea655ae39f7338ad7b83d9c013556fc00ab774253dff1acc2df31af29020327bb6de424d339b541d898aa7356dd846e23b8dd08ce9f3a47ee4d4ed7c8991789fc2f66450c3ceb64aca724c5b64931715e6bd59b54a39961cc8f8b14f95715663ac711a0c05ab738d2e8a8e82b87ef97e7fa9dbc3904744542625fab8ea78b156b3fe9de561ac16f968c52a5469e2e22430f6dae9abb92be2873a5e13d50404552278589d35a3c901ed1ef85a0c152c8b991391f977bf5ee4a6a2b3e0b1713baef40a56f5ad212ac7a701b98acf3975eff207d89477f50b7422608a9740564df8690043500ee8383b774c3ffdf7e25189cfc989d0e000266fbe57d8b1fbffc2a129dbafcb4195accb62ce540cbb7fd581d6165aebaffddbc5e80e96e7e64fbf7ebfc0f2ee726a6b8d284bbcbd26b365487f4cf1d05e4427260dbbd32b51e70481334a06dc94a0466fd12606b4aad972b35c55baa52b760a8b064dd41fa49d4f242e78fed6d1405ce45722569bd8f3cb08023b0f866e93ee01d04892b22e27516695b582ed19e1d804c82fb2ca6c31682fdbb54a858bea83231167750dae5f5fd0e977be879774b62d49e9bce2df52954b88c19bc075bd20a8ead98259d8f59c8838735afe4de3eb93a9e7fdeed425ba630cf91facd5ca6f6a7e01f92aca8a03f3ae9bfc06bda15fd370b963d9f8c107439021555ddbbf0b48b09d328388a85b6639181bdd310b95c1a6cfbaded746baac56d413a436ce40a0d741f560eadac3a6b0fee2b986931049b1b5f6605f91009885f0c92bcecb08d9fbb7d2e0a43d9dd19be1a42bb659d63b9d49c12273924067a6c3811916d323ade3cb2002d4f66a754dd3f261c10b110043d1d60f53a3724b07ffc65b514e59a54795f67b1d17e28049b306d007ce27f240a081f6e5ba1020986dd0b2a06d0f1d7086b73d9d81663b306dbf2148188803cbd51d8cd9c5361b417c0b4f2bfed1d00034df3a37b804da007cbc4cee6830bddc9fff0c2f8a0707faf0ada1e74aa7b19d9c3969bf5650b47631eb582edf67e79c0b4f7dde76a1be1c92a5f442b92f9a20a25a5d52bbede8820db2cf4f398be970b8d39a8b97f1b101a049409d01b3a71cf346cfef91008437504ab78a233f81785474025cd81dfeb1137cfedbce7677597a51954197d18a6921cd664572ee25d32020c2b07c67a0d0b6fb87fbc0402ed0b0470bf600f57c01ca388bbc0685a19cb472022def02f5f03fe66a5f51269b7c3c56ef08315e7738017f42991d66efb39102e1b74e765aab836117aab117c42bb172db312a64076ecd1406362292e6e97cc0636dfefbe25ec05e5af45084785db6a0f7b9b5cc758770cce367ee76f7d9e1a4ddd6c088c1f3b208828a5997c7db1808d7b3a1397097a47f4d44009f3bff006de961460f112e0d551002cbc418b108beb8561b0b9488f435742c6aa04147b6d8ef99cfcb5566ee442e1937df465de269c18372d6856bfc52b29eb3acb14938174481c3382006fa58184e2edc1b790addf92d3d3ceed06b98cedc398b43f0932376fe475ad03bbdb443bd530dd8f3b715dc13cc35161b04f572c0b9c65a64cd1a514a43ed5c507bab87afd56c8c172a29d99477c3f2ea457f7cb68f70c1ffe5df6ec0a6fc4312d819ec7d1220f084b471e99ff422ee02cff3e0403303279b832749dfd62161f7af73410a2ef2409d54baca169ead532c631ce21b03fe12164ae4b5510819cf011a25dcb395cb1a44ac0029ab5ee546aeae6c45c556f3ef473a8a13709f981f969dd42d3827bc815099dda3c15282a2a71812b031ba3aabebc7a2fb7442a8604eea8b5b8e1a7c50347a23252af7e557cecb9cf492821b0c3c28e3799952c5c91b3ff7bfc3e5357e8fcc44785bdd95a8fc975674b10e51990ed8f37fb9e2ebe08147d8f2eb0e74ed796e8482ee9e7490d371c4918e851f4f7476babf5d4f3c646b09376035ffa9ae1bcf392874a8815b46dd746ef8721527612f2b11a38e43f4120d6344d3a8ea05aeb026f5a20c74410f64b3505d1d62fc73d2396de316ae4a6227cc5f4f76bbb5a9e46eec050efb2280071c8a5ca6396e02510e0fb151e0b2f4d439b903a610387b393e316c07e8d734c70f5dd372ee9f58e9ab8cf186ef360049d82c1dcf21be27cfb8c7865d785a1f0de5fb4bde5213eec76f30f936850b9c1e0d752b7f5f66bfc8290d47f02689e8f0a5be6f85ae2c657bf80c7402c3a554c9f4a93320794255e293801d7b8ded6c4e6017b873340efaab0f7ad56bc94891c6f3f412672dcf69314651a503c069defded9738ff83d866947c5ae4c4fe1080548c2fdd6a51118eb9e84ce0010dec0b0a817567a7765f9b4f28e95e40a346a5be11a7e1f80a067f22de266f9d3252030d5c6f8a05f7c5187d97793a2469f1d467d6a1a5a4bdc2f5065646c6f10dd645c098fa4ddacdc0755bdb07d0c412f5df7c6621190f23f04a3734d565871239525e9220f8f6c879711d815ce7c8a8e40dff69ef62b96b347ddda1195b6fb9854015b7aa830af36947f5e60ed896f59fce0b117b7e75b58c83d41b0844addce2a3a1e6595056e4d99e68afd5abc468024f372fd5b123a3d13ca9363410830ad5e89979930f159a9a58b1d96687ecfcfe74f328cb29003a444708dac83575f158521aaaa2e161d7508248a40d5a37464bf5ee1ecbe1ab9f8aeb06e549c875b7d826fab3b4937e81da398c7e84a6c563c6cf280c0637845cd77317176e84218dc166e10aae6920d1620e09a0e88fb68e7d5ea87073bac93bb1d3b8f1fd200b100c4bc43f78ae9aef0d54780ba7a87130364053c6b993357d6842ef9fba681e83dc1fbea5a49736f9cd7de205127b2edc7e2980a79eb67b21dd82b91dc80f4742e911df89cb7a3cbdf0a476d9c01f4212f9b453cc2f774da0c0ed8fcaf1a2c117197696a4e601a7ddc31a74889e04f777ffef4e730738a7361c871ad677141974e005a9ee09886c02d449b28c7ea26689c9e55948334ed7eec32f590afab481b282473c58789d1a333e343146e0a5d6669747c2d40841f6a1812691002d904f74ad7871c1c1e7ef481c84798998178c109a4e3a4b88e23524abf37138696cc11f8f84f6100f7f9b4fac3f01e087f912b9757275e2e62927b676bc66d165b219347db9b9e872fad2a1658c1b42cd7ab9ed12f95600c4d69047ea80ff79b8c51ec76ee8afabf31fd03803eb81ef86eb8c2adcdfd26f271a414e7d7af600a4a77ab75936f72fa8bf735f7b847943ea5162371c67c55bcab0f2f45551970d5a553498d892f733b52ade5d1a204b01dda43a4735a04b9c7c9ade543409e2364774172f8b0c64ce50f0c778f6e90570ebeb1cfde1e61e7d4fa6030a42f3eeeb5f22442f8542eae3407a6d6a5a3461b942755705419d7cd7217bc8106570b56278c00e04b598b5cb0019386214cb792daaac06fbdf67411022cd44b83179fb2e077173f300bf14ba71c05c5f5c12d794b598fceab411c1e9d6000b85d072fe453e4ff520cd5702861b1afd1ca35e4acc209653b2b7fae3712dbf8c16853a3821a4fa1fba1089bd9159758cfafc168252b8471cb0da8a12af9af69fa1ba6da1126c0d14f9a020d6f05b28de356441c9e2d3319818fffa48bb5efd75c2dc508b8d39fe946e8fdb83b37dbe6eccd3f92146a304ac63129690e22178e5f1bb24493cf15778ef7c938d55a777cead4c1cd579753d0252e85a2d6056ef0cfd95b1900ab86b447214b7c55bcdc35e4da8b36bc3f0ddadbca0bfe0cd2138a422cca0cdc78ced35c9aad0b109394619ff2c799bcd8364a81e9f746af19579e1fa801d1a1343b6f9ed172e23269d54bcbaf61115073defe5f83000fcb96b9a5ef59b86bba2bbc7283140c63dbe24ca8f1e3ce418f7be8e6f0a0ddf3d15cff05e16a3989400c9289f468af2a131b660b6210559ef93494dda87912640c14486465357c6b21857b1f44cb3e430923e5d6992822b2a9ae85b22d2f571e00589b369915515c4964ec8d2c2d07d5a9a8cf8a0d9476bd8892594cad064390e92d9f8a6ad4601e3914698360107150a2e49e6d59ab05d8fe2394f7fa8224260012aad497918bf96e2a474a580b78cf84a803555bb597b06994f520c3a21eb64c874a1b510e200346a8807f86a5e85503139d6d938fe36575c98a264492ae2caf7f01dfd9a112e4a8c5549be02e9739d192a4e97f6c1c044e12843e0d5a2090ba9a0ea11192324c77fa04b8f9c6ad75b802461d4e34ce88c4150f27401a4c4801e9ec3f8d1aab3860ee462522c1dc950b95ea14c0da54b1bf54ed23af400da20f8db364a3726d44d1fbbf9fb490b677b7bdf7de52269902cd0cdf0c130d47848104982c59c8e82ab068114506133040034a0bbe2c6e7c01c6036afc10430d0d1d9210c2080a0c8ae042046658f1050f44844f4a5466bc005383fb29490d0bb0c6e3b1397d6bd10bfb19666178342206b7e318d665e98cc79f92fc80e9121aa594f2f8d0cf3c3d3e655815eea7244c70b6b34ad329bd10f753922578c3fd94c4059ccb1a44545454d4155c999cf1e575ed3ae8c2e6719c0fcbf406f5e0df5c20f38dbf29017f84504a394bbf67c0f42909e929a51b98edf25452e6d1bf1986bbc0464a4e28e125044e5b0c31c5154630e410c4194e96380a230698ebd8e07e421206dba8b17361a6ca105fd4a0929278e1a246d8c206173cc9b0822c59d0fa1b034f2e7c7952b2c6b4c1f37b667ba6673f1e9b9f5f787a61ad6b0c82611f1e8eec31630b8fedb04832866d6cad4e8973050ecc0516aa1a017609f6b187c115fdec638f8e8e4240cb8da5abdb7bc891767b7fc256dc4f485680392892709cb7d53bab78c273ffd14970b21cee272435eac56bd71b4739d2862eda3160228b0d59b62841e14403c060e2e405455491860b6855061d17b1f68b4408ece17e423245c6b957d143d213121d927480fba9053258c4fdd40219b0dc509405811faee0d05910f0818c978d410fabffab56ff8e5cdfc3a54285a04b18f5d48212ce303c9f42d00567190e9c79f09c65aa54ea2075ec1fc4b1833edb557ebd057606f7d3d1173ca3c05a7f8f73cc1c33c9348ff96940e1aea551c3d9a5c0fe20ee5a1a486097c2a19ac77c7f3af3241df3ef8ee50ff7fb6716ae2c08f8b0a456c6091ef2314213ab2002a6a202b82ba475fc9d8c6d9c2713fe313f17e1799b49f338325f08883a9630bde3efdebb1a96de29a677acc0fdf4020dd8d9984c34e69f6d1e4bfc59d6937ada3bb8efde7f32d199101af33a993699aca7e7bb4c1d47d22ee7bbd7b1d9c39f023d6b9aff68ad1a322803bb0e1ea23f718b246c983a3dea6a284343992462f0caf3c8c6df3d09e4c457b0f75d0da460eebb0769e8914e45573fc5e5fadf6fefea3e755f43b8ff9ee32e50f72e0ee9de738014db5da0d0cbeeb9a76209dcedfee28cf409c8fde83bbe065d70fdad0656e00e70d7da10028334e4c8c6e3f640f2c5f1f28662908f05811fa0dcf10271efbf7d382fd076bd06b0bde700b400b5cca3c6b2ad20ca0c52b400031830685be0eea1b34a6b160c91c30c56ae98218b2d68fdad01907ec3c02e2bcbf31286fd8765bd7c5dc1f4d51788e3fec60209173c5f88cf68cd9f480452184ac2ae43a61e0581738893844b47474747b4285d231305ce1d45e6069c3bcc18083c692221d0431309811e747c47f6c19ea70cbd450b1decef52581f204613d387c013285e36deee130e8772377b5d5910f8a18997edcda5343c05d8e97555a1e2faaf21930957ef1a991b708dc26e4fb9cf21a62bb0dc6fdc036d5fbde4c48ac515f794724fbf9b1b02d6ca7595eb8c74dc7795db6a6498e0ae75dbb2e3210e0550ac606609ea6939c942821e28dc1d86e9bb539c2965740982cd1cc0e66ed7d07778cf711cc5dce47ed6ca711cc771dc76432feb7b16dbb87ed8b0dab4460e48d5556053b86b6bd08073d766238dada1f4c21a2db800c3a2861a4a302c3507774d8d2d7806774d0d287096b5a0d63cb21e2b5e14f58a9e2c464960518230ae5001420c2ecca8e20927238a500285a905e2162a2c7ab27861096bab4458130154f57ac3195f024c514c1105c6941d8090800896f890e4021a9cd184152f8a7a454f169d349c90f400c5175bf800802db8c0610622d2b0010ca70d09d18a9e2ca5103118c1a466040d656896ce1a8c19a468a10224969260a0d56f27b87e6523085cabc0f54b2af31d8d7bb27821ee9a1a42e03ce23c6e434059ef471c1e947cfc1167a4b31ffa6ad8f0c28f90aef9988d578d19948c238fcc1371d7d44882b30caa2231b9cf3e447a7cf8cca3f56f648f8ca76716db353668c02cdcb5357ac061b430abb4fa38df3c26acece1f172cae82cf4d89cb2315d66f3e8e8e80809ad7e88eb8f3e6b5a6d2cb6710ee9a54d1288b08d6d70d7c680c115776d8c0c7086a180db2858bd3f6284e9bc40f4bdffa175fe1652ea98c3dc77f3cd538808730f9279fb0e0d297c8c15f8698005fb8f34a8617f1c87617f908a0aa038cf4f9142147317a802993fea831be90a7d05f6fb56c0f7dcfff814876cdbcf07a2ef7d27fea8a17575e28f8ee3b8edb99b81e86f0f447ffb29d2df48a0fa35f4d9a4f94f119c1c18b069d0040b00774dcc170cae1a36829eeff052f0c97d47e6116f95cec4d9277eb7fbed957aa0efbd4f7deffd77bdb2bb3905bc3d779b08cefd4123f6b729a73b1cadaaa7c04e3c4b98789e11460c17314b675cc12038c30d0469fe2327ce478cb287c517bf6ffc7803c4fa16c82255ff91763e4b0a667de8e40c1aa8194b989a918429e5c21687a8deaa9083c1b7cf890a683d8bf51f9947fc7ddfea1ec008832cfbf659ffb15e4566d7f71fa0e6572c92f52d2660e29aff71d67f5f39b104d5b79e45e61430eb39b184efadebb38759aecf16bbeeeb0046d8f576f5f65b478cf0ea762007bbee0b7ca0d5bb1e5cbdeb57ab77dd7275730aa5ebe61470eb5bcffa1fca22b3eb39d66fa290896bbe45e6d6abae03aad8d65540cdb32e50cdaf2e50e8228346cc7a4be6d60d1a71cdfdc2efbf2173c5e3539184f9ac77714878ab97e2fded5937dfb8ede5f8d5cbd196606f9ed8e667bec5126c7ec686cc4578c63eeb411649f1cc835bf891333fc51272eb59286017a5788a2564fbad67516c73330b78e6b7dfc4121ccffc5782fdd675ddbcfd10c5339f2dcdcd4678e6d2fc46f33ffe91342cd665fdf62cd20155ec10657d8a1c9a98f5a5c0be4898b8f513b7de5ef1fdbe86ccb73fdfde9cc22010f85e0ab73c3162983038c512c0f73c126c91aaf9de1949b0f7e08857ef22730ad8e5c2f6db77d8fcc862bdfdd778b3c5f66bde866c2f6b6eb698f53324ebdb67afafa9b9d9c3ac3bf32fb23d3673b387edcde1affe5d24f734640e1a71ebc357912a4cdcfa2a0e71dcfa299230a4f5decde0b75aa46a8a07306a918e5b374fdc7ad5afc899b7a4eb59641e31ebe9ea81ecbb7e65dff5f65db7bd64fdea672eeb7f688b74cc2273f8ddbb08c4b1ea5b421abf5a0fc47afbadeb802df63584f5f659577c2bfe4afc1f575d20f0677883460c5e0f679e9cc28fed08078d5885398406cf1f7df503989b7428761aa1dff735a43ba8afe0fa1bae2d9b78233d85bf8ec34ee6108f4eebc6854de68ab7e964b84759016173a872918615dc52dcd7852edf917388e975d91c8ed371a61f529c43ecd87ae915bb7c47c5dd3b2c60e97d0da15fbfde5c31bd4ec5ce37c2a917380cb67f1ce312e86e9c71d6dfea0c371fc0ee1db552efe18efb2790918979f8e79ee490f70effdcdffdf5765fcfa73864d6dc884eeac21635260c4ec1cb0ed777153a0ce44f8073ce9965988897dbc67173ce39a7d75e6e410ec429905f2ff4f207d093b0fedc11de1a0a0ae7b9849b6cb734c9608f3654c73df9fec7fbbbedb1ece1ce67193dd60b7578e66aa83a191fe256914045355d3833db3c623015be38bd045dd775ddf7f4f4c0783ce63e5e7a2a7bcf2249a062c1ffbc6e76b37b5537bb17bb0f27fd711599c75c62199ed7480553647e0cb3b3d6c075a4155ab0749dd701d1407bc9eda57adf756f5d388f61ebf33f497a1acdcc671d2ce3f1cf5e7d42f3ac1992042af64bd9bcbf8cce6adedfd2998bf533df22ab975df729b2c7cbee6dc8d263ddd790edb1c6a95246672ed6fb977446f3fe2c72f4b27b4bfe78d9fd8af4e165f72ab288975df72119012fbb0749147aa77b1ad2f358d77426c463dd8ece71cacb41168877bbebb57ce3b26ddbb64308ba9b723c3a5e22a0a7c78ba1063bddb110d1e3655f29613cb89da08680aa4780fd3d5471dff672deec7dbe1b4efdbcaf21e0cf9f37bf7ca8e2edb3bf1106ef6b48f820f8e1355271500f0edf08839ee88950b8274ea542d20339107c2e77cd23c1cef3bef3ae90eac3cbe6b8df38ecde1bae5eb193af21f5e8e8e8683ba235ec77928e8dc459d7c842703b0f767e500feeeefee91dd756b76db311803105c1f0b6bd97fda157ab1076fe967570bfcec86d7111d01f29ad25f62a7d2588bee20a85f498a007572d08681e9324ea9d9979baa6e3b308786cf68cf912464c0a50c086b97ca63349a0627d56dd089b61987eae11c7fbede97feaa6bee216bfd40d0ab1f779a537dd07b04bb0e2573c8bf86cd668ecfb84f8f01de04763dfdf80bfcfb31e9349e7f83eebc09d6158f5b9d4b199e7fbb6effb9e041d5a1441d1fbbe39bfefdb3eef9e6056f99aa6804e4eec7d15ca74ea3a16479240c576ef31d83c97e00dcff7ffbc89dfef37b2829f90234096832f8a77a8a2e06f1bcb4a36e254d0119dcd9ac7becfdef72ee5fbe67fdfa3f0fdf77ddf5087c5dffe13fffb59f31de17fb386bf70ce1bd45058fc167f88158364c5a9effbaee0efbfeffb867d46df4cc1809638fbe0fe9fe6c181de99df2b1c2cc3acef7f2aaabedf1b7558e4c4ee75ad2755440e2cc009ab141b8475051c84358a9cb066f9b06221c30ac50deb131d8455051616d62b38c2ea846d2f3d08ab150084f5c99661adc5c2da4400c2cac407614d816d2f75c25a6527ac5404105614e408eb12b2b04e0121ac4a8410d6240610562478c22a4547588fd8310b6f1c50c54e289c3f471176cec26a444f588b2040589d788495881e611dc227ece6419fc31e7dd234e6336c5811c21a6584b042b10508ab1076fe84dd3c7e0af033c28f083e3d7810a067b64307cf004200419643003b3a1f04205602c0031cb00e2ef9391c6c80f3bab931dad4fcfcfcfcd0b87e7e3eaffbf9f9e1b69f4a7d92409f5e2760c3c01a965ae79cb37ed3c6a7313a76992e63f18ca2b317fd7e2f74f6a2f7b580f9db9b50bf2f0bfdf5b7cb429422fd757b16e8376d7ed38410a1311a130014f6719e35030461f3ace124512988446098b363fe494c93c9941f46bde3ffe3df647397c13ebf3f8c0f4f324881fb09f7930c4a185c814d67371b6cdfcf013aab7486f3fdb346670ece52df9f029d01e0fbe7129de57cff9c42672ffbabef4781ceeef7cf243a13bfc9a7f9ee3f81ce66be3df866dd78d8f7af406736df1d7c8f24ec7ef002789daf213bb848b00e1ec7b7480f2e52cc832f5f45de8b24809daff990242f128efbe47f24002ed24ecdebbc47e65ca412001f80efc8d745bae4c39e2337b8482fee298973910010808ffd0d89b4c1739f339f26e7719ebb4a3a340ede92483957e9031a92ea7370fef52089847395686848dee35c2515ed7f838b74f3f66f9048e0eb69de4522bd687e835f9148345789d290c6b71bfcea53ab077f83abb4b39148abab24020d29fc1cf02ae1fceb2ab96848dbbf7e8644fa400057e9060de97b9cdfb94a1e0d89feeb2b895473955a34a49ab73a5769d290687e83ffe02a7134a4155200aed28b86c4fd2b76956034a41b6fdf8317cbabb4a221899ff300b84a3d34a4ee71de83ab94a221cdfc06cf22913a78244846341c57090034a4faafbf57294643b2797b91ee2b4d5aea9d4442826444835da5116848f673723e7591681ec9f548338fc4fad67770956634a4d4e3dc8bc43dd2f648f5919ebc4a4e4362fd06ff2492ffeb22e55c24f091528ff43d52f7de2b4ddaeb3920915cbfc145529a349c8b641f69f548aa470a5ffcd745ba79a41b8f343e52cddbfc0fbd216f90258df58f24111aebb72157a0b1fe1a7232d1583f0de92267c81368acbf45ce231aeb6791b389c6fa2db9227b68ac5f45a24063fd22399368ac3f24a7138df583648afca1b1fe8f4c81c6fa3d722ed1587f47ce2934d6cf914f63fd1b59490ed018131aeb7772d668ac7f92404f3138e1dc4f4bc2e0218a81e68f782cda991e17e59851f5f967f842a915adffc3c86a352790d79e03f22a381b904f19c3d403b914570ac89dac07e4508c743703799311faf5d29b339033ad6eeefc0accc7b0dedf9bf9ee2b65b15cf7b6ae77245eee9b86a926ceebc29aa25faad3c1501fb78529afabdfa7bab616a894d7d5a609e59489db421ddcd4d4d4d4348f9ae6d13c9a47f3a8b5cca313bcec69913916ce93c9643299ecc1ff3c8fb3db58c7d0997d7b1d8b7dd57df1e631b429cfdef65847dfc7d8ec4ccee44ccee44cce1446e53ca0c0f6a727b3731348f3e8dee1563b40f31b13e99dd94fb8653d9b4bb667530b8d51ff118b9d4b3d63496364c57389ce38d031fa6196c22c85119ad87f2e4d2d7446a463f4c7d15afa4e4e197a87d2528ccd530bd4a45cf4c4e00c89348fa677d6bf71346ca663ba700203d56f016d3f73c4bd2b49f73449e1d72c11df6649f5230dabbfd165ecdf00b1fef5fe148ace5c8bc7fc3fccd835d7a245cb8b9c37e4bc418efe36e46c3299cc255a582495c24b7f4b522cf40aadd12a249d42a550270ac5b5d0cf4e8fb4607f7ae447584747c79b9a74bcc99bba77a61f1df909fe9e67ed38d2d6527566d6c173fe7ca1e9649b3393783e54eff8773797d869d34c724aa1fc6993bfd399e465e94ebcf4d9c44b17ca5ee90f6492302794336cfd3c93d6b05f7f0dbb0025dbb86e980acd1a60fa4f4bb8e07e5a2205ceb4e969c913a64dbe034af3a0f566aaa038c2f48b348ff932ace3507a6726d1a3e6d1988236357e9ecc8ff8cfcf548b93ef009a976ae9a28a142e6d4c89aad2a5e6e5ca172c61a4100344c700513265ca90c1f49d063653aac5a1f40ea594524a6b60f3e49204d39f5c645efa8cc7673e1ea3efc363330478ac8897f49d3c0d9b6792ab4129fde944674df3eca439cdeb5a7a873e7d57c3769fdd494667ddbea96b691edded9ebe3bd199cc63f4c19b3d3b36f5ae1309b99b82070877f32360f4e1a5156a2f7dbca44fc22c72463df270007bfbfadb91f7c04f3d287ef8a2ea57acb7cf9af9d6cfb89ec6fdc268c87797cbdad0336a4d3fc2ad5395d33668a23ba535e986e65f035af84a5234fafd5fe9f54b54c43df72bfa5eb72ffadefb7e1caf1efda2efb7d1df5fc9a415715fbbf7e8f7bbeafb1779cffdd67d51eae92b49d9d6aa7aef5fb43dc7fabefb22b0658bc007554a5234f122c9515d2439a92ffabe75954c1ac8a2cfd52fda7ef5444a268da808fcee95a468f6ae5497e8ebdebd2fa25f3fe986268617bc9dfabe12156dbfa5beeb3d51117def8bbaafde1d278da8a8e32e6cbbb588fa7dd7c19a1d0ac04a4748baa1d14b249453d44d41a39748898a463fa9a66e485665926e68f48990e42849fd56e9252a12bfe691ac926e6837ae965581ac7085e3aa69591538b3628d352d97558134ac19578dcbb654e0b77d11cd53a19c1a574bf545e1db2752924a7995e6b72fe2c2d78d1fb71fc74b54e4a55e372e5151aa7abdc6120da7c6d5b220919214ed7591e494295386766373898a525fe36a5915f875db17854f9fa8c8fb1a57cbaac08f7e51f8dd131555ceaa9ea868f560f745e17f3517e63adcba8ef9aefbaec35dad8bc3baa3bde3eae2a8ae4bbcb02f0aef83d7a66e7f37f46e751df3bbebb90e7fa222ee86ae63fe5654afe73ae6d35b5d877f7fd16b7e58c005285923fd42df0b792fd4bd10f742db0bd5173ac2c191d0910e0afb1fe91aa6ffc348bf91bef9bf37f2dd8ce3bd11efe6b17b23ddcd2eee8d7037dbed8d6c3787f58dd436e24fbdddaf0a35785e9897930bb08fd4f7fec8f6df1fa10ffefc23e2abfe885d3debc84ceb5d7fa486e66d8edc18ffe608ce0bcd2b9473e4f51b080901990f44e8f542e30bd5bc50eb85562f443f7c12be27619629335f68ce9b85e66b839b715e37ff7873f38df1661c1a9b9b6b686e1e5bae9b675a37bb56ac9bedea661baa6e16c39b43fa2adc60f0e614bd59851bfcdddc359c55b8c1decddd14b813ca51e106d79bbb9b02d3cf431ca657851aec178633eb0ba0cf2f157e2b8f72422bac420dde8ccc0ba35c97ba3829f0bba3a8f22c6de12e45d35d6ffbfed7766bfd268502767d234375eb38cf4b7daaef0fc150257ebf65bd11d7f7bb54b8e5fa210ecffc500d165a619bef1f434cf34654a8d8e6872aaef92117162a007e0db5f0f8468652f8c61b5181c3af1f727c6364c8620edec8908737789c1f1ab110c539468654d8880a8e73aecfde2129597b673e0eb9f5cefc17f9dd905eefccbf41765cd83b606aa5122dab5543e3ea9d991b63efd8e0f4ceeb66030e7a67be93461c4c3a660c301c37060705d3283041c0bef4502d5f605f7a1a8a0b133ee400c58b207630726a42468b367a288152134a2d28bd4082a1c69702ae0a32524f4ac6780d994eaf21ee5eac5ff762fb8db0119ed708839452a65a2b933937dfae276581b2d5ebcdc78f102f67185e0f180a830f4a15831e304e8850aa1880214295825a471e99c705b705ccfd997eae9f3d6fcf3dc8715c8ddbb6ad31385bfc414456524a898cdb666b6aab24f51ccf09a402c54f3cd0fd875b2c528f8e8acca3235af75ea46bb4ee0aa1b1fe1ff7892bd49312a7035499c14b0f486cf832c427c6089aa02081d19446920d34e9069a2e605cb89f94ac0083b89f94d4b838617fef62b387e7143ae3666d62e1382d9e14d5b43905853f9a4e341468cca3b39156492234c602576e64d358bd2f132a0bde575ad368443caefbad7e778bb8afdb6fef9144514c98632011c511cdfbfa4445dc77efdd22eebbfad599e8ac89ceeabb0eaa258af4262f1d0a9e7fd43466c2f6dc6fcfbd4ca8cf11791a73676ac2fed973c2dd41d166e4ce8d017acd633aad1f5c35e1135a3ce1c7676d4e994e136a8c1f4d2c5ac2447969da341664da37a281afbaaffae298d9542f11ef8639b29349129e4b2610819f7ad69b40b4faf0b937227402ebbb3f817bf17f3cf11ea4a411faf637fb2d9e10fef646848e4c2c24c480a6a99e014d6bbdd0092f13bed47fdf34d5092f13543ff33397055aeb06712634369f455af2e5cfbd110da424039a9644f5df83533421f5dfd313c413c01356d793686cbeeabee88b4f0af1a5ec4c502f7a897877a4b1f9dd2d39f2e597888cc6660f9e6f442b5a1951efd400db61b030b5c2e89462390df46020fa210dbdf7fa39a8077bff3de8916125c3d6cdc38da7a80015667735d0b3b9bf00d666c28ecd642db3e9c2e610cf7a653d5e4e1e287e08759b39fa9d0810f4497a94deecd87f0badcfdf9cd23c8676cecd0b39f14ba5523345a9f03b04b67b5debd65c539f5cc7040457fe63455560b377e50627ac9ce0c97ae2908abddea9a56eb0b936c184095250c5e64ac5660f054b4cb1d963c2c4664f099bbd2490907284cdd5089b6b114e44d8ec0d11c5660f8a10367b41e0607305e204367b4d573ec082fb3f1083cc2736d71f4ae083139b2ba63df04077e0117f0485d89dcc23767777fa1b2954847d368f8e01e8d0a143878e0e2ea943870e1dd4e708f34e8f09b0890d4bf187b7794fda0070f68fda8e73891b7bd9edd387789ed84180e7854d28e09cee94d6ba6d1cd989411c0ff54e13e9bcb049ef0b9b4c89411c13e99d4e8160188a4daac4208e757aa75bb55a59cb62b55a3333ae2669c4208ebd76cdd4d4d4d488352198aaa9f9bc9a9a9a1a9f39aa6c843b1940b0bbbbbb57201384420be9eeee6e2e40e7b89b8738bcbd6fdbd3e7388ee3b8a26a83f5ebd19eb48b6cb4f98ef3c44fe6252aa2154df711808dbbe97c019cb82b786462208eeb4a686215fa3dc99823dca2026cc09511203db81f4887fb7eb841ae568ee32a57e95565223cbd695519cd39c7a0b4524a521250f7908a40b6179a6530b7e1f960a5d5676faa5c846befcc20399436f67c07adb7f64e18a0df66cd9b8d8c04a1d89b39e607a9d8e5a5cfd93493859d3e4dec349ab385fbe94b94176e2b226862da513d56bfa57899fa2628ab264c76c9cb1f4fa25a814c2b284c874297af88979e9096f1ccc04a178d97137451ba7122a5948adb8722d998db489bea68ae70fe9cca5d2c168ba562b2d9a11ccab53897198ff5d98eadcfdff5fcd0f76eeef92e6d5dd5655d7b67c8ece32e6e9b22a5575d7b62f3acd5b0487165033b7e29f3e9d900c7da71fc2f653d38fbd210e704a58945b6f5f9c1e6e9e434a58a94b28747f6e2c1d997ba9011e5e384a9898a6c564f1419674445457d1146143d8a8a7262b34735417182f3baf9924786f3ba1927549e505eeb42c617367a98d0b0d4225bc5c383cd73698949131a5e5fca744a1d9e2533692669c974b0791ecda3da4cf2b2e3eb945ed217bda1d68ee3ff181999153a1d1f6cee301c588168681cbfecfb38a32bf460384f284fe54b3a62c204752f511a82704f2f1456871ee8128d5510ec0659afa258ac93a077d02e6de859d731d19d668f2346d886b355c75adf6afd6cddd0cb2906a165ca607b7f668e4ae4fa929795c8eaebeaed05c00e168514822cf073f3373e7b236ce6a09f22df4b7a436fd01f3f32cf30b8d280ab0eb83e8b6c2f7b135c1f24b30b81eb73640e2abd7441c1a337c3301545511445511445511445511445511445511445511445511445511445b18bd166e9670efa20c5192914c5c1d99782605cb41469ffa8a8a8a8a828256cf6a830d997bc7ce972e36d3e7b38a397e20d1bf1bd6968839242c80cd98da3851d3b143fdb304fa8c6c1f437eae322bb1f36a6c2061019c358d708d2d9a7c2b24c851deb23f2e5c3ca8f451e31c22c223961178621eb723073d47f3a23d22ffb2152c44bba54a34b53345d9a50365fdf357388e27b149dd9dcf698f8d56b2e630f8f8c866c978b032a38e0c0ce1ce2578f89d963c2f53d59904ba784d1906dbb78e1e432547fdb6a5213ff78592bc885530c3223fe387ed0c1cca263f57387e9bf667a36524a5d2358b1057ff5ad164b00850809b30da6ddfb128d55d6f8f47bf698503347fd5bcdb0b40a61fde84b74b6ea189d3d424a9ff5dfcd8ef3843a628453df5e862210fa3347fd1f3a9b50adab02b7f19b2ed1d97889d0255c1f84f2b25a4184ce3cca63f5ebc51e0584099b2794efc81e9565f99b380dbec3fbfa1ee53b3a5cff678fc6d54b91f4660e71fb905c5a91ede57086cc4121ad214bb0173be69e869cd8454e3c434edcad8959e4c4969c78454e0c4e3cfbbe63fe008bf67307581c41efd4cf2a2cfeab671e4557bd43f5e2cff4cce6c50f670fba3473d4175ffc2a8a6f45d215c68ab5be78478fa2b3094563f5abbdd95b45e1fa7404acaf4f97660f22ffb3072d5306d39c33feaa67379e3eed1dada7dff5ec467cfa3764d731f15b24ed52fc1be4aa63e28fa4f856fc9528feea7df52e9620feea865ed28b89cc1eabaf3fa1e86c7cfbac0bc57ad08695437f24571da3bf22bb73d0b721bb8ed15791b4cbeec512e8fdfe8786e4f62059ff23bd3ced18d2ce68c6a7120e9c8eac7a3fa90f50561ad1b2a5f5836e6f89edf75bd287c7643c1c157ff48360f6edc707de848a3a0cfe9e149af9559fcbd56799f783eb6f64c87a239a28befd2262f8ac4bc4faf089ec8b6f444b816fbf48ea590fbe7d15f99adf7a23da8a7ccdfb5ac0ea555f64f5aa9fafba4451e62da2fad6257acdb734c6bd114df544af798d1469fdcc33a069493c1ae3defecc25229af999db32a2adde88f64d637db69863dda6d9ab229b26924d0b8d6829d288f67d2587b81f7e85902f2a96be777d7859fe1096bebf8cce7c788cfb10ff78c9fd0bf61bc6a58caa7b4de08c942876a0e161f179529f9879415541cf0be615107470c2cec00a2bc993083ad45a013c9862841e4e44f0791c7a882083c7c33504016637f4f82ca9b37781b7c3e60a1d38a8e001818801b86a35041c344c107e0c198f12e4c8814200344eece078a2f3012623000368129b452973c27800800de1418f5ac531e3c17c50503b9031f1ee23a9242dcacb84f07266ea0d8f326ef4b0627c810d0e2b5e4dce139a1daacb00332d9f28960142e0d923ecfcd54e1635ccc106f849a4682cf0b89c23ea364386b6d8701c464cd809ec7c1f606c8f20824f0f1e1f06974070924bb86f50b8238d2114e70fe0f870068189b290986cae1e5461b3d7c387d7c1664f84259bbdba611f186cae3f854d1636571c56d85c4128c2c5e18949fc64f0b021270bcd151c4db80c9bbd01e4301b22a70c181136d7279bebc41e7e7138857da8d85c4df0496844c8a2f4143ccce87185cdde0b08c53478c338aed8ece500d183cdd5005df8786180165e4372c52ac02d05ee37c23c629089856619bca3c5e69a830c1903cd053948d85ceba7308f0df3e051af4763ad32388eb0d9cb13c370b0d913c1a7078f11685c055009cd32f835a4001fa637b380fd52ffa4349dfe98fe70c016fb4b640a74863b463f4b9829706b41e2dc352f3fbd43ff8b979dc4cbc6ff64498a05811fba78d9fed4a977cd8fe80fe9c34bfa3e65d8dcb524dc8fe38bcd5d53b23bbce73ceef578c3997b31a069a927ea1acd03df7b20f5ac7a7454bff1f7dccbbb4452b769acf1376e244db2f5e61edc4eb83bf890f06aad542582abcd7eacae35e3a2a9b1196fdcbc7036e020e7c9dbc1b7f803f63f1efe78952b5dc24f91417dc50b8f60ad5c70c20b297da5ca4fd7c8e880837530846d1ae29c7cf88841fa5c12ca8a9574a587263e4e84f480c9e9f99c24542d275948b0d43399208027cc063c1c6c808438a3a5055f60ee67129e25446461bc64382fa79026882b845841368f8ae88c7143e7e6c612a00d0f628808d2117342e9c5a61c6da2a46e48018614cc3d0a41a59708c0664003aba191f2715f2408c605858fc1cca7c8a1cd35c38427c44b280be080d17d8a739cb18acdb04f7dea611e86dc839df823f4605946e003e6aa4f100ee66e0a6319dfa758acd15a97abfb58cf893f3e19eb63f504b964b07d8a0c72616b2d576bea7bebc216360013481106b69bd5e1803503fc143954f16ae58521b8fa2afe00872a5e8dab59f150f845f5293228c4a208a6de9b3dbc9983537d23e65cae1ce2946afbc4a7e20f555088c5f74205f415415c21041655e25d01a7665738b2d210ba80d1ca85de6f0fde8fcb1e0e439cfa1ca6c29bb9df1a7345980a4d4cef10c594de0ee67502ec9f1e4995d8fe5cf1d6643bc176c3668239679d73d68dc994c166c35682ad868d868d04db08b619b6254a67944d862d860d866dc9f6c226824d69045bd2e6c2a66443da926c48b616b6106c47656ad00619cbc61a6a8c49030d4b0331679851461832c600f3c5498c19c8c04b1873ce35c0884197995a027ad033c7f460feed1ddedb9ed9397feb1eb099c37fcef7d923f5134825299e75ba532a06f1c1dc83ab897dc70340f0960d83cf1e2e533a64295a39ae6ea94b3a76cf77f098a5bfbf8f11b0ff1401bc4d63e5f6d52b686a5fa9d4dbb8edb7ba7d00d3219ccfa69c85cd1ee5cce1338757e214e99d63fb8facbdb395db7b64d8e5f642e8cc766c7bff72f6d83ac7961f6f5b87b7cf01d8bebdfae0b77df5493dcfeb1915b76d401df5b95803574db76eebbcdb28f5addbbaaddb38aeababafebb6be750f9d99c37febaf4bb163dcfbeb78ef3798fb4c836930f7d966c7596702432eaecf75c9a55420bd4bee3b0e731fe0707dd0fbbc8deb9b16ee14eef7f6be1fc7ece53b812124de1ef4664faaea3e4efcb13dd86d9552d57767ef708e8b3af1c7f69d18c487bae7759ee7cd19557773357212489692e20b3bbfbdb0f33bcace6e1e22e0fec97d90c6f3872606328566193c67e5a2eb81e38d760c2b0cbeb0be2015562e6058b708c3ba450cab16aab06a5985350b1b76f30801832c17143b9f15562c5a61bd6226ac56b8c25a054d58a9a809eb143661851a6f84dd3c0250ca6ee06ef23b86830437c2ea829bb0b6e015d6435c93930faecfb90fa6d4098fed994b4c382f9f0753ba44e7652bcc231d5c9f2b7582a818d81854a2e0c5614528178ae355a8fa9c5b2f08c7c7cb49bd51e6e5ac3d412e4c8986b0c5b02097ad3f1466221c7a1962ba02ae4fc91b5617db3307a59eacc60450fcb4017a26f3d87c227ef3889be65e01fdf1210401d4eb0f5b90584102289c80c96c58e9418ca62780604117a5aecc1526a8a481c3d1910d4a22a8818a2a74486a214a8d2e2dd4c0880a0e58701142063246ec500494116d00519b41195bd868c32887364ab085072d57b6ecb001199e5843cb0978a83121a623e3e5c8298d249e88e20b961a6ab8c2c6981f62784113301d1b5fd050420449b4f862e90c231f8000638633b648a2420518dd1a5b64a982098a123f00214308da78a2862f4b4e90a104179d1a186a0c2f3ab4302509227a4b1222b85469620b1762a0c5985a122c90b8628b982e82384208306630e30c1bd0c8a28a34587042aad180c5162f513c4c49c388358a908196315880c64d1518aa70693a22883112e0c2861940f15005186c4041032e59a4c10219d668e201872616d0a0848518463831c393189f1a99284230e589175f6400861490b18410480431069533fcba30c50c111c514697219418c3a012430d497820a30524ccf81122a36b90202a0820a8380a0387b642072e3b303145130e30105186cccb1e4a7f9cde76c20998da18643c21a2096ad4c210484a4c29c38b3374a0d12f80a085e9d045c2105685fb898c2a502e2e6ed861061b9ac45043932d2368b1e5045b72d812658b0cb670b1a58d2d666c81d1ba719df7a5c05054ad5808209242509224262755bcf49a57ce4b852adb1a452d5efa8be28fc905276c315ece31b5a7587c36c58881c2b37905fb53279fcd2a1ef39f4d268ff9cf66129fa5e031ff2a5398a0cc244c5e68c052d02477e23b9a5cefef507cc714bfe23b3ee7e23bc415ebb97729d8bd4acd67afd97c7629b0bb15a347ddf02f37ef63b0bf3e3b19ecffa38acdbe6405de9183facaa461693a13901798b062f08e3cc479121f01c793a60e546c9e5db484f1f1d2e5cb6a6905364f2c55ace891020b948a0717d83ca1304de171822245645ac2e6b99404fbcf26b249838f8033132e6181cd2d661ee9ac3044048a3f66ae3399c0fe4081b580efc841257e92f4349c08f80838ef7f020abe63e6fd7152e28f9911aad89a12fbc9eb43d0e2f5893f580588c1869ff8e4e6c6137fac9caccb13ed931b373af187c8c4e274e2f864fc10b418c116581827fe139b0f410b9b4dfcf129617536b17c52532385e5a9a2ec090dcd1686f5e9219fb83e042d5ca43b19e10ceb233b53085ad8a896b3b03c910105ebc0fd348618fc3281a848055154d468f49bd658688dd2eb39b4173d3d5a94d8c2e405302c19a22b411333d8020640d46086195b1a2190d19344bb80ca0ca02c4d11a5948522810249061394008718bc5882f3a289018cd193041049a4581af384b4850a2a708419334cb1459313800963668d0280e94902c360450ca2105306136472ace1d402a8a62c3ca4a00b20be2e8cd0f1a52709271b5a8852c10ba89c40050d7802ca142f544125042a1053c7e00e04dc8981bbae4bc2688917a0d1440dac3c95718566e96ce64a173ec0e00b166401035af7bd04ee3adc6189aae18e077733c05dd7938437821aa4b2009f923eca2405afbbe4defb3c8fc6789f3bcc1865b5749f1bca93e59edcb5fa58c69a9de2f4d40489534c455147de66c4f4b3d19fdb0b6077f7e7cfb592b8fe04aaeecef9cddc77cd71bfcd23dcb57e77fbb7ad6b1ce538fadccdb5f6385adb9be7e5e760207abd5bbd9c69803d374cdf7fe23adf015bec6c1eee802d76368f19a4dbe956dbaa3211f6ff827ec3b2fd71849db89f64e082db4b215a83234cb3b07932512e36cfa316ec0ceea72f3290c0c58690c4e6ae3d7d51426960f33f89f105ce9e830003dbb3871f616f3670ae68d889eb572f2910e45c3a3a3ada8136e79c7336394d99b567dac8246fc91e552f61c6a040b17850ade5c7ebad5eca7a7e862153bd3447b6e97c4a3f244fb82e1d1d85e089d6b539c5a969fb99348f50e8f6d261462d162a3796b1c7cacab63f3debae7ddffa848fe8ccafa04067ee643259bae279b14ee86c76e979a563fea3160be549b08c3d5696cbd15aecdcb5c2cbc6d9bb607fee881aa2f0026f374fa62ebe63ab5e9733baa0020cce7ea55bc10c33e8026777c29d91822d32c0d9936c628450b2e205ceb34be5c29d81d4250c9ce7155abd56710add2ef7db13d5e7bc8d2a4b47b46ae4bead017e2d8567a5490a66e1b6f2a4865bdcfec77d70d1fd7c58777f84f8f0928b0bf44748d75121021f9f8302775dd73dce378f89bbfff15248d775deed9ec4b882bbaeebba9b83605c4b4ce5be6d8e301f5d5821efb3aeb52f8dc133b89fc428027fb89fc468c259e639f71a52efaa77e60fafc24e9c5778feaa79f490a6f4b250442bfd16ea13254d5abd5fb46d5a686c83a2b159448ddc372f60c3f21685672b61c2fd94444b47e17e426202d3a5e6416bbd3319e0343ac56360bfa4b30faa4803064e4734a326cad0e6afc0e386289a6a47b469449b3f97e8644267aa27a88862e988d6b5f9ee4467db1a63988efcb31f254d14e810a5469bef4c1c0a6a8c172d74e651515178fe840ae3130b9e3f9b9ce69414e88c4ea1b1f9f389d0590f20a09c68f34f40c1a7583aa34bb4f93d74366953fc4ec1dedca2ea17f3e9f7fb379e5f8294acefd1594963f3674fbd4f63b41c3258fbd333a3274b644ef0430ba2663883365f48cf8c9878228d20c808e1431333681e05ecd9436862232a087578e2208ddb670f1c20908e016ea181593258a9c43038045362e08f0becf58e190d06decea0bdd36e869833701703cc7d81b73170a55fb0778167efb415dcbd33833dec4dcf029cf35ffddb376dbefabe16c0bdf72674bf5d16b6efdebb2c4429b27d775fcd42f7dc7df5378dfba6719e3dc273eb9e38cdfb1f1f6189ed9e7b1c2dd88f248a5224f5db25da3ef544df87cf912f7ff08d681dd93df7459ebb4451fc16e11ebc442ca41e7cee8958885224755ffee2830f3e0baf05849ffa22e27df9ff801fde975f2345c217cb5aea53dfbd114d9c1fc6529f1ffc2c4ba53cb269535c80d3527774da9872ffa639ed5960214a91edbeea7bcf3df72c7cf755ef6b01dd6f5fc4bbaffa1ca0b1f9e51a61a6a041173d886185c67d775ff51a29d29d40630e451648320c21821cb8386009dbb4ee42f32e11111a9bdfa1d0611a8ad634eec1920193b6fd48a77bad64d2a210d916e0b4ed7e46d5b9329e106ca0d1859ddf6a030430ecfc146e2b2e7801810ca72f6660a104cc154849408879fac243084becfc8adb4a121bc4b056926e08e1053bbf63811776fe0c6e2b2e3001a10c10dab0f339dc565cf0020433b888c13e7d690a412969042120b1f33b30a2ecfc4f862decfc16152bac15252c2063e7775b8c61e77bb8adb870040831b0f355b8ad24250921c98a0b56e06e57bbf08faf4078817d12a30cee12c0192476d0c0f369aa3330a80e420e75b2908890830754f4e8c1fb1c44886176a6dfde8e29e9f3427d28cf068b8aa30a109caaab896a650463f0903f181e35e460a1b182e3071c6600387833283964c0a2d41e4d50f159a2ca6cf8162a6d081994a68247981e55781987135e4e130fd5005cf874618023cf083b7f078b9a438d97426b819723a5ceb4dac05104ac892a89ff39eb79cdb0d683744a5718eb5fdddd6975d56debbcea793efb46958d3019dc5fc7d4cd7d4811ce20f070b82f3553a994f7892e6fd24a694f5a715c6188e3e588b3d5d56ab55a519f0daa5e45441af7b588e6d1987765623bc330ec4de539092b837860188aa24ac6b3d5a83207425154b5af2cab55a9b766ab3b551612552a277fb856629015f656967392e5ad9b83ea461a391949c13ee712aeb3ba8e8c62cfc3eaa5933fac57d362d5d89a9a1ab0a6a6a6265553f37935351d57b3d5545ae33535b3a607a0ca47703fc55430da9c45023a7d239dcc435e6d48849d529f55958d78f03c9f5349ad0db52140475686d6f3bccdeb509589a810a58ebbfbdc3617d7b9acf8c3f57d5e0782dc0656eae0047bb599316e009cee1770cdd19bd3e79c734e9f734ed7e84d9c2013bbbce454af211cce2ce0f9eec515bafb48a7fb0dddcd18009b6368fd5ac04b4b435a43d70fcb755d59c4cb49f2340882e124ed2455aa49ae56d6b258ac563833e3aa93a4a19935eeeeee16f0b2278d8d8d8dcb66c6c6c6c6a665636303a66c3eafb3b1b1e1369b4a6d7c7ae08901411b4e77ea1a378e0badd7759de77d1f91540a0c43fb2354a99a5cfdb02b168ba562b1582cd656a9b366dfe0964cfa3ed2b0f4e7ad5eb60fb96676d9dee96f126c74db7c9bde90cc4b1e5be75655afa7d7c7a9d481c14a1dd8166eb6ebb8aeb35e8afafc640041a794ceeaa3cba69b6f3302d3abb46ed4e7b611e12e2bbdb0d6ba893f388e36b17d3defeb388feed0f561384e37dfb66d6efda9320b4080d6bddb499e20b33d27ab935b0fc711ad807389bd72c1fe5da7a577fca75491e24ce652183141427460de6428a57436edde21e3a57b1227bf2f95a2a9542ae5b3552bdafc94078aa67758c0bca494faecba61ff5a0438b520e0e78a77f939c18797587abcf4e901bf8edbead7d4e797a2cdff8ae6a44c80ddb3bdf43a6b6d4ed534dfe79c5e299d32f0c24a696f12f0a63baddec475e24c3c7a9cb7795ef53c8ffaf43caf2d155d83388ee3b8f9ce558e9b73c95c6aee665a9de39c6e1b0fee1e0cd79fb4d65227c3b0bbd7c9d5aeeb68d779d775b3ebbaaec3a92ef0c24aa917561d59d93bfddd5cedbaca7151c24927750058ebcd4121e5ac3f470a15e14a6bc51cf07272c0cbe92e5c2b587390eb876ef4f6ad4028e6665dc29d6e7942e1f93ed2b03ec91ca406a8048bd82aa320648ca1190106000800f3150030381c0e0b85c2b130cd43710f14800d88aa4a604c9b8aa32488619831c4204288310000000003423053db000d68f126976ec454fc4be728212e748966cca6e1750febf1589ed3339cd995d6a655b618244586e8a9faf4ece9fefdbaddaae6cd1ead174dc32f37b8ff972374da382f5be1ee5824efd15658e9272e387b207dcb59add9cd1354e813f3ff148968b8ad926323e2244338e04c39e85545797696637c70c3d175e09adad295fa1e0129a27ced00a6f77a33d0dcd8e1ef50d2270f17147b00a0169319d883b9c8ab208266a0840ba2ca15e0aaf5ddf20aeffe446096fde519456e83fc3efc7978399384c5b773603057065c3c7f0c8282836f88dd92e3ebf8fd82482da5b2ab299403030ec994d330b81550e689fbe400af1bc62efa22aa33d4060af584c338212c52476bdc4c5576d4e0c804c5db419c66176b8b884b7003920fd0a102ea658419252667004b839ed4ee8fa08209c00e1fb6d4c8ff3fb8c45a0db630314f581951a8ed9f507555b13f671cd90b031deda5d181742f5b0c66a4d75feef13b14a0b21dba24d7282945c179616d30dfc93604fdc5476f7fd5e4101555ca678acb8cb75247efda3218b84367a547a8dc56355821bab905fa75438e887d256e17d77f98770d73ac2377926c27b91196cf2467fb0980ca86265bc728727f47212ac9824a9d4021c3ca6d4e5d700537589c591289ab34ab42bf6d0d9081d1c9ef13a7506363a15c40dfe75460f43d0d4ca4017d71a7cd37854888ca8ed3963ff606dca4ca04ffd045b992cd206dacbfd4e3bf8964b801b6d6b2ad51ce47872557a05e93c73d83bcf0afdb289c6351c1dcade1ad5f5a44f103a326aee14415b7f02dfea6c9838f4e320799e4888ca947933aa4678835628fd8e7d8337630f6a1839b7f17b703c78540700b6cdc038b9b407039705c07f844d78c2ce41ccdb43f94c4a5ed97785a7f6470bd522454debc82929ae08eed93199d2b61e5a4d9399f30ead5f5695b80d2d4fc03b7a1b603dad443a55186e4656350b488303c5dd5a22bae5766493bcb0aab345bc7fa9e41c4deccc5c4dc2642c2feaea53fbb1185bcf4840ea7f8ffd942df655bd6892415fd703f828afb014cf66d90e3810cf18da5b578bd6b6850a1a3803b156a26ef55a89495d91b8654f71b13ba3584b0667c9f90801f7d6c3a57cc29530e0fdea10337206aa5ddd1797b3a5e6947ea50ba9b3e0b86952584c78ee91cd97980d5cc347c750afdba70f9985e587d758df04f3529a4c6cac966f4abf7453a70671f52d40e1a3fef8b52eb4dd92335a16868f34f9df43a4aca9e6ece70c2bce73b7a0a157e8894868c6f8d839d25ab7f169012691a4c9ffca35ecb7eaf20dad982d4321c775d0a4a5904a0e7f4157d2cec559c10665346a8d45bf8a68f15ca4043947008934c7374d1339c1bfeb200b452cff7218b8910fb49da07ba2c17e07d67a02eb32579d4b13c3f61727102061b61a6a9fdbf827bd70d20c310074288bd9fe0914951c98b28295b87eee8d6c6782e1c917c741213932bb4a2f478f8f0616de440b88d9802b771d8a41ea096fd98b2b1f08e48be5f1442b795be4fce3a8c17d47c43fc55d8cac8c2fdbcc127e56d2c383007b75dee8a66945d9019e11882780bf11ea874891324547d6671533fe431c0d625b348a641ec7b217dd6b34cf6d8122582592fdcf6a34afd24119981e18f0b06bfedda9791dee3c80fdcd6a7f7239d30cd91ceb9665fc6cbd571ea3c482285fb5f92c85f317fc02b81330a958f664213e053fe2be3347a41e6903dd768d540e22ba2d9db9ae4248291f6e8999f2e02963f7fe738e759aad07945f5fdc429b9f1415057e78807f45904ff5f2379a755e00d40b78135cbe9d0064b99c5051117b8f735adde25e3e0b3adf9013ac3402583a0b552e547320cd870f0a0ffbc027a3773436ba266d11074a8bd92868e19e962e0f1d33906233abd8fc976ffe5e05b49595a2a364f7887ce6f1d99675b1b3ec0895007f695d690a10681473e8930fe9e60750eb629c193779f23701d3bdb55bd3792192607ab1ecb5e84eba3e4ebd0996facfb5f837aae5aaad2eec97956854d1b420b4682c92c991569a2fab2e0812143906a36d44b54b0b912360e2cef083c6ff12164a465b994b5ffa325c80cac947b740fe0c6b7e51d1c36377a3680359ce930b80417234c3fb9cdfbec66147fab8adae5c2fb3ac18d80a88c93470c600e90ce1c4aa6bc076a91d2cf52cf6051355ab4f65b1e95081f264fe654e1c37beb55421369b05a6ceb2db03d3ba4cdf21e292ad5e0b9587d1b9ed395e1df9d05bc2379cbc03d98568b1dfe3e6f45f2f65047a177adc37011cb384644fdeb488735e6c29292e9a349f4c22e5539bc0fdf91a3a6e65c6188b55b6c7f18aed0697e29a92159ae701129f9608145c5ef0bacc9efb20bed3c4d27d98171adb9b4718af5e6fbc5de4cd8865e44ec19a929141caf545eb88d45d8c969e8002075088bd05c52dc893d268447c1e009f116bd6ccb4c4fd8eaf6010e40cca062a1100fa355928a9a1dcb3c0ef3a9d37f765e97a41604d11c95f1827ebb8c9edd5af7f2c4d3b0429680bb2f2f23604452100cafea2bd9ff1e3b5b7b16f2039755f47d17eeb5cf86c5439c961c4a1454592a4c40ae353b4718e893de8db9625d09232983e6f9c81f2715b5b006928d85d265711627569862b8dcd865a9cc9302038d548c961aacbd846798c6a7a2eb0b4776614fde6b99a3fd9fd1a80047aec720ba55fd54ae706cfc5f463339b8c1e40c9bbdd9925f6d0ac4272bd12a77f8ba006c97b49a83801ca0aea461a1b269e563422709c3fb6a0a1b6244599f964d131a0a2be09f7169bd2c7327231bf0541a281e371cea5d8e0c1641b51d2670575a74c2ce454b7394a690622ce4d0fb50293ba4617a71045cf0a46ae619e61a0e3f236dbbeee543556acc0e773438cc9dadb73c8a015c282b17c9de7b99f1cd1498349e9cebb24b34d41e9b88ec1560fc6d7de5e61cbf7b994862f5d239ddca24e7ab93cf083681e1783bd3366d3917d7f90bbcc4d14a1a20b09d79b571cc71b04508f718e8cf077c7c23bc897375612cd4fc085a3b3225b03a959cb880b20ff007937dc0c994f1805780de930f449dcd1c69e006d92591e7fc1c706d1de10a2bd1725913d4e8b56b4c34d842b8268538580586d0bbd4aaa28ddae7c3e697c261f34a71f8ae2d15e4410df20186d4f41f2acfe984e4d126e37d0c78d8afa425dad682af7973cd6e938a50a05e15c64636639226ab35d4a2aa9bdcec129ec39ead083f533fd4e59a0153c4dce4b4b953b57746b6c85a6b58f53aa130e50b736843edc886144cf9cd47b19ceaba40a88add1a00796193750f2db4419db345f78eed1d4a2fdc355f2c51f537d14af1c9a0527737ddeb090d4a6770e99af0ec22cf660e55259e2051e96823733f83162a7804d5dfcdc4ea1aa513b15cd53b902a3e403d1b1c89851a9e162188e2e294dcf4b69b6916bc0891cb6ec87ecc221ca8657b174c5b424baba2b4bd3ad5f4de2bcde8c53bed6f48e5aa6ab56ea3fbf01b8d85249321e0d39c1494fff7f8371f0d41d31573fe6ec41086064fabc356b41dd37be78d926fb29ee80d3ad524e18afd9df351dfbe524f8d274245695770d3522850f5f4eb5228cfc4ffcf53255afa339d077a5aa69535cfded179149e2c5440706044cd4abf9d841241d9175166ff82b53b28af25284d7d50186bd09822817af6c5af9f9924311f0df9b2d827c52465451026bd5674b92749278f40f2372a56aac36527147a836c504b2b18a770802509bb7acc667192ba6ff2b1e653d839ce573fd92ceb44a8fc7db8fc40a06bcd873c69e5690f0d36c3cab850b5e9e1888b4a020244e2e8083c2bc95ed8bcf00579c1291ccc3ab685f26c2e19e359261562c9a0ba58a0811aa9236329aa5a47da665514f27fb7ff39f1fcb5957da470c70a3a6d212910f6cacacc0275ae4e0c5f585409f4c33602cad99f9fd42e50551f95dcb551c9cf342879898edd65c06c4f05879b548bb313737ea3c8ee65b17a38cfa4218de81e10b7cd544eef0f1d88c016592b62b9546f2a9308122a3c87e0ff7361aea0ec7e25effcd58f0a1079a580e9c4ae796482bf72eb8a378d6e57b280a4c144d61825fe59f5d85db29b84f60a9209a66e3f095ee0d5dcc2fc67052dfdbc12af7cbdd07bc37d4bf2ef9bb15c44936e5f9eaec801a797f6633343a296108183aa601dda2d24ba7a5dd2d3e4787340376126aaca7fb8ba3178694048a15a22165589855db62d682066a1d8c4d6aa007c70d79182139896dac5a834a890b2d85a9da2bc96d647147681df81589b9d13b57fd084231fde834fe83ccd6c04f75199b486483152381cd4402e6eaf273c25eb7089b2c6aeccd943eddbba1688c908b41df8b082d66f0e91f4c675a5a73ad392c3cc629a1f7506a98b033d00136dbc1f9e54b6a9a410cedc895f6fac0ad895e01a6391e70ac406178ed02ba48c03320ede11cf63888f6ec1f63b8587da5c2b3e82286db4f98065a77fa145f21bd002a33133da3090766c2922e2fe1bae7e7097ae09117093e411ea5c43f5798d766845a95c3c8860eca1840e560b2bde73547d91d42196664df154ce70a729e7daa281c5336fdef55ae6373917d4e231f71f9103562ca328c9ebcec0efb4e781990634710348190d68ef596c22ca671b41909b21374629a064c012e93c4d5c7713c9e99c1d9fca8c820f85a9709edb1f4034efaf8001fcfc270ad14676cc6fa08fa285c9b1206d3601bd677d8f2b2c4565b1094c08f4bb347ba40360c07458fbe6645a0ab824036f79a496b7e002fca0116660457a383de2eed9170c14006934cc86bb28592c81c9a2ca97f53b61933c29d08f99b939e8827bea5d69f4490a3efc039ba400560a2db75fcad8d35630c1d79c820f392d9e28c3969a5e8a84593756718fa35217cc536f15f7e873ac007542b0251fc411bb37d7f211cb49245687f4494260ddfd0fa1664954c1285895cc1447de9165ef7ac34c2c631e28144c6b3b5d07691e1721ff1ad2936714f906a83bd3c351692dd0763f5d144c4fde745ffde1dbe743cee94f8a4c6d39836773652930b3602707e299a0b4a0bd07f7b1e5bdbff8dfde42bc4b1506c46953530fed25d45d66e437ee172c0dd35ec2552eb584fceeae6e68a9852e84dcd3dc0588a4f888a6b4eab4dcbc1b0e975539a5b88b13dbc5495eb4941c3de43f4543eed59ddbc54cc707885fa079ec1a16fce21cfc8c8c2e213ac687776cccd0e56a412ab497ef07d056731ed77f081392c689c0bc23600dc06ecee6b84fe6b16cbbe400e02ff23327d15638d07edd8e3887534e81a405f11df4fe828f6a43336306b58a7151f97b9be526d2c2484425f9171df557152d7bb2bc81bc2c6435d10db1a11e8189420fb9753b3dbeab43712cc75ee353e2202db23010ea297a7fb5b1cf789e6c5ea0d93d3a7fbf1f4e2a1a663f312e0734fe1f4ca4f221cfa3b83d67cc091e7e409508b76bf0fb81ff131f6895f71a29c3b64112cf608d0017104d0d2ed781b5f60b760779c1bb36775cc6fef9f40ab215e092b0f96cead71dc2f0635cac1651233af39204faa5f030e3d6d028261815d96e420ae6441e1fd45105d112aab7205de3e2be8dcc865f8c1f9ca05b95b865060b5f681315f2791073fd20496bcd6ea5b241b54210b4e62434958ed01bd60a25fa91221a112bfc193726350d9291534cc340db639dd5050a4534a15bd43e7f867aa1b669f9c3c5e2a2d1cce8b64bc3a8675181574f2cd6129ba9b9012b9586c1eeec2f1933e6f90ef7b5a87ba745b2e4ed85f7a35a5ca8fbc8782cc4a7ece4425db228f1d0c0f204809785eb9e11cb327e07b82ed454d0a25993b266333aa6067c715fc1a57f8701ec6a3ffbada26f1e10a75dbae509832d34b7a8f6227a3c1145ac464976400283da89fafa4a723d521ea1c56c1be46132ae45075ee40e20244ba2feda129e52926070e4499b68ea326d744c875e1857c9a049088113302611637839a20e4d5fb2d5e68b5ee2e493383b80765b76fab0e326c37aa117ed309af6cae61717560fbfca90d223025bba39064137340a3d278b0ccce9c0ac64e8783dd05c4ea1e4ab0713f57c8913701a8a53a60258091c0152987ea71a4701c94e1126c14fc40b3faacf84fac05b46cbb63019e3b9b3d84c4c353c9775eaa0025c32830c69f23506977a9ac649b8d675e5647f226614173c412bb0c4251bba6251a140c6830405f21f941bd20cdc18fa2cd21f0837e8df999b2102e198b0e95681f2b7fc87c922483e663d0b06052ea0d33d8878f780c3de983f66e02250df470a05c263ac510e68edef13f69a0f915a066cb571df0798b9963b8611350ece09b973ebeb3ae1e15f64a8d8182b8662aa2e2277c1b3846a2acc6a715c1f585999c200055c3409ff07e52113ae526ab42831d41923d736df7835569398b12885519ecddd58f9201843d7ad8a135a9925a36c09536aff9502bc432bb8fb5ceb67db2ab0d4067411f12e81275a29bdf855f728ccfd5a0e6338df50bc8d988fc7c5ecebf7df9aa368e5c735e04271654156ad0d9fcb118f1142abe025334d90bd7b79dd67fff33c15819f8d03b49af23cf47084956d2bf6e51f0bc0590e84a11409297c639ba7659e9eda6e2e9395284b1155d337fe263f3352482f2d584de1e4f4d08d83cbbf84bb8d45edfe2b064dd54c44eca332de8464b1d6ab6fbec72d02d34c5c33ecbf33a8357e27f10d4b7b26c55372506c98cbf3b555dd01b4ba2eebb027ab919f1864d886faa41f688b305140979326dda15dd15e2dbf925a95d9f15f51267d6fe623c9b0198398035224b844e6903887da58c4dbce4709235e91280d0c6ea1fa1275704980574e0fc68b260f14af3d539aab1f592ed013bfbfad50cc36dee9b9caf42f8c97e6f2f30a017b8564e530f72c0c68420381212369cfaeb3eba78836461d811be6f953c0cee6638bce4da5f824c832265fc3039cfe1edda55d00e4e0d845be5a5eca87c74b4444d98cb3e4ea50bc8e3b139c7e11c625de5c0b975fc1f5f909a701f9f85db2229a8633cb15ae5037ceb887ecf78a37a3390e3e0dba5d4a103621c59044a1105acb7be82546117d941774f68f1919d2404085e75d4a6332d79e70a71fd360d7b7592e3a52618302693418803fe42fdf5d2b69d6fed5b8fed568f45729aa8ec882a280fcf41b82766d2c74b64a09f405c88d082dc7cc60cb001ccd46b828e25bb6d4327344332e523013f7c17a53ebe7c8a33ebf429c134a63cd307d0e991cd11c32c9379dc40c26020df1ba85f850c197e3816c88cfe4cf1a889db984ceccfe6499fa21323d6e2d596e4d936e938a05b9db03859462cd5f6457d31d2e85a3fb924e16187cb385bb79f1fcb3a6b5cf469af59330e4d218fa11c4688b886a7d868c04a9aae58fec621cc75d3cef3e2e08e5d71e1a0d720a9e5d651ce9048a6b74c550fcb4cfc545108ff3654e58d1040221da5107eacda3904bed49d3b76fd017e7e79a1f6511f40c054f4cf9bd1642d74c4023de8460e4570dae9c67f9fc95eb8bb2a80d982232df570556d9dbed93c110a1c5f363b0c0bd7bf9500ed14be8252e991b4c76d4a16621e2854889f21f3eba14ebc1dd3842d1ca8600db2926d2790925608e690b42be557317610efbbf4e3247fd82ce9f6f7927b64f7b228efb08d24d93d0115c6565d6ffe4f5dbe2a88282303a6153c279af6355a4dbc8bcfab75cdd28ad43d9170ae21d8ff3bb8c709baba58627837eee0986187fbf6a2e5deea1ee559c173bafe6c09bdab8b7aeba01d34a6bb20c85d41d7ad97b377b203c7eb05c333e7aaecb8fcec47ef51135c5625fc3c7c1ecefdd554e7caa1a409f007ace72e982f1f4c1a3469b394cab9a1740bec9c50c287230c941b6320564811a0fa249781fecad4d816d975db7e1160890176d219e4c834bc6aac82e618cf65a890aee703039183175cfbce670ffcb6516c9423053b2f6ee004afd70982a0ca4789093db71c18cb1070cf36dd2b6eab70dd13d22c3fd010085866137fba8d469c47e6a02f2bf6bf47b8add51a7cb014bf0ab4a407043061f8e00857dd2d15bc5d3407a1a730862e191a927561785b015dba55a0c71a30d63bdbe98654a72df620fb9dbf05f38ad7d45bfa7f0f063c0aeedfa0e77a375c940523058ba32212d31cb4c71caff2f078b115ef4f1a7db94f1d34f78a018ff00332702a63cf638fcc145916972b9ee12b8d9f93fa63df69c13aee75cc9f8937c0f5b960e81938e81a8718ec7ff6a5d34659daad07eb184bf407f5045adac3e340b75cdaa54428ad0dd4e5c6ce67c5027b9ac818c5689d1ddadebec42aaf2a16c907c2f332e572885603ea0104ccc88320a4ad69e315e24d4ec08630d81841e3e02be6d4400e5faf1c43c85345ca0d8c35518650d16373daa16ff7b87577bea3a90c032283666afbfd71976cf7fa2b5d271fe2ed31c269c9aa13d79aecf46d47b0a1ba7ed59b68601ddfd9a202074057866d9c29d5956191129a3f191bdad9fcf31fce63d01bd0699e5d1a8da55e152f38d285ce1b90bf289cd16fa4cd17acbe2e4432f83e022d27daf49ed8afdbc01a60e10d186d8d2473ad224eb5ef52b5592cb34f1e889efa5367709a1adc8b13412bebb6fe3b9ab160fc87f56992ec0effb1138bbbd6c58b247bcb20492181dac6340528f6424d197d4a079b1733514cd7f8aa9dde531334a114b499521bf3d0e7fecbba3896524a76fc53d93cb485fd8d08a71aa09c3da2d2c1446f30dfd25bee456119cfec5c121ade66850a0bc100933e3cb1552e4a0ef02d848c1d1906e94818936c95c570340c0321670891044baafbb10f9009a808962b18b71aa1572dd11bc0bc981e8f7915a5dc83bc13152ed196abba3eed80c46360b7a32984100c5b230f4532d92c9968a689339feeba29053947a0d149db69d416060205205bd07a57758580bf176b520552d1cda7b48a05a7aa4d5f145e50afd0bd3d745af80c26263725306455c9150341201e4cb415a8097f16d3ec439a8eb771e09b0c1f5b815af88c2e9678e815a5770b05dab3008031d83656a4cd31df79460d6c4e9a480162d1c2d7233cb339e7ff0eda6e65d6e1a35a304b8946dd63979d55c0298c44ff3954cdc3d5e801715591812125099bd6da205dcb4d8b1d0648b5fd515a569a6d3392b9f24f03baf7f14a20512803b4251784f1b53180cfeeb524f8b5c7aca682503d214d42f563d48e99f5f0ff85a7baeb07291bf6f5d2079a5e2f5dc525ce8f1c4339b3958e7980a932a096371c556f40b43bd2499ebf6e946f66a5591da6bd85328e20bdbc529ccce3bebda08340af7f842cd9312c2e6da2e05a412929edac85f4678f1a65a326345c5a7c9711e997c8998554e305fec92ce575c74284f6c6ff857358e7959e95c1f4b215acf92faf459ae91e566dc8f64ecb2e53f4fd567b9cb84825e91438b5dc6b44dd9dadd539e4e522787fa2c41e32e8507722981993bd288e06decce25548670124f5a59f695f109e772caf10e4ff5527cbff80fbe482e7ea1e07143240c87dc221af5a81ef9fa3440bd56111ec2699420bacd9cd8894e31662971ce20eaa4c68bafc9cf41154a77056ea0467132a14e983eb1a1fab1765d21fbd4275846b9f7c1f90dcb7d357a47b2bda79a96c0ccc996ad7337e4741ee3f2527b2d05c2aeabe080779826754ea2d30858498d4c5a8f4aac0452aa5e5424af9559aa25170941d4d7f8eebe6a218f57161d0fc22569dba27feb061c89e58af2f7a824796ce148b9407468537d18d58445c530ada13e09d0ebf33a7d7c6323bd32cfae5c9b9d45d6f77c23f000606abfa3b26b9aab8a368e1a28fb8c334a93b05c61c4c248a6476bb7407a31bbc18bd1ce9f7f36df27b0f69cef1e2fd6d0ebc75228c06dcc113dfebf133ef9b0e10942f08325ff58f82cd1348ab2c04e335f1317c683fa15ab6a69c3aaee84b84672429dee91e9865ec5c41a9de2d785acaa866f37a3695d25190e6bf8ceeb6cee885999b52c8d25e8d50bb26c38cf829e4649c41286e27835668d2f5d285a0a074f14967060817134fc5f9ed08c84fe6830bdbd9c919a33a4d5de4d554a100bec6f3b881cc36d92f1d8707aef60ca2a49b490e73209ce38a3ff6b1301eac873f41c1f988a32cadb81f4aa2712ca5181959b27d0e57755fd798181f65ae07255ca10528984bf8e7fe3cfad8b70efadeb76eadc1f77ccadbb4bed9ab7ad1618c1fd98278bcc9f4f7f533e77904dbb09788d6a874820108081a508f076184623620bd8990cf15cdcb8aee67479d9a03414014c3dfb7217bc0092e4a75fc1125872df46b75a3a2f6b58fe223e147dd64093a4fc5a588a016fc5605917e3805bc6e3800e8c9465bd5f0bb6fec2f5f63c7bc41900ad11be7400aeb530fec482af28605bf9b668b8e44c91b92cc6cb7b57112b104d02794af18535b4bf4c1270c3c4383c16aa59c500bd44d1bbd0904ad785158ab2b808619d14f703ab8048473eacf3b334b2adec9d6bfa883a142a68f4eafd1b121b4dbe69f40e9a31eedd5c8269bf36bbdc69f8e9f4880b2b9e9532b77785a51e303684f1ad7ac463cea28353c049f89bd5ca501eb2c0fdbaf15ca6f9dcea37130fb40678d0f50bc4f4ef4ad0a6612b0bc5aac069ee1bf17cbb8ed6e4446e4d2dd53baff2b69f05274cd0066614325a5b0ccaafdcf01c8bdf4ed8b6ef21d3ac3a5118ec25a21e8d162e13761acc3f8c3e00b7e109d038bc77c1a5eda5b38c6f0af2d939bb7277501179532c2dbad4ec48679eb768b36ad6d98faf7981da4f21c55e6a19a4ecb21fc819df3ee856dd55e11bcb420868a86199faa1ab41795ed3b01dd825fcec6b85b5c9d507a54eed6b58f5a4dc7426227efa9b1c50d83d5324b6821ac0d2916324ee563a98f2154a9b07763c90ecb52094356412e36eb0fde257f20f111e90b5242aeae56b30a28a02022953201890c0d1655bf0d59a747d283b23fed14c0cfc6b2148f4dc78f79f7c094f3d0db3a454c00930dde76fcaabc5127ec70114237d8249319ce45914025a4f4cc76afb24974ece205d5e299c9d1e3aa63da2f1b7700c1f062e96270ed2ef710c80193dd874745e656e93ef35495d944c3628b4d1aca4e66748b06f0a1bb6fdf06f969db5322a0e512dc5f2068677f3b5332236b64b5480d929438c9c47cc3ddafa5122f6075f114df81d76e1ecc9fe44bd94dbe75bda9c49f4bfddd3825fdcae6f74a934416026093dcff749d08d0aa6a4f21e02d2f7d908d6da117552b7b3ccb991851dbf3b9431b1c02de276a4f7e72607eaf2f3bb550619b3531a7eef88c118166c573a6715701e024ee7dfc646bed7314ae021f172a27b565a75fd6b4422f4fb8d648dfc00f747fa59f4e0f306bcd268a33e99a4c42b4d31b72d64daebb0682f64e9c864d8c5dea8acf9417ae5ddc661212627523d6a0716f627e8a921f23fa4d49c40852a29ad7430d7d1581f8fb2f3a3fd212618f9ad01686a430b33cd0296f86a1a0f161ca423f78e0c2971912b9e48d977a34d387a0786fa534a2dab951cbe13a5af4e830e213bf181a057a3896ebfd1040847f7cae968a8efb22748cf46d1247a5cd4d0e155a7a315dbd104d9208de9c18ab3cf067c703ea1c989dede581f35e62a74b5a18ee3cc8c21c7dec62680e795f9d77a690bda38ed6780e9a733307a3d5c5f562f501ab81cfc66bb2c3a31ce4430120458a558bf28f5f4148d2caa7a9a6551f622e8e93a00e58e202d62459ad15b77f45f9798c9a2478d7a6f18a1f62c35788408eec8b788e85112f108903a41056c7590fcefd643a7c32e7aa2e512dc0635eac41710b0603ca2550ecc0fb8e5b24219d7989854ea5380f7addb06217b6352a3aaa257c6bace1031b261c2702b4a8bae3ed41f6a554d6027d10502562048c25e6568f2de0a16d14a9ddd19d686f4ceb83ef836e3ef1eaad049be8c08d4f8c104c04b6d8322f0d133920a9dd4a85e5c8c0d8a529004063234dfc16b4a4861d71c6aaa905c86a373686bbd76a0a82bb02a2ee6a0572e4348f9bae2211ca9793c543f15d8f902e76eaa9634c4dd69436d270df53c551ba1d1203d28ac641b7427b3b134f3a3467f2be52b09b9988d8aada8ab0550fff9808b07a4638a8e04c4b355b2de3d896ff359399d5202ee8c402262815d3cfbd8aeaa2b8d47a5ee889232db93adbf539eb3abd9df41d931f861055a677cee6c32cd65955094feca8a7c286dbc3f9af637d67d35b45ff810dda5e78eceaf3970641aee6af803be11c980f0bbdec70f37e768eb5d363dcd443f59c7a27195e9d52bfca2d1159a5cb87ea86e8d6ce61c28857f308e9b67c261a083ef7c7b646d501cd55ed2da93fe9869e587e88d88897803dcbed79a1973e178b8e16fffb1dbace94290421e020beb84f2b46f38b613e93ad13948c38d6ffb263fedd9e44f08d5b9e2c1a402dd0ef73a5697c079f83c36f2f1a958df3d17afb86b9020eecbe3834622d6538e1757c8377c9bd18bb54b011f26f47123a1840801db5c4141d3ef4e78322538ba155bae3904e18be31499120691ea47a942d58fae58daa6822ece3443773cb33444f01b4b03a883e0a3dfa7b9131a130589d23ce6393f92a999a12df04cdb27b3848b8e2640c9f6ac0da42170e083b45c809fda8aaa1113163a0161ab3ad0f143a187702255d1241dbf71d248a40953c5e4edcf1bfc3c03f16fe30e8fecc23fc1c761f94b57e4cc3454be49b10ee66612f408346c8315a7be46a9eb2016952724be39009d04daed3b48b8f957d132ae2c63b061bcd2eefd5cd6898b53e560aadfe02f4e010eaee044d5a1eac2f1448af1a5d19cc1e35fe669fbcaa1fcc27cdcb1cd840bfa740763830e8acccd69c65dc040436ff5823c91c5920e644ee2355e1fb463c142373dfd1fac51b0d3ee2f26682c6774a779498009e87f0408a485ef2d8b31ea6f823806b8d788f19997bc9445bf20d9e23d80471be32fb3b31b393a882e7cb7ce2b5209f4b494f8d29a4d5da028c44948742def6af28272a1b60a2b90d4e5fe758240092e828d9f5d6b2370973bb9ed383ff8af4340019bc5f980a7fbd48ea6f17d5097ea25b53c004bfca04b11730cbf754939d08ca97397521ee5246c6a0a7b20f705e8da103c32ca32114ba4e353f473449c67995ab2f67f29a35c0de40950ecad4c73d1dbf2337a3772d44c4dec0956c5118bcf7bbca0379ad18c543ee0eb80bbfd554f4817d63dc1df5863c442b431f9ef8d27a2624e27a5fcf7b8db9d29660c46db2c573de3beb91c01e840ec01509ae8f0648631d595fbd55989de4e2aeeb776e16f532f2b6f430e24f6f1201b42f7a42a70bdd8485c1ac0c921f03de55c2de2383c7428c825a60b50199d088e0391ba2bef2c9d8e7eb709856440ea1eaf0d44d23c203d8c219ff24a17b4389519805c099b48aee6d1bf0178f55bd74fe779bf88f637ebfb39a61fe9886a825e30a85d7aee5919dcc99e9f5c2af4c2512fea8ddff2ef766a42933986226ad85f723baeec43a8289caf28c5c77103eb722a83ecb6f4d166441e79ca7f97f312c54f566ce9344aa078f16927b2d5ce539e285aad6aa0bbb9f6ca3bd430b24645e19b4999e1ffcff6b0f607eb17f9c63dd633ae9b36df0a277dd2a80ad6b4894974d1ebc68545f5c91dc427a7d65df12f74f3913cb1dda7793d075cfae347e76162c81bd59f6447b2ba8bbe308435784db5c0e1e7c7d4960d1093f968211df27f8464a045e743a9ea3b07398d4fec75bc28df0c291da8912e1edca340f65b3b6053ed28c38081696d1483c1c093766803e001a9f6948181c0e96ca3f77499370f1445efe01c9509c831269dfb365e29250388daa4137ff60fa6cc1a22518a1bb759d201658c87aa9885b0fd5c779c21e487357fdb28bd10776ee3272f1186f051df672fe3da3679eb930c1103fcc17edf755deabb980c1617e090790ac7edcab57bf7919d6d782747e3d9c73043f821ec43097f3d7f3e68e1cef92780bbdb473fa31619beb480c7cc1300374bed7e4498ddbf2b0e00350719407e3cce4d68241a7ac0e89f35f38842fa298adb60fe0e354a534246d9f629a1d4fc70a6b245da8dc4a355267514bad0fd26a5ded880fc847f301403d13fe8340228e9d41104e20cbbf7747889ed5ba4cbf7b18c8f592d0b7af8a8e888af4c35ebbf566e9b04807f2addd75d0fe6a4426eb6c9705e0380b1c9f2b830467257b03f88c62d418954d0fbbfc3cc1a6007c8222e1e98ef7c09ec01950a4d1ce33e6f9ca82ff354bb18cb262426833614d2c0ac50e18d24e10ff90b6403474a02ca9a7482e4c0163a9fb356a862bc33da3060e279a86461c00cba977feedbba177e016ec664ee372243f207124d9f34d9443f2b2f9a60ea4024c8d73330ea60501aaa3f7e07fe8bd847f52bb951272b408bc128a12fe2a44bd776af47d04875c50a6075af542155a194fe50c778789c0498c548eec7b1f74317005086932de2a1ab65310965e76406af9e5f6ada46bbed84d503c78526d36a0f5c0e639243c1746900a51cdc6d15b77eb5b94cd6a7c7e3f02882b1528519b3d5844608c71e5b9d1babc2150a6e6036669cb3fd58a16cfc0ffb5c32cb62d895f5e777ce360e4c02d3c45a9705b95f238a46326ba988c518c5cefacd5032dd3ad7fd096025937a212475feb0e08fd5081dafeabb01fc9731424fb12a0a0975680d995a341f80075e85f6032331b2a025c6a7670740e8a392871a4cb8d45fee99dd29fc65d60c5c729ab2afb7ac03f0acb079aac3ec017f0f132aeeaa741c381329cd79def27075d70582e932db78a82ec2b73d810266ae4d7cc82c5daccb2a2c0a2d0a3272e29d8494faa97267dec983c1f4c94a3e6aa18304eefa6e151786a3f70da5f62b8dcceedc5ee426f1e34cc02eda2a4e80bba1078d17fad76c6d972b0771f35e5ee1970d046d2423a00c4c4f3299c02c8f81723f520fa4ee62198e4d66a00e6141a9c8a9899d2f40ec31623efa0af9a420b687807caa97b231c9901e8ba8153dcabce71e62fb47c37ceac3f3f0813aa1345140deadd0600eaf18dd7449138de8d0e81f6d700fc1d9428c383870c84456e866b9b6672d2fbac6d5b2c17231c5dc3e7bde8085e5089d10589182faf45009282bd8a888998b428ed619e7b89cca7a0151c6d368fa0230212f0af403502c7e8e489b8f0d09a573cc3dee679e0da20380ccc350638320e6c69e71237d0c20e9521e2d045872a84e5c4ee6f51dbc5116e448f0392b1c8ad63925a48281ce06a0e6d79d36ab120a52d8e14ba678bb3301414cc7f0aaa2fcd499fe47051a508417d95fd60d14cccbf6c69025d67923309c6d01c7ea07d162e231e746e0384b24e217a26e0df220b1718b0346bb4c2ed19b1e5b064b406461e05aedd7e8b4e6320c76039cee280c90a64e487a2515cd9bf6057e060c320677e78138b63911c83213356274a1a460a38af13a3ebeed506dd71af644b328d5060ed989f0e0956b9300589bc6109bcd4db934221b2bdde2a93d0ab2035b246c46ecdcd0eee68c65fc01334f647b7de7e8a7197f0394dc27bacd8778e1db7c072ceeac757e4bb050e64e57e0898eaa199b17fa6e2544437bb9b0ff63ca590264376f90b4c3af0c004923cf3829761fe29d52fec11945284c89bbd472f133207d6abbd6aafc7e7c978443bb48d77ff5f5aeff0a7e69a085a5cec5e74ef4a48bdbc92300116364ecb418fb29f74d495ca682de56ebd59daa0423abc20648f0afa30a4d20de2f07fe980bdcaeffad3a383e4f0d8cc1219bf64cbb95c84e286223f0e2205803d7dccbcc772014f619a4157c0602eedc7caa966449bd170a50eb1f1c5e8125952f8ccea4b24c56587ebbfb7b283c112e1b6a0866e78ae0a5b0b4bc7628a28715494f55adfb86f57a23c5783016972c492665d23203ddf9ad8e18c54dd3bbcc606af23d9995e2d78132a284288749c826106b499aeacc34b859010ee2ef53147797d07470c740020fe110bd08728d436b46ed375e94055b950f976ef0d292fcc26f3fba4a92b28b105b5a46323a1b3a029260c5fa9b811b48cc256670e100f4dbef45f6bd10996d703c1914540eb549c599803edca3a1e55ea25b0f4c792c069751181f74aff49bd42c41e440e9b2dae767340cf317cdd66a7cd3a988acee59707b6f41daf969499e509315380db2824eaf81959fb150a3b96209f5bb6539756ffd6058ea297ef32c6be638d59e2ae73feaf8d1ef6df510a7645bcd1c2a689e8e95e0c474e34933715cb371d7e6397a4da66e5a344f1f3a4b837e49d08d25798c06ad88c3e973d05e2591b0fa6c71c8beb759af02f4606c8403bd614b0ee783ab2a175a1cc9f09e79ff20f023af876efa54aae3df989a56fb8f90fe51635f1785befd416b87843943ffab6ba9e947f79938feb32e029ec8dc1db805a0d7ac0d03509e81f66a975c21930fae949d7052419928d7e93541071dc0fe01e90f1e7b653e7c9ef573babe101cc831d4b75851b906aa2eeae3b8da0c15d2209ada404fc24c6ac4fbde916d3be16afdd9cb1f954a523acf609a34a4cd5afa3b3eae50e987d3b5d2f4fa9b46539176031256eb27ab85df80da0833ff0cabd42af081a9626ab16dae4ccc7d2048510106873853c3a5e10327d04d5c1e6486d9bc342c0657dee19e7bb99484b3d8be09788519ffda8b0cd1c8a90e8e8e83644fc9e529a1ab664944fa83cea157e282f5ba7ddcdfd870441df3e81dee9d226fa3ee8025808382125f8232a023bcc8ea76470b99af57332619c5295be1d9c0365af6b5616f03b6731a8071f4d9d74d7051e1d899a448be3515fb73bb30fb61760ce368255e1c4bbb5d108dff54d5e86c57647a961f56aac5748e97a837b98cefa75c6414b35c9cb12f17bf37064a09f435e234a87f3cab647fc5f7750c6570ff28d7cdd094fcb995103948a45669f90d93e3ba779ac4bbac2e3debc0dd30abe9a4f3bee079aa9a32e9fe4b237de5c08bd78b13e0bc3ed6a359adb2d7f2b630f8e8cd153f9f6c690b5d8edda554305a3d0e8073831483de92c2d59b5ac25bc764badaa1ec0f8e3ddcaaaa05bc65d8e7b8a7e442e69cd8193feac9cfe8d719cc40ac5b027e8edfbb2d035c35df4267284d1bed682e31c43b0fcf150c584a0126ff520c51bec4b6c0a08d6f6b9caa8e6183e3a3b7bdd13e9e590af3708ea47c21b780ef30f16381e36018e25e6302f17ecbb1aae024cc97fa8a7c439ca6134a652a927bf4fa679ab5d82358e063b29c2f515002a9543705dbc09e93790a6276aee8bd9e8246a3247534c916d575644b6a04b2a5d7fcd8e252a2d8273e268c8c99126b6c66a1fe324c6a28387ca390e55db06a90a8c752217447119301a629259fd90517f4255a9d6670e766305831669f7193ed3063a41b2044385737c956ab824780f80c2752139798ef5633cf377c71999b2bd77753878714463b04dfd622df331f1f4cabfb25d53a35954597fb80bb86332a1ea9d62fd8740ffeee4fd9f1c27250d36652bc13bbe7d910b31829b5025ba50ebf0320a74cc23a00f5ded2c607c89853cf63eccb02e74cbb9cd8c60c2a41cd23c3476036ca6d214f01e19233819a7377388e6fd80312edb4a3f1f708061c2e9e4514af2a7b50c5555cffbb16ede38827fe8d15ae8b8d82139dc58697baee6777f8e1712320ce8072e957706b5620a9ec4321b8a175b19ea8e950bd7faf6e26c858d572b6bbf795060a2c6a71c63a51ba3a1119a410d6d2fd9e41b167b0bdb5342c9a080f91db597025ca17970778bc5fd9e09d775c570461c9beb62d199a0d500812f476655ba4f07a678e6d072d5f8bed7a0ca31300f911f0ca007432eaf99928eba781209ba2639ba0ef516968519faf571789b11c34f381980d552fe43525b277e5da3bc20693b53c1a9ab1e257818978c42b59c91f4ad4e3a02a26e97678a4360d6eb3abfefca2199c8556cf7c4de848946bad8730db9553c2867c12077173ed6a1d675c0ce7b23b6ec0f443caf596630293a82d553406265f9e47bab1cc8f8b95700381895ffeb1c9a220cd30c1a249167fd9b72073112063518b44c0d5afb4cbf9a415e135335b85597678da70cc95e84a28840369699af01052a9008643bc4b04760fddf5aadd97c6511cb568f846dc56f0821cd29c7e4f48eed4885b301c61e6a22d0bc864ed9495579c18bac789e8040f118581bf09f4bd8b1a6a012610801674872af95580cecf9853e2d7b431e2abfd5c787ea84827fa861d00890ea5abc78e2567072393d860cacf390d16d06d08469b4c65c8bb7733aa56538f2f61342b936d348f50d37890cc95dbcaa700e4ef1aadc3fcc4a82604d9e7544daa8852c24db201ad492df7802f010b629dde3f508c1b642e1ef2d99b4d7abfb9e91a90245adf2da2704eadbec5a3a30f7b112d2e7a5329777b09e5bd9ec013def476d625477792e0475d6fb0d48218a17dadd18ba37c5a82408527781058939be7d2eaa2190bcc7a757d410eec028449cdb3eb1f862bf4a68f7941e77264d5928e5c973d41f45864fa207329ec4b5a4f988455094bc74c10d4cf30442375b45c0e3377356f7eca488102fe544a163370b706b5c2e95a6973accc9012df61ee196790309751d683f4434a669f22e490121b76815e6087ef8e7a8c68bd88ee208bacb88c3470110ac3aa2e07a9c8b56390cfdcabe3016efebdf1ba50a66aec0e9f1f3a47d991302b589cbdd4dea1c9cbff7fce35824d3c8b0b350ca2049fe0d3727a16f5628631486d00f1cfaaa9b7072037a40095e679d5a332be7183bcb6e2b5edeac1f34e6dcf5f50ec2a8e283856d7edba1821aa270983223e1865e83e09e8ab843fb5f93e3c5ef164f1bf4e673c690351a9020c8087cb238062571c53f5a454cd4fe0651e321283abc019d6daafdfff4412cbcf7edc6f7804867671ee8bbfe4c76e84a9e36023a08ae1636e888888b91c24c3bf0b386bd6c5c5281fcdd78ba5e5ef81a6c5548576c3da4bcad44f36e136ac4573955507c8fde1875e2cd3cbd21371f4bae309cc128dae4ea3d0d9bc5c27af7786048853b78b85057a3116cdc77ee461dbef022f544ce70395fad391fb5cfaad56856fde39537fd0d4ecde484aec91417bc728a1074f410bd5a7a76b8925a58f4a4c60a4f8355155fda686267e7cd2c2258fba6bc9d9fec696372a39b679a99652b8be18ff6b4c642569013cd8c11f695699dcb2679ed5185ffc8c51b55e8d7014599b864f130fa8d1e6726f9fda85bfebc64d699231c0b5994ffff63300f54389f52bcd427979b51c21d164752e0ef79c1f0352ecc8b1777ff46d74633a78dc7b47c6773dd01506f528d0a7d5430270adfa0918748b518d9115c08746f12c930f002e193bf1b4780e04a622bc62ce35d49d2ede4ea50bd42b7112bb42611bfa48036e1bf959b155cd8b27dc585e1931de2914667c65c0f43e1c5c6d2e7233caac25b6b0519d3ffedae520a6f9e851e10a92ca6d19302c20d1f6f73f1e74fb08c482822b723c645ee07884a2321c61ad28df1960e113b9512051eff788523b49dff03bb265a4de49838c9c116e351a413cdf6d2529f684815e32b92396ff920601ebc162466eb2ca10926abe11018222336fe947d47ac2fc91b4d52e79e18e78de201dd1a51fb1706ca440c222550f92c40824c5f423ba6b45f239183257243f2608728fa8531c6247ede3c772f0c8bb646f22fb3022afb921fd2df0759dc27a29ca81d11e61825cf5852fc73ed39f47ecbfe811e49fd5c3c241561a909c174abf15be4b110688ce43f416ede8ed327ef967211681fb4e174a3bdbfd7f797401b6a3c55c7a786f825be13ca0d3086f159eb9e242a5332e5a41be949778cf5606af05061a11368675fd2c06e73fb05909d9dab7e1d56517ae792594541b76adb5c97570a6542afebfab6695a46bee10ab3fe597d2c9b69a9842fffbdbf32fc768f41687f4823234e8a6a887d50ff8a9b4d8a1c2a770604b2eb8fec4832a5aaca14b862ce696d106e789fcce72cd13a59c14107871a43e909dd357a3eb0720916c840cd6fb97ddd11a45b910257b601074d41a17bb505e6c3e42a2996ee81108fb6c42162388f1ae2f7c3f34f9812bec9013932d111e03d20f29468c08ba635060bba4d1e4b8f834a16de23bfe8e284a859664747038f0ab76fcc1cfe3d0f1e4c71abac02d1ff877024828fa262102e6282d678473f8a7ca721494ee76c58164e064b580262a82f299d06c17b1cabfc6e78bb5e5fc31f026a24c03dc777e71c04660e0b6c65f3b1369307f88d9a23b66cf7e0107ff2f525f7c8048512132dba7ba6b36fafe8fcaaeaa43a59c99e254831738c54da53909f79be6f32fcc561c8910623bd5fd5319e4f8f595e95784c78fe94c192f9f3f2cf60d58715e6572453fa032bca5d77d004e96bcf423ec446c0046e4d8cd4e587c9424f34ca306aa39d41ea9615ac5a47769cfcfd233634cb9c22f54ceb2f77f1cd1c6647bc6e91b73b16c72a273f6e02ab198b8fed5590fca8e5a4aefff4707bf4397e37eb93ff3cf4ee7a3cd93f2e4a15340ac600f77736923c3dbec85b8eb8aaf21d62a9a187750f8f2fdd8846cc3f51f95ac8ca7e015880c9e76007dbcd8ebd4bf14fc4bc9978c22db0eae72a9332aeac7abc434b4fd3794fe7a0345e13c0052f625b8d0e31bebf395675daa00c63b4386ecee3c3fc8a84e040fb0fa49bfa3fd4f10b99f6eedc9a3cc4684161145ae7c9c215aae4a25a888a4c57e0b660e81666222077b2879385d5a905560feec764ffe3b9d92b36f6e25730d223bd2eafb1213f43c946edc65507ff5381df2da7300b37ad5d23df6949572ceb9c365b949623e51c1f541e88edcebdb2b378222461185a3c6d7abdf65c60c3d99eca299683258947ef1e32ba580f08bac98b325d07efb6843ce641301b6f9ab2b0d248afdbae6041a25496f3a993df475b1be5ae96f2032e17e040b4bc944295d131d6901247a6f9b77bf10696a81cd639d12a587af5778d52e2cc1cae3430c9369b1115d4cfa4b6e1e3f8c605fefc44ed2cf4f2ba36f44f2ed826eb75b699788ffc2484892776e270f7161eb6b294a251810df8221965f7e7536dcb28f39b9b197be5309338933c0b983627d126dad98c37ba9471862126b03616c62cc9e90f6439881f98b01209d538650085b1af062ca24b76e12df0a4f653cb88dc5ea92b1196118c2bfd9746d2333f9128c5c390cce7631feacd9826508ae63e014fc69cd1591ff3d78200eb35e79f5a6489cc57f287383a1636d305432fd7a00a1eb832b07c240aaf0f74021f14816879e292f0caaf3c1e0abacba1bbc6342c090c5caaf49e1254aaedb31ab6a56137ebd7af617507ac34feca8fd034a06e217c4417531afc4d45b334b54f22846fb1a13817ba407380b05746d3326f6a9c3cdf9efb28d59a25811d01e6796101d84c4ab1ae658d53c4958354ef32a8b22d63824fb8201c7073605e838c47ef4c20fa440353e9105439be41af44afc5c1592edb47fdf0d2edd33da0e59893b0444a951d1b17036971360dd86722c8c74c9e843b43be002e8bf1666724af161c2a7e5c67a7d983075bbbca7e3a45c9774f2e7ceaa151cad114be4d68e4c73f018f4453d3d63772d3056b8fc8d9a7b631ce843f1f506a2736e10118894212c48e60d4c3813487616c48290639ffb1761973076daddf00d6f0206362f976847c4dd06ed153c3608bbe8701f4844c7752788df3af33661f0a955ee03592748b68f55ea64e736d94b34d3bd288a003ecefe7a4d4899f7b458b5bd7ff3ce0053c5e592060e52503586dc51f51e382685aad3485fae686ee407c652da9a5a74ef221f0429cc646ec387570c7b5ec0e22f5c6aa4fa1521877a6536b2a0902a7e218505516f05b2e9af83bf008a04b9c765f7addfc05d8155231a04ca01930490d0044637f33a390c8af51c346c71046f4c2cf5e6246a986d74957b989336ff88fd33f12ca3916cd1d493202785fe3b92e3a59aaaa927f77a830de0609316f91e207ab4393daa0e8e6647a2d6fad4cf38f085c30ff6507685f63891c0f983a46b3fbd1137a49a03c1bc57f1de132c2660655e97e12550712ca087ae46bf5d5d4ec80f39dce597c212aa868afe68df4730a8e8075169e26827f2ce5c06544e07ae80ac9f047f42ecf32e9bd4d6c3b69dba9608dd5a3223e348d278d26ffdfde668bedf1c71704b7b631b43bd22258ab15da6edece1c1c1a18fd35bb3a71e594b06b4c187e0ff16ed34e3f13947677ada95585134e7ee4dd4b971be88a1a6676d8071237152ce5788c4b0116656b28ebcaee308d876fe7653ac194708661e9c216d38e7fb1f6cc5f582eccddb5e4579f320a5f0b8c381457097638c05d00203c8080749065dd4e18a89409cbe2d43fe40d91ff2c9715c4739e62c1cb5e548847115d9ccfa417c837239e0911196d94890325c9a42be1989e60039ea85f8e2e05e73f8288ee73214f26db5a691f5355d116aa044379a53d978ac56a8ec8298db173f975baf99668cd8b4dcde695bf4d9de9d2652d4d8923b72acc0cb7f79880e96a60a5829d05e937f231c5cf6a84a7c3be20a500d742745859bc36714f3c2b6698853390bc77e297d16c76ef0fa3a6180f36fe85ad27a8577f1689c590b380c335857cd8f6cefa3543eee831d440472726696061673c6b543353b654095b8c1203feb162bf7530e3f8508c3bdbf2eab2a0bdad4056c0e4843791e23738a62ae26ac0ff7595c92b23ff2c9c60acad3a19f042634836932e203bdc95b96de3e6e5b8fc7893273936e39df9e7fbb55000ddca966cf6291e2a9695af9d88eab64c85f52a7fcfcb1063b582b25974ac0fd683fff06501476c2883684084003ac53616b880e75640821fc702b13649b325d5f2f10cc0ff20ae1ca1819baf44e0a86f522f2fac77f3b9920cea3ef92122cf4a982121e42cb5931a003e6308a0770ed44e323d63fa58477d5e26bc9be5cb260231aaeb25744ce02a427c2c807fb8a843d4646253a86e02d0f3694787204f91d8071fceb81578d353ea0f43d601cae583bf51d1d1d11abcf105ae21c76e05f55d0c9ecde434f6bc12ea51d89c8e339d53a49ef1e3993e95a1eadf0f73189f93970f5fd9d2be74c13d1ae83b8174f55eca4fba017be8250733ba840255830320f2e4292508e07ebe2f12067a850ef5cffb9dbbd0a494881110d78c72ddc4a77669660406c1c3c0442c495cf58bd872a0c67c9b0435ea284218a16fdd9c3426b263c76d19a265bd312e45fe103df6ff5c463bc9caf29dd8bac1209f58625045c3166fccda6350c9a7b8b8111baf1f9b143a0da1179f884f82aba9ef53898b1d00323455d8dd1c6c8fc5f31fe84898525987ac6bee417e7fd6856c23b105944c8a4f104e525697c3096e7558638459c7215db1185df3145a2d8b2fad47e11acb91fed5f5750ac3ea564a83174549f805dcb99de930ed5a769a36735d705a54312d3d3949d5b4ab22de5d93a95c786d00b476b6a82ff6141437446708dcb99f290185eeb2ee9ab53abb0859d58751f1184babe12fa3fa648968b606dc32d8bea618b0689b56d87e9f14762b9cc6598b34e3dc8c34dc12ea37d24d10f23e090e65cbe2dec66ca9595bbea4c7326d11c2c16e17ce7ec8875301f9825a9494727107dd4fb00878c929dbe85f53a095ff107930416d8a443e990442b6804799d6df27fdab56ea2e1d51ffdeaf52b4e4ed81047100b2352bce053889f423372d8c7c779bdd0ce6543b1da5d877fbe71c749df3300503f02587825663f223bb7d758ee91c905eb29b872894cbda8905a345bb05ea779e1860a59dc62f4e897199e082d097a9680d5f79a8c87292301b3f6ec3a782c5d8ae263755c35aca539a5a9e208c85099ee767816a8bc57a30e4270c358c98e4d783f871303a693fbc6bb6e00afc71156b3251262ee5c14f9e26b0d0853f631c0576224665f48b03418ecec132a8343b1038d73cd4de5c06bccf2ce48f708d085f9338960e96203838d5fd06182781d6340ba2fb63d0e2ea8e1650df02201c3c6dcd3f4d05bb9388c2347ecebccac2adeac4df79b0852d27890b0f24ec3eabfb7f7f81191a1d0042e447d1252552f5738434c4b06b5a078c1ed51dbc10678dd13f48c6b5ddbff73d89dcf9a949503b9e602b1eab6a27a30bc776d440a9433960a3032bf3bce912b986ad185a6f6dfb64ffc138dd00658e30d7593c5448dce63af9289e1614c13ddcc87dd42bd567e4d10036874d0427da71fc5d77b2c6feb770dc3b05df8136b80d305422abd0006d601fe08634c4bbb4bde06fa740cd66b74cb1c6a6048accab5154c1423a1373bd5670d5745d6e2864917b19dd4b31040de64bf66418a19d520b6402c3369b5dfc3ebf88a6c524dcb41a10fc2ebaa06eca3091f4ca5c8f69d7f4087e7f2f5f06803a32eb86a57bccf92081a56a8ac0ea22cc48c16a4bb8c0efba02e170a03939ee5f3f588dda77797b9bd34a85964fd8b932685cd3ad5371cc5b1990fa5b6c1c7d5c66c572385d646f91a56cbf468e963a3d65cc416e3de6a886f1a4e680b4c2be1c8c0de6b55c7f6fedad4d344b9b3033efceaa71ea2bb29aca97fb069efc4b459660a222acb7deeef46b225f05718b88c83d47613fd14417e868913401d7a34004c75631ba585c791cb708c975940f6ff23a666cc698c42c54b704cc553464e2b93785e3759877dd4892233c00428ad8b88cc5bed56e4205721e325f40e0fa14c1adb1daee6f8c2be66317c05ccc12b40d2bd069f10d6be53d9b9ca86c92b0392d04d679b09b22d93509355c6cf38010b6269f544d028d228bb50b92e64f0acd40e326a29fd44084da1d5281dbd7e50b3669454b7105a23b28d27bbee6775b28cafdb73e0d524cb0491cc4ee19d38dc1384930eef9b9c6bbd073ee442affc0d90c755c250f073c0cca26a03ed936d941216f763df7d5c58872c3d64b43f5afcb3e75713dbc9ea28eeceedfc7e927a0ad4eb6d803d2a3a94b4aa8f7f691230f33b9ef4332006e3ef9321385ef935b2c49211f9426c861ab0a2d32c2de6322e42c116746f52d8ec6e48b2326b91eadfd11db390c6d65870994dc091c8a01972665dd1c5d525047221e24d65b765078718916b5f8bbbdbc08f89c8f395b1ae6dd3423c8b4d833712164aef89fce2898ac65edd6601404ec593a0d9b104bcf88ac81bd8dd1ec1fd2a6ff788e3775d744066393bd8e22e24839c0231f63b0fb41929a363009bf46def57111e5150041fbb6fb13f30b672fc414399b189bb65db63907752676059354b17e415fa5caa7f228ee87b7572c17e542f945ae2b4051f2ebaaaa4faa13ffdc11ca55370e6c6c85f9428aad26eec77b94d433dced1ac0921c68178609b45249c7867b10afe94f8447279da9b8bb0cabc81601a58b67866aa8a558318a7f02d37edf2e0b7fea12c6b659a788ece52847ac05c5f4e865d71a7cd48dd7d872d0e44498ead3612637ae39e6165fc6ec5937461ece08f0fc58320b7e08a4900ba40963d80149b5817c93f243d246135a398c9636001d80419e5f185c79b06ba4e77d0f474874e4f7f68347483ae1d1d326c01d788ae336b783bb801d9b57c3f9b5dee943ccda447070f0e6056c35ead58ba9cafe67aee3723876313ac06aa4a73dcdf7b9e1e8626d784b7259378faa57feac5edfea71060bb9871aacc116bd4325c158d8af44703e15e8d50a288d4804836907bbdd9680b9fa4e250ac201d523cd458e0fa4257f2dda7e844b3ddf44f93008363ad2fedb178dcdeee144f6cbc74df3da7d3935ac5902c74eea1e2576394f08a75078c217cd911f705b2e57be7d0e6f14dee9ef7cf5d3ffd5d92db03734e1d7c076f1013908388915eb44085d5746932c4de8e9cb3c5e4921b0409e7fa21dc918a1c783f0322e19f487202a50e75d14224b78744d7a982416e731866f410f826345fe0c09d19d1a6c7d14eeac4b11ef73928bae7d022e730237b02b8ae697ae9329c3121e77943e29331ba8c58533b364cb94a653ccadd37c8a055af4bdd338e8091bf755bfac3bcc0935ef975ecbaa19abf015c12cbdc54f64173b121cc24e4d6ff1a2b5bae372e423ce944d11648536a1f9d1bf87982add073db84e09ccd98d78bf76e4965ffb4744d615bc5a2098ab4b88bddc94a6e46c05d0803499388f035302ba408afcec24b36203a5e150347a0960a56ce8797c323501add0e85f93f028d603278203d0e67215d2bf31298df8c9b152cde22e69bfc06939d2703f891d3add337ba1425ce50de8e32870b7fce581e7d194bec4b4bba8d4b9e1461c7d04c1719ccfb1c3707e517645ee7794dedcc4a8c1f2285962c2a1f5d257886b2d432800d1b977d44d3fac92e856df2a752e6d2095243969f7e5ace93488b3dac79fecde8d1aa47cee70c1a500296ab56ca24ecdb720b9f315e87841e22619622616c242854fa118142ef3de983c807f3971eed213433d5f63911d013e8fb14c1417f55317c1709841977be7608ebe128eecece2d18c21825930b96dd2fcf8272db56e2578bf9217dabd6a5161a3591e4801ef5200d2274501affe9ca461561d56c5494da56e6e8ec3d193b153ea18f320800a10a6beb3c54a23296c37c454dbab3ec46c60bcdd706f50fc1ca008ba05aa0837bd8c819476905aeadcdeadebf8df9688a11c2672477e5d72bc5a97975f60a75be7531eaad991d3d61485e13c7a01d47f77bc7ec32cccbcd4190b945443084ab9dffd38210bbdeaf744b7581bb99ef40a41f0908ba41e5c45057aae9c25a22a634ab050a1493ba9a8275b10fdd83085fb708b09663fa11484889fbfb6d9fb9736097b07b0d2116fc9c6548ece74fcc9ed44e48c44bbcb34e05ec9f5b8da7056e34c5d36915d1f79024fa5171141744930b4bfa2640fcfd6e593fb961f68efad768dfb057604a6104544756818226df3baba724033bd3f86b3731d61b0b40140b64a030204a156ea708849eb1ea1386d0e50f7a27b1a2fe73c83f1719157e4a6954923cda208026f642d0b0e2385da7c6e0477f4c562e16541afea1cf94314a8e45c6743f531310a718b234c26a9514143b46fed2a76a51a7ffd7f6d016122ee504528f8fc4a80781bcf893737f3110265efae09add52c59eb03a8a293663f08733d01bee9c29adf093d0e6653bea888276bc406c5a6503c13c491479a7a3049179f872d4036e21c6e0b4030342fa0586db367c4d1b391fcba54dbfa2b472ad3c9828b0a50bf24fdb4749d2357fae91e4aa437159d7a240c294f6f5b1a906476998ba16f53fa9cf404e906656d8cf9f217b41f8469e5c77af0da8fe70b47415c66e4d4aad911ef43efb582e8ab10fdaa450d7ddf489b5a4666ca7500202714ccdda787205425842ed90a6bfeeb3cb2c0c14d8226d3ac15258c647b3adad14db452c89d8a7f322ed21bfffbeb5288032c707e0f21ce13eaae1a409ecb5662f05a2b6a7b73b2f1200855f7b80a10166ef667b0c8bd43e531dc57ba72bb83dd5f3f78a96048ed26753031517d161906c573601e08374f93a322c450d241102e321a469464770f64f48eda690bb8ca60b4d0cd210c504b36482fdd8168943e0c35f45b519aa27f7f58142ffe5df73132545b0742280bab6044d9ab9d82c716ecfd006a25af30caebd0b4de87e5e05ea76f41b8c225a304255fc878c4dc76ab5297f410543602d3cc8b20590ab682d3c8aac1864b13079946495412251a3228a114300a36f2122195dc8da3f4883319fe03e2c8466d14098d67208d34a4362b41a197e27b7d47bf16c6feca97a4abe11b313a52163ae8a120c96833e8d9ebb335009c1c13a41027bc0ff45a34b8496c4a9bfad4d723c67ed8478537b248ca71166cfa7c5e8d4da105720fcfe077e8977c90d5ad75e5673c361bbc2a2fff9eb735da16297e45561dfd708157ee8636370fa5eedc0b1bcad3475bd57ab69710df2eaf148f4790a8d806ef716a7d0eabe3dc2273da57fcb6185be523824713965cc2d93a7d84f8e2a956cbae13a6821d99031cd1eb6384e788233616ab798774d50361da50a39c264fcb687a001d27c9b9ade8277463808c22c8d2521ced81afb066dc6669c01584d7d41e0fc4ddc2b5393c8e1e2210d65bf6f25d2d92f96d39ce22fc375be4504c294cd5a193f8d51c64f9991e7f11db2cb1a1a06f6f7923dc6cfec224910ac71cd7c0888e118fe20565af157efd10801c14f931872a3c52560682e3793c0e266082f86397ccfcc09046c7814e80c5499048e7cc59f134d1040b2743a0ee7421b6a58f3896b518f3ef8575bc2c226396aa8176ac38e1e0b6d5826d57fce28d5b94f42c52c776194ea3f0995c4052bf401e001892835eb1032f0b6acd863d3c8de7bcb2d032313c0145413377eef5c3259c8bc7d71ad5103d37ba74c5d9a9239afb9275df4de5946604b95267761a2ac88d37b87a93a537015b972c2acd37be7ab006bac30879cf10262a6f74e9308ec4dad0aeeadce4aef1de7997c26e7dfd92fa77e39f5cb3967370ca55ea9573953d565e6ef6ce377aef13b2bbf002e79b2c5c7e645ef7ce56f875b1127e011237ae7144b2f4d333b96d0e0d23b3385ba4ef08d3561eb5145effc45a3048f392e307adcd03b676131c22b451b8ea699ded9ca65b212f83a783a783a783a3a5a7468fcd6e1faad33e3b78e8e8e0ede08da00b11aa11c9b72466f1d2b2ac6aa701489d1b6a6b7ce3205377e5059316685ca4b6f1d6606362d1628e278bc68a2b7ce57076ba88858020407dc9dde3acd0d6d34448cdd200b3ba1b78e73ed32ad057ece33e799f3ccc9f992939393939393137699c2029f2846142312c9a4bf89555b442291889792b84c2989c0f677fbf7d8aa4daddad4aa6ddbd60d43a55c2957db52f5adbf5b19bfdbadc7317eb7cfa51637caf0908091f2a7770ba20c101155b4801cf9a2775b1508e4ab8d8e89da9dde6d332ec51a352f826411f9a2776be5325909fc21de106f88371c0e876e180af7eda1dc631f2a875bbf87307e0f5ffc1e829db953f35a92814bd37b6815224decca96892c48a2e83d5c0eb9991883060813237f7a0fc754296534c78c9440a3f710c5ba03c2268f051618bd87415a5e2fbc38a350fdd07b487699c8021fe70f3771f41e37717070ec70f21e3b8e1bea6e38728f1d874acdcf6f9c2aaddf385b59bf715cfcc67946c1f8f2248d1798df0abd71ac8e445099e993bb818489de385f84cc283342ee041817bd7198cb216bc25ced6581d31be72b014276803943c349df98de38cd0dfc41c9915622cadf9ede38ce1b97e946e0df74dd74dddcb8f0f97d7383f5fbe6e6e6e6e626eb9d383182c519b0207adf301f6fbda8fb11e3cbc9a6f70d567199b08ac017fe2d857b78d9f7d8853e727e0bab5afc160a8542bcc77a4d2f66ecc85240b933d35bb862cf8c2d506fee050bbd855f5b82805b023ff8a717d40beaf905edf21e7bf06f07e5cc583316d0c93a59a7df6367e5362bf780352d1a6323c8aa28d13bf8e5686d32b4aa7c9960a17790b9fc1d140b167f0783469efd63edc202c35640b175af7e8f9d2fc7981728d8aad4d09bb502c15d8db2b32d5758fef466974a5c7cb900b3f2922589de2cf345901d49d65c185912446ff66b0645dec89401db6282466fb6b94110401a65ae048e20a337eb64f19b7daef8cdaaf8cd6e3dfecd563d7656899fb0eff5efb1afcaaaabdfeb568adf2b8adfebf3b1af6feb6ab7e6ed556fddb383b1460811b4a5de2b93865913cc951c42c2f45e979f34d186ab4dd3ed8916bd57e699e598963432828ce9bd7e4500b02ccb8d13cd2a707aafcd3628d29a68b69861f45e9d8fb52e13aa15f8d8b7fa876ea5477c5badc3f9ad566d89a9cfc7aebea52a5d0a759d2a1e092e5398c0f404295fca97a676790f8556a57937bfd313bfd32db1f4a943ed2e490b2836cadce99d5abd881e6d26a298ad25e9a177ba4c62c0b5c0c7588fcf0fdb3d5407f808f58de5300462b84ca86f1470a37b61d4dfb8caea37dec2267e63302dcaccb169eb0146a5372e92e5448a355d41b4f4c6cbf700c7b797e2ad048a347ae3e6e3112444d8a0ab52c24b6fec7c8c6770a5d6cb84ba53963e2a342c44c4b0e83b16488aa8d1c1e6a7c3c0013951c6064895dee857028c2cb590a515492306ef3061a446959736217aa3ce67b28655e56a065c5f97de68536fd42ef512bfd1278947ab7ea35b1ffc8d569179ec32b81d846907184ad517fb013094633ce209158152d5c0c80a2a39bbac2b3c111a2b876c694ad982c28c16bdf3df6759173360726b3ece6060089c99738c14392c3a2a854ac014316b28f6c0dc35d1180ddc082537baf6c8e8699e21768f3a8f908c212b3f95e1e17ad49ff8f2e6b17ad425b8e87bd4a7724ce1c8bb5857ec7ad48b5b43c5ad471d4a0ddb840fcdd2b39e434cb251757917958f3a86193b7b8f3a061979efd03dea99cb8edaa39eb7e4bd23f6a867bf1dae473d9fc97bc7ea45de99af44def9f9a813b58d3dea444df2cecc475dca46be7ad4a56ae4ade3a793f7a84fd5e5adf3f6a8eb38759c8f7a541994fac62386a1841e74c01e750f25f2d6d97ad4a74c90c83be7f9a8bbdbd8a3ee6d79e7301f7509cf9cab475dc292bc897e50f21e750b4ff226be3dea18bef226361f6d5b71447557555555db54b07916c4b34e24265954a9fca0b7c464909854a37a8ce44d643eea165810af1e750b2bf26efd1e75e792f7a8b7742ddda31ed5f584cab9f6aae37058a2f6a87360cbbb157bd48d692dd7a36e44cbbbb57ad42118e97bd42110c97b88f7a85bc8e1f6a85bc091f7b039ec4292f770f9a8bfd9dfa3fe6579e3e83dea1a62c83dea1ab6f2c6713eea503c70c01e75a8afbc71b61e75e31e4ed5a37ee377e3f7a807e1509db48db1f0aadf089138f21e75e48dbc6fde1e75a9b2bc6f9a8f3a8f91bc6f988ffa14919bab477d8a2c6fa1dfa3de9495f7a83761e52d7c7bd48d81658fbab14ddec2af475df310663deafa2b6fa1f2516fda11dc7bd49b74e41da47bd48f5f79079d8f7a5392bc83cb479d08759e31798f3a4f98bcd9b747bdc396bcd9e6a32e0585ed7ad4a59ee4cd2e1f7556c92a1ff5a835b549a9548e685fed79150dded35df22a14a5deab50d2ec78d585c4a4ea6341c9dea36e2149de2bdda36eec527bd48d39f25ec568e4bd6e3dea1b5059ab1ef50de8f256f9ec1ef5292a79abcf477dca4e1d7bd4a7aae4ad321f750da85e3deafa2fefd4ef516702827a843579a7cf47bde895772af6a82fbda55c8ffa1294bc53ab479dc9aeef5167aacb471279aba81fab329196bf479d284bdea8dea3ae9f728fba663bf3eb8a2a7f5d1d89a1b052a9542ef5ea4a4dab0b53a818703dc1eaf18405972c7a65c3e62dc75c123a135ef4cebf367936e9590f12932c5484bb2023bc28955a75e185ba5a7596985489c9354a2c85e211e311830acc9b47ec51df3ccf479de7899f56479dc7cdc98fafa15f5de511e369f2c83c6af25651e7f1cb45be6bf7a817c564c04f1d99ba521394b838a45fefd39deb9154d3a847b6c85b7de4f2ba29bf47f9b7420d30a0298c1568c831c837be542fc54be9d2b7b445c2f9a82df2cbda2297f8b02dd249b0455e699152f66e5a0b4ae4dc9758d3f97cb31ab6c8326d8bdc8b22b6c829392d128c4e8b64935b64959d16e9f780bfbebd3cbba0628bf4c2d322a97000efe13efc87abaed49e1699e609a1459e89d022d3f624b44839f4deecf8b4c8b8092dd2cef97ca3c3d363feb4c8284de7f38d0e6f0ba845921906b548409f2ca4d022e9845a2497e71b1d9e1e1ffa656c917820e0535a2d9fde22d78e2d526fa8453279abd0229bb4723d764179c83d648bccb3d0229fdb917b4a7d4e7f442df26e8bf925d674fa15b5483323b87df7af2acbcda8456a396a9175482db2ed2da945b265a14f761f23576a916d965bcc2fb126df528b44e3175ae41f538b5cd3d422b708853ecfdfaa1b861619460f8feecd33b448351a5a2416a71609c5032ba51f9fde8ddad02203f930f6c3185b61bcf5a9ff3cb5c8be29ace23c6c87e5b09b5a2becc93e502db2cb09fc9456cbadb7a816998503a51f9f1e5e9351541387166905ef3bb448373f00dacaa129eab74faa45f21dc07d38d522c584f0c9429fec3e1e5ae493283cba37a3e18716a99637f6942f0b7d729a62a6046e0c2f72a82e33f60994e5d4f1d0565f55551fa13699fded2940ef1246dfb0ac4db6b4fc7a14be8c1fa27476609f618eee4d0e1009871a6f69c15f3f3d06ab967fd1aa52fc50056cf2e9315551b42a137fd14600fe700574f2e9b1bdf9e25b9babbf6f6db47ec80252f9f438c4c2c3da0b02e67d7ad4c16a62b90901cd7c7acc5858374fb7119f1e874f1ca7da8a4f8f3a5fa188b359d686c67360a2cdd6ebd3630e1d1f7148f39953f6e9315b31dd3e3d0e77d046b0fd451b51f6c32c3666e539dcc85b15db69c3e5d32371f9b6dc2b7e81b53103012e6f15fde241995d24bec2326ff5873ded8a4f8fc56573a906618b8bf9e931e78b4a86117e2c954b2e54c2d8a7c71ee2af422728f4fe3a4171e6873ecbac2707194b2b372119790b873f6ddca7c794c593451e90944f8f41165fcda0963da24a6c84ad7c7ac47910732885963dba40065d1e8494a150bbc28fc5d2d8b2c7137c40e633e8f179cb1e413082b340352ff442efd8b2470f38a0a4aa5095b78ad796f8f4287ccbabb0624573851ab24db55658adb0a05441a7828fa8658f1c28bd8486452d7b5c0036c2d8956120a818b5ec710007508ebd92dc7d1eb5427e55fa3d52cb1e4360238c9d4af941c430296aaaea39ccc85b18a5b41ed957e1f61fe0172eb5ecb1c9e9c55760d1f4c30b353e3d06558ca97032b5ecd148c9ebd323cf83b0cb5b1d36355554a9e0c270f6e9b19881aa055d0b3ea10647d63d08b9bc85efa4653d02a92e7c9c678ff70d4dd9df37346a3fdc40d5f7e971bddaf3539f5af6e8137406c66ea947de42f6987ba8d47c7afc79a1bfa8b64f8fc2b1372187b84f8fc1ab2be6ab431f7468d3e3cdb3c7db6406925f8fe9e7fd502acca747b5ef4a39d592f9f4187cf698c2eed5a10ff0d043cba289f0fb0a23f2167eb87961106d44915f8febabc77bd666caa747f625b00d33c4e978081cde5b824316071879ab6900503618554b7dd1d8b85969230d7d7fe7e10af4005606688db81d7e9af5598f400f5865a0ce30a257b40516a0985e8fea0c235a789729be1e1dfa200db63a5d842d87310e342aace010a31572c161884e5b64e6ad66f5aac452d300078abe78c3e5c095b75a6c85b62040a970b5e4a36844425be144168afba014ca9a40a5a88c02083863cb412b6fe167d092b7f02b28f3167ed1072a640b4148dec2e7b045c4aee85c9817117a886629d1a66d2c097ca2d963d3988ed24206981eaaed7a44b5c64e64e915bd2caac58c8a4bb3470b5c7a58d456a0ca5b7d1051f2167e0639a4f6a6503240aff052f8d034c04188e895070a144d032216bd0e5dbcc1439bbc85cfe1c5527b532834147eff41fa6117da0a29f216fe509bbcd507312583a8924143cb01c45bdec2bf291410eaf8cd4a17a6c631d6f0e901a14301c0792bf4919516a6502bebc77b14c055be8fd7e3d5972880f455a856692eaa15e2cb5bf820e2f216fe5060deeadf14eabaa5c5e1e9e19cbe9e5129fc108278688bccf2167ed1917cf3ead09ec1a7432d91141f1fe39d9b7b84557555d55555d3344d2fd4c54ae90c9f2c34c21dd2955d57765d5555555114458fe8df140abd47a8dfec4c78d4b70ffe4bf43406bef8c8d94f1195c2ca160bd1b9185f7c445174156223badfeda7970f67154d9943ec6178ffe75ee39098e234250a000d40ea2a7a8df0509b53a862541d4ad3af4fd3db0175555585298aabf2abaffef00e758c52544dd37cf6b7ccd848455140617ac34ab0fe8e7b05489552afa85f85a17d82af30dc407f86101840347d60f270616a494aa9431207a4a82328a3a7a20d8ebd032a45e4e4d83f84182bf3cbd8db66d906fa8faab0cd3d3e418e34526a728a9aca8021a718e147688808e94286a70eea87c0f0c1c39454070e51504f1b9c9ea2a650a90c1fb05f625e32762298d887007154856deef10972a4915293531486a69c62841fa12122a40b199e72407cf0d034c52475a1c31207a5a82428a4a7a30d464e451a1c7b06548a2883637f8a42a5304c717569c9d875985d203e7838aac236f7f80439d248a9c9a98929a718e147688808e94286d5c31453070e51504f1b9c3464b8d0e4844a35452db7fa32f69cb5e5614aeaa80adbdce313e44823a526a60b39c5083f424344481776a43a70b810b504a5f494b401c9e948835186220c8e1d0995226a72ec179a502926a7c78e565d99c9d88b5657521d381c55619b7b7c821c69a4746129a718e147688808091f590e514b4f1b9c3464c0d0c4849f90179a1ebb0bb051aa6c93b1f3c800557288823aaac236f7f80439d2684929a718e1476888a807ea698392539206a40c47188c9a8a981cfb102a4574c1b113a152169646808dd20fb0510ae1041f403d6d38aac236f7f80439522929a718e1476828d8e26370835352060c4d4c17841c89dd0310f480c9d8237000041b9c341c55619b7b7c823c0929a718e1474882860c18909a8e988c2e142d39f61f548a48c9b10b39f6077450eccbd87d38e84043060c4755d8e61e9f20a4a39c62841f7c1462683abab0a414c12708fb00161026639f7080056068623aaac236f7f81c19e51423e0b4f8f8c37461c948a928c9b1177b22f8a05247418f7d0a006b3276a0100060bab07454856dee312aca29de2c291521e5e41e54caa829ea4bc61ee414b5a4947454856d2e22cac1470a49488e5d88834a111939f69c8c4a158da0e7b123957ace64ec42464a4948474755d812e13cb1c5471cbfa8d49163c7a894910b5b548ac8c72128337663901f19151d55e1459936fb5ee4d859548ac8b10b51290b3dc5bc8cfd987b8a8e1765c24e74c42813760b471565c243437ef113d2b1aba89405c743b8674cc678c8c211464e95c59d9c0ac7a1e3d18d47a1238563d011e8f873dc137c5297907a842384e3be7b9f7acfd1798ec5e346ab367af5a9e7d4758e1be5fad4738e1bedfad489c78d7e7deaed71a36368d95f61ea3e4d03f0c0054bf40b43a93ae3dc0ced28e7be6f74c1a17df52e1f3bb451a5d546b7ae3ab45131b4f9a8d27378910170cb414a1939a4aabee2a8a6115c35742c2d9b6af28f01000035bcba354d9e7f677ae87dd5ac769401cb528365c70dbdafdad28b5697162f55d088e87dd5981c2079db4262ef6e6f4befabf63597369796f6fba6d1a5d1a5d1a5a5a56db0b797b68193f6f74de3f1fba67dfdbe693b7edfb4a22c3034e8da68e540a1f74d2300992e6e5b6c646ceef4be6914b6c288fd5595115345ef9be6010a297a6cd2ac6192d0fba63dc182030c95091d6df4be697f5ec064a4d9f5c950ea7dd3c2d0c2d0d07e5f343134313431343434ada686a601a95c341dbf2f9ad7ef8bd6f5fba23d9357e89ec0dd00b47bea7dd1acfc7ea420d3b6c5c644ef8bb61c7ac362e64a58913c3dbd2f1a73a9881917e58b1b48fcf4be685f28b081e44a859f8a244ebd2f5a738c15bd1844bcb014d1fba2ed9038db217176f6fb9eed589ded589ded58dd33bbc767ef86a176b876b8ce1e30ef9ee5f87dcf70fcbe67377edfb3dfd311658f849b1f9adef7cc00564d4a307932468896def70c08151bb618388290e97dcf98543d4ceca92d09b3a2f73dfb4a53c4cb0f6e6deb4def7b96a3869725952f459e38f4be67612e53980f7cecfc7d9d7ce911dffb3df61080669cccdfd769e3f775d6f87d9d214238f19c38dd90545d5169e97d9d5626f6b4945535b2d0f4bece347f56cd234400d9d6303d380366a2c616b7b92ebdaff3cb67eb19a306b30719277a5f679308165a5e138c0f31bdaf3383c82040fc06914164101904081020dc3054ce7620e41e3b88112068fc06c1f51b0488670d50cc402b32438415135f7a83b0b203abdb42e7e3cca93788250d32a6159d972d737a83a8f282469d980e269fde20963a9e5ca9f051f72389de209644d1eaf2b163adc611bd41641a1f328d0f1f7e7fc8cc0f99f921333f7cf8f0616cecc387153abf3fccf8fd41c6ef0f317e7f784ea0c618b44013cb6699de1fe890ec3841f7a4ca050abd3f2ca514510bab62b7bcd2fb0333ce69a2aeb962059cde1fbe9ca418d3e2c81617bd3f345f3083c9e5c894bb1a61f4fea073c683ce190fdb838e9f071d3f0f3a7e1e3c78f0e086a1f255bef2e0a10d0d0f5bbf3dc0f8ede1c56f0fcf1e30ccba946c59c2a54c6f0f56cf38b232bc2b4f5ee8ed010139f6fa8ecc51fd91e9ed01cb5759d80a2b7b56e0f4f63002af0d983d1d5deef6f4f670b960a97142c572c691217a7b7032e5646aeaf7d4dbd4dbd4dbd4d4d4545ede94dc639f6ae33585b57e4fe1acdf5353cf5d848e448e32384674e93d6545a24aeb2c071a3256f49e5a6e5093e5c50989156070e83dc5cc61468514b91d702af49efae2a24163ad49163b127a4f35a7e485613987f8a5d17b4ac74c4ac74c6a4be938a5b694df639752baf82d85f55baac56f29292929bc2da527b577c5485b5e1c0b1f687a4badb10d218347c6452e4c6fa9250f2d5f4f7c9079b1a5b7949831bc147132628cc0d35beaab063702a9c04023a6aa2a4d6fa9a61d092a3241e45ae4e92da5a3d54147ab4387df1d74b63ae86c75d0d9ead0c1ae43de63efe086a17474c03ac83df60e651d96bf3bb0f8dd61c5ef0e549a7409516322ad8612bd3b58c150aad0ab2207c44fef0ecbb8327b6a5647d698d1bb03734c951e54d228b9daa27787af164e8efc782ef1fad3bb43d3868e357c69b2eeccf4eee0d4a1e2a043c581c36f0e3a551c74aa3870701bfee6a0e23787abdf1cc43870e0c041cf4895135678259c7ce9cdc1ca4e0bdb1e999c93287a73a0bac31136232e0b5d11bd39cc5d5173e6069534bd397ce58489ca091315f53b2a872f6aef73f8a2fa1e7b549b295138c5ef288ce277143ef13b2a2a2a0a2f4aafc88cb32134dec49c7a4759519599d155858b1033bda3829450916665a68aad4cef28bdbcab2d5bccaec234d13beaebce4b9018264618b1d33baac977c60998998d659dde51396b50396b5050bfa1729e50394fa89c27141414941b86cab1cbb183826a6305caea379489df50257e433d817071d19d28a202506f28144d48c839adecdae80d75fb86b8e89aa17c6b43a53714d0893aab3226b0006ad11bcac918122d32469c6952426fa8bd232faaeef284a008d31b2a87c6530e8da7a7df4f39cca71ce6530ef3e9e9e9696c3fc93df627257ec2be9f48fc7eaafafd34e2f7d3532daccfa9034a153fbd9fcab6fcbac838e34ccce9fdc462ac8a188f29294698d1fb89d917a806055c0c28617a3f7df9609324cb18112ac8f47e7a22f7f52c2377b68686de4f67369cd9b0e1f706bf0d7e1bfc366cd8b0c10d43e55ce55c6d907bec1bda98d95025e2f7862daadf1bc45ef97bc3138996ba381c32d27cd17b435712295b682eb2f481d17bc31249a44d4b123f205062e8bd61abea6f0c0bbe2c47f4def08506c6913c2a6e7543f4ded0c49b91e60460913d167a6f203a71223a7172faed447c7322be3911df9c9c9c9cf2f29ce41ebb1309a7c0df4e6d7e3b01fe767a5e25e942c50c8a2c36bd9dac9c655a927811a1c64c6f27342cd2f0f98db0da91a6b75305f0e0b0d096805e777a3b55d191c5a38b5f1734817a3b356370b6a34c8b08970a127a3b916920d3a0e1b786a686a686a6060d2b34fcfdd6c0e6b78635bf3568d0a0018f026d5934ce8c31d708d15b8395945fdb90bd2e6b6d70e8ad41af6959e559a5d9b8a1b70621582ca0a0b081234917bd3520e02c0a590b17656c70e9ada10640b0687cd108d392e68bde1a883432106964d81988cc0c4466869dc1efb167503233a8f99dc1ef778634bf333c1f7b86b70c1932e411e35e849961e39976a7778634b63436dec8bc40e3d43b0300cabcccf485d912d3a177061363d05858d9f8e2c24aef0c5f506268cde9205bd33b43132d6c4513e797b8167a6768cf6068cf60c0f01b43eb87a1f5c3d0fa61c08001831b86225e11af3060f88101cd6f0c677e63e8fb8da10525f4d0ac5152997de98de10eee05141b4368c8d01bc3720278cf3eb62a38bf1f7a63609ac9c2f6e32ecc1b9bde18be1e90c24dad84891b68c2e88da119011d566d5662ecf061466f0ced5c533bd7d4f4bba9a56b6a6a6ada4d7a7b8fbd292fafa969ace7779399df4d657e3791f9dd54002f5fb0588961a54553efa63d2655606065f568c1d4bb6979d5b490d262cb4b4d5710bd9b9850c0c424015bc1438bde4d5f6757702c4953c3e744efa626142c28e658709961e9ddd48631b5614c4cbf995a31a6568ca9156362626272c350ad5aabc6c4f464e2fbcd34e6379398df4c47556b2852dc617d6de9cd04854995ad1f3aec5a98d09b69f9588cb9b7e42cc8113abd99987b4bb2136e4eae70d19be9cb0d88df8a13735daee8cd74e16e9081c3e36b61c64a6fa696c48596c4850bbf2fb456175aab0badd5850b172eb861a896abe5ba70c1ed4298df17f67e5f00f3fbc273865e893068496894d0fb425a19b03546a8d09de97d61b9249202cb95671710bd2fa86012b825c91619214dbd2f7cb125b14332e6695743ef0b3d9a4ed66c91b3a23ba3f7052b4b5696967e2fe12de12de12d2d2d2df5f52d2dc52d7df9bde4e5f792deef2536195c4162a00993a6f7929502c2c05cd92ad3626d4defa51a90d0d371a5756359824def2500dc7129c3a5075b170bbd97b088b88de0a3638236a6f7d2598d324aeee69a8ce9bd44a644a6a4f45ba9a9d4546a2a292929b9b929294951eaf25b89cb6fa52dbf952c881de98321a444569ade4a6d26e2acbea0404ba1b7d2128d8799aab5bb1c3ff456628a65b1c04203068ec799de4a5f2a2823654b89305d9e51f4566a22e1c1832eae8615187a2b0d55240d552425fd4e1a2e9386cba4e132292929c90d430dbb865d49495692f27e2769f99d94f43c53e4cb9f1519185a7a275931a1d2412347608d3cbd93c2a039f204475693152df44e625650421687e249e40999de495f315e00b98322c6a977528c3c1a4f36235e6e6cd13b690bd21624a4df487a487a487a484848487f7f48485dd8df48597e2361f98d84f71be989064b18961526d2d4e98d6475820617176e6940aae88db44cdb113824088e222cf4469a11e3c591b122645a80e98df4e57f7e6adaf485f1b8a1375273cdea8b8a29229e64f446323b323b3afa7de43c721e398f8e8e8ee4e48e8ec21c5df97d74f7fbc8caefa367d7981936276b549cd0fba8ad840d1445d27801dad0fb68b9f57c7341c6e71746ef230f6382644dcc9236617a1f95a0ae455b0bbe1b65b6e87df4030d9709b824725e7a1fe16819e1681919fd36c2d932c2d932c2d9323232ca7bec466060728fdd4849c6c8eeb75195df4675bf8d3668a3226b424439c58ade467e34b48494218b71a7b7918d162e74acb95131d3db68cc2acd189f98320c85de465fc7bf1b2aaca4010e59d3dba8d9c5c688b3b7224166e86d7473a6e8e64c51d1efa21bbf22bf2f2ada457a7b8fbdc80d43e154e15415159d05aa29a2f2bb88ee77d194df453f6edcc0e2d5c5e4cb0abd8bac7820892ba2832d860c267a172d7db848b88929d3d70688de45cc1570d56d4df90165c618bd8bbef0b6a29400eb5b2146efa2e6e3265b39ae7eacd5a0d2bbc879e384e8c60911d16fa29b37a29b37a29b3722222222370c759377934744a4a42292f29b68ee3791dc6fa20c4188bc209306cd0c0cbd899a2c39c3b291f5c4b2d39b888b890d20695c4cde00f5262a4277420c11314e173ff426faaa408c16765ba428cfc0f4266a965873638c99bc2f30f42622b34066c1c26f0b4d0b4d0b4d0b7e8fdd42090b71bf2d44f96d01eeb7050b162ce019b15bee20b2a412446f0b484698c96a5e5179a2b785a5918c4910b1225190acd1db02f38a122661d8846901d1db828f3546b2e4784ed93ba1b78504d4c51519a337038a99de166e68206f682091bf91374ce40d1379c344fa3d76a47205f2ed3712ca6fe493df4824128977efa85ccc48e2440d1abd9156284e80cdf883e1c4a237b2c6da902a5db88ca9a9d21be904cd12cf05191962717a23bfc8b86d055619b165426f2409ced694411126eb6c4b6fa4f04c05e1990a157e5710fa5510fa5510fa55a850a1821b86bab9bab9aa5041a955c1c9ef0a6ebf2bb4fdaef0244127e5eccc6f19a677052b16786474ecf0925142ef0acb1b4abf2560a06c21a37705d4cdc7db98abad3b34bd2b68317b40816bd2ecdad2bb4213053ff4465481c9cd00a27705a19321a193a1a1df436f436f436f434343437979434335869afc1e62f27be8f97b284a19ac228130bad6b8f41eb2aa0199561bad244dc0048ad07b6889e4d763c78d3aaf336b7a0f31bbd4d5b5d07a8a28d37be86b2bc6dc8a2a304e33bd87b2e0ed588a1803a48a84de4342afa3d0eb78fc7d147e1d855f47e1d7f1783cba61286199b0ec78f43a2ef97d64fb7d5cfb7d2c916287599891194afef43e5a5d333458c0b5b5e8ab1144efe3528493a7141557754dbd8f21aedae0845491a372a7f751eec489b635262c7e30f53e5e2928ca6411b30282a6d4fb1804f420a0fb6f172a5da874a1d2dddd0d4309b38459eeca3057fbed69bf1dedb7af51a364d2c449978d337abb0fb02eaa1358b2c0a0a2b72f8deaee6a1c8951e5058cdece0c8115d713167746bee0e9ed5f11d0b069c2e4a92402a7b7f3fdedc0aa119724ca9bde1e9c3306e78cc6dfc6209d3148670cd2198d76c6bcc76e74c350c13d7c84fa9e51eeb11bc78c67bf8dcedf4625bf8d4f199460e39117c4ce871abd8d5641c6d0399172c48a8bdec6255497138bc58814752ff436d2e004132576737845d8e86d5c63f3c2871f561992137a1b9b674c196941a034afe86d749a09990909fd16720a39859c427e8f5d4859262424242424248417e44121c8830285df148260f808f54d61ef836014fa1e3b05a51c85aa2d0a142850c0a3a017541114541114f43b28b80c0a2e8382cb20bfc71ea4bc0baa4af23b2828282808af99f64604881a9a2ebd83982dc6988d68e1a24d8dde415f6780ce0001fd06f203f203f203f27bec404a2e40555b624040404078ac931fd6c9cfcfef1ff6ed877dfb61df7e7e7e7edc30149bc7e6fdfc28fd7ecc7eff94fdfe41f2fbc7035964a80d99f1c2c918bd7faccc90a9e9437215634cef9fbc39195fb84859cb7143ef1fa601fc02abc448cb82c688de3f5f1c404b4395628b8cb51b7aff9811b92293858facd943ef1fb209641326fc9ed09cd09cd09ce0f7d8275029271cf93dc1c8ef09cddf13264c98807745c6a54c13b3282af0f49ee0054917345df0eac25ce83d61c9854f8c0f154f2434f49ec04c12e38a98932a369e0cd17bc2979429629e3ae0a898d17bc205bc6000a9cbf217a386de1358153eac0a1f9fdf3eecd2875dfab04b1f1f1f1f370cc57675f9c83d769f2a9f22bf7d88fcf621fbedf344d36382d702cc8a0bbd7db4b488e2428816ab352abd7d961cb4b2a81c9151a60512bd7d980da0a38b62a22ac81e1abd7d0e60462bcdd38b9595357afb14a985990b444227234b6f9f1550c20a2841c26f09ac5282df6397a01cfb2d61c86f09427e4b90204102de96a02761efca8832bb3537d6b0e92d21d7bd408147a707064f6f0946c4e0dd88ab61668d96de1248c0c50b498b355cb4d8e92de1cfa8189357656f0497de129e3cc5d8b07d4103466f09eb5c84752e4284df1156ba082b5d84952e42840811dc30d4bab7ee4588f0224290df11c47e4700f23bc233839ad58e305724c28cd03b82550d6c98b5b991d1c0729144ef084b225b7d3d6ea018ebd33b02f371190a13724ed49208d13bc257d109341766784459a37784665ae012269c963f40bd23ac6110d63008107e4358c520ac621056310810204050538320f7d821d480f0e33784b0df10c07e4378dec0295edad48ce838a3466f0856c1355b9a58c09e00b6d11b828b1b386af8705184f9a637041888e09125c9953c306af486f095630620d5173eb018647a43683ee6d1a6c7922f49942cf486b06af5ac5a3d3dbf7bd6ad9e75ab67ddeae9f1e2f9dde3e3774f8fdf3d3c7ef7f4f4f4e091103347e2b91caba1778f150bca9454ce32594c6cd1bb67a98165991f70814b8438f5ee615a2952c6844c1637347af7a87f32cefce85371d644ef1e09f85833dbbb7a01844eef1e350c8f1a8687e7378fcac7a3f2f1a87c3c3c763c798fd7aab58a87a7c9f3f59b67c76f1e1dbf79c28450cd7921f382c2466f1e2b193499e255c7e4cd4410bd799667aab072949dbd69d5e9cdc31481160a1250a67471dad09be76b4bc496195f4cccb5d09ba7e9c6a38d4990bce717bd79d4b5a2ba562cfe2eaacfa2fa2caacf62b158b4b32b16cf8a5ebf8b5dbf8bc56797135f589630f55244d1bb689554c20bd6522d0d1086dec5e5882f434e14b951b646ef2213034a6695bdaf2fb1147a17bfd0b4f0c861f6638d4aef221b98911f3dc25481a9d2bba8d2d85169ececfcde51993b2a734765eeececec8c8dedc83df69db89d1cbf7770fcde095c5965cabf2146a3b1f5d94e197e4fbdbbb5f9b57bcf9be213fc0a94f72b81efee8337f7ee8ee5ebdd8d9ab038df3d2acb8b770f31802ccf775f008b77e7003fdd332d75efee0108f0d33dcbf3f1ee27d822e2ddd118c4a4fb05d37480881413cf4029537618a141658609163e26579e57903c92a35bc42452d35d9b6f72140631d9a47497f64a8ebe2026959aee4868651193c6e35f0832e52f38ea8298bce043c4b32c9a6759f682b3ac8fe6b339ec1996659958364cebd91cb68f4572966d6259b111cfb6ac1936c959568965839c3d1b8135c3b28eab5867fd7640c5952e3b2e1759579a55a285cf598309644eef0c234857922a33cca6e8ab1b27a07ca9a1daa2f77d2ae08893c5171a1e50aaf4be7e9aef4697be36bd205df44695620d5002611b11430ed0076b02ae8c951a5f75ac8308527a771273f1ee71efee83f5ee6ee4dee48e621193ce9259cb18ddc7e86ef41046171ac558bcd1d116c4a4116ff754f91d84e537f2959494c2c0bcd28f25af040447d88f577274494c2aad49657e477df021024b4f4a941a3dbae4eefe7aa080f29794bcc104b04adc1122584949643e298cc72709b1b09c114365e26c854e0acbf1498eb2202693da6f72b5094ced9bfc7ef926475710934d12909090dc07c93dee915c88e483ed911c55414c2231f940f14c8e5e11934c177a5cf90b8ea620262fa02026d9ad253222bfe4e8096272498892177221f71112124a722121216b5e8828c42724f4424a42427e02212121cf320a0939fa2524344608c98584582121170ac9608d891625aa7c0521137a92a6468bba2051b4848452ec4003c67955830f89901c9c8a277d489c4f21675996655996655996655996655996655947ad884916690c12121212121292a326884924a3d168341a8d46a3d168341a8d46474b1093461d2ce6b815b8a626c71a250d3c2e44da7688407344eb86b28a952a3f27ee61debd8a6a8d133540b43c38edee280962d29584b8bd92a355c4a492f02c489b4f72740431992414414c0a41b9f2aabae7ae3a52c9290a4adeeffb96e4aa77a0aa2a94be576f54f5ab4a7553d5b7ac57b30a4635baeab8ea2aebd5b7ae577b54302a92ab8ecb54b557dd5e283c6164cc136615e71abdefb3c8c6cc081a0e113df0f4be4ee5f56b8aa17caa02c47a5499f0f202f0854ae6cc061a1f3170586924474242424242722192fb2021394a454c2219f117a3d1e833b8ac785c395333fa092d27745f2898a4301a8d46a3d168343aaa24268d483565f982ac8760dd039665bd0642422f242424242424242424e4218484849c06c4a4505252525292cf80984c72d5ddddddddabbc3b14b877970131e9312026d529575f2c168b8e54c24fee456f9af2fc6284625eb1e81d14918ac5a2505652b1582c168d5e2c2a158bc562b1582c16e96abc922b390c884925a1d168341afd05c4a431e9ee93dc05c464925048484848c85b803465c623390b88492496655996655996f5151093acfb3df2ee1f1849e34782f9c22b8dea4500804fd2ae4881e22287565d751510936a0a88c9225efb477ee4c21c7ff4a4ca1f390a88c9a3ec66e58bbcc87d8a8a1c59e44d4ec07c518522bba222efa0c85854f404ca17b54558afa8a8c88b8a5c98bfa8a8e8c80b3053d2f4b822a6a8c4162348ac9420fba237aa7cb2e2dd55f71310932e2c168bc562b1587413109345a351c968341a9d2879a313e51bbd04c4a4916559966559966559966559966559d649404cb2ca274120daf25ec87ddc84bc509bd70bf90888492167311776d8e5f7f54bfa6372b1d5f1c590a2aaea90bf3544a8c2d48eb4d1fbea7d70238558dd0d16555b7a5f3e2e6d2bdab2da643c149a35223172e8a8d245ab6d56afba088849751393457374bfb383b7fcce8e23953094aa77dc093fdddf99cbf23b3b3b793b3b77c74f30a766a798c5f53b77470ad6eff0ecec08f98ea36e3b72bfe3a8dd9d836b6137e6ed0c0d8c1d59803cb79c64806bf48e565918c0366548ace97d9f7b4f04132538a238e1b2b3b3b3b323e5ea858484843c04c4a450b1e83ec5e29c992f3a0888c922cbb22ccbb22ccbfa078849368d6a4a9d7373afba509d8bf2aa7b8098543b404cee18c590f146ce0162d2486ba9e5b37b76647625fc64f4ec4d596bcbe761ce929d03fca47af60e30d4e5cb372fbfb8fb3ccc587276342b17e51c83c5e761c6cb45cf8eba65a1fca6542a49e88dd26d00eb0bdd12357269d4e8aca602cfac0eeb0e88def9339f0e266a48e09991d1fb3a37e0e7a50d9b36620275641560a1c225a73604065fae810ca7990f33544aaa30c96456b4418355a4459bdea85807ba82fc1842d67535978584e87e07bd10f285fc9a7921a61712f20c03c70bb90f8c332fe4bee5e4857c03c4a490515a2c168bc5e0178bee2ff8be58f4fbc2cb175d03c464b1a8a8c31715bd20fb22365fe41920268bd42a3b3bc39d2b3bbeb3b3b3ba99c55549a3652dc6ce98391269dc485099edececb8ef78881df780ef777676dc03627247e9471ef4ee5a65ef5acc77c70031e9eb8d1515826aa7aaea9daaaaaaaaaaaa4a67c30e480f6696a7ea609c5e549a48f6a854557dbecabaea2154f74099f5aaa34cd55127d705884975e877cf1bdd68f42ce68d7e83bcd12d404c1a7d54965d59ba67f3acfcbe7e107ea355768f763d5be537da7cd659966559bf2c8b80b2ba352e33e682406175b6e8bdb5f97df9c2d41b5d3e4b822b8c99164cb12e7aa35f9f012860c2b6ae88b468ea8d8ab958c3baf2590f51f5ac7b704289f5ec3dcbdad10131c93a2b404ce6fc44b8ee89888888bc89c8f9020692b1215d639a48090b2b270e2e7341aa88f47a3c5117ba67a33ceb14980031a93a07c4245194bf8528ceb7e01220262d209148472291c8218f1cd1f4ac4780986455d5afea102026d5071093c828b90a45bf83be0285af508189df5768e2f615aa7c0577003159c187a8fcd0d0d0d0500eb01ecde596b12b237a088f2c90c49312557ee89ddf7e88098a57d95ef50610932a0388c9a1a80b7fecd1e38fbe0062f24863ccaf2bddafab10ae11f62bcf1ab73a071e18d7d54f5083ccafb7cf6ab9e5eb6a63ee579c75caba3afab6fa5d1dc55bd1bc5fa5fc46fd7ecdbe3aae5af1d5afabe3ad1573fd8ac57e75dcc44f3bbe3a2e5bd57ec5cf1788a5b5e092a20d1c9b2672028ec13a53a60891fbbc7e2386c41531e3f292d35cd2ecf951fd3d997aa3cd03b8b511eb8332630716bd51bd5f9d2f0a9b1e6862b05ce88df2fd8a99bfe2af5f9d6559966559966559966559d615404cb24e1d3c07630d055c179899153b3c58b81c09a3eb6262c44e0f122633b2a475d91dd9d991fb9d9d658d355770ec1db193a277763c01c4e44e9ba6a6aa2a9aeaa4aa2a33c8abaaaae2287b15479b57550fd135e2551f409792577d0154af3a02e8da0be677d4672245c4dc4c1ca15393e33e671422cec8f6aab82831a2b38d2b9ffd00c4646ebf587461922fb6f9a21b80982c66afe17cf70210938ee18d34fedee80420268d42211a6e2fe4032026850480df769e82fb50a0e048250ade44c1a3b248f83df5142850f00e28640a14283805bf14ee13c553a8f1d9b3078098cc411ca5e9d7758502f82bdc8c5f3d494cae4e96ed59070031c90ab3aabe2979d5372026554d4c52e0fbf04173223ec89f980c8a53f2400ee43e40408e54c24fd981bc09c8a3e4b61e680a687520a01d202039320f040404e4681650110808c8090404e457c8178b1e82982cdea8aaaaaaaa2ac7e355557510c4a4ea21aecaeff8076272874595c18b1737f7eb1af7e457f7404caeb9cc679f222673a00c2f1c7048d4aaa23c2b97030d470c3e1b63bc341b65ccb32e454cb2de8198046afaf909fa1fe4ff2871f8edf43ffff3e33f2e64abfa1fcf3e6c63ffe3cea6e67fdc6849d9ff78d3d3ea7f3ceac7433ccffec7ef9adaff380762f2472dc9b73cdfc27ddbb6ad3761a88bd7f200fc76a97d6b9d03fc94bdf50ed4d66feb45f66d500ba5ddf1d6d1ac766dc5944a658a768dc8b739ed93d6d1670a25d4ada36dfb49b0e4984a2f3165ba1dd392f3a166481e1bbdb313963624d2808ded50d3fb3a21f098db7a969de8da6bb7b050e3e3860b294a70b435d811064646d591368081addfb65d5b127dd1a388c9a21044d055739afaf5aab909fdbe7236c6fceaeaeac2212a7ef5ccecfbd57dc87e75bfe1f7ab1b0d71fbd59bd4e07ef5a81cce5f3dc4f2d7b3b1b95f7d01645bbf3a1431b9d221ffcbefa8dfa9b1c7067882c595950b7db7d1efecec3cf91d1b5a7ec7852994929d0cac1a3eb478f1d23b434cfc8e3f11933b1f40fcee095afb8d44fbade4f4ead4ab6aafea20f2aa8ebe57770c797547dfab5f465efd62f32a8fb257fd7a9579d5371093aa53273bf91d95801f746bb2bace9cbcd03b9b008b189036714d7ae0d0dbe8f38c1b7a3976289330f56efaecd9edb39796cf41405830b901462f8a199dbde03ebb13319997fc6e9fbd77239f655de8e359cf2c5a9967d3943cabb6e2cfec9e750d4d1988c976828bb79fe01888c9093eeee3e3e3481f1f17fae4b3f771c1e2d50caf7a1331a9aeebbaaece444cae1788491fa59750c6e525f8123129a1f811da3e823b7e5a3d82232344f0a6087655ecb2686c29b3c2a7238479f3eada2106c898de59ee23f82d7bf555572226d59b2617bcc0d0b3b2b186a68a0a131855289830c04ce86df4eb8927614c72ac20c3c232291bf22bd4963731c0314168ace975f524246232421404330fc18f884908c29eef797e4f8f237b7abc0943a14ba5527942f7744df1e2b79555a6248aeec992d1d6220d89246465fa5ef91eef09fad5f85be957b8df5347bfaf9a19901f3326bfba4f121cbfba2731f3ab1bb1fdea4d4ab6fcea219c447e752362727daa7e77d4abea9217a277448ccc8a393fa6de4d185c982013e3f7ac3245a3d162c2d97576044beffbc6f6aa7b8e573d8499d7ab0188512666454b99858456cbc25ef5226252c52322267bec9e872bef79dc0231c923a3ee833a1f5cfba03b52a929e85133467cf08358ed3948a1843ae81ee4607086de07798269c1d683c19d60d0d12faeb90fa2601f440b3afac44f6e18ca83a8dc07e93e78c48e0415366435c8a468079c495137468894263c74d0830b586306450988c64633a8468c52ce0f4cb92248d6a6a5068db2b1327aa3621f7c9af1016444a0de0dbdd12697f28bae161d494c1691bffadd51bf7ad399d656056272bdce9d18bfe343c4e40e5a0f1935969c99c10ad33b7fdb9e7d8b0706cd90bbb1235d73ba9dd1e25b3f1293edcf67bf32bc7c762726b3f0098f0af4aa1a43cdab3296bc1ae3ee553712936a54111e5a7c3848a8f0c13a9fa5528249db921331f4aa341b63ee5917222659a7404c06f19caf63c5ec753c8898d4a923f339c2cf51f239393941cfc9b1737e0e4f4e921cd67372d61cbf3956c03e6727c72cc7d1650a25d4398e6ee1a7fb396a8edf1c17a6501a4d18ba332848ba94d13964fc4c3c7951b7a24eeffc3971678a1c09032317964346c598560d1c2f98e4f0d8e3cac1bc02cb9163e54c3330ac4c94bb9ca6df3d7671afaaaa67bbbf571d8898547d7ef7fc6ae577d0d1af2ec44fab671cbf9e55d1f2ab9a5ffd87985c9d6559d6599f404cb2153e58f7e483ee434c0625109339f7f9c43a114ff408c42471c60f87653f744fa1847a3874a5a6282a487e38c54107374fef877e022a657ed8f74324434797f849f5a1a35943ae1ffadd28f3872e4ca1ee1a38351e66866071e9a18747c88c715de968e2e99d9d432c4e44387132660d4eefebf743adbc2c2eb8c69a70e98d2a7ff8fcb67508c464ab4549092e34849cf0a2773ef22a90932752d2d2d4408245ab2e4ebcea3dc4a43ae18354707cd07988c9e09b92345f543472681d598dfcfaa5e2ccdf0b21279a7a9dc1e6572f1293eb13f259ba34cffa0e31c9666272887ee91093291ece91c7ede6b8faf012d3a13d804f6f1c252643a4373b1de279c346a87088e7898d50b7f025f38469e309d3d6f6fbb6fdf1f0e1a3bde7eb7bec0600b4ba6d6dcddfb74dcc000668c36bd34b231346c8df08165ff4be6d4c0b04011423a635860d1abd6fdbd75a93b5264d7edf26cf26cf26cf264d9a14c0ceae4901643429b225d6e4d9464791197d55e454e87d9b58fd8d81538145cec7159edeb7c9328c49181326bf2f13b1f448ef321163e2f7d809c06cabb69810f97d991080004cf0766431333332c40d4fefcba49927a6f657c30c092fbd2f13270f89270f89e7f3f77df2583d79ac9e3c564fbb67de631f801b86e2e1c247a8f370c93df6010082dd27d9effb1cfb7d9f437edfe7f3003daaead0a6cc8803a2f77d9a79a27786e28a9b11bdef33ce079e153c30cb2052f4be4f246829b09a6cf44c8cd0fb3ebf92e4b5019304cc8a157adfa7b2858e2a176244b459d3fb3e8b589614b12c59f2fb2ef97b9c878ff63e6f49df922502e8eb5b22002155427edf25624b9e6802abde766c91a1b78439802eb4146dfeac8c09a3f75df25524632b92b1b1fdbe6c4db6265b938d2defb107e0ed8d2d0080482e5b90df974decf76503f2fbb2fd64ad31430286450a2cbd2f1b9a081b5ccaba1cd173a2f7657372f93126cced860fbd2f1bd30048c87c8c65696919a3f765fb6a5ba1a5c744adcba9f765cb59e103cc47d599950cbd2f5b516bada8b5b6f6fbae6da5477c8fefda9adddabe6b7a7b8f3de986a18a5dc5aeb52460da5dfbf1fbae85fdbe6b60bfefda3398620a5c9a2f35d0cc591da0cf8a5a0e122f9420d1fbae2dd37479530e5161a644efbb8643879f9935cf30b3167adfb52f2053c0c05c39b5a0e97dd79a455850bcb070d1e6454befbbe60454035453fb7dd58a4ab5a252ada854f37bec00006c72d57cfcbe6a3d7e5f35b1681b940be153429670c9540f361ebc351c7b4213385a08e776e4a937b0500084c9f7512e746a1927818a14e190b48c7a060b2f303899a60e46988c6d1720b02d59e8a194f4669034308fa0c48446463345c82e95482a0db5a044889c32abd03463c84ba0471dc481088d4d4a8278ccfc74e89b2035c5c7c2150916d884118c612a840dbcd09e0db4f0a8c5a93c756783aaccd4646a231c1e973851783712940889b808831a8e351651d7a6ea2204880f1ea6a43a345dfc3d5d9489fd07182a2b6f211d861c394cdec21dabbc85fffc0ff0031120fdebe9dfa14d8357b1d1940b2229525f535df2568bc8768811c05a883e7a767cacbc85dfc4465f0b10a647d78f1ec31b00fdf5d157cb595b1e7ee93b1cc95b6874cb5bb8f77d790b513083df3478142a8811e9e502efa792e4ad62f8e36b214d623d7f8752b02ea14b37cd513b9cc95b95a2b3b02405eb8fc0e87f83bcbc855ca6b6e4ad6e40226fe1fa4c81790b8f2dd67e0708ed2fdbdf331da5007d79ab5951504f1b9c3c7898f220210204a91e9ee24ed6e99043f4c001bd9f53038cdebce5cc4051f73be7f0600bbcb9ca4f4a0ca78a3d55ea8e0e0f133bf6311ca2b8eb3f4073b1f543f7c7ca06d3344dd3344dd355180c06831e02abc160905d6db030a3c38e8b8ac689371c57b854a0e88726294e388902f723c9de9835a7d79429327c8801336b6a297df4180357c5e965e3eeca953672589c8d5b103562c818f7ec55fcc406dba8aca62b23b4cafffaee5e07f73a432483aaca0a57945d51145ce7ab37cf036cd40113534c8d719d699aa669fad40762caeb034f95290c3452141d321fdf5dda11d1022587755dd7354d879a30c6187be0628bfa344585d9474d4d0dc5290f2894c56f14a3cbad25119425f349eac6960d4e3e4383872b0c8ffdf6a8c8c40c75195d7de8fe72aa89483c4e201289d90500b8cea82623f7c16a580dab6135aca606802914596cad01c6290f26a6f7277a17d02b7c9f57373f006c2441eef9b614b4f0a684212ca9c7ecc8c1b020e533daf1fb06bf65e61b07266269116a033751266e32ef92918d99beb58008c299050b5dc80a28104c878a613ab1bbf44ac454e510aa61060b8e503d7ccaef9b00b08f72612363981718e37e13c53c40fac0532a859c48241233074e4e4e4e4e52499c860c29bc50e8c714bff088dea39b167c7af36915aa4bb866ef06d5715870559cb3de25d575f088fec54f9b85814a24c0ba8e05fdbaaeebbaae18638c31be4b53458cf00105fe46fd847e4a6cd4f482af0528df0f14b4ab8b0394c9a9e8f82668309f08fa04e951d3970b243c0006708005e0a71bbf9ef69bf85c57a3eb775fb85781dc1c89d748bdf1bb6302e1f186a8824fd79b167cead748f5bbbe1a83f553d5c5227408838607210d1faae46b35aa4c8fa4a2a04afc821e6c6427c6f3681a02555736281406d9554d2d9ca5cde2a7698a1a7520f10077da7eafe8d613dd0a40fb1f6cc07481926e6da2cbbf8195b7a82623d7f97da3f37a395377e81b7149be50a9e3746801514d46eef3862edfd0e51bba7c4397e8720181197514e32d176f07f98448a1d421243ec2fe94aaebfad8d1e3f0914e24d2895c9a43e22995385350b18b27e60153183c25baa39a30181d1d6fde0529943a14223dc2def46c5078e33bdf0885c29c8343373df263afd3cfe977fd823a447a74bccaa818c6e991a1f06f97df3797ef04ba2da3cbe02b3d5ed7755dd374c8091f61273cec84879df0b0d37632fa7df19cee92518813ba54bdf0adef373737377901eb9bfa96be61a3621a3e146314c328f7c9aa303bca640148467d3bae018ad128c38b4cff318a620e522875a8293dc29efa36527dfbeadb078af59d59a170cd591dda4de9d06e6a423629518c9dc38bfeed80d9bf1d827f857f89e8ed908f60b2d05f34abe6df0ec5476f879d96c25fc7ecaf7fcff6be7282feba2aa603f4d7571ef967c7e7af078b13fe7a6a85f5a8df1093435af476883081ba8cf317cd845e8f84bf8e83ba9098440201c25f17a23e8cd0a2b703cfdf9ebf1e245679d4afdc13934e1ef51c62f20c4ca0049dbf4eac8211009f9c065c354668fc2092422baf0f029101d78c10ba305c520441cba287135af476682750977f867f3d9b60f1a8f3a03e04c2f9eb2cea12826ed03cea1188492e8ffa90428b5ef92126275097511ff2a4280f4f3be4e1e1b9c1ea0deaac7b7779ab4f2c79a35f56f256cbeaf2be7a7179a3746e79ab627879e3af2c79ab5752f24ef59ee48d976d79a77654f2c6ca372779a76a55f256e5b664b549de69932eef140c4e4bde69565edea9d595ac46c91bffc9e58ddfe63294bc51be12c2bf6825d6dae48df3fe2649bfe48d8a619092d5124d392e99c72b05220108879985486e7ce4e28af62af78c119790b1e225b254ae21eaecaaeaa47f893ac11faec4648a1e813cf8c37bbc8fffe21fb26bcab2984599723608fede25554dd16350c770886ac04de912c62ac6aadaeeebe9bdd8538c558c55ecfb0aafa71e02abbe0a80cd0122c0fad7efa5818ab238521fb2474f1fef19bcea2c010c200220e1fd760868fd10983ddee771912d90c8dbffb86424fb1f515951ba5883a2458693c4c80e352d5fb0f4265065050a217a6b24c0aa3ce192c33363a62f0da7e8418b3832ced8a7c767c27d6ab1117ed2b946b807003ac227c01d0036c27f8736b84b49b9bc7ddfb4c72df60d6e071cf5e2bff47668ef92ea4d2531e457d0163e52fda25c186a0a1fa9deb63d3d413be8d1f651abd4035a465d15b6e8966f1f0f52a81ce2c56b87433eeaeaf878c302fc5b06ff011e013299b2c2e38d4aa17a825e0d1e5b6ca43a7b548b3972eac27706f15a6488aacbe1caa2c79515aa007d085f79eb077305217d72ee59a986689ad3a3b4e92eedf0003fed9603e7c0ed60a53a364ad50b73d9030eb091938cbcdb252e32bcc8640bc5810bee128f9c7d6e07f4559f22c03d4397e991ea7988fd2ea91e027770c148f66088036ca4fa0f33eff6555598629489a2986ee8526d40ad3a74a0565587c3a10f87c3e170381c0e87c3e170d80e87c3a1e3ada1de70381c0e1dfd42c5d0e170381c0e873e1c0e87c3613b1c0e87c8218e4b39c9f7efdfbf7121d0d06f7a44971ee138d07075617ab4fafa961ee1b88a83e33838383838383838383838383838431c1c1c1cc75b387a38383838388e7ea162280e0e0e0e0e0e8ee3e0e0e0e0e00c7170707070fc22718644b0e2a18ed97b026c7455351da6699aa6e81e414f712fef9c7b304ea65046f8083bb28258de514f2976d56a781190832efce155401eeaa46a129ae853e7f8ea43bf3e3c0a62087278d42fd4f11ea141a2dfa50b58f9081474ec4127baaa738e40c1a100a4ada33aa75042669a5429440411b1a60c1820377a04e191c7a651bfc2e0711b7dd06f8edbe86ffca650c36030f5f9e17068dff8ea39474f8f828e120370e3c2d4718eaadf0c5362725d8fc2e0d0088c5e75946880096e5c86089f3ddebf60a58dd3f1b677a3eaea8e42892c5468e47df913413c0ad3a334df25d497fcb23faae5c6d50a327456a6d899608bcd581c1a215e68daaddc3975a479b2c715581576e3868a29365ae82166510c0190266347e56ecf63bfebbaae2bc6ebbdead0c546a8ce5dc60e020adbb028a43866642e35c95b15ca2b66293292b7f0afd1ed80ef5daf7a53344b0a50800a5f75d4874186e4adf658c92ae6c247aaabaae32ffc947a524c4e7d265096b1f2f1d010938ca64b4cf256ffa620f81f081f2800e95fbfffa80072fe0a69c9b70157af8eb1aad72119d040df60601be5e3a1225edec2bff8b1fbfcbd4728f1de1093b8adf023b344010c5576c5c160100d5efc586c1d33bcc81257288a92a0bb6efbbee18b2f8aa6d777509a620fc25078041fb2e9511f40dea33d6f586c1be1f07121f1557dbf83baa5f81e2b9003ec09154114001af85788e29be6603c960d7db8126e7fe14a94bd84bf7025723c1229968bceeb43550a0709206b5b90e0b0719b6895408323b3044b181a236ea419e9d1a288191100fab579a1c2ab0b96465d3d7e61a3b6bcd5b2bf5e014cee8026775093b72af657c5cf2cb8f94e3dfc85c5fe3aea4b5732082d79ab577f1d4497bc53bdbf5e54cb4b43f24eed9e83352fd45c01033cd3b541922d2398743dde9e1a652b63c2e4ed6bce0e0d0533c278619181c777022b89ecf24edffe7ad12d5f6cb453b7bf9eaaf9dc5fb722dcf2d7777e550d9354a5b0f2ce8fca55e092b10bd95d075126ef14ecaf83389377cafceb1dfef24eb3fe7a8735f747170a3c1d40c264e131016743cbe902c60c9f18768140eec67e045e40236353b765c49614b58dd8172b32ab2130cc021076868a8ec50aad388df6c9fd09c10a62a60cd0f3891414704ab218d1a82f01c93b4499bcf1db52d8f52567be8ebaa38ebaa7502258f1648699bb3f3b251d8c01f3d5c50b4c8b16944f55dd7fe7f714ead621f14b2185858e2d318dba510a55831b687d746361769011f103660cd697115c5f4a7255b3099d5510b92a1a75107b7963be4fd3271959551d75e4ed701ff5ec3302e4a7ae1e711e36ba78ef48ae7024e3a1ad9ef9eb17890ec18476b965a2c92c18cedaaa67a7b5822b490ce609355b36bca089b1c6c58510be2a1a25ce8ec4398fd8386382cc5e9cf32d850bae208c7c5375a3a5e2664d16bec0999183356eaa328fd75049be69b261b97886e3968371375ff9a68ea5cb412d375af2dad762b875c395856dab961c8c63f9b21a268836bc71f7dbc845d0452e5ab133c0d20085ac1842e5ca9532457cacd8b1a3058daabd35246cc40129e227e4ca6a840c24cc2a5e7c6d40c40036396346b5e34e58a44513e2c089428463a1b45ac41e6d0ae1d9b0c67088971e38cbecf3174d848b1b2839c74730492e1ad1cac2b61caf1c8c1302c1e9d2fe4543f125b771b6c12b214b4ff06884ecc9ad8f4705ffa2a140f31b39667891c1bf99475d2f9b0e7f675618140a879c82c728c0cc3e512eb3605859882428978369ec8b9c362106e6d6c90a402a4200f35a2380664ce4e108f649d6598153250b69049539c78bd5916f86b04b722ecb09cc43b7a05e66a7dc70c9375672c232f1ef591b2e4bda98c1c1cb37245a34b9b8a2bdcb394c962ab33fd636b9672c7897d527bb74c3a192d3bf6781716002a510f132cedfb3402bc11e99fd7b16d8252823ab7fcf02c3a420a3d3e32c504dbb23af54c4ae2c2c41545b2124936fb470c06a0c5128bd8623946142b731a219a5df302fab4af62edf54b538f28d8a1bbd2c7c4164cbc11a2c9bcce3d5eee59b26995c3c5bede26ec4e49bba9b1768545a845af2da17b492837fcfc0d8e960e59fbf68546a886559d88697837156f9266fa592d53043b41c7c225866ffa289f0fb9d5f091ff960a3b4e777cea8671f341469bf8d887051aa4f94d02fea1ae12d3a6116fa3542953e3ece17ba930ebff1d1399bf09c4fbc17465de70bf15ee8fe42f4eb852b9eea9385e847bdf0ba295fd8a37cd45112578ae7c9d3c4c4df09c45161024347172950f44db3ac2b41c2491530da51e6e52303e306d8e41944b7c1e851256726044ba3d85241d523099e526ff4ed6f9d55608faf153d00eb6e4af51bc5fbabfc1b785d78fd5e3a243f00b3a4c9c5699f144a47499838b62b3f6448d1b7e94641a205844a19316550b0c4c993be1251d4f6f46de1a76537268c334c0d94f0b5f9a3a145489b377d1dadba1d94f8a904512f02a10cf0138e5f77c109f0136ef3d739c04f18f0af87c04fd80bfefbebf93a954aa5db7554af8f4fa954c2d04d3e1d7aea6dea3d3e6e05d048e953271ace2be7c119dba737afc7f7d5bb7b107cdfbeeba734c3aa8ae01bb5da68d6d6a78e325d78f914edf2f18d7e814df08d8e35959fe2a44fd4edd39fd4ef46e79c28d0dea7a952cda78eab28f8c6561863dc832ec518ece81b8f359b98c16a43bef1d3ad826f2c87e93e758c87f7a94ebab1de9e05dfb80ffb7deaa9f2c8a744be53abab4fb3524f9931987c9a767d9a7ea56046bed3b1b4f9a9a74eaf4f53b54fd367eaf6a9dca7769f7a8aa7e4d3629aa67b47bed3bed4ef535795779faa559faa56579faa599faa5c9fbaca6c7eaa767daa6e15ec5375ecd3b24f5d759249f95455fb547daa6e4bbe5539ba4f5dc50be2f7a99af7a9aaf7a9ba77c1b7daa7fa7deaab72cbdfa7e96af5e97af5e99ab5f5a9af4cac369fae5d9fae5f609f62f0bd8e7d9afaea2cb3f169ba3e3f5ddd3e5de53e5de93e45b2a7e1931cf52226938a8479242424242457c24f4a8ee44d4848f01ea9456283848484e41709098900cb38b12a1a665659481fd67e7c598179f3210229094c9297a4a42ebf9d9a253ea94a13cb27b98f11b74f7227fb24376a3aa2a62b4a6d8ac8b17b5e29e895d288dc28a2e2c9ee70dc2026913060e53d064799c424861674ef10de95dc1da9849f90dcbdc9b1e0de797c8d37b97b92bbbbd791717931e30c471a9ff182879a1a675de61cea77cf27b5e8fba4a424cf58323ec9511bc464924ffea626f7697261538b30dfe4680d62b2c9db47ea792424252424a7477215c9853a1ec9b3de23b98f23b5e87a242c8fe4280d6212294a49c97d945ca8c4c2ca2b39ca454c2af90c62d299b6f07826476510934c77646fcc79a39a371a8d46e31d993772e081f18a8f3766a39fd168341ab7cc78638eb18b11c98d4637a27c4aa59285d1445c591e892f2ff2c2b4116b0dc95b99122b25f4cecefb7c42f6b6e5efcaac8c0fbdafdfc583d30ba3cda804c75a0c139a18c3a072549206005318000805e3409865619274ce7b0314801a5aae5e645017c8437a92c41832c000830c00000000000000402007a9222f0642de3d507adda33eab22c21347a5fdc104374dc685c48c93927bfc95109fdfe2af281e6f7107947b095d4219ea528e4511c04342d6f6f604eab31502a52b9a085dcba049ded914cd91501cff25cabf8398e0a40dea6af890d175ec12d3ea4512a66829e9b4632703627d75ab093d180381bc6868c2beaf6c09c78d8a7b6682c1fb7c85bc5322d6c03faf592d6295ff210ef71011b0fb5a8a20d617d4a79393329820fa8ada48f2cafa89ca1c0281d46c4f4132d8d9096b85f473ce8ae4172886e3cb5befdd82b5e49ea0816ca513cfa4cced9b1c9856b4a03ce5ede07a31d952ed69384a50de98ff281269d93bf1011283aed89e83ff751f024b33261238de17bf797f9b8e54e898223af4b619d43db9e5e41e7c18bdaba04a9b809a5620151528a8a9623d2b2d45c17dc57dfef70040ec8e414f6c4892a1631834202ac00ee787306e16387bd3ec4f1931f31abd7963050dcb2a4b37ac7db797576a24f2478d3c73216fcff961c8af50d7c3d084edf359edefa4ce8d2e62398e120b2ae923899f16a51101a2fa9ceb371115b68ecaaa3b486d5176598038d5f952145169538e8faf14e297b0b968667101aa508ea5981e80bc22997faa0ca833cb2072449de066918d88f4408bbc05b7b37201f55f923bba18e73063fd6ec215b377f800fcf291e2251518230eb526963e98113cb8b88384b4fb67e2f60b4ca1a3c16d4f6878efbb10fb2f2eae2f5ddc6c8b89f059fd601740bb748074248e9fe2ff32e2fc94088a1e6b24999558c1b29303f81cff7d846ff5190647dccb87aeb3de227af76e22ec61a117a2d7b4decb4d30bdc7f4b6d56b6c2f0cf782a6f4f3845207380c7ce73d4f8fb32862fc79f02729e142a49a6e633dcce8c1ddea95f26fc6e8add1d1eee895ce3710f658f429f77925583d99fb69c50bbdd8657fb99d564ceed5caf0b283bb39d1afedc11ffb72c3b37799dec6f41ad3fb1fbb727b5abd16fa327a20d403cd37d07f9eef2915db1bb7e28e639b061972a5fbc117429d115d8c1bb9bf2c6417829ec6184b6110c2bfe57243549843cbe54ca21d52262a4fee4d8e81b21c341d457adefaad4f45bfd1162852e428d32504af49bd4d6879c18692150a4b09d4789fad7c8d8fa364005fc451fe0e139f6a35fdc00f00abf6c12c40a951843f2503c4c112edfee754759008345af859c8dfa457ee59e72a532bdc1ce417f2c4161b802bcb525940748e9b4f1803fd3c98a998a7e10e30d40d892016a3207b7bff9d574ed32805f353229b59e31e19cc5a568b53c2d78387ef43137a80ae45fc56668ebb84ee1412339bb2d9282ed8425c5a71409961b645b694ba0c6d2f6a7947ef2a66a16e576f4e0b01d5c24f415c6f8bf26644b6ebd17e823de649d6b81bd77aaefd878bb1a64a77fce865de62be148aa69701108bd86141cfb1a1e91a8096186268097a43f66420d2c6eb9976117c3534e6885dd982be026bf2bbf3dcb6fcafe2efd8c4ebeb1650048826bb588446c28850cc2e26c6d4433418d1e80c7615bdd73bff39009bdf150eb9b671923e453a2bdd67e3eb5e25004851365ed72b0ad5a90f905750a60bf3bdd2a287dd2c48e95a49386cbc709b701f2ca6c5da4a7d65be04f969a6d88947e3b6c15ddcbd4bd0187059fd8cc88df02e478915a5b88df9aa3ff4eff95cb8c61f313786db40859b0ff2031d1fcc94c4121de0e559826336d01ea0d0d3f66865c3cc4997f2a58e1e571d5a6b000126c23f2e23d6f8d34c3d24901ca35b7501b1562e6e609f74bd553f101d05ef96529436b3aa3ea43b14117cbcdb88d9449d4ee76d2414f85fbdcbcfc9f67003d153bfcb67b40bc9fa9512f307ebfeb6dc9942508a5d21051ae903a49c811b592447c79136694e4f37f308a4f65b15d5c369e3cb6f8dece3ffee5d8e13e09c0308bfda461d0883fff1a76c333ff9aa68a806fb84a5034e6fb6632a5bb982490e9f08621ebff05d7a68bbe308e065193679eacfe6d1aea60cf7c574283ad1299b8311abc4ef8288c1b082493195f76f132a53f17087fdf026f5b727111eedcce1f08bf174ae81ba49177d18a4709a96753d6e89d3ec79bfa4eabe352e99b0ce8d9dc806fe34a99d9db2e2f62eb0c13339ade8bf0331aca2362407b9b18121a2cd443c4bd32ab94b94d0710fa822f8b7ee22a3f7442cc22e45b9fb2362311424a8db7c50be7e822c8b11dd7bc4a24fc686c88e6e7db883ee38dc3a41031b346a997552ab3cb6cb0997429102b5a32fce44e15dbe46803320b06502cb727302d3313e8103384c7bb43ea7d3d1d0b7dac5cd0b390fec0ffc9c3a84faabb9cff4b331cfc431ef3871e5f914b07fe2644287ddaf4834b0b73b6b7540c418b96425b1f9a66a89187b1c79277ab808bb8ab3669a851bab96fff23d512528f3cd6dcbc1e2d02f81f97f36490283a6d7faeac500e24aa22bb8353ada69a44c602f9e092bee9960ab5174efdb264424a92872093aa157bd20ea2a4a2c2807891757ac343d08f5e184800ebe5ad95e663b015b9c92cd36005f34b8e479a04141cbb3dcb3867c352fe9857264b4e5b89dd33b45a01e078f4ebf6dbfb487ce38308fca111d98f7eea2232b28b4715616db8feb62ee97b8bc1ffad6bef9035ba017b557c8b759cea63d70c6fad2ba9359d9f0e0954645a1d15e9ea483eabca69933663b4ba84a675abb7fb6859e506b07e7ea2441c5c6405ca842661d2152ca045f2fbb219098c087174e1dcffb683a5f385936bb8cebe40e13647a4c3e56520cd5bea49af13ff84d9a07799421cd5335f350ff172d49ca42a43422e2acdcb04e5cbd43667728db46dab8e098df0f16d3ee7467d8a96fc18ad45cad520caba268bc8910c2dbb6e539614aa82e25f0b18d670463ff9082e2fe531103aa7b1e08930301b2ddf616fb91ad4220d42d82bf95c92ef7fd49998e685444cf5bd6c433d29d0fa47e3dafaa1993f8e3e8c405ddcf8ab70faf211c41cc5fd87ced624b402ae5f8af6ee009ebe4e5f5714bc6437a5665ef065f1496f2e70bd3a0d81d2866d427f68d1ade70492b952ea88373a3776630cf6db67f5e0f7156da65abc3718517688f96af26cb5400ae670985556466080fa5faaa5398d90e45e2644ea7ab5184a98754f73fa0e57e1ab7eff7ddd6b126a226259858702311618a9ea1676ff9818a3e6bee664a9a88bacdb2f8ed068ea4a1c67f7812e4b5efb0ab0c79aba785778bebdd8a70e16e2676abc773d40a0176460444a0db672153f6e4b752d7a5dcc0182cad4b81efa9ad519c7c81c4b33574abd80234765abfbe8bb1d5b99b52e8dcabc4915dea087604220a933219604c58f42a82f5f7dac9516be105b40207cbc20f762fe59ada694bcf255e791a5d8a74d8a4f002269abad09c58b25f551038e50b788de26abb0a047039c1fba69ccba523870bf288eb9a583f2dd87a86b2b1e59b0bdfdfe122629528b4348c7bb5b53e9c3eef1b06711514b29291c9cb484f2b114c89595709a77d0131823f44c7ed9a0d4fa604ae89ee5a96d61292bfee909e731fd8808a00f5730fcedcad7e4fe8ccdc94b9911af440b8b8568b444af862ccaf3afad0cb19605564c8eab67d6be81cfd0fcae833fdd3b975b5476e7e4634438e4e0645ac84b54c026879c374c265bb14a43a1a575f71de494909b4888a4acd890b2ed6f3d5008775733654611d34022c112aac0aa0851a50962382fa5750ce3753588d63d02ae3d5a514b4f386ba4658b53dbcf4e8b3343710b4f4c6cbd2b97396996e082f91f5f6cdbbe0c0b2e9319885208f283e85207d165b8abb61d30c78d124f0e8c282136ea95834a9c000530c59a97e95a90c03aaae82e930d075c006a6946e8fcb3ce15c762b3f413edb82f9b57fdfe7a969ee0a04af1cd4a3091a57e0b70e7b7a384650ff6944a369273cf18a797d8a05b2305f548a90b23207dd84c33f20a3128ea5a6c8990e40e4c49f91704e1468770d10ec947827a92bf22e78e68b0a8c68481133024da4abde37c31bf462120d2875df034a99f760a9969f5f95b3e1b175ccf35f3b2abaff194e8722343a764a77ce394b521ce3beb20d9856bbaa5f9229a1d640992749c5960941f7bef3a8bf4314496fb037771df5ee35d8b778237dbc970be4661542b517248869d065e62eb47f8e209f0d08520c32ae4cbda0d22c6b50eda8a6e4ca020f289de7208f93d83343f86abd20dd03916a0d049e8a38290aa1a808edb5b4a14786b23c82019d17e56ecd8b1d16334a499388b790139c7101a77ba928b4b96a235750d8341e6d83cef99f7a769d02d5f8670a78d8a6c2cd6ee28cc0ec93dbcba0e5470a2c410cbdcaa7fb0d6f54cb1606f7bf1ff1c0dedb4a738ebdea02a34726d3820b255c5a0d6b3af99ed14076896f20492f1156241227ca66c34e6e16cb1e622c97f4a865f86c9bf9873848ed654fae118336cad34387876fc8535da91bb7bd52b4140b0a61a6ee02696023abac29d5f7ccec77c3ec82fcb6376c050c872583d7b022a5afd89aa7511bca88ee966fbcd5c2990840300118d11f68bc2ae5f0f4bb662164ee1f6490a6642c3e2cc91e24b6ff51edaedf2fb40e0c2678b5bf5e8cd0b3fb4cbeed8468982e8c20c29949b8d637b313a551534c6628e42f8c9070ef1e2903df73efba449be9039658986d3ea275b1e3ddb023c640a904410209f798c2095eca1a9b58ccb1fda26d359ca81731bcd7bfa8543f4352f5c817fcb5bbd6c6006c64993f56d534c3fb69917224b16df692eee8efce0c84238b2184fb7914fd3a53b5e06940f10230ae562a8af34b31d0c45e3ffc537a549a06dc4872d4adfdaa4d51d685de7d45a83f4a0105c90c17c696c3721441bfb2f07481ed81f8cedd6a80491d22653b1a838df2404de9923973f2664e03ae4a82bdee2076319e39572c20ba546a5b14d3f7e039f003412ee6896fcf0b17de9c38620a2f4243346d4f503cfa9651c69f4a2ffc72b53cce849f9bad5cd13c5c74e93356d0c0c6586aca3e993461276e542a06a94bcc041a24c92b35eeea055b5b402a8a49afec3684f74958a2279e3c7f775d09481651546445a22b43eed0fbfdfba5f20f3c1a57cbea7f234d9837fe53ace71333d86d98a341bac6409e0c09dfe9a8439382e26bed61e485971ad708782a902e821a885d058e40b978098ac8d57c92e08c5f6c34d71d710e5e54f042d4be65af0bb0a1d23792e176cae708411a1f10e4dd17473aadf6568acc1dcfe48b7da0d22b209dc3f4a4f52506e603a3309096eae1403d1d67a9b599289630e7c14cbcf5d22e999eb26566948d80e54b10cc8413bdec30b4c13ab405f9d5db9b51e36341ebbd4a933c7a42a675628d91591a4b075d2a521334b8bc74c892d19c88df1ac54934940f0f6a89f84b3aa804b185f1cf18adf6a753bb262567969d562e1a9e27c96875474a66c67492474007abd056fc9796bb434d8d25d5b12b1aad266007d768fa05b677fb21babd52165fe9b5055d0d8b5376279ebd2f9bee19d6c6bcddd3d98821868993d0569d16734175cf838cfca2e1a1b31fc616142eb73889c245e6693ad780de0b19f44a6341fa5bdc7e65e196220c599410727b9bb9d987d746997c15aad7463c3217e6be029f38c57c11ce1e5023013dc0c0e096f28ee1d94349a36b0a6e75cc30d741602cc00ed1f5926a60df1d93f3c6515c0073ac043ac2dc8233295b41499d11aad18d43f6443d9e8be244b490e356963b72e158219ab117f4e1fec97d6d41dce8074c97fcc4d1574759de76814a4058c979d2fba09809fc0a9a3e7bc1006a7a43ea54c77e06a4821838aecea4407f8402c7448a59bd0889f201396774fdfc6fcfba91705caa320977575bb616874c81dd00028c63bd812244a459612ed7ac0985a78ed82274789bacc962e2c4c685b91e9f2ec22ce5211a94893aa47ddeaa228a1c1a02531e8bd17a302c635aa996f84bfbdce21582e93c15d284897777ba9db35d3e6d9e7a0a0c1163d57d85761638cb2207d2dc871b41753f8c24029b6775cf14623c7ab0707ce9fa8b0583b91633169fbb8854229025d86111684280181fb7a3312ecd53272ec3b42fee3d99104f711bb52f13a6dd205e8a46894e7b20109d18ed168a5d314092ee9afffea6a43f8131f18e3b83b1552c6e6fdf5dd375a01ed36f6f36ba5a443794846ef850ebd2a92c1f84ddd341a6f78abe6800dcb98b05ecc252074afc29b06bf04f0b8eb66a792d3662473668f55e82e040b5eb435387b9de22bf0b8d147babe4ce62dca14497dc252a6344a57904d70b82acb9f8b808a02a74e0310bea1b14a6ac99977a7619fcee43c390241d332bfad6b05cf1a0257e1fefb8c4e733085a1be8182639f15b927ac6bbe8af8a3f57bb4aae031ee769fdcda96b0d0584798889b4de9c0bf01937baa60480428c51b4bbfda3449d2b84fae66f5057358e1a797a8a01a0be050bda88614d33282e29885dfa819500406de2c0c5c6f2427d4b766c6200cc8e42228be5814f27147c07c78178e6781c06bbb740ecd68c37852f5a1e83680f95c11e448d4fa9da1fbc1a3f8d37cdbf315ee646c65df85c468b3e7ee8f42606dacd969a35eae36713234dcc603e2d7f06699e4719aceb29ec92c9cc109c4af3ef15b4f1cedeb1d05ec93577149b8747f002967a89d612b28786ea0eaf376db769e29c1d3478cea1b799169df3a02d715f78f117105c5a2e858b778d25ddaab8e0eb9bb7f27e72533c50e6c75b3af8f7c16d05a8f9a9b8cf654ce22954436d221f58a4f3c277590b4acddcf991d2e511e9e7546683d59ed4a21ca875725716efe8d4e4373494281495682965ab21e5cedde7b984f34f4ef0482d835b8aa0910297f02446fcc801cd27c7ef12de7aa4458c2a0a6e7c8c8eddac535853afff5659feef2ae7986bea78b3733b8ebfc76ed9a64af60a8a167eea00afe217878eceeb0ee13ecd598ba46e4c1527c1040dc50d88ce9a02f214d3b8a26e4a8a132a8dd60151d937cd18a0a3659a9cd1e1450e72c218b98c44c4d7352338a6fd0fa69f83cf3dac8138260fd620f2fb06e86a71ec5b0e1dffa9a4ce2dbdcdbb6dfdcf88258917b8b42acf0947081786f073d8dace8655c14b6c5a1eb0ef371031ab093291bf6795c2529b5174680e1da6d0766af7e160338bd683ec6fb59f06d3f509ca23af59b8e896d55e46075fa143bc90815447c33b65203d707ce849f82657b9462fd9f329adae517d5f88370026469b3b448a9049bb267365384f8bc275c30cb48d95430b9375d42f0ec7dd00992720ff41b68a3f2037082619ff2e1e63272028875fe04300f1d68ac08ab22c040920b4ddc70de08f35705f9f9395a7c35130683ee4965b8951c6104e6f169e0a0c2290c2bdd26a36b1057d6559682958121a62900ee6cb49690c6d752a7c0ad88812198268a2e6ab6dd5a62c0d4e012e1912c591d560f0ad5575a7c780576125a92b75883c66ce5d3555efb31bbc0fbc89400e796aabfc63394d8913e114b024a8cb5cb46fe4310b21078c79fae216afdab60df85193173fe0f3bd0c3cdfee31d07c717f81c307b05f093fa7b558fa0b3d39d1db4280c0abd46801dc36308f12f266ddc550e143e2479005ebe89ee664dcde528e2efdda39aa71f0b47f3a99fda38b0d734c4c7dd63a6901ef1b243ae8b519cbb4d82d34509b9fb51608f1cc5c57eeabc8b5438a7f291e59b656c7860d3150d790ef03913f02b00f4a07401faf54bd56d4f84163a198bcf49c4fb33b1e4e59d9b0ddd44d74bb3f58ba6d809091572382a3df0edce5ae107390620bb87771195641c210d8055ef7de54d3dedca92dd7654a3a68c4ef818d6d0c7de59c0ec7e43535c29394a7904940dca55805b7e6c544c1aaf60c12bd1715fa06c7cfae7c3d695f1d52d6c021ff001ce1f08f7ce03dc9da63823557272ae93404add62b8bb3a468c0b3055502a48567ab4d9b4b8aa0b183c2f251aac11bd8b933bc64c55072c1bd9ba115b34bb087a014f41b0d59ebc4950fc79d607c179025910033bb31dcb958f9a72e465efd0c1aeee956b74f1b80e711e919cdea2879dad3e6f0bdb00e5c7ea8b217e286b404ec8d9b55af9aee76f1c6b3a4d80cdbdb8b25dfcdfabef9b478640fe0d68418699110ad67b4edb605b37c57909b7fa20f0be1a6b2a738a6468572d850623386d1a0415f4a59ad4c7512c6c8c0b9c5766b906979af8c53b2cb120eeb337901d92980dea62a328ce2d0a9f1ff184b28b1144f589ddbf43f7ed4d94fee27710a80bea5b0db9aac69580923dd080c07a49a047b6f76b5ec02e2916468a4792fa4e529149a4a5d5a1bc5c3063c7e64b6c69e9a6c13555d6d0f76e2d9f6d3db1bbbebb95fc7b1730e14db144534520311c4c6e1322c62bed1bd334e13fab7e3d3ade7f3867a287c9d051ddfc54f158d1dddcc671c74d87e693719d063b35f35668597bbb5eeb4f258b98812e6f7cf64beef197d85172b38abd4ee5395a835144405a0b7421c4ef15b2276ac78527df679b8efe91ed62784b2786404c9f8a4054182b19f7d19f76288d1a28537c2ef8c460fbebd018905cc80163935fc28fd2d8c40b3018e8ddfac214b6ef611cc990baeb9cf41d1fa55c2d279800e2e1abd8d41acebc9f49b70aade164128b9f7bb7ffaa7029b9605765bd2cdab95d80a33fbc38e9ac77709e53197a2c5ca63059d657c82d5b6b0353e3f616377db2559357c0e87696f509d10be74d3be4e9f59ab6e2fba953c5745d433cb78e60211b1d03a5cd8fcfd71121d9b75788984293d6851410bd8d6924d1577cd940661e14a343d6f9b036b9febbbb96e208ede8e6926ed2d589d8b7fb81b4c84f0c6ac74804f9939b6ce1c899087f1a4dc3026adac9f4c4d5843931c599ea4aac62a9134060009229be98945ba9d7f4c9e70e1c968315395a8ca3c00d5f61876306f61dfac00103a601498d1ed2a0c8ceaae2b5109a3e09b8dee3f3b678f0cb1795954ab00c041114dd2d6827f7a046cd51094ffd5941270dd7cac20d8bc78145dd93380f815cbabcf7ce57a8bf88aa9ec0c91a863278bb19de056e9444222038ba6eceaa00d8668b54576a870316403d61222c29592d6cc321916e34aac956a54b321f386b45a236beac9354f4331c359f4d9aae7685673e5e11111c812c825fb13906d0635c7715171a48caf5dae41bbd13102e6acf5d40613245f5c31cc280000b92e8152766ae6013b92d6825469894b80eb4ee4184757fa1f27672d9ccfc4b19116aa2a634e8e1221f1d6c949dd1ec02c2fe5c7dff0917eade49f84302c9b24f47124efb993e85c628247dc27fd062de828097e5cedf077115c0c3a8030b51e441fe25964ce1e09bee8114a68805198152e07ed84c3b64f616de6c2c19fbb2c94fb453db38545413f640440dbbefa9c60b3e131206583ae8cc5a501ab02a4a45f4dd22c92fa04941f85948243489ac4013098cf2ac60ecbcd57b80036c4764de72a3c353657056c06f2db161b6a50ab0241872a9fb3f4c861c4f4cddfa450e146c3019e9f8e5387de281192c1f96d0a56c07d5a648227ff1407965ed0c8bccc2e45afc62a34dfe6359c02b5237a6b7096e574038984d1c6c120166b62ab4511d54509db9020eeea9782f8fce054a87cc0b41a78e0c252647070881072fb197cf88fd935ac2e304d58de9dc1941174532a9b77c1117478bccd1f78c8b87bf304bccccd3f453afdba9b324be797e32ac5b7080291ef9080aa8243d6c5a52723cac1909c1a33c64d8a4b0b1f43d63005027d09a741edd536437e8190d94aa2f487ca395d812980b20e88c10f6b747e25e7f00c5339e4439a619964630805fba195c75d95a9106e59432b473ed9914c22aab0e8d6ffbaae4e7e81b2c4b59c23124769cae7ef58c5bbf8deedba22e4048053b8e08368390ac47884cef1c173f9f08a6d2f0eb97468c0a91df309006c6a1a2646bbe8b4b51b9812177849fe6d67281dc67746fff8e2b14146b4b87d5bcb8707004bab3bac8c3f9cdeec773fff17b942822c1d7b2dbe1ae796fd8a033fbe0f118d56d22ad5536bb00de8bab6b0de89f5515ca68c1993b5a06bfb87950f068265046bbd408ead1fbf8c85bff5cd87a7012bd3f5302a8c7fb4763eb5183e1dbf8ec121a9f66ae54a4df68dcc72c3314b990246dd653d3459ce6cb8c1207dd3f25008c17dd480237de4fdc35f26cf55ea65bb3d54464790e02f375db0870a1b14e88e5f9aa5dcb43f0fef70ef80f20b167a12ca21c3cf1d3a4bd93880b678a6f025343824eb14c778e5666270655ae11c6cf6b38a4f0870705bbd0bc96cdc1b52d367cc9cd229c119ed6e988450d12d60cca370d08695918a18b3a91478732ea6deffd31e02b20362c11e9ce24c0648bd9853142c7f76bd37b35ed828a412384eac36e0b454e1bdd327bccd63960a5c53ba8bb2976af7b9c5442054441695be40584665709e157f121afa2fbf201fee4c97881c966237dd02c2ec3a8009d6188b23434567e66cf7a902e5832eff9c26adf9e36b1185efd1abba0002ec01d3115bfce4692003c158930b27379c39702f07c11fec017bec4cf438d29331583d5cb9dc639ff206d9c91fabf2f148bff2b4ff1907b9a0864e640931b19510c225c55f14c007bc8cbae3920dea4804b3811b7a01c294e532e157b87f4040ba1e0a8a0a2b1f499b43e219f48979b160776183898545ef521d1da9f0633f03e9cc351bc1a87096be6d8a315234c27d4dea2291765b80db0a7698cfff070cb4d4c2e6c59fbaa34987eea7685925990005d1acf276bd70c8b0cb81f89c1d32cbb6df4d1facc82032221aabc467a20c3e0e5d3e6d0d75a1156e910ae1461bc274357ad0beabe08b3bb05609bfda00c5aaef3c106332a3bfb2ab3f9e75791985c7fc83ce344762f25e64fcd29aedcec4f97494a8d74c7bc758e3721fa5bf70458a2ea0e8920ac540783adc93efa423b7044f51b84910a0a07486dc92124e2fb333b798e0288aebe053811788c2e325d3bb5c1d462e4027b610792e37389ab53caebe6f62af3cbdce37b9af3cb4d63700df6ce3f88d1ff5eab7463b59d8b8fb4d0450d3a1202699041ccc5f2a4503caaab09003c57b31d7e37daec8737f62a5106eceab07b971d0d6c4c5c1e882b5118d9317ba1a32ab26c9cd02b2ab080851496ec731fa9666fbeecd0b76af5fa4e189e4ccb5f7d11088c8468425162d9962da8d823093952a85dd165b2759f811a862c1f2485914c337d2e9aeb54ee02f8f49e61d48128213b2368259b9ea2e5f2ec18fef363bd80657f975ea9dd50bb34fb1808f016346db8b23814ced722776f47dbc207de4db503c057046f47f49bf21703fc5a53d271d208eabb72f30792f2f0ed8ff48149aab3c19e15c60201000ca3a6d7b6e45ab48c89bc1e833f74cb03663fe09bc807f14f1129a1d964d597d68d2dcf7660f92b64b52c47c4a3192a7c0ad91079753d9c0c434b0d665d69370c6770b1c18acfe968d6fe2ca949261d7815957d3a4927a867d3319c35ea4b67bdabd4c9b2f3068a71de7f7aa74f7443de6429d50a62d962983440e65e28cec3c4878c9db79559f87784f0ab10e20edf9bb3b3b69cd03f3151d39bf4f267bf8c90bd591d777357b38c4864d39d7be3d6191bd874dd013f4ca065b3d74811e006c831f8c369bfe1606d173a419e2f8958cb80ca89c7f7eeb63aacbe298a5c978af8820e5cb7ec66ca9092406b65fcc4df2fbabc02d560549f921e124b24352e0e0417a90dac49890a6a51d2316ebef9061224621b0407b7c1da9f2078fe368e9952fd781e3a155829672021cdc08e666db3b3b41ce85d130a888f422eb24e55def4e615993a495f19b607d39e2620d34949911e4f9cdb43079f4ce5866b374f0c80f358698869f32a47794d7c1f672596090f3fbf00b8a624bb52e41e5efd1a1695d269551ed7e62133428704498ee4e6cc9f53081f86233eb6887118b2448840cc7d4a84e962b2aa354ef779307e73b22a91d7bb6c05f05e318b24dee7824a06ec98112c85b2a7e4638f71a4be3bb44201069584913e503883016740f176dbc8827d86030b2f1a5167652241cdc01b9dddd27a2b6e0aa4a59c3eff0c12f0c48f63fa11a0afb6e6b66a7f6f2be5e625884e56741b888f8a691671320e52738c7caa30a0378096041e2aa78b1e53dd8ddcc12c0fae1293eaa3e2834db11d4d803e744d86e922921d6789a19c3c52e58d9bf19ca59ff9727c1bde2079d07d38453ff43f4dcf779fee18390dfbd981298bf9acbc4a2d53634f36e1eaf4d8fecb4df053712b758920e76ce94dc3dc1c0b7fbc7ece310cf3f44cac588d63d35ac1b6d9bf84a00f4d10881d8119152d2906b85cb0100692322a0dcb76a3a6033577fb6c5b99c33aa76952b490572e01f178e79e01de2790a58080796fa1848fb71c737153b1f8812f080ab7844f2ea8a4cf0a2a8aeb3562c950d38a664ff2caa37fc8c0523da2b14af03e46ed691402ecf39bce2019476a02fd5536f3389a35e6ca7cc75e9a3f0ce3a31f0e89f3f75b307bd05588170f7cff65287a0c8e091540fef3f232c1063bfa0a3b29f9d78a420c1388ab18b6af14f9389d743cbf0f25b12bbdc0756143cdaf7bbc42c8d6b561df8ace66363c431e27b3c75648bbc7ef993c378fe5cea8bf29398bdf6d2ba1a85e7c143f5dfe2dadb1b5d271fcee984f9330e9c3b6ec4461f798f46f08abc7c601f4b7e183043371f38e3a7cf055f38413dc13d846cf5319c475710992671b5f571c625c679f243bfc85f25ae655ce205534caf0dea724803078ea51c0630cee3d093bd2f02bc21f4fee2580ee38afcfd5feac2dd54025c938b0f0d773a4e23d5d6862188dadb3dce9b6f3e125f9adb36b656a3bacbfe212b799de2a5e6c84b39b3f03c97712b3fe30932eacc32a944fef7f4d2811247b520222e4fcb97c2c7675e161995ac9e8be7e1e0e455daa2285539f36c0ec4feae2953f480b6eb4145e40b7290037c9aec222ec27e1921a5046172774cc49d8ccb27e6b5e737fac4c7b8eb71a48e8bc1e6bb764dbb705838d75c74191920b8b03d7f360896bd16e8a5c485d4a804bbce7ac77965c1c03546b9694d6feee9eaa441cab0c786709ae6695b42f203e15aa1d37e1ddb37cc34422d23a684892bba05991b08ced036c749a38e583727043afe3fbbe5f8bba7f2371bed4c647a31749e9800565116e5601d33294d12acfe2a9814d5754218bf7b6a9752065e6ef831de101266d108f9a3cdabbb26a7955b724b8efeb07efc1c2655795dc704384025ae8540c80c6142a80e89c36049eb6c46a468772da4dc8cc2a4618e06b5d8055338c3d5c35057515ead491dacb420b88bca51d5e9d489a1c3918b41f3a00c4680631d3854fff7c2c45a2559fa44b4d75e06761ed4b6c6c6a1dc15f7eb50264ac56bc98fa1e814a3ed725cddf162f69d9a7155cb6e775fad6f3706444287db67733169966712cc276e9b8a11e20f82b73c83e9fc543a73b86e0c9357bbdbb8d34cbe4062ad3c5572c376913628ed706073e72a66fe8e0a246e001a0187a8214ff8c79c84a4910fa2e6743a1d9a0e1a02482361a0c48b0bb164b194239b91ad955c28b7028e7b29dbfed663362fcfd982b2be213e29f0997f0199b527a400a4e313ef2fa6c47da8972134009c09d18bda1216d28a7c19c16aeaf065310d4862b7f28e4c62812ce9c49140ed25c1b2e9d9aab0945a9922021bccbd4083a166bf3d6969532972c96bdc3e663e8b712b777b56f6220ad50d7cc79e25dc8d447670c44d2773b3247d575e13ced21a76840a31fb081cd9174fb7ef315ebb28e4f7ead01a3c7879992f030b2da5a73447f894140ac9394dfb888c4368670b5a2fbb9e7a077111f1e4acb674f326ed49527557d81e480275153c340f53ea642bc8b57300197bfcfe8d0c5fd879a18bff052d7a3baa2a4ea8b8314502e99bd494b478e91985d9f6cb2d3112ff3d72ef206eb155f4ebea9c1e93768108689d80051f4db7dc9b72f649cf8e8bc9f651bb25e5e0acd9af5fa65652db7c3519163cc2f7b7d2f0bc38076037bac332f9b2221040f0044ec0244f631f990424c62b9613d3821bcfb8d47d12dd7a4147cdc5d5f497008ee76c6427b2d5c523ec75983d80739f018763e7514f3e23f9e228429d7f095ccd34d6e3bb1db6e68d1e857e07486caa06f3dd9af15e6e4ed3b6baf04470eba09c8563d91f8368fe6b16794f8d266de3d17f8000957df756f2a61aed09794c05d81335283c2dd11606bc1154a2bbc0bc4143e5b645ca4124c60c991cba028e6cbbf9b7d9af4dcb14eb4c8591b3e90b5e21619e9d97ff9e84d5fb4ec72b7577ce3865626db803a4b8d876dce7b236163e48570a21b74d19d29789438558a7b82b72a43ec460c8ce439a3ad97856ca7c1211fd5b515c16a1b05c3d77ed2012a87c2ed02a4ef6188e387e6a29f7e3100423d5fef8d2a9f2e0cfca1db41fee0a6688ef06debc36b9c5d3f50c355901eb661a580609f828015176025a68cddb695f810ade7a91bfc552f3e936ca45d1953b34fd32ef20f15964bb1e1b36ef92a54396bc11b100036659f40177eaa7049571043581e0dedd9eec1470c2cdb01a8a47049bf4a4924dec454ba429321b655214d6deb282820f563c4b54a0b1dd625d8b35f787e2f678e57fb945cf1f14b509f295a5c5ba11bdd4baca32d0600d89c559dc789bddb1ebf204ef02f95529359ee7c99d354111b9853e3589fc19f4b8d32383b65ff0c23bf529ae22cdb69defbf8c8b7e1e16b223150e4f1f20840889b0f9ac1057904b139079fc073c3474e44ed1e1c51e834d18d3fc92cf99de16ab674a5c7e6bfe1fcf58e1db1f3c6309b5bf6b515864c1cdbb77ce4bd83db8085d3640e50db760553ecb698d74d05fe4fbae176eb74a225a3fc067b7279de640b3055f2d3b791f17cf68a3dd89eb5489e39ebcc06e466efe1ef12ce70d6e676c36e6da9c35d6b14be95d48545475b8d8ccb02a75268dd40838bc1bd69930013edfa7fd5798d2f2be9fdc7edfebb343d3a56c58b02e2c620bc78cf4ccda83d83ae94adca5accdf57d0536eff02080a0ea4a1c2e03c0f68d3afc12c4c752a23f5c346df83784fa8b69b5325757608f723e34b2dd408c74574b564f9b1eca69a8921b1a6bcd2415517f280d2b0ca492521695543395a6bbdc47988e06c7ab05458b02ad9ccf0188434156d6b38275160a0b7bf103aceb5288ab4becbc8f1741bb2c8c49b1da826d01083e83b962b4418de57467ca8df46f4c72362518b4e3375adf7762a6455ff73ec2446e93d225edfec1c6cd6cf2b17d83586297e543b5c65adb9b5d6f466f8598248a7053ef52ee31ddaa20582a3a24970434604364c5a6c4727477b4cf9af55d8dd3e6caa6b50cd02a8cca2278d1f987bf403b9893a2978f730c5c9b52abd976951b9ad6b6f8cea8230ef4a1e44005539bbe44290fbf279112a07fb4358efbc17212ebc475272d0db183e2fa570cca5d547a6287e82ee1f0d2ff02a6b6f01628a38884f6f39cbf479b890df5f777477e2bae184fd256063db935bf9a2a1920e103ad3f17d6b592e7c898f2dc70416f8b2cf901b5127578b5700904b4400a1cc24f5e465a38532dd1aefb01e7752aa7dc1ffd2657e8458923ba07de6ba824b264531d9338f55010f770e9fcf89025b8ec02d6f0e2f5971147b9299e37a70544c72ca8b388ac551f0eb63ce79752496cd925f08c4dd2b63a796c66023618e2ed6431735104f4d6940c6423957105acccc4236e98e1237a6a4b2302ec650d836ef4c30c4c149c8c4b76ee67a15961270e3ae1140ada2d23182ecea35aa384d57085e8c9fda3d2f6740fff763289f71a831e8c099fcfe4a0d8273b28d4e2be82967f19e86f0c2ca9ab4f10aa2fec15039689e95fb569cde292335ba471867c0f6be2bae08361c485a9c841c4ebe0f0a6d9569227e8a986bbf677fe25e6fb8d14d180c0a69ed48c02529bedab06aa752875a553df6f01ccea29cb2374b41ffdd90f4469672b32548c283ac9c287cc0ab22e0b0feabd3dba9fd90d56fa6c1f62a3f9e2896f4dd1cf42493e9cad4990081a27c88caef9661dfbbf4b6c663dbdc12121f2a39734b4715e92473c098ad7aa2893096dc23aa33be2c1993959710fa7395ac23bbc2809003926ebebcd4049c6040bb088c4423485c2f76c809f1726596c646bdb8366667d1691fe7dd59f46aa684ab6c8c31ed3ca15e2a5255f3d294997cb3e219b35ff27bbaff071c8ba88ebacbb69ee51e99119a6b8c67911293abf4a4053bcb090ee14ef7b60583274d2f4b41a30d73a92c3fad96dbfe33d53887e3cbdcd0711e8c9993b5adfc8712102bb468a4a1f674e00312664395e898150a39e8ca0e666113e1b36ae0602fb5dd7d8a44b9b18f5bbbb65c310b28b72caabc97eb3b2e700d4bf59c4b553dc37b2b62265ff316173e40f4fdfc68608c772927c5fbfe49679825dd1b3a8dee9852f70680457e741101964bba578b051066719b863caa12c38cb293d76ce5503d42fe7b2ba0ffebfe0d4c22bea059ef022a151bbb55c0c28cf35fdf7ba22004c6e33abfaf9527dece12588df388f12a5c41c0c72e7fd1657d39ff62b0ad844fe12f5483655d1c47c3d6a2853cbe45811421b43d6dc43dbde2e3cd618450008e62f6a7f3fde8ba2c820aad7c0dcef0fb8b7fce956f4159e3b6ace61736d6ade6300a32084eea0490d3f13d92b7c3390783a29747254eb2aa0addfb10026f7ebcf027333c0608909c2664ee3e4546f8e0a44ccb0abe3a1484b0ac80e51beb2ff0e5b93bab5b498f693154179fbf6c10d257ce2319bc946c56d3c8789df4ad78639e49b7907088a99a0bab7b4ced2b72682165a09bbdd6506cd3b6fb7d4cef87ac39b685603a714f737fdba4a3dffbb168a73a4bc5300d170c5cb2826b843b088773114754614e510056fe7af95799a0ecdd285e3d6824287ca0726e54754ff16b2d30ed23d09fb21e8e92129dac75dfcc1ed459cf2fbf0b25ca9057fdf9f2ae01c129735d7755d53c97ff2af9c24ffd993b9b3db2641c2c237237df269d6c22bb8c91be4120944afb2120526166507f6ddc1cbb31ce6417a932334d0dd59a49af178519259b7a845ba2f07e447b909d23138ac057dca3c0471647c1d69ca7e28a04c9fc229f9ab94889de1b2b3fe13421b9f1d5eea29737953daaca4b3706fe954ac3d25e191081a065066595266945950a6a8c25b26a2805ef245eaf5581995d21b03ad269e332172147cb135c4ab81bdbc5697ef19022a47651469fc96c0770a9e70329677ee916ee878fff5b50b70432b4aabcb99387272238d61c20ee550216e0d93cc8c3673dee9848c239923ea58beed14b451b3fc4496752d4bf1bcef73040868a7abaa6268eefc3728d14c7d18070c2bdc8474c423c3cf4473e10bcf1a321364656595d3776e34de4de4880a1899bfdfb65cc7809f8901e190156798b9acdd3474391871c9cc04f98b3bf24ef7c4d587747fdc05eee40429d56f1251461cac6d64ca897338cddb56f61dc37a6ed648e508fb157163c00714de27312229e24736bc1e962933143521218bc1009072e06b3712e0d30606ca129343110eb68073faf8fd655cb16f82e8bd1634e4204776f66755979d4e25a0c93d714cfe9099dc6a958da426419033b377b8361129bf8589c5bedfa188eaca859bee42b4ea86f9a670fa5cb780fa36ce71a2949883c1ae740cafa15dffd8e9c44b88c7fa3ead280d9c623e0ef30f38dc9b0b09106bdf9f7c2447df741bd37d020400eacbd2e25c52d09566cb92f22405df1468cd0410d28dbc48bd1e2b3151fa9d6dd5b93ce27ecd35b9b6f977f6facaf70fce4f1bdc803596fc15a60dd37246ea140bf10ec05ae275223d3597c5aa19d4f0ce957000e886b4940c711c948e5b66f21dcb7472d340e0887ff04029f22fd2d8e9b404294b0915e54a30a5c996ef3a0eecde6f060cc38d1727292620b6fe2fa32cd71a935104c21230d8d1320df0bb9a78f56c6d35f7cdc3112f00472be526d12adebd3f0349dbec7128aedd917716c7ec92b5aba47f52207545ba2522c614ad462c660861f58bc235224969a9dc07b85adc193ba1a3373c0c0572a62d47b8fd57e1fa257d512a59d55fc883b076bbf8fcfeaee45b3c09312bb2cdc52755729eacc292924019acd6ff73064a9c6d4c497690cec0d763fe47cac8b9b6dee088ca0d0ef0607a4a7476556924a8dfbe42f52dfd7b41058bbe563c50d6184f3671562c564687844a460d5729c38d4050ac0428421f8f7e9b604d3d0942db4f89257b7aa93ce2bb2996cb34991543268f980d42532c9b84b75988406055f7a041ef001b8b79d0bce8563870f6fa193d03d4167026a74f5f6fad2f154d5fae917eb1a5d890688ff4f075f7996d3e967fea5b7c93350025dc356087dd97c727558a55403aff75a5a725a8ae4ccc38e2af21dc2ab9625ccb21d84d99105196acd49dca2faa1e648320dd8d7fc8e4212327ee54a83f91c22fc2e945b02430a66c08091451effe08f513e021268704fb2350f28464743c8bb86bda70e20d616a7dd891c3df1a0a73239a7a39a19e19104cdd7a3166019fd677384d71be0d107ef72ea0973b47d76f0bf4ac7e94e1bbe7dfbf9fd967e2cffdaae66552d955d4573e907c125d944c55a9f0bb5dcf833d96556947209125bf4c45c655bdb69bc0639d481093c5b97c0d7401b83cd6e6e603b3ff0058d36f3ae6ef087e6019be08cf87e8a55f56ef6351fa703f40b34430a890de383aede166547daadf6c7ed9d9b593efaed9212cdcea0026472fdfc1a8827506b32d0460d25156c4c583247f7f591aeb3423a7d362880d32e370868cdd83ebf1003b931575e673c700aa3e0b1532d0807489c062529f2c3937ca668a8a6c071387bca35bd305539b5c3b02c671e80519c4f2f4c32893c123574606ce8b0569dd3350c97350230f5c3218131158706856e9f8bfa8a7e7e3b7dbd0dc30784a49d9cd9ccd947b1b4756e9835c91f964314116589ab89816394e65709d43f71acfab06578408c3969fde6eabd0a05d0d5ce6e04a79761de023d4d1609498df71250c7049ea4c1fbc5254fbf6b6c7e8a7323c53d65ee5921722c367e27bf0de2d6fe3c147f46f7d90f78fa143533666693cb560e3415e365a3564100cfab98a014052bdae9c71cafeb221c58e98409f0f924cdb44484d6546a7a32fd0b6cf570a815387d48a59dee49dfa9918710edb05861dcbfc96a8a22106df4278fdb84a0482ec26487f1ed8320ade328de839f50855134a63062275c1b93990f15409fd6dd60e956e7fe23ecf69f7bba5aa94144df1387cbf4d4f447ab7f8d8630170f45d21aa19727157e19bb02074595d57b598d05d73c3bf468f1eeae732d2eb262f24a3039219c9c4071a2acc1dc61802bd815e7c03d6ae74417e0379e3a8575c625bf5eb42adfac8e6ca33d8ca386afc14357da0173730de4049af446035a3883a9f10c4efc6548b4200fe742c476945a23dba6d3737c40a0e02aa44ba4fda821c73ade36cc02c6fbf10aac577b7b0263441261379e3a4d782bb177f67dfaf568f92b336772d7707a809a7d3aa875857ce1a89c9ae6adcb0d010d9c01d02fd6b7c38c580c0a927ded4a20e020240118689ef0e228e6a84ab7cb5d88b7058fc2eb9e8f67f77a285c4d341e143515e11e8f9219866dabf30a09e7ba3de1cbbd05b1cee9acbfd825eaa0145988d5a8877abf20c207ef323c0d8a746ae3588589d62519dfd2bc2ebafc9d1175267dc1aa58b10cd085c1f17b730ea6f1142cfd284156671f088cbbe183bb36566e626c3384ff517a1428afaf5a08368b8dc3bb0c05b410f0d5d05b1126196ba6b76361366f7177efdd68257201286fc9477bcf6fa7d24d25afbae46ce3e3f37a5e7b0aa55fd54028dd344a0ae4c890cfd4924193cfc6fae4d0cfb8af38e2878b756c47a2ed26201ef471ae46c73bdc4c312f3e9b8460a2a4ac26162dda25ebfb7d3f09a96097ab71b9537b2e28b4328c94d29b91225eeac3349a1a47d1a10dde2a23857d7d7f9ba6c48169811dc902291ba6bb36f6933e17605cbb4e30a3dd34a15754fa9859d995100482f75db689e9d982e4534d5ea08f66911a7b0c229839ce69c7dfffc2497ff79da209741d4774d03fdb0f2c885ebc6fca90395bdab29888d54d414c8e600a754af666a0ad49cb978eff608104dcc73f4c830e1327736f12d4aca4b8d8523e7f624ba51701ebeaa973100e241d14d05418d929a5d1d801761abf1185690716a2ae681afd6457923f2967c864c70159bd126436a005b197fc9217212d81a91ec80ce075dbe12455e88764ec08ac72f04679fa698fda34caaf60d07b49e49380ddd4441458541ee134214e3a5fff705128987c88d16dc25772fd9cb19612b82109609a47b894d03eb3d2340572e013a245607aeba5e975e73612a44888a88da3e903fbf9895bb3237344ef2aa9d86b82eb9ecf6ef118e43b49658c2771a9d11f229b856b3300fed00dd3fb0de2bf4d7b1dc577712056d17f2d71717ff7a0196528687f540e7fd1f0627a61be6f4a58b8bb3244d39beb808c279cab6c370e2e149165d119124f4d9e0577998e56154516eb075dfdba4242f0a35c3f081c886337734649a04dc9848c42baaa06d712227ec888888c87a1aceab18ba4df215171499224f06cabc2389368bd928842e68c0776b41e0dc3febfa00c20fd2e379f26fff27e68240b301bcb21c9fc129f7249a66f1ccdac22402620163b5e3cba1b90f5802b320cdf687168e48b428861c82f75c3af613ba24e2a540ef1f7182269f524d22d648f5d2b81b3ad5646507e671493b4bb3cac8183dd411db242add2ab32a6e70b69353f32352e86b3bcf131b8b7f41d7d14751249904add705998f284ef3792eb76b5ba22d4d33ee2636a2644fe67d168462ca6388d0324263aafbe3875ac57cde24b7357caaf830f5f837305d8669ac385c0900eea170660b75a4accd6bd7a9fb59ccfd8ed985402ca2e3545f5fe8613582eb3bbb4a914fc51e17f76f1646264b82bdaf148187499df00df8bc182ec06bdfbdee56e8cd754adc5fa7556c426320b22ca1da379f68a0a7c5077e61bade03a29f001406ac6f86d88f165d680c6bf565d33a69309d3d3987f79355eb48811f4153758ce8c2cd030edbc65eba1454f567557be3ab98283699bb3a3bf38c9bba05e31e7700d2bef0456aedacddef05716d4027392325057842793c244a76c8d14e062b0fadeb838a19dbbe83c6bfe4ac5a1691b92e3fa9b9617a210c193672a4be2ce6d74cd35c0f33922c16c3d8aa1e18248c4d9fd1422d8b616bff15a781013f42d0cb3f991073aef4a808a9db34d297804c32cfa4fc04f3ae14c5fa6577ac18a6d8000f09e292eff33f3d0b3239ae334f97119e84112904485328efbe95d69a67ff5c2f659bde1c88be6e6a7ae90facede514732f736763cde4d8b4253a0638b0063703d062957dd154d496c7a7713df14441afae47bb4763947075bc9aaef9df92b69d967ddb073de59d11de21cc44cd8647c600e78096031a216d64e1949295633ebeedf1901cde3f300c49b228c76efc2aadb1dbae929112635aea7633025b55713b4fd1666fd8382e2365037544d22b3d81e0230a0324b0089262404e3effb62bb03c662166688f0aef12283da5db12e67df46b0049a2e1349ea74d859fbd43274f2db6fd76505c86c8ddd8e776fc796abf7841f780449308f65165cc34024b7c33aa75f7797bba077cb1428c495c75f1b91e340a2416c75cff1972ab5fc1b49de2b0f2ea8e0319b6edbe1a56f2e9faeb750a0fbbb5d95fd65a212c7df4b7b9b59e0ff5c081346ecbae9e588e673d0319d76272c3802e515f444d3d5ab4648897487397992f6d26bca4071bbaa677c5cef3a986d629cfa4e05f76e5655852898859e8ecf33aee9d9591824867cd12068031fe9f551dd9d1cf67d604b473d940f9700846fed2b33667b0c510188e11ea53f62e5150b72f9318799b4185d454d882cdceb8bcf9e86b1d6783286bbe83ff40c808ac2a073b61f80c0d72a326815671012c8a6a9a5ed456915bf04450f3fb7f106760a923a68165c5ce921ec8476baafb1dad62642b0d9d1b9e4f5312872a398b168ba568ad918fa4b7daf2ecf64895282dc20e2d151be036d82e8acc2f514a263b92df5a0261a201af7d7b71a2104a7a29f5095a4c0ec6c8bf43c2131d924fe58ca97f53edc4be6d20b777ebb2c64e0829d9c32bdae54b4282573a82e322a5f07b20adef06928a64e141fb4dc40009c48a55f4fc03d2d36906a47a6d2b43a7e70a619198c83211c55c38c742b99492f74897244645f8ab741afc8b671047f4c214ac881f0193df1e1964b4475c2cf668e76a3cbb211aabda17049ff7488120f8f3e5186de8da70bd2574c05276b5b3b2162a8a7d751bd71ff2667565a6e8a5031a5a8f2e7e2d084ad612351f33529affd35926f083440ed4d036744338c7d64766c2f5296590da6fffb6c32e8792fdde0267442769490f856aa7886863585009423fdb21a9769c6c7abf367cca2786b677f4eeceeabdc85c24a84dd336e084d0866bd08513b4addb4ee6824e5bdb3024ceaa083c3788b11f0fcc9a5a0164bb6f6939e96d351e18d0799afbe2f312b5293f2b21cbedd8dafb93b992eb2d47e0f3a6fde963344b4b8b77cf465404058458f21495d952e225d09f25ae716794d2dadd88ab8d3d4651b032e60d297fe89c9049bb552f712e7a8cc0cbae2c4a4b5d061a5e7502699686a5b1dd986a662254752ba91d6884cc68d5871a666def3275d35b3928f32d6e93a56a5a22ec0ea2e1fb8822122d555825424eb2f4a0859b906029e5c37442e174c092acfc6f4829a5239fab290bb24f4ce59a65fd4e80151ffb0817aca794759ed52803987d2fa060e4c9939a179765ab04e8e5d1ed4c0afd3a4cac34d5ab93eb93e0964666a9975b9026bd47bfdb1a3aa0081b989cc81d31c3e3ce0fa35d408f41f8417e2f787c40c29296b8582cb2a5e45e3fcf524fad9397ff9717b72f828e4589de08d50d1b73038d600b0c096f668c862674ea6c10bc068ee2016d093c2248a0c30fb26b5ba5e850d115f98077f61744cc5b4a1888930bfe2b9e30d4cdb096c7a1e31f3f0492e7b5158ac075d3027d04bc07840b56f9e768f95573a3a4afcb9911e4c8893cf4243b4fb8634998e2cb6b9a2c9da0f7d695a0f2c83b119e6dd962ff722275bda7726a85449dc789b4d16b5801f30474b76ff03647e8a2d71dde22b5d33bc74124ddf5e0a2976e8950d6117a5c2561464ae028668962775d890e1bbb49567e482a4c30ef247141456549fcb8d7b9aa23c75e74369367a5d0610c515479460ad39119cc9db96856fc1dde8517105d386157b2f6c23ed5502c2c2a6500df5f3db6267633032d18c0eb706a9e28ab79414e547e20fc482d0c470babad11d2265c160f0acc798ef6993467f5a161911991c25aa705bcf7d73eb50742e6553b24e0df7f6dc11727cdbe5dc9b0fbea24db182f5767ebbf0ff49107f436d0bd2170c8ce8d688ab796584f46d0d5c4703e825b4cdcbba5dd64ce9da831152ed92fdfaaa8abf468dee51dcdc7cdc23e13d0b546a25b609f49dc5af5d0bb12c8b892dbe5408570e4982ef7f69557db83b382f2c314f0b6926d829ce6020a68990e9870995cdb8cd58e8d841d9c552b0cb7cec39ff4db8e714ed40e0fd649feaf46d08c1ca17d40531e8fa2210bfae44e7e02917bb77d7c30529617c72ca3ea573bac6d78d9d094bd8e0fd200a856337aa600d70f2fb3d17079dcc227131c6e7abf42b4cbfc7859382bc9d4d790ad9f62f7be15ceddb28f240beec53cf3c6cd0e058ca4d70dcfc972c6d51420ba84de5d963e06b4fa420e2ff2be12cc2070cf8e72effeb186b318f056f4626d3d1af844c58ae63c622467cdbc482bd3901b1d128a7fd71e2250b122535df514425a402a8291538b3fc7396c81a7eca9863ddccc6303e521292f1d203027b0997e9e623d5c5a472fc450dc02772276cbd5189ec5026bc79493f0c53fb84c6e3c4b18bd974de29d00e1a6a9ab5c0cb24eb112a896e8628bf12b0f17257f6f4e48f9f5178a393e0858f3b5f2e3ed90dac118cc568e5cc68902a46a50d2e3eef41c70105e2ebfe00030c7d259efb46806b77d64be5ef547cd43c4e3c3b64829f8f0eff9675066be247cd744e3f1205333f7789206becc8d924594d2880b1a4c4f5928ac206f90b01a0e842fa7da8f119c7f02303e5f1bb62fc4f91aebc45d5e439df51774b3ecbd299ca5afdba7822f6b30975e786a6e9126273c8d091a14d6ec8a2a634fd6d58132459aa3cb6c71a90e85c9548aafdc9b4dc0936878ebb2faba02ce7ce8128acce570a6390abaa096aafb260e3abb5c02922576a502cae3ac1ba0a390a2a7524858ebb7290455356280809069921de0b2ff8ffbd8f91be0097855911c1f4c6e1b2dc622a5c6c9fc240bcdb96c4174d45622547a8c69ebfb617d43be519b152588c96bdc0024cd820a682de20493928b1d88914f92035316ca40b38a20bffc407f0e24221c633b2f3caee427c701f15cb3eca914d61b57ab567b6585e85a7a5683daa9deb1e6aa4d7aa3c793c2cd620a684644ed430ef101e5fee403d74a29b7a3960e9452041dbcc434f8e6fb000399b6681517500a50bfd3a46cb9013a56894e5750ca58ab03266dfb11d5eb65a82e695acdcdc876a7319d3203b56d5b8eef9075294f50a25b5d23e8351a18475888c3280204401200811c4a41b059d28a7f9984cf87861e50a1105d165fcfb9265acb922d654a49262965b004d304e50457ad1a435974d8f715be47326f86eab2bae0e08e7ee37cef3d6da48bdc060ea6464cd9134877011637746534686ab2475f4b03517cefa96838dffb6de27bef5d39a64deccc24475051b584007195348ac6b53889003bfada9da39e017e1fe1fb9befbda7699affc42a6546697e9acdc6755c82480724175473ce39e79c73eef139e79c1fa99243d9f8a139731c1a7d83ff6ab987d0bd46ca3507b88b2065ce6b57fb39fc799487c6e7209f6f9bcf798d61021a7e172916e33a9691e7babb262a606c9bc4fdb3f177771ab6fd1d6a94fdbd1ed2301afce6f6fe813723fa7b3d8433b8702fcc8714d216850f81f742063e257f5abf0c6778d3fe13866bbeec16d6c2f0d5b740fc913bf98aece44eb26d939d8c61b60fd76f1741cac9388edd13f7f327ac5695371c51f72b013cb226011bcc2255807ce4609358f0d38ceebdf7de6e091d77b59f509d8f9ce126ad6cbe4ca20bf39981a6160cc3300c73804734f861c1c17b61030d9c01b22b1fff835b32c1d8f6b981c7f1c326c98048830e3628801f21b0496a66071aaef4fff05ed850b37d4d4c7e8ca591214296001c3609d905b1851c0be6bdf7de7bef7acb8681de6e273859b25dc84ef81f2a706d9f0278302d892d1c55b0a540e6e35b31fe37e9967cbb2d0602c007e083c1821112922ffc1ce01193153b391208b7bc302d2f8c1d4c120300785fafd8d57aadf01f01b74482206d07163e3dcf34865dd76e0956fd645e61188661188639704b365c4510f3ee65d9771e6f0c29ac42e4acf3d854d6410c4c7b57f86ebd432a7cd73de13512825e231ff03592825c2327cc35d281608d94608cc051232174d4c807df2dd23512a4467e144f40ea62481126816903c8d0430e1924e42384e896c03531e4c32d816b3a04c42d81e1ba23e4815b02d71c2110dc12b81e864408098648704be07a0e71c02d816b396442088590072008a940d3c66dc241bb25704dd3ee89fb01efa924c720c660638001889dd4f581f87b704b4eee3a7852a07bb3da8f74b71f3228db3e27ecbdb785175107dcebb2e373008f58985ed9ea18ceb06578176112b82eca2a1b88d1b19ba5df2d522c16dd13b7ae761f21c2f7286e5810b60fb2420d704b36c04816e96b1345c407f102601383052324758851024d247e0e6e498d15ad61cd8303782402d6fb8e6c135fbb1ab6c95cbbf52c87d0ae892c8b70b049e03a380745dc4d32639031f8901e42c31c6c930f9b04aee5fac336718f5c0429c7225be4c3fbc13d7195311cefc04a8eb58f7c5fa79cfd48976de5c13f5e951d0c31c02315a4281835d430c847f2188657407eed964cb5b17505912f076e8904371a78e79948942081c8edfabbe600675d9491d16f9f8ed16fdd827e6b172b760d03fbf2f2a033d0d2c086260e5df7e484f83174dd9302cc1f699c914622d2280169441a9146a4b100124c76bab8b6ac1030f85b84b6c0898ec0f791c61f2c1a87bc4abfb54b9d4aa350ad6716166741f32b095cf76402a206a34b02d73b0328b7e2559c6ac4754f44da3ed2f861633d827eb9934f71291ec5a1f81377e24dbc491bffeb9ebc284274d7170e60c8577026be44bf3557a24d86203f86330cbbfe85299ec491f81137e245f45bbb9c880f71211e44ffa15b0bffff10feffffff0fbf07e8d82246a3d13d71395e841a2003584e39432cd4d9d64f0c9c16a6192589d95423479b74826e8a8b9154e78636093efe6c65ef879ba90235da0a2ad15e474eeaecc51320979c9f1d58b4ef8c076acd88cf632a7d91e0ef253f8d3abf277e4ff4999b7ba7f6d9b903545bb5721b6ea1c0d6809b360aebf4262616400b975c0dce39e783317e3e6bdedde7f59086c1360d556b44ddec587332c543b34fedbdf75bce9f431ba31cf823bd5163ae86580a85d0698999738f12f411cbb975e4bd87d2f1a859ddc99e3b2ab6a2ea45a3135eb690a34e28e618c52f49bb2ee86ed2767c6ea8384bf162939685f104c32a395bc5c84ab4912e1a516e686113b9ee616fca9db383d0b931c184b444430305045340322f25d662d4a436947b274d38beb1f5ee91e10ac702dce2aac86da775da8e40191c255b544f075eb8200a0ae6871354a634acdd5393f7de0fd3a846d0485d97a8c78db4a92f629eeebd07b191b2e06519f7ea1dd5533ca59ca19f1971c11452787b37a258e93e5221e49c73ce39e79c730d547d5989b8d134a69644d3a75305f5fa3b46c988b751bdd1306cb9f8f4bd77ef91ffd85fe3f88aab103155d808851052acd6278c73c707e76f7a441a3f984b07184e95d55b180c4016324eec2206b861e5e1445ba2da1233fc58987bcd33b3ae190f1e22d1170dc7d0dee0c26793a4a415613372f7f7971dea623a5b02e97a720c791dc17009275595c4130da609e85864f14ee81de549bbf63ea45e3110846a792e56094a7ac0605711322a4afedea74531bff7fef67a20b2a250f139e7bdf7de374d6c66f5f0de7befed949bc4e5b2ecedac50bb16df7b5f8f54100fe3383ede29b9bc99549eac53a923ce39e742cca11c819d3fbaa39ec02ce51169c4528ad53ee75e2f98a0d8dc62d6943bc86866d1e4d15b0c6defcad056ccb4b9663c3c3bc9379f1b2180805e233f6b5b510d9e8b1f0b27b8154332da20a5fde303bf29335ab4b0ea0d91938cd2988b97d2ccc85e0686530bac9a2baacddc1d64b61be8419a7e91c928e155a5a9f352ac100f2cf92cadf5a198426d1fb8034b721ac326389d31b57bdca35f13ea8725e7c9556b79f646de3fe79cf3362d4ce26ee5363e3ac52d0993b81f69fcbdd74399af2f5f70efbdf7d2a719afe32b77e50e266ad5e44365c4df7bef1cbff7de7b8adf558e7346f4fe2703a4839df5f731dfb4f472b6648e48e3af914298370780cf5398bd5cfbecba58a4b68aaadbb23a47fddc9d6e317dfd0e2b1d0d57bab454167a9f732a56f2735ed39c53c3969f73ce8bf18c7b8cb12dd29ed738e1839c43ac9333083de1f1ae506563d7e7fd7d5f0fe90d6cc48eaca04d68583466d05a5f51579296073a3406abb8dc8865b76339447549eb4b1da012958b9d18df5b77e038f60edd9d5dda3a122e475a4329816d51a13597b9b4a3d41797c2a6a05d00db46983df15c945d783b639121e385ee284a4e488dda2b6e147bc509b53dab5b18de540073332e245ee4a84e527541aa945ff02fa32a967a0ecc0c63736a789c1bfe4dfaa12d1f1d084814791527986dd0fee1d3286b078a8c331943b72d5ba72c2d7ae5c20bad668e6887eb8cc7044cd5cc131d9d89164f781f8de1fade7b4f7326874b21c365efbd9779080d8fc4ce19eae425fc308d270e5da26d97cd08aa2ec6ce4e588db10b60b48d1d796163dcb486d3afaf0939751ce7bdafbdf772ede7da17bdf7defb153323cee7103944a68d668a267644bff7ceed9e78491d5d8a678d00b6827bfe26bc140955984ece839bab2c398532fc4a55b24863c5701001393498fd0e93f0de7b1f0f6379d8e701cd7a597decde7bef432c0f64d2a560a17c9a7136b192d1389aac72d0e09a62eea40142ab30757f4f6733422e9c22fc81d5200541bda0d458a6e3388ee3f885b7361ea56cd6a29c2959f6cbbc722167fcd6dcdaaad6e9f15c7500758a116246da0ccd899aa096704fe3e390726f3e6d271e89983c8768780c6ad633dec909c0a427e591900b0408cdb92071534de12785538a9e81db837bc0bbf8b700a896c60fd3cfdb8ab4351b412d6f29ae76882ed851f738c7d6bb0eca8dd57b4ff46e411575336c423b1bad794e53300ed3de310ed65cefacdb81c6b9e9a564481f189388b5a1ade8069052c038f9a46a4ad009d4ae1a418f2d26148277c7ad337a204d722072c6d03dffa8a423f6d78f0408482fac80652662f6b616e79c7b1073ceb30d91736b0b96cff9998c5ccc0f5314892a4e8f5f94f5ac050c98a70f8d13abf5b60cf4c3c3c6e0caf33292e6bc9115c1d8594b2f8a14dfd4b8e6e79cd87befbda75869e5586a14a277ec8c9aaf48f71a63109c88e439acce140fcd0fb6a0921e2c6d7073c58377faa660387d484dd41ce29e5d5920159a0c130bc4792dd26d320063f4d0d9b979aef5bdc8cf5294930e8c08e818226944518a3e2f9a04d0f94059a5cc177f531a7b5a2309448c0d144326f658b6417dcb18349dab9e57d293d24c9dfb7eb3804afb825120a2f7134c655178c9942daca05c4159802484f68e9e9472491bb32ba0e28ae52ed2c62f2dd20ef97c5f0f697806878daf9ed4cce4c14a0e9413bd83bcbd2a61da3c6d0ce1a8a52dd248203d420a316a5c2962285586785d44987ac600f369cb5a9b4e3da34f3e5a5501048f0aa112796241352c56b2ecbdf7dedf3137894b24dc796d1c55596fd120bd24599819cc8d3919541657296ce8dd90f39a20ec2aefbb1552efbda76c357bef9dc3f1c9284be6ccb987dca12a49a73895f14fe79cf839e79cb30d65332da09f3f2d8ab7173da60eb9b50a38352cfeca9a2566b85171ce39e79c1fa39e43b9026bd71033ba2cea338aab2c4a338fb3610398b4a5ba6c27e7c49e12205aa4eeb65e404b58191044386d805b2d5c5497a96756d0888ff00b06e6c1e9496ad9818615a06caccf48ed25284bcacc72ea9b55eafb7aa48221bd32c37b8f2285a291c2cadbb34821f94671bedea44a96d9fcf23b4566c9a533311e3c8455e5065ff3c63f402c2e6b7b3581b3c207fec4c072c22d916e1e14591025013815645929b1161b209c6d220097777b445c81d3c09819ca232d7938ae3d594f1961b530c57cb146ef0ad8b3d9e4871df3c74f9601de1fa337c785107e72bc0d57aeb4fe58959c39e79cd3b5f7defbb8ed314ea663772a42f643acf59db1b60c335086983391d48184326ac2060f04f455ce39779b672f0fec14c67358e31e9749ce37e7fced2a227872c3da83e2da82110624b41362ea042095ac2582fd441dabe961ae8a924fc2d35658979cdbf629b0edf7c011765d7765726667394ebdf7de7bef50e79ce7342e17604a48537c417a39bff7aa9ecfef0ed07ac2d1c3a923abd1b48f5230b1fbc3071386fd49b2f2aa4641ab5adf67f83e6f4b5545f34bc2896946d73c533c343b83273cea3ee57eb525ce9e4b1e762fded1a3f042b9f849af5d70637b4550d0ca734394b14e1f80a1909a2ebf1771149d39c3ec02f2d5c7543eb4de7bef5de8b9495c79069d62e3da82637740b2567f72e60e49cb5e0502fbe8d064dd473c66dedd8c147beffd947693b8b2d0cfd9ab4e23a1f7c20e0f4b6b0711563118783f375b39c1231031335acb3abd24a9991ae71df6a095b442af43b6d8aa05a33aaf70f179cee1ab7b88ed489953f6ee21437e5bf2b76d500397dd175b0f2ff89230ca25d36be0caa12ccbb24c75e1d2a5d9222c07d75de9dc5c6d68e1c039a0fd934bea2bdb361dbdb75e4978ec341b6fcf0b085c1e586e109b0f14a6222df3e0a662d3f3db37ad02f02ae5b9d7c6de7b17ba82495ca9ec458f19d3ea1823dfaf08c961f8de6ba01635e5ce3917a1e19178c5a863402336f506164796c7226feee9b953c70444dae9483ff34643b2d6fc05e79cab449b439973ce7d8a5a4e3e43411190095befbd57d3e60ed518f4a661bde0f18a8d87684aebb46635642795e3784af18181a4a75c20754a6ac63ee3dce382b4095ebeed1b9615c7aa62c9eb9af6bb152ba777a6340404a506156736a3f7a09d54938b32d59cfbc14382e28da9e85659442b7444348c088c86d5cece2b43ce0e63a83251c16b47f33829a0f0b0e5a008720e62333fb52acf2ded875acf18debc094631c156a4c1662507ce92fb2190f1c8226b412c8e8f4f04092da91611effba49c8f4b8ca934ed76d134c6ab7b11d2bcf7f046402cb6984e9817232a40b97a35a2a34e6be964a29af6e29574812f4a43865ddbaa267589b8e2fc3c3d6d58cdd9c5bb4c580733bc49139a836a8165f17ae000be31a6a66b131ecd91ac4551fae324e418db15a0de24f5d830418535576c1d79dd28cbe3d863263c00ef926f2454d4c41d201030069e4b17975975cf8503c26e41cbdb00b0f0c4bd6e2b3096de872957ae03b0610713c8d61342e76abdf07915fa92a4037cbbda581ba8d38d134022de40d8e848c97883abc1dca25ef766aa58928218df5266e5789e1204d37beff5b08f4cd9a8f0a249851c9f30b08d333aa9bb169a3c6b566c8d02e08a2b46ac4ccc472aeada8f80d9b0cd93553df9fc3c983265f3f2d93313cc2c8300567014c02cbdf7de7b57cef3dcc3ec718126cf5459dbb0622009b9746356adcd8b155411471e4b7bae7e87c53ad961bcb6e5de1a350149f209ee5df360d50e3b96569020e91b55c453b6305b22ce39e79cbb292ccfbee9dd8d3519ac14d16cc580b317e7544b96881e3798c80c19616a28e8fe98185c615aa0d7258b17cbd950caf2f6b1bfa85a33025bf8f950403a5393d3838566bd7ebab4dc28809d473be8492884bd9f6bb8ed28b86df6a694e0f3e0436c6ddc0eb8a2ddec77ad3a571c60993f5f6c69d68c5c8d23e1bdef5dade38b0d1eca36330a60b3731518ce21dffa2a311bbbde07b7dcb1b0f774afda6c440f34da21e71d8689ddec4683fe41cd69c2ea8639522dd3cd2a505b21a64d41ce1962355a4833d0a5ab2732b32b2939a9bc08bbabc351651d2488bce68ef2ceee56448015f563a2c5a905569bfac03697d2eed320a58e7db252ceb3fcfcbd1e9a88d992428f8e66028c8cbc6ac8a668d4a04a353a540b30e408e8a76f868e2c6c6f71be617b07e7c82851cb689576f650c1d67bb02769df64071918ba0b16d2deba85bb2af3c5fd5bd15a77c7f726995c51d5f04b702546564785925b53f3eba9a84ecbebfab3b42367ad790879a5ad296fa5a3963936748d3d3a55efbdf76a149cb2dc529ca7073f9e60eb7df8aa6ca701919ea8b48c38e6194360da000000b3180000030018c5912c4e34b9ec0114800620caa0c094403c168c45c37020100084418190181806000000100006822088a78838c4f5c60acd1301250a43bc1ad85ed64131715b0d999a1a5759224299a31c443d5685c06ae47e79089ea6f42f2b18d9cd7b88e3548c8048bdc68eb9e9828391c1b0599d64c0c07da1f21e3e0f1879597a857d91e7a21d9b001cb4ec41666a211b767e5817dfa2ac5aaa1240df4ed97943d92e1dffb819324854fcbaf808e2adbdda524e12f7d6913192ad0df0017a6a421e5fcfb42f6a4a876c03cf490dd50adec10eb7aabc543be9eb6443d4fa1716104c1d7302a7b3c349ea4e02c644f18300ae5b67b0afb0ba56c80d553c07bbcead28c02bc33eb7c6c4829ec6284d5c947ffe9217291e5c89040824df8937e39875f9fd798e5571556749788364c8624750026650b670e06040268c79256157523f075fedc201e3312fa14ed561cd31ee4fa550a0692c5eddb16d3add875097c5ab5c47d4d38885a9f816d33c19963e3f23b3d6d4e0952f89ee1235d15c91dfee3e1c7aa9ec6556c3450452d3d783f0523cf4e6ea389dd658c46e04ed84c8ee0b7435dd729e84e901a8736e3b240496bc3810832d5bf13f69a90fbcd7448769df23fbf56d8009801c8fb51bde25c8d867078549b24fc2847038d616a9d1b15643e377274c66c6f301002f714cb29e08ddb634ed4680d7ea2bdc2c5dd422f2f3c42557d4e125b9f7ef436df72eaed57510d1147e58c9759e448ee88fcdaf2377f7215051c8376c4dd0b09cfd53f005f37d87345078255d4bd39b742d235ae9685b6baf3f4aa0f64c65cabd122c0c83653d10709d04f390454e248718e60ad8d7195ef4ddefe7c70e0330792b967df4f358a3c27fe7cb5bb3c950a330c896eadf59c7b349acce2bede82ee72780cdfa8a35a6368aa94131f5885fe375c64ac55a1430da10f4001b3c2d1773d3b1cc0623cb4b7691ccf66fb2ae0abad2ac7886350594ab429c3296f3a6e8be17e1058e8489c0c9c27aa3df97902e68a1b7046b96e522c8c02c949f5749c2a659a5d4f03840ba4b39801ee6a6955d443350a4c92ca0a0daa6376205a865fe0f2528f213058a194df7b05d028440b36c25090bcbca6494465e30a8b82cb372f7948f93b9130795804862e3d866bdc41f86ace7b884f5baf5cc91a75eef00dc2fc51bcbd024f2ff316bf550b02b07999b31f2dd82e92f0e2759730a39160cf4832f96b99174a339610dd580fb311a199e9dd29813f182b92becf2f589ce55627c079eac5384838f969658fc9647f2ecfe5b8d2e84b1a6bbf4c1998908089b9c3362fc0992f8c17610217cb11c8dcd8b5b1d2f56c2ca621c64d92ac8488d5c938c63933b84eab32d9f008e06481052da75780a14e068330f450ea3056568a211e52297533053c2131b1d80537412ffb87d17dc9618ab2c140c0c18f8d4f56b94a2230744180b9612f24ad9d0df605ecf789f9deedbbb3b07b3123235f44015ff06f378a3ecc0797a3a0925c8839fdcf6373b9da2321621b718d19704a8f5e6fdbe019ab96179a9b51fb7d4235b6a90643b1d2140a21e58cc908d19deda4efd6b7eb22f70c2c9b4b83cc5021895969aaa04aeeb864d9592f906ecfcbe9acd9663d5acb6f8a4fb36ba88f902450299b103ba9cfc4a721b4342b8229297d9bed837ca3916d18fd1f3367459842e133030008bdd01ccb21db3dbe63911ccb35f14aeb20e10e3a98f5e77b27e44b7129e2e0ed5113587f333b01daa19e300e836537151d0e1b5e49d0a4ccb3dc98c630438f08b9365b73b8d7f487cf1d0c0f50848ff46dc931a3abe77613ba2980b77536cff04d67c62e6b17dbff09a1de9f4ebd5fbb1e5a27a81ce93a5603eea61e05a33376524ee0fc7de32b22ba8644a372a87437fe053b8d3c7e7a4fd56e3045954c52258d39e71b98ab25f22f8a50f1fba47910781e2b342a1426edb8061b57f2adacda876d6fc253630d3453302c269d417f489cb91b1e782abf29deabefbf32ebe1da9fbf90ff0cf694e75fce83d0d64d0ce0acd6905fe4f4e79f3311309e43a00c758cfccc9354201fc3a60afcb3d81c7a0210e410df4006ac7b898b60faea62a96e602def71a37aa214945e1bc5f8a326ed9c17a253d65dee3e8b1c9391407b38e81c88575fb71070a01134b2c72b94c2eb20e6cbcd9a66143c5e3fdf0a5855100bd4accabd14e0c3152abe3cf745e665ec57bb37628377311336a184d82f9b4fa7236102addd90dde097038760de283648d6332806ed65490202e24a802a718fa3d6e39cdba0fdf4a8ab26d35917fa4a59d92ba1c6e7e904d3f7b6407baddc9936b1694bcad16d7525ab9f46684fc250ec952c140d67591e459601b95229a85064ca4c1be2d96ec0641950f78df36cdd01cf0d5b08232184f1ce3632fa1b8558790992bf2037280a41f677045bc29665297cc6d7a35cc1fa929d31718279707532c518511c50bdc8bf4b78530d421acc194df3769d9429bf790cfe6a8c165569edc88d65368c0866616f8cf3cf710f947128bcd8e72a52a23438cf2baee3d02e2e3454118ef51db662550f7e7ce2b078ec012c3eda4c8a926bb04ea0cf2f3f3733cfce960cc5e2787042b19ced39f86a4cf6c939dd7db833c2a5fa7e55f7b113e34e2080a384a2802987f6794fa2104b5d7e311456f687e4c6ab7a6d7f939dc541bc48abad4158d588a6cab55a0b5f920c18a1e77e79d086599f9358b28c9a04931b9f901e976821a686889bf4999cdff5e82c5a55830165a37274f329438e101bf7392a00a4c7ff99aa4dedb8473929385f2321cb8ff4f78b4b24eba86795b406981d7203d61b3992c3a4932290105e3a658dde612aeb9abe138eb86b477c01335a542f3bb21e5357a64a37b802071805eaddcb35759b69ccf1dbb70e5feba1cfb5fbd5293f9d12a719defd1c9948d3177fcfa32c73c6d3114eccddf7ca3585c9f03ea0ec49c0aa66a6e8f1e2e504ed605338f2cb90c29feb13530da7fcf9955427ef3d98dadeec46fa40ed418023009a2fada18235eba3f9c445332144274beb9b2e8e0e5b982bafc3862304df329e56c88b219a7045ecdb762736f34a9525300dfcde69bf716a08687861d63cf48bc632b71d6e838f014165efd2209fb19dbfd183b3774c863f6e9f68d65909053e44cfdc900df5aa331181456dcf7372c720f7d6d3f83fbc5e8cc119ed7bf115a2b90b092cb22937ded5c600a716382b0144ba52b9986178d8caac830f178e1af23492f0f606307fddfd353580988a692bba72c8a51ac991329920aabc3e2e6f55c46ca78fe2c265d42a3b883a323bf458514c7da115e2f8470389426b69bbf5170d6b45e31a121023f31057cad989816d0070b5a919b7c4cdfa7456e9be50b68694b1636d1417068c828b8c77aa3b95d5895c859813ff3858bf4348dcf8afd133579623b3b4c9b6ff9b2f5da44e7908fc4e79de2308aea9477653d76603a928f1a57aea61a4fa28477c622bc91a61633a7f7274290736cd9cb3e905324fd823b286f5d13ae52aa290a1e5ee4f5d7ec26b78bb87db2f003fd087fe2a420981c81b07e4c848b1432386cf6ddb1acbd951c4310daa833633302af68f9d3af4ea3f64badf65dac4cdbb14e1bca4d6af8ca752c789a555a19d6460fb95fc11449f96d3313480c8c65d3d9425af2c1ce99f1f4a7083220518b4dce51f84b512d45c7893225000b34ba7c06c45c5b8424dceb47ecc9620d6f4cf056a32221afefc8c5a35f6f2656346b968c84fd0b138b2057a474ae7236334169b32a31460c822399b93662fa809594a00ee35ae7f484b2645c13d5d700d50a9217bc9d1806643e862d85918d3f3de599e0c9ed010b2d5e6d324f0df81622a3b83eabac6602530cbd4617af47995c10066ce6a04ec131ff5d798ba761393fdcf10c09b5186a12675332a1a04e6bdef8a715cec1b5ef585277db8609a26b8286366b7bb09a4b71945224f4235f570e4525354acd59163d9b22075f5200cfa6f563d46386d3e0d0014d0332e1a3b121219e8ba163e0fe198711d2cf74e09ece57fcc7820f9cba11ccb20469162b94705960fc4564fc9c9ff13639b331603d7e7f183b4ad48e40923f99aba84c3e622b5872eef04c40398db4e87892f22f5f0f38a38ca655297d2c0033231b06f11bec2864501071001b8068a790747b84620507d08e0248d0fc7b9c96f914120c7cd92de55d59994f36c1f7a345d8587b2228e14d0f2f82f695a6fc6edc482daa891349cc22e0a8e2479de842dbc4635ca5112238e3d74741b5eb22073f55ddd30ad2631822c6019665e15055c03ee4a75123b17dbb34ab3f3e68e23ba6d78d9978727d3a27efddf0c6794a55f5ed74b82d5e341c5071bbd4f37be2a83bb11f46b19bf492ea71b51522b8f8f222de83f33a06c1b1f9c91c2e8f15b4a7e806068a2bd436666d06d3933dd037822ce93caa6316da8641eb829ec099f78698756440eeca4515cfcf24528c84b80d22f1865ecd932237b3e2a98c45953516ddf7e2e822ac882f5a451f7541399965e31b7e52fb98467825d9c4a03f249285a3754543bc4b4ed34174d20f48b2f28064abd68a1c9aafa2b02a29c30889f763236a2fb074945cafa2c4f5502c024e2079180e7d0b460c16cca98015155daca2fd43a0de01988450312f23b4a711050b9939e7f2e815c880864bbc8c26576c01cd992b2c9d32e1b70c25aa76ae71e427de69ab02c3410072c74ff4c72a66daf499a174d4511ace44fbb2355e5129d0b26ac647739686161c239db40bd1cff98acfea42af376faea51264626a2ffbcf66c2604691a5357f09fe1f15afab9d55960a99c6786c3f1b0b7194a8cf533d27332f517e9090067f84f6bc37ec1e60354df0cd4d2c28d55380577314c2bb76302afc88329d2ec8971db79cbf291b69e16f1295e68361a7149c9410983f95381f2672e897ada5bffbebb001e6182d0d63939b3adabbeb169586f1dc49495a25f11039a803192040fd5fc03aa95df1d4677eacb9fe0c1d4b3d2d4b77249515b342d2b06b742e5405ac864127d9e1ec7b986858596112b9aa9e21ebc692f17e57be7fcb1ee3fd3a16a3f36e3e679183140efa80b168647f7bbf6f3b39c96ff6adcd4144ced58198da0d6820823a0e667a6ec4f4d963e6d187640a011c24508d24d3b0f23a752d303b4b49cc9c12fede5110f9174edca78e0cdb89a2b08877463da16762c8c432164f1f708c532b0f0a184b29b8e2b214bd71a4996c5b3294917c094dad125707d721a06266357c563621fe4abaf2462342b5012c30da1544dbd9d50daadf4b97532f2a8f0f1f40eacb9121af72c4c8cf39fcb105d22898a3ae5e45ca29f547912c3511c94fb44c5218902bbbf00e27a0d684ef8c209f8aac90a67c26c1c14d3389cb8b5bbc15a928279041b4c7f563b2554a71dcf1e805b6c76da52905c29296b164692e19b6b80d3856a4d3721f86a7d8eb703c71eee413751a638a3a0d2eaaeb6f466f6a7e8e01141a56388bf7731447a13559b31034d13242897b52a77a1e326306a837df87cec419d892f2bc6548d8ac2ca3d5b46e254a322ea8a6bc4884291a43947e4bca5df9e988f62f99d225ed4122537eadd1e1f03180819a05a99d920a02405c84e6329aa19fe206879adf91c09110e9e65d9b90350205e7062a9aeb29a69f1e63a0be5c5f1df7b9f8aac9ca881fa3592398b3d122d4797c41f98a0c6c763f0d4524778f51405e8c2c1a13b4276fb808a710c7b3cffaf103bd096b1ac73881a9b568096e13e1c1aa1c17123ac88ff30b41787785753f92630d9b30294deeebf644d3f29209991328ce81c728996d5621bd035e8740fc9543b0d9d372ddba5fe3dc3b7e5c806dd94328975db5526b95f947b24e5c2a4701bd48eef8d451943853cbb00ea3c0c9c1950480725f360685379f4943ada65b211ea0206afaf76b856287ace74251053eefdc0e286e363aaeb6579980508fd1f8272f299261f1baa452a15ad55add9e1075f4ec01c0492905423d7fa322e87e22724bd1e7c497c88e8aec277e89e38b77e47ae9698ba5a8d44eaca1633d1338ab9a864294587cea9be830bb11f89638223d7111785e000480b97724064f2fd5854b6d18d167ffa8242ccf0fb150f4b9a44175f95bf76734e2d8b81539ac177357f1ebfe72db349579d4f2aa4c4a3f2f6a1acd53bcbc156899792271b6c336929c01b2ef13a00069857bf83e293db15c4934f7bb98c07e02692b91fcc1456943a7e80796cd17bc1b4a18fc109058f04112a80e0df6040fa024cc626c90f43f67f75b90a21f278e2be846d3ff3176288ae8a12f1556ca110c6a822f6be86193ec53732cdfafeeef2408c2d7989617a3a08827ef96baf75b303872b26a78feee79ee70230dc24f976c481aea0d6a700b33a05225353b9aaa1a35bb0eb4ad4acbd54494d966c15b9cd3526dfae0ba5b097936e82923db9168af403a587cd91f51d2b68798b76fec618f70ce99dc0220f4b1f70642d27fa43da5a071cf0e3997140a9b88a6861579b2d716e328f98a00dc379a405b33d0881b29ed48c280ca01d3e072276a6ad298c69e602f19468965b92ca7d4368eb4eeb18e1f6763f7c254d630ac74ac6cec7b66a647110a4cf97f447c9f312dfbc8d71d3c8c4532cc188e9dfe88b01f28aac70ecacf02a53dab352a585d48c906902283d6435b83abb341cb5ade3810111aab9ca0ba89dc910f8715ebdf0aae8bbf696e57931077bc5d96dc283031a688a3a26716c7bf3a52fa06c603d022231c614f42199e17c464ffccbcbdb5d944d997b4ee6c62ad10bb9008dc2c5060eac57782d2619138a926e6c9671b7c013be227ea331e4925130a144f856b03cd6d40658f19bffc3395ca9c2dd688d0458b908a733cc609c9601a0927863e7f10a6c07dae11a828fb52d29b809ce67838ee5f50ac0f89c1f1e9bc19ffc30035fbe7747aa05f4cbf06b32c8434d225b4c33acf45633285ce388e0229cbbb7cad2cc03333434cf315d9bfa2d3bb5c8d99532f895e6e591c187117a5c4a950e3922563919fad8843a5a000f6b89e70a57c1f15c6ba78b0469c2076e685826847bc5015f40a0877392c9272115de16fb2fd89be8b88f0b5899ff8b4240ab6d73b9cd0e2fe810e680d533ac7541bf8d4f2c283c9663dbb5c2c74754c07f9f30d774ad10abd7e34f8045956aba14fdbc85a67a8a058a28a4a017185fcb97c6ce0f26dbfbb889405c925d59d4fcfc55104a65bb24fcf8cdef4cb75932387259c852de1a29efdb0f8646c450b017b35e66709cfe2219a73fcb9f54daff665ea720397ac182b577f33add929d75de41281c56547bd427449a09999e7c6376f5dd2276639fb4cc41b3a23ad521c16727477748604d06e56c08d4a9369f9a3941578807f5bfb17e80a054137db124a8e98e31ef9b18f1f2ab1921cb3eeb650aaaaa64b639e2e9c555f52eb237b8a335394c13efcdda6150bb5a26cbc74dca01197524d5a2d461432ca898451ac8d9a675c5dc00bd82d951e8a4a64749769eb971dcb0e9e7f1c6a8b04416878ffd73a3ee7f50a4f1b46639eb32930538c9e88625125aa15447c3c8b9a6c838e11c0dc8870db8a11ae1f7c64436f0ee1dbd35a5b0fc8866920dda713721034c77b075e41ddc2319bc1db025084ca638ef06f3f692657e9498bfc21c29ec5e77f7760631b99c7a4e4ed8ef97f3cefa5565ef499ed93100110dff7bc9a9eb9f359ce255c62e9d1f48015d38db08cb4cac532897d51453c97e66e1ded88ec0c2e7c8573d2086d0989daac7ec08adcf505719128bb42f0e89715b08f86be0d4e143a7a4fea83207ff9c69f57b2cbc4c77814ca0c18bddf34fc68261caab714103868355d69aeeb561263575ef73685d443760860a4c4c43559f98993e9d388c96ac914e055b09dcdd2cd110fa4b29b2cf2179d831793e37b22ba1c9770e672b9338a14182d2c7309f630655653eb2e7d226783b4665b913d3542659268ced1c4db68928cd1d3b3c11094c23cae00053f7ea8f99938ee96c181640d3ad6827c652b244893127ddaca96e4fbe1dea68a24198db75aed33f5d34b49575bbb289b980f5deaa0941ce8dd3bc30b6cec0968653cf28d5eb61524c857e6b936757cf4128d40186565bb9bfe3c4d39f1ba0f6077325c3642013b7c10314c88524857fb3e1f8df306a83a9514b72592ac58f5494586826cdc652adaa17ad29a5e8405d84fc1e9ec3d5cd3b2e9329d885216190a8c59f7f8be43347ec50f9af8e1c9476ee2e8a471b7abe8b1a8e923110fd7da67ad3083e622e5a776e098ea04c7b9fdb2a066203e691785c59acda15fd30bf9d4b9b13c634b1e1f09139e4796268e56547a2af654a0c6b3b4f94494757ed72003f813a158a4af59b858630ac13f9731744781bc7019e9f139de9e684a3b6a8c75f7d804248812b9c15371f92b2c1151fb8c03363c2070eb5cf99fd033498a9ef22ff349460f62833bf967cba64432cccfc09192423c379329a1c0c56c6768f828b9cc6db10570fc580f41e77aec6a05061f257cf1fab7987933eb841382b4848efa2b5ad18e63da6099ec4f3a87838dffdf1141627e054414d5ed80d1d0a7c7fd449b8bd1b1485c74c292222c9ae122deb5db958574517cc0471c45d9ded8d383531271ffa66ee679d2b9aa002aace2cd0dcad2152521cd971fbeba9e5589ea6cb4d5e82441f20e2d3e66ced2540504d39101464e4900f475af90a6f821e746cf7660c78464a408b507bcee0640e324529d02a8866a55d0161328ba81ada389ff5e41b244e974e4883b1eaf2b53b1c905d3c8c476280769acac36a72a4178eb9f8d9fcbebac6e1d1933190e821029cb20c3e14a0479a8b5cdc92f3bbed29cc7567b7342ab76e9a40f5d1d1884563d538b678350491357cd617ae16fc45b09d6b038472fc4e6acc0020405825a9133af04d07632a9402ad7e80716d96a8865da909157c07f6d00a67ca6c9f7af151644e43666b2419b1cbafd5ea6e516747da59bc0d6274326b1691d921779c6266ec89d2198e3b498ce9fb58bb6eb1335f6cb58ccca628675ee2ad6592a7fb4b0c63dac22fd53080eca5175a528ed7fe268072efd9f323e2f06e52088787bf18b3d735aeebb03dd29c400bd57be604b4dc071e14e81c8806b1a75069019791a56951be189d3a7411ea5699c32ae4312607dcccb189ba71bfb35424f1bab6364c4bb543537a80290412766e22a03dbbaa43e29800c0c26ccf458f307811747df8d2903bb8b8c6c2bd293ace08661ce3d6a36d669015cc1456ad95ac930fdf20c65011f2b73a51aa3501094a625d528f7b1ae0c5f0944a1c9e847797e3319563cdfc20c9e853d04616580a1e318142e955d59313b4bd149d8fceb85d846c956952d3d7a9d8a64fc0704297c7c01cc506a0c59fff4133247858f9f2cc20c338f1df1112f916b8e2da12c8069a38837ef561d627c3b239f7c71721af5d8acde8f4cc794e10ad332ac63046a689a2c035d76dfb8cea5d48d1a1b2942972941e8db279d1a73b3d422e9ec7cd451b38d1bed4206292ef3ac8bc520651d14a4debbccf992c5ec0c3eb90b822edf640c46a9d686a43c0cb811a6d94b97e156402dd0e550672cc0a8e57039481cfa32849121138f6a90f0d1d8881e2e37de87b6062307a908579f41afaa4f2a42123ab133f472860455a08c502dfc9599df6669cc115752778374d4e63ff53fe7ac4ba549cf78978e9abbbb6107a0b3eb2898156848ec554a7b5c17428f36c90c4bda149c2e0603c3f9e8a1a03e1077632d1dad6a771adc1aad8a492796e02163da460e8cba51af575b01a31ea198132337521bc918320a8d8666f4915ea633cc0fc79dc5b1996ad59c76e270fc269f848a85e9713818f452c7caf385ee67fad17fe48dd4e0e25997b9812b5c3e3f7f6c3141d4a572f37847a345dd86bd367ca6d7254e8b6e66295f03db85481b2e1ebe9e5d48cfa4166b5a32bce2780901396fe43898e75213ec441940e089c8d28e44cb4ce103cc3d86b2d12c19dff85d64c3e8e957a0d6dd3c2942806362569bdaa77ebaf31c92a478af33cdc5e656db284a37d3c5e68f19107ea34ae72f47dff3ce698ba538599fb8852488e792678a273c83c18b921b2be294c70e527430b1019fe14a3eb1676ae83b05fc738687122d614f79351ba3380f5c29654710bd664030b6cacd13393d1572c0407e8c3c42a0a7a2ae272f0cc820b00fcb5609ef185b194cd22695d2953c0bf12dd8ce18fa469e906204660c4912166e666b6e22acc0bd0dabf14e670ca6ebeca481cd86a749de45645744e19dcdcec5be96655b9a42c39de84dba9036fc1c174751a98e68a7bcc92f1a7439df71e2e045e4103f3a2256b7753045f8c991253365989cf4984e6954d62c9174ce0ad444965321b66c654135440c1b2f0e3d807f003b2282cab63a9190e3c8f53f792e6043ac9dc5c1fec3915495473e3ccf9a356276622433e2c5f3ad79d22309acee05adec447d28c07ae2d5c49f71a7baf657535941b8780de3c1a42fb677c8168a699b1a66a8ba5fab99392e8a0fefddcc07fbd32df105bd897c3c58011d7bfed2a19266a79b7fbc64f7121092949a208d5af14699a7ec2dbc8aaefbeda2cdeee1ad220f0ecb41d7bd0571d6ce3de2cd0ede63a00071106dda976babd76878b6755eef5f7a1084f4ef3c61d1821d44b4bda9ea71a8e7b45e088eb3f6867ec3803bddb6813fa3d8ed177a9fcda807374468e117f0bd58621e8e6afc4595343fb28fbe67f59f22ff07c5906a2f16eb756beb57abaddc8a0f34f0437f63d6555af147720e25a6048c1282996086ee6d0ba73fa651634aa221509095152b2b6b85738f6ff4e73b10744740673e36a718c98a2271eea2411384e8d1f6f05523395bde5fb48f712cadbd2f6870bc73aa2278ea089e8b6c28a60f80a0fd61dc16dbe642b1efa466e7c716c17b583fc9191ce39f29a4c9a6c033860327fa6aafc3b2927be29bb62aea001e936edc2ab935c78ccca26e01fd899f637322b8a28541c9fcb0d4cadaaaa505eb45b51175f7c022041a5688424f61835d76473223c2e4f68063b503394edc2f1582d64a386544b7dee917c2bb2fce4b2bdf5f35c39cc8551243920d4ee8dec12332403bb7fee1cefc3054da9d6b74c0c1fdbcdd2f0c0532eb380c7157d1f976587eb94cf6d8f573d6fab78bd85ab0fe68139e957267ab4c0c856cc0f163624c4db462c2c8566eccc707f4cbb5082ab80a2f99f0a5c6db1ae564bd754f3b09aa24519e4426e2e13c97d0abb20a56f13afb1b00f1fb0992c687490952cf41898a0a153d9423bc09181a1cfd8bf08da32b843cc8b71c7ff8641de52b56d6ac637532f101ee7aa2794bd605b0f6a798c9b31d6ad57336ba184364799ab5176485599ae91040bd64ca4a4df37bf51771bfe86e4a201fc5f5f34a957011d5baf8a3ecf1a25bfa06dcd54337a5ee127d23176f8feed3a6f961908640996d5ec775b31e30ef4f2f453b81a0483375a825391777212584982e0338d02127b8d4f3e32e3d2b6ddc5bb915f1be2873a44a61acb928c95f8c6c13c953fd6167e61003ffb88e1864805599445550a55b61709b5c831dfcbe2bc03730a3a86c1925c407a91ab32f0b6a8212e0bdfbdef058309781195764807dd01b00a5787fe040c03019a36f991f2bc545282296ba40830e77706d89f9a3e3b80076e8e3e12ea6936a6a58741c79618b152f3d38563773f30fe6a0246b50dbdd5e5b0ed86cf979a289e08181c762aa5387043e3b107ccbbd7fd4f62058bddc5f7f86c40d553b9f1fef5c2d3fc84d44ad1df515fb44912268ce7a515c6c774fbf1994d64c2a55754c5990768f146010a052d1107130da23aeb0121bd6eae61ff8f3a5fc299bd6fa188a00ede4570455926b44f08ae260cfffd9715acf9b67286328acec9319e39e72ed0be56c3c83f6e5570748b8bdf141c708025d0e64c03df5c97f30cf29a4cc0e2ab4a261cc6113570c52d584875069d5b1762f76b4752e073dd79258bf427c921181f2e2040197e26fff16eee1f0520177c83fa9ebb4ab23eed22e02266b868ef4585f420acc9b35dfb7765ad00a04fc6a91e335070925f8ced094a62b11bd511c32f93e6d3be7401541db28271275a8a7ad4fc65881375b7af5412e959350630c867ece26f35aa7830a04a855a28107d3be9fc9c84f0c4635b38e927cb0da86c79e4e81792300b20780bf9910b0e13f008f20663b428b852062c5cbd658b4d9d5c47be4cbf523b16698937242fb01bba8dac77d951c9c1f899b9fcb3d57f81b27ddf9fe0f35a4cbfa6caa8cecdc913afa94c5d66cad0a6b04ccdebcc54f31d65ba8811f5189cfe7c5e3606e65993edb03deb3209d3608420ddb9e9914a32326e8a161b141d6088f1c96172a6a746f1ef3f7dc88b1093577ef7341c637287c23bde3a2413da10260973128d3391322c3771ea160abb7d551e3636c5657d8b210afd7dd30855bcc45f4f7b362b688c3a36ee7bc6ed23ce6a2e190ec11ab43ee3e2957d6d1a9e4a80fd616a8a43bea3c81076c809aec46b64fe919681cdd304ae9beddd8968ebdc0d181ea5f437d8e002979d31d446afa3bfcaf5cf9b1e9e86b150018e0b2d92dccb82c59566aa762c81cafb3a5b6ad4129043d37034432daa7880ab35f212ae528de91a9738bf504253c30eeed30ed8a4d1117c1117411c2ed19004f47ac5b0eba24092ffa2d6b0d1600cb12c3e4a42ec22c2403d2871f03968edbf293047de25ef7c8e17fc81649ff1dd3524b668430835723cbd0248f743001faac9c2756608e69758b4736519a09c810e612dddd4be8ee0ccfdfa84404dcd562bf8be6a4b144225358969921f917dcc13b3ef2494411c58c929fce2435f0dcc438a48e3aa9916419a695ad5492fd8ec8277adbbda54c5beebd03640264026602d6fff87f9e1a1ac1c1f5b97072b416fde6ff1c869e1fbe266e9489400d362b6c441ec5a3e1a1f7279e75d82bf01a8caf38aed59b549fefde6e065435322f218d187305189c9baaaa91978aa2146b046c31df5b466f5056bf8c6062a6a25a4733ba98a8ac707206109add94ad5a6b176fad65b740a8ba41442595b9a913cbfed3b978d4c06eae3639c51c32a518511950881a114520edfc3c16c4d5b1b6528b9765433b9977ddf098cec9afbee0fa4a6d5763b588741bbc2979e198e3d995f53ec36f58f07d59b896eea8d3ddc2f91cb3f4f8ef83899b37d9942b69cc22080b6377a526eee80b4c017bf6111420e12ec2ccc4688ea5f600755dc649fe8fb03048304e2f1bcbbbf71090eee3cbf6d80cf34161958a9b9a51d9b09470a712ee42862bed85f444ce0eab7615d76cb04899b560012563a9af3848609c73ce53d082f03bbf4a59f077ba0decc02ae386569699892ce1911626473e80614e8d3d63c5b5fdfcd7b15935b29435be4a383f03d65dc559e47c4660896b8373abc001c75a16c1be5df68849d4f33fe6c0993f38bef6aab891f2bfdc32395f569601e15d7b1f9980e9825ac2dd111f4a1899b9319c4adac61a39dd56faffffff3958e766f9b6f2fd92c6285f54baeae706c2f2a26363738aef00d345898c2ad7666aadb03d29fe7268eff69e43e2b45f45b8c979ae838998f33d2121fce3f055aad2b53798ad4584e5a2228361fa8111d6301a72368df0f9d182922d45887081ada3ed6a07fd814662c69b0a135b1a1c4d8d418552e1d0a4bbca362a787fb5fd771213148eb943202a50e43e127b9c060693af238faefae03355cc9f26b5a1bb93b0a8f8755188fbe40b4162346a8c5ff5b2c0262b1bd165ede912e427469319b199f7146ed6654d7f311ad12c03f1152422707ef8974937b2cf074ac394fbafcb3fd0ffff4f24ba246cf1884cd62ac466ff20ab08516103ae2a41226802746ca87bb4b552af751e391a594bb84f37ec44c29844f285e5b7a2c8047139ac6c367490332a6d4c1c4a6a2c6d70396a253cb9a56c8a11c8b93cb5367de9f684cf0923fdb23fdeaeb9daa50801a72051d2d95db3c6c37a1fd919c5c8804744e9658166292ac84ffc0e9b34b914a135b73b8ad8937f9c2684f2900fc33ee21e0d42c89ccd3c00f2e53f3af2b63f0c494dad5317e64e829a619bc5ee3d971c7b9140873f46ea8a9176c4486731125b8c742d93792eb96a78e92c5b84253c89ac020596ae643157cd1ece1da577cfeb4495aa0ad921c79688ec828b1b85d46d0eec3d8b7ebeb98c9c0b89f312a2d7b81da2998d9009646365543338a9142ceff24b1ab2c7e81ecdebe9b0f2151d9cd33286b9b0e012cb2ccef17a5dee52065c870ac79abd5ccd3f79f4564cf72dbea3d9ef9608ea39e0910f98731c56ce872669410292b80068a15ab8e0fe29752e1a8661a59392863f5c4df14c95b2de44a070832b0ac6c285db917983f92543ad8aefb2aee13db4f6de7b4892eebdf7de59f8855798c976af58d5bd9c0bdda3d1754263c7d3543b84fd64471d9fb83983ffff67451d5c25c599ff417a493f9f92abd2435506c9c0409d1b7b80215dce6401c5443c17ce759ab91d6949992dc1c0fca0432f72b0049d26af1238c0def1219801069e12399fa13113309e4180ec8a0df5ffbfc9a90aa6ab9eacb9155062392128516455b4caf993821709b833bb26623f0b3d566e842dca228e8e55978d8f7327aa6585f5b3b6ab2821826f8b02ad3bd73d395185102b3a833182551a587539ecf2f1e6d8b0d97ef38782d0f4ad1549660f549a508deac509a67639e209cb49b19640fd43396dbb66e0c3bdc743e1495a33c544adf676a899c0767c96aed63804b188b692493e506abcc8b9eeff7fc719ef3ce9ff5cd7e16185d6a495b1188b9cba9061c5e1e6c163f2b4c8a00d6275bddfb8f1e69c73ce8965b41befbdf7941fe23fda76b17befb40cb34938ceb1b78eeed1bcdef4e79e5ca5ed3e79ee0a483a429943c3aace4ad575295365a3e362b4a9ad0a19928392990f2b43d8737736e7e60ec7ef15dc242cfcffb95f3ca338591f801195a15a342049ca94ca5441913224a15919a65bd688ccae94473fefbac286d65581216d7393b0223e9ef4ffff28cbffb7a2cebad74936c61cde8a6832823848d293a4e5050c0cb6ea8e2ca824dec4138184d65751784323b6d3dc15ea930f5386463a8438a1ace8b596e1657242afa446a407c844a729a23a234787c964a3eddcebe34c782a8d99d5a6e6d7dafbff9fc999f131f6fe3f8bf35e219959a456c26f7a6f8f8637cecd3b1a4e54d457d6c4184c037b412b1194516312ce2d680f9cacb6b0802f2f3cf6d4b824626476d8679b45f1ddb929cf9a63cdaeae47579f7d95b52a54a011c64061ac827b618c2be19623cd89d66cb31db99e77bb8224caf2fbe4d1dc95d914a85076c1240aeaa0f4f61669f10e6aad9b8485872ba0b48c561db7ea173c0683c0c5a387da55c62cdb65300acf71f8cbd9b99f72f2763b3c75fb0fe408cc4177f26d9d377b68c05bcde1f9b264f08e051f1a4e3898ae7c30a11c3851c4053132bb010d3fefbd771bc04dc2f229cdffffaf6c9c9602774ab4944a83130dfab8570b42a94e3231e0ba880a610605086e2a2411bb671cd3c4fffff1508226e305712c88241185ac251f2592e0a8925269255ceaed474bb485a71b489af737033937c250045a1a7ef2d20224ee4ec8de737b644786217c3f86a9ffff44322e095b930382c887fb74bcf7de7bec8103af5c79cb70206bf58ec760414001774f81b79c324354e69aba4dd3b5a980ce92df3f38e75c854dca39b7aa5930d1c343299873626dc645c4958c19f2c8450cad09b2e37e9b8485bf858409d42ce15e700a4f72a7c0630489b1a3b8a7b50f5e94a2714f6934621b8ee8f2e8d995f76fefef3166b0f078b4398a8fa13d7112e1035048995000b19cd5f842e1f6a3c4d15a350c980b3bc1e1faa4825a2fb0f00b8f355be31b0fc37eff3ddefca4dfbffc28229c72940989c294a45bfcbca5fb286948ff8fd9e2eb74284bcf377afced46849734f0ffffffffe70dfca1f727ee7d6e7974c7815be4925d69091665bac779cfcb1150c0a28757adf454026110b502e72588aa6953435d3cecb7161e926c4855cdd48847c526a29d2c61f045c676dbe9d726fdf4b53bfcffff578ce3ff5fbeed1117b5051c32251224e88458c2289f66b8f8d89163184108869c472f354a45310f63ca9eeddc086199884273da56f939fd4afed0d48a5793137a2568701b1a97d1100a660787c9ee6134f3bdf70e1b2f14e7ff7fa10e8e41a356f2efa39f67809ada0d1469ccf88aa40d263420ffe3ff39c63d1edf2937ab1fcca52b341bf18ca52b2c6271096cb7050077a1d25c4feb562728809e9e028cbe8250b4018d9da864b0977c30005900d3180804150461280e3441b8071400040eb470d0803c342c3c2c280a06420130001808080081300000068381e150380c24088c0979d90015d8dd487812943343c8407f4f9d81c48cd7ee5b57095dbc46099ddf635d62bea10157584ac7c03a9578b059982c0fe34f1d98d62f344a2645624cb893382c017a6488ec84600a4eddba5d20fde291cd459b5c2e297e4eb88bdb09342e20b0a23da3e2a9ebc102d7db33755e8bddd4ce247b78e54967b180dc09344927165d49cacd4cf450b0c0c72a96ac84a8682821756d7651d9fdffd52ceb758d424c93234da2a703cc1b10b0059a2377651ffbb7d620fa63fdd08c3892447d03e46efc81c109aab6f4eb67dc337632a061a155cd2aac6960c2bc6d312e0ad22347020366e3fe220bda5bef53c41fa10f3dfb046577e0a6dac18d73c80f783abef2c911a7971e890d2d35383b4bc5fe91aadd1e26d1b1b4b68dc3866398c3f95623857582afc7d12792b89569b269629c7438a5b6e993661363d0f49694e7d6f193d9bc23e5565f359480daf9c428a55110b7e554466b1de0f5f9afd4a96e06bd8fccbf2b8c0b772a8f0ac5df49ecc115132c4fb2f92fc0612b214df03e6a6f1c614545a2a5ad287b9dbdea6b791711799c80e017c0ea91e6448071321426c1dcb1ebc0aebc04462cb952dfdad96b29733a4aeecdb80e3c3c5148c8e7ecb49294b2b424e4aff73a22aab48645025c315d0706e2faa0fc7c3a3810865171895193b440196874ac76b92535c96b156b0245c82de60012d7af63f91ec294bbad6b9131fb21f6531f2a185826e91bc626bae941a6dc5a4ef0b3cdca5f0e78ead1dc2206b27f5f22065f1543bc589ef8eda47111a9d43600a859de67e79a1e6fbaacf99ce77daa8dd35f896ce2dbae4c36088d3ca45aa997005e187b7f493193ff97589d6ab5fad208bddafa194600a8676d48800ea8ab7818e11e88d41215be8f713b34dc7c237e3d814f58bb8a1961758a22405d50e085c8e3ffe0ee7ca424c7deeff38e429c4e82f9c2ac85043dbd2e3ead3b918388ba15087463ae2bef1cd9008aa4294911c02fa5167d21b07d5a829cca143583bc78160f39ff873a51cdf44bc7f7a28e55a98c839f65c64a8b28876f161b135b760f06fdd7088a16f6d95e0b64f978386bb0161430368d4f0c38053dcd32d01430e8bce4b9011362459ee9b63404a118ba98ee57cd11b51d894f18fc4cac5d9d7cae6e1f5e44842609f8cf845294578da628d4da8a3c50085796541241327fd4fc05224522013d72cebcfe548104808d759805d2d3cb7e16a4437612a12569b9a1412aa9ac259e0f48c120530bdb4e91f2421d8d545c7da769e192fce1764bc8a530eeb4efc5aac945d2a08fc9d630503a4898aa19749223e1144dbcb8e900159a18d0f1bc6f47cedede121b6bd6a245fd3cac0fd5df45a6d937464682f7d104fba8353285e6c90c9b5815295874a4f1915846ad374a9bbfe6979f65b60ae16a767bc9c07604a8bca2096d2cde252d1e0cd8510f545e7b70987419cf0000c2c45cfb0ad4c19a15c060f7df6527ff0f03004f8806ece9db6c10759c988de25609168f00166805241fb4053b07f9df2e046163a2c6128fdb3813826a978a2e1047749e0771fb96ef2f80c98becf6a28b31f228840ce1ab3e7d1f4b2ad5821ce5e4202a18c6a12a966bc15866c048c14a65f758babc8c518dcb7a3df4b9b09b6e2054df4ca8342e5a95e1cc5ebe2569db3425b32a45d58a78988169ff1a5b22914f2c1d128b8f7537ee54f2b86114c42c35ff11e297386d9645f00991e4a109064e0cd61e98d8f6f1898fea38c95e427d4e34b9a2e83d82fee3f5e837582325c3de26fe238b44b0da14e00c9843144ca275167ccc85d088c52061ccb21b5c595a6510708e5868d652a22f59d5d81e766443fd94e0d0e40e8c943027ccaefd45b4d2e581147eb34c8b1848aa54d84a6afd888bb2d49361ed1dc219ac7f9a596286d57bc1bb4feb6b519a1fc60359db3d67fb61117ecceb1cb5b88f32f7bff125e7312db0a5d1f94a07818482d14dd2ca0976c0fd79392a6eb9538fccf4601ade8d3a991d4a8e144d13f098528d49fc4b33fa2ca300d30e52f33e031f19191c671928e30eef18e4b8c03060f2320151b7c961ba11ac71a552226c99a4a65e259b5352a5bd714caf34254a746e3f584bba1bb3c560ecd737b1ec45821c32db9d480ec144b3d9c388927952d1f4f57e2ee3ccff9b5534bda15ae89a73200b6b6e1f8b77d1d30d99087d43b551caa120fa3f2ef593c7808cf17d3276322c047ccb488c5a4482e72d6d8202c8f8c450e00227e2e074568b5dec82a3040f41dfafb9328355ad1dbaf018eb5082f0282541b58c4f8bb36ba56e8403d8239c688d5c1362f8cdaf81529fb115d1f9ed88dcb1241c86a61e85be2c83b5cdc3a6692a57ebdd42b72d23e65c566ad6858d01d958425f57dfc493460bfc4600e4c73ec2b9a5a3900e27a504e739c2ae5b15070111b8c0d9453e1b5cc7e3f3a8b64374b9d328c48829edb7739aab753b1b13d51874afa8b8f29c421aa78e5c9109e45d7265b451edabccc3702cb70a0c254be2790aa2917318224e07c69842975650478fe063cc31eaaa32ca9441a0cf731ef9838d85e95a638c7fa23584198266530bd763551424a8333d1ab7eabe63752dec37f755e181ee6bf9df11c9939b772bfda8ca4217788a72f647b11c840196e4eb49649c7d1b28307c105ebc301688c8a45ea10d31925cb1a0df0ebc4237f0a023206701205911f9dac99cb5519b8c2caa03aee476e202fec5fcb60c641b79c98b45c493d396ee8be2827de002aaec90d467fd09632ea26867f1ec8a7c9906984b24921e65a93355005e4c632f98a648fc86833999e2c863e580449f32dad5a86cac9c0a000e40a90ea6abb6868183a703739c78f95c2cf30a68c8f9711415f22e66af33d0b276e53f5c159ba16e57c170a232c1e0229cd0bf4b9471ff886db544c3285c5b83479cac358f62d99114d59e91c883920c554c371d142c55ae8c3129a98d65924e07af402e08c19276af0f69012403df5a1414c2cd7501775e4b0689890b6512a598418b9b50798cf2842d5c1e316e586590a105f90219ab1efa885caa8a14bb2a54c4f66445c95016d266565a01c9547a2409f05dc4b206b0b643e58c930bd2fc211c0ea4893c0f1a87b9e88d0fafe5c8a169100298ceb921043aabf1d659f60a472813860cdeef22bf1db703f6f238980e0364014cf6dfe1366eaef2b127232b0a4a3ba504f9feeedd9392225a2026af6872cbd44a2b05dbcdc6cf099c8b2ed9417d9a88e00ae045ea0ac99aa256081beb00443712da8361eaf585049d53770fc8c435b797d6756035eb7be3eda4150c6568146ee935517a476ecb726225070d258b155d624d5b371f335dc6a414bb5510a5dba7e140da046a00b82b34209b523fa578a7a48d8a03936ac8261a97ddfec38e445800f03d0e576f0d3c28ef40cb060e6532b7cd20c4b26a0e55fe92231d86cfce008695ec35bbef70630a15da8d04326d8524e8a63ccf2039324975139dd7e2010837216e46917163e167a90025874e468351f148e805aa7bc0ea2fa1735e908d1c838467e233529c9a02080ce53b8a991bf477f253074434a32d0bb08eddca985146a720e1c07f823cc28486aa81863d6850dc6b4f4299f90d17b3183f519432139e4eda6482517b8d0b279d3c9d5414dae2515db261c9813ad61d37f1e8286cf4161b66f6d4d12c7be94dcc92ffd413c6a1ae9a59b63f50d5b94a400591aac2c3c5e74fc807fe68bed7d5c17ee2b25f8b03519c6137aaa902e575b47ac3c6a8c3e42a8d3788d7a657e1e974d53da2ccbc0ac0c05e4dac02f29c98486055d0c4206412937e864e84c66398ecafba65fe948d89eec025f5d3e184d73305272ca0c36e7c3edc4d96d907335f103f49258ef6df8fef595d55cfb9501a24b02785bee00b1661cede505d5cef7da47d0987c087fbc450f1387f3288b0a9d8d409807f651b2e2223060348064f78da0c37fb38e19ecfd41ef1987b73fda1c1c5f4c231191dd8de4811c6fec8d1b317e7db58484a59542d0c5528d7d10b57d7dda7195310e9700683dafc771080fb010f77383809f36d8f700f4a00d7cbf51427af9cc28d0f74ac0ae0b7a372cdd7256aa764cbbf3172f8a975049e20624cfefe313f375ba5d6d6abc72562c19366c3b34a7049d25716ab50536edbee08e26acd489e14e39df9558252951d98874b334d088b869bc0cafbdc48313045eb5bb8da94cd2e49b04c3e5994a0423673384b0c2857ff45dc0da981729c32d871083b12cf16817d828dafacc6f0560baa97bda1d4fcfb0d1a7c01a93cd8e2512a0b13e56c266a7ab0b87d8d600f07a81874c8f2f49c9118a6ad0843cc62124ccd9e4634f2b91a209c18cec846768c615457080218323ae3bb20b8ad09d6c4082d4f75729aab4b279b26458720236c68245c3113eba23253166789097f94358924a3575056e086fa9067955047bed83ced5162dbab84c6b790a133d18879e30d24c0924a588b520c28daa030ee0ca5aabddd26638f961eb3efa229f6f4df03903f00662e980c20da39092e9f60c0c23453cd0d282e5d52c5f91dba2dfe6867e14a1573f1415c2e7e37ca020fe4333bdf2052d2ac9a5980e1a3447e64e1960517a442ed0b59711bb11bf286f0f0ab2c785e3253054e0d896047851711cb95d54c727452248af4953214c1c74c44dc573022ec226df6964e274e6e0e05d9db9487e18c8e424f89914a2b1efbd4710287204224b6147cc96584a07c3c2e42a46b9a9aa535c87175168c81c4613fdb633059c7e277cccc2b7a32a209a1e7b516b1d490847413d5450bf0cca91fbb6efa2e5f872a36d506757538501cb60333da2964d03ff6315d0f01ac0f529d42f7af4e826377ccd8fcdba182639267c4b48be50319a6d0589bd393582e055b166f073a396eedb725019ae5309b8690b407b059fada9116c974932bfbb8d24420e76acc26548a9419f42b076556cc70535f72acc809178c587250bca7d3e41e5013ca7aafdc7f39569c00b5d23a503efc767b9e7955821f76009d2ac56948d4a11a86602f447454099d3581eb969c833b2921ab5f3347b8607844888eb64d7e30e361d2fc0b838a5c894ae856be6847fd32d3e9c01e2f189b9f8580786200638bcf1d344ba25b55f2607f38807199f5c28cfe452bc888c6d5cc34ca19db0e030b9c0b767fbb89516962ca204813bda12109d9ad05bdebe76b3d431040fe8c71fcdd53b73bbf05a0766a1f28f5c67f98005532ccff3b27112ef4a6af55df76e09fe42cd4459e8690fcf34839d324773a4a4c17e9e92f113675db81b371567829c8f316a8c96c6e1ee616e4a576cc623430eba010b80e5e23e08a4461a53843619bb8add4264b7f34e6ad8630f3eec44b20af4d2a45392da96c43d46c278b8d595764f100b8b84e303be8a653a3f18d28e780a2fff5f4b0f85d6981b81e28c1ec38c017c0000f9293131b505b9883ae5cec59794a85e0d15bb971954b78c7a810351f8d3e24410617ef837aa284678141f9f6912d9c3c6f40e645cf36d595e5358eba1760dcebebcc57a220beee8d643c3df049f47617e7ca224a290adc4dab51f53a86d2b70613d071c72d0e4d735c2524fc286551d2b9ce98cfcba69162c6357472f87b5314ed97f03312866078da80b58b1c9403eec8f26a941db90c5b8301637945d7afcf7e3c0fcbcf380b39a37ea7730952b49101dd1b6feb83f15d4f93a85a1393b7860c258bdb31f9933880a77c460e564d055a6a6f10bd6f79c9aa2c003398c976709b3f101636625a456c7e8155145144c1b4323ca36299cd60d03f176f3aade833067ec3d924d36f1346329de0c55a914d500ed7d81ca74299105c8f1ae32647f0438a70586a94cf0882a5780ffb8f650cc9ade2fe6fafa832a118d792e087818df877a1e3dae84d39c749d4fe07ca0d8081c6e842c3fa5cb77c2331f8ee7335db3c07bcb6b08cc0fbbfb04eb39102c4d7cf20c701e0dd95244e29e15c6e2122bc41d49de3aedd82b599c9d9a189da12d4e7e4e2242ae51a16809ad9b6588caf4d907beb8a5a5580b25714c9dee3433b01c1864e6f88353af006a8593c89fc840244068deb421335484ba6ed22960f6f73d593fc6b2bb2a9c315b0a9e494d55b3f66a376bef3810eebc42c260fa09e3ad311909c209e2493d1c9753043bb7e7482b6c4c5fae9b09db590a620464a591a943afeb1472af24777e6eb0d30e3f03a6a08d0d4da4c5d5ff823871242bd2ab2008e4c36ee352f0f7a10b03da72a684bf48f69b52d01dc1ea9be8a83e828c67e96b0229cbd82459de695fec37fa34e59fc1e646bf7fda52d5972419ea803d402cd84c2cffe3a2405000ab211b4eeecca9c6c44cec030045511890ebffbf2de70f205c83f04638f8fb0aa0ff3adb72f74c28e02630d143181c57bf1873971747041f79c7a8209a04438ca41fa7406fccc0c2dd93010197396c27782c41d4a335c4e10748bdcdda106f62a8b5344b512188ae86b056ed38bb7c894c8ca5a860166767ef4219026c3221090ff5b068d084d5cba993764179e2a4c0c327faae89ac9a757b8e858736a3406bb142b132f94471c2e027279d242c7b419ad7764545ce0a611231944679fdf0e563997b264916b2a7b01fe97107bfb6b04192681a5b6197c0cc8253140ec3438672162e9070130d4857dc8a24013d77c2e1ac5ce560edec630ea699c3115bc2470495dde3d0d3fc42b405cf71091e5f1ee48f37a9fd9a8e413f227df7da4ca0de8821e8db89909ee78af7c1215bb3d4641a0f8a69feaa100305bc992ea878d706752276a14986defdfcd93a084944447b0f8c252aec1243bbc9ee6c1d090813d4c394c85899a7a0a80d3727ae47928b2ecaea3ad88df7365a62b6987aaac263431ee6e0a1f9abb771f13683cf29e26a50d8826cb17803c104e3a7cdf63d204032109666f6252ab5d4f6750839a6e37b7d37035cd35adc24a19cf958c20962c50d6734067fb374d964c0e8d18c1b83b903334606926bc094022c0bb049342a3d2d3306702916c929933e8e31771b7cea7fc3f046cfc466fd3b35d4df05e3d72d090917f42cf6b92154f90dac3aa83e7b2437b51401489b99596dd0a6a009dd7c745393475204513d27f3ee411b47e3fb191998c0960117796c023ad208a6a148924f483c9940b538e35480612f01aef3410049eae4b1616ed2cd6584a87e3205b5b5d488d64548b40bc75ff8ee2ce7c57b159c91860018ccd96034888386e690006fc336c8ccdd8cba18f97b552416d2ee62fd901ecfbdb4f13516fd7073bd5c91f6f4467b84ab689bbcc04d9fc8f8bea1dea73e5a9ddf74c1303c414d25fc5ac7e50c24803c25f84771b1c0e2260e14ea65d569c770b090a5673e88c84e01bdcbdaeed55cdb7662e10d05aa274f37374c10e69785c77cff4e1bfb897d5b7dd3b013508495794323edcd9e34bd8a33cd80bea1440dd5dbaa021a5265e188419bae3fb26e752e8f9868bdffc82508023ae79003a0c828fd55e94309ebc8d0871c3afc9dcad5a432edbc98137bc6fc1da810a9dbf95083ed73b7fc70e3c9467aa098d54771114d2f0b867892fe324da85a26a531d9e288c502d12c20745efb5a6fa78ef982f4611f8a07e709fb6b2962465048931a28027e8fecb260dfb9fea0725694928d228c247a621b2db5736fbeb9b9f3868ab43e1f1e59d2ffd3503ef9af8e5e26cba69088971f1a9923778bc587198959373e6366b1a97910891e9e46c6097bd8cda184613864428ac6476796984680152886e0eb3186244e4b7b480e81e20032137bcbba04acc13e7664e0a88441410310d25fa217d55d4f2d8419f44adef936a1246edb804f0012284ffa8524047772565e915f9415b4cc987ace1631014acec01edf1af03ddc8194609ad042faacc80e5d7dd12cdcdf8c680b710d86761b2879ce572c80ad12e8f5db6e46f6c85685fd9598744e71915e044e05662697ec8d4b26c246b26ae5fc6fb06641189131bdf00da9f36f2c57649a8cf1d937b8a8caa060d4980e5397b0afe156f22e0cd01082642beaef3b7bd4fc56442c3f319fa36469fbac7b70c4667c729a4b046cfafb71175dd4c510d88d3378777a74b680798ba0aca08634ede431f2b581eed62f773c976894668ba247e57ddd27291a0024c1f1a0fb121683c5f651a3c498add6b53b8994dd615402ca7c0a81a91fb7dbd4b0e6322a467b269e187aba09b66095ab172372f56b42c627dea452b5626aa12dfb03b871e22c05ad9a242fe2d719bd445bed8155d47a3c26011e07e4895855fb10df6f7ca0f3d60269380d3dc5942b454258370b9e20d6f2912299230529d55be718c0f2ac0d0378eade02dcd081091a4faf008436e8fa910a998bf09a46a474c6406d29f874d64018e6d1056ec4fc700847d4d7d8b3598944560718f4ebc588451c27373e68f55403286290300c6b80843b1add9196383cfef120cc4521a616325e41dbca3bd57a6e23716bc10c65197eeab0285d1e44e51885c379f2543e032631c975e7ba09936324cd3aa0c8a09a913a162c87c97216493bb5ad17f81b330468d708134f5bbe9783541ad2cc0723b741464e0d4d1c5145d2c857a1a9eb456890ea7b88cf3b74287a77ac6016f975209f9c3e1ca4eb5cc7911a182e79bf719d89d90a0b5b41e4e0352c6d28beba3c2ec202d1616cd91c169e3f071dd8a5adf48d1053d00cda6cd166bc9e281db6e89fc581d5a2ce67565c4e9a0b46d649cd248752fb9d526420d2046c68950aeebada097e9510f0c0d7c7139d61e0544cfb48ee1c00030b8cec4ceaac763fcdfb02279e1850136b177e060609022fbefc4a526745fd95582058b699c470ea372f2669cc53cd01581db3a88996c1cfaf591f0e76135975f9c88df3b36aaf52669882c6bb92a20c73adadf45351bb6552afebe668a13516082a508d19116f8e6266c7637cf242ef4443b7a310f0256f82368a2b8c11c805f0af61ee0eb7520acc2d1b9c065286c2644cb9bc64399d8d541582d463c08975af65ac05f2e06adb805a3561473cc471cdc60f2a3dec058522bea44a7e8cc2369626a5ccd5c181000ea17e33151d441ef524e9b710e1f9dd4cb691a58e93131b6ab8dd4f8d2561473ebe218373cd8a668a81bd054862fba1fb5ea32ff3744f64a8a27d8f5d539c2b6512b90e421217f8a68ca4a6ec1c93b328154b8cce331affd22ac375a5e73f323efe258c1b6c991d37c88c6db89ed1a46d46997ae9a401c42be04b1d083b8832317d669f055fcbf14ffefc79a37d20aa601714f44aed59ca2cd47a58e6e65323457b7f51766a2f734931ab7f6ada3fae82a56dc2ce951d8c48beeeef1b576213d092035dd481268d7515dcc4a7a17ed2bb892b379ed03e6fb1c8f9e19731f696a5c1aa3bc4f4c31eb4bb8145beb6fa5f4e5f804daeb60b1b9f651a9ab9d138265b3cc2e16dc32a29da1e2d35fdbc3ad5dbd5be1bce5b24b254a0e17281ac1e5ec165b80c00d6dcc204a72a1c48382ac687611f4fc2dd01c00e75227b3f023de097fd479d1a431938264d94dad05ed1a34b890136841f76b6dc4fdf52c005f5fa5c0023281667bc334179d13a9824ce67613941b34e01c2b9e107e68a90e206849e6e8f2ed70110fd2e800df3da4320aea49373104de2e86575b6138bb89a162f98a4d92d8287d503943709fe5bec7c6d594912a627c66f8bda06a3251d0687ed53b608f18f61bbd9f6b1010976c66a536ee90b9b114bd12084ee6b250e2769b435cdccacd46eccc99f7a97c03fd2ad2972e48ef68278d525767cf96a2348ba70d014c97b5d865e928510c7a191371aec50815fb4279485ea2dbb7ebdc023b9a4b3202a825bad144942c5ac04998e98855083c68c28d410544cf8252a44b658dca937a108744e78c27e34a45e80d6036fc2f8e82413d8082601ef61f7face77b50cc57e4aaf61e7fa54f49d374bc527d626a7b752f75bc8c223d2bc661a2ccb8e1b99f96b16e4ea47f9a252c103c3cfdda5e4ebe5d63026f66be9aa4c8bdd235c0c63744d747a7abf2e4e0e2479025c973a26e716431a6eb39066372f76909241a018a9e542456704c317517283c880a4ecde828601882869fec8bc21606b368c014ce90a730cf020d0c5780a5ddb78b3b28591b285998c8c91a6c83cdf2c2c97220855c4faaf9b99ec7ec276bfff589b585760977db7b4b99a42c21012a022e02330236ba109e4c36afe0db1908217ea488a6c760da3eb119a1c9c60955276a54343057464630e2e74ada06ae3392c7f8dfb1ec9d33823d609fc7bfc7cdb32f3b9412410bc7088ef0bf5de1e081be2524a66158ed3f6761016542c628652c468c2627851943746c4a1225e73de247151122c308e0780e986a38f758396ac5a3d33de252747241b6cfefd0b683649a895a491ff50a496ac884941a0ad516f1ffd4166750426aa3b1a46dd0d86501789bb3cb75c011ae3e2eabca5cbb3a0751f7defbff4dd7ec56b9cb02836f8fcc6ad82db29a21a79c99cd921668d7b073ffff6eef9cc33d841abb4862d13a296b724127a41b5952765d81a6b873bbb6f3de3b7654119ba2cd8dd76db28972756409ecbdf7deb570fd681b4acda03929dbf18811156432520e5170a8625d6c59d821d8aef5ffffffff2574d7ffff0fd32b2430863b57b6d3309852261dfa8cd78af5debbaef8ba4c2c5ea8391494d215351e1f02425e4043b69a6c48dc9c237981f40011e34b24df26b092ac4857cccd3ed86507ef78379823379a707b965b9bb2fdd880abdb5b911a32e72f3b92326f00921211a14571bebe096e2e20c52c45959016cd5a8a0d020033aca17766556dc669ecf6a363510095d204d441e7b710bfe0343db448b123c7cb154e184cf59028fb59826bdad81fdc628f0519fde3bca3f7de85c2ffb0defb536639e79c8b80968890c2226c119958021d6575a1ccbd099c3680384a251a2c3c8475589bfff573b0ca597557658fb54aa20285ae44793e6c484cf104973978ea09de67deea46bea44e361e06502c5e63ea90fbe0dd032068e8c27cf60a6687120ab685dd5519b2c8546b50ca5bbfa4386b5da3c31140910c0c3a14eb1b73abbbf75d325e3e4900d98c888311432606e14d324a3450d0c418b98039cdec95674fc44daac6bd2cc6db7b8f07c4f9e95f978e0674c705fc00428ec510fa5f658569e212f1e65390d8872aa4cec097e51fdeb124997888742e86f10b568d7d24683fce79eedb66bb6580f07fb62d99f9d507f7ded7de7947d8948c08ff77846415571fcc77701d3686da75fbefd8b2f6807a2974096f2ad4606a0ecf9f0ffeded9f7c547d529c982a2b5bd72ea49feff2d95035cfcc27722514396fd60c72904d12668eb4393bf70968042c97566c34d6975b655e0a5ac7df0c73af5694a6ea7a01ebcea4de8f550a903946c4962ba28bd865469879636b8ac232566e3da6a9628a71cb26a08704602e11f9b63235390e03108e7df7bef254be97fdf518dfd72aa976dbde9d3bb5bd9a45a0a27621b8ba5259822525ad5938ecc0c56899da20b11316c711105040a99b820e3408207080c4fc76d80caec4a66e8e8e92d08048aa94ca013856a5121ea71f319ab114bba7263f1026461a354e06a16400050dbfb1bc0ebff97fdff67ea0cb935ae0427a6751e4db3428ef368742007843b27f82936a0fe343cd7f928396ff6ff37595360178f1a35c3d0ce02483755834e060d77bc2a88993cd1dc6bb45521ab71569d268f535e58476a9dd324394a610a2427982a4990f0630dc0f6ffd51d6c48ddae9750be242bf369adf7ffe5af938b9ecfedcd7d4945bea6f0d38b75a11e60577d5ab1ebc707ddb4b0e0018881b88802dd8c01445c00f74fd35e5f970a26e2d1112b509259402541c15dd39effffcf6365cf95358f550aa8323d2dd16a43895d063483be672a5edd65ac602b91068382143aaf6c28b9aea6509c058d84186c182947d65c5879e17ebea9b8f7f518e205f5409223dcb9b8a75ba5bf7f907b142c5062fa505b562559e76630f5bcd5429982d4764c069fba9a64c531b6e8da7e215ed80ada3cac1ab7302fff915a98f11b3be918d6a6c6921768a41d1a7a243b498007cb84a10feec53dadd6d3b685400884937d28a762ba2657044e9993a5bc9dca9b1ee0ffcd754813f6cea122077d7e494a9373ae1a9547612caf1c52e85188e75def2ffba320eb4412958f96d4545408f2c9e8cb4fb81452cbf91d6d977fae6b43ea7f0e9d14b3188c822e3cc132640f849eceabe2922de909b59fcbdc728d2d0a486cc590d3d6b1ce905b3952c3ab0920fdc30d5b7b679fbbd8bb7ede7beb0393df1a4853ad1064652f662598689db005d19890424f47291a768bf19fe3ff04c8bf3e625e90528336e4596b1a11b7b4cab8a6fd60069057d46a07ad6bb3c8734d4fd833167d8863718b3302a33a5111672e471cb65c658b1fde16065de78ef3a82b21cab0caa502dfa5850f2ed88f1571229fcd45094ba2867007335114e28a2152b04721610f62d6646431cd0c396d1240af552348effaa8ceba43cce4ff3c18431f77c3c918992e2eea091c2d4798dafbdb8131c9497825138bbd006f541131c52c9176f1e6a5a662c87788a67fd8318819bf48c95591649560cb559c7cb4f90ea565b51407620ccd8589c326febf9f62c8f65ce63fbb814dcb4d4b8d181ec07258305b5152593a449f9b8fe7b91fa3d600ce64e6484b69470601b21b264ff0490686f1f949a062c7b6f1791ce5a3f2381f63feb1f95b979d65d39fb6da05ea486e66fe263c661fbcbeeea977c5fde4a590ff3bfef90e997f6231453b606a4f2e95a01b369b22e78d299ab48706e7db3569b1182fe46ca846d59134a353dab4ab9df49d314eea98d2adcd062f10fef64dc618fa0593aaeeeac4d299181d30916500183007c657122ad536733562c689891714e7a6b9e9c081cbd0d3a7bdf3fed1ab9e8484942d1142bbcb1b887a1987ecd3b89ffd357fb5f7b70daa33e7af8e246bee4fe90b8df997f19dcca771f364f3d736e727b4e7d6bd3a873a4df2d5843d3e78325ce6bc0776062ddb122e2541d762b322eb64e6b304421bf19c0993b16774d3b9f7defb5067c8ad9cbf44c20a35713d019aff2c003ba77b7f2540fac0401be79ccb3a436e4dc614d72d45ae3c73236af20c1ba5256953a7a9745253b2fc0b462d791c8ba26c1958ddda6cc837e20b885f8c3515661d2ead0735653ab16242b1421b3ee1e73832e73d5f1d7ab638bcfac82d30ac554c46cd6b724bd9e32a5ab98e7057ec76353f387813ca39d6248b6a8cb435c58ada5a4680e0d03b0d22bb63bc6412af98c3bd0b097bac4b2a9273de0035028c6fa87450379540124300b31800004000500c84813011f438f71400030bc064c06c4028343c3028140c8401600030001482c160000000060303a2602054109894e26a0340782386c18219b1ba0d8f9ed13f9a226e9ceb5ceb91e21e0087d849ae95ce2340e269503c041807e4acb5486f8eb9c9ff36d20957d2e2dbfe3c0285ee0343ef7628473c83168fdb04909216c60072740076efb3c45dc219aa69a35e56fe0a409638cff71529cc779b8b5ec93fa989c8166eaba458fa878f03d55608c93796867d31b25f36a476a26f2cd94659c56bf8500edc701c93698c5717cf0c546d5c2037150fe0a3b01cd811f13a39decf2d74edc826caf29de0af7212ae60c5801985247503538c89b00cd2e357a2f5d267bb88b62de66a31805bff9bb26913b0c9be09cfd4be1b082ffec7cccbf7d37bf422049e1dc01a723ef9f51e6768804a72373394371cf5acd03672e7496360c0149bff543b076aca2759c34bc07ad45ff803c9c7e7131bf2f8ecc4f2c05c2bb2abe8e679a201d4b6e3aac6bc8449ba69288381c31311e894d5cd5533640fccd2c1f67fc3673adb59cfc78a9240cf1597e7e4bc1f212e7f0d8f85b0dd79adc99c924cd35f3dd762dc9d55081bdb542871595ffea4e786b40c9e09e3baf00e343edf63a864f410b48ddd4fcbe22c620b160def781f1a5c308a8d13e31fbd4043dcf1d25279a212172704c0f0d4e9fcca2e04a1f239028cc11a033d620cf4d1f2172e00413f2bc86981539a067a33b92a0a7f6c559216a3af5dd397012d752e1b9f8412795c68d83a010f61edd3e75323023fae6e210266205eb1c708002c64f01a0fe0fcd44ea4f4a3eded1c0b85d50242b5396da6c90e0b67c8f92dacdd9c8126290ae00a60d75818e865e5186bbc87102805a2f69b4305028e8e005ed28f72e053f55777054359ee9001f0a72200a29a246faac710e5364b446b04a9aba9a53baf4de41dc8b96faeb8becc9650739ac77cf4126afea2a4eaf37230221cd064642a8fd11e7a32d7c5636fde6f1765686d4172ba85b36e3444d1d422219fc47c261017f0dda1f32626fb9c5922cc571ca7aa910f74fd9301a2ec6fa4851480e7c7df369b8e016da3063666743abd2be5bca208dcb984690714916664f61ff872b1017c2892ec11954133a819fc96298f9a4a26068b628159c573dc812a260ee860cbb461634850063ab4be487f299205b822629b22a6a3503404f1c927eb0876015b59a5671d8bd8af39fead519134490f85307ec527e9f124d1e490ce4612f6f2e64088e49e5738f70edce1484a28df5039bed079ec0b5012322da8414b0beb28cfbfccd8bdabf6b9385c7f08a25673c4bba3deba44f7bb09afca64db1640d3f5f98e92804ff02098fb44e8e3aa591b44e124fb4fb8d7033c0e36e9b8ef8f4e1a7a88b62edd5ae34c4557b8fa8c367070e24f6ce8748afb2c37ac6092e3311881e99f3e981a275bc8bbe802b2a90a684396198c7a8eae73a61d236b2257eea9fba23bcce8537aa449d7a1acac80a5121fd97d676cbbaa946160430f8126f64a077992f95805290ac2f916dbd5edfb3a812344730a3dd2b81e62f9b1b9fbec2e3476caee42fd2b25771d2116947ef696e14b4a0e382630423ea68b1606649a9beae125a76449a030008ec8905a2644568330c426b868bca988eb0f769bd6b85cfc78919db8c75184d11d02df61855d19a27d0290888acc4ff8fa27b452c32f4104ac5c0cd0228bc96e9da3756ba301b22120eea877636480924ab8cbf90a0ba5d9dbed17d516d179809cbad1924796ee4aaee921faf981a31abf06647a9259fe4d112d1dc139cf4aeab0514d336902619d73046abdb1dc1abc8de50b0e4c24223ba3350e6272d9c1a2f0c75b1f171becc1eb108262a01cca7f2640dc55f66fca9ae309788be4a53dca0811db504c1258f81db02242a5091451927255239a80257adee733275d201e32b27651f70912ffe3b94d2177b1270d67941ecf200f08d14e31fc44640c1da20178168a553144a1c2d6043cc2d8264913768dcbdc73a2bb716f8dedc1ccfa334548c839acb73bb182a5b8554eea51128f2f4b5c65cfc0acc17edc7c02f2f6ad45f9d6d6c8c146695cdc93680638b53f54fa0b567468a3a051e0fd44e54d9627412c03e25864684649e2fbe58f6a1c4da4cd5161c6fc5171e0f6e77628ab6190f3c0b4b6f2d85082d9637c7b6487a0017533d5f08864dcda81969be0a613a657ad102f900f9e924a23f3f2060e8e42eacdd62cbc04a2413de0ff5fb99c8d6ec4ac4e27231b55d43650276d4b6c4d211235c6e0c18c549b68aad19a44c10bf92f7d701d30a5ba3f6c2bc4b2320ac3ce3d8203658187374e26833e11308c7cccd71503fdcce50a1bfa91e586a999a585dea2789c86af17e05eab45c35297e63f73c2634fb0db2623246e9b7b64b69df221e27cad435b5e98298bbc9fe89e862d1fa4813c27e44449402424c079230fb806b150c0724dbb382f3386e0b072d1bd3403ccf3f6716f02a3b94eaa15111667f012f64ad91b61cff8426a48861a610070409a31e21c8b4b1aef8d997d47219a121100840b264e88a62259ab8e03a7336c77d581a4d76bfe5ab4e8aaa1425dff5b95c19236a17debbf98a130c362908c51bad8ab505a82bd64b27624da97c8f8dc4ae6dcf24d3d97b14f6ae2bad4b792bea96bc7843fb6b3c9692141b97b57ed19600b6eb4f5e0e45e640059a4c6a99eb34885a731c94dc57ae10fbe95217144c83b4d0a7883fd0f22a1a572f43eb52ed1eb18a60d260a818fd766ac60071224f1cfdf61db40dcbe149c1fef744aaca60e1c9e0d1af7d9c4c40c8828752eb83fed9523626d32a1f53531cca5229db392b91c2c89934af8bebd6e160b58103c6d20d773098f6f9ae15fb044339911e32dbd26fe6e4a4e7c5b04048240b2cabd796bae1aab24b89d1b65cd1c9dcc7589a88d326d5901b425aa04a1d08b75f9372861ce4c5ebb9a122064e43ebf1fd438de4654bd6c49997b44bfa43f78d353fe1fefa388573261a4b3f6eba84761d55574ba42f08d23f019ad95abbba1fd18e9f042c22bf21b34c7540555ccf924f916917f3f39e9254636d686d7d7412d95be0a1ca3458e7aba91cbaa411098292e67835df12f1381800012ddaa9459e7964529370e3a864d2a1079b0560348ba6a35e5df252985d3541f03b17271fb9123b7a01c1fcd8a855699141545a737206aee858a55c59698b1b43f9af126c788aa4d69d2993cfff667345d4fa128bf6909281a1d431fcf34808a08554c06b044435427d4f3a1a2435214e648e1e5c148e046490260cc81d6b561cf676d41933412e6b381d39be081be89b00543568e5e5d8fa130b017d44c193e8acb3246c52852e1799095c117c3e71461109baf8f71674fadc5545318b7a3f8af866cc088a0b0acfa6d395e629edde040e5679251e5266e226d8ff059224cbb68144e42ce7ccb8dcdcec5768cb94c57e0a28c9e28bbac20143150ec51a8066df0218ca693c2b0db8a5cf8c50438c83ae34578d598c908ea458016880e836c0bf54b9cc1658cb1be72b1fda5ebcb9336c86a374ed8c97ccaabb226e084440afe106d7c0dd0a0e3ed9546ca643056070f6fcfbb3bc4e9901886531fe5880c198879a2f1b64bf09d6904eaaaa97189171bb9795dbd661c3eba2d5841661222951dc0fed8cca961fc89e0b0e2265325501199fa80368f8893c0a345436d9a76769e21730aaeb06cf32e30d0ed009264a6295748e22fa6f0bb54082cb566a3098a1605067e44c4b80b0e305db4115fb00815b4851174b64f36ef0b9c78c9d2e499e3a709fb1e3b19fc7c8be1160b3695dd4f006f5c4675f073db25e404128dcb0c595bd46bcd04578161713a987012068361fae8a9e05270e3394f3b6cbd559fc8a0242e0afff0b6cf991a8c2735fae90768ec76b46fa1194239731d2b919c90d357a2c1b3e89cc43f37b5755a6ce8a5ee361bf7cc5033aee2b1b27f5ed43c9507ba410af558b914fb942394eea5ed2620978668bf96140e47724417dd1dab3b9ac62474629039acf584a58f2a83c96686490855d74bcdd22784f8ee89a5fff04f6872970c613e27df4520705a8f8ca1db5efb9e307d324326ab5298f7f5072d10dbf2eecc170187b9fc825eb8fc88eb695740499b51cc23694c9428f25e6e2607172025701b1b2264a9190e3f5bd0f1b0c3c02611f09b449650f276465c13a87aa55740d59fed03c67007f9a8a308d88d958c8327abc8d689e5c26d9078be1889804859f58111bf252cf4c677d776f0d3010436413ae00f28bbc0c142035cc7fc893037fae648e1c0c203a3ee91e8db30e7f9c1ae8bba6307f99ad0716d0fb5e1e383ba37bf5181182e912f951f630323a73c24533346d6eaa32a23567cedac1202eec5b0a39a43ff3063a5c18da009f3dce12295978a6554e20eaaecc68c23d3584337799de7c1f3db644c9c6658c0327abfcd7963de8791f783db5c915b68b99a79ba35306351c4f4c204123c395d1d74acd502c1474f1111904d891c294c179dd83f79f7f3089dabd323d9b14f8b7f972b78db6c299b52a6e14d903911a60034bebf7281a7ae1fd324dafc983ba32d0112b5769caae83769b08e8cce92bb9627d720cb578d4923b3579828037591d1fb49b44c7bbce13e89b08e7f9b38eb2131aedbabd863f86818a291715ed4e98074cc581a945d0a2897e77a7c646303c61b0f48c9435c260394a7a8e9685a9fd1ffd5487ed5bcabc00023917162ce12ffc8e0384d7b58db56a3f41ef4d63575833eb1201d91d90a29b74efdff735223ac0c8911da9cd7ed5f32314fdd087954c40fc1c3bed4f879d7baf3e56080594322d988383f516d7a810d761b60701107c7f0ae9ce4f9ab90ba46297c3aa4e1df59d29f4f50c0f24955d05692254b615c21372c963f564e6f7a995de0108792f85634953fc68fe89ba11a390521fcd3b1a684b916f73c0be5290d1a329f07d128acf823286f82c5c5a295ced72342e8c87c6d03cea5d2a01a88a6cb2a3fac8f07d1dca151b033a955ab222f458d0bc3555748b7e51cf7a72df90361269db034969978b154ef85448fef4066fa0fa003235280cf217c33af4ac206d7125b9785c811e63bce125c7bf48f42abcd2309c75ea760c615db16682215f4a5ce0eff18640f2bfeb5ff9ef51229dcb518de2921bc21db7b2f1eec2d515a9ac069399cce9e756b4e0b52c113ba020c16ab9e2292b8179496b28ad1824c9173f12585c181b0d9a6f8fa64c128e022680a64e6c21425aeb2fd2cc709d6adc88ca51d2a3de0192839ed40432542079a437f078dfa999e018902ff47a20110f14a514d4b6eb0ce3b2b65607e064fe0bbfcfbc01d5f84708dbc5b17d89a5085e1abbdfbc6bc4b0afcd3aa7dd3c143e5afd61a3528587c67640e0a457ac06479177bb71f09d683ecf968342b8a61bb812210c8ab6806412d861e9960516a9d1fb4c9807221e708352c2afe650932eb3178ff0fe6c60364fc86fe8d9651a7ad88756a5661ce742e32689c6eccb8d4f116596c189bc201860179ba758b592a8c2594e78711134d9a357ae9552ca2082af722a68923f6dc5b6c51e34c02f972f0e14daa02a9990a83dd80b571d0f1fc45d7854c12ea86412846ac1f9f1f4fe9fb69de4ab066e3e550233e4c251c0fc684618ef93f2a6492ca8e0341478c8bbbdb234d4831ffe26af20732fa4998560e2551dd26551fc7b52a459d8faba87f5b09299b855388838680f33314803f86b4deb942e84c2645c54da49c25976fd000fbe59ebb7d317ca2b402810db6c54118aa24aba136347608f5cde19cec8ca6b824f7a89e1871afa92142a54547522c40d2483f5b39785273949179c64de01903544bfccf7bccda193c660da229109b249d4d645bfbfc630649649bdbb914b9d189d41239a7487081d60aaf6ad2eac424fc5b4aa9f225cee899439a411dd01270fba5b26f520fc72f938313bb11db2df13d8280f9ae067f029c4f2009a19e352fc83688d71267811c10eb309864390261f2f64a773e00b754392dad8ebc03332ba5575ffdda44018589065fef782f9153c0149db0cef634743254720a6cea7f2da8c311e48bf4d859300d8162411c10b1175212704705b36b8a73e3b647320caa76c474a6c711593f1dbba9bbf35848fd2102e695a04137e26579d310011323741763a8253408ce89b66bcc7345bef56e05d48f89d3bd7b8ee20a9a59e47889b915f399d530824a94013955da13b1b398a0a6ac69d11357cdf6992bf8c3e0abacbbd7af69522331666076bdbaf91db906a1e4a275eed1b4dab7a4886a610d7c416b20802eda14fa84330dfe1394275358761863713a3887e8666e5df8fb301beaf0cceba806ac264a467105837367542221b4502878cec1483d81143f708791213ea8c44508aefcade4f7b60864f3eee460dd04c02509a38074b8fe721ae2e047185f3503b943b8701549070977cbe7452e7ec910b0fade778b0f922412382ba31b0ff54784963fcc632504e5dfefcd3b549e4cf0d07abc48f70d0f83b321f304d7c3a8d99e746ef8b4094daffb4ef1bdcbafc0f17c2d77ed252e4aa4737256548fc10762ca78646f2eda140e8b16148e007248016a1a4527899cd4941c38164ab5d3000bb46ba0141babd00283be5c34427201244940c11040180004fb12028659cc7ba2d69ef18f204bc4875c6640cfedfa7cc14a3c6a848d218c3f4630e19c543b2ef4435c9c4f7a90e027673e4c44b0fb14a05fd2c5b5518d5f80809f45e63ed2899a3765b2dead8898a1a5e990fcd030efe3c70ab96c5a122d70691a107704a032b8434a64e6bf29584351a64d8e2516cce6f3395bc57acfc1815962e9c5d8ce650c07b90fc03c54e2c0f1200a3c505c119c3f654d426dbed169d6eb943c1f4663495d21360aa3447ab6bc2043007dff2265ed1a02ee696f24512e19110f22f21d521c7e65f1ce265b4048a84eec47244a74f047a0b6babcdaf2e27efd2263da81cf3854b7453b377e6c7c5e83a2dd6c22d5c1199823b8139ad0c0a123196e6c6b05908d22d1d7c68b325f9edfa4e94c869c07de5688161542fc5bc8d4053e821c42ca149f637c0084c98025e310520849a48b009d81d8690483b3a4f93d86b406f24724bc1f4f0130f2ff046292488cd7236cf29268a64087ccca6cf7ea2c61a2c914d5c1ea79c2ec329a4fa0671c14cf759c31c999469f20ba09697ae9cb22bc19ddfa8021038f9618c777c533dafc2c09701b80b8d57c7ef404450cbb25ef1f7325b152eb260c831100c2e55e3f5c11e0ddb897759053902e23e29c7c8c09646af54b1a7c87ec7069d5e648ccf4f484434580b9ce48782272e00f4a7c0ac15aa87041965c8edc3ce7b074dc84e926e1395d6eee88a5c345cd3585be319e26db89c760b9505838fe68357376a94969956881964539861c92ca7954df69d6bb97b8c8a923ee76c9fe4466b41bd953927cf8b34fd5db9087f849751677f7fe59fbe62d4dd424dbfa116397d688d5fdeb854609a8b8a820c7c8c96ff97c929d6d0667a15cb05ef46e8c2bde416f049258649c1727a8dd5610fd481d36677a82c3e9029c1100b5bd1945add5647b971e2714996d3be3b98cad176f078f15a8e8a739d0182fbd3035ff3834420d2ec83b9a6f6ebf36545315b8aca4718546b8fd7ac97904bda6188260881e31b3c63c9879e3f4c3b0d4642b3e088fde605993529300d00be88e1ad25ed96beadc43b97e70aeb824a5269c77aa636c5888f480a21669bc0a76b2811740e8d36f56c57837858279f825ca918388b3a8e7537ac00d583d615cae45fb59c30094f35be8cd1820118a87ef4ee0cbf6e01e726b863cbbbf0d382edb90667f77b6775ae00cb26fd841941cc11bfd7ab2722235947317c5eb29b1528318bdfd630b0f7456262934bc5ac1dbdce1774dcc72c907e8a28cb1600565bac3f076e041dc94afdd68cdb35cb5b75989d522b75ac9a92e4949a5206e7400b0cc6277470b438806747ab005efe1aaddbeb4345fa910d8e2f38f8f3f85b0e60d4122a7a52904b902480386171ed3cb885f28684dfa2b02882e829d44e6edcb3e438be907b9a1536d1e421142115700f727177a5db059206fb1f2900ecdd094ed94d86da04e36a7b01a766a5712dc40d105d24d013657c705eca5755896dc4d74eb141f9265cddc6df95020a39936f0089db919be93e7f2959d8d401b11c8f31de79a40739cbef182ba647e2162c37a1d6ec039bb0238a807f3db90b5830816f1096078106937ed86e615b8d864c71bce23c5ae45348f66117775cb9dbb9a4c7f89e5bd595c539aa6903053473c9d84775b087780289a97da6a5b51c213a190b5eef69a865038ef05d2b32151db5cbc3ccfc795577a9bb5294e15d14325a42bb1e23a23a4063ee5ea8adca0a52c6f0c1a3ff2eee0138a2a4d83c93aa27bd6a4f7b295ca28379fdea90b3c02f0701a3e881e6c8ce2f3a3e86883e25b1f1fc296a05f3febe3a8d8fa66a8fed577b5472241e80e0b098ed8b6b2712d51a47e689e39545e32721f04afb00076e14606cd5322b6c390b3b6cd162ee1299e1b5a095d62294068e5c551a0f27f597030afcb923df0565e3687d46592cfe15b2ec63d73c56f9feef5cc776d591bb64041e403170e96c3ce4504ae12a998d71a8bd90131b49ebf0ae1832a07c8df41002aefcfe3231dc30a893e015ad1f1f32424235b037a141c33d323615f19133cbd9ffb7ee7448e93066514decc86ece6666683fd2ee11c1fb3fbf664c250433e6267acba5641c5ca2566054b77d3f02089b0f11261a92f5fe75ef4ff891b3d541d0941080e7c2020a2e8a0d1e0ef47e4c641dd3bef89b0a00cdea46f1907a1d1d88ebdb76b66bd425be7ae468b0a71d77a776418af0658945d900f3b44ea3848f4af13b330139bd83736f6aa9addb49a35fe007a70405bee44bff78ae04d29d36c0dc888704080817661e5fbd8c7a1e6fdaa3966a34a0dc306dda7e86008ac075e25067258c5d5124f618b0b5702a1da9e453da0970030dabf135014984598200f27565f7e5318c6e648336322064e3d598881dacc54a2baa9775d6eac434d528770307a046385a2d417a34432f1c83d48e339519727ec7e28f4942ae3d432452769068f5eb42a14e82a6fb86368dc5c37294704efb4d276aa16060d4d15c15f4b5977082e6448b148ec52d75e88857ae43c496e9590aaf40371c799f383627619dd684723482759d7124c2c4e5b22b6fe8292d140346f96581773089725c639cb538cdae6dc74dc275df269186829217145688c1f880d707d1c7f8237430aea8e4ecc6329e066148c48e3b79b4eb07c10dc846866ce1c22cd10b69ab5799933209ca727f4a3999ecdd5737b96cfd2472e8c07742071303a38c42647d6f6e916ede0962f6117dc170d4c19011a90f4205780cc61750e899a83ddfd834158032e0273300190836b612cee1a51ede660ac7340741c1820b67307562f980bfe3f09a5faae6a1bc35099eef7124a50410298a554a13f59bbf8f41b7fdc94c0eaf6bfffb7943249b9f70e0402f701ec015a7f41b91219b4f84e932b5e8f0210a3d06a54d9596374b1804275dd40b2ead041ee890550850f8b4f8e7e7140ce4b06550ab885f0ffb737978c7b61909b73374f699dfb15b5dfa25dad56bb00288893081e4194154ec81ea34a8a8c202d1a58d38290d9fd6f130c1849712981853da9a45c3f9888f9e204cb8efe3d29507568d1bd8f2fcc5ec8d15acffad3aefb53f99dcaa48ab7b2ea1a837d732f2e6732e57c7324bd05f7c1abed189a35e7b5fb3e87214d0ba61391ea45024dc2673328696329ee518580ce1111aa5080f3cb0009ab06b4c5cf45a74307b91e12256cac046386dad71a97ab5911f7c2233798820833b751a560bdc0af040bce15ca36d71398dedecc9c02664564600e5dbd31ae25e94dbf796f723724370870a8fd80b9432f7cf2c73388262738fd60333cda147fbb1662e211ce3927069f28f4e6762ba95d7f60c4ec30e7094b219b690fdd7bc405021d1136a4a4d1ffa97775683d1da2d3ac5d60f0b1435a8c4bf2934bd2eee2ba3514ae8ab8b76b9673d78603d049012f9161031a4743910900903c78e4a0e2010999509aa8b0332ee6b346d045e6c99c6d19216986985f25f4af330538f001f493612585e5a56ff6de0efc547854784e205d14bd44217b8a9e4a405b84c47bbbe9f05f448f0165da0a61b0168c9666f7ff2734ee356a51d534cdad51777e342895c66c4d355a1fbb042312e32eb1c620d75503cd1ba6e20b1f502c3294341a1e6c013841642874b6ba80da278f88e852817969e125e84b65c790458f652a32aa51e18264f1292a43ea9e7f773d59f2daaaad46b3089cd916de74d298dda9b88fe05ce69c3a31ebf1a60f516ea8669334927e14b0fa76295faad856eaf9fdffeb766ffb347aa801128ab21c9a14411dd84692b5248e64e0c4cf14201ccd33a2ea18ad3ac69776937bd7d3b4543168ff6ec1d392e7d428a7d6a997323f3bd3715e132f989d6b4db678ea6a621525e9479b4817645ddcbb5b760fef729b932bb2ba59d4a89973ce9dab9105caf3766bef36d2794700110d0c4d3f15aa259384122415c40a93716c5f105e94c4192db05208403a589439e72f5665ef9d789a11023b5bea9071b670c143ea7531e1db91d9c3f58e92e72a232bdd956eca8853edae76fc0a2bfaa3164ddfdccdf940d3cad41a62ed7ded9d5dc3006bd524e72d54f1abf78c73b1c2101c00d19641ec883e378082d2f2b32818936004f7c5aa8a530352770061845698b68a80d3d7f99873ce39538b0d5940b2ca5e9dbe0c01f298ee690609185d4b5925247c312bc44210c51d48a061732ae05a4713a32c03c03001800c75051abbbc037a9b1a3a6d584375d53addaee938e79cbb5fbb1569d8909a12ac334076efbdbbde7b67dd2cda0c88cd7c6ca9512b566cdb7bdf7e2d5af5e6969672f71fc067ee649871138655fb95275e3aaf1d6bf47279f9ff6ffbebe35e7922535987b067499603972272dcdfb78dfae9396c5a3f3cbf90c52bd6a38b516d9b87fd8a40eb5196a8ca5a92be5998d4b223c43a0a1355662520ca5a0b44b175259584432660ce94c40d61833eb9d414a419cf929832c333b319155f622c8b5e2bc211a15289fa5b99b1ada982a811c0deac0fde505ec6dc6016e246b2f7638a1eb4ffcd02753ac562f508a9d1b8651738ce5bce695f13e7dff0e59c69475701e7fc58ec6feec5e5a26f6e4399dc5041d3adee2d13ca23a296a53a7efba7b5b44f65d8ffffd3525e3e9e3ca3afd3c745fae7c7ef43dbb129a29eac18eeeda6ba5c92e2debcdb744be5c3160befc89e48a685e41da7389cb5e8daf6bed5dfdebe27ba9d9a711770b90bd05c92f60b282bcf26839ad4c27bd3525e4b92c96a0c997e56325359716fde3ffbef66b2a72532a9da08111885b100dbffffff0fc930e455fce90f42686de7725ee32e43daff040aad5a13f39fbddd9a0a063737106f0f59d50cd81e5ea0ea4f7f130eecc2d4b23f82b26cbcb7cb39e7702e4979641cebbac111f34b4a08b4527a8261a309c8f784b2a5e311a2391d64e32187de902e9b25ce6eaec054c0187caabca2768c9e38820168209c0cd4655d82401494237985c2e919dcc12f5c31c899538fd952e84cff40799e890636164a9070841365b334f88835f88e15762aa84d67f5681fdbf7de7befbe378d7fed9fd6a240989ad50a413148d231a312d5b13cf5d2cf8ad6c91d14284629c65a740c35f7dba623debbbfbd7db98c5c4f5c463bb7bf7a1738e77c984bd26eecedb23e2845c8da4e200250ce93140ad8a7e5418fd30ad58e0e27e551c300f67f9d8d2babe930164242f20467e79ce5dc55412079489d5645814d842051c1f6a1f6f8ffb7800bd8f610feb3a76e1e6c74390dd2639f246c34c3aac8aeb498c0ac4a20c67811779ad8f2fc525beabfdd663f147e2c356bb543a141b121ce27311b8d11fdbf9b680a2169e8ff5900a48a3d38064f2866507fd2df73ce69ebf2ffff7fffb0a0b478624a4c513da94e2021fd4a68c25141a4988bc4b16759126786d107378c3f48a872e9f9c8eae9ac99570f9dba5d15c7b4a6e4dec7a6ee7003fc1ef7c57ab71d7e435c2eda37e76dca82fdff2345dbfeeeedd3e2f3b2d98a4fd2cc4994a25496b3a34b0ceac493b3c771822e02e007574f0eb2c81aca6292e907a3d2b712a5b4d4d59452b38f4df10d849b102e4e333c9bab119aa88f45f7de9bc6b996a4d00f34511d49ce2906a05a624f9cceafded19310f13028edad112dee8e279efa0a2277b7f66586900d160b53530ffdbb5ac4da80ca0b221ba20bb82a262e2964a043048fb9c38a11a485467ad111975b528ce39c0d8cbca85431794d41c201c31800040001003110c6c1408fd35c3b1400030bb474bc70382c284430241c0a85816000300c1202024130000c0603c3c260283c149655f2f201c8c38e10313010752dfbdc08ae25764370085f4c91742149d5635a4c3b274d5222c790192e44ce2b451e34796564b6ff3432d26c1810b506ef095dfa8d1286f21eea36136d1b8ceeed8e481657bf018cf14e9307f40d612aa1fc663f4855cceebfa0e8686f5a5de955e10b538a90f55079375ec18028dcd95799ecc318e75d13f797a283f6b41168227f2f52e7cf2600276ec03a4e9b1c87a98ffa83b2ae03539fdea23e87044f422df9e79b8af654053910a7e4be979c1dfaf6d2cca350d394ee28add9372cc78a73ca149d1b4982b7725a0a766c682663d6444099a43fcecdd25c441c065939cdc34301e9a9ada4aaeaadc6b6f786a24bed4d1232189371499214ef400783c55d9870edc6bafb233c0177c1c4e7db2e112e3346b2173b05a4096af06f14a8a4c4f3c61609bdd349f94fa998b7e1303bca8326f67fa839ce037aac01c0d3e081aa869a07dd68b4c900a009e1d90b9b97e7a0fe6e0f7a5137b70a057c77a76b511f9c5374f83af399c0d871d44f1e8c7bf02674d5133d4b91e7c11c76ebee229833a296f8c8d6030ff104035d00bc8fb4cb3f8088de725a74f4c6e39992f36638134446b9dc73651604eabc393b1d48615dceb767ea12c6ca68eddaca3adc7c16dfc591b300fa6820513898543f336970ce16e756b628c270759b1eb9fadea75aee78e33be6bfcea6227aa7ef719628b53ca038d9d61ea529b0f3dc34aaa3ea8ea8cdb1bd626cb6aa343b908495bdda45536a39c8a8237c4ce007a81c93bb609ea08633f8383a11a90c4aeb31082552d21ca7ad121414efae02e661d12f1da851565faed8a232a02fb3c9acf85b70632af0a2486ab4d5bf01b0881a23f2b94f70d764698fad0f1d097206b1815fe3ba3f8c188c2b6412d4e22e4a38282851147999a39ed1e34c85a53f5a80bd9c758cacc7ee50cf79acefe0841978ad1eac4861ae6bc11755045098d52314f67fd002bb113fa1987bcdaa25b95a010d65e400d4d862ea3f155d75b68caef1a889ee5025a587a5a2cbe7c20232d61d2f1b68703a901a23b600597a4194c24a52b2c0a72daf3ec0252e830e99f086e828b19e77d18a5cb7f4d8e1efb029a2b8bdde6c651cf274370ea7ca59149f7dd261706e52935612231477a988f33447606147c53b4e08e3641be4cc0c535562fe4d3a6e18ff85b029c4751f5883caa67f582eb037ce9a1a951f59d903e580c4094073dbbe377a0f2f7058587a5cdff5bcf989f4380210dd26388b32b27fc4ae70e92d511a982a200be7ef6858753b62723c57325acca13ccb0ecd4fab302402f615e01261ca6eb7a45fac9ab5b3d4c8bb209effec56d62c65a721c6340ebf448dad09ea6b02e924dff7b64a775b0600ec77b5ad6cf652c609528ffb23ac04aa4466e2bb33b06825d03923fa2c115a8a0831df50b26d8bf3738fe6ef09da5097729008b91f81bbd1f45df7ce9ee106941c873e4369306b7c4c96ae4cc067ae5d0ad7a2bc8e93e05445fcec231f54fde7246a4ba20ced996931919f26981584626320e708f5c7584f9fb8ea33a9b2053465ea1a788388db989e377b2ea14b7c98d01689f9f4743f080e535728b4352a1635cf73e50ebda5378611416e4dddb9d0f1140b5810cfe6bdd282d36f09936ab2b7f771e0957ec0967cced4da44426309f1b716693b013ddbfc9109782466b848845ce4851eedc17a2b225fe56a97867a72f51f312f74174da9f46ec0ee5c8efba3efc5679ebd9607aed14c3f5702b618da4b2e3c512a78da4c338c904b92fc1c813042dec33b8d062411d01859c91e5864b86e2ca50c98f229405046d3ec8ae477727ea8d6cf9548f8c82eb372d39da5d0450cbc2af940dce3ff0e646770e0b499384926e2489deec8213983ad861a0f2daf8fa69912008980c73b967055a5a7a5e3b18ecd5b6a336a16ea34546a9dbc24fbe278aa8081c3cf02be8870600568f496696e7b934a62874d1595a20b250e8827ce40b089103190b29461a78879322988ff6e278d73f92629e0447ae50a523f10997614267d4c8e1940a29c04012478acf64574348bf430e805473a608ddf88ba9ee6a102371a5869cc681af7102fb3c033a148fa38a1422ba82b74a81416fdd8495c3d8dcbdea77b519098d566b94fbd3ef04786241f4c4c73ad67e26deff63b284db54193c851bb5025df010085a0596c503d4bf846875dada6c9c9101a1141627cf318565cf8cd438ee7097f29559b5b677ba7189aa5b665e62edeab7b147ef02a05c3a58ef85d097431c3123692535972ee6d44f14162b4d99e9da40265303843009e609532d4840f038301a990c6c051ad38b30bf449db03489d7e5b2761c600e1cad919476a2428056574ad4a039756a324f1eea34f8fa9aca252efe8e168a2d97e6b22232261d176b8fd1cf2f9af0bac91703b0fd27be333cb9beb873acd4f591db1c22f663e5b84a926ab52764981920dd20b66e83e80d5b551a2dc1d25dc8ad0058ba28528cbe2fce1897b68696d649880c97550cecab41e2289901b9a7020c46980562cfb036537a080caf7663560a5697f70d472bc07a5572df45ef3d3f24f307422a6fc2a6513e1d5499c31bb4021398a99f496d9c40ec860013bf2928d5bfefabe6b3edad21f75d2dc15a9ce83de73ca40150ebee66d8f40e2604f75e279058dd94447a4f552750276fb4d1578ee5f64eae8ce1464da0084bf35bd5216c3560249a621bc0bfc95f663971bc17e44e22c7106750d1175592f5503ef4276a11dbf5b546cc1250839413ef94887c2a39ac37f0082e6e83bf46f13b83147d0a694c9a6d7743e50d7b9800c05222854f46bdcb8e30ade958f7f0988acd9211411e0707d5e3dc088583edd10aac88d56eeaaf077183a4767bb8e478483871e6654191bd4e8534642b331445829110f3d61c40a721bcbd67db78dba0782f2d5c69b41998e76994c405c0315383cf5fe4295cd099427cf92eae12e04e58901e8b21d72886c7113d3cd46613ef68cdb3c53e567ad7c219c3611c7646f799681b8604172960de93b152d2debffcf0686bdf6cf907cfcb32e3e48dd10f900f1eeea96ef41095b044042fd05bfd170abe39010619a4b75ab075ece5b339dd394f01c15cc02e2fd0997196036e1c24998c10b7aa50702c913bac978082e54b7448379ec605ba856d6db69f8785a184d4db18d0262d197022e47e8dc3506d09035b37145f85238c1231593dc64faecc0e417465cc358708990d9144cf140325e5dd4e32d93c7b2b285d0300bcb16efdd87f7ca1acb37d0e514986fddfa6e2f7c0061a4ad705b1f4d4a71fb54fdda932a236940a643933ded760126fd43a469b04e973eb5a4983ae02096a8ced6b4c624950f3e4a3908306083e2fff1a7678bd3090d0d8420cc2cb9f23b6536699cf876252c2eb7aa480d3d90b878d6f41bd2e762b8d08332f72aac01cbac89e3305ef58a25db0361d0eedc75ca4b1bfd7851f7ae2903281d2c21f6f1478f5e18bcebb8469808bedcb6b0ab6b1d9220694b7aaea355857c654e9fc1ece982d4e4dfe37534143fddcb2f19545d447222f0eb9b1e11215052fbbd5a152d485dcc0c5024a265f9164b4744f0d7b4c27ad53bd2fdd063224836bc3834a658cf52d73131b53ae27908e60caa8ffc7b2e0e4c4d2fc70f380151ac469d547a226c5769a9a3fa349dcdc32b5da1e56ead0c5a0e439b7622473f13e64d6aeb78cc6d1185e558266b7acb6099a6d44f3ade47105e9b66db345fbe2dda1512247ce56aec3a64a6a124c0f928c2300024c5f1448fca9cd95e1d804d71606321cfbd2fe08be392c9e51c79ddc65d7e90ca268dbb95c274c2211805e3708d26a192000351de8bf59bca88ca644a5a186ebb4bc032c2821e73005a47ecc345ed60c4a08e790c4424d257227c769ee8bdf290f6e40922c2d183655590e9221db3a603d78dabe500604041fc122c759cfba846961b5e119958b2dd7d033085442bd3dad50d2c0d5ad2c77c4d3bb89c444be23c34c8f0689d74f860891e09ede1645a21ad3440de7926d872c10fc3580a8e02091db5ccab43b18430f69b2f15901e772fa09991525f7e0c27cc83826f2cccfd84997e2d9e57137f07f9c4e6b3ddf97ca8ba6f57061d87c68f9a0fd874382783108d1c1117ebd58d0d0c312a2628dce562ae7a5567c9af58228c2010f49238d03452a5ff87c33db1dd74ed9d3cc663cfc72b6f1672f1117a0e54da46c91e31db3faf0ce6929b2dc76fb5e992c18c4355463e2686a39f96a5ad89df9a096f9862ae561341f8d1b15beeb3e5d1306024d408fba13b1a7154682dfd7e2617d3cd352b0769045d3df2e4ec5d772c02ccd98ea83b5ee169f2185dc4de3523db47d5d44fa96cdf9cc8bacacdbc432a1fb065266324477cd6c2a61daed1d4d3591ba88d63dc11ec07e0b8157fc93d4a03aa71116ccda0281244cd5552936bcbaa45aaf16da65f6464de12663ca128cf78e46914bfdf357c0d4d33f2bbef967363c69b7e95d723ba0eceb38286d8a1fab0fa8c54453cfaa33101fc19a9dc81976f8cd76097944cf88815ce1d4764b7c9ed58252b41382a2ef55f97b0f8ea14305c8bf7d54700865740bcbdf2e992014ea4659b11580ba0a6349146720b1099429175ce6ddcf728cd1361a405e58a9b1e4bd34afe3a54db6fb205899d525b24a93aee852570b416114164b05d44714457894ba6c3fbec10ccd1e1185cdc5bf639c3ae7709af57dcd947cf7721d6eee3efb5a95429110a25655f5c2eb997548cca39c4ffbec1cf921e6d6f813ba49718233c113e03205de3f8dc5317557f5cc72364f5c7488aeb0ca411ae3384001b4611f9fd0102436899d573048b169770badecdea71a2303590db4145af027e077d132497af7b8748ac7f9a4160c4fddbfc97dc3760a14c31fa44a3d537b27073a5c542897f2e74d230e3419b21ec0c16386e7c1e7b71996c0afe4843303d31bf67073a4b72a3287ab46c1888ba4a6327467b2da9a4bc02c03d47ac1006b99e15b01658df5cb0313fadc9d6c96a60cb8879d25b44a13fd9245d348ed20ae8e981657f7314f9a21dc7acecfecea63525aa37b86b40ddb5cdda5a7754917c10785fcab5bc1b792ce75533f1b521b9c4106c6b1a2c3190f9308615d33b10c7bc2843cd21c069d0d9b23e68d37ea5cc607b025dd235ac21824f2637fea87367b954fbb76a7a63eda055116b70ed279304e846da0d58a08d6d03764d4354ee3b4610433e6051bd27147c004841814b866c3a6ad0bdf2e8115483f329d4da411398343bd0e9d31d847b1e857501de40526cb8eb5338b62984e1917a464470f2643f0403911e58876b1377833af5757df83c895b197e0124a231b914bf268e0ec61e03030cfa1253c371b7dda36eccc4f62a9b2ae759ef62dc78924426e61ad01ede640075c43c826a234607a64b4b9794ad4b432455f24f775f382ae60a89613088a4f4db4e4ae10e8129a1981b04575e9163a76d3f44b3c3cc67f4cba3e4db8d004443d3c8e88f478ef05b313d20f86c8d0ddce8a1d86c7e6b00854c9b3fe16d2edeaab95d5adc47afe0a0a7e6d58f6d3cf851bdaa8d411e5ced8ac574a8fe95384f550544b86a0c1259ff456fb63d56836d85f2738259035dfb0738413bb46a888283d8117ab32e84ab437a81ba8ab75dc9a3e2430ef7a7ddb98cb9b639d34403c90896da7c92abd173199799160566bd84acc4603f1626bca8c971758f7d02f1ac8878eda34a4366cebd11924820ca23a2d14338009b2140fd19f416b9bcc8b308061551e993651ee90819917f7fc98ba4f9a1218402255322406a32f156d53d5270d868542e52bfb1dad29ff750b1e9a911a5719e58c85510ac42d270159fbd5f425738975ad8a62c88c3a62cddacf32970b6eb19d6345c8c1f2161d2e49e779de3ae7db2878faca9c19688a2b4ed1a1ddec6f3793c08cc3f6d77e9369e140f5b4581136b3a5104e3b8d9fd38a7007c70a92998fa55ed00229c28b7024e556cb0a6bc51b8695a4329c3bb2d59752cfc341e2becaa09d1f91b94b784b340d419e4cb893030a763a24e009629c809c2d89621c2bbf760cb41e027924e4a97dbe68137262d824cb2f8c27d040f1df0f8b9572ce19c97453be39285b0411159429ce92466a3b9a1bb32e6de0b1ae4f0eefc0c75809dc3be818b345a18a1fc03b88de32a715ce57290aadc00a4fdf7b20a1282e2c403003a7bd01720cf4473014a1aa108497385a4d722a302314d17f7fad05c7cee17168d8b3571910a6182c9a0fd80cfd5f4579e518b0661053a2cc5b53892f844e343fcf19b99978005d6cd3e002987e34163610b5e22fa462e23f235f9d7050e030933a44fceac299a59fc32a48211bc91467b77f1037f83982a1ef42ae0048007a68340ff34c320d8ed89574d33e348557808a5f229eb2b71ad6033491eee35b764966353f039fb434cc6ef3072fa6f5921678656ad83ce4dce0c291512c6be0aa445263aecd781d89ac8f970b3ff0d78967c41f7a9c39c42068248488ce5111bc3d920e3da435f44066c06c917b7e862e596429d12ea28950074ecd2804102b81adb8b4ec2b931d1c4d1808236f21b6b16918f80ec4bd386b5497ce495fd447870b684c5835ac93af3a7cf5bb4f2346e9162670448fca58658d7d80c159f70d73b0c139fa619bc9ed38a194f012f30a554520c335730de9a415ada6d350c5bee050d560431e33a84b9098236e9054112637ea4ae08b229aeab55a19fb3ff8e207123c80a71e7a6f7e699c45181c1e203ff77c7b7b57e344c748d0ad33e9dcd7c1743e40fe867e252bee286def1756df3e12e26aee29a1d6740c009ea99c3709f00587f401e67425162da57b2e2b2f7a8864c7f29913192301226a6febc7a8ffa223f8aa150b233f4fd4fcaf451f965014a5421feba92128395606106532910d3d1db729aa57175b2339aef5466dfc618e1f24c23da38e713380ea4c4080c2d97bfb8aba8fae1684df51544d78c87031e604aa8bc87fd45793e7695a8d318014b278c6fd5156609601f64415cd2b820ed79340eae54d535b4231073e616e116380d185281f3c3466151a51b450360965ad8638beefbce41913bb2a89e91738179cf3295379933a73c19b2f99e4e806236481bb69ab1579d5374a12186b627b4ac60b9b21fc542af84c4bbee7f4bd011637c2acf39a46841f0bf35265f64552cb132d21ba302f2a3057c8fef1233dc189282f309c7bd2f8fde49b53171796b9c5e817ad278d3603dec388ea8b56a5deb466eab7057c9615244032986f10c53a224d23bd7b721fe857eabda0e817fe48ff6390e5e341175cc8d959f93ecd3063f42689c89efe88cc2d1a4603426839b201fdaa107392f8082e87f7ef9a37a333983cd7be9c0212727e32e12bd130f395a92482f096fb1317b5dd31c0ac54416c5e9f3fbab617d0ccfdf24f225f206c153ed393f9f6887f518e7eba40e3f48b33748f0b0816f5535655aea989bdc722d3466525ac88b8812207ec99f68cb42becfd9372b67c176390a8dde026d2f7a7224ae995e546a3651453e2e0ba2e2aaa8d515fe5d9ff33d2497ea46e85c0f954ec459b050870c6e6f9055913232227e78951ce650204c1b8d5984e2521e6e8a79b120a980b535717beceb15fe20306c5e6aae09515aaa5870bd424811a0e7b87d33e95c23706f212be8b1e0dfa37d1bcf0297a09458e2e0408cc5db3829cd6a61b8737f1b47b900e7dc1f349bf63eea12cbd177c50a793abdf0081660b26275c484399e27884e7b8e464c26772f146f9893084520cf332a936d143aedce43577a8532237f295d424a62371aeb1f59abffc012927519cb7a30d132d62f30a178b6e7b41521d62fc0643f8535955d012e7739babd2f5ae9f089b8e38a5c0649c322d5e117865750f36a379820a3a18cfe122b3ff6d9eaa81311f03ec6ceb6efdf46c86324d965e8a50e18bb30e2ef5c84306c1a30cb1ddc3240604b5802c1b996584d0f266c03e1644aa3c6e78938d992bc1f5884e45b488bf93499cd8162db4d68709425858098210edf79ff8d11f958233c18d2ebaeb42da525683965cd3c48e8a3f80b0146466dc581df6c1b6b8a48f68836f04725bdc4e3d67620c72a5c3920007d712b94684b91362668e99a74e7321c457d5c94f6f040f0f111d7a6de974d52e3fac392d34bbae9306f29ac382916ecf1dcca171e33bf9e06bb58d6a57013cfb47bbe9f05e3121f0612479e980049cef865e0ce5c93f1d969f57a6c372781d4fb7eb93264f1a8c1ffc9b408530ee9e06b898c463d043ba8cef57c950e16346149b33614a5e664cc444d5ddb80cadbf5f392d3692fa923ac3b328ac7842823a2349e6bc43a965dfe9820cd3896e9c5a777231a8cb0f15cc90d84e7885ba34214a36a941eed34122bb5a9ce8e08084eec99630839a9359d72b757cc807d0f143918df14d1aad1eabe5d46c3a10746bced1a35c89e8edde5164fa2269876e307deaf00f4c264a6f2aef99fd034601b242f47b1654689e0265bcb406343b1830cae34a5b0a6846e1b2bc142eacf82c10edd12d176158eab6d1ffabea19fec10652f0747ac676d63966d69c22245684ad1a5e92d24c149cd8eb4c1e65cb54c012453be4a806bb49c82e4128d08083631a7b5df70548a9c5b5c3e52136ac2a8297ba2a5ec0f0bbe19d00c5da1c047306850bba85504a603f2047f788b8533be99c8375e86fe298e6f60aa24808f48228c5da161d95b0f6924b9d5f21272f6f9b9e236a8ad5fe7a0e34d30e3b93d81f4054b64077af1603b8655b20ab5d2b7c90ba2d7d8cfa4265cb4c4748cf5341b403d3c452b68b10cae3bde8b97ab9a6e46ffeba6362048ac7373f45cf024c5d015d62d71ccab6eef06946819590da2b49be5e22265300c0c41e28cd078bb05be4350ddd128d2028f21c3832c624680f547d980690ed45535d6260a227a33c896cb30cb2b9e986abaa301551ad570ee1ce51259deaa12a5a1454b1bcb638b6c9b14e527aca7938c123281d2b35eeb81fba70f778656230ab203d7f420a54d99af848be2a37f4305a70d16183749e1bdd5fc03117ae51d6aa90c2cdb93338430106e07dc5026eedf7e48b8cd500774ec3df090d4cb5ea29d9197f3ab3570673592ebd13e8c8b94b64519806502c778f4f08d9960c137d9023b80ca3191e52e7a9c10cf8a76a1241d4f1dcca1779a7d98a8095723c06a202dc663551f3d1250385718f8c06d818267e979bbcbd7086672c081840a3ce6d0e0ea5fe0bb64ff36df2a966324ddfbef9fa817cb08981ae47071893ef6254bf5291bc9771322b52924b92f49bf09d72fa8b36c53f0fca7690dd41b281cca1801e8e2e2b7290a3435de797266a4bc223722c6a64ef16c1250d43e3d5cc5cd037792f41248888073e5ade7a6266f446deb336426cb22ea57a9d6e61ca1b3d0f377d65a023afd9fe4d446e3366c26ca2cec1e429183e43263d94c70cee9a57ef0579c427a6a6a5c1572c909d389468cf52b5863809d6bbd91a4f035bc70850df3313e8bf5a603117e79a91dc84bc281f2707575c33242073b2927082da9483687705d2256467917a23c3d108119f7d91c1d05ce34aac3d56b44c2191ab1d2974c541002cab8b95d5e300a4adb1c25930cb5a8f45028bc49d35cff99f7cbcd5f96509d551d3557c5b3ecba88aa2635e6bfaebb4e8a8a07c33a081ba140ad544a562eaea1b8d4adf71e545b1bfb0b714c60ae08d40942ff6eed0e35b32666bb6bbb7b4b29a594016a066f056f0543189de19386e8ead3c3fff061bf8a56c6d1307c335dc574e53dfc325d79b729990ee5173ac2f0b612f9f9aa8f0a1541413e6a06401a6058b431ce018257e4e7cecec9314e5575d1c6374aabe8e1f8ab7efd5a92bfd6ca5f75cc5f77ee5fa19baee16f186a71895a8c1b519cae61b882e905547410ecdfcf2a7a7e8b91ecce822572c80109461235094c86041104a949052d3056228f0eae69210b9730bd2845e82a100441106cb23536e9e260052a6a3883979e4caebdf7c661eb28292f66ccd7de7b1b95e2de7b6f5063ade08185836b87c40e22bcec29d8cf2a86234ba640e001301a07bb0b8d76a00e5fb6f0a0848519b69c5c89d2aad2e1684a14256e3077db460a04410c46295412451d3246edc2700cb2830fc66b129b4a10044150d44bf0d092e58b1a1b92b8a25b4f1e378a680d8182e2a4c7bca05bccb01b2b38014eed25bac80802791a6f1293687be42e47d9ec86979a357785a7252e748559b2821110566c0fbd215aa03202ad294234150ec2b6441719b1016c00810540f60d5c610fd7ed8a20f3c055f6c84a19abc65f4a4c7df9011b311698346350a821882c4750804a91a72b4b8c41f2d35e6edc68311fe6100029646ed60bdc7b6fdd13ad52bc223366479223627ed0ad67c7c15cd2f797db0a1a20309cf0054c939e8a592670dc3f2b4e46a55985fb403d85a5012b214a538668ca9143cc2e1413e57644126874984a81cc152474181e3b9e5e31fc9cb842ac03c7b2be352f500d972c141af3b803611886be8cb3a2b62f35e48d1e6aa91a92d7103c3a1177e1de6405458cd0a1b2467bc770ace4bd63d848eb1d0892e3de7b37f98d239326d04cdf5c361a282e78391364aa0a1407dce064cd0790ae108143b7b518f9fad660f6de3bd4927b2199853528a20826241e8630610709206559eab243882630543aa8bf38914d78390cc3102be36c18cb380da87d7a8ad62d0c6378ca1e9172c145a28cedbdb7a82b22872952be5f5593dd0b57447046091f5d6bb4175549990f04d10312321811c4088f2c245a58424735e51f1ab780a129f37863ecca0a1dc44f4f9a6bdc2f942709643e1046045c4b3878baf55c9365c81516988460044a1dd45dee14a62934cd85eba62ce28bc7de69067492f96e17242c6411522a7b81f2cadabd7a4ca054ce342f0cc330fc91f1b6f5f61e633a4030bcc0c80f9a2cf2d4a2c88e6f323d8492cfa400c32ec9499424312756e04109263fa2a67a3aed3322a5b7c872de911b06f245d513d528ddbc46496b659c1597c2292e1e6a31797b8349a20ead163ab87a612d4b8f4fe78f9771560cc3f1856b43f0826ec21425291c61492310a58b34a2c95a64e6618b872e9e264b0cd31cc1554e2da100ca6f64525382c8096160c861f505073321d071a647970a4f6b90f8788cbe1f39da675b484929b5c0f31185458d0f49425f18ae1ba133459272f0c014d1a2b5ecbd411004b5440d822008a2e1524568d93d7cda46019bf4302cc3100435d20c41a47004192351c618d9b223a74c00099613902053266ba7d35972786ae51d035243c8430e3315961c5a38a20b07943544ca1d8a04f85872c488334754dda0b104e90da9d25a86588120d78f2c345a53ca4c71f2a1e8052c2c44a6f8807503920f48121dd45047f4e6e2a14046f9e55ad32b8f4f3a66957298a4a7dc78d2044a0b2c7ce006176658424306c7cf8abe627b54f84b98499fce09403aa686c03790e0de6b07a972160382ff546c19d9610744105844e8d613cb6f07de1019a8bab8a0add478992656001b9a4ee01f4f4f509bc9123aaed2d512b59a5f0a637c6052050a1325616e41bf291f63968af448a3ab80b0bdf7de184a5794230e468c9505788259c022f8856118e223252f26666259fa8aa755d830b30503913057698a82d860e30a88941417315b5c1842f78eec64f1b8554ce3b88414a882110882208879380c4b1fc8b0078fe98bd20850b8a2001dac54f8712de1a307ad4160058220a885276a1004d1685e19be94c6d88ed9dedbcc4be0271528e1c3c80f205e70d848a2a1ecb80cb1e28509979f09da862a4accc090b42d52bebc4cd37af1d8bd337ab6f7de31bcc300972e5e64f8d2c5c9d63ee28424a682a870c4a56b70a19c0a9f5400731ef7d641b6d8c194551582577eec10e2c8de7bb310415529ee0c720982044791a1965f20088220086a208496a8a77a0451c18732589c10918608a95711131aba44216395c40b5134153461cfd44936031b4c369a4a281b494c9005961c430241264926b013bb140bc3300c4391dc1f0fc3e6636f7b5137bf446d37d3dbedc5ec610fe3e68f6ecc1ef6376e3ef6457d085f73c5edc5ec691f6396decc9fbdd5d1d25b19e326bd99b38f21fb595a43098cd9f3af417bd9c7e07ff337698dd9f35b99de5ec8bef630645f4b8994944f94c2e05ffb5a4a347bfe453a6bba38a2a5444a60d07ef6444a56a7d937c0ea6a9430fb595a420dfeb5a7a536e36aa9c518844f7b400eb459fa198771b6fa61c948274b9962b06b6a70fff53230d0838f571a3a68f501614c2d5685d0b8220a02f8fb43f41a61d5ee74081b75fbab4f8977103a3dd4ba2c6bb5f3d4d1419283c5f197f6df5e70830f3fcff05967f8f430dd00abf933b0d1c1ef87bf5a2827a4d7c51e84f051a758fa01c6e5c7b2fbabed1ac3bfbbad3b8ef789704ec7e8084969095f214d449e923c19c34b63847bef15bb08a632b09a878af0d5764901119558cd6106f7febd415835d153cdb8fce4cbc7c5101cf742bc87c836e75cb6e6ded74675fd1f6020fdf76f2fcc877d0cf361690cd807655c7ef1d7f15de41cecf393af5b49ae36eb5596af1f01e77276d7e828ff4dba4a4c42663dff25b2cb5f92af19f943c8266a75b0d7eb757b7dec958a503ef9b02fd211613597280cf361a999bed55da48ccbbf7233bd4618838c4b477885e003a7f14a6758ae9eff078ae70fcab9e7437944575bd5cfbe065dc0467dce61ca6f7e61b008143dd4654d67475551a000f1fd9d19e3f2aafacc1e06ff21ecd3f7d36ebe4857ab3ded61d49ef6e0d35222253729d1cdd7be4847cad01bf8e717e966e80d4c6f2f666ff330666ff3e0dba4444ac01486eccf9408e7654f74f3b30d3090f8f957b183e0cd7fcee13cf836f4b4416dc69919971f4cd7193e5d4437a87571f1570bc542446fe07fc6e52fd2dda037301501c6cde388d000ab3b332e3f0662df00abb3799c9488e826b51957a40b21e7f2ed7abed59de967dc7eabc3f97c93de5ce0fc2d9636c0ea70529b715777f3b7185777f3577793fae86c529b8b7436e3322e96bad89fcd94a7af743dfb88ae337c5a60a01d8a35d4ea64a8d5658081c49ebfc50662bf66087e888a3dcff051800d9231489c786a336e27bf8a4c1c6691637fcd5e9491bfaadd661cf936a89b335486dacc519b7131d466b20481560d8265edfc1d143e3f412a3200b50833cb27ad09fe45cb74f52167f8a062a8b16a49acc904fdfc0405815b3f287c7c2ef033e3e76eeddcabb377768af6bd3440c57efd51d16f0f67a12c1488310c5bbe306db9b2ebd9cbaee72fc9d85ebf636b73e4dbd102b5c057f1f3ab28c8cf7fbe4ad3444b7e57b1e7be8383bfeadb8bf15f0f8131b519f74a6f1602e0df6cea82fcd75b5d16332eff0b1d519e27dca61f6035ff4f12b75a46073f3fbf804f07c13e8dad5aab05625d45ec4b9d739b7fc4d22d8a73c705c6597bf3ab68f32bef64edc9dbe33c794b31758155fc26a238ff272489fff51ae7b8b5391312fcca4ffc7a926fff046a2d4e02d45a9c09d45a1cbec2bfece30add1576a9db9c048f9fc6083867e2f1bbc040af9f79808164287227cc1426416a310ef6e69316c57913288ed729b94f92b7c4419770fe44d7a27e9a2b3070d7749ddb75d25b0bdb759e85ed3aa9ce17757b4357dd6f3ae86a1fe7495c5ed496f343b8a8df50fccb4169ec6e4bb38fdb83f343f94435565f6fcd1538784693fd4dba8a36e9ca6b696971e1c76ab10f9f866aab863f43ad55c397a1d6f218baa230add4bad3572b25551b8bf8a040a1aa3e3ebb68e3fbcb6279f2a7fd1ad4ad6cf6365d6980249659fc37984539566fb05403dc611be09c8e110c0e70ee28ef9c749c3b227b5352be74fc3330d0ed38cc93a78e9f06069a75fc2360203b450354c74f748f70eeeaf0c32e900de3a4d7f1b7c0403a878e9fbc34d4ea66a8d5d150fb3334841e7bd29ab0bf682c85a10f20c3df45b73f9403f9b9b53d617e32e685671ba222dcbed6785f6b442c7807d39ae5d127d6c138fd361f5fad0f0556efb7c8392b9a1a800e80e2f7f5e7232ba92f18f85834a5cda956b440e1076ace89f9832bb4737bb4d9cdbeaaa2b65739575a1cf8fa77c0d7e0af36e0af1cfcb58210edb100b0ea002c4ebfd66fd3b550d7fa02cc81e5d16f01317c0656f5ebff31bab219c3ee0f616d55f04354b42a985acb03be88bb969024a4ddc1e88a42147316dfe2551c57e4c0b7adeafbf78cb4f397fd7e0e722ee7f7cb981102069afd7e1a1848f6fb67a80ffa93837ec6ad3382b05a7b6b3240c46aed6f68e75ad46d1e9b2b6c9ebc369bed59d86efba23e43d7efb3e7e82aa3f3bf4157dd6ffe44d7dbcfb7a1b3f24471de9afc87f00ca5fd8916758e43fb1b74c5bf4efba16c836aaccebe86f2d4627596835a1dff187f187fb37ccb9ffc6bae90a5228ace533086c24cb44c575deeb4bc4636781f21ed0e693fc06a06f7d3d32502e22b64c60757c8de6248f6aec0adb518e6ab327dbd47492c6c016cf0f5eeae80ec962c5e80721f7f28e3f29973aea281d521df902edf5d007cf0117ea4f01b0256a71b8cf15d94ef748311b35da739f348112d18292544c8c0030797138a9254999272640a4b9518194c2b942122041a2a231a48c3820fa91ea42875a919f783d58cd5dce3916cab2c841c42cedd2616975f4aaf62d4f3ddd273be523dc0f4ee2c0f0fbe5e21fa5bec219b651d1489ba32bdffee706efc5928290ca42d971cbcf55e652323777764366dd16243dea245a9af972a8368074e4f6807313ca11dc4900468fd1130d0aaf6bcfed0c040da4a87be969d4cacdfbb46eb67a1bbfe09c2b9dbcb7fad1002b278b13db623200b98dcf56b9bc3af635d254714e9eac6fc04ab99e8f23006f9c75ff998d6783dfef5ee5ebcd21b07d0bd1e7f89728c417e123d332eff8d22ddf844386a9030fe017445baf18732794d0d9c4818dfe99572a006fe1274d67431a6445717c5736e02a72d463e6c31418909ba6ce2aa4c921041b48c54d1e5d8d60b647a5cbaec78d2e5bfbc9cb3523d8c682284168edf0dbafc9f73f8653bee16c5f4c4322b6211e35e663448db8b616b099b5b1efdb12c5cdc32dbb3f9565cb73874fdab4fd7415ac8e6b4c5dd2b5dc474bda34318a64e35c617fffee6401c47510c6d587db151be272247463f2b2a3ca6a52d2da9a8244f484757bf1e15214c5c5b5452dd070599b597f0dfd48a5251499e34923ebafaf5a8642199896b8b4a6a9704276124ac2ba8de6dba42bab8aebdaba5eaf66357384e63b12bdca6a2b63c2a87e2fafe60d5e23a0a0ec5578ddfe254679d7586f95cd0661c6efcbae3544acc0ab74f62abf54d57229d73865d27527cf2354abe88ae3b5d7c91fffaa29871a2b54216b83df9d7db45317685cb52f1495d8a18c892312b5c7cf25e5c62f1498b6fce7a779dae44dd5a1e51e4c223aaf31e3e8933ce62f843b845ce8916b8423bb727f3743dbbe833531f59a23c7fe63b1763d85a42e7e90ccb130256f3ab39c3d2f534559d66dc6d52bc24d3b5ecfaad087744b3ca9b0278079f7750a73676419f4db15fc3bafe3577fb359ce319a785cadba351dc6d9ed269980a083bd79f5f7f50ce8529bf3dfac3cc7f4a4e00dba3df72cb85bafe1528c8f2e8c7c08a879f79ce05fde83f4ffed36fbfa8b5eaaafb15bab6e7fe0dca7fda206b79eefe6c2e60a74ef7afc941f8444a6e4a5a138698eebfe96a817e3f7c6caeb8223ae3ec1cd5a0d4198766487b85eedbc75728bffdd1e6c4b79f5ea1fd680afd362766dc057aac6a8bbb2a56f5c72ccf7d9c05ca56bde94a6377f06fb72a06c25debbeaa5ddf05807f43405eb3a6879fb7bd3d2188dadbb3df6a00824fd28b22e73a3a19d834365fd19577f285ec610f01feb1bf321997f1db0bdac33e86cdc79ecc6589de6e2f680f0b60288e2fb23461312e9bd16a363738a72de7a6634282138fa613ec505081052aee020000a0bc00f76477238407542abc1e6c53f65b00d533abceac0aa27c599aaeafefa7e0525da91f0d3c22eecebdbf222e4c70afeeefa7026f85fbebfbd39b75b17e37a0a077eb6a150182bf5d97cb8c9a13cd097c848dccfcbab0511292cf260523e125ac6466ca4644a9efd711c274028199883499b1020437257932b33b79787ab2f3d9a8e01da68279669cce1f30afefc7c150b86706c809b8d7f7dfe028ec33938367cbb1df864aca779ad95fb3aab2d9e2d9d84fbbfaf96c47fb675958fc8a770681d5f7cbb6b47c31ece7b80b73cda678b62afb6347465e4e218cfa7e5812928f05a4bedf5c52e25692f6974298684c6c20d2540b625bd2d4f7bf923cf11862fff864b78309b620bbbe5fa4c22b8b387de0f5fd2154cfc41ad2ebfbc1285f8dca86c3d7f76f2a292ce7d67e6d5505c5e6a3aaef7c957f659c4e2532cec2025226df9ccbf0b075206be5aecc55c604247c9d315d9cf50643717c91a5098b71d98c56b3b9c1396d39371d13129c78d4921694afb7c05ca15f446742508bd51d0a28303538328211c1d3d2464948b3335cfb2758529a9db1a2d4f7a742985e38f8ce1130f5fd2891a6170e365e53dfff499e64596c4e9e2ab040bd45d914f9f76b34e7468573395818e7c50ae59cb13dfbf7dfc0d8143921b03cfbb78faafe9fe72daa6f333fd9c5a2f0b0767d3fa6c2cb4fce1f0faa072ef19de9f5fd37ca072eb13df9fa7e4bfe092a29990ba711527dbf045655562c9c6b7455df6f425fe99f158f9dced2585626a880d5f7dfb6b442247a5a7d7f8eeed25c5c8d6d4973f5fdb62323b3cca966ff99843452d99890fa7e9c252572cb69a5d4f7df086102af3831f5fd36449a489e2d85a6bebf96e4693be19d4b3cf5fdb4273b1f0dbbbe7f46853722e1d994787dbf0caae73b77d8cfa37ce40b3df6c7a8a44c1f3c23a9be1f6655e543aaeafbcdab9fe6619be1d7f797595862b75b74c071a6c1eafbc92dad12099e8d8756dfffda5d9bcb7726b17f3c32e26a783f8cfa7e318a834958dd0f226175bfad0852df1f9266945050eafb4173cac7240353dfbfcd295e130c4d7dbff6f294e4a9efcf62baea20f9baded974ecc29ed39c9fe5d93f846d5df8aa63d4b78e11cef9c0748c62a4c0c96eb790a9a1ebcf688c14f8ee760b195ed7e99a4305e465dcfeb3070ef2fafe1c5e0e159cd3ba1ca8bed71c5ecfb1caa9a5ed664f66bb59120cf4fafdb3a7199119138d97735ab77b7d7f074e4f30d07a3b707a32f345f54d6575d56759b3ad59d75152df4b7dbf5d6942faa611e99b96a4ef19afef07d3581556f7c37eb02b9c83fd5e61bfbe1f86ce8460dccee98c09abfb6362f89af3033ffc75c6d4f79368ce0fe7b8119291916e15fb9af37ba15ab43c423fbe823d193a4af70c12a40736c5fbe0e3cdf1117d1f3c7711f4fbe0637f0e3cb029f4db97f1814d115ad04cb71f012ba46f4f7efba815715c002b01d42a5bbacdf5fc6479f25bfb15b040f788c5e60a8c8f8ae017e907095f6defde7bcf9cab313ef9f8f5e290e5c97f4d18e393298c575a028e02846e4c95ec74047d856ad89efc794dcfda6ae57c585551a74496e789c7087e93fc2ce1f9af5116c590856bcff165aa7e126c6e4c39b8272745135e3c47d7a9bdb8f5bc1db05dbabe226471fa49b038fd1d90ca6142d74f9ee8719bbeda2e0cdc7e6b58d53d28f0730058f86aab886c8adbb73559e05d5a736ff02fbaca58712f4a63770fae50064409580eae10f8fa29603370eed0f5776053ecd755f6878e25675384290656084cf9edd15f643960556dc3e2f408b7476b1d7d03f809f440060758ddbfdaaa206e7bb36b312cfc2d8677b77148b5c58683539bf56e7ef6341aed3ccff38b3a0e4e0dbdb9f913e706b599fd8d4d9a6db83db3afa12baeeab31fca34546395bf3557d87c6a78dfb04fc62e8bdcadbd1b639243f19cae258bddf5b518b616751d8b8de1f6495d5ef3ee2d8e24f4fc2437bec5a503a0f8888a4fee72a3bae7f0d7dc039230a8742cd8f5380d2ae5cc0c0000000103170000180c088582e1a0781ce5380ee40714800b5ca038604c208b0463a1600c08830201188402180081008601208e81000c63a9cac5071effcab56a5f71569aab549c4e260fb072adda57392bed6a79955ba1ae9e56d715d16abc82baf2afba566cabce6a6ba55ccdad5257a6d5e58ab012ad4259f95777396106a67d25bf0259fd7a657738e23dcf025b08a564bdc823bf36e0c1cde50c961e000fd7e9dc79518de94b8da08bbac7838a7a94b8fb745ea87f0a6c3a97625eb1f802b4e0240c27af54b846fa84cf7a5e1c2af2685c0912d5d27991879d028c13b8c5771179b94fd03599223d933e5ff4ce91c5c00dd2ac83fbffccf309b6c8141d29d81ba92d77a9efbfd00c8eba03fddfc487b5bc2cfb4a24371b310f89e91c2079df079475c2594c8ddd68e30907304c3fb852b42d80d1203a3669a53f7b82461ea3759ac3aed706681e8281d3286ccfe3b0ad2fffdb8ff84eb3f9e0ff712f448a3082d9e855951dd49d5b08b0cbc6c798fd53a1a8fd1079f93c0941302c08f35e25792909564151a46a357dc8f99c9aa0d7360829e9a93ab222418e74238b16400e7d8ff9af45a38221190ccfb66f1a31a41ab467a7bc21e19d3f0c9709c6b034527ba04233eaeb9b8405ba90bae58e17bd1f8abc4f49b6a81f2a9b9999a69fb9b27b3deb5e3efe8aa2b9a13d6b59e557d02bf3d56555bc12afa057fd56ae55dbaab3d2ae2eaf722b94d569655d11ae8a57d057ffd56bc5b6da596dae14ab833f85a58dafcae5f459635fcdaf0e1456eefd7329dfa00c5dbbf71b38be69d39cabd09c1c4a4bf7929293fb60042353e321fa7c0f0dd336dc9a326ba9d24522588d4ca9da1b640886a81b2171ff310f25d2d25004834345951eb4f25e69f6ba255bde884dab15f7d020d785088fafe73ed00bc2ae66428206e5ffdaa0d3760819dc7b1ecdd174fa2c231ce97214cf8cc992a76c36280f36522e5cad108548980ca3dfa1c9794637a12d8e1c90a7d470d40afd03d0c1843ebe0900efa9edc34b03109cbdd96d60f68f4ae06deef3aec3789eda9e8721e072611924db7b0659a19fb92b0c2b2221afc39c41b7f8cd16064b83da0c5ebdacaf1d0ff30d48af8ed92916ffb2c367ba26123b3e61acddc8f5d42cbe78548767e68996feb537ad5df1381f1653f8ed8a48fcf5798b833c2627b1f8cb0e11ff48af1f7591b3e1542a5411175290086b1430beeeffc2c24e33b146161795537256319b4009beffa47cd40a3bdb805a18754ff1cd212ce1dcb3fab793373738e1bfd011cecf9541150b5389bf0b0b4391014ab43068ae7752a26a36ee4e1d7d49f7d266ce2da3f71fdfe6585539ae1013dd85bbe6e1651c215739e7ff80f59683f2af23d353ae33e8f22c1fd4d0390034d9bd42df2338c1bec9732c54b919b3fb70ae4e4b9cd76d0b41b434dfc788f5c008474e4f23832ed93508ef00f30aa0384926fd8eb090174ec04afd3c0ba85e7c29f7851af9c55586314d3647c1c19db1beb5a4ccf517af5322fa7b3706f633ea4af471f620af8a439c63ea460bdab3b7d6bf2eb98504865b8fad9bedd5d7c56ebbc7bf5bbcd4986350afbdeb59104baa3e769c2125e545a498796f4620d70a6c356c3611435f68010e5fb4f0589ab1d09b5a30463333e7bae4e4767d534f60e5cfb5b89245872eca4a16ddd70890463511f2b248adb3aa4eafd6426fb45456822b1cca90a85d86e312aca594c4e91d1ba4b6a693970a19e7acf39b59f4ffa8bff2cc6a011d8b0662a810d0a80e3f2331f60596e5971dfe3e3ef8f0a9870c08455daeec508682a0b93897accdbf477516e34e0103b55cc08ab5711a2d697860196a3d6eb0e4b6344520c1f26ab45c2a024bf9730e0cd17ff604188587114609155874ad00ac7f617d1dc86d4fca199b33500633fe1ff862969b5ea8459d933dccc2427f70852c77aadaa6b47859f6b681dc80fa43fc61f015e68c3063dce1394a83a3076212dfdfc2850be0c19d2bcde998050943e832b7690a7d383ac70d465afab8061aca7e52ec9555784ee651dca67b87698b3063aa6d90ebe21a4786878896d1fe26ced244315a6eaad699e81327da47a0cb9b9e946d8a27c7702224dfb72887a3908ad705335d422a48aa7dcc3edacf418d2c7364072ee796b1c8ed8e0f436f1a8b0b120d70e0d6c8bf65d1855e52914973811cddb6d394d81fac4214defcfceab2c46949926283875b8a4fad8d1a701b3c92db0959e6dc503f36ef7fe0d3e22af5041acd45c19a01e6cf707105d60d050992d7e11105e1367e029ab6e939db4b4739bed56a537afb937e48914d12e74d12f573891500d6ab0088a943d1a371d5de0de042330925d68f6389a0795f9f19f40c814f58666de58d8f788c79c63fd5854fa0e34f7ffbd5a3b860865254262a184c1faea0c0d5b1d08e032b3736ba6642888f86c08e1a62b20914dfc976b61a8935d0175cb3a282675089937dbe92b27a97e55e635582ba9d13e08c5c310d4b34cfc9c1919c292d5f34ad0047ee221c7b0d1fb280e383c90224165213088e47d9c89edad370fe676faae88d3c6c27cc9cec61b3a26df0282dc60344119704df52c015a7e350d666d3dbcc860d96c77abc9e4c98657f92ed53eecc6b5b3ef582c809e1cc7b21ca6a10ed239dbcb334c1c4582681ea5932cc4b88490c02722e6e9415daca71ad6933b209838865801e6d5a95f22ac15098b09ebcee5dd5e9a6693a2864e207371fe6fb606ecad1942f24f53dea01761542c38aa8c392ea4d677a82a672134c720503d10288eab9fa4bfbe5763d3c66e175e04592d6c6a6151198a82f927e0e74a00e81724390219a2bbab8b12cac780a553c32b01880cc60b31f813c40e4bd027377c5234e834c265763e4a55d82c1dc7b48b9340a2db316be98d1e4be30f20d35cd0d2887a3e5ab7add8f9502b0c42ed9ef863ccdfc136c676c176e6847019aca5d2058701067241a15432398cf32e5412ecbac90211dba53ba1dfde52c403cceee1d3c06ec6182351e58226e113384276033f45843a79fab2672a9de09cf9f5b36c59d72a101858a2b9f61c3932f20a5b08c7355d67ef95fb9f2e40ae808096454f2935c010d00c4238ed766ec6f856492586f7ecefc7b9b36cd5f92ade17a6df4f71dec4b09427862168f1a3d674c05b2873bb227300de60269c3abe06bcd3b1258e6387c94cb859fa58fcdb8ad80667bfc0fdf04c60f500fb16cdee5e7080f9babd46d72a5bc2f44d4c84d05e06b6585e9be34d36dbfcc1c85996b14eef8a101e24d70a405c954742e65088da8e7fa32b0faaa598bfa4930ceb0c1438ee048d748f85eb0f44cfb6a1a92576e3c9868dc5ab8222f106a7fd90ac015f6d1c023bd1c27c13bf4c10abb48bcd1d37d72a6f43637cd9ac5297a23d1ce919ca5ac91e43bf438ae5f372c46b8448d3aea85bc279e94060d31c163a7ce244bb6bf58ae713184a06e91993721da51743906257b513d38073790e56ac2f31883221db6727ab8e20fb5bd54a7889f258669b7b6100bd33839a67dc629023230dcb98952fdb1978c2358021e52dc6c8c2b4560c4652f547364c1b2cd7f76077c16442cdccc916b45903726888a48dd5be867bb7ab81f2bb67d19435fb2371636c184b6cfc2f86d89e7b3e7bde1ede64a7d4d9514f981d47a68595073794b722082a0d1c3d765ee3e44f13fb6bf843d47a7a02464378a6f618b571856e2565452ea00cc97bdeb24a024b693c77053e5f032f03c6e3714765696dba62799ec84ce8d64ef9ef2ae2708eaedf89a7a598b4485262c2a39f8c84dd5bd6cc2aa9362d1937e1c9c89bba1a611e17aa38b8051b5b9c4392422b5da4b7ffa97c86e3452e552c015d5c8d17fe98cb9cdfc90f1dd823d42a736d8d4c9b77478c1c7ba80b8f0a4ac5e2ad4d87c1805617bdd03500f0f371c3a1a7d2147996f3e46a284d4d4b5571ea9776ca2a299a644a84324f1ce8726c4ad9aaf92e6dd98427a018da8c3935f6ab897ad8ff477ec1c7997b4bb854a44bd72b3cd02d9ad741266f78c65bc4bf94f9a298c9e1476392e21ee5a567cae21183a37ff05409c7291f0fd7da9f8a13df72b8c23025801e1a56e084a5c2e88e2c1a2cbf6c835b45f3f348f90ba155d749e3d6e765b552cfbc65214427102a92942e564992e2eda50fe4e467a86b8e298df853e1a9068d83d416c1b0cb4e73885cc44de21cf7a468280f5275239bceb64f7139df23d90b8d1b9d8228a06ebe4628b8a7cc8287f7988940aa1b53ec7c84ccfa668d1c638221fe266bd3a42eda546edd018884922f3ebce884fe29e965e2217b804ec861d152b692fbad91bc42cf1ce8b99ce210de946e84ef47f27a09595450dae4cb26c92f5c91793bf9cd472b295c92d4dbe9cccf26457932e4d42970ed5bb0d56ae00fda9b8dd1546795983575ca76a878a1560e93a9664dc85fbd10619ab73b73735651793ad08d95a4c763d79892dfbd2a40b932d4d4e0265bf98e4e5e42356160b6a526e4d88700b78b9da62dddbe919e29c883b2a1ff8267339fd79eca76c539a4f78934e7851cca74f3e66c7375f9f132e4ec56bb3b6ef7f668d438a1f143e650932f0410e679e367c763d392d4262a660dae65d7e30e1e597b248ef9113b985a994c82e3fb247570b6c11d93f08c71eb2abf264fbe73e52dec0b38eb660e162611c534c604653919466316eb49c41011465bb9beccc8435750f98bd173aab5b25d8b5722e8f6a765db3befca0f95b1d46142dc364c9a3be9cef7e2a66188039348074e240db7848f99039c7c8d03a48c03013fe8a4e6d783a4a2843a5d30466bd0941b3ea2a988cca78bbab40670c6e371e1e21643ac704801ae82217e66b08e8a0a0c7cf5dc84fbe859e2e71ab282ba6e8d2ca7cdd57ed08fd4e12b11f6c3c8ebf21d1479a1cc634638568b7c58bd09631025e508607f5840732962e1617ec2cc23dd7979f1b5797f8714cd2635ed856db8a1d22fc09ed25bc5b1ac38d416f0e2555244c1e8218937f389384b8ac5b4ffdc184a8d92c6659d41e98c9eac56c1d0fcede5b463d93c866994c69ba9bf7c1a711e85ea1790080cd254487144a3c7a0ce2cc8025b9dabe2f02f591416c322be9766def6255ff6a47d1cb40a617fd72a2c3be7e828e6a9f3c831d97ff907d4edd3debd7078d68d045cc48c8fb7116af8bd7152637b6100e4ad94f94fa83984048343d8aae9c6c151f4341b5dd8c8dbe3f7fc2c4e7c3ed2979a2d3da995b3a3f5bf6476b2b9edeaf6f8f333b95cfc608da32323927cea54a773114fda12d35c8f20d4749a7ac22b91771a197752d9155442e011b68e6ef5b20c80c9f88490b8ce2d024427b23fb25150ea0e7ab2a44f9a14bde9901d013cc58cc5df95cf759a7bca9d323bf622684d06a395d058190ab4e9b5be130c8d2376324bd529b10d5fac876ca396315d43697e880551127516762e46bc95e126b36366ce04ef0d5843b9cdfac8bd70b9e5ed7077df4352184e783881a7bc55162997657d2cbfe84b2585c40436f92fd378d2441c7385c7d5e3eb5072475bda8342f40a03b61c5d0f3333b010f8b68c5a660f0e1b49237d4374f6c4a62e9bcde10623b161130c111f5e59f6548c558b46d08a73154542fc2453edfc2cb2f69a031ee6f18781e43bbec31136cda157665b96e1c308a47e1356c4dcf204f0ea6cdf1c418cebb6cf70e9247c9d37f973442becfa35ff7bb4a1239df961f30dfe3cf85c77d521cce6265d2e13e0b43f51d727555a8f0e261f3d59e21d8995bb94660b5332bbc3486a217d31cfb99ade345460db2aa31da86377f58ff393fc479afccfc12de46ce1ebcdd2a35946cd6f7d370f7437864a71b8a30963998268cb96a1470046d7c7f57c86196ff6c9e2e6b8f8ff11d3ee0b699cbb5b975fc250d81d091e131d5467689c49a7ec88b054f13876a17a04455922516b278ee1c8c4bc6540f73959a82a434732cc0db81647ff90caa2e88e522746bb6461014d5f19e84f3be84958b990e1ea51534ee1f85f289633f5ce168d02e21b0017c0f7463d0b65500c50f675c81445b6ccb0639e88ce5d493a5cdbe71621a2df6245838bb66162f88cf4304fbf4753496d0ecb8b93ca92f8e6e837a14104ac7da1f4e2c57008a79095431f416d2c6ff0a72c918ecd8a8031a2468367a68f19a8fea12752879561caa666a0537693a6618de8beac3f50fb4cd0e8872651f987da8808ddacaea2be8e3892ae03fa6c26927a0ca8907a132c85e828d8208f4f0131e04c42c78750874d6960ff17ede62dc4b9f36004508fbcccb74ea7cd2222aac57e4c015a5ca327ce70fccf1304af971f61e031d2ba6027235b5a5632e632564859800a92cbbacfc34eb438c6c7036c11eb7291efa085b24cec60e845b4c8314924937c95585c6042aeea441bb47b8027a307ea38b3e360d80dac1f7b1176f4b8eb5005621bbbc4c1e334e2fd8abaa86bf6ed8b75dd4cb4ebc14347ab5a8409a34af9035d2a30df2022681e18b7d40f00b409caaee596f9cac3f670843d8ff95cce18b27b984ea2daa457316de510312d65329e38af1203dc017d7fa0d0437d371b296d083f868d46ce160255bf3d22aa50155bb2575ecb4bee4dcb7b1b95a054c086ca504a4b54e12262094aecae4040be5416dc84431b74ed2cd33b5a0ce09736211ab58ba4d691c7b64447e704635a641c25ba777863c0aa7f2b29f4807ba1ed235adc2bd009e430ee89f2173579be6ea2948f83be25ae11ccbad03cdf601dae3ff39a64e45b5a07e506d77426a00118457e13d335bd929e9248f79f31de538efbae4f73b80b0c62636cab992d9a2c71f67f7dedbc74fc37e0a0cd68735833c1073324983e45bf921a69b084fd492f48b725d3a35a6489b6738a8238a6eb82f952275966a24cf21a8885323fd9ab998331a21ecfc8ae546f4c425d2fb287c5009b6d27ad8a9a31790a999d2e1e67594a4260e172e5d9b29b94976135cab32176ae1f6970af6eab04597bf24315fbf965584463aae7fffe022cb76eb15d91eb60852e6d2122a63514c5db1e41b2e21a9f3c4d5945268891d2c71eab9b5d4024cb19352be4de4e5d2953a44a4116a78a3ab31e3ee6cc6c1b57b6d41fbd3eb931ac98f6cd6cc8279ef750f1ed17b30e55a1c22d173735152a3227de2dfceba296a0023fbfae8151c8889c7745c81ed63582c67c36c6a485b425d501df531c30d12c4dec50371e708fe4da9a24dec0434e47f21d0ede83c94e3e3928e37dd425eef3072b9120108b5cf2ed8178052332f44e2baecd607412658e4053a5afdbcc712b113590d619b7afb2b9cb5ed4d4df6b8dc9c117e2f6456dba99ad14ae3d341493ea5ca22d52af9dc4aead3b90375c02fafd27fcef3ecd183abc88bbd647d441b4d7aa4cac99c4e0c0a27fedffa10e572302c3b51ebedbf7e9ad01e6e099489e7b2cd057f729a44a3848e785ba07880cd3088383e03a87bd51f908207820e5e52bfa03ae2fa2e5b3eb5003c263fe891f3a0f630def46c59431f55ea59f2aa9c0520fbbb31a68980d94b56258cec9e0970d772792083303fca1b86a6d2bfb133633006fccf702492ac410fdc01d26614ae339c3ae3fe01aa4482e3bf95c6bf312acb5b52e888d9e2446971ebb8ac95b4815b7712ebb890a123c011edf22cc9c0ce4a83f50182ffaefd2315ce66ab3771a0a28e5c446778e939eb57ddb8cac909a32194489979fe9f8adcf178d03ba6ae9b50626ff44e4fe9ea3e324e0877d923d5320135bf60538a12ec30fe477d00985b2ec13a3ccd15317ed42b26933ef6f05151b7dae06965770a393d785d6cbef665d89a5695803ea612b61c637d303e12158c7425cac5f01ecbc27b00e6ce9caea18b8b61d8c79189dc59c9d773e00a5ae5caba8f742d9ad321b5d83d286cd3995ed83d37e3f30c78d845dd80279fe9d91651472d4216f5a089d83a435b1267c6d23f23232f9a260bde4af562b95c7ac6b28289e21839b5b2d5e63b349df8b874add251286998cd4ac70ecbf0c8958e392aae16de9a44f2ac8dbf9c288ff5257da6e4113f048c33a0d69e4383ccfc38c9226c7f90b1ec4f1e527dec90f014cc46f239e0dece0f5dbbe78c6d7fb84ef49f7e3f4ab070ceb9395ecbde4893bda5100a39e4f322b907531a512e1d7792e38f90232388fef0a63594fa2275bf9f272bc544b16bff8095397c407b3ff0bd2765e11f093d9b0c4fe5d967120a3ffcc5f50b81b7ae2d80a875d6c33096b4fcf91050da44e14c074f383275333a908a54027bdd0fcf88a7a47f6e336dbb2616babbd67510008ca2b2fbd788300d455261de0515b84f97eca7b5b9c75dca0291a9f246e8f0f107e2c1f49f4d97611f09fb0cc8f2724f5d60fb92b2ab139ad202fdc37f53fdbc32ad392792ee441f46893263e903fa5ed7487c4c7feea090c4c5f22b24308a656fe8b954837579acfa13755e220171831e700f10d0593ecd7ab8deee06b6897882b81b62564440d38b2b199d78429a757b72042407510ebe6faf12a0c34109804e10b6092d5cacfbdb094831b7881f7c5bcc595055e753c04c9a32659eaf62076ab66e72f6e741a34bcc6ac465ff37f340e5801f57001d0cf7fbacd4e33b898636fb45f55c5eac110ce6f523ce98e2ba91477c8c112299621a03f7680ad5726b9dbbe0f695d09a5d0d53555635eea67efbb3ba62e81de0bc899f35273042e6ebcc111446192952be3ecc5f3a77312d2b2f502f929bebdba89c4d2ca5a7e0eed5c91686fbbe0f9cbf6b7822dba67e18925193563487bdf9d48cda5f7b867fd0d9e946c2c3b65d8c7f5ef74efb2d94434fdc8f5353a358a7a81b88e7ecf2cda143d30aca5939693f79589131cdb8c9a333e04b61b200658f96319e4a0edb904be861eda5eb5ab798d15e3de869c79b8658d2d3bb508cc9678ce88510c52719244fe27d3cd09bfb55ed033099a157757e67fd4eb38709c5570763c05b9601d165f73edf3a8a571a6a9ed9c0319602f4348f5bc7e7ff9f835b63e8f24e30f48ef387cbd32f19e128f75973b0abde544209f4761a150059d1a88fea7c7f8e5032b608f79576a423b8b550071ad0d4e85f4a97476ad917c448d42c399d138ffd04615ced25c8d4c0d137dc1f151318c5730fbdb4036f11edfcf0b69f86dc6861ecb8f1eda7e9e6988f82ada026269f82b10fbec52b6bfc8527695a9787267cfccab8b82498f2d6ba781a0ec47061f39faa320d281f29963d54c5d535ba5a3466622610b69afe88d0b05dc21774ac75d893ae0e4805aeb66e9a44a6a6204518d1b08db5c75ca733e76d4d9f0e8ab5ee19b8690dc983a43cb38d935611efcff99a8ac060e300496ac0a4caca743afe923e1fa553f25f20202a5556b6d42502b0bc03fa11eaaa9c14ba6d4a91413647cb3ba5e8aa0d5445893a8bc251704cb550dbafd5464a533873af6e640804f1484818b564ffd8b11df2378ac995bf5e810af366771c3625d1e3890fab8f39ac566ed3d3a118ed95c8955469457961aa7c3cc96a055c6ae63df4491a4b2f6ab0533c6eaa2ad031ff262f4e30b373150a219746dae2e4c0657cdbd5b323238eeaa7c8a16e3cdce3f368a922e0629a8fc4459930304310991f738bfcaa572e2fc9e04e50d80111272f126d8bd04601fc3af8cd8cdc5822d22b34375ca195430eb8581ed48a68a6dfe5d89c08c463dfa18ac3ea864a38eb388fb7eae77e4a8bbba631694862a165e018b486a7c4206aca6aea3458916174efbefcadfc3e48ed11406877659c632645879b0ea30d15c9754d08d3000f90d84788118a502fcaa540107b5cda2aa5474478231cd77a43156a07a07276ed0aa98261bd31863689c09cb30986afefcf98937536c6de1cc0ececec5cb3c8da1a5e9fec806b025dc8f992aec8bdb49c12ec48212d815f40e71179cb1347b37eca4c30fc6e70be3ad3541eb8733de7f58a05f1768e648cd7d4fe29e9164690eb1c0b254a626ef4928bb6ac7c12c0d1773fb80a25fdf526b9317ee0e5d04c278cc2cc34c4b20be1615b413f80c4d234a36b4aa937ea8161a7b0e5b0eaa891794705562c4dccdcb415c0eca596c522238aefe72019f6e0ea32bc42337e82a3c312ecb8e300985359d2358ee5a018460e76ab0415319189af6339548b160c8e8b788c2cc11ef1039afafec2a84a2600c7f54bcde86354ead1d7e235146355e528a218fba43e483febc1b146db345ebc086430cf3c20afbbb46ffb713f85ed468fd82508899768943497996b5f00e582a4cf1f0948f2bef99cd5f07ecaf1e19f1a33940040164e7ee6b1b815071c7393b788ee67568158815d1570ea3023af81230e7c657e342d408d12275d3e56b807cf28e3f435f288fa91ff24627f6d6562903e36373e16a2889bd9bae8a019d6698b71e3712908ab5e2335406ca5470090087ab49bd9368b7bc012a8c095d4f2d241c03a541266f85d670eda83d04eb67e844372a63fa9a5c70d43920cd2afe8ec906421b92934a6abf61b97e92d912914996b769dcc5196ae0bbb7c7acfc86073c05347e62f9a42bc43b3f14e625fabcb9851d08f54b25da14d0c789739a57970cfb250e03404b726259dccf340be31aa0d4afd5d8ea0d4cb6bf99a747b12994b099056d1c22ed13e019fa12b61a83b20a061ddde88885810ba3e0e88557094baad1b60856c19dc32361b685345e3799cebd3baf1669e9b3168282bdb3ce07a631df91cd3fbc1da4e6afe23de9b5a22276a563ea6891380f4afc423f32954e163c50b100245e190c8265dde3363a9c9d39ec7dc0ffd621f834043df020e7a2947093459ba77279d6408d4208e917e3751c1638dd28a317426db0c959918101f70ca6a564a8551a37ae4f5cd0a326b8cfa221e204ee408ad8825595fb53391af493fa218611f47bf72e6c98a864dcdff110945bc75c389c07d30282dac36bac27580daf3c8c53311ffbbbb196d29ead7bf09e2de4cc66acb913c1f0e28878f1c7bb204ca7124b0d9e18d88f910e568ef3791c660c2d24cd3852d63c8b23f25846c548eddf3357904f21e89ee0e245b58a5c226e3947ba1b077e00a9e0cc87db02c3b8b11652b18471702747a67954a207385603b5efe59f1e52eda8ca9298fbb9afda4717a56909134603a589c3fe6383f46391f89403b369298fdb62e401800687ba92cce3b9951efe81814ff6cef68489c65b04b1f212d2a4a6b74c64e6ce52e8c032378626bca92a8b480bf1c7465c0115c0958810a060e7409e070885a54768648855c232471291b0794e5c44512bc4573a9f19d4adf83766ea9eff42bc9bca4ffd394693c0ff0c01a9004cca525d9d15bebcb120e57182904424d7a6d878e03e7ec310e7cff3248738cf77d0431688e84c2a01667a38278a0e863cdf115b5732c80d4aa71877e2c10d664f4d5a4800acf386d24343d34f0b2864ac702525b0c1590601e6e337b3718a0ece9c784295b82e2542cd9083d326bf0cc9330cff08ac9886c446ff377f66a4d462bd6c7df031a0364d62cc4a907e8d31855fa3d47e1ecc8eb24b574c23e8af4d918a82603f8a03f526f9fe14e7885a50c5463231f5b899983ad69a392b4179b01d2065bebaaeacc442b9f1eb42c187ccb1e25400a9cb79437b4dd61386a88ed98255590ffe125c074d05e16c8e0ef14d40bdbc960da37f98e7d31a5bdd96a63b3ed47aac9f02e293376a88302a7112d1b99b15a1c24df82c650647c7d389c48baf87cc3157daa4c5230292d25ef90d7d9362765d33cbe8d8857f8e2f765440cbd46fb811d4345a1ef3e8dcb773699a669a9f0cb5299b835206a6a4c6706839bb28779bb4970cd1430d6d804e656fe8b38b689a4e126d9135453d98b4663a22144b4c766708b355e83e74c2971fe5a4232a4f8ab9a6558f6fd84546af1f98214b559268beed78c724dc94bd89b31550eaf821d27f6c0e54d41ab79921494713dc4780b22668c70608d697f162896544d4e8d7446aca8b4c8e0668a5dc254d7a96b0537a4af6993181f224c109fea99275182e6a909b8127d4c47aca903e60be85ab2d8692dd60542c984c3712563cfa35eb9bdc88498654c63c590d0243e5e753e0f7c84c871e6d207ecd11200aff32060841a5661b0912587e5c6c8e48b4bee3447e5673d0e99574b469610b8f2254db8dc206372a514084bd9027b2f2e47936faf51cb39cf7cc349e4602bc920e3fef341cbc06e41b0430c000cc60b2bba7ba3c65f5becf1cb0c68fb5df6c62f1e4270e2912b37f6b83dcd18d849fded60d063baad10c62ab8d8063b9338983959baaca0dc45942bf80f935739c69d8e108b001df08073f11b0809bfeb59ecbba6dcbe1ad75c2324a6331c15624572f753d958d449de08269309ccde968a10b000549cdb8e4c8a8fcaadbc0378fac7b06dc8a916c7f683465f22857b7122a55f8b651f9fe20b8afb9633e5a5bef63349bd2968d6a9d1edf7c79810c378b0e309ca5d2f75131ed75972759ac416d17a17fcee881300f2b4f725ccfa2b8d8f4d293e6c4763a925a7b944b27554accf7aaff3692f7d809d8b03fa20221b20f4d8d783449c250675e98d11946b1dfaf8023aa97e7fd94d20d91a337a739542450aeb236137c9535e2bac22967e3a0b998520be9f1a46e15cd0d26f1b3873877b320724bd8362b38bfd63ebf503d1d5d59b71f614f344abc602467819c5870ecd44e28d9bbf292b8a867508214c1529b4c24a23b18c5d77b559348007f8cd74df6d0cb257c02f818722deeb48b8261adfa9bc3131f984deee0c523d00e7a39ab4babcfe2f816dca7e5ab80bfed4da417fe063094ef0290629561750055b606752fe4208e48d7e74f76ad7e6d4ec61efe9eb47031ead3d2f6004ff636eb03b9ddba88082a919f488dc68829fc692c8d6fbc2c3eb1330cb704c0efda0580a281c054ce261952db7d47da1df0e20a1bc80c0b795c9c69d9181a28b509d455926768f7dd84fc81e54bc114976f76f07438af2cfcfb4bc9fd19a07d0a26d3edf4e7a5c33befc2f253f6d68890c9a485e977944425c3ec9bdd11af95eee990ec410e0d6672bb9364d20d61a1a9c83914d19952a14b7caee21158e5a7e9811bc1d2722e6a4646e101cc057118c83ab9191622c524f7ad3011708cfa35d0c19d84d70e076331a6beae3c6242c3a08939edc1d50a2b9b31cb1def100ca59d28c049c74e00029a6524438c04100000d3cf23040ff3ee53c6215281e87e9946bb664c8f8d685f00321368913568ffd48acfeda45946610c2ef9b53e629973d5e7eecf95d70519a367ff8bca7933d7520b39fee25337a6ba46fb69c345b5bbd27b0ad4724a62e4deac3705739bc14ca60724df094bacb279f05b610e0957d64e72b1f8d2f8abcebaf251fbee41c1745587c155e63957d742a6936693fc532a69810b36c97f7c5497d7666bb7c210085570ba01eb08fa5ae556598bb01bf2bae5141e0690ecbef80cb0afdeb86464cde864c6a09e06607015701b1a66b3bd0f2bf5c5ed45749c2d81bbeadbf9cf038c272aad0b8f533c9e76a87ab4e50202ade356a5fe602caaef188149f8f313ea5f1a14dd03a8c3f3379ff5dcba5cfb2ba54dfa61963f09aeaa5e6cb7291de7a4696053b5a7c3f602c08d65339264026d595d5b5f212e95992261bc55a90e42e28c67babb2d5f40204f2afcdd3867e0a64785af8191b8f897475c212d6884d8e9b68bc75764899a5bbc5a798d251b86062697105a2686668a83ffb2c5f66786557b2810c11a51ef207d4317f3a5ba33ae454c9df254bc5f40824c4898145b5d3e9d7a71d8f4e7585ce310498de0c3e363ce58c3562a5095dc1a7baaccd48ccd280f9d948f8cf8e255c582824a3a4ccb0e98ecac359128a40cb1eb18c7cd2515a7f659eca6a9ab0b6ddc06f594ea2c74e594236483291e5ba6c8e495458e4405e98e9166983f378c74cc25cb5d83cea4d2e90f5ec31d344801e235a6ca040ef378aef0810460cf225d822f8488699e6cd8a905a9c0e0a1f8249ad5063b421cf5cd5029d01a66bd4bdc0cf408002eb02e9e76bea85529d43125467e4968a42c6fee658d478ad3c4cc20b7c28f40edad0efc31ef7b3b94dab0276618467e87f4aae3652340adbbc52ba39499c781700063026a9d3990ce839429198b5c638301b1083a7cbb9cd5e24c32ad8f98df6c3b4dad9999562a7f7c3bc49d986f98d0cd0074adb533074ca6761a65ab229eb350cb2324e70944b8e84b300f8f734f351de5ee366a33ca1d76b0d15dbd64517ea89269ba3d8b6a6efcf1ae43a31326ce7a9ec43b6af9cd3e05f4b1e3f814002d9e4d44b7f84f912c95e858d3221dde0ec33f2f53c6f6950d34898582329606ac732e7d92aa3a2d11bf39963bb17776cd2e8a557159b12691c827889946a1384db0957d56dda8180b0d31b132616f8597849558dbfd0573da12b5741ec09cc22e8221a6d60292a6d9966676f9075db21e322f0cc468d41959ade2c37a561291e82022b18b7cb0c597246043a481569ca22fcc20806cc4234fcb7086e197e59929c51da1baa18ca985a9637dde0b0a316f3c4dec9d69e4db4c61ec5d46ac2987822fc017d4dcd011cd8f7ed530c25bde1e6132fdd7380f1bccc8c8541ecdba7c4fc88178a4bd04ceb526bac0281c2848c37978ce785d1bfa7e9ddf048d5404692f554c6006a66fc63424707b79f37137120b4f76534e55b1aa17a2711fb8d88226c59730bb8cf3ad23f72bfaa46f755f414fd22a23c0f9050a96b0976da6dc0fc3e080d29e5e526ea80c6f1bd056a92a5f179904260eee2d418750b577c3a142ea4a617e5bd3d89e356fa7e17245df1222796e8e84f9a86c648e329c8c049a244ff5e4d6a43f17edb821c38e3695e92f8687a46d62d5511330e33d248cc9cb08b2f92a9a828fdd041048158cb9caa4783d2fbb1d35baa535cfc0c3ae5534f427729317d0237d1c301602f72dc9c4a5d6dc08d83b18be9f780ead36d315e3c1d95d17ba81eca859739952ca5efe1acaf3a43b192094f4c6228d8c1b408856ac71b2d652e0133fc847006581b5d03d73aa71c090ccdecffcbe3588de95604f9d1679bd7f59c0830f1c029d71979fae30df6046c45a753888eae500fffd042c41c9e86521c1f755603222e15f93446c4b81cd78d9126a9cb0a4e93583148071f61e679d9a3a514220298a882e431272094ab41f5e13201f968e83f7da9f3232eff6556f86c05ca7331ff49b25f6681d5662cd35436d36760bef9f5b1c63fc8f091a20aede7f2b041541a00833240166a8a46c1c95bc5009c84740c145b4de478914d9488c3e6f8fa8000115b1b2a519887346f9ceb76d487090f010d93ddc4e20c95d8cd43cd4fbd1af246bde638bd9194ec041ce4045e4004630d5720da55493af52067a71a78dc3711c3c2688383727e6d9c1214c8f572d68c2620d7b4d3e2785dfb55590e6d444d3a000e2a29685723e83fe874e809670f2d30beb87cf2a79b10f17e36b1ad6dbb354208217b93bdb7dc3bff0d330df90c6028e10b4baf3ed7c1963c4afe50b1e27ecf91064dec22c7dfb056b684ae1ebe804412a07802095376f0eaa7a00b872359240103114f5870f4ea43d8b750059380902ed40abe6003224ca4c089a457bc10e9f231061c5cc1082c9074b1e415bbb005511348c080e2440c014881882aa63ce1c8933026d17db26db65bd0357f4f344a371e768658d269e38fa872fa35dfaf2965aff0aa57f028e89d6ed984532aa5ca26b5109300e8da1dd3ab222f2a18630547aa127941edeeeebac566a3a3bb2e55276ca5e94ee9e091b4354ceada468a484a3d8544ea6813d262eb53b5edb63ab85986465438a15e71876e868b90bbbbdbaa48a1b1ea55ca06870e1e32357745534f745357cbd0888a23f95b1d513092686a6a7c81074f6890e4451117589103090ea280c1128c20cae2d541c0a678c93db9c8ddddddcd754442ee25958332a9365277f7d1146568541491fb3654f82475191a4df1856ccad0688a28550918c80191192089220757d4006e9104861327a0f085a52c5ce86a40d00c9298202105328870ed18998114b0f00517465062c90b1e42780be1618e3c19c5eaacb6bb9f502407b9234f56313a259e912776f79429920e25f76db2309a428bdc3c4410408646532021a332349a828836317fb25d2aa3c7057c748066fa4c1acc9f30bce084a523326a6ed8e04845a12da8083a2a4286ce32312ca9229c18f7fbade5aed097fc64cbc2dd31dc8fa5af83074e0e0b773b09899ff9c5fd522908a7adc24d3521a90cf25166392497100386d66189a425f2364f96ee19a6dc8f45e674ebabf4fd92d781d3ad7aeeca21b9849803cc2d89b0b859d82e5ddae73b0f7f40565ab44bf028af38a4a2a2d996f336efedd5634130a08c32ca906bf2a723d7c640563b4e6003265c04e539734410d4e4897f884f9a99869b768cfb712bfbfafe6f8c0c978198038c8172ed7743eef7f719b1a95d7adb3faef3f68f053bfd376f655296f3d1abc78260c04e10325b3c029a231e41e7887f989734e698b3091f1e31877efc4aba7840567c64b2922bc864253113261e0df186f8c9a35d1c508e0f20464cbcc8f170298a272093232896f207a32c413222111adead538ea7d1adb9c54a4af91c324b1a620e39078707649223133348e2e382a31f299a08c2074a9a5cc1c40544a4f834216298b785612907298c40d4bf117388393e255d37e077a325c32a9844c98dbf0b27ca024a18c99b6ace1bed5239c28113ff2395a510146ee4b8f9184189464239be3e28c5024796686d393ea65b738b1ca52025c728a956ed90b99f43e6be99d10727f7661cbd8ab7e9554c228f814819b4a08514274661784528c420e4441139c0011154f08a3c34c88baf6e286928c24a2be57536cc5d6eb8fbcecb62db2b79d3a54b65b18a87eda6e76cda75b08673b69b6ec23a1b8692957de795e109258bf36c3ddd20d051a4cfd649db761bb96d306b0a6583321fcd3479f105a5adf803227ff5d8b708e7eb63922814b38839c45c5f5f334c71bf99a94ce69a45cf9dd25f0cbbb5b6fbb6a3df3d47bfab9da77de3bc9d5c83ccac61d86da4f594b2cdb1ab4a99464ee1c5d76d1a1a60703f4845433c557051bfb7d7dedf6eb3e2b976c117cda292b55886594ca946d15324c32858904456408651aca08b9cfa6a83dcb6718ff3f4ed84553bec4fcf6133ef9b39bbf43e9d6c5a99bceeb093266f274b2f48e70ec72ce20ddbb3ed3692db62af348cca328b639215b4f6d5dba6c551e81eb9b791d783cdba509a1a33a2b9e8289dd449525a4a8d1a38d0e050a3468d7a54a7a84c6a519da216d5a37a448b2814e8124a44a1408968112d7aac35cb6aab6ea0fa8151ea551f464905e4bdd6acd647c122762885fcb48b2d002c9848b82c6929230048b004d11d6844ecf8b9f1d066606b2962f9c18c0a14802407262e3cac324784c080c51168e085d113ace8b9820747a841115d681185204031baf8018317be3003273bd8410291249e40062c3431862fb2e86e2140893c405001138eae40c20dc810050c8d450e80e003196cc10761242d1157728cb6c5926accb1d41d453a00c2174414a103325e5f4a850831a280832294780106affecc42ee6e15272cd7b846b73ac7d7dce856c442ee328e9061440bc8403ad22d584119bea0411251e8c14b28679864545484dcb74dc4c2d90c8d8a8238221a1484b65247e9a4e6a2955a8907dbe983f122f729ad94561a5540f9ebad2f71f4543f39de34865192f1b08380ea06f186b809a12aa05eed643a3d2f1e76117f2ab141e992ef27142971832f54e10a1d49e4a405442f14741132f04879c9b7a753b1f042c12a8b97e472cc98f0c414449b109890029e577b108b1ebcb6494ddf4ed6bc90440a3caff60c80f44241c7c8846600296e7c9d94e28fbe06db2dd94272b649a22ccb344d5b82cd32ef934ae4d012ac954496c85a6bbdc951a0683f7b5b9eb4b85f4ccc655634686ad4dcf87a72d4fba894334a9e6cda7f73ce890394869fcdb4e61fe8fc8070b99ed6536badb536a333abf6d48b493446b1962ae10b32e7cf2c327de6cf498b1b5f3869f1d5d4404992bf201d93a250548a4a44968372bfd4bc85aefa893f78ec9ef20f50b2ec84f018862cf704e5a6622eb3a24153a3060728f7c60ddabdd464db6cf8a2a3e42f48db4c835af560a63ff5d61e7633c3f5d683804422de005f319db8937a452512f106faeac13cab8d0ca242af5e4aec305a3dcccb01718072e33f8ecbe23cd283520a9fe418f10784cb344689516216dddd40dc2366112546c9418c32831835376c70b0c42c6294982be8c004a22dfef4ed158430c677378c3056b1a1b0b8356a206459cad2d6c7ad1eeb6eec0e9d83a07442148629cc6e358f837261c68ca010ca33646804854fde324e9bd35eeb6e2c8e3ff1ce6eca6d373c39338ece896198e2d93b74deb0cab1400cdb340ef36677a3418e9326d8e990e50867e8b796b3631422c76e67a80c5104e18b2448b1e4f322e2002fb8010da47ce103259ebc6063f817357b45e334413843f13ce5792af3163b4269fa4c903386bf12c4e44d639931fe501a817a1563508edfb70e92aef9d8e56c581501f8a2912cf91587a792aa07eedb373c643b77f8ca41bab8cfc3ae021c1e72c98adf70519e98527acaf52a16b14bb6392c4c11d22bf8df2552764069956394120820f45bb7a3b3c4f802282777464a27e681a3e806518d1a1a5d777723bb8ed22431cb8642ba1ff7d95cc7b005f1431fe6afe60fc21884902c822d48af209d18abb29bd2885d4e4a9730ef47afe02f90c4a18a70812838db6633a593e2f40a4987212e85bf41735968d4a0d12b784ae7a3ec40a63fb29c41a0207fab5e65f85eb1a4766ab43a98737e3b30533aa3306249142d284229a594ce49e99cf1d36bd410ee373384f48a6d83b1df2bf8b16428693784f84bd1cc72e93d6190066d50c6c6f91bf2f436b9a2850f32f55af2268732f558b2924c3fb130c264b31c176564990cbbb580fcd90ca316c2c8f0db0d94524aba6ddcf454f3d0480b486468d40513cc03a537e41ab2d6e5d8b6cd6479d07a1f9cdc1a31d30784eb72c88d93a6fa5a1f7395d71e6ad70ebb1c34c72eb890a907ab90b14f0f1a293921530f1e65d83d00c32aedfdecd96107a17511a061083f18a38928be781159c15f101ee09b08c03a1d68ec74c0b20f4e348f877c874d0f1a69a109997a386f1bd43669a2b7698a553bcc4c1f33c51f0a72c447b873b8464b39738dc774cb5e5ea65bf433537ca35740587295799eb20489197b8671c488eda03430696bc106653ecb03053cc43048af2834da42920cf3498afb4132e6c705e9153d76e8459ea2d32c2aa45774698a101d68838b4bbd62c0d06da50910dd0f4a998011f7b31b863ea4ab795ef43f3c0073e82132bdbda9c7173d4d8db4912e48f4a2d7215d36f2f0bc280f4f0f0fb53cb1a5143eb25aba455286465b1c4191a1d1164564d5d13cbde4822743a32d96322c4386465152903539bd80596a18295e64fa189f4cefe4ce94152eccd0748bdc1f15a04c558cf44a072f2e3dccb206191a2d9992a30a5051a65731d2ad98448c9d0e32cf89557e66487155f3589e593531bcc2094b195ee18430f2674aba539a45ffc40af783618136e00d0364d1c3988d9618c9376468f4049eacf2036dc09393fba9fc40a1fc9992568aa4eb4a6916fd25e3480ad21149459432451959caa82432fdb73245879b1970846bca135f2970861e01445c951f0a557e269085cb8364def4efc49369c4e224052687a4fba9fc046515f6213df953c97fd2a757f3407a4ac6b04ae21d34cba394f2bc2cd2ab894d5e98a29894268c52b7b067df95c272246e4c86f22a3fed9a3952015a62486549b7a011144a9db4240bba093d81287f2a42992e39ca9f8a924c5588325539ca549a92bad59a584c98249828dd9390a2f2a302d42b9ae18f2b92e91bc3e27ea6a9b2045609ea15bd925ed1e97d16e9460c4f6f65a85794e854858bfd74c5dda0c8d5c3219fa4b81f4c94ce13c32445e17ea6246caa98d47f30432a2654d54485d4430b2e96a1d1162ac8536668b4054f9edfb02e87cd152fe5289ee6a91425a924d92e6beda657fc0189c9f52a48d553c989c195ff549054245649f260a278304a1e8c171ecc52af60a4580c933481187c2a263144e644dd6f2549a6975f11ea155531e9565435a9dd8ec9c393eba5576fc40550ae9e0df964c55549cf3e760f983c3cd9be3b98a4868902a394e94f4dae89a857f41f4c526c3929566da66d3a7076861290642c57083bb899dec6a46ce0822a732d589004a3b19ad10520d01a344e66fc60dea8814218240e1b16238ca179e8c802480b5894d32b7a9c2c60a0047874811e2a64985104a4d872524c870ef48adec7ca168652516012901f4529316410205eaa183a027debf48a5e48911128119ed3929417788ee87119c2103d2d3bc622d107ca0d8c441f233f16892122fcc4d62109a0222222d0124150586083a0969346094b5bb0227f100946814a7049cb2245ea568c45d929928703f64a5a1e8a24d32b7a1d5bdc8f22d127ed3a11b1e8a14dafe8bbc8beb66036e5886de00cbdf578e8c0d12b174ecba3984386dda248361a00673ae71c898bc493ed0c5be8c29d191a5951247d7062451272bcf1c1c9d53234b202a8a5911546901180623042154caec0811116a0f0829015852081104a69219c73ce998a12bbc4df9c73d639e79c730989a5b20c8db4180311ba76d7204a5012062950b8f084300020c5155ee0028b1d2c2d618bac0a00d4da1d46ee9e9127e38c6c5a7c91fb560b2c649ba1911657684dd4474ae98c73c6f854ca5a5965ad12ab7690afaf405279ceef64ba93278a4e3abda635345366f625c86e802933eda58733ec5413e36418e61c48f4b25ea646d8e03bc31ce352afa21426b48a6e27196a219a5713ee175be8d2449a1b85a08d7e7cf7401b4540572c02b2e2a140d18216c00043882844843311c79e38d4abf89b2fb4118b8082462b27e4f8448e357a156b304daf8894d8faf13c8e3c987b35e7552243a35771da00670290e31510d32a408effba1cbfd90021fc3703ff21e053408e2d444e84ba65e04c44caf13ef48036a0850221528f76adf0402231c6295b473c8f781ca4a31cbb7bbc9c706be8215d67c20a52d0c00a442881e1158fd1f63ab7c43d7a1581b2186cb1bbc9de7de2faa0e4f68c31c68800316e073194057e5004be2f8184e455730269174ae8886ec56e82943f2e2f2175a18be436923b89dc9f4bb4be53eef7e85f008b29b97b294b0e0148f7a3c97d21ab5f038bba9bd311fadf29f73f0004da88198601922112911ba660bcd0c4c276046d442f661e22f1089f5ec12354db4856c71f38d32f62b284e82b9a3c23f60b80c4d56153e389db521ec91c6cd80725977b8e3c877590e4dc6fd7e16e7a4edf6f874390e4dca33ec4747b8fc22e7c993c55c51dbe58c7e93af684752eee308dacb5d6c95d6f88c91b62fae52e5f81cde421c9d9debfde10ee2a1ee4ef7be89b6ed3264f556f5255fcfaeda746559596cd574dab304273ce39e79c73ce6b599d58d4e788b9aa78e07e9fc3fd621d24f527acf38a3bfc237f36a98eb52b17a250548a4add1d857a15a392154a472f872e4ddc003c715fb00afb0b4efde53da466a4dec38c212ef892957dc6e1ebeb282c1ac9ca9e5d47b77ed8de3de32c6681fcc8dbb12f4600be8860b7f9017bf7ee1be66d5ecc5b7738445818cc59c6708663945ea1be82bf9957a4cb61dec3cb251e22ff7218e972f8dab0676fa50a736c3b8661c77aa957b597fadb25918aca3f5b9fbd05b3ec2c2c2cd6dae7d86ebf9331abb560efba96ec5a761bc9e2b552af2ab654b72ec3bd79b757d861b4c3c0bc877ebf0798f71b0f9187d1de30f2da25d641a235d6913016838181c12ed8a1c42a4df51c97ab24566958c5435f3e07e6aac360dfa4e77295f77218afa5fc1028696868ae64d5d74b7c79980f1922b18d64d5c3fc3b0e11121ad36ed35c6c327295455462d430896118b6720ce31071f9cbe92ade0b7cb978f22fefa1fb2fb83f447579f84279a7fee955bd4d5faf8bb44fafea3b8a17d85f0e5fa65fba5ede03cc0f83a16499700f2f87390c1ee2f217fc970a3bcc775e2aefd85d620e83755c1e731dd55fbef3d24ed3a978a07f7905e6635eb0bcea30d7f057138387b8c8ab9e23afc22aec7dd5fb2a98bb3c47f597c76f2e9ebccaebbf78301ee7e2e920c989b90aebe82089007c111982244775171a3e44857d4856bdcb6b780c8e3e9255eff398abfe451f2c6ac04024218106ec8223cf52ae33e0ee91acfa214886c07c880b8e409255fff22ff260118355380a49563dcc0ba6912c1c97d7bb78cd2359d562568354f8f840a32a20e57a9844aeb22757a49ea52a81b0d7278372bdd5b04f1229515a4206936e7d314a93273c92a85baa48d4ab7a98e392f750ed245f1779217f7dd485fcc9e42fea6790702f79ea654f7d2fd56f1153ed98197b8e99b1f691ae5e6a567dad6f1ee972797df748d7cbeb371dae70bf36926b1b69a06e7149b878f105bbc5d56f2f1e7cf5d2940d7f3b9aa6ed64ec9be6fdc01d66ccfbb85b9dccbdd38e8239246bff74b2863feef61f973bef872074b23dccbfe6c1bc7d722f5e3c922c9c9b58d4ab7a1e3e176697bfc057b784e48a2792e0c3c3532f3b150ff22ecf9177c1aa9cfe0b566158c5c3cb5d9ef37217ac8304bb8ecb5f700ecc5ffe82755e0e83775e1bec72d8edc5536d87d9b08a0797bf7cfb0bd641b2e19c97c3609d97ad76974974ebeb24b9be7edbde4bed9a01a8a73419f59288ecf129522f7feaa5911a73bd0c6a577cd567ddd649eac462dbb66d8776cbddc583af170fbe66ee2eebcc9b3906b1ff9135cefbe2c60149657bccb351ed805dbb863f0a94b1efccf09e7ab9dce0109164c428dd8aaffd2ae5d1a99f8518a0c8a2074820638926a03819834f931ab820092642f042230ae3d38b2688a06c3435374e38602263e84489947376b6dd9a373108aa7898553ac41c71e7983b6f70a6addd219f70a1084f8e37489108ef96b46274ca58732375850f56041f08a1090b9ea8410f1712d8020b3790a202288ea001d18f0bd1106c985c3002136480052ba8a044921fb834852130618b264e58e10555644f6ecc2d548135d1dddc152a1802665153d346b387c8ddb6c6092eaaa024ca0f92201186962a90f88cb102294828c3ab2b138ce4ee1a27ec1529f826869a24fba4b7124a2d40f920164b8e385833356a7a7cf7f041c9b5afd7be592fbbec6eb42ceb996b2aa732d5347cf262a7037d95a7405293da746ac700ac08821536c34e16751e4dd654686ba3086dd84332e439376a24b3d9ed7899d91737ebc9dc9d654f0f66da498cbfb8f5362d310d4537be6f527026c231322669b7ba45c3116eee59313aa789c299beec269ce963dbe59891eb6117c4e4e191410e521fb34dd76ec78c5cf147828c617a1b396da44194524a69a6f73dcf39e794524a2ae78d1237ce3be7e7256bc2895fc31c828847b7a0e4c1a35b10c372ba957dd3b81a089b0291ede3cd2c9e3540b8b3df359cb8dcfb9045af7910d2e064b9c3957d22db9368b3565218fb831042484d50d02cf30c484d124327644665083d0de4ad238c3152536348f3ce8cb1089d34a92c12632c021f6fe8d82d8bf42ad28e73824184bd8b6c095b30c91d3801086480018cdc5de38411648d13dd7d0e870e1e991548685fc44fca8983749ee7d12b781ca04c6c8343173874d1d2051b94d9624bae07b4d13c707ad0d46478a50eed369bf7a30697ee804d32c553d3bc1fcdea053c81519e25e652f61eb9d5a339b292ac3e0e493692484a1f720ee114b3202363c50b884c19294656b0800c2d909132257777777777932fac4046ca3c156e132de4eedb2a9c68826479b6f90b6766a69753c289edf39cf30135e41f62103aa1dc3e7a39e23773c4f5107a41da7e66fb54af26d72b8b2dccb7c640cc62e3eba9f783b5f0f439e0a9c55ffc08e24ea658a4ad6483328dd1e636d8e5e06efa16ed76e9758f1e341d7be705e9acca0e3f8c7aaaec3367dfa66657b3005a5c8961826e3f7e62125b6badb5f21f4bb6b735265b8b5d0ac9f4df8efcccb0c3ceb5bc7df57e90b7dfe4657d56b16a87f8fa1cf1f8931f41dcc9f5920784c09db93bf9209d6919659441e7cc1d0e118a67b722cc146e43a223d418fb987645247860fe8d6ec5263f5c4c0d15d9c44eeeb23439e2388c0135b831737665f162cecff979ac625e90ce5472cd15408b2b13d32b7998a01b2fdf2d6939cf0667fa90305cdcbe74d9673419fe322d1cf077255d5c0ee6558ff33a0cbea46773e328313d95fc76f8ca3c95e43cf8d20922a45bd4abf16ef42af3e6ed6bba05737723847ce478664b306cb23185f3edb58fdc1d040af27cdfa608f783443d7cc0568c10668cfb5dd83dda1567e0633405a2588513489a51154baa4842cad83645591e871115c8c8d2a80a23dc079b74778fc0e6781e8f480f5b2f96a2f333a6dce6c9dfbdf77e95b74aafaa157b0f1f40ba0523919ba53c841f24e355317ab1c892524a6107015a46a678054463b68353ecf9091fbb1d5bbba04dbb54d821911efbb2cf5ebd1efbaa87de87829ce679d967de0a6a5e750433d3ab76884099e2206219994afc752a0ce3d4c39c735f1f76d50e5ac67010a70cab9069f2b793e5234f861e6b36d103da88398291a316728492e37d802e0b59fd0859128cfcc1a254fe605117b91f231093276e3c2a3a401837ba629164f58f66e4ce42ee1e11cec4ce7146165490b41c77288a2237942c38a142ee7ff148079ce938a50048dc484694d2ab7e8d27eeb7ca0d21fe62bfe924ca11055b1896885e48540ed851ed8083c42dc9b592f4231e41c64f919974842489133aaa227f70ca5191187fe44fb7baf5c5e4a06e4595e5a4916e4d2de4a8943fb9448e07225e48bc8ff81fdddd1248bab4a2222d924092021346f820750329b0b8425112a220f414e9d21edf4bd2b53d9e47cca18324a7ebaea31dbe3a4c669759e7c9a1968f75c24cfecc1c581be35603d1953f70265e8899bf5e6a32d424c3264718cadf64428e2f40864d8e50945118a779f0b579f045834606e3b0eea68fd42bf94446914a9ed4e4120dee378de4f86964e600bae4546222c9713691e3678793e43e7ff227c778f91325508e3228c75eca981631c0c217b93fa10b82c109232e0823f35746ace3b193230e42333dd6ed98700440a766a122b3394057862fb0d127d6bb417d802cfa1e708688fba552d8532988c5eddab10d5fc9a2423919b6185655ac46a41e53061a07a4571aac016d681e802cad5b1c4793ef15b7a657da29a6e995f6ecd60bf907fc01ba686eb7b86bda39ef46af346e721e0e38a37d8b474e513b8f7825209a9ca81b7740174abb76b57f5b8e9aa67dc3b80690e172aed3a30fd5200dc2e68943057704320761f36c39cb57aea25d47b7b86be7d13fac85127fddfb4a5ca7a357da6fd18da7216b2d98059b4ca66f2b9e8a47df973b4290a9edd58d5d87e7f6961dc61d897bb9d3398f47afb49f34cd0677f8eb02a259dae169f484f44ad334ce03d22b4de3b47a4cc32c06b503e956bdf61fbfe14e1e91d357f0d70923e9ba8d7637dc67c76327773165a2297a390d480d597b7737b757cd712bc9d238ed270eab4c5c778e336155d7bde3b873da7f744bb53d26cf108568abc0608332267b8b57cdc2fec96c2b1a19db2ef6025918f6171bbad301fb91b8d811fbc65835bdc2be0026ee57f3c12538ba855d87e5e0516741813216b16770287fa9940759d8b1978c4d0c333f7b425776c8e2cab00c7459bcd2a2f853658cbb91bb046dd063918a2c44cc42c42c89e00c769b9643dc8f16c918765aa45bd8b1d39f769d07c328900cca6c96655936b32c9bda9c33cbb22ccbacb536b39cc5aa6dcbb2ec3456ab4c36edb1f23451421d66628e193b5369501a13523a69d49898d261c6ec72cca05d8e19580a4bd11c2938d3f37685657739b22c65976372b2cb41e14c8ecacd2e479703c299fcdd1c324b6c6a26799bce117f246ecd1f8d2c7f33632ed8b6538eb8a1aeb89fb5e27e13084dee67ab405101350520dc6f1eddcf5211348514f79b4ca4108511ea08aa08150514145050a096a09e807202aa0928221413504b402941c9fd6c128470bff9042a082824a08650474025817202d5042a098a09941166932bbbf96e66b7ef6f59111a00658937b924cb4731032fb2c4f36688b4032d50162bb0aea8ae3461b1df905b59851d22e1e0880c91709084cc071a9721d20e6a80b40322727fe354f42cb95e450f917400c6d6691922e9a08bdcdf4c1c0c8e14dc7aaa65b662dc46a7ecd8419349becbd683483a70926170a4e0aa6468e48550ee14e88033f3d1d332068df23c9d47dd35ed3484d336dc1d56e56cefde75a6ed46eddb35224a4d9e9d3fa6a7cad9ce5dde74ee9aa7cad17e2fcf61168e4a621efac59dc3266cd31306b793a4ab93d89bfa3a499eb28c3b89b8df2a892b2a354f4e40c55a1631409ef297ac99a2af18fea44feea6ddfd43ba367c1f56b2a43665eee4a8619886411b33eff6aad6e318e2de1426a57626db6120a65aad16d6745b6faa5b779b6eaab54a59b149adf530dbd99bb02aa7bbe9a621a8ee84fbc77493e92a57c143546ed2567ed2ec5730b45d667fcaac8a87aad66633f3b0ac1ef3b0faad70e26bf78a235d1df64056b55aab96d5fa16ca4cef9e9d32537d97619576ce66dfacd5b02acb9ed9cb22d981641673ff117dec13e8ba280940d7c54050508a15c8d0226737757737da715c1480ac4c48afb253c00390951d951d95ade04c860ad2acecf0280f48b3b22c7b76acbb59c1994cdb34af8bdfc9f7ae0c61f9cae1eb7ee76555505895a372d451a8b7bc050f6939eaf0a5f29d17a77297ab702e98bb57f9b52a98fbc9de64ed6d8b6759bc6bb7f6b6ee5b47d8d28481f42a7b9735808c0bbf15906665e7b2ec515cfbba8236b8676741d77de4695676b10756ddeacb94b290b3cce11f7026fb0ef6dcca5550bf2bf82a289cbadd4fa64ee947b75c727620dde29e1d886ed967e73cad88ed5a7163109d83c0d8d2c40267e23bb0598d46af2c01e08ca5699665c11bacb5366631468ca39c8da79b1ebb73277b5387b94dd3b46bf6b75b315b7bed36bd695eafe08c5d65ab6576f624036577006750318966a11e73006f40fd885ea1a00d157bd43b1aa1e27ed148467d5bdd80363aa38ef86a64d4a30a5e4d7151bf37bd53d16aea458500d095c240e0b7c1960aea5f0e19b5d99a4ce3321021e6b6ad7ceb6eb41720fde2056916ea10daf801cea0fec91c3c006fd0565890855ac12b38838af91965edbdda21d4326e255d3f9a853a0ab5655cec6e828845320ac79e5ea1c6b8f7f1309ff1d45f8e9d7ed5ad95a34e83a65bf5a8c77b0be3fd69c503d22b140bfea0948cfafc016750bf515ced998e95a356502ba815fcd92c776820cf6f347c86afc45c751af09d41763931d8aaac9751871d0e11183c034368edb7940721ebc58390b582bf1b825cbf751cec96ca0bbc8a47a357a8bfa02e040abe5e72ece40af3195f49fde52b30f89285fa8c95144e4916ea2f2b58c5729595b760151516ac5a59f98a8aca5550ffd1ad67d481744b3bea4074eb1e752883c23f4421ac4d51b66c66279666651dbc217b9665ffe85b9339cbeab17a8bbff9fa23716786b7bf36cba88685d841bfe304b9dbc9a4125bf68dbbe6ddc8628cb35b326e5bdce28655313eda2b44ba66bc32d7e99003d075c23a7d316cd6178970a1a5e1ec1f0443cebe4d2efbcc3ebb9b1a3893459be64c59bb4ceeed6b767f3aa90c799dbef342e1fe912ced17ab7250bfbf5847d5c3101614ea2d47696fd14e47fd84691a56d19bb0771a8677d08c1dc328a55e69da59bc9464655ff12e599996da56d939af03bdca7cf42a7b03c4b85af61a68233e7b02a0ebf4ec38ed8a3eed43ba4eb80490953d8399ccb20d7fd00b39130267b2dbb4d15439eadbfd294705a3b68b579295fdb46115a76defb0a67158b56ddfb4cb22170a77cbaee393378c5aea95863921dd9a9181b0d69640b178b1c3c9c1198ccbdf7c3fd657181fae881406b919f6ea321bacb7ce1c1e6fa894eb7903470272c03c7ca359f5d453ed883c39e2ceb006ce4471e9b13a5dab6655563d8439d8006fa8ffa800e04cfd5733fc6603742500b2ea6b0657d57e7ad9a957f3faaef45fc3d5dce0ea0459f3f53275bef177edac5d8ee748bdced35bf5aacac8c4ee729832c53570a6fe48dc2d7f35b93e534a29fefe3d63f6d2ee66c61b3ecb93514bbde27a15e7e15185427e334321e9b2123b7dbcad423918a611ab66ec18275675bfe3659188b91bad98d96d865539998eaa87bebdc543b0f7ce4bc6db47dc3f5895a3a3ea21d6c7c397fdce8bda6bb7b88332bc86a164f550cec96e9f618b21fe9a2843aca210420a2f8b60de85c2452df50ae2db94274b5a9394e21152131549a1a1dcb5d2a529b93d49248b727fab71ceca3367eda93fb3fa4c8d9b1e968429211d1115111521111d1d7143424041404143404242ddfc993e18cfec993c584f6e6c62d3346589262925294d495a92ac96a7f4ca22492491e41105924352480649201a8424648f88b27c11109164b5fc86e2680f8ffcf1912c497f240ff5913e599e87f6ac2c4d614952cafd793491727f7399b224a49434549444b4f48274347d8a88e64f1011d0516a4868290868caec019a3c4233fa47caa3ee691e89249b47b60f8c52d29425e983745444247f86a40c8a441248b2a6372414043485a6d7c3137f7c8824abbff31202c40f1ffd9dd7cecb221d49567f9b819b5e0b49560fe5fe460337e9560337b1633d709a47b25a47870dee2425ef08091315014068480628c8069f9fdc5ee491acee991e10edf9f0709006c04dcf8600dcf4686a6870d3fb6a869bdedd0ac0cd1b56afa1894b92d5164e4f1501f84aedbc0efb27f784aff691acbe014c1446061b77e7946149cd24f8240a94dd4352b66c6edaa15e4d8bc921299d48029d8843b27ba8a57c5d925e28e128f27af46af6218413fbc4da277f147ab305f186f93e85b127c3f7e8158c2d88374021d1676293ce530fce896b728c346cec82b06d5beed9518754cc65528fc9c276771f4ec9fd296592ca3585628c2d985c32345a9205176228e273ca9a5edd8033f03870611bc906653e8b235df0655daa080f71503f1dbe3e58447329a98d8f0efce8963dd4f0f715cabb9e952cfa93e71abab0a5dac13e3ee24f01d97e27d3e3e0c18d20ae563e51dbe84ababaa8e9138a245da79f304da2485d6485ee228ad414a99b22b5eb4434c98b6e4dc1887021c97c821d41a3d0254a06c683f5747cd2ad6d8b5986e9138a843d893162485852568b6a9174d522cda2b7f6de54ea5fd5a25a24d35a548b6a5165528fba054f5f9b20757d92bd26d906a05ab4d23a572b5d1449b2a83c8a37d093156efc766dc90d19eea90a37bb0d8e78149b44a498795df4c9a3c6e29eaeb8197d42917a559b64caa459f45be5340f87bc55261cae45bd82c2fde613cc0b5a248a0ff3a2cb61b3869196b01eeddddd9b7b6fefd3bb3dac27128918eba94cea516d8274f2ea130dd7223b54c40e29e9563f15433f8c22d522f5a75bdae9ab916e6da7b7daa3a77d3bc4ba5ab47995c95773d45c8be00cbd8e245c9861fe302f302fb0a576cdd794d48779a16918129614b34891a81499fc51242247449e224692582209a6045b8231c9f419ce32dae4c94c9a4fe893a6b516d5a24cbf454f88ed416c1622c85d49973ca2cf3c1c5e7b0d8033a6bce9d0f0511735935e5daab96658d291e3c3c88ba0cc0525f9834c025f5ccaf35ba4733e12ed60c12da2c7ae43bab4dbb98a4392353f6daa264f383f31c4774e6c4e20a40bfbbc10e9e29973690960f8e1be719b96f560b35be62189df6e30af7bae94bb9d7ad1c321d23f3e9265bf8305f783473f2db563f6da0b892e0d673665eda34dc2912eedf63da42bbbbd0f6bb9db6d2929dbc722fb48641f8f2c51c521925ddbb86d729bed1ec9b211374fafecb53d0464d917616390ed6ddb20db7fb0a879e08cfdd73cd97e654fc3fef632f650c6e21f9a08039a3cb193a1e101e014839f58c44a4bec2102923e457eba966b484745561b3ae1d8137b7ad4d3f7c0de724b4366f51a352bff9e638e45b478170c37f51977f9cb5b4e6f746b65656565656565a5573c9bb719a9abf2174fb5f2e82359da0a8e3d3da8eb7295ee0f682316713a9d4eb127296befa1dd87cab577a05bf7da519c4cbb6a7c34b2f66f27776f8f5b51e156f0675dac0a3ebdc5ebef47feb477de08e28d1b2d2ab7c68d1a3537725c154fc876158ffb6d39795f6c41d7d4b8117b58268fd6a6302650b784e87f7694dd2e96cdc53bb2f219afd766e076f1a2126f49c66aba63dbbfb8e2f16816f61aec8993cbb2c5ee01f2147f3bc853084821e485e86387485ecded5d9eac711b07bfbd407157cef22814836a70e959bc9523362e98ff6cac9d0e9dbbb7782c5ff15c4ebdedd1eb58dee2b9bc40715bbe72faf895dbf426f197ca35b228a98fb05c070bf691f4e2230937f648d706200bbb162cf631f4f8785152338e47b7826a7713836c5e6063c4edbc7296940f8ee3be556e45286367692f0814f004a1c3c39329de28a7794760de7947667cf362122f2ed12bec2e1e7616af46ba62916461d2857d56e2d941a0a98d414292458ba42bf64016767b67e7ac53f1b07297e7ac3c87e52f2f33524fe12133b00ac7c505aba2aa87cfc0aa88553cccb80b929cd45d3e44f519efc1e5318fc111e625a5729901e3c197ca83af944b64f156bc3bb9b1e845c9ed9b54f0d799f6401b110870063b86c2dfcbcbc5dfbd27fcd96c63109cc10e241583202087644a8fac60b7ded7f98b419b77a4e7af955f66b5695ecc2d5e84c10580945b843d063d0e49d7cab12368c3660cc370d08a27bb1844e4e695b33c6af636dd972753afe695b73c87e52edf6250afb0c71c5f55598ba7cab08a0798b7bc871977c1435c3ee32d7808921c17acc269b92a02f0d57217acca667c480b5665a9d47b68f90b1ef2f296a75edef2212998c357077a35033b8c07252b85bdc5c3ee82e4c1d70c0fbe521e7cb5c4a09924f707f6d12b0c7b8d23aeaddeca049a1104ed5c8c5d3763d36896f6cfd6d0fe5102d4096d5ced5fa741ed1fbd93ab420120e5c2e823b50bd11e79a00d99b54722b1a7bbf678245df2da639274bd3c557489be38647fb216354dbb6374efc77afa0a607fb9b70f2495bbd3eea64fbb9b0e6bda394f6bbc8233da6d369bbe93ab7d437928af047046a3de8b77a55c98ab9efa8cbf9cbe05e57d2d2d2d384460ae7a773844529f719467f3a68259517916c65a6e9be1a9508f3c92a51dbe529e0a85a5a6c2cdf05292a53de5695f8aa507b4510238a35dbbff5e7277ffdddcddfbeeb1130267b4bf28b91f3c2a9a9203669696cab5e3e4746b056be73cd8abd9dd984ea35bdabf1a59fb86e3a5df29ad0b57d3de1847afb41ca7f737160ff60a75156ff60a857aec74381d75ee2adecadb43713fe7c98cf2b65fef836264ed9df7c57ce2bedd463b8e6ec1eea6bbb76773c771edd96cf26687858471396cb5d708c4970b46e56f6af80789ed70dd39d9a04cd4d931f2b287afcf6477835375765ed4a675765e18769bcebc9dd726b9ccc3b478591c897a47cfb53810d5d3571c91a2c01a7f29e8842c0fa38be2cf461c922c79236e1c020a12225dd8e9e5638f8c4961b077da1e788894e3634d1939f6b8001058e418a34f2c12a311a020237274895308914916e363d2528ef1b079ba4564fbd747f8fcf4a08de4a16e718f6f25b19774518eefa3a51cf3d74d72fc42fe5ac9149b8c1c254f8eb711c67878f8334549142b0461498cd7d748392a95610c45a8a0220562787d9d942313f9f4d92d05e4d34dddcda90b4740ea82134528e10b4b2fd3bbeec6643b22787277aebbe966e6be7537dc46840779bbd6dd6c515eda2dccba1bed7a3953c1167276dbdd64b3aac0886a23e24caf40ed6c9202222d99674f3e458e064343434e2471626828cfbcf59ddceab5e46d72570cf79b59da6f34bd929fa1c9a56d5d4ec41ce29b255f8ff26eea50aedf2eb34bf91addaa288f251593d32b7994d7a359f27de569f0b92c33d5ad0cabb2731a5665ef7eba7c0bcc610436d7cb5f1668a35e7e9378d37ef2eaaf17b3c9d36eba3a745ebdc9eb139626af73ec76745efcc6793960cebe759e76aeb36f9db7cdcb51af698fdd4df6437698e194d49bde74725932cc5d59706f94d3b55328c309fe602620cb5b296439440a98c092b932b0c8dd51f03091fbf0458f39421b999551487ab18868070b2ece9474bb4d6f4031689b9dfdf4b06358a7ed6fb04facc31d6b4f07893d921cf969fb39f312ebc44f1d24da91e050ac135ff448b4c32e477ec33adb25b64739f214ebf4259672eab0d85700211f7aec4048d7f67a21d2c5137ba48bc3f1280e49568d5108270ae9c0f98a467e3e2e61601ce5fa2db68a54993107d3101f42658898492192556d7a471131d3284631a665d81157e9764faeb46ef1aa8ff14787740d394e8fd9dde04c22765e9e0e121efad891e434929c3e76e90de90044d7c44296968e0344557ad5c7a56a33eef39fd5417471382e4956fd869d90a938845c0fa36b4653fee20f4e5492acfa1d46dc2fc621e96aa2f6e91fe902f2d9a1b3fda68a403cb558d5431f7b04fa588743043b9d977de4022f4a179659fbccb379cbecb4f6aae27dbc304f15710fc9822f9b18dc9464519b9e1a68c38704407a308eb690298559640a675e94dc8f86a6467fda15ee94491999319226c7c25d16233ddd35618c2ab2090997cbd0688c28e48fdba8188328d72c8c31943f8e63115ac9b05c8e1ba3070bf66437ad62b62f0b4d4d8d5ef9e00534a8fe18316bb08479010645c81b504be385215ed0f6c61b34bb1b4b2359f1564ad3d4d4f42afe244916cc9646ba6c675de8c205a9fe33fc596b83226b83236b03a466c1dcdd8dc530a2faa96cef183cb56a9ecc2f67ed4d89714526e282400425167bcb114716eeb41c0d996d0862509121210614f9a3c938b82d191a8921345f3b881124332fa659f1ede180724f53a3e606b457956786466348ca5f8aa8075b8d696dc8f0917e36e43893638d29b96fd4c3e8ccd29bdcbfa24975195bfc163d9ab7d34773903640de4e4be4203a9832c4d1c3799b3156404a28f10f50c6883f29656a723450713f19194ae99492c90665be2d36276d7ad5b305673700bab063d84aa1952ce5a04dfd5b65cfe64a3a2fe9c4aa0cb4217f574683aa99b101e686472d310d53dc785386d1664a4a6443446483623670a60f89a00db864b371cad9ab86df4eee222dd8206dea45b8a227c82d1bc68e300080949b21153c4a79e6fe6968028a12474a54610b265e9d85143cf1040e8a30c60d5efdcbfe4ab6bc942e04ac6c7874d7c02512467b5962b451dc5883458e7f3c0d9a18b92947d98e0108b75bc6bec1cc29080f23670514ba907b253724cae9d1f7d1dd304b1193a5a491e50d008481832c8dc250caf25f1d91a59118b6c8f235dd8246539484614acd147745434e21c5c85286210859a6588ec0052665305902832f5e56ba14c044148cb0842fba5083315ecfe9e14347946064d8448c1e64791cf8030295b2a7f2837b5968ac68b4b8df6a1545fe58a4f0d04811ca5d9310a18b3e62d82d59b1bbfb70261e072e6ee3c0859456b2224ccb0a55c950a6650c36db2d083bce79e5e92d7435a5135bd93b1305dd4d834b27c5f08310c209655a4a3f3b431929c60621709b542f63992deddbecbae1b63695b2d730673d16db16b3f4aafbeb28538b731e76345a8fd238279df331d248699fbbd4e6898374967827b716b12e5c0a2784725e4e49a594523ecb54ca5a8a514a23593057ec25a86fb1b04f4f001562f801c893474eec8b99de46ccf4f4c2198961d8b173bd82a9d4c41f16846252ca2c07a179526146162ee802e1ce398140a41ce3e7163e723dc412c326a6f42c41689e52a6a057f3bdd6facabd86dbb47c760b5d9ac59c87490c7bc5b7571aa672ce1c844e9e196b6118156266faddc81407a179e2dab486171af81374f590d0856ac91c68e20d280fbeb62328d46d1ac2170ef9316fb0fb9d5eccfb2929ef7bc4777b284f42d6bcfc7c9c3e7176284d87d25e763a9c1e71432424a41ef131ef4ea3f22fb5f2efb2d043f8ed107693c5da15ac825f79eadb842d4ef5aaeb3ada755dd7bd7ad8af376f234f1e868fa03ebdeea9981884e6884750469e5835bf93279e18d78326e64023ded0a914cde936dd593ae7ec4ebd2062195f100c022e4ffc43f7ce8b191573bc9dddcd0942564ad2d0884f451a9d473f71f7bbc979e79452767733533c789b1e4b1477e698a9d4bd19770837cdf4ccfef4db9da44d9bce1d411de9f90b8567b3e64fb7e9e9611f4dee771ec6e1cf6ef8bb1afe525fd17c35d9de7239aa66a8442cd695558e2aa56866000100d314003028140c88046391603c522515d10f14800f8bb6466c4a17c99320c8510a19648831060880008000806024a800107a5ace6a002d651d532c20b0280d987dfc21fe6f577a97f34dc492f25c0ce21e49dd8a0e52e439a98c5e1ae4904ae53a9e34aa02367b6486701ff5a8bf5183c936d4c9dae0160a8680a5c71838ea30b8e2120114289b9bfc07ef482e8ae16d61838e69d4654097b9fd196264bd93ce426a9577028dd5604a099d99d72155b1cf494df93841b13181cec23bca41951fe9639f59499153354de76f5c7b5fc92e8d0dd1700539a58cfb244013db498a76261112a8eb05fbd65d5f6ae2ba782a5e5dab57e1c2eab78e277422bd460a15306db5fcdaef505f6c9cfe46c9351a0f41e76404a30cbc212172c8749811c74a822a0013f3229edfc65c6256d1a31e553781b896ab39c4ff2490a8c4c9e678437c0b06ff7a3ed6462374ddba6eb002462f33ea9f82d7c3cb4d0cb9c6d60f8d95d6dca4bab0ba3bff7b23428b8c75f82316ee69c3f136ddd43c341cc24a6acce4d620f0bdcbd8237a2738afb9bd02f6012950d09ee135a86e4f7b14317fc8a0ec874b381c6f714520bea498cf197442858521c23fdfdfeed71d1367c850bc0919346758a5d96125b4d1364d3dc4e7b54742f83dc3bc49b3072c041298303705284842b87b46247000f00c6af197f00b5590415abb2bb90f29c57d620246689934943cf0f2be3dda8cbbf41ac58439a6c25c08537e27818311371f8748c2f958682705f83c023f4439d295dd6b1dc00a563076a83e80f97386465840d7b4e508d1ac90d555d845b3e8c19c2a037e7d610d78f886f67e3f2d770bf7a91a55b210cd135bedf94f1ed850c55d438ac8a63d0e82b42b75b826a4e20971d47b32a90d628596b047c79f292725674414f9b44e6f890df14190f046ed8d4bf46204471ba1d6e6efc76a306c4a413d0c50ad235473bd2e2adc227471e04125f681154806f4fa61db181d0e9d62c010f8f7b9690774226d4bb8efae0762c5e16b478338669fb1ce08020f042fc6b9be0ce2ecfba084e7767104f095f036ad77ae19126bd43542ba8956493f97fa61b6f8313f78b247d730ca61c43c6326ab6e2e1b2976cca76985ae5476102f895463682cf55d50900c08fdca0cddbc9af7067e1566533a735fcfb7d9242612bcd31a2947eacd81abbc58830a51ffa4bb60e374ed071661113331107fbbd634a820daff54cd00092412c9a4e71df2dc7cfb1a7e863af431ccd17e86b3370c0a85c244a6da9d8fa26c8551bb046bfbb69262abd7b7946b768808f9b6ae5d326d07084620202c063a2fa34f48b021b4d4e0341f373803ff466017e85459c05d803ccd2c74a6d4322d4842de8e626fb157a2b296386d38065d59ac3e2f2dd22ba8a123edb64434d44670ac7fbb1c17889fd331e832f359c6d64a77d800c41c3890683e9da1573e5c3cbff06467eede2d317d913e73a8eb2dfc9e6de26efa1b0a364dcf1cb7b3df49fb6dea4c92c1f18e16641acca2612d25883d25bbbb3f01f1ac73ae453a89a70fdb544dc4087530cc3a1f08480f76f091f1d0d0b8a4ef70c7f78f7231a7d3cdff2839885334b5b59a36e5e0caf706152c5e29dd2b288b1396f5b917406e3f300ae0ebe063c543fb3eee1b7515e1918d1cc869c7cd441fd366018f2dd6ae006789c3a1867880dc19ec914db1a1f43887a391b3beb6e99e847983d5c38571be16dc21aae7d227931e8197fb2b25b2bf0a926d3ad7f6580a6f81fdecad569fa7310d9f81824a7772c8528e1f09b62b563f49a4abc4a492c19b74f7b59e4f64621e3371f6fd563f80324d142aecbf188127aad7885d07d29cec716009715f86c3018a9bd527bbc1c84565f67a7a92b94c35a29f1c70b7837e359b5e67773b115d67e5c5e4a82e03ebd7c2f569cec302aaac6e2a3ab394da869b6c9b2b60ad5e8d86310753b02bbef19ed84a5c04eb830ac8f47ba64b812a1b443814b0deffcf62d20542d3360df1c628da95e06a947893abdfeccad4439d7b47a55e7abad8a5ea2a20a75ae248fc93bd57d24fce5b9f1bcd89e0d5f07e28d01e5890554ebb014288e5bee25d9577ffec0044c54d8f2c9d56fe0a30e500581ca61827449149c5a519784c6af5797a10ee1cd5f269ae95cec25275b791a83b0206d0a3366bfbc9c900887bd017321f1f910aea187ee3659a543bdaa708a3c1fed6d0e0f18175025a4a8e88475ea45d1c490d9128679a65df93b24e1c48247735429969cd750f0ba9d290b9350c76cbf30eefd838493fc088b7280ccc5f0c92fe0388d789dd1164424af73e2283636b665280c520e346776922fa592cb5fa952ceddd89d7412f2c8fb2ce9cc079b7a04d33041dc0588710e553dbe510f5386311543eb45dfb5ab9096adf8598992ab1a791363be37f112c33cd11f63b04336ffa62c80ea5dbb8cd0a621cf817e301671ae108afe1441d6e401bebc31a9e4365af8419dae016a66cef51470ebfa64c56f76bad516d22a48ace528beeef58400f67e9bdea97cd10da1666258295c21bec1af045c1e48062bc6238d907c014a418bad39aeafc9a85700c0db7be96b63f1488e0d9aae259d317a17c6e2437b61b4f89258619165620ab458d4d0dd72134cfc9be37849c76a925318fe72ad6a730cd4061920684a53c673b9456ae651a9920e748d5e2948f9330b98313b47c81114f1efa6400d3da4ca14068d5b975d1bc5ff8ef5d8914b9756ba577d0d17e2fa874864acf9ec7b813ffb11f72ac5dc8b16333b739d89ffa5e138b5172011f6294defa2a491a6a5bdf7e40a3b9ce0836ece145d3fe38a9f677271321a71693505846bc9168dbb3c860c121297c7f3586bbf6954a5f704e0be3f4bfd7b1a3c5cde7134070b209d81b000298cc133ac3006b2a4473f03cdd8883deb616086012bcb8a0ebbe29dec5d47f169bd9ae1f03d77714edd452e9a7e03808d0012950bc2696d605cacb603b09753afa244b9b42d70029ba84c919ab261c11c225af0eff8d50ecfb7b57445d994ba29b201d8b033b8869e29efde72fb5c38c6456531229bcc8874d0914e4426a39a55713a538f100bd20764c1b1a34259f933ff83eaffeae374813a3759e8b3530c82814863c5fd8cb9339da36100513452b8d8270a0db5982512dc4f88e2bb72c232e1fbb9351786976d5d015381134e7453c2ca30b2a8f0417cfc87b6b82e241384e136f265d770dfa869dba9412d38723cdc79ce5b5a251faa7a7a0dd99aa161593c9c734db787d8fad866f325315af99e550a02852c117b2d5fad79dce481a39821134ef3e31e594f3b65e7d1e38ac1bd22008c0a6980478e3b475696390aa7cd83f40338cd2400b3c99c62d79d45888b5cfee1a63a99d613abb378e5af8e2b5c8d7b8e56db6a5454643567981757b4eef3232a49bc1f3147fdeae44784248ae6b19a9a6278323ceffb4aa31fe7745dbbfd0f30da8315d39d6ab0521fedc9f829e4e35281aac7c96ecb7cb549726397e36fcc4e786d30f9bbba54b433401296629fe4f7361a1efa3a1bd8d7dfcbf3178d513c635ac2d087a65d06569d1d23d3c2f7b0c49b540db1e3bd0957bb1115c1b2a34fa0d1d5ed5a18acde6fefc5f1bbde67ed83f023df07731c95cfe8767fa40fd5778aac76f20e1c2b0fc75469b03f05b41b28b1b727e26d3d4f9b41472feabd0b73abba982680d0208214839db2023f6d912718357bbb30d66120b97f048c49a30032a2942a4e89eb8244de159d7ebb31f92e10bb9caea60fcf8423d6dd5052bfba173e99db24c45636fb70d684468290342c32303c86d9d8c3f58596425275f56175a67f92ba575c452a795a6e64062dcc21b86ba5ff05851c527c8f0192a284010cdcfac06b6dc645941f7af6564c549e9cd053f814479ea7625fa6b78697533c544ff7518400e5476765c85eb041d26f2578712ff3573c11e97bb7a23c272a22c6b760e52b6b6a7fd07e49b32077ee8f0c1cf77ce23e9489998dc9376d6f4d575075fd49670465c10d31ee162419ae3517024c7cfa972281f32ee74d63592d7f44f278bace307d688ff430689d5d933ff0255052ca0865104089d5539b900e597fb1847a9f47f9183b482712d80c5ebe8d29f398e4cbab87cfbc24d176026ca8608b4584223192301e0e0067623a1d3c36a0a1ad87472e845f8c31dd8ac08111b27c3f10b3ce39d6ea8cd5196dace06743db450b424883ae4d9f6872fe794485a406359a61645c0747ad76c0bdaf5623a5cd350f6f5b101a3050dcde79905429941ebaf714ca5737d04f07d3c0378bc8b640b466f7a4da8350b3f62645345b635e37abccace74311d63074d9461c6b27073caac4f83a3cd1988c62b63dbe3971bc994b15652a43c39ad3cd5a292c495d2dd5d57434eaebd0ee5ed1f0c2abf93d075b0d70337f2ef773a498275b08050b0a77a5246230045603370c2533647682d2c989c27931a46b11d55ccc643e27f9e9451a22b05c9a4ea96abcd37b34f2c0bba39e033992f2e522e7f5b6bb2d66b1acd14618f18dca860cb940ddfdc20036de3f5d90d46122f0549dc55bf43cccb8258c068f2b69d0cc35306095d481b24d478e1e562408c8671a270dfee49249e58b2cfa6dbef5e6e2366a6b17f303eb0863add3d5510f9c847bbc13cea1b0957b67be051a07ad6f8c47fdf11b4ef801babe9ac7d23e8e58d0ae1f4b3767e297c84e579d2db1f69335c3dc5e52d61af93e79fb8550112717471e5241074e01a2d1e63b0cf0fed63d65225509c3bf7d84d876976f7ce72ff2ea1daef9418efa7cbbc2528e5d4842c6a706e49273dec0ad877c8922a2ae4e5567e01e5c44f4f12668c31d4e720d32ce5d7ba59110de940fb028b6a03fe2178491dda80c96f310118cf4edc5505dfbfc3e639debd813c56478e04a18e14f820e4f3754fac7f57ab0681fcf817e7f41f9fca9510a5aa30f6e15f20b65f783c895d04f81ed0cce82d5f9d1326dab4bc49fcf17f42d8c8c1b83b32df6923c4756f9300b9a8ab84473c2b88ec606f309731efa241daa1a57acffe97dc51a49db491731bbfaa2515dd8b5ad28d57a664795b55cb87f7005752d5ea18d17d1beebdf41ef6621de53e260341972560a24dd48c80b4778c12c11542b5a2b72bc07e032288d0a888f478a9445981cd8d78751a609ad0f1deb57f70a3c8fb96dc7022776db4d6b0b21d7487432168e4c627bc64730ad9b8c54313f880f8ff0abfe7694f2d24c64416698a599545510e2eb843036d56d9ed72e2364024ca77059109ce40c1b05ee7245c35aedcbde1d8b6308e8d814ce4c3963828fc361f2f8a12313103fda2ab1859022a60514f507ea2da9c91564f79e4fff5214cffa31a332310f869df139bbffe72db1c642ff05b5ae104ac1b81f9600c207ab71df841d9034177dad18fc446f2de9acb8f8f0304fa8b700ddefbb8ffba1bbdba8aabc9370365e8fc0d14a9eb0f2166112e6abfb38eefc025e9578ca2fb70436003c307fa2508fc1f1774411460b20aef7e9cc1e6bf4a897098fbc9c477eba44f0c3f14cb107cb00b75675a0edcb8d35e9d3daaaf45fbe6643204224608c660ca119aafea0f64437378b893e4531b0a31cd11efe6a8551807307bccb601de850b24517e808f5090045cf21a7a86fbda882ac972c35d0c0938375fb970b6d19e6b53f49c10f1292072f858637433b9e785168747dcc76924398788bce18763c462619e8d555f07c1c79a4c3304e99d53c575cbdb5cc08decd004b0da28f317ee7ed0a1e85e532fa5d62ceba12d9725cf3268474d245e361dc424130ff0b5afb134681b06914ded60e878551ef13d6cd8fabe6bbed881c168c89014d244d9dda8747d7b77d308fa1f8115d6ab3216d829670b7051d8c36353876605e5beb8e65d896006668c918610518dd32bb4e20a52e08481d19b7682be2615fcba2b418fb980dce72a3f2d85aca4802ff6ad861b200b6652553819ed307fb2cf3c4b66ce2d81febb0716dc3f7882191a4dfa3a1a59ddf8df1bbb8ce375bb4b3b6b60de6f0492ff2f4b0423849fc3237164c033fb3687eac77c58a300e5bc0a909338fcfe2b0bd298ea0323ec406c04c20acea0d9e0eb7ca3003b69783a825fa4e99d67a0d7747f7897d84d54efa558a4264ae14abeb4fe9b52694956b72dd740947e004cde7bdf5ecbbd764cd1b5bf18e8b99d4827b6278209b24268a240a1b78c2f710b0a033921bdc31d1f89904badb8b40edc5ef4e7d8041679a1841699e7193e7523c1c0948ac46b195a9e2c8e308ffae0fe5898c951d8d25f14b9455093210bc155ff4c00c4287fffd9bb3d7ef2e06419694faef69200e7563145491d736e26d397036afc76254c7fbc5123480bb8d40b850c79eb7638a9289099cd730d303c9841ac4925fe6d4b0e8e84bb44dce5f526f61c914062f19898fbce8654a58cb82e5161e7684165eb46a54328d0f83a311d98f7835fafda7ae3d449032cbb7981824e4e8200c781fc6e88741c613b856cd927761ffb4d679dc31a483beeb288610b32c5ccc42c3dff0f9e65ec7ec4aced5c9b115b2f15d216b0829d86cb5c29a5c401611ba8371bb9a8309b40df69412e3c982f1572c3bbb52cce924e4418097de1247b9db7182488e8d8924e07832f36f77a82d8a49fc5ba484e6286737c458d48f0c140c7048749193d2172033e0dce65d15463eab78b6191cd1d37488aae14fee60daa8d2d27ed007f004a94feb383de2919a6ba3377be2177e57957a8209d03c757da4a1274397e606df95f5e3e827fe1b7a943467223a3cab09f74967bb826c1ffb80e32497716a70020b8dd2c3da3c68f9c86ffc01c14d0b26f62a564848e263730e3513248f1a249ae9dec100c4871175de2a17547201d4d82f0945724eda3295e0a37154d81610586430612e365dd7342232ee0b7ad136d1b56f4499d81c4da12542cba8230a48ae6c29e5aad7700f7005769b05b1fdbbffc7c561c6c04cde566fd995f22bad951259da397d3d4f073cf9285a7b26c290426d07d53a758d883225c40bd7ed993fd3e91809e4c87d468fce3bf38bf205e4680883f52c0d329d37fe45236be202346532671d0461ac48a7cf1382b00f1f09d1bbc71bf3ef102e0501484800c27380c4e72422c9788b61a4d2bda8abf1363fb75b7293cdca2213c5dd5a29a4cc5d99cbfb666d81e88064ad129e1020980a3b7e7ef9c4c4253f1e16086ec05a1cb6ddd77c0e74184a4db2ef3c37b48a2aea016683e4929e165a045063525e5f6f7350729e7e9e699861dc84d81ddd6ceed10a3b5e0770ae672fa96e59ca90d599b314249bd530599121e4da7618438c6c78ab286f0810717ac26f572764e931e1e3375814f6fa530f3f37e05517a8ce5dc4d3778645d167397e476821dc7efdaf74f7d6ad6afd2ac70f07dbfa083f478acff99fa028722d2cfec4dce2a40fe289a6402e3232317bd5643ad3ae22e92053401b221e9ded74508ae7091acc9554b70e0c6577037d74f71619a2df5f1095b7e4c58dcc805e47a9d1110c7145841bb9b849ac03ca2ad243572eb2e21ba76c021522bec736260be63e56867d02190030531bb53d28614a03d1ac277df14ac0804a5c0c4ac893ddea2fdcf990f97590b993cceaec9759e4846ca9c29129f84edd50b51f67660cb9d29b5db884b22bf3e5d892deeea16ab93b1fc267d34fdc4d491f315e9e228ca0ed43567606d36b9bdcfc61f34afce8a4ef267c93143b6471818ec5db54129169dad331a752fe8169ae1918ff8579828ee3c7a255cc781615719443fbd46f675623795a3f6ca5bccd4f66f5c723710018b4b1745e2b4d3549dc78b0eb33e534d7c821ee2394c683f0507a6dd0132792fc3b02b57bb098f00a4c76cb8a8f6010d9c82ede3c20f3323bd44919124f24e7ad6e27b2f595c0ec696544cff94d1a2bbdff18191e291a40d14d08dec208728b0a7542746fdcf0fc476e2d66cb7b7a0514d110f949bbac09ecacf33c9d93edd7440eca91f15aab1e656de94e3a28d73bd4822e164394a470445a9f3e35c09483addf31fd41245add9cddd3bcef51d3caa2533465761c8c1b9f03bd148cbb5c1a9a7ba2e4eee9790b47e56b5375f06e8e4f8582661655be3cbc14a779c85f942439712c4260bcbd0d03bcb033eb57dc0505395094bc0fc35254d005571c639bee019a62bd45cfc22c37c837e997c3b0faccb445593e566966e3051a52362be0f06ec428138ec2901a6a27f8059fb55232d4efdf0dd5a56c417fb97daecbff63bb2e69e3e26a3137947767c3802745ed066a6536dbdc8a73f59aae683716fc1d6f2de8b9754466c564e90d2028a204a2da7a8afcf280d7d716973e6e12d7d1bba86fa44ff81a92985cbb598aba69017d41b64ffb7bb16b4fc20f986649324e09221de714e756030435ac3a29260aa61d9fff5a73fda7b9faa25d0c7d798cb37d9353c99d1f83e25fbc44a14465287dc94a11b82448be8b03a19824baca5079884d4818c468a0b36cc297e81882d226131c7a4e552b6367bbfaca99f320422286eff423528ae6517e60252435d7ed930c4740a9049ee48d5ff9cfe42c34000ff7275117327f96161845b3ce9d7cdcb5d0c163f5c2839c83fbfc6d8e101435ceba567c90772cf0e2690b43b4c24f551a267e98d9432666c5d4246428944c932f5204c8cdb4775dccaee38cc7b2e8d65d7e95c1ea4c4a962bcc0e32c178c7803a82852a536088653dc0371da26cc5ba20adea112542bae4e9e944b5976ace90018aa48442f7e07e1322f734b72eabe548645d1fa70573202447fdf99ffa256ad0eca14c58f9faba076e11f95d7daf1407d0cc4a3d89c50fb8e1be3b325c2c1e765fbc7719a0279e954984c16e603d9bade8959e1df187af9b9e269dc1ff80ce25006a5b18a0c809520ee5044fa023a369cf80ff1adcbfe1c8ed48bf0cd8320e9e03541cb30a1bc21ff42ad12af031a3c66c10932075f3ec35d8c7235f73430304ba658e344fb0c7d5e2d74390df0ce287b7d845ded229ded69e370b30a6629d0aa5e300c66fdfd9240397ff7081d0b2d7558c885b6d450336ff722334bc6f096bd1d84aecee9404e06b53f26d028a3d8353493024c609a3751fcf66e6b1f18943b7b82a28a0290d6e31227f02514bacd92ec4b0b92631b72254935de03113cae69bb11d2237eb86e5b3881005009ae8a43823d549885f972ea91334724221cd7c6f9181936f47f1585a4eca0e8f86a4f61c25ef5a35cacedbbc06ed00ca4c2d454050845c55501bab194382536abbd3e20ed8730d07ed01f30305716812de81ab9bc908dadce3d7aeef357baf679784840000fc16dae8bfe1dc535bec61c522e59c1d583f03b77f3037c1e2cbfe45a269ff8ff6c12205f926edd6763f4db4822d1c064fe27a762fd508acba0f0013d6957c435a449408a015fd51f0a2308aa1c10cb3bc178531707ec8800ae1d13d10680d07dc9b3e289ccf66acf0e4471bb66ef504c815bf68ddb4a378001ac61290ceecbedbe4a1454e83f59e8a8ed626a210a232e708149c0465bb0803f4cf5caa6f89d45a966093938d255bf63d1cc1510e1290011fd71b0550f017a7bb199803565368a54781d21d47d15ced604827db6b0b02ad0dd54401ac645288c3c549e14568e353e15f79fb4c64e7e869f2074833302c0400c03e8820517832fa2b4bf825af38d730d0e60d3502d39f7d22f86e077bf5b4718f792b1edee19a121ec7994d7829438809734a5cc54f84d9f584698e70f7374c334759b42fa87f3575b8a0f75ca3fcaf63e603e3521909f513258f243c3e21d290bddcad00c87fd716aefbdf0acc2c5e5b059a4eef27685460b4f384bb3ba245f16d842afa3a8edb2f8664ae057c492b662cbda5f4c5c5bc178f6dca69212c4dad57d2ff2535ad6509d7f5c080da1d9086ddc3c2ff4cdd1b154c6ffe3e88388e3ef7b185f7827d86c3118ca939e697d8ffa8682bba39f2f6174723bd9278a8cc2d0353d1bc2c6c013e8de8efb7cf2e6bbc4ce47ff7ae92888ead07d8079e45b10edb4321310c4cb2e32077a83f2fa4859f382df9c0933c77858ec55069dd0bac4dc3d33486bc197f52353a92110a402042566f9b9a21b278b99ad320df7ebd895d1ef886e13b8f7cea6d5f804df290d69abb26f3fa01445d810ab6c984aca7b99e38b32ccbf69117a07bde3917b451f4810e2c324e5ae7cebfb30b05af6da96431140336e2875dc7cde7f65f7e9908ed6ed7d13afe6e32b0975a68dfd9018b5c1bb97921a1bace3530a960ac77d968e79cff8269b4108c5a1d9f057c1d5852625b0f797b704a803679e4a86c1e4d6411050534bd1fa5fc53d56a05bb992c23a9d5d8bb0a1e50b0c9117a1538b1610444af91d05082b0040477213a77c2eedb5b5f069d241c5ef02187919d72f2ec6a33a11f5456bd123b8b21cb774bd5626dd3010c05999e3dd6549480f0ca2f26b872984bf9192205c94a41a38dccadd139f526cb47cb573dfd2c9298b8cafd9e40b6d1aa72dc46b1cb5546edaff9d4e2f6f55f03f428b9e8521602745bc5e72b860620555c3adb605080fa202929553cf1299fcee12e479c75f6d6f3c2f1fe2eb036f323676de4e291e97e0a1c5e6e1c92002631e91e2030b9ae32b933a990516856fc2c2398078a3d0b51ee753fd8f5fb9d9a44f7c2cc36e396ee338fe7a9738ad871a4dc6ba5ec26c527da007f6f3cefc76c6e204dab9f361721bd6d204ba1b70bfb45a0762c8395de35d1dff5ffe457a23e8c69afb979cc88bf5b85f2ef93eacd9514c6255e94d2d0f4c8b3bb16c029d03957ff8ea35808e6a4245ebfa004f95eb122d3da58548875f9765033c5e52a8ad25b3f5eb1d0310f8d1374a0271a91a34736148beaa4f49112f7ff0d54b3d1b65833d114b28294665552730c4255248a1660356f26829e88f50eae7152105c042a87a8c69417c1b02140cdc183e7672861e7e67b934510880d3acac4021c420dd02488c369e0636133d4ff521884927d06b7a33a6427860f8884ad8d73f56edf66462cb3913e683bc37ba38705a2c8f594432850044750f5a2ef342eb94203dc2192c19f35abf5bab61e0ea8986b41fd8ac98d47280a1ce0d802abe2b2e2815fdbbbc35b340b4f3db26483502864e6c15d42803c3575a64109991ccfef6846cdd8fda95b517c7874ae998a6a320a3ccd3e29c2d37415841ec1c5d2b20a1389b4a820a1a8e068bec8c5182ed60314375c6675058542223628cfc30c906d44be16e4e0dc87e1ce3a1a0aed480ef2dbcd2276221c8fc090f7ccd06bd34214e36d4d11119f15e8fa1ff9fac668f4766ead8b83deff3c7f8fa6c4ba56f8de2bdfc8979df6cd20a9fcb908133e6dfa5bc9766f67c95e2c4af040105a4850389ec990cef55dce3c833352aa11ff9f06d089094b778fa84fd918f1f53ce1902152910240f8519b0d5787c3ae9fd96f72a4524b6b85f0dd1fedd3db005e4922d2060dd287022800c3cf8ed2ce578f20bb2630e49674e34c1eaefcc875b87c3dc53736114507e0611e8f7932dfb5f9b35898fa01b541362f84d329fa0ee4c1b6933a05cc040f78d06526ae999ffcefc80ef18cee9df275830b6fa54ae93e5414e69a29cce6402be5dad1b0ac59fb3ab01a8b585936d920417efdb771b249fcf2b01d3e572de5e8223eb2ecd39bed5f3ff96961609569d59b2115ecf2269122c9108027553189acb6a4e40fb58b166fe9f2c8400a0d47fd13ada33437b74a310cdb91d23eaec9fc5a8351432c695560c780dcf7638ebb8a3410f292cd2b8b639b0de218e978ab1738a50821b6c195947e427cf1ae062fc0ecc30001f6edda63020bdb33a36093e4900253476f07e70132c30397abaf159cf910019f1e04ccae0145611858278e88d5f67c0916707f7375be868b4faa1e9791a4a6cdecf400c6644b8294324a1af66ff8a5a9842aff1755b241e34806ae14e27cdc84a491652531e079ece22cefc814881b92feb96e4621bcda96e8b52e139762443c7333058cbe748a57d38307153fa6f1eb5f0c78936a4a052e98c9a6d3290d203204acc81bcdf267fb7892c09aa4cf5cf696d02648edc5f3a2b2d1134749396a660014c635cf39e54b73d552180b9fe22e40534a8e320a0cc1ed36b10485bc69c678c1f529fcad2072998bf8d5d3c520dac540e360d8cf9138939725f7a23ce9c76cc933e2f76c3895a162f41797f52eede007d53c9a5f0e621737d1941107169281c6a5489af3b5473bcbdf96fca898ed3549e335d940a4f960b3069afca8ddcdcfae27a1fbb3f625e62b39703329ec6a4ce135b5eed6964ae98a3d98551c563ef296ced1bc672d677ab2f3b4901e4a9d4139c5cd72bfb9694803b0341b32f84d101cd409b4db02ba285f8174b0fe35e51d35bba4526be087dd11636ec1646408db2050c29338c31f88d8b1aab0d6140a42dbb7cf21ee89b7354b22b99ff275688a8e41fe0bdc275e9c68419f95f5df045b286c36f6b74cffcef4a148ebf1fda2c942f46d0d7a3d7b034a82dd5cc910d22828fb065c1ecc45ceae6cbcdde80a501eb63c5737d91d34e6b339a22d9ac9dcd396ac3d54fe0b5e1f9bc7cf5259d67391ddd11fb6391381b14bfb918ade53c4c5535ccc82006e4c7b02fb7f6474ac7c84c6f4d15465ffc05f0b9144f50a623a19099e071997bdf183e4b141ad54f038419dac3055b162b02201c9035e9e494253b97071ba9b279c5d6b8e39beeb2721cf59f432df7a3a15d7713f81850679149e02753938f6909e092f598ac5d93d9d9f85855e00fde40b6d40eb6f924a45770d004aeb64d6110258a0b787cb4a3a0eff08da85c764253a154caeb724b0bb6c2cd4011a311b556027927e282d0c00739ab6735b13da59b94d51ecb2816c886ad7d509ef8e7365f09598cc20660e5ccf36ca0c1920acbc7e68503bb16ba51132810ca71febea223553ffa61b18acb064e7e56a81eb67ed131209642827cafe8a8e17c606474a8a728a68ed524a821aa973a3a461cc738040261c8a2112598830e19d177b932d077fffdc6ffe1bd1a0056b93ca314ec48f9b718382f2de381a03c7e895d6291a7f536c139f60b380eb19652006ca0681f7cd3994c29c8af6d2bddc808ddbf54c4c1e4a731508ee2984ec313347b53ac3f436bfee27435073af58177559769af7f651415f8bedbf46b9f50a29cf869ba4af49f89b8f700b6f96e6ee8bf8c3ab9cd70d039c8fc2e1706b633a05c10a1504c4537b7d0f1f1103810b92885c0f630e0d98ebc9b67b0f0a206b78eadf8de013c4e34b479bc334637a100226185b469f1c29c48dedc7878c3c7f1493b0dfbd467c282b6de695854a8dd8d0085d7231d446a068622d64998de18c947ea6a9142fa91aab1204cf3620c1995fd07ba1e4e45358c922d43465898fff6990ec023ea38e85e812a808c60cd3ad1f220080e96c33189aeab075038d44ed08cd7ab81e5fb7661986a98f3233af6478f872115339860802271fb2265c80ca992076878d75dac39098625e84756c2ceb1117271d566e89a3659993f04209e7e9bce80f998f5d8a211673f45abb630202e8485eeb13c9eee22e8d6e38e08b64a3c22fe5f37a63ae5409b4592c20e1bb80ff34a8403c118dd5e4f8adf9644d7b16d470e1829e54af45d639226c72d1a29b7149c09d0733aedb16407b4aba566b32e0040436d39000f574a459e931a26330b7c2f66d7710ff0e0c118e201b9569ba110b1377cfa80a5083a1414f23df67cb4c982259d7e472170bd9258370f0ccffe472b06ddad359066da030bb8515f59b7a5ec06a18014b4d4297c49960f329616035f98103e6442c13721d6cb11e706f5b3bc840e51020fd8d15c7c03e017ed5718d4a1693a8d9617422d725d8c9cd734481fc8d80634604858702b8c85afa945a75e0054ababc6218c8651223cb3644afb55455e24ab9a3fd5e237f1ca84a6bcfeca2e29f998943d416f960183bd3ea20fed9c6d8c4fe9525889c0d362533a6b56b9f8a0099c1c0d39811f2c9fccfa095cdbfae109a96d3369fe6f74329d711179a2b9e101e8de5be7ee3017751e9126b3c1c07d312ff323705de24d0b9b0ae95a485a54443232df5150ac22e021419f20d96d5e577a895918e5d952b517994246319c7c9317978818f9e60df6d381cfa87e2ee9f493fa5d710b6246f26bf4714aabf0957f7948d4a2aa6b56771e3e5e60ae6646e3f2219cfacf0b0ab344707e046030bf9c7ef3232736102adc1db4761ca62670c663c8453c7132c9f9ee8195d39e1db9bf6f7160c9a14f9febdbd4a81ceab1066db6777c1bd967182aa0df725d2a32f711817ed30724be76923e94cfa09e3cc46c1bba5518cc5960d1126c24aa402c86a6762aa3a7938561d0dde9304145d45ace88facd90ffec0909881a6a3eec09ba716b1069ba34cb95d6447013dfb5b1f5e83909dc9d3a4648c4acedafeb07913aafa932839099043ffe4d45e8bfb78db805ed33e9d1d61719e90ced01035a0ad3213bf77f3ddbad48689acca843d32f8fb7d5d7cd114f5f67a74db27e1f00479c46c98faffe756eea4ffc8eeaa938727eea51577c07a9041f8728e12906b8c577cb537d31e066a8917faa2fa1bd99fdee39e7fd4bed110a5800b66cf55a82b85ed323e5db0198e3d836a80797a4a96188587542087af93873751b3411fc55d415067c3b9aa4392564e3a8f4bef99a4f4bd42995ecc38c1892bcd6853c7b8f772679fc473dd23c642f740b4f33315a203e7a5361ee27bf27c1f11a1bfa875647ee6f479f52ef477e2e646b043eae8e99d0b906623f00c9e2dac7ae89560e69d79c220350cb01e250b9b5c2ca9767b80fad11f4060d412490b2fc10d599ad39936fa05b22a5e9b23e661aad16518f70c3511139653da9f926c81d7fc1b79fe521f7fbf64705aa07b5e866981e2b7d395f9ee1f1582d6019ece8bdeae0ad744adf8c4bfef6ece6a3bd80619719cfe216c4053a6e12965e9b8ee3c64ec1f87344915fa259e3f52cb24fc3be699a06e68ea01006a12ad188aebf68b6187eea698c2769ae16cfae83e16c62d7b7e7145830de10a9bc91cef9bd3c0b0b4a51a40c6faaf8da299d221bb0fcd1d0ec12664fc5714dc7bba89b78f70be19bef52506a8d515c7a9e6d8490dcfc02d63a332cf07ecfb89b6f91df9c0f406400fdb5041cf3bbb4da8a1b87bffdc9db3cf1fa666f05c848fdbb3c49023f09942335c416d8a8aa4bb7ad38d049c0d3892495677f3798d62e0b5622f9eeb70b334ade61ec2f565098a006d460d8432879f8c855a13b4eedace4338bec18035d2e1bf48ac898b7672152cb7d1401b6118a9683bf693a19ad11d69b0d3696572abc8df1db2d18b8eace131ba73a7eb619dd3106c066db9776ebfa8044b618e26d8cb17632932a2dfce61cfbc5326fec1ebf06368076ec176f288533a69c28b3fc0a0d0fdd1febc36c7e8f51c6183c88c1b1b0216c7477160f53430874399ce3046de86f40504874781cc3a436432cbb11762d82135ce93c5033f9cab93fbd86d6b7e74487616b5944bafcf0e69c166967bcdf9b921310578cbf9a0eb83c0723d6116d67bc538a0bd2a1f5ca621c1f742466f61c3ef5c8773c4123fa6463bb9329cc9fb978b23ee8d431caa290c0d8161f01ec1316e2c68c03c8751b39a1a56d882f6a53587615b8473ff3503f4cc320d6b17626bcfc5a9160ee5c8c2781210e67da40f95cc4aad7be09a043ffd8a28d6d517ebd7df89c75dcdf63cf955d74e5e3b462f5c54b9a95403c793649a5bec6a8e59f930eb1bc09c271a350a9c77b911ad160251bd15e45023f8c3482ce04e72cc06f4b109531e02513903880f8f2b545c367e4f23d7e7da05af523eb7c9594723e51963216ac66e2183a9c6ec55492ad626a8a0a8e8b18cf7db8950c0d9b7d8b63e0a057da0c2d90bab222774f37a6709f8ec8fdc94c72befaf39b9a7b2b3a49234e61e7778f87edffd3e6e7ccf6ee07534330681e077fdfcaea8272134783ed2703cd792d78e4ab34db7fb0840b910c40cdbb08d0b20bc0cf161c2404d07ace3c3431210ecb147d7eff1a0314764fbd5ee7cecbd199998fcc193d496d96e23ed6dee054913ac8585aa3ecff4f73e62ae07c1d40bb40d62d5dd9ea3745025fdd3e76aa047c5a27d9dbc3c42c9feb1a42832a4c4a2184ffce6be0117dd93e5d9074577f668a633f32e1c544b9fef28251658a536b6320684b6a8549115a99b4b1fdbe0befc78b487e5fc35742363822639579300dfc072589f83a1579416c0f5e770f0258985ae7a15471ee083dca7292fa6ed3bdc8fb831d38d555d84fa77fcfe682cf42058ec0f3cfddfe7bbe9ef5bc00a17162b93b4c06a0e9408a259f3d1f5341134d1aaf81a3e8de301ab7be9238e9edd1f64a29866aebe476fe4b1f14376dee1ae82f04508f7cb4fe8a6613cc8bb4794adc43784545b5f27b39a1c5c040433e054c7880567bd6665a8bf2ac650aadddfd2419ba88ef8d426f77ce3b3d3d97809510af688c483753e9028be26015eb5a52ff78c0615150b75bfb1b146f66d98d0e8b4604497893d75661d18f38010f9209e473516a1cdc4173fff6c86a9dc00a8f000e2827c88c59d0c30024f4aa6d376519e1c92c9da8a2090381197b819ebab781037770565d79e855811588358f59a9939872270063a20c7b9acbdec8d85bc77ff045470538f00109a61520aecf209c02bc4d1bb23d2ac061948f3aee73a7cfae2600b7f09dcae22a00475db6ae5792b92151a566f80e20757af11ba9cf37aa675fc956728acbcd2835215f9bf4756987f4eb2550a33b643df494e5ba1cdb869b21060321adb902b579a37bd51c11e1432e0a3f28eb48ba0a231ad3c5409aead6a6d1176e54c61bd8a260e6cf9e0c6e07908ce88b11e12b51e5c84fa7a0304c5baae23b00ed0b9704ac4877d29eed554882f2ede2886338355aa4269101828e46cd3642b2b18f12c9488567513b96f6a0b7306d178330d2ff348eba9ad37accf43657adcd86c76c3023bcf9397f8eb918ce97cf36b95e9132dc5b795e70d5074c5427843c51bb45be5fce571cb495695605a975155793e8ed26e5df0389d1b33db759d64be785c01f0040f097193a9ecb598dcb5918bbb7fade605dc36265dae8a25abf31af4e52a0b2cd0ab2120e0f45c3721150d8e49ab4c3ad132f2a9141fcb5580b51c0e012009023b33eafe04091730063c2818f6dfc9c439e9fccacd50d11e8b1928bc0d4e7bb1e3fc152df44b08b1842261dbdf704e87a8ed2d2ed21bac3996a807916953883a260e33aa3ce02ff58fbfe58ed95ad9500f67d375e308b0a049969fea3b3ed3e04b234a76a647793f1d9df54e7b64179df3eb24f289b1c564df1ae1241d3f6d091d4b307c71b64892c7204e846f880fe936f3b22e2c84d84ecf433bd0e78ce5e8b8c7bc6c3af8697a87309fb6702ab92226ec234bc941436cf2dfeeccdf6da819c21bb17c4f7c91df64cbdb706e4ad074e82e16343648344682355d3f8395b6c1b21cc572687e574fba61ba6695d518772a3910d93681ccc108986b237f5a3b4dc9474cb5b47b9527e90bd00b80516909999585b9d3761435c880d41994910e2a71ec1b47f89359d1acae0cdec3506378c5067807cfb5705ec9c818213b72e48d071ef098f2fff5a3ef31c1c532173eb26b93ceb1a3644803e329563717d1bcc09e0feefd5676cb0176e55ef06aadb363404149645162c6820be0d7b7b20ebd638a8538f4fe8d01ae8f56d68e7a6a18a6078ec4b59b9f394d3a35ae071b9f76df0caf22c7c7783534c081f34d03384c29e05ba82f304338574202cba366c6d3f2b6a0eb583fbe929f6d080409e1a64362276364c11bfda483182c7a1d0940f665e26691c69570d4d2d6f9f891de28016a73e11092680ca4396b2abc65482b8ed3ace351774e05e3654f25908bdb465190813264a148c460b2e372032e57d49863d872de3a2c021391cf5aff3aa447446c673953ab0bb84416d3c972015601e1dee302bd2724b7d297c78b4e406ef6c809a7674ea651fe61d3631337da87142282d6ba40ceb5d4018744699cff62c1e60ff4340bc04606e08ad36cb005ebd259966c3dba05e91119563d56efffa2f5b786cabdc98aa4550d07519841c6874698add9c2b3f20a560df5d060f2f9d8dd15ad07886ab12990877b38b7c9c35b04017a6c40884d48906c0e48ecf26fc0c6fa9244d0c54aa3475389f70f38b058c9584be3b3169920b8cb71490acdced7736d22e0c1eb84cb2cec54be0de70dd2261e7155e9f9fdfda61c10575018c84b86e06f86eafdbb72c0c3172146cf3238db780e667b2e750fa17776a6e324dcb04a818e9f8d1487ee74649bc8a554365ca357534d2cfb287de78bfb83194c421a9536ab69733834ed3bd2574dc3d7d0c0bba0e0cf4b67da61d527c3d3841f5b3cf5154eb2441f5b8928ca583215ecfa2f5123fad4ad3d0753ddb6abc89496fe569fd264564c41da9586565fc1e24ae69c2cad203ecfe3d6c94074cdbd7fc5675e64ac1c6b20ddbc602e132859da7f057be5f519a7db2c2f273d7462521b017156763d2ae2e3e5e4fa63cc3d0f4b3b292dc84ceee4477479d3cb448176557f57c53042234ce7a85d6cb45e1ab10dfef097ad0829c91442032a960ee764ebe53147bcd3ec38a097c6ff96e473329169a0aa93f166b056072a2a5e4b4baa5dc9a4e5bc7b7e3c459067d58f392f7aa7338c2c94605a859c6434e0be3f1cf4a9cbe20d249bab942d74195930aea81d68ee2bfb1a963f00cc6105a6775753815a5531be30c5d01b1ba0797df1027875fd30d3082739d22755f64642fa39a0a8e5764926a012e7764659a5e8a17de069be59a836ec9ac92c2f212213e60ee8132abc285865ba0e3151aa800de5e9a85fa6adaf6d7078958229ac63dc0b47653ee80f06bd2907798bfdea8db7b56d970a26cdfc7fafe0f1b93a8a1cc5d798218893d2242301f6582c653a13963edc64173fad4bd4434ba97bb18791d1d31478506526bcfea179132b58c967be1e3b345946eda63c0f867b45452dd003cc0bddc4a8808f16cdfdec00c23e1fb76a55d662b59596936666463ed62df415ef0cacc14c0538ec936b02a602cd52c5cffcf1cedc8ef6a5beb6586550b1351fbf2cefdf9cdd36ee1c4dfd32c3b0cb629b5e49f19e048789556225f972812e4d5e639164daf7b57f8597adb200ebb5355839afab2c0fa85f6bdfd02b8545715815f64bafd379c63ba112d8a639ba91e00fb9d3c866668acdde1d6f99dba0de53ac4aa968f81469bd187a57ce6d51584e4c641620d79545c84792bc9a9d9cb5d5051739f7e90c9893baa4b2088eb728cfa3be674d9e3a5f136d448d8a96b27a33e33b26a0c14fcaaf59a9cca845e004d4b0be56e6b7c9a0f3a119f091ca00bbc47a2c8496749189528c8a1a3cf2705485c7d92d53e6f1e6ee3f2777f72bb00ecbad2998a39e9507376a0f79d8d91dcfdb8a663ba9e947c04b4e99cfe55734ed79b94fc08b72789a2e32da94022c7fd17ed8d8b6f16e9c11118f5cc0ab2a4645aab014b2b65dd52e357d7882f54d371d84789edbf8c18ea859d7ece8721d4fe0faa92d48cb8ff52f3d35acd8063d8f33a55c437fccff7347d40108a1834749841c162f1a934f7753217746141010063c395f230b5bad92c1f2aa299a74deb4547df9c608333674fab08666c9b06036956dfa1acbc2aed0ffc61db988b4c276e802a28fe30e2c4a4aa3e755e18abb29e6e97ab1444cfc91bbfc2f46b0816a96023458ab1f7d4cb5056e24fa7940b06ee03955d0ab2792718774ae52a9d47724a870d07fbaf0514d0010e2d563ec6801d111fc5079aa58aea3493a979e6a550f3c4e6f30d3425a6789ede6b268bd0c118962b1c8c2955c54cd2d4bb50ca2ff6005d5c5bcb712eaeba9cf14653bf74941ab0642fdf1a42453c339987baecb5c63ca57eb65154c1d57f477b3d0d72b1be7adfe06412ba60c1df23ebe708f2c953eba65c46a51731d17ec4a4cd62dda6d5dfb0825817fadb4f6d27f51a91b445b462f6185858f1fc36778ddcd8680445595f0fce76025225d830745c6ac6ff759c5d9010852c540c36efbb6faf8995a5ad2f1318525665984a14377ad855e5f6a7ede6568babef1b3c918ef7189036d0405f0b5cda7f8c3b028b3740ada00e54ae6ceed5790e523aa5df903880e79a751124f95e50037eec82312d4efccf28dbebcbdd27bd6d8566679093c17f9c7e06c8630df870acc9c4917dd05cf9d04d5cf79250b310046c55d1aced1b0c6c957330d3a84fb0cda72310ae166a57eb67c2153a0ff5851111dda43b5c12783964dc50db82b6cc68f82d9d2e6bbf0408a2321f97c3f61db4e47840f8f20f4622318b1dd073139a5c7ed029063a82a064685116ba67edcb5854bf476139ee87c33fc66d620499d720a63c705eef8b33808906ac47183ed80c1896a6c7da160d380eb24fd9ad73c4841588386c4d6d11f8b0c0b63f7adaab24fba47a9131d444365c950b4f9f88054fe0ad3316449695a0a94bfd65c723f8121f51b13b04342858f828a29e029faf505d77eb988e66e839a05f3a6f54e91a35df00bded656ba0d7fc8f8455df8851024af36f116b8e7fcff4850cc1e8bf47db1f102b8b6f9466a39e3d668aab657e7e8470212e0343862284e1ded227bea48714c4d0358c2f76b4e51e0e030b35ee844e2db70209b068ab87c4823537428dbc0a70b601000b4c39b9156a7e9de944f5ea76bac25ca3f06cd45bf29a53234144a0c8f030e9797eb8b9b3983408ff77a0fa7bd6a8fd3135f5d3468c2e632d9574d666173b02d119fa73e1715c3279f66f36e4d46259563422ab82dffe336d11ea59ef8f826217891d7aff3540f4a2e8e30750f62c7c4a6e2a73499fc3a99b873fe06b42ae7910eec7c2f13f9cc63d8afe76bd0822fab10dd07d753c1f0c4c3a6ffd5cbf8f5bcbe3bff1a38dff86c1300dc01632ab49ef11a914ce38044a47dab8780871132d00d782198b8181770b00ebd74c8062405417c18f5c76aebfabed352c6f002d4b9e28c04306c9f21850b480e0f9cd94872a2e12e18f099758718f974906f02b6f280bc498b316d6076e15029545404782df676c97c95a9d408e2fa8bed3872d6e330558a04124e999d677a41c6fc7d23405bd39584dd6a7e25a42d79bf5102423f96407c82ec8655014f7e8b18a4719a94194729030dd60fdade00e1b7cfdb234f1e0647d8dbdb973520871881311926daa6114a26e18b7d2125d37eea0507e7d69a2b09a67cd6c974d708c385be280cb401f3c546af243a66f67bb33c0e54f4d326fc07739ab960508905216061f154ac0c5d2a67b8cc3767c5b502ab75a92cf294e0daf372523ffa648341d2e4f3af0d26b4251ba1b0e00fd6f99fafe925068420db9eaea124fc859d9de13ccff17bf661bed4f2e73a917cb236d54c876b584a288a3772196a5e69fb6e00e52e4ec2da149ddc87d06f3bb067fca2b6c2bd037514d388e790eaa2a27635303fa77001cfa8120013b8cc0b6f88b160277a3f01f8faa63b2285e009b8ba8ec14ad739e569d40eb8f09c2a02df8522bdb4240cee4ed98cc49dc532dcc409e464d840cf97f4ab6a89154c33268e8a36d08daf347b98d9ff114d7501ec23f1c94fe3aee022093d45c5d1e92d183c168c881924f3250e42d50f6fe0a52040a18c9b7db97f2cbc50814495bc476062febb7d40a5005f9f789033fde98fa8850e41feae9e09fe7928fba962486d380aa56eda82f97994785b5c003f4d32a92b5630d3ca043b881cbda84f8c1b7a7bd918ec0b47dae0675d7d03c55f409f52404eca5f59b023b96e87f062557ebbb91a22041f892f352c7c5fb3bd26425e0fb6d7ac16075af92bc24663e74925d9260acfbc6b202bb890e74dbc4f3b2227818c30922ca1f1c4d51c264a55f2e05be353ffe933965579287268fe7cb01cd4a48f792cc2ffea82642d7e8cb381b01e1e1ecb268aaf273ef3a3e27e92105e7a771de7ab3c9411537e9889743111a6a3f1b39a75811c94568e2998e7f9750fbf80a43f62b3e9c0d7a82e24b3938c3f9b39b5a2e88ba36083940a8343e6cbd811410d0455d63024fc51b3e16e014fbfde8355e9808c74f2581f22d9c052f631296334ed98c455d5fa7080235775816cc90ea93d1621c675d11d9a8d847506d5814c547347c54086a70051956c22a68cf0d87d86218e018eca3979b68eb97c794e0d567def8452b1e2f834506353d5bf25421ec445154a472c7a76fc5cd4cb24cd169eab5687ce00d53bea055bbe21c3cf9e354532f83491be8912e1ad0ac9ad80e55952d659d62295bb04234e71c39e4754361fb12b5e17fe599b91281030f562adf1288835cc822dce2d7f61ddf5690c89e694cfcef90816402dfb30167e21f8c1d9088d567bc22ecf1fc2eb3243afbf10aad20116e1cc8c468a5c2b7027597a186bb358dcfa6387ac3f75060db38e76e8cce7e79ad932cffc5a019eecb8b54fad5a82a891bb43c67b5be3af934ccc30bb4be0ee5fcc5751f8dd2c58460320dda434116743b191d5c2a421d72efe38a9021b3674ce47b133b12685ab7a7ee36e584d6bb508137ad4ff6d9dbba82ba8a626ee59ceec9e191e03bfc17890641e03de4562f25a1cced6d924c28784396ca0c3b953399eb03cbea6c21b4284f87b9c24a6d722e4b390282da7ad7c0d8bf7a501e53601fc653fe62b0da2503054bca3c6fd75f9a327f0cac18821c3bbd26a200798598b02e5e31f5051cae73a934eb3cc3737ea3c1fc7e85a61ad1d01fe8ad29f44124ba2495a8e5daa38b244e8d32094f36764b353bc4a736912638030715d98c964b5d325cd55229fb4d771b9a5a023363fccef7eb4723fb17d745568a0fcc9e8b9c3b318a651e2781929f47593d8ad64cdad3491592aa45eb4da42842329169bc73e3fa8f6685ce304d577df84e8564249cdba2ba66cb18c3762983596d471152c34fe065912cc9bba1923edb1dc8c677c9bb8c9d2ab127d04ec380010f28d5bdb6551ba136a4756c96d050055ddf08aad0dec4a65304a433b7c529ed5594f47e5c04716f7d30124a888f847b92180285efc6317a7c862dd87ada8ed82864d76fc2e35e8b43497a0f35c0e4f92a489dbfd4bde888a2bf9db9d79f28c3628d645cef19e007c333b2d9dffb60b7c1e3617f7704a1964630f3f383b9243fb594f844121883fa6a3f163e818605221e020d402a28b6bc8437c9c9ea468940483d032bd4237c547e78032f1a00e818a5d8576bc3125faeed164a2e21efa1f9bade8cfdf69610115e22b3ee66732d1f5965e572b3ba62f6075c050f49b6ae1a31eb55087fc3c61a05d380f31dd5f249668da23543504769c0d5129b2f33e56a3bd8b195c92bfe49dfdcd287a6fef457dcd8376e9db99fd607130f503d466c1c4f6c1f388fe6e637645e7d5014b42671c8a0f2f248b22f9dd606ffd710d9bc50482e54b912f631f97f4b067858169b2023b4c233ddcf6e65c7ad94b10f8ba8ecbd32ed2212f3889a23b332014d9214d450d0d032d209299f4f1c37795f0a7a960307e4df33a65a0b75cd9b3b20191fe08c169b57d073b4a421f2a5f6c4cfe067d131eeef336ac4bef9f33a7eacefd39a5470c0a74fda68c9c5714180a2276980333a1f886b1c8a54858bf1a3a285f9da6e942b5351cf1f11f7ed2322b1fe2751740fc74b744cab83e456cbbe3dfc9e36cc7b4d516e26f995e44a857db274c08bc849f4dae970818fe3df46820775c40ae81a975dd8da2d84dd3febff009a1f34509ca33cc683463eca8d1fbf1bd6dae9b1c40010b01f192f591c2f02292661a259d8a907e999741e28a600e8d31d4c5cd0fce3f3e1a29a43d36d76c104aa7496f6a603606b19103c0e940bdc022939504c1e047a8b7e3b262628f25add2d14e4b0fa56886a2bab61896ed83ad22d2318187a82782b1608762932c74be32568562444654527db8756f112c911a421f797aa85af160ba7d762819f2d16de4ab9ee41d5bfab18eaf48a577a4fafd056c40ebd2cc299213459506d0044ab3961509f809bd52eee2289ab7416cf22ce02fd20c49653e2669069fa098e17d61d33a74df11b881a678d37bbc79f49fb3518829ae43ba7b1bd6cf4278331f70d315c375ba459c1afdf591891dcec6161b1ae8a3f08cf486a8d5b0b49a09cc925908803003ac0f2bd5ee66dcadea745fb1b688912e10c428c1f81fde301b553b454c3c1ce9a156889e920fa76ef295249c9f144053a111b847fc9886d83704539769ff63e3d8002030068c9b0d5a65a90acd44fc799b6b4a31de302a44b9a762b4b5296e11c04f44e07b888c01d8024a222d9bcb7eed193d30128efb37438d7a90a9732ccc590b25406ea57d074bffe1670efbc48c78c38c7b1500a78cd75a5991d5327cd919e7564a5efdad022d9c508f2992cd3953556534d8abffe377565d7f2cd5f503c169dfcac534bed7d8344fc2b2f25295692e7869e03418ca5ff2e46b4771795dc3c1cf36b1aff4a11ef5d2f8d65a099a133abf2601652a6d73fa499c4f824b802c12d8e1159e11f4613d61d430a6d6bac977b9e97b4d3cc3dc75ee79e2313be81602489cdd48ed06aff3eb71e0f5b8096050fad9b0450f6eb60b04c003a3adcd70acc3a5c79e3175037991976155c824942c4a2f493a2a391d77aa34d29c4b7b32de9b0e2328c3373301080a7d0bc90930e0f070479c4b1a017e1ff560cb0420f684ed0947c40ba7391c9a49459bc8bf90f98ce5d8e2dae952139ca66d2c723acaa9b9e2cfa55ad1aaea84313b5ab87798b73faf15ff9fe31d6c4ee95bbebf96144bc4fd7a72697dc4b6812573fe7785e5b12cfd10e8f499477769e52b141a1927114d21694c0f4fa61a9cadbd96c90ab418ae6f453f93536490f26cecffbeda662b4d520bb73457991b80a824aa0501eda72dec8dc1c13cd47dd0fc9450bcdaeecdcfb0a58578e04007e2de8480114b24a5304637c20db7c80afa04844e66c27fb1eb4a848fc181fdad4ae5aa9a33a2fbb4d9f621955d3699345c2830a8f5e514a946fcf2c2ffa7f97c154a2bc80e905e43fe57731378af169c8553c6e952e02e21d23dab29e051a3eb6ffa7d8456a186049e7ce9b9f760a1c0426dcbddd69973d55e900064b83e995ea9114c4feee05f44c812f3391b8f14f05f241a67cd358cfc243adb56d01c3dba7e6584f331129cce22dc2603432be59c9c7c666efa8a9c4dc4c9f1958341b2313f652156f86036c9e4a4160de4ac5114e92acf0fbd91ad0c627e901b638a1ff6dbec3ca05c24c363e658dee4e9b3364f53e49c59f60c15f7adfb5c68890738943204c2ff8c166b14f2a62252bc4310aec07e0429e6231799a017ad793cf6e1e0af1e796adbaa457c10cdfe19d05c03bad6b211a9b9176b72b09cf2cc28bca2b7f28933f5068eb30da1afa49f36c8777498e001340e0848b3002266006d226d355fd11dd9bd8c04b1834ac8abbeabf24b0401de578dafc84166559666443683156835444c32a7b3d75ee4da6177c00f52e81884d5dd1a55464c38b9ac0da46a5a48109b617f65d95c0d0a76c0268e26ff6976768b256a12d2506320e18e222493ba20c4727712aa84fef939e01f4a9a9f80ccf328b007388a1357a3417f68999dbbd7c8924a29fc94d9b0b0ac25c858e88b623e783c2878742718f4dbff296c1fa8ca350b22502a8dad1eed5d1868c0947369fa3a4425cf2d49a28c5676d05ac33fdfb6711aedf57a7d0c5769301d4c87862bf10a3f0eb43fb8da2096eb4020a599e9a8752214b12b7bef52317b6e368da43786b62343fb401f29710c8f8ea3e5cdb3769464d6e4a6c3261e1df2d8c2ac9171fea184340e6652f3f12f654435b52cf98e562760a012b177f539084f9b6cff9e690a0dd31b8b56b83c67175492d2ac9247532c619e8ae9c1063d0c0644d593c3a5cea15f458a1fa5a897c31cb47e5311ff7d15f8cd40472d7f78f1b9baae4cbfcd02e1afc12c83bd665f4ca898584bdc73285aaa2a1aae2a4c7d554157d908bd5ab5ba2271b5c40e3df2548aed39b651dd198735315b0a166d234201bc718ad6748b5d1541b8c61f06ee2fd7df38d65f0e97b32e790b48e9199d59af0cace481d1b7d47136a8d04a1c6758696405b6be2d50d7980f752e91d8cb9a53d4e069369f4d34e9a8ef5c326f483ba5ee4ed41261c8657408b9537b045760ee81aff027c0a845760037e9186b5a047ff92c79042793be1154d877f9a54ec85a78e2165da84bb9959d074773061d2ebd7aa0d58ffaf8208fdd240e2d0487486a59a40add747d697150bbcca41bf12aa6497af52971a8b005da5d60738a9f179670929589733add5684485ea15a34a7fb10f1fbd54a31f699f6ad2a874430d9c1479e4680f28dd383b7a5d97f8a5a39969fc1ebe4af9f9ae4bd489c316cefc8df05ead1bfc43762dbb7af18e04029b00e9e25e442e737623704e6ae31fd4d6bf749c06a99cc87dc8792d221e7cc3b23c4905934945b94e021be63964032d732252582224cb5191ce0e95afc1f633935831424d4a3b742b9e40ee74482fb526ea42c46db5fd47fd45ef37dd77435fb5768c3c6f405ec0f1656cd845e2dd5452ea2e9260b024e8e245ba9f83a351abae2b98ae13d9bc1c3b5e349951dbeebeab85bca77b901854ecd94586307f7580ccebb3851329e9cc097808789bbb491def95eeb33c05da1245f2317e455b51f2eb18fa513c650124738ccb02e81807e861e3a30950413865ff496c45289c5b97be36141bb0330b2e193d55063bd86549fbc796d96f5d7aa21f8f3b8f9d7eb63c9655172d63bf6274ccc7f244ecdb65e7638938656ff2bce007a778c554a00f11013447f00c73c21f3fba4ec714d806c568861d883088ca424273fc27f026a980a80ce61d8cbaca2df5f889de65d345b885543b943187b3e97e6a036bbddeb6864e6c156718ac744d036792265d952d6f18e1ce4c68dca4fad96867401e4e82528ad9a12305ae44a4d4e4d43287448b5679af9b0a98bf8d7698b58e0ea0381662451a64a7d4a3a91359d44cfbf62431ac4d1d5c5220fbe0ed6a9a3cf054a3179f469cecfcf051aa86c0dc6e688612b4146689ac1fc3f0c5b01b94a1327d1c493dd39e7213e5f41e2a7191de878688b16fe1bf8d518d6f7c8a5ed99823417b1a04712e9a7ae8384cd45d278f633c3b2b08cc2248b38d4263734224f157264b393e7fcaba027e1e840d96636bdc2fab2c33190dd14a48540003caf31b7fa3d3b269765ab6be4168c9ca529da6c8aa41a3f8a8645b31e3484c1495313ffa51fc60d18e487fe87737676d6048060d4d24a3b58e64149c24632b0f21b14a4a4125d2f08fe301a090651c974996889c32abeff7017df5dee40b406be55ac73ac942a6330da723223aff72ae96364f1e40bf169bafe50517c536b0b7b3947f0aa1a74ba36c20b1cd44618f455310ce5e461802d1f1d7ba893c2b5b19633cf9466addf3103826e48f11b3583ef10f9a9fbd645b545f1df79e2a694c369eeb907cab8427909e773819b21f118bb2dc78edb9e89aeeed102fb950d6fb2debd880e765c5c7d4b19bc8ccb459a9ab5bfc04aefd7bfdef826f950dd748e99f54588dbab10dd99960fb40a64884cde16560811f045e370a2d7ddb2e41ad35e34822e5caf04b6f2d5e01c887e58c9d32e144d51cbd3cf1d1877e7c3e3b40be8c9ad1ab8a29c1171e29914fc20e425c81e51353ca1e58937829a686df3cc841fe0721ccbee78a3e7a2ca794f959931c56a8a6bcfbb0b035804d7c3555746d9cb4a617e81a98302d211c1ba3f5552bf671605c1a3caade16683fc4a6cf6b50dd94427fb666edf11ae7b04a8c43c67c4a251f506ffcd54d9fefe5f63f5b175009ce0c0856ad39797f9fed8c253b2727dc7723fd84e5cf55bd9744f32dfca776abde03bb0d2fa6db2ddc1e986a3ced7ee792ea8b68e5ed09469f0e1568edbccca6c7358fb450749e38c6f2f0a42581d65a02fda2ed923cbbc94152c5d658018c6ffecbcb92cacb66267da468d2f4e25fc6d3ff4e87d82c6db9be401cccaf22ade27f9fbbe114d8d56675f342222c2d82c57e5d6a8bb9b354cd89ceb409102cac53db3d2e80d74e5260e2352d993caaf78a1606835a0959c6415489cd8dfc4bb2ab29d54fcf0ac1b6596c4c1cd352e647b3fad588a415ec4e6b7c11216e1634e61b29a2e7aad574e68488a0c238a86acfb9d4e3651873ce9f91fed3ed08f5c60846d5875ab0bf98bbf2836f419d299c012def7f2be26721d9522230420927ea6bd7f0b9648e0509cb214bcba4be33cf5b4c29c27cc6631e606f725987e200f9cfda80e570fb61b86a753c6e2bb8ca496c3a71ccf86dd927d57afb30fdd3b260d56c19f92230eae1f3a1437fb9f0fe16975c6bfd94746f7354388d6bc761e7390b194112219821e53caa806c50843c8c35639ddd6c9831fa3f0ea7b00c0a38e870e3e6bd4633b306791897db6b65a0648d77c68ab059d821bf4a77f93f6ceacfba692daa7c5169de9a40f9ed123b253886b177cf4e13b43118cefdfeda99643de0a6166e02d2fe707e1dfaf7ea6fd662a28ce79c58104dc4475f53d11f24ed18a65dab13698422e7f67c5c2f3d40c5f29424c9c782055154484e1f301556c226d1b991ebeb9b46e86e4b63e41589c0cc92b6257a4fe22975273c3f634a31fcadb6f38d123545be82cf756aa8b845f54a64e248e0e5510a5dc3e051f09a6bac04d20ce6f081877a1a00df4b8f516002c0f46bbde37dee338d1523aef9fbbc70c4162db6232a6af6e50d364c61f7d5c4e2fe2b56ed3adb91fe35e704567a2746e6a3e94dcc906ce14c952dd6cf0978081a6c2d2f89e17f4e183242db7131bb6467975dbc255cbfc4a0db5639022ee48339313b9708f89ad2e7bd9d3c2696eac9d4d9f690361e902fcaed9060d85d23be5db2bea937ffa6924b804857c0367ae8634c147b6883cbbbf95aa4f81ca4874bb5df02d8428ce090ec13d30ea5f0a0e687aed2a271034bea2ab622465905cb29a07c5e4c48ba6b27201b25adbeb149548d577c633e7247a3b401a53855cb87b15adc63a89fceb78f544322dbfc9a35da5464cbe838bdd9e3a69c4212282400c252fdd7d1293a9668286c4d9af9672f7b206be6c5046abf2eb6ac8a390991a41eedf4f84ff4d933f68aa40e0654c8cd43520b02f803268742b09876af493508c821b63844144466b4f16ed348feb651bf28afbab0d6b77e1bf8ef7fe0c2a1e92459b1b285c544d1a731b94fbdc0a17777bf20610446ca10d7732deecddc7bd71b4d6ef99e8598dbeab563e9bd1a94c64a576b9016032a1ee4fdbf61ca9652e76acf37cd7db8ecae525af53fb70c74fc692f9d72c4975e2547165e34ddf7caa65e73171c2f4c2d7bd70de576197da2fe41f49a776f2fe37fbd239304acb1c8414df096d047ec407ca6dd325113bbd716b73498f9a80d82e16c97a5d75a2faf52e92521997e4aad5a82352f178cdf456c657d8bf720c128e784e414e8093aba737ab9db9f220fcd70a92324decadd50c7e2cd4ab5850335468af1e3f3c7bd20040ed6d28514fb6f9a5b8c8f70653e36a353dac8426b5ce01a78618dd60bce88fe10492dadcd3100dc0c60a81c7debed7d8f3467783c8bd1facc446ad67c05153010d3a946f23702eb4ed372223f02daf7b8fed6cf60d3eb9aa7f6c00c71c7669692450fc4cfe4896bde89e188e0062e1e2328484deab95906c8c58ebad6c2fc6aacc62f5d4f1f72e7b3598cd2d67670b659de8ddc2bb4b0b8ec8fdb9300b526dc0c81781421d6cb4bc0994d0e0dfbb0bb94b1013e66118a416a403b5e4daedb1032c91f31945b946191f30f164e798ee48c605fd3667e1e471f57ac1e7c0811d9af093497eb55bbbcd9ed599598dea1dbcac5e2e6a0202ebe206572e7949b88b3362ea6c183d10b650891c5bcbb2b16a01bc1e4d32b42282e572c8064140beae57da7c6ea4dab9037e3b13a582f247f6ad54aa7a6e5c399ad9294e01c4c4b432a4a0cd06c66c996567d861656cfd905f1e7e973bad6e401186219b74a36a8e9f2266e6e650e60bb7a3735b316bee51a1386e10f471bd974ab8ee57abf65fe2ca264550a6d731f3874fb2df3204bc9411a18663e725cf6ca14efd7ced544f7c17d95e62dd2839a86ea12d7016cf600641484a5e8a938389e652b2a7c6298cc9b16ac66a5d234e5fb3242edf0b373304ff3ed5ae3e04d22fb09a6f0e2a78a5f16bcc6806f4b538eb9ed07fdb2fcd20769e2e58379ede0f31f5fc27a09ac41f0647f4a5e2b081df350ec53b10756485b9e36d34f7c666c36e834d358ad9444093c41a260b8329b1c1fc3c9135238f7102f303b17302814859c3649ace912c93e0004b8ed4f4777cbcae13f21423fa2c0f27d677305195ca47d26ac4d45ef0f51225ac41e1f7a4bfd59ea6b021c4efaf7fee7b6ec6d2abb71f17e3a5ba3134db237c28b3273658e1de0d193d55af51f94c089cf725c4341bf9f4bb19fe08b10bf2ee90cde3ae55538da262472db607f0782800f28cf4490c9e5b25a78c73b39163aa32eeadf7ab2860c99f0d5831c8240df9c9f318701e6ca3735331b8eb51f4aa206e579a937a356ad79f9d18fb101ac65fcd4026b79115d179447cb22ba265cc2786b8c3c4af347ac7ce639750501093133ec4b074def9d0a06e74686e7ab7967bde6c0867b99da9d04d830ba68457bbc13bd7a71bbb5c86c73a6811b6294a0465bc458032fd2ff12b84a948d507bac86f5f07a9265279def70db86aae515a83e55850a6a93f0d8a0346ddb3557c9787ef804d799010c5b69bd13f6ae9e51f18dc57b73079065e43dbfc279e259da29a3563915125e6e0b0a5d4507fe48cacc32776c194bb5d556b16ef3d13aff925c5cdd8887c3e3946c2e02b292fb71f5fac7722a5dbf6e1ef885701094d61a241d4e47bf368dadcf21af0f900329fb2b78780e84fa14991becf35b24d0c458e5dd3f05717fa27fec95feff3016d5d7fdcd99943a772d6d118dbed6275e2bdd5d26cceda99e3daa450946937d098715b8518e40d90e508995149a755c3914199ebd257f214900d3bf9715e44ade9f07f436b113d14de642fd21f6e3a1fb4921c98ff0c5dee81bafb4bf7fcc84f937c93c51a6017da1fe9050a0acdb10e9b2be39bf1b14ad4b83ccb780dbbecf583114387d6ae5fbb1017deb849e85fa40e6c73371993fe18bd511b70169f9b9a355ccbdd8df0ee8db27f426d40fd23f9289cafc085fac47dc08488be72663c5691896cad826c1833d7210bcec649a268bdbbea04c0f004aeb04cd292270b2c043077607f6cda8a1b39c80997b5e07ababa65dbde77f3ebf841fb11ad9831bf52656a5e469d44c71e663d4d0a14f9983566672e01a346dd2f16e51ad7e8a1abfaad66c9a99512031a3834e3ca7a195f2133d11182d191d7470231df428fcc193f0a4dd74d0fedea2f6c534d3e7d1bed2e786db0876d0163d4ddae359ef17bf4feea06d4507dd414f7a0d8007bef00ed4f9de7b57e9516088703031de06972fe5f2ebe2c60f83fbab6c2a7a1539598e41b84aa5abf0949211e8217e80a43f0828f2719371550e0be26c621140b7d5fcfb5f047c8de3933d007a208e2a064b83cad7e900f65493a47641e64f51c30b4599f3b8027d40e8b55d45b791b6de977cb471749fc2a6772b3ad57a433d61c5557fd424d456a20f043a742c154e03300590c3469fb9dd674dda82c6f3aaeb97be369c794d2c640cea95e2dee7f0dd265cb341bd2bd8808a309ea0d5e8849dcc2f4132dc78f45e818f00816c632564f5a7591b9b3807945ddb980c3348743927cb182388100ae4fc02d3cde4884cc582209a68308c45723e29b8b1b6ac505f12ffd65863d34a5e4c371ec141006c8854a1c6adb13bbc50f3378ca368148ddf612443afd0f4c6ab1c3a4aaee30b959d557ce3ea65fcb92718743159ddb79858b436b795051609b01fddf3994edf906f3014f3052fc69459bd58cef09da5c404f9556cec0cbde0728595ecd79a16d4b7793971acf473bfb1aea8c87dec1c841112000c7a6706dbf1f439d1465dbe5d45c4c279a8e0d222f9300b8f05e73a106937d4d5eb5bd93c2c38272a3497cfe03f0fc8e25bc8610450df3ad785dc438d7516340967eaf3360e7147547c94dfdbb6f7c8fff1e0313361570c48d72ae087139708c237efae4c5274d5145a353c68ec75f0bbaa4df9b4d0a444408053a7fd051e09fd3810d36cb7253f75866b84d1d4f890ebe58830c4d31454653f9e19c1fa8c8486a8a397991160112feafc598189691759f4eafa2ec9b517ab13568fe61ab77870b6a28fd5606391daf45841cf5eea6107d6d8d7602a44de2c4280b0294c1c5032cc306d0e95cdb58fb71e4d82dd9fb42d3a102b309cac960564e217e86f4bc3bd7161d4aa60ce18d4b9e7a85c3dca3249c455816a6e6004f14d0f5513d324cb16c2ccff513ee96d730c9952a24e80fc0f8f673262acd6aac7e2050c4cc005d14eb7ace9f8526b995eaaa8b2a8255f4adcc3e5cfecc25ca221fab6f6c12b2445a6796a1af5aa6fb400902fde3b109d798509a10db794d628c216542f570b4b03395518bfe19c0546c777d85565d1ef5ddd7d1ab6c1ec1a09072ed38aa5e9a250863ae3b0f772faef2f75f3c9b85ca3116a168e99072576d8d4e3f7af13ca1c67e7e5b2d192976e25914e6a3f2575da5cb516b6deee59b84e0d424e32bbd7f11cccde616be12e184de75524e210bdfc1c13b14354b9a40fa7debf0efd0159814ba50cf1c98cfb1073404bec43c999fe2021ef15b7a91fe71bd127567b4053e0b26265d7742608349a6ed7cce47eeceb7a66f661a6db3c73722ed538b66e23949c89106d0b6167ddb661cf448bbc7569566b0c035ba9df555a81cbceae8e2459fab52604cdadcf4d2ea9de95fedcb3d5c6e4cdaacd5f2d55a53189d8c00eb6ad6aed24d1f99b42a6929378f3bc8a68893e522fa37b42fe36563b472d38c6c36d019d96a19cd69d3f6fbbc945cf1d6b6d581e87c7243bccafe462863ad7adc974334e1bf9fa7434a216d9a5f7de3ec69de9e69a6f34c7a4a996e10522d78988eac4dedc9a87e865794c12746414dc6585569d04a8d700793866e9f8e87c6b1622dbb97fefcebef72cf7bcf6177fd379295e779237d517be353b96999e1f0dd006e0d6e5e84a169e8b5b0a4e5fbcdb9709d8d2ba3ecb256848adf79f0f1a83b3f652d18d52a22ce7418cf3a925a5eda3e7729ba815cd9cad3d1ae24d60e91eff38891208e181b877e2951c815d3997d02f37a6adbe36364357c71d433ae4ca42bdc87b91b60bdefaa11f470a77af35d42ae2000952d2262633452aca5b727f55eeada6d5f34afafc35ae5c298e8bd4f29b92fd7bff39f368e3ca1227f944afe1aa8005c62c2f149116eb28b58ba7eb4fcbaec6376619bca3d7604dcc2088e257e1cbe55dd54640403cc3963fcf7a4f1d408ff1702262a82a94c8d258e40903ef1328b182faa11badca20e70250e49d7107b92d58c994ea6b8bcf0b0e7a1f8ab65c242acec4b1d25c92f7348c2f3be680a4233802c0f1127cfd469902d0a23faf7c6ea1bcc145c273018704269957bfd5ec6db0f2669edab7bbd9aec174efcf423c6db2811289a8f994d6a823e0bfa70710ea01d5ef65f012a6a28ab3b4cf1c27e95a5d2d7082535eaf0e36e3ba155e7a556b4692279ec0f15608dcd017c1d2ad5ab23359e3dfdbd68f3aef3adb0449d29b63f84dcc09015950bd56312d8ec772e1ed2109ecf443abf95bab7755e0c644174c90d6db240691cc3a1797256e5b4c5c986c51a7d543ad67cb7b7cc68c7a63f362e2729bfacf7347144efec4a09ba89f6330ab270aa78bce1b8a4ba29f914610e27f1ef0477345dac12e5ac84b0701a4ce221824fc42b72bf79c3d23352dca429e09e447e68ee96e32cf912c937369aa4f06eb4d83bf88b6146e5c81e6df3a12758b546029d41a903289eb2b8f575f75da9106256e95725643ce183d5a43cb67b935a6d5c4edaeb3f9fbf041549d2cc82aea1d9e68d661da0add7cbd450857a56263452601f5c43fb7b30f2f6fdba7dedb96934f433a7f09d7eb862697fd66bfa239af5871cf9fdf0a6036914a88dd10d327f8e9c91ee54b1f6817eb68a451085c34ac0d6a0753a45e66c20014740a60a4d2a11c3a67ace67f92333991ea2dea5ab2dd07d777a70c588d8efc0e8b037c5ddc6b43b85c04acf254f092bcbcce41f8e4f19f8d1234370432bb4c1b7b0e73e090093923e09710df084a980eecf6dcad24b64d0dab675f4b97203ed601a51a9a781e3239f209fb8bf3e2a8783a964bd4205bfadc2e061806380f03434bd0ef22ab5ae71c7054588fff6206c27d5e3bd9229571bda0d324c3e20f24a4bb4e2a8b1a92c17772597e2065ab7329f864a26a07db71c436e912cee02ac9edcab7237e0494013533a1f9b23bcbbd999e8abc7dc7e0fc3c3f3daa2f4aca423e9eca38ad1644273fd6e2f6ceeeeb53c41d9611d9da7fce35816611cbd3088d0e854db8befbd8509db69532947da1276c69930f041a2c46ac673d1a047e6db11e52f42738593cca1a716f3c8c8bd8609313308c78919e52c08e6a5d8b887d80e366f2e00cee99e81fc0ef4c2852562a5b9a576252670d6f1908702d98f00153d17daf4ecce1641692561d52bc64236f21f51ff1d223250a39322411a687decd1736afb9be8c152e4e3396db5695c6e924c758f0299f0d7b2b52c90796a4b14d69d0b786a45a2a3d2c0347d93c62f34820c97b1e065ec0c2c9d1f52bb511387e9742d673cecb03e0882fce73104e6325febcb4d49b0c9cc959793c7c3e3202c82318bd6edd657e18f88d4421b7f673b20b62ad031ed17c43a80b6b1d5d3035bcb1e97079250730e6bc2e37017f86e5ec4fcda6548f574a029ed67094d412771a24b225281e828dc0628d90b932d35d4893c957b8cf06431aa5b9ded2908e18cb7f0d2bf61d8c521d1bbac1a5aa172de8c77ed5ab3058b7c0cb8773fceddb5baa9f3a6c937c9f6d3f910e46f6f54418d6ff57f782f912c09e70d9cc58c0cacfd763e50806f5570b129cedf4106c6c2cf43bfe485ce3c22cf642e8b80835c429a7347aee71efa9caf548db7303e065894dd10dcfb88f5471cd6008aed0a20f18c88a23d67ab0e610d404aa5efaa63d5454b08ff9f67f568043167b933a3fbde974e5ff1e0fca806b3a1d227b3b81fdef5dfca26a49b7138fbe116d3a02c1f0d849e04a71a3df7db10c00dabee72e65f2516770fbb2f8d39e8280becea6b18f379e92721c710087947361a0d504619245e21d5a846eae856123b9afad4fba372991737ef04a65c590207eb6fa981e97ee222d4d4e25c2810779f800f862b1bbcc85dc4d746c6c1aece6c45c47dabfbe11d4d8fdfe3a65bea2fbf91b88e2f4e8d154cbf08983c6d511cb18051be67143270a8e540a89c94e56cb107d0a436a840298fef40166943314827c6ce0f0ed531e897f116ae7221505c6446e75d66827c3330297c7b5e1068ffe299d06b5868b4bf56102d62e87142a9f7dd21d6650fbbc563f0894fa6997d0f9778a6285f601bd71d61a708ae6e1cfd9affee83a426779b89b909c8f9227d256d3c22a4824f1dae50d7163bece5e37ed323f0faf91e2af694ec6b2d81d7f8b872cb5f7ff73515ae88283ea8bb451bbd7685417a7a0ff19856a1fcb4d36231ea2403064c0e756d3915d1d9a2012b8cb8b66096d7566643768f949823a1d5306ead83bfab27baa73b4336ef22818c190b85af2cc9d663e743438862c0427309c79bb5a696404929d7f385833b4788708b6476a6ca0710405cdcee9d6cf56e723150da8304c6adf030482f42b21591a7389419d7f8dbf3db85567f61f221aa9b2250f6219f892104dc549d8beafd5d9e5b5d5b1973d6b377a23d45e650b5cc22d59ae0a1a328893df3b92d0928510a42cacd924075dbc4552d0f3f19e5e5bae97beb757a45d09e88f951981fc8bd7ebe1da96ee18c01892137132e75bbd83d8e03db828dc2522c53b632304ecd68a3851364dbe011b05fa836b17a7891db89b9854936c246b15ac23eee028e04af203c2b07751936f1bd104e6bb56596cd1475d925878cf64c1208055a3ac82a27ad54409b2cfab04fb7f1324f57e4f3eb44c2c6b097a0b7cd9596a9cd1785a04a98e3397a627eb4fb613cd61f53b2d57a34c87af70135d4b28c6141f5259af12e72679a60a7ed2c7ae75cafe958a4cbe4b388cfaaefab8bdc7d1a812f1ac11a0ec77f62635094dc29161456d7285cb4685e39c11eeaa113a73551bfd0a0d591256ed0ac74d77ca8d2f75064f4056c78acca6275e234ad83918693d7822cd9296a7622b2c05d1376555ec2b2ea685e5c4a548007a6efb0a233b5b475fa6b045165ee3ae6ef4fa77b79ad465d6229e9e532c4b2f8a182a4e47965583e45a81994cff154cb5d2ed883b94f251fca1f5c369576d50ebabfce6813480af9d298249124310a2533864e219ec121fa5d729dd94693773255c0c9dfdcb5b6d6ed504844e7e9e082d57ae2cbdf5c4cfeacd07d15bcca153d27b5d2197b9ba4f5c0f865219eacc24812e32e4e6f9cb1c281673407c2dfc5d63da29ab66df81fa4adb6fe8c25e3eb8a6629625268f2cb98ff4f2cb3481f421efc86f9fd86234597c1832fb8a2199b329a50a0a088d4afcf27154e43947165cca8d4ac041e993a5658b2db11be8709cae3da39afcffb7a486b9aa7795de2bb756f7acaade935b574f57f6aed463e566757a9ebc0cb9c66286c655dae830a03cf01b9080cf06d1063de0db0b783905f3ba939c86c2b15471c0d360df0d42467878f1a035965dff3d29af1d4ec15277c582a6a7c16ee20e0c6206648ee1f78603973f8f6dbd1c474b88b9bc0908cbd86d4310ef5ad8df775be13fb7c5afc1187ab6b267a5de2bb7abd3eb244b0fd54e52f2fd6b358173feab53feff07f1e712898eca80ec8a7d004ad38e200c9a73d939a96d943ca2d0b71587a8e66eadcfdaafddd620a6ff16d96b783e582cadada7977ddaca091de85b00d5f3ac4e0e5df89c9ad34891ae1b5229e9f5bb9a83bf643ae07945f59ccae6b7bf94a40ac129be2062a0cd7812bbd7f19184a673ebeaed95bd2bb4e591700484b9033a34dba257205e554d07a9de84bde500e1b5cf69f6f36bc3d2bb0dda4b59ba8f6bf2be6222ae19e9b19fef323818187effb0010f580ce2fe47595234d501d25276537f70abf41ddc5fe5227e76428f69a3c96e7befbda5dc52ca24655e0ad109930a27ef9ff2a6b0888b37428719d79ee303a85cc87acb27c6d06477d3b3a1bc81644d986cc2ae3f952059b3c655b5068a5dff4616f2e83aac227c56ed7f112ed696af468b7202fc455cdcc2bab51e5606fbe7d78395c146f1b00fea12fe6dd370386b5cacda3c42069dd5964f14156d27fdc5182b291ac3925a71cdb3cc86deadb5b6c8575722615fed3b241c55e471ea4c0fc98eafb8af454ededf14ba76c2fb2474d7ef5a74328cb2ebc818a90410f49afa25504a16f85216e55ce4aafa79fb48ef42dbf76d4ce049f282fd54942557c882621f69abf1d5e83947c659b43d77d533ac6a1618d583eeed75d0bd7121c7d8f2892b926cf9f9a851d525647fd38f13d6a284a25da78ee9b1a6c77cf5789aaef35445a70ead785bacc77cda96fb1c8e748f5e73835dbf148efec4aedfc27b6ee6c8c0c8d0c493f8d44155b7f62494618514b09927aec8d9f20932d86c185b3e418623ae933f4431ffa154a766d7aff3888b559ced710a8956d3e6115f594dc47790d2acf155e9eb4f97aff2d7ef36d2931ebf168e559bb408196e6f5b2ed6d26f61e9c1d2cb9d212ed692769d1c3a9227e471dae868abefebcf6ac4be75f72069d257a40f32649c3d90b4bc61109bc376180c82df3ee9e5d783f45a10fb5b11da6bdbdff0b9e5d6e3b4e158a58b362c02d5e3eb00d1fe5eee1bead9c2281717ebd71a56c8aee3ac1d8a5aadd6113dbe92b02535d55fbb1625d93a0eb4470f62d9fa57b3305f8d5ea3238de48c68fef8aa76010563c3c5fade1432c31ee75019f6c8b261eceba8db1651c4bedc759f8446c838a107b019273c39e3dd5a3b8c3f1cddcfcf7bfaf590b0ede9093461618e587624bed25e739dd17b76c5628feeb3abc36416628041098c80e0e33ac38c5502abc2114ac0c1194480c58c7d29ed6369df7e382ce79f0edf434c34ec1bb246fd93b0450a4968d56812430579749d1ffc8ba0ec9fa03c7d145d64968027c80433467815a830ebc1ccc9535dc4086d892bc2e0737100051682668a1881f2464c255dd0c9994179f9fd401ff5c3e953feb4628499934fd1455ce82230509831425a61c50c8a76427b23749839d14e5c3c8196a076a078c0f484592000443161b5861579749d1353286786f8ca6a14105b02ce53df5ff55da7beefd407f2295fb0c2ea804e43367190e7cf3d452759baee9b38bc97beca726aff92a501112f10ca9a4452551fa5626db7a462043d9b6e998423c6b0c7d9c4c7f8ed1f13a5be74d2e2353d8a5bfb5458c4091ca9f7b0c89cf1ef6a6de2e6edcf1f1fe9a51495d3fb0d504a985d44a9e81cbe555252885aadd6114d6c30675ee3f2958bd9aeef368ee32c3a535fe594328178826c62be1aa7cf5c527f0ad59f43beaa55ec9a929292e2b3eb4fa24a65362aa7d34485934938653398e4711201edfa7389afee5759002464f9f21b624e22674d1ecaf2c72a7ac4f9a4c79ca24320b2467d18a1cfac6eb25314d3af84e1cbef4708239c335d178692aabae71e462867ba2660fc0d0fc395efa617862b2f3f207c06c6039131d6c58f315052ae84d1de85f628daa7dca0375c0b4bef221c63a0c0e02d435338d693b096b43c51d6b442aaea77e1c7b0b3d8f54797779944bf8550960674d003263e60c2092220c10c0f5194018a190bb0701161a63e90fa41d4ff304638657416b9581f0ca7d19cb9589f14ce2317ebc3a8bf124aaafabc1be922e739bb7e0240908bf83b61dfff3fe081d4233167521a3593e79e45b3fa93a86a0ea46ea86d237216a8336546be6af991a33a829a3d7acdaeeedab53aceaebf5d0da6be0d5f55a35d1f480682788c89be9b44f54ea2fb44f709b043747f0bed6b21d6d610812692dc2d3fabb1f39c1c650a093ba1b03c0961049dbb3dfaa4906b54384ca342892b0cdb1f9f6ca9c44505245838c1a20a7c63070fa73f795b2a7145b1c753d0b5c2fdce5601561005212871c4073f2b8040139858c30c9a18418934f07c4558a957845b2a71e960735b2a7121215121b7d852091250c049b2b7a512249ef08094202184ee95495b2a412207dd0d9420a18331ce39ab60ec6513ce4e38e2828ad74908372851c452d690c404a6298a5cac4106253881020e8a1a5a481164a2020d4aad13294890a398b5f83101282b61971bc0808433f6b250c66a3041ce2785175561172f7838632f935c701368d0b9c0b8bcc07cd8a5090e67ec654feb88c2cb73c1694842677381717981e9b40e219bee680d2e1c84c31d5d71e442613bca828d1614c32ef88917581718971798285c51d85cecc2838a33f6b2968f5c8043a748e22a39450fce4749280105181ad24002a1181ac06023850d55c9cf1ec69bb33c01d6a00ce00872aa0aa39cb77c024809290654844d0cb9dbf209a01e2400099c185b3ea164083f1cdef524e6afeef92b90f1b43950827ae4be7b9a83fbcf7b4e88d3f63a8e9b61e5a8873710aa9a6f61604491659fb2ee6c51d6b6851387407c08a1aa29f3297fb60d1b2f2f26534a3e0d67d1f082a01a104550167e1c1611024155f3b57047105435bffa848111294b44808bd3dfc31d54350940001d7450a942a99a5233027b378585c15c70a021d3582c280808e874ba9acb180c8c28fa9837a8cbcc5435352b65cc748a5dbc57208285082dc4c9355b596c9986ddd1d92a028b2db3d8e1a2dc5074724b3d0691c2449e4f85384920d4256f5929a58e5d14320322f311a3e105b1aa4f8120da11546bad152360627c3a7d8c9425f234a9604ea7d56a176f5ce77d2430975a9c98505ca478dcfbd536cc692128a62c672927cf815095ff88da9ef18d8cf3090865097195ffd4395060d24e5a944e2a3e8008913f36a429355bceca3424eb867743a96690f4799dca0e2082905f048c8825976947b78cf588f17d49b53f1120eb0053f9561a3fdce1425cac5bc80bb15508cde15b484e165224a4a8a80825a468daa8fca0e32197b0a51ee2db83a837432224d11e2bee6c14aa7c97da75d461d5e79c1f546fb8c0504a5fac5567507311cbf329a594661f749df49544c2a6528f791cb5701c626938527983cad02b8ac7d4b6dd74d3afbaf329b68cc21e51d24589852db7b0bb8a51d245cd1ac1adb576eb3eb0721e296770dace729b66adb5d4c5923e3bbdce4a95d556d36abdf62fa5bace3944915d6be54c9f0beb75d52ec15501a6d8ca6d5e37e97c205e77af94dcc5f4b78a3f1c76895c5d74593ab9f0bccd8587f2d1e4ade96ae485d76115cfc599a21f8e1419641cb4624d7bcac34acddafbe1a83db08b73beb0565f7fc105f7dc8d8c75d4d6a3d5da7008ba6d37b56a37dc7d1ed802c56b91624b19f4c0539db67317ff8b847d8fb0618c613736bdef85dbffbe1be542100b217d3cf2a6ba9ebe0f4735c02cd7ef932e7ae7422516748306f190448dbfee2379dce98527a50fa93dabf4b2ea944217a9aa9f432931d6e30d307c92e8e2e30bb377fa7a5f56fbd3725f0a0d32d76df785a769f24ba141a63f7150ec52b4af75007f3cb44dbfdbe474d2d5d31ab1298e8a92d3057b4a12b7ab532627415190efdbf0facadfd62b52969458c67cfbfe29cb180c733fac3d9d13a57da81ff6b7f72153d545e1e748bffd0fdf73fa03dc7fbf691fdba37e784ea3f0772f673eac513fb8f7fe876d7b4f7fc0091fbadffe03de732f67482f67a8cbc58f1472a19cd930555d7ac4c5fbf8be1cc9f4475a339fda683fe8244b2f21df9f0b8b71700fc6c1381807f76cfb14a57a3c5c78377dddd86cb1fff2763c249ecbabf16094e51d89e504793740b78a6dbf44833ce2199ee12367e1f03a9038ebc6a8cafe8c1f6b121b7eac3d37fc587d36e9ab8eafc4277d5d42ca5c23961f2b139bf43547c6c878d2d796b3ee4e75d9ec1cf9eab390321708080d3319a3879c755d2e264d8c62be0aa120652e122452109231315eced26432980c4816d4e3ab140fa4ccada9f1018f8c81f1a4a737ced28080680e1012a0249bb4f2a4a72690321a132614059bf4f4888c4115394bdb99b59af8ead40529a3fdfc7c4126635e2c7196e6121a22a92c41ca684890781336e9fd47c6a43ce97dc7595626731e99bf48a627bdcb40ca68354e834d7ad791312e9ef45ee32c0b04e44780fc06286793509ef4330d52c632992d769c4732e6e449766747b653446a310529637f7ea8109331251f6759d7cf12d24fd2cf1f48198b64b6582441d8a49f3d32263fe9278eb3aa4c47b643e254b0493f5320656ccd10675520aab28f8f6af6112662d8a4d78094a94ca68d8c019ff4427c359ff442c8182acb44a4f7e1acba435596f43ca44cfd992df6e58f8df165939e86b3aa8bf43b640c7ed28bbeba4f1a6fd8a497359bf45f48f70c295391b0c898faa4c7cea232aab24f22fd9432b566b6d8273de9533e1c24d8beb16b74838ed9a06f6c86be31166db4edcb289521837f7780eecedf9dbb73a249e1755d24d7f5d7755d17c9b6df22c69792dd1a594a26bb35db7e0986b702c4042805049451dd49dbf9d1764eda8eb6a3fd6cfbe00b4e25f46a34249aeba4b934978664db27a56c2699562333c93e9956b3ed7f2e300a101312900908c83bb92d767e487af474b6ddd9d9f9d9f6bb92e6591792d3a7ad8ba4ad0bc9b6cf65cb5599ada9b22aab325b433758865cf778975420264040404cb6fd8e86f4e746297dd9f9d9d9d9f9f1ef30a5d485a4baaaabba906cfb38ac7fb7d6b57a4ce1f0f150edeeb950db1e9e4c4db87e46f51487b23c187d51564a68ca944e9446b62fb4ed4b9d4b58648f0e6dfbad56ab0b61b20946590ea31a4687281165e23b35c33777766777866f54eef62c1c52db3e8d703271957f3a64948567b4d64c99ee689e72ee8eecd7945733a32ccfe5aaa329e31da1733a651b824e0ddb3ee7b5640dfb252c727d0f86b1941e0ffe2576df201a16a9dedaff2f9cdb0ba914b5f7f04ab1f360daca89d57ef43d7ab06d7ff3bc2d8dcf9b353c6f729e43f8e22a9b5d651fffc8c96313aac78f616af8a4b28625d1c7219c3157591a2617edabc293abecdff0adcbf46c5a9465fa53aab52da5ef1e118b0f11834e6ec9c2324539658db9a76f10c703aa70d1eb7449834e2e57cbd5aa71495fcd9d9db9e3e27c931872d5518df82402062ef7711f1f82bfdce543701ff7e9e9248b17992dfa56f31d4ae9634b1fb6a4f6a8ce9aa22ceb6428ab6c5212431e65d1c7d2ca734b2c7162434b825e60441aee5fc8546aaac779b35d2410494401773924290004c8145d37e7d42530e431b5a5961928812177394090e7cfda244b3ce99c4fe87cbba7e99cf4b9f0c58504790477f000529f176fd408f5b5d00671a1be7699b4fe304e90c7bbdd1fc6c6bddc5f6d765dd77597c3f76fd06b75752a589b4ddfc34ebe9059ab513a7e849e3dfa92d06198208f7e04ec653f02c6369489255f70ed70cb255e6022e917ce99bc49b823a2382e564dd6a0463e248523de14c6913cde8d9f878b7ddaf75e877d4f4b178d6c0fc7ba7df4770fe5e6c221beb7fa37d474b57246b250ce690e5e687afc00d01eb5b73f7db2bf5e34792143bd60cacc955abbda7df572f7f6efbdd5f3bcd7e1efbd91ad85a3bfb6e66dcf19d99abff6a6512f982d2f9a5c948e86d2b195dac065f7debc12e4eeef033b76ecf7fdba4bc975a72ee47c0b2edbd8b9779a3befb84b6baddbb66ddbcf37b2311ef153fb1a36b235df42a5326dcacc6d1f4f99196321f1334ed87f4dd3a81ef7b9d7719fd39c73781b3237d6da6ca1f3ffb7e96ab89a66a5d66d6f434c59dd5b3d02d99d908db56df3ed3365d9dfe4cca6ab8bf757a890effd4d9a8ef1731c0782e0ebf007ebefadf3be6d88dd1efe0eff0dcacd0f67ba54266eb8e7bedbde76dfe9ec62cddb07ad5ded6a57b9af9c1e5f76ad737e1b6903b7ed41d2b76d1b17b2d4aab37cf9be565225751f676f344df33ccff3ba700b39eebd70ecde729d91bd854eb4f1b57f836ad6da25bafa92656efb32005366da1525eeeeb34e8f86f4354ddb368dea317f7b1df3372d5d34b26b38d6b13ebd8fff861bd97588efab03305be8dfa0dacbae7b7ef62574713050d0fbbed07776d1fe8a1479cc3ea8fdec673ffb373c3dbe6cfb9fc7ca9ef7a5f003c38fc9f6de3d6f6e0ff6b1380b943a4bd50b4cfe91c6b6ba033d1289f43ae426e9f1033b9bf4fe46f6178ebf3f4c0ac7efbfcfc8ee382d36b4b5bf41af55027d519f49611436ba6cbba5f7defb46b6a6ddf00155e4ea6f7d0bb3c5f5dc4167bfb394ce70ac45b6bc37d4a81240aa11bafa5d0de5768cf1eb90371c1fc85837be2f3ff9d7c896e110bbada64a8475be5ef2caabbd2c10aced01c2eb059d94524a3987508bd37563b787501e5d27a52a0b65a12c9485b2902c62ccd5059d7459710de7b4b6565baba65dedc89c2f3f6d563be72c62ceb7a1e3e8ba39379085a6d3e93478a83615ed745295210b8b369d343f07ddf35fb6ac9584e23116d9535751aa01cb986b276715b27c2209459bfe6f980bb6252c09182c899bb9e7c78470b68c09b9760e5bc6a818da75d76fbe376db7e9df35ac610d58ec90f2ab5e846e4e774affb6b6e36caa4405355b26614b254ac076579a419e321d58458a8c639beab1d6a927131777f0c995c96d0da1f3e494f24b8091aaa7087e346d87b9c10310be9abb7e066834d9b50eed2abb9aa5e182e744d9e7dec80c0e51f6b73732a3d93811e103a6aafa582f40ce64aa7a39b343dff001d49733302e56ebe2627da1e1e2cb4f1669ecea7509efa7f7d3fbd9a295e54fedf338fbd2c5aba1483f7f7b1449f710f77c7ffcddffa73da7c7d3ecf0f6f5b567d1e6bb46f9ab7a98efb9a3ba779fef6954d77de7de8544e6ee340d175d73e1e69afeb8c99245d341240cd6c959c54fcfee9e7ecc094876f75d8b569e2fbdd2962a5bfe4841d67e7e490d797cfaf8519fee216eea9e1e31eef498455c4ab988c7bfff2ca28ce9c2b9a58c1962166d4ea37a88fbbefd7aa0dfa138917e278a9b233237a769f8903f6eb2f60f5b422a2141cd962f4f3ac9327e449a941287b424a32a7f4e8f63102124d16ef11ba07b3ef723dec0e611ed925e6922d33d72ef72a1392d84a2606cd2aefcb9b6bf8d2cf2f8056dfffc5f4cc674efff0d7d419f90f7ee7de75f0ed96de167e9c7715c083e87834c8de2c1fd7ceea72662f7f7a4c721e9b7f0e3f2b783ed0f92f4a76b0a87d79379324fb6dd23da727f4425b765888213302924f102ca7a1976b9ca5ae33a098b0452490a6a36fddbc45773d36bb4e9d35dbffa3f98c8636d92010c5ce05a8005480528104e404b200210f807c800c2013fac3400860f0c5840ea470c1f340a50e9e1050f3d1270e281daa123070a0e170838c08c69a7dcd8c100a502b4b0211393097002c35a7d030880005e742079a04b0b006ae090038d8dc32af1061b667462063070010b00a900052620810840e0014038e08706f8c08005fcf041a3801e78e891001e3b74e4c0818003ccec1b3b18a0003664620800c35a0de0450001d0c1a505003568e480834abcc186192cf7de7beff59bc347c372ef8c67f9192c7a9cfb6a79ef129670eebb24e80919510c8a1933807010d1bdf7e2f0d15cfdf7f5ddd94952831f9f9e26ee45a243df2caafbe1df9a1ad7113a38362108c396484499d02ad0236a449bd02bf89671838f0f4c08b1202022acacbc6cc0c1c959414f12242d48a56e5e84be630cc160b0a1194646b331d8b85a57a8a814f9e8e8e8f8b004050939c19b38131f8ac2374a4692243c370082bd728082b2a35dae23224092739384c954d322f49d320483c18642264c6456b46645592895887c7474747c1e06fb29c21c125a7204df27317272745cf0e2d981c1f7e1c098cde4111637476acce079465ce81b5c11128a49512423a262db82521f0dc62e9acb4b8d253f365a68c81a1efd2a12c982c1c08f35c9057eac3d16f0f0dd0720ae250b880afc585d14f8b1da4cc07d8804dc9f0e49561111f8913281c08fb4c9037ce57dde00e1305e9235711cf02385fdf023056a80fbecf1c1256bbe18f023cd59c08f14c90f57799f423efc459164cd18cd8f3e53c08fb4d583fb34e2c19748d69cf5f8d18512f0a30ff1709477bfd9f1a337e147c6b8d8912cc7d1f1a3f3e4f8d15f38dcf4ee3d08707faf912c7f1de0473f32f3a3df6c2fbdbbd08d1fe71a5a104996c776f871ca0cf0e32c2a80e77737b2e13e92e533991fe74fcc8f730901fce78bdecc160ae33f7b640c49b2280eebc7a9b3fa71ee0cc0bd7f71da3344b2a80e3fcaa30008c0e5472906192ae45ccb8f5206801f25518df7215934465594863f0f29438d660b7dd58ff207871f6de44043b2e88c871d32a6137fbce186bcddffe2b0c818ed5d466bce6ca1eff7fd4f1f0ea718d017b080f661ca5c2640f4e81b088a2ba0474c013de609e82153e61249408fbe8ba0ac0b8b801e3104346cd37f809cdd4c993b04841e9dea3800e7079c06e0f44c99ebe343cfa6b7c580d7025e3f5e4253e6e6f8108a51964644135340ac073d8da68c76c4831e5d83f598b304cc198f39bb9932dad08e9b4d351d1d38397070e0f44c19cd07013d2fcad25a0778cdbcf64b68ca683937f4e8f43d46599688aa7688192056003d9eb6d194b136b4d1a696de4c196b69cf94b1323e8bf119017c0673c3d22b3d00fdd2b3a96dd99cd912a3ac4a448da64c3d9a2df405a0c753005e3abc5c748b1e4f19007acc356234f48cb22a0c67cad4a1d922a3acaa933365aacf6ca19f039de1a0672a3d13f5e837e8f1946dd06396b1e89c20265386ce828282e88c4918866118861ea23e1a1d862caf9f4587e1876118a4c3b9c320213a734213264351d033b0b0e8798930c64432feffff3f0cc30fc37ff1d184ff323e7c19e1ffff7f1219e1dc9f84e70640b0570ec250cb087deb7befbd17c6cacacacacacacaffffff8aca47f32b2be1ff87bfb2f22b2b2b30c2b957aaab1ea922d8f391d49c7a5393f8d757e7fa5c9dab7375ae4f8c542a954aa5522b2b2bbfb2923a7d342ba9d4ffcaff4a2af5a9548a498c70ee14654265d48ada9a15d12cacac50a218a16f18a1efeeb66ece6dddd66ddd9c172a2a2a2a2a2a2aa954ea532995948f26a5a2b2f2a95f49a9a8bc8a8a0a6c6e15fa438b3024b4841e2195a23e444744444447a8d3e9743a9d4e2a2a2aafa27272f1d1a89c4ea957f9948a1ee73e9d4ea7b94f3487ea5017d017e5a13b14062a2a140715fa7e01d386349806d360da900b14141414141494d3e9f4a7130aca4773424151f9d3ab9c50501e0505653637caec088b1b7a84d698e174d2467beaf8e8e8e8f8a4984c2693c96442414179141493e9a34131994e8ff227143dce6dd2269349686e930b79cca5f022973991538182e24129a16f17a1ef4e6b69395a4b6b692d2da745a9542a954a2593c9f42653e9e4a331954a263dce5dd2a5528967ee52e83deec412ff711fdf81c9e449888e8888888e4e72ce39e75c2a95be54ca2d3e9a52cea62fbda9a4c7b9b3ce79673fe2363e821dd7711c2f41a9a44f42df2d604330186c88f47ddff77d5fcef973fe4a1f4dfebed2e72fe5effbeffb64737fb2263547465cc8595b1d1f1d1d1d1fd0f33ccff3bceffbfefbbc97349fe7e5ff3e7f7a9cdbd39ee7fd80e1dcdefc994013099368c66690123e30f44db22d9b6373b86ddbb66ddb3ccff3b69734deb67deffde7e96d9b7b433297d8f37d66cf4c3299f0bc99437444444474d4618c31c678dbb6df364cfa68368cbddfdedbf43837d6181fcd8d8f662b0b9c69335d68d8362d658dd037071b82c160f43badd65a6bad18e3c7f5250dae15eb5a353924a160d484891430d6427bea50d695559f298383e64947c7bb6badb5d6da5aebd76abd8fa65a5b1f4f6b5fe6b62f302d2098005c648de95b0b7d7739782c3965ba32aaa2da76c118c82528489ceeee3eb330b7bfd3588dbd5a77a2fb854dbf34cbfe41a3ddf359708bde19be536cfa83893c8a7b3e0def24e620160ea22a6add7217c364d809e8659bce16faa3dd937565aea232720729cec741947500a99a4f1fdba78fabb02914b14d5bbcf925c0c8ae3f98b832fb75e3d95286910bcc19853210a1a068e70e6f7afaf7640d2a5d74195d32a531eea2bf2361123d8c5d7fa49e9a2df5fda6664fac31d6429e4fb167855dad949943b3a5fe953136c8a81c78cb3b3f9aa9b11683a078e0f79fe266199a32a16ca92f630ee16df5978c32adb5ba67e96ec3b93d3565e449fb31532db5ab8bf6eef6cbf1eefe44765eef7bf92ebe22812f5fbee775ac1cfeb404c746f6d7e9c5591487aaecd317b552860acd965868377d5156f660ad4c29c5a1db5ff3bc6ab58b37aef33e12984b2d60282e524e2a2f50a91518313ed43ec33b792daab24f5fb129e3f1609c736cdb3abd9d23ae1a59c33e672302d9e2f1e878496cfb1ecf8ddd3be42c1aa2f739841e124fc76bb9ca3e86ede024b1da03daf02038e3c12e168bc5409607bbd90c94f160f77abd5ea07eb0131202c3073b1c1004ffc1aea7078cf120379bcd66208c07bb1b70e5412e168bc5c0d4839c9111887a907bbd5e2ff0c5839c9010a8f2208743550e82e0e941aea7074c79709bcd6633d0c583dc0d08a23cb8c562b118687a703332024f1edc5eafd70b6cf1e026345bac10587a70c30141109c0ff6805b0f8863b158cc08c446607ef085f86a7bf0859031ddebf502df87b3f08baaac108885401cf0a5e3801807fc1ea40ff680337006ce40f039dc03827706823fa50cbe992df6c197a4191f0ed086d8cf3043065962b3582c36dbf6431924ddbd84ba57f712daf63ffcbec3e97a3a9c0ea7c3e97ab6fd18313c18b3ee66369b7537db3e8c952e15338ac56246dbfe0a8a7bc1bd84b817f7e25e42db7e4a653b71385c0f87c3e1f46cfba814ec629b7137e036e3b6d98cbbd9f65fa05cd316db8cc02dc66db198d1b6af72a2b5d85e9b10b8bdb6d7f6da84b6fd53c90cd9eef12ed970b69e0d67c3d970b69e10fc79024109bb11338ac56246db7eeec2eeb794aeebf4f8f2f2127abd02f7e5167a4f7747374da3ce337978268fdd6447c38fc629a51ce8244e0b9f6a185f0f7f92263237a847f0b55ff968fcb9ef56475cbcbffa78a8762d25c9fed55feb5cb6f8d72fd4668bb7ddd669bd185f8f3abbaef334128dd120201ecaa3859e4729e5a13c9487f2681e4782f1f5d0b08bd87b5268bf5b0204e322847f942077ffe9d8f4d8bda65d7bee89d44d7f0870d3f7be7b77f1f3c7ad56ab156e57d95eda3e9da4fd7f349fd6fc6fb838b5ff343d4e776ca9709b852f6cf73ccff33ccff33ccff33cef492b1f0e6f3699452d6fb63e0ff5f5f8343d829af4ddf548a17d6c81342286e40d7efe8e0b89e05dff0b89e4202936eaa3e91efb0abff87a748fbfb006994d280f64cb7d30a43e90352e877fec1e7338a5a33c379cf6f88a87bedc533e7f9020d3aefb3a7fe612babf3f7f648cf72a2aa552f7e376dfbdae46f7e1a7efa53e1a4e7bdd6717bdefbe9b5f8e209ea783903add3d11b51ea93d345c2e1567a77be92615daf79d0ab978a5d42f1e0eef9e21e5a13ca03da03df44583a8108db9b883b2a80f5d725fde774c29fd8f12edc474f67d0a43b19491abfa424f3e1a8a297e6f52ea69db53edf356de6d11823c56d7b6797ffa634dc1fe68b67797af6c3e7f3d36bd1199a52b328f059a32726fbbc457f5efdba00ee6aebab762a0010424df4a960592aafbf22d1458bce2bf60b360a960a998924e1a82400e4d40b2a694808c7915955269949fff16a288d4bdfd10e0debe7becab2d7cece27d4f1399aebdb156cf74bf0b5da60dda848c609aecfba38b38546bad75ac75d66a1fcf5a7f9420e31f72bd4cf6b5c9f6f7ad8daf8698fbfb3fb2afadd9b71eed6b34da9b7df5885ff6586519c9c926d9572eb9d6c77bffb17be7f4688bbcef3491b93f3dcaf0bad01e6da19d59a3d016d92059e33e175a29648dfb5f68a7982d42361612c11b6bbbc445adb583b2ec90abeebbb04dc6d174b41d166999845f0edf47c898bbefd7573d2263e8a62c0be4aed97249ef7a148265a388d4edfd10e02685727736e6db7071eaa83caca013501e6158d5d56239ad64142bf6fdf1dbfe56b2a8153246e33e8ef4dc93e4e6e49c9bf41e8e2f7b3e6572bfd69c8eb2d1fdeac238e77fd7c7815f8fef394d646e921ee70681284b56d70664b7ffe83708a867d1b743089b9ed83cd2f971d9111e213aab391f0e8c7fca68bcc79ac8dcdd6b5f8e191e0eb5ed8538fcb7d002d9255bd0f87fca19d34e8fb668df9f53f6f5c07a36d144e6deb48c2f876fd77689ac71bf8616c8c5fb2d40307fb44023d611a4fbeff1170e99dbd3b3090ea76c9bb2d9840eedfb4d94fefe2c7203b4f8fba4906ba1c59286c18082826cf0667c395c07f1ee0f99bbdbf48f2379f49bb1ee150affa789a8b40785750f71e3c79af2b878fd3d6ccaa9d3d3e0a12c1758063a053dcfbedfada6dd5d38c4dc18c855f731cef974b240db69df17ef73f5eb31b5a789cc8d7576f1bebfc6c339078ef8beef691536b30a9b9b4dabcdaedf6d5b49c5df06d95512bb8e8b536eb684863cdf8f7cd5f21557857c76fad98cda549b2c8410f35d7b8e8b9e531963a9f529ecfadfd703fdcfda771ef43f8db2f6ada5d68425cb8362a720f37fcb3dce1f3d28c7c53ab523e9a41da90f1dda010979ac3541fc87ccbdd1b1c2b61da98beacc36235f7947b52563beaf5f8f903124f049a4f7c21124692a9b9bfb68b6eda7dc1e956dee455b489b509b1b57c96c8af0925f65485fd4c7551ee4dbe953196de2ab4d6fb4c8574ebd8ff12795922662ee71e26c9b7e1db489fc6e34f395cdda837680e52043e6ae2e175dbb8eb566571923f70f13e4b1d6b0305515208b2c95d8b4f690f7ab981f1965dc5d4fe8e3a1da44d4e9e3220b1d72b1d297ac51ff2707a13f646effd1735641707264cc1232c6fbef3def6d387edad3b56667596be90c79a4ae5af332daf56b8daf50a307b97c859aba87b8635f8fd0214ae43990aafa3ec044d8b52a61d7772884e4d1aeb3ce3ae439be9acfca12fc70ccb9b7af7ba33fc371ba7c359ae8913a81602e5659a34e177c0c955329fbcc835cac2e64f44d4e4c72c7857ee462fd1f2ac8d4c757e3d3978cc15f9f0a41c66c5fe9fb1020fe687c0e21cb1814aded3fc3f95b0ffff994a2e88f28eadd28ee71e284e304aa53564b42f1d813e7c8579ca6e141f531ce99be3c48dcdedf6eba8748abb847fa126dbdd9c55af778c2d181f7a9ee97530ffe54f3c04310140fba7940808bf36128a1635693afaa8de72f848e659aa6572d919005a1bd10da676d6e0dd446bc354cfde7dfcfff5292ac1b54a57d4c35867b54d91acc0b7205920117b5ed6d587f0b75d8aff6eb573dce6d0488afe46b9f811b30aaf1b0859fd4befdf8f242a75b69372d6badb556ba6dd5242ed5974a5470b34729d33e084bb5f75e6cdb6b1afebafddb30f5365cebdf229c821b3e5dae23f47dd0f781caa14d51ddf44a47799441defba02ce9e2534c8fd2e24ff297c0ffbee5c5ca962e2f35a48c0fd9e2425534854249d9a2a49721f7248e7b6edbfece96afb6273dfd4a0aa58ba9f0013e19f528f9f4b7277d573f1c2494a348288d92ba8776a1ac177a3ca9e8319ff4e4f4f43e1c1c178e2f2fd4e3bcefac746aa7fdf08712593e9d4db65767955eb91f36b97b4ac3573424fd143d62177ac4287acc263de6935349ff286e4a7af91bf722177a1cb61fa7a5ac21f5c8b2ef97a3fe767fab9f77154709b8a7d170a1533aa5f5ebae7a3462bf98dcac932ce3acf293df494a3539a776f12ddf9fca773d7a4ffa4eca1d3038bb789f7bfadafb9031f2bb93952dbf4529835c88abf6640dd27be8fd49d8221cf3ee7ebc61779a88294392360901b3a956ed1d2e1e65fc457c3531ce599441228f28ee25953fce9618ee608951e1335dbeb23f5f3edbfef4f15545c3b63236c5cfb63f6b8e70d54bc9668c2b23cacb27593e68c7c937c9306594e58fa6934eb9f8e305799c3cdb4a1df2690ef9f4290f4672f0cc1ef9009fcc3d4a723c883b5cb4cf3277cadb11a3a4682955f25d682bad9c13bb57ab871f66e3b7b1f1cb978dbffa575dc4a1f6e1a8d74e79fdcaaf544bea6153fefaf547916e2971587149be54a244923d7d48a3ad3d1828854a6badb5d64a29adf56badb5d64a6badf569a55f2906b9d65a6bad550bd6530004440a60dbbe04e60e7ffb5422678fe256a2c4cdb65f45fb32476ecf162f44aafaa6485953aaec5b0bb3ad85c925f28fe2b64f83c5c5f9e2f3e043c6c86d279544940b9ddc783665f9fbd7ea0fc3ffff95954fa55e45e54fa747417993e94ba5cff9bfef3defb7ed317e2bc33bb1a43c3a036ab3a9ccd5711ca433652e2c08a6333bf044aae60df827ae52ca245c692b4cbad40e07c1407922c5995259b050cd7ac39442964a527064df225ff94a2ab109daf4b1d095f92aa2e3a8248bd9eb92a05444330000004316002028100c864482b12c08236172f214800e79a2445a589c4bc4510a2421c618a49422861043004006066064c401002734d31a47229058ce311731501086d20b13c9c76d18ea9c890f8268b4be475c3317d907ae2d9d1087f6db120fc76bb9380c158a180a44f484f817f12610816a12851f08ad4aa304986000f8dc661292e986be11250280729e4d403802a99062624723372b871511e0fa9fcede35816a6b56a99e6a927bfbfdc01bb9191cb62298490bdc046300211a96ed2cc6b7ec755dfb8caf800cf34afea323353413d6129dc77def4cb6a9f5dbd8d83a71e128a03915a2b83a543399f10b6fd24c261d1e715d8cb20824c4db44ef4e2d7a39a4f533a0d101e7d3af79a4320123fdd2bde7643999e95b865c13cdc39392841c055c960bcdffdd92b3564d13baeb41fec9ddc8feeebb7e619928208409abc609f9b9b7ff93de8fb382dd476fe1dde785b4c9663afc11670f454ee13868897b7ab915002289e2f4bf2abace12abee638531b84569609dac86b3d9ef1763fb25a784991eac43045f767052377435323eee37a1a638f999b201f07432b351d0f964ce763a72ac4307a1448242fd1f12dec0553e1ffe21b0c7a5efb838e77ae0b478e2929e5e7dd32673fe19044548dc0c928a2b5401af70f9272725a152863469a88b009a9904bb388fc71a418ab957512a62bd3728c4f774ff68408869c0514b66d780064f6e64036f39cd3921020ab6420fd897753c0b2d101b915601f999ef89b9011de16410a1a23c79a351a507efd7d888d4234ab64906d87babad51c20c07a42c8528a28908ea014a5c94810c79ebe4ed4dc6f2a84a5ceae66166e4165dec1082a6e4166dd932d095ed660b07a83679d8d9b35253a105c0179cd0338a13ea1acc17b0acdcb1002cbe89ec2db5758742905d5f01281308fe0d4b8773114cac9c30f202926100f2904af58af9de71a52f886fe6a2e28a0d53c001f766025c27d87108825f730ee2e8074a9dba16d2571dd75c627e672a35a31651e3106d633317f6f08d2478c02665df744343e69d804ed481cbc3693d009d9798e10280473fa8b92c01a57b78666282b45460a815bb4976734269aedcdeb79a38991aa89183ff95de3f490fb6d1a5866db68bea27e89fa39fa756d87c54a31f6d9f4900800afdfce63ffc5d82461f54b500baea3731b314fbea61295e655c0a4fb0ccc510387a54920639835a1fbb5a952dc524494f7e0e2df3f4594a3273f088ffc84c05545cc84f10ab6ef463a88851115aac789e0177fa87fe505ea9040f38f64e150c0bd587da6995e930de890e16f53a20c69ef5e434c95d5051247d8c200310a31207a081b132909565e96cb6379701a41ce80726d9f49059784206dea762e37a9c9bd025a8389bc58e249da7f3a54500b3930cd45f6f3289d9dc62e31f3190062b3b9d815bc13e133ad66e30e601272771a8e1df13bd98243a2f156b97d4b3cc3569e992d5a31ae6ae653d355f5d7b4d744843741bde96e31a059181b47ce0a47b4e38214605b1e790ef7638de507d6a7c049bfc0d350306b44c0980409556d88b1c5af2141a134d555964bc16bebcad055883c16c6d487a261449a8fced7d38d97acdf1bca66e528ba78a28ff857289668ceeaefc0604ead9e6f24457dea683ebeb89ddbf85d6e3bc56d11760044725cdd18fa26339f14b5bce315a7e209e90e4580b7a24c7d3c4cb6ec09f96ba89002922edf52efeac7867c122b22ebbff5ee9cfddcd4c251479508546ec88a99a0cbf03a199a00de496d13156f14f50f4f834f400e53c726a7d0fe20896693aefc14c056b2569904b1ff60be51e4f55ea3883e5a71c2f498eb8358a13163e12e3e093e3628d63ab8e561c9765789c226417e8484bc0becc4beaf6ee1e62066593042f339da68ea45f1f0a5a0557190f63ef3c231cf4669568d3af8682371813149dc84232158462916e3794702e2ad6d53add0cfbbe491e67ffe65e1c07ad6f9da9b8807d35f710eddc206a98fab7a404869e4a9a91bbd5b7cce21a2c4231f1316ed125391500504031ff7e02fab71a6a1203f3fd6d6a45297d7eb0655bb0764b2daca42f7d9f53d06b9423c4dcd1161e8baf37c5fdea98de510d4378f76aeb014e8728007992e2993725fcdb26a7915ceed045cb7dbf1862f5e0ab8e369366a0f5367063b13b73a16c38fa878b94879a1f4b140319bf3b55f3273467e35898a285763df84145f044ad46e9b23659b72711d6cc9e0710549596fe27e996b0932e4284bc519ee315e2dce64d4271b5583445f3150e39046c47749be942849723ba0a9115f12530a1483b0e0a2361e20a701d4c34c8685d64beb0045e61230176a438fb9408be1840f85f344e89af4894e719fa170fefbe034acb484798843ac7ee97d727bd50cbaf7a26e0f0bc8143eac3e647332d8ccadca044890767defb529e003e8e9dc53f09d5c76af77d124c55c5f7812ee84c626b90a618114427e44011cba836f1a6a04e06a09d7012522dd2171c6eb4fb449eecef264e860de918663fccd02324890907eb4e598ddc653f663f1d2e14812381a68ecceccbb1167d72fca12a5100961da1fe08567d1e574d1dc491f6c386ca25e9991f149c68a7bd3380eafefa80bbae9f3e738e3b7b410395f1376596b01a399bee72ce10d416a72af0ebd9429fcc08afffa93610eb20ad19ed906e22cdf00bbf2414677e0cc22dfae955620143731eb792c4b2fd223e509581e31c12da080eac7240957e9b787b28e94b5daf054c62c75c8f00c03aa5e7d09b8433a20c808830bca067bb480ed5514671f90610b3e2741503927ee622c969104b672e2925912f625a4fa61f26c7893d04be95035773930ed75aaab7ff02b16cd8f4571b8dea100064f4b91071b72d8f8a92b7239e56e51ddd33dc27f685d47b6c5ebdeaea01aea0f2f2b9e98debdffdb7dbda642b0ac2eda4ea429da118f52030ca4f466e3baa794f18b6de00e3240725f5ba1cc977d6a1402a87de4f6862a4d4b0257704ef539ab350394c8c8a6ba4d3689e258120249d684c84d8bcd7b4123e9c92eb4abcd617b41c9efe67e19c222e63f84a2bc5346a02ac965ba21d26d0d15efa8880245a72086ddaaff328a67ea55ff4204e71e601e78a17a96a33e67ddceaa09e65e556fd0994dd7c1189f8e1e926ca0852f9a1452b5e513167f352d8497af28788f9bb42b3392e8635a53aa47ec0925c1fc6fe8b2375d26cfcff1b24f2d27c6dd4178361bb2dd4c877e31f1c8a770179272e3ca5a68adf2d6120d7b210d11d4b183b3d3441e4fe1c24050c924bc0deb335d7aea2c5d997a48ad49b8da35a3330122d31a42213ae262317190ac17796c41a0a9b43188c6db5991042664299e48a199bc2b881349fea8349bf286b12ab340fe267c40667a0957dbee235c0340359b136893c073417773350543b08a119e8147339d883fd34ab5bbae066f44fa4b0b7fc2892cec30f291850834880286b7630d60a20d71d65ff45181f02569da5cec2f83bf5e49ac24c23ca4fe9bd1d96d6ea4b77c0b9451607c9d7a7d7eca38688272b5f850dfd27b8e30c762a82e41ea830d86ff53911f946da887e64c6249b7d832632ea064261b756ce7ccec43950d9b8423958c620b8824e4dddfd2d326364b5a26922db2681424e0ae616bfad088752c3a8e89b48b53087adba77e72a35cd8389f6bc8cdc5335c6aa9d2e9ef0993a16259f483cf257c38a630926680f4bc8506df942bae5dec7837cc02131eae452a37c00ca59c039542e82e7a6f786dbebdaefef6e73e1f28c37ec6dd2b3bc280fd338a9a170cb9e31984fa19edb82a6cb409f04bf2de614ff52124c2c16cca22fee20b85a3f7ad092043618ae8bde6bb5d0408402e233618e8d2d9e04b8970aabaf9cfc215d5d8882611b1a2427ed2d125427c0166361f512459182ab636a2a3b215117c718cc364efe7a3ce116e35cc32f258ad8bf9ce88a45245d5a5767e5ae3a4ef527560b9c529341267ed20119d13f21acbeea1c3b8491404a07a8aa5b6faca78458cfc9dc670add1d17227b2cf83bbf58c982702177d59f730d183412519cc7ec54c5c3e6b485e31f1c5f167fa96b8ef74610a988b975dbf8a508db86434809604baa5f4d4809a5c2cb340d6aa44014e887b31f4f3201939f4533dd266b16916f16aab99fbbe0ca98a6c46f29132e5c0d14d82d08ab961ec67f1feb8dee6a9c0ae8c5797e500922c6e314a090c3fe54b63e00e17930108eb14f18dcb5fd62215752bed33eec27de480444ea2ec2c34f2573933515a244d87371e157180f9df1153ccf2609e401c18b7317da9f445f23e506a0ed1958560d5987300a1d2c9c1a30b09f77f54c932687e955583f229b5b3325d3442d3dd97818f60672b96aacf6669980f88dd22fe2ec9cc5e7181d71ecff903a36b0e844253bd4a4af04c588f5b2a0697fc59ce02c91ba1eea17be12c457665aed2a60c0c6b010dd96c32f5aebc00f5ee44bca6111dda98b70b949fbac5d193301626ed63404e1f9f69945ab394e4e8d024073e009246036d49e55ef8d0c9d00cd02c060c3128e45aa24a052f5d1093a5bd5bd11fddcb3e1f14a884edb260fa0d079e3d1b0c92a5ee6057e7e018d32c1d8ca341da4d6d6b6d6beb2bb7f83913c3ebdb5c901ca556bee230e0ee393ecde70cfb617d5f0011608407b3966ddbbc6a2fee1456a19b697aaeed9ef7006a39301b6f149ea94d1fa4cb9c34911e98a551a25c8f4913d3622a1a466f2ccf60878ebdc779599be8c625c6e4df3c0bdc361c413f2eb05a2a89a22d40e35e80df50d53d3d29ea35a23ab6d163fe7bee8bcd3ffb4c2820171f180a56490e96d319aaacf4970fc388cc69b1c95ac15471c95566c3531e307de717ecfb44d9875c434d03ddb9d8b8050a9fc204cb23fd0cc366365e8703e5532bf9c96cef68ec8058a46218b7c52be85c818e1a2e06dbd6f769d0a39fe29d0d9c1bc43becb205950688589def26889f466b58b574c1a22b73704e653f344a8432494b595254814815e87000ca34ef7a90b90478afe915aa39002e7161f0d40604b1703a246d0a86703652d14002e4b0d0100ec1c6440a4ea53e294dac3d81c2921831001fd5eea82e5162d8065e91a927e8287744567a1426945471409f05d3df71e923b450a82dae0bff916ddf8a78201b66d15ca4e8107514123821c1aac0ab0abf11294516c031ef1466e332e3fc54412ffd5f070aa0fb8012cc2ed7e0e50c06244d6a70d6d7f32a2263204e5ec2dd5ed1e03fc7797e66e4bd7c4bea455c432c7fe88ffc2aa9735448df0f0a4454bfbcb60177873cf2144fdf7af1fa1dbc5fa2c0bab24d044ed1c29bf4e3d50850fc2b28c0827e79ec3f989c261fc7b36d804c8b18861c45accc19cf37b4ebd220e4ee0db093b6c73cde5d422973f50f2df7b3b91937276a1a3e5ee8039941df2966d97fdce064680a93512ffddff3420d6ba9ee840601014ea22c895213abdf1b9a007532e50d45bbbc0d4823aceeabc429923ccf578f64b0102f9133c41f0656f43f629856a516a5cd7a352c2a3bf5ba94440cdc4101f178352ea676aa22d3e520af34bb7b3e21540cdbf125a403d550aaa63558dfa759b7bb947842ffd0d8eb2116eb84b123525784584d1e4a1231c4d18efa498c8089084cc15f78a00a9525c03fe5618fae9dd35c3410c72c524deeefdcce546ce08ba341c092defaa44ca3ed0255516d06d79c4d8b7a667d462aa7fcc68a20840bb75c9130a02467e390390722352a801f7c865f60cae1e068d4630883e22f3b0b7082011beb3f8fa93c8cc1b8acf74744c1e698703c0608b4fd15bd2fd36801e073b0a906f8afa08b2ccc89318e91109098b06576a0510e50c72687db41e2918f87210204b6fcbd203c8f763576518c4acae3f28a0b700619a01663ae873f8fdd5a59a33aa0362b41ebbcb34a7b1803869c9e63828a5077ea67b75628081abe9453a265cfb0ac6a2fd07d2ae2ac4bca92e1a0d9d40c1202b8bb6f53a08f857606d40543f0128fa1e9712a523d919d171782c8883e10d0c25c0e084200cb9894c2dd2c80620cf086230d1ce7d52662efeabba22e2e3fe4f7476a09538c5286430e9b308e86df374391d52dc456c44aad4240973f845654a4fc8121585fcb559c7229928259886e24640e24db825a91595a1ac3904c76465302fe23d75640474fb18641348554649a1cd534fb77140e441a70413509a904fe4124632e5b778385209625841658003da3914f44305ac653d007bdbca7d4fec3fa360a7ddcc530449fbc2c0eb81eaa0379df30d002e9653013e8e39fa4fd99b62e047e4f91e8c96b1622629460506162339d8ca8c1a4550887d46636d3c0e811faee41e861ddc8be4d3737901b8ed134057b152517afe19136b91938b21e4b162f7d14f5cb3a80036334ba5abdd5324a52234c67ab9a7bb4c6ca5ab755f88558c413e9ece20e419ed3a81c65f0de64c9cbd5d53d39138302009cc95131cbe0078ee0d96264fc630fba19e0aa055f2cec0d323279b4e81621744a3a847ef3288c9cb32389848ee68f17917ee50d1ca4077e86fa852832aa3e891307e23d326cdebe2ecb97afb2bd92aeb06030fc7cdf5b1245e3963d5fb177bc2432c412b205f7b6314b519241ea64f4f695f803ddf99a26606354c047cd034b8b93233387e4a85559c8aa9d31fa4b9cd916470e7a7b5ea455477b3cc29666377b52e00588d01a0cea046b712b9aaf5209de754b2827975798583bdeb4db99f0e24b2e38fe865ba98c3873ab7fbd6a3c52acc924b063e0e9014085dc56c66bbca00b2769311a9cc572a02b0e00cbb3213691de710e1505ccda82ab6a552a5ad27f06c943118ea483ab061424474413292239481df3ca98610447b35899eb0f8db86815cb09843f7decf229b03da75ee440b5fd59504a118c49681b0fbd1daccbc28b1b845382dcd54f965e7acb6eb4a36e458cd3eb2845ed02fcbc5430463888ff55d32bd354535534a0aa493cc03c1a498fdaf82eb2a6fd94087d517f22d7ba3109af8eef23aad6299b9692f4e62d54cfc1bd34df621fd0972e7fbf93895b3f590b03e009466672ae4bc8f813b65f2d08f2a06134da32c136242f01c159ab19a155145f2a822b8fb2654918552d7227c8eeebe797a942768a0c85620c3a8487fd8eb02113524be99754df9c0b179a2942fac348d082495cf280e58369f1c08f54195f6a6785572a598f84ae7f2e8f38bc37156fc038d7ff00b220c94debebb24767f59a21974bd3f3f61ff6570c2fc5066c2a8f9dbe3a94a22fd50b2e7f7e5fcfd65f3f76c76411b9ac4a1034609118033e14a0b7abb19343eb707b62933c23cacc5f13735a9a158f64fee7dd9346906234dc64bbdbae8f1f53d8ada045f44f4ec64ece63c5acf26485260dddaa31f58c5d6ad3d8ac0bc6ce89ca755d548ee745e22615e1872ce6ba96a847b3a6f91302f0c39e6b15625d22d9597689817061df35aab1ae996ce5b14cc4b03c76968419d0d1dd9161fe82ce87107be663c3e183336348c0f83dcae29781064128a9d262d415f7f10411b7443fbde7b277222d9323911936595c1844e2a4326277292cc323981c96595c9844e2a4326277082ec3238d1a0fde69bf7df7df3f63b13ddfbefbe7bfbdd77ef5974dfbd7debbbb7ef7c1fa00fa8edafd717692d837468496b90d74606648bd75485ea5c954f78e6a0e45432f254462fad32c8343ee4360e9193578b1c972dc0303b1b675d5ec475110987e9c0ba91137ab571c9902449304707c7ed9b137b398dce72d371c82285c55d95aa6abec5168f3d51ef36e896419924e53001d50087e167801a4d651272cff248db5d24436ddf9cecbd41ac8e7b8a830b5e0c090f1a796058fa13bdb7c40bb96f2128c1cb9021c141c75a5206c93cf35097dd759dd4bbc1ca11a5cfe8b8ff22b8d897d09001b119500641e5c1a1ae5ded32d173c7f64669cdc230566ad409397cf2c867803907d9e94ff6be2daee37c8aa0045e43860a463d609cdec45e97c7849c6f1944dc4b7898a1d04b312e83643e7fa06b5dba4ef6de6645448967e9b8af18a4e065a8d0d098172c83a3e77d5077ddbb4eec79c5bea462b9e889d33a2de418e491eb881d8065c53649cfa5771d379f3ba26df0f6d4f3726389cb20b14fe869823ea4c43384dc577065c99424a4b48cd6e9887573b2c715623aee2b0d2e7a352c346ce48162e9648e7e8ac9a41884dcbecfeddac9ae48225b5006d9620106399fbae75f6689e4262bd420ae0d61df98a5c9a1649542bc288632c0f8e0f88c1c164253a0c11f6aa8350c63103123a3216f883f98e23498fc69cd8d59c01bd91012e31c6cc5e07a0f2ec936725f612cd480435b8ea8f57008ef89ec8111c6d41ed73aee39076e1eaf6239a6534bcfd8e018d0e86304c31d4e34fc667e078d6a0cece18e77c419f500cd3a035cc4682fe248a3a3c10fff1e610bf6fd00287e2b76b4d1c19cb26ff348103d8cd0b308dc4bd988d7cb432120692c882f844334666a03c6281b66b3ea51028c88f8f022461a331b87ca3cb5c5b1af16508211442845fda9195c8b7a3036d7b2783ea75e47100944e323e6d533224e384c4f628a339b41229111ced93c3a2fa3e21ca2566cf92bc930243c9bd3b1b0373c5d5180b14f103d7c4bcc9273272b01d7cbde7a4e4c5b350c4c7c3fe0a82f74e9ba8ce975c833340eb8831506e650e31b0256aa189f786a863694e369c0268d5d5c8f3e58be1692813c7103b88b82bbe9b9ba95e1e3993100a9fa130c00061d77cd0231ce8f5d2ac32fd048ae0d80fa75a769588214c076a529a67218afdfa951810391ad0b68518a065a1c6a18ccf4a82580b3d17fb06a866b53d20ad38d43367dc76c1cb20cfa4c949e3c3ea00d2ff184e07073ebe857cbeab83eb3ce7607f46957e56aeb09a125834841c6eb809b2030a0c7550c973de0688560cc16f2cb178b0a79615e440c34d81f5176f972ac935900b63d22ff80af10d6091dd203e9da81ce092a719b296a8fa09053f89f117e5f954af9529d5ae733ea8434d4071ccb4ecd0e2e9866b820276dfddcedb4fd6443f15ae74e53e4d2a6e8d9a4e96d779fdd6e0c61324bb4ecc6e06438079cb29ce2515e56878b94eb210c6e62c761fc6bb8fbb5c5d4a516f4456d1e30aad70a94ff09d5fdd35957242465d12e1b90a9fecd3de05c91109ff6541dfb79b85767e19d01090b5ee4c5aa9bbf1b0bfbf0f5d3e7627797df283abe8edd197433c9f45a6beedf1706a0bdf4beb846bd1a2da12c6be829f4c9c24aee881f9b74b2f462f1ed2729c9ceb31e9a0d6fc871de85150327d0e5c143d718f20ba40c249b4a0f787914c8e053d343a6e3d7bf185c82e126c1ae47b8eca3098fe48c8795498edfd972d2bc1634798f669176d69023e0ec7076b636e2057d1403234e31a32288bdd6fb45bb13d97a392188746246f144c77d4ec36cc9528f81b6ff8dc197444fef8b343d683a993b517e68d934a96464b175a1714b5f831b682025346bea7231b1b482de1e6eff1b832f899ede17697ad07462f136a5ae4d79f513eb9d171b632509a6fc27cccb9d3f6720c6224654e5882551061e2df0b387fdc326f5caf06bf6a13d1cd876320ab94b5f5389ba2236b62e911ec6543e4b59dd8910d539624b94815703fcec69ffb18bfd32f88e1d783b07b6f386993889ac9f8e62f5ab82e2f9c1c45ec34f9abcf3f040d72e366e4343cb66bf81aedfadc199451e2bbd8ba241a24abcfc3b917303c1e4037e869a2698c800977198b2d0762b0ae7ad61e28c3ac7b6916403d10abd7bbabe6d267526786b2faee740d769de1cbfbc1b50dadaa6ab78a418266110827406adf407c7232ecc87baeca6e534169538f9187c7dd50eb538f005d3eb2ec84e028e31c9d1c55c8a70b44bc23140f60f80330aab14dbb5caa2d5a7247a51e2f05b4a5634ecc0afa7eb8b7668c1812f6fc45de876664247e45b8f87932612ff0415d1683720b807bc95c9c0016a04993ae9c21ba0128d1a54a60195fff57a525dbf5b83338b3cb6bd1b85878020e1b2ee408f8d28371aab3c2b49b8e38cc76cb21171c1bb6637f4220ae79e95a84133d52420f14f574bcaed6333f166d16bfb223d0e9a4e66c6e8640feeaa6842f7fab54b2f9684d8b0603d6d22bdecf5adab530cb038d065b79dbfd1d085d9db80e3e766b25c9cbb2cc1406fd0be7731d8251a6090b30b7988bc531db5119a8c7f3eb1c1ff8926786066ad2dd1c8b77a41c05de8baa1148c0336ba8380fd351c181f7eebe6084d08331dcccff5814af051f4367d14d7116bdf2640545f24df960d457b1385645b87416698dbcc6f793aa1eb9b308accd581311e5e95dc1d85ac8195d5a421651630d947af25d5f1b433d8b2c093abd75d28be5a7bb1761c35a9ee9764d4973506d3de2b2d20d62475719d4a9e7f0dcebb5559390daeb1091eb858588546fdd3d79372db472ed1ce93d25db8e9808af0c917562ed0f998e868b03cd297e60959b9ec6b1f5c4272967405fc79e15b8ea12d6aeeafae2242b3ec90651422cd882d0ff96b3d9d0dc720f9f3f1078998eddb17e8f781eb1bd4f4810e3df0c59c85ec0c6e4e23ee28801c9faf47faf84f1bf5a0e0dbbd796063e942f4311c0d1595fb9dca09396482ed332c5dad0ed435fbe5a069d7bb94b495a70fdad26cd03b2c5d289a18064d1502c966c22e6a4df257bf4613accec6ed3deef817a726e1a229d941cabdf10bf0d5c3d16aba7208d038812102f54381d87b731d3a830396624b8abab6d911a787c7cd90e22e6965b9fb275c5109cb8ffbfacb9c0e78ca214afc432d987dea631f8c16cf4ee8d3714a5b363b826abac31ba6b3c94e2d73620237525ebde3ee9ca3ca58b307c790c6744d3d55dc1c8c4c7eff1137d233239db31c47f055b6b7dd1d28a7d32b340e3d251750c9dee130a9808a378c824af0becb78c3cda96b00e51948da3a9b81f77fda993599a35c9a8bce2a43e26b952b4586f56184e23f95dd4a750f4fdfd7de33343f7d29ca42fdefc35efc61c9a3144070d49af541eee0ffc13915853545b7d7c4644ecd008ba2a1171f5e9ccb361c3372d56fd917000007431200679c5716032869a8f7bbd422b341b9ded8747d371b3a33e5f48d51499c5d9dff22527989b8e5f3c7df856f3dea243526beace94de14c4bbcbe7ea0567fb97874cd342f17a76bbcafdac38a775b696484f8ca0f856bb36563f26299b293984f93c2d5655bdb5c969b6977a1746a53f5eb1256d99e2da3e4fdb5886328a35f92789f33cda690662e68f2bf180de99b57f7f28fbf48a0d84ab96244e395bfe5cfe64071ea2acdfeac3d8cf6960fe67f37ce40e3c90553c330bca5d3092869e48c1299013962e18c356814bfcc5ae8d6fd43dd1238e8930e391a18a6825546b88bc2cb520f2dc41dc5bdc39d466e0b855c40919048eefcf5d717e819427206095a0c43c2e7323cf16067d0bf2e837ad89ee32fe2f2016911d3002bfa225b029532fdf9130c920c69a899b039b3be5d74b81c650dbad99c99c44f997519fb78b46442753f692a5d6f3892e4bc8cfa25b446e2d44cdacdb828ae7dbc211eec43f359fe1b956b057e54302f189f4979adb2627c267e57a83c08d20b6a63bc5c54234e30166c8246cececb8f8cbe6ec59d0455cd734e2b6bb7aa8532a571b80154fe8373749e7702e3561a5d308f21f63bd10192cf33b7edbcbb67f1673b57f2259a34b88ed07db8c875e9b7d6d4b8b86df774448e9204aa816f723faeda05e5273e1f8f234ef87f21afd9b036c8b65fc83a302ce9b5132df600c0fb4d8f8271bd3504cdefddbf754fe60f2b03efa502339216e2a717a4bb33c901a0e4bcb05435aad8a102e76d7adaa12064cd0efa71d52274d01d8c772059a5f0c0e8de7abc5ba09d4bbd1116e42900f60577863d2424b6bc6a3ac88244fd227ec64006011284a04082101468d0820229a0075190b21f320c462b89b5094c98309d29d3263561d2b4a64c16d35c4d17f09244444f85d0ffe98b8d252e0b3c68f593a980c73015668cc87ce077597a02b04ca193f941af787e06aeadf1cd221a1d71a6c6cc8d62a5d7f7b40651e8639c1a9d6b57365e929db71fd3a3080440437b6a1e7196f2e3fbde92db84c25a0c767c05635c160b018c0a09734b8ff3ae395744ee210756e4b10d9f054d4e34afc6beb67346129ef36433afbbe1fa5ee425252949697bdcd2752a428a31c4fe94748f8153fd130af73dd84b39f479a515f5408a1dc2cac53fd64dc6d297bb435efc47219ba9683f5edb8cfebd6e16553fffc9eefb63d4fdc39cac282a87fe439e0c1695fbfe7b54fad348fff398ec282a27ff739aac8acab9f945141dcd18c24e80ca97c7ffdf2f545199c88f3628635199d34f76bf3fa2ae3fe46755540ee657454fc92a8216559cfacb3afaa3a6fbc32f27151585f643e7071615f5fdbda6fc138df6f39567151525f773e3a75c54a439d45008692eb9853954d92b226090872a2ae3f613ce4b2c2a83fe41fdfc3748f26729ad75d00237acc73916d500f8dfbaf4538df6f335e7141525fff3a3a72c2acaf3cb66f2434de1b76f8eb9a8a8d56cfdefd92b83f71856609531edbae984170d45d549b6474f7b1976b71112f1c8c679fbedd4a0d2807de555d22c2a4da42db5ae650d0bab925054b11460b7d5ef4cd270655199ba7bde2e8e5554035b1707fe121f6943684ca78bca086aff5f54e33ff9f477a4fa7b6db3781bd1c47f26a3cd0c50544915d089130011f65a0eea298a7ed7e50c3d6e57549fb8041515de6b28d5e5ce99d9a0cf54e59d2c86aebefb2e9ed817525809252c90b4d02f9e862bdfcb632793ceb14cc85c4e0b8eacc45e130432ba59adbaebc6fb9aefded017f7460b21c103e65de25371121f52e3d6a332e91007534191f9a1b151b52706e2e34adea42e7c9842031b4d8cf1861e96abd95e4569a3a53d4dd4f08c09269749cf15154edd6455abaee8af7c8ec94c84a82d8e54fab5ed2077da58243384312b47c2eafc24e6a9a4068d4d81b99bd31f33146306a7fce9a1b21a46e3e68a0facfa6ae386a90a1ac33ebc1071c81d8b1c7e5a4414358ea72c37e4a14d8fca2611f1fe3195dc2356c0d879a28ff47644eaf77d155aa2c74872295ad193255278d4812207abd4618daf7306f2d7ec7fc2fa297ff95fc227232c358479ca926b33a40b0aa86e57123668d1cc7025ee99d0e8e955d307fc39333c6b7605a9ae78209973716bcf801fd83afe054468878fe1174c89b579d1c06a953ee2af2e4ab431ad5780990d9bbfe06130c30a8e98b1167d49e72708d32f34dfd02272cd2be0a295d55fd9316f103585e7be385e4f798f00283ef5575c014c31a179e90ed902594031764870f8e83088c8ff4165f04174fe4731f232aa3fddfce058422d4cbc873b0a25ada91acfa0504c71a196d8c8d54f32cc73cfe97133e9922ca2726d731d6097be8ca4d04a3893a108feebdd01d2861236bcdae68845fb7b3a84b8610327ad1855f38731f12d5af14da5d78982eeac5ccbea11b18df9a7c326a013a22e0f02a34e046efec2103623c26e2dbc51c2839f3bac1827a28ba75a7b8c828a288fcab14fadb36de3198a55c106acf385c7a32e1d60ad7fd6d2b61ae9e933976dea24a62c3a92af9560cbd677f22e5950197642f23f62b939a018d1b13805085c46d26ed9ac5bc0cd577928ff47afd7d47b26f4ff81fb2b2aaebf62be43b611a9f57eacb72899a329e8177a5b534ef3a666c7c50280717276ece6b7ef132aae74eb991863dfece0cb71921676814cb72a0dfee76275feeeea58de14c5c884544585cf624c39c5c6558e5de958793d31d79595357bfef76e39f397c445028243a2f2ab19330f513bdc91f7c2a702dbe280c99baa3889627ba79cba5d3658639dbfe401b36919e2f4819bde9b38843db067226ffe33b657a943bab51bdcc23ee016badbd022e29117931f5746d008ba6229691c4ccc31840c9648ae29ba088cd90024cdde78551d80566caac9d9133d38c45db3cea06d9146b9e6d2c453d6d03acfff41899d68870ca31493b01fda6dba4e2e492797d47494dd8845304799fce00d3747046a55f53fb3448c62e38873ad31d970132df5ea064e7d919c4d2449bd76b17edf731a789171be1803593e07240dbd2359436c52a4148c32b54f9d3a05b1b742dea153027fa023350d8f38c5e9277fbe6376a35a1685a9719b323b96149656b4a1a7ae4c205c1706b34b448b270ab2a56b8582cfa8071b0e44e27bcc97c067dd35da4b1751a5b74d935d26a147915acc0b94baff07d4d7f1d7c6b929496b56ae2096c21068df0181fa2f92d972527447a22421c6a8e2085a1c2021a127127a7740f312a113f3e421c19fe641f3cc47abb42610a914b76762a4168fca0c6862447f1388667512dcc0ed33126d3305f7521e0dd36e32e962eae4c5cc0c2f22ca4e8607baf441b2ebf83b3f7fbadcfd7542f1e9ea1b502efb08020d4e0cc3d0e69a2b60632bfe4a7c6abc12c5158e3c438d008202399179108a80512300bfbd81442aec91b38eb8bd6b4e8ae7b274a8c28c33fcb3eafb3f8cd68ff726c1ca565f66a53ab40cbe9eb8b582d291f21923c573eea1c84148f2078247898823a8317a47d6b9115115f16391e5e1b4ebe8babeb9e57b370b696285bd72d623a0e41acfd73525e4aafc95c4fb5de24d99edc1e34207f177de4b5719d2f1374c7381185cbd3094fc229b2b5795b3c321cbc9b6721311175a2c85c291d89064448dad65be4a92969ae2085904ff16ba604a1a1e690bf09277b250bd7f03399080d2ee807b919d87f41650684f06ff8d2ab27239cf7aabadf508ce80b3142e53cbd21a9d03b36a74dd7fbba0eae5ebafc7b9bd3b2a5ea15c48b343d92a157254ebc2b70b750266f338626f3e3afab528c4d81656ce5c4b313e2d04bf6ff5d10379c236c23e775702b6a9b05361057eb58d1d2b924f7e2e31b3198b25a90655f6b3e2669e699c1d98905e18b692aa713e3c5645378967e7bf3c2e4da3c42b31360cdc8061f05cc402ce188cb37f809b44e7e68c64b81a0597d2968aae826a84a219daddf153c20687851ceed8821b4d6444205b241dca75b16da6013726f1737e1d2accd8c2d5b1c71cb1e1a03581d563a237be1aefc3f4c15c230e972986272e21a682343dd01f5807b7207ec1273acb6e513c83dc0eacb338788e4b735178ffebcffd3bb579d6d428e19ed91bf681dce4fbf0e9f395b5c692ea0cbbf64bea54334f62fc602d2fb43400febb176086aa6df3d1a7c0a163b165c1500c63318948e36932e75464256c713fabbb4bbd0dab01e8c699a1ec4d9d173c668367a6c17c49aa9a4944e784184167b2371941def8e371af2410b7489ae53e7ee34c0079abbbe6070706b0b0d1104c8178658c3910132b1c7c122e17ce748cf5cc525fa79595c1012d4c550b86178d257e17b0e2647f35c3cc40719e845bab92846f2a95312dc5139223b6739429ecb1c34fb675d0225aadc5e72a6e64e10cc4094a85f15f3066df8277260c3a3bfdc1e4cce3e0bd149ed996f93007b33c3e416af4a03bd84b79f05e891f3124ad71951461df327d7d5cff862c917bed9201c2bb05c792ea870cd9cb64a25a3fbd15af4b68e62f42eaa16684240fabd47b6cc3f236d8ba517c0c7c2a028aeb5d1ca3bf4df9ddc10eab951a7cc6f3f192ae3eb9e322012104f521d712c48b19c40b318f42d4afb1a06ba5aaf270b5871499be3c815cc750a4555c010c2973487635b09cc8a0c8888906a11c756a4387dc7de78ed41b8e9681040b555ea250a9cb8a52bf09072344f540dc6e86737a8987b9c88552421b58590504283b48f300ad341060f49489447a7e93a42ff97546ae20768eb9ecec9c6bdb5d891914b6df854347b3d7a1ba6bd9c581ec03a7e7c9690d423104400a1bb73c0b735b894a4dc90aa1dcae71ec22411393a4b4470b6cb2fee58802f10837f3de661b1d0fa10d266797a9ec5afd4664e10f7fad172f5c29969f423bb85affc6f8c62280c9c34c8fc2c7c95f77e44e7109b92123585b06f9f59345c90ea879e47be4018a725c88204217359255b9b905997944950eae8bc7108467c63a353b7394eca8e3de6a6e994687eb71816589a216cea0979e0e7635e82d2f6a500b9aec8b4d83294a05dd5570661ddbf6357ab6225a921d438ae0f19c58d37f9e357a8022fc4813faec9c2c48d939ff9c357ff68a22e9fa67ec5a07c1440a963dca6cfe11e1666016d5401297816ea759c9d30923732764c1c8710fd02a6cc5297c88cec656e8f221d2ef3f50e45725b944ccee0274771ff86e50b4df7d8abd9b0f73d0b0a1c39a0797a2afb9415837815fde56222f6a791a8c27e787c64ca8473309a710cac6186d68970d662a2bff2681b2fef425258353b122306fae571294cd9f089cab99cab44fb1e0609fd710170fbea019f522dff9ec23d323de5ffd8bd89dceb3fb5a41dd5cb80751daea4d9b171d3251fe84902090836c96593335afb9a3786dda6d37aab2b254072368e3718d50af144de0122c1f2effe93cac289a45194aecc2733ec818007e9476c0c51b41edae4d0ce970ef1ef7128f62e38d62f958b07b08c99c9ad0ac8a8f744c97a72af91a62a899a4fdb89d134afecfe1fd60488947d5cd2450b25ad414762120059e7f2ea3921f318eed03bffe6388c969c1e4c245ec490053ac7e55da1422765c08945722be38c67724861f5c7fa4f7fa7cb1a1eeb8cce0cd8cc7488d9864eef3894c28a312a8f7b2d2fb121b27fb1cf91b1d7595afbcf6a0b2d6dbbe71f566ced1f8d602c20a8fe249b7472fd15367e339b2867da390c5294ac945ea01878028cd764ec2a2715cb619166dd993b8100404880d0544360bae934a84fe63c36a1a0dc6d4f037dee0ed421cb4140ebe1953b9739ce5206b584f718872ed65ecbf9d43ac850b86768e919ab45d94ca2dc1ee9222ff0b6a97886854c921da3eebb52f8731aa11d0edc534da44d47148a0b106de67b900b80a79471acc11b0c84174b0a933ac57c806b679cde6bef69de048f37107bbc081b46c40c44a09f29b16ac680d9a0b8f9591ebf38a5ce7fca09ac05d2a29e2535a2901dc2fc7165be31410140e1a70126ef345aeda9633b2978fb4ca3191a24094ce8d30a831357249a1274b43a1010b418c6eecfa5576ccd876c13e66b616f70f2d55f9bae00db86a2031541aa85a74da869d52599f742625d7ca804e38766a6be430564061968509dd9a0fb8a5079e36dc6336dd1c32caaa26ac265b3f56e592085087077615529962e3455538d30e5a3e300cdc75da24b37d44c1e211e20d69f080fa8173f4d255684dbae1fa45d84c6e3cc6a103c39e1bedea8508e8bb830f1c8148192e8704cf0774d789437733927a2155dc7770bba934e2bf183955fd5e17b3fceb879a85dc9aec42db445b7a1a17d38d3872e96e02a6508825684b899ba94f927bc9113797725e0397d9d18c274d7f92d2fa9d6dab5344f7114fc1d902605f27d4b16874523c824624100f3a4c1b3980251a36486aaf7275befa22201673ce5daecb7c45d92b2984247b70500cbe228fafbea2775e1f7a3551626974e109a227f5464ad590e7beadc1c1d4ecb8dbc45b8304f31d8f141817d4589a13c45c796a18ca7d38781745ed20d6983e337342dfd4b72334b1a979d03ba760323aff94dd2ffda83dbaef828e01bdc8b9fca951347b968d7a2af9c50981fd4e5628b0c96ca2a72f764c60b792929c3305521226271c5a3494048f0507fa81f9b8d1043ef43bd2c061bd2897c36ed5befb56e28a2d133de0c52d4a868b3749a6a1370507dede040809ba30ce5222cc8f50c48eced8a8e88e3243b3f13b29e2b150ab5fd706a24a7f6dcb9ac3d06c5403ad281d75981089486275476b970061cfa4ebfb8f87004af26724f8d45472e0bea73784cbab0755ab26f70282f6769b809710fdbe8431c1dd2431ada78916c7ba11599e2f64dc58140c36c3870c52780a08208306efbe6c2442dcbb9fd2a62b8ded6d55077f0fb678b2920d6310ca89fd7ff38107ddea4fec4d9ed8c19aeb11c05db57c0e749b4099ced823c3af9304ab6a7fa70b3089e58fb031f70d759ac046728a0cbd7d1c48ecdfac1b3e3528be8ba3a5bacf332d9d4d35ffa5e4a1f5cbbd03550f5d4893329308df529608c434a567672719745d5566e1dff642d87dfb4b1e81ae7db96c95d53f42be941a2ecedf977b432473e8f9ab83f8ff0377329677ba17dba7598ad10dad0b2248fb3a0a6a041f64a0776f953a5d5029b7f7708788d746d0acdd70dac39a5d65072e97e800fb5abecd01c31a3a5de29b23d6613457888aadc71eaca5222b78fb082c58ce2998c4774a9c4442340e7871c8939f2ddbc6e30b92152e39dd4d1128e9850e9fcfb8bb2044d8de8be2613dc70e932d314eeb6ca0139121cb6e6dec483112abfc16bb83c17cbbc9366a1ed687c686416bfea907ff92935939844d594088c4c80165675cd2bf586eaccf2c72c6c8855bca9a10ad30192f14451bfec7cb7d8403da2ee1da832c3663e4144ffb73038811af0b8452e331e0d4ab115f6bc79381a954a263fa7c3b4c0eb88ad07edce03c1ee02296f051377e8ed61c2491ea36138fcdb38d465fe217f9429f4fbcab323947e708b7e92f33d0af8b5319427d4021413a3ce79a5262c6667761edc37dc740cfee67d4d87d6ce6924aabacb64663fded4762eb53b66f005ca3adb5015bad2212a7ee00c4e1e49e4336c1cf407e386c10f50d596aa54b45a95e535c8e4d0fd6b4486a213cf23e1c18d7c69f77157d8affdae88c2c627789c1615abd8cbdd91018aa0a7cff97652a0d66a61ca415ff7eb0f89e1a2034ee974f313c4a3efbef45afd267474c9f144362401fbe42d713158ec3f7ca80f36298350c8793769ee435dd89229689006424984c4583c93275c7590ef3445330a62c11b72b2943e5b14e160714e58554c45ad2b010abf0e70f59775697645434afb6c8e6d9903bc704d75b7493aa79bc3ac7f6917c92102b9e144cddb7000d59c7c6b089b5905a2738a41dc6f6bc1d8aecf9fd0fe0e7809da04a372f789405a574e6bd16cdfed2e7f5c34c90a7a1e79960e2281a90263bfb1466cacf54c44123691a0eb73c44a5643383e64a0d556adaa71348fe476433fc536166b89d87471baa2a6aa7802c557c8421cb99a8dda7dc7303a0a84d4d6a29f4489cfe70f42c37112a51bdfc4f6f47844a7c0edbea8f86a5db5dda9b94ab3477e12f9b143c50daf8f2d5aa943f38dbaa251164e4ada96c25f08ec58e0f715e83a70cc84d6e398ae4b369ba30730272cac99abc530a6177f6c723b11c696810a1c426f08bf22f95908787d027c16e4db820a1a86f90d72d7ec2e0900f51fd595eb4a35621e68f2c0df87303c55bfbe8a5a6afb4774c703c1534522e12de8e14c9ea13db874bf4aeb027c4da4603e18f5d08a2615e0e7b51019650a4ce50bd38b4251642fdc1180de27409e5296ec9ede1bf2af1227902f6f0cc90a832c1a3a81d2e8bfa01c646bdd7666235f2329af4fbb815ce45f08d8ae01e92b7edc1fd8678e39a1698353b375c3b1bf16db9c9f14a1fff5c8c2dc48bbfc79589000e12cc6445aea4e8f009f2ff7a4c39a5e34c6699fc17811444432de19ee1087b92f9c6137707ff5076a3e922f2c6d8858eb27838b9e84264418670d2d908e5f7b87dc609c9c9fa84d4446a00f791168bb96ce69bdfcb8b2d5a104af57a4ba4c243de1befbb3f43e544199fd045677217201165c14dd4ea3ab942d18485c2d1633478dd4e21804f481b8585382dc034069094b2e1652d728391653f27cb244f18a639adec243b88d9f5494e36747bdd0c21982e44bb964ab1ec09f290f6e0e343328e793a3d0800e6fc91f022a31ec179a9a1f0112ff3e720815f6e9eccf815226e487454d66ee307cf49b160be0f51637c82cdf2e4410b33dfa3ced560fc97061ad0413c48e016016e98d41414e0ef5542bc89f9ad7b1b57089c9cf576fc453a0cfea21e3fadbf4e415842ecc7b378767213bd7ce20141c11c41180bdc4c82e75866b08e0dea3e52caa09faee9cbfcfbcb1ee5703521c5f77b9f354b4cd6b8214df19fb9374bb7e282c39857a8aaf24ceac15ff1f9c2db912bb1e9cbc232d68834d34c38e3f9c28e5215e75eab54dbbf7c6215a27137872cd475c140a81b26dd5f478b9d93d569b7e6c6b948668207c7f72954526899aa674ca13ce3cace8d7ee870a7f85f96d40a848cdfbc0e18d6dc9799bc6943d76eb6445a49d9ec8d8e672eb7f6baebc23e2aba1e2046eadd0d02fd84203c4e1498fe499898a8674e32d5132005882b0682f4d3c4bd8dea30882864c35916f70bea98ac3e86c7982c5fa62509ca20d7f7f26d5f881053ec6698cecf790112f1e327c74d6c784f463a444289706f115f61cb33e2ee2d3c1e4f12d8aa98f460f4a763190e6c2bae731762e27761526a6f5bfc129e1cfee7084d3319994952c54ead9c8875d985eb32f49993a8a970372aa8407db350909b05c1b1e6cc94394c1ad3769687c8c082ddd08914207829f62ecd9ffde3e36fe33b1b96b50c15b5d809c854d02f9456c390a59c4ae32ed6e0fecd252eec9e58dbbd571d213ff848ae5b7a48d97e895286018129a6e59390ba4c4fa0651e41a2b48c1698f723f61449b1fb22268bae8fec9e0dbb602d53a0b632886e262b0ae8c5e35cbed87d0e373d6bc15851498856af54f258be40844bd53809b541e7c40945300d0a6897cc916949ef4b2213c8f2a73d23a8cf48c2476867aaaa2ea60dcbf88cc52fbfeeb359c5db9b35530ed9376cdd73d1ed285cba02a4dd14ec4d356c19b8e58fa0f020e2d2a1020bacfb86b3fff36432a68efe593d34aec302aa87fcdf1752f35e6964648224eaac74d357d58d57139f80eae2c09c2c4a01d4175afb2c53c40fe08a1c23a63fb381ac0249fa202e65c3bbbe2427d002c5b5b99fae242e2570cdbe671fe3339da8a7979651ee7603a24e7a2142677c2a488d284e201a931b90cd60695e43dc5256608b071aeba6c322fb19431dba07fae4209b072963e99d29b8467a412ad52474ce2011787291086a4c055673b6639def33298070bc9e188ddbd5921194757821d37302d90554fdc371306e668cc333ea470f336e3af4d707ee8ca4751d645320df60fc812456113f6a08d6b12332bd25bb4237fcba8db4ab37dfb84b2ce670f905d4c78008a262a494eebe7c0bd8b8f5cd2c7862053c9377385295311abd639b2d74e4748ccf5bed8b0a94ba4673866e23f9835d6c2d8d6611b85382702bcbb4182da6b5fa44b5fe20cdc92d50d86e27347454732198a142f0853ce1b6c6fd659bf2597c652db8309456984987234c49114d188cddc100259f6e99e131448b1a919a64785a23e05888373cf9dbf3de62da473342ba03e38071610d4e5aa8d5e2123096eb07827e5788f5324ef327984e5f1244a0f230f8c1a5fa5568e59c1c4bd800a72e485ab3fc9b5b71c546d84e3fb7dc2392f6d33faba2836eed2f97b9797151cce1024f3486d96ace3928dbf954a59a57ed4afbafbf7dd6953a5064d8d116a4b793b08244948b92a07f6252a6f0a757309d6248b8c50a72a956dd0383463b61d0ee89b80afc11cb336a3d2a8b58189e9eddaeb759cded0c6aa6d84f23e26691ab344a4597699a5380ae4cac33532267117dfad12799e2fe9b3cbeeeec3f3f4386b1164d9f8c14eebfabd77b28d254c7c63eb6f29518620aa6df2022b40a302bfe003da23175430b6645d135195a1f302430bf900695e0ee83781c991268a4ac9b0cbc05075c74288234d9e4d835c467c52335adbf1d9c26172e50d7b2e17f33f4b2bac14e9c062ba27432644d4c62a4a1a2ba2ce1489f0b8de8f4476a8d2c57eb0028bd90b7b1212b0d19625fb7a56616c3bfc8a9e090a15d0a9bf14cce5c1d12b3065f4580e67b997f76110e6a46e3f8b305b4d3a185a2249175a160dbed76e7de7ba98ecb7c187fcb1c4b8a8b55bb47c97cfd69e42473d820d37b6a1ae4c52c42b71251afe9e981f8f6f8c6e5b7e0f7a4b60e6bcd0c2bc09f55686e66d05d0ad3a240613e2e817c866bc214e998b2b361cf4c23a2acd92f44883cf1ff6a2b4472c4b0e71a0e2fe552a860962b6fca9d9e5316d416f6e487b2d6001570129a7ebd7e71c154c7fc4ea8978d50fe1afb60e9ffee25170f37f3e77d831e7e288bfe88e144cb9621e52eb28a80e5d5584e2e11b771a5ef841f2253f867625f2407237ba939be39874b1647d97aef74e1a7befd5a6cb82521a0f0cd00d11d12a2ede1e7096ebb10d1fb20fe6812e98bed3283de911c83da4f139d79fa54019848edbf78390dfa4c541ba5f36233fb7aad2e24ca3a6447c3d8f7f84fe85c0e39463b38fc96f016fdafe6c2bacd01c92c06084511e96904990dab092e66841a4baabbea453000f2a9da98b35d370278eec9ab1eace640f40c68b7b5a9efd46912409b01f55273c52ba46c0a2be24b45264b3ec54dd5193f87eca2146a2ee5431297f61661726db16262f99db89028716ea642bb9521ebee086cd2c9ab47328fbf8aa3a85ddc8a74322295fd8db81d8b5ed9c4e0b2291206b804e90e1466e9c107f109db91658d9e5e1a9f5a82ceb563e5936a52127167df98b2722cf9194e05ae9be3ce6601026a4367c4dea1cc6ec8938200cf4e8eaaff65e44149d5356866b72c93a4a3f4b203bd2695ab2c12c103a791a773b54ab3ed52f27af5c7abae03396369c6ac517353c9bca94bded091d3a37cd3688ed4e01c0650d382efc74f8297db6a2e897d43b909c8f22133b954daf036cedc2d03a0bf9d69d5258756792035dc7cba2bbf0e861f9758980c9e7d8ed829a55d52c0cef59b907de99b869f56c190e772f90ad7f40793c9a321a6fb59fc9fc1cf3eadef7f56eb53d874c6715a74b8b13c1be333cf810699570f8a9d7faf735dc4ab80d06850b6706d4fe25aae6fecd45426b1848df7ffdf311e380a846dcb701caeba460f43afeb7104b1e2473043ecf4d4a7623785256ebd4ab2a11ecae93bb507b566ad9a7c865988df3a2711b8ea68e51fd9c6c4ed298a89994d814bbf02f4d30a523b99bfe44080188a0d98354197394e563458aadba190e1fecf46f649e564d8bb0e4dafcca059e8a93fa61a6775337624dc17d4bef79ddf1f5b6cceac4c48e4946f00afba88dc2e959cecf3a5d01a0d31894a2c8ddbc3bf80992d7ade9a7369cfbbf1074197e4cb83d41b435f3d628d1c543d1b115828365922b141b89a401d8e46936ce0cb4d81108fc2c32803134324afdf59cb9073d4a5a0d179180c95e0ae563c2570717aafad3b0d60b763fc614258c60dfdcb195f171e0e8abfc8d71af0e26952c92abc6fb8327aa75a506ab3e3a93f285a51bf817a0a3dee951a389a0268510e8d0df7662571d6aa5d5bc905485fda337f25c151c5ba3953517d9093d6682f981eb3e9fd096bff4378af9492a6ee29c8fced3484979d769bbb9e9370ce897519efe9e8c54f0a7b4077b80ee2bf349b7edee1cb51d97bc3d4282349348c847c1f805c6dea15c94254ec8cb2ed695244235e94dff13d71bfea1a6bfe5559d7b5d44f494a9dc83eb73d757a264a6aaa9c4602e275c11396ffa16500f88ba3ccd93bd50e3d59e10c72ed320720c6d878b37165bb6aabed37b69caeefc2ed34beceaeaff276365e6e972ae86a61e3c876cd16db6d744ed75ebbbdc6e8d99595dbb7f16c757d6ba072acb52a65b6d5d563ea1787d9c9d7904770a887d835edad4f910611656009b411d85333da4ca802356d19672c0299c42c5555f28d259753a573d53470aa0728ceab04c74a9b713711c74c32b3d681ca71627a5ecddaa59a8718d8e176757b8da8aeab546d3b8dea9741abbebd8d24dfae2928039dc4ec555bf21a253b2b2fa5b5b655f24b09889158a372a619087cf886659e12e428573ae1a4a4ce66204cf62bf7876751d1e419b356dae72edc9cae8649e1d60fc69c1409893aea9b48ec5745623018acb629520eae8aacbc0b4712623bb34041d76ff34383333e60828ff9b3e6b97baa672274133fcd44e4f706156c6711282d22b88236c2aa27b9d78848e2897e996fc94f4714d212414d7c98b4e4867925fac6271f5ad98f96237a7d24b2c912e13cb5b88e385ad18a5eb35b27ca43789592c2996934ee72c414f53a175ca161c4a24f0ac650d9b376c757fa43ebda69b6a914104169f2ee561c8c10a40c559fa6e1a18963d6e64be0990a3f154180a699d26d0701830841419042f1e02736c1e9ef11e5af3fe08b0e2008f99c8a37ba38daeae56297ba21a58f85c485fe927bb8407651f156e27e871350ecdd1111f7b8c15a53622a96b80de613ca81fc395d5c0947b708d913ca6251e8dba14b3815e8df03d754bd690b108c88da7c438e863a297b94f8bc99339c70c520169980b3f159004d6d01da0db06f0750d035cca29d1a06487fccb634a51a5aa22ff2013ff3f962fbc5c332ed27da6f16b16f33df37dc0b9be566796d81d0569c3670bc6e880255959cc62325c8d9f7dd6ef64fa277cb9c8161c053c4ce3d149ecefb2418fe1406e7d4de1c96bffe50b31b6ba36e1a71eacc33d5e10795c4fe21c2a2c2b52a7ce05bea615ee69c125be3544d94ffd7235a6a7c8ea3cce5d5caa93f97be5f8b812a5f2cd28729383158d266248624c24108167fb60b5a2410936b25842031fa6224fc8f5eed1e936bf25dce59bd984b3490c9706d6236620d2f2d65e8737b8867d9c45c5ba5a614afd61105db8164d06e35d26a3c6d09edc12fc59b36d57b4f93b6e91e1cfa85fd8ee9a38fd3ecdcd0ebfff1c78033e250212ece2cc8860c3888be1e8e272ebaa6fa5e6096f390627eef8e06cb0b3829cf6df4ce4b7a7e4492735a0e7ff87d13a40757ed645aba85d3b107bf2294fb7d7a2d67fd35cfffd566f5238447f4e9c695563829003e103cd57f2586e34b3101850b70ded20f34be3cd0a7d3f2e9abcfd544a526ab0d6ba008a01626985742d524202c9456701329ce72f8c1d5a1805ea9168ea6ae28eb428c3ac85200590ca3c8eaefd0e7099bf312f2980ddca67f9a3ecf492bf2c79c22631e111341370bf085f7159a38587a3df88c3b53d20283bafcdbfcf45b1cc9117b815383af7c95582c5b0ad9cbf69b424e6993d139f865afa2feb52a212a4242074fdd6de66d1199d00d7faf587cb04d8f47df1884332684e772313a8d66ee95b07923868f2286ab6ec29d9e7cc7961e436c442a78613c70012d71f97e1e571dce880b052ac58f9a3411f1ddc98eba2c15b1d6c9614d117e764c12c15a1d43600960c0126e497e3f50bcf857d859e2f4ef384f10488b3ea920df2fbd76be4daa255faf1f0b794e505f1017b049ec81869d1c1cb0aac2610729abc9b568bb9b9473059143c9e6bbd6801e0277c0b89b0dc3a0064b816c64a0ed73fd8a44a66c065baf1e976524f8b2751fc15d287ac3dc79bcec9bb01f6f234aebd52b91a6c7bd63082e79c9e2ba6b7afea38dcc5203da405f916fc0495e526b7a81c8e2fe50b504db50113701bac2023716e76f3c79dcc24933b7702e6aa9286b67ac2c678da19a8aa680befa57cce26d406fd6cea6bde77bafcd6528ae000c3f26f8116c23ad2995e6505bd601683317e13720c14be989bcd03e101ccf0e843909f500bf5b8ea6db5adef0f1e8c1093c056b6898c470d00d056fe794a5b95beaa4f3fdd8ee3a50d0e046bd00c286099b41680185364e014f0ae15ca7e2f55633e1821ed88c5a182d3b57298568b847da56fed2ba2a0e71f21a5782d6d80d5b8807c2a2713249002df5164c378c6f5680f8a7bda68c5ac3ff80483eb3a89cc046abee251d4a6db545816d50ac4b72dbf6fd3e2e3a89d198d1ee3fadddb979503b40b714407034fcd88a9092b1197946d05723fc74f8699dcb17f9b1a9f09f3c129bf7e254dd7aede69a2360e724cc39001236ff16de998c8ce19b63945123dee68a12bef84a660eb773de60ef1383eb3f471ec4b3ff68998523fc67dff8a639a63a7ddc4b011bf3c090f86c580e4ecce1c8dbd6822434c41741b0405f8b661d40448a4b3b795742883b157e4ea1b2af3a5ef851d9d707d6b025748fe3231ae75c2252410e2bcc320f4ea40e8e9e8844e02ee3492e9645fb4804379722905b341241c8b4854f571c8d8543c9cd90bcd3d0024fd8c512dd055d6288ba0b3c594c2b9bfb09951d296f31e8a9fce2057605920d4416291b6bafa0b5aee30393420e2055eaa44caeef58abad66b296fcb538c09e48e415b5a7d3640e4a3e968fba7ab9b5bfce72234c2668b656e6d222a6ef823b513a9a512c387b3ad4a9060e03c2d87e44da682682a2186934dd4c081cdf12ab7a4653e120915108790028046482a93adb3478eefda81c33087cd159346c22bc3d262dce8b8564c0a3a02742153f062dc247dfcfa0227a51b8faa5283479d677015a52b0e7d37b46c83ee5c64e303dd291a9b0bc1d2f7a1ae4f4526853a43e9dde7ca443725b0e39ea21f28c3a2ef682c2f7945334afdc7c3407d95a9c6210fc8a1b4cdb7ed7668804cee4abd2cf799aced619581b653cb2fe80c735ce6cb784410513a04788d65e26f035f737661025d470395d3a7053dba87591984cbcf78317401776291d994968e5073ff6c89515e9d0df6985336c5d8d04f4c82e3c8c3bf9cf1f12b3d54f0c0c89f8ebd9e71ea2a1c9cd93440efcace76e6613a5af2c244fa9b21dcec55c3a9f9514d74f80238429d9728772e2eecb856b4403371b2645dfd6de9004fd17cba724484738bb3f8aa9ff2f8d9b34fe134942f9439903254090fb8d15b0aa7e094cbb5a6b89e0324e52321f28ef079e20cd2a91519ff0171b3da36cddc642db4d51de3cc45e811d4183372847209ea30f666f9cc263c446357252fd99838585cd3f12f1edff94e83f3f3b00c90adf7d9338c60911db51d142c5d3441c1b739e3a5005ca612a973d90727a35cc657f08068868a046511b224f281f73296a2529452fd34172bc90abe620f50d0b74c4a60cc691841227b6ed2e9167a8bf9d72675f938da5a9739be8349a927441f9f7e2eea2c53ac635129a0fbf071e08ee0e413dd4221efbbcbd0554b7ce17c74d08dac4291dc791617ad77fe267ede3788e6459eabafc2baec024cf78c1b8cec0e41762a5951695ae9e77c69ebc595e1b60e461644c6a6259e188a9b7911277982c018b7168d0a765a8df5cb6fc814d3d45755cfd540c41d6e60f180358e41288f6c0decff364b977c5990f7fbc2540a87fd35a718df8b868492c2fd55dd329017f998e044e27f4edb41cbb47e4f2f2f7551324bffd7c28db57a7f6cd7bfab190556e20bf21b078643d1c44aa661f372e8024b21732ceba24d273819017730e68fee3b4c2249d0003be46803b6b264275b32dbc0e6431452d0ce374e398f1ce7370c5da080411d69dbcdbe45476573612884698bbb27db7998fc55a26aaabb715b3972a518aeb75e484f0d90319442788e73295aa44fcf2f954b4800bb9c6058eb8000f1fd7c2ec03ef1430d81927655d80d16d8b3e7474d7b11e4438c78cc16a68ec708afc1f219d412ab154afead89312b7debe9ad50c8515cb67673eb30613edd3951a83a3c28ec50226ea7941059e0f1280e70e45451360628b08da608075020b24b0d791bd388c6bfdfe19796a2c887302ff9ad3b68e03112cd790b5aca750ae5b24e8f85abf546ca3f8064490a05dc49c78f74686b6975d0199c25c1f0c6cc1289bebb851fde86775e64c2e45a4cc60617097990e7680672ea4dd5ec92ba05f9f62a33a8068ac3903f642fd400f5966f9a27924fd5954facaeddc379789096aee86f44eaa54df11f28a4ac4188f90691497d02a89f6331d340d57dc3a32120124cb4275e3c0d1bbacc7e3cf30cb714e81a4e7b2cf9844a5a01195e6cb6ab35057f5cb6409fd7b0c1608e805080740bfd6ebd3dca712a1403e1873c53a2aac885b198daddec1646453839de784bbadda79b25b75205490697bb64e61c7b12173d6512013c2da100813da32a676dfa881cbef46bff749644d0109768a47f43cf5b6c684d71195326eeeedc35b92c8dcc22498c2442061e745d9ae071eb1f1846892260846689d94459f1136f2a37c09363d933e679a9c3332fe2ba51d704c3d55e2ed7d5e4a590ffc929e9357e3a3fd28dbde855009d06637f0d0cc81bbd4bc80da9d7c026c5862874a815e1c5c3394bce12331d72574c103dabaf28e5a2050c29a0eb79634e1cd25cd1d1d75869fa9f0e31a646f5c1e2f67e1472af8653274276a9b2fe5d669f553b91342db870e4c197103a1ab23988644ed4c9f539eac7a6ad2e9179c996776ed97125fc61074dbddb6dc5bca94640a5a080a091309b51a90c1620b59738b7489d2152fdb96d4ae6dc9d365db12a68b73d94604c6edafe1d86b0ad1105c7230e28933b2ae25b7c63a16b9b2eb6c445b5ccefdbb16d0952d227eb9505a2175f0ed7a5dbb0e9f03cc587eee28a5ddc42399d0888866702227cac99139dddd9d73fbb8c6073b0ae92937c78ee368f106563e57e629b536ab5135aa3fd426b5567fa846d56868682889509221da91378da35118281d1282a16947fdd44f59b453377516fdd44f3657ec085ea091487b8df31a15e12582d7bc96e4c5a44da2a964d22651d2249a4a29ae4eda54d27534688d59336dcc690347bfa72a0850dab481f274ac558b7ef3dc2208daa85113ca075bf62b1a27d1fd5293d6b04ff2a0117ddf54ba3362b0aa49346df8beef390f0499c1702442a70d92c7283be0a0fbc26983d4c19c628fd54ddd346d98b469438dae387c8ca3862668ccdcd7e52532562e9927f72f2f3d0d5daeb6cb67841cf7f629f5bebd07e79c5f555e7d4e75c2776728ad504160fef7df6cb15af4a3956ddd3caf68f45c2a5f25cd8cf2e9569857c9836f7fad2f9f1ad64f74bf5685c1a6c21148ac20ecced1deeab19aaff5b99ad6776b283bf91cb542ea90bfd354c543fb3fcacbdddd1b87c9ab8b8f7f36f8f5ed988853be7475694bce861869b1c86a06cbbfd312caa17c3c018be3ce1708b6bc1c823835cb8fe3b5c5a1bebf4a99945077ec994c16c6f257c6f14cc074f287d3a19ef48c867cd54a062b9f65cf644ba09645fa76e8413b2d5b02c99bbff4bfc12f6ff206847b77bf0c01eba6d0402ee510c7fdeb72af162573e2831cb53f1887fb9f16b9afb1821dc1cbbd0c7a192485e45007180c0a1c601e3ea40eeeb907c23bbae7deb274749c7b1f2f1b525c4e4aaecf4ddcd4d5aea3a0a45131aa3b4174eb77de3bd495fda4c1b428bf9b5cd75bd73db87edd9f466b464bd5aa21c3caaf59692224d6131bfeb0584ef3c2760a5b4c8b7e5d806ad77521aac5ea5c34ad4ca20664b1e3744ac17b22f2d61f27981953bdecbaa72be54f26300d4bbdfc2966368de11d1ff8dff7a9d60886a39c4af5bdbeb352f5e66d2e39949f994a5097c8cf744c35896651bb46a74da5a586d5f0d6308f772ca90fc2b33c70ef5df58ea40a53786ab1c605d69fef389dae748a5577b9922257e2440df3dead20d9fa75a095165598b2a8adb4282711e3c814ba2722a1640af5251ade315fbedfe053ad11d0f8da1ab930154ea71667f8d7d37f3ab528bdfb9d7e0aa79916e5d78861c7553f719a60aefce9d4301bffd1953c35ccc69d689ab132932691c77a0b76c907a33619d691b0fc852b2791f4deadb83711d3b026958ac753bf74a554ea5a528b4c7a92efd51aeb1e8c20dcb19faefc06f3c9288f39ad5df26bb5362aca6914a0599b12ccdbfd0868dc2efc13ea776109a48d04ae17a6e0dffd6cd97c3f1291b7d6f7f7291d6359ab6b799f924cba5236acbee51d7c6badb53ee7546eb102e1187375e71daa13dcbf56fed473785326f8c836c8b9ce65d4164cc02ef95db8a24e534f553c435a5cb528532dff799d0b2511e348cffd9ddf0bddfbeebdef9edf632fecbc6519078586d908e96e09fc0209429b670d8e16c1ff6c522f898e1ac6452d1ac13be49646025b3e5a3e2d8ecd4346491d4432f5b55acb62492fa479adac2ba3240f492475c8976038b6f466bce785468064aad4efb4aa8544f54680642a22f672bd974e5cef3f222f1c818eee28846f1705aae7eb3eaa50f55eab0bc77abd14cc3a557f6d8d7f9100cd926a34a1a0158ecc642c009231d71ae5962b570d633a5b3f1ac660bc30fd68912714d804a049f9d2fff3969cfd3746406259f498c76a2883befad59ab2d663fdf360c1d2e7bcd6c9bab325e3f47f13e81e7541e37327727777777777777777f7affa684ff540a1639266a6fb1b9b1b1e3c0b001d70b07af9391a66a346cd5b1ab0192fe5f798e0d330faf27dfc742c7cf9401aa692ae3a41f604e03ff80084247c60428b2a7cf0de479226699dea5df55e5f82f0aa96f7b31580fab5b89fd1fa9e466bc6db168daf69d9afd1aa791bad1abf6ad9e8a0c5c103a0d5c1b35a00780f5aac0ffa76df8efce87e14bc6981f036ad9bbfd1b2790f5a371e6cc91bb682a004e0597859f837464062e54ba48ef5cd5d1d6bc96ab1f23f4a34ad1fe50d6e67a65ddd5bcb62990147f182e1286fa0783f68f15585fffd08865cf0a9ea04950454efaa577df00108ad3e138526002dd7a28402bbfabbcacd686effd84fb753415ef083d6072dbe0dd5ea3336adbed1bd072d9fb53ca8e5422d76df41cb873868f9aae54a5a4ed4f2a2f65a93168dfc09929516935aec3e6cb996762d41a0cdbc1c5292800aa4c50e6bf5bc5a3dabc5caeef6267882d79d7aef531e4fd39aa8bbd66d74bb36c33ba0cc48242e988724827574c13b64bd35943567ec98f372af9db35edfa75e1e49a486253578d4b79a283be65c33b7fb6fd680f2481ef10e300d238263d6d952b99dbc72bb974cdcae7ed7effaccb16ee4983d73678b5c2cdb6870ba1d4ba4ae55f2d5a13c6ab15bb5e8d3217335ac167b488b92a9d6d05527d4efbeb1046acb3aebdda63ff0e1631c23a7d33196bbbaefba8be924ed28815dcdeaa5240fd5f3f38cffbeef5373721c5d6a912752c3fabd9f53eef7b504f3a67e04346eeafbab3adff77dfd9a6aadb5956aef507b87da3bd4dea13ee558ef50555feba73a61c6f77d217f9faa9bf4526b69a47e72bb57a96c4a15b6924f9e901abdefefbd0eecf11857fb812d7941d0f3ccd4be75dec48bda95dcce876ef7dc37ffeec5ffdad5ae7677777777777787aaf00bbdf0f354ada4c5efbdef542534e8551b4ef5b2e5627c8a2375f7add430ae25e07d09e4147a626b6d80365425b8ae8b69b19bfd33be3f355f82dc83f5bda61efcbe7e5fbfaf9f7ff5be52917474bdef2eb5eb7dbff7607d3ac1ff522a1b0d60ae012edb6830bab70b7eb5d13e11c0d99af189014288708071a28a18291255242a49cb8b7734d78044f9f981c28b73401c5c57ac1773bc7426cf3af9e8090d07efe81eafea1499edc4a0d38304560ee358cbd74602dd7bef858c434509a7c9f61869d8687d08e9f1f90124c810227665428bd6041f137a5889e66571934256a25a885654333a424aaa9d74a28811190445012a13dd25853a176ad89014ba75e9b2a86a502e20e2e602a52c5d0d27275eaa8c112a820190942a3e0c41c60e33b881c999da65db191a1863eeea0cd3b5676eb77f7543c36606ddcd4dc8d02ab0863084fddbdddd05104f2edb8028ba205cb619a1b99377f0fbfd6804b9fd0af8c24a9ee9139c393558762d2cff278425bdf85420526f37ab977a4c6dac9607b7e6d2ef386c00949d4fbf65cf70529fb38094d5d0881199cfa4985a592c8f51197fd7b043fb35c82c4a1e2c75703f1ae0321677b471b91f0f70f9bbc6953cacd4a1a2c0947d616d000d6c118fd5ca7dcaf3c2dab5660bacff0c721bd0a0d58a90006b454e1cf1c2af70504d5024e54006cb0c860e0b77f9ca0d70e06076cb218923221a0e5c09cede0ae8266657fe09d0d0e0ca1658be88a106202857e010c50b45849184c80ad26c48be7c16ba9236934666ee5885eaac616c3372baf26b50c3e4ad4357feac95b50001050a94175e5ac0042f0d91040e5e384dd18599e9e32b30805a14a5998c6ba5790c004f33ecb004083337fc20935f893cb633831452d06c4103961864f2ebcc63ec4506a831c4e8d043145864f2ab90c758cb1526c2a09141922c4932f9dfe735a8ebbad9e55a755613d064fdc73abb33c480155b6757b66a6dc2bde438aed6d9ecf2f4094e06996b679d12df02becfa9f472546d3c59c4d41109d231f9026d881129d43009eb806d4128b9fdb2e6d50e36ca283f50904134b9f5592dca14baaf3f76abcffdc7daf193af72b850b3372f6f07976d403cc5a4ac9feb60f32715eeade2dc5f3a49812df60f45a9f7f6d404dd2d38ab124eac5c69738274e5ad91c5d6c08234724540170bde8862fbf9fa0861f6315bbc6247bedd1863f98e7c8322e263a62bbf0b0e485786440cf0752fc17bd3b0ceb2beef9f6123d09d2a9e0f9cb75ba9ffbcd84c9acd664d64dd3fc352ef799ee77938c012bed0c6fbca3c2aa4fe7b56791d27c6a7ba8bc341b242c6da3fb2134371f954904fa45eee19c7276d24c0df7d5fbf175664479d225c67413a1eabb55acb6231d4a5ddefb40aa9f77ea7a5246ab16bd1f72848bf5a96d5d1b9b47a409529a53aee62190e929545a154d222fd9c212b6b330bc6b20217aa26db0f487dd4448a66c3618c0d87295856e0624a27dbbff364fb39b60228f2fbfd2b92d1651b12d11d75dc7ed672d9560498fbb98a222189b9fd13bccd585c29bebbf8c7ff2944747797eff2a54afc166d3fab9ffb6bdff0f1046ccd95d787a2fbc1655b1334f7a3c138b8e6c51a552cab457e2ea30a21a8208992e596854c364143c54603165f60a84126dfb25e4c7c5cebb2e4e9ca908833026a65210c8b65ad3be7eece85328cdba7493ed6930f2bf6621c2febae2e42a405f699b7d7ebf5a23ce79c73be4f1da4980da062fb29df6657dbebb819be08633e567dee3f9e5f188ef6ba873cfef35fc8ead210e8e69097b3813fd789a916cb5dee77bae6f7e8d12e7fb107f7634e8fe98029d6aec497ce8ed5e1cabc9bc13b52adeaa776328cc2e67b0f328c7bef99bda72a1ecf725c68c33d5f1bee5b365ce823842110e0821668501446922298c85c8c2827324bcc6e1043ca05a4088164091256868450e2c50644c8e08b175aa290f94bd51215608e8e8c31f385cc5ff4d8075e70c31393a32b62a09139192d9ecc9e98bcd0840ca866c41751d2b0200ca73264feacb2b1859d21b784c4a3725fd949c77ffce020ede387939daf9f1f2d3aeb3a808a1df9cc13ccbf48c3e6d73355c8bdcb92a1eb2b90f9ef780cc8c77f1c08ef78ae355bc9afce2b8aa53f4a04b0cb7f017cc5fd47f1ba02a4b0f4abd3a5a18fc9cd2ebf380259c67c08509f16fb81ee6bc7bfc7ffe5afe3356e069f0afcb5b66a8b48bdcc7272f3bdfa717d8e992bf71ef3b35a5c7d8b528ae5e7a7c18ac1025cb63d51e5825fb2b4015eb833b22475dddfe00acc71d9068511d716e159c858a20ec0869b02a24baa7af5bf384162431945b8808c1819194d780c404324714a33c41047d2605985a91c9d1eb727d275d9f6841577c6655b0f39dc257fe24fb6b87214affc2ba7cc4af9553e4bd6cb5c52b582d1810a22ce7891060a9313515018ac70c117525e904203941ab25abc49a2e141a43ccff362c08de1eaefc85a81d0e2030269da9aeaa469eb214d93a0db36976d3d5c71b9cbb61e64907af2d5305a35f19367c6891421fc2499e4952f59af0ba4c763d667fde6d24f82155f5dd8f1e6ca9bf95376d131ab1dba6ee3610a32d71b26bb092e5c664c907e0dc11cd791b85e1d8083bdf91d9cdcfed99cc4297d9277dc02304e4bb9d3e3038890179f496262277e6228396163016eff28e6bc0a208ee05052f097ef21092dee304ecb6c6692cfcf4ecfbc69b17dfa7ffa77fa7ba6181fe3f851c1cebb5f4184743702f903640140d831870a52509f0529ab5f432352062585f9401a96e3c53bfae72380613a2df26071fedc218171e6f380f1b03865879209e350617f7c7c348c09ef485dc98471267d9f8e25e0f683c21023d3e92899f4346cd4216132993a0de3a5a62fee08a18f16270518c787713e40b2364b4082f8fcd016eb86750312c4e78755354fe9f3ff58f670ce7153879bfe4ae20dc79c73f6f87471756e0eeea594524a66f1d562e3f403e958026e434ab79be6a4a1ba0439750962ba5248d29ca54fc346e6f2435b0001de41e9ed6918db6a4cb7df8486012075656b042390b7b63cc6e95f800f76e42620b27d580529e89e052993f5bf7c4001fa310224eb9ee5aec6591ad25fa41f487f90feae258f68834942d6acd1c00f4d6c4cccdcee47d67c1338aea7617dfb71f4889235e478d998c070fb75761ad6c16d9b0e4fb7dfa7b9d9d9868d5cc5ed0ed37514f496bc3285f9608b25ccb0ae5a948c5363f5e5dbee3efc16fb06e47ad2800b5740c3aef92c63c73a5b0172b2ac65938d05c2d4b38ca37010aad5abd571f86c2c6044963992a53e0336f23f3132239f18d9f7decbfbe12cd93f210ba6195c3152a20413a02a696ea8797901972b41b2f6620b1ba8a0c9e18616a06424b8708b12362a9eb64a65ea8dc95bb4e48069b9b285852d362d2f5cfa1e2cb174c6a550374bc5e395aea498028b10961660a9228b115788e0a1e264a14b171bb203158f8fe0ea893bdedceea425b73ba98adb4a80b9fd1ca878faa948d9c18559134f432c88401193344fcca0850a20280d4a367c2b255a908497db6fc3eaac60c79a84d0a55bb6d440a7f59c73d6a8787c8e9074c79b01dc11470e1e77ccb9b4c7a5205419638589952a9008424289248e5cfa5c05cba56f95be38d1a0512588db3328a5947629fd1efa3e7ea8572beb57a978fa015085069e398f6c2cb0e89c73ba4b261854b9fda97e562b0dddfeda6c364be2eeeea978e6df717533c21d73e4dcb187165e3a220c5808977eb53d5cfa2cfa3fc4a52fbea08b4bff05e5d2d799f2c5a5bff3824b9f4ad4a5372896d8f275475828be54f92a38c21156d2dcfe69794823268d0b3b7c510609a0222aba101384d0932534d019b63cb9f449e8f1584e8e0863ec989323a3f78adbd54efa2c1ac51458ead2ef7913e8fba054ce1f2b3843eb1c18d144b506c8f24916d8bedc458619344820aface59801e9768ef432fa4cc3a80c52dacc59435b39779921e836785bbc9d33dd2f3f04fc35e0048499edffc0b4d84c2df68d71baa7b8ab658d067c706a916f00cab0536c05d95bbed33edbc28a8d13ee59567b64111f9d13d6bbcb5ddd8ff5b2bad6cb5df2458eb674c448797259e9b28d08a74b0498cb5d5cb61d61713f1a1ca564a54fbdfd362c81742f9564fcdfabce3cd6e3f78771e4e34429ed44bd8030d4134371d410f94580040982420b088fc1450b35e8a2848449104c9260b183930b5f66902a1fdc771c7d191a913229e551cd42f27f3625cca75146196594219ba10a3240431bae524936bbff87fe0c8dd8387999185a7735cb9f65338432fd3fde7ae9b8abbb7fa7a7c9c57c8ce3bb47c097dfa75efe377b041beea5cc8894cd78d5b38c8696a8246148295a0209900e52a0043911031cca406246abbaabcc8c7b96947668e6317944befc2533279a318eac36dc73f7f29ba85ba8672d06b5283f0419f4ac67aaf761b94bda3c405e275e0865ecefb4735cf7755dd7751cd735d7eaff40f95f4b42b94b3e4d0ab94b7eaca2e128645ca92ae0322fd441831d7bd6d58ee35677ce50c4d1a2cb4248b2954b99295794a185134b6412e7072e2bdc1075c3186764f2e54c0ab1aa0253b6d33afee5312024bc6072040818c6f0610cd9a5018b282b96aa78824926ffc55a6d908b29be3873798ccb5378116501c945666381f9fe1eaa80fe0c6df859e6cf32a9f2319d5877c95749a92463d97c1ff93f2de22cf9e8b84b7e08657ce4ffc8dfe9a9f164d975f8faa8a774ad8d664d06098b4d048b4818490711d013a8a3a72496ecd0c20bb02a90d0caec60032f6835df3d9b6af4b98f1887fe4ee34459fef2c48c192398829802872bb4b8c1921a94b8410c941b530d2cec286f37301d4b49314753cc5caa84260cf254ef936e89d4d24acb27dd12a9a595965aa6d48cee90dd71b2233fb9ec9abbdada6e2a6b52363ddd78c112a9d7a61fe8766823a518bef3c654bbe631f9855df4c3188db9f4c9d43cc632237a631c5a8613504cd1e58a2534533cf680249adc92c2c0e2072c35a322b45c66e2b24d0a1997553c3ea9d088941571571a8e7eeaa5488bb88bfe7d626d3a2aa4453ad9966493f2248f6c52a082d86773775720f5365266e3f3fd171a913296bbe803c97096ec0a5c18c940061947564ce9400bba28f3058ba3a4208a782c15cea492ccc602291b9689eea29f0a6d26cb8060a0c5105b7021b4040c5ac828535184185d92c050a52666b65ea9968ebbe88750e6e501a73239d0608599205800c1135ac8f002449a2d6482782cf5f487346ceeb448e9e350b9c926faf289bebc55afb5ab9d8701e5ee3e43202dd21f774d1b2f7c40df5bc73aa02f99a0241a2d97762d68de58c882ce386a2106b40530940a5d5a8b3274e9cb26344cd7750f81be5d873e2dd29e1629fd072061fb3be9868b97f20ad919581074e4cab9fa5e57ecb8ba370de35fb528c7d5654d795f49765cdd8c372bbee32a2665f23f9ece3ec3e7cffe968dfbf109b671dc0e8588eca10de42882884208708a07c75abbae763785f99ce82ef9abf6efacb787ed4f69385b6449e5631c1fb74d772735acafdf38725fd2e2b4305eb341f9c26d50965ce553ca87405f3941c93c4a506f530414cdb88ddc35bb9fb997966aed9a4f5b4b8b73c9c9d20f7b6964f5973bbfc615763ea5358c12cde8946a59e1289b7a4a27792bd99e5431bb66efecb0c6183b7fa769d3b8e9ddd3e96e854a77e9d2a54b972e5dbaf4b9c40386954fa5fca7a7a626262666d7d159ad6e1a47275dba74e92db0e953817b7e6ed6755c8beb6c0e69513e7fddddcddcfe514abf69d34e6a919fb65ccbcb8a1d7b2679d097ef49aea5637da69778c95790b196225df253a91a356edc08430318400411ae8ecf8ea06c5cb1a3cf867c68f4590b29e16ffea6754c36f550c338215cc062459411949421bf7cbf815a846ee566b7c618db2fe4b1ae75cf7ab915521ab53232148d362525d56851c79825d34d2a4da13479e4463a41ab214a7bda953f9778c0b039a03ce673f3d86b3ee918c8aefea7a7a626262625a524d7d159ad6ec659eb59ebd9cc63f2e9090a2aeab60b5d8e23f35140caea33d45551c06535d441839d41b8b00296cbb9bd92ef4c36e139d598e96044d30d30f0a240a82dcd5c906ab2d9e014556d42882161a7470f272cded1cf38f50af39cadc93873ce3ae79cb39d5b4f8f558e6a6f5e7ce5e8ec80f548899a4ec3f832fdfcf861fa61aa3949e25a93a3214a04114284dd1555c44891a822519c54a5a925d19252132b44b527475392b4dc6a57851222a22222222249045ab0562fa2e8d51f205db06e7054c6a9a2c8ca31417cf5d8e9f1f1c1bac9d1228b25b258395e394451ac591aaa36acafb52da6616313355323f5521fb5954e6aa5be3598b1bb68a2a26ed24277b42ca30120b1d6b6d14d8e65e1105f3a3d767a3a37ea27d6636d64d4462bd6ca5a280fca4acc91e33715ac5567a645ed87694849a8c82c88e6d363820f6b59ac7ff17559cee363ddc5c464697664a61f2639d4b0d1a260e4078890211dd07efc30fd00f283e9a72634d3d1d111830ce132c41c39e0ea865bd4d121e187ce8e093e3f405008328427f7d8e9a1a3a3337b4ac200efe8a8274f464145456844b52647439408125c1027c4cdb827e724eec963cd3bf84a0ef368741a62726ca67e6a28b067ae648ac72611eceaa79274e5b61213f2f6e5f677e12899c2c8a631b7ff0b2799db50d3491051387293448ae56897ecd1232707078e6e2035f753727ba71f00c68ef3480878bff7243093693635ccf2fc7c22f977238a9d3fce23212d7ecd3965c05198a1db4e733a9a4d3d9de644fdcda3ef9b471d1b41cbbc4d31f2260514772a49a1e58e13cc649a4dd3693af771a04fa4da3716cb7e29f8f707fef785a37ff740d7dfeb3b2df5b5a6523ffe8ea75ae3eca9e2a9efad795404080a468434ccdd093b76516e7f0de7942e9c4713a946033fa00163cc135cdc71ae006554c1f5779abbfac9388fe6142874de6e770af43d9c4847642cb591004dc186abca431bbb7a1c2af36826f54fa5fe79e4fd738af7b3ba2310b2a05d95b2d509e1a54b7f82ec21f8002f76b463d04461260aa71a59b86b282c899defe3b5b68334ec9deefa045d72fb5f3926f0f7b01498420ba6228c6061852764fe2c8e81800b1d8cc21c198389309567172a7ba74559d3c192d8f12fe5388ed6742158eb1077511eaed668e087a016e51de2b11d76d1af955a960f450cc511312e17de5862a73baee072efe395524ae9f7d0ee592d521ffa3ff477e8f7d0b4f8665ce6d8c5dc7f73ce771e5cbbd43127996fba08362b9f5716f42f9345f0a5979aaa905904c12f1c8d5cefe5a7bc701661595cd921d79f4590c804a57321dbbbbbef4dc398457fa6dff3cfeab9e466c82ca652332575f473aa12e64d8555eae81741cc164a8e5c0f99c5e9cdea5dcb6964ce291f330f671e41eae051bfc78ee6d15247eac869f1d522fd9edf395ae49f5978ac6523f8b3fc44fe578e8ee4917afe1d92c77cfe1e92873f8b46f7a5a18a022d538575082b71b00e0264e07ad8e178d6419f0b3770c3227daa2a81c522fd7983c2f5ca2efa9f2d61b2825c9f2cd26f5509f6be9c771a99130c24322ba41c402427366050838517d105162b3c15d20bf643ea3203298ced24fbfa8ec026337e1072fd67ab03272b7fbe6566e67a995329efa6c08d3e393a03cf1322b5238b8041c54a5268908a4295838df21cbaa496784528011e517d451891fa525fd32b8a2551bc60b52833690d42de135af812afb29e0596c1bad5195215c71260942a6888e161f5040747d8d44e8f09ac6775408675eb9460a05c16294b3c6e3aa2a66a4c613429e79c57bd2b61cca019c3439a325a9c496521c252221d63607146061e5c304248d6ad1cdaa91bb802addcd5651b18239073d20f82646626be26ee869246fd12618b0859c8f8abcfcab5c5b2e2bfceab478418d81f273eee6a990831b05246799376609a04750dad0f96bb6c03a3030e41608d33b3bd974e0f303278e00af42edbc07c11c66be2632e5ea44d59d6b300e005146358b7aecbc738be8671e6f41fe79cd35611b2a8f28824bd855222f2ce17e2b7cb043c9092cef7d9523d60de99c472eca5e2e0f60793713eb8f26938b21207aae974ce3965cb19b4e5e3ee6e669e4f442a7dfd1cc7f1e4b870865cc3b850f580395db0630e1dad83c3e1485f39391a265f558210bff389f4a5f376f78cc30c04d449ef0244e586a318a4a0bd608588156a4e14c1050f49a034d180cff20e6bb184925a0db214550106688717dc6e685244142ca86202293f105154eba1872a4744505164a0c4182dc8f899f92bf3f30eeb457b630293949c5260bad9ac093103a8273330a90b84e9818534312c91248a0c498a23304863268c29b31f6a6e4d4120253141338386184534b002092c8e7012820e624451f444832358f8e6ddcdfd7add1a4f9f06a55c38d6e7ec8c56f55af3eb54f138e55a4de7f79cf5aa5aaf157840b5fd0a261fcc5c0f2e33f970d3f1a0b66ef7d7b0ab5fca1e614e8b9d9a5dfec9caa1623d7462e363b446b857c10af4b9d0c6021df75d08c5a6b6c885d647c62f5a96b79749b3e44d849af47025cdd23763e8c8072329bc0803894c42014412659ac08286265a5299a131869a90618916b4196a43e94dc73aa0754f8339b7bbeb96fd74baed09daed67d976774f00177edffc6055ec2fd4b89f04bdc7b9ba2e5e07ba5f330de7e72d99cac98206544952ba31c9fe2af325d9cbe5255b0e66e27a37f4b5fbb7ffe74ec1eb945b23d8754fbb1080d7c391088f9c4f1eca81b3357ad7db6ba4b17139c52d93946e4cb466743465ca51165dfee60f1a52e20da062e533353df9f4a4f441d049527ac91c94526666071d4643e9eeeeb57ae62ee747e2fb5e57eed8928600a458f9686a77dfe0e397ee54dd05e52ea594524ea91295b4d89236c5f28f92f6eca22ffe5c7ffa3cb3e193edcd715dadc138d4c60882eb2976d560172d81641cfa744e6e524addddddb9df71e6269ddc5c81a0ac31869d2f79666a494b2ae59c73cec94f67f2b9268e057157ff53f333cf180a9467a25aec97502fb0925db37a90a7a7a7a61983962d7d7efc2c09f495610de374356e1702afe5b1ab4604d79f5d5dedbcebec724e90d2212d526e752533f3286475fdbb2ee44ac1db5500447450f5b0465929bd699fcd9b64bdfdd565971b8051160c0490b1976d5f9e6e1138eac7a51a064afcd5ca498542b4890d5d5fb68236ca91bb8c182292b22190ce10c9a03045e04bd367fb4225d5de11b00b5be3b2ed8b931938d89bcbb62f2f64616d5cb6dda2227083aa93b95a1b775eb6dd8c7868f276c9ce5ee4ef493534edeeee3aab1b1e30ac7fcc875dfe2f76f9c7407777d759b973feb2c9bdbdfdbde9ccac53ac2c1abcf4a4bad2091f6aa490134c336e39a8e41427b2b8decf86292069864e1ce174b9096211af7839c2cb184d5469e2064b618800985295eeb8e2d1858aa55a1726d7bf591c934ab2eac94e0c1d3b9859e18a2c4c5092a0b981bb81b7386281142e6ce1a18b1ad00a42551071b105113f44918dd686dbff2fd0c002490c7ac0c1cb161b645d58c8a20b0b4c4931cc24696715e5549a5fe5df6ab55332df9420c3850a16325190c8464b25cb5d97d6e0c40eaa2bc2146230a501830b141599d8cd9a3c3dd831a75fc5d3e26bc94b8e4b737a701173e94faaf4c3a54a589880818918d880b081c1439fa881460076542e3c2c31c5edffc002d982240931312c81818a1e658488a1061eae94115212866f543c2e999668624b0d6e7fa26fa8a4ed9585390a95a91900000050001315002020100a870482a15830524471ac1e14000c7b9e44724e180b645992a3300822c618840c21c61043108111a12129034ae877b3aae3b6b03b24fc3a7c3b146de6e4085afd7972abc1c0192808ea55e091ea6cf53d4c35799378d8f543f05ccd67c68f3d75b70a7fbf45512155be294400c3b40b15d92d7fb1bfbfb09b9f1c0eed21e408cde766ca9caaa578d3839e6ad5c559daa721063bf3cdd0fa330be09f09bcc60b487cfffaabbbc5f205cb08eaf4c00d9384093c4888f7ff369907196fbd125a8c5d06e6f07df65540170e52070940f64b0077a5e3c1bd429d7f3f59277d2cbc9454f7048f7f9c2a1d5497b6715c7a9884edec7d2feefe9ea7bcf4291c433a24d43b856e45fc7378a34af00b3bd0ce349335b6cac7da9eb113bd502402b2d802652cb77581056fcb7269dc00f45fd8c3aa17b2befebc687ac974c90e333524538c4e57220218a59b3d32304dec03e6199f48ba811a5b941c4df64d19e5b5b838569f5c803d15a094847c5506997d5806a6cad35e0a69b7e7879854fb9875e48d892fb9c334eac0a8161b22680b7f273812a932485f21ac52a998f0164d7de89c06543a129c344ba54e15826c3ff7a86a469aa2ff54d3d67864d20b141e34b32c7ee481d8b6547040b3fc7e9a8e8ad0806be2b17fbf26769e6d567460b4728a0aba730ba77fcc3503fdfd8d078f1fc9914c803dfdfd915445754074f3d3c665cfef76e3a94b353c1e00f2c17e9a8bbce0a21375c6df69a9b59a7f4de31e3594a6ba4e4bc8dc0f68c894bc0d90b5f6b53f351a8f60fe15013bd3cde30369cb04581950e281fe95ca3d0c4fb30958fa04adf525444e86603272f8a16320e5402bfec2f6b696f325400b1c8b68d1105bbefcc6884304daa79a86d18ec03f38ec768bfad705b72a153e55b1d2877f8468fb491d168eba08fd5b9077948afc7340e8aa726126b3b94becdd9a0fe6d1c6c268c7861db6b82c2c87c634a40b9df810ffd5d1462987060557f27490589c181bfb0a4375686f02fa5445ec817e71a36b93102012e13993b81afc2f508ecf517910e3d1b088c7d005802f17baf7f714d8ef7c0482fd614b180f677fbd75b88f75edeb3c1b81553f6d186fffe0e701814756bedd10dbdeb8b9ef89c78d39c7a651d3db26c9133b8eca380f2042be71318c9cb5158c31d622d70b0702edfb84ea0dfb4ae57720d020fa18e330082bebcb8b1baae7330eddb0b3f2552f90b24f8856ca09b2bfa687b5a3dcead0becb3ac2b93b6661a831fc15674e75426ab4d72914206b4625316168539f2fff62b9b832630ade8dadf26c80ddcaf907046e21540412e4b9639de27dd2ed9938b90ff24e8660268564be4c58bc0b33e282fdbb0c9a57d5a38d5e55ab955047464532fce0fc1fcd749537bec64512010d77a613b3a752737e1abbc14089303105ae37ea29de92b0bf7d26d502e72f063f7acc30bec9a8cc0fa55283a80e596056122e7a8cc7ae8c85f5acf24b1241f8ec8e5fa9f4a252c7bc911d91ce0e030eced20c1e23133121334e991dc5d0318f4d55a0dedac923239b40461b866919746d88f6e2678d6ebb18fc209c605f227dab119b1f84d2684fb4fe9dd63d264d0fb29bb8cc71588bddb9297c899878605fe177ca1280c97ceaf0eba14df272d848bcb78ceeb648e2478ba6d7fde46eec8efd232009a230d1764a1a95d6c64b1c0f2b8422c554908c296ad1ce1a87c273f0ced44ba30df197d87280240caaaedabc40b85bb73f9362671f1ead25640ae6e8021d24d66c100a6ee6317dc45c10970222b91c04253dd904ddc860908818a308bffd5bf3c3015eb329b4e2d44e6ad30b0f7cee49ba4dc132a311d59599e3ac3febad0b615833e7c1cc923821a9795210bf4b14ed2214b3d02ffc2d47f9027b04f67d1811f1d382e4e375af4821e7ffdefe308711412ea93621bd126266be82fc6d8f0b4c77899218ad4b3c726d8f3741b0f1d9c9d3a067a8143c3e10383ced91294734de3e4003e302aa123e6f9f69b3326c2eadd7e69b58a600bd7857687f45ac0cf296748b636a0640b01f1cae3c91d1041aca206e2de7a41540cad9cb028e438419db585fdc4df9120d38af697a1413862578d2dfd79d028b3224992b662e70b9dcf85f76481ef4ff55707708d4654f79b1f8add10b4f5cc2545d464fff2269cdfa4d884f1dc5999bee715ac81dc380c68581d883d9147b606eec41383af680cc9642dfadac14d8edc734d8494e9df3ca37c61e948cd2419b3dce0730583054e9c05d6dbc56400fb30869c084f71c1a4c669a9987b88ec4d68fe8aec5086e050fd452613856be5254c7c32b259ac3d75c0f6589cbee66b6cdf8dcb112dbd91709abd4ac893ca098d3fc7ba7833ccd7899ae5393655196014dab28fed4450c829b7edb379a95863221b234f180ddd396a623abff50f61ba3a8c08d47cda360256432f7b089b2828eca15286ac1c82bdfbbfc837023abfa8b2261e4f58b47aee62e48a9eb00fab61842cd69601effe996169b55ddd9f193ebec8743efb3c539f8629e444e77d328c93f903de2f98ff7fa17d11952ffff2811267d584f702509238010339cdbe12a66099c2a4fb76e84472c76858d447f03bdb26ee1eb70e80991ec9b91911d987cd3f4fbcedd5f084ea60d59038529e3464da8a44ba13e3699762ee80732d7cd53e59e3e3a34b10b21fb2537aa024584ecc57621f4129e65aa33743df0f88b3e9fd79821da0141ce764b775a84a2b8008452d4a312f98a476e92b1c17e76431f6be7c8e975c0d3b49e8dcfd981cbb8aed3531b1c12779a14ae89e9dfa28e2b9edf8fed6a5dec89526a8d4ccb4935548d858b5b89545a181e7203f98fa52e730339c0fe4a8132259ca82899e449177e9990a60bb0fd83c4a12ae1fba0bd98141372d2db228640f31baccd48198199b5b78cad0879d9f7137e67a86b9f98b1849bc9dafdf627ce42a6e45786af4ff3dc93790e5f3c8f23c1b5bc67487f70f4afbf1d673039091237bc3f090183659705fc55a590436124b925cf11baca469248bc50f235beb60f508da34e859faca4cd857734e06c6c60d6ca8d3bc6dc1b8669814783e0a1aa709b05f6d90890cd99d97e7c0b893830095b7ec9a4c954bdbb8604b366be68906ad65f9d550bef90a52dd9f71b85d031cc36fe289691653b347743541ffdd75a1830bb96abc47f1efd892e9944a9f8a97c0b50dc0fa133678e1a528f52123e72f65baaf9e6dce1bd0af6562a4d67305cc4e328eb955d87e3f75b98b86a2328b3dfcb889bdea21dace76c0ad8e3ab3ffa85a3b8687526fe22ce71f9d115e705630f1e06fe4bf59c688175110d1550ce93c36ee410507e035b8d798f82ace860f4af71afcb04c4a3ea0180d305af217041a423f7825ce3d5f64296d214b9017c3ceede6bb48813b3f0600229de3e02a4911d52e46f2057842427658cc0f7c52c81897989e371b4b1a09bb27acf687a8a98676f13c0ad7cefd14cd6d04b76786528dd560a093d0e8ed15a15321fe40fc63336aa5f5b7afd81457523b4c76db058814d9712cdbf64d9b662a9cd3679bf45c54c9dfb77aabc6f5ac2aa5269913259a55b9feff9b00cbe12532bfe613aa1a5fc6efc8e1d684c153a0db502c8060550bf049b3b6fc457ef99eaf7723c7054cb1e2e9ea91f30d0f4081c57a69c6188b01bc52c05cc4ed4f55f27896be61df54c2970824a329245516e8854a1af1bd5d624bbcc554a43ad4f71e51b8206abc2482419fad18365b97ec79634e6bbc8cb683eb477d56c911108580898c0643b25010fe7078f467cc7135dbadf338167c615d720864d74ba12337b59c3ee4294c52b113473891d09dcd64b7996d47016f67f805361e211477767523ce88589eb266443076a4875a8d40cb1fc68ff2954a11f40d1721d10a76eec69eec654a5ad8bfebd205595e690f505b9c9077338e758cb8e0689fdfb28762f5b3e15f6e9b2cdc89350a5cd69488ed59348d2706eba59053779f37d6e943baa9825045c16b8d75ab45016ff5714a606e369786afe6cd4c987289deb54f5cd0fce23a673ce67ff6e137fee66bf0092d69afd2dc3c6f2f4455f4d63f2ddf524bd1c9b14a91f7d67d3b38a1419a7943d75efa7a25c200dc92aae4ea71fbacf41655a15ffc900545860c127250bd01f12613f14c179e32da2110f7a6588871b40f7118f84eef0a51cd8b9463eec897531a843a86cef3094d03539a863c49ea1d116e5d923ef610f32ef7756c6cd41174f0d2e223d1587b1d9b6ead26074f3542761767bbd3d2c18f3ac4297b5ad1e8b2dcceb2cdf3e3f7800b358155b19822577c608216993c82cadbe86ac4fa2d2c09729577510837345dd0067afafb297534256b5b3428b09fab27ab130fe38cd0a419869bba5da09cbcf85dacdde922ee80644ba3e5016774400c21a4feb81feee191c86736850037beca71b3292f17b7cb96bebf6457550e1200fe258ac71c7ef5990f83ff3c0a05acb4e5b4cf68b0a8923310cc267ea78ae59927b2533d2923b3249b6440d7f4dd566bc9524f224e4a240fde7fd6ec66b0b442f121ec7fad5eff6810549c22a87695c131c0765fd41961eef87ebfb4617aa824a9b2e1f35cd09bd66d0694b15d4c8fd4d26a25a33b7243625eb67368c204aab85007b7fc4b9d07a9bd6bb294515fad45a89e33ff006097867fbe58ab1c79b605c19339852dc2ec1dbe47ad15d6e9263c39fe6dbfd9935cb27c60b93b4ffc3c2ac0ef159f1b80c414305d14c69cbb4ff341cd33a419285053063119cf06a5708ea4b00ea932b8c018e53c16a2af43007208860d08e63344c52333e25cbc1c6c12a30485c63f4c31498d8f7a121d16d85c1a342da6543c49080653dac0e0de402367022e06bdd8d8009dd73cbaf0da9c17504b7071248e4d04e59e4558504603e881e91cfcd926ca80a9cdd2b76a9e4648bf065279faf27673a188b4694a51bd68a1cbe647f263a3c5a21c08539833faa9e9aa9d5b525a03fcf1d4a6a7cb875cff412d90167d04c81400547cd8897a9e167a261ac59ac276fa96916741586eeeb84050a1a7446e181597310d3aaaf596a1d4e318d45bfec63f7ce18de2686d7098a6cc52980ba9f76cbc06819eb833e9649465d73c086af649e50261a368fe3e60e60cae4af4c70a23f32b9fe246fa6ef2bb959fe959e6d8d1f9a7ce09122b0659940eda4d1827d92e0c2b9d780c1559ce3fabc5280141b8a0863fc3ab0e7a15fc22544843141e081c9ea49c135bd000f02e6b46b9d830dc474663c6c9b57634bf2142fc68f4465c318227cda3bc7559a21acbf65aa07fa4ceab8ceaac62b7f5a32eacd814a209efdc89d82182b7dec194dc20dd43aec75a2467e490afc9e1c310fe39ec9e6c5e179dba313fa1102a7958e6fa900541dfa542f75a0a0e8f85a6f648288ad688cade4a6f974fe18a7de6debaca40e58c040a2057c858f51fcff04201383b3a4f0ffd0ea43c590e41f9e480b70ce897c842818200d0450412bb79642834d45b5bfab412439fa4ea03f7f70a3a47ca1053772e3f92654da01b11f4cd21396845fb1a288bf6f50247ff0817d4010c8fccf67c4010092ec0f3e900e7c88dc47e144de89daef90757e67431b09b141817d226c3b8ba1b0d5ce9a7a05084de319b46d56ce36d9ad77286abb34400d4fa690e4b6bbed13bbf5dcae61b75be652b8144760fa6b6d9b38c9ada06f30b37a4ac505d9d5dbc7dd13c080e5792fa06753b1f3af8931dfa07f2dd6718e2adf26c3deee184b4d34d2710000f80cb330512d38f319391c45a72950d22c6d6cdbf84d5bd389f17e5f433bbf523fe1118cfa3dfce9d7695cecf43e50c5905a434a23f3af0ecbcea7e644287d08bea650fc75220f93562e56f35a026fc9b236b09cf8deb1d8ab8f373b79bb2c5ef399d6fafdba5d8a5d74b33b40af1dd3dfb47311d216aaa342a140701c89a59e5f46d3da9835875f2d086add94d83f281da2c4961e0c2cdc6a3ed022d01741f47f4f7a200bd8f484fa50edd32941d517fac9719801a08509600c1060e80d30aed47261199074c39080c318944311002454a26340d869efb473877dd898b33db6b2f51464eb6eb74547e3e2a2ea22d1bce844cf1f430c9fb485ec03cd29febc6e6b65f70f98b1ac6e42ec89b7956027964540c5dc95771de28da73b633cb926f1f9c8b7d252259853e9b35d73e27f1f03ea2ec268a0445a522400485a17fbb6e34b4d46cde054e54155e9f33e413639db0e40d285077ca0b23ef1198766202d0caab6e87733011cbb32e625e92420599f1bf6505edb5a394d23c253140a39cf858b8d2e5dacd2ca3deae00c82d9597cf0e80a944bbb0882348172d8fbd368615f49c10494d2ad8c1b7c924d0db0a22c4e053d892062b6f8c1e56ba58c3f28d119039b1bf3eabb0e666635b2fbccbef1bf8b386a86dd6d80dde65f67b3fb140984b058078549474c6ea2c883844849536ab1952e13450a2cce7394b243022986cd95bcc166f68573358dd44886b500b3124cd3d4176593bfad59d626eb852b7a031f9031e24cc7f58f2db61c5b0e3b511c6fa7cc84df2e580ac187d82282467564116bd5ef7281f6bfaf0f80ff82a4dab22025f80d9299567328dae72f4dff4141180bdcd4a2f541bd4447c58d8ce9817c016175133618d9b99c19f6a5bd1570c378f7b4f829bd68e506495a6cf02221c0d8930490ddffc7f3bf47446ea228eb14978d9e54f0e14f067cb6375a832d65fe98ffeafe99f4f64f9617843dc8102a2f0fff91aedfa1c4a7beaa1c99a28c1eca7d6f7269107009f137dcc632ad1e4f79954be5ef0574e595b26e135f97e8e180ff90c34251d63639df9388f446055830cd3f39b635084f6c03b29df9b4fe0d310182c9662c91e1ce51113d2acdcf6ca3ec4ee62d66c06bec871876b68e73eaa4374aedab8c7fee3968eeec0d4e401e8ef14e03a6e76dbf611b146279a2227fd931e38ddc9059910b2f9cc36dfa4ab9063638100df62974d5b430a94d5aa40d82286aa3795777e247d0f59cf1a28c659a8bb98e91aa145e9e7ef0a87d0370f1f9fd3b791c98ec72da876911644bf1441dc12921354af46936cffc8e071f523b215d3a055075836d8f0c65bbe1dcaedcee3c26789cecdd82580cc1bc21cb6f25495e84cb85e4c6ba15aeaf50e889b4add80cdf0e0195574d3f15513b0ea61db89afb47f1135e6c132df0c1e20cb0fa25ed35fc00411fdc2014eeec173f9f50e09747b6a8452720cd5793b25789437fecfa51f1a7f63fb2aa178f10ff3715da9d883f4f4a709d4d7d730f2336d08361473ee9e8c2b883227d8b107b962f845d7962ef3f254de3567f926357e3cb4d5eddc70ae5f5b4b8427e0e3e3c956a665d1f206a95bf78da9297fafc7dcc5a2167f546a5227c8983c0483c29b71498b3f955eefcc08deeb9a51010ec3d03a100c5d1d579239889d9ee712bf29758e629c767105ea46d5457ece415b1289dbe1781d99cce48c9c1d5b30341c77fea90bc3d73495560d52df59e853f02cbe95cd4894cdd32411cd3be8ea0f3c549df04d872fed82a5bc099eb8177c836ceaaa6b215923b53f1212ef378c0ecd1fec6a4079fe43946d6809a005bc54b2bece76322415963df1aab7eaa81ef15c1bec3302d18b902275a66a2d42c517869350ce88d0a878f4c0d0135dbc62ac20602c52c165412a317bc59bed4c93f16909d0af4d461d4ffc8fe9908e37510e5de94a360e1348b26eeec1be43c6ac05806a2832877346a74dd731d6acebe14692e625f4d79e01d704b831f1d6cd2a011120012b134d03bb3d24f797001fae7eec9723ccc62d3052ff1e8d2c4348e4be310610d969559a915eab8708a4c82564efc48149742dc2273ae25aef3552fa4ead7244bd6c63f553920625fb578c62f158e9efe19082dd9eb8ec22f496990c5306507b45ce4ff6202dc65c1463c46d05ce6a8eb47b870b1f06427bddc30fc97ec66fb3f89d8dccd609358e74498f43707df42a9974ef74cecdaf1c6acc23f66e82ac30ff60e55bc541543ed507f7772fb5410f82636a936cd7eedd86418f93ce705cf03199ff5c89bb83d632ea468c2082514355118ead978514cec215bea6651271968e2ec51977a8984d2c102762b9c7232e2010a2eb5838645eee9893f1dd4fe0dcf7b711c01534af19438c019b1c99304d023139d1574a12c21eb0abdca8e32da7b667127aaf34aaebaf715c574ba8fd1a86619064edf603741517a3a32ad9a83ee4401a630669d658772f34dfc031e5d27a83b9a23510c1455e4f57b908e0f46b4603989a2876d45284d67d2d60e858178364ac48497e372878c3a10ea4edf8c2f1efffa0bb22be86fc3df928527e40f610c2e2651f6f97d171a32758e384ce65367aa4fb6e4d313e3f0e5dd7376aac958ab64d73e65ceeab0e9e19746c167484746c1f1f802a65f61f60264324df12cd40b4f6eb924afadedf140e4c374c960e8268e93f9c1f26b272488ff1dec469815a8d1b14081c7086231e3a2add0737789443e920862deec480c31e57fdc470b825d854500cb85566250246ee1b54f15894ba8559b3b5badb0f0144f130ee49d620110eec7b0453cc538782d8a1f835ca9aab203b19c31c5237acf149fda65bc23a3af3812238ac3197238b417c56ee883ae6531af7db5ab447f7e681204d8f964a60dda8102c571700702bae326f155cc7e0b2e4a266ceb3911edad6eb2a3b03df716ec078b4c8081f1aca63bb26bd160184ea6708bc887c04f79c366155c162bf890871dc1e0585bc1558631ce7d7b5e03e0b1f07dfe04d3ceed41a195e471a63a11978286b2218292026a0127e7b0f493f85c62c31125223719430520e1553de464d641d4913fcfc0fdab742a97784f3caf5ce748fc1f46dace495595d00ef034c88a6b8bf8f64eaea880fc7efe6a5e1c3403df05a90cf88ac78a514098338e320df52526cb0f0b218527378d977a655745a0ad0ab707d33863fa6c23838e7791b3b0acdd414be868c506dbbda8536cf2e14a3e1e30b5890b1f6fadf79300b3baa2ca934e0906d640cb922b00000007cda4126643054f8edd5ac3b9b1b80a65684b6f62a7af47892235c8349a17d4418e9f6ad2c3f6de30a4e3d5b54578162153d64e27a2066781d4f12cd31474a7bd0beaa7e4bd21950b93603e88d1f30b3e8fcff501a46044476aa1aba12aa41bc56951ae348fbc4d0bf09d1382ccbcc785f4c1397221b44ca0a5877c2a562b060f839022d9b081f42b7b4d2839ccc40dcdd7253187af6a924828d57669e780499bd52631ad5a0edcc06a8e93cb3196de20e4907678862216478763944e45229ae67a12087ac2ca73d1cf2bb1a6492c0879bde8edeae2d66de7d2bb03c5c6d97c7228693f5ba7b616cbf0121209a7833d57b72f783870936f07fa66dbe2dc91c4382507d2d1f5d85a4be841877ee15a591ee44665f0bfed76a889d59a4304d2876d0a76b5359026010fef5043804abc16f8e720ceb7e80f9c02972ab2c1cd43573b305cf5b33828f91ddc7204019ebded908e9031bd0765dfc6bcee23b9eeb7f082be7f511f07146f378e09d6d80a8ab471299fe1e4c90a14ab456cbb90d8a6cb4b7abb20210fd947793489c0e2ef70bf1a9c581d7b76ab27f3ed815880355382de0d1c45fe090e42de97ec959d66ed38ee27420ce8068641c62c67c39fa6e18770bbccd2e09e9bddc1b1aafecf4d48c2630db7c0bc7b1476a74929e87ec319699cebe389a2c2afd36654460bef26cec01270235effe0c849ebad0594c0980a560b2897ba5b3a69e0cb5ca291f3b9512c7355aeb7485a47ba2e743959ee6488fc72bd081a667c9118e23925d4e11c4943ce7464c8a040e153dd191b70e7a95f4bc171c95b1bdd206974bd82a4871a45dae2529a5935743849c7725ccb13d9b20750878c941ae2bda7dd38c4fc67bcc2638a9a44c5302576096e1aa98a855c3cf3338508e220965008bb99beddcab8942fedaf19f7bdef2d036812e592c365944914d9509c49eea9ba49d3a2de6e3c2658e126ea2c6f2b7951401d2527f54ff55371df00394f8d45931c6272e6dabb14ff4b2ed0d85748beeebc98c02ceb02b584b94409c2e35f190f6f3e943f78787305e795fd1c0413bacc8fd6cea5c113151c47715445c5e98f0d21a2f3c553b91a2ece7c75666b9e005ee743ca8175ad3a22145679f26f9b0b9e3378a37d5cc5e5a397172140b6d3c50dfac3083ae241aecb0865549b8ad13c735ced77ce85db12449d41e4f4b4dfd1c856c5009c5945c36e24e9bb1b20ef3876a2bad70e5a53de858312753203119e27e17d3dbfb1f806d9b4522404c0c4fad1fa4144c369bd5b9c0d0c829504b0931d35031a58c7cc9bc1cc79b05b488c111f326c98c8373f34e4071d2b2608f49bb79c945545357d706d7c2f95cf835fbc40ef8feefd2fd1d272852ff3d324d5ba50067b10db4255ae51f8e52845fde3bcd82c6c0a3a3eacd60fee3aaa42c3d6b63f6fff2df631688cc82b4290a0bdbad0bc40ae258e9846e2a287fb3199fc8890319dc5f31a914adb4c3583d3281c84a6642c436354aaacb04f65545fdc5ab4487c83f75645501c20942b7cec09070b7ef9eced879453be9858c2b01954c1c2bb278964f7e81862eb8c9168744a22d507a422936813675e646dfdb7cbcafe8700e8c35f9b5b44c96ef26a979eabd4b6b4e9e1398089f50575463348ab21663637f747120812cf6912aee84f032a494eab8ae6cbe838bda3fdbc144d106c7901b8c37a3217057c05ada9d8ef81a5f6b20d8355aaf65735cc667a4a349ddefb339a1c67e2c1c6cd2d2beee943a1b9f252b50b0a542b631986343ec55c836f3c3687dea0c5e2b2fa45953b40fbb679cc5af739156075e269ee2754508e8b086759a76dfbbf871a96653140cfd13164291e2e42460e4739a1e21045aca8412c4584cb4ad07c4c47482307581a6d130049f3d1dd744a9ec73fbc81a8f3728d6912f3f118fd5fde3144b2290ee6194a1f4d199e3ae57880cc523431af31fbccfcd946e2723a6f9875ef796f6cc7c532e10071b8a4aee9926b1f06dd9c9f95fe79a1d47fdfb72f49392dc76b16a7d81e92b3a044d910ab0e4398f60e646ce3490b0ef36bdae7348c8dcacb2071802cd8b5010cc32494ffe327575e6177ed3f656b78f12e8d5904a0d941630acbaffd496ba42809a22175872413c3f0680daec25a3cbdea7e4f35df294c5dcfd7f4227db9ed13e5c21c89c9d3d886f47e115638f65cc2d5ed3b8dccad13112f69db2c9649611d76b62a95dc9e8315a25d00052be82d14f151660fde8511b58d456c8a913be54a9ef44cf5f95286085499906aa7a0530c30e419e3ff462e194ee52cabfb29e1949edc2edf86146741324549872456ade0c2ecf6f319a998fe3450d0980cb2f242c43b133ad952dfe17e046d5029935a81b57ef09951b719cd30bef3dcfa9fce1ee322cbd4bd320cea149b358b296e05e58728bc6e413e0b1daa194ce4bb66c5356a51dd27dec8b84a88c1f57acd494edb321202bc96115ef0ed3ef3c45ccdb136737f57bf974581edcbb804d33bad0e02549ad600b9d26bc68880d8c9eb93039c0ba10e84b409404f7b7f06c2ef9f3848184bcf03acffe174d88d2b76a3531f7ef597c82a930f1bf4eeacd65f05d61a3df2d049fc13c09a267b7c5a20af0502d62e99ac35a3b86fc7fdc4845baa0b1e4b44ce882e1c303724c7ab30a96e485ecaa826d05063f0f2c109fff18d7f4917686ac1ce44ed4bf7312ba727f52e0e07f8d40031cd163e6a6f10b23d28e942f1727746d0e124409b69dd76cc9069779292c006e4ad6ef0be08ffb74f8f9464b13fd0116bf4cd478c601e6437dd09af2c322b70edfa5f7d914a0b693dc267da7b9d04bd34304dfe88c808e86eddd9aa62c5bee3f4147476925397d650273d6a0c849cbe7c98bf32ca23b0a519336fc51386290e71c56502fc8888120427fa441b888896297e2bdf6d6a0631e1327d1ce99d42fb840be7e71b4fec45aa09f7e5b5d81c003797ed458e44887f2b4713b00825f1f9b65da8d497cb4bfca8d8e1e80be4138e3ee75dfb559b8f16655109dee3621b9760673d6c9d339e100a7b4a62a45fed5087dbf502128e3588a45b41b5e330a1d23579a540a7baca86359eb5aa08bcff569d5d032dc2d128d5748cb5bf12405ecd368fbe1bcc33a919e4faadc79507d682d3de19fef300ef7736c68185a03960a17ad81b4cf6c357ff734c93bedaa338a6cececa067ec0c816e2d62cc742e1544d6d2ca04d14777732595fd9da6fb3f2148c525bf1a418b2a16c11b2ae7400754ff1becbc2b8ebcded8aff89f73b22b671454a7ddf483faacb42c98a3e0355b1bdc88b5003a059a8f5e48d5d9118b0f962795a526d05bc872b8e6d8176b7fef91e1baac83d76d7a95b968e80adf92a3f3f6d952b9d8ca14871dbf9e64b45595f00942e4c4f1ba824923fa204c1cfa21484a3089b8f51e64bdf87377c250bc1dde26446e3931fa0a506a4e2c5640901313e104379c67c15b8bdb10b689f87a7a21bb5edfd787b9d48b89e8d39561b8afc63b61c2eb428ae0c1d1ae0d7ba0c744341408438404dd082b3c0c40487639e531be166d22169ecaec36b85fd6107a30660ce4d139d11a6c9ae4b9325cb219426533d19fef953f3c369cfa17618fd274152ac92c3f5b26a4eb2c23d07c0bbc772bdd9404199bc71fa8f34541e8850d6469000979281f08c5222f6466f7df71b4aa7fac549664bcce1585c47f2cafa45c826912f9a760675c02289b2a90503754b214369b40cef34b9d3ba15871811a633147a8d71310eb41ba775e55bd9c20a62050c424df110ce9a931527e7ccbe88646aab1682ce3ab08085cce487391f862b075fc8c73f69332f09e7ad44a79c9459804208e82996cc923d2b1196a37ae5ad9f8f9f89054aa4c4280d7adc19cb53da411842ca6f96e74ff264ee7013c3d1d7414e65a42c7378b99686aec4fa37282eed814814d3897b5a96caadccebd9f3104f24eed79877a796cb44896aedbd5260f0b61607c7651b0f60b38949f9e48a739633ae0954716e3e6e20d6ca31d0afce53ac7749f5cca8d4c10f44d706981644774ed4a19517a16987047bea685386295847f5176fd812c5cf5ea2973edccee0a9feaea9f38e1592c86f409c7a41101410b851ebc2daec579f99c4ae9f483985585a2675d4c87d60b8dafc8623cb2ceace40b7e366c0f00a1e1a1e69c0277f4cbbfc69039d3ffc8acbc491789f5138fd1ebf8ca70f914b7209b1d9e7495be883eb2467462c10b20da19296cdaddb9e137069931a760e664f50e32ad27dd7ffa9aacf66b6f758d434fedf05754516cbedfe6596b97305b6422005ccbf19611ef195558f64545dce429821be42e3e1d446e0052e44fca1983a2edf7baf128080333f5b220602007132c7903eb99ffee155101ec5e7c7b9056102c1877f83bdffc1e2d58bc6158f5f92dc090781c1d2fcc54a70a7de7d9ac8ddfe85a80062ca75127949cfa501e15acb33ed7f97a9f41ee340ec92564db58727c1bbf9b682684d4f5e050667eacba1c0546855e03465a14018afe2a615ef49afa0b62e2849e3111cdbb01eae290a4aa73f75c72f54dba38cf05b0c4ebc309fa2b647efcf4f9482439b8db7e7fa27bea89521a1906c9ce6436bedcca9d5ae311710f7111ca23333dd09a329786f5fada27c62153c370a5e25a6b7e437048bf3959452a1eb36a57cc3ab596a04679c4f0c11899256cf17adfd9538a529c32238aedd18dea7463e7d9d806982edbde3b15fda6fe703fc3df02efa490640d932375568437a81f5f1d6ff673d125184a53e382375223409ceb8114cf7b38ab051f99da427b4495fd3ab705f2d8ba38d3297deb736cbb8bec186a32e4e1556c5cf1c50e8140b1ca745eecd1d061f5626dd71448176a6e4f0aa5e04f91827358b70918aaed97e866c599cca7d87faf665c7f6efd5188781243c31d1b9c750c63d75d97bf1b6345ee41a8498080af6548d6722b686cf9efc41ddc23bc348750406d46faa0cfe608a77206fe46402990cee7af086669a766f7488b180f21f5b949c6aca74a578117479ea436e9dac749fafe3e2a8c4c8babec6ce0819ec82baa8f356d2ef2da4f5ae0a48b6d145cb0a8947aba04f5903ac30b12c0fde84d0ffdcdcd6951992e1ddb0a3bd4cdde831901450ec64215a8a362a8b762a558c01cc8fc037cc02e18406e0ca22caec0aa509b590d4dce506cc282599b65673c79822e6b8fb8347f8fa9f2837f58916b4fbb26936d14fc3f80871485a94ed4113dada3481acfa1c6713c9438c0a5d74c1bc9bbd07d6c2da26db3ac588b7c3204427aa13c2f9485606bfded0bfe0223deccf763948de4bde3f97ca510d60f37601cbbc569c52fa005629080ac5be95e187c42936a6088ec6c5e6a80db30a429808fa58e953fbaec39f93091fd2943becf378dd38513ff05537d24c637991feef5a7fc8e9163d693dffb830b46e72704dc92a44e2bde89b2ed9c00525d3e7a864f18ce2963f704d2134ab617347e8559a1a56d369bddccaff7920916f6d3f15ecb294d432cff9f6755e92c11e8caa6fe7e901fbb3dd3eee4fbee78f9b329f6647f04a87d3d50e95334e36e5d905add9f309b3a82bd6a860339401a28a3e35f08c189a40efff5c2a7eee2f526485ee48098b9fcf26862261a2a64fbea37588151fd707d4286275541376a0a102a1e5beb6a3fbd03adc618d22d4211daf414b0ce83735fd3ef314132d1e923b0fb54a5d98b709fbc4dcdca1e79061fcb9ab70b12863d46b3def952c4dd99bd3c831c821d3dee8b88b8b87834136d2b302f2a481b43eacd0d46b0702be4ff99610b953aee84f22a78cc5acfc7d7b9a77e83a7d32f0d58fe56dd050c43fef53115ab4ec60783849062c5f3fc04ac00f2e876a9efd54c4f073b030d3e4198a7ba13b244d676df3b025cec1bd28f1fa523a7e40cf5404c4ba7ff5b19722833ee2da85c63ed53f22c0f9dea790c9a65eacc150a8d1f9244216c5037a112fc58abef5929de9bc1cbac0d427da804b3199a14b65bb0cd7464ad3d494bf4e0e82a00df13435f087ae2bf38efac7a28e1897b8f045d5e843300058f1b96f786cdde57bb7d8307694fe9d5152b0fb905f037a2176ef9ee73feb1efa35e30d0cb7cb20c11d53851554aa9fd02b9f9ad8229265b32959034d72654d0592d8f42a9e96f060e0727e71c55afae97d4fa918a45822707c067d12ca25fe5e1df3b50adf28a728028ba86c1f519253b9900e58e95282383a7d226c29bdea407f561f02184cdb3cb80d695db10c5a13f34fde279f2d59d226734195bc0f41a39a7fd466fdcc12c94f8b21ca945402d0457113a6f34ff7c2be5e07f5f28af50fac02914effd2280482a25408a45678e551785dd95e065006b97a2da838465fc10b1b97f142dcc2b3c47dd5a7e8d9574e3c2f13efbce767134930b1ff984fa158c1523df14955326b30cc0b627824ee02292e6f0eef0d78ca803de584b07d5149b6f13884d81fc9638373cdae0bfd5a8835a95c9ba3125fbf5dba1df7bd9f8e3c584132fda3849182a8018a49fed85ed37d1d698fdf341c7ae05a0307bcd102ccb9990a86d01f94ab2f1d1ddaba0769d4cb108a4299f52e94401443253b1580916485ac6baac7f5389731100abbb80cdf00a4cd4c4f16a155a04f50db4b2e0574c298852c97031f63d403be200b8efd414373b489978fda6256298bd846a3f1f38c5be6c8806506b9f20142433dfe5f735809ecc8c73ab1f47ff4853cc9a3a4b119545494ca419720b9571975cfbecb28d63fc837398c0d275a603ca4ba9c0bd7a4b8ee12f018da5f28701b528a9406d3a18f93f5c039cab37c1f3d0f4e29a6d9dcb93441795d58468b0d7a4e35492ee03dd8048d87ef51986019720e7700dd566754cd5baa97e6db546657da31fc67906c294b5de6af020fd443068cf1d3ddd511e35d80d6d320a3d5346e62ffeaff349b5b5449b01fdc30db0165eb79c64e71bf1a0f9cc3a557ab0d09bacecd176633eb704d437c133e44fe0911c1c9d76268237a2286f2029deb2f1d664302623dd5ad590e04cf29069a78768b3c729aae149e6b7970d260a213423df95b5842f589a89878e4b53db237d4d94db673eb329b54db23b6d9fdb533e8924c7a88a2568f3e28b1e6a61f47e56a764e40309ca45ad5a413cdaf9314b437f35585389a367bf3a538df094378f23386b9bb37e95b87d1e4873e7644d80ff72aaeffedffb2062462f48c2fe742d87d4726432861436beca5bc7afe120fa975113284e36bac18c3a5fef7eb2277c25f6b9559590f51937a51a7dee92b181605bd1bc98f0947ec983dee97f57ea20eded3d04096c76b07bdbff34d1ae97da9c5f25ca9005e4d83e2118b1f228ac76162ffae5eef049de01a91de294ac024de69408115c0992a4634ada0b9b25ab69695f661656aac72c1828830550eacbefe3705bae6a8b8b53439dc72d53184fd6f48680f51fba94c528b2d4d91f85975a88c150ba1aad814174322185c97efaa85aaad227e778be954b9df3964d728f82a0b8367aae5f0a2079029656b42877e3042ac91454f7c37a71c00e8d269cb207300d4d0ac8ad3c378aa1a7fe057afeae6d903613d04ca3021bba6950ef6be66f2b599b6b87f924e9cb4ac90d3102bd27e9a07e6959d0d7fcb630d0b1820a7cd0ab5509e0af9bb52a356f9c1a9e24b42508d5f12df36af4c990db50e550a42a2554ad054342f15667995c58184a71e43b675f46a75ddbd4c553f543cb433dc25dec5612af2068a6d59e8fdc4860c549ad0133b3123415e39000891033a0a1a873c027ef0c37463afc6dc510941c2db315e4970a5203766f7573b334a653bacd32e9faf9e5bf8e1099d57ec2c3a467ca5ccac7ae91cc9181ec015dc7d636b023b503805cdefe15300a9c9b7ae1bbc953f35679a976d31e2964d85f82e95117bbde38f8f9a5b8b07cbb077878a8408e8c0d41e3181e09d5401215ea05e236dfceb67a8735eb7339f7c6b035b17482fcffa28d6daaa5997253bf5764e107d9041d4c12dcf0fa1d5450729c86f3bc1123dfe19874c7616863b56eb508bafb45b7072411c695d020cdfbec42abacb5e89a1c44cf793649d3274d333cc8d0b3cf741098dd58140f5999a778527c9cfdcbd3e81667d277ccb61748f2f3c16549c5a17868413366653f3ba0153c2da4204061dba97c3c0bc4287fadfe1c8e6c10c0e9d56a5d06a99d9822f19c0f011e616e964e0055597dc9dcde9dbc7098513ba5b6b728ecf301aba598fddb41ea8f2f187a3df15b0a00def9a8f39dd6529c58f979a00154bd15ce8908a44759b53912370b12790e509d93a536e5158de91353c7ddbf2b74100dc3c28683b6077dc78482f02ef67ed68088519cdc149bb1c08d9461e217079cedc2fc6d9624d91cadfe14f9aa41a122f02696c93922fa3369fb693399247162177eb6612fd5919b3820551cda2fcd05060d4101f5144d61841e4b8b11fe4c470eeccc7cbbecb9dcf97571c3f4714491185c88be13d1e5c1429654a68883c3a34bf73d0b110c6fb00bae07b5ea3f82abba236164d7d8fed51fbc4207f12a577e0fe43d9ef96f37f8efef6cae611da25d182781e0f55fb68914e59981b38b35290e2ac1ef172c296006b1a134a8f0538f5d89b41a2c5de67ead415d254043793a0a36b5c7a084c895dccdce8a886472442823bf092274438fd70ba7d1e2f48634385414ec3c4265e9b15e8a9cfa34a2a6d3e111aa0338ac0f51f37786704c1e09c7743e5bef432c021014dcacb1688120012a979f1aa9538b83b6c94b10293b863f70596ac03c3ee95e73a7437e6993e058108565be8c50953b9a6e87921ec28700b29a02b2a50287bc3bdf0e07ec34522b7d429af558575d1619025feb94b6588c34d562374c3fc378dbeb1b8beeb837aed5e2d1dbc3f7f9c72b1f893fc327c4446d30f94d638c5b2e7c90aa4ce5958d5b5cca70d7abc873f3889a3b0cf6daa739d44dc71d9c550cbf0722498d534f35cfc1264e4b1014c68228a4728e340dcc4fd3f195a2ef83bbc2f4c9b27839c9f43997002f7d2bc189b68a08eadcfc12f520205af12124b70551d398ee7596314d90bdd7f03d5a3cc28fce9ced723a04a21a2b81d5f71a70b688f1b2791610df8d8102d32f5897b934549632c0f21f17b4cc011f993412fc30d3ac826301bf306eddc014af5ce58d97aada25990487ca2c17f777cf38c20b7cf2b525b0a482b9c6c7c5850cb85445af7593d055109b75a3e3766d5867ca1e1560cd7bee25036274355e2a87765b367526e78c0ced003392051e43a004f420995ed6bca2564c1f6e7200a70bf146dc69163c26f52535ec52c4a125baf18b25c2670d3c5f3047740bd07878b4605c906007131bf0173e7181d47d1d1399eeaf6257e96ec2dbadc331c56429fafdf440ffd1a7096ac11e09983581da7390a0a5d51dee3e4dc828a5fb0a2280d54ec8b54f9a33544fd298fa2bce0727de2400c8fac3b6140204222420a7d15c3cf99c6d11645daee623aa0c87213e6c728bda0ca8db2a8b3275eb3d9757f58a54333e7e6ebc48da780385c663f0f37f8cfb81b5d782e2e50a727e52fcbe198278016f06c5faadad5a5d9e4e4463a77091e1acbfaec8f379eb8b3af35635b34c2338457792aae361c44ee49296a74519f8dceec526610e3b231f07d1c306c05f110e6191cfa7a0d823c75ec60e526f2d6a5d8134c3dd7ba983a59f39f19fd6da826487d592571f803eb1196892e4083bf359033110713d8c43b1581cc9908936e267fbe23e7279293484db065a065ba297435703d3cf4961e2b0a97d5a296359d4c3ff262b35164e0e8d260a852f33463a99738b3d72fa64962c7795e96ddf9321cbd455e31f5e23888de7d8a2dd21291676c270e2f28900c47dff8e9258cfcafd6bdce92dc05a089ec7cd002a0ac06b7c6b1837301746af43cec035cdca7170ea58e3209e1cb3100a367bc27b5d731f6f1ce8f7418fc74861cca56a521d433ff55b956372047f4ac99b824adae710e4c8ee7c6de20964b82da622e5e0d587aeacadba3bd1499f002bdd47046fc6ef304914d1a228cce9d12e6f62ca902c662762244af442f2a54cf653aff62f6053d59b75feee1d48d4c845932aa5b9c582e9cea4e0ed1f1ecd025114a0133c3121d4594471321bd7a9cb9cc65663bf899ec41000df84cd9e8d1c211b8c28824f11522ea174b129679302b82a70745882cc11f3fe25c7f92fe0e661a478da243d61b40cfa4feae64a72a689c04cb5cc47f1ab692cc66ba2876979317fc0246a2ca1ac2cf178934c54b982fb11a6619efe72ed2a5b6abcb89ed9ec265945b6973264d9984a0480a4576800c0d43417648676efce6100e8106320e75845c1dfdeda2673bd5029c7b6b1fc4330f17809d1cb0a38574c9f17f5d2939f3dc784708965f7be08ce70fad56cecbf7a0b2100664e4b59463f5ac946a39983536d335b236cc811b1e5152ba375ad3bde12ac83350a1008ca0d3678c205ae4a8bf831ec3d717c44b8073074b6b7acb139e039526352d85617b68f8572e776d0a291e604e3499a52091880f60e67c7841ae35a7c7eced99d99bf9c87c70c72e6bb04059c96b1a777ec69f82800477d551c3e9816d978c197498b3e7b8770382431eea1b2e6a5dfaccfc3de945ed6ba313ae07a1647afff28b42c12bca23df1fdc9cca3363062db0e8dd08d3f26b19b45dae2cd0fbad617411af5e5466c3fed82cc7d21ce2a048c9c4f4ad3b9e78fe3bc02978cc1bfd092de80c08bb47a316f092f03139819646bbe44694ee6e5af448de64aef1b9d34926f277936f37d4b47639db2072f89514153fc62c6252bb5dfc9a5e0bc1e613ba764c491183e240ebf28db263e1d1ca6b5578b4314d1c2c3b35cfdf9131ed88015e27a71214ca7882138818851fd0ff11f76f4bb38922c48494f4537c46b63ddd80963a9ef9c92774a553b2a03042905412c7cda91564f1dc00de4100bd6fce8b63aab3e857b7228bf5720bc0fd4ea2a147aaf6a12b4597a24edfef19f9c8a037a700f9f629a6bd8670f8b8f662946becff547bd4fa799c1711f3b26066be0f5072698d937eba4c077260d31b0eef89aafb3f4307892eee769be14312f83f1681480047d1a6e0efb30ae97ce1aa1c27af2410329fee61d0ac052e80c8836da568791316e44f033decc76d78e5a83381a3cab7788ad8230a9f02509e56039872e1b31725e8e6fcdffa3abc3fab9292c93c1d5f49448b21ed483ba6bba2a4e03a5df2e012231c5be1fa52d685171cadac2e32144be09633ddfcfa90381d2c72f5e4488d56cdc991deb5c5a91d9b54858727af1f3bf3c3aa7db02b317fd38ef1cddcebc9195be677feee7b13a8e02b5684d2d492d3e00b91d9aa38846120810195e42712ab81e21e769a22b97504bc31f6cff869bffe0f8c1ca0a00b4e3007c3061b096442202fd89375d00327b5e5e73e81bee2dc3969fd5e04f235ece2a27177b54c0d8b3070b362433f0e1dd4811a7cc1ea2f4e2cdb43803c41b5d80946a5abe29003f6b34e681589d5172d1a11b6a69ca7dccbce279801b5ab4f12b2b1efe01618aea39c36193260cec3af87209f5b61a186040aff4fe4790140261d690e5328b28cc423e921898f952159edd98125a8025081ca6245eeb68e9cc5df13f9df54b1160fb402d1e47ed223f18284b2cebcd71473875b4655c8480184b0160ab952e333cad117f6467bee2e2450982817809803ea0e2beb3c3e24af8f354ece8c96bc60625148ef3d130e18e9f24dc77e00c4b804a7b864e65a22b96ef2f1c1843f15488213b8c47406ebfdf8a0731d70f68704a3bd38e36676cb20bacb61cd926ee420099590f5f02a62f8890949d922178ea4f8aa2f4c8d463cf9b4373c9e3c2f64a66e984991689d8a4d057300e4a177c1ddadbc24e864884d4ba2e53eb316260c3e9cd5f0900dd6f5fafb2ddcee7c1e9077e7854ee989accf70d37c0080c24ffd8470971f4297f804685289ea1a600be3fefaf6bbdc5f84d3e58e1c26e9580ab8223992bb8fff0a2f2b02d1ba13b4a164061c377569d9c4a77bb8bf99de13bb7a4e733da5b91dadc43637dc8fd0e361492c135ddff382dc95af8fbc4333cb292ecfa227a11b8a4aa73f93df94596632e8aba4547313b9b6cc37915c84bd2d4222478959cd88d8f8c23348dcbe4524c7f3bbb05b30216bed8e0d7c3ef57d2c012948ac762170c7110008a47d44bb04828a442db55dc2de3f1ec1d83da12d4030714717074468941facb522b18b06aa4888cc62d44b727e2e5eba82fe3d7b0e39990472295ae18295bf25fdfdd435661a68c6d6b184117069d26b1bc784466c60d5a6caffa241f872bf394576e906e357844f7b6e1acc33658f596093a8c908d0a46568e00fbca34185506e36c7ec3c7ed61f26eadd3284b490037c1c77a5f687dcf958a0845c2caa975c034a85cd9b5aa0d891492b7d9681a26dd2a429dcd6ce962a3adf37bae2e9448725d070859cb28e4bec4ddc983f997683b5ac44352aaa941089c3a7a8ec420919bb734643e81dcee402e4141544cf42d813621d13ffd5839cc6f4a19fb292232415eeb5fcdb4c750091a57d5599cef414c4ac64ab5900a0ce595eb025c5d874e53a9f3140b67d320ecfefc6e6b1791505b101579725f373885ba24cf2eb1897f6d8cb6cfcec676a2c1250f06a94eba42382728866b4d63cedf50f015262274ddb274467842454e2b80d426bd501d37f71fcc0b80b2a0009db33e1c6d2a00938b93209ce4b12f47c7ba46f260fce28a10d48d491acea8875eae60c5e5a7a2fc9b796615926e7c1e536ee1f116a0a623357a059afe7cf304a6b638c80dfc2d29d3646cf60129856a5185b22f533af39c8cded9aad971ed3614835cdde5687995cad8092e02b4f7dba78838e7cb66fb315cc20d2cd3fda2bd15a53b40c3ff4932f040bbc8a2b78f3d8357db140bdc4071c1758e5a1be41b99c3ebe7197d290fa9ce3dc36bb4356014234dc4bcada5ebbe2229e8fe5329d8245e3c38609ea40394e7d9434e750bc786662297a0080945b2bbb2096c75a0883894c493e5ff0da3c8a17fe6f9aef87449ac080aaa34d87128c42ce86daeee5b48f5f9ea3e4f2f924f3ef604d4be6a214e4f40d0a50f0255271e341992215e22ded8bd2dd1cb6a7bdd513bd060c6303e45206972727279c9ec8b6a753b56c6f0062dbbd77e5bd72d6f9c63c203cb501f06e1be0e4b701568be0fe5858dad85539866b69b742ab94f2b7dd717b5c5bbeee230f1c3ff2e202c9cfdbaf729773a0b1e8be4fd798fc50e739b63fae76482243c811973d3c71be065def90d031ce19028a6964ac380366012247165b5854506cc60730077bea26b4149e5fdddd54c1244f24052efd9d97e12842608d55b68cfe7a01e9c5b5c3889454bd580420f789a1c6622750a10b5702c0d6cf3827bcc027b9dd8aed88c4adbb97576c1280c21ba1072903b581319ea6a362c6fef7d7e04b4f65638eddb196130f656d7655c6d45677b037943ee1f1f5ae2e17d6dea9a067116c3fa612dd5f48f8969b077ff22d98c609f72b24b76399e2fe5a4c66f9e1494b07ada99480f2b918a9e4a5c2044d6d1965bca499f1460114bf856f7e93d96ffcf6b182ea8b1a31746227f10d78c046427e85089db3e0a9a96ff42347dbf2d85a9518e74b4ce708f87f8cac25d85109e2e2ea35f2a47dee43e67d409f04841a0c1178fd1097ce9b93a9ce9b81815efa18c98b94eae6acf2cc0239da33e34fe32d53c42618ea367156822254b4da0ec629750f4bc3052d23f69a164d566ece92f160e16c61beb09221ac50f758a7930d1f2dd36c504ec4660079dd03ff445e56ec8eb052a2185c34d96450a1debf0c968d295634392b294ea2e9a03fd67b6a33d82cdec2fe0729b37125b216a12a505651fe1ad68d7546bbc0001d7e8a25d7e67c80a1e72f1a15b925ddff91501686af1800b181a51ca0779b2815ef1d89deb4296d78e146510780b4bd0b8c00ff219a937be7c9516256c00ed3dbd7082d7d08bfca909cf1ac7ed26a59b8dda8812327ead849520f5720ca61fe7687b1897cc8bca41ecff590311a520fe4323245efe370bd9ea6e014484dc10e181d04075624e874e932c318926e61d38f460fae45b7002bd7901bcde28800398723d044e368c21d8b131771d557c5f962b9e9e4fbf80eb4a32bf2f9733e9947ff6a3ab770fcbf592abee82b6c1d07ff2408354e357e2cab1be25bfabf900ca0479776eb0d4a96a8f3e481ce8aec5f41af2ab7d807514e706255855841734e3c5a602b5ccd410652e0cca0ad5f82e9a0c5b36c32e897bf047f6a750f7333270bf334207ee0f4f6c3244198b9d02ec176fd128236ff6c16dcb9de35854b40cd8c405db80ff081d32e27194c5581037bbd530b135c534c15177aad35463335f4f504d1c02493b07e99d24c05b92ea310e1abbfca85ac6baa56000a5aaf3c918239f444253886c0f2dae2ba2918eab790febedc8e92127573dc5ea29ee1bf23bd81467d8a1e822218f483f7ad695e54b59b72cc665df4c4cdee4c69bdaa0b6f5122f2d76eefb4b0cd9881abe631c9131ce46cd1094c62f90c68aa16591749e8ea786942a6233ccbe307581aeea4d464a5dcf3e73f8464984e798ce4879b099c3d5971d1fadbe17eeef41efc6a10c75a977ab4fd8492d31ee12cc3cec3d69affde441ef80a57f7854dbe0599f7e58ea8d8a8dba79117271ad5384fd94328c5436710d83bcdd13bbab7bc713856a5f56febd9e4af33aa0eda684adf2b0ed62b9ed451ef9888afe71795f10c61fb606b5bf673274251814e5d3b945feae0fc9816629ee8a2bbe328bc24b835523d281faed3c41340ddc5114e76db12388b0ade5f6083528115f3a07b3151e9a6a24ce8b71a595ff9ea224fd1435870827e81488bd1209c73ea887d66984074cbeb64c2f114037fd768933a5f531261002dfb6ea3af2cded96c06777f99754b1c916cb6db285e93bc74d017cb11202d47b2d9b1724d177c4a3e0272393af4101896a50f216a1a1d92d3e56b812dd49515415991d073f08fbebd067f68048d1cbf1830729d653fa084222a520eeef2726496ce65d485074b2b12c6916e6b5b5d0fc6b2b1d3b1d368afa2f4ee157daa4925c1b0bb40800b1f5e13c0a38ffb599584a3d96e83908cbf40c61199ddeb7d2d5901ef8826968e068158af5c086a8b23d83a48442ac1fc1a27cda9a5584c83b214c0900bc0eb0aa4cf503d7a436cf18ec1bab98535e72943bb26416aa9fd1c9b8382652db452dde8f33b6d464e8a8b730d33b4e7ab2d8739500b141fe36afe1aab1f57024e67f40180e5d8c13c9b3e8145b664280354a653e1b0ea74df361b0dfad9c5d66cf536f0f789c624171bd36f36b1ba60c543d94c47e03136272dc51a271e65d754a2fe41277bb2b76636839cbfce6cf73fc2adc3d33983e50aff6c5e97b2b3a577e19ca9fda510a92ef0aeb66d737a95cf28e468ee15bb2ea15c9c7d0882218bb73921cfa851e819c81707feefd7df59d4cb3d5ff47ced582e457acb145f314f5f053282c4399477fdb1b2083fc3689de10104e8ad67b837751703e20ea1f41fd31d73dc9a31aefbae4166be6134a1a2fd8f95888635751919efbce21548c7d09dec4201ce3422f9b571caa845b58f17e96668530317ae453fe7eca0ac129047e7e19964615038eede3f0006fcedba5c5db475d385739c5c9dee924664d383c8ab3baa3cf6db394a0168f27f8c261a88f1fa8de346d69fae58bd2983de20ba0e533793dd5de80f4e4f9e24887a1795566619f45e30dbb843462990ec3f3dd98012271d33dba87d4bb438a9acc274168c527bbad499f44d47512cf98ffac93a273fb7fa654e2020ef064ea66636d4558179bafd5522baa106b7673491a0620b52f486c60eb1876e1ba071561cfd904657f592d00caa7bc34625af8aeda52e2796a29b3d81c30e819d964016ba102317fa520b53a2e169a30174ed70d2494c0d6b5194c468065654de36580225370ba6bd4e908f87db97deb4d7aef3cb5e7a46e11fb0edf432863447792970030e5c434c31935d8ae379942ac6b40c6c16f0c24cc9f25d8a6f92defc969323e71f43c74a7ac7a205fb704f0be676c1d8799b1be3c1885495635b31a6370e403f9e2a81a440eba3831395745f92740b57ae21a377da0d709bcfd2d9d4cc11b6dc7d22e92e99fd46d8a2ad383fd433b70b511e8a38f8b1959fbfe79009e09830eb87f3a885da7f6c1ef5e3aac2af2640559496ae4f0392988000442705b4c511315b835b76c1b2c8451d5d13161542688a8316b3067dc11dc5e3e8e2f82eaf3ad2bc0ed66617227299809170653b969317904dbb435360f40e18fc71d14c16476ac0f31ee50e72c90e6a4ea25a99b53d6114e1f9621bd463e0915d11c14dcc392d296f254f8b7ba5bfe0fcf9cd42fb5153b15577743b79dc387586e5044c3937bb5033d97632054c62eb0a262f2d2101a6fa1ca718716cc693e5ee3ac5c9c17c5061de1cb78245ac6427972587114acbf26e05218674e6cf0d3b30fea5afac23db7226c9e2088161bac1f97761c2e049eecda93f5292a42cef728d6508f08874c84632943babe90d8d8bf85f64c19558fc3d7fee5f3b91abb6bd3ac1842bf4942562341eb56f5cc1cb36aee554c5eb75fd7afb97c0aabd903e2396431271b36369f188e4f2c223775e0ffcbfe1d6aa020404e66033e8ae9540aa029de496f355fac16ca6c40a2e741fbc588c504705d2f170e71b2356c8b857984be814d003ba17afcb158ba9336f9301b537560e97315802e64d4593a6dcf503226be2a15be046b93878240556933cf980e3d8ec0284d0a4e60b80dcebf007ecb306105f4767a14fca3833d746ff7d62bfcfec08a79b9164631125fe2933bc6a404dc02475fb35c734300852a9dbe365cef44637049a48f37188baa767b1c08cc206696bf20394400c92770013d533a133843db37506b2d85c9e9545fa106454c364dacecb63b94e46d438209fa09ddecd0337789b5413ec87d374041b50efa93f2ed030adf517157ce9dc5f0d876d5943a593009f0ee78421ad55205646fa1b3ed312f0f10e15d39b741473c07e200eb27ac38212b361f6ca9dc6a79b62f99c4ef379ea89c34f81e05e1205500855d821ca17beb9135d7cd739d5e0cce940f1b3d08cff3a58030323dc2696b8833b05b4f8274275c8b1226a56e149537511e7e8e35c212d0d4776c660187a077afcd3d088ef03820b98b5108fef9743713d9f07c59fb31cab9b8ece1a6a0cfff5d16381cc080a8fbee9eaa07bb36b824ec1cbace6f8954a20ebea4539d48fd06d6354ce9bcec480a6292a37ddd355c10c6fac303a649d36b48c4bae21e93c79ad9032dd33c73fdd8890134364baf51eed9701e4f44d2b7006fa683953d8fc6fc8e8c015bd8ebafbaba44b483ebc68c81434da3a1e8c7be31d75b1553e93f56fb468a4a64b6c782f6d8c010fdfa986e1543da0fe66094ea912c5109fd5096f611958b1f5e6c7bc1c30bd5ef849b55f989bc4b7e6db019ab75f34bd7c61535dd331d9ce64d26f8a0d1abb21bde3a1c01ed9cbe0b915f301ea25e601b83f2cc7e43c37e24c5620c4cf06ff37a3569fcb9b77fb68012ba5a2c7576dfb64c937da127d0d30bde274029dcaa2d34d371a4466a633022130bd00816a7558e721d9b6a842daee193bd391c73a87fa3ff9c24034f6d8998eadefb30321b9c8f0299ebb729f5d2a6c30eff58bad69fe069ded4d7ca9a3374d97eb42e4e6682f9400f71b4b7a54b3ec6508fad275afb5f3a9e6c20d13a4643358420c6ba5da609c387c18c850a4f9676f599b21978db476336ef8ac5e1194947c12ca4d45271f41979b2c46a8845a715278675d068ee1db6ef47ce5927a904df8682611d9c8a426a85e30ca50f7101ca8cbb10f1cd450cb4acd6342d503ddbfd876d4e874fc8c587f0a83b4ef5673efc13ffba497b5d8d60806c81041506ad52445a24713a301a2860c15edf81f80ea95a1af5b27d0b37da363596473513bc1bc90c50c42d0888c1e0c07a8b48a97c27a5fcda09ab0aa281426f127b7a51c7c3bef6f5db6c63d25cd8fa64dc997406dac4c761a37ff27c1a0c3634255089e99ddc575f5944c5ba75868dd26110ea777d451dbe15ec2bc0dc013d2597db6ecf68103c836bed798f7ae0fe366ba11a20007d070b20febebf315862232072d717a86ece1f6120b9d03b87209d4173e5137a30b8144b921a5274047d1b50c584b581d8ebf2aa43e9d431b844f686d262157b5494bacd70b770b9067e9c5267d4299c66e26a9e1e80097b886c0812f4a1c37611c19e415c761e610de1ce5e3326da531cfa37d66a2aebc751b48f5186684f39a9faa3a82e2413e3e5c8ec23bf8ebb81631b92dc68e51d0001d2e2bb376435d87698086ed120c5389432b879c4d7a3f9f08ba3a66ad840973ec7fee32fb294ea237e9969c9198f8d78fec78b151d673450f91f8533018256d123644406da0156d30a42ac3d4e417ae443c24c1238d49eb7f0951331475b6960669dac25d2e3535f8b8247a8970487444e87c202f20caa97acc55ae96f9b07aa882c7b0f0f7bdcf8ef451b1313f0a8c3edd9f0ae2017656c8785573c6128e59823aa265cc6ad95a9435b5d6c1f644e490f086a408306a7ce352a26a0f282c46cbef0d600f488e066742f3d960d0484e1227f21d2a70b132728d65d4984a28d5f34cb19a098463606edc292ad0d0c48e35428ac66fbb518c5d8d4d108856e5f7728598a7f71e4e910ad32a7bb76721d1d11ac7de5bce2529658a1c6fe91838cffd1d0f5407652cfa8fefb7e2c8b7ace97a61cb04b4cf3c481b74a84ded1b9b29f077515f8025f3ae5ea1279100ea1b48ebf076ec12c692be4ee64b58bf504b6bd1ae098d283562eb95a4bcb051c8b540fae2a92ab8b4de707ac4b1e37999cfb1ddc3ba472fa39e8036e6a5490fbe40aeb13b4aaaed94c77890a5722848b648742752c5c83372768be145a24652e4d489b98d29fdfc18c2cbf0623650a234a0cc7640fb403b608848e75b8b7b6cc56406f98ccfe2191774a43d68c77c2d6c32d06d16b2849af2783573494b71843cfc413b42880e179217815f3987086984330e830959af84095cd0c071a2956bfc711f3e0a906a0faf73d6ab9fd2efd4c06c2155d461e4517d47b2417de36186c7a1a6d228fc7bb9548a26d648afc9be300b18ccc7817ea1cd4855699e3b34e16777dd41ced6b6f81c3a67fefab0283f4587e0662afacefba47264239080d9e7feaa8595cc68c7f1a1d8adb9579e5f19e6ad4d232bd04cc9e39fbeadeb2d9407f2571d667a6f7a3f91cfa69d2c1dae5ba7b0c226ec5698cdbf56e9277fc980234fbc28c38c5ed6e98f30ba18fea06166adec319de2f8cd6977a74401d60f9e2f1265b65fda2a47010c7f0a90db84e46a8cf5abbe5e9efcdb9f60464c981d56bd84b352298eade0df26c436368962988425d01c8bcf8cc7663c8041b5d659c53f1bfcf95516abed1c12b5e5ce59a84bcc33a5a7a085d49c96cfc5904535d52118ebe93d01a3c163ddd2aeca952ef1abdf4ea8ff9ed0b49bea90d50473323177133e0eb835530337f29ea6b897ac0abaea7fe405febd91ff4b605384dc7939a635c508c32277c61ab0d4ace857069737e5e39f1936b5fb40d6b2a1b65cfcdef4af5c2b919d9ac012a3512b2f5f4f5fa7e67245334c68fc5edf08be31d8e0cbefd6eb00fb6fcb762cdb006791ac7d18ffa0a007598a3f7c9fc8fb679add714265f5042c5449017ae73337c19818818de7304e30be96c85b73a0728aa24c24ff486ff49c2d49e9972c1a8d7684b7325a9b7088e3fff849d6dbf519ca0ea0da3c817d91146c2623615881811e53304f39c57d47d750751141c06a41432adf84cd7360ea5dc9945684cc18bf96e61b9107bc8af9ec8f31fe37d522eaa99a920c2d19d6e283eef98152565be0d6a84a2c39ebd542935aa096da9ea147376533324b5f4283a61164a1fa42dee436be456d4b226ebaf0ac50424ebace3b591456afb181f8b9f71192ac9ae1e0ec0e4d8a67973aad3caa988698a5eccaf7691cf70c78108a0f2a1f31e3673a30b6f9c06b4087c4d531491abe2510f32772879a4c51ec3d253e2e6df3b5f1642f3832553a15777fef83ad00ca265b1ca2fffb12a8a5971daa01e67feecabbbcf3ce1898a5f375a46876ebbab7a0e26142e7a712a5477d93d7b6cb24b33e0a564089b0dac45f7dc39ff328b3b60d6033d11350933108dbab24b5b0a9fe9532c0df5c85ef1bde89059b241dc6c818c6169907556247c9b1f6e81b2f42f1edade5c92531d2280a3e92e88d74d2654803a38eb6c068254f09ad55b6211edc6f29df67198c7603ca2d20de6723f043eebd762211caf74c940e0c740826a7e0ce48d641b4eda9480163b53fc9ac8dc3908b3fc93e08397b79ac6aa267bd55e1beb683f702348cf1bd5e4603b02435a90647b67d4f38062c0d4209c11840caf4f80ca6f935b4bd5e56d0a7d0884635210723f6d280c2a972eb1ac544e18a1dbe629c5e47398c95320fa0c841f3063489f5fc8dc63811a39ce24dc4ff38218eff2d1133a3a169451ee52dbba96bae11e887f51e9d49bcbeef55633de9bf6afb38124e638454c6b8f557430a23cf36a29f78369a55b17abb2860fb1540acaf56edc38e35e31ca5767a4d492746863c0b2b933405aeb89b143170b3a44ad4a5c05e53d3bea7908d6aa7c211153595263f08459a2865f84f11128d8d25f4bf9bfdb13b36712b319ff7af651a88785ff7afe0fb4a86abee64f471881a81580a248573c8180efa0461b5b10442b247c5306da23237c3aeca8da4336610ae973d0361a13dceacab1a686855172df6dc337ad316cb00a368943252e0e9847b313b354098b69efa89435053046f0c2a07b102a9c8151f68f695ca2b8debdbea506cba55a9dc5bcef09a2f31a2fa341afc58265fad571445a56a6df5ba8b33e4c4ca42672a615d59bf086a55297e8fc9b7ebac8a53db53256b915578834608eee0f0a9c0d84c40cdf2544da5e981050c95c3a496a5a2f02b93be9bdcbfa03194db4ba449e72aec4159b98795bd801b5ace93625a155af90deca25eb6bbd8b720558e43c088dc2742c37a3b2672bbdf612fca783fe5d1abe59e3fef208e085c048edbda89e434b4e3ab927987f955c8dbe1e8bc110c6679a1c6e7face6b6fc8f8b609dd21c12063d3a5f160150ce6b88dc00c102aa7c00c681009e1147e432c395e086fbb08704928e98d110ae8f9994c423f19f2fbb7091394e091f8652fbcd7baea800097485282c249b63a32fb81b64e595c66fe2c15f6c271df746f9079cf3cb6eecf85d0d6d9d05dbb66c4abcd9c308406634d658fa722ac4a033a4a1e785a304e4a4e07bbfeff03cc58ad44e9324ccc88960ff89e1790b30c3dc539d7d825228e8aaaf2f2cbd687ac8f3f40bb0a184f0b5401742b65987d29fd1992572fe76f2070f938b82f45bbe979bdfa5816f2a8edb626b79432a52403970729079e071f553fab573be13e547d0da5931aa4dff3c6caeb439f4b6a271d73253a1583e2ad2ac00d9c18146f8c430a70332782f186322ee7735d30b0b07d2d9d473aada344ed469ff91cf93ecf049c08e1393229fcf3465b114b6ed7dece8db6228c5c3a0127567826e0c44ab41521e4f24b1585e857a3507c5815cb3abac8ebb812638c14836a114706bc821b6bae2f568a189f93c418053a287e6d62a3b8a6443146dc1d6b6ca8e3461a5c5c3fd645c38b8d1faf0fd8600477346175dcf82670128742074b901a8cafa4032018297ebf601c159f6df1b9169f9b64ad6a319d6d83dd629e9f0af2fe98d75f02f9935ad42b00f97e340863ca865f347f84f9e08481c0830253476c8a5b641c65373fe4dc49e6ce079accccfdb9ec92edfffba3877ce89729f258d3b4dca0a2705a2206998c206e80c288cdac0828d97cd87c22afc28a468011f13c43c6c6a7373ab549f2bcb05e1b22ec6aaa8d9495795343ab755557b59689c14574a452ddc0c4b0c38dd22d0bcd02bdf56aadd6556b130b09cbdde8d466881bc2ba2c76dee8d44649872090f8d39eeddefd523adf46e2e9d9968bb69ccdceda21bf7b36c8be4303b888ad882dda1050c4061485fabb8180a08432f675f72092f985cea7c9c6077cf9f2e5004e5f984a1781985b56caefc745b9593b9ef07c8140f27bc63a514a5815976c73c34a00376cb169721d0b9b34ae9e5dc943d731deb885a9e6eddd354c5fb6fc956d74b6b57a932e32c0c6e74be95306f48cee0039881f5058c3cab34b53b0626574ff49fd65e3cb9bc1c60fab67f9703edb7097ad5ce5a4bb752a315abb13e5906cb0df48753be7754c2a381c1728388e092e356eb500a92fb2c079a2868c942635c8c288c4060b345c7c101275240b6394d3ed88db5237206e4960605c88ba8ba0e0a1d8dc5db9eeeee76253ea725dfaf3fb1a5f58afc7e86c3aa21eaaf3b95f75f33523285f2502ae9f8c42923e8312c8a5cfd4d5af7ab1ac7b7d3168fe4a0077feff001a70fd995ae08bdc3a1c85e64e74590f2238bf00255c7f56bd62d09cd20307d897c7bcb97bc41a05c2d6222a23eced6888853169644e5a2aacea46a7db90dbf560e3d8b9c30d89d02871838d4d1921968248e93247088dc919229058f3c6ba766e745a73e6b26e745a03e68660940b48f024b941a4630d169e99a443c21585a4dda995d17431c6bc297d559807c56ffa4989668903ae900983e50b0e462c2d0932248a8b0c608eb268f1a6998ca2f4d4814ee9378874443051b008e304931a0c48d658e9a9034f14331cb1e60531489864f546a73554b0a83502495061e64b1422a46052e256c04d255dbe1061459a327374605202091c2553cd446726410107850a0884214920b18648134fbc90e1c8ea0434244f5f6e4b38718491234a68e55aaea9e176373aada1a179d96e1c24b1521dd49f82e759ff4c79439ec9990d2856eaf6ef58b2a12bfc312fcc67cee73b3fb08325b2fb19a99f67fd4c637abdea0e9128a9a4723a11acf3765c443adfe7d5da59fbc5c8ae8a41fcf18df216b6354839aac10e9604e04a0e28c0b2a40555684e054e116bce4c19a10649237950116b7e7dd4a0ff8e1136e428d01f8ad092fdeb2f6426ca63309fb20d9a90c4869e8d28f66fc84a3cdcdf956491948e6ab5a1eb1f8c1d7f18ec60afc070bb7c6337611b1945a89a95cb7da12bd6068b7a28da88428e028f06fd6fcc60c37aeb21f97f276b073395cccc2ffaf1f50116ee07f8ab43ac106c83267490bf98a532b52630d627f26f80070a2c3d77b9accdd681c3ba2e736af2c2cdc256c161bd6198e5858dcfdde8a466cb125dc76895cf5d3d88717447281dab77cd5f146a568d42fd7ebd827149cfb32d971a2c44b8e639a959c1113720cc10070423465eabf35a3f1e6562a5f4c3bca9e1a16bc1f2dce8a4e628891655e85363b256ae7a102ceceefebabb1d49acd5afcf69094287b276b8cca28adb3fab125380110346079a2582d0a4b9a2092c9a60f1459a2f773e511653b270a7a92e3c698b135c0df3f59938535ece50b9dd2a2a9d7f04e28f92a5fcc4d8f8f546a7334d2e17ce065b6f7442220314e346a72448c8993f7f5028740c850ee297929a9abadd0827c2991d45edd8020805a2a2a2a2a2a24c689083f893d674b1876214d777c487a2a58859b83648b9d97447443418cfc0f02b0a5fd81f6f0f1b3c58fe28c7d6774929a5548a4287055317dc500715446480444a0719635aa031664c8b8c129f192d891771283d649fdf7fe0e1f71a9bcbcee4b6cb3dcfef65607ce8696ed7e90cd2f53897a55412e343e9e4f2c75042b9cc0c67a6b4c4537c4b826293f2230fbde94649bbecdd181f5db831627c3533c58df12dd68e187688bbad87c1dad19230aca072617c0f6b078c180bb29ee761ede8a9dee5f9d6e5b93c2f7be883cb43e67679ca287179aca8e1f29059c1e579cbdac1f3f677583bec8ece0d5b77a7e9ee5471c4dd2133c3ddd9c2d5c498244f4851912a2ab610b1408ecdc10229574a1b53c8b92d59e9c6609e37f6e94f14d612027110c6e84b9829ee1413839829a610e2c29a7081a102004f6a5c53829932e7e492c39cd20037f4bebcf9a2e476532f3a4ee98280af6360030df66701a2c88d59a4c4b17163162950b7c83de9ee719df79d74ef1511002539d66c4651ba34d214421a79c38d4e5da4ae931727b7d90a474590d799e55f6316034054e1d26b54d3871004c3449919ba7881d6021844c66cf1c5cc911358210b63142d42bafd55caf5aeeec6a717647045552d5d83159dfa714a6cb623e240d5ce88a9a1ccca891ad4d8d9c30e1c8a2063060b1a6a51d0291d46a4c375db3ebd6082da73e3930bb7ebddf8e442199a021b85ea7792a5cb552b8c721c477934c80fbeeb095b1c7777b96aedeeee15c85ac17eaebdbfbf5a5dae7eeeebfef9f5bbbb0ff076c7d0ea21f935a67bb7adf496bcc09deff229953e5ed23d96cd97a5eeafe95dff7cbcee941f1692a5df68b07ad0ebcef9ea31a7f5e016a937e25429c202a2104b97ab562ae79c5fbf9bf5e5cdaed5e59a5fe7fc6451839e7c3abf5aebfdc00af5aa5ed58354f87c80d7bfa622b8e7e694523e27a594936b59d70f14b1655dcaebd5659518dc1ab7a83f02b90cc2cacad518ad03a8d950de1e929ef44f36f8d3ddf22c061700b7a8ed0d727e12366543795dcaeb555ef9faf1f83e3ce8cfb8aa4bd3c4b9ea8eacfaa1eac3b0d6bafa42f0aa54aa4ec5b79b7332a5ee2ebbee65f7450fb261a46d6f6f672929a594a33f0db28bd2293f15bcfb634e203ac77cb641e99c94523ae79cf4656dfd19aaeaf51887288dfb6376e1d21d03309e6c949e853f3333ffb8ac27bbe59dde0c5dd7bf8891be627d58f7e10737aab9f5c8a5cf57eeeaabf70945e0521983aa77ebf317feb8f419acf49d999999329dac12b8cb558e525b55602565eae27bcccac9f3fc4ceb3efca0be8b5760283acc4b5798fb22f731762aa694aa2853ea5cdcd161ad56cfe3adbafefe1556e195eb7db873dbfba2f73cb9157cf5c1517d70e80787fba87dade041fdb5391a696cc4330f8e6cfc4e880b6e7ccee0c62f5ccd29a794cdad3be59c73e5f4c6771bb36ce5a01fba38165737f6dcc87df8dd48e3468eda06a5af9c73b08dbea1bd9c235a6b7b28fe18f0dbd5c18511c1fe1068c836d8ce01dbe85cf2c1fb5e04a594cfc1fc6695f0ac1d3282fc0e833188207fbfcb43f04900bad2f5651ae9e247a01dfe5d14eaef1f20988e117eca782d3d76d6891771c48732b3504929b5d511275543f11a62cb9b34337019f28516cf892354e83439011c24b2dca67803c584347ac2a4c6d8798ddc17ba62fc1f7355e75ccd39fdcaef31a5ad3e555beda93ea029d6eb181441202e6c4fe9e473ec39552ad5bb9cafcab4011f3d4394112182fddd4996314a1dfa45cdacda3a3b2a150c54bdf7ea56205011dae3e817a390fc3c462e486deaa40bcbbaf1c9c88633f6c90849f395917b332ee5a453ba198e1a31a5735277fa9452779752bacc74ccd5e7a8648ea24056e94ae2d760ff297b4a970dc629566ea689155c21757c87ee39c70ad6bcf1c9c8c8ea091f7ac6d61b9f8c86dcd03e19b5609b58eec627215ec45a1108232c404817b7bf5a97e5b9f149c81418d5c66f7c1212d53e373e0919c2bbf149481167a500c66270e39310a4285b728f4ef8e3f62b610db16ec4104228b0310b134937ccc274b33081948529eaf64cd6233ecff6289b1f8da8610eca9f2f2ed25cb2f9e27ebee88d342b9befac10b81b3ffaa255d9fce6c83221d61a4ee7450b4c4ae7142c9732117411e82545047716cb5480cd6169c962e360b684063333d7dfd54295ebff44ae3f99800cac133386cbdc18cf3cb1e4d2078152eb51ea5ca4189aa3c39c3672ce5017ede2524ae99b8042c72c06e6e7c978ab9c242c1c8ecaea7100b433934305d672a40c611811ec0651085aa0682147c98fabca5833a2ca81a106db1773429062c983627dc241492284eb46a7253af4ddb18699637c216294bf3cc618dd99741c633002b47284b103b0f98db08735d195deec3a30182ce288eda6232282c1408e39c6586e4119ebf40599af5f68b195d9fd274e0f57479c31d7dff5850f1fa412e18018aa843912450f4a67e864a2e388a726988620ad40ce0d221d1cd3c860658d4ed86b01104cb4408b6b5560430f081c73fb65bfd7564483c54919db1b2f698e8eb09960063169d41c0184ac270fb79f3872db6b49185336048ab18caf17526edcf9dd6a424287bd96675b432cbbb174133774dc8e4c71cb16729c78c3c41b286eff7381c3ed07b92873fb6129b8fd444570b6dcfe119844a72eb2b8dddc94d317b7eed25063c31f737e64d1eb4014fc9e898d3f3fa12ad5e3ffc8d612183f11ff4f516e557926d0c31690fe3748ffa741fa320ec5abfa4a6f64dd1a33eb6e1aa40ea741eab72844a5cd83329863a5cd632da35aae0a7c29eda48ec528a428ad359415dbb32dd4dc1e6f0b319775756e270b89a4f3114dea213abda31bb6926ef8e37399f945f0cb37887eac0084465f47c73aa98398441c337412e7e0226c63488cb59e1281b0075d6f5da1ed263136e36947b9e0c39e72691b71692f71693fc198f2d88c8f8f3c88be4be7c397f1b9bcf27c21c8f330be50e8863cd5f385de0b496cc4399a8768833efd72e9f37ca190fdc2de7269435dfa3a5ff8cd74e97b5fe8fae968ab3feee5b793a2107d1987bcd856d5a9bcca5a3df7e2a041faddca53b156dfafcb3dd820fd400536fcb9f46915ea32151a62ac0e1183f8992ebfcce1b252839cc62a29d91bbdb0a1b15ad0c6d61bfa2d7ab9dd426063e58d5e6e696e5895eeca633edc4799ea6d75b96aeda692c76a103188bfcad295da652c97953c16654b77d66653558a423ec00ea6d2accda63965ed608a5aab4d55a92e49d60358a6ea227df5e8fa4eeb53fa22f8d3fe10f0a5742e4d2a0dc6a9f44267ec173294cb4dbb4f540f2221a922abbeaad4d5a23a5b57eb9a9c757441112fc93e4f8b6895e441f2e7c77801d1612507199018cf022582265b2579ac4b527d21118d6f7d216c46cf17be8ca65fd2951f0c747de1afa4eeb74af218118c2f2482f17c210cecf942d0d5257549577e046c940591d10f23ad9bcfb31b6f389fce9a2e1029f38b5188c3caf33d5fc8b7e7574811078cb74166b3c8b9970ff73cbbdcc37885f4fbc1ddd6d76307f77d20ceb9f443c05dfa13c6abe8d208d8288b320b846732d59107c9973cbbf543fa56c7e5817712cd2fa46f69cf8be77be25fd435ca63f10aa32ea0e6d8c0c5912699fc6af398fc2ae531f975ca63f2ebcd6352be6ae631f92a9ac76298db9426342481a3441732f9aa23b7af14ba586ee1c69d2fac3a5f68595fe8baf5c1d55765916502258236a344d08024608933b2fe7c4e28418cef8fb228e3b62461ab2daa41024845dd27fe315e406a4cc1822e321662fc05329a64313e211298e98469218ecce784068201263ca440d69f0f0fa320321f1e9107902032ff7c7818c9f8193e3c5cbf52e3054a881db63892cd6434c97c4e70202b3029ea181ad0e1899bac3fca7cbe41d9c115351efee2e141f267b83e195f581760c446599401f911c50726ebe00afb3ce4a320bf48fe08928b0917bc3a2eb2182f1a55087124f39278dace1c369f034adda9bf9a73491dc72b0af5108da3864a5346cc16a5a55a13d2ad06bedd647cb1337374caeb79cd36a6eca9a906b9993a88f9cb88e1b0424181a2a4b454e3b8cad1a9525dfaa6d3e0c2d8467cbe7ef9f3212194970370f9dbf93e3aa5cf395b04d27d004e96e5fc504af92c9d03a006230e599b39a7524e29a93be71d5f5128fe74295db2b7810d96dddd57aacad129573d4eb85d4ed54bca393847fdb9e21db8f6224e8be31bdcd04f396e831b2c739556d554adbc96d3d8463b8d73c4dbabce3bcf697ee4489ee4b170f0377f0820c23aed9de634a7396dc5059571fb69389df5063558fed069ab956aa5e334a7d1228e586f3d4874fc9d4ffc20774783dbedf4ed763a8bdbedbc6e5735d0c5186374f9a1bb47f91c859c6bea53baccd1cdcd365c36e76d60438d1cd9dddda3bbbbaa3d19fa3be72e95b75ffd720de46b6ac079f11576163736f88a2a36d3797556e726a592cea9aa9c06773e57e0fa73955fa9aad65a29e56f28052bb66f77c5a3fa0648a4a494ce545760b75679c46167d15d4ae9527293523ab9e61cb17563b32063cc7a5f69ed74efaa5f8e3898d93fc07398fb02408df5bfc995378387d9537532d460c4861bc26a0f56e7c62723435870ce1869a163b29c1750b4e1aad8d514376706a995125a584b58d68d4f33345144b5d576b57ab6956648add6ab4a24adaa8881bb42536931428f7072c40fd53a3161950826424d8933a28814e10838548988c32a11ecc664065b3d9b84511245da2a79e18a0d094d842b4a6f9358796284fbc1eedce8f464568d6c85d379c106ca522cb8247c28e3b900468c0f512b3956dee8e403d40d221d9cc18d4e29a0e243a7f1990ed1102af0181736f47e6ca071dd6b4b12816546856ab39909d2f4541c8a65ca8811b3a5a1a0ae7f33c5588be94ee2870225742dd56ee8e2a31bf2d1974217cb4737cd4da18beda9fb54448bdb3335ae2b7f7a46c4315f3e8d113847bf7c05700e57c451afbc6164e220ce1f1b39d877dd8862e387ae334f44dcdc7eeea7458c2e7ddee96c8ff9cc2ebb841184f3ce9f2cc9de834968225de7ea211f123e1f127c5e6f19d145b662e3139132977bf9d3f6a0df9f2da16ffc199b5542973082705ec997afa45f28e3d7437e3e24b4d7c6d275d3e7940298758d26270906247a5afa8b48134b4925a593e8c63120e160c3410b22513d74caf84424e90987a8d96cd6c2bc2109ae7cfe7c4890ef0cf871b19131c69f9633f31166a418168c4887d7f256373ec140c5ab51274c67b6904b589e050c192b6f909420c34314cb8311aff943144958e1059a2bb3283c30f1c414955b4153b954373ec1b0c415d5f9d031dd88345d91831210495aa497007894299a30496202324ce64c45216752ade361888e4c92a37222e949ae8a4018610115862312861b5cef7aa2c9b9f2c6279a17aea8ee4a5d797da2a1a1a1d5a09744f3a058db4881402deb79ad1fefa6e3c4f2dcf844b33dd1a08039a1d51863951ea368e8e22dc14bb8f4e3084ada7df906117c690367ca93244af410050268982cb9b14521cd74d4b80372a4cc388963648a9099020f3461a58a175b2cb1218b0c5fb2386a294e9852a68a27495394e430511004e9c88a23cc58a142cc16185837782828429bc98616a41336b8205b8b97da583416dd533453ed052180e8b8ca8d8cd41f5e89b5f0839794f2f51ed060f95d081bc5008621cc2c39d2029b1ab6786236f9a0a810e50d95255cc802871fe8947e834887d7f25ee0c1aba9a0e32895afd7df1ed3c7ebcaaec2840faa13a8a60f1a2cf9a10d933654d08491b3720209ad673ea1401a232544ac0891d2504685f185d5f67ca1e5f942579f1972fd2f78795407b943d9f9c277b93c6e929472ab157528efe650d5a1faccf577281e9347ef72590be5aebae6754da76b3b5db31ff21c6b2955ad388e53712b8e6bbba3e3ad62b0565ca792471e934b95e70f8ebbbb9b5b7294f26de94397754e2e5de70bb45e72c983dc996f0d7a936492b5063de49b5cbab11b8623c5d31754d1b42ed21ef8b1020d24a97ae2d5223774a3eb61234192481de4dff19cb1d65a6be5b85a5fd6d5279134e81c07c900c07491571fc579f9cce1d890e35cff304ecf8c82f8d25ebaf9cbed8813a71b1877f79e02e35fdcdd419bbb7b83e959ddf5795fdcdd3dd6e4174ea25372788293e6d3963f9865dbdcdd9b8bbb7b83a1b6b675777f691bac6dd3871f39e1e5051f7ee460dcddbd9d4bdfbacc0d4cfa26a59492caffc12c058fe131b20926a860e128f9a6862f1c65836259894a03656b2fdd42b7e0725a987181f978f978d510724b420b2c460ab8448149ada294ed0708cb911e7cfc74a9de856967c812553051a69767b3999628cfcc941344d95a04c801ea4c4b76971b306c5090b9f1355f1232303284e9eb129b74942cb569b2f9e0400613372ae0c079e65eaa77cf66b3d98ff602ce80324305f4e1924d2ded227f485b2745114836db0fae72f3c7d4c143636aa2a38b941fa5b39855c20c283353e4e56e1a2974b1fcf1f63b730c01f7483133f30db6ccdcfcdcdddddc13c5ccec35a82eeac8d40d5d47acb065be21bd9f99398339967fc9637d7928fc49c18a9dcd34b20613cbddf8cf57a58a55f5f5f501166ead3598585a8389adc1c4fac38ab0a12f71f3adb5f97e35a290bfc7583d449b228ed53b177276eb628a8d141adb98a82fd7bb498aeb2f8be874cd83fc43c7c200d5d3874094794f9fbdead5972e54c58e5074e3c9020922f3de63da8b8d8a6a70b8607343333546ea8b4d8aa8a6eb4e66d7df8943f11f5ca9872815a38ed5f6197b7b17d96006bbe431ef5d7e91c7a26fc063acf7da7d2efebe468d1a356a5c07fb55af9e19c164528744a7427ff72b46232c1f7154cc9f7f048fc967368a353ec23159acf151acf151acf151acf151acf151acf15151e5e841f13ff6ac83e2532d5c2873e6726c581fd1a4a410534af95ee84d224a79705f000ff2c1c70565a4f4966cd0b6e83b8d3c6107ee943c3cd7461cd1eba1187dae0f09e1bc31c68d9f8f9677d1c5558cd50e8ab6e7f6dca266e6001ba9ebdd5555bf63ce008d9556644d5a514135a85231775dd7755d77c7bcfab65c476375fcfbe51746840d5b2a84216c6859ca97e47be850508842fefe491e780e411ebc8266bc7866449b920ef2964a2106794b5d8771c54ea959a687a67a887b9f3f2463441ec41425e5b6ebbeea3e9f137680942076017af53fe4ed0657af273e26ec7cd7aceed1b10826ec7ccf4360e77b7ec8db7d61aff8d561a0417f14c4d830da747ee777be121475b13a1f651d4ea9160cb6691493f7ac8f2c08f83c80653d6f3fb220603f9f07b06ce73dc89b1aec91561af4e779cd290ff267bde6ed459b6854832e99ae77ef7c73014e2c95b9e4a375a11a7c9b982d52ab59a6419f5353aa41ef19c2aa3e9c52d77ffe40a9b81e6faa9733f590bf37f550d8b3abf3fe34fc89faa778542a3b03caac690d366d248d44a5baee39d26fac78e1c209738c31b21785fa6978f1828abcd18b174a6fb47883c18d5edc2c69ddf8f4025317bdd83c5bb800513f2c3113db3ad6329a94142933d043ed3caf787b5e3c2f593b78deeb1181837185ddf9f83a8f815abbf6982582fd1ecd7d2980a1dc7bfd623df762bd7392c7663cc7f8c2dafa420be34b8a41aa6715cf222b04fbaa9e22ef91dfd9977fbcaa679fdf79f9d48f977e1496f531948f931a74d22073121bf18c691d00c133feea2db161b52deb9c0fc7f51033cfcb34cc2ef316fee132f77033d762d8c8590c68369a91c0d12ef79167023d886930de10b0cf0918c8d00392a4994cc6cbf85890f132de0046b5db710630aa5d7f0318d52efbf7646600a39a8c05199f14fa52b80f7265bca4d0bff4f311009a035ab704dee1f6f744c633eb046e92c93841c65ff0177c2570bd8cef828f32679920e35da08ccfe541323ab802944134c2052f1ecccf4abcc4490ca5e399400f454d811e8a7f8bd1360d0b39b2e24856dfe517b6bbbbbbf44944e316c55ba2bb17f3918202d543f1e968899798a97f4a9f3204893848f0398104aaafeed5955cf54db399ea832716043ff0c182a0c74aa08aa9be1f4634e433a514b7bf9d046febe4f6d71709549f8f777024be605bd6f5acc44bce506eac2d7e4c9e24fc6c366b2d5d040a5947b5688d0d6b104a11077d1b96a82b97bba62a97bf436a70c7d3d1ec2259ea21a51e8a4f466e547aa8addc340d2a3538a9f8844943a5b62b0d06443aa9ab7535aeab819ce4645b49099d54a920796c2a4d246fa506b90337b62e35a8d4e00d276ce8533eb12ad51cc983aae4a6cb7de1bc1cdf2e72ae66f3aad445b9aa6bbafc0730b2306e7c3a3ae23bbb61a57200176cd8d55834560c1107f7dc74c3ee5e5e854bb10d7ebf451c53290a1d451c6c626c0611839887279c4a019ed7a8e4cd76453d08d194080000040053150000280c0a8803028148281eecb2ec1e14800d74943e6e50329807834990a2280a628c3186180008004419420c414e8d19002b6ffe96dd366308b7e0542bea00911b6f4a9d2a721caad2a02ca8931ab28a17b8520b958855a51a0c0889dbc7cc05e52407378edea7700f5446d8dcf6726242147f173f4bb72710a0783875a5618fa06553a6e9e68cb8e1f95ffc13e0de5152efb9bc48b703294ca44718f9804289730af3561d31f6fafca85f049a979ccea4130470a8a72384226c83519a9379ff962613dffba8cb0032a9cb871582288843a64b71d6edbbed61c90cd2715a32029dab2dc14581a71d2b4a7286949ced4d7d98be86bc8c23ffc36c53c62182ac190120921218a0cb3ed553f38863f9434c34ccd0f3d7595ac5a0666d61c6a709ae25161145478eea5fcff02ef99b443d8de2450477c089a62f1edfd76d7701433ea3ad3c509851d5c013dc3a32c52125149fbf27d4b8aa0be73fa23b9cfc028b781089a51e3913d89fc790732c1a0633fc4e839164b4032f797cf40a34e5ce31402f279d8b6d85e32d6a68efc00c8b4ba1896fb669801ab1e07a917f99a91a64ff4fc8bd73d3e863fa4de335c7c7856f14737f8892cfdea535c5b7e7b528b7bf6472ad1e8eb37813fe995957a41a0ededae4f8f5103446e05e1415508f0f7f5cd703554246ee3bf1b278192ef728ff5e81472febaa9d8882a77661e77dbe3d688772ec01808f280bc40497581e20431f67ca5361589f252e0c21845b97f13e8bd521d563471d94c1a2d7d3074a11151f1e714731a0bdb7e0eb2d9c9dc45d584bbea2c09a138f356efa38b0c3e07dd65e5e383154f13076a99d6fb55f75e0b650dc4c5a8a8b260b3243f44c42e2686edd49d8194ca63913d8e71a540bb4b7d5015fce312d4658e80bd78cafe86e56b9ae7731dc50eecb28d7edf8cbb20711d19a4bf691b8b705bf967c9ba8749d896c6a0ea87b93e7a55e927b1b4424c3c29d96da881ac72d2b9ebb65ed00e3f6ab218921582f92c9a32ee0735b83dbfe89543c030831f3d92c9bdd7c477934f280cb05e435c823f88c35cd6b7bbca76302be556261cb4078f1e1bf0e4abf4b155d0648d7db4ea2106ea3ba418896c60d3e7d2fce39ba77e825737d33755ca203a3160f504e5e735129f919ab7eecdcb56eee67ce26753c40b4205f594098c2d3df2aca420e8c8b8df2888642939e068dbdf39e5f1b1c7330102303f92ee3448712bce11bb49a879b1776bf52190788f8b50322049a34a57791f558e96a94c7453be9e2ab28c0aae630108752be724c1919104d993cbf3a29232773f75059d444ab3bfd545b86b8d3e5b350a6efe2b953dec4a7adc7d5b58f345aa412293082d8a1c9aaf5570e48abf28e3f87260d57b332cd1f75bbc08646ce8a82c89674a99101115eed65e3060a6441b81e503ecfa54fdd18363bd2e43876c9ca70166fed2d5f0f2c67a81b9fe2e749863fa44db694159e1e56569c09ed311411753577dcb968140b24a64192287ba961f95cf64ac458840f52bd7c5339434ad5ad45f3b13982e128a338fca3c827221ac96237181bd7fc7894167b24ac751725b652c7526e0d6bc279e38014b34550636ae4765802ac6f113e342b8b89b4356cf22116dbd8b107223840929557f5583a642d597c70b4fa8f32b455113057f7c5d8e31b530fdf2d3fd6b61e0a0e2574899465a0b688a36e7bea870995e043c56a6a4da97f54eceeb13eb389445dcdcde6a606158159c9034ae0160e5062639af61db38ba6a3486cb39305d9e4466ff473dad28e2532fadf231b916e75030242106c79ed00265bde556f67caf2cd2de85cbf527c90ad8bcf322a854384e159b29ef225c55aa9bfa25b8f83a7157fb682fbda26d27f6c655496a9f594f350f0a05a9267b54514a9db7cda94d553e44013c7bc80e37e82584736b50bf2654956ba640e7007aeb6b3e7db161a89f3fc1a973fb105a28f45faebbb3302a286b8108423d79b19d96231001a8f91d5214eeb7a9b1db703209e18456287fc457b10b940dc810e98624a37355296d0be7caf41a0f1edd5f74bcc21c2398b6479cd7078bb3230cb419d1165418d1304dbe386ddd61f996cdbc061a4c41cb4b1934fc500a8cb3ec2042b1b53be17d325e628e6289a0809022e0687d6a5a2e9ee5e5619cfe96a0f46c9eae1428d122c1915c51cb80f2e7e89485834ea09554cdf522a186b7fdde65a8a92b55ed219d3367a010c1ccc054e9e23a959943b7b73cf6b32f80229845f95dd9d7ee4da322917fb543a630c675b3d3f5b70d4328631350d1c3b89b467e5d9843d9dc6d813034ae5b74dfaec2e2da651d8b1cd4016da9d010d3ccf682f9d3868403d52ce689a182ece2f87e30c0ddb8fe3e71ec17a1f31d3783877d6e02cca69c77fe1f38d77e079d210b44a9bfa18a7fe7d8e18381d51e1ef126b6f843a5291095d4f978a1a64716b30d85f6af528fbf2fa3c76087d371ad84cd9331e1bb8759536ee6d5466605ff61b52a21b7722cb84f737816f153b696509458c07058015e910763af3de3c44e2c12e475e19e3a2b8cca0643bcb9fe9355de035c09e7a96316331c27208b8c4024f12d41187722ae264467e9c07a054ab6451a82c8242602af397031754fb09afd78eb5b4ee5d49a1271f0273d40ed39abf6a67c3ce32149a181226716ec741dc6acfa4d928038c67a0bec1eb219e13b7640b17723ab02f14906a988d43cab1449977bc181a98012cfb445a801fa77b98e5e800b81f472fa89547c18c9e8e1f39f64767d09073f9972b1b19b6146792e418756b8249d941708a494b2010553f04220a5a4ce8362870e3a9ffe068a631a2a60b2cfd1ccc0ffc88ef9d0177fe79a73569a01c8e9fca29ff09c391b27690f0744b20088243894d5a71549553ac5e15c503c170625e60ab9ce6360ff19513006234e41daae9d0875b41366cdfa7b979b428644e353ab3c3f246d1644633c2db4eba3e852c4aed1a7acfd287ad0f79f01207896f8f442f7f3a8fc23ddc76ee71429aa4a11c1cc16a1f5e551164f6aa204f2283debb9eebd85d3d3a7cd37c163bac559ef50e85b252e3e6287b308b0c3dd038897293d2a9268f2e9993389475e4afc45b1cb231248f5823356e50901049d5fe82a8e19d36cf40bb155344ec4d8e15dcfbb0a5951bb8adb16e3cee0c7d663c83dad3b53c2a6bdd7f698a541ba6e353b4c5d36835143ffd3d0d58f59d79075b18cff7e13db86d12d0c2e1a75a70eebc206ced5f21af8f82682aa45fcd5d32fae54501b1a13c99d2991f8bf76d5908927f35bd3b245b09f9a1dce48071a9437fd557568600bfe9437cf97b5dfef6f8cfa76683741bad84d5c0a34b74bd6648cd7c3a42d9529b782add61bb6c5c04f05b5ef39d41e3e0f9cf8d7b0f7891d8015c38b7ff951e9af614bb2ce51bcaeb058d0228790922a39f5db685162891582da6a79e95e38c9c6a94b8cfa21581cb8849d8b253ef64be50387666d753a1a96f007040b4eb52a4b10f0e75deea8ea7468a322e57887c818367423a6542ea2eb4d08afcb8e173ebea1c14eef57881a6ce796537e4b45d60390dc9d73f4a5b66cbda214b26b3792dde1c64b74dcd55934a41d2d42eb12ec24b5bb37bc72ee4ae1646e109fc43367183b2c2f967974f96b8ebad1f0ad020d94129c41db8ae055acf85f334cfaa571ce61780ef09af57b875831f485cf1708e4ef8d1befd9055ab509cd96623a6df7ce5ee901d44177cb0cc0f433c9098d680029db5402675a29b9504f58f6a8603457530be70f40ad26c6b5a13314bfcd344dcdced5327022d133bccc9859480f09375c2a1f12c9f5e8afe45a5f4362fb985c4c2939a288d7f992e8e36f0221028c2a09666264fe8ea004e48167fdd932800fe915258d0249441c61471808f0ba7b830e3943fc5e905daa2379d4f0582963fe4802b4661fb1ca14092a8335d26e40289ad81a43707cadcbe3a6ad0a0f0f352a482186628c13065df25b73d28986130a1d35733f9510d57fe540be232c23de91fb76db2ba4f85d456c2487080604f74e3fddd7c955e1f5353f41a30ecaa3a6bd8126b29605f749178a290b94548b35c0af93110ed3cbc5bbb4870115b6af7f7bf4a768be2de97ab3951aee9fdb78bc615deb5b10b792872aa74074c286e20e33f901d33c03e9305d17698040e379e4487f228a75c241e58648038483569bcf5910fb923403310a39cef236740ce07c87105ec26f7d13113de2103d48f85570252a4fae88667030618f15283d26fcbdef3a6417597895eb88b789db58d091c764bcfab0ad377e6fa558e19df125c4322058377c8ca82307068485bd4f6d790497b6f512b487db18249ce3b41cc8c656ee4f774d1470634102a6fc3261875701c4f04390c14cac4d6422ddc7e23a4c4b23151d1850e1ced1173d913898d4bc234f068d6a964e2e2b0a852039ee09072919ec733eeb3f79e452b9b94dc3ba817a747d46aefb0a7ee6946dc2c12b149f1d056dbfbf8b3b108b0f52af1390d3a86c4e5df60c7172f089580a8d45b933ea6e63c9896d965528112b6cca690ecdc6dc4eb46cd627354bdab7def42f45f8f2ad9e6adf4d5c5a493697b5793ff09256493f9730840d63b38e744346b48f1f1a996d7c9dc3b99560ec9811768f9e4b35b050165aece14673e26534bfb194494fe0eb2c679441482e9d7dcdf70e4ad538a54c20b2219afcaa504027c82d9959e6c0ae9d853148a725129908a8fb79cd1882a157bc9826ba1a646c51366cc9eff3b9b4e5652f3827b710cac3cae0b09713d5fe439deae3a91b731b888fb72328c38047d8d1b025fcd5409135c663bd11a823f879c639054ee204347b557646e840d294948472e5f909dffe1e35e7072c4a89e5326391e9daae7764b25ddd255a64de30c3b884487f81555c4df4f6036c90d09942dbe8a88affe175b2c84386eb764ecf4b52dbf587bed8dff3fd61da7fd8b4627462ce2c6aa9a179938071759e4722592333790e93820278b50817627710184e7652c97b74e8f6df5f1f12077ee67e632fe775ef1847e5de9446251f95a8d2d0a621ce165905eeee83109c1178ea413049fd2192ff99c89e2d4eac357103952892459092e7f51369e5c53192811b37c9f917beac07b83f2bdbb765b584305603702bd32473c175d49e914f16b64cb18ce7650b7c24a8df26c848b607d2f9b5254f8ace4f85ae63c62608609cdc853b9dd567f82034c3475bbf56b48d2a457bde05ec962e545030d17e6a822cf5ed0360e53da0c18b46c145f55cace37b6419001c7a769fc8191889b32a1f3344c9503781d20435219cb740c254519c1bbb9a28cc73d4e109c69956b32bc83ee7dbe1095ecb58c58c3ec4584a69bad8d50baeaca2e33a895b71ba334e8aceca0e1ab69beb31c14356baf492c8a6f2bb3f8de475d851231140c98f2493cd333602a35076e88d812c860ee48a00c22005bbf8dd5a6cd8cfa8af51ddcc9a658370ddb117aa29e722ecd1f632c24880f07e0cda0c14ffa88b212e0ae1326adf05bd6698a43f18a211ba60c00f5929ec5fd4fab264398a20b2d4f2fdadef1f91e6766c299e95709a01438f46bb68000bf8cb0c926a3170a8032b3384ed7811816f35614451faee63faa539c1b4f719478a03f366c23e6445a0c823a5a605661912a2fc4f3460ac5c5cb8497a6a028e20441f6e67300ceb16762934552429ff632739ffb3598042dd42749b6b6302564bc2cc6fca45b5705d618ab4cccb1b24137bd0ca9d3184dcc8daddfcba25f4b1dfa9e6889d53cf527213d39c7223cb186f9930896cc711330e3653710baf72be854e558f694b79b371b191616275a347109cc9cc2f7a0564c0637c14a6885aa0868fcf4c1cd695ce26fab2844b37e9449081dab3afc6a2d41239a69f4a9e7662c26fb89bee61d70875fff535e54529b8bef447d7b31ed10a4a81a41de6b26319e8ed5d6b890be38a6a5337ff147b46ee24323c00cf1ae97bbf6c859e334261f99d40901266524fc5c460f0263a80317948a73f5444174cadb63e121c8ab99afa0a22878f2be100a27a9e5a995aa4bd0595afc9362abb2e667da4839e8793e5cc992f31fbef97f514e976777851c66c341a1d979f254e6d9dc61701c5a71c249f7a196eb78cb5cdf23615e6c8048a43211219f72821939a4a5b13ce1e664a82d1586af1627c57611c085cdb6443691cb25f8600d7b3a8c129826dfa32aa4a342def976c29496c68b2abfc72e4338ff41a20ddc01084999ecf08f8324b51da06ecb745f32d48460d613b15de86d0efcb46a8da0f7aded379279d6780cf797207ac3b7a99043586b02969aae45196587181053f31a2cdf2786101943a748dab337ead0b11456704041e20dbfa4a46d4f7604f2c6531c111f42e88d098edf1c2200400d13713c57dc48666c4ca700fc16b4fdc55d2ad004d1aca68930e0eae1f6d11c59d497fbb20ea7228630f78522a44f14dfd275d902d3ab6675d85b944e9ecbd55c0a7c8c019fadbfbc130abb18d7b1870038593d95aeb643841cf30ccce555709e18bf557a1f9594dea329eebd1845e9be06d6369b3e41b12500875a7b6fb059ebffae523a56646ca18258e54a741e421ce3c072fc7d0b26daa72aa19328dd18d0d588ded39d2a43422edf2be80394033328604647892d24fc904539d4c9a8dc2f49603730228b8363ff36e5890cdf5963350aaef9304b35ca0020137cd92043b20c9359f023f06b846b0443a47e7c6294c32287941865356ae99c1438af40d46e9ced229b54670a909fa244999788d34c54c3fa59a6a9c5fcc0b0ba6d9a9b725f0ae568bfcd7997c031f1ad5d87678d4e46083402428a2e215db47380e2e1b5c3648d54b334cb8dafd6bcd43d2a99e9f2f2588ccd2551acb947ce58a1ba1d89b2c644a23808a691c010d896f728bc8d04218542879750e07ee2063769de0e60d8759e5a721667c1f5e403e61ce181e1338159f0cde78e5cf209501b01c8a00cbefcbd1351c6a056c9ac6826a9a746e7918a642f801d8d58228712fff43b4430dd5a9c93297b7868b10eff9609283e83b913b46a45490786e5b5e2cc895c3961c2079db6ad2cdb0679437446abe7129c123b1e8513eabc9f611e337cd6a601ac205c94b646b26683364b7d1a68ee0e61919a950b10af2a61ac07aafba21764685638501366194aa5c93c394f239cf9e122485ce0cbb6369e85ba5093ab1ac769daf3e59b08b53611d39b51e80382688163eb5fb4237a8f6af1f56d62734609ec087eeb7fada50890e150ea20220745a6d0d8e80361400bc2edb42a518873e49fbc49fa1e7e981547c0ee12822b4b5873ae53d681d661b11f09e15ed8a14a4779c037f670012e05fb6e68aadae34ec3562962b5601e1024ef011b77c10ade384739aa8debe19fc651728d68017dd6b88e13396e1c819f992122bdf3571fadcbadbc4eebe7e3abcc7b3b215fa6e37c1383c226f1530f7be2dc42e144c03109fb161ac46e8808204c3566a7321a9de1d3cfe8f4bd6ac8fffd4c06f5b5df8b2b79e7fd638d41b2bc5232643e23dad50b1d68a3e78e9373537f74b428cf062e7a8127777f0fac4f38cf4c5c7dbabe9062598960d7c310e9f730beafb9c38159ca9ce2d052d6c33a05c32f9015807743a978e58b000940e92405325f44a77df78cbcd715d28c9bd3c27b120f27e32d0c434658588ea61686ef22573022643ea32264800814655a8f90f9f8c6275c4fa7b6bb30747cc8afe0a534d7ce6f5c77246d0802fc7d2309d4a2b660ecb529aab3c6682bee9428b07a52b7b0d4b77a415aaca53ae84e89ac28a5d512efbf3c045a699b44293dbf043e45bb18d517154c25824a87f38ac413511c0e5bd321db836c18637777436147b20e066eefb8f137c602478271e90d32c10c9d32764dc9d249628efe5ca13dc1446f683d920700a584a44c7ea601f9960315ad3223086b184fbbdb212f95565861a515540695155bdee0a03651e8f668a4bc67067a75eaff6312b0d3d8f483703ce93f7e20907174d0f01ef2f12c55925a78a5036eef6b6130817ef46c96e93a11e483e59a1b4c5c20ea5da579db0387ed2fbd520595c7340ad2904d60d901f4c5c4dce31c9fc5c314834a31602af3f2bc2c00e791a1239540752698a2b7e5f7fdaf8376bb9563fc26acf68e3efcaa5a90f5a0cd32a92334107cb4fed38a23d1e395e6b4ebc14f85ea3d6dfe31157a6f853a5a11932fd81154225a422cc59f9a6a49f59042452ae669b0d1a766fda5ba922d494a5f0527024a07aba889a5b9df0fa13e5b73440da1110f3bccdc532f6e281acc9d1c3bb92db8a74658de3838854582aab148772337e0a85fe8f02caf12207b9526a9ca883ff5ad1371cb12bdb18ba721d9cf18493241e0305751add0c2fc496de57e7b8bd74d7170055a1c9ddac2a0bf19c3ba2de8143a43c7eb8ed38697d166586f1238a12b80aa7760fa0b585cf43bff6eb6de70cede5acbea68fdb8c18277b7e8930787da8d4ef848c59c8e5735e2f6bb68aa84cfecc98d629e58a19d6108913cb00716c75be6bfe0008c59faeda71a46fdbfc739e529fc24c72b742c5b447c4c33508f8770afbaecf1de6753c6f7acfebf367995487e579feb8ee23b26909fc7f8a86d42c387cb48510cdd2f2a0a071e8ad89a084834e496e4a9a7c4349bffe221ba2916a2cf1846024c401b54993cf5e84efa39302ea73055e05a88b80412702cd4c2efd76a90c9d9317e0092146c8d558efbb1bbe32836009ea5889b82ca488599c19131985c6a5ff6860d32bc370ab8c644b618c5443910f89f8cc8caa6b0767afb4fbf78bc1b5ff4b3d1d5aa2fa12bc5f65fc4541015ee49c716b3a264661fca78764f06d5c8a764f03c43a9e7d24f754209bfe6abec5c61130b2f101c1bf61495933fd092ae20ff2b442d5a424c937db6a1a77a790a86188bebc9c0eeab58c48740ebe59837c0ffa69d384d2647800373015e8f8451291042177adaba9db68aef15d70c1f3836428f75f99024398afb597ccc95b15b4aa424a35d9a930471def1bf9f1252f1e9410095ef581d0b733856b2edc26af1995fdfc97e1505ffae5f8cdd6aba800e98b6c445d979119b4d9f57340a70fe8ef6d0d1f3eee13bcf67a7196174bd72f424145dcb8449a76f01d12f4ba07b4a8b018f1164e470148a5fd49bae69dbeeb13dd944a03c8dc3342976eb0b695dc613d1a871e5cc72b5bd9476e5d438d82d78b377ea7ad3e7654a4bf53749379664e5d3434a8de87987ab5b4614cef84cacd4cadde07293676b8f33cd27742ed3c01c6f414b0ec538d3e11963e2dce9ac1ea25f705e9385b6a95b93fb2142dbbb0c6a912263c2bb5bae11b4a1c74a25da2c589ef37aa949bca8c73fa04466e17f1430395dcc3b79e523304a6b4646c5b80784a745102fba2031b81f6fc6966bea82aa5fe38ce5fca8bf7233002f138d81f721a363819e42b8f938a2c2d1af698bcc4832624c49c37ece1140ca79004f9554fe61827ab4c2ae9eb096927f9eef915bd929777fd80f5b107122ced0ead8b2ab00713cc9c02564959a482ee69d9b4da61d8c97b87f2dc43fdd117f21638ab12199d8857f93f738d20dcc164f5fbd60ac1f0595ff9e5999950bcfaab583a1ff7f4899aa500664a219540f3206b7d3f48328520406e93bd4885bd13c18f2d3849a934082344767d9a3841e52d52a052191c6cc33ec560d6d657461f488e011297ef4175559894d5bba8a292b2b6374de315cc2822120886e03f2be469dacf9d4c7bd2e6b77c3768bbdc8300005413974a6ab5f97166a9c05dd7bdb08da8180d62af6b611a10fbf6b406c50c20636a1c9fdff8fa46bde080640021c3fc064b0275b84bc56b59d4575d746469f3279d8fd1c43a5e7ca2fa4cbdabd87657223a6e810d4339ce9f170799812904fb307b611144679bc7ec94d84563c8989361fd27afdf13b5b338273684c655bbd5a55a1a02de94673c811a7ec5be2f72e27d8dc8ae037175fb62e7b4a045c6fc6c76d958b2225abfcc8bc362a20a52d8d6f2a5789e34c288fb531bac4eec7aa096290d5a941f01b2d10fb5734cffc037ab0c7af9ae4522c7fa7e101348ddf9989c79a3bf6fea4559202c30c36de64908e8ade04b734b83af4c4b220e182b23e518124290515987553ba340f660af9ad26ed49c891a245828cedbb34652f491e10f400818239a96dd3309acebed7b5f40ce8e39339fe8bfda6255c088543bdd833560cdd3df6e6b72eebec6d239409372ab8ee9466be0af8d34a062602c4d9b1f7f40a57e380e582ccaafc9dd9440e83a7eb3e782887280439e47089e6c96ae51e9706939e6e791951f2609a96c5e68a276c65d3497cbff2e95bf043ce2dcac9de256d53ccc1c461fa1b95b6c0cfe4c1c2984373b9313553fcb740ef60403d56fa397a890a393031655e41eb5a659a082e2d544bc02292aa2166e0282c18b7df7e31413ec4dbf7f2a9f7f7dd9d65d57145ee3626f5f5344153c7168a58aaea03e0be4908b79e9e841634d5514ff31d8bd7d46597e16eca8346b939118002cd1efc5a9c56c45858851c3c3701592eadad23a685f354c7222920115873ce281daa85fe28014fbb0d5e2edc60bb111698b50e70c025cbe0f0134ebd1e8af4c49796787f945c5ae369d6450b8d6efcfed75c23287e1ca411e64e0589766ea50a87ddda36b5e06782d830ccb5086c3b6c0abb0e1a888fe8706a8577108b981e33f7e1fe131bcdbc0a01868dacd5aaab9d80438085fa09bad6413a57608db69bf223541fc3570bb79d2d1a6b9a9df61439afc58eedfcc5e45d6195ac340f0a9913680c159ba99c15668c48fe85c4ac225d0db95f853b1efac337e5f495d5d1fcb7bb0644ef84d51ce585355a2ab0f9a46d3ee94760143b4e56dceb8b82bd081382489590cbad298306ac3a268127e2825723088d171356e06d1759a92b8ca56a9a3e1dc6f23f8b672c8a593115b4ff380cd7c7569f78759bf2c09433c7ebab42331d24441a1aee860d7c2d6575bdf4981ff472769c7a39c416e60772845e14135bc1ad7414dd2f2858e94335780b4dfcef927ea8589a276c13174d5c189d441045377aa37565c201684ccfb87f61feb2036f7bf0694396aec3fcf10b288afeeda663328a025d8ade1db83af919104a8c965e109d7c639cf74b15ea1ccc8f68bca64cab2597bc8152fea044d19318544719e25e85f68b7e36234fe8513bba44362429c787d25174d4b9e207794bc79d4fa413def4508d58a51ef075f720850e45abc0ab362ad8849c93508d5d1d0cd24c78fa3e2614122d7178b0496fc467683679aff787022c7b0f9e27033d297c414aa2fe8319dcc89a75608a5e9a4e4c1cdb81ab4b2779f41d0de5f191639dd87add8a3a752c010870a0e137d9ccab1d056e4aa6945627ba498bed3c0ec31dd63879d0b36045840b327a6803cc513358511bd7345911877c7c75e1618ba28c2f0745df3a248b568854b413e12c949aacbc7801a1e23850dffd4689a59fbd1bb359638f48cd63f16a0c2221d68df512cbfe46508b3b76b31f979fd9be47722923525744640e3b1b68bc661ce2766ab36dff90a64d849576109d2dc8a39fa5f7f40f93818f7fafdd07d4e93f8b169023498dd6ff8dee9b7853a71eb452dfc83b91faa1d5ed0a72d253a395a706aa0ecdc1441e6a6dbcef306823132d0ac11e354759ae373f7e7cfb3b2ea8d3c28a3d061d618fae39420255bfef9653ea62dd6f511b89ae33319c1875f4a4c02b94843e222bba6c2980cfcfd88de734facbe060b03b7a3092c2e295ba3677a5d5f80575c939108197872d86bdb208e63333588f8603b0587cb5e77e8799b2d5ba774e12435e0adb9e560fd85469ef3d54a6dba0439b0f10bfb9b7627a272e48d5774a8b04b9540bb3c1752b81afb77fde6900922c8f317b70a5b84b70568b9634b8f0dd3cda8e8d79e8a8291e91c462cfbc9626b9a006f49a7e65437c6797e54426cdc97408327fd60fd6a82e7e5605393225ebd9a58acc8f8f05bc57473326855020bc392f572f32e92d5a913fc199056785db7a691691fd14bdd201025964b758790148f7401a238a022fe0cdfda3e9e88ed2a1c3d314bec8724974ee38027bcf672e4f1c09ddc28ea5f93141f7c9f9e67c11dbdafb64f0e3cc3e1885ae47ed5aee202b06a3709066efb4e2916838195e19bb25c928a59555a4d1ea4417ce0979d30ab237e1d305e89997ad9a550742f42550d7968c952728287c30def7dd255039a275438cbf103e12e319a3595211e9106dcc5deba482231662c2e9ba112d992cff6be7db01ae1c226eb62b9061f5357b677d4ae7a96b8a0b1ac683cc6e06f350d66b9c5cecf3e4810e38e0e5ec8e2850dbcda0a9608e4c36011020955ca87d2b9b68e6ce354a2dbc1c7883c8de0bbbc574efd896df50d2db22f8a60135102592c1dca8a21ed6c55341e361d55996f45befc28b3db5f7fdd49c1ebb53177706d2934992a7a1fb1eb6f76ded7b1c3d457cc54072457cd287aba206d26707423099cbb54f299b23582a3548ac5e2fd24d944b6c1c94609a52839c9ee1b5e35250319270c6d0e70a34c2f18f2e8d570cd8354c7199c32f8ee12dda25dcfb570b3bc6ef6d9be93a9530b9406b5e022563596e88d2bdddd4a6e7dddd8c79366f55ed53ac61a9da7132592ec62af9742bc41d094b5913c8dc94956229972591121f0169357d541c702809e49e3854780a8bcd8b6cbe974fc95cc9ad8a57fba907bfbf20288c8f6ebb26953a5058467cc039d334a9efcd32664b52a18939f5e934a4c765e8e947749ba1f9493f3fa65fed1e8ba941de773e34987c3ebaf636b965bf48c5ccf9cc36fdcedfa62ac2694d91646703bf1df585a7bcc9df5e69d282f41aeee2ffb811776e871a6d49a7bb3a1876008e81a9b7ad43a8e8575bf10608cf4790d92255485da3c00d420be4b8d26e1f31c10f98d9526d555f2d2b98e6abbd1a4f91c545dbc2390ecc0df569907f4207dab4b9c7c6c8a54e72aeb568c43a20f91e7575ea612b2dfb5652c2f26f9d22547189b99312751122b00526ca5aa36c05e9f3783a0f0ade44437347fda1c2f303728c706de0f68b26f7ecb47c5714788e4360645fe92124e2503a18d382ab42ae586ef1c20fbebc8230814998493284f18f41e7f08039f26da494ad9add42d0719c549ce704cb4a6c7149068d1de6bce994c32579053e846354a2a7c70faece448ffe0eeef68fd65f6a35eeaa88eac4a234c079990bdb48de76936ae23706344a89992988fdb6bb240aee2a81e5f00ce1b69b2d04048eaedbd22fea7798c400d0e3098b69c21da644ef94b1c92be1f181362e410bea71470beefe1253f735971a1a332ece0c5330bf70efcbc8707c59193202436278c9e1fd3825bd97a655583642ab3d7a3b965bdc2e04788cea1b5fa025a83f9f72efadeb92bd3ea0194b53acc7ea9c72fb0596ba08a451f6c746802e1c4291f6b62d9c8a2a93343b5d7f5a18d6a95efa60f61c03bcaa983437a1ee1921c89e9b6e8acd7cd6b3075cc7d9d1c49b8378d21de953205faf6d2b6764703194936e8484451d3312dc9eeaf6b0041660dbc607af189c900e445b1d2261a20d47bfc034dd3f651b44bd84e73f78ed456437b8cf9f96d7e343bd6057c5c1f343358b2a28264dbeb260d22b7d0acea85e2335b40a60fba7d215e1ce9344ac0770cb113b3c913e567f058e5aec3f91c08a5a4bf2fac42e1a5e3e30d78ee6ba49cd2fb8aa887b416ac1a8ae392bceb6160640b05d0c8f3b3c07895eafd24064a40974e31a7336f8f9ab56d740993fca443a2538f732f1d3b43ba77e4e379bf51d98303cb9a4e3085cd3ef6295ff174e73e3875901415293233266a6d7aede7b0f5b684f15d629cbddf975785d996946da52f46c328a1dd2a8e871691947f8269ed4b06ed589eb9c4741486a84c59ed90499a60be71d8db0244f2533fbc331922d67f264270a6c232d0cac549a31b123dfc9ae8d5a67083ef0202889ead91f470864226ea23fc1b9b849e4ee727db0c79b09aa951b4228da859e128d1455387e82262b16844cb2620adf74fb21f95a75286c93fec6dcb3a1f9f28cfe56c56057f003c61aa7b24552132895597e0252205645f002850b8e77528790cbc3650267ce0a9420ad877dff3c71e05a4b99fe07f9eaac69087b76e0ca2786becf7a7090a964b3a8ae73db9c7cbeac0c67c1007896d1fc4e1fba7ae446aaaa33d54caf3efa4da83b3da64e0831fb4faffecd98d4b5a8bc2d0d55d2b7bf50823d43197eba916cf3e13d4120f636c52566b462017ecdbf04f6c3ac796ca9074016e0836f33554f788e27f914223d77b554ad3f15eeb2f26a480c2da9b53a0138d9ac129f267a4917ad7a977bda912270c224dc0075b628616ffae92e07bb59d4b8d7915b033252552aeb0dc244c9ac78db41ec54a7ab348a6e263b26862547474da8850818947756de4b0158f286c9316a9721a953070a93c78c847c171bfe4634d8d1fe3b424b90a0f204b1404cbba8dc2f932692582ef49c912239b194a3d288a288afe5588744b60063bdb9c93ca7a979f64424e5590b5a283eb85d9a4a73b8c6752836d1391afac8dce1d63299d491107618f7e4a9063d899c6a93c097dea625e4f93382e4297b48fd1b20c2a69ae3913d21c3674fb505ab5a9900d316deb8ea82bb8d4a8d7925cdae4450f646e3e84ee1a785e3b23952694194aa2aa4e677eb45ea9d592de0c65cc4fc9de2c27fef8a90294a46bc54a43704e7fb9961cc004f25730f19d5bf9f62bbdd4d9779b93bf313438d54f11354832cd7ee30ffd5bb08a74a2b8dab648fbdc1840e07f5a4af3018ff70f390237a186f22b0d669e534bff33730e33c0da34ce307e0929fd600d95f186588e9a2309aa6d572a87c2a9e8584da00b23505b9206508d26f920241795e18a488f4044f1e82028e090915dac4f5e9908cc724eacc0f84f3029831da7bfcb8270ac5e2755b5b6b9c0c39beeee8020ea5912bfb127171e9dde6f571f63fdb986e4dfd398d4ae41ca99a7b5fda32b26b2937d73cbe2d68c652d7df52f041bbbcc7c6ae91314bed7d7d164270e18344cb461516ce013da444c86bc15be6b8466bbe639d830e8d287f87eb0f8c999685d8cbdf761ab9b416e883de5654535cca292aa284e2eff5214ff3db88e9e8b0aff79494c12b21154f6d3deed1a2b29657853ae2e8aab627072627277851c4e071729641587a4558669ab09578dc30a53802ff6c21106ad0f434a29030c2336c58471ea6108784d6d7cbd567e0a87ac250fa27c71526ea5f4e79d4fa8cb6bead5dc8a5ab4bec3c019c63acc90acc700eac1321926e124b4f7f0f7a83f967e8a31a793d30d4ab698a81f9f4d016b4c4869f31471c9788c053b249f42a624587708a1522b942767b0175c9562312300cbe7afc9aca8d25cc54288561770ca95490a6c291c868f1b02f08b097160d633436120ca615edfdbbbc8493b2d4131cd85b99d51cef061e92b29ad9d033760de5a88b525450aeb5ee5470c5d0fbb6077131d258bde410f81a9c7ba8eb91ff61e11cfc8f4063baffd0bfd3898930c0c9a52b2579b0eb35d40fb001e2bf10cb05bec6b675105a57aee3e1bb34deb1bbfd64d6c03fe102b725b0fb06fa4547e967e1f96804b1fe566f9985efc1f32a56072e8f1d411a21e01a130f6ecc1542f631b391c5f8ec8646139255c6b769b9a3edac2871c2f23dda81a8e812f3f84e742a73fd4956309738653bc116800e3b6b9d3eb0a1528168f59fa6a4823f2492fa1aca4790d5da73e3ce2a6a2e9c1151fd1645236be90eb041fc3d69e1ac43add3399a5820a01456dbe4cc61f9bc3b50f966e337655884796d3810a87a9c3dd83496db64785f0ff84003cd1e0e72561b4a225a51e2c0a2c2974e09524390879c4efa1c2a093c6538b5aad22a1f443a5d6a2486308aa7de43cfc050b055d009694630d963c70029d970085c53c982ca3661b72a8ea4101af3657483783d4de932779d4eaf9fad3a56f7b179c1c9b083f2c73ca158b9da46ccbe1531ede9591aa82509da72437493e4444a4c1afe3fd49dc3693bdefa79bb76ea80bc681743e1c50cf23f3bde0db75dc0e0ec4314e70696290b29e77830948918c87a269f0dbb2015de453af47ba473fef46814089e199a8718b7c6471601466f7a5228d8486b4d8b18e1c38b6188b21157b41f65a329918d74cb34f3308e9882e0ae4214548a6a2e8b26e8a710827b95a258b6a795f0f77d627f05a3b8613ac276b515f61d4a7cd02726611f93a37cada83c8d3889f814fcde1d6129c5b2154672cc39e3afe925a499022730169f3045859ae8b397324dfe6a930f0188b0dbcb21851ce3b15143bea2e2d45aaaf9632c61896d7595c33702ca6f4aea9921f0f397e49c3f7f8cc65fe6639486bb7aa76ab2393bd606e7207bf120032094ce0eb5bdaf415c9fc3c311fe5b339b08cf428a9a58774462f231b4cf8c69bca281b26c14e96114cac34bd4f42250fca18093b0d1ccd9688037ca9143fc6430ef46732b4e430fa487195b306d9f1ea104e9b52ce441f5790d5a8e707d4faa76e952ea7128b241a0eef3a2f26b520d964e38e6ac44a1d6e25ac288d136904fcc883fa54317b8d37a8de57a2e50ba078c705b46edc06a2014d44449422a26e898c362c1ce287dc0c49e2aed7ce12adbdf1fccb7d9dad1905a938f5365cd095f911b6b34e55285c296e612df72c7fc409f9152a88ef425b0f6fbbbf5ed28087c0001d5f28967b3869c86e986fb71ed3660329668c8166e89fd4020c14a4670a2e9e20abe2f3a4f0e638ff459609eab49a021761cd781e378ae1c4677d589a7748008275278e863885499a38ce2007319994523874940062d3faac21691d8b9f08c0a472df0cea43061a1ce755d55df790030d5a329eb1430063955bd3e34815fd0249d25540519665cf424da448158d250e66a123e31a6281840e6aaa08e1f9279038556fafb882bbaf41ac1980bc56debfff1f24c2d1d67e22a31458c4c76150d609e567fde92cca8e7a689a1f64d13602cf09dc4582d5a09002f64ad19795a97ae771749ca9739af2816514ebea9c96ce819e3a5f23941dc91fe1866e5036ab510a170122ad4b090d2cad7f76ce5839f56332abe98ced53f912c5549b2fe59ea09b404cf42cddde02657736dd5f629b50f9805172577678e87911b739664f214fff1edb0fe3aec27681434c85401754e98d98e07614b4ef29bdc28503698cb3314c5e44bad5868788e5d74e6e6da47f3dbfdbeeea7a53e2cae52032f3852c6c824164d6a940c428037f36de42b4f21788b32378ccc55c2c96d900242a13561f4bba6e6207de286dd428680c7c82f9ce0a8cc28f4bc5579bcafc5b9da1e07f217b0bfcd27221cebcba0d5bab1ecebd3a80da40e7459a790815dad016c1e5170d66b28601cb6dbb24ef20ae95068efe9fefcecc7045e0628370c7e87d221c25d64a9c8b21ede583e76533ea5a6cf9cae7f28a0da71b051803349edfb1e8353556d6d22e5bcb9f924c600753c7a455a7964ee6402d185a871663c60d8c56a656e46ea113f89f894daeef6ed62c24ef4db472627f2ced6be049e57cc4d9802fee38d391e70b45b886bef4a44e6def21d4a7320de7c6375dfa04dc01d4193990db7235ae33bdd8a6d2aeffa089a36ecea957307f267264c599b3bfe1258e21d7df78eb40feadfed28436a22615d8a6046473da1c04e7da58f29f0773c753475776a3313cf52a9146dd5697052b6a2b171da57cf3fe2a8954efd6152b4957dd9284a1a25290b085b9ff38ae850e49dea97297bb55808b58d9dd1f161f02718f9734eef01b5265101cdf25ca0bee1f366c3ebef4d044328e590d106a4924d026b55f31f6520dac7ae9371084f8209e64402ac21877960aac8bcde7aacbe82877d52b64713cc5e63132de863f2ffe5d029afb273c1f4a65e0ea9299d6094b000aa8a65777158158ed17a16ecbf37db80112c732fcd5c77a7bc11b5e36453ec04803e92c0260ae4d81b839d0a7ba5116e092dbb90ed35880f7aeebb62d6302c67a35490e3b959c89325f996cf92b553d09e00ae322c48456f8d8884e4768527a9251ef95d0f400e02edeb8caa673742ea034c2f94412aba6a2c914a8410db04a9d14d1e8e70782ee2e9b9c20eac2f9f5dddf8de40a4391488bc1d6042185e924fb5be1ded13a8cc87e979a849eaa8b5a732a256a0d5721e17ff03706add6c6bfb92dfc5e501363b4f82173a4b55f24ff9e7688caec18c13e63dd23d7fa8df60dbadde0343bd9d967d3305363fe2c970a61c14601bb562b9fa1deb634fee13ebf8f8d25f2e09eb1454e5a9922babcdb2f5929ce6e5a18512dff2dc96921d6918f8b5010545f87c535668131e9122d503f1ea4f891aa123d9b891abd705b404e8cd95bc4786ae634d28b9c10d93a5cab3f0cf129314c0665924056e0cf0580e2124bb1e3649b29535ece1befc48cdd2c1746ad497d2b27657705e540ba186880ba7735a02f482be5563b1b83af3cc44cac33ecd7a8b52053eff2e459951fe61cae2a58d649aa4195ca50c3378873cad6e109c893f037de668d42091963365d04301614f82d6d1bc2506506ccd1aea1e7b5a69462c4474b605155e302fbe545b8b0aa2d19e4f76928742d2db37ce4022c159d9b729c879e6aff870ddc9ca6b49e5e4c5352af602fd7068401ba27c3935d2d8d9cff19e7203b293f895124058ec0072dbf9254538636a8e40528a703f284c245f0bd494e0cc357131ebe7a9c6ba5b1e89754df0262da478b245bd411da397f02d064868fceb99adeb449d3926d3e4f68b6cee58e80a941dd0e022f8242c49c7af7dd04110ab9423178f79bb7574faed3c16de90138cdf5391ae2c5ecfc553012678b183fc2aa67073df259ea5676dcb532e4d79f6f0d028f35c4ae302216eca16dc30a6db83e5e960e8ab848ca3da63896e5a115659c1b597213f75dabf9ac2cca1c7486b35d7e5bec0888f34b2994cfe76ab3c1dfafd4d3653a45a6d176815bebc6ab89f115fcd16161ad82b8ac1b809951ea4ad7a60c5c0bb6dfc2935a8a533c321751c7fd01d9881d41ce104dc21b279602db7c1ff7afaabe5aeb8c71fb7936f865b01c13f8b3752ebeb270022e3dedb1a0188f2a1ccafe55131f2c4f40e4f341c7231ec45f474c543f18481efb7c5211ff9200519cdaaec782f8c5d1b7e1f0b28cd72b23153c865295294f9ec9041f28143d10512257beccf8303731569c8e858fd04f81b184c037f986e334da4ea015d3b670d744d8a1fb3facfdfa6cafea536e76c396f4626cc27d6c61bccf14b8cda111fb8cfa0f7ff23cf347e0082ef08c80e4a1fb8e8267da24cf67dfaa316e4c005151f7614ce1190fafea76b22455c8d6a7ac9dcf9f505d33ab42e087a75e050489d7859f294a76808bf4b61ee617a9bc09cd40934809a0674c0b1493b2d573103b21096ec8bb691dd344f5fc239560e0cb18f22fb9ea25815aff645345d505aabe10348d39451e3410835b07df9a018f8591ead3112042c5292256e4931c7bb58e2f0831bd75d9dac77adf0ee806b88d7da8a94127673056652a0c92a5d6c6da868a9000f88457eeeabb0a49f1527355708500f25b65682e1a41241d0000030c4077dab9787927dacc3ea15504584f4d6b456ceff844592e4557d2719b40a47c30e841abc58c0abd9791ed3524caeaa71769ae3d2e32221aaa1c7afe734f20b9ebbc66da58af223284f51018a4547c952b93b4353226e20c5098e5cb5a787d3d48c70c2a7015746b9a99c921e2594db6d12ad70415d4cbea901883f0603be916e63bc873cc14e2d35cbb9535ee409ffeec9235e60eac2ca1305dba10778c13703ed0d22a853953615e54609ecb66616b756d6135729e93f927875d669506452aebff574c20bd81b7dcacfe2a7fa217efae286dd5fcfdf0ad08217bb7fd49b547617c2d16455277a0c3a246b687568e4af98fb9d96b80ab591d575d3465e140a0f638cd3a6a48c0540c7095a0f132ad18acb708aca6aa21348f41562ad58f8341064dcc425d74b6a688a57f8a69976eb78433544cde0e2cfa24e2d090282d425780f1d6fb075a83702cb745d0a89ac7f890d03a84ce7c872e90d8549a0e66e47e40a73d2049522102d5855f1e3d8743a09b468cda377bd845c9fbb0630a37bed53838e5e0b42ca01a42559d0a42d414af37d226276b206e232ce5307fca2f8d0c12bc1ae5ef85dbeb6d40cd02f5e8322a3d981f522af3d39c84dde2a580e468a9abbd4607c4c8b918ce91399fb09fbdba6e8c8a9bb816b20930c8fe94a92e24ff36466d9811433f24f696b404a72c6309419489790c3bdfb1c45d933a0a951b1e69c71b43974a68fad89b867134615ae95ec83707a349e1f730cc0954501fca1942fd32747ea7dbe2d99c7dfeba23533ec6a8f1e8ca7e24a3123554aa103d569b50f69eef636c204122a9255a76face1c85d3248e9e2e1f714f6cf0438d08518c6320c52331bf1034e7552da89f333dc537fa4d445c1166cc1071625d3e9bd6d958ef9c56f31acf61e7c9fca63e4c53b2f15bd3ded20aefb8a4a645009b9d9ee7c7f61313c68fdc787146d32955e581e55e7cb07ed67b88b9d99db1c6930429ef2d34c45a929170c2604ece68fb48d8fb23f398363174c79492ad7d7be182af74828b23f504687f1734a746b0d7f47d7237cae13306ac8643282ca45b615da4ebea8cbd039507b1d84d889bb8ca558579fa357b13d2d39b36c69a5c82813c4fca68f42381f3e8cc10d6a003f620bdadde5f8b420f2646eb0065beb3f0dad0735dc59a8d5d6042f96170c2c0d1c6aa6cda6304924939abf07dba2d4e4741cbbadbc23f39fc286505c7dc5387e72b94d2b2efb2c8c69059cefbc1e69e33ef0b2e94264a1eadd5e815577bd5f72656f128d4f635a8bbd7376c1e428e234dd2f2ca41b49b7c7f0f797c78ab4d4abd50a42dc5af97a1e4ba59806f1df78894f2701120e468f213c7336c125b423a909b81e614359485bd472e6d8c59573fca0b4a8265019d513673eb0e3f4ca465baf50ac764d5e2bccbc1d20416b26e12196d3808a001873fcf3f7a87c21123ff58d699879c6bb4c71c2ccccc39822c201e33f50e362c3ad7b49a8b9acdc15267ea100dcb249c62cf0e24f5999d02375a2091f25c128aa7aebc433cf35d422cb456e4e87a634bcc38f317d8d8dec619b12a444fb820a4c0a142eaecef47b0ba8f53d1e2c63aaa1c1e4c1e5c00bec09f791396d1c946be44eecc57ed873c5421eabd2e2000373ab9ba216f6e2ff5fef5158bc25b2f83480f6fc09f3d9795811e86604dc4ab6091c253a6b4d50b346620fb42cac4fa5b300c3ae3bbf01932f5eae5131517890991c1e4b3d571bb2d3176cd2b78e7b439825371402b7cdb27ee4303159fa8392271aa46e8b59641485ed126a95a1ba068221fd6567823788b88e70d8ac5f691e5350e194d2471a444777a1f972862336ce65153d328530a221d8f6e5afc4479aae44229700d476d725f331058a59ab7a349950d8ed21d87a78a63d40873e3f26526be892c0bac11f418882c67f64e11be2ae5767e0ec471003ca6a86f2e69ff865123020993d99916e5c13904e527dcb191382a74c66c9cd5ba649c2f6a79a845353cd8882528b523d559ae0c992744a282491e2283c7306cace00a16177676cdf550e08b64f9829511d8133f7c17965605ff734b15200b012dfcdb69a77c5d03ce2afab2f986a09face460656b8e052b1b3edbbfe1755efcc580e9472c7bb942fb3ad7546b8402fe2a6668c3146828b0454627ca35ef2d1732ba81eb65b0417cbc9c50c33f414982e756e862575aac98a007d4f7b6d9d261b5c90447008ad51bccd305a00b537b7fbe60c32d690b9a7491b84d37fabc550199351c25a8832a9a3ebd5361a8988482967b410330927404e21b9fe7134d5092948a7ce9eb54446ee5f7283a5fec02c5267618e666132555fc8ba8a0e61848379dddb3799f7488167f409ba3d08933399ae83c9a843e5e9469eb535a8876e8d581519a8695f6b59a6fb18e5bf96c9d717b10900be7e9fcf2bc62b2f7df2b44da360d4d798e377c0266acda1dedb97d2be962e4ee4801aa850f43e07f2bc0f830369c1aa36c5b540bb3e70a59b4048102b7cdbbf1149f7d9a2bad2e1fdcc3558eb2a382fd975bb076ff5f4434a60e3b9788ca36172e8afb6857fbfa8d9d992f2dcd661bc3b8b13e3797da4736ccc6cd0436337583f7f2498886271584c0aea6b2f6d5eab1351f63abb56dc8191218ba5b4a2157fe51dd1821041efbb5eeba9a755c06d68ceff9bf16e41dda493f578d2ba3d462d2a5ccb51c7f86ea7c02a0012839d11eb8b7d46905c84a86327ba882ad7e8975549c23d9a327dd4cc1a99b883bbe2e126234c840148920c54414d287d3e4798b9f9a6ce82f762024b7b0afea72ccdb0c63000f5021927b013b8537ba85e7410fdbf92da9e5ec2eb8262e0a484ec4d6856effeaabc6c402b0bc2e4708a03b4e7d1efb1339f60a7eccc5d6db0d8b7e896543178c6dcd8b82ac6b36b5123514aa6e3eedbd6d02e8a592b3531582f515fd802d3c8a781803fc7e18e02b44b7169367733c0f122cc4968c2fac69d65b8bda99e27a0cb6d6f6e9ec22319ed41647b1f126776044d25b01f118bab0cbf9fcb91f4a144f549e4220e2d188d06977e7a8197ba839ff641b7d27fd6584c246d10f9bffd64108fb187c7410b7362d0e32b312c94c9306daea7828f00236208b9ecc93c1a938e9ba7ee8b14709310dd990b43a5b05ef934ae79fcf9d7aa27f03e1d8489e00b84b6a26867a844a9f19951cf73ea760176e08191774dac302c8a0d2b7bb406b8b5da26ee2aeec02cba3e21c43f27337cbb64c55ee2d84a32fabedf1927333fb5d06c3febd784467f0328acc6775d52ac30fe17a2ab3e32139b74a0c65b949e7ed39e67d0d81a383dce69e21bf75b0490484c8d888254bdd55f9121745b5665ba45e216d88ae60e0c7fda0d4d5e906a3784dbb7d93387f5f439e353fc13bd1b99fc918d160888abaa24f24e58dd3cc6e17e9d4b2401ab45af7bf7276a8881bdadecdc271fd7ef080016e766f1b4d7d38a103118ac0e9593cb35d08603a7bac08e16765575b616af29029de62a2cb98d4418df688643c629a4342eba40f38719af4d1985f092c05bc7f3c751a1401a3de61887324983cdb9bb0ef581cd85b61ddd5cdd2f4deb02b17e6a6258323f065543e366a142a4c2ba0e2a5448e4a96b2002d68be831522d5f43fbc1f4838f3b115c086ac824b8e1bf8c3a2c8ba2a69eeee816cfecf3f9590815cffef9872d61f1e4a6ef13d8dd4d81bb56613c82b559a5cf31885ceb882ee217de3cb4d14d1ec569fd197c4348b3ad25ad14cb94caf0565eeb285119e3550325fd58a4c1d3ea2d1e04d7ef46805b9b030fddb874cd3c946426e7631f8ee10b2170de82950dd080f51114c09bac70c68922e09aaa906ef44f81255370c4c649e0a85c330c56883e1be152cb08cc7c01f05da383f1accb1ca4be42b44b79924da94ef5b5ea12c7df2a1841fb3422525655da9aebb0c3dbd59ae1af79840b5f3f15a67738b8703732f2024bdc563b833d4f706150311f756b7a1936b43534232cc4555f1fdc281510d3fe053df740388823dc8734b28123b07564d552657dc6871447b84922b062284f143fd3acdd35ca6ecc097d07a2c07854ad60f9361b844ee389239ef15af898467dd0d21704ce97ec30ea1bb53bd3e2e2ea3e0b740c6c1b77e85c67287020c07f456f5fa8521c6b087cda597219c8d4894419a1510be0e3846ce406fb6727e854904d3b7dc1f442d619d158962530eeb4fb882f7c9d4c784195d58c0b699de41908eab00b5291436ce364cd41c36a055e27f711ac668452b8a23c5f2da0486c3e3eec9a6119b476aa6ae555ff1ce83b1d13e88fc73a96c731fa18c572edda6d108284dbfb0f49320501525a437947a1a599f9fb1e11e0198800d774ab874d7dc08cbc411de26d0acb9dd2516868089e25483e7bc5c4e4d345c0bcd5d987927ef879f782ea8dcd00e44d29432e03cdd006961dae23e81fee633062eda216ab43660f694e1593a7a1cfa81b1efd0dad0b53f1e111668dd5e51f37a9d285556dcd071912e8418a5c7aa0087b92a012d10d2f6c4348a8e13870222a25016d486fe0d98ecfbdd41c374b459f813ea65daaf74ceb9ae04dfb5f219637bf9610a58cf728badc28da22a3e9d55361464b3f0092feed90f38ed65cc8eca11c43df61086dae51901210028c3406bf5d8ada3b065e4eae470fe901d3134e4cb9a54b5364ab0a0ef7993cb53aeddb98100d534e2c5b849bd39ee3c16bb6ef8002ccd7bf4a262d000384adedff4182c60dae4cceb96df766551841d2ff7d0c66526c56d7f2a21245a38a85c5643aab2adc40e9c867a1a670d63479b0559ca9fe0665c4d21b1b2e5e7adeb45f685078d0d505897c2e0687bd3dd9b1c441678380b14dae9638ba0641529e07b42ab01c91c6d105e8c1063586cdceec54c824b9d15e0b72aa763daa00694fd3b34aec69f0346e03b267a01527aaa51450075302d27c9faae6e39d1cd3504640da00b5ec108b11b709e6209fd7c002e9d36a63bbdcd8641e0ed9809a4dd76b2f49d99c62e5a83bd2ea16a85e28cd51f8d5108a864b726e2d835f3848b573f5d35825a706a700c6487c541d3f986003eac6838de66fed091a0ba90369e136c888beb0205936ee446892960984d8da0c32d008065133e9509630bf6e2ff69d83e4206854a4c05f3bdeab9f75c6c3d78cdb20ba7262dcb1e1c088e1be299d2932181390429dea043e315830e9c0d54955d47adac77158156e807b978f4be0d3507a836c4fbf4a2048f5bb4e338f804516999ae9ce6f79d79aacef5edbae33c51439f58a816c34352195e11eb3a3c694b5d2ed6f4b0020a67203020160f8b27384914a309d153172836b78d2b63a7a92c84d0ef1fc28876cd84105d92e4502d9e960ec63d06cfa01599560f4db04cb44bddd4a5b127bb8f695e2da1c5dd0ba351561e2cc0a47ed60e123e226a9963ca2626d3c5ca4125d7647330d8ab4b1e6c73736cf75500184c8203e53a081464de5ec3868ed75b122773ca7d4162e4ab305329436c6ea0380a3ba3821979d858d651ca16fa72fdb218f4e85c59279bee12321899fc095ed8eb2323c08089c92ab6a9edf3c4303014a6a686df1049d386d61b8786a4d168c17b3f5cdc895bda5cbead3b2f72f82ac49382839e6424ba83d3cf274fa3d2b47be5b9d2f454130d8bd4497a83c348839fc7d969564760a23b72028198ecc48be9a5a0ff1dbd3f5c80ca3026e8a17bb7baaed9119915c7051f35fc3a5048cfa316fee843f82854fe18a1087ab7784098259be7515b080d98d1ad3518d19f789f31fd5f50703570af3c873075aa473a3363b056a7f003d317f3d0ea01e10601697ddbbfce979e449d765dfae3faeaaacc67bdcc8f8f5cff5b4b88ee3f1529942407621357b72fc44af7b6b41c2ba533371a2cb79212e0857642e4df6d2d278fe7b34f746d7444cb51d4614fa1c29e579b8706252ae769751aa09245694c2102424f9ee1c7166646405c6cbc58416799ae44db4152122caf9c14af78dfb226bbae048ebe458fd1c6ccb60985ea581635f4dfa3b8df2f57a05e5b3f371c075aad3986348ddc949cbb1a8d1e0fb38b33b6c619302599fada07fc3a39b7dc75a7c9c3d5cf56f8860f3c9673bd2098e863e81cfe223a2b147b4f888a02edc057fb0e06e7c44461d23adc6e43707c230cd98db1594ec029cdba5c650270ac312980c0afbd000db25e01a4b6396d5c0e3c0e77697369383e06ac594f7de038f0378115d5d2ed4c938e5308a6a73061eac8bbaa2de3521db12ca1837231dcfb6c50f1fb4a41a87634c64f6eb074b1d4a70ff1fe4729c1564c4df9a738813a4c2d6a616c30be84897003432ce577d2b2595507c98c2d963c6b4c71cce1e13923d48c43db721a097dcb0ebfc7fd90fca94df7e48c967b9506a53d8b9a30f5a45ac310403abb1160c3177f897ac068b15849618f4352c828edc8cd3c0380b92a5b007f96073ebdac5c899075042535ccaaebc5a747db4135c1002006904ff807c88f5f60ae683328ea401dae1f32260bb9fa96025d7487d1c7535dce5e08e0870e3df36cc49368adaafa165babe45296e3cf11cf2e5b67ebf86638dfb95cab5ead1aa5e6d96f0c001b9baf272147978d708d7af412d71e46098b4f2b70ab32a33e14dbe7cfb982686b66f3e7a07ea38aca420daf130439297ae4ec7c1038263daab1a8cb18a6e2706cd373d944de86db3e5e181c2553cb07da372b7afb6a3e4f22712976b7db06e576696489c4d67ba74df7ad0220c243a5e679c86ba56d741c154aaa94c5601ac58556835077f9403db6d87d7cb439e6ca9db0ac54e28d1ea4683b5053ed63883685830c6f48db29537f7bfa68001d21f8175e1717673dfb9392bf26d2d4b83ac4a180f078b3c82961855ffef1cefcce093bc403443b0342393646239ed8a3534831cc8715d9a61478650d7f30e13b970aa465d8c1b1ae653f786358a05dd78ba4629ef9d18b5bc2cbcf05a5a10d7590af26bf908cb2b76aa527b0d03200842217702cb93691c870416a8b087b5589a410db73da2175b00ba4a2964d73ba2c544a1aa025516d16c16f0547ab8696d482fb8e17ad51b9cea4e08765062b22bbc441c86ad4a49625b4f8e884dfda0c30a783b64ab3cc8f8bb47442f0793be5b2f088624929b3a5e9c266624acdf3cdc41d6c21fab25b00c5f9f3c37cd4e101fbd0c011a5d6f9fa830f8b3561fb1b95bcf5911215bd745e77396d47cc05d23c152a5f486a35d472da364310886bd4491499537a4a5d089053399e56aa18e6c6c836b8e5ec456066115b3e828434b4c3ab0c46b6d45016ecc9a726c0434b52575b3beae2ad4ea88058accd1875aa2d48d10574fa1c39d90c7b8f08c31c65cbcb5678c88486dd2ce98993b79053b288ef31c249cb434a0f5e0c9f236e97148adc398656a59e4a4df70532c144d7167baff1dba55cf525fd5a2e246d5e675c15af13e85a0ccd44c9c34249db24eaf5acc5f18aa81810daf7b3ef92f1f9510ffaa55f504145f022ab96d5c5e300cd29a0e92f1a4f4f2bf49137f26536fa6b54a016604fc12e89f60f323601678e37e808f50170146036c59c3e251986e43c100703c7e59f0fc36fecc6ff871147a9299a53755d687661ca9bdba030fc2b626adedbdf7967b4b2993940193059f05f5054f6bd824ca38865a4fbea9534d1d0778fffd0bef3fd3a88928fff7463af7690dac2f3ea36cea5c5389f8993ad554929fd6be2a45d5c4b411b029172db84d492297a93dc513ed66dc81e84a55ab402a2a1d28a4c12141a24264481108f440b28688238e44692197f5ca12208bfe7dba8d4ee14a3002352e80b981a9d977253bd3614b82a44c932753b058d5ecbb2d0451599ca6b658a9a99061890c377461c283528dd4613d3422521e5b69cedf8a9c49a16e4a7a15773bdc61cd422a1bbb1f82a130116ce4ed6f6952b6827fb9a805f4b3e8da29694d2c6907747b1494b5564bba5b2f42fd2c565052f0af72479722f8d7355b87571c7643a9f1bdbc40defacb50eac892327c4253dcd7658873d8fd104c2825dcd95978c563379c81c6eedf50cbbebfc3f91f17451f719815a6d9f75f25f598483dd09e0e1cd58125dd1684583b355482a6b81f224155b4b636c31d4d715f839b3e69bb521bb3a07c3d25bf771b335402774a10ea04c120fbbe78c79d92d628286b8d9260109ae2863787ddc729c3240b4a5aab91d1e07f3ffe295aedfb3a6fc1df3f41a733dc5159794fbd12cd780f0ebf62bc856e9071550595f7dcfc7df18bf7e0fc7db14ad44259d8e416442ee12ec40ad38454f6c49f3a876adf079d4028eff1bf0f4af1d9057f1fbce2330cfeee6cd069dfc7a0148f2ef032cc72d8dd31c39d8dcda2b48e496dcc02130c1284b2a813986756c2e598e70b07a67d9f8252acb2b1fb38a5f8e5a614a9707503718bc8a585533cda57d44253dc70e7b0fb1594219687693c76dfb583b67f6633fbfe19eef67dd0e633ead98cf7e8bf9f773eabe0efe72c9fbdfefe09226df26fcad6db94ae174bba33ee9a270562d7c7ed2bfe998fecfb94dcb8acbb8a1be8b4bf4a571983a6a8df2a8b64ccb0311a4120d6e923ee705c031135d04206a926ee50b3a5ce0b1c1cb4d043522d878c052c46d4ecbb898386404d9211b51c2b96825852b366934ed6a007139c6a5ed25a0eaf75041c744c08d094b1d5728460946a4d3a2ea8d5ae668e5aeb0e917e597f689a534ab3412536cd295d6d9a53aada39252ee7df56ab553645799ebbe7ee79ee799ee77989a91406f9c3b5873a06b5e29a3ffc7ae1fcf9058ff15902c05b421c9266d3270224470391f29c94aa6e50731ed8a24dc005b4092cec2e40022e5c5515747b13b43c7a5e160e40d227ad1be46cba7952b0cfec28282e2d558169ac7e06db7640a98afc94aa00a13eb6d9940999d1d514e1f7f7be0002ec1a748d9aed3dd9c169ee4f841a75cd16e102dece6fc36b246067f32b7d8b76ace5dd16786d1bafedfd8f5359dd308759d13ebd621b61b7000281161a7342aca83e9b68ab29a5e92340f760199276dbbf85acf6e80af3f756abe5a2ad1331e8a0d6767f1306ed49b2386dfa250b6e0f60d32f37606d215fb6bfeffab06a52d13427c46a9fb47d81ba4feb4383c164fe622d4bcfd96940dd6e0a99d1f54dfb7a69cd847e162250a97d01df356a9a9a7d7be5fdbabdb26e4aba48c0c6660dba668dbd51726ead1c1b0a563814d0382525a160a62562ea61af467d31831dda6efa19ecd09ec10e5d71b8e22a130ff66ead0fb332287dda2cbff7de7b7dc9deeb4b5976e67afbd7e63d5fd50fa0d48dba4ff7856be4aa60ed5f2ddb5eaaeb63d7f78ebc5a246bd36004daf5a7b5d5a8ef63adf50a48a4b25776676d34857d33bb1d80987198d5dded5d001efa7c5979405e7201d7245bdfaa2aea3f6e5bba49f30155e92bd9c192d2c986a5bd626d76078dd927d90bfb74296b6dafc2b6d6041fdbbe953aefeeeed2dc1d8af265df7ef199ccc6ecff6b5b6b66dbf385855bf2255ff2255f7ae1dbe839534411ee3b10effb3ceff33efa7e6ddbbbdeb5eeee6efd5aea5f6453ace7388cfe5415d56645cf5ef4e573ae40c193450ee8d0d41ead66d377db91cf26a0204aff59a12a138c0cd49e6aab30fb6a363df194d62412dcc7599dca99e07f9cd2439ccc00d2e08adc2066a7420f3788a2b5dee9eeeeeeee321a2c5fc7eeeee1d3ddc660db5eebeed62f7db7ee375662757b3f29daff53139b6efffefdabb33aaccbbae8fb340b194dbf329dfd607af5d2d7e26bf18733189e2fa315d9988dd90040e9fafe7d185f30f450ac1ff81ab6ab5eb74817d92f2aa2ba22cf6f861029adb552a76eabdf7bf1584b10ae7d0cdc3fb171ded8dbd79a9ecd7915db93524aa901a81840886bef4929a514574a29a537042346e266837055a0d1b4cb0d599b76b9e16a9ff9b5f33c3a43e0d34de4b65af83faeb345ca35f07379d4835603cdef91722d3445afcc0f9648b45afeb03cea916bf9916835f045b7dfb66228d292525a9e277efb3a43e0dea0287e1e15c9f1c6fe4a5a034bef73f9d5786dfca26ba4e589b77dd13556d2836f57c055e3d39b7aa44eb5913a54671ba3afc71b0f5f4bbd7eb9ca5a2bc65a2bc65a2b06dffbb6beadf762319f3f2c885adfd620a6d44f2868cabd163f785feff17118cd610608a3ef58c9179e59690c630bd21a96392c8cf7f9c35ed77efd3c9dce637e213739a9e23a8a42e6b4378367e584891027488c70a2027973727382a4cbd9c64b075a2bd8f49520e40a4cae283ec625a556131f62912a1249b8826e5c010954128ddc4ac84b55a1911e3f3e2254609a1f1e0b53190b09ab8064bf4ce60e71f27040f8b0329a6c056d88e652630157a503b5224ab8a75b6dc8958b265561d6af264e76053b1e2401060fab8991af489324ac2648559ed28c4d6871d3dc13125e0b1adc34f774e5e249977b4a21f774021951ebd70bdfffd7cbd2683219cceb097bd1af45690a7c46f42afd5a64340f2ba3c956785f96ada0f980b41306c4576d5676d39c9398ac3cea2cd3faf5d2d9ed0f3ed31eab6fc554c60a1215242c2eb5f3226d27a304191ec69449c20891da796ddb9f9e97c96755ca3dca477f9ba5c3762444bcfc9f07858c96648c0f8c189ed3c082556f358956a6a8ed75aa6aa9ba17a6aa55cdb2798f08c495d6781187f21ef2fd5d8afbe954446c0ffde9e93b7f8ba464fbe86ef3ee37ee6fa5ceb875777777777feaeea79db24cd2ec137f4f3c0e09742267da83778e140ecca0830e56365b2de76f48a09c7176c1e0e03c75b2717098206d1c26416c9cb72181705e0540d2a7c66548f800ce56ab400b19272a6821e344855afd9ba767cecdd333fbe6e6e675d3957df32f1988ec9bd724d0cd87dbe65d2490cd05f55ffd798998ad97f0d8fa5b2490d6ae274920573ec7ddcad9ad16cf6ea1d8ad160c43760b862476eb5fad184ad8ad18c8ecd60b5d76eb4712a825233f8b2410a935d8e7b8c71784ec9109cb1e3f248146bd0204b62d3e48028961f8370c5f339db0c3a7543bfc4c02852fac0dfe470281375bb0cf9c9d735612c3ce4f8fd8f975b5bfc724d007002f97c4caf644b0bdbf2490a7976c8cef45b2c2b636fb899a63830ebc32022bb16389f014828454563fba271e26e824355fb57d437849469d0b69225a2cd461a04b394ce68446cc3901912b0245a4874d6e9a733a53a67a193d06323fd8aa9c3922a276ca30a0048609169090208732b5fbb2186a0434dbdfdddd655ff40983d999d7b6ecfbf7ce386822c40f2a38d870c309b5534bb972c410344aa48025047f60cbd4876d369b8da99633c28e18a16571a18c029450541f0eb04f1e2342446d2f02956b218c0b4f7efcc777b689e87bd7bb4c1c389a74865cff005a7399464d44ae17f5bff0b25210c10a2b4cd96c352397f96ff39fa96dcc7a3f3e6d3d298bd23f32d71b351189ff856f249a4336663f4ccb2cb2b1a8ef03f1bf270a9f347134d50f4d1d7ff275d4aa4924e2c0a13364f33a6afa9b74868c9a886e3e7ca3d6d7fd010ea45afb7e845afbdee8c6acb617c5274d1cf401b4964faa13ffa43b5a23df4647b570156763464d44e17b6f04be51687a7f56dcf7a42955a56cec338d5c0fd29af73df82fbe07bd371a4d1d7ff075d4beef69ed85e7a68e03f283df847f0c42aaf400731e6822891f3fc8906182625bc24cd4982da2f56afde8cb375ea890c02e5150b29ca8b4b67c5fa2b0b47036cd4119e2314187a0d1dc53d0f9ac38417d188b28060d094c2504c9cd503b7514d387b14431a9208c92a41d3d6c403326aa88e7a506c1c31305e456c531513bf639661fa825463d0603e12174fdc0c488904956cb8b5841f3810ac21337cd417dc1022ff66cfe53c73f5f411303b5659f54eae78a0ffdc2d2397a86203c581a8ac9f7811ebeb6c54f90d04bbf34d40a5a080a20301c59414112b2f439c0c0850710486a00c2040a6452a585af30e1e24179c01b7346281e1f50e2a989253a2d5e8a485d31e18e2cc1e170383a2514146467317e582193c982280b1b0e9bdd6000dda0065561dfbe0bcaa2023485fda9a0234f96ec234cb8234b7e60c21dc10509118163120954956a111434d90a2b5a6c9015016fbe60510cca42dba04153d8d73ce89602d6689975e1e98c13400c996c45fe17d40b87022763c21da94ba4bc1c51e40b94d3bdb7d67b6f7d29f7566f3014d58489303bf3f181f950d918da51eda8ec6c805f6f3b98f7d84091b56237f4914044b7a47aa33a797c7636686e88a31d8ca1ef764b52ba9fcf4f4db26f7f05154d6a6f9564e9e6991f56013a13cd9a24eeb3263500fcf35d506067261b963e3e5443442fcda4eb8d874655dad9a8b79a548b38d9285dc5705d5a2b8d1d8d9d142e958026cc63f6ad140ca9aa1830a4aa627c1785cf62c0aa6055b0dde2bb413f52b0aa18647eb05215f4e3e10f7b30a7f1c77bdc8cd142275455458e2278edec8407fef8f69cb00f86c27bb05bbde380dad8ad8a41c3461acf5b58ac056227d2ecac4847a32cf42ed23be88feaaaac965cdbb63add8c22196674338a64e8bed123bd27f1df12870f3a09845f74f283f0c16b6baa9fbf6cea7cdf7fe1d39a58c77bbfa85e25e0ff78919d81b4221957a77bdaf3142151b5edcbb0b2631051dd5724e3ab3ee8ef2fc6f7e2bfffe60d419dc39ce507b0a111f8a12e0cc30bdefb5ddd8c2219666c1bb8f7d67aefbdf2a9d68746a3f9d02f3e200d04414fbccf534d25e2d3684f7b22183188beec6cfb965665e78440b23188a8eea2f718c20efe4b7a70df9fe8567b9f4827f3eb9eceb9665309b5b1af9e4ff369002663f86c4b362cf9d004a46a92583343d698222390d1d181214ed81951a5a9089b951d45884e2cf0a063e14c119f0edbd206a820c1c08304626a15c8972f57cef8b0420e3d40dd6aadf7d67ad55469d0dd092fda61ba54223ecdce44f3fd693c3e237aaaa77a2a2a37a88860d0b041775443346cd034791cca2410110d87d9b7016388eee86e86d4b6584fb67d1b3086f28e66659ea72cca16364df39e6b12f9d899a6ca94ee68788f37e3fce77969244d77b7960e63ce6b9981698f3f1e44c44f794eb056af57b5565c1a8d2f3e7ed1e28a4d11c617cd6a6bcaaff3620c41f0c1ace430d93ee1454fc9b07f521dd5d1a930326465510923832ecc92ac1af2875932356e3c659f630d523b57436e8a934de52548d52ed2c9f01e2cc54b07ae6a15a98dffd64d96341bb39f4925a2196463f6a7a64617f40c87d92f7298057587a6392a66902c8e427362ccf88ca2d1613a55a7d65c0d486c9bcdb3de20efa15b7cfba268ea5087d9b7ddec6c001f805a2287115ae88144cdfee0a00b420211d09002919a55c3830f6550d88d39b2a166bf22d9990c862686f050a247142c353747177f85f7c89051f20397f9b231eb4c6fdb9600dbbe477ae07fff86e31bb28d1d5f3c9afe19f60e2a7db5f9681abd8de1174d9deaf74d1778dfbf36572450989db4b1e9a40bfc9e39dea7a40b6c5e1097dd6546a4575aa450d5afbb9aa7d1a60e9b5559e30527f7e40bae87d0962372952322e5c566b0430e3e10c1d2c2d20974b754c684201cf022268b141712743baf4a9b4262f2438f38644d382a9033496c351c39b21235377ffc00f573503fc0e963bdd6a963eb30c0f37de6d85747cde15eab6af5ead56bad23d8ec43ffe8d522e9a75ad66dddddbddcb62cb7d790f3ebf58f03cb09db18caae4c80316283922049744092c3aa8b112b6670e051a456ff1582a36d4ad30a253d746e0aae009be6a41c91932284a6c201229072aab5de5b6bbdba0ac12d79f31be90e7e8833c620f62ad582fc1f3b234da22f215c5d7935e12675bb0ae12a842b108602835806abb72ba5937ea1714b9a018227db7e0837190cc4a07956a58b416d1110a331fb620e081b465358713b0ffaac37fb396b5d6fff911ddc688a9bb5d6822ffe55f867e962021bb4368c312531c6b701101185ee8e3f93442426c771247f7cfb3c23ec2a841ca56cc5963368e3c3862be4e3bf57f4db10d15fa80a4d4d4d09f9080dc9d04de52277bf1e86e6fffbfcdcdbc267cae7b573fe904e46901aac6d5f4847b1accfbdf7deebee733dd481170cefdd091272263f58518ac6aacb95a3085455c1a8d2b9f8339db95cad274d23f25ba4a93334be8ece8b274d9dfbda6824dfe65f8ce3db98464d44fac737b27992d674abbc6153de6c4a5ad343349e5ced1047862b5ceb5dad77b55ad536e5fa203b739932d994cc65e87453483a19b62320483a19336c47365d900ca12ba220a1fbdd2087e9509cb2a3223445b67d19d596648782f2c51549164459dc59dd516d5353d5f6bb62118fd8fe17ddd18a6635ddcb265f14c720ca82dcf66f496ed1c77bdef0b839a22946f33442dae37b179a823475f0d7d13c4553a7de1b53db64570d0af29e53265bd172fdab755ddf7ab55a2d17acf5ddd695e194a0cf38691d3ac22ca2388e9a0925bd311eb768d76b974bebcf394c55ceadaff835b62a79c77b2f8d1b0a50a32fce8d8dc61783f8627769974bbfcbe57269976bf49b1da2dff0f7e17af5ffaf454be8ee22769acf48b3b3d1fca73d4d6808674c24a4e5b5f35a8e481109517cf3c574637c855eb6dd5ef774c619638c31c6f8abfa182e06fc10fc1004c3f02b8192adbaf7de1bde7befbdd7ef9dbadfc5170cc1f0431004430e400e40379379909237928de5d65895330e5539c3280b7db757daa471d8c8445eeb9fdf74ceddef7577f14717ddfdfa55328ea0dfeb55344e582e0920db7e8c7a64ab6ec5d73b613fde73cd182d744255e10f6571dffea6b31a544a0aa6739cd2d060341d4d1c3ef8f7325dd7db5e0ff0dfffa91886c2ba7847f18a3ffe681a8d2f8a7fc5ebe3bdf7beff8b6f4d25d9c6eee87ed33b9ac3de5e6befdbfb20d86bffb5426695d80ab6356df5b3defb9ab16d8b2274b565082f3ce4cbdf97bd8b47b0dc741c455016861f3e958526183ef84e32e077086210e3fc71e0258bd156acf84cf5ae775f94c5f814261660d31815c1af5fc18f6b590eb5accca2288ae50e29b073b973adb73586758760bd0e9325e0870ce32b193f2901035b66cad87a12c3cdb54d70894441b2892508c1e0769ee7f53bae1f9eec187d049ffb807159f568bb5245aa371b8edcb990b21324b23be864860bec94d049170aae0df90aca150e0f5962ade68931c618634c3f839e7b2d08c44ce995e9a04514ee3e6e989fa1417ced7ceb835c739994c6eef5bc290c6b60dbc73804198077aeb5ca4a63f8c992d298cdc66e63698dd6d2f787f7d5c076af52b75747e8f749bcf77e062e32dabd0b68abbd35b17c1acbaf4cc3e629bb91ed10fe1b9f9d91b74d10faacb8ba4453f86b1ffa680987f7d025ca82e6ec206ba7ec94574702866c624580dbc48ae8e4841b2b060a16af49922cc36dd2c473ea31d22a6a9575b51b7f8a6cdfa639283588a1c01ba29bec153f36ca921e5192c05e395a0be54d73515828a20b01071a96806022468a9020487ae4c0448b0e2e6469c2e344932123c6a1097cc2417ca201073f85213fc0e95e58a28bd4084d3a7e6c69e2081d98d00041f544067c3a62023c055a9d78a5cadda14461284d4ffa6a9787656174a59a450064b1d286e6e333220e72d096ca9a57d3d8f7beccce86a89cca14bdd2fed0abee6e1200f8e7fe3442689d9a1887b42c56f2c13e9540b66458a0f8184df87096a7e1b5f3721a033a1901de40a3e185c10f67b9619fb4ea860e4928a9c1696784045652188286245c8c30e16906275b7e7009962ea8c4cc996a5ac74cd5080000000033160000180c0a06c301716828cb645dd50e14000d64903e6c4e30958743915094a32808a3288a318000430841c41864185345b7015586ccbdc0c1ef6f85786aaf1e69dba69904e1e83bbd7004bd3afca149f1e349a8323b1dd05d5028f56c74d5b606383407423197d4aedb49269e4a76bdb0a4e7b895da9554a28173c9bfe6ed1177087732222487d2d595be9de00ecbfa5c95fb9c40253baf5e9a1d8c3a16586d788f2c80d18fc45a890188601acc7f1bd9fdb68fcdea738ff2665d806303435ca346ca0178bdbc2d6e6c45c208448d09a81ea8cd6e9463d9b0718ccc8003a068d71f53b2feaaafdb288a2f83cfb9418abb9a9d606900a71fcad19d358783fea8eafd9254f2ce529318e2bbc169cff1f28953118d034d809fde1105ba29ea1085cfe8bba022c77360a83db6475f0e8c538f5a89ae874bf447fd1e2b99a6a0f4481e9f2e04c2839fcb07863abcfb84d2870025d211f7242d40742c89d3418673ca176432955ed8200977db29f9b49f4d5a102cf5eaacc40667cc24ce0208f6d3341968f0167e24758002659bc284a447402408f3b49051038a62832f5fc738cd983aa1118028d213d83ccd6e1e3d500773914ee8a41d2c7de82eafe15f828b87ab1a5b6e8fd28708178ed22e23af414ce6662fcce11edcec3a8f7834faf5362f6bf65eb9b1bcd26ab4e1bbda1d3fbf69f2865fc4e6c647d7ef3ef8ab0ee90d9da4b0cd0af7b676e90d6f4b4fdfe6be5ad7da5dad6dc11b04d1633f6c4f218a9a2b5f9932c7db5bdf8dd5a127909b30f4728bbe9074431404f37a25583d553ed91fa8cfa415b4a0d73868fd67faf3f298618c4d64517be57bc0d1b705bb7d944efce482f724689dc93608ea840408e6b97dbe0cdff0cc988136fd9be76369bfbf48482a5f833b1fe6f3c1267e3b68e812b71c627c32f9a1a090a511245bc5f9c8df31c1d0a084122155b56aa0ce026142885688cc060c40ba9a24760bedf29a92c64b34d87af3b173cbfc4f7bf31d1bfd830a499d2332a8b1591a6ac0f57f20d81f921c59decf4a02a2c0e35af0785b65217c49d7ea1c908fbca4c29628bb19413e7e4c89414b4abb64444c34e87b99e3c2c3d7c2b5aef1fd862829cfff84f8786f6f30b5b65fa67d13e180fe70122425ee4cec0df7f55d30161ab993de71b0ffb552ad83841057a1815515c261d226497cb4f70e81a1406be4feb13e6aa01db7b877622840d80538bca1779658c6b7425c999a8535fb0990fdbaeaf25096738ef363ffec655f81910fad163e6e64a2ca9f29e02c500af066f51290688d8e40b4f6787c420e5be491cf04d52b220f19ad7ed3f060793c876421fd0f25a35b2242b0debf9d5467980e7915a7b63ad8849583e0416b9b69ee9c608ebdb584286c108ef9f48878facfa94167fbdf1c6ddebc0cef8d946d442516290b842e489ea020ca68a6d359594734921f3521b1937d5c858f505c64862937bb606ec3d1371ce16ad01a9d1d2abf482bffdbc8371ba5e3291c63c42de405dd3a1b743cc3f22567a5cc535050078719220ef54da684c66ffa1e119fb98ff6aa4db39038ff48568dfc632e922bdeb00c9aab971c15f1b331b2df63fcd9aa9487414d2762b3cf3c0ef5e208b698c7fbc5ede7270346fa3398375bf9c8a1f4618035bd55d413fc4231bfdcf3898c508c7e6b380ca19d91a3a4aee0f70f81acaa03d38606469cd343701fdb1deba654161157a2e2d298ee76c2cb09b8cd99def1ef88e56a5189b016ce854e9e9833cfc718288361297b71c25e18a43489c206326c93fa7164c8317c0142199a09cd46ffe7d0bc0c5cacbe33db0c3cb69a43f4b939e0c15e214ea47a1fe0e73e9f68b40afe0067351c44d19ec6dbdb704873f8c0e76c0ec74e2144c57ae06318f4ec36bd9076837e42d4f83fa9948be8f37320314df6cb225a20b6f63c146e759bde565260ac334d5a90bd07afdace17d8440c920c6e9e4c05d3872aeb57b59770f2e3f8446c2ee821722c2da032a07528c4094820b2b6bc14763ba1f3bfb0381b91db71f683989e4d64af9ac6b9d8567ec00d015c8b9ba018ba28825124b4f111266064631736f61b287d467e866138672511db8372ea9a363890e21fc4b3dd2b39c190595441beccee35b3345e0be00e04100737d0ae9fd7e2224fbe1b670e285abb4fbc9cbb404fa3fe5b2732864b24a1bf68899c2a4bf3bf9cfb4affa2ca9292f8080a538113ce27b9586f71ee27d6ce3a41dab2837e34b5cc63d36f1a4e4a54c177b10296243764957c4a9f28205f450b98e4312fba71f4ddc32e11434c237bf86ace59c9223f67e14931f45cbf4002bdc05cb7cc1b239ab84647d9e4fd06fd4dbcc88b235bfa4bea49faa4fcb76bb424b2c807680c4f49386e339a97a66eb5153c1292a943296d0bd9ce869e1c1a2ea8e211f4f87f3a26043e70560f8fa4545d707d9c809077d3cfc0a086c82b34e26bdef08674935d5221efba53ee93a7a436e3df8eb7ee03e8b5c958dbdf9b3eb550886c4b5c80da00e7901de4fe006f29e42eb3ff35b82428e166ea729f0f99c250329a831c1ae1c1320abb706b16de680165c512e54c94a0070602c909c3020065830df776aa7627bbca3c354c0f74f25b4ba26d9390c7f2411d366f7fc43471612f8027335f91900719324d560fd93b71eee3249a08432fdc8e9b088182dcd8e074c93e202e88092f3058cc7d28a819e650b1dccb14bde46f436b917107096aa5387e455e5fb966e193434948817418912af486ff8243d3a1e312885c8edb09ca80b7462b90ab427889f7754823881b108bfe0769dba302972f225f9baabd612c303ed4e9e8159dc38427cf8ea19d1b7264f88fbcfd2e88e8ee20630879b854ccaa87e4733b28b35850901237bb3b6cd1b9fee31cae773217b78d13aceb2e0744f186d588c6457fbdcc9dd69582e4fedcacd2bbc0baae083ed498f28a647820554f19db783eaaae4dd6ffc6d478bba035172db8794281584541b88984064a47512d8a31e7eca862587063b83df7cb55b6e27d27417ba037ffe8f28946fa2faf960b9b36046053deb5d2227de6c38576ad5b6202086cfe65fb7eac962dbf059b09d0b99a2a445cf1c4e1aa2f1cc9af97da036c5a3f079c429c5c07de970db3b87a592a0dfdda913213e86f6607faa54fb453a0b8f7dc86cc276a6017052d1ee069c059a926d18ee1c386b70f9c7468d43454aa163c1c2edb9fd0e5b95e70ca37cc6b352da8fba9c4c9c32f7c48fc3d555c837f4cdf3f1a9dd190dec9ea532848efaa47743fc1f7cbb806336e4d04ee726ebb935a2752a79294aba98aaec1fdbee8e77d7d3b1ba83a1e3a2808c91baa09fc2fa0be51f82208fb54699a190992087f5dff61b142d9fa0c5f2020d555ff6e5a4f0487e4dc2f77e374af101810348faf88cff0c3f9477c45c92a2a3c699abae58006ad47936dc0db4f0c017e9293e887cc06702dd81a23f41ed0e41d57b0be89046b8f2f276d424de8a56eeb957fa562729986b25148d5a4d7e02c94a3c54e90b7c343e36c81b5075bece1de9d6189772b00326eb82d8bbe959c1ac9c5425f2a68b443c9d616b6bd3abd58cfa85ca5ee7fa804111726ba5a688ca7368088848e345a5dc34e50c86d05797578e06c5cc336ff12f84645c129da21e93f927cb210fa3882e991048e5d3f30eae50329b5311817e27204a757f1add7d333f2b8fe19dc0a4e369120245e98ef8d471104e68a074cf051a78b8a61a7df36050097370e07a0d23caa471dd59ea78205b48a000c90d54a325d8581e3cf05668bd4d8bf568e1f82393f7b59f90d8a0d79e8084312137b5ebf957fea1b13797e63a6ee4f4295ccc33641fae98ec1545e31b3ed5bbf2418b804e98a642654b373213a54d0a80aadfedaec416b345315bcb551fc145b551809c232d70dc294672475b2322cc30d087d59aed1614a069132941bbad24b95e2c2214f746352af41903d13ce5193dba59450997633efb14f420cb2e4e20132b3b25128236a1778806adf43f5582196cc79b06bd9504e04432e1556fe7e57bf920c56a0a008eb3ab52c2a64bb62fab337a5ab81da2714a09035ecfd6680debb66854dd4b707435ff2e57b3e042cd37a385b13fe8ef882b31b5ec07458279c6b6b524b8f8deb78aaa405e0f3acc7ebe46a7a14f6e2f04b5999c90b945ec49c2005e83115f7862f521378e089ca2c40b40628b5688ebfc4b26dae68cf81b591d40c939845f2f828bcc05b59e045e21d58833b6b87e02d2cf1737c16a3557f72cd8214f081c3fa7e2b1bdc5059fa141feef5f8d8110dc73a962f9454ea2f1ab093f857c7fea5a2fe71b86aa8ed00bb14432d615701086696d9b54b0c514f085527f6fb6a1b590e7d184a7b4ed6fccadf5926494f0eb7089aef87243ee4073faa7bb797ad1213495c7de4a8cad615438f4178513c6a6bc4d05a1606def9823526895b8c7a119acbea78c515e7d6a23e5ea05d7720089d9ed003f30cfd487f72ad62390ac98e46e8a35f890ff4e85f0417e89e33cbe1eb3a2bf8d673d65a7c408d16bd5330e270877d9cebd4f093d4f41a092ae15cb9f3cc217bc38e526ffb78a6368a77d317a7a78d766496dce5c184c3eb8a751213b67629152dfb0571d50ec936b824b57cde8d8eec6fc7f6d33fb4700f12ac5dc3b456cddf0569d7f637b33a1b9c04335db97b538087e582a1fddbb25673497be9d1514336c571b2702fcb50d46cf9d96a51ab8ad6ba9426d02b8db3cf066464fb342aba7cb72ba58149a9eaa4eed6f69f57defd1a4852984492075b74ced56ca5473b675d764ed5588e02d6ae5c1b23b81529f5594a76f158dc4a1bf2a7ef7e4ccffb806758ce7ce6f66fc0874ee0caec765452ea818a83b79e29f0be6eb698ad560a92493a26deb8593b4d46545c2481cab6bb9fa8dc88431f6c77a306e0a689c21bab8a6d365d2a6dac1960b213b0c4f85cbf43a8455017499d2f0e00262a904d06a64929391e9eb4af215995149bbe29f69dd106e12993ea814788f8f37bb04143aaadb4b9798707c51bbbc1764439528be29535d4f07ec9c71baca165581aef2a0a5b83301df3101487e1c60e201c48e15e1b46fd4b33b369526218799abc456431555524037174e3fbaa69cc24b61ff3abcb509b4bcc0f584d6f30f866b5d265085dcf42d6763e56b7c8b7755a346ec1679f12c5718d9eb0d977398db328917c4716011a2700d287747e20c8516f8fd31923b0de0aa136eed421460e2f0aca95cc0d6630b8fb7475be59c62b722f1dd31a2757c741f0cd333b2f0410f100e7e79456d01b598c64f84635c85509d40718c54633ec55fa83b279af7e3750e794ffb1cf10d382026ec22eba4daca7d4d805b476ac8b25b08bb09bb95b066377540bb29ef93d323a20bd6e55b0ee6b75a25db9cac0abc613182a275a9d3a7808cf0aefc1860f448d721f9d1140f53603fd8918f5a2684a5a628376bab4d2ca558197e97537deec9b345705850a416b3778c7ad2140a33eaccd8330314b2418e4aac015efcc0724a5c7c4abc514fa207e51d133621aed63b9dd2408f0727c438aa3ea60558b53865ae46642c7fc10d80244431cde2061f3d31203b313663bc26cdc0d82df014741e2843204cde331c25fd108750382ab265293725a956dbbbdaa10cce61e065608601d18e34bd1da9552c7ed884d7a8d5bc1fca3c5416bc38879ac3f8b1359d067750f916b7fb308ecce26ba0bc46040e914e1b33fb440bbed97dd79eff4d8b1d439974f5ae1206c55c61d18ea7fda3e35972e389de6757a429deafc0a990acdb7762b461eadc837c03cfaab1a73fba20771a2ea264a1f8a76e3ef6902d69725d7b2e1dd4db45bed7536f4cf8b10a62767bdc5cec4f163d61e42ff395391356de6186c2b685db0332edf2d718e48c371b9c0861dc03917c8511381954ce89b53a5763aa95c76d44911a9074e5ea15e985dd93a4b511d4f5d36117d11497228176f136f1763ee52f08f8b1086492487db2f7e5cc3243965235c8791f9947df413042d53e6deb58ddf18e71ceff4c2920dc284e330ae419a20e3f8d33d2e64409ffb2dd92677867bd20893ed4bda273cb61f9360a568de645b4534d9ae324f6413a67cb81bb99a848d359be675d6515e736616efa6bc1ec74be20f16a9cc4b1e0ac36956e9af4ced3e6bbe0a46152ca4e97d5b233ae996a80b8fa52ade01ade461e52c046a75792d82a4de986411d45aefed7b9b3710a1a6c2484d424a217ad996d2ea250c442f44abcbaf5c22083ca35c484e15846a85a396383a266b9b112b6e92eba62c092fd936df116cc9b8810154a141eeca8c2ef6a67dc17b033bfcf0b10676aff736c3e96e375ee57f78b107b80dd7981d935cba9af68be8a4b486e2aa33a7f41c489d86c389d9746b66e61641c1104f85d271ed866602f76e190e56a2554b907edf4d9493b2e9b8bee922ededffa4f9e0a4840096fdc78bf64f34541f187a4132f1ccf1fdaf2e610d2df06453d8545ef061802cf152f9be71531f6e8f44f232a76a7c5ccee9e94d668f2b67216b4a4ab2e946793a56c7be4847fa2c4a7078107913bfd4cb502a1d879a1bd9b2c5e06d9885501fb597d97062fb2135cd73dad087209bd9cf4652f3833ce8ccf4fd09c02ab0e6ae91a97a308f3bcc07755c6467570bb562fd0bebc74705db75328b89527b200cdd6aed9611599607e434b840595168ac306627008170b5be7a1cfe6703b4bd66a0281a2ddb0091b5f5c50334aa811fb845eddd2f38b41e691979467c76a6a3cc486a49426155a6472113901d65d0236710e034972207db8410a4e95d55515d9a07112d41d611ff082fa51846bd366b936c497a6227d82e9acb6072ec9bfcbc6f1c37b477d7872fb74f8237279eb3cca53aba5f51b50fbe6acb6f2d484cd2ac45811e8c46018c3137b49f1e090c4feef15a445e44abaa1be69e7119cd92f41f06bdce487ac77a592fe480c06138eaf7d42abca5675b6ab407b0b86b5ab59c817ce14155ca7cf24665273ed14109c981541ec700ba81fea8488b32f9fa77b4cd562d78c63b4d64c0060631fbd28fdbcd16150b28ed1b6bd318059282170015f717a77cc717ec12c06dfa4355052a01c3397d252be1c1bca7f847fb94539b08fd2a4e650844c1af54cb7817316e6de936e3814e5b4c2afe1d15ce194f0cd3ea45b068624146b6b34980c1375d681b1f384e79196aeb32cc5ee55941cdbf97dcd77bef71975ec9c2997ba12fa6bf07b07107350f13662eecee6290469bbec7da6e8c35bb34a10af2672b98b0c137d228c2748aa9285d610a3b18c6f1e649485525c4e825eca3094c7bcce61a2a7ff03b00416447cf35ba9f36115042dee6bd6f613d3a14394a616baaf0144fd81d760fde81eef81a9bec74eff86af4cd0a1e96d77641d8bb0fd6ae091de49e828519534d4ec7d8b041e9bc278c1ff42ad53e1e59819752d32639aaf9b1a2fcb25e64d4a87d9cf8da6973f07471b93e7e812acec58785cfa47f9a237c48505f5297a779dd4d9835d97bacc77e56128e966e710f3eab1c1e68272ee065a77da561b04c3b2d6f28c0d2b15a8e33eb9be8d1bd3ab2433b09bc10b2c6911668266babcc80d234cfc70432f1f84b517714b9b0a9231d5f5c2c0a54b7d3c922258079aeaec013f28073f65fba2fa682a04978ea84efb582efef8cbbdf7fbb51cf455fab38534d024a10ba944cd6c4424801ab2be87dd40511a8e67a4181f8185ce1e087c4456f265e36eb00277a81ecea29328e931323b6b7b24d8288527326a9d0f01b69af006d02cf4e26ba020869fc8ae19556e201afd5a36c1f7b12414f8c2cf2a54fd2c3f997a2567319454420cfb222c98513f3b85cf616e4090602c4f68d3dfaabd1b72c1743e0baa4e25a4c8a960950d0b6b8c44132075810cc149e64d34a47fc439002328945395962e27363e269d845c0c1352ecc1a08263f4012c4890e0f98ead9ea32ad8cb25e935771795764158b542a1a49f4b8a2ee36cf16a0471f9433ef4bc3032a81528d39c84a758995840fbb71c603933d44b99e973cfd85b1c48112e7805eced75dc448c6b375d50301060225832fe06432091159f42ea80606d8f7453fda9ec15f0653b92dc008cde0c6b2e5b3906097a03f197f7dd9ef41706482196e150272d3f302635806ba08685ad21f0276a0f31d7a0a506f065006fe062b9d65650120fe7250d5e7816ca83ecff36c5f11959b89c0fbb52d6bfb3f07e58fbbae408b302374f566127738f3242adb53e465940e4f4fa704d8560c35cfc101d386c4263239cdfac1dc1078c5b126d9d3e47ed1096a08c3aae84df404cb24464528277586ff228515238674a8ff2cf266141f973cf340d6a1ce789823b36d248a1c24c46191d51c837cf0a067d31801a26ce85173225e5e19ca2487d3f0e43c944671b00d3e100a60751b70df78b6e903ae0b203a0494cdf3e9ced1551de8381f78791c19ec1ca20da2d51bef9f8fb5b3e3f8110421940f52b17c17660fdf16c900cbaf4f73d95fdecb67e8f369562301d2e2de5e735b2a7e91c23afc8f714d5b70868f09eba9dbc16fec4cf5e62597288e7124503656183ac13efadfadf61276a82ef00ccb1f443841304a4cde1d64228fbf20ed5bcbb4d4c36618f4c6f40ec4fe9597c184968a6027a828676bb4e4080d08f135f7f54118011103e6cb31500d67411dc1f8d0436417db2ff308fe5f42bb2a1cd9267e96dfe7ed4a1b6c144fc5901228136b0330605e5dadfc1b58eac2ff25a55483793ff6a91d87bb9f86abc4e3da476245a2d0f85ffcceee26024d8de8d202858af2aa2133800b03d7eb2487a806e8563cc0e8bc1675fc8ce0a41ee54fb5825062d150fb3cac0d4da463757d2054486691088527ff81fe7f041026243211e61d6d8c3300a8ebc11808a6e0555386a255c11f5606f166d47fb986101a389b0ccc3fcd1a00e3e3917dc524e03f1d758caab4cb73137438478f5d59948ee8dd8738173c3e8cc4a71465aaba9669ca98c95b9a690fc058fc893335fa89448bc8709591f65ed233418d11632a9e144e54d2d482c6b4c828292e7967d152232c8120b035b5e84a2819142d21425a02b1b42420b21515237eba448b0c5ef4c2a49486869f7a6b7cceac968fa6b2076c147f5eab9c3936cfe45a7a3a4f794fd69d7ab48ef56eadc3e08ca656324d6ebb96d7bf7e7755d8693ad0703429d9b797808ec1237acb0f3bcea1f1d7c87874f41504866f2a49c70546f4d26a83358ca6fd7346b3eac6a5e47c0475dc86b8a2152c3e099491c1beefbf40ea823f90a87d44e706bf211e3bab535eada90c71ad2747bc3e5ccfe6d4080bdfc7cc2aa9bde5d97fd1118f9d1eaa0a1950b73df7c97be78bb5f9dab101723ab48cf55e3d08b93c2230c3c33f91eaf4890e35db7790fd359c9a76ae0a1990416813c8bf096f024bef4773b42d172ce93e7503cec217ba8436e14af1c125fc0e882f271ef5d2f67f18a099701f21a2c2dfe2a4057af0d2c2af1f3f88cc4e9f97be219920930d83d2a51c50e15ec438b507b1aeab766e5cd4158ecbe5f5f1ae691c6e85187907f99ea0e42e5ac2e17473609ebc735d5a1ee5e0a7653c55395d9b083b469ce724ae09786859b2459fc9d76499b35a6df241e423a6dbae3361fef5474087d743dc634e0f596c8d926058aa8fabd7fc95d40a28f959587de0f31444fdf12b1df6778ffda0e010fc1cb15ee6610196d2c064f20b826798d318b13d8c8c3cc31c3d3f03eb59d03ec8822f87872710e2647401a8ff4c604f0ca60c4345124198767b161f14ad3b125b4387b067721d9826024bacb1fdd5f11d2cffbcc3a4c2e12ea754a2c192058d99a22125f0e138b02560ef11f895548eda5d70cd7dce266689e5f2a190d483162f6c10f6d64d833a987357388b3b84999507a1011958b9ced301cb1c0330cd4eaee821530e5bac80e0af3b2d354cc505062320f5ccafdb2115d5039e23a63ecc543e66508093d5c1a90cf935a1f9149e49c2b4d389591cd7cecd2f40d110103572c5a43e9b211fa77fcf5fcdfc24cefa9ac055c7d421d5514a04d5e7ca60e607c54e9e51b76dfd7113d9365a5901a9b97069085982cce1d50d79497016c4f3b664ac51f9d582e86da236e02311af405b23451b8a56eadf6efc11f466dd2e34020b1930e976dd4a9d028286153913d3603f8cdbf78197717f897832656e5d8b7ec7c6dea98c6571768f51df77b62b0127294638148f123310cd57aacbac9efabb2193886e9a0355af30d92f2a7d3c6bdbbf866ca1fdb804bf805b45e9c30f75654f6d70a613538490fde26f9c99f664dfcff38d4815c462d600b2517b86fe6a5517bd84faa3cf0fa897161e07931746db9e0d09e8249a031f1493315c8e2d3848cd0bb1475cb05183538c8d4b109c1936baad158747e2f14c007c2cd2c6298682fc702b554886cf299e75279e2eb02edf3ea6af61bf32411a8d45dc0fea2a6063f26bc5d399cb8ea19a017e720ea824d685ee532b832fa26a803f20b4c0a6b7c868783b2d830e5af05fbbd42adf052dabd17db8b520016091fa6ab62f8739952b67f020df9b1d4727f3bcb05d98b43dd1c8c6b4d677d5a3528e9f74ccfac32c65ad95b0940965837fc5754a94fa6810952251723277e03cd14e5ea3e370f59f09a0988b3c43433d89958d5d647a73d4081dfe138ca813ec58d784c8dc4cfd8dbc4d9ba046a9fa4445a72764cc553c9cabc13a2a9fbdd23c679468e649d97de525fa8ea1408b23efebac00c7d2f4493962f4e46d36de64ee3c2addcf655e6b3ad41f22de3dc016554dc4f507fc7a18a888cf2fb566dc666aa34fd66a68283f05c126f3afb93638e94bac95ed9c954cde3ee0b7b1f127efb0c2ab6f05188173f2a0ecb468513f5ff8f3e1dad08e0b182138697b00eae4006a7f075377c5d782874243ccb977adbc4c6bbe528374da96a17331b3cecfb930c0a3a78fe3595af9e548ac6bf29450a98e8e2048d3b80112df060cd74ad0c9c23c5145cb80dd595ae69bd54bacd28a40134e8e8d9687f1b09448e60318e503a5eb459e311b1ac59611f0e3f09cc3cfe3ea529e3d5c26eb6484a626e626e4ea7e89d6ed8c8f5483b32afdaaea80dd741e19e06ce60fe710fde477167902b5c0429688220f636376f551b1b9c29ae700d6f5cb6a4d075543bfb5e6777cd008c04ef99f9619133089b4baef00d0131fa17c1d15a138b30582518a03d456b7e1918a88e309ce39d4f14aeba99d29b2d1923dc607f5153af20c75532f710f83f5e819b2d170b2574a22546d2d467ab0501989f2fa17eb38387170d291f5a9287953800568832f82cbee5a1f4936e5bc8f4126a68136484e0bbc31beb2bcb8c34f9400e264ab852d0285d451ba42f8d36f8a31ea5310a98cc152d776a69ca3c9052284f6465149e8506020c818470d17d80c259feac3cd689c97d4cdaaac033df66609a003bd04ba70a4c3c3930ff431658ddee4a5d989b5392655bfb42c8af1697b38e4255d892cfff43aa4b7a022e847347890333a88b7429966f42b6e002eafcc3659d9a602005fd53e7dee28c7b5d0b4ef9ff72c892f3878683799cf048d4796ac486b9679c29febedc5ae1f17a54e63d77f452105823f7d75438a9c524a8e2561aa374d03208d7a24db0e8c89a469058d0fbcd08dd8c51c0b79a7eab120fd26045219ff4f56dd8d9f8adaca19c8750ff6d17313d778a5bd1cf88faaf830aa5802a2b3e55f1dccede12d8bcfb0ba8dda8948f223cf76bfcec4f14d0f40deab4ed572a14429c9a74dd5345c3b8777da29d99c7f3cdc7f0d2fcb3992f03f2f7a646293e0d64ec0fcffe6f170ae9a4964e4ed1e66802b580215404850d54fc5986c0a4098df8b9eb018f570640f35d923518837e3d167d1e15e241b3aecd3b0bebeed7c0d8f6ff661f2c53090fa3e7861b2ec784001c8b5fff63543ab3e0b92ef7675669a6bff419bd629d6929f43de9592e8bec8871d0338536b5f1a08606cb14a9deb72e0ce2086ea6cb381ec2f0fa953873b7542a4919ed4e83f44b2dff0f1fae9dac4ff07f02b76bb1e649efaa2dfdac7d381b28007658c740d0b61e52a2f2d41d9e8a64c7aa7461f355c9435fff163413baeeff1f22a431f50705d733b847e605aa5e2e43820483034fcc8f7a6b517cf150b3d0840bcd94a071735bf8df3efcba3bc07b285ee47cb792d8dbd976d5ca5d4b0f0863b3edb834930212a08f707887af0d35c07076919a566f3322dc4fe7959c88570ff8b1cc781294d518d61c2e2a93d43d8defd69bb36628860261d0f6e431b98689751bb0c7851fff9ef6ffa914500ac2ada05aac6d54b49c96a04fd25e38546164818dfd72eac6c4c77d6eb0701e0242db1b670b82ea613600323985c379df292298519bbce9f47e9eebdbba487fbb8fe423c5204d7d821ee8aea693442a146e20880ca445beb0703f8c45b0498f9ec91acadc9c48fd966578c3643d6a465379194dfd11f70f1562a8ffaef8990bb34c4a03827a85e55aaed4b0124c966f9d72464764b176cc3ecd1abe874c7ddeaecb90638027288cceebe9ddaf05edb6018c244e5b87d6e4ec06326f712c2eaf3db196d032380d36c93554b48c08d49837a29be7ac53e8489ab40e125f7c240d6b4876a80707931e0840aac1a47c0b572a27887b5765431eb435aa4c54bcfc06950bc8f5d31525ad8ad0fc0b12b7f82b12135a3cc9e8905da61c43e23a6aa786dba22146cc63884ed8720de5b0c1e983df7bb03ea31023330022b28a81e9d4b5f6fd0ac40491062341e8de69423df9da6edb8c422cd6b5af0f157938b0b77f573c3f695287698db44288f08e43a7b508301c9041c1d07895bf047d3c4936a591714edce30bba755d9fd8e151637812eebe9e91ea9159260f245816fbb75ea5313d2c839258b3cd9c00b950d182cd43f3a83837f7f95dda8dd3d06434f9dbb95aa21e959619c652268883feb34118d17b355d65dc6105e751ba451d9dd6360c842ca29cceb157819906a4f31b82b377bdc6eda5261c1abd283bb5266c3ee5e1b49175c1d34a69ca961bbd73271c1ad481f8e8a99df58ddb4a9d1022bd3056fe1e6f6409b03dab62acabead90c2ae2b34141499acd61b8a96601fa8d5363b5a3c7da81ffb66801f7aaec5c49769eb1ad07a8a43bd8646d7cd74fa606d67ca11e8e5613c3a4278e84c9ad13659403f029a9274e04f49edc7569d543788e2b454fff3994e801f3c37dfc053cabba8317d083c4ac60a22904a0c31122e01363a02bd4c26b71e145d74a287107320e81949b39d0952a0a83590f3a45ac0f8ad1ece13520511581af0a818a0cd14d09c79ef128aa4651b1fbddff0a1f0b945801b811cc44323d60964f0223b0f26548aa081a76df31729d28925d3f6f989eb61ed4d9ee0a64ca18b83ce3e5e8f35de4f50b1e5311f9baa0595a7d426205d4308d640b1460f096031bbcfa25795ea00b46f022fd92a7afa4a0b4f6a1d6345345afa133f2783c339c00042b112be51a90ba26c7b0c4648349150235f4d1c949b0c53a1939e41c4e5eda983dd65568c45e8beba26b3dd8efaf9beb2e288f6493f5418f3b8be3e0aa72a8b573f4be9410e0b0359ff80a4ed23232a70bd9d7a691677ca627e547ca8017fa1e6511087c87ae513447d8c2bc35ce6d046f7ad717bf22e87e2507590f20e162aff8b10d25258225b524850a4606061a65e964380608bba6d5e3980f953b7d77d99203f4511fff386debf55dbdca113c607626ffeff678f19d71d31cb77902edef1f5cf0326d274cea6b9a35fb372f66b871d5f3fda20c6d17670fedc09828a9773751f6f9c92514ea0a2db0707b159126d4f7b7bf3449a1d8e53b39152e0591a9ccea84a0407bc060d1643332ddcec95b93627cad454c7996d91739da05819fa5095de7e3beebd982928791103b7acd83295a6952db30e54c814c4c66cf444bbf84c7731268d619e51b79bb4c1f811aea23782f1269235b58b1c4e6c85b5a945c856c23872bc7ffeb8d5d0b67a9885b5ab384c525c8687cc36b29a51f7b3cc3867039f9e9c87147115abfe7fb731cb4705c4de735675bb8ac3149e39ca4c56c223d8214b7a91430fc49bb6a77873ac72cd9d416bee15486d25c7f13212027026c2e5169b547220c54822ba5572f42c88445805e34fc9d18cb91adb3d8e46429533ba977b053f21a75416c424af4638f72b67aa20d27b87d3af122577c6f940e3ac3f1132d031cf2f1fcbad76c6125c444765c09d1d24d15561841b5b98911f616110cfdf71e699ac6cf4cadf483641937f5d0e569e480787a5168acbc5a752bb231337c5f46e79d3293a8802d5e74a638c1a0b9ed0a6721f9c062b5f155314caec5afb6ef358ff25fddd5b5702428596e845281058a1366e2db573d7ab8460cd1e2f928c8acb01bc65a7608c6275f1e1b4b6764c196665ed58400937461652a9e72d82a0a2b040821987a97aa46598550bc0a86020aed149325091e70ad081b02b4b54546fdf23c6082a9c852b83935466fc34de472a816e751f0858340a4e7e3d28ae11cc2e700891a6ff1f5971ca8d1231ee2054fc0a313ff5ed44d606e22c488d4be862fd6d29a483f7233f69edd40501d08db82f3d08145a2176b8146b297aa2cbfce29412364765eaa91cda91f9f4bca41001c739c0d2f316d0270b2facf0578f5ba21fc77a2b9c07ea784fa923f1e0554fe1ac40ee65fc044f1974471f9968ca4c80c32484097f98a2d237a8ae241e4459f13ccfb193c15fc0c857290f7ffdd41e7ecee079ce0e040854fdba9078ba352527883c34f3ae5a477515841291234fcf468aba74e4fcbdcc1c9919054b80bb07b371fd9ed7ed32068b2717574b70c47990a39bf5197643e07f03ff488b929b06923384967bcee4544bef32fc1960ef9c41c792234432f35fd72a49da66d61faf198eb0ebb9268f2594329356043914027360436fc189d160a8fde9c126a1977133f3a6d8606d09ac0b38381b6cf6c709041cf0f1926e31109ad9ad1b1d7a642464a6df3e730252a9f1fd3907f6bb5bca8db9236be2dcdafd2efd27b38d50a8ed040381ce510b13572e292fb702be19ea78739036d75bcef92f660f718b4b4760de8449c22db76ff0b9fb454b61f75c95dd226c096a8531059aab6edd95156f5bb6772967a9d6237f1756812fb0e256f7aefe8ef7a32f2742a89252aec81d0e67d5651636df5ca6bb0311376d00be9ca541fcb950db0736339627b2e1ad5110a30cef22a040e0e7d90abd368848190672b6396ba9ab1b7c256b250137d5985eb595d996999f692acde3219d72b0454c30974e34b6a0f1c433dfb42c0d286b7be6efe041f0b7c9fbff3e66b1fef4674993ba060104299088290428af438f07ff688ebc8f3169371441b0c979af68203f6212e23bdbb9a0aea3d9319d2b026602a6740950283fea0d2b174712580710811b09626354d30894dcd81237a4288adc42cb70429c8848587154961ff0cd1fcbc4464931664c69405bcedc3c342c5aaf7cff1d60f7a5cf1aea9ad38faecd08370a7a1913a617635a1cf6db6777509b894832ed1e25e0aa5b703665905ea81b057717ab349d384a73830450ca8d0d131e59f8c37d165c07fb94082cf6d9d36abed1d5ac5b2f87928b008c6fb4f5ad87948c1c0798bd836a3cd2adffd6a740bfd958d69f512c7f4d83a89ff1423ed42c99ef982199c352826338d72aa11c2cd0920cc388592767b7893f960f9a8be01889b4893ef31457a3a7b86cfe25987be0c1df8abc36c982362750273d4029d28a40b23a890ad545f5665b88eafc60b3391f7e3465d1b1b345a817342250a6062e4b0c7687105b6750335fd8caad42437449d4c40e966e92d1f0d4e12cfa6581a5a43878fc3280a178017a3ccc35eda2ab026aa64125967f9868880ed8ccdf2add06241ba2a0e27af29681a6d820f41de9d9747049c0ae2766c898ebe43fe388eb8240fa9142d0cef186bdea2e9d73b8fcc6e194bfb694cef93aa93a101488014043c55bfd94a8edf50b816c286e855aa18cf549a59b0876ae0bcea75476aa2e8ef712021fc251321fa05fa7fddd246a3aaee37e80f12f4303368cbcf3753026d85e9d520260d896ff63fa6676e6471deb7343f046bfdbf2d44035f3132b78c0a9649210c6ef7c5171c9990a9124706179a0cd9d7020c5ea9fac30d54c7af23be473f821af4e2f5e5ad8964a0225fee3916431d6bcb1b473f4c53b98da56c463d52307346795a5fa7c7b9285113ab71eb6e9f6120aa5fbbc1272662e3afb961a22e5ec3b8f2fdab76b336ca101945f86c0753a22cd9456984d071bded3a5c0b4688213a8269231d753df6835b8adfe0861b766f2e326b5be0345acb544e7011d692c4173e4f11e225bacf78ca31261a03f13b9f85756382d75fb9962917dd49af0e73403ad6155c9514ceb3b441f1ec3ba306d543a0050823e9a60ce7a9585eaec2fd8690bbed11f2a1fac39eb3ea852eb796695963c188f0afc15095110f2767ef1cc9f28f21fc6b73f00eb665917283300ba7c480c2dae5dcdb2a38dbf5c8c22d62fad21633fa38402a29942160ea965a4d5d2886fea46e27e3bc935bafbb8b17d99a8a06a4e8e6043ab07dbf37d7d4df30f74be79e2964e9955802eabc2bc404d9818cbcbdf0b94a6c3870ed9a22c0d95e1f5de9baf73c51e77ba45301efdfe2f554e2f49cc343bab02a3c954b6bcd4143ecd12b96ec413148558c261fdbed28956b7a6089898f7dc31f387fb5e6d21b81211a4cab8d3af94200e080ee796122bd6e9222fb369973102f61d2b25bda5a2d082f8c6557d4cdc4da2b6bac68f879ba994e2a90b8682deae2bf5e7451e4686da7208d100539b369e271f5dda65f94559423a8a2077e6a1f06f8d38877ba8d780bfb6c7c618fccd416e44bdee261bb0ef637103ace8e3857d7ae7c8d50b579bf90a97d68050852b9927a04056ee82615f382fcd319c2e01a3b69112fbb8d3f2fd73c13ae9c91d75af646a0e1d2fe2de92794649528f11c30e801ee92a8bcbaaa98153696827da235ec74ce6fabb89c33aca65a83df95c325e63a703fac104dbba6f14143e1b9fc4c77553ac37917e3512ed1fb63e95db1676636528906a29fe2c98aff98ad9e2148b568e664c1d676a4a19e1fc6cf49c804de3ab60606436cdbe66580b9a68648c402cd29629868a6fb50dc9ba955c543eb7f4de9ec57637dda5f439f348ba6d4cd5f8f3af063e70f553bd0081d59a7860ba8a2211b3c1a69fa9b80801d8ed662e1366788ccc0578acd3e52cde64fcb79990678ee0a5f1175a394f1448e4758efae71d436512ab5fc0eca30c1153b149a587348f03447e633ef0a90de0b138cadd68ff1e53898692ee88deb1e22628090338c5c4457ce1ba3bffc2cc6231f07374817dd6dfa6933f6ff195ad2d583d258d2060e0c691b48b053083c73ad2fec5157e9d79fbe00c09bf6a83a520270ecf361e91d056a0b56cd5dcc1d290f560ee75d6635deab9fa174b44659101fe66b34a4a4d155c0b482039a27aeedb142d02dca2fe8fc34294d87aac22b2f95bd671ab6339449e5d5ce73c99a3d53790f2475678893dca9d073017a30fe4690ad538898fae52edd9c1ebbb057f04567d3f45d2017faf1b9685ac1e248f0ac6800be8823dd9d1dbd1393ba46d695fd96bb4df7a92ada7b3c69ba1399d883191a2b420b6b3224673fddd5d01aba9d121d921e6170f8af7c07a1dec99d6624d3568af40a232f22b48b071f5cdd50675bd3b87f720bba11b32a7bd7df1072eb7ad54c2d7e68fb927dc96f13b841c81d544375682dae50b65415c0622cda543568c4847d7f6e9048490132fe25035823f2e282d996e128a7d639efd0ad0b475428e9759350d6210074dd286629608f6e0087799d7bac38f7efdf47eb4dc4fda075f70ece4cde8c9aa3b80010a57d75f9a59f5e97218011178706be3315da145881bfe63b0d057a1b0fa89909a7ec24651fd842e875b801750462cbc4b176c7727ac676b044ea731a84b0b9fc10ff996810db4839db0acc2cc9b11f75f7ef7e00d3d4352acb951ecde288a0da03967e7b092135fa2d5b0b8db8c375898289f2a267e2e88c1e34cf6576a75fb9dcde364d7ccf9be20679604df797b8f64078c791e298e28bae08282bfee8e798dd3b0400c9794e89757157c294fecacfd7551863c8610101fcf62c9cfa7b1c074c573e1315fb57e8187798fa7dc4b48f574b889aeb5278329edf999cc624f5b375b21b9ae34a4750802441494ef32c29ab62df67f763f4e2c350b3efd562c24ff1f8bbe847982d12bf520227df4c24f31cfdea4d92a11f98af50850b658bcbaad50ac013ea976477b8e24161bc4543337fc01d98641d7e5617af22b3469b58278aeb072eac5f7ec41f4dab75c1256883d3c260110c54e21b06ea5b3a998cf361544efaa6e37ef022c0f901a6ebe0b9cc88d99a5586b0f1eb6ab7dc6c71ddbb230006939527092ff537a66f23a57bfc70f0dc5520f045e3566128bc664fe9c318dc86501d22d6b60205acd7321e7042b99b6907a1b8875ffccb3346638a00242eed73c40713dfe4c8d0ef02c7227d8ec381c1f02e6d754de53445ae5dc84b2a30a58556e7090f2eec00679d3967838f17bc86e9a6ab0544bb5d03df18dd21767d6d1f23594a4ed88eaf0d3c5b4fb958edd1d4e4ec6160ab835e35b6dbeef929025e1c56ac621ec9cbd753c9b014c2c5b0c9a8c2afaeb4752fc8dc9c8a4283827ba7061a53f583ba6578e48f5f4143f5d17bf639bfd482022d1f1640c045e99cc188843d1feff0f5deb8fe9b7325c980e5f9078d37d89415e265d871426cbf298c0b3822666596819097c8d07f7802997b68234490129068afca0724822b2697dad134a4bdf8aed1f06be417c8f83105b277294613829309305a5c9403a702a2eb8d4f488b4e6f418b3f6ed0b666f5b6f0b994295050ea987f80de3d9f07a23683f405545080b4f854b102489aa2bbc7b157f94e5900d9d0ac524f8702d478de883b0d847212b3d2da1931e340501caa9b4235580581575098d4c402780485d57331d014168bf81d5d08ec18db16dc8f8d794caae6373fb5a128e81f21a3b8e0560466368ad7b267dcc7e7d21be6d9400232ff6f02afa64e77f590a1fff6eb2e5965246be945226191f02160241023bf48469f4c563316123f3148a1f8bd96c1a168399680ca6e112933a3b18f6311dea82c9b1de2253a8c89882fd0f90c5a40ece0fcbf961b1fc16e3b83165c0544d69cff3f603cf4d09ccd39b504d208cc4331f791ce38e24e252c464d7e5b0e51893a54aed3af584494c623287494cf6d81814e0cba80b0c93291c8483684cc8ebca4a09734f63ccc2575856ac4a68ad85d952b639f3e73bb2d6d97950e420e4bb260467200f7928721072f061200886d95a9bad157d425eb90bc82b9701d6978b494cd260b1efa979b62900236c2222a0279fab060f3e1b2f22461f439c80e20205511c31a28a1b5448220bf2889b12b41e3d96bcc07c84890cc9cf1436a2d791971037560d8888a2fd9148dcd6a96c54b8385167ad1561bcdda28e9be2d525aa8420a9fbbe8ff47d214d0a25499c10d97a289275134f67b57a2f67f636994cdfa22fcf7a1fff83091395cd8d8a496725e9fd75a3ea7a67f1743002dce8009cd4e59f0590d59180ba030f24dd6fffbd578b307a4f59fe023fbf5cf5cf5538ff8f3c1b0e2e4748be8d4617472949c9dbdd7b2fbed4046332554e693413fdf9d166a231300b8cbc91fe544a521aa523256d2b175aa331ab49a324a5edd8a249aa721525a992198d9923f2ff8ec021c01525299f36db0257d336c13cd1b1ee9832975722a94a8b542ada60aa274a53324449ae79e660b7efbdf85e9df10d8cb9e537f0cfce364a7ad7db18dfebfdc81b515ada54944687f22d74c2c4ab948501188f3f232e61c8a1daf8533e49558e877e0ca2e172fcc97fb156609eb00fb844e11235f3f5d65b6f1d714f8f46d887f95279129e254ae01297b8b4b9ddbc9bb6791197b844d19817f110ae95a95a4e992f5557bf7568be9a455298ffd6d16387149e45c67bef784703eebdd7e6fb8fc81ff7dedfbdf75edc7d7b4cf5593934fe3c502502e047d65ead18e80c11dd09a5c82e602de79cd7e6cd76535bedfd5bdb12c3d6bf998dd61a200a145c132088e86480410e0f0b7026ce565e01012b3f7039dfe6dfdebdcfdac769eae9abe5a06a359a1a95b53b686a324c30281c5baaf29cfe8ad148c01ff308268d9bd75e2ebdabf4ade7a12eac9fabd944ddf76a54c719813a2e488d7a8a5af3350892c4eec3d85acb0bd098e6a270462d70f7b7edc7f7defbc358060cdf16d5592d59a62a4afcbfb5ff9fb5cd238cbdd17f167df6beb7666688a52506b7e275592d9b73fe517e217054f9cc59730252bac9e35d6fdf7befbd2c9b57de12637baa8ae9f7a30b819b0105d5663ffbfebd9e3c11a7c351dce963383896195010911d6640b3ef34a6c2fab34633209e3e7bd8f7996d364955dc45129bd186e66c064404a74f191fb00eeb2e9f3e1fef6163f3afd495c0fa32e3023f650346cde61edf622df9e6302cff994b891f50c3ac0016681b20a1f68c74bfe3e46c1a1cda965aff4c6bbd77d8dc586d67b82732030aaa35952166f78af63fe760b11e18ec6690873018c843d0d3a0fdcf0135fb7ad7db18dffbd5a8f16d6f94f5fc90435c51c2723bae576ce672b95c347346a5a9a79d5c4ef5a22ff5459808d41f61cea89c86c668cc81802aa9d5ace51a6b65e3ec899e941fa09bcbfb816c07800276dcc648d5dac57ca97c8399f9ea7f100579212524555f84e19990fa17fddf3a46449e2dfd6b43002e01b9e694efd5acd1ae347f777cee1ccf43a210ac217d39b36870535dce39eb6eeffde5ec42e275b790be5207da5caf989db138a1e7d33945af9b93d4e19600267dfaddfb4f9928f2d92da860a993167cc5132f464b6a0a05f91082082925a41479708b5c5f7b0e1cc8299a481105872d38e802862328140df1f9a02885a215eed0d3232b97f26bd721888db284be4251b2d0451d24c1467451a2b851aab82d30261ea3a56ba1a4164aad502e4b8068f11272ebe2c7c6ca0584198c00e5d081ec6063650a92e106d11014248804279f623b3b571ce36e9452796aa9f620b5d65a6badb6d65a6bb548b0cbce864ce1b96c006285ca90570d4b5a58006939a929e2862b8efc78e284253f0035c16344e8092e4a0f49bec42c9ebcc42788b81897a0b506082247d67460b91dd72b36f34623cfe5da28fab293cbb95eb1ee7ab9723bdf73b987bdebe5cab96032d74b87075aaaf21d57cf4f6e845d18bb5e78a4c03cf1982f1595334fff9a312811cc934e9d2f95f798a739ab08f3a572d7c85ad076185b6b5fe7d1e579de36790fcbedb85eb13a0b8128e76c6dce1997b9e55ff3f823d67ae34b73f6f938aa9e3e716668a89ef0107da92c63799b9543e30fd058de66e5506dfc19cb1c73cbbf050431c6b9865743e71a98f35c025b6ca84ba2a228480951114d8c085971332224d3dcd459addeadfe3cefc397feeb7b6f544c98b019b9514d7db57eade74c0e1d4c98781d8b47e398323727031e16688e63ca5ccde7ed262e07c77bcf334d19f008a8c2499c729c7a12c046e539103850043e573d8d161f35a5451f905f507c167da93ce56eee79fd723ade2e049fbfb83dadb5f6fedeeffb48f782a40f247d3693ec851029ba11b11c111e5c4e67b5642157e93de42a61d87b0e0e876bb124b0b55a8da646b583a6e622c30483c242c90e9a9c1fe5799b66cadc130f5c0dc401f9db524dfe48a0384922addceeee056779c1b2a2f2ffafc31a95300c7b18862aff59f459e1550566452544c93eca12030f2ea7b35ab2deb5eebdc481a39e3810304cad66d94b9ece6af592477756c7e510e17018635ce7719161aaa24c89f55cdcb5d806dc0fd850978b63ca605e790e1c16716e54d485011658f2012fe63965e7c0bc959add9cffd6aea42af7b40906d63f6f9ba9b35a4d684f6f2dfa7c1fc8c2e3424296d27a5dadb57eadb5f6be7bb5be37f32f064dffdfdaffc737cc69e95f26eb3a2ca250f5743b3dcba6dffa0d35652e3ffda8c0a4f141684c996761ce90d51e19cdb26ef42eebf9193b2bcb7a64fd7fccd32ec97c653d54d66fb25b4488520694b10c6359cf679a99caf1cbfa9cc1818037f5f1fdb2aebb34ac4f9cf3458f6cea697f3752e92bdd3b5e0a43cfccd8dc3cde018b36a834ac9ec9109230800263180400c230144371180a8351326f14800e4e7c3a704e3a300c4943914824475114044118c42018630c30c010632442089d980332ea7ad87d158396cbf221604e3599f71aa8a2c0a0ca0d7b6b1ac084d57bdb86969eb4502c690ba6b4dc4d8d891cbb929b6d050a8172a2e3ded93998dc2c6d88b387c83a13402fd19073bc22d98a41409d46418e5ea8589f93a08f97892f7492f9278b49c09d982086398e55cd5c1f84be977bb1e3079f5937731a991d113378942306d6ba46035bee4f1455c94ef20bb29b43766ae38c332210c09a745bbd69263ba34e23a57aa37b3318b489758799fb0e0102886f23279f83c087eb9344dc3cb13a184460d0768f192259fe1e506713dc95ff67d99ea8320a40d9aa95d53e2d23095b8ebdafe6519075a9fcf5b6271fab0f895fe0439903688a9b40e8aeaf1177709229e34dca964fe263c1a6e884cb369741f00876e6dff9d1062edc2094849f81441df75f07214a86d237709c54d8226d57eb312f1b25c71148a1f030502afae886210b6ee9bb4f8b1223e8d323c7cd42e47c465662a2815548f1e1d573ec2c14d990b6be88cbce4a37472e36ccdf5a42adca9f910580821b2f533da4baa2f8ddf1df067c76c25cb97a0915892f80cfa046d2db7444874a61006fe9c0346392499ac68ba7e53afc5e7736f5781407a055b31e7a034d07c9e21ad7242b1d53e8f8b069a8c92eba68121a8d8e589a04b4744316ab3763b752aa5cce650ef68043de418b260848b7c3c61d86c168ba77d62280d8c231bf969ec2476c57d119f201cecd39521aeab0c7b60831c00201f98a3ee3f412ea264090147e5ac91b298a1a427fc4432cb3d5b9a2c25ccb3487b5ddc861e19610ca6a3f4178a8b60750622101d9c0b6d44527da21c071831939abd4c409280a1d1f0a833f22009109b7847675a77a8a42a0bb4292a8efab7ab4dfcaa4b75d61954df9eafc1337ab060d4a5782682351176d54106e785f17645b5333971ebab6a5dd81cbb8eeaa3e61597a2f853ba59fb16d5151013d528ed1a3b238fd67d2feed6a7354e654ab489d7e05b31ace1cd3baf80dcfc7ba08e30372bdac2578676de18f1f9073c080abe734e315d2d010759685f4c1ed252e4fea412009ab0cd96f1f518013ace2be938f2af508812d2ed9f6b3e630cbaed9456b967c8821a5961c1b7c6afa93c936e2388535828ed81c719bc077f055cc8f0ffc08c26ee6a788ebe7bb675873cf9cbb1205f9fc577dd72048bae8369dd465c8ac30a2c5ebbf3479fada90e52f894c9ff5a18819dacf5128746b07e702f89e37a8e00a0b45a2bcea004f794ef7c72f59b545bbe62795ea6500a7ba09a23bcd65103a8599c3544272c94b2265c631643d321912e488dc7a67760edac29c30c3d2e18dd0e9394c6213a55a978307d844b5dae2a3487c7a9d54c37bdddf3203c136c47434419d651506135be77d8158773b6742e638a7f30e286420c417a2d7320df2b6e89ff7b43eb21021f919d9de2d1d5b94f9c300e0fdf3a890ff7b2e54b915beab0a2d07e81a8033c92b1abb05bc0d9ab101f20ef772263cd156795125452ed8040c8a5233a43879ea2a8181c0b6a0559e34805a29a12fb65843a36a624c795c6b12d76b0774676222d7305d1ebcd206eab748429474e96a2ae862a4d158525d7bd814c8ed10473487c373551bd2ba0e485bda31c1466c0471ee8efdd50b42ebee20ce2dc0a578d002b9cbd37fcb6587dbd5265484355cf949b19c5f0a0191338c09ccc6ac9083b166b156d0e8b05b89cb902f98cd1ba09a2e372fa1765eccd353ff4689d45543c984fb8744f427779089c242084fb460b364c654a60aa61a84bb313e28bd7cef4b02acc7777f3ae918d59635089c76461c262e934a188143b0833bcf8fac4184e044c9e40a2502d33619c5fb4d4140e0e36ea92af21774957d12d75c902700a43e73c0534cfc49a4b201d6b2136317748451d6cef22aa34c5a7d72f03f7781927cbf4cc53828ee21a8f5884a13f23a577af7054ca0982cd14c5113c8d98bb0e1d03a830e7ed5412b6d0640273aeb00f4c8d7f162fd1d446c2f561eeb36aa52d87d053735bca33d9fc46ec294cf0bcd7e8c8903f4c53855f949693e32316935a9d06d68c89f91c6d7a3bfb107e6d7177d51bb6cd3381a79b7192393a47354fc5d8c0faf1d23dbb0512ca5680c013466a3f4ef603602338231e6a814018b12730cd35e865c774912ba60adc98406394b558c1068b391dc64532eaa06a2039fade2466a2c4628e5108266b399185e44e27a3b378915dfba8dd4dd36818d868345bc2ce23ffa5ff73ab578b630a542a90a4d3528bd5858e201683b01dcc6fd015b4e9c6302dcb7a6cd318d80c551c4f6707f57ca2b2438db17871b8158d5ab811382aa43b0c72834eecdbcf36af9dee3c156da1b64f4faf6d8ce355cbd1ec096cde5778f5a572a1197d5008e487cc3842d3f3567737b5a955295db760dbd7172685f05c3c8e909a0b105101474ea9624af627ca734af82cacfd70ec9f376f3037d4fa3fcffb599b08d6be8ece191d3da15e7b6d872ba330b8c6afa1c4f0b3054a079c6d54d09577626d4353f3c198d71243d3ba4a207f6f827253ff6e6820578007dd08276ac44482af403d11b583547dc463c3a72843404ee62f8b97adc2c82ec2bf48be80a928513e18f1f8e35b74340a93c450a7e0d7e4b011a414c4b539580fe767f95b6f9e7e6975b102865d72aa2c46a625658ebc00ed5f93e59e6cfffca74de58a59325370601e1bccf1c35b1578b47f7d7353140ddf05fabe2353643acfbd6b8cd39c7e85ca6db83a6c5d9e78cc28fad72964bcb31305b9b0623bdccf5f4ee3b51190df8695d27592005ce7ad7b5893b671299ff23a1bf747e75000426c7e14a5106e87cae5cfe01e51cfb5c790f72a2a86f4e1859e281416bae98004327235a6e2b3c87326a0a2aeb8067057d3965f158af6f7d218f77a46d22a893e317ec815c3140dde04c9160422733c09328dbc95af6e72865eff56324c5614a523e6e026ce280226070a0c049df3e6b001450dadc776b4add1dd0f68099d4f2d887ea0d7ba16d9d1a6721b7d527e667d578b214ed21eb1eb672fff0f74e8403286424584c097a7ca601db90e933115b50bffb22be126e81e95634036852b814bd3b37fddbd2fec426f2323403087a5ecb190a551896c7d10c4a19ca8058b37890ec4118489b751ef7a1763214548cfe566076da6f82a902e1f42695a4703b2d11c648969881035adad5002e42e32706045acb4512cbff0dd4a681cd6bbe880cf1c99c41caae95218ef234796580ba73f746216e340ea4515eba8c82ec776304b5307485d7b0d040290311f1d91a0819681882b5b4545ce5ff68887ec13dbfc97ddf23faf81b9415a323f49c03494d663f3d09af1ce00b04ba40b2e9f0903eea87d2b60783583f4dfe542b3afdbdd68cfb35c8d4490060ceca13fda748cbc32d86c8796c1eda0b0173e85433157fcc582351bee071ae08c67a4cce961b7b4767c5d422e7482d47f17bc313311819a940d77c70555de5cf8c5cc83d32827e10ab95d3419907d52d94d2b3e98aa1f70bf53428af557910a2b0cc0b7b34f8ae13d5a3496fe0eff95e5dc45bad5acb7b61af06df75270e227cf828bf58e440eec1484964a27638d4676845119ffd1b7f01a7ec6f34818d7db276a8f69022b33b5410562f6037525013a3a49e9828989c942dfb0e03e186060fe8a6bc48c90a10e2883cbf2625822e0586e19824a0ac574a65e0089e0b9a0e96eaf0c200710748dae138e5b8f902c381c903117e9b3fddfba688f6712d8b92d80cd07b01ab9ddff0fbc5fc66af6e15e1155a95414a2822d3a36a826f2b864b3e458b3b856c3ab24b5a4519e4cdd413829601ff173ceea17ce1e19f2e7253d1c9b60e2d6dda98afd3eaf64de2f8790cecb3ed635174961956a9bc3ffbbe0e4b6a686a1c2a6cd2547a7548be38a064b93a9100bebfc916bc0af9b6223a1d6540e71f03a234acc8a129b9e5261ef94b64129d38e26bad4222b0154b9cc95c8d31e906b8cbf5b6de19da4ee01c20254f2ee3e6fc6b3151d9ac922ab9dda6642f482b8efaf0429991f06848c9731fbbdf08266aec37b24e45b0a0b0d5153706831c00a091939822e776c404adea44e220cfdccdcd8cffb2fdbd97cc165e3c6703fcdb4b131204fab3f73739186cf0f6825db13c18999627970efcc20293ec474045a3a8610b91786aa69951ed659d49dc4348717a281722cffa813181efd1b4da3c377b9b84596d9e3d003113ed47e62045abe1b50112ccf598005df9fa795ec0a66026d574875c250e41b37204d57693490785c69920a669ee74c9a75c1a27f7574130bb69c27deaa6ef49d8c29180c74e3afba08e6818277989a824ed6d618ddf51be052e6c2ed87df840d9fe476f5a52ceea75f99afc1241c82440edc52cb1931da3454f754c76c49220e111fc0efd271038841777c47d7d84a4ed5b10be216ea11fac384a3d027969d4671fc920e906bf1cd3ca6cfdf18650de34ea2cd87215f653c5db84c67a26a0893aac0c07b1f2e92ad5fe90367c272e478e9c5a35b292da5207391c7e3d2edbca99245042c10a9e261fda88b7a769ee89e5a64e5b2cd88d1c6e11af74f3d11672afd3d635357eedb20bb992e3e9d17497a2a13cdadf6f318283b4ed6afcc423909a2695290a69bd9c3bb48627ac954db1c237e2524a71a40135ba519938fa859c48e8add698adf7b99e525840133916c136e2c471894c64a7671aba0f5026d9a021b15ab61f3c20321bc5895d8540c0c7022291674dc65120e25e3f605f0bec0836a865bca500c19665b5f70ad00728c587e892a7f58d019bea41a83353c4122f44d380b306c19c00cd121c47f505e80330be2f8b98af12c34931c22ea608c608b3312569e218013e14a680e11fb36aa133f51d74bc550cf29c2a192d01e329d661a88843794861441754ca25a4d670a79d127f984579bc5fa04e654862e1aa9b0de2376a0acfdbd5cad3f82fc0e5a854c52cb8a035100ed970d35a21c58a28b39d65dd7e1bfa7d6602d48e833b9c3bb2b2e151c8a1f5e820a8b241938b8c0131b16a5e375d7b691ff49dadfb52d22b6c29cd435faddb48ebb2a85ae470d043d253f7fecbc3a1ca2fa3e57e806fa36783a9c18659e0641718f3994828da676740bb28e7565d1da1694af36d5960059490fef5d2e2090bf181f371af802a9e6c80f942e55300e7df3664cccfbf1a079520d82d4fda4bd8cffe2eafa3dc985af7b636c74e26c6427896ad807cba114929e972c26fd59faa4c6e84956775b9ae5196b891584c363124ca44d9f8845811dd99656217812eb30b6e50d9d945c1be1d675c1fb3c1588dd68a359e15e3fb35228030bed570973582d08cf5ed8cbf3b7be71a9a2005736cfb8fb7f22a3e9b089c1c83b6192b6e08fc4148c96a3504b757ab5102c63b434185ee0682d923c2a9da124ed2042e965f83064314509829bb58395b21805805fca607de7b97eea93875cf44ae6813654dfb79e14c26509b2e53c5f69c4785a14c6b9a783f01eb62d45e4dcd7db5e412aa5f36f204e8242842179bb7b206f999870d80ae2d5d40976c7595d7f95df4535ba5df7ea7bd482ecb5ce2c7dd635a917034e5dc22a42a25033648d5449573e9a8d6cdc8a012420771f88e70fb8cf47624a882d4c10ae4643d242eaa3d032f50ccaaaa18687a4ccfac27f6a368367fd42f5e1b3862748a6d0712ed6807dd43851b48113bf78468961bacc3328b789c3c0f572dc2b3b2c098d3a9336758382107b01930291daeb8460a134f0d36df37cfea15c1a7fe57abbb7281c329520a4d597d0903e500a3cc9489430f6b0a624c6c122fa34c8c7ce1789a2ba42353844bcbe186d3ccf9951a6e9001f5d08a1a694ac9b00074197f9ad06bb0f8025abad288748db0341c91a9cae4bdc581354a4b95a6dbb840794ac323c7add0655167b4ae6fe328a6375c00c92ca2c8f460f241c14fc36f2d30c068d1806b75a7c7b74060708053104ca7aae2b0dac8d37c3929e2909f5bb5926063e9aa994e0bc43e17d287ceae677b88b8174a61ce2de2a08f72a22d79c0a083cc203a72ad8ba7ad1cfb31efa38b8b5dc9a4a532d5bcbac856b7e639c641be739d98e3c3c6ca67d174cfe68b828e0c2c3ac89e93bd58a11b632d49d3655ac933df79858e15418392ec2215317bdb1125664f5f08672b0a24a322e23bc698cc6a56e17484e41663a52702704798a381c8791b52aae62ea79a1df0050cc8a9e68a3f3719e01c999c01533ed644210d5549d530300a25723fd41b9e6a728397974fb152a152d0ef4b58c30d7a1fa4d85c04013fd4820194a0c94edb6359acce1606ff16a14f4b354022972273a8274d53cd0c4f3d0070df7860653f663adf4ef397b3403491102aeb99ef2cbb531ae16d688e7c9921dfdf220b81c4d2b883c26676369d6767a5d169259dde7c7ea3f780c5ec115f62e1793b21e6288594a606c31a751ac2e71775d395bf20359686c912e55108f3376496e68d275a3cfa65cb47e5e38785d35eb3314c28eaf1a5022b175116ded9653de3b8fc3c155f674ce447468ab6b4a36d1495f5042bdb457ed5e10313d3c188eb6d1586239551924380aec34dee2769104fefe4b9b2ec9c7331ee609726074fdeacfc5666b018924c0fcaad3013cdf44dc6f9330e2c9a50abaa61562ecd139d0d38a4587da33b9e280129e2276ae2fec8426e2d2d73bcc109542dcf468cb39b80d0442ca1cc0eb7f34a6bdf8feb3b0d1d1f863fd36c65dc7c4a7befa6c4662212a8970f05712952fb786cf59d83ceb856e864131e68f351ae631e3d8f735391dd1a78c83ac0ed0b7c28d23e66de4edeac53bd1fc8ce7ed2569dd41ceeaf6717f4e38b9cd97b39dd2d96c83fa9a51590880c89d4ac91e72dc57602a384e5dde04fadb27f7b124f4f4029b417577902f2cfe20912f14507b3ec40013122c2971c2be2511df90cb37396850fb65b470a89b9d457b79baf2a716a275047cba73e225f73c61312f36782495b7746e1efb25388737e3a417bb6e344df1fe5b40cf7b9a88fd793b30a5f6c86f2df6f29cf4895de7eba2f0b0dc4484697564d1c8552a5e48c681c8ad8355896ae2219bb7a5189c61b6c9db41a0f694dbe7de4e95847601493f624248af36b2f904fff9bcdc17467fcece8c301bd703a6917c7845938a0d8e40c0961f66ca70d1b258613932e94fd407b3f0105f4147b7d1d3fd08bedc7e85a60d6e8c542e9b742cfd5b7fbb2cb29a3016f94aefc3ebfdd2788c901bd4402fabb05446dc59c08a4d2351277853e888d64919876550ecaa036f3cb4d4e64671e58e8f4df797f0e0c298b60a8f1ea53459aca7f3a2940788c1d5dd9406dca209ccf3ad9a83151520ce4f6b4718b5bf55b73e548d99050bbf10358dc29e2e393ad9d93afe925a75a033d4d86e053780ad254f8928b570da80ff10941aadfbe6444ee67baa8810638ee8bdd45937812ebc281eae0c11fd5c901d0654cfaace3cb9e5db73f7b71b3908576fe492ecfd9987845f16da1ddaf059b180bb0f003093722982ec9763d2591b9f818dd966f14a4a1b1485261059ee4e808bac1bcc788b77b0c05fcfceea8b427219d17c7ac630452b9339578a6e7664bc0537676d19aab8b13e079d352fabdcfbc0c988d96f5b036c29440a02567232b3ccf4ef19404470fade1a3445da1c2a8ec9a26624805f0ea24489b9838eb80b99f48f45f674e7d7be03ba6951b9e163d0f4dcde59799586d2f3aeb2f7382024fde80d6d468355b62f43e8e229667c032f504f94c55670e90c413401db8253f32cc07156220b0a2dc2da4097684279612dad15e28b0ce18252185be01d337feecdfee40d7baa256b3c3de5c27096e2a7e9c4d060d8d427a47819a4f86070d15ac1f9a35763208d370403cb8bcf37e118589b58c6df35a6c40011884756c93411e950b544b03cb16fef98c7c8a328cdea4e25c0b81eedb001f48260461a8a74145ae2b3565a7d4df682bb613590935179534318d83c676c2dabc322c1d3c8dc71304aee7f50876d68cc99028a06f8d419aca0f4d4cf49bd06f398c410e6d27b3023b25613a09db22085fe843158517e73a277960e96fa915a690800f2d4e09fa6ad25b80c8a84eba7c7322b34a38304010ff9f7736b4e5d394e12df6145978c5bba022bd0501ae148d939ef3f61f9e0fc0628b24bbfd1e73d36fd06b111b09109a06f1a9fa62735caaa8b09641cddeab8267caf465f592f482d91a7ac9f30c8e67a9d2781c12cf14e8e1221228cbc2b45d3f622c42546e17c84011a03c05c1e595369654e278a2897e2851b87ca694a5e83aa6f314dad752965810acf5bdcbd468d0e48d7ecda6105a60bec5db37f7f96039b198bf65e840006e0f0f9f87450ab2302c763e8097010c0289b8342c853c3ce44e216747c8e92129c4a8ea2ffc79f02b9a604889d75c39c87ecb4921f5421283c2b6201ad2cd1d722235afcfa7b7dd8383bd863e08770e847603aa4ab6765a3090424a0749d6e825be83b9acf47091530314da5738d52f8d8baba09a1caf5eff515f32f10fcd983c71d892bc80b21800a150e6c485703ac846f1cbdbab177fa83eb1c2a647b26a1f467be1acfc964842f6de64cb2da54c49a66e07ac071507499e6cfe7d3739c133dd679288c46e77cb008b35c16ecbe9ddb108927e3043615ca273c33844a5b5c4660882063d842923a8790b195158f0858a34644610d40fb022060d146244a1023441cd666431060d46ae3803065182fa85c49698624aedfec55883f163ec96115f0d8864f0cf7c158063cc1f8c31f0e74704cfb3610354e16b314fc778263eff9420e6606b4805fe01139598a75b6083fd5be64382e64bcf05ff70e8fb871f0efd78c49732225dffd260548a8d8045ecc68f6d4ab6aec23f2cbf76984886fa873db404bfe214f0b92f64b13ed6ae70d5c26d05c77ac5f2731cb23e630737e425f6a202f38cd0c53618fef1cc6b97115d3ee4877d831b6b98189f4c1897b54de18ffc4737225d157cb42b3e897263194eb6b8786ae2f481f8fa20ee38d57a40f1f32382e7d9b0a1a2df0ef3f8cbaf9e3c8e81f5af1b0754d26ed983631f882f8e10600ff04fd5b2efa08895c4d670bd12618e013318d7b90852e79cf30ac50f43268c4c052fde8933273d8301211e8b5cf71a9f54fa4b8f01cd7529a51412f218e3d71c3bcc73b3f083eb3fbda8456e0ce6fad3af07f36c61474063b5f7a802f3b49867842ed6ddbd01da9f3e68e30e05f9f4a7e782fc703e9cece3d17f0506b1fb82dff91b8848777a1149f3407fe9384a8cad5fde8d3b6634367b970e36ec2124f86766fce31f3be880c592943f392b108edd266a3086da079d3ac38676639773df085f7ebabb9b02dac66245dee11eaaf50bf90a50683fb83b1e0072b061ebf69276b5780c1bda1b81982752807ff86bb5367ed8c1ed2f64324343feea3071273e19a2306e8c2d831b9b88b8b1c1304f7424315ebf487ac889b61b36fffea4189a5c102e27c16670b7c8b5c7c03faa2d31de808945c6869145f0ab878aa491bf4efce3f35957ec12cd2cb0aa2fac5d6ce84db01f2e1daca6fd94807f88c41882882f37414c72bb061144f8f9817993371531c43cfdae2e56fbe290ef7c3164a6183253a49908f38b620ffc3391408a26883506e14c4b3b7cb8fddb085dacd4c23fd1615eeb13975cf8b5436ee19f30a2cb65c0023256cced2b6ed3806970436fb28279aab0fea1c3be30f670fbbb04b7df8bb8fd8cc4ed97ccd3fe0df98b657ff0cf12fca382d85fa1b05bae97db4f82c47ec23cfd524abe71b40513326e28bb2533f713d7d13296e9275ea678982a9de57690e83232c5a5d82f01486e620626a3ece04d5d8820714349d48548911bca25d2483eb91d97881cd62eee1243112a6ec8b992b8c43ffe9d817846124ccbfd80c60c6cfcee7a84c0c5f287c0c5c6ef1aa0bdc38ae09d0e3a60b1ac75d815d612b791b8bd14c6a59091ba9134d8307f492f358c95646e3b4c3a10d2a889795a3ef11d7f39194847ac2ab60634dcfe251983fc6413f550fcb0878a482dccd35f3d59e43bfd2088b13e0473fed061f20c8e92adaa58de4fbccc5345f8e19dd6c23ff1ffbfb7c40e23ba625183fd2c321d267ab97149bf40a703feea2d71a7df0b2ccc909321eab88315378cad050431161c010b1b7ed02374b161346a2315f887b5f0156ef14f93c7a696b189190c8caf8b2313ad74436e3be305376c22264937ec256dd44f2447e6c204cb6d09e68c0f2e47f7ff769887dfe3c90929254bf9cce3dd4fd06c652d5bdfa9d53f6b6d1cf3cf3ffeaa9ac7ea9d5ead18cbf58f03a3a92e90510e6872766ce212658aa332ad5b6d5a4760f5a96e98946cf52b4dcbbacfc9aa87bf561f06ac38da4ee08d568f0f0ea5a32d5f5e00c29decba4ed6db75a954ca761da700d0a6466553400fb68eb43a846b9b4597225362ecfe8848c91222a26e4544b442ad7e552b4a2ab1d07d3d7af80ba8760940474766cca4806000f5021033603461e5fc8d568f0f8ea32d51bc00a423ea3a2225a8afebfe681bb2fa2728a5ee811a080af5f1811ca1524025a89e10596b552854f739a1f1fe3937effffe5a6da71e1f1c3e346e56361e4be5d979d4b53d422ac354d4248448c99229444444444b3b907c69894809519390a6a6261f2d48e622c5d13d5d0f0ab9568f0f8e23a418c392e4ffc307119192a21d3e5a00d2d464ebc9878f1d293ceb098b2885ea38056c0a38294053808f653dd8422a6a1242a46449b567d02c7193eb3ac9b55aad31635094a3b293f5b260a849142a190b9483711cac48c74549c3d8ec6b1861ade86d55caaeeb50d116a55229db75dce7c466fb9cd4bcabc01ba0efcc1aaffa0eab458d52536c2870d0cc39b8a473d2e9eed2dddd5dfa74ea4e9dce499d7febee76293b3a783b9457ce8f83f8d75f943bb43ea8b556adc6d7546ce3b67f41e2928ebfcce15ca72352fad56aed9c4936ef18424704f819675871295d4a24fec2befcfce1079723139feeb3baec1d2ebe3a7e1c7050d3f1c3d31d12342468be0c1beb7c13fc9a43b8fdfdad10f8677ef351fb503aa32fc17c6300f1f5c59df8fd81d461c48631c6e6a0e63482cdf26bc8113cc4e0cc1061aa98822488a310028a0cb014d10289893b4311222940c3a4091652b0e0c4121d62673c495383f4c80d6699325f4aa6692d68c127c26ac6ae583b5240b23b906c6e08b699eabdf51252b4e08d1d297c99f58c760326a3582c03c2c424c423eb2114830d9929922d6912850a519fca83056e3b4909138a99f45337f1e74dbcb9b9f978136fbe18638c4c4b38bdfb83fead94557d11a9418f58e251642256a1e2d978519e3498e4c558fca2d4e00170b0fdb62dd2175f8e628c3146d5506c08498c4343699e485363d4c4280ea970dec6c808e76d706c1ee7716c9880a83e2738389f508cc9a84911214671280d73c9a2caedae07855cce4fa9728414535a623ad394f4654c193368d208619554a954920a6bffd43dea875c0ec2f9d40b892ad5c717d260cd27c423daac6caaac7e65646363b352a9ece7c426f539c9c1417d4e38b0c1aa712a61f5fe3b76e4e0706083558386d7f20112f29d39f404895193289b6d150d3758ee72520d63e890200ad946114dc734cda49de09fcc8818f1919062b1cb4a4a97bff28fc3ee6d9612d708222e7f03c1af864533b81ab122681d2e1b11c3606bec2ad2fd0c1fd47d52a46cb9c9eda4790d23c288265222deb8648449045787863528865d2d0383fddd311f11bcc426d36178b9fd48b7bbc6d860cbc0dc85f5abbc9d02dc7e30575afe5799c788cb32b37761be0badc0f2e52ccbbe707a1f5d960d4595b6f93989ae6750a5dcb88a33581d91f222558313b77b189854c3910a4ba2e1ca49849bd980ca020c4121ad008688eaabbb78b2b2497ee71c41fc8b67e2990639c2ae134e300fbff4747003d140349366c23cdd41208c19377e18cdc811d3300fa7619ee83b3186bc65cbe5ef2beeda8d1f6a7c74c39dcb9d8e7efffe3a13a4accc2351b0b14e588dae339acd66ca1125f274e59f2c0a1576e557d8c3aefc875df939c11162d75efb1a4d146262b020ed4f4f630b246400439eb62f0dba0fef87eff819aa44634b4fbf23022295944ed5129658141b1aa2339b59466f888e94894a323a7dce39a5f7fea256f08e3f18900b0ac676e23822205e7e1aa3b17ead60b40c3d43d31c8942c750268a863665b0acc8f56ce8fad329b331d7b331fdaac9ca9cc9d2d4a1a68c29435361b548451256a2eb4aae7fcdb413f72cf7a31a496c7f5625abe2afcca8ca13a4ebd994ce8466bae154f27c2976e7972c16e9ba12f3f8cb662ed7870e0dd67e8bc6fc450107832a9171fd43ca14f31707292d5dcae483799cc696fc29933ff5a7fe5ba431e6f117cae2a5ba4868ecfacfe045cc0c47354e44678c7e69d75cc17529a534aad185900c41e4e7980fd419adde95de15b0341784a1b9f475b64d6aaa159a2051ad208419f9a9971fcb13ba90fbee1be2c23901f5dda33e9d1bedc239c186a8b7df902b71787450cd7750cd272404419dc7d7b994e742fdd445797c3bcf85d4d714cae3cb79f1a6521edfed3b0f677b8fe9ab3c9dd6c1777edf20a5f4cb59354827a574470aeda24d29a532abb505ba75c5416ed4ab5c4e647d6b470a35542b3429e2ffff1f869cdf5f3f615bfe5c552b0881a6562b3b0269a141370178a57b0b3f9c956248ef833f89bdb91cbbf8cfaf7e0ad2af23986175a47bb1b14ed779380e8821e83e3e07711e8e033a049c25a8fba46859d7d9534ffb7050a02e684f9f6fe6a1a03dfdceb2ff1bbecbab0d56d50a4d94c49bfde98300135af68021419c967dacdef1aa0342180b7edf604f172bdd098cb374df7d42343004f7c170fcd04393201c07c4e79efb8404f942095150941f8efc5697d5f2f7f17ff088f6c02cd915c6951696d5d3c5fa87d3cff1eb7ccadc4283fcd25b62ff0e61f2822d3c1c01e28a1b98098a5d90d0c04917494d68088a6fe3b3c26cac538704c5089c5e7bfa5af6e1d053f6f579645f9f7efd8448a1dfe9eb8743bf3e070911228587f6a7d337804fa73f7d2180e1f4dac7d987433f216d48d0101c66c8020be27e7b7f0880e13ef60d024b685eeb5525c9c54283b05417363e0be1ac2c2a79c9899a05942f35184119828aede10b192a4842850b26566e62b7a7c002ca1359a4f0b0e2a228e9dc886eeb2e41f68496b02305d683dce5a41976608d41c54c085e9f9b09f1f81a1cec981b9ff668302e09f1f8cd6b695e65676767778f2dd021b37d042932f6a4013152cb47d6f7260f39dde7ac92c592734ed98216b15dce16da55b5e76fe107907659b66c1ff53e2ffba9ee09c00b6c7cebede02797faf0d1902a9c07f28e4f9f1d3ab23bc1823daef70cfa3bb390bdb5d6faf84b3fe9e4f4f5f48ed799459419b24069421589713aa5f7f8e0b07139c98819777539c90818356cb55dce44707451458f0f8ef9e54a3355c210d344082b33084105352421c5152fe052441738bce81e1f1c2c6ec5a52e271909c37dc12e40e208aca88ba22488b4a06c91658a1530636cc0027b01d7f4cd2b323051d0a411234c12518f16681143040928497429e30aad8c3139d3cb0a63383962840c9a1cf170450c53725012028951156514d1328030c0b4a28c232440c1174fb8e01a74a952832196b018630728c66092c2063e883063f186218888c1428b27c620a2041718385102c6858628747041360600b3cb901330499285891670f132c50b37f0014a0d96b06287335234597192820c323ca842636d97938c7481822a62b5241991a2c81936dacb494692b8f4729291238aa4e49fbef5646b1a36465d000f5d4489dbfdd58ab9cd5ac00daca42237dc7e26f2ed18ebeff3e2c008a805a54e92e10637e462676ec863788999e874853a37c01cf433ee8277669e7ff4e4ff0d39ef461d22b0a18ffff42410eefa579d2f8a6183198636c60cba0a2f9a2b61470aac07e5e52419763891608b959931c8482c4a2b1f1d2e8deb97936408ac2a2cc6c11db25aed9755e30a96d6dda98149350e4c39db25db956594c179dac0f5fe008dcc33b5bb751cff465147b6fead3d14fc25733195a3025caa863558a0a323c550a3a9c289a2141c9159c5a171ab9ca22356a06543da72a4495f82eaeeee2451093b52603dd85d4e2a0ae286acd80976caa877edaedb19965e4e2a5ad2dad74a2a3aa2035759a7f460b3cb4945b032b65e4ee2a129051ece9cacf0a92b4032b3267a9059280a6a7024d81ce2869e8248fe706badbf3a536badf5c3d6eda99f8f144abdc34b95c99e6149d1f4b0dee12c43bdc3ed8304090e3ba6a8a2f396abad1e1f1cd5b250508fb82f4e6268711ac2de5ce6a204d2905d5de6a204956c0a5b73998b124168b1f632172592685e2c8dcb5c92481380cb5c948081d2c61e59b694a4269404008d0dff46fe71ddf820fff88dbfc33f1bf3c47f55153728a185097890a188111136a8419a1bb0c0224550fc07b7f8623188c01ea0149a70fcc5e7461ea8dc90b100e07a73fc1c1bb3b821f73e0fb2d10f92cbd03a0683c17408bae147ee1ce2b88e85bff098323e378c4896441cace0c1e106d79f6582ebff44615c7f3087a3ebdff24992c3f5074ac2c5f5df2154829b340231aebf8f26aeff0f0c6871fd3ba0c40c1812493ab4a0e887eb9fb48394ebfe0476e51c821523f373edf7226268582c797c706862e6ba95b02e319c6234c0f5b729b8fe7c0391eb4ed43948c8ac90d0e0769208a8a027d858e7e78920e9c51c6628e3491008455a58f142c599334b58090a62022a452841c922c491a0eed3c541fe660023ac7c1c965ffd85c31f8e0af3e93bc0bf3f183e18a4f0e8f70f873fc26060f9523e4bfe22969e252c3782b0ce3116856ba72d9ab0322422be985937ca4990b5b4b0418a3b2f27d97014c4d651065d198bba9c64c3093cb8cc858a995615dd3ed323d3dd96354550a2d56af94edbd66cb55aad56ab25db6d2a73758a2d4a9b0d4e6e777039c9061a6ebd9c64430c93868d75543638c69e9efe421bf6b050e307eb5fb3d7de9fab1fab77e747ed8c5be79f3cf99a0ebeb17e7d653faddefc8cf665eae9903f9f597a641eff1e17d8d095dc7685dd74db15769aebef9204261be7eca676c5bf118485410a8fece9c3507f3e0c194700250b8394f830ccaf0f03fdac3e8f8f07fdccc8fcfa46bcbe014063fdbdbbd9f5af60cb81887cb71b757b998de2c8ffa0ccc3911f0701e5607530ab020dd9569118bbfe9571620c9a5e13cce31f8d825c892fd9fe2e7e8c2dd9806e00b2c166ffc16c974797fc39c3c6cc0cfaf0cbc777e2f3abc26030d85110bf102c579db23de7d7ed2bea5fd3a6fdb6e99c3a577e2f4cb069405b4c76ce3957edca3e9c218e1b7f94108605c2ba92f54de9ad5e4f83b7f59c1552dd8883e37a737e4058577e37a4d28dd76a327e383d59ddfb9c66f5f471da27e79cec69e6aca0efd417ad99efb0159299ed0d71e47b97af5c4f8596937193a6554598bd67926f286b0d71e80c8223545f75e335a16ff60db60f3f65e5be6a5de0cfae8490ac502062c355952e783969cca4c7cdf940ad55faf50bb3979fcd7e7e56ab9fcbcc5b651f7299cc68166475a7ce9ddf0b1387e7522da58c5ca4d423b7e22c8f159d73caaf96654b29e70c5f9877fe0bf2ce0fc7f52177c8fd8c089ad1effa85f2a9cc80f8f329a79cf3935cad5c4d79e152fe6549e99717dcbbb8587a4f8352ca77b70df2bb4b7777777777b753a49435a2d8505e97f6c331219c960b3aed75fa734ebabab299482a1d09a01a45587e81be406f9464e6536ef5ccdf6aae269dd36b1672d7e909f3e9d3f9e1a86e01c88857da7c3b806241edcd654a595d92b9aa83c5fe4b973537deee02350f91cd9f7562dbdbf11dd62f1fea9d762975e6a434cb217b684e4a59594e8eac4321de10867a23d34ef1743a69dae964c2111b7e8be3ba0e85ca5e5e27d927240441dea9d3116f372b86d0bff5705cc775adaa99353534502106ba0e85e294b5e055a150a84e472a956a96b5b6d3412f4ba5aa61a6cccccc91a83b1d7d57363872d8743afcb256ab55b76af0a663314ff3ef5cfec20ddcd8f9d015cb29cd202cbf0f49979f0f3985d55019c24d9a659911a9d4775dcadbdebba809dced79ebf8b9ed936084c030f8cc9472d2e6bf799c2c3f8e45367f57697fea3e7eebe3db7c642c6e6c517163c74f40cee3e01ffbf16d6aa2a41da4fa4438c2f2c66d9b90b358a947fdc6fdc6d98f9907f5409dfac27851dfd6793db69390ce3f8f061b14bad120c740fe29a964996acab4317f503666044877af3104fead5b36953de7176377cb6e325b6d17c75adbe53de77bfcea6dffba3bc9c63aa16dc9d4e3386e7edbb6c928fd738f5438e56218a573d987fe54ca3be30f9535c471d93e04194822a559466956e9cfa795dafc4d6d239bbfe9b6b9799bb7d9fee6396876396aa434fb9cd8d8c41acb9849a1721e3c428a292d319d69da8225e9cb983266d0a4e9228d248b59466b462355bdfdcde6b58fcf31e0f4f1859c381ddc9fb8533cc54ddaa86169c62855a11289ce00d9a1c38ad96965e38e723445520f42d070628b0d5678f872134676eccb65a52e5f6e68bb3cb95b2a46eeca8d7e8ddfaeba92e5d7a0ca4d0b86c630dd7011c6cdd2cd1634d0f0e18605375eaae862e4850b6a14d5e0814610357a00e3080a90d0a1092d376254f004d20e5cbeb8d1e2872453a800c20a1a5720a141c48dd24d9924624a66808285111a5988d1840a13256894404aede54bad4e3f8ac532bdd30f3ecbccedd78e6c7419733b2e91c084951f55d25fde1c5e5c9a4c1dc1b8dacba57665cfc43facddfa9a273710b38f32b1b160564bc10d35782962098d11dc7ca1c1440d1f962832230222129ce0081a4f6ec8383102871c680c7183457cd6099fc60a6c68dfbac7d823920085cd1139d9a0133664dd9843ca771ce93efdc68df32b3273e393f0840d59d286172b3912a4b0a18c39e277fc7a6e06e295fd3a39d9ecc853045a520a86aef67fb754fd2dc26c84aa583f6a9f6551defee17593dac72e47d6a530447a17e9ffe09f46d2ae220bd4af51c98d4b8e6210321931d0f67c34583f7a2d34583f165c15ae6efdd0e7d631b7be4fadde3e3afe6a99f65bff0ffef15b1f489639e17ed5f5bf5dfeb57eebe3de895fb52fd4b9f5c68d4666804982058c922ccedcce3c0e129253851005182dc1822a930f21f535178212f32567f2982bd9b05acb62fd87a0ce2028fbea6d11012cf4ab4700d05821fe71ddfe1e52fc372a297b01eb6ebfbd844a7783618405d1296329f897f0431d3056e676fbf821d4c3af7c1d7ea54f1ba0dfbdd656438bada185bdd65f42bdd35fabb52cd6bf6d755fa127f6ef085944b1440a92132a9812d40ffa4b02464384210393a2055150bf65390848d847ff8f7ea1fe1e67b6a50abbf1b718962f7299a36a05274b1c29fe3c72257ffddb70b13ebec7f8a7c687ac5b437bab071fd6fb0383f143bf9a92efc4cf9a8a7e7b4f8afdcca872109fc6673f8419981bff66553ae03b1918d6cdaadae47c0d003a780f7ecbaa745fabb5dd57f1170755eb6156c5919827664b48f1b3a6f8d952c654e3819a1ef9ab997c273ece737044e30b6d7caae42f87d1267fb991effcc02e8f82c1a276f9d1cd17b26e6c946eacf94256cdabbe260f68938def8077f08515005f6873be90759bc9b7c7f9c2da1c7c363c7fcf97fc8b2b45c1aef80e73fff87e847ad60ac6bdcd17b26adc48e54648b584af04204f79a15fd4173a98cb79e1dfd091ae1c0ae593501e51a2d0ad085917164aa32bab9050032bb1ece897f539f34c510988890d1dc991922cbfb80b145c09a28b33362802f6803263a0188232030d4c303b9223f50b15f3d89876319a22459ec6bfdce866a237875c5cc2550fda16b50eee386fc3a259b971f9650aea11292326886ef8494cc4906425c98a5f4eb2c2b4f2ba8b2dfe9c9397fa87223c26b2ec468179fc99397a701499e0c85cec2a0bdb396244817fb6d8e5e86e8ceddf5a26f5f0a48618db3fe7e48ffd50a67bb28e57d7216f7b72487cfe7a26fffc6ef46ff363b0416700ce09f18b43ee77839b39766024a4e93a2c76920f0e2b27cc0db93bc1dc980fff1ffe423d98c114169665a5944e00a21ecc48a73a3a19fd7c7a5aad956d174b297d8748ba0f45b33341d3d873a23d77ed446b3518575e438ba537b44058a3062b5da9e27277428ddbb1898d3f3273cb6db766d317a52526d939ed0a6fd8cabd52ce8e960fd82ef9fe812e1cff21d75faa6a83ad063f27f4e7d7d3604eefe448faab7ed1d60b84293e2508b1c0444e995664a525bf39f13fa907a31b7364777bf1da7e45cf09fdeeda097d3e41c6707d7a7aa7a3a3a26614bb72943665adea6fb4cb513b5e5a65bf6496d3ae1cca55da3265db6573bce0fbf5dd2fb0775ade5b8e0f10ad94d2d63e5b9f7e8eec6b263b13a20f50c85d9ef214331cb6c83cdeeeded46bd6ddeefd85ee93455d4a29a59452c629a5c7d914f9e7c68fa5ac16749fd2a7949c6b0b388194ed6289924fac5edaf8f117ca0b8463357f40b8cdb9e8e19cc01f3f7e3827c40fc784789b935cf43696b3fbe37a8774ec285bca7f736f29bde5877393d2bdfdb673fc146797cad9e5e09f54b6e7b5cbd1d30be96d996267e61cb6b935367551b7fdfb931a8da72d2eafdd1cdbbddd679572669e799665994baf21815c842ed1fd4b419194be748d63f94ba775e6b7cdf7be9ec92ab51ab3bad5e72dcbb44d4eaf34db324a6fac6416dddd5d3e9f32cf6e803924093158c93ded2a1cd337548ac19adfb6e95f53b243c12f176b6a9e7b95eab9865371cfa99e5371a82e5e6953a88f99877ba0e63a2f5e194fa08e0d33744e71480e9ed9dcb29981e0c6f7483f9edadd38aa8aaa166c4172d49fbfc5d805c9d1bdd6d3aeca60ea39f5c2954e6b767a0ee26b25832954aa0316954249c9f7e4c5db719b74f9f1e9a43957cf89ea250a12d635d572054bde2eb52ceb82e4909f7de5f82715f29d13ab65b3fbacac192cb7a3e6179967d6764d39655635595f52aa519aa3f15c6934e3b266adac9c4e5fdb387b2b17a0aba8b44d786435756848000080001315000020100a0604029148241ccee2a8fa14800c76944478581a8c835112e3308a31c620640801c01800068888cc106e00301c327e6fc923fdfb2db72405b28af7b174bcdeb7182ed36371b3dcbeffc8904215dbb9969d8295dcb9022de9ce4dd0a458b3d62c9941c522d94653d57a8d29bfb57b2d9d5e17b1e5bb7297b2722dd2b110d0c8cc4f3c91c0afda3bc5690bb9f6445f6b795f55291b21b2e0c82029aa0db11a6f7d4c862fa151240d1cdb7dfaed4090040cca5d9256dc93e42caf4183d09bd9f7e48049a13ab051a5a1c1ef9e768ad5ab748d38e3d1e00b59702250f35a831cb3c7652508c1555104301f7483390d60d5041c25726109dc51c9cf0a5d8d388bd05aea68483b78c03ace8c9671c841f175f3657feaaacacbba8c0df92deed325d0eb1a63fa33c27d5252ad4b6cf951ba4ac9f48a742ce827b4bb282fab2ab67c97eeb2a4ac4bc7d49fea5a978ab51253f1031b329f05f567e5aae5e5aa8ea9dfd3ae45e9645d2a46f251bacad2b2aa63eaafeaaa4b25d64b4cf5292e65b95c997c2cace2829da704606f67b9f094c884e458b19f5ee38a357c40c792836495c6ab241f90ba40857ce954a4e88beb2e93bef9aff843412e9da57c1f5b61b894b15ac29b343aa8e880457c9919ad69e9642ab3c2ef63024e84c6504fbd7290c4fcf327de83c944731feecc889444f7d343c1346e6d4e7dc2d5341a3a5cf6502e43da39ea9beae662badbebcbea0d8aedd46b5c6efa03797bd7dc78b9a4d385df359d2543dbcd6e3a9be3e29fcc4bac0b562e5676d86d8dd10c4737e22eab4a370f39b12ee50616f8ce2132c2f740b1ef794a3bf105557209f4f0cc8a44e5341b90ba53a1a7e60dd77e5f56456b66a92c8ef3b511752f89218528169685b55010af33b99ed4ef46db6c65d987b2764e4dbd9d525765ecfa5bdd7589c47a2406d407c45d9694ab12abfed4ae5a5eaf8b58920f2957292d5765ecf231ed92be123bb9ca0a7f41776a03cf8f27f87da1663ba28824182276bab9da3cd558836370e6e1222219eef5f3e77764741750052a845fba2a43f0be24426b1c0e78e5252921e469d90a49724762048a1743887edb2a4d759def3e89b4a9685f7a43a892be83065f517f8fde12d2a961ed37fb962d652bc62db02c0901187c020dd3b0b981eb87c2228dd5f344da8c6075625a6757752f587b8bb9621efe23b1a356dbb7f7e9466efcbc9f68504be454950642cb76742df9af4f86e7843bcbb548d43640e9f9e67349fe06b43ee32c924f185d4e6c59333504f79816c63cf2bcb8c030946859b7d2635c91894cc037d0a6c22b5491f6488c9d1d33865f44f0cab2ed5509995f84e0ac75d477fbc1c295ef375f7a8e0c2e5d4daae590b7dac8557f8dfba438dd744388173498886b6a7f6992496d09896e2f88f4a0984bb4493c920a268f67a988b77e753767bb4067c88d770d0ae46c4785bd4c5cda438142d41e8eacb3dd7eebd603ced4fe195a951527f081ee902e44f623e1b0180e7793cc9c91ae4505895b266744296a91c36c1f10393c2d8308254eda95c9ab7cd653e56cada99a5c605b173d017e93f7f10a2dc0e3f2170424ad9e38870c09613d9034b6bd0c31d824c44d80ab46853b8dbdafeeb1e90db6d9486a645ae56e3ade67a4a62b5d57ceffd80d54f8d1c4fee520ab0d618da6a7211aeabe362836e5888af4f60dcb0d700cc9155ddade27ff986900a32b80f489f7d4bc1ef742b07fbae7dea4166b470226175553bd6bbf6e7f2746aa4dd27b916f4375c9b72dcc9bdf1a0d1323aa091876e751053362ce46faa48470442bbd9416b22c430a69640899ada547b950f07fbb86789a40711bbad2a72aeea782bf3d0f55a7a7b0fd62225487595bbc5c3de6271a89b54678f47fc50cd70860f30c4a29f8f7c6d4cf1fe7edd758bafa633a463c742269c72975cd39dccc6b2b9b85621c13ad48c90a20c4564ea14117b9b7fe4f2ca348497f5cafed0c8851ddaf0077c3a2f5a675965480a7f82e5ebe6924e2dc122a2997ba847df4cf5d4d3bbda922cea5eb3dee80751d9ac045c365bbb52afc7cf68e10cffd943831dd835588a07a4d8dafd75c8cbd264cdb6bd64ce7d67d3f6f725c83e52fcce9bc9757219a0100379cd519a6b905e2c24cf7ae0bcb625d16bebf23aab8eeb90f9973ef4b187876cfcfb77cc404e7433690b2aa003187a5e8cb2639e181fd4919806132a3e6b08574e4a4790b0d8146df3702b8637fae67c8a1d2e63c55161524fd0c4d751c29ccbf9be1d67970729bbe9c820f89242d0b549478100514c275a4fcc7128fa6461f6f8d0ae875fe70a47bd520fdbd1819ffb7b025c0872367b0e6e0215f61d0c48cca309aa4775984627eb6c4d3cca5b551c86e4a7a18de94d7847dbf320d8a58fafab8297ced95cdb0222e95156e1721381cbe69fb3b3d5a5f807988b52cb5234ac18b9e4342732d8e53da89c162d278cee1a704e4833b0d4536e115270b4711bfa026795141cc393a096421567273beacebc1f2a8719998a7e0f6880bf70dc8413195a41d546d4234732856380931fa3e5109d141f1296c24768ab3e6c9eff9cb2bdd41ee808a463a8d5aac17b1f794a453912c29789101552edbea4f14cca033185048e6a3e01364933166a72653cd1ef05b3807674b68d21b0578b037a94b3fbfaec0e909dd93484eb4d410eccc5f4f731f68d49c9e2d59a4e3fd361331aae84280389b8985fe379d565cb305ca672c903279ac4617b3f175c15148edc21cbd9d0cc2624ba0401c27cc9fe8b33f9d05bfc8eca888fe914201020cf6802e8d317fa971484967536ae85ff6eb025e7593060323434d4ceed59b245c23e0b9995674c629ef4a76e90ea69a6a80d381952fcccc2f2a93a7bb90fb69e3290d7f7b0372aded703e84b1f5db3b650ade41a2f4a320cb7b16c8fadbc410b6b5529028306e1f58fff3b2849254cf18976252504c0e8bf9b1cc9db245aae1dbd295bd15b1ef18408afbafecad2eb6edad67789e47aaaf82bb90533a4e25436c583395446cae79deabd1ee338f332b49d24c5cd100ac148bf2a998d849ba0326276a92da9f8dc6dae74a8ca8d6500180da4d03320b41634712486613116942bf4ff93e7645c61b668d9782bec6b00c78a4277362d80c667fb96e2a811041d1288b248a818efe58e99c18c18b557662cf2431185b2e230572ae39e735f313379c493e2f63fe766aafee71cee0983e10c80ced84bbf2c1ed85239187cb2587680611a3ad55f33c03dde73ad1c5b57a953c0ff1cc37f5369e99f070dd4ef29ce60036075373ff4fb725d2d7f5b42c89d8c7d5437e70027eff08418128e1218ee50b7891f05750d59b1ec137ed36dc39d3c0d964859a427df7da53d0ae56eb40cbdac16a12d9ed4e964e055e4f64db5d06ca3680e5b962d55d86fb9589093b27b4d5fa92ebfeb3fbf6cf23e3ae23db8b9d311f6579939368d61d0b764d52d7f8c8e29bda41d7d341c4cc770ab8270ae398a2eb9a63bf0c3ee2c58a265697c9e6b6be7c650a05aeafb3021c50c4251214563f68fc0914473a0fb7b7c93a66cb487519c84e179af9c31e6842b1d2b3a0952b5a217710d8f59c6f485a86691d6b48fbad3d85b74cf9978abe3714d4c83044a9a1fc47c080818418e965282fb820aac8335ae0102effd317661af23137440291116b15b1f72fd11171415b89b85dfb1cd25a401b6dfe50f9215c73dee82dff8437835a6e26d4c6400433eccde35e550dd5cf9506caddb392651541fde529c99c9c5f515324725ba8398a28faa79c20715211326ecc1b5ccff411734dff2d0243a6be5e79b205b6c32a40dcdaf0a35d7756ad117daa58683b26c3f422e7765ba3f4aea52063c97b217ee54fae149288360f23d981431892e445c1863a1244d565fb89f30cb1cdb721fac9f880e6fcd2f5ca9c576f7590e366b48d3ad8640303c3941e400c441673976d3a4f57eb1dbe6d14728f1e3605854f5b4239c86480d7d80607d812582b02ea97a6368e15191c9f55d4b981ae0255ff035fcbdc2da534fa0dfb30f1439b7a8833a6c1b87910b41a3c01a211d1cec7acc5d73a05dc8fc1fb7093aa157fffcf028a018c433c60e552126bfeeb1ab2a2226b7cc7f14dfb84e524cbad687ad7ba000deb0b1ae7f15ed457598fb587bf000a8dd634eeda0729c48fc5b44fb0844ec05ef2181fd8ab0864df4e0276b6331ee5a469db523ff668220a31d9ea59696bd4b8ca7b9462cb83652f3a1c23be5dc702a93894746d32788523279863e58725f500fc055abbcda3b0003388d44f0b21c1b300cb53e33580cfe82c60441c00b0a9841cb4131452120be00e9fadc1b91b9d39940fd977e0c45f8a81b980ad6ca013d45122a7be7b3040a006896b682d73a4757955cf321b485f62c19d585bd5fe0eb830dddbb4d055c845d510e95d31f1b6a3e05e17e7903a9b9efff05614e3e851ee7e762c2e533261d758e7e4c6a8e708f663e97e291bd90c1048c909922c19831e75dc8254683a1536eb8fd86d756d2dbf9fbb1ad598fc8887fe5b07625f723028af23b49f90d74ac4dfbe2fd64dd0ebd1bbf50625c44833d40fde5edde21b8d9abe5325d8f9676c8fe26a20e24a23ecb5afdd23c84c9abdae03bc4ccb819b6a3d9be07ff1511b83fb401df4f5673cc6ba746d7ac880f05c7bb3618068b06f62b682f141263b565db72579cfc289e5d29785b18c5e301e0ba8c9e788e8f9d2184f83b6dff6356d0abf6f356409ee7e5400abb42fdc2ad235c9408a5fdb7fd1f32a0ff497eca0da1a4a11841947600ba43a3d3947a53d8bbed0a01012653aa135f55f31e152a5b1882bdf393a9b21e71ab6afcf83a9d13aed082412e837bfb2ca3e0a8729f0737a282396c4b351bf1705fd74cb1721911698e6d271abdc053a831864203f7e06f7d3a03f878993daad1e04f828d023606f181de7686f186ef58e88dd1425f18f8e33b1993525fb1738e33812e65f7b421d5fcd924cfb73708e6b1d78ef7f01b99027923570561310372a1ba9c1135836a1da60e06485e4cbf847832d02394ceb8804d53cb9fbf94e1f12f7d8365d1dbaa96d11806adb8b9de3ed00828c68ec4dcdc67bca835dfd0ce23517aa5b0d93b004c4c91641b281672824366a471f80a5bf98d75dc3fb0f23119baec9295cf0ab7e025adf6ca1930411ec0495c6d74ee6e40894167ddfbd291dd2b9aa4146aa5133ca7c4021dbf0c00b1373c433a434cf68b0c9c03ab48325116672cd5c5b75597bb56e8d545fd9c84e7ab9129afa33be8003663baf5435becd8afd2a5eea4cac420fcaa26b1fbe0c596d9e55412ed37b1105c65319ebd5ce5810d61b11f45c0310483045f962af3a5b001d2a25ea50e010b6623a44eb6c8116a505b29bcec44880a077ec75499c2da010c9538d83438d3351c57ab8385b60ffcdc1d4158cf4019c2a69d5aa1a76608e2632853b9817fb46109d75388c28a88160cbac846432ddc14603e78190531653a60358b726abe0a77333082ef7525ae0221b980c99547d3860c8f1b1bcf1f5e684170b9a630c287b95847262ffeefb3e2e62900034f6142942f715628712c6eda816ca85a007642b702e4ae4514bc99f5ded2f95d168498bd04f0c0cb29b3d2212b373c42e31707f629ecc9d88bc053a46fe9191f8a5f01c80e9b640b2871420652e52f9d348d3145c1de2c3f307d932c25ec27225568f8045cc3f43c7d67632e5d6e7f9fb0080e7aa5601652882df0598093652d89edc313225d9f5a5911bafa06aee181750b3aa69c65d8f7be7ac2706e3e2367e3443ad6f727b49ddfeddfb567e1f72e082419b5c0ad3ebde9c229e91acb04ffc47972370e9305984238919862463da484b098de355fbd7425e222ee7fd66da18e0aae5962a5323c87c0ca2aa6c92e9de47d2444380247781f14ae8eb08cc0c74577589335167ea5112c3109ff1b13d33c5e6ce31f14116e815f27b3acc5e7e1d283676a9da26b2bb9e1105e19b289f738916dc5d283c4a32e5ecaeeeb1a701d3b426366d895cfcaccbce1c892ec73a103c5c39e6ddc09b05aaf7c78dfd6aef740167c16e165e318b9fe5d557f5981e6a3f33b653155374a6a536b0d694f2ac39926d1921dfabae9892161b55f2e43b05422341d0b78a148582ddf37015d2422c69427fd39b8c5f78b20fe40e37a541fb260885a5b596b2968daa6ec130de97d3f655c3152b91c4ad60dab17b57603f3cb7a232748f87f0469a10ab441f68fb7a1221fc9d1257900fb682a2cc2b4405f345fe7c89877da19707d4eff3c91ea6fe57acc9a38cd9c2eada13760a2205fb32400ee092999d24c79542585c326ae3d2c0380b0be11fa1ab01b7420c582aac8390890b9b643ac2f3cc701318cccc628765343cf9273d1db2dfe536844236ab87b1e71f1b155d435af88f857dadeabe53505df61da70ea7ef46112330ec9c4485c0e5c011a23d7d1303873df1981ea1cb34d23ef13b2170c8e9549acb9a836fd81cfb11931a19e128f78600e7622ef79fac3c1a8551f41aacac0f1ca6a030100671d79a32c9b1ad0900245234d944e3bdb80e949e5018676eb67541f9f8be673dcb3ee9f5b77addfbd07437efd3a0433a44617972cbfe99210563031de5d993e36db8139009c11a1bfcf47924a10725d4d8a2fbfe93bebbda376e2219eae391b7a5f55699af7b4ccc78381292f1898f623bbf4dd7f372cf5945f489dbaeeae9f77a8c4a4770fd0fa18e4b8c3218b421588aba2506119d1e1c8e3ab5602e4166d09a304e6105f6c2fde3c2409383f7e0a319ddc7fa4b6e12996c04d37391899aaa3e42534e6de53303a6693b744c52844dc223d9a4102619e59d77705d3eed7185589fb398401526eabfc303ee3446605671fd0c012bfbb248689a2e44b0e3d974af3af6745c6cd46987ce8ab8b982f9013892210ce5e3b109e318d8675c875c5f42d3f04431ca16a40a77f821ac2b421eba11641738cdf5537a2738a4d98b44bac3b86dc4d1f436a5120e01300b68a62e0ed8a5c561044b661eeed670f16822e5be5d2e47d1fe413a304db21b1bfd270cd3869c93544e34068d0710b2af14039f09759698e7bef3d59f4041295a8898ef0edb65aac6c0f5e903b8901ec97ce1e7d3d63939baba7a9c58aa64cb09ad530dec7c892099625762efdcd78c96b1f1d3aea974871f07e2f6b91eae0702e221b3237d9e1a51455f681891bdca04b004d126e761b39a84a3ca089e413fbc7e41bf0cef8590e61f171b57517f4806bcbb9bdf8aacc402a60216bf5f3dc06a3f548f947426b4b3fa32be8251801725c9f289781589a05161437df5fbeb80b4888bcc7de477fc79e4a15842f12be41e7e25d2365ada47492271928c02db5bf1a74850381d7e4ab90802b70ae21c7c6a0323590b01006ac420b482896d9b49c4a5269246ec3c4e11507075015e63cbfc7f620a36b236b6c960d983039b1895ff5d06f4238d8146ff21845f3927e734ecf6fc24377cf8c6575a28463ad75ab529baf0ac6c512271ae5badb669bc628318159158c1bee328bfcc5723f027cf10c3b2eb1e951415728fc42b404dc0d95ad75f412b76eae21bef6c31b485b3ee8ad32d06f4d150b77ad0c80cd637aa62e440abdd8245e418149c4bddfa03362e3b1f244ab3de4f16a1ee87d64d592567bfe1465a79fb834466407231bcd4313ac00ea367aca39fd176fd628bb7ee89ef35faa02f14e94b25b452089b4371f1d45bfccd939379f5d64537f293c2967f5f7c75aa220363dde89b9cd2501443a0daf34a4b50b5487b08de096f54a5e30421ae4150a0e1e4de46ce60c2d37b3c632a7a0cd6bf0f03c6bca23f974833223386d510070b2e815f31b931ed48074c169d6a10c96b661cc0cc55bcf6ca7848e399964f542a5e800bed707380fd90684d5237264b739512110a485a749756d0cde032af7a3d285540c519a8a4d708feb2628f1ae02ee982ca409a987f8b746897e8922547da32ddf650faf38e7f6f6bc50c8343e94efa76a53166f11b3860320f7dc184ffa692567844d56e3c5d1ecb9d4d5ba42f286d54aebfbb0e99a706efb7e856428f5ac2b3c43cc95d831beaf684e5ac1bc5116e8454b24a6d1edc5161ae0cfe5a6badc023dc003efc5f88e6efac8e4152e63b57e877133ac938b78b976d77b65cf5784a45df4202e2027f39f3ac4f9aaa47f23e6c1eea4a74cfb46059dcd9fa32576256e0c90137a53bf5578636bf4f4a5f4cdd54d52fec6d7d1f9de475ccb1ba7e356feb7b787298438eed4a04d8c31ab998821408914d2015ee854a8af99f077fb1b85ba88d3a0b500ccc17160152499f12189f7b63f04490904a13609747e2bd48a21977fe79a4d1db6cdb6d3c4c9270ef1b34884388967e0fc0eb15e5269269ca973a7d041340fc64665dd3cd348a6a0d9dec4cf3641691bae92b91ba13bd734f4297df7d7a444157582b5087f204b3c02cf06667f17791993b649ef548dfe2234a84fa6e12537d0d2e346a1c10eb61213ccb009c4213b7722a4ed215369152c79b36acdf651f16d943e815532ba95403d6e0db8f5e54a34efa22b83ab16b086a13e678bc2327924e5234c3d2b032012e14f64cb89709a0cfb6a825dd9db83b41e26eecd96930331643a051f00a396a0860691deceb453cde7751cb0439993f85a1139ad3c69abd4a65c7f83363529c36079e6b7390b9eb3c427b97cc966e71e136a5e9f91c690ed2143ef2dada92570083181713b877c97c6199f071e57de4d520af5ff361c6d16813245260a2320da217287bf97ab71ca6b82b016fa1bec95b7a5a18d0427eef10a612581287d7759a1386d6bc1fa64a4e3513c92ecafd5071e41439d74b7834157f1068831e867cd0ae561530106fcb278ad6c25fd97831aba73c7cb305f2f059577a7dbc7a34a38d4dca9b00fe405da7f73363bf7692858dbdaaef289a997ef65de37ddf24f013ba47009b5ba161da95d1612030c60b02a948b32b50a2a521fa07001bc5037237330885a1d6b8adec71049a3bf98225e029d0be4db93a356b7f2057da3beb161c0fc28703a79d343e062084c3c075a870e38df2a3262093f77893ffe927785fe547738b8a5673421158156d10ae31e5ee0114000e247cc6f60a75c8fd24c72bb2a041318a1f7dea781fe98a404d0da9b66f9f387ebb64b0dce632cbbb86c0124b698aebe5e497c54f3763969771a8817a4b04c6d85c459496935e6a95e43860da7cfc51d7b5da1b907ed34e9d18165d0df44e1e98093ec5c45ef0f4fa559896d07bf1b8bcd1a10d028ada9fde79a2a24a4083db9cba0a6c54841ba60f9eb5388fbb58e48db0667a7149657aa9021b2934ffd42d82da928eb8eeff8f6bcb8f86193e41afd71e435441c5466c8c14d26bf2d51295f3fde86effa3c92d2c01364b7229b75e9c923f9a65b1f648ef85782fdd5385c5cd64e82d0d19a4317ebc013f1b3ef428d8ee5398c17626c119925708635daa227cb38a7547b533908935a96fe9b0174c97d805c1ee6eee5cac62945a123e84fc68b3a90c41014a79fb92ab4eef2eab02226345d3b52ea3b7a969f4f635493b9fabacfdf940a5b079d3847751346f451cd19437b5764a620368c2b51c832d2996cb78d72d5dca1d9808ee6f62a1749fb2069aa955f59fe0c09b9f369d3c0b7334c389c040239eaa21d9d1c4a2e06c869f31c69620764061f0a09e0167b920cbbf6cba2e93ddde140aa77bdc802c7fd556638849abf6db6f11ab1211e3de3a7d39915bd797d3dabe9c5ad18733789ff8d34a358eadf3b49bca45ccb96fe0646aeb64c65ea5de70783271ea021ae54efc2081ed24108021c0ae04b6a82c7040133f3e656ee7c4c011eabbb01020f3e4207f16a68ed1c423fd4ce43670c2bd1ea24dc15e17887a0db7cf43fc0a40993ccc5defb899dd01d3fc815abe1dab1e97e3df01050cfda494040298dfe5cb2c04c74beef0f43fb6d15210bf0f0a1dcf15562169d1e04ba7b53fbace227d42cf50535ff70ca6b2656e20330e540548520266142428c749e113ee6175b11d869f6d87c5e324a81712ee7a490d1a00bb32bb2cd1507f569f2a4aacac888e0c9b2ff679ac812ec17859cdf3626cb588651c4ce5f2bbac7937c5fe9a2e2079112a20f80591cedda7530caed04b4908f24fa7920468cdcf26944586a8ad1ed4cb95ce03d32453e33d54cb5cd75fb09f382c55bbac0658adb37e277c185ea3df26a82cb80a454a2c4bcd519de95a68e68b78f88f785fb055d28926f198e87ec16c1c054a2b2a1c628d5be9b6c35c5ce7cbfc51097cbac7aff9ac51c2edb61db9bd34b5306a959c8924293fa06a13450215fd296db13ee662a8ca608db7818b5b136bb322ba4024442eb76d1ceba5d59d876f3965e2f03353884e4c015d316dd5e42652e53ba8c6d37609981bdfb60d2903f05e2d1d4f6cdfe1146064381879919f7d4b36ce788efbec62b37283ba0e0cf23900ae9575051143ef40ab0ebc84d89f514a5303787aab6a477b625920cac38e239e936a6dc4665c674c1e84ace7044f2f02f76f075aaa6d823d70303b67dbd3c09885da834b14e251bd0dd708ea49368f30cbbe6ed4c4bba1ba7743cc5cb71a748859b5a44909c3b74948b7da89f9a8afce55d2e989f1fe301b9b80182d6862140b2f32be495a5e9514e3fb322ebb885f50568c48d3c601bde35f36a3248d01e8f04b5f4f4d2fd7c1a944730f32c4409eabb2d896cc4d77938ce59c01a546015fbe27b19b4c82198c72e822b4952f29b7fcf3464252ec1e0d3643f90a325dd813dc44ca8806146b61bf794acb04066a9fc4f88c4185a98b778a8b4cdfc59ed309861e7e4774d27bcdd49cf323d49a5738bf230ea3954100791ada3dc8677539790c1e11bc46f564fe194ba40bb6a4aa221fcea5d5f4ee672163c65cb9449f10fd14777d1efc2bdffe69cb18243fb0160fc4e2af3b48e6008c92020ec957b0e4f9f515d454c19663ed8b04ed7ebe6191f0824dc591e842c03e6aa7b171210eb980d49442fb61ff138ce00df1cd6c7c4c0d5a4a97844a32d4435eaf9033a7ee76bb10ee10285a05df6ac1fc41916b09ba74fc55f1311c14acd231c27a0a02abaf029cc17cafe328142c81d625a94cec3993bb0b45cb02ad9594fb2b3ec348f72865c8afcd71b9c3c91d3a8c4553fb6dbac0fc8a9d29abd00cee2e0c8c6feb9ae8bdd43169610885a50d1983466d4fe4f144cd461a4de1b188a590667580b4008caf5e8490018cb9d8d048941517f7600f4be628ae95926588da20fe8b996975d4af69a5e82d70968b2d450a93ec250d5e392aa950774e141157f37d19e5167519296b4afb6f7379b80c6b174669791726a0cf79afea1283fdffa56e01a02e2e5ebbc9a5f2d4767f98d8db783eb61480f75b400ca90462ec48696308bd2cb7b6ebe471295351fe7efc723e968ba2561683bb4cd835e2608ca632bc0295594d7c16055ef8bd0bbb38f3dc434af95380216559cb6527b0f35e206ea472686d1ea3f5520250386abf8c880d1a9dc01f63bc4070b24cbd3af724b3e6330590527127816efb5c9ef1c699775e5a8ca134388d5229127c8728137909434cfcd7554577991f5cbe52990a76a998aee8b0a37454ffd2dc840a18415e56fe79fb2306d8a7306f5ffc9989b91642417aa992d51fbc659709211a8214b00e40d152533d95a10f8a7562d3b67f2cf6d2fee8daff954bf322f1d57e9ce535646e1782bc3dcace98cc9d060b06f79eaaef012652b2a6c0cb6ccdb2a17ee6659352deefde10d19040881398d2c36a5341805548283354f8dc78ecdc03951f9c4c140d8ec7dac513df2a06211039233066f541c85e79b9911996858229a45188dc7878f00b6c7d768538e7b0193c10cf24b195d2c46e76ce38852177b20aa438c98bea57cd55fea7fa6d9d7376d85bbe5505d45f65c5d40bb3732e4419b94df4cc5c23418e7e28e5fd414e5bc7fb35a20ac443c54efa901640e2f509532114ab54395201548f56a45122eb6b27d5cb1c75fe9ace209cc01179c528fc2899ab67eebc5c8da5eb4af1f5ce91bb977556c74d993802723d3d795024b60acebb23ac292c1360eb196612f8b8f0f95fb675f648f38e1b9f0b20dc51d49b26725da2fcae71e22e23fda8f1c4302a1719312d0b978ef31d3c3b2f5c3186bf4678510393f090e307e7c2a6e85f70910ce6f37d78c756a9a19c2e85afdc562159d9f0a1c5eb7c20458a05583ae547f3a0e98581d97bc6185248b68137707ffebf4835b447452b9d008ae610d660263870e614b1f8a649d104b463afa2c0e9d1e5e6fea84a8a8e3300d4e482c013a26b000702d45dfd39127650c1da6fb13044d8866c28d2355bc53cb7fd6957f8345163a6a016ce39270bce033c2749b9d99dd8f6b9361712cc9ca3055a651dff241cf4ba4bd9d58b0adfa9ce5fd94f5666a70d20d7c16cd0d97979421f2e9bbeceb72763e99626236f5cc21ef151bcdc4e136d9f9ab145c5855a1afe50d6fe21322f2419f5d8e5a85624a33b52f206a8a70270a1b14468aa0d0a7a6790f61f9678ef7ec722b4715c6092b2880cea109d333de031e1e4b7c74d0ab4ba847d6b05100818269bee3638f24624684cc8b1197ea8283bb44c8fa068ece4469623951758d5b67569733a583d111cb9d836d415ddb92e10f9c050600076106e8ba553a253534ed2e9b67f49db9bc595a4bdc41e9b46c487f0f9a2446d34da4138175a50734389edfb45e8b9d7581aa68b702ece5d62643831251809cd1a98c22f02ec140cdd205aab0c797e39b099a938e46d4569ac727182a55a891184456b594d8a4376b1bf1c3fa6e75c0e41f78b22c8f89e1dae6769dfada4cd12cf2a7778b84f72f69ce48b073201c038c7b0802b99628495053fc14710cbc5e0e8abfd12cce07cea9c083d8c7d46b2cc1d9dbc86135ed6844b794979a9c520d90413f40ea01e4619c0235e81ace7add26941322de08284aca4ccfadd059964d9859cbf329493a895078683c8616408576719c849824321fcf0c3423166fd0c2584628af259204719a118348dc86b69f0b00b6da0be8fce982409d86dd9db0ccc037ef214b881ab47ee5fe85b054c54cc72b4974bd2cca7f6b9f0050c2c999639c179e9fd4503d8364848351c3fb7c744fc35938fb87390e511405c1bbc1a182c9ca4fe876bc590c87fd214238555f800ba5738814065463c21eb8a7bf82bfb30bdd0d9fd6265367f25551e481d9e1f54c4961f1e888f840f036f05db9359b1c43450f67b3a4b31b2c84b759a68e108d7026b22c458e415bae02899481a1747f06505007278b2c3be7fd50b3c2ae9d64a23a265fcbe0a44bd79007e0fd1605a4e08a7df7df3b1ccb4faa038eebe4d77659e986f62856bb5ff2437bc2fd258187f5a05f958e6cd1f20fc3e9170fd2146ce3696198fc88961e850d2e10114a8ea2aec052345e8363f87bb985822b924c5b152378890e9bf3215f0467c3770748c3a2e5935050db2552290f6cdb21f361549dc992ac69fa0ea507137bb32e9b94a1a8ce77056b529ee3852bb489ab53b5450a8955aa8378f2326922bb3463a77f68681c690b692a515ab767526c6d2d15f391974e4b22f752101ef88334862ede3602b7376e1fc426da2f30807381a76ae787de97c33c09e0ecd82b87c30fe500b0a233ef7ef883961ea4292a0eb97ccaa47a82628f49e6f38335a040bea5c58e3e0b232351bd0d3a0c6ef8177bf57f169bfce6fbf2f580297a88efdcc9a53121b72dd1eada87f38d2b686b4523d76b3d68290f93ac72c0c0481a9ae849c2485381c0a80beee10aa1b8dd2076f9caa93474e4d3b90262317b77546c767dda5ec71648ede2ad8e83ffeebf80ffbd72f8ccc5b60e8b8796f0de2c9c329c8171537ac31de099ba44c58edb7ab9cc24eb291af9e322e3c42a29a865ced5b7b71c3939083dabca8f2137d75e58d7b08819df0b73142f3e2de7c25f016c96ff363a8011264e79ea28e81541776db0e7d65cfbac2b04f2e0707ff3aaf0955e181bd224b7030141071bfd570e735b994350b7d95cde3610b3e16df0e82a57bd8847c9088bfdb1385ef48f52ae024257a47302db1fbad5232d2cc733b4d2b112124ccaf5e4d29b1643f05b8c7aef02b90d5afa1007de4b82807ca3612d83e4fc8b2f272fe6b652bcde5659e3a739b39f54f96a0de2fca4062f7d54d6aca815b5c405cfb21dc1740f9d386657f4fc7b9bf87f923a917f0bca75e1a65b7bdb5b9dc96ac0737efb22038dfc33dd999165444391bcbddbe13250bfaefa1d9ae97dd7a0de188a294068f09518664f7862507a7002163ccb9ca47248dad022c4081d030f6fc75b93722f8624fcc6ffaffc05d2e53190ba8bc570fdcd480ccb8e35350e831db2371488eac6d21d8fd93ae779d913a931dda767069759e5eb96d1bef211c991b4381628cb9226d3a44e8c6f6a92f8b945df922adc5fff729f0f4937a8b3c47e90b1f65dd7e4a2b8a4a1cf13fb88118101a9d2fd60bc063c6740f0b1e560ebbeced176dc6fae3500f60031a6ff9fd6a61e3a0b44794ffbdfc2f0bb3e7595fe332d6997555dc3c93e19647b3b4005de1c43378bcaf37de93ba71d8f80ef46221518ea32c3da349052a7c9a8bbc93dde49375c874f0d14b6e9a9704e2ed511179cd465a92097c1390a383357c8c13f6a6b2e33735691f8dc6a6464e4a32589202577c6a0b95e2e98374f64ade65757450e592a31305286406e444c989f6c71c36a2a59aab84f5528bf0adabd34484886d773916cad68861f0353b443d00b30ed28d59d8add28b7123ec1b56d173a35b27d82053da08298d59e50cb27d13572cb9e28572aa5b070bfdbc66411653fcc9025b0394e214f2cdbc51bbbdd6a1f51fe76878d432420b27e209f1aa6749bebc6e7c51bc010d0ee63d0e87af02f7231066c52882b91daeeedc0a82bf33e17fbdc8568cb9a512dee9c98802a24ac5be1b7aa3b4ae9041e1f8cd11cd16f314aa746e5987776d4b4252bf88b840e93e96d43b836977d69d7dfbca2f8d2604f15c313dfc6879c2977dcb100af7c63b5d000cd4e57928a4426c48fd9e62a5eb4d3061268d21ee1c450376e113730855951c14b8e19d4a1e32e7ca9cca997d65b4752cd32088bc3af831091bd1d724f8cd1289e690c66abe3110ce2bb07db2228f4cf1f77a6434ba0e0593dcdb1f1a66588297c00c0e69b3b494f6b479a629a142013435e079eadb02a11a3fe0c2f1a58dd0c485c8cf4e952bd97bb83e1ca310940d5b5995e6c130849997c3655f2952aa435c0040ff708eff95f3031cefa7085cd0199c609ecfabdb305a42e7d671c198f6cd303d42c1b7102b39e674565e30fb0e132b80b4bd129bf084854369b071dfbf5e916c33c1202774d43ea1076589438d5640c04a4ac4e31190e463d471fbeea094b6a04c11b409302cd33ffe0a373b6f9f0bc7ce93df867f082550b627bdadbb2761ba4f00ae4e9c1ee6af8923e00838cac6fbb218c3baf985bada4f770155337d58d369d47f68b75480e0078e2847d5916f524b05247a452bcd835db02316ac82fd7ed1547b82bd81abb8a429ab943e6e65b92ff9c74fd026713e30d8eb8cadc2120e28a01e493f8c3242efc5b035bedb32271cb9f9a6f6fb731c71c976dbd8851ed2fb7ef8ee0ba34eb694898f4b1c6bd44cb65162fd717ffaf3ef8ff8fa2792f0b72fe449f5142c8a4a63d7e0653b204a552d3a3bee006da17bc4d29f8230a31850945435f61f4b5a74e1c3733f42c9116743a760a9c714095bd60b8388552b93d404ad4f74fd5458cc7bafed551eb203a09c94c302a2198f2314361da627221ec4869a5430ddff265f1ffb3356d29613fc72b293cad7b86348c01f42a30da64d7e2544671256164dc222d80d40b3b8301aa81f124c75b085b48f77de34149426ec540f091c8cefd38291cec4cad5494152d8269c42c1f87d5dff47538287561e718aa57bbd7eac045d48bfde19ffc9d75782eb0d43deab1a01df55fc11bcaf75bf4d2c34e267fdf3c4b8252c3a033b87f71a4b0ef74c7ab31ba9ad3160e285e9ceaab23359d9f6e34dcb3f5b6d6a3f19931b53fcf4ba63ef4daa15c20e6bfd50b6751d70f63811f5abd0b5778e7f39b9756fb3c97dd3c19fb3b7a02a91c40847a777745eecbfad3a09e17f0faae0fdc99c5b781b826c0996ad031039b682bed54f6f67b6778c06711956fa26bac33cfdc56434e60d58692d50b7e94c362776238261e4dbb67ac5e8d5da4f6f510e8061f7046090c63b0a75d0f56841855eea59b92fa80de449eaa4bb8a20dab36042e631bb5ae1dea6e89cafa67c04646d045101436755468dd580ce4833a02a8b1b9215f90d46137869104b25c57706d449ba4c098144e3441512b4efc9a449bdd59ef4d83ab238a2d7ea2f05563ac8e1e4fd3904c0200a7cdde6c0f372f01f1479865cea0c357c65478173c60b1316fe930d48d0d4b1cb9fde2141e387558d572342d9af20b801b50abce4a212b79f5b0cb44abb9ecccfa20a701f498bba01dbab1d9a55395e1734131218b260d867c0752cb1a4e38090f0cfb51a65686f6b0f5e24189111dcbd34706a91dfaf385c422aaca3d03ad642e558035d6d5f5b4f048942cd077682e5ebefe61fe1e3c8db33d7ae68ed3b3605f9ecd8425382127240c4eb96a397c3ae038b6a146c5298139d002794107fde035d7e81a72255a10411216f33ada1854b41c87bb70081988b64f283ce194f960f5b58d0f6bc69d829990569ea8f68d82e3c19b4b87d91a2b6b2f1b237147397941b66b02cc56ac082f694e431688e04bd19ee2fea26a93e5096a5f82c93a67444b5a1184ef42eb4c58d4a16a82ef5b2d636d93582dfde01a129c11f50b119e74e45808a3913e20c3983c30d5809b30187ebb8b5513273268ea0c104870b074228467e608fa4ded99cca9003a62b4eb99d211d934da1626d45419aa9488b8487bbb6e04619ea521dc44c404b9eaba31a2e1956bbab008bd0fba2a7fdae3f170bc000b2abf1f0938d903e785aa8909c922eb5f1164d8a8d4370d129a737e77e9c5a879c87814c26b71ca070d3800bc1a65e7e929bbb77bd26da29bcbef7b849382084907060c04a0c425cd4f7d218afdfb3abfe6d15c31ecd34943bded1b2e2612f2361a80edca4b363164baebf9d90b893c08d5869c30ca21540ebc5b1a8c795e2f68d02c1135455bead8dbc6eab947e1d04259963277cf926599e43ed70b7d0e074c6df322694d5927478ca20ded75ad42ef537e12caf70a3db5e5b237d25224add879a55f4735c663c57d405d4829920b6202b3b4c321124d71c81c1ceddc0e9e75c298f20c65bf24f268a263e2a2e1621cfc5675ad67ecf3479d8a237cbf20a6d7940e1002bd03ff64273d2757ed4276e0c03b845778e71388dc127238d698c08f85087674f70e7d749e386804c9698809349e695f386e10fdc3eff0b369245260b1c183718c011480a82810200d93d25c3676b195904b0630d01a0425e71face394da1da86ccb8bf9458822420323c880304a141f3b576737c1c573e57ef093369ee84ddc2dedb36ce62694d4ab59b8417b8b28222345cf4f02ac90c5872c23e2912e1001cdfc9c1078eaf43c274a5f46c324be9f797c10b0bf3165d974d3d1ce5d35db6c9f2df5d2bccbe4ffdfd04e062e62fff7bba3ef01cdb6a4f9245304a080b5ed68662c1c8b54f8d40c6be25fd7eea66b1e8abb00a33af714bfe3286b41fe6b92e7eb8c2e5340ce102385c506d49762ca42f17406cf3dc7956c76f768191ec82edf625b37d4650b356be28e496e9b566265919eb9cafdd39d5c200d94801f2c14549d4955d9550c322c1f44b33942ab0da139a343a4dffe85dc9f4520cb826380ba58c9b6f2037565ff3edae465ea9adb22263f8d6783e9cdf4b4e91b23744a5d52dbfae044260ed96942ed9e7c108cc801b69f0cf415bc3abc0e9ad96cf4dd6bde72640a8637321384d6c47d8b21bf7b6b15f8def3b8f9def425331eda18d8a58b94ab52e7496d675d6863c3b95efca64d347bc3594ed4d510ed618fe94fe59bf9d7e186668a8ae8a21b79582e5fafa3e5e605d7c6accbffabeb7f5ed6a9819a3802951e5e9460691398744b055705d503b555a7bdef82f674e6190a02f6764464d9de24ad2feccc48f6480986ab86bdeace2dcc4e756b3089cf23033bb17b5b8894ba6f05b3dcc21a6784851a39ee8b029ef1956a4926b774d9b3a6bb5346a5045c44bb716e36407936d87788beb8ef75402b47e77c784d478c5bb97e4394d163a9c2fd41b50fdef42f7ee952e81705e21b8b962191c91df5e04a399d507ba3e1b1cc80eb27fb1947ea3907ff51022ad4e61b62fa75dcd53ae11b1db3b151be88d5aab08a2da46c2b898f01236d3f51108e47a7cc8e66a8162af442afa979da902acbcb79763fcc71e1da568c4e7f14c7e689546a4e9cba71759e281b34fa593c8711c522cbd520080300e5223d2851e92b019c820eb4cd72bc8cd654195ba92754992f7e168171cb9f0f601b44b1ba28bf316864f9f4c0086057860369b9ad8b98b37248bb3dd0d464bc43beaba8bcbf3e9acf636de110e45e16c792754f0172f0b7d65760aefd2f2c42a41087f6c201d47ede259450345113462e560e01b873d9b8042ec7e276fe5ad8ad7c464a6680aa758d5a6d4aae98ffd0abe07b76a2c5ee394b898fa62d40da744cc6380525edad1546a7d3c185a45abad5645b99eecb3fcb0bdd25c4cb7c6af105c1cc5ce1a94e6e5692f010318508c22e85a17cdde74659849e55962a4aecd09b2c1275584006cc4f25411f03fa866e11a7b9badd9e6e5ea93be83b5a48f9eca04cae28aa4ee1e9b73cdb9133257a4c7ea84a3c6743a8fe18bee5ac868a3b07b144259202803561607879d5917a710785dc00897c7346d47dccf08c104d8cf8cfd699718213c69786fc719d3b4a17658fd94d88896656d44eb2d6809268fb15322f2e2ef0c3ceee0083406a8d49061006664c382660acbf69ddffd1d2abafb47f67098945f1688864ff5852881ac71b2babcbe9c2c4953659ba564727f44f646d850b967d12ac61e2a284dc27f45b05ed25229bf6679d77f11146b472c0cf1efb0f2de94376032d0829c2d44fcae0e0a6616e1ea61eca525616f4d460180e4501c6d6b4ba9289a9de8f4a66f64e5e8a899077796566052b2bc80b406d4c34f2e26323ee105c386898bad5c2d48a0b0127c8cbec549a6ae74a8e9a02968db2d694f8a68608a819a710c7795932f274edd016664d3428e222f3424525a85018a44518d95a9a3faff4505294aff58ded2c3a41d67f154596d3fb6a09bb2d71b31b7788a58cafd1b2b75e988934dce03560e5c596d311b93bbe9ec878340e1219c5fb8601b9882b92bcc339aec82465c323751328f1c6a35329c26c3eacc368457c9270a5697cac5803c649b047809a87abd49f578adeedcb1192ab30a2790197ac80ae409e868dae1cba59bd163fc1d83807632309340a4211a0e093e9ea3d6f2d906c6097d402d631863120d25320ca04903f4bf9f030cbe600724063be494f25ef2777b1802469528496ba62007057b2525142b92ed5a9ce3aa1cfac875a2cb24ec1ea29f5d27482ec4d502b466b04d5f33e4746f6aae43cbf2898f86bafc12e8c401d54268d693b9cdfa734176a18bd00456890384e0941251e6beb23db2255fe4f1002c7ec343bb23d870c9273642504d84e997958751457000c3a753a3a9a30401a4bdb3fc38c4606b2219c4f300c7a31a74fa23b1cac1e83f0c29ce42c97b6e25919cce381c91eee66e44db09c9b3086c088e2c45b7f564edef16bd85df3d903a888543316cb86ddc37296d7eedc1d7d48d5ee0582c23604a2fed22956d973331fb0b43efb7e21a82a7f87d485064153ed13222d28282c5eedfc77187ea96bb28e9c94dce891c61cba4a55e6d673fd533b116455838b9186b6c4e2979d290f3a433295a4b9443d35545cf256e6dd029840b7f17be831984ba48b857d4070da6f595a047dfd0a9918513158adcf32db591324f4bbc3d4900c899f1bd901c9f1e5195c39dd74c42f2fee224042f67f43ee7b0ac688a612ee651a96af157e36084b2547e3224ac122d7b8e23618494270879041566960ea9edf69c08a983b4853abfda6524b5617dc315249b3548bf5bbb43fdbe626ea59dfb20d7e486ad237749fe296965b3e7ab57ca29b32d4ddfa774643ec991de75579c4fe9044ba70031b8a20f117669935801553184e55ba90a30a691892b6a2547a828ff4954a7a6ea7e4e27ae4cd1cf07c29c92b47c5c863595057d4e6df0713e5797d59272094556c29ca71ea32b918761a68a6a638d247f0bdcd3aa7b8890a1cba0423ae3549d9b421d179c3e000bd8b45751960cc768221f4fd4e1a308f707e02aaf7db6089d15fdc360ff72b4efe54c5fc8c09824604d94e86c9aa444a07d78474eda9fd08c6c1a7c222014236aa49072492e48eaf6477778edb2a42abe5165aaec262dce8272454f6961290e019c1fce1e7b8e4348a1607b68293e42495560336017259420cbd8612e3e81f3c932c96b89b9cad6874427008b78f82a6527a6a27675d291e6ce06057fb4915a8896a0f598996eb1ae3b19ebd263459dfa8a82c8b1ee0e1eb30b47c898b4504528414fa8b24c6cdd39757e4fb48f14128f79d75258343196d8c2fa4cd3f72c7802abe9dda08fa4b5bad474c8fdbfeb938ee17513a1bde96fb34cae3ea617c892b780088dc0d21afda2c08bda6cee3c538055b290f599d71bf83481e6172d521f2a38b4a4e864482e82901969c054076d8af44a5e6442db0b5f8fb8f4c2481df5df038682a128478f07c264d42d39e3d899807f326f1f9ee882da2a3d29d391e4f5f12e2b333eddc18e26c73f93b7fe7a2f367340cbf0b72b6fdf15403d4d71e7856dd4535ac1b6c4881d31b6ab32ad047a667913a13674f8fc72332e75cdcc760bdd9fc0f6ee12a2e31de18bc3f27378b06d55842ce8eccb0611c26645c7bee294bb7ba05f8462f563cdde3147974fec10b2cbc4dd36d9e0b6a09b9ee17fa6c7141dc18953bd309414651b6f71eed17f842ee541d3c7f6248d5924e81970a33ef794ba97f511acc168bc3d031840cbabf5560eaa7f5cff8b1f2ef935f494f4547945e73c56aec01cd984cc3b90dc89d80fa31a5d285b549a9207e1d89993bc057f00aa52fff88e7405c11fa8bea7e62dee3b792e356fae14e435263f543af67c472a2b5877da8caee828ca53dd396fef6c0df803d2d02a53945c0dc83105638c53ceca64226db30553450b24c7dd5a29f34b19385622833229efbb0baec2e5e08cc5608add4416c3cf2c737f674c1c0a83cb46750f5274b1f55aeb8b589367604f9bea6d5282d343051c2aa6400196600216bb765365d8eabc519baaaf53c443393a8ce590ed943f0855cb15e271610020c17a3d0e582c5a592e38430616257ad3d35521369ec7f2c4cf573bce82cf7628fd17b650041de2bcbe72b5df591695065851dc27e21a00a0f6bf93df7c597e9e44c47e6f10f95d89fbc58c4c6bcb91aa3f1f870e2c98ec04b52e8b0bada9138805b5c4e09580fde727357d3c591f9869fa5bb9e20ca38b899b92bdec5166a0de883229adf4d0bb088246e15d5b364fe198c3b6222958075309a84092279454c2d9652d7b7ea526faa7e419cae28c9c3668d957a98291d707005ee9591f94532c0ac578f084acf3489cd1f8096080678ca1267a0dbd00e5478062e504f020b95e3891059febfa551670a7abd507a25ac38f34e92acd248ba3d6a0ca82de0bcd2c24b44719be15a30f9dd7ddfe9491dd7240bb730b0f6a2d78b3cf49e99fc475d43ae9ed60a94c49cb39031c2a9e9065aa5520f5a20490a44a738d15881f4a6b89d9f09aa56749a7394bc3e081169b0051ca2917a257171f70968f8ece38c5d529fb80c505d66319bc1e93c41e90775fb30e2f3dc3414bc2b8c306fa48686ae46e042fe37860fefdc573215723b70a1c64ec1caecbbf687c95c8b3aa69fc8f8fcb8e70272e9a14bd6b708ad4ab35452c807dbf3a886c92d5e78755de040a798cb5918fcec58f7a914c6b014125f1e5b766b64ee380c7e0a158de404727073d68d1eebf10d423b164bc78ff19780900ef7e57a70516b75f2f7101ad7f9b34a7ffa02259c27cf8b5f1a8d14ba19ea9fca7eb119a0e34941ea8e21407e1147d3deb2f579ac0ec0a6e0074ea91b218950e4278ff152a5acd1bc7603343c2e5487d5f6a401fde16bb047af60c9ef6fa0de0750dbcf2dbec3919b4cbb42801f5a948f71e86758bdef60dd65fd3330588a11a0e2d162eb7b061eaa05f699924b52f2d72f0fb18d2ca1895bd2ac2b0704928d00547ca28fa1e14f9035e5640a1189ab0d099a4cb182b39d1c481958dd35d93f7fe4f453718f66b9cce32298e3ff210e550110e71e13b381e2417a78c8771f0cbff2b2b29354128fa77eac7c6c44df8470feadf15640d69e91096a955ac201477bf85eb8c3924009656833822a1241ace5b8df6e862c32166e2e2c642b77a831382edf25dc3756a743f1d83167718c43edf6d4faaa4a98dc4cdbed03d9567474d9b2d9094f5315ba76ee01ab49429f0bed539e5a37096d31c8790149a9fed0fc5eb85447ede78439da77af11f901246a4f049c0d4a0a1d58f1f6146378a3cf2d169af3d01f3d3fe1821eb4db82122e2dbf17bdcd147ffa5b611108b5122cd74acd15f7b32d37e03ac6d1d9b5d1225b8686b6088d00bc20f6d86d086fea0cbc3a6a361c0985c0df8cc86a016db00521fa3d8fc1d943292f66d63cfe4b4534d86851ca54a5993602255905bd4fad32970fe95206238121567b94d24aaabf71c475b1e25c0ac699dd32cf73f0c3ffba857c43c632de14d76362c2071aabe12f1549f7e601a9bc40c6878695aa23e355466b694409274a333085ee5d8244da90655e9f2aaaae170ea550a82ca43e7c8c2aa5b23a20ced1ca845e23cb6ae088399a7d376a9cc8d34e9dc07eb0f349e661c2d412f137d22f9f5f0ca538ccab70eaf04508bd75e320ffcbc43f2c0ed252d10c100c24ce3cd007015c0565a880d516f4c49dca1a0dd2ebaa16d190f0707dcb1e79993a9b23b018231e07f790aa4cfc67f7ffe770fbbfe2865dd44a516c7776a00ff255121b0edb0f3d4d1038773e83b8269509a0c6d65e61eaf2f8245d9883873ca4f0308201367b486bfba21a9ff73dcc8662758a2ef3d549e9f8d247db8d5e7b987a7c432f58f62d8ae53a6e4921b333b5c60fd458f20a28b96e90acee4bb30a3d0998121267028b27f9b1b55f2e684b8c0a90965121720d31187555c4d259fc94bafc0dd81eb1cbd01b4f759eb2845434e99c9af611b80f0b0a826c6d345b5264a22c0453d102de9e573897d734e3b75890d85bf7d3adbe99ef0a7be2da75134c6eba5e4163236a2c92a7891385379f80ff015d7bb99d00f2aee976638373ef8a94c11ca4d672c71db98391398bdf9ed99f9549bffe032d2ea8d88969858cb548cd59c13de4110f9c4100106c66ffb4b6fd93aa64abf2c8ea6f465fd7d2c8030b77f55e8f3f1ea4746f8491d3b894c7a4c1788a423b78242f8a048d57feea4650c42e87a5e870f093be737bb29e113487cd42a0ac88d677256dfa67b1554f8b906abf99a40d0263b70b6b018a4d89d404db80fad2326dea26987fc725d3ec36331736e4a7928e6a70d610f469d33dca207db3d9ee246559d2d3c8b4caf4e01abb8264262224c4854717ae3ea693297863c1b62b0ce62104f4e330ad9239f4e373dabe56b8184b202912960c1b9b6eb254dc97304f18b121ff30db0fb0d169c74d31c71e480ec95e76d5d7c42a53371c7e226e3d91577cd123734facc8c4c9b2830fe83ae4b9fc1af3946171bbe8c49685e6c54703a9f3b0e37c70b75856681153e85dc2ee182143ceb42bd316c61b430633af807b535652943d91b9dead6b47755f8d039c022886dd48d462cda6fd0604953e05417c9b3ae6c85a21da063cfddd04565aa01d31965dc5e14f47eee2c29587068d8f4a591d92b1dce16015f2a4a1107a0e46b76e16b7010d8c6ed24fe1edbc853f0688f3b7a95b61a979728a50ad7828241deb5bf72840287311cd02536e7a696dfab92b1b47fca0f0f8ec1147f4f0afd935cb2dcac30480f4e54079aa874a72c62b7128f890a63d5104dd4b19eafa7a99db530940ee9ec8c93e882e89f198bc1d2af5d42340ebc34998d329e081978c71ae0642fa937f95e0191f1a4a344e53c99f504c6bebf826f8f99b4c45900d445078af7c3fd10ad2a7d5dd6b9b5624854605fb81208111e78bd1a0f241f5931520fa48766233eda9fa0292a8ec2a1ac873016e142d865240f360c5e61e5e8be1b316e46b84ca63c118c05e0977932a999903b608f285a16c75332451b183f0bab2d0df53b24429740787ad315a1489976665b15013584df90f013f8f6a56b36c88b80e68e800669279dfa3d15fe3d17caedae2f0fd01ae5871ae632c465387d9ae0cf14a003e218481e6e295b5a99a36ff3a17ab7764e07350b4edf3799b64caac855ce54564f4ab718888f52456737f2b0de9683036d755efce2f47a56e921a24c8c266de600855099367f2f2361582ae7919e184b6e8163351fb69b8460b40a1ce458727a19cf4b83e5b631f35f8a65c78653cd050e73d7ed608209c1389fcfc73f703842d8d6dc499d1a8bb5570c09410faba4050248b5931e178ca87cc451cb0c9dcb1c3f7c0993ca445ebfe8e5f3eb2258fed21cd6ba069dc0f1886b3255997898f603d9d03fbf09afff8c476dc0c384ef419643a1fb55ed0ff680e39df598c6d8b16f6c1728a14b32da5125b3250b788a22739ce82598746f675145b18e0d4c9833642263395d8214ce027f6b0c6d83fa6e8ace23aeb68197b429bf5c10b680a03945a7b907a2c2a0c409de4703af0c0601686ef17ef004a9b500244654b00548405f2033cbee918fc020eeab49010b8c1f4198a2328e59cdd161aeff64d7afd102639c81c41207eb78a3bd78769e8577aeb4f41773b25ab52f569b2d1933a627003a59235a0362c749b23f617ddc5914639e06c0b431c2819c01f6c2fe918e1a60a1574f98055576c25843a31284949dccfb46c7ca3e58dd46c9080c2f63b3b4574f53f2a715e53d4fb86023d79dc8c082c261a771b247faa2831e2600d33c84e0804270e77427194eb996c7f3cc7e7781691c28835b9bcdadf1dbd44aed61a99bf207938d8b173bd9208172ab61fb07dc0c51b93ad4338564bac7dd10aff25603261ed74ae5e53c68c901f5e44818a41a43a2325276b1e90a2ea2c9d8a2cc4ce98bcf00f888bd4092c5e2c0b70abf44eb18a79f1830a869563f3bebc94ffc2344480351c8457554c9141e5f1e4327939e090900c74813b1ad03215d8eb25939dfa67a899e17cd7013a425964f22c239d79a2bee564675243c96b0a0902aec4e29bf30f550b083a975a9119cc4c6664e0a41b8b51a51cff941c44a7889c00100204e3d35396cf9f7aca4cf7464c54ab09624bfef657fb9481d078e5aba53826a738780956a8cf6457611532db49b389d3e4270d679579f5bba2ff2d2acbca1506736714af720cd2f7c6a27f0059670daa04feb60f283231a57b9385e89643cc2fe7426220ba1260c23ea96b9ea2c81c04b8a59249abb93099a04b2e07f7873ea95c225ce678af3dd6a7819a4ce4167614ef28b8f676e643895b39a1397b87acfc9a22b8fdf64dde7d1b555da6406b74d8a076a01c64256ec307a1166e448ec65015a4903d78e69c9abb35c5a86d90a9daa6da3387e19e18d25ddc45fdac787e7d6e2b03c2f5196d9be4dccd9aa5340d463c281a909c77399c02211fe94a790509671deb12438ce075125b36b618d1c5f4292553c0fe0cfcaf4318564e9f077ccdd1e31c7520b42e4babc6dedfbaa4e28e1422532934fa2f5c4473281c64c2bc1535882959cb97d7c49d647abeec27fa03f5f2f4a3d92cde843b5187f6f4563e3694a9d00e939e2a9a632d304bf6cb5ce9b7e29bfa0772ae61daa7c321342c5c8fbe1b06ec1359e1efe8e4b5bffb26e7fbde38b84eb90c5e5ccf282f783d69b95ccdf4ccbe63ef41f782b3936a5f0667765cb6a82c38d05da47e0792f577838eef0e403a1fb276a65faa4151220eb1f548f32abfdb1187a8fd2c8b9ebeecfc8f6ba831bb44e27e60f5429dd166daf091a53627e2affbbc10949979ccd539b3e2ea1da1c1df366c69443c4b160dc078d51dae87a38ae4404808c0be1ef3ad1586e8acfed39e86193fc56164842e5ee70c5ab7b6dd06d0b99f1203f37b8102dc454d5cfd1679af0d6ce16f41a76c0017157bf4504ada77f3e3596f325742cf84beceeebfcee8777bd3410f03590ff29bfb464587de0ec780341a29deb2ac761c15858ffe11c85e5ef32c88edbaa8bbe094a3e0bcc3618236cbd482facb7997d5fb3c4e25c42ea4332dcbf2c01c480c5ac1635ba59df9ab7d091332542198099b8d9156712a60f127414b134f5587d5ab3ef895351894ef313266fab9afead951200e4122e3822c264cd4e6d1dbd4e90c048982d40ccb364a6234c01ddb605c6b9fc7fee213f5e14212ac4f0bcc69e4d755b45cdcd8f212880457e57381978eee238a54573796def13d2f4daf87ee10c3339a9c445e1ef6941af7164660bedac556eb77cc12ea8266f74138e81309b8028028d230b4388394edcf0ff0a0273e06b6d8f4deeb2c59a5b933167ffdfbdf88f9a5048a2b0a47fd5ef47de18859290bb4073ca473cbbe0b19d52834d5f1043b212cce9d47681fb310014032d50009ac1156d562113d869a0b9e89b51696802077225d330ccc03441ee33f2c832d3a7247c57d948428fbd7f95330133f611704bbc943fab7347e007c086ebf8fc3bcee70e88e06d0e3c0d1037942aa0b69a4cbe845e663ce6474a1d468f789eebab88cd9f7a4c1bf724f3bfe37481cb3433769b79f913414c4f10f2f8782ed0fa60d8624449b752004653ed8381cf91a3d946838d4258e074c6ec80f60b9a4320365a44f11767bd4c0c38c0f877030fa3185153f8ca25f44d90804f59c2938757ef3095db54bcb8b1cfc2c497d6d67cf15f7b401d06138b0c715c9fae3f777932457c4a71aa58d33a1a4f6f609ecd879a9b705fc1535aaff2ac6118de31e4c6f76e43bfa4cacc52f511eeac8be72fdf630e3b95dfcd778e7aafc4b532e735d66407835fb00472031e64e703bcc3e1c8094e54a62999059cc886a38a863933baee8ef4f5955f0af65d1fe42aab058f41e10799f9f37bd0cbaf3d0a888e6e8298bb23e8a301527647e9366ab8473d4df3e969b013c7aeb190a3202845ce2c4c8b908fa019eff0a9802425c1d49ca128971b43bcf88a95ef3ab0845796cd198aabdb1530ec7f4b299757cbb49349309be1d7e45e2f217cb917d5871c4dfc2206e4d0ce155eecbf867e6ce275d9a940a39e814f02152f4ced30b3df312f154f681f080e8d0add3db2433ab8431ca1e72d26cc49c4df72904e872678de2f13850428bcad8054815c5bbc9ae94fb5aa8966b05279ca4687476f0a06e0a27ecbea418ae11a28ffc16dcc535954e72d782ca246d3a5e301c55a261c8cf00b1297bc55ed8b193604881e69e8e12b18cbd384a65c1f8a3808e38109eb9fa0b08a7c1ba397fddb2e178b99a082cc8fcaa7ea477b859160016090b806abbd8d2f3749f8df5d6f69a58bf995317e6eeb31157e0306b326323817afbedeb6f472489e0889ec9d8ddaf0fd59a2a73be9d8bfe898e8fa6903184cc34a7802fa0d56a42cba5168dda1bab3d3f45b9cb157790182407a7952896a3dc42bea409f80e06723d38b08275cec54f550a217c4116acd51ac9b0c5b23eb9029f95589019460a0463e46c651273f6abf6e7e1c25bf08e2ebb1581050161be1af35577883200ba0a880d66cd264a6ac5f9c6727d1a309ce1c9acb4de48abf2b5f34f3aaf0a5b7b1b435a1d134d45dd9de9199f8c03c5415e4cb5c1f8e1124a03850aa52e86332a3ed1a744d05b569a8e2316c7caecd8e378dfcc2b335b012c82ab5b58473be7b6885f764bbdaf1858a1e747daa33e74b8595a4cd9e2ae9e05d42ee6bbdd006997f91ad35da59670935cdce26839e607dc10148831b9d23580ca4738066e85405536dc8ca485fdb1d82f80c5438fd9f8fd3cfdeea8cbe20cbe9750659e786472c7b6ff9734d6721cc777c4c35f39b17b73707b011a87ee1856e4ca99d0462640bdad6f7df7c181a723d1b9a0c5770b332b39cd9c9d6475433c777e96fb12581befea092bcdc134c469e3f79b2b46690cda110c351d47a54304cea560eb58146434f7f9b6f972b33855eff6d41838a8c40ca2c1900c6e18954576419f40b64d322d0cb6eca158c7fb2605b3f2bf858d8f2ef1b3f561a09da75cd5a66e37738673a70d24c64fd841fdb6a2e5ecec1938b9f3561de7b660b245b0c3c1f7bace71f54beb463f1acaf31e5a69a0b6dbf14073bbd932f7a786e8cf30c4aeac6e03872e84e08e87d1bc74589d9d92dd36d0757963f0c41691f066b17a37339c0266f33f5f835a1576240b38cb62a1da85f67d1935b1714184899360d6cc09e4f44af3ac1216c19e09860ef2488c84442687174b08e9298ccad0fbb66e9969f1e421426f3e9729a8f087a4c66a62f9799823022ac536f3c4dbc861c18688b98ac6986e63b7d812ee4b7c7fce141403c1edc90b369228ddcbd472da6cc132ffef7bff3f72650f0df787b1e2fa080949830134750706b4f4e3eb35719a9844bd331c2fbd53998f00f33bf54e558271d7ffca78092dd16f18bb54aacea2790eb781d6631a3b2342a379119056139acd68c929036fce70c3c7f2e80f74db3c4e1038ce5773374e62f0170975c6db31d935f648ae2ad494eff245833d5681325108fe94dc6404750464a1a36eb6a90f8f042b66be27d5c091b4962c60cec61127ea57cc5c09fc7e6e5b9f259a5a127a1d34a005f6e2adba585fe698f5833de53344d30fcad79fdc7951d5cd75c038f0ff7b7fb0458be60cd46cd9c54c0acf32694829dbfe823e31b28510b4e7f37c14adbb3acc3e7a6a02934136e4cb718bc5e738bea40bdfd6fc09a435f643f63e4c660da4c19825f37c06de36569024ad5b265a1555eec02e796792fdb329a158c1a4d24d7d8252897cc6c1498a88e86a813dd3dd197c59b3da52da92f46df1b469a7aaeb1f9595ae25070c88cb7fff71a0af7ce2098dca13aaceff18e70a41a70aa93a5c16075511daa02fc3302ca879d4e5d40d499490745175f300d82eb03b138101d22c9220e5fadafb5dc92da5f6fc99727e0db4132525627ba82dec7c1865ad1d51e87ee09db7ba93971fdac10ab1bd36e3023765cd4eeb8095152c154c3727f234412b2f7de5bee2d934c52060805a4049b04eebfa35d2bef1f3b6251bb457b5511acfd7ed5a3b05ae1d82a16ffee7f652bf8a8ec5f58ddd8a07b34337b63f76eacbebff1eaa54793fddb8f991dd6ec37ac59b5ba396a0b4d03aa628040b7ec3b866d706e78bc5071f82e1f2a4291fd398b64a30c6ad05df0619d24905657545c7412c8ffe352e8dc63408f4c8106fdedcaa3a108e0b121cb520c07e0c18635b33418a168dc00ba185f50a10b685dde1fcefc1248aae0d267d7906514b68932fcb5bba3c19b6e71592303510517f09d9c361065c820d9df0511d8ad79b09bd95fdd1027af5ebba1cddaa541bd7de9e140bd7d1c2aafc27166f53133af5a07a9c2f67d433994b7d76eb8236fb141d48d3db361960625c671a8ec51d9af3e437d55ddd0b30ab561af6dd8abb0d820cabbaaf7bebb618fdc3d2757abd5d3c4bcc22f54be66f5daab6018a0b02f6eac5efb95ca6fdf23e364fba81b7a46bdeaaadc989a31adba3db2bd3733a7b0cc41aae03dea86d149f63e667a17fbee7258a39f5dda20cb906d1932584aa28715ca19295e982ef9d33ff5c7e8a5829d1c5f39be8a600a69f63721ba74c416f71931da85d53f5bdc8174fc74e1340bd38581d8e2ef3ef9bf26ef156c6e7c8128c37f851bd85016c9616cf2974399dfccecdcfb8d67edb9f79748ddea6cbabcc95778233326952e105f6cf6f7ae0d98190dcea395391f9b184a13d39783dcff7577afb814dd1d811bec9c53877c9d2b5d8e8a50ca2f727c1551948d3c61d86330dd924f8c38499f547deedae9c2106c7c32c5528e4f929c7091ebae669d24d987e06592640dc830fa2aa2c86b68e8c69f0c69df37b45c8ede8df98d5f68387e8d7c4dc334356339c35c3a0b7a82f40821117a914e4338290da1d4031142d289a021413d487a7e4859811404528dee11d2f3229788587a91484190aa93122727234e3f828082524f489e86ecd4e81f203f3b40ecb47c4890a527229e5e475e3e483922454948c9c709c8e945e4d5f2214f459e78082b1096842c311d61aad14788629050900f1211482d0408207c202242d4428286087a914c4c464a8c7a701272f2e125c40b0825a5214a3f7e8efc5801a444e4e7079097d2103b3f9224412a8264021bb33b218588146964c488080811901192a513b8a28cca2bc9cbe788ce53104f7389d0ce8f57d02b49129fa0a01f5ea40449f9f1f3c4439091200f62f23162a407254a3e414a825ac8d3131020355a8814292d240911119da520967c50b22385fc2cc99e223d2fd2d2244cd4c24419c7a12b20cad0173001610222652e31b25344c86988530f403b3e4a4246b60a11b2750810413f82e8f911e227c9cf4f7c91ad983b4c5911e40908271f828208f920410a229a4b88e809424808120a6a38109c89a99b314d8734754add9d0aa1f3b1aab790224b3e0c31eab111dca247a101f3ac1833cbd9cd39a7cf3967aacf3969d01cc228f7af7c6efaa0cc13830dd2a7b28715bdbed448e94be73ce9929ea1fcc5273f98e49e11d64c6dbe4c7f4683300dca87c00f4b4399a9a4f12504519681478ec010ac471fec1608c6137ab0a0527ca9599665599685b5eb96cdb2ccfb2d1236fc72860f5002fb31fdd58a0fb083ad61cd1a9e9f659fb174f4c85a162b76563689c0c2fa867896f293211f79b26a141fcb3723a083fdb29ca183ba4b0779748fefb166dd4a6757b26e25ecc21ed9ca4719d4bd4590d31863ac09c85e93529c3de0e68c4079a5c19a61d4673361e38b092987dd8bdcc92b0d3689cd71a93823b1ec962d2595ef4670313a90ff48c1c28912d1d0e4993b4e4d4c90beaa169fba3348ec51b7023c3ba6abc696f958583f9b29807d0cdd9a8fcda41e820102eeb9c8c92e46ee431bb9afd106e746747db3857bee63fc9a009f64ce658acc7dacdc53ccb2acc82747a71c5f2d10ca9cf42af6063dbbe1a45d3663caa6f53dd78e7bee6355adbc5ae0934398cc7d1899c0702dee6db0c0c56fba3cb6c8e7ba9ae170c5c6c992e5f765eefb6b90fb5e6eaf65ee73702cddcafecb9ee33eb2385c2373b0292cf0910190e36b054ef931ecf2b3265061bd41d97511182891d4042bdc78e62bc1b8684e0e8d18f663e9d9b9ac4eb7bcbba395239623568c5cfd29529d487b727c776a9727cd963e9a2ead496b3a3a3a3ad29c361d4d8a92f694fba7d3d70fb5285d7592e557a55c2b8e0d569b94e449cd021fad69d2540dac4ca25ad36ce9d7a234694d34476b9a2e4fea967efaffdfe749aeb9923b3913135f52ca9c6407f8d8a31cda8f099a9442b2a16b4d3bddf2249a23917c742bc9ce882fcd03084936ed0c2935163f4793c9870bc597de36ef464ba63a5ce732fb08d333a84e83376499fa686a4354c1c51236b43954a75bfabb4a7372680e2d42851aecd7284d4775bae94fc7c621ddc9fd99d694dbf3a84475547a95b6414973680ecda1393487521ad21c1df3334cc3cc459aba8c4d511b8f8b22a2e4fe9f25f9d393c35a973212e693ce0e9b47de2d248fa666ef77c1840d2553ee67aa61a59d6b9491f3c3cf71cecea28cd25f562f0af6c3834c29a5f49928a59446af4c57e2172c44fca2fb1af9defd0c71c22e4beea3877dc5eecdcc1c963b902ad4df6eccd46844263ab06f17cae444e711384d53a95cb8b82e39747179b1a57ea4b88b32aa0b256c188f3a974bad4fefd4e122cb3bdf366fab5dc36064a737e375fd6edb384a29a515534a9fd2a79452ef467d6fd6ad4e5a67adb5d6776fa662fffe94aeb4b4a718a75dcefbed863879f32ecd7ccfc3eec5b47765ee34ec2b867d64514d6638f0648f4eeb9f9084a5815429a62fc3af4f5f0eb58fd641d69099f270ed7aecebc70859565ade57cfbba8cf3aeadd4d29f539dd5137de4c8d0828879f6b7db07e7d16ba45a9c895c827d76755ef468fbc7df4747838d9514f6f5833cd86638be989a33f85e38c690fb70ef4867288c32ee4a07dfdbe2ee4a0e1d0b38c4956b84071b283b5f6b543f70e4f841d76a0c1503f27e56a07537c7ccede952c630d972acc195fecab568ffaec637bb7ca5bb5390dcd34f6a596b5b7b746191a0e6fdca73df24d05a5cab495bd356b33beea274b1065961c9fd8a0088a0e56dd4aabb46581315ce2cbf6766557a9d56a53b92abf5a75aa7ba562fda537837acc9bb10dce2eca981fa78743f51aeaeba20cfbaaebad43fbb6bf7a6b5fbbf633bbea5ec517958fab8f2855a6d915b2acb242a9320d5b89838f2720f0f10114b5d5cb4c4493bf8dff0e77f225aaf7b771ae842e5c69acbcba605e59851e5756f5f13395cf5ed35450170623bb7ad46bdecc0aaf8075d2c33167548fddd0e13936488bddc3e139316d7168c392573aecaffab59740f8627f0aac565ebb445670ec97ed63b05856b42e87d61fb79b1d0de688118f5834b2bbace49a351cc625faa567ed47054bb90039be542094b9134ec8516dbac5dfdfc6051cc2169d45b22d549f737440b061740af8c50dd99886996b6283514a174ebe0f127905ec41eeaf4740c9fd5ddfca8494f2092e1679b9004a8339d92b57d4a01b35e8ff8a32dc05ca27bdf06a684f5205ff588becd1276945327b0bd90d7b00e50cca1665bcab2d758b7f773525ed49d6d09a68126a56e4a46e2d09755399f6f4ceb061c97341176e76de8d32dd9532d18bda953ee4ce8d323255589a98357fefbbf7a4a2ecaf3d75abb1d0a4742bebce322d496b22ba5c53b9d635468e335a778951867f0d2860f68f69aff3a781c596eea61c7f1d71b47952bb58ac5b032b62c1ba49b6c769906e5f5fca6d93db4bed9dbc10039207bd42f7711f1c1e54c7bb4571b64e72afbdacbee334f2ab94d2779ca703d165250e29b9d9e972a06ea14f9b7e0abb8b2616fbe972c9d8927aaae9a87652383cf07720d2c7892f3ffdd5068b43a62d2850100eeb0c376ede30d860eaeff6f2d60daf20bf7ec59a96531a6635987a6e769dec6ea2e48d3707874783f45d3c61b9c73e6c27d24be148555d83dccf6f19e4941ca9ca36b893299ec19808ebef95d9739cd46aad13271dc376f27dfd3e5935147030cc9bf9e7a4fcdc67b6d0972f7dbcc8fc361c82d6a77e75012e1ff869b57eeda6b011c6bb37f3ff82acb13d7d09c417ede94f20b6f053d687d595c287f665155beaaf1edf19c1fadbf55b3f851b630bebc6d812a6727ded7e76edb9dfb454560390420026c65fb16b9aa6611a64761cd6af5fb3ddaf2dd4432bf76e01b8cda441fa29dce6d17a76767c5af85daca7ef435ee4471ee4446e2494e9e3fa7ee57665761fff71200ddb74f269f05c5f8654aed8844fbdfd987ea9b3d338d3e539b385fefdb072deb5d02d89c3ed534f9fd36aeedfc88c7fc30ed8b1a1e7c4f4bdf8ba4efc6970a3eed32df44dd881cd9ee54ff8f9fd3c27b878fabd7c07ecd83032a9917f2373ea6bdc478354274a9ae9f3c8b1d120c5b78d6e1f750b2d925b7cd84e78e40e7dcfc1fee21c146e28330a1b7e180f807ff1383c288ca72f755025782594f03196f0d77f1ca841ea1ece74bd305be857adc2c0eed3207d960f2316f143f7b1a13e4eb75c481ddfd7c73c1c1f4eb75c441cdfd70fb9577dcc44e1c67c02cb8b0b801b1b7471bfeb44585fc20d2d76c350f6849dca0d3ffaab3b4396c3e8c4de1b9953384783f45f98d4c3a1ed5898d26a352a2905bbe5305a00538632f6dcbcdeed982e131eeb3813ae8c2df34bb8f35b5ce9237f8cb88852d95779cfbef38e9b0631efb32bdfbb34d9cb15b2972fb14bdfd1ad897aece514d1f5fde08990b12c32f6b2d6ecb9ec66ecbf4fe55f470c65ef27e78e4956ed5658986c717b49698c15151515154c83cc2b38cc5ed6b8bb13a519cab6f4c2bfb10817e1a222ae089c45475c37bdcb92a7412c633874c9a10d2bbfa0c1b37c195259e2b7d3d3e1658fe2c1fe029987e96043107b97e99247dd82fd7f982c9a450d62efa2897579f9d84bc15e3a75eb493679d8c32fc862d88733349fd982613422385f690809e8953b2f478fec7d8c78469695008a11464ddd0a6551514ec65e1a614610cd8c66ec259386fdcc700c51529f1db129555e42892f3add9aa92e959212c7d02016ca793bd5c75751911ccaa28cbd2c5a328a7284843d267b32f6d80e0cfb568ffdeac61cf163b7c2ec3df3ecbdc6bbdddda7b7634c230646592e2e2eaf26ce844e31416c860ba65b28eda73136e4c3c86b03a65b72c6282557af0d989806274cc601237f0763a35b11d360612e9e23943927a5945218982572b2e3d0c244893f279dd44e171a0f3e20cae8f4cb98d43f7071aab2afdcec54ef75debfbc58e3d9bd77c39a3b2ed4b81b9db7ac86f97dc316b8c79ec32f6e6c8f75efddd3ee5560f756f5f4daef1b5e2087d9db7c79aaaebfbdf4e5ddee8b1b9ac49ee338eee9ad365a4b1cd6a0d23e0b7ba06e9d2d19a621006020b2365faee9c73efbf06b4087361fd7e2072b33f6d87479f879fd9529674148ae714d987af9dc954e7178333da670cca85b133fbe7fc4355e1d7be918f61aec63ae2163dfbd5fcefbd8ad2e3b0e6b76adbb5b23430db96b62de3cebee8b1bdd536f85ee35c735f1fdbdc76e75efb9e89c2633f56e74ee3ed2df30efe90dfbb5f7a7de8d0d62fe953ed718f712d7dccced6af766e626cabe5ed9800e317c3373e39b99e3abf20bc737fae3f797c3d8395e57272eeab0d89c38ece4d7d49a55f88b777b7facfe86ba44fabd1bded04cc4c7cbf4fb4fec59e816eca38cdb68102bc093a53806d36810c37e060dec8c6e551da9b71fd3d493b1b9696f4cd9063f9667611f4a5933265f62b55a5bb3ce6fc53a0ccc21983d99e5c05957947911fb27f600f6401208440fc42813edcba721ffe583f26777114a1e2426e53c79423e517a990425a080e20ae952e2f8274dbc73be15052081c3f6e81973133b9f62186e60a77f7b37e6e3a8f9af733225c6f9f1b1f98ec5f971864ec7150b2eb25831ce239e399390f29c73c6df3638aba5a065b274ce9fae15ef5bc07058557ebaec67bf7255eeeac6e9fad962e392b30cbb2c2b522c46f3611e49b2e7a1fad4671802a85f611ef651ffd3de6f25acd9fbd75caf8d4bbf7f57eaaa3215ab58c53714078c2953a6e42ca489b9c6e633ac815b33bdcf7576440c0b368e18b1213993d4d4be1c968916409a0d1246ed14cc15541b2ce4f8fe7b81cf97548d705b12b65f6e5dd536cc31df640e567e9ca8fa32da0756be8c38a2b0d1065510e5b80412449ecf79516881ed971f27758c4e94c43ec090e0e2ca0a6c0027acbf8c2f33ce183d46234ca939e178c2b637230388f51c5f4b9ab28c4660cd6af47df863c4a1cd5b1ca8e6c4ea065744200852182104274648d1032a8e40128210001df18323a460473e4080ac4911b67964060d982533d09630b1c428775816479f69c8aff23f1726b9e6e8492656cc00851451a4d4008a2110c89c28a50850601103156491948405823ef0044812529278b2414210a61c1129694282cc09577282ac891b42414e80c44f134842e831e4a88aa51f113411028a7f204be2c9a28a21243e44c043133d7e6eb8c2082aa2140d210826303049c10a94d020c8117816e083044e3c190194a723644cfc200b242190a0040e9ae4b0840a9017200d21c40b8ad2096c6080278edc400454032444e10411512081c1153b086a01982b12318a896422d1aa984284233f20c11241b8618612274545a2a460474706cb5e55cb66f0812962c0832336a04226b43d9099122f257ce044153c88e0064320e5e008dd4af75a32943fc797123350c2a843410db2e4010c7e08620a2490646412394ccc600a164198082123ffab0db64b2709f6dc6bdc77da7337e64e862a6bf633c348ac97e36b0950fee8e9883cc81477f80a2b9f939d042e4650c6691afb0a9ccc4c94f16e35aeb999f9c5c4ee1ce06abae666e60e935fa8b48e7465390ad514491080200063140000200c0e8543439138281a074693f403148009909e40624c954623310ac2180a81188aa210040000010600001020c8186db016a248c313788d86471435803c6f1a08211c4cc225803949730c0320c7a6101fd81d8e670c5070b9650d77b2b4f33c4efb41d5e10ecc484f4812e3300946a9b94a7b5ceb48436088b20e4c789e630e4c614029887e4490744a9e7fdfdd0ccb90032b55fa24835888b6f8a5f8cb300a9532c309cb005eee2a0f0c07345395dc4c8ef07034c4846d6ee9ca3226fa0ee701295fe9b5cc7645e30d0a6dc9e59b2a0bbe054d800d5129aa2c86d05cc1365c945ba0e423ca429c9378b000c248217d663cb9a49af4bb0181822e17178a8f59893fd02bef4327259ea263d76de4e2b09bc30c344fdfa0c54be773ec0e239bffde5ba0cff9d2910bfc2682364c54517d18025e928b4600280e9e09e00404cf41f144112de0ffe225c3904a6f6549f2b2c9f6f0cc6c24a3bd24fd3430be4a88f12d6cdec727209d9dfcd2c53cce5797028d79a3d8e511669be93662c9fd11db1f06d6f6daf031cd2820df1045b6b217391dba6dc5c205e32e2bfb3b3fd96db0bca74f1ab5954796907db2d569a9bb18a6c93b3be44c53bcbfa160eef2234777f991df5d7ee44acbcf7e4f86b694c099fa1e65c476a844315b71490bc72aa815496767295b5831b3d8046de660cae2bc3e06d68003b118e948bffc19bd6e694408002b3b025683d13b630ba717864a3a6a87359b7eef691e67d6e896796d89e8b8d852724e555d02ef48e8c958496d7008af28a1b9e7d1ef64cb96a9e5d30a8e6930dcbcf992ab09f515140c16b49da69a81bbdd5a1636e9cf9ff2b37725db26493c4e588e483526f1619a99b624edb50438e567b76814a14fec4e58fe8c8f68f1ea40f69a5be7f916c4900d121bdcb1294535ac60995b4742c0d64e958a2dc21fcdcd8c915d7b4b468485fc9d0a60893be9c2bf2626dd731a41c5265af687e1218ebab51b6ea36117efd806149e01c612e8ad3837736f358caa0093c54cc4af20721709bcf4372ea97fd2a04b945071300a3feaa2ba7a74719c3df8bdb2ae61215d621ae3485863fe4b2e267747355cfd50e8e53ad32abf3db55a04edf15d8873ea8ba75ff17db103ca02433a62e6122bfb7a281eaa86dd80ab336c864d14d95ed8ae2b0ea1acdea44dba28beeab53827455cdea2b4cf12197e339f6fa16d5808079b198150d69db10d4c0647253ce6596590f6d8cfe8b264c348df2d83a240b2db0580188a3742095dc095fd7066f9f4b6a7013ea4227694e9087c15df761c0a286b19ef53674ab2b5d13f706a50834470e8d51d1dd9c3325ba4b6ce52bf16aab8ad8b50ddfb824e884632463ca9ad4aa1427911d15b6b4b1f5dc9d2e7692ba8a507ff5ee09a80dae6c16034bb8498148750415259ea61d69b920ce21bb425d8332024005a4a12c73f7beead50aecd3627b692a50f3d3758c187322bce2d2630d10041fb67755ae4ed9fa799ecd0358c70db75cdbbd9077aae68744d48a4114c34ec9fc17ffefd89baeda5f460162a4f991acf1796e427115f604bd7023dfbe3e5ed3b48ab41ca4e9130dc9731e6e22e3f9be4de055d562b191c1c3342869832c248d3b811ff04c6c95d3f204a2f08bab874caeaa504bb5e423ebc24a249a13887937f033dd5c5dc5c4e8ee5f72808eb862fdce2944216910d96e438318713b6425064a8b45f0ef630b5548464426922a6c9dd4cb8a02e153f0827284a30f96c7b170e671b0806e3855d207dd32c4ed4dd9a125c6f31eb32e872a3282d9a95d69e3aa35955041f6c61014258506cf08ac2f72b9ecff82fc260951271c7a14db48f8ed53279d9e8932a0298cb88f792c6a0e73e6119c9e1268caa2574d89925d7dce25981700f543ed7781f0e3e02061d644ebc0ca1b12fac94c2c1f6690fd8324141498c4281835a99095809a3eac8bb9b82adee80debaa86e1bb90608fbd8337231e74ba0755b1dd09c49950d3572001e4d83986cd79b5e1f53be552c009729a797bdde01d2ab6a6eeb633e927925e791a1884a4a728395b2b47627044cbe4a0cb72b516049a573ade66145a90afb4152e099686dad463528dc0f4e8b7ef7e9bd23473d2c5251052c7c31357fe4d74d7fe3c9d1987d23bd8b85f6310be9de78d082f76ea3c3a1dc2a45749a76e422081c2b392c86745466dd416ab981b90a04a12638d2f1f0794a9ef6babbefa9d1bbefa81d78df51cb3fdff9a12e2a43ffb6792bf14d3b0469172e1e45bf91b0c6df27060d9f2ff937a2262619ce2667993e40243ef09a1fc04eee735149584bd9ed88618f5925ae403da6d8452130ba7a24d09dd4d35f205c8f7c061ae2435a26d4e7d4590f9fc4816c1eb67d11690228620ce18c33a02a4846f5ce38f535acf56a8f73699a50e0d19423ef1c8e95fbf6dd4cd009f8f2ae7a61fcc003dc2762a170ce1079c58310009472fd94ded890704054b6e8675544d8ab408da0f2a2b9199c3da8982d84828b6cf3a727dc6916a614ce74f4017bdfd3b62d6cb28c85a33fa1bef847505d6cba840a237da8180b846a02bb7c22e213e8ee0a0a981f298929ec4b9b6d50f40c478e7c42661f259da3a08fa076feda0c86be1db4268573e3e26b30ee561bdfce983344db32c6a4082d85ef270942231b936640b2e7b12651b19f5e357f4aa745b20c088385a7f4a71da9be25a08dc5bacf8879656fffd32d718304a70a6b077cd27e6fc884aa3458a3c41fa0f6b253bbb353bc668748139bdd5206b315c1635c99a62bb08d2f9cdd351b5304e57109c976caa8006c1802eb2fad473da87dbef2499a7665711fb61d86462290be9b8155a3db9792325a7785052aeb58efa9626f21a10ff082e93087f831d4e59e94ff303d6404a5c44a10c65453719c4b728033c437fcf0e7236e62446d17ec42092e66acb3900200bef6ba3972e6f91640cc27af5bba2ca050ac59e68f75ddfb30b43b6d5894bbe08f6d3477332e39f8bd4b4fe0b6a6a5a6acf2f8deb7fdcc6234c715ec9468481cc83dc55a7c0319648cdf1ec00de43ceb9d90f72d8fcd4a17dac3575e83465387a225c371e1a04942e66b126a93c38c94234855cb4d308e2c78484c89897add412b8e23150035b16f0a79f6a5f1932a3c8875aa148a70c507faf8e0079c959a269185641e0f5a6850003a6d07779939616b8abbd4560844c6a92580b1222cd263a3ced0b16956fde46ae36b968e5d821c0bb83a44d6f61157ab1f32c746bad10a682f04d0732cb30061f2c543d009b340a88b4e7bb5d1304b5171d2c5d8eb3a7ccfe8d22844560fb727825eab5953d0027f4c4a3098dd41482244f0ce9ee2659605882bb29e2e54c77a4f939d7f7902ac82a1cbe2dc03fad038dbd267aa58b72c42751dc2728a49962914890b0e9a32c3121b30f931291b1a4127390146c5a4082db0e6fc47a8dc3fdbef5951201fa2554caba6b9f42c6aa20afff7483706b924cdc9f1c64b4221570cd44511fd7bbbd563f52df80612d2d8cfe5d8b13108dc8bafa7a0aed25ac584f0adf9911dd0f92970865cdb83e35ab860913abf967c06f18312be39213007681b8ff1a5b02aee67c85419b720cd618ba63f1bbe93e282289bbd070831ec9d781bbe59bc811f860be286f6079a0810f53b9c0c916389b6d08c695792a9b8c5d39dc40f9af0edbc9ce44ff2921d24b8a50f619610d4754d14bea70cf306142a25d91e8898300e8c64e1e051daa65bdd5031025238eb13faf978988353ae62b66c5132124717b50d9f987ff540861a9ad1e9873ff4282c955b01be9feb8b4d5aadb7d35c8947de0069f70322f443fb77248c9809163b654906f5ef323a6a1abd0800025c5a653abd27146e0d08e381246a327c778a7d6a0fe677cda308065cd41cf69a4707200e3a2b4c1610d1a8e2b44cccc3014f58f0402f7a35c69d57d714d369de80eacc96a47b031bd27be4ee3cf986741d011dd2cf06058a7839e4828041038c538bc3fd8acae8a3d7fb0c447cb6b58e9cae9b31f0e4f49486912abbe0a0ad06b7039b2fad938e7b0ddf1e60c5a4e33bb599e59cfa19e9c2532743775d522e60aa88f8e3540a68f9d57ebbd49622cd2acf44d0c6bbe4afd12f7c7a52c1261335f1db93c592a6688827b3ef8e24a7befa3a310a0b5b9d565c96d97a9d138157d8eff79e88a658515c1095d3e78430e8866735bbc2c2b31426f6b2be391b2bef0e54ac7a4da7dfe98c4b7aa612452f204ca2be5ca75e6bc2a9eecd01a16349c110d8ab91f938f8502b39f5e728f9cc97eb54321f6cdc18f1cf51927f3357f7728c1484b85d09599b8d45b623dcae64d021032b3ee42b8312b1eb52f5635501ef83ef381e203d9d91b37c5e4d2d2c11bfb846f6450ba622965113f334618d7cea8baf466dfbc4978abedca3a16582d019ebe5e6ad97d13bb9eb36da5bc48664465036d16cc4dabe325f6cf99549d89c35ee6584efb08ed14d0596e5e7355bd9f49a0df3224ebeeb52695dcbd3ddec9ca58d99577e264124a6011a3cdd13c1d4b272cccaf9c4b45919912bf1bad2569863cb6d915c6de2cc40d0a9f2644de357ec31de7336dc8089bbe99630add5899faceb2d64bb656adce9736175eea58b2509d62bcee6187103cbae43440c0785d022f726bc538e2129025039420ac61635ccabeb3630d68fb85b8363307cfca487fba4c954649d2aa587c12c4f3ee5f303322807878f97ed141943c701f87af556520175d026e471a3c9df30104013487a6fa9b0a648b13299ff12a1b4c9780a91f7382af05530e93f937be6f51574c6f6c27d99e0ffcd1936f05ebf388464da49915ca8fbc500234cf2aa08b530848ecb0d954f8476d898c8d60ec941ab1b5a60732fea72005350407d4805adcbc2fb19fd673e7d2d504b30da43501047538a14c7f7289d4aebb0aec42e17245433aa41c43eaec88f577de4861f09fc4e39fbb011a2ba759c9e13bba2a3fafe1f7d457dfaf3ee1b4085b1b670a24003a21f6500477826a69c377a25cd13588e8075a2cccd0cef7b5f9748ea9b00a128f1beef2d47cd052bcdb425c7e3cd9080df017ac5dc2378c8f0a524ad320257d57d5ca81e05276f33ad3ad0a0c98c2212a3591805b03f67feecd8430682bd1326f4a6e131088b0fe01a219724e276ce609be8b38fee18aa69476ff366d8223c935e7d22d57df40738c119a37722d5a673d00973514c2dbb515b5b4dda88bf19ee610bd65f0d3452ff4a61bcacb485da60dae12f12b9f9112b67701ee2fa5d795f602fc4425cfee9f8eebb176d78eda0ddf931927d03d60af6fe214b76182bc8c392965a9b04066ccfc8cb551f812b7afd874045588ed61dae8027badfe8407b473c0644c87bcb4b4a2b28611f057c94b5b874fb3df31e93b14e0bc6ebea0da854208f7656bc484cb0caf50457c404887da67ecf986191a8b83edc5fe40bfd51d7e72778cb165a23fc1369badf3134d6ea5b047291e3829a97666633a867d879c6a6dc1a5e98a7775ee479b8f04755eaa18fa921224563d3f50203be0310c180974f6483edf47d49e5f777b48d68187b790c4d66b618406984ce6ea0f784c8d0f687bdaf16c51080970f05f1f9470952ccb4c00e175200deecf33f4a4f6cc37896158be0d759ebfe917bf7d973f05bcf005e20961afadd84b6c05633c0a32104d0ce3c52c7163dd9618a4fd937d4e1dae1161f2c079296ea9f7542c010dc423de84cd176acbc01403eb7385c4e974e773d0a011dcf9c19a76600abea0feec60aeae7d69396860801b8fa690f0dc72e536fa6825b54755685dc03259f83e92e255c7cfddaf7da9faafbd48304f7c860f5c79590196a255c5168786884c012614a8ae8634b23b3955153e4b2ce48c1426c8f19c43c99a3f451434a5f80c9e6822c51147f8bd9666d9e360ef8737ebe3d386bf4fa8371c07f9eaf720a951d07a5acb60030dfe341540a6309e79668bcfd1ddfb8b0fdd472dd1c91dfe617ce100e99e48ed8aa1d7fe65bf8d060d307672af082453a953b1c3b64dc5f3b90f73ea4f7d279136b971e7d0af1db69b2efd28dbad0a8ca2d49c214c011449c2a1e89016f3eac2fceaef671424c10a239f8a8ca6690209b78042dda166a61745d1fd6dc008a600800d74023250dd22ba1cd4a0592d467a0b592600ed98d2fd8bd84c3f72e2d2cef75016d2c0f29827520204fbe4212b2eed432ab3f5b26586b9fc5841d83e58409bc43844eb4eb3ca4ab516d905ebcd9bc467ac96a759912f3b39735042baf60d6b4af70b767ba156b8d20040b74b6a5fde5b9304ef6f6b09776ab4b31065ca350a366d478c608cd2a66deff7a8e9f54ddf3d1efee72fb26b39f369766f21294cbcb34d2fc6fa90aab0fb369e0bfdd1424acea08265505482f3a3e58152e17cdde0acc3632f6b47b81012c6711a8a86dbcef8de29d84b47319da128e077a7446fad55eb6c0b4c1202bc45d5480f786364fb3b6549cf8b7f4c035dd96e99a4a1c05105c9fb384bce07b04d88e0a7a64e4e4900ec8a2cfda1aed6919fe75ed8890cf401313fcd6a21e48487d63a4142b94d91296a52c7716afe893975589a22589d7f7c45e1d6f8b22277b7c6c08b7d2fbea5dc7d4cee1c2464d8170958b3c5601907802f2ac270ccc4901d36589e2aa030617dff0fb850fe54dd8eb6581ae2e00f5a102be51388db7ef07ae80bffc3cf189b675a9bf83c68c9de6b34757767b36a2ae5a9a97bb2318586602015215d092ea0b9d5b4b0e2971dd6c9b880c87ba279b9c4cc8a33bf52d3e0e0de8e63f62abb6698c4c12e041c15f822503e4e186586a0e97f344471e31cbe1c13d9081aca47cc83a59c9898bc7014a581c9fd028ecf74a5778cea0b644b1331423738f3c4b2af0d7ff5d9cd3a2e69753d794554f5be541c04e39a34b4fea80b665cc36c552823fec3849c13221c842406de0cf2a0bc43f472dfd9c5b94aed95461a63da4f4bdfd7a5e5005983f46311c28d00d7df1ad4937382867bbdf086818ace7a323d5557d029c2175a0bfb59d5867190f5dc5e51a5db39239dcbe95d751e9c1ac5f2c4e882b384dc7b96f79b99b85be812d98cdc1f13eb39088683b2ea9b51da7a423e041d5ffae52feb95cabc2b21cbd4a3be060380d6dbf1add2592e97e9d80dd9df74a7dabe3655f4ca467334e82ca6779742018ed459466b6e813f20c915585848d80beb1d6c6057dec1c7807c7bdae113d9bfd2a16ea1e4d1b185db99441d459c4f6e0a05e41f4d81fa899ace98dbd829a850c31f68ec1da28f2b916e3cc57f689e377cb6e66480392073603f0dddc44c9dd80b4a4025f98b66d9612db2c8ac1f5fc870d6895d97bd74964d1eeec08aba88252d29dbdae1024ce63d304cb7cd867e6386414b759c21423165068910180beb442e7fc5b5d3e88da387272a403bad8aec719f76298ed860efdae665fd0d8461a253a0ccb9b6f53b4d4172670da886776d711859d7a8fac1867246a6a8f029d3dda30731e70034738708fca1f59872207e5a8d5233f6ad52f1e19d62eb97a5c8510ebdf03875e25987f31e256dba899a323a44c4730be0d1382315ba304eca342438b324114b03136567ddb9248dd3432943af0f8e44938cc20c6baba2fdfb1cdeb1e518485c69eaff49eb1a30b3041c85d2d7a98b5b02bb4f1809f11f95b0c10b2ce0faefb6c42b14d50ac7cdeb7e005c0d131260ab08c24cf31eb4adead01057e0c04923c8bb0c1be66d6bbaa1841849a0b5ab54d52c6775f74cb2db16c9ee411b6aa2a4728d0a8f210ca5cbb8a9325af32bcd27fcfc9c0688eb1602c2c6bea5f7a3947ca40f7ec0903caa418628a5e5319a76e9a867bb66cbb0f9124b4c7933db048326bb0f8786daba79079a6064ad5ad72f249ff39c64fd56d3351e3cd29a489e71a29a2cb6f5c03f644ffc45575362c3684199f9cb569a1f461101fdecf9453f8e42d028c7ae1709c13fdb3acd69f5c70bb261f7263ac138d5f6c3bea6cd7fa536f7d7fb918cbfa2a7c63ac32f3c13614755ca1a5a99c59617eb707076fbe6bafcfdd5381dba2502286f1f31f0d0f236950b30b2760f12a5ec1f15c2771db96f8ccb70b7a43ca187fa3276776b5b9a9d4978aa7a154af84fdd8878b3a3217bebc0825364202206d9e320051f761da58a05a9dd3aca57be5a64b7d5598111b34aeb0bcb43a9c60b42aaa343f3297e5ba0e39ee07b52bc5a52e5ea4a681b411e55472cf8f92bc8067f4a92564d308065d265d663589aa6ea2eeecaea63e21e985077572e1e04c9085fbb943a11891d1ab15fbf9c834f1fe6ef5da6634ae59d431393d7e2991e67f064597217245c981e03d717646376aaaaeeda4c66ffb5c0817edbed511ca070ef8a635cabc43d718f716af6cc0d3d5c93e6633d0a890a2297e1b3e2012eaa83eafd37706b63f9b28fda5aa931b9cfeb587461751e70295596bf4ed5b1a85b334b3a6ac8a670f2d89df6d44cf46bea7c6ce90ecdc7cb113727b4f6248d73157f7cf01392cb9fb37ef7990684d7a4861d90a6c5f23b66dc38187d2e4300366c2f105be1143f6b5eeaf42e6400299b16c86111aba336bd9da422bc7774e98e250b3fb6bc2b699535981dde1c5caa3c8f0976ff7f1b5ce37625c097bafc5d5f5fe5aa25dc4e745bad3add2c09eebe740ce68d8e7388fed6d1fe99305d227d3db9c5e4e94601e569a09162ee28e1ffa782eca1399d99346861d10f61d7ba345b06f7eac794cce498bb6a15a0da653764f7391357f2f7fd3eba423cde2a99f4da76a84e4f25d7c31785dca562f2d8ddc1d154168e42eda906c14c22648994c3ba6041edec6e2c1ea404c70021edc0209eb13366f82a34b81de24c7ec97a3e1a5071e3e27b7b5a36a6027ed8060073d1af51515bf75d6a0fef4efe6ab8451e9231d328fed2f01ec5ab1e83b643d0e0430dbea4556f7643fb4cd6d76eebe91ba0e7a32c58325d1a1f0a637873dd952062a17e1ee830fcbe75e3398059fd2055bbfcd894fb7401222487ae91741b7cd75a7959b7f1c401ccf4e065b3932a7ea0b4ea58f575b6bd6b1407d4030ba7ed7a466b09804c322b5485748d1a434107d2f1ee85f3bffd2e6a440453c032bce93bb003ca630f4b2e09540cbf123bc10f7b968b74e1b3315c354f6c6cdf76e98c3f813976604ec61e6e4aa1cb15a3da34d69b4e7d6b051468b6b0a1d2396eb2217c16a5933f99ed25f673c00753062409f18b08e88f7aa095d60be8c010de47d3fa77b6de88a3b00e5a264aee5896858a19e3b5f416ab3aac7899e480306a3a4007a358e4471d942572476270127ace6072643308a3a5ad135914c53c2bac98039ac25829c8c7b346a300b4a6318e598776448495bd8bf28b44edbc503da095ece690422de478c5809164d8e933f5e58729bc3345d17810d537512bda326a8f8f1060180a77251ad57b385d91ded0ac6fc2960685186c85ca13c565923e8a9c81727cc0184b709792d59a3ff8847002bb7369225315f219a46fbd1aa6397b95eaa8d20a9cfc26c28a44c89357a40721e52873a80c06804c4512bd2a3f3a5815b593ef28d539b69810dfc366a4435eed1d820a6fd11501eff4db9e91dd9c693d279084dc6c4c74da0779e4bfe2ad27ec93d564a77360a0f3d0d1d40203f3f94978ec061ced8644fbd4af9a8b5bfcfeb00f35b5143e2752fe16076ee78e68d971162d327c81993e587fac45a2d9a39a3341bfc28b3900f72e346bdda2df77004bff393f9a5f9c21c2e20e79e580c36534923a83e33da381f4f0b9bf2bc0bc24e9863a907070ad80510067f23f3fcc0d2235eac2a7372655ca266ac3605e9833b864acfc09c09fa1be0a12d777f3f828f7f91d833a482e125231bc5a99314cf37e4c402990d37b3c5892a334b2c657a2273d17c712b7f4ccbfefd6b93bbee893ab225fc2b0bbd6951fc4f406a9381ab722c5c50f0737034d7fc2604834b6b374645452ae4fd4448b8cabe2b4d1a1f137ad5196a1ab2b6cebe728daf684fc7a54c2416dda134e33ab1a88864c2350f387205306309b06d9100eef93d6ed0d5d89a5049a44cd91f5735e8c39c370ef626b5419da1db9cca3fc9233c430da77ef0ab96c46a6e651ffd3dfc0750391e0f4541af77ed52ed12b25f270381b9a3e4b55f25ee124c1a148d94ed57e9cd06614f853b423d35f16f88004f5ab57974d0faa2af564ba3889bb21a35fa988d498ff17e220373b1811cb316068eb41859864c3d127c773411e84d21b7acac2780c786d88347e77e427ac78daafd001f1894c33b8143a3a1ddf5d35c9713f9bd8ea439f93a3a206069528eff6006349344f9b743a275e9a1c9ffb477fd7e41e427c0a6e01e8fa13a21dcf4c8c49645df65ab2a0f3d69809b271a42e6f9d9a3d912e0024fb8e791c2e551114a018f93b6cde55007c6ef5797a65c7ab9fa6667c5feb204bde580df5014febdbf8b0a52bfae7034225989b85c8df813a30901beb8f03c2e5cf1668181abe48c45be705857467cd4b562fe92bff34467bfc8a83d583b5f1c9c0b16bfd8b0c0c7a1b01d85960c3e069a00287bfda3240753a5e3fce24228f17b0ca6719bad148e5b78e05bbb705a33899be8f53ad0a9c5119a1b5aac9e355302d079d355ae69b8ef55b8d4e8047826c8d8fd29215dbfa350af3aafee198860c1d7c5fd4a122e7490cc2bda31009e6969503d6d75e88a1fd65ff9e5317139f7317ff0e586c6870c4728c26c077696470edb5024df53b5fe419fef1146dfbb0a528feb0adfd4e42d62ecbd0dc72d1ef209cbda57978a7caf11ba74b40c8d8ff9be1fe1e20dd02b644c0df662bb7b505c25f2bd9e729619df1b2134c3039616a23fc1a1fa7cae77f55e56085d7a643eb015878af23e4ccd25cbaa90ffe4ead5a83374f10839aef5d6d07d076b10ead3f47abb3a2ea421f0b20e5244f3cb17db46f2a9133deabf675c7563d83c474e0d264d12250fde8243ddb9f0098027cdfc6583cf9e3fbf016a1d79e0411ce532e9075f3294e1373409c08191fbd51b287840248416c1cd3ff1f8f610c443653de77b9514f1ea3fd021d92413be63dad38f1c7b95b1dc6a53802055bd13f1d2907c5b8ca021f24c659d98dcef6ec1b91b79e650fd82bba0c846b5e19721be70b1d2986b002726ef8b4321fd998589170b79979516efd5ec41922ad4ccc3e57587d1aa5930cbaa9cc679821a6a3394b69fddba74f66d66b147a3b66d1f3f219f0dff65a1074fc47fb93e54976c555845c6bdf80cb1cb732ed6a2e174412a35ec81de75cdea6bc0f364ae174380bab43e644a6e226665e89766be36a37b931e58c0300b617fb64cb0cfdd60ec829d33bb0e2af411faaa22cfd9dcb82ee0cac9d3576db1b3bdc85f94e1fc4b7e961705b562eb6ba91eaa7a6b7503ce2e375a5914447eb6e7e099de9e31eac2e714cf1cbb6ac6b5b1233e8350e465356cca85d5642bb1124278b739c3702bf7bf8c358d857424c9b974b34a74f70712758105f2f5129b2441df0de07a4cea490831abf4a82ed4991954c6bad424ef4e07cb8b099d8637c723164c133a319857591c807a5cda0adb1048c1c41dce477c06d430418cb206162eb9532d847ba86f45078c7c5aa48beb90eed035c7988c4ec17efa07bb996f84d7001b6365c5ebf320cf99dbbe70e761a33f13e73b0e8e293c2f5cd677dfc8b041bf3cb12a443e7b0b7e87b30a089ea4b90b64432997b58add0a94557257ba1a826a31212544cd5bfc491c4e8377e9e0d85ee95c356c7c7e835fa2836399142390f6026abb7bf18afba94bc31300bfc2418125baa0216a5165098cd4bd65f06a003a0faf0e36dc1a85edd2b40de03070cb83ca386e4e63703121b1bced37d834da8165a83cd6a677992fb398e738b26df96405a1283884b2ef538b9cafdcd351e5129faff2e4c71821b27aa93e0939688a5a93458671427324102bedb7cf1c00de7c482c477651c109c6266faa3425e4f22913ca0c176d8d71b8db644e2f8275458ad2bac3f0411d5620ce1cc7f8d6b5bdb4def75ca4933bb2054c484eeafa5d920d0f71d5cc40507b88429f7f54af240c740066e48059607678548301b096d2de72bd257cfdba6ec6d996497149c472e1b3b89214652138dc53125111b8386bf8dcc0bab5b4817877e414b39cfb134476e70d73986d95fb0343f6f415ca84eb56ee0adf76bf9b5729dbbed1027f08711ee5d3012f699239cf22caf43c4a331bfa6713236dfb26ccbfe4db6f626f272f352400695fcf856d6443954d7adb2b047736de754b59005ea128990ca85ead257101b76a48146788b18dafe87b607d5f7c01e266a570b4aa9138e441b2a9432e414112a11269b6ccf50da5f137a1e50ecd2742266e34e56e2552465823581c0e1b426a30c38f93437a412b9d39c00b185ca62567c10d17e95b57b14090d75420498089afccc4b2d9997d2824f71c9e54786df64275825057cf691262e91d8b4218a96073ede460781cc219218ce8aafb2d74a5c57acbdc27746b7143c2bcbe6017ae2576c428035106f2eade65fd04abe14ca931a713bb2494583738809fcde4ca05423588145d050466845cc8cb9684c15e0a17714c017245a9cd53912143ae88e9568190505410eec2a8dc888fb15ac35f0412ed4f0291e01a802fd96c7e7fed50855458872c0587a0d39b07b0ad8a90c151d633ba285c2ab9036cabcfd9126e741bf16cc50212548f38580e58a8ff0a098ddffd854c40322e938f7fad8a3468bfcccf904e76c3c2c4f6a818067aa728d12e4466370aa3544fd72bfe06d61ad34fcacef62490eb19e873e94013c671ae6667aae6098985c9754a8135c00f816829376b4308f3b7596787aeb917365df41d6610ae3efa7fc94edff8a4bc0609a48b1133a295645c3c8ce57b05b6765553606838cf84f777ca5cc9d34cfa1002ee5fb0ee4f06df6984ff67795815863149130847c288bda86030fb7450c126886a936270f9c185548921cb88bf7e04320bdae03f63ad0bbed511ff5bebd4aa8028e77fa20aa2dc73a8a3ce0bd5a58c6f67900ac47845595645b56d68a80c08a662276b83fe5b0d7b6ab764a43e783032c8ffc2509293303d51cdc17931c1fe4048cbc2b6727a8c70b465c4d227066c4d7b9bbb8b22d1c6c2e23c879d50b15981d29b5651b8df040569269650579727098c4f9c3b73fd88c5c30b1ed125add2177724a8f894fb9364f2b466dfa626ae329f33173cb4ce50e0f0a497ce3a484b844e8d5ea606ca362dead5b63423f9ff395504f72e577c3cc64f57edf6f9ed98c475eb29da21bb5df432aa33667209caef10f19373c85b5182c6a7058d1d60395b7ed30fe63ec257347bcef0d850ecea95e5213ea492ed422d93e24fc51baf9ebaa196c07ecccbef397538e5d85fbbccc99d66342c38084faf94d36b0acb334c46a208f58ab3a4f7d0f705039aaec096fdd6992502d594bf597a115687c00f0c0bfa70c06f5cb8ebc040cd5fddb0c0d70da66a0100ca7b8e405b452af03cc1587089e78648c5d6c346b1a18102fb33a75419e8ca818ec1297e20497597d999ce50da5068e0807b9277ead96ee075a5c0cdeede3df17fc32f089665d129e091ce5f7d90ea6aaf73a94eb7717ac17c62118c30ac9cc2582eb7c53962840a1a393ab3338ad80a63e6d3154fb25a161a7f17046de8c63dc4ac8c92162760166b42824abade51dda4006d960d42a459f0efafd65967e6d213d11173c1925e35c6ce4f383ac067f2a800080fbe81725d329e762b1360042b3d5ebc65e9b4c722ddc5ca702ff0f9d7d5518adcd70fd6334d0f0eb5a65ec0e7b8ceae56c1f78da9914f80fba4b45489b45b6d48ed52d937acb7817bee94e77932d7e32e7a9fa38338631de76e8c05d989ac3c8da3cf3cec92644e65ba5cae71488fbd6b6e72d3c62f795c0c42f08dcdcb730cb50ada173ef76f0fc3921be95930f4db10e786bb08c463acf3416f1c55d0eaf67567aec58fa3280a9bda95db8b658df161e52d2f432541dade8fb17219c01a515126e95685a173afcea19118c5b402197374cc45119770363199ce8b21832cf444810ba7e0cbd6a375a41dcef2d9fd3f64f56054aadbd46a83d07ffb67256f57cb8f8421f8d66178fef69d476a31a0c345846889c03033c4802966a76588867fc069d79c9a4222d0e9cb8478b3ee774162c74667106a9018469a9de2ec2a0fc7988937a3b18cf34b13ee71dbb518dd39fc204dd1cc950d6744d7fa0abc3e87121a2660b38dcb9551b7ed304a8751dd87700d8c5e9e0c266b6417b4ca2cff3c3755a1cf9a47e2b5e2574875d744ee5758b6cde0d343c7d4d8e17080a27b70a78a76d59a6c5265c7dbb87fa07b39bca0ac907f059bea5615329622e3209b753b40cfdceda510ed35ad4ae0146dbf0f7928ed8931aae46116694a6fdafe2a2b23282a29476c74670db86ba99e3bcfd74ec31f42a13dad378b48074558f28dddc1f32ed9e669496995ce4949288125f3879344a15b7dc282858ed442d9bb1951a89c230aaccf75723f49c19612226a3eb46d746a9c828f37051eb0f0f9766a515db7c5cdf2a9080b0d1cc0e4ff0f0015f1d1d031a53dd13bb46de1da8b14bd4d88eb6cdb76668c27a0137e1814e1b672b86aed44bbb41ca2c9c94530746e43849b2b6fee13cf96ded02adf7d8a2ec13ad6c40806d3a130bd596c7d4739c19bc89cc5bb93909ea9e85fc83e83f71b81248b244540be6a815b55e874746029a3b2fa1a58c04429273fe24a2228fe424c6f854bc6068213b1513f8024059cd8399eb59e65dd076b3523d80528a4a821c79f66425f193e12a2c88a62a917f2c010f71a86a04ba35ad49a062cbd77a49033eb3e78ebe8d7da0ca50a2c0577b41c6e693e8092ffb3e1c4a0c6afa08400c47b2dcfbd254b24565be6011c538080b1ae9e53d2db87139fcf04f2c37ee64ab3b715d673655e48c422cd7d918a20b5a6d513104bd31266663d251f5ee9aed9e026fc2baef95e1a1fb0d95a51ff5f58cd0d0caee49c14ed9ad10ca3ba284aec806d936dcf8beb95c172e6a0bfa53fc101ae691587efd2a8e057073cdf3a00aa6f9d05e7f4c3c79634b4f7f23c01ec34c60bfdf49d8e5b14f328a6993feb007e6fad591ae99f9755eaa1ab904537f55b4dcc102f6bf3f636e2b34658454dd9f7a8811f9b415fbb8f2a95788b386e5183a993601ef59f78be52b7c4e13e6bb0210df4d5bed98d43d98a841d8fc9c1c2ff4100de51dc2cd3ffe25f73294c17c5245f8f58e3d36e382d4e2068cec2d7b5f2bffb6b90b637239c5bfce57cecbc3d83c3b72a3e663a9a8fb44638257d5a13d89a3acd6b071415ec07ee5f38df5c3e8dfb420350f5743c7cdb8d7f004074962c15ffe025d8141dbef47964fe5e09532cd3e1e7c32c09a8a28689650fe8573b471aac47d87a4003c2cbe1e3eab3a3048b295dfccf505a9363b47fc42f1d99c8cc2cf02744a80f2801e865dd4c9daaa2fd4f7ff84770ab553eeba4e7985f637c7c45f6368f4537febf8c528706c83ff1a888747f1059fe705be114c915c406cb4cd9c799ae663c5b29bfff89fed2b3e9dea770573bcf9c2e8ed5eb27e6d3700eed5a914302d41e4fa5015d67743f15b1281f5efe464a7898c5542c794fceef4529102b5b482c1ea5627edbf53a0ce50db0d3865ebaf0a206bdfb032f61b38817a4f753f3e9be27aadcf47286fbf71210202f4e6a9c31f8dea521cea2e404cd73cf5fafd69505e2132781ce223f9a12f6ad49d43b70035e1d61f01dea7b0bde9274c276f1efa2b4195c50748d1fc8581b34acdfcc7739014fffb3193587591e4db6a39f2880e1f1be9949fb44a502f649867f54eac012d76b9ba3a7a2cc2c85649dcf55d2bd2cc9277f9cbbfd7dfd32aa248f2e3a9e5f3d3855af14ae3c3d313e8df3524be0f09c4137d3f2e9112363b29e59e936a8329d40d1f858d14d40c554e043bf8332dd58dcceed8f96aa3571a84f52768ef8b54bfbc8699a514c801160bf7d453501b92ca0395efcfea4b633d46fa4f4492477a0ba4902b3fc3c813a89efa74be17ac8aa078b488a7e348fbe9b48579db1e0164cdd2adc18dcc90da015480d2ab0b4c4d1241ec58096fd861be5bd479ef1246f90bf7da04f61759af11d00189ae5885cfc834a5563fb4bbe8971d2f7e74da956c4b38bb839e5fcf307d31d1758b205f6f42ff480f76694abec71b5cee65aee618a683bf0acea8fce030b651f13f91fff0a829ecae99cf82deab103afd4fcd3cc7154f1f40703a00233374367313ca4c1581dae5deb7403f91cdf5f2aa3bdacbfa93b6bea630760f55965f995febdec524065f971027512cf4f971ad9ac7117dee838ebf3f10da0210b10b862fbe804f08fe68fc730afc176632359a28a262c3edb428a4b9ea07f7c41a5da4042cf201f5eb66e861178fe9db81f75001c67751277b2c26f967ae2aad09f55b82d3a92cef7e115c99b4c9c5f6315b9cf327fa3d2380488ea8d081950e78ab39db3ff91d279304eeb1b954f63bd6801d4fabf41e91ce12fcdd895f21147c89ba0677f1f8200fe9473a3e5ecd74370c6d1734eb49e7d7e4025dcae9028a02e576d6ada379b63d29cf5126380810646d6ab34ef3aa3a42c0b39ed55258fde70c0c8db26b14690a3d8b385461a99866984a715919bdc5e46bd2cfe35a7b8e63d1f73decba9c4a479fa940734da5816916872abfa799b5dc6596aee2e350e5836e8d8892be1d6df5ae1bc959ecabe86f8e2dcc162e2933c317afafd829558e3e2492723cfba3e7c63a926914fbc7171434914bff431cf60aa38b9fd1be4dec30cf19a4a66d2c20a0ef47d2a0efbcb6f8bae81bd38eb3a02339b262c28014e4b112519cf25c2cf3a81d269dc1c465fb36ab7d4cfccc1bbdec4152c2911f6360b8be211e3ebd263eb27f96bf01db1bda2cbc8c19616102a9bccda90598382a8cc91d419e2f9c3e2c03769568c1843ba96c7e1544a9037c52849a1b65991576ba5f6825c7df25315b7e84c94f41d50cf83114157b3322fc6445e3103a5e8939404d1f5f59badcdaae0ea6742f47ff40fa268cc26075616c259b030de7d4337a57b91aa1408b44ab6880022fb8012d8ce171cce14edb703e3ee64ec479088939d59af47ebc82a2002462dc764593345b9ff5fe24b987ebb878bb9846d6aed8c3cfa0fb944b1346acce84f1f087dd3f76bfbff4912619beba646242bc803de3fc99b7cf3a260aa320fd3b914820a6ee179cf7c791809227b9f6bbcb0a4fad121cd949964068486231c14132740ecf6e73bdf76c8757cb7f891ffe67cd481724f1e58ce138cccb03720f9395e4e7f93bf912cfd80ae0213de325500fa0393d4137510efdef1d820b821480f16013b1f11d0123e4a464abcde7490f4010d7cb8c4f85deb114bab28f5c1280bc70e6d208b2504175ee36c9dd8813a2a9d7ff33c7084f143fd6d3b7e9bce1b3c6abf732927c82fe86c617186741afffd54183f151ae5671f2ac0d835c1d044aad954e472336fc2f0ac86036eff8ee31e1d669be804b7e2c0db765c998a193fcf95e0a98a3e4e20a80ebbd0530a3271a3188b0d586a5f851ded326efc74cd9b85db32bf04ab6354cb725346d2d6082828f158352be57f677e4797820ae1210119c0ee9af368e365be1d54631de4f4d385858893b110157b55999ea1450a6fc90ae9332d754d1466406ccc026b44588ec45a8059e552ab17358addefe95a138e2b2729204e2f9fa0a6ad9b2866930a3d290f625b18a4b67dbe1cfc3a07e9deac8a9eca66333f7f7ccf3077a1d116fc69cd960c6426067cca66b6c933abe1cce89ec797d1693cec426234d6447253755badad8f57e8dbfcdbf4a7c6af72c34f36b87896159414333db8ac60514c1b605872415aba978d7fb338b3dbc891e2784d75b0d22857218132c6db7e572fab91fd307479b77b4afcef10d3cb8d18384ba98d336338a014a57b339b7506ce72d7f6488033a36633d19ee8b81c28c85d0e9a9970feb3fb6bc7c0c4d058ef8337702865613e86a25ddb7bbcb777f29ef1fe4fa3a88441d701e7a05ff656fb273af3063fbc7641edfabea2e66d2bfb75e542199aafab74667b1736012379aa498db2d5babd119ffa24e8355875d6022141508269ce8466e6696282162668678276e668618206e634609a36266860863633b466cad3c89964fa0507cb2b57b57699af900e83e830b02e83eb36800e03e81e8cce03e930880e037519b06e03e83280ee01aaae64001a388a3630c605f73598f13533180052689f072b07695e4e100a014c410a1de7d155ff0191422b33e6ee3d28084302844b98b025bcfe344c08121c4222ca537201acb5038aca5a8c59305a554d3aa949d641ed4014089c69c68c5c23b027d7066f034ffdb611bb2748c708cb6803ffe328601c19101e3def015c03500c0fa261cdc6289cad5a897045d5ab4364036aeb6646895adc92afbfdf12a2d60821646f2977d5089b08c8083918169badd1e48ed288a98c182e3dc9c37ba2bc206873708b3e46028a1bedaea182072f2fe99ee97bad64697adad27ca729dd86d6b7c5ee82b6c63cb345b214fcac41b106fb88373811c757cac13c3670a9440335328272ed6de1afd78b73bc1b9ead61431adda861a38886b15c2fee8eaf17e7300fe9e2e2b38e7441797c44fdf1cd88504b27bdfbe8c9e0944ef241360b26a65954d5076f432b89aadee1d1a22a46e9244b433a0ded695b231db434ece39f389b34e61fc9424d86d4e816bde709318e74095247cea174877499ab1e1519b0e052904f70e953255ba89d1d5913c645f40ed74a8573e8d6241434ad26a8b3588bb266d10be00a758c5d3a8bc96c0e7afb3266340c35bfb2d19d5e8674715d7a1ad245c5a5078276b4e3544916aa8c098bd198890956abd54ab2d0afe04255dd7175691b7d2c8ea7711b143fef3ab65bb2ad05d6c153691645358bfe74fb1336a389189d5206092ab711b9e00c9356e152229969ba403f417e8c807e8274692bdd902e2c5d38ca38c069186ae290b0d8dcd1a8228c70e98188aaf96f7e9e64697aa6a5014f3acd67bad396c48d26d3dd7c2789208b3724cb4872c7d8fd2129d91a770db5f4d2e5f568a9c381a4a7f49cc83e92859ec51bcc83d3b109c3217714618433c4522f684251e3e4f00ddf14d1d28479b4eebe34ebf4141b3a47d23ada890da2a49544794f2f52bd1451c517556c55314e9efa4cca557ef2d453883d6d553ed8223a57475f8f7ea7e722364211715057f19388a37a8adb20e29c8e72907da044d455620fe92944224eb3e1282211a7a97e12734eb361a779083151176922e1c1a2e699309c1e921371dae9f46c346136c54da76f1e2d245deae9fb08b2857df867b686882cc6f62104f4f333a4737430f48f7c44c2dc443539174d2b984cd349fe3158452e41b949ec816249c41e2dbe12734e73f11422ca67564749f19a155fd992f7983e93e2abaf6c0d8a0babea9f2e6939a7b5b0ab9f3eb3faa9c56b4ebefa4c8b94b7b82421b13d5a5c14556ded577c463c8aad41b9f815b6a6a78672f1352b6e2f692c4455ff864bdac5dfc56758fc065b93721677c1e23527ff256db5fa69f59cd35af09b872985285a51ecee4a7c0bb17974d047689fd9a23943ac2869a2286917258d85286925dd251992826d0b9942cb3f40cb47144dce997c93728ab2e2e429aa5e21aadae6a89d8e82723a5dd2524eb6c7bba49d78fd1e7e8d093bfde4f4541e75d77b8ac8454f74ef88cd436c9e063a41e923fa24ca99a209a042e4c08d9b9b9b1b1acab6ced01152444963f19eee89675be816159d6c48bac40c3c371ee2a0a03b87b6ed05bd7c550f8e729ff50dfee124260c355bf3b5a250bf348232228da04e64901992659ec54e6dc9326770f6c66ccd9f70903b3f9390ace9138bb95c2cd68f9a393051a91db206fa1a03440d4ba359e2690f1515155ef3f411dd4252f27254ea3056f40152e8a7429434942869df8bd42dfc8b54ee8e7248862684aaba2d6e3f25143da0c2125a488308c4608446dfd2a38e0c54ed690b4ba76872d4acfee920b681348b2640077564a0be99309c9ed389388de5f42c74c3e9f928c551dec23abcc330173839a7b19c88d358d487d73b3e6cd4c226902cfa190f4e309010e972fbe26df09da883bb2700dc85b8f21662eb560cc051c4ee2df24d018a3dac55f55bdc8676127be0f01b44fb16afd9b758dd5a1c224eeb49f11ef00617bfe13634abeadbdbd0724ec3c1b26e5f639da6c5596f5bc3e1f6d6d2d8e3701bdad7a793ed81c35db8b80d6d0580af5e03c057efaf56eec2d2b8f8ca695607c06d685654f573b80dad85a86aab8ad1ba7dad75fbbeb5343d6d6b01780e96c63e00a769f1d66d682cd65958cf390d8773143788bc120011005e4b94b3852276978583d86c82d6d9d94921ca8b2276f724cacb3ef406d1bb3918514f2c176119a7be577771fa1b13665b7c44b9103df18724aaa495682d6e3f7ad785a8eace5a89aacee6a8adeee20f9034179606355bf42b6b43bba4d98fac95e5001fa1f57497b4161f51b6c54bde4254b915c59b3eeb4e4a966ac55f6421aa882b441b44069a2d7acf081f352b8abe113b2572d16cd1ab4439e94b620f95a78839a7a9384ac421e2341544973ee73415cb3064ffb8f41409c9a2a7dd95378512254d852869b27de46044e5ec2cc6402c8835cae6a44d72b86bb368cc647a91af0feac84080f04fb7cc53d58b1ee14daebd5289db1b8d090bb902927726ecfbc320cf80804b3fb24e8c64a10fc58dc662a7f6dd6831d2c5e4f974967d065082da99fe89f531d2c574e93f09a65e466af7ee0ce4a47b9681348bfb64ca726ea61e21c94d870089f5a1ea6ebaa4418079668bb356d559558cd24d9f29dd649af9b8d0d2982dca3e660dc9b223670ba583800f5c4a3fba2ecd8189bad9934da5a03610b7055ec15638ee2b2f9332d479eee30af7ea166ece395f2b34eefc8aebd5dcf6e21642ed958e59e9d90d833bed582912434b10810a0d55a19b7958820494aea8fcb7534a65873d50d699690bfdbfc4077e67934105ddd0c995434b78a1282889a2954b368bcd62cccccc4c29534a69534a245b99bdacd021254c4106778c1575284882177aee182b12628468280d4542288dc5624af041ac0b45ee182b0a1a2a0211452b572c368bc966b159aca5bb25f38bf5158ecd5e88f82b442b2f44cc432c16230d1509195ae2c71111cc1199ae1c4ac21ab84d0946b629d05a4429a5cc4c29a5945246c009aad7ac7ebde8eb4ecfab3320a0144500156d60d002cc28b5400131ac21c81d655015869280062a54a2423724e40815ee288198f012f312d3ddddddccdccdcd4c8db62e0851c3127794411f98c1cc609899999952ca4c29a54d816ad800ea6ea059d14b114c4c119d01010d0d150174e40c779440dd0e983023169bc5641c9bf12c268bcd3a36a3c1b13b8d64b31769d4dd4d149b311ad588c562434a78c2a5760a51c318ee186b0275c95e5e6260625e62829839e6052608e62586ce9798d96b4e6934ca267ed0a01ba32d314a29a52f4141434ac84150509195d88c6730fc97664deecf5a84e9f37b7a30b3170904d3cc331896b1b61733b3805eaf570b7f265bf34053020d2d11844b8138252c01856ee8b301b73dd3c79d3e3f0870276d178b262a6936853aff756077d3377dc3edd4eb430e01c1be912e7dbbc887cf0fd02df248eccc9963ff7414f347b338d02b7de64c3b7f90ba892742908de8b4231bb9ad37aa44aa3839379e473bcb7d6018fe2085ea63c2484e29a97b37d13012db3fb345ef512ba1b8f43381ddc496731f94e3b80a1e09956fd10b3a7dec58bdfeb13f6ca70fc942cf83650db579e85f32a8a69913eaa0ec5c6a0a7ba09265fe233195246ae2b3e59b3e820ea94e700c0808e83cb6773a014078740349968d81a48ba9777a47bac0ee36efe663e67dec1da2efe067cd41bd038acdc34240bd730474e401f54e13cc40e46e6f1e473cf8888fe64927cdce36cfcea6da54d3ce800f435b53da685bdff051b3b6bfaa50e9473ee292d8da9e83ef2881989a9a7aa29ce53054392bb32f09f4da743c23943564c890497f363a29fdc174b63cc3a5434877884bbad09707eafc4887301d424f87748b4a6e2c4954ce32d190d7102af7a321d205c6d57b3777dbe8f7eff594aabccb004fba8cf0a52aaae8277eb310547949fedd470687e49f2a06e9f533a4574b6255277d9ead81af3d3c6d4684ba63c7582872ce6c6d27b26d2c402a25a2ec6380a33af290217209321c71b733916e2192674882c7177abc00086230427bc9abc2453c8489e6587339eb922cdb57562b5a449ba4856d136ac27291666d456e916d7ea3734e21c9b2b1907499dfce479030a6821017612116922ea6e622b40e54ef5d91ab9ab94c7755ed343d638f1ca6759f59a1040f6d032b94e0a175b6a63bc97ab3b5ad5082875662a26459b3b519000788b6bdb3cc335b9e2869349b83afa42618c9b2bdb0118e065c79f0e0c1d3b24fb3eebcf87375f4e56f30e813786c77641e3ce419ae4ab7a8a4156eeec856b8b994877431cdeb0324e4f3339b28a27a3ac31c3c87b86c519b3d8128702b02ad1111c99071c44548171da44bc9a5670d4817eeb4cb6994ca47e78d102dd21c0941336de850b930b553ec8720f59b610fdde43acef670a7016ba5ef25cb3744327e90b00c705608c9424feb40ade9a9211d7c4d8908b5a6a7063ce99ff9ae8a413af8999e1af8ef33252cdc800b3350c1cd0d0db43f30219b006395b48f07087e263c68c1d7901ef66740bea135ed238992b6c3e6723b62b5af038988e865745d7badc4568c6c5dba828f4fb72865a10400a923070d096daa17f36e974fb8f20cf76b9012e0d21046d73e4dd4964fb83b48d36539296521957712ff4c98cab3b5efa57b9e2d59954753fa67559ef5e8733042ed2c0f590eaa420dfa5e3a043e7b23670b024258c9734eb99936eb922cf44395edcaca75c46a73e2eb165c59f8a2ef8b64a19e0b0995c5928590dad117a60b2359e8590881d1e19a5ca6c1ae1054f660dc021a6dc1156700d12cfa17082a0892febda67470e623fdb37c4371587207d24b224e4e8c46b22dd9a227c2a3e110e0d213e1a249b9c30823c08b74e94b553e70efce59dec1f645b2d007d5cdae545836e0d2606408bc156dcc2ce94a6c64deeceb75a927f33ccf93bd288dc9b64db6518e523aa39452ba514a79ee665f1b1160c8cb7574d6aceddeb7b395358b8e32f628f53c4f9451ba5d46a9d7511a6b96ab5994524a69dde810a8d09cac395f332b6bd68b6c7ef672f996bd34aba5fc94534e39bb9729ce64f3b397d953f632632b2b57bf8550db0544bbba6777cf4683dcc491bb744db652cacb9a35cf5bf7ec29bbbbbbaebba57cf7f0296333c9d9d3989497524af9eed90b11918c586c361664326e33e204176d5352972c368bcd3ccff36631592c269bd1199b6ddccadd1e9bbd10c562b1cde8725b11278429ac2e83ddc2f29f37caae5b5dee1cc771dcaa4e98cbe5e2ece6a21b58c2073836c2cc1cc771dcc6fd356b16c7c95e3819f720482fb5d6fa229bc9b8cb662fccb217e66cccd52c598d6e01629b2133d2c412787089e348b04f648f4997cf778544ba675f245136beee4692750bc923914827fdf3441969e3bf623252bf646c5daf16596cb67dab4dd8eb75b76f6147a6e008123b29688902235060043da3502814ca1d5135264c553a0ea595ac0a071fa769df7b948e924635a48bebd2dfc091438710dd3269b3268bacb3a50307ea76a6dedb63bb79df1ec4761bcda21bed1a2cde2843a57da35bd852cf43591bcda23748a2bc5d83fe06f5accc8b4c84699614224284c8a54290cd00820ad5902dba196d561a15793d8ea46013e2a7593d045ddacd39190ae962bae3bce99c282e7d973a67c24ca7ff58b3c534aaaeeb6c6836b4300c69ea43b09aa4e9a1173eb4aa4ed559103c68696c682db29164a19dd3d7c45df78f39f4404be39a2d0a92bc5d33065fab072b0950ad3eac257d1982d5d2986c188a34644844558c302479f8ce961c7cd783b51efc28871491945efa27ace4fd19aa62984ce14d242fb134a64e1cab2a06f8f035f0613d68c187b6ce5627caea85375d55faaba82ad91cb57a90a656d6f85a1aeb6dc9c29285e94111355bfc10a85b7a10f3d9c1478b47dc29e9944e92b0ceb9f4a4cbf7d2bf205a0219a092de279d34eae06edffb87a253f9924e4356053d06ab680a65f899fad0d6f4d4c29b5e037a5dad243755d6e5cf985e5f6d0d89651d06191443ef424199870420a176ce84550f558f629d1b5d97422159e85fa432a5e18b7919308f5cc9c2b2c5ae1eb47c441f293c946969faf0bd3b8c4f07774b76ec63a02b89a4770f24db968db6db390cd4dde8ecd07cda8864a1a76916edeba4a061d2746bbb146a56c77136013a08ffd14896ed1f0f46b5df4574cbe8e1744b4eeb8c1e8ce99b0eee8e17b0b9a49b74b6592b0af5b358ae8e7568a48b097c91dad7072e085a225d960ea35fb23ab84bb22347ba673a49349d9b356b9bf50dc9b26d13e6ddeddee66de723c9b23dfcd7a4731bf7cf72a4730f827ba7764adfb66d2bf10eeb346bdb389eacd3300e4792651cdb45346b6b9c4e4661c4d646dc6d7b1bc13cf4b7b710eab663e3be711bc7711cc73ab2b57ddbb86de3ec585987273443739109976032b345b9b9e69a6baebb6d0f9041b073e1bcaf1442ff8aba48a88b848426ac8f8e848ee6cf0c32814c9fe97374346f7ae614d145338a7963fba8593ca3e099b5929b9c4645ba6c134ba322d91e2a2e692617fb68de348baa106164c41251357f724943114d8ef299929fd89a93971cc5d6f4d44e5ef21a9a9e1aca4f6e4eec10297e72148bb2343d27b686355b969683116af3a47a2a1fbcc94b4c5ef211c5848995b3c4c658499c589de6d1437a28da705d072504955926a2a4f1d1a4d1e68e6e99a5cf23bae5fbfc215db6279aa1e816b9235d60c8cbdb07449f6a504d5ef292059989b6cedb69c2a8a885843c8edbde79deb97796a6a766f292a7f808c24a4e8e72937b9ed789bd8383baeda86850ef8e3af6918e8a0e4aa833070c793b48b2f41720857a6a1e9d386f60f4eda366f56de8a9a5c900ee77ee74cb267b9cee7d3cddc963f27e8f9297dace1fb7df39ddc259b0590c44e8a788b66c41d2455e9889eda393bd399ab0a9d3adfed4399ab0dee956bfd6225448d4d6c9e1a3a6b47ef3f4a6e329519b67005ca81355d446dd3e90ac4aa6e4dee5a53bb3798eeaec6c3f8583ba710ad1441462b6ba03353d3064076a7a363bf6287949c94b7c5cd26acc568b37439c5ec32547f9c94769c404ca89e51f1f499834b5de4d3eca23264e2cefccd60f499458ca3b453420925651c1c7713797e3b81650d49c69225dfa729c0f2347448c8c9e9893a3b81ca5f443405528c0e54ec5ea83eafa4a33e04bb6f4cfca49daba0d7ced3b686bdf67e56cd1128906048eedab0eea76be4bbae448970f48580b912dee56b0c216b61086308cf228077b620bae5c0207742e7311277e88c82568200aa22570c0c7e538ae930213914e481736922c5c034916ce883ab20fe380f392a8422ec747a045b33d2c7c32c8c506ea76157d48bdd7bed3f4505beb1e5a1aef9dad219d3b4df78f7b4de9db6d68345e13de7b277aaf31bd3b028eaac9aaf8dfbb87f6de69e99e487ac7e8d87ae876ef24ab9a5615837b772232389dcc9da72275dd29553d5ad2355bf2ed9a4d4950a2c26ce679a3377b6997ac5b31256a3fd63974a0f3d2eed001f4e6e6e6e6b665c9da3607d03bff358e79240a06f0918b631e3972dbe698d7e15d962cf4ae6ec140df395dd4bac4eda8d9da469710320cb3984c0675aed786029e4c304f66e6e6a67d35d7dc27b7719cecd5cd71739bb2f97ac5baf69afd02c2276cfbe8badeb729699f2800973bb76d7335ed134be2b4c0a54cfbb6d92ce9662ae1c4d1e4965c7adb56c9326bddee490a76531c107541e09cd87e902e1dfb81b5426d2895096eb2514cd8640124cc355b1bb5520125975ddba78d1064e6e44b962901ee27b0a2361f44a11b4249179474d936a1d113b243015a3bb4b614094b91aded128522862a59f5e2a0b9fdf94d0e69344061f2cab5f25a79795e95af15d7ca8aeb357be51503899222f7e209f6c095426e885c063a12e46e373f77e3af391f486e1ff9910212ecbcc008c92bb19719cc0bcc4c4a0fa65f66301b9dc1c85c5b770d1b73ce8a5e8a6062e69c737677cf1e3202970ce625a6bbbbbbebba615e6266bfc4ac34eba5099806a25bba633ac63c0491481074440e548004033e12ed3c9bdb954adc5bcc01a7922ebdd7487a77b3eeee39ca962529654976b7945dea26b1d77577737373777ba8eea6242621a1f2eec83c2ffa6e977d4eb674efde6e5b1bfda641783afaf6b0e58053392b6950f9de6af60f3ae7ecd938cdd2c1a1de177ea644fa2ccb86f49d742fbcf799efa473254b135aee25ee7b2d3c4d0f67694aa38c1b82228d1bb747d795d1ac39fb98adaaff3ec7c33e6e5e743747b2cc791a399fa7cd3937abc3029d2b5b74445600741493552aa0e0b4821a4cc004489c4f26a87d963b2a9046f8fc997491524a299999999999594ac92ca59452ca34240088942c470c4941778e65cf187694e75fdca1004284dcb100e215c0954db8a9125c01a423a87c593382048d82424f07486e51d6b159ec323a76973c2f002762b2192dd9e846c5de50fc959e81ef29e0956189743959b33a2ba56466666639e79cb2a483921da47491dd2577134beec7607f6c5dee9748170963cbdfe16ee20e57863d802aa87cd9415e505285ca2a7a2a98e251f932061293a2fa8492b3965e7d81c751a0a492ec31bd3a8b91519b4144c68cda0c22335028146a464d06911974d2da0c2a238321523b9a01858c231a5040a183484d4886d00c1a42a809ab1141a188a08810e994989303b1179998da904c2da636549bb3d6866298368da95198d7134f3c61c3c80d2180e83863a49c74cea1a11b2e88113a7c40ae5c323a8b3829b074a19d034ee5d3a6134686524a29a594524abbb9b9594629a552e80b2c6328018ef364996741c34aec857906d3ddddddccdc3c99290331d07c8501908e547197574a797ecd62606464c3c83437cbc0740c8c0c8ccc4bcc258391a9492118995ad31addb37bb6140201f540fe6b16032323142303232324536bad3230314231303230322f2e9818999a91904c8cac2613aa734aa11d3578b4e90c7803df8b3e45793a78a0aa9c523d4e18d061033cda63a2821486dbf36a45a17ed922bd47a1c64c837ad4939ee772b95c1e959ef480902133637aa09110ea3c68e472d14e0cdde285943576a7af663bb91f9e30d209254554b73624481e0aaa86e7d9134a10975eb6e649e2b4714305d43bd25cda3a98fd842b2fe726fe10a46e93e3d8c666b15973cd79b3982c1693cde88ccd5e73f69c734e4ee7932b2aa32b12b61d8008957e3cf9502ffd476f6e2eb539bae7d0e1dd2b7598d7811ac29d0f0a728f81e629a909c7bc9d9d4996f9510ab9f4e3ecfee2a071e99d58ad9a8e282297822ad26575cacd3927a5f497d38e75066d33153d2a7776c18ee9c2e82b43b250fa43bab8fa88f6d1405474c03bbb55f0a07611bdc30ab5b3a8222e3dcd81f98f427596b4d1c92afe3e43f2cfd6f4d4944e6255fcdd64556c49482c4d0fb3add18037855db33e0ebf14bce076ef7ce16b3ea15913bef49185545c53b18d510a3ff34923a309f33c2323232323169a05289a3b10cd7b95443489f6606859b3457fba1347955112254dd25eddf2c281f9416e41461295b32f322119c8369d300a9f5c8d5488bee99b39ef337d342ba9542a15843cdf8f419f1f1f203fe310b7718282524182820005a5c40bf04dbd7f7ede3ecdfa61203fcde20bcc9bb238b8713a284876108b3b48e30409f2e99f1735a863efb8fc711ee15ce6e1d13e8ee81fdd82d32d47f466c26c68fcafc5ed6f58a5dc350d7046a5ac6eb038e0605b5c4e3bd6bbb236c58676645d9601565c5a2eb242e6a6f44db7a02c23e0a3379b30037c64ddd43f610778ea579c21206557fc43897dd32cfe0a918fa2a8288ea2597cd4677d0051ce9601441bae9bba4c598f8fba65c5f91c45c39ab62284d1969b78e1843ab2d1e58f5ce4f2d948b7301d6db86ecae539254439ea2931c58e2b37759438c66a577697e29692923a4a14f9ca9428af441147d45978cd2a7121aecea10dff569cfa971247be284789e32fea29e2c837e55f4a84216feadf045762ca65d800150f53a9940a3bcab378f8427ec5514415291bcf5521da5ca983bb2bebcd807560711b58b0b0a08aca9b68c228cf6cb11c5129618b69814c47b1a3e7a5d8b15ed3812eea9acef394b53c47d91175512a576147cf4bd9b15e153ba2ae8aca4d2c96cba5f231a622aa2e8affe92bae228e3657e536a4a4a8b0235f15529ec57211a9b8ea9f0af122ea6486aae2b36e22d439ac370c51a8975047b1232afc6ca6882a4f89361c259fe23274c0e92bec8af137c551dda24a9d7f153da8e49bbba9774ac4005fc5aa44be271576b4b92a9e12c7bbae4ca552a951c776514f71893a8a0a14ea294fa56e7c1cf118d9b9a9a7642a954aa5521f59a9d4c7d84da5521f513775f9d94c892897628aa370d0dc130ac7bca71412a5449e4e9ff5c97a9368c240d92af9891dbd5a62471b2bb79e3bc967738e28138a876ea989bcdae5ac8d95db53a85be43531c2036991ac790443f8a464967982288a209dfb49bacdb9cd59c1c997dd22a48e60c33c5609a99c286daef7710803071f299d8a23cdb52189de0f52a81ee9dcc35872a74a77e4c891355cb6fcd994610f3dd893cafc7842a9d43f51e51d3df6bc273ec946a8724889a1fb4916aa7248892726886215cf8e9268ac17acb5929c6dad84a64486a0c9aa629cbce433272fb135355268a6c4c44a0924a9cde557922da4e7f005e9a5bf9044a384821eb9d47627a9785d5f14d5cd8e3624d1a5f3d3ca348b3f7ad487093ac0854074622b41194894f881124074f0f56cf1051fb9dccca717432a78799949bbb3ce16f3cdf4c08b2254ba62dd13b0592b972f74bdfbbd6451a891355129de2e7a8ae294421441f026d9c9f0e472c250509ac48eac149606e51b756c273fb16fd60f1b9e50c78f7cc4f5bc1bb3085629ea68a2a8e822a0ad08cc035f4aaf424c812244e2d16464909caee2f32b0d431d25c5b9a344d66ccdab103f5b29acec56f7794952c5d1e6d67f131ce94f629fc3fa8f4f4e4e0e43de137b729b7b228ef424252636976eb7c46e45601d483e9b95c4d2667d9aba101447b02483fa92fa9488fa7e243d652e57fa48f3c891fb71253bcadcd277e6816d8ba16e1f5f3159d803677b9098eccc3c728446626fc8f0019286d3eac78ca086074ff292f7d4ea4da6cdd64c2fa9d6f4b1ce234768924632e37d063c897d1f39726713263d9227ce97c21e6232af6dd81523f0c0102efd6cae8be338eeb3e9b948f7bc9b3c99d24d9f1d6d78aef7d0aa4aa592ad8137591a700823d77b781bda6c92fa5249e3248d43078838a6c7a5fe6ce0895e09fcc4b1de8f74e6d249a20e7ac1667120f5018a3aeff26ec375bdb3f7ce8e541c19e87e67d1f513f3f9f7ef1f3f14bb735c47af0cb94a856e110cb72f02b787207967510793c4f136acf72206751e39d2b28d6d2fe936ece5ce9c73496771f49808ae894b52e292789ec50d07cda538e6e55ae2340cef1bd7dddd6deae69a3625913cd0640ac36651d2f9f254fae4994c281aa8269355b15183c65c2e56c76d45cd9a458a7c3c0d7ca7d309d5836c09b271c5ed14b74db7cf491ebcf75bb6743ab613120ec03acc77e2cc01b2091c7c0d2059e63f654b90f10472109ca73e7842e100586f6edb534a4ab2a8a024cbbc65421d69ff9c7aeb934a0fae3f6ea9a8308c7bcfee7a7b72a21daa23786a18a54db04a1717dd8095b34fa580eeca77575a29593acac397a36fae7ce99f14e5a5d1dd86246dcd7b6769e63dab9234d28626df95786aa1c6e64b4c9bafe9ee1db42af9edf3d2aa6270f31cd13741d5577a8d09eb3e3f43ba676b6c4d4fedabf924ed1351cd2a7d964ab3d2614a77951e2b7d86329d4a5e075f55f85a77d24de7eb892af99a9eef35a477afe931d91abdf79a4e25ad2ab435d2e56c81d6d6bcd3d750ab92d6d5acd263b355a205a9aa4ff559550cd2bbcf90de79afa1277dc69bf746d72d752fd92024183eb9e26848a489ba9274187c49f7c42048df8b27d8095736c1073f2edf796f4599b8f360137c1074b9542a1d06df5210a46fef441ddd2b2f24eafcb87ab7d0397b005c6001544daea441a51694d6db245d59adb81d48a64a90c0ebf826c828059de78ac950570e011901080839d83c4fca4dd233338c38f6e747eed4bec47031cc1c73cc31ccfd179818e6b6177e0cb79dcccccc7c3e8acfcd32a8b404f744b3b67b5f897b13697a6a20789aefa6836d559a65aaf534f335e0e9dbaafa24f61eda1ad3e7bdfaf0db7f60a2da2448accab3aa1824243592870f5f5fc3300c1fda21c29358d7e59cb992009ac234599a1e10fc10a0adb9115a1a611113a195734b42d5266b327d35d3c1cb0982e0413b440df3ccf0a6ed1b4b870993651fe691c1e90078fa0e980e9e7e06b42aefe18cc9aa3c9577d0f37a67bb496423b3b5e570539b47ef68d6b6fd8544ed1d1b906c892cd420900d3db5fbd83b8cd8c88847b2f4e4f54defe896fea7854fae3c242aaa593c002ef499f20b893ad6cbcc559c730153a82ba096029573ce39e59c734e39e5374a634e2f398dc9e5ec6ddb58b527bad54c64694a7eb22c74642273c3331473acd3e473c78e365cac3e4311c513978d3014cdeaded9691f35a8253779898f72b8f3843aa1f7a8046d7844412a15a2114000008000c314002028100c06c342d1582ca029829e3e14800f89aa46684c17cac320c8714e1964883144000400000000224d900e182e553f85e58589a4d4a92ca8fea7d3145959a8a15636115673e65b9ce198f7884d49b83388af8e6048f2db548277a03590c2b898e8fc5d838330bea9a7a82aeef2cd72c04f281f8c50030e9fd354c1a52f04540e01a811db5aa010e9010fe3e08c79af6beac2e5c66af93e98059f3d0057944d22e2805c220bf6536f4f6e9d0ff0f1e1c3f0c26e334f9101e8fcbfbff831f8dc897f045f7bf863019385f8cf2b7e18785a0698bd273bd795f973fccd24d5ba753e0167a76f7fa48a8d1ab63a5e3d3f2984899926e3dd14c6961007fae3adb4b0534e744e3c066238eb406bba09c6efa8596ef5384d71956961ae2d46c9db487580907100b3ec65e5767f3a16aa44c6db5436d130fe48e7b584c7253753b9de562e15c53501bbdadc8433a3a0ade4401779bf594e091398c72dc82117817e4c6598d1e3ae2929dc0578f4225305e977aeb6f627fc056a8dac4a5c2618d1ac279ea552a5941714f8048620d405f970613197ff5e6de025638bfdcceb5ceba7fa6e29226897060a04cae1dbb0b7e4b2516de291f00e31ce14583882ac8b1953a5a824683092d5886583deb2d95e83b0d8a033793a20c7b761919f6f8374209379feeaa13e44c6262f565079f401603a2f928ce09606197f06438b1c90c67009335d77f5c6a1223deded015731069563c803493d914a89fef970be454649525868a300b94d84bf47dc8c9c0a254c36e5bee04dcacd5233031a8d77097966b02a543ae3e7d66ae96d92436ac5648723ab3219d94cc1c9e6694632efcfcfcbbf43dd335600463cd54a6cbf377b253a24bf824f2b18f6e7d18921e436ecbf0025cf31c53bbe60771356022eb18b88e3af0c7804430f0d2adb0e2b43e4207184038d98388c1906e633b13955c487f653e0528ffcb19490218e616572db7cc8b599007248a53fdd49f66761a9ea453d4677938d94001407ec0c0524dca168b375c8faf9231200054673b6ae7dc19394809c4c3b49e68d78940f4ea1efabb60deb553eaf9194807545825b41a1ccd1e459197750b76183ebf61b9fa87f112b33bf904750c8617ef69dc63779f96906a06e71cbcf1684f1cd8d9df86d66d56978622db7abc72529d4649187ebf03d531d670c40ceaa2d953d8e13c9ee3e104f53ae4dc610dc2721c233d09f5a1b1810f14a7d07635b6fda4b10ec5e8cbe8af242fff2640872aaba0d04f73d635b9b957abde1f29db30d99998adbf86028f210862519fe5926793525a3919aa7c310865d0258cf3f4db2da751c170ab531b8f32d2c82eab4d9953c2ce63512d0194445981d75ad5e2c070ca833f97e72d87b662660d7ee0cc54ada90326482e086f233dad05c0b5b345a25836c2d154684ba3fe0be51963f4bdfcc7ed2117a4ced6bafebeb8c5e4107e04bd87093e590ed6381fa1a28e6711e037082dfa00516275890e70d6a02060a7251ff57f0e8feb6b16b8ec64fe2994ab870f21f965a91cf3e550af3f4bfa192a2ed61e00e4354959b6f0f41e3fdf3b1d454d1ec4feb503a7df3ea2fe04f6a3402847e09ee500c99ead6eb395b881f079fb08ac139907641c49a5825d376ba9e43245279d4187831fc19940c74640e5a5988271b8a51c5d1907c69f3fba5309e1385486d6989ddef6e9bc96473d4440780c9c0a161e014c5aebb7e1858bd2e7c4b042c35b0fef97d2964c3035db9c7fce3e0484804d77fd3e4c9c9ea580d0f014a565fe6667755df874c0024164e804b330771588d708e8be72ddd1af254f358ca897c85d46ffb8a9fe043249f62425792cf689d915c694ef12140f2beedee97a0664e3c701b038f2a57fffa8939d0b1893807b902e9310f0bb460a57fbdaade9169b8102a589ac53456096d2d732dc3e16bca86e90f9dcac9474db72e4269c1aa7809b9ece49897ff94d8dae2e6934b56a1501639d347a355107ea1bd5a8973761f685311a87f72a08a36782841fbf8777b2aef03ea65e1ac9addbc9e63dfc58120d53184664d4c93be4364f51fbef817bd1ae8cc4c4d24b382d1beca8320a1d0cfac1d5e8f7ce55bf45b9694fd9241971ab17f8ba3d6578dbc9090a45c3e49785aad41c1e5db2a88a29af586df02b9b511abd789aa834e15314870f4ae950d1cbb3048f4aaca24a743e7b7a6341d828620b2dc09d247877328b9d80971646a13f8dcb1c0e60b51129a228a51a779140ec4058d388d17f3e984f53224aa484482e46cc926388c407bb0ac1846c9668044143e4bf4332e966854595882e0cf2b17938bc8f20aa7f7b0a6e3ec7d19db9778178f4d3e648725ff245ad8ed80e9b7de27ada147f57d8f1ef6ad4b694aa84ba634d7225f00b3bbe44b7e7260529a6383558a053c70f13928e4cd56466b15ac5900f097829f6a716e847e7cdbc478d1e8aba2f3c209607d4373e5819965f8e37d4d75f2922350f008b471a5b37da5111851aec5b50b2eab89157e54eba4a59f5532fd12c2fb493ff84791f293525a729916f53e4522800a00c6c194b460d96bedf78e2ee066050af95c77e0a249ef0b435d62546a2e923c94f74fa35430412bb0280906985842b0903a807d8d04437dbd4aa055afe31ddb4a51b19142e2906183c758df76bf1d0a68b8264d78918df6bf42009c3c2120d683b1ac7aa0d1620c96ac7aa0013be8a34f027908f22f8dc3a8f626d38d554c700484baa34e415861de8fb03278c6310f0650ea27e9c3ed917aefb4820a0fc7f27860f8cab7359db682c126f68eefd3282253e312e0bfb1f80e3496eeda73c3e6281ef9f59a3779626e2e3ba4f0fb13d23e57c79562f78b0e4a01f7e43e51ed17257f940bcd8b0835c44b5c35354533d834bd02fc539fc38c67363b136d796cf42d918d910b2e3038a9a650f05722dde3eb26414bb18f1990a431410f9db810cd297a5f47395951e26554b099c0a9a93bfff5c47708065fa2cbe37af2f0f90e3c36eae2cedcef28bd61799cd32e219f377cc03e749a04d34a055c6542fd154e8ca2de8e570a0e40ed3082c7a7b333e9dcb5713b77f11c26135e1687196724d76414dcfd3187df7f85add5eec053e90eb94e8494a4090bcb5cabfb363561a14f49c66081cc607aeed977c02b88a3e901da7b384f922cacbde0ee11255ce2f16b4ad3468a8b5f397c07d0f743f461cd494c341dbc467dc6921f6b0af5eda64f4c1b33cf24cae6a3213e51575a9683e6a6c6bfea0c78264fc7edeb6d646dbd1213475232fa41dfa17f8509c14f855fe6d5bfacb3d6b1163fd5ef7ebd17b73f33862d1d6312fb27df1c122c63e3985a8194aff8e39d58e1797aa658395cc4168e9b9ebc3877fcd4d8a6926ca30732a53f642659956026e6020d98674fdd4f9e2c952fc184c08501b113c4eb02c4e93149f9f29808387d997f30d6ef2b8ed9a1b1e5594f2183ffc72b68260bf96235f885c276c96d09f16c2ea24d737c4a9f9e44e1a98e9cf173257c7a15931577d94eb3bb4fadf9c0af6cd9018beeff4ddab86cc0860fbd8ef702466fbb5348e9c442bbb858bd97251931e9940471091cde119b542fb52f2e009c92afbad61a42fb44e1eaba75331bb84c5cea8fb10028350cefa8ddc929c6b79288c4ccfe96f37c5ac7a6d12f7f7cba4fc4e68da056b4814a3274eac3035a8e73c1df7865eb2622c48552e414efb9fffe19e0df03baabc9172718ada79b6f130f44f755eabd56cb3513de43bc32112133bf3b8835805c002b460cee6c9b1a9b18f31c5c00ea4a80f42ea56a00f3e6cabac83c8902cd2fcdceff849bb428e45c86583905529cc0027db7b6d7fee7dab04f5478c5560d15aca9a34fe42323472f0e20db5bed39cb36175ce6a14c84e7ba01d6d3671e60bb592fe4ae2933219fc7451b04decc37152848706034a3797e1c2dfc2c2a828b48a5fabddf43419cd0004394f2aea70f39b22ecc414c0b3c0923248527fe229e5d97840aa10780abeef3b3053fb476780ead94a09c8816e36a88256e492fb5829115e4f2af40e6fb41b8359cf86a6c1cd4c481a310995ee241ffb99958a2d9ab84a61a7a962b112561398c440b1226744103cf2f3e327b6f6dacf3bc0b408d8ea4f709e91f7f8079fdc8b588cdc38a57efc812b99dcee57e2ee86a8aa7cf7e17444ec19720e5fa6fa7528f82089ac427867011cb22c99c546857247db888558452bbd9a223c341597712a710ee8ddee471aa9abe1254cf03ac10c06de6e6adaeaec1561d507c3836bf0cf2590df6ce0b78c6769156e6ddbb280042363f58b1497b994a6ce200d100227585960ef06e6067c1691b7a20b31f6e627b9b8154a71f5e92b0ac36cba36d344b137c7f8b5647c2aa79807550a905fd1f722b403d887fc47edd7b32a1065d458fd493798f04a32724a8b0b245e14814e0415dab40632dd44bac5221246b10ec2602afd52073d013a93cd469d68dd22356d350e2b60017ff6b0c10b18b0b75613d1f6c3171094b94be51138234d32342f3c0293f4e3fb6cc0c42320b75eeedcb331c80c0505381f044b59533da750535d829be40325943f128fe2d4c961964c2e31c2cd153f480fbb11fe37b087cb3ee1fed396f02f87e4c519198d95ecc2f4d0dcc70afc72a4598975df11167c8430719ab9994889ea1e07bac69d82ea219dd4d4de8d67a63b499cb95da99cb11cefb815747fcf05e173951eba05683449fa2dec5ebe4cfac6b41ed5f933d89c3a7bda3a1b700ab5c1a07dc00d2d4a734935f8156fe1c3578f620f58c20ca7343876bbf34b6fdeb928309fa831b89564dd410b482855610825d506ac04f1de2333b099910e42449c8f8af664d300f4131878e451d2dd8233e9ef84aa916cd8d7f7712a5a3f233c2ac4331bf0fc11440f06869b33e00b355424fd00fbff90d3f08e43081934e2632b737bb74070984903eecd4621dcd19f2e94d319f030b4a1b5703ab88e74cc52744100630418110da978e3ef2d2339a6d664e9f25171e7551c2b1a4484eedc9a186ba656800a44a39d26f5a0fad78f4e699117eb4db6348f861e302f751f30040d2c9fced5c8fb6519dc31ab991060ca78242220d465a2d8217cb1f7a5a2ae4759c3220cabcb80ca870c594be3819098d16c000fb7de95d3cdfbd1595939df3c3fd459ea8495c7f9d9ca9ecd894c884cedb9cc238cd01c19ad7d09c837e8bc1a025ad839d052235a3b9cd4cb0228b1123aea94b18c1299fd9cf60e66ad5e34aaa7d10fb1701e995296be5511cf6ad0849d7667d8c99769cfdde40544744d586988a2c45cc4332d02540453c7c64965a0e1c683005ad53a005f40baf809a16c82ba93f5f0837f823bb2776ca35381c296c44a0f70425be48c61c529a8d6827bc119156901f8cbfefb6b1a303848eaab90977c53fc3a379ff6aa33c54f0c5c1e0b0a72deacaa74a821b5a8be4b492adf94ea82bdabb0ed0a1903dc4fb5eca36a9213d60d1f23d61e7727ca9550e2a7d0a5cfbd2d98d034525b43a840fb8d32de8702e3c80f4e545f4f58dba177f1e0b0cdda42ebfe70167ba68d30a10a58bbf4288490f2c242591ed4fa36f4364682391e11f304c94a239e85861068514472a3640d3d351484fe0719a84f0e0d67a156b5be682c658eb440d7daa43d99abe4a93103ab99783679797ed62484702611fdd9a81d6648100f44144939f3a6f7e29035e6324afe0a2eeb2a7b5047ef326d50bc635db150a099b787de2e76cab0019554164ceb747d7f90fcd2485bb7f9e0646b902815a214a5a0319d9d88469518d6121e87ef3a98290fac4a81a5b5c004ba716509147c5c6e96f58a5290aea51d13a0332aa9574185be4fa07fd7979c759c7c1743f044e2e470007afbf4e10e81bc010cb3fff06af3ee771c47b581fee0b5a05edbfd762fb214a015219a358468b14e9f940d02b633ea36b12515909c785356aa6648e31020b7735615ece73b02bd75fca6ae942d9629c59c43de9436e67662b7bed21ff17ffdc65a8a776b4e9e39fa29ceaa8a8846918718c2999e0a3dc5bc7dbd898b140e667fb604d02335b4e3081de03517d620e3f404daec7efc58892408bfaf3127a02d3492d43deff4f5e9720f87d4d6ff0b2b3288cf1d8ec44b7dbf7be7412372b1f162dac71ed7b60b76061515011fd0a6a0af41ec1c79118577c698a6aa966e8a15067df8aab7d6d73719931a79e5192a07b9c7ab00875e28929288ea26d7d50f5140a8a2314317bef16f30c262ce0b96ece38e37fa5d1a174cc4de252392e746af63feae6424c3bc34f91638d46cbdbe960e7ab0d80b00e6231049531934c8fc26603afa6df8deaafa9c330e73d532117d14e2acc6ccab7348a0cd79f56f7d5192b758cf95c7c17fa6434661ba0d124471f5319a6788ce5ad5fcc8af8fb0743f65ee3c896d431062e4ca6f478f28ad8847e1bf11fa0a6d192a65840de7b4da4b3d0ac3289688b5e1b8d0178f71b2ef19a7773ba8f9fd77ba670b3897b31841a325a6e55d536c1d623be00465a6e005f032243003ca16debdd72b79b10e93c9f8db78db13a0873592e01fd3d4cb3f1e4b5b876928b5e21af51b9808f4b05596048b51ab7d270ae31df5c6420523534c950a6c8da2f7a654ab12e4a46c4d47a531b21ce75a90b7eaa26023d5254874b21c875a785414cfde32cae2df0d64b6f6951615fd456a7a70634b806a4bf4e156a8b5819fcb94c22c949d106a222b94332c99cc918143f6d083e2d85c553c6e66afd0285d65bea3f5ca31f0945719a190dac6011a3d6c8822632b380163b7a33c21dfbde73873a6267549f0b7be35857ac052ab16a24378791aab04a823c5c09f08c54924169ec7300c23433a201421772a1290fe00a49a43d0ea6c3e1411307b11ecc21194b9df1c7bbb9b7e1a7f6a826af6d76ae35ffde2f2f6255bb1c71576d1530c744ba01e3bf5edd13a705f5270392a37ec6567e18cb03e4d1a81cf1318e1c40792710b59df4315d01073c1c3901ea6ff1f50e6ce67eaff148408e02c1cedd1cbd3eccca5e3d2d828cb66cdb18a85658fda0740b77500e3e698212351c1be6f268f526c602608a0b704dee0a17ab6c8b633d88a31a667db276f289b602c7eb01e56cb4d3e65f5f293e69e52b2284c759dd129ff73a28a046a607d6ca110430f0e54d9c69b7d5630b0264e8f9a973348c8e18eb4c6779d886a912ed04d30ebfd62ee09006b39bd0b03b58076311c8ae4280f660e30f7d08206a818fb9b121fc9e78f5318456b7b5a82bb98f4551080938df007abdea52a80e42245ce4112cc66d239fcfc8cdf8a7cd97e69a37cd360044e05bc7a6766cd8109507f5bf22c7955516205344943be7ab60507488cf5a3eef09b76127a0848fe0e9bf867264889f690b6a6c4222585d0c10d0c6284af135c727ce36ca09c35a433276c222ee923081c29938619350d927269e337c4c4920e4b2cb364af6194acdd5ba82f3b8150ec5be781e00405e1f44182d26306aaef06725a1bf0d16bb43932bfcf8e10db02ebb309e351f105ec0859a0df87d2f17489a8c0e4382ce19593cffad00881577130d836b0a3cf14957f92a22780bed73a46152e67f9610417c8ef60a223ca386921ac127545ac2553a21a02b1e0f876808c4298d86264b37a1c3c189a96f87e25dd4f5eb0c349bd51149e29dd5334042053eadede323844f62823ab14253fe7bdcc5b09ee09bd0b6222499ae3997325fc81dcc4a46cc1c91dc8697eacb8e4292f4781c2eb7e3196cabaf3ead29410cdf1d61bd2b5da654bf45ee9917ae47f864fb55a30db29a65c179483c2765683876a30c65ee96221a627b77750969314de2f2ce8f5eab32cc793d5df880771e31dd8b81c09370cbd23c1e2e859a8d0750355e77f2201d1b41d99d3e6b16b579861a93ed66fbe496e7d06472d2fe736f557f8d10319d1bfa933f69fdd385a0c967f58628f24721dffd75af13b4f57f2f5e01eafb7bd62701fa557bfdbe9253f632d7808f8e489e77486995bd9da23affb1f9ce121c8c3d6c9bc096111bf5f499328b11aa070a30dfcb14ae8d831a72f75c9ff6ac7ddbe5007780047387e1d2230307f5ebceeea5d85af17d2228b02786c8c5ff3d3c6eaa40a60f746b7f886f84dda05d10fd640fe0ff573bedbea0d09a5ec36908f02b397a949cdd5ab00429a8cd7cf990b012d3f326850b3a81658f7d85652ac023e49e6b37d90cc407f2a86705d2eb44afb5f5cbd524845f5f939975efcb410a6ed45fb23fa80b475bba83dd5ac48c59fba6b00f3f9710cd557f70f662bf94547ceacb4fac6385e4651345cb44d7f4e872439b1875ed929804940bcc50cefefa7ed1d8f9ce19fbeef96784aa7087438c27badc2e9ce8970c77d614668048e5a5607f1fd3546fd1f7e58a3051b95c38405cfdee28f536072a3d62009503b242b2119ca0d70441d6da104b0adac65f1b12b38b11a5e676ca6e52394c34c31838dbc927e8646c1f04ec6b834412a160e3263f0f5c42cd30fa601440fcba744ca2059cd828a7916540f5c52102025bdfb0dcefb1e84d61835644c556df2e4a880336fd644a934d69ea07fb11db0c9d104fcd02f96ef9ab02feec167e1be8132cd32f76cbe4150d581d92ae04baea88b147d2b3399b2b6b5d650bd80f13361d23d27a54d50d22cdba956dc856b52503d8be0b6147b393fe4644f4c40ec743a2779e709ecb7d98147048d01f557c58ed114b8ec1a4ad64a36b99277c153ff37d6a01c233b3a3f53ac7ea898d510a90bc9e93b2a582f70aee9eedc10a1f321780f55e2436032d1484f76e198a408c47ac9597cfbecb24d5d24db9e14bb4cd104b113386f9b6fee01add5cda1579d002c7b11b566327d3d3826ced64db0c8adc9e229d7b332664c252126e77bb973109cd52f41174b7f67e1ed782622ff81a840e7214890c3707d02ee000672ea1cf9c9d01b41733dbe1d4cc10fc2e6ede5149a1bfe17c64e024364932b0b0a36a1df1856331962e24527386c5027f5a3dd48462418e1bbdf14cb8841e26395ed179b607b625d6e755ffaf7d8f99b8a36e0b7af46e6bea4ca0f2983f49eab688b7cc55c59b0f59fe9f7b7d491198720b5759b4cd2e86d647393da3b08147d14f5fbb36fdfe5a666c8423c265aa09aa59134b5654983d1b15a56de2698b5f7c527d16c8650f525735644e5089e73df7e03bc178d68202491cac29c880e3c554e74cb6a327f316fa7726f18993436d4cfb0776884ac56fa78eb56cc633e24c550c2fdf60cb389eae14651dda77f58c04f40ce9aceb8fbe0f09b699a3f10254f6e86a7cd3aa30160f0a188ac4ef27e935e8944f3eacdb73e83cc2de3834b951fd4c4aa852c61381cb3f536440646135fc73a04384aea4c0c6ffdc27e358402933ccac26f4417197495aea9676f8f8a48e455a3adb9aa7471f5b68f4f50cc899e0d1a8e0a338c3253761236fe9bda9bda4df3879439c1802ec403d89dbf05e27a4d411643cb1893f97b54567d90828660bc3179bfa90e537013659b968b87cee07211b330e138d0a057154970dcb3ad453efc5d3bed0420835401a444632c7d50ba74ea928b579e7483d3e2086d2d44a12b27aa9683eb9c632903f3c6c41e4484136b359b577492c6b269afcc506a5f9410fd708e92a708198ecd2a2fc97a2f234e496671ca1014239523bbfa6fb0006fa1c801ae68df4d952870f172879da16e5be91eca275116fb7b936267584e56a9ab8999ecef10c12bef3e4f24d2aee47757a392ab6682a119f50dc59a6d911b106d421803c9afd8e346aef54f068bebfb21ad4f4c41c91c1f5e33d1f22be3f429d57d666b7843033c7068f2197fcf939d5e683c496ffa7ad0566a0008cb2c62dd3badd050291f7c885da06713d77691ba147831e3570411c7fcc66c152910d36b6147097306c0ce42a4897c4048b37adc2a36297ff9c52c51a9c9066fa247979da761264cd2050680ab924073d571632c8bb7dc08a0be337d0a2ce22f5a8b632bd8b5d1bc0ccbc0b4016920f4db0e529ccf4192fc6433aea758ae2c99ab9682041321731c19856be635e569c305fce05316b6a4a47e776c461604800766a0e19f91cc0fef949af04f69c8a56a0ffbdc8ea6b299a28e10902d686a19f739e4db7c0fb529609dc16be0855598a12fe1b41a7ed1d8539d6936a635035cb09b013a680d0c6f2b5410c475017bfda5bad529743461aed414f81bf97f8b13c160fbc6f612628448e5604a306ea0388520eb640cbcd63375ffdd2b09269eb73636fce8b681cb57024b01fd61918b9fc4c06f3f10876c6c8e1414c1acdf78dfc98ea109b0e1fe34e863da6460bbd8c53472cc3d4837fb7300eaf9cede3569281b2e8cf032e3a2ed3951995862143ef93f7a1d04eb187bb3e6fecd35b03a9a4044f92e29f163142ed0d53f288643a564429a3fbd8a0a5f090fa93e32339146a7fc31a64f12fae24e4c6fc58d17d67dbdd5fb8c0109514f877481f0e8d10e98a18e0e1f90acb7bf98de413c97b461c19dafcc7519f50d173e15b94a1bc22f04239d7ad48c748715ab83c2c664732b3ea880afdbaa93642607a868a0eb3633fc41c07b86efb4f5660cc7a8c8fc19c792b7d5e52453c32e052afc57e8d2cde952c267f43c12b4d3c79186235ba2a7a0d9d26e88d1eb024f608740ac86cee0207423cfaf41398ce4a71f6b5acc758462508d37c20799d1ed3a010865ab27eaea59f51142774eb9b04ba095034a68ec9d48030225de2ecedad229be756af29d6740cc31841c00484f39c9c0e398f6c190a4d0bdde336b77e3fae1a0bd7ba220322a5eafa34ca975b9d66ddb3d86a84ccdcffcb2a84d1d2aadeec34bcd632bb5fbc1443428dd0506e2ed885513244f262751a8374dc26fcf8d9b253b14e304f86c48e14a9c4003122d22fb5216e77bf44aa0c62dc2d8ebabe4eb7ec43e4edb356833e8dcf5aabce1e9d6203ddd8e3a2d9f9dbb4eebe1c9b275fe75895987db92c54c28ccb8f588b65f2afb827c8abe6f8e55debbfb280c1b68d5de113c52b3768381f94b77514d4d794a39dfae81bc1a28bf286586645be53108b74b6fa295b597b738ab06a0fc0bfc505b7580d7dc5e847e2c0cdcdae1c7b141883e8bed520e200c29189db54bcc0271dd5b0ae40cdc7a9c2b7325cf4353b318c3b1bc8fba0b42f86d80ce2ba8603255f64694156184be9261faf04450d3d6a967696f8cd9710cf754b4c74b825f6a42a9ac73ea6d7ec457921de3d1aebb0757a9be750db92b00f5e1891e88f6b6a4c7d29e3af57cd6c0790bccb3469bb009d0374ea31258d4f581be71df76c0c382d3ba98288ad5aff5591d7feb6e55722208f70af0a02a8e1c0b7e63fe59bcdb50521234df93b7ec04de003ef87b4a2567a9d0c04358905a32d02755169ce2ee1785115c1af92cad152913c0b05c192e7e4b3d78c53a14ebd5f6ce0a09220ece28abf2273ef2d0dc5eb7d83acdf2da069c33157f9578302d86b642208e254c81d988af1426482a8191bbc8d6ae4e7a699e440ad967659bc553a352f8c4251e8797ed5c0ef4856f8880d84c7c769b81b082e682ce2c8115840940784f5a1050c2c7beb57cde951feee6c66ac367cc84cd7ac2ccec8480c6e6df9e73352261311133fc8ebb23c09e7fb2c6270ab77dac4782d96108a67ec59ffd32e8939f62d006d24ca8a371475299f377d3652f8ae2bb7397cb5cb78f29893386d8480a086ddeb176be8b67b1532b03085d148a5d5f20bf42aa84d2e24ec455fc33cce8f1f28c86d40a236591b32a7e71b846533a650a28707743f8fa64c5e7fd1356e342fb2993b0afca8a22ee34aca15f5e4f84fb54cd81e57593ad34470aafd5ddef9bc883d21e9a679fe6d2bb03917883b3c3d6d5adfd27087d77c3c803c119c746837da3f233bc8034c71a3ea95345855c3aca315f4deb1be807afa9983340dbead683ff9f7d3dd7f3cc815c74c0a210d2e07804ce9c4c6c46b2e1265ee30b68d6b7df6773f7de3f11f42d7b372621c68265705c741f1142d2b6bedbd58bf8b4ac4b8b4333685653c3758089a6e2a342de63ba7db9fe72315ff754a7ff721c49b6b3f158bcaf1805988dd4bb1116fc6182d823b7366c58b0b843f7f03cf68e931bd491e3b1f38c903b88b6056ad2ff524fb947f9bb2d2f48f5dc0773699e7004757df1b25c25f0692370c94238ce7b9804c66c3a01adcc48852180f1454c3cb846a65b3a1e60dc46bc9641f2ab3bd7ddbfe2902b38eb3cc4329e8832103a427c3173155378bfc7bde9b8eb0bcf2441def5807b91ca8b76257aadadc0b1c58e80ccf5b80a2445f3ac147039a24baef8cded35100e387813a52354fe58831e4224f89363b249e41e35374d59c88280b0e7538c077cf1636dba4234fdcc1eb4722da167ed86e99583cb9ca81cac9ef707823dda5ee9c6552a04420a7203fb68d673f53fe581ddee5bb6bbb3556bfd19fa5a59a0fed65ac6eac54914adf58ddccc0adb8790ba2defc7901f30f9d103d4886a125bc7252976af94d38464b7e5a4f581bdc8e00dde0e6a9112a23ea5158f748c3d4062041265890dfa708c10dc74ca00883a7722a936285bef48713c1636d79284e6d659b3cb5e2be3c85db62f8e5a55e7f158ae345fa1c35471ea1f1549d5c7b3406620a8a6f57b81ead2ff712d0ba1a222fc127e03c924c08075a381ec9569b35173b20696dbc352928b4cb161133cd76415998d0036ac18d729a3849d6b0a2aadadaa0c6327dc7a52f4de3109164147bfe058b17a739c804224c9863ec5cac3c43159f44c1ec4a6c2041fd9e04106ed66307b59b0677af5e310fcc2a4e422d10c5d2a2f23f68d886f043897947eb763576e62c7eb19cdd7a13f3f4d89dc38b91ee775428dd59e75122355822ae1911cc0432f1b9d6b7d2701a2cd4d021bf434007fe0cf0ca1aae1a0c860acc270d9af1c0d57b255697a1683d9418b2938255f3b025eb16bb25f51600396ecf8f8deb4aa4f642adfd0e62451fed213947e1d7a952dd0d7bf21896a758fb4738d311f5fa326bb158a1598b046d33b6336bd9ee16bfa4da5194ada978c2019d1869be930255555df21b6cf05d2b141e4b8691f7d20c5954c5a25f21410c822dd3c6a079cd1b6172934c0707e4ea234d8a46ae9724cd05993b5d453392b14eac94d90d49add399b107b4aedc7b5fb0995097a7a8f5a0384c70ccf5f8f256e832606a39fc13312097dcdd5d1ad5b71f65579ef8d93abc3bc0c7c49dba964ec4626858668a807483a009beac43684ba2edbe2b92b30ee45a2db31af1f1a9328d7d635a4e421ca717acb5c67cde5313cb929368d7104aede24764f4f494edc506a2d654a0529e02fd49d8f2f2addbbcb5967c1294a17ca8d6d08541c34d87322795fa45e9f34d71496d807e1e7ba6e28bb28391c8d924ea8585626d094d8e8ba7a6b5e42d0869f5b63b0811feb9d9a3ee530ef903c8d9669412d7cd83d378c3fb40921c563f03c05b0b6ec93947ba5b0dc0ab6e1a6cab682880005ef3016895275dea3e031f96983ac83e0ef053ff7613f0443ace576be6958f13fe4bd435d09e3927c9ac0f1fee7c1bce2aa2c6fdd7c4d95099a286d4ee91aba45d5f920edc3e990647f9a4558c3aa94bdd970545d63be9e84e0a9d177f2735697f4d2a5c7753e8421f7630f6a26ea18bb2044c6d2ff19cae54e927ec9066c814e9a89a43cb843b961d46987c35e4fc0ec1d46c9093341dd4fd8dcf7766aff52582a1beae30cea7ac32c3db9e1b9d2a75627706dc059dea859caa4221da6749256fc7f060e6846f17a0a10454918a2b1c8dba0f001bc75f760c5f3998911ff092950b8a64181c0c082f205715a24c6e50aa0c7bcf636ffba0321c6360a19894171421f8f1456167ea6375b58454d66d5ffde963dde99827c846df8179eca366268c5b9d482dce779e1040a889a7d96320cb1fd34cbf6d635f0bb699105367365408cba7c529535600add81aa13933f3a8f8d19613cafe869549aaedce6676056742a04ac15daf665d47d24a675682be10f9106ca2fc27678671ac20fcff616b3a73aa9c6f20700da0ce3eabb74687e46d8e7a77c40e2e574a8f1b2ac978c85b67ef0773e82193d26773fc3abbe9efe4f20452ea9a0849d791b7eb4abab1883d576655e2ac26c065cd4d64494d32783dca43e89cfffb7509bce2a2fc382b833de5c895a502fabfc1d976c18b1a3ef61adbcf7fd9ba61475b5dfc864fea5009d6fc554447caa83c9c89a90523430a30fbca64b6723aab45e58eeef2bfae51af39117dec40596ade92a1dc01c5a40d8b99d82d9287c3993c46c64418921245e75ec8f5f1792e39237bcf2f11dc9da7b659d85e35563851537dceb323bd4d59bf5a1b305bf4f1ce38eea0e724a265efa9b5b31f3ecdb37f47aea80301864b25502b6c708c2170f89ef790a79c3a9e97df843f0426d4080539ef5d5ee5de187bc824796a48628d0d9992e7fb9a25634d66ba1f1ba2597b0c6a1a8c3a225d9473988e1f8ea182189f2e82e49c983c086e5b3f8bd1122b06986c616fea7f194d29c37e2ce6f75f4de168418af083491a08498fa2448435432656023218764359d82df2e3ce570ab61d86c0eaf3b7fa68f848e337b79d3b7019878e29cdc7fb22b66f45de9edb48539427f24adeb7dbc8057a5854dfb1fcb79d086fa7b939e4c8ffce09a4148d6a6dfb017d345f82de1f8d40192964b3d42e687e63926276a0b1d53a143d1ae1317c0d8ca4e69712e3c34c319ce45c2efd34c46b3c4f4316c21f66e5fd94ba000cd3594b501fe0471f1d74797a6c37fd6e0c6e9a2f0fef63fc76f0fc4355c269c9347e5b112977eb19ea5a2e976cc9431458ba4040e341f87f2de42e3143798e7a05e878f564a026271117e00c741decae67c140b48c4ec8841a69a1d54d3c07059018cdee036700f01fba4299a367948f953a4bb6407ef53be9a2224913b4b4a4d54923300c25c59fcb18cd6b488f032ef06f7ed627c3d9bb185f8006281d2f3e504ba261a45a2cb5afbe28e48afda0a2bc6e5b4d7c3638ea875fe01afc292ee172d0c0e386b89184bab21e5c4e27affd68a81424b9140440c012ec38516793c523105ca27c0d9d588856352940109ebe2b13392bf388965c2b516f57dec035a898520ed7414db1d3fc425c5eddf574f4d389844b87a9c104012e1ee08a8e114d017edc13de9255736ddb69f023de24087550da540120ed5b3651e777728ade0f814f25a2dd325be2a21ff5e0cd30a3d93d74ca32b697347cb8d945e945a28626395b31f69bc7c0dab07e6b7d38f85ae1c703adcbf494292051d38f80ddc93a8cb968802a6d3f5fbf317f48cfc4e9ab7388fa01649cbc1464bd11527e4115eb2d72a3cda5798ce16686e58f0b2095c6cf4fdb4ebfc566592e426ba65c50058659333f27bc6ae88a7a005cc935e8ff6d204c1be8bc3ee34010e35620b2661e42889cb611f71e629ff747d446c06d36f9f9dd9e0c74ec78e2fbc2a73b43dc1ec1cfe79204ba334041c1788270e72db20bdd94af73f9c3d462527af03e47f77a0a7d6e76207a679e3bf0f68bb29e4c3cdfd3f00b35958795c474a96623e5959c0abe5d2b5e8dc6ec462138eb3e7ae573b0f370f24fa93032ee1ef8a74f0ea16136e7bcbb6ca309b5c01092fda8344a441b7e95a40c19084e33a5d9c57d607df72258a4323672ec9214ba1306812bf71860ca088c823ff667d34a0521f874d42e127bdbc308313896f03baa58934daec9dd402a0f2d8d9e8f599d7e8e70bea3e2b5bdbc5205c543efc1642ce0d9eed950674c4c7da956af342338b43155384734fcf32444939b72b244f82429b987b153a46f85a7d6074216630c5faa37c43eb72c77d8bba1b68c4816f4ab1e93d52567783aa8dea657a48aa8a432f62754ae3713ee978e67a56ab39ad60f66f690059d5d5012e39b4a1d89ca90640274c02cd442a7c1e255d5f4f9085116e3880970a4c332d072f9a1fceb20e8c95c38c4e464054bd54aeb3140b20be498e5f17828770ee877b7c8ac79bb66ff207b4930d594ea395fabcf66b0a732528792df0993415007d62a76aae583616a597d1d5dc5f76d321d5fe1c9214113064928a2f8e5f8b561e5bdd7e5f1600a7af1740b72ac017cafd4e229c67530a0c2dfa8812daec0c6cd9385bfceaf139a978b2ba8279c542d76f649320949d5e207823ca46e5c74d3b4716d4ba24bcd2e453fbdd1ede7b4a975186ac588de6fc2269915c5800c9ba311d1eec2892297934c9417c29f679ec99788451d016980a847c2522e6e20d4bb809fb842f6a090cdd0b3df014d0eccd7faad9bd635852687cde0283587a6ee3fae2964957413ee7a590cbf1da4e01e0ac66f98667e75a1bce60bbd1d6c49769ce6085af284d245c9ee5f6f162c6e7fb8ec3ad71ce20a04d97fab95898e5fed0c97674e518202cc3f8be02e3178bfc7ebe5a2d3d60aacde8de6cc348ee4d0b1aec406a417938597702182c5660598b07b9e56ca3c61d76a2c482ca9878aefb510326ae9ca1411ff25687cf86c56e3d4943c3cc4b7e09ea688dd7bea039cc6cf5d0ef77b135d0a861cc2b5e3f1a9bc7b57325d64ab7f6de0e7008f3fb6bd7daf8e80e7cb8795947b99d049a5c2beee63d8b13ce29c7c4ab9d1278cfc08c31293ba85c0a67658341ae12bf4066f54f367c0906e4fe1bc1193016d74e72177eb0680e8b2d5e5cf1dd96db6642169f96d3351a5c8daa6bd666d5ff705844e1afc63260b2be45d28307a68ef24ef58aedac893361d1a2aa36287d18b2059730d54e867440365e6e1ff6c420bc77b885cc8b7d2a2541ea4fd48688ca7fa18f27dfb03cb7d91546d3cce0a3bb756a5064aeef50cc64952ef0245a3a2101c6332c95f65d805bef3b6645c7d4707be888e6dbd554a5c40c3d97df53bb420d6aab2a1387eb242faceaeacc9f060ef4b319e84dda4eaa8da547d6f985a878301f40e8ee1f64344f5d3230c002e8b45e8ca1f467c4ac49a783da8277d03c27a7f34c5728b1c9adb4800d2bb123f9b38f1bee21ccfb943a39f8fb9ca7b4faf149d7685f7d14a93b412870c6233c2a08f4ce33eb45d94144a8caf8cab28c8d9514eb9ef0a36c4eadc58ca387df13a37860a559cbf6562da6ae132ae63cbe0a70154f2b32be9888369bd8eabf6ef7eded0e3f0e61f5a76e99cd8871c10c113a6f810c5083513d9e65d57ca775b9abb44640b5d09a477235a86e1299f10efb8176549a8d8a4acf15c715fe1e5a4f52f758493dabf743e1d49c9082784101aec0eb44439a0820d1d6dfda45f3f424062e39a881d68c8570fc05bc64b9178722f15fd041bcf23489d41e323ead5686c6e712cd748ef5cdff878f700cc020cda431a1f7b89ae0fc2c6bd71abfca9390ac2b3e82105ddf246118881c2f7998bf063fa6a1ddb4db5e727523924766ca2946a5691e73a57c8f34c8cabda14f1d17fd8c13ee602e5eab54c3c6db532e8062061d861a6a135c357e0cb10c2483d452fc3f8e0d2b04701b80691914c48fd019ec3b2e47960d5264819cc7fe6f101868e9f278280a3cb147ade148b619b615c3538f064e00589257ccc581083aa0218174f15b0f8989dba658cd5a8892f3a890520d2c278ebc2c1130b4ce9145281ecc5238837adcf8f9c9e1000126e5dd6c69e16ce3ab8f13dbf78bbc84fc4aeed3a5d192fedb05ef9f258711374a3c3d3ca1c2b65bf2750bcffa33d61c81d5406fec0a6cc3dce28df6db60c558196015a3b8eb84e3dbde0f0d1c0de780c5cbe0a5bdbe3f614c63fff6e0ff76c353c61d0fd392a4e9b3684644f221a4ae22e79bf36bab23b53e15f572daa69f63cc3517ccca2398398dbd1dc858f31b48ec2dc710f7d5fe431934ae4b1180c16aa05d6915c7c22e905762c2264ec123d14022a1b7d19cb16b368543f274674199252ebb709193fc2978e74f2d2a8f44e5c20fb996976ea442c349bb7ff76b0353071c0a8c4874fca1e5e34b73298f9189ecb0a12794f89b5edd0441f2f5878ba608f97ffa5b55e2eb7644861bb032a6dc77ac3868fe94eb5cacb1affd2a8dfdf3de835c4649752adbf8af261e73e9645c1aba71aacefa801996eba7193d308f5df30740d9d3a0f2465f430133d8cb1d9318e021c83265bcb03da17808b914909cc60397436929c55009461829054a8c336e93931d60da51745d82e44a3fec5e55408d050e4223430f163c610b3e53bb12520366e4cc172befa646cdb14573cebd5c00b4e337f375fc8427c3b3c00f7b7688c2fb8f3e8060f216751b882a39b7a5f7af610324fc62f280b0cc57c1f8a3b887ad0c4439b4c00e467bd904c493055c652d25570a4d702046789ff98f534b3630965bb63cd02cd6373a85a3c3b87ce7596539609ea3f0e90aa55cb990e099d60ef078ce36f7ac05f44c48dea9a6117713426303c0b39c04c7978967101eb0134114e24b5425a7d48aacfc999e8e06fc042ea5e30024a1c369d7b0c64219c50f36fa29b756044227da990abb515e6cb21291e9bd7616b66746bef7df7a2066b254228b9d961761d77b20501eae073b080fa9eb6346fbbbb7bded91b5c583b6d73e0909cb4903892908633721f2426c9295ebf556f62e46a10f6808287be70f88db8941812c9740a87b8543b15446c78a67c9344dc011a59d7c6a7f908ba5732722bc1095d6ffa2a3525f706b027ea6ac6404f8653bb403ab83e17591871e4562702030c45df7f1af860041d04225e7b13122bd40895e652145be8f7b80f45520e48c860424e22f8d6f6de3194a2147b863c5d6c038046b1c753c0a71fd5962d5eade20f337933d4c1a6a9d0473648850b09b7b580a043639a3273bcd480625272c872a0cfbebc66c281a5bdd3b97c1e701c48d7a592f800848114bad237895577489ead069b1ad1d0ac76231bb74e2d579ae5aea3318fdc0ab2d60400eac1cfadbfebc5665782759a99afab1c746cde38b0873675e0c9ed6a242c898bb1083d886e5ffb24521ff1b97ea034ece21f967e8af4726a59a446554e4bbd04327f2e5a3663baae698ddecc9aaf9455972469324cdead00c069c20c179b677bfdc3a09639d9c1e59fdb744e229882c5c86fe70f0e66660c441d14cad12222b0948080329c20142c3a49445a1f851c40b0b858f2bfff262c7ef7d9e9321630526816776bee59fec05f3d34998302e18899c3ae15a1014665e833e0ee317b46323591d7175fc7f361ba34641c105db674c4fa3121f053c1362213c699d01ee84f44de63d8e99355076356f094e0e69f6c631845f1779b1d3ad2131560d8cb5535e3195b9476d0c7d86fc8f6f25a8ef0ec85c4c8cd0417d54f8389c8f99f6faf069875f91dc42a76d13e48c0a55482498ee5b269ee722887a1d93eac114e9cc2e77d5bbfab941d15d2b857e154eda0fb379efd148c13fd5785d89822160639206309c160c811465021ca0897d49166c4571a5ee84bb13ee3ff331de57307c1623bdf8c58edad856e05d26cd72dfc51742af5869d8d7e55a9b8553a6962d1b40ecb3bf3852816e8645570380a1baa95cec25950f0376b92107883263511dea06e81b77d9f11b73839700915c573192eb51f55330e037ed55c86cc2147f9170d3c65420a6511d6dca76b31f8a4631ccbcbc24650a1800dccb188df4ba5fd61d6d0bed48a1f46e3ed2656b46d330bfd2c5d788a9269890bdcc6f1d64cd66974acbe92fb57ca1d61f7b042bfd509b56cd92f45a7d5d63c88fda7a051c4d2bb0fbd2efb587c14efd38572fbf4ef61af576ae0502765b99eb610b6cd3c3e6d4c1d9ab97706ed4889939d5b0c440f7f8dd2f91dafa41a59343310e37397885cc46a266f85f09d0dc92065cd6651916898614d5628178d214141ffb6384e523454d2e76b41c62612a69dbd10599d0b748ff00b11efb891a1c7f783109eb7c097169d111774883c9de1c4627577668499cd0c50c5cd22eb4ce5992c698f40dd2a92317151ee85993328561a80c4a6cfcd4f0ce5f663e9cb2b14cc369f6a8bc6004276f78d1193996581ed04238d44e7b2a6a6b9292d2aa25875058a1a603a812c18e8cbd969548f7f606b800e0313fa467c2fec48d1686dd83ece44b369916da006ddb6d7cb1df4342dfbae500595b3c8526cd0c3a071c02f0f7c3938e2dd4f8a360283a2950d0c4cfab174a7b1f8c12c62593001f467f74b7d5481f6ae6fb485ebfba79046ddfbb37f6c417233191c8f07094cd23b20570c828ee12208f260e92743707e7091a35d73918563e771b2a00307d9b2b81780a1b8e03ec7b8dbbc43c68610985c82c542e04ed0bdcf41b6d50d49f0edf3c55662b7ad8d40a0653d7448c3701a74f0c98337c0bcce70de2854543595e8419774989ec3056abf819588db9aa5a98bf164a50aaf068b51381a857ce25751c7d35045a798cd970b0b2a7f12cca593b550cc311491326242fb13c9fcc7d95bd31fb7ab5c97256fb9416b9a86c69786b264630aa1b29fb52dadc30ef4a4b190f1614e234d36affb4d83b663009656e9e4d07ad4b5b9844d4c290b0f0131d9fc102089152da28db33f379f76884b52e68cf7a5d80a664ac0618912e950decf948fc9c19b48fdc1f5cb49423fe719becc0745de74f0d3f6c0d313e4a5218625cefbfbc6fbc91d3ab9afe5571bc3dc4fce3154a4fc91274d442f9040bec5a790501b4ffa336394cb0c255932f19a7f9cd15f63821be22c9790ace9102beff48d6bd1bcdfbafd381d737d027d0650fa960c61bfb54c82bf50451eeaf36378ef3027dc121e64f2b0a49f79d9ba965c57231f9bed5e0c1486c7d8b3324a0513a6002336338e5a4c5fdee733f6dabb9784db62275454afb15602ab1c57313ff9f00424b9fc5bdb64c4e465ec57016622a74dbac8b981bbfbadddaf8716422ce3b7946a7d7d171daf6d5fb537b8ef5ac05badd0bda9f7734bf3baf98449cb92c9023d1f9e847fb33e2f1c46e9caddfe9c9ef9156c80ef373066b188ea659e8ccd2e52b7c7c7f1c45ad71c0248e00f240d65549678bb050dbcdd22013e86a4c2ae722a244baae86264c826f70d55683c53d75f332c8ebeafae01c5d43467142f9d3e708cd71f2525fa31debc3ba0b2b4d7f659a9d22b80dfbb2502b346a61a4b9356fe713cbff8a25e57109f08cffe821ec2a765e345a8d0ae83a40ab2107dae509be0c50e86668efd2b298d1279e1e8647fc2708f177a6d958113c2c33256e78583cb68cc845dcd2e5787356b4c690e28aa71dd611bd59f77dba7916fdb652b6125c6c99d463cabc08f64388940f5ec169785fc1a7a559f03b904e850bc1003620b38330b1863a1a395fa1b2f9d6e5ea37ee84047cfe7868ab8bb77a3428fa4492f04d44faea4d8eb0ee85938677ed0bf594010b0fb4e7dde6a6cf2168f1f4984568315df93fc4eace758339c8e632d0f46bbad7c7ed1d0946d46f28c8b32f46319d1b4edcf42238b3cb778fc1dc7c9b02e929b12f1a152f6b8d49d4a6b08f53462a79380610a3f3ab07d92d021c598273a6bc6d3e8834682325a4e76cc44b7c12b3a4ee2ef499694e7b0007d72be466cb051df9583dbd29777470b5f2badddb24a4b958a0648d7cf8049781fd564f41ab847458a65d3ffbf49cf4b9a6745a8bba7549a61c9d24d2b920c5d6769f2cd3314197a4ddd45b71e5390aed7d38798b7c4f64a643ec90d0a416fa55ee6d7d0db205d02abf7c240e9e1fee85d70133d96d243f6e86d4accec1a7a18243dd81932e334a294230db10e7a9130278d0641982594867ea8f3305ab59249587a93a15e649fc68e700b3d41fc9ca8ecdda26d5635306ce4b293674e1f3d73e655f8f30ffc197c85c7958160366205f03e2033de51e8b10e562fa2733b8f8295e7910c307f126d0162a44e7f5d941fc0837ab0f59278c60f657410624ab41806b8b8df2d05cf8461017c88e8c5479bdc726e81676d89a1e0876e765afabea5e6de5bb78ff9e0462c6b33ce6a781e968810a6619780a19da7bf6dd500dbd904a5363dba7b046ae184e4d70018f209db5946fa0ab53cc39911683d4619164e4bdea5b2b7e5ce705a93f05f8afaab3e2cc47ac84107ceece91dd5470d11e07a412264112825821e76e57f2ec58286222c77ec6371b7ac808ab98cf5048a65f11249ec0bfb7903095929027db548d68e519f36bb977b46ef18fe9749905645218078eacf52c030be7a87bf908955d56de5f9f7ac7c60ccc29547d66746f7b315269acb0fb53490924b27cb4242e63d723abbd12b656f8fb71749e95edf0e5b21f21f8f083c348a19a30339ffd897ac270dc2aa6d7f338759be85da442fff634d326410b7b28222b4bf7b909eac54539e32bd7f3a46d97536cda9146f907e257cf29624e27420ab5dc4c7b820a3b450a51cee08732ece223898a454d3a4ecebf5cdbae5decad2408c2d7281a5b3bce25455860661568c4f85362821d5740dd9c224bc9bea83dfed8bb774daa57c2ea7bd447178923af2a3c9ff5060d2944f4b9932a7c7d4ca2cc09201f7192fbf960abe540afc0b11f930ecebc50f906433422329e04f37d56f5a85c54237d256aed72e3e408f4cbeaa9ee4ee7a02a6ab630e1fb315de3b313625d9a7c858e71bd4140bd054e3736f1dbba55fff0ac6b8d63ae807f39df6fc5c47321532d2b36355d4c09b41d288b57241a402c776093afd3e40b014ba1f5e42bb9b65035a548cf3e770ecd40d2a22fbcbd9355be8e77968c3f2e6431045d4c9582a7571c9a5dcf3a3bc074b034f07c7864ef44362e4f51cbaba309d888d361de6ab08bd35ed9a872ccbe573e45e6ad24652b9d6d34d3e1cc1fe9dd201fa4b26807f5c46a82f6dc1af15e61e2bc2dad6fa92a9233c482ff412841a8aa4ab46fb6941ad8d487435f74fea944036757b12f37f12d5797c0aa60b38af158fa91d270325b08ea6642226b0db238c3940ae6633936f9f831047951482e0c1b5cef642a1417064e5da858bf3818853d3615adb9b000123681c0a5cf94c5329a64b82aff37317e915e04eb85ea9407c5cbbe17d355eec72d7660e3f6125984efa4efc813571f94ce2834c2eb0a61fa3c3a54cc8c7d37c8888d8c0613e834ea1aa4fd6a884912485a5ff9c4a2aadc33128e391f30cc744ba3adf09cca51dcb484b760f123ae01835f881eee5a8496c0a608ba5bb3d89bd9ca636177d0b5d81c779bf132c254b7b4ef7b1e07d884a3f13b32b01953b5dbc0b47d0219ecebcf6d7a6dcea8a78e29f200422a9884317988033920d08685b3d737309c6bca6cbcd7e48f0a365cb1a68282a34e497289a1a55547f0f01114062c047b854c5c148a9fce746fc9fbabe1426479249825375a2e0fd9351d8c469fd8f45235f22dcc40ec95fe83b1fccfbcfa933451248d4bfa13ae0bdb0ea7ffe19c17f9c535f0e85d608610132818739fd14d44c04ee939f6a411ed7a00f8b3950f4bf0f1e54fa47226b7b7a8e2ef4aad18f53ccc3e8daac338dbb862aac1e921041ef312231789dc0982bb39b304c683d3211aa728b3d06c3c7c131ee647737ab0ff7e68b6ab24362ad3f0ade795eb0a9e1baaec7074fe5828beaece40e845906b1bceb5e9acc6faa8063db5d0caebb9f7223916530b13d991103c67e3082f890e9022565251049365e5d94eb24e64d1824057dc2d5c265b17347f38a94df12c52ac8c225e0b16c4c59a293347400372954c4a1201826e5ec4e3632e801df4da00120f485b47e8f8fa449bed8fb053d4afe39971fe00dfa95a0bcbef587a124f75bfd6220580f9fa0236cf4f0ee1fec40f3424df3e1e7981f1bd065ff7db15fcf7ef8c814702df230f7b300001856ccfc9c65cc8466f3967d44d136a839ac15f36c8be843b8b8c0277e8632085cbcf52b3f27537677ad190c3954364ffce0eb863b1554e906345a1b0065e3fbddd1f531e0a436e587fd68cb8a75ab848bf1ec0c805bb16dcf2a20e303ce633e1e4a96b71a5a5749a02951dbadddc972d9c1a1a1e9dee286529d0e17e5aaf9fd981ef86e5ac90e294404baec4df4b0d1b2197c61feaf312ac676a043203155d8e808f45b84b855a590a2e03924c7eceab168811ec43a18551943c26c66c6ea250119a6e6701b408c711c4bb1d17876ba8f41c812f3965b4fe6316f3d476e3ba6a7b3df9e86e75a3454454b817ab3891eaa2ddead3efc87b09569289d4f745c38a5f3c25a84b9cf7f580ad6647c2d3dbf271243ec445b42f784f89ac2c448cf7d401388290c769e98379afc5205045a9e7e0a52b79dc5e48ed4d2f47954a306d48bd58c15ab0294df1ed02a5798e3a0eb2d097fa282d8406af3ca0a67b8e8dda7554a67aec0bacb57717d779e9c8782bc1d172bbdc17f3d5d1510a91e5e2d42ba8ed09a40acb35979bc255a7ff065c4295b1884a9fcc2a3024070404eade9d60048c5f34908a5570a4d65718033b03a7ffb0c3484a52b7b0543edaf80615767845328b26004d0ccc33b9c22b893750a260a210c7c66956966d0dd8fad4c33612a96f7471ec4473e9bdafc2233d2d6fa0ed30a0390ae01a3138b296ef0cc172f891e3f495dc30bfb47133670a1af16c87808723b2f65a2787a61459c2282ba860e66e20f3c4c6ed5e0bb7542f63876f114be8098ff295eaa8b55b018dacd91cbf681711d38d3a4d0d7b39f5693c13b60fc90a22c9d4cc77b4565f81384ab350e0eeb0d44d931f30b6e6020acc3ab6b12bdf5cd21f3827d7486d15056ac8ac37e6eb797f78ec052743d1f702adbcf6c5135e215e3fd6ff465cdcdcc57f4db63df95eb7fd9e7405957581a73347099f4a1748ca59176207358401c37f3730ecefeb7ac0b8f3fcb73e894730998a48d9120a0f413432446321b2b0fe8c70516cad3e84ff27b0b0b9a323808c0445adea09610d0c5860183397e6e3003328a901059b8e4eea619b92fba9651adb06ddab69105fedefda2295664224aaf2f286f3ef5825be22088f26b262af29a87394c1c9e0208e9c3a2fcf9beaea8903c5ec6455e168a38f7cfc933c2aff4f1af83f349fa2b9dfbaf8572c282367eda8659930cdf79143c072d77062c3015d9ec237680a893757519ec1ca4bcf4dcc2d402b40563a9bd76de5da22d48b2291cae476342b314be57c22e6726692546352964a39db2813eef5f884c86d0da826cd978021deb615c1af6d100287645870137a57d642ae6606bbb96cd6eee85d07136d8267c654935c2bf4a790c810d689f27360e93439fc674fac5817271cc349c589f42e184771cc4370010caf72a45d39549136eae3ca1601903c905af28c3fcd385521a0b68721b43065521f5a88bbc719d63e1e15af6a4302d610d668a3cdfa34d48b25ecbed223b96d07ca2cafd374ea9d85b13dfdbb1683536455202bbbbe472293e3d8c2e154932f1f8b637b8754470d014949dc90a902fcada897df428126790548c7bedd9bf20b80a7cefd62f50854e816fce8ae115dc31c76c084bcdcd95b53a4b5de530759a2efccfd04d020292d3097a1e4e0d5b74d4b3058784f30731c598e0fd4e9f9a800209485977fe734e14d11315a2179780e964402bcba3ee9845299f9d2f8ca54fc05e4f5d51e3ad98c1c2532325fbc4e822e581f70246629162df99932f2f025afb5970e12e7cb4e40f055237fb7e2211f45e640154351c46c60f9d6d30713fb8cad268a29b51a394d4951d661a214989c38a8871ae43ce432f6e3257b841e596d7de40033378fe21fa82049b003d37b47b14a25001eeeac85fbf1541984c4b72e91750710337a34fe8c30104483642ad228e90c1c7b4368607f3ca1215b89e6972683c428654bb93991387d080daac32841b0451eeb453e3413e20b093ddacae786568e0370ba1ca666e00f3bd7c3abeebf33d476b646d3a19c44fcae2190ae7c57d6e91f839139ce4b7b6044f16ac78cf63c7c6b06c8224c18948792992ffdcc40049e151214535602ee550a9b6d42f1978f7e98a9db2d696c6408d475a31dbb9c96e6285079f8b326eeda334558bd39cded5d70804e3a3f03eb30be0bed625d8dac10b4fa1764e8a965e459f84628c9b86d23e29d7d0202be0ea7f9666d6ea8be9213ce807ac9b4af84da1d053e3808b8d854f5f102e6b3ae120deaf5e698a1a83f370ad90be26d832433f2ada7081ffc153ea48847380480a36b823e10cd81ed98b23ba1c71f7401328545ff93883246a39ec4c9ed1b948a99442ae691d2f0b5910efef0efddace9eeebf194de7797c590a157e38658b51b943eb680fe5bb2e045bb89b8a24282bb8fa625c5cfd259cd0cbd419cff4cdeda4cae32270942f7fe44cbb9dd3dd89b0d536149187f3f6b48f51f6622b24e60a71523d71d50f539fbf96222b6f52a9e45b34c12048a1f702a56a00505521a917986137d8eb600a3c4b727ef634461d86e2018ca03b4dbc34b2b5987fb5ca086ba0e0bd47726b07bfb7fe2ecd2c3379f35f0445b1df8eb4a85726d96632a38158591f5d8fa862b76bc6b57c6d332e2da28e297963830dd4719b98552bc3c3590070ab54ce06c29e1fec1052021bb886bfd9ca6bf5c52a273704090762373f86c39c530df466096527997cada040c3071403fb4411bdb6c65ccd5cfa6894d31672f02b5f98d414650c8c3663ed500b9cf55cf47e118e9ee7d3360aa079fd367cbc7fd99574725b39696e7512b20c2d4501a2168504dd100c66249173cb8d4794840359426182a824d1b51e2051df2bf7cb2d323a9fba92d7b5e026868c4e63d7f56f3c8e338ac017c19461c727ad849264f3e3ab91241ab022f17adfc592f87470c40f1cc8bddb43e021f0ecba556544540d143ccc0134312dd96a405dc64201c3ddb17708bc553fbab98212a2cf6109a199fdbe5d65373cbff1bddf2ddb5b5a3d5044ff8391cdfa580a5f88cc763b20fca1dcd07e8cf6b68fe86b7d9e8cfdb03944518535eadc897d7744c2789efe886bb632c2bea695c5ee0a33980658a5eeb0aca2431108d893f1217ba4127a25b1e51a7c45453af0dcc7c291a88ac9c34bd754e6af72972b6aaae918e89bf819bd50481bfa6f6728cf51eef3b876c117067ac50a4079c02340ef613af94e1913b8e4d539a66745bdd6eb7f4ffe658dd8f2e9eb75454d78f2ca6190c23b53e868e995dc0080febd8b12e503020e98be3e25e693f07b9a5bca0dfcd11c3705b907a844c4ab8ceec2a323a03972eba8bfa1f6e110a3266186482393a3ff824deffcc5b5c83dbb55dbbf14d2faf2f9a91aed1cfcfc0b3abd00622d97deec9ad4b9eeff50452a62ff558203cf8c3df03aa09e3423bc6338e66e1b95dd50b24bededaa39040e8abeb055a70c3df28036f5cc43e4fc4306e4f713f1b55a13abf6d94c314ae1bb69d30196c250aba16299c592a7236c01f355539828a6920bee50ab18280dd5596858b1f642ff2efe0f950bf6d70908b40a5ca6e37a70e25285bef46b742f0fb917318aea863ee34ce7839bdd64c3480f9e7960785ae623f7b8a1fd810a6ed3343ae4c3dcdb6706ea07c6951770f25e94a5747d2dfd72eda2b580c3ce62c776f6b6b841ce91f59996758bfe012c513628f70decfdebb8c8e334702191236fe59040a5a16964ff176d864fbf9d47904368c1ea1843745c6e9aea9b073ab920051c0e2daacb43abe36c926741e12b50f2958576773a8f9a204f6e79e3af52c4a93ab015789f70341bc24d4bfce7ddb91704209b1095e0a0734e18ffd62419a1f925b2df16117f337bd6a3bbcb3e447c0235fffaa7d4e503c1bd40698e3c976efb051c4e25b8b72b2535bc8eb2eefd3812a39828b87e2adb7b3230e91b281a69fe3e4485a8cb3a4e6766ae94e1c48cb65711a5defd4bf65c758813272efd741156d62cfa03a8d01e91cc2203ecf2902930fb0cb214ef8cc427be957449f8327452727c2d73f854c3db111dd4cb3e3d3dd97523435ddac6ec95260019e076ca5e1e42a60ba53a58a6c8c8ef4d57a8c68f7a38bbbf835dc25d13d90ba4b74ea2355737dc10dc3ac5ffeab62177b2739a67f254235e94fd2e71b832111922267a7349c790108a9d8db8807a00e59d1011e5fbc3979fb361605b32f79bf04b427a990e0be0576d5759e6b936cbfbd4f3c297a73bf90c6b30e5fc3c76229ccc3f2af002de372717aa4be8a7230084242cecedd181ba4072d0d22f26bc8a334687153c86be4520a5ef06a6e2017fed48b279040b41bdf395b23cfc435816093b1879961de314cba65650e4a88221f57233c13e8e0dde2f02a7e85dc0772c6df71418c19d048a554248964177eb8b13ba83f11a190ea29540ef65920ccfe8196456791d4c7cc9af0eed8b17638b49bab1fb36e2eb65a5fa31c5de195fae051a4ca7c26291d37a7f40284461dc9bd5da48825308b0798718759291c006885a81485790ef4fbad17a134948c465fe8b3deb8e557a20c0d4c0192ca7e9d17f1ba4455d95994a824935284ad3b549b18a63be543dfe1228f87c5a65b3b757715488d64e8505bd2f9081e6e9d47a1073418b44da8fb5be3a07b1cac4ecb6b8d85a23da8b21b9b55b1f75500064eb5f1b74730cdac588823dbd13651158194cf9ab55d32b98fe1f7ec27e2a512120dbca15de26f9b2374d32d12a95ce65010796afd86cc4b83331115e5d46eb7e7778602389fd02d55eb74a60158ecd831c719f9c690716b6c9c7d1ab4a178ff114fecba87a99887d4224b0a473a2786fd26b99085a96dbaca5d38ce2d7ea56cce3ea80e48bf7f6a672c54479d3274f570e4ef0c71e27efddffcb02d6fc4206f3aa46f7d9ba09d0ae84a5515d86536627dc775d526d873852abfa1a90a8713f62d6562929886a3aa9c072db3e11c076a7b52046cc1d278c114303d66e8aa24eed49844aeb7246b170ea5c99782ed6adcb5d50cab51897871b6929ff02a1fdb73f5a85be7eab496218c8e05502ee967db95eeb4828d93df28a996c35d9cbf0b1d1817615fb4e3e19cdd4e918a2cb7007e2babc3a298801bf51b57b818cf7269f16b8df10eb4b921bb0f776fb726c78e6e7c549cefd87f6ad312505a184c7815c9a5565840834d4117d7000904f4ad5365851385494d1bf589e5acd12b76603c9667e1ef092e0fc37c8035cfd01d05f14a31efe39df9228814af7d2b591a34de06dd3d390003cc55adc4126f026cb2e9af2977352d40cf79a996637c732af1c28c2184fb754974973f71e84d6d902883b05b7f4b3e0379c8df8c4d4dcea501a7131945035d3cf571886a497ac41de69ea21ba4ea71ea0508615194bc19add054edf44128c1694868eaea14209aaa2b62b9bce743ad42998bfbeda150ad25524787005f4f9ba12896210d77ec8c0441db24c728ad3257e24f3b76e42f34cf95440989619a10f6fb405babe29211c35304b6797434f195023752b9d5cca46541f7319876a495a5ef3dd562e5e34c7a0942a8ee7f411362c9153cb67fe2f1f5cb4227cbb06f5b054a2039636b3d75ed9268a8294e5382405f6ce2c331c0fe3309801905584cdb91782745be505b940d15744de992a8ee35586c7faa41df9f1326c1c67b636cd06d92bdc014f47a72a374db742b99d35405cf55a390ab03d06275c9f341481404d226985a7610f1b91fb5b730d8343545687000ddeaeb25652153cda362220c5189558fa30e0f78fc840a9605fafc11d33c8572c53d1441b0e54ab67b36be4c4ebc67df56364520da5357b45aa6e871a125994ccac8eb8c2726fd41156c8d10cd68dabd21437fa25626bf46d0ca804e4022776a8d13c944cc63d85add88594377b468b20718caeb93f5666b57a08dcdac270a6d6336bac5ecae20f198792a0003477857c97bec7447533f53bdce847faa4a7ee41aecdb4a4d8a88330a9fff9241145ff70c40955ee214c3e535155c442bf55417f92d2fe0250c407f7a75bfb4b06dc04984aedc7a919679e31f513082fb66af25d8d77ca0ef74404c524080911e081f80a788bf498e5fe620d7bc30afdd115d7bd407f80b24a70e608e2fe12f8f048bde50b5fcea640cd5eed1796d6bccf4b2bf29d3ea23ef01dbfd5e08778127bb77d1404e14c3300b14e5810e7e0272020f07b5d05352c6906da1188af254466f40089b49bfa9b23d572e10ff726a98423ea07d835ab5bd6e3497fd4fd760bc124d783a3ec20b93cdf3ed66a33db0e2c7af7b528c3ce5fd5b14c371eacf114e440ff5f595f9b6fd1e55ed556b6a49af6ab141070c2fdf24e4f662edf7fa89dec93781d0375ac5f03aafd8e9c55208cbb69c6fbb9f240482d0115a71a5c9640ac3f53edfd1bd0596542865a048075c2d95b331a31f77ffa9937179c7ab7bbba343b743973436cade95ff6eb28d197926fbf6d7fd2ba511312b2b2b737e926444a29033209d50ad609dba6bed2093f5e55625bf5d60864b09176abe5d34db99ebb95b3ed453859ac592a3386a2ba79894e157597d86b4ba82997d8d6b4ba1d7510c263d7f2f679154077a87dd3dd55727ad2d68eba4a4c27c925f424a68928fdb67deea45daf99b6a46d4b7a6ffb763fa03b3ce911c860abeb92f09b360a8f69239166a4ba358d547768d22552b537048e48d4587de9e85f3deb4b75acbe545549d525dd2925a9af52b924c15e557a89ec5e9dd33a9b57a75749a9ddf4cdda4daf92b25ebbc9ee942e51d8abdf6b5749ddab5b254ff6a6cb7b24bbb997d84ab37ecfbacdaccdde5c8f64ab45c2b6bd25cf6032047a930e4ff54dba44ed6d3b88e20e1e04733d5532a1eeca1d5ccaa2cc06bf9d0a369b9bdcd69972a99550b676fa6a557ec03e75f1533b1666efaa6c42eadaa91152dd297d02ddf56578ee1255eee04d97a81ed435634b4e265b73e52e92d3b56c22d29e1d3bfd7bcd757397c86eacbeb4f0d3a4b1fa0a6fb469f028bcbf9ccba48dbae90eddce84531f7df4a1c746a29b7b5025526d4e5332f595651fda026bf00a027406c68068ddb64eab7cb1d95b996ea1574833b81ca9972b57700fb884aa4b6da80a4ca51c15d95a7d2141b12564cf3e237049c7ec6c23e2f4cc4ba55f344ddb3452dd95d6089451d5d6111c7d58032e6d9a2d4497740b39c74daed65ae924f24892bcd76ab55a40ffc77b59acf1540e8d73b2209ff596ebf3ce19547b387af57bb2cb52acebc92ed70daa52c09142cee6b64ebb43fa37fbe8a173a8ee669fcf3b2aa16e920be4a8bb699ffbdcfbd6816c63eb266d7c36d621fa2d7d1f5d6a4363a9b9d345e2f37975cf96e714d233a7109d4b708f768eaf5a37eb909edfab832a2b043e342b9f9eb305d975069bfd538799fdf31f2f56769097748f67ce48d9411ee4f7147ae2153b4e44fd60f073ba7f7e7e8efaccf7cea05a53778866ad7bb4eed9e8cc5cbd431cbd433d3d3defe9e9d1582c5d62fbfe74918cf709aa948a4975876876918c0ff29b590fb2acac814f087407390df2212fc083aa2b971f8b60a02e2f4da39f44b02ead8b842621f2225eb619297bfb4433068d95bd7d5e24db4ff7c9272e77ef7c689252071d70b5830e3ae82049c9a7bb00b20948e80ec03be86eea7c3ef7e9dc381e797775397e4e0edeca1ebd0238969f4924e385fc9f5bdf25c5c88f3ca872740800fb4a37800174d1916f9de4c18f3c29e8468e64d20017fa143292490368520423df77c0910b69143cf8916f8d0298220f7ee42804ddc8a7d0bc00b0e048bef7b2aefed45a7db97a5e76db35de740164138602f00e349222f7794f2ec19dcfca25b8b55b904da0dbc772a0319f6ff7f9cccf3eb759fb58006413e82e802e03f0227fa67bac4430219f3c37b7751b0905deae120a8552ca20830c3000faf9c1608379e7e71d224090201a3ca872403eb7edde7b8170f59a4077fecc0faa1a74d9589c7b916ceff9987b94f892665f99a2cde6b26efaf8f8f864a66be282b2917b908fbc481e1f804c77ce746365b02ee388b14bebeb1b79d09b18d1416f72e4c966dd8373f35e2633b3decaac7bc1671ec06b1b9f1d72fcf6f1948aae5a7d01999a2422f2f173f7e812dc5367cfdc3381dce63c77505612f2202b0911c9a5d2dea698b3e79edb4c0a9b0bbbd46d1d83bcc1061b3c755b1b689f7b592c164b9f9b63abf579c78fb9c727933e073a01eecaa4cf0970a0711c47f10e8d638f267daec131d0a4cf83fca7479749bb07534d3d965076cfc73cbed4b67eebd3e5ba8bc5fabc2e17eb2cd69c1f73d9a391eabed7b757bb43accfcfac75267d740841fe730cae81268982fce741fe73eeeb80641aa78252ecb98486cda677d3544e7dd1232983cb6a85c6214308f2211fa28db607f9dc64083f9f9fda68fbcfa70640aec12906a7e5e918dc82276dd6cd5c45d2d263abd5f3d6b5abf512dcb3d5d3eaf9ec41d2bacf67dd07c859f964412ee9fef9964db0419e7399b435b84f2e9336063f3f079291ea0ef27913681fad6b197c6ef00d7ef1cee0ad0cee0d5e823b830d7eba4bfad8e05a1d92c1b50c3e2f920d746d730d0810049541c620d73740b9c2a96794c1e4cbda06c839dc757508eae4c973734ef24195247f39dcb55a6fe1db6ae13b8442dd5eadbe50f7c8930faa28542ab39ee5d2a6a976b669d3c4a6b22cb39eb23a3dd9e7d2cdf3fc52f3d164d6ee10dde3b9f9da064b93b1325ee0b2b6d963176c676767871ebf758fddcfc901abd56a1960b7aec12412f4d65b3bf720effc48deb991bc73569e534806b403ba5b43ad2efbe6daa6bee8eb1ba0f165e7e049c4ce993f736ab06b9b3a0475fa9d86a7af717a7ac611e31f9f9308a5627fe87f00c974a3b0eecbac87b9b4581766d6bf3c37a58242bd27974abba767688eb9c4f6a8438e19751285aa6d74747474ce01c973b45d581f4fe6526993e76c07846cb53e40f7bcf7de3dcfd36a691054cf6de425b05bf7de2799fb5e69b77299277073ebaa73b56365d78ff276e90ce805e35bb9dc608f0fb263469dcc3dda2ed517b569ea8b3eeb52f3d125de3c9fd3fbe4b99d03ae448ee3b883dc579c909b2e0a117972494b6ce7472ec10b3e807c1404c3baa41b7f455efbb2b14da95881d3581f8ebbe6d2508ae9b332334bb367b666cfac8d9197da9197d8839763d0cbef972fa19740077859e40099bb509e73e73983f29c1e1c31a275f9817640f7fcb27b1e54ed1c4bc4daa53aa4e7f4748d05aff225deec0f953aa4c269627574f91a7579962ec7169d9aced1a38b305b007b2e6991c25eda4196d2bcd90078eb1847bb9e1feff94e2e95f6ce39b0eb6e927cd7dfd4171c8eeb58f41a4b6b5fea6b1e75875a7abb43537777a87a3185286d9107065c562fbc981cccddb373d6691a32bbac70dad4217329cd984de9bb9b647e54a954a77788e79c4e4b97d86e7d3cbd4b6aeb3aadfce34bf545e9c6783492a95b1f75724d8354f70f5dd70440003f7fbd5aad1bf429347e1ab90777c091076914827ee41e6814c01405fdc851f0e0463e8500f0356bb0346bd22cada92f20ffe1c18ddc011e68003820481fd167b24b26fb086803f901e4c78fcfab047b9007d556aed8eb95037021417e02f0798704906b99faa20f407efd00f90f5d62fbc7f899cb207b9eebeec47834f72357129a2d4d8a60e4475e64e447741298d6936691911ff9119d64e7d81f7a235a49a8d5d225137a87743e5b93e7269d9692d60130e6d7363e75b7f4acaf1f575d3fc8fec8af631900b902c9af9ffcca354c9a3a64c9748766359ab75b89622a15862088f1f779debd5dc77128d4b6b1ce52a974a9ad5e9e38689dfc9c1ca85e661b8fa42e4ddb9b53888e2e4d1b7f95371e75896dfc957755f63ee710d53d4f97a983c757e5395f5897ddc5075931cf83d9f4d4f7ee613e81eeefd825aa21d0ef9a2eb97fffb2472f084af3f38e33788b0feaf21b3fc87eb96e9ccbee27ef5faefb7e7bda887ba791b2cd69ed136b2f4918ca30381b09dbf4aaad434533dcac43b0ddaa824b25fa4331cea85e493d928d01d39d657508966574ce2607375b9867cc91d993d03c976dec25529645a46c742087313b687183183453c6367e38c28a1bae60420b0c0cc002060b5db0e4604316ed851f54a4d400839c2958ae6091c34c12429001060922d6e851831e6fa8e186161b3417ac182d23588105192e7350e046cc03d4d0e20e177420a28a0d1a1521b4e4c1c7186fb6d461470b6628614394385bb26c218616a51890b0e2cb9739c0f061c61a54948962c40f6f207183c6824f9a15c2b07144112db4a04dc1020e2d7ab85181092951b036591b6c60e932860a52cca049e9018e2d627648210d9827b428bde043176b7831250e0c53685fa8b40104176c1c81455b61043cb471650a137850c94253215c618a3055bc88390386d29627c4dc4066882fb8c0a024c3194e1851051a5b8268438bb2c3136b10f1451a396a76d052d0001b1df690018931e83033d1f041431b3937c480071e4271aa3c11c5183b5840c1a90f286fb04081831c38a60073e20302419029e3839921fa909285cd1c39a420650a20b84c51460f56c098600834fa90b38712181cc0bc70060b2eccd0e3a487111d6584b9c3072e589cb1c58719879629d8ac20e6862e6220420e3839c820c707386caaa4b0020e071f76e8228c14cc3491c70e768481260b9a22b2d8a201727a9072022e54aaa4616a828b34a2a051638f24f01801cd0a6fa420cb0ae2303307083ede9420052d88a1c313593634a298c942052bae9842003af04893470f5178907252811859e4d052a7507a820b1ca83803c51461c890030d6b5c98a18c1c3be0b863022d14c1660a14f47146093b948a2063ca1c708c10a28c1d5b2eb05485092e5b442163ce132c659459d2b2820a6bd4114e61830b17a05823054bd001079b28aeccb0c69531d46429b344c499384e90831c6d686e94c1039626a860b3c51c6c68e9801a4d1881031d38bc51610c140c41c5092c2d60e1410e2e6f9628230c3db0f8e2c5490e6b0f35d0b81113c317626a13130e1632e86843a5071fc064014408c4b8b0c618589c000619e218018f3368a02305375610e70407d66288a5219640e38b2c59ac0011c31848c0d1820e5a8819420935679c6125cd1b5b3e2ab278a20915b804c1c61755a22cb10973a5862b6e18991953a60d1a5cf0228836a4f040c31362ecd0030b347868c307195184704309382ec046172be0028c0c61527062e3023069b0e882c594285658430c183124e1e50b3267f050c51572ba5001c7152f0c514410710ca18611344c21738a5301334a54b185943c84e0e2a48608944843073869ecb074450b07f200c3a58b2b567063821384d8818e1eea28420b1069ccf0420ab038820821f4b8038dc9c60d971eba88b3c70f514c0088384c80858b209e38a384821bc01cf1c514546048e20c3bc496994ed849d3aa1b4c8814b8ace922859936cc50aa018a120001a60b12675871809914f090c7155ee8d0021d72bca4d1868a1136305106c643b7023cc2d020c60446b031d4a68a2a6f98a082cb166498c92245194b2861c79c14c09963ccf046981abed8a3cb162d4a425c49c20926dc60496206333d0041068c153470b8328645b3c567093738f0b0268e1fa0f8801467ac6ca185971f5e10838a4983893774ec7045853bc2f860cb0b4b5aa021f3c60e59ce64e9a28d2a74a8618a9b0b446146156ea861c40b6fde30c08b1c3690a14594388800e30d27ca00a3a50e1fd2e8a205a34d84bc99a558b5006d6b2d5652aa4686016d7ba56dad1d31986199e958ae61505a336bed91286699b6af20f05176362bb167d95157cf64992eadb5d38723303a6a18ad5926d6302cc66635dd62a65a29d67578cbde6559667dc0304a699c8c525a6b7d236f8c52faaed24a8feb4b3cca35c3b00c336392110206ce6a86611966eb186b7595029b5836b36c6aa7ec42c0c0b27934cdbc669165733ecb320db5993291cd071b23af28528488176d23657564190d5d1898c994659305cc846126131e2d667ad999e6f398d8f4c00613128695b0330cc37eca22864dcc075c76593e1a47cd8d6962d8d462939ddd9485bcc165374f26932ec59de9a39712d99c59966559a6b5fa3261221a189e1a1b0a02975869c2768985603776ac3b993424ba6f309930133645ac69b8341dbbc54cc7b013763299a8c944821b031552d8580656904e48a738b20ccb321366321dd34e278b6118663a65a4cc9489f6872c33994ca66c4e712365364a93959cd7eb8d6c6736b399611866adcdaa1af90227a6b5368e1cd9e9348132ef4c63d849cfbce7bf8de6717d59b1be7246336c1fe58d69ccda164e9906f5354f265b5f1ac3943212d46a79f052bd74e13022a8cf7a650cced36a9f7b3b3da866273278842e3019c2b7ed356d648fb7d52411dea7e3126f147684096cbda861b45aa3b0563bfd3d48d912a6898df0f866ce79253ddbc822657bce69b11de697ccffa8d48ccf7a9489b3186c364f227803c2d9816ca669182adb9b4e132b43c7d031096052548fd119ac28619fd24c41806cea26ad9e82ec0c4a7d65154a7d6511d84936c89a90ea3edd6af9e8c7a6435b92176cdfb46185fec75e5553956ef59a4fd7924cb043277d9a48c2d4c35c1e05d937a5e9982ce89827472558a952a584a32678a4ccd903d873698b349bfb38ce76a63c4f9bc574d236597b97d0a48dd95c26ed721ea9d625f4f5873ab02c5bb13ed7602a55a833d68aa652199bf3892130b8a4716c2c0c55e751a99e44a652e7b94a17b99254aa548a6257b344784e4fcff1642521322b097db943aa22da6bdc29a2692e9d4ae992844dafa7fde9d14055cae66ac743a74a97387b88b1bdb27a26e6d5b333a878234d1563b08be4f4f1601e9f3a47731852ba7a18de9581c84ceaf0b474342902f99e3b80e7d728b8cef31e8d029822d7798ec2cec9d7a62f8140dd9383ec4fea3c19c8fea4eeca40f6273c99532b5d16d9a178aa3acd4cea2b5485c73b05a6b6d2b677756e95b33b149e9b57a50a33997a787a31936790a9f35c9fcc64eae4ff9d4ca6bef37c5726531a094d800cf8bbeb3de4319e8ba1cefaba04ead1e52c8377b0d44eeaaed47972ea644e5d954fa85bfc0caaf7aa8759753197495b3ccda90755552eb11d9eaeb4565fa9306f1773779a511fad775154a99e4a5dab43ac6c8e76e1c9f03c571222cf5a69265276ee3a196a5204f23c2f22cfa393c0ac9eb4a3c9f04a42d3fee0b3f44af3e824972643cd44ca15fae54a42a40e75024a80ff9eeb43b13fd89f04a688e73b4f0253449ee749608af2c9bb74129822d7b54e6af21d9d04a668e72e9d5482e6d149d3923ae903fd72a611cb19e753c8a5c597b30d8f06b23fe2a710a96f7f4429efd134cc4a7ba698d49778553e9a6dac98b32abc0c855adba97f87a454a8ecdcc59377b292902b2b09f1642ab4a3a7fd71e9697fa650ea41767b98b99734cc6b97346b652e9336a7512491e994deb2ea0a0d996ffee0b24abd542248d987a2c0e55c6a52879049801245634ca6d7ba51323633dd96b34d102093bdb66d9b4e6d729354026741d566a4207bd34966706980a309671b60064dab70e4194c3777d4e6b6639bb31d9116115847c41ddce2ca0eb2e792166eec2dbe68b1c461ddbc21501a339b5990d5e6cc34b7d92cd33328fb61cd9a50cb0fccda89d51ffb390f14949d8ed2b48e52cae496c8149a6960aa755236761a8595ed79e395849ca8be7a11eb238b8a572909518ddd8b869d6a6aada4ea1dc2e728099b625ec6a91c7e4f65a51d6a5b03bde03bf861f5b5796d4670834ba52f9b62b4bbb8e350f3444f1f54b10ee8952d58b52f560d6d2303950daa51e2363188b1679b18e6ecf928f6ddb34d0c5e2cb0e4a6ca864d2170325583e712186bf6fce4606e2bc8d417c23ddb30d1036acf2528ae6459964d0c2b8fb0899da61246d8ad494fcc56224c8b15c8092cb670ae14d0f8a10a307c702308abf980850b77b06183841a18729062c30a536028d8218e0c730cd1021951685ee4e86ca525c478c30c3971e6a0f1f2238332f08f572582615fac78e39a11420d14377c91840adcd0327b50d306d00a53ecf1e58e20cee021620c5448637e5970f1218a27d4ac6186cdc20318786c4182851a522013471aaf1ff505d4864503a3820b930abbd6333d68c65cb1224c1a7850d17650b3b41141c79a37c24cc126090df3420d139a25f29afdf5c33585d46740062e1fa40a55d7e4605aa0376ac46867c43945b021c312549c814617353c60252d4b2cc96085183bb850a39e5193428786a670c51ba93214a5a60d32494ca1839632260043015390b8c2041b15d0908706241db8c4bbd62007c33a18038b2a68ccb0070e7c685caee822d3630c38691461c40b5570c040ca06e45cf1e1b154870b3b648922840e293803ce2517c89023ca156a74714308fb4bcd1a7744a1c4921946d8a16db9c28913142eba88c209375eb410450d22c23340d308196c5833050b229888636ab9224bb83110450d7358385347115d84300cc3b01a04a88c206e5022410871822cbe6041230709bc2044144518d1041a2e64d1b0581127c38c1873440c2a5832b3c2e93833e70a2abe30d186032a8592142ad2d0828923d23c81c495aac515346c43ee98e34b173918f1c60b42d85f68e06459963911030c14ace1c5882a45645996655996c3ce8e804c698c163d5c5133079a21cc10cab22ccb8eba7d3a9665599665d8b513062ce052ec5880832505ca444d1740e0e0654e1c3ccab4a0051573ac0963c5ccc4e186394cd0c5127994600c31d0d08152c30d1936b868f3854bad500e700494c9c169d75a6b196b9b985ec4c0058725e28041061f342b63a450677c084347993be064710643b345470121cea890879b30dc0853cfcc20850c51dabca0a6ca14704c1b96d05c34fa20f305063de0f011050d5ce2c901b6ebad4d03850f2b38a106172bdc80d16a58e24ae00a36d07842872182a8a2d6336b3cd8828b2a777869428915588d8613e00cb4d147113b80c1c4116ed8252c0628c2ac408b9b2d6ea83643174f8a931fb080f105cb175db43004434d39436b9d706ed818b73122d3d21a65d76a860b27b450011477c4e162036dc840c19c22c810038656021996aa6c1b2323c713667a3033c613530849408c0c57c891e18d20bcc0615287cc296fc05162018b25cc30411e706cd821063e3c252456f0228a2aa250b9e30c18754f3877d44ac2e460ce71636aae7471040d66ac7c112a8136f6a24a64d60f300d43b3b117a943b42a1b5bb2228f8d61981a5e9ec8010c183ae26c11c238700c3c2f93d1fe9081cb715461db1d54c9e0263e1a371c38d3da9422dba6ca719b8034a843ee4dab9bb87314f5c13e71188771188771dcb99b82b6f6ee362bfa1e666b57a956aa4f09579997fa94504fa519b6765097a7a38636930619af3077551eaf92595f40e7b88c2f7ecaf7507c11bea88bbe877a5e2ebcf8a2d555a1a8a7ac541adb1f8cd3242982f8d445d3945069977f6d932e3f78fda8080934a5ae9e6ae0723a1da5734df5f0a3f8d657ac9397bb19bca76967699d88b54e043f71f79be46ad6f33c0fc823f1a72fa76927937c1a4803d5d7d4ce69ba6847bbf4edcfbd96691fe388b1fd99daf5941dedba593b98cbeff5e2f1cd9a76ef81efaee5f283ad7dfe6a57bbdabd2f5f5bd334f9bdd3259984fc3412dac7dc1f70379344dfefc924b7fbdc4a9bee79ff4fd9b9ebf47e3f7ed1cdb48fd4949d264d767777ee9ab2a33fd8f32efdc1ee3e4d7c97cb7b508f40065f7d4cd346e2b136625d3bcae5d54745b6a83d5d1e15d9acd7932b8d35aa9e5dd3656bb552a9542aedded3ee3d95763d4f4747e75ad6d1509ab6699ea671b9a7fb7eea5314eaa77b3afdf4a05aa2bad3e9282f9745b6f799cb0fb6f6f1d3125989c7e4354be40f7509b4e7b1d6d1a5c6d2255e893aa5cb7b0775f9c2ba04dade3f6d53efcf41d6cbdce7e9a677f79ede9f7489faedea55e29df3b48febfa453bf7e9c959ff53787a348fcb27ef5c67d7d5257565fd9decf3e77c9edc53e486e07dde21ef5ed6777d8acf77f45d2ff2f9ce79fe1759f01f3cf3d7f3532cd0d3fe789a2445f8f38b78def33feb69a7f0bc474f3b7df2b43f3a4fcbd54b6477f71b02507d9d9bd9f5fc293bef39bda408aee717b99e75d1ce7bf4ed0ff79ee717f95c673dc54763fbc35deb697f94485284fcbfa8e73c5fc014923225eb69cf7d4acf797411fbc35d69bbf2b4dc3b6d84ba3d2ab251faf48a3f28825222abce109de91a87b4310dbbe974d6570eb298e9d8bb8cba86ba7694a68fba128eba1a856b0ba6dbd66efb76cea68e627d75950e3e789cbda3f2c4f8e3477a17fdb1a9f77942cfe69680c7ddf151b9ec3e4d761a04a5cd75faa8eef520dc7f197f5e0560f0281069e39bae12d4bbeef3fb3cf801a5fd6910f4ec4e93dc8dbe77e7be771a69cf236d30c8e25c76f81ecc25784f8f400683fa1e6ba3fb4f1b8dc747a03eeaf645e9f2a8dbe3eb7572896d151e59e2b3635dae54aa3975283e14c3797c0e8b6178eed4a172081e773f8547cd83c762f8eca7f0a879b0d3657624bbc372a252a14ed54b5477eaa89cd225dd288c5118e36b288c426d014f37f8a98da82689ec9c1bf87997d8cc81f6dbd6e95269cf5c22edf0b312693dd49fb631fec1b7eb40d07e03bf81200882baa45f0e3fcb6ee3dbef46f3ddbff9ef21141024c11be1cf83f8f3feb347dde6f4f68a2bd2aeb747dd3e816e6ba94ef5965c76d04d5358caee128efb367e7592f5ee3a29a3ed1fb7e5f05ec6dfde82a3d9779ca99b974875ac4b13be4f68edf0f8a6cdf33c4fd42028ed107fbbb75d954bf01beba2a9dbb67bc79484ffbe65d355e21d831bb88124084a1b3c168fff7d40698b1a043d1bd4246cfc9284fd05d92d97e04dcfb2fb01ddac7fb9fc1eea11c8e04fb3be6923d6456dd4faf6a00a66a4acfc3452b6597ad61799edd6a70efdd622c767df74d9e9e8e067781cbffa88ef9df3c62cebb6ef5eb6e17ff7c6ecd986ff81bacca877ec71dcb30755a2ba65ce3ba64b2ecbde3defa8cddb36971ddfe9fe8ef57dd524113d3e3dd6256a7346dcb58f5e25f4da35eecb1ebda69dbb98cb6ff1602e49d8a0e7e9b2677bc757615df6f0f0ececb85c24d96ae9e88c238bb55aa954622a70b9808080980035516badb5d65aebb8299d73ad8f037378dca9c097088207418cef812f2f76200b775c97d2e1b8711cc7d1f3eebdb78ed7169b783fb6f7c3e55a9dc5d2aaaf4a71e35197187b2f8cff83a63d79f2448e3944b23bfec67debbaeb7c98e43411e86db7db8e3dd9f8d3b4eec993275d2ebb739d46c248b2c336d975a2e87da9542a3587a6699aa6699a8684618cebebeffab0dd29cf7327ce6a49fbf44d2345e8cedd49b79d33ddc94699d417c6a4c691d38917c7a7760a3ceae0bf7360c6ffb2f710ce1a8cba4b5007c10d6a278f3bc660e6501c3eea2078d455f2ddbb247727ae93a8ab494edf22d73da94fd7bb89d34cea0bdcb615f656ab636d147ab9043552ddab2ffc448522caf354aa772aaf53a9542aefe0bf4ea552792acff33ccf93e39d6eefdfe781dfc1cf0a22be0c82f8b31fa879efce793f992e9177a9132727d3edc00c033593fac276dd9cd7bace8b5adf75f4b4de8bbe7f9a497d4d4f33a92f8c25615f55d08df2c73eddb54f3f75fbd4e99f4ea7d3e926ec9d3d951a8735ecf47aa1aaa503080e4ddb585771abb73eea78c79c9753ff7227be4bbd7b79dff77ddfe67ddbc55c7adeeae0b67a50c5db879b74dee66ddee661fcce6bd26477deea38a557dfb4d1ea60f7da2b3deb8b23478ed51a4715eb2a968aa552a9542c954a7555fade0bc7f77daeeffbbeaeebbaeef57abdeaebb5a6c9eb9372cae613ac5235dcc0929234cd8dd3992cbb463b403d3b8a76d03d3b57afe512696b59f6ea1dc3325176ee5e4e9269d3b912b64997da27dd2a12eda7139d507b9eba8ca21760d76ed2e805d84d99684bb2698cc894c4f4d3eeba8e625ad850ddf12c72fbf7655c7178fc8deef0dbe701efe1768d5e801f7ee3c24cd43dbc9793743ad4587de1138549c2776137eb6b4b6d9bb87dc7acb5d65a6bade50eeeeda66bb2c3469d263d903a78a2492f289336fe0e0f7e6efced1ca841301375f7ba7b1e0e454e14df85198b5d6bc4f8aeeeea0bc17f2b30c49b4aa5527ddff77d1f1b209247c495d2a5e665edbb2bcffaf3dde350fb3e22dbfdcbf6921e481d9f48fc8e2fe6f01cce44e2f1533909d644f8dd5339097ed77d9f77d003e0bf1369f482fb501385ff0ee624a1c62ed1777c3027f98ea4ee6f63ddd5d7fd97bb2375f88938714c259c36ac84b184a3d14b1adb25371dee5f6a3b5e121e3ceeba94260a35476e5b099a86c9f0db5642092590df72b96dfa6824c9ed68dcdbd1b8c9a371dbeeddb6ed76dd15d3d0344dd3344dd3c612f697fac43b19efcea569e3693c8df535029530fe3601643a67d2b40ce371fc5fafcc843554e7e1f12f274c809800551aced852202b043f4d1bc76d478b074550d330fe5fafcfc9ce5d453bde5d4c4270d34662288ee48a35aa5aab954aa552a5543a3a3a3a67b85c40aeefb8f20e90eb3b40f667c2d1a9df13274dd34e502c141b461977f595ce5517c7ae6381da3ec1b5394f83a0f41d979cce411d1004a5edfdb39c87d2017574583adde747d64a756feaa6eebd3775efbd65b458b5f3024c76162eb404ab1b408192059c30d5bae30539dc3ad8ba20c771addbbaa78d5a5c2b951253622a954a89a9542a4ce9300c4f2738dff74e03bf839a565f18ef6e8921b81eed4c1351d7ea769ad9c5266295438cade3c26f195f2c8a7bdbeaf78920f710e4c0f0081f896279b4f1cba3eddd13412e3c1237787c4c1b710fb5d115f391b8bd6371739b2e8fc47d53de4da5baaeebba6d63b1582c31c4a30daa8eb12eb1caf38ec9af56bafc391235511337c69a288a47e26f15073a9d4e279389c9e9644f278ac2ff7eca259009bcb5dd3d263b7be681c77782b593ec405d80ba8a09f1a645721f1c7b6d621d10fe4782df3f8e186b5aa849b0a847f368ef03bff0c398c9ebf58fe3a749f0589724f9dd89eb3b77d2731e7c8ffcb408aeefbcc8a5a7dd29ead14fb6779e271b7f6e26db03315078040404c491ad56abf50688c9ee3ad2b6f028863b40d48913d74ee6b92bf7009122ec9ce7453be72972bd871481e73b2fe2d9b92f3a02a2293001d2a9f88cd7c676b45a939dd997a7a14c9ad3dbc9cbd336397a2985397a71d5d601e4667551f57bd6f885efb2379ed0b3c37bf8d575dd35097ac71bde5407555d93bd799a86f18fef81f78e5e206eb2bd974db04af54d1ba9b6a357f9e9a3d75675ba3c7aedf1f32d96ceeab258ab8bab8b2b71258aa2b81245d1f33851731ce7e6d5a4d3b96689901f5762f750d32cc6761c3defe8f57d5ff7ae7b1dbdb0d73e818ef55301c330284b6dc2eee3532d95f8e925f7dcb95fcd694fd5752af09efbdc49a026ba9ad3a8af53759dd8899f6fa5c430955a855f85ab70b55aadc2d56ab56ab384e8aad1b695a29d850b9d6ed24eed4d1adb00fb2983c9a610fbc4b6d1c5c671e2511ceb2b9db7bad43b9dd4bf107bfa9df794177ad7eb5250ba7f9f6478942ec925e03dd43f5d92a12602f59c42e686b23fd04bd9edfdf3b4d17da88d748eb2765fdbd261ad56dfa752a93a15d7799dca4389222a8bdfbbaeebbaae0b7cbaf1bffa9dfefb30e5f0b679ba54da5f2ea1ec2f7c2aa5c187794e21a02eb1dd7dddc11c64bb7cffe512c97a18538c8fb3b7047b1a11f80fcc26d03ef6577787a7904f6f2294391ba98eb47b03c3b45336af604304aa135bf843a1de5afdd3a509d83e6167abfedd7497a08e35a84150daaa73f77ecf65eeab5cdecf835c787c0ea38e7399b4f10782d2e6fe7d477d40695f0d829e17ea72250aa5bf639c360a0f6aa3d65148b5c49e2645542b3b4a14bf675fd7a5ba4feb50b9bbc75debf0bd54f71d731dfd3acd7a86caaceffbbeef63e369238e6edee93d6fdbb6eddedb7df4eab2ee7bf15ec658055e05de874f79b8c362f8fa6b5422d56cdbee058fb3f5f0e9de12a94eac25dd3a4e59f6e4743abd4ea6fdd170f664634e48c0e81e5a6cdc778ffb32f82d779ef7d15a6badb5d6daf01de8fdfb365017912ddd6de1e7077e1edeca27fbbbe92ad94a6d7f24bea74bd209f9968775510bcaf63ef793ddfd2b43efa0a791b08ddf81da68bc87846def1d367e7a5ed7719cc87522c77198eb448eeb30d76d294ea752a94e8bae3b7dd76958974a5d2e9fec2e7c2b6be0bbcf3ac43b98677d2161985e275d2b93f616b5de75452d8dbd9ec8d9487653caaa1706ce344fc2ce6636b39d31a8d40b99c7f328a91856230100080316002020100a8603a2d1601808921adb031480117d9840644216c863b120487120c3400c641022c6184288318618a30c4d9d00ccd7dd74961c2dde733c0ee8c7e38fb7dd1cd61f6770840f60371d17ff7d9dc08410d419d27c1d4a0f397a79437d4812a66942784d5d6d836c7c00239d552da97ee03fddfe3e90924b0d40f424e9f81b4e9b68cc7263df7642e96a5988a5dc937e159843e17b5a80b82c76fca931871b035af038cfed03377035fa5216bc480f90c64c2a3fc7f9d40c4866dc8392b635efaca49ff123e3ee147d5ba4ca0bdbe543a14354287e7dc27d16a6c60ca2fba155302254a1529070978ef32ff68e40d63760571db99c15f9a724c30fa5f17d909d785e59701f824ed1b2277b49adb0c792b7a154c5f725a4891ea8a50ce1ef0d485e82640f1fcc95b043ce5aa1fa9c07310677d0d53dcc249eecd0b0388fd27ce3aa6b2fdf8fd426e03d5b0b780f8b5263bbbb1e2952bfadac23a7f29269810c74df7389ed230427e0c6b3eea837212a70e5fd47d9f7605522110095155ceda81b06275e3203d62375f696fc259b95ec77db0604f587e747a2e1d663742e49e07ac4a1276a040a8a5e1bdf987ffb83d73e0f53709980e09d1d274a69864619395fb841305038ce2c154ecfcf805745c783f821dca7f593133960fe319177d4d8b764d483744b76fd707af16047a3592dc5ab7083110cae053ee4ba4f89d0aa6123983df7997c4e736223e4c87a3ca76195fce3ae932e6ac435cab86bb4cfd73aa355a0dc9451d260575542b5b4072ec19026f7c64895894a73eb9fecc66975fdb2c31010684c8153ceabdbac7a6608a93c69bbd5f03164c54b3c2ce6aa5f2f6a8a968a0deff5bb9cce0a345587d3eeaabbc609ef07f02f16b00f317a107ce51c613e69a5ad0a77fc74f45020d15f8d26f9ccc65013d251c64bfb5ce13acbf23363a1513e19176d4ea36649f6958119170d050a5daa22ee0da1ec20ada8a4c11759bb9ab8959c95c873e7b3544ea89012bcc4319dc1e3a85c4d49759134fbbc986c309795ee901f15ca1dadb1c7f7f36d802e4f251d148555bc51541a526ac81f1d9773346d8f959343baa73906f4429db4716961e3ab840ed6399f471bb72a6eb7f2bd060ace73730d79b15b8c3911b12121b6a21b8f681cd64ba4d6a683abe4251a1788c1418d58d0165b686c21b2e99df147e3562eb61ef6bbfb7a11c334e9fe55d25e0e529dcdce1426df80c697f9287aaf9ce989473d86f919886bdf0e9a1d9c45e967312d821599076d223fb1caa390fa749adb8c6fbf7c3c75973deb705cd973acda8d139fa241da39421210311647536ce93e3ed66fd6846bf59ff72aa747a2d250619e1ef62a39856a026a404469c22af5239eea7bac12794168a73bf246c99075371a28f9cb9b9a66c6512a664c81d2108b86d044a6362703c96324f6149ca9fb77285d36873eb2f99c0ee0d706f93a1ed062330e4342a04df99021aca59c3c46ad7e2cbd5e1c5f7f485e0f13469e93e219f7c2ca88176116c2f1df988588f39d10887411e4691307eef129cd7b6c1acb14b706ebc6b730bb218127de9a8bb779148a0862d6044bfd29b28f20dc9c9373ca4dcdf76ea6b63a7e5885418cd911d4452763be6ea12f0b53cc728653819f06e3c7fd783dd8648bddd010f9070ab6ed9244acbe12568f1e0d29ed55d9cb871b5d94d4b99de48d4d31841a41a2c7e72395212f922f7a986c2efabe101ffa85ac6dba0c871ffd2822a48f97eaa3b938fb652790104af1a3e801ee9610910fbb42e542e465272a938e77bd40a3fbfa0964719b346085b3515d1aec7bbf7bb47808651d1b195587565432fc78a220daef24d36708d1f0104499a33e222127a2b9f39a37b02320fa3d653ab2580c3d405104f6ec78abb7ac13c0d05eea50abf8d3145c99457e8989672c6defe30d81865a296a28ea641669d490f5bbde3ce6adcbf0422d03aec8632844375a0ef54f811b45a7b3ec1ce4f5b0e8a174755bcffcac3a74258e5da55029e85331f7e9ff1e237d941d57a075304258784aad73f88bce342f7a6e517a05400f851641db5ad162e697515b1426ce6a5b1c3a2681ce39cff838cc5af5f0477c9895a447b2b1fb9f6090add2dc88fddaeb79bb7c5c071a0bdad3426f1e67420236a5bfec61715fdb0d8b09f902bc38cf488f1e37a6b0d6bc3bad78a8219f36e1acb711765e6b47a85d696fd5e261bcec48618b1db3bf992f9f7640da505cdd11b17aa3894b84d4ab508cddd816bcd22b88b105607ab668b1cad7f4bf3a98c4c6b0414b62e9078ca43f5e656c4f30d890c159ef0fcb4f02257fc03473ea9020f88cadf057af4b5a43775fe95f3c83caa4b7a09f70d0269335c2e12f0920faeb1af227a63b3b933c504768699f36c859c56c1c0fa6123f2baa21d3216f5e37decbad1733d2d0be44ae23cc74824a17f0a25da521da630a65c26e16f8a194b65a69c47b9dc1121782ca3d09e6f4cada0ab248c3c560320a2abf7f41092a0367ae7e6515f8b50f7e67cb1c4d72bc4007160ba3e16eb21f34a5a10e3741652c164578d6eefa5327f7e3cb1ef2c59744e06902c440a7861105bebbab5fb96e14b664a6511ad27754b85470f8885f9acb2eb223c3d0c7341cf95489631baaa0af7f9b5bdd671cad0985ef32f8b16bd198ed83ab013b427835a12f7e326702919b5b9bd009838f650a5199c1efa149b70c55d9c947ffe7a7f5300e44fbfd980d12237f8aea3ab9565661ae8ffc1f37ce3f8abcf1ff4fcba21300eee6278a6195e9e94b1ce28c0c87f267d4311ebaabaa179601d1bbfb54658c6519921960f01896d986c6901b94c2ea69c83194319e2c998137054f746630e522217be6e8d8b54d512c21f5e02aef223bb4f3d1f976774f6000044484c5b7833527b8126392949a9056c48f3ae8c827dd03aa72974ecb419025c2d8ebf0cda6674bd16607e14f37c890bb10b144a7de8df1019ebdbc2a6ab38569c0e4d2c21ff8579db0c563e884a9fa3b64748de38e6422896e707fcfb7ab68e8bb08d4c1b865ed6ed3846e98b818d5d32fcb50408796bac3c3e4e8b2490d18a9921f23353c4fce8666ce4720a069b1e93dcb0cf4b8f9bd5dadba2cc383bb8e5bd1eaae80465444fe34901aebaefe6ac0b88d58e537ca0ec3e5f9e068e0f4d298ff078cade354bd0b6890b6fa98aa5c8745eb111ba813e3aa118e080f30962b64adc6177c93b454f0e703ae52b1147ca4ac58dc3192f7009ede00af80be1ba65a70643a4423b73c2a9a41e6291dd0bfae7560cb9b844fdf5bece90483f0057681daef01a465b313f3bacf7361681cfc4e389c506aed25b0d6216f00ba362ba00030a88043578d2165bba21a4db523699e0c0c11eb469177984f7300017624fd6c1a0af6d1dc2a287a90db53b7d33af134fb7eccc9c15891af3bba1cc524839a230e1484b8536cf41e09628d9810a3f2345cbed5080e54ce2db23942636cf428541c7e675df66fa3d9fc3af21035b36760c14cce7e50a6f9e57f1881c1cb99812b9665ee3c81c8c9497382ae2c26f3c8b3cc08203980f45ba9e81aca1da35449187501178a605edafc334876a490dccc5b27661e224e87c891962749b83f63725f71b2200df00c466252dd98f9f8751ba49575aa4c62c0dc42bf03ee32ba9acc54f0231cf025b723cca0b33c937efd5857ee978ab1513aa336741471bf39d557155c974f5035656cb030b974758031b2229ad5684df293b080e7b018aec61fe48bcc42277265ca9d414933c30ef1a988a3a0f1e5a710477189063e42b1f0d4380984110bdcaa026d6bcf67b8d158f8a40db66d3638e5864925b78e3f0f95aab1aa1a2aaea0059af1ece3f4cf2a25f780b25fb9e480ade5659f901048a96393b934d6d02c3d05c2aff22cad66e02c93155c0410a0d56bc5b392677582153c2540a2956fd298e143a5c592476f07e42d6dbe70c012acb49ad816427e2f535b36022e046f93a0e08219dadb521d5ebace50b98b404707664fd538d15d3465be2e52347398d2731c7d2589b13f336512d1dbd842a20c72fd638af29f8ca1083908d675d0cd2475fa80ccd4d5543f7b625bb1e0738831530ea4bff6e0bb6cdfb141054dcb949df37c1751f52957e3d7520e260ea80175e069c66d2c8f004b6227bb8b5be4c9b95924cf30d5bf1d52f6671c7e8c315dbbcb015b4e9e4127e17f02206678a9ef8a4dfc7238db82127bdf6155f005254335e34f897539ae997208e5e51e77d40ca74726730d41759f1cb0427d484935bc405f60340dd60bf021a941390ae2d30e65c902dd9f624836cbf9c9682c47b1bc4856a539790e16a4e8c5f4d6f8eb856e5bf17614afab971e48052bfa41a58e759c05eb40fdd9667eaa77e97e73f3de8749252a3d28335233992f6005c6e58e1224b71446c89ecffe436f7e0884dbdd7e2d0b27b62843d67383149624edcd8bf0dba969d19d825d59b2d0177bbee248039530021e09374a9d3295b4f24afee5d5e72e5cf022ba9461090449939ef317bc4c4fa1911a5bc624d47e7db74e57c6bb14a8b7e26baa31ad1c00fca5aab411cda4460ed648484996298fd0d4420ae229d678ded83661b809e6ac3984537a0766e5aa4936558042853e42bff420f77205a2bb74af9e687d81961e9e3da4488409b10a37058edc1505742675686e37dbeda35d6c68c807316ae3fd1ba1df085dc311ba0ec1662606267d3991b81ebaabb1b9ef1ecb885ca444aaaa6c5426ade579749de0883c2594207e40342584423bc0ab43726f61492e7d04ecac1809f6b48d073b777d654585dd8f1a001835ecf26de4119a938873d1c7c9e0f3a02ed436c901c113c52deb61334fe247e8f31c75b23e248dd3e05d7faa05f5ab4d104b972ea3bec002b8e9dfe39a4143f7aef6aa6694d505e4d071cf43a3e207c0a299ac5e3731d4764fc266073eaad23b05feb4335d51348b212efbc8bc1a1cc0e3a17bf5e0eb84785c7e4ac2a8a7f23f0ebf27823250d28fee4f3ccdb5cb2342b6648bbde83fd2b5b909ac9ed85d0d054ebd9d7dc7b719fb86b59d54acc43084b313ec44f4194a6fee9d4ca37a03d01cce60a157e828830421aea0280221c2075f1c09d0720942cdf124804babd22e41582a069c04dc7f90a7069a9a6f743ec64aa6f33998229f5aec2cc39f9d7b802940e814f2dc9190681ee4a88d224090b87e3859743e341e859c870fed795fbe19469ed06d5fb1d2b81ba4512a3f8836e4eecbddf9cb292855e8d367eae40d8c7f8a36cb0fa413436ccb06f65a647115574832c0d2f26c1faf6f8f1227197a77afeb8337a7100e622eb5b62770671ef2ec91eae994a64ddc672ea8eb85434bef26318a5f8414ff5e58d0f010fe4ede9856f7a274a1204fc2c80f98c81a32b59073f9f5cd3be0e2b5fa0898bc83d286114bfc46c99123ac58c510f2f0dec9959e8c40d08e3c8ec6e29fabedc3e9ac028e7ccd6e3f53dd8003013cac7e8d7bb7a6c8a4f83369261a8869c85249f6293e3aecc3084eb39ac2dfee38b8bae7a3790ac3019f627f1fef8da3b78a6f616e3e8fb6a4fc165ee6e135ed19afb8b7856fd170ba0049c8f0cf7c08863a376600a2257ac1cf16f655e4f315ae44b081d9c2bf03eee6e6c3433e66ea617185aee37e93d45c74493e62f1eb4ef31d5c629dba94eb701b86d56039cc141c89147bde2d9180388d0d28f349817a6a4d449446981282d3ae929def77a147409989a31568a3a58fccd338c87668a0070e27d001fcbd01da7eafe3aca953ecbd4d2ddb737eca739ee09dd592c84859eb8ab49f098c68d4fb559904ba3c5c6560bcb988e84525e24243e7e8ac1e69dd3ea6b75abfcbbf97921b2499ecc4c7f18a546c5097951e15af610e242daf173d7dbc9ea8e55222182117070ff63aa0d55998fb5afd1d1591f30fb77551d892705a578bec615cf31afcee87d7023fd1aeab265efba9bc3baddb0bc633cea20f98938d514ac845daba1c3e1c725d50e563d25affca78dada4deb1b1c096700c376ff911e947cd6fae62f903cca3eeac77c639b9b4cdaa1badf85005edfad49907cd47e1a697c435216a2b0d629760cf0b08f6a41bc6f51708fa1fd5a88e820e21f73863e3ea37da3ffa7660f7747bec689aed1f2f71036fc31ecd221344fae062e31369e2d3610ff1e53eed19ce9db2bb490784a2d1b1af451c6d0cb9f0854e18236548b6984f4708e62b63f0a74291de9ce07c17143132be76d493c949451e395d83f5e7ab9abcf93bc94901b7f24718bd60712a8592afb9d4e181fe88fa03dd28cea0e49cd50608ab9c832a05e31409e958d7837bc57cc9a04a6e007a550844ddf02ced5ff3645d3185690ab4bcfe4d2dca77e355561d0c4e4f0a9bb9ac239790f92b3e72584d594d7a759ac03ffcf6a3123e1b3409934258de81018b42234b6de4237aceb7941e1d1662c2417a3b3e57108c52f547e323e9b26884fbeb3a6f0f172f3cff3480ca54f92cbfb902f68557872f1c07f8d622c68736c94c634a2d43f156da224c352085953b26f50d8c5577a2feaf1f4823585e37049cbf3856ab819088a1b45d8e015dcdbee454f11953e6a558790673e520fc83276e82984c01f4294a75ddfd8a4dc3430b0048696c8b0c07f83e7c84b732b09ee9f53a820f0fb70971e4eef4fe2c38ed1b07ab795771b87c026b0e2ead6dfafbabea75ea76a2360f56360c6c11f9703d94386bcfe4b458c6b056c69f4740d2a9a0356274160211211acca6e22eac27a00ce4bc90df9c106888d836f040273b12e38b7973f5e8fa2277721479c1487824834123322e4d4684c732fa98ece1c4ed89913fb82d6cc19e1e70482d064b68e15896017e69c49f8822689174561019605b4ae7df2947c66269017e651326aab171ad107943ed1108f2e950aae1b46c583ce93123e3ec8cbe0bbd1aeec904efe36187a41d2f0f76b66fca64886646a555bc28f40a40ce1759de854f58afcdb5f978eb0f8837229d89b3bddb82a6b3e28dbb7ef5c6124e2a01c7e1dac97cd1dbc4b0c92bc12c2a5a0fbb503c7146b9cc4e96ff6cf644b5c06f141ff4f3b2873949bcf1d409b879827975490d76ce442a9f0179e35bb4ea887571e83bca7d272d6989cade1e1ed77ebd8ae937c8b42b3928fe88158c771f82e444d021fd1cfbe31ef5ee3ba0b98d3f55c440b478ec70411025bcccb85afb227a028e4c25c16e0793b0d14faadb5b2018a2776bbd3c04120327645a1d1c2c313b8e401b6b147bcd6c3d7e100eb517243b169d2319aa50a58313da9e414ab80ced4ad437b216a851f1a11f212c04e3ef2980da9b9c0ece0558e3819a266d0aae10ba76d86672bca48a8550b313c80aaac523967ac0215eaf5bacd880dd1c9bb220b9a5b76f88f66bd1a17b934a603c5f0fccb6e9303ff9f2d151779eb8a323aac0c1bfbc899249b7add7983e01efa54d8bafe55ceb841f966b953062b288ef05e559f87061cb0c08883fbdb8afeb989baee8950d6cbe3847163c03d2b9cd45066ecd4f890f46448d50570486abad41db581f46e8594e2e08c2b131157ab4cd06747992baa94eb5af6d4e6ae3338cffee40eb4dac262ad43506e35ed6b0e391c016c306b11619ae97eb28e2055b12daa8860fb1f6cd5a117d43c8433b902b8f2b0a13560233001aa89880705b8a0d0a89a528a7720427efb22dd8863b399fc059560bc0d47faf5b34561e0cdfd9b7c5a07c0fb67ac2c87784606afdd001650510afe5d4457ac87569f46e8002ba778b69ba02cff1a5ce5bbcd07a1013a61412d7e87737d85d003a86ea6bb6c732fca2d6dd874882b6cd0ad4b0a33d68686ced151eb942d457c170521c55edefd35a4c27893a0b1200e0b90ea9c0ce97f2c80bca582dde794a81bdcc8fd6ad4741bebb5cef935283355c0698d1ad406c7d5212aa56945751d0ab9d93c0eaf7b0e862a1677870a7dda4d8d4d6ac0b9a0a3283b999e62bfe8c42dff209ccc3667ee68056e101272566aca8c11b0cf5126087b4463b8d0d5253565aee19fe795f17870947799fd086fabe37b0bc50292b2c523eaf7e296883e783ec76c21033f95ee16aa1daa846b7d2044d1b692445f09301620de7b4edbf49201434da889087b7cd526968d16f55875e9ce421eae3fea1712b38a3a08a23bec7083f4c62759c835aa6890a26e71dae3b1fa6d3834dd71ba2de454c0826a8b03d271f16ca455f330cf5b605938c388616a2902de4a7f924c6d6f2515757a5cd362a665c9675979b4d1c39c2988190458cee77e964ddf41ea61e598929cb8ddfbaea8c35055b7ce80ec7c35ad357b0c30b340a775f2dbac0bd3a7c28c703059701172be1c8e17cbd5e5ec8968f724548a8d76fddedc7c7f88c666152ce957e684dd2e9d4f6f2a02363950fd9c86633b96a8e4eeedfb041a43cb40804c2a77e8df958c193e38c193982edec9c987e46f879728eb1630cd84e174292a8f13d0e5600b7fc420f06b28b585e48a651d04d5551669fca5b44ba4fbc980af8dcb911a1fdf4e8cdc4050b6777c69171f8e06536f84470de4770a5bae90e7018a6937fd17d5f1cc6b350406d53558731d3e30613ebd2b03f72a62a8b0455e9aa0e827da8cfaaebc728416c7860678067e3f97346f9539a8ad4408945393d4af016d68336973c5e1b9249d3e8a5f8da19939eb92c75ad82e4ea64fc5a643a797644eb76dcb26f349142f27500af70c3d1a52b3c06bb3f6bd4c5aa380294da4704e80e927efbbf6ef22fa66f06a34e78f7f28ac926f5b399b42b4e2e038ccb9f6e0f7e98a963485c84defc4d9441aa467b337edf4c3b7134c299a24f504815326142306937d8252872633a11e6b4545079a1e3897cdb15a28bbd41bb5af161691016c8dec512b1a7d2621682545191edf29512128eb0af059516496ce7283119f85d5b6ca22e34c0deaea66ed82f1be651434897163412b854ec1896ac89e783d97b678ee8e9471194e2886e5d5cf71b9bc44d72fcb7380ba66fe8889822b011caf89444da08db109fb11e24fee4b00d12149df4e1cddd2e8eca3c54913f5e6d17eaef93ecbd72761ce707ad28f4772b875816efee3d7356c90569312af8f0549e0aa3f8f37b6ea80a3eec61886b960c2d1538e7f6ad4209baa2f7d1e4a933b8c3279021365a6f49e65d75f7477d7681d659069882816b8fb47d52c7b69c57e6f202a1a80556f1f5ea7cf7fdbb8ab216db114496df76731ee1082aca20647641fbc093f3714098038e2c1a8da477244ed85e6b5e6eaafca7bce75a9121398fe9ab9b877d81f4605b8ca56a2614e70c211699ecd7b3ef077a68974e6745d57994b52c24b2ec5784448822009f7ba7792e0986b29fa1e26fdf0e339dcb9e50cb82f1a73edde061884e62ab81a601cb13029d2fcdd3f74fc261b62d7cce99a177dec6e16ec052cc043beebc90ab3927e5b96cc5c2a0026c398c381c9700fe290411bf0d644474bfff3004505163ec49a1d22d0a5ae410166e4576dcbaa14ee08470978beead9816edc75f51cd0c40201287533ec9c5b48370ac29c80556c42c5a352c5dac1b1de1038a9b23b3faee6fb5ee1018037c2b693da72a67552595c4a755a8aa0708e1f22f0c59b5b2acf40a2a7aa1d82c0f95e5429e11ce429f72899d7d0f25e80c4ca50c235ef22f80ef1a04767ab90ca468d55720230bb668b35d89baf8660653eda2a21ccad4d74757ef11ba5f27f6986629671aa00bfafec09d438089af8a05ecd98cb7aefdf6bab5dd5d1747fc9246b3e4a49675323e5195ab1618155d427e9115ceb87ffe0d37b1218ef7a57db2bef60faa9a6afa82dbcf4bc347ef414e8229ff44d55b64a9658b8b70c045bc1954a8249daf0dd8674f2c400d60d5e4ad24757d32524eb47920842b577c23ffc308b72051d8ed9858de10b5de260785034007c3ae8e1f19852d3a1ea1b518332621401c410142129378f84ba0dd91245fbd60d5741f5eb1c77d5ddc591fe4673d72d2c9a1ada4ae81040e94330fe9a5494a2c8810aacd9fcf5fa73487e2f34a2efcd8897e9f46087a0b15b33a294b388405344a461b29a78a4acdbc7c34cb6e6ea78cf2617e4d218f420980bd7670a7455d72ed5b8657c4adda078cb8230f9043f2f6a8df82fe5b61fe1b2d66a4b8b0417a8e56619bbecc53e61aa0fbb94b9ac46f26ab0006e6400f0602e8a0fab15eb5ac63ae6a4d7d0158edbf95650571d1ab82dcc9d41d2eaa00cd024d053f5afcf16541be4255bda11536320694e5873a42571f0723732208f6a436a7c8daf67f534c1316c24ece55717813ad4e711deaa8a516fb65a50c2b8c49df32c2513a0d006035ab6f21090b4ea39767476580d0b91c1e870a44c9daaf06ec26393006a1b13e30b1f0722016fce40f95f38665a8b96f57360e23f14b5752ce5fc1ff905dc49a4b8370a54e9b99fe2c7860353af6f173df050346730edff2c35d99c03feb3fcbc01cdf556c00426add00e1ce14c6dba6a695f335d53c24e48cae4324227639f9526ffd59f2a28040e9de0b6663685ff75495e56909334a82545b81a49e9e2c238d71842223c0515e97c1854f76a7254d64e068b0a3d62b3238c12c479526142d6e6ff24065f3355b493465a6891528185cbe23a38d39a54e48cb5507eaa96624b4573a4ffa4a1fac89104ff80b244db877272b419670090f1bd02d86efb422ffa128b84e155562bbf3ddf2f784f50e1aa7db83e3d395f2b57a9861a1b0fd8a9bb91cc93d0f857068d5090f9664e406f5f1ce2ee68d4c53caf1b03dd052a3ddd2ae6c826f06b4bc34a79ae61bb0fb7cbd3e6126faaaae19f18b55567634868b55b4ede3aa9efc0c9092ddc003cd9e1981d86e9b42527dd61c1262829863d3bb736862c66bf64619521f1299e7dde43a2aeb49cf9c3607de0bf89642a27e9aec9086b156e80e137f8a683dfe3b28816f9e9784e2c739edf5f058216d42112fdc215601c716dfa5ee0ecc18008d5fc6fc0190565525c671a60bb67e99a0865683832a42983ec93a8521614233d0d58ca54688c591baaa4c98e5c2b977c430143190aab522c62f46750ff5af06eb92bfad407bc39f0dc1df743ac82b5c13f98ab4929a8f260987b7b21996f8d6948cfe144af2f1bb6b0f9ba6441a2a7288451a47241194af3e3974d93595c73dab1c5108107f396042b7936cfff662bf0a630cacc566c9b4dd2766e289ed084c0d3cc51196d0b0e0473c4ed274871d5a308e852ea940583e1bcceae094c63b74804117efb2b5adb4350ff7a079d6544107b0046d173ee48d8bd928a9688f09758376da31d8d08b4aa615a85985628965fa804aa99b9ac603ca5e741f3aae062f4cd04f911b7971ae5f4e635db025e693719014797987704ae8e1804c1ef85c9eea05eb8e1209f705888e44631607260106bb88da7016ad7d9813f399c906309523833d70afc81cebfee6dd3a880e6deebb94e341d24d2a9d36be9aac6e35c147d7cf9b28ab8629d53c0cf00696e31e801d045cf4cb54e4356ab2b139aae03995c6f5982feb37ef436781d4a883e2bfc16b2cae77713bb0673d6b4d052a80251719770722b8fbe716cb571fcec8526a201012cb4d56036292af53c321403a3d0eba8bedb6220a0414b7c8c45c0c6cb83f5889b71e8520a007691beae3ac0039d23e20af5c55c8b5b710645daac3427cfbc35d7d6cc70b965a8d1bd77eab484feb6c6a90878f450a8d3a4d7aa02f7e1dcd71a1d7cbf367e5754981504cf671fda9173a42c16ba561b8f6010d8c590768dc1ee7c9edd6eb69de7e6885334c726f0faab0e512b44ac0d72936d76654af4dbe2cfc8e1efe56576714d79e66136d79c57f15599470d007f63b2208ac4ae28d896355bee7eae4a3ec111f6d8e4e15baad7e168176615acfb2741aba23e0825f1b25d807887160284f75f515b6e9b92da03b8368fa9cb51031e05543fc71001079f80fad7bdaef35f66a170a92749d2e9fa60a451e488484f0bfe5a54a95ce235983348387104644bd91d7723b6245d71b5c280395cda85f7270348bbfba93d0e9e14912e703cca5077df64213f013a0be8d9cc1e34b0533d77ddb759f7e1afd5b3edef8a9d5f499d96b774540f808158315b623112f52cdd827ac9c03d455725b9bd034e73a5d483f32ff9ed9e213142547bfb877dcc0877f45c15c72062235985c8179ba18ac702507a69d9f5cfe656495b5cadbd256681a9cdcf0cb565f469f16db63bf7af20ceb6153e2148ac76665204d8741ccea5aa55b9994143454daeed56af099afc7099d3210ae40d8afcd6e54e9830538e7358dd06c4d5fea6eab825c09e8a9fde215dae1311d1502744fe3dd22060a0f33efab2600de56991c8ee6075327f4750c0210e447cd339f6ac80c8e949fad6e768e5382a40518a42d481507495c81027906f5aee4670b8ec901afb1fe778021b4d4c6a611a0b98805c3b09241c41db336e7beb8967a03cc85b1e0a2e442cb7f4a46c70633bfe86c23d9eb8613a33e45f2f82ec09b0e176c8304c89f8bc10539e40f0e2fdc72acf6d9b8673cfe1c8d877e5f52b12b5b79b1663030cebd5d0ac49f0274a1926944d9d1e940a0f12d2f5f36551b19996d05f1db4f29c38741a75fea59a9533d4580a5fed235ce84a5d61344d232642f9455c20b777b9d75775cb1ae2686674565ee5bd10186ad163b8ef1f359ea0d32454d636d63d5d8f7c3132d8f2487976d341e500fab8aafcf4a5db848ba40b3b5cd9ddb4ac3c66f7932167e080e07b8577eab415e77cc36f0105be6a1f214bb53d99cd442af8282558c47ea9f222a83c248c2a7d923e94557919bc2940961d9d8931818b9abfe54cab51e40ccb318ba77922ebf18c2ca229b044d9df881b8913ae4f6dc53c7a4b2e2780c0c726a043dd723e9a362ee701c1c420a0abd6622e9456f7ce80c08917a643c5625ebada52b2a2d1324500d31e831fbb89f7b27afeb9060eca2981d0455588762ed5f10b9a031d19ca5c4ed645e8e2c6c2b486bf97ab5fc64a52cb31c38077d89124d5e25c6d0a34eaa44744c03cf6b8ce78eeeb74f94e3c4dc1629817822af8a90188593d4eef728dbc97210ee08f1b0f92e870e61d5190e046f8b8986f95d3a44b9c379d0c5e0033b81221e2b6081e2f0edf146a071b05bbacab745c629271966537c4e98c407856eb004747469eaaa885af416b5cb03b2d75f3e949464fc0c0a2ce7f9fa8a61b736517c159bdb64cd894f5b09d7afc0718372e98c64dc07682aefb39b1ab05ace440791c1e7e4674da465badbcab9f48983da6e604e2683d6ff90d57a0b70830c5062f4c24cbdb7208ee7dae51b7e360fdea7c83a4f2e55a82cc7e619c989692724ff8f599ddada19d2afe5cc5a3d46632e2dd57a9baca44f0a085c0c968e09931de2ce805fcd622ba4bb39d8a2b4af0b8d99fe327c11c97cddb2a281af789695be4ae58bc1a26613793fdb4bcabe161ce3ec21d7b4bb69df26b5abadeecc706f844a853eec7775bba5234ceb768de58bdad6e3ffc945d1455bb7a9bd3762de7e68c4c4be01d2bd8e285f969e723baa7187f5f10deb1a715ef5082e9185ad4a27a63e7d6b4c30aa65db472e179c7b6b7484fecba1f7e37cd7c122787c8931ec38b9fab62d276dadb5bf450e669f4167ebe1ed60297bd892361def337b8f6129dc33c3dce8ac9b788fad97472cc51cd7b530e6db981696713953687e041d7ce6b76118ddd77ea1976fd16385031769eb0c0accda7ffd225d6d7cff7f9d1b76bde9562b1d958e340b9f411b62c4c1e8da91332036ec4cffb21dd2c04eb7dea59c1ba9a6dc6be6d989073329d2ad0b5a1720e60dc51c33b2007e44dc7ce4fd8bd1f727f5ac481c29f1dcceb297a6a6f86775307addfc339ecdbc5910334c7b7a9903c3dce3fb2b74eb9b99f6e756a1a705a6f49d035803b4febffeaa462d5cb0ccdfb82bda54b544422e7edb20e634f8577bbdb7f927bdf5cdc6ec4fdfb4eeadaa77f02a7f1f084ae29dc85eaef8298782b9e5f6b2f42a1e8c039f44a2f7c5aa468f07af2c2331c1f7613cd641fce0ec14b979dd7fc40036f7eda718bc7139bf22f9eda94074abefb16199868c6139c9605e1694fec69053bdd4fbb1117ff74706ff6d0636f26e0c06871da76e23c1dbe90aa659ffb041614e875d8c313feb0f51add30d81035ad67f7468b7cf7c9727a32bde69193787cb3e7b6153f47681e4fb89d6bfaa803ebc974d1270172c8659a21a4293c3fff492c3ef014c53c50bfcc9d8afc90037be1eba08bf6954f10b8f06ddca184c64bdec2d901e7684f4da52dd3179c69ea726e7ca3fb132af0030ed31a9e4f9a073d8131075a3bfa69113a503ee20d59fc76342fba76549b6f8ebb9e9521497cbcb34e0b81a77cebe164ffb7fcf1dfa9be6e3396a8d46a7e164de477faca660c4817957fd90804509e9b9fdadebd9c3987a840b85b18801827ecb22d05e341b1abf327a739e64f9caea7de54c92d6ec12fe3ae873c24e0df1cbc9cafd7cbefce995bba55934eacce03f2a7b03424a60e81d4fc3df18c2cfe3f3f4e12912abfc06287ae3a75fb181d650de2d562d5a5afae34c888114b7ab752ed4cce1e98891e9dc599aeac8891b09a2580f76c0f1cf2d310a09c7a7c2f4474bfad4afe72205f1d1477a36ee943f45c671704293ed07cd7f68748d03e8468d5948f74aa21195d357ae8f39c0afa17a57c276d77de12b07565e8e294d4269a1284d2aa0763a4236128084141c1f1cd944f74548ce04f9184347bdeafc635a700bc6d6258320feab155e4e1bc4b51292d7576b52aa81fea50703cdbc8ae94a0a65880ff8a0a851704d153a1e658fac0960260a89c5a15184cabb832991b7a7876e3e5b2a3ff40a2e575285fad0251983ed324a5cb01759c22d1b42e66a23cf6fafc2cb252b3f5a84b85c90b086b6c1c44b7ad91448155e505c18181decdcb89f9deb795a2b3468927784aa830f19269a7b388b978ddf7b9abbc661bcc2b40ee7b798697d1b9fef3db5d6d3d9da3071b44f1fe421f3adb013bef9ea818b8aec0567b51f2380d2ec1bcade7273bd5130941caa4131892941f001c9d8964b664a15123b981ac0fcafc40aa1d2d21cb1eeb8758ad0d1d0721dc99d44cf11e34e4fe0169f62094fa7f3876f1df652f69e0817fa68f904f0700f6dcbcb268dbee905e45a5dc27715db4aa51bd39239214d71b95df96c378685d725e78c66662d63f23d6adade0d52440d41c1432c1c3b4e89227be50f75f8ea2816da8d4aff23b41b3c91a6d55e65608e369e39cd52bb63e1e67b74da71a8c30be7391b325cf143cc4824228a4312ed3a8f936e051d973fb7ed066e25105468e7f81e4e1a279213fd16deda047d2f35c7f336b4c818b53f4da1824516a8c47d8de197843211d8a0ac2ec444c5dcdf5692d4792b26433c3db7b9b3315de62fde48886cebd05fae864cbf83f47b7349714a039da9d0ef498c26998348b5e00d29cd1059b058d1fecb4fbd5f5367ac8b3f0a2687ec61ccdc4d25200955e4e23277ed8bdbc4e740d3275e3785da5ab89cb59fd6d59419f5ff27a6c8e713a069f1592e4b86a6be7bd2fe86ce5d5214e5cb65da1bc2f9f36dd4ec3ef8e940e729493c9634fc6b1f601593f2d0fdb20fb4eedc5f287a20356c95662c3decc917f9fcc190e1022f7b56bdc2b4d5dd770d8c10a935f2b0c740503e8b6492a358ecc07d398781cc031a91fb6dcd0f1f2288a35ff49f5c0f7b894f53cc89ebdb7b47293d452eab6690389751f8f48ae4b662817a5f1ccc24f32f43907524f897c0ea50a27475f8fbe8c005fa00e84cc1c716d7568b039a9686887420192ac1a6d8106dc77b9446de6ddbd8ebccec6b97a733aaa9b520e0a345e7e4750d81fda6014e6d5918c9da8925973f9a5ad9234d54eccae91e048b74f8ddc7d4db6e1723b4e1a49310970df14955f31b7c8d6da75d25adbd1fba7497003a0f6316f8d325c18b23194767220dd2a6be46c52aba8c70d492917e329cdc2c8cea8fa59913a2cb86cc0d5b96642d20e375909a65471d3f75a16845e83a4a7a6ac1bc781115d30732f5b340b312fb2d2dcda6c2007fa25aea1e09281c69739dde03a2f814807e3bac577d4a3c83900b9667ae25cd83fd43522162d68f0b92e79677023531176987d0f58c2ceb9eac0e206d2ea8cae14a9b873aab02b450513026c1143ae8de43f4e79a135133e99b9650a37bf3a235854fa52ca44c9e0695ac749b286a075d8b2e07cc5b13058bddd91512d4bfaab850c97710e6d33252a714c99888a358ab91d2326d3689f4a44a68352da9341d27a30d085c30d25efd51b5e51b85999b0a7c20122885eed8234142f7740e4c0deca61ccf6c81db65a4b3dd8d603ab7072f1f83b0736f987e54957c9fd0ee0ffa7313c47084cc9b0f575f4fe607aecc08f6987c02d3bcd3346b380da419a54f6eb08fa6c1800970a440219c00bd7db34a9c41cb693f65a8353c607d45944a05473aaea46b24fc58259588568e8eb6b99b89230957c21ad2fe6f6884f60b37ccb221771e856bcd125da342f28b35f7efa0ef3e6c874cdc5d839f63e8ee5c1b41f07ad2ee3b1634bcb6090147d12f85b5f8a6987eba200c29b85c9bac25777c5cb8978dcae30fe237ecd2258d0d8a0ca62ff082fe6416f2ddc42e09fca945a9068459ff18f3e7529351cd6d5c2e5ca27a2e4d4b39a52c5ac24996e65652fcffb271071525bb4b1d7346578c561cc8ecf707f409d3f22a376875fbb85328f8ca4b6705312708f7c519f254a45f554d69c922c870160c3e181030f5be1951b35968bf5d1708a914a9fb8c5522c82d119c20faad8bc3c13d7934265a1482962578bdfc8408dfa3a53789082e19b420a6a5234ed6d34852e674a5365578eaec72f8252d84c100c086ef0c6c2291e6602ab840c81ae7b6d7bbfd9feebc741eeb4887d9f6dfea2f3be9b35e15b2cf0cae5166a366eaa4ad7053087b9629032e2679114aad403bf51d89fb106e76b88754c6c423f3ef5630b04d6b9cadab93d500d8c74ab9eb17afd9199def0affecf8a72296d8d19bded4d4441080a61c27faf6987a4d5cd1833e5d9acf6778990cd299fa24550176e446ba80d71ee9fabc1b569a1f8cb3b69206ba96374c400b50ca15c03bfabbdd895e5ab31b2d97baa48e18670828012cd3edca049b15e16a6436e20093487c1dc34789f2816f5d3ac8b68318339a8b02745bf707df177ad041bdf7495811531d0d49763b2721c991b58a38cd12c265c82e8c3ee91931e52fa3af16418a233f2c388ea3cffaa69eb9647a7672aea87133445c70796c2a5656c725d21959a746452d3b6019e2f22b0c03e0a92b61c6d9c351c98b638d12ee8234a1b52acf545870d3124b9c3dea6f2b3589930ceb6bd6cb9006326fdb032bd457a52fa3d4c3529a08c2668d14d1496efbf0d4631ac2bae1698c370cb68d42093ddbf8cca03325140c346fd98f4b01cc352287aa1bcf8fe15502740f470712df6578488edf163483e7bda6339a8b6094ea3dea193201341d1aba1f786bb53668d834664d8d48fba49da1c44d34f260b9942ea20c6051738001855e4f3f4f7eabe8566da431252d3c2a3f585928aba3c842e6f57fbfe88d6c1176f2ddb8e14b39a2e52ad5c156bfd58b8fd08d98c2dc28fd91d3afa6dd3b9cdd0a5ecb7055e61c03b2fa26ec4d79d111dba41888e8d3ecc6eebc25c11a6a7e831df4deb615119a232e824142051842d4b60c210e5b5924d93c79a8ee5a13b64189328473a71615845f5a87e346516f4783d3b293e0d3d3d4fb3d70bc230afd74384cd1ae5d97cd2c2a464e63f9488aed918d1f1e1f66590e69553b14ef5a2d1cbf41e4314b625bfb40d1734575289332bf54a1a2fbfe69301ca4c20dcd39e8cd0b31e806eb534237a5f6b85b6f29520de6e55a200a8ff0842db5d3994f82a16c42312fd47d857c758e4d87d9e5f2665009843a9f4aaec85909cf262341d4a9a02599ae95a011d362714639fb6afa649739a477a746589a1e6af90ba2f4d4e888a76adfb4452501d23b89949d7a419955b2a9ace9da5e9f760634a940aea627f5bc4a054ed7a38ea91f449598ca1caef7bce4310df3dd1ce92ab8f4d6ca1953e064eb9f843acc876369013df10a5e2695cc597ddb403b09b818ae582d536f73cdf188e76a415acd0b56af575648a3b2478cd2c142da2bf8ec8ee118ca8e76bf762c4607c759c4dab6a41aecc21080f1eb1df8f75979cbaed903430c8bc21d1b4e04cdae978846d2faf4f2412813233124dd02843807f0bd312f483105974484aa33dcf78efa6a01a1ccd146cfa5a8ee86c572f5bf03080e92dc860c0c9163e1592168c2f2449a954ed40e02993495b866a74f3c42dea7f18bff5488ec8bff9d62dfa1fff6ebf84d3ead3f7d25d8f97b7d23cd3fba751848770aefd9f1e3ccc0340e3d78ddcd60081cc889d2c87868a95e486f41c5eeac8fe869d8e8020ba9e418c343f1044335d7f00f54c16043d0924c3654e4bab440bdacd3f03da19dcfb5871e6a3302ea8e652c5cd1aa290704f05be76d9f80516a61d6cf526590d1c0c6bc63692ff5b3953c1f98667174229734c324a9a5a11a540688736ca9f82f623f5b80c18d5040e8ec81e0177ec838ea2b2c9e94711f59f282bea8994a71a3d488965802b3225120642881b823fbaf8dffff2f3f31ca0837577177b2293199df9fc9f0627ecb5679a378779b525d2929693efc3a2cd5364a19b95402ce216188e6716c40676b108e4bedcc3d85f22237c488d1658e094929830f718ddc674c3a1953483981c90f3fe04172327e163ce39c037ed01d17a377e7919bbf56e9c77d65855916691332f5fb99860eac7115bf394aafc2e8fcd308a0bfe5a69ddfa9a35a363713b155f257d32b585913cca2a5de76a01be6d7020afe8c2985a17963a13f47aeb25e5e4e6b049cd3720c66ba1a76474130bd7170f8830c86836fd26fc422dec04df3841e287fdab87b84598ab223e2bfc24a44ea6a9696ae39e2034421e6002fef3e9fa652c5c7ab221da74703ed9e805048370ad1399342e7f92c95c274e8adabaedc995755352930266cdc079846837f29cf2cc044f8ec8d5cf1650f7083344b04a6288398d2e079903cbe7d013dc77da7e17db4f6c8c558577662048edb5f7451d33737191b6f0bf153a8f854c70264d2e5ea449945ed878a042e5f50b13c145b9ae7c48991d492295ab4d71b1b4a24a142522d30d0c5d41250945dd5a3627554950aaf9f5cd53aabc753e6ec4d354b3ff45f2cabd4fb8d5a6b4c39752c9f853e68d1395afabb065b6230808c369cada1cb4a766a2bc4760c2a40072f356ebe4e51c6c12b4b2088f9680a2addc66483c8bf0a18c91276edaabc89f8bab983a5947c2c3132dd63015160c3eacabc0455cefdd50589a1983f86a1e9267be6e67b17410cadb5889d9912420ab402159ccf2ab95d981fc343b8a7865a24255746e628631349f60cbcf56678b7da37333f4f4f9206efc841bc70ae38f8d0309e13f9ab71d9fe11dbf97427bca22c1c6d1ad4e1b58759b07265d5df96e470afe3b1278a0c049eeb5682f610b52cb1d301d4a126df34f157fca8a90c36940ac7ebe4d2cc06ad30c9a829a14a7bc33e41fde3328e5b6c539ac0e62f650008c967088714bc5eff93863e2540947061c3a1e8ca2cf2bfbeb9996fd8a2aa5c8453b6b7e216760510fcce0de6bc42408484a9e7fc4088609a774029ef3fa3e2670e640e8d46f0457c07a12118a7cfc54299b0ba8f45bae611e59563cc84ce9e5aa0f5ae48e941414b77022f1b5c2f35c332081aa432760d2f5c11820badf2a29fe2ba7a11426380f12c725340edd3397c037a6d7c34c2e14bb13f8ee9237aaf84b2ce7152e87fd53cabeb8900eecb4984e3c53d3b78701f6a12e491d52d011b88150a724a09d1b054b650c3aac0c3c27125d974891a6314fb74d5d95963925d2ef190c518ed5b81c5a4ca80cf9ce3806eb3e0865f4468ef20375d57155b45ca620de157bfe3ad5a6c8d8fcdb4a07cb9dee02cc55aab5d7815189934cca43226d4c42ba847f642897ae628db2828fa64ec02d0cafc76a1a317091112495c403b4ab3212300cd60ebd6ce00e68ea949c98d6af3958cb014aabc0c54a754295171940b2eb2348788257715c234398bb23aab2af109bffc23897293097e46c6fa4917d462ab5689af168558bc7009595c964f1c6e650ad452f812b0d6447ace530715c548fa47a92db4d9ac8211e684c46c27ae7cf1d0b7278d5fafd589ac443be54390c699ecf3b065d79f1897363bc787cd7b237d2311e48e16cf37448ff356052e2657bb98e3175d06959ab50d9a7b2c9fbe497d24caddc3319690aee03ddb15428d8f0285825f20a41a78fcf26f041ebcdfd0bca39bb484c812e4e7b527e607fefadfd8d6355dca81ec761450d4530ff201399d1b4149b35cfcc23b4fb37d43924479856311850ce48ab0a17f50f18a53084e1967baa860f0f77a7d07933e8c89e24a55900554586cddede1077e4182637bd904abf99bbcd7ad4ae09d1dcb3d78a2772e93149b0c85b464e2e1194c1f059bcc98e3dac5ab705c9ea7aa6d06a58ce6877038e4431e5703a5b784db5d2b4ce97d84867fd4be3c3967de19c3bf5117cdda8a7b1ecd0ebe94ae2778d57c545ce9bee9e48c896c4c815a5678186a016e8d16ca4ba990b3549a9a404472dc98ea13f07381ecc2bfcba90b4152152a5e8e487397bc352cba7825ae28a684d66039bd53a289dbeec4685a5458223263695896ad377972113a3505ca33e4f7c20862572627ed8dcc9a456f48b6e520b04eeb5bae2b15cd8f1662c7f97d5189def343ba281af007bb13fe8ccb5c8ed63e40609198388709014bdc902051d995fe99056b7c19ca4bcacff920ee977998ffef4c1835654bc832169d0b33ab8d0f8201fdd5ef42e8f60cf16ae1978565fa1bf0bf85bf18c45a8c99dc23ae140662799f242f73da05594c2ebedeffe524a3f67f33a3297d86fea2ef8f461618e2f410e2f27eebf3e44c8a23b23a6945c90fe17b4098492ae8f4816a45025821abab08a91b11be6621315e8f511e662290fabc8eb66b39244f676e55d568be2bfdbb3bf647b8d7dda6525be5a5c108c1f4d3ddb3fda255c28c368f0c4aed479010641ccb8300ff8897414e7139e026534b27637d6e75ce6fa6e5c51b353d779e6fc41e5b8864687c28773dbe6348f0a465dc9bad950c76b64cff1f267c748aa4d0d6b281a9174b41f2a41b52264ae2336d3ed6c5e77c4a3a6984752f31280135011ce5dc9a6d4fb1d0486acddd8ee565d9fff27b405278c14de81f95da454715857a4b97b94083ebecbca3586fbe08f258ae905c2193309b3e81dd6c574211cc78a70a68304b49ef300e571b2a3c085bd2034653bc76fd3a6768e4eb50a2a64600501e8ba568212b6c0b2eb423d5d07a5b5ecaa6570881b731c4c3d4a4ee3a9cf20a313276a8eed4c7ac9a84a898184ddec6b2081a75c277bb15480668c0a6847bcf043fd0c24ac02d11e6f207bfd9482a40f65e7a397a800f64eb166abecda30ad4fc6fa0c75069aa537e868b1c09823a9b8cef7f5ab7e0dd87779003f8dd2e85eb32f1e4e8e771daa7c4b0d6ff0eef4ac58074b4d18d653d301ba7906a7bf1a4af0bf113cc119ecd948d702de985cbba0c4c701c83a4d2808b202f5eb6e529c16c14c877e645a62bd43cbfae989ade73e7a35a91123d12ecffcafff8a0c8632aa19d99a10185d6d076d6e15e298eb58d8a8e04b67e34a1e8379c3b95e9b248a368e011a05ec8cf89cc7bf7e10a89b28b4f4b64e29d080d8a58d4779f0b48ad2049d91555277f1ad53d5eedee020f37e6480e1ebd5751ff2ce004ed8ae64c82c5562f5a731ab72ffa0c30b7b56b96a4bf997406a94a4d03167882be1a9a2da2a8091c5859c96fba3b641a4f770c39f1835544e04e2af16667d3d5d64aed4bd5be0c7e2a8b04727efcfb92b755d27d2a30c3f8ecdbdcf75636ca28505b582581e39c953b35cfada2c568c41893f580077c8c784f6eb4f19dee35fd317a7cbfaa57df879d20a9f43d3a15af78823205ca6853a5e5315d593e1159e10f0b2aa1b5529a0e7c1aa1624054291545458cc2abcafbbc9f0d7e138129acc201516a4ed5efe042a8ab6344abd3f7077f3c971f8da19c7b7970508052b0199c8efda65401bc419e8fb252fc78b632dd6e84571a13ed5e30406f2a13f0eae74f589c91b084ad31e6c6e59503f22c5a833346f9e0364bd97f6507fbc15e5a4ff3e5e7f725238fea5cb5e8cf50cee3599aacbca78f5c5660c79ec48abd2bce284b4c221e991827f6363a921acd9120a233fb9720899653337b0b725f12597f3f3831c7012016f67e01565bdf1bb31a93e93d85b4bdf1287bb8422ae31295a12973ade8b5aeccfcc8eb9d0e342e0c638b7d9ffe4adfb3ef5ae89b9590dbe786e6464e50818795d411710d0c4bcf7e649e51e35af3a7d6fe093191e776d75eff14c1745ad09e267ea1c919760edb52891db78abeb97a87164f703dedbf25d9bb2bb138767cb7d4c416cb1c284dce9e54022ac6460137d72ad6deb6581e936fe24aeeba7b160f342a3fcd9d65fa729e1beaa2832adabb7151dd554081054d990950915b56bcddbc07bbd75da50e08d20990c38a2cae5c68e94beb774599bf6efb5cdd24e85017f633904e41ce204cb13b386d70bf568cc650041c5c7c5b1a68135661bbe706505d04df00fbc51ff5b2e6770b9a221bc2058b39bb5e7e9d857f0ab7f5a1e9c9bf04ec00ca484b0761a61552372115832d4f06c3addfda2af737a0a71f725ba73f0b70f5e6765386cc88c9ea1c823ac9cd8fdbb4c4088136e3b06e2793a6a6f35a297934b82e682f05589fb64cc99ee21db4ee90cdce3af2bb241fc14bede9165ad9324aa545d51ec6b66e1c45924a54b746e676a463ed16d338093c91fa754fd694b1ae3511eb776457adb2e28b1499ddbe170b34fb5c6e6ce180daad90ab100df15dcdb3c15b679f46e69086b39860700a0a199500968bfdf95861b8b2b2936664b84404ba51294ba1e2ec9c83ea4344678bc976d50d6fd4d6de9c3c8e09e047e2e5e515dda50e01c00f3f5acec3fa939e3dd2c991a495e094b003f478b78722b01bb74fda9b5cde745e34ba37d9e14e2e6c68f5728ec1711372912a3c926ea6e695dff990d3a1c63d391a80ad0caf9b0d1f3237801b67e22b92c3325f0f55868fcc206cd7f0fea8ea0599a2c5bf5653659c537270957e47fc75922dfb61d02e70780d24aa49fce41f2b6382002a2df2c849e40ea40472005ea03cdf70afdd3af2e82949ed2071e4491d3948b8ab9adf5914e23772ad57d0a783949c43dcf59d408b875b823dda8124cd94b625fe62fb8a37316d8a71ef1e8cd4338c69dd1316e921785226d9546cd529ae38fcaaddbc1e4b9ba4ec87a2a19eab2df00b71d1db4b8743b86d1bb540be10de12197ab2e197bc6e076af99d8500f4c8748d6b27c473f91dee208ff3536808edc49941cfb2b080b58da03aa9342a25f1a5ea4cf67af09f768e3f7cf0ab08306dc1efcc781e82d77dfc161055c51601610770fcdf2e921c249a79b9695e8ec30221bc5030f5aaf097062c47dc3324557dd8cab1ebd60d112182844c4dbc59c4a8ea60a814cf9e4a483e867022b993cc813e51a4a6a4dfd99ff63a5a969593480b7f8702c39b876bf0a65d5b5c162b91fce994dafe187cbf6539697fa770c79110491dba03dcd2fda84f2864268dee3a098e13415e1cfba71cc3f5135a3c62301123393686bee45c5fd582fd780dfe60052870e62a6d942ff1eee33d4cf79e1288df8f3c3d374b7c7bf52e124335a83971757d182bce671914111886394eca3c7471a1c8fcfef7f624b35be8ddcd2d6a7492ee772b705358a5a6d128177ca484bbb97add08c7e98cae1a01e48fb995a0cdc26e98e6e12a44260f4b8f6821c217028aee7c82d0769f8e5030de5e13826c648a2d10c71718de1790cf1de843478637568766b49dfed514e6ecc50a4a11a9fcd6eca1445ecf5f76a7f4b4313ed052b17ce8e368bce434d095d5262a670826160cf322a344094bbb247a843d229e724728510d1cef92be6211b191c1ec85b57c5c634af531a187cf7a28078014f0045a04e94b6a23415d10487be6844b038c3516cb5bc81d7c0ebf94d037973b7990d25d8b11e081db70e9bebf240c82381d6e7d21dd72169fa925de13126994417dec31ea333874f4f6016f57903e69e7565a8c29626247cd24c61586c5d6a3b89b01dea61d35c44e1f22a3b036e1ccc0aae7eb029a4dc76aa2b474feb7e901db58a9c3481095ef6f16c1c20704ace0f34f4f8500843228245c559cb0ce0c3aca3e0ce32ba70c136cac1532a87b3e0b4b3daa8f293a88a007c386b03e4ee96867b7bf418e8fc06c21a6df810aa4390f32893e04cee17dd1e8cd8b359b1702ec8e04caa5c4d920bda35fe8891cf36a01a87a9479d575be247b9491b4f2b510ce37f133f3c15e848abd08b151d25c34e5962d4d391a84d9adf384723c9f2b90ac5ec53adc7d0d599f7a33a62ed942ccbb369ae172942a99932afa24df819486c36ba883b5eac9f3753d9bae25f27fff138d918c59d6a7084d94d6525bac1a6369639207c2e01f0abd09cdbc435bcab512039b096ba104455bde50a70289d03297ee470e1c3c426b0d79ce66da2535dd231d098a3e2ccb21b71bc8ab7a37b0be721b913b9eb3879db8e9989df69670b2ca16984ed845b1f429e14ebbd9ebb7e8a9f912eaa749c86ee125fddb5c6830ba4f48f3304925c52a2adc2f25245ef806810dc86e48498d1d0b20e86bdd8e85b680e9284d441059e31448a0c57405c15251d9b0b6584ddcb9b9f40dc2c5270be1dc0b582a4e24beee834f6cd45e15dcfe741b8bac00e033a9d5c9c073d52bb62797e1bd6281bb725adae948d83c3a0b837f88ffe2ffaedff8d10b2c926646f42f6967207820cdf0c3a0cf0ef97f531d9d1b4a3791cf8779c5105ff1e040c62fa75238a503c4570a6bff7ec8ff76797c0fe3e5924de0ccfddacefbc1b959813ce64798a6c399896c03e1d52bf26ebfa00d3d2b7f4c1412c1ba90f418489c8481e4e7f38f0ed6e1e1ba15ab26152b13f99eeb03ed2b151af76c039e7bc5bcf68872d51af2a08218410ce396789a2aadbadb2d0babe4e0656a10b4daecc754ab018c39d1918c0703729df7b520937e268275c8cf779450ab487857d5668d2bb01b4d0f8c9b3b4274fee73e2bebbf760305c78c9a4e28683761e8f06eb1e35862082b6f2118f958f34edcdbcd77363372d7b7fce9652d336518addfa9f635aa6f165aafda365d946bad70e75ed26f20005d1307b7294799aa6699a628c71b4e33d3eda52fcdb44a2e92ed3344d524a598a7f8e7267f7a90cae09163f261a3c11c164674327e7b7cfd1f9edebdddbd9d0c989b9cc7374622ef317367472600e80e7e8c01c0087719d9c97939ea3f372d20370f7c9d9d0c971b9009ea3e372017ce6ee94b3a19333ba0ecfd1195d870fe0eed1d9d0c96939019ea3d372023c864e0ecb699ea3c3729acbb87be56ce8e4883ee3393aa2cf7801ee6e391b3a392bdfe1393a2bdfe106b0a193a3721acfd151398d1fe0ee97b3a193137a8de7e8845ee33536747240b7f11c1dd06d1c0177c79c0d9d9c9427e0393a294fc06fd8d0c941f9029ea383f2055c013a399fdb3c47e7739bf370f78fb3a193a3fde6393ada6f7eef8ee26ce8e4646fc07374b237e00cb87b8ab3a19383bd87e7e860efe138ee0e72367472e87d788e0ebd0fcf71f790b3a19373dd01cfd1b9ee80ebb8bb8ab3a19333ff80e7e8cc3fe03beebee26ce8e45887c07374ac43e03fe8e454e7f11c9dea3c0ec4dd599c0d9d1c79093c47475e028fc0dd5b9c0d9d9c789ce7e8c4e37c02771f391b3a39d483788e0ef5204e019d9ce9423c4767ba10afc0dd5f9c0d9d1c78229ea3034fc487b83b8cb3a193f35ec47374de8bb805ee1ee36ce8e4f431f01c9d3e067e81bb1c239e81e7dcc5e0eb1891016b83812f5cfe0578b8fc22bc70f91658c0e5133184022e5f082c2ebf024170e1f22970e3f271aa73312660e3f225509d8b1181ea5c0c1ed5b9184054e76240a0fe5073f90fc0c2e5efa071f90ed07180cbf7a1f27354e762f4507118e0f21b4085cb67c08ccbbf99c2e55f1b1e162085cb57808ccb4f40142eff06012edf06142e1f0135945c7e4de5d378c2e51f600097bf83010470f9339c70f905a04972f93208d084cb8f1180cbd7c18acb1f00002e5f00d5b91833302e9f549d8b1180ea5c0c00543e8c174bb8fc17f672adcec5784c6d17830f539f8bc17fa9d0c5e0bbd4a9522e06bfa5461783cf22aa958bc15fa9968bc157a9d3c5e087ea55a98bc14fa9988bc147a9998bc1ff68f5e362a0a4d00aba6a685615abae5455242b4bac2d541d4dd505d69757615c0c7ed71817836fe4f26522d75dc70524b76fdfa63bfa760f06f81aa2640b503860663742bbd3f9ce3516307b195f47b3f0dee69618f19e65f1a8de4322e9370dc36ab5aaaaaa41e25d7f4f7333ef9b0ef7598babe639e7ecb956ddae5d691d52efb9b236163752366f82f6620e32550129abbd4841dbb4bb3926463c1ef490da6d870bbf44bb5b3bb994d27faa56b3da4cbac6e6cdc0d3c320874ff00d8a830eb911c417420835b7438d04e8702133ad1e55550e7097b2d7ad3ad2ade74a1f515cec4ceb46dd9a3df79af1565c72a3bd9a449db24166c712b81ae866a64b09eff442449b1e74179e456e86274ac10d521cf1d72545c147841f5399734025ab3a511c1643b6183ecbb29ec35deb3db7aadbaf1155bca35cf55c864fb00c88c58597e83e2170a1053838d83458b000b73efc0e09b8b4a631af8326723390929ae4ac8a45a026318d9e26b9252ca8aaea49596181a228263f7efc20810228036cf0f61694525ef2e3c70f14dcbc69a25890523e76337cad95400869402674b7836f8210ba466143df08e9ee1bbd0466e625cc39df162f7f8b130bef319c3e31333384ccd3bbaf86e6c78f1f22b0e181be900fe16b29504ab2c0c5754ab0c0c5ddb2fb3e80eb946001c9bd6e82f05e3787e74e87bc4d96ef74df1d7c772e01407e13bfc10544cb843c5f770057802de265937a380b6ad2912619a982b6818e78f25511f52446816ff0758f499a865b72b9421bee7de7e43a1b9589e09c1ce973f70da0060d3af7d784e1a5356486fcb89fd838242da0dee4ba707072933bbfc1b91438e79c9b40aeb198267745189d83939b9c9b1c1a20cd856f7aefd07dbbde5dde7b50c67f40c628ad7bf08580cac08d7775ab0f3a474dd334f5a893538183d3e426e7603ff15e2741fb46e3d232cc7cf5f6fe450a82a32808a769821042072737591d7865a301baa9b2ac673deb3de8a083ce49e8de7bee35e1efbdf73e2e46bf7a35e9d51cce5597215700b2c375b7c1f7d264fa06d3aaafde2b5b72af3e39e363f0d3a9779bf7a4ab3ec9ecd7d67fe75759756f46627583fdaaf66995f5aa942db96f3d8eb8aeeab7e448361d6f21c99d0eb770e44e7f525cfe34f5eb77d76f0262faebe94cb9535b0f6d1d15de39ea7dc2716f06deb925ba07f68f3b7dbac8c151a1f290122b38b9f32a5ddc0981500142abf3afc6bffca8fef283ab07de95fc694b7cf996ea95dd42f7c0bba595c7ea53d39ca4b487927677276b2c557bac7cc52574cc672c949eaf51fa66ac1b12b744ef6e123d3763518265565aca28d367771765d4c32d597777db7997efc52cfaccea16e3afa7f427c56e71d341e2c7c5727a62123d77ba6367c1463ae6a3f6684bd9a9129a769b37afd5275bdb70f8c7b53eeb66c47596bb562f4bb31bffb06ed3978c58ca67dd2e7a5aeb30112d8fa7b779292828b7e999d9e9f15d146aa73b8a92833e2ba1580fc01b3f47d847299f8f47b95547d8adc7a9a3c3eaa0cf3cf06eb43a342037da12df7dc59e8f52f9c7bdda8febea59e54d77a83c44044bed4b4547486553e26e3b8f863e1fbae2ca634aac30e4f2e32710a1cbb654ddac1bdf39aa382d6779ac9aa57356cd6a382c9add7ad8b13cbab35801c8e52b54676812d172f7662287aabbb356af2aac29112d76e66192bac441e3780bc79644cfc5ce9ff4292db5e7bc3624eeccdef28973ba5937256e4c89f351c7bcf1da33fa99d588d5f8ac629bf62d3bfdac232d1b6516a725746d941d7bca631da1fcf3f819aa204a67053d5427684ead6ebc65948ea8c569015dfbe7f433a55e07d51450bd522e1dbe281667f491f696b37cd32c4ecb594695e5594b65798c1fd5963b8a63b71e969d7769ddf86205d8e11b3f6b8f77a3f5405f1738687cf712028d9f137f5999fb07a8595e30a77b13d6e9ae42bb49ed3acdc7e5f7b6a21cfc76877593443cdb3d6f896e7682a4a6699244444b4dd12a71dfcc43e271145e158e009151bf1032ebc898e31f0522badbaf690f73ba20d5d1b04f59aaeae0f7447be84d3a8a23f9cec1450eda7b03f1babb690fefd37d9bb644673df0f9f015561cf95edd341c67e59b71b7e9066246850248052c6ee61c33641dbefd77ea3bf482f5391dfc69b239d17a60035bcfe524a6ef4c77b2494cf7c0e74e3609fe0ebd0c7362f719648a902942e688cc1b6464648a909129a2081919199937c814714d4646464646a60819262654a2d4e79bb2e5c45bea333f899edb9fa199f2d8f259314dc3306c4e55555595defadc41cb7a9665536555d6b34a8fe970298e96c7f99489a255daad4016aad8ed17866cf551a5448ceef2e9d22e1fedd61c91526ccc8ed5ed5d230c04023d87bba0f7dc941aeb66c48d6cc597c58f268f556a61dd706e555977e168fa439f4f733de106cde5e57fcc61bec10b336756fb2b3594edb83e3f27477784be729b4e49494949e94fbb8d88985fb1dba8ddc5b93837e5d3662b2fc3b0cc883b7de0dbcfead5fdca6489bc566ae87332d591f21596af6444e870431dea508742a4901db1d8ec2b0f7d5aacaa3ed5a7aa6ef350e68b887d3ea7f405bd3ed747b3d84a65dd8dcd8bf401b51fa90ffdd0b37a3dcebab1fcb24350a1b1d895b6a5d15b6ca9be3716db43873bb2ae497fa8deb5854dba7d0c0c4cf7cbcb417f61f9647969398ba8e52c2f2d2296378b8b8b8b0b0b0b0b0b0b8b1bb4f8eec9d7a33d408af32e10afacd8952cbb40375b32e4b2bc552eaa9b0e17e7b6a09c8574594e9291f9657171b92c292ca0db2b2c2cef5eb1a1a784588ec272d735f6a1bbae61b19bf696bbb754ea5add7ae8a0524d9089b07ff1f9827a313afdb4d3ca8a5dc9b295ad870e239bf78974078efd8bdbf47cd12f8e52b7ebd24f5bff669802d1a14f9defb29fdbf47ccf65a9db2fcbbbaab45414515db9a3cd524317d59edb2ba1ab846ef3b47f6af61494bad5b8f487ce74c0d1c1128126a3a2f7477a52d2b8cc8adeff4824dad0066d70f0a2f97cb22c849265343499dd785ced9a4d7c05df6840154e730d98ba7fbc9afe215d0cf9ac8a9a245f5550d5ead524d933f2f00de01b950e57ca59c554a94f9926413e4d565dad55de48f956a6478d0b738cee4089c2094e5c984ff91a03f3179769523706637568127c65e9702f7a6082b6f58f66a269fce8261a48d308222bd9241e2faa7b79b9cd7ba99fbbd42d665437514bdd3496aac3a2aac32b7583f02a55876f4addaca354ad49f09f7ab9c02a4668c1bb69f6d94d4eadaff6acaaaaaaaa9899b96299173000f0ed01880f40054085515f54995af1b83d68aef58dc765773396cc56ba8841dbfac7ed1e5c7848baf0ce773d8a8367e5fbeb73af3b57f3e25b75afb3ab81f1ebced9b07e1dc68b1a2f53630f21f50cae7431228e8bc4515a7869ae2523232323737e21f3c2aaacb4b63ad94660ba003098dda02db48692493077e0b6635d2677e0ddb13f3c5b9a4a3f949e183476e289eb16973004c9020e77f2c8850bae6664790a9730f0a0c925d3f582046dabf180ae31e2c93f99cda58611af86ab601f584a0cf75d76a1044f8f1ea41bef22aff8caa55d9a04ca427357da57a56aa23f843edf450f9b86d456ae889508d204cbb84a04694264bbe02073bafce532c8cbb36f6c248817179797b355573eadcb0aaf109ee2d5b8b85828685097563e5ec60b3982b6711026e2e52ef631e71b86a249ef3232ce5197ced160b9e48265bc4b79171929c352f98abf3317a0ab5876824e3117f73d17e33db3427379761ed234a47c37122312816a806ac857f2b138777d3e1f27ff612371076573e06374974b215cce5344da91dd8eb8526a9f4c23006f69a483722e9507e62391ddc14f82872bcfd37313731f3196df377ce303e63e6efa06e6361d8197c35895694b2ce45aa2abdca6276559ca2b458e8a4497f70a71a8e25adf7aae9c2e519517527959b56b491a8197cb1aef6427ab3ae25357a9d665dda49ce7af94445ff9342fc7b8893ecf627be05be5958fea5021e2e5b18aec26e3eb262f956abda9e853aafc454a7e5ee63c6a3abb2ba2ac438a634abbf3ae35af95b931a5c44b0dd5d06d5e751db4812e4adde4a76e4fcbea06ba1ec8a5654a29a7dcf85a2ed2aa0ce1cb0fadb401f85f8784872b1f5d5c5c5c5c2e6d0e40e063f4256e1ce5e11277a0a412e09b963b9a832f744b2caf749d421b8152b20b24103438f9015282246e08013f794d0461204d3240193477b3319046f918c0d5a0d81dee33efe626175844cb394682464e48bc1a0bb899f6618b30dcfaee0e57c36a8083ab820f4f5c127715fc3dd23719974bab77c59be97f0bede5e821afc6355ff1b40c6379cafc848d3c811042faea2406e26cbc2dc6927d9f752e065fd37ad4a9fd4946a8f7fe57c3407ac602993edfe49057f3e16e620a2a6e9f9d111c4ad0367e42a3d5d0c5d691d5c04fbaf8fcd53013f8095c85db408cc4dc8d9fd827468c3c79d23f1a481aded022e813340b2064a63e9fac539af065fa2bb72f59075d13efbe5d35d1f6a052bac6d5f03b0779351c704eb421bc1cd138e066fafdeeb347b818fdcc0acddd6ca008291fde4cf7abe11df44c7f8a67194712b4cd39e1691a0d91d891a269c47b04121af557c323856c62e53692dbfd265056a2c10d2cc5abe1769775e06a2e20188109b7efdc13dc11386493667541768de580ba4df30ca21df124e6eefd04571363398a9e79bfed2adcf7bad2a0862dea24133349f21e6426a2b7920464a1adde76cb78688236eaa1efb40257fe6e73c4ebc21259274abc99770b0a96f17e7dae549777854a6c5a3314f7bd690f46de4516da95b775a92f4cb87881029349492fe924310f4284490b1191cb75e9243fa4d81cf8f863de1722e63c45fa8f79c395d15346319f1e739b16391bfdf782bc99c7415e0db758cb4144b6e99dbbd13b6019efd927aca1a77017afa681bc9a4eb203bed15c7cd3804cdfc14df29ac99be1826f7415469210e1e2becf5055b151e20887643a51a91c85233d1c9fbfdb387784745d3861226d803268bf119b37c337946019ef9a91fbcee4deadaba87cb71bb8fe53826fb093d17f2f44e4f5eb4747ea1f4036073e5eb4103f4f91172fac7b33d79ac45b8abd9ad436073eec8f63ed2d4f3d098ae4f07051bec48d4dc75bcfee9a26fbd41d91f72cca93e0a1561ebe89f9ffdbbcc9b4871c7ce06f9b0310f888b98f1b4779dcf2f44dcc632acc3f759bae66375026aa1be8aa3a5cab4eacefd42f1269dab4c58337af9f8cba850a2eb2c0e2beeb946471c57dd71dba9a94bb5bc0d5a4d81d14bb1dc8e72ab8dd9beb82a195325a36049e5d8d10a02d7808f5be109a66339bdd78cc6ed96d245c8c3e0f51681b0d8d9452ca438b5dccadaaaa5ffdd11efa4224289c77cf6e3d48773ac65bcc26b2aa0edfda4fa6be46b49646b2d0848af8a369b82c80c1c97da7ba681a2e0b61a8223271df67f6e6af07f1b9ea55aff771aef7a9e5e1e951428823301f5c1227ee0a9c0c9e477b76687140a183de73b3b92e46f018c4dea776047d8c6090fbb4d77833ef079d873ecdf2884036b33c24ccf2f0c837f31eb292da11dc48d7457d183ae83eb4670f02747a6a7d840ebabbd96a10819d86ea085a504d795651988fac0011591e9662c8112980a8a4a000d978c8cadd8de82defb961d9f8085f3b287b0f599e22ec440b591ebee2cd3c90e571c2c349aed09268578438e3da7544fd73fe5547941d4560be1fc447de7acf8d4d8f987061076a6003911f3f6eaea3bc08cee7b3a59847b13c0da4a51872dfe7b70632440a953f209f4f8a131415cba3f2eb9f8f8aed2e3e0f488a2501dfa0d82e5a5844d5bd19edce89a67deb2e427737a1cf53de7383f2ed0111bdcf5304673e749e22382b9fe701c2c38d8ac8f2887e3d642fcb23b29de4cd3c9e3e6249c0372a16f4ad8f80ec887acf4d928cb23c98e8b98940fa8aeca117c101151945e07a769cebd990fb7e1dc1b91eb23c6fc8651f488a944aa1d4f8a95aa5bab8bebd21d725858fcc8e70b063a73c2ecb03a46fb22f717aec7d082e68eee68a2b92dc97591f4bd02745b050042304f9313fed085a1d100804f266de47eee268d97390d9e764522820427531cf37f3ef70c89bc1ec081e0e1905c137d7f9e675f16686d0821de15ca7bf4ea92e7e6caf8bfb4e802ca82e1c139c0882154abe80052c4c71f34e3979353d4f44010c2b38430ace00832eae6fd447d0422454920ba58052bc99f74abe3f4005508a08ea812de281364dd3e47ac67d7bd7dc3051140d081f7b613209c2550057be2ec6fb93c1754f1881920bb31a6f1a130aee7b021349ee7b5063c3e5a16473d0e7205e16a47c4e76ada6494ea7a275e66aaa9cf5180d5202ee86a7e7e69ad3f2f4dccc6f72f2b8b4bf8fa8c7abfa98e7a1bffeeab33ea80f8a43ab26223b16795c96a7e7e6e2312d0fdfc83713795c32c63989d03ee54ec4c98e9dfa91fd7dde650ada06e5a18febd8a7087989ecf473da0d3a24352e258adf6828ea5a95843cd0fa23b345fa98f5412340ed086714c4fcfb94f57aac38f397e58953dd79b12f2193292a46ea32a598dc78c9aa4a1b2b55e3c590d25c2e45511475bdca799cf32edb1c6ebbd3b75dbea06d52c69e18dda4ea883abfaaa5f86dbabbe4f6a9d2d4311f29c577b0937ce1c8ed5352c68a71c8c38b443f9e7ae1c9ed2bf982141700d729f9c28fcb1488ebd16ef397854da2d427aa2dae1de8bfb7cb16da06a7ecd612bd755555655a7bf4e7e7a4eaf6cb4582b6eb52f294cce1d97a72de77de0e378739cc610e1de85bb6247b9076a463b423fe3dd6c01b987bbf107540ea4cb93b5519789560ba3b994dab231dcf662e0667979d0d1d4da6b82cd729c162c99dd97427339f1d673e63ebf238da3f1f45003b7d10980d427b332c01778372591f45a67f3e5f55ecaf5eb7aa76699d56f9597d501c6a797caa0ff76678a0582634eba3880f1fd3dabc19388416b46bd6e5e6966416893703af5923de0c462debf2579dc7ea759bf7aa9eea9cacfd83699f3c98b0b24beb83623eacd36bd547111ccb3a1fd587d082358416e43fdfb4117c2c4dff6dbf3e291a0177c3445bebcf4aedcd6438bafaa8deb7b24b4b3eb35ef55164eaecef38d5fb596579a4f56ee40f20afff81678de229207d438f552648b0801b7a207d833d561ef4549580bba19f6a10ef067b557d6496870912f070731d08dfcc6b7634f18ca6eaa3084e6647d3331fa3c98e22a0dd3a4ef6ea9ae529c2739ddedd58ee667290370387d042cb7172b849f458d53f60ddddf0cdc6412e262cebde6f660f6c2b0553e711b913f7497722391bd89d4ef3b44994e4ba258e89cc1919d1aed37fdad1fbb4a3f7cee38c78339374b5ef9c75e4ea9291e371ce59b3f220bd9909004c34cdc5d011b918fcbe91ae3a67757284d3b7ea08c74abbd5b8ee94945246fb88744f49984ec6c13e8075faee998ef3a6e9d0f2c04fe7e9111fdedd4cf5bd1fc474687dc04f6febc347ff2551fd077e95a708ce7bf66779c0f79e9b26e293e529322d0efcb33c3fde9798ee83e6cdd8d1fcdb8ea6d5a1de9647ebb9e9b9c96c912587cfbed1dcdd64d6a634d2c1f2237803378d0845f84a3bda313faf8f2238d3b3fb18cd51f58777769212ca6992139493a466a5d2ce1e1e79280fe547cee9b3821f5baa268764754ccaf9a96ed31204254b8949394d729ae434c9692a517928a13c9c26bd8c8f739a3e4dd39ce4049a224b2927bb55673b92524e734e19cda1428fa9401528270855e44b9385d26e495cd75555554525fdd4fe59f9aba24b4a5152ea885198a9856c63f5f9584d9e93ed9652619376607c971fecf46331515dc9286669a7409e5e6f209d82e956d4b52ccb92202115bf2a9e900bb5664231eeb6bc72aed83d214da382957575e52e94f2a92a4a2b4a2bda4ce8235265d5ddabaa583dbed07ecfced945fc62b79da6f45b557acf5e31551129ad705551a7f40da9e2caca797b54fcf65edd6e4f4815ed4e5fb6faf6ecce9baa37556faab8c99bde54e958799f3799f243f66a949d9eba4dcbc8e5876efaea2f48b5c13c21977e25562bc72a8a025281b12fb47aa195ddf872b123db625f152f7bef652bf639b1f2c852af8ba8f99515eaa1948fdd449a165bbb7393f69c60ba75893e9eabaaba6855b9d2a62b9fbd3a15333b0415b4c9a56c9020794e3c279ac973e209794eb4304b1328955764f3e25f43ae0872abaa672adb3f89444353a38648d46d9bd21c5a4b2252fca2381ace94aa55cfc6d3ba699736bd24f2cea5942f711f0d51faf7fa913e3687ba5fe82f64b7573729c5edf7de99dfb767bb7a5dbdae5e57afabd7d5ebeab12d614ff99bd3a38fa24f4e7137eab5a47d89dbaf7aefbcc91ddc8da29506a2d46e528a4b5187e2501c4a0b3dedaaabaebaeaaaabae1e0a45a128d421a194524a297d9f5fddf8baaa4ae9533b0a9d75bc37104464147ca34f634b71f95a0a7ddb525f7ba75cbd7a8979137933d53f5b8d8d66236ddf4455d5a7e83718a691d21cf4a56837fa26721b6389d83ecc8bdd4415edb38bdd6a8cec46d36237128bdd2eb215a562ab790536513754ddc5ba2f56bbb5f74873684f3955fba07afd55ea362fc55d940a49e5ae4d6759b4aa2cda92753e7d86834871f7ebb6541f7b5fb6543d9e625ca346acaa4b4a4da3343497d6a871293d67a775dba1ae7c3cc5e44e0da4460d1a1a12e9178934ade209c98d76082ab46d87baf4d4af53d446e726279a262497ba116f62fbab460d1a1a12e97793a33bd4e5ee35ad89bab2ba6b59d62d4b4617860164baa601b109774ce708e7e49a4cec829556524a09bfd3a5a6a4ac2a694bd34ecfe01bd5a1fcfc367f5d166577fa96789b963a33ac4ec337e4ab0d4e874d83dd7437637e4eaa87670947d33b4dd59295757f9a68f8c6746a43b9eccc96a8e9fd2dfbd8ad77b8d93714dbd42d3b8365c853d28eac5787d3349de56964f70e77fb1c7edb61e31cf33cabcf683be74b1fbb714581b8eef4197c63b25b12ae096559d55d8aa2accab7a98e793bd21c93afd5ea59bd3e5538836fd051fc64d9f8433c1d51af0e67f08de9f02dd6af3aedc63c63baf5ea6e06df70b78a1315637c8c56c24b4d7606cb8019675410031c98dcebb2dc4272a114f700d729d9e2c9dd62c99d971fe44257dd494a3736a2596837c62810f35a94e6081dba0b2de67790497140eb4277299fd3b28fad4bc897d6a5cd8325ec4b5c4b454a08ffa48a7d6ca93cbbf5c5aed2412ccb4ec97dec5603b16ef3ac2d7ea79642d6bb65c5cb77137cc3badc227c5bdfd02d09a1dd3ac88d9fe2c1370cdd5ab96571b31d61978fd90fd6d96e3aacf3adb37c3c0415dad64182643407cbd996f8a1632c12c48f9716949f8fdd24a539ac97a0dd7e5120ae6bd92d89cc4e8a8322b93d5117abee36f3a7cb5888656cddc4b51e698ed09fa8d2af54ed2af573abc6eba11a02024a4161b62828ccd296e6adbe3a057ce3596f66c7e82953792cb31b1b796da19cab44b1a3eafc374369d6105468f1f42d7cec1b1bd12c164fd11cfc92b4d8270ac475f9a776600af8065bc74ea9bb945eab4eb7aa8ebad507ee04c19df0ea9857460ac4a12dcce0a4a7b719ae3083113310b933ae5352062ebafb581f9b8ef5b1c6a6c3c6ecc63df45014e68e511885390a73c7faaf96e0a5e6a4a847fde5bceb1b76778761183685b6ed4cd36577fac696e9d43b3b55a2ecf68bbaa452a82951e453aae852d441559399c5acf5948a523f559bee65b71eab92a04bd2e049922b80eb943c81e24e08e146fd7d0948c1fe849ffdeec697dae0c5a6ef38517dceeb71ce3867dcaa5f95eb162b73f52bfe7a50dcadfa4edfcbe6bc3bbfc42d5dffe9b7ec5c7dbacd9c7266bbf53c487b337c94ba33b5ec74938d35bb59df32bbd3d4eef4bdecac9e132ca3e268b79b757c4119b028c3147766707b43eed6dfe9eb630b2497749d922d86dc32447103709d122ee0c00517d700d729e1e2c8ddb86edaede1999ac90bc237361feedd574b393cb76e2f8adb87fcee645bb637c46d7063bbd3db1b12a98b0f3ddaed7acfcb789488f2f894f72ce8f121eccfed4c376eddc4d2677d1a820a6d6ed494e3d99265a9a9df2537b9f0fde704df88b6c4a7f894bd16d4a425a69eaca91cccf74f571d4ce22214b7ca972654775facd04af0938eeb6e7cb7e704cb88f2fda6e77017924187db645072fb20a6d13a96b1bd20d79d72a73be085f639c1321ccdc3c1748d0626d050856b120d1a1a1a1a1a101ce0b46ec9c326758e4b9e008aaee9236f0636510277a385b00cf8e3322fbec75bd2ad601f7139226bdffef1faca69492492cb37edc357b42461199004f9dbaf0c899b30c26249f9246120373852555505798a0ce44df1637f52d3600b650582624a297d7880bceb6b9174d864b8c64b9e4978340db6305a2e81731f16d0741e3e809a46bd3dfc7479cba981236ed31c638c50039535422412893e670f40b4cd5941034dc3ea6159afaa8a65ee44b5b4aecfadc951202273a907cd9dffdcaa25ee61c7644b5c82b1231df2d37eaa6c212e067c136c277631adec1c0285101244d2475c0cb6028c0e2e3d619c5fb91b1d44d25896ddacf392244db2022b5982b6711256c25678a91bb3909e79f241fa47ca616c0a037131841ce1c10a6deb2342aeabfea2f13c9ac645a26f129eadfb80a206cdfae6923cc0d9e0f39552d336510a0e3768510346542b02c232a0768448cf40c14732ce6e59b80517039e5f75089aa000546e461ef40054005429a3dd62bab2d2c59076eb41c34be61167633ad0695448ba8aa621abc72853e635b929ba1cb52cedc6dcaaa31d30e7b32dad5020605e3133977ad0dced8f3197b5c497d28e7654b6c49f87f90673b6a5b8f2ae58b9a214c7741a7bd0dc128c65710b7136e247df62ee47b4c9cf61e8b0e476342b981616cbf2124e622bdac3cb612adb019a5b7a39cccbe15949d35832612a7f5a1da0e90106e6f25ce5ad5a5dea10adac2f9f558826c1bfb0ed4153e3be7cbe549c26411703de8877f8222e1231792a2ff0e5e54024f0627160636c8b68121c229be020314a2ab48d815881c60684854859b9b8dce6b9d4eba32bae704c801cd161141dd6b28b569b043c8087ac98e90e97236808430364022efc947253e2cacab22ccbb22cbbcd0a892bf9ca695d0d83b63190fe028e24da06ba3046192608b0418f1a3d6af4a8d1a3468f1a2842b8a80deeca3d1adda6b98534ac2e1a2404ee061b6119f0108a91913010e90baf1174d291f8b45e8ec49f2037c37c83216ffc830b2d3b65d3c0ac7c9305891851a8051bc232e019f2a16ca91da47613a2da4090801932c13c99d359ecd68df110055f51555505334db2301fc658d2b2feacfb9169123b0b76a8d558ad696b217d65f5297299ef12519f33b870ab6e24314f108a60fa750218830bdf24d75dd577dd0f5a7cca5f3eab8bce18b5dbb40f6f0616c132e0352ca0114d8279df5975131d245e30efd1347a60ac915e8dccf9348e068ca311e3685447e33bb84634a9c70b12adb23d627ded204d82afb59b6820cd4493aafaaea342bcb88c9539df845442c72c0fc9a0cab51df0d004bee2070f4dd0388b2459407127755595a7e023b432153e1cbe08be8104cb802017e30a67436e315724ab8baaaa7a6637d1d63fa4753d6a1cd134aa6a895b1d4ee72b9c0debf07e442ca23b57c36ec6d26adfaabefbda5a59b1be89ee8a75677de54c9d8b61dda238ac4fd5a23d50b75ed57727a4112049f998f3c0f888cfd37323731f32e7f8bee1ba233e091e2ecbc8c8c8f880711f377d03e32f0ee3469c0d6d8b197d13b5b0b81a96c38895e688910e98c7c3580d3409321298dd7a5c46fc96ad478d1bed11d688e98fe2a86e44d3a887d740d38039fc113de463be45bbd1dcf81a9799e532e9f20700dfaa007c0b40b50e80eadc0c8c8af58f1899aa59ab72e5eaf35d7073d95e4dffd0ceccd7e4f90a96014924d0169a95c3b26f12e4db2370350708fd4e6df5aa47eace6f3bd42b59b69a90c03f9efe643c353dcb4c607aa22149572fc91089f2495946a2572db69b58d6ba6accba7955ad9babe620d50b82556df50ba272c6aeb65e55974d57fcaaaa2a8b59cf30ac5bb6fc4e97347875cb63986c4d7b12bbcce4e93bd344dd6f0dd3baad11f6fe0bd2d7ca2576ed6aadb14a55babbeda79f13ed4412cbb22ced05b9d515aa14d616aa8e0e92f228d6ddbda6a92f4969527e62d5941343b123eb7c59498d7e545baa08fb74932bb38a993c27ae39e79cd3aaa4d62029a27889a2d5d014e34fd554895a0d51fc10551d45ad45dfc98feea2d54063abc1890d516b51c5f8f2d25a74f5175a3989a2b5b0ae59ef6f4e5a0b67e35127ad851327ad05d56a682d5898c5049f6ab4e4caa8b53869e18263f5e1b73819c16044a469c457c56a9b98f8bcaa7a781e577f5dd11627a3212a0feb110c30901d11b9fc7a3c5ba2db8b918aa31d94fa4b5caeaeaa6a71321ac237aabf511454bc60b58d88bccf376c44e452a7d5654bfc2a259e7b6be1a26215bbd32d5cbcaa3a9ff92d4e86c4ee6d6544e4be7f3ed8e78d60f0aa6b5b5179f6f3ab6295ea335a4229a56d47306019d468c8ad3e8fa7b25717a57e5a9c7412666b45787904038afb08767a61d845f91ac1c0d2a860e24e558f3e72f9f12d5cdc2b567de46e3dfac8ad4eb57071a98f60c037780483162723188c888c6010531804048a6f3033cb259f25afa494b3a14ccf796acad234e70e5f86bf71ed304541ea4b208450874986e21bd9b71d66664ac27fe6a76e5c9de21b3cf53f9bec8bba2c452d99968214df606ea624c52c77585214750ae32c0ccc6f093b1a94140b3a28dc56c0251de0f36d871933306a06c7e6a654a58f158b4da1a438c994dd62eef439ab1863554b6fa55b656565c63bb51252b1af298aa2dea91e1e8a4f43ede06ef43b5dc2bae769f8466f33f8c63cad1e11de2acbd1963a4491d460e6534c89583ed4d951d48c1e7587cb76b4f2792ab36b49537c1a8e717ba7df1e913b8f45c69ecd2bd16259acc852a76f799685df452c7683971e7bf673cae3d5b09bf1b9fa595317d96d874b2f97542b5555613458dfe6a9d4cf43553ba8ce6318e9d5f0d0482916cae73c5e8d12336244f2d20c859999a9b56654f556b6c49752d366b4b2493bfc337ad46b1dc58ea412af4624d2a619b35efaad47bd3b384973d097327b3d925e0d4f75077ad9193388c419bcc22f44264a8cd5b7794a6365b18dd24291202959de895db17eaa39e3e72c6974ce6ab2d3b49851be9a0cf4ed2af176d9f9e6d424cfa92257442c979335c99389164e9ac6ac2613ed73d2aa6a52d15acadc94729ecad3599530f9ea5382403cfbc1aa3a6852ecd9b7caeec08d7764d38eb2578f52ca7335297552e500699fa0eaadc5163ac886a8a856a190dd2a0bb2680ea94525298e0bc3308c6f6b6fa2a5a8fcd595c32afa54592eb5ea6e33f94cdc28fcec1b7d66e1ddf89f6fd47e2e3fb7b5c0d8085bccb288b2c7afd4cceec0662db460a2854ddb7495520318d5d44586727daae27517dd4da49f7dfd4e698e98e7ac9892501cafe21f3566cccba80513a98062555525cdbdaa62755bcaaef13bbbd63060d829c97befefdfaad76ff1d53e18d9d64d4d5628c5c409c954c5a4e471ccbf4d49ec3625b9d4771ef6b087d1ed3abf89dfc46fe28c8f31c618734cccdb3d8ddff6d5ad623bd25ec91cc6e54345a0f7fede27245315ef558f8930fe6ce93d064645b54be96db5320fc6b7becc10546830ecd6158c5fd56db8ab77182e7c1998bbf7c26e226bab9dba98de7bf066f53d2dc64e56bca98adb31efafd73ba6ba4bf947ccb3139226513076932f76932e76d48291ee8484a6c6dd1c921a170505fb1633146666cc7a6651262ba8cbd26f1893d2f5f8ea1b6677a68b6157465576b2225a941ada371ad219c99b995e8384d9ed1592c90a1aedce6477a62b7b89ab6805dfc8ec9644cf64854834d189a3dd99262493155312ab9aac60191457ae51984e66e5f0081b691a53641ab3a5ae4f9a23852767e48845714c5d5d0f55ec53ca41b53f3f575314455dafa5144d52d4f5ee8bb2692de52c04797da7ef24af4fbe2045a57c7a739d9f8b51263b5d4e97534c55dc6da74bf34bdcc981a49cea06efc45444598a9f211602df90a77a5af9149a5fe123b06bb469c6cfc3695908f3fd8b864e534cd3b45d2957697acae70acd55a65fef6a59520898d5f63a9db3ba1ba7699a66cac532269a2385b194149bfed84913024f5c6919c6428851ab54a93a7fda6d073afa4375ce2e9a27ed34410ac47578b110a66521b01116c2a338ac23949452b21058c68424450b909cf32ad9d986a200c4a4396874ece292497150cfa23822768abed3d0a08c49a292888543893149bcb44a322546816f58a750a2fc1541292019975ceacc6c2dbe6e3d8ac2a8478c7a8c58dc0da35fe252d6e1c5fe1e95442bdc0d8b25aab7b82446c18ad16e71c9c57e8badc8d713e2a5b391f24859d84ab47674fd1da3a8244d4309dfa01ea921a8d0e292b884e6009db225eaf419e851c7fe30104673308d2a3d3010f6b08be298d74551147561545472a9533407bd75acb2ca536af6951aa23426e14cbbce6cab6b578c02df78f2bda76dd413ecd4f41805ac0e4185d663ebe196504feebc8cd5c5beb116eef4ac4a1703bb4aede196842af5e4528f514812a340511cb38a310a2c8322125a8390f784446eb2620911634a833ad4d9fb3dcb289f6b6ffbde13e241eb84c07a78a2104c22753231f2b1778c65307ef1aed32783c934b9dcaec915b7e6eeeeeeebdcc3f39a9fb440ac5b88d88f4ef8bde026f7bd3fcc96f82d7ffdde7b93dd7abcf71ec71e7d8b2edfa8fbf2cdd98089793b1bb7516fdff455b623991f46b7100fc39a60dce4c617619c851f00e2ebeeeeeea65efa7bb10100c30a31a7904b46a6ba7b5d576596e12cf8459db715e5b57efeaa3da6aa1ca6667fa9a1bb54d04735e56dbda5458826519a68851d161c6da962cea231d7e4623dae3bbff5b8ae63b674c6ba03d02be7bab2f5b81c16976dfc16aa20eaf2531c377431286c9ad86171a9d84234e9ee96996c8bb8f024869ff043f28e50c137b08fc62251b3b4f58e3c245818b3ac2c772b21180c6becb9160cebcb3f2aaac05aac16c86cfbd8b6f34af00fb3ac682929b1c8238f0aec55112dc9c2f290608fd23ab4be5996b4de628dac28a5c5f2c658564229d46b3b7a36d90bcc3bd234b05b7f5458522279482e7616c98281ee9e8aa863300cb3311686c1d8176b9fc00721647954b05c3ed28faaf696fa39d7789d85e51d6952a450e4c4505090c037367e117bd1b22c0bbbbcc5966559146394995d24b2a689c9c4d8298cc2a88784878477e421e12191f621816544aaa50845bd21175e4e2ebc58bc288a2a6593a2ae8b6a6e2d2645d9ad9ddcc951545f4cba09dfa0decc190562623447f6eba29c508aa3df908be2a078d6ec6e45655e5793fea586594b21a75d573799cdc5a5d9127de854b7a89d5cd86d456d43f4a11d21ca8e3ebf3e1d2505d44da839af6794e6a032eaba48e5a24293e6a05e0a5db7a80b64532c8a7d9f4f7777f727eb2639b24f6daa9e5dd3bcaeebe253dbf4abc22665d55d9e7e4128da9899cf7f35d05ef6b22e698eeb25b61b470ac475afdbbc8bfabcf566f2d6826f38ab2b39dd48554a4a29ad843752937530c4a1372489814988c0206f8893093ed1f28641e01370c8db4893d6963b0c8442dfeb07a3a02eefc12042e873b1a5485d620c8d8970c86d3e642252093d5b8a8f8251b4b010bec17f108aae5ace43e0137ce39d82433aa5b290096dd9da89dd7660cb6b11a984e01331d2fc2bf5180aac0e8550da42635a628c78a36a3fc1d84dc23c86260636136c8525c6185b2c7c020a693975a9d7b952f32dd5dd516d81414476939a8addb469a321410899c02724841032814fd0bc1a7b6b6fbf896468606c9791f285b5163e01613399a6ac1d7c023ed14c2e759128087c020e79e9172ab2c73bf954ed734e9547cb53b01533ebd11ad2d18ad9e78cb187a739be4bd797b8d1a2161b6126a03395bcd3284048bbf5bd8e626d3ac648af6d07b62dd15f8f6fcba22c56434946cb7a8c547c331794253bfb76ddb22cfd2d1bb3d2b7cbeeb465e990e7531beb06b23c459f8ad10833b1a4dc404e688eec8c6575e3db7cea1d1b9485eace14f1a5b61b5f31f2b321f47297527a31931cd9ad53959f5227ac2a47a9d863a5dc65ed6341b8694cf9b294b3783b70074aeb7d8bedf6a9b0493b2dab47ed5c299f8a10ce6b5ea586eace1497ba388bf8cb72162c83facc624e7662b91b635555b15655e42c86481529e58dffbc328d03b15ba8d4ecf6b4450c199a11000000000073140000300c0c8844a3b1704c22c8b15c1e1400109eb050705017a6518e21630c314400000000000000609240bbc51862c5e77e8b556ba6e8119a0a5b8dc00f3a4082546c0d5a51a66abf389d2dacf67b9c2740708f3a28f3e660736f3d7ff86e7f800bc82b84f9bcf276823efb4b4121568765ba5f7d0cebf1ace4b0ef279d354c8e92d05f4ca3e5f3d8e8c7341fd64440a68e04d4515ccd05998d7d813e2b1be332e39d45eff098d574c26383608839a2d3a956630db776467ff7826a7f16dbb159cdccba74c65b8cef948c95a0eb7c590a76e810a8b14f9745ac8590b83f39e876c58eb27cc4015d6d783caa2ccf49b37ffa2e979dfb3615dd08ebc96fa6bb16f4f376aeaab602ed10288142460173da3fff6cfbcd03fc2cd75adbc69877be6392816a4b786d63c6f7ce8f7383aee9aa9c82e7576d9c4044f9c12d3a2722d24991674b8ada55fc77945deb7c47170179ccf5f5bb1fe62fe218a3d637e2948eeb8b3afb60c09feededf02f62c99c376279ddda42d783040208d271b96c5d2cda8e08668738e65d8de0a1debe2e81d773a8281ed3e6db830a86d8a735daeb965364d79495d4fd602d7da90e3644d7c41c0f01505ac0e7163a7dbd29c12e9cf515f81d8647430b0a18bdf1bd6694f98ec06459cdc8d8f9cd7b09653908670e5b354198b4c307bbaa9d1ead488db80c67e61cd8fdc7c922331a6d7cc2e904ef70bec2d4e69b0f9d74e24a93a058431155fae61e323a1eddba0ee900f2768b5cc0abb5cbe493b256c07d045c07af11da1140b42a2e9f77b131d46de53e928ebe16bbfc91665f7f296f0b3a681b69b84ea4ef96f08e3889886776f4fcc5f5ca92acf8e94b31921f247f54d4ee6542c127b5da16d9379e063f5e5e55253f0d74e8affb82cf6f6d15ad1424b9797a369a9f560eb63243b3599678b7424e6a012cfb19c340d6b4870ad39a8d75f2969663a209172faf484c0819dc660a3af7f5c1d909ab34ab49e2dd1c1075691d415f176490b3833d07a2e6def9ecc00d6b6edab0aa452b16c0e988bf3dd4ca255c553477a7229d30c1295a4803b04aa830b797190fcb0aaf5d30437eb3fcfba5d0279163bcf3f83b28fc201b8e2e9bbf9c813f493fb1a9890068e3ee223f2f6c4aa05dc4358eac4b3bc802b4ef6e8538a0b9dc58794a6773de407476225bfc71c116dabc9ae37da345610b03be325d9d793276b68342447285e2f5754182f47b593f756b8140da2293df1fb097ea478e4af9c0ab3ad287e00051d09d0ee0b9a6eea3af02ac0c570cdf27254728e5aa123766bf8a6a3d6e18ed1d2ed9d5fa457903ac295368ca4d6329e955d1e8d9d3565a1848845613a9aaaa2a38be600c1eab454583f7debbe805d1f40830a7da40f25677d4425c48e203186000d541589f77636364495dfbbde91e09c1bd0b48a48bce58123f97af537916cf2284352618684e7d1f2276b1d05641755eb9bfafa8b6dfe3d5af4d27a030abaf97431a0d184bda0fa8ea4472f8ce7e8a9c52eea8c4b7a3e82314454b27834af0e3503ba31eefe307d46a47b06d42885a176e2bbbcf02916b80b14b4810c68e9240253ec11c38a889917b942701b0b462eba901b54ba90cd8acd84eb855e5c47f494c471527d0d82e027981fac603fda26a7639d665004566c195f2391d4794790a92ea68d07da4c3868410137fa10896530951a2b90e967d0dc88c4055ed756eea75949aa5a5eb7f6c28f64966dd4e439e3b8b167b82be28c7fce187219d02843a8fd28d36131a3f5ec81702c79d19018051ae40c40fcb52c7b0a02b362fd1b6c66659dbcb40f10b62affd1b9d013c540acec15726af48f0c39a1121a4333783f5b0ea4e97771944a8b6e4494c30bc082f0d7c4b131a667c9bccae910902fefe0d7f3246eb36bcb14a1b2dc7a660d404c1d811bdcd57028cef6b8570bebaa72ee96fea5be6baea8e424c10eb280be2231517042ea995140e5145df9f91cb1a3e7a4fe7c7bff435c33397c08aa26917a0cac76daaa044103075b13959da5c7fb2134cd2c8ff6faf530c032ad0a9ed271b93fabbf11412b36fc8eb5c95cb613fee8bafa821345236b192585a291e944d61cdd44d69c5f4b34c3df3b0337b97981ccb422cecc6fe03e0d2deaafd47f4124f580422f8da8e8b9eee33abe275881d19295ef82d408be80485e7fa2ea4a8d8a6457862282d0094f44af6a178649ed8db84f5a813414e9c3a410f4e4f8988b31f4629b621758a0b7f2d173d507447b3f2035d9a83d6c7d5558dddab958b0a4c2c4db8d989dfb26e8a0c215344a41e72beb894b0d5c0c137268e17f6c04b202556186a052cabc8b9e7bbed40a3a281df8f52f7e89cdf365d313d6f27250e64818947f95c9513c08f1159dce86e857803ab7ff017ae07b78048585c7a29bfa34002b6a4f31593e5b63859edf5e38a0f24d860721dbbfa3ae8c47c3d3379ae1a3980a16dafe6eb96069f917f94e58c0a535854393de6b6d997256dabfb3a2a0afebd5c4ff37ff172c5dc111d91483550ca0d2f58b97478d77cc582495079907b95f54b050c7da05a7dbee7921f00018ff0b1637b321c61a894dc985015f9782d53b93b9061bdcdbaafeccc73f3a5fca451e3d5e2fd9b47fe762dfc2f897a1e61520d6545cd015f737b3284bb5b8cbaceab519dedc7cd13159b0fec3bf88a112b3a31b30230466ba2b4a3230ef26815cb8d5093fe6c5510a32ea884b20447e7922e2a9dc602271494de0b7fdcd83fb7ee6963075cb20237c570352aa7b147997f9282b79e1964061942ca05da73c1ebc70f9df8915437a2c03e4f0329336a923fc37c94bba4a2a81b218c6e68be62b77c1c231482a60ef6a402f9450f8bd411311d255456fc25c621e4bdef2e6121b621dc7bc4d1b0e2631ffc824b6e9fe3bf1d04fbc91f68d4ab2530d7022ca556da23751fad63bb42f44f4fc73e5ce06f2d968d175d2fbe74c65054ccb1d90b554c282b9b1c0eea8d1094a7bda5697b2c1dedf64426118e00ced0d1e963803fc5b58d5257d07ab90692de0b74ac9d701875809421637afb16e7e1fb2988912acb186c6810368f119a24c1e0d8281875c27ef6634c3b3698bcd045ffd0eb08c3e3c92661c06b5a224b34b11b2722f12461f80206548114ac6b77ed618d1cd17a3883fb6cc72469779efe15ba9e8b49756e2704b659d1c93f4476b60eca807e4c96e58773d4f07bbba1f57f25d3ce91fdbaeb26e1fe0c3d9fb608315752248d4dada2dce8d4c58c60878d0d8669e811116f74d48b3a327b38012cbad04101dcee82689b79efe3fb3517dac00ccce4020096663a537b06fc84485aa609c8e5c6dfc3e119df525c78d33bcbe508703cc143922def14a27da742a0b8bd8b727d1923cc0d70089673b7751d7022510fcb96beaa38e38ec30303e8dd17865bdfdf3faf0d1b892630ad5bb0273b0a87f342c20194f350cc6088d29e281c97fb62bd5948b1007e05916aa7c8672e35cc4a08bbaa4d80a7a7d9eefe6e14a07e31fa4cf5ee73a05be6819dc5f5d5c1a56b4ab789491a72fe8e79939c8543d99126f22de1460f65d41083c7e160089104c808768aeb6eff62e0f3fcee0ed2086e3f6222309c3b62bf38ed0b0a231c73122039623a4c6dd08493ff1c50b81dcfb07ba5361177952f62bf0bec9326149e596025075c3b699c849d90219a1ee5a9cd8f05ba42c0722066d4d61543928bd6ffadddf3b4aeb6731e0c800533d113e0efd4b609dc998596ec92c258fee644f192ceeb783b5159ccc7e3a2fc17e1cedafdc044359ee77b354aaca17c77cf86ccf50da50c964dd3d15312a5b10c041b6009111524745955ec3cb1144da0c0423b839973ec76835c869ddea3d685ece3df2dbc6b37cd4bc91c37a4691c10f53a116e71f5aa090b37b0cc226e744cc839aa3b4c1098d7dca23845bca70eda9e710e5c85a8c153da5bfa7692f7d1300e50ff7754c68e8d9e996532b8cc8eea277a40c8ed541cb4be5c9a542260619e06155103fc57e1e54c20d41c8a2051f1823c7c7b560895d3a2a53c515b11894770b3e45c6f036c3251b92e87bfdc4defe3c9e9e7811d672f1c366bf0a10950ba9b5b1cc1f2da178ff5f8801a6299b8f50fa9e79e888b7e9d4b170015d88e43b4af1fbff49e43124974935008d60a58b3f827adcf3249e0fe1b03e92b427d5c4c687584b1dd2504cfd2c9dfa3f95715d637e70bdb8aa8fa19fafaf46fea39d3e14315b91e9a9e1e22c3bed04813b356dea06d7ae767ab8f040ac01420eb1cc22725dc8e4fa795fbc49e0d3fd87c9353a03861e4b9c932b9ef30a48b6cb207e2d852c6df09c89299e45c1ef5509c02a2ba2519754da57241830197ce7918b4c97f4632f809b451c7b1ca36dc22d935e32d5c0e04c865771fbc5d6dfc868f113284174d12071f948494d72b203e29f7325580785c77a09feaeb04e2f42d6c6dcc1de82d769e50cf258ae7185d7ab86e5c21cad58ffbed8cd23e92ff02e6447e84e164709781088258e6f5acca0ed0d8fd3641822c95eaff2e8805fffacc288b1cbc34f73938aa8171466864d9a27377071ff74af96c72e7b7ecd2187bbecf86a7a609810373792225de6ab1f797356ea5562bfc35ca0a2fbead5af66580a408b9fc03dfeeceb5e3070c9638727b1892e32a0b4de6ae78af64b59037b14c29b4003d17010db29bbab7435c506cd4cdf6290fb59f83449e0ca4b599b07ac9e3ed5123fb015e5e3824940ef221bfd5b7581931af4fb782cbab7020bf74c0c84d46638e6e675c774572582bc3edf55f98cd380535603d6a296cb99a3e68c45f04688943860a4493cc429239c25ad6c1a6a0fbefa2abe95185c3a4f4235f504ec7a1995ec7c3742c359b49e84ea5f5234cdc78d94704ecce208433a7d3e1116e4ad74116e1221a74ea859e88c2e3f1e0a63809c3e334084b047a2b487a51463a5975540ffb13a0e8db7823dd07a229167820fcf2f930f8687102139bfca84da64fad77dbdc9c6a4cf53e4ef7ce2e6e5911863e8071970895d3a7a045ad802a2f6b520606f0b77536d163e40d4fa57ff7ed05107fce3dee2b56502c9d880bac1fbe7231be45d64ec4c391fc4f9b47932e65b55108da82acd4c968716d95a81e3f99480635368d80112f7f95f8c3830459e26096a3fadfde6c502717093e17b3bdc0dd0e4c2fb7138dc2286679238bb9645a6939b3c9399730eb7efb794c5ac73f4425fd5726121af756acfb5f1ebfd03a63321699882737056222431271e6155a65c1284fdc80baa6310ae4bbe6b28fc8652a2e67c1633c0bc2ebe8a2753b8b62f9c5f157a49978120536a6e3cd14cd0f1c4f2b9ceed16eae1ead91f05dbe9aa4edc8d970ebc5c688e36bd534b4b1c74300e59249bf52aff6b9e3828db6044073c65fb3aa9d732bad102aebba42bbfc25f4471ca7e2257130146d2515f32bfad227205c0c99587e28868b6a982a646467d887a926706a1877d1518e6e36608dbb86900ac0c9546648ec38e7d2ec625a8b65c3ca8d6394037e9a18cfdde8c03f184dba095820817146edbe4427f1ccc21483296ff03dbb6a348752745ecd07fa3e3ca72c2781547f9df60a29ba3500a12fd38512b22248f7d81ec8feb2b45ae5dd2ef20901f2919fc94244e4a51aafe6e043c132688d47d95eaed671594e0ba19945501d4817529a7fa19c2738c9254c578ef90822a70315481af494033d07eb024b05c306b499f9467d7fab2cd3c9523c01e9747365526c9b82943bb08e27363922ac4af011a3c940d3f4a264ed959a58eb43f1d61687eff9ba9990f3f5706c8baebc43e7e3ac55a1c94e3ff679a4c291d6a7a8bd6f71520b145c8427c758455ff6e9cfd1dc754f886dfd0ba0b289ba8d07e70f93d3a5527d8bd691802a9527182ee05bbe96c9ba226dfe77b537291b9aea36ed31b4569e9d58d4fe819624d467966e9862b954fbba9344498bdd1440b2c4ca293d08e23e68a392d17147608c178d0a30937f2ceb1cc70ae1ea350b302ef6b98048d4f8086c12d4752e77ae0022dbbf80341e86c9540d09a099952e44f0b7b3a0b9536d870de86898f2f0722fb141097e6ba2fa523fdabb07d23827bbc719e9f8ae99a415c7c232768bdc5208c8704b74b466a9f1934136554741fbb4267578e203d77d307412cb3ecffe3ab9a9b4071079cc89c9bb35e2bf0571a66250ef4b0de004a2820e8a64308ce370504e9f0769c235cc2a0aa3d4b1d3261820816fac0b931edf31be0aff744b7ad1036d72128243833ebe60209b93c08441399acd91f1cacaee0dac0225515b2f444b72bf26804fe9032e84c60767cf82461c098f6ee54bb7bd63a884642d7980554bd72f7340c084e405e83ef56db21448b9919d170abf1edf0db4826a3ef8abc85cd6924177e3f02e9bd193f57b54ed413af4a65f05778e7c77bdfdaa0922224f3369048246eb4020391ed1136c7895d932fb8456a5525dd4c16ff3d8b40d63ed8df3ce3949b6c99f4c12c9fbc01833f66f834905e47aaa111c0acb44a7b77dbb64ff5b0923fce56876464a7a2cf0410f1c02de4f1586508be2a4934ea8eae5a001988cc93d0c6670ab5fbc1c2c1dfd4478ad225128704f88e8c6e9d6995ac674ae232391110e8357e3a30681b98b0ee7f0feac96ab612a9e769084c4eb01588e055d7525d8ba958b52ae6828824e987f2dccd036833ae337c73d23ea90a2fa7b50e6eecf66cf0ee55a8b0f44048431424e006bba70d6393e94818264bbf1e5102662ab22bef7e3a06540e67ce22595814063fb256a94dd1ac01a6f4beb420a62e2f1695edbeaf1bb24559d4fcd4bd231cb6db32ac9c7334da097bc961210973c1b466e56cca7b00707628a7ce00b1924317159b5e26dc4395a2c3dac02dcecdfd9d6d1546809d5dde1855a41e6cac70c6271ad2535496826035ab7719135b09d571fb331b91c077b1a0ecb0d982fc7617aa1a98fb8f8268c3cde815a94d433cbc292fbf5212c08894c76fccc470663847ebbdd66b849838da5c3e66081219425c7f804c1fab4c2bfdae82b7e4685b89441da26571bc73a027b51ff1e21cf8b87034950ef8b1fc50c0316c97a3550e7c855197dc1d7c132e20180e52b750a19ba6eeca1d9eddc1675d41a7408b0b12305762a76ca27f7fa12e67f04390f05372b3240215373b87d7a81b151876db45dd971a5584f48d9aa8a52c148761332248d4408ae84041b31042fabb270f55e475259653111fcc8e13224d4ae782eee6721cf84799b6fd687df457e382b21be638cd5d3e23cd76b85f48fe3bcf1d3c252f709f1a6f6c523530439cea26ffd1f53a821c162265d81274a267ee690675202cfd45a94166f29bbb6494ff743fddc4de60dbbe3cb753c5e97ceaadc5f6a1249ed0331a8e11f100bf705a1c007f0fb938fa7a978a1ea5d884bcccc389c34820bd9234c929fb84990e2d17a5285ce62a7d0a4f130117bfcd60e453d7b975076957f21b8f351cc2a41c8fbb97a3755563e3a8037c9d62714e3835cce82feb5251abf261256b4d8d20d9a2a2d47edad9f0b423458eb6c6702c64ccd3269ab0875b6077f89d9a1119b19e8655c3606ea04a26a674dfcb2a493e605c7a909913709148a2a5fadcc6f75459f66408a2625674b64b54286061a8a6a61aa5ab549b38237e9f82d61c42f8344857a40ed781331e016e3a74c9cf569dc1d18201925357f07e2fdd894ab9a493396ae9e075d624fea46eef7c438c930128302da5c49e79e63809bd29483f0dfe62fef9ea9cbaad4885aaf3957cd29e39842791db62974e9a6df7d0130762686e88a525a40648768a43e78b3648c41d7ab638e5e02f90a1b7460287a914e8c827f8d2ab83d1d320efa6e46e63617177dc45a70d9e2e027845d73629f739afce8ade63b4f20789fea223174e31dbf004223c88a0f7c7bde42c1eea06f51bc7804bff3d984d7d4d8d302dfabaedde65935c6641768ce0f23cb2c81c214cec6611353f2e3a4a2ccf9f9fabce691e7324d8dc273349da39222850bec586005df99021ae7f78c4933c7b664bb98626c18222cf4292cd66bd5eb60a470ec6a8082686eb04cccd058b7b2959f5f4729354eafd6fd2d3364d5f4342bdf2596eaf8caee506e9ac86dd9d36e54b80508bf4829e0606d3b7efae3c007186cc1e0985f82f944027ac0296b1330440dbcf2200ae12a5fb8c076d1a33d0ba3891e09c042df9f3cb0fd9468654799661042db9419e2dbbb60cf3e0d31b938e7663bc9515aaec0e1829c0ccbcdf06d4b53d21b7ad70098f3c8dcdb3426f3e0f58c0f0df3580c5dd997f9780e63b5c9ba02f4f0008bffa38d3edb992eafe06b1af3eceec520cee03452182e684892442c6b948836da1cc0605fb767260084f92e17c1db6086d09c53e2848b07de13ff25d92416e0c04a7bc74b388adb942999de48684c9765eb4d7e0814020e940f02288d88e287617893dcd47cbe979b40868e7bac74b7dd32c60c26519fe4e84eb10b2fe87c2bfb4055e0b75548caf6e28abb8fa265204f658df1c674cc09f6fdbed093f55d3ea0c6f4f905205d7bde44ea2fa176d53f3f2b3bebe0f03e4fb0aba26e1144017c7619db2351f38f246f990b11a4c218cf1722309715871c3b918eab9d68d43fbc46a77a3859828468c022a4ce4a0acc1f4cb3787f32c9a8201505d5371eeaf254bc088691531ee7d622b87c8dd3fff4efc3035c2289632f5c5d1dda6bf69a65aff78a3beda9bf0efa99e3138e960660886327476aff48db4899faea7552a6bb56ec5415529bd800fc5db95f03e8ec8b3e09677313e039358a8e2459fa243160b4124d9fa45101f5140d08eeec17f6510fa5b86d90cabe7b97bcf25572e1cfb4d92ac76987b2e85fd74854aa8554ad8e35dcd24e83053875f99647c59c505df1d721c9c0f0dbe3758bb1af10f535cf136b9a75c4e54ee886e6cf9083ac233bd1a40315aecae7debc0400c81fbd3192bd7c7942d6d0d5118e20e2849ba8ac02a1bc73e022b01d2e3a25b14eb71409be98e6742c76d00de9e30845f6c00001096d084ccb7c09aea6bd05dc241fff5bf5fb3e8e9f6eace803de465cbabb197402f0048997a36190e05d5fa4e190e574827c7a41ec319bfd5d642bd2d30ba464e0d0aa375a16a60f869eadb9c74904a9ca7f515a8d7116f981ac3d782493d3a88bf061502b89fab666d0b988e8254d27cfae01f439f3e347e8c18d596746980593ebd36485d3e68ec02c73348cd8c4153fe7d2e2498fff13cc8b68746c7a0cf79d08cc04896f05e1597d4e3bf28000d707c2d9f6b4586ec9d5e6e2d0b19a6054003369e293628eaeb8e2a7697728a89c21e5802676a038a2fdf04ef47e8d3169b35cb9814b4e5941e16b1f7169261321b00da0b4108f0b714f50c95f371f03829fff220671e40a9e8751db0c58ad71884fe712f6d529d4c6b429681c8b790a25d882d86c47e2b3c25232ba11021d321bf48d44b68808389ee6af95e8072421961c7221832590260813b02e3fcd151a44ad9ed57204edff905738879a6001d99251ced63ebe55abafdd6aba6fc7399b49f11824fbd7a5ae01113d1343c986d2d501fefb491d96995dd14b8f18a8f737bb1a73ed9bea7772032194d83b1354c1999f8a339325c701c050ebf041b41c97b54dc9fe3d18717f2c4393250b8708372e0dfbc510548d94bc3f2a88fbc4048af93c445fd0ce36e002ca816550307ddcfc27e0eafb020fb2c00cb4f22f72bb87b8677465db40e2e31af278e25d27e1513f442b56115919b275285c76e1cc214c991f2fdcd641528ce02fafeb344556f6701373659154ef17416a08fa90b0477ba490dbaea02e934769ae0cf44390576bd49cf720a75adebca3b024ac63fa2911e285bee54ffb691ea07b61edc046912cdb7b2d7770202a4612a7334adeee51782a980e40ad04382bc1a8a0a99383dc816a6f4f477047ba5b3165dbf39865e5073fa238939ab0437b9f9abbc02dbce136c19906942b8dad4402d0fea9fd503adb6f7cffa6932ad8910373de37a19996c2e3c1431bf42cb8046b216d041be1023e9e5d16596472c19fcfce43f7851379a6cc6ba0115dd7ca0185028d6a8203111c9e746f365130d6d13d6ed5205ce9c62b15bc4e32e8936ed18ae2591184dc93cce94dc90ed67f8a1c8ed99cc05c6474823a08f5fee3e1dca7f827e4c99e2440026c975ae5bd4daa9d733e233c151af1f25e78f13810f2f7faf458570da11ac6661556493ff3508e903228020dac3c136fdb8dbc8922fcee6e0dfa52391698a5136dfce42c9cf55a828bd1b3a05b91a72b3f6f262646ca55133ac4a72865c5f58051ed3ad48f72c442684a4cdcb598a21a6b651ecb033c7f6351510a3519abedd4b0680b6021022fc2dc53d87f456bb6b54fef0e362d69222ec28285881d71abad5060b261849a92ab9a86732ec877895f0b205d6824d40d8631d0b38142fc10c1ec565aa12b00654e2e151ca80ac10313da8fe962ff91840ebb01f8403e24593917224b650dbe3975f818eab66e147133a5e52449b73ac06265d80c2bb0d32e8844825e5ded1ec01a774362fa2cb78f68104fceeb0171dce65cbbf2807706e61ea5a9da8c4dc383771d634eb2e7f7b1805ebfbdc1835b5713fffe024bf16f21bccb14478f2231630e4bca41ee87f981b709b1c7e208e17d24332b870b757a1f722965147a30ef1dfe3432cdd1aadc36666011fc73b8dea1966525211f817eeb5a466a98a101f8c376b36709c8c1114be4f7f88921c7685295a9544b30a0c4797ff6d3226b3e09fb2d0a02ce581015b65d83cbb64bee0d1f87151a6df1ef3aaf90c776ee95953ed0895b66e1ee7bed30233976e15d95d998b51b56bff71df5a63336533b33430ed2a7467ff60137cb26eb0ddc20b09e33c4ec25b1a16f216cf3d3873573e035267beec308cfe5f5d24268b10a7d470ef6f6b6396c76615d4db988bbfd3f7d8d5b82cbe715e5474c481987f19a70b4b8ec20bbaeb36bdaa2b3ac3e64cc861fa04d876e9c6af4fc4ebb877258b1360906c5b5bd9a938a8738a54796999bcce8ba154ed12e5f1d81dfdf0742408f8f8e1a20c535a7f2be0e244387cd1490742c6549c8cb6f9a76a3a29aa8dca9d3b4b00ed46e79a9caca9d09ad413a77ad7ba2d4966899bf6222c0f565b21e8f720506ca05aa8b622a625f9d26ad11a451c4e71ceabde2d1ff1fd7eb101a172181e104c52349171ea97117c2778b65bf12c0f12c0188298d0aba97938ed32266e120ff35bf3d0837e9d72d06fdf85427f246a9671017858f2369c5047f3108a169cd8ea696822a0e10098c30c3a85f4e8b4cfa839fde0d50e0c0282fa7a68e311b75b1243c179621b80c319e65043bfde3c51a6c9313e6624ec89eb2b1c02e3d3ff14b293db54761e89753224b3ce2f12f098ea978cc30ce35b80c467fc62775a82e021b0e39fe122a4b691428b6c433d0935e0988eebd1740a626b89ce4d742fa3050e59ae1204d0408a2da82c7bf3df4b3f1671b749e4fb2238aefd96520a83bbb3e6b417bc8521933b9a2e00a3d70c76480b82e17a7db734efd33fb7e7b4ef86cef756e50dd0400efc5c31bc428bed43b860952117eb114e69a780a7a01dae6c25b63a199bdd8f0a6d4916ca7cec6bfd48fe1b8ba4ed36b242ce7674be3ee28ec90c331e0f554d80d627c4c26c3871c5f572d2d33352f09fc4e2a3436fa1358f95658152a8f07f06ac9f6f810495ee723029c413c7c6f9e9b55deb65038e42b1561f78ac1599ae05d0aca3ed35704f52b08721bb96d08d40c3466e23680411a5c75a32da4af17e41f895781d729fb6431114d2d1bd2ba8ddd2dc10b2d1bcf5dfc1b4fc91bb97e7a82f316207d6ae4b807fc31b22ee6a60e3df9741ea9a2a83764ebb5e1fd634367712ebfd339d3aca51eac092298a60e40d1791121e0b4578a1366b0db12c9420b7d842df7de327e731690c410c29fd803ce8d68a7492406c3290a1b2717bd110a5489c3dc09fb41f98b060618fd976cad6508cb6e6b91127caf8480414f90000e19f28b73fe8f39e451e4e9b6f223470fdc0b28acbe0624dd23b1f6c3555178ff5b22a3a15785635d14e0a21bf52e1bda4f82a6c5b9548124e24ea68f80d6d567c0edaad3839af7548fb9a14af420303c891558739dc83d596f8177ce11e8890d306ed078a7d987f49b517f0b4be395296865222520a594033416bda513baa7fa4fdf4a494a732ad99545217b9805c2b0362d10da41c5b37fc7047a0d78bd15a64171b5bb7d264546c5452e13fa8336628202fc478703cd56d28b21a0e5887402f0a8077c3d0e1bcc1c55d2f4799ed773edc357ae9d09fc3e022dd081cd5a61e5090508655e60633e1cca7d393a32ae9f57322265faed1214201840f1fbcc1526a78fa59ccd26d241fb4ed209e21381776ac98df31a4cee8a1a732e185334fb0f71890df065111a690e4ec85213cebed94c5f494d11ad3aab85ef45b7a48c656e03efc33e592d4c61ccde629f1c6a5e451e8a4e147eb58a237f8138db74ddb437e3968cb312511e27ea0445c327e68bb1aa872cf5a29089314dea7b175f2695bdf35a4603e34e68f98a413d8faa05487338191960b5e05932f5b3da4802012723b45521fc1ffad7574714b1d85ef5eb60aa1f8f48b46dd26ba8796e04a8fce3f665505f85bba1753504ea05bb3648319fdcfb764578aa354991811885df4219da17e4a409aa4d2d9d4a0d97961bbc5e5622cc12894c3f24e9ccb6a9b1545add8a788df433712811f2f85129611767204c9fe27b38cd71ee149e32cc77b72b8321d54c9464fc23b93c017966f3f04cb1c344a793274e5cdd0d1747ef5cee327c8e08cd0e2bea3069026ee56006d63f8a7dffe7344b3a12bc547b193018a16285ec6578f6d2a712bbc619fc550c523d718d78daa9e0bee2f87da13299a4d0f7ad664ca651e0e5710849b2f8278ff6c09ba0c62ad0d8e46859f2a0e3ee97984a1a411488ebbaf719769e5a30bcc88890461fb547db523e1ad21b4b8a9bedac0e79875529a51483c04201aef49e371329aa3c5995e95d8196402031ec4bc9a676db9428bc0911af56e1b749731f0281e208ab102a523f3adf8344478a0076924f70cf0b7da1f14de07f0fe13f2fb1cd3bd2bb9086138af73e4b148e0f9356c50aae224378d44ef8a8248933b16973eaf173e243def491369ecc88c922e2abed5768f56c543b16c2cae2c622b8aa2ee732ed282ae30202c227cb621a4e283eec435685fa0b9fad2e6764da29e9ccd125d0a1d6787250092a8c18b8c91680e97f078fc71ca2041abb4c53c731194be4ba73fac1919dd805810ee70c5845b8741688c94ee3646053058fa2ed26488a01df29d3e8546d690d117ee608f91a560b4af10427f245e77c0f7485a53f692628456251c34dd4b21ac871ed9577474a6dd5716ba82d76ce5205e6323b7df0ec6087e74498d1bc86c8d71438bc18f2e4565c2120fa12620a445472fbd5aa736a6d561fb10c315311b8eaa28a4382c5cdd0c15f44cad8d27e2a29049b9eb46c0173b074ff215d2e76dd63a76a358cc54d351b18e5ad934b09ccc8b6b0608523812424666a74d6230eed86e33d5e2d12e49032559c888802941ed516cf3295d632926f2e219513a42523cc773bd1e71da8a0edb513f5b20167b0f66f39410928a767a5426d9ae0c48692fc5176ed18aa4ef19d9796f1032d38b2935a6251008aaddd9bd0da76eb6c1988a2a87b88dc411b36e1feb293353ed104397b4600a381ec8bff850b9c80163e2a36002ccadb351bd8e65fc64938bd47be8bde92186cc3e5e60021440a877614ff128529716e5299fe4368065928ae506fd0e6082cb260cd0d3c59d648b8914fc73b86198e8a5f66b8867990f7ea2ff6f1dc0a2d989d804d7d5db55209fd0b23e25c9fe66e48eb729ac14a587b3972de2e77c40e745f7a8f889eabb6865992f917ac98872090e04a37540edf870a22a1a93384419eaabdc479e3602c955c4162edb5b5dc1cbd6f23955e3d6a45db78b1cc71d5f7cc345fa1284b24af1e816ec67353ebb3164771900b02fb508c0bffba75f7272970c574bd825cde84a98156295188e80c7d234dc2850dfaaf29a1c1c593d3687f8150d235953c2f00c33309578d994fc68a2fb011665667eb84e88f761f62d5e0162b2393258906acc94de0ce6a94e227ec271d616b56b53dbb9b6dca5ae2688735909b6c48d31d6a7c6de2173c3b9c109e7809fad5231357eb9c13dd8b61fbbd5d530e547dcec7f0b064512503b69269510fa2629c3c13e10871d8c952f69a471a97247291aa643044fa27b8c626dae3af9db0d90e7c66916f95529d724bfb799b7a9159a40a8a4a130658d2f5428770ddbc58e3214a081d876bc9268b101b763b9085d08a4025732119f578d4d8a2f08f237ec1c573c453061179858f871324046dd6cea284c0edc2194052201ac4a91a28ddc6b46791a11201f571bb00c20c9974dc279d352cae59964be24a1bcfd865ca2666daa221e938c6094ea260a404a60053c1d2c063689390a6e43df96d5e1323f5b90277b930cc63385dd823165c3845bb16ad025734e422da37798800da76b98291d1102903893c2ab0f2c3a61ae9cce3b9ceded62cb2fc710e113ca4713310d4d798b78583c27a209f9f34f7c3e151763a7028cadd8d05d8f869f0d04ae9920bed63966a0ae56f25678ce856c60c0c04986c68c09a5c0b71d57ecfe5a95f9e0107083ab3091a675361200a5d2ccfc58d2ad8fd83d22a75849ae51395d67a0b260bc378af2e37e54a1d4787e8dd2f072ff83b33725b0747547535be1dd4dcb1a33c2b4f48f131cc447c05f075332ffef8a22b0a9985fd627896507a39a6473dd4b365c9c7800dca8507c7dfb5f82624f79e5a99edcf76b3a67b77bac2d0fbd30a73a235f222a0b223b845baa3a58196974d68ba2306e55b5184d12be4f4b41407dbcc9cfc5dc2e4a92bd3c13dfaa71233d30670f4ff27c887e975f5246d53486c4466c0fd5322a1e4a2b43e01d27660a93e1bbf7bd0ba9537fddc55b40ef0498221b7e0e82667c0e9929150821f8e1dcf58b431640e2e19836c43f388f01805666f6c52f650acbd44a93e0822ea0942160821bf18805c3e4bc88b56a133288e15c79beeb94078d01b3e4da513c7c4946181868e4bfb72d896a93565de8775fae3d4daf1197702014460f76afc68dc63a4eddbb47ee94dbbf3c510a51e65b2bae82a71025fb2840e7feaa97bc7468972004f1412c269aaf310861764260e5ef142a21cefb7e25835e0dd31c29f6587a3393d703ff6b644600e003fb0bfc6bed9e8bee56b22ba27e8dd0a4cb8dda33ab9747f4f9532e209949abbd55fced9a1c06eab1cbb546c6c531f0cedb466b292bfd4f5419f8f4eed3b35a77740b8bd4261d3d116fc27550695f81cf7f262d1b6cb08f796e9ca98a38dd121fb3d44fc0f7f31f38ed8f10f057e19ec1e54f891b5597d2605b9665e6687c51c211dc5e63971e3cedb78d16d6b235665daa9b577fd3986dae52d09a05e18b9670064c73fe0be16a3562efe975b396815d0a771c4540b68e5178bdba7b85b996659fa0d9f1eeee1b9eeb492562ff17c03dbdcd0989034f79cee8d73a82d4eaf13f7f906e60e5837553f9a8e9b9f4417050d8d16250f58401b602ecad63972b50f9aaee29762a10739a48c610d6be1a217b8a54722c3a7546118aaba7135fc03db5143c5b09ebe3f4869c8aad23c801c6031d2bf1aadec33080687058fd398150a8d862b0c6b2665d3ac0259573a80d991a9609e1934b8842eade04b1270665ee9d26a1481f7b929f889ae1a4c2ebb72c6753bb21ac22e3be4bd0417d152e9f350d42eec6e1b88a526fcf83d2846dcf5591cbedc48a22e808d5cb20aac96bfbbbcf8d940262c0ffad2e600785d9f137598e7879426194ba7e7aabfd4b98202909e83e884354289a8418b05a8644fee456b5146849086ba99648ab72f369639d940fdbe83decb05ad506690ef480304a287466e0256ef22789cc885953cd4a8c38ffffbe6c85055f81295ed331e701216e09ecc7159855d0081d910529014ff10439bdec971642c3f968c704cf614d8f6db4735e234321069d3d5abd3427b880b3548f0a01a30220d19e1fed01205ca9310c36f2d518149becf5b45d6c64f17d2279a6af38a774e0b74894291d37f571847443dfbfaaa3a1aff2fa8693a665220e93fb070f89dc479ed3ad2ea41e678d44e96be25598b0a68f091c834db0cc0b65024f9201fb20bcffd13cc97030d5fa9c1069ada2bb1de7a53a9e9a321cd6249a9a326d1400876ad166f6705e1b3c6c01103d4aeabb9d1fe913009e453867b26805bb9f9519883662314bb41794dee0264c3c559383c9e40e5ab5f4bbb3cdc2ba3ab5cd7373256b1d6b1b8eba618f315f7b8ec3599268f02b63cf3a970e310e597c4dd226e55ccc580c34d9e519fc98eea35b257e06cbd40946f7a12f964c6e4de800b39107432bc55e381ab3f1ed3e4b03cb8a60f14e3b0f6050e88e88228f11daad22d49d027a364c4e9438b6e0a8eeda81223778575c3219d56fb9a1175c6671a5a74ece960378b2dc8536317a27507c4f204ba15d33a5fc9972f6f4a7262a1ff5b00473a3c3a12d0838dba2c5143a908118b97723b0031a32a0c530cfd38f31301c2ca52e32dd3cab01909cf4f69d59f2853a94c9f6f5b3c0285bfa0d5782f927ddd7e062dbca840f8709baf3720cb216e813ae2a0262f9bf3dae900aaac3e11a0073ad86b51a7019eaabb5f3fbe3059e5bd3efae4171e0063f1024087a6646cdedb039ee1f4c74c6d02070185bcc3c3ed000e2edcb1b545d8bbebb77967533c6a3bbeb98078a1b3c6f1129212c7aaf2fc4be795ff47cea018e8e6e583c9037cd2d455e1bc12d0023987a36636602d816d409b4c2882ddc3276d2c9f895b720704e0ada756291117d51a89e9dca63d89022a089ecec771f1bc3e5710bbca6755044f63b3f1feb21a9844f9e108256dd15fd59c9255c5ddd5c115734eaad4b0949572a5fbe7125bc3e8db6c8a5458f08625e6941ecd4c4a9c6663a0143381d30dfac3e642dd86e852badfec1cc3cf04c682b1d2a33c34100b42e8a6d7f56611e906c553a8caebc5348eec50dcfecb3473c8ae9ba498793e10d3bbacb473353e503e7dd06e3e2a0ce55fcb39d24d45c82a6b78d1ccf3bda398c78c2bad255edf7d99ab3432e6693cd0291c73967088a8a90f7ec0d16cbfac1fc322d16a3c5374f99ff314992a898a146f01ee745144eb106db4731515c9a48041ba97887e5cb46132c708b898dfc9de5e5b1b98003a2f8257750b8bd4618f090da7b71ed4d150cc6fe5e8a8897d6ea862cc063224e1b606efb87b4407741773c256bc36a1577e1ed2b9883948d8d52f6f862a826cb5427dc31b105fabab9f5549bb8f6d453882eaa5f5d5b40c7e88b4292869f079b862918fd7cf7b9c80b046322b9dcc9e8fb706e3c5f80369209929cd3f794202b415e848fcfbd7d4e09ed2d244fd3740b940024be85e9b15d877ff10f9feba9ab30c0d11ab6c210099d112b8835c501076083d7edcc18e480014338f63ecc267b164817dc24d599876a3f830c39dbcf8e64b2629b599387cdf849d981e94e829c262d7340daf87549e34221479c12aa8e19156370ff9035436c98df2cd85e17fd4743fe415829d811b3637d19b5d9ca3de40dfce50ad05b88c7452ac4b77438ed319f0c818751afd2405d6cf6e43c13c895e2210fa8898572315de613d1c79da73dc03fcf141af251a2dfb7f2c711cb56ae23abb9f00b5630a11ce8b493700335de8c8597aecede951db1cd5bd2a070ef2f4935ecd786cab008c924ecbda88382e3461e50f9af811f3c903f300d2be64ebaff2e9acae50dab97a328ba0f11b135c639d14ab589ecb63135d7f0c4eae06cfcf0bef177493484b469169869c966dadc48e10c2570236335291b21ee02e153ce2ea83e355e20c4024026ccab570dcd60b42eea59e5789043445909aa921be52fe7f8c2a2d07a47347e0197babf87332a2dfe3e64147b7a11490495446f288fa1858c89516cb001732fb4af81f9f574cb0591189f5f986ea388c25b136c4701e0335097b71b684803855d68b0a52c48914e3c2eff5973c0439c9e8da3ba93dc595013403bc9b5512023d5fb12ba0063b6a0674de8409ddc771392fa1bd814bd33b8e751869070031c34d3d2473cd92c0558cf13834af002b7762aa628bf13ba43fdd2dfde0b812b49615285e6bf46b65dd0205b107c826cc4108a922c6286a5a52ec8d1a05fd9618040d945d9a577e51b9cbe1a6d8d826fa80a099996af6487b5a3fd122765de58f99848adf35134873576e8cdae0d636ff763ea2c57051474f3700c87b77080c1c3f4ec85d3a0086c8f6580e9f1c42142000d92ec183f28cd99ccdafe72cf487bc6de56ef6a0181622caa62f2691902970f6f7a1271ee1f2c1a4348110490bf104db09015bf7fbb51551b0f1eaaa4beb0d7840f7e773ef41518300710f67b3b097c5628e958c5043f2ac1de5ccaea574a949349735048fed4401c93d21cc85e25f92154ced883189aaac3c35bca246fc1d73fa54496377b76baae78908921c75e0c96a3f4b76432e31f56bb063b16bc3986706c6a12e54d30306d96718f80068adb6889c814d0342b3c59c8d74c08f821682c5e6f758e94fab84d2846eecdb5d5c87f2a569f19bc0969a168fd9b16fbb8b4421f19b084075e749b1f59cbb0516d4eb14f2dfe3630dc6cdf02dad7808bb1c5b743903a0f52f0c6059d79882ee0128574d1b4411e8282c2d8ed7a4a6e4cd5e91903515a68a31ac72b8fc0f90f7b80722b518c60fa3092fe02be0a13dca05cc8c9da408b1fd0ec2c234ecde3a015773ca3ec7281041a52c8464adc661af8168e0c25cd13d6d11f34888a6d1c5b1687fc9abcccc523f0761451589f7e88eaf8e890ae98dbb4240d8568c95a0dc74e7d9b37c6643acc4f1b07e7b414f040e263336b82d19a400cc283227ffef2d0a78b0798e2b4fac04ddaf2f65ae45fdd8eaae9fd625d148ee2cb8a962f37fb90dbe9803b5bdda309dc17526dc6d00dd0a9adb3f82b8da312cb041110e43ee78bbef9da126ffeb5ea7ab90d093048cd22374a037724bf1155bdee006d0cf5fe2cf1cb99850c7dacfeb76a3f20b8b4dc6264f77505dbc6c1065239a8e4052f9051614476db56e496be0593aa3065b26313a399be4fd7b9dc9d0e3464159fb25c43ea66ea4de67217018da8e1feed7bf499425446e320939a933a0e737b9b0baa76b51dd28197c888408d762ac60530fb1d739b0132c2f340825ad7cbc3278b333931bb1dc8a7d9cce2cb041a5e1e989daf07a5869774e865b6bbcc73f544a4cbcec8c999e29be6f1acc9d360ab8cde5609209812a071ae80ed3522c31429e1c39b04262f426b68c73e750a20e11367547a0d59c0dee9c16f77903ef469660494f8caa125924aca31186711d611559644746166bf89a220094be72f8630e31e5aa760128b94faf99f157c23972897567b202a12422394680198eccf7452046fc2ba821fbd78a86017e0b62102e1a227a8c6ea72239c3d996d78bf48465da23e4f4b9d568efe6d22ebdb0f16b04a39735e3b0a5fdff2af0ccb6a91fdc6db42a59ad047d603348b5214afb2bdcc2f19006c1861dac97c24d61ccffdde449a6c20ccc106e9ed50b96f386e0d32846e922ae8106563740a1c8070a613768995a178eaa926671150094b937945588a726c2275b8076c9c9bb139a90f77512ffac2b277b25d0209305d58a75387480f5f13f7f13dea66823822aff33de86a0fca5c38543f553fe96bccdfd0021acf0b2bb0e37db9d168b1e49eb533ef76dddeddaf06e8f93cbb846a35db5524e68c88ab403b3df0422ed8e9aa8794173d8c16af7b0fc291712d3d641a57d6ec87152639d6d5311023b19c125e29777feb358a89fbec86c262ab804965a124d0f2a76de25c9f06d6b4d759402323d739456b7ec58345aba8d6b5d49887e93ef25cd1c3425b34db297e41fdfcab77686c37484737a51a2a0f97d4a6b4707392371140367d1a4724762352e054d12ebe8794e7f86ac70bc90d8e720612de7f048b61b57fcc4399b6947022b1aaeaf5f36aed95b56ecea6598c21b545f0ebf992e763fc3392c31313b10afe2fdbe4c63c38646dc5eba64becf0bbe70daff6c65d316acbaa53ad54604668480ef9ae218b7a4c5f336b254b784fb791c60928553828cb39e4041d3d30b202deefea2a8d8b37aa06a746915f4bcda653520d963aa50ecc7eb89273ea36a9af19ef1a4d94cd8009141390105db30417df260a213fe185ee8b6cea18ac9350f4ed2448b0c3e900a01f33e4ea7b8cafcefc7f45f7cf58fa07f0b7789c5cbff10eefff6f224e2b5c6f430335b88c5f57215acbd7cc9f6acd08962e80b9830c612fa7a1bed5a3fce3358869ecd6b7d2c692eb405bcf4f8450e8810f3341242d93706eca851a206ad5385735e8156a20270af44e10e6ff4c6ca4acecd767bafafd0a7e08ed46a2ff8f7dc83b8835af4ecf30075bd984101373c220995b6009fdb909ee0ac92aeb762bc9d250ec458f82916c62d854ec087eb48e47b5ae0613500eaa2a32d4928f8d4411001042086950f0f9664434f086da76b928b4e51d0a9706e287dff8871f458381a78cdebc0bc41675132f0a8fb4b9ee58f014233024f21422833e2447437926bf7c3ba0017de90bb03439f3ba4a5ae0c544f1e4d316b1352ecfa8744cfa12971602f93880c1c09f96768d9fd4c26f6eb8683f55094af7af1c71884f8704bfcecffd3f32dec8e0d6644d92f42b47c0519782add9cab157598e408e72bd8dfcb6f54e22be273ae42677ce06aaf200bd80b5988e7feec4a09019539f3c77a2be3b77904b9d65a939316e7432ea7a5007016be3e2b95a045f34922aad445d1d0dba2bb3dc0edf060d3121857b89f5c3e6c8fa484a892ba1eb30af740baccb28a8396261d5e4805b005def94a346bc3b6bd1ac4969a61d0279ed2e98743e8cf6e6ee786da7b3599ad5bb55872fcd566c1826d59a387d61161a08ea39a78d4eb268df188471e4bc97508597c5ee9010151639405f6092a6a2a36bbd70c254400216fa6b10167c6c4a46967e2b84dd05f543232e281a5af55cce511f0d9e0476b9efc6c9dd7e971cacef2af6389d58a61aeda27891d694cab497a744efa6b18c46bfd0f67ab1987923d26051d45264a1ba70bfecc1d5e9a1ca2fc1e9e38d88d6806f2fa14b34a523f6aae1ef6dbd22726001f33ca3217989be8954fb0590a5c71a1940cb991e15540a1a067ef4cf30fdbdb2885ced6ee70b8c2884b82694924c9da6e79ca2cd48cd6193c8d0a40c0c2fe98e7c6dda1511d28e9e4da7447afe149e63324ea2db3cca0dea012d75ad9d4e41afdecb0546064d3695910536dab53c8158aa941fad252b02b4500ded8f69a8a4579fd426208fb3a2e2872990475848b1e61fabd22415d0c9621fc22fe0d8e5d47df44822169e32562058aca47d6d955571c9533df0a478aa8407846930da7ebe147793181e3ccda8c105d386a7c43b78b375912daa9cf095278bfd1d44b7990434908ca3137d3f29f2312d2cdc798098fa039776c8e8b8af89ce481452c1b3587fd2cf1f70f0c0b532747cdd0dd473445dfde342ab91b471f0ae15e2b2651a853bf1e64c64ed7fe8609f99302287e7298be172dd76128259dbce4a885ba58ac5729f2706bafd38cc16c8394801a5e0cdb654298689039ddcb986621d0cc93eb1565d8db203395e38856377d8b6bebc40d9f6bf32535a4825d37379b7508e1c82a351c97b74d6bcfb54c89e4b24e684737b2745cb237f15677826e34c83e4955e293dc52bbd6ebd52d5b719d2ffebf4b9eedac31bd1d513eabc1d6777598288d04901e9b95daf682b6d12bca76676ef351801e1752b0a90858181869fd939a08a4a2f3bc8e4c02dc92765763e5596d831093cd82f1666655fd43571d98a47d0250b36c994e87d28962ac9690158aa3df3985095eb4f87f37738de93a3db5961065c2b310814ee1608cfee989646fa0222b615f92b259c155eb29233eadf819cf485464b56f871ec99b4ac21065f89638b25eaeda6a4a36a8c552cafa96c63e771a02ecfed8bd0ca06e783cfa9c007cebdad0862202b4252ab23f4a5c85b7bf803f1e1fc19773d777a3903abcebe2fe2dc7b958fa4eddeedc947b0b2c54d2dfad26278a73894899aae3e969a79743788eac13aacfb85b5d1c0628e921623b5f3fb0b8c0c686d4f982c27312e6ce63c5ba1793a36d2e40ac06eba5d2245e5ee8f2b65c80625a205be10b8be0a057cf185507eae9ae679e1c9f4f6b9416c1ae363996f4fea316dc306e65734c708d58141d4aca5a06855b59bafb7d3ddb73cb1d60a42dfd182d6a8a672b47c66d424ef0d899edaa5d6adc3e696bb3630c9c40eb618ea6cca4cd89e882f4b948d9aa2c58527e790561bdf897505584564efd36b65370f89ad05f776ee698ca276f7999f6684144ace066480e9483c3573d920a7580b8d430698fcb3a839fb6bd2a76b5a9c9be5ee334389d9cd95fd9b32092d43f8b4801a6e6fa267429c425586f599f4b8547a2c7424463ccd38d2d93939cad7988999c311d0b5184ee98c6044b525ba55860017793571cea41c3e38cd32217991913567425c24e748093290b8b4ad1c57f53a46cf06bad2b2758d2494fcbc5ec69099da2f2740a0b087c591a1b426294173313bc727e06c7b8c9cada076a301abb94bc91b205c93dc267ae76815871a057437cd0d4d1c99cbc7dc462df15c940654ef101ef77e3f4e58ce72e53a2228a7c9d9eadf77c5914d74b27a3624e11b0031089028b1b549750fdfadd84a41fddfb3cd48da731f52ba240a35985cac05823a4522a8184902a37afcec1524b9d37b04a9883db57fb3693251fc3c3f56c184684530980d6bafe62e7ca1a9a6c3f281beb330c4b1b56a4af069b89d026804be080c6ae51eb09231aeeaa4b5de80655efc68f39c087a09079e7a6ccd2d2ce861d067418bbde71420a363e6bef36de7f6b543825107289d04801cf8e7bf15cef9ed348c1aefebca861fbe42e2728785473e811a81b9f361e27a7b71e5cbfd9bc7b0120cd99bf79043bc62c1ea488849b14a3f0ac904e768f548996931a23faf8a663a49d8f2285103b150d43e9db21866bd02aef1297af1f86bcb1b13a4d3da4ab957ef2f6f3e4ea096571606a9d3fa10a0b882f11ca309d75faf141df9dca7b8573f631cb29bb3613788c3c2c6f8858f9d7f5345b9ddc83f90311e3950280279bc8f9d8f9454776ec3bfa580f46cb3501c63ade84fe795a01fde57b1f750ceb8f260b2f552a1ba9dd14a3d65d48fff1bd70dcff8ffa7bb52eb293d26e6bba19e151bae7d0d6674ae2e7ec1dd3635df325238f56051e7caac8f6b0837e6cb1de0263169cf3d78dd90bd0d2a81686f68a140304107c85600c1a0f6afd216d83d8090c88a4f3748464a2f130061d44262c790094b971812677e03c6b123c06a677be7df81e0903b1189f5b986f9afd26ed75a5de7c7406e14c8ec3728a9ff18846ae535761f3fcae0496d91eb028f0115a7caba80f0dd498c7d6a0ec1e6f68e8d5cc1a1df90736617d1334cb08e338449404260dbc3205220a4cce9dbfa01e26e783cdc50614b7ae32d6c76d6d60afb554de1f571b1c9e394b36df722bcc956dc40f56949f8e1145b2bebf7013d521a6228066596b0b1b7a9a3a6f31d2d68d045b2f0db5f6e317201ecba77c6f2bdbb227898212fce70b07c27bf8797b9919979057d1bb269e2982c218b4fa38db41790fda8531e2a926c69e430e9649e0df1fbc050ed2393b6c0a97094b9855748f1a95178c7f3cccadd073471185799c19537bda24820a2bb8a7c5527c78e8589714a936147a95248f22cb0c827ca5d872ef9c4e2540404b0e519b3298c06140f5d244b525b02b9b3f40d7f539c6d95306c8bfd7643430902173616691b546a98c9a3a6b3d59dacc1bd5dcc79e758cb123ca969d12ccfe736743706bf50a503b84fb6ae3d1c3e137465c34673b2b131564c2a3ad92779b9c26c2bab110a8acbbc41621d6755ca159a83f61d8984693c2017dbeff985dff57d0ac02048e765e22ae13db40310c2fc4782e3e9311a9e834cd8da08c27346a8dbf28ebefbe0a6b8ea320e58b7e8f8499294faa7ceb5f727acf0073a5880fd20e55eda7e4d49a1dac6e49892b48de4421f6d0cf441350f6f6ac3ced7240e1f5add7c6f35e09115246891bfe01ca637924e4382eab0cb15cf1951dc272d855cf1525d0feb908bde4770ccabad348b25e9e93b1efc70b5849d9f63367a9219381640b34d07b0e8d8c9fb0a63a426964a984098c2900993ac61fdc9f8c294722f99c27ab19bcf0b09125e7b54ea5615c83abbc57633a0a5cd519196696ae2553c5df7b68690734b36a57b32ddb82e4567e53bee45cca60771c35708be21c1d687270c9ca21c6ec2211b61db0ca50515602b67173f6e8b76b7bd17be80003f92bc8394fc71ff8a8fbab003610efa9251d25e4db45163df61ed063b3c21a926e998220039e49b31520a55c024824f79ad22aebe8d704a35710177de7d27e49cf76e08dbb75ec0c29f0cbe0fa7dc6a2d0a99bb33d0a6e4831563adf8c353076ad0c43c9108bcd980927e4993d07d3fa8ce1909e2326718f48e5bb033002783c18d4e094445c436e8ac0e42419d0a38201f12238f7a83761952a7859d2d173ede5f2eb870f58cc958b0f9b2eafe329f336a2f9f973697f4976e0cf845aae90dc91f31af96d746b920eb2c4c445475a28a2a7e4e3280e7d62a911c7866d13c24e4020c496c49791c15d1dbdf0d573dbea8dbddb52da9ab4df0629d88accb8ef1c523852ae27e8250c6289d676de7a07139b7508e711efa602398e42c8d8222081578887d0b0c0e3183f290ffa2ecb1e74f6140352a6ff51bd643699b07d3782b16ded4df4cb2dada6e5957a2d3803dd756e5552f56fa1b1415c8d64c5b5f203ba6495bc6aaa2c108fd8ecb8592a5f4b02e0b1b7ddc9ec656d18f6753ad8d526a350561ea71f9894b999079ddd6eacce31ce25188c76df09c63f208e2e67668099b9175b347c22a3142cba39a9aebad31d2802c805ed512aa7849b6840b29cca9c0b09bc4ee67aefe2f68b8835fa1aa814e1236006b30061ce90346497358bdf4bbe481dcd0ab1e0e1237d64571ca03a6c07640c6986f0088010d02c7ff5483c74871d8530ee87e92da447dc103fd9a159db04b8a4813d82fd05c06b1562b6f926bc826623683644e3d1904a4079b104727692a3f173e0d01f72970211e572126ba3a7402d7286fcc83ea7a9cfb574ddb0cfcca97001c809f07bff9460acb24c6ecbfe984ecf4d9176c770900be13dd18cb2cfa04df77015c078ef9fc5b38d52312e1da3fd6e661884a904e09271f8912c005820b78d23fa6604c00a78ee2c3aa5e09450918e9e8ca54aac0f86a9a8c9cc66ce0cb93170506a286552e026c1ed214e4bc09b85543a870209b8f7c08b8b0ea1605f88790d20a48ee4474fa306cc7edb8093ab359956de1e30c2c9ccab2c09cb55c8d5d390b110c948f9d2521cc4de0312b0cc931f94fc676b7b7d74d2aa30b3d0904972c5a54957860fb5c24203205ec2ccc945480162f112ec313d4515399a191b38e4532cd7408a8964334a6091958c92c39cc52f56033bbfa910655be33b62b1018a3252010a210a1df2f90385e1b396072c1f65c7921272c5bacbc6e97b0579f1dc570ea2471d2f04d7df1ae87bb3ab9094e70e6cc4bd04d43321895824869690555dca0af24b795578c0272b0d89f3580b709b0e970138c808bec3a89993275ffae602963df2dbdd3bf922bd2714c0411be2458bbda19b14ad2f9534222163d6871dfac045f1819f657b29b6118a7d0a2e4c8f990bccd8cfb917166eafdaa29250b6fbd793ffa84a8ea04da760930892ce9bc1890263122dc0ce54f4f479e44538530a78764d4e860ced618ffaeb376703065739df50c13dcdeafe9385e6cc6318be12eebe9289b6171a5e766bdf7ed52072f7a051f4c5b9a72a0dd3f41dffc1bc468b20913b02c6ca01d6740a9b332d0fd818715d864cb7fe7611b1eed421c1233f8dcae2698da5330623e67e058cce10db5af80909d60ecc373109b04eb0076de91fffe70c62d4c6a1a7487532dfa7229e3df70e348e7dd67ce3ef88d0f2b60293ffd08d98c7b9e947b62fa52986d12a36b115c607505e98646174fdcc704372a56ebef8867e9935b8ee0ba085a6ab63c2810c6a2301f0e8d22ead862adaa996b454e0391b9905e80a2f1bb50c626e4bde24f08fa57d4aeda7c92b0120b760fccc564ede44d445ef423f9321da252d9e7df75335388ab9dbc1f94c4e4910221c30b176290969cf29991c551db94bb29e482d5582cd1d9435a400e803c11e7cdcbf75f1dd954d2b8dde32ade676804e8ce4bd96b48a04ee93abc12afb01046467d0ef4c9bffed332c51ad66820c1ce0a31066a123e0d37998ca95173dc5ac866baf0242eb2e11a3197928dd0b9d93d14b99a9e78ce507677088e44b6ffa1717cb2487ec683ce61820367248f015736872230d2de90cb9ad5a7e78ceee7b321321753bfeb643b405164f1563bb3cf4eaf6c05801db518c0977f54b6530acafbf86f9a37cf213af9327aff7b074f0e6cc986cb00a00647e20268224f9fb74e3ee84e1f3aba9aa551aee9fda88f904fee917b5f6e0e46857da7ea08ed1504c8d6b87234d2b8e085b4aaa07b88660349ae1ce844c4a5e722c311184beb387a09f5007a048e11cf0f9a9a791663e9c2b91bcc35fbb79ac456bd7d5cb0ff22fc584c71bbb72e07ac0024b8c18319ccd7d33d71f2c482f6df2221fe2185ba847eaeb0c23105ae3315e3136d9ed1cbbb578773086d54183243bd43f40a0b3a9049b457f1463565def93fc9c7cceebe28432f18e033906b50d3fd878cc51a137192fa604a08908a4dce6312ce31aa398a93139ff6b65fb1a36e3316456ac22ed44ae0141af0e2f17952aa51619319b3d3c5e4b50da0e86bc870a4b8eda4709ea7d89a8a06aef183bd4e511f90804c94803d5306de063f5190565aec3d952a1a307a3a77a18ac1211a8dcf0820b76feb6ed48e8b41259987feeed8218dd42abc819001d2840d15c5f5c71be18161c62edbdf48cb75e27ba0d15cdc7a26eaf50028ef27432cda4661f60b29bddc500b446f6f2b94b4ea5b5957fd75eb43bdd73e2e49025b3e1a7e24305b744d3149c6ad2db02585e8286af5de863fda9ec07feea88e06ca6b2929fe80a7a02d454bdfeb947ec0d6e3548c23452a0cd22ed483638e920b985834ef19a4a289e03f89534e0a39fdd4e6966a551cba498e5a5e879cbc6622db00bdcdd21cfd7d63bf4b52e8e56b4d94aa83e3874db5caa90f8ef683508d47ff6eb5c9e65dda20fa9bcdb8225619bf1165cf4e5956e94602cdf6127ce281657527ac4276febfe7de1202adef335f03fdd88c5186f957a71f06c57c0c8ddfd2ac7047655cb4a296229d43a4ca67a00fe9f6c3e67357d4e5e00c9a6f67fc4515fcc9facfbeb32d664a6e1c44b5dd41e8eac01019e77cd0c7726d4a7f22bc643521edd6d2ae286539c9febab5529500dce01ac489496ae775ad9bcadc51f576a795998f1289c58508bc8182881c1312058f03168806894a832a49089aab3ab76a9ed495da09a66906d2ddcdb884ab1a9d5e5aa9569011ab27806d0981f64111d42899e8663dfa0aed973cf374f13f6f83a55966d00a9034fd621126e3c7b528de7e46c6487f5da393e491de70cd2967dce2b4283783f0560d1e200ff924dca31389ac29e60c68a3670377dff09eb0a83979e73845e657072f83175bdfdcaf130b6fe75b95a83d2477d78c6db9869fd376a145625d88c1e5ce369f38e054e182e750d22c3798680428091f2d7326f71cefee5300882a0e6833ad3c7179779b5bceaa0cb071ed63c7fc55da0e9f09d3ba3ad0ecdb2c68446ee88b239860171517297a06fe3c6fbe1078c0e4fb3c9acf95518895740fcd1b9060d360b09e70be74568919df1c0b497ee02d213b5ead413c39feb2e577097f76234a171dab8a8db494ae71908743c70e58666ff08cb67ac8d2f4cdd93375b2c5dbd426a89180c2d016aac520cc05fa5c4f584df9e75f2cfb9a87094496748ef3149229cfc7772083bb8c4c392d86302db10c2d596d11d4d4143e3f37f5d13f12f9c9ac697543378b7289b2ba4e2477dbe323d1330e0ca852c86bcf0b7aac2ea61fc5a215f4893d7583283d0ff4d4a6e4e2833249b9602f4fa2f8c897a2486d2adb714b424010772d48b6f9062b44002629b9babbbea9aaf0bae4eeb6e0a6dc1d6c36aa6b7015181f08e7743c74baffb5acfa6a8042c221ea0e05aec992ceaf0caaa02c0f3dd7f1614a49cba60c78d8944471b2741482b086325d327d61a34f0fc24567e62a97920f1462502ea00d55246a8216f953085348ca2ebd29660b8562ade02b7082a67b7b455f3682362f489bd38380e919f24b535a9ba245b056d082ced5059ed0f5f72845d4e51b0cf920dd901561d43e4d646a7cc6055308789a6707e15f4893af3a178d1516fdcbd464734777f726e452607e17e9cfdcfe48d1d4e40c0acdf063cc64d2e1ba0f3a12dd15b8120e2b9c65aadd0e2b703558ec0201100bda759392bd8ab5c2141d75f54550d5c58d0995192c8b851e6c5850b3084460f9c9b5ef9bca3da1ed9451d88aa9c8078bcab305394301ee14ebd65385f8277298faaf6b0cc036508482694a615b5c83b994bb87ab22c351ad60f943d5d958462304b6669eb4441312dbf392113f5e7dd2646c15fdba174ad7cd2050b423ffe4f7f4190330565bf6dad739428564c99b3c4570c224661e97b0eaff0597c4234af4cf1100ef4c470ddbd5f8cdf277b1fcee0155a8b53434c90941bb9c754a94b35db90bd2517a1da3d417bfbd68abc5c0696b7b0dee45aee8f2d595d3c104e8bd5f0c390e4c0db1c05140fd2d6b11ec456bc83a800cf54a02e803c40510dea0c67ab6ee889185e0b9b5b087e8e23406ff1511efca8834bea10fbe70156d5982cd7a3e201d6fe513eac81bcffc39c2d34924d52c08cc7d8fd0625c79535c664439ccc8397b03f72f617e9b0b9bc76dc24b957d2790d44cd25b0727fcdb00b13974df5090752f75e776b2799c9682e60771bc4f86ab7555544752f113b9ed828a04f48fb4093e10f8718cd77cd8bfc425d7b66169c9e29ca0c455ec42ac87ef137ebeeafd10604e98199e818ab2fa6cff40ff4ed4716b2e3864f085fb0bb2a01b1ff521aab7b5c28743320858ffdd02cbe8be45c39295ad4553a829f322c98a0e555a9860908474d8aa0803137a75b1d11ec715fe8c954539a2ac77464a01fc9b0b79d715d137e5a48461d889065d506ff90429ac59310c15e7d129eb461f298a91bfbce3296089ad0d643630eaf6e1d4e34bb1f75cb6eeaa202458d0a09de13a9613556ca3ba93f0eca8fc0c29e91ab3993f86783ca02e6529611ce9bf1ab0f295de2ec59341925b595bbb20fae9df717125743d73f6db3497018b5f744bb562ab40d4d555557cce7d5131d1ecafb41bd1ab2e6645490407f496cf89b6a5de488a7d0d34c48d85fb6a93df8f5e23fe6ac8c0b2f92cf3456495f9104876af444878d7f240792579d74966fbe438fbe38fc96a53fdcb6be44237e447cf860a02d90b5afe310631158130d1384978767cc0b39bb2513de02af7b33a9322a3b7edb11fed14e28de4d623a407d7190289283f8817264895d0dcdccf22a45a66d87a4a7423874eb008dbb9261940ee4e149ba44ba82c308afacaa2a302e7024a5b411928534fb05e0b9ca9845e039a6d33fb1c8c56850a980bb48f4594ad57aee4ba881aae5caddaa5eb65b3c221baae07d7cbcdd3f77b032b32b415c5899d8114021a03c142fd01c464f15b68488ee2133fcaddb7b32c747b7a8be181f363bb7b375209840a15e7087de9743caf6e5bfdda31740d50a441b469d212099ccdff6282eba78c65691f84621e2f6097f4f2e443eaeda2a6a06b1dee4dc140c105f07b6469bbf3686e1ee8a917ba34bf40a811726d17a3174fd4d61783626d84121b18f63125aa6a2d515c6dbf6a97d13c694e0c9af3ccc171067097d91d5c9a1d8bde3f007468e1cddda1eae5d35859f15a93718f0e386a4a1c45b93f79df2ee7482633fff874c70a7071026d2732e88fa72faf8e11f69c892cd1ce5446a788b7787164f37d84510292ce028cc08738182bc333e760c001ce8d57814ce8961cc1029940fbf299ef41dcc4d8cd9755711793d43e0948bf3c0e679c2d67ceec11143076604d3f33c8caf6a8bafca0605d89c2e180261a00bf4f7c7246ac93368c9394ee03c353836bcb6178c6b52845108897922fdc5f4f3e5f616c1c073f95f378c46d15774002e48ea700d25ffbe86337370e3a96efc59cd53ca1d6795c29eb03461786de31ba4ae8c19608966c5912303e9e22cc851d3ecee4dfc37b3a00391f7104a77860a01052856debf24ac6978b016ad62276ecc12be35a2ad71a27424c1d7051e37355b09c5c51254744f87eafd9a9d0c2ecfb010399564c6e57a1809502f1d999c257f94fc89331c9bbf8f535f593744432ef86c5b29e25735b6ae638016d7dc85b8b0e8dacbf3bfd99e3bbf79cd27fcc9bdb3ebd5308a2163bf5abddf435630ccfe664d6a6400263588e39f403f2455865c4b9d184854185484ef08c99863a913e08f96b5ee8ac850c4f3d54ad4730cc9d4d4c61f64973fc27a61251522993eb07e51449ce92009a7c38937ab8b4177af37f9a7bb01cbbc0b8582ac09913f0b34a09a6a724ff89a0ff4e455c6d14e9005652dc4abbd1f32822e1feaa8b1041686982d4d38ab4982214e89c7a731eb82c4071667382d1bc0e333e587b534e4ce6bdb26751d47cbfa7a8f08454cc49e26ad5abe5c74babf951aedd859bc42e95e1711de40b36e8abb97753cd0bba51644eb961059c5eb2246dfed23e5a09f9f6ef130590f6259b17e935e075fa34e061c9295c96a8585b089b68fc78191de33d21c77123cd97279b575fe5ce5d4a38273095004054ec092658f0a1e895273f346e9463b635976b1c4d636820090b6f9a513cc2806d54567056fdcbe262b9ea582846fdfbe874be5a8de6c4652abae14378b11ffc85dd6f333f79306e9d34b56ea56768b57e5d70c374a97143f56236d051a58daafa74798a9854c47a9e4031fbed5cf63e290b49f2b2c317961d895d63458e03d42abb24f61f5475ac710c1a5dd0d2525c4fa7f17f14d5639325be01266140a4cb59402d3c7e62f23309d4a948786cf7c305a99aedf8f94ed65ee93c1e90824db082637a6ee4ff256886ff72a8760c991b0d14cd9e338e075865224af78a0984199e2d4205a1cc9773283712f0098315c117025732e4887d206e424a63a0144e753b4577765210dca0afa6b636cff7f997a31e6516c728c2f434039abbd188f1e0992e36dbc5e01047bf01a0ce3ae8b5c60c321a2684e1fd824930e4b75ed9a353d1bf624e674404a82b45157f42eef4131fda4905a69f25d3f5ee907df792d3fe1df36bba606d42d160924aa621f3856822730f6cbe7e4224fae39dab4fdd77916353cc0aa738a31b484d28e0ebc11ea73050065c1dce44c6e484a8ea4e3624a4c61b205fd6846a5cf71030a8bc07e904162634165bdc2bad6b66a5081fa8e945c34072b6d1fa4c73a13fbe9ce2558e33a1648c9a55ccb80bbbe090a489f59e49d0ab7c393766f1a9dc169700a0ea9ac4e6093684ac010975646c184105491738e1602032555329449c7d4aee70151ecc198eba3a05adbf64e94d4a38114526fc9051107fbf2422e861b801e129a87d1739c40787097443c815b684d814395dc740988e022e7b13b8e2e4beac053fad6e123414ddfbca83b425b9b5a26e19ac1c597b0eb8761392a3df9af1c7f786bf83970e82d3f09e438af4d4de891890599565b815a8f281af598d7732b55d0d68622751cf136549c9fa701c60c49abeaee5daf50c99a94fcc8c1ead32d599fd3a94f1968fa9e8bd992477e4089a2745b0811a1dab5844efabbb61c6440ce278dc71a544dc70c4f69687f716adc1d796c1251f51b35fc604e3b18f16a27a2ebe83880645c81a1979b2552244528ffb3da289c41a5b606a91fd72a793a0719290b56630dcd9b4fd65f8dcdb1e3805d067c51712191e51dc4066eba534c3b9e4a253aaef47d26e420e5282735fc8fd0a549ddcb85c56dddb8dcd82c49ff474dcb518f833e3d49c0143f3ee6f4c5468a3f59377b23304cbd9eacdacce522103b0cbb614e0b86799db52917fe129ff3e5a0390e5994bbb3a7ee4212862ac597f51d9f997bd6a55dc4669400833e93b70abc0269fc4d78d2811b86c7cc4551afa1971d4d606937cd27086b57561f9cb26325e141e7824fe6964b86a16613394976b6e405c272243c8cb01c544f5fd47c84429798e5b0a27821b2e777146800398dea9fc6a5fef2d27cdc94f4b99d7042123c1b066a1b0129a9c5bd76ae3ac745d16ee85da9bdc1e98067357cf6a7b256da9ed2e85b28ccb44b675dc9924876657db31d8c773a56ce9279458f7a41c2dcf3107fd375c1d65ced1c44b6fea4cac18061b9b157a0225203c9a99a5ecaa3bcf34dd00f4f2227fb6c942f74b7b10f6eabdb0266378faa4570468943c655ffc36ce3722ecea36e053e7c28f02a5010d7638404362540778ecd5ccc7e09813bc83dd48e9bdc6e4ac88ca58e538a650c0744245519651a51bf0220bab2740c221f637138b9f458b1bf3dc1234b02bb9aa4595b31b4938d881b4fbdfa3727fb7b18420de7302c498293749251f7f18a317d56f4b73345b299a1341135140836097b433f18afe13fac2db0ca6c5952ce53c4f7cdb1e25c0e95474dae379303b4a638c432e4804c4e73edf8515af6997a09236e7d50296e24e4b7b306e6dd2be3733fb37aea8e9377a28761413428cd234e7e7d62297c1020ae2f12b11fdde013b2910d75b129faf9170863f6ad30a8f37713d78ea6fce5d46af32b372b112910312872751e1843ba241b5fa4c15214e6e675e145881ab762ae4d76bb6ece585e16db4028b0495a4c7a16d2b49ff64ebae6cb21db35a0ba9bc9d58044778408c432c04bd8127b6fbf7167e25e80a518dcfc94ce3d6cda671a67fde99cc8ca192f235489fa7a7cf43b5e1e37d18da41dbcd83e6b40f1b6a26fab4e2f566ae6d45ea331797b234cb0919fa81e256d4335811cccf78f85c12c8bffeefc6d113ed73371c597e375699d449d4531180dc7bd97bfdd2eca83aff74d791f6f98862da506d083984fa6ad16763b0e58ef9f7e50cfae2a46e2600bd52f2e3b9f9cda729be0f8b77c271da9957257c55f8b5d6602ad916a3c39ad92e69181a5c984ff8563175e99a5ff65b4e4e7176e9a8d37d391ead520a2ac1afe6f86f3d155effbfae29a6124ebfd3e8d289978a39198806c4f5e220488f79829c954a23a5d8116cb6c1f3a7f968c946474d7ae89c03dc98fad031c001bad3463e1904da13d7c96540ab7f91dbc3fa55d5a51fcb26185899a6e4f1820a4a029deaee63cab9350144041b4bc0ff1f798f3005cdff1666b20ea20a662443164e271cd7f4b8e0878e8be80371dcb61affcbeeee9ac70b75dde28ef8fa0f9334670f78b210c606e2c031cae0690fc1fb35668368bd90df31805a7bf962d08166bd475ddb3d0b8e3982f40fe059bbb92b5c2a13ce214ca7f9e081b61f97ab9f76290a9e5f6952ff28fc74708cec47dc17d238e4ece5fa39ec30d3702a095d62c5697bbf1b16a2896d900cb8cd4da03845e67c169b1be0943632a70a8ba10a59c72274121577f06381c1a942e2d5d3037a598cd77ce452ec9005bfd85004fbde4ef92e3b83d0a3c137b620dd5f1ed42627a6c72182389615145be3005bd6f05712035d26b420e23b30ebf96f7c2b8ff593b915150835b9fb41fb76314e224b714ee391325e7d13e0454bd2101b25d62df3959890ec951416924c7cab4a526f309159ff695cabfafb6c307ba804859548190c9dc3569ad5afd4ee0dabae745122f7cab0d68d9891bf1e56ad88e9d812375882572b483bcfa43c0209531d016401585041a5bd4bf6e7493ede00140e093c0078bec78fbda77dad5409a558299dbc82a4864a95fc8cbd79ba7220d236cf9326d31aeea287a0c14fd37abf00ea929990c84b97b0a3561a51d42585670f56245b54cd39544b415ac7f22b0d54469974f5f0bef8e22a788f7c0daabee88ed228c6370e00eba8d52f39e2e81eef05fccbfa4927d82f9605d5b59fea9a37276e1f5657285d35227893189259253eb155657ccd11098282088515351b81ea5bf58466859c1e548677e7b5950ad63da593a0319f1d3007976ca1f31775f9533d362666f422ce334285e7baf33c887fe777f67900f571d4bc30f47810de6edf23fc6cb95d08d3689f6472684cf8d9142d510999d62e743e50d053dc228e0a71f995285086e221900f3af0574978a969a1c816fb77960400af781a8189bab0c7b3a1d3dd94f7b72f03ace29a8f7a1d5d5e8021ce4c9a0bda80d474af5febb981db571e0bdde13aa3ff5921a63ff1d6d565be3cf6883b6a88dc6880831c6141f12e654c0fc53408b1ec459bbd1b3a3079d937bac3b4acacdf7c96939e979862892d4264bf287659593f9f3285a2c585dfd92a5480934efcb8f0b32171e059e1e316fda13c4248efb6e8df384f572cf0e01dbcaaeb0aa3be46af58fe06cb4f67f9a30b38cfcf1e10e7fa29a705b7feadbcd2fe921a2088c637aad3c1f211dca78afcc86ffc2b2ad08d040fa75a82b3721a454f6c95eb6fa2f34b7663b1c1a73e5c05de62a23e74e9e0adb91a5c920144a81e0d31b28c93083f3cec7360016a7c15eb50d53873e6f3b5e8983d50af3ee5fbcbb24fc1c351fa8193111559fb3525d75f9650de951b13784ee0d06bd8485842ff9b79b2625343c451e700597422f2122f1c90a94fe04eb758598fe6a885b4f695e57ba909ae73cec804d984f3a9e3902cb81e5d1feed178ce03cbe7fe3e8a314d7fd6148fef5f5e33c88dd4ca3d7b9b8929f0f7f72f3de0ebdf1ebfffa98fc7fbc5c6b04c98fab81bf15305e205d9db51745979915e6b5f05b4bdf613a7a63b7a700fd53663a35370bfa030cfa7a68078834001bc667159ea9ca07ef09e960c3ff9db80e38102381814c9144ca20c0bf7bc23ea5cebf0a28a3adc65a4a431ca518b2ece70a09dcc8e458b161f9a6c7793d6fa6ec7809219917891228ebb9b0de49b44ddbd66604b666422053fbf9bae3f2c51e4ccf8a28352d5013cc1ebf0e94d54ab6416a1e4e360adced29f73197a924cae1202c421461c3b3220bcb194240fdc42d3987447086399ba784e732ec9143e09b8113cdb777ec2b9cd8328aaa3ce09326ef21393d08661bd7ab0a869a4177cb3dc9c2c7aaec24a01306aff2e8a394cec601008abc55c0ca617f721288802d8bd8cbb7179a6cfc1789310dc50e3fb42c12e8ae37269037e0974e72df4c0569f7f51a54716e9264dc8ebeca679ca336afc38e717c8aee094c8c18bc3191818b4a606f4fc0c887a2d7c198b9f182508365d00fa569a123f97a35f51bac81d8b040b1082adbcf56044cffad857513c465eaefecf42eaa715ec60ad40a8285b21e843978132451bd1dfe70b042dc82a47c614b465fd60656944f5bcc692eddcc150703c585e5cc030512a96949afebf99d54fa93b0f127df19030340bd5f7c98e79d86d74f7939734023110b4557dc122d4355ddf787f1e9603d8a6b39ea2aec8be07b36eb3cfb17e8bb68e8fc4d5f8d0151c724de61dd56619c11ee632740cc6e91d00a132c38881fb7d5eeccd7c491f500432b267ff8104ca0d87c08f3b3c5337eacd71568a04f423118e81b2e4770a8c206772867207de65cc294cd0c92ed7f3a23b6a468f93ed03862cf1ce7382ad4bf56a105622f1e5a45076fc96407871ee5b5d4c25e1529d03a322fafd5b70a312d9bf8d9edf2d589b6de2c10eff25acd788f9df2bbeb864ef978a75409e2f14d80dad739b67ec0a4b9102aa319e70d9513d2717b12d539980e04cc2889173a5257e62795979ec43d53d832b122974744895235bbe3b7b6718c9f74c61274a4895b06e74685b8193bee67fd7bd2b6250f13b3f2ee8d9e2b8bc4b3833a1870dc007608200bbcc21e3101e362414177ef0b7e5a0f213e096680b7d5303d051e94d599d9d1d550b192f5b74aec258306a9346b565e310cd0b46514773958e737e00cd340e30dbc42e5de6b6173711ddb2c3bd69d17faaca8a6ca59d13362ad2ccfe2b43406ceab1a80b0ea8beb194ab4bd4da1a91ad3fbc50b0589ddd2507a4b42c4b49b580b584eea4a6d6dca82d28882678051af5a7f7f7867bba470c22cac98183565120390928e3933440b1307df5ae4661a534da425485fb979b8e70a683130f50c727b007ed10ffb2f7293db88622a0f37420fcc11b820a8d874bace9c0decabe0973044c1a5c52a31ef61f2d883379c67a0df5158c42193bb7d1af5626b8ecac59fd1b03137587cc9b830f9f5bf5a9401299e7ca2df9ffdb8115d5077a60b67c243a771b3af3dc099c087a412aeb1fffde3bc61b396eccefb9131811f4dd70862d867577e9a778992243252229207036f6249e27f7e2b91318d1765e860dd6c97669f099233ffa035dc9a5925cd865b1524add23b65fcc915779912df22ba564bc99699fbd4929e185af7d55f18a2e8299b3fdf313da58e13c17999069d62214b74e82e3a1f46f0223ba2f96828b78bc74c1edf9f95b8189eca00d21f5d33cccedfcbc9b8113e17eab9b8abd9d5b3dbc06e9489c84b929bf7f53b067c46019cac3e1a8e7dd9f28d6b466294e52ad1c5be2ca7daa8066820a031091c8fdf8b84e0ff9777ed7b8e304c70f0a45b7a46510ce51579d2ef57c7aa71d9cf1a3bbccf8b1c2246e2868721dbaa82a2d9ed13b6fa9acb49ac1cfe676a3f49a884f4310a09300f2656eb4abe587bb77ce0307ceb201b949eaaed6d74ffedb01e32bde0d6804fe97e99c558fe028cb9e7d8fe7766ac0c40117b7c1ee157eff5376304ddb166baf86ca748ad8b7b7280a1670b8d880c0363a75a07e9e554198fab0db2cdc24fa09f5460cfb2424a083bf763858dcaeb0edfc771671b8cce66092257ded659fe4092dfc7fc81a251cf727ac34e50936b61908d512c25bfca14a530443ae6388a44fcc1b88c5fc7b5814223ae5524ff89a3b2bbd55f8822b1a168077672200d7ccd79a50b7752e607797ae4f54d2ed3556342e528b5452418f4b0203eb8048dc9a6f971e1f6578e36973f0611b555a944efef8a5cc2d83e74c326ace2d6a0d3dd24bac276600137d75eceef31a5628e996033d9b9b9c1095c86da64bfefb97031ca1c6cff302081d001e857071c978b6468d6a5f8971a12c08ffa6e4b7751bdcc2cee434e71f715fc9f7f0707a0dfbce004a0907c46a8cc6f676dc59c2d8b37f15b88836647cbacccaa52aff90dc7fa53baa4ac514dd76bbd9ede68656361f9f7b66e88159642df2fc4212554cb8da427cd90d0a3ea4ec1bf5000c87307370a8f60cc85dfe7146144bfe781e4aac0f0e248826b886e99e1ecc739ac7e39386afa0edbebd5c32bc9945ff19ff1fb4b448c048b8ade033d7e1bff228b4b27cdb0e3ac6c7aa44fb81e0b1277021f832d5e03c0b22e247db075c16b7769da72df12c5b337cb6b6806c905bee07412328f3b71e4b0aeb6ccd56b053118053f299e3b732efc7481b4d04c9ba4361f3444efd04eccf39ea33dbafa695be886985978213eed56dc34cbf372dc89527a666d3462908ed296811f34faa29dcb1b8117d6ea6aeef92c21ee95c4d01153565e0f44fda0ec5678d293cf86c7007ca9f24fec90c1a2114dbce0632e90ae01a79fbeed0e7e60d594f8f513be68f35fe84300ecc45b407158a865abb34c55ab7a54d9b1856e29a0f97d6f7e21c2cb55b893970084c4abb350faedaaa2a7808ae10ba3c18e27910276d7c106ed330b7f7a307fe18a7d390c5036794a8bbeef7083211812f52c0d6c83d4e85d4bed893d8e02f96e4f819f5f372171b0036c44f8008becac881064361314f9518e0d7baa93102c8c169d03ad21e128712aa6a890ba97537ce16ecac2d670520af2fb11d39c80564b7f4af945772932c875845f413c1296d14e016054ff646bcbeda17cd84c2456724748d6286332e51e7361a8e9a048f5fc899d94e137ec46b4cbd7e31178f31c08314452e93892d196c7125bfd25af50949021ebc0e577882894453e5f7a4a0c9e83c70b61a82e63bceb9f77a9c8457f9956bb9a3361a920b2c3e250f08d5753d26e7592bcf58d6c2264b63aa4611463c52f19b17bd3c34ee2f6e35cf0c2479bad2c36ef360bae57c235130474e8bb1a980e62a1951d73971178d1881132055fc10636f0513cd018f9f4fdc531d0444485c4565dc4687bad04564e0e6f78f80af7fde48680e6cd8242f6ba23a2e8cd88c2317848ca002c5babb74121df0cbe9738f1954c0c48e0131156790ce0acfccb0601f32928fb403662b9b1044a2866b95ff5608072523e10ed8ceb6f51b443ed776187307afe1725fcf4582a98c839b22777f92b12c6c09e8dc943fc7878927d33e82567827c778258f4d6ad8bcf696de742dd7a8e85fe071696b6f4002d3d0cd1219bd02e1d15c4850e9bd6e5bde92c91f78aa1ee4b4123904ae7b71316edd45df7d30b55003b98117f4a877f48a80cb2b7da63d5063fa632883fbd73175def2f62912a43b149d61e2c6a722f56662fb4ed2ea4428cc78b46ed74c4e3b9da101562231b39c3b095c69c3044cc969d916a9642adc988feb1c39b54a27dc39839412b513ab46e95860bd86756020164684a74cbdfdc9495e4208b48ea2f5ed6b7f5bc55f86e6bc507508e671a389aad41b880a0fadb443b58144be949251fe36c62c8a4226b542e776a16e387d8aaa67e6c2fd8b88701b4e2eb6465b52cbe2d95c3832a3a40d82ea2df668605a282bf57241000afd41f750f154a75f13675e308ef5ec17cb8b5394e1d719fc2820d9bcf061b5baa7b38256c5f43a4e3da72b47cbb4bda7e684ad2ed3d24ac06fd93fee712054463f8665c15f34b8c7a4113bdb231db30990df6a5da0d400dae9b640705ce502c5429d2aa5bbed65891285a66af405c3ba1a95a5d6b0e090d24e53a185948479030171d947f4edbf5597c332a1bb9f6593d8efb49f9e4a4d060384625359aa5cc1fe32a07cab5403476918ff6423262f8b416cd51cafb3121f091b36af63c16574c872376ab2d3dfe5e889dccb547649b9b44dc114c2d349d837e296ab87e8bbd41409712c228a40506002e1b85c931ae04aa32db040b57d49470ff1ba1eb4d9e7286d2412503c7b6f7931ed8e5703a868355db0c2ea8901000aa9b463a4492ae05574defbd4d6885876056fae23626c791934f7b0ac632901272863fda0ba381e010a12607f4d02c0c656563bc656cafd498209ad0552cf173d6c8849a5f2d86210b9f3fc4d166b2c429cb74ddab3947053e5edcb5b968e240f1f5266dd641167085435dfae240b7a9aec335e0445613b6292cb649a34626340d050aa73a55b10e120d462dae361b3e17027c3bb7c26264250f8713c5c053a7c658cdca784c6eff80ee58da9a8b1b26e84359c2bc32dce55122288d184854a5761c67f1861204a815ad22ce43285d701c36488600b3c4aba410801c3cf840be2f9e7cbba733e6a8c0ba9c8100c92cb1157bfee25fc276cfc87fcd49ae7fdce1264f55c88bb719c56684a5f03b4225891a156d45a67a6087c2c08959223e9e08c1f023164e5ca24d10134b466dc9e8f03b0b4741e473498e8c8a641b144927e838f1102312ef8a0d9018ded4a55b80b8cbe3e425d4ddaf800e8e603d23e76f14a00ed1a5286111fe4082b144d3728e9c353356b50d114374a7109f4d5f87442acdd40815a268844b1f3ec2a1f833e816a3ef43d522f830c4f6163dae3126a37f1dcce772347f75cf63e435afb4c0593410cb70feaa552932c621b588bf07232710908f1429508d4a6a8d901b18df7080e971989fc42ade60b273e4679d2a84ea38ff842920309d07ce2392127ccab8227a2fbe289471c913ddc4d9e42b2528b4eb60a06617c0112266386acd69de1a399502024a9b13c4a273fa0a93e4a1cb280d17b8812f0d838a7f8b8ff934ff003efc30994aa820a756ccf71d89a3dc300b583efe222043542f369dd1051b4a668a1eae1d656e17d81be585f299e775b4f00ec7bc66b5bb721e839213c38b9bb8b9a587df9e88f3683116bcd7e1204566cc82c884227331803f0196a7606c7089a3c589e68268e74954eddcac14e81d4cde74e9e7e12628fdd00cde2711dbbfa50db3bbb5576cd37f024916735be1cc25f163f666f8631fef7a5dbcf695b53e0a224f91a9186648ee798e548b170e2d7389c4f94d523899e6f00f5ad253f7d0b13da213eebb44ee2460fb4ba8fd4a415c3e919fed56f76c82bfd669094e1757785e4f944a2108e781765ed3c44e9feefe1977e48bdc5fb47a665acb3fd8cab992b81b403112f42784582a4810744b40f202d4495c991bc2b880047eeefcbf6d0a43541a91200344de32569669c10c715b7d1c815257a435e03202e4b6290cf581614b8e0beb49e3e87f4d749c693bc0d958afaa080833810dcee5ccf8da4edca2920b04b996de1e4b23a8566a72c989d46e90524014548a5dc484e63bc161225a72d2a1a706aa9bc5022fb50dab72289a1164f5b2c867b6c61d1713d6fd76108d860aafda1ed3c37741bf4658fbfa8350e6e68a425155c394729a5a5743e90d39121113d34e831768852115dabbb37d18704a664f82ee935bae41004ea6f6154a4f87bdffc4732d10a8cae083f653e9e65e7676115d320912f64f8503873f10b7f06c3d4e00ae67d11ed0fc2215a43ae6224eeb969e760e31d1bc1c327f8a1b7ab45c1ed215d25a0171b261b418d81a7bd707a3737447ef4bf858e081f0664c429a0d2ee908df44a066f4710b74860d57a94974c20b8dc4c3652b79e5eb741585f2bbbf0cfc0f5213450792e85e4204f42c61c64a27f2279949822cff2d43e362e0a67abd48bdb655bde665ec79c0b8f710fcd08140a907c7baac0a836c4c2e2dfa48388073bda9edfa20c264ab195acb83908e584be209f2616e1f76a7fa217ebff89f25e5750c555694d0a281f18e994c2fc051835f823ee5cc599519677052b714737be752e0c4872e0ac05b62d3005011c1019359ec508d0fa38f26f23d83f5bf0cf7a6f7906934e1f566b5dc40dc756253b6770f1a10f536e202df760610bb964915184ca40330ec84af604767a67fe1117900d79138f1dc23dc5995620ef35f4b18260ba35c8b620f52c886641593c67b10ee1e5920d5b65e3c0204069ca294751d4d9fb9f273c9ad2f130526d4c704f01d05de64dccfc06f182640e84743a8af691854430671cd2b4459084b13f87c00ca75eab55b166647a6b5f4df38acd4f608c5c0f4b33b63a831459de0573871e207b6296c908622eb1b344786293e10bd67c0e6c7f381bd344863c9ca37f69c7e34445428000cfabb43a36672e4d63defdf5cf4d70968a7ebd350b0d475feb790e6686d55cfc129a4d4e61324e17ac15d3095d95dd6ec31e2b8be5b563df42d93221cb12e6b47dc71d8cf6bf0fd7669707b20f72f57c86c80bcc98c1ae43f559536813fa4ea381e10db06e449d048ec11361d3a3dedd5b642896eceb4286a8dd37704777e440aff714a847cc80527c41203160a0cb0c1667030e948cdda3025b0a3b8b703293a1ce425e2776c0bf280fd83db0ab519ed4e36053b540d7fa0e37eadb68c7081b7070127d8bac749e21076ab58957e9dcb25ba9d2391667652c3ac92099b00cc483f06e355fd615e3137b84a96c07878c51b80ab87604bdcf1be76db358727513bc0351c7480234549b5ea2bf32676679ebf6ab9951e219b0719dacdd18c1ed3724ba843a42ca924d78574dde7f6d76a228e80fe5da3dd39047ce4ce3cf719427b27237514288627354e285ed029d2f4de7161d11200206f77711d0d4202f8a4a110713f43f62bd95d40162f33f89cba437927780f4889c58c9a8f2279f9772daf8db21e8c981e61f82f8c5efe3ae8301d97fe8c68980edc107958108d476bdea2f9e4574a98ff302454af407e600034141e6dc6cb05c11fbbcb8e1b5df2ba3ff8dc39f8388fa506435fbb1a9e63f8b541bae16098e39d10aa6d36b7160250dd48b506b30ffb4649b681364bc5d2fb88010a4627d503822b5fd4cfd31a011e2fb45b1e5008908484c1a00a1065daa802b81c9aef93fdba09d3c74073e2da5d34675002542cae837f5bf315b9d7ed52fcab473805ea09f6b969d5e4f5b06b8608ca9372b65d6294c4858d106895727e8a34953deb596d47284fd747241892c933ff55ed2fbd3307ca6ec7e2f2588ce9c0afeeb6423fd58f4aa37e83ab25abe277dbe529a4e392ea74e3d06afac36473ca2d5bf2fe27f5527bf3f791adf9973979fd8433e8c4e03fed67e605a5cca037aa6ca85572096324a073e8155592b67bf749b718501f2159383dff418acf907d5223f31c50ff4d52f90fb2e323cd801ce62729b9bbc70c163e6b9c7964a0801257f92d591190fa43d793a0a48862dbf259290bde5de524a29534a32cd0730083c082e3b82d98c55395038e138327f4bcdd068a7ee61d56847e65b2ff3451afb1a6df4345a9dd14aef321b5a25f34082102955ed473d3c3d3c3d3c3d3c3d3c4f3b33823a9b95845d3c2d9ea5b1dce757ee7bcff49b03996c7c5b7dea3a5a31daed7a14e2e78896ddf1269be34d8f42bdf53a3493f53bace97568282d87e6e0c97a95ffdd6a6f306baa7993ac7978e5abb137fcf03e3872e87ea6bfb8bd6766c68a80ee9c3ee4f4a2ff7815b7e255fcc7818adc73a022fff12afe73d26a88b4902da59a4f04870bab0c6b2e6c544f1aabfe4e938eadf5f43a3ec4399116226d741dd7711d23349c9e757cfaf4e9d34fd6790f222f5877777620ffa1691a2250ba438c7a131f722603bc31ca5f61fe2dc456465a52da27e550bfcc888c9108da27f4e493f1b99373c1f48e59cbd616629a733ead5306b28cf3bf1e1b7d67268daf0cb4ce4dcbedc8ab7cce9136baf551da93f351e79cb59e4effa9148e85ef573042f84858502f0a5304b1bc2b7e63dfc8373af6d16e418ef08574dbdebf4bed8db314b3f2fa0df614b3b4ad92bedb7d9605fee1361669771131899059e004c0f82ec8cb8cb0dd56f05980415ac8732cc019a817e9a8cd48bf883fb54e5e3ab523f2277d4ca3d1889b58a7a466ea14e35816f887af6e4ce2f7d9e72ea65fd4f65261855f63adeda562b5b6975ab3c9cccccc9cf5500ff5900ab0c6de7b2c422637d7bbcb525a4c308c8e3e9b32226d22208dacef26dda49b7413ac63134a134a0996e097649ca5d284529a543299929df3fa6c7e76652599cc94cd4b62b33e13963d767d2946c7332cc325aeccf1ea9996e952d726f5a889cc2833ca8ce2ac1cd0f7ba335859a862d2fa5a2d5a223db5227d3aa3c9d08ca9d052e52cb31bc6d67317eef2221b995bc920849fc958b3ecca2a9665d7d7f935ab5fa4b19a5d9f237b5e31cc6e4a7c6ba1083fcb6af6ae49a3ce30fff11fffb9128cc62084fedacd26ff491f45b7aebf4a18863daa07bb4ada0d7d37af2fcd2f5d58e98b74467fca609ffd561fbbe07b977ec3307b612e53cab04b433de11f9735ed764b2c81f01d87f2fc88d224c548aa17e97a1289547f93798e9f633e134d0d8e113f8e1a9a527b612f332312a95449cee33ccee33ccef356b52598af6ea5c2ea571cc881fcc77f666af52a6ea54a3aa294d29fe1caf5eb56239c21bd8924546bad5c6bad95fdc77ffcc77ffc87493acda48f20b50ee99b09e9c1cb923bbdd34dbac9884422914695448a3f1a91485fa46b8e293ec47b543ba52443922975936ed24dba4937c95a664142f5a09a2041120aca86f241f9a09e9848a41c44a447f590504d9828a5f44d922b0de9eb6f334f929f036e394013e94924bbe5d0555ec9924896c62ae96bb29b0856db8c75553eea09ea09ea09ea09ea49cbb0dc42698c31c617df663d74d675bd283f3e7859b2ced58d33d78c7693bd235d33339147fc99cc8fde68f4667e53f246a33a7a26aba42f6b37d208a376b3a6357117f82cd6ab524b2198269449c5044d53ca9432a3cc282693e92714d3a44263324d9f09653691c469704c29a488e337d2934c31d6309f524088441cb1862695020284489c5166941965469951f807bc7c60729988ebb29821e652d2e69852486fb6ebe3f370255fcc504e3091be95493a33436766e8cc0c9d99b919bda3a49999a7b45699c449f547334afad6dfd8fa0d32cfd84d04ab4da6922ccdb4d7989dde43fcc3d429c62a4b2efff1a58c32ca28a37c54debd7f97eff25dbebbff22feda36a9bc7ce7fe7ffafcbfd984734efebb94f2ba0095ba2989d7bf95c2c77f7f6a7a339246cac82a473293d26e25138d4ccdac1a992aa5ac916f92915faaf2a58ca9e69443c73f8f1fc0bf00fe03f06ff30f807fab7d8fb75b0af19f87dd6137223a2c0a764b9d70d8ed6b68ec8c8c2c5592356129744646cf09e79c73f6ec23e6d46926ed73ce9e734e48336b53e255a6146d69f42ad6c3bbc943827b4b2965cb9652a29ae86e1414b949d952ca19a774f99db953aad9adb37739c0641a66adcb9a3012cb366813514a6987a1943aed3094b6970643296d224ae95547f449f42b1d3977d96dd543264c7ed15906b32ccbb22894719818dbb32dcbb22c7b8f66d8cba6dd9c4afcaa6464336b6594a9ccc85d4c58d6320c8ff2f993fc499144223d52fc27497392482452961b284956ca27fff923914891442245fa16e9e36f2eed36c4f4a4529d31619544fa1a52cd931e07497e8d666732196ab79509ab3dd9783d6fe7397950e4f57aa494d38eb01166b73ae7b4f34da6199912f6de7bcf8867c433226b2985af7bce398ed13f7e7b8977c677d769eeca48644929e94bd2958de693461946ad1eeaa11e825ce444f9bc397310cd47f5cc37514d4c948fbbe69c9bd5bf3d3157ca691be8ca774f6aa9b55bcf2faba42d7fd413d413d413d49311c33131cacde394d2abb895e93042077a0e747de6b7ec2d6ff93358b5344f9a26cdf4f369e6d768ce4993e61c56b2b41672e9eefee33ffe139fd03badd34cfa08f99cf74efd0dfb492a5d5573dd436e4adc493a5212add6de6dcbbdbb4937e92658c32ff435b39392c340e94c44c246b5da4dc923698ea96458b44ade8d54fc3deec25db80b77f115a9a19737a550f7e8fcddf471d36f74efee94f0fdbaa9a4efb3d2dd816468e85ba69a772099652019bb4d1abbd537758d2dd9ed47760392d98d48e39829d9875b9c18a8056299adfdcc3be78600e071a080da21006df6b0d1e603c06ada6b4ae2a76079d88dc80ebb010182b2ff3356a6546d54067b9ad33274841e159dc19e86e3a8f8d253a4e2c15dc9820418d57bd7707444a1e2c1b484ea59d72d98b0a77112965004918ad2604f63255c81c18e8ad6604fe32a72c0041f15c5813dcd350704514fd8d35c1a573021525114723837de780216956b3aa250399b76265067f3fc591cf621891f00a1e2813651cd6ea11f3e1c94972bea366ff51e4c2adb375135bc870ff99fc5e129b644d151f160ad40f57ea5720d5583e3e0f0c0c14a950384118854d49b9dbfd1b6bacef9e8a108368454aea1bca89c4d73f70fdd4a1a4c94f229dbd595cf4f1bae2ed494f47df6861564b6824ecca166bd37f39cd38acf5de77c4c291d83daf50efb29bc6e9cf371e5f5d1ff883ffda75d5fc47d75a9c63da8229f9f651f5acbdf9590358e187459c4bc07fcc38d40b79a1c6300042f7e2226827f5d8fa970179e0284c81524d50377e9618a7bf7ee6dbc4713355146b179c599b5971efaff07a28788868886888688868886888098588d6770a37c503e4411a29ee420423dd9c2e5faf3c8413d413dc98190a10dbca9252784dd8f759430c6f7b4bf52c0d3c3d3c3d3c3d3c3d3c3d39302f81c0d8ac3ebf7774ac141cb9471beaf91ef4ff1d91c715ed8a83ed308b3db3b8b45de41c5098573965cc7e1bb877f0ebb393127bbb9a21a6bb7f9bfc33b3c96cc28a61965499d58b58a409dcde68ada66c8c981a0840f42d27bf64e0a61d77c2f7ea95ed7233e181f6a8f7ff4432dda8dddca7dcf94d916b942830f39f5acd3ca20fc2708aca515d4d940ec62cb04de1357ded3294e22afe4e1368c7f9deef5ec3c426d8bf850e77bcec307e07f8fe174cb6e1fea7b286113a8b3696a3a61efc5b8f170df77f79cdc4f35d73a1648a78840cdff6997c6e387d3109c205ed54df8003896230fdbaa533c7e70336a53360ca2177c41541245230932bb268646dd1cd04442bda10fb3a71756fa8c7975bdcb32ac0ab5fe53bd4aad66d49a845a7fae9881d58a04acc2ea3ffc03b398ff60b67a95ea3f59f41f2b8ce7a613e22ef7bec8116542dd1cd094628c8a38200608c8117d978d24953d246d10222f0421f282fb02658351428dcf415ed82146e51830ac87f84766b3188a38c065e9a1cc420c4ab851582774195b49e020a5d5717d4a3b31227941c96ad48d75ee0e2ef5663ebca085fdc50c254339a338d3e9d3a967717278094e0b79394bdc93444fce269650e33b61c90e2e9559877d5a089d51f88765a52559070c3b9951209d3e3a7446811716d6c25ba2d0b5a08e93ce39275927daa973a3f08fcb0dea6c74604f670c33065f328609a3decceba7b446578c97155b67663083eec531626c27b18c0a67b4b26c471895adec65365a7166add34d56f1316aafb74ddb4de0234d365400f2a9cc7b765451d9be8941cc6171f7497946c58250b99a1e3e2adfab49c7055b484208b58a9da0f3b417abe397212f27c7449d62ce8c48f7bc30b576a451b79f60d41bf9f06e7fe9b710ebfa8cbe532db3de7a9751669e62311d261dcecb2342468dcf3ac0a87cb7bf1202094284bb6c2fd8a8c05d5888a73477d99ef6b88ba56d61419d4d0361cefde9623bb11e624bb2ad3b8aead65db8cb9abb3b84eacdf5d09234b320c347f96c2b86392e5bc4a1853bd009ecd969214e604f0b89eec11d43ee3e082d94bb034c8dcf7007f6ec10aabca5b978792d047b473de11f765b359716b2c92cb70b1772d96593f8983117fef66cc3b8d3ef45b0923fed9603cc7d566ab1c0e8329f11a6aae3cdd363cf08bfc2cccc8f86e6df430821cdd644af34136988cf88b7b3f38c783ddbea19c1efed3c235e0fef74ea391dbc87e3f8195bb2241b430b81af82da06e44aab83753dcd9e8b48a5190971684ea543b42e8a4363552a75e7974838e0471d663d7d94a9948f8f8f0fc4f1ece373d6d39c3e38ec8440d462c0f27a9e11a6ae612c668b2d8bb3677e4f47d888342232ca7e8a808aa6b4943126311166661e59cc6c315b96658367d43a66491609fe834d9303b97a7afea38d7e6a72f4414e369d923fd2be533231d3fa9aa085c09c2d5bae3fcfeec9dcdcdc6cc1e00e84bbbb475f4828e541719f3e827b769c60147352f3d61c99a6c7afd564e79cd3649a26d334fd34994c76e369fa53cd464ff6ad9a1a7b63fa9ac6bcbcc963aaa9b1ce53ad7427ce038bb413274e9c3819bd671e5d7172058b4eae3871728587733a6573677777f76d9b1bbf755aa775babb89bce084c7098f131e273c4e786a9a46a80b4f217a3c85a887a710f114a21e9ee26070176c9a98c8d5d3e32e4e8569d9571834cbce68260d9b29e2a71913a9f4264de667b4926495d4b6d3b5acdb39ad2fd2a71136f22fe2f36d522a74ca8988888888685335609857e4609a88bd600087893d3ba1f73eb3b44dcb7ec3ded96795f465d91b67b1cf7e9b9fd139e1c8deccc726666f9837f00f2774c30d1810bac109f14eb43760e0061c6ec0c00d38f0ce0d37cc2c7bca1a3fc60f2d6604fb6c6a996747e4c4aae974c30d4237609c6979edc471a97246be0ddc85bdd8c05dd8cbb381bd70171bdecf7c46d2a2296a0f8a7961bca8c1d8b0b197ce6cb41ea7e5bcdc68fd4c2c454a5fbb80953a6d0e18e6b277f03e2b9396bb90248cd7335df9d77b4f87fbdc983163ded874dc6bcbe1461b02d37df6e6fa0bb37ea4312123639289f58b34cc2850fa999f9d925f8a2f33994c8b7f4da024432f4d3e67d196eea5597ffdd5a9abc7f5a597d196dc6034df6549461a13f5a566c4bdeed1a9938eb7a9b6760ff6c25dde2aebd28ff7700f16534de63cbee33cde83c579bc078bf3bca74178ce53b193f73c938ee93cf461329a5359da9c9dc18059f7256d760ff9553b750f39eaccf4256de6475acd578d2635a399341a0d883ecca49d7e46cbf1351a8ea7d150788859a72f69397ea4e1f8aaa1f001ce3722d781dc834850e75cc830eadce59c35ef66bbbb5b46e7e0ebf7daddefbadb39c76e34b294a0d975ef5cc05ca00f9248f3ba1d8d2e95a3919cd6659b39175cbc1e1d615ed961188665d80873ce05e7487434a2f4f1404f0d51a17bf4e8aac0238bcabfa970555045adcef9191327efd1cf0297cabf9d1cf74805e7a3552aa8d02ce88652c064fe438594362c1af8f03ccb7b962704618a31c670d18424545bbd414bceb80d822b2c18a20824b6a062cb755dd0922f1785eb829664d941d74086d03908df39e8aa7307c695ef58929793d382ab243e5fcf90e0b8f2bd53e8357eb94f199f5bd6655960b4737fa807fd3df770cad810be079f6befdde10ccf2d1fd0748dcb08bde7b4e63ce29e70dff36833da4a709f956d1871fd5cf76a726f11995fcfeecd65f49ed39a93e4ee6c212476f7fc9dbf7687fc9efbf3475b73f7e7de738e85d15602b6186e4179328411151f8cf17ad4654df95e7cecbe3d0641b83aee77497fd9314a0d7559939f8c91efa7e010fa30d53d6c908851dd6f36146a51fbf9c8bb40aaa8eeba185f1a9213d039d75f9e31e5f59fd9b33caa54bf2ec80730f4faf3b0a2ba477284dacf0fc4b9705d7f2aa18cd868bba1e79b3ee1646db4ad96b8f27d844e748adf08de9d4aea75b7ccc46ffa7c1ea9696e2696f33d95186b3c9e78cf6ace873f8f28ea66baeeef875495432d688efbfafa19d5b09b79caf8dcdb9ffb05ff0a094208a1fb3be773caf8183a67ff37833f3fec7fd66376eccdabc9ae84f8ce861f33f3004275575ba7497be4bd7fc3b0c2ed7ed7d6af7f6ffeafa3fb83ceb52438b73b498cd9fb87f923b13c6633f88319128fc0742b9bc11fc86dfbf0398be315cac34a7d73fe78f4ecc80ad1756a0599a9b404e20750d0efebb20b3815665140f942049cbc005e794c51618838ef79b8541452807efc91f4256747dc1757c59115aef5f3d98d866b6533681b0d773ebdb0f711f56e74ebce702756b3a8b910b57e301e56aabb4ed5cfff24cc8cc867d49371ebe70b65c9474df9a8969c04273ebe2f4302ff3dcd30aaa1fa572edf57b8647c19610022e35f6a501e3ff53dcf08233c018d61a32811c4f03efe039c084c90939393734790c28df686fe7b128f2b153e0dfe30689bf5395c973eb5869c78411608b821275e80c5a5d7cb66b8ae75651e63fcda422eebd250345e4c3768fda5a11e0aa2667c948c17ce9597941f3d43325f7a26c375a98d56be74cdae537c25cb25a8b371773a0250fd4f30be347a66e46df2a37cdcefe343cdc79293b8bb312279d90656452fc0ac12d9d7d17d8f2101d366903df65c80cd7de144ce55e2373615bb359519acc4c8a206106460f17100f69d3d6075dfcf4c03ce0158f3e08a20da11a40085bfb38138bd92fdca702d04c31ec3b02d62d8e85deca1b6656f65d8a328eac21e6561239804e7c6517c2cfee42145bdc1fedd4c976d18ce0f3c467503f83c5caa0c49468117d880429621275e9065c8891e95f3f8e1f1838abd7fff114cbbc1fe8d465f5f6664c48fa1d882239c3bdae86f173ff6504351eb51172a5a8f620b8e34be309301fbf918f6d71dd9243ce642bbd170b1f8969dab8ba31befdddda1bb3b4cc24097ff3d60a5c2e6ce8f55d636f8dedcfecdccdcdeeeeffd75eaf990de3b5ecd77a8d90c71eedbac4d435928898aaf992f379266082164763344fbec9ce1b29c0f1e51d466e6e6e77cb455e042fb5a08d3d9f3dbba307fd2a9f59ddf7f33edec54ef50e49220eeb0cab94918703907c62b2697ef784051f9a7fb7277f8cc3dc75e66c459432254dd7bc8fe45fc6533c07fffcfdd243ce66e34dc393f4e6957b8343f54f93c331856a8c27db1b30abd9e622d84fef517fd820856aeb430ea775b258917d5b6ec292af3887333ea7e7bbf8d508d72a8871a799c717e12cf6478943ecc9090fe88733eb2a79ab66df4df468d6cf4089d1685e47dd436b619c321ea4cceb4c16fd750f01a7938176ef337f95b4459f6c875dda3264ada23d745457be4ba7efbf275b788432d09ce8533bc0b3f094a06f8efa15d4d6e2aba1710853471c59230686b4ba8dbbceea8b89e85143ad71f6b213da7f8e927a0fce8ede7ee66f782633c78505dd092236ae81c55447284eabac012e66e29544700f45b007e1c5eb9f796a7e1e2063b4d0822cc133d869809f44ff8f80c010921e854b1c201500f971dd0a0074510d1865bc3013d10316b4c29562ca082054308c20b25c47821c1972728c10d286a44d1c4b5088205506011e3c74b0da09cd105162222c2c841107eb8c2c3b802267185db525bf0bbc97fc2e230301204cf10b614755144943e8206b420e3063d4c7a4044959fcb67d8800b283d14d1e5064ea8588a175fc4a0e20a1e19a4a1e23f6179513c2d3618a2072b2d708305338955132a2822688b1421ae588153a38a2b35b852050c6c90c6fc4109c640e20d276bbc4184456fe1de7da0b798d7650cc48a7a9aee9d07827cc8b92ec8072e178beb827cd8b9a616e27f722ecc975bdce0dd4cb7ff59b9feeeb9c8b92338ddcd0439393957c98964fd36f271b77addf55b7677d841c9bc3bc0bf34763efc2dadfd4a18e385dbec0b6f9d7ef96ed3835ea9843933b35542e1f6972cb67092c5109a6020ea2b5157250b2d455a7a2e67a14598cbfc8300a42bb752b94d5c313ab7856c3a6e982e6eff6ce7cdcfc1114a8677dd9aae6b2e8b989eab03caccccccccec9c0f1b4e2e075597858d25f7ba2c6b88c9b286976bea14f350e5304354b6a8286ff1848fca351d3f382d7e68324505849e368a54aea17ea0a20f7b9af30248082c2a0ad16043474523175de8a838089f221d159d46e8a0688a853d8d5df045133a2ad7763041452f35c068b2a3a2748d253b2a8a690973c61615cdae204215151d614f6331b830a248454948fc00a4a2958a245c2046454b56ac88510550661025c6074f3a5c25334e1b02ec4a7bf39ec2a7bd4c8e2629feec54bb4fccca8c58d63527c94e9bec08a5f3e35bf1e79cd3fd298d914697324a4927b526b55294d239a765cd1f4c5c9d6d99620c950714b4a305f3094a01d0182aa615cf1527a0c1032126c60ce5608994213496dc4009675051049096290270c2658b0f4649ce31490b038cba3d2e47d08111ea96c9f0ee743e8a704da9dbdb52b7f9450ebc2042dd5e175c6c31041c68d1a26e330b2da86e2f4bdd1e1642a8dbbca26e4fc3624510ea36abb852b709841dd4ed51a183bacd29ae74ca7d010ac040757b9a14efc6cf0fea66004cb312850645dd66907e27ac723ff7bb91202d1ca085165a60c100407eace0438502b440801ea901082000362d00c06a2d7c0a3c76e840e540a185138e1a1a530b2d78f302503230e026e1316d37145cb6f3a78b2edfd9a779c3f6d4a9eedaa6d36366eb2aa80100c3434b6d7e1f32a8bde4fa3f3ba48b545de445688198a22fb4387618a6cd224daabbff10023dc4a9a04b71b9b00b213109448451c68dff5cec2bd459b9fc4eca45d50055fd7c99681e985dc88648455a82749470a306439904b238a10932aab8808d32463e643923094c5cf093f3301c54f1de7befdf7b87f1bdf7de7befbdf79efb7bef592fc6e71fa3bff8de29c6f7e2b3014aa9f03620d09f3b3faff739bfdbc4e70f0b8ac231c6874f32332761a9e47208b0cbf6063e43abe321f6b238faca6ca56466c4999dadc81f7914ed898ff85ff17f4a4a2dfa5e7c58a72ebb9d6ea539acdfe49c73c68e335a156c8000010a42e405185f5bb7ecc30a2d575f601e108f6ece39af6b74716acee99e35634cc519e37435c668c24e17c8db78dc74dcf8cc8f999999996d66a718d3010d200f95dbe3ba201e9df72efd22cd04967d917673ce39e7758d2ee6ccea38c1e787d3b6c53c2d2c336259d3bd629d7af0f9a1a35766c421d4d129934d0a7e84f6758ff7f16566249e74dc37271b895bbd0f7e34f26c98991d74d03921af87b02a6b2288083157bb2e6827cc731861bdfddc32a1f32a695ff7e07f8fddafb04fd01235d4a892c5f413441b61f40c3909a30726748abcf88cb102d3bb9273c1a425206807402af652832a5354339a0c1815f5190d2713826ae64d1a0e4d501b674c51d1e004015533cfc3a381caf4341a0e0fed032b62543770de649e7f754bbfbaf55797f4ab3bfa15f6ab4b7ff5ab3b7f75e5af6efcd585bfbaef579707d216455099dedda8fe1ad62df0977e847121b2261386725d9bd19e83a36d7551354015cdf7ddf83241c3a619cda960103b405f30f1a2a8076989f3e1dec812d5f5078ada6191927bf2a43146e8dcf570dffd8a2877c396d73b13b41098d342e66fd99c1620b3ba1a436aba1b6fcca153fd814e75078ca8fc495c0a3e1356709f461dd0d856435c1a0eae077c4b83453bd7657840409b13f2e1ff6e0754e4faf33b9d5c91e414ac49ef76d2f136a7d7c1852e91c41b038b144f0d3450f031aa161df4606609537420a970f28654c30babb750638c48851a65bccb39f26e36b7dd95db5b9c1647e48a8608f2e2f61701e3f6e34074bb3be7f4277a5dd010545c795dd010519cb48cb00ce1c32d9f1f438e4c1a5d77b789c2650d31a5a17c976669acf5e6d7317eb672730d9a589133fa8344b07265173a57ce1ff2457fedd22cad9d0ff9537b7746f8fc4dbbf9cf977edd7ddbacf2fdc6ffdd1bf789391fd96dd2edda2905f8503729df13166c11b365a767a8723e8a749904eff2a364609fcbd67d718130846de5dd9c0fff66feeb0b744910b35774492043a29d912062429704d8c8b9b003e7dc240cb85d736ec37ed75dd921892bcac9b94a64aef5ee4ab06be9707b87240cb8ed7cf02b8937f60ef195c40cdc4e21090320b05281bf5f489c72eb57c2f7bd0d8c4054f86084a765274bd1982f3e18e16ac0144d90c184284fb0418430acc8c2c613c6142154c5ce1453bce184cc192394869629de70c242810a95a12f3e30f1854f0f5778d084225630c58b25a08e78ffd69c80514e10e7c3a99c0ddec3fdbaef51715ac8c617e73dbbe580a570bcd4f79b0b63029c8d7bb8fe0cf0a9a9cd69e1a24e35aa8688e3c6bca18a164543fc958a81fc71f0212b95d3e084eb5fc3077cc853f9ebe0431c90ca1d05210d3d845d0074e5050814b40233329f20264feee688aeafa08b1c4fc8e6b2a484cc2b40b81b769d161c3e40830dcccc73ba8947126ac77799059e2a5a1c1e54ec63b3710e9440eecbb9ee5ee43ae0ba2bbaf23d1a6a6022202ea122dea3896c01c25a2ed780598fa5f881b8ac6519c87bf0c580f3f1a5eae04364ca2043054288c1921e2caa7e13f8900724a5e7270949b49103553f0e1fe8e76e547e4fc11a6f108d2103c8883482d64042070a255009638479b9a85e938f276a009a6004215c30c51369b440d55bf08ce959e30a2831e881f643e5bb0312bf6e79b8ee1675245e7fb7a7eb034cfd1234c18a1d00094144194550f513f1211b172f80011451988125052ae78511d2e891e28c160ca10c557fca8770008a2ba4b0e209296250a4ea77362d5b62c901543426065ac47091b3c4f4405011400461065ac44009152ba186194f7c004483237680b8e6148d09420b1b53a618d3c614c20d30cc58e2091a742182288c7b029112823004298ec8619223457201a70409a1854a162690c1c5e5cb5f90f8f587c1aff3e004b87b6ba00102ec821608f143143c187a4244118a90c1143ca0d2041fec4c417988caef4a10892984258b1390b880b284e192c5093a3d20218354b0250732415d77a9dc43de336f7ff98360519d8adfe788eb827c985cd7c5754149f0e0d2ce827c38c847cb656626de732683fb7299d079d5b3afb3948dfd4ef10a51ea5ffe14bc9f3cc0a81c3fc29843ea1ae9797dfebc29af3ec4891992620c2f53a01c41089c33c468230a2cba3882122a1574011a62893078aa204185012b4b4c71840f8000420b546650d74242c062dc1be7ded970159622a68848a887777438c7bdebb1b9c0ccec83d3d262dc4e42595bc2dc52b7bf8b70fbab94e6e9435047fa3a1f38c10c312aa80225847454da90ca7de50414803637f3d5964f77ff1eb77d3142f9a65b7d31a5a37fdd5306ce87dbd8e9a0efd52adcddb7e7efbdc7ce9d3b771ea672a8e44d7745b563666800200000000316000030100a86c321c1589c2792e0d3031400117d964e6c509588044a94a328831032c6186000100030004343db2401d0b2dfdaf659dbedaf5b312437231ac34becd7053d9263f89f5dba30c9f726ebb09425b5d0e324ec11c41984c6e491c6c701b5a0561b7260ad6aaf75efec6918ab1c1080b124e77df65bd2d10331cc86fe1f510a5e75384e2046bc5c9867eed1c9b4319dcc2a7047951da8fdc58017d9437efaf09098a4d5f7701253b72f3025a8ca492a2499b07dea387880fd1626cc480762d18990f3f7ac239d2554f0adb75591aab19d9ca5b1f28de03feb9448c7e009dfe547d87ccb49ef0d70e48e332199f2b79e7975fce5eb2a671dc3d2ced3152819927b2a57949cf9f732e1fdc5ad957092104201bcab8ca20e2edaba5f5052470f748c223d7092cba2fa69120dc66b3de6c29416c61797c9bf652c9af985b4f7bb9b3f8d58b6b74ee6c568ff3d137025870d588ce4747cadb9f62ec2198d79e2ceca55aa12a23e0b8b8aea23941a68f624a7a1d92a2a21d4511fd71bf15ea2a0d4bd4994d25387ee71ab27cb5b4d9b1fbd0cdf63d1641ba10a2fc8721602bf296dfcb5aae5fa0414d5fef00deab90437e47adfee6aa9d57855c1381682a612729652aec36b42e7f26e8972be4b283edf5743b24b089bc49faacc527cf12399a54cfe12447075a9b5800214d3a7ff809e31113ab25ab5a974d070d6a82f33a9d4dbf6dba05ed9ebd16b0b8ef4566c2017624be1642b2d30acf90448e4c2e8ff7254e7261cc7d144ce969ae76c5929a9392b2346bf037babce4cf2a66b8013414cb75b3336ae713941a4d2d3e94b5b5a5713d5edb63d315ab43644b147872b11e323c483e7614fefb3117704e190f7b8f9704d6383c778ee556f1aee81e69c27b8105fad40848ae191fba294db75ba68cf0f73af2f82bcf7cc4ed055558d5c0413b521e459b216dce68a0b05ea272331f6e912bfcacdc5a6ffaf5f9b1a88eb630530fb73c99c1b7b8d7b46bbdd72408eb54a82a1f8984c8118d8da3a6040091a9c3343bdb1a53f1b01c855a31e0e666e35310033af1ec957275ae92e28be5740ab079573073dae2f6e2020085118652bb0bf8495197a5338847a1414a198ae5ec54177154b8fb57bef1082d6578928db166bbed1f26c5c8ec4ba779d02e2dfe77679117f55d44f465c7a7cd30dc3b2611978d6f967dc9934ba0681e32ac1bf1965a8b70f9a8c497e1ad25ed6a67f90249917be2cf938f7793b15c268a294c562ce4ad2a443246c43f793218e2414ee7ae6eb6152f1d6b002aa7db68916afaeff60d6c5e8ab18f27396743c2793b00a2367d2c4e81d077c0a17f93ea6af457dbdfcaadfadf8a223faeaf5c312bf5fcb765f16221f5265d3a1a3e567a2ff85288208d579b262b467f7817c5608800ff67d33aeacc61533c87e59428a9bf4a928c1860f19c9d45806aefb16a0e535cbbf25bccc8df2f782c7fb73c61b025c73f98dee1e33fb5d1d07fac86ee4c39af04fd289715695555cdd705752749fc0eb5eac8fa0dbc31641acdfbb01878e1ae89e8614367237fe6aaeaad6af6bbd921eb93a1e3439008789c0c6a462d589814b8d3e3b77c92760dc588f4ee906a912991b22f0e396281f9f8deafa89b7897fe6514b6eb5dc5b9b59a55635a4eafcd53eb823554bd03fcac8d773b9dddaa1ecb3ae68b7385c143caa1dd629c6cb4646c517874c1dae5cc9d198fe13f2b1b2f444b67dc09021dca30b9548511ab56cc42167651f8e86d53008e5871ed6410904c84499cb132ccd975c10570703080ff8897040afdd9cb86f75001c26505464be43452eddd32e902aaba3a9ead8f65b67fe7664772fd365d47bd80cd6db71c0d00bed663e8d143e63889cb2f671c7e743b8899e12c6140e134e7f340dfed43d7b4f7764ef0343ea3ae9e9cfb697723d145f6bfe81d5b48a0c9bbfcd0e42371198788b1d75b09d11c172b0a7b708278607582e8fbbe5afb10375b52c71c6532dcfe4e8efdf9553f596c9eef1bab0f2c61f2e22b1ebd95729e35a76fefab7ea349d445c0ec5b1738d0a908cbb87045673ee3b4abecc191185eddca092fbf2a0d7a8034f3ae8c10f1efbebe5b8b7085af078beed3e689ece7d53b6457a8878eec857e8126f9f2170cbaa9fa998e7e6c40076c76203086959b109f8fba0f4563b50fa69f27dab7b807ed8324ad5ea7f2e57ae207c1353e1d5188e9611e8b99aeccf8b15e895c13dc0b997c79f236e9e4cc9826bbaa1d9e8a88608a29cb4d1e12352af49d5c1ea83720d3b8d4a8d899dad02e82414c3c4f273a0bd938c9664d5b95332f921ef61e61a3afcb436150b1e4a09481ba285752fa89b9e4cfbbe5349ee507238bac54f527915e75b2fce39e9d70e7a03f28fde90072bd601cf6a4fd998bdacaeb191eccf409073d28786591a4ecb5748d00051f50d34a76acc13255815ad6d34044cc0f8c75ae7a9fab8a1adac8c0ffea5c504f474d1bf011d835547293c60b02f771eeb10b3d37b6e51f224df80247a8a2258e2c583e2c602813f71d1b956bc5b48b1360bb650ce87ad1f7efacad88dceafc97557540e1dbc8efa3db885d692d18d38c3dab1affc60da925b9e43bd4e7e540199c1410fcd9137111405f0e4cfe014e2b581b36ec6f0d7e51655186a69cf2b56ddfae4a9d5ca4ff4a0410cef6b2b83ee94522335ac6923228932958e9fbf0cea3c9af390d9afaa89f643363ba3dbbbf65ee708d6a8600bd09df16a4e5eb2355eb4cdea3b071c00c2d9871a3b0b0a21e4a9f29687f7315833213d864c33e91c77c2337c2dcdfc14eefb74f889f408e854fc7c977f3787242a7287a0a4fc8f099fdd266c8dc6254feb47b8ba29c6cf8efb852343101c1a19046f6b8e6ae25af5339bf98c35120f9d4b9d853b61620a12a3b1a502fcc2b725ab204ae20628bde608c181cced2817d58297b96f7acb5cbfa9f49a1ffbff359d7c2e0bfb70fec3670c4d84141286b6d964d3867e87c5ecef90cf93e589088be9d88532ae317101877d353a513bc2d4aec029caf1271ba3a0df82cd30e06706b27d456d32cf310e035cf64add2cf604e969beeec00e20f1123aea8ec01a263bf12454a58ede0517eba7886bed95ad1e261f372b7473303f7fde0c18b0bf3547c1d54fdd1d08192ded3ff0c72bf4bbbcf20980b7c4eb9eb7d53bae9ae8db13881d8de207b9bd00973c10b87b9f1e31cafa077168582a281df4c53a30678bcc9c353992b6a6f0f2ac4b2fd1f34b1764a7eadaa1b1b311839a9abaf0e22aa768b91a8deb84aebaf85cc4a5e440b994b80bd0ee818dce79bc6927b9b15ed0c724606c537d50929c68fc26863b5ded397c351065e235a5ca4b799293486d748d2b84e7064d83873adf38e3612616152ed2e679d0f926d53f9522b23d5ad6e1875d7d3de104e85ad42e79d8759ead4ddc48e476aa48beb140fdb358e513a66f30e41c1b588e8da2447d760809a776bb97e0fbc6f2d9a43b9f2d82f90086877139ad6dd0eb98ac88cc9d0c71fae03d19f9dac38d1f19c42612c2fd493d71e488057f5eebcbb8e8c639eb533aeb0bc2d129088694f1c8b44774183d5f595784dcef5dab5d5d29c894ab511cd46b1e07718466fcf078149cf29af272506a4fa9dee857144f25ab45cf3ba85aa72968497c090d26241fd1688501c24feedcf74d70c5b3f65638ce507bbeb875a217fb5069623de1af627a47b84326b1fc3cc69193493a0048309e324923d732fbb3ab7b4d8e1c0025b62242f132fd221a0702133df244326ca73a08ff0e5c75797f4d97e803df0d512b1c2df6321c1752d9329aa425a80e9914c55651e08e73b49c1789358034746c187388a744b3ca9278411f8201625f4215597d8a2de997f994f1ccab747f13d085679c6dbdea3f0d0e9eb0915aa193853e7b810bb8303fcf2acde643a007957384e636979821a865ee3277889aa8bd16a24a0e4f24f1a026968bdcdae5ea716f9407f71cc81a8db5f952e0d68e4d7fcfb98512b06fa8246eed227c814fbaaf033bac68e2d24d94f3e1694fabe76c7e5fb018a7425efa8657465345099a0e910f844a3e8f25ef753879414e3d3789b9fd56a741029dbeec80d0fa371cc0ff260a6261328e4a656b959ee9cb946ea54c4e822eeca0224ec0c12e4ae344de79f43ba8c0bb515793e8a96b7b424af9af558113cdb7a1d5b9fa38630aaf4d1980dc533c158b8e1180bd6980172abe67d396bc78bfede9817ab69227662f8e2ae275291061c25a77d029fa0b1d551845093a01a3d26baa58b74a786fb0c716487fd4795c0b1cab11ea1ba1f3313b8397d9c68fdb66d916c870f290333a901d48a50447bcad814b551da9cf4d77f4274434365899796bcf9bd1b2fa4cd1ce3ac95b389d7d10a67c6c05878748132f04cb0682dd5edb4326910f558f04aa9f54bb8235e7d37156124b8a080b08f4a759fc8e9b67ec1aba925917995277369dc9635d26baa7e769805e724ea9d2f21764fec740f46a95937e2bdecbaf51d90a2d55513d5d1537128ae0022bfafbbed9fdbe15f43b0c07a906529a90876e33949789cafd555388be0eb041dcd8337d1efab4058cb6b27f1fe58c08a44e1e09a82e0eaff09d15f922d26f36a9b7f2a711df597a856a4aaeac671141f785f4f95e60802b1798c9829ec4f30ae7443e76a677f34edd9ab1bd7c85d9fecfebd5b9d543898a865e0eba1d6919b94ecc5f6a997abd0837fdf6f978f326dd8c1886a70a4a2a0030b35f87a3017ebf3e8c8fa6ecf65963a2d942d5b3225433fee00b262b26de4830ae7020e4f86b000e2b676ee068cc7a93515e2221166363dfaa79a877d2d98f4a24b44da7ce1a12bb5e56ae4e1424c625a6516dbd4acc0b2c43ee3725ea58addc12b54c53170b748b1c84b2b1b35c725c0d8bf1d9c44576dc212fea9037c8cbe187d02b2d188724a919afac49e91986ac8533b8bdd3718ad8f70cc8d399e435091a0143432ff262172ff7098bb33f659f92cb4bcca4e9a2d9882878862a42bef9368f86c20c1c67b48ea47fa0a688bffed32bad0211754c358e0484e5a194e6a0aaa686678eb9bbbdfc9ac7b14d6945cd1d8773b3cad8ed6af8e51093f33bd53115e76daabbf837744c2c5b2f5f0bce206010bbef5f382107c69e7e188b517b736cad5aaa2e9cd4795009dfeb08dfc103ebacfd7b65a736928e7cb134dd81f89eb623d61dc809bb03497277a0c4ecb38dbc2a525adc4d7d5e156d976b6a801211b25db8420f6cfed6a794548c3101409a75b462d3779b3cdfaf849a30f469af7a60da9488ac0ca91fa9d7f6b8aff0f1b2951b4e003b591a5a1eac0099bd3c3b00eeb87dadf24383103f23ea3b430f2d781f18a77b6deadf9ac7270042f77e76e2de31bcc105375a925ff7584428ca0706ddf13606569800c51c061bcd6857cecf75b5d769ce41d7ba19ce26a8270fdfa0e41f7161dc24c6f286dc85f0a5fb5cfdb3b0f5bc327a6d62d07c525396d1b7a624ec231c8030092beadc0049f765ac63da1d444d3a41d7956a5a69462171920bcf223a925fb4e0d3e3cd307318c8bb1c7384e7abcaf442596fb7672a23a62fb87db8524976293c03a3c86a7628ff54de31591b848c33fd5445bc469d0744a6a6fef251878ab1bdbdb87ea895b974d2c290dc2ae1fe1ecc49349aa384450c7b022a493d22b65f161a0cf483987e9a896f4dff86bd88d56f55991c3bb0faf65b87fb5bdbb6f470c7c4784812d65882a5603d107af00ac610c5a373218b75f17ef965ffef11248eca0457d1266232bbae3ab0a8ce59d88da49e1d659bc52a32692b76483c8393ec5b0331825fa2b95991a6224808dd76e6055f065f712acb3d4376e3ffc647b0e7e3133b0ea71176efbedc5074d3f0b0913fb4459766d5491cb7d7ff1fbd965daa6faddce6f8a294f2432e5617c7792ccaeb20a79256d4476611b6c105b8ec90f528dfe4d033a935aa572da1c97eca277e7c0b5d6e12a0d93c44638fc34b5f3ab154ed14dd60ce2bf9ac6d72ebe64482952a8adfbd8fed65626b76c1eeee1c9b031eaaddf95c6b0dfbc126fbb3707bcaaf1672b42ac38d1041822e1ca9dd8be428d98d4428e98143352524889d1e9c5ea52d339f8c05e88035e8e2385810a1ed291226dc86e530e844f3995b7aafb68943cdda3734a412a97abebefe1ac48d658662cab0a61729be67b60e72881003afaafe8fdf5dd4d053dc2d0ffac7b4525fb0854c501000e838231dce54319c623b4e1301b97e0f2d576f1cbbf492dbe64564060d017ccb4bef868c64c5299d8b88c4303b123575cce23f4276cbc2f39a85d055372fd65bb35f92be2a163c9fc874830c485a6e5824f2e6c4f8b630268f816981b05deaa16d79c2389c71e28ab8a2282bbc37b17915b03d133d22a47074783fde3e7adfd08d0e848c3d3de83685a1b682313a7e42da6293df0fa7e970f85140eb18a2100510e5cb1174fc869c3206b0d7841ad484fae91fcee28a0e98bf6141ff9c9338f2a88e99562861a0b6e5b60fbf1482f57ffff1d6900a7f08909e580dcbdf28712330873fc0063245ebc4262ecfaba79aabff13c70bc2de9168cdfaebfb792485a584edcef47bc2e1a36aaf9689bc6ffe8677a11dac5168dd36e8de63f9c65934b0becbfb144fb9405b6945e6a9003690625630cd0e49fa943adaac278f88cb475c17efd172c916b2526a0e9d83ed760ffdc438ba01f764dfdb2210e7f3c0ef13a9aa4b28872da8343a4b6ab373594179d46c5c556b6d381cdcca5a5cc82e9bd5d6bbb38b8b078f206aed6f4a2100a72c22ff029f7236e87b17159795c4a94969c956b6d08c65ed86a65f75cedec0b0f64b3ad40a276f7b0b91742b9cd27e5a57eb7817b42d7b13f6350ec4afd41dc06f6a1dd3dfbc60b11524115c036466ae1e006148832482d7c078da34f8e42fdf5110062c121d1eb2419b033c48b8c6847f8f66375e9c2308948a794abd0532d30cc61ab0e3a82841933fdfbb60e62d94e63d6186ba4d33d14324c99ace1631f7f9bcb4f73e66f6394ca781405b7f63d92b7d8c6682f56819bdfc40e6d1c4bff247445c73c796d35c6bdf76a672fcff24ccafa703962b0f0ddaf2fff215b934c82e4f2a1c7cd7a7e1b0e0710ec2bb7f6d59a90c97ffce9317b04d2e74066b55c3457b4ded935b09e71fac4e6bf10a2767b11d73a616cce98d15e1fedaa70570eb0a67bebcfec6b67c3ce45a12e06120437f3ed34aefb3e68975915bf85f546b2e492d977ef5dba1e5b76e21a51f153af966e1729c4cdf40a0b02fdd292658b3a0785cdffe64684bf7bfa084287c7e84bdfe9ce33814ec2f5be1fcce8dd9ae7a81bdc34bc5147e38f125915a5c5d2309c50baa4ffe7baad5949862f9b3e54e4038425b948dc3e3e685f5e718cc72a7c24c7f93b6366591aa01176c9e5709986c8bcba64d4f65b39f86dc06045ad81ba5a0e4b3505268ace77e84626ea331e62fa992b972d5aa26563ab300f77ed4326815418e4d3b00b5bd0596bfa9806e05a01ea1103fe5d915bd8ddda0eff2902e930d56d69e76269f9769b9a6d80133780ea7fc9d600afa8a19bb9eb45dcdf89c30163529114af566c811e3708c905520f66f9b488ab7ed5a2f042a8643446b145656287dddc4b4e2348e64ee8509c198744449dfe7bba7e8abc01599310b81df1bff76ae55fe25a6a574a1e89000aecbf03f9e5ea3d69322ee3c8f9f2a0455e4f46330fe43ad2f0d57be672d876fe8220d724e2a7a5f16c86a3b6c3f38e1c4567838ce40b4ac24d509753e31ae6e2eb9b514fb1c902c72404161b5157a580e8d2ecae7cde1b6476ae46693861d0e57bece4b239b4092f8b54a9f44fbe04efecd834c6f5bd546ca8a4e9977e249f0c4db440d6f0a5bcefdc08c2bbc4958733feb546103b1f779b14658e86797b05255e098aa6e83524e56325c0f84420f16171419c9edbdf473869ae06b9b32ecf05a5b874209fa7c0f95b19b011c20867bc80a7799858915e4db0225aa863970da6f526c75294910cce04159a30ad2ca8a731e2fb58eeb9ca6165effb15bf6d4630ee5993249b6b35b508a4ff22d623cb76502ff31d47646fa1d68b850dbfe6ca3afdbb6fdad534d7687ea79e0731af428ddf81a33ac63a885c1a08ef5bb2c62666451e7fba46b2f27318224a9a8d52b72886e88331081001f6e4fe147915ac417f4070345a494199e544193fb713033aa2792599242dcf8318c00a044924253cb43e24b61c1cf63834890f8bde10078d94d1d61fb73cd65e75ff89a3d0015fffac34b150b1760f2957ff5695d59ab1634dfb113877c4ab7eba3a3033634c10226e288686097c1da7d650be1f3cda1c84b1cdc9c79a5492d52f64e3e53452720249107f7044ea6a9511c4d809dbf495d5e1c5ef0092957e42128d72556a0dbf844c5b3edd9009dd7a5497a0af445509a3a8d68daa0a47c01e802b48a9640023c2bcf8740e02666343f4ba687c59404f141eb43531156e983005d0d27978abbbb75b7c8519abe245c8cafe1e2906b892f3f17e564dd039779c99a37487d795495c6131765c85e369b7225b59c114532af32ad4d0880055d1d60fd9f8f09f57c7107c424a9425a29df42123287fee69dd54a8ef7ed25eea8f12d7eaa11c6ac58b135d5615af1dcaf0591090b1d5a9060aea8a520464b48d6c296e8806b070b6971325dc018b3ad769e167f3ca5f160087941dc0be761b269ce9ac12a51f406d3503b3594ac3d18b1e9432d9eee59350f9b41c7cf92baca2b2320262e8d6d990d9e8c1fbbc1f1ef73ca8dc32ab77f185fdd9264c8df34c9e6b2d0a446b83ef5b445bc0f9cbbd0a197b7c98cee2dea9ef1a6479a2ce52078fb452beb102b2a83e0aa90f8993fcf7ebcb6d7833c2f4b23333d1a9629b5c3354b4e2d2e912deca486802f5cd409543a86998c5f6eff947da508b7aa74ee5fda867519ab385061ad2624d1a0de549438bdce6ab24988e3cbabacd11499273d680d02709cf097c75050e71b98486a049ac2453519ee559aaa29a6f69d0a8f0d108f8d14f9dc2799e5b1eda4a53712417bbed873e30fd717574543ca5efadfe8bbeab3c5d1a4324aad8320a06262737001d9affd567939aea1896e14dc9e9f4a9587725ddde690b548114856201ed707169ce113bfff78f9486af9cbf9bf545d4463c07f9af7936fe123dd3b2f79a160febcdd87234cc65d63f92c87e5f49e98c42c83cdc7b7df63276a63e0ad5c53e0d8e014007c91ed607367364d825a39520854c95d3cdb7aa4d048de71550956d0cf0ad698e57a353ae0836ab5760f4eabca21ad7383385a735343685dd514b943713a2859c068a1b614c0da93489c8547e6c8ab66a864ffc1c7a1290b0134eb44d14f9c87449b025b00fcbc7af2b0a1f7e9f39e910c0d1777b0a755ac3b54efa699b29deefa92574928159d3838d084a8004c9fcdf5f8bec078d68bce924b365b4e45bde884e33beea74383f1398a8c062948a66f9365b3d7a1085330e09ddc443060c27c1dae2d61d96842da0b670532b0acb1cee20677d25230808618a0b924da905822656037eb74d84b4c4894d8071f25d8eb2f35937740308fc5273a1b40af8ee989eaf294364b2b46761a9464a424d1db9b6f41bbea927e3d1fc6fe9f322862b6f04244e492c277d10ad35e5d7b7768e613556e3d0ea8675778c929e97731bc89d2d46d66dda1611f2943ffe49d9299d7c3f14c9d26c49c260c854ed4e662813c4ef52fb41e4ca979bc080adc678d0834baaacf640016fe05cb18986c2bf0134080bf9994476ffbd1cdcf8867e6f3176e58f9fd071227146cc6abf5e2801fae89ce80486dc05141f4841b48fc1d7b001db303f2fb790efde316f2d436a4aefba65ee9226a48fa65d54c9b0bfe1e974b55eadf8c61fc7700e15b752f4a73dafe33f267d7556716957054341d23312703a703522293f285f6989c219e43938c1ea160c47fee380dd404bd88309e9811f62ff93659efce8c0997dbf2a86d055df2dc2e27ace3a624596ba784c614aeb14a1d8b3942aa64f86d922509bfdf15f82be831034ef86e67d5fc952322671d9ac2e7995cf9e73b31225ad403eb3ef8b96658a03d5156e7da85f9c42302f04377c0bc604a2247e3a37f5684f499da4804d9e5312de00d91d9c70a812502ddf7f03cda1b7fcdbcb1a20bc0206b18c3e8d1eda736a8c143e763bcd4662bf67cfeb2be1f998c974ab808c344b6eb49ddfdc391ec513feeb15bbf986f2c57513496061ee57e0eaf6270001a0db15b361d936f6fe9a372b8b2d6989edd6a78a549cbe4d933c84446e83f24abfac5cc4c5c394e5cbf15bde511127f5f3841c88a9ab13e11a63e2baefb80884664253d9f5b0558385d5be02860658280277e37904b6f7111decdee9da0262d53230802b1f2ee445cd2c2ef4311fa244d76aae2453224263221c529d212388c91ce8a9f9f180eaf0fe652245f1c06eb5a278ce9a6eac52e908757a54885a9ee256f224d2f942b10f1fb5083f7a7b916b376046e916987d12729926f8651d0490c818ee543afec0a027adbe2a18f1569737313df00c0920d74036109a5b241ef56645aa075d4c5088e9d67b24e868d8b741f458411fda9141ed7a6909a81597d0d18c1d253c8d21d2d2d9ec844d66b14cc19d5545a25ce1f84dcc299c87c90f36e7b7ff3a086160aacd9b426f5eb1f459a64284dd019722ae62fdf4b8bcab19a951b114af4f79aa757b100b610c54c257016f936a7396a267331c554bd989c6d79ae3bbe0ed40b283e848120b51c99f59c41ae6a1eba79c2c726dc4cfd1e740083b012384420e472833ac4a0f07603f06ccae9f083d0cce09b625776623c9d24babe82c1a74fe19e385bc220c742a3dc5935c788d7771b10f987ca2e19d8f921260814c034dfa7056a01f1c193a5d4b974a88ffc2d98899b15de7e3490a647e8df1716291f003e0eb4861a28dd9fe1d656cc69537d4b16151945b22978f19588064b246db992f480f975cbff029f041e332a580f1a4b29a6006d0c2563642ebc3ceda580da4bb79f7aa43587e1019c208552aa0bac4baeaeb3656047a470f3348081f12bea5b02a22694329488e345d1d4dc137740be43a3acd38857a296ab0c5fddedf9bf471058ed4ef477c0719a0524672111a725edb0e11b9bdaca9898d56b2f1640353bbe032ab32094941f74627d41d7cf25896c98a4b2a626ac62c94517e1157f57679481f8aabea41b963c65f55572a3fdff763bb4f4a78ddd1583c9fe98e5e84625fe5033d70da2fcf7b14f3727e953c52ad6a92bd48b8e5a8679d6254256cba30e1f0344dbc9b894fd65d73729170785bdd2f7f0a139b181e48ad28dec864e99454f5abe86a4d7b238ac814d1da9197d47f302f8a38318bc532c7a24189aee2c2f6b94e509f0d68ca1ca568f152baa7522f527e42f150413bc21f03ece9a7242d7f6af58a137ac3213403dcaec1fbeffe5876e1aee9165bb0f2be77189a52dbb418acd2a78c21c27dc14a3cfe7fb61092c804c17e82d6de6714aab5028f0b834465c0371ee78c8daf9cc64150a321da1330936818fa63ed5eee2be01c06c43ad6969cc8f06e55614508851d075a91e1d875b47da99cd82c26a2b80107548842af111c111805afd00d4257867d95fa64c8a3ee30a88601ca8264c1f173a30a1bcdff158724e65a976cc51b56b4f7ae8f62d6ad0a55bc0801960b2c6bf6772a1d5429d8509dbd7926a0bc82ed52d2b139cac5d09ecd96cfed02e2ef5daccce65e26dd722f71a336f20ac125342961646b68656e9d42729cd18495f67009be8bd4b22946ae8ac2f059dc307d29bf49874c00827f092f761e1b61fcfd78a3853247ba60257fc3ce2228edea1eebd4e6b93f4129454449cd2ad083af0d04097a90f79f69ef7d24b98806199aebba88af48e7cd57bdd26c3fa09e1608a15e4414307dc4af422ace2c0a4e5ec359b58c0f83cca8185a6b71b05fc0ef33400b5c372d60f32947bfb6a303cac8b8fee488214310ae5c05d8ab00c00e3a45ceb72884a891189a80f634b51ca392e020770801042679012801d5195c95fc817e81320ee548caa72b30757c5e07e4d1fd4ab7f34a425acb3a11c16c43a2dd19d83116c10e6b1b06ae46ddf7a2867dbdbb733097d5c12f97117cfb5b33ae42995ec8da4154b08c34554f2f8801df92258a78e3e90c9d23eb667a97db526a9bb5d6e40240cfb157576772008a8f189874ecddfc924fb697a44adb189eed870414ca519c2219b4dd41bc788bf8b79213c2e22c38956e8f51426560d3bedf1b34213e0980e603ed3d1875ca5178453ee1d6631ed480ef9e46d1eb2be46e5b3edc97c79c658bc41171007b6d3c0ea68e76b3b498d7359d8a3b97fe26786ec3e1b233bd0ed0859a7c3f438bfea85a8a3d43cfdea9887cc339fbc548fdcc5415525b4b125ee84c44ce5f296226f30af9f14bd61680863e5cb5d81f0f1c83869a05832dca6b47611a017657ddabb7dabc88dffabe63fb07119efbbbdcfc2108a2938f718230ddaa692972b68385dbb0755594191f1e1b0a10d09d65258b383da0bc9939f7e44d891c24ebb9eb6eab7cdc57342c997344687e4abbd4b3d84d75be207718f923631d06ca4e4286580f177df4139fdf02982d9ef53f8dd489a90f487727febff3eef4b896e3584768b5f43b24aa588107171f68a329a8830fdb006be6ad30ddaeadf6fdd5201f8725ff126d75e71af7cbadc28cd18eed669dd1fef9a8caf42cfa1ce8f3f26ad6470dfa2107af54d84936ac606738e8d18fd706c648d61ef37103d760ddf10aa5096cb55e1c2638bc3d146c894626d4286b57045cde57f89a8850bd84630cbf1fb25e9aac786a309ed757299bd7f2fda73972b52e18e26d9995faeb98eaa0ab9fc4f53751edfcc96b31e71aad90ad33b1ed2b1b01a397748ca88f0553a97469fd1909b9576aaa8add28ffc7dcb34078bba836ec1ffb20e061603756650b2f5bd092a526a4cb93733377259812b73c1666e5ee6bdca674423d658e4f66c76f29096b3ef74c2cbc7b3ab7286a269a4a8691dabb27a75ce1eac81f0489d06729a997788930361cf7286eeed80a22fb6faa2304a23d2345d46447b9692f2c68e12c4c1fcd99e0dc81ea5fbadce7a4822e2f1c228f2d6237ea68ea88fc75f322776352547c55315899d0e5170ff98c9518a0bc72571e6f80610e12784c979e2c0c6934e040b9641c5e00f631ba5772d5386665d96f104c380d2db9fc14a555ad808674489c4aec69f12ca93b7f75e8f7163ec3432cb710bcd5e20a42fe247c4fe9199776c2930961c39afc42d59dded9f2d2920f89e28dcb138715464276b0446a5725b73b0cacaf3faf25d4a66fc4233bb317bb9091652989cdcf4c40fa1213300c3df54280f7071823f239cac69e4052603981961e748071d431d55a3e5229cc29d64dd029b3437bb928dc26899f644ea163a1579e6ba6f6d6bd292c4caf01d80717f6501c179a20ccd9c3c924b1a5757fbe046de2b8e3047497b41f54d152899f36c1a828545adf00ea8199360ca30fc28544411b18c9483cf7c87ab944b8481e86c0b73255e1125b582608140d4bdafbdab8faa75cfcf3d617350c53c3fe7689b0c2f1fcadbb2f443559ae087f40999f6fd9ff7e884f2dbaa13b4920914629d88fcc30743df59b293adaed4f4b7eab49e70150465cd5c277dee2b6e5a252ab37251bde0ebe4f6c5d5570bbfba6de2c8fdecd116b8994b25b24fdcbb961a7bcdef920fa2e2f73235cdc1f92e9a7f53159f0755c29398e5e4dfde12ec779a3fb2fae1130430c99850e77e69c4d84ba49baa6bfeb456dfb3de4461ee1655d90ee772a22947903f7ed696cc2046781026ab122494022ccabb38176fab080064e808988d5b11e5bf4011a5165fdf92c12e94bdd25982eb62db37fcae005c369e3cf1aee8ce4f1e70c9c34a89cd984c746c3397ebaa5cb72b3b52fa3ed2d07135b1a04ba351e395273e7b1f048bcbc8b07c731af04050795aa6b8f4b30b7b18f94dd04f5b03f1b2577e648336a85c795521efd2f670767fe7c55111a633db43846bb40c716188651bab3d919cf7629e61832b088eac77510e984bc5692e953b36426b64f2fadeca1dcdc075de89e265bd540f3887ed07099e469152960f39d5e8d4f90cd432438d1eeb056f80ac6d26fe9c5246546bf3fff34a8184ed4d1d956dff15c81462e51a1ce14567f120673c01f9237e1f646a9331853bbbb61bf90d77d37bc5ed544feb13c39091ca1d99d52be5c8ce5510576320137948250046a48c08fd8830a9f64fdd89dbd590a77fa8d03efb3c6b41d35e3e6a1b0203c5cc5b0281d5348b27c77852108b947bf2cc4f2965bf944cf65316affec360674d0fb6028a788f2e9663ecf462efdb81410bb39d57a884c56d8b4ab6b34ee1f77baa588d0ad4abb587ae3c5d0a4632bf7fe0beb79b99089a0a76b4471681c5b8ef2d2f5492a1b7869aadf385739f939a9fdb499cce33a04e520fdbe0c99c3a7d5f8b1d09cbd5f7cdb26b6912c037767f55be2b7543fd969af7927ae1103fa542592ee3506ea0bc1a7a6e283b5aec7d42ddfd5ce62b70dc035255d6b2443158bf2f14487f49d0e07819028fcf852e391602729a11b3afa36b25cb80ddd50488680c62a8f8481a5a5316e4aff49382d923288f8c58590fef7a65ab4ea268f3a1e31b89eae4265c8eab57a2bd91fefb98bafb15cbaff8c2f6c790cb453953c8f136b78095d665df9661715ce287dec21babcf6f059c29eff786325246b9d410d6a380fba941c032a2c224126dfa2176e52a5c076ed8054566b30403329cd2ac3a2e08b961ae8eaf355fdff6ec7e0a336d64b63fedd55c859299dde6f72b9a35e83a00bd00abbf1d5adcb123318d68e5c22ba5c538e9742145dc7df79a5b2e093e8829af78c61dffea9ca4c36563d868ee7aa5c358b3a47da8446e73ff9f1cc1e240f11204185b53a7e80f0ee75ca0c55d22dd62f0ab5da09440c433e44eef6b02809518481108718dcc65c70c24c3f85ef9c496ac6babce7db0edfb1d3a0ad09f4e140829b93f991f39161d163942911acdeff570812725fc0086d0797a3786e7162f9e09ee7a093e87cb5efba667bb0da9cb5cbe89b44ad4d8b0f3f5af43bf051bbd0f15989e215f034968fd17a4702121b779bf82e8331fe5bcf128c2b2f521082dfb3b672097956e302b21cb996f38199828cafe20240c0a9acad9adeaa9fad8a331cf65f0aa12981bbc0889c1c8e60a8e6609c58b1df0490c410a28e3a95598e86e3d9d2c45114747248702f5cceacdfab66d3cd4979acdd89d9d3177ec54a82ba6ad7a06a9ba633f17a712119d8f7552c80d124f722f087cb1f8d3397011ac0e1c8ca95b014c029619a088ff660433e84716e3919821cfe7fe00514eec058b0f5c32b8fec9598e3dfca54905a226317850bca014d4c8bbb4ddf516c08b6f14b17e3b3198c83a7421c77f3f69513d6ee68795452f89c22e1f54d2192f3ec8e3845248160c057788f66e0743624965d4ca4d5f6c59bb76ec3cc4ec1cf0af04105e00d95e53b50d652c1ff207d1346f526385958f805a8761368d29ff912217e836f7b1a8741288c18fe2829bed20fb39cb226103a58aa9f741e9ee42c036fe4505ec6f163cac09a2df7465ce7c1a266c2860c3235e43ce7fa00e5c84cd3d1859bb1c131037e0f28cf0802b5dffc1dd33940eb7b996b9ccab738da875aa3a98ca9eec14dea3c9763278aa0885dc9e83729714e38f992555ad490dd062f895a21f9a3bf904147be8bf671ee54c6873f0e3e3446741eadcc1da069908d12e66f2f1e7c957c3540f1d87f5db6dae3e395c40b151447fbfa509c8f1b94646a2bc8c652273e7ed29dec33df3493052252b6bd7e4db95d07924853a6719c24614d1c9f6d58f7076865b6388d8e3bcedb86d33b4cc5eeb3c96c8d11a67555436cf700b202f8b115d294ec98e912de376436e82f6d939b661448dc3940f6b8090b10d6ebba889b935792d351ca80c37c1bbe8a1e454d1677637befcc8905ada70b29a6c80fd5b33d13073b30df53fc2abf90be118b768f85aa44399e9c42179c68410db49938e53d5b9b78c35b5608338bb5b4482c0d814393b1545e81e5cf9647128e21625a26d9dc5220e462e09a7d9adf9a1968b2b576bc7ca0ff50575919a5bccd5589ab996e6fbc6d808f5c1356b10f64750ae67ca4d03890c66522c33d71cc6462019dd2757ee1949a045af9cca65dd722f6920cb888fdfbdd85cc82077904d98a7ebd60868c4505f4d4c9b711b406ed7856476fc86bbe489c0ac26ac6e06a4a3a26a24d4cc2f93af7d414369219c8d246d0860d698bdb7d5d0073a89706662243140e476d37c86dbc8336a1b65c1efab9c18a272bef58fb850bfdc98c1722f2e136c39d0906da848aa4f456ac8e628e12bce6d8f38a41288390223819be8c53833b3a31bd0d23b4792011d6cead6e15ff7524dc30038a3e5c71feefff206a25754c0e62c4582e2631ad4d5e6294d7f56aa12f581cd3242a4237fa82940103c64701dc71012bbc1174e6c0603f7f36a920a060483de9204e72e529d0a06d659a9eb6a4c1bfc1b3314688579f9d05088a39a11abd3ad8b6b893454734b791c008e98c9858d1025b3845b2a60ec85da62a807a9a32884460ad518efb2af340b81e35e040a8266ee9c6ae75e3fca1f788e100c1484594df3d21649ba102688066582f00ac2e0fdd45a6bf85886e2e30f84fc971cdefb71c1965183458efc176c6502a02028547eac50e9615e278848c6034bc042b191c8bda1456690ad50472104e5b64f447891f3bdadbd6cfcb3c494f2f6a41db1f6121a4498a2ddd569d2f023a5f82e20a4231aa43eb88e06431461ae43c3a502d1110604e6a41a8eb0f85c0f8737a434697dc1110aa3898c7374daa73a2157808e047e121de1efea159257cf5c528514e4f7efe67e178d5592c2cbfd2198577d890dba1d34bcf4c21179a24de9e925c80eeddcb2e40d544383a3fba152ef49d5ea1a5862234913038bef678a7e88e7c45a213f7ac28117b487ccc7d7043d29fe553f17f2b953bfd5cd59bd125aeb99020345e9195bf1bae112e0e571c4f355cd5b917ca3340909002a54920238c2b88cb8d1ffe6705d4129e4b27711a3546847163c5a69813df49a09a5c56d6bc3b5898db891e931d2475c9488bbce764385f0800038dc81dd5993119645abf0188e81b09e10fef2e2da489692c090c5d967a631207d98982d4e54b85617766a854755c7ec26a8457f48214195ec2f23216fbccf2f5d7bf24e2cf101c7ec9f3e534ae57da5ee6e83f9e45f45096c58d7a8230d1acba9227cb5b48828d5e223fdafe12d3ad273058140266103dc1b1f0721e107dfa1be47eb45622b28743dbf1445f114a5cb7b6be308ce6d766cece27c9e3d1b1bde8f0817d851291a82a898b074af9be794ab5cfb4e159de3822cb28ad1d68be6a55d66fb9ccc5e10e9a30f652782d858c98b0fb0273f286cccf15175c2bc6c8661ac9f638204b94f11ba1b8521937bba22008555cfed2b29733f827570a69324913d63668a96e7fee044b7fdb28711ba266a27af030f58b971070024fa463906bfa4155166c02438ce629228f33af06688bfe7accc1577505ae9c0f55fa800fa932735ba36bc30423fe2725eb301c066b9899a0e0efad3fb6eec42b3007dcbfb75fbedba6eb5f1c74dbd89c0cd6d3f4ae4c2d14156e3a3c588e5c8db0d2e7d2ed47cc6d826b80e2b177534a52096567c13916023bcbcf84b76d1555062845910dfa47114839a3114fdc4ceabacf1cc2acfa0475918d35a4f061f4ed6c6b03eb5b257aa4c6bcb633a8f5b1b0d9b8674db3b6c55feae19d42ad7a45fdbfcb342f9d7ba12fd37369f86d6447ff06d2d06e3c029f83f29f20c300b8ef69c95d0cfdba994d6354eeb6106c66c99c0193c560f5b44127ee018f12e2c69458427b3073f68dba556702c31796c644d91ddd6c0a5e0d64ee82a663d259a55e60f16d5b6ea7e9c6232a762e901f61421cc5370b4a60061bc060dc1516acf28b3386e6aeaf09628ddcc947dce0b625edaeae86bad41d48e52ab536c04b8dd168928b38a412d9679d4730e79c24441f1d06367bf7039f191f23aed2d3c1e894f0ecaf948f80be8f366d4708562b9ff1102061f7796decf20858c24a395372a51e7358393ba86e56b0ae53235f5a204a5f43078e64fcac49cff04310a1b8e1668e310b40fa57e92a46f3e6bf99c66636ad66310bea5d37e4c466422cb7a0af11c602b8a55459f5b2d5a5c6dfab5a0b36616a5fde7a80f29556e0bb127271ca9f02c77a16839a7be6ca24eb7eb326c17e6c592f98506c74bf20178ab830f02fcc018ce1ec1c96e76d7028419213fff024d3fcd6994458b8f1f59b7c6960719a0b988b599c498dd12e48cefedcd2e54a3f31b79d2d44f076a061d4564c2e9248a3800329837006aeb41584b8dfd2db524a6cda4292a4734868960d2841f322f4681f1fa793476a2ba51c52220da1b154eff9116f8dc831f985440a8fad5703dd85c0ffd71c61f3603838a101148738a6396419edfab1a73a3673d0ec449d16eec5fe84b93c3062b6d5e03027c2a20e517396198aaee311c72911c019c9a5baf3cfb1dab124f47933885e9fe26a9b9ba1312a89a106ae8ed32f2dec18204cd891bed1ddda2bd786cbfab1ec46ed14f42cc98cc5d1149fddb33bc64c0f5fcbf04742f2a733dcb6439b998d5719f2ff3327a4438af5ff5bf5c19855357345f6b2e58c256bd6959a65ffcd4ff638b8602d5bc7da3ca7b1edfedaa1f409afba3cae9f2852a832dce89cb964ab8396a1776a064328b1cc5a1632e67ba620867b57df951f795b0c131c80866c499b5d68dfcdaa1dadaf5bfd6d579b9f8d81e0de1366559a407218ca54f9f673e216893b50e1ad9bc4567063ea16e3011d623d378ea1712d13f24597eb42266821d28309b1237dda73b44adb83b017e507e4f4d5a276360507c816f4fa226a20f085a7181728a9bc4e0238759e467f8e718a3fcaca690ae9f1220fa3422e9531db21a7ff8278716c43599fb7a5c709fc8dbd3a5c61b14023a7917d33ca6be210db55f96a41cf8fd090452480f4e93ad6d8489fd5b0a4edb22e460423a25b26a15ffb424376c2c4dd5fff05167c3d201e7c8e681f4536fcd3c86527e30b30f591e900149be93104e3e081d18a0c9946d8378e7186b632f3cd9f29f04657fed0ae5bb9cb6fc32752dc3829354cd08270826619ca5d8ed26f751c68a5baadacc96316a60d635c837164b3a7d9430fb59d8005a08f226fb4852793393e3766926421a755bd8878025e4ca129f261b00dc27c53c63620ee2c9c01f0ef4af15895a2432a54e38b3a2218143ffeea571111f6ba523624613099d4daa97ceeb662f9a22e207458e7523480d427b5503c54f2ec3b337d4034985d0dab8a73a8a0acd40632fa886d972e4a3452f878c0af6a0c86c8ec9dd4034388bb09007e8d7bab7763de8e070024ea4af688c49e3108fb0a4ced5c357a38a2eba805136c7302b0b4a6aebbeabacb5fd7b097ef3c2f32d8e68d3e536a43a3d3ba5140970fc7205d8d04d75f75c740d53f582b1df9ad85fed4a9453427c62cde5ac0638b9f7b41dcfd867beac9b2d365d8f069f125c4a0323b54d78dd76b93063366963771dc3408c37b853e17c002cdea1dfd663af0372847e4c4bdb26fc38a39c08d6ffdab94e5f1bea08805618772f12d33b33915401dde011ce265427a1643ec85164c5dcc50dc0781f6946112ea976260039dc24eba36e6202afc59231ed289dbee3797fb21d056a1eb1f95ce6920adcb8cd624b5ccb477d0f3ddb1cc4c931b314041489aaf09a7ad3e989df04be1caea35030d107a9ac15a3f93c98ca809f72d2d48b9d89328f35e1c474dd6a012cdeac0041f4494ce92ac071648a31358024a12c47609b4a98da4fe6d4f486abd911aa19f44462880407d238280d0ac6a83a88181de81fce6bddb47b8259a623383f2a31feb9940a32af918fd27882ece8365a0507bc1e8ee1fc37ddcf57339280e8117c90389d87de8af270f6e8d9e9188ec275b1f31c487dcb4060e903568f134edab38393937002412f48bb43a171f2e29c0cba600d7d1c9c7525feea02a81bfd300271284b17202d32531234af81e33a84ba88f402a0aa7a7829e044c7ff7b66b783fbaf921d4e5e6625e050dfecda90a5ce34db2c293ee634a37c648f6c459e8299977a8553024e369aeb49b731e91951194a5f6acf42e0bfd3a94777383ac9991b1e707099e421765da5d458d1baaa687898f5f0d51dc25fb5105708f6ddc722e0b4cd1e0a382a033412b4f87cde0918069c44da9abd45125cf0568eea829349632a8a399bd015855a061c6d07fe0a075cdc8f8093d800884eb28b24656ae2d201bcdfe3c2486d6b61f21f7086191545c0e900c71605043ebf1d8fd34a511534718fb78153e708a4c666fc2ebb5704943085e33acd9185ece49acd92198cdafab5a5b5ce37176a94be2b4d2698ed42667319040d82ac319fa107d5cc0044b1ea174d126a989fc650319a1a1a2c08061fbd99a11e6ba51ce3c353a9a622a8c9efd27dad9ba0384d28b9fed20ca42021d19cea20067d40933f3c33d43240c9a12f500459202805340e49479b13eeb42b26cec4a2d9006dc161c50d35930875712604a019de0788847d8e18dfaac7cfdcceb840b741c9c685e7d59c1dce37bac52a5c0c5c5d04b893be4c82114ce8c6e3294af3552a22ce3f3ec09ab522196702e912fa7600f7a8d21c9ddc45adca35badbde6afaf7060832681c47ea65ae3726480b2c5fc83b2a8c6f89d9235d33a5c824c73dc4e0fd8b6deabd811e210dc94d00e17c1097b7a09ce4cec98defe04d0aa4f49462591abe00d689464087d821ec873b2c94b5de15053c8a3ed9cb67342c6459abc820f7f39eb4fa02d36644313e351e9cd3a10da334ebfc32c7d642da9c3df02d719dde4761e2168cd1a326563684168cc0c412c010bd98d8c8f54720e028f188a64815a37b059377ac2a73c83e949ce44755c2a8f6d09b7d683ac4b233e83ece902e1fb2f8f03fb3bdd6c48ee00ea5d5fbc7382fa1b91d7240579664ab21577c51ad17f216a0f41e26b8f2ffd634eeb2a5ed09147707119f755d2831af94ac5dffaa414f09fbd77c5c28a16db3459f9d52065cf28e80a1fd01a82aeba4a34109275c08020ae2c2533304bb5b322bf6ee5873c196549be48330c2631d14aab7ffd9d2a44062062fa563e31fad4ad199c9c55373be0787b9f8935c05dd86674498fa9992ac2b792efc50ae7c1a9c00e574c98f52a194fa876c5f6df731ead7f9a07dd62d3787d967a8cd36a05d72c7f83a817d68d57e687a083d165107ab808331657b379f5d0ee561cb1ba34fde0b0d0c1544d34f348321793facc4393d174188ad2c1edf09a7a5d459fc5e85552e1072499f85adc77eb8578105a4363643b3210baf22cc9442b644ce8c0fd620b202d5f7d70182d879fada7af696651248b68d9378f5a49309663fca799878ce196532b8f4099eb2c972979157ad1eb7098bcf51a4ee4208460528c0af10314ebf74f32d63f0e992d2456b566595e7e1c96ac231385f77cc18b68501a7e2872794a0d3e7ab8369a1d4c0433e0f0c505bf257e7e55ab39dbf7d003fce376a95fc734505e3e14045a07fe2b5d08fb00c6f137a0827ac81008e142598b303a3514b6f1e145905c875770d7a349d9f6bd9e4a586764c257506436ee984d964b503983c549164de5dbc5eff02e6314ffa5a5f08b1b953f30a744104a3e302fed9e4e4c9f89712fc0fd57ff5c46e1295c136d5b3ea7a83e9d6061d2abcb5f10d433610ef546819898aa4910c5231d7db9111149bbe3ee3f4c7efe40e25273160a920ac788c020aa5b5905c08093c8ff7ab8fbb1db60c601d47b3ffabbd5cd0d4abeed40ca8ec1cc737e0bd6690925c58c7705d026f7e1517db8dab1f3f615179fb359fa86a1c2102dc7334505a13552be0d9ed83b13d5d3f7e116c93f43ccd0ffa8402ceda3827a48ce205c6955eb0666268c89127bd1dacc7fd4ade0deee19f66b912a42cbd50056286a9fd644eb9d46ef0c6a6ba0172c3562fc3c0b765a25a411ed420022a92f2c7ccb876e7b01821a0122c75d8c03108853362db244e823880584028338eb2f731e8cbefda137225218f1039cc29a2b9d179bc8246bddf915440ba9e710481ca303749ce79c6c706f1a57a68d54d7cd7e6254846cbdb26452f87f5a7b365063babea17cd9bd4331ee0e30670a3824710c4360c879096c8e82430990552432830510aa850b4e96e2f8bd8c342c71e9bc26bd049a63c9aa4e82d57855e9779ab5e1d7bce57fd4ef3a45465bb3fc7efbf74084860b42a589c80cef0d827d02f54bb619aaab05357cc2e5daa75dc98513483830c4279a04e48138934727003d18342f749924a604b56c318f8b961b1423294ea0b06a6da44bdb79e22b1011da7c28a00a4704231b6ad61b60298dfa19ccd415add9feaa00bf9298bfcc74edb5fbf3f66d02d4512514ab2b787db4c907f8419babc4bdd6b13aa7e544bb222b30d65509a904fc9f908edf72ae0483df76e3c1516300937a313da4a97f08a7efa2c1632914354f801037a00978777b9d306ec63e6f637a21bd11a88d7e332eaeb8386c72a834658391a5187d66dd8fce66ebabab50e289e75290cd8d8ed523bfd0f34a853f584069731494735795c80fbd618dd7dd9b12ee293161b46eeaa47b2b723d3199165f35319fc2414be1872666c103ca92d2230db15839af085b3e3f40964e801918d1a772170286b4543c5530aa33bc3c49fbc85a65dfae0e21c065902104f418be6bf727d1b22d90b0a6543e07906e9103d0ddc1ac60655458c1b4287d190f48405b0c873e2cb58a7ff804f5b078eb49ddf7d0b75bddd9d1a9410a832fff491e855dbaf98ef5e4543acf1ee898c35da829cab504541aa4e8109400bd90cecb7cd1ef730628dbb7c0a6a364f12761ae7ba45c38ae2c85931d2b6d257873efc3876616e84f01544a93bc462e42938d4d6b4200feeab0ec6837a0164a2e73826f9829170f3e440074f63f7c10b98e17937848c30417297809c75a16d30694f4bc08cf5de6a02de9d1ef90474a5ff1b760d9fa202154749d4b610014931f3d831bae4d418818ac09e2c189faea36f24c2b7502aea3742ededce83a393a042540595622c95edf0f54dca0d3cda4bf030e33ac03a093581f65e14b367f5eaeef2a93f5314c15ea923a8eaa67783633d5154f62628dceb54065c3ba471bae8631cafb843de611d1019cd27851b5e7a28a692e010ed9683255a3891eb01214636c9960f613ac630d6b31d1c0e2d06f97b51804c4174accd96277ec25a464a69552fbc80229eed0bcfbe1381b2346dd91d84eec61a3c3478074c0388b504aa39b263f4c0093ec8cb5eb250a3ac5753600b0c233a30d5890eca3449b48fb29b73de771b3357e3cde68b0c33c82f685bb74da9d952fad333042ed3cf0792a04980ca1986a8442d2bde2f695a0731a0f7e7109fd0542b93733e081412a27d19a4733e4e5e45d1432e69c4a3155cc1b1f9cef8121f84fe947c13992cdea6ed9e81ac1304cb10212b834c938bb4ec4c04b0ac170db0316107fa2fa20ad5674e4a571a7091b7d278459a1c2e84aeab7760e028e7e0baca157c5c01548cce9d4a6eb50b529cbb244645e91c0f5126395760fe2e48ef35ea70760f449d47bb79655e7c0ad2b9b0e280421eb7b4e6fa1608aaf3e44b7c6f1e42c109010092b4b884692f305db3871040826d045694989ebcdd67c0b1bbb942788bb867f463ada918b0f519d7b663188b40283cdca386816879272b035dcfa1efcad31c1fcc3fed19d7a28684a78eb2cbd81de6cbf12bd7093ff372f98708486f11d6efcad5e59eb28960ca31a0a6ecd828e905509516d2adea3c3539a7269132f95d2967b7cef5f38954ceeffa9b1e35d3019c76ee0417c14a00b57734f82db7e45bb0e3440241dc2d9ec8ffb599d7861fec31f4d21c14f1dca47fd35b32afed8fbfc791bb6949ccf21f7b40866d8b64f01f797a96bf42b6dc87298c497d1c5aa472f0947a771cf074ba0056e25c7387e9c308cb810b110965aab212bc777b4a71316c2123b6b036b815dc781ca4aea1e2d096dffe253c3f8f7e6c2c146a3e6e790c58e2c0309e2427482483d5f9a5e046c0e2561a41631b21de88c82ab5256d462a5633220a9382d51193bfa72e2e760a1086b16c69d521b1634d0fb28fd380f0b716957b10238a0b0d2dab9c9e3344b32bbb1600039ad7df9d9dc54692a9659a471115b8743d7d434b25e65d5134b2b9741387d255cdf6a4d58be5de937048b61739f15c14a113a9fad66b8a992ea520a26c818ce0d4b919b283b8994c39d31531113fad0d0480869047b27f35c156c0cf942e78c29e54730e278fda211069d97db1d0c17243415ebaf04f98711bf9f3d60473886b2f909a8c7df41fd4440dbfb62b37e19f88deb27a0f73e77c22b67075be918499e96daf490141729881f7495e5526b0ea9f84d00f3ba8e4b87ef128622d0002c553ad27ad5ca6082093e346bad2728e65b96b54ba40f00f96d352a2a55ad770f7a980a428be2b8de590160666e3c338c8cfb2e01bb77292df82827b2b133b79ac7d45dcb27615b99c96caef59312c2992447a9dcc0c25861122d5e21183301269b64ef19bb8e120b1937270094306cb43a0d00870b772ac8922b4ac6b8198d5dc58a1a3c0d7a1962e7d2d75eb3ec782b71b6318cdf90c47d7c09e6287f706c4d7eb19312c4c39234b4ba993d791a7c305117298e321d4cddcdcba35a998155eafd5cb901d1e317c0abed5bcdea277ee38b980ad22e887595fa075dee3ca5eb616a93e1f0ebf8622b412e593149b637004baa4b4bf7fb12084492065b93186cfd1449f9b15a0d1f594bf3306987a00a766d672768e146684c9b28df0af65427b6ec7073b3b30dcbeb311b0e3f151f2f71d8f88c79c6493267500999e21c5cbda1ab340812c6b9b1cdf9468145d9099b8c9da395755e571f0c1407974997cf7c26b6d1a066cb6c9528acbfa164023e88e5c0e92a5c0dff4740ab7b683b97879308d179480c6cf00ff7669247511ca44d102df3b2341e12aa0db5943ad4e97fbba3dc7d2938db020c9e7fe63e2609f02cd5850eab93dc6a809d424c765e51c2c7b695eaab1ea66971a9164643921469081dd6202f771a079aab5f815a084f680e9e75283fede9bba36360bb20b2b346ba546274a0f93557277907de54e9ed28197c0e8e8c5847cbef38b94c91f814143b4be338d2651d32fbdcc63828f3ad8619edcc310969859ed15dd78be8a134f8067160e29b8d34129f412de98fc31c12e59cd522395ad611bad4d7c5c6a0519372211d70921f0a012c40f28090334177b0e7dabc101593e0510ce406a395260f1ff1054db35792a7613919aa9d62349e263a9e3a2a7dc2c5de61e08cbae0fa23c889f62815dad29b3405e5dad8ed90d3fa1103f89796c2f50e0d36a659885ffaf2c0a980b0c7e7a628f69e0accb0acebb90bec8fac5aac796d8ebb41ce630d5d4db4122eafe9fc02a44da5cc155aa652d23f313bc94fe61cb2b3dc0ecfb8015f04af112a56d95225ec0c7a986aebe2cf5f43ecf82b31bc663e705eb301ed2d1381e704aae355ee2bf786c005c5a47e3e384f52001e1db7df57a69e8c9d8332b4d217708c58b27013843d91b8de07764019de30abde43c983e3369d21ace46d629879fb8f71cc2584889ae99cd47abdf543b819a8511d50cf8aa9849971ed1d417a305c54df400dcecabe842d956b85a42bc126327331088ebd32ab75bce881a5f1f615cdbabe008385fb654967135bf9c7c95c502eb789d7ef0ee67bd633836097fd73bf0705b973155b97a3476a9102bc82226a8fc2ac451dd8548934653f229904d0f226bac70882b2dd01f57c5c2e477f326494a2d26a82653abfe5c1ff71c7dabb3a970f4089000fc76be38cb2eee372389b0d67b7c408bff2e83b929f274f5e893ddc941a31b5eadd70d10e3b141fce1eca30f9cb300fee8f59cac74e5fb9653d0e99af8af31934f1e6d98abaf69e9570ae84eae397f2046af98b172e6a9e84f77c67c01fde6d153c8a1a6adf54c4a39ea1b76cfac1f2e2670c659746c80e5c65205478b3f570d5d7df59248f4a3bf68b0afa8d873cb3558ab2a1081868bd194a1d9577f512c3b669b83f08e5e7dbda9f942ba0784632736906426a99ddc4c1a367f1751452bbf92ae97277369a6606b650ac181baf2de018d40638177f886bea2dd6c228bea6edc8a2cb8b5dcd263f175f57cf3dd3f041ae1f9aba7b9f89fdeb275c0f5a3cf913b1760fc805217dd679a64f58ae4c351ce6388b70169a111696ca0870ec91735c15486e698b07c61ddf4095059cf7984a233f44a982380c7885843f522ef9d439bdf2dd00163114033c9d3afd12b8d6cda811620bc7f4709c6cc0676de01e7f39406bdaaea0bf711c4545d30029500434fd7c945ed27f716308c94faa65b4a480c31d0dfffeda25078df1947952682ebb8e2e27a0d2c426055019b686eae274fb73ebec3f7ea06dd4c08f58ab087a41ef1547dc3687dd7b0197d1ca0cc4f2dc75d4190482202eaaf987c202467aaa8ae0f4bfff3e9ca6e4b6f8a45321b2807eed9ed4fcb2dfee0372ac8a3c2aac818b46e6c23662a129722fe3c7d47ea87a97cf8eb4a0790d03356e3b0acfd39b07de7076396d447b3fd9781433058045ef4b4dbdf549c1daf8be8684c45bcd10554561e95229e3de19d1cc71233e4e7d80885d51bc5a64b53cc8a0443acfa57221011c765c6367dc2e5d4cd468ed09dea621b93b4b399e22ba352ccea8b1b59a8472f3717d42b6d79156bd547729de6566fa4f1feb7e2a1e12d2191be044b280c5ae5939bf2431cb61671488845fb5f177ac02b6b9b588e6c8e0c01e7500ebceb0e243ebcc2c5228bc489c1fefe25dac54d6339275236616d0807394026d70c4ea0e31ac49605378e37ebb686bacc47ee981935e9a63700738d607f8280a2c39896462f974f2a877101b5d5061f0c748dd8fd06cbd092924a54f2ca7215ab7108105bdb578f3adc1fdae7474bb1c3a02cea0fcd1018d7c8179915db0fcd5a6c30ee5048f6e6eae305587e8a6eec459abf1eda678724384420d9f73a9ea934ebdfcdd62dd3b905d2581f782c7eaa5ee2ee4482e576893482683d8fa72600770766bd88f914758196b1e112c928a6cf23eeb97c85f6abedaaf80e79aa66a38a69e9cae3b8aebed64b58131856e40058b0ca016f507dc5e00bef5b13fe06e9919648af1b2c32d9d0e50d065deabb70d59f8cc90b3fdf41a9a27c978133717808b42894b703d03836debbe8199d0dc8d10a3bf202aaa42ad9d4db31e6fb9300f876be782bb73004d3bb029a360f76c6bbed36c8d87b04ccf9e5d4b3cc3bca2002165e8f40b40e9e5aa6a70d999fee6bfc7215b7d2391c3d91423d1a0492e4c5ac7f099e6a2719e85e81fc96c647550be6483ac34cc37c7f4d05dba5fd5b580917b31959f63a44ed6c48d0e1fd3826688f7f6282fb5ef1f2381f435b6e8247971b03890c37c41a5f2b127a90207f318d3692d313550f5d68943c0800825d2c639ec910c79b9bc20d1cb3c08f25622f6ee849204e1b6fa20c0203498eb82e0386df6c7cbba521891f67f4098ed12822d38aad367fb6f18aed1de6d8617be8fd23dbd0531bac00cf2a479ddf0d7cbe05d3ae292565df4124af2f2edbe268e0eefe0fe610b1f34cefd226012b86de856ef9d7f5ef70157061b28d92cd87cce0a6b284eeb0866df0a75cae2ce7cf8f9a9a5bfaa5cf563711b518d22aa7a2aea2c0b42989fef821394ee8fa07536aa94fe4f992d5b94ad797b1d6f3e4840e0cb602280131f42a4914748d504782e19ef5600e3ac23f39f5c4ffa750a6a38e39bbd7091c7d9ca7f06e2f38d057b58c74759acc572eedbea6c556a766851760d1baa12ee68f64ffdb0151b26b42232e4d5bf18c076f3b5261bafd71936ddbd18ad070be1e2782a6d2f2401fe39a9d42f3a38dea7436afc7697452bc2da826ebbbea71d28ad6027b8cfbf738296b81652bdb9928276751683a993e439c02e8a604a6d562449ab7ce5bbc572cd20a1d4ae3736c757e0499ba692909b25e60199686887e02f9f2581cb13ff23f8cce879c6f9f9b7e5bc8aaeb88dfa780aec24041f92ce75fab6078b9a3069b18fd9977abcfbcabab31574dc9cd62c03bdfe34ca78c9f1db30dc8b6b1b178fe69e9e4b0ffb67b58fb731f76a9b01d53b1e6338a3ec6ebe2c3fc87e45e77ed98d0431c978c293c1bbeee678eb69801c35687435ab22a1c9906477ea93957a4040e0dffe274b2cb0a7d59bb456a1e30909d8ef51457600e9d6660069a9a742ca77a9d851d613aca32da919cdd780241e095473227329a94d795d832ee2cc7fafc3a8dd8f03533330b451ce899cd46e0b81330c23e68794670e48f14c69c1f1288dfee6ba769625ddef77d4668608148244aad8e7208fac617af10e208dc9ff715b54481f9fce5b85ba53008741a50907de90eca94de6dca8c39d36fae2cf0df6bda64be2d01950594c75a45279551bfc5ffce3ff40804a4c8e9740a95213b2fb9397f83f1af2dc54d3a05733b084cde97bcf5826d59068f06451c36a318cdfc0ca28887054df7ed1d05b9a1f65793a0512e6a8fa359ada93e40be996b6f0785e75171f725ce417cb876536119698475fdc520e89b2f8eb59e04cc07588e6b4e0abcdab6dbca04954bdc7fe13ac6d33c3f8d2e2d8d3ac8d076cb185d42b6195285641af3ef6a4d83e8674aec106de7cacb070600e86172895406b3ebcabd0a40e2dc81ac0f21a94a08ba300e83cd93f0157aa0566660df53913564602f6fb1125a5f7cdea7a9fd6bb05615533f41d7ccb0e3eb54152761c755d565e432eb9bbb071851b04e170b2792f0a6cac247705b2a3fe30aa86c8f1e5bafb8be5d0cdfd27f211b549642ea610a42f97f0418d5eecabe6c8154e68f49735e04726342bbf2a0f8037d6c3cf99c77aadb35572598bb8590395d2cf6bc1b8b7479e17d2e90529198f7c4fe3c17b67d3fa4463bed24f4f7802a5ae0b259eabf81abe585f59a8f4ee5a5a05f30f89de7e9620888d45df03b5e2e37b3a06608a82a995f628f086cea058aefc7d7d5a77e9e0b5bd71e0bcac8fd0f920d7824c256e40fa207180e631f9cec123efa0c8d90bebf18427df7c529345807ef7b6f090fc002d30308ec8eaeca0684fb15e266a98f0079e7b690283504170f3d40f8b04f1d7a094b7c0e62f040a407a83b4677261969af3eda796a2bed57e53a586731669d67948d795858e0fa627d737d28e80170f2cf182028e0cb494086f4d4282276e8dbda95d7d00b02808b3cc01b8b95b906bba1986a1ec3dbe2f879e305eab5be0bc3f44b2e0d3a68ac930ceed773132082e8a05c233546d43141d10fbaadd590f620de4079058e4ecd8b863e2845ea561c3f2ea0e8cb00f381431c9a495d0ef8ee4b44a8f6312c7566b21678f30837919f2069388f863e549309c51622d0b7640f3f48873c91dcd34ed29596db836cd3760218b0b6c601e0246a43ff07f24f7a486a717c86dbf3300bf0440a0a2e1afa022d211771ec8a42df4c2c4a57e7fbee09e44a34022f2bfcfdcd7cc08d65e87e4d6a15828c4ec1dd27ba9f47f2ff6bae5286fe1fab5be92aad653ee49a2da3d8d45779fbf8c5466aa07c3ba1713eb642a894c9fe45d70690444be76ea574014803f6e1d9a50e36b41f954534a20c8126e639781c4dd823edb3208acb7241cff3babd4df0654a3ee474cf9a519515174a63a13f5f198f41970bd53f311ba849b26f5d685abc50883b5a307b9c07637c6c336c3fd90468cdb3fd006e32d18990006334a564e42f0ea63e865ca6d43cf6757d6d3c32771105a66b52c52e0d59c8c932fff8fa1b1f8ff58870c9836393eead25d5ca5d1c5aa952d0c779cdb6709ae7948783d41ebeb177d508d4e3424a588e85e98c65b5df7e4ac2457f21d5d68a375e7a1a17dd49352019dcfb40267e43735b84ca0f49ad007ecf88eea536daf53ae2393ceb094f6c9e75d184d443a4d0a6e878b950b5b2d6d28c88568461c4bbbcbe2d3b3277f4bc16bc9c190ccae856a850fc387eb90d9c4c457d8a6d33ea7a920196da7c0ad9abb0c7eedf6b9890ca51bc2e251e2a81a5cf5040e8caa6886e013c59842f479f92830e9741a07839416f44687242e6a03d0e0991270b2e6c399f8a7fb81f1d72c020b59772a4e5034d8a526616a0286783ae6a4deebdd19ae2c16f469005e3db60bc5217652c037c07eff42a6895173ed75f1db7ae10eb95af07daeaf9db568d29946933acdc7498130ee38f5f9c4a4df8f1adcb57b9c91f32e94ff91f0b152e24ba2ca4a55d03475a252e6d0477a9dbff83a08b2036e69322d08f6d04e636bb0cb8e753b03f9402193d274e06634e21c1c2bda61d770b7f455bcc031fe4097493edce3b55f96126c0073d64fcefde5d14c1f53a66d77b7b036babb6580c60a3ee85b516417786e6adceb99b0ff606bc687892e0a316b59ea2ddc5d3b31350c150c510f7f71f6d9cd4dac1203b7eb8a3044dd39f57464658ad90688244416a015ed02d2fe0ccde7ef3135ea10690f037de759d78f87e10f0f6203b9f813aaf486224b4329fd48d4f1bb65da0c2db2b3a0db669da838985875441825c46e706a923f1c451a4df3d457838ec21f7568f26670a947ad0df2a7cbde37be95a50efe820edb73fd4fd6f9180585e6f2924be604745fd9ad31c16fe735972316eb762e25ed9fef102b5eaeb388b28a9369d4e759ae1f728573945317852beec846e5373b71124b3dee597ef6ef773c0c6e40ae26a0f7419f74b2aa5f9332aa073a245ce2fa7f8cd463f5cb462741b7a279f71b2c58751fb84c114f5d3a185574e1bd8cc406930fa10aadf2cc96d4e41a2ac4fdd5537deefcbff302137f71f076f28d6b7e725f57deae0b08e38ac7908f889c89e0b58febf6a706877e4c02decc187c345d10927dce9d47400965f2bbc0cca80039c97ad70706f2ae1b4c221c76b7076b86200953390eb372d96ba3f489253f30b4e5be1178841a08d09dbc1ab4628ac815f39c2ff640154aee3a8816a70c08fe46779e52e9cf2b5e1e3b510035906327fec2abab4108f4f507f81311e90d44ad19b26c4b45cc72d347cedeb96f02a797eb3e8719cefb9b3193f3d2045c65f76979ab384b0ad31b9085124232996b6666df90bbbe65f28e16604499e366f6ed34b9c609d906f56337e03c00498e1cd11fc5d37c27f61fd013300a64016e192a4483f0e3e1834601ff346d6a21064197d721a89529d6a8b529ec6e96c4c7adb616f5e9c73a802fd91c6d7cc980db0147df8823b8fd2d846e8cd42760dd91c237bbb57d415e37801ad460497dc888b3dd6f37c467c9ee4921e1b4e3587c4859d7a8e4426d02085852049da8d4214d8c48b2371b32588b62cec87b74764ce36a4070808065b22fa1298853aa2343a8ecb22200fb423eac5dd1de0b7b8537b9fc1ca2c98039d519fd480aa7bee339a79d918e5475e7063770abed90174f5460034a5ec00a61679c051538b1cc04a87a97efb33cb17b731c22f31391e4b4884e166a19c3608b656dcb0032de58e055c8e038aef2e9b551050c96c3a96d5024ba305361c757a9aa576bf9a5d55a0c7234f9c11732742d6afe2c5ead19e3bebc079b04f7f5ecaf1325ebb660c79ca54185e6699748c1d61e2ded6bd1807f0f8d3402da46dd96dcb2da59449cab609b1096a09f7bf211705f0f7bf282e06e0ef7f445fd167f44df98e3e2a1fd297f42d7d563ea6efcad7f461f99cbea70fea8bfaa45cbcf9fbdf948b0df8fbab9b8b0cf8fbab9e95cfea6705e4a2ebefaf9cb86881bfbf0a72b186bfbf7a227776fcfdd511f20791bfbf4a428a43febe074569187b52faf6f2d96306daf73d264ad34354761f37ed1ea4b862f2d894d338260fc84511fc7dcf898b39fc7d2f88d26693bfef09b978e3ef7b505c94c0dff7865c8cc0dff7a2b80881bfef11b9f880bfef15b9e880bfef1951daece1ef7b4894367ffebee723775afebe0acac5d9df5745b95881bfaf9272d1c7df97525ced40c6ee8fdecfe8f5f8fce81d31f9d15bdaf7554694d60109511a6ba9c8c509fc7d15918b393f738a353dd36b49237540477b685f174ad34854e5e3e208febeeac74512fc7d15908b25f8fb2a272eeaf0f755412e9ae0efab9eb888e4fb99ea169b7decf5fa55d3859eff923be374013d0714fc4b9c27f810bc4dc6044846408221be5d1e0438bc10df3330201f781b8cc6050fbcfc3cf081b96f785b8d9a9a0d3536413a60f34238f02000360086458e843604a0011b4606408019562b02ac620a30fe108980979fed004fc3cbcf9680e77116eb69781e875940067e88dcf2b335e0e53764ee1b30f043e4be791e97c0057e88dc379ec75f6ee0f143e47e791eb7c0d7f05d575bd9d3adbf0149abe33ad5bb6a78d77b3cc0b93f87a938dc79de6310b6e3cb2dece18e5a55ebfb7ea2009c7b9e009cbbcb2f50ca785eceb0cf5b651a56aea1734d2bdbb4e477f15c197cc9218c17936dbc3c196f26dfc0f20b4d76d5c82d60f56c720ee0dc22f8890270a200943b871c9ec7e70940dbebc50f016893d1796f48879f9fcd048f0368e4880eded1e69e33e2a4154e0724489ec73192979f0dc9f3b83782979f8d04cfe31e0fff01d00603f29ee799e6fdb3b9f01e00e5be01b4d5e0791b405bcd7b352f3f5bed3b00da6c823c0740dbbffc6c42de03df3f1b007e03a0dc47405b58e43dce081bef9f4d00af01506e2f03e0dca0149d01d006f31e28457b9e17516c1eef9fad018f0150ee0b80b61b1078f9d91e70e3e56793c0f3b8d723af9c564e2ba795d3ca69e5e4a990270f60b774db01ec987c64ed83c2a3f04840d5138fdd3701a80af2d87d1d4095138fdd2f01a82201a8faf1d8fd11dcc73ed807fbe4c03e39de5b21cf26609703d86111416b49ecefb77a627f9f054569d265b297bd90fc812c7c0744692b272abb8fb1d6afd77f2cb672dab703daf7b113a5b580a8ec3ec65abf5ed869dfd74394769ba8cc87d23822d612a5691f2abb3f3484b126e27c346b074bb646a234ec43574c2eb67a64ecfe7d8e89d258502ebb3f9bc562ffaf97d63efb3ed2be2ca87d99f67daff35e5e7e360a3c8fdba6f4783fb0c68a37fd733dd12d7291027fff1ab9a8ffbed7651ea0ede53fb0c6cafc5e5e7523df3c8fab3e1b137309ccdfef925c5cc0dfef965c54c0dfefacb848c3dfef985c4cc0dfefaeb8c8fafb5d938b08f8fb1d16170ff0f73b27170df0f7bd5586791e6f19b918f3f75b535c2cc0df6f1db9a8c2df6f517191007fbf85e4e20c7fbf95e4e2928b46fe7ecb8a8b03f8fb2d26177bfcfdd5678bf911b4c5bca773152f9460622a69b16163622679cf9561e4073e8fbbbc578ea912b5e74cee9866b24b1935b05ce3791cf6d968deb3c93553ecf979c87f20086de42a446c1e4ccc9ebfc92100e7060138370ee0dc1f00e7f60038f70de0dc36807377009c9b03e0dc1b00e73e02cead0170ee119c3b03e0dc1800e7be408d95d7f3f88d0743fec01a2b5580b6e4f11fd902e0f735e0f86cae2538825451f2e2032b0064568129db86a166cfe35e0b9902e0f75af6d95e3e19c8847066bc3c8f7b4226f0de37c477ce04928061086bcb2a5ee8206748bec19325007e1f01b05b8200d8597900d8313900ecaedc002282039edc00f07b0680dd12ce67bb49014e0cab2dab7841e526865a9e4bc0596b0161acf5eb95a3052484909c250f800c03435e00f8bd026848000b010730004c08850caa2119720c2877905c00f07b15080076563c767f06b063f2d8fd15d85df1d87d2360d7e4b1fb03003b2c1ebbdf03ec9c3c16f3814e2872b75482728a29329580b3769b28bd4db7c9634ac4a082125b1600f87d0056f86c36b2ac20802360b12180217926f96122412614d14942241701bf9761e7b385a10a766668f189210300fc3e06209f0d04d10042802a5edc78dc23802743de0176369038f789805d1733e7fe10b04b22caf1f7f5a3ce41b4af0f397ed43be4610005a832e53b0050040e3877015ef86e981be78b6421e0f7b6fdd95e8ade07501afa00e420e0f730c0f0d96c866040804b193602c835f0fb6dfb6c35610b6c09e8986a069079c0ef5f18f2d96a80670ca1a18506355c00bf6f2186cf46f3440c0ac082e679dc33923f30ac420738b70264f86e985b07013210f0fb1f01f86cb02b02c08027600cc8333b333b5234c06e5945298c99066417d059f8ff86f876095900bba4290754a93224c4bd03e4d903cedaec01ec96a8ecfef4e998f6fdd5d721396101337c42e66662f63c02b20ef83dad009f4da609058000de5209092990791ef7129045f0fb15c0037cb657180e411fc08b00b7a5d2135d6c1eb6d7f3b81781dc0256ef037dbc8d6f48dd2d61c72471eefb00433434f75202f903c122e8ba6515a527360f706e1af20786525c0ae0dc12f83e077c37cc9dc2f3a859b5a89038f783bc58a222db07b6a67cb69691c4b95f61a0bba51f5b46fb7eed13e2bb43ea923c765f8632340ea4ed0969dda12843fbca2c42c2edbda702bfc7dde77ca7c28e6fedf8722ba7c777dfe3bbcf51a1879793a36a3dcd3f37cd5eeb5bad18320f91fbef7beeb37d53e8ced67b9cf71e007207aa54954a4abd906b8172cf40df39a0efb90494b5a90494b5990494b51da0eb00e54e01947bf680b296031cbba57d5f067aa0eeb143daf75bc0ba63e0d88db1efa3008e2aa17d1f0738e61ba0b4b141b96d40b96b368d9401e57e8172c7c8ed02fa6e01eb56fd7c6f35f74beeac56df7ba0efeff5a77a3c612aceebc01be8d6a1b61ed6d2ac950793217fd7792a0a8b41f5ddab58accff957482eb63e9bc47971eb51ec751377dd8fac1f573faadefb09c2346ba5e26617933fb086065a56b1c1d41e5b64ecfb4ed8aa1d6cd567709c3ee967ebbac761f7d3f3bc7014c156e11ab65a7640e233065ab86edb2b875da63ce6aa9f5a55402ce8d1656ab37c5cc45c6c7fd6cd45a9a4029fedcfea71716e67fd6c7f9729568fab7cb6c370d83ecc5e5cb90cfbb2672fae1877512ed6b769a22b11dadeea4b79cca73ce6e4a0ca47f5a3025239e9a2dc3f196236178e22d8dd93c7bc83f22eaa4aed917553f9b06e1ef3b7f9d1fefefeb4fd47d65307d545f9ab7ae4cebc7553aedb963676c8133b99d9520b1ed09035b8cdccc74bb0600734384d13a1b41795cdc734d8340c1a3cd9f483504a298f1158f0c5bed9eeab9b124b53579a5e6e3c49b30d0b74e571c2db4a53bd7d1f3ab3ef3afc1ff3c153c4be8e6d75b6a5b26d8739edb46d10b67d97e5388e9b2176d97cefe5e2f5fc93e1ce948e00c5e96789133cc8319a24e10a1bf4d0845b949de9d8ff9875800f4998a2081f84f0f444cdbe0ea5ed5094460c9838110106d053cdfedb8fd9bf5d542077a74d2e3acd863e45b2e2e213147a346523c1b447ca844414bda17a92a47eccdf74f37872bb01ba949c4f5c1ce79eb98c7e8c3ea141f489c7e84b894ddf75841e1d8a22515aec47ea3452a8570e304665f565b11085d70b4738a90f05a2415448ee40b928958e98c1a6ef512eba6cfa2e55f36eb56766859e47f3873ffd7abbf1f45d8ad2703cfddae3345a942493a81693e6499832fa2a554bcbcc4c18e6c8d1638fdec3e557efa043cd1cfa9268769590048b10a88b1e397d9b11f48833f6541cde378c9c361be7d19c4be364724da83d7f164d27defa713ed136de00e14b2cf2c96594111759ffa3ce9e4b54467fc2c2f1f794794d282ac3381e8577281b8e1a261c5fe1f8ae708cdd84e3ac65b61d88d2a370d43624d4a6a16a027d0f72e1a8b3147b1a0bf1db84a3ae913d4d38ea87853934968592c642ea501488d6af2f138ef8158ebad6982b1c6750504f76fd9610a80534a3ecfa1a68d34701c4c1a2475636d12a1c75ea542cea77c572e5e875ed0d704a51599db77a77083d060947001d11c5964a470879bbe5e6b5a516b7299ed0151a624926ad6e449c60c3ec5146ed39b567cf7e4df11902e20845188114c60c6412a64801840d7e88c005185c1c65df01776df5a103a4ba199d67b169d898ac70228b0fb6b002466d48962a5b9021861742b4a036c6a8608254122122966042ed861a2855895282032a4fb5231c5831c4136324c10849a841a53175c40fa24863a9f60120a486b87284221c15e1090bb8a9272f78d2c49329b63fce2e199cd0b12d9556d084ddb2a5d20a9cf2d195558260688d750d2b60ba32b4031e4660b17e9d73a72f958c40634b2523a2603414a2da76ebd4c088db0e6e3a0042aa9242114fc63882ca314a2983a0a79c4f29a5ee94de3c7953ab355ac394569d09fc1f132f5bf39aacd99a675739b3962377aaf0b4a4c9a331ccf87142194974104502c8b8728330b62003062dd8214a101850482146151f3009a2022ed260120422329e5ef0b4a48960e8e728085010e189131f0855a1451386a8384142cbf9364db4bd05196da9a482a39c2d955400b46958a5a63c26e5b13ae5b117e8d13ed9f3898b6395da522efacf5b6d22d1a53dbf4e99522eebb9edf9e3fcd9d3faecf9f36dd09e8f014a73a8514acd399b9cf6fc4aa472a240945e711aae5d218ef6e8958873aa8d6e74b4e743d59b0fd09eb5b106d1ea4241140ba552adc89d28d4c994fb12b5a293a61441a14f36fdd9f369cf9eb5a65a9d728979e68d566bf3f584a2b49e1feb64cfdaac8d13692ef9d39e51af2915d3b142d8081e52d296f77187bf8272db1a8e47903c2697ea947af4aa532a15c9e4b17985a808ca500daa4f6a9050fda940b75d7ba2a43e6acb29a7a72b4d4b56a820194d89422404c549900ffd99a2b72d9d695f9953d239e79c734e9fb388c7a4848ac2e2b1a41dba999b3c7933b69af6e59e036b6aa0e77fefcd979c93b552751cc65363ddd25887e334da77621e6f3503f9e3362173ee6d62d50249bb445476697789ca2e10da0ca2c6a60612da74222f911544443f9bd2b8a8d793c672051be9a3edf321f97c4b514ee388a8ccbba25d3b726b4569b307166dfad44069b3c7853693bc50da54f2a2cd253294367d80d1660a9ed2e60f34b4091452da14c2c59bc7ded4be3df9c7c9c6b239a6270e4a8aca2e1320985cb4017363a62587184ed5714a90fa1962de4017449d3fea8c7840ef06de27b7073a7e1e5ff5c0f2790f6c428fab1d35f4b8247951f25a22e3032c05ff030dd07b18043d24d3498c07f2fc07d6de05f0fbbb4469ad1e97dd6ff52ced8b9d5c76dfb1d36dfa0e8823d2482d2020228e48eb4b4469aca59691cbee4beb4b8471cbc8e85d784e09525c81b15ae2a4286db562920aa2a709fc4ae6104100f1dea41604410ca3ca417e88b74de9b1d5b3ef7b40de0302d6d8de07e43dcf2008048892d58864cf1b1090668356b47a5a3e4e9b43849e07dbf20bf23c1e2408d8254da1e365704654dd66b358ec9f22512c2291c392c76e80d26330605396e1be0ee90727a074d9f7daf24302824890805d52d8e4e68b69014511eda7a1b1436a09dd209cf093d3f4108e72ed113bd1ec113bad608686866c4804fed8a232b69290fcd8b2b25fb6fc62c22ec9633e487c6e7c906a136c80dd122b83aee9e4799c0545699d152c37174b6a06af4d2761170a09e1a23306c12e099cd22ddb93ad29e98a89290402bc3685083b24c74180130850fa0a637765df079700d46a6df9d1b43206696888f801942e0bdf6bd15b7eff2fc5c2a3a6f9f165530326b16a841a290c3ba77d9f261c5f1f861ede5a562d412970f9b6fc602e19833058143eb8f2969f8c2b6350468689252fde96dfeb2563f0f50a59a00446b5e5f782c19797a824dd969f8bcbcbcfd625391183b7fc6c207162a8983da07499f7e2b6fc6a781ef75e198335bcfc6c35805dd20c5c3bc06ea9257375d82115e97185b4efaf9c562e80b5199e706a86860630d9ed5d8ef20439b2d78801e492ce79474bbb25520449e7568b09d8d32df90a93c9cf1fb0c7e76b9349d85971d97d255f93be82be36275c0c1c71daf175e66396235081269df38e96d61ad401a2a373aba57d584d789939e82095e9f62e47eff5b0bd36e0c06ab5b266b158604c478cd5d29ad503e871190f4173d3e7c7a7f53c6e33f6ed5d8e6a979efa3d6cefbccd9e5ba77fee4eb7585abae8e2ca8657e00ba4f19ec552adc070edb1435a2db9d88d2163f476569af67dee1352778784c6cb0c7a1234e403c1a72a3e7bdefcddee3d9c6d057282bb9f1b772abcea285e7da702612b55cd2dcde256abd5ea7138ce8dc1d5ff0a636aa5b59dafbe30945a25c91db92f0fecc7cdd97537d0d69c9ab552dda0c386c57003c5364d6cc6d8660e7479a88d6484df6506f207272573562d9034ee480a8b7d710cf695b2efcc195756ecfb39c8c599bf9f9fb8b8f3f7b3908b9387bf9fa1b8386f7f3f0fb9b8c3dfcf515c7cfdfd4ce4a2f8f773918b2bfcfd6ce4a2ccdfcf535cd4f9fbf9c845dadfcf545c84fdfd8ce42290bf9f935cfcf1f7f3928b347f3f5b71d185bf9f995c6ce1efe72b2ed6f8fbb9c9459ebf9fb1b8f8c2dfcf4e2ed6fcfdfce462edef672817f7dfcf512edafcfd2ce56290bf9fa75c84e1ef7f3717ffef7f3d2e0af9fb9f8f8bb6bffffdb808fefd0fc84500fcfdcf898b31fcfd2fc8c5f0ef7f4f5c2cf2f73f211765f8fb1f14176d7c2e473a3a4e5088b5c4629f8dc264adcb01e1b1d93b53653a478e1c9fedc2526059fac2147a02e1b1d5d047cfb729ac74e8c0f9666470766499d70e584e95e3ecf5924b44c2d7ebf5fa982f67a69a753c78e01e3d54e054d0f158f5b182a581c16a76d1dcf800a2835e4bafa51c6c4684d1eae8da3459d2749e43b23332341d1d180b955eabe3b1ca026c47623dd3d189499a8e8ece4b4a2340693ab7a9e9f53a3a3a3a556707065be9e8c81db971acbcb6375f524a2d657687b7576db76578b96fcbd0e50a61bf3b1a956f19bae34029a595522f772f9dbf6c64bbbbeb504a299dbf75d0a794d2957565ccca3ab770f096eea5b30b7ee9b93d57f7d2f9c56badd937be1edaedc1dc188bb93a615420b3250c0dabb5d66f88e953eae10833d2da73536b2f87f3387e9e4bd5b9545ead95a3dd23eced96129452ca7993524ae160adb5d65a6badb5d65a9bbf154bb77cdf8aa55b2ee0f8b21dbcd2ca925297118923ffc55a6b75acb533f0ea90d65a6badbde18cc6d172b564171c2fd8ea966d7191e088836faada1df70213f392814970b4d9f4bd989795b133296cfa1e8d7f42ecf650d2982cc1974c96af992c758e1add2b4b4afdde9b55bbe3b6bcdb93c972c6fda56b74ba2538e2d8f4ed9ec9121c67605982230e9a2c6b64996da84f59c36e0f696ca868cd923293d299d3acbe3c66e759152d77952f7656d775a194524a29a5b405cbeaa2b4a394ce5aab9d55f9a97a973812473ecbcbab5ceb87a384ceab5a3d965469d949294a8929a59456cee5ba2c8e127accd3ee5c61329e94d21e659491cbf0179d3299d2191d607096b377c5b261d39f55d239a9a5957379714d7971b9844fd01bf64607ce8bca23602ec771dcc531e3e1aa5c9d73ce8b46c5616f543b73b3f5881b7b2be762af4b0fd7cedcb823f4fcb0b63eede5dafa346b75675c91fc5ece39b7b464cff33c2fcc2d9f43f9b5beac9360adbe9cc4bd4958eed2ba82c812692b4b73ebe56c12f72661b95b6758f07654f50790ae053aa510246a5c78e1d6d47881c7de1e536ad0f0eccad1582514c655ca51cac1aa4d22566766682eb8754e4fca9557ede570a7f2f2b762e98fd572bdc0c4bc646034356a6c1e0c6ddcdcc081424c9623a7905b52e6029bd23a29b33fb3e55bdddd1474c8cc28cdf5302f615e401caef0f5ba71a303e785936336a6ae1e30d80163ad9793337ba1dcc531e3e1b2d5561e99c767b33db2943b2e5bfe7d8a518882828ba3da7ac3eba1428b4bcba4916fe01b15f2abf0d9381ff96fa6eb65e55ce18c32b384a8e8b3d550260d1bf680819e1fcef4cf3e5bfe196b05edf2f27dde98b0e58340fe984333c7f5cbd70107b9c36ac0fc913f83fc317f967468308011b9a3faa759927764e6cc6a9129715a5a7e7a3f5d4229715a5a5a9e97f550f642d6eacb9e3fa83af2b4fd7f56646643ed0a224ba4ad44f1b3712f7e437c77af9375806663ce9e395036501d72a7bbb31966924d4e46386ce4693e217677a10db389740435d361215316bc9dacda3f807440b2943b2d588bbd165ce074148f0909a2c685176e4d8d1778eced4154838667e75ae49a4265fb7b96316b6960bb96a5dca1469a6846f158120aabd9ead760f0170a8202aa36701c378b2691c7dcc86d983f661332c71f49e8098903b3306429778264297766d1f61965469951a2481c213dfda99d09e232d3e23c94b0c9424f4ae98c4e26aad65a1f5181d4aa82088f46b9d02b74092bff21f2e80f3055ba6208152da2467b3ed64712494add8826940bf910130d9a011176ebab8b39f4b33e9b665981bf7e33e899a2e74da1c1f6a0b44af5dd675385b13b2b9660acb997552871750b548cb16dd54754f86cac5b7315038cb5c6dcec2209c8f6ef689620c23044317242e3c4135eb6ffd5690208dbfd2da689420650f8d8fe15d348713385141dc8a0c9f6a71a8618c0f698a5d0428c2982b6bf6b1ea4b67f75c73a464564c860cdc9408a8f0f8eca90da2155c64f9317c50f19423d107a28867af023c52222e2c1151e1ce9e0f1042dff9ea1bd2d959ec0e20342abb6547a428a5594feb6547a62e8892227a630e69c48a287ca749d70c284fa58277e48e243d419766289cf9ce9cc7ce81011446512373135841195495ca412631585be5b262da107f908bdda3269094b3d4b4852b2042adf19da6e99b4042c8aa850b0065f1ad34f33be7ed0cc1cffb1a3d9b86eeadb5a6c2f38bd9a413a9d46fb7ce9aa273cef5d8ad63aadf5d67abddee937acf4de7bad0d96d605d41dff0dc798adff95ca9ffffffff4258effbfdc914746dcb9c3f626e8dadef44ce96fe9be8537adc3f8dd964af73c86db1f1ceda641f0bcea4ea9f4af1247095ddd6d0f2ce65ed762989039a78c71dc572eac1eaba1a49662ee5a5c3bcc5d9b44ad13a7c09392da6ab35f6ddd99fac6c799edd75689c371f567d561d79fd55e6a69fdfb0df14ddfdbb3933f5e5d78e3aff9a386ccf1779ad046e2f8db4d431c213de5ceb4d8bbd6e2c91dd1c4130fa2f020c88e9dcbec39b7e7be030cad6f5acf2c3d6e5abeb7a552134c7bc47bfef0db0ec33f21948697a31c27df8654bed4d7691758ebce0a22ee1344b805b6d6041387674c822ad638eb9a134d7736c32ce85942634493094d1c6b9c75105254263126c28f104f42446925259a98482897c9204048b94cee11eba59f58bf949a18c25f13139db74c3a838c55134db365d2195b1c41bb6c99740651009a108a1246d214124a4f5ee0f4687ad2f42397f9b4f92a5f35a6d65a5d6aad3cb5ce2811e86aadb5da4a6b95485c9dd551eff95f5f36f1509a0bf92a8c00a539b6e138a321bdfd3ca2b4f03d0cb15b2ef49a707e8d70c4e1c3c27974f32f1b1a8733e06c12a2ef94524a299d4ddb29a52028a98cfeb3fce694524a29f5a3ed94da50498f6af80c9037ce3dbde9928b3d77d81dc0c1a4f3a414e5d3ea319f387cd0932ac193373a483aab0e7b5bb7527ab54fa5769d1f01bc66431c3de8f9fef6e65d7ab3555cb42298d252ebb4c5073d65c56286e7101434eaa358c04c3a4ea1cc75c171a38ecdc18087cd55d91c07032f361783156c2e0640d85c9428b819cde6a876b1c5421ec528bdc0086e5e2673e2232e37416383368a6953b19937a501638f375fec51878f4d81ecd8a34c5a82874dbfd2c74be460d3d7af2590b0e9bf0bb4d8f4634c0cb1e9cf9808c2a6af33c5a6cfa33474834d1f7f364abd8ad2944cb9cf56318f1c2841594263fb5f4d69608331387b13c6f6af5836d50009d5ae392d70c1f6f70990014515550c0144d0151048010f41101185123f42b2065586be3979f0e067f0d8fe73498826a4ac600296a6daa8374502c807473ea820ca8b9a0102f3f3cfd44685481983d177da42c6e4f6298ffd6c87f22897f2d8f4a71d4be8f7a7bd03144a5f7cf15303268a40a3369f064acb41054500c1881f624085506d3ecf7c22373e7a468fb888387595eadd65644948a453e16b2b3de2dafe94de544aa83c51c15289f67c977edd7a381538d6a91af154612f9cb7e933ce1b15222a438f998c9c6cf9d9c6d9f630ca1e6b1017501c0a8f2eb454da026a8f35686f0154a1384dd6a8ecb106edb1faece9e25881b61317eb1853f69c3e6ea408ed011cf4a64c3843e6cc1f31174d3e5c303938ba6ac6dc67bb97e3b8b9b94f013ad0dc638f71e1102963dc7b75c5bdeab937c202ad0a471ffdbbbfd9bcf79e46f9745ef8baf9c18607fafb9b269a6a2bdadfca762621ce0187da1af0bfefd16c02a08d599b465dd1e3bc45edf994d29c9bdf0cb4b60add88da0ef4a076752038784c42d120ca0e9a3e3717a5120da0ec59836e98aa2158888e8d855c6f06afb9119d9f10c7cf4377d83edaf0884349d9e0b1313fe9e1054411afbf499c59857c50a1c71db64f1d1e93bf032d2b51abe7d2f76f06afaddeab36373d97e48e95c9e44694b6fa197a931f5147a2be44a5d4b9b2890063cb9f5fc81fd3094c865a3d26e5e6716f923bdcfbf4a212511efc31d6faf5c24ee60f87e204640d5199bfe741dee450e60fbf3273fca16c7fefceeb2b26f4eb50072435566883a86c88d2ac1095f9236dcf3eb489b6dba13a651bd5a24a7465fea850c81c2912c79f0baf6cff19153d7fac446e4469b436bf225e93df90ba6f904fd83494977a0f1de89b1d236991f483273ff009b3b89267164f37a4c165d586d2653f767d29c52d72903b39bbda5d7ff6b8e8e3a2d3ea433182470a9d830e375a6f610e1eab520790b2fa45780161d7af3cd8f50d2071ea0a4be8514a8d184a0ef4ff5f2fad6b4503bf27a76b4aff6cf9b3711eb3d3eea87a9032fcf26e9f23ec314f1f978d7f4ea0e9f3831ef1c6dd8c891ef3c6f8e767534d500770f6780cfbb8424ffcd389d27c09b9134469b286e5c6ef3e0e45ee8c136ae329e5fde8b76df3f4a12b3c993296322fa4181361ec337d240efe5a12eff077e1f4f1187e1f57e879abce1101cb6cfc13ca908b4f84669011fae5f668b611a59598545c7424fc5348eebc36feb9f459bca880e20518e39f6005679aa067d013b9e3ff92423781710e474c292987392c03f419a93fbfdff8f1cf208983dfa7191207ebe0317cf3187e0f73f018c63f1384c6f831c6b8da303c79335a772f42ca2c1417b3c76c52ceb6d55e712bdb66d84d4f222ab36fe5b6b3164d716b9f470a0d1a27d1131747ec422e8e597a900d153d4ea2d183fc2791f320774e30451fc28cd9b7520cb96486c4b10fe431eb4eac7dafcae9c4fc41a79839f6edebd984dcf1b7f3890d9238560a8963bfc863d688086f6b812e0f3c79e3e510bc36536b4b3d8ba490b24a81e8ccbeef56a06813a575ff1ac241d8a5f4edbe3bcd229b2cb4bf235971713a3d796cca91e44ecebe755fea84feec3bd29e7d1f068486ddf438a19efc8ad3ec5f282abbef427247de1ffd49f5a347bd545c38beb49654c6230589470a0d95e4e29d13cab3903b5a4c289f33509adbe32cb2c942fba540c851e2c3073d4ea7a78944314642ca8e81569ee4b1eb484cf435d253bf9b8e741fe357cb86cd60bff6f8e8d4b087b1afe7605fff62df4740fd2eec7124c9e3be125cc3a1db406280d27c0c29bb524b90b0cdd8f7cbd8f7a733499cfb3b9c6084dc993bfef72730456ac48cddbf628c7a7b606eed4812e77a488b9038330a47097a4a79ecbe8713ca63f76782d06386dacebae1e0284b1845584d2963a5040db3a5d2d10d721a7a664ba523285445474a7c5347435471e4c36a896639c15302543642cb6ca984450e3218fa654b252cb4e0b880e20ee9d6964a5808a9868005101a58245901a1331a788ad6666024b4de52e98a31543d601021458c7b851213aed042ca15533c2a74b7a5d215523a20e8bca5d2154cd8205c21f404930b63d74ca7488c1e5a3530825c8a927cd0b5a4a39619ce82096ba633f3a1534404c48a08bae808213e565113a05cb382b42a5aa2c493fab2a8864094a528c187ae76031fcf0c1c64084caa2b4d38a64e8a184a823c0d250942849b94241f6050024a8a163ed49680a448d1a4a62425050a1073a633f3a1e385b52f96a404fdd4bc40fa1a517e48238d3dceb8267477860a892bdd09b46bcba4349084b4cc9649693c81add0315b26a511c415210d1f82d0390daf079a7504cc447f3ef0aad0ad2f3e1968c14281d65b266589a20859607099e8962d93b2047543d0ac2d93b2f4f061a15b5b264d49dd194415b1608a08b3261a53f17c302584ee095db74c9afa81159adb3269eaca9e3f34b5a4c262aa8b0ea479e12aa7ce15496c3f52ea5102d7c5acdbbe665ab68a5a4fb5473da3a96c22214d95cc3725ce4dcc53d1e88be330772bb52c17b5b672b5769752db597b39edc2d95aebabaa8ad67d5b2d2dad5bb58be36cb69cd52e6a2da5acd50ae68bc953366d22944684ca6454331d0cd37035b63a4df52ab0ba6c02993ae6dfdcd032055f2f1bb3d9ffeb157b2963723a7b877ec63315c812828e1b9ba9c6d20b916fdb7c44e2f813a1b40d4899bf10b62769ca7246cd0a9eb2c4999b03eb8cf78a8159694b3f6aa9c77259ce45298b5217aee06aea995d34fb39fbdc7babcfc6b55c9fad7eeb2bb2c3a67473f59decd7fc918f8311cca49b9ca072661290d88d3ce348963366922cf48814940d5247ce90596692d9048718887c310625925484480c44be30c3485d61d29b58ece6c60dce0a2de8a893ca5ae594ae9591242a1ac8967f7373a389b8ccffa64e7a445af9628c33cac86286913a29915952911991187088acf0450b636ce7a28cf975d29bd8cd8d9b9b9b1b981ce3a960dcd5dcbf7c363af315d96173e1ccacfb5a9a5b23ffe8e8b999a2c97552adbf9733b6fffc51661967925cbd9a2c5db4f1cff229269f9efc88cbbc4e7ac48686ce36b8383720a57c92ad3dca27f90423f38a99a13d49260c93d92ce01b8fc907f78dedd93943d8ef80bbcfa5f266fe56798212cbf658bad59227189348db73e509c6b6f702932778b3bd983c414945d5618ebb348b23fbbad650bf709d99526636869e4f69ec45650ca5b32a7ad65a6b85b12f97da7771d505b7742aedb1b25c7db5d2faad6aa595669644a2b5d25a2bad9efeb719f1aeaa96ec5a2476919cabde174a25b5303a728da994bea4cb502ae99c73cef029a5b45a5b258c05144ca730180c0683c16030180c066bc15a602e30180c0683c1666030180c06d31f9be9202df17094a3ae535383e6411998fc9ba3ae255d47ca5ce7890655600d7d61a18d1898fc1b17bbaa75bc1bd88d977a674e50630a4c73e3060c0755b9ead59179829e0f84c7764f406153e8f933385008a0d7a8d48bd96a8a142a53030000000000004316000028100e89844291208ed24c90e90114800f688e4a66603697c8c2244862144419638821c400038021c410858c689b00d27915e1e496079b8a7ce8c4a806e8402caf7e16653874989f60eb0f65e72cb911589a2dbf74431e97d7b8b6f2a3b10d8ecca1c0f96d7cc37163289ac7ae5eadf2168968274ee519d8281f5461b558a6d55fca34c29e3c7987023a0a8fd0d7b1d8dc593e2e25b3bcf4c9e397672463d923b93515d94f9745b567799e5b3a147d100505018eb6a51472ed858e31c56a0ef5de3fd04a3b4eb7922261782613e4a29b8003517613c3115786a45dc1d85bcab576e7d4c4d52f9041d875ce204db02860c18d82440ada3f1d6994ae4d78c751e0e90c6ff834001f104216770c182c135d76a879cc50fd32a11a0b1b688f9c3af23141e97c02d618cd1d75978e311e73235c472ca123d911f6e1b1f63ea65de1a8c6afcb6fffcd4ec0c36bbc9d2488e2256da3717c9c90550fcc28fb49a3db35492c26aa7e3927755b75f86fe069c4c10bae10f1770efc3bd0e5fc69176a01cff4c373986219f2b867442af0a97df9e0780bf94f03f0a2429f2b2d8f02f766835969e5dc5e79d7cb4d003a0c4959b6940361e158444d534329d20a54263071606d22e1d4f662851e8259d8f907baa95d6514255a4678e541faab8d1809a7f60d09432e25eec6157533b255fa33ed66f80af6e878af87dd04f026c62a7a2570236401c4b805947077a62e44418d7afcc0e18af0831ae3d982f139ed2fb24f7c8dbdc7fca38ba69d228f7426a6ee8287d71c5c19532f2c763feb6110e64442082ccc26fb8816c66be6f37be8be3a4736531eab4cdd82a30bf7d9861d8b7d66104430b93046d650216829f819f918c05c6cca751441e811a69234a08c9fd441b9738042394afdad22096f37047638240a7a3a804094a61ef3bb4270da3b81d8a9e32eb3516f7420c47b77097ae1d055ea31c0cc6d72694b91668576c7935f3e45b0748184d6f4b840c6edb60fd9eed2875d709ccfa2a9c050636a2734898cf9ac52c44c61dad2dac1f565b2a0c579522429b5c38f1ed4010c5fd276e777b2f0b0fa2bd4fdeefcd8be2c29c01cf0e71dc8914509253d42559963c76a481547f2edaa121ac9c7fa908b1d0ce5ed6f77006d98d03a12ff5bfb07c297201658a1bc0e1fad44054002913c570fee4b42cfa847cf827c3014aa9c404f96a9fb3336a111d39c086696a2fede3bcdfd78a10e930b0ae7ca7711df6962d50d893b42755b53eef1af4e12e00045f32923292a3639723148e3f7caa88fadbf4a4c0245419868c214bb179585058d3eca02965714b8a590c7eb9a5336dad7935738c3882c79e80f09935b5599fa4d9182ba5071f48ce4e4182bcc965cd155c712acc0fb1d75ce9996f8256478f9e43fa1b5ddd034072bc03e00fa9108a56eaf1343ac20c5699aa225583229e5409053ba82f0e41f214a194f32d16b90f54476dfe1182e3ba5a3113089cb375cc206f7b7d45e283dc8e7ea0256a690feb67f1328a14bf513f09c859c98d2ba884ee912f8f7a8b3fea93761feba2cb51e354103880c44e4fe5830d63decc4c2b3fb70c53fe39f7d5315e6fc6154656f73799b038efef92bd7cc6d978ec742585f4be4c4acfe25861e7499f9911783658873f307a7e0fff6243ad5f9f732d8419f19baf23d600408402b32b5ca53aa0143dc96ac1a822bd5aa55aa61522bcc138e15d33bd6391fe8820ba0be1563c80f32a7b5a393113ad673141f5c7af1bd6619848c62c9184b35498b26232c425d182fb3e139311f5aa48455f87e075f828dda560d748ceb287526c7cd790eb1b6fb162a02ce15b31cdc42822bcb104ac9c7b4ab63f3484a8e10a29a83c69e1f897108c4786e7ff105158779b9d4a5e3a0eafaa447a8c7661536f0027e3e59abb72c51ed11e0b96b953591cb2d86be57dd3130b5f1821c7af09835d756b8e1d427090cbaac56417fb1920063a1df1fa8d1b14a75d804a5db4973b3d28f56da618b6b2f07874d5abd02c51ad489aae3abd500d4620a042bd6b711a69e62d5a3b542aeeb5dc80b4a608eb0aa92e9dc06fd5ee6b5e610132a538d0368c22151606432b8596b3072f06e7688134c2e621b25a00273260db6550b9ef48918ce2f6b6a36ea3dec2122933498b651684c85efeb908d85b30c9c33498dbbd40ff87ac7ea2ee8b8c00ac1b25c904af51472558a2edf675e3bf659462bf0f96e3fc1f07ac8b53f62de0e16492c173e97de1d068e8ca0b4a25633c7c9c3955a8abe2d3b04b8ae96a1fee31d482125cefc4bc24acab6665888bd923ea01031ce403d072ad902566f3663a4d9da4f7bd117d87b953b0a94776d6899987bed917eb04d2671eedf8e4dc9c1131f47b321d314d1cf5f79b81c6d120f49b54b50aaa4474d294748c3e23e18bed3243ae6c0231a15e7266976bb53282a1c199ca83c3e43bbc1acca0e1509ada1b3162caf436b93f989393907ea5078af5aac2d1797de697e3920093c26a2c5d7e0369d77a13080666dbd7ab9ec9343e0b89f07fa9ecb63d4e1493a1effcf6c1eac189c92af4aedef7628828e470bfa12fdcd83902a4083d44b1694865fb467f0b4811569c9aa21c106415793c5a1865c6a0ef5276a514b255f501cc97c9ac53a86fd7b690cd28e381bacbf827fcdad566cd47bed3e59237100c3d1390cf18f57dcc27bcb5cc3efc05ef97f0799c5b6b7a375ccefdaf0df8c68e292ed633728a16869292818140ba83c29338282ae2b16b92e281ba73df7cf69b848dc9205ab2f0a5c9dfc6d7edaab2780c14b213282b90e6aae0df9f42fc16ff0f307260529ce4426996afb0b3d4a3690644c94935d56e72820a664dcd0eab106135311a6b17480c510100859e75af6d7e41e0fc23c86aa1ad91ba520abadfb0eeb2f6da7c2196006a1b6f7384b7247acd36e9e908f668859a2ac389947fd1145abc0f31166e60644e441862dae31ec073821cf017ae6add70cd81291458821584d4829dc98601b82e539d1c6b7e2e57904e27572ba7f576252688217baa2f2d1ef41192c4dd4aa473863919b9804054603db7dd64a0d41ccc90a5636fc374294b6c027933a4c2a76a6bd178b2d8a2c3997e69c28afd0f18570d5da7051ec0bb803a7cbdee45bfb91e863290ef16b4224c55de08200194db937020288a81dd921eb8bb019d33826dc7705b2a23d536b38cda74edff6ac49d270f5b9a502d926766218b61624e2d34aa2091ec7bca7a816cb3b8289d8aeb7946909cd7e2ff84e6f781ddc23eb47e9ccdf8906c58a2c75ba556172fa870759f9741c95a01a71ef4970317c2e308e48de81210246aad10a3366bc65a96fb2d032d58e96efaf177a771b7d193d8fef79c088bcd864215b71c28f79095995a651d8e4306836420f6ed2c13f3078bf92e91ce4670fa843e7375115e3761e9e62671ed3e67768fb326bd00bb33df3055b5c03811e59424e059a16d772c3b975ec0ffda9187a339f681f5283532a9a31667fb538f2d619259103cb5e57c266659c78b2431a3f1ee78ddcb56feffc519db92ebb3841987b4adb033bb8550e5d16d66955c2c88ec0e30a3001899466216ba92f6296eec77112b3800a81894e15efa6e7e16d9a2702d9fe80bc364cce5af4e0ba43959dddeaea068e84c4cc006ba9e1b3e894ff9bcd4af9762146d2ec614b6659ce7b634271423b76018ac54aaacbe4569146e0c05168bd81a3b82c377094f63d823964e6800744256bb14c731157ce3156520f1246662a691df7a9087e251b2390074ecb5bac993295a026cd550c40b2c79aa4e574580158cce99b535a0d8af387f357006539a15c6be78c03fe2626ef1d65ded694150c70efb4effd08c97e075f23a5359f274a73c1188984a1fb106da3296a0ec94c0fa3f682bd0dc18eda514cc9ed7ff2675187b7aca517394e7c1b4cf1bcdd478f1790dc44dd1dc471ee3a1473b252c00f09bbe05c1f546597c0556ace1190fdaeaf4a09fdd5639316de5ebf149433caba02d1765280eb7ba04fb49d58671ced32fa70b6881762dec9b85877886a06f9a1ea8b4158445190d0678cd7f27ef8ea34346a952b2fe3ae46e4bc0caf4729cd6280f51478db8655025f8f6a8ccdc96847a05dabaf0635309b5bc4e3546f03342bcaaa2a27c3d6dd02c1bcfd2f815d05e7657d1aaad958553937d62cc03cf66b60696cd6b255de02b50f2da27b624e46361e1023ee8b90107f68f8e31527a5380d578294e22fc4ca82891d9edfae53a06b1b592e306c726fc3182ef1126b023c087aabfbe360c0b118dba94a9220e234b8ac3cf3133d0537bb66e5f9773c82b5d678ef2930d25c94e99d273458736aefe2c098839888d90583290109f46f5544f1f24587e9cf3668ca44b6d5135c741424929600eb123c6e7d6b07113d9ad183914bcc9a326d9fe933672a3f11b576330e0eee9b5604d641bed30ea4d907ae20d30e7294af801a3a90c031a8154ddbc6ce310538245ede78aad76f308433a5e0af07127840714430a98c111a810156cb74809337c86e2d7178669307623f5be5ef65f1f14d8ef93e4a4a971d306ba88747f3f4cb50064160936f357fcb2e159f3f00988b84141db446464e308cd128e80546672d026809ab0612d20d7645b9e59aa22fd74f1a145f9b867f2e0fbfdf9b8ce58832ab1dc50f449075c13cd89eb9c3b7feef4e7af1ca4743941c5a56be13364b3863e6d5b44a8f527e8421062099c139b5004f880d13f634aece51698aa534bef1b22919c0b5f6ec62ab8df240653aa00723289dba883d61d36d14231cf50bb76c7f16a419cdc3959f35ef5f069fd935cd6027b6a58b173ce560e09708c24034c339bc77fd00fb688ac4153c511dadfc8b84e469795d625e52d319ba7fc5e345124c49560a2427351a1b8379d25eb861bbc91e9f69472b67edca9312b835f806eab25dc980f0e45762ce703e9b88ddde4b1e35c1dbfa825edb684c7d9967ca900941707cd9095091e66e3bb7c030fc6aa1be86f5597cecb76a91bf6106c71f1ac930ed98bf2d9147f18700c0fd47b471fd763d1f9ff6d70349b393bca30b8a7a120f2660a4a17d15ba778aa7f1d17cd6963d3b4ee7f95f1d26fbc0fda2691251034cc737eb6c149a8042a310ed091ede1f7645b10f4a3bd87d3262e33e932efd11f50cd1c2bdc844032c6ab4cfadde8cc0089687a569714c9674a5fd6ad65cfd32af4a900f513e59e8e452e0aa71cbec6d588ab59c553dd129b32bf9c46096369b26d8a4181a4d9b1f11ca0c6c02f0dc3fda0bb08e0e749e8b3e140ac86edee54d905064aeb8e4b3cab9c1d366eef0294f093384b40c8a0bb9ce514ebe3dbfca5e7250a4ed1d1430336251b5cb03920f3d4a4dc662d7e581e57367e159381faa65cf8976b004073e3b27c64f9a4b2058c810fc181fd6a299869bbd3d4cc49cdd13cbfc116529079b8e2fd221ff0a4f01f9f7351370c660478067aef2b93507f722755cbd1fd4520bba6bf9e7b0d3c4fe84ba31f4dbfa9f0b739be285b83ef557980923c49d46060fd20b940c3b9483c1da78afdbe2d9b45621e70a60cf0e681fc2c21da6925e6d26003c779c9909a64f614a344b74bbf0a204209c6e144fc0761f5fcf17d34b8db2b2b750d2fddfb2b416cffb1548befe9d7e48a2c65606619fd10939f8c280cc01d14247653fd920d3eb5f6019d2b0fdb6da8fabd926ee73d6c6bd5d6d9cb1a40a236658fbb4500d115e453402fc63d031639227948df30565d76e0ef5ec5e8fea59d5a0a24094ce89f2604200202536c4f16527271ff3b58c0f1dd50944d4f2319bd32affbb050d9b9e0c9854affe9d7389760faeb173f56585dbb80ad5706ff8e706d35a9a0113e4a3912925b326a9925b24d0d119db90e0fe4f2f8f588c4dd0a44ed64c268539604ffb08882edc09c458fa8295527b5b002aad395e05f1a1aaa990abe5f303f305855e33f5f48df81f500567ed25f4cbd6c2f345547518d26a04b6e4c0f3a160282fae593c95c47eb1d0f60d43521ac89a66439049f9f42fb9fcbe7c7b4025793bb93d43059d35d99ecb8dad1195b23075832b71b590a098e5debad28a826e9d5832cb8199e5279ae5834626f3f33bd4434171a4a44330cbea921391ee3ee6057d608276453ca8f3cdac5e1aaada665fa970267f86a85804ca19ab4dbfebcc8cf725c76db8620bdc14e0e9a9657bf87b7113c04589751f57ca83220b8eb6cec892f02dc0d9726a619a14cdd4f49d96d27b07b657fd910c1ef37a9ed138cc3f8a00d6ce1f149a3f702678ea3453b871492d628eec2e73746e90debf0299096dc22203c93717386803e18e74db77be1e0c9db34c51948594fefb60b59a5a8cec14a80c0a340cc3f08433a2103d3ae77f783a4b1cad05beb858dd59dc42e1f85559bf716685772aa1b3e88d8a039bdfe5b373bf959afa67d359ce4763d9ace100323af095819006ce5baf43a2b70bf70805811a79bce847c7dedd2c6c52fdc476e11b426b5846c5a8e0d7056c6e23e4208402a088eaf4c802d3d7b30f8c339eb47152f28df4b5d6361fee61685307d902d8969c01d7fdaec4f06f7491cd44866d41a8a5cace53510b0794a872c804bc135d554f7c0a9208878611b427e3cfcf3873c7e348a0275fa56f052a8f3e99a5d7c47c46b1aaaebd86497b6ebdaaf868196358a130b3977d6ce9cd2b564443dc6da7ba3c1c9070fd56ceefaac9feb28da98011fc227b321fb7907abca0056c5ceb224cfef6ad037338e16f667ada1c30600b625bb76db01a641f5dd9b96eea7d75e6576576e2d76563b23f41d2e45fb761093167761c6509d59f5041cdc35dadf8c192a874ce0a7607fc87d28bfb759eb9f7b854a2ac4ac3027b9c7642f3bfa0dfab92a5814119b94c0422498265426af888b8d01a8e9b19f95051376c47d08a0077f37a032a37c478e1a0be451ccdbf983f765044dbd58432f39783ed952cbf5b5175faf36351f1dc780da2ec358723d4288788797085b29a3afabbdd17e425a2491cb82f89c82cb24f6a0530757c6f677c6432206ecc5025d8594aa046daaca4774b6351afb525f43900b8c7c785db8a8f276585df9dd654ca06abf8b98b45fbe5c5345b49b02e8fc3014f0907de92e53a989ecdf8eab53a83a95f7d4f7d47d4cbece72e80e8816afed1cda8eb71160a10b1ce7eb7efdc6a120fc99cb549943f5a0ab5d33b2a16dd4336e462cce25216304711c6aaada9fb9b75fcea59ddff9ee578b5440ff601ac2de1879d92741d157bc3cd72458c41adabc7872c8651ca159ebaa1476f5c4dac71c523486ca80e5aa7a457378462dae9430865b097c3b1e8c081c0de9b457ad7134c620cbb78c34fb3f16a6bf54c57048698c2b84a9516ca4245065c10455b386100771efe681e6040aed359e919676668aff0422fa42d4702c3fbd2bf0c3cc6f66fe710a1aaec2335180c7172a6dff7bd031707212cc444245d342056441708911184fb2a071d5eeaacb21bcd0de51aea2267df12722bf9428ade4aae30af1fb98c249bd4043571dbfc434da4aa983196b83cbe2d6fb48616b2118a8cf0da95986c685d0e2784e62274f7d74d4d47851adee3dc4537b35111246d9a558e6cb291305c17c9f750b41fe181312da7db51e1b64429457bdc5e65976100d640f285df3425847d5e104d4595ffd52d0adcc66adf09bb6a7dcc29a80b18498b00cc30f018c6c552e0412d8b11786ae162808abbaa82f9d8059e7a6d9e9d6c9bcf187712044d8a78708a31f3f0120cf8ed97266f5bc6610b68e5270a8bca7227026baea63cab81c56d212ca954918417dded2d9242a63a899b3b3e8da41ac6fc5a7764ef686677a1932c3e1583759214a12ca7b95b49f264621e642fe64b7fbeb07d8885f629ed57e849c90b27397af1d4f8ada3d21601c387bb0d88bb560c563f9093391a5b2195104c8db6cd62c134230097cf2a74b0f366439f93996a44ef807f221ed0de165efe6816341fc0078f6fc793cd4386607952192dfd1ea3653e2c715a1e6a1d0b45f54ae7bf9733c80f296c431400da75bccc7ab77b9cc8a82c96243a34dba89a1102e1fa6f40029164dd8f8e2da2915cc4c5d93b7e22e611980e079fdca3bad81d1237c09326ebed7f67665899f7ae8d2c427c41865ddefa03a51334bdb3e447a83474f1da6908112deade58bb502376f6a87c1908a5ee056e3501dc9b60723e34c1517b6175c4ab4303ed48f142ba4fb884b1e6f30c39c0141db38293791f3a096d99b7f51cfa6508cca112366f7ef87d59e8720589501fce67ae2073dea5087238509202ac62524175b7a91209f24ecda849eeb4f6afd6b9a86de034d32f86a8b2668bdf92ac15389054903389d63553e27c738ca214a95cd9a3c445fde52f47bb2bdc9795c31c69568e8da99b3b874c1b9cf6be2cc20d3b4e1628840c83fb3f9e9916fd62424296d1f33a0bb33fa37a68fbafb15957782e19c3b774d24f171c304837d372565391cd56da172a29f08164345041fbdc62bb7e9a1882ecdfb8874edb6c00eb089f2688bd29e240bdccca8260be8852716359f4a56593efd761f5ef3e6084c9754f47a87220502769977a8e1ab0df0b5f16baf5f2738cfb4cda6407174aa8a3749fd3c2d0030137ef063ff2fb0a87a60f4bdaba24e1c09e5959a6f7ab1394e19dc2a16306e0f91470193cfe82f158c07300e138fd5883f6a23343bf7b161e84ee0d570e6fa62d17430b5bca7d2b523f72498198c8222c6b3ce64d13ad952832b65cbfcbee5a8694dfa2d35e40266eb373244cfd0943517646f1b8e80d44a64a88ab4af64174f606ef92c00052a3e1f245326895f8da601eaa8a219f233dd763f084605a19da5ca53ebf216b701498d5da97513f3e075d153f587555368f33c20216535b77f7bba4826a1a560774e21c8867b55b0de7827704a1c0c02b772f02abdba825d201f31e823c749a9f5c33b0210cd1a22e6686cd5857b20e867315f7a86e7b91b6e3d089a86b60ceff1664531675ffa2ff2757198dac15eebd58204782ccfaf404c2a61e1b41512250cbf5fa850697115ab1b242f3ee66b715134331941068ae4173079dc4eea0734108c2bf6147b7c3d885db8f7d966b4559c17f5d77c4753ca0f86ba8e2b7d9c46ccd751300b8ea94a5b384eeec8a8db218650390a6d0ab73dbb23c06557f98826104e38774091e27121c5df4ccc629fe1a935b8e17ad09943a0691c9268000aa7b8f96cf926ac800fa88c8d5ce9939650f3bf7bf2c14cd50b1b8a1bc7d35a4fd458217ce0016faa1f16ea24c6263d77c2385399527d2b8836f0400da2447e470076606d1dc4b611f3cb7997fc36d6f699574854b091d9508d61c394e7739bba50961c210d56ac6e252980ad6dc053ccb154f9bd62b5bf41fa24fece0616ebb5b02c2fe4e5c574d545d9b523c4d1f81b010dd78680a69fc28db4890cfc68e57d6f655197b3767c57355a6e24594dfa0e625da8f2f07bf3e28fb4db14eafa9baa1b9b17e082bdfa3620d54f31400fa21a554a295a0d4aa87546644cbfc5946d34913a4bceec6a5087fa135f4662ff77f19679348a4c6eb1f275ae3e87155ee668472dbdcbcc251e69fd94c77326a966034256f661f1da7d936a783c21c6846e77135aaabb168e140e4ae2142a42063a3e640aa94e904a4b0a055da1f849bb376de662aa573f364dda38adae61229b41353772edae72831be5b57cbb38c85be144a64f1eab47fc5a730272e2599d71686c830203c9a246b4fcd5fdcbd6839e86128447c78b04e25d49795019fb3b5c42b1707421d5c692e29d4e42fade5daf6e738e6afdf06d5e4baf5b276238976a7211c4014cf109b66537f6e61186f3fb82cd5d555425c41c422380cf6fac409eaadf773f6466169d88ab04821376bebb153615b297de5b765fe9d5a9b81f7f96d69e4ce0183d572fb63ae1af4db9b8b681eecd6ba9160945199dc27fe1aab602d0029eeb80fd5d6001d83bb5cfdf5a84de5a22afaf44165b89535768d7b9166c2016c163417577691be964672888a9fe847acb427460db4739d1026bf76ae572c718673e1126abea3bbd497a929dcb03462a41c4ef6584c3135537bb1772fbbfe3e1ad489106eb4663d7b49b624b3097a5883b540df787fad9113d638fbd6db9373b809df79bf7d4e0f2161c0e432e098b31a4235c883eea6145b8ac4ccea7e11174d15c87e77d351643c5e6d88672e8d9f4a7c399bd760771d0d689fb57fc601b08753c8fd682703b2930bc77dbc133620b24b47b508efbd4d0ee1a59e77485c28053a620e403f0feb397910fd572f1306cc80774e6d28ebe51b50ac9b6e1f26e45b1b7d93400b135a5bef31ac89287f1d083b2d87b9558e4d1c1e853eb1b96fe8c325324b01d732516cf60eeb88ff43836a0575feb31d473d58d78e598c0775ff84b6a6ac85a14b5df91b3e62b290b0587a043d8e74bf6ccd29a8d355dcf21b5e9c30e7cf8903cdfb21b6fb2aed66064976471ec50305fd38b8f7578f318170dea222293ec5979eda8f392a40ea41b2791808df26e16eeb5aa5ce234fb8100dd7fcefc7dffd254dca03105bdc32c33844f07fb1aec97fb742ff9691ffa8ec4453d2e227dae423fd3db2a14579d35fa9045c24c7ff84e8cf9c9a5a3e12aaa9ee3d0980bf3bdbd608ccc3f29a9b1d2fcd6218b29e615b8b6111bcc7d9e47dd99158575f28de44185663f897c82ceeb8badd6bea2c5e6a67dbaa5daac8d5d2f2368d26e026d174c5da563ec5c7960293e0ac468dfa0887b5d7a2c1435bd627b22064c64970cfab87b386dd81f6f29ed9721b045c40207a08b19860bcc7eeea890bc6835e58a55dc68c3a7c4d29ed6c256933c9f2287c86286053b473e3ff16116e39cb70ac7be4ecf811eb3e0e6d711de61ee0e1241dd16bc7ff32f912dafe13459296cf23463d68f58e58ac7a4e43817990b7408a2596602a149e5cdb28602acbd648c2a019b2a96e49f2fe02df8e3cd56c89daf95a106c36ccab9663adfa09423195fe7fe20268f29e3c2bc1e299d084683dfdd66dcbeced3059f9abb495bdde08fbab8ec24659b6fbbba6de0bdfffea7537c6c3060b84db013e27adfc3a32eb904cac9988ea553eb3fe1f1058f1e62a8bf8b052396e61a287827c6cbfa1261f7757975907a43f257e180d72a33a165166e4eeedbd2092127fd226ea7fd05e1b0b7760f9416277ec66e27576e06d21d70d7e45e0839c1e5b3253f8809db32c6fb4c784c98f0c4a9c169e5df27c8534875960b35040e0bf54433d8a5ef6130bf7d32f5a4d961a028fa5b787999480e5a217a3516e7a437188ad2cc48d1448e3b1c410b26e5017a91e9c1d2e168446a64e8fd32f62ab870eb03201206942338de790498bd413e3f1d8b293381dbdb8c2920c472cbe1817cbfa3fac77688cefe383f6b60700932630e6b48c5ac8d2dc1d103c5ddb5ff72805f2abf889831f172937c8165529a7359743720b4cc51871125126f297315006c5145b191d7078430b41a725e4bc7c279c61613eca36775950bcadf5c9a451e77c4f2ea41ad8cdb30fc9dbaaacb69acd0de57082dd54155ae2cbdc6d820be15abdecf70d3564c8cee5bcd0a9196c6d59c66c715e52bffec77b7168d2149d7cbafead3bcc78446cf642b1616d340e5794356eb8afab7607d40b1fdab42a26d18c43e069d410e4bc4273900574279a3542b29eb218ce37f4e9dd14dd23066cfcbea2c14d3583d8ffc9095d72e52afad6fcec88479bf0268e4f130e1f5f6f2075607eb268b997f3fdbd6e4b16551b5d22d30416a4780ee7f2a765dac69444049494617a8d54c929692472c48b7541bc5d178d4f6e99e20007c2efc8c608a3f201fb605cdfcd444521c1d6d9bf8b087778c940742ce1bc51b4b105ba0486723ff6190c06ca2ed6483b18a03d3b055c307189a4db85a64e6cc38631f019e031faa8b819c9fa5b299090e883a84dff52177f16c25c70771e57b27d75bb4ed6aa0f5ffcf6137fdad7d449a5106589555ef152356ebbe1e91c3998940b91a7c2daf8f6e0c6216962876b84f99ffe4523a1763d6664ab90f5ad352222f1114ea00da748fa469e221cb996e5403fb86d98ee45a4a14409dff2dca5cbc440215b1044facc70d67aeedba506b5535bfa28f6308b275c636de28bc05e8edd1098fde41928cc0b59714184bfeeb1fff1f6862e5a135a7ce3c3642659046eb1a629829b4d5ceed3d667a2b00cfc729f689bd671bdcba31d4b825da237e6fb8543bc97780934848098c64ccb9a72eace20a21a46034eb01421dc8b084cda08db3eb01e6472d3b9d3ea68a65c6246a3d763bd7383ddc8edc5fbce102da0f000ff128e06ed91dda750f2bf64fe315d1fa9ef9e8a112de41301ccba11e2999f15a554c7d7b649b19c512a5db520f6aabb377cf596411dbaae23743e0cd36af2ffa335afe607f6fc5688cc2e2e409564a1d876198e8c8a383be91374657668ecc3073b5e0768c144604631cedbf99908147c9e071057a2de1141715a72ac53728635315ccff45a8433530246b0d4bb3c4e2ac7f29f025894423755706cf57900d8ededb50224705684f9e1d1f8cbfcabead474607ca4ec160875e619d85c0d1fc396271d87d6410db3b778eb1b33b84ae8b7ad13b82a9fe4fb7db413b69f3fef4c5a64d6ca4228a60f0bfecd0800550f005fa96ae5aaa72869480c902f3b3bad423258549e3c7f452bb828b6013014ff2a9162eba0035a65d89bab1d4b9b448c1c6208e278a6db164e33859c8cca2a2582e29a0fcc8f463769b34dd08acbb85005f9bcfb3e556abf199ef849a6e45036a591cd119547ef601078a87c4f8601f3f81ca8f453df090a4e42dd0d7d10814342b03d59f889b06fa47a5ae520ea2041bc24d38f26d060d16ccac384480c5be696fb80d9b8b65786087b6f8b9f0d72a114cd29da06f8d8d420167d27d3c36d742003ab1b1c1d8305c48d714f867a9d0f99f3e88e5b4ce8a8dae99bba1454f5ade07321e98043a29f8f935d88931fd278ee9bb542d6e83a9a6fc5d9d1fdb852e8d70ffccfa19cc2c44b04a2c2af2b66912f3ecefe81d7feba1f7d385371d75dd9956a8a298c2b95db3e7fe1dc8c488e288719deae31f9d3f16113e6f057c57268ac7eb1458d494026b31257706d1899434e88a8a0971ca54b37eb1aa6de936e19103c0723ddcc070fde14634f32992953340ed00ec786dc1d442d4ec0409bb6aeaeb99c451bc1e2f441b0e0ec9aa350240e7e804f61e76553087517bd03ff2ed41e3a7c1ce2c3bf4bdfebbdf4b70c5649051282973b31e7091127b346e90a7b39545b0b4920a5699fcad68285a89ec38abb028601e91004fad4d70fb9c7b741e13ec6f5b884c81997c2f1e234f4011a87bf82102ca2299dc1d67abcd8d5881932f4f60ed3242e105c5428744ce9bc8a6034659e8674d7d1ea7650060425f6c8dc0b25aa0c7d37cf63ed74aeedc7dcf6d8ec762a1d463b88370496529313dc3f9b3191dd2307300330dbd61741707edd1fe8faf76a612ef443fbeb3b5392bc0740780bc7d81f883fd5a55fb07e0412c2d7f766d5973950531f1fcc4eaf1e42ab39720510ba172f1130a61fee3b28da4acfebb7341c290182383f49032a904e9d33f84d98e31bb28dce20153ed5136f4194d9b2ea2921e47efc42350c4960192b0003eee5595c624082b5bd7a911fcb49e35535d976e5848c92e3f878542dbc2e9285766cbc7ef4b62143d05b9f76117ba2b79c53273a2093bde7bae9b4076262af3bd79d0cb12fa4ed41b19c8b3b67075e884fa2772f9be52895d36a85cd127d5bed6e74531aa25e7a6c8a30ef30c94d7ea8649943170ebd3a25f134b1b60353421a2783dd28ffba98afe67cd64df15e998e62aa8cb21c7d0955ad04e632d4fe97e306c1f5e621ab5451ac6bf64ce15eb2a1272cb5e88aab9b8dbffb53801afd19fdc2649132dd712b99a5b435e1cceabab16a7ce87c37ddc8b3556e067124e9414555831c5d30f360641301233d7279830fd8465f967a7b13085033c3ba538b7b0d69889c5915e0bb0272d0e250aa600b39bcf68e6b76a22a12d3fd964204061aa2bdf363ae3aeb8449e3653ecc5c04f4d49570436ef316e738f37cb67379855af5c741e440dd99cc75f96ae42dd613b022ab0b7e4792fa34e011716f154151e4ef55935c6828f63ad29eb4a5cdf693039cb81a0e5ad437bb75e98e616e03b20f0c2e9488f327fc0207ab9f82e56411a62fdd1577c9e1021e80e0972617739c27e8864dc53c365bb049b4051684992f73d6ee156133a1c5157af058c79ec0f417af11f8921caad915ec58bb6a496d8e8061c8892ec44567e10ed631a24d55ec057f7ba931302bf4f57fea6d1d6809f36d3a4998a73076009868ba6dc81a98e5baa7011efd33d6258b82ecff838fb75d112ecd2985cc601687818cfda1f9d41ae27763805d3cb4b3df5bf21ba07e765319ca3b81a48e660a45122101d14569a64c7846ce3c23625e79e22069d85385b15854f7447e287bea02969e11e68d4dae6eff4d4e0258b6de1bd6c52b310510a5be12f556e63af70f8bde77278a3f4896b959a43b39dc3f07cd320305d358534fd9bd60a002113b673503f51cad556a860ccbf5802c1f061c5a18adf56765733b07b1bd64cbf6d2c4e9afba61193985a43e18f110ed4368f42b65ec4ea5e6ec44bd5409448edcd66200730966d0beed5f2093380a5633e82775d4df6f0213b4fbfb938e972126d023c6516ad0587a56886fcbc1d38da33e5642e544a79acd5e66a10c2334df4e7dbe6724a72a10106cea16c4848f67668d638152c34981b30d26cdb84cdefb05462eecddadea733679b450783812a896f3cff1974ba81e272188915fa36188f821dd72dacb799a2c2ab2d9182c5df52f6d200917411b4af5fa2d489395d7802920232727f0cc201197ca0702a990368734df9fe279393c1600e1f99b76697dfb26f6ea726fd668cf71703df885dddfcf0733415e89d7da095b968a0072096be0cd703380e668407fef336b912b702e45f42f7262e9775ae555d3ac95d308cfa4a824bc99996a847f8ecefc6668f45c94f320e0b1decff1839cb372820f9895dcfa8655d1ad65509ebbffe14c2a81cce3651c8d3c2b3d7666b76dc3c1e761a5b36b8df0b9190ad9217ab66a9f4e1c90aea1150bc66fe62c17c6b2af2180e80c5c26456dc57479ea6b5995f1134d76d70c38b4483422dfd5c9535fcb863291aa5a1883cd09cc0e460186d6279439209ef408b35309e626ce128c13ad29361b62333423164af5ffac5385bafbd5facc8a2f6d35ee6dadc66dde103344d7d30e2c80aae857dc170edddf99c1bc700b23fe61d1571036fa022fad72d1abb97fbf40f012e633ac82c1079c2b5ab85236e14d33d055a6e3b69aeb0be3abbe1401b310d67d51895a762aa3a4ea1b22a5620919b8cf95f774c7f8377293316d125b56623be92c99259c04b01bd20ca567d3fea7dfb2d329bf57768b1dd4ad48cfa14ed5811ac94f56603b075fc7eabf580b6688d81d6343b42f63fcc71494548ec0f7eb889eeb331661b92f63ab765605a83db4e4c909b50c8e1918c058f0214b328045796b8238fa26eb7a6bc2b903b49cfee83a6aa49397043b0cb5023cbd4ec51e0eb34ae1edd312df27788fe09327331531b7dbcae433b6cb46f4e198a164eced7e0687e47079e022948ca92996490ab8895cf6c3702dc8b22c7a483e6a7ea71355db944ca68ff2c937bf3c14dc0b5e9571e356cec3dc67fa66ee418c04cd3b8a595125178dab79508687ad86b9210b9b2e536a0865ae30e858c1fbc4c88a4586c3a911cd38dc36a6afa5fab918f2910a3081d4c706702bb0de2f906a9ab1f4eca442bb06245296bb6c23f55181ba2bcb999984507af9eca9260aaabc0c22d5cf37023d03be96d7f6255177c0de0302d0300cde738cb4534fade5c0316fc1890c4a4b256948db4ac17931e976a2c8eb5651856904d09a065a3a9d68c032e5f06f2849be73a82f292ca781de0c6be5f6fa74838c17d17cb112d7a8323243cc4084d1287726e24479785dc7329df1828e0f7aeb4ff40c351301549c58c29cd633f80a4d454d26614908b56e9f166538703ad0e4d9eec2266bf77ee33c101623097c07c6736469c3bb2cd7960eafa42cbd3df77a342b01b3719c919c0c8754f53b85f72b19d072a522aad9000bc83080c9ade90ae955b814798598d039079459dd80b91859f0a8536eda91181c9e45b4aec6b59c6eaf834061925684f8a50f7bc2ba6ce4cb43fe0a549245bf85c0815331bf07757a0279b12292a1f30a23ffd758919bc3a8c40f1726206372296225752b50894b690ce8e23d1f95847f50be64b1c1ac11b49a240afb13b39a59cda492cf2e26fe456a3328ea35e5523a9d5eedc6a0ef49504c47d1e5ef81dff4768f4430ec4141ea5ce0b2b5c9f40e8a9684a05b4d7094244f2783073e18e40e5074497eb9c3a35e82550a0b35c0a454850553fb7b905858dc362636c8e44432566451e721646afdaf14abc971967808977226269b1be48af2f259b81fef0b30cac4644bbb32f1a2aa8828451ff06a816cdca26f571a486535e46d2c5326cffb062c929448d4d6c9fd60281333d1d429a7f433da25b246b2c7ef42c3afac4c0d348976f86b1c9a7361de68801a85c22451f1df5907bd993d1a3d54b2b58cd7025f65423ed098bbc1d563dce42b5452260cf806ae8162d702b13c099e32442b2c2dc844451adb808c29958798ce3fca84a2923f00d63adc2893701dc39da7df670799f9983e0c53d7005e25cc4807a6e04cb601bcf5de31cf213314665761afcc012a90c1e998ab8ffac1598220e19b0d560ec1bf331fb6d25b1c8e8a211379836d7c553d74d083ff538afb0436ca1857d183ab128cc5857afdaa290690b6b125b347f5543a843189ced4c97416a9b956801bc2c741609e6266b53ac94e324c6abe955022c5a0350d337e28a2cfc4e3af4b333f7922f3a876334354bc32d1b60af767c62c6eb63451247c84e7b61072877b5aac545ba5c83473ba06a9acbb303d9b7e5e8589728cda331319054555ba1c5ae5bfc14b9944e49cb09d6c3b38ebfb689d30b6f67cacc28fd74a2b9b694f1739cb3d5e69b6220f043aab56d1e2fba5562af6468fee2d71d2a3c954ac08eec438c8951e6ba204e8a6233c264085799832cec481d96a4cb2e6c0cf47d445e9b85abef0da101cebec4762e11c4a60f250e1a1eec15af735cd80f3087962a74c338ab94ce0c830375a69943820b4eb338e272702c1593c5735a4781e2cac1289e6353611caf78ec8f91695008dd9e7b95e4a2906129ef08c0868b83e49b668ade3608c24b9734926ea8952e81c516cc046b4cc8f65141cc53bb59b7ad1d052a28819d904e28edc0730bdf6077c6caa70279576826c254d9c5fa665939aa58a2f3cc45fb1325a4b78fd3e5d333d9da30dfb9e64eed1d9ec1dba5ce3fa02ee5b33c559d7c2b635ed82efdf668be63e0261816dc7f45523e6fc7a6b244e845852e16de2544ee0d6207a68b15218fa9b8cff200b262a430cd9f6c2eb1b85d18914b8bc19d017c8dddf621fa12bf00fbe286a4f643b9df20eed4f1f5895179ad93b3262dde663ad587cc31fdf7082addbd2ec4abcbfac48b950c541635d5a522b15902d4bb2aa987004a6bbf7277573fc3d608d00b463d2eb8a4d8dabf08f7428c4f2e7c071fd7b072f0c7fe9988b4753a2d5847527ebc7672f3308b5ac070e99d5c0a8c14c885ee0be2e181d70c082591f8bc325ea1c407f6303b85a09badffbb3e8323007cbfa145bec750a28806ec56f6d8afc2b278657e40fef2804b2243264664c54c1fd49a1af71a8bb2743e5d2b6796075ac1cf9b56b86316ab9ea9011d02eaa7060f4fa72ae2f2e4933bdedc56108fc0d006b43446c76eba7737c11f494864734ecb829213b5b011b8457ff100a4c80f812209e98319a640b741b8141ec505c4bfd135cf4b50055994b1d187518fcbbd429e1c08ca5f4725824df75116c77747af30944484e881958be07022f30a4310b558e2b12f68c14740cdffe03a614c54c3a6d1e93b773b3833af096569517ff205194fffe2e9d27822bef553027185af384052f04a79286146256596863f80d337e73fc7ea4bbba83834dc3580cf5e09632942d1984d55fee1200e3e88802463b578194688f827d256b44a591792c54ed85dd21b4a274e2bd93d8c2cbf66e33ec5faeff19300875c5f4d423258ef0d0655a8a40375fa17889007b6ce70bc5b7445c5699e8e3a1495eebed2b5941b775a7b62a15c86e794ce9e0b23edd9b7443d76edcee68cfa72ca2a7b281b22a00efd298d355a9a100cc1188fd787a0f9b4ae7020861d2c6f34c95df82c88199dce04c83326f3ff5d8022f3180e0db2fda9eac3c53390e826b5287f445a55eba76a30238081e3268e401c7a39a4b248e4180cc019b0010916d266a3242e3c95afa4f9c37d57b53e8c04802d850a65db0fb33d85f48fdf6ca383579ac0731598502a330151cffa6474334c247304563d028154a5a46e95a65be2bc1f0793432361b27186920b857476ab2128a6d94714a0b6aa74abdbbbeee81ea90f84c9b525fa84f9a309aa13c3af8d151fb23f56fc22da5036d721977f525c1f2527f7d7c61ef3de16628c06dc6de3d8f272e13566984e9ca80cbc2746c13e6077e1f98d87588722173e3a235c62f2d90b2ac6ccb5ba2a606750d15dd9eb1c6fce3d06da01c8a87784ed4a3b0173f6534cbb24c419e5b189c80dd945d9c753c07050f5b0f03de70dfdf63bd1b6da00db418c0598c53ebb165d5b0b26b601975e920c9c3624d6c5df23ae072b1c89b2a5c37bc4ffd350dcbec790eab12e66d43821fbcd0b510d6ff6e554efc4222ef5d493e54b9f69be3642f9e0b569bc96e9b4687ea52388abd7f3878b8b14a3bf4a45f00bff17f053007dc03be68c767167236cbca7ecaf1bfcb1be1aeaa32d5c3f48e934fc10e82ef14cb501260f25ff6d23b24d1f59181f06ed968ce7933990f1a5d50b0bc4e252aec18d0f3a5e0edc12b16846b6f0999da8bdc1f9e8a743329280a8dc4c6ac41fc03e3049a9151bfec15273088281d0abe28558994460b2a237bdcf505c4401b0083ee92365beb28462f5497f1c2d57550d31e0192bbd055c6c61bbb7aded79d6752554600150bb14b65d96453f3ae82a813ce0c4abf70654cde1639531c01bd0efc989a5de10dd3656a0e3641aea204b980d3d4cd70dc3cbea6bad9ecc305b7a947e4d69d00fe36124e75302fe05b81631d0a01c8c37753e744e551da6e8789a83f99bb256862ffb991a57e6a02f264ab2ddea497de3633914bc8f53aa40815423e17a3d9772976f7b3920428730c5092704427c5fbc5448bee295de6bbe4da0a2927cf14a81de4a8479426d12e25bfcd9d0e4a720b8b051205cc434edf070e4b495f4f8bafbc722299af2b7bc516595e6243af86eafa059ef9a8241b17b13581162dc940a45e8a987b7dfb7142d4e5e39796137c35ae09163b56aa58d16ac56b033f25082f478e780e83a87e008efb815139137374c47b78f227cfb752b6c677b4ef1861d0a5cbb60ae73a4a0554cba50341640a22256eb4724da21de90e264212ac6b6e694c5d678341f62abcb7e94a7e6a24becc70a5ef60a5bc5b7b673fbde0e128cb0ddf169a70bec3a961d7e60d29e87f523ec08d3954aefca0e99a5201fa54a41ba0ca3a02e991e750aaa5468690e9b970b6f7ea9fbed0737bfa7f5903f97909ed399af414731a08926be414eb2e8a108cd99d54532f104bee06bfd519a64d208316e86d081adffd7ab5ce23fe9beeb6c5d66f456f81774afb6498eb769bda9b10ced7af2386644a6c7cefac4417fb5615361fdf015c5838c13bd9f93eb614867b5c46781d15a0e5d65cdf06d02b4b9fa832937a009d5fe3718bc1b6f49a690661eedc5cba9c345894a25ca7ceb6032fd6dabb2a960188d3056e95d374663d02611950fc7badbf9b39cafc8c721e016cba5004aa2280d87b30bdfbd0d91193032dee2d166ebc90de7345faae765b622e9631d4764a4e4e050a9517ae2998b1a2f77c900a62f0040a23630462d022356dfdfc4a95cec25145a812bafce7df40f5192b62f9c8e24018ec8b40e0550198dedfdacbd5268e8c2bc4dda4479caeb9c47ef51a59050f406e00a8bf8cc053979b096ca43c16b54cce728dd62cf81ef9b7dcf7921e931845b6341bc796ffc4bbb71bd5003438d546faaac77c628aad307ae442ae6aadbe168889de0fea0ace860631c3ddf73c03c2a3ee029865112a1a01ae1fda3908bd57f6d443d87b47019a7f10c6ec9caaca787e3fa1ccd5c409253d41c0390823873341d4b13811f97ec30b2cdfe5071a5b15f0e972950022b5c692de81469015487bf28504a5c8b87665fc304c5e250ef218e73ed4c5c3b48dabbeb4519e1de88c63797dd48c49f4782d431a56c7512fd6a5c05bec1b5ed011d52fc926c3f4440319d3f4e2e2928b13fb0ee21217df3bfedc24bfd5dc32d5776dbba5cb609a77bf281d9e0c0c0527498e798c0700bf8d8e61efb9ae4dc1cec9d4be69801f32694a0590033e3d4244f47f8d997ad71df374134d755dd11b2a535163b5aa13f47292449394e3f79c218d8151a583d0cb9b1f2627bd49df3e79f47c18ef0713d58fa8fef8a886ab11904077c01992f0541364843721c48abf116e19c4da80cbff9613e7e41397b2f0513355891a6c82efb9ac7a762d1ce5cf0cc7de95a2c0e0ef3ee4a933656e7ac25908987fc5110e30bc8e85d30faa2b69919e4f1dc0a367a03a22b08b993a35a494d99583602d913d10bc61cf12f4c84e3b0cb1aa6eb83fd9c1770f036bd706ad927f592396f59506a5c95d6643339b8ab39e0005a61ea31a1cd9427869940ff882765512d921ef18f3e87f82c461baa7044a11bf419e80ae2f5383560707c63c199fcb9e96b673ac12cd0ccab45249c5e3679d6bab0d11096469c5da63c10d8adbc28c25a70b430b53075e17861eae0ebe26dcd08b2857f2656d894ed4cb0add00f7528bdf333a03a24a6e595c15a361ccce2b7996b2a81efd0afdb50c351cdcb2a039b2bc3321039e5723214e76fa9f5be9cea908d1456b4aa0913534b231b6fce81b14f5fe19f53ed3eba95f1aa283397cdea90c403a06d2310684e13b956be29d084f960701d92796bec60019ebd9801504d04e7c1da44ea7a130ce50c1a55cb261d40b3202cf845bd74d6d543b71852127bd5803225a0096eedb2863ae47e7727d1726ff1958b04c246730876cf93302df689cb58825f21aed683f526a9cdcafe229db5a312558f8952b128995e15212e53849b9ff507505cb0260bcf6bf5eadc540431ca33520b21bcac828ec0dc00872949cdcb513e0cbaf3c649a252af75d775dd9de841329cdaa689d0a45afd6c689972f34212629448acae30a91136f0e7136f88868e1514564bb3946442b1047742eff11efd1351252289a04da84a884e8bc5be248a506a164a3a4cc71ec0b78424fecdb7032d48ba0e1b75c9cef4286ce7ade2b2b28c446e9b13a7a5a42e2789337fca78dc9b24690a4712367b08732645d8c1f07c32badf1c978751238e4865725c6badd8871b76d7060d79047b18b36de69daf89eae0de35fb409e344ed006923f8a5631138199262e1a2d872358069741d009f88ff7c205d2b99abc0c425cbff51330d3706bc8d67f888c8dbc87b60098cf66a768f0c53d1e4f1579ef46bb2e926f26e41f555a453d552c740a237deaaddda2fce1b34a1f6701f0e4f48b018072435372991942332b45de8007ad274c78d7e099865e2f16d1211f925bf004254a10ce701a05d4548fc4b0f5dc3f5ac14b689f630ff65eec42da10f1f0d32eaaf3ed6ef145ed1328398f8e8d1872af641c3efd03983e5caf6e7292eda8d15a3053fc136c7901d2409988ba78ec6197b3b6906d9759aa5f201f76bd9cbd5619a4f122dc92f774af532abc5b0aaab2f0507803c5809f126f8b23707a5cc26a08c1f8da8b26d149ac3fa4a79928807ff333368f9edbbaddce288319abe4616c611b01563802847e9abe3a346d0a993d6d03a6771e90a8cbbb8c6b0deecf1917a3c9307e12db9abaa20b4d5d4c6d9c284fa8720dc76a99e03f210eb7e7b2e100a7e2ccef3df59d7eceb5b2b3f39f91d88ce206612e5cb0165a359e070efdfd6372b996a10b109f3dbf39b43260057ec9dba8b6c8d9d1e394936ab2e21e96d6d5b442089d47b42550de52df71e8b73b82cb830b12210eb62372e56ede66c38dd56a76c244eff080a10291ae63f55f568fcd89e4a3b1d14a0ca38c0e4a4aa1d0e2c72958ab15afb84bf5ccfd8707f4969a7bc3753e7f3bfbe7cda39c25bd59e7f15d1e03362cf9648a27cbf3d4c190e219f25101673832260114c99c2906b7b7afbfac36b18251217c7a439d971f20f03e09bc4c2b83680ce484de08d239f9c64d23820c96de5f001e7f653d6ed5714e591cce005647774574b778f9b93a3965092266bc3351af632a11630a4dba519aff92e3d8e0e3786ddcb17e1ed5d7d227dc62e174e576bf3840e42e478af666222ef42d4a45349b4ddc4d68e825905e9089449ce255dc3205db619cb140d05817390ff533ae73752cea71eb554ac022327039858bdabcac92353922b6f7872e96286e55f7e769cfa111104b8205b3f27bc8720858b9a0000008f5ecb4e50ab660a49f52f008d6fe07d6923cbc7adef8d4b298fe9c737fa601bbf4e48895d2cba3095db4f1be587afa951f0e6d69948828de7aced2cbdf5a6543621d77716b4be7115b6b5e2efe1dd8aa463dd2c3a1db01b3e9409ebdee8e832de81c047d49cb035db35b4b02253f31a307c26a4f9993653682537cff1554de6b161ad278d39c9a156d8a491c8db5750692fc5560186b48106a8c257e6a7937e98a669632191cff8f647db764ddc20a3568e42f12bf7d83d20af9c6e15fbe5e65b056bf52216d5f61617da5eae90d6b32fefe0aaecd318f44a388f903333e19c432bd494e4e193f5852b8921b6ab249903e15ec31271ed62f3eb0852618ebd856d3229355ae5c3a2395756b3688663ca8ea0383d5c810c4c90b704983576eb382375392adcbab21799fec542e872aad8d97cc13953132cf77ab2a8e2ce5f3aed1219ad7201a577171a64dc2371d779d85b56a2e6f778bc11d208f67445fd33e5a008fbf54658c66191b7d7a9cf0c145fcce97928a2f36ceb5de11a39aa3330eaf93753e229563c88044cbbb3b01bb05ef5283d29f9624115b2345c04179d342d52f848bc214bc8dac651254681c9bbc98104f6bad713daba8505696d3bacb51a580fb41edd12075681986c070bff1f4f497eb014c15320090e025407921f8a4fdd924334cbb22d129f0597bdd53cfcd735182c135676f45982ddf8d8a1dd832111352ca489b30f4128de1481f09f21c2c044ddb55f42e6a74490d32c175dbe19cc3aaf0526434608ffa42eb5582414b4e15e8b38c56aad508a905788934fac28be296bc9353e1826cb939b01ec568f97e0dcac90124a26714f5ddb147d0f3d28af552a10801e19b377a6de121db63dd1b5da4765604e984c11b3beaf7e6e359a7bf520e88149d7cac9f3e656ba2a3ecbc168f8c888c31d722d3a6aa5bf31bb97426ab034f6339b824f2823b2a2244d08685b61110377d433752d097fcb50901a1c4c1ea99b844908e51693f6b0a6263dea32c8cdf3bf3433f0215105dfd6d9e52e3d41de3f1f55ee10fc7dd2ead694284ca5d9abdf2bc9e410832850740ce9e92eb1db5e6ed5a922381a5929d104c77d874d2197f030b58c271b592de14ad853185a3033d71089b5d82175cb042e6ca6b6b8ca010a005a249481bb0bc6a237f2a298abe74bd88aa0153a9254f5a938c1eee0b60832d730d9c9a0a0549f0a6c7ca658f19d64b7c9160af25173d6256a73f2ad72ee4d99a8cf11e8aa553ab66937b05798a91d9c06b149942a60d86bbdc5a53895f5e21166a892da4ba1a9a52bd46cd1018614d63398e06f63f5034b34f9f6b79e008615d092b02cf917256c3b9b8d6dba07238fe567bb70029bcfba7ba2fa2eb84d4a8858dee4e5a4c14172abdd9b6da020bfad74c5729653063a611b27ea4c8d900008c7565711ce5aae7b10189449136c6b9096797e3a97fa1e581df8fb68ba2f2170358bd688c485fd39778774218f11d4db634818b5e807385e73d7d6c50d19f6711f622891d4acc93ee38044e283f2b182ee09e1d0b44fc5108a59a4028e8971613918f4033d5dc9c66f67f98b670684a48e8e9118c20a50d1c63ccbf65937ea8d9d64deb6dc9f106d4b3e8f8167ffc214f985c8a265ab195ac2e8b438d628176749a21b15f9310f441aa9d3983d54737bf7e03ca4e78780c03f1ad481c782b31ff76fad990ae3b92f93eeefc9d35b27c617f578c2625281e244a1164011bdab32a8e5b400c1b365a585f4da943f80c8e045a72ea4accf4ac9219f8b8aab645fb4a8655b1e49c1473bd0c560c474c3c3ccdc57a38fb12238df2bc87019839eb59b2b6f97a6c8e249c6bd13ca0da487921675a3239157e672c357be7dfc6b68ba7e501d69d650f6a854a8a9820a4b58c3b78b852d5223e74680ed493a105f18e4e62966629481e95022f420140510258268e15491b761f8ddf496fc62f2402a2478011a2cf3180513ea59970398ce545fdb14ef2529ffb774623a560e9333ec73c04c472247c127d65ec0281b59d82747cc7504def59c45bf9c0ff6cf4bed95bc5599db363c20bba9d3bdf0c19506e613763ba01aed189a4fda0a6d4286a0656813b36eabc09734f4a52f3ba7466db27e5d69c97002966c2fb549db6d54dd002c617db6827955ac03cd78180739f0cc6d4e40e4cad021be80bc7e350ad525cd13494c8b642976f462704ea59122d4927d17308b580cb3dcab4bbd47484123f8561c9011510c04e307d1ff366bb6ebb54df33346c563656a9200a138e5ad040631f30d94b60c2ef61486a3e3376b52b92901e10146777b1d477cb5bda650abc0ea5e3e39082c3746d139417c460d29701594491a8246fa5813ac0299155f4ae1e9eae0f4ab51ece8e2131f32d9c5b1261df3e1753e58ef2a055e3291d8dca559f4ddca447f590a450ad747a229730dacc43b6d40debcb5641629c796ca62c2855912a4c18f6ae1bd84a420a94a5a8186f3464bcfce700d1ce97de895bbf335cc95a7bb71746564fd2c53e9148c5a41d90d0ae44ed0cca084d72388faf7efb543d7d6a620558e6e500a37917826ce37932996476563c2a5841574d02f1b7783464bd2b41b80224f26094d7f54e3aa40c9bed2510694482066c7c1377418da5192ee8e0d38710c1f28e9fbb848f9d98c7465a6d3ef52a2aace09e617431c81cdff368834d54d63e307e365594420addbaa978c827bb1c657b9568b5ea5078df3e73453af9cb24f7e18ba5d2908b91b0446f84d62a5f5300a9027435cf33b1abd549cd2eba0304388e2ff95d9f01a25e720332dfec20f82ac0b703bf90f77f8ffc340a0c582916df2ec2609a0ec875bdd67e9af0aeab87952027740cc262703b4d55d3cfc4052ac661065daafe29a7d430a2f83d23154664fced00e5a9c81eeeeba4e043e9ff077b95726f098c6def77bbfd78f207f059a5ec233280a132da5af17e590805cad5efdb628b1f319b016332840fa9556699941a5d076cc998ef2dbe57fa29e29027eb85426099958546d2b112bd6a931da8095ab25ec4139ffd59579f4121a5e4376bcddb6fcd7c916267e9e90469f3835f4a88e48b02a0a79a7d920c9ca8f7df63f470daf5a0d5e45130dda5107a181d4095e4df48e68b0d3a2dc6c1ab1e726ec789fe449193eab0c300ac5adfbce0970f916fda8542f9b4fbc6982b5c5417d1182262c4705d584587f63f1c7ad7228d70a139eff5de97867a6b8e78da9052923c5e4ae4967f027165f4cdc438381d9e86d11502cd2e9392bc25b9dccd5465dde24e900b38867b75e801f48fc59bb5fe5e3fd4a2258eb032f1c80976d1e0cce149415c83fc07e41c8328e9e2758012a380a02b7b01262937dce41848af679b9e1c0c8f75ec68bddbd6e421bc449e6c0f49af4450eeac5f3d425206d01ca0917b8177b2219ffc811bd77025fe28802bdfdfd922a0326cea902e57ab606370415a05560b818024069801543191188f634ef8ee0e662e65c2a047315a3b2bfa52816a693877efdb78a5f87721eb9286821c02ad87db746fc1e538fe2ed6830723fdeb165aa88e10c44db1a9f8abf33f8769433e6d5295796a908036238c9c37047e800a6d1b1e297d67ecb09b640f56bc4b526ea1e9bacf7d51eb2604a1ef269488ee0c940bd73ad5f94ee69a7af7a1b8ac2578ec5f349141875dba4cc1a45d2809fb16e391eacc36642b516e4fa6a919ee9098f77da937b19581c8dbc23b08bc37a9e4eb30d4875300577aaa83f2e8ddce707b80678e4293fcf4a5c38d8f48a10bbdfa9673bd283bde7c095d7828a885a74f272f6c725d639477f3fc1c225d137efec2d6ce6dce8e7dd5ff4112f7ca325851ab17aefdb8f193fd90b4f1eccf7d0b3f97553066a8b7dd96e762f57d6f88738e1a253abb20696748b0a3d6bb842f56a2abe87e2a2d74684f6a624dd5c341df2c3a84da8afc4d153024167fcfa0e9e5e190adf483a1b66feea67d8cbe16f5d996f58e7ba875fbd765e8cf7125cbcf96a5e16dc2b10b1c5457aa3ddab0e1d8ce3d2ada9c2cee280289033efb110b391819c3f648f6e2a18dd381b747929804fa426ee7308141177435788e13dde458a4c82fa2ae182252c35ce8c4e0531dd24a4fd6710d51f61c66522019c529efd0401dec1e381c6b61863e9d02c60735cc361b7b9526e727b56b2b05394aaf4fe2fa1442942eededae79d87e9f7664df8beddc871ceb91e7f35dcf0d7d8e8ae4a114706d5a73a79f8d67da370566b2903c536fb0ae1aaf0c3d4ae472401abb7d314af7bc4b0cfa10a2812350aeb71e3366f8df18394192d40ed6ab4000d6f2ce15203a003e865ae18d5dca707d0debf6a3f6b2d3cc30f026c6b03ea5f027a5a30d0324e072aeb105c73e08ba0650d7c03b953252ba7c27bb097f7d60438f803db72d829ce7b65b700727341787bef3b0800d1f089011082878b3b7493d7c1f9037a28c01e70edfdbf498ae5e9343e0a35b2f7de724b996492297a07b0079007b7dbbcd38abb6ce2a506eb9fe411093a581d42582161b5a194c9c03bdbd717225df247b2ead7982facf6939df867020951f9235d52d6acfab5da5a4f1bea93480dd63f7d52d660fd6d258f78b048527674da4edb277fecfc6f0c2cb7be573f6c6d9f94f14dfd9e26c3ca0fa5ecd6a73fb2566b99fecc1bfee557ed48b21cef06fbe0892c9490814486900830d07715ac3f75ff1dec8ea4f885ff777baa1d20dedad3f4b2a9003fe7d315c71ae812ddc7ed4278ad4e7fe5318ffc8ed6552a6be9577faf416fea369de3f67a61165ffad50050c03007b786e96040d132069631827680e9b225061629d912a4458962d18416a0190ca95077c0acf65d6da2c8533f9ff5142e8626b5af89e4d753f08dbf0cecb2e7514a5b7ab77ef3ac2d639da141def9893cf3f359ecd103efd4cfc5e01b174284cfa6cfa44b5b7225f7e24b0e66c22692f9c33b75c63bf13d0b9f3ed513711fda586b512a9f3f43589f4d24bdd420cc5b3998957b69d0bf57aed4a0fb4cb2d4e0bed0c6270f0cfacfea377ff8c69f4792192dc94af22456fb424ed290ea8fd710bc3ff2c79ffd6772f54118db3fd3d2a0cfa9adba5a6bad957e3e6bd0bfa76b74b0a1cf7cd62eef1c22f799bb7b521ddaa28b5f8006e30361e61300f9122fb147231196e3327313308fd954348a128b6c7777d74a780a51ecf64c7f0a977927c78d401fe016ba433891c191d28df7d9b048415ddcf85996929c48d8595c458848570ce2a5f61214c433a0f845a44af585dd0490c7202983827e7870e510ec427d6c20d4279796be8d3066fd312848d2a4b934c5d012edd0c84c90eecacb5f48c3eda7210649170a15bf88447db108091098fb0dc522be898f652908cc52e77416524a391489aabc1b7148bafa0331b6d00b7e00f14dfc0763ebe52953285d14ea33b2815e6d705b86c43b5db04be6e3d464beeafc158980c437b1bbf8420913a1bfdcd868dcd865dc089485dfb0611715b5518c60524baccb535490e4c61bc6a55be4ddb04578a73f3e06d8d555644b377eb161cb6e7cc9ff51d68207b7bf96f1cd920d1b08f5b1bba03e1c1c1b9b9a2ff2a7bd4e5fcb24ab0d1bf68e21a22473f6c4d10d1b8bd294147020728cf547173be5f2941478b9de4840535810bbf17663f1c276fd6c58daddd3e4c31ec4344089a258d439fc0d24a391f338934f775a2eaf64ae9b82f087938fa460e3f26ade683200bf7fdc410dc6066a302a61c4538896dc78c306329910c0dfdf9f031a8c6f9aa185befd41fcf66d17f826bebb472694a613487cca0f141e675434505433ccb276719216bf393c650727b1bddc5e923096bd6a00099a082ad23933a04d2be99cfaa4a8812ed8c9a2791bb04413bcd3dfcc0ffa35375dbe659295420aec4cbf097766c8e9514b845ea78f79c434408923329c1b16c87ad64932a4b8a4734cb8718a0e586ec846ac1e49aac773ce3927f3f4ef912bffea673b08c3f2a78c2cff8e99e52f4704b63da6014a20f1f1c94461f9439c5bfbf351a39f38c92f7eb51f094907a9c5a0ec1fc9fa912ec924b2fa6b8d3f3fb71db69245921591225244aad261b72b6c072b8b3c34487b22f8269445b7a99095db4f83224f4da244f04ee5c237df57dcb02ba24231c9e2a230ab28ec6860c6cfc00b59b7c6edce74c5ed9a14793838b80717dee1c280e141860d3930b79f8b4957d76aad4af5df4acdc56ebf3c013bc139fefd5205ecea8a248b49e4a94ab1476fa1924cfabb8885593156e11e319671635774db4a1a3b6056be229554584661b0bf2b922e698595228f2c9a6d71db0b99cca22ac925bee9a74950261f159245f3432ac4b24ff4956ab556a5fa07c1b0956070c3e8050557168ffa7502327dd1714d0d1444d818eff4a53e3384fef69bb69a19a259c98a7c8ae106fb9bf9c154aa985140d5e873cf2f6e53f7f70a06f9cd04e90f86392fc054aa50924657ae98ca0b62b75732b0d18c02bca74f3f1bb8ba9a5100d59ebad0bdf6cd0cd1b6d7e8e702c73dfd66ea67a43ef5be1e922c2e96ae5e5bbd387ed515bfb4170962c4e23752fc8e7551cf1c8eaebfebfcc38e16e649b202f14dfd40156ae3f610b73f6a4a92d5a75b93c47a927469495a12df546d49fbc23c1c1a71c529bdc12e4e0d66f5b75a238c0002083333396ec8859ad20f1e63d8988c23ea15826ebf06d2a46a8978e7749bb3ddcfedaf1f97e43f58ffb16175e2f68733c6255525e9aa56d8d5c964bc53857986d8c5115527b6c8ec0cbcb85d6463b73fa2dbb06ebed8d48207d970c66e7b2dab2cf2c8af63b18716bc13bf8601dff437086b10dd06399974b515ccea8f52addcee64b7bb2d0998ab8ef14dbfafba0aeed1cf638b951f6a489e348371b06d265dad1608fe871c8c8355bacde636bbfdf347b29ac90d55d7868ca421ddfe2e21b0aee4491fff84306ce849f632150fd4e0b6d591ae0abb1dabb23abfb05a1b3fd9edfaf54cb21a0c1b7ad2ed564abafdf283309e9035a26304d889d3edeeee2ee587737ead06a3fcbf42a48b032d90ace45085062708a34305521041c5921ea800e21261c3eed28577fac6efe9be9921de09f547668674a623aff8a8551771b121c7b846616d6a74b0612bb459cd74b73af2ea5a6948f7de67c434c4fbd367e4f4de7730d45d3aa795da75b95c2e4b0db2095a6c6841538d0a6c175c38b9f31fe907198801764e0455e12566bd5400e4572b8325b6d0e2190d2ed600a203961b42f55c8756b861ea48a9660b25b7bf5554f01577042b63f411ecf6d115b73fea40b192c4ed965590ca282ae367753be6f716665ae0db5fc832e250a5282929a988471659968d8d2aa7216455c064523861c5e880090b2294951fbc2844a718105d11135394147880cb22e62de1c386c54ff753af48e2a21cf1a3256d519200417d624054b3682388e903858996c51610b8cf1540348ba30f489f2748330b2b3ed03e45489e05143f449f2c96248b6b164900f96031932cae1d3889b2f484bb61090a254b4d684e96823ab86c144607293a2b1d50b5d82eaa236bf484a686fad0525d378b93f228c342bb5868567c23a3a3232c585e68d70bcd8a8f836363e379a9140d8a53881f96709915fffa17ce70e5a75d89b22a724861438fae200470f97d9cc086aea259e1f2e7c8c23b333fe28d7ce383672786875a93c2e55741884d8773fd84c0459773f97998f05030556b55aa7f106ce9e05cfe1f810debe984cbafc20fca047e9711312d253674991e97ff8f6c587390f0a4832b36f4d44d110f2e6ce87703fe12a0e0803f754507fc519bd7e5eda647b55378e446d693e10128b443850e11629014fe0da8b0343c2e3f8f1300a0e603102293bbc68eafe804247e75f95d29b0615dbd6cc71adf0e594d096ce820d8948ae66b3eb8fc3c4f0070795c7e1f2fb0a18730b3b4c48655041d46bf830d1df440a6021b56966af6847fc84f8c9a1569685229cfeb46d819c386d56603259e2e6e78cc48e051d46387096ce8377e0fa00436f41206b0c504d4093e927054ff20d86ae90c00054f470f286c0e4d151bba8b93b5603a3a77a543bfac78bbd8e6ee20b2a1f3783e64d050c1ab2d250f2856f0aa74b14abe046f4d1036ac37aea0820f9e9d14745c3928e09c00c2b712c076e517dad02dc29254c4a9261f9f3e9fd971620f109439def3b7bace6b75771d90d8830b6b2e78bbe7af958633f9d46dd559295736b147fc4ef3bcce99b21d6c58af4193cfe4366ee336fadb17ce1ff335f9d37f7e354c02ec0813268c573ed2c5ae055d19b7432501dd1afac789b9dc0ec559faf203ba4ebafc808aa533c43058aebbfbb89d4f39a5a4384e2975774f793fb9353789b6942f34283b562157b5aa54ddcd7ee517ce70fb8b31eab8268cb1a54faad58deb64b68d487555daaa7e1c2f5d5c3d3e849ad5afc2a9a1a81b854478a2ab7f55a3b427169b3944a8fc82ca87c5b9359d0a043bd3d5c81ef1b3c04f85e8742d0a4d219e452121132a855b022b0a45de180685f9ef0b097df4ebf45a6b8e5a63074ad07022e1f2e7ee2f594168a021dcf8d130d3354cefb0bbab64f18c6f974d431c061b1261b0d77c8f7990f892865e1a6a9852fe58afde37628cd1a93625fddc9d793ae2c41e2ca5045f4a29a1d8f89a4e2bf471b92390d8a37930018a6d9e8e36b147943cc855f857bafb6429a534b9d17535cc8ebb5797d549e92e5d47de30a16970bb5eaf76e7ed47492836fe4c90286f7f10bff28647aebcd2b225d52ad745198ae338a79db681a10b5bdd6a913b9fddc8a45e8d67fa97315da53e3dd3a62dd1f529d7fdedaeb6ddba7541a6a9721eb7d1a854d5522a437d6a1bd72d617de827f353eb47ae7ee55c039706991cfbb47d5c59a0a91e2e6db8328894c9e1b14bd9c33748accc99b05eed22c774697a02e8b6f65dcb9654ab5c67f24ef3511ed38ae3eeb5c8d598ddf3d9d574a67fee412091473eabb6168e8e8f1e165aa09c44fe725cb7551a954a43ed8059972e148d4de491f2d28a5a9d56427a24ab04323bd8e8ad2683dbf63e2383db6ba6207ebbedfd0b35a099824c8e7de2ea0a4883bd62a1c14ed92bb6877b5f3a7d748e77325e8e1c261ffa26edeb718f74c54203e959010ceb551f9d432f7fe7a726aaab6ccb4e59414765669231394518151a5c1e8772e7a422c41418a8ec8a6f586363c4458a0f574a8972e514218c94b4ec94f97c6f731648aa671fb4aa16121dfb7c36116005c37ca74dbf19207ce9b7c097f617cebf40bc3ddd1f37d8ad3f4dde025fd37b1d9f3efcfebb556f5bf17dded99ebec4d274258f9a55adf04dfd10041e59857bd4e7ef28655da641b7aed8453b56ba464308cdae685b568092c2bce556fac5ad748bdb84a912aa2b6c0bb846614f40d245bf82748719b63e2dea9c2b98876fa558d4da5f68ad34f9cca7da67a4497d838a21991a33d84bfbea02bab0fc1ac14a1b600cc1602f7ee120c3847935e9df3caf7e34f93c89af0d563343a811148a78d18f256b6612dd4a9fcec80f27933b878c441ed828020a356a18555e4db83ff2ea17bf98af30428b11bc8c6ca08bf26a82fa0d502cb05713ee438b4211af507559a973ac97ce8991b2339ab8f5a912467010329a742b1d9295c8c66eb5c2a1f4e25639835ba519b7fecc8f94995c32fde17e6884b0393e94b16af9156764e80fef80b73e4dc23bf3ebd3279d13f3f569ac03ec9a48925583b864dcfa215d224493689174b534d8ad74e956aa742b9d51242abb4f896e8df14dfd89245db38a29236342b97522c97c09e817fda69064ad4ed77fb0e144f21c6c38856ead3f857827defa130976b59855bf5626ec13b7b2e0d69e2bac0492ac5a7fe687ba03664d377c17b4a74092559f4d0aa04f7f3c894c763b926c475387d48480d3872ef3bcb385b199a185fa414e9fff0e2e36bed79731f0c67c354983f6f39f5517524af981ce03348e74ad2bfde5af645575773ceae9e9e99ce8e25a3ad55a958a5bbdd0ac466286a4b260d8f81a5dc2043088c4623322b3d90ce62d9790d3b5f6afb4654b9937bd347d27b3ea62d6daee6d0157501f738a399dbe47da95af422f2563f27ead76edfa55c0267e206a8a7f48a3b2f1cf6b3a27856a4aa5eb3a9e7576b27b96afc3bf9ac458832e5980b2b9a8ef52f11110bfae8b5efd233e32dfc5fe2357ca5ec5e4b039b655d8b36bbf477a3fbc477d71fe696553610c36b7fb2a6073b9f931d6ad916c5af5dbe686436e7f15b0b9f183a17efd5058d890461583cdad0d469acf6b3a67daa65e68a0040d26684091f221d3a50930b2986a39affab36a0b1916d7e975c19f88e71fba2765f4c00c27eeb551c73591b9ebee6ee69e3bf56b8df541abe2648c2a53f7d16000ed5968b07ebc950411dc7c61432b13860d63485dfacdf8f305d2609cf1f7eb5f0f0b24c41ef4b62dc68318f357888cdf0384675a11662c51411497a598d184ede0744619513029e374540650921b2188258da1e4471cb3a429412dc080925ef0c34f521340fc0853748615e1b2d11b56783f6f98e08d378030617923071514e05b2965abacb79e7ebfe867c486d7fc66bec4af778e7cee8f20d86af58dd73bb618224061e3f3d3a9cd3aa7a53a1dadeaab6429979819d2affe7ef567c486d70662d330624bcf05950ca9566b55aa7f5e2a225929b08d14978a2c2d2df1cfd7eb7bbe78687a116e2dbfe5c79225df243baaa0e3f1604bd55cfc4b1e6c7c2965757797746ab3ce095aaaea8e2a7667fab12a3a7bf58167fc5e56adaeac56eb8a41e7d10039e79c105835a573ceb9f2b9a58bf2ff06eb3e9932bf8ac107b96567adaf520579da31979fc857a756929628395162c233615772fff08e8f2b9db8f285b45a20f82fa59452461985e43793807eb1f41f6cd83f9109131e2536be1c927f4218dbb2d6f8fd4cd85052122525180852c848e20c2d6714c5608a4bca184ece5052839900b6106dd1e2b2942d45392ea7438bac06301a0859293348eaa2c40c558b01a6bbbba3e3cc208994527e94ddb1e52b5125044b97abe8e0e47670b98a0e24b86962fb7f34b12c250b1327a48780c5f6ff30819234223aea4e860a5bb905441f7c615b46a25a7313c5c66729599870395060594a962459926c35042f9494349a838ca3a3e96358ed59ca8c48f68a724fb767cad595576911fac9608448ec65fae717f8decaf4d1c4801db197e9ff7e33f4e3cbfb8cc497f7deca0ee19bb90309beb58606271fdd39a473b69f5f57321469703e4e143b539f5fde87dcc269d96074e568e8862c5dd2982fc3fc22f3ebca5bdd18e9cc97a10812d6010dce8fd785068734389f8425f6071396a5cc965cfaac74672b044dba0021b4c31470bce6111750390119606480431a485ef36528f25a8d2166a1cf40272d3aae095946537d748e9b20082437dcf82c3f7584175f668b0debad35729fee8f0d7ddc9806942437dc18e5ca2ff41b02cc86b509bfc7fe9925e1b2c425e98a3092e042c4e587830eb4e0862d4a026b9ba07cb0a7cb52c038a26a0103488d2fc268707ca1f445921148324b7e505d10c5d49615a024a76aab67ad951c7c3081c104555b6078f0aaad9e2d3ad5a0c392649a810f5c1844de151e362c439d16b21e2a18491c0c34d8565b5a0c8180565b3debd305901623f080174b5a0cc1c395580f7236ab84016a9f2f9878ab5649a303b1a5d3c2d10923a94a520f3e57603a94d0a8b841c484c30d1f9480a303677cf1250b85e28bac872f55783b58d365a32f50988ab0de65a32f4c8cf8e99877a6cb8e2ce6b9859c326e33b6a6b5a431b57dc66c76d3316b3e4ea6f3397cade5532ec6f9dcdf1d799ae328a5f2b79f5fe55e7627f9b54aee2bc7750b6784cbf2ac6aee6cafc3f2b1adfcca11e66fabbe3a4c3e717a334e9c6ab3ade28d3675be0eebc60747003d9b524d95ecab63a23c2be98a1b748d53aa79e3d76820ff0e36ac3768f2d1982b3d9928572d7e54b299d27531c6d81f5d767bb7b79c73b6a6fd0e9eb335aab59452aedc5d4a29fb677ff789f9664341175b7ad2dda79c94f66f31ff3d1e54962d61d5f3ffb19e582c46ef16f32e7e4d47eae158cf29055db4d5db5677cf3273f5e9c5150ddcad61ae706c6c75cd1b8ca9eef66ad5ea1119b72d556b3add25f539e77c8f3d289d734e977d8384f52879b841a272c5a19b9aec5a3d6e1c7ceeeed6ddebd712c5b6a2382ab95bfe06b7573836a895c7c1e7ee6eddbd7e1eafdf0edd3d15dd3dfceefcb6d8831ff5456c9f54ca23a856b5bad1d4b66ddcac5ce7521ed1bd4ba733cad7fa8506fd23e2d5ea799ea98f90479852b313ca33f9d04711f1f8e688d3b6810762f3d4b6d4a66d1c4d711cd7cd4d761cc7ab7410891288aeedb72fd5acc881ed431ddc8732d1d5f1acab95b3f6fb54caf366703ecdc0a51f2f7f471e4d7a8ff93ceba5df0b0d12e14c2653e4893cbd237d6ab5152b721169a73a139829793a997ce89f4c2d441eaed191ace620157bb49c1189a153912702dc63027cd3cf11d9a41c4a4dd16939f87126832a3111869423072d7ee0be88014a298c484b9b946dabb99bcddd70ae5871372ceeb679d1c3ddbce0e26e5890b81b1633eef6ad2fa8d0b10206575881d4e56aafeac289abfd7781c6d51ebc22c5d59e9198686d280e69eeac4dee7cab0afd9d4eab7ed37d4e37e25cc78e69532491c30d28206ccce52948949ca03f28012205e806243e18cd924c8179016214932cae35aa7a13f2d2c31a376cd51c7a48aab92c0548a684d21618a7cb49f3313539c01c746a74524a3353a909e6b091fbf82d30c7a7543473fb989a9a03cc4135934fa594564aa3a56a4a559f26a6a5026d8e0f265702e7f824492bb91d1be8f637926ed852d472fbe3ecc37844149934711b056bdc7e57f551f534e2b8a7cb3d49717c5142850a07da7889c00723b86082890c865e212f096539020b25652059c18be872d7049f4df54892dcaf58aea63dadaa19336c98ba38087155b8b5062bb882821814918396315eb37671fd2b18d73990c3951d745b9c165d835cd379cff4fd3a6159022900ad016d3a0788912643b8f7bccf4893b073cf033223847b057000c61338248509f3ea9e4d423cd05b01912cfadd4a8864d1e7564836350dca0f6b9c881c928875f50d52fa4e7da460c39a4bb948880b9d13a62e7d3ae50626973e5880cea9522e9535971a71d1a5461788f53b3ff4716911396889c14d710df5a620d0e286901b402dd9ecf1c69e1ad8d07dbe569b230dfe3f64c6ee9abe01c3474b48a004174b3088428d2522800349113994800b281de88210def1e0c61fd23d62d8fef8c3aeddda77ce91061f22c3e2499e91fb244488fcd76930ce06636bdb0fed690ce07539ebed1518a3eb3418715ebafc4a27810cfb3724129f02f185b820334999023b5a9aa150d986997d19fa023b414a1c4a4b4eda58ca1107ac8da33686627000b5016363078c50d4a8f4b986ec7a91ddf8cda081b91fbf500357e39bd6ea0adc16e36fab1a5f8b9aa6691fb518b5c8a30d2fc11b436a785123a88a296ec4d2f0928609f52493f2250a2828987d59c21bc2cecb52be8cc00921296a9d6b8ca1448aa435a40cd14214b335888268418a208d4bad6204d10d3e986056e6b214d89737ca7802f3e20698110d604e007059cacf08c6e874745aadfe5663462da22275a945aac91ba94569d4e413b54823952e439b8b9239adf8f44ad407557b29e79453a55969b554a531ddf8281a7dc6a8624fa86359b5f959b7282b59dceeeeee5d5df226822eb6f44935e915e4d6b3af687f9c2e9d4eae1bc7ccecfcd38cd8cc2ca594cc3c254b96acd38a2a29a58d74fa63604a19e52764fae6a5e39a6766a63fdd5d08f77c8734ecd5bdad3ff5c5fdb642a283ce8bfbeaffd457f769db73ab1f9dd7f6dd0a890ef5b5fd8fce8bfb6e7aef777ea779cccc751bb0eae4b9f53a87993b8799399ecf93ab698635d30c7f422a77bcc1f5ef6238553ee7b41d75975f5864fbaac9d50c284fae505e342140bb1640cda05df9c1403feba619d79e9a66fc5592d5d7b6ac0f2133334b8fd3dddda794b24d20a37583848d33ca5558dddd9d55df69a75093e2ca952b57fc08bf72e5ca952b577c7a187ec4bc72c58830ae685e624b9f54ab9ba604086849500cdab8287f3a67caf9c4e8088b93e8a40619948c1469b07fa9f3fc0522b3182860f286089139c0052493a985be53828fbafcaab62913f344a2d8a37f3ebfd79930e356f14983b1581489224f6c01f7e8af4c6ebf809b5f74c24201809c3ac7fbbf4f9c3801c2499dd53c4adbce88959564377efce2430737f4a1a52e957127164b3c5c59e77556bab28b1ac718a621da8032755cd0060942b8fe4eb3448c83c7ad4f6c4aa5c3445c9beb52d888c1b54cd8586df56c8eff1a6e543b59b006933488d27892e31ed3d4b8aa8d4ac60fece2b0114b83fdf18b474a1ccd4e107fe24f048a4a62109df9c246a0f8f3383bd8f9331cb061bdfff3854857ff52d285998186521a4ad050b2628a92111a4868c460e036004d4f87d70f437ffd208c8d5e0cade4575aebd56b2529a4a4ddde1605b69c9f6d50a6fa6377cb084a5b9e45c95a552a5abf185a373ed3185afe02efe83528a57b4e844af776c597f6b9eb6cf531b0513a37b07e2f59d191a01bfdbc383fd255eadb9f76b72ad539dbb66ddc17d6af5d3f8dfb3602a02e7d6dc5dd946d2a9c9f8a1a592fe5a5ac974a799ef5525eca6547a193dd79fbd6141bfa95d2e4bd7fe1f4f9ded4e6b7ad425e5a795e397643bf1cbb3310b9f463b1fb156c8197dfbd56aee991eb5f18af7f335ce5f216fdad723af99fa6c1204bd69b73cee9abbf4b68642d66b9fc520da74fa96bab70bafbfc62885992dafb0536ac5fb5357ed673b7b536f5e9ed5222d15c2607ebd1f37468ab147dff3cac9b6b6fa5e68a2fe7ded2d59fc2f277dd92dd237f514a39b5e8f5e94a01020813264c9857653056279d82ba1b6143ffd9b1da6aab9455def99e7cdbd57e3e85c6eff1f3f8dae73598f2d4aa8649e3eeee85ccf5d82da1245a2fe5d9cee170031caccc0dbdcbae1682c1602078c92266318f018664dc83af018662cce2cb2c1327a36143ef77fcf4e932966e456b8a4bad32333fb3d7402f3f73cfb8c0c6d7bea7dd5d05276cfcda20bba459dedb5b717d296c3ff777018e78385385d42fe1467777ef58ce6dab5cd35a84fc92a3ad3dfc30c8d0baa190185a579a707de4f32a2ce132ce4521b2873a3550938ffcd85fce08d1de84db5736a77075723c14aeaf42f9ee52075b1b64e91d6bfd8c6ce0a57dce92b905d2aab90ca0cca844ad5835b974884600000093150000200c0c87844281401228baa6b80714000f738e40725e3618c9b22c465114638c3180104280010000038010111179f032272ad7d30dc4a85d28d82d75835d2672700dc863e4e5045ed2acfc291e60828033a66085312e87818d658456579b419159ebddb5f8d3f52029b4d1d9e302ecd475df130615d8d35de77c0d1afe01cd03db353abed7473a75833734be5ebfc233701b075b453a2f56c3f89fb722a17b31027bba99b61887b457f2fea995d66b897d4efe5de5ae7ee10da8d5e936da254add019a468042c8342846f51cb6c037598735c83f7720e84bf5112fdc832d537a671b20d868c0ba59906e1b8d3eafe84bc35ed968dee7fdb83002b81aac6f82355c634951152a08d1ae648fb63cc873fbfbaf66a0050a3ff6fcee639129fba0763008fe2be7b7f2e5ebc55982324120b9a4170832173f7663c923850e1b35c16c9dff452bc9a29c9818b8bb542b80b4dd1df7448c8beece0ba7221a28d756e8f41f202ea88fd741315e00c9315a47a58aa6772ae6e0ce031bd56f47019c846fe80bb026f1076eb6a34de36095e1571d0f5787d3c5f1f3ec3e01ccc0df5baf736d57cb10911a9436263122fa727c238e78461cd4fc488d8da800d1e976952dad24aeeaf052a4dbd2500342b8c1ca46cba3846b51eece9186eb3e92d7989d7ef23159a939d5faa8b9bd23b3946272f21512c32f1c087c31ce2037a2dcfbbb6bfc1ab0655e39717e5e4a8f21df092f87cb31e56dad65d4e7414d8d0967c0505ea71d281c00edfaafcda419a5faa6ed771b59076519820aa1dde1870f56083632c8e9dfe45352208c1f44ac6cd50aba9dd97ae974aea05d4a7dd74b27f29f8464d4cfb133387c8162c25c6c5f83379b95c2151d8d3d9d765b745bac732c0653579ef8fd8b9a0249a48719aac05d078da10b666977509749abe116bf803c94bd42027986a365d12b504c8402ec5d83e65075fa56ae6ba864e8504ad211a853d9c2223b279e076f43d0dbbe659b5bb51b0ea1418a3da6bee51082636a4559cabf344671089542286bb4461cb3a14a242be095b671ee2d98e1196a78688892f8dc4feae133d6cf674e579e50e75ccda623c8c1ed9167a24b7c61ab2f23a78d3ed7568c7ed4ee7caecd09917577022aa247bb52446effd8a1bf6f28834c8f38d61fbde047c24285e69586f1f1c1393d55c2342088639f2ca801caf1493bf4a9afba689e173005f41b81cd169cb6134380737cb283fa4decc733d95848762cbbf3eadd449df4d474eb60a332bed263757b3eea90e6a48326e5450fd0fe2c70a030f69160ee25699d1186579eaf9d53749caf5f13a0e5f0f22854bbd7027e7fa03bdb2888270a9a0a877ea0c3fdbf4f4f2db69f5834297abe556112d7b54018dca65a3a424738a41e8cf76bdda15a07a70359c5f5fa97d5a22aba1e5cd34ca57c9d9a3cabb2186f79cc0ba180bd0a4eb9ca7defa986bf496ed12c43be6652e219518e5a90d8ff2f7ca12d142e1d8aa4f0c5225ae1b6810d234b249ebafe41cd97dda15e3da12c34b4b0eac886203d64bc5cd50864ae05842eb1dac13124976af5596967c6d9758ede4a1699dabfd43bdc879f1e06b98c3139875563a3b8ce7ae68b5e4ed17e95436befdbd1098384469beab6058cd480cba1a14a97d6854d4ec33df31ef4cf40371edae5b9570884b8222c3af30c04cdc26eb65dc1494aba425ba3d7c4dd049af2d830903b854d01d704773385e35a28bafb0c3f32d413d0b2d6bbeab5c949ac55449ff19b2ac32ee171497c5599b7e38de96688f777bb20f24738e58878e3f579a3efd560f446bf9ef1d9e5a12177a0248a76a23cf42acf515b84951f3a049740a95075bd6ab56b6a3444478759a25f9b5ecdee550162b16250f0de61eb27c79f999b7885d24c3290b4016dc768c78e0b6b0f38b495972778c3204a2553c6d92df70d9b2154011c42193744f8a79c050faef362929afecd58e85e7c758fa617e3a3d4be997bb7756ca9984bbe3d2bc46623316bc5e23993e9da5adfd1ed77c7cdf7611e3d06156dd2dc09f6d85b3ed02e1caefb7c44561ffd7e80cef8668c2b94dc79d0395057737fd49142e36bb17f68e838323db67f21baaeebe6445444b86ae22d1dd729edde0be5aaa51cc02a1d0d476c5acd3a66d9e3f59e47b6ab96d1a88757a9745a736f8bbca8939b30c79e2ffc0ca1d3b59edf24fff430d627f56651ce8b396940dc98dc046fcab92411d0dcc77ac4f9be4f8b3da19de3304ddebb408497de0e784ad20d19c44c657ce904d9d376237ca0dff81b051be51a4fb8b3d7c204ddcf91889cc9a9d801396153795511d85f5a9be6015c140bdfd2a939abe0518ad0a3177637b26e1e4ec7741d4b7d2ecb2261a86d181e92c1847a43826d04d0f1cf2d670dcde87368e5507e03ce8ccdfeac95dd8d677403545666b510c2940ce0234f2d0626acec3130395f428983fa4b7a1be401aa608169759fa00dc8219637374a0d28466c7bd48a1422ed6351a8727aab4722d388b2243224e991c5421598328cca283cb86585e6e40dedfed6f975332e53c734c197b7726c0a47b572d59c6f7e158cda95d9bd4642ecba945f9b9a59ad0d0a49c3cf3f8ee22edb08a2823bdfc68ef26860f550703d7b38f035baea020b60f9c8651cd6cf8cd8697b91e5f0a501f77ce474df30581efaf270c37280d02d71e5ceeb209c4344301eb2eedd21aaff6774349f045395c6fce8a6dfab18800e943c4374a082e741b99bb3e731b5bef0e524b0e01430837449e05f4d7a5943719ba3a7676894513ed80267df9094bc29f82308bde8b821e6c8aa70020b569878cbec93f0d0e570e1a0d25c7291a2549b71ab6ca5305e5ac3c364a95afcc68515d3e91297b827c0d0d89255780c2611f9ed46a08e1b4b7638f716cdea3653988655d6a05e8640680d830c66f3606a497526c930621534847a43fe7fb716a68f07bbef372eb3581490fb309ca65275233201fb70449f03f571076bd9b5224c21150c608607b82b59a02bb590b54c4d8154b09338019c0a81720cfc58d3005d8ea9b893f777bd92177710f0f2e9cf21a00ec91a81589d2a1d6bbb0a2f120823f2a924517dc13aa9b0d3165890fa6af66f5d6abb5b24bf5e6458ef8d01ef09577536c0962560df46123b958f40d3ea1f5d68d7a02866aeeb279dfe203e47e4da4213c459ca7347db57c94be4f005a6e8dd64b3b66d0d10796924a4c2102ed4dc7e42ea76cd33a2f79380aaa1247877c92e1aceddcbb63b3e9d4757975ab762578af15ee68d806b0c6d64c3b60725aac531b1f84b50bcab73886b1cece7181d346ef000ce460b570c6c9e6a961d2508a2a117c75bb99eb1f70c3091717a300bbba29477e85d16c663800e73f4bbaf52b463260837362999545c5cead13fd1403ac6b3400f89aac457b454f0a49d68fa8f14585ba537fb8dec0c96e9898f6e0ce6333f4db19c9a023d9fe3f3e293804f4e72c930264482431bc57c572e331fc5342d408d6037fb4090864bd1506f5380d2010db4757e11e976cb7719f35fbd67b8698778636fd1890b7615ca4350d5f7b01d0e3070401ae24ad344b2de1a22f28ba0ec2f33358aded15c520a1f96b72c3584a30c314349f7428c75212518c4cba38d84d3b647dcf7e2d8ff5f36fe7379acb82cdef90c4e5b721bbb05e68b38889373f3f0bc1364607a3499ec2ad598fae506d55486281113dc41c02454d4e104a05200629090c7861b1a5ab84c20aec7161b6279a211ea8922913c586fb57793938bdce50d19627caf3548d3b692c3449961c1fb6ecac37582b2409e2093217d87f2d090263cd07eb3fa71262b1f4281fd50c692a90ba7fa5d222437436f40a38e35cd42e299235c2f74496aae8875169f8845fe5db02657b897209a06d4feb63a441f75e436781236c375b51addbb351f92424cb881b24712353a389f03dde13a285bae7794a4cdf518a258d86356c6ec8fabc16888e49efacf732af7c9f42e8d3d34cfc5cfef452f8d2691f536808e271613b3a46dd994fbda396541064c5607aafcfa7bbfbfb0f60518e425d9a9d43e59e5ddd859b92f7af5be14dae11b37be72c74a47da6864d01bf695dc90756bcaa22dfa552fb38f5b061152079a171ca73222381cbb68dc25d84f1f4922ce9255e07b2782289441e4d438e942c5ade5cbec105b2ec81d0629ea0c39e62f6bfce92e551ec4ceae54fa5d98af7fd74f9df207fefa7fe0ebdfefee9fdbf7c72bb8fde851eb0facff5af98cb9cb3a566bdfef5c253a3c7a00993567adcf97fabaeb63e98b3401e1c998ea5abd9218e6a6a8b5de3e820ce518a6a2a975b37e055b6676d48e5013a068a895c259e5db44c9ef6d0bc563113ee9598cc6978cdd9340ea65b3532acd080bd41baa054a58fa90aee237d87dd16c9a1a2a2ef5ec56c7774d0e60608a7d3db9f20e643563ef54bcbc69cd33e9b5be16cf77d57cd452ad911ae267f4ac495cced7a683e84bcf20db60a3a99d8181c101ba57f0f847894e947efa39e91ca726ea8f1c2c1708d906bc4970a0e54d2a082aa3056216d4db98c790c14066643dfb4dcfc3d45e8f364120a94052f393b71e58753e452941f4eea6cedcea987921c5dab15ef15e3091d34d862153c8940acc047de4a48ef44b1a13524cc540f2e269e2a942e805440909c0a86b25946d37545f30a666f81ea6c9844c3ec1af5fde1bb9fc4a567a46dcc181e68a5fd7a5dc3944f82268a234b4a684826765c9cdeda65b1cf244f159d7c572de06e3588448c924a419521e0594deccf038310755ccb44a141fcb817d98810fbd8b48a04d7518d558cd2cbb5fb0f9ff6e3846592aa6fe5e1fd86f7727d96890bca35c7c7b4d35ea34a2e0cff3879f16939fc98147690c13a9521473b1c56b048bd5e25f46cb4c06f491c9ae0dfcefc6728a8b025057422d99c81fca20b2222556eef8dfe822fe5cc78f31aea6480e2f6c3121344227ebf4abe45b1a7509a5f0a3a0339e69db2eb5eb4a068b7a26f7540cd8d3cb9a3730956bbabf8e6cbe1ad55954bb73668876819f0d2806d6bd96384dbf9181c2933bf7cebd357846cecd38c2e3d03fe4d25f44167b9d475f7dad4de280a8f6c60cccbd4ff2d3b1c4f4897eb259313f768b33e12af5f2c6a8fa4ccdeb1f84667395fa6ecaf416bfe7044fe2d932f0d9c4c6087725007291ec0b267f9a4b85069501430af0a8ff50d82ee10c3c7fc3c2d7adaefeef7e9c3b43dfc071eff1728883f98b6d4ab75804b8417a703ec88e3dc56ce70a4a3a353d6fdb8560dca2a292f16f023e69f538b029ab49fb2dd68f0e9d28895ab82e0ac6273f31e819153fe000b30a7efb8173bd73ee0e5baedf7687c9f2620c8b8b1490d724ebced8f685caba49b5a34dd2707f4c225ec2af08bc1b3399db88a9cb7cea04568f4b053aee91274ab3094833b8a1d2cc65653878c3d761c19e18528e3b4f3d2c8c01444d46ef2cdb138220b14433017648db49be4c2f1ec6b98238d2f18c2f9397178952a66f5c05a8263113a17a685576158615945b17f5bf54e80912a7a5ec5777764e4326e43b1123dab5b8dd6c4309e7725461b326a8459870f06cdf0bbf3bea237702c9c53fbc8eae0fd96cb8eba4845d13a85b73340f7c815c94511cd69c872ac48860dfd93d996be66a6b0df14ad8cc17c6011aa0880275f70acc3e0ed12d0d2abefe0a171bad3a33180a3a5585686fa7dd7ce8db7cce8a8b2e3065b1094cb6892302a54e59e5270dae48419e3962a34290f6b8924e80a41c12dd3d8e249b25bfb74697103e41bba374974a96165a6f6c18441acee4fe56bb22e6c603736b0fab4788c644dbe6b127c74ee50fbd09bc344f81f6551a7b15e08e0220c9f61303e9520ded87cbd4cb0c6e1b2097cade96d8d8ab20eea93728b004f3944f58ee4260164a707db9da1386db4579bb22291a5c53910efd1ec930c528702308e9e262c2c0c42eb4664aa80f99ef100163bd0e908f6a1710a2061a077b258f2922c1d6678ae302bf37c315ac407650332d1fd63d4463986cc784244db6807bffc6f0d5eccc294b92cde15a75831415c4892273235b19b4850ec07d23f62df4f2dd664fa453e58afb6ec06028f06b769494e31d9e83970e02c2f809441d1988c807c628e0df00e3d260ac36c392c176494d462a97015312caf7f78f75cf7f30971b397ba18a7fde05351c52b099b1cacc0c8161b74196799d6c05c85827fab33740807d5dcdb388f018ff6933f3ea49f9be7c02f5164ee6ec5b8e435e3a64065b84f69167d7288b89fb21dcaec36caf8eef2d56b6f6fd503368c7159705f013f6e9645686a79d21c32eeabf78e007fdc429882367a75b2a9dda14b93dbf16310dd080b69c59e638e8900f6aa2c9a36a50ca2a04e20bd2b243c9b7aa85aa2c160fa68394926ac9aaea90fd3d5a2bdad5443a910fdd229463ea1a35a2d8899a12a0462a124b49f6cfa027d174a8ca2b4a0dc8861ea3d732c9282c4765eec4337c07f5217aa907ad725826c12353e988e6224317965694e8632fc69f59d274c6d630554eb2b5d8b71b07786e06ded8e4ba2774de8bdca682ee43908d67d8920d55c7e9b8159e704161b4e203acd6ec8f4b44b7fb01504bf4a46dcfdae6e576a642682ed6e87ed23b74f3f15ec59ea4b351e2700653e3ac1fb352eb4b0309cb231d26f1a8681ea3aad6521343a63f07a3cabc92168ed379a9bbb5a225e28932cc198a5af57c8f0defe873554792da8bcfd91f38c7e7bb73330b6d624032a991bdf09b9ec58f6f33171f0b94561d598848f866eda6601dc32676dbda21dd3e43feda81a6b6c894879cdf7d82fffbb7253facc6d2ae8999619e5151490ba18d4a41143b6a0ffe666a5236f97c420d855d90515622d373b40b82ded2061ff474c8b7bed10a94597807a080cd28967e70b96987908b18fa4675c8f10ddada9e77312a5d4121e0c9405abb9a3614bfeaad78060efe239f7625107af8d76b44ab0b37aad8cdc951baa6ef74bb0c83c0db8390c9df3413928ddd3adfc82904c67ebf09349194234ac101a52b5b90f553487ca121df46b891416ac58422e74861a4c4d27c98b960b8b83e002a22cd3b3f824fad94d21acbd8798d8d37007d58496a1669c3cd5f1e7c63e07a105b0ae994be103a6039c5bd13eb19cc88424b909d487660305851ca521381c00aff82fbc01fb3fc144b4d79e345137c294ae6d4eb30cb94400320644c2ba7726ea1755802e3a2d4863088404231345c8f90f88db783a790aee6c8feb3e709546acaaed7e10c7a1070fea01f7426351cd0268a0973dde676caf5a387c9237b67f128e4562ae62557cd8570224b865ec7394960711e6c5fa7a2d77c05417f1cfc8796ecba50757d6402e8ae0b4efbacf628732e8eee4835e1d9e5a6349add57f0ff48f7232614ba90e2d048f6de5cc070ce26e9b7710be330937184febe4393946a4f8999c00e7a0c795bce05a82e6441646bd42e07befff405c638844e1040688f1460553eca3b698fcc522fb49b506e20b38a27b9d8a60d98c3af36032c599eac60d3f315c74a726ea72d0ad6df0b3a2be1237e73152f60a6acdd7040ceda50572648533229ce61afa2c0b3b7d68888574232579442aa6acdc5ab95b88f4a097a2d43dfbafe9b7dc2136e887dbdc7f241feb62c45450f258be8d20c07805964f198e01310e0b8f7e860e5cb07a51f771ce425b4311069ac24b663cb92ea24e3fa56539a747088c038a739cfff153ae5664d076b438e58c56d94e3779581a256f7f87b9c3af39dec3ed4a78edd656b53a28957b6af638de1f10e5dfec3856dae1b50666aebded13c9d5e0fc0ae6bc839db710d07e6a9de1a85b59687d1bf7dd82be2fc802c876266e6c35d72b224dcaceb2c859aded7decd36d9b189bbc710ebb1ac73a1d0eaba9057c77194dbec3cf0e6fb3e050f71d5d0145434a6d33e65a782c24125e4bc8fe5ec6f37d5868c89a75ae1aca4cd3fd475e030c4239f80743cd777f382820f2770d3c0d43bc3e933db1017c254975f48f10255a10490c3bdd9cfabdf5f145a27ffc4cb31bab0406be9a02b5af563d3fa0a1892a907f7e45466509aea0dff737188e2bd75ca2f6d92dc39b0ffb15e0589d744acd07cad051d394c413e002bd4bcd43d1912f0765a0829c06929d8463682b8c285ede5e0f6a30f754f4ee107ef54f05a630863bbb26387bf97883a03990ce4c449e7c0cde20934aabf18284ba264af1dcaa003067e0de5425dc377f513afb6e8f32c0b62af406995805cc0b0dec2eb82ec694ae97fcb7d42f6cb85458adf05672322e01fc376f25e9a1cd4498c60880ea688e7043b1f102b4884cdbf9713454523ed4e33160382f700f600f1a434a0f88672b98b31f692c34401797444b1108a616c6e0bacb596f5d9533f356d21113a71abb09017e81ee5f52b5d812149759722fee59b332b12009b19d095088c8d9c3ffc0b626ca8f75b530aa8df833c0f765193d2fd7fd652788e9d8fe48005d42a4897184ad82621ca1d7786652fe4e47230180c00931f450b2419f91489e1edf2fd8e4661ce77e3d8bc014a49a499aa03ced54788290a6fa81da751510474367efead016b7f3317013a602818ea1b412e28d9545bf50b62a72a245e72dc1c0572382ce91b05353a03eb077e222a688123561854a32a15aadc34378d9662840141e6e4dc5c1a23e08470f50ab34dcd72ea082349aaabb34882f98c318842b8fc1afa5fbd102fca246dc2130ac42c7e49b8d76c91854db60a60bc720bbbf7672d4d05f7df924193f90862014c1bd3bd2b178e65cdcbb1ea2ebd97854dc3426c3ecf7439fa6c5d8ec617a6cf83033ae5c27ea79e7a30a472590dc1ece4151176e62a08287953215818c66dd684cd765ba5f66962168d1c1c49c8bf4e7f56ee844896e41fbe96b7aab30629d9a2b61a92123ff9dc6c8db89a327562e80b8b23e25d803ffa4e6fd4167d2fae5571f2b165dd5c73d3ca19833b7a1ae13ffd274d9fc3c9a682865e60baed6a917fa7f0d32e6613b29bb053a327d7998df2023734b106b1dd025a0335f02df803a7c0023144a16fc88f8f22cbb3162cd93b11eb686d822615930ad0daaf793041ac4111e59f1693d17c17d736bd704ebf6f25794506f9b05296381673f7e34f3f652c6182f60ce56f0a7cc079a2606553308124fa79a82595db0c9fc4407b76bbc34eebabd3d69dd06b7293cdabf2840d8f3ffde1682e82e3a30384dea7a3d37759efb2d7fb42ba0b773d3f20791f17d20c3a24afdf71188fde21655c3a5fa7b5b259ecf97046e994fbeeda42cd749b3a69b08dfe3060f0438dbee75858b4ae923d9f33613bbf520ec296de2ca1489f7ce7c29ed27c7dff4b276de9bfe08621333789532abb3f4f9af0cd48cdf9aa630bc1a27484066e2a8ae65c9ad6ea914b0b495e891ca71f46cf124b3854d35d62494001e64f5501184f055c15d8abf3127bac8b50e0f65de0d24a843fd3bde29485c4f79aff150f5a5a3b607d07b0b50b44670d97d8ad83970a431059b2de0c4c934a990f4d104fa5102531841c1395840de0f7e1bcedc390b8639f03fcf0aad08cca11a151fe32674c3b77f7be7203a1ee41787bb1494436aaa594639c6bbf615c5d0775b96016478a001a43fda77a15d2de1e3c9bd83c7f498c8e4831fa515787b65957dc3a01141c6b1c809818ad434cecf4af131abed4a5f871776a88ed438919d8dc930671d86f3df2dfe25a1f079c21abf5e7672dbddfaf1c48a8718086f76a7f6a98842c67af040a246f7f6512c56e1a01bd51d5caadd57f0f64f733c067db93f9cd1fb01ca0018be8b0aa3e1e3461dcfdb6d501c884ca072ec92c4009c54a6c7bb8f5a6903b2c2c8e4c00f2b60f24936e8dfdd07a7a54e50f0213f1becbeb0213f58823478655e6c1a57e17b78a79f4235b792ca3bc71cd536e74c016daaab77824d007cd49c72c006e5c22e4c50e71212bf4d7b6697e17b910bfd07d56b303e20e3ec40da0b53edb86c320955de50ac5391c7793b427848509e1508b8fbd33ce99a7cb4e11fe8f5070d639bfe629905ab3723c4133c18c326eb1c65324b2964cacd14f4a1d84eb08ea6d656e1b193959444ffdce476a7e3a71a79c8bf2022b6b3bf002ffc27347ff88a17efd23956f4bdb838e88140ee586edabee00297262bbf911c7920dbbee54065401452f8e745d5114913bccbed581315a245fd6b5b7c66b5870e59f282e244eb24fccb86746f085eeedd99b9f5f7be24debe356861d01efaa08915c3f5f01366cb1c0c91780c205d420568f9ed8e942bc033fe700a749b19992a9b49e05b87d2e3a233e7a917c04dab80c9a9de61af5da1abff79e102006681ad84b756160e0d6ac74a8e0d6b90aaf217786e735e7c4dce489935fe52d040517693365a208d2e8597eac5d7de098f8ba2a5737b99af68de326e3294a166e036f32390c388e7c93814bd35b11b0d022a4f449a6337a43cf87e5e120799ee4c31ecd4db79d025ac1db5eaef98b7bf4a4a20a6054a7da6dae3826f3d95aba9695e6dced7324974d7430680a3b90858828f8390ba35dc7c5970795986f4384b874d2f709b64a2ae4b47c6b9877d8bb51496c6490482a047836486ebcc2665acdd8b528544c0143de820d37bce4a06297bb8aeb41e9552c8bc5a614e06b24b73001ba3d5517e7d70533bb30b65d12800c1fe47dafdfb574d401436ec526ed1852ddcb7362999bad6e9c12d977de59f3d6c8887421558fe0865bea48dd15fae0eeb8bf9465c1aecd303dd765397f24cba1a789c803a8b8fd6a9e9d77d5b1f595b17add98407a59059049bcfa4885c08e5a7db0cce1508633712312c53a4520d40c4a32c9b9f30820e68c51d8ca1611211581d31ad51eda575476574f0a58184e0a5878c9f41b93544d4e68c5f645cd88b870472536c56c42045c8cbaf9011dd7cf0b01cc7a8b2d8a043f280302eb080424107c8ffbd6889bc8d48d9b4d74efcf55202961c0c82448c45cfc4f4343c652113b32f9e22af34c0b11a486d79c3acf14f8b7b3f6b990fd597cc1e8fd8cfe4dd326900f254cfcb8b2aaa78a6213eee423a5cbf9eeaeb1222fea5fb8b19139cbd954acd760df1f0bb422ece067e748b7a2468df210dad58eb5e9fb28ea68bfc0885cea4cdad90b0f85eabfa9b5f6eecd53f7ee719a98c68b8e441f57e5ebe186ad240e34849a9299e2277dfff4005655e7070efe634d6448d3af0a7b7d1a092b38b6314204b9821be6a6ddc7003b113e1e6d81fff3e8e6e11b5289c50d30273a6fbd539c17cff05606c8a811f3667548f94eedebe125231ed65cd2cc14f7bdc07b09861dac00a2bef2ab8cf60e885e2df4cf4b854e78073015785db6f7eb2e2d7d0267a071f162131171c1c667805fda930a38f71eb05e345983d9a9818e2feae463bb9dc00e77f55157121c6a192ae76253da3d71a8f0e67dd093b3f2eae3f67bf37df74dcb9230d689205bbc83e0889d90f0949c95183a6bfb1328a0d07552accafa0ed924e9b8ca84d80c8af9736b43c0d252a6dda28c080e311d0a596d103ad1b7bd8f8695ac58a33746cb985a0c2903d1b534b50476b5477db01ea181b39d6100377fe3c51994e37196886069ccc5955da02840495d9d2b7c4939c343d96f406830fb683cf7af55f7d3a2c52ef5cadfffaa23959bc5c7c2f506a48dadf34dbfbf904e5f8b92de9f2393be179be9038dd67257750fd40d1951efbb7bef0b381af8f958d80bb470dca62c7b2fc24f2906a0a89b20296d1184ee6ce16df2ec00a6a6885e0666125e59af4f1b8449acc619ca063a4a8d830984a2c50901c7cbc4458d08f253be4955970d239792bb99cfcc1f15760f7986e492023629d9dd60967425485fa7e22d0ef13405c1f1f21a0cb000c265226d4f71da941c88a475f60c86b0595c93e953190d8b242037051cfd631c65df9140a26ad124ee13495759cfe0d604827d24f4aec6fbf91f84ec78480d0499ea7d306cb38bfec16bc3568e56f82726cadb580cc9f370df4756300533ab8ca09fae75a33da5cd80b80b8ea65da8da118e3c9d1c647c734087556e18a0b79bd149a5623c6acd8e587f03e89e68d4c2d4b31a2fc185f002266fdbecbd448fdf9441f080521f13744a5758c419daa6e195710d8857d367743b644e9b12329d6a13e0048c7f02f9e490639bdbd40f47240a33e32ea696152fc9234be5dea4a6a5c74f54226fda3b6e7bb6213f118f082174979383879dda26129150bc00aa49ad52e1456b95bc60e3272a6990e450b545ceb0af28ae23f2482b32a438972a695a2ab49261914e6ea60395509ccb45c39d1d075c869a44142887a9956ed9d1aca2532104fc4d392161de9b4c3e75290129fc8dd02684665900c5904189d2a5ff2fa0b9c3716d858c816b238db5029b053e25e67881456a0d8390e64c5441757104de51f59a66cf2e2e15277248047e2a75663db15631761f71654fd671f304fab1fb1199145c51af93c16752a5665e8049f16f6f4d9a6a2b8126a7ac0ab2be408c9192402b27ea844ff803c2c408b23d1f8f163256d18aa4a62b419a66945a95a714976b02caa6917653207f969dd1d271758ab677e1c5890eeae8454c24c675517b9a9b6bc2a7d933b50ebcfa01665f6285d4da270bb7b36b40d29e6a8e6bcef093e7049658472163278cf7cf1354901b183c0fdf613199302ed4eaae7bda63d2cf51ed7b0e86fdf1f2ada5db782465cb16d855439a8ad1cc3acbbdddaf942ed300efa256b4efd37ddc1ab7f476bac7af738bf4968e3b9e1a1068618dd477d6c54fb45c25bad10a9f496d402ade372cdca1cf4132012ac592b67b48ee035ccc3bd51193edc7c18f97e75d4b2d4993c8ac85dcdbd4b545314bca14a53c4740a4450f74083019670e17d0fa7e5c4c70da5f8fd3cca52f242df94f0f0842441d2a42ad8fd9811b8c421868526d11fe4590610894f662295020cd9bd3400009b00588cb73477a30558d5d4ac41b1470bf32196c4bedf7cc8603109bd4e03de11358e943afc1d36263b371e037691927ee33642a13550b208cc1398e542c9380aafb950adbec5b3196176523ebf30789904b77772699f52d831c73128f64e1953a572c989bc5b261321b7bfcac5c98371727d05943ff6f29f9b12beaa5d8dcad4c8f11df119e1379a6c728a2df5c1491e48bb7382739b35b8e5458e8912aa7c2a6dcb978436ad008bbbffea29392d3f099761e6a8c2b1092fee3f502f370ee773f6771f4782a5bc106554414789e13b6704f180d88dd125dbf1e12caca4b3875fdbad9508a02c8be1fc1677340e1d2fa9fd71f473e7877dbcd0c3a3ca68b63a3e82abb490914be995813fff312583ca3d77cc367dd9c366c0fd0367094b5723312cb9f7117aad0c4da2c59b0562b510b6ede618268168bfbc661f07052601a2c5b8bc3df1d35e48387aa1d6e50c25ac2890d02325510fb20c5dec9db9f604ba0bf7edefde5dc43cb42368f01cabf03824a50db1038da9bda736a198ad05b87ce4687b1545c3cb49e2091c801b97f8a17091ff99021d79529c4257dcab971c0389103cb28d217a1f27b3989c278bb1f465a09e58c12a112e251a884ed6fb1b2535cf4bb6edc19e20f7facef3952ca98a2eeb2032622589c0cf5a4d993146d5db0ce623dc069956752b2babb13b8b419b82832e5313f9bf840351362a3173684dfc0b43804f8194c79bf08e62d65b967a62d2325ef54f68353c367afb7b9a7e52b0bf8a747d1362e5af2430454076de4c2f8e5800ae58081fd9cab671e06287e3a5072af37cf9ff2103f396b694c5ca5594d18d3feb04d98e64059657310548fd3e801b6344c0b43940e9ad7c89b837ccf5b00e71158234d1a287566d3cc1112b88cee1058ae3fea5053cf0a5a1b9de5ba3c5a5c06e2373ab1b310cec42108f87e6bb4c3f036a6d17cd0ffe79d8614ef4bd1e043bffeb07bd1b4652923baeb570cbbd7d38db72bc356f5f294e901a0097c69f235ce183c3975a40ddd298311bcec525fa081dacb9a1ee673beed35a36a2d97f77d79d98f6320a0d36779be6d63a3a20553c706343c77c88b6ecd7ba88c0b5ba6efecfe4b2701b2e683211681897d9cca0c46099f23f83c5db9dc00d55665506c7a4582a1227a024fee3128b799b92c061ee8b45d4fe2e3106e87b84fe44d50c501226c4c23179d10036ce9d0b497420267fe958bed02002abfc772306d4fa6616504090b69e1c9487f37d21f28ccc3d155bdb19f840faf2df461958f88263dc397499bb93b6520239326509366f0e7041c89384a93f43d16ba6b77222551793d165d3c7f677f2de87c6d2c9aa61d53ddc614b95e3eff2270ca443d2ea7b9c8651537e3f39306e75db798f88bd4efa7475eee2e4fa3bd89d6acdf0e15f40475910c754159590ce17748c80c9ada44c3683bee49195b7fdddbb9e3b6ba6312bc63766c67b943a69daf74f04e9207bce6ecb50e949fdd0eda6944fd1a6380542b99b3bc129c8f09cb9609906cedbb2b98aa6509027854f449c7dc06a805151f3525e1eef2e9065a11049da4d3e07a8a18e73ec95d1e9525d4f52e14d78ac49da7894afc2aebcad31196a1c490d1018a8f9270f7b23778fb9b2c184032a5e3839806ae55ce813ce389a000e8a1efb4edaf83f7f7c9fd1604ab10cde704ba15df01252b814dc0a6e703bca9cd1cef00a9094eb0494644e429def54dcc5f6db2599bc1010ad6902d6cf64b93c649e60085fa1dc885ececdb4065f64145419ca5f6382750a178e88bed9424bd89cc3091ded4e82921afe99b4457d14accfaf105b88d6356a87d755d6034b6f5e7e0329fe48e55ddb294e91d9bbcceaf3af25bcbb04c2473b309572531d0359588a2364d0ebdb8e39fa9538b86655694bd75d9bd43b2673747de8a00b15e399452f999543d659bb39f49e4072d170f7900311a0a50e12a046d2059790f0bd4d4ebfef8c8b981cb0ff066c5aa5e9d3be892edce5ee82252eb9205a695637dabf88497865436e85e3425da633eef51de7223f3c5bf3c6869903395d0b54b2c4babb27b85747f7f8e7cad1016f615c27d8057cb515a9dd032af0a678d4525d1950486664d638b156e9cb88c4047ccb3db1252709323c1e5f37ff5fc52b3472cd4dc2e9ba228df69e6342b4ade8e39e8eaaf144d22363ea2ebe71d67dd9b145166539c1f505e9aa3375bba53b03da89260599562e5bc4112aa48c46343a46a84e93df7fe89d85c9995ea79d9a0383aa318f460692c7552ee4c5f4a812f14c5b1ce81ab7d4c19471aa3a358575bc1a86abe34a4acfb959492693f1577d71367c1d8cfc43a8f255986921586867236d66979b536cf7b72728563c42919a1ea498b840958b5a90e53f79828b1c1cb1c3db296ed576e86d814e2712a45a60c7e876e496e01c1201006ea12da8dd474b843de058b957c35c902eb1eb5ca4e33a5f2a6f4cb0301529f0bdfdd65b0180b1f203d95734fc3862f2829f9f9c2ac34d6c855d8330b28c172b3850a468324fa060989078e9147c2da6f93a625f4c76775408c5dda38ef95f0c34baa61299c04c10e3fe45c0bbb3f254d97a5683ad69f0ef290ec53081ce327d8267619d811444556f8894559bdb50b33ea91754fdfed0c219cc1d5e9491fd6f878583d057cf3305ffab80f88749625d525585265b514ef8b4c6924269651c8119dcddcc726458a0cc1c7b6b29e44562f92e37de41e1d8fa4e293665c676a406bd8c2af0ec50fef9ae155d33ada8d73ac3049a2ca2b0cdf493f84e2bb1ab351a0f3e6e1c69bf6ec6fc638c40c9caf13101d36dc1b885695ab34fee814a5568be35d66833e3a3d5d0e01086bcd0d08764c796e508d89493712323784cfe49e95ab4b32ba48c5ddd025cbf239054590876b20658411cd7a66cb087c1df9ff10f5f27ee173eb465a9e541d9d5559cdf67e754ab333f2b48d3298b9f73a616bce206ec6763b495b75eee405c1867ee1a6188a0cc0f3181ec93a47396ea2e71a31156c644442434d7a87fff5fa39e61971c7da9ceae7eb21f9c892009aee80284168e8ea49979397990e0bcfe4af3028b94b745db9898d558e464fb2ec3cfe149c73e8036415572e397ff75ea921225d5ae0dd8d6ef92990c729dd4d2b97e39a25e4c61350276fa7cf3752e80cb222b8c75df657b68e747978ea5e159b44410af2754741a5e82d2c22b0ac764bbcce9676346e7c55f30b523b98738023ee417fa107bc51ba17219582188c8edb09f59d7d358732ad2bb64e884ddcff202dd07290781d249c07ed3a0eaa94c0a3a9b34f51cb7f8efee319042232e18a2e44faf1e245f117c17ffc4f1f7fa8e91d236d043b9c20d97a76ecf6c850fdd84d740e4103acca2beca867bb61a7422505e775b006aacabf980c36b2ddd71b0d8d0ab676449028bf47ad366028e51260bc05f860b59106bd0b82a8fec89247b8deefba1486c07b92ce12ef14431adcf0d508cba64bef7471d2f727ab6cefd7bea6973c4c98fbed91ce0706b67cb38bd21ca25238f9d7447feb1ad3b78a797a4137925462bf68504f47046c44ca89027a4e8537144f7a4998e51a1e941d1b9a799c984af62f366fa9e73abfa53ead797a7e9921cc1adcbed60207acbce61a341704caaf381ac6ae86d20e2819e3068457c377d84c2e6c81c184cdb49214b630589a42d8c2172cec4c9554a18583a569842d2803a060e1ee37ad90852d48d8b9e9b690852818d8994a60852910d8986c300a2a38b09852202bf0e1560465cc32b9600b5290b0997e640aab70b0c4a485190ab16af1cbad70ba6a66d00e8d57931d4c6a7cdd1b16ecc25bfbc866a5ad4482722de6d2097c6b89844abbf361cb2f2192c78b16ddab54da315cd9dc30222f008aef34b025306dd68662e15f9a11b7b7607f7d5a09ee6de2c4a25ed53f2240e44d835caba5c2861b51a6b77f99677f0ae104796d651d663299d161416cd6015156ea282292814b9f0528aeb8dd5657e67867e2c9675ebb885a6e82dcd0f86730646a541d89167bef47647e004abd095eb41c002b86c7547fde97d094ad707db7d5762340cb4ba59a14df6cf133b0b231bf24dfb9e5edda2c97738b566d06faaab56bd32a75ac5a1802104466404f42539b6d8148a8ad1ae4d954bd5778311490d1366ea5dc0ba7cab9f23cb84632949b34f474105519cfbeccee8de059bb90883b45da05eb5f2d3d6efca4c7d333dcc6b08b6d7c98e73b0451d5fa8a13d03f7ef86756e4afeee4e0cd901911e83895ed1676164ca544d86d0129e72e2cccb3d88cabe009f4d1982b4010c1463aae0648f2156e259d67fe71d585e8b0cc6e4a0cb291e014545cc6f454e7af4c778fbb1aac32e8cfc94e356902e3650fb914c6000b2d9b6a70f3819206d83163f1f6a8703b8029d43d2f7d51edcfc8c24fe45d04b1277621b603d85b80ddceb617ef056baff35458a6525d4a471331a8b7a794bd13f5ba22a808e68c071a88d9244e6980d35630157575a997b3ca01f123bb002b3f35a95a567d304f42dc393d91cb801689e6e7e28a45677d74c8e93fa5cfd42ba202e75876d3b36f905c43cb5d26798d261bac005b02efad0f85a57dcffab04c1eb4dbec2bfea4ff0bff9aa75091857dcf307a3d58c4f8929b2cc9142ba66be4e582378db084e8baceb175ba4b5619654d6dfc759fe1176d42d12ea6b4efb456a4eaf94c8dc1e9face8c3f82f62dded299972d119f8627ea5fb78671399e752848cb6da40152adadee0baafbb7dddd1adcaab9d232b56072eae4871e126c5497de0451ec163b0b554ec85e7d96f92c0b8299febd14d85905782e5ac5b0a3c045ed400593b17112b7d1b61d532767d623d5d4e9ca02cf1a01228514b549e07976d2fce0ad80229418dea917c452639ac41c1a2d2864008f13c7eb2eef49e49573b37d36382e5fcb2d8e85dd4f10ce365214707ce8ed2dbb38479a408bb19a4968d2b34f82b792fe06cfbc971050901f8367e3a70a912225756fd7540f8911c53e365f0b19796813924603c78dba769c9d26364f0e430f251867964ae9842ff0b0f6589b022600d89f0e14f7dbebdae29ce19b618f0685ec827117425fe76e4c092ffd9bd8793bbd95cc268d3bdc4ae910b79a1ab7aa0b389fa8915b9d292d6516acea5591dfff80382904d42954a6681df3027baf4f4916b46dd7442d060d5d1ea766f8b29558604caf2566f041fa360968327ee12c28d6365f4cdc8feb23c78e0496abfa43f50653ee0586b994b7942c010b9e4c5c1c629fe4c2d9d40ddc32d7dfcc17b0fd77b1e1c91dab7ea3250e856a9848684550d95d9369463d5d99b48b476c9e97fce9b1b11cf8d1d33535a831575f4c0ffdf25753653aea9e892840f64cd1db314717da3a06b03b35f4eac083ba1a88fe8fc4887ead0c26bcceaf600ebf550fcabe06446ca6655487edd9065c3fdaf77b6dc367d4798aca99815b42682b2201ebd5db7b9507bd8efcae95e9847ad48c72d9371fb8307067142234be5d297044ed31b0f8024c76be0718a2c1c22d8f2d8a925de104bc56cd8c0079fb1755488fecdd99670a963b97313203c0228e372029e9512d08e293ee0ed260bd376a183d48870d8e9ca284d5614e5a1fd018be4810768ef9260e3b4c38e627f39ed2ea2e02b4a7f373c8d81d61a5c47af1496ec6be463f043ca572e16e0bcd3a1407f3a1c81b915ac83376ac40dc20eadb75debafe435f0c19baaaa791855ea89e9d9888f82202e67b835014bc61f6ffd6c4b0a01ab0bae7b9c91def94deabf7f61a1730961001a5a6a199140d02af9328f219fa7f3f3304b6d39bf40c0ec10d61c2a3780e4512de4ce4f1f7c4356fad469b67cbdffcae99bfe9df5ce1639ab63acfe7d3f40640378fa888df2a29826f80cab170599224c960f5649cbe5f041695f8890e422e47238e85cdc6013f9cf3f3960ed6f559df388ab4121cfd948bdc9452f10f41cf281265850af1c15a5b0be16b8939eaa4657f0c312593852849e382b6edf3b223c4894f25313904f0df534836454ee5fd1a0ddc471215f1b9aacd01d718d8bf0d106bfbb605bdc1f3c48df0b285288e275fb61c1bc22d3de62003caa5067cabe3c9af33f2b53ab464cbb70dba7bf66b1a85dcd004e0d1bd88b156d893bc8fc907a37c6a96d3561cfa37c04816328e6fb1c95940d198332de6157851dfb452fb568285b81faead1aafaba069c372151c2306893876ce82a328c5bf115f1eb787fd5da762cc28083e619f65a21d1688c06394073208892a301209c66111e7763f967d5a1312ce7e5622fbbb77bc5cc84667685c54356cc1454f8e7a8d39b718c8a593c32e8747d30bf46426f8c4e92bcee0f2dcf3b3488a35f2c8062c38f667b4ce32c9c2ba102a04a3d13a94098c5ff807783de545564ab1a734f09a9746331a416ce68e08700f18d0a3eea97c50c33eea034226bc572e012de359e6e764c23ea25588ab17d6530b816b01b86736f67e97371006d95bf86eafd0e58237a6ae1e87400759ce34e0a084b0520615885c72dcf7ebbdc085433803eae3da2160ea2aab0effa1f6e70b05a13fb0d1825dea9365fa75012c4cabf22e5e23953f76148d8653e9c6cd3d50bcf49bc46b24875159087f3b0e9d5a8385a06b34e4908bfbb08be2f022f741b60b22885e228eba9789b46f91adee860d29ab5aa87bd16e1e4f2ea063e1212eda2fa434b3ea632f7d74e55b74e21a733b7a0a648586368e4d03805041fc94cc00f813fe2fc21729ce31b1a5014fef39d8f00864b78068f10e4936fa905460f8a3916f6b4646e122d1358456b40ad0afc18ec0e231d201abe36377a124848dc120c6897240016d038223f1089e76c2cf7f046827e8590f035cf22882e59a8cab84e37b8a0700cccb9b333968ac9006f3a2c841758b2af1a911f22d35047e58f0850a8974b63c58e7e565c2c9c25dbffdd3d430ad8da3661ce1bb645a636abeaf44d9a9a7d0e901f2b21178fbfc01df48e78d82e1aa1e46e483db00d90e7c89d38e3633f7c06628f704d33326f51e60e6e676b815281117b61045142922b015db3b2b1979af74dc3a9a44ab710e76672ae98c38531d7b7c089c24f42baa5034c5a6bb788a6df00607791f154ec1d11b90ced3460c64916cb0ce39941dc624d19b90a029c27f1d5017db44b7658f16fd38a949b980327a1921a1fbc3808ba862af2cb75881e7077719a3dd249a9dfcabc32d6918c824f390b5e79b74b4b08f9c9e421362832ee669ce6f0dea6d666eed879dca27b53b0298c9bfaf0975a045d45615440aecd97a6a11501068c36948871694190517611992a5ea34a043caeb8d1126cc15835060268ad24b2094ee47f3b1890c3fcb08ebfa94884544ffc4e7641f5be75e87c809399326a06dbdbf14bccbbbafe73b2b3b3bde123b9b8c3cf616515f20f6c7239e63962aaa898479b14a95eaeba6cf5b9fb1a20da9f1216b6a3eb40b194c5c3a6881f624785a923b0890b70261a60e6458bbbe312d5408443981bb0b76072feca3cef69d5afa656799b66932d5c3776e62db041f576c9bf6bcecb279ba09a9cf896a77bfa072baaa8d9b907a013fba6012ae4002cad858c39073b320681c6388b95a682049543d656c7b53cffd483835dc082e928905a4524970cc8d3c8930a653b390456f2be090ff26d3dcfc134807ee4f5de24de19c72bcd02a4d7e255db8d46655a506cc08db9f953f003e1958dd503274148b6f7762b904955013cab1c5dadb6ada6ed0ff6f4539f53429dbd208433ced19f4942df801dca0e6eb18a650581e056c14742f9c9407e1a48fca2069052ada77c1e528db5c3224cff602545d22fa3366e74345163a3039cad0501234a4957d1d8382aa5f04f133a44622623a76b40333ade1e247cdfc29f615bbfb1512773e86a183dafb9421f47c47604ea3c875eae60d29ba3cb9c814c246962ee13d673ea3c001c1559f8237d91201f351ec8f4152330115c70033b8f3b64660cd5a8ca411e311a62c23de261daa55d3939b00313de670ef003fc5ad942f271ecadf4ee1699a259c74865212e25b8287c7dde4b03c2eef5f5c36c44972beb257d6106334167fad56f7cc08a04fb1f9b69c8eeaf1251e79e7b1a59a5d619e522814ac4719702dfc68a4d13e856151d6abdd57508fa37bc5444cd0b9bbd147f014205eca3c87cd02982548d799a8449010340d5cd6675045ed583e1ce184b83dddb7bc24fd1a5267d6b735b8ab302754a7d64add1f0854818ffe0a4a5e510ce19a4676b8304170ba4909fc897ce09e5fb665415b9ac22015daafa396c9374b1cbb7945f0e5c722cb2852de831669b490b4d6f57acb6bd187220970e282df33d28d6320da5cf38287a648047a786048bd2353bcd78223c75dd04ee89920a6c84f81b0ae0a39c3b211c6a2eab03b2ec0e6beed3c1c41e2972ea8622c03f7fff9497802362990a5df4382cd25bc92523a910eee85d8e658f63beba3b6b5be98252669ece21dcfcbc7828b48df3815adcb6bc9f16bc9e5e10353575afb6c5d6e8c53305744082e0f2bcb42aaf6d8a71ac3f49041742ffb45d487de7f6efa2e321827e469fe394280b8ab8157c56490d5e46c755c83e1b5b2761406ae04ba76b5b8d9beaa36fb7572e6dea9e5e4ab534e8379e91f56d04881d95c57c4237189ee26055748134badbbeef54687aeb268b0d24be159d1c186051536333c746a7ea570fa8236a865352376a7506780a1cefa143939920ae9db0d3ccab546f9429816b13453e6ed26cadba655f46c9f11285c6d086573182f6a6053ae8350129c6d895091327a47379242ec7a7c7b1a4ae32f36ee045550da75b0eb71a209975849345831e9cd2b34dde5d4f9c99ff1e9105f33b3a0465234a09fdc3a55b4e95f4d01043a5e41b4b459da619eb8a0f642347ff4e53fb40122a9d279996aa0776bb31432e0b385fe363367d5e34082aec2b34b9c4a1119f96a90be351dff3d45ea904ce4df0aee6f3ec749aff91301f8e5f3df42a93f253510e0b901d87bde79aecc6c83f645f6d12dfeacf8edf7357aa4be772f93cf9190c546ebe714c4b1e43fa8552f2f1224e9107c62e7312d0b681025940b133bfa9ab23e0d88bf329e769c314eec70dd70261e3e3daadc7bc4e8302b2f8175b5b6493cab253a2f4093cc22f18910f4c89395f9459a1eec2378df27bfaa8475957d573a9cc98cebe1741709afc34a5f1a9571994a520340dad41da554b01727dae25433064497363ec50e0fba44ef7f8ea7d71b744b823d136aa9b06901cd5f1d0defb1b749d4c23076377035de6ef9c087f9239cec552c6f98e693cdf6812b80d081008fe4fc2a419f7d1995d404b1559b661b2a2cd2d359cfcdcb526f9b5926acb7864c769408c0dc791ce24871918f5b66bdad845959da23105ee87dd739d3b36b12007c29ce574a736b9893cc043741d40a274a4962f3d5167b5e65329fcd6f0bd7f15af8a282468267d1894f75db0084eb4012168c1a1a2812922ca745d42876f54ddad469a4d93ef16e4755e9f91e2cc7c192547ddd86b09aa0bd3a7d10f47075c109d59a41ec22ef7ad467698394ea77c47e30b629fdc751e6785c4a7ccc2a165f20f3ec591f0bb9622c711e375d44d69bfe080b238bc9a2348937badd7dd420d8e84ad96cad794f580348facf0a304980593174e81117a813f644de829a826d8a27f89d904b1c378f4cb0cba84957018d6dde501687f12b9957e69733ebe308802822485fe8d1e83edec790ad9411d43d9c3aef5146a8f250bf6a866595bdf8c9e43ab4ae3367983115215b31d0e84a4f04e3e19e0211293c28fec336cccf0d0643d408645bbd9ebf36e8911c094df74465b1de0a9a70454e9a1fe38c450f14d7f8211e0672ee590ab88239bc00ad261415fdad0733fbe3ceb2be65e9b5114a85c8dd7dde4d638b8474557432988140e8970f3a86c9132dd4772e2952ebd8d2b0d187c885a46d98749afdfcc985a37754d5a81126d3ec608820e962a5cc33a8ea39cb29063c1f831c512995f08e92dccd4ebf5e12fcc495c17c1d0d54bf4fa40c16369673c67bd7de4409db7c8bb15b1e38949c08d121aeb2683a6d75c790097a17c82aab0c058ffd0d592f8382b4cd5d13dcea5279b13830d7cb19c5b271da544d5480f0c649274330eb55a377df7049d452689097694472e8bc27a57ef13070f0d1bf3e7d553850d0d3eca1cb7db997461083a9c2300d92d2875df22602133a7df40ac709252a504c5978eb15c4da2653483303a1d860384ca82c003478470c45032e8cdababaf41f950063648687df36d493a95bf6f4b851be99dd2fc66ba8f31da1dc2da8c146422b189b98c88f2193eb16a4a5c096ebae1d94d660360119f72f5d63fc784536f7d4dd384d191a66b308af561ec86514a790862a97783ef86649b6215d22156e51f0b0d0c63f8e009ebd44614f448a6f36bdd6c06aeb5ca1cdbfc14c8d9002a947a9c87d57db5970ba0be538d2ed05a76accc706dbdc3ea19b6ab896342a45d07b3ca20d9c2f436e2bee7090d9c537112077ca12b512f6ae5095e51f3bb38469a52f54e0ccf617ec1a6bd66d1091987c5f7cea2d6590ef343ef5628ebd6c1e513d65855980eb176f56cd6d85a0eed2cb0261199129fb6b0f94967a44152d3768ab6740ed39e04ee912c69da846ff31bdbe749851235b993cc74b4e25c461f3dc0b4b0c9a3ce34f9633b13e76d5f90a0d3da7a776ef64bdfff747b47c2ea4f5308d8e43a7b2bd0b47832eebd0114974857b03604d1ef8d124bc11a690e07b9d6cd8a6c238f8ce4624096488580fd0718ad82a81f8eb9e48b22e4901c9ad50541d03b2ab300e79252faca38a80fed8a5eb4fe6290127e78aea1851e116a16379e614722bae0d1c2ee4990055d12128e5ea4d144dd41233e54906936a068844e68007e40234ff3e0a9364ed0132b0791b510eaa4336e22c98763dfd2bd247c8dbfd781985844f3c3b19b0296406cb1e88158c23edb50887e9885822a45e450c0f0555055c89b94028a73d01fcb9ce2bc723e6fdaa1bd9b2421bf2e6441000cb23fef30af1e659ba65abf100408ec2188ad46a8e69c209ba9a89dfc6787a687e0fe2485877741694830c9de2ad027449dd9446bb964baddf8b84ab89ce97ca4f00512a15b039cfb467402e7ee643e57139eea16e9cea951e96a3253780f3ba7c85ab3bb4af30684aecde233778deed0643262ede074370ec5e7a9e4777109db8e8b4e1bdc64e397492eceda487910de11f801ccb1518173eceaff5c765e2a7a51e8fcb0e53cb44889cc99dafd927e9e57d03f99eab562802500080e1e74b820e9f9e349d9ecbee77b352a0996ccfb88101eaa857c7ce0fb965dd06b6c8f77105f4692dadcdc1ce1e4ca232abb1e31d91ea41e8348a8412622ff30d0142fe46c545c521842b7d6cf66b2b7b4bbb8f6609b111115251d2a8e9f0cd09b392b11c3f386e5369b5104af985cdf5084053e354f655c910deff4328ad622d55233c9e3956b2d6e38355b033f14428b21a1b546e8b5de6c7f96409541f345feb509870d6745c13d113a83dfc05479e374c13d4e051bee4ce457fe7c3a0d06ef71aa75e839d235a7a47f8196bbf5bc2017156b3a1c74885f0298628baea5431db5a02d780f1671c89689b22efcaec75398f2c3ff0634fa67cfbb9e4b0fe40c3c9429828d468c34f5d2f258220610d6234586831188c97d89fa1565bd713e92533fc088351822012ce01d72428de3f57def66a9962f442da763755057d81e0529992edd8af98e00ded5bcc20962b00077fb74935759945967a6ecd256d1f37c04f3d048d6a5b54f8c3d3a9e81b61e093af8c090eb5b4b23dd30410789a67596bc737443e02c77ff9590bc8f54cac2ed9cd75ae0419e1c6810090e90cfbb916011b659d4798e28babc95301698448c91239da76fb5cdc9fcf642de5c1f7e1490b59da509da5709813be01a824e41b1244e39c226c3082c02d1011a77d742a56efab42e3c92be43700fdee58acc4a5b310a683a8358175aad5a9f6572096bc325a87556794b26e2243bf4cdde25f672a63315cb00aeac630a5ed95613192f0d8c2f191c2c8f45dda125a87698082be0e80a34e3b441b4b432a7ba2825a7c60c3f5fba70e06ec7f77393ca7741f05405981be034fabb45a91f1fca438cf90480e6a3e805d0e00fa0df3d5d9be5af1addeb5627618f54ef40cf1515db9b080a90a849b8bf17e61be4e658a9e638aa2539c411d17b7f359e24cb64a174db140fb7abbaf61133fa546d91a6ec7fefbe203b89c2b9a91794c72a9cf3e41d46854a20588a912e0759d70899622751a9077121bbb198582254d65b0b1269f9f8353fd0b875141119510c884a564694a7eece1c182743ac93cd805a71fcd12ba79fa29ce7913012737ac0748e303aed7a494e00b7deaa328bec5e569799aa1f31e78b2c01018d0ea7f9423c68c35d5448f07a38e2e238d3eaecd65e106efee9c9cc2c6ec4a50e10de329e72abb8029c8476bcd37eb77f75af671f0fdeca9e04fa9aeac2572b74dd8c260da2ff2df38177f92aa7f035bb7050205aa46848b6c375e49a47c4c7d3c01acbf3c6dc8da47d481ac4a1ba3da916344650b12d7f6fa345a4864a236bf2517e415df91945e686257d4cd0bab535826050c368255cba7a1e49591404905427719259219a194f042293d9d453ee1617a9067ea1511381aedb745b4648e4d6838da072cbb6b327ecf781eee3973f771a23823d5802d215319a69f94d679a198d769f4ed3cec544b395a887e9f0cbe764ea4ed90c9035d90cc3063c1bbc516e0a84ede17ec019d627b1299322e57aa03747503fdd421401217f84cb3b0fb8b57a5d8feb4db487fed349be9479bba78598039dc2c957371bd7c2dd57df2ca127b66378707ee5df674a3ee77a4d10e4e8e18f454cb3c08a5f8c5cc69744b905a8313f76bca20cdb699ab1ce5b3e1c2f04099768ebb31d6d7e5d8f681834d9d3e451a10fc490983bb5d65a672675824ba9d395119550048505fcc816e622c18e21fce3669f0254e476c40b3a51d19b17621e37e4bb453075f8b8ef65a84224e176736cb0e8e167ebfa41094a3dde6db3ab381446807d8172854a174b21df08fc9cebe4ce23f2c235468be65d34a2845d0272c9912415f5bb2510a7d6049541ac15d95469dd7d7e05d6ac54a3e3ae20a6e1c3fc21ab15da06f70ac5ef376dc9f83138b510ebeb48596114ac53f4de18010ebc5164dc955d04c4dffbf38245c03a36bb5cd2cd767a012d580295845afc33d23564a2e9b0b00258823f1c54eede951fac2439630ce55877bed20f49d7f24bc4f47e6dc686087896dfe25b4a7c6c7867cac0e980d280982a35c80130803a7a3a129be7be7c352e1e219f00beafd380e8d8c6522e229118144905c89921cc68b3bd449c490fdfd4a27ad9719d832cc2b43aa50c4341fbc8211e981eb672fcae49ba996fc854f550d4218dec37a871faa92a88b40d1098f3e945ad52262e6e41031a348fcfb70985b89dc7c21d8adbc9ddc2934048acee860891149a7293660907cb068a81446a3ce7524648d02dc7b2b284dd38969c0c8fd00da18612c80967fbed036ad0c293774288944fd4cc4c89ca4d803966bfc5d9968d7dbba9ac09bdfd0c9132cf10040f054d07afc01e8e2d302f7a9f72f83f07983ad475411356c8a78f4be33002d2db502d483d35535f498666eda7c2f2c3d1e07edef22c147ddbef40fe53be13231f4b5644046ca07cd7a8f9334e84b83a98054128b6d7d772004d36d95c02c3192a93351915ae1e1a46947dd3fb1747fecc692d6d029b45dd70c79fc408260a38bdf86c63f643fd8afb7e616356bdb33504e0bc2540a91bc2f7be896f81b08d303dcd9b8e5068f85650ce97aa55cb51080f88f52846a68bcb7da8d31d61a40ad776b403a8b84c7ff28ff231835224382a1b994522324e129e5847ae2a246402290f9f4814e7625a93c4743c33c723334b0e0d64e8a422cd37b093135b058b61028dc7f85b36d1ec6505ca98a666e08b6f44e6c55814f35a6aa70d11b305456e2e6dddd102a263e33da3391503f44851f32838080adc5987b133a6b9022c39ae82255443e4dde106a425c751682faf2689e184f41e60941b4322aaae82714ac459be8f2e01674c051d7be97246b42856b829f6b82ea9d9e30c760774de9324b4b1f62a9962ffba631766f37010220da45e8f1b752f068e96fca92695243f0a61fd60e7cb116e68c94eed561ee7e6e58286b82c0fb890acf1ab4104806e85122524d5812921ebe7d1919e78fa9bebf0965968c9f6a8a45303d3ecd4abc5bf42f803f11e99c44eabf0cd0906c7ad716c1fd3c1c8ee9b25662348f72aa90b7b40ca50546c343860c211e24d1ad168a6321b8ea51f0456e1cbd2df5ef96fd67250f42e90c8c113255223d3d98529850f6869eda224851aec4aa52b9dc7274d56c8129a23ad793e371d02baa8d17b9b20a0274b245ab1c543755138ca5d55e515a1179fa671095f3fd0fa01878728c19996ffbb1d42e2bcaed4c3fa900a70c191fb608e7c024b1d7e2add304be122f178735445ad6d365475def9565b830007ce222867a0a689fe6d60dceb1e1695405f53bfac5d8a66719f6edd16937da24a262ad11ebbc60eda99d25dccd4f00199503083744889fb97bc89e5697a6e69179a4fd1ea05f20337c80cbae323cc4a6147e42aef5333a94822bf05af8170167d0d6a0ad51e9a38e032db5fb99cbd2facdc0328c41c1cb7b09d1b681f700670c66042ef57500dad9b4445087d985eb5712a8337678562f4aa43014013cd92fd5edd970672424e9bbddda0c1727322b1e1219fd435f790c9557f64b18420a18f2a3c4e7a4e2776e04b9a4eeb722705180585037e103e787e411c80055cdfe803d1ad45ab82c7a0af058089e169c59860fd924cb6898d6d06e218d59dfed45d74182e4311f19e4960fe2b38aac4af8b098dd4f461cc7a81fc288d306ef45a34b3d0f1b51d24ff69125c16f0636c8685c7bccf69e9b639d64cc895fe35ef5e6c80b5b1f7ff5c04638827173d98c5cd490c91be81a62e6d63c96873e782af9e352652140a08b230d0d9c40a164e2246df35c60f2825185fb2d09739f22990f414309d7da873262adb8a612bd5325db2de491443c9548a7a8b6f7739f746bcedeb5dbc42fefb28c37518cbfaf4fa1802c0aef9cbb31e2061f46f978e9c1f7ac698a25aef32fc9a078c2602884786cc57042104eec522512fb76cb7175132388dd63582c41223c73d77e23f4545bbb2fab4998cd28d72cb257e26238317c1c6e9b973a270a3f0419fe7ba13ee818b0183d327d581871245ef46ab0f831bc6a025c4f030b1c5a6511311af5e2e8acbab08d5e95762bab48d745e89c029302fcde890cfa62d82dc44a1ac83d529ddbde98661933d1973a872dcdb932b69b76f71303d65e01dc87a0fbec01a1e2d5b8975db124557c2d3de0b0cbb8016b94c822a6ce4c83039a97b6845a201a56a503f1e77f1755a5233f855af91770e52e3e1523b378af4894fc913c32c5decfa0445f71cd07930aae78186760700ee0108539804c0535a5857a87d4ca7f52f9a2b6857bb1a7642346d9109164efbdf7965b4a29534a013e085f085408a18fdb6d4f73bdef5c71a6bf566b535115859531c6187aa1bca1fc093b10fb8d0803b7d73664c5c6cf5e73fd6caf8dc857fd36543db0db6b1bf29b1abf7df26ede9f3cef31eff4988b274396fa1aeb6fa93829f69ae779de0d377a9d165d7baa7d4edc5ebefb42eed61c4f55309efee5cbaaf8aabfc6d7c3c4bab8801da0b9281087d3b7fc297b8c461bec3dcf8b511e69f97410d9f8a73fe1382bccaa9cdefee9fb251267452caba2a414664e2c111bca9f50c8bc99146785999151bcd15c3ed36f74bb4f45b0d9ff744ecc94a43497e63334a138893729305b02664e6e3fcbb79dbe0dcab7196d479de9524a37aefb52d763ccde33d0fb18638c310b32e4d68f9f0c9dd52f5b9209654d7cd5efa93c2f7bf9e33737ce6a16173549ba9c0c924da413f99244b7dfcb42cd65c559558bdb31c6dfd1376aae78b30d75b8bd7c4ce0f6f2810d355795a4ed75fb3597e60364bbf2473b72b59faba364c36cc9edeea66454bad3a4d6c5eee273df6c89b3849cc58139602fa4664dfaab210721b6068aecd378e017fa6bf7704d3f6dcd0891dbda12fb37d45c3248fec8239ceb32b1b1cc0dea677523a7c80647682ee35c66a2e8ac100626c538bf6229995e962fbf1b777e5c4404cac5322ccbb8a7b1d971232b88828acc10ad084bb4b897f4a34fbe33f68ac9fc5e80affa758c008910103948b203252808c11241449cb022073368a2d5dfc38603d8c0863a742c0067e3c1062838af1a7286288eb324d8e3004d5e6645e32c7f9b9c244b3f070936fb52305a19f19f15a6b828063eb7df870e999a45f6cdcf3ea9812a1ef166bf23deec53ceb2801299f2d55683cb453e48d7570d2555c4e4c9ed97d1e1a36977f49319fd1d7e69035235388bf2c0a85c0ad61041660500a05b874839c395355c399f26d1c04544f0d5995fb11788b222b8e817802bbf00dcf9f14b498abb7d7125b8a2c2e2c006bfe125cf8c8d657480377ce5af830c1b46a21b9188714071968daf9c866b4ed7df06c631afff05fa06c6a19281defe7ebffe1ae000e3882fbfc68fe64359250ec48e919bc912a41b3dd79dabb095c87dc3592143d11189aeb354a90be32b9c1b3770a0870daa7f1b381a61481bcb84ddcfe519746710e3f0cb2dbcccf36f52cace61b4046806712cdb6790b3425f127256d8535c274aaacacd250c841b72379c4f2e7ff51313760a996193be24ec8ab31cc4a6388baf3f0bc9570ce50b820949aabc5a2d3c4fcb7e61dfede7112c29c7377db0a4e84ddac8c85973f60ca262b326dccf20efa91f6a58920b446c04dd07f41b5b587f9f72fac20974f9ed17ce9fcbcf7d39c86bfa7290974a0eb28fdae80050d846e233fcfe61b5a90e0c5da9916c6518411214f9590a283b08b5607c68c93c4f2be7c80db291399e6362f879e33038728e4053543d7c0cb151ec66bd240c5c977f8a91cbcf21d63ca3749fa2a4e42c950d17a8438ce453300e24ec0d71863f0152b02aff1ccfd35239a8aa008e8fe17de07c0e7087893fce3be803c7c7f031803b389ea795f3031bc3e7f89097b0a58851611c3172f5b9fc13d69f7be4729832f2151f5d769fd1dddd9d97a20e2b0ee440f146abd5da54ea81a2866463a321e16c46b886ff53f968616748f3c009466831f90fc0b7f03c2d994fe543e657bf027700f032cfd3fa8cb07df9bbf6ea65f5f1679ec60be05dfe66008ffa7843f3ac96e7af48fca6c6592ccf5f83e28d0bcf5f859c757afedac46f5e78fefaa4bee28dcdf357226741f11b189ebf1e55a4784380e7af49758adf14e0f9abd28de7af569c75c56f0cf0fc590febf9b39fcc88dfdc3c7f86c459f53f16c08f05163e185714aac1f62a6a20340962c9228aa16601fc180835785dd9c5f7812a1e7dbfdfd1f773fdf7fffd0786ffff6048c3e5799ee7b2b8727c188e0f8be1c3f9dc155700c31a038696a8aac0d0da20aa916aa21730b4b934bef9c4572efca86f1ef98abfe59b4953c957fca76f5aa13df48722a1dc479bd097aff8b58f42f1157ff651a48f4ef115ffcd47a5f80c3feba3467186df001f1df219fe1b1f751267f80bf0d1253ec34f808f02c5197e183e6ac467f86d3eea1367f85ff8e6159fe177e19b4b7186bfe69b537c869fe69b4871867f00df84e233fc02f8e62bcef0cf7cb389cff0afbe19146738beaa1a7156a8215d7ec692fca600425494fca667be9a5c7eac8ab3acf84d4f67d444d2e5afaedac3362e7f2de22c2e6a02c9e5af3fce3ae2598d1a92b3420772209f229a147e2d499be22c49c6e5d7a8384bc959d5a87da45c5af215ff019c589e1b3927ca8418d165a4cbdf585200be1d162a8450e4d51a42236887560b0f806fa79b416ba787d962a2ea1f229b68b5003251353883e6125f6140975f379c412d7c1b14965e2deea40b497a0ac611e42c55ffdc36f28d04a893f8732f71561397f9b8d5af1a28e23785be193497f88adf8521981f5b8a98958825f16354ba9fcb2c0c49f1c8f8008c100518447fb79e9204c5a2acf315602c5169d58f23426beb6e87e462c738935cde431125f738fbc71521ce0a717680607143ae4e9f9121e6a1604346fa2a2f86ed598006340d04b86103baa3a1000de88f4b48c18f4fab7e2a245af4c3a16db8c67fbe0ac3e8b7cb6ff88b2597cbb5839159c4034e93eb7de47a27b9de412d84d189e3ac909568ae53813354745d48628432a4a04284255cb9e2847703264562e0ba82074a7e384b95e2eb4afd1c71f9708edb308e397f827f65be46c9fefde923edf26f1f50c5a31f7ca10aebc9404a3b9df3556cf7e973322dc2ddddddddb338536f2536e9f42853736a72cae83e3b18946d1560504f6c1be7ee1387153dba4b32b68e2edc081351747ab6bbd1822ec0a05c98fc61777d6274caa96d33ab98b66d5a56312029e737e58c4e85c0af8c620f03030313314ab34e677e8675614b73db8903e52a36ba54f0b2e2c85adf62ae5bf96715bfb19957808e50246a74ab283db9feb489d39e2b549c059344a110e960e8ba8a065123d79ffe34418b5c7f8f4691c8a5ebba7c85d289b42297a6d00c9a5466d28472fde750388b241df94b24539644d75c9282a4c43cba369ccc24d77f020571a791eb3f7d9c959a2ea94445c9095e3e94528c9c4583e8babf14dac1a9c723d2d00bca75fb11e8fac722d73ffa2471fd4a1243e894f86143d2834bec8111246103a98007bd84a8a11c1d317981fac175d7c2dd1d09e66d743a30d25ed5d7e87454525e8eccb2f1a94ec786b4358eaeacf182256e8d1a2f90c1ad91c5adf12f9d4e8d4f3d8d4e27255f9838e2bebc4ba7f342e3519d0e0d1729d7e55b3a1d1714ea593a1d94056f4b12275858de763a2c568a7b7a3eaaf1daf73a1d6be2c28485c9d4c23599deb6c0886bfa540b96704dff2e80e29a9ec3b82b7eddd8fe3886f5a278de013c1d37bc71bd6725d78be17a5ed10a92aeb7840dae0724c4f580acb8dedbb06005d77baed3f17034ee198bcbbdd6e97075ab3057abb99af696e86a9f5201d0d5902871b58f91f5ab12546e55e2885b6dcca54a49ec40ba2e4cc380d13836296963b383146c787c61c1854bd7e9c4d6a484e122092257be4d82082484ae7c9c259a43e5b8218c0ccd0d1424418514f4a440084790b8fe3647c4b8fe1b0e1131526e084374431a23c008c2f5af44d78d20a1e8881ea06089eb361c17450b21a4e464e5e4175d705ef01607b8210fbd7e7470fd53442871fd9f882ad77f65e3e2a222bc28324268882938510e223051c40727583031458aed14521c599b2d6cf83f041200b094bb7fcaa344f9e2baff0c35b8bbbbb7445d59802be5db21622044195702c15c08e12344124f2940091bca97095141b0e03a16412cdd940672700431b8a84190107cd00a2d94288040c50c9880b2c3125abef2216960c4dd5d071936b49671f82d0aa20813c74db1c3949cac5cdf282a9a3b80eb406071fd5349aeff1715d9011049246783aa52e4b344861219421a8e18aedbafcadf7d27468bd6ce10ea6a997e080c2d26dcf78e6402d21346ad21a71f7a5aa68f490ca37b2f84de49dfbf21afeb3caeebcf59b9de7326ee6f802c2dcdbb4997326eb1d43e4964f4144caa3f108473fc00e2f255cc8d20901d1d7c35e39c520a217f62e453b2421b1b966c9ca57a191f5818fd0fff96f277f895dcc9d039f40a08e38081b9425e871d6771df427c65a57f64ffe0954448e8cad0edee7e45203a2809897243aebbbb63ec64e8746c7777ff308e13e34082713810e348a27dc76ee2cd02ce51035117b9e0f6ff601c1caff709e9f8caed165f26e2161701f1553f0280b061ff2cf98d7442df3412a0b689373d620d9de347bfd0df2986d2af1e6aa23ee22b23cd5dfc4ef2a3733411fc427fff93db8f8161aac9048de09aee96615e071b0ad7747ffbf403d1e1c5b0f2a7c6d2c637dc53eccbb46d8678c381118c6005999929c81cda09e6f04c7f10204088a49cc16fec528f0b70400827b1122ff595f8f287166d2c63c32e83cd0db273fd77ac6e101d263739bff17e5c2ed70e4f83135d2875e3eb8c27aed70d1d379ef1e4c6761ed85c62c5f1c0a2605e66157f624186b4135fc9168af5f9c1f87a79bbc7167e94a291c78e4a48314955b9787474c338a57677c757bc69577c5df99f112f57bc212232324242ea577f446cd7b813ecc135f2a351bc81003b18c6215c1991aebc911172b95c49ce925772d10d964829a59c614af6c82e641bb96dd448fd6a2229650f29a591115292a3a2a3a42dacf28ad279e504996b686f98f36a3e1d01c5c0e69a49758861a3e4308e46c606162685695e96da4c1e011cd07d2c9c0de799f9da67593ac0726373cd6c7d41d8d8cfa1acd52186e5b6c964a374be874e29a534c810e9dd43dabd08efaf71ede55fc165437ba75049228a3d37b4b755edaf6cacf51bd0282563a383caf5efb9fe30d757d76fe0bc66ec7156c8a958d621bbb2a99f31baf9e564fef8ddddddcd3857825be48e2c29ed2080b528b88a33be8a33fe71462855832233db54cd296d92bbfb0c86aebbbbbbfb94d15a9c5f3561639990e3b2aae5c05a1d33331bf588566efd809e7052b3ea1352a12be4ac9e5a8ddcfe3172e40616cce695ac97943de28db7e6bb5088ddf8f125e3e8627cd4e41cd8472bae7813932a15bb14ad00dd0ed948e836f631e9b6a4e09347f00b328904f215d7f47b5a8faf7c8af8ea07d34ec035fdda0efc42076aae2b4ff4dc1460df2f8fe01c18e3e8a8cb592afb7db33a91e20df58933f3c85934bea795a449e5f64cb29f45f9aa2d56ab4df5572a749bc5c9135fb5f71c8d9c17a43327d96bc857edc518b7edab4834d736543728d605f60486cdac80a0de8ea31c0d532ecd88f6f36d443436a338d3bff454526f63fcc186d9d0edcf96943e22fe9dd62d74911889d995272cf61bc6759f099341c9c6e72ba7fc1cb172253617d5a0ca8d496e7f9d65595479dd8ec8830de50fc8813860a02a7befb1a7a02a03793492cb75b3a226456e7cef93485a1a91477cf505615d3db1879f32acf7dc7b2008fa8634abd2d3bdf859d6d12ccbb22ceb1ef3ba2f1452c557d915ba59c9ae30107e6493183397b33adcacfc382bdcaedcee71566b2ecdc8edcfb22cbbe22c150f1ce2d3cd8ab3e2ab68f82881d4d700774a40e4039f568d1adf8e8bd10c9604b57654c8429e9ba59e497c158ff9d9cfcfe2973df679affa9864df7d34c88b65f1b38883e7bd0d12b0f1309d8fd4ab9ebb0ad87898dfa9f12aec73629c355400550ff3ed7455b47686c8265a2a90c9fc1e668b89fcd4978a63d83095bd7c955d7116d5d168f716e5d1c7bc20bd0d6d449acb57bd81db4b870a1be4ac707b4949e2ac304bc2348c3e76310da3b4f3ba0886345d06ae9cd8303e8679e00f9adb6d589681a1f7e10f9a4b1fdbbacfb22ceb3e217d3bc0483637f204ddac0334b703431f370371f0befb1886c435fe4e9e3439f2b354e5c70c3432ee225ac970bce22befb9fe6599a6454dd3346ff64cad7e4d0443dab12d647c15636a065bce10510ed73057798a0d4c84c3358c6174ca8ca377a6b5fab3eea883cd654bc9d40b79825a76778cad84ca490c7035cada303bfaa62aad337ad75ad976164d69a72ea554be4b4abb8bf44f944f67f4d902efd857b23a18fe90717777a712c3b08861de30128bcac9182b27696c565cc3cc546218d73065c2b55360e3644c5d69a53f8d2b20be72b62225a5bf514a299592c69650b883bd8028d8f650ca60db3cc69629ce7afff41839d59376196b1aa6b596c5c6bec1f00dfbe61efb55594aa9c3149b92a337c5fcc80a2ecbad7cc534753a779cc0d63a9225bb37096e8332bd64eb768f51ca392926847b609fd6c3e6068db66d1cd77d1e0d7b2693b5a7130b4b4b0bca85512d3468d06039599347a3a3c16d1a0d1a3468d0a0e1bd8217f25c6c88cddddbddddddbddd5dc99327bd83ede7a21e0c5d7ef636be2c137b28d9a51b04bb2060e938cfd471de2e87412a1523834f38810a0ca4b08326bc788288d203932b45486942119a0b1ebc954a092944456105a90807464f82ae73a8a8c44f195c7fbe7c3a626b68200c841bf2d8dc30105a31c638c154ab5cd0010f1146d840064f3c21f484245a0270a2821614210b25508868c5b7898f13bfbf9833830d4e44c246c311292bd7f8cfd9fd7a02e597209197e5e5d7112a9a073b2fbf8e0cdd5e6d3d98d87e8ef92646e60f0492067bf963e490cfb8518a7e60c4c5ee6006594a17592ed201941ba6b84f712e1685f22366e493ad79b07eb9e80914b79f3d90c68dfc7c644b7efc7cd8968cafa241bb110c62ba4a649c7179177f73021bb287edea1e604120af0439320c9f7371631de4382a2b9575522aa394d22ec9176c5734018a14188d4d0dce6af099f808a8c2fa87cf835f1f087278a15f48eaa27e5c9f2fa4de13d7f4b3841db8fe11043ee39d1eb8fe51ce1067e2a752e10360b8f367a895fbbb59b7f428683d70ba130ce97726e5e7724f1ce2707d9eaefc420f844036c95da357a95f1076e396964f1eb9941b7fc3381dd9c457119bd8e4b06eadbb7bca204de4abd790afa2d3e0f21544826e3b8bafe8c1c8955df050c4b7b85bd765339b997581ad95527ac311c0bc7204b4645f23f5f2aca4e5b1ef79ae7cc59b160b2859c2ca9470b397427126f6f0807a159e87978771f9159e87d4c77c0f0f34dec6f350e3559fe3312ccfd35a61856f791f2b7ccbcf6f8979167087e5637ea7e557789e96cac6b7bc0fd5b3bc8d6f79984f35ff9fa7a5c2a7c2c3cc870177984cd007cc3fb8a39a9f8a33f1795a30bfa39a600e3efe3ffb1fb8b3f3fdf73c2d159ea745812eb8c5f2618a05e4560b98136d7c3cfdc98f27e6e3960aaa8fa7c55d064a27be8a4238b014bc72e357d0abf82ac6f73a5ff255fc8f814d3a7296f64fc19086e3c758f273cbf4f386db0fde0cf43e279ebe9590796de4736ffac21f20587dd5bd04193c49b12177e9763bee7b6c75e42ba308448cd2c867e2d79b74e36fa72258f9a12fad2e4eadccd208c9593ee44f3ce38f6fe64f401f22f2553cf25544f255f4544fecd2a5f1353ef5f1e34fbc79799768e3735c7e7fa6eb52b01bc9b0215b39eab8a2f98173f9a7cb196a90fd71e64f7c35e4abf82c1d8e79312267b57c7c87e2372c1fdf9f506765a092968f6fe3cbe9a5d4d72f5f27c5997e1a9fcbd7545e3566b0d21262c045142a18030560e800350102a98820caf8c10d9b96af5ddfced73e3e135d5862df0a8e0e5fc5f8d1153ffac4f7a5f86ec5f2989c8524aafeee795aaa06abaa77540df6e8e19ea7c537ee34e2b239f14a7ac30724cec8f8e33d131f1db6813eb6f7c09d0dc401651756ce1067240f32acaa9f2ff63b4c7c6c339a7c5506f6e8e138538738e38c1607ee8040e24c0d43586ef19416b7787e30025112111640dcaa81423e10f93a60d2852180c8d741fe0df23910c9d000077ab0dd403f847de9a557c523ceab5deddac0e05cc31f2f0b7793d15df609b6ed003188eedd2eeb27a58c31a66e8ccc2a1d5416b886dfc643771abd4241299da8e64955734e965f8e8ca02ac618670ed7b89c324e49f9e671b22fc77e9c12ab5db77feeb72f27fb727272fa552d5162298ccefa548239180f792398d38c83b3ee5ca0ea111f86b06fc8ee2da58c37ee94ad8993a0254880da484ffbe870e5c7d20d537c20cd00855f36376456a98d79081e25ad523236e59471fbd91a036b4d9a001fbca0d8c733f2bd4fc270e5034e5c8d2f03377ecfc8d73e79f2c04962555a1d6360b50a65cec270582b318e9408bae215f483a2a0278470aeb206e1c867588acff09d2108537c866f68eb0c8a825ee083a023a92a991e71020208243c241f6b4617c5657a02109c1654bc29426c40dd1642685bbcb8170a322e5c5b1329a84740da0f490c81694194fd40c408bac54f15c3c84472827d81027964447d281aa28b233ed8008928484928310317463eb8928812e480a09fd4136814db72f90a238888c208204c4d58152e5f514418d80daceaf2154568c1832286682e5f0144181c6af36f5e6c93de2c2506c66fde206d52b1c03858e09a7e8e946eb1dfb9660eb912ac5cd3fef99591a937a7bcacb4d24a2badb4ca9777337593e6c7e8c9fee0a1db447c4004fa4bae10fdea9b3a9d29849ace38e30ca1202440493c1d279fa1162431728f743847faa7a77dba0877a305a9a808456ef7e870a55d9b8d8b13519c68970e3f96aa68342f2da812832a3f6e984225fbb1a272830f24295506c689138c20e5d28772b16934838e210a2343451149e68d3b7fa40410c5892836322b1af903550024a0202185d139a94dc019679c51314a29057f70519c88e244cff7ca679c71c619777e7cfde3c1fa94b4b18c4dfc554cc56a6badab7853fbebeeeeeed621a3153b9d1e6d85283e1191911112525252fc8804de893bb1b0d8cfde9eacb5d65eb9e10b36a65ee1082432c4144f66cd8dff2db04c0423cb0d6c8c0b0085109a2e0686fc032178b044a450ba210f41ca383f185f7da88d3998d5ea3f95923f6c2e865db118c617958a80b7b8e70e02dde2c08f334736e46e6a8b33228027a026af33994c26a634d57de8f2a6706853d8ea79a6af9ff77dd9a7e28d0d48bdd57e6202b5acb910c2e2d2298062976591abcef20c87fa5903ea67cfdd5393d775b7a7936d7d4d9f7d3af5bd6f077f34b57dfd62aa3061187632795df644da1053d66ea786825fa0cf7d8d035ed1ef233165ada99d5861fb3b2c0b28846effe9e35bc3b81af7a6af2f0efd5a37ed3b7d3b893736f00cfd5a2dd28671b4629f71f7800dec303086c86261bc2e9f5ca6164443b76a41a4830af6cb5732f86d27fdc47e7fd84e345ab95aebf61bcae47596cbdef32a8aab18cb6d73a9bd834bdfc6acebfc669f659935799dd5baae03996b34d07626af63e1b62a946ed8916b167c08b90f07735c03eec0b92ee3b0219242e79c734e1a63a435c6186394314e3a8798327ae6c419f68954c1a654c1a664f18394c54fd1c5ac40f229180e85320385fd10ef29417d8ef7e460fca68749cbf7f02d262c95dfa25a3e25a867f99478b77d7f3156d049b96dcb718a75d7526b1653c5b73d773998beebbaafb66cd8e953e2f2d5c5a236cc095233719ef7396ed2d16470d998a3ade35e3ea5db1773d49df62ddff62c1cf8821ee39afaf46d5f3f31a256c3d0bc6fcb40c9c3b6615f73936bb28f2fc7d77302a6c4e53fc737bfb1e39e3bc9814cb8f4d594a05efbea133ef6994de3bc260c5dbe99f76db5c7e338cf0a29375cc1731a53b0b134321c5706e7364f6c4e27938c9cc9f4398e7d31566cdd59f04d5a3d9db24ec7f461ef9de9abb08f61d8c9eb38fbf1c699be9823aeb3ddaad3b1e0fb8abee9937182edc73a13184364b1ef03a30949973b1dcbb96029188feb3afb58156650b9db630c30c308bce2cbbcc23670e52b2a835fef39ef543b1d6cabdc6f1e675b4e5ec765590b4b96711cd7751cc7b170a7ced6acd3c1b6ba612c9c8c971343eeda8f4d9ce94d2693f53acef4d99b6c4b8be94d26d3f7a74c29ce04a5c80d5fb0f1da46105290c1b8e78ef33c93e7b1f6dbc641b25a6b9d917d1564fb1d7cb12ccbb21cbaaf5fe5beac8abb9d2a1773c45bf65996615ba66926afe3b28f6f57511be792bd4c977d1f184b53b85bc7b9f72edad73a19a88028aced6490dd8e1a57fb0d65b32ccb32d7be2fd6f1a871356fdbb68cb5d6b46e190f45bf253bc2f68736190bd745298274b7c7be3b1d0a7861e3e528458e2eb681385c773bb4cfbe3a4b039bbb2867315f16b65bf780ec3517ee85d3b0e73eeceb677d51a76f397d0fdfb2bf35d7b13c0b68136728fdd3a7c367e85b1ebaf4412376455375aac65571e5868c455f231a6070350a18cb280465e62d7aa68ef33c93e739cdb26c7a5763aaa8314719f62d6d1f57bffa83c53e94973218436469f604d7e41afa9bacdf12cdb4ecb32fc68aad5e1106958b7da00f36445dfaa84b5fe3b84aa474c3159a316cfb42cfebb8e6eabe6915a3dd10a060e5cb2138660adb5328dd7005bbe960524e1d8c8bb1020145d8bea96ef96ddde1cc2a9d5162da469ff6a51e63ab66ec1da965aa1a63cf3927d6145cd28efac470f11dd817be1189978fc448ba31baf4a48017965e3e12a38a2b7f7610f02106d29c11f0218611cf30ede88523b8118499d3376f89cd85f531c1f6e523268c2e05bcb0d8e52326a6b8d89d208cb352bee241041b59a708ca391dc3689078390c9bf3a38c11e3b155aeeac86e8e3e064efa746afd7db58ec7cb6d300cc1b66dd2e39a71b0773a926bda0c2ec61a2386450cfbe86f9182a0f7d65d12b6c992f94a4e5e1a33cebd56cedfadafbad99979be8c326a5dc7a3c6ad601882fb80e9dd8e9e22ddc9e0f2c32e5f71822b7775f90a138c7137eddd43fefaeeec72e732977dfc541ccda673fde8d72fdeee7670193708d741bfdad7777b94b338e6206c940bd21bcb4e062ea3d62f62d659d62d13eb731594b57ecc359e6d9d83313db0fc1b97824969dac71715f6757fce572c51180e0ea2381e47b0533e81763a8e753a7eb2dd0ef9f3a9d3a691cefa1b570c9b5877b7e08521f0c762882ca394e04191d795d7cb9f4bbd90dcf8302996cf161f07e70ad20d39999249574a299feb2ff8e3e1850de57b648ec1f287f2f6adcf3a1b5f9631983d137f31318c524c62a818a34cc293255588179111d2f3ccca06270b97cfcf114e020a12fa2e36e6f921cc0de598e3631fd1fcfc6bf7185f3edb70ef303697d269689f52c8f4789d439e16d4eadd3db894d2a806aea1b15971b632e7853b1106eeee1d6394724e1486b2be42655c56b16da37393d1b7ded8f48454b77b9c1eb09ce564f3dc40b77777777777ecee6e54cad686d9d117e5ab1b0eb90d528952ba7b6cf724b6cdbd31be89c0c6cc298f314a0ea5432dc5b0aff6e7c357ccdbb6755ded3caf4da6cf9e4e2716aea50525dbc5c5856b1a9d8ebbbb6b40e9babcbcbca05e5a5e5e5e5e585e4ed6e475dccbcba6bd64157b7979a1f345c6176f00d42a16c57944a5ac508cab35cb7a685aa7c3715cc7793ad69a4ea793773a9d4ea729a39f9a6bd022bd8028d8f8dd2d04d5a88e1c8de0aa579f714e9f5d85d8304ba1158d8ccc8a46862d8aa3184631cc562d7a67436c9bc7185b2e8041eed9d30b792ed032ca29039b55e524573927a52bb82cd7aa5339c3688d2c60c932301ea7cf397b72e685256862b3ee517e1387d28e8776a20ca026a8444d1765410a159a110800000005f314002020100c87c462b1582c0e2451770f14800c7c9644764e9ec9a35912e4300a21620c2084184000016300466868e20008d1fa5ed27a2b8fc638d2ffbb97ae90893ed302ad3759b90b10ad5797f82aedc1c166356a6725cfe703151313d3f87ddc38e3d4e22fafb76fff40780e4bf73bb886f6d83cd046caf76aa29f109ef4e6d6eea6ec0d344015cd9b9802e6c227cc59ba26d86d846a06dbad13b728bf2975d1ed48956cc9a4d5e54ff747bff643b9014e9c1c44da6a2003dba449b7c070f7bfc90f63222cfa2f9573349119d69d116d38a037ffbfb9ad72aaef85ef11ebabbdd803b526ac2a41fd3ede6cbc1309301b18b349095252534adeba47c71b3d62d46240175e81997c78b8cd6ac09424493ab24e878b230702b30971b9e5b580a7fd1563278ce4afb349efadab9363c8cb5be8fd12146213da09ba66fb786b0da2249f9397ac485f0a0454bb6f367fe40a90b66ee7bb8cae4a99a931244e8a24b365640ae6cec325579d0f762bf38b554d36ee9a659648d7262c07d47a74f951d89e3701005090dbc8afe3274ff7c79f761218486d1eb3d9ce2cebee387edce15ea982eecee610113603bbe302ca830419d8b65a2cc81860dd73c0a59acb5130cdef26fc9701b4ea16233c6f44b995ca7929c08e700c3f371cbf76cb5685b636dccdcd3b050b4a11e7239b7cdb11d1140a86695c2db26fa478a91bb6813949350e145cf58373e6afff9a413801ac73d1df4d58f201107276d8eb9a893918865bb11a2ae8a6325ee25a1473bf86189c69d00861202c480b448f0fc728b9ec6a29ddcbb817347fb0b2d7c9b2dc0865708cb90ab16faf7029c91339960c12440500e56c3719b3ae180e9c9702b6156b317e532c4f64dea74e55e6a0f4dfe21a4de64fd7c5f0fcb89d30c67a23a14375579a44ab3335450aa61e9cb7aed2e456f403ad93e18749cef53f2c6681c4262a3d7fac04de1ac31e0c6268dd8e2cd8fdc8df42952b4b7bbdc276eaf33a65348f440b6eb7b66d5a5b68b1aab1212e9f44a88027a2cd516f6cf1835daf6711d89a23c9171f06b685d07217760597cba942ee5318f1ea650ae078b1c860acaa2081e2f75c555c3d2dd36d5f3a9ddb9bf787de7f751446abf441962954ec2d49ad013bb661a495f4dbe300759744ee56440891af60367abc31f591bde836089e4080b4d1a662884f9269062e73ae6090064a85be5e89687680a73330dafc891345f3c0ef85646de8581858acfb9205d13e5787e751d5556199914a4e3beb885a156d273b397eaa42467f8d66578742bf6ca0c71e307c04b2114bf92f3a24f06d2b90c56e3630f5e3dc5839e30c12f1520b895695a493a48549ba09ecb38ae85c7c2c2e9b619f23f4081d128f5b80030fbebe7168c060fb5469a0a94175f85149bc1e06540d3c21ab8840177c06c86d9da65252e2a3fbf90397ddc29d717f8f2402d35496dd2c9cc0954e970e26dd836789c8ae5d8e6858418166375bd35ff412dfc9901e56aeaf0c71d9869b088a55c41528a16c0651d70ffb63520ea98ebfff324a42d6757bf4933cafe964152c64243b23f7dfa4d7eca95c41478a5c8da292c76a56af6d0432bd7c9f9eda015fe299d46a1b3b41e4623ee8130f724c7b6f24ae4f3c2a6e6c84f0b7cb01d54d073ee57862754e0f75f533fefcafe822db010683453c41572882586a37a7d17887f12e0afa7af5e94bd96b54c83f0d19eef8e9e5e239c3889bff0cdd905b1925d081d7c044f8c0c307ba776929e2012850f8a50c91d0210a736ed3101956a699cbfd57817ab158d84250481095d66ccad29bf2845c6c6589586bdb6bb0c864760ea2668f4c02b27bb5147562d6f6ad981376204371536a85a28a9e005cb7c98e0d079d2239a9445c20f220e10f048a15bafd2cca044cd4a76c1844189951a36a35a9ffc287a889f6f1565fa5fc4246f77c1ea10a1b2fc950008e1eb68750235ac76b82030dfc2a8439c68d75cb3f240b22d137b28e9586cd03e01de90d1db5879df7ed58834832af761eadd5409eeff4fdfa5657522238726db637a127ffcce4d36778157955bf5212f3403d73c4423eefba428e142c5eceab3e1de35f4c8f6a3485615a04ce25924d5995f63ea4a3e564f0cf49a6e2a56d4de19976cec68ac451cd685bc50c2db66870747a5104dd190b1896ee22a486c2600f7f0b18d1c9b489dcdd5b987de2477444508b048cf4291f6526ad8e1def12e9861851b5b1ec5eb980f25dd5c74801df0cb54b86d1cf45dc82584c3f03d210c858e040a2cd7d17d47fc161d4f0b7bb6a913f6291d1bf8c1247d2225717108c1ea6f841f93820c94d5743de753c421fbb1e228a57e2a214e896132e2216e48ab881d6b4880963a6ce5a3f82a6b312ef8f7972aac32c411f48e601ad164b021df94a3df5a70b1d82d9b5c932f3db30791ea10729f51ad8fa6c0d834f1c758395183a7fa9ed5d4ffe0cda55647e8ad304e4cb1a7bd231661dd4da68c97b6e106947b9b80a101d13d7465e29997c8dcbdbe9e5d1b619ad7562b523d9facadc349b4cf50165a29326b768b635abfd280c421cb410ffca8b908029f7e92c56b529898058f8c210cfabb6f53b85ae7d8ec49ba6d244ad3c32d94cbd3ee7b4c1f13d198adb2e378b0c0ff4dddd8518e2867484bf05d1267c039b8916782a150843352cc2bd9ac50dd6ae8a2ee314038739049348669f27280140e51d8c0fde26eff54f2fb7c9ebcf0e368792473f94fc33052dc2690870fea17f526cd6ce6973a489efa88a0dcc4bad1bf7bf500c2d922e19c05ad8251d67485f713219d76887e55568d826254a2a3a5e7ec9d094896bce2638c1f9b7b6ed8b445e81ab51c8de447a2ab54ccc9b95bd9820ca8e57d3c89c0a13b56f3f1eaf6324218018fbea6eff082c580036cc99941abcfbd189baaaab5b51364be01b3cb3b28f97a69ddf003603126c81c6f60298eadf97a2ed6d4ebdead6a9b1f4ba521293acd1712e91b7420707efdf3ac5526ad05588607f3abaa457125970cbfc4649a3b2460e5c7a51dddaf85503ae96af7dbcf501a7da871d0736eb513b29d9cf873dd13542c26709255b50b3bd24848a2c217ec980c4201bd985bcd6cc640993f07b74b12c5788fc1e9598e680e16ac74e08ee500b11188574aee1255e171c4523ba39035892eb23b08b0d583c99d30e751354c64fb13ff0de5431d65ad68f68cc8a69bb4e8936e49ce2d5c517a8190f2e15a74e033da2a3eba77b6e8fa74334e44c4fe08fb80d311b0c1d2c965ded21eb1e0bef7c4ad4f714cf759ef7684baf6a44d20eb09d9a8dc6fae4642426479e26ad79abd3164500a668ad2e3cb575f47b30b31fb6bf5c9602f568e5cba3479cc852e0e4a91ee07394b326175a865080cafd30d554c63509f832cef5b80733ecb22c32d0e0c6fd5021f6a1f1a31d2d805d403bd04cf3a0a4a09ba8d786fb73816f8a02d83e7ef36b603a88f129d8ca9892f9926d1918d0bd09d3a714ae8e6576724a51dc82737c679d7d5b670dfa1e6d92eacedf23e4781460acfc28c953a24193399e54c8c8b47c687451f1af64521ef4aa040cce05c718b2aac7d4c0637f84e839dddc731cde7f65ebf5037d182ea4598d59d9caf90f2b5050644d16b8333c8aacf097457055040df425c263025c40a9eeb871dfac1e745eeca95d06bdebaf932b1969c72da32a28cdf8faec25814fe7b28935e3e64b4e21d1c75997c00e4ea6676c5a6e1c3b90a1b2c248273179dc49548af1e84c27353e34c4007894d2679261aa879ab7d2b44906f7dd63cca41280497a07eeb766bc4073b6854f4d5a76c7932e70b39a3c5d5f8ffe0b2a534b2b9bb135a5b57a1673c3d50be11a80710c8cfdc1c9f15f40d92cf6537e41a745583e1429269be0b4ef64fdc090a732de80943cfb7a585459ac0945208e0a87688306ff347a49cdd0266f4b63c0c4ac93b1502407febcfcb333e564869e2c23ea65dc2b02ba5768f02f9157e26f3323acac30c118a0c9aa8d56dfa32694c9b7f9a737848d804ba8cf7289e2302c7485447eb3aa6c98198f95a0f98ee8f76fd2a354be5563950c84d627077887aa03ee1836284b92f1f00c719631e80ef9a2d3b19708816144d673f4d18418e52950f51029e17b6384df088da6a228906a8c99e6f6bf3a5d0c8f8707d78efa73bd1e086d7ddb5a4525f4f9e44d97b67224c455d1a4f3af21797a4a251c628040abc42dfef085deb1ecb319e5bca96396c6f7f56cebb9e8861451b05c2eb9ea4c98c356da3ff924d6c9dc7cc73f8f86b6abf39abe4a506164b0836384987fab00c7f8a13aded2aa3b03feed8c90ab9fc73327d28927d2042b2b57a4d3960b1e06f5dab5ea11a172c556ed1aff91472f76fdef8573293b908119936ee0f4dc7506d7847fd160e3999d0d876215b1701327e7f5b64d7785327fcfc0687415fa7b2d0f9861b048920fc6374dee075c54c9320da0497c9e4d8fecfbae6b81ff63484048e3b5d14e56c241b51896990e69d3e18696c726d1378a8163ebba548ae96211f74fd9756c7ec654ea29969559cd3279392803f78bc5ca5f468e9793f29a4782ec5857154a9141a99c3a8a7295032943857f5261beef51ae5b2ae264d7b3c175b571fdd4b900722173144eb152ae25aafefd0764b786c12a7d883a2bc7338c878473ead28d0d2c014ad9ce84ec0df00b4051aad990a17495fa436d200b7540554a42c43ee0a3bf835583b0248e6005b9c578ea1a9d8a302980626b955f625aacfb0995ea62aca06246552cabbdd20a79f206bbe8986b1c15a00fefeaa66471bfbf3e4c238b063a0c3027bc284c787321cb3f4ff37ff5d4b85d9c977a5524a1c77067f09ed17613baa522c2dfdbc7c44692a96022372302f80ede1c1d9c932ef63c772925d9fada73b2f5121e440f7ff00bf4602a0f1c4bce60d15f30fdfbc13e26d7f5bd8310db4dbd04dfa01e20513c733875e15bedf25f2a1128b37b57c06e0a40ba535d06735dd233afc331e51ecdcd5e975d86eb6878877be8e6041236b9595cf92203e1410e0dfa395857a84cb9ba9815e93bd618e61cfd85519aa947ceecff86a512893be05f5d4027862ea14b155a902e56544a981c96870e531261c1ab6d3f82b3f2b1ab15412c1a1fada9d75ec884eea46b707ae99a31e0d81fd63ce80752b7ca101616a021421d093e0f6145844fb10c57f07ca78266bc734414d74d5b9d3d3a94c56259e2349984e2f60563826131b66562ebe383123739f5b5b7573ddc8e00c484b5a9e64817df2b5dd4bc6603ac0cdefa67d70de99961122895d4ebe38e314e54ea7954907c5643501a8615bc5a13734038c20fdd13b9f3d7b955299c36cd883ecd6fc3073d5bc55f31e180bbd14c327d2af602726890ad0aa41c7fcd2216f45d646c936cd98506b103b68d36cee3b5d325c0a648b2341f047614685f810c8de8aadf5108f793f195692d523bcf7908813450fe295036105ae3a6387804a07293f9fc5c096e1812580d12508813fcbf0395bc249661bc04407e98934bd5c34e65155519fcbc6eebc954aab0d3866291d7dac1f2ed174a76180201896d7cb625916791284115684a8e13b7c953d595bf47bbd584424459bf4da7f71508165c6292750f370d42303b3712c68024c4965958981cda38428c6db083f418ba7b873894b235717cda5693946a078b988d2ac935ea3d0d7e3193b57f9cb3a348b7e957a0f57e0f8fbb33e0f0ce353d8412e6cedcc92908a601183a61ecdc1dd638bd73431548bf7bdc0cec46c501e652119f66136425a0aa85417faf69d22b8ba77fc1516530fc9ca1f50fa4e21af0680c284c3d6c3a3806e77431d75dd8f507bad1f5df12d88062389c4f76e2323f78ce9e5596cbf121b20c0e9500086383c26579a212148489d5347332bdfc2d0ef1729024e6540824305cda365960863b5687fd31050ef8ad36457d88fe5eb3e86e22afa1b8d8e498e0876d783b092af02c71025fa41b11e085e9a2393f8770b560642fc5b7e3cba2641cc47162589057ec6ddf90edd51403983d4b7269f96c63c686e06d72a680b01262b7c32cbc020bbf6623d03424f4ff4ae6212c350b5b8e27a3dc11a86a38fb763b1e263d9d011962177364c8357cc87da9c8c9d9ed1ac3bab14c87909a0eb5a30ccc737e0ee60e2eb00d056ed82efcdf412dbd09c6ee97d05fe10623c414fe81de116c8982df8ee64139bf5567bf74936dfedd3d6cb9b2676baf85422a80c2fcc74918299eb8494e9caf378830199d9205470f9928026af22d158539053a5b1a2056585a6b6913d5cb7991214686bd345aca0e50ae58af58494d0e5c1a8ff472c5521ef733704630bab79c59dc1aad791508ef94261b3a269abdee5711b67bb4637f9812d91346521b300d406746919e39045d9e33aa19bc1042fcf902babc9aecb180be264f61e23c6d2be164310bd3017b740ce38b1e4aac8a1cc97936621541aff8d3769d94d17394997065263bbfa624c0f871fd0077d213d9718898d2697220553023db3432718b502b8ce7f16408ee83ac6c582809dd5f45e61f7848ac82d93e9d7dea0d59dec22a6ca086b751e16e10e095eb8a5383fd5ce639c5899d0e9c950d212f1423d228794b62e0e5d89e963ffacf71c49c0bc2d66281dadc3290ae5ba481a72d61120dae8a562c6f0648fd8906982269da174d0df5f5c14340ec399b29986fcd36a266304db3178815aa82b73d8d0fbe802862c808c33fcfa0c9c032c2b890ce1fbcab379d2e35661df2902e01227346354f56740d1acd1b59ae3fdbb8b92eefbab1ca1daa38c7e646d7b5bfbf6d97d2a7b6934637dbd58a036f3770c03b439fce635168c0facd0322b0270c066d379557d75ddb70e807eacd6d9e2bdd6bf1eeafd49b270025175ed773e0bbb7e4c7e0e23b921170ed646470573b732251bf5ee0b873453f2192352250a4cdcc3b4eff72ce2bff6c4f0289c0e2e928fc1c211a7b92960bf7e65ac975d0cf8c1927c162756e56e21429423984c30413176bf06d24638306450aaf797f0852542465423a23cd8e8f3dd4719de7d35ba408932e8735431462fc99f8dd898548f1f3940cd07fa51c04c72301e7905f51454a11b5a01b9239faa8d3f2e6771a228a5afe5fb6a1a785d8e047935031c8e6650d4b08127d441040443c7f5e8509a76664840a6bb8977a4cbd7401558cad225b9d94f41c2c429d098b4ed8bad1579fbd807d6e8249ac498611c50dfce42a58e053db622e5f0d330bf66f39fa53e233b6f26e603ddedeb5bd2c999ef038af16ae98ea59fdbbe8c7a2f693409f1d45b0932c66da014b31a3b61e86545294aebe0bbf5de740fda3bbba9cd99a1f377913e5846a511c01723214e2b72840b22c69f961ae3b62c0e07228511cd068328fe5ece8d3e933f6a35b2d24f8112808fccfaa34686ce1aa591044849bd2358f01e624f5c75cf6e7b6da3d718e18f5cbd167985442001b75aa2f3456db4b0f1f99d4a36f59be204d81e005186c4beddd84e5771a45bd8e78140c51dab28d429867338b03997562d841e8c319cd71a274609dbd3f30cc8ae9908978f378ed81b9094bf22b1cc5832f29a3d5df94413c40dbc6fbb7d96444aa313d0cfa88f7c24eea8dfe0bcc0c88b14f4836ceaa8cb4c496d85b161dd99a547bc8c35373d899acbdcda6a4230d5ffb937d291fc7ac8f84f199643fd6a980e39ea039309062430f9daaafc4133d0f9ec59bafb25c25e8f82124817ddea5d00258d400738f40fed175cdee02c79de6d1444177b671f7759808dc19989e19dba955ba7c9654143b53be414c4a00b8c8efbb8550b08b8356c4968c692617ba4761d3426c367021e7a25a24d618d9e674d47e83c7b62b8c510f075821a6f0e49825a430e05ff778218a0e28b65c2a900a63d4cfab49a5fe4e12f06e13b53aab8aeca2423c007e52034cfbeaf8d300e1058e814f5265e5884cb545337d110840f24274ca710e837e38dcdd701954d243b38a728a2509e6d63019d6438fea5ef56bae34181d706778cf8fad0ff6fbbf19f24fa8d4be3941275a025ea582b6f89e18a3b856c153113bc94ee955bfde81b097019a6ffd8a52dc28cf3b45f431106b6d7305e0fc69ac9c30194c48074536cb2e08030e5d4d407c9364d904d25716147505340d5e7ee9524ad8c3f4955ac65184fe71bbc8d1f9aa2d2e407273dd8561ccd7547bc000be131a2b8ac2801ea83481e0136d8a7db006951fcc462e7e691707f98eb7410138356d249772c8f482d6603ce0e2d68c6592d613333470a79c3823f9bb908af5ea7acdd99bd43446f6abdda97cc14f496ccadb81593108f868896c9ec6ec852cea45de2b73a06056e6e19012900d25a314844c79385d96530bb36cf1be55a6468accf5781101247b0d2f3d327c5624bbc84af6f625ce7384d8872ef900b90e74a276056c25f7e5dca563cf5c7e164b53a5185a51a8879ffe4d0eb86e1cd3a9a4777dce9c09b9eeeeb5bec712c996609537b6582e2101e73bd7259ada7ea9fc3c1487e91cb0c0af6851177c884b98d87853d3a36d2d0fbf30bd383aecd2010f04da00d7783173a156c22f685aac1f180781e6bc5b8653d66e8623655251f68013002b16c588d6a3d2d6e2ee2ec1eefd4493c1651cd5739f9c219bca45f79eb86f7827e41b392543ddd61b1880dae0ef6b0152c30d10624ad27efdd5b2e2b6ac71594c457554215e02f28368081bccb11e34f0f45004c22afdf71e4d6216a580f632e32165702436c2f0c4b7287bd0ab5466f779573078fbc0153da2c1f3ab0cb0c3bb13d1f726db1af6a35112cb9836858acde46f8847f4f88864f189fc595eb19b6747996901b937321115850168595230523dc782258aa0d0edb7b0cf013ea5884e2e14335d7dbbb8fb9e6be362c58005724144c205d1db8ba0f9ff0f422102ffc5d2f0e30d61e26f8d370b1ce296bd97732e61a04a87ce60639830da88336475145a84ebb7d44999d71a2e54798808a8a0f2dbcef5e77ebe5768a256739b226f5dcce89d3bbdc850645dfabc09bc94fc064f4daa659dfd033bea29cfb54ef6c605d2135c42ca7b91941ad5cd10445dd5ff9828e7bb376b9f67c49255b1215e9a2c74b5d4e241f13e9210d9fcd60733f9d8f5491274c87756d580cb28be86efb0ecb3db8d386196c371998339ca39bea9398f0eae8c5c14bc60624ba1110949949fd82c3a65681c5e44bf4ebe92ad2e01ebff8e9da3091e5cab0a777a1673ca69ccb8c0d63caa157b30a097fe0d7cdbcfa30befccaf2dbd4917cf431d0950ebe294e449624cb34bfdb55ff891cc450beca1b41cb544daf0b70605b1353c0196fe7d8a6c630cadc4f91c6c2bdbe2962d21e9895117b5bf90e3d6eee1d329fe0aa207cb04e354f86b32d806610e0e6d6b95aeaf314bd914503c356598634f4b604e408411c2eaeab087dac4085f6ce39374a7962726ca718680109ab302b52b6fb8eeb1cf90c5c7c6e3863909906ff8cbdf4b3218480f945f2e5261bc8d94509802fb1d8d3471ee3d8037d104f1a8d97050252e2e032c547185045087345b95e40d2683928d9f34940177258b0b26feb136589515233c9356501ae420ccdd01a25321822d0cc31d4bda76c3fc5692016e752f947037d18cd4eeba6dcf4f698eee3898e7d19faa2d740be133c3bceb3ef351b74270fb071988ce3b927702d433fae076f2083fc7c80bd90a5b8bbed18081dd1102bbd8654c3acccaef12d01d5e96d909e804edcdf4713765eb0329bb8a76c0316b84c310872588a141843d23f17c9a58e06c2886d0a3b001ae884a775931e89d801ee940006556d903ec4295c43faff55802a4f0024b296e9359a178f31600d13c9e7d99e83bf8cb2d90deca515b052500e2d1bdcba49b59ab8ee2154bf24e8e8325912b1e5b8b746672b451151005db9a3f0be8b2e2043f03886ad2f0acc2270339b381d09b1160e0e9cd2db81b3b5e89b196d2bbcbccd33f7a5ec6d6cacce67ac1542e063011a3a6c0392715050b855ff1325eb3d781d2f3fa0f0f24cb45d55779c225feca8523a6b983ce9263816efb6a38b6a5b1474c87aa63dc3cf68f7a2b3feb66a869d73f338fe1e15c64ea5c3ccea8d5fab2ec0475d74f6eb11c536d117db918cc83933b959147158ec1722e45a11003f4d1c102913778ba8fc6d2cab30efaef974f5aa6755bd8c5f15237721b199845f0d008d944adf77ffe6b6759c3179a02a10a8e0212a43707bb7125ae991fbf5a4f3ddb42d60920639194deb16835c2c628a0df6d18c070d30a1df8e0f27fa4d7a7380a205a7e59f19d02a23a2bd04a11594383899d43799d04e278fc9e106eff71766ab4564a24b0ddd5b83b061d1e64c448df719964623456ad5560dfb528dc91309a20e152c2162cd107120a718e8a1a2b8899a6b352d6bfaa7a2b6aecb6a1a710f3b2a883c96d5c9cb8f36337b94bca6f617d1911fd900d46dd16f347572b462be6c75f5765253c476963f7058a17e7ea40bc241b733a04b879cca48655b4cd4d2dd24d314f6777d568b8e29d01838d280003d9de501d7b8a5ec904058e37ed8b89b953ed0a8e17e5577d46eb81e544980ee06202dc786475515f1aebf199b2fc9b7b1a820b48de54684f56ddb82f9ea9f45dbdee24fb83d38662d1937e32d6e2803ed5274cc140737e78aa0c5b92ae73ae29c7502ae2ffc8dc17f819c08c0a21f115eca9db51d7c5445be91cf82b5fc8c78dd86f20db8a4164df6d1a62360760c4f10cc5f5d0a45f7b09a44cfc9e8a0596271cce24893e81dbfed63c81be9acde4ca8d443626ee6fffa7a5a8740fa3157c4c353fcec758acd57930af69f9050d334dd7b48015b1933d59fea19b0646cda66fc01bcf3993ea76d9680d60028b62799d1fccc9408af49f584e533ff13cb801e0aa3e000e776a36c040e703ab65e7a9ef64c9e2fab6908d17b948cc1539ea96594f3c3e0adc5ec270661d9d36887188f11c61a0fd9a146de86a65bca264875bed3483b3064e2b2336b398d04f2bfeb5f2cc9aa4217ae9b8a438caa1ca08aa0013a531d66d16641fbd036ae2a2696fa962cce1da06af1f3999c88db6ec8810a3f8ee96e1ac5fdcf82b8de664c62a01a1f494350615034907af16b1ca703aec18d68e9cb1e943ac35cbab5f15961907055a6af86e2d69dd8bdf041daaf8d6c27abc5b327c8f37205fb1ec1310bd3e64b4bafd4aa647ec13a8bce9843a7a7ab17b1f2cc678fc6167222180a6c865ac25c2c46cb39f2e1cfce19207578aa9b7202ab9065a93652967206bbac1d60b5c6cd77be11d07bb16a6252fc4047bf901a4eb0d8f634a788cc3bd14747398aba4d6795773d7360d57745e698fb5c464d973ffef0a8cc1f3a0893f10f32b9ee85fff88e5b1382efcafc8d740e50a3a198d6547c32ab09ceeb0cfce9494ee6aa8af9f8a2971522ad0c87db880f3e4823a525669b943301b94f4d974310ccf7085de738d1496cd56bf380d63936d01ce27b92538380dd282e0b30da30675314f2f53295ca9fd1b9e5246d6c9f0a44b1c0b390031d8e70a3c3cceff2734e877e44016203206f0c490c78b5562f947a72f8deec505612629fc3525058f4b596c64db3702d05ee311bcdcc04f81451124a60e9909eec077f9be96972be98036b0a67274a0b5e3fc79c47a69050e74a0f3f91909723b33876164e4fbc14e0acb4f2fc872be08a0894c23b40cd85e58cf5f9803be09c89d6e43bfb802aa7f7ba4a1fdf0620087989896e6af562d5197aee2079ac6bac76cb71bc0d260d71fae1d44e74288c0b94911f8ebb166f4ead58404f93507c7f93e1daea61197a11e7f8426d162d6cabc786b3b46a5d58d1e0e5f7feb89209fd5cb24fb9e20c87d1480bc3197ebf72c1438001716e8dd76bfbbe216db737d24862154e3fbcbf813fd152539d885e6bd2742e1d086d05dacb30b54e2ec93eac1dbf5888c1a690345f852ad099453db4f288552c4e5e050f2e5f025b83e538b29c1fb9056d49720a5e7ee97d9e96c392f66e194af817da3f3307708eff6afa8e4a0685fbdbf62cc465f9a677f81284764b6b2995b889a0ba13ecbb2613a187a32db30ba46fb33cf024fa9c92c22230753446815fbf928dc896db26819944341b076e82412e5017e66ea83e6309782519958b6fbba8198509c167b8652dbf4b69cf6064b0c030fc3c59e1997baacb5eb47f1bb0aad45fd74ead6d2f9bd91cafc4781d1c6ffaf31906e84a88b82a8876461f2c12c7c3ff92914fcd8cc67bd958cf834f5e26aec455073c26cd4248d8d72dce47e642db621d574ee98c6d87f220cf13bdf75c708643380200a293da243ac7628a641a09ab0dd96b5bba889716d1d69f5b2583005d78692d8cf272a26eb5626d1b52409077f2706b6386748c6fb5c6612d0101b2c5219c6a47b6f539928e7878b6712d45d3ee27f0865c44a0603d4f9c9e2f37a1e483b648b1ae85071d809b2de10bec4ff2c384cfe838b424be5fca3512f96f2f3287af53417c4819a986b42e420400b81ac7c7543f2022c833b9fa789e7231c807833931b62b4b2e88d281f6f59ce12de5967ecff57605a6cb0649b17a8713c15f813ce7e39b606c5c9e02272c0b106a3dfd4c2b3c04e65afdc2b59bd81d7caf2d738143dff38140c6795909d32d6968eeaa9ab0e4c747a54d27ed1f63eff5852554c790012da563928ce197a79dde2f9c8ff914d02f14a00fabf943a620bb472dcb23b55ae3c3d6b5f3215b93849c8e1baf6cbbcb55361e55eec4ac8cf8a760b95abdc285d07045fc7d58c3cdf20da43ff8fa8843d34cccf66a4322aa1b9692d2f0bf3239a19e14213f5d9623dd6f22f567af169a6cd3758d66bdbbf4199f654d754903af63eb556699f733b13948c013f117019b264c4c82935f65d89c7adc919b50fb1151fa1edc8e96a7d64acbafa60f890e9f6703f4161f3455819d09180ef920643e551222b853954f9e6d34ea61ecd10c33f7ba1f3edd6256c978b293027b203f838f3f85e27ee3f3d74971f6b186b149aa7be85297d967f79808456dfa4fdb1d646e8fdacd3f1289269cb0b3d0b84f17e0ec908ca9c16fbfa4a436895c51c5f42fdeb1e2b8487cfd56dbc20605b4fbceccbd76b2f8d34b184b1957e9be651ba2a2ac18b48a508955b5228a26886d40d4dddadabc7de8cd401db34e94a3fdab582defc265d47f12355a4996deaab024007c41deecf38dfd2afb96447fabc9860f43b0cdd3606bb4346c8f9ba77f7ee4ad7c83ba8c6457d6ef59aa5502680fbdf194c5d287bf2d68eea0c861657b5dcfe5e43d07d176402d83b22788b91fcd0342cdb772ee8376289eb88ee9e6b2228df668970ea6eace8ae02b8966bb69f35d1858b0a118d035a1d060a8866202288c6fcd3e5a70526eabc9973ad396485411433930ae546b86b903174beef2deb5193fe7386d77c786c2eeba2b8fcf951bfceb077fcd769da0c1958c5cc257b1a0adc9c6268c31819e67dd5213db1adac95842851ebce4e84e802800e600d0ecda9262d70fa5005c4c028ade25a90d9f1c78f62326b548ebfb4fa6e73d57cf72f6b9495ffefbb491d1c26e1060e0cb81316012080be9c80ea18dbcf19036bab795af6a3673f6c56dc3058f8e6833e0019cc53ead8b2d12b0ad2f8b8c02e7c21c1dace3c0e83b23d96014d9f358701c03de9ccbfd14ae0977e6ba437e1f4966470894cc1b886ddbd9649c683c816bf06915c8406c2e3ecd58e5f80741bdf2aa9cf136708894787f97b7470417551f3b481ece58eae894e0ba607c997d9e62d87f307d23551413a12dcb08147f2637626e2f997ffb182e0504ce19b0735372a376d05fb116b2df0d5a56963783358d6bdc7fab0f866d4778b7aeb04fcaa4ce32ba79eb55be9a98b72e46d1219b8fbffeab72a4735c917201f8a5a5557ac944471e7c6275d7a98ce06721207fb8baa8fa0d19841f20ba6bab73c8a9309c6daafcf21c5219f3eb0fb09fbf85383a1e04d6165a0efe180bb0082981fe0ed9c85609834294e3f5ec5542035441429fe5a3f05d74212c56ee52d8b59bc295ab9daedadcb219243457fe149b3a9d24a63a217cb3b49244ef6e860dc0e8ce51afc30e391ac318f0c44121372915890f9eb95a2b61b35f4f1e6d31b361c2b8379902fea6fc9781120ef00174514f9d346379a0fc0bec425cc11600a28b998ed2e78dd64749294846d7050a957432d8d2f7de763f073a2b92e3124cc63872fdebe9320c7befdfcb4a79363ece5e9c4af96bc38850436b0e5bb6d8b46becf77a2422292777028841404542883dca10a31aead536d05701f5d369b3d64464e3a682824a3d5344d9d55ce0198447725afbb01189edf29ef639fb97e35920dabb4b2d52f0d46bcb796bad4f9f6c209a6ff759a55dca9f7d147c7f14eb506b7011bae8a7fb1b706b2f81ad6268a42841544889e5bc37b5dee5770d5eb5a72471b8414b1f3bd7c57f9b2bd398b85d26eb393d469dadfe03e026d4e31ffffdc958020c7143a0b39c9ac2007a8743127167c15a3752d93e630e6f1655167b8a20177498138c8dd4e9e56fdb04f83eff802fc2f7954f88808f72331ed79f129db4a6dde6529073ccf913697dffcbd74815ccf346afbbac0f459779154969eed3af4ec5d301d97414db2bb1b7602f73fb906adba95ca2992121a899fec41b9e3d51d75a65713165c3cd8f1ad8184fd3df845b5818b33dd0470b04a5d7b7c815164a96bf021d857c89b6bcc9bf508cc49604be44a13981ea676974e2f62ebcf582479a286c480383704861bde43a014bc5d1ee3f1159262f604a3654e919ff22ef0f22328cda83f5e136550a293c3054982e079336174c7ecfc26cd4d7b148cf6a143583d69a43e6d245f40aa415c38e7133c77ff68c6890663aff5d9660f0cec14fd55f59e98aede691a1b55a71009ea1d7de6d1c411b9a0578d20a64cc3db6d41fce43d3eb70c179da877040fcad72f663305edc46cb5db9df6c8e297531b3d36b4719450b6dcc66ba3ec8666b5960757be34babc59dffedd38d2186cfa610854999d56801e38fecf17e60366677c1a77293da149650ab622e79674e7f9593f52ec4fe08bf0a6c4776ad9a70d873e80bf7e89674d9a3e05c6dd731023425e51b78085d36a28f84127e0838e3e4b03262e0f3d398f4cb0f7c2eaefabc2681705f57b17006bc58772a2c844d788eac6514c56391aa04eef6b4968a7ff9ba3db543e5907c331e1488422c6a2a526fb74fc3b8b8dffcb97a6a676b0c523b39bc0da5e3a4712ea2e56509c3b1e404e502c6f9ed6458ea0386f9ed6dd1574cbcdb3f5c911b4e59ac7bacb1514e7cd83f5d411342b3f8fd62b67d0558e79aebb1c4171de3c59171d41b1fc3cadbb1c15c45b00e8b041813ee293f4253aba29e5386c462bef731e437d5076e285076775f76d978a3f9499cc9c4a58863ac0befa3f30f34ead59ab7eed7421ea1aae5bdc968cb074acb24c9196999eaae5d7e1739fce752493705c2149e475787b2b80cda2ade80fcf7ab5593a2a4595b43afb667860bca9b36587f4dcb329180ed8b0b05c56b510384385e44f6bb26e3f890bba8f8ec9f8f5cf7851b2b8ab1ccc52572ec0db215beac6ceae3e187c9e5c0b6dd356d06ed7b5324a8188c50249e98029e34c30951703b311c1091f662e56af8f28853ae9a781024a8b4234eedca5bf090edce3d5e39fb677cb6b9ec331f76bc74bf897d494195ef1035cb8675c857ed92b7e4c541cc240bece6a55ac3fe82d05ce2b45a4a66ecedd0427144a256541a958bacb4c19274da5871ec8a37bc82c611b2a15bc008107a02d04300d22bfc2a167a56aef588af4ff9ebdb84fbfa9a89526604dc6282c5c6ba3d38a54fe75d7871a63acc926740cf7ab83110b1e587fa91ffce0592fccac2ec5e24fa016544249c63b81864ba511b62b090a63bc027ca030cbfe46e8e795534b2ff721bef65b22eae907c5359e132911a6868c5b32fa652b89e1c5c153a1618688abf2b18080fa3a70cf91fc76fa1f9183ac0e00f3924a35b84598e2c89205410b53d7401601a0c87969c954225bce0cca3d1cd097a3c377849448d67cd7af5ce58706c07338250055c21111ed18bdce8aa0565cc847042ef89d6e0d8006c52ffe7504284188e2e737a374d4a3cfcb01b430782d26585ffc926bb02a6074f5801c13e25682f0c735541e6fe2037925bada66ed6a9838be550ffbb7a52cb0f7f9fc0fb8e8b2f1641784a4fa9f949c68d09ea61b37c0d3d1bdd47343212a1caa9c64138fc99d1295a9d81d923ef80e13533d73dc8c8b61af20ed8f5088d61fd5163012c2fe4859e39f0315982a54c6e870d7166cd21cbc80ecc6369092f7dd64817b10a1bfe449d4230574e62aa7066670bfd64a7950d456085538be4095936e04e0fd263e7a4ba3946d497e02c5fd2c8e7ef786affc12ffeaee3e97d10d6e5c332dba444416df8322c6b0f36e2d9e5a3a47f9762610b35a4c9d1a205a96ab6ff9aa087dc79100a5a78ef0679ca120246651a5356311e5de0d6f244f3871181b5e596d57960beba80aa7c11097deace45ad21315afabaec8783480e998e2882b93931b9ea5123ffb9c9e69bb722d48aec7414158a0039946db309b05bf1d6ff78c52302f00b4bd5072884df1f28f07e88753b4ae26d5660e313e6a547b223b2b75ad601b7735a498570786a7387b9c9b6e78363e0d090644f392d0d94c07360d4cd1ad2ece9859f5abbf3fa37dee6736a41d3044f9b829d87abba3cbbf899f4ab72c6452dee5cdc59193f052b6c1849ebccb8a4e91f4086f41e81f18bed19845c41cfb1fccd0b951a02ef99983fc5443ac88393abfe0176678e71bc2e1e64795d63e626ca0182520f456e67036e28453c189e031a6f7feaab1954611e6847953bb3602f32c1746907003c426de8a3d0f77277287341445e4c0683484b99f821014664377b39891da65fd0849cb56b7c59a24a626eddccf56e7feb283fb33721dcf0aa87ac032f107a02a9d86cba041d1bd9717952244fdc864e8d2c79452fc7b5185c7647eb0f4ccd751a02562e0ff3da73ecc7a94dfcf94ac1111fa34dd37a6ec831c4235b7ade03de1420c9d85fc06477254beaf71064537454ac4f6a6b17a471ef74a5ded1413ea82d215391d765c83bec523ae4504284411ff8feb819d388dd3eb63f3a7e606cf343312a9ddab28a2127b1271f33a192a63fb1f267ca1e076353bfdfc33203151a06e90df346acdeb42a2b6144520e9bbb9a3f95b790b8d9d06bb8d57a848a053f2c51c44981c511f937de9caef8ad96c82d033344cec938e4f5bcca4609c68b0907ba028ca8c71bb049644e1a8ea1dfe6cb3b5b8564211d63ba58ee03466ea2b02e0550f5885b912937c88333092cba2be91588cc4e107341c64965ef40345f577aa9427baed4dd4b7490fac6e2a7b1f82a2050709263091a69141515e665015cba353a0bcb2aa903bf29d058db8f13ce473a7e938788fa9227fb302020949f4bfaf0e080a898cbc0f1c30fc40e4ee2d60cab4bc13fdf40b42810c08b3fcf2238c0c97d7622eaea82094ab6ad2439c0045f41e5c690f304e8b41648ea5f571b00b9a5d8287a79c614501d8548f281175695e1a254f6dd05eff9ea833cbaf3833d2b4c23da5256bf1508b90fdfe3b4a807de567c80f5a2fa1f9e64573591a9bfb72ced4d8df01fef759e431f1177e791b337a38124e7666666044442433d37249efe84d45b8b21f0e9444752b3873302b506c2683dc7309ab7b517da39663d64b22100c1c03f31695c7c0f8d59a9d28ea47617431490e5ff6257774c315d8ff995f4a2c1c382e7a7e5015561708220266b69269e15f915e03a6ea40c30d90ef68260578a517b12027d8851612e7b8ed7a69af4c1f6e0cde51a43e94c1dd13176f9dcbf7d0af44b4cd71dc5bb4d1fd0dbed2a6e4c968982a24320718d55a42ab134fe75daa75ee03bb65d6ddb08944a8f1425315dc11acb88b911e1b1df3701108a1dbea336a7702ccda03f01e3b185d5ca6df19f6ee46bd32123e23ecb95aa9cddddc314038df1839a166c5e3e36bbc8d096c9da3c5f975f78bc65d51f86fbeea8dcc83f0bde9c5f2c84f0fc71fe2a73bbf56f8aa83bc9d083af9827648772d9827be2eeb55937e3b09b9b4b6ae29ef74742a5f347dc239d31035c2df1e1887346e5ece3ecd12d85c9e8e9b826bb65adf7e5e063ff8af7c9fcc375f39c22ec36d18a0ca9bb0b4dcf9d84e9edfac3455d2f16bce372b4162a5423bdc4a24d5389173043d6bd3cc9ba625db90a577c7c31e07553a6b3f302decea789cbebfa5dcdb71e6cda13b4cf1b3b0d56036585fce400671a88c862a3d9072d25d2d6bac084014ab82c4c6291a98239f2496e606d7d0c8b68ea9ce37cc63d0f211f57999d0cc5d0d25b33f7bdcca14d936d2b05ddbeedd5a4333acebcc40fdbd6043c52ccc400291cdf46adfb788a849585639d4b16b2ed1bd40da35a0f139c654f845f7079cd4717d7878d8cd9b1dc4e0f022cd3e5500cb7217af823c7253a1dce0e793baa0331d303875c9b384b69ab6acfd3c6fc92efbc3ca543a38f10e736a7dc839ead06496a0d20a74209b6b6b1b8cccc7f4e2893a12c4542ccafbb0781de58d3dcd77a5d8e3339258bdb9f17ec40abe6f35944600984a61a389ce350f6c36e401032f7dd6852ea22f205675a63d79b98a9960b75f53ba6e20cd9c3e92c002ab131a5b02701ad419d982dd0e4024528b9a88f4b314b2b74ab09045b24e4738569e067076c996826a5e62e24a09fe2faf6b67720c66ac6faa597c714458750fa5c70d01c37f1bc3004a4e61859c47695eedb58668bdeaf06a87ed696ea0247cc0b793d81cff4bcb28be36987bbf13bfb89d53456ce68671de843807d76b84f63a4e5eebc565123c8f56bd1126e248ce69001564883107c868386c06c5c7566ad36b1be435301215bc14c3c46c2032f169a0217ad4c0146dd252cdb620dbe80ca271085d29b5359bc50b3748dbac0d8a70f0b2f8d386ffde6d44a1849f7a1f5320a2d48957c4f9f74ad6f8b8aff6d95d3d74d229a58970f63a10c666784d19c96310bbc44a85329b83128f83bc8c5088bfca29cac724bc987ba504268be4336ca2962cb39a0c7fdbf04d9470631b42cbf224164b5ab178518a41ff01157d3225f4126c91cf9b026d84fe1879e93869bc46b4d41ab27233209cd08185639060aafb2b9b1395374cd32b0060f70b5022c16ed79a7200a4534e15952f18f9fda49c14e32b2c9f9c324e376101da3266aa6e088f131bd61b330e304ecd6bde0f37066e8a9c543380b04ca68b26f60beb6daf12f47df503e4a7e2ba63bd356beb5a67398c7903d21692a87b14fa9a78597a47682cd41c70a907809314d6167982b0f830ac40cc93db2a6ad620a0ba84a26b2959ce067368d5eee97bf142c93e5911f9d122f19c259943fc2c3ec0fdfdea46153842664eaa98881fab7969db481cbaaf675879a96d0451b85a4a99eb2eae92ab2599b22a23942715665b2e5fb3d0bd2390e285596943f3f677555372950d446f3d865006677db170016a6db635897f97f4f0be8143e2871c7963bf9b9f90a701a3d2221e1ee825d43a1ddaeaf09d9831b6167d7deaac53046d6f17f585a970566a2b489d2b1ffc74bae9720d611733054d34ff2d5b79db66e94708b9dd7729fcc882682a3c2d02cb9e66c7d22dce356dfaa719ad10bb6bdb723377bf0491e6e41a5855b899d6ac001e6f6fb045d7b16567aa055fc30ce9f261aa9450256c72893f084e0ec5ef16177475599551e136d0329d8611400550f1a4e0f9c0e1bd648d475a0d17a881b9ebb605989ec02b569d87450d5b292525383992e0a96b1a8736329d9fe4b1b0a38f3d05bd39486caf8828648c1b6f2ccfdc8350084048faf20ce8996ebeda9ff2bc78aab9b4fc620d901427a53573c4cecf17a2aa0cf283c2ee412f95c1ce3d23404172cc60bba15dd5e6351d8c98aa1f1c31836fb10c0840251bdae1fbbecfcf5b0449e265a053e07e2a06dbde6294081e7340b81ff0672720b93813d0b1a97327a0fdc4a3927e6e79b5a70b24a590508e19050b0443ffbed23b5c8c330c1d2b813ccdc556f5e401c3b7b093f412db87e035a23cfdd2d6a449ebcb388674869ac631d47ea7e6f5d0e9eb83e4541cf01935a48b9061bcb4029d770c70112ab2729e9950c213da5a72d2c38d4418f6853b8abfeaeb37154b24646db583df93f78cec7d1cc39e7ed901807f32f0fb3faa8656abf40baf2558adc1ae4d9a22afe627d9bcd8d6f9daf0c1a2ad3e286c9a6684b0942ede9112b4deb5e7481e4e91a9746f7d5195ed735b17ef8866dfee3006f2cdbf1232d36d353d0879cf0387897e4e5f8960dc6bd4729829e260fbc3170ba0de85a7e219bb73b13bfd82673b46276893e4080a880e4611032d220232b0bf4eb208b547b4be594c442a5b7e107ded31b6a57524d92a2029d73aac45bca7dbc436d503a72bfb8a95d8ec153660ac439bb88c5c43d98000a7ca6a3d638179a14fec06c00b8f6d71ec58fbf2c54120c0946994d3c27f2fada744726ba86f76f884084c597dd9e385016ce645b073d452358c04444fd372f0ed5870ef6a2c57a2d891f4e07c916e2c3718069ff72912633befe07084b24e620424b305e6b498033422efa115a3b41d7623f694cda47d4940bbec2900c26be428587e5bb6d4ef22dd3a661f29041abdf316204d1f94b2791e7db86f4e636d0a8df9b6edfb95fbbfffce12aa479e77235d7e2b0b227fbac3bdca6c02995df92f604d648a61012c1b28763f2238cbd8c08fab05b6d67db60c57c76f017bca15169c7fb531527ab28d217b9f589b599ac4b6ff0215eff4449178a8de61eb785eb83036a64d33820b1492dfc846190dd26d35c18ca95e874db11abf47bdd8abba601de6cbf3e53e6a4af0fa35a73431721d4228744ee5dcceb1f1494727105ce1b8586f5c8fcad416547609870692ae6b1d2b4b51f8261380e0d60d779697894bbb4e98f025102304238c4b181bdf675f90dfa5f434c3b80a0f6333c534dc8ac229f5f38262994cc975c94c418a87b0edf62c03628b4352dd320a1eaac460c7e3806810af78b0ce3aca455eccded7fbac9721aa9201bb34b377991134fe81f988a40c23d4e328b59a990625c6ac42f775135a4d81908a25e75059d7ab50a0d86d0ea4baf759447e6c3595c5b628cd79d09312046245cf8bd449fef62634fa0c2ca35b9902c490cb9b2fefc672955081aa1a53d6b62ff0e47506feb120d5ecb0c1ab8e781a51721ff5f1d69ca163296024f0b38c8e681a8965113e87ca18633a11d9d0a087cfb9274333565d447b3be88e57c356d15d1678d24a29f0805ff8436f4b58ffa4bc3cb81224f2a47e9f2ad8f2c02d48f8127073e2019bd5eda414469d251ca8c081a749fb8e135241275d409845ff114ddd50667952c6e55a0f5c29cd70446adb51f3c8ff7444b92bb64f4fa9ac667a4281263a0f7471dd8959684a205fe7e84ee2c954bc0d1cd50ff0b527abb80fd5c6576cefc95366c31e37f0716992e13720a5714fa64a594541c35de5cc432e96ca68a0dc73623bda4ec223b1ad63b1efa7be2525a750d776ac01791c12046fe569e52f6d7f9c20bb281479a407791e585bbc50fd464dcb8423a29e02c371b089f06e5f7ba014469ee90d2f58cee4d3d9648bad94f9ee8599d0da3841464aadd857d3aa6a4b2c5d15b7c0dc29e6c9cfc209b2bf1204edd43299040dc9fc62bcc2e52ae958d5c6a788b44fa1652997af1d38e0bed7dd8a886740081e35502f68f30b347b6e4083b5c17b5df59ae7e0082b0ee47adb967f27ca8ceb2af73eca166c093929a5bcee4101f8e925b7fb49ae6f483fdac24a18daa3d68e48a8db41e7b750ea0f871e6071de19e088ea4d93470e53093149b00ce72a31254669aab31af5678be056a751a8c33ecfc0ceba7ca04cede82c1413db4dea2aeced26b100ff4a04e2322a30c7067e96f7b3f8c9d3edad536de9543e41b4fddf032f219df6dcc9f111c27f28efbd0831c895c2260693a8c360f2afef33a564169e9e00c53a1581b01ab42cc261f6f325da0b9175e1b206fed2d36c10c46388609315dc66c1188e1e4432a79637601e84390da4dcff0254635e2a9e30a0970338ae1f3010eb17e0795192d5d4086200898f96f2c784014346e0672af21f03cd6d48d2c5a06a79a768dd3035bd8dac1ddb56c81fd9851b530c5e824a6ec9f88c765de6cf3bc3d7d634ec077aa85058e4910c63b3d3875cd2401d08fc1e0463f972d5a511543d607e29b5561da7fb8ef84b4e9f8717a22017119c66ccfac371d81688f50e82ae37a7d28afbd1cc3416f9da7bf2637b4b81e47bfd0a25fc18f4c8a54fa4f0b33085eb6fff38a75674b4c200fb72d6cb347eebbb1f89833ae820f0e5c48f479cf0eaf981214e2cb5d44b48bc14d25363faa1c06eb47af649a71496409bf947183027d654be6faefb824898ac8ba4f757ac7ab3188880c259c324cc4b1b20c33e4e25958c2aa7c1e18057d8558909a30398088d43515f7842e1324ce5abe4329a56912e92d42002353dca10ab7f1dd181fc10db1d911d1cce88ffdb766db5512a9b9f93aa68b9a27a9728bb4b0f12f921a8ba64072e23d555fb3de396ac643db1383d64a896e5f60bacd4b182065c8d38a4bbc80adf79eaba74a23355c5caab1db3f77c7c844b39e8ffb645f648e9cb5b037c5bb021d7d5dfbefbacffff56ae2f733155a995700ffcd42da1377367949ed18611f9e32a0de44d07d8342f132d317891e17921705b9f24dd80f6b78366977a842b65c76d6d3cd5e822457d97ceaf7c3fd61a15e215b2ce381b3671826395a9584e50555a57d89a8f5f31c2e8a10d990fcc8162e6665a929df2a2dfb2a88216220559f25802a3d07ea5cf24ffd07bd048fbe25ad28639ae97a6aa7e2ec0352324b9f8e62c1885a46397280e882b96037103c5ae90de7ecb34aae3dd44e23bd55f6a2d6761871e4fbc8598ce33133256c29aa0680b0da97b8701659e6c7da1a080efb56e4134274a137994551449e53eef3d5764785ccf16c57553364f115657dbd01b7f3a0b7e38bac23fb4140928f62e7b9b0a3bd6f8d9254e25ddf0c2c5ef738e967b53be3f6a206e00da99f3cf5e6e629a151f137b3313076e8042be5a86efb4a76079e211b3e5d91974d71031ccc9484171d7df841223497239757828875310976bb3c50edd5d4983d11a866b76e70d7fbd4c4647e676c763626dd7bb7babb50d0d757a4754e2a9d83f5432104e624f09522c09bd4225be7bae373e6919391e3847a568c4786ebe8a45b459a24fb2c8fffe3871e22aec9fa7132c93ce0474a27be3c623bc6c5cda1b212861e336a618741fa7b5695c6392d8f3b31b055e2ba26150f6148fc277510ca9f5bdf6b06bc0797523d800596dadef9df853d884609a50576cf571834692c6b5cfeb75927e8f34051de247408b0cdf94a9bab84f06dde8d3a5214e9d0fe24443c53dfa6ce97b93de5cdeaf93a753716b5d01f7f538bce444685171732d7d3c2e0925d3b1ceffa6e7a5c58434d3bec230f7d27d54151dd94c8dbf9f459db5e8141acefddaec98e7b62fd8df994d4c5d18dfb4e307108353379261103e9cddce4406ea81947cfc08bf919e73eff26832b0b6bab7d1b01da36c9c18ba39504e0349f9f5b7c3483cbd63c9347e9d83323897ae615fec0fa479de8b12261ca9eebdc00fcb477f6e83492fed0d046cd8c39255a87f8f00dfba658444ef1c8334028c3677700de3dff9dc3d42bf9398de21f73b81093d14ed954535696442a5b211973b29b4bba16b3ab317128bd751a35cc700d6d5dd2719d64f0d77465939fdb57f4d39be72256aa0efc8261634e2a2d5f79a8be95875278efc300413fbdef61500cc11f945005a2e9071cab945e4dbfba8295788f95bb21c8bbe2f824a08263c1378b42fb90c6fe7b78a053cb0406b61d2e03629d65c368b893fc2af45aa3bb9a441265c81cb708abaebab86a71710fee4f0c047b9c47836f5723b92f19151badc4d9ebdada454fc03d302f709d9c651d2a27332d04f7d8c53d03054c5689f5e188a1f48f0a32492cc747f4639ff5b0c5b4050e53b25adec97a656a2dbc09d9c061cfbb13a15835225cde69721c8061d91fd1a69e57047a5a43af0406a1cf7fe266c4c7a19acfb539b08f1a2d763428175023b4b388e54c02907323015e121a738e41a0b6c0d13a8be80363542beff216f0044d18151b87d813ef042c02eca9b23909d0c376333da377283bd831a8889adae01604fb7a28298ed3ab85d0a48a1b54b54ff509c5b4fccc250129d78abade1433914df88729866ea324ff4ca206ce24f083c9e24272a78b4ccdbc19c7a5c1b14a6a6794c0195a94a6ad133da5323dbee47cfdd951eaa790943c3ee34caba4050bf5a8166ecad1abe55de3b41d9908d286d6ea13f9c52765ee87569dcdd54d31eb40276093f294e09aba61bc2580f76529dde917ac93e4d74af07a1885f9a8c101d17462d1912f419a96e51239f0892c2fdc3fd48474992fbfac008245f8baa04b55886b8bad5bde4e091747576eadca63434467984e6da970802993766644c15a120fd686e07cd6e56a69b4340f402444060d5020d2978073764c8ee1c4d422bdb69ed7760868f72831120941363bfb15cb50d830cb9d97f78264c8a1bd856b0ec6ddaecbcf0fbc6180f5ec3e1ef4d9134120f329046c0d7bb5c6c4606c5fca5131d279adec726d64a1b82b198b2acfa92c13e9c278bc969e976425f6e7f6a5d1e011794d5cb64eca95ac3041ce8a5adb862dc69ad577d9ae6f84133445c0b72d71141294dbc7a093d6f8e45c985c597c4387dc7c08b292ce07a33be816777e163872b2e5c004a8a7d34731334b809b32cc937eee016f1e4cb5645b173bec992cc7725900f14ec540deb794cb0b9933c6d3e6d3652843977838cd6d7019ed0ff96a2e640a3725eca5f0a25ebe8263dfcd96faa4d3d112da9619cd192d006b9d09b895d06823e9e851254d0194a7ce7d858feb549a4dd24123a4e106229a80cdd7a4e605e35c3531de46e9d0efa53d1d022dea9df7f4137bc337d2ef33ceb5ed1f00dd530432cd034526b6ef76d420e38010ff8ca20a916d6feacbd72d932c3f508f7f4ebe634e697f1c3476d9b67ef3d1146f68f8e66177d8fd32f2aa1949391cc99c15ec6fbc2fdeaf380cfd0f1ef07353530faaf002158467a5ac4fb02908cc64f826ebfda6e95eb643d74e6ec36f192696658790042594e482ab660541d33feb2e568e59a8a13e886c2905b5012264c2b13f397abd107c2da6fe072b3be65b617b75c323f87231a3a00523829f7381eb3f034e0a1708baa16fd1e1c825d122d664f61e8f52ad1b62cfd9cdd8d9c526eccc5b79c6d614e14f2d9380c706896b604203ebb696a885de62f9ae86a687a68148b21f308d76f429b26132c8b5e935619d1a52e8fc738a607d6408dea2f4f88e770fcb1afa2ac33321545302a4916e027101471e6aa12da4117b880a1844f3a7dd4d772d4b5a117b3774cb5281a61bad54b34cf9c0008ad393e4bdc0d9e5dd9c816ccaefeac7bc02af361cc5a46212139b4b993fccade1a067e70323d391933f2d3cf6eedcc07499c31bd4df385f4939bd815bb6f330695b902229181f95593af21023f87554c8c4d96f859bd98e1f9702b50a545b896d382a8fac4cdc7c51ec5541f364f490a202510d755f9f4130490232f4fabd35dcf2871e69913e65394c380904f551f8cc126ee7d061f419d4349fcf18ac1490fd4ac92ef5beed0ab3362e8433b60fbaa6c49d8e27b05b1912fc3e008163e87c65dc8c95df9e07863ba33f9f9580ec0cd60bda5221c68c50fd7c49df0e7a9e9d5ac7dc523f7c902385b3802ed69129875835ff3b8a439e0f7a6d88f83cee0162b3f2cebc3513ddede88788f61ade6ed3b5c40bf8ca20bfefc2d5bb7f44c4f71a8a5c85300bc8d0034050907ede276b1d63cb46297aa5bae99f5e7d4a1e2499cb1d15c9ceff9f67ad3fbe4e8c62ff26ece7bc36cb9f64df9332ec088afd0c9180b432e37769facb5f167df4a75927b8c7574602c0232c30f3ffb545d52091ebb4009590b911adc55b00bc93bd20ae759f27638e4a4e9e8e174687b5f03ab2cca7db1718764477af596126d23df09aa03607ed7aa6d490fa5f7506b448b275ed1ad3fcb7932503081a0441cf612612376377a2161c6ae6e89e6e38d9652ec536d10cc8d31efda8210ed22653597e68150eedd6765fe1e79de7dca4053357f7228ca6d613a05c3e56229802867e6355994a8c186febbbc46018b6cdab6581706536581f79669d56756fc586847b695f30a17f1d26a6105ef901c7812168f5602d3807ac7729bc2f0ed1e1b89d00cad47d92f25217f2bbda63c7ebf9552e94f717e672d95dc680507117227046024511ad29af64906a5a3147d4ed653dbd56ea15d032e68dcaae6155867592383467b4bb727f9be1f5d88b6825b3ea152ea0a6a22d67c1de216d1b50f027db57363bfb86864e8c35da4f497e0162bcb1a00e57319ff86cd7c644266bb01ebf7a8fd9787c4ff64323396f521967ef421b2c51858f16250d01938e51c7f6a1d0d944e56ee7eea509f81ecd92f874d44541e4641c45f6f62b6bc4f8f67f5d20b553f5c616b2244d6a2241af69bc4df05e131be584f3a265cda93921339aca3850799ef593611000c0010d13bc887c27e3f15bdb48af553519d6c30792e07421f84b4e0595dd083363cbb8c5b4a77a8f630b6b1962371244fef8d4b1c3095a9e6734e3b96c10c7c7c90fab3a5eea730bd7e11c4f0e4e93e3418630abff1fb77d0e2138521d48796ad828e629b8b4048f07f24b025dc03a19aa26f21010acd43f08b1377e14598e35fb0df805bcaa1b498a35fc34cc6d9e0b823b691a3c17c8c5ac22f3a4272ab1c74f889f5b13535a5317c260a17638d5128c4939c9dbeb914ce133c91282d838ae760deecd2a47acf8eb0c8536a76913d5f8b3f026fb2a988ebbbc604747bd64c6df0930f76be5886577ebdf1aeb838e792b6fee72fe79f72e9416bd69b4062affdaa2895c6af831492e7f161be749930ecd5d519d9527c8287a63172e0ff85745cef61322ed4de51250f510803425223b96f6dd9e0b83b9f08dbd3cc1d450170d946b2a1ea86f77e7295a23d069817b69913ae0c22c528bb38d226d3497b6937ba6bb046c3fe02be1adda8dc6e79473354b5a15b2cd2a40c8bb99bd7149b68fc6e4d343b22b6a30bce3b8dd59a9d0f5874fc35de331e8ac7aeda733e6bbc57884a0b6cd4460efaa77cd00070f1db9560f50d9038d3bf575b7608b4f3489993461764910644904e68eb2ddd728812eef74357a30ef9550d1412cd7813929ae4f50f630f07228f58192bfa1efe6a47d5d235cb0287d96156d56585157d3cdf9ae569ab60cb4c2c07fbd20584be7bd5a1783493fc7ac9c7e94b0d3759037760bea03859da93ff7af5160419de73e0d2d5f5a79f623f6dfd6406d746ad6275cad5bb6ee4d364d0f5899b729a31c6136b648c7431ea671730c60225ea6370fedf73f539e58d8b431c87f01e1c191a3c790dc3d85cfda379810d0e14f830ce1c1ee9c1a5b65606455675b509d6ae133f1d3c564fa7b77a408c164086e53de4ab826e43c96dce9dea6841ac73181ec3a1ab470748c4923fbb4324ea5f82faf169b7301eccfd710de6c5584ef73b11a5f43bc9b10789fa3db91331a5526a0b70aca620eba285693973c9310d8f709712bf28c7b5e49ef327b40884618332f9f50be126f68c5b5ca8f91ef0b949f90f8e44027c8f48e4b0d499736612dd22a78f9d0770aec37b07ac086207c3358a8cf9e5d62b7db49d685ea0440961dbecd057f3854ed27d5cecadf1b77f9314ca44d392b5c92ab2b7d16a0ea653e31817325d3dc4975d92758c404e2c645ec06c149b885ca2ba9fbe591a6142a580b9784f951a79934369922a335d73be8f46ea9e2a85955974c645358a560dcf82fbf0552e81dad5aabc8c5a994dd4afeb1c7d3cc0b7bb17ad66b8503acb342bffe46a488413d283f0d58de4432cd37708292b62edb349302011c9c9f482b694bf08cd6bafaf1e28066abb12d1dcd164efde675663814850b600878823fa82bf3ecd507d1939cff8ba9d1f2afb4adc12ef62cb908e5038e99afa56e9c82de5bbaa5873b8aa1da016a06556a520a6ecaa7ccef080e3f4ef991a4161f665edfc1fba36030be67742019406369fe4b858cdc727c69408b8815f76527e26dbad1fcb0a3e64ebc04dd6758c8ffdc69f29cfb25d1fb111dc690a472d63281d8f016de2f03a9169c06c22b63e5bb04c03cff4ab2bb1e3fa70785c8b507276c5a3db4dec71679e3d4e56e43707e60924bdbed1775228da65c0cc9a93691ad74707d9a895a54e155284c1605b8c14adac1fd0349c6ae4f3a992b4a7046c88e027f415b21691338b3917de62c919d921063cd22161653b4a73e525e25835f5aa0a9e985289643f82f73a2465aaf6de0aeaf04613d37d4b6c82ec86b2b363464f0990d994f706701bc9a96c3f9a7c8a43ae1319382181eeaa5961fe94b42294bd012a33113c5630dcd5a40d397010663396edcc4ce2e4fc108031371a4f068ec3d1316836e7734a192bb37296ce4b63ee9071506bb7a4480a3503cef27f3eaad4159d842b7dba53f5832863a38f9ede7ed2a84922919b48e4d29699648c03ce03a3036dad03bdf793d28075c34418d18a6126094651d3883e9d92fc0927dee2cf18c5381bc3d04992734ef718350dfd59d2c4851f0a42155166a0038a49e7a4bcce490c53a934a574565a981da2fb297f62f9d15d197d8c22e97bf8e55a24a79fd2cb8f518a130ff1f27d796da5439c20c3f040fd7ceae7cf49ca52c2388c8bb916fde55a745d8b9e072f6e344dd0f2f042513f9d9a59cc15d77dc4529568863990bba248769214e74f30333a39e724fdf44e8acee529e79ce6d3e9a6299389a8205c9ee1e0490aef14c50c33a27005880f64b80285dca0ba1076c36e08a3c7fecd88e04e597e6ddbd0c60861841042f830fa676d5e4359ebc5b2827aa7942fc9a7b3b65d8074f9e564f51c5de37f511d238ca42923384d749a6e77943276b641cac8bd35b80f892593e3a82edb63b3d65aa9b773b23fd1676da48ab21587610449962f757e768b29a160ed16d3098e07e7aa32ca08b1d1faa0aa84655cf3e0aea1f1e2aa0b770d86b53713dfa5edd7e04e279ea7ac031c6084076ec665eaa9d218a040e5d019e7faca1a61224b4f2f96e95e363b2918c171966559cf25b59520cb4cbbaa6fe9d059b1c85a1ba9a26ceddc976aad8d24717d99d6d55cbc856aaa37cd69c29546cbbfe01b24be86e5317c63447adec57adaf55d8b324928ee395b582ef957f6d283697c26be859ddf30b3ed069623f6b9756a122523aac398715d1a7667709bd0299f465104231ff07d4c156de10ffb548947c0881a2bc1c89b0d0d1da4ee9b89b2f93e47113e4803ec7841efbd9dfb4e56bfd4a528e838a4a4dff92999385b3ded7b295ba76992a629c3615ccf4e8b2da864fad2258e81c2f2135b4fab5a591b969f31502a67ab8eb5d28e1124b3606965211a0bbb318ec83d5c5a2db6e822cba7b5462db60023cba7933ba73613649add702dfaf04ce3911de9baf7f25054a74eea71ed32a57b07e3b8fcc5386d69f5b4ea4cbde55db0f3998ac6359c96af629524d9e5496942aec9e4f8321aac924991bc21409af1facb18b75e335b62881545927025fcd577b99825b7734c126ebe4bae9b315580727f12b0c24c087cdd59143f7a2a5ffb35e31581f0bdf7207c317879c50b426ec765996ad040c33a079259a2b80ec7b2eebdf7567bebbd7f6dadd95bd6adf7de7befbb9dd6e6defb15bb5c59caa22caadaefe1f5de7baf45d55aabad2f59b855aed43b65fddb852259fe6d8002bae0849b99b933cbdbb95352f7de7b6dd4b528cf4befb93c14455916455154bdf7de29a92cd6a6f35787a5aa3a76be84ad6fc15d4333215c016447852fa0e4d09bc9b410dc29876c6416c5ed5b5b9e765824f6e930a96225cb97a8ec9854d1821830c814b6bd4296fe31a902a5ddcd9046a3d179afcb5225c9da964aa734eb945a6e4d8b46c3a269a120dc976912c5fac70817c37af0047532d4b9fc4cfb711cb5868d774fbb7a9b2bac97b8f316cbaf4e0027b7fea683259a75de2babaaaa6c2a5bbdc4d55f2c2bcf52ca7b5f94ea0bee9a1a9f18bd3c9d30dc3536700c7656870e89837570e716cca3522b69a75fd73b97742cdc997ab6d3c9b13c3cac0e0f654d55b0aac455b2363a2a1e15f5ee1e2e5159793c5f54654031b53f284d917a8003c57fa912b7fc64bdf52e4b9ef7bccbb49a18c687e7ce77de654aa3ca328e90270e86f3f2d4a5b2c0d00d0a233110aefde040f16b50e2f6788cc7a5e3136934dabdd5bd36eac49e677c99f8d31dc3ae86056f2ea7e68a928d32a5a483f29f84b10f5679be73e5a9aea52c100e14ad0d10af7a6ad5ebf9aabf5dfba28adac037462a988f817924be86c6d7c037462ef61fec91f81a978cfee05a7c28bd89f23cb167dad7599d8c070cbaaa6068483386e4fb725f321d9e2fc670027c26de50659b6be2a0e4f83f0061c92ba474bc06299e841e0f1eac475027b3f912f9eda8f6b7972155fd26dddfa6df68de61b3a3b2ab5cac97df3ccf925d4b762e2fff1b0dfc1b4cf6db0700bfd590f92de6371b35fcf6104238c4f439b8007c247dc4f0a387b17300b0cbb48338907706b4124d89522417f38994332da149ea110b0545a462e2d6897b09d7de7710d7266e209e3a3109ae3a310858eac41b10c2a54e0cc48f973ab10e34eac43d60eac4a11a75622da64e9c558963aaa811763900b8730dd89198988822b01c9f88226e9e4f04fc22668e6c64679d0536acdff88d1962ca1063fb8a0c6e31d430a386ed32de030077950f183eb6a964b8b900939ded2d38d06b30c0c8ef316e2cd0e88286ed2851f2fbc7bdc5cb145e6c43796f03b7130c0bcc7693f731b8ab70a1c2c5f614ef6be06e420b135a6c2b79ffc19d041624b0d84602837b089791cb7691220d04cf0f3cb69f78c1bd03ab09cbf6902136e8d4a0639b062eb893e81838d06b212db891a8b2b3cd0207b27dd33729a0b2b328a0ec092e2c029b9d0d8103bd223cf803353beb816a3b404503343b9b01077a18e8600b385b01077a415c0c810738d0fba1c20c7076010ef47a68e243825e02dc140770d6000ef478f0c01165676f70a077e3c6009c0539d0a3a1c9ef21aec1d2f0ac8c4c8c67676b38d0fb38d0fb4f8b03bd7f6bc382b9f6b22c28a61ce83dcdeac4170075624ce5ba26644091375722bf7739da83535c7b508a033df89688b299e4cdd8a8c2ddde4d7ebf4520f9fdbb711c41844c2baf0ac4a1b1e3bbc8e9f770d86e890eed431e7ad11d0a9f797f5f8e06127a39847833ef312983523a7be288bb392805b0c2dd1c14201073708a1cbd92f9423c0c930922f77b04ddbb8f7c41dff994ddefb2339f13c3dc0be0c5f5df6a14efc1f71c86cd39a38826ea4784f79ebf0d7cdf4f3c0149764e9c909305909d13270cc99f2892f9a8fd5907fc0a6c58799ff9b413576658e6f88a7cb8e0c2bfceefcc1d724218c29085912b0d3072869472527ae7bd55555555ce9526785575554929499214a78d61f2aa8a6acada5818fbd44a145b41c141900c850932d43c33cdb597a9feca59e7add533af099f8d6423512ca54facd00a2a2e39a8d58792f92e10285de458216409eeee772283524aa935a9457b5a56f69d0eb528a594d2773ba9f4167619b32aacb5d6dba16cad9665599618921861586fbd1406289884814896b27c99ce5b5fab7d4ad1a94eb5d28eacd3e599b24a6bb5d65254b5d65a2f4952ad9645ab4ea762a2e4d30325b8ac5cfb2571aeb753067b199f894f9b8c8fdbe13c46f1d2aafaeab3700208f4c8bc90a87a5e8a9556b6fa9a1d1655ac746c2543869580152ecd2e0b1f4cc9b28af7ba35bb2c7c4046964f29e74e6d21a0acb76cf5b34ecbd3e978ac96ca62ab9f2d6e55939492a2b00e13af91c4bbb5ba86047f4d508749f71e7defbde7af52fa6468b4d28c514f939da6a7f8d5f7dea3f451fcea7bd04ed28c317ab5b6cb60cd0bf4610c0689b93f2c8c8091e5a3596634aeb90c0f5edce93b76e6bdbc2955df8b9e925414fdd6d17b929c334acfa515e37bd21427854f6da811f1e1bf175f8cf661ec24cd2763f4f4a38f64ac3166118c1e0f7d4a298d74488c117c7e84db022532b516a186943421c22b514513182560aefd7376073fc2afcc08741c47a0fd3c58e1de2608c9ce09138464ff1cd93951028505db27e438b6fbd99f87dbf12e66843a1fae832ff6d38ea2c718a38c31562179abb25b1f2f39c6986d23c83ec66b2b1f46cf6201d4d0ae5666d7811cfbed5e51dcd74fb578365256eeb22ab7ab8ba34e2746093b9d8b5dad52d62caa526fad34aa72da58a7ecd0db308ae41487e4cd0632a0a0e2baf5721cb0deabdec7b4b81bc4ea05e7184008e1783ccfe389a2f86cf51d793cd7cabf41135a01cd14a87033852daedca009d1581e4fe7a5ef589d7a51b7aaf0bd990ab4abb2224ade10b0c405064e5caec4bd17f3dc6ba9c5945afac4b8c9540c19644aefd5f2b4d22e8d76032107ba3e178b4172b138a4fbdbed08515422efc7a113df638c1146f1c1c72e538943bd84631cc87fa29e62ff644149cf1f1c6b657270b70b53c9f07d92dcedca7e61fdb26514bdf72484d154230c062e9abe8e6f3bea6f081dcb0db22b208d1fbd896e519a1d5f04b303e66d6d1a46fd6c7f846de09df3c2771b1fe2982beeebdc79023de3af85ecbfe9f8427609389003e14051903888205c732a40b8e69fe4fef801733bde4758688106fecf9f944d256fe8fc1a031554903416ed72b41c1c38a221647fcd9f2688c6217a7f0b507193a7f79cfbb71a2df537cafe166da6bd197fcf36cd256fb36d1a10e4ead038ccf7a71eb919e9adf4c9d26f08c80e925ee27636481fe1e76c6867c3f4df1c885ebe0e0be83c653f7aa072a38c88cf524e94c300f210ee0c66c833872da3d234a7aca3b9835be25966a1ce3172ffc1060b777339394a1059871ea4c809b94f2e93e052e42ac277d4351ad7ac73ee448a1cf71b5a7cea30e6fef973e7ceb1e9ee0effbdf71ecc28e0c494b6c1e51e2e06f5aff19e93fd89e552a6646f2bd9b1cfd1c3bb4894e9577e7c9c46ccbb8df766c9b6e9b1b2ed3ddfc936cdeaaab3cc6563afbd6c0bb95ef272fcf73f222fc76773469f0c3f4cb6cd7f1ad976ff25eb25d9633873443ec3dcb71427d2ee5db26d3af72cd986b9bfb2ed3dd9a659d916b292dd775acacdb6e988508e63aceb765f7b0be5a9dd4bddb26347b05f7f0de72c90fcf14aa42e911f84f08903c1fa98c8d04a1dc3e5784cbc24eeb920c377ee880c7d0c1184ce058459cde69437f3e69127e5b97872e4c894fcfe31f136ecc523f366069940e694fc7cf8f88444241ea136aa70b7f8844484878e4f44281c4791ba44744148a33c7a24c0ede8d9df35753e9df33bceefe1351d70edc51bae6d0003376ef478dd3774f07056a2245b03c90e049e43078d77df349884388e193be03822ea37f785d5b1392eb00b381c7a7821dc0e79b1b4b8bce7e5ddd3e8e8e8a17168246dc3d55121b1953adb564669f2d1c4ed24d04da7c18f70751afc268224fe3b9271e7bccbed955d846b2f58f4b0d317ee9aa8053f16d2b410017cf0f45b1dcafda3bbbbf2a981388e9b0e020277c61429ef85deccfb612fe6de83bb89dfd039ae35911fd38c624f118332a628e3e2aeb170bb99fe0e86f161ecdb35302b0263f77d5b9c7f33ef0bd0c5dd5c193f1cc8df62579305112aeee18c387273f44da47b44dddd112c82042778325d9e419dcc36ade4f7f48c3c3b4a4b79bee4e588725e8e9993f3e409175c489132c5a7e46d4620707b4be407c1f090f0a8344d5a4745e81009000010002316000018100c8582c1503820184bab2a1f14001174943a66449aca43a220457110444118638c210400028021001864083373ba01195553a057c6bb72809a62654f876000dbda6090171c9dc6590fe73fa1d80b08909861deafcd2b61b9d8582d317a680411b76db0c7b85876b4600a24943a51d99265b039eb84d453d9af8d776573b652a8cebd8aad8c46337a682a5f6ac03b1fd7a2995b59efe0826076b9955f112001b9d5b7e61f9d3269e1ccb797a7f528859e583dc8844af7e73fcfdf35cf53658b4694902712e8a817ecc9a1ec4c1c99165613e5f364439de56c7d82757357c7a4086628f1e19783d5603666a68a904d60a05fb20ef3030f21621029b5c88beb8439234e828cfd598209e4771040c3f66b1c2b32414f9e5b7c9b090eda473aba1b70a38273274b7dfd74238ae594f16af7202aa3e5e3518a03da28de82a810e762bfd6b735b315b6f34589cae0fa463a73363d7089f50dd6128f484cbd350d522f10d21da76dd83b5b2599102e462a97cfe64f503cc15f5b4abd945049b9c2d54d565b415e0e72d5b046d468cf6140551037afba52dd3e54bb319fa54cc3592365740cb1f7c5d4d89be2c2849b8e964d2d683649f6231516a14dc1d3ed3b8b350930ee0c2a94d2fa4a1dd9b77ba92454a923c00f25aa03535d04a19c0dae011ea0230246ac8fb883d53af4aabac0237cbb244f8d241653493ffa9d733087e378d7d1ef0e93d753b31c3ad9fda35728638be00d510aaf51365ca46eb1788b6cc674a05222c027b3f2db9c19ef1016990cce299fed8b76827cd2714cd32b4200a4cd8694871ef6499a72673266fbf2692c7640517546af04de322ab26a6a561ada7e8b367b2cdede4a8e5fed084c214512a7ce589d398053f09535c5f62069d61aa6720833a398af5ecca0e6330ef93c5e1d91faa05d6ed5c7434090195159e5b718571ad3f3850966972f2eee549f5a6eecc31471bb9bc259c870422da7a911fdc72c84fd05bf42a9aff0f5c15c7957b5436da5ded7d2ef2ac1319173c62e44d2a163cad66a1eb393999459b807fa056be28e7344cec2278906abc91e7a26627caf1b27da2a56aa011411d94fae256a84da0700cd38e8ca99649616993061e56bfc13f07bde6f862ec87bbd0c888d3acc955938685f27a31ed0cfa697faedc8a0b78a41e0e2dbd06de5106d7b7a42db1e4d9c77d05517a4e868591e81dd64722bf0675dd73f5dceceba98d106ea0b0e72e39a0c30cea34ff61300b8ea0c938bd3b271b1666ef2082f25eb7abf8774a4873a0cdfcd5ec5e444a6e7527b908f3b488f352478b0e87a32748f68b54c481c8624bbcaa5730c288ca5305d48fe7d19730550f66e1aeca769fc1d422698392574c7dc171c5786b5e468b3c1f43bc6668a72200bb62cc68bee19bdcbe42f4d6fd65c83530c0ad8a94328986ecc818cc3b9f90f8307871d2a453e111db5bb031620f981ed5184ea38b1a2b6b8be07069d6d28014364c11ae499d9eb60b9af63f2c08ccecc9efed8ebca78b2989c8239b0a6de20d7c27a161022c4058a326dfc9cd9a32f46ac49e22d745775d6dbf201dc70a2fcfea30e454c5edd396bd9cc99a3a745732029c5b30879c1a94fb04f3b993454fc321286f6de2bf3edf7d138542a29c50dd9598b22c7783390ea4015d73e2af59f4b5d8ce0d36309c11b09d1e3f482c983b02b7cec34d7fcffa35759407b7ae21f1ff5cdc1b04f46f5ddceafdf09b8f9a98104388e72ad12e92e8729ca9998eb3439f6b4ae817083bd1b241112609d75c2b96233d42f76adf547273347a9587d229b5bc038e8e5fb3a87005fed7a2acdd445ba9d97faa7d505170768afa90a3a871efafb5b98d665c2dbd2d5f063d32414e3c789b7fc305374e44431a8fc4c28e53106390f07a05bb203b93bf667ac29b1dae5532981288e509ec8d3c8393f5a5bb0684c45fe00daf5006dd4f2468cf830b64c030b9b4e9e6d36eabb59885c711e1ee18e3e591025726aa3f574055928b6473759e0b5d6230e489d468678754d1d65daa845b7302cb0aa403191516953689330bdb94b42319c4ebb6dc6d132f4860aea29dc61c1902cee75a28528de14b09261c417622836d89f4c4231c321be12c56a76d7981bc92271bc6b48d5e2192b66f7517f9c5f7a2754c069c5a479dea0fd08a7106a9dffc41a8ac5386f5d56734405d5b0400f338f68346824146b35a0612a3c90f426e5ed36987d36fc56938b82ff458e73ff4c902395c29867173ecfb6eb34b7c1c157b90a0e18c7b585f57e584f9819e42000c1d50a009182eb380f2ff25bc759c1b6256edfd9f2d0894823a1d83a9d3999770d1060750b96d5d2d81dbcbcdeba5980c8791d67a5dd260cf72035ee49a7697b3abae82ff4400dea38f9e1c58c3c3e08a9fac6492826d568d5c38da8b7849b47a3240bd7661e8feb6f723a556227c74df183629c5d25a138a4d93661c03c9e69520ce33690507c822e33ce5d8ed7c54694b98f3c149f6312b539ecb99b6039ef3e6d2d5ae10ddff480de2d055f95e7517168e68a99224ba024df659eb9e97c7a55c8cec7e0cb69bcb113a16f72dff4820379263fc4f5f3bdd2eb78cd5fd18a4de400742b625a0e4cebac5978618320e2e4aaa84fde55036f6d0995b67fdd5535528be19f387d94e4d162cdcdf9120346d90d6990b9ffa175e0332e81daa1af04a3630a8610c4059ed0a2d2b09239b54a063229d88896b69b9a3e1f72669028a3245fa58079b2609fa20380252d86756425f7652ea6e04b21e1395a0989f1926547dedca29eb1afa2e2d70f93b486a217c37d3f4411f6194e4cf84a0c243ad35244aa1bc5201523b06b9fcf6dd0b471ec6a5eee56846ee5a25805d4660261454fc550009a21fffa5c39f180bf53144fca0a802454f646d066bb51d88fa320be17ed73c2046c51cc4ac1b9b3a57ac1908f06110ef49b5ec6300c491e3fc0b61468f6eef4c3f06fd45a1884f5d75444413a0082b58d5cd9da8fd2c68b2cea5807156876369cf174e94882dce0d2df6851d42024ff60cd94907564bcea4cf4c0e422b2c9f8f48517d24adc7588d993f6f6425d825a1e94f1263ac891259cdb3c282e04e42c1f888484e8e72a4cb55f6e2e2897112b200d2f7b46dc69ea9be5fbc7fda826279fa34c234887b61645b17213d5aa08b322d8d4ae175f2d7401f37b8222e573336f674ec8935fbc2b8ed3b0601c1e62fd1717b92943e13f8d59552794342f75485029aa2acf8a82ea5ba845aedaafda0b85560353d295bbd8091ecddd8066275907554b7be3eca33471fc2630342b06412a08bc4be0baa72ad0c8961696d09aac8146c7f7a1c92c1728a19bc16daa5d44a535fc30f41b38b6391750645a780bfce9581299e952818d3b9f01cc40e814d3ce5f23ce0082f80efcce45fa09b4a06caaa66d1914645b6198517a9a07bd72855ea06d421a8041334ca41f297b384e53158784ae59e1959735231921428894d69399ccc8d0824a1c4e244888f6e8b5581049b5d6149e7b36b9c0161ba7188b24d9c527b3d1907d7cff58aefc410cc93b08d094239c9b47038d31bb0fb6a58d74c9b822fd9f3faa6842707fe687c3b237d68276033376900d6091e95c3aa2d2f6aacfbdd0b350dc9f6b9e1b1894a72c483ef593af6cdb8c8e30f564af9d1ce2dd3e602d7289c673483d98fbfd9a2bb037d04b902bf04ead9bc56bf1f9abc2656aeb2278b09043054681ccf1976ac21050a5ab4a46f063e0c52bb2c9ba0751fd40e810a57459fc7360416b1470acb006d8d5f84482f90b47c6a756c359a99f1a62237d21df2ecb0313c371769a20bb1379697e99f46aae79094e4769d6adea8a4ac5298735ab8826b45f0af912e18309deced4da0b4aa9edaa5659a6b0e3b5399c84b060bd4c201a9081c2bf45289fca904493cbe6574421b9db50e9889e0fcf7b17b7cb163c0db23e17bea4cc5cf8aec7889e89b4893285fff99911019763b5d3eed1c590f97ed58e6035010e8cdd766b620d6b0e1ba1ac35d0714a78628a9e8417b61915385620721d891e464bb599226770a25231e46f5bce596a6cae768189db7159704512dc3a0677462a59b11935ed02e9fd54bd2547fe22fa942800eaae1a75cd01eee26a320af4e1dd646b392b99b92eea273cee48770fd519550ab1ad734608f1271220c7722cb4cae1ef222a1e43e60df8ede69d5569d4fe3f8d976974f91f34e737d4e31b785114453db615bd3248c2536fd447caeb608f123a3356bd593bd0cd1af0062806cba2dbe9390afd6a2fc2ebea2fbc7c6f0f63dec34c61f12bd8b61038bceb7f173e8e6d815f80db5c7dccb059c1180f758c7bec931e569ab02d17a83e4599483466c80292a26535039cf1b929a1b0d8c4bd96a3dd68b1132335e1cb3402ae1d080b1d044da66ae86bec84f3e38587e58b9c2ac664a2084218ee6647253a41116fb2fe6cdeee1451a909f37ce82341e54498b38670176689a02492642dae3d37277b77e9f924013d228b0a93d063c7e7b958aa16582795a7c5a909ada79bc4203173f2b3b97c6d5811c6cde9033e33e8ad3d9e82772c18e683d6a37156ef042abd1f6ee7bca9da32684c282893819a2d98e29784437c3dd871daa2813cb6b9dd3605d722d090e976e75520dd3442341a9455610617bb0afac747486505fa505c51de53836bfc036438e53c229eee9f7db7da459caca504ab3aebecaac4f7d51cc6cabaf92f0aa96d28c3e672960204a771d330e0a7b240db28b18057a7f7b959b2acc11b19a6e0cb30678508b03da3cda2e2678a6a0b66c2d35050904e2fe423b3b684a2c605405d9491b132564951a25e2a01b1931f85cec792f586d4f412e9e398e76fc9fe9da87596cce0d4c5aa7cc61b4371030611123f1636cf2c3661f3c5c108ae2e2348814154c158bf41628b3d3e0039b60fae80115daca4398a780d1f6c5661cc85efb0a01b917f1e3c4dc07a13694a48d86b799e7077d91031996da32c9c942611e102784b098d8b58b28dea9e43d195d34af01feb6386e53aa0f01c0e797d4ccafd52df8ddf0758dd0b307e07a6b16f90fc338c03cd3e25eddfd920cc5db22555223f2437a4a334310800b0be32182823d55410edde3caf7ba7695be3eba8080843bfc3500e37f290da0e71a0e9c175467102a99adbf7d9af3b24cd276282fa8aa3fca401a00889a6b1d1c20ae446752d7dad991b5d2bb0fa919acbd1edeb9da35ac86b03b2724f39fdd1dc9cc082b048cf497110cee441036a84ca5c0396b468b40e8cf9d4b8a88760cf1eedaa09910d48b19b65fc2126b33cdeac9af50fb68198eef555722da9753cc91759e3a09027b8de5fc8772b3e1d8cb1fc805db0c329a44b6e637b02724eb58a27d412f86f0bf3ae67a83bf3b13f599ba77358013f117a7810227ea9282663761e6aa906560dc614be3be7fd179f70f5231964d1d3c7e8f6a15925737445eeef9a4b153c059e3c27577c4eb7e9ad7798db23f37ffe2d57bfde1becf7107add8787c3fdc547299be4bde6bac5599c790020bc3907b13764b71229d1ccb4dab5cc4bae9b1d2eb258f468953c4bcf02d61ddc23c8bee365c5114ba4a97dd4877d7218c9b473e6517c0e7195855353112e1deb8605c967e32f562351da065a606d52ebc15f3334e34f931f618a3173d1e8601b71a83856b6a20888668f516041c52ebb47d3c105e0700f8813b914731b2a17dddfa3a57764a32cd8414c4b641ea8b4c888693af3c1b436f4d6afa3cf5837eb248a6924588370ac199eee32c12387d8a978d381ba322872549b1ac105b7c513a0d679b45526d7719336034e84e11e870117494dfc9063e6f149784caef3924f86810d8393773b263da9e11f4ac93899246dc2e746d3efdb0777fc6dba408a15ee33f7c1a1748650e2918312249c2f7e73b92079ee2836ff28d4d83039f2c17246fbb0a166dc71e218d9ce4acc640b3e24794901b68c2b6c5282a93ccba7e4c74e574acff26137ccddc7a372758242a44a53ce60941122985c9be1cfd1e9d92682b67b3419995c7f2b2a4d3941453bed23469bc43b43ed95d7fd76d223eacb4b316f69ade291dcf4e96a285853a0b5e2a1a7f23d05ae2465cf7108a584d28510408c97e4cec739f74c06bbd952ebdab2462ae043ad8434c13681330068257ab487ae3e6cdadbd62a1383c6a8efed2be5a6b84ccee43b3aad35661b66754518d111f86b1da5ff9e87c347b4a243fac287a0d0ca26a947b7ba5f3a2ce5c960401077bcb2954646e998c7bf87e71f1d6cb08198b601a5ba3aef6a40f63067e05fba47457ca0a577e6ed41a7fc440f8dc4dc81145482c0a1977946a80b0b1922529d988e767db45c950b97dbd145099017c6e07b38f53ee59514c369ab2923190d90e1c267637c851fad8ee36e1433f8cac9d32dbbfa2874b1ec22a8185ec8e1715e8bde65f1b5c65907bb11a50237f087bb4361e97828761cc71cacc3e48ee082740a7b8c39924cf9edd5bc273be4fbafbac05e21e6a91927af806fbf8cc843a6ee45a6000a7ea0cb7b80e1c587fbe3d9f6341fe5ecdcabf6c7a93dfd2a49b869ab76ae9091436fb4be0c86ec6605a4fedfde60855488372408274f934a2c063870ce4d0ac3186e7cc57b4b30b8819bb31b51d5bceb6e486c523fcb7f14bdf29929629b1495cf008340e30a7a96e3640e9aa9c8d94d914d58c18879e0f9ef6b6c6c454dd24cb36c5e68c57041aff8550e96f72bd8799ef758bfaf9002dd62adc5ad5a0572c6e46fa79b9bbb9f4455bc75d82b580068b486a08e3742f5dfc3f92ea1b83df2316344d0c218fdddc6640a052021f6aad822312d7638e40b173f52ed1db58527f0560db5745de42da521fd4513052288c1bc050af075205ec14ec254df28cf38a9eeef4b6908fde0765f19ec6b125826be09e5531a2a3a1e74ebec714b6665a4fcd3a1346409c5decc0a7f61f1a7cee77a05fbe88470560517defba2128c5dc1d25364b1033d12a62ed48f916b32d73c10de529720e46e251ba212b24ea508e75d75f7adbfc7aed564c21bef3885fb6fed3526b72a089e80f08f3cc745015f22fab41398da4498735f810f6f0093754f419fa9ed501a7a8da10d448ad3e327b7b0a37a77bc4e47b079058bce8cb47e8581276ed73fb4c745dc5187e5ac4bb35ee0c0941dabd2102e04be73b2a2f6af60671cb33f20b38183bd824522dea4970cc5b81d73d3f19f7c1e0c3526787216ad05e45e79968a04ccd2ba0731b3cdd59e214b657669c71f22d5ad5b844dea1e6caae90530bf4c19edd55b295d172671f561b0531edd76f1b7942401fe83d943459935407c483edee18ebb57b0463e16aabdaef740bc82350d845b3b69add0ad405367df7955f365eeda6fde6daf34b46e4cf5b21ae5cb229051aa02d69d198b8492be45ae27aec517f77bbfdf62a387667b25f406833b0056ed637400bd1e4fc0e9e6ca686531a2046c4ca6e9232e9da7cc98dc27ccc63ae845a1e65ec0eb26885034f77c08ba8dacd381406d3cb79249fe075653e4491743f149202c90eb99a97513f6347d1a6177ce61725442222f9b82c29f540d14df557b74309231d3add8f3b85b1f9b87064ab5ee86acd30166b37d59d39c0384dec00647f7e1a4a0745b159d3993db1a98405b2e77f3d111365b98a774250c0fbc43f029ddfadb582dc39ca96ef1f1889833de38cebaaef92aa79e08f62dc32dd876aceed01adf9fc122ae31ab0ecf52008a1584140ce4efd468e9c2d4b8b20a8429ee537024b2edb2522fbd899cb41f0750af0607ac5e4109099855f9e456953dd8a6d9a98f60fb4aeeff622256ad7b36484b108f38f674440ec0832e7dca0b6a806cc19304227b84bb167eb736c0b398dc2b19d83d31a5cf0afcc54ea5fcc39a9848a42045ca5245ae011315d799b1728ed01b62d9f6e33d12ac2d89477231e80d8c282fa466e4a6b6b559e91bbb89d47959156e33dbe039dad6d1882a2b03680df108fe243b91bcac9c31ae49fec2a520a25460d6b39fec39e533581b1859b74708b4fd42b91d4b87e297233662b5d94b9af3ff4e7fcff853a312e1db0a03b5ad1d4fcfa969acd5043d50622695da188ad7a035e6b72b6136bbb33a74236c4a56d92899364801b48565c270a9f76d6ad29a46d89bbb6986dc08195a0357d59b38b8b12c6ae12e6d584456ff55428d10a46d5cdcc8f79b1bff4029ece2706527607520c46b8736474755632560e9eea6895298b62bbffd6de9734e6b7f2300338558de4f9dd38a8f5581d20666588100a0f6f38e7e027ba9c86579a700308bf2f35815dc3e7153ed52bbf46a8591d2ffe6c2f08c4ae0981d90d51310413f2b2788584de951cb4ba000ec3b8442dfcb1611b474d60753bfa924a725718237fb703edd5df8959613337c9d134994461dbfcbb295ae8854754702e26cd35b40103f3e4ec2396bf557b5917b5437e21bc6c792ddbe7ea5b525d7ccd43f655571f938f06548fe8c46792e6de8c71e445f220106894fb3f44cb36bf79d84ae314b53ef1c244b0b5a58f0af30eda52e73698663f76e9058e69ef90c7bbc752e7b70c607945f6aaad2d3d3208345f4a620c201dc42f7fc9ed95891c8f0156c0e8d50086f34929d4aaa0ff6f249b22f0d1aa1713421f163c8ff989891cb46fafd6234f67fd0c2de004d9a5ae4c043e333bf19cc8cf7b63237a54f58b682b52b0184f0324365b7b946bdb3e4b0c1cb21c619a46e88bcc724acd3b6cf0cbc0eaa015feb51317ce7d6c69c13a6ecdf75330d587dce6679cb69c79ab1481af14dcb9801813a726ccc0880c317913ef7dc36ba8794758505317f564f938933d527d66b3c8e1299b3886e5dfb85c854bb0909615b5545497fdbf4f062996ddd4fe192952ee8b5d893faccee6b0b5490c1cb80176547fe988d3ae32c1779b17221085c732039d58d247c8df001559ca5bdfd561e3220a3751b1e71b5e3d779f7d1c51edb7c3b8147862450bf7c35112fd8fd157f496be2acd57660b1f48ea996e52a1a4a989cc3edf94ccd1327af3bf9841bb497484f14993c807550ca87dbb1f835429bc0572c0f8bd3c2d37de49923579a489080c67a743b57f778fd33b050d8cbe1cff84dd421c3c8c0bb0f2b0415aeda747216f658f6f4f5ae6d1170f8cfe571cae17f08ee95286c007e7b2cff763c5cc9ceaf45bede9eaff6fc67ed5aff9234630ccdbd11b0f38e0d2f75ca1621098d00841bd59374cc6dec634469852295d79e54040c275f811633ffd4f1c580c4d3a53718d9e6f6c97da43f9ca65fac87f2cf17d6fd8fb7941eaa0f47fb1863efa193ddc54ca8ffde216b54939b994fab5627c318b36287d19c52cea9804b8475aca27cb01e67257d04d34526e58c5bede16b5fc43ab5fa5d57244b2c3ec5f46336631d803c0df79cd6970f3d3c9d4fe144a150e4a0b8d7e1e65ebf56b80d34aafe2055be503c58a454f0145522160e9d880e19fd1043844ac045c8d72a60de18297f12616099fece61013a9e7bd10e52c49c1a2fc0544c0352fde70205e4340f79c1fe7c414377edae696cddec7b2f76fd7e9acc1f5e793feb073d3c44297f5141d86fdc6092b23517dc05ac6453dc99e253edd42d394fa1c8218a8100a53e8125484b57645b070826f66f57f8c08e4d75723528451cca9f04c0de72045df123e21b824b7d075297239c0fc36089e813c33362eac38f8801ec6a6dfa6b72d7551aab678d9b06a96781fd3b6b992b3d5e660ab670cd39de80d3bb5a1212157f61f470bbd65ef88ecd4dda727701eed42577ca9c00bb1870fa6dbc67820164d1e5fa3b1a0805669582c136ac584672bc0d32c739c6e78d269463606f86c385dbf2cb7c0fd7a795fc0496d4ecda93f31c65a6067fea985eefcb7a350adbadd6d594b214b384492434dd9f878004310cd4760853cb330d9f8dfc4d3e244fec9b7c1180741dfb9f21c25c18c06d7eb184a7015b8974f99a4927fc2ab1bebd33675f278efd96767855e6a48306547d5b98c716604d6e9d5c5653a511c97d4957a4b944490742d5212662f14e332862705405a41396015831110a087f1abadc4b4ac16b0440d7d2a26a4d132ffe3665620e660a4804ef0914e840349f586990d0d7619d2b0ece56c346da7822d6edc50fb9c17fea547ededa6ff023d7f3082216b251d2bb55cf09cc00eb04aed813286bf98bb90681bb74fd8fe6ff86e967551bc1010291cd4e8f05ed59c0fe7edd997d0be18e4cf78af704e64a64f95391401b2c90e31cedf154a439d4b6f5e27aba8056b33fedc46b8a885e1180c39380f8e866610c70ba9d2735e41e8fe61dd7cc6eb9d56d9248b7f669bd16a7f81d745bb6cdf02b94442aeafa82a4812c81452132c56576bddee94e8c3b7c7c57a7976a25628a539d2a45bbff9449ed4121f1773f64d13b96270164dbfd4f2220c5ceb0ae531220185dd66f83b1f5c74fce1c9e54804ce007d30c20c63fe71d97c8b897bfcd50d789a70466cefe6a6fa8d8872e4f8287948e21f5e21e854e5101fd4d360d9ee30953a35e8ab43ac52c9c12d5a2e00a1f01549d17a2a82cf1ad88783a26e4afbb00abaee7fdf4f7ccba729c6355ae9b3430006e6d3581c3a981beacd4f069adf78770801cce00ea14914767c05d29df6bb5bce0c1c57b4e7fb2b701c90e3458b94cb97fba27169df13af8ede1899943ed92ecc097b4a26e6feb31fe1418f06d2d3527e45d25a31837b4dd9f901159470a1d8458e9fd09634345944b3862c0eb7bf265e747d20c6ac117118844aa149de40d93e83bf4116206959efb045fdcce3c5b5059f90fbf037a72e6dd826b71cfbd83aea37ed6f9eb07e3a462f86d92ca5cd49eb1d7d8ba8a459f4a5678daf6a78e24e6e5896631737ac1a36d06c3677d07878ddf3f2572f08a36908109f7c5e046e4b321d2f2cac297bf81c1b8d56e6e62e04cbb43d4e222bc72f401e4acf57732caab63820ac6348f714f132aeb85d7eb69d043dadd499896f7454b5cb8263e48908126dbe02bc6215c379247c1b192b5c52c012cd451bc22be8bdf2869c2c7d449a287249a96fa336426a36c39fdd2e7fc7de68791eef9ea81b1608f5ff3028ea020f4392bd27d1565c84d28a42afc07fc3b6ec127ce3d45269ab0a85dc7bc4de760141ebc2caaa974520d4952a7fa994aab4f8c860d1147932829ac563584df1c1e09c4260ca5075e3e606a25ea7856f2a8d19b692dc7de8ad521647e41880ef3f573b844356ffd5d9c027d3c255b085cd284f882b820135662d883367ea0cc1b9aa1029bdb8e8db83df216bd837c65760ba78d50debdf9f0d60fc48e4db71877db04938a1b9972f1d76f87988e4c8625f57b03d2192482ca412803ec7eced6dc5e6af35abc42bd99c0df0987c505dbda15e4e299d74dce1196d0926252863be49d7e04b7f2a41f09a23dd0066c442163883ae9d09b6789ad1fec35a5b27fb7ba6953ee60bfcb52e787065ee0b70b853db9ece8e3bbbd5150504c855c7220ac2cbc547a70b9c7f41d0e530ddae1d172801cf1778a803cf30406360a11304014cceb047d4b3c8722e2e3c9e462b3a156c4169349f9604011f5244cf09e8846682ebf2292e057810ab9ea915aa29cf80a1c4ee1cd3a2211808c85f0700ee5962941d81c46cb13d75f1ade924ea99715c505acbf4f0bf0304fc9dbce0c66c342f73f12cf00f7a718e45caf216038996cf8a41937d6434b0542f78cbeefb6580aa9d26d6e0b48fcc51a51c25ad36e96c3b8b98a3042b1fb57744861e0685c9d6b197e0dffb0e6186c6e944c2b5f48eb92276e4c947e5b0a5c6ac10c82ca19a4abbf00f05b9c48ccb39b2d2adfb0ea932a0f64ce6d946dfc5760455f40b0077e8991b831a9173cd047e9639d9dca90efa1b8b32434708a4232626dd37d26a012dac1d241902f8e827c33672b9865776259fe268fc9ae13d7dde975aa3548434a349e9e5702f5ab6ed4c00cc4035e79ccfbf07ee03dbb5b3c108859ba00fc104656ab41673fbcd2081b9af6f7ab6fcecf0800c613f08374bed35f618b0e87cd49b1a04b89efe358512ac50bdeb091cd1d68390968aa0452701d036d2cc22915035dd55380f30c69d098e7f8bd2f508ced72b33900b53d80836dc873846956d8e5e2cf2e1f3810297bb02120617a094ddcffac0ee6eac62a9dbe01f3c9c83faa11b0a27e382bb930e242ac12d6e5c6227de89a45c87c2c574d40c74b02db3ff716cf8bca3bed254d0ab1df503181e95d693d1efc0f6881f207ac39c48fcea096d04acee4a8996cc3c66e86fb4af3f94f60312daffb51563da28dbbf4d0a0ebb5745efe9c119ed7673f247e9a0d0e0979671cd0bc153e9eb6061927a28a82e804f0e9f23cd89999313df942b090cb538f06b5ea33199e787856775e7dc1db395494466afa0d99cf4fd797607cdc5a595e33aa58c53b78346e6abfafcaf7bde0802850573cff01ec4d8652a3a692d95dc09995e4bba1483122a82477ee01c25a65cc50eb071e29a663513ff5f97eeb4ee8d5c5ee812cd3fc6972241968daa04e8c2ecf807aee5c0f530424bc0135decee43162c17d4790a870cf27dde02ec38bc618336f373e95174a573c1dd034e8b452882844c2081b57d9d60d3be2b7cf4b9b7dd32b3aa33ac3cc2cd5abf45482e0d417da2a494a402a9e419988d6556cd2a1a4f05c13445d1b75ef9ee88d27e36308d6b225905df20d1096a5807c95d87d54a339c842ceb8575a3a9d0b9a255d73b40420e330aac7568ed6a20d2c92a2314a4e96e62570264b027b026401e119218267c9e908c4395997ac4e985e469d7a38c4d098099111db298e1524ae3fcd736a8d8594d4d0bd28d44bcc7ce7a4412d8437bdf7aabe0e5b65300cf1614a8ea86833f7fadf61aa5bb82b1fcd61daad2f0de3c092e3cb09d33f979cf5a08a842972da9a501e4af9aec021c8d4a5bb9d2e65fb0878ef406278edd770bf6f98aec1195a7069053235978aadf6bd9f3c82f62b928a22579eee09d44fbd3f8e73f40d16f79913225fa2989c26d5f7c0738e0936cf7a09750eb67a4d06de81a907a7cb3769602df2f587a7766ee460e3a604dbfb2617e91bc9fc3a47fe4cb43c2efce0b97e6c000a4a866f206adee3245f62fd80944e274cdbc137baabf88b88af29bcf8a044db1c22c049b623bf4db08165c06d0e7d42f1658e8a77d4f75e1ed10e1850ed544ebe38228526840f1a2f921e2885454e14f691671d0993f9d82eaa64be3253282e949335a06a4673241eb1a11f11e714841388885d310ed124fda4f159ee1ecf7ef684e30213847bcb7c85fd01a227f64f7a181c6159ea64e70f992d5ad21442be5927a2df38045208b0d4a41f00418c50632e75c3f84779ca0675e5585a0870aae52fa5f572c40453ef9615062ea4b69f3bf0c2e877bb0a02202fde2558b84c3a1cb8c90d94758070c773d5b8358104db2da83d587992430ace88dab1cf20927da49893d5bcc18fb4893ee999c46a89b8d5fb98cc7aa5e38239c3b25e150ed040ed8a763b10101c6d3bc0a46d276db1b0a055194b58a05040580de0908c2b66589052b809128238b9dc6784d4565521a94113dc04be48c97416582869f19802e1cc543c2db78e779386af46c7f3705dc0d44ee78ebdb21ec498566ad47713603e82c6e3167eb89e2d9eee5bb41c3de42813b89fca3ea6624f9ac75965da33eac52b05f9fd2f74329febc5cf5a237ce534c8c7a5722e2441ecb7f52bbb870f9612ef94d947d60065517545d511587ddc861ae79d1f37c73db31518524a2562d5488751e25f605031deac51ee343fa34e49c36cb4f967416ccc7f8cca082c97bb760d7fcd75fe4d5cc1784e562adb1f944069f2ea3d9b7c930f1f0ead184ac339e1c2c1015de2e80da57c8f71f0c3d176e624b95c8748bdaf71cb80606dde93880c3f76566618c09dcf137e9347e353a4a08c457852ec91a02d9ab1f8ea280b7bec56341db1db0df10f163c5bf2bdfe466e1913c1bd510fc326627e55cd6775ca8b03dc8c072f758d0a8d8e29899598f917d7cd7f102d41b36d99eaf1ba12a92da8ce5dd05b76ab8a6b4e769f5336c3d70751b875917b6fba13d1ff4ebce141bb36645a8bbdc3ce40693d60ed1239f4f8b44f56ae7a5da48ddba6c6fbbdd9d9eb266375b7853fa596811e5c95e732be71fc0c5beebffda6931701d31c7b1bdbc99637a0b3603f23200b15038eda0aa647fe68a19cfd96b2962338a3ffb4aa3b8024fb004a7111c52494f435c09c7871fc089f6c0043ea1452dc21a04e4e9c816e50f177b6f5fee0026085920e777af824f74418b555c0f0b86c53234e80cf5d1280499672740c482f105db9d56293fdadcc33b1161aadf3e6588f47e0df886aa60601a54e3f5f67ea1269f86e007dc13a1cf00dc401885a31028d08b2db8063fa5f25ad0056910523d2f52bc89dcbe769ea0f1cfe3dc559a3ee0a38a770f90784895b8eb5099b3b7da8bbfc1dd82c50448d6987f7b77c02a6d14d550cc3d4a736663dfcb99c2c162ac3792e3e3c801b947fa26e6d2fe541a1463d50bf047301a21513872ed4d537fab3686bd7db80ea410705630031391cdc61a44f835e5ade519dba13de141ec1bd7cc66ddacf0276a6a7d785da29e051142d12f8bb5421da297695531bb6659a71b02540fe1fe2c82101946202aabbb55e5b30cc59a539cc1e5a3cbe436a9ce6ad189c89fa41a8a483cc3b243dd91c10e86b829277545f3d7930967f64cdd35bc7b796a4bd8007983de22d02de28772a4792abfb3d28b10b3f096fb779e098e7ef665b935e5ada2449c89652ca90058f0593059b67a787dbeefa79616161617d2691ede37708cf0d7285d4a3fc3efc0e89cae5c7deac37ddd58be131f4113f2e6d48d061bd5ebd90a57f1ff638f53bba10c1f69e17af5e90eadfd7ebd50b36f4efc352d49e0bbbaceb8a64fa817e6bf7e9e377c8ce7d3a519c6138e41a5d7c3ea28b1c7d5ee3388ae2388e432239baf8b42712853dbc769e1d4fdce278fb6bc33a5c0a9530188d170d1e717f7b1cbf194f58c96e8df7c9258ea6b55b58b704e01dd2f387f7a98dd50d528fb65ae8f973949e67b05b1789ddba4f4376fe1934766e52cd3fe2a7454a4f6f0aae14cfc520861e2cedc86462c323894b3129a36b85e2aae859e4cbe0002b8d678b7c3b873d0ce59e275682fd3d6d93d33639cf6e9b58aa0b33f5977bb53267fe14b16fdeb18d7177b11675f746ff7d20d4a3eb02049d4ba1d2c56d1496ddffc0458cb101171d4ddb04cbee9b3eac132bbb7f82271cfa75da62a1ac137bde0fa1867effda33b55d6858fabd01b433e8d136016174dd7a6ad778316e12ee5ae11d3a617bd9f33ccf3b327a9ec7d96cbe90925149d6659a2cc7ed40e9b444917c5712f86991056212ecd35aa566e1f9b492897d5acdd4207a3eb52594f8d4deb03958f87c6a5b28628ff48a6550514b521c581a9675c2b24f5833b0eca6b5ea56ddcada5869b5aa48b7964fd566a34e23a3bdf7dea5d1fe25acd4d17296c6d2db3e45dd6ab5daed760b4b5e7b987fdb38f5cc76eb268db7dbed66b3cd6c335ccb0f55e368564e65da9fbfbb753e45260fb9ae57db2b0f25783755cffc3fbcaa67cfbcddce363b40115b7fdaf15c2d6a1f2395a9f6fc220f4f2882a3d106fa6d9475cffc308eb1ee993fc671098e8b3896e22494bdc4ff7012cafef32f4e42d963bfc34928fbce7f9c84b2c37e6986a9d4a4129f1f4b5526139f9f03ac746b355dc35a6ad2cfe7f2f3e3ab9ab4f3f9b1983a032b5da92ca3cf8fb12a53d14b65a9ad9bf574b39e30999a04fbfc360a675526f333ae6159fe72ef5994d6b886d5b3f746dceaaf63f81b487491e30d31177661163dd083897ccdb6cf81b8edb78695b81b6783aab2fcb79a4d4aeb9d391abe5559fe8e5665f939cce11957eeadf5cedf81f95c4562470ad1f764a87af5b9ed3e264a74b48ec62496ff431e12dcf69ef2e776bbdd7848121ff61071db798c766c369bad67137de833c46d178b62505050503eb0a10f4b216ebbcb8471348e56c646116c17faf047f4823a2db59be21dd53df3e35bde9f967b7faaf3adf6a76714c1f6a00fbd0e493dcab947cc50f5283f6eb33bab1e5b4705f4f6d3cee69d403d9ee822479eff9ea787e7f50212b517a44320d03572e5e6b8873f5ee5f287401d570a953e3f6fbbcfa8814fff31c3d838bab846ea91cf8743e2e53af4e9e9e1f5d6ee99ff76bbe5e789edec90b1d96cf945d8ab1437bfdd8e5ea0a0a0f2bbc08fc6d1b05207b569dd169b22ffc8a9fa918d5393b6c9a5d66bcfdf69a94750573d7feed0f4fca19996647aeec4f49c9f67ec6c4676dad58c0891e888a8a87adaade9b4f875a1a59be4fa69c56100b21f242cbb5daf758825a4f37c7c2f542d53cbd8149ed7d9f7b88bee023144bf5ced96b12cb83136c5fd2524a4f3fc2f2f540dea96b15e0d2be51b96ddf2ff3c91f22de54aa84a1d0dcb6e788c65d135d914f7cb205b85ce43a167332db95bbe754d3de5c6a417887e51d0d3bc4649bffff18ca6a6b8af794e536ff5c8c4baf1e052a8cc6aee795f879fd7ed18d879278a1304b933f5c88e2eb833a3b86bd7bd97df33b9ac7b5e1a56ca4258d9fd364ef988a7ee9950b369beb1e99a2c8b2c040addcc2b61abe7385afd663538329a7ce3b272d64d3a436e34563dd54c5e30dd8473193fe76cf36845052b342bf6caf77d25c6fade192664dd86d8ea49839473b6961bcd2a32677ae03c1263ec716dbbb5b37b8e1ce9fe9171347d80c0caee9b9042bf58b6c7fd403d9a418346b7e5a1c9eaa92552eb617280226e9b049a1f5214c79101dfeb5f586511b7a8ecdc309fa20fb768728b5a60e2b5f3637e1813612209fe3d11e7754a886091f8b99901c6b9454b706bc4473bfbc123c43fdc117db8ed620fd1f8c2761f5b423dcacf937fc7b03f13e2e786e6fa21febd10b734b3c902f1c52d68b382eef51637e87b6c0ffa31c717b6f77c08247e7cbfcfe88287dbbeb96d02321a5fd8cef31ea847f989783a0e2630e39e23d4a3fc18acb02d2d3f6c67f6af1c4386558f902806fdf7414241404045a2f6606c007a463fb717f18a9abca23e1ce715dde1a9d85fbc76d88b24bd1e4f8bbac32d1050a54ad7db5eba4890670ca12704f243a0ab976e06e1a74b5f4872cf04e19ef9b9a5bd5e28d837b5b096b662529ba66dba677e353d3f08215426db7f86469284386ed9d1534be40b6d045d262cd88eb6f7c14f6c5a22c61e16fbc68a8221271ed97918a73d0afb186fc2f128cca43dba639e58667e3dcaff227cbdf4078e2e4410c557e542fc7a859e087edcbef8e24ce9ddf899269cf66934feeb9718eed8d65a6bfdba6ad082de07eef013288cefc0f89f6f845d3ec05eabe4d0c0aecdd32824ff43d708c2426ebfeffb7a7a88402e8253543d3540d0131528906ea00043c4aa011020924553a92147327f2af625ae17403df3e8893b09e99ef972fdd6de10ccf8e0c64d71ae1fe97957086ad203ea99633ca02619b12df8c8b88723c79d67f4489204c1b1c3fafb5ca4d620f8fbc1073fd4dde862cca1e5e140f0234df013b5fe3efdf1a0978bfcbe4f83200886600fb73ec69073dd6b24edcbdaed09a026698074936260abb0877cf770e4de6b247148819a1482eac14d9af1410e43b0f3f967ec7c8e797ce4316dad1e65eb344763f2b70635c9dea8a79ddd184e569ce7ed0d337d76933cf8e0caf2df3ac722f911417389a675b2a6d6b63fee506ff132eba19beebd179ad67b9e9dd748eef09024f97a9124c9236aad7bb82eda167a7e98f891a4388ee33892a1abe2f153722479c4914a4a4f2d930bd050c9014551144511c418638c3d8c7187bbfc60288262500ddc7f5386e430638c31c6b90b7aa2dd64d9e1038b1c30529c94a8806548017860d911e6ca98f2c7151ac6f4cb6bf7f9e65c6bee6aced9c4782afc7617417f026a07f273cf1161d1f83fee3fee3de644537bb4f74d4f49b83035965d15f2fd9ea4e4f4d4005bd4fb265defdf889eb92f6776d9f7d358a9c4a1d796260d932f9e87adb250f5b456c5b6183b6371b2acaeb694949013b171af542950c28d09d8e0865b3d6be738174574fc1cbf1dec80bb0f7fdff775994c69f48c392fe7bc7f54a6b11edddfa9b3cb7bc68674b3e7ae0a7faf3ffcf4f7e98ad46b5d42fac7f8336dd979af4d9bc6aa4a2d30b6da763884a1d57225466750a5768923a30b8a4e1e1baf6572403d1ab1b2b9e4eae992032a53fd189685956353fcfd7d41f7f7cfbab93f12cd94c30acd5428abeba9ad63e55816775653dcafc3f5986bccb8d3e9b74e3dbaafc1959ddaa8a8a81a757fc6d21267a65fe62d1b350ecab2f3a0e3b7b8a6b984d65aeb01fb2488868482807e4a9f1e9ed80eecb55de42886e0a7bddc71f8d6a37b047f8b7b7df8f2c5c8979b44d5535717b187d778d8bac8d446097a7eeede1af7292c106d252a8ba39ae2fef5fece6c3fecbc635bc6b5755e18ca90510a9596c63dbb19b5d36a154386ada796885165ba4042eaf77d9daa5558f47a621705b9be3e006c002ad3ebebef54d8d7172d0bf2eb9316867d7c7c7cac8f4f398ee5f6f9108b4b58c93e453d3de1d287688a8ff7c9623d3de12d67bc3339760bced69fdaadbd7f5b6bc7711c7f83200c06fbd013456eb7ee12569af154d6adb21c4928bbcfdf2035c9e7f3eb6d9c6ab72ad37d1a817e839ee779fbc3dae26ad8165de4f88d1f09f44016abdaa82acbe5de58218fb889bed8717f1d5bdc10d62647af2d6ed8c333ba007acfabb1ff83c1fe1b15f0ea30f3d6ee1310bf43e004b58a160f27f4f2a11c68188a98dfda0960c0422faf68288a970f9100c59c864d01880f20680d520d5aef0accab992baa2df4f2222a342445cc69e021360079426b883a14a982e2bf9c4611155a63070bc5e6e77444122df4f28ac30e68b845ccc1a91b35352ff1f2124350cc69dca639488c406bdc2b55a8be2b30f796f4d0440bbddc8ac982863b22e69e0f5f7eb8a1616c07f6da2e7214397ced58633e1e14199a64a197d72b4bd01ad762ac3b43eb8756147979655cec9edce8a2bc27f7e2879dfe4ee75e7c93fb9d5b75077ef79ee7bd8d7e79fa1e741ce6af7bf066f58eb3dd4dc248258475ab8f80ed87a01b8969830e20ac561aeba95b7304dcad155610ddd60384d568f6d15ed8a9dfbb75768031c698bbd27b0b0c5fc45bacecbe97d90e345cc609df8088267e935a2ffd6e61a5adad110cad9cf33c4f3b03bb3bdb029fbb352890dfeead17d04cad976efffe0e3b9429238410562b34533bebf676dc3bf36aeccccdc50ff13572cf2c5d7f6a677806756b6ff6fef4d6f89758765fe23db97bda0e2a13eef65e9d57f5282cc591fc6a95ec16eea032b9ded6f0d63def567eadf1de443d7f4ad453bb75f5e2769789b5d4231e36064dfce682d9dfa7f84d0795e95e55a6ee2f7ed24cb51ecd746fd1fc423325eaf853a2fe5d81a02982ad6367e9d7ab979e5e315d73339714ab3059563a3cdde7613db21f84f12dcab2d65a6badb5d6e25bc36edfdadff6de7bdf72bd1ad920c2ad310aa5a22c152d36e040280b45b562c5616b24f4558462e5de980b576bad95b31c874da90caa6e4089422aaa14ac73d8dedf378cd8afb5d68e599ce5b2ac94cc10464a181f372b3052ea514deab85aaf3a0e53a98d8942391e2406d5e10c941b28e4e0a10bfe01cd1639dcd51c197ca860e0e098a11c27e23174433b4ea3da8a58b2025a03770902f3324846b7b734a1a19da9690489413973733b36a74288992894fbebc47a9aaf1082621a952a0b0a26a0353c1e51507d57d8d756d6d09004ad91af7c41bda921725c416b785523403db3de15365019dad45866f5eb0878ffe9a008e8af91c7cc50ef3f53ebad3b8769bb3385ee596ecc4d1a1587295a5cd01a7808d47b1be87957dcc7286cfbb9c3a6a87b8a82aa8daddf1763fddeee764284b5cb0a6c186ce58043ea4cb718f0a892426b586b4b085f2f9c41fff400ea99411004c1298b6dd71c7b96d31da735893ff0bdc75a835abf401ef4d21fe40a22f5078d1a04436ffc16371cbfef7b0d63834fb7502384124c8e20f81e07ffe35b707fb9c8117321377ada6ae923b10ff991d05549dcb9d095bfd7a3fc756c9103c62d1ae33062b450b33d0d43c3a66b8efb38d5f4a37be38b6aa6bf74a8c73bda914c6d74182d102085c113c5298ee34f180269dc61bca22ece1b47ec799e478e6138ee8ec9714c4feb0f59fc8c4b1c47974b74b98cead94f0b541617b029fe35f4f561dc24a1afbfc14d8291f8fa326e12d1d7e7e026ed0ffafa1edc0a54265789b740f615b4f66600cdd43dc23f7c10e883f8f843fc087f21fe32deb4843cf1e789c7f1e8056f016f5af2996fc27c1c8f163d91ec4bf0a625def946e7e378d48210ecaf63c77c0e64daa6af9b3ac807b9ee26c8131798f8e7df83dceb26f811d97f6611af7745682ac93eff08b2dceb0883d1e96432d3ceb0ece476c795e5b780d7bbc2f4617938241548b68a9e874ba15277f944717e1f297edd1b3d87dfdb31ecf0533bcb76c776089ea7895c23095a226b4118f8752471fbf7b5b8200882a0fe0b581620d414f973aee0fd7ee8eb089280919ee7799e07fb908888e4767461fb1d5d7c23496271dd8e53268b786e6ce068fb68ede8e22b2d167fb8edcf6d939d5df187d71e12cbf6216e7b588a43bc767088137d71e3d43d6e5f0c79d04ff9b5872f706c5bb7e391222e6ea27a1d8f98dfe2ce6e12ec3389cf6f692e60ff71a22f7584b929d2bd23dce7c30c12f1f4caa58d0a7a42f0fbbe270d361b0c185a23c1c89cd763a7d536030bdd116c2aaacd8ad3a705dbe0386cff0234dcceb43db9685dd6236cfe04d91368ad753d92d970262a2aea7f700823a0a86971a216e741054e7cb9595d0c19b9e3f27322d8187687d3530cabcc11206baa55290f45093a2a2a2a0ae9c44a48515869739d3e61cfca1c352baf08e59bcd667a169535bbcf611b35675b257636b3b3aeb18cf7f071c77126bfe8d561eff05e128081ea9ed5f2a4d47e5d2fc0d2e9d6bc5df64eaf54666a7a8b9bdab88004b6e370c761136c6c2f508331c61857bdcbb7b47ad2b0d2d6f59c615f5b952a9794386b8d9a4a4e2f2d2d2d6125eb6469b6c912ee6896e6c24e97962cd2d2d25216d7a5b6e3ac9794e7755cc7853eb02c3873888410a2e889f5e8048ef4fbd2fff97fe20756ba596b7e8004037f8095ba7f990c3bad37fbf45876bb6da9af37db04dc11729df7af398ec3fb7ae972d7711cc77de6b8dc19a00428ec618c45b03def2e7b9d19a535e6300b43c42162f6654bc98c478c23a654cde6c02112d5031c42de2a487020d991af95dc7158c55206df95128343cb54161482dc9a966c40f243cb8513449004886c45471aa05eab744cf5aed72a1d58e0287d06c8d2718a2ac34474b6771f7f3af6fab10654191e5f90fd9a31ea117ea31c74764d5daeca84b4ab12065586ffe70706ab4a690ab2e314f5083f006248a1a5fcb0c2431d2c5e982ca0cac90dab2a39351881e28fc14194895eab5620d24324523b5e972f778d625b2c53f45a25a4d661bd56e98082a5ac78933650760de8a82650356b9db819dd738f3b0a50a8c08063490f514eb0a1038b93376666516ea8a19ce94156ed5f909e9e4f3dad5224e869c502d2d3aaf5a3a796e66305fb344418179e56e094c606940d0eb319c044793323024d97c850c1c1c309b72b2550506c8e8132e50a13323f7c00835e33adb711ca7801030448972d3ea0a99d11808d0954769880c44c0ad0d43e1505f1839a1b25d8aac2064d6d936e7b68c0e30b0c38603941192250fb044c550a344cf17062250686283971a0c401e304b5519aa48044cd0b655c40399015a54a096c4aa80841ed14203a4cf1c0e6853150366a6daec8542591a1cb15d456404e9a2c543f8aa00384eeb1068a4b95312cbc41ad546f718f204ff07c4ce9e298b0022f425668da1261cb1497245da69ebcc1546c465a9736ae5a172d659600a1e1cd932a5c181b40a8b4b0786842810d737290d08665604093189a72a001320788e805ca0e5a5a38e3a3693cb24354559b1b9cfcb86956b0a142044e92202ed0b4442039ea48530d6eb4a85c58e265474d73a45603104878ec488281141dd25429020e55930d30f82033474bd3162c38dc746e727841cb4d181e9888800c7641cc902142662a2042c7849104368ac0319343ca089513f4c8d286b4553335079b98ac3537f800474916189e0441c3105ab4ac7993d95c14b8017d906638dab9a4072744007144123840c2d450035554103ce07c60650d981c5030c28b108eaa832d2130f0507344103a6c3e15be1b8a08810d8e1454f084ce143746b0580802cc16aa17dcd8e071030b5410136c190304cf99408e1a82a033658d0a66dae42d39a000872d45523027052cc5861123903c71523353418c9b70889107ae889a1c572a80d3c30ac8a0b161823070eaa401424d172565ca8019e334c31320b4a2542c45f8604414206ca2d0de70d9b8d72a1d2f9067f6edb54a47117c035a84181458d9b2b0668873a58b8f3831cc80e507c745870bfd362152650d99393de4d4d1a0890e215c1bbc8297f497908cf8241096fa9287b484a442bc59d2a4909f7c10635b1463423ebd56cd9975b0d7aa3a45c4dce34ab7f6b5fdb24af9e05d65b6c5d7e5a01f76ac14ca40c5520f3ff474eb1c627a86b373af555872e8e9de258ab38c6da1160880b1c1527a2255e968014dbf5558bcecf27badc2e2a47bbd566149d2d3d36a054e06a01e4edc34ed1025e4698519537aac0923048f1160a1a18de0ca89853a6b6cb0f04385aa1d4c6c905365ed97679fa2a51645cb0115258c8d245337ac7cb4f044ea88145b557880f1f283962c6ca83c395921cb981c5436ce870ba48083ce10408c647141d73a47e4e848410ed691262c0048818ea93838c4a0c6884f051b4f32140963e5063760cea0f52b06a2d8132ab820077c420de67490f1206e8b5a8e810054d4a3fb4b96053657d4142653bf7f518b92dde8c4909d2ef55b810fca25adf72eeb920eebcb4c58cf74ac6ecd112e0b314dc4ecb85f654c0c5a96c9087c58a17609962f365c65ce92a85a35a70b8d052d18b4b288f94d020565f344cc59707122a53f11f3bbb5e3072b50c43c9598a8842df80431ca10321a2800000400c315000028100c8643229148948589aaad0f14000c668c4074523e14886449100331848220c61863082004006388310611538416015856b787dbb7401626a5c68741d235bd1875daf2de68067da3d95718a5ede3ac3734ec0d3d5757f8a62a6a55e789a45e57519174557d48988b0a680d178b4ca6deb34347ad52a7fc37460a7566eda14fc29674565fcc7d04812e965bc5488777a0a7ddaf2cc80b61067846a92cdb2382d9d3a377d36c092b05be742de91c2dc2b314f9502097ecd15a19576aa528983f053c831d02f952a45d82ddc7c217f02a5adb34dc58dd99df255e272a6a4a5792cb269457fa58aaa4bbafd08474d8a3ae3667ce3061642e94925a481e6d44e088c04bc66dd0987cad73088c3b9370ce7cb583369b3c4236b160ac3d0268a38dc7b9600298f3a9eea0922f1e754a7355bac90c94900c1445f6d37947588406489917367d8d4b869fe3e7569d873fe0edd4e73820b0f02978f3d815b1e58f1e633fc2bb938340d423fbb205e66997aac75830514ab5f74bbe79bb8275a5aa3c7d0d50300157cd017cc020557811b331ae0c5e898f53dee5acc93154989002e7fb27dda791a0a4a9353a4e19da2c40bc86ead76d918ee96fb678612283429312ccccdb9c4da703157dcc2865459907aec6d3714011049910322395ea5353c04f2fb7659f1af4c13e7f34e08154a0fa47c10d4a2848e982e0432d0bd0d6a5ce05dea68e523a1331668506bef13343a0965e277dbb4bfc83976b6d570a57eb72d23dfc06ed56d82543e06a21c61f55a90f2e6e8cfd2ee505e72dd58d03694441e136852addfbbc066102c08cd50d8edf2de0a188f823a1b613b4f6ea5d4340bd6bbda1517d37556060208731e05c2a2bba7b6c410a385748dcd581056029d295e79742fa26801701d9344e66b92c7962d83828724a69aa9314ca9a6603325450723a85d4a8949170c25eafe43f5b518536515d5e60ac0f5f2a12941e43ec81a6de238453806ae3d6fa488e3f72d5750afd09cba674bcdd2244497e52d7d6bb26df8da1cfc81fcd818048e588399d0ef4e63b60a6d3bd2318f6440248030ac3ecfe77555e27b97aa000df4a8bc1e4c9c308a32ae3f3445e93a7f1bbd46905ac0cbeb4e854dc151eb0e91a17168a04a2ea737d97c238cb6a348aa22f3d7073830daf534ecee65dc95917ea3e55bad3b6cb12e998174a061a5579381adc48a8556d2bcb5cc5e079fddd7a8023bc96d02c77e35543f24595c45a6830be7cbad090731d0e83f9451e58ae2c856ab394280bbf34e0907f4e131b3eeb74f6c64707d678c8d6a26edf8e6fcd93d4a52785523e4848e1fd838e6de1c0046c197b1a0142198d05d05d3cd9d9adb1617165e42297c96f10ddfd005cfbec86e1a65fcbc9ac18dd65c74450ef2f7d35f260c0a9ce92e52ab0ddb94f2b017c91359fb0c8246d71b84bb3a5bbd330aa730a748c27fcb670f5672699595e924197a693249db6cfe8a9a70601b49ced6c6a1832cbd91253c31c8898666ce04a9976953052e9e5fd2e8d8d4f21dc7e0bd36931617d4097bfec3356ab8fa6f9e8043cd2640f0dd6433fa3338a4257444c5250f7b3ff4beb089cd1d64a3c5d5d787a52d6a8434c74f3ae876d2b25d18a3569007a521e750611ba47922ca727e11aadd56ac58bb6a51b720993699141c17a4dc6ba29a2d92a22514330f50718dd1437e02604dc18a771c01d8a5c27fd36e31d7a2d502e7aad15755fcf8a2d616eb6f78bd32b70a3cb784bd1f4b4784422d003a1baa7cb2bb6a8a5d2c77e080d8041c5cff3f7902ed6ff30ac3e95fa8875eb0004eb144277a325068f14d25eb5bbf0e2c20380dd8b68742430e92c47a2da2654ea9526b206643b59297dac8a6c5c40498192536c8d06cdb7ec48164d210523da2a5ae8951e643ebeaabba56e192e15c50f134db340d961577626dae1c06259924d9541d93924e4448bf5426113c89c309392807470ccd02b56e81c6c450985258f1316ce9cd2bb78ce10acb4425168ed288c3845047092149d78aad5fe0ce61dc0a169fca6f57072a590fe1052b06495ab18f0cde1668e46651138890464dcf4187f806a9167496021ba6bb2c82cacf9fe844fea4b0a4b3877831ccb8741f630c2c9c499a7054ee8306c66815e96e16e60668779b84be8c403899b563d418ddb7c2825b72220f0813ef322d20d4762534015cc7951460d4faf10f6a3e846584041a39087df3efa834cdd06b55f13ea263b30d604f8e996966acfcd97e6f88011e41517cd6f402163e9207969010d55e2141cc44a9c2ed4a1e32deb4e5bbc009c420f0c05e835ab99ed3120bd95a28c7553b71865045ac058965c588f5cfc5faa52f8536add56ef7956f42fc1928ad97fb1f70156a3faa17d05b35143a200233d53ebb2a457ce303351a3bf9d25314926eda06c0ae66a0f1c44ad5266a40c5b754236ae1e4bc5d502014d6286037af7c0fc32f967890460bb1eca22a3f5395341fb10395300ad34324b3a7c1215f293def9e760c04ca780acb98aee065646f43cc0b0c8f0c3378c52b2b8ae68713398fc769d0d0aef1c9aaaaf54d22fab48f6c381be4b015166bdbd112a9d60cc73876da529c77d62ac21c9e1d80b44d4b56a2c89c55a636996bee9d0b08e4c309ad0f14716a66790283e70552f758e82b24fe73f392998a9e56daf04768fba136f4832dfad2c81ce75134049e90e833c60164523964fdac0f3c96bd96b0238a33432daa0ffd8553bb418051b44f49d13452c4adbda1d07ec607c1150c4088f5f72bdca5fc429b98555a4185aee2fe91d86702e7de76b4d1bb94b6d2992cacc6e6424efa540d2a9a904ae2ba1473248a8fa33cbf7557b6d1f4ab05d77a310161ae85784c74bd2b99f2c53bea795c0c90414b15ae166054cb19b36f542fd9f5affdda432ffe47a99c65e1e71f8d338aadeb8b7e4bac57c9f4b4f2601529a39d3ed9e83522d56492aa4bf71e9bbf25f94cc5fa0094ee9a4ca77a2a55329616a682ede8364c3ba28c7137fa429798dcb7d2f26ea0f9ba747fbe17f6551af965c127e419d51aa4d9dfeed0989b7eef8ff724ab512493eeaf7a55c7659471efc75874f8966c577aa29daee62dbd91f522b99f41e54ddd8590cda0d3697683b267542b6443631891f32c6231d861dd309c605a610f73481036c53590e967e44255691bc9dd1e355745a57580d3db2f6cdc30fd14e9f98afe59f10f547e83f78ec57c2aea3fb1c17b89303d0661d75dbf7d995a6883af4c4d52972b4634baf3fb069122dd8dd76bcdad2d0794055ee14ffdae962213dc044d8d5ec8afe01edc79dfe3de47cbb3dda1115c360b55a65d4d02cf177f240f0a2eb3afde069e928627f7a427d671df33505142be10924b22c2848b5df9372539041799522c654fe1b290e146c761ddc71c8094acbb2d64dae060fc6d78d939ac314b89d3c6c06dfc8d9c30d85d26c9c18fbfd6381c624ac2ea294d4907fde202aec02c05bf36766fc9d6b8075c4130cebc812329c2d22d3e0386fdccb5a72f9e0431521ffbfe845b02b0c2d74a26099b203fa07f8f429f292a75a0178c9106321fe024f685b80037b13a59418788324eb4d422e34922fa74b7e3893a3716e87be0f6205c52fbff7714bf799efa3b2090af73476d249fbd267e6af3aad29645cc23358043d8ef537ee86a358425c5ef19c285090a16c2012a6049b9b0f999597f328b3f2b6e241db54dea265fa260fe73040b1185799f1f6b9c6ac56e4264fbf069d8c1e28a837f1e9d7a0de59dfdc5d0bb8b94948761b0bb3c6e7fb4c9aaed1ba52de178337d754dfd076ecdbd3b8e590a863a8adf2b86f2baed0c59fcf9d46c8de01352389b54855dc44123f174ab4a91c3b82d9af22309d0e233f2353fae1cff7c874ba00b9d2e9cc411f690579e1265135123a5cdc989157d015b1349a24dc68246d0fa5cc222c0d7869f77b5dbc928868d33da91f721839b7e6b286f2291566fde9312964261047202dc9039d1024673d75f34045e7336886805053b8cc76890ff7f244b65a90bbf57137aa13b5a4121074cd34a30d68b0ffa8a06e17502e844b0cbdaca96ea67c656668bf978f277b372a4730ea4895a5b61f16e67dae5106c689a3c6ad6b1da23ca6daa4ead7efa0616e1255407bc33fc64c69768703690562949b98d523213027e5c14bd20fdfd58d0dfc0047f09d8baac11e8362daeed8067e5c9b33101c2452c9840aa0139e0d51bbee23b4e0c0942d0f26841d655612c15b49c02d9ab088a6cef67fa65318ae8ac23c7ff5923ecdcae2c6919ca35fb962073e35b3312700d23af281a76e6d12ad693a883796c667fbaf9190bafd483fde669a9d2982e3a7c857cb39c235372d829174adf22c6431520fc3673532a4157df0327ec5e3dd670c4e94e93499ea4b73947921e79dbe2855668a662beff76f2f9f08440ed9610acec2affe01566d1e4b306273f48c9f5f77d1186c2b0fe6a76d94e32237c255481c9d9701a9d7989d70a792bfc62eb6dd97f8b3e193a6133414b5c241f5fe30e0004bd923b25ff61ec64c224b16dae085ae9f07e75f060bc6ff4856a569c8cf69fadd68385f2f56b2df02a22fe24dcf5a39d1fe75026875bfd7fbc1f006df3843c1bd405883b64e63b26fc9c9e690369c8e8a00f1d5c02d11ca8e2a9cc9e03b0013e18cd19c700962a4f44c8752cd4d25a4f1d63f06cbab488aef755770881bfac77107768c3ac448a917030d7401c6839e1a941791c0f0932f238559c2cfb90645780a86a757d5466e7541860ba2cbff63008972a01ee4067556a0084b5b57a99f9ae4f19266efc0685660d62dbe7a27d43ac0e841bb97aae96d2418d6c992ba0d51a4887cdae5f8a7ba82854afc810866f09dba8fc4496fefa2bcae0c7a07d8e80585b938b7110355549fb22ab31ccf9c367c2ec105ed6d3c39450233ca58f8a3882944dd393586601c416a9c4693ac52f3a2dbba9bb0fd0e94900507b4dfc831004ab91e48dc48ecc813410476e7996a69f6b57b7103bbb7c91557e0892f0405b7f0e02abb6fc68596ffefc7660a60e75003cd4cd614a5864faa43b47b922fede66f26b1808913457b70d561e3cc310801902eb2bd11d7be385c6fd0a596e38023c1fe97aa2f338190074065061a65f9bbda278d63d64814a50a6016113967926eeb8facf8b772ce676d2005ccef7e9ce8f3b3a3a224bef2754053c9501d75fa16ef0bde921186973e23cb586a03184ab4bcbeda4f10308cd71834b9524a74212283a693c1dcc19e0714e39ca7b446e841e72507502de3b2281fad746de3b2a04c62ab257a5af314dae2f0a0c4f0ba4c901e533f17cd7e4c4406b9951f5fead807b5c5947348bb17ee134b8fe66e3a19758770e6c02497a322127ce4f47f8b5a181cea955c3f29696c0d8647ac412c7d7a8adbc783307649816ec4ea71fd37f65f7fb488d90d4b65669c58f65a712407d5663eee2278f2aa1be0273974e0032722065c10187d832de6d750bca7a18a1deb01d8516013caccb9989b4f3ab089a64e1a4764d12a833a2d5b4e979e3d9cdf940f4cda95db18efed0ddaa59056e1269f4314ee1ecae1b771e6c878d53495879cac1e75d5d4331df945b391c68f827490ec6f6ad8f31d49c34775285327a00d740f13c490622ef588004693f02605f48fbe35d4ffff47c622569b36b255e261d4c77403ee749d1030cdbac881f4070026c9627b307a09d419ab7ae9b2cc592f8713f8a1b0e03381d31e403640b154ffc8d0c9b2b9976cbd1323b752c66a06a2414fcb4fd57cbac4471278207974a17675316417e314ea5111dfae6162eb7b9b0b9a8d6543974a9940ec24a9f2a3c38d9ad834ec7762941f98395f9224dbc11e45edadbd0c4a072c0f3824faf2e8b50b5f67f2d32cd5a195ed481bc1f1fa7698a6bd4964325881079c03b4c3c3517135955034195542756caa122a4a656e1f4de72f0e4137b4157f156f15054512313ffaf902bb6f73e7e426f719201ee5e84028e01f3dbd04ef6dbaaa29c0443cfae133e6ce87081fddfea210da7742f630a333f2d2f56658f9033f580385d867b1d41fa983580ac245ee27dbd289202551634480db781c72301152e73e1e7decb3cfd39d1e13f215b0b7c0c9d1bff48a4462a312546119e841ef3352cc69e903dd38c6cc363d94104a40aceb41856a0534e761308e5b1d63ffe8ca9d05f0107ac707249e7af2888ef8a5a2d26ec66c8ad1d230fa1d7b5bc88230e11a6cd593e916c59cff0117f8fcd2eb576737fecce367978c689e6af15719d502f377401b9813660edb9c2204f33604f3ed15c0a792b93714ccea45593e1a6539ab7b526c3e1c5c2f4a8ccea54758c6671a6951f97d82094584a496f236db5fcb0864755b79cd0088422ddb48dcdbbe5e80d3a30c4dc93257f3969ab30c8bee7814d52d438728ecb41758349585ba73478dfda0b99c4fa066d75a9f10bb786927e431bb6554fd02c81077a3b319dfdd5e1c0b35e7b12f78a01fbe119cd6e3c8756c6e95d8854034b09ab634af37aabc63bdaf73c5dace0b1a927d28bbf1caff48d13c997e6ef119e10fd75a10cecdda057767171300f18a8109ee73f3d03211ef18c52dc2319ad4e6f157801039cd1ddc723ab745046c76afd673b77422d7219f9632a4b8bc15f63bd086cad289a6eb656201dbacdcfa05168726632d5e9cff34efd767fddd914b1be706d2c3864bec178fd376faf8d40a393c920084ae4540a86920a8ed8dd94f1bc09a373726eabdabbfc1bab242b45575768431a7de3b36d6417683a39abc708b9e059dd44b3ac37c6553ef9b57d8e31bedb4c974b0421dca41dd3f009da87d7650e2cc62326c5192908637a718db763cb518c7ff7810066b53ab82b191eaf6bafb8b3a3978ba0ea15068a6ceadb850e3069a2e3fec8b32e31fd2934231563e56ace05c6ddaaa190b35e6455e2e323856d2a352c90daf1c09c3977b8ddea9f7cc3280c7e0676545ca93fbaf78b7f23dbac4f45d64f20dda565324970359b908e6ec7b84ce42b84a41656da5c67c2974eb12b3e6802c641cfbc1ab4c643c12c16c3421536601591cfdd2de94f459de3ed372c6779ff23f06cdfefb08bab7523b1d131849ffe9926cb1c77bf2d6565b4c55e0d795e5cc70a4f27c16dc76601e456618ae1250ee748f50916f49925d5be50164519fdcf9ffa5cdc0b0077accbcfcd2582acb7e1376934b098071abee3d8ebda32425dabc3d709302572761ca32d5fbf2ceea91ccc549cfb4fe6743194ceee28080616146cb0a6c762a01ab30784879afebc0273c8333d4c71fb603bc2416334fcf48928f761e76a63d5f2a282f03fd701f22b8649f1f6cfc3becfc53113650db2a318943decfb0648b2c3b822ba3adb01f9b335396fe05b571fa2c44ad4978297d83a37e2c609d0d550b43c8647f8f2dae677b429f3b5971b828423fb704c0f9a777ea1ec02c71c180952d0f5e7f09cd036fa458c1d6a2ff0db6e759abf9112a63e2c2c31da1524dc4229f1130c3d76577b0f1f375856ee13902e90f276f88dea6d2e628d4b50a24ded1299132e648080b49d761e4a2fe8a9bd2a8c389dbaa661d51c96db5b292969ea6eb65648b54560ee9fd372e198f63a3d6c23c88bab1109cfd035075b1465f7987be94822f8cd7b367b604bc821863987f6a8f5cab6cc8ea1c7065cc292b3a8853ef6d8eab16f00cbfd49297fa342c706574ce0a1e459766ee375c3ef275775cf04dbf3f42ed74070c0edbbcd2029ca2891fa4623735bf30809112093f269796440c1f9ba0d50c8aa2530e81f2a836d9737f3188e61a5028fca9ae1820fdb7a7f783d3dbceed45e66f1292c192223c07828ca2ec01b46a17acae23881d2e8d2609a43a3a86284a8d1a9f8235ae6ae3ba304ebcdbfa9b8439c7764099103665091bfa85f9bba63b1357b06b5fa057de5962f53b15d0bada466bf2d4d15955212f6ba86c21c928cf71d89e25793820e591e58c4ccaa8c95815c942d567f14abffd91d07d675d6658af28277e905a07f358e3d8c01ddbf6a05377e865beaf56653dabd5acb293c7c876a4a38ec814f56fff65650935c8ffe4c650ca83854763e7b07e7c2c9157d7d551ce1a074d54cfd903ca2cf9d3b25305b863feb6e2a0d4610cd9eaa766deabeedadfbe4da29e549b17a63f15e4204e684200dc01f6743d85882911426a44f037d41bc14f6feaf98e2c9e582c1c21092cf9d3140f587065d4a07c1620ae49eb02a28efc5bb6875161283d38c7e923e01bfa2d9a46261381c3fb0cc45b147e49fba0b1c321450b8fdf10f9124f4700d89ec8c257959b08a49b02c697a31c1ae5ba96950cf8fae36e3dd7f0a0441c81d83497673a61c04d6801d34691147c19d4702431b7711354dc742abbfccead83285b5c17aeb6615b83e499baca0b08fd36004ce836a332234706cef5761390695f6510bd11e02b0bbd5058441f808fac3084ad30620516a44fbc575939acc60111f3ce81b0bc76da318823e1c00b81e523dfa62ed1f8eb3385079c7f48eb5b8d4598544cace0dde2fccc9e7d3db3b61b2fb93f145a696bbe7ae15436b5e34c7639ceec6db5ff43187d690dd8dfb0a04ad316c807295b6d91c91bb6fa40c39ee65bf8c1e350345760b96f3775cc1e2c5ab4a0b7f262ec348ad317de1b042cfa45033a4a3c5b12d843c1b202e6832b6bc1872a15e522340823f527a91a21f6006b81584df8ae80cdbe2bc43d4eb3b2c8823e6a287908c8b3ef85304a5095b4cff446b5494bb3c94e2dd187a19bfcf1c08ac14153e07f3b7f158212ea0e9b216b567c12ccb0ec8979267507e92250cb026a53205cbc1a90324fa3b4c4f04e9ed9b4293e3649ad85eed59127bdf92d6302a80f1937185242419179eec321c769f79cf5bf4abbcc903cabe5315bdcb5054fea30126f420a477ab6ccc8da21c5a68d0eac28082c4cb81c89d536119a4ba8b967ea7e700418031f277ed3b7dd7c00b7c5d00ef5d5c4bdd226ecb671b94fa30a33f0229598a4f9590683e1ba35f6613e417b005028815dbf0b8a80a53619d6007158373533cc1622f0d2f99f75960e33b70bdc0691ebecc13870975285749b3e07c02b55249b83c26332841d7711427bc12b23e3797040cf35121138f0fa31abe2b07924deebe2696c8be73529fa24bd1b9dcefc1e8e561f15aac350d3077138fa846ef2900ca14697934cb43a02eee41177ac08981a44e9d73b27abf3f7b83956436c810b5c832c0c8ff271e78ebb300ee86f6088e9a24e5e5001ae33165c26e57d8e2fb0a88705fefc6da7fc333eb63d4a1896fe665740767248919df5a9b0e0f0e47b6c53a726c8be5208b5870c57b34b02811f8d58694a9781b86cafcded3dcb6c2183597f6b48985cb078c1b307da0f76ab899699723fff4eb8061ddb3aaa0700f893feaed7dd4f675e0ad36e745e70a7ffed36e96f7f8e0786a81cf587816c5015bbace7be376fc9201276f11a8ea1938242fe92f3e49ad56f572b417f721ebfe9474751bff581c80624bcb6fd294e420901baf153e1c62aeab7768e319a50d8535678d73225f5553b5ab05cb4ffbc28412bc44fe089291e60b261978df53909b5ee58e51586c1bdb0f4eb390ffb2af96e4d1bb25bb696da851a198991201f7ead5f924a99f514227c04f265db5711925be5238487d34467c6e071dbcc773561686e8e5af0929e9e26275ddf2cc939eec35d194b78fc1099258fbf730986ecaab537580876e981e5b78cffa4f20e88eeaf10c7df8c19b521afdc17c0be7bcd5f0cb16006ee422420b95b4ec0845e32758c82ed58b277fa4030078b0c3cf2ccad40266aa039a28b5e8362ce3b175181f2abee3aab77f5ef0c791a1af2da772bf19f1c8b7e7f9a993702fb413b0f0d73dac16bfcc42ab2d83c083acd609f4a612a7b15cdb35d6ac75dd2fba4c5946ce651d24603608b318844c4cf7af5f7c4d3c4e5085141a4a3fe72e7c92c7796e19088239f28c9d7f5493559e2f09cc2b066af6fac7ae16a837da4b6ca405262843c13eb372dbbab06e098eee488ea3e2868603856e2649794a59b1777689e6732d88e75ef885635159a3fe47528811b999286996f1df6a47f0bc7759c49c9b7b38537708d6b5efd4e5b3805a8d14eb4886307f7b0dcd61199069b568ee0c710bb69fa34edaf79bb876be5f11143746017e2301082c647a48c19c18a4906bad22819c71c7c33d3aff01c13346187920fcd9332c184fcf95add1b14be925937aa4c434bab8c3c699c23c18b2b728e6c94b0d0dc6639c77b31f54b7b9b96588f6e4870dfe53988f7f2cecb782fd04ab0732dc174fc1a9310aa276ccf71176ab8ee237072a07f5742659160520d69085f3f07e0c8d2aee1073d980ecf44207b1e851d45da63ebd38214944a5908786efccc76fd4e419c763a93f4fbeabc02de281ae57251559aa016259423a0e71d727c7bd699c028fbeca00c69363b6d2d923c102dea64978be45063bb1ba1150fb7cff4dbb2399318d1a30b56a79f7730942ac15c200bc9d0c7618107042b99bc2b551f4cc97eb559549038330a7c7419c80d0ac16f23d298bc8a3179554be2e11f1b1a3bb60adc3368d91e2ae964b11841bd1bf1257b1bc9375d8c656d6a79eaabb8196b14b32fb9ff5f481708c1b2171e760f0b863bacd858cd4c250e6436927f4ba6b87f520561ca7e479a5e5857e9a98d765c7bf711aa7b94ddea3b8cacf7747f170f67bad52d175bfaccd4a2ae05daf6afd386302544513a59936792834c938f3e0478618abeae49fb08310479ec4b3a0a34c5c2af9b6205644a6736118f7cae33e76543c153dcbf6c8694bae9f1c9495caa46a15e14142c2eb5c7c36b9096ae948da420e6bfc1efa1bdadc07a7c9b89d8a28f636f21dc8abfe594deba8f74cb6bf9560321a17ff840685fc017da3836492147b3c2e473b1214c72f47420416f8b3a50ddf3a49aa4a84248a5172ee9d78183b906362e8a41aa659ece570808424aa5b37b3ad1adf43edf647ad91024d1f09871f86fd28b3aa9b0a41515bae47f2a3d948086df505bd4af814bfa8ca6d213fba1c453bea229005c3bb631d7e9f5418b661222e72ecca3576cf2c852ea41d2de9e7912f552b21582de63f228c5c97a9eb9723de87a4fccebe052eb4553afac794ef45232a2dc1b9b112abd83be9e87617ab7f923a5d89b8e5e9596338e71bb345b982ca214953c49b23b7038a83dafdc12d7cc8dad6c559227b8e3c6994611636746bb1df152e7b9550192989acea9223d167bad8288901d0028b4cf3458a03397777139f1f9bdcf58e59c0dcf2c3a0d0f3dd75f0ca8f9008df8f6764bb3fb00f8ff797de8fc978d0805f9a62ea6548acd323cf7f4b2f07bcd1c9bdbad36964cfe25da165e94e656c8024b566dc61b42cfc2853311fb4ca9f8ecd2f6cdc6092582b354287c889037ac1e7041ec84a36635e8344ca1d3da961f67e73bb214e419155167c0c6d068abb784a2db3fe0913433825f1bc40af7bc39e36ee8f184ad2f18a050e9d11ef1c2f843f3d13e879431b3b566cf6aea882128ae26a1df6bb15fd2d6becda7bf6948cad74ed8cca6a688065f3bcc5942ee23071c45791e000d3cca9db6d057870942deb559bfb7958de1cd08f099cf8f6b35e5f206990ab96b5dfa2afae2447f0a9d84492fe348fc62b738bac72f508613f94523b60d08ecdff605a51a2523f8f5399102fbf50694c56c85f1efc76e9340a63104176d779a9ab4c02c2ee92537ea5f4ea6e6c71d72408ddccab6ab453fa40af85c871222f7cf90df3a14f1f84ac655c0e23e496421d8d4ed50e7dbbe6fd9dd55ffe71cbb87cd0bde8bca8f72e26895b707b93d9fa5871f7e1a94ed46786c0a50b0c68d3ee2cd512aef740bc18483324c6675ab3ba86209b1b8c5e578d07700771ca5664da7644ead97142b89fcb0c6bbb788fa7faf804df9e552315bb58ad5d66bf77add7b1b16084cb67d3224b149ddf66db2c5c1b3b2719685b35ef545435359def89f38d76da684bd52cbd1ba4237a32a9ccc3d9797ed0653e259c5b8dddc3bf80415b1ecc2ccb936963849bc4f8fe70e7430ec25ed2f9d7ea980b0c59e5f59a956d812312204d75458cebfb5c20bf6bca5a2c685713a84d6a67fd93b69bee47d31a21ef0df9c7ef4884771d00df32b5b11206ed4a347ff276ce7437b417ba5d9e5607cef0c00f8f37990d3ef60a9a5a302156ac2c85d870523aacb1be4636755fbaad647faa93a6f60c569ef914c9c14242d815fe12296ed239bb0c018436eac27361abee050c29f7f12163813c849b58bba65512c9f3959b470c03ce7deebbb820c45bac929a2314664efb6b48e86773a591d1939ece6b26d8558e2513b18fa206016b537865039966008bc69bbbaa64447b5bae2d089c3013d4892af17bf572159a2768af718acf6d5c26e3746e2f10256efda631cd5a5a0f8daadec811f1d08789ca35ea27cfd88381ce0f5ac5eaabb6e0d64eca42682114ea6e551d1e544266bcb8da1235a354c99af155c62765ccb9b43674298c16564076eb9091adc62bda295d1e7f03907303c6a2c7c197f892fee251562b14c6363a6928148d45804a64ff15e69c64e7e2bf6c9d413a8c3e02fe9f51af62b7f6d0b729403aa8723902118ca732b89b6f6f50b48ed85523cd3db7a3241f02f50a013930751201af0dd44b36fb3f29a5480a834783d3f5c73f4e4d124e29cbdcb27b1e6627ca05fb510fc14c88bc9cd58822eb52d8474231366687adb071aaa7d5100394d4a7fc26eb7df52f5e7d551017efedb24962de68e2858d0c07c0d7e10b2fc326b8c943ed745443c7592807ac9d02661ae963c4c66d3fcf7f805aa5c51cbfd673ab58bce71fb9d8d31e4efaa42ab5eecde59970ea2c38f42d9fdb1047d6de4ff36704cba43e4e5bb136cd5830e26d569fe6cbcbfb0b21fc9f65db541d17c7451d8d95c08f42ad3026066ce2d57e4387bcb602f3ea8a5b6b50b1cc5f421083a97822867694d053b575633022e6543ac08d789d557fad055147342d13d8fad751e2dcd5853f394359526b3a6fcdb432cb2acad298fa274adce03a2d11f8a5eb1b7c3efd4eec57facc3d6ab7514fd41b886a78f665716c5f385b633b2e816ca45d7379aa7e59837982608f9f715fba21fffe245e134a0530da077cceda33346b2b0c24c9cea66b0ee8863944acdad9ffa019cc24456f11187aaaefa84e06c5b787410150e7b737e2d42a9706ab88f7968b1e781b384e6360fb22ca84c2c5cf80188756e0b292bb522664766ca094e4371d97b150277d5b96d0bfbb47020a931eebaa5e6ecde025d89c62235447c876040565da979129b1bdef59a958623fa4e4f7bd8f84262cd2d246a31d7955470e4a5314c3c015fec2f9fd7467347492aff7fdaf81dec45bfa0a32ace7384adf6c2d4d54c3a0b475f0aca707fd758c05562287177a3047db721d998419c3fbe266d0504f6d5f0a66b988cbf5da646dfd1659571cad02d470c5eca4fc1985158c99d09f99efd563782a132729ab522059ca39525a220ef79934606d9ff528d4f00b27e46705acb563fb738bbde815f60faf0baecac6a1e9baf4598f66693bf6294738d46ad90b51cbff21e0717c15da0409e134e206f797992e7a4cf4a0875094a60dadec3cca1cbc93a1dc27758a97060ae26556b66f4a2b87c581c8e206110474629a19575552fb6e719c312924c7d93fb2eda424a4d2d95149436ccdcf738a14a58c1acc56041fb46b327f89bd93ab77db01baf656e74760913a0e70db3a3590d64da4c08ec583936ddfac299b75d51c6329114fd5708ff89bf4845da85352204dcdeeedfce3af92de154b0406094976137f2377b8317e0035a74b0c1fa2a6fc57861f2b698e4a0d2d87bd8e0b046aa02a102941564c1aac9590e0ff3656e51e42f6704ed88a88dd6bcfa31b956d20351c5e9b000e3d552ecbac6ec4806da6a8d33de7c06a57b3f0ed404fdd4fd139b0a44686fb5771aabf3ef4d3d624558577e62c0c9aee1f5db493383d8ba9dcf9556058c8803c9408bf5b2357f5afad0f3c1f7a04281bd4398ab0355517d901ef1699576afa67720ff3c2b4280ccf243a4bd46a2da6b52d6299dc9a7e28133b6750e8c3008c21002a856ed49430352a0c7e6a3c2b01673cf5d0571ef2ea1ed3a2250e8a01bda9c7453d42170772af2eeed1254afc442e871b788bd7ad0f211f893523fbf1bf73e35b62037890177aa86c4c44805476d9aac9e6a465bdd0a98689f400d995a20874381462acb47989c1cbf0c8a1eb7a9b7501b4424dcdd3f0b155c43631a30f2111b93cce2e9c5c3dbc645414ce025804befcb47bc4024fa04f6b5da9b62c0af813dac1aeea70ea476706f7befb677510c0cea5b2bb98641d10983a1753a68011e22112ba91b1c618a202e10801df9e3c3ab67d244fdc82304620bb3e95af8784713cc2a72685eac2091c4dabfd3dca57973b8382fa6aa21f21e4c8c541e1f7fe17a8842366a6bc7db77b3ceceab1e942d85cddd5a60194075f6d1484f12815775e90b88ae53988e4b6ad4c5201f5e476abae22e73e728c042f48d47e97c2f08589be08cef98c28c5e3753b725c2f1eb4e276d91785398d1fc1b7702f3ec1f1540826030eafee3bf5f1d69da0140054883a39b8e31633cf6f4011b334c464c2f848faa81cce05285ff2c9be3be107d735a1a4e99a1d13575065d30386ab8c4d420c093ff6295c177bac72aff0b0b82ffed1e21be4bd19d4f00a3b2ab2a477b075e1f7549c5265daaa33063fb10216b337fa89c9c2760c9ebcf4b9e15e4507c1a315152a6610a86c2377d3a247577d7d054c1d9c9e66a257c14165603b7fcf1dac01dc1646d64d3a417e0c5109b61aad022324741e5cb66e94930874aa086e37de7bc570892d3c54534976c96c8814a1e8d3149147df223058c1dbdee418d76cdc2c63e40f201ff18bb570b74f5ffc1dc19b830a8a4a9e1ba5eb68e7f6e1a0f46120e44f44572c419d5c1abb69bce52cef2ca8623e44476fdda0ce1568fc8a5fcd1c796059c6ee42dd250a569f5fd292fb254f6249979450ae5327352517bbd6c48bb40b76673d4e4468acf2cf8f3c37e8962becbc3e3f16ce382fd4a4a406be6a589e542486a4f114cf1a4bfaf13c9d91c9f4db96493686148f68889c2e52bd060543cc13f67fb166ad92fa6bc139bb8ea5c5bad777816bba796acc1595b21789159177303254f2e7e3015ccb35dd4a28100a43c99a441f8e14ed343c1e8937f6e798ba8e8132abc41950eb94a2b708a39569e9e9fa46cc787bf28c53d78118de0369123036707bfb3d3f45b000d03edda9ad21a631de9930b2d4522ac82a014419794ce05e4148333f9a6034e715268438271d437657abf4ebfc36a3b426e9b3c0a15c756bcdf480186be41795f2683577da2b435dcba4b544d44227e62b853efdcc3fff8777f52fa54a9cd62e0b9f280837e647ae76ebb24144c8c11e0bbf3489f8a65a4f8dadd1b5ea2b955122f6255c0dc7b33f4e7fa69b1a5bd934ffdc4c4a528de591f45a4d8b38f561e158d8d439853f42487b4e9bce85335a763890037837fca9557f962afb721b57fecdb22a203ce580a86ed67ca1c940b1467dedebaae4cfac3785b64838674fde96d1c0de491deb22405f8ed80f0290af45d230d077d78034af46647f2a86bf4e8318fba0e44032ac86023a05441bad912fe0484be291fc6f70b3a74c214b40ac62b3074b9d08746fe0ad58b0db29d2ab490cfaa292fdc435685ac660c93acab7d9d6901de4e476b90fbd9e7c4bf7e7342b160b06ad0d6046b5f92cec691fc5ba4a29ae4ce969c07581fc860d135cc855d6f02d6203ea26af7c0a7536e29009ef820405da2e46023cb41fea1a0298510586d7bebb28b871c8a374708a531d6e7387ac0d65010a24a922bd3627690d600f4b5bd89f737f6a62f17b0d3bba716ec4d86ea81140d8029f93b4ccad744f1a6724f9a259797baea83c367137ef686be88d5e4cb29935e7385652f5956948a061b0486abb3cecd1b48209243e8b92fe97be6b386ec28bce56331cc7483cdb1bb3913253da1b37293cfcc59557ee8d8829baa878a7549b0dd71064bab59d28f0f4b1818e054c66b5c187bfe67a6bc6285bfe99404893de5771f4b18160a24acfa658fd591a3584798b50e8760705d43b263d402522637fa1b5535049de6db683b00f77ea83bd98bdfc69767066de2da215cb3e7cd9de7bd4245201052a5421833c946365f96d6021e90844b23e4153c673503e6017a85d8c6020b9998c77321b033a6ee2597ac9d4b085c61b065a9958181ff1e64e4991718f89c77f079ae7cc2f13b7ab5554ff5045a55f0ea61cb12f8b4d0b944d87e42fb88ec0e5f600e5886b9642eca6516ae6c75307a4cc57e0a31a34e5ae0b80b89835fadf77d7887d74d26de4cbce33cd030192fd8b76102fda35ea39f29d41513d59ed41577941bb0e6e338b029220976ea1aed01ffcf568587a71cb996e0a750acd7dcf1a7f63e20a3f56638c371ae7d2a0e99dc2f1b3acad868a03db9783da9999488dd99a8dd132c7435138474f66cf679f131504f1006b93fe74907cb45057dc356834603932c7af790b6469b796ec6d2cd7049549ea982372628ff2c65ba3419af91a59e3337e0563e5badfce0a60b30d17cb98c1527bd3f8f8ce87c7d189c58b45c1b7a4cb449ca0c232bc8c23f96983d9063aef646fa2b8c480c27308746b16a6352c139a48c76ca68649ec2f18aa28227c2ab36e18673aede3b2ee07aabc6ee58c9698600393dbbd7b12245b6da93313857d64972682bc29bbcb47a51ad89876d9c35c8fb7bdf3ef9a9bdd919c3f8af2aaa18c411a680f0233ceaf6fc44d054cf909981e72f7029ea56eafc7386e2c50656fa5bb24a8b13fc081a81005bdc7e2e74d4ee6a752d3c826a6a4b017389cbd79a80758cc9214bd5f2df416ef14f1d81866a4adbd97a272898469ad4872b4edb255c8c89ce223772da38a6adee4488798450b2a390140817a5ec23b81e598cfe39d0146a140f897a50e6c14bac59f3ae0919cd331825cf2c431f645770507ba4683bb81d046adc033d4893d141ab967062b6bf7a24620d066b80c9568486f305f3ad81d23f40baa99b7015107ac277b89ba6c5c4f5913b4f713732c183a892b7150357d785b5c013b887c41bc2b39f941c4c56a88f90d28f57a0ad910b5dd7e9c6b202e07c3e6c489eb6e4aeedb3f3c5f9c4e2d1dd9b3a83147a91774d4115f8f1fde6f2e24bb9dbdfbc12cf432462e12e4fe1c9a298154fec3bd1e27af0ff25bdf28ea4ad3bed8140ef60bc76d1d81c10b1856580c712ce14871f0aecb5608cda78d4ceb9d589ec6dd22911d40478da22ae3c79ad4a992226caac84b62c4d4008cc9a79f20c201aa4cdbb85fd05a7f719f839a48e990fb3631f98d4a906289062a6827c06c6c02c155f68c666fe3ed7afb4fb628e99f5473e8cfb7fa626a239493b0820d0b102f7faebf95d7e572332caab0cbed88b6b82ed4b6746ec7bd3550b995f533eeaeb92c57a1fe2087cde8898d9b8019c9946a0a214fdba31424d32731dc279d3940f947cf51f487994be24dedacad949089ac412bd1367f10789ca535aec1cfa1d1d0797d3d89573ab7fc7bd379f6ea0dcdb0aef8b6fe8191381e1dffb90b78dc3925f5e8b22f9599acee65e920f4a5293349f6cdbe2da9a094bb03a55bed2edd3ceca8324499e67115bdc894268e656279d5d5219737fe7a44d1d6eeea48ee049379976cfe3c3830cb91ae24346c469d55fb6176f6115a384008869e0375e2a9ebe768830ab765197e85f2b232e2059107a1ee3b3ae8e14dcb66c3035308c5398aeed5029a7b3e2816281dcca3957e4d26f19ec8483747cb1cc759cdc0fb9eb94a55535978a5d63c4de46db5ff0c0172c77f5436eb4a389f0e6160f881d5cc8399180af5b37dabd124984bc82948e75bf814f0ea8aaa8d1a338b84507d6f1e0fc5fc715dff506ba43ed16ce9749034b787f182f6676512b1eb78c66ba87a12bf3e779d848ccabf36830cf6636749fe74752a0cf4f16479e0b4d6f5e72099df8f5192a4452d87e0c0e26659fc44bf269036cc4b7d0e1156427e444a9c43a7e5ced3aebc937819c94a7207c17b118471ee986bf73ae3675be9f3000fbfb2eb3c2e3c7203ed2376c74abb51387cb569cb1186083a080d14dac152fc27095e1c1b5e2bbfa4cbef08636ce20c286dd5b5dd0b02f9d6dab84564c05cd668b728d0748bf2059f52b03412236edfb742b466453540b362936a7e6e4cf81642ca141e7d2362fbe60489600540202a684ac4109256882af38523894f68c023f9d5aac168ad91fa77beef820dacd172c2aff8920a3a07a501bfc9e2fd828c430a508d6d6d969e0a16eac58b90f3a173a0d25e65ad9c4fcc595a8fd15c4136482d1d4e70e0813ff9dee532a0ed8987ab21b8e0d15d82176473268c576fabf7f53d65f42d8e88acb66acb6090afe449b2a0019cc87e785c8c7129e1bd50369e0672d9b334dd6fb7797d2962de2c26057f42697afb7336ace953ccfa670b95b0626f449b5f13b892b4aa9b106d03c6b58315d52030d371c74b3ac0b77ba7fddba60794d724327915e0257530d7e664672ad10474c105cdb29c0b9ec74ba26a63a43a55965e402e391cd07982b1fdf343b1ad12725baf85dfe82dc1f458937d1b837d908d365f2d82a1719f2211612db4594169ee3318318d403db33a2efc8902867e085f039fe77440b1115e3d0330f8e1d383c2f5eae2daace9ff1ce966eebc7eb21562833087010d5bb9ae42b88e4010d74980ba53aa3a1485f85cb22da399281882ef39756304e5f172783797b3e91350625ccb0943615d0a0d34a4d7d449da84f4991324d1f615efcf964b6815f579fb530099dfad9996fe9fbc6f726a7fa3c3e82c14727cf279f1a8abe0e44b926028782ba077440b81d455f3f2a0b9f87a3d3ec8328b3f7d344565ba04e0b34da017a0091365f40ccaada1c02b0842f759050924a982985cf6478140a968bec3d5108b1ac114fc79811de1b6f5af90ade9472b62c3c44f38ad99bea9fb01dfa5718a293aeddfb139502921a06ccaf5320d56cafac1fbbe82978787a8a1a66d6646f296592325803400341038fa3576e9020c3a6b44d15b0c9a907410332990ccb64b6b53b598d4ce74edbdd598f05ebb2ee36af3a20f5ce83e2078993fba53351ed4805d98c66596c6070effdb8b8e2cf3adb75dde5deaaeb708784ee553673d53dfb17910a39550763dc4316812a8e98b9b0cbd4bdca46d98b566132b294d9c069627d72bea10af8dd3f0c73d883fecdcab6dbfc0a54c86dd889eee1918faae384b086a1bd380c79b8dad19d1e893eeafe58d8ba234b102a1c74905437e89e91a86c50913048badf1a74cf2a1a60ba3892a3fb355284880a06b302d50c2a0ca864500d51c5a08241f582eaa512a20aa2724185d382ee590504e60bddaf8a05182f54234c0b60c680d902460c9824983060a6c0b060db686a7684e084c5da5855d46da3a9d9118213166b63cdf6cb6a4567ecd6da7ad5ae729effb6d1d4ec08c1098bb5b13a1842d7d487c2ec8ea7f2b4322bf7d92a159db1fb3e8f625ba6602d74a727dfbceb48e09cf38b7148637eff0041c714ceb911ba2af981579c10f103e7afac810a0f566dc0185f7b79d5613f144631d19d6fbc39e79cdbe784eea654e6f224901c3529e20361f000c29416801459a2240a26aa58873032d2d3e4089097135a8a2113e46840082f92540c78f416bbbebb6eaebb03b0dcac9f2489620a313902c3139b7bf50f9a8a5d6f3bac82a89c05cf6d98dbf016daeefbcffdf6f8afddf0ddf0d542dbffffbf5ce06b7547ca64a1fff1dfb7bf7d32f059477696f38a649d2fde2edebe2de88ca56dfc43efc3c5e11bebad3620d3a9116202e80c592b8da917652212cb6109c572e24b6436cb7447732e8184801448c4bfc9374de85e499246cec8965925377c377cb9d069c5da9513f85a19bc053fb2cb576ec3dc86bdb2873fb80dcfc837244992b15a62f289ee54b6654447344892cc2469eba87b25499ab2a99ae2323085f014cb26992ecdba944dc96a9024994992244992a44ee80f6531f0c65a161b1c8fc90e0f12f84747a2ad1111d12aeb57446ccb061ca050282250ddceb1c3a24023aa0db95f0fff23fec35ea6ff0f62cecbf40742fcff81ce005175b8c468d26c083f42d550558711f680e35c0ca0526ab81a16105d7db80f89ec3db1d527a6c471a00008b037b769cc5784eed5e75f3f84ce5c1aab89fdff5f8bc23f0e1aa0be82f8b10e3c10850c0a235847632e3d825bf940812ebfb515dd90502b6f23d88d13b878fec5b5d09dce64ea2ae93d2439d7578521af623df5f57abd5e2efde4be5eafd7eba5a3dff57abd5e212b3663c965e5d0eb929a51b763b763b7635d62a48394b4839303a413548f3000f5ea46e2470a109522a8c8848f42163473eda0b45ddd70bf1200bd4cbfa54c4990391322425bb5463d988df11fc41780d8edd8f5209e3a88bf056dd5927a759b60f0d416bc909f41fc14a53588bf6f8951d6dbbc86f173c7d553aa969fe225d8e1e9c99ae35ad0dd8e19c5d2f2c202ade7e2656147b0e411e1539c3e9e1d141f810ad23573c74df023ca5881b1832bd6dde6a0e641ccf8603f5666679646848306ff220bda4a51afeecf8b018821fecc75417c2762ddfdca20feb6e5fffbc46222a9e392f76d91f05edd4349397563bb1d45e851c36322665b389ea6c5dfda116c7196fb74ad92d08ca12f12dfc5e8a586a5667b7c76e88cbd78a33136381117785c60b04af21dc73f90edc8f39881b783061f16ef7aef8bde08e97d6ab55aabb55aad56bb71d6b2ee366f594de12cb7810a00e009c1c1a7245b1f71dc5ee86e473b13ba9be34e168451ab71b523badb99b5b05aed98e27811badb91db1de8704df1f7f7bb63693b37a3585a5e582fb55a8dab596bad695f9bb576dc41f75a1bcb00ac706038ce8e1608c755a0bb1d73add6aaac5663359f6ad6f8e7bcce2bf99def515d9edac217a5525975d89aa4f405a911d55629f3961a65e1a81fd45d7239d50ddf0d5f9e24eb190a684be8615ba51d2260c3b77473f7df54a791ddfc6faab9ad56613e6a357cc20ebad7b20ebd4ca7b4226dbdfa2e5ab975bbacfbbdba69b62ccb5259e2adc45bb61e67a27b2d4fb0de566e2557e692d64a97cda91a2de7b30e9121b1d75249dde19e46a9546195483532d6b154471ab312a28ea7fdd759bd2e9e654ba5734ae9cb00d2cc06d511a88e44bd8e75ace36ad43dddcf06e2412c1a74d02c9b50596fbea9297cafe7670644e3319af5358e2315facf2f35f70d596bad0d62e50f4869c377c3d7c929b3dbc4c5c96f5cb655daf0cda513be165febf980af459de7593acf8beb797195729ee7799e678f336b95d2f9e58fe759cf243de2bb729e67e93c4f1faeb394bab1de0dbad7f3ecf15eddaf713c7b7e8082c4256048fd8da812494901a1582d7d201db1a39ec7b67c6cebee7ab7ca03f0bb681a43b1d03dffecc9a34691ee53adf5548622d8cdc30621d1a2ac0c5befb7bcd88dba978ad705ef6d5750f8c515c46ff1711c59381a479b8f8da338723af3271a6377ff12fdc0521d14c8e2ee56b0a19bdf28bae60e66fab7a631b58912a93227b62bedba1b32e0218a204c923822856943b700dac18610240de9e288cd6f5709d4bac4f0abbb449d0e197922765a3302133b45aa327d979068dee9ddfd6f970754e83d3b893d68aac200ae01785f0b707bb300de77ff3e71b56e297a392c72e6f286cf1f18d03de70cd6f33c7ffcf8c1b182e84e4f2566dedc99b99a58ec3d2d2cc7b96ab89a1511fdd15d1efc2a3f35563d902900945ae4e94687d02ab83e26c78e2756cfa84137faa33b9df5aed3e0d025163084a686a893290094ef75efb6b92813db4a09dde94c854e4363f1c55b0d26582ed426fef3618496e7dbcaecc7e4f228f0d0b66a82c378a732cef97fffde9965c813b3d6b641ded5aff6df0cb3586b9399339366129935f3e5bd0ae5b45ae79e78db3a33831b4c72def26a0addab99cd9adfbf6dde17ba57d37499a669ce5cb655794cd3dc52d514a273364d73334d934b71ce6a6c6d6585691565d69d8010a2c56aa857370bd5b443792ca87c3b2bdb6632c95b9ee9fe4f6391b1446f9bc9645b65a17b3585aacc9c9933b6cd64b2792fddab29544dd3fa9844a6b96d2693cd8b41f76a26fdcd0f4b67336e736d5a03052c1836aede4b24d3bba1eda2762966c21bcd3a9ec1bfd70b5202d1150aadb51f0eec9a2c893a99c29af7ea96cd68497a460dca7d9c94b170d068202aa3b21c0e5b6c3911dcd817cdd4ab3b6f1c67afbd1c276b9ccedcdcf54963d118922439d2879dc2845e93888aaaed6806f9594248bdba635936db60f65c182232b55c221419819b244992ec488e2544f74a8e32254e9f72dd24c9cf9d5db87fd9168ff7ea2e3a8b8c907a258b00bd0ea9738304930db74b5ceabe07a597813ac6b390c8ba1aee36076dd7e25d61f432dbc63bbb84b8c391a3f5f2f2f2c411c691a3f5f2c28578e999d75248da6a8d2a3ea1fa4131dffbb15fcffd6c409a8db0614c22c12c23ba57329baa8e3bc27b7567246ea5055207f21f01c5d2f292316ef178d0bd92768f80c48d76511c877c555648c4429f902734c332dce9f9010a7a99108661188661b80244c6131d862187128a76c637d230996e4e5390eef57c25a44facc60f2f63cff34cf174250b2f6d7c405c4043876269796161603acfb334a5ea8984b6dbdc1d6f2128c7429f902734c3323499ce2926ef856dc35869849484a3417e0700596ec3dc86bd10c82eb761bbe1bbe13b06dff0cdbaecca5d3e14e368390a2ebe165fdb85ee4144c4c1f8ffffc7c9d1d93c2b387c2dbe966381afcd2b294f1b7a99920c6f5429975645988c38e5ae4516b338a5b3065fdbd2bdd058341c3428be850ace0a8d46cbb459a5d9d6f36cdd7eb3039a46a399f9cd376d0be4ae372de7d6e345e88c1d357fcdc8397f39e8fee69fbdca4cb41a2d041f67488e8e121aab229f1a39d7de4c810a9e098d96694ce892f96629531698cdd189be902063afec95940a32f60a364f5375bc58f7666d88544a5091f8325c56f60a36ad25a7124f756246119073ce2b2e17f8e00927a30d8ecf51f72ee59813af23a35acad5e60de2085f78dda7526d598293374ac63e9966a464a450225da20920510595eaf994eada9437553940a6a229ef1b265369d37c8b2b4570f13861e789d8a94c280562a742423d62a7329d1e994af95473ce3b0156cc3141e84d6d565ca84d1d6d8b867a7573344f43c41838889d462c5584f0506130180c0683c1603018ec05dd2b2c08c6f7d63ae7d8f1e47dec12d71b01e629d862b1580d0c0683f9d4d856256130186c8886c56c2a16a31be6882e20fac0f892ac6a78821b71291f9107c46bc28a6125c6476445056bc8171b2208ce05ef40131ec4d36175026fe803014b07045178189e90d95764c581ca5f781c2c4da7cc9bcbdc5d955fded5119b9704b722411112ec95bf304a1f15269ec3cd6f7f44bcb38fe695b49ecbd3981494e474d07610a78320d8c10e9eb811140882df15a0cf4f2d6d2b5b3363156f052bde113e2fd362e9f992cebc29dea3930cee827dd59d1e1004f5c7c38ccf0a1a436a702058aec8363e318a6a48ae3af2f812068220085ef083c117a5e349328092a4c16ac90d0f0c1004c17af4643deb513dead13cc0186d831ab10810043f0fe8984763acdb4700f87cacccd2997b39e0b8a315741dd701e95e8f7a062b08823c8a8c9092764c02317844842b185e02a06261c12c50e8ceffedb6d672ce8ad304502fa7bcb5701c2f4397409213ab609400a8944e7a45662400000063160000180006828563f1689e685a87ed0114800d445836705e3a4c260e866282204a412083400c820000c300800188020829a41c7c00014cfbbc45bf9b77404c233369a984fab6053beb12efafb12894c88608b80cb196274752d3800e02e216e48d46b87e7a08c4c03cbdcf6fc8aace4e9fc389fabac9ce8a43a93f610c35e794152051a2950aba14af5d34a9460730c751a6ec67a6e429b8c409728f6038c6f3f3614a3e8b94a794b24d4f578cf28c8116f7b654069495ddac86a3344f61da0b2ee66ba73f52ac042852999648b1dd3ea1cde3730b7df75cf5506da81cad9cc36a3387ae1071cb4f5839ca2f9d9acf03f00e5dd086c1211f8ef929a889c413b8d810db9c0c21fa1e3e2057c1138059d94d072068a7fc3a3358d319bce3fa5feeccda46cd800d7cd2ce33170962ba4603b6cc4a4562f838c2b82809b10a8e7b3869d4b4f861942553fec17060fca1081534ee6e5b3aba9297363ea1999f7b40f36d4b513e582dc787c919c6295512a3e8f99657c6076370200112d5551ce53cd2f4e5b59b7a9091706126751231e793d89526aae676caaf0abd3bd2599fe7bff962d64ba553b4ac3d83d0593868239e209b915ad329588ec7860b888165fc21f3e61add4a8fec1c33f5c038f038c295e958000f6603968fcc7651fc1018edb35f46aa7cdd4fa7a05f7a208f0d4ff6a4078ec665dc518926b3991e9a475aaeeb7a7403c3a54bcf23cb850a8a62c0993901d667600b9f61e2f289e2c66c797a508a5246ff4c7e81e2d7f0d6889239dabd520067ce789e8687a7f44361eeee7edbb19285d81080ca87c3d74761ae9aa9eb04d854058090670112f89edc053cdccd897d38906ff2c5bab5ec0483b71cb7d506b7cca38144ebd102c681c31667079d077a82466c81c654f5150208c82e4cd6f999fc534f16d9d7f6a734c496db12513cac542f85a3fc1c6530d6e99571a5b835dfd522c8193428867960140eef39bc3338e9611881e648b4cc156de800d5f7910d17f08169f343a5b16e72e64634532caaa5f5df912f1f23848046ec2f240fa468d1d074620d6276869eeb4a991a0244c3b905009384e4fac140309847fd010f70c5e822112e1e4e9ac31d9463c3cf1fa388f9cd5e29d1489bc083eb3cb54c3353d1f93ed2492904178cbe9bb6ac64b73bf82e93c285df2d71dbd65571b683e5df6ee9d3414fee1313385d3474c99b46a72701b4090962fb532344e081c2fb728eb76beabe39d9561be43b7db57348df94c56aa3ffa93a9149ae8eeb395f9c495de36e0207fb4871a055f24ac7f99b6ed37fd0abf62fe1e5a673cf2d2144acf32773af9c586d5f798094d54c9dabe032cd30541c921d9e8c31e6b78f626d4a0638483810152b99cadf882ba88c6110943725fd883a4a5c9d006c85ba19b0ee8449b3b43232acbef25774812b58eaab15ca461c1f1d97955ffdc4bc54f9248bcf9c9a63757b0960b18ed3d4ceb5bbe3c01beea5ce8526c7fe45376aa218447c5462d15bb15dfe15af3e58afb6846fa3e27c547fc57a39297bcb9e4d3e516db963f6ea26c7d2fd1f0395b8c640def80af9ff859c7b4e745ee5bd97bb883a27c45fb6c8bd496ef493ed1e5a0990096e6e243cc225f2995072551c291f36eb3ebd7c82c346b5af9c1a44c195fa3fb394528a23ffc11c8b809e646d7f9824838242b1be65eef43926ddb2ce531b3428d1148ac0d9b1bfb40b2608b0181838b60213bb31c9905d2592ab71003ee7cac0e99a0e8e4e2378dea086d073d0648fcea29439a2b0cd69fa67f7261441a939c89bc0df6d40edf9d7243cdbac4fc0f9599b84a839ed57e4fa214a1f1ec91f088da8d8f01b373e0576acb02f5b0635ae29dd34e60d4827288430f56cbae784f4fa64ac1782e2e7a9d8e1f2c08396a3a3d27f6524e297a3f814ba0f10586c40e4a66d257ddb57cae4941cf374191022102f2b122695caeb8aa50f44dddaec1cc94b62755321c331952a4ad19d528dda0b906773a5e5bd56ba3602040196f87d3bf075aa80299aff9caa4f75c84d40b07ca961352309b0c30164c973038c2c272c4a35c2aea622df7644ce1a4a7441cc44e3721281403a02c668a378fa14913dd8ca4d41c9a516baa38d6ef66e55aa3ac79bdc229c8ce4db120ef49a49ab3dfc2e97784fdc8b990f72463c48b670e24619d07b22ee27746b05f4fb4450b3a8bc1c4d8175737718febd1c192a53ecfb921342fc72e8d377d2ebda7038e3130fcba17fe8101a80110cc18e6372b07e5e2e6078731f6b4a1f8d9117bf06059f5b8ed7beb88082451249f596c19fa03e4fb11090d59fb350fc0efebea007bee40187ad5d1820a1fb1f7e169bf3da2ca296be3e728dce4e02b8fed600c9489e57a95b13805d9e931019e3f23c48dda1d82ddff6ca325d81a4f5159200401c8f3088c1c07a44cb6deb8e750a92cc047d7005aebccef5483f65e1805ddf58c0d87f9700683f4800baeb2cc200e01c07af3542c199e373626814f1534a5dc7a0f78e848ad98783763980cbf9ec4d73e8b303d3e0e8088dde05d0b023a8c333dcd6816077dad9410b118fd7446293554ebe39497f257dc9de07b55f1bf49ac37cba773b19fdbd620b45f9dee0062a7a37623fe2a61379a5e4f606ba1b314c7275127ae5200fbddced8576afd85f2e97d0b514bb1bee1b68b3c6984dc8ea3da3583a7376f9283a399d3735bee7166713b4f69f8a8e50e512be06888dc0edf96b334bd18f9801f80cc5e4f42bccd1ac27a1957f9ca75bb809813a4d5d6c344a5ba5cd6133cbb1a7158ae279383abf2c429df46dc40eaddac8f0f6c14aef6b257b76b736b74ee6b40e1147a1153ad23621c48ebfb736c17bdbcbd3e31ffb14a4dcd2a184312edbac2aa65b8ba85b6c8513bdc1c5f984e8a0030558176d97db5868e7aa436f26ee1c9fdffd217a310f292ceba49c3d3bccc8982d5279f6497e1bcd8ba63c5cb50f0660f339192ae2c3aef80664ffd290c6bfd9c9c2aced83a978a69c3a94ed31e3be3a142d05c2ea19f12202d8d58c84207300754ebbe64962979d3a50f4365fd5ba5edbeb952997f9c30e66382d49a272a510286bb6618157ec8738bebd6a28501eca8970dae24c9b9429e09b4c1ad0b04729590035474252fc796287c408165d41e7b4ea569c052f10c7e528f6be133707becdcda1cd42f094e25576b87dce8174f3722261c2725dbd45512aa6236fabc5af885cbc8aa7f8ea7f934178b4b2b09866bad6e7e87f295d0fbe2d8c933b7a3a87c50d221699dc9325ddd019e16602219ed48653f084adf839df3e6b149825bfd34166b32903b93c63df249687f21fde55c1e2654d29a9e33b6c45f1c05d0bdcb515f5b7c1cb9da1847faa7c44fc3e0b40db87f1ab360a6ff15278ec50e139e53aecd6e1dd201a51ab879fe3ee1dbfb4e2560bb30e2a34886d16d39e2f053885b564a711e87ba628ea0822d7e75de119a8f719cca28bcea7f7530c635ada374f1e0a5331607264b1fd852ffea3711fdcf9686f471a740c58f33ea46a431281a4505060559bb973267773c507abf60b614fe1519e75cd08501a430a55df1930d743fd7246741be3361bc5de37252e997c93c3561eceee1fd35420a2010db8abf129a0dcf214fb1704f60e2cd59bcddbbfe9136299c3587155d462a55964fff39cd5a375a36307c4cfca5abc1b6724230a2b4c5a594175063e7a612d2d9a406d4ec75528897716a5adf287cc31595f8be525e46fb67d4c228e5da5927c252200752de8957350da578cc247d8fb17011587aa8369b3f51d10d5c12f83d222f5309f1cde1aada9d1ec6228982c2ef9204bc3120e2aa362df2357a15fff49b54a1c11ce6fee781379c949a2216bdd021f82e716c60c2091c01e8cd13333162685ae5be323c3c76146658f7ca67eca90d5e4cb3328ee31d89cc621eb098f1cdcadb64d76ba78b2e7ebb2845c542ab9765f1573317bb7f091d20071a68393b1bba1bb2b0b38775847ee7e71921d764f6e57e2ad9c2e71dc246790be894c7a1add9eab95b54c6623820d4bc78ca992babbc3bc4b41f1291aee51d3c4c466f708b69b727e0436df3c076173c86612cc255cf0ff14a9782de6c24ac0b101b2c16471cefcfb127372fa09b6ddbe5f77e2bd3f47fcdc15b4e70cfc2458bd35839b846a73ec10ebefeefb321e75426d7d14e4f5cade5bcc1d9e71b8df569d6c4b5212172c7ebadd93d525f3ab5c80fc0053784048d2ec6ef0b30ddf37e730a39f7974ea386d9cf35ab674a6bab0cfba278b42c998551fa98262fa3a1bcbd93ef0b965cd253456dbedb3a77c6f2d61d811c58c7aeda71c2b1b8c7ac18edd32a99e7519cfef89e8a146373ae02efd966da667c52e799dbf29aae551fcd758d62d9653055e7fa08f7078c46843f8fda40400e581b9b031e243964f7bf95e647cc856f7232eb595cf9c3cf4e91e8ffda498e471d4eec5b6ee8d049af8d2990b4d0fc3a1a156590881165a56921a74e884234563c7426877dd3240db708927cb1fbd60d8f8b73cdbe50a824ca1b5ceb8842e2349de6b48db67c26a854de120d2e4d135901929f3e992ef23e4ea6f9b58dd2796b9e172f96f26dcf36aa9947953c4653c13b7cdfe90a10ba21c34986efcb0597289089632e1783091191d3fdc0dbef5fdb985a36afa199fa69f80ef6f9d6cda2c443d2098d4c8573b4a02dedc49c10122e28dbca39509b897d339edd7a4d8f4f150a08c40b66ff4bb9481ee96df0b026b822a9b3b0ef0f7d6a6c19b9859e066b90cbe322b1ad1514df66f6f7f37dac4322dc1c0400fa843ed5096493e31c425f6cd2e96a195ded9ec4fbe9528166fe9faccb33bbfdbf2609264de4dcc941f2f18b50e0ab5ec5cbef5aa577026d0dc26f44c77470318f329defced70e145935fc7267d67da9cab383292f68d14fb75ed3fe36d7850455b8d216e1b23abc6294b1840e61c5a7dd8d4607fd8033585345ef138d68ec6288391e7185ce0557640465cbef728c1cc19aee403c654aba6cb1a3ab5eda561365a84d629bbccc3ac030565c909e18c6fbd2eee14f36618d91490c20f24b50a55a17ecba9c9b428619847db6f052d8e60d76311a3dd442d9b7c2c87c56f5678ea03ed4cdb4bb5c3cbf9cc27f6c15541ba753dbe68d35c398388f1effcb3a8ad40defe07cffc493e54ecefec14bb4c0ac5de022fecffc43e5b01b6893d06a105a8973e6acc00f5e5911ea52cdebf73d4ff7c85a74a83515047b519e1c7dcfc6980741ff4e421e4eca82f7ca00e98695d4cabed1db8c51a93bb742822affb07459c39b1b93016a1e8960f66ce53b10821fd44817d1e1e1eb38872e2ae11eb31c43e194f3d73683c8bee1b89e00396f864e96925fb09b3ac4dfc81ddf159759972b8bcb1e36ab390bda3ed8b768208f38ca4bc27a848bd7d840a4942658eababca204e1100068736b11d6010a2eae8ada74b5420f1f9ac86bb81759d007dced8dd73b71b81065eade9c5303b3992d58962f48e6eafc2ad601aea14419d3e677ba01c6898355558811f6cb38807bbabbb1204d517741738b619fda41f340aa9c3e9eb324fede2864c74ef83b5707f7407a3714fa6f594f274bcb7b69bf0a155914df4e9b88244c4a7a8ea70024d427e9490de5d4c3fd875a34c2473bf4946b2dd5492190ea5926dc39564062f4ac860a2d466626e9a70aa586a3b0413e7dbab4c2d246dc8679f14e7f349af5259b6b4596cd0c36aa852d193bc2972df6ad4accb920ea85ec47c0aa8de9962a5fa3904cd56d93ba5c77b9247184e9b6542c18a61379bb0d296afb43ae528a84d94204be90ed601bfee2a9f5a0cc3912a7a7487ddf8ec2b4574943ec846370a55b738ea55350a164b48a16e0905aad089093d662272936cf6a18f5b866fdb88fa2e07e1261e09b17c0aa47a8d215e2a31316994c0568198afc0c22f083934740a003a4a4de90039f810acc6cd8b3c9e98b847a1ecb5496512b09e9173611c83b6f7c9a59d06348e85ce44891918590e7e4056938622542cef81b3d718da74a862a465b1a6da06b66535f6e4ed0fe321c6b668e5abd6f42ad24ef33bb8e74ba0015ecac8cc35c57c057920ba446e04f137890f89aceb5ba081090f011e615006048460dd9e22628148fe438e671fa267917b7922751ab62eccb4aa0d10299f0519cdc2e2c11dd22e5a150b16c5014f0a588cc1a115668133efdab9d32bb3ddfc13ca62dc697a82556ed9c0a36b63db3e3da42b276f6a2737828f69255b8732b65700e5fdbd36c4585707b2711d0838f2e0b14cf891d976ab4f16e051bef08d746ef939c9bdb944b104339dbe702cb672bb078d18778f953edb891bffea6cd9ca186d864e201029ea005d78a29cda729503c58aa41e4a681b13996aae4a19e29271a84d68d310b3b1a7f6a7644b837d97a76e3479ee9c455b2555ee3aa96c6d0728b626e8edf8a0c015e4223fd5f17b162ea00c56632c191b965af3544383c5f7d3e5f23bbdf1b567c4dfe2687a517ab1806d79c5877618405c5a812ece46b6c214eb1ab5ecd297aa2e084bb22d3c78159161674933f40c3a3049cf5c0d83afb5635ca5f5cd79ee5c04336ec45f6362bcfd1408c374c3c2dfd164d8aaaf5b15f4c3e5d50e6c2436fc5b59ca252f42a01a66928c1d339f40a6feb8c21cd58bb27beadbf3892b97dff3dd6c9b5ebd37ed953fe7901f17ef2df69ba8d363fc1143b49f1a9a62ce3fd4754b84035fa14a96e5ca2f24a18aabef97b79972830f538c8621d7fc79d536464702689748ebe6d750a5cfad6562d6178a1db88edaa1bc61a84a48197f5694ae18635822a0704ae50f7378e28fd20a2e4bc85e2a8f808768ee4d1013d7de5dc29b566fc5c660b875b45a2b751799ae6d0ccea57c8a599318a7b139c9bc0e4945286acd9ab48d28ecbb6662737d07451387d8518aa8922285c89a8ba229bd8be7597812ccd1c8c534c0897f43ad418868a3eb86618b7ec2910f279ece530d992be964e60496f3ccff4bc5f2479f2fc4fd9363d49c28aeda5e36cccdbff22f27cb48f0fa99d3dbf57914c2628336aa9350b69b142edc572dba6adf2a2e4f2a21a939011d9cb5124689161ca1c478a31e9887988d8ef4e444203e8740d36d06cf10f70010319b8c326f4746b1f7ca0d40b7bdbe298f40c611758257b12f93fcfcf31673fe8203bd53b52a89c26f3418244ddc4e0a2a501e203b5144199204a3f4cf0c01f6c5fc2160b535d80dc04638c7c4075bee23cf39407b4d2e81406f5272b48e7a008657f19889b42277c3ed16916671ec0ca239ab2ddab90294229d3a18078e9e78d9a9050ba25190379095ae0ef2b3c115488845a712da46e6c6e8bacf8a3a9d717e58aafbe1ca9b0abc6e25b64ecc6cf52d8fdc02337670c6a5d02d7e60675161c29dfbb2130a9916e3882b27b9ddf2e04c987510a793095ca28fb60cfd17714c3a72711fadc9d74db5ed5f356c6964e35ef9f0f7f607c119de3367f844923e7996f1609cfd410bc5f79f2114a5b7717d7f8e88b57877be65281322ed29ce9d27dce14478749aea7cc732edf33d878ec88802def08faadd3e594f0d62e06bccdff58e24e26d64e49d752622877ecddb56e9a1953822aa38ef077304fe854aa86c52de17a8c272372352b3a720998aafe7a5cbe20d691afb566e3604b430451f6e21062f9f6aa84144909411f63d1731ebee5cf8ad9c365164224397f09d413a6f73be0654887eb9b64c9e7dcd5994e5591b6c997af8192c909d7583ee3a60d80fd7b57aa41fbc81dc4a4c87abee85264704d935b0eec022bdcf1bf34ffa2f0f8c191cc18b50d9c4a79c879979ec244f209804fd8d3b1ee57886df480dd64202825965af6eec29c3458c26f89bf717eb5b9c49d48a7c0af236cc8e4a097b0b22cb501a0f4bd40c2e18796c0f9bc12c56390759dc2d7dd2ddebbbb00a5181483e38495d7e8739bb156ed7f82df057ff77bbc44523641015276ed72d08c90df549bea4930cd6eee3d942c71fddb932dc0df00c3f8f694adfa2b9c3c6203dc5e5d8605af112fe6e69976ca5147908017016e4b74c75e83fa93918482528bd2742ad386c0e4ea861cf7a4a53381294753acb91912feb5e30624e5e905b7149f4f0ba076d33d350e25072c39eb2488419c0113795809e8270ce59ae7aedf80eb6b9047aa678a5605005cfd117dc75f239fc9281783bb83a92defae47ca1c39e779795097ee3d4a284e7940b1d1ebf801d6b274f15b9c89700b4654959941674c315e4d7115fcd040091e29c7d2b1865f4dc6ea766a27cce5fe6d6e59e00675be12b5ec13eb9bbb90869df96834001507fe59488a9eb6e4a9c17540be294df2da5714782ce5628246b11603cb361b43c1035d9c0248bc5c346dfe6b489f3be3fa94f90666fa5ceddcfb6d91a13375ca88a0b926cadab6e3f6b2bb62dadcd2d0080fc2334a54eab9b898d564d6e099e1ff5d25dd5970cf0a9dc87c232c1e6f76d5c393edcecaca58a9282aa974191430bc79d1a5d9cd256ae906dcb5ef0b4d171a65c1bd92211f80ca9a86b1dc48f171cc4b33ddbb0c5214578581ca62f53d825576620f80ac2d76cc9f5f77f4189c9f43d0ef03db2f9f802e09249c564631d7b81066bf8187cb51af1933264a1628ce817cb12cd364657957472981e07d73e11340851c429c6ac8e24752f14673a2074f61e03a0d889fbf4eb1cc9124f9b6d2a7ffe09f5de6db09632894d9eeea8cfa68698e83eb592e4ba84c85ef47bfb6bfacadc0891fcfc9a498488e5c2a16668292be787e031c597eb72d030d398c5849eea88357b77d803dfa4363050d3f8cdf6394074427bec7f5b3519539a46152144c038ea2fa55dc66bc3177ab3e794a00603838221dceb97e4ff805bca29b8b4c6a4d3cd60c37e77c60358f3fab3e9ee061fdadd786179bf3b1cc7a1a81981fd0bf5ffc9efe78e72fdcdd15b288b8a706f53b2481407ad23f0231235cb92cd4f1024a616afb673d0bd88dae75fd0377159b2bc7df00bc0b366eb693063fb78442a1277ae814afc5462f1fa72c5b67537b891bcb512fb5830561f8481ec9f3de298dcd3f9100e90dba42d92771e8eb54a05be934d27691c97bc60a7c849f6ff453d4426f282ce71705656229de823d0d9c8dc73dc8ebdece3ef0dce10f558acc98cc0075dc4d74b7d7d8fca7fecbe541ddeef50dec60d7d624a17d75d2cdd5d9526f5b5f47e8fce69b7203b735d1f6b82043bdff72dd743508198547f62fbe2507ebd7da3cec39158af8bc0ea548de94a844f5e5c5b5990817d97dbca3578a994383070e033143cc684e72cd3494a9414c48f3f4ef26a212b3e974d390522a3e28933d5a6e66980d2b6e2ba785a23470a9290eac78588950ebe04b24ac592beb74d1d39cbe729106c94f9deacd22a09d1f99d29c813eb1f9eacef66b89bc10122527c967138042f119914070b0ad97aec9f888e5725396e091aa9271e3065d4664fcf8f984a683bc8a7854c8142fd754103ce06b63452c6cf76f325975f1b8b725f7f845589ab258a6bdfdcacd34e4b5f9ed9dc6f70d92da797c0ae99cc3c817d30446f4b2a62f7d7c49b1c82948cc8a11e4cc2c1d0face126b805a871ed3ae22ae194982a73e0b5bae7c7ad62e2ea11ab6538e0fa6ab54dbac228fbc5ad6a27964b9c2591d117f22ea3ff202cf08f145d6b346d2eb6613f7471bafa3bc8e160a536bcbd231c80566852c7439720d66f61034a9b8f9114e7598057a21c35e613deb51c3958ae19ed4da3f63a014866dc41a0d2b6eac378685a37dbd914035a2342bfa9063e7cf6862e4d13d7d9b4091a752bdcda4c89bf2a7160427810a6830224884276b48d3997b62dcc8b8b2463815d266ac3cb6032f7fe43c360efbb9622c6e29efa02cadd1c1918a481e1dc0229ab791233203d6185f8482b1722c8ac220ef3575d49b60054671ac6d91c078d2b70f272eb822a484c18d58bfb09ac4914ae57f2daf90889466c1954bab88e058da04a1746713a48fddc248e144dee67d680e687c5e171e8eee1da6db8d1c2967565a2c43ab4c4a14a87df4084f54fe548a2c710f437ae83a11acecfe6852d0064102d867146109f777a15239e4d42e0cef7a8662658ff0624fd2a0e6e80cbe935e964051f9dea4e1b31d410a62fa5ad3256d92023eb08ce2371643688ff1da9ae9e162457ef6fabc72b5a8e60eb8924dcd8c5ce939aab4906bc73bf40920007aef745a855d1560d19f076334c4eb1d53b2952359ec95f5ece3af0704ac4786c805e28ceff1d0ed7bda976c6efca80ab6ee5c083f20a2b603e1287da938d5440344af33236c5bbe471793303aa265216029c7fb98bba7ec413107ee29bc4aa31b9c6d6d749ef4773f1b2a48fa974cc1a7a0b930583d149f71fab4e4e17781315c67ab0b8f1034c44f306f543683574cd9682930b09c7d808a5d74d64640d4e2ac250dd1f3b5f4b5115a7d1e86926b79061ba1bfa310d4deced9237d9003d0e48014577e45e990d6fc9a1911c974f3a04f3112f509f2265c227f48f212285cdc338fe7b82bf5380ff5880d1aba22cb092018c03f5a7b952ce21f472e3bacbdddf0cf457a16c9612a1bfa932e642361070640e6b12c54244f3b8c3b6b1073ea2fb6e475cf65314e649750fab54e1780f4d6eb59c3f5dba8c8236926a4a09d072c9a72d1465d904e6ed90de9ac6a2e57272711c2344c9b27b840606f3f2cf926ee4f696f67d8b75e498261a4627e2f4249499ff03ad832334a81304514a9f28d2f34482c0396469ca594d724fe7fa85eb9f3ff9da03d8fb03eab7091d6fdf930bcdb31e2b37dd7634f3202980b5d632139e7763c9426790105cbc4c5f5c47040e95670186c37d1499ef794263d57f3c33ad21651c42db3ea96d71bd412c432df0b2e04b9c9264db4732d0f1ee74364f5256163dce9b9e8d51a32676aefc85299237a79960acc47ed77532ea35b35c13d2061b9718e5058e84794f11eef6e3807d395bb1818f6b7e32ac2d4d3ba878e6cc1b208a6bc50dcd5dce2ffea1a5b1fa9668dd6d737eca8f831b4578e00e23cbc697376fd9f4a4f8236e07d5e6f20acb8fd568fde85065ab8d09d649ba6aa8a2e4581d8b7bed7e25484e39e8fb2cb0ea8c57819715795096aa9aa9566a84422e16ad7230c195cc3b2064a1cd49e1cccde6bd44e5a3164e1e8899ddbc95f439aa395f58cb2f2daf5b01ab0d8f35c81037c1c2167557dc29d71f2a72c96899b05096e06eb88bc1f816f0025dce9bf9c3e4d6b26356df9e054ae8496e6404bd84417ef27f76eca9bb7c3666b77cf1b7d2103a467c276f79e4e08619bf50cdea784660e20d6396b7a9b67b6955cb9088204ac5fa1817e25144944862bf95079cd42ef714e5c9b0fc1100786e5063d0c17c1bfd2b6b62675b67904c75463a3ab0539081bdb0413d2a2ced21f0a4441752cdccd9001153e7a3edf9280bdd82d68fe76f62ab1bce451a41acc8c0031a81c53f0cadf486edf87bf85e9eb0ea698335e61b912a3e6c435ece9eb07dc472a625481286531511652c85782fde813c3f7dfab6d8d84f0f45c0aa25349564da062242cd3e74f553ba7570a27319a29752dde5782cd271191d9335a22c69c000a0a52860c20d6d5f3ec7b9021b32be214b69f815e3a88de4bc1a5e87fc6f893c01047297c4351f6b25f07ee571bbf0a43b5fc8ca990158d600723065d96ceac02c73f19a1f896b127f8f4ed47799f64f8decabd6b5f11f449d9a2f94e86a37ae03a6857747282ee45541fbc745a1a06931c1b138a14fa6a07d5bf2777b91dfc83ea019fbbc77befcd1ae2a72fb54c1e76bfd4c768f881a51b502c135429d84198cd3dd3afa5770a459b301f9846614aed11f25639df16556e943ed13656a45bd2cba5f14cc1aad0abd037499dd732be8008c6729aebf90605f210ae7c845d6c6f216651781af85bb483f1eac0dd5968e4c5397e04d028f33b0c4ef1936b398446afb4ef5f73bd6e7058b5c0030f7c21570bef9fa59487202c0042f5610a81431f9980d1ce17836d4443e1f751c0b033daa2931275964f202a6d957f7a93d43664c6a351d5a47bf055b3ae88d0b544afa9ecceacc08bdcc6cd82a91a46566387324bb3f1e72aedc17781019ae34c7abd2bf11b19dbe780f441df714c92bdbf506cda09fdf177cc47034c93731c353032e6033d466d39aac1d8b754067f474dcdcbd0a85d70caf233fbc7440327e4bc182e7a949e5dc850390911156a882ceba6684cb728a786bed9c01cf045dd40fbf0f0c994dbaf766fa0dd64fcd717af737c6467afa2415c7d86fd5b73b02633185b6f9fe24f8c0e94361e21203f16baca213e6dfc779242faae849f2efe4d9ec7e0730a53b5a21991824a6e1b40e52044e23fbe40924f44fbf23d9ee30cf42d7bcdd6a7ffc5d2f7284f8110ff52251281410f89ac2a2b415c36f3efec5d68adadc145e097c7acec156f6c0a7a238dbd2076907cd164f955634a39f23d7c0cc03e2e7e1254a10252be74af4a2c1bd8189e74a8b9f70fd0d66b81a31c0ae669a2ba0a5f8658a18fb78fcc55e02fef35e92a2f47fc7db39866317e5a4daf0401b0080ad0876a809e5d3cd76c44dedbd8bbe252d89660fc3bf3c259218b004d8ab9f4d5605a925cb963645d0f5ee87f25efe9f017fcf9e8321d24244db966e02f679dbdd182f17f601f9910daa69d29218ea5fbda2581c692b6f4d8579253577c6f7447c303c5d62e0e72cc500d539aedbbaeb99cbcf77bdd3deaf1c465a0ee2f2c7426ee19b2012117500faf25992f2aed5c1ef292ec7ec3939d6f58884f494163d663511872e628c1c1261be5d11bcea62533d9a2424ebc13be64b1c8c929e40377ecf83bc7c3ddf849391e40185e740705a9cac5f834729088f0efa68556aabe1dd5cf10daa0fa9bc1eb7b391678fd8d2a42cf3de69450fc436db3be089b53ebe363193e2e0ac5179a46c72d079146e1b00f4d236f0931ae256c50c82f804b66227ae25458a5e4b55fe1d660f1603e73deb879bc46bbbf3384844941cabb7413b93cbb328ec6e54dc7b8c94f91a4aabffa1659af909b78f1e1a5255df44593d630b2ceb2956190f4b0208393cf99b05d6411035e9739f7f8aa9306d18e928d37c4afefce3a410cdefe16bc46156220b549a3deba90926cff84a4cfef950f008d4bd1d6ada0831c2b8f59b203a7c8927673eff909b78bbd8f6a9abc9fdf8d3ac994f76435d4ec32f670fefac236b338e5e79cf03f67b12a7120db4c012c1e2233b6ebce5adba2af9149c3a5877a1a3426403ddf436d38cc5004dcaa4154d020c0d51c2c4aab65c0b669973f0b50b1aa84b8ab0540a8eac199b7799d54827e0af6987499df3cb8d3c9a91de5079b0ba836d0fa5ae652029ad0303347a99ad41cd503e10f9e8991a0228420dcea9a1a8e3c112c3df14808dc532ef34ddf15b236685e99291f8cc34bedbd5c8b3a44b1de0b949a6c4c6ea5a195d37b47967897bd609f0cb93d5f70de11d53559320737cd4592a8768279566686d2e698fb692205eb4f7b40a766b908754e8af50d96ed0f772ec9c35e10c2a32953211e213d84510eefafcb2ac0878d0589a0b01babb5f0024f322f5e554584ba935a4b3322613154dc04459d13ea8bd4941392f7ff1d60a046a9f3eaad447ee088a4a6e5db9d13a71f4a94078386ffa5bca14e8ba64d6dd96ae7596dd4adbb830e2c1ea530493709d9ae7290a5c207ab54e99a456d6325cfd99260602963813673b4c70b087a7eeb6755839e5f4ee24bace87969b4d3766d0adbec11bd102645629ceb32ecddc3571ee2b59198a26bf35bfd002d2d1960f466b17559263438b1994b9b33e2be6a707256993818eeffd898900becf40b7559eeee02ae08545ce8516f88de022b1c53919d725b41722aec50249789aa2860a016f26ddd15f1641495041e9d4d89a298d3217ea91274a0f3dd782d5d187538ce8142e17adb7f8b833b05dc3e017d6a96fcc8d65231a613e454eb58aef5e87712673545452928b2ff7792dd2926ded68aec7a8150c32bf8ef40f8abddc3ff09e760f2e1bb47b909112c792d4bf366de920ef847655264d9b7cc893b46677dcd37d3b79da14380e5a70e0bb88b7fa7fa2ec93962c8dcd216e9c3722377e1f50260ba20637ff0fff9f9aeb754aced500aad071a756cb9814ba53dc4b016735bfde1786c80a4591560cedcc424746b87399110f424c5bd08ec04ff75dada842cda12f45621b34d924cf9da5b21c334cd70d9340ff6dfe2fafee6ca4c1c632e6b07a5037f4a13076ac0fb1344fd59d5d07c9119ff530205214ee61345734266c1b7c969359af5a8e4d3e46efb4ef778460da333c8dc54ad5b78ecf721b249ff8c442617f9a3f1eb60e597b8fce7f50963d33240f0a9f206f7c0b3222cdc2cc0b46bddc70d440dcbdbd80a477a59b0c17266b00183e805cdc9aefe45ba3c04d4ba36c68e3ac86fa4ffc96f4415f2b59515fb011c8bc4a49ffe2ca506ca16135009fac16557fb4aaefa2a4a972472277b4e07df966cf7e4163901138a3fd835b8c8dead1e264b7a947d143219b1ff8dbdfad8d3c21f489d707e7dddb221bd1bf7869f2d77aa7ef27c525f697832e7f760c532f897ea7b26c089b0561207653891c93431641d394202fe124812f91b6b3fc39edafa59be1ff7c35b61a7f5f7be6c560a272cdcaa2b0cdbd3fb3569f609d7160c7ece89e3f4935f0671847555e69f70248f8d80fd2821ac3690bea8492e3ececdef0743580c5fdd4fea210240b7532df856dfa2fae9bcd6a5d62205c0560d967d3262202095c5ce637abf2238e72a7d983d2654dec7c9297f64aea390e3678190f971bb1c67e39326b03aac859c2ec767ac634217d8b581c9bca918975ab50d3d15c96df2767e6a922d1c99c39b3e3c0e0456850f4994d1ec9da2dbf3f4a5162a2465e0a96996ae95121e69ea5b28a884bc67fa950bc2ea6816d96b3a348c461ed8397bcac0a320e520fa7e5cfe780bcbfee471d1df3bf257db908b68e6e9db405bf29fb92bcbffd37abb104ba324ada8ad259dba1d8c29f33aff1d4e934f27e44012a9f4a1f5dbefff248c7b2a01946212acfd0efa7a2d4bd8e3020a41403feb603d8d4e1f46f3bb9fd54cb5ec0b599c4dc5ab3731874c11a3b42f2ec468f68015afcddc46b2058689022861604cb49ea5ca507309c76d8cbde21bc10e83a8db166a44dbb6854d8aaaf67871a9c0dce163198f7b8e40154025d305ba318b5f46dce6cb580030b7042f21b612563c907cb3f2144d152f502aa75ac7aac7353c2c75477dbf936be288f84444fdaca0aa48d52d5e6ddd63aa66014bf82099e479577672383577a9eadd98a8739a56f5cc3e653b4250f4712c7ec4b2ab546df1882bab15a80bb9dffe2a380d4e129dbb9366da2429a56aa6265e16c1d0d849f894186f43ed4143d7411c315f0b906b8cf4c19a6a88fd1920e3d20dc4cd516ade2d0d06e8377dae11704b01c64ecddf554ac30dee86cef0c35268e656b5fd70d1a97a89e861a0da5f571255c8fac26cd81d609c5080348298c981db34aa20f86ec719de5dd7ce6d5d3feb8667a709e20c67b00e06e7623ca67202975e074561ec8b0d966d5d1375ce4bbbdb860197e7f2068901765804e3ae4444c0f7261489d4b4a2ab3515e31b09db7005de4040c5360a6f9996cd6bc0eb73be298d31c2387164a5c4b6401d3ac3dce074fd281d26e31f854fadbcb87c315cab1a32532b59c80e587253492a857816716178a61cb01a06db86be96e205bc92a6d4c3db09fd173e08071e10c106d83d8fb75fb07c3925921dc41feb91e38a411aa8fbf51f8313dc2cabedb4a3d780a17c74d6ddef0c44c3db01c70c37288ca159507928376e78550a4f3df8409be531945d4b652743cea183a631f09bc7854c1cfa426a4b9dd03a7a2fa05089306820d47f7863eac8144f401414c816e07474a08d72e680a9b4f335ff29a23ff49f7fb8e6718b01cd93219bca50ef2bfee4ade8271dedd8f3e8e809fa097caad7d9ecaafbdf71343f111263c426bcd4d24246e05d4f9361fc2dc59fbabf053ec108c848828aff67d5e796d659db5ecde1618f0574430920ac913f1c4038c8c462dbd5b6e0f5ccdd84e5d2ad72cf306ab3ccf2c66df37e113d9fa568284594ba8b2a51378c778740dd1ce08da42769f14e139cee7ae01de21b0f3b5144ec3f45f3970bf647d9a5a565b454e8a69b7cd9345cf7c81185d7753bdfcf228502dce88d0b21cdc6568b50fb26738431833f15a067f12807df96316d51296865877ea6f8c8d979d91481fa47a6fb6c4c3c3dd6ba1424564b9c9f1112a85f87af054182abe753cfb2e1e2fd16ce4a71d5cec242ffa2941e6ffa44ed55b305176a9fb04a3e2d99c8960102543064a922eced19c59c12acec80b0f544cb36c3debefbe8cee3a940af1d319c5dbc48f6cc0da1e56a648715758164744820dc909a07ece602eaf70d675c40961571c63a21aa47b283321ce33858db83b73c827ca0531fed88c6a3240f41e15bdef31b42b3877f1aa001147031e974a62460dca0339896c71f691eed1fea00785cc6d22da22d3c8248aadffdee77f9d1d55e5ab2b27b4b29a50cf2064c06e905e3026a8a64a1880ec492d8818d2e1cf1010a27b0200821f2ec074b002106583cd1c40d5c6658b051821656e0440e8a4c0817a4808328f48022004546a0032cf83004082552a32da34822a6031f80408a16d41e40218915b15790298858552b3c4136031f58680215590040083f1421a7074d14b962659ff7f7bd5b4d0a15685a9723536badd11a5da748235057727997a0b1d6342cd0a8298c2d4b4344eb1b18a002cd45bba0d068321b9a8d868686868606f5636c591a7be3424343c3d17434de358a519bcb68349d43ce040535e93d8882a286ce943318a36a6a2f4880fef0344609d9861084080bcd8c0b8d46e350861072efbd3b8e50a2c3814eb9427b41e0d8d8b2b51a0f2cecae5c24dc28d20bc5ddf18a55817b48c2cdc2de2ca4f7d5de29a43435406438b0681441c6c282a291e1189691d1c233e9fdd8f9ae52723c73553c57c52434d9a58b42b1a0e0172e71696a351a6d66a3bd525ec0525774c705b098cc0b4cb3039f45bbc1a9bdb85a080d8746a3d1683a9a80d950c4088d8d0c088e5aade6d56ab55aadb6033d96474d50b4208bd5645c33359a5a4dcdf36a59f052b230b66c4d56691facc6be761ca1048f942b803caf9605ad5123d0a00eddc00015682e2e1506aac4d8b235584c6686a6c613e19a2fa6bb0d107282d07a1e6c882e8c29990d6ccb604ac59acd66aa22a1f7725f1091928562a7c4c66636b3b0f1a910fc30ca094ea44a1bb1336304ef09d19245a4486a8b3bfcbcec79b021bc141e63cbc260f6870c6c23ad806532f0870f8d69357526a603a3502d08b91bd76d5c873241109c9b2be4122982516480ca42085ac48546a3712d10a853049961061e41ae917b45eb8a9dab94fcfe1eb9575418f0553ca367cc17a50a37f8795d128d725bc6f93d14115bc6df8d591c1b998c08402c88c6f2c6757a861c594d8623bb91d18c20a244dc5a6bed1851f2e288114dc2831204931419a07052aa00a158918324c97ded08a16468ba044530213aa0c3d3e163b4322b63dd1c994c76042cb3c875059fa647dc96b92da37400735b26c96432d98d5d2032ac7265eec5375683b1656547649b2ccbb04c66714c1492582c168b7925cf9bc5a228c20764324f4683b155733cac9283d67e63318caf0dbe337c69d7ab265777297004bbbd72d7afd17d3b61b677d7278c8f16987af4bf79ad794f9306f7ed2ddcbbebf3657ba7ff726356370040185d3874a8585638b0dbc6eaae258203a374649a9d5d34c68e9165f78bbdf786f626df6e065a6f9b4c121a0663cbcac8589421cc2e6a04a70cf996ff6b2239e7bf8d610bc35b4a125a6f9b466df09f4811235d0c8404d410282b9ec005245040f0c24504ca04aa0a1414d021293359101b9619b1d8b7478c3a9a52d92de32d632cee96b1f53ca3db715bc76d283ab83877dc56b10d97e65c6ac6968d0591e98ea3d1689e8b0b1017ac623b6e8bd5c656a5c15c6c68b41b9a6b8bc5625e2c16ab1895e2c3d8b2319b188ec5b6588ed1622e7a3cedda23698aab952598814531725380f042eb171855cb9e97228087ae606ca52a6043a76c64b4adf44a1a8cadd40b8d673e2f244b2e5e709e972240e995468cad544be710d3a954ea05ce4dee405ba40481b241b149914931012a04e591f2044a86524418da1429a044606140516296d12c6c2f5e1c8792c5d8b2ae1e31144539d4a2d885c5489259739c0b97ed81246b30b6ac2b6f317288d484dca03875d12148e4d822ae6b3240a7a9c9c48b1220b9819fb3901acec1d66561164dc1e5b81d45702922185b764759ce80b7ed6cd5d91704aa4545511445511fc62b436dd0d935d2750780a1a26887ca8c57453f77ef324ab3a14150b6e8baee0858d7e9c8a24bd9a2446f542d458c1c418276a9111233b40aa5ffffa9705184d0e36c870cca132c33acab0d164e9555578c2d1b7302c7f008e4a23081a130661424b6142ab45e71e142bb00c2d852c176e0c462319b581021448a745acf2c9182582ca6c5d852e1a0c2365a6b9408a34aa562c136866318c7b075e28644041415366567b646a72c0d46a146d0e0e88b5a8153689051176c445002092bdb70342c4021c1d8b234ad739b0d980bcbd0ad02468e2049d2953b40c9c0ce90c964b21b3336168ce2c18590990b169b19c6287b7d517ea8d509194ea69391c96e79334a0c36942470a81274e81150a0982579edf050293e540f4014242f1fbe402693b9b04c8fa24c26636161b919736091c96e3a55d7298c2d2b2393419f4bb4ce38638d8e20888d10169b998bfb999046adb512c6969541ab8cadbcf1d40a60c48b10f0a0019fc1cf9623536b5d051b21b3a3a0ac0a8c22c165aff23d0504ad394d399333ca0e80e47c5f4e16fff72b8c2d9bf39aa3a98af64e952a73a84da752a95098a0fa0124bc99d4a82d64e0931795bd22f00f27d2d633cd5793e600c9f9506a25204e5c19b85457364d33da590f95aaa552a9542a153844980ac7b7302b6369422cc224fcc118d72e778370a5b35cf31ef4ba22b779b7d2c6b1618c4b275fa374f284f101737ae935cc834e18d3cd83a00df336699c0e7a0dd3c92bd210ee9383fbb7a2154d1aa783ee623af9bded2a6fd64bf4d0aba8cf9dec17e8a5cddc360e638c31c618e38dc318637c8c31c618731963fc123e087bf87c0e7d9add9feb4533c6f82718dfe2a830f0636031d68be6d0d727777d7d561dccee649dfc86ba3a39cdeea09f984e1ee6749add4f5e3afd74c298344e5e7acbc9699ebcae402fbdc574f3a6d3ecce1c3adc5057a6e7a0419f65bae99d26f91aa09f9c303e5a40af41fee427e70b0696204212245cae15f9ba226f9e7c5d65d6eb45bae8afd143e7368e77f85cbe68893b57751522edf1a35df2cffe5e6ecf45bbf3d0160fdae1c90d7e3359a109e9f994742e86075719ebc028dc29193df81fce1877d7240960beab978fef2f20c6157920f4ca07bbc5ca077ec1522bf2408cabf233462cac227a0dd245a210e9759573ce393f944fca39e79c3f640a206955425a871c8196966f8d654994620165f0181f969ecde77c9b4f1c17addd2d7f7b1559e459ae793f7a5d91b6794f7a476e1cbb5eb433699027bd067952e830a793af11fae8843979e8a00df1bea1ae5ee545ffaeabf2e116b148bfa1ae48278c0f96e85aac5e6256a27fdb1536efc5d755c9263d7c8dd1c513e6e4a3938f0e733ae9da8205f8c0f8223df46e3b8eabf2c28d8e9a6625f24db647a4b9dbee0d1bf938e47a3303abc4b83746fe77eab4a8fcd0aed6002d94349fb45f61e41be0c7787f8f4fd32b4567b960013e30deeb5061b82e8aca2fab2d40ab93566b8056cd22cddf89a3c2c88f81c598a38a3ad450d3edddb7894f3af9936de2936430319adec92a45ac97e9a5ebd3ecee429e7497d047c7dbec4e1aa4936f193d74f0b3ebaaae46e3411bbcb94d4eda251fedcecb2d5eb4c36f264b7c4d5bc28337249576b559f026e7409bdc157b3e96bc233e7c5de9e86c8c1a3df9267b9becbaf2d415b8635c19c68f9135e3a239cf4231ddf594c0458bdb35bda9123324123219cb6c7d3d5f88e20656c92d7dafca56c3a8ee6cbd70511a491da6f7ac18d58aa1cf17692b0668c6e68a92a8892e35c05b5107979bf41ec5678ecb46c3a8fb98199e2fdc776e358cba628d1aaf22ebf3768bbea7cfda125ec7acb67333989bb92a9f1f5786ac0e21810cd78303c205e16cd2cbcdd2cb11492fb615d71a3e3c754b78ef7cf15a5c2cbd2dce955efcadc67a8167ea2c31cad636209bcc863729cef7af9563a9b7cd16efdfbff325c330ea7af556a68655f0b8e594e3b75aad8655ea6acb71c1b61a278365dc8c8c03c2cd7034780a230e72d1cb838d9fb002905518d71e9f9c4911c0eac2c510630eab68cf960d034861cc3f76d868b04f851863293e27e4cad0c73c8618bb4a7302164510c216aea8196285eb4c8916e45ce1030c5c50835f19e602709ae2bbc03357c63d8f14e35d7fbd7387cd01a72db6d0127062bc01f831e21a6c836b30106e96d617623abb51810fde329556ccc5a4bb93de2d52fc029211bfa6b5ae541fa4f8f8c75aa45e9a77ad305cf926888e196c6c6c74c76d1db769141e66a82b55db8c3636363657a75047c69695b138416c66b030e0637447462961934942eb138c2d2b837e8724afcad5c829bc80bdd0f84591d0721c870aa271f7e2ce6c55102137dd10b4070f0b03a695b68891234892749d8c073da8e96a8c185b92dc203962440a63abce2c4e4d4d4d4dcd4c470d56716109315a18f06735b49acc42efbdb3dac3d8aab3960ce9c5352c3364a82b995676458c1c614951c458e4c646cfc61a5bc322a1e83a9c4e666cd999cbced81891a5428bcac175a9808b25725d35ec72b95cb3996be6aab9726833d7cc5573cdeea6b23098a970b22b8665f04c5661d56c369bcd465d8ed7655340a0d21dcf58ea45bb6ee6011058295c2e9790b1656738b39bd9ecc6480626b1b145d6d77cde91887bed3f0f788acf505bda0d550aa7bc2e4e148a1bd7558e5a9572e9b82d451b5be30d1c9c18385aebe040e542ed86be5161a4f8606ca56433a015b158ac8bc56eb06031c66236168bc5300a75031cb2fbc2078c6283f2890e45051bda046d6190e1c0b22bbb2826c65695e5d0752c5d11a3ee6429528cad2ad3b29857ba02ac2eea0590200226f080b363e60a49a6404207862c610b3380d552698128a2004205088004a106bde20813ae60c108a4500519a18b7e2f125d3c5f7e91e82f31aba3a1db7b6dcde6dc2043e7855d5c3ac6b748702d0749f15d253ef23ddbccff4d273ffd656b5796e273a19b80fd56cd016db8b78f1bce5d57a28b3b248a62e8e7b62bd08a3444a2d0e656ecf16fb02a54a4364e483168715cf6c61ab1358be4cab8b6666f845821f663a2c2c02ab03448f15dc09d96075757f4f16954158b858ac2b656abd5bed7504d1b2674f1df30e2433f6d98fff4930d7372d3f3363578f0645d1939cd91b76fb35e2ff3a3bf482fffeda32574f1a70d237ae727db478bf8d04d1ba673d1bd5d43f4cef5a6217ae779d7085dfc0b486e0cabd45a5d11538c537c5d5825f4ceaecaf0a5fdf17cb4c797bbc4e4e35f9e9788ce8a4367c52856a7035af17390c93d5fbd2e8a6d0e465dd7855d99cfa649eb2aac599875d55257ae8962bc0b0a22c7fd0e3a55f9ecde804ef3efdec098e6b35465154cdd537a62c907eae87b6f919b4b57747c10b4c3873678d1f6f139f9b9b7c997db8a1bbfa3bfef037ae8553c4f2b1316e00323f7fb9c52c6cd5dd77598db0758b10298e1a23277ceb37b44b202c0f776d9759fdf50579f57d1e44ed6f7791676d6eb55316afbcbd260147ef7ea3cfc4b5c0161ec70b8326cdcb83272b8323c2058a504fc768ac72d2b3b553176698e9cb64afddd7bc9fbc050ec94e897a52766bb1d1e44a291bd22916734227d261f900485ac0db9900bb990036d486ef1261fefe548f46f8f407074f0229044de44f41a1ddc388c31c618638c370edf7befe5b62c02475ab38846cf2c59347261b968d7992c916824dae73d79be3ea7c909ae3c316c98c47057fc01585de85c96a06a4c479fb2247d33e4b1e7d8ca581bbb037337e1391887f1472f47ff760982e5c18f405268547e5f075382e6478e131636d3a30608776f74bce07befbd36b08a0df7da5061e003cc58b128fc6f3f91e2832a55573e0b3184fd803e2d8c3bf7d1a8bc066252d0457f910ffd58c5c20e035feeefa72a462c9248a7c99df4ba72a918d5993440b0fc7798d159e3fbe8a313a63cf3ebaaaeb61d1eb44b4eeece4db677cf1e5f451a20f8a9ab8f8907feab2b1c36384353030476c3c645f1cdcd2786bb230a3af060a8310864429222715476483997949494e81274f222d0c14d822079107991791fbeae3a5b74f035420f43074387312fba975fe14139e79c35080a3bbd5d9fa6c61a0cbb9cdf9dddbbeda63e59a0df5057a0ebe089ee629ea2bb94ce90be3e6845d3cdf3c587f797d24dded962fac9f962de942f7a4b5ba779e4366ecb18638c31c618678c4131ddeda4207bf8743aa942f7a97cf29cc567d173ce9d5c6650ce39f7c8a00d4f4e0777a9f4f0a71371c3981fbdb3617cb4981f1dc67492d9bdc667a44fa5d7e9a577b7ebb6176e5e363b68dd7667d890efbd373fe79c73de72ce2fe59fb42e1de39cf34f4e48b3cb766fbb77d650d37b7db24ea7d2351093e2b3ccee2e9f93ee527acceab4cdedfcb61dfcc96356a0f77a041f82b85c1552cd9551d39ada5c5bd50811d256adb56a12970c4f6fa9fc18a6036cbabd069b6e268df0a7b7843f9d9c2fa6d3dcfe39e9e1f5d902be74be98a7b99d6677d2f89cf416f2a3931f3d44da9d8fb6f8728f17ed92837008f4d972ce39e79c73ceb986bb9e25f25ff7408cab303c10e3aa445ef326cdc5060ed0b149c5a939a1b72cac0217c5365c2e4aebc1d231446ddae26fe9e6cb5d57a583dba411b30a7f43cc2a3c5f62562f3e5acc872fbd858755586ebbbaa29b5e45b32b99dbaba85fe0c52fe0c888593666d8e05201adb5c6a512a6c12b3f8bc2174db4debe49e0c604409a135c68cfcf39ccee64955e53f31bebf50a5df417e8a601849b0016850fae9caa183b1aa59777313fb2228bf4ed8251f8a312c68fd14589562f5a62bd481fdddc30a3832f6d181fde61480f699417bda5bce87cf1a1ff427a797db6886e3a5f46179de596376dd15b48a777b68cce8a51fa04715aae3abbaec8b0dc9d8bb6f8d01e0f32d99ed70e67b2c2102463d810735cb0988c8b2a5543c674b7a408ece5138c4daf2b0cbaf91aa59b4e18d34b374ba5c39c0e3acd5b57a53d620bc3a103b42727a449fe4d20bc8faf03ab8001e4798f5cd445c280168cad70654b4118420e8c01a72002121072360565e03a5c8a5f52a6a04ab86d9102a030b64618c26d8740352fa830ae0bac0078dc28413b62b6c306bf6290c2d80a6308b74de22820884f1aee0484db3649f130b6c66d7b64364c8690db4d7c86450fdd7c4071a3a9572952fc59256918d39254ecd8dd0479568c223f22192afa90204bb8ed4e4a7ef06fa846b4490584db16431b03c1a87bd0c6351875dfd9b8076e41858193638711b3a066269542d1e394e38ac8d81a6908b71da6e0de80dec098721c0e8e26c98b8371c273db60caed26c887fbe27c9e3eef918bba486e920668616c853384dbfe527037419edb4dbc3e0742afc87fbb09985e91f77613b071455eef2660e58afc0d8255b9381805455de1ae163723153852685df3d9dc6a5bd95d2b0c2dd227c6958c57e406a55894624f8a476e004094ab7a0d70ad605529c60448efb1aab3b5ebd40ae3ae6460406a32a0f2009576676b03a9ae30f057527bb08237bceba298e5ba90610b634bb394606c5d1c7c3f56fcb2e2d7aa2bde6e3cd79a600ad08ef5da430115bc6cfa34556b4b8f154c6b117aa8416acfd6f8440f39692b95d6cf9881ebb5f80910acf5448bf1fe448b0dec30e0129172bf35a4383d30c18b35e474bca8e6b6bcc5f0a2b0115f5f74e7eca1008f203319d8a796057fc6bd3bd54a5debedb461c81542c8118115301cc890847e91e21757463df159667cd23a84045148634832b652a92132ec5336e7946506878454db55a8b74d6f39e0a08de029b2b791e4c77e3ee14892e0e80b794a4a722ef9c1ae4c5e42e3d9e1bf0dbea4e45332da76e5d99f7f9bfcdd39b89b7a745f9f875fc09131e79c73873732fc6ce4c78ab83b599fba024db65d61f082f6f7d0f6e06d531a1b88bba18fac4a3d1f5d21180d10222489672ed05717b421c8f3d0ae2bcff779fefdf385c80fc8fbacf75917786bc77ba7695f4c6c4c4cc605b3dee78ac9b860aaba7279a830700f1685afb2aeef5a170d17b43cb85cd5e5fa8eebe78935d83447fef68fe7f3c8f3151e74d919575d11c79a32dd72b0307cffbce5fbc7e4fb76b678f79c2fa3f71c603199199a1a2032972bbb4a62b6db59e2033fb084e3fefb5e3a5f48ffbebf98311f38a3994c4f89447e20d1e8a6765d377689e0300cc3d2c7f4214dff4010bc0924430775a6cfc671792b693b9bd5a0437e0cd7b4bd7ce82fd141074dfbf4d23eb949725d4adee65c1ae04f6f01b9bf7c0e9e3b5bbe9f9c2fe43ff0a5fdddae409fd0647bf5cc2517ffea3c0441939d83a571d7a406a269963ca4f1a3a924f29c98a39378124fe2493437e8a5bc7f3a9dee398d3fb9c933764afb55fae9fbbeced7e998a792d87967344ba2288a17596e3ef9ab7453d7895eea3fa93c6ff44a4fecfcd3e6f77574e79fee68d1dca6688a62699bfb747aa9543a9d66e7fb7f69ff343bff4b3f99a7d9394d1aa79baf71f32c5814c397b298b3b9ebaaa4d3ef9adf995285608cc163ac17ed2a77b23f376d939736e8e626453be4f18c27d5d5a8a43c5f9e8fa2d163f22141a192ba2a092f09c50c0c4f55783e86abf21b38c2100441f030a787a7f9ba9ad1c07076637166345c6299c7c12a2290ad5dd78dc910c2682f8f6b67276fd51bf0e407d2c3ff303a78b26255accccc133441006dc5a1c9644166446632dba3074e0f9c1e3d34f74385818110014d1133f6a53a4055b151583b9b9daa18b78a93c3b46bf917e8a29ac62a15cfea8a98665a5dd13a47cea1ae78c7cf4055b13eea0cac48f1abed5161dcb474d35dcc9fdc8aacd3c16d67b8627cd30efb7a8158a4e184f1d19927cce860f8ee6c790e96768353cb99e1b831c399759734e2bba311c92b2973a763924025a591c8f3f067f27a7c2cd367f268bed1fe9c94f70d7515fa8915ad6832995e62ea9c80af6226ed17e9269bad052d9873ce19ccdcf54626d2e775ae37227ddff7fdd3804db792920eebf51abdf417e926f8c9bc9449750ff546aff446ad1d72386aefd401a79d065bff46dbfc4e9386c9a4b3e71a6d1c538d44329d26f8d34f4e3a4ff927a709fee4a4d169fae8354e48379da3b3601dea165b6c912405bfefd44106afae48375f6315d2f399c7d2f6dcdce349fbf3d136b9882c29e9bcdcd5aec857d12474823a25a3c7e4436eb1ae30aef9ee67096075d1caf7ad32159dacd089cf1928be86e89d13c674d1459853d5a37e4ce8a2b7049c8ea8040e5974562a333300000000040013160020180c0c044462d188384df3bce50e14000e5b7842605e4a9f0963a130888118843106190000300600030031c6100df100ed0ac815f0aff1fda3b06290da8665d962c420aa753051822e2c82aa773728a1c9887d516cf2b2c1bfb07ded7f3be5c47b9ea71b896e0d7a1f158c66eff97bda4e63b202aadcdbd5a9af86f22dcae1b02a59df923d4d42500328a2e6828c05b79d35856e6b32667c7e92463e91542cb8751c1784bf8a60148edbd9e0ae3206fffc98a93de18c811de47c1b312df4708e9ef53a7f884c8dbe2a7b10814b4952ed54eabc9a21a1cabf25ec54b2dcbd57240322070398f4e600a4be8f807ec8633e38793a1a1cc48a0befb140a054ea1ce82d942fca68ea22f781b0734b641801f41d4a4c444878753d831d78d071e3c60e5273f88ceeed9f5107757fbd34aa4a6cd4b046cdb04bffa9a005af858ac112715b042d512f40aafd1696c5a2c3c80bf98f1a5073e25b92154d786febee89007133bfb7dc904ecc3db8fbdc3a390760619c6364043cca36c00ce646c248718cc05ea19294b1b9f8f548f1f157127e36794d6ff298af7feac59a57cc8ff0640d8095003b99aaba01a9e7d152e26de8646def121f5aad71690d25e24b80aa9bf52b4a08e0c07990622e9fd88066b8512ec8fd0712664f4744a3c80b3923b48cfbc93bdadc3c2baa9ce501f9c6f4c596a77413086720970ceaef0fd6b7cd0a11ac6b4673d9d284a3b8c51765fbb5d4bfd535708e7087a3d50e3262677573f6093ccedb38a671798eff440309612d7b0d1a0ac5874c8c68c4d739bd8f50bb88000df7b9be3148ac52ece846f039490e292884ccc447a393e43f52a4675154286d9f227caa8d50f20e13daee33fcd660a5734666232921ee981b40210d39f62d9b672b2e5b5f6f4553d9f91441db46cb1b066412fcf6f3165c58f4163c22f516743b76f81c11fc9e76199a4b40d198178e9fcf76f04a8bd5ad28736192a0047465676c4c64ff56e633ed14d800a8beb6f64868039c12e204e34fe647368091d6c8d31f269a0b0c7a8d13eb687cfebba644acbedc1d02341dda169843db79e4d0e6d83f29c5a7dcdf97a424435b56fbb8479ac2bebd9f385d6057ff1a8fc34e153972102cc72f9ab7643638642d9f9afa49c0f82d95444922721ac1b3c724a1034fb7b328a51561c5d4270d0240c390cda74439e9cd17bc3c9f8a936d60eedb8f1d896ce34c5ea09211d5cf98b801d59ed29d4858a8d8525afc240de92b4c9ba45029f9f26b132a559682098f844adbc5384854c46b4391bd09147b760a3775382f9758c34cc82dcd5f14c5be5b75df4239d6dd5f1caec614442eb1326d2e470086a97817f7edc830f1e91c3ea42c2ea285127ad824a49f94908829dadd1b65d12b8cb0136d5ac1a93c8185ea28861369321a1ef6ceeae29d6a0ba53ad5f39e24b2938118903036cc08b52eddcb2a1c421de3955f186f09ef8f7218126431b18265c95b83447a12d4b28ab0f5a1939f395a8f2e9f88c4e672860f71e0fcb46281763353aa555b1d598f1674c4353161c09fb06cb349e72711c8b69d96d1bc282f47f5386efd27bc2391f6aecaaa315b1722a3447071f10d6b03e9c7f476315b069009420bc0ccbfebe18aa12105048006d3fda26362a9a633c0b8993ca8d1fe81cafd107182be2ae82304422af608336fe2e8d7543f74d16968aced9a2861935ed757cb627b555130e3496979c3ada5c9be71092653698c7712afa4d026bca5811b5e8b02c84e876060078da2651f313479d482dad3a2e64d2867e83f6c4cbda86bc0b46bd0866f836168588b57b6336037c8fda5a500074dadbc6a8faf2b0c49abf001b1872897f75e6ec99eb3096bcf8ce03441df833aa0e9442f7a3c86115b86f1995c52601867216b55ebc17d7e052534a0b1bb035908b41c63fe08dc0f72207f44453e8df95c59dddd2883f23d437ad8b5ed0240a87d676b47ddb4f58e86e3080086b43879c902c5e3a3f2d30c71760674065b14ad2403c256355f8f870d2b5e15de4733193f4a22c1643cf54f3063f7220777b562f16c47c45ef37276b0d3462c14f86229bca5aa0aea4716d60336658338cc1c18787e9ecfb4ba32c171441bda4e76eeac572d26b4681e67d56f5c41c03e13ff259cedb8fae016f396f48806f7a152a2c2c433ca4a783fdca5293a16b5202bf51f3dd185a25c7ca05bfcf15c87fe839f264334297d5738a2a27cb776a49e442a93dd7cb7b569a05f9d230c2e7609ee43dee8528ad27a0735dd8ea8f72627a14d87497b55d82b27f4e7addea69bd9fd01b089aab6d0807378339d835e92383653ab9424a4f2f3e1a4ddd781375dacc922f18509a520e1c36fd3fbfc123e34da2bd0b320ce96ce943969477bdf58be7be0fbca6f7a99fc2ebcedf5293d856473478c495c252b328935030e57777df7a0a9ac3c2d23ca57b3b25e8a6252af41f62222956bafaf955680c8cb0d3c5ff9245cf80fb427f53d2091dc2e7aa3786a389c9f4f0c8a237e3b54e2db6b8d6a8f83cc49da0a8fc3e461597cb1755f1cce55e945cacb8029f9d40c3281bbec6562861ffb3f969847a098c34773cd8fc595d51a813ccd80d1751b223df1135d0e261d960fe21f4fd7e583b4e1a5537524587cac2af22ba9c2ca58ce4fa10064b8224d2ab5c1451e5e8d2289ccae0b35ba0ae86b06440c94d002f8642ad53e420bb0db13b92a990a3ce204fab3cded8a43392c8b927157e00869bec560ea0f144733b07a527cf84782cc5c269d4d7b951a382317f68123749c451011926ddb59484a63e1fbd4c524a64cd0bc32e2745b8da8cb841e0543d06a55c982b1e368fc76d7848ef064c9bd31bed289bd7a17e5b8261532459f6741e70ddd2eee73fddb3387be952e1091c3e57e569ab4eadc0f9a8dbf82acc6e18fff0027aadc0466aa97bb47cfeb999f7838c12aedf00092082d3cd09b4d5ae393e8a1eed0a70e5785a37eed54770af71ecd301b8496a08a28ac34117b6d96b261c1d0c1d1b1e0d3df9759158539f1e0f80d48900509d14f7f20318694443ddce347717ab889390f64fe72c52c551b24cb637150a80e0c3cff0c6936d7d2ae361a78f5897bebf7843693efe8250ac2811bdc01a3f7e0c401dc3eb0e40ada0d860f1e30025c10fe4e4a3e00161ca4817dffe1a587b6c5b8e927024bab688d1293345f98d573e9d1f07386f668ad780886e69ed31c6adddc6f662e895c1da6f5a643f276c796c19150ce8b0c91cc6e14955e87212bf47e1a3b1f773b165191b2e81c014fe173a5306c51494839d778759f50af547585709c52aba4466194a8dcbeff0c313c11df339767f404064538c528ec018d23a69c29e200edcd5f29a21ff6e17cd3b5af96f661f683a80fa87853a2ac85334495f6d8d04ac0a56f4384efca5f31242eb4548be6200ae1dd21369f108557e48b28a785b95bdb376ea3bd8c2a4a083127e849897d21df4b64405bdcf717d54eb089c9207148e94d5fe46b537b946c958c32e81992f145e53a0ee82c9604732bcf46e073e58b1e108c6f0e61ef6c62e2600ea64872ce2f1a04615c6bca8a97d7434a1b01310cd4d07e6cd3bfe8e4e6376f42d06da042c086265aff8403b8fa5118ea25595bd7d4de268a1522567232a96b2057514833ce0c7f7b55f228d200556f13957405a2d3cbde9ccc4d54e26d72120942d97e6324c1ab168a48e27f2cd6a06e895802bafae8b434c45a1de558413bef76fd24bc0e72f193f55744b1036b6d1c679a8292b37ea8db87b11a63f6ee9805482a5a3a4402655e684afb7b3c0222dd272a1d50bc6cec333ffa412d60d7a4d9a11c8af4e34d1f1cc52e69ea13679e2cbf2a20c1e8ea74e8676c9e33e44794b956a9ac255af74c1c7c277b45fac9fd20df76ba7e3a34de6bac48399afd2d3c9007fa1c1b989ef882a5c51ab225b0c1894a9f484c87ab3c4bc64ca0bf3cfe857072728bf4a813c5c3d9414cddb23c360b45982ddd95ad871382323c8bcf29a330c92eee9238a1628a0b4ee4029f59b6300b285d7dd1a2eae823f2edd5966aed78a2a12b2cb0dd2f0b51df8b20c4506d81e5219133a90b85bd82bfa3544317c0854ce3dd5a1e49b769025f33da70f5d9240e10557aea5c0d5ab0a6fb46ff4c0b92316db35391a202e0d8c52b3d256056b09ad58437ba68cfa74ce6ba14672716f45f913039a4e459a2602aa7a84ad7d4740741408fd6095b6ee775d09af8624c85540eedafa9ed6964ebca2370107b95bac46668aab1d32ea1c2999aaaac74596ef8844d36d53f2005dbb2c77d9efcd4c012c1918d7d7fffd4b7686198cb21426624608d368ba63e6f5db9522169c217f0dc8266554f12b2e254ff068885802a2a6a76ea962420527cea2689829d5ea62132277b67dd65507b682286ed88ea70de9c5540e96bbd3c5187f4f3bfcd9f7ce8128fcd532d2c6f7bd01ea525f90643250663bc2be2175f08c591417489aac787c745544caef68eb6831b9a6580a09435802e5878474bc55eb8194b16a364f2267c3b26c670b500c167d19c03fdb788c93229698d1b401b281e7b0f9dcbc45715cc8e07a81805ca930c2008c434be041ec82e42156d00340a6f1ea5ccb24f02261bdc83da0663d10f12cbd5e7fac0a0a471bafa90f5266231c63f43875b2a6ae66c749deefcbeccf16f6b6390deb4758e37d5fd94b6b79f11224d52098ead428d2ef51e8d0a7b450a31569663d93b835f2be82bccb725695c5677fe94417dd2f866429d9524a845b7bc6bb2f92411e67ec654a8fc147f61c6afe740941e3b409284dbd9b84c56948619b099241f648517684efe8984547b6c01daf4a7628dbb5d4fa5da71973aa543174a0ee7a9ae374a01d2483c7d3ca96017c7529854074f9ebfade96188fe73121daf4fd15d2dad09876762b8dcb498b8869fbe6e4bafab7a1cf75ca025beabd86b12ec7ee16185a52443b6f7dce0cee0f38f107798dbc8db7d27a42e250241040a72ee27f06894c8542743f8fe3bf43e282d6dbe30c32c134ef72b12ff415cdf64d289a4d8ba77c9163d9acf0bb513083cfad19a50acf8a4c3ef19e20e4f38c27d5a084fcc42ef4a4febe3f6fa221c2c7dbaba0288733b5ccfe68dfc41af00c6303b345b3462ac82da34d7380bb84a23e6a0b741d0ff0eb09c2bd7dfbad722b209cb5ecbeb18cd76cb3b1e296c0553fdd34d1352d15b7dfde4e2774304a74cc039ce513aabbee990d84f8ab56d72959e30967d2162e0caf400c33779851742874268ab0de2c400facf0ce1d960cfa067662de8d53b12103185f2be47b7846aaf17be25e8a10bf87d52f5e5b2073e2d791447bcc702ca237fb6744595410ca06a14d198362aab4f4ab3af7a016689b52f3ef6303f8c15587e1af0358db37fed8a053acbeb3936e388280598721538a99759fd4febaeb82f40b75ea098c1fa7435aa5b7ffcfd2fbeb4290afd1b658c25bed29e861c0c624bbd2928967e56da9d9cd2e2f1c49e8d41dc92c53b9916b0214cf72d210c0903e4f2a0e0747bb07fca13d5768fa0c0026a028cb34652aa2ef3475f766915aeed5025beb7c396ce08413f92331b5876a83bae89cbb3ec54c4dc8d34b3b0fd7fb8dbecf26f500fd6584e42f90af7fb0f2716f0f433225905cb7fe793ae30c7428c0cecb5f2f6c81ee16f8e78c64fe20263b2ff805bfd9535980958a4436202e0d0f33e17886c0c132a62a756284453c2d8faae256c7c702812924ac6707d9ac481da59197ed5d428bea5dac335b018ddc2a48a53263bc90605e1b0cf5c6c21251eb65c9d71df73cea1f90afa0fdbf919ba6a0cb9dc2a29b302525c8c412d7c76a873da60e2018b70d82f1863d05f0c47cc1cb49c0af768955b5af5fd51c628724d85f99cadcc96e826aa6da1acab186f679679e6545f07bcbd5621b80a2ccae5884668261448b6b013dfb10f249dbc057475fa56cc5f99e62c00d19a3d302a7af3c3970fc844d1aae091cc7c059936b5e7cfbb394da2260dc958c9789a55f30c40d9b948c3337204934a9401ed8369d576eff9db5424e34ced70b095a0ad667e6cc20b22462ed0b4c4674afbaeeead33af15350bca402379f9df3017362dba89cfdf64f4920bdf79117b65fbc46ae05bdda0da7541df7c7a5316c0329e733294117f856c0154f90247afe5ca5ab567f08d8b6c2d3b569b02853519faf86bb90fe85defc590574b62bd4c0d703066246b95ce90843b3080071d19d2b78ea14996e6a82967ccc063d17f3f8111552e7dc50ac2297bf0c89d37702116ce85097ce9963d2ec74381b9aec5a84befc930f0e3df6c9e9b15f54d9a194a44c6f1a455b9180202aaa53096193ac7d4bd446f3706db7b7497caea6a4ed06ccbdef314e9489e7301e7787582b3db9c2eecaa0cb9c583017eeeeba29caa8becc207eb491eb336ca412fccd77b494b483ce9e220820181b0d26eb55f5c1426eeaf27f38511741012bc73b10677a5a18d395f1290444f361dd7e58224282ddbd9ca614dfe3afede0fe706135608005bc06a87490c75cd5a6f6c8704dae5b630093aaf2a05c6fb78d03013bdc2feaa2ee02c64cc8c83ab0857c20cd039d3b0738f100a1d37feac4cbffff9dda048e45b8ed366ae14fcf4198817903d8a6d0dbd720d6e761ff4bdc7e96d94e16f29d3fb174b8ce6dc4d6099ae06c439f8ce71ce02d752df39c6908aebe6dfb830db655f21745f23deb6803590cd8fea12eaa25dd03cf90601812c352862792b5fb25f944f5eabf465959d48f081fc1eb3614ab4254a320370b5141283408e2be4c892fd2728e22fe20562618672b7ab3d0cc072b72c4732eea2ecb88e03cb4ee46e89272c1d6d49c6a55c9baeee6ee9461c708334f4c729cb5ebdafa5df2d548da4caeffabe9b31cdbff1bc7beff7225efa458c6f44512bd05bb20544145c96118edc88c7d6ca30882c677c098f7128950714eedffa06ac9c5b02a93450fb2e4f10a5086a85b53cbe1648e6bcf28b29b6b4e5d2d816c345723bb2996ffbd1c7484d1f7884658ecc9456021ddeda57b471378f5d9643011f5f4baafa2f2335bcd3a28994555fc3d86d2a363ac5325aadecf3b4a9e68b487ad2ecd8ca18442f2cccf276f10f7b8344781e9ea4505627934dc6a7063b56314d5a67eb41349fbd761cd1c80e346000412f9443fb0bdc175f9320f2f1c54d30fe820bdf4c2552b712282830ddddf17ee06ab7201f63f17fc398aef0ea2999d36a283053243eae57a4eb54c5aa085e7d5778ed9c167c6d22a1828d6cd70452006ec0ff78dcbafd0e183de49627be27d41aed7dbf7a7a7e2bdc6d575ff2bd0af59e12c7e43ab40876e697acca63f7922cbd6b4164a6bd28bba1cc110ed0d8a0c210afe3dea7e32c74f7a9a04ec29f0c47220baf9c4b7098a85afd414d032008d99b8d9c7801db4d84d318ab23514e758fff6d87226b96688a8117d21e78f53e18a89421b43b0523f01778f32c21cd5ab5721a95bf549228692ff051f1152237d5fbd9377c2f6ccb713a2982008bde37fa3b6dd3c040e730a2a8c267a7f72e71c15e5fb4e4d54bcedff39d0d5b1c25a5af6b6071dc0833d47807b60cfa0d2e0f6c77b16501aca66772b9f2deb3b3319f17a78bd58c661c8eb211f3e2b18d0e17cc35f12ea116364e22f942e417abb9d970152c1046d002ef0e1cc9bed13fc0c15677b3540482b9b5b29782db1c603e70f87d66541c21e0b572e77b0f6bd6b79d3d296d913217c913214743152e0f567ef718beb04b0be4b801036b78bae7107c0794d183e6af4fc711e1cf627713eb743b0bb43a1efda6b4045704bc2f050ff02c17bb0b327cafd7ddad492760f46e6149d193025bc1d6e08fcafabaf102a3d010286c6d802ef1ae02aee065d038e84dd085f94696542f60975cb83caa99f0bc69e6524e33471698419120d4ef3649e257960f9a2d19781a9f2389a646191cc812dd6636ee99d534adddc669cdd4b5bf2aa283aaa3f1353ef6d73ea5c510f363a515127a4dddc72e51a13e9794e2841187307378ba5b58e0308470ba052081e6a297abca1f51770dcfe0c639fe42bbbd612ab55d6d605acd20085b68e5f896eb5894c8136720fd8bd0e4f5c3d7305a9192f8d7cd7551ca98801301429a6104be5c1334d1cb64618022f3e65c8bc61fc7cc7cf21ee92f36b64f67038a915ef4d4c0bd0c7c1ca723257dcf3da2a40bc27f01e75a756d54378e973971df7acf5d3217f5a5a8e725fa4ffd5e058dee79fe07cbf94d9d4e3f0b805663650eed025faf72f3620aea6267a8d6fbb2888c2eab96a08019767506843a1db1532da7fa8932db41b534a9122af8926714feed9d72f812bda264c371a071fcfe0240a63849f25f185600ff4a28de4b6d6751e30c6f4a5b42d49e3806eb12445cfb37858c6e558b14f1a111679cdf9ca3e1dd74a20607f3eae8adfd88618cfb66f9725ac18776074c314b3b080cbec8950521b8596aa56deb295e2f7d19a8454a1cd4f55b415fa5a2e7465afce1ce2916b5b53654585f1e1e531f8aa4c57bb073a5fae6d78c9a5fda62ad868a88bc49f58b0bc205bd5b177996e3f060d05bf906943dfb1955c3055394be9eb33996c5490ddc9a269ed1015134d095094878051a2166a2a6fb74422d16c03e2ab21810fa66ee594053784ffc585029d31e0b8e00da1f8b260bcc48160a0591ae97bd8fb27ee08f759e053653fdb1a886609e92aaa07e21848f87c27dbd6b81bd3bf41840ef7a1bbf3e809ae5795c5f114a4a1d3e9df19d403a53777022f28bde8a8f233d85ba8570877c4c4302035384f5806411223ab67927f9c3c0e46b697b4c5754cf45624004170d02f30b88efe0ffef9df3141fb19904fc8356342cf20eac764dde09f184689a8688407801e8a201812c8880ec238ace09be3b0692ac909ef42c48390b1fb3881c01637eeccc400b9d747b89bc6c8fc2d7f65823a07547a610638e85b4285874825214e2f4ae8d8ac0df6ef602c714e80f842dc9d2cdbe8161e592f0f036d42e06de1acf2ff42fe6d9753a821f034e67405822dc883a0571b774cfb5d51cd376d860065bf40cfc76d00f9413938014f696738a6f737ef512731784f2b197ed6ed905acb319b717cd7efceff253d17f25d5a29c2e95eb4a14f6af3c1540cfdb7b01ee066e42abef1a06bd3a303b1a404c871a71c67f61ea200302797c4fc8311da59a53a5d130f55f95243298d639cb4685ec9018c2bd50f032b806e80fdb405db6d259f908b25d6409afee467c2d1918aa771b4f69f583bd8dc2ab49a06f0173b7183c657ed6e407a6ee86778bdc1bcb9c6626e954e12133ce90ac77ffdba01091a4441542ef6176ab804188125f7a019c77bd5aa42d404893058a69cc0a5679d46196360ace1b62213120ca32f6734a964784a70a5618dfa107f380caa6580cba0f38c633c24916bb06d53255c12db9f4882983b5aeccef7ff395be8e3584304b89276423c3b9d47a3fe0f52bb02720572d0f72e12da95a781ff4f7d7148d681c800536a800b423112b1e3c10bbc37dcb44ea8b69763e09e61f05058b2f79e4e4e410feeadb14abede0aff0c0a1e0455d764d6d7c2d97d6632a867a024cc8959df434a49a6cb94012ba984d1a736c73bbb8a176509d66c428139b21e11ee3c38cea80f10d9901a27724e872a61be5a2f2df6b54fa857f0b157e72eba49d40741d60eda0ee2830545ffff1272b80f6796683607763008efe99bd51ecf84ed6772d9e944bb51b09bf9af807fbe1b3de4525f5c2e3fb69fc0dc92738837a49342871343c2f12d40897aa38ee10711b151fe852bbf4829fd1405ceafc46714eda454f518468cd48cc5493b2a8b377c80526ec441e01c2b319ba32e458825e9ff7272ed024d78beb1305f193c387933e18d48a3d912bfe3756df8e33b4f82c6bcd3a4b50a9269c4a0fbbdca21e186a4cd990a31fe860b3023a98e313c77276c025d840a26631eb70d602850011f0e2d904f4218a2f0d1f3097056a9d80439af5b4ca11891dc9a7b3757462ca61ae62a9e1823920c57a614232be4b63af9e6e34767958f9db4c4eb4bcaced3a1667d9ad4b47e2914b1645b79ec0248af9f14b08dea6207d28dbf4b5a290cebaec78d91956d21d6fc210062bb0ae91a86bb34c5a5f7b270626e45c7e0075f96d95b718f09210133be6ff80a7af7866829eaee072142847073ca93603b1d238980c2147396e0e788faef60148e348e2e6ee285b1708e4beb164d396644b12e83432af886a2aa50f958da8a8ca6d881a31f7aa24386392479c2df20b54598d6c6c9c48e82b35b10577ce7610ef909ecd5ddfc852fb68a8e7b19ac570a8c20138764bd9134d21c0d394cfc2ee10df2d06999c74b21829efd5f1d89eb25d19c090f691fce64c638a37d8205d061137744c22b162ed736b9ee84ac30a447e2077a9893f510a04bc13bd8242c5f8edbc14c6f1ddf2673029825ea34677fb7bd9fd590308b47b93782bc0fa21d5285ec8329f7069dd303fc47e2618afb0d0fbb05e028f4dc497229556c68a3a550e3aa7c1b8c4f914bce645054cf654f68ea7dd26f2e26f506c453dc501063ff606d418fcbe8afa74659c04b2687b0dc95df9db078968bc73276afd14f5c8005f9ca69ae837fe8de66bcdc5a34898c380baa1dd9b00067e8a7961c8887ec2250fc7080006224fd8f13ebe2b8ced29cf1d7629ae110418a28d416034c21001c3e900dbbfe8ef1228dd7e1c50a4f745609d7ba4dc48318b5d61aa0c6435dc0e28502f4894cdf5140254158ce873174b9b799aec33f956fb00951927569e98d0ffbf75ee0545fe081122f1ac0afd5a2a13ee8a64938a2c829b8a32e60af972d2d2011a6c89463e9d9f13c165d39b4670c4b74195a94487e393a508fe1a4d17ec1f4dc4d8b225024a3b91c9c4b249873510b69a0087bbbffd83f3c1bf7ee3dc6c5d96465127ff0d6408926f072f86e7bf13d16b6dd9586a7f6c0de0c48596a5585f4b497421fc1f4175490980b5d9ff24a2c96e731de534353e4a40496384c6dfd02a33b7088a285feb539667641058254cf1d1afde1edfc0147d6e1719a20862d04535438f47fcb15066a815a6d54c04148bbb099dbf7e91c43e753a09841981503ae6f56c5413b38f5a3529e6fc101d0660cb8aa53dbeb1921c10f02d3f7409e165d7a2b445736a490e90696e28ba7246c025194c891bf2f7696a2e65a96504ba5fcca34d633836873c47272787be5c7b9e4f0c461dc78d1d7963ea138aa6b58dd47702262465bf09c93b4c7a0f8c2b56d5e7e92ab304045d2e0b08dfa643efebfeb1939831d4253285e79e5ead6133ef13eeb4ced5092c68fbfe1219314ebc644c9eccbb05e5066d956fb4611fbcd55161280243848b6a07492737a058e947025cd80b9e215bad3b233252b1e6303f53d4952c415b4884bde0c9be23bfad91d8f95c783ee0cab31745a1206dac418d1c0212a4244b2268bd5f31567818681805a627b90fa8a326b84adecd56e7dd7c58e2d38a9391d69c0797d66809ddc1d886ab9e380c8c6310c3f3031b4a79edd2fcf33f3133025ca00cdd738433bebb8e6797087fcbd636d0b33d8de52dc3da5e02fbe28e56539ee298ca8fd2fa61d1f9c4455da7a58c19a4fca421a56a767bff696b6e9ffd52dcebe61d569306428cb276efa8978cac0c68204aaa9651678405a3df1334bb0599d36e90c0c604190420443a0621828c4120d56472a90e466b430c424d1c06f16096c10489602d10e74b8f261107f78865b3f4b57e142570e50dd84f0cae4745d9bb6448a54ec902063a7d0f8341ded76afcc2eef148e302fd5dc3c973790eb124913b3990ed3c41508498f076cb4c429b3105d60cb70ab51428562830ce711e158077507444e2e97e24112132e12502ddc38eb2e63534cb80d9e79e6b4916e951caabacaefef34ab35afd9dc4fb31be44aff96691c1f4853bdcc070caf32a8fa276c4237b425d3698801645572e54aa1794d40f5fff51c4fadcad802d7fa98537bc7bd70ca5719877f0da2d0aae6c180a1e8c51cbcfb50fa1b4b6b4fbea496b4ba6f7c38818305e4a3a36cf3804d2bc03e72050d21e97c7eb1b63b696f6f10ecbfe5b8026756020a4c562f140ffe1435b121e05410220cf40382bc961780bc26e0f77f3b1c3550a98c227020bbd88cc3947b466b05878512dea4e72ca5a7741ec5e01b25f7295ee7bf7f75002695fe4ca51ba46568456ba9d2f049c1469e1702974544bfc9ae17e5dd99025fbe1ae41df42b3a4ef188f92b7ab0d9c40966e82f18c19eecac1db10658cef7c5dc0b91840ec09c365be304560b3c24cd824064c63d0282ec14919f235bb08f1d108d2eccee3c52866773d6cc826bcf4dc504b8add4c5589881ce7360ead8624f28d3861eaef75ff2fdccff4b22d90a6ec3f015dfa89295c9e3f1e73ace6e4e74ea2297307d21034803a91aff3c40c3381683b3aca38e9ed5f6a95b18ae251d2eb4ee83b68bedfeb48d11751a90bd4a3e135be1befe2482b1771817666f8c831816c053ce1e3bdf5753b6aa988f9dd38f03550d98f9c3cf4a2b6a98062a8980dbaace5852cbb3d9a179f8455828054fc70be800c2b399786dd6a884cd30dab3cc47303aa17b7ce2de035e50efb4a259337cb65e7b13554b17aa79c1a85e68b72c07f68948de7691aa0dd9860b77549f0be4d6993c0b79d32660546c6e0a8aa66f3178b019ab6a2b43ce6bf814c787208c8aece05327afd32d459559132d9905fe3422bd1b6b20b9ce3ef2609634e710b1ae17917efdfbda36d5796988ad9e1071403037bf99adc24a6f03e76dba4a9416c0c9b1522ec7c11730c385155618f8f8c35f58a5e1d92656aa78f04a728d7ab3a8189048bd5b0b3be446575a24f456aead8b61a4352a0102dc91c73d067610ce77fe29f027c694ba6916b50029834621b6572e33d016fc4795521d1bb3ab8c8f5c298331b347a657d0e31f7b87e95bf664742b071066d0b31d6e2a8830347c85fa9f33dfbc99130255405a482e8a4b7ae2d5050b1cc0e9c89f87357e4457076c9198b41ac23eacceee1339d958657650f3149155ea454ff8a8b7b3e141d1f47536e1c11d4c19fc6d243537c8390ca343656503e6f0e12d85800db0ba54eba7b924d676815de0034a4dd0e7d4bf0bd556de52f6002b158af03962b79d0c6acb6e743dcf0f44fad276d8aa1825ef2ff2ea447f0839a3b1e6aff3bd8353babf216b00a4ceb31df304ff70dce559b1e177a4741cab524a5c100fe2caa389f7c09ca40aebcbacca783b4f5c959b783e1afd6c61c8d12b00c2be075131c9d7a8e570e98fd310c84387f6cb63fc836c87c5518c88bc95c904c5664fd24e26912d04a2570336f63720420b714fe1e6b4441d62d92d052037185b663e162327c9a7eb2c724c70c7dc4a743277ed610f146bff21a35de9fcba326bca7feead40545282ebe8ddec0098968d42dc4966985d675fd6f97f6604a177c17c5c42914202525546f0889bcaddcc53624c96525186a05ab1fc024f523bc9a3ea7db2524f187e25be2d0c42f1df661a07953a920cf13b703775117e296795b1e2f0cf14b149af11029a11ad0322b53abc1fab9d136de334ae4c21c5c7f0337386e77cbb4515d32044ad3e6e019807e6037fe5bab66cb1a559e00740998c35946952bc2e6be298b16140c3f86442c497b543272392facc47e63dc854dfd2495178585f7946a2a145647adbde7471cec7b5552d3afccc3b4651de768c41a6bd63bad2013dd3862ff57f4748f53104bdcfaf575f5fdd29c6cf41075644b95c3e9c7194b185ad565a577f7617c69c666b5d742833987a0405d0b4cdc96f4578debc9b49d36b48383f68afef74c3b5552a157d0431d6938b2065e57285943a1c54acadd5fab1b621d73d8e2d237decaf9efa53a03448db2d74075bff7ab86f808e019a1d02c8ac3380e2637e3265851670118efc911acd27c4ce751e47ed54ab7061ac7547c17d361a036034d9dff1e417ce5a3b40a5b14cab1df08101d4c27b89f70e3e087473f8372390351d2eb7842e1b80cc496982ee5751e2de9b355d22a79142e424507fe0080890eba9810d8737b52078d66f97839078fc0f8fc8d4fa2dbeae85ecf55f6496faeb2f3e2b6d401640b9f16f907122f3011d54c4d6d9dbdee86461ec218516d3971f513b35c88d38cde5478011772255f00f8f9a0fafccbd8030b35a5d8841ae25ac1a77bc7c522ba5ce63eec2de62ea2cf277ace9c13c6eeb1297da9e205e1a5b527d4c6e6e1824040e007486041b7d5220109b6e6de7ec36b5f2b74544cf1125ea05a3e49477d75b29683c8cf7f4ed5cb129f9d3eab59afd7f3f5782a5220540fad1e7092682724e9aaae5f54934353527c1cce154d61f9f17f1981e8020955a0adc89ce81cb07797a784183c5bb9c7c796cf2c1febb64c01aaefa593a47ea4b4384e77d6c60f0977baebefc8725f0208f5fc18739a67488ba2d1809cb96e4ebf5a00980690d41dbac14ac3734d784348a636cf40b3b58a87e7708ac115268c2fd9e10a01eaace952cf92d870b55be5ce12d09a30f7cc95324a1426d321e4e2c4fb89440c5a3b12e4643fa852c63a3eba5eb5f8838a9a3cdbdaf39540b89aa4c6f658bff106d69ed0d3dc523fa63d8c976c526be525ef26f28d3810e689504a5bab584b31f9fbfdd183ed7b208dc9606739c715d6a205be7478f1c798818f3ae64e17455b3c2bd06bbeda25bfaeaf6233e85091cc571baf5d547828f34b9c5bf4963e0200a8b71c2cf09bee16edb124582e08300484c647a75c626ba4b84f65e654fd6b5e0eba68238445ccf0381f715b14d672c911bafbc57697a49a94f318b860e05c52e5c6ccfc5753a64f39538d9ae67bca80899645db2e1fb75a1889c1e90c75170c617ff50615b61d6384895a563811ccd944db59eced5d1b40858509eefff2fdd28644816c10a760e7be2663af8296904ef597e84caec967d8b29f02d01c10e64d0bd9b5b9c048792e1102ef3afa4a4644768d640f3306ea3eb4873b8cfe8528546eb2d213f287a50004c38ccff229515f8b30411b4892afd3c8e88fe3faaaaea393ca03ba89014e0450625279a3c4205f02727cd2d3926539a2da4f1dfd7a1b85be91fd4935db37889fded0cf45338162fab6ec7fcfc7d0576bb6487afa92e9d47290b505ff74a59c143d3d625b16a2c74c4efcb70bd04aafa760677bd30cc5610c6ecf403a4197a9d6feef614f123164006e41e3c2391b2c9f649e66e45fb6dc04326b1c09adf98d94e11ad0de02ce1738f15698be6d134495d0117c03c7e10ee81f5cd6e7af3d709fe2c3b0563a0a141ac7347887b69b0bfb788110e482cc8c1a5de69356d2bff7d2be65f2cb0c645ea7f1423dd719efc592964e8d08fde91620b835247fd97e1bbf550147ec4d113ced272d124784d637fe898b330648e0acdb891f31b671070d5e8970bc7f3f3960d55405570c256bfbc9e483e5cba8e268ee2419388e89a37a87544650fd6b128fb994e300f73d262349a44bebbdc62be4965a563b0a97f2e0a8214262aa97724fdc1928f12acb0c073f523d3de60cdf3013802196a8c377d8fe3ab043c790828a97da7c020b37108e3305aaa7633958598274fbb0d826adfd691b3b34c8d52b6a52e47dac2d4159800e07bef3f5ee0d9ff9d03be54b27c549edff2d2a1b70ef8cc343ff837c8a81e17abad21a62896797d6d2ab42abad0d8f9e5417a18144aa12917b03b7438a3834a255b94d4c0793118830469577b7fd9f06041d5f879e793698d69bf995ce868940715ad5ff9e2c397913cb307d83a0caa923396249b930263ddde1f38ba5bedf9dd1f0044f6e7560ac0bb91838e1bca1042b46c24e47017d5282919f73bb25205e1c36f1d4202120a3c16234eb934c15d706a9f81f3337ad0aae4f54055bf59ae95bbe63467c6c372adb7bc2819e6933cf918a18705b9bfafae4495470d0091557de2a0d4b32e164fd5d2349152cebfc68d5b92897e4649e178b5b70a48f0caf0b87beaf93a30003654f79d458fd91079d2901e1d85f1c38d8828133b990e08c8b1db8043f9d08906230b006ad02b9e276853416b641a7f1c137a96e7740e58e8909c7e01b4ead50289f7fe216cd50b08bb70d907d4ad9c24f795522142f71f8a65f64d667ab14c8c2b9f5396d61de39ef205ff6a4336787b20ad4f44de9c396e7558a67e3fa5c178b566e73d3902a78bacf71e449e1d75c033d7cd75ca8d0c9630bcd223169e8d791a22add4899d35ef7c296595649a47dc5cdb9ade75faff5d8d623b9bda7f0a2202d27d4acee50095abfad87391e22f1512667bbff60fe09fa5207c9ec18f69ba38e67ba622a824fdfa720fb33cc3d72bcffb432e210ef93337d05e338026114b750037f00e54ef335eb33b1923803774a1a72cd0a943d1386613aa1e6e1a76ea33d7fc29554e5cf47393cbc4f67078e131360a222847cb47d12191127a6ddc67466e328bf1f63817f2822997ae11e8ab452b4fd8be3bb8d3da286142b488555ea6f679c8e4db8b6c4c0b885fb866c29cfaf29f51ec5b8dee349cd1ecb62093c478d0018ee6609fa5899a2d9964b47f2f30029bf82febe00a8d82b386365c3efe051ecc3c0a6a0a4077a5b4d5bd3db6f6daee3e6872398735cf7f47a84f7b0ab6a0c61e9705c7147fb8af31f4fa713b848be842fee78ff09850fcc9c9c3e9383153ffe12ee5fe18dcaf2b8e2a88ce92a96cee2d62657a1e5c65e4ec8ccbe8ca94adf150550b19f6261ba4c64236f4c922230912c888ff32e4cab664af2cd1a896fadb882b89a989af46a23aa2235fccd3ae92a90bb4b6b1f2195192589c3579136173b87881f73214528f10a6e54f0db002a6d0860c9bce8a3174c3745f7b6a9cc3a0c56f81f85cd7c968d032ea1042b45b93978ff3a9b76dfae665f705b70103da4271f5e9dfd6a1adac4db31a503e9d7e274668c28731a7f51133356e83fb6b3036d953a2f292a60f97a32874e13ef69566d729404a242185ee0525367b77e3276b98d8fb7c362b5c679c501b9d47be48075dbd6ca10ebe451b1fb9a3917360418a4c390d1c57e5a4b63a286e47b1c4f247942a0a048cf8ba2194c7dd5502213e86e5c948351c1088d694842076dc3e89471cd74ed6ab6330dc70412048370ccf77047058e698d1a8c1c791c53b006c2162e53617e26bec2bde3d4f6f33a1d23f630f787c501fed0036135a1800f87e947a5879f882e406ec022db3d800fca961dda208a7e1bc270fde44de5be784d4cc37e3550e1cd1e44efcedb3a286bfd500b81ceecd9bc1f5812e24f7066b47a62e73e5f5a74e81a9c7851c64320b129f492bc2a9fcb5b151bbb8b09ab42e130753b6f1558359975580417d7594dc59b4b9fdf2b02319b5be494c27a4c4dbb514bd9f98a228242599939f739bca9f4810f67be6b2623c2ae90da8961a4ad57c05099ff1fa8394ed436d13034576ac8151b98f950b8162c3409b8290b2f1f902621ae0c9a84b541e8b9b20999541e6279bc1b72b5794419e4d7ed4652651c68fd52457fce60204e50d1765dd23f4bb4af0f6b8afe41aada4c1161bf29f1213e7463cd1313de82dc0be8726d487d48fc32d05351257d6e0d6348ef7e8c590566b99a40a45599434630b85cc7ce86e218945497d508f224bbc6be1632cb4812000defe0e48117f908de17ee1417fdcdc0b1e3e36a95b116de0f02cd51bfc89ed0476aafcc949d9db0024631be1a9e7bfa966130deb07bab8bc5376c48f04432aa251ea4238ab911265e6c047ec62560e390decf2592cdec48faae6e6e0f0529e5e6a4c7dbedc3f30a221924bb909d4877419899169e0c2df89fb65b1a61a4c42938e2bbaa3bbc62be442f0cfc1be1db1ac3cb0eb99a169b8236c64152761a466733d9051b7442d3d1e784992a747d047ece45619c66c7391ccddc9b561d22a77116b99048098680572a25929194a8dd1a8e52361ad999d178d9cc534f6bb840ba4f13d3ba944f55561ae0b108ac14814d957d159edbc25c4d0103eeffaafd22f4b283c9c40ee4585e65425c6b753e8c4a5442f08046c8f7ae3c5f24373c504faf03d2c7a368b5cc805c3886a32e644ef073564b1dfd52380ce472c2625d7dc687c8f2065d2ef4972d07b057a358fe51cf748be7cd58eae73789e47b2acbe3b0f2e455990b1bb9a4c4b8f4956ebde2900cbb92580b4d8bd4d3cda608b7cae58c7bc37dc61180175b5548c496cbde844c25dc49f71914e1a193e7d8e0000107951de0c7d6556d101133c8da3ab42fe24cbf682b33578b213acde23f380ea9ee061762cc1d99fc281fa07974038078a465855a1b496b64a67de54251df339ac524e656da1d1632021070fc4ce2326ee49fd4003c716ff4c022d3ecf47aa4293b195154205a589585cc2b9a66f37a84888edd83de23afb9833ecd8cb9e8a3bb020fbdb5d1d857e039c3f2c72c43ddcb91415d144d4a550c76a3f69db3bb8e98ffce43c11017d8cbced24757f0ec87669c25c22d78a74b202372f9ae416b99ae0ade8ecc390080d619584254ec45d06a84c9acbf81ed6005290f4584af9177cf6b1379449d289747ecac7d3ab023aa79665c1451d94adbe68236373fe2f02bfceb78d2a196714863d4971cb9a521462cddd28d15eb20a2a67b0dd1a6f2374e605f61b39dea3d3d62881cf4608a1c6406298593bf5355d762f297217220a8fbc0c8a4200a041344d5fad150341403a41d061d7986bcbcacb4111f04c4d474b50d025e43ee7853881dddfbaa02175f68de98ac73786476b30555314cf43cc1abd593d8829404802ea1b2fc23d588ee8cb794d02651d11f13cd01cc5c8c58db5ff0bbb2208d8563a3c376abf52485df1347985b5a7390ea84c506d584c0ee807141ce7f9c6592a69d98ac50873ebb96b5e1892da18e043604377bd1d11e2fdd2a0706fec676a9c4b381a51eab28670d4f7433248c8e906870f15f61f32c22a5ee1f0e18ce4e2582a90ea93bef95b90acb3c17e1275be1e2b419ca69c6e520d367d377dd321bfc97d54ff9e4de643b15833a16b45be4d052c0b83f4e4911c66ab9c2868c06a8d8952ed4ac5ab56ecf2eaf0c3e0be9b933a34ab48612bd90e241a80bee107132cc0e27dcb9c4e1dd941e3f6e312bb6658ceb7690dd020e6c73952eda913b0053c68e71c6448e95ce4a5b93983e918eacc8a93c36bedff3c02a961c9e912154bd6e5a6afdd0502358c070429756db2fe77308f45acd3b5693034b6f692586c2a7eebb56810d8fee5ee41b15d27dc37b15a40257d0ac79ce8175c3c0df3e20f5eb9b65c01c375534da41c409834d62bb50327074f93437c7cd5273fbf6630bcd1dde4d91b686ca9cc500b35180892824e87392652a18ad86de360661a2094e9ca46be9b7aac9cb48577bd69231ba01f88e93425d41119614e9ec4ad9a9ca533ec22542ec02267b8a10d9e19e16bd130b3eda96e87fb07a0a4ccd22224c11da71ead44483e956b02858f57801abe7d9d586b7d4768517c268baf34a840145b4158b870722f86ba8b0c9acd5f7ada7dde0128d9c8993f75e881fb452e107180805ed1585e9339db15ef2a5e931fb0e017918c538b046d89bd5fbf779889e79acf4576a01cb979adccc20f1e342bc1955f0fddd29f093effab8711fbb62611be8097b5d0af723afa79f5ee3f4a6915e18e63e2ab8bf637acc5faf8ad5abc6d37b2b42a864425bfd99abff8ceac2c5ea2395bf014f141a5b250212b9d837c23f5397019fd2f4b59f91d22194815cae9e8d16131b7f67d6a4666e969023e1a057f9b2a8d72e03a43d9f9a7d3441502db528b52581e7e46732c00b643b680675272b2280e00222f88ddc3a8c2be46f128e3ab35b1c806c4507ccee43810005b3d931bbbc84f9db81505e46e34baff61f545ea203148fec2274fdbc50be32a1236844239594f485ffdf7d8eeb5f3faa66334ce684fc2ed8b035b2045f2c3a82578e70e6acaf85674b653ef3cf630cc97f82c5b8187fc2615e4ef008fd4faf6807189add0e782278571644dd714beed88196577968cf7866b821e9dba802a153833511b13cd57f80bac275d200d3592c4cd0fce7ed666776e40365a47d059386e1ad621d31d96c56457ede43c37f70686ca96d6edf44eaf916fa085bfd24bd9e33fc37637d012d07366e68f2329e1dfadd245c37ebe225d0224b73c13fc66c7198aec3ef954ec9c233ade87a6b6ff496283cba1c6f5e168862ac20a46049dafe6ba796afb94262378b8e688da8542519c164ade28c506593ef2157262e37d03ca0227bfc3c0dd6404454cc36c65afd8838ed9014a74cb5d2a5232e9adbf7fabff9b629ebaf3a20fd104c15a45e780d1a852219f45d63bd319b3cfae502d77c35552a619782e08ef1665d9e677f6e3452118baca502a263267f8e4944d7969f550cf1c5d15211584999155187c632027a5c11575f9b57bd6fb2fcef704e8a7bd487f71301f36b776cd1bc0232fd69b8f279053e5d2597b9b1211bf4be56b1acc325411d50a036d2cc6f7042dfc0a4fd06a1fe067f7b572aa20fa8a4340bc4487903f9d25d51440d5b18880a93e7f7d061fd88e412d4dcdcb2440d725fe52870564d7550c7a32693930cf3600b326bef6c1246cc9fdfc5c8d2acd4aba97ae5b45e7dd92b31f56eccde49d5cb2fadb7a16aa5690bed6416e74d550ff34b666584cdf574a8d06489981af8dd93ec07f29cfc8151644054f4072c0e3ae3ec5e106b0ea31c1ae7228eb3e32a8bb7443d9439db6b4e2be55bad49841e880a0d56d111e0874689d5bdf01a67a74c9a9cc91b9a2d42e45cf98a820956a372dcc25134e1b43597dc831861cf5e8fe2abf9d45f52c5bb41121bf04cb6a5c9d94c9d7398cada9fbfa7ca4dacf7bbee85ed1aa01360f1a8a49b8fc6dc93f1fcfc0cd8b7355854f9ae7ec25aaa735ffe051dcf0f043c050b410a7399285ea2bc08bfa51b88ffc562fad0bdde6d404f382a9b11d45e96cc7c216370e1c88b6ea03bb4a773731ef6a5825724d7cd9bdfddffe6b0440026f641430b524450998b55a6489660c45efa62a4149cfffe8c15d995446f7e2bf3882d79996dca2f463dfe56266718846904da117576a4beef7eb2fd5d2b85260c05da9a7088d91c0674274c5c1cf8c25b5bf98974ea5bac58c3c44bf49de5e341fe84e3a26ca91814e18fa1c3323958e0449f9c74e84f144a5b99d39d3909cdbb49ef5e6902e031581d9abbb130c1bb644b922c80b6eee4d293cfe775d12e32464dd0ce5deafbbbbf1bc25733c0c4440937e97701a90b6433f6ce508246e413826e602df4442f1270be77028ba7eeddf8e45e550266c753bc67d3d1b481dbe327dd07f9420ee3910fc0baf5a64b7c3a36c6c6cda8fa3633a63f04ea05a2b988a8617f03fd8477c0e30dae34c4cc81907a782ea82ebcbf09fe8771026fd7e3a4c467075da830f445be16f9491b1d4348f99a9aef17a7bd48a07d48022443d018a011d1ec30be1c1dccda41b7bd3e812d6cec27580ef44fc610942760986006390fd46174fa78bd2fc4d9a173aa149283fed24773b080bac556f9f8ba58b081549b0a3aa3afbbff8f64e5bc276d9c1fc4b532e9e01730b8bb082539e52ae098a8095a3cd56b2bd20d5a104cb1c3a47054708dea49d01cb9e69050397948a4d4097f8d21c83b330da2380d0b847e201722fa25d8ad80054a68010a3b7ae218101f20e02633540d44e15cf0bcd2bc64d37577ab65008ab66c913eb139a3799c0ef291cc0363c3e13aec8bb6823e99a653874a433137902203e767f169ddc9652ed68873c4988c6d646e74c11fd97f0a01661441af8242e6617f9c82771f0f9d5d1006ea689c7c8048004368a8008f1d103527bc11c58f6fdbb07d623f4194a0229d4b8881b2b9b1f35026a5ff81cf38a9616704393dd03acc08b352e304a127a463784d3a9b1108b5234a2775f40dccd30321e2285cf3ec45af81c4c12d89128a29dc399e039361c83caeca8d59646c48b6e556ad360b161025472744c8c56f003fd108b7a076deecc704d3a87abb8e05bafd34218756c6aabd04859438fe39b2728086323879ee302b7bc2b5561cd0bb0ea1fb60a764c250e10e00eec360958d54a08156f15ef9ca826e3a7346141e367e85b6108e06fe04f9f6aed24756e8a21af150ccfba6fbf105c6563c3e0e8693d45363e86aa0b3c8e1a86e73b901e5e20cb9750df1f138085e052a496280205e505a8462b832d292d1586ad1b3aa5ebb63e96d6795cd0808e8ac0c77d3ba0b4fb8b3128b03f09fa85781a298273b4e123569ff037316b3d4dc52610266183b4bf6002813e037f3146e91f728eea025be6333767d514336962a9bd39acd9de2dd81f1e3d6a96084be3bf571cb74f08b347ea2519d6aa62e9dac6b48f4791e5ce2bad92ad31a62569c4c22b326da3efe32f9d99a3f3ea1d8cc02f9dd93bbba5cd69cd98113d0b9c0858e7ab14a2e57eeb7976812d88b94cda544eb5bce7a2d2f36c8c1384d48ff59fc911e958fc7450f0cc9175435e311b1c8605b89e665f2c4aeb58b29876a9d81a8ac17f05b8668a04308a1150d487435bb9ca30ebcf5263c52a5948beab0ffab33d1af7235c5d44229d7f152fc64104694744932aacf38f24baa5ca9931dbfcea9ee46081eaeb18911f12216cc1108bf39963feba1bf5a4642cdfb42960c0e930204c4dbfddde33a7094da81edeb3040a3452a95ddade47e5d9839bffedb4a618429912d0d87256554f5855501513708d01e4e439093913c00c3e4107fd30cd64168ee60a930000c4ac03422cbc42d9feef9f8ade7e8f3d719983e2fabf615a96980ea59b53a54aa005bb94bc08b052108c7a909a39a0891da469539712569161d25c0f4e2a697fd03674a38964e81b88ad87c5a6f02c510407e72b3bc51d17ca43f9d84982da1c958ad34702395df165c56129249dbd6dc9b13bdb6ee03742fcb67f7564ba8168d721b72395de7e08eb5fcff338b4656328bb58ea29145cc7936a3a29b12c9bbcd1e1eb7e4a4bf625cd3e60953ecef2565cc45a9fb57da2bdda949b4dc618dbca9c68b01ffa015f8a4b1dd9ff9c41d304aae511caadffcbb02981a9ca7eea6a1765968dba03b183ba013bb8cf8111e99e7b34a97c8170d1564b21c7da3357ce36b69a27b961892750b09e320a14921525082561208cb81acf0027fecffb4135178f4b34ed580a6a323963bdfa02097d48bd41c0b079468b77f642bee2e37478c5fa581942ad7d0441d30f987114cd935cc16bb6a102bc697ac084e475df8d3efe7ea1701bea1c8404fec5400a7b8d0774e359a6a96b04bb9600a9f1aa2496650e9900a8110fa40eb16bf0168e95901ed02efe60a2bce7204d400dd89ab962aa06325661793e1f93786f022665f1a61d98f72987c0c4e2253164c1d93889549c1d5f0176b5c1e2f2572e65f5fe2d650b4a66c0dfdb3568da7e6147e64418bcbca319fa449fd2a3cec3954c7e5d02de375587b28bab2adedc41c57693c5d3dd115ca68c11ae1dd75c6be7c3de033c450958cc3e5ff48a01d323b4677eaf9e7768885f939a02d09f72023672a2ac74ce85c3efee52ca0a3e3c7b789f00f4fb50a60edac24969df45578b478dab1a1ba3f6ca49c042cc0656873f996d8e6d3e270028f1a18f8e6cc02a8224ff9eeadeef4f15991827cce4a65d12742d241a90c6d9218f734e364861a43676cd695a55cbb43f3944093c34ab68082624457f6a798c4a578f7a88710f89374f58a5faa9f71f479089e39869a01c06d10618be0cb847b4130d889190d10943db467627720d12f240d7b6ca574ee62a4fb1449d31b01c1227e006c2b92b10f015e96b1fe6ecc1adbb518e9cfb4fb9cdc572f0932643272578e2eefa06c3244333c55bb2cfea90a3e05f8e74cff72ac7416eeafe566b025be6cdc509831cd8ac9e2b41e96dc53e26eeaef1079b84b70d6d7b2ca2a2f5bd2c433ffc76e58235aaea751c66215ba43d37cdd3a5e4a939c07ff7fec4a080c5ef2ef5ad11f1a97fdbd1fd9658d8907b18beb803a850de6b8621a09d1e7276fd02b807e9ac9003a12381e349b643996db216de6a002a04309169cf472a0e58184f90e885b5c70b0ca060f6b7c5be275dec9681c264ae44a955c78220ac80dda01bef77267d1977902d2b5f4a51df9a6e18451cacb729c58364af27a68e54a5319ab37a7515e2dabecbef05cfaff817da925033cf9027a3d5e7a5510302b491d9f29de4e3c91d24bcd10d669b4bb1d35451904ca90b251995bd26345ce52a787a52012dea6ce3ecc3df84bd8705adccd4daeda545cf2f19f01740c4d11516d0bb12f3cf88d1284ec265beebda54c520667076a07e40736db3155b280e1e2a404509868d65a6bed5b2bb6b5d65a6badcf4ac95ed74ae9560cf659b2d9270d351fd03168b098c1b245161bb260d1e46493a2504d5e40fd20460b94eddf5a29798f4d1d552dcaf74a18db7e8f0f273498d0c1639f3ab697c9554cb0fd61454059d162fb15273ff26143951a766c1f4f7c3041f91467bb7f2d22ef123e6cd931d0d612ae4fb1a6c897550915079c5c9f01745c29f94502956ea562dbbff6452f3d78c960fb87f8f542434406692f8bfd7a790c4f0f36223d3370a49e68352558287163c41058887441f3275bc24885cd12f29543a6345c793932dbdcf66d9a2258b47c95f95539c8e5b0f10ff92c8d32152a90cc20485acf640a3505cca6504c4cfb24c3ecfa439b424dc191bc5de9cfa8912acacafedeed0f13ca2f1c45874a6a04f2ec0f6a847554569f46592b9a27ac06c102c67da647792c0354f6755db1eff7702b2318915dbcbc50bbcfdf7894c7ea73c0cb1ff520cf1ae121a8acfe114f4af4763513b52bcf1a51dad3ee45611d25c2c13a7955536e54d990362fa24a98482b3c34e548dcaeaa2932b72bd9b42ba9dbf56f4e49134ee764a7036f87a7283d292e85af0818e6e745a74867d7af58882dc418c5098cd03e6b0e4dee4d9c2e769db2cf4a67d76a67e7fcf9c729950deba2767d918e178953e29438254e8953d8866f18274ee15cddd51c1866d663c6235f550b77204f879f3658c48b4e9009bc8138f076abb85d41a65dc1dcae3750274596925a5969aa7044a6b4f25568a3fa93fa50285f6506fd503df9a33483bc468bf228bccb5923bcb33a58c6baf779ce1a515a936e87755656eb8320c8039fa2b800c36f078ae4af01e799413108d18122d9d7400b34cebe3f9b6d5f33a8da8ac4d9ae699c6d73725372c3e19c9c5589170555268f49c13a1e7ec23abc237f08920a9d36b7c3cf9b5a6a149a42a4c77c42ed3b2bf32d66fe47fe1fb317d0c9e73f9414a75df5fd20f23531b596084985285dd5a7bbb6a4450e0d581839c112123457531e243e2f98f4bed0e867d82c08b0d6ff4a8be8d70aee1eee827f0cfe2bb0b082175133887acc57a048aaedcf0245b239b7a6e286906c1fa2640c0d5199bb8f1b74cda64dd0d388c7f58161a3e0762829554a934a97c6ced33ee9542d62e990179df98d8f51b6f3e0420cfe2bb0c0002fa29f83d224310768512412e87e014689eeb7de6aba718d56c2d7f4e9b8badb5ebf92b5147510109386e6094e034d6a7dcc42dea7423a00ad5dc1b72ce820d0fc81adcc9fc829b7604ec0637fd2383f1cdc6d7ebd1c26ded2aeec380896ee0198619f23d818d308c7918e40437693c67b2cbfc81246c363301ae05dd1c2bf18936359cbb2a4200bd71bf47bb86ba118092459ce74b0663a4020d6e9c26ac562f5f4c0dc75adbbaa6bc562b17a687ef5ac48e8d9b82787ae5badd2dd2fe8ee35a7edb56a6bba5c0f29d9d76b753df6f3b30272b5803210101009040404a402021a31109018028140d70239105005a239586707b66cbb797e8075047c1f00455ab1fee7e9a7b082359a919f7e0b2ec4608d5ef5cfbcc0819a07bf00034ca7d3d1ea35c9f5f4ef7d922449505332fb8c192328f4694bedd3fab6ff8c2723133bb6809a96d93e5790633ab0026a2a269b209fd9faaccca560fa74a92576ab867c6657096aaa04084ca0a63c28f9ccb90c35ab3e3e3a7a91ae5d0d61bd9c61d67f4dd03314a9c7eff8f214dbd7ec9d612b5df78c7255778e6d3f49cc9ded389e42dd0a75ee5991e03b34b5ef4a5650867a155486ba24c7950565a855a11e55e34adc853ae4814119ea3b83c53288a2330c7864c063f77ca741096a1ebb957b582e16a843d8b35992967c66105eafd74b0b50efa892a483791d1c432a520d4b6cb0daa554cce73f1683e9ea6450fb01920f36a5327a343bda3b9e80dae8a10075d18c263cd8af577e911694a0d6b14bd3469ddaa795b2ba7ac3bb38013d5959cfb2f15894f511b1fd61da7f5a6c51bbf0d85453ec61b032f9d228436d6d94a1760a70c46c94a0c6b15d678da8b5bb12d41d6c7f22bfdaf22f87bada5aa5a4ced96c23dd78bd5e2f1b69cc12d41cfc800135d17e8dda7eeb0b7ac32f2b04f510a801b0a36ccfca1c0683c1f6181994a0de20870fa096c1b251977c665919ea2cb07f69fbc665fe3edab27199f7d0786c8c83719993cb1c0683c162b16de3041b94a0d660933a4b4fa95f08ff85f161280145925393488ca560ffb1d3a5885cca1a1d591aeb31496759d64a7f00b67391234fbbf0e0a4527e87128180810746b6afb2f83c6639b1ed8fab34374cf3311d0f07dbbe937912c2b67f66b04f972adaf64f7b6467c0bae05009ea0c62dbea5caa6d5f56620c7648beb4d37cbc7ce923b8b52d51f924b477f0f25982fa8219b0a8a9de17a9b42398167bc1a4cc1d5a222851171af34265fe40da86a13226688e2fe810fb867f8f76294ae4efd25e6ae782c6fc0454e69f854a0e36581af2fc2d9fe38d12d49ae6f47b46443e33a86d08c00750d7f0a163819428273d254f45784852a0a6d1d2168d7dd29667659ee4269f7956823ae8c5f301fad0eca00cf52ad4658e32d4a48e32d4aad1c98d667c7d796f16c3a1163f28431d82d786da793effaaae2377198e156c7a54829a82ba8ab37166002c5e1ccbaf55e9f486398e57c499d6fa96d258f8d477a5f6e9355b2e97cbc7faf8f8d897df7a44238b775f53bcd7be564ae1bf7e54ae191866170d66a544e3d351fc1e7e6b5b1481cc724d2200bd61004a7466137e54a32aa84d68452e37850ad3a52492559b4285f9410c228f9b4285c989c9e4a650619eb07208730b630bc3d1e58cc1183b8d4922e274a3d3114942263cecc405bcc126e2991524d707135ba843126b030ebce1e63e6ee05d24b72a4447c711ee6665143b0da1c1069f95519c44941c5619f8c976649f33159bec13c6aa4ef6f1f52c651c8581808aca334684224d1e23c6c8a3a5c7491e374d93078493c14dd3e49122474aa5638630c6d86fb5b319f500844d66e8568bcbd229c618d7d1b13866870e210c883ca83616bb1850220f4010fa398df2569bf3eaa78d0570ea9f548b12bcb65e1aeb3dfde1323fe147af77c28f5eaff7830d901f27fce8f568cf68c887fc635b284bbe1ebb3da2a1a121a2a1a1a1a1a1d96c88686868684895aba1a6cc267ba8129beca16336d933856fc3e023b03635af0577add6039018c360a6dfa27bad081ec3180633ddbabd21a56a367df06e0b8361acdf8627d177a7d51b15c9a953777777777777a7ceea51a2babd607843d18a20c623ad2655a4a72a931abd11ede1d6b45de4fa8ff1afa835da54e6b1ed37b65bb3078fb5c1d0b39bff7cb12f2fb9ea17a85d55b5d65ab5a86845532b1837bbcea8aa22504950d995825adf770ee6f431fe5457af0bf64963af9eced91eecd50a092c7b85841deac608933a6b30355a2995997c917f49f2b36d93609e802281531edbec1d5f9a84e1059d00a340f04170476583bb2e3678c4182f3fa2214c20f1c349638c0de62507239ad83762fd40c64a19be552da5705e02b5c08a90aaf8e84ae904b5fdaf1791c37989b51a5024baed4d8112d977c11aa92045f36c0be7776465f6da70b4cb1246cf124f16a244f48de4b3de2a921baa0e3d582ce0df56fda40f68920d72a508bd4714897ea633aa8316890f0695510374a94309909376d2eee1fa6abaafbe387f2cc3402db010d1a9c13f0518883f52d97dfc42368664bb691882d582e119db4ae563a4faa45fbf7e9330084d214a54c727f5e92dc476a8b227d1be41f5ef515035f126fa22efd091234eee72eb79770be50643bc493ce2717c82a42c9cd6ffbc1f82549faf1660377c7fd2fae91e7a3def9761185ef3b4dbf569b77db28704eddde799574ab49ea0dbb20c574af404b7fd330c40ada77d2f5d934eec256b0882a15579089ae7bdf75ad0da6aef68c5227aefbd6168cd7b6f088220354f1644d822d7b72d3cb557c46e84adc55e74524aa9bdd65a4be631c2d0bab1d65a7befb57adc758577035eb08ae0662984356edc607cafb5360cade5b1c44d39879674cc8ea3a34bc1718758c7adf54df098c75c84217015137118c22e0bfde311e45143a601a3af9c4bdfd81ad1715f108c655937a5225012a891f8a209e44f0ab5d99cc9970da54894548d65099660b06a74ec8ec734b9b5295417385d32de14aa4b1b551479b5295417342c1364d5a6505d96d8505dbc24f171b3f5907b3685ead2c4e2e5bc295417a62e38515485524b1886556a948846a2463ce3dd30e5a4c477c5061f44723834f1b1846762f0e038e3320fd9b98cf2f0902797d17d66d8143be47c1869829a82c6069e8f224fae7da2a8d242a1fe5c622822783d5e4a2e19b6691a3c440839c9bf691a3c38ac86c0b3d4d3436efd441f325982508b5c6e9ae64e1b962e939ba6b993a68c93676c9ae68e973b196f9ae68e102a2e777ae8f121cd9d28062062e714bf36853af2c4be9b420dc1c53e613c2dd55652acaa71d3c7e3bdeebe52bae00d4da0e4453eefbed8da95928f5e7bac9795acb514d59067ddf537e9a36b87b93e69af0a361b06bff7debbe90a5bbf6d5e5322faf75a6b9d821a3aa594caa8760b83616cad5bf0ba537d56a794d21a50b7f6f844a92a2cd5ad87484123d45dcd2a8263cb67fb1560180caf288ef4ebd78adb95c96ddba8da28116ab402ec63b2a22649b6576b9a308bc57a1ce178934d08fd6ba4c9210514a9ee6b52fa26dc38de64b1da3e572ec53c97de53edb83fedd96c3623605ce5bbd3a5c0d96ebd87d1caad4a405f6285a21a3c56a968ea8860f659a72a17db7d10034a0d9c2b8c647102306827bd028a0e77ea3091278935352f612c51a285ce1643d8d0ceaadb494bb8a85204cb921dc4a0d55133e68730bae020470bedac4f7c99e3244509969d8f76d65f1573d0ccf1597103af4773209078a2b754041e2e51ecf385669f34686cbab455af52e980d82a1d195b35049958d206bbfc71a5543a8d365b2b913b843c56ab09e3c1c316532ea3db16bbcd70474c2ea35ce45c26840d7b7c23528c1f8f2606b1658b0fae9444ecf22985e00936886991f3282db78ff1a263dbaf433de41356614abdbdba5271adb4777d43a6422f23b044953a77a2b802aa862871a2922c1144ee3686f600c5193aad5918f9847141b2edd3c0201a3551b06890b9258b6dbf02dc7b03a360a574ed1628f06cfbb0ec59a451f38334a3ae0102886d1f68a5645528a28926335430f90206c5a24c0e5d6c602c1973056dcc95e9e2a2483f150a2d516cfb2fd80e7902da324940dbdc0746e4d332edfa11d0b60902daea6accc9a76ddaf557d076f7006d793fbd7cda9d031ae08006b07e44a89410777c44c248d1a40c0ce4de58e165c8ae0c155a7d0668fb1444dbde160bd0364a056d7d3cb8c8a78ddaf553d0564a01dafe9ee4d36a3b95007d6d397ec8a79ddaf581e87b4380beb81a70f2796f0738e10027804ba56d09642121e5496aca1b1c982e50c345165f6c49e82006adfe0f7d990ca06fee032ff9bc4cbb7e01f46d2280be3a1713f9bc4dbbbe09faee06a02fef832ff9bcbb5d5f00fa3e0540df9e11b9047da348d0d757e38a7cdea85d7f047da594f4fdf1f0229f576ad71741df291f1ab47dc9e79d02b7066d4cc927d843833c34e883249f60081a0441833a12e4136cdaf5c91d493b92aecee5011862284185491544e4286f0b1bba00a2b765a90c5a7d240dee3ed020cf45453ec1ddae7fa4c127230df68ac8451a8cf240831fecf209eac8a123c7b844e55b326a9b104bbcd46983c591a6252553743f3051823168f5491c1de0e860060f63d0260731412c65510549ad4b18464c4141c66ecc17b4fa330d4addd0e0af4615f904a5767d0e343845a4431b9d7c8253e10d003ac48d517f031d32c974981b92cf9069d78fe950031d26d9f21936edfa19e87087810e795ae433dcedfa423a7c0a898ac86768ea50ebd017453ec3a850ca860e7f4ff90ca5c2290bb4680b229fe1d4ae4f438b415ac459597da231f9146f9b022ddaa8219f2293d834438bba1c40e4536cdaf581b4b8fbd1220f484b3ec5ddcbe7e5e33a4283235c1570f1050e5b1091d2142617d99d89ba0dc1660a5a7d97169facc8634e3ec5a75d3f6b31ca8a3e5f3ec528514afc5959fd1a59e4539412a7accc56453ec5a97db3321c987ce29b884571ce689b2356008a942bbe80228918286875042586a81923e58a181c0d0c414d69f80d7e5393fcf11b2aab8fb17d63cd334fa937eae337f88d1bd9e8e1383f6c67bc791185c215d98db83798ce681b8b8c4a4627bbfeb5bef3222f3af1141d76f2a270d7c760f06e4a4da2fbbe0a6e72ceed8ae378ac3ef6bdf158c56205e7de348d39d4ae0739b2011823b632b20220c9eb67c6bd170065dcb751602cca9fde4d60635f58f6249bf018e70c83cd2ec62950378fdf493e6954112fb229605894af74196b0c72cb17d6162a6eae1f5b124cb81dc29bbb59c9813f3961a4ee6c09c55099828871a5bb62c7d7448a04abdc103c3cdd11235adeed3d214516514aee9cb11ff02ccf481e3257c7573ae1eae9cc94c1998173a70d996b3273e68b19323f33667477e2f410fd78bea62477c2c844c85a86f7c381cd3e63648f0c939e205b1628bd274e78c078aeb0ce5897267264162e78c064fbd359b9e1ac544143f6c894a12b83c32345d8e23569e1e361081e2ac69e1f9a3a5af0c8595d9d115fe009c3f5fa3189c267e4c9c8a806d784270b1357ab67b5389154ece458a40d2ac911db9320624eaf11a77bc241d93d5d9cf33951240c5e183b343ebed81acbfaf9681082074564178548852ad76b4385ce095f16214ba77b42821373c68b3be30933482c21c63e75ccc1474ea0dba70e25f290814b9b9c3478ce2c8125cfca14bd28708ee0f017650d2f8a163626224c87c589cf49124f46d7cf67270cde1869a68831db158c949b420d0f0a898d8bb8b2fdee20e94dd96c4e38170323da726780a8628bcdc64615e67e7772bd3b5e6c55e0ab73f2e4640b9b1c978d1c0f50e2d8a6b06bca14dc94216c370867b30286af89ad88ca07a5062196968c3378504cc214f1b20405fba6ec33b63445e43da1e58acf0cdcc5bd6943fea2f0ec46255c3f3e9bc5adf961e9b7864a156ba6dcd654608b92e34bd3c5cd48d4f3d9a18227861416a40e8a295e2c6d21f6e03c2705893227056a8ef5f17a65984095a3134507147b3dab86063bfb8cf5ec0ce99511a504176f44ca848d77c696c8a880957b0273515af4f0da34d94f90e9c19aac7e3b16ae89229234118507044b03dbcd41a152daa0a02871848b82a71f9b29b2e8b181a2824d54af091c5b23de9e2da6c38dca659b52842f872f71c6954fe7ba34b8333bc039b3c3ce8b3bda7c371f7850b7dd1c91bc7eafb5d1bb479cfc8c1d010354ab975e54ff55efad558b1cd72ddc21176e1989c024a0a2187ba674e24e9b3b71ee84514922b88789631e2eebcad8258321d1d0508a3a52b192331a713161e5c2205e4ef7494463d750310a151535cce27a71e7d43c64804bf508933b3e9972c5452ed889c2c054159b2a6c72aa6d8a5e5b4f917109c55040718acf9571e752e28a6beae8060b710b3b87829b2eb1448755614d584050d711153721ae51b919e35c2f1e9cb3cfdf4fff6b12dd3434e9856dffa7bcad0359dbb5a3d9cb5a5b62af334a696c1613b2b398d0f51accdd734986af128b35a494bedcbd1cc93275c414bb68c1f06d584bd4430e71c0c1f4fd5624bc69095a5b5a7f6b4f4a29a522766badad16098e24accdb7f3e768a6c1a1bfb3987da796e22d82f7de0bbbf7e612534a29a57484bb2b25a2efbbee7aefbdf75e954bce057128e2f08237d1c48125c438cc81179b79a82ccbd5b85aad58f88622ce8537bc222e5524a9551a34ef0d459cc37704437c2bbd113e0d65b06178712ea437c0af61b8cd5304e1b69512811fde2b44e386b9f08e335c690c8f80de30178276ace06d342b25aaf56e0a86360756304548babd6028e291aa5eb522c1f7f8a5caa808146f0c95304491c6cf432e1a72357164c9f57bb808ce4a988de30df39079d29c87cab25c8dabd58a85592cf14395bbd1ccca4e0d72bde1ffb40ca0b5d65a6b4110bc74bb534bfd7241522152e8887c9f4e5105cdee8029fbd7b3f661688230d891081836db4179f4090cb315b8bce241aa4415ddaf2ba52055a2825489a275157ef5a2d00c5225ca633448951edd41aaf48254e9ed20557c1ea33b48952055e2788cee20557c514e77902a6c76902a3dba835441030b52858dc7e8ee798c6e514e6f09df0dc35c7b43bcd9a4c3ca9a3df6ea2287147bac26b4cbd46357a9d25a6badb5d25a6b6dd59a4327f786e193188813a1283e0ec310fcf0fdc604c46d51af4ab86e9461f07d75d628e802fd4f183eb54645b8b0fec8d3b8881f726155204d5bdaa50ac7b71f850e2c5d52f209dbaff049673df52296e9b8bf5e34be1d4dea4a318c3d6682ae71cbf516a34834149fd216f8d48bc2efe979dab4c117b151698d60a2d02b8825b2bef5359af874c532834e00fad60301fa9629840beb85f83c10cb04d26a6d52d4305cd6b34c20f5562d8822c72c8de9f65dfd5d59bbdbf7dde745746f29115cef7afb3b7e42f879fb030849495a9652dbf5593b6b6e975f57de7a147e1ee85b3f0f64522b63b15824f4f0dabe30dcf27bd8d593b514f2a2d52ff15be913f6d2d447bfde4996f8476ee4f3eb5129d498dfb6d68e297164ceec93f6c800b14ffac6c63ea94fbc5064bc0800dbde3646a8c7c05f99d4633de62984aca42649d10c0a3ae15130c2c1143d24961021c54e1a9acb486dcaaf0a1e9e609943254713cd7386a82d7e6d5ffde5ea59b57d61b87b653a937a43f5a53e6b53dda2a22b15ae612f3a6bbbc442f629c6b6daa517ddd01433b5e92a00629e3c97fea5f475f7bd34046124ad4f99428d61daa4570c35e6b6696bc5f2193788b9961904a4d532835aa690560fab7c97a97abcc2d3e547c3eff3b5195fa351f0355a908dafd1f4d768177c8de672b9de650a71e5d58ba6f8afafc1be46aba046abf135da7f8d667e8d563b6a63ead71ad6f47a6643c7bcd4d03d2cd0473e1afa872ee14bae4053a05328935d60c1cafc3710f9b4bffad5068296fcd215e7a3eb6d8b0d259fe16f93a2cd1ad93954e66fc9b82de1b65f24dbff1499b6df70229388f31799fc455bf8036dbbb7fda9d65a75fbe7c95a86bf5738e5f3407e7c7cfe650a79bd4f65aab9eb7fbd15c40a98339b4245f1f68f599f7a3cec64ba7d532bb33ed1f624c4822468ae6f6921b68aa7272c349f272f187e0fa69cf3d1d6ffd8fff9f919a610c79956884979d4c940ff72195edf7a19b800799941f75bfff3ad9701c80cba66d009af077a20afd6fffc0b08d0fffcfc9832d4df0399d5f77a0bf43f7f565f1b20f3c774108af068b6655a41897c8658143421ad77bd8f1632436502072f5dd05c26978d25cf607bbb3a5a682d938bd51b877cda1f1d2f3aad15d62765ada048f482d7862e3308fc20fb3f2d33087c145aff4369f4821774172a1c1b79019d7cda9ffd51a40ab6bf9df222bcfddec4195f7bfb40a6102ed60402f4334c212d213e35dd4ea7fb20fbb0a7347ff1668d7e7ec6a300f4305306d703fd0c53062e405c56869705d2de7b4ac0912b79b0f8c20a097cf0971904fa9841f783ecbf8cb8cc20d0749fc7fc29cda5cca06bfef0f9206b06a1e0723d0aad7ffd8bd228ad8773c0c4cf668d6a4990b8697a124797c70ccdffdeac910f133f483901161ebe10a1f9db9fbf9df2908ec7dcfeaccca5a9530ea77e3fd1668d5aa20d26daa81dbf4ab6df22dbadf529db9a4ceb5172a1cc62dbd5deaccc8716b97ea92d93b6392bf3efc0885cffb44cb6697c3591edeec1c82491977cda39db7fdf944f2b95eb8b390b6aa09bb60e8ec8f4ff8a4cbf835dbe6fff5a0bbce420e7a008230c304913258c2aecbc09c3802fb868cae2ca162cb0a0d59f1dd97092cfd96ee20636fb9ced333e28d9b5891bd0d41ddb2c937f27c92f3399da2924153ac7dcae4b35194610021078a0031cd840063070010b5040021078400382a8a0800420e00403106000012041c9c7e60142d207461ee4e8e0061100641a607081b661411005337e7c5a3d2b727cd0141f2cf2355a3df2355abd7d8d566bf81aad2af91aad32f91aade2be46ab387c8d569d7c8d56a17c8d5699be46ab3b7c8d56a37c8d36a4da66102282183e00c30b2e68a08593850a4c20022b3880010b4801052007f85100130450c20822d07a84b003e9a848078e1907431bc4321032bf068d0a60402f5766951f12f91aad1af91aadd2f0355a45f2355a4df2355a5df2355ab5e16bb47ac3d768b5c9d768f5c9d7683587afd1aa0ef46b149d9388e413efa05f070d7395c9278c49cf72d0b1247285a27b3cd1474d7275a27fd426ba0429f24971d02bd41b740a47649c76c106cd82cb897c522926bada96e8187268c9279d52a22b2e89ae37a230f9acb71a74cd21d195c9483e2bd34d571d0dbae623f5eb115dab115d7746f25977f5094f1e5297ea90ba84b73ba943ce753d144a079db5d5a66b544d57df549e4157291974fd2d6521ba4e8d40bb4d4e1681f65b08b4e3928ae4d36fbb7e0cda9940a03d67a4fe07b4377940bbce498641fbae03da794879f2e9bb5dff05ed4f1cd0de2b23bba03d6a03da7d404ae4d3a33490010d646034f23232d66f41bb1406b4ff9ef2e9daa72ea0adcde7964f9f62c1022c58200c82b40511a22933840b921c706c8cb8f1859415329e92f4eed0ea57405b0a684b249b48a8a4acf76545eccc90000c000040006316002020100a078522c128c88230cbdb0714800f5e823c664e32190e438118067108054110c3200c43310001ca1882904310bb42015b62e036010840a95f6a204e061467284419ade3947a4f284fa46218609498027332540f54a390bf928b3ca217bb657531a3b60d08535b595b8d84a56f8d12a7d43c3010a9267545ded74867d35186cd3870c10ff848c6966f8758cfcf91bcf11ba9f0bf7a305c55bc301c62f71dedad4a5e3b39b409fcafd7845dccdeb75f8b06c8b202e6a41598326b1667b4bc5c852ab311798674d32b03e4a41db59c3c439a9467441898bc054649331f80206635c6b756cb33a15bc4510f1f928447b08a1be42f16213c129fed0534f2cf0794fdd817a4dd1b7644fea76d8170c7e2202e5ca09ce2c25c9ec9ed167c3c71819972d05472db590b39ca517996e83798186b7325587371f76eb914eb828bace167039f0be62fdddf9bac786aa310eb35cd7c8a7cf117b440328b885b93ae1a4a5fb88cc4e0458def869e137a3bff8227baed4ced9f7603311ae7b8415104b444db4461be7d7003915ba95e5d8ef28b6b85d53804360cad98e0d2ff65276f3ec138768323314992f0b2f77cd91b79db581b7ac2e87146b4999fe20e2c994ae993ed4603cb699afe0ce54010f175b74d8adc8c1dc7bd14ce47694874ec744011fcbe80936fcfdea719d0299781f6dc0b996d601d38431011c7048a1d0d56715c321047eb3f10a17419e288b7d9be789c5f31d0292704a0d46920e734078a4e0ca864f027c7b97726631339c57d3a2ccb61a43f82b8a0dbfa0221719609e6644717bb51d8eb786563534080d9125200c31dad7a678a7ddeea585aea61b5a1e38c1d33c3710686fb9c643c85355a129af5eb95f0637d9d96cc476d0c98fbd6480ed8ca2427c28ad9e9d33a159827f30c699fa09c9f10dd24b5667c02742b870542ae5842a8d0241659caf0899a8ac485c269d49ee4cce0756152bc8e48ec2d20bb1967d72a71e90cd87d0f768e23d4f58c60b864b08d9c39d201b28e3920089c58b830737f4f624cb8503b419990b1c693e0429b5ecb312f358b7499f7a193e803910a7466f19a68f81af33ae9cb22e522a75b937ad36060d763430a048c554ee703103cdd55848f17b329541be4ab80cd5f45c4aece8c25a0592824071c4eccc08a6947fd39ad3e0a57ae44fb3ccf91164acb5218a5e2042b5b652cb21bb23f686b4efdfd711fca556588cc5d9bf710ee94b0def866293b44a82a0f52732a429f0edc7e30a7c3a52ad24373f706c6213c7ddd4400ab59311cbfa6986ff61166555a06ee61898bd5660d81eccf74784ec899577143fafc45fa20faa2745f0bd2aad77b37c606b28208ac05f8822d4e690ad66bb520f712130b2d08b6988d5ab13ef24cc447d278b37e3d4af641d1f003e8ff035f4b9bb4744bdd8e97b87afbcb39f04fd3d55580716152b02334c03cb687a70b00aba18a855f00ce1f315c1c6601db17a2f04e5adbcc11aab39ca6f5d2ba3ed0990efe5fe0e67872b60aa03e20fb82622658361db207ab42680245ae55baf4e27deeee2ec5b2622a440d98d4c288960b3b02d6f6089d01ea0a5db0288241586cbb05197e26b4aa7908bf399c7e252504f149bf9142b2844c8a8e3126e5b72bd9977623d821a628ea62b7c803c414d1bb2ec6d127271247ae9893465b88631d2a4d0c7e1707a25facd819b3e0e24b09e80b411193e5c1e7c3af725c464b3e7b2141f5c3340c9e3961b923e0295ad5f46c7743d555a28a53a7ea20942d9fcdcef1c4af0631bb1f9a87eea49f072620a36354dca697e88be8cb14f613fe4d86853f67097887f021b5f71882589b7fb12d44fe89efa6faac460c6437d440595013653a15116f312c04690bf08f7ae5833a83a405c297cbbeb851aab3bd30247f45952200f42a2e870622f44921de7fc0f236358c6e3c0e2ebf11a32799f643f210c040eb8580c090fc8c1db507c179e28a221784571da3aaaf2ce4d9b66fde6cb9e9df5fb471426fa8238f84fa6244ade99cf0a688409b205c4de40d61d77d0ac2b62abc42df8d2ab6c75d75d195e7c6688f3756f20d82128038666efe02866a77563742fd5f7d7f9d793f041304e7c3f078ae375c55a128dce8f92076c849818c7c7c6a2861e614aef1cf7543d81f4e87b3a94ede91977e3ee2aabefd667b9a8410b728148b56e78f60c7389aff8dec07abddc8f3d0a6175803efe67e983a031ad3f9c56952ce1379404e5e3c1d16d91fcc83ea7273d43ebad164584984d66e80ad74e9809eeec7bfd12f0bf23620839bbbd4b5bb0b107d87a036c4a4ec261d12eec785654894876cf9b9a74b546cabd2118cf3e7445fd3f45bf352423aa59b9e98d2955386142f63489e8e8680546f021b92bbc4645c2caded39091b29955aef87cf6ccc5cac12fc05d18de675c572a51c0e8cb84c6ceb7bba0c0a4ace782ecd7b511b292a5cb700f1c739a81235b06ec18a38cb31c11c78001f13cb726477ed645bfdd53cc6d5d8dc7d375ff568c5485ec5fcbbb74d8bbd9bf2ede731bb414e758b88dcd44208be9cf6798010092c431c2441b60106bcc8b660fae0b2dd4b061010692aabf9698877e7b016028143188045a47194ad61ad423faa29a1889dca187b1783385d2651d0bd4cbb75d37a34c4ebd6367622aef62fc11fb901ef9ec12d4b4e193992e83bb3f3c7e730a15daf2b56a876195dcd32da7c522e54aa4fff21d94f8abab4cb96f992f3bb4ab02114c6605854aca0cb63aac50d369d1c93034c30d91a324c5cdc214cdbf4896151b277e200ca23cfe6fda46d599609057be7ed4a474f4d4eaaa859da469e1656d740457469860d8f8e33f07f34939dcb9a0f74721f6d9dfa5fc688ab1135efb31bc3c41c1cc10ccc667458ed152dd6be75c2f3510170d3548a52af3bfb2dc01f016a03f253c5d28460539ec6cd5bae0735c1f2750016c48894eb32bbd48ea7ef26069b28b408fcf83aad0e7d50d5674710c22f3c9a62672829f84c00230615f1332c30246db12d87a373130ed56bc5115228b6690c058c59fe18359f34e2d331e23c01aa5fae6d6f171851d27e890c8da9cf3ea843508f1b3080f6bfd8c5e542ad9055172cc967ca1c4c9f6e52bc049fae4f45eacc3be8b60f4975b330c57b7d4fcd379d98955abbc100926c4888c4d34808d968cfdcc008f7e720fee95fe7a5198f763b0150a01ffceb3809e42db89a9d2abdcb6485ecf8a6123c05a8c5199aa331e31df07b45088ef8a58f97b9b98502971d061b12d38100a1a495cca4dcb0e4b198901b9a4a3e378630ba397d2a4001053500281c688818bfa5231025f6abe5f72554c22d674414db13dd6cda0fd4e08b6a573fd5c0d3543a3806c914cf80a2b158dd8885d74ded1de101d5e1276d5d7681c0f14ebb13dabcf94d6bf243fc3cc81e96305dd7f1a417266250283637b322d183665368c3884417ee51ebca205ffb7597af97efce63b11a8f2ade570ee82e4558c8c94778423e00d60ecac26edb55da75de82890f1007faa055ce16bb05abc3b32ed4ba498090b63390576ba0aaa7aa8e2666fa0644368fc1b297fb1e26c9c3ad12b853cec25106fc12ff42cb505e1a8ddfb647ff1f9c4440cdfe66bde51f45b5777ac130f30a8aa9f023420c0f74303291a7679278581c1d98c720091e9ab9c4c360d0401e8c5ce0d1cc643e1b4e03e03024624fc324f1b0381a308741127dbcae80432a596a85776007b2ae65cedc002651c71515583f2bcb81c0677beadb31cae4d203fd8c6cecd74d481e03460fe06024045fc724f730303a108f4716783413899fc1a001383899c0af99907c168faba1df77e22e02d5de8c68f15c72fa411b6b9fca614625bdf40ca7c6760f14b2b479b6b7231c3370664fc5e665dbf29cc268606ee5409c1bf1c474111347ea998215806f871dde20c3e5a90ca9570aaee3ff2997da0132b9b9d5b9880003b93ce4993d34546db5f580dfe781bae1013b63082d00c4a471b3b115d0452f21fc016fb1786e625e10ac58ed0950b1c10e79fc80b5bd9514d78ca308988518d89f3f20a3ee11e8ae30f4a6990bcf432480746d2cb03c1b9dd8cf76750628cce4257804dbb9b69a0872659e8608c08243475c871ddaee83b5d200a4975bb9b2a582d42520ed049aa6e585819a5f2f28a208763dcfa9e2e06951093a4e405c8b280109eda27ca3174e15ebd5795732b3b6cd94cef8e501a889413406f9de7685f3018f5eefea027151640b2034b77c0c55536c93ca4f14629ce464d673cea1759cb5f5c556618bb18300347583355bca0588ccd06ed4899bc770dadeb61864ee069f602fcfb263d0c32269a014bb07e30a0ca0ba6e0d0e7f7f6c0bd7d60e15daaa7e6d9d0a6b746229ab61d7dcf26b534df4ec56fbb9a67a481b3a48fb7a3f9d573703ae2ca7a87602abe837cc513856696eb0aa5bcc1857d741081a742dfa0704474cfdbe8389bbe64217d413d722a62701aacbf354f225534af432776d735d352fc9781d138617c5a4c725d5eccb6659ae957d05ee6a432d0ce56bc9176ab75df811534c37c26e0e020601f42c0088358dd50e910752c51e0f0448c6e159e5cf4e11b909c2dae75ad57252aeeea4d06cf325e7431974ad6712815c7fb5325cd57dc5664fb2120d50fda10b7adf5e25063c4672df131a8ee816d1df13acd591b7652cfb2f2dca335a42739a7fe816e34b3fb335de87366bb0faa68b23df335c713c986862477b13dd62eb4d62bbe607a69c62f7093a382c14eb425bb85d0d0b2e60f9e76946848c5599c2cfcf087dc12ec91857f3ea57f2f52812f21853fcbf2021b4765bc5f9ac8b1a76657da22daafa246e77e0e79b0613ff03364e7cb3aeaa954f2f8bca9915f561ce28f9e3d9ac8c09145863052aa724215c58f0e785469715a3bf5392f5ef1ab610cf5ebef68aaa857f9e0a1814be4b8822b86b60d9503a360955b4710fda7e1a276850ef2f2f35e1c6a3dbe5f4040db7edcc355f6d873e22d8d8a71a33c08c60ca4b4d713b8c4af385f7b4c2b4cb172706023762180868d3c656b4b8770497ad22080c1f07d3c5bd7f68962956bf76b3566262152c44a6dc4f3bf713f4c0e0541a66024ec48573dada30cb858b135bf1ea5247bff4136ecc822df10cf0e950d90deb540eebc399f2bb12b13b4315eb4192bcb083728244e46bbd5c42a7343af0e3302a89bf6e39599343c22b2767f7745600d6250dab84ea86e22a178c30a9051b8265716e1f71927d6686a178d8c54b87a6951180e6f102e1c7b335cd9d8429004980bbcfed102e4e418a2e4dfe52853f7f6df7fdc2941c8b3f4902fc6e300d4d65e02c0892163a48f39c2d9c5300822db79b15127dcad0a8ab51a616dd061db3a59f966886777c4bb2bc3cb4690449d17bfc6c5ae08e5f144bdc23fed84dc97d5041d6b3b66f375392f7f1c92b792f9d99c7556d7e97b38d1189fda95eb0a5d60f8f8507d8a75455b483923922c0584a66b0bac287cfa48cfa4dd1a78d2b3ba6cadeb37d849168cc68662cbeefe9c1836356defb678b822e5f1d285dfc5635fca530048b456ff5d815ed9ef5523da78973d12266c859de450aaa3b78e85724ef6336297189a83f49078b14241fad9516ffa3aeccfd2ebde473076a0459f049959f44f02f3263f681df0b71c01660154d55749dba9b069644fdc672a40ce3bd0f21e1f547e9bf0e4af7ca03b4b4d36a99f2affdac210a02111123b411f4cfc586dda8391e82c8443f386050b478bcc4f90f5813f18964f499161980686c35eaed15ec7fd68d1c5794eee3120b2bc40936863ef47622025be40d02f0b755d038dc22029867523f93fc83340eaea350d8da8de9da27e847fe055f7121e4127d430ff05b1a3fe89b79f530ac4aa8fa5db3c996ae376783589001447cfc30b95fd7af24d3786a9139d8a6ed40df05b1d56fa3af58e413cff6eaef8f3d6863be1be2bcd6a08048a474444304050a43e752c926e6e8fc06b6ed9ed58b4cf2263018e7dcf71088c47a50adb483eba778db623e007f761df8d06c05f61f720bbcf701f31b744072a0d7edcd0be23eac1dc8ebc6d8c7a6f63a37755b1eda84745eba8fb6ff66379e04ab4b4c55951dd5804d4610719aaf81492ec9125577fd748ee71c29802d48822d2bc80c03826b0f000126a851325ffa4c876712303af76aa353451bc55027014b95fdd06fea3ff418d7419c8630c7af027780e7cc165006a343574fe89c97dc1309c0e2f4eb9063c1dabbba3995f3de9b32e75d6fc7823e78bc211c3f4d1a8387bdc66118184011a41f41d87552ee5d60f0cccdd04670bd628e5f97ceeea945b05b740f238b2dc52ad8f15256547759b01788a05b72d7afa301461da7d77374a8517de61e0f14902ae659da3f64dc2219e0374007766baf7ea32b3c6020c38034846441fa221478c6fe47fa110fdf62f27457b7f20c0024d85183038691c73b3f30c7c014ac5ce22a00ba525600aedf088485fc26e8c06ea9184f90dd9e78891d6770760f201687f091f6718998b3449eaa500951b7274ad40d98d210bf27c933c56f14107dba65122b397b1f446055faff5398c84eb34633b534063e7a0769e09898b3532affc350cfdc8b2600377000cc5b74d141d00a9d3e20cb3d3128c7801b3d589c68ec099c3fe74a0439f0271e7ac544bcc7c36e208d90abca0b1dd870a28fed3934c37dd0efd67f119045525f7fb46243819e1e98083ed7b414d413218b3b109505b08185c391308322e9805d832889c56163534647d16a07c5d26122974c901f6805f5f62c0ec418a1864113506004ac079c4344168209c1ae56ab59112e96183d588cfa7c2f3459a901f323370084413a08b4f64c5eb5fc29176900c8c1c8c1180e7509e9862e2b021914b3eb6ab96fc7ba0b1c415000eb7420917bf79dea14b3b7480dd88dc5136163af0776e023455d25ddb4ee2c78d826c33b92d515d4ab896fbad51042a0db06fc092524fe78c3c1a5ce56b06c852def1002252bce74a1faebd231dc5385be8e9530702025cd0ad4920d03c76b382fa0081cbea2ff27b3e8876f4743c4edc8e3b845747674fa533c9d3eea5cea1f83860aacd4b9a3ea7bb7e8f7689d0dcb04cbc306c94813c8a3e049a0bf1a29f53a3044996651a2088d3752a0de9f6a869c6a0ce8ca614e30afafa34f75703bc1d14566dd576897d83b7998cbe14c5907a35c9e8937551805a7f04435cc21a1db21f38e6e38e3e8a1b123744e80752a0c0b8e043252ee51917e03399047d69c9116996dc2612004cc0352a234dd2c95761f8a147a8fc5f159a5545c922e922d30e5218258a8131c032290c743f13c5329351722903b9e00a7bd6b926527121991cdb292241d86649847aa39b3512ca4848f01c922d84e38069116690bc131084a152e6bac40d3027d334b38069218616bbc956f95a274d956d92d50915496ea32b6654502b6bc4552592ab84edd634fef123b9fab6adeaab75ad62e49141984671849116c83290f11c28e8a703010813c1e8be789ea525c246288ca89808aacda8afa2a00469a74558d8f21f3bfc80b20d15184854a4c7d89b452eb2e44208f50391128d1c406a90cf86cfd116c5d227279c0ac93075fc80e9a85ad388e0b8f55f36a7a40c0686000e216c89a021a37bc3a282d6e8a3d67b95af9a0789f66f6bcb0a780deee382ea739b22521c15673fc0639a601cbb5bb4970237d0dff333d40c9c29bcb5a978da22af0d8084806d4312d8028dea5b62d5a738179117fdf7e232026fa7ac8446e5c8be5e5632bc3c0e797ae62173be0a55f5c4168e896c2c7519ae1a0bb386084c96a0b2f0df6cc9d91155464aa37117d4d4c5f919d16eff169074ad7d141dfd499089b18da19bfe29a661a9cd894cfbd248edc073a9473292a77b1f091a956a65fd326491b74e93c1a3b318f15252dfa79d15f9445330e803dd30a731facc0d48802e034d552bdd8fd42865eb6c0cb0c48ab00a5c1df244397c87fb1f4b4ccf62222b913f5b20385165ed11e8e684e2d305074f199255c939e40f33f0ff4b761aa26d4929a57126198242b9fa81d1665fea7737cbc5963a8db403afe1058988ebab557e85d4d86b4c3c35737800440f7a31ec1858728fa948673e43465f6a8739a9a12ce01a1e99213b5340865ec45ab7c4ddb9fa5ed75cb010ebb3f5524a025845e845c32ec6ff8024b3e04f16e306078f270ed5318251a26da9117a94b5e792ab2de3feb5d28ed10fda5c0bfaaad63988f58a9d0e9ad693e0400dc8a545fa4075d4a38f52fd0e125e17ed0e0c0a1d4c91c4ccea6ed519ccf186257549d590e906f782086d2e611ae6e68e3839f7697e2b035d32e41f61b8fbc0f65cc00895980109fe1c878ed3d596b89eadb89be47a23c9d5389993631d632820b231283244eacccd97622414b4bea1e97ae80d9f14ca7f36afa3bbfa61dc6dd8b1189c3b978bf24906c3a42395572c98978e56a6dcfafad3ff6b8cab3312dbf861ef53ad7245a72fc2dff9a594bddaf5e908b2a7dc4c4ce03b450373db177dd17f78950874aef1fcf514e430fa0b8be72dad001435eccbf05242c5e830fac0e3ab91ad9823439ea048be000a0f781216df6fbb4415e1d47a6e179352b72e2945080c499575b3223ab35d7c07157bf29c41e4dfb2a42ca335bea19761998b9bd9fa6e128529216bfcf668e39e40b64a5608563ef5b73e98e1b1a8e400726cb2a140e3fab65d74204721768eaa31fd9608b71643cefdd2e216cb0a56781064575882d7021ac09969e1de74587d29f8dec895589c2d155bbd6519ae4861f2cff6a086e675d71e2850e17c61884709d47bb2035cae0000301029975a5f7b3478d381c11cf3f22c636af15045d5237a9d469d88c90af483b11d52efd0d0cb36e6d204fc372cbec74a6a5456eaefa27a607d0b8a936416e2d6c26321f0be9003b0dc0737c2c05deeeefdccd5b6649246068ebe8820281fd5805070e0996c57117a9e0b5830b3313eb950d0c12b684f6759ecb39ce6aa6c04535c79ed68ccce93457190df8df7dd38b09727b43b76c6a9c2557b4888417d83282c16bdf9a119b313ce60269bcf34666e57d4ffe1dfeea6bf689bd7132ad1249fb633219d1eb245910cb26ec9c532a4a61cd2d7160a11747d96d3094e444b90ee7b7f28a8163e2c8f50cb8ac3d681a1ceaedf0fc5d174344a31966481608c82bc2901d3d3f2d20a8f6264dbb2ec762d86a00ca57539ca37a4f8f787f644bb3d3c2edb257f875938461ad49203fcbf05621ddc0192d270ead7a1d4627e6494c3d77250eaec4526857944c383f3ba15e3f63dd5d5b9b2ca828c96028a5bfc822346b2367420ad543d442befac6b0b611534f99d39a8de7e1988f8dd10a0ae3a07df85cb8b8441a67ee3b3cf8c04959633903a8c216dddb62e7f411e721b430b674ddcae850148b2d7b44a04a1285e402688790f162e4743304b2c3203a7822a0b797d3ab3f8f68087e2c6fdbe95b41f5e2689aa0bee9ed2462bb089e61f3776b9c5c6b03da1c157266745e3656c4c3aa024c1668252294204cecca7e597673496093132935517891a64e5b0e9c4ea06dc336fd7155ca993ed1c79a65dd8c39cc6afae92ebbd3623d4942a0e498cad8d208e045481f03da89cf22d2db87f86e91a3ba79817f000f22ef74c3dca748686a3c47dfeb2b4a251429869231c834ff269a27c7d82009c72f853058f4df0d11757b22043adf54f6ecbffa5859add2d078264f6f7680819f1d11b7da17d762a6e4c150d1b878dd9007838ca211a14981612bad98177459c0fd3de578ca78d44169e311e8c5209a6f3c8a0cc4208227b85a7ded82630f9aceba4ed2265e73f6c2bbfa5ae912f96ae65a6ebcda38c3d8e4d86e1abd76e85db9878a066f45b8074dd52a8df694d0fb4aaac292a793803156fa39b0045e086d71a7f97103852e625835a1c6fc9530b704801ed4e5fd150a841b2648b498bcd691bb91f1f3baf775c7d7c3e8bd2c13ab0e983a1ec26732b62a0a944925ee8a499a386776a3801f8ae96aa53d5d982aaf366a61bd70365253a65067fca96a9129a1770bc129f80847f647c0b447720157ed49f35b3a8a6d8529b5f7269a2a139b0341452eab0b4ef6a4266f660c7d6ee2c90e5320f74071506f6bef933211a5792e731da5484227d224b2c574a2c19141b5628a13e78fb278f79140535ece17cad967a966a1235dad584d6c14f2eb749d83d921234eb40b276c667ba51339dbd4fb574693c8eaa1d4b41f238411be818a0bea8037cfea631db04f5b62ef36b37dc074fa72ed1935293c0f846d02855d01037a2f93952a137bed4774ada8b996c74f224a35aaf743464c69b0b7c5a0847b5eac51f4f65bb81c3971521c153cb5f1ef8fe8048fa2d188af22de9f8e332da0149e8601850eba633500c84f284314ac3c8f5ac41808d41509b8a64d41f653dc14fd3faea739ac260253b8af7b502178c7fad6c486de69f040035d7b68731ffbf38c70ccc9e1f9ecdbebee0d3dc360b94d0067aa5da63def22dc71a4c5edcf3bfa5c806f3622d41cd770a2d388c8a7bb95c98349931958bdb81e1a4db06acd4730be2b1b75a37d4549390a5632b3ac0222563635863e2621c0890387604c7310d1881d5a77cc2b1ebe24c30674bbf41ba7cd7c9ed06c2176e3923d66b157fe332daa04e0f9ef25e9b82026dfef61c414616d5c54ec5884128c6d0728cacf439bf2458246e07306dc28003b5b9366ef81beb5f82d938491c5e5cbdb08156501dc32e6675e4a381b9f12417a399e08017288d1d10ff34057b0acadd01cc57a01a8d5837178a9d8971851abfd6a54921d7290748c161f70399992308e2a4d198b8572d623f6646cfd1812c43b432ec5b124e7d9c6f5cb328aa264152e223e022cb46ec683226210a31d6da5f3fa4aa3e542803f5baaa5327c278cff7c2f6a5b5c400fb650d636badcf649735259cb0799afb6fdfa3ec4107070d98efcf6ad2d407ff350eea0edff5a4caca6d160c85a9c27f084c5d8a84bd909bd17fed361a28b684cdf9511d0b3685a4b589d0bc00c843d172a17b1634e3164d882d5921b1b7dfa2169801272629b0c3153334b2bd58e6c92e365819647edfb279753e7491276fde7151e9802fa0a5b854af2db76df033be86ce9538c7f9fa7af5e9f1ebdfd5c2a525f1535b15de59e550b53ed7a9a978cd35f91040c23c89e95510c5038c9755bca50f9b42da239e57faf83a07d9270bd3e89f892a127e9d81d416b9e9cca4014b4a096ddadf1f856876b456ca9700ecca25a446742d529845d7b1cd823f898f81482c30de69aa50de0141c2143a6446faa4e80f866e53dcfc5bc20545d739da3efd5187e2db7225dec900c77606ede6d6a55b4651843289fae12e147256168ca5d3be3f95ac230af79a43b1f7f6a9d2663606b02b8e27cea9ba751601590dae9f1a267605894af65150327f792ec9d45347a2503f8784883cca0198a62b133b639e8001501f9b1cab1b0641941d51db3675d0a681387c70aad86ee6400450729216db5d487178edc69344b585f9dd0afbfaad989a3e93b77cb002dbae00e55a34fd7eddfbbb280cdb248fcf915409ee988c66c6318fda8182f55e761011e9a456c6644cdf98a88d9636c7bfa6c480f517e77b07a0ee36e1fc25cd114e6a926110eb143684d2a3093c0461492176f7d51050b31d1427e98b20717d0624e9768db30e60b84017582c8f047b408536f29e999fba3a073b3c000be6b7a707f3842b1cd27ff5e4b9abfdb5f0b3130521bb58d0e70592bec8d82a88076d1cd03a65087ba226591e956ddbea8c576108b3f5984bbdd88124b19568f4d9084776252ffc63a5fbc630d806caa3ddd2f604be83485c85745f4104c4b8e01daa445db2782a35bfed9906c077961acedf3fd3500f253c90f630db432860e0ccba159622e4237b6052e7bebcd71226e307b030cda28b83d21abd2493537b2e467977aab6d472e2f8816838ee59878fd661396047c33a1d6f9685bcf7011ddc14362f13a3656b8a1ade31b264e258aa10dc48d368fb5b17da0526bb0e3204a8f3661153009bd94cce391ea213ee9708e648410582e459948b886c5b8b048301d3e76e188e0d0603fcfa3e44070c3b086611b715bc210a80fa4446487fcf0387dbb56f28e41b87045d40dc3f8fbb6a10f87b4f1ac7fa4b3cb91aa0c80c1a9dce17c0ccbfc7785063f0210c4d5c4bd6f15d93bfc574ed71679abad93aa7ce42265a51f55f503ff67bf2cf1cf5f5db200c5e5b87a3c88c130b05345357047679356ca12a5884e21bfa42bf82d13e5a507cf84bc55efc69c68c09fe8b8db46f9bff2c3efc3860b18b4c0e615c0991516d162d9ec46f9feab41d5370b895b82462565d7deb939aa19f98912de37d232bc86ed369a901d91a7153602d936cfc449c439e6f2fd45f97ec87ed94c2c6d275f7e711a97474ce245c3e403fdbe859913801f1d6b880069ce844f27d0278ee691895be5a33212e22d9e3c8fb6a75dbefc38ebf7d4a91d4be7041dfb0614f89b4bcef8ffdc2cd2db62372330164f149eae57014b0e58b90c2c5ea4a362b3217debc8a91be731db8e6ff00ec6d2451ad5588784ef8287b5f52301b99e94520e398ef659f0eacec29ad83c3894dc41718c5832c6b360962b612ad42ef7fd91e0e9fbf88a53d7673024ee97e1ca17a47b83632b7fa8c4cbfc08c25f0a5b9f493f00ae3dbeb11dd94bbd22ee50a6d904b2063339a77f0e9b75ac1d93cabe400e0b5afbcbead0446b2fe6b526acb7b0c51a8e7291756b93dea28ebf5da9901da345cffc9aec2945a199574571aaaecc6ff93a78150646bd2ac6650b356611555d84e7f75e5518712fc301ca9954c868d1586e54b9a8b70f42bcc975d616e7a336a46282d0ae1c6dca5f424802a4dbdc2d5c7bd9462ce4fb4807feb217aa0288ceb1527fd808f15e2b5b01af246e6f00c996abc215a664c7e1a7ca209e60b0f4c88f495464a0cba22e79c701b9ef5fef8bff7a0eef470cd178b8cedb0832112f844ae39931866650f36802025e43e01447f830f9c249d0cbcc3686dc4961451bee857ec5f4c5c394e87eedd4d9fb4af8b8c876a731ccf7ee3419202d461e214770f6fcfb41059356736e9119df1a7936791c6d3a90458043046f93d9244950232aad0adca5550722e03263cd4c8558562d7e6b7798c1a532f7c3c5d447ee695865fcbe3602a3f3e6340fa0d1671d2e431a73ddbcb99fcc6c00d5979f2f6e841fab51b279bb7aa5b45710460e4836a34827240d250ae7f90a7d6b8465f0125316411eea11ccb9495efc0fa48b39e1a606362b242643be67bc4203bb2e0e7209a43ec1776f89e836507d94d94665f80d545e162a12f166146f9e9508e1923096341bb3f29d54ba01924a09af5db6965550a74af6199667578fc8963bf5d707d55c78993a2f2e73925a0d15e808e1508eb6da19fd185f4fce2d2f85736e782c7fe04c0519a12b28afbe1aa080f3101fb2cac6a26ce0f2b56cc7f6923524efcd21c131f53af4440fcb7da299ae8349e881687c8b101cf1312dc9302a3d7ea711d6bceb15ef8ac3a22406052796dd29af471d3646557e20542faa295aa6761315266f8ccf886ba9130600eb231de82252d2646aeaedbb93493b41363b03648e2636bb94d03a29b37a81efe2a8349803c77d45da2e7ef0d5fc8fe6f46df9a8244280cbc70e8c4b4fc7b5475285556a5ab1c9eed6d368f1dbb191ff1d78a7890263a0c668b9f53db93636b09159f3701acc922e94321e5bdf23a63fe98ceff37a99213bddc773811991188c998e35d6a3d5254d83bf597872d8923f23acee59d5d2a5becef6854c28722bd85e34f8b486f0a9b713da41f87907daa84190e456138495a9fa9632785de8983bfbb18b94865156c69d1f5a20af13109cf437e2882687994c78c25e5ae04e1d5284a2e8d2c1c9fba511dd8989d551ad462547666df90669bcdc222e34441c875c19026b3b91fdea69e377dabdcdfeccae0c983becd20d234191d89162b2aa8c5669d9c02e9c5a8323704891eb0e180a29bb984bec177ac9bf1f46984f5cb89916990a5208e4435fd3916a650d7f5bc4eec8efbb260b54acaf690f5dc2cdb70ab7cc6de583cf47c1b5c82ed9110ca65f415d74b1a6af15cced849a9c20af1ed7652ff78d411392056807ff443c2239e0adbdf31358002a99f8ce8e84cbee5034a9b4c389db155cd1b3366623f0c2504022ef0b84e77c1d2cd07dbc98d04cafaa4842a29529c6dde9183daca6dc6d625d7aecc551eb6dc687902b5c7033ca96e020f43938395d86d350f01bf1835e19b8e43e99bfa1b43129b7c89084362305f1a56f7178219363713417ab710bacffa8b08457abef4140d61460089493fab55791546410a627205f37731e3db71cde4df48958f5eb54f11b17011dc9615582ad1f0d5cc2ec418020068b92e2c7ff3e89973326979723f620e95ca447b965d689cd6f9634c9e4ea43e9881393f2d72baadab034c9f9264aee349f40e9eb7253072e234ecc1992a3f15f14072fb08c5a001e2090c7672e6bcc2c595e115b69bd4f9d89aafb3cca0152628a223e1535c9252ec23efcf0cc5ebccf457071c43c2d1ae1610568151c7b56f86d5c42ee3da388afcd17a74bae1d70cc4da1a7bc834d9a694dc1bbd0c1a7c15c3612aff160342a4ccdd05360df72264337040919dc4f845956c8f63e105a76d2d737528f0d4930745714fb3ff144dd25741c0212f67b4e067e72d1d9302640b95196f469acce7a939313749e054a855f3442594bf53c836a5c56e3cc00833c4c94557bde351c3d2a70559886ce9ed75aa1be5710465c9df23d5b8a13c6ac57cd9c42291a98e3a57a3c7e081bfc7287a7d18f8266b781b21c6fa03fb04029e985a1be1b0eb5a09d67275a886e37a7853f421567ca923f6258ccd4ac919d24a328d063c135c3e50a4315d5715da360466ffe9a69cc109bd291ef357cf81adc620fc2899f6f6f5841eb3ca05acde8b3635eacd6609f5c89d74b0415f09a80f41869ddab68cb02a404ce0a695b6e8d1f4322afa827a74795ba617aa426c8a9527ca909cd98e28464777c4b5f2b849bb155c11d50cde855fc751d52e147e63d346cad7542f7a194086d5c4e535082bf39a7a29b13b4830ca584add2c7019f68fa7aaa75a5e251e69a727b8042679bb7cdde27b563b4665c3a8b759fba395426765f60ceb4208372c21cdbda721b66e2495f9e20cdd5a30e6b8cc2a5b52edddc88660cdd3b85bf0d38c7806cab2df1cff63091f8028c72c600a998f566ce9eb1cf8b82c7251c6b357f53627706484cf14db79965f22b694d524474f56925af61e23e6bb09e44adc55567938267ef298e5d95c36b10f4c994330f6f35ee78ea2ab3f14317bc727354b07d507bb21c2d9eb2fc034936e899a4c5d55153988db7cda3dae2175d02c3bb2d62118e4f85d95ce84ed59ea7798b9da96c2d75b4a409475bcb589bf708171e1b2bed3b39121cba760ac86cb71b7e77e7d98f9cff50bedac08cb6515039433af31a5f82cbfad4760298d3542eb7e74e36a5515d4b6d6dd394acc50824330af40290da798794f2e788e7823e00a2c8989ba20511d535ad9ed8d04ef4bf9147443e844239c6a980bbb8dfeef951d86b1de53c479bb905d1b025ac6ecd36846152192b74b0e7eb9a177702c4db9f6204b9deebeddb0934ba69ea2b8ecb1d0e164f43739150e49a82dcc1679d0c2750b773e0df524d869207de0e8c2351498eba4a40f6cc188081bed89cc60d3a6a8ff833a8f17653e6ed8b1481532e573bf969a88d4308ec70b771bf141366775f8895a39a5775bada41e08191e7193842312688eee409b8fb74b482ade170fb9dc0f5fed190cc22c25ef323d4db747a4246082c2afed4a8dc0d40d990fd9d8032f5e602fa6f770acf303304f7eed0fbf97750994ff43b1b56134357ec383b184fa7ed58829d1832bb836231c4fd8845907c2e80c9d1404144a3774addd817ccc98fa0375068f4ee40259f606b7e688c4830ae6afb676d157045701a7d89c702098567131ce7e794fc15d0b236a0883e17e18b8d341d4ea63fe7c8e590f02d902c0b54725ce03b1853caf9d43e54c5ca3be51df793185d093444043811656786577a66478676ecb05c3de50543c53313541491fbaab67f65738588af9f66e53c53e086749de1b007e51f52bc496dc77648279a2e8bae1782007407ada075552db63f3d524f367ac3477901c0277ee0e0dd0b741af8c4efafc7654f0e9be624aecfd160982afce0f11c459416ffa6b159272778fc5ac7e37eb9c6ded9112404ec7598f972659acb5e5d0e9b62f5c9058aaa458730eaa922aa0ca35d6e04a853b18b226781f9498e7aaff7eea795d07bd5dceb309bd73d6a7fd0454f6a32f4a033f1495e7c17f428ed4d7914e2aa22c722c9d05a070b04a0f25ed2e5ce59f7050a39db8e95dc1e795faed98ee17e3b9276d2036bdd44bba9aa1f33f1d21936d7aa4c8b28b9f9afa42330d9b36ebb842ccb21423c949ada1d47b2589f7c73d6d8157387551c175e0d85cd02fc4348f7c32bd1966349db6532242b029dd31062c00184cd72cc36a385bd5bcb68f66f0e4b357542614f2b4b3f225ef9078365672e5eede044fa728c6569200e3dae2d25e09d48bc1c0b20d56b9065eb680dc82a578fa571ce5621a2e54029bdd75244b271c3c42e51b3fd4b559926c04953c11e4008b54e3ed77ef35209c68eca26227bd8522d8587f2f94ac3437039146308671d6e0ddf391baec95ed9f9204d941d98a403fce4e6e2515e76ed3c6ebe3dc85e76425f03ba54ce73c110fd5e4a0c410efa594764416dde52d63f0ab71d7f76afc74301db3540f3df9124dabc8bc71cc79d4936a9555e279d763364bea078a7b967f1a1cb16f22af0381fb8490398760a891104969d555cd1c804857c3c60fe0ec511c43c9043fc9c49e73ca74c8ef37d9a43253627c86940b2061b7757b0563e1dd9cc42de30c8246f072cc512158c845173813b6c33f4cf3250efd85750ca61ea461da68762e404255011cfeb08c374c1cfdb8db8fe0f985501fb5384843ba847d65b901be4910519e612d30024a19985ee5f9a34f559a37d4b281f0f6dbfcc8d449ca18d6cf44ec5b0bc541c1a92a52354d641d5bed9ac8c5ac67a6cb6bf458ee414ca181ce7b2585a6d3da7e1199073fb17aec93c4d7e475bf1ff39a3619d1fb9876b98704991ece598f4ecb528bfdbcc61457744654d453275b98a63b7402c4f6126dd8ab41cbafe7e44a47de782827634421a6127a3ae19d560cb8339a2f321a37c2cfb23d674cd6a6d71687b5fc22f277cc97aa21f6883a9b7c4ed708d59eef432bf39cd58ca696527a47f4301be4cc6f509ddf4be63b4bcf314813d16dbaac99b067d4dec88878149868cbf133deca028053372b2f26e047436bb019da4d256fac4d897b6a065fa96bbe2f0010b2f0f813f26b8cb50e9fc3b353e40ba09d04a9600654ad8e3d81df24d0027ec6f6c6c9c8a12b7b8d1791267359c2ec066c45e7c23e11e9cb31050f60b77f4cf87047b35747dd49249405bdd614000d2636ad6bcff5e54035dfdb799fe5b2932c466bd0c6954e21dec2efb01248720454c2b4ffd65c1b3d06a42968b0f5129e8229daf28c865c6a0b47a949440682d8149c10682baa6ff09a3578a9bfcac59b2e40cf56c7b8886a3fb8880b1cc2509b6785ff0dab5e65b5e280580728589ca4bec9d9588957190b6b6a2755ad9cd8f5a08bc4bb434048947c8761c0eb6ad2c8a92efedbd154a21fe7b5b3d13b378182bcf2e86027b785810f9ab23555b4dffd928fc441410d43b78f6860ebe48d19c8f2308fed0e1cb681d693cf5f7d0e46f8d23d344172d4a1b895d70b4ef68997d45c41b063da01ec9664b1291d0045ce18e605a9504b65ca02f0848ec3446ee334e2074128655ce90744020385afbe55a46345a0392133564376499a31f82e54b43c2d678d47f4d242c61a14a75d7d25592fbd2714e3a2a32a4d8d776741a9c06aee27c50055f18fae37c0b80f7b2d892b132ce7b42cdf54ba0f5cf67573df59aed07779d073b00b1c60d44862478dd4fbf3c6df4558f17b188bcb8e805331d697cc508b3b888694944a50212a3ed82ca22a3e57337d31a86ff29b5159869d58c025d0c72cae4c4524bb3f884cf20906ce9185d04436b471562aa2ed5570274dd2b4307c1942906fadacf5e28a4b7624654d2cebde218b590981e51cc706139114511621efe40c5c409818d54a5f0e1e265ec2a647e7854871118aa74b709cd39d8a1222f5f2d919f6570baa22623e32402c0148d76f45c4e22aac2d938dae303b873512ca742cf1712e5ce26c675b923cf8baa9c204b28e61e86e57fe54e27cb6068ff5e603fa68d052af53142295c40ba861ef838e82512cac52f404686cface6a938df37465a6b905cbca9d66400ac835ce6b05f323ea5916477f8c5c934cb92f46175d17d270deb44d78dc7b65d62b617eb848dec6be47804a13d9128c5970f9e7dab57bd47726823c55de95980a006554547e8453d1947d367626bbe0c6056c506aebbf547906c9c81d6da59a904914aef1acc932d3dd4a776ad33830a2c6f14c49d1040edb4602c651220981d7f221f04012f448011411f23bf5cb595ffff7f3d7731bb50237a6888be0fda84a7bd6369ad6b8c464f44674ed326a3559012a24a16dd9afa9f40dde3ae909485475d83dec6257edf866c7757c1d661882ab31b82f35e23c1bd78d936546e258c84e1e0a82ac3dca8451cb396d61bf90d147f6617856b7c714cc01a909ece26888c371d7cf00b53db3380050e4a3d5e7c18682de757076380d0183a9084432c0e17064cab2ca77471d22ff181cbe91396836f2e568a531ae1252cd09e3dadb8696d5f72468966f4a6ab088386674c4442d476ac77c68cc8046a5d72c404b2a54750a36ed1d19e6021492f96fcab5b649741746973ab8d9751a4eb32bfe578b1b850eaa13d503b04092e29b44a080b692e15fe631737a9cb2b219e97670c51d6c590b2a20bcfb877935cd6e88974f154288f5a73d05bd894faea4edf75184dd7cab742c18b465f456f35a42fa26633543721123c05259443f3c5cbcc103609ac5e0e263af98fd09614a01ff0de53ce1b4a11831001f76f92a1d845e8b9e793dfbb1a00f6e316e88ec3fad388b0c1ae448af79af351904871bee1cdc0ebcd21e202de223b2c66a53aca7bfa06beba00dc0f9c80fbbf5d7a45967317749c5a5940a997bf8b364625618d8b25d6bd8212b7249a717a47d6d30ffb468f6493b4dbe01591f62dfb434a8cf2f22bf02711e99799a6d616b11656a4577d55838b81b38227f29c3e852bebcac03256c8ac3ef768c523b966122ad275e9202141bd7982530b283c5259a5de10e8da84d480a184cf3b126833a444f3893cc9a027760f4a72f038b72a1cad7ce140af708f365000635a780addb451d8f725c6ce69235fe6c4a18db5967b6771afaa4db0c59f2a017734b97fbe2036dfe731218de8893874e5bd3f1538b41366e123c18e91a088c5873dc1d3782dc96f35ce4ddc340ea54258f93e070d090c93529a93962fbeb7adb314e5b9a4f581d3fe47270e10108d8c6dd5cc4539a439574d9c089ba220a409035a9123cf3940a692fb050b541198ecd3affcd741a49e3d7cda3a46d6b4a5eb5c1ed7b0e47352fcba91f7aa39fa481d43a2beff2c44a0312ababd13ad4129b21f544605ffddc98c1a290eb817933626ecc899c0615b7580f3196208f510ae56836085891ef817fbdd5f5a9e9bc8099b42a486360569f24724f91f2fe961c520e5bcdcf6fdff387154f1ce3fffab37bc164ea2cdec42c268c21dbbb429309039dfb82f7342b1707560f30e7a88de2615b4051f807b04201cbbe14f889a30a023ff61239e499f55394dcfa7730754f9113688e5e0b9741af94893c4936c6b2939636bbe7332576cbd1621895cf23cff302cba3df1ea0008ee8e0e5a016c871d63179e9fc1b99db5d1facb26554b647643b1b78b55278af19c2d6c6eab6b146cf64a22e2065289f41ace39f2d2e850cf289df049ad3ad0edbe07912be1e1a1a6ed870861136faf77f21fec2a8b8d8e77b8f02a85fa55acca0055c9386ac0febd538a6130e65e2587ce8986de08d6c15b7d01023076771ad0098c4f073d42b0696c3249dd30a6fc0e494f26673edd2b48bb0e528d673db4eb7e8332b42b9951ef3d4ee116630609ccdafe1eca374e364b8cdf49796be09fb58f57c2233c695d9493bf890885a51a6703c8f42fbcaeb8bcd530e1f80afa648ac794cdadaca5371e807ce88e971e78e7ad33aa59698417c56adf5423ae6903a743e2cb40d1eb4e2f13e3ba1589f9cb34dd329420c7b8cc92d5f718dd906af2ff66256614bc2a2a1ddfe80fa263151f58706715cbf1f5ca349531324929d7523817a9e14e03b50b77929287b4c7cebf9d1c50300a00390168a836e8be2acf6894547180e29d79dd69d573d85ab7dcf99f032413da32e3e590384831b2f1a5e1eccbe5ed14b85efac32b393f8c8e329a0a7cf4ae48f88de385cd8484567ab40c5a4e77f745a0e49ad8967b929a4d5977a841a4cdade0ef1ff50f56ddd2662065ad9b74cef19f89a8aeaf0d95371cd985ce6e13e0ceb397e79db5d5e6aae37a06082350e50eca89478195a3626aef339502d882c2f3c90dffabeea891c1cec074ac447c6ac37dbbb442376f84936d81e33243cc96ddef3be0385408b1958b5a600dd8ad7988a3c6ff88e0c2bec4bf8565f08b117da551a780ab94007dcf5604c339b67b5c7956320304282cfedfd2dc2ddc6ee4363b093bbeaab30110d2c415d0b931cc9003233181cd9f10986c11d35c16cf4a371f82b150b986140ad4a9622b46e0efe5530000b09aa22b97bb36ef575794d6f69120827711e252a7bf98b67cca4f49990d4cdde8f204906e029a2db256b02811426cb872a3e5ac4fdd5055ab007f8e6104adb3a56c7ab22cabb491f589284f9a6815d88670d6b5f758db6b077e05bc0ca1c22ac972185354281fb7cee49e7cc1826af0529bb8cc60b4fb52747253425e7bb987492a7d36138d846c42ce3d19d3056bb53a5e802ed36f190ca491d92e89a1733abcdfdc14b6881a33a267993302ed8d7940fc621e02e626ad988fb54034b718ec1e03563508a0c9ce042113e30f7300b9a2b2a839d24d1ba39a9de408297b5a9a2fa31eca9bd42e99298c168f087524e1685735e859014e5376022ca762f9cdf4b70169db15cd49e6ebf0c1ce746c43e92f4d6c57b0bf838713028e3bf9a41c24fc08a82be912ea54181c04930887dd5a5057554875827faf6dbd799674beb99112cec463d048bbd8c4ccc83cfb45654cb65ed46f6d42c82c8ac9e1d23a5a4991a186da0ec94732c6d5b9283f188f7cfdca20159f7a330996e8a0fc0c26cbe6b68e511a9f52258d41c1e70b664071e277754e349659732686cbb6ab5d0f987439391bea67316ab38a9bcd2b4dc59b7212ef468b1c62b662c732bd44d2f0f3a28a7ec6d4fc4f25963a6a031168e2375795372e3b60c94a701f255c6fa235793774d44f433eb0272deebcded6ce86e7a81ede602d05d66b5db0c1e3090f58663e4c3c634e24cb7511612af974db62d9d26811038c4f92b16646300d734ec0f2001bbf0869b1482013d658192ff2cc0018b36e3366ebd686eee8966424321219e4644043f98b6a97f1b91e29cd457f4519b5cd0a139fa25681d0275a7335bd831e6605d5a2821b55774313110b3e4af09096420e65e398ef0a70f85cf5644e74441dea38fd5e9ae6c0b6e591a150526e608e3687e40858e01be674d83d327bcc5ab9374d294cf76e2ca72c3d741387403960f7272b61111b90dcf55fc5fd7ef0684f8efcfb917a69578c1bcc40e99be04457ca5ec88e63fc2cdbd1319fa8b57d45c5165cca8d46bbb94486e16f0e5773bafae96c926817c053b4d23777da210dca3e4be863244fe03680e10a97cf78eb19c9f8a307de07a99ea1ab9e16de495446689b3bd22aaa807b5f0243726e0bd3252b7a7215484e90518001145a477188c946ff2374a780560cb2df733a634bcc0b0c4866fc743618248c878a96c70736312939faf1b7f9e6a306d201c5b241b075abefa26f8aeef64a19ba730cd58aca29e9581cb82887128cc33646d626a9437eb8af36ce266b3c731035ad323a43bde9ad549b32f29a5b907c802087a904fab2cfe73052530ec60f19987a20ef554785401815f420001c6e09f5d03cc9f28f9a5d406baab975367c4ce5c2097e7db261acdf390b653f6be8c4690ba4ccf006872a00100470b12aa494e0cd8c93c06d7aee094346672586a359a544885eebb1c90c3433b1b0b5abe8b1975512922898db8ef2679a3c4e608497adc5d2bfa4bef5efae92f05221b26acd2599e0209849533a468a4493b633266a0b706c0d3db25d7083f230faff0e7c45e1927415be219c2fa55c49ac9f2412e872880a4d29bea55aa6c68c9065611ed69cf5a8986588979a46a2063d267433959d4104e8e3f8d03719111558277316bc87494bc95e3153727abbf18bd9ead41453e733df7afeaa0e5742be611a6714c397a1bb1a8544230e2c0a317c56df987ce3894b9abc54e54b4ba55d446419079a03b9c5f849a99662ee17b0e6d882025ad84364ba9834ae7bbd975f3c5bdeef5209d57b44dca2ea2c34c70b813dd622197c9fd9f968ca31d0d01303d687261657e33faf31c2ea40f172f71e2ec93f99654a49a63122abce9f773f9474549171eeb070462bc1b81667d06531b9698749bb0b4623d3ef349b66e48eee3dfd1b3203ed1e8d1509cd194712eef4567819dbe47fd076ea4d06b17fbc41a0618c67e49d4d13d171110a5ae389473d900770e052d63d6f957bf48e78f5dc0a2596c4b45f06f46e40ee96ec844cfb990a1d9b4b2cba1c20254429fb4b60957323925ea438433ad928f622113f4d472477d22e6bdbf7167bb25d3c333a2ab4fd9d55406a351e4a51a6f339ea241e273003124b67aa52f19f50c24249a65bfef72837ec09c99707cd6681d1c0c08036b08b0824c18add76dc3fd663da72a039546b536721688c3cf96e421b5b502cebd86d1b76634d5721add45ba516ceaa8d725997b53611d821afb347be8589fe9f539a702d87220ed541e339b0762446b05955cb4901bab2fef3dc29bab67eb779c12fea1b66e7d62988a367880414f34a5c96e21024097886ec4b4de83204530069533c03e434024a5311465d404c4a4e07f6a28165b90722519488252e42c70055102db0e75ced7349394fb5205d47bb9175bf6f6e542f3090fd8bc7c6ff54bed3d98989fd016c99ba549b829e3c780ff4babed1e2257eeff6c51f99f8412144f6de5b6e295392520649044a044e04e28bfff2d65432346992060924643196183cb6c0610357313561c21cadc182455e3369d2e012e07135019a83691c4bc1e32acac15b972eb01b1020d65a6badcb5a6bade560b5ead5103cba26407f5cae76b5b535c8d52e171f4c031e34e0e1b55a8247d6c52f3468a26e44ddb88df03466ccedf66e6d77cfb6dd73cef9849cd85a8ee32c0b3716a948456be58823644b50a028c9946432a4d7d29219334a3225990ce975f192162d689248e268cdcd071fb870519229c96448afdb8e921d2550b13364c8e09105934d9922ab4141d166b4d98c4976710d08206833da6cc6a4e4c5cbc5b3a6a6a85bd4ed0655bbc5c0aeb5569faeb5d6ee6eeebf192ed126daa8d83c2e88356c369bcde6828aeeb5ba4b6c71958a9ab355107864312d312d2d29cdd8c5b31b4b0d1e5bdc6437faca9225ea1675bb41cd2779299a98152bb017ecf532012a76e6ae9cc0234bcbc5b633679e6a4fb51a6d32d9b66c0157af34b2269a408a21c562301925af0ccdede909ca0665b33d4d9abc37344bb7adb576568ee3b85a6badffcd02d440bb6ddb98425632710910068f7209fae22852d14a326e5bd435366ab5b6aeb1b1842fe1e0705742e0916543cbc569a85099cda06a40d5b08940bb665646e091f534e369464d06fd19571763d6cac6d11c3bc1e30abb8360edda7256c1da0970e1c245183cba60ade9ee1e92b3599428e0ea950664c2233e62234313ab5205f682bd5e38c85c1c5323f3aeebba6e76f7deeb5dd775b7466359a381587dbb2fc4cd134310a406025bdabeef765f630a7561ab35188331256a1c8529919f7a2fc6365b2a46d7dd5035bae585ee79dd85aad136ce41fcb56496add8c18489ecaebee091d548b1195bdd5617cb6ea00e78c423d09f119c2faf9909ce39e79cd3db31385d8325b09cb139df2829367378ad4649448c928cdc98365a93b5b269540419737c464948f9eb162562a47ea76a1dc0ab1a2521d11fa41f234649b565946464095c5f7e49229265ca03a3241915652379aabb76ed55af784480c7f95a31896293e9eb3b1c5d1841a2a2ccb1582c0811191123321812059aaf204162b1a3579058fec87c72e7bdee654ae6ae55dfb6b896bf0184e0afd20020c0f3ddd6cabde5aab596737777777777f7b75cf57777afb556ae56eea5b51c576b75b7e19863f45cefbdd6bd7acd3b1910b8793cb44a5e2f992ce5ed45176db25882951ca9813e5903794a4c0d446b2049e448ad43c2b0dfa57eb8fae023f50e39afe4f94e79fed83d8ef27853e0d7d371930cd46d224d24af5dea95f921ea074a1b067c9ba74529d6bc25654f0dfb73dc2ba594524a29a594d6a64f29a5ddddb5dbbdd6a6d4296ddaf4f270829d4c1134a38db296a5b47d0bd8823cb2823a9854b07482a296e5982c9d4cb044364a6a922f7812f3d34ab8b8e7fbdf961c734c374a6ad2a4b66aa535344a62d2fd46494ce84f33619a351925cd8c92684d4d289048792853333161b24445c94445998d92985051e6fb820f7822f980a7cfae6d3ea90229482f182aa460b09b2d47208c96ba02fb545802a3c0bc1eb1cf07153a1f489e0e3c6e110c2a098c2be2613b628b548072dd2945aa2bc8e51314bbae29427af8c517c4453f68aeeea6fc90444e4477d6dceec21b4a61f3819b94277c14f9a049498285a21eb49dc7e07d0b6090334b2f772f6797702a4ba71e21d8018342b829625d931eb01d7aa470660a0b02ec593af190c2da8efa047510f45582c8f4e58c45964e3f78e8f8bc1b7b10ad5c0bbb75e7dad8dc877e643bad3d2b7cffeaed5ee7e586307dd6d010adf6647d687251df27250c2b656dc9d7a9de744a29a594d29b9ef854b5d6da9c7f9e4c7cf56b2b7f13ac2d243da3c3a1e6711d3cfd9f8486fdf933c491244702f3e5d3982f6748633e17e298e187ae3c65fffc10e8f7532ae4933b635dca3a43b03f5d5a923038c8fd9449c2a02c58bfbac7ee1e6a837f6229d0fb0f227bfabd05e69659f53d63dd4d28b592db7f4c68a01cff9bcf41043e0dd583ef0f827fa3fa1c447608f6bc10c70b85135ccdd35ff8cdd3ef85490200047baffaeff177c109879aa76f1e7cf06bddbcd712e10b45c0a12a1c21f5d43c6df360c27486609be5772ac60c1d37efdd3c8d2fccf19b9086f737ef79ff852724394115e6f87b2f8942f85ef5aaf00430fcc2cf0bbd3f2104efbfffc213c070845084e6b9096ff3cc1c88c061c7124a9c5d923da192f9a2ffc1609a47bac4848aacf9a29f6b61305ff46f900453267a0013e05404521fd47046cdf69e1279210e1488bc1fa2357bea83a319346eeee101534a972813659a5d2410e541f2f48b62abd5740947024ee48533c806353cdd4786a790c9d3ef3f4a1bf7745bc8ecfff9fe86e306799cb1e7c25100799cb19f24601dc92d03280ae00b3708fbc71fba14057f1e692c779b2636356db62005014294638632b71b14590f295043d44f63fd146949d586855fa42226cf3c85d0926707559ad871ce38216c99e3b8c76c32c7c2155ca9cf12e249ae549ac8f53d15a3bebb737904738b1d2d3414e47ecca29242ee7f2a4e3424599cb4ec4a90c0dd9d95fd8b141f6498f24295214418701a73e4a542122332227f19133b92ec597ec4b2dfeceeee6288e674a2ad9029a5d707eccb8dcb132f47268ca0290619a4b0d2a444d41d711a32c3294a5c07ab93fea75ea4ad5cbdb55ece5e4a6777cb59adad377c7267747597b3b5bbdcc4d765dfe93b6add2da56b74b930c6348bcbe5f2711db99e5cae2097cb77f8e6c4fd79457928c61e8254bc2ebf76f9920f4b21a2b8418c962b6cc6b830f461295f2ae0c3120887871330e8589242096c4035a21802e6479724669ae45f295f2e40151424616060bfbefd0544b178fa8b82a41669e54a0c5858a2332ee845d6d38b25edde7bab7bcb9d6eda596c367015534367d35a6badfd6ffaf8f87cb918b38a64c4f0699f02f8e04393341ac560f284990291eb5b19b5268396c10c62822b3afb51a3d16833da6cc624bbb8767bf244ce3420183c6213a0e48d9da94d6bad254012da6ddb8600681d10046178fcffff0fd3db870c787e7bbb109d74be98b6da23dfd7a3d45426a5b7c8746f6b6d4741b9db556bbfd42f5e17ef7377bf20375005240f6d80e714ea077601a70eebde9daab5cb8ded9ef8e4cef42a4e219aab0535f801f7cb29c4b5c407f3412e30edb73685a6d044d3542bead1e4e5b607a6d0aa09e3546dda53a8ccb561914493695351d34d59ebd1e04e5976c8a3eb045972c852c35151919acc020216a49c5f9397e33c8b447705090b3606d9bd32e4a8c6f0e2aef408e2445ed60a9b1f3d0456addc8e88285929a3c210262b5d5688a1960a02ac82bf2c9d74dc904797191d337c6574c0741c5590a5530f1c549d634031779060f73ca5f848b36d4ae9fb943db552da99767bb7bbadaf43a59455cd8cdeaf65cff4aede2c16d77afcb4feffbfffa3e082ac01cf3666ed6b07f4f4f61fb7f53decc6b4e7376d598fbe6fca4661696c2a432da57c29e5f449c4bd40f66060011652f40b2e605b382c48c88d935b014f5de4942e1d2ec527b9eeeee9fdb7c5b5707be8ae03fc2ac6027adcebaeaea14bf674004fef1ce6f7de5a11d79d20e2859b8507ce24a248e6b0648e0835997b8c450a0ba816e67afe24f7d37b2b167fff22b83b1269a72d43d49272e3234f3b4334b118c22987dc6f5f0b92cf9fea190c7124060d415fb1f5b5c1c30d51d49e18a2e44c27059b342ba83132650a51774a5570e072bf8c074818f2e2025cd12153da5dc68964c632e78bef119f431f9ce17d0e0d7342e8fefb10ee835ff7a2d7125d5d3d1ac539b27c9a668ca33db3dfade304db49dffe97f18a1592a7bf5158caf541907bfa53c2b04fc3b18429ce5a66b1037b00429769087688654f3fd7c2913dfdb6a5823aa64edf521754ecdf1177764417b761d8c6ac655aebcc9ef38197e97b99baac7c72075cb5805954a43e30e01bf4fdbbcbd9ea4d690d379023dfa09fa38504836a7a28b20214475cf9237337887fbe381fcf675d1bfa76614ca10cc817fd2bb2fcf2066a05759ce099257743c2e8c9fd2648189d5ba2c003f2870b4216902ffa47d96a31848022b8c58d32e3e3f0ef112e9843c8ed360be2090d508410a928420a2457cad8d046090b4818dcf75fe0d6d0ab57ffeb5eabd70bea38c19ee54cb9d7d9bfad9166afefadebbd6d953073065a1a903dfd9f8e13cc65eebfd6943d550615878a7c14e5f8cf1c7f99b94b1b86e9cc5cab48c6063e22b00403146a969822c31aa216818e254c48e1a1640d1427b873ce07fe3eae1cbce201df3041c218923d09904214902ffafb5b1228ebe8bc9ce1fc04764cd88d7e13fa5bf40d3c22470d604ecdf80053a12871e19336ae098985fa02978fe6a0a5069982a3565e9f951f99de64e954c5899ccad2a94a127964d5bc243ed953f449f943dfa507ae7e49c58ec00c49f0f7320932bc304697fc717ee0e54fce7044a1e52f532048245e82f0820b106d461c79926043924121d797b296842997303317624092c9210936e410b1ec2106e410b18c23d7709c5e9643c4bc3e5a52a54b1e5d57aa6c8955a9824315285a54aa23022cfc70a45bd5cdcb3dc619f405e72afb6d51fbdcf5ebee77ca173e6650ef8ed779ad0e7aee753b194cf1b618afe7e66a2ac64c4d5cabe355ddc9003ff129e51268962bbe2f057e1ea594523a8addb1fe72b6629504b294368b524aeba4945600e4933b93b657cbdd54d779a0f781f23f0f04535d65b982a44bb7e1e7d5eb1b56d7fae6b9adbf51715ea7b218571c1c57a1628563f1e98f145f74f5a7c0d50d169f8af4267f05373729f0e646d5428eee0e2f15595ccbc235534adbdd6bad584a79c5e6a1d6769c924fee4cdaf65a972d6b6d6749736baab8390f765b5901e5da7237754355b4c69a3db00359b8b250e1e05cce022ba5b415803265ad6d6580c572dba5723c9c7143d93c99869ce5a89690d7bd392a6df5dad43930d35d1eed1d77dd71f8757770e7db6b11152be0f9b725c28cae29103adbd06f2a46875e777bf9c0cbcd70393160777b4975b7971bd5e566b89c185557c46cb75cd7ddca812ac5ca81ea8159eed01fafde7ac00c65743ff07cae25029219d33fa8b9c15a3494ba7124a278d33b4fb3d39f162c8923823bd2c6b52924b2bbdd55c3bad77d62302700471014664b07627a58418d10a3e6b33d711fc1752752b43132aa85dee89a7ee5f90deba3f9add4375c0834f112a5cc902d3938a99280aa558942834636bbc000454352ec09121344e384ca1c4062c10a11262668636ba43137641c293e615e19bf2a1503ab56591525ab548faf6495d311b0acfa9b540c158b8ca75eda82b84d62a4b8190421cb2ee6ca3de215062a739c9c589cc2786004c12c31220c6e1eb5ec24b8f75e10688d113664f7bf3c3ce731a203f4ae56272c49aad5c0c60898928ce2a9090d513e7e50220d6bbabb12d95b7077cf41e3e20b1405d0f98a42e5c31d7ce99169104df402957556ab296d52135c8178f5e33c5e7e00572e4f89ec2e573f84faddad6fb96a5dc7f5cae3fbe61c6bad1dc81e19761015db76e843c5aef675469cebcf5abfa5bbcb4fe24e8e7bea8107cd6b401a9e72c84f36f420da59e3f459f84929d34cff822bf089c86bca74a64cf14207c26851bac280332848c3a4061d90f0f2820d1609262ce844d05fba284890f13e2341a2ec0e900c102f0a99219d8feb5bb02eabcac08fcaa84ce53891c6099b312e4f745cd83cc132fd1a4e4f2e642afbb274e20295659a1a2b4a9214875204c8d761b921cb8624518cbcee0bb08e6271e2224695a513975abe593a71a1e59155eb88f8bca99494524a5f520d389a1593ae6815b35496535292873e8b292008e680d49f863b3afea3051eeeece09b152b0ca65680a0f4317705a89a2de6fe48c379b4029b98812b8ec3e0aa05c88613e2e44ba284c90e243733ec9041cb0e205e0dd72c9d76c0422064f36da0db5eefa5627360ed7739e914f2beff6bd052ffb1877a608bf9825eca6a512be78b9166fff6cf9ebdc5e7755c77b9cad9da37ee5dfbc6b6dae9146af9f383e21b678edc302ce537bff306676be6569ea1ccb1e4e3a04c99f1faa8349630a8148e3a7cca686400000043160000180c0a06c40171489ce6583e751f14800c5578366e583a1eca4391400ee32008c2208601188a6100620c32c419a51852cf008b1a98bf1022a9f4a06e621a63c612ca7535b7e9fcf48955789379908d7fe9bea68985215535aa0ea5367fcbec69d021a7126e7cfd88fd07215ed23595d30870be6167ab553a9009c6631fe8c36005d1ca495fa5db8c85349b71a1cac9eb4cfdbcb08e8949faeaaa6bdbd966b18c7893d10b96618af500944b001fb8b353828907bece9286209061e7582aac318a916c9567ef75ae322a9ad2cbc090b34888adb07beb3b14e2dd339f3387986968100826fe24e7e34a1436ea2b853005b2ca74ba71274e480fa93b1dd98f44d913eff34ed40dc2db73449e92253a4cc518ef0a3c23294bd564139486d4d7568b938bd0b8a7983da637823235d24208ce29f7900e745f21de28c24f82a103604bdc6a5cf2c2c4e4ddaa6b8b3c4b2db527a5410337739f00eba8403162a8fce8420cc7fd6091d9d3348dbe9c31c2b3333b6a5b82972050c0e67b87f0393cdbab32cc5f427f121c9e8bbe36f52d3213cd64a733823ea65cac56debe25dcb443202742290e30c7e2090c4ea566949e2675adc67251c3650ad6bb9a933bc243777f1df638b4de1e12496c7a1c9a777fcf8539f5916008d4e5305a3a56b74a2334e92bab4cee7f68fc0e44a47107bf1a750e7e86f16b8c1301ab745ce52ecda10ec5281766d88ea3209212a31d5dc38fecf0556338b99d5f750c8ba8c1868ce0a562a8778ef704e35b88439521e25bb83682b9970a7bbee387dbd371a43857081918293db9e281a4f1341509a8e4b2f8ca3fb4cc8174426a9beb120eae30dda0333246d48c355c8e2635c9a86db6868dde520e7979fb29832104cf0eabffb8a8a3e58126ac5ac66ece8a4cabc408961808f57eda4185906fd2ca8aff827a59d71bb29880cd6e03d5d236a90a83debd8001a553ffe18be6bd1d9152ee184cfc603ac0a1a1ec5b0050e41310d9300068c60d4444346f254ddc22881fa1b0006302ab1578ea46bfef5ffb1630e777324bbe36818dcb0b04270f6fdd86099fc154bca7a97e4c055bc699294fea2c2dc341203035adc9981f0f4a2ea58e8e0d6efa907a6da04c33d7f6a3a9792e94f18771e6ed5ec9e3e0dbedeb524792fcb4fbe0e01025a656e1e7481c8b535e66a6c265b964abfea09ca1cb632c63853f4d32cb9d001120324f0daf9eca5fd6ca17eb272c128ad4e9ae2dbc9c38d919953532daa573a120bec7ceb9f30ba8fce5ccaa0c4aa16f3cbb6de7c94e75a0606237d51b8e2d12ebd1c86bd8cebfac8ed51b8e23310c05de1714200a576ef22b10dac69f2c8960889be7ac4fabe2d1df6aeb66ea1e8bf5c1e2cb84938297adedc1a9c3d3d159901a6cc5ad175a7d5e1a9b6c221ae5fa56530dca85b03ded16903ab733ad92d3df8466f5440ccd58255baa8ca408d4682590aa93ecc2174f4095f53581d3708b2bed61887b3dd8ae3c0808beae39d257ade0eaa0535e7813a4232f1cb5a652d94a8ea117888e6a35e8ff80793154ce0aa0cd9632d38ad123664b3705419fe5150913fe6ac996798dbe57bcd3df012442e2f58320dcd0965a3d6228b078b7bc64e5c8ae447b56ba2a2173cea65c0cb0e2c86e6d9171b99914c13d1e455c46c8e3be6815a52ceade03ffcb89d08a7efe92071ea946841908ceb3b0d15340ff6dd71caef6bcaa803fa5dc715b868d46000bb3c03a8ea97c9f95e4bd5c7251091176f100644c03fde5d72768c201b37236638f8213e164ad19552f1708b30b5757c64a6cc52e768ebed2c2732dc676437b50460248a578fae889b5bceafb4b4aa24d2218a7a128f6dd9bfdf1255f9e04cc63de24374184347a878eb7cefc8dadb6b0788d170a64caaf4583c5ddcc5f9cc257257b0d026c1bdf99573b19038bf7ddb82dec2f3fc13c3bb7a45171484f3ed497822eeef64bb3865914ffb92fad998b061e43dacbfb678879a7bc8e69d2c07d45b247f0e6f1a3e80f88a8874beaa455a2269649537f3c417c9997c989d09bc74f0a8ea0c33e51219d2b5db7c51b33f19cbdcce14e0105bcaa2c2473f4bdf7b4fe1db8f52ed165fa7b9394f99637d50ea6c6c36d019c4e9a85bc15e46b230d37ec48f1eb4857b4f5d8d097912282d0818d62bf89f8c7f66a90db424e5c3931af233969b380e2fc991c9c17779b74077c047d45dfa7949efaaf73025ea9c195c060e1e17949ffe7690d7cc553cd05dd421411746fcedcfaadf724e1231b660b462c09d187673fcece684b18f98c7a1c9bf856dda90d9a2df2e51e222d7ea860a63ac191cce04373a3bdf568434705af1137706eacb37be67110da399392245218c01c2adc210ccb465529fb69c6a1ba8505f73032023a465170012abbd0026dddd5ae4acd853a144ce733ac4643b2173ac672aec26222f1044e06bc465ae53748e9b1cd90aea091d5adb75056ace5d4e740bbee4980f43ae7558e849bede8a9e86b92d2d5593be70795173b627feaf560782c3ec3426cbb9590d8477e8b9d577314369971565eab5d7a55a6476b9cde85e5f09b58d744fb10c24d617d59100811996043ca3cc4ee60fb4af2a7aac1c481d780b22e49ae0052b8522762b6510f361542f8c41a61a9ecc593fe06080ab86a1bd572cadeb5a982cc62eca63cca89787ab263b620efb849d7df18e2d06c31b95ae8650a5ac02621b509bb71363b2aacde3f56e1f00dc9fd41ff1a2d2398afcbf8588b301d89f8950ab1286492e1e07a90b6678fb60120c45316176331799d8286f4572e34dca9510ba66805d0d489e452fda2c3cf65ed78f3c07ff356caa0b7ed3b109c36312a04aa3e47aec836ae5cf16c0440188b3c46dd55954ace54c014914d5ebb7e6d249c85afab639bc33da42d46c3704b334a31d7710f59714149a44cb46eee4955ed937a58b57e0adce710b1a5a8b7fc88a938942a377969b970b41c65a20ace51c76ca278db422725c35676ccf880ba94214352445aead9610c5489cd5e3da7403b9c539c428c7686c67d9aae444b1a3b2e74c65212b3942176495227c02cdec3861396327025e7e59799711c5601feeb80fce07cf0af0de14d8dd23da1f534dd90451976be04f298aa65f0df906cbab656957596c0e1783ace613d410e53089654614c0e211e50e811786e7268bd89036c9e2f390c36c2b712aeed7345a7ff45b63d8d47824857de7c6d43fc4fe8b99461a9cef5081de0ef3ac4eee2e1184106115393c454b52d6a4c814d2943c9a321ca84cfeb1c7f8b9a51be8fbad3b6162da6019be04030f316ac818159c8fa1fc32d1fd524380a06dd291a3cf34845d8958099ad62391b8849bd07270e8c2ec9a14c483f8fa86255d5bde47b0d9ae80704d160f22f7b6b384f49dc1ccab422171893fcbf3e4efdb63ecab98c1503d39dae764d6e5b99a773082bb727bf04f5148815a33c07f161bf53d7fea67128d12af573f2a7eb1e636a69b8e523d65d655a4132ab904598ae8b592e63420e2a2672990697d152e379f29242c442962ec55c601cadd34bda454414d56b64750d7a424e3825836164d59536d4ce787baeae67215eaf1318a2191968677c160a897ed6a72052c687c51618d0ca320a519617cad8e890ba66e027f067fac3a2c8c5a080f4e4bc6c13bb95072b271f364aa9a088baa0f665d199feba70bacfad76c77f631fd28bc15a161d10128848130e34b8c8c8c08aadf18c5b3cf1a4801091d9723c5b4bc5fa4e28288be95c0712822dee11effe511e9941d8970887bff72be0c2c55b283db64d1dc85f7adceef73bcc875fb3d77d5fc42eeea26fc4df0472010698d61cc47afb395d1078790be4c9578fda9cce0484a52b5f96c322e02f4820aa0c00f8e0bf03d1896114c55c8db77b89d885f467da4fa17c1b0472b9c2c0d0c3fbb4d616a6807a02f4f48e3a41c41818afb8e040c4462c5798d80f03e2a2f6a3367396edbb1a1514a5a0b796c8ae9d9ba8a1039ba46457865654c985a8dec79b0894412b200a70c593541efa96bffaf2ad2904f25e0fdeec2fd66b914071430e86b65f0feccd9239439a311064f758c89210bb87eaaaab9df5addcbf8810dd38228d1ca0b576fd000d810630efd0fd3b9fedc20aa14a5d33e6c7821b5c112058dbc847e4e4d6076e1332fde4a93018462a19570914ad70c35af96c0e9035e14468ac37cfa6123e1c9cdf2f3b3d861f4601c0eb34e65cd8a0e172b9114c37a01a9cb4c212042a118643e2b8d5056b79fb75a9c4fb0f46e983e25429b196965618e1ece14b4ddf9c5fe4233094807ba759a3d5d085e6b02fba89ad6cb5ac9c85344e71e33a8b99210bcb0950a88a250dc6d61db6124a555e8228a65841b1662cec3916e8f798a500037efdba1ce45eb59f917a658a6cd7d4c6b9202bde1090da3204bb5e967bd03df575b120c58f97382e5d15777c5d23fe2380f622a0d7250b03ad466020e71cdc7b26d80376518fb8b24d290db9f2e52c265fea166f7f833a70c90682e50ecf13b4c4c123b463506316e11440397ba74bbf620836411cc4835e542977a9fc0c85a83779a0e0044ce03e36460c9545737624a69cc34eab8d7614c8d945c1df55b98691a777197842c15637ff76d4605481377276e4d37276315597f9439827616ed8bc71bcccc39a624433ddfa9f8a655d8d9e28a68199033ae6bb424f37fa0aa291d651ad25915c5121bc6243262e5fdd38a176905f4d867776e7daa17a04e2800980bfcc61960927b59241a3c792b63cbd4d7aa08e53e6ad6495f728494c64e4fee13491f8b320da82f1ff29968616d629b3774b3c6e5f0192527792993bb87fdc917ec5f76813eb73ae192538965402243ec6235940d5ba950dfb82a0bcf07102e08ac0b07240c01dd01bbc0768b1011cba42a3581f69d26f9d4c5d6e80fe9200a507adbcca1894e5200a264cb711bb0229634fed36047eace429614c4c378176260df566bda152ddb3336a11e3a9c7300decb370b42478d69806ddeb3628a971e4c0f746820f9d1c256d0b905ae3d951775ea3e3cd6ad8ae80b9012962340c0b1c2b5b4ba830ca3630b2df4e9693b2046068ecad063e7688d4fe573e0d3e4ef7e0dde36bccd83b242758763aa1657017467ba2d32a12a73e6d4b6ad0633dafc17d6e09330859d1a9965b43d7f37122b0ddbfe51a92d2ffbad2a7def51bbbeb45e6618da2514e0f9f8e69e206f34bc37fce5a11e1d4916030810b42437891a8281501511ec746dff71ff7b004badc428b6578a9581002e3aa5050bc6141689166aacf53edd6f67715381511fd491f4a98a4cf75a605473b247819c9027b49df63956298d00077884d8fc77ffeda0a4cf1be080efe58107df70d73644361ba6b4c6711315b40653d37acbb4815a9e7d5674ecfb2989e294f6402017a60219cc2a9803292616fc56daef48c3cd9c3bac688653ebfdcdaeb7ddbbe748d3acdd651ee2c26ae1a654cfdc270595eaa6942e24630bf408903178b9d72ab3aa9174aa7e5dc9be158afcbf94936c539a7fd5f1c3948e68be29fe602bed2075dc2b6332ef8c0e5bce8a1ddbb64d600898ff8e8daec0d215a97da5c519a7857a207d3fe09b31c2b031403cd93802f278c8a91708105ef1a9f33690b3956be806ff105a1315a27eb2fc7770949863549b52a87c1ba434be465bf3c38caa145c602570b9f39898286c9119cb35ec02fa0e570f54335403566755ec4790f0e6c1d5a5da4608ca2b3c96f548f203799885317181acd677c7ca6bc92429151384073fd378fadc4a92e81ead316dfbfe3be36444995d9bdc0caf85c58c2bf4d27de6be1e9215068fadb413df92b4aa9b4df0eba0559b908b82a3982dd156c3f531aa4327913a2e0b2043f1474bbf5feab5c99c80a34b038fbdf8ea19118001ff1616a99a5617bb9bf6b53e68d29a33c1dd71d42a2e36594b77e64c4038e50eba4f42ca880ae426e33b75032090886322df566cc81337d354101ec574ed87d302c54fbc2048430a47e9fa9a0525b33f411ed5fd76738db4804397befe0719ea7c4242d89a5b22ea706f1a3f05628b610f65ebe55d9668e7e8f34f1df4b5541d27885b229a91bd9eb1bee1000adf6c4011e0874855474644ad78dce88eadaa479ae29e9076cd10be1484660443ccea0998e2fd7a86cedac408cf159f4f9e5ea132014ae439b15127466e657e1caf0607a32d53fe3d03b955007a8b2c9261f6115467da4f2f68f6ef8a9baaa9cc080ec725a416a8922a2ddcc7041405a85ed66be575659085e2a65e7627b51e2ed820b96976afd7cd81296c766fed6cfed70475d3bfecded99a1fb5de384402973ff6dce8938587d1a412846c71e72036f43175f4dcdcc71f2e7d3c4caef926d3655bc6b753b9639ea6c7ddae82c3d80e4c90bc48573bd3f360bd7a9578b55469b823d8ba28eb68ccb7bcc228baf1e552998699bb288511a67e3f1014795b5daed3e8590b4f5bbb04155062309fbd994b81dd02c4d1dfce6eb2b906c1908a6b651062a1b7ccbcd5215f0ff3fc029f54c010e2e740f1ef52198137b732c7c15a87dcd4add0208ccf4ccad386929777835cff0f1725fa6f62a97ae24c3ede14c1eae475c9ced3aa7d238b0e63591dfe32202c57e89cdfb621f3e392332162e7252c8523e30427c44854284e98e838f4653bee214ea7129e331254d9d5f480ed29d7a3db98880b9957d21499e7ce9b08e0857b60bce0784d5b0ed041ea524f14e74b1880e5dcace14c24a1a656ce1e04df1cbf34b1a9afbc89d159cd2e7326392e636ac77d9d05c8c118cffc842975733d97482c62639fe9489e1baf0471f2ae4dbf2d6626998fabed64fa1a9610a9e956db66bd0b1fd9566e7280ef21a16ba8a4ef19fcfcea9448de99217f99d930d7a1190576b08abdb4a7f29f478047fed015de31944685e6fdf31ddeef8f6df0703de742b10a0d867e49cc38d6823182db4f55e8b333056d0a9eb85aea57fead06cc50cc24be77e6ff8cfd3417ff8a5f7df741c33c027c9db511704cb064d68f171c83c7dc24d7d2d9e1e2067d604e24c9ced6dc16dfefc52e7c6666cb2af0c6561ed1bdb961cf07ae12beaf8731a6e578a3328e676c558aeb15cd0ad7e96f3b42d7d3c2babb824e0b7bb40f69d42e1ca74fd3fa34d1e97e1592b8de6919417662e512e2a773afd1f12031fec6fcbd93c682628f8133501eb4c4c252063c92e814cb3a552195efd09d68b8782c058066b0e80205f4185d30cf95560a0733858ff5a6b8a6dfd4643fe9458b1baa61d9b525e6610ef6fbb4fe75453f029f0a714c496703bb01e835fea1d7952883188a4ce41c847341b0b04038d5e85f99be152125210b15838b94c6bf9aca972c393ca855c4d98e3c9705f40d3acf94a86e30fee4f40875b3b787365feef4929f450a628cd33416abb2966b19eb05b66d500e8e22ae78dcd522bc65e46d75eb6cb60f5c41199c442cffe14098956c915263c14830a04c7d55c8602db19e1bc37d45fd07568ee883f731aa907588fc514a4597a6d01c78026f111c81b09e72fd1bb5acf026ed9f8f975914bef21afc93960d7ecdc92563a9c6622ecd6525460af0b11fe89994ab6d57d0b3468b8c2ba79c5a41b237bb3299721c6651abb60f38d2ef1d0484ec98650f894cc8ec4934f8cc06482795d8b80556dc788b0d4ba0c416bb8500487ce26a01dc362c7f8bdcd70ed356fc3d4269f7fcce8dade5323fad511f3aa5be5711bc4cd28930519ce71e5f40e1bb63c90b3a15973ce27c6f679ca87a39bc2b0fd4b2ad12ed81e1c7b4cd9bcb0d647db2ea0ad6ed278beb5a3d6e28c5d7fe63c6c364e4478b2be25b76e2af379246759d07e797da8a545505338a7455cb3319e046dac70a5a2c819caf38c8162cf5002bf7efada0b1773f58b7588a67511f7a59efd38ecb11640c6ac423757ae05bc323e9cce1f5ea2201497c138015b00de10b0a950042cc5b10519126ecf8e6ac546691396630bc11214d64dce3b15771415dc6208342be1930c67e7050f35960c21f7bf0c163f36dd8a14642547a5c873142c11cb7087026054b784a6bd1a36d8e6cda42890ab61535083396b0152cebf4d5d3f8dd5c139860912757822f437e50d0aab4efac460c67a4e97af5541f3c42acbba34a95e2ba2b741fe87c13b9db8a3731490c2d4d92a6383892439a361ae3f31afa842c09acd5c731dd331c4b516d12cc0ccf5e4c71914c496b6433a95bc12bdb4cf985484b956678a7a70d2241288fb268f33b811a0b90947d622700c4c58706007362e0c5916152888946c3235bb38f789f0072ef110d2585129a0f0e4131ac819b966015330fb5a7ee796defb2d0fb19dfceb0394c2b660e8895228121808c66149b6f486c5ca5ea1913d11ca817527d77d9592d329f00b82baa3b824c4ae2889f9a097aa6280c6967a6be7140b4572fdd60fb1775cb0a69235580cce1210b4ca6565708acb0259c096b32a681399ebecda4ddc53114b422b206b714482472546d6324cf7042a0c15016e222e173e45ea1402874d21f7db84626e3fdfb9a64d05c4af3e238746fdde1f19236b2117e45e40dab4216f0ccad0094198ac450b646132317c9f212b02fa8c53bfa43c48bc1c4833df6b8d5e5abbd5b7f9444261d0a2272580e64fed2dab0f3275f46565361902d49f787092de8ecbaf42b249928f303b48d87ce98df308ac2233964305406bbd4f630ad0e3c5d37df2e425344b970733b4e8457f74d7a98119846e5e46cd2ecd10287131b214d6d390d48fd87ad627e9c75b1c3086e3b3122f3b8fd36df623422c0541da1675a11f1f61a5d5ef36437a5d098aec7e0c3ed3e4a620306edd592558965c02e48a7f0c4f4c33131d5f53b6651886af437e410945198a8a7db9676ac2f10006dc23b51966512671fe8884fa624fe212ebc45e895b84fa6c63dbb592a8986481ec584783cc44ee4782a1b32f8b26b87bc973b73e7fc6d1b85891be0cb64046af3c22a625f08c270534a5510cdc26e0494828806a886d928a20a8f2065982379533690e19a147ecaf20c27b88fab0f4249c415b2a302e49a66dff1a03305968e7258efc05bddbea00f4dac8ec8b2fbfbc21039951454d4113dc0289922549f18b55460a210d5ec598212e7d2ee15104f284ff11592130a9458f2b5947aebe1734d274c9539f1d3a2ee5f20a7dc008b34f5eabf26e1de7bee08bbe3642fca133edd5c5d011037b8bd28365067c5917b5b594ee2d0303a674a96fa6c9a0bfb93fc12ab1add7546f40bb3a610a6efa5aa3cffc7c7baba810e5cb8a2dc65e4d2ab89248624b661a14633711badbe639bbdbf8ecaebd301529d74ff2d8487fe99fb58fc08900c5964be027c3ff4ca1d2d6db92dba7ccce06048a49a32b01ae8cc7426b674e5757caee455c08323d9313f1dd075756074bc541adfc06305f685b279bbe6f810bf37efa7b7a07d88ab7da17bd9eb01715878db77fd966d263416caf5a4e01b11d7b8bb96751e29d34e773ac05c2a422e4e98440dbcfef2646edf5affd31744b4e6c5320c0888a1e17ef9c904d5d78ad4531c070787869ee403cb13ba3197b2b85f122f5784597e3fccfa2ff1b3408ddac7a774906bc7c048f9f31d5bc8b6ca886aa5ed63e9de06091d3555bb7fb93200c16145f893513ea9ec6095c0f03add25cd8cceac6787a88f7500026962a8029365f9a496afb23484cdaee6b9aafc8e154bf279c79355970a54878f0ae63c9d82c683aab2c726c6f7747cffcdb4259e44069547d2e89f13976161cd8600d45f62787da8020de8a45059027a664faa4458e3e856c5f31e170e7f930374968ce2f2fdbd938ae4dcd02b85a8ee011a74f35a076bb4c03dad401202f403984c21d8fc0764e41391736c49d9380905d9c09d62abcf1c2be2dbc54f0a528c5a3a7482a47ec45fd72863d5674d733a7109ddab97ad4b985ae201bb2bd6081965fb031297d9415a36be337988beaef1f6a6ee04091a3fb2921d4a179dc9e59c58049a565f98ceeed2341802f4b8e0c785b4b411c4f3dca8dbcdf62c1688216ba53a6c601aa442fc7613bb1228489231f2047d47bb20fa2ea4f027c632958fa19d0b0e1f513f414848a1c604905fc560789db740f673fa038edb334948132ed29acf4bd9ea17fefecf62f309c992652a1a0c5c0c8adc3d9f495950a7c8a73a50918792b1406f8932b967bcabe667c893de94aa26124a6116731cb72e5013c573fafe7ebce708fcdf0412e70dd941d57f77d60706552feb334851d6ee34c1f22d70bdb542e05490cf9708607e9eda5f5959592d0c37698f123f2b01fdb4ee512b4012f6a41c1676e2ede7f2bedcc901211efe4749769bdda72f097d29d91474bd0e76c3c169bc3aa53fe22770df295345aaa07e5825e4b24aa1614df17abbb9d757a8d834d38d7610a1de7720d1a64d3c58313859cf1566c8c576fe8cb8984fdfa74c60c59283325e547a32a633c6a01fc24da4c8eda7e25102240a9b53a4aa29a9cbc5ac034e6b4ee6f96cd0d245f362a64d80e58a60e0ba6c79680c829d0087f48e188f22b79ac33c2b17061d095680f3edf744b11222a2fee17e7f5eacb62857d4f567ede95e42dbdb7f53601405f7a4fcb7c0cb7dab8757e8f143499327533cda0b90dec8d41f0d48737303dbb067f93599c5b146d4a4ccb14c5e7818c426a4684f7f42f11720b52a440c0852f5380b5011a621c83cb757e03126a165d1952371e34dcd04a72faa6500137fcab17cad3ce636494e036d3b8023dcd9de2c25fa0278bcbbeee7d4ca49a74876a98f4491fcc6c5672a55fe34d06077e2c03c33a4f290e80106ef70c1821aaea202e0a43940e0e19fc14200f9b41645fad38c214141174fb37aa197d8b7b8a0c9c6c9a72107220efa07a79ebdc8f6c22060f66103754fc492e35523302654e88088048822bccfe6c3021c7ff49281fe94ab8ed53c2295389407bb14d5c29464821b884a709875bb39eefd2727a88053659e4cd7b941e41c210485153fe162052934c026e55f8232b388ed26a84f555d38c3afd575a78b017e373805fb48a8a632c87436993aeb5017db7fa89718c5580047814244d5433acfea563edaf6253110c5a40fd6260becdde2b33f9fbb1bf8797c86500facf722b444c4638f057bf36c4ab1c9dad666f3e10f754d1ce631e483f36dba4c62ab33662e3aaac32de3bfb4f2dce0e82f7349007cb13cc3d282e92c052005c441a7a6d9c0cb614f7207631f2eaef0a83bcaf3f7c4a8ff21c0adf11fc9afda6a8a4f8a4cc6c5eb5a51f44b87d67c6a115450f1f3ef61a65418e40d9b95afa2f25ee68f0286669189c0591064bdcecdf2c991ea0033405525efd72c8299a3ca17725b3446f2d54e90552861f72d0af65d83dcce92e1bb99a3faeccfc47864bd8d537102c990be459d59d1fd0756dcb73c1e49250322a46b35a284e24083eb98a11707043a1e39d5b7b443887559c45133031d449ccecd2ab549d2642820dc692c4921fc1fca6d5cb2d29ac2e6815ea58896ce04f5f2c0f63bb6993744770d9d10404e34c8f824f8213d22373ee2ece4d92305a8fbc49699e5ca5b9640844de63e63a170839c5400f2cdac5c740303bb63c1bdc8c613f4ac5c9403edc6a06b2a3d0970603facfc118c1a4d1d0f9b26eb80367aaaa7dfe7a71cad9a70209c34775caf951af3d2ea998c5ade4e1645172a476a259c7a91dba3e9418614c7bfd7988378b75be3400d8a420836ed7379e6ad1aef2fa5fc731d0ce2e582d0c69839991944dcda1ea2785ffd14388aca603c491a4455af1bb4bde6a277d7743564597ee9560974bb2a0813669767c3169e3a842575d9c05baf2d1f02c6c139ea8e6d1c3eb43a8fa920f8aeca3834c2c515b11ce07cdba5b07dd0d3b7215caab3676368c34d98169abc8b2b9c8534cde8062343bfb09bfdde03c7b64a7ebeca4fdad7e37c2a1c2857700be41e2f4fef2d3c5ced3a34060e64402de9172c7b27688b187c4416053bcaaf1b3dd5849bb2a51a6bf4495aed2cfc7796944d3cd64b90fdd1c639c91d23cc65305b38f359443ad0b4e367186f1533d996233607f380dcacbeaf01fd637f9589482bb05bbd516ee4890c77d5ebac608ca29688f0c64159503ba8d5e2abfb420455f8136f822ab5c44ab5574f5882d167c4b98a0d80a0575cf076ad4329a472e11c445f2fee635bc7df484bcbcc3569ae911a4b7c9b691f2234f3f187296a0e48e441ae0b46eaa954de893f4a27ed5ed1af1a9f7192a418bcc2c6033e4f57e1546ca52c2dc6f21749bc6ad50827167c2d67bacd96d285ab0ed204b00700039e5316cfd6391a2fc12f524d551ce50eca9cc9a5337e0286043eca9d5bb49eb48337877be6ac6dfcd320ab25e3631f2341b94d68e475582bdcc7543bebf0a476b6efaff9bbfa44e29d133ebb8f9b58a8a12ed1d3bfcda5680082d8550f4a90ca558f6e28866a56cdafdc8fc174e46e8e238f7b61707b6494c16b3e6cc090475a5ea2667c77e35dca3bcc9f9792f0ec0c643d9fd2e2539574ed2eb1f231015538edf3ebf05d278b5751641263a8438a224cfbd394603123e8163a63a5fce852951c8d5c000c55c40848e3b42c74ea062d42c744ad8ba7710261141f4764ef79259abe8891fe7b03653098d1828874e7d380f0e93173aaf19039fdb7e391b7741bdd8e6fa24256257121086002ad2460006eae28aef92599a05614d8bad732264121285d3c7bd1456361a513018cb9d3efca0cc888532e8b517a02c86ec2e9c2c575efdad3b9966b0558f16acbf08dfa54a1229ad9746615f9a3cf43a690f63fac1430254f5f201100e3098f4d9cec0271c2809c763b0fbc006957527372f4bf90d828a72b290d242446cb118ee14a8c794730f9bf16f6103ad92e3955e44a59ffea13140f13f20b60b6484e5e0b51c24c6fa60dcbfd705b6ecd2112c647f5b08af2d7800358ff167ee6b2abe54633e9674cd416ea40d1616fb78e17ee9412dc0b51679cf17a18d3962479a4e8968e72eff3c52aea8ec3d07fff7231d2d667acd70427f82d287e5efa700c84cbd3816dad26702b2d7289faabf18d99e9fec60d1636cc110a1177ce5a70d64e9b3e0567d4d3421ff8685b01fadfb142d2fde2311f87ee2105c09e31062b0da44874861d978163dd1846ce2cabce1445f140e14018ea18bc65215022911d5b2fe8862734357263f14a74641d0f94588e68c237842a13372c83398aa41f249c14fc4649d10ba23c9b88781bef9b236a31e23ee79b7c6980d8534a5b57d770c052a65abc339379e454f9b38318d92133366f610063914185bb4da80d1003f5e11acb96c8ab322fbd083fd0fb21f83f2b514d8c630b621c37c0890ac68029eef14bab3e5392028eba0778e4a95366caabbae0485c7dc792a7238c254ee57ba86906f3b03c8e67ced666e054a9f30677e9532807b80e2a138b150e6204322a0b0f20de12ba8f2e36ee1ab9f01cb18ac934d622b98fc794978a511a8f1d120f0a775b77bc12ab3f5b1b64b2efc51029f3495a3e0c1cf01a0253558f5d04e5cb5070e2083b46528d45f7ca488488d063e290abe14f7a9502645ae26104630800302316943e6eb998f02c2135b9e0f2f2a4346fc63670a08613453b9080eae99faa577d0aaab1cc2d277ca42253933d60ca62183792ca2cad0f936db20df35584006cbd7600aa748b05be9b5f40baa394254c080346941a0247f79b6558797b0e0a872c238564ee20dbbf0c33d404f810ede6aa023a1d42ae2a9d235a49112ffdb84b944e5e4205b81ae65dcdd636b7a1cac033761014aa5bc7bba4fc7fd79fc635efcd5620cef59969581e2c92d00e40f25497583daab4dd0b0230c23ac57deca97098faaf5da9debabf8bd432513d82c9fdf27aa1b494c3d2248a860653c78b84c2d844564a5b70543147110d4264539cc5bca1162bc073a97baae893931994c7a7e11cc84193c351013f4d3a6e329d5ca893741bf4e6fe06a2dc206ddd7992081edab37cae80a082565cbe2199dde4da75efe16f0fb0d282bd3904c4a5bd0bf86acbf06823ce34c8c33ac0fd6abaf25845b21f50443635ecbbf762d58ec70a2d28eee9a195a467917ae49add0b33bcb52720e8af2ca0ceb6096c2a537b7881b5016528bb9d567a6469a14cca394d3fd4799f3a940b1d07c51c20646a80905acb62088ad45fd2609295b76b848dc6ae6f722f4298d9b4b64e31ddde1a491d40b8edad5a4eba0b0cac26769d8e8a1e8f974d9577b9674536e5fc8bc3c28544720244e205ed0b26aab3ef2d438cc87e5f5ad6a31131331cdb274dc8f69b5bf5509db95cb152dbdcde70285201ced83cf4dfe580a8f0e9e7cd04b7730d0c84cd20eb65638ed94eb939604abc125c2edb5c816cd71b18a1063ecf515d2806b54898e4dcc683288e77685ae05703f853b6e3e6a0a3b84ad8d4d17373480ba5054a728b4a8f74a21ad63545985dd28a2a09b5020a655a2ee310daa06724688689d033b4ad69f94d05bf9c08ebb6c04be492d8807c32a1fdc37cec70f7106f0386f3d746bfc7820ad0f6cdcaa15a624b31e9c022eb0b2e1729ba27fd5de823dd536cc80ef560d9893de9cee80a359b9a09fab6f5c8f13b100d90138423aba75525edd633febfe06af48be80b66e391f3e330f5cca497b0f8e3812cc3fc112a1d65a81052d939ee9826e98352207c0a3fd3e0d14bfa8e0fef0b0c5d87cce03031de3baa67916cba363d6e6361f66cdbd24d4ceb3ffb1209b9ad9ba68699c0d40a6c2d84d4f00690103edcd2c431d13f2c5bf1c8547219df347062a6d1b0644cd6c7ce915e41e66363d820d96cba3d0951594295f41478df1d218efbc796c5076253a9a6d834d987e2922191d055c2e301c5abd16896000bd1b1900f6de4cac14beaf57ee466768355310817e24b9bd1e271f0644f93629bfb3d35f2ae40ea333e2268a82a90cec87d551acf07411d63a720dfe9a15119c4bad1c98e10eaf513deb05e6626730acdd77479135cf9e38cb067b122aaddf979983498dbe4cf47a146b75f8987cfa8795c28510f26e38316d2ff410966a3544c4e0759657375ddb29702f306f20a86b9420cd51e49bbf07ca40f28634d2d3e02d30c234259c4b60cc59cdba17c205050481f3e27ac16f284edb62b934d63f0cb8c97aefb776adab2e8b9412ecea82a25633e1898c124d49ab4f995a80b9b290d495193c9561423363efe15435db3fccb8c91a50f70ef38a6888750bd66426fac201876bba565718c4968303ab3eaf8278291c8cf29a44af66e1884c13c5c401175d4d69f08354baf18b2733b1d2f4b9215eb456a6142756226078e86586c1c3b3935e4d43c3d84a1606bed12111a542605859ee6f6587993281892cc255aa5ca7c0803660cca484b57a21a995193c2ad304d365967b048a4197d616ac97fe86b796ec404653f13ac58251babaed95dc0665cd64be892dfa51b730755ab181e4c08176a91e732eab3b9b2254d2c1390ea85409997c30278ad40eacf6b40b782ba84f88997ff61c72007f067f28894a1168f7fe88232ee03f904982355121eb64cc4e4a8cca9ee410b4770f3356827130e1ad67fc449ee98e80c876973882ea3acfa6cc2be31260f69ea513e9dc97b2374c7b2de435d9ca0612f194dbd222021af600bffba46701e38026a3e4b64ad92d7c518b23d6bede01b8754ec8a40522b7e3dce7c60dd2a3953b80f4ec55c60de2ace33613ddb1db07a7ff1a422da94bb4023e2bdcfa1fc51603bb84f6e9724c1125f9267918a515455fc9c1131913cca8240127b70e70ff26ff30eeebf55b69339360d2ed18cc2d1c18c6a50bc8e82dc7c3c73440798f715a487a3f39d8e417c67dbdfe2b4d26d224263e8271dea65817b05ee9055293f3a206a0329338ccc7d5f5af7699101399619eb743ff05da9436130bb664e9b057999bc858531b4c5907c20bdc9758236d7ca7484d33e3bb7d845d39c04bf1a4456a45d4bdb9caca7a49304283c63b02bcc3f7fe094495be7386d5ca5a566035b41b271e45f8928cc841a372282604559cb32f1f13094af3d7498275e0f38dbddde2921e5c5435c03feae5ef05d8b640b080854060156e3a871da74085254d48a89d3f2900ac3005776134d0ecfeabd5e5a872fa23746858bc828ad0e1abe04d397a0159354f726ab3c2a28f227cc580697d3693e38a8a6f61d298172046b7cec74f8207ecbeeadeba9953e20f6dad35561fac5bb870b7540526b2b01fcbadb0c2ea902ce92eb7620943e0278e104e31cb672174e48fb76fb2c752bb0ee2932b0778941536fad4237bb1774d7061487ae12f651ec0f9271c9426a09d4216262b5caf02c8134e8029a062356890b36ef3c7928d752f974ef57e0fd1adef36cc4c5b92c445a329d4640d6ee9a87cc3c61bc6eecf598b9daee63678ea1a82f906d7799f1b125aed74df0fa3b1f0ae9361ba1efa9cc31eedc593404eac4c1a170917db4f6310484d5df6f24437b865d403aa7727c9ed0068e0d3f5b8e4f08089b7734308e389aef39800cdbd9d97750c963f7835fceb710bd709705d3f906e1d8f9f1a0fe04dcfd1c573633a4918195d763922145f3e250fa36ca5522b497812b26430509f2c8352b1bed26631659ca7edfdbfe73e7c0728205d97a86644cf416120da01633d21db887901081f003338a0bc8445da0b76cb0b0d670fc3742bc3386b145e7add9d5c2085546b6aef1282ac821be4e0fe458803cace13ecfc7b4a038c518a979e782f9cc95b465e499c5aa685904a155005b2387cd5c82b7b07a328b4830058f15bbe06c01ccbf333aa39629576e526cb75d3d7ee2a0518f4b2bafca05d56f5ec733c7ba63f9a4ecf45240709e6f23bcd24065aa9119446136dcb6c0161c0699522767ed98118e9e834d940e048e6cbaeee2f52e0d207138a88f5e3518061df2ffe112439dc5de96205f64f530a8596ff947fb9d5e1acdaec9ff4054804f4c57b6754792b9e8cc0d6b73b8535610aebb6e4c7acf08ff76bddc7e3a7b06100f2759f6c052a1a68155b188be3db9ae7c054e223ab054d11966ab048f3909c13b49dc5fbb1a5baad9de4721a04ac1507745e20ce6e310f0d85e9b8b7008e2f64fb6e3bed000a393162c61bb7da751c88efdb65838522ea5abb5390bb005bf447dadbec7189a56b4c96fe5b3ad3f75180af213e74e068050c72a72911d7c798a5fbb857d5f7e09f1c6192dc886f0aa962d4dcd7024c3258e07dbf606830973ab8ad170fec05d5351fe8367f42ca3b638bde1675877260f40294a4fc9bdb58af4cd0902ba24356f87578902bd99ad20bcd2898700041b535d01014d0fe6a2f7e66ff739fe0f2795620e139e9b47bc0451585c36f01c31f9d6e7df5d4a06a6421e89d164c2bffabd15c5d1e5fba35bff6d9d0f8bcf07ed489f758ee8d4d4de43db48603ee49e52db2e86ca28a640b81a2d0541dc320c0c18630114827859cf349bbf931414889d1f3a78750717a87227df637ff39c308b800ef0a3295ffd48d67cdf81b1f59a83384b1a23cb43df727161c6e61a6c1ec0335cac8dc02b4aec2054b966d94d2fb0d89f9e314e9d415c4527ac245300f2455a862131cae6a0ceab91d3a20e8357635567642b7a003411c0077b299668f4de73db66808b22237be784e0bf36922dbaad3383459b0512647741e9d84383f21005a3b427504b4ed1af21bda9f3cb04570b56e45937acc2d481840c74edb53154a8dff41eeb474ee4266c4d7fa315f5058440363883cc9f406868b0a56d0650b436978cfaf254a9cd4f018e45d1c034643be4cb3d5915e5ac5a046e4f8b7d5eef42572b1b90b81e366c9dc17d007ab47b12a47e050690d6170e1c8a9b51440d6d89e29a64a81ae4ea7402f2bbe3cac0e5d5e23ec8564043279922fd5a9a5e3105f758e3dd3b04a935c00f5e132a945bda52f62b353133d00abe75130e6104db72870a43ac5e73fe3828469d704e5130edf32729e0756545e22b51ef8a0a3197b5ec2b4d6a6b9997c492b06bdebd4f78db44e8049e47f01e8ee2e1c9a5c3b38f260ea098caca7810e9a8296ee22003b4f17a59072e2f3d392e4ade50b00a585ea084d624320bdf2925889cdcd912612000a1a428d8a38e104b7f43504e93d9dee721166c6079d01391788c7dbc1d71496078b017b659ca08f74b573c72ec78b47c7a6dda1e02e0abf97d50a50e1055e8f73b90dfe76d46eced36129bd076cae36168b7304329bf394719b0b3a066391e323cafb3748f1564efbce2d216bfea746cc518dfd632236923cf35189a29a50378b34e2ccea9d43017b6540d19f615f97958b9709f0ad38b37be28daf3842bd677f55b957737ed334a1966a99cdd1c8d948ef139efd60ad1da5f469709e6ae9de17200ae759e0f5d7b91512499653ac0c057feb4867f305abb52645190a17ee0824bbd1aa00b1b50ccb937dd646ab2d162d28aecf4037a18fe048269e313cc4e7257e753124c6ba08dabfbf6c2e3655cce0729323eeac0ad014121af5ef37c04bb7f52628fa946ef8a34e44c101a1cca2bd3a8a427daddfdda524982de12ab6577ce58cdebc8daf162d91d003843bdd6ae2b78ae0ed2a60b9753fbed9cd6a250f299927b8ece0a88155637edc01c0e141840226f26f421ec6958b5f12bc358734328383e845f52734ce155f25370e410f1b6bdee0b4d9751dfed80b35afb19e7bb6f161aa4c2c9578e8a4755ec6158c41fddf6382f9a7a608d139766115471dbc8f5658332bb40950147019aa181924baae2cbaa55070135d370fdd94d4635c70ff46d743f152fd11979431f1039b9bbd7447255520c947e51f9d3a026c8061aa209d7a6fb3ff2ae5524cc953286ea2e2652b07c19ab2b3bf25af44f06fbd88d2e44351ccfd4bb7d63827e26b68c5488b5829cf5aa212d2cf625bdba2ac1ff1ee244c9576b820e5cb12351b5357b063289066057ba0c33467059f0e9c4c6ecb04d8933733e56959a283574b05e80e1cf9a822e7950f645af04cf22bdedeffba986d85943b7a1493e57ab6a3116e056cbed9eed90aab4c0d349cc3708cb20c53b98a59c16621c8c2323516293fe6961ff6f88d29709090e3ec5aa64e3b2c64d28bc4113fa41700a87b3073e128e480ecd4edc485e19fd8388ce9fad46ebc69d9228d5904d92de8026420045ae51295593090ba4a07aea33faf4efe9abeb13749462f6d5f4cfcdce281f4ce7b9b97b7567ba0a727d1ab37be9a8d107934926b00004148412982150f65ae7e6652560f52523367e398495bdd874b68b9f12c64237b6fb2e59652a62453380927096b095167447df165631c2536e42d420d60e63135ec0e01a106fb8598a0638d8ed4076ee196c73c1ae006f00622cf175b9e7743dea2634bcd164d00acf84522902e21de232474345223907ef7521148ff8f2916024241ccb0a1ed1fd3dd9b7f424aecfc90b734e03267c1dc05f39849a9043da312a776678c71b6dc99d2a592cbddb83f77136f487479acdf1b1a3be3ece46ee64bff429047fb70ce3afdab75b59a9f7db6035bbd9005f086b35ae5231f0be0951f9735570500b2b8bb97a09af26747a43b4e2f1eb9f27b7dadfe71d67877dc6e69657d143cc7f188c186dc0d95cf091b729705c602c4d9c80263b9b5c1548f60b64719b38f57338ac9e2e2c24ed6a2c975a1a6e54d671fcee93f5719fd1dae431638a2eb374c005c612500b4cc2927097de59433c6abcd8f4544ce6fc5028723efd61d91ee48c8a60439c793f07cd960cfafc126733e95d43b81a8755b778b44d7836bc3c60ab0d9c71b5d661fcadbb503005c0eee8ecbba1be8b85be5346f75378dd3bc1c17c7dd364ef36edc9bbb759ce6d9dc4dc5695ecddd6838cdb397e6aaee66c3695ec7dded86d3bc2d75371c9ce66977cbc1699ce66577d3c1691ebdf36e2c4ef3e4dd76701c70dad601003af8f937f74a16fd3050820d22ffd338b87f10850da5bbbb74f78ff286740a8edf920b65e5460863e7ec185d403e6777c2bca10bf31e71c1afe43e33b5f08da5bdf662a085ebd95b332bffb22c625b837398082309aeecf60ed94cd4a2bddb7d0577e92f34c83d926cfc8e7ca5bb4be83b828e15367ef0c4074bd8f81f6049e2e3add58332be90b5a54296f6de65276ec822a17edfefc61bb232faf16a3764c9c7717d2e6b7e64e2f2a73c120c710e7ff546e09c10743cd0db89648ec6c93ed73bcc298d73edb91b0ea5346f47c68f452494f263e1e6ba0cd1876bd03d686265482fbdde21089999bd9bde0913a0c6f4c279e577151b3fdf7eea1dfe14acd87e6a2ccd3363de9a2f312b30d64bc7b6f82b365fb2e81536543f3138c5dcf9ec44017ee5cf18fdd5cada583fdd8904365fcef3fff257385f7dc50acecd2812a7f961438100eac6d7f54f4ea722b6da3bcc96ae7af2279b898e150f823ce282bc4114b18a44d7fce89a9f11d7e267f9c7cb224273fd696e101e983d838c518dd428682e68071bcad74bc2e49144924932e649dee449ce2546799227799227c5a81815a3366fa78806fbc4cfb7e01cfaf3653345694fbfcbf08e5ca27deef4b57ea10f1fb4d6cdbfd0dad4473f4a23266264721e56110d49eab55f721e6e727a82da346f687b24316c9f7a760d69bf7db60bd2be292cfafe729817b911a594524a29a594f6fc0c0932a242d00e96524a29a511849ba2fbe43c442efa9a47e49246eee450f49952a994428335edd3344dd3346ddbb68d861b1db26d7342ad10ab7e9dfedaff9307d513a9851b414be150a860cd6d9b7bde57f052f1031216ca4eff479dedb767df58e8b9a98f6bf0060f365eae5fb8cae837bfd0ca2f7c6742e576471b6b6c8fb3a341b60d7a14f99b933bf9934379942c92465ee448ece32fdf8b9c4708de712e0c3639cffc3cc95bf2e5dbeac38b6aad99b574b5fa3ca081eda608427f9ed4857dfcf3233847fee74d3cb258ffa8a82e6aa37e35ac8fe2d2125393d313548445d851444a8a29f113d20a2dbca064145f3d3d3f43828276b09ee42272499712a8c33ef14a2297fc666a2497fc97afd8d9517409b08f7f6194e14610e217933090fe189ab842be12c215727dd41dced52ffcbb7d46bf50e736f7d9db51d2afda98c1c69f4fc92352832a384f4cc2adfefe285186d8fd514ad6334ac7666e1b2aac7cfff9dca1305d3caab0fd3833768cd973d309c45c1d979b4ec07437e73eec1b3f9d68c33efd7dc039f4df82f42b03a6ab7e41dea2ffd33653340f33ec2c21fb6c96b0f3e5fbf7576fd11ffa43e8ebd0efa1bfc5d49dae6f0bdb4a363033b3f4e85b544fa04802898e4bd40fd506472339cedeaca29ed850420c2f2e6a86170280784a51996144157da9011ab44a1316e8b89ca586273ec4285bf6c76e59cae6e8d3bd41156c5172b376ed208a9d9e8d52c6e9d329cf497d6963de61eea6347653faf2374a3f7e4f297dca31b2a39c6d3f8e4fc40eddf94d33bfc9dd1f1634b3a764f70a4c6ef9fb4b971d91799b1b48051407339c544598d1f4740411666cc129c12685bd71394b0d308441461a635697b3dc1003259772b50a612504f4a11380cb7fe3c303ed79d29b4c880f0f7a56fe9aa64d1d0dd4b41a57427c7870c31f4ef926c391797e33fa73ce49e7a47cd38d2352baf2c9372bbf33ca4c46e91de3aae34a4aff706c8c36669e8c52ea4e6d6c4a3f9e2cd6cc5b2b9eb2837e88abb75d6b3fe774848245c4a594d1ddddbd3f79c4b6317beee1901fb6949c94d2f3cb52fe9671b77fd9369ceec6e11cfe3259cd2a9df2a86674caa3a323776f0207e7bb6637ee43c8c5613aa34b2ae78e1d3b765c9e1d3b76e0b04f36af34fd102e698614dded212ed10e514c5c0195c519585ae0f292d87286981b6040c3999bc85dd1f4e386383edcf9ca1630643c36894ec22885993c5ec112b7387b24e3e386d14c92ebdf5cbca348b9de4450b96ee58a7701a65a2f60d77fe50518d7ffbf78e2fa833a5f405dff9ea729aeff8f09aeff90201a8071fd8da8004692ebbf820cae7f0b2f80b1455198238cc2a0f1121305ec484c17484962ca888d5952822d318581a5c9490c1fae7f7ce22c624c8182a1086a8ad1184a5e634c0123c3872332a290ca604a8a35598291816aba2244b171e9b21362305dd692584129d12800a689261e7058238a138e22c91041c800ca8c5713ae36d228b86d74bbbbbb9b6cf831bcd1d14509ba50d253058e1337bcb90d46cadf0673e5369497a2ebe3f2a846d71152d22a16c522f629c08d4711c93379e42dff9fc651537040e4f1286ff9d72d2c181ec564c8277e24aa418f729e78456cf97729dac21deac9f522cef12f6ae11c2cac3423c934180406649436fe5839b9004d8c555dce02e60914304bc4a498b0b64cd783b5f9a28ab1344d1c0eb673c11936bb9269b192c560a70aea0f45a4acb0d9e52c5c2095714493700153a34a9abaa5543068b22d755d9048197148da067b55a854171b9864495a17189a50a0304a954b982713080ca68c4b930e12e8a989ead4279eb84e8f8e901e31dde25b9f4c5b2e47bc806850c4058826405f4471a9210a90104f5cbc6ece5c59c205f7c512197461442db902090ad59525b14e086b2f67598294f262692e67590265064b9adc2a788bba5a709ed4dbd803732bd35e59166fc73bfd59961d4143a9e781f6f4adf3b0a2f645fcb5afc8f6da6faf7dd65bdafb0b69efaca87df609a57efb865831c64fc8877efc5da9a79eea32918b45fb85fcdbbfb0e713da36de787eebe09c550f207e8c2cdfd654e216ad33468fc1faf0119fe213e897a9afd858f169fc84e6cba7337a3791b3345f6cb8c38600fad7388fd3dd475bf68cb3659e07b73a0f9229f591f4db788e6ff3fcdbcb2772a9fe6331c05fbe90bffc86a6643f24df3ff696eacb3ea19bf7ee895c5d4df6ac9a1a1fcdc32e8012f243cf14514a29a55fa3ca76502e9ce58c974b69166465b0f437ef16b069daa7bc90e8a67ea35ce66d97bb9477dda7f27e3c76442a179fec7335351fcb84f9355fc2fc9a27ba2a2f9457f599170eddec3b2fb4b78bdca0ea699ebbcc7a4437f3e216110847e572df79610b97fb1fe73ced372ff5e134c8dfb118d06fe385fa6d7cf5138a6ff3655e77198abe60e38fe5cfe2e7dbff03cc8a3d4fea442875f5d6bebbf7cf57c04f8f7577dc12e677f3030c33a9e0bf827f901122f45926d40a645fbf5590911e2c2c07979f0431632e673903bbd188d2cf0866a2ae7f507331c610843418df04fa1c5ca1de91cf3241fefc12a4e40e88a1321902db970fda150f3236b4575af611e14a6971ae7c16111fbd03eec0c26e70fd7df8cf2fc17f7e2ca20bc6be946fe5affc05468a7e3fd7f72fa27d7f48fab5f70fc914a17eed91f8d7e70de41cf947e495527ef77844ae94564da8c1f6cbd7711ec9d5ade4befbcd63577d8ddb40e9c20b9cb44f6c44128279b897d1882be5836c003045299d4f6917d5a9444f7dd6ea87a47e45c2b1cb5bf07fc15f05ff155891f334241d47e6de20297a8f73c71ee712638c48bae73ef5da3b60fb3a4568fbfa9c8724e5b16b8bbda59881b4c0b60a9ce37f444a8f521a7422629216e31c17430cf6e1cbb37229c675f961805db28b52461be3b0e2675f3ff545342d22d9be7eacf805a5bebab221de2f1c714e7f962cecc3136708d8607ffc9e97fa250fc718638c92892dfb0d870efadd9110ef0b0dc6ed9570dad7c8d8c4991b39276adde5f9dd3ba0e655bfd578aca0f92c14d8c52af259cddb3ccdc7f28febc792f38bd47c2c9f1f4b16a1f99aa7a1f99aafc6bd158df736ab55f6355e4ff6395dd830bed815e4adeca7c792df1057967d3cca3e22651f5fd94758f6dc0105d18ffef64ae67336091bc624377375a064e38b73b23f22a91001953b80cb54d4e0e46ecea9bcf88ab00e0576651f8f3c2297caa62633a1069b7d84c5a32cbe1ce63c363e6357e65d50121b7ff39dc7aea024356ff33fcd2efadb1b99cfb1cb25538359e6c58b4e0d667fe345256f65fdc439d9db2736f4d8f55815e6b1f1993b71b39accb5dcccc6c7dcea21ebb254562359a9140747514abcd9472bd973ef6431cacd22d2cdb2d8cd966ef629f757efb016249c64bfcdae73270d6636d9d764ff63c93aacc1ec539fbf1acc825061fd437fddec57701efbb1e4772a380f4df745e6738f84fe369f7b76651f93344f7c792bfbec6351eff867df429665bfd9dc60e5a7b28f32c27ae71b94aff26c4da18b1637662922d916062c7f0b2366f00136858c1a38b1f9828c3167a290682a23adbdb93b1aecf7175ea7bfa7ff41321be3a8fe7a7c49f9f5a57cff86fce537246bf538cff2d21217529a5c8004931f5c74872ab864b1444509052efa35f43bd65564c75a64340be552f6a9dd65fae1244175eb072a61fd0bf374cc2f8d652e8d63d0e0d2681497304fd56c0d730f91ceaf63f18bb203aa35935559b5d64f887b9a6fa87bee8754bf3d11ab3e914be5b1ea7744a87bd51114d8057a8b3e065060d7f628b04bbeea1b1a7a6fd1efe813b9b8f03b50b2318973e81f913726d1efb8a4f2885c9d47e43281066b69de841a6c18938c62fe542a3ddd2aa5094ae2c9efbc1454833455449fa68d388776ac0af3a89eb613977eecd298e43caaefebb8e4ade02da898d420fd1f2696359f6f5fc914e43c5b8aaea21395b6525f68355a6bcdbed62ea244b3ad185b8d8f4ac91e9137b4b7b1b02a5650ca95429515e86743495668a209a5d80437ddec23c23cec6a69b90c25a2d870c6184b701deff84b59737fba8b1a8c58d81b979fd7f0275fadfe75bce56f93d870f5e3bfa377fc431cf07a7b0ef3f90e6bb067f8cfddd4ee77d8c6e2efdb1e0de7c4e78ebf7e818decc3429379b5aa8d83c3e3eb2bb1d6ff3971eee4712b30fb68ba87f115f95f38dc0ab89928a61b4c6fa94936966531c60aab32d628b32863f42a1be38414aaa337d406de94bd13ab33f64e3e7166b5ab97af1b5388818dafcb379c4e148a2ed96263606e7c8260c10c442c3184d197150a6230628a1498000c1042d0c4a26e3424aac4188b95259820c3b44617333590a108337e90414c18559a7452548162b52370461872c2c684892724524ba836766a29622ed0747ec7aade7e334866a2dc6c065bffd64e38fe8e17c6d2cb59d2609f9942176be372963494c882461a691071a3ec52e892060f37ce0e052e43091ec69821c39727c6b8985b5d0a5dd298e1c6dfb2997596659c49cf22a70a5fb8fd91065b8c11033d6cb035c6d8277b3d6cb0f503bd1546331dd5496eb4dde4c6767223371846273a7d34956cf11967e35900a5f7d1337f84dee12c68bcee9c21ce9d5c121ab059e6cbb433ce389f36dff48e6644aae6014080a90d4e041861e7fc95f3b8fc9ff371789b7aa02052f42bfdc29ede66e7a4f5b51884d1bb52bfea56cc6ee00810e7e6379ddf6450e340cf39bf23dabb50efe41c7f1a7ae0ceaf1be8ab49cef1ffc09ddfd589a64c94282512f1a116bb9ecbff1d3dca16695c5d6c7cc9b2f63b3f5183207694418c7245a81b76518702bb6294cbd564637324722828b6a74999262565b4acd88e30e404bbb2655a7043904989520e3290c10d46408cf962c6134844797203146658c10513e7c5464bd209430a23c84c2be894de4a3d2118c515518a3257ca24dd9acb59ca98c06bb8b0f423d75df7b14ce8efbe84a1bb35c86d5cdfd4e7394420d96b5ed8606e26a5dc4a94c52eb2b1e2ca18b026446851c2666255e41003580e4b1451849308a2c0c890022e579c81648309102560c26509a6460abe88d0f4a487199438a185051010530329638089014b962972069cd2d4c2a96a937226b7e8e9d1000c57bc48c1c41532d8a1871765be5c21c30c6e08814b043ea83422409c1bcbaddc293618b14c94588604654a70fbab530d4ea6ebbf49fa621f11ae3f85b10f0d8d729d52a4eb1f44c96ead3467f6292772cd2feca6eb4b0d7a758a790fda9c939bd3e98b538dd3ac5f2b798bd20667f6f59bbee81145a22f0aa31ed7424861eda402cef167513a979a2727693279994fbd43664e33d75dccf5283a7b2af54e38557063d30a0b6ec8f99c73aa807dfa7a7c79cbe9c4d2a04f26facda5275ec9362f77403109e7f87b079442978d9ba5ab4ee08c62134c834e5fd4a34e38e7a3af06bd9fda89beae7f102aacc6bdb63e7a4d094a52b5eff156ff0f4d11a2bffdd094a12942dccf1f1a5a79ebcbbe21f01b7a551af6cccfbe087ded43a221496df215bbdd1de57637958eb592c7584b2e9c4dc2768c917a48b4a73f3d24a9afd9cf7780168da608695f8479c39064dfea68f6c71ad2609fd060cb1f60fa1ba9bf5f0d73d2511bc8578c3991f2d5607c6f58bf622c7e41cc57073981bd1a7c49a794104ad7b78f491af42051d8902a0551b22195d49b31aae43c5c3da44ad77b3061439d98c77ac78a0cdcf267a283e561f5c3f5cf86b8e0f50935bf23f3ba951e4bd8889f742b0dfabb674a41a208a264fdbfc1f841966c7f2958b15dd4450d761785b0b18ae714e1ce8f46ecd377ce39e50f6970a6660cc1a4efcef2ccfd13da3abebc359f7dea786bfed3fcd014eda750f7f61bb2de9adf75df104d4afb865253fb94d5361a8fe54ff3ecea3c96d37c1f12bb7584415656add90644cc3052b973ce39936ae62a4c60fe261f0b9bbaa14442f3dc771e12fbaaeeb77700cd73538468b84fe521e9563dbf07109645247bffec63fd34384760f933f7f4e5ff00637f7e84cd8f45f3a35173de0a5eea93b2b91ab2f734dac879ea0b76e4ccbf01cce9659b840d7ddcfe6dd29045c9a26452b2a4cc4ab6348d32a62c4a462553caae6458b22d938669349b4ca34943774041333b8ac16652b2284f44b9fda137a1c239fd73c29a2727691e1131af34c1727bc266d2b43295e652f74fdfd1567043cedd9d0afbc4fb328d7b644e6f46e19c862d492a6cf75f7a80c8b37df3c85bfd3d3da98f81b6b2a27eb0286e6713d6837e3f6ee84dee8479ab630d9eb16da5a93418a409ebb449d91827ac4e970ac1c2aa629c5ab8457b3461c3c9d4bd64abb576324da6d964eb2afbbc5c4aa9d1a54f85fc35eddd3ff5596fd11e303b9b34a7f6f8ec1f72734bd3fdbed9e42daa79f425141b6f503799b04a2578d0e3049655e9d7ec0718a6e9447f3ed19f4cb36904af951aa49ff22292b7e8cf08ec93c9708fcccb03b7e8ffb01ae29160c1a5505cfa610f45e21e99379c4cb0b98573688f25786c8de486442c126436b744ef07133b9ba6101c6cd3e7589d525ec40f12031b848beda20661ec23c29d4551ca8df1a706ab4383a2245e94bcac283591317e52924129895192d4d74fb2bde6f1c85b11a9fa6b71f9753618e744f9f2e215039518cc74f4262f609e942214e7c4973159859b9c9053482d37fec6044314189ca27717af2231eeed2fc905e6e43253519394e2eeee1d90bf77419993cc254cbe226c93301963f14a348a31caf657efc48f4646ee31e771a19271817322755db12c126e05e65702df0ee52bfe945658fe95e59f8c2935181f080c361e7d428eb0a17cbd9c27fb962ff9921d3bc80c6c7f902c6c7f102cac671f6794714a8ed1a373eeedd4c116495a18ad5c1a97b0d8ba3df7d4e657f016fd5a797e742798bc3489606212a54d977ec64d24972c6b3035f1ee80baaf7a5c12fb8870e9c718fba42ead4f97e4a76a58594ca2f4e39525a62d4dbd6373e9472ff4a3537c6a9ee8a29f394b24ca8599d93e8d1712d198a0faec4b507df644d7bd508643973fe5857f53af7961bc9ac6ffd344973d17fad6780bd7fe8f6fd2f33cee0ea8fb6c83f469bed83036b9f4c3265138cf23ece5440a87ecc45e56701e1dfb14a4e32dfe1104eb5861eb3db2e15fca5f102f96ff41e7999fc4b5ea083058566198b921460858505230f08e128fd58ec7f91932c2992ca4a0c20ba428964c510032c4706192a1862ea66c516dd1a355f1b1e482131c41010ba2cc0c834608ce0c0115c50c61ecb04309ebb12d6052841105c5218b2c8a86a8228608ccd4300651121929f04207a333cc8ca1a572b94a5a2c0c1334cc95ee51a2aeced01b681266382b21c433d59f50a3069b156a9051032a09c7a487a8c6531a6c6da426e59849ed046a5c7143561262fb53e3ca0dd6368f4c593586b0330a6fd1d31346086de330477050504992f91338379663213a3d21146d6a8ce0888d3d566622193b068fde520ba1775434cfffc2d01a2b38cfea999598b9fefb03310f6f5c67e39c31dc302ef9cb465caab55110799ac97b09333dc1b402a623707cd821b8dd506e770fb75b088f71abdf86d6e60b57b11794f378156ef53b51a7702db73fc639fd1f1ca1e37bb5b25687c7dc42c213ae27b945b923f27c73290b35f4db3df613f398c77e94943c7f4a29ed8ec877fded17dbbfafca8b97c65345a949ee8b0c6eda02dc4b182730dcd41719a43fb578a9c7aaf5585ccae2521697b2b8e4c1034ca85f6470ce3ba5dfe81a271b8d938dd6a79cd2bf3b96097d80fce174ab1fc72661431c1e4d6ca8739bc76d213d3ceaf58fab29ef86274e0801c9adc9dd38e44525c8ae7ca1a49d403e91b4a5a6c5188184a6f51527ac7ea5c60d349420c392162ec8f490c3144b6c700236c619435ce122068a15230410cfc286ae055a743418b686198c8852832d6268f08222a0a09283136646c0c3981d3629c69c0088a6020eec8045152ab498d28498061869f184166b301162c91524988b51834609277ce8c1cc13142f687082c312666290c4e48b2dc4346562b4e8c0abaca1445b8387cb142b5708d1c58a2c4014bdaa28a2063e14a920cc6b861181269d10dd20a58aa727315346e0b4803356f040c6992c5a804418b38c1c5a122b2530a68061e1625421439830be24c1e589eb0b13402982063cf040050c19a4c0f8d2511961c80967d650236a818373268a86cc0bbb5dce7266cc0d3959e994be62926997b39c01a3544311b7a59eb39aaaaae75a5575dbbc9f214144ae0dd409ff674850eae5833ada7391e352cf79ecaa4595c8dba3b0e6d79abd10f7d9cfcfb6afdf90f6db0fa59e7b22577ceb4f947d7da1ecebd3afdfd014fa09d5f76fa8bffe907fa6792cf944ae94c7a2df1121ed534750908f0114d8e59ffa8686b42d7c17b73dbbfc650b2f18798bc8a555155a78c1795cbe1115b2af9f84fb2aa7a2b79ca1ae64c7a31370b0f27d8a5037a5aabe21feac6565dcd01421d5ebe850f9ee158140f54852aa6fcafceeb90f75b8741f473f852adbc7ca521f2be3b822a9efbefb90709fd5b4ef27b5d10f3ad7bdda5577777773d7eeeeeeeeeeeeef8bd82e27cd6ab26aab46a3d9a454fcc4501c65c408e7c46a6ae39c93466c38ce8dd8749b5313377193916ef0074fd9f86495116f39d1d84c4747e7dbc056173016b72280798cb011f985ff71519a74eca553724fa7ec38b6ca3f23917dd8d6646ce49b9de66aabb1a1ad5d041c61641ae126231af73ad52eddd8dcf0daa364e4860d8e95cecb8ac326474c7946dce658f5581d1d230d4a233a55e72bff66a332c24d46d8a703287a7b70b575b749b9e8458f1514bf30daeeae52de4d4300e778f37af079de8e9b903bc222213220ba401603a2eb678bcc711d17bd23f5ba30bd6c09ead1f171c3d51768984e20ba42c076f739690b76de1b8e6b2eb30ee845dbdd5506dd9abbdd709135c44aae0eccef00fd1bf3a663f1bca177bb7163e3866cebc4869967c671ef34556e6aa91338875f888fa879d912d4a373434a29a594de9d3ce9cb3927c7b930eff4c28ca6b8b96ddcdc6cb417e660f1173987573ab80db81d1e5c0e380074073577be94525a779ffe1e0f9ca5eb42df8f73f8ad5c173ece839ba4065fca9dfefd3408bb2ef4e5c119531c6ee585f4b217a6724c16071ce0b8118b5ee8c09bf346c79a37ddd782b778ce399f99f98699b9795b5c0f9071742cbed1b178fe16e79c76ce3a3fff06c0f9e072b838008ebb397372e4f3fc2a203947c7621c1d8b6d8d3ffe4c8f24cb1107c70dbef12a6d3ec0e23531c628339aaae9802aad4b7d5c58ae4300e7f0f3f838e7e3a227c089e043a75add58ce0739c218db3a71843196c1cd65aa8b1b0de7eeee2ea5942e4cfe4ac3e4a35afe9c1e9ad6b8bbf37477772941bf11e1071b471863f9c68a83f3849053ce8cd62ab366c381e386d6dd9981eb34cb341a418d031ff4306f4839658c5fe49cd9545299bd4d967d8c5926e9d19cb26a32fbb694529fd25dbebbbb17011d1d11ef4a6d02c91e0e98393a20f9386aa6d2bad49c91c13b79c62ede5417af46277529abd797ca1ab945ffc6a35f73812b6b6cfadb74983922e7500f90c0c3d2cc6895f3886619ad475366f4c829a355ce8cd6239a65b41e4d99d12327396b26279db266f4089c72ca5933ea3465cde851736bbe8d372d70ddfda325e2349f00345420a7b3a65435363672ecf833b1537c8a4bec372e718e941a1c3872dcb8520ec915a783e3fc664a29ab0edec041392425cb866969e9c10f92b8c1e2b179fe50bb353597d9c663b6de0e8e03770e3aa0fa1c00802656c3ed282395b2ce1c00e0987d54dc7d08601f9fbf02c106e1c13c11291aa57869696929b67fec1109090989524a297d7f1d7483fa4522a0fac9068d96eadfaac24a47e4e82a29678e0ea8e2907fc3dd9bd58e077f74866c2aafeff67544dc4b182730c41863b3bb4aa552a9b22ccbb22ccbb28cce39e774970cca21293f5774ddb8b1d12e296d0bd6d9f56d24c8014af7d19648a841aebceebd0e48f59ee6417d811f021bc780d487fc82cb1fc43e9a9191119db12816656f71ae0a4334343434aa2e0997fa56d4a8c8c828870a43ece48423a829882138dce3643db2162cbf90e64162a71683a04204d2d91bbd519224750b18fe139a272ec5a54991544042ba911925895e6e6abc9e20747af4084044aadbe5d7188468a4695a8c4b316623000c72554e09726007241f6cc95af33a9c5d468a461148ffafc215537f9c8281f483f1e202cee99b8e8479fd8b4b3e008e9dc7e6376b3dba06e08393926b6c10ec83cb5100580d6c7c1b4a3c13a00c1b9f9f15603720249820b91a45d77b5861c3d5e51e55d8b09ae0c59661f9ab0eceaeca39ed1f01bad8f02fbff513d408c586b140832bc11037cb5261b00347c89d2104605e31d9cb9d5072b8538a3bbf5a285ceefcd50e29b8f31fdca18a3b5f870720eefc9ede61261ed2b8f37fb6dc3999a2a471271309aab853cae8c1c6c872f86ae52ada1e0bde40536b14cc081c35cb8dce0d773c3183670444c060b8fd373aa07e6bbbbb61f0c4edeebee9805cf21327ae7c1b1d90ac2e788282dbdf6f53b75021821da21081d3edafc1c27d71fb653bb972fbad7d41ac82a603eaaac572373a2cb13a4059d5eb4f4c31c64627bb84e0cc956f738822043f5cf9dcca0a1d6e6c02607a9579a596c850693fae48030721aefc6aaf1c55679fc85dd96587997080ddc0c4954fed12966e72f9bafc0d85804da6b0c187dbffa00d576ebfce0d2568d2c3ed97d676b79632b67b8250b707e0ca6734a4b5542c61abad9c6d2f1d83e6a1c66da61aba3031615a8245471d29a8bf316bbfc5e99ed2adbff59c50b74e300dd6a7f9855b55935b26396fbaf5a73745101a864a61b73ab18f08b7fe7c527da9ee0b69d1addc1752a35b9fbf708ab9f58330d9ecc3e914c574da2085185866ba7c8330616951ef24b14ff3f56993d4e7b1aa555a63b2fe4fbba0b0f5c3e9e431263da4b0f3f3a406ad379f64379d1aacdf038ae53b9d38a77e8f1dac1711c53835257d24c33e4d44151d06fbc45bdf9390ea3b0ecc53bfd188623008918808e48cb8b37dfd2623eecc5f05e126087d0497865b3d86facd450b370c7827f5f5db8a08426cd25318ca8b2f4d986a1276891614000536fe566d10a1ff33030bb5557f9a2fd2cf0aa26115a9f66bbeca2efbd9a7f922b6e6693e162d62f3f66d3e96663f167dae9af7361e58f37feb4fa8fa33aafe74aa3f9fea53afc7fbf1567d1aef8714f67b6efd9c2e6c7c111141985ebaea85084ae973549b5bb7cde9657a9973d2169a4410e28bfbc2aed3ea73dc9af3ebdc3c875b53cf3fbf60b0bef426170cd60fc3ad5704613a4520f5eb8cbaf5c3b8c4ad65dcba05e7d40fa5e43e9e9ff26a83f3839c272679abfef685b5562dc979a693b7aa53ad355c55fae29caafd788175a55a6595b2ca2a6bea63ce91cf38f5ab4075d2f1dabca6a7c116cee54ce37ccc0e48ab9f7aed53f17990b12108eab08f75ed43323465b282b447815ddacfaf4809aa3b3f9073fc5d50587685f52aa99a36e7d73bdd919c0897020406ab0336e8f51aa03ac8814bd65630296b22d6300f47f78e579a898b2ed75ed99abd8ab8daa2ed954aa55c3f239cc06d469084609eed65d8465c196b52ae24bc82b72494511735d364c28bb29a559d1e1fe22df93f294da7e7a763add4494149b44f75a06475640734d4a06c507eeaa9a99b9a8beca631aebc1a654a424f59e567f27f2cd98e05a1c28ba8141bcf1aae412f5b2e3f53165b2edbb8fc851fb83743b4d7df0e322c01a60ba8d48dd63539e9d49440000000e314002028140c0744229150282414f4c4f914800d78a0427e5a994aa42089519032081963083000180032323232449b01b655d0cca8acfe0c6d19886e316863f4ead31d4439498c04f9dac08515a228d8ac5444984e701bac254f6a8ba6a04944191df59b8e5a007da5d788583768bd07e7e7f0ded9a5a80caed74ce766de4f2df3d68ec370584eaaf09544d2bcec267b07b4971297dabb5b135db9007c9d7d0bf97e30eb81ad68dd8f0454cf4940ffffab2000ba87ecd015dada4304a92a0d9a7d754c4515c692dad6a07573ad236af51e91aa75e9277259d5c846841add69aa988f4170c9adaa7ac6810378f9793be08a6455a48875bd52177b0eb56e908491ffa0adb02868af8912e5b4d6a7485c4da194817a5a9f288d7cb540c1c530ebc88a77b7e89c6ec63354485caa7913ccd88268d8dfa6ccc96912706402c7e22a291978a510b2955b5cf7a810103709ab3c6c47d0ac9609d15fdb35878084132a6d3d6e704eb3c6c10987c2c2e2a8e4d911f29faa9122dcf504833bbdfd919671440bcdb6bff547b9e13cee86b90db84ae29a3133901c4e30dc6ea7a54de00d98d68beea6a18f798956f2ea69f043df823b10984a8a9ccbd1b53da5185b015e705fd316f11dbbaf89a5d92c5d45876ededf3d6b36f2db916151dc323b7f12b4da3e05ada94047d404321065bd14740c8cbef53c8db900f543fcb7bfb13d8c8eba551da380964c43e6be3ba903408be1bc40604dd6340e6f62ea0577ad3d4266f395584da92b0983125d19e7ca2be4359bf923b804467d0af8e392fdabfe2d32489a6e7c6626b72c1bc630b6f36789e9548ef09bcc00fa87db10477a5ec095d12b365d8286c283080099a0d72306d8e312deb80dc90e48ad755f5718a9f88196a902a20ff5643e39a4f68d39b35cebd4c4961b012047b5db198300ee5a81babd28d53f52a65e4b7285c0004b6102ce90b741f7cb8fc4749380a8e1dd40f61320ff199aae4af120dd835ad1aa74a9c747373635ab8adf5cc69540a43956b73681bb621096b02a23d59b99524f3fe9233328294fd8e811fface1e4615e813eb37ab83563069cfe2dde00529fd2073b776ec35e4d3f84532ab7453a437b58ea06e8ba846632624e9834e5b54cbb1d72d6641dac7e5dde4e8ef38fb1601012de257bc901a466fc40171630b1b4ddcdcb011854696bb079d374511e5ac195daaef218aca292bfb17e9398735c2739f2dfee54ed18cdc17d75bc3b109d096f958301784fa2752a9fc4a5d94bcf8037a036632a80e8f143026841fe943a391836c89e8c5649b77a3fcbe536c617d54f359c1ce9f24a342ac4ecda8607d8d9074f7a107bab8227127e274391893347cddc01e068b4c879420009bdc0bcf79f40effaf801a1f97a546a40ff3a82eb0a9279e030ea0bb8ee95817262c9f7540bed5dff2628ac358e425fe3ce5155f9c9d732895387c7a6c672cd6164da2d2cce0288157635bc87a097a828f245860aa805704d8e305fa880c93200e3a504a4c540af066b2e1be8779f3b254d32a62434672329e346f21a1f657e8b898eae53780b7f7a8ce100d38ab615c0f1d74f7aeb7e3d49a1e8fe4d4f132410f08688cecff890315f1a80fe040260037ae93f932ada5c7e0edc4f425d8234fc9a3510f91840a8c6a3b1fb7e0d847dd720978c2a70b1eade07e7bb50c95d2f40cd21b533494e656517a0091663ab57c46f004321828a450550de3a782e7813c7267b5614bb95157485c8676114c91f825f44ef2590491fdd8d7d3a19f7564788167d6db50fa238e919fe66c84240094c400d15c8e9541465254d6356d0f9818319212c42a8beec7c763e811e8ccbeaea56ffff1e4ef83d81b5a7a8a6fc5e3fb81801d99657e74cfdec4debfdd1f9ea0cedbcd099ba9bdadbc176d56c3f6958688296836e3256f7ff9715b8a76121d58fa23c320184e334c2307b5a8c757cf66faead3953c02cd21217a549acce1974906461ac56839bdf4a48aad89d2d5c84ebb0c1060b53499617b2ac3b3c420d150942a206b5fab9ae8c0a135326e804b0e8beb5cc97438592e0d1762db63ce69aa23520109d6b5a02e54b5b4dfd7a8dd7c2405e1c641be69dc2d0f0bba946b6d7f7f16360380941975f1998697cf3284399eaf9f4ad5ed14ecb68d8ff626338dedadca1bde3898827985322c9c1f38067f80e05f90dc629e8fbe7d00a4e6045ec18a6cfbf74536b5cefa76a997482cf148bc04b5e144e34c14a1e5ee5bc9c5589b669059272ab7e6727b01aafbca00217d3fd0d6aa8ac1754a0bf3725c616f0cf788d4cb05a736920cd453123e2f4c20af302f3f892fbfbbbafe3e7d09f2c8102e9815716c376d948e95684649fe334e26cdffc9a18986a18b786698816961e466aff96e9c7efc6d2f1a71ee69e8cb9e7d86cfe8507866804eebb194f91c3589fa151e24dac651c9486c8733e457b927438403c6a2c2f91635adab7132505a791546e19fc11f80e53e1fe6c974de0be2049d35c96f4183ece105675aee63a368576020029fef2c81b30f7dbbe1992e8a8cf7fd923080d9cecb32a6962d0a6e4bb4d039abf826843e5d716942c57f70bcd1957ec1fe833682278cfba280a7890eef30d880396409a54c869cfe4492993c547c4fe0d81f161acd56d779b0031e0be8a10dd8f92c190b44d480dbc6240a33436f227fc1d2804af1421476a104efb48d9570a0efaf0db2a590d3233a2c46b37b05936819e4694f836edb1e9dd40f85fd743da37357dbcc665823d5a9be1a46585af9e221de97bfc3858a84ac55ce73af8df6baae1c45c404b36c10df8cda53de6cca732c472496a450e090819c68890501366e5f6edebfe57ffa1ff3a7707436dfee71f38ef5376fa1ff6d790e896cfc67bc3964da1d233d6011aecf0ec55b5267937edc5f66aaca6cee23b3d64a6cd435a10268e742d0e009c5bec46890b0525fae8a3267c0f3852dd4900fc661cb06c15cbda87c7d04cb97f7d152ebfd815c885be1171cc8471caa37800bb73ec1ac20f29731ebfd2382643731b879f97fc1526cee14ad0e9849085a0ba43ab293aea12a7485bc48bcc99c1b45bee0c179741b237b8d168d9495ea85356ea61d8e2daf14b567838370e3cada4317a849ac9a05d870568de23290f88d28078778e4252efe7737691c9281f12d044c9c0a97f886a7805a3d7dc618a7eec034623fb2cfb4850f0420acab38f1ff6d6ad4e0222f6faf16b36136127cb3514fb34f2ac28b21e90908f956ab158a768c7eaf33b83d1b47e402e22acdd1e784b187105e218738754ed941e943aa7f5bf2a96c9b6c1600f7331478a0944a36a82cf7df13408dc525c835986b33b70efe298cabc023f6a6d5c6262aa7cf591408cfd914839cd25c6bbeb9d7d3f9af5f20d0926af6beaa567a1af7fe831346907c7118e3416c5fa3d129823b6885812f095e495c37ea68d5500f07d808ad6c9f482c34002e8add497030787fac989b14055b498ded17233b5e360245c1018ea9459831234425099517415c8f2235f81ed0a398c77a3d2cebc0d899385e26f1b80a85399368dca0bd843c97caa7195411eaf1c660716c9438cc498a8a0fd12325dfe3328b5d49ead7b604348b92c4b6342439e1bf63990667bb84c3162f6f2eb14011349256f7abd4b45185268d9f9d4eb8dbbe4cb7e77d3a02cb29dd6ab7471c11a40b45281ff9806b0b22382f86eaf14bcc03359e04ccd7691f5d1498a054535532c503279831819e50f3f84a8b77ba9c89a88c0d1c41b8efbc455e8e001b4b8f85c6e7eed12f13ffbd2b5ac95256082c9c515427873ec7ba6fc493fc1c4d8da872ea3d7c4e4d04d96cdab164f0b34f9210ab945d465a115d52ba1faed41b91a42e15fac9ac19fe2d9d036d4339650be2019c693d69556d3aaa88557b4ddf1c87d15ba3178ab277dee6f23f588498e63a590a1d2bcd783a49d68b842a96d808f6e1e5957e9d2fd54808cf6032bf634e17bf71d754117ee7d0e01f2281ff92dedd7c737293848e39a497cd7be5a36d01f3735d5ee7b87b4ceee6a29c9fabd6f3077a6b3fb5298a6ace2502abd7d83cb801d7a306159d488f000706ca6c6fbbb111107084ae18cf5d170cc9e42678cfc8107e9169b2d3744f441bad18a5ae07848f02c9d18c696495b5a28c82fd5b7cb63a4aab58ad46a8320a77e23b123b6dfac5385f7a154d12b5733c84ea3bfe616066f6062b40a8f0a5ff588a88924419e755d8f9e7fac9c0410fc28926869644882ac6246e0f5f8ccd8b24a9881f3b7dbce5c24b0258b8907a3d2d6b630e569317f29b6d1d97689257caba310a9e058bf71436689aa47441a0bf52d44ee3fd1f06fedcf01c9f53819f51189db52a5a5bf9bf45bbfbdb332b1c84e05713d171bd77e39e4bc74601570d6379a48943c59ad65066354cc581282c18100e435738e6056fa201290225e2f9e0a79c66c37098464435cc46d5dee378a59819e96f7ccd32759a0afbe934c7b069697eb62fca74110680926254f2c91d0a20c2df90bc90061a2c11f574df8f62311eb3d1f050becc8b6542c4f943371c24db3b87c3ffda7dc9e3b6bbfec1de3ca6964cc88f19ef96c504816c00cf096448ca005dcde0785f19402937c875c23e989a2e92a793f5a6934778469a046c4e0ed3c3d6331115cde51c27dbe99141fbedd194275e2471a369c41b84624717ff5c8a1ba3213d4660cc1c141f6b79043341b332c4921a7b2d6f3399e9898c85c81a90b22bd81fa32bc6b3a458e28784f8551095350689f5e9fe10ffb11af4220fa7fbdcbbe17c20f2f06241f433730f3bb922af9c7dd472d8b62810fcf38494482af3041e9c5e70bc1ada36d87e3501c99925c8ec22b6893705a386bdcfab272f3639f070a7ef3d8bbb8feeeb2cd2d0cde18e03a04e49cf64994970146f48834ccbde90c71d7ac88fac54938fe0e8fecde764f344ec68fda4c822104f0f4f9f60984a5fb80d03b1a2cb592ec8af386d6b86594273c4e75bf43e7400be68c9385b4be35a426fb3766df371edb4d9e2f6b323dfee7a525746e8ce37849438cbae69da2b4007ba369d2735a7a4cb33c165fe912ac3381ccdd2d795716184f90e78f38c1ea1a595cd5b7cab1f052109d150db1885f8a5d702c7e80bf4eb7f52263d023a6aaf82bafa05f17025b4754e55dcc01c4f2601610b61e4114325e9242136035c604255c96bf185f46781420d1c1b543f2020898d9201cca492af4069b5719240ee0561d40592d0aff7f0a0f5474bd7f4160115ac18b6c7cbf6087efd182a6113fd4b0caf488b3b6b00fffd29aa012f8a16b09a8eb66df19d845ba350173c21c51972ee44250bfc61351226c4da44d70ad61defdedf749954e8d82a33f2450e479aa3619acd188727bcacc7bb8f2ce74b29a181e52dc9533133211bbf08d478c899a7de7d77883445c72c44442227a134e3a9d14dd8238e9d797c0dcdbe7179c30a9e26a4c69bdd0b82828ae2cb20279da3e7d0a9ef4803d7965b89ac7bf69d2c9af16c36e29b0c3c655aef3bf06284fe86105fa804eb6a44b196032f36218e610e451d0f024899f6c23859d928954d7c7bc06f457f7500a7855076d263db1a11cb5d178a331f6a8ecf995df70fce3b9b3b5ce1384a3fd417072722434264795b5e4e4c6675dda1eb591d5fdf854ef52e080b6596b200b4bd6f8dffb9bb8eb5fa14a7bd4e46ed688e43b6c88808847d0c834f870072dbd18af6922f83477bb1706ebfdbb349d1510e0a2f92e1a38b5007ee844e8847b5d376b98706b8f1a870d672bb387641df12d61b24a403b58f6ef2180a21a57342b2b38d9d08c70ab326ebf26ecb1e43badd7898ddfde6a105250e77d9edd143a2f1bb91d4c28b1cd5274c58cd849da4b65c5b2335dada0bca21fc92339d0590d23710b63d8d851e5e1eb714bd0275e1f2cc3172a3c7e24c0f219a4a923d5f06faeb4a4fa4a3cccce6c019bc361dd15dcdaaff7b2bcda2a8c7e6530895335546737e718259f0a18597c1c3ba76e574f15ac504d1759c90155227e2088bdcdf1c4a1c6a230cc43b1857a1c19e246101c0c1ba123f6f6b0c6be7ce06c57d58dde676fde506b94177803252b749bfe044390942afc1a5b5529a4f8089363a2363d2f77e588fdabbaf721233fdb468cc6997984d54e8796eb4d4d8b18baa703c4c43e236b426bffba35ea4cdce4e2d7bde3e077b49cefb64b5b74fd2ad50d321e1dc44c4996bac7aa8870887374fcc16707b5e963d5eb0816ea15f1f496c25f7426289973b0bbb56e105bf0079e1a59bf80b0b229815568c1e20085f6f9bffe370d6fbef35160a23206aaa1d77b7c4669245a58499596f24ca2e1cfa3377946672f4911eaafc48a1d66815eb7f2fbde82cfb6e08270df0f061a8b8f562b91578d46042c08bcfd2cb6529f39aba8a74391c81086fb0c0fe122a80ee0d301821023d458d0ffd704fa153e8f7b3a5c81b8f329b62834e0c55e6f5473d8cb10e3e9b06c5d23d892d93a1a3594b5e552993fcaceb5bce41272ede1cbfd52d55dcfc8a57f7bfcf8d076279791ca59b27168cf1354fe7a858246f4f73d1036e59ce7fba114a61076e4a2f7cc6dd54fa928017cb8ed5d324e4aca1b1c60faf971184f1c89f9bad76f1aa3b5aaa0a24187dae22426f69b0c60ff654f9d4d9fb87a5f392eb0aa2f6607a525142e3bc4ec8a019c1eb5116ce84f2ded0d18c522f31c1f034ae96efea7ba745e78d92c39e2a78cb7b789c363ec6e7826f70ab580432ec942cbf01d0d4e81640115d770ee3272882e7eda9d0bdfedd37b0532fd098389cc8b1e50f8f4d845fe4a4672224804a2eb76b2d0d1472a5c64750aa4611bc7e0655d2f5d1324c5293c96c1ef42d666adcb4c5af68a77a0181cff8b33bb3c33ac17baf8d20cb501cd86a765e15b4e209db700bdfcff53f3b9bca7c7027aff72045baa153616897f9130e85ea6836fcd22920990203a46e92b527d1429d1f19dda8d51552419ce6651a4484bf877d10d3722a5d0d15d1d8dbfca6bd41cc2932b8c4f6f8db8905e424b137dbe2541e2596f25d4e1ebd0818f441c9108711afa429d42bc386a201ef11bb1f1ace7c375f8828b544e3a293b3e6cd412457aaf40cf967f0a040efba214e63697bbc909e9d51a900063852778177680440825ba168385739e1865f360135aa9bba2370fd0e830d96b81b1b4d4af08ecf71743612ae663cbf2f6f9c9e63c2aa0729cbfe5128f47d3ea826871248ac449c03ff4867b1c1bcc57a0c38960cafe2b1d5062ea6f0b357eea7c405bca321d1ced3e502a55195e71ee6f8c5e67bb1042495cf16b95edda60413eaa7be59ffba7e2fd392596a9bf4a0ff40549ac718ad1b6d4529c092b027552ebfb481d0f45ecc6eb7f3bb8474a8b7b1bf767aebdc0375d300d20462de5eae564e4d0349715241987fef4129b9f64d9a51b0938e42052ef4f39934eeb6da4e3a1bbbefd04881249ae45440b93ee38ccf71aaa38e0e0f81524073c295f9bd38b4869fc501941e3e3716c64e18436c17035cbe52102f79fe693dff4c96dc2409968d9381fb3f8beb2fabfc31625c867ea0634f23a1ef4dba23815c701941122cb4590e1c734b0bbf31dd25a08694c3bc58667d19eb05479c7d08d58d0da2361842c652e3f978234c67704e91e6631ee36c682f4edccb033b6b19b398e9c9f3df35de859d387841ad2f4e4558a0e36cbb59b4544317c94b037491912b03641cc7bc1b8a6ecb3a1fe214a8f7e9052f2b6299d27232a0d6a0cc9fe67c74716c2a183e0865ffc2cdf14f75952e4f8f75b6c0470abf560c333843447c409f5bbf994d59a807e05c40cb6e00520bf5555d49cba94c2434b5bca69c1e80312c2db6a19c4fa163cbb5f1bf3715daef86b9c85af0cd27817b5f08e45fc08c63506a071d44c02949e3ea1caad2975da85c5a1bcfdc280708f69024e1341057ad6997066055f333632dfd1596c67da72d915eac025a6937d65c3fa70803f3a3ec22469a6dc4e11ad5cb77084e3e6a6697e56a71f57916de5f77475a5061bb0d8a995e09836006902155366fdfb980ec9cf07b95f07886dee88dbbf841e300f11dbcaf822061161858fd9b27da1ef4f36dc68c688ebd513916ae715243dd979ce348f2afd4dd54bdb6291a5da1bd73f951c8b7c485447215f122b7aaf886aa7f5018d0a58312809fe1fe59cafcd010acdd05f35f9394978327dfee1c6b3d49d201cd0074184692e8586e34898b8f8b7b89926052dd78d6eb7d91dcc6595359bc26c8237cdf5d65d9b1c2a1b2fbc8d2ad4aa43ea63455595a7c5a0fb6352de98ab8d1699d26b54d169b1d5a0c04daf1f91fbfb813df0bf57416f0d394330da4ef53c26512ed34ce5dc87858685827e53ca4461746b29edc27e303f1835f1e4c8079c27e2846000120ffe870e049eeaa774093114c0b50bffa664051c22140fbc68eef01e269145feaf811acc64d67ac9a8266b5d59eb93c5017aca4b18b755bf58adbe121d3f7eb019bfe08ea42a482794a4138aa24229630765d27ee3a42682b75c5890a263130af8efd2dc1b22fd781c0e980a64468fdb224d7f7c1bbfd033e23d3f435e9840a93cf5da67ded0051071aace9ea550fee05cf514c36410615440eb2e05d39350dabd3eba6424ef7a2ac4dc5968138679bf702122d5c0ae014a9a738fa4a9c98d8970a932232992a7f13e5ef3689d0a396e9860d72db509e148f8dec4f7927c6f3ddf1891046b1221da0ed1dcf4242ce710c51b4699262b82b96c968e89843bb9876734885b2393124e6a465abb644a47fd26d1482393818a91f111e1192f2f6401165fe5a3fe0ddb956dec9b066ec92e9a434dd86ba1b9c535d80d494e45373b868f8ec7890293a4a5336d6e6064d3419b730dd8f63c61e6b265627bdbd945622f6d78a8c277eb81fbe5544c0f90120bfacf8cd45b29f94e1b381926627024d2c63434b310f1f83a52b29ff48640e74f317981934e267ee8e165f43449cf4e1829aed328696e902953cf1c520cd0ca5b26c5799bcb58c50fc8c8c5e36759e7f4acf1057c3adb6ed474924ae226bc38c2aa147c9c4e67eee48c8f7d49fbeccadd638d881a912d779c6caef81d56ad0a35b5687f124cc8057f33a83b62617b5102f5d776396bbb80a02eaa5d7d706005c7ea73ca22c8be995803c9e87b4347a60c4df9c6d0418201c7b7846e0e6c86f8c5f22cd82221ab9b24794ae52ca62d88a4ba883661e9609490830dd83066c1fbfbf8fe887fb55ba53b316b4b7789ad5661193dc1d005bb9691c66a0aae68e123f4d16c91e2fb7f4eb32f38519ffbaeecf3a54f61f73f3ed19cb93d2b5a774ed38824f800f9005b09b7ea9ce4e8a3650136b63351ff3fa6214d668864643100507f8639d43a276eba76fc3c263a17ea2a73bd693ffe01adab0af7b295f487d3ec4db42be15eb4074b8b295e4f6712b009f057532a607dbe92ba637cb8d00f4bc2288189d599654e767f4e7b49398c71c39c095253e0f0f30cc5feee1f11ea51335233217c22fefc6516ab0d30b66722f98d5f8370c1682ba21579679ddc4212b45d55f483717d61aad00d7870068bafb079c58cbc3106997a3a744c18cfb048830f1f46e9bb50e808deecd42b282dc280a1176118b98ccd19b5ce2ecd246b99f49c5654225968cc38777ad3631e33c2f8d0316e545b9628379a2f355628af8b3270d079199ee8f81598847528392c67ade334197c7f69ff42a845f345b050db4db0f4162d9e50e70f64f18ce30d0560514f00d72df9705d350112e71434a7ad063b6ee6b2506e375a609ec7fc590c2d8ca46c2186e78662ae0f11d5afbc4115ddcb46b64cd580777ba0b2f7633c8c19d98f379563b78829e44a32ccb46c0d751831550ee77406c48d789f6a77aaa542265eefb85acd5c7f8fe738563e7eeaef948c921731c0d079f3624786a91b4a9b2a1e31fe3c386132c27e63c6ca54acd39b60ac94671b226ed1d82023a28fdffbd41455b7466bc3effe7b452fd8871e89d6c231a7a591ea3cefe6a248613901035f35412f9c964b02af9dce2a6eefe8d28165b73aa5e29950c08e1c0ac98add84180fe0443b43750360148c0ed0aa880b5c42cbe69877c761f0d4cb2d5a52aafffafaf05892ed4ea810e2db10f907ebf8e8ad15b3fe1fa42ae59d46dd21b19cc6cb485b07ddeee9a1279d6e8666c2c1745817be153d3d4bcd9240853147b1772cc209bafbc0d1b01eec088ef7fd404557f570a3a70aada3454ff928281205a520a192676dbb1a7abc88ac4a0b47748409525420c4d753a3d86fe1ad07edec3e489896ed8e1cb8671d28c54389390b1e831840d2c64235c4e4fe155ceb3d53644344e25d45c0074bc62a241d1f9c690f2bd4955d0b3e37ca8271390c5a3c4d123a0cd298e87228868b39dd462ea2bf446403a76b344911c4bc43b1848fed0b2b15f55053da5b0cd10d2a987655f8df91210fe028c2e20c2146d84a0c14ea7f76c6a1f09e74e32be4406a5961f3f40f999d7ded8a488db65d3c1ae54579ff4ad26a45798d503f0f60d34bb2a18e89cbb11fdbd02d501001128cedd047cd877472847a248e6c3e394ec72e1cbf986a1845646b0841f035e0bcc7bf65c09a821ab877d604db52edd4efe7881b52036e0923cf1dbb0df06626cf08ff3fe9e534a2051dcb5e8cbc60bd3131cfe70b041cf2220b2ca61ed168dd0069db2883157b64ede63bbb6d1805f979e70fd8368a02a4e5628ecd4bca805a2cac3f735d1db9744000439096348107bb5349c1ffec9cc5030168a4378189374b776dd5dee3223d0abbc6b47cff168c135f229416f21391cb898934f3d08995f8ee7facb3e990b0b661ec211bc6a09ff7e9f36650722f41375fdc9eb08d1827d5088bf94e326160ca554a5f4670faf1095bdf6be4bcac79aa02dc954f0728acc85b33ed5e2180ab236da15ac9c52b3844e5a2347bc1e96e514975b7883bb76262641e2424e633df1ed810a70ce22822765ebfc75292daca3556273d1523e01073178e276f6b74e7e83c378257a114d274f766ed5231c7d522de70bd81da5ec3ab6ffa20d6615e0fe2314088d8631642d65b8dc641148f0192a86d613450847c7556d02b8a46d6be842c297063fb637d24736cbda9234457d72508d403dc46752f5efea475293ad0d5588de26c8d81d7f56c572b8027f1dbe0d41d21d594375601d861ec7940410f45122b2de8310b3ddae39eef24cebb6f0bc7ea3bb208441f36f76e0a038ca0599b41d4d195fa46d6e5a63e3d7ec0c9cd4c678b56e3569ba734ed1d1b63a5eeb214ed25a1c56a948ed06ab88ff4c464ea9fd16a298f61b5fdb19c8688b3a6d3a525b1c7335a4de56bba6ae1c833c36b33bf5c0175092015b58843f1a58ee9c05645d3c061631859b819970288c4dd983e46796896949d5b5324aa6c4cba7bd19eea5780d1d9aa442a52e8e95427d51044fab95239c6ffc618c00db714981a159cc850d7b95559a79f5c597d5cb0ad9b7a6e585626d0ee02f8166c821b4c2c4db62dc62c49fce39fca4b7cc271d9baa814898d41c245a46d7015ee09185616830efba3d2ef9c96a6e19ab46a7c52f6b0b2ce413f890fcdb178d0bd58d860dca1269ab9e1a06e5f65261efb4b64406fb291e6d5bafa61f7ba8761ed3db7e79ab49b284a30bde963d9277dede543eea2052294baae8e8c96e8ec6a3d7c1084039610dde7771198d8139279bb153d88ffc0c9a7bef1155ab1b853f9f1e46c3173f53819e6b1eb4164d8320908bccf99a126486154019f6823106b8b9617eb484091ac1a7591aaa35fed25dda7f5d5b1b41c21c957636d558a4dc0e1b578071b50c85f098914b969a564d3864c8c59e6794405cbc3026d1f62d1052f0d6c618beb73afac49732a06aa54e2540e85b36a34ed317ebb1d41df5ebf15e6d941443a12927c3930249295b4ccc3b36614cdca1e5cc45061be6ee2df90b11d5058832f87359f2d312669f9d9ae1f2849bfc39c34b5b1fcbba84314743b7ea4a750aa28d92f2fd6fce85390c17cf175f93dea7f96575acccd568b5586567a675200f13ffe8da573f3e53c7aa1071582864f0228660b75aa7eca0069f2fdba79c2ced70ef31154192caf98f21a4e0b48bb4cf6d8d29c36ac69eb6fbe70f4bdd516af248ba538fdfe4d2bb8ed07455f48e642d3eadc9e3954d6e9fa7460aeebea38547630542d011b4da93808b3819ce1ac0476ba995a70a1c7b0c3549d52dd0aa86d2b91f20e0b321422a97c3a9ddd8323238d2393795c6b54d50e55402936f9ca497e0ad23f94cda7fe39dcfd8b150b20b1d7877975e66a274177b9752e233f3282a8d4638bf57c37cadd45b771c02aedc926bf4799decda4e7b0f2d6f22b4016fbb0c5d760bfbe0ec9ce27c1bc9587000f571ffd7b8256b14c3ed0f87d5d22e6d94b69720b9b8d326003029ba94af8ff9ee77c01bfb88d2be21349b8e4ddf114f39302a61358bca27df39b81db1e737ddb1694304f6664b9f4813916f4092d9ce7e5c2322dda06540139c4599a19d92af5104244f9cb3dd043e0f93de125d506bc0ca212b2f896586cf8a89dcd4e8d14e20c2c81c3ce0a1dc09cdb324380f16028b0350513c8cf2e1f7bfacf6786376730c5d9b1c5f942c5508e177f5c3ce353f54d62a0063b285cff5d5db8418301a3781544606953cb5b155ba66c9efba388086336985a2be790cd299842153663310e4f38f152c6df3a8fa5e54191b5d735e4e230ed31c432ed575ef6f6e5dedf966b64dd58090c8265d98a73def9c2b236bebd3854af93d52b45983bea3e086efd96237b5f4ab574c1d2d1b1309d5c4814e9365f461794b6a2cc55a33993c753bf2762ef0f78b6b0fa178ead74cb2fcef2539005c1505910fa0392f0a40dad2176e1735a6cc682f3787e136c16114b391cbc03404218dc7398444a251702cd520fc328d3801f0b77929db1d35e525ee81db4bc373cf2fe08824fe712b67e68235250a0f4d5f02f893238e3d538e6a4019ed73cbf64af43754984bfb63ddd000d6a724c9c588c6ae00f1c50f4d5776b4f91d38271c939d0c052a57626991ba71bfe116da2fd4e1267c24d94daf09333c0a0f3d0331625c2523df07268cb7563e4bf3e7701790726016a1a7d4a9b18b4d58e906fad51d4c768267755d2b163dde41da9f8748e554213258754f9855b6a9d700533cfda6df54a3ecd8775df1fbad1a307fdb63f3fa65d937ca947419799aa996ef294b621b6513839180b8e789c2ea3055c665686ea5e2146c973fe07259ce4a96a926ee8fad709409ee8e42ea498b7c482221d103367efb9e03891a2a73dbc526fe56f63cee706b97283bbf852dec4e2b24ffc51004113ce2af1b13b52d260ae0189c2aabe45e604d93a5a13b461aa56157517317ef5d2022c48f02d64fca10bd2365243f310e3124745476c11d3186e26c0d451b6a1bc1798a9f38c8d6dbd68caa4ad736f827583ac994888f2c04e26291949887d1e598b7a95c239e7951ef3423db14de8d72ea4e3881b85a1965b859c934f1650c158c178270cbec70035159ec0bd53c605d9efeb5d2835963a661d9597e8150ed3b841c79d56907f7ccac19d5c766cbf476a348041040e14281999183b540f836bec715d407132b6eba663667e08d0cd17c8a9159436c02f8cf5fe1a313267606e819fff693936c140c78d250b4066f6aa1c5c014a0efebc297cbe95d47963478d36d8f2ab46fe313bd142acd06ddc42da296782c365ca345d7c4488ceccabdb0e1e9d3af65bc011200e747de443801fd3692ec42b7462ce731ad2c4693aa29586179bea381b20c1efb51cfa41d08f2a7755aa74faa6c160691bfb37cdff0b898a42026c3d66c5e9b03ebdf8251f2885d38c126de3dda09384f74c0f63a0ce061e88d9414afda4995283309f1a22afed7cf5d22c971c94298bda67bf5ca808dacb1f46fc324cc17c0d7b56e6fda3072ebe6ae986429ce221cb881b104aa19b6b5c466aa13ee87f58215493758bf4056c4b241740c2639065e2ddf3b8f0b98759fb640209e1e085962e3641c9f7b38db329ceb3dc2c75b26a648b8e50f37ede97e6f433e2a915c8676d2a87203c2e9f94fcbd46e5e8c45170b59233ca97c0b412104177fa815cde1c269a42a96cd8b5e12b1d9e6bd8f1937487e8d3cc18a6ec87443564b8d6a88299bd544c09df86e87081dc0233c5879fb58edb3437394e7b3f71ba55d9b94622ff48e28e32c989bb680744a316b43cffa7f24d9d037ddfd2a9d6d5130f9c5c3003642bb0c650bad322b814547c9d45226d1c082dbf526f480a66aad85f2ec73ec46d9a5c06610edf446e18c62593d260d5db8b0588d4049046a9051cd5d18765fe07c5bd413ef013f9796f47a95a5e24d6a0f2f95e03f7a039296a3e8fe762e56b19657c74bbe0ee24bdd8e3f7dcb7b39d72639c489718bf2cbd3c47f697a799d812d3cb1ea74d9db78669e3a5019d846a5dfe0561e8c25e0c205b585cc99a527b2fdd03d191db53889c16e4f2a90a4177e1aea590f1de4db961877d4f17342e9fd1a75a5fc17077d0151e0ed696f229f70670ca3053f0164a40218aee1c48a0a5f1330a08eb28836f1a9b7b7d5cc8f58257acf98131a2b62a3b88114f2b8ff640efdf35a7d0ea5986dcf2b1b47d340e745953d7cfe8c75b867b0ddefe7a704b0f9b8abef67f8d91c5bd7f9d007d632b34e9d154ff02945078dee649f31de67100a1833cf4640d5e78ddc64598c80cf2a4c16b2dbbc786e80d18b841294754c7785f449da6b10b0c388e3d204af72cfa4e0e4372e54485ad3f5fc27f40ccbb5b3fe473041aad8ff36742b67476c61125b323a2004fadb6eb9f3f19baade26aea1185b1a930eee73a1d776e973f4a4bd7530ba3713f1ea410db8d2d469e3f4c8377d9b248a78a90a4a05e3a60db8b61770e31693e2d6e0ec35af3870b17cf355c9f6e87fcf076cb00f15fbb2c2037513c7bfce459a65169d819628bfd55377a01508969476ed121e9de891f5f8c439a3cc134e622ad0c1a617a1310564156d654a537cdb958790d794085195075f607674423114012d3d3cbd59c5f1180340a64be1badedc5659c3a509abd8aa7e33719df0c825f594497d868c22ac5f69f8d129d4ce3606aec70a2196401c81f5b9d10928a3c0c1bc28f06a0f6aecce43fc4e3001e50bd59e01b5d83ea2d445254aba16201a54f409800fb5f135686a0e62d008bd5c5a9854e4b90e9163e48aac92c44885acd4fca246bfffad756adb1fbebf6cd067e6079335a55fb5566b3b603b7abf61b2a3f11e35ecbfe77e6543a8d3de1174e910974aa1e9c9bc94b20d2a9f0ff38a7f375fcd6b8cf51a2ba7b2f464af455f370fb202545d43a0cec266f1fa950263cf8996e8fad8b1f2e306aa1688d011162c05c09e06576bc978f3fff4be2f781b521b68feac93412252fe9f4fd269df27be05c0eacafa04131ab0e6d8b56278bab9dd5f0f3c29c4c94e42ec52a9b942ed7a703f3ebd9e5849649cd6bbbe4a4cfdb5f1ae5a9bcda2d8eed0c259c16b32caf1c350994495ac008f44f587b951f634c4410eac991457acd6b70de425f44eebf0b9712bdc10dac635c2c09a5ce51bc3eff0e7bfc7ea35a350276efee49527f17a5453b3e0ddc0892c576001f418fabdf701308436a67230b32813135b91488644e0f9caf46b3b176bb6e20cd68800c81a72495bfeee2fb0beeba3f6f47bcf83135d6efae5370b68100a21f2d8855f2d78d0fdc5203852763faf0b7f1091c462e091bce3f2c47a289375fe1559dd433d3a07751c3f78212d66af151df0efbef6a6dd4aa77630beb846b2e3b67f866fd04a2d5480aad9c16a340578ab7f5cf1add6cab64d8b6bcc3871c63f8e985e367d4f46b081eb2277af850a57fc56a1afc24a9e1be42170b358134cf048ea4d9ade90d6086172c3d14f1ae7aba8c4892bf4f60415b1af3db7ed78c874db4a1254392794a5ed40d246c773044927d142e134f21409c8b1f494abbbb215c9e1ee83677aa7006dbb17b20e7cf5e6c2e53731c90e33ab0ac8ee25c67280a8467e7b818be7fcb4ed9810b7141d6d30902072ed797719f253e37c88d6e831e76b24fe0480fe055ffbd33876e0dd1e64be881f0b3cf9f62b2382001065cd23d8fedb789a93cf413527e749a564d601df9bfe37829a75c5c5260ad27ef740a2e1316fc0da030b035e696cf98da2ee309d3d8eb5192e660c1f8426102361421382b9b3d1df4b3084b75a479148e90c976c31f2cb9526e848f5273d42d90eb76c3417a7da448e44c4979ccaa881ed6d394d24511405f370547cecefe1b90ac61d052fda3b39982e6106a79826c495ab739e4af7527d69dbe3068132621397746c47423f5f26f8539a8fae4fdbcaab42018d4de0d9f30c81ac2eaa74746929a08a16d34e2aef00c1a742e5504eac44008445cbab6125c9258818edef24a7e414704639d16d8c21d9ba70874f7e2e907c542a1878923cbeb80b8835c097f984c3aea3239a5a39aabeca77ca868befca0183e6a2bb9e14170f9f2f6c69f41f5e69b84cc0f0fb9a713e8ad59c7a8d5cb05657a7303d223c710e3c21a9624684137eac016173b2a1df157462a62cd28d3dc50431eea94ecc8396e9c3d0163fa2bb1b395b133f8c24e0c4beca458ea6a0033c8c2aff2b0398ff46bd1f6e5b67cf09c63588d12108290c8c06cb19201373d78686859878f18b0356259ae68f553dc0145d0f9880e9e943250960f01196db422af839cc99b361bfc10b2fa8bb4a8087b8b558cc08cdc58ae8bb7eac401a138f3fdbfda3a43214859950b6110a5b8e75e5c2bc93b39d65a71a7a33c2aa26e1a6c85a3ad753e2ed0c6c342d00d9893982a46c23604912f375734a7acf5ee9430d0a470971db36575ac0cf77e41fa5dfaab392c82a8d0a3feae6b0c2eb0bcea398d6992b4a784a9e59108e38c8e56d84cd91dbeae6dbed7c864f8ff28d2d7d1b1f6142f969c1a09cb5ac0d74aa955b8104fc354fe464bb20bdd9a4b033a3a10b73da6ce8007e3ecdd6661d7a4c14e1b2f75f814ccbc97e59933269d848ffe3ed1b8a04db729ecc43d34ec2ab791a5f3b41b399baed8f6883e902f844458b825a4338826bd06caf4746337a460ce423d4e1af713252da0e0cdf9b88ddccad169c5cac9324c2fb962c71cb3d5490250ea555b5014ac0785efc54cbdcc4bae0fa41eba9996939e9c9862221bf8955920eac6f90c3730a761bef779d9e6131b78b6225fa22dda4aab53a7a85b93651027cb91714d783beec4bd6aef23fddc7b22f27bd68dca696bfaa4e238d976f654a52e0e0177418507d42b5ce1c5951841af61609fff0a7fba53543ed3d48969a75baf9872f56e841d4af1d4abeb32b8ecae89a85e3551eb70400e8c6d403962bf150214cc558917cd7c331445ab6a9c5299865a48ecd8a5b69a7249357071c11f0e83f15e4f49d79e61895f660eec744e9233801412132765e22660c313095e6cce93ccc1fc28dd9eea03e68333f20728f4d0b11f73180607d27affceb1684f81deb121b2b5986b90f2df083f3e6601e6d9e53708d0894dcb648ff2eb58edb062ee281820551969559614bd223642370ca0e03bdf430a463ca788f84aa15e71eccfcb7694f03085f6be626172660dc45def7a48321f81b0588550b95d9d0b84a5313a8a400b68e7314c8f7e5dde72d762d4a9e43ebdf5602328879a41f60618a7b357b76671a0756f35ac02bdcb1a4312d04f6abe0d7a6f21e78443f7620a281e2b8a4f60fccc3a2b99274f0d2d0c9264ab27a051350dfd4f6b98dc37a2145d646481484d729225aa60a235faa293264313524364eb79df828c98b3d42677e67dfa06658e93a285cdf23aa1423f5d2ed901f33ead3fca037532046d476cbfe924acca224b5fc5de2e6ff730b815524f94f23a5d5ed7ce5ed7c26a570078715b749c6dab3cfc7728e170ad433685816bd38c6db4b72b960965d1a654ad536959c435de2ecbdb230edf594820596d05c4b1553104473f4852a8f817378bc9b3bb1344692b524f70c14098b6e99105a704a592b48ceef8b2162f1d6059233ef3d956ba401f3d81b5281125d4ac95d48cf041b248e623c646251d4e630c9265631c8cc607fcc8e8d03f713ce211789e50d342113d3e2d104205755a354f9ed108f736d5c8464e2c1115595ba5d5e55927075d0467d474d0e47b88f29e4fe89c601b890475b517a81a04e97a7d24f894cc37544fd4bb459cd4a9d47753e2c63628042ca2877229e8c0dd625ebc7d97772251bdf1c179b73d43d76849cf2d7a00493a541e2a95745f64afeeb1e7adfc7c8119d167b90a50e708a98289a94371529fb80883535c2c6497dcde8bfd981053d8e7cecbed626e8b0821d30bc0ec487da1088e561ac1c94f9f43bc559602b7063dddafc0195024b5375db97e6b01a85f7caa585cd3e81b33d1d19fae1e6d7c8018ecf12c8b77194cb283fae311676d2befa88ebbcd1872f5aa578b01581d6048d9a7288085a59b7dcf3a56d8072e2ab4e630807e8b158d54b2f2630f883f4aa3c62538f73b91d2064f43405b2c5c79284c96f047569ce412f7070637ba88bf2e486280786ff27127f0e5ae95759adc99ae13321c17df7d3619a8f3a45b4f6c57d343e1bcefdefe617046c5cbe96c64de65f350b79c8c23c64ecd9124155f721a17a7ca842fc5a398d9c0bb92e6c76be971909cf164a837ee8992e82b1d7bbba42bd3de025946e0887e2648fc6272542dc0ce83f885e41895349512e87a3ea053c62b9e370e8be7fdd4b178dee2249a17859554f823fd7c7cea056633167aec74e66a5b7f7b768db2a3b0cfb96691d00959750a30dea6f036a585e51fc36a7c02b75cd25ec05b8719169f17d5581a5c436088da3a946abeb677048f0621a237d5e2f0be2c06abe50db79ffc3494cb0b6b4ece20000cd5ed834196e0fac0dfbec9c8e3aaea060b7d27aba4576dd90d639be7a2026340eca252a0f40b1717d03c358e47cb33252eef01b23e0088fa274e992e714e40a257512278bda8b0d5532cacb22b4de5dd8c9d85019a57cf102245f9c50572aadecd436dc2d17879d22617b18a4a05db250b8ca2b903bbf9632bd68a36c302dbc9ea0cd7309f40998a00c1562f74f12ae8a99fcadd639552cd3b6b30f5e20e806ebcc25edfa0162a0bb0cacae98ffbfb6d062e5e9e9d14593df0eb59a48d6a5b3a9b2a714410395825e13ed9a42f3319658a042a58301340a0b47c3d6d0a80c1e0037e04b3c8af0f89797b9944c03e737dcaf8c18ff3656824208021bae25b512c3da6d7e025d1378acbe73e8af84a6ad6dfeb475263fd6406df44903fd669693780c287e1bf5ea5fa229bf8a781e29d1014c09445b999512e0e083a278150533d9047416e05522ab47543d0b78ad9355276b53ad318cadfc58f818459b526254c0e8d6f9b12875fc19b02e1acec997c73a4c0280de9ba509c641787cc5c5521c324b6ae0ba0957132225188522e54bac9c5d5ca10c61475333f5acfb6835d4acdc4976a7c2dfb9be39e1d7d5dc15f18855138e42a6ea9627c921153992a3d85d9db11d91bb0d347058864c8c1f3a74083cbfa4eabbf6509b85685cc2f7f2546c9f57ff8c49e898865e60860aa175f789dcd2bb7546e2df202e1097cfda391d1ecdcb9cdf2e387b7adf49a5332508bc6c141e3403fa3bd2d0bb9cb7928e78ae8908a35c7f54b851cd976410865a6228f2ce81cec7b1b0538319f43b05ff8e1f50c0f8b652055110986b73c6002fff07146856bba646877475a8bd74a0a6006939d572d72275b5b8b33d95aa24cbbb737afa93123b3ee8f879c24619d4f7472ac811e09ca9c6ce319d6271af8669c498a32248e79213d7de615cc3b4720812a6553b2995b0c7b9d64dbff9caf6847f03f045bc8822cd35967ede46cbd2fc42a97b20d7c04e421d8e31d88b0d9846e6e041bafafded72a1b37b3a77caeeb28e709e10b37cd43d891e20cb6ef91415f0ddb2f31425359103105b323835c8298cbb451cf5c9f3a1e89f4af81363da12648debda88cf9620a2384344fb22673c914c97090db24438de6a34ee1df1247665dbf2d5df86fd802d80027be4378a723bdab34209e161c807e441e5297d678311f48935b7fa3200b9e5f063f58274a1be0a46235fa07a027ca13a86d7fd19d5e74e0e2fe73f460150dbfaf9dfc33e86b5236c049cc98e7d5f183384b5fae31bf0ea3980dadbfd6ce6bda285aadb2a60d11c205c3aee914840da6045e09ec6f72761e0973b889e48eb492a71b76ad126bed5077abc023855191276d3f5c276da0a1bf96a3b9c7bd1d49a8c06d6a670f3cf71f8e08bba42422665a796b4d4ff0cdeb673f9bfbcdb53bf4c5649202b9a475f747da515ca4750d72e99dd4188a0d5c15e16111cc76aac06b7792d95051a0d59a32584cc33db7103878ae1130b03eb1eb9effeab05a34e47e7ab268c115b5d93252ad40221bb23a0e63778caa4b9c2939c674558725480f01629a45873b2cc5f2fa2e40536d71de5b9ca161dbbf1f4775a402bc3ac77ecba7c79b095553211e6fefb392fa8e979bdbcea5422cdff8ee0fcb09a2693c4427900b24857b16af2b7def45398239c0ccaea76ffff02456b04a73abe742b85c045bf0cd6930ed796b9c1692855c04c15e520853a956a0c1d54708097c761bb100b9496489d22ebb05128350fb6645e4a3723ce21652b333b78e0535521731237ee8e977e9994b73efd43caf403d48b5b224e5d4b85aa25e6a8b27945354963ec2975e77cdcc561116be02cfb5106c3c328bba4bcf9088562a37e9e854227684b28ce56ee8a4f320e9af6b2c18e3dd38c9c351a9635634d91e5052301a6a3a2b84732449ae7f7c4120bf5a028832260b586b75cb9ce17c255bf936082e42da6e4e3703e754433f40dfdb02a6f6eff993ac99f3b1cbc256c8cbab472ef060ac06a277237e443ffd00d8913542b7fd4263d1784e63b175652427acc1d3eae9d8a5ce87831c00bca68088bf8d71c404b5f71eb10b1846b6b49e8c4566012cf5adfea379259e456f018b248f34c1a76f5bbf3d3273f9754d62c75ca01cd22a4c859e81270e6e9b15896bc83d479674c4f5d217c80177e37fd7b0b8d81f8621b998492b92dcc55e661cca46d7b6bd447007fc8ad837e31518c1c71f2a805730f8564abef0bd8decbdfee530172fcbe16af97ef3bec7297229116b233c7efb38c4550c6dff1437a2e72e6452b0ad7a996385c3a7f2add265cf43f456ba34a7a21751f277ea77750b8596ff426ae438f4e688820fa4a2361d51bcb546ba374ea0f7a9b80f1eb4f0da85fca23cb7d1822b260e0c8043e31cd8a023e5f2cdcebaff0a75a4355d67f7448ce3f9bfea5b481b8a047c3e0605b06987ffbda8043712be32a3950cb41eeacbbfd74f3bbe1e231025636fa38472bc611957784fe0dc799da4c632d59d9b76356c8828221f63d4d29d76285d6706ad82a94a52f09054ec66101c53c7efced2095f55b2a1b9ff51af8a8ed16f20b7d44e6862fbfd9da0afb61d58e4dd8ec9d3cf8a242ff5125761ca06840029088a0e41c6366564eff5db3c1589363b5d366daaa19c087a8eb8351b7abf6e1a30733a10ce4a3bd22e7e0fe8d74707f622b09598038bf6c9a63e5869da25adddd938d9e4aa60599984ced983f73ec91eda50afc0fb3994ec3b5d8b87f00ac427ef9bb29b81f6be21fe45c8250ff92d8e01d450956be0a21759b5305dfcca972fe9875050342e4f90524905b9c52bebe3b0d99a81ffb4dc721f15e8202933c1a8a9ecbedc86ad760df475140997d65b92014add158bf9f566ea99558294cc0a564ad9981e2160c03ddccc9a403e6193352c84967d44a666b51a19bdbf488587829f44698264e92563db760dd1e82ad8ad82d5a03dffac136e915b67f75b34cd3ad02c34dd576dfb8a0e08967eb1662ea0e482fff474f4f923eba4f09922c23ad78e18dc6dc5e1117d0f96cbf4d22a441f3ef52d137c21b3d5ce01ca1cb654930c36ef42fbe111d66da8e6bbd8dcf6e381ab2efbb78c8679497a0026722b93a17fefcc98a1e99011b83a16609b363631c34e702ed8dcb20463357dde44143e8742d443c77c2ff7a62e9c49c217abfc935fc9b505bd29e0aa84066be0ad2a734cb81ed6a10558b6aa48740eb0bc9aefe5da1230f0a133dbbf5028d40f0ca7128075d846e052aa92a2622df7e4fd0358c0a5ec09e8f9e0b09430441d3d91b9591017ea2d8ff1c3b809588fb3459fde93dcc6935903836c1143ac61d84ab14465b88555ffed6c82fa74ec97dfcb92d6add40e7b002f3f6d9d68102084b482e6d3ed0fbdc4016858046142340df7f41fa8452d031a7522ff1840931f48d69d732edaebff6e7694fc478158457fdca8ba01c38b0001e5a05c7b84fdc7febc3aa7620a624202ed296622184befafbbe00f044406239e980be8557a228378588470edf4094e251cb0c62bdc2ce4595d6f437c625900dd096d45fc88cfe7ebf328506ec62120d1eb694e49aa983bf92786c03a7292bd9b61431e79f14628d0e3980a6ede583f470f829cf48a20f67234bf9c4e278863ec3a5ff1571d91a04deaa6f8749df5abb83a4b93cb2eec3fcc1bbb51f43b1b101decc261c23bf6de2ea25d4d82e68b53546668c797d8f446afbe506c5a36e3175bb2b21e7f291e2b6b1afcbf14c26731b9b691aef889ecb81ed42cbeaae674ef6cc43f9766bb191c097a47e9204e5a80bf2d7fb1178488abbe54a0addbc5d15394d402af3ceb3beba5a7d3b41ffc4dbf56c572ebacf8bed43bba07b256e132962d7295026276b1ae20798a35bb9979d1340fa0196abd69558128858589972b20f5e15d3accfa99fd89696a5aae61baf0184bf2b6494ed6a1e3d5ff22250403c90742e0a0d4405576b005f45f2a24991346e36c19d73a268688eae63f8955b48611df27a152c9cedc89a93b6e8c903b126a50800db00a4c9605193a3d1cd5114a8c09dce761632bd90ba5467148c964889a8d8c0bf0c0854d7905c09f96702fc7fb8dbd8d0fef411221e3baf15a716cd45ed58ff1c629cfe1e9b1cfd98f5ebca97a52ead5367719e667e7ffc79793acc73ee76e158d3f675fdc35c152e169f5f983426b572dcd9d32356969a95fbcfa5de3956afda64f799fd1337a91c8e2e3b068a38adf2272a05909b1ec40770814b15b9fe5241b0e71dbb7a48630d2d061952d7f50bb414ed9724dbcc1147d741fda553f6adb55a1fe6103ff82f8530f1dd629f806559a22a898e0b31a3f8fdbd93501ff49d8428f5d21b19a3a561d5583b7b03fcef76687dcf341c0817fc1aca0774736eeffd414e4ce0c978ef3e5cdd01a62752f652f4ffd434de30f17cb7ec35eed966c9d67bcb90facc9fbe6cde978c79fa4de8ceb5fbc11989a07fdf134b0e2b0f186755e16653108a87be87b67253a077868827e502162bd6d80e7fb747c01b5cc21396de26df047e5b8288243c6443e5be5cb81c1df882eff9eecd09db87fb874ee1462cdecdf3ff50d1fb4a75e909bd0e8be102144f9447241981803183daeeccfc3c39166a7f3139b7236dad20ae01e2ba618c42b5575797d701ec1f8579ffb9f8f81552d34640cce57a3e5ef1d457a09ab38105b9d2ceee862a56a7f20fd2b794b15f0b49872124e14d1257e11a9be8527c6b824fd9916a219bba0d2443388baeab10abc54e3e9110d98e586dd47ba02294a9a67c2c4b4e36a71e9dbd12ae4725ebe4bdfa2d08c252c26396435dd3a7a851200106bb79b0bcd7a0f7d76391193cedb7180f3fa3b64e936b8b292b1e28444d230710e0b3b79d33864c686d5e309c5568dfe4336703e5f58b7ec19a85a8029ac5be6aab23b520ee252987105aa0d86046261846f9c0e4d8cb4742f81f665c2f0dca85bbd109a20d4aba2369317db5b01aedccac1e8aff4bfaf57d33e6583bad4aab0d8cb45a72a5ef3c00fcf7106c805411fb0e4babfe2969d859bb1578ca79f0a5c4a48ba3abe1dec8db097ae868888d9cf047823f0933560eca0a738d1fb669e82e7dc3d5013fa44aaf588fcd418fa07d7d3151ad51d928de9e7c4cec997efbb3014216001d0f1c53aca3f847028d4f37d93ab6e966cb0afc87c2cd2d127c09fbe0b320e9c54c6fbe813172a4460792188f0a899555a20b0419140be450a2cc15cbe4163122dffb5964aa01c6bb3604f4cb9cab99b5a46baf8670fcd650d843861703cbcb328dee9ec69889815a09202020cae928af2a6cd75572d4e8e12afc698d440565aeb3f5812da2fcfd28a63038d7e495bd76c203ad07637b67087dbab616c2082145f7ee48c3c7ff092a9d733360e64591aa923f6d1f3235cc275697a1e18eee49236223b739e1ffd688de03bc9824b6c4bb4fd2fa1211c852b4d7c995d51c6c49788c009fd8cfc4981c054add2a4dae2af1081262c6c08dd843b88d84f7587ba8a0684c6dc29bd68d88c451943e2518070befcf0024ac5a11a554e4ed83bb8cb033c592c15667bd3d74339c65b70c6ae64de1ef2a04fcfff992ea5b6bc78368e5665e8eb387057f981ebd84bc90c85d0ce5c43c785f2b1cf2727e754353a0a723a94537c3ab5fae89953b688623661ef27b0cc8d4f2f1559dcef68e5ba1910cbdc3e5abde77c9cd4f10273f41d2193cb9360ce48e51a883456699a40d6894e8d482bf737dc097ae04dc2073de3a6eeec2a63b27d939c8ee7f6600ca00f267231ee980f10d8e5f6c4eae5fcedbb65ae11bb89606078a3081f172a211bc3d5ce6e55f20a5d6e1b5aaff320dd30828e599f507c32e366534be6ca5dac74642eeb3487a7c58691f6f0bce3a27583701edb40d7c6c4226806ecff26d1bcfbd499b735c2349c80e9c39a0898d64de1bd71648356f436f8bceb59f71a3fedeb350fd6118c67a8571aff432e10c4a0e6444c60db82e674eab6cdf13273ad6b379e67d3e29c2bc4b09b151d02fb68fc1188cc56417525956ec0978da3243d783c08b70d6bcce330287f9845286b15e062ffb84703e5eb8ffd6ee9e22fda08acedc7de4da7431c528766e0f1ee942d619e9cd5ddbcd407bf00e5be3b003753032857acd4f21a4388d266734a5e529491f9e22e5351c3bda0c9dfc31ed77e630e29854d1870a54e3e799b55524c736e230df74257ac22ebf33abdbde834b384f3392df55c8b9502ab193463b740ffcbdf6ab2e88f10cb09166dd084422e489540a5e84d28c4bb3bc4eb844229459cf9332802d6dde5e72d8abfb6b8e74346200600c708cc73d275ca70007c5b2d19e5800dddf9698d42dee1afccc2526677784affe767088e0e9af633111d66d248c70ac8f0e8704d9b5cebb1b6e865b0f7c4f966d2be989342d21ea595ba64f7a97cdfd88cc06d6042cad232e8638f34f74ac95fe11655c1b083164582400e37377f105b1a3e904a2eccadc20dfafb916d086246f97b52b7693736f9a5af215d4801dacf6fe7f66428dd038c2d285b32387fe62a0571fd2ccacc15f47e37d328e7b32d453825eb99461ec5cf85cbf20e97a22d56b21bd560a98725440061f8e7bfd39d7b3661e907c41e951314285bd8322d848be0ed80dc611eed7619c4e0f20004397f87ebb560449b710c096d78a4268a2d1dd64709849107e5d85511b8824a1ed6a53fba26cea8aebb9f24e26f7ed8fa3cf591418c6f9e6474f3aa5a7d0a3c5d62941ded7bab8d77d6b45fafa2147d97f3ec9a3e135712afdbeb6b80acf30e64e1f60affb4befd1a02e8723f7a72b3c4581059dd02abad76eaee269082852ea3721b9c12dcebd20b533123aa98e07e45e4b130c90a19f8ae1bb27f37e799d392d7301896a1b062f1e92d4f89d2f197b239b688040ed5893cdb851beaddf86c3c43dd92557eb1451c9c82b4801a9f16af81fb9b0ea1a39c4f59176c79da7b7e31fef253a6bf71360348604002577b01f188371218862a6fadb94b651560ab21557edc4aca92900d32e79a9d5eec2149dd61a6f54d6a5e319a16d436213b86b79af74921aa8868f4425d65036edc0e229d18d0a49664acae99554ada13be47818be45d770200b0d586ee9bcfc62af4debcd9b873e0cd7137c4b491c690d48dc69223508f1547560c7ba8fff6b83d1dde42cb614c15eb706c95a58d39b66573d685a7284aca5e58c210b9145083ef70206878b7398dc2bcca52d372317a881bbef2145a683aa260339e7cff032af8bfa1c004e0de128e390c8c539fe18a27faac4d5e62f949c708af2610d7e1b8cbca8359633580fd25c0651997b1420f45ddece6e86bf9f48a54ceff6ded9097db41630de4ce9cc6bac4cb61a66a47369913b5c40b3dfdcefbe7bed04395a200d0a9db05e5af5047118693f2891c2ccb62a61c00dc3799e584defec1c8e526458d8515cc5718d239ebc6b8297a78d8c36f6255e02e0f114bc08b2ca5cab7bea82a877baf2f03ad0c08aa67d2adf014c2a65a9e51b88d167c54710add4c3be23551a6b0598662d4d75b374bcd39a23d1b9999bbd62674a788417347b996e65d9981e636121b9430f0c9393a1fa83e02c8d3686796078e9a193800fd8c0948771b51739655d873e7679135a896c31adced466ca56f2207dbe9d062d08fbe0eded200e963b273057b99bad4b1d14804dc8db426e9409ad9e656358cbe38c2544113477d7c8367ab105a95f3a62f82ae9a24b2e7c2122e7f252905f6ac276309043fdcb46ed2c39729dfed7d0d25a146402ecec9b2efd3da5bcde58e007d8bb5807d1743e97428d248d1fa9ab5320d5c912cfb2669d491a4e27a9666b2d7026116bb32c352944b4f8a4c359fd4ca2b7a52f4f2f64cf80ff5e7e9a56b1255b790abd37863d1cb50f6548f48407a44f065252858b174ba8970a0b49f549651876e061cd51fb252e4971c95660769a1da0de59d0155a6598a616942237350503f55d0452cbd4831b76fe6cb6111efc42d8046f0de1bead925736da1f63015473facd0fa772078a82bfe38b7d13182585f6d5a0b4eae457b5af534b9f1a2e54825829664d4f5029092f330235db72572911a3189266f3faa8a623b17ecfea2efdd549444833905349dcc63e244380a377b030d0b4f81d333feaf26fd6810d362dd0fd0bd972239b420934b9a9c586599a6e633e0d68b040137de0cb3d295325171feb5b90fd73ba26b4d0fdb61b115e482606623dad72ca55db486470686d4403e6e3d3f6d1adb011f5d6d3da6cc434e2e525e96a8da4b87ef0fa9d86e74a806fcaf3492c5d82d3505b7b7f51af0edbaaf668ad9509aff7f110a095b2f84d58d1e6bb71af067751facae9debf89bb2afc09ab653bd77259d77ca020f97af9379f04513bfd3fbfbce64efa43dfd12aa8ef644b7cf840efedfcbb432a4b8bba71b58910aed6b11d96293530942fb5320eb991546950e7ebe9beafa78ee8a8cdfc82fb688785ff5363df4926482082ec7d50645a970a956f881ab1a1e174c8fdd6a933f31f68939bf826b3b9edb86f4f233cba48078b8c2af19d2d2902612b2f31d9d75ec85e50fccff1efe8dca7c82d30c8970a88f00b90849f288ce897b7e876d48beb5d0f6bfd0c450a9797e8ef8a0c928a15137bbe0dafb1d6c66915badb635fcccb24ca167997820019a3ce445da897f6debac8b92a95520a272abde53329fc1a7fa290e3819d4df16a8507766f884910cc111c234e7d5a8e23697f1e5e4c6715a4fe54ddddf413c54f833fea8b5c02e46d09018460ce9e622280197df7bc7f2760af1a5267a1a8d0566a331da7d286a870e9c32a25962b8c1320b81b5dba98829b155c0f1fa7e271651298f873c800a228d0b178e8fff456984eced3b8dfa72e04b26621a4ee81dac7f2a29e9e5a4b4d0b75a85c8251e52a54a9cdf324017b7af309d1f1fc8dcf72ed13b849d327f4681489e08f3d997e6998a60a9c170c8dc275a8310e79fe28d4286ab00d0dc612f40aa5f5a0684c669a87e116e162d31040c3eb095a48c002681577590ec5ef6f7bdd0e5d6dd6cadd1e8d19f1f106c7850a6a8b24e6e4c57f0beff23413e4e6e9806ba0e9a51e4084214b45ffba53b6b632486c281f81025378e47ea69b63760a16ecb93844908ce3a749c404decab522dd04edbd8570760b1c8f1f2e038bc0903a1905df8230b2df7d0f9413bfa9c1ca9f9469f6ad306d14568695f7ec5eb2b06d1b921a53aaf141be9ccf89d5fd00fbc6674ae911a8f4c3d34f2fb5131bffc57d8c1aed201bcb2253f38415bef8987531c3f27d117893dd75cd089c4380ee0a6eb24fe5abd792e26964121f6d1ac46b26fac7cdac90e0afac21c77f9ae6691d6f662bdc5621109ce27c3520c4277eda2a0d13d7ad71da31560dd3c3365513889b530895f4aff9415f53acc8c5cdc5e8318a3cf552cc4a15de8a1dffb6d7cf70c399869d6e41c397999496d4af23c36212f8b5082f85679c98105b1d4ed5f4b87125f8581f76c39f137707378c3050ce93a7aa7265b66a2e83b36a767f680622b446eb468475ac71c8d43fb3a30d1513faeaffa98ccdd7f0245231dccf2fbf06b047fb174782b1436e03842d2e831f8eb806f940c5f4914a5bfa55b8b5a367a679f0d4da29c6ca331a7c8d7f2856c897c712871d6af2cca44b7c95132ec812aa267498566ab037d183313070f10b6a099ccb95e1df25d7a78f37852c6a084c4fb07caefc70e796c5fae631b62e2c81852694969680286986cd9a30a1215df8240daf7afaa6d1fd29d82de85323a9126e89c958214bf864fe096d7dc6025e5b40375f651650211d78b87562fa32bbd302a7aa5a076142774c7cb627692483fad765a30ae0eaaba7db1198bd4be96591b4010f8f99e988d726792f1d1aabd983e9945fc547be03b454d9ffe1700e7e81e340d48c281a2b377c1c261fe07d385d8bb4ee7e84df400313f4743f123d103c7d4baec2098584b2f81357b1e651344c13646b024360534f71ff803bb115e3233e606ead1ad83803a1b7aed517230015387416be73c66c4c40bce62620fe9f796e837f887e6039c53a6eea64b98c7cc18674a575b095546422b0163708cca840995d8facd80e1064b6ca3c9a931635e6f94b899e79e9833ff325382bc6572866cac5e9f24eac0e8de9f3ed139b6a738d838890a06e1f4f14836fa751e899b67bd903be65f284980819c9279cdd6827c09f05a0df8e5919b0f22a0da7b4cea783317ad6f10e30a555804e586fd1a58a2dd8f867af302a690d0ed070218d9a4cf2e996b809baaa2a0cb56874424e488e4f4cb518c5a89dc4b80bfa780e3b13bfc6a95350db12cb3c2cc80ce03759a2c0be69228cf9a89f2bf5134eb3feb21d82b1552ac221270b20412d5344fb9d14ef90948f801c61fb30324e2c8ea4f1cea26e42b67ffe1fe5910358fa851395e03fb8c09a7756ebf9edc6bcf1be60bf20478b5975015af49d5790f36074c3d38e826e8ddff3d554333b3230c2eb123ad1195f4a89f29b53fd817a646166304e79d5d8ab9114d2e9fc06707174c3708d5c5832576d375c73479a3e14dea199e003c09c02740161b6ceeaab7be1dce0d5304a45f9f290146e5d4b9515324258fac723dc48b50695dbab33b3cc5e264691c0a136dbe25df2f37671401658d7563a1c19a5f128c92a5aa228d1d4bd12b033db3424086e8273330b9ae44a356927be6b41ecf24d76492eb3325b078f7d27cd3d514513a5dfa22de4c2d0d7bc52499c82a4c4f0e73fe2de29e0316303b4f821aad02193bbba35bfc5d251aaede7bdb3db0661aa4d3eaac02c61541fe8d6e410d26753885e9396dbf667ad08137d0565ab724600d38e0f086482ab472e5df60a1fdd2e4702b1e681b7f1300d5de307c44a651a6a6eded408be0833c04e535c1b24adeeedfaad26138256f736b99361d054b0f6d4a4d5a759887799c3f197252eb035e56227012ca9328afdb3555b93de560284e19471227b7aa0ca846e9c82ac0cb032d8d5cc365e2be80afdd3a97c3b8b49d873f61f884c76946d88c22b09a5133aa89dc60528d0d90b8a40ba85af90eff98efd9f54459c13411392db2b052bc4a8efc146c0ef087bc09184463dfc14fc7bc4d1b3021661d538e2b85c7ea18e7a63c369ea9030ad9934a8ed022961a249485bcfd1596177597f54b8536ec78ef55c20da76baa8fc4b5fe79e0e2af73ea0a24426470884482b13ad0a5c76a093ed6c0978d7fb5e94c5673b43bac3029b8345bd7178fe92c3838c0b99dd6440ce6b265c71cfa2f54aa8e8e5174bddaa083c5d430fc8d76ae6b25988cf283124c557b30d350ad8628a56a1977ae203f6245ac4cef328edd07241608afa0714fd6a4dc68820308647180dd3cfffb4b7ee0b5ec7bb89c204030761c1b9273a9b43b35111246f2a3494418bac41c5d003bdf1f6ed2f45d52669e58eb3b0705ac59de50c3071d867e6e77fbebd40ff3b2e63c002b590b23aee545fcaf8ad21b0fb8a3bf34f92fd3191305aa6b8fb7f45a371b347245d146e6bb0a0779a71f88a258d97e1f1a0fde23e537fe6f96ea91eaaef2a30e7e8d252c8d2090b013299884f5c9752d81ba5dd9eb4b7b9299cd6bf0cfe3769314ffa291fb90ea07e53630a9dea2f5f38b53c9819bd659dddbeceec7e2a9e029e6bf22b6b16897c56fa138a042d1dd3e2a723e5461b653d77e3da39a58e4fbd46e0626050ab2565978a294e5d217d9e1bd18675a7802628d6814b070062e5a24774f01bbfc0323c24d6ae59b56728f06fb3d093947218697d9515321e88683e834f6b539c04bca72a264922ae00207915c59dee8ce1168e82699c6bf41b6219083cc06b0076c93c56a4518b880eb873a261af5908f6504541345c45a9f00d9d1280ec95f37836ea2c73264b540a80f60d01dc06faa8fa27962acd00023b9072bd4721f155a5631f1a146e2ba94fd30939a172889eb140eff1276e19872e7f25b1274855827d5fb574887c1bea6f522f33033766b53922c7817d74ee51bb12a41fbb44f6065abf04d2375103484ce2c8ed6507c2e57a2641baf061a92e523fa81d882cf21c6338c3f66207906acb6d5ca57409f9547c7cee03150298c82967670f5eb5c46f6f071fe967f99131f657de49db4beb248399a0449372f29b5e167a824274acde82ca46d550018d6355e50611eb1c52b06c031c267993fa1c71dde4e1920888af34052ec239756fe535f54b548852c3fbeddd34f7754bde4f746046041baf031f13f5b981b44adfd5adc592c1db0dc780953acd58eb329c6da6435a9da201260509edda12698dc86fd4492c99dd1c15340d49e0282cc6883a419b5f98b8f16298d369c02720fdf6b9895432d1c8c47d3b0ff33000bceafdb10c81cc8de415cf2ad971132643949975fbf4a6cdfeb9e3ded090a49e4124ecd6b9e28e5695517d3ad80f7f8f151035cb59b337406c9597b9549b9926887add70aace7f2318d5eb35d0a5f345ae5214a9d3c75ea446163c23c02ebe7fb8437f57303fcde7193b8f7758919190342b267444c5465c205707f6946de1bf99b1fb37e6a6fd2eb54329369c8ddd425ec1144fb9a6e20833d8fc1b3bb7c78114bd57a2bfca86c452ede793c4b90079c2b7c53cf3bb79ce9723a621d12e60c93efbe01fb6a2649574ec08799807c573d0665c2cf708476010e8a16940f05789aace1c660f545e4dd44ded8745783894a521c04182fde5215d1b98f00611499b7c803a4824afecdbc7374fb7c569e710a7ba209ccb6692b803174e899aec83ff864bdc4db8821f513a17580341afcc3801d5a662d58ef218061597fdf086e7ff88f22a061f9777a155b582754d76ebb4e3eb51010b7b3359645703650548f08e08ca018d2889f9e66fda219cf61789ca26b7b7697e0b1f3600edd34b25f98980bd237538197b7d5dddf2ec09b81d5dd059a2bd4dc66e26454c2ed84c7f31e8f4f7db2a0dcd2a39254d7a369a8e52d0ea5dba1ea982522cd1a893216c46241d1b205ad4a6c61fcc0a2b098f331833a6ff41250ebec90a232a7ab928dba8e27fda88dd3bbbfdefe6a2457064d1dcaff9fd6445196739aef30c12ffd552c765affa6b7151d0d3d83b0422befa8c0f90e014c227c1856e4dcbff81d1f0d1a1d9bd2d344bfe214fb7c275700ccb07ae176c838e21960928a679b9b6aabc53cebf1b34ef3d940057b7227850600f2092d394895aa14a950099089f41557db050a84cb86d92fb5c5834b019237338317139a53b55497f5822c1043e4eb04970264bbfd267c18d0c00f6ac32ae1c00d83308d61a840929607f5a1950cd3a195c073cf0d68fbf90010ff6321be067f87febefe036356810d43dff2fab0bc64d8841896ab81f62fadf21ea1e5a2101ffa9e2ddef3fe811abe0595a4e695261719fe17dafe25aa71f5b3cdc478762f787b9afa3cd20933abed0fce71ed63ecb0a7ac758d438f3c806357b7ec9523429e6eabcfa70928a14e70beca5284060eff01c3281cf4a0843ac78ebb524dbf478aff9acd971498e06af2f44b897b6e79eea378187ae4c7b1484de074a04882a6e44d43b06a75bd7f3af071983414bf49008bc424ffc4faa618d094bbeae8abe157ba5c7226ebedefd1560b8bd5ac4f4f6121930effe058340816a8bd4598b05d25897e9913c546a2dd0ab549e65e8dcc22add090656c08376582ec02302908e980b21599adb2e89ae14200e12c5ce57cadd2cf957ee1d99fff50723b48a0fce6fc722ebd7c13624aaa974fd159a9bad85d2673b20f7acb8d5b852661adc4b466b1ff1151d1aebdcf5f165222c6b7336e0915500f4f09ffed623be311f2aa6b4185b166714b72ac659b12c514e8b4a523d7048162b4bd16deca8d065dc1141dc8c0e5399aca04a946f817de2b9802434374a081bc7c9b40b91953bce613c216e4e73608033ef93e176c99c43e1c876b95b7e9d98fefad3235de3f24e475389ba4cf44575b06a31a959e11e7003b4a09e8d2b134da54113baee834fde8a25169ab784b6016af83eb62fe3f57e230e7d9c55bf5c2b3c6e830662daf511122eab6eca641a1256df9d864649e3d5df6fddb0036e8ddd98ab16c0c23c5b1a1ba628839d93cb1167cd82d2de8ec8e0d5d978cfc33fda2300a4f0ef797c3c8bab8a61a3af6a20574336143a7e1a5d89ce0c413307b0269235fd113742bea3696700e6765a0e0c20fc30e4e6c24eef9c6b8e4b7b6cacdec06a57cc1d7ddbb9d974a84859e25a8a103a610329fcecab882fccfa3f0c61cbc26a6a0562c3065814abd2cb1eaad503cf3be046983bf012bd7cc2c8ea7a2ebf0edf6c17fbac8cab7419f178bf5e8380290e9194c3ff9318fb368dffad86c58f2b1e63a78bb6df06f7884ff975d079325e0b72cdf502ed87c2193c05e801090ea0f18a10590bf8143858cc2de5541d3430cce18e26deb1f5fe1ffee7d424375ba7addba197f4f703458c5b1bfae7d8278fee1a077ebd6667f1da6ec22f14da1ff37b658b7ce4865609ce6094419ce2e1596adbaac5b4fd5d7011d7b7cefe6015e71522bc26fabcb76c0ca1264d0fe3df2d477f192c3a5c25eebe24ab17816ffb78e8af0a505d6a7bf5919e95331b383c5da3ef168d48b21459dd73742c3be98745ca15df1e7fd8be3705970f6f2266b90a9a9e065fe4254f6e463cfbeeeae227400e55abfe64e55b6ca0d2108d48664fef02a28098cba08fc20a99bc793a187adf47d449a5b8da3a220bc3dc8f88acfdc18374c15e82a03638fbb9848af21ace8bf5486fd8d70861ec2d91330363faf411ab6b50d159497af6540a1a36795a1299b04e3c2818cbcf77213442b5f9ab95bf6ea881041fe76766c44ccac9c3c6b052e6d20a24afe979d1f188dafd362087e7ac21945a3091485c35af34e6825b7f1b934da62eed45daafae4e960b917e645b74bd1f3f0c7decd9b6a7758e66e1d882b63d3864ceb7038b680395b3194cc3b138971c21463e076f891871ca15f7ee4527c0908bb6195281f87c36178b062bf72e58beba8343a041596624ab76b41023cc014816988c841f2b634edbfe5ca545b5c0a8d0b2243e65ef855f8e02e73ee7e9e137832f6cc07f3ae72dedb969bff0a57c865e2950780af6ebc4296f1bcf3b7b80b452686d1dfce5748199767faa9e1cd22f16a269d42212a987317545142c3472532a8d754aca985c280f6a5788106776991c81ddde7f9846588a57e024da9c76d17d72acc30f59e912720d5428ea864c89a7653a6a33e0d88ce7cbbcfd483fcf2e6aa7366ea256a63ed13e82e0ae8152141942b9e2360d1dbbb37dc8903ea63c27e5c304ebaa20e063f373c8bee419b70ebdae4effa8823c73c38bc35e9ad41af0bd2533079c644177898fde4add14a9740b1ced0c101888228a8cc74a2cf5ccf0ab91501cbe79da63fe1eb8b5fc9fa2a39fbea2768bb4b88dc7b4b99520a0c08c707b7074f5ec4e87863458c8b90270f9d1ef37112c103142d70b139865b903084086eb139722cf4b9050e4d3117c229433c288b2de6020e1e9a2c89d19fe39096c55c6014c4684b0a4dbf7744cb50cc859c31616099433a886928e6024c861d144f4289165ddc622128d27148bf30025dcc855924c66ea314c1af511cb20b94aed8c5e6183211f3b1af0b4ea4dda53ca55d62964566c00070014c7f950e5a8304960c614521df4869e101f3fbeb651b81118270dd00169d741dcf2ffed0db51d4fbc3afe7f53a5d50fc768ba7cbab60f18bbf0057dcddf90b70c5b6bb3b0f6100b2f09c32be04932c9261b445068009db93bed724497a3446ce39dd65487ef99324d36c12f24dabb83573c571e67ed78058e2c0b623cd1e7c021145268a76229f4008892574e9d2ee347bf029e6c914611fb92b2799db9dc479390b921e7876572cd05bc32f56a94ce82adab85c7f15fb887e390b9227f6ce2e21df1c95bc74d963cfc3b9fc5eabf42af567fa5d73a0e5a6c82afbcc6005ac882bb81451e3d6d6501d562c0e52e6563145891388944b20c2d62e229c4164f919ac41a506951a546a50a941a506951a5474603a37a438b5083dd8596fce78b0b33edb8742fe64884eae662e6719e3091e32f09865796ae27994292d11a4026d37d00b54189492122ef0ac308102d28b029d75dcc549182b71c94dbc8bb203988b627445d2f54f4156e372ee87312e7839f703184f84f683f57876e6f3dec65b500023967f1686b1332ee77ec0e2a675390b089cc82813d773fdd58673cbc4b9a50e8e195b83bb3881704b06436fc96282849a49110bee5c81945c0f37a19c0f58889c7250c2202141cec88a915b4e0448b4dc085a90fb81caedd95e1111540525463409420645298623a8406a02871c6e6802450c65440aacc85091d62bfa8e386f4e2cc91029754b455d773737c063fed51ed335bfbe2eace337d20ca9f551ad2175c847244684355d93b664f06b7a317ecd0608d9669a4678b46331d55f478d3ba6abeca75beb37ce2f75a4f99e486ccaa6ab7e6aa4f95a3d825cf589c46602a84d51eaafcf43c94f577d29ee9faaef5f5b343e50ef8fa2f95a3027ebf74cd70742d8af3f65b3fe9cd5f75d7d7ff266d3557d17f36aed7408849de5a797b38411d34ed42c6660518b86785fad161083224d3c0102dd0c359d305c4e00430abe1459129b73ce3951484c2cb9f373cc39278da62e6202f384689d29f75a6ba5f3f331f55f6a7e3c53616a2cfba6649807f533a38c2a858b6a95f4837837f55feaafdf2c36f5f4c3d43845275b14ff7bf1a346acf8f341ef7f661dc5ff46be2208ce4ffc298262abc73d2af6f77defdf47a97fdee3f58b3027515642bed1e969c19ca441a82ff231544b8a7f7feec9d2e5dc13a45b9270fbede5dc1311dcd0555fae28e8b2fa89187faed5fbd902ff67fe781dfdd9bff98deff5e8c0b07c3fd96f5937847cc33ebf29fda982044e8a40718361894810424061cb3d012505344c3aa74fa73c10b1a39452fad3137f784b0527bdff4ba3c996f57a2084c0c816445fc81084939817c653172f2890dd10460962debff7a4f775f2a8e02eaf0b3b73b33cd0f3bc67afb91d72d7f372bdaf717707e2a4f73f5ec208ac7f7b5e77bd021ed9e1764b180c9683cbb91d9ca492ec2003a8646fb258b23649883758d61499176c069773b51c5245d8d5e55cad488864c330324b7051bf5895153336587105a918581413a818585412a8c456a4f0488823ec7739e764cacc072c7839e7c4a88793da5754adb563ada25d2d29b151fa234404e0c890cd91284900a00bc0911d90d49810060d00479080804656337baaa1031894686650e8c041905107b32a38b09838983dd161831d3228b166488634d821c36d6004cc0d193069e0469880b212d3343350e9a84c1675396724e996b02936ccb8ad8ce460838c1d4772342accc8111a6cb555b44a33c2cc3003868c0a7bc14ca6da2a5a31365bc4c988ca8418d0668ab0c00671662403ab4bec888156e48824eeee636a758c912d819009639e6a85ed706b7dd157f559b5de5a6bad6198dcc54d7567c33cb98bc5c8dcc54ee68ad068d861243786861d300cd52e66f05e48daf1c21258613a1c68b555b44f5d4c7872faac126dee98792658e23b8acc682d5ab2e303b23a24544d188366c55aab65551c2ca73281b5b99c6586da8c0e332449e1ac8d81e7c576704548a4e50449ac504902840e7675394b9210cc14254922f660bdcb5992ccbe2a561403fe60c32eea08ac88c5934571e1c1d6cb5984b61c215425254b85111a816a0cabc1e52c424cbe98610b2118c0279bba9c05c9130d09189bcb59966cf960308353b0d6c1bec9349b76a856f38b644ab59d4c730968ba50cfba614320c04dd568b1cfd7404b4c5b6e73d91d00a582930dab71fb09d013c2edfe6959214f8dbbfa7baed20cf9e3b1981d674699519cd1200319e28a4673b30cab414fcf4cad94e906e2cc5589a16aca904e7607a9ee0ff5214ba503d51b34aa53a29dfd7dfde07fadb24be8afff3351750c39f83efa1c781600403a9d4e57979270e890cfb23855889627aad0f244155eb66cd1f244155e7ad09e30988e0e0cf6621b236011c5cab5360fd84d4d8551dad30b165d00718e9970420a2f5874c1838a50656281e1e8e0c04070c1d887fb4b11aaf4978c85a41cf4aca25851550607e3b802c995f61451008a0010eb38d08dbafa22f59da79b9a95787992404e7b02a00ba0ca05850a1481dbef0fe4a58b1980158d0c3690a11ca7d64fd3ac92a669c08a4a85628faca463e38632628f37379c919191f11286322c9d7177777777bf917177775789738696e529779feeb0276cab6b77b73be89f7b247577f7272d6bce38f40e2d82a6817177823f3ed89271a5c5019b336b85940003f6ac65a91d6f986412e8f633c928dc763185db5fc5daf5036190946ec17a0b5bc29cd8923559ef0f83e92881445d2c588551269987c074c418613d4a08b5fd6005d6569d2a6c8983e3b49d8c63b06cf1bc6e8f83dba58cdbcd3c75ba5a06153d955b1d0cc13a0706dbb5ee80c8963843f387dcae348bd0f33cdc75c755dccee2922a16a3eb2fae2aad3a5cdd7517dc0ed75d38e87b1bfe7564d91bf8b31d3fa474590f4de3ea7fefa37e8f6a0d61553b5d3e5bde9087437db0e5cda6cba395f336639f996536cd9b1391659fd9dc6aa16f0bcdcc93c87ae5bc95deec361312a77f50c62a5aa5dbf55fd5d4da75a434d49de1cf97c13ca87164592f2c97963fa73a28058d2123092494edeb349e2fe3a6c61a036b02dff9f5414a53425b7e59e0f63421049bc90e7897d2b099ecc0ede7960205607a5a669222619d0a1207a68323a6345d0ebb9182355db60052d812a6f337ce5464e73be5a7c4db814141d00ca589b0c4d6a062cb29a35ba88ee63c60b29fec057e397d6ff7c3808fa6c46cd2dc86bfed62cb7a3da8c2fad36c567a63266d06cd84269319735c126d220c92c2955f3f3b60604b7b43c9fa8f07beed52dad5cf15a2eb9f63a9fe7097bf0555d0619deb3cfc2c96b553a7873d283d80c2d8b2de58b2b687d20abc0bd223c9e9fafbe0425b491c35d9723bdb5113921318efa01d4e0a11d3b433812d2dd5c1965eabdfb666e22e6ff2af11f15395d99e35a5e0e5946c399bce665120dabea5d6dd92849092388717b6ff6736a5e043c7e40186b0650d81adf476f3a1a17ac552977d31e4b0c2a4d413470e1decaa04255be210594ce596acabb7c4c1b95aedff1059168bc562f27220c7c0482b46d71f47a76536986c596bad55b613594880b9fe353730d6af76f0400a5b8a462815b7d98ea21c4d4a6454bbcd8a445cd20f4790b00209a12f5daa14ed7a6c5101080fd67f86163b167801e6b2189759d0c5138eeb5c388743baae44a1b0623f6b035c29c6b10fbed8bf250e1a42b6c4413a09a3b1c4963898660cbce5e6a888ee0305224b9b581870ca2ac2ba5c7f1d1c34fd342ed7d103e6050e8e6857ddbaa143e4dc90e21146d7dfb218d74d69103073fbfbcb156e33d9255912747a6a6ed7ff491cfd7e6eeac115cbec6272b564739049a8238c905dff1b1c97d1cc9e2d285fb7fddc832ab5dad6edd984045a9196c04a594f697555b758940a400c5b526ac5962c76bd0e4eabbc216fb3171406d97ebe292bedfa73f7b36a3e8fbda2c23ef94efff7e44541d789dce55f8262ae0f7920644b17eaef5974e63ba5cf8476388724e60b82f20d5dff92e58971977b4f50d8d285e8ac63fdd199e7952e54f9c5fdee62bb1272fbab50a57d50424e400d8e9a228eaeffb76c3e0d148fbe96ecdfb2c646892d6b704e6e4ea0f43ddf78b447baaa591c9af9f5031fecdf92dad0604b0af31fa82042e7d1de270234e641c15dcd8fba7e7f7c031a2cce77927c87be93d5a1e03ba8237244145d7fdfe23bcde53afd5a2555a2382793dae97aad16a8e7b4d8d293a847a3c2c877ca8fca37f41119dd9ca21c51f0c379ccdfc3af69e4a42d0c5b5a9b2a6cf90d4d9ef902bbfc8fd468301abafed648c62f576a2959d9153fdcb7745382b4eb8d7d731bb81d6c794373b0d43679dc56fb8684837473b35d7f12d635264e3613f23be8967dbbe1f18c6ed7339a3c1f918b334a4fdb8ce23847bafe211125fcf29f91c296d446917ca704955cffb2a3dca31ba8a48fdad6362747d1c98ad4c1bc3912b55dcfc8e6197944cef3117d455e9167e445f18c3e22db513e22cfe823f2ef286dab799056890883a4d0f71d03d886ff5fb1b305c4ad99294870588f471d318498eb5f7333852d61ab29ec0266a4b025ebe61790a332ee27875d31d5d0417688a4ebbfaa9142bfc8c7eaf3cd2a04411004c16eeba45321b7e13f43881b25d6460acbba4962695e8441453e067e7dbe293f99cc6df883e314c0186bc3c59653e6dd3c1cb74ab753e681d185e07b385752f25cce75a5bddc2a9de996b63565166c7960a607c677caea3d55f1937925c899a0a8c8c7bca72fba0ddaa4a43b994c3643fd1c6435b76e2b366c095b8a4c583256029cb0fdf4f611564e08d9b4321bfe3c9698d892958015581a6cd932779712762c8890714e6666e66e9eef7d2bc8109b286cc960e67b3fed6257b923a2eb2fa4db1bc84aa583b6ca968d428604f1da4d55f421ec98bf0d14b65c5d7f5a1d713d882e4c3a2673b284182c930fd8a6f9cee842e54ac8e996f496934665eef21769257cc09693a6a23224963ac92e9b31842d67d00c92c962234dffd31dcd22178451ae0433f4f90686b3127338e936fc4908812debbd5f76eee2fbe5a9e79e00258aef84324e28da720214a319b6e846bec3ba9b5014df61dd10604e8062e43b34274031ba47a8daef79b5882762e4b044857af4045b18551004b5000388a22e4378069801064cb1daaadfa38eefc31e476f2c7f78ff337fbc81b0aa0c3421624350ef82131571129332512365950eb0c71276fb2b6a44b538d6237dd4ec910a59af05847567bd75aaa85026a1c917b9d81cc32fb1b04350620532c45c580d81e14f5c608416a373a4f131e7952342b8d81c6b8ec47ef28d4727ab9d20c110361c2462de0f4d34994590bc20d11e4a52454c8c8e3848c4424fc948099e88855f0f554c8985a09844d20bbcc4c22a4e11638c5858456fe42c4b618c60c88d15312fc529c6b244f4e9f426c02730e914609703f1ee0a6b8193c0961993219a934d9bde399de354d8927540dede240ebf603a3aa09a0b9a8a9e9e9e9e1e92fceffb3d5ff6943ddeadf23defbd8d68d7f5a546e2977f0e13966d7036acdd4028268b6404fb70bd6299b84e5ca7e9bf3e683a365b3e429a0e4522b1c68963cff833a2c6f175643b09a9c7f3afbb4110049b5f38b09e9e10041f172914e557aa45e96e97c3631eb7adeacccc2d80e779dfe739d77f3eb18feafa4f313c53895d41ce42b2474c9950a21f4ecea73fb698415b6db96d16e07ee3dc39b9b3a96251b7a4d5a68a9d4a619867ee80c13bde2cea9c69c38e67453ba52a2e960284a1e4c513fce53a0b7d9d693679a65151df98494633a35952d1349a497d633a758ebf6a3a81315fc0e40cc3aeb9eb1c3aa3317851ab628b3aa9e4d43798739cb83e73496cf1b495835ffe365576f305dc37bc601fef03321ac35398ebd46decf302fbc0d03b148926fde7ae745bce6d3b5a65e6a692931d2cb13f88e6ce4b729453c4facd26839dad929d56c84049c946e3a6b9adce59ebfce6fc1a0cbfbce89cf905bbfca90c19cc72eebad605bf7c7ab1a4775a4deed8e77bffd90565c960290cd7ab18d783db93e6fd6c1c5845bfaf9b49d6dccddd871322a429a52608e1a7180cb664dd20e100dcd33782748effec010aa2d33118221d60d2636057df10424372fd7d38d06dd4477db381cf62b1584f4252230829155ce31a77e47356661c6ea5c43edef56f2c3ce2d867bc3ed3729df6c4f50f8f6e3459faa8c1b7f1832d99e9e78aed315d3ba6cb6b4964e856a01f0837ddfa1e377d40b8a9070f279d8a45dd7275c7d8bf5676c0e1aa28b1c41549310820d144b6040c11d85025c62840c2822567e404172462ce421317f450450e4cbb2331ffee6e77c7e168ca36a7c85cf286d8393ea46128525425e6c2082db0028a18f8fc2cc6519f4b1b03cc6aac8e302363b53584bd40117361052606d60003639fd5f51781796cbdeecf5a74dc46cfeed9a2afd33740e09c1064ae7fdb60624b6badd7b23ee784e9e079b99ce7843c37457eb18f5f679fc9e35a3c27baf87d37d8398a2851f41cfb10e0fa77fd9d8bcfdae53eb4ebe7977f07385bfacc91b812dea98179dc68cefa86e384f059139f390bb809263d0acf7993107e85cd5530654a4b499e6464641401288c5ab500bf1ec42f47ba2df46d81261162629de63a5a6cc94939fe7dcee939cf79221839cf52f31a651fff4cf01b845f3d18043feab5e954c7c9967d236a011760ea974dc5457dd957dc3e9a424812d7b35c7fdad256fa4633e91c7fffee1bd24ef8658f61c24a6a46583a3314536218a68efa8623813d345b4847b5c9d3337d748e37ad285445f22457725cfdbce99ecbd01a4ea56a3d31a152049356d8e57dcbb994254ec02f6f22aa0ddd1ce7b59ae38066646464ac8c8c95f91f9f9191919119e264b7cc5d7d03039cd33f6381a1130468f4c1affe9ec983828fbec100cee977ea726fb7dcea0a2a25c8dcf9ce837aa15aefdda1075096998aed5bfee774fd6da858ef96ff7dc367d777406081264dc791e59c154e974d90b9b335845ffeb1236cdfda3302189673570cddf22f6371a47301183818e1c52e063479ea3bf8a8f7013e8ac90708b680a60b0134ac366a5a0fedee0f271d68ea6acc5398dc3517d80e1a328698169ac62f0f626fd74003e738110aaf2e6c0a40fd64cb9efe3ceff33ccffbbe172e04138e9973ceef9b35364ed8b29bfe70bd697d8347e778e770bbc96d27de7780772bf40d1e17d0809fc03c210478a76fa4bee45cd85a61a65a55856a31bfc2152ab8db81b5d6d8595333bfb16f60b20626bd09bbfc6949c5f1cb07508fa65197015f83296cad738439a9d3c3078d162ac9e261b8b2deca572bf671dacf0c82445aa493a8ab33862d7b56ae48cab3a35dfe4c4544edf29527da54b1e12d57b456cf6eb6642504f0cee700e6f911f4c5cebd95702361b26b609773ed8b2632f0cbdfbb935ae9fba16a953db305fe8fcfca9eaa35f5e3a8b16b7765958e3ae2f04ba78793fdb319aac32dba6fa02e0b6cd94aae3f8332380a1f842e47e1c3d1e5da7ad0c5b0b57b5876b6a618619094a69305eb19c3da2071e2d63ab012c662d514e14490cd0c1e84be5dad449205b6147bee6cd94ee5e804e6fb0de05f8a5b98744defdce5f44e979f75c3d366d369828b478213db039b5cd892c562cff3ee960ebda27f3451bbfe2ab093ad69006145a6eaa4d8b242db754ed4f3280f2a60b10249853fe79c73a27ece1a2a8e640c6cb9e2bb721e8ed1b0d972555f443ccd969f72ba04e7b43ce7fabda2245dc4a4422ecaf5efa01612e1892d5ba6238aa2ebb34b20e25d5567b2237c21525dc809b0fc7d998bebdf83634796ddf5e7b1e527b7684a48d127b664a5a9746bd5e18552517d7016a4eb4f45ca54757834c717d69ff2601d87ebf8624b9dabd3c359a0b2cc688da241832d6b703ee054cea580e8fac37a7074c4d8b8ee57aeff8b5bac5685c3af0f96d8bf3492c0e04a10362861854f89c3c5a4569b62542baa1545b1ed604b5a73da9091acc6eac1765399b85d7f71b5bac1d9d9b2be5260cbea3278384bb9eb6f3daf39b743bfdfbbacd2c18207ee1cc3fe2dc557175b8a305dcd2ed1c41259d5aeb6844152b806e4c73bf9e3c7e4f96ffaf1b3a2f956601f2e7b88572c56139025a2d89be7a60f3f8f497ed152b045f9e57580142d102bd6847af6b3a367fc334b410416078d7d689a03b407a594a61cd544771fa150a8b6cdd60a4e8209c0173b5ed487ed93c5aabee426d4875f521452b84098ebffa36ff4a8005b8077c007827958ecd34454c1328e6d2bb909845bb68d9b44c0a918e0b1d6f9f2a9a09a5d86e0208a6097b74dc94a09f8e5ce0484820fdb0f15b80bea3bd59d721c7ec19cd4e9e103c8665389a9b6825fadd5a6892060828021d2eeaed3c3472a88940cdb4290eab5eb370a854ab5207383d43b9fcad83103f57e44689014bde15bb186e2f3c8c2903be79d330ce78b791adf31fb33bec4b16356a631ce18658c76c4e13b2ad4bfcf317cd56c957ec39ff9d438c7b2a6de8eec2eb1c53335aa7e666421f5576664a16f8a85899aad9a1385528df4863c6d28a65262984a85a9948e93389cfc51dab19371918b5c161b335b92e5ea7e5e12fbcc3f9a45312af25a931b70681bae13895e920ec60b30d04549ba972cf334780b01725cfd3332ec8c4fc2c19348c71ce220a288aa334c8932aa193b4383296c49b2d32071f805d3f10114845fa9718893dd445d731229c949252749325cf27d73ce23d7b1cb9fa66b1a8e55e079df47713825f659f29d0602c6a7934f31e09734a8a44277cea47efa31e671544b84db20b874ad6bddc8fd7ffd5570e738714ab810105d370192ebb4c9e4a87340b8a5ebdcdd754f382b3824a66e098afa71e2f805b6280dfcf2076f4847b8fae53cc2512a0508ca606bab6427efdb3c3a9a493069652ec1ae89eb1cdd952690983b2e4cfda5eb8e6ed304ad1cfcd2e9743adde4e9db4d77d3dd743da7e7797336f94ca2f3ca84e2865362025705896905aeca6c9a504c152881c3dd7044dcb460a9327113f7e136086de114db510dfbb8db6c6159f37d5f8f6aa5517c46f8e55f8293f5e7eb5a5cce55d1e5f6676484e63be557632afa6642fecdaecf39e767847d6a7463084a96733927abaddad88784eb5f6f7dc35f40ba4cd79be644d5dcf5236cdde23bb694ebb85cff6c1536d65bad36273d070f76b01ddc3e9baeda98c2565b0d0098e7fb6abecf16859d51d67c40b07fb57d36cb2f7f0f86b2f0cbebfbe781338acd568faa6ddaa69193b535eb510d818a2d6b5a0fc0f95725ff6aab375837ac610dfb2a08d63ac10ada6ca14d0618435e6e33639a5f385eecf23941c06259091288b93d7c8795200198ebef03c81f0506a0beb6686acc7ef0458945b5641bdc62ed6348c825561ff585294745d2f5eff14577fd7d84b5f5d3f55ab2bf802c745354316242c5099122c6b8a1c6c410495409fa649ce0039314268f064ae0031044b5274f8a883916b6a1dd1429a8886124e65d68010222c434b9c1c82e96e3486e4a0d065eb0d022e6efdfa7fafefbbeefc3c9f590a1a6d81910cc518175be2a1dde7f4f2ba51504ebfca2e6e4887dfa75c8344f09edf29f31431445715a61bffb7ddfc4b125094885fa0840311f2ca1bf8223cd1014c216500a1f7c615bd612e2640837cba9d4a73ed52a1d552b0a552b8af9d538309d2a3b2e06f0acc9c33a7394b9acc963835dfeaccb1a21c94ba574747faa1b4b567cd54b6900c764be647db4a2522954e8a93a950a3f35fa0d53ad5f6203a0e36f28b1256c6471f0b38347dda5bc1251a7e7d5f8e86cc939ef6130ef6bd8c72b0a045120bfba67f70461ccf48da1b2390688b68e79fa0594e7d54a856caad82973bd67ec336ff7b4cbbf27ca0ab222b6641daba70315d81ee22bf84eb7c06f484bcc10316d843b06242c1bea1aae3f0cddb60e226405272bcb531fa250616a4e146aaa50287ec19cd4e9e1a3652d93a55a8585d9576ca74f0a6cc94b3cd8a76f4c1fe6192124278f104b6660425f14087e737e41bc87023ac75fc8e4610067c14f4f24805fa10212c03e2067c153f8f3d8c00b611f9086232f74f7d7fd753fe9246c89474a2686898989f2649a3c9569c8d26ba38aed2fbfc6c929fac6d4a1735a0af6e9666aa6198259348d745260cb9adaf5afd1600a5b36d3656a26cb62391393c7e439a9b5d65a6badd55a16eb3f05995ad68bab2d5ccd0bfb849747480f8dd76bec3372bb5855d827b4381036b4b023cd0c4e631faff1cbd927047cc3a5700e0dcce33bb0cbbf563acdf33c06e70453f8c49fc9c3b15699306fb73c0a3f85cf596ecd8d540cf058d8f2da74fda073c5963dd44dd8493f619e765ae7f895b6e1fa075a0f4179c2a4ffc02ef75a5ff1201ae73cd09ab8d1fa4613f2f44429add5bc9aed82a6e448c806073b8a9eb7c3c454c8eaa53bfc27c03eeda5c05cd9f29c2038271555dd6037485515c4817509998a50480cc31aa46f1d2b503f254e3b45c806b09cc362e87a14552b8afe2c612cc792880c20acbb650564befe8cf167cc61471e33ad12083f9569b193f35344ee1457b81d44b4c159f096e29d0fbeaa15c4af47d33ffae8568f540b68094bb6dec910bc582a53bf4754aba4b7fd4e50b4c1592f04206cf9d79decf977199dd212f24d69c32327d9794e9ed3a5d4a065cc85023eab24d0924999ef424c4a7f534a1323c2ceefa7f99ec86d0ee2dd6902a594524a6b05c21b53038c2da70c8c2b631f769a4dbce34d4ef677b9cd85cb962d772edd7e4f621e4ff21af3788d5dfd464636dbec59f65366eae44ef60a2954b660c2d2440e3127a2e40343e0866c08423725e63361106d6185115898004aec031dc27082a8698b179088f9bb0656d8724e1cd994c964b2cf889c97b9a18b93797273c02effb13aab85cf6f88024154d5512beb4bcd894e07043479a86ece49a90845942c1a1baec12c26c016568f8f1ea0a0eda8848d77453d0ad1cc080020001315000018100a854342b1704c2047a21c7b14800c6c8e407c623a1889a21c476218830c31c62003800100000098a121220200d063c33b5657c0109904cbd1fefa98995985ff6fc0dcb08ff3586555df3c9ecac65fb0b23a9c33e89fa41203239c03640f431f0acb28b65d986cfe8a03c198226b8d0760258d75f44517ac4907f8d34ee8838cd9039a5f242a464fdbe1ded61e1860f1a3908cc4e7a4f7701606792b47652ad504b10dd86f1204e2a8d9bd04332ae25f3f8d24953ca71f35801fd8253e50211a5e9a520064707e359a5da7039510b0f2f45c8683c01b867821011373ad63cd0a97329e5652634e0104813a5ab0a4fa3f3ec454e65067b001d192fac460c18b0a1c07296c0be56e49bc664d7aa04b80a714d6a3b6ba9d420bf145b9036f4579b5872f0b70a1a35d6352e8a8a7f8c047199157ff5b7631f0f984e8a10c14467f0987a5174bab838df81d5d7311375d2bc18aec14079e5c52215bae9dfa97c8f537da0548b34e53f05796a33b6d4b97487fac776afa635d967540471309dfa13025c47434b650e917563c50b9c9e8d4b4c474ebd93a1c76db5f8c7f55a574fcc73d3a2ff5522d24c8ca8cf702bee5e7ff25aaeacef9a35141df12df63bacfcbdb7531d75dee9ef96f51e79f694685f081462d6913c25dfe5c75dae22b2b576e09cbb9eba82329db080e5cbe55a4563305c6100acbab8ae08184951ec23aa8c9cc01b4cd0544569c5597985c0410d58a628d2852d285094a1e3ca24b42dae1ff5cba0b62bf0d3d1e5fa14bf161c3697410155ad2897255de4902eec53964037a90f852eee36e1c44d419720bffc0e03fad1ba907d65bd00b90d404124890e04e538f2fe61f63c911b2730816058422dc0c8f76eaf4f581927d49b02b058157611f2acc782ac69ba81f298e656d03799012bb48c0aa81353c887338c2fdaa2b6f5a8691a73cec0186b31e971720c2df6de9a1c0f1daffd6a91711267dd86867441ca813d145d9719bf21b784fdb580ea5d89aee36672d5ca68ef2394acbdd2e69b2a308b2cce8fa8a47990afb73e053c34b2e9c3964c652d1885ea0072aa0aa509a47096646c746673564bbbc9b5e74aab2c8b5172cc5afbfb472bf25c3788a06080d3860251058a4b8f2bd84f6eeadf751dedaa67fcfa65c686db795341656b95f2d2d47e217d73c3b3a0a8f9850f2089ddbbb63e6a06a37ee5da047d85a4ef0faa6f5a53a3d2a0184dac31f0c6efdd22668324735e52c2ed3dba78444a0265d9111e6a34b2bec7ca542bc2e847ab09f137da025c9b3e27807ae0a6230b6602453e6e08c6ca1f7f449fc6f1badd522f5f7cd094b7172f4dbb9eb4a61fa30fa6d0e05f4c77b0dcffafe1ef544d2a7f7a1a0e247e72d1c928253b77e74021a466316db37aeed966a35cc0f7db2fb229de6f712acfeb5d219a856b5f9d954793548d81257862c4a54f6b3dcb96356cbe19ed09c206ddc2601f85f0856a409d3b5d9cb816d663186a2a43ba5c1c3fd4079b811c285a072c2496623a04d3613156611b0541f2299c90eff099c261a46a67518fc809175e063ad7222fffc00910f0518c91c25964d4a250d8b30ecd299ca5cad7737c61700c76b8c00483bddbff45d1c771ad1a16d7b026ae4feb38f0e7921e3d0cfe0a042fd337cd702cc0bb241381c1bb00440cd421015b2986d48f94d4d19cc374e06e67294c896c4e419c0def9e42398029ee85a6b27254223b4f0b7cfedc9c0a0a00e9ebf19660f5ab7d51e527f2c6f9ebf19da8a25fa10e4233ab899c696f24513709b525e68e6a97f0ee9d839ae158316accf7c2617f91bacaedc5fc9caedf6064a1e74c1d6d89922ee17b4f7216e513637442be531f1c4047203cebffa566c076727d28c5781b319368a82206022dd124a9a744594a4f7d3629983449f5b310524159107b906971d997a8e58901445159bfc2a02fa522b869b2bc4cd5f61adb96796846ee18427462c61e6ce14ce9363192d45ae6fbd8ab006307f12c61371db905531a0401de3591f4b8c2c9add739423675c650cf1560ff414c60a4ae2cea1cf1ca317cbc4b13db3ec489721b4d8cc371484871361d4e6547f8cce31913e85897cc3ff649fc71b013c978dad3a8617379a4d613c3f8031b7865c6448f26f6a5cc60bb68f5b7f154319ef7a8b08a8f505566493f112f88d6b50db51a27314a8dace420e09974d85b3b92606d935940adca360730bb797cd703cf413f81db59797e138c1daf98976d7b1b460ab28d2e92861fa42be37e5a0970ae1ba9cfefc6ea1167b136c6ac006947121b6f8c62ee07bde5f63d73d7fda4593e4226df32d46d3e333b212aa28ed017afc733bf795a1d63952bb48124954df3fb9d0d6317e5fb413fec001d52adaa9f16a4149234104f62dd013eb7e98367d0e4f59ed9c1c9e80d38d1f607e762211ef5df0deab9e011cfad0597d72e95d2d9c8c8ff68d823f3c721a9c929699a025a59f427138a098744f7fb62bb3703261b4cda21002d4e8cf5cc9c43343676edde9b1e340e6e1f192cbfeabf9a9f4c58aaddc045ea60e40109cbf2ad1db560d06712806ba9edcbd35eef7b4063035674f6df0fb2440c844dc8494c03add5fca1bb502288c36892833f281a4266aa38990e4de57ff6f493ca799f3f039ddedfc4d2515957f69a5cd7ff4ea46727e4c20a3d334c5372f211a1c55c0297bd16160bc1d049f35c58be82829b8ba4a5bb3beeb60a37f88fc5fa3e092bf56b6cbdb6fd953ecf9d5629503d4d3887daf330c950784e3634b31bde2d69c056ae37a90a5b0245adee36d866a4e1fd7528138d950f078bf2739d35bd3527a7a7ed9d85791180488541c579719d6a8ebf77614169b19b12526bdb07a0ff9ac78db46ba8b823b9aedd7b86d8b256cc18ee1193a3e5b3c77ed59715f65886c07702b5e7c941c1b173c9d0edc1dd98d7aa279afb64c9730ca7fc52a9f8f9613699febabd82127cbd36067efa4f373fa46306ca82ce6809435947aa584718dcc82143132729ae05a005f9e92768529503261fe66255466257c347170691ee9518c822231124394b7ada35b54d78ce452b18f42cfc3630df2bf64154374f2b7bd1f0f46314993593f18a8c4963dd3815d2633e6b0f2809790d0390b1e20718450e8616ed6de1a21a04bd5849cb11d47919e0bca7dfd2c3d88f96d5301fc1928e18ebfc5430632a8b1e8abe42fb465f4f4292a1585511b2db262b3169e23f656a7e761a91ddae77b058f6bab6e3d55562f76a34545f60c0a03b01c759b0cb9ab7ff5cd6e0d5b1cee8afc294f491da43e00f8752a1b566358f05bfd5bc455b78f988f11d71ca1cfa648b0f0a921d05b76dfb65cc45fd94e2fceddf25ef625778f77e09588284e308de0928aae5e88a8bdb5fd08aeed1d3bb6c0ca4bf43e530dcb81e53c03575684f1360043ee869cb236d29c7582be9417523c744a977bf2163ee54b6032af876e9079d37fa7e6b819d16f4e6ea8c7dc11f85d8f35aa6e45e8efa436ee1dca15bad11a33ebf31baaf48986098ffb49412b15c8e0577fdc66d6a4cb1708b05d78e15033dd8e36ad15838cdb2a30b6d42ba45a48b76ad6017a2f315b8a8160bd36bf11b2f6913d36243315dd4efc31b141621c363c3508d5fa05a604358826c9187d8b53b2cbe7c22027234aad2de107194f8f19efccbfed8cc594424c0ccb5e8e753d5221ca834c80c63a93061a08673c691be365d98f438cd071263f0767c5e475f6a55461ba8fbce642b3cedf2c0209c0db400f64a356e6674d9d0ae2822015b146158be73dc86491c6944d1b473c78c46e99f309c5df35a7508dd17495de790b6c7205382604f559a76c6011129deec8997daeb56c7aa9e906455390c599f4aa3d8b2f7f59175aafa2aab23b101817628069c467bf755fe4b85371f080c3a79ac54f33a8f1771c0b5d8eb75b849093918fc3dc9ced91d6689819e1a019ebd790639f9fbe2a27ec480ba5f878e97b76a0609ab868c6e3b0bed96dcdc01fa3fbc8c038bb24de32fadff1810ead09303ee71cdc53b48f7011005cf0fa4e2efc1c668aff82f453633ffefc6c61e2fcffad9b3d3464eb4c7b400ec379394cbf19475810d628625aba1d94df9a5bc2a2c9dfe50ee0433577fad5312e4682368e8df20d78e533cd0c2b5e35ca4dccc1de275b511e71000b2a37a6d27c08df4435d810afb6e0c26700e77e1653c30e326224c6dbbc5089a8f2492a196479e486a94b7669c019e444f6f3b147297bcd7e53c4aba83d95a7cc3046443ef02b067b4e345fc4d8e4097b0f2fba9c620eb8d601c4a97fee7f3adba4438911b1ada331614c12a2389562f9b39d6169418d9e1c0120b9b4e468b110c5a43d1063a9010dcbaed78e9b24f192e761e86f00fa1fa6cc9dc3b9882ca96e888a67395604e9ce0b396ad1c987a4dbd86217c653b8cc76ead3b3537040b4d3768f690700653b03411c49c482ba3f22b50a2a1b942a04ae6e02158187291457f87a7a760c7c6d4a90a2b5970dcb10ca30a2ccdcab8ad13dda8a0be93610d099838fb1aed8709b9abae2b0e730ef4d87decf911e540c386a42c38d25516f94709db399a3b5c5117fd24607da9cc3ab513a7825eeb694981bce9ca05ebdb74ce1521773c41fb84f52aed926dab3df6908c9037a0c261bd82a1dd685a680db12c02cec10f94f34e5503c5d920d5b454943bc171d85a46e5070aa07cd707efb9c5ce2f1c66f2279399c71b7d20c53921935fd857ed95c832ad56f9880ca1af67f73c30623c215a36ce242cfab0b1ea7e0be3d9e4575d74cb9dfbaeeb34459cef63c21e5f638fa42109b0c91e01f7cf785ec4104dca4a544bb1fe87c50e998a8c8c6f0b71148e60311e47daf7b4d18235acbaafb9c7b816865293202713cada7946a780c9766833660b2440c6469ecdef3b364d5c95719f7097500e5adc9a6fbcaa74c5df0db802555f0046e1f56137a905077243472094c4e80358a470d5109ec25084de39fb64100de4a345e81efe7e0085792289c4943d6d5f8e5127c0ebf171c2a7c8d926ba48e942037562c226c8db32bcd772a4b234dec147d01de59807e2c6b7bfc06db009ed84be82a1561686448fccf144d4e0d6fdf51624f514687e25690cf5586b2e8650d5f15fa19a1be8d25dbdc59750197a51a937c5b1bcd8f0e42839ab9f1828ab47ea4ee98eca126c0b60ad40136004b12074d247d90f2aff60593ab91863e90f25cb0285087b06233bfc3e7b473d740eaaa5bbd42c3d18251292b4baa9827b26d21bc554a460ecb7b77deabf05e6277d2d19056aacfff851142ef2aa9f1359f584e6f63701692f04ed1bcb250656c88be071dfad50a1f013ea9ad187c3b6d917c99e20aab4cafa583d2ec2dfac1a5488efc925c351eb03c32d0050fa779f4e71b9db9e037d0eeeef2c594bfd063f993aeb4342d96798735fa85406d5ee21b76ec724f4f33a95d71c22497342d7c70f96d25456275c7af2fc103d42b5dcd61ee8acd76055ba789c52888d342f437646bc584930f31062e788824b2b5a9365d028ff67dd1a3bdc5ecbd585eb4238f18059025b74f0c9371cfb753a5be9b6eb2b2b405dc31c405fe54e68f64f491c4decba5fbc442eecd31abea991151a36528497ee26fc10ce51bdb2100d51a844567445b5c8beae26b8c98264b09b4b7002597115ad1173d1de877336f63175da694c4c67db29f89aeea60062b829f97139195587c99955344b9d4b63206c44adb1f0206303a4c9fdd99d66c0971d48846012defe672bf47fb747cd3abbdbcbd7ac58444210de8d9e559a0fd9bd12a7bb3146de4a8e633f39bd37adaa8191c4d57502a70d850808802ba10140388ab336034ef112e0bec8f5afc1cc5e4b325a6222426074f6442e3b0c44a970e39a10f0916db230cd6c58e5e5995f42c09721d908bf208c6535636d30606d2ab83a1c00f5cd0c72100de32ac4e3e8bf4d2eb95365ee0a0ca8da6bcad5d2568bc2db593f1a17851ed8e5d0d0c1b490641dde3f885a9de65b4c6801a673a34003d1cfcd6ddf180889f2c59982c68efab2fefaec723429a5cc3c14cef8488c45a098628df95f4467d3244bb0c8451e94b4db1a76db990f9ec85668a9215cf2c0d2969270c636e3bded480239934033d543b0fdb3fb78bd9d08aadab07a85c61392b590beeaeb3708bb0704920b4b7ba65373e47661c9d3d13cb9749dadd3ee27208ba8a2dbbd9807efdd59b73c6133700eb30b3b6a042b1e35b55c30a590385eebffa9aa4b65773ecc5b87a02ef561503b4a29ea354c603193907f651a699faa31131c65340e36b5e232dcd75cbc93dafe365af7f3bbfe052b83ac9434498566b94c07c65b58fa5bea4dde3b302654f47c62ef73c8e5e73ace6b37ea464fd6703105d89f4062ee8b0cf98c1498eba44c1f0fe3ff07d501ad1f4edd6be1e974af8acb6b5adf21017299688b0bcf9f19013f8b3884b8a749a5522c6f2725c194030b612d93628e15e3ad5e9a97df0d40d1480238760f0c406dab4cbda68a4ff2c70858d8ff6ec09f5b87c8a707997b2badbc9e967a5b04608ede3dda450c220dda05517eef0a256c871d2096d39e5abfe6eda2e1189fc58eb8fcee99ae4c2638bf0234a8c92b0a4ed65c230c52ed379b2a40bc2b8897c43d8ca55ea9afd62df9cd601d256d407a6a664308ca8466085d966607ce492468cf094496b9cdc2e03a214304e75f96c976b7699098e4ddacda6f181ae880a38c6f2be7eafc4a2629d13012efcfa7efd5eb3ed99f9325a3c527ace28eea2690fdfe5c6ed5bfabc3fc265ea97b6205caae34345b24c35d45ccf1b11943cfe41b9c5962956a1e860a4fb0ef205b25a2edff1ecd8f50da55bf5cc851a54147d486a465016d9278330094a4a2cecea303e7cc75a308b164fc177767ade23f2caf003aa63868eadb0a58ee3b521ab0a848f38edd2a45326ac9a58fda461904e489646b89dc64112bab0da841bbe1945d8107587746edcab56b8b5d570c142d285275ef7066d5990996a6cf46160ad192369085c756ef4ea4ed3f0ec500c9a9a433ee90cee56399ee13b05f3513abef8c831e33d009f4b7fe7a78f31ee014e9aefc51b52e69db66a5257e8ea5cd48849c168649c0c0dc01dfddef50c56f23e56e10b1262c669eb4d59ca0b85086523cdd22c123c71ab0b9f7d5a0527fa05058b480d4be26407f948c2beecabcebe074ea598047d4b57194b812105a7ebe327fdaa81a5d7ab50a01663fe1155018d2a1884dba5f96eaedfa8e756113284d7041c7bc009eee8bdc09b84ff28451ebd2262f4c38d1e2085305de0b11aedc487d94c5b98768bff2df96c1104c80e1170581c8ce120bb2dc20c1b2e627f470407a77943bef1fdf9039dc51eb302d95c0689a6d1f085213a02c046b00f1ba549f8505113dbff90a4ee1d58b45c8b14bc3ae0d65bf787434291693e8608510dd11a5a08c833589541ec61f61d66e0b6995799ba7e8c5664dd522b51d0fc91032b4be9998a5a630024d42b6ab0950be23c65bfc03f535d80f00c11cedbeca7e796fdc6b18ca30374333f25724c86abc40bc0905aaf401cd0b0c7ec35968b4ca6428c7503ed59654feaefb4e9cc19762dffe6512db0148008e16bcd695aabd222383c7268484e3cba4ed2f211dac5dcd30f7995026badb908260b4a552a6b8678d663c592924f8d0c6a74e600827dd85834d35a3ca35a9049306399be9b46d07d8ba2ce8892b0daca679c870d71bd451cd940b3acc66faaf56297065c704af070fa6f28b3ab13bc563c820b5737a18fc45e06b18c77b0eeea688f47258018557c9ef1723dc2e047746af47ec7c171ad8c585fc7789b99cef21714199e3156d9e139a367532c192bdb42cd44764a69b32c1ece2b452c5b736d3236ed2f60c35da207314a7b4afedf289140f99d25973793874d5d109874f6f4942ef7d372928c6709368d61b46d48d2255e3925e20c066c97bcc1da72ce2f6c1e84a8cf6e9d6be3e2c70e1dd9c397ef14806124414591abe596d46d4efeb9c447a8898927b27e59132bac9295b57111d04c81d235ee4471dbc1225bac788a1c35ac1d73810f13747a45c8216f50c848e8887fe4702c33a722a3b7cbbd706f06d6a555df49538869b0023468cbe381477b9c89a626788437f0b6575f254056592b8751ec0b91ad204a7676878408b764866511fbbbf84a503e173af1522041ee03d6faf7275caaf5756c45db71b6b70a15270f7dd0042cd25df773582eb6fc5ce3dc652f4518be00018126521b8a64017892d6a00b6075e10db988a932512565104d6c136a052c64d97bddd68659c822a10a2a22bf2caa8541506aa060912be891e94b70ed147ab0dd0016060a474ecf76cb1446d42df716aa8732530f55aa8d9c1e8b5e5b1a213283c231d3d800e96c03fdae060a82953f46069ba9ffe4226a55842a35ce9efcceb1e5f4dc437c2a9e8082719c04d412f21073dd4a4ea04d6391b51aa4670750e55827d725dd328fd7e884afc173c76280fc3679e1b8fe88c314309a009083be26ecb14c0e54d4487a9b7a96ef22da0778aab0120496d361eb64fa48a97d551aa12054f23df293463ccf4c1bd3efa82e536ed92ff8b30a3da4b1707fcad78eb857b785a956fda678bb50ca803ee726b0aa97564ac9bdf066b6413bbc4cc127ba3bd1b7425db7c985937e91f9d210f87c8c8b647f051db608f1ea470560f5261b0f84f1de929cdf8381e59fa826d05a2d156df549b100c4872f817df7b608b5b343497b7a68d820ca11009a2929c2b70eeb2c4f9890d39c873b68fd13a6796cd2cca1f0c6874b8079d18871b9963074646b4d76a2fe9848d3f3e7e7668dd2b5395b7faae279959fb4adf477526bfa56034566f2f510741509e415349b41bd070e4770e679fac85a29b2c787e06b7e45f7f6174bed80f07ae8fe41257c6230fa495b90901c4031b0d989c07c322eef8d43a771b1846d75cd573788be4b4d491794bfa7262a5b4a8cedd5499aa65868bdcfba7ea2f4c6b34d2e77481637f0baafe44efc5d31a272d29cf90efff6eec23cc7d189afe45026f7a0fe047bafd8622bb557c590ac76c0e8aa4bd863da00ba42005a74cfe754d8543c44ae46277b51baafa29100c483cd44c594a7f00bef94398e67aa65dbdd5520fc0eb83815586b5dbff5230c9dfe35ffca109bb8f335867f2d9f9d491853467adc153d811a5f431dca841160c76e17ca2c88ad8f9ca9f02a06acd6c88e9a5fb40b2d8e33a7529507fe2dd0e8c30d909b6d1a2b22aa82d0a323a168198d545dc6c422c82b7276f3c2521ea281469840db1ee3a1334f33a982f0473ecb0018c870fa01a28fb76b8b4f38dd6eb9e9213418b7720d605e3649281701cfcbb646a4ceff6b277b78c23b20e7d7553eb488a37aaee0526c3d0380e61db5619cfd8d615ae2517af06a2796c1debf090b2a593e59f5d18fa398d5181f8005d8b822bb8ea2df28132c36adf85923cfe207b47c7b63f069854472026f31c6aa1e0de64c35530de4f331287fe5760ea5942e235029f7f57b77c1383cdce85e8dbeb63cbc4a394b3370c37bcd2d4c4e9d64c3b4598615a0d32370ab3932d2b7dea2c5c6bb88a82479c6b4432cb0eb18a63f53fae6fbe817a37c2c103aee76d5d72f253db7352f8e3a50d6b94113b85835549a09b565e4e14172bf2abdd5c0eed0d2a1f75313deecf75c9d0668aab92a97cd31b9791612eaf0b5b3e52488ba9c1ed70fa42cb597a531380d9aa1a62673fabce1743f264f00e8fbcbf8cb41536d35b6ecbee2591f42602db46dc87afff6096bff6ad0448ac4141bb73621b186cf9f61ab9d31642965c4abfa0b24ac1d74c3e71b6a75bc6747da6a8e36d574a261560b71dec7f151a868af41a9eb6b13fd0909f90a57c3d7999b1bf288a1e400fc28208ac7ae9b06c779b2e367a54665ea9594a79bcae83858b46da1584629a67e19f582a0749ad652fbe3212e400003c09416120223519c6d7f133acb59c2d0082fae284e65a26a0e213606e2c8bf700a49f5257fa12f51f82a907111869958b3aa4b294c759ddc24c8cf8d2b4aa8feeb3f548350a1a6ede0857842fc8b153f3cbafb2bc12f2e3c7492353ae34595b6edc240f184008eef341dcf409586a6ab7b03232c5360108e5ce295f54c3a2e29dcec1d4a7012b6dce13792f2d4f4ee76fca4ccfe245a4f30d1d44b97a4a02f4d8c0a95eb1293d6ca26f62af71098c67cc5bf5f2da6169d469746620f23184f80490e06f73428cbd2a34c186b002b49689ce4712210d7e7b2f1c74124c3f06fda20194bdaa7fc91a51b297e3431d847240e7d505b5775af863450c0f4d8a299b9c642262ae1311aba69aec25c0f7e26bcdac67a93ff35d96a823be10a6e4c5bd12d12073610afef0da2fc1b1e2bc92088a7d8c002b46ebcca27b914d078b7c362088f431e22445b1457a32968ba98e7d21ecfbf444645d937ad35d1cc4c21abcc9f769ab66b90d9e6182d023b9ed4fc8676a292c719429d39d5718395a89f8ee2d5f04bfe66d23d2c7d1638e3d577cb61dbd0188dc35ff00c2926e14a5af48509c3b91006bcbcae41755094b0775f92920de94b6576e0e7e1641cdb5e6a03002f2ab3164826a2efc0c1e5d4a436595ca1cea84a0b6150c4889cc52401e818b282c7885accb3a17dab324a851bd5720dc7a380fb20e4759d3ead6144026ac7493b3b6335f91af86bd4d7d6a7b8bd6a5c7bd92308a5f4316c8fbb8a8eecc1f0701126a5a789f5a8b33f912c659e006120be70e7408262331d9d4e2203ba64d5e29e7021778c2f56723a17f648f0bd28067b79c17c7f85806a8f165b4fc738f80d6f8127aa9bc77062451df6b1c2268c5788a908e6029b211d2c92d185812a5eb7bda7f8dda7c33ac905ae0d752fb0e7b86aef886c10bb87cb14fdfbe72863bb1e13aadd3af191469dde7a4bf98eafb6c0779b5eeafb07ae9bacd03f7765c4e114cf97216245db9c62bfaf176d2811cc55f967a16406f9b78e5fc849b79f454001dfc7a44da93b6585d2af2ddcd2660a71e8bc5cdefecc9217fe330dca2ae0765f33e57942611aafd0cd8b4b11f554a1523ab30e9bbccb17a8a7247324fe9972e0e729dc441167a041598f89ac1824079116c13d01cbcb0f0a9fc5e7b3c73fd04d4eba345f7d04ac34af9829ea97c9e2b06afc8ccf5378d8c2a41a67a6725708b74509f381af0c7ba709b1b42ef044c1831bee35c18166b5c87136bbae04c80fa822a364dd4ebfa5663623d511805a71382cd9788385073d660e0a6e4a44b97df1c584c8ec990e57120e9764562f68e22b86cc9f1c4d0e4b364ef6ad0263403e526cbc9e1fcd74e0958cf2a4c81c4ad40aaea4dbb0c31920f130e4a38b30b7e8c0b6dc5602089dfc701257ab3340d776a879f25e25220e4c9270ed0787c51ab25ed747e064d3e79f6d6a03cf3f4b22cc93da3371488b9ae0928c7d21a9acab2a807c8562f65b60dacc40b127bd7ce1812638a112a0369f6c40ae318d07fe1cb56e13a30337df238815e6917bae0b5faeb0e9824855e52100c7cc6fbe4736e9e4ee63877433a2980b5c3416bca3479aa1ad9fa174b950ba5edc747e46d5cd12019c31e44d3e79f40d6d223fb79d62c3d85036d0d79bda7225adb2d0b87a725c9bca078521f212563cbb80b11442a7736445275e6e19e11bf13d0cca3bd4fe3d42b95e26d85fdcda0a6dd0361332401a18bd40fbf7470e29ce13506aa7bd468228d283ea580014a21332573575b27004ce8f23543f871bd076d7128a57414712c233f195a0d3e52d7f8d06b272fa9280c3a82d7b2acb5a019efc8215a47bcfb3acb687fd551b38eed9383a4204dc65459f5c18692abd9a37e4104ba1ad7aa7fff4a3ae1faca4f5257e071d80628955cc3184552ce5520fea8f7ab807ece5837a0024d0979b4e4c89c2e326bd0ae8de01074a7f2f6ed6e8df8623a5a317842f7dc6423bb7bc93f522709d13a9ae6614a6f903672219c79cad0ee9a28f3ebe925fd62021d01cd4590fb148e102588acf2dc74e7043a237802e24f9620250cb63ea3f236d3698287058ac8873309e794f6ef9e2c3cd5bcc0faadafafdbb61469fbf6c7ca15e7d0beb252c5b6f4be7c4356aee17c7acad4652eea248bb0d32462aa38c0a416ddd66de6547148ebeff587c0f32ad0d9acfca26a753ed65620c19fb88a45c3748b87218250f6ac69119128ce1f7868ab2b2bc7a520f64625324e7773675c75c5f580944599688fc67a7113c13b19fd3036dfe243934b5648d6533e9ac9d581f0c73a178d04408c4e66aacbbcaa5acb198dddf98af04294959db1c425d0044a0090eae0aabe03c24a229260bb9b69493e014f6eb87b2e29b6b67b98ae26e741efa31d5d69160446abfd04233b3efffe065f81b9a5a6e6690564a16f1054d068deca781013b9bc5d0ebd92366ac28d941ddc596933023c29fd07cb7dcd18c78d502b3d2886fd20a5273c58d847a5c40fe0c3cc8e180e14019207a65d23fc9b15d0ebb13b84bcad24f8dc6af3a71983ff8817a670dfed10ea0b806d1e57312720826057652bf1bf607c4caab9e6fbef81a57a06301edd40f8eb40d73147725b369c476c52baec0cb14897122168bfdf23decd2550814377510aa5028b53ebc2fa6c9fff44f27ba15e39698f2da024d8a2bbfb39a497445c5aad6f1dafec0135f0171c324da65d98ac73ce298acd14ad7071cd0b64809128f818b0a735b2df3655c98d3991bda53a5b1cf285713a4040fee44fe9b2ccf38afbb84ec06807099b71429e45bd3b690d0bbbb50d2deceff2568e91b7c17a05ed96f19150544faf8dc8e1e6d9ce223fea94bcad43d59111732f97c2701308c53a7f744b5d03906b06cf99d652727c69dc68ee870fb9ff3b9fb9773922d7484ec1e972a17458c7e5a15eb78ec31ab0be5d8571c886d2fd21f6508706084b864a478ba10f351c44143bd8eeee4bcb3ebd2fd963868e8e194120b06aa01e1b7a0b98585c0226851089ffb671eeef4ad983cdb5adcf4b7bdd0e5b734e725f0344cc832a42e98a3f83ba972845c33a6a328631e366c27cb890200de2d3234c99b33bbdfd172a4cf84fd2f4346e33c912d74b5884e6255cc7edebfcb46d72d0342e605ee99e8341c0a73273886621da08202a8814cae265eb6a05a80a95360595029843a33e6555620e9482d3fcd33d54963264bc77f94cac9ed1acb63e3820d0e60711cfba9b42181b6165f429faed689e4b6e761efcbf6e0706f9ce3dfab3e31c258eb8cfc5c833794abb3409217f049a76a2cb787b32e36e0a309acd47481909ca5dd04ee1021d7353191505831943b91f35744246414fae974917640bfc6ae4d27db7133efaa3b702266a8205b167308c3c8e8c918d7df6333e157c0abaf41a97e22797dc35efd2344ccdfadc9fca3a1f1256ebd62cc634fcc174656de613264f2e17f14a3bffbac9f2827f242320d30ca4640f34ccc5d63034a1f0694706da791aac2b48ef35b5ed70420a3d99b0bc042d0f837bcbf223efada1492a18901ff957e2bb2f7698a0a6fdda2298ff98df2b9a60e78ccc179269a74e1619d4e3ab094f5423cef7500bd03c407e54b7e544835f691aa2af7770ffe9b9255a2aa1fb3acbaa18aa1966bc119cd6000b402be5575b7ac9cadcebc549b38fb41ceca76682dd77f4978401b14dd2d8003a59946383482a41066177ab81c82198c10791ab88123b8afed1f627728c193d3d28648bd50db9236513ed5923fb7a6fbc03538d1595465c8e29157c4003c4112b12956d8be9733b608a52dbea8bc72a8563be618b71a1153afb19315c39b381302f2d466c52bb0a81665d4c1355302c5730a8eddc365465d4492ec4d134c821613d657e80701b0179c6d3fc055f84bcadb4797c6c45cef04db9b8306a06b68226a859493c29d4c346a6e81527a12ab5b0d71af10d400e6240daa7e66d7e153dce1d87bd03bd9d06ef94b29be3cf5fae79a07e01e284ed95f4954b40eb022de297cb658ba4e5bbb5b95fcc5df451ee01c28a9cd92ad83101ea390c414953dc14f3d323344e3a3bade9c53aca62aa4d46c6e9a8fcf2aca825c90868d4421a492deb2fc95beac8163c18489a26ea134cbf04c0fdad8d13edbc9558a3c59c2ff25093008a8d5956ed0dfa447913d78ed657f6553b5be07b55bd419aadff75e4a899f28fea15b4490c265944d177c8dd7567197100eb6679045ed6dd7b2f1ea4f6112a9a890c56f3733f9ac1dee531b516afe63ba0407de80b67cea4f79e8b82ce6345d7005b45c67abf169e5120128edfdc95f47d9aafe30e2276cbab95dfb02ec574a23e6528c18e2238919749c946aec2337b3368334b634495cd89a0e62781f638afe3912942e4fea621bd5b37384c7cbabb72b8867368d32431faacd19f804469f5baf2fb2e1f0b77c398c52335d4c9bde751eacd8303beb17efb1be6da669709e3dd57b422186beeb24592c8491ad8e21cb7c9294a9939047c678d993f2a79906f69b3518eb58a838e4397ac200c926750ef130241f3ee3b318f03e1878a355a794b295d4d416c47aa64880d643ab7401321613af2b2fe441c99882a900766415813e5478b4c53aac2cda9f07fdabcda6f0d4d5c2315fcbb03ceead79899d6ec300656f1d957465eb7b1d157a5146b9d7227bab394fc72f8da03f9ff4e01b2f26309ff2034bdef47a9198e39e6696f2a2dbd34abcfd739a7a4c2fe798e1c90209eb9e8d4e621623d4f450b8db1336ba891e69b9a312962b664d425c8dcbd93f2bb65617f5054f8e53480927e41d10270f52392a0d9e0f8526196ef99879d3d933a8e3d1a05c26ab26866c5815800ebd5d2903fbaf5d71b01b7060fca9facc2c676d24a9a5b27c3e7d19e54ff7f2f934ceef1f8458d2539a1698cf18feda9bf32c701e1d1485005a158d5dfa2d2f501edbba5cb0c1622d38c97b62d5012829c5fb892e2da84b42a7a2165016992ecd5ca1454dd96cc0bc40adbae0dcd6b6f4d622122efdc3410860ce3997d61ea1ad4b316202d7a22451e21215f1995b30d7bb96e62d131d0f2f9178696dcba8e3c282db36bedbb1b61223b0a43a4a9bffb432f9b7211f75433a825c7b95a0b194b37b5bd448b920ca2e6d02aea2f1cadb52c76f451a5271fd884330fe3bdadefe02ca942e83e3a3bb77454b475e636e0a85f9705dd6c4e96406a3f9e18ba9525fb3392aa624434528f2f4499a173e232ff4abb44b9d7eb3ad074bdba427aef023f9e95a77b1a13f05e8e406186d0a90e24f0702d7110654b832ad3ba0403eccc31eb2db14cfac0c2bfd2e1c199eb3133ac8f16ace73008880b86a43c4d80612ab0034634c96783dfe270900d086117dfc00b3034e3cba1f537ef2af4c8d8fb89aa3f379eb2098b0bd17409a38e513893295c074067b823a42d20c36d9a5373a14125c18ccd81e04877b20d0581af8a597419e2f307dbd77bb4fb4d68b6899a6736b9c0066f2c54f7916cbd42629c6f0c0adce1da115a6595fbaed429bf6d14901fd046aaa56b292bcaddc71e3b14af53fe64b4892554ba5d5d272b62d1826f405ad710bc44cf2e06c28ba1d280a683916c068b4a00c25a7bd2e92ca3e768b2a65718701bde735ffba15376cccce02e32302bba3db3e8d07e87bb5b3c39d4a7d345be96a657c88abe5e19d1bcc45446e34cf63dec3542e4e071a1720efe68c22f992d9a89358c3552498f9788d04ec4d52ec53142fcdcaf2da036fe526d75193f93f20e972e1767322dc2dca386ebb83cb4b6d21c102bc4d791c7470e3d01788fdc389a4278cc48a19b9be81b8916c8971f08887921766c93330a668450a548094fe794cd6e4baa0df42c87e91005ef91804026ca9eb78bd2089cf8fc0c2ec123cbea23c473d52eaded52a1fe325092638e01a7a7fc9b170fb444d84d502c5aced1fffc39b496c499e61a8b72d8b8907d9d30074867fa68cba8055122f6dd379ad80e39b758dab863be05204932866c4e59756525ce3cf63c8010f22f693ae58b0c10fab072be77ad1391c3976d2b3570ae55dd1ca00e7816caea2ca2ffca1366a5d17389bd76719ee770250c461a5d3dc41c379260f97cef61d24a8fc1a3c869449947b57c944a9a35986b42beadf69ad44903bc6076ae3d6ff430452b94baf749ed4e112783acaa157149ea4c5213ed40e9abbe290bf4e517e6987dcffb1cb5b882299a2b1b5ba6cdfd33446ec71343c4372c63399cd82fa3abe61a9174768b830b94304e6acbda2e19352e276bbc033c7c82b672ced0664c4c067bde2469acf7c3762c78afcea8b7db7b7291dd650702f996596436de1a05c447844a09d6017a8c7308a001f977f93bdd41b527ad5e212e48517aa8f9ae738f4364b73b69575eef1b35bede8671c144519c796022683112e5018f4b710f1d4aea018a00fa48b54266fdc0cdd148ecd33928bc7141449505d3163e0856a5c90fc11a653e0d864dc85b222a5645fd30388c28d316bcc4d46e1dae20959cc9fe06ac889a008143799bef62afe0d40f1a9b63deb192aab93027c962c5417b5470704d9234a1f4359ba7be61c7f839e98b718c8a80d08349c9c5bc65cfb228b1fbf434586ef8c082743126ae300f080aed77f9caa3c624374a175b37037e5b2ff08b76247341bade58542f2ea9071e0510e90bbd407e696ad6b8be62023ebf324566ce2ef3b6764c8bc401b0c0e3ba7935738edd63a44793944fdc42816c978be627cfb3033785e72153a29404719042630849dff077eda11e8645e7ae50a4db99d95cd0dcf71a28c68e70a3620732f08bb6db4a2b0a8218ebea9f52b0c17461f17c1408aa4c68069142035497131f65f49c4362ef74fe9467f8a1c94eeb7e64476427da7af14f6f8483fefc87cf7b563a5d3a7145fe64d49d713fac17f8dc2141fa658e8762d4075e505ea4842d5c567fd17e745e91891a7cf03f058a86605017106272b892d15fa3cd3b825b52388e0cb33ce67fbcc5f4d88bc685d92d8c112c543794427bc76d895b6e8b8804882b00c34ba7c94fb0763b8aaf80c8f2f86d375b9d995b3ebc93c56ea985b0f43c3049555de1b29b0de7fe07618a86f278086fabc7f85dcf2040014ff65e66a4cfd19f780c075f2937b655ae9d88af9993e9ab09e27d1196992a1bdcf99f2647785b14e7fadc22015506d5669bd69a19814204049489f5d06f4085a23cd01542115b8cc379b088088c66d28c94803024083d53bab239e4c9d0a2e285239c29691a1205441ab010f13db33314f4d4e9692734894e4dd9fa1779dfd0a947d4c2217d38204d67984ab0a67c79cef959f33c6a7fffbd52b5bd1bd2676f8aeeb96588a08a638559e750d797d42d43147eba47cdb701f1c543cf4e789007260ad0579c2945b943a8a919d3f2504372c94eeced14cebeecbe96a4e9eb6b7dd8bb516a443a83e356df7019e175bf374182c2549612b2b9c18feb1d9c3fc1936f0b9da370536422f520e13577219c40368b7861f2aa8309b389468ae3e1480195a8feb233ff9eb70fe02f1f3eb6ce57463a6eb1d931e98ea3df574be0f21f6a8bf239b38285c2f0468de05bd93e043957d2a3bd8153d41f649f6b2a956301094cf2abe4955a45c6d2a05173c222c7d1598f31f80865e0b3dfb63fc6ab4346af4a347420a2a040a827a8483f7bce8f62a9ede045e0632be4644786316a6de7c975757b0856ac6e56022c20bae20c08845803f5340f1646782ef4d866ee3fea917cf0a5566b565d746ba4072f6934084af0c4bf10512bb2ef46f61b6f8c6bd6c0308bf8e072b0063453d601e45e6005907c264b03d7666794cacb048ff4b8d4af76b952dbe222add73260c107f58c1e663be9eaa9e3498ceaae1d458b525f72b73b40717cf654ee0161905e0609eac354c9a0b331668887aa474ecfe24011fb57b8079c1ce568b6efb093f0d1a9ed18c681f213d0094ae3ca57315f73ef24b145b7156b4350b7d6149924eb2102e25a832048cd9b92083b5882f89bdb3537a568b48d2cf94268ccb2ebbcc5a38855d236675e99164f5cf1e06b5dc38a0a0c41579f6e187f722e39c93e25529e873744d1bb1282414bc8503b529b398cd2775b183fd69235f23d6c24665e17c46738a4fa34b2987ffbbcf34447bec131337bfe9a66fe99899e31de14f42f2ef03ea878628c26a32f19adf329ae69303414315acf2e136c4f2e9d0ab2a10029123b53c818b193ba836f5d75f2f1c6e1bc5b12ef88488c47b1b17ece56a6c3bc08637d24c565a9777495c69e9adac13d56dfa4674658fb7609779b8628672296fdae25a95384842eb764a7019c3e688dec99d477a60c7ec4a831c36780e16e3490f7ac861618caa36f40c0f6341fd98f7866fc1ff970c2590a21ae1a2ac8826e65826fde93f9b662427f8b1ddcff4a13d9ad493f0a9a07d544130632594663ef2766d9a7c8c724b0ea79e64808c26ee7c73d11fe2138208763cb80809226bfea262128dcc5dd1f95327c9309d175c075aa8652375b27730a8a388bfe13a7cad181cbcbd249ad1ffffb7e1cb886b6da2f4c73c62943974577bcbef54f6192663afb30e25c10c7ab8af1024ba13fae5e52cb1cafdad3209335756d6c1b03c5f7a83f00080ca10f8416469759a92afeb9315e723f5268ca9672256a41de2cfdb13ee229fe8f063996b0db790e7729014584f255ac2ca5134d5bd3ddba8c42cb3252e803c863fecf4d04eb5edff2a31936186522fbeadd5385d5ea303d04baa82a425431e8d7841762cf0250bb66dda1dad9ae5577cef20375ac31b09da1cdd0d25d4378183600855a766dadddf2e49cfc21b9229c04479cd65aa2e33852c9a5a7fbd914a892c2f8a87ea6a991ae71f2a5911bb747e8cf74a4d9fc7d9e9b1150f283b0ce9be749bb50111906f41510384284d50bcd3d6d6bbedd1e8bc92d14e785cd215a59e884e14f8892a5bf496fadfd6fd8f14d5989aeb027c071f442ee3cb8b3698db577f22f42ad5caf0b8f3e654f27b05e8cc1f0ec6ebf874a84abf9c0762f40f9e60a8da8e036ea48f9d49a7beafc6e4907dc9cd7313bd7cfc0e0902f851b43c820fd04b79c3846ee01463cce664b65e1bfcd475635e8b3307b6ce3d4ae13a1a4f86a906de90c5f35ceb4be49ac934d9206a579f6a2c5dee2a4f7ef2780598c1c2a9360bc8f0bc0bfc52d8a50fe5b966a3f8202951aa5ba995739e619a1945bdb25162f2c8fc0cb77f8d4b68f93f3497401f4ce6e7722258e6ec7a8865e97d4fb4990f21e7a13590014fbe9e16e15d3c3f836ae60c48a193ce564a3d3e14ddad814ff2b4265ab1128eee3231b5f92fb4296220ad732279e648bd90c88bc48e14782827937997f2f59a032cde4dfd501f14866ec45da3a89b842f03a66a231a13c9b0069a40e659e3c4d7e9486610a1b6f0d87abd3559ab5ad38c95393ac65c5e2ccbc20cca91511715f786fb04dc7733f48d42623ee4189c5d881e5b04d3c8c899dc04eba122ed28c94d43e9e81e2a36f2681192d502ecc65c2b899031c73fb3c9b5938091692a988245106024f3aa77a9bf480b38535673465e0b29fbbd07558fc245e0af2ce78a2b7b046993b9a5cfa8290c84457806a4de2022603646552615e002b0527589e76d094301004a982036aa1a2fe9b6e704f2f11c84c9b5c50a2015111264fdc911fbf661507364c0d031102a9232f21adf5c2c064aaf20df8659393e5a1c94c82a632f6dfeacb84fb495d094423de58940555c82632c5f0fdf68eb11fb78878611dcd0977ccdb579eb7a5b282d304cc6cbd2c34ce85fa29e9aba0c4da2b85ebbbfc26ce80104cc77da15c5a59a8444778f191518997bb063d164ea6da4ad734ce51c79200ad9c541d540f6dc98a558ba91f5a9c4886ae120f4dfe3a940bdb040e4c0c2a1b89802588aaf15f04b072894006b6f2964e0e6cb85a1ca4a28b047c1f0c5e2f5c09679563051d47f50ff628069357d3c475785cd85a6d46424e2243dc9f2b60dce5916b1c892f172fc50467085742f35e62edca45cea189f390a5968ce9748cd85d77ec1c552d93786b364b84bd12ef0bc68aa3c60c4f25c75a906086ff876a5abda8d4d9376abf820f6d313727c102d5d7b8a3d5e8116377ce11f0562642b0884850ffdd791c9c2da39ef95d10bb3741fef5cb32a8029d5714962a8c1a4158a9d75341871583a3c46106c5f9576a64bb7352bd6cfa19869a1839645f515bdc7b890f30e7ad4df472b1f9b4531775c1ad4fd8bc7f5d3c3e12096259981f42d3293cf90b9824cbd6034d12135d285fa01403ca1cf80d9d1fd99fe16587efd5a5924e757588ab2f27e16a45a6c4b30f459f40cb60621953c94766d618c03af9f5cec3475f13e03d9515069eac8c071cefafec06fea1b24019ebc91b77a669f7a30bca91cb462619477093b26cf8d24ab7a477a2f2910d4e23e519c85e72ee57e776697164288e24583aaa3a5b500fea04ead37880a851f00f26b0bd475171c2d2ca0b6eaaf875d0d8f6f788f47bca15b018cfbabb8b46584c9f2a7912598363728c0d2d85b8eb3baa15d41c6a6f7a40760620d8047c3a3770a7b706e44b2e55a2e9f444d9d7c089ad80767beef4c605e348c38eb6ef9172d5f6c1bb44b085d2660b955ce7e8911e314497067b7db6bb0f9004d9a4245301a991f6f975f7ddbe56ca6e8d21a1102917d9c9dd7062ee297bbbda69f5e4def7cbe9ce6c30179fb39f9306f32f160626dbefc9e2731b4989bb7fb09286e61b1367a35ae9333cd392e14a7547b73e7b2bab490b465e5de0b3b8a65eebad9bfd7a4a38880b4acee80037d9f2e8fbdae6695e37e7421db5ee81e50691f3675be2cb11fd3109765eef00ec1259d5ef761dfcf39407f19b19fde63a6bf6f926603106796286625b91774c4cc5329cb42032e6cf1183e71fe6296500988c4f48cdb917b09e4c199d5f52168909555871db8ee373bf231383b0f4bdfcdb46aa3bfc92764bd8359f88bf2d9ac20c237f708a6f744c3dbff7b9c6ebdfa4ef8d9c46d5ebdfcf8d9b51337c5b4d53d324c105c12b3760df5cff02503f17d169e725e9bdfc8457b3dc87c902d802c073977d7c3e142ec947772e094edd4a460292be268736c2b08bc6347a7dc9d05875f1c7751da4720e26e5e67b3a3d612705eb7050c6bc5137d998892e7564ad654b41f8516d8136344bcc920d92490ae3ab7fdecff475ec7420e49b8aa0e424107042ffeb715d555ad855c5d376922f658974142f03055f841147fd306e5b78e61ab90984d796bca18b64381f9aac0c346f8b3cd656aac011ec6a842e8728efd81b4a580ef762318370aa6e47339d0088f3374be0839d70dcd3f05c83aa67449ae125a25df100286f0542d6956ef2c3a8481a9506d9408349b39ee0ca8843f9402c49f2907b72044530ef0d747fb8802d32c06c91b64c0e1893b9ea5b822c8578a0362e990b70a731fcf82646d28901085cc6d957ab24bb72ed34a8f50458283b27e3dcd06d8135d5feaef84e882fa0b09ce92a8c9899381a13cf16b6d5b8cd3c85c4c68028196d9a7bd7317460a3ebf0f852685a215cc9b21a7e95b44ab79bcc83f266297be366825de73044397786f6661595ed4a533f49d601f4ee95de045eb1ed406b3d15aa5b2676099b58f289033f8949a15510f94c0d630703fbaae26eda633dfd5fdff60d6bc581f849bdd1155b7865999c8667c832080a9ce96d1c19a43f06e7013cd091a1d25d54e6c08846f1944a2c7c569e16e8780fb0e65b245f6f7319aa8e6555a83ce31b2c76d90ed0ad7aa6c99076b76e05255890f5128c987d6d39dec60e509f65f446d56f3ac540ce57388587dd2293f34b9f32a93b00c481c010115dfdd81a979c985d94636defa66da4e3c0b52d24011a384c4e6ad2709e9c38e13cf024231bace4fd10434b54cc29b23092346402c4267b965ec189829e587b82b290a660feb2b57c80a7bbb4f88db33540ba6cd824f6bbea25b9ec9097c5a206e05168437e87ed8c11e463f7fdbfe83d63c8cd8063180568a71130d32c4bfc6cd97275f62c3ad7bc6b6c2aae843ead5647c3ae63092e94a39ef911268ba92c5f469ac732f7b29b5ef14d2c821bbc62f6d3abea7044aca3c95390548fb648b36b106463d6004e347012715853ab1c651a18ef35121f5b242d15ff87ef3ee77fdd9d83e61da9d980f502ce3e806aeeb1fba3b28a94e7bb2377c91aa2bbd5fc64fa5eb19f600067e0b12c83104d82fcbd52628e4253ab36f70a13714bb3b10e3d20a32f13d93cd7497fd5ef281496cef057c21177d0d3621e32838715107597d19814b9062c0de4061d80bea6d779e79d5cb852dc51dedea2c9b1a9cf8579757d839d9e7ffffaa9b96cadd9a9ca9aa0d7a46d811fc6f0d59de666eba548eb8c9776d29f5fd6217856c98c3b7158acd798b1969a29ee68a3ecdac8f5b7610b60a213b24d5caefb48c92c883cce05d83001109edce44725c6ba7274944ce915c2b6bfe1bb8a567b3041d7f312869e17c03b0b0f524f8bfd25346be60ebc52fde436bd4ab52e42514e2882aa1d13af965e0881708e4125dce4748a2f8f9b48f85c36d86827226b9dd86f0964b323432851281857523e8b73bdcf5a7bb14f8435f5058e16b318839641cc857106d664d68e2c28914568f59abfd62115ed6dcb708f8886b2c5617141abc7374190f564b79905e81f532355910e76d84c535c510e1e5d808305e0732c43457bed86ac91bbe797e1f1fff46933b148ba8ab0dd6df0fadee7118697254bdfaaa44634a1414282efcd025cf349b56fa340635db718622fedabc080f012f9a961958cc54385e8a147031dcd945f8c3936d8a84990dbb17e13db20465997885d2414f9685f5c2564daad1b3347c38d9770cf0407a5e050ae482437e9ac9e88d36639fe2db46cc4d7ebe16e9d5f759a510d7b199432e7d003c8cfb322734de8f4dcdfa5a2c2463c8076497cadaa499135081fb190450e837bcf192ceb917c62c55284eec8824bd60227865e05f86a17e90171ea9cd690678638e6fb06aa802c23bf598a3dab3866687b719e9bbc26326cdb04acd04262e4281969e068ffde38a8961a4936d3d5508b62e22c5ff9d6f1fa677fc8430c6b8852e9b298a09d61af47a2d065858f7d20b49519d30d6275da1de510d51ca25a721e2952ab9a1f3917c4892c136a6fef22865650f92788c38c22c60abce1de030210ca91bd917904a5e8fdaaca3b095934b7dc40bdcc9e522d098842e77856293a78614ac79bfba414a2b6110214e7b49704af2fe6d36835e9f27efa079cd5ba048c4514233dacfea2854ef179727a05f12b44aa5abefb5a816820bd2a7d1be0798cd3a059c36ff04584a0a42cadb19a060395fb626c86800beab860fe3bf6a26415555eeda93d090d51a51caaa80e0a9ff27f93f1b9980d8b77eff13c0a14f30a6f2ad61ddd0e25ff716c5b141195243a26e853434cc195cd18d27d9f140e1eb8beda3ded0906600cd7f3df35008d26fde4a66b9a4a1421a4fdf66696437b15e3dfbf4aab4bfc4bbdd5fbd1df015144e253f0e8e07741e88f90f9905c3f3f7ceb99b6eb6c80e7af0fc21da08857c195de0c8fcfa2bcfa2f9b3e31599fc0792dc87f2e1594d69962f1c8027f67d447093cfc5221e8c7b8d1db19f3fc343f534f538c9f80c5b2af3f98f80beceb576f66702a4b5d2ffccf4724c1fc6a07a8e56914d90fefc10135a2ad8601f63c5c87edea09b4fb2b4050af90dfde543a4092b0114ef098de3393824a65e836110e6f79ff440b62aadea69b0bbad6a35d788193f02c5d6c8ad97a433d4cd3746ee5c87b39674d71a435820c64fa259199ae9ae4369e87beb15f587421c33311bd2bc534b141f04750671ef2a91108651336d39c35df6ff55909ac66003496b1c4963b12ea191f66b59a480002b1510604570f90d5ea59bf8a4157d0377e2837b5d86b5aa09e02b12129cce74c00e125c25239fb35dff5d89e8e83e3bd701bbc1efa57a80242007e5d4d5275d66442021909f1d8a1daf1fca358ead9c3e7d45d5c64684b63936fcadc692f326e77ba363c4e6426dbeb7581f25d8be97336f0cb0d1cde130d0100fe979faee49fa2043dd4c72d9ad7a48da446a00e50aeffc331b2249e1eb7b496821f3097340509e2639529938b991dba27bbd17ae4a97a3574ebd0d60b0c32e6fb9888c45b12023f5c7e286cd3ad93521973881285c2b9614b2fdb7a7e212c0551f1c5918f50206dd3e0426bd912ca7cbd08d407e7fd531a9dd83e02160f58a8eb0f45a991f21517d79a72a057093f6357eefcb0d6193a0d9e70ed5f7cfd36fc8dee9de9d2f9e76d8617f123b916d72f629133176a57304eafd5c3feb09007a0df1fc5ee62a2991838a2367e1bb4751f46cc5d7373e254933dd802be8a875ff7d7ece68b32873e11e87eae981eaf4788c369a2c52673d9008e0d4fe49374a4765faaf2e287f0d2d7a4f3eecfb2502f0ffd5d1e76547d6d9b85a763e9e659f7b32a194bbf962bfb117e9c5b35b87329265a551b43c3b6e4c3d8d742706a01acb8a3271a2625bdb4460db44aca5a88963e6fc38d6e0e6351ec52e6abe945ce261e749e8adb313ec6468d5a263048b0ac4f1985777acd083eb91ff486af3d98e41e14a64de8a5978385a4f63d121e24dbd6cde4256e1563f8124050c22d0454ce16fdd5010f1afea0309246966c3efa5ef973e16530dd7ba234cb8784d456561668005becf4642d2e6ebc852ddaf441f13cbb1e0d98b32eb88f572c36b50ed78e5dc9c70f70f162d2499a33c7feaff8070d506a836ec2cb0dc885711742cb5acd46c6460dd8442cdce1daf46cfba2403f09c0e08631982004fed6512dbf14bdf6cfbf71ed74a95a755d56175502824cf6473ac6f6ae42c8321f3383baf330452008c091d869dfdfad83973420b0296fee53e4753611b442d7da02d981fd29082c3ab0541b50fbd2fb68e600b23e44e91ff20d4f613e20317483ad582b0ac51c2394e756019a8f03ceaa93adf99c13d68f26c52555b1e67bcbf695efbadccb83a8f48cc66f82b6bc9daba37371322fdaf2c0a46dbe9076a90aadad05574d14c3d1f8b976e5ac7d74a4f2468dd52a9eaedd568703aef6b0d3c6bb8d7dc98c09c6301ab9e53f21785e47744526cac79b2e9ee35dbb1e87a57f7c7faa5bbd22c6223d1bf139bfd7b99b23fdecb3ca6550471c75632ffb1b3db4d7b64c496312b20dbfdcdd331e859c99248462e6571c6ecfeb19939c9b83ff12080948c31dbbb952585cf372aa4ed50f576afd80b98043eb53a11d02752a007b791995dde0d2e584d91b3beea7de58b02ccd68556b744580174e8cb58cc0cf022f31998f94a6a5c3b3f9c72e616763c9f4b79799d96a217d630e1198514d0356d982ab6e083f63ca7a307dd986e1644c8254a8ad0147109484d958d42d3bb4aeffeac6ae7660b16943a3b9c6165aa912f7dec86e4651fd5cbcdadbc0d33ac47c5d3aaaf7638f13878173a170791402ec65deb8cae704f4467c1b0362e9d6cf490b8a3899e88ee279b11a4a24fc82649ddb897c7ae50ad8fbea2a641c8c2b265d1912dbbce16647cfc07a0ae9bdd1e7b88d085756cdfa06d00ec1b75d1ad39c7a6612292eebfe8965dc78803a85fd4cf6edbe722ac7d31106b1183930ba293c750f7140a2871f2281a92aed9fcf1ee45be4556709818cefe3902cbaac82c0e322f842e4e5a2290c101d91e84c7d7b9d309cc5ac85658200057823cab5b5228741b626cff72e616b3182d08474355a5d932cb3567bffbe6d6872420ba3bfd108ea2789ad81ca4c9da11a45747aa1bc577a2f340a18910c2e7cdf8c92b0ba6c9e85fbfbc98c0a9b7e0e9b105364055e216edfc03d911df1bc78af46f39868e307aa4f847b0a0ea336f660399793298421065e6a8f922b4fc1b2028021476d6297113411741ebc04498d4b14bb4f0051f8ada5df289f5a6eaae0ae3ab3cb2351571ea6bdc5a5c761be7c5ea8acb20f09c3cd8190ff911e4cfcf458daa45d6020f88f988b3c98211d4758345d370c47a6c6a2f2828de23a70c4b6baa5fa068dcf27d4a39c097f1f0579b2481f59beb7bf31ed8503027a51ec505ed3436ae4072f4f5217d55bf5052bc53f77fac62231292a3be00b8b0d06250eaf73f39a41c6a5f0ae7cc66049ce28222bd0f22fe0654dd16e864dbacced60783ec2638a68b45fc9c3cf9ca162e587c1b35423d5e130ce0669729c9972c9b4bd39a0b386898446b43e00c27e9f0e5972cc2c00fef7c4308d31c49f43cfcbc324e12ae89b4547b84872160d006ac7c457ca740f66fda6bf666003a1b473d4859a2e5ae89bf0cae69e9c87f1f035526392955a1e1284454475075be76415017bfb4511a41190dc70b4013f114a09c1132eadacd92c28b273bf4617c7c19d129e941d6d37e14d1f0ceae5040287b9b78c1085b301891c951db39aac9c5833ba8e793b82b2ddca07d4e513758b354cb152f691175bcc582de57d2d3cee8d831c55b46e572962881e8e45a6dfd9fc11051da1b64d0d88c3b52301c1b8c16f7688c5ab2da693fdd408d2640ca77eb1c7a5da00579924496c22a49e4ba73282a5a37a227aeeac70cedd7437e10c7ab8333cafd2b8876fe41b9f42408fa3bdf877e4cf05d807a521eaf8ebe8b29a871f4878baa63ed49f5ded6979b8812ded606de615d9832b0ef0b2f0fd03bede551fa60cfe324d6158d80106a9af52cf9731120c40d1e0d144fef52181c1f0e45bd8324f57a6ba0f7b221f8d642971a81276f2bedbd671e5e59e8abf7b6d807250f18c8b46742e0ebbaeadb6c337b839243e505a44fc7dcecddb469ec6d1660b9346a38b7f4995ccddacd36de4723e4509900f309454ef04c969a1130dfcd73b3b7d926f6163039a84c40dad796b9347b1da2fdfe571946df338abd11694470e79e51e16ce6aa52acc0b7dbf1c127d93b235bcb0294afc4aacd6cadfdba6a7c7bcfef59b6c598ef9a3b3fbfaf8ea3a506e3cea8fbddefb07cdbb82b9bbddcae9874df0da3d99b61937b4be8724a1e976cae2f5daeaf601196c27cb50c7c89736a3027cbd8d1ff9aebc4633aa6c3930720e1258aabf5df2f4e8f3ef8d90b19369521a887618fcac878a86afc51b6d3dfd10299948320a2e1ca475a803d8b9e3e3f46e744594d6592046fd212f9c886e73cdd21628af2ee25f9e17161c8ff85e5b35925c0ea4cfdf6bd45e2c3750499f0547386f3254ba7fd07a4faeaf5223789be11d7cdb99020d546daa8802fd7722de5ff0411faec535162a6d1b365c097fa06fb4dc5c57a41982e2191a2fc6c4a9406ac5e10d9c6f9d90c2e68fe7d5ca21d2fd0ffb0b61c2592975f4997f307dd1d381431b2b702b461f060a7372d8e17fddac64fbc8530227a07ce38be7bdd4ca9fb6f97f46d2fa046cd3f8cfdc234358681f9711ced1dbcb4d28fd50cb180b5e8f439d0954af572c68baeb9c23748514a5174c79b3b5c751720afbd5dbea4686fff7ea2da2d6cf2ff2e9b46d4b3ddfe0ae33d8c9d958ac067b4e52cb2c790973c40480ccc949a05e621029ab18c4f5f055152975e249b15295f60376b611c779e5ece3977f2be369af8ee365cf27bb37460adb6503e0445907c9963d2fbb44ccf5f739d975705b921c641df98903b13bd3a2210e3b00948621e0d72954737af68e0fc0de884333ca1c40831c8b124397514de1e8b950893d074212952d968abbddae954572be8fb7c4d435d5f9d6568763126fdb0be439895b114869ec8fc9e35bcbfc9af889c78c87b3ee1bf9aa7029be9e2bf21e11bf93d1865370d6caec5a6e2b288022a2d480a88208be5b3f53a0c16f1b09db86641fa722c2b0e82c261209eea350ccee377a86e4e4dfe6fe8547bf2b2f1f20a5e64de7eb509fa14c1e088870c17f64a46077cb209d6767b043b22a2fe9159a71225959de22c35c8495aa2431c7f7987c6295fa11f511e32c3e3249fbe00004493797596158659827c217840c18ad5b723d46ff08fbd24c82ad3566481bedcbece99d3057eed5d857981756d3b7569f501d36a5038ddf968a5496db3c191b8332349876233f21b700a6d648e0a5274dd40b7a51dffb402077360104f6c214558b527e467c1f13b648e4eee51cb90192998f5d771a89e3ac4a355e173fa838a67ac78bf8878688bf6a0bb880dbfad9a201e371553828a7640516785536224d5c091030c4d01b4c2daa084cdd39a403e4040b7b72aaed79ebf1d390b5aa4850a79c925c1035bdae91d2c666f6fc06a7e6a1522813e4e924a752542a457d89912a3ebd75b53c4a7f2c8888eb1c258f5985a2daa77d7487490193e231699968dad85579271d04bae5368ee136e39657257ee2f547130703c0fcbbf3e1a3b1238fb7a248398c5d7c91f305194457551194ecaec47f75a8247d62935b60c8dfc080380905e439950820a5458e284d758a05f4720a9444a3a09664089ea3e6b061840adc0eed061c1f11e0504e182319f0332184fc856e68e7ca2b0168578201b94eca436634f5d5668292b6d8f1b565c50498b1d321bd820fd3b5a047fa366da6f506cea379a27205b32f41c81e22758e27e0f69230a2d38f44ab8664f45e6183cd5c8d16babd609150d953f6c2b6a137592b356c2012f66e08e1558e74aa78d5f7f5cae9abbf5aa2a448b3fff709d4c0116325a2fe630e98abbeab369a6b302314ba1d6cc594023ea9f68e128a822c96b7ce6d820a55ad15da6b183628ea09f10f1627f7e1415028238652cae49722073f58e18975e7b6bc600f4e5683e8f43226fe1c9dc17ba33e6b8e362680d4db4ae985554a33567bf666cf35d92da463857bbffc6aba61f4d0c85335a1d9c0db3587ef3acb2f96d605bfac2d5ce9699b5b6ff3bb490d530b107f5fc3805b3c7994a0be4a9734a0a4eba065a41793746c1613b3b4dccc0d0e4acb4cdeb938165f232e78c23096b546a9acae789f94cf7525a5a523b68e98a70629822f3dcc1f126859357582ad277323d27f9e3b013baf7f3afd7c58372d76aea9fb460ccada14df5f4518e39d7e9b4ddc23aae53849fdecf93e97453f0f84506863b1fd6764fe3b49339077c2bc8a359bc4459a2357969d34982c442e157230ca942ef58215112989224081b2f8ae602d37b21286be66cb8d603b224544ece5286a4e1583cb9f3d14287ee2f24b7afaed7017a72d4583e9fb647d04356fcbb0406be81a7e1dc90770debccd32c53b0381f79150099fa9cf20ad40069f021147111eda348a66dc0c8dcdd1977921114554e6d32f14cdc1088900b3e3c1d38dc368158dd0d8a630e83baca036a76c655849dd547d46dba517df6c58726d87dfcfab6501ef2cc1ff271cb793cb1bec9bccdf37d2521991d8e656048f7a630042ad789db25d71db150eea3bc16ab389e16ee6e5a3d9ddc607ccb1fa478000fe4e47e616e3ba41c4dd5c1d2e0502fbc17039f8cd008b6442b4c286dfb7a29481001c490039a4b327b59208e42520745a71715254888a73ec979b2fde52fa6901276eec1396e8ae3295b3ef9a4246921e4f57ef79423edbcbe8f2c69cf99e781c064531a2cc42b6a4e63a12f167e74bd9ce82e4da04c5e03f220b6c9967b6f295392018b07da078507b8a55b923daa2e074363aa06aa2eafd59a545d270afb1ea7f2e1e6b04eb5ab4dd93f0606ee19c1330f70e5ccde2fc96637b18a569e73728db38cd86cb6829ccca7966a293706b57b6fadd3003d29cc4db43645f6f7bca75e8b51c114d6ca421ff55d8fe7794e55e58a385fb240e2214ee9ef4dd5b563cc0f6b54d145132329ca0daca9d50006932d9c805252296250e28c520ab064319303759dc66efa983c262670f4a515302dcd6eea261b29dc40fe55875570c1240951e3a296bb3a9cab7fd254ee39cfe1b0b22bc32976241f1f9f9dcfce7d6e3e5888ddcdb9dd1e6595951abda7d59533f6842f7ecebb3f929e30f5424e9f0aff34f6846310d4df71341a7352754811244450d815b99183d2c026bdf504115259bdaab987d430780d754abd71ee9bb5d6598d5baa45ae8b71bc8cec2f56daba21a561bd340429a52105e98794d29567f0a2b0ed6b2f0d65ffe475ed93bdaec2b105087c4f731fa84fa7d3a95f3d3c889630fcbe0f09f5e13edc87b3d6a2ea87fb701f1385a5be2bec9b5fcef35b9124fee1729feec37d4ce26d5bc62eb95dd2209b768901f5fbdd1471d2bf9d88558e2c73a1b64bdfd287b34b5f9a0ff799f9943edca794bbbb6badadef0b4f66b0c0662b83dc62ad35c7aae5eead56cb36018e99e1ce647ff149833d03c1bc20cf5aa4ae07a990f5a8508df56820ff00b8c14a188101a0ca40a030ff4c633dec6f515db84b9b334c11bb2b50d035daf410868630362f5f9425c85531650a9b92952b965c393344103b3668662a28fdbf635d344b65f37bccbc9e79b5aee853d8f72050211908ee1750d2dfebe884b2fca3d09e82925050d2adc0e99a0a174f14f9e903880c77fb3cc77b1166b035331cceab16874b05b1ab65b4eb741581755d8180fe1851418d5aebe974c3fb1501010aec3ab293946442c976624198029be42ebc44391284ab109c80b2bcc8ac9b18c9d58610416117be49d710e5c44fa1ac45a1ac45893e2d278308297242a352a95456707dd3a9caf10dc103bf0ffcbecf476583ed8b482435c44937005007d485426c0df9019a0225fd81545708869ca65196a39aae066469e9de5badb5b69b4edbb03133632b95f49728a0d0a1dcb1312601b32895f49051ee380ffb22d8b510561ee85a4ea1ff7bb157b56b6d11beeff1e636271da929558b6a6aace7d7c744d4d3dd3809c70d85899f531b87d3d4fa3a8f31ca86578dd359355350187c5d25a0ac7e26d7098e92bbff749f528a84fef47b7f5a991be47034bdcc7b2691aee53af2a090b079c4cbd7496bedee5e8c55aadfedc42f72e110f8f590b5f796a032b933244460b36d4cafdc22d07cc4878e3031b9f15a6b0301e183c3e63d834dbbc5096cde267cccf830b1059b76096cde323a2c29814d9b041925247cb4f88cf111e373f339c2c7089f227c88f019c2278c8f103e493e410081cdfb830ab069917c8e7c7cf0e9c1078c4f161f9bcf171f1e7cbcf87409b38f260aae11150aa524595b22d26e4772c11e17ec3dc905d3f1e579efe3ae23bea2311084e057d44529a8fafaacbcd329c5152d53abd48b3939948a4c7fc222b53a569164abba3c058e2ada2324f5ed8c80a15452c768546a4bea659e33be522b997873a7bb224790749d61ef65be8117f82323fbd722f4e70b6cfaebf3d6e4d0adb541af5d115a4ecd6dfe05250ed11fd43854877c4d1006576093363512f35657ce3884aa9f389ad44c12277d09dcada13a2239aa69c10d82e06d9f16923ba367727275d7716f75ad58b8a5a3475913b83e0fd8fcecb9e2ea19878669b47b31fea72a953dd1685516070bd1b0d9389c0882a0102fef8b1e0d38270423fae3ef5528cbff820b76761a476b9c09b6bca3d32a0b175493a159fed53dffdc3ae8f741fbb957f79387ee417c07199ce7fc5de7ef4cfeafd7cbfbbe8f460343dc02d32c2a60812fca78732add8bb14af58f742fc6ffd4bfa948a05d2d43ebd036a829b9b45e2f7f7549d38c318344a9c436a121c9f843c9c257a2462fe29b2a2a3d458aa3a31bbeacf6d4ef235e16c71edbaaa78e7dd45d9cf41d36e03f8a9101c30e6fb46c11274ce94d676c64dc208515326a4a8fe1cd520e67989818a334a187306848a1858d0e4f94fe4540776f05a160f8729f16b556a4aeb95cae695d92ef3f150cbe994198458bca89e1424e751df3ec6f4f3ba3b04a73a1cf32a11fec7cce9b7685376d0bd99f071c7cfa5636e362684c47e8f390c89eab9e545da934ec177e94bb81a98a2a8a3b6192c9e09cd779b37745a63fd95158386e49bd7f37c139d3a0b1d3fbb719f4839d7176cbd4fb1a09408d33f28c1e789cbdcad49bfd26fbdb294e68ec34f6b557ec0b95d27a5394a64ce852a4823faf7e35670bea6b0a025ea25ea462bd94525abf9c70043bf608f14a7cc72d784ca2045c89d9ac39bb5459494e5adc51755922dc82a1404a47d60720726a658f56b656593afac386b28c7294cef592e8060ceea65d9582a9933992c066cde572b95c2e97cbe5320d80127049e829dced0824d565adf5ec57ed47c1fddf87242582cdd1c6b39efdac9733819b23a4245b93ed034110a43f4d486e6d2a6a65e4c8ad8d5aa5eae8f37d357f5e4d91e50bf45379048a860a1a3e6a452babae442af4dda02eb2fae8c90da02450d29facae0750960369201e79014a48e88f7f51cf4eba44561fa9174895eab5012cbc4a71ecd9310b82017f0d86b26cb6a1d702ff0801da80bfb18784fefa754ca17edb1850c79efab44dad892fb5245ed8428c19c80853840e616ca96ebb2dd9926c0a049d77248159b0dbe1490d4d7081c50a25016240438a9a35582c61542615f1429a3662d0480101706cc29899d16931a2f4ef82e0ad3e2ddb0e0b177423fa7347377296bf1b5d376a266c52a637ddc89589c696932f193a56816820a7523d07b928ac5d4343d5559392983c6badb5d67a15fae3563a498a1e703be090fd732b1ec6ab5098e73df80e8e831bb9911192284e9874dbbed8477723374281a961c9fe22520917ec5a75ddb10467f9df7b42dd5a29ada9143da14aa81d51580e180ad66a4d277af212de6b868931a4a89141072f687461e60ad396233452a830b9b24486156630a20b18d65cb19403163494c6287dc922841a9a1ae70d64685840293d0b27665841131210649a924ec0744607242dc060b95181a2060c63bc8872c6891a32a4a14517169c91050423ba685263da01b7d4001e54d832450a376f9270418b2bc8b090061ba5282ab0a5694b0e43c420c54b115378496309da121060d8925030424b183eb459a14a14a53f9931bc2041e5cd1636201c51c999898109382b5ca1c244166378d18316a5dad1c5180a2660802a95192674df3fa8834792d8896db5a050a1cabd18d7ffe17fef136de0e436bbe6c34999933f42d4c0f0224e52153158815446b9648a99a3a2315378e1c20db5a3dc0d35fa5373a20723354fa4f0814ab9e4099ca52a5dd09086132f9c334a696e140a55abd9dad885470eee06dbaf22da3276bbdd1377ffbe5d7571c0c18e03fac30185b9d7bcdb511806d9a5cc40856880d33b141ac87bb7da612118b049757d545da8ef40d736717561610852f8c0908e9d46141ac87f6c281e086f30389e21020717b0f8a2e5484de9efb3ea5a02c60c2d66be88c243133894feddbd54734bb9a5dcb7b4f4e5fe0906bf7e43c91550b2d7c875ac773e8bc29be0dae46aad13c349ff351f6d9a9333720004ae6f450e4ff23fc1369b1c6408a05e448db8b2b0d87577f75777bb5d2a0ba73914ac83a23f23ca513a2375944dd10c70d05c9f301ca69515be0fd4d52717fa850a7d9da587c814b5126bad2894066084f4a73128031f113514d425ab2cc775ec090a13a915d9bdcfa2faac6d2665268b7764e607dbf9663a557b98a9ae3eeb2dd7e77994caa93527c75a142aa7e634799a553fd15134188d6b2c52ab4683ea27ba0deafd1bcda9c168355d45e34494783aa150a714eab4229d1c1212e4404e4bf94e8e8a3ab62f47649af4a5ce9b00e8316b953a6f6ea0d279fae2cecac6e3559776b565e77556b35beebcb79cb496665bcd59d192e4826bf78857363ea7a888852f739e8556a9f3f8f1aaa3501e4e3b309b0aa507307b86ec5faf80d4d5359d9c959736563d42725644b54708fe9cc7235165798f9021fd780cd2d3a3095eeabcce8864ecb39e6775a9684d9da7ad7e136c77ec2320f79bdda2b1d3f7dbf0cd1d03c88d23f76b405d40725021f0fb31a042dff7dfa0b1131a88c6eef7db800289868209caa2194cfde8d303f1d1409e1a4d8c1ac7b1eb595d486aed72fe4089a72c568fec22e823e91891adda725d3c6390017592838e018002bd32b880fef8ab6c361bca718079bd5ed5659dc2b8c0d4c92f3630c4a4b0efae600d5575f56ca69aa966aaf082e0bddf77c14bd403d6400978a26746643c0061441e5018f8c412635e2f27b31baa44217d5a2f9b94e621c5f3dc1dc96fb7effb40508332b067330317e3b75b06b71b851520d3a65196ff454385902351587bad15a459fe4528cb5f4553558abbd8c6630d6cdf6fe50a581c93784992230b304dd8dcd6751eb67f0b369bd683054d536a5fbaa9c126ddd99d096829da65a04119b8bb64fb79dfb46ac4054e092428e94c30d500858f71dff9ad6944348d8856ab653dcfbbddbc1baed5b030310d0d31310d31315925f023d34a23e4d67ad38095c644d3d53a0674e97cdf9edc1a75abdebddebdbdea2bf4c759dd23a54066d790fd1d0bc905f7d8c3c9efe3825fcef2ff7e28903f10aafbebfeba7d7a30c1669d9263d25bbde2ea23af42635328ec7b57db1c1cbb060a44850a75150a8e661bd5fc8d1da3828d8850584d6511ba08857d6f9489a48874c0031d0b8bb0278651039981c906ba914ee98ff844b95bc5b9cb13224363b206f22b86c2c0311d0b29ecbbe57c770af5ea71db3de5f4d6b812b989d19f4781fa01e0f596720cb6c09d61621a1a72cbe451d7ebd5302bbc0517fabc1768b74061fd31179a06d50b471f1ddda397780ac3d3e9de5378eaf30409341005689ba350027d7a04282c6c03869aa1155440292c14230498f0ded3fdd3edbb6a05bd86706293914f124e2035ca1d85da15e9982afbc7528087509c164ab9db03c00ab22174776b05bfbef909c0e03709fde01339e93914a8e7799e67bd342a4502e52283ddff29125629f4571168aa0708cdde8b40b3371ef17e040dfeb7da7247998344436467e0b367ae26535c1082065b1561ca1f4c63e2f0d0021433984aff0010800ad9efd8090dd4c1152f3ba1d2db15df870251284f7642134b8dc210a21dcd15f176457656aa164adc5e482f7f4f2737044465ea52a9dcb41012fede5481e10dd2c205a9fdea57c5596b6bb5e1bdab0d6480922950a2a6156080467321f53ce7f439a25c4ef4b4104fe2a8aa46eceb02eaf232147cafaadc920cf86653a5ba9ea7aa2ecfe248de25fbab282c2797a3b09783d1b1568b471c6cba18bb8eb5a130da4c365babce145cb4109405a63835703cafae4c329856d6ceb76c5bc8cae2e10536db66ab76657e08f86bfd3e7d5de5fcceca3ce2e19579c43bea417d67d4a7563da8980b38fc53cf1d3b4bc7ac6099dbda3f643e6e752c0148db88aa8b963c5fc5f5951e2ff778020d7726a043172f9b7da57efe7e18f9aa0ff69d14e4b0b53e241847474747617874046b02bf7ad81b9e44f184124f27510c43f12486a853783a8911024c9fc2500c5f0ce90f19f4ea819a42e914d8e4a194f2f0f0f0743749e256a8b5bb918282b0535048eac51792f3a817aba5322ab0bff831f15481532b191a6caa6451609348fd7e337c1210108623913aa64084aec93d7a80943d814df28673643328c543076c0f407f5a4cf88534196303113b6c11a28992b279020d2c5f14a17173532e7122c50a59ecc26481a3c502d058a306315cdcb001a2f4a74b41404ee09bf70e34702b2ddd8ac0b65deebb37d999bc89a18398d0ea244a155114cfaa02655579534fdfb9e01f7618560d6a687a487263f321ac8de44266cd922d15dddda9fe9ac585288e0b2c6b7010d8ec1bcdbd858ada12d9c553dfdc75e33ccf9309cdb44c1aa32e4c6598c8c866339581224b367b4deb7a770a6b1717a2659eb0d1324cb8ec5deb0fa92d649a934fbcc8c9d39bc450967f78772ec8418cb71be21db32e2d85a7d3e9a6638beef0cdd64d8dd4c97b653ed4348f22c5510a4a250910233746894aa5526392b6c2841a7b380f1faa4dbbb7ae7a38e91e5020ff18fdf1afaf520c4a7f287da571afb50ed5c435901cf533a0503d6ec0344573b88aab4381728eec4fa4c808d4a5a26832a5826e616d7710438f2c5b01b93ab234401f406449b793e7d5ea79d56bdd90fe5c235bcf46fa16265b6c1d80ba184059ee819946b9e7d96ce5163672ffc8cda0974125846188c9fe5c05e7354ed227ea7fa90ea0022c731c17b36cde06080962e4880914c84b70726606046f7777ea823ead13d574da38e77922352ae743af2254c37ed6abca26ca939c3c4f0ae3c93ab9dd7895573b1377e251a8ef4c400b9c1d31e06fec22b0d96edcb85057af9eb305f59d824097a8318992d29fd070d36653b0f918c482c0efad1708822f053b13cfdd0b7f29f8948dd8ea4536e2d9f4b3e90d6e386e9c0c9201876fb69bef87cc6f50f9beef7b29f87aa91f37a660d34f307543066cfa596b8e68250617bcc867a7d1cf225aaf27bdb635e7fdc4a18568932af4e74c280cb4d9bee93a64b7e231f82905a73cf7b37ad1cc497fe22c7fca4471595457a6d4d1cf15e0f04d3f67a0b5f6d67a53d75efa13d29f5301729fa777f28821426aa2eab23667736dad7b9ee779f42f407336e7830caa9ae5ff39b2674433609a236ac2a0fdaecada1e3dd7cb9efa6155760cc1bbab0f851edff892f51022cf06c1795eed762f58e644b95c2e970bca116da9bf1a3be66a0faed22b0c4c1bc87eadd547754649c32490a5a5251e1e1e1ed007c80f1557cfe0704182e07038080e57df445113280ef7010d1724280c9c85580892cae6e3821861f36334e0557defeb2acc1f68ff1beb7b407aece8a30427f38e33708c16b382bf5aeb791eee7403bdc9f22da343467ffc83ccb8d55a6f32ec4f481e175f0ab6d9e4c93c9ee7595b5f0af6282ca74f01ec6e4bb6249acfa411ea796946e70c894714f83c45b73b13d05214441ae99c5a628497177ed059f1858c1444000c1423904002892e9a28971cb94903a78718c0aca04dd9b3e484142ea039428d1037a860b3cf20d5e824c9dc69871a1677777724aa126b90aa52e1d3450053136e66a5127f41052aa5f8497a90b4944a74be94e2e8e5bea9ca2c605c0c067c1fccc00a361b4b9093abef89cc04e4fe5a24883686d1f53cef35fa9039098e3d76d8403424c810b5965afbb910b02b920429f7a8342db289ca7eda85d1944daa0bc34cbe71b6276486ae7994b5d63280aec9b8204be8881665bf2f0194e57f7bb8b6e01ee05077f7bdf7aa545f96ffca88b1efe9f0017f362b1601b480cd8a25fb7feaff1b4d56766f340f90dd8ea607d99f52caf2ee55ddefc130bc7dbbafc74578de38fd41f966df795617d6e101075fe1d636b9105d23067563cb50afae9db74cd92d1a3192d6d894ece9f7afd1393b4f0a9b754c749d3755b409f65e8c7551e1e47235a7dbe98c6eb24973dcca99aef0353af79c91777196bf57a16694b2139184e47d7bdfe94655b27f3d6a7280973b23156cc2ce770a02b6dc199328297776c6eff49a3c389e9beff4dce4effcceeffcceeffcceeffccef0d4f1d4180ebca7fffd908e7d234f03790623fb9b01880d094f4fff4fa757791aef063e58c0409cb4160c52024fc77e50207f1172f038a3f46afbafa269d0578faa6aa48260e500fdf1ffbe4a4d1a075a0535da0c51fa412916340ada846e88d8c2cc5a6b47d9ab9ca4f48768554e52ead4d54e662166029badcbbad6b54ee6e410aa73d2c5e8990747605207129639d9dfe7d96e6b4d9ed9ec0446b45f6a255bf55e8c55aabfd97ad96a3131911e94fd1b299fb8b3f87ddf23f1be8eed4c204b96fc7d9036b81f14cd2db35b26e938a5cc79f4a7e08348f80d387d8bdf1747e69f08e05f93085dca9fcc4fff51728bf8e205c5950a5efa8b8a8a66af52fc19598a5f345395e2cf6e297e51110bb76ca2d3749eaab20908e73c4bf18b5820cb26b50567297e6dcb369bad6d17acaaea3ac104286c361e1b743a9d4ea7d3e9743a9d4ea7fb4b5e1c5975c94fa7d3e974ba7b2f8bba3a0aca722c6e9a56086970d07d9e0b5d307cab44eb06b24aeb3e53ca248d548905dfd1939c08fad34342b6e391cedfe836476a33a2bc2a3349231c5b57595cc8ec1e67f3d9b4ee1de7375fea1be80782a04ea7a325030f947091cedbff8c8a6e093929940e51757580b2facf60413f0c8ffabe530614e6ad9c566abc517b519847d5ca697009db9737bb2143aa0b0765f9e3c02123832fb8145b43024161694d185e30f450e0edae857f12ad154f635f3455eccab8dd6eb7dbed766bf9ed76bb5dd55d22bba8be493a19f4c7dfb6b555007eabd5d6f62532d664264aee69babb9b0c0aab96e2d634712158f67f42e3a146565147437d6c5357da8104f6a55b17f85629cc56d9620b366ccc30e346a7e8db6d7423314165a81215d9df6badd66b9d314e21088267ad94e55f7120ea14079b9689a9babe1204411014751c575375019d2c45c155b08a087e7d101cdde6471da881ed683ae579f71e3c29ec051e81367ce3799ebafca39d5e068be36cbccc6bf6076b9e03835ececb8c703ec2383e47abba3ae72c7fddce6f153cc1139c75ec890bd9cf19f1088e660bb445e1dff75616d740fe3956f65ccdb2a5993a4e4b32c9a3ec353baeb952a7541afd795267f5e459b9aeb2fc0a67793d473f02cfea0a0206c1a1f123263fb231facd8db209de6458b261c3868d11fcc4e0ef03a7f8401004c1133ccfec20789e4eec369a049161b3d9acb5599bb591ad02f6b269c1d86c960014f60385f5a3510210ed2a4246c579914590ca92c26c1b4ea29dc8fe423960b36dd816ebf2448d96da59dabcdf390057409c1c91d66093ee38c0827de070d65aebee5f4753853a83f4c44110042b8d8de0e60f360295f5ddea080c007095875058b515ccf78708dd804d9aeb40d8ff4119a8bfa9888c140e75f37ddf0647e00db290d37724095165e9f2a9081099931db40013a1e02cff1e1deb00353fc823111f406434a7eaeefebe0ffc7c52b37bbbb77bbbb77bbb372299f7f77d2b331604fea8b5161ce132c96be07bbfeffbbeaf7ed5e7263bb5c8699104fef26bf0c3165a705aa6e8c287d2b550214c181ac0ac61a54ca3a8056cb870534599334a326f6c4038a981862f4d4affa639b2c0e67b5970676200efbd97f4f95a9e19d59ff0f0f0601e1cd4a58190c75aeb79ee3c14e6d6831bee7714d0e01e41ea33bff910d97de0e25ff20e5ecba1b9102121c5b1c9d694081b6493076719fdb10f044978c7169abc4059eea71bb91457a1c96d576a467e1a2169aa2d0465f98bb965d0a83a298715d8f4d3cff374f05c720e31c31632d2ec40059512852c496b9cecc46852a6741c5892988ecc9c5181ae04365c86d021072861be94ada033c5c53fbd44b2210d3c2128d8ec9dd946650d37e5c826cdfd28b1e0d6b518465ddb35d19fdd0e776a1287528a31aeaaffa521408054172d31a618ab9610e0af16262f75b5d092dc2f1a9030d5006fec19a1dfa3e525b9f6f92456753d6946e7ccf33c4f7442ac3efeaa1d17e5d3d9bb281f1c3b563aa7aea7b74d7f1a2443bc50aad3eec59866927567c7fe92d2f4daf5a36a94d35dff7ea750ff8e66f8df8bd4c71bfcd927c3d40fef711aec81c66553892da7d01fe232f8a6125b0e5170e393f408d9791bbf33aeb0a4e4791bcfe33b6fa35096bff8e6abe9a23a25428f66e36eac92a0c00a1aca9437dea37953288c4661628f101b3c6fe39794385ee63bab1e213bafe3758c4974883cab9a5b555d65ad7a84e4789ecf31d65ccf7d9ecff13a563d4254afe35563d531f6dccf31da19adb2ee688297381ec7589b464bf39ce57f2fc62a55686d280b059b366773d5656d3797b2398f05d8b436efe2d1bc1ecd96337a345bcada524ea3629c668af9714759ddb9b1124119598c4a1b2b5aa256467ad52402cd46eedbf888342edb9f029b64145cb2fdd305dff468d70b575e14fa732f48ea701d6916e5a447f3683a8ecfd8bed86c365babda5cf55eda9e883cbc6093ee28a5b4d401d34c349ba98870172dcdf4dbd48f1e2a6bd8a44ca9120bb685756c2efdfabecf6613733b44419778c86285943656d6e04176861261b8b88196c3130b854643a2f4fb3e9ac5b5e8f4a6b5345ac7ae513e8b320bd86cda8bdeaad0a51be8193847a1b234d8a44c27ed8eb4972c0c9c8115ec1fbe7def668fd2d154a556af6635eb5545008f7819b4e17bea47f8a72da2380e398b299f56de434d63aa1dd1578c0a79d61b4ad2450e4e9ff7dedbeede0ab2b41d1bc4554ece3860cfeeeeb40b05d872e8a254024a7145797f8ceb54d2bfaf1e3c825c41f4c73fcf60628cf1f781df0782df077ee0a53f21fd09c238f731f10453813b9b3c3cdf4705e669229454a20d0c857d1fab6a3a56dfd559dc75852b79edeb2a415c90343559fb1e15ea393dcde11bf1ee83dfd7b7560cc2822feaae4e50028ae443da0104eea4b6750da1a7fed736fa531f0bec5f5de106dae1058f4f05b6426cadd6d66a2d18fae3968a1e690309e9a181fcbb8727be8779bd448fe9306d6b9b2d8a1326dd43c7c2ec8f7d10916cdcd0812347ab4592189f4455f537d31c3878de7cd5a8e3de1c18e350a978fe6f8c36c6962873a22154015560ef531fbe793fc8a9324c05a14ca834cef704b574666604004000b3140000200c0a0643e18060442a1d0e327d14000c66824080663c1848834116e340c620628c71c6000000404466486a1c0419831144d24793ca8404357a5459bfe046e69a9c7c852d31b21b3eedc8c43ce80eaa0ffaf365464fc16e821be7f22e763531d40e94f54ffeac0a612078e2505d045804018ab840de94f1d12dae2955499fbaf1f2e4a14298c2ea0b1871ee4a1bb794ab823fe2177c4195d4444c3102c10a24f1d8bcaa7eb4e2ccd1850fc82fbf713d0d54393ed01474e3589b3b90ae7d909d67cf073db5e483b48d45890b8c253985c39939add8fbcc7de77e6b8554c89077e0b8f305b9bc37fb1bb4eef84b1ae9f4446090fd7b691b3bb589afbd763e50e607a254baa29e018f482bf25ece1d99931891acc1a2ad4859d5273cc7b13c96779f7c15942ed755f64d07f0aa7355ceb95ac1ec882e331277e176353f9d9cd9247409d0211312a2fadae1a343fe7745daaa97d74274a90481bfd2169ef2474200c14a020571d14f633b88524940946611a4ac987cb05a831d963a3723b25d6ef8735a906766440b8fdbb2bb0fad00444d3dd776203e5b2d833350cb5017799e585833ef2cf1617905562b951738ca1dea8a24ade3dc255bcf9705c4401fccc55448bca03d9aa1d3d1812767500a4603e0dce7190b1bc2af38a09d15f8aa91fa6f7dc622eaf38c0402baaeb9c8e3c9c977780c8b782907fcd1730cf59411b4a63fdcd7fda880eaeba3be3b8375be4d50e20d4d6bd6d5b84979aa6c05804847975ad3c917b2c9056bac91be86729ca964149e052b0fcef895ac095646ea8f796396c75b09cadcd06755f5aff9a129d26b0779bd52241623c25e296485c5604dbddc292a3a8e40d9f5e5645e72ab64fc462f966248e2ebd4bf9189a2496364f1e1eafa57f5b7c338165c59ffb2ab508716e6ec26889482e3f43ee62036147751610cfb28727a1f0498051033d202c9129716ef7300e78424bca85882dce1587ba014ddfbc6c2b052efff0ce00eb6fc21d5cf043d950d7f1ca7f3bffbc03525aef273c0e6101fd881ee320d373053e93b5bdc207a66fabc92a9c53e6dc79ebbcf77560579ab3a0d22651b0984050d38a3dcc2a775e4a5042d6c4a21dca73016096f506f125a3c7d077d1c30dabb0001d5fc7d679e80893356744e8d30307c9c219dfd9f292926194828f4a08d4eaa40901142042c004f3de133cbf047dd1b78bf9ec2438651cd5d10d8005e72c8eae75e2d89eeb9c33aa7dfeba8afb3cd624f000caa800db42787d0178f96f39a957411c35bc94e94a649a6c8ee5623a668a4708d032c98b65700257866b4772cc0acca9b6495e3923342dc492e64e8619945a4fc8724830cc60039b1da715887190d889f0b93a4a2242a60409dc8fb2d7eb20913aba445da8366e3968cf3d066f2d7a9ce35c5e1280a2c21ae69b1c639a8f7834b64375c18cb454fa3ae9734a046b9aa02a1a8cfc3084ad34def01a877d000012587d13ee7fa3d664f589b0cf2eb186be129a36cd7d0365ad043542bd9e3f6004caa55e5c3e71e26882baf687d34cdc48d91bb2170db7034c924a7303442ee4acc4c905ab511eb19b8bcb3c323d9128060101292263c4c536711bac10f5213cc024274e65378e21757650034456e7905ac54e6b5979acff01ef3124ce27bd8924ec6a0142cde468525814940ffa0e513da4461ddd79445679dac9505a9279a17cb4f5d5690baf84b4e006dac65e23e90d116e83cbb518759bc1144498e4e5b7eeeba16498f6ab45c72de2a400755b8ef51082807396c363a21716601120681a806b68b08d1b392e3245f1ee034db6941f22bfe791fe599eb9bbba9f9e568cc46732480f1405f1efd5811b382920a7dd1d2178988404cfb4a95bedd7f5227b221ccd2cb632e0eb4a132523f3bd343efa6deab2e44e1936d610b8deb54f5c1a01a3d5fe0b2024643cc6563b6199bbc015fc0729325c03c87cafcef3658847a58e1d8648b9901a127aa8b4ed8dfd882fa211d799dd993743ce6ab1d3e38eeda2651456c8f88b40084b41072befa8542dcfdb08de677c214a86c78151ed725475e61f8426701573c024ecff945d959d98a018e303b9c751c24a66a83edbd3624fe1b8074b2037997ea0dcbfc9c67f5732a436b3887fc9e02582a75b20a7f855bfde897ed3c30dd9f2af17af3ba20aadb1bb31374a8827acfcbf15bcfa9feaf380a376c08ba118034602fdab30673657da55341278c85ab793885d784a0911d00079971892d883596a2cc3218191d8f8a4402f8964d6633f69459a8d817e18f5b36d1f0518f95d09120997b50bc79e441f2eeab1e67d47d9ad319d83041c7c1b62f386ea5de28d1f8685c098474c0d959ebd30c86cd04d0915b51a51af2b721ff0695e2c05b36118670dce50bfcccfc0f3242832ad02b07b39484c77040a9c88923fe96432ce8ee30abcdd5e28fef0bdce4d425b3b8262e181870bc0ee0ffa25998a292f945f006cf049b1065dc2dc8f4b2dce04c9378989551284e1ee4935e163993537a6b486e13defb8f4f5df3a09f6531b542b253a5b04dd6435432d1077e0da01ae18f0c863a19dc0c996b439d5cf1af9ba18926fac220dd88cd9efd5a474b4ffa3b220c2c6d48de5294ecda5a604f4014c116f61e8a4bfb305dbc9180e6413cf9171592a32a59905380b720c2b3a20fca36de2af4fe81c2b6be740fe1706e95964e95ae49a0be833715b20b18f5f3e75367d59c112fb40d7453b18cf78b01a374957b9f83697499fe219dd9463189c01965e05827c6126a45c5d2e2d96518b66afcd53b8fdb3c03864e3dbe7d42fe92d281d87b37cafde3137538d420298728b4b24737485864b94abaec77d70c24816eb00898591535cfd79a73fccfbc99a1b62f6a83c32aea8df5cfdb588210f98963468bf36a600c7fd9b24816fb9b5df2b5ca0f8151c1519969f170cfbafb47fcaddd8344bf20533a770021df6aac70a26499270e119e078626e0c0ca7c5e5f9bbe125bce5b51e07a801c80b99eaef9f81b70e637c2e2fe53941280139700ad053b8180d04a95eaf3935ffa08aa8d44783cd6026394aff5b25ad55b7134c81ae76b0af19bda35b232259ce3e21a3fdd7cb1acfa36c4a692b9fdb46babe2c4d67759c8592167a23d64801938953f2429cc0613e70dcd8b77b9fd1c85a4d2356bdc628635c7b02ec7ceac46e35f541816de412dc198d5d23b4c0286a445969d37c161a3098866adfc4e76f5a1ecb42203ba1932644f68edd9faa92ca498fd4626828dd1fe9767c8b6b178e00a3f0c8ea941dc716e3f82baf94dd1b2c05a42c9b9498600fa9adf1de5c02e6502ca5bf30e55319676e5bba7decdfec9585d8da5dadddcf8c0a943f94f6efc4bda7d8464708e12d2b1617dea20f6d0127136281250f66090f0e7a51a5f223e697d1d4f2bd606dbb047e610ad18c117794577f47153b28c9545ebf3f22f0c435ed59af972d8ab820afa1dee333f07f91aa80ad790bf5d81cf41af0c1971b9a022fb8b125a7349b2296000cd841c5569ce3f4feb60ad1cdac850490463868cfac9a8264225e9bd15d77d85a406d1e964790a2ca6a3c5858b0ebd76af007a1833e08db26d2d679a9283991fb22dace02b80d6adb73b63636eed33fb574bdd75616e8fcedfeddbe1982f3389e2f82bdfd29eb14f01032018c5001154b6dbd30e79594b03a170f98ca76c5365dbf92d801b2e207a26fbea60439d1709cab442e2e212c2e5a9d2bfb5c7861d06309362664c4bdbfb9b052334519ed87e3b50db6d8ee9938f34b4f08adc8a9d162da7f28b1371e85d6975d6b305fd520f95b71fa96238f3726ff0bc0ef53245f54896b89b8f18ba7644e7f5402539e06f28b2044995881eaff107328a40a06dbb1524f83a59a4ba34b82ee47321b0ad4f1cbfb809b6b29a841f2b3be1ce2084244ccd6458d03b4fbefc9594a83fac89b07106d81879f88a0d66e6380a5153f5f52392e2c47d5b364a3cb76f0068678db4bfb6ad8eba0c15b50dcfeea6c4a3093440fc22bb8b8876c245aedb963dab841278418e87e06e5f1b6ec139303d1699db3de8beb6d501deda4155822688f118c181c4d47ca3c2feb1693cb60fc2809d1a3df0a8273ab9744b353798da797b5d9d2971aae90c659243256aea0756ca2142dc271d6842765284acb5d75384d7fbdfd2e8abb535dd79ebcefd5fdf52b9b155e088830f71169dcc233a9135551f05f5d46954af602dccc77c31ac4958b1bc6352c0dbf828cc6a5e67d10229d05a78e49efe3e52a0f7a835c6816cbb44a33e12e4402c602c0585c594049477bee4dc076a45acf68b08960f100e6289bb00ca827d0a74ee588cda29ee0af4740c7792d5fede098e65403e692bba153ec8b82be95fb11c230c5e85fd699ad88f1a6b87a0da3ec22c82b337d831fb4bf78122d775e27959f2a9c91b684cfd689dc7e47332d4f4f9cb14939746701c6cc30c815843741a0421f71b121d9876cd15701ebdb5dccea45901b4d8a7b7c8cb6634e4e1bb71e5fb4941aeddb9fad264d09a7fb060abde9f9b41742bb559f8ffe0c268d446322af50ffa8d2ac3ef4a0281a9a92b8401225c2f62f45881c2e23ea97f0dee1697b26d87cdd35c198bfaae8d67a4e44c4a862906bdcf9e1e89d593bc9af3c115d1e5ecaa38b20c3d11fcc5eaf73a86d9585ee285518848232b3319b021e69022f905da55d679480da81942137941087bb3f51a3b62028586ec15f8e333ca3cd9d80124c3f06994dc448d52dc35ca4f6c945d764c1c28ddacf1ae4275a00238d908a80e680edf68f05e2ea04bb17b8c92273c5c4111d1a642420c7ce5b6a8c6b00f54d3f028b167f5b57f3f09bdcabb1505fe1b7441c659ed6721db939ef2037625999b05443675aa7a67a7efee81ae89591d5ff51bd9f44bd468348a3f1fac62cb50c3666cc6b12b81407400d72c5722efbc120106a34e1fb1869fda6ff0f14f62decf0b500b63cbf708a1189431574595124564deee81c3d956c16c68cd86b7840169cc86a3306be8359c85af8d837d0c3f39a584425dabf7befad366e4f91281c6bbde027395744f5918211e4bd5a05994a1aef5d9b6762493db9f970b7cc23c370412ee256310a889baf645ca1dc9773245e4820c91c861dff253704294f6a56fac30b1d8be8a2898d84376f6422d2aab2e1364462d3c28e309227202dfa23e186f24a387fee5625ecbb52f9cdd2fb79f41d145cfaf3fd99ced52f90aa29347a33df5ea4c00e4213e6104502dd6fe0749ab4069dc407d3e3bf4d65682e4920d1431be48cc421c4cbf7237e3ec8e0e6e682cb8c8f2a824ca1a2d635757ce96b2d1c544f65b6df5f8ba092eb0086b94dc10fee90dbfa879b2eb80f72adaa791bc7c5d10225b35acc0e56bdf7f65df0edd03facf9eb91761aacff51636c269baf659ad81ae525ea2bc9537078b0d310a4710a877c7e7708d30a878e637e039cf4c481209af290a87959e3c6e1690ff3b43c0d1bb767accbb3557c0305869844316a4ebc4b59f46cfa6ccb389ca39d1a71015864a9e7d95bfeca0e10f223932c7a851f0b7a4cd1dbeca8c23ae677318e2fd85d5471b09760208af41f954e2a4b61ab92eaa53667cb97003adef9a77ad061590ebcdf0da99c620fa28eb810b25d636980b4b4356258feb3a5884137298438c838a995685277babbcb7081fa157e40e7a3399a44e97e3eab56a459a4adafb9e3e25db73992320fc993b48d1e1ea0dc8dff24b60fd5395256c3934a45451811730ee1cb193e3b3684493de18425709feb00c3c6a0fef86a008be018bb5f3d4dc29cfecdd0fdbbd2cce15130f90d8968b4690517c6e75426cce81f7b1887f826d24121fd1da49b588e27e5e98ab21c7067c5380680e88c6fe0027084259b37cea8e22660074e442f3947321708c4501e8794a58c7fe4e661502914fc3f56c6ccf8bb18b07c60b60625d91345b17ce1e02981277d449aba0630f9a91d0ec1a03be282c1b0f0b7c7198a94b0fa4f8fc39624adde0c05f430a8012c25e1000d090aa2470b1b39e83cfbd352359789cca62bd41044efa05feb307e308ba19d49b5a8be8c22883ce86c5c8c60d6387e3295764c3403c0ec39f6d4c109562b856827c202b245685c5594f134b0b29595e632842100c7dd80345cd274e386c93b6eb43a56c7c31663ab08d1417a3cffc705be86bbad6d1186b042d2162d72e7cf0903631f6daa3eb33db5f43e5a92a63e74c9e802fafdea091a2e7f895ee159abced89e0420b114608a08a755003060ee4fa82a872d42a217d949281026ca5a0557a8efd6dd21ea902fd2d401d8534b4fb406f8e4a2f21d403e44e37dd894c5c88134481b606724489de333fd0d626566f94b31dfa944ec0fb822a871d128c05a1d8a375dcc64b6ee223b91219a31d5ff642684c2e0a129f9e552f9fcd2fc45fd7a9d0d820902d2813c41a082347900a8617d4c754d0e4c82598c9830c9556ee010b2acc5973edabc94554c1e1f65cde725df162ae23de6e5dda0100a5085f24071cf424463acc6dabee0d1114d0f5b3cefb79a6376fd6d5b22ed91d8dbe9c86a740896f9163588fa240cc93af772e56d30ce570e65c5274c57260dd503c24a816e6d1e5363687bccae1291ad13a09c529a28cc5b71ee17a8bbe67206efca4c955f76b4f07736376998cafd0960b87005bca886908fac5c13d4f93119bf133242287dc7225effcc0fd1bb9686aa5d408462742abaad4c0764392a8273ff19603e35d0e7b9811d9dbe5f8e7a9d08d4866026e95ca02bfc73da94402e1858aba889e20897a7808a219c74778f34dca5645021759a4fc63718afb3447fef55dd512540ddf461a49b328689e15b1084a43aeeb9e34b05485649d1021ba9321ce951e3927811a55d863520d9b2a5b79a6d6135a71f561176efd9e5344bee8d4ffae0970b18fc8dc8738e3aa517bb27b531d3c6d15288e90adbe300dc38c7c70ace7ec825c4f8c462e956ed2fc2a1c2345a91b842fec5f0a181e933ac612090b9cf43e265c85853400173a4a4d06424bb5fdf8661fb02ed26298736c90e5ab51dfa77ce1206b502831e83e6d58cdfbb883e81431b75ad1cbb90c08b42b35dcc6be147bce7064b7cffa56aa8711b169affd9096116f242f2e9f13e38cb2d51552d4663296879c417b07356ab22561266651f54a659cc79730dc7c669bf392383fb7633f204a83ff496acd68013bed7f3529e2aba7f9e4909db77d3110c5764ac12ea1cb65099fef3ee4600ecf9d21222c1cfc7c2fc1ccd2481bcd6024742d60c50ec1f876230f0366cd949a5f859b32556f7c991facdad9c500b7f3ef09c03bc580203c7615304649d1e1d1146e921a0fd75a47ae191164211716229fe75e977b2210d6eef2964fc55583b06bab792d36418e4e666c28b9d70f30f7e7f4545a68e235f6a12b2f076408310568b660f2e63ea846f0a67c414de9149aab808a3810fe5577827eb6941852b48dc14b203e83b1f4e48a5b682e8b49139517746cd3d843eb25a845c2c198104ae6ec19d9cecf3a0bef76c5861210e90206d43331404984788a610c496043ced8addbb090f2ef53d9850e1ceba4f24cd0cec3003d8433895e2d340568d91c09818685ec53f653b5467d87d8b6baa57a240600fe8bc000d56c5bee6f86f729431ac124f0c7489cc25e5fbf44ce4627133e624ca10a75625bac846f10638961700cfd37c7897505cb9fc7365a929a534fd5323ac82b054d58e21e01043a1c0f2a40488da79706d3ec994c9495864b5ffb4014ca723224216ec0055ed06da29096b6ccdee24713ddc233f531a590ee929989a55e38fcfba000f93221549717709fbdf43618f1afbdea16a889040df4786800a3dcb84ed06978c72294c69e19d97e877ef09a81b5ebb8aa3ca20507ebaa12f4cce06af36259c91e5fd53d35547154737232b3a6d132cbd4304a065b9bd9a9587cb5b7661c45afe264dcd3a4f784e89a0a8cb5b8c47cc70660cba150ca0c8509a4be2cc500d460c98fd2fb2fb99ddd667684ed3eea19022fea6f76eaed49915436a8352bc8fef3f0cf1ad5e567a6fc8e003b66dd33e96772d28be6ad23cb59c97f8959148255cdf437e4d1dee05983875efecd035137f2b7c11bfabea3aca60098e16f001870eb54baf3621f4aef1cd40f67941febadd88245a8b0e597b9cb1c146a47be01a4ec8f8e4a263c14da58fa10be63cb344ba4bab69fb2f3873cdf568ffe4d4c926ea0aab891c83245cf44006c5b281694ce653ebfb4df13c9e2f43454bcb9c2229981a12a0055d3cb9446b133f23f75f1c87be7b51b429e11eaf57b85bc27346e1916370a6255cd3a83da9e2e4a643fa003085606ae2a00b9b37fdb20b13efe0c07b472b7483b729d115c1b244408e1258d62ddde38a371cad291f1987101b270959f9fa4352890d6c296a4730594c5cd1d90948cc3e48f833e29d732e65ea3477d494f880636721bb29881f2850a9b88ed5fb57328c2749188c112303692c583c33f417496569219ce84e3cf9860d50a697db161645ca5d151a92c7260e51f22f9c4d7a111e254091092258857aa6c3d0451883a4192586534a7e6dff636ce4bd9e93a3b9b3e04bbb9a5811f17db6dc5996e3104dfd53b6a761255f71c1702f4245dc285b7ebfcad7758fb4e2924a24c554353490fc22929fb9f5a53a2d458611fd7406c835007b273861dabfc11a5bdd51dc816e5dbf405d72b93aa768fec8377d4d9b4356d7926b04f08df6a402f17626399118c799a61b7cbb439e2722c0a031c06794d591ce9e35d6120b73c2c243b85096e90cb521b1ea7438b954967c9916bdd96e25181886e1b14f5576178fa15728460cfb05f158dcefc40fbd782ee9c3ecb7dd4868373d3c79312c2ca0f5a05c03bbe427c412648ee9c7c376a2f4518f569187a2f81bd57fec610ca61b55092fc800f17dc4e39aaaa728bc43b2a431d441f7b1a5e06dd6144036be7440bd3d768c192d4c0d1e8ecc184087d713473b25f92efc598d742737751bdacd42fb2ac0ed01e31417bc6c51d533e6bba95fbe6454511043b0c171b3a34adead0e41bf90eea2165510a79ff34484c626f65e8c077702db89e7a9d18dee251687a098fe68fa8fd3889b679eb077f73783b6a2dec787429941d3b5316e055195b0ef13169048265443283d458fb8e890005b9ac18b269a165502190e64d1b3b795fb6d206382404043a46083cbdae7a1b6eac824252dedb0abc2984665681866270537c9c3d9f22f21e288a94f3ea23420498706e7cb2e85408cf50f0a5b1c94c1b0206f4e88c86812e23a65fff7ca37241ce532460347443f1f50a84cdf76d8c039fe80ee6ad6844170d17c62f0d854e07fa7e86386b59afe0170241574d12f3137501034536662223f5f1829b86607d63f63e5c4504223d5d3e37a6697480b10a3a023dd798c27c5d993e0da7517ae5526763d0d8d6375827a24ba50a2dd0117dc1f2da67bd8346d443aa9897722a5274b0ee150ecff2518bf0d740237772b32323381363f3034cbf3bf70275ec3a6e91c6c6e6d9797db65dc0e2f326ce8be0edd559237c6071474bb80757507a12aa46023e9bdf41f9e9f7e390c979d0e61d75922862fb1ce1cf0071b6e9d0c71b52fdac670d014281c5ad9b41934c4b021043a777f636e69dbc30281e8a89629d0d29fe5ce0d9e4a9531db0c638f3f55c69e2161b44974c3ba8a35be2ead4bc31b0d9a4580589f32b4a4addc8eccb1f5a76b3141298410200c873f01b0a12cc90163e09edaf369fa8d5201d927c88528423810c98d45aaaea647f5732d118c9ebfc9b82b2b3db9e49ac8cf6813be0af6105e5fb6db96d579989dab2b28cbf73d911127b6ce491fad741507998d2dcf01c6f9267769b58edc03390588facefc16aa51c83979c77cfef0bfae2082c4aad31b27ea03ca8b3e1fe94a5fee0b894d36d6a1de489394905e23c43d3a86c7a30c39a7733b4f3abe15e4f52309d218407380c20eead6e5f122a2edff72b54498bbd641bec591f353d6e1c40f30640486b38a738b58ca815922a68c56f376ad60d1c43d4e66397f6c1fd61bdc5869dca8837ababa57d87fc00715a2d935e8f5286057973ba7159d86c6f729cbd7a61a5a3842d705f3dd85b4bf74710492503e2e434971a56b7598470c54493a970123978c5158d9f773ddea2e46053efb82b6d17b1b3a6b85d8da27cec1a9bff62ffab2d7f621282d06e01f6cb00ed7c9133d594e62d8d151da0e7ddf779186292403c2c973434290c67188966d384f4c22934af96c23206b4587f904dd3b5eeac373926ca542c58195528bfe42487e32b401012a6ec6ec9c5074e48ff4f0e5b2f99c64e76b827d0a001657c4994bab39112278c50318fcf95c73d0260de4cd5e20008d0535a878828d0b1da93f504ae88a7bef1ea779942cb4862cec7be69d9e03500cbdd3d190b27414abfdf6ec8ffed1d85b438a81f1020b0343b39234452182eb9a8efb8f117f93145901f4ef655e5c5d396534bbbb320683226e45e25be0bcb32572c9fe3080f91322818af202c4bc1fcf47ac84fe424096bfd2c4d734164f344430ebec47435754d603eb79d8260bf106d3fdd0d06b6ac0ad9eaf2039090d8e2455d0b870519b1a326e8f37069e2b955b18c18e990b2f904e31a37f92ab9313adb97818858f9890de21001876ac980183cb8fd8c3bb05588c9dca9dc6c7a8aec90938c35ce314282b4511e62ef41fcbe38a83617f6373410d4d210ed5024b0dfa551ae3772ff75c36b7d02d8dcc5f0619bb25d6f00d3f236f69571f56dd59d5d5ac746d5b5457e0975227ece7d4c07ff385d9545f4e14f00f8ffaee07a9916808083dafa743d02f9844f0baecec3872d26b09f5ccd44516352ddf399b068b9d28c726ad3dc0f844418d570311ce8c3d7b6d6434c2c90ba4e369d831e314c54fa1770c9bb2f0f852286ed911a8b4552d6eff6e0f3f2b2170f9104ad0a8cbe5f8339a7725fb34ddf9935577781d21f5497121a3b1ba2281663c5474004528aeabd5a07e3ad9f904139298ac11a32a80e966678b0ce876c04785912b5557fa3163d4268473b899af4cbdf8daa056044389e9839ed385ad0c73cb4d74c4a3a6bbbbc84fb0595e669f101ee84d60338e81a2892fd0a304689b28784ee49ca2917f5f5353c51ad638803fd9b6399186c5bca085b08479af5f52d56959fac500170fe5ff29511476811c331a8f84b77a72d713d87d5f427e8ac57ec6af03b7a94db6a855f0f1e4133ca8a662548f39fd3ac9d7292f5bc3b610f44a176ef234e39fdd8999a972f4ec150dfc295bef9ea8590ccd190b88af54cb8da39d1cf810b0597eddecf48d65cde8050016ca3182dd69d887522eece16b516449aec3302f96d14e77964a2ffc2d8ff44346ffa0b00eea0a44e7af5a90025464255b0e1a88a7ef6005fd07db47ae42a44a6ae7aa27dd886a650d7e4921a56a5fd85e75078b80cf2c2b5825993827e7da463ad2bfcfcdb072deaf1c17e921bfb9e56ef55f85fa7d11d52a0b296c92857937d5d5ac2e91a644d954016fcdc5694f54956479d8419c9d097fb80e0fa27b5b4e17965005a082eb33f04685f8125b308a834555983e7c651104f85303b0c5d57fc41de3416546db77a91b29ec525ec44724d315b68996965f3aaef1c999da8a5654a18b87639e1d98320e6dd998282e13f930a71df4c2123b80cc3e6ba0d57dbb9d273ce784e43f39b8eed8906c528fce0ba0c0517fa31a8dd37a1587a766f4a4be41309c432b542e04c975cec5f30572ca3cb7d54895b2368595d528c5ec51301451a04dc332ce908342c86ce03949e1a6d728a19c421f2c5b60239e22b3ffd19b10bc61c3140a8c79a78d6c5e8b5e6d2faf18b6807853fe8a11aad0afd81b330194a5b10249a8aee4293ac0afd4cbcb5103a639003130f48e7c1698c2bb0d23ed5329940cd3eab1751a61a0a3c6fb5ba3c2975a22105f7c5827700d80d9c42e445658d10e3b83dc77651680ae8a161695977adc83064eaec07d2429e01ea29c971ff980e42ffa47d6671636599fe57c618b71a540ff286b91a7591f16b43633703c0652e7ad466a7a8b426190732893790199ab59514c5d35ac3e70457d86963b6d596525fe5e7660138a659eb1fda2fe4a62457ee5a2d78bb419f19527d7ce6596f1e7fb9d6dc5c2b326ccdc705c3bb7f38f64437f5aa6303b861dcf2396bdab5cbccac2596637cdc547fd555311a87f2c1cc5b925f8ee2351883185f73d4f9b49d80e48691a2b315a9504f8102dab1a009a7f0be44a60a83028d8ced0ad695c25ec4dba14a357a351ad5cc01aaf17e7af57196da57a8014c993a8520182e547731f030dec8a06e2e2afd0786abd2caa473550c51c570cddcdbf003438dc27e5c3e259551aa5cb686dc668f30e9b19e1a42b82f341aa722dd8a6f9644b28b0a25c5ebaf1ca3c0d7b31c9f9a728ae327cd3bd3e76057f8f77cd16d57edf8bb413d64c0f44ec79ab871e3d86c2d423d148317c57b5a5bf042468186150b1824611dd925bcd2e920fe56b7e48f4dbd5b38008feeeaac2086f2dea734f6d707a73cd0e627811962040df55f030f4c33ca90d5748786ef0cf55ab4b196335a36946cc5d0c8004da5b86b55d0e7ee0ce2311c8cb6a471cc545c7c3567977ec0fb6ffd055aa803fe6798b418f225b052e94789bbf17c4277372d493f8241be34a1766333c0799fb6517a509b9b713b31a5510d6cd70865b0d591e01def53f5b94166a9c64a9d53905495a186dd035a6d75fd0617558274c1e1e8b68129cca22f7f2d9fcf0c56c8d2a697c54308ce8535327b4c944361f15b8869b32a0ba9ce6fafbc2f592a3a2f06b428f6e3dedbe931a641c90deb952c14c6cfe6ebaa31ca86c12820b4891c270810541138c65204f63d5b3821206a12296617d7a689436f5017827afa2c62a54cd05726c1d3349f1c99d2bbfa9a6a2967059a6af7aa81c7b488d15d5897d53023c24a1ec16a7cf116581588be703f680e2ec078171c64bcf9c1068f1bb2043d1ce831baa1f38cdd784f6fb798a20d3c724674843feae4e936da8b723cc103154f886c291740c266b4573a94e5fdf384e27f1bb270e0fcd27338dc8b7c381642dadf3d9212ae37faa3919d412d8cc37c6509a542ac52ed5b935e3a79f8977354e02196d8526d3fbf33637df27ad8b729d5daa1927bc7d3c951ea453daa425ad6d0b534f5add1a39e6c417f08cba9a37a4e304634c4797fad20f438ce002435395e90157483bd80dfcb4b493f95671cf3e2228ad826c4643ba734acc2d435c78ba9b4dc01dac3d5f634649ccb7124fb2832770d24b364034d9b1125909cb56cc3657a6c97083e6ed98d154765eb124d856af4ce9efca96489385ab74773974a89549d5ee073201edc53e48487bd5d22cb33cbee94af5c9e95b5327b5f6a14babd88839547c64375ca9087f79b5a117d300065d23b8d4a82bd60ff33fc532fb733620b0c22594dbcd99b2210bf92196d2b4abbfaed403f0acb26ff63a8bd50af994a25fa61a233d005ec102c21cc14733655b3a46c337cd2eeffba280e310d306a54a4b29a2afd22dae8a4ad455b3f615cb49aa0f52a5cd026ba8e02f4110e64d31d797e34be10b8e6f3cbec71ae5df44866ee8c94bdb026f87523bdbbbf25f9792ce12affad237a8c5fde7357f1b49d94940948d3173dd5e7bcb30e74d1a53845f11e61c859f94d022d001a6316df130d3dd9786ba78247e534ac469c345695a49bb3871d8d856bf25b08c2d8bb1376701ebb413641693eb66e9102c99931b6497822777e1d10eaba97c5b59cddcb9df21e5c8110267807bcc487a9e8aabb32878902a04184cd7868aec0f5a0c90080332ff1fcf76e7076e26d194fd7065829dadb07aed54aeccb99f2301db7b3a6acb310e95aa18dd8d2311b558e0a45c86aef1660777aea6d506050e89fe9444257fd19c46d68dde7be041220870f4573508f51d958c705424a82e7f4860d7b0cd101538341014446405524e538a0138dc8c8d3bd8e970e3958cee7ddeaa738300061bd0f69a0f7125bb074bbb2d6d5482cc511933ba18f39c2a41fb3002531a2d7275c9ec80b13494b92ec2b0650099261244cf1d3735d52779b881a433290af286c32f5f7f10f2e33e89dc04bc872ffc3c6259907eca1e5735528a26f46ec3f014366a7c296cf8374b7155f894b17ac314faa5b1cba1f1dcee1542a50ab9c645e8f1da7a8c79d3a9b4c64b6233951546699fb372f9cf461eca834a49fd7264fa1df9a14c2a10ff16c0809896e8066e955e6dab62aa34a87f63c6a7a29c7caf8a2306ecb0c8e2f8300aa3b8b36cf16922b1743358a541774c9f6e72adc975a5b596dcdaf0067628c3a9ddfb404ba788b65a0d0ca2aadccf41f6eeb2652577d483e2852d5596c59790e91f0a719f9a024984af3723b3ec51bd529be168416db6e5e90c16eed8e332edb863dedc67c83e3dc52bc939b8e2095bde854a297a8b29c7d4d3c5dc80a18e4541a5f69870fca63b194b245aca623747d806e6d198d634c321497179a3954a954756cf3dd068d8a69736b293e9d56222bb1b1d54e7e3c1c4b862bff919e0caa3c06d3a648fa44ac85b095ad3195a621ac4cd1b7424a8359114e3091cba556f7c42e2574cb0c4dac2192a37957eaad6bc6ce6c3d5b002bcae36fc3bbdeb531460169586be043b1fc1b046e5f995e76171c41f066785de7cd94ccafc7fac2d4b37168756a7424d5ba0bd0d395a830d8c167aa337bb1ce6c517596647cb491c7815d1629a0678176b777cdb656a70e3dcb6bd0daa8416717a5739a3ce88bce31078e28e004a3d016e4cb5be08d0721877addf076442fc5f8d5522941c68772205d4887796060b9a655248e04890790591e310fa329aca5c5aeb96d92abbb4202a38f3135d7e0fc383fe44a29bdcf30f39578e29768b9e81993e6067493008e46a019499d4b03350c48de699d4bb9fa0220cd82e2dba95ee043e77b6a97f559303b0bdbca078a888f3579c2a61d2a43247a5f0e69aa8a3cb9f7361d5febe6f56ecf6c4db43f9055780a8cfb5847ba5384a01789853f7c2d4aea0b7c74cfda4aca4ce931eca8211a89954941614f51c2f60753bcca8d5f92d89281aec293d0863c4833cea05820a59f9fcc027bd1bd029de16421a1d5f89573252103e32e544519ee39059dd20d25cc5b40ba6dcaa7a9136759508976af189758f0a0f34fa80efef0225f80ec93a2bd93051fb4dda136ad853a0ab58a29839aa40d50ea48d4a3fa8a2ea3e1f722ca983dba5e2f1c015e656f7fac3b6c870d3546776b2e90bf647a04e2c20625572c4c0d7ea55b8f7b43ed055777569f94d3ed0142c3792fd8fea36522370ce865819324bbb7435a9531711344c54a128e0cd40832c52a027a32ef35cfbcb0ee3e72fa3e7cbdc4a97e0df469c9fc351e1940946490e136ecc863a5e4bfa7112496212a22e23506e38cc400c8912c320fab1ff8056bee62dc86d01b8e63ebc5cf43ecb88b4e0a3cacd9d813069bc544a2513a53863d60c83cb78b9cec9420d5eadf848d47dedbecbc9dfe59d64e5d3cc6b8fc1733a7db37847987300245e99b98028b0f8bac593357ff294f5990ad02e0d32b0be80363aa991bcfa3eb71b778f8b28c906974e5fa94905dac5ed0ce465be814c4bab82416abed6e835d381454e1c1b378a2e8358350076d49d9096956763eabb513563df535384da0b934c7263bf46ae0d87bedb83e8194ea93711a5807aa4eccd90fdc41f15d520735d08b2641d56c89b0a8b98be9160a0c91a5f83c48fe322e7d6cd95befc620455df1773585aba4f502806d38f685e6ac75001f44caff0cc1871e36963c0941ba58565c1bfe6cbda458a0c834aed55e16f39e2c482dc416c9d3d86c3056a30df67695a4703d1223dc5249a7c5c37a018b0c900079e182491e0d16aab7edc59c287dba5c64ecc0272f04c4b9fcc84ba22f579cf4af898041c183f81487558f78689ea33bff73207f4bb681ffe2bacb1b74917ea3cb4a6e204831f2424f44359c350d5e47aa534f45fbe210ae63854dc31a0824e4bc7034c4cd55b8aeb6170acfc0117c94ef901dca8a58a5d404b8428d6ae88d4c86ed27d1556a14ce5214624fd6c795d9939cfa1fdd22067c47c2049bd1f709f159898d99a209222d1e510a4291b0dd5e508301e28ba4446409434ff1ab76b719d5ca6fa23d1fe2ab332538486186565e480dc9f89ce5c9ef6a32da2826d286b5402a0f5a5ff9f4556cd046f59dd3123623ba3179117af145f72595c58b3ee3016a6a72e8379761f1836939dd25fbad819e49a29b120bb6cf08f6ad872649b2dc2bbe77bd6175e810ff7f82e7495b520d5f8692c282d349b770815e282d06fb2d453d6b302fe9a1c7d59bec36935315c57938377d8c49f08511b10870f0cbd4036188068d810e3b9b116e711d2bef747d40d935716af14fd6b29d11711e5577c8831e5b5471ed8be9484bb0a4e5f6631eaebf2c763412c9ebf5f311e275faf8cf137e8afe86f34dcb7152e724ba3eea8020bb11626f043a1c1371f77c6604f0031a96d35332360b44a1b58544e9e0a96c46427227c08573967834b4afde8e38b3034868b84d6cccf5d5bcb04dcff3d155a92696720f255711c8af1c3a24c6926ffb2708abb242365020312cb921ddd65d8e20159641e1ae7a119d1d0dffc4f09846342ce24fafaa872ca0caef33b3f199091798462299e64a180a9df71cf7aa3eb695d17ff875b1e662f9917de52d617aa7d44710d57d813955bd568e60d6d32bcdf94e221ed33f62e8e12fec068daef4f7427f554a7f6d7abf20868aefb134d62820225436c86f4dff9d08cac17bb57db14d0e40169ee95d16132efece25655a65927d9c8bae353d7beafd71dee32cbd5d77d9a5de8f63ffc33114756b5cf69f1e0ead227ee3aa26b2c7524475e9097b6a6e277a44fbbc984dfea8c81ac0c6a463e19c322ceb814d37211d9fd4affeef4df6a3d505bd8fe9638614f799287690982521c9914c7526df676495d09350e481095d469642612ae7974f6314e071dde90d6cf73f7acc0a44aa7894ea4b78e9737fb803482b30c39b00dd6390e83f0e716c9dd1b9b7c1d59d65e92735b2d3c5a22696aedcd66035c8b8971ad5b635617e246fb2a5a4c4823b6792781bbc52ead826c469bbe785dba67e68dc4189085741995774bd24f004fcc206545d93ef39f8d15c1157a8a828d9ff11726f00764085ba16902b1111b6df628855174a773c93fd67c06f32306b9d6fdef6c305a0edbf39a41177b9550b49aeaab2d27c47a9ec63765c1282a772fd7f7b044d365d03e2852efba582a6954a14502bc38b333f2be3151cf5a8a7fa5930ddfc07685115dbd94613cb5d07ef7ebb4754bff6dfc5aefdb41fb595d86f4ee0feed635519b9b924e480bd251298f6b4990fd2057189deb6b8d3be7727711d733b2a35354d4dfba3d6834f49f4e6809784a4dff1864152b0ba3460af9d8c2095cc5101b86224cca15beeb833b82f04bef3a95dbb02aa21daa043d3ff90ba807320bc88331b3b610952416b6d1e9f4600a5127304b6a7c33c34f17d01a16b785ab63f4a4844242b410812854870b04f48156685bd0df8ad1804806c4f6702c6a2d40b2a6562a04786c85d2d769b15edab7ba9bb03ae4d5487ed2d7778a8f93a09ff357924ab9814c47262a598a6763fb4f0a53e6f4863ce7e791dcc89c5320e554db6a54a5618a4d8099656729ccc9c6a6184eabd6f393c8c40b7f88c03606a91ce5de290ea3983a6ea568fad55439d5af5089d64e5a18eb53ad41358292af3412e0861df1fa220704d7cbcb483347b4820f85606bd158be65d2c84130e8a3a6d3df87b60aefd208a9eb258066a4153b3014cbb6cb4a0ab7b281b379eaeee78973b79b3b88e8d9f063093322127a1fcf9110eb3842d1f4a289503c736623a1fc8d5d93808e85d9852a9709a060f6ff88bc0937b970934b8282e9cafce44a9e35c5499dc8ad888413ed4cb7f252abdcc68b1b2eeab1bd32e0b65a3fadacaf62bf41e77380536d4e3fe207dd14f2074e1723721c48be644c5c87bc40027813c12625e2fcf3ec009477ed79159f7503fb91df1a09dce125520306e17bd77e6de461ba964a7424cf4853fe511312d9205a32c7d715c8d1d71727ad9bd21c07435f0a71a017c29b61009bc9419831089ce3b0cb68afe7ef1965bae3b145ded5056984601cc3182bd16a54a035368381822346bb71482e5893342648690124219328804765f41127f8acca81650cd33477f28f1ea990e7156f853d75ab85419c4832526898f7b631d3904b2f4c7603790100246513e26bb71215ed8675985ce4a1c62342da192bedb133b4f6937aeb27a9e202a4373e8c96199eec9b50fe0ba7c18c1242c0ec8a569711a22701fad8ece18b58f06c890fcb29529e9cb249937ce729864fe1ceb5d6e54793e5a16128babd35fda3036f5d21bd0d74645e729d3d38fc22bc8ff158db4fcb73658f3deae0466e3f7e557e7d04fa354856d22e808812d1fbc38240947322ae4a5126c8138299cc520036e11d0f4de8db3df1093d8823354bc68e40ab6b9fcee3197717e8a9650518950fd62fca7d275d6c747fac16e1f858344e8af50c084549d8cedc5e00ef6875c7b34a17ca30f32d32b6cbd4a9a5828983fc61fa2d9bfcfe9696ddda70c4c2cf3fc387cef02397e6a78f192aa57b4369d7c2ae24e4aac37d76abc1c4caeac53ce390acdccffb9ae61b3198dc9ee5c628fc22a051701cd9eb4130f339171f1c05e7a94cc6d68b45d4ca9ac2ddd7fafbad206849ca2cb9cd802f72acb426b524953a6338fca2f928b0d6e3e7a26b48186df92681d648d7447c47bb5e0031fb841e537f963832481122af564a4f76c0038a903cbc08b2ab169627cda2545353d3348cfc7d15cdb050ea9cbdff76cd557a1c710ca54741a78f9b07ee0f873c2eed171193f625385853f36574bc5b4a2ad513d6775ac25c1c251d10ba0393430aa2b68091d24e227005d04e88eb7d4183016bdeb26605c9c9e0514bdafd7d69c950ee23d0a490709d45f6c7f61132058133c4aa024cf554083a38eb185bf9973e43aca41c5691755fa5cf11fde912fd9b251e6c7c5a43a1b5d1bf98e3485428849f441b5924410fdee859d297a0b36bd0d8519e479b7f31494d155901890b4b4549517c19b56a2704fc0fba5fbd13af0c855952a31c4beaad465cc7a00bdaa74ee2fa9fd042a687adb6ea92861ff4e59b1b4acfa78bac4164e61c8d1d19bea06f9302e84423e7292832702413e4388bac32feff821627ac2692509e8ee65e45faa797d155b09f8971b1b13edc5d6dec1705c1a425b44d3e2fa54fccbebfb5b7dc643503469e2adc96534e73959186141490a61f1f3bd13ece32419ce16331f2ded1c1ec7511f8f21100049661c93177c08167d48b65404d748504ba8e4e1c543133e6ba733e1b1bc1face2e12e0a47b094976a25af43e3f349301056d9e1fbbb0437a5dea2f28e8b07b47f3e6e064f61e04dcac6ab49035c40dfc1ec1dfcc3734dbaef1e82ff0fba95be75a8516cc22f1e7a89369ab32acda7168d31fb0e4a90d5e4af7a969e2d8fd5b712dcc3589486ae2e9852eb3b237adaa02ba583c38c7a865486b57325e182735a7c0a65a17b4814c42f2d0a79058fb7fa2f7e09526212b9b7459e625577c0e4d9c5cb4f64a60e5d056401e9e14cd330982cdad5f351a2d29899a73b1f8b4cc6e39d30dccb58a41d2d0672bb9ef0cc6b3bc38b198d3ec4fe671cba84796e0cff30c8562002714361c472b6b581c7d9c7acdc3426754a2a43762368f91c5e769b8e38558012d8a224171dd40a3b40cf0d963b06d1a8177021a8584543ba8029a14a39f648c95ddc59b13a95d27769043d78d2d5947a1cb0f46763ec0668f521726b7d2adb5b6644e14695a7f11bd0e1382d77c4498b169b28fae4fa14ea3a990ca397c65f5e959a0433d0f6a22522f603f96839d11b58a0405b90e1ae0532ca0e63db0e61b9af2e15900f0f6c4845358ad8dcf56534d12e2a0bd2258dcb83e4bc8e441a349aaa901ad9fc9282ba18fd289670cfa4bb326361a61f4d078cdf5ccf8d170c01e52832953a8a0c2a224db56d2a2428af55a25762b0490a6be5847b7be49f88e11512a62100b14b70f8644e014d6a4fab46615a88aaecee7ab29c61b118c5864b28ca9d844d85857bb25d595b06035ad5ccafd8641f583fbe6bdd91dbb7b4837044331b3f27f0a3b50b53bb74dfb7b18a38f1f65ed0bcafe7ed25dec7950927aecc1c268560a3f70863b4443b041820cfb236af40952f0fd7eca41641e6ad859f2badf2d13870654702270ec9b291cf615e3687880f73ef2abf1c46d193a970b0a15bad81d0a05831cc1b1495b533b3029d4521fc399a16b9a35ae92578473242ee0df9054f17070b45414c0e1bd2fcd77ac700f10a82aa9b7eaef9b0100f3137f43ef60e52d342f31cb3c0e9b51a5015a295cca355f158dbad766ee62938cde63f73230d888dff6d19bc48c780eeac17ad5082987cd74e24290b1b4c1d400f6a0f1bfd39be590d80b719a2c637785789f2f7321d8e87635e63fe46d773ad961554276932bc2bfd1c24a2a0ae52da0660801ed24df8af187be53799173d3872af583d37a6cd577a6e3c3b97872efd05080a162b9836fd32461f8bb9a38f0c4428a3bfffb3362247f98cf35919f73932900f074126f1935282b0d53ffc54f56ae7f9eff68d8b80fbeca9d9fcaa6f88c1f8c6ce3a26b94a8101944361667346b8917cf96ca412e35a2b1a2a4c756e60813098291a97b2aeec25ef3bff377d747a97fb28ed68950a65b312bd3fdd2eda2d09c12a04d7a01ce70edc5c08eaa8ef6136651d63f83a923a8a05b92e21773aa765f07a9d43a1bc4acd1ce5b3d759feeb6175716678f69ef1edd2a7de8128bce715601d798e77400957e01e97dba187572fbf1a8e784175057b39c1fef9b02c6817c847e015ef4d468327e5c2614460f91a112f4d1a0f218bfe240c693616d7b0732529ac17f0682ebb8eb12bd105db8766462f805c22e992c050091de41c92c5aefc90fa0809699c81ec992b3b6a1e7270c4ae6a0f6277c8076db203b998f7b3b5587d910c7c853ef7061b6ca8b8197386053602e9c0e4a4ac00b261fb0ddb5fe0b9cc800d005e4d76858003556d98f81d90cf464f5f0584f43e839ead7644b65a81675e322868d4da5baa9cd64876886de1c874901e09c23f2608c33a4c4181f6493a57f26de92a201c4603b25a70a4de0b0149368fb6b770c599ccf5edf0f5ef04b3e011967b61bc8f51ea4f6fb8fb68b4af0770644486527d7790c572fabd11320607fb35202dd09187ee7fa8129d3051b56c696ead4ff5d64e848105a0b7bc425e90b787a6f40b0a6f215a3ae95bc3f0e7383df42142b3b15299cd20029c3bf1cc769dfdfd1dcbb732c40109eca68cb7700172cec111319f0f66241855db0764af6c9af856dc1a1fbed22b756fb55f017d0bd79dba4997bce9264fa3ee5212b4b77450bc94c53f8fe0abb70a010bedf293ed7381a333a3687dd26b4736748a9c5b6fe69b8fb9e645f8d5a5919493b7a34fdcc081e0ffbb35377f3b6e74e0ad68528492d305d3f0f24522e44334eafb32cce9ceb988c8a3d9db4eb2ee511184f926b3b9428a51a370f7104f7ac58ec38ffb46bde83d50195e13135b7194a8b29a1b3da1f74e48419a0b8a4810e230baebbc965c5948c3e1127ba997f974d5ae20c1945fe282f4a0a10538d11005f06067d2d8644044b2a61e9818e28600ce361675f6b1097f9b0159a92d3f9ce12ae0e8989e2ab57ac86065e4be511d9ed41f23c2c06c8008578ae6f3fc6a958d36733bdf74dda28916b6adb30ffe8dd15d578da42b0e251062155f05bc8fecfa81d46c6c56e929ff44dcd298a15c2f74e508588e38a4371c00da618009def46c946438822ef8aef3cd36351b8d5f90e9bc1117469367478a67dd1217f6e86dc52a3eb01f7e2875c21ccd6d9f90f834e3bcbb39e6c109d535a85b0c537ebd114bc5e15bdaca371e0fe206279118158288d2f5caecd807cb31fc5dab7722120aae6fca0e75ad3af03a0cbdc1824a2e6927e8271a53ef35c2d97beee49d8055e7e59e5ca3b2f49d4eda9f63fc4bc1cae850fb16543db74551eaf0b78e9972cb013b1da013fb842afe9b710939658c20090157b452036fc8bebd4c3d5803f91ee6602d1ad3d2a124f6bc9fd5b750e9e1b7cf7247548355ce419f43cbba0e4cf8a0b3e33af20c5a0f96f0436025c0b968e3f97a07b73b165231461e34f3d256a1ec814c31d75b821b1c785eb428ab62cda309da2001ddd26129cad5c2fc3ea6fb022a6789302af472c9e065ea9b7f95d8ebd25e9d5afa31328b19daeb198cf35b021053bde0eebbd866ee9558e8e13443c8eca57145d2b37d61ccb773982c072d082d91b6601f1d6595625b6ed2c43c7fcadc138dfbcc3bd1c6a6ab9353755b8994f17cf9f790c42f624e1631234bc542f55cbedb4f3163ada4c1510a25a52be48512bd4a761448869470e3c35032345532a8ab6667332865f501cc7e1f98516038a36b8b74d24f3cf0f8a3d0843cdf602d16d8598abcc6d65ea767db03c06136d540664b512a093be1650bac8079cf50ede7dfc7dc8a62bfe6d79d359a2b30d7cc67e810943b0199f556faf15f09475c42395e7d59baf4eb34d9fb01850ba2443ab7502349c48db7b9547e0c922e4785911e2a26d018910d1c2a82f8dbfe3e39ec66f6cc2df9a564aa38d7dad6ff407d475930512e320be5cd256150930a55a992b6d931d8aa33320a62106b914144c429020c7821e9cdf608deabc053719aa1dc4e9b681c1b29ca1e99e3710625aabe1d3e4f6253bee1cd5fd120e7dc81bb88eca2aee212e8538d54468a30f94f9c323d5d7caf584a6834294609d51994fd4573524127014bc034a606c6d4df382fa298537f2f679a8b492a5c1c0ccece8ec1fc4a056da97b1fec36f038f7680417c65b442358ee1b86c11bd37711abfd015250326e193b30699e526b00418f849a41ab4a4bc7a98bb19da3af7ff3e85c428d71baa050942ebfdc99ad00c9386b84095857cc58ca1eebc51426e1a6dc4d26b9b09903cfecb9b8c8e2385f6a3e3e5e4d827d213012bf5d05eae75a09bd09625ffc8ee3728cc8a33806d41a4b872fb7a2c79784113a01ec1ca70b64ceeec0a3370134ad8392a645454834ef82e2fe435a74c2d3127bd17be1403a6488c0c6ff41f44e728a0d485c93446b039ef89b079724346be7b321b19f1975d30c7bd4252906d5d7bf52166b926a784c8c48da91263fc51c0f59ba88523d299e7b37af6118035e5193600eeb6e5e3a8d02cadbc86c5df4f5b784515b3b5fc0d38b2c492257bac09aa949d9de22e368326f3139b969895b1cf020610084c0343be00b25c4ef6ed769819a89bf08f6836dd11aeda02d06921c98ecb5236506395568444e4a53f54ed428d30432c731ca14395ae4d49f10019ab38a0996a4500c92c4ea0b421f0b0e4b60b05f3c59f2997352d4440a1c2501840e67c709bbcb535fe5b326075cfe3ecabffe1520262e1747052377ac9a418473d9246ffc8a48cb16779ee65b77fe11b7bea9efbdb994c8e97a459446e9eb46b0f37022069cc598edc08808055d88c8de29396758b0ebeba85805e8498a6de822e89a22d2f6454cad5d8336d700ae9fa49c29e105e1808e6e64710a7d104d9912f01b0b0762970691c14b61210c3d714344030bb5190a83892452b090b509d691dfea5a42aa60d53bfbceeb8551328108de94a9da582874a66ae957928a6c2716a62a7ea3bcd473ce3360bafca9e320b1be811960beb6627ad425f05392be834a40c5b045fef314fbef86da60adf3194dced0b85bf8be7d11af6c8afb52e29ea3cacf49285078db386a7ca553bcfacb50d5e20bf2ae4afbd922a3aa6051db9a3c8176f9003ad0670e9715e660325c1b0351b099fcae12ec6849ab3607bfac6261693cf238bf074a26972f01e6a02412fcebc06112c39d6a440c05ae5f8142625780a21885ca1752ca0bb574add0c5d504a0ad5bf33710ff31ee3a780e2128328345d886aaffd4421bcc1e220eb2ecb1464643961638582367beb4b49308c0886584d7c1205cce2cdf50292e0213588a805288b8a365fdb90d1d025556233baf1c125f2989608acb248980f94217b2fd2f210a9c88c65b206bcc1699302a82098e06b344a956d1070e821b4bf1dcc51e606075f4d94bb12c5549647373ef76f42ca9b98a0d7189f6b222ecb6e2e457978e6ae8e4653e98e2a7067e22124a2c466a0675ab458ee8da86809ee82d9e0fb9757ac4bfd04240baf3dc90950dbbf2e7ef57c17d57ff5068002d07f339a43d898b8e1706250defc3f9d29959a1396fbbed24da74b6980d70e0e06beb6c52291339378c967eb8a7c5e8081c1ef2d0c721041df4115045594fa470b88fe40c9460c28f4eec38b7c8de1641eadd95892d82e933317d07c2d588229003398f5e24869f965706420c6fac87cb116497e5b02b68d0072a247b112cfc8f076432b7c7de2165c0c3a13c6a5bbd35ef0501c817f1d8662e551e0b67ee56f4f4754cec58a1fb17e6912701c646c7af9076f3f4208e4b0ac2a9b7c1a0caa2f85845272a32974b89d0076893c81d61108a880b4e1a0296aaf0dd4c11d4d40ad1936c4190664c2254139e1857bfe98fdaaf5a7746f91ea6f99ea77a827a3349bb0438c70ab4b6e350127acf3a388c85051f404a556500cc05d4faf404c9cda53108c50b69ff734413b9a9d05944898d3b78c6f80b7a074faf518cb1d17332e28d6191955219627a822db18894c7f8866ed45c7e337ccc88c54d601ba85b45a3bc27de75966a6bfaa9f266aca24c2d60562934af5de5f874adf04ba047097fb9e4a309c68587339bbc184019f9e916ee18938770a9b32ba54675a9c6388a07fa123f9727ad6a719d290065885782bd30f255c64443a536d98841d3e605c4cc3d5a4668a0b295011a115ed95ed9cb78a6d4c7078199d2750fb576b214a0811916400e99751e6f9bf47d4aaea6313a1539840d2e5ffbcb5e633199dec669d1dbbfde0469912c3849046e471b2a7f3bba495b6875b261107114c837d5df850acf1c8f550fa20fb3f0a640d217dbc4604052fd866cfb22c4cdef594645af882a03c59be0280cbf7f5c9a0bef67ff512c96aa5843d7186cb2747461c3f47a92e9da144535a7f52992410ec20a299078f13d0acb73ebb38887d7349762c5c45a214b78d53ed64bff31fd5eb182a84c40072a62e699e5cedc55742391360ef452fa27c864f52546cef6e5e1d12c24226de034a5aac8d5ffdcc350fd139bf41eae88158931975c399410ac5884ae08cbce89ce1f6d63d5814aa3eeb229e813ac241ff8468947f8a5b51efa244779582c33a55f7cc8a62f64bcc5d166a912714a4f98c414a4b15935808260aaae8618a6342bb4579d65d2f57fcb222bdd1f4c3b6d57011ec6a1fd16dec35824cdac3c1e5b0022505558b1ecd46a20759896931b561665f18794e77d96edd2b54b85ac9dcb46a472d684454223748372a16ca3392432c8eaa3095e3c2b9fc34c97ccb1411306b3405cd27403bd2cb185f7bdf534e1cdefb00a9ac5b68955bae9d2a916dc1ab229362b72fccd5c728a5040b1b12b96c9e2bb2e15a141f15d2cf204fefac18b811b773eee87276a9724ae4f7b49a54ba163d3150b4ba0129fe33971df9df2b0d3a41af8a421c3593dffc5bb752856851ab73f34ff94d5b36ed0920da20a6a6db86cbffa35cb86b412f1e566ba9d3ade170dd63435fc57faa686b75804b726148bef061a76279fecd92df40c66326762e29ea5434d7e293073791f4ec156123abc0da1f94c869ab52c82bc18763b1a45635a37ac894ca1d21d32c3d84ede85a54d259b3be7f5f2356968bb45e98e1af3e836c67aec54602e28c543fe9189c0061441e374e9f40a6bdcbf745807cb05aff83810e1d3aa09c56b99a655993cc3a4dda27dc240ede393af6b02f7e5f73020401f7af468fd1b356a62dfe03a2e49f07800f37a0bbe584a1687c22d5ab8f1b3c7f88a0332653654a7216f3d109d7eea685940cfca91248c4bd26f00f73f1bf9fa8c6c564d91be6e7ec4ed31734dbbd33ec34391e6e43706f303712c1f404ebfa5a6d52fddf87f68fa748e06546878406aa1f3f1602fab3cfc44e23e37c4b6a289ff88aa3b30e5aea25edf071c79e14e02aed57092b24a727fe19eb688bb3bc86182c44c8278a8060a943802bb3ef97051654ecf300028c2079a8d897dce43631051a08fb22b75df1905ab2e8e41f074582ebcac4f199b977aa55f68881452b7275835ab3c473dbcd3948d68581e5322a6e3bba5a15fe28c3ccc23c2fdbdcffeac12aa0b0b3fd41f081bb25ba248877eb09f6e32c02175411d2d91ad1aafeb51b7c6307c4182dba94cbb2f95f01c51deab7f95463e9fb32fc455daebd448328e135b2665136b1337622b79fca195fa5c5c4bc46263c7cf3247fe641cd745c2f7f148a95abbef284d84e276a4d904f1fccb262d9aad06fdf3b9ca41a10812693098200c10caf183b83047be8581ca6d276118bafcbdfb6e4282d609c59ed62e4f3bdb789dd2affb01691dc95068cc1223fe79f4129d70e49827c31cd9c7b336a995a1f37cc6d09b190d4551bc1aa84548010f0823f5fe22cca31740434590d249847299cd6f68c3aa43dede39532aaa4b8cdad597d77e8e3333882dd409f68443dbfd587773ec034ce7128b0a198246c3e0d8245cd29bf62907321f2223eeebec95bb7f48b80257ad6caa9f3386e2355161a4cd9199565a5cc0ab525ce206efbd73cb28fe7bf3b0f701b97e4e3cf349a35b315c32468e0eec90397c539d4ba001244f1886d03f411f226ac3a68d08096a22f67117040e637d09711021a8372ca74c2310aa27f8325d0bf8129f1fe8df37b876487808a8d6e56c1866ef5b73ef46511b5f2580ec85976efd74f9aa1398e2fa0f880e261c85ce6a504859b85ab6aee3edb7e3d812aa0595124e175b29f8dceaaf44ed92e537f8accd1b8103cbcf9b3c3f872b2e91ea1b23015be11850617b644f2af4f883c0768cbb8f073fe1024bb5cceed87367d468b0bfbc320014923b486b7b3a0fbf1a2938c9927abcee4288c568ec429b676d83a0bbe6fdbd7eaa23703a3b84be34b7142d2bbeaa447221775b73089ea7905428430ab9894830fce8a0ef69b357764e7586be0f1287827ead8a3b09c1db67435658cf7b71f174fa28783f366f49d02371cd6c5ffba0449a307a6cac97ad7bcf1e805846da6df37a3166f2cdabb1f3e204a8a9a95d6ca44f45a4033a5bd429dab381c3d5b386192ee0104939aa9aa1e9853f85951f1ffe63f474d69ff6f1e8039622a9c3433e0b7ebbad89b0718df2c885efd02b156d8651d6a02abe586d2896e18710eeb3a5aac4c6a87f5bdfafaf520c0eb600e3e51d013d2c3a166263945f3843826f067ab095d27560aca7601bef3003eea1185bbaa0e628e2d36f4f5afb08cf1af634154097a5aef3206c107e18ec5c0e5c94604b243b21fb09615d52ff054fe07ed8fa91421af02cb815a8dc9572331090618a5963bdcbb912d785e9d2d9d544ceeb84b5d9c29c71502bcd92f701d285f8950b0a3f1b3cfde1e6f5872b3d44372f9b037a2ec7080b17267ac5e4694aca9a909a9aac29f90ae8689e5c96dd0ea9bba0f51ffc83cbf72cab9ab7331e86e06eef07f1d066e89013eade3da3d72392a7aeaa8aa84289752ee8353e17d6b0faa3b479f883f1c977f7bd24fe330f75bb67a672450724b8591acd5672cb4b6c04f5cb24226dc673b2288d0d4df77d93ae4a3c930b857e6f751dcfbfd80badac0caa4cda0d5da68c906a1412157f3efe08f8e3b82e9284681b3bbd6a9ccac737e831b95da8572c20005e50725bc520493ecf40d4415479a3dfbd98b9d892241677a9ccdba1e0a11583e1e96468016e681486c16f8832a87ae30e43ba13fb4c92fe54b24955a3155e23bba63ba23275b6ec3ae46f232632ccbd56cec7c54ad3ff882742e4494f3d29b7db296de4d087f8b51aff48b5b345a65be5d81e70729b60bf830b01bc59ed22f2971614c8632441c077e8908a596833c0f62ecd5e1777269890625b69d3304002befb5f8d822a520c453e2af0ad0546843883887b39ab1a904914d347d5b917e141a4cc566cebced5b212094e886f18674174a7e1ef7b2ca8bf2c3ff6782f342e204e383e3219a6e776f0f33bc3d086c40a06b1d0d411b39828606f6b2fbc9831bac6d8cd9c850847a3bf133c4caf42f46474f58f26f9cfc49139259fcc9130e5144bdefc1b3f754dd14153d79851c3bf5e39e99468bd766233785736dec7f3e66ff002e59ad24091afe4ea26b91d91330048eb7fda5136a9f62f684ee5ea76c836d23111964b7455420a51563009d939121d5511fd4da588c3b6384f2f694d134e6449c24a56827947346f5f8733454d9c1821cedf144e43655df91d1366a7f30ad129ffc04edab3a8a5c40a14088e3be70b83e070b20b7d9f5f9d97d642e5b1446ea19bedb30fd54d7b949d2acf1d432dc92faac1f165dfd097a130e00765cdb453b87fcac047d6f6baa4ee74097cae1ace665e5286744c0bde3daee2f13658177a6ed81c7a1be6f19f3ee1d1c8518911c8f37d80dd7f78cfc4d3837a4f091c35cb8a27a7f889a882b11e6983064dc2652d464a806aa3b9fa9163b322d9e79b073f710f0a24960f28044144b9665143c9273a2f5fe5cb7d60123a804635d5d89712179b5ee9c1f45a8d7f168ad7c5c2b88d3fe4c0220c97f4a29c258d6fc930d0dac3997324949a0d286396baf35a88067c16986c06963ed656e6d4fb73f612da39dc2bf6701cbdbab8d5a65725419aa2b0fd28d875845375d8225c012f95722aa97bbf16a6820decb2731ab035d4a8e438e737ad42b7f7f70c34325021211b3c5916064f9c88fc345adc65e2ab2bfbe5a41416d76371348b258b414ee177100c3aad2276046f395f6526a5659a849da4b75b5388e8438b16ee0f778ed3f22c6e452b23bb4e8f4812ca8013e311fcbdad63e904262241160090a465eea660a11090fc46d3da545ba3dc5f289c22a0c6d7e823eda2223e5c4eced88b2c228bb74a063c27850827cbd713d8b9526916f94a9b50ed50c5e4a5c1220ab3a465b2370956c65055cd8df44da833737751059eea96843e9c9de78f1c13246bdb79c8da9257fe8a1d0a8080a203d8d706c30aa99e8657b9e6de70417d0a25e14f21dc481dcc088603d0e1ecde16dd3e500f9551a69c2fc8591ba66e816b942fb47562affae7e3358cba306a190d4e4caaae081f5410f4f3f96d0a095b9748090210875324211319199655519329485d82ef110aa4dca90d71ca2062446a0589eb4056f92aa2c25cf87c8c0af8aaa74744ddaf812567884812fd066d417d8821cdb2f3f6c5c508259b0dfb50a82f31ead8e425d9a23c787dadd9c70590aa396029291c10d79949a24255a8c132e4a7c2a8b86eb2bf9ebf1d89cbef4c79c39d2652051d895f451c6b2a3b3c9883019590f21f252816188756cfe95ee39c5b691b53926f91559c1c588f49b482a5613727a09f0751abbcd01ea1e152b839c559cc2f5ef537c8083ae8df6946eee299487a151796c9b7b9e7ff7466ed4ed299a1384487d9caf15113d898d426d48cbd4377216019cd6c3d1433758dc3b53992e2b4ad951004b08b5241b1fa78793df9bc899f96056b1937a0083990f2eb2509d701dc1e4e6e9083556706043416a8a4a5cfbdd468230b8a73c8f7aafd4f83089ac2d149594b7427e931273d368a99f284375db62868de654f33bbadde6af7ecb4491e04cb0b1d3d53130f588fd6729d2f57b354bcebdc0e318fa21e9549611958458432b69c8660ecfe110ee0c8e4f3ba68175514d8ed9a2a7ecfc7fab67f730bc66a1e064e2e541c8d151e22261c8c245e5495b1dcaeb9e31a3035ab3db3e7ac16b525fa408df93780e8d8b4349d24fc95dec93bd2160c848c03da156e6f5b2050b2e21c596c4f9e7737defff5f71e152299939e2944a9b7f6f5af4fbc7b4dac5d6b73e2458713e7354c8e84dfa61603e72024846382d5d55f8c48889f8ba2135dcd2d7468982e62714cda167063571555b08934dbdd5bca9464e606e506e406a57b22555df3b4e6e9a7b5141f017e81c948a3e6c6d3772ede3f58ebda8a24037f61ada7d653eba9a72e2a2bc5ce6c1437931cc9cd2337bd04a2706a53eba9f5b6b45a9376ad73d76a8e7bafa79e76e90d8f9142c3c3e6efbd156cbedea75ac1deebb5706fd78b216badbddd7cb878f0b8ddea2b85abafdaefd5b101398cf6cd851ca75d4e1c2f7150892591fa6f58dc4cea288d742b653ab491c0be61e9ce8bc283c707b5d55ff0b8dd3e77c37daa4ebaddd03af371f35cce034442b225d9b6c8314d64e0a20c1a94a22946605810451145174bc8f0423773ebc1511942460841c12106e708463838629b2105375871c3d9809bc788baf28f01e84415a4bee1d2db4dc8756fb2ae2008822038546a10c49824ff4dd34716b8ba0982dff7a5d296a497ac2d95ba4b25d00897390f48d6765da73251cdb75333b27f6d5bd3e04af72d211fed4a1ea2994a44e00ecd0ed168a994d775de4ead57d494c488884aa854ecd49a2b3c47472e13c18a1d09bf0dd867eacbf611186ca8be52f54554246385f5f1b12a1f9e28b07d127adcf46a61305823a93513a8ad4e5257b518d80c1938c84dbf91a2e5464667be1fb6c328150b2a94c85655420c604fca1b5273301792d22c16cb3b25753b0e08900ba4c71378092ab4f0e19de72dc05aab42c7001516505fde933378c2078e03de111dd434bcaefbbecea4f14154320a6ba80f023993fafa6fb2eaab53aa7ada18159216ba8dd308f52e8067cc3b0e553d4314997a1caa3e6d916ac7e350f949d6d38aa24da9647a52558a1067aa9441214584ec89f1d6a8020a0bcea098520685182238828ab8f4e034f23ea8c829c96954fa225f92284e234f4cc1bbf158118186423d213f4625049ee48b6237628c1fbb60ec823f26e65d609da92731a942d51e1e1393fd532a7f113da1543f37d2ac060b54357bf7d780656ec4a84c1caa6a572bd8f1077e144675a346f0ac05552a81d12e3aca28ce387ec7ff876fc2297dee4cbebfcb6ceb8696fa1a5fc7cb80ff398e37f335009ffa1c8f42cccf9444663ee67394448c7a663ee689e4f8d4d7136d5a93ecffaa79c7fbef08800a009d46c58f3a0c2f3033aa8601d995100fa2e6b493b6c141cdf100ea5117028d8e54dd509176e5a47354d5c61f951305aeb9e6d4c73c8ed22802f5bcf145f834bef84518973a72832814ea511885c2a8f1070a852a31aeaf53fe2e2273d49a3ea944d83181a7c727851f1580044915158d465e1cc6890a6dc2bde2097e76a612f8796157962b1730dab119aca502cce50876baf7594095aadb71b3493beb588cc8fa77e4f2f5554960817dc32b969e6a85b66dbfcf7ef77e0de22e8c46aae483a0d7ba47471e71a20873d8a303ecdfdc3f3dd43b2688e0e6f5ac2908190f32996c48f681eefe7df78ae20e1cb0f8a2eae6f01377e0806f46674a32597d19a0be5e72e9bdd6bdf2b7387ceb4bc311c269a9f4e28b256a24974a2f7253c7096c672b5bf258995d0d8151cf653ff25a1037ada838a62c2a4e78a5b63c57eb1c4b6493d4726010d572b6c5b226b072392a442553580a4d39229bc4c2886c6c8955627ad42a2941a9381f121507069d6395d06a4d1cd56c8bc702197dc63ea94daa29445d29e91c2bb349ce8585627db04a6ccdb75898e73c77df8f70c0f6080465a4278aa2288a2ff6506bac0fbdf24f02e702cb021f44261aa7ca7a2093b02cc868f9849579cda920e30bd702751755a8ec4474ceed627c7f37aa2f512613cbcb8568c5e63537b30419e2a6cac7c43281c5a2c2536b589ec903046765324f2636a9c55111dded7996a70624013fa1762f9247466bcd6dadf180e00df6913d67cb0b1e350ed0d25856d7e170f138dd7fb69d108b659aff2489deefcf19a82d13008581ab5d390a822098419d4f092bb33c0c89f5efbd7508dbf737651e5def29051de0995413fc2f2b63073e94827921dfe504645ba91206045f30469527f8b9830c0cda55cd99000888f7aec2bd201886e11886a3188661e872d3879b3a2200896e92a1d6a698919e456a0f5e88e282992b6791540bceaf9cf11efe2800dc6de31b606ae673541b7f9917f0871bc1b3d6eb3cafb3647a535f9e3dbdf1973c76efb523d5c60a26a1da78de08817e9d2bb05591b955ae25014e60b4d21cd07d2a0716dcba5de16188140071b329b106113f5c01620c2b5aa0602a5100228d40616206453ce8228d2ec440411b66305922871c3c1922cdf5d7436df9949496d2525a4aebb4745aa76dcbb7da751d6ba4c1d66aab4fc9a07ff5d7f15b83d8f722b5df3b8e30d439293d7a875ae6a4be4e9d7363d93f33299265571fb97c6e2ed739d9f71d68cbd2a757fee087d7bbdebd4f42cdb7ac000df07b57f57d7d6232954066ce73cb808e7233da51d2e974818a81aa81ead339bda46ddc8c2540b66f967c20f82de99bcc7a1d50cb723224a054d3615057de496429fcf8f4912dd7b23128a8368eebde9604204046bb763faf4b3b546bfc7930c13d546b1c0a1230a82d97758ed38c5cd64dd03c0dc31b23fbdfb6ddf67e59da868a8343c5b1df7299d3dca849f692088d6a9a514d57a3ae1cd73616c6032fc36dcc4ad79a88a2d4a935fe34db5dd7f7de94e31c3783c1a14d5f357db5b5fe5579b6a1c964baa0c95ad6141d45e0fb6875d1dc5d1635bfbc3edcbc71ddfb82aefbfc77766898c9400cd35a23969eca4c21f0bd9edad6c880301d93445c5a5f27cb243b93fae2a1b6cc5ef9832526a865623d3585c0f777b081db9a3dd41a1fb28c74018a05b4204280c00003b14c98f4936e22445d79cb92a030a9b916cf792af3d432b14c401004471b2a58c1b2877002ebba6ec6be0dd87a75e6eb7983dbb09bde2ecb4d7135e08ec5c858785566e7e8ee57c666b88e7bdd3f526baeb5626db6069303461de63087592d2a76241e50d402db47c5eca7da0aadef7ed3dbefbae28400ecb62a1ef72989b0f3a39260829408b40d4fcdf6783e3cdfddcd532b95e1855b7bea1d962bf4ce08cc852b2b9081614392188f293a3489c2081f8a68f0bcdb22c0e2092588b03892048b7a8694283bd840b4060b28f8be1d1004df2b16470cd598d8d280e10c15bef8a1072990c8b20588d39fe53aa940bb2a95ace96d188662188a6148c3baf1a113fa2987ae2469ade7917e6fd4286fda2684dc7d60650a1c286e489224ad0d21a79a0da82b77d53e9022bf5e37405c2e97cbe572b95c57c052f57b1d00d97f487dd57c244f61dad6aaae5cd92d089708a737c9ecaa4ef98505a7b936c47cc5b760c9f308a78f046016cbdec2f3becf45d5b7bc05e3476b960673c03d6055b52b1308aa086a096a9030b2d836421e6dc3237be0d050cd0a1537a988aace1f04244081da6a5b53c152bde8bc5e41b70b1912c446a56d544cd3f45114c5174fa2781a4551148700811fc8838808e692a406b8ba7944d8c6d0e77d1e0d8c260068609b519a2437698aac507d5d990dad33d4c268b6c8da236b852c0c8ce1ef917ce5512e42bbcadf167208ba8ca4d63c2c0bee4adfa2c53ed152ab59580906e0676db0e82a087e1ff8e9803ea452a9542af5682a26879e988a49a5523fe45b99ee4d4fc0b24c096d7a0296fb8df0f88d0b1835bb7c73c0f651b3cc590146cd9c937c55a1d668f13c1b821ff6fb3330fea800cbb4082e33534b25944c96f1516b7292c068bdfd7848aca5b9cfea9c5bdeeeca5a6b58758929401c711629b530c5f9bd27f6f06c77bd6ae31f82338cb212505b15e7b640fb6d53697f55ad045433a7b2dac69fe68f80ffa935260d0f1e0fbef73a7e242709f7db00ac038882ab8de23397412c168bdd58cc85ac505b9d46ed18593b46d68e91313246969dd69a181367e23cf8132fc291c8fe7ebdaef33a2f168b72bbdd6eb7bef5cd1402777dc5be79a55194e911c5320886891533cea022a318a791fd229507379ce21b3947954c28f3b1d385ee144b23d31b39c3cff3c4efd16a6b2cf5d57518b5d5331e629506f08c98986603a8d6f070829f210c18adb60ad4ae69e06e6e628101f77dd88d3fbe4bfe036cd93753b65330da2eafff7b1df77e646c0ab73477034110fc40cf033fcff36ef8852153288e27d3fc2749b091c0920d639b0ddb5e05d8b2ba6ec74d2ab40284d129f15ccb38c0fbeebbf2dab2eb881250034cca5439f221e96c2a4c4871747a5ee070a2660f353a22dbdab13ddac068e7399b64a3388ef71f921fd51a3130fad9320ac272e7c01ca7da6ceb03418cc9cff61d65b7e5efa8233a52e2385e4e18b8ba39b34923785fddec94b8e91d51176303d725c4c0e55c57d41175b11fbbea01462b2ddcb1ad8ec877783aa2037c91003370add68e9fe77d9fe77d9e677d5c9a0843c85e3f5429bf80fd2bf8795dffb558741d124d77bb92c66fe99e6df6762bd45d79bbe518dac9c8d30387fb3df51408313495c0533982a0883149fe830e964413ae5fd4d6e915a08052a791bdc9a8abc664dbaa6c0b37eb835d79efd501b7f3a30376fb75ddd775d77a2ec6e09f24ed0cacd95a201c06ed4c0794d205d2ddc1c3edbaee7e909d244db0c5064b98c1c40d66b8e174233074b842062838882156858674075b3069720513a72f31458b2d5cc4d0c4ace72370cbcf81bdf74bc20f4aa1041959e8e0871b5c61bac1931b94e8428629639cfe15ecb6a5922d95ba5e35886658c00df7fbee053fd62743977668a4699aa6699ada564dffbbebba6efc4cddf863fc130966f4d320fbc517651c7116b93fe8701af51bc95d59a61346276a85723a042084654ef0d353bbcad51aff0faa601b2970fa01952430ea52bcd5b2ea2e5f1d05f3d5634e7f4b5146007c8e377df85dd770fc0d00945d9b2965ca6a573aca5a9ad6d74bce12b98ec751a25676a3446d514e07d932dbb2527ce51f53a2964af64f952868ad64ff9712c5a812b55bc85c4ad4629189650ed508066d5b1fecb0a50a1143207183a22baa5882ca4c4b142156701a394289115a0ce5a086a131ce1e2c5e8003285a2843072d4e5beff51d6ce092e7c132cfa9733c1f7ce866a1c9245c1043d78044c8758eef02789ade05d619bef8e3a3a4cbf649d531ef71a4ae7a843d43ad09b04a6c84b057fef8b8a94308dc5d1f216de3550aef84a456f808b1d952d282a5ef2b81dff7c1602722308b659af585805c6b0b5e5061382c60b465329bd18a737265b5e6b9c06e9d14c964b2db755df8050862fccf6299a6089ae8037350f2011a44b6639f1098a8eb6cdbaea910b7d6ba888890e43ce739cf85a95caebe6c6072bf17f9ca9fe8c7cd86e57c8b0cf8b69ac9e93aee36cfbb1702b8fb98ef1c76251a94bba323378bdc3cca52348423b9f982a260fee56bcd63298f63898adfdf1fd62572ade82a37082855f55195eb981addd631a54caa4440ae55e41795e760645e1ec7d79752e6041d2ff32890248e274b99979779232711f27594322fa58c0574bcccf7e4f8997ff99932c8e8a5ecd1f13265d08dd7517a8eb29ef50c6f3c8e279fc88dc7910b32eac1f1379efc7a12c1f137645ebe661470fc8dafa3cc4bc9437e04ea499628dc781ca5b545b5c673289c9447b7b99dd269e9725d8a3a12daa53554a14e845a190a82fd1b2a99efcf3bfeb07ebfa6e0a6df7eef3c7f2a778203a273ae0adac67fc8e56acdbda1d6747b255a6f4070387bef354dd3344d962b974b39cc184745b0bc491263d709ba465057b821445808245d4757ba438ccd16d201c58f0ee817dd743731a9b2f66b1a56ddf1bcf44216351a52ada74cb3ad4a43526b409c125cdb747481b3a58906c3a25bae1974152d45a575ce575f9e185d74ada4b67c600d43f681dfdf07886de1b2c14601581980df96685d237b89f692ec65b54a9a4ac39e2cd18aba6c5ad3787097ba4b0f84e7243eeab949b067d49c54cdca14556a694a7d45d139dffb3795faf27e74295718e147e9619e9e8a3a77d9eea337ac737c689efab4edd2eb38aa4271576d3ef8c22e79dbdc5a038a34dac963c8b8dd6eb7dbcf0f08fedf9266f5e53296cc94e1c080d1ceb9cb0b75ee6402efc86339be4b79faf17bb0cb6b698116464f0831a5969eaa3309bbe838818918f5887f7a22e18f4f44fcd3a36deb3a2fa33dfb2162d44fe4f4e257eb325df69c5e1c3ffc24a7174f2a213db8c0b720a3a04a832d8e2863861bec0c4ba3eebb1205db0d7e97d648ae37ac0c963e5c2e10726814c14310471ccdc020aa418634d6a8d1aa104167879643bd688b8f17d9868891c11445282122891d949c350c308e20e38a188c7164ca49c44996140d2ad440da3283501839c0218a273b1471fa7bd7b22ef0cd0fc06db3d65a7bef75bd48114551bcf7dada9d4eff9fb4edf7e3085eeef187774be07b3d3be00170d0a9ecf76ead2d896180fc927b7ae54256c00ee386f8cce61c678b65a3be7ad039e0fb87a067e60cecbaeff3baf1070f524659b91e8c760b2a37123efbd81872818ad3b580ec902c6358011a9204e656200169b1f7de7107b5ba80fdab113eb06083346c604871d61d2c51411618d6a812440ca77f05ab4da236050d7f9ef77d9ef7d174f70311d2ddb52cd2863f572d44b440091938f08005248c3469e209168e68f18205191ab084890aa8489979e1e4ec07625b0da8420c2e7041208df1c3f97eafca7393c0026ddb2efdf66353603d53c9fb12087edff77ddff77dafe3f7262c9542971093e9de52a9542a595bba1f7e58d65209b42d957d1c6f6b65f71ef52c9fabd616ad9a4ca2ca87affaed8d8b13afb4a6fbb517d2d497bb773456e0990da375e6e96481fddb094b535fb6d5547cd56a294b541b7f7513f67bf43ebc1747ae6309a86c7aab7a22f4a7a96c29be9a11a089a7417864fb5d777fe67dd64c420d70b6dfe51d33ec3d4a038e3f4034088fec7d77ab7b5dbed6767b5e09deebd870ab70640ff4bebd366121249ed5bccf63b566466546a54aad7e45f65a9d8bea799ee7799fe9a67d9122dce2664b8a8244946a0952dba1e9ea6eeb16db368b363c9807f3905cb67e242b0c6c592cd3fc27491216ae86c026f23b4996262938838a94b418711a855f844504164c4ea3d2a3f80a1e90429eccc27c113ef292b2bf3ccca3b5f6d3799e90079301f7578251c9f49fdec8f9a27a7998ef797998ef8729838cbaec81f95319747a980f72f99732c8a8e7e561ca20fc306fe40c6d5bd0248edf2ab4cebaaf675090510f0ccc1904f332d7c793e9ca13faac7655cf6a75ac5da1480edf64cf7085ce61580a0195742d7b548f76c83efbc14231046aa9787b645be00f75e56f94948d880245f6f72639049d51cf52e1c1ac935a4303ee4a1fb0a7c48b95ea59f3e92b3d35b02dbd2b18ad359eeaeea2a3c8c0e17043381c2e8b0ab5c6dd1d87c18f05fcf190c9849a26f37a408165686fc9a9169d2bd83fa60aee1a0e6a8e0d7d8404aa35feb296b54c2693c96432938b55845e541cab313386048218ffef5c8f99313316b3269305c40b43389c41451670431451ce972fc22a02ca91d348fc1622076791d40ee74b6944f3a22b53c57d69240e3384e304eea1f1afea03554aee80fdf171b65c6b389a4dae355c2c7bccda988dd9f16dd943b7f4b5964357e8de9a4b59024bf09500d13e2afda8eaca3e8a67474747a5253aa9d01d2fc88ec47be8bd9f6c7ab475dcccb5d6fad9d429a1078f19f5e0877922a87f7922f8617ed471e2e5514f04e6f1cb5814601e7f8f32b63ce1e5518f3f4aeeff669ef4b1ae7d39e0cfb60a8451bda8825429f9d644a9c10b555809553ec491ca637625d6d3a46a6c2abde8e64aadafa9637b8995b9e95f6f3fd6deeccdde7b63b19b0e186e5ebca0ee4b79bdf4d5bd3ae1bd65607fcd4ea86b859ad6b496ae087e3f7e180451ad55884c2aab5240e9ab2b971e47b68fe2c828d9b11cb21fd904d1c31d022484055cdd74416dee6f13be175f1a968f1d13fc765fbf71e988703351092105446791dac4113a4091c1f99524f852f1bbe900a00177bccccc30ebc6f5e1b29d999925e11222d97b597d240b6b6da5b16042f55593fd43563758faa0efc30780a2854aaa3f7fdc74a802553548d8c572f3ab7608b64449270546ebcd5eef4617f8c636cc94466d8aeeeeee06418c59f5e57fd3f4d34f3ffd34fd47404da8a6834324d3b64fdf230619b99441635983c42edbf35cbf6305d8bd9429c12bbbc8ffcbe8a34dcb3d044edd70fe28548ea3da9179c23dbde669c9b9991ed12b7f4cbe697a94652a519cd2f8e051d76690fb09af445b89b1968ab534b442298fd78e664ef3234faac20ad93adce635b2da7ceebdeeb597263ecfda5c811d04bb9b06a682a4a44e0abdeebbf77e5fd209033e8191da02d20f5906a418d268c9da493280410ce9079996ce75fa5da0e2785d9ada80d224b825b258522c75b95cedeee48df949492e312089431e159ed775dd1533ead5c44c7312bc1a0fe09429f6defbd56aa520643cd86c3e3eef799e8f8d4543779da856da76db9905ac08298911d988dcbd443b5bc0b5d6dc9ff9bcce9482e3801f7a9e288a372e1f3a22ecf8d8df13291a699ad2a434290d0d4d4a93d2d847692c4d9ae6eaeb943d1d783b0059c85f0c35dc9cd4977d3206d8888bbbb81f70b6e579a997da56ad35ad29089fe5628b1bf9c771eaebc3dd2c884b2fced3e2a5593c2ca98725fbebcc66336b2d0d0b84baeaef342da561cd716abc4d2547691bffbc57a289aed5b57ade7749aa31100631c58f3a3dea47c8162ebb862ac10b43f6b26f34943d46767bb3b5da5a53ded7fd0dd8e6d0bb737b7a72ea4614fc3c9548f0bb009ea7ef71851e79c838964145cef1514a327aa324b9891445094b46ede1dfa9ee91cae22a0869ad21b22b7b46f61f2d1ae88d5d59d1ac0a8d71e4a6839a0dc5c0b39d6a658b35bef7de7be28d039190906d7d1f68c9c0d123077cd3b2865003358084ea80dafa013ac386b36266435d9d8173d8961fa0db2df7fd3f8f90100c053319e4724040b91c502e07823d6420812ecc77b080c18cdecf7375bb3beb86a7a7d6cc9ce82e0c8674bbfbf46d829acb39b62693c9640203db3fe2301808d9ed3dbd8347ed3848b04f058b6c364ffa1ecb573a12989b37601809d908d7b3cf9a653299ec2aa089250e4b826d403298ece443305fe24a4493f86084d586f2023b50c961335887e9e071985de584d0009751510e2cc98c8a4a2d036a992c67b2a03886e11876ade90ebbc3d218869dd93158866ee18e1a6054379e4ee3e94483f8fe3f29f03fef61449d1c94de84b241cc8c8ac0483ebdcbbb7cab44375dde73890631eff8633c7dab7c72a7a0634fa57044e5d309675ccabc7c07bc0ad000cb94e03d7eef71e9f2e0a34ad0cd54ea63ca7a02ccc7f4c07c4c49da95cb7f1d47181f97303e2ebfd6b8946810339fc2eff047d50add06aaca61990298eb582a9be0212b2e18b96007596ef041a68ba32a3b30a1e48a1b9ceefe04a82b7f1bb015826318156957b5465557fd3dc59457c0ea07e5e20b344cc3344cc3344cc340767ebc8c569cb5358a2c4cb07016f12a48a751b7b5ffb71eb9d96a088cb4f303fe097d9e1e5481ed43ba1c7e18fea81255e1873574f1f3efbd2721ecdef3924ab6be9ca82d2f495df91b1919616f68cbec4d666f8ea4d63889dd6cd8bd773c0269481445fbff04f7bda24c5b1ed67c28d8b3e186db964b6506f535a3398e67bfb928208511354011e5891853a46ab6255bd85002052ea46cd016e97adef5367046c5d20d795eab00054b5bf2664908eeaaafcea3abbe6ace79872ec0c70d49de2cf9d911e1d539a5f7f7515fde0bd9bc8686603275b7dd47efb000d996cbe55201cbc5c97e638bda14432f2b70add55a6b3fd0ff561cfbed1ea1cda8e46e977c56a29111000000800093140000180c080683c16058402619ef6b7a14000b5c7a407870409988834994e43808829031c619040820008c91a1991a0b927611d5b519b12db6d136948f1e63b2cd2622139e3930147518ebc767e2035b2b1b847f6bd4084a25b1b1c12240d2725fd8d8d3760ef39c5aecf4dd930608db1466715eb24c79342de6f795671e2c1eca094a11bc90ff57bb121191da2c8a1e504dc6308ec358a7acd48fef0b82c1ac7d5ebca90555827f11108a25b716211629ab11a623ef7e0156d82ccb8404384d7da26e84034ff6bc6d2d85dab394f6610ee07245e5bf9ba761b1e5374fd1b07ecd9f38f55a43a5e8d918c38e3a1b51a9678bbe9df7fbd1a703058a775059369a718cde5aab4af9b8d082535507100c8858dbe589ed3a9b2111e576c163cebcf6430d68e5f066435ea88a0e016c5bdafc2d6f8ac7fedad82ac65af326773640751c7db72727cf517c31ceb8d2303045866bad7ae5a15610b00339e60cd418e9988d26af8e4facccfd70595eb8c56735e3613b29d342aa723b808634578a2ca45d702ac51b614e76842a8b55e04eb34f33dd21435e953d979dc5bd152c9010a167d9832211505169d52386bf1f15db4f96b275475c816862b30ee6d06f612b0400addaea564a285509178574e09e9e0315d20455f5cf063b7752dd230d16b239f9c8aded8d8e0ec743380bc745c9da0605b097d84aa8f3c237245625189d24421e6f51f468232462e3642ac839e5b95458f55db9b999d5a581cca0d05766a0aabf92463438809bce890fc8d9a533743cd869eb9a49d3cf8ff875718ae3bb659836adb3c784e6b67280b3ae1531a8e955ad529d07c83002168b3e1917738defb69f6090c137d9a0508dcb4ce1575cc882dd8dce7b7888aed44412e7cf32aeb265a49730460d3f8a8dc7bc9868dd4f1931a63b2974ed442824c8432127bca588908bd39abc9f3864115ca09b75c4d9f1c5bf3f0a1def0057ee318409bd3a2330e1e2ef1fabe46bd29f655293ac58d4b937dda4418f01ddbb763ead7487d9496a45562657dfb836786c61efd6a0f534bd578bca4cbed208a6491e88fafaaf5e8d6a7dd42614a57b88f79259bcc929ddc0a1455b4b4a1ca9909f32a907ee264a57b5116f4b673725b2239d91be65adf15591f20254db70f855c2438bbc6be777249be7b55e1add246c3361c83f34d3d30199bc3a5693f4706ccba55e74e092c8cc865eb31943785c4292a410159d9ff091b081ab701eeb74b2b3f67171f65c7057129701a93346e704393a083a2b46805f178a7eb169154e690bee104692342b229da3f7359ad1e2e36cf49cab9413d56f614db02241b8b40ab02383901b3035333903a9b1be474b240e5836ae3c0a9a7a8395e7e166a579c50d4cd86f788c39b11c086cf2f59f8c4f82aa27f104dab6044a558f08689505a7f3f282fef3e5a5aa645574a90204b85f73516117786776a68278fb9592d7d28383f52366243143a1e6246d04378fd7706a3ec694bfc7b72971e9635be66e274708b852172c06d6c5a0509a20cfa597f08bee503be1456c9d6640ea1dedf278c937376f53306e1e96598623a33e3ccca01905c3bf8717eee55bdb0ff60d2132eef0d1790c128065cafe25cc10b827951cb326a9f5612f2bbfa7352b2c05724acb0daaf39b389c63b7149986a7399a3c8ae8aab034ba4fd018efacbd67d6b6e84fd5ceb4eefefdc4b8744c6049f661d7ca57085db1baeb1e8f9378fbb0836a412fce6104647e1dc354146434421bb6da0a5a95e61bac4dd8f8dda89438b5eed065f3f12dd5cca5edf2aceff2220a99b005560f68b37f5463e16f9a550357d018eb001a2f77baaf8cdee325f6f7ebcda9aa454ddb37a38d84eac316fbfc2af237337ef6cb745232d19851f96320f5c37225bb62d5e856957bb9b80490d4fb6feb8cf4b3873ac404309337dcf90aaed450a9e931fd20a4082bd368caf05880ec3de6718acc386a191697caf0496b65883f88d56245f1a726c83d437440ea60bab71b1f35c49a5ea3faf2bb030254faa9689abf33738fbbc5ff6bdc2bdcfb11a96c5d6a4b4867cad151236b4f8c11d78524619e0634aae46b0609d61121225d84870eccc9976d6686415dbc5519ecd1fd50d6375a215437f5b0a1aecbb624a74dbdbe3279aa362208215173c435f50386e6e1d5074b6420ccd390994d442f4006da8230f6200d4dd20a9528030638191b9f009c7dfa461bcefee1ed4020e95204451e5056bfedc271473e016609309adcc6d36c6c0acc5d6e03171310e85b5eca88db2d89ee84b8c122d9cbae46ba0318850c3f20fa6b0bc2d44082118b23a0816c7c312fc86aaff52a57a93843fe62ddd71c2d5024cbd9568bcae95e97df4d2f61dd0171900b981437561be12cf4122ade5ce864913b5eef6a6ad280bd1d22b7b2ab21581bf8cf0812ddb8f7780c4723d3a362269900837f6bbebb79a5daf9c72c30516a484c23c5e0ac77e97acf7c22df568ee342a04c12f39a0bc2b9fa0ac31e532f15a54f18c86f6ec7810fbd8e59d4db6f370510d1a4b2e20f48912a97330158f0ef925106e11b66784b795f227d2bef0460ddf72b8378fb796519429fd0016ac045ce00d88fc6db09ff048998cafd38888939d0a09284a200f3e27f00c7f5d6ba986640dc66a96a70904962a5aafe1768644533dbc5ce35785471c381500ea8bffd0a1b6729e0aba174f31a306902c6626dd8e673c783eb391ebec219d0e12b444a28c337d3605cb932c1052e032c0ec3571463761abe427042d45e7c5276af20fb654c638a374ab6f10cdaed4ceffbde85d6067d8c91975aa0b1c006f7ae27ed0e36f80b246ff4f8111e9143848569668e8a9bef79dd6841f4ca2dabb9ecbbd01159d6f5a8fe80e167e8551d67c2d220577553a81a5acfabaedd9cf8c76218184bec4274ec59c56dda5a9f8b2e80157897016f497e923793b52e1a38a2ec85bbfca96d34f9bbb5f04412b038a3d2e93d0698cda9e2ce1ea258e1eb7eaab1130a1ad8674818b9734a8a58909f6a57ac514aa8c787bcc76a62637dea54f02893b02f0f7557badbcca661d2ac83fa2c133807bc7c52aae3efb134a5342e38628a69313ff1825798de5bbcb6653af5955feefe94a6d437cb95e74536faf3888e034b2838b671878163f3e2bf729e429272841dabb2861f802252f2b73f2809b452eef4f91cbfbe2796f5f8033beb5fc01c7c05651bb1b757a7741c667936ad734ef95c28ba1ab9653883db0d366e625f97110c585e015fbc00cfc31d9e6237c30de9d90b24852bf49d01ef8171696d37e6cafcd0fd76e90e871248f79db6dd5893cd7b9ddb0d22d85adbd550875e6f7aa780e5d2139273acce07d4882f1bb88831acfe680dafd0e82bc8e65854fbfa41eebef576d920884095b9a2844b05201147373897228f89fb4c82ab965d92da9ec1f294e94ca6637fdb9ac32c297a8dc94c14dccff86ef8b521b89bf52eeb047775832aaf297d1ae5ccb22e54d5167a70b29cec7e18316ba45d52ec71db154171892646f96ebdac38272e5bd571860f643a4ffd62b6f8a01c508088295f9ad3fb331bef9bb88ab3b9abc8e069d4196aeace59debadfeccfe273967415e03091c67d10a8f7c459867bf0fc2b38b0acfa8e42ebfaa4e8be1e0899fdf927679d8044970543e67eaeb58ca5c8a707a9226d60533634a4408403f90fb00682c22ea106d5fc94e6cd82af4b3870bb8a1b5ef0f9ac868dffaade7e67585a2349e0d9a945762ecdd9bebf940d6a3bfbca249f411b098cc9c7ee8e8165bf43aef5eb929d52aa83aa660f5f1367ea7a8da5ea00138166b551977b2e2f7e2c6ace7378d5c8e928e6d159f6d8f16e693bd38b1fd1bda0bf4ba372803e35e0e441a78c225ff9fb5806793d1a0dfaf2adb16004b234c7b99d1431e646bfb64e0b3e3106409913650e7c69e203cf051a5d16e0fd2f82f25a86581bafc65acb2fd2866a28530e4e21fb680ba70f01caee8d0213b9dea800861a885c80a01243ffa8bd5488b1bdf22c84e1d2500fb1bed5f77c02b201b4d7279d2bd56e648e6cba2b795c6c825752e48edaa73dfd129561838ea20d87a1971aa3c65e2e557263e5c74e246d2b773a80db9806cd6e44524a0db0227e4e7acd05173edd59695b635fd828b7556f09c3981df32f89b1729c49e11d2246626c37aefa2392e7498c55a304c09667c2db7ec8d3549487809ea74090fecc7a82b462ece4cff19d0193477852f8a2524830af7237eba2aab3427012706a051cc901e7472a4a742b262af4eae78b4234cf13b390571b0bd86f11ac99f70ec5600d8361ede56d634983221c4223936845c8062391c0dc8bb55d5566ac919afc7790108b624ac6bfa6b222b975543adb7fac5531b567923c3f0e55174d1773e5259f86c97cfe9bb3dc944d81b8f83e94d1b05117da902c28591363c079f9de720c085e0d5326d353d30fb09ab5ce577c58e51a671cd2a25a8b07b2ca5a9c952776520823b8997e970dbc6d4303e41586ac643d1889765228bfd60178da18395037f4c58515a67e6a443e1fe1b8bcc1eac6643d44bcc410dc14f36b196950d6303a91c9832fa2e346c2441eaa70fd589dbbd461e134da9bdeb2ce1b336b4f65cf78df47512b8d9935bd9458531a3fe886124c464e8a4dc3beb32e5ae7bdd1cee1a4d52efe47e263c649c9da10485ec065ad2ad13184635d69598b2a2d30de24dee51463d57f710dd6650df3a678733f0164df25b8d7c9fd074c04b155e30b823ac643a9033d60fe69cadda03de8ebeee41be44d08ae1ce3a42f76089ade484195a484309986e23ac42e0d29957e5455286993055e11faaad9d0f9ec865b6653a2f14b25db9bbf1ef178918a0213db38f698f4ba4d3cd0957270796f1a036218ebc003a848a59f5b257e66dc0a1c45e4c51832c5b15a09d8c55e0459164451bf0b19c006bc6df8c8c86c568796e6553403df38d3847b8fa6f603180cb63d4b01ab03424c513f9b1e3f01cffc6042a1aa28453807bde10b990afaf113cc2297fcb53a7c7168441ffb88ad38e81e8504050a5ca718e27122dfb4e8461e132847329087e22330503849790338cecd125f580768806fd48c7c2b2d6f0627eab517524246d7542e5817d51d57a8fd08dd06ba835c4eeba7f70518e124d711693032d52a8b7e577e8675a5927a631c77c788b0088f9e4bd7a3042bfcee79262c5f08fe370ddca4c600263b6fc018b611bd8671099e6a2028bc4dc4462db054f1e282dc69bb52b56e69d3bbbcc26675cd4c41b776e559e456e8bda5b4e3d955bb4d56f768c358c75e910ee018eb81286d30f44198e68156bc0130ef68f7d8e8b91a45b3370ddc68de3c6298b19e747025020d6d80fd818342750cc737f372cec20f7a3d47281d80b72c264919baef1125334d3d86a0de5828dd5de0e75967adb02d98981aef0f6e3983cc7080008078f2972b62cb696d173f9de2f52dba8680addb2e53636219d23938a87aff6e16ee42c7a796749979bac4d09e907514d073471f57226887f860cde28e14cf3c989baa9473a464a2815b52eb721c5db1e7c77c460a549f589c4bf590328a202c4e3ca7efe7ce5f3b38bb3cc8cf17051ea0a7f82d76cdb1cdb58038e7dd77f160a408ce56ca614625cfcf12899b2c65e024b929d3b83b1e80ecde627a6205c383eaec8ff40283dcb0d48c8f2b313cc9b066683eb7789dcf71383c29d7394083f9400d629a05af486de605e21149317006425115a72d9e6854091176375d8704747c572d174b410347106d9c5e33a006895d003985b7a0d06f19e8a8ca45ec3a6edc6fc46c4303823a426d3d29a4c20efec701056bdf8a3a934fbedc1ee4a146042a32e82fdf80839db2c218052c110f5de4bafb7fc08ede3d604f693862404c2298670213d3747f02dfe86760f42220ca0a7b610f2cff95ba97c8d2aaa321c58fa1584ee6740be5e519154004973b6b35f099028808dcdb239adc794b74f7230a2183d6122e2181e8832c7c34b07c58a7534f1d05c52c3321f15c1e853cd00fb275968e14795e67d9fc0bc3b35fcaf62366c00005bc8fcf78ef036fd921b50ab390112d2b89b4e255ea0371552d4033144ce62df04961f4f21103dbf2079438f08544805d49d83159fa95fd53ba2e132e93d942bf03a4053d28dcace06e3237c2fd0515863094f26eca0b0282da5e7a86c428063e8c47de3e2685a1b9167da827832dc1c9dd89d74573c86779d214697251b421f0d6383ec02570ce7ca256e2ca85d68c23f0ff5d4333441f9031ec4447f364833bdced29616764194ac14f70c7f663a5a43c47c15163bff1e029f531051a6b336a40dff1796b25ea4234d66bc21ffcd0cd4d273faf2cc65bfa72acfd1220faecb4db3bd83b74896a8f80b00f8044d56cb79b34008ff2f8dc82ffc229056a1e3682eb99aebbd1a9f9a9427285c015f73e0e7a142342eb674e4f129a2cc1b87fec7d715b6ece85446f630f3ed228cbe9804f0903e174be731ab3385bf99f6d23f3dc9bde2f87ab629baf1ba47490dcde9d197bc3e5eb59915ba0b7ecdba2900f92db5c08f62db1cf249e619ead358333c282af53d9b95b326f8f5596ed6de2c30f4d775a9f9794f27b3b3e6bd4c0e7ed116990c84d3ae3da5a5f88a6edcd58c2cde5b812eb63781bf0bb895228b919b54bf3b2ab6b1199a1f5f4e02789f714fc5190f50c172104607ccf52e35730905eab70a03e5b409612ee771ff789101f4f239bbd2c9d320a2048d109c1123f86d3cd29177e59e9bd06a45a7873f96488c756e274e152891c100b465728630eb1b02d8a3fcbb520708aee920490c13af8711c4f25ba253c296cb6c759576205f25f387bfc87cec08fb89e80fe3c70da41529ebe27680c6194e94c1e166aea64c68120aa7e819e9e95160e706a40e336b7e9597022c7bf87871ed2e520ac59c8c48287f46744f3be0a713628b9c024380ef3bacc31de351ce1ab0c0d241e06280f2704e823f103fb1d6d07dd17cb5e11871a785d21d36a325051004cb5ad46b28d8419cc7ae77384d8ea6352d4c2744194613f67c984057edb260074ff31c18551ab89e0945415d7e4a25c4f84e93d51c5f86a0f4fb69a70a03322274f7594ae0ec6d755fae868f8ba34521a1655aaf932739cc1a8697531c86a33e807979b8fecd9b61dc42343d4d3484c83951f34b41ad5353b3fcd129e061665c7b1414cd9b8915791925b479bbe3d0226560b6877a6806f78beb8b591a10c5bd280641ed6b2d74a59444662065d4b56d94195fd74cf8a1cab220cd1b837209aa1b322446f459b555cb122242bee3d68d6b362876045bebc33f7fa31b28badace88f3873c5f6143bcf0e06eaef20572cdf60d8aa2d7abde48a1c4221e58ad40b87ebda41d76c4c0687aa5004de000dcabbc867fe476e5b42cf8ba96ad7e78af31055fa2ddb4888ba3fb253d5e6ce9e6a47840d048008725bf8f473ecf85899e808739a889e770486071fd5ec3d1525783fcb1b346ca2c0c9eb96ec6824ca8870fff8b1c4e3240d6c0015f894722e50d7c4a99ebdec169da853b5d336e46c44b5f52b2608e64cdf278fb0a7aa49c963dccfcdd0eccc16281fc70c6957ef5fa5def7e3a6e146b316baee4509b0d024ec6f9afefe7d1c49a0e676bd54b86efc0ae38b04ec575a17d58eeec0e42dc97d36920824ec6a627d86395c60bcb63f9b91323b597bdd1be6f4afa229cbe77615d5c39246400f62f185be23d6804087a0d02dd65833e9e6a123ed00d64b76be321d757c9aabd459b46beec25a3db6f5d64575a8fc0131b1fc40f97b98431b82f06bd35527e6c5b48d25de1417f1c22639caa182b71bf7c289539d2a72eaf636da9c1364b2c429bf15de1af4b4b9d0e505eae3f09c12d0f9023250cccc7eebe2f295f029460d035dcd63cb567220db3070a660bc08eb1345e6bde0f858aaaa55a4491c1a31268c17abca9fc98647ad0ef8c3dbc8b3508cd6b2480d894868ef2d646d5b4db3405cd4e4c65a401114594a415723d2f2ca05f4bfa7943ff049e6849f8e4a31f476bcd3b38a9ba86c0669485d212957b5db6541142367b65e48fec751a4f5c215fe4f9e8d1e5652f756bd770696efdcdb26c38ebd985c5476989528b861a79b6b79fe193464ab182552cd98663d1108c38942f37403396969deb62179b03264c8dbf7d3056f3d4c4fd0336ca60905b7e2998c7449eabc7d4da346959b305d3be2f46367b07daa74cdabf7b7c0efc4041472c60ca1089a13437cc5fe3c1a16398f86c775f1417ff444de3e035a4b76376ca48dab56dc1d2ded5e89e866fb34192f3c04d986cf75abf9f5022544d783d361fc73d74b24912b0d89bb0b274f5adf90eb8aa116686d33a6a746ed37022ceb4c3b9e9544e75ed26e91f40897c2d663f4f88444123971018ce1b7988ff5a8cdcccc4937b122a0942d436cb53f334e0c3731d0a4beee9a19cf444ba9b0f9278544e3435cb643ee4a30514c2f51ab158cebb9b2264662f8b0788104b89c4b3012bdf46c7663a65076eb81e304d81880627b70e01233361c1f05c21221e85e48c53d708d14ff120a26a0ec0c7554bcf61ac883f31603b222827248cab9a2353db7b4579153dcadcbed6709730b6e55a13e5888b886297e5ab09d95a6353cd0a7447290c0e68d4b0cf8a3e093c029ce1cc4f32abc0cc48c5c81b9cfbed63403c67621329038382d075b98c9ad356657e0e2496cb2d5e6691227e661c8a1861e6695aa1191acc8f1383b3e98b690eba924cd91a48e15d4138f47988cfb1e2f00d7fbec0ac4209b51ed9d85402c6e318daf8dd0e07c0c8dbae04bfe16c9d4bc25625b3dd327b7b7f670e7f5ed3ebff78051c4f5dc4e09e4be861aeb71b0f08e0adb4db01f7944b87870c7a45b885084eff9746c2f8ae8bc97b56b6f8d2cf56697cdaa67dac43260ed068066e76564e5dc8757c878cae75035d450518beee5a1d0bbba506a2a416b72f64f58ce624046dc0679ba85c40fb3f063d9caa13b9618d36c82a7c12621f3922fa198fb8275a1604b02be0571d646c81181c62ef9cf1dbb4c8c8e667fa6b6e1077360cf9b81a7bc7b5e9f43d8b235d2cebdeefcd50d0426e406e08d68d4724d95b7424cf2948c346d2861139d74e730113454cdd0a8b963fab14818cbf37c1e69088d799fb31515aea4caf5797c122df087d023507477c93cad98dbac50267e8338c19b41c1e6c417d7fc05c902ed0be67fcb9629f47514ed8075c9c8ae8f3666a76bea8f942961c88c53d7a7865436bcbd3325d3f3af0913e94e237340b08aaf72af7599e106d437ad6ee2cd008e997f813210b5e4abf89974c75af8a5fd4352e4e2710a246285162e623a805a7be55b6c077fa3541ef219b2b83fea60044919342bf98284572830b327047d07a1f19b95c91dc2e0d2b0a9d6679401e956dd91a770b58756d57204094b58d552aaa8b14840b33d7eb3441299f0f649036f38392d583c98a6d5d65b7337464f1df2d300734802d98b46d6049a4b435ea8ba645a55cfda7f3f0818ad2efd7f974172e7d7d2e0f7bd037ce33c48ae08e2f0b5f9da12d7343e794f605357ef641d2c96945cd82ac01e7fb2b500694b6658bef7758bd2ac58b2ca3f8f15a67f4bfcd148c2747ed475d82cd37c52ccf49903f64e5a8756643e03dae80aa78b3f05937e3b8357cfcd320f015c8264f8f8b7a31664e2f4eb95ec6ac7a5a9f48cbdb24e2502bca01016d4c68c75e382a2f6e92e318df967812c063788a52c9b24aef794479162584c4f97fb1d091ceb764fb76e3d8493f134f81de23a8b76fa0cb420ed01f069cfd63bf4694fde646b08054f0c505794a5c93c879600a1958a836786955cdaa474299d3c244b7fb1687777cb1bb1d2c3c961ded618f476210387f927237c8e8ffad0edc67da2146e41990de6e94bb176f45473d37b72a0176f57b2b08e3360b208259f8ef35ec53ebea43bd34edff315bd532f637e947965ef3165cf9cd54f47e1d1ee8665615132ea4893851d66b79461ad53310c287bfa6abfcd0eaa92e35a255d413f97e7db7645fdea31ec800cf73b0514d80871a7f5d94bded2f8f1cf4132b604533f5e367040065c529acf4f82760573a33caafbf2a3157cd1e5b22d19cc19ae830918a5e3908a00a47d732067d5ab1032099cd9410f64d7919f0dc322279eda86b382782eecbf30974676add131af4e04a6774b1f46b30d8b286dee6279dc0e19ae213d912b07ea4bae5fe1ac6bf0a678fd60bb1bac8e2ccf8afd9abdbc35c90710f79cd6fb0dd87c9862552f3bc1903082b4de06a49cd20338b9d4080b2dc5f9a36f71720b54c9205ee3a77e9d40174a135ff14bf195be73b5ec4b7918ded011861de4bee706da5a41453951df5cc26987ee2407b00cc5071eb91a89b68b05bbeb0b12f8179d8662b174546f32adf2f85cb0ac08dd6e0069210db5594f9baa376838256844cee99f626fb4e77022415241d50a28ee9c91e72977d4245a9f7ed5cc202c555a976068e1719cc4b939fdfa7b8bd7146eb4e822c7291feea9c4b880adfe79a3f8bbd19820bd958cbdf03d4238de1091add8cf72649af3ed36ce97df106f401c740e006dd182b797eb710c05c7ed7b0f2515b599320c1e8ae961bea5c6ce06ff59c4bbb4feea1c10eef0ea73280c6be49cbe291915fb80cf4749636aa5a5090b8ea3c6d69b7a7d057e1116b79b5a233c840aeafa97d68a140c6deb3be067058f3e277f1a17eda8af4e4fbd802f65eb1bed3138c3323460cede507e26502d3562d7dd973cec3334a405bd45402a69124982f5eaa44cf5499f2869150bb31fa71a8c48953fb8321a72f0c6510398d0f2636441d09058bda176802a386b0b686d84938e085034673e4d97e6d698ffa5a52be02c3a0810b5112d6da9c23e6ce8c694da406f6c735a6d904b9bb3aa1c0050e6f7c1ee8a4ce13c0abd6cbd4bce5bdf28e113f209228ff82488c3034388cba43c42e7ef81f9ed88bb72c81baccd521195a76b5917eddea645bb9268f705d3158b454d8803ed0e5a7f96fbad415b7abf75b3d1328e318f5b30eb8d86ba399daf612a400c979186f60fb18147a43cb150f87ad34635ac1aee51633bb8bea79ea60ae4a177cf0db076d25a1404ffcac75c692c62fd2aa40a53518cb79704b829773253669ef61d438e67a3cde71b4157283d2e5c408ab18c47280aeeae2c7c119ad833a34b7d8f38b588c9681fd39b7960ce0e8ca147ea7357d6f96a1f97f087debf566b0d6c4b270852c20b56affee74a6a0d81f76e73a13943c244fa0aa370ae80d46a3f20aef9028ff5f60d5e63698a7850f74a8b928ed6800866d44918d2c3344bba347343ab3fc3326a7ac2ca50cf15fa66c363589ec247cc766b1bee183254823b2ab4ae8042934b324d96af3e6e3f2d22897302b7128f975acc973a3a9189cffa8b3af292d0be7c06cb72608b61b1446f6388ba75e9e23208f255feb58d6e4b66aea69c1b79f179825aebf49829064e92ca86ab1def055cf260d4b900019c3daf7471f727daf5acb1b9807f289c490cb90d5d8f81a3265a23b896af823988189a15166b93246ed294c18af8623169ab15db44532678fefd1d2ebbc29be7e1c0fc9219b4f53a4e87d414a4dc9dac09e6b5d0b3e6509b95a15d4b9d26450382c367a8fbd08463ec153c2662b9a5fa4fc06691b9a1e9aeeedeeb755cc0bb7573c3ce54f36087d2e6e7eac53d112d17948a393147366504453760c34290540788a28adc1e226cc2a91969343ec2a2e8c97a05ebd2173b5a1754f4e0a8bd8149788eaba523a8be8ea8be1ef09c49b137fa53a667c8719535ee5c6859dd0a9fa6c7d81a02f6dd0d1dd6104d2065d0ecaa02770c757a46e1e017e68f0bcb99adefb51c53fd7b1848d1cbdad768ddc78a2c20fe007cc44408d22e4988d6ca55ebbae8fffcaa0f086c190510c30073e9e4b9e6d6b455ee5d5753cbe47f07cbc533c161765213d62b153b419ae25866f0327c3d16dc985d1220b67b83914a5c2ed5b64097c5746cd2c5885d152c8cd3c342c7246174edf71bb76668a08780ec6784ab3427b80898522389f987498025322a8054b434786f59f7d55b85ce2b979c63c493362f5d5bdc635f0af8d04f19230159e2bf10002f57f894da70666ea3d82cc66f562702e44e8c155ef7c1e8097d548976ad5fd560899e08ae295d55c2903a716b10c0c4ff56376fe3104e55ead9bfdf17529a69bca270200696f3729cbcfaa15f276ca2d202c3b7a9744f45637998c0fd5f6e4f87cab4af1d4e7adcaac896ee6eb38f434e9c3f1175fda037ea970c7ffb911a19fc3684ab79599c384f0a1509df33be355950973cd6b6b96fdd7fa4adf3fe9da32ffb254edbc8ef3bfcb2a6d74e10355541cf4f5951ddf9d63fa29833d994ca83f7599e3d46f9c4c1755da36dbb63880dc95b63acf3214a99ce2e70636d47b399f7c15029bfda7572ad54556c8dc1b4469c92ffc2d2581711746c5435c7f64b47a5143d4a0ab6ab66356287499927c6dabc8e40cca1ec32876c0d0f67e690208cc92bf01bb28d53e8044f4303d342ed4bafb7ef7900445686fe73f6dba8fd847a3eaee87996c43ccda1d0426973283c609439efa266445bfad42b96776bf3fbb7e144ee864d71db99df3b728cd30dae492bfa2444a26112ee3533ccf7a022a3e2142bfedf9efad7d562fd6b60ee0639ec0d56a6fd7eb9d1eb1359c027ec7371da086457d04e2a50ee410c2d0345e0f658c1afac51e7f36b8db570c68f72f594d3364cc93f393253c0d265217942a1642055cc85cc7e473ad1e9a143b417531cd1f74a4eebaea27395ceb1ecb29893ac7f80e508e2b86a3ca05e2cb9852cbd48c3d817b9e4d43a1babe66060456b199c891af393395c9503b588e38a6edc9037cf993a33358714833806f7bc0595b6f4cd58ffaae22aed4be0d2a3383a0ef0855fbda6ce046b599aafabcf13f2d3e81311ad06fe4cb646135c0fe52e52786272f894d1e570265cef5c3d4398da80f7159a63b5dc0c35e7fcb538d6915306dc6438c7caa2105f2573b0ce02436449312c0047d30994c35ee9feb71e33e82a4fa93090de84b37585a2333f51e47dad8304ee96a1846fb8bfd310cef62059933d284e0e856bf2040a993844f3f586507d1dcaf28ec71ff80247627d7db1e2f9f3bab9098ea0c5980fea688b41790f5420f055a8daf67b8460ab1217d93fff9e2347e4754d3364c1afa06a4040c40051261be03ad27d06e4d3f4625bd2163f6dcd84a8bff028288963590412590e7f09be7fc02573d9ce79310945156d4e002c242ef3b5719441bbc2429f631e33f8f6905220318ff09da690e0357dec3edf39ca094142ae8134daac86e14aac1fb55a7f958c6c13b96f53355872b132b654518abe2acd763e779e9ec8a91f29206816938ece85d398cf7b4d61d9e8c0f98b76f762226d38e819f113a1d08ab6bb72b6e599984b445043af2cf70b8f782191597cf15a304b37a04543c7b404d170406895f1aec94d1ffaea12808283ca7530d3c0a43ced0dd42dbc21f292e0cd1d56a7ec12e9df83dc0883c88e2b9e28fd2a04a4c40a393d5371297ca3b38e11e0be65b89cdf2452a933416d27123fd4e916cdba013839e329db60a906dc788e0b4d1b62c2986ad0e643f7b82abcab1d63f83f7430acfece831ccf9384ebee7a42ea0e7c25677ba51ce39d086115fa67035e09a0ae05a741e6f9f1054532a573ffc294790683926eaa62c67108789de1cc525215341d8df748b78305b82db2b4bc37fd980d3bcd602c0e6373f19cb74bffa85db3c40fb807686d66ec57463737e0dcd762545108c1e405697a9f31fd4c74cff7a2c3249867315a1fb85f9a4db29907d0287353cbfdb600d2838300fb529374d071ded5de0d1abede55ea0342340f3661e99141faa2688ec460222d6320cd9cbc51e7de1e16cb3c81aae1f3259d14b0f0adaa5a624393796b562abda4841786da56cead6b43225d2eae13bb6f041b91b580c517e2831821cb5ffeb4c447f5f206176ca77805f41a1cb98d97e8e02f20b59bf7a4537d8f393d0febe1a3866e762b2b4a29f8f36953b915c02b03dc5c7eee2565212f6d132ad6cc932ae3a79bd28080305e8fd2aebcff18b4522805481296ca9cdd40740adfaa6272df1e096ec39ce9ac423ace44ffb68fd35da115bf7e6d28ad50d2d0ddc15aaac656bd196c466dc6e8ad246d77d316f820d186ffcb91eee475f5ed2a97765a6e0512dc6fb761053e5c7ce5487946a2755f0c03374572591ec18e9e3a0dc7437f428898e81663e0a14cdb16c57801303e881dc73e9e22df12b9475c2c1c15d8d86bf688380fafc2ed889178639068f9f3c5e07c4a4be8d5dc95a26a32896477e42444f2cea5e07544dcac08fc0e611b3a99cae482feffb7f764f4b74fe29a7004beb740119ea5378676b8fbf2b474f0e00116f6546a64713a451e6789e697581b0bd87a5b0d8c82e002ab6108f9509710214294a9c8c17112a091d2a8b8db887786d1a299fc357cb9dce1ef62cb15c59f1793c01b93dbfff63df26473cc986b10d9e8bc18380c28389d0ee70db41aaf1ecbef9ca5c3b106afb815b7bf1b8adc657b7704759d98b56f1e3fb3f0c64edecc796dd64c82d8a45171bf1a85caa1b95f7d83064bf644afa6f798e017da00b9c777a000f7d943cd6aef3a8bd828cc753dfdf8fca80baf95ac40dd596a669c08f36226fd118b791cc0b5774a3ca605c71846f9a9ef9da043ccc065f835f0f96b8d13e3061f8c3cca6dc76a09156ddee2078cb04f6c3f3d50eb76b4fff4c0c17749c8aa71c19cfee31f2bc8122ac019203d363151ac1b6f73cff543633654bda5d8c9e72e8bc8edc7b44f506b3c481a3f526bd08ef1760c1084e2de234a91184a9f1b19a6da786651de795252397c31bcfda57348c512698b52c8130cda8ee0bc0345f8c9f7526ee0b1cb7837e9c967307654e039702704e5128744691e18cd0222dc19438bf1c56f9ddcf96b277dd104a721699bda7d0ae3ff67198021c7c07b34f983bfbea818253992933c8746926676486bfdbd6e4bda754071e4b7dbd9d116309407743485af32af00d91c5eff5065c8dc1f8d166f4932f80e41b15f082905f84150ec624b09ac96a09ffdcb40a8f5bafdbd8e6cdd596b273bf8e2c6bd6bc7c64f3fe60cb40a20f1e3e56e9e955d0907decee9901da7460a29e2c7cb079f15be875420a60f9f4f2f902a2e869f484703951e44ff53fa4034e3d14ada9fb566b4a02d158d02c887023096d777b696a699c4653fcd4fefe3b3394bfb0df42598eefa9d0dfe56c8d71e767b559954d9da4627950a9761cd95defa04df8364bdc7ba8329d68e09c814a212ff09003696df7799d73f6f3552d0a005cfcd9443add81231ca4fe0678fae05261032625ad5abc6a601c5c807aa838fbc6f4808ced4ffccb5824b3ffa94b595e605f954fbfc8239167ebf0e94571395fac575e9a3dc8bb316cadf4d4a12f3b2b6a18cdd8aee508e5a78b31f2d9117c310afd8999aa7b931ae5ba068fee90f8741a3a87da6223047877af02244c5f6aa18fe055553620cda8d519aa14e7b830ca75ecd03b46ded1b1f0c74924ff5467ca993e8dd12f1bb7f465baf875818ca1b635226dab9d6c05d7464104be3c75c8fb7709ffff8c6e14c4389d15f0fd50feee7254fb925fcbcd3f822a88d4aa78a2143ea7fb69b7b308eb20496ad6cf739ff3fc034b2f8080cbad06272a400f3e81b2fd9bcf939fcc6ab0c3e016e5b855c38064ef11341e4b24ccc8f38ccd2015751a81a675621c598ff5d65e9707d2c4bfc5fa6e6c5214debe44cc292a24892cfb2862567002b55e49f3d684325eb32d109fb3267f12df9c7698a55fa26db2d62a4a18aa665d54f7b37f4ed90e7ac9a038c5e4d2dd3440e3f111886e7564cd80c32146c72786abe2362227f3e80b52b668afb4fa76c6644354d96b114d7f75424c467158b1de2ad9bad9158d97ad5b0577d5c0f7d233ad90e114cc6360b273da6c9cd3fc4eeab45765fb3afb662eb217c0ca62c705ff560a820a05255263f0f81831e239ee46b68d078cd95c2201e453d644b83000c1e5cf2bdaef0fa82e0dae568df1698e4a729a4c140bc15df941609f4cfd8b5c459b3cad7144f59d6e8e5d01f9150928e2888479589f25815e8eb33020022fadb8e83e66590c1e441dc5b311a37e3a3b1d8d8a63eef9a7d8fa1dfcf1c119a0e10948359163eb3630e01137dcb9677194e93d2fbaa3a162c9e4dfd43033b51caed432e225f023fa8521186ed1399b9b8d62189d6a5deb6f586305e7c3a847787b72b67f1811e59b1fca26409ab5871d7373eb00005c40263e96764593f66740bac5bd5ec6771290c562b90fb379ffd5844fcfc1268c2ee3ab55a752fdb192b45deb77f291bd20cc9c75da96b9d2071925300bf5c5cda570e1a809bfcdf6cbe0aecc256137b44b65f2406f4b8d895c2aa3889702528ee534eddcc4e31616aafca2e56fb556068566537fc7433390b98fdc64f15397951ffe7f70a717de5b56ac130d7e1e584b61cf89e1759e93de2dac5a36954f824d62e87f3bb2425b1452fbe423297fff6548f40a913da71fe9cc59c46f4c10ed73813aba477d1c3f0cf6aea8f2ba4f9f0439681852a1cd2520240b02e1e6900964e06689097a0273724a7f9a33d86b41404a8a09dee42eb9c65ddf3b28ff5d4cbcb5db3b290f70ff6f55efda0986303be5975e42753e6246f515598e6b3b5a293bca2a1b3d4fc20e463be83ecfbfb689d98b96912cdb65e2b667abe884ef3393f44cbc7e0399235c2f86fb8b949909770d51b4f14995505d701568b3d75c45db651f0d1e212c4ba6090155aaa058a9d50229d47c180f6901d929d8f35db96b6d17790cea6a350233e96fcc1b1b3bcd2d198ea054f801f1e45039b46104e2bf9387925d58f471b14d8c05a650282c09cca2fb02a8751d153a41f00c013872d5e03f491292bbe9d0f394ba1b01ea8b2122eeac26ce102d1912209d90ef7022b60fd92290ef5ba2ca4c22a050f626947d96d3c409d5f40735d1883218032e5c5de68627d107aeb0add9298009986273a800596aaf9c4525074baaefe8917a8765d1180e7fb3c78ff2ac3e2968d18ac3a8c34d11d94e73ea7457217c5a29315b0dc7514b63e0c053afd78caa92a43d1d0f194921e7d497ac4cb1b7cf094c59fc07c0f9eb282dda4cc3ee67ad589f126c96de0dd6c07a658ae3c86f1c89381c3b0b3a5b1f99c790ddd19ce72f31a464691b22a1419f04fa1d69563cd6dc2d4fe7764103588ca9a4a99568c31cd0f0682392a708d44dfa00cf5e1a01aa053ec870433ec88013913ae1b7f47d55d95d7b5c96e9809173c9dbae3e9aaa9bee49db213e0ed6f4d5a8301d7a8fe7b10b351efd27ec604dfbb0dd7e83fec830a47a9bcb8f52af80dd8d24324ec1e51aca0ec2f7cd6f5b0a637cbae9b4db09b63d2945817408f1d01d7b1972e9a159a7a11e04ddc84d0c83c93b64b44531f1b09ebd53c52ded58b7edfb21db7866de7d39a0ed9d2bffd5240d0758c5cb5a1725dc5ac81d643d1ec872eeea9c299c687054a5648b33f39b0abd1426e9e3bcd117c5af7eb9c057284028af6ed761a32b7c5c3d71819f04f460fb8cf657dd76514b7cbd64803d6af4896c37d39785ca7e1471ddee6be5a4824ec119e2eb52d5db4ceab52230abc4182d15209a3cd3ca350ce9130a3f290545aa0a3a87cdb7bc73891ee038513f68db8694bd526bde261416870e36ccdb170bef91eee2de17e624c0c6de9643888a42eb52b5492aeac7419e8301073bb3248dffcca216977965393ae89631a259d8be087940610a2db3b169438645ea38236188a4a3a5939170234c209dbc629be40990e3b2e2e544f57a2fa4ca646a8c2ebbfd00e771094c9c2683b93c0f8248d9d4f480f126bbf778ec2365c09ac5fbf5b8c8401c3315b77c83b6e59855106e7b3dadf536fc64ed4efe22de2b901ac605e6ef8da6a6c6ec7a56dece737f8a6b4c9157b0f25b04a02ee6aec636df13af8810ea9297e234ae7f9c7c6f9690e28596f667185f360e506dba10e18efa7e6f7fa4f3a37e6974b6153991bed5486dafd6b278b8a6438baabd4aaa4fff8e13ebb99548e8e1469461b78473803db5a031de45347cdedc43a95716684b7b0ced1382c1e5023669debb221f8e9ff39b740e2b42c71309cc25f51df50cc34b10fb69c135faa78e3326408b1cadd3e4652fb700bafee56cb475333580cc4a332a65c02640c19fe3f7740ac66f335d3764423f00ea323ee2167faab339b7d66b94e3bb3d1d556f02084d8cc751859a416695eabe208aeaab4e8e456e952bfd46818f2809a2937a1d47154f6f800071c615afa9494209c115e28098a6593c91a4bdbe8fbe6c41ee0ee2779ca1478d9d5b0f479c37b3baeb9fb01bbc16641ba65951298cfc069fbfbba53216a709fe69616a491253112266ba5f45f97c6b6b60bed29e17ca25efae0ff80f550a6d24b88c69a9eb67bbea4a5cc32cdda0af92da9dad35bc32dc3004f34d396a94d8ee99e112fb9c3c77e611e88f5f613d2a5c56619df1ee0ae1428343ba2a009ede7c8f5c295db3de4ef2a35e41b88fc7c95aec00f0896d3ca9fedb5f2b76f7ea85efd81dddf70998b673442109b126ea211f4dfed13c52087f2ad0ca0e6c80078f93e5cd74d107ff4e51bc899354a618c0db3ac0031de118284de6d17050522d0329e72450a2c47631d41b1dc902ac691842575c72973a786ee834870604780c48c3b99ee2d39ca394f3fcc33bfd1f0c2554c44a68e27550d179b885fdb0ae3e96d9d5e2293cb9ba78307d3f36bc29f17a0784cd621afebb27fcde6ebc829b497a7d1b6c0a5e8b4322a1084fa830d89670279a69562f2211e66e0a082a8136b3ec51342c1c35b93027383b758a27312e8b3775900de6aca6e31da24290053212c215221dcc4e629a18d00866b6d47378dc430a714ee2b60d9ab32b092012ea5e67d534760dfe4baad78f2758fcf5ab403fe8987be593d42e5132a55c0e101dd75e8d5bcf3655c88db017bdb33d63f36234d9bfb4624e900b7a61658a03eba961795783e1086c89cb1e25e1bd15840b009bf6a30729de753202045ef6fb25420f028f163b9d0ae5532664abc771bbe6c7512d5529e9e4d4b3a0cdf856f127b56df864769b9c113cd7b358ade8a1e9d73dab8ecbde52b83a11815fdc1bdccba142117628e0e0100a506ac1715110c718ca4ffc4110d1bbd897badbed87c6cdc9352cd5b7738a1148212f51d909e68fd235ae1b2b0ab04cc96e8c5c8e8ea2ac03be7dc53e381fcbaab47b0158d73c6632d12799150118af108d2f2d5d2113cb47eb6e4100adc76f0a2e5b9a01c8c02cd6ed7dc82298433d6c44a25db02f04b2292d2ec9075c74671a27c4827a7748a09bb1e3092981b484a0526a6990bcce0928aa23c60d64b55078b807312aae8d2d13737f22ae528b3b36468de09d82bd3f4dd6658d0762e0ecc153547aa75f46ac20156390bac745048ffd8bc2a6f331c54e327333043e873f26f1929b743fa018df9248584ab40690f03ddbe8cb5769d6b25b034577895f40df89bde708330ab2e1e968c8aff77a44aabb5685cecd1f13b3c37bec160b2635ecf2ca915e8a53c7249da612c14ba7accbdf3700f69c940bd2a568384451dce2a009842b8acd03faf1ca7f40a6b086bfbbe0807bae6bf46ce4082765edf73c6a8c5401955a9f381fed84dc440b7b372f2b7e4182d354ce3e9c1888196e846b318598d8f111bfe7158d6db6ff03462a0378797b19af2e64dc0fc38448466d985a435c5795bf21a599a0a7a7c170fb996c81a834867af93798d9808c135425485411caa6aa4b7061ef76437d11286d9b1da5bfcf24de22106cd3f7aa39f80f49f67b25c70b154c0835a32e039c03aa167373a5e93093c1a625ca4d625dd646a6423cca68b21d5ec55f43243cad7ac669c1c7b0b44609932244cfcb089c98f308b55a147ca41c0691b5690f61da69b313074ebcae021b15c523ca583cceb98231653016b505b3860f28b124afffb61232c4c173484bd07fbd285f96037e1ac74411dec403869ceee64a639351405ce7cd549ba221f9afdea816fcdd1926c44763470240541878ce3658c17b0f8974dba2dd41f7cd57a624e3931ba5870e6d355611b12a04c0727db70a321134dfbbd8d14e31d8617f4c85499eef0617308b2a377513b8294b52e4c4e37d6544de8d9574d3d90ae1749edc3ea3d4e95f0953a7d20b50db7f718d2973284283ca75901ea3e93d5045e14c986f33c4a6b8843a3db30780ce8f768593d7c509353a95860c5ad132446ccc8b302e6d2f4cd9adfd0f41c421c41f3414e2d1a25baca6d26bf56fccd40102ebbb1e94c6a6e3532635874a82cbd8a785e9445fa3167f919a934dcc56c48ac638eb6ad1f9cd12b69905af6a31f9ea3b2488646d6e5bf86e33421ae5ce05a7be1ffc8c8259be68a32a4243f656f7a8fa7ca2d3bd4dbe47cbf57247e7dd0571f6fb097eb4c0283199fa2b9729e815feb6d8f48b889c453fef026883a72eec5a0b38d17a17e1c901ff591a21f5a097dc85bc8dec92aa0a879ca484f21735aba3d9f85790d61646e56d012215d69770171a5964567b830f569cf01e34b8f56c94811dd02cf790a3d726d2d450113d42c14da5f18db87a2470db374ccc0100f8c136812f4cbe20477ba43e9ddc9bc4969afe892210b241e88e5699a8b7a07de7fb829c5f6f05dab8b9e34cce667be6ffaa09a3489f91dd61d4cc844a1ff16b5a3be37175650dc35773d4336552cb780d03604d512852f9b7432a29cf0fb7ef8e1a29ec8eecd3a4429ccac84b0bf0f3f7b669aed49041ba58f5f8aabe4eba13f0494884d88c9a1a7aefb44f34a42d99794881922cf04e60b754958236365a854ac8b4f8007970a2fffc3c91fc2431a04ca79a50b1a1a1a6b52cd44621e3c96deb67333524950c98ed0b284cc2040234ede7e8015b3ee14c815f3d3355c8cdf963e0958b5d5f157d0bbb48597c16486262aba711609f34885e1a510ff8296ac1fd62999cacf8b7070c04360f65d10f37d82c49e78c4574640c6f652d36de7c9d03de4f7f086e29f981110d0eb639148697f572778093a2826514f3ac36638ec3d821f92eaba85310e7a70943b1e243e7197684fd02c4b54b0fc04503674493ed27993beda08ef3d8ecd1e00d3d0462850310bf0db46d8d396bdf2fbd75a240c795791742ee922fe7f539928712d82a24f69919c712c0919e0135627286a908b58938fff79f16637abf44f6939e6f7c1e188be4aa6445666a86ff2b3cc66f1be1144e7619833e6abc875169ef2c8b2bd89c4e688af4ea162f01429fb84d99ccfe94f5f4382fe86b68d32ff77c555a38412cdbcaed63f22009006086124ab48f9bbe2045478e6017021d360946075a8e4b278feeb137681a7d09e16b9187d1ca4714d4bce71deaca3e695c1e463ed6eda167e7c8b829d91c3f43b178c911645961aabf9a3d751b056ad68397d0b28ee59c8047955990985063bcae2d61692c98dd14187c7a0801684dec1922830573e45012ff38236964fd643a67802c22b07ac656438ab71191693589acf3bfebb3b3992828eedf2223a23c2f21be63c1740488aa857d783f5197b8b243b0a95ae65bf86c90c348d4a61697a8c9ea125a62dc3349fa43b1a818b3a9dd8f922c9c68a4c0eaa7a4d7ad2ce0e85eca75eec4f4a81985f3d91e67c3425e69994e6a650db398449176293ea96eb1d16e1120e4ed7383605f91b62c644c24c00337034f504dad8a14e442f88370c408302c4633b068da3a0f6364f26fd8d16f866e89def2bccb73e0ba8e7adbaaec147f5ae75c650dc8b0c345f986f0c5f2169ae52f80ac5e85a84afc04057187c85d53928c62be20d0ab409f8b64e3563a2cdfa31e23c26774afeac499718d416b44eabc42d61d2a2979456fc847d094556f10f95c7e0ba9e7fd6d8e2a3f412790b7ae5ebc5c65c1d510c712a75e2ea18bbe7cf601c983cad1a4006afc3cfd0615a555a04b87bd3f856e39aa92aa78924b6eb67e4b29070dab2f4306aa9b0a051cceab1f12133bd0bc70e7bdd55fc1646548d8060ff41b1273ff2a56dadb9cec2a607378b89ba37b123e4a2dd88e1471d4ae588a96d45aaaa414abafeea47d1f5730dd4914f7d06e1af9bd1f80eb1b4f26f67f109c86910ccfdf2eabfa31a71c50abd0f52b200fedc0f505075c3906a1e235dbf848e8b110517628ce5b24bb1508c5c1f95328b02e710b9699e46f2b6e8af302b23a093f63e83b51a9972f350d59030eb6151bdab3007046c034d97c4c913a9b7a1a652f2e855e4bed7d5adef723a83fa1d8a5ce344466167d7eb75e321d5d80fc5fd7c5764543fffc0240d260bf31c6b8a94e8d1bd87eb72e1733750ae11006f0dc4cf01668573fd6d55707b5332d4439c4a7720c251fb0db8896fc005271693df1e836db93e83fbefa743b45edf5ec1ff5d0c31e3b8046a7e540b8e9e95d10281ac497e326a4d6e46891677a05319fda1711d18b30b7056f1eb5c7a518487408a50457bd081591e38e605f41aee4d8eca9d65bd33740d16f7a261cf994956e362881b426f13cb7df5f18e6cf1db53b3de17976f7c5a181f74e499f1a086910f34f776e50de4e981ff785d632d95323ec841d0197ae34c08ee5d3a2bd14379f27cd2760babe930ba3d1c17ab05d171ee55bd475c98df6d0a4edaa60830a569e9a35d35ad12cacaa5afc009f5c3db9627aad883ed88bebd26907a586ca686ab96f727ff21dcbe09eadcbe5ab42e553acf2aeca5f6b6cc33fde9fe60da1f56aed577ed7980cb42a551c31e19ee7b9ac5267ebd9a3b9d5c233b0386030ed35f664f5b2d7e98a623f82e49920b15bce56e0e109c91ab5ae588c553b0844c337dcd39bffed1655aa450fbaab26bf00b3fa8f1667c36f8ab30296e8a07370221efa00ea0ba237f67d7991d81322e649b5bc6243142aff2a5b0bc90ce76f4b00e4cc28e4d10f19d7b9a179b24fb0fcf50669d217a9498b05d000f213c0e6c648b0bba95435fba89b50bd8741ce2314dcd5f800c4ca1743fcab2026c851b49c3270d68c400a8894833e4d8af69ea72891e280c820138e32c8c57ebe844d2e84a694b1d6d327f16c3a857e050dc93a56820e36afa3b777a46d9105eff0057569870c220cec64f15c841757d995fb88d1b8da7c6eb47080cadd3d5b18199faf8a5732e91af1013c5147422f70bce2a1a5eabf4f2225402acc51772f3cebc4e7437672b18e3b2ba4fffe038f80e55ded79ba810d0318ac2518c458e1a9cf656b3b65f8cc8572f966f016902e3651e5ac64eb0f374b82996df07345d80d6f94edccff686752158b670b4f46416645cc0e92c5f7f06d6eb226b8e01e02d16af737074a855026396fa4e769fb9944dba0bf0b8692a41da01de63b5897cac7836ad650f6bcfe8e72cb8612c3147b6cf2787167487ae2280c5240e69e480d4ac32f86c6d474cf2764e480f420ef0ec2ea42e012f0a45d7b0ec83ad428b8c581ee657e370af58e6568a03968ca57aa702769460cdd7596833a38b27c8c0e2001a654730beab827679442093a00f4decd886cad52f66d8dd898ae35259e4a2a6796d681de69d3f3fa28679f8b30e022cc63b546d4df619bb9dcaef79646b8b0c95053e9b138c29bd600d3b9605064a4cce4b2398145470dd6797010f97d42f4e8135c0a48a744a430834de72b11e7d78b0f92487eb8e0a13f80843e8da27cf7e84ccbcc88f162421e87839f377b38997935990e8a56241448d516cb8dbd834c5b75646e72358e5d498fbaab4ccf94324bcdbaf0c3976363eb4fae6a578afcb80041ddecd48f735a01bb006b0d7a9bd2e49c22b538a2149716950086f3d1c7014fbfe7c56fdf560d0881e1e0e048f5e5c30b5f0e9041f5985174cc7935964b3280d067879f5b2b7de925595f92f358d397c9b90f7166926751981121be6a1ca3b0f2a78a7bad4d222173a8f7e9914546edc488a61f5c597da9a0e5516b55bfad53f89e567309868b13263eadd1d2228696084d776343b454396a95ba2c819a069bee49c032c76a66803f9c8fe5ef860fdf97dcd3e0e39bb7f31404d08020a80c78026514134645f7c54c8ea43061f83a99272c027051bd80a57e3352ed4d732a0c3e630be1549bac4cc4083e1cf283079eb31e935e1b645d78885aefd225f3dafa49daecf8c9a6a7c8debaa9f4d66e8e08ceb73f53237d0ac4f3acb68780e63120b4a272f9ef173bce3bbb73e7c174d6cffdbfa1813d393dd125644ac75640603146f3c2c2ffb0655c02781b397cd5fe9983bebf041ec9760abcdd8458ebc6c8d40435250e9250f148fe422cf6283c86a3a134c1ac0cba486de1ea8c8c0e8bfd6a8a50c46bc6210319fe62d14066809155b1b2d51aa6ea4a536c4f2019530324f4c2043a95a1b8d5274546df9d9655b59b059df4f067759b43e56d167990e0348f555d574b556a56c87da174b890019941bd139b518ae0ed2c3f13258e3b61f5f4b1caee9bc1b1a00530bd5eeddfa615105fc235f0e6c32626896b5c05def798751965931f31894f028d69895bda92b9c4dcd27abc1bf385436efae9fe374a35e4c5eb33edf59fc19b7730ee004f53333fd491fd53b3e6fcaa72ac2e223c2b09b27cbefcfa57252c24029f999c31c8081bf38eb0464eb93c699778c0001a393ff0ba80de5f291e4e19f760440e469bb39c01f8b52b0917867727e8e34e98073b8702314a7cb01ac174532bf016a2a2b30c7590aed3a1a12950a65deb8dda4951c63adc3cc2b81f2e95a106daa1d160321e43f0e980b0d83dfba4f9acb848bfcc89090a6d0721a712a4c670180703fb70a18f1281d6feca139bdf5e08c18d9badac864875d2f9c6737ae8a57befcc52a5f2a186ce0859f719d0b31870ac6bbbd44aeac4b646a181f83793720c8cc55bf8ae3e0c824d33a3aa08b658c7bd4a30ee9b85f418b49c85305973627b0ff4ec52ff49d468dcdf320813067e236aa42c1ad1215b18f225d9c93d2c5b356d39257d441c9f81cfc98d815d67ad691d82233b13bcf2dd177622afd1fe037bb93c340b4ea7b9f95d20a72689a6e2906cafee527ab219197b9dad120d52b4bcc92da61d1aaa441ccbb6635dfe9f73c5c5c42be7b4ea9dae76f59c7fde0d53d1a4c2fc51d08830ba412a57a60f1c54f7bfa411c12dd35596d90c51f1a510346f4d6038d22e3510302922101cebe7d89db4029d31744989d33bde8ef7afd0f4634c9a835ffbacae41c0407f64599c75f510b16844f21a8b543ab90d771f34176dff4c5335d9659057b22fd483f5f02e427698b0331f60409b40ed8f64220f8b439b43a35b7c089335118988a449124afac61fc168de930a2c7698eb59aaa4b625eddc6652d2dc03bae356fd6f7845c1f08c1504ce3e12a051f283469a2820c5155a58740075c70ddb50d4748e8df0940d103f0a083cbe7c7c1f5db12fe10991649203863801accae68322df30104162125cc64620eff520035f4ed533bb40d9cd2747eb213f4845970cbc60676f932601013cb3806156a1905cb745adf75d9799978011e730d13338cc97c9f49b95c5117a10d1e6c1a923288c5ae5d25f0c2c075372e93086d11a9840ad4968561434d951bcdc3759a22e263898ddb469480ea22715c5d94f25f0194cb72d45788267f9250d1caa8c835f175ab78848c5021d083be5c9215deb58ab2448f8b246d718d944217edbd1fe5c36fd04524509353a4a274c9f1d476894750b038dc9c79f6beae1b75a2c084ea3f2f6f8007053d138445dd8582264d1374482793fc00e3f0a872ed415d0b9af8a36a824a4a9ab662fa4b469b344985f9688f0000fd2ea9aec153b34ad102e0e3c1760107e415ada494642503bfdd102d40d3c6348ad67c036e2f023f3059f3e17b5b7fe24a2483bf0f68aacdafbe83ce1b938e9b77b13d14ce5146ca5758bf9dd95fdd4f69cd852b2af3966d613ce84111a193db4459c3c41402f24d48a01ffc6d44e7497071b503a144131966ceb15138d293f36a610d2e083dc466ac653914acc3baede8939656a2f804c079b809b7ceed5f92b681b2c7ac9590c125dcf85f6a075fdafa1243531d4b58e1bed47879696c197d15f21ea49215e6054902f86c22a9986c1c04bd59e34f352e16abf5d80fdb7b1cee222d80dcdb56c241f58d96c2e8249ed63b68a6e42da5373d34620824c57720bf6a46677a270bf94a1c1b6b5f64bb4b70dfb3ca898e4c860e4cef84a6dd6fdd390fe4f7915eba5d90b01a876ac4bc31a4eef24d353987cc7692c17572d87288611dd08606457b933c9e140d837a7fb8ab45d1dad4e2d50b3c775a142d9b67ab8569d13f79572dd82f97480c118e4446b600a011a96ab2ac35951b6d863e6b67ac366059450e7acd559c0cc4378e6a984c43140a2af9cc76bfd4564dcaaf2d44e449bd80ff61d090cf7cc7d836071ddc9c9b3290aaa9322b6cba409e1066de9c49e7e4d904b4c5ceb62596e7b4c367085bc5807e15e1470d2cc9a4096f9e033e05256306569be6b85d6b002d7370366de76ddc5dc91644ade90f7cde4bf15e3cb10146ba3e75e18d815617f6f1bf77759a52a0e6878a8d4e80dc17798fbe0cd2ec87036848a18586c6ebdc9a8b9cf12ca320e4fa5708851a043558f1cead17ce92c7dda3c6e727519216b19aabb56cb31644da87c8535e5b39553d28823a52d4c46db4cfeb45fd2b6610e91c07bfb9537aa615448b8c207f17653174f5800e0eaccf3957b061201052f9d3e9d53a8b9458030bc48d5da0c7b930c969b493bb554dafea307c59c482cdd13d9569dafc2e62e9199f5ee42ae52b78fcc9a96593f1fd2630cf6827f8d4fda9115380fed526e35c5a2267562ce748daca75a0ba8fd7f7f039d69501e8756db07d6daa8299216490712af10c188bdd66f5fe1384bae6249ecba89ce96df8ad86e0dc22b3c1b73a5b1b530b3a0311e7461917e5f528768e91a0866c49c93c9bb61c5e046bfa9982fd7dd5805405754d1a66bba1e7744f922720c4e4684c5dee325db77931ec69c32ff8da5c54d7d3ea204cf6fbeb2860748b6f9564fe8c51193e1747a64d75b366f816a6f21bd7df5f84a9c6198b807c90ebd2fcb9d41a0c37f55d0e75a94787a3f987b9e33cc511e0c7b9683048462c2b0a4db75a73054c99294798eb2e9c1c0d6311a66451a4ac74a71808573b6236ecf29a19dbcbf098d440443ea8510602a7751ae28ecd9df52a31da809d54bb3964d2903d66d0bd432d422161928b176cb7e3d826cb2b5f364a0ac332723533e7d2e35b081b0392ae954d58efb187c03aee092bd0e7421b28a0082dbff27539d54e2a091bb5df0ff2fc180ec29104677dc6b42497a3541edb6d558e8081350236b9531a368db68c209ab0b87c00dc423d9cbe6a8e7634be38dd8e8ed0a0b573aad1b4702293301d9236a185ba9d27d15878dee2008a86d0be6ac246e70f5927df29b57d14fd1f6c2b91d4562bc9593c1291eb02e64e433e2cbffc8272bec5fb420fcc2cd128f7bc80be0fb0cb8345a0e9602042c4c4e3ccdb11b1cfbe80449307641d441cacfbaed490bef2e0c9fcbbc96165bcc967686c3ef9c05f5bcb112b5b087283912302439e3a9e2a9448d36e96d211d87440f7bf76595b8d92140066e84e57cb84569758610aa7f1335020f84ac1da90b09f78c7b0cebc6e830c3183f7d54aea89865b158c69b715aa82a4ee4217c160db80a1b80122d3b37bd2d050a0ec2d389839ef2b4de1d231f070419ba3b4f47159d2e57052c2aa498c74e9bba86038810d638f67066724d0672b939958fb4055c2f7a079356a0ab96237e01356907f7bf260c53df0ce5adb8c604c013235e6a39415c00ecaba6564de8f5638f323f2d4b8fba7acb9d8243a52800084390def776e84afe194e93df98ea200ff1a4bdb3789aa5617f87bd4ab38f1228798f1e2aadaf0622a9a6f22c2e9f72f77b425c616d0574aa4bd94a716db60129869e5e945efc79a48bec3811763490d2df016241bfa1d67ddf69d16d8afebf5253db27be2546924af392672d7674aba0f1060af6783c4f42a8cb789198ec64e9fddcf0ded111f91c1802336e0c6fa78b0a9a851610d7eba5aa76f68aa561dc2a06468a2abc59ba791219febf882323eeeaad26f090a5ad72de4b4a675fe69adf5786d291a51872723c77f5475b524dad52d44dc750db8431ae9f269789710448d94073cc6647db5ac9dde954d5d9d2ac3695a4f96874840b8bb61fbef6e5c6275990055aba20c57b17ac20a895130100052daf9e3d6e0e3449a49cc13fce2bff828fa738738721c4dfbe52a491d8438b543a266ae5fa3a95e01092c1a5bba2d1f48f367c81f39765df21c5914209510232672e3784c328baef601af0f4e7f9363beaae9746747c42928ac210f5c757c2f5879bded13d89964bd7aafbe65b808a4904df0a424972532c14a44a1a3b62775ed32c1e2cd339297c153d8b5d8d0eb2c60fcf10b86bbd68161f0e487677acf390a15bd486f091229b3b6c79b59255c8a05aa34e05b30038bf69d9915926e8c86e12526a96178bf6c0126babb0b40d0e2201a096ceca041c94640a8bf8361082fb3595732c2c82ab951e2409481d7612d79c08ba3853cc721806f625d70116120531f32d3161eb559cbe8bddafbf21a179dfde73386b597cb1c9ca80cbb80254d6b5c8c9ecc807e82d5944747dc8a7fcc5958911456653ba41bfecd78e8b01fdfd2161c1e404cb090d20dee2bfa43b24690e0ec26dd8adf2d60b422a0d1caf0e6913cf0a45d35343b92eb230c0e486ee3f190e670d3696947f896f9978cc200bbc49bb9a9433c9ae81de821694800af06f1bb4498e722ef60a056049a63697b1168002d2115e73801ecad7071da9e8a62a208db5bd78378962ecc6c150b3e049fde9f4dc4a729e277e8c1dfee354221b735a1180573676cb0904c283b5d13a5612e31b71284eb4d270262baad3ee255dbc92ea92686804c5d8ed541a2fe0468eebd3e008ef273c08cf50392d7a18bca445237cbc9f54df0f072f336ec1e394ed9a4d4ea4ba41289ae4a1a2d290db226cdacae751836cf2559503a0418785d4402e9305c54da41e091064610bbe7abc4d19d6d8ab901462f3f0b480eaddaf88612db4b2020309885254fbb66ca167d1f44c63d3369655fa844afc6e5b6eafa33ffab225b6367ee5bd5aad86f39283211d6014abe3fab4a44e8a923d6a209e22ec171dedd00fa145a001225cd783f3dd663d6e7336b79ba4605222f0daa1a2fe4628b09e28d517fcb6696b5eb23dde59266fd3023b390a0f8281eddc8e2d5b08ee1342f339a433bcadcb72422fc37e4ff7ece0c91542d3b797b32c5ebfc1dba97e0965b9e6b2e734b9622f4a223ae26d23c969ec730580e3270f09c354d910da54dd8092c0068562b28996b81da8478eacc288fb875fa443525886630f589be4f1ee89caf78b43bca67f9e8f0a669314a60d50c0440aba325e17daa76cd8bb3ed1c26ee8fb2d0bf5263491d4684c445e78513a53ace30caa23fba022b035ccfd6e245139ceb9ba2bc3bbfb9e3d68f83948cc2cb439a4a900d89abf233ffe901741a93717ce3fa49a4a52018f33a3960921c0cae7fca3316764404fa2709d4d66b17684e4d2c4cb407a6528ab112bac0a73558dfacbdce9776c5110f5d054eb864c9006cc3488ac84886dbf9f26785888c76737a439547e2f66b069173be4ad4a42cc525c18628319676b8ca5c26a6b247fca253cc201def645237a435e01a2f08bdf68cad45a80ba998972e764fc4302f6d3acf36dcb0e87a187c369fc599210ea28c666587711bc597a410c58ada505d1fa005a2024dae16c8cbbfb1cd8c85bfc179c354d1535ec28be685bdc673ddaf4eed97b7628c52003712521a5158ed90e4200731fb736f30a809fd9191ddb0048b223fc87f1b0c61942ba5f8cf6f73795aaea1c15b0b74544ad6a7718ad966eede7fcc01a6d62d0f5d85334f79bc83273e8615306bcc7a1d9d46f66c540ba0d324fd4c64488e977895df5f4a06d0c81639f05de9e433c0f426bb6c67dc1d97d4bcd8f007bae04f4fc111bc06356d08f81395336740199f2ad73a723ee0a9730b522937595847ec0d9b10c6c2c6c60dd0750d8742ee967d15411f89ce3dab5c56f756ada1c6adf0e11f9829d0efe53326ffc2437d895090630ed8e7bffca43b1cddbba4b8487a0461d2882154ccdfa16710e009c14a3540e05cae4b3dd7140d218571ba6dd5639d9f3be1ab5e8df9500813e43125bb0f2a49b9e2f4b17e7cfce4abd38b0a8170fa091ff689c68ff29fd0b455a5336a53b2397e4e4d2aab68d167b8d6abaf7139dc69393f4036e5312503debf8bf18cfa72505706ea65869d6975cb0c88c456164fd9eea2cbff7734140d2543824765696e968af1a158f907800c8cd89d1ef8ce22caa71ebccf9517fce43e8389da02c2985aaacc5c0f006bc649b4e92d6c3315e0d2155f6e6e886a4ad5dd320f62f4189a7f169ae58c541e4093660c29a926ed6813ac714ac002231385b9974534ea5bc1a1ca0bcccba8a290504948e98dcf4cf0de328c969ba1213c2386cb3afa743666a27cda5529420d39c5ab4914c8dc64540af7e166cd7f42966d6f65b1e8d4c3ac9a39b6188ee2dd70b3fac8deb5c9a8f57746b54fa864087786eef92e43e4cd3b98008a40da72ea3022b54120890598a464e90b580975dcf124284a4a07a0d3221d9900a68b61c3ef3bf818fb3fe2b4333088d1ed7423ec595e28d1d6af277a86315d1531bfbe139b23f7553173dcf44eec07447b5e5bd63f3e28e337222128b4ca47f09d4a95e2b73ba220b82c4f89e03e695f3bdbcdc08ac026eba70497f7fb9eb3ee8deeca2ecc2fcb0c19bb97c10938d49c6e40b31759746103cafc75695b30d02a6e0e2419585fdb9680f25be68953bdd0fc9ed6bf765b3fe65b6c9fbcb167e9d2567766ec025c36d44b054aa40634d2070030755f5886f61f1b7cbbacc0618f66c4238341bcdea59b558627ba5108a58d9636096d22654a32720691067206a510b823fde527263da3351c85c9f53bd725db17b47160a531238346f679c6388e13b10c854a947800fa48039bb456a4aa28a5f45900010e4c2b8a23773ad05e6eb101dc07e9728b28f0340ba8480fc5a916a039dd84daa83a90806cd29af9abd50823a050e3e7dae7cfb5161a42a4859a964a532b52036948d554aaa3dd8b3d9292f093489f6752254ae983e4c58c52489b518392f43d2cd267c64a29c35692c87b6f6a5549232d5d34e145b2484595c8211555a46a2147790f39cafb08da4988e0d337a842484ae983043cc34a497a1f241f4051b690fbf047e22c1c4af14ba30f0842a50f121e48c652249b840fd342088d8682e72641da912158a447c890effb3e8ee3402745e1b65aeb10aeacaa0ae2fd63103030984d3a0b3d08c521b15814a782396a9d55a37a54f31aabad22973951f61e9a343b06062e65aaa514ebccde900557d5caeac174afb2688d0db0e9a74c1cc50fc7f0794aa4f8a4f0395605da74dc69d428c730f8fef5e571657540843dc37c8e3f4fdbb642f822b942cccbb4f83c2f2f92fe05971ee310631bf3e1af1013be0be50a3a3e7c1e980fc3871175fc3b78826ddbfeea3509ade907038331b3f6865e54553039789e07f6a017faacaa5eaaec5be157107a3030c9041226c78db11e0043beb4c80a54515e595db0e9af9d1fd2977e2b91291299eaec151dd6c1139866fadc93d65e2fc97f5f925a59b54cb3b3d34f1d94009b5de3ecb8c3d30557a0caf2538f25b0d935d683816bbf9a8d23ef39fbdf83206843c682dfd8f6eb784297fcd907c75c4f68141850bfb1bf45134eb8df68df1b4fa099fb1ade3b9ed0fd7603952329a535dc386e134571cbe7c2e71fa0613299acc99aac355993b5f685439099468a1ac1d444bc72c494f04baa34ea783cd2f2657cf9d2eb18f1e718bb7c11ddd536fe322f63c62e5f465abef028c3830b6054625246059ce3f1d3d285b234caf0f858366ea052a5f42991322a94fee55fc8232f5f22495136e91e4929a814c722cdea9c4e426d1c06207280d5d5eeaa6290bb56394ef1ddf5d977c8fea607e52610a0e5cbc37c8ef0c1ef292d0bcd218d41553acaa0aa9835bcbf1d8e791b54852baa4b35c8fe554b972ba6bb3cb0c8eaa7252b3ae98cd2603e07edd7cc36732b6aeb60e460ec7124dbc65fc7e81f23e2d767f3efad2fe34fe95ffea7f4f8e4287f1947eac31f8f32a4044082194226e1ebe8bd381a51fa9711e896a51066ac317b84ae22bd1bd87497abba5c2e5224ffdf5d2178dae109c28290163c1744877163c78a101cd785248a86cd8ed15ab3825a3b1d110ba8485579efef8d29cc6a774dc8a290c9747464321d19c5e92067e1386eab57fcc8ce35953070bf8e141c06c63ad96edb26d3b9332864518837f4bceb91bdc44f3784b94e1a31e454299009a049c1e5da26402350017a823120406b58ad2025a7927347e67119b2202cc14d642340f61f42cb4b5a1842e4c6063c84765de73d78bd053ff90b9101770e1f7cf3bba0e1d4dcbe9337d05f4158229a40c518c0a715d57f89a4b2fd6fbcb58520324df2d8d4d0cd30f5537f7f87202cc18e8237f11b93df701c97026361a660118a23e694873b6290f079f087df1f1e293de9e57d8e34e1293dc985f205b3808af4801cc779de756f0b3da8019bb456fa23e18b7f84f4a597e9e7113f7c17659a7c80f8e1ab20929854a144f67861279e208e46fc54a4b4e27544203be1d3cc23922179bb9d4aa46d5627095bbebb3b446030f31a95ed1039b7d0a47aecd43e17633c26d5c226add55aad71411c409a748bdc7f3b8f52b9228245d11c4a6d2cf8856f9ecc53ad95e36ee7c59820924824d248436b788218f16070d1f868238b6d73f721b7d6dad1b65a1447048aa3e383fdf0d3cd0cd8f456cbba075dec9a9fc0ff9e0724cd366a1a29761c9d53b3681b7f38284ef5d6e8ad2a404a7e5a3f4c26134daad56a5d1be06c597e6a2a753a61278dccc400819f0421ecdf2e27eb9fdc94697d5fc5a4187225d69eec0fd6de60c166cad48ea274046a80289c135355dd7821016a33d22b94308256924619354a1a62d263d263fc47c40fc3a731a2178c86442f5807c17f8b709750e0f0f1fbcc6451923e1c7da81433204256fa20b96b942412494e15266437424efdc4fdd643d4f4d533358d74db2883c2f6df6fef42a6de4b059828214f1f3836133f39d94570f11325df7b22a1a901b383bc51000cdc41de483a8b92457611850ef225ef2872c92e92f8c5273d0f267dea142c56a80cb15865f8a5777107f7484f34b4bc2a0a268eab8a6a56cf2b6de3f0d81236046db31ce55c77b3288ebb9348e802c358dd2416cb7f1ce5d67eb7d9eee9563b4a77c8308be27493cef2d38f122ec04a64ef38bfe9945075962c6490c13a6a56cfecd82c168be534d81facdd36bb6d5b8fed148415489c342ca954ca9432a54ca9aa329952a694c933997c50814d1a9ad50f2999005af0af6a2ac58d717e5a70a02306e6858333069f39ba13e64c751771bc91bb3b2bca29edceaaf2f2615ef0d825f832ba0d38604154821dbe8caec40913b11274da15598e6af83276961c8e7095302387c58712acbe6d4dedb66152f7323616b3368e4a985154c1599ee7acbbd2d16af5b6aaaa0b9f23bbb39eabae7563b56b5d58ed5a5d6beb468f0c5af3e3056cda2319d2d30c7635f40d103ff9d34ca97424b092fd372b688effb4cdb951f19bee65c022fb6f455bacaa1ca8a23656975f59543722d11e6df6c81e9548e30dfd74765de72feb0655bd90eebd5e2239024dd9a3aac2640705a532031cd9232abab383d29d22d941f94a97557a3fd2c457ec80dac61fb43de0d771207ed3d5d0a78e0443d9dcac9cdbe927df8a7e3a67b3826e1b163fdbd6cabe013526edd1d9c3c6c21863b2eb649d940ecad941e9ceeefc4e92c7e8e0c509c45a20544af7a03149c8feab1f3dfcd423370ebdb70848a3c089948d89deeedeaebb394bed939710ee7d1721c4051625920f7696d7237d4843a50c5b79c926fdf40f404b5af6986dc030740f1ab0bff921d09a6b4d3ec0bd64edbada754df332b2b6bbbb398e9375dbe56032f732abb458c79ae873ecb1c04c43c8fc871c6ee77d2cbfd97e86fc97de477c9812e953fa17da25ca9336ca41e2f7217d8e87217d708e87799e1c6493f08fe47898cf41c290474a0f23f300f15f9e47fc175286fb97a76548f2941e8694e1c89d52c7b96e75ac89825a49ec8d233f71f15ad3ce59a681b6138a45766bc7625d80624a6ea04a280ecd9e92ff6ddb686231d04bb09ea39e1b22ecea31c52aec75ef6a7523c3e68ae3b8186052366d17ee88012ed97e05a1c0cb91bb560d65eb69d92002283019149b7d6ab37a4cb5d6eab5d616abd4eadd54557964d73a756b2e6cfb8abda5cfe89caa44dbf8e374adc9daa40e55a21aeb1a4dbb3b4753ab7171801bd74351fe20393baa150471b260b35da7db342d6d032e5bf2973306c5f17ee382c492983951102222b79bed19d0d3185d06a5f551afd162d01a1f560f6da583121d7ddff781e0f7b5165a2346dbc4e00644456d46f6ef2cb4e6035b8c17689d85e27cefdd400d1ad09a467b42b485155140f0d483467b2902acb57a80059bddfac20f77135964ff22b6146e4ef766f3d03eac6a0a6791aaa29e9b28054ebc5c4b7ce0a195830e414d2a2c1c3bef5455912ded1e7a0b4a91aaea5685a2a4d5505aad86829ddcee5aafd5c7136cbacc96e028f79bbae5952b8dc73a0b3aa786f18242f692c1e04746ad5c80e2d4ead1513daa2a97a2514eeb018c16175758961462443102838b2b64b2d710af274e8eb0abd593214a2910d86e9bff0f534e907d0224c11b394342176cfe535a37cbb930a601eeeca3858f78e4999f2e1ad88b3ceb39aaa909501c9bb302c5e9ee187415f35cb0f75a5b6bb5b75f3e22689b23ad43ec882804f68aa04360d2a15f70626356648fd24f4ccf5e873b7819278753610d3cd964a22891e4c852de386a70628612493f59419519ca4b726fe254ea746a1a9b750ef75158ac1b2bb0d9ac161b50df44a1fef65db7f641033671eef7771185fe0ed42e5d440734f9b46d2cae5086a8370b067ac3ddd84055b8be3e60e16de38660fac114349810931893ef76acc6623199959999999930707d738607bf29d2e257c25cc68069f95c67b7d1a4b28e1b8d705966239b057403fc2c057081cdd4977bfce6662b380cec45c91d0626657386458f7e8e7a840cd90962b76de3ce9def05b2287a06564fa521844051fe211c8570cb28b8eb4a29b04c0e1fe4e2040caac8c08d1bd4a895fe7dd3049b74b6c2323660efcdd56c66adedbe214e2d4c45fd354ab4309962c394253b604088165469838d25a01895fe7f1219d019e526b78ee33aaee3b88eabff41dbe6ee4361acaac254bef95e10d0c0cef21bca04a895bf76a4d3287fc9664228aa9f4613bf4fbea4c5311c6b2a1673227f72a3602be816b4182b461b920d11c56820a0816d36c34c67465e48518320569252c7c34e015ce0da71cd72a12e8446778236414fbe028a728fb54dd10d536426846834a1cb625d17aab5566badc73cb6c54a5a9ae68122188220add9a82109d6799ee7d9679fe75313c8c1994a9de769ea20280a955a726e5c672b0e2d1a92d0d989c9a0374bc702f6ffefb802aa1a52518ed39ff304c5f11a8b298a8a865455cf664633a399512ba13535b4cd0d44cc808c78a0d1d05fd7d038df37110d04d0ec8b591a6464a1cd281090d3a0850315675a3fd02f5f1fc29d501cafd5b7074b35b07d57555557f746b6da956a9ced53ed3978ab0d4bda0e6ab55c9b75d25b9cabe53f0ef396bb825c36954ab9cb97a4ecd76c496f41a10324b5ca46e01a2443c3ee6a0de11d5dba74e952fa53f796b7bc257671efb66d43748b5515489bd22e752dd3b955a0aada9c5094ff935694ec0e6eb14b769456ee27731cebcbfed45b19688b6d318a43d439a4ecbf41f11bd99bdb99b7998f38b0b9c562f55e92ac5bac61b4a65fcca08b9b919faa938cf09e8a2af416eb5a5b156855576f6473269b1528fbacbe6e05aaa82d66ad8de2c5ccdd7bf73c8fdc6215e5bfc13621265b6cb5994cd65a9a542c76631805f556da2018579436a473729888629eba40b8754f36609d8f48a7a23148c10bce40410e50a8512b2bd7759cb55d67855c3140ae03aff781a7d33fc6b5fb38eff32ec61d773aed2801ee5c5d2c205bebb6d58a83ea5ebfb9f79eacb53cfe0b4cfdf4940d196e9a1e3f64d65a6b65e82a7107c129b8e260e06b55061ae5947629eda7e02dff14ecf9a7e00e2ba5351429bd1e5561805e12b098a17486ced099ae86089b291838a186093667c06e26b59540002d30c601fb30029b339976d083d608790c01fda3296d0ad119689c41713a9f71063de35a5aa447c8900f04419a10529116453ab55ed995f91bdb2dc99aebe6ba494c60eaa78fca6a15337109cda980ffe3ff4755350b480a26e8e4b2733c6ed6ede2b64547c6926dd1d9f23f6a4e321d0ec6e04e4e0b87bdc3607f61b5d67f8167d3612817a6388dd3effe7d30a6c33821ae09ade1849cc016760455796f9d70166661fd4e4b8e0550e00cb6184476877dd79885c18638213f7142f956ecb556eefc9490c4195a4322676666284edda2c5519ed35976509c1e83d6b8ed3a6b7718e1fba4130e4c1689fcc70407111bd48c1d9779ecb6b0ebd52b98823616548687b3678711be292f53f104237e0273c3fca6fb0e48a1525229146aa4344a73170f72c64f1ef880cd269ac944dbef9001ded25afcd4b419e07edab5dc1be1664067da36deeb782a95f25aabc552877a03fbdb388e820edae791fa1e0cbb867e7e230dcb8dfb55553d80a26a1553b049b3630536ff0343f0d690d298f0813404bf0f0c9b3459007bf4781004c1a70161b46090ec410128f87b4e3421fcb62ffcc68e5e0ffcfefd74fa4ee071f2537daffead0f7ee10e31f097b3046fef8d26cea68907f734aeb2253d2d20b573be1421018bc13a44524924d59798b1cb26e1739d43b7e812684d3f915a18ba8737fc4bc6f4c78c28eac351b4a686eb1c03d09c978f19bdc46397a491969dc3b58dbf090ba5bc5418b4f0302b49a48c0aa4203dce2845524605f1494f228fd08aa2549ab4c2e3096c36ec042be988e9b86d8d76833a0c399ae2d0fc793a3ee6c6a327ffd067a0aa1910688d0ccd0487a435ee23c644881393d3898adc46885ffa01744b91ab63771f38f61234097aea26284ce66305292498cc60dd9a1963c65b51f6738c30e10fea07c828f274a2356e60b361b01a3acc610eabe4e974d22981d6004961089122467a4822e8305b64510c799efd029f540ab82b8a058ea9f610bb5b6b8d19f1eaacce3c2eb6b7ecfdf77d1f4f90b6027370639c5ce18212c955d2a4f4dc874e0907f89180ecc2263d79764c2693098bda2aef5611688d3f95e978aacfbd045909b4865231e5cc29e38ab0da441833ad29c153d8d129dba696501b88cebdf75e9a5ba361a1d19c3664adbd1f057bd7d9e0745b4af013e7df9dabd7ff60947c512314193315edcbb78cb5dce834cf1ee8804b309d06c7ec8a5b794ba335ac9a85a2fc8f300d4133220d27c309adf1df394f8ee3ea122d0e8756abb666666a6ba6b666846899d9366ba308d1d2ad7a512cd40ad471ae560daaad1a54c7fae327252cc044fcf4e33df832558601a60b79233d763f7c15be17c923e091263c20e91fe9473cf23a51939b26abcb6f2a48a9074a60227e7a55215ae34f00294160227e7291055741e75825dac6534071eab75cb5659b38149711f98948e5325691131111715bad9bb5db469403ada93a34ca91a811610404cdea5099a0383954242a1140b46acb555b3fb886b0d65a6e4ba552a9542a956ab55a39807801a0b23f9014a8a9aa3245b9007ca400d7375395c200571d994c26d3e9e2fe8eec0fdefc657a8a0147767f8ae35d67ad0ddca97f9c0bcb6b65e0cfe70c485151735dc76d5bd76d3290451182a7aa0a491b8bc56cccda6de3429b2ab0c9c52c37e43744b1283476ef142aee0998c44e43b1588c28e627ce6bada713278bb96f5bca5537b6c3c24f36c3f30c21683387f1ed799cdec8feddf6b96de3366edbb82d95aadce93928fcf0c33034014e515bc4018561188661e84318d22a9cccc9a13533e33ef37d331487547ad29bf4acfdc168f959570d1af82353defd5e701e4bdac64680de7877070ea3168296a0088a723872270104ade9a2767945826a1d94aab5861ef2b06ddb17185bdb7527ac563e7030f9b040b150c185a2e1021a069d41d7eeda994ca698f712e2f5ea57fd00172e31dbb6c5bc86f07c8413caa4dadf68d39b8d6c18f78a11bd6046a0d0177dd1fa30c0f8656d93311bc771d6721fd0f10024c15c5e2f2ae018b5fae0025b8ee32cc759ee69fc0c53ad2653359da6544c4b7137ca5c0d45b2cddbddbb992a69fabc60c1df834e858a4bf113955b44a5aff8e99a5c80ef69c5179ff461e8a77884f4e2872a905e7c2aca5c5205f149e03f809637c8d5ad9383659f99ce323d66c4b3ad323b30e0527c5a6e61b622b9599a9f343f47689a9f2e458adf746ffa13f866eaec21244d04901e6c95fe6be1f75aad040a4c8069255a9f3404e41d1764c1ddb66dab13f4172d47a4f168b5dab61d920c51ea0f522366970341b03d4f34c103de1bb9997b0dd0ce65140c804c4de09752602e7f0f7e132fa8e2431155aea841e90fa648804d6aa548ab5a70213760f3c70e05a0e0fb9d078ce06c7f7bf08e1c116f4ca101d4e6874e57a306092ac095f4beefa3090959e05ea2deb5de53db31619c3b5e0a48a2b5dd752fe025230801cde9a1a44684631956fb6bd795ec4a95a22b2ebbd255bae84a5f91c9fa4abbfb518f5843cbdb1105aed90ca388028bd90cefbdf746d1e16854673a34b8d1019b94560681cd6e5199ab36d1cb36222d0ed09c0e82daf8770ea5bcc44acbc711241cc9c26c862e22de68441892426e495fb08ef3997571f31b4268b48ebb5c27c40c23d6ff735dd7f5d8e169b55a2f2d7809d1d75a5be2803b9bb65a6ea382e4e96aedac7065c856b002548366ad1e3bdf093a70a86bf821796bada74ee9965223f5f0c33777644a222fa5d7cf8deb8c203dcf5692481f24a5f846903e1c816e497ab034760c5c600e031162bc4a12e83f586028aa3164b105c8c220c6116d8b818a1f66dc14326451d44971bd717940a346bb28c112ac6fc9141a1896c6d6218c188a4ad2388018946038460d8ec4b034f60b5068889524120993faa7a8a204b492347ed04609fae8824d5b1b82e67cdbdcc03aefbffb7edad11a91416b40d2ac42f5456bea10d4c6ff23cd5a047949f39e155593e99ed6aa2af41b1b50d5539c8dabf539e42a1fa74285c751fe3c78d0d0d89ab9326d4dc7a6aeeaaaa2fcb454d6e1771886a49f1565b9d8236b6b96bb24c7751dc771f53c3fc73fb125c02322341b65bfa9141eb1a9a2aac03d7ab4a6bdcb030a36afd93b64b383b2374ee7ae5fadf5dee07a3be0d8a15d672db8030e9cc11bdeceb144647f97a2553d8d7230b8e82b4c4f60268e90b835f4cc75e899cc0c582663d93ce3c266d3da0a6db53275b5b35dd7d9af3361c71bd85cb5ec7b9174578d4255ee79501bd1927016add9821ce5ef4968bb6666fc4423c108d3642d1b8e4c5de8aceb59efd2b8ad5d2d136bb40c998cdbdc067a829716239ab3685dadabbaaaab8f032cbe7c02ec4f6d8d016730fdbeef1463b2649c5af46d1d1fdc98d225639ec034b7076e29344fd09e3788d48468e1995159aa07a558747cc04346715eb265e532284ef7352ed96f8f761be98f23fc2ca0223d2959ea53a9549f5505634619345c11c48fab8849d01b696cc966cb8aec17f44c43ca998695bc86944ccf3586c8c8f4ac2529e228bfdc007ac0dc8377003d544ae9d32ebcf752362a94ec4fb96c323564d032f155a3413ed5a092cdd672ca66cb6ecc5476ef8b5376ce644537752fc626d3ff69dc017b1b29c2047faef917190373b524d99fc6bfbd7bbdebddebdd5b6532991012a21843e53acc5182eb7faf65a4d98095b0b6bb95b80853d01bae0a7ab3a984bcdeec99789fd658268ae996c7887a0a2cbb4824d2a76ddc81da0d925254488e5122855414c9c51a6d78d15d641f6a4617d1681c26136976ab9bd84edbe69d0345792ddc2d6aa9effc74cd317955c5ba62bdb1625121d381250352f2d3fa61ad5806a0287fbc45ab752fc626d38e9f7af058d14b60f860c516b3d96ce6a148554328ca3d3432ea51579e370b0d200536a9d1d7f7de6c276eb6a06ca894ae986c1632120000020504c3140000180c088442c16058382619eeb37614000c5c7e4282643c9807a44918c34006820c42861903000004106366086a8a0358cbec775b8f0d626f3480865b10b1be4ad2505a10d71934ca689067afd2d3a611b99b8ed140ed30abcf1a9340e3220eb917cc5ecc9a2ba0064c4be75ed1b23a40d821f6b7e9f50f68302da42fc88b018374cf72910b0a2f0fa61fee615be109172286b8788f7b149c42c65a59614d38e6c5e4d2b46ed53eb13d06044229ccedce6f12002b522e3299c4c53cbde2361a6dff4426a66f69b52dc0969cd416e0e1e1e089cbae5500539514460b04257dd8ef59bdea71b145125bf05ef3ec566eda956f20c2ba3671424ebd10a40adbdf8ba21b0a874c1b17c27880a75530d5a1790561c13438e91578db3a04a6027f0c5d8b7fa9602540d23685b59c7f635ab047fcd2f2d738f78b9fe563992459f50b2e08728991a75f695bdc61cbb8855485be4be2b0958eb7d80947187968f64027466e4bca730b671ea8e7656f1e5563ec07bef012f7062d000fdd5548a08ca6a9e89a4cf34a6386b034b1a4b4c1769d1f44c36bc6e97928b69ab7a4baa48224dc4f982ca3531bee6213b1e76fa5efed4eb926b2d01ed373a692a7274d2f46dda1876508d05f3f0de7770fc3079c216031e6d3d90f49813ba0424bdd2cd678cd64e8fc2456bc06e57e58c55fa8e18fb12f73b5462b5bb79273c532cfe4d70238307c6972b539db0384b675dc33b947b7d943c068047d52aa10a648d7b6c698ebf93935fd16196828220fb3c835dae76ac74a10ae25792d23b3555ad11f6e3ee667b64e49b03c1a19f880e15c003aee1667cb74d9e67a78917a6540e8b78d6c94256e4af9b2c148398bd2ea3f85651a86acfe0f794fca1d63918e1a07303c11631b87cd9657e236d7020cab84550dbaba2645131a2717992db68602135a9b158fddcbef84280cbabceab751ef874a25a246af5e91c434a2043b20d2eff6bf3531eeb0a18f74d4c55e7612975c62cc70ee9145a20dbaac5c714669df8135a5f374a072ba1848d03935d4464b5aa717cfdb3b6cbb1267108b7bbca68b62415e80dce6a9459f4da11ffb895fabe3e024c2af21814ec47a9facbd28eadbdf99411f087307302de10ffc39330c2a6f2b2b7d722efa9705c9cf507ad0dc5420375554059adf9ab510786b733b0b92745a0d41459f274d068ba93b28a4a753f26684661644edb286a21294c560f91263677164f896e27f65ae6654626ea67fde3a6a0026cd43f5294154332a6c26b1b09ffc683cc4808de0c8ba666e4afa61c345a91d376a3719b0de722988b10a659f3e8452f61237150340318964d25cd81818bcbc856c39e1c0a71e5dd8ee8d856e1bda05ee368fa4a893d08597d8321241acb59a72ce50e8c267f44e8b6af8dd93ee4f81d9d270ade3b26b8542f218e1a6d139a8594831145d7b45da337132e44ac3e39a19fdfb8016c0a6df4dd7bbbde53dcc2766846f74aec19e42b3da53cd88583ee28d4722b382884f8dd22ab73ba85fc46dffef1ff338d847ad56827b981aadc0685e3ca4165573981f74aaf9749ca8ba8e5b0444391554a99be3a75704b4343ef561a90f3271aeaddd8241c5560d69ed7c9c155870d85d7258541fe258dad6cbf74be79b61105ab6a26554a0523430edce963dc72409e8423918b397e379838d52239c4de18448670a2260214a133b6c1358d0c47fd0b19f9fe4a4bbe9fc1116fd1b37f56c3aca376927f95ecfe1b533dfb4b416da4729655033fe18a046236570f7c7f44e834ffbf03448ec028b7b0c2c1247475a424ae6520f36fb7268e9d263ccc3152733c0254d1be739fbedd39cbda55d757cd4e1db0932baf90d420609a3206d0685305e1410bdfb085ff79e5753c851fe411e7b0c12dcf116af5cc4731db1d1fe067451a40c497cfb44ec8146f25fa1166e5e345f815a7bedc543543d23d588a745d61b52c81722a728f048e28c6b1932d3482ea952c98172d9bb3d6132b0990f24735871f10849a51a939116e94e17939d69cc9f0a4c22de51fb652cf138fbe52b017ea6ef45686021ac87c8b484513214de059722e05b27d160372f480a4c2f09657bb65a87a3b248829c363fe1f9224e14f3749d4eee3b8a0f5e964018cef58569c8e6be133f24d032f467ed9524435922650a18c33603233271f9733b9b2238ac24773b9f0f7fb9c436058dd919841a7962c1c5b628aad549850230bf6ecb13ffe045c794a6ac8b1473101670189fc36e2543bef753acb81613b4f7f33e9bba42d43bbd95cdacb97c54c0871e66b8416dbd699e916b7b215e018695e758c23b87ccdc3c200f9722f6e6c35c4baf48341f7082e8f89eabbecabf7825fb1f7b3d11719846bbb84bb19c6e90c764d1b1c30234c3df1e8c91fb21d3b6802997dd94b06b1ea6bb5e0d0f6abe3ce08159d6ad6729639d51ecb350258f0d38dd5b52d0814cd64148240200254ad6992cbc8990f6349cbb079f72317e78711491b623bae32c6d22316b4dced9112ebf59912ff5ae318fe1bfc6bccbb88f8240f824d7789e92f8f24302c63c4a87f5ee3c3743ae92ac0bcb9c205a83776b07c09366c90ee8f22fed8f8fa9758add7279794d79b49c003abe18a11dc729a31841a9c56423fa3c6975e58429706ba39bf6724ee292e439266e3ed8b4ad0c9ad8b35799f69bc88a31bab105c45be7f1aad970872e6df4e98bb630f74e5bfd7878c7dfaaa45251a1782ededd9f64fa0dd4aae5a12694d5ac653d9afa9d9c312e38654216225198367abba5175225252d5fce7e514663a86c658eea81eb1844e27f70e6b40ecda3a561dab267c13fe8a62811eb374ceec6f26a3e0a8b27484fae4258ce1f3d95187286d054ac4c3799f0e1c9dcc960518eee0a4bebff25f7697f2863481037fcce4dddc3761f83bdcd4719639b7ae2c30a2a93342b16867b6b33ba218b596e03942947d7b948a68e7d42ca5a89dd75b92537b16002f58e8842f5114e5708cb55a98a0d384fb3b26776f48ca135b3288908085e80db9d6f2862ae83c21486ff3ad6b75cc86abb34974c6e82bb63b106ed2b1879f113cfe0c4809b9efbb279b61b086e9ef0aaf1e61e5b534953ba811573b52771aca68bcf15f454dcb35703c4fd8fef3bfe8dd0d96768529d20e13d5f7599442a111834513ba9f81a2a872d4b829646715c6ca3b712eccb693c767cc59a736f47d19e0ff23d7fe1a63bf0a9b904be2b13e445059599d6036ffc20cd2a7343f54f96b4f9212afe4fea7ad2087508d6867793cb22f34e1a8152edc74dae9652aea5233e4e6ca8baf91746803e2bbeb0f5ab99d10597720cf562783392ead54f24c4baa06c820367ef499658ad7789093a4d5a51671c35bc38a2b635757cf4ddcbe05803d2053795c5b03696825f90182045bdff85f7258eeafaa7fcf4328d71d66b4c8e00ddbad5883f380f443531143ccc6806ca9fb8afb984b2994b46f1c0c9a0e0e43eb5ac79d26f6da811987ce7c22722ec78b13b560fa4023fb0ec684c66e532bef6f4d3458d33c608b59324256211d73b7767cfdf5499475ccbcb895c720f26106203989b4e01ca3f1791b736801d80ad14d56ca2942d657d1351064c851c18c0cd42531ffae5b8300fd9f9216034e775f1afe55af78ba9161b74150b74bb5fe4c45fdf16de4820e294af3c8723e2ffe3ba2cfd97e58e2c2ab15e248700dfe7e679229d854468d1f234ef694c1acbdab9d332dcef2aef9f076b1d35fdbf057feafb1eccb23ed99dd0915c95320c644678d46ff2feea13990daec15d8f8b177fbe818075a9eb10171e8720f57f3c6d34e02a2b31990ece006465a4dcc1763cbdcdb71b72ed44668c2c16e6e5bff74a6ad23d356e8b1ce70e375d0d866cc7841b0469fd916cee05f05cdf8cee7e3ba8b1b10e217c750b51d674ac2fc9449494d65864b9f0dd1a47666446512dc9f7a1a8df99438f41f8029ed48dd494650e2409f2300d30d0b805cffb55b39447325b8db74929a3ef550ce6ba01b76ac91da17add2ffd8b3e47a026ad4dca337609674adc816acfa514cc68b13552cdef987c470d0bfffdba59f8df88013d467a525d62b361994f34d6a09855432aaabe761d6f737c87d12ab15ac501a86ca6e59def1d47bd02c84a1e683df198839098bb7ad62a158de6361e9aefe7329b1fd0a524396c7f56459f1d54075fdc88bf58f35d2d14ff3ce82a623defe13ff94fec8f2fc7d623af6d76dd2fc6bf8e8389e061a16ac0bb179240af122410edbf92b1038f98430c1d79390c692938bf5dba602bb9513b003fb3da01b00734348566d569c2e0d1f4706a6fa718e280de514b2531d6de84286922cbc8f58744651507b2a13c916b9316a94ea5b1ce8564e1b48bb6a4f4021900bdeaa1c2910265ad21ef9a6568255ede454cc24c3ea5887e74d65ba3d4c2938afed12ec7225cbd478f9191018c44e57d8554a209a8e2930b59a130efe9beb1adefe5a21a47a8da2c87d471e30a558898c57f8cf3b930d7b0deb4b3e12ff15f2f143ff5be640b90aa64645a40c72859b293645d0895f57db6afb1ada1857e432dad070b4593e4a56c35830a01180c7154d08ee9b60b50b481b1e6074c0a379c67b45d894db5d04c91e1eeae16d271c6eb6623760991b40f141224e6daf4c5dacd8024762a4483c8ee35707a438cd4ee2bc7dbfd9b29037a74116b8558593a590d05656ba2c670badefe463967fa54589b261132685af51efd6cf6f3d50ffbbf0652faf146714c829d797e125714fb1a4fe6785322bafee52315b1e473ecfbbdad83a15dd4bf12d09e1b3304bf2d1c74d290bbe769a03ee1b09d217ed6adbece49d1b7cafede5a913f6cf44962a99aa1fd4627456befae9f370b32052b370859e09d2486143458082b64b0b077a6503e48904b98396fd80b835bd60c62fbfd9e22194c97d6e472c9d68788fba2c298c01c9f7605a43930ed68ebab620a9895dae330e74f5849283bb3cf7736fd053043c4fc4e54094dd9c6031da601bb0b66bdf691ba9352fb32923bfd897ae7928170beab8803067a58cca3848799a88991e02f9b29f110179acc9e7e2b9fdb029521ccb932f530d7c648b0a3ce8f057815ead4300196c2dfb585e204d5838f6039262dc24bb646e78b465527484c826410133bc558a1254fe6f8715b3ba93f858e3049bd34b7d3a88bca24091868997b13c1cc8980173092ca0e85a8cca06189ce48d5067e30253a61b6a26725e4f5b98083b69230333d84369a1dd40ace7b5154d018348f912a5992f941f14fabe7c983aca8779e398b368cebab0876596f1e0da3489d30cf0e83f94c76d6255ff6159f90168c9fe0af3b78c872484446de221df94a83faa85a676897b488fd402bfad0fa8e0dea7745cba0f730c230dc7a2b5076904231860561b13b119d857e578f6b0d21b02ff7f48cc3440c8f929f019c7f2b611f3cc9243dbc06331f511cbc21618091440e610b9c3873d77271a6dc7131b44c93483c459b9010b28fc8082bd6159520e51ba477d948560e58490875b646b589a3f4ca93cdcabecbb84aa778cba7526901baa8c571b05ff3542f73748312c6297d6cb8bbd34aa16575a3d458068936ac40583cc6d61cea2cde052f093b527a719ea97f58a4d8c08f91992b37f546ec5cc5aa6461256870e7c8d4e2e53e0b0ea52260d95cfc20cfe31a2a1694d60c54ca87a84304a6f9e48d09ca300a52f3671b818c8a4a8df2e95984bf2eeee04bbf732dd7969ff106ec288d21c1af703bdade72807753995feb7fb3a9579a06d4e5c7dddcca926662dd00642929b0c0490f356ce5d2c6e5287e8d27e1a7807f9101008c94b0d9c0e1ab648823bacbcb8c73aaf0fe0f2d3faf2a4cd0ccc74d267340b806e099de67101f9a7ce41235b6c934fc747fdf7b4db93180a0fb43a9fbf5f6bf762a0c025df854a3c44601e1ec5c07b1af33f5ac26194e4d63efa51c6b6ee90954f4dc3236a46980262099a2b8460495538ccab8eaf291a06a17544ab9222ef162c790846441607fd136e4668a954516fe85d7939848e8fb37a33fc08f333a66b095db8c098e9bd928718a3862308cfd0beecd25f0b887afd7e6b5fab7d6579e360745bce2dc4a15d257723a62e5fbd11e065a521a21f6b0dc48fa67af65551f1f337afd57816db04a44e8dff9c229cdcd58e9fbfe8186f321e1385b3d0f839a954ff5b0a118c97b096eb7934a92d1251dd3794fc55f06aa20469de2867705cf54ebd5f9fb614043bf7a31e626da5dc177e04d59026152dbedc8e28bf4150dfdda1bc9f081fc56ae92543e172fc78268fd77dbe48468410af12e17098154ba21a7c5bd6c7e6c235168433d3f62ad838b5a133646e5bbae91c8f3d97612580be6958b2965ef0f58777e0ab89b0f185e3b8781fb77c7c5bff9c62ff4c269741d99760fee18d638e2a164115cc3347506988b9996426b9e8ce7726a46e0651af5c2bd01d12a4199839f834220aa15eb040371f9f25820fd9864a07bdbe736a41434e53a14e6991113a49411357dd4d8c8bac4705c3652190291f565eba2fcf7a78ee5355d4dfee659ab493c58459398d6180daf99e468a13982cb06d8cb3acfab09f71a8da1357844113b321f86d5e17714a3a46ab10c208fba384e8c5ae6d4f508fb514dfc3d207d231ea6232c0c6649f7275e78a46380c4e97a1b483c2c96cf8477c37777c3236cdb405eb58a192d6954896b9ff8f9de9147bc0b05e49eb4801543e522a5b4b9492028175ef6f5a7b53fda1298bb8a16d7b665de590a3f2abf21ead78b31805a158dd1652fc7e7ad45030ad993b188a8ca85bfd465ca4db29cf81497b21b9ef0609858fab22aa6fbd9830a9cfb20ecc5067b37339e0fb8b3763c469ac4b66d2fc20e147cb33662bd579fb5e481d5b725f94c4ec5c61d53f49b0313cfe830878cdaa525d4c2c1af539239a04f0561dc2b047291485fdd0d069f6709bfd08ee44a66fcfd0e9be5989ece9d9e9aef820937faa7ecad14831d924766282549e6fc061d0c6d870178e3e44e865aa03b009b0300e2ed18aa0512edccce2536995fe359147741569bd7f497d2296c5ac0fe06391ed382b25b91fb30d784fb58800d87456d6e48f7d706a1eac6482b7e0b72771a55c6ab0b73d960a9823cc23307297818ffb1d2dd056301e61811a072a81ca5aca69655349a3341b75004a3ad0733a15dc2bd926f8ce124b9494269533a4f00ac48143234a65fee487744212d9c652ae011556ecd8d90d30c2c12e4b876d5a9678d96dd04b7c28ea94926790eda4eb02c0c71fd20d1556bf8cc294ec13071101d23bd2134aae6a8ad93d1e36211fd505945ac60da8b7bfe456326df56763c46f06f1dace70945fa1d0de0939ba698504caf2b31e9f6e6037e2273a302339f14529926bd59aa47a2c198256c7bb4cd55ca5edf8a1447e4647e55a97bc0f9c49e18241344f2ed7405f227626d02ae27b83406483583991b90b0de3b6d17cb42e075fdc47308b32141d3b5098bb4d7d5526a3fa79737be19cdee32cf818994d35438b5e496a8456c795a3e0b0aa4a24caf3c64d64f0a659afcdfbd2159051fccd1c0f6ed016eae649e36995a16b1000d81264e6d64b881861b8a67692622086b8f783b8fde09f46f9426f0249fbb261b69f4bf546014ef77bc7dfe67dfcec41fd97c298bb1c9785e2187e2e62350059d44cc9cecba92c3384bce86f6fb59bb9c0c9686bf143a8d10f9181c2b730ffffb475e85123a74ac5828111928a7e14fb052fe4a7b697d2f795e95eaae986fd2072f293184eafcfd7b0dbf96c2b274eb945e0fe168a4b20d2988e925b5ff1d66542761a065910ce8e51f2894b2db48d989354d2b7a9fd8c6ca0a302adbcff2b71dd11e3017ffb2684aa3c3182717b70942f73a189d2bd65a4e6573c7d08691cd78f54095d002edf689343cd42466c4727590f5c194deea5ae2d94d8ee10cc3718d8ef73bb634651e84e6d5415c92e24dbc21355d3dfc97125e446fcb926735c78a11d0f97d3cc6c0594192ebf1969c25a14169e62c16823f9452578539e44d23d0311f303cc4de5c81bacfe52ff2eb3a0adcc1a23f58ba36ac861a165c303daaffca876b1d9db9b9a978b47cdd5aa1d78a8dd8df3049c7de27f6cb5ff9474c77bb373056bc98b65da18c4160bb0c65484089fb57748da0159a7c434a994ff772f12444935b825a17158c79b898c62988e8d7e736e56cfad7dd9d1e624d27a659135d40654d455aa554d39468df4c6b10f6552764617cc3133268c5b74b22a480b2098c8ab5d87517a857b617ad0db0e14eed72a428fefee7de474cc6d61e03f783d37167932a3adc85d20c0e6ec2d84fa123d600befb16c1d40430199a70a8ac17c0e4a06af1973893fee2d3d0760ade256a6b4ba5f76ef884b20886202164deca28a2d4a42a0571efc4ae8c78495da0cc4bf569956291949eb215d2d42a4a2d582c11d44de33e96ba6d188caa9a54299a40f2c42009db741d16f5fb538d0b4ba6ae85aa9829012ec37dd1258a70994761df56b7fc648d3347de5fe85100bb8568b10e1f35669410d723e0ee4516dba2359ea369aa6b59c44bb0cadc8198bea9f2c531cebff356d3182e5ada72927e8ba2d88752ec5ab7aeb83891747d743bcd571ff6c1970f6b3aacb015edce83ebe6d1490a2620c9152dad0c73b6a422038b3bd37e8ca0b18861a83927cd411a99924f98a13f52d4ed25db86474fa44bf64dfb4e52b4dc6405bc5747748871f14260c0260d3882d0ddd639db941be05ef139f1452e5d703b6a3b372f2e3582c333ee7b505d5eedc0f0097c66c023203b07f29b2d51358abcc4f5e23bce4a5b6727e646931ca12e7e8609681517d1a7d60e308e00958943629ee9a252ddcd43e24c1412768870567164b2963abf2f0552620ed3b6bde3d340b9556e474cfd1c390712f6cbd39cc587725e201e696ec58f7704d54e12207b1159719176554c4c6ce4535ba9225581e7d085a4bc28a1fe7c47b57c4cb5f295f7219fed578ee1dc4946ee6344cd7aa18f6300eb4e476a29c004ab374d03e54ebf7c958e1a8900f48d178216dff0fd2391450e0801d5b356087285556385af74e8857b4dac41fde36dc1ffd78d6e48e4f88a45fd416d5bcaa711699ed60587ebe7c0c7904f715313b6d44e6aeb2e204b927f2f8168b8243977461139b00b6ce3c5f444311622b0f0364bed386d89e9573044c45c4468993fdc526937e712805d3d7eeb116077388e3ec7fcf8d9af799b0d281acc26d823c416836beb853b15069d8c353cb57e8ad46854638022610a497223c1589ada752b0c4eabc8b245802b3119f2a6eb517af69127a43dcdb2ee5f41736da6d3c1d0dcb6b14b12bb99446e2078cac62a240656ad733c3407a480f817d8fab3f95a5df8bcf6474147db78647eeea3da602b9c6505dce49b547a436e5fafe30ebf64bbea6f638abdfe289a55f0494ffb04b6f09aaf35e65e91bafac90a582600db4533370ae0f1e2ae024e70b664988c5161267ba16d828f79cf609e5757a67e5cbbb8c6ea4f05b04fcb9dfabf1305b23defff1b90e4b350d601210842090f8610e9ac03c858f1a55199931332c09efd71d40cf3a418387067852b40773fef7598910b91e4683bb0d202346883cf46bb91771c2658cf27fcd16621cb6434962fa4deeb0b8ea657391b2a11074c93010116a711af1140e083bd814c23406d8c3acf555e40a6a4cacfff8d42f4d09f7f45cd77267017a069ee48a4fcdc7bdcfe5031b1f87f855b54e75dc0050d6757d300676c3e9a6694958350648af709543467a4a66af830b8a7d45f3c3846cf38f86ab11e0111130e514101952586954dbdfb56d588a0e1a47a0a24c51a0210a57d4ada2e65227416645a6f1f2edd4286e1bbbeb7f01c7011d18814cbfc82730081b5f38ca8ba24386c93cdc74836ed5c24a76f916e0c05b1f096fce08e322002bcc14d1ae2b4345822b190f2d431aac0b13e58721003b3fb13318a6b25bf9c90b21e50efe9a8bfb798c995014906842761649b11b726be10a305f8efbe3fbaed1a34a962ac6bacc04830e24fa1d7958d60b71f8a06f52ed9b7f1cb17d36a167be50a71ea4b14494043e39542fc31fa15b10fa722036c63283c2e896cedc716247e9509e8e155e9c4e12ab6ac781bb10c45b63e52e8a994bf365419dc0d9cecfa541ebaec8b3eaaed727144e4048ef3faeee128fd67ee3fcfaa2c83bc81bb20212dca82b07917de6845819ef0923443c2cd6eb863902d39eddf426445bb1253927627fede69e83187d9d73e0ffedc13fd23203101e2edde240dbd2f09182cfaed68671fd297bcc76004a2be8cd26398e2ac7bf314325bef0aa421c38661262a260a649ac44575c511ba0f32e7f9f3d72e95aa1eae3df460afd035557ff9eb1a1e8dd370c3e06c750acf11d54157b2fa769889738d251741572897a15b1ad30ff79ebcb0c5ffe21d74e10f03a4588abe5a8a8153ceed423d94bf81f0f96c55662a695cdf8b60ee9a30a3c7186315f919e1758680b203fc8894a0f87cbd812d1edb7ecf3fabb86092739604b802c95bb1d391285123e23cd352834f968be8a1b44341062432056c439df1e87898b91345c558813c1eef13e750a43d905aa1b4ace4d9669d692ac0c039bdb14259ff69808ede2601d735f706e87f20de45d1110112168aa67ec0a854c5256f5a2c850ebaaf340bdc4495aa0587d3a0d7beac031c122d5efa1c3d2d872fd88f99df273e4bae311790fdbca23762860370b0316f77236e6ad19cfa8496b0178c52c031a424ddccf3f126b8706c0828682c3e704580b808f520bb83177b50559cf4189dcfd32ccaf8165dcbc6984ee1da8aba0c284614fef061e0e22126e0406688c337d7882b85cc3e2da87087c9c170f875a4c7bf228019815d8faf0753a4e1227156110969c2f00069c9e24e8dbec9ce4d4a2c9ac075ec0b8e4331cdc6dc93a1cb0ec91576811b75567d948c14df58a9fbdeb8b0c7298c012f62bfb0ccd19e15a5b67fea7df029273c8f46e26d5d814acf72b497cbea26ed7c12243d12266590f9925650dd2207b3558503e3db7b8e6cfc71ca8cc0ee3e6db17dbcbc50f042903cc13a1b3a3c1bd05ed86daec1b1bddac23090ae502899238d80f8643723c39fd8c965b6ff89613fedd3a9f0f2eb6917d1273d86ed1b6cd0e33499db3b124a6d7166e484f8e7d16195de95c20ec20e374e414b27eac72c33c3c9a0aaad1f5fe50b57da00ce8d2faa108345c77c5be50663dd3c94e0c9fa597d2f350eb2bc3f7836e7aa88aed50ce0cb021c7f0d1c77c1b1f4407e36e53c2dc396ea7e52e082522aa9cd92879f459fad9b96aa07ca500caf6da4b7254c0f0f3adeb328deaaec715fa231db70a6e71a59593f1ddb4c469fb5ac3396ddb73f0ada47388f3d6580b17708a946faf476fd8e3d5bed280fcecc1dd52043390339eb81f5ac8549aac93cfb74a113466476b362d229794d7265ea59a12d15c55f98834aa1fb4c8d1c22a8b219c5c7888408ecb460f69efbe5ede75601b2cb230b55f7dbff177149325b1037e9bc9aad5d5c354f300104a4d68d1418a901b2cf1b86dec0608b4b07f4c876096c984c7ce2170b527a34068db00995cf8a454cef86cfe21642c3e6748d3258a62d22dbd2382dff432cf2659554c21e532f9e2ac302f05aba491fcfb8da5538f4539b2f7eee68450bc856d7eb210829d4e762a7beb03ba12467afdbe457df5da24b23234876aac5a682cfc5caad5a50343d9199e0fd4364f7d2ee9cff9f3da4153b98e6b0143ee283e073302d60b4302fb2ecdc6daeeaf98ac9d56a35f5058f444474542aade0bcce012ea43a9bbf040b3941cb4f5f41bcc15219024f2db0f71b48719cb9b09fae4d80a499c094d14aafc94668afcaf1a0ec4536c9694d6fa1546c8944e1ad0aee9451358e5484002f8ae0d2f0638a92e024d40c10d7563d427405b0682ad2b4e765fa856da365cbc460ede115071b56f6efb7b9a4fe4f201e5d6ad1fe98aa8c71647d003aefe629edd3c55e14f5f8755d729be4e9730c5f430e9dbaa369352941013d1849a183c2bf7b84f7fdf1df18feb24555c3f244568ceae278cd4e34377b698b09c9b8fc2734385b5c712964498602b41f25294383d5f192fbaac25cc6c17d3f71e01c79499bfb31e318c0cbfc21b28b4c57cbbaf54938e41b214fbe7b46d72b42edfbf8f0307b1d4bb281371caf4816b0086b77f7ae2832d7552a188ba95cb5944388c51495fd4133375b26422a848a2488a51bbbb4aff8ea375c03ad9de20a6a89a61dc98f7977eff615608dcd80a1bf9765d014f57925cbf9392e45099b214884efb4db39dd1ab0fa1bab9369aa6245065caf176be4562a3b8f25bad25a2a4501d125544819b982ac02ab750fc4cdf78d812a4ba36cef1a8dea4a5624a0fc81602403db767bbfc7c716604fb1fce750eaa516205b3f76ac8f4099218d72c29a53a2eeb2b62b790576419890c7bd8f34e0ed4e451754f721dd3e5e1b4283c836f5ec4149e59d3c8a159541bbc86277c71dd68adbb87edcdd7b8a1394cc7e6268eb4965200a04419e2014416ea4fdcacc0ff45c06ef99b01224ab3c0d178732580921a5b4b3fa990fd80dd64680e06817f7218e14fa8445c33debe33ed2480d31fb04d04dd3e6a7c0a7d52c4b7d24ec6b6d903fc9f679e67f7c1c31b1fd6608dde99c2e0c6cbe8574bd500778056832e47be72c2087aa0233203e694c76b44ace83abcde141b976eb57bfea431de65bbfd81b5b51ee5c2355be4209af33a3927415844be40b56747e52a59ff8c687b9fc003f930bc99e26e844130e933e7391cbb8e36cb04421080f0ab1dbc7748526992345b209ae151c8ad3446dd407b1e1dfdd34f3ed2851c6f8e6cacc672ea3961f4130ac5ae7d58a168edd9c93fffd223a655eb4eaf4d0cc28d4cd47825e68e0500e9331511f4555aa18ac130e9ef6e8b040833d26d0eb64b5cb2fc8279b1ab30d9e1317bfa6a7c652b0a596e07e72f8015e2f26ad663083db3c036cd69f5551cbec24934924b231a65dc77f8721faadd61fd82707346f98cc0e1688e53efb9045329f3a305bb02d6696ab5214b4bd1c0fcd3dd727cb19d6f66d786e2575e67526d51bcb0500fea0b4f40794224cf68d8ed6bfaf8bfec4a418d1b378109d1957f3f2cd725c61f0670ba27681ba0754aba598a3c60120a1a2319864effb615f66dc280c788d44735cda160897eec811b86ef8f14cbfb2e9b0d5f08a6020d1e4f076b492729c5f6acb37b545540f7bf8105680e0508f0eaca9a3affe392891b9c9168d6042f643fc104897ff1a6629861f8f874c6bcbfc46c80aedba73930b4ae3f4af4a47dd4078b660dd56252e70f48605426d9474474f3a3ea236222103051efb50265b64ccee63d34d20c3d22c321ceac3ae903a654761cc329f8916ce01e81fa9fa70a84b859c58deaeab568263d7fa1265973854940a43aba5074ad6aaaa7d99fdfc551d7f7f7a13768c4542c0928b338146f8f6bb180806434bad4326832b425725c9b29e8e36e4a76c2a20936f65a83f6872a4e0d4ec4080977c8a0ec746badf2e41ecc6dc23c8be7194a5c3f23c3e346707401203fcc25e4a5f5055d7e1cd78e89e7fe0d7f2a30c3d285d708c50e1c4731f14afdd3793dc6732cfa144e6ff6838a70f0b9b50580a36629b59fcf67190a76849c369c8f99822017ce167424298189e94791b4064d41d738e19c3a675999db513fe36115b0e610c4857266e245211552aa1593efd6a05c3f5036cbba02ba53b3582fcb407920b61f443c0e8683470ecd43f74caa8324353e1108c1be4861ca859fe749aa684899dbcbb4c720df8a457c5c259d1c813168fc4e4d7a2bbe7a4820d010f97e90476c8663fd3b4f578ab6cce9d0c322e68902d5a21b03f0e57455c4dd3887643e72b64f7f9033eb44b4a65302c781db4e88e953e204f41727c6d6e1746104d020d3b6756e2ba3cd608a4a908b406ad65d2762c480b037eefddb7c38d92123d7cdf0c1fd48638cbae9b3e8661a661e67d7240f3160ca47437648643769e62ce65cc834ef17ce075022ebbbab09f337755337b218797bcaa8cbb6a97f13079fac1a92b702d035d27a5c88b9631ebeef3c4962eb8d51cc07daad58a0e5f356a12acb26411be3e93e48bbd0299dab043999c1476138498ff369972a6d8f0982d3bd4c2f1539e603deb403027f61981be36ac87e100e23a7d8fde8c43bc64bf9139bf673a645eb3b95217e71fb54bfd981c707338e564d6fb2a6a14e432b7637476223874f54bde7f9f8916965e0ed0e18759f2640828cf67289e782a025f5bd5d6a37cdff9ece1e9c00d1e84c33bc85e0b6cdd9b079f66d033c74dc9dd7802ef0e253f8ffa1d78e6891f41c25fd6aae471339c9895e8ae75cb4fd2e1d6365c1ed4e369e52794e2adeab7a8d2550fc359179574fb0749dc1a252affed02c706bef62bb3365babdaaa5630b89ecc5801fe4f78b8db5a9d368e276ed6f842c523a8adf74e7a3ef202c1d18f6af4745324163f5d0efadcbaaef720bbab5d0a15497ecdf991e9fce33e1af47e70464b3af072becada6109a232177c5058c878464b5bc93effb74465b2c532a10aca7737ed5797c93fe2421a572a948ad2d27a1351a0960744bce5133a05eb08679d626ba4d21679d5f4d81cd2b84b48690687349c9b68ea927673612227303556baed1a33cbffa0282e089d772286cad92662ac7753aef9336e4425fac3bb2374f5c276bebccc2b713eb71030dec28f071bebc6db0362e30976fecaedb2d3e600dcb037861a4e83d50b89e90f46e7c63f1e41a147529cb77d8f5623b4fc72aace80131d034190bb21044336284cdbcd42064ce3f05d1c6f8c8f7289a81bff1ee8494881b017751361a5a7cb71a77af62bdce7797e40c5a654a36a5de6a81d8d2ee210a36f73b8925100387078c9572a92c01eb7f9089fc17a4cdb6ccbffb8c342ae8b0d525d777cab5003c3549180cbd21794c30b36da5b413ea5d89891d03034a4d5238c7088e5caf15cd6e75931427050f482fd9d6d150688bb16e51bed327e4c8c5fc70ba47ceb26f1b046a1a26ca596e8fdb4788da7e8b23f4328d72272ddd1c4c4641d36ae9d4fc43c57d793e003c2f369a092e7cc60ff0f025b229b5a42a520e6d0206cca35cc41119658690ac805314339f91c1101e7d8d509075fc150e1884c212976272bb03b132588a622caf09a1d800407e042b80933df9111be6b0bb0d89c39b1dce6ad83cecb1b261459900cbe926fb2ce4b10c8d5a5d29c4f094789b5de79d9b5c56a5b30a1cd9c0dc276602f2554fb6651074b5984937d9a5723b1bdbcb2d52a88aee0d33f0b65cdca3f8b1cd792074111cf0be5633e4b3a4655f22b8fde88a004a38a5b3d69763f3d2836167514d3535ae8e366c07e5933c15560854b4889d6e0c31d9917479b45300b91ac39fe8d9ffd42d45c9365b9f3d26f5174f1b7e9821b61058b0ec8227c72d1705a0182a943d504177901500b055c86a64818f9b68ee5d92f8740964e39fc412d2810c83292094310a6d456586d5ca951e14401d68fd37052f5b4bae5a0b24680ec7bbc748a26b2259e7c85d95f53ca810e98509312f1a875222d6844a340e82e1dcfbeec4108c02a6f66f693bcf6bd1c6c1eb74b499c607ae35f75a531c33eb35b91e5066bbb12112bf9776036f9f3527001e2746835aa44b47296f16b08aef9f6026a961ef065b270f081419785512cb95d6354f54023b850753f2c61cb69005d40f5aeba4c56da46715413f41b5c5352cdaa495a75211462c2d91ea8e2b516040111a15beceb8cc00dbc9e5286db840408e08c1ecb70937f831886d4980619ae32630b30c479a88d7b2ae7c44ecb00583afea12c54be3c0211d7e475fa4ed394e071949d6697a8907460a9dfa061c98a824e952417f272f41f11910f8c135b824d02e77493cae21e5ff9e5d50d323cbab53bc2e927976e623b97bff59dd92e9b8555fabdb17b4ce97bfe09ab58f31a1a824f18bbc4c612978abdf1c005ad08350ffd70f388d17598bef7210607dfe2bae222b90112f5b133eff8a6416c0df8d208e029dace3acb4beba139b8475ea4e66e770f2ea585ecdcaee22584b82d569ffa130e98be03a297406fbe753e205114b113f91cf18fa30aadc3115dca104c7b9439b871291df11e182842cc9e323fa91a5174c8cadf121a86444c507692a5241a3dd929e86149574addbd44ddb9a268294b81f2aa3f57e37317e3007b2cf0bc0016f49de6e6e98f7c8f385a642527a8ccdd0c54bc4b4390fa4eecee4834251e10afae8ce2dc48f906f9c47aa82fa41288a5a6771cf07163e809015512f6c09c0db795b79b86bf848dca9ebe4d8331a4ae3793f482468df449b8ce45296b1fbf4807c930d9ec5d6727b9cd8b14523d57b20f348a9c050229a5c09368811d57c35fa2fdace1b7951db0afd5ffa9a4321154c6628a0a3619d25643e3df040b6a00aabba486d9f62324307c4bd84132062c90930d8d2732629052332934473cdb749496f7b7901c8f7b399e8177a359439397827f89778d945d1e32ba5cecbdb7f28ee027cb3b841656044132f613d2604aef92bc579a0a550839a58a8cb4cdba500920e0a7d546a58786c930b0b21a893a1c30517d2bec1da30303628289fd725f53dd54b27b9e94ad42d931c8a53c47fab25d7011ae93244e063de177a28b06126bd88d9b1410fdfd68e0b65ee9a766ee3df83e20d463081975a01f730449423f87e9e29e5aad709c0664858a1314c6f508acb4a2ab4469df7040bb9e1c673f3c2ee5ca663e408404dbccafa52a10061e66c22f703b94f868285c7bb98dd531099f0723a7b76ddd2ab6cbab314230e87598f01edc4ddc3cdfcf53afbbb9fb01e7224f3456abe108c677e23812ddc284cc3fff1b8c8750ca031c4a9b3fcad560e79d104bb665ccf81e304064dde861f0643d1100b3ddbfef4b81f29fd8859601b695d10182c2b99d7b5c553b1dd5a2b5525971526d561d678dfba2f30c2e55d5a07809d99eecb977efa4ddc46dcc8edcd661dc71dee1db6ab54e0a65c5ecc447eaf95d606881e1f72fe826c36941f504369b1576d7990018e8efb95faa1e7c29b15f388ad35bd927f9abd00ce7698422a570ba941ab37a58058c3080bb58c91ca7cb2a7aadacf3be0ba6e6225aba09900c496569ab9f44bcf04d26720677c8acfb8a4f6f3c1b474c5d7ec3b96b0330cd04c6dc752e2852023bd0bbfb29e005fdd85ded4ca3e000e9953e8a4e9e15f93a0005569d02f785f41cec0886dceff5d68ba57c3a4d30f19340bb571124255e56e5fc056f4cbb145a1a8220f8c1f42306eea1fa0616900c524aba1e5a27452e6d6efb6d103742d10ace573389756dfc1289b6daf987d620f40aad12abbf0bbc13a6597f57e0776eb3f0c6d45a104bf050cea1d066ccd97fbf725f2db127b7785c15b16e7d3c5d91f4058e5d170bc4badeba0fb33a7a39113afcb6ccf379dd2c993fb0703f9945303691c43bfe911da45e43249be2a1be0d1dd64874f1bec8d92afd0a53dab047bd573cc32ebc42cda2a340dd7682aa6a4e4019f7fd50f91a85fdb3a47db161d8572147384b23db9289559ae0b40639a236880386f3634bafe546a6978e51e191cd4c2e00e18793eba0151e231c8390dff57472749a1bf87538d0a716f564ba9de5ad1575e3658520b795610ec90b35d14aeebc988fe7f45e9677d7fe298e9b4f25e18cf6f01cd62acc295761cc861b66d9d35dc6e65da2ced062bbe35148d6b18652a839dbaf98430becce9651dbdab3a4b85a18b62e213d96f85982ba01ef105c41fc0c0a29fc6065dad9a21ff2657c2b6d562647df0985594139a5162ac2fb0f2c95bf91d972bf8462c1215e5913225fce25b3b5380ef52e63aa28b27ab5a03277f74f72bb2cff64b4c28edc59c664604c2ec028645e5119f05efa8aa73ee89d2a27ce1b3a24697046572811b3a492ed1c1a38a1f8aba4730ae88c1012fc82d54ec1e1d2d82d3ed5acd0e9b300aa022e0f3450c152868ff883c2b833b57070c252c6e657a367963c80ed49b049db7aa398e090458b572d452f09302fcc3870b721a93433207e0e8723dff2adb2729c73cfa3766240cd0048c1f57e45cd9c2b483c28a1770d0e7ada555f58cb7f773786e3120f9205ec7b81bafe4ec6927b4d4ef21816f31592a78977b16521d1851612d5d4342d6ce8317c782a09f70412310f0400371af3ebf0393d0fe4865263b7e868370db1661406baa9af8ccbd108d3490307cae02777032823331ecefc7b375ed855161bb06320605c2b006a119811edc25464bf1925581b8d90c9d3ba063b1aae129c834a060efc15347d2e151b49b2bdc244a65d4d53702d160e697d709f1b645dd0f20e130085c159dec5bd92279777c46aed8f817e68d74c1bf12aed8269ee817130d0f0dc909f919efc97779884f8f921b28adf424b189930a4951a8d031cd58804d05ec2b807cb43cfeccea532d5f8727b4a0b35351518937cf12bb563687d257657a270e4d1cd78ca97045eb04c4c519427194c8f7d010015af4ed6f129667a32b8cd464b46703166b233acfab8d7d22d801e27a0cccee4df847674abe89c625242199f41d20c2a6e0e5df842b44e2f758607b312247d1c64c85fc249e1bdf586bb635f7eacd33fb10e82a186147c01af059f2592b4488792e7085ee57cd04149bf2db08727e2c72144e1d74580d2a5d1bbbadf9595368ba97d152059a5724aeba0c00b9bd99a22b11ca2049711a27f4d991c8796f4fd740b73177e49a9ea3653983860a5d752080de67576d8cb80a48e1e939e488d3cb50897ee027641915c4e7885bb8a28c6919c93a6530eac68a10e5a144922036db894c51a4c027deca54855b3d42f971b4e798d2563593b4a971e10c47b41c5d93cfd117e89e38425e141729c10349380a3098e7a12c519c674a488bc94fdaf725bc564bd424088e412f97dfc023d50f066e0a9da5489c178569fb9bfedbf96b07f3fb4888b06bfb3e8f24a411b304e2aa753414380ab81d3cac9577474cd716b0a238ed2ae28634220e2319be83de3726a0efde67a743692de5712a2868d9a64b2ade8d6c8d5a854f2ef9e60039e6fd24872f35a29c33d223146e7f459df25b3d15e29e02526d325d44274c02ace250d9f3f6315af92007cf85831461ae220e7038508b82853a228056475d829d9efdcd60d7ebea7265903ea1d19f5c2df07c30b203543af459ad95bb51b8b777a1aae5ff3ca4119214753858a29b31451bd1b62bd32ab421bbf68b20f065881940f6d8f25d9b1e46bd106b3ba509d0b3d8a094ea159785a00332a00313a85f71222044100d47af0207a202f5c2dc101486c0da93c16705e6cad60bbcbc3642bf7cf822d9623e8697977d56ab7834b00081d08e33af0ba2e730730bb55827fd82d3c66c62c4d71e7d05c42cf4df1735cac7f3355f47983aa072e2aad75a1828718c6ccb1fc95ad902795f00b8e756bc8c6ebbcdb73866692183f7919b5c777c2dc53d195771e81cc5735d562aa383c90aafb71347d55ae284125ac8046ba44aa464d6203dc7e96e979fbc1a3d0a88ac38f3abc70c404166b35853458e8e59a8694ffaf419c8b5dd30c9db4691c2ed73c2528ecd9915343274948cf0d5cd7ac2338e48fd5d1d5cc85ab1967f15bd9d415733f3120ed41bed56b5e83f6ac68dac409ed498bb3890ced49e4bff6832019f26cb28c36908e0cca519ee9700d1b058cc2aa48672bdc3ed007676efb7843b4957a86221afbebaf65fd977bb2e8a26c0c18e11126ac4b6d33681aefe47799cccf6538058d7e3d601dd948ee246646f8b32953d718304480d23c34052ba53f2daefd3d2905d4324560fa230c11be291438ab5255dd42fce99363b0104f5e3c26c2bf7f8d5d823de67b973130714aa33ab0fa7fb1de03e1239fd2c401054d6f5969583c7973f5bfbae0069c3439179cf9e1ffcace3d2e84faaf0769a9db1d36f4edcf5fb089d1c710e5f51ce668f81c548fd6d9ffc5714f7adfb13e2fe54154cf167d4d4e3efe993dd3bb60c8f73a0a89894a3ab4be3c41c1e4398423c4f16c8faf10241d089b186ead9044ffeb5123aa2e813af3bf70438c2cdbe7f53a20c5b528e6cc30eec8d635cfff6882ab9c652058d1afc1431f212b3b7ffbaa2de0f56e6c2c40400b81c48c51d91ba05bd5d09a4f3749f14a04ac29300c6be9d6839c8a99e0e7d4d2ca6126532b9a8beff61a8bc81a308eff390e868931098090eb22ded1f16908154bf4b07c63be36c714f975a2fe73cc0094a880c0a1f7fc6794bff27891ac58bfce74fd4712c19dbe4c982ea02bdb2f0512aed0cf3d763b43268929589508ad0715d844d7c483d8731511e947845da5f09f47b5d93cf865cf0ccc8bee617d0c12baa70f150715d1bb81b3d9bcb5f31238668ae03fd71637cfe6cab5411eebceb31c65bae3fe797a9a0f2790612ec49d2b775ecd686efa1d28ade92373675bd8e7942d082624118bde894d545846341c5a54f8609b481421903615e0ac42088d5cc29f2b7017988ff91a961731acf8b28c32cb3c971ecd6d1216826a098f89b61cad2e29e1716f8a691c025683d6916da1b15330d397ec8c6fb38fa5d9791e9ea68c6c9196e2c6614c0617842e6375009e9580b69672623d4258f94f6f778a4741b0f1ea06bc10a37e87358d7260a88165f0f726e31715d2e67be49255a2fdf10dd1819f5a08060180e3c0e3caac1a92a3d997f67dc71ab383e20072b3edb4661e2eace90ac53b78bef6641ec07e5d754f57e2d35c5f2e598f686a4dd277e31d0e63c11e354e10004b71b300214d835f4ce2d67ce1d6d3b7391b858ddd5ae0a24ba7914708e6ede22fda0ffa3c760311a8f430d72318b03b40ebcabc58256c92bedfa1c967cf124da9f372fc1f0ddf37c0a3cfc56a24a8d0a9b1d79e60628ef1bae8999904cfe0c2cb6c7f500b330f25f677530a977a1d4194914bb1da953adf75deb35bd13616dcb66ab995b1b24774ef67a712103e9a42aa608c2775870ee56f143c52954a0089c8ac938584fe996a5e3cb7315d259bf95d45ced9bef79820f0b00e9a01b18159ec37fbb0892fd08691b8ffee335c50e6c1a47227afff224a0e994b0f0fb497832ac9992e53fbbe235121f227c4c52f438cf0ac5efc28be0a9e373c3feef4e84f42ca702c7621e7a0545e881d16a6d07770f6186656f0d8e594057b8bad95f556313ea50ced1da2da7de18ba0b3e2fc810572ebec9f80e48f56d75ba1be55d38e0ccc5d64bf3c170378cc2df0965bd4b0f4098c333c54518ae46878d8418a4ac2b89b65e90b7c59d77567ddc01d5b4d2c1dc032cca531c7be1ef7e18b9fd8a45cb665a428c2923a196dba485676e8828c570c856b3f7988681c5637a990d39f186ef9e16ed0250d2a9f0edae5fb058c8511f4cb08c95156809a39eabcd65b57d66d995008b390a3f97ef9ee00960b3ede6a11010d06072634df2dd5deb642e49b5d636c2abdee1e91ccc055ce958262c67fd0c84754f57e9458fdc96695933be7c2d3c2fee5409a8d7d13e621cd0147687dcb1e33cf1a4ecc425af350985872bccd3252dd86616d3090cdc2553800b68740bd8763fb87564a95bc8ec59b419b915d6181b53716db970f88cd33311729b920480ddbe3cfe3df41ddbe4f11c2cf2a44984f21578e2a9774297bc5fc0ad07b6f5455a5a12d3a81d50c560a17a3b81aff44cab18b2a360e5540364f83f48ec4c905559e25869ea0748f17eb00589246b5edd575a99135e62ee8892d9566680d8d8a0fb155ad7d100e10e9a72b0399a0c8f8a10ea1a0b448101ddecdd76dcf197b8bc00378b60c59838e2c4297c7420ee2c1a8d4124af486ce3574d40c1c66d2bc86521ab370be8445161890aaf944bb976d41e891f6744f12ab0a4a595316a6b80a8a1194e4660318c1a4633cf1d67e71d8099a08df7be510c7ff435735f36f720e40f3e903eae2971c0ea042d3b0766443a82ca2ea8448b5639cfa5a2f2da54de0fe38222aaea28c8ffb470c023a20c3bf347e0b5da0a45d7b2ee97a7482eb309596c6043d0eeb0cf2c2a16d1b317d2af0ff237adc377c7f50af66b9af5416cef7ffcf79f6ac0ed014c207901a1825092cc1077d4630085b95ea0890e4264da4ebdbbf5223ac098a52c6d0bb1e4f17008a28115da485fe8ed2d642facf67177bee9299cc6b9ce9e54a9e540a57a1a4cf5879d21e31ffb41d272b3c7fc3e2abe728001b46c5f56678a8c28a54dbe8353e4d58c9031aa48ecb456713cb24dbf2dbb177c93c78781ef3881a26155f8e9471c4a3eb698ae9f1040a212977df8a0acf020d0632dcfceb86c7bba31f3f67fafebe3b417962b046dab8a58eaa0b88e333402d0a31adfeb187d4e815c04cf0bff589a03b356a50f9291af358c7ffdbde6fcf0fc60fda31f8559040a8d346baa25694bb14663858ea7391d0b6c2eb6e9e7b71333e21505d54130f47512bcf5d0ea18f1d5aea02f15026de8f38369e1eca3c2f2006c66e477f1c70f1dadacf13f6c51c886fbe870c23645c0724d0cb997ff39bd985b911c4048e392f2d94d34b7987ceb0ebb05a3fa37ff680caa02cfacb3d570dd2710012faf63af9d73c99ff341734be5c9070d6bad1a568fb0c394d5a06c491b5fddf0c5e8e0b3546ba40e04e68c746ca7015bc5c2c589c4b1238e4448ea31cd2ebccd2a6dae3b22d33f4788e9b38447471a5f0835c1a47a6ea8117bd54523b3b890d280337d2c1eb527f056e9e51b1fe5c393a16f726c6c1895429e3a263f56e90fd540d24e4628800b338efa7a8494fd131f19c45424811c8bde758c5a37ba09f3069336e24e81d3276688516cdd1410050a6e376de27354f5b2649c3140bb2446abbd2b468a0054c9d00ff5276d043c0b53d9cc317235c100232e31b2b2f6d81fe4cad5282bcbd64bd9c01af7d25c0d027a7d95ca4e991800154dbf0052302a4ef4149308c61d1162869a6e5bc47348289922aa78e937c3dc5eede5ea1127e64b1e2bbe396c7a0f8a0c1ae0eadca6003c3d06585a77232629b4f50c117acdbfd996402dfc854d20620b3823f686c8c415c49d197de3e6e06d3fa5502d8f2a1322bddc45c1b55e56b87d20f81295807da055d46e5ce54d0aaea47160d099b9012367b1b835286aaf222cd090534794f52f5005a988d58e595d0bbbf44689ad9619a015b4273b2e772130e84ff100b68265944df96bcf67f393944c56bbd124753750a622ea8e7d61cc08dba44ec568a107382582954ce444696045eb6b1bcefecf53fa4a26cb43d8b2d07f78c33bae6ae46ef62839cf4766adc19cf45445bf0c442d78c2a31a33d173d0d3cd846222348ba0643ac4a512e5b778b42622e43620bc79650b1eb85c26750d6ad1c1674e49b2f5011d7e185e6aa02889d9773d7752444ff806e3d80c48f8265d32246037ff3b6e7c10aebaf39d11c8a9614dbf2c34028f6d65f28db533fdbb35f72f28d32aafe8ba82fdb7c91da62005004307cd44589dd348e30aaf95ef21c2c5d51a0bc749de3f1ad6dbe66b16d6e4926087e65cd996dfff09e9f21c6093a8f5f89957de6ac11c1238515ea6c07d600785833796e0aef0ceb4f9c37c74b6ec35f267e4c556b1a2069bc67e27aeb7c1bec0b1ef0149cf513c3a5568d65d9fd3980fc9d711992a635326143b781a3992da82f00647dbbe39302b37acfb8d37c7093ce6074a9fbfd23c63e5dabadc7c954922a39f936dc69feee52c70c2fdb4131954b4f5b93a392e4801cd602a982ac85f9895028297f8c536cacf522364ce29be7142e5afb0559b49272afb98415f1bb8035b1fb3acf4729511ba6a1b6384d099654aca23a97431afba36b1f46742f8f72b0f1561592a31f5908d4d26de5b3b8206f713b3c05cee1d337b49bcbd8fe3998df4bcc02bc1b4784aa9a3dd4f54be00b9371e0beb012fe4568444baf1d3ed9e088fb105549622436702b72a1570aacb6380b7b2d86d885202263beba105d186dba5067bd853c88f90e58a7110c7e34f3d69d8ef154e2964fcb585c82739832419ef33592e78e8546087051e3b97774b34a1fbbcef28b03f5ffafe3562662dd6ad8a381db3623ad85a7d856b88fe8d7f8fe31b304b2d25144ff68ac357f0017cb8815d883e1d771900cf18613fea667135b45cd271e14a0b3645d822d4660ac0eec1cd179dd9fe724f3e26e6c006c3a91ec36c14e0e1cd65a42e0d4e0c31d4622768581ea7042cbebe65c73eecdf834e3807461cf2c51df7455cb15724031e522f7d3f8c67747e36eefa2d9b48cbdbc0fdd975960011100da999236e4d21fe474662da4a18ac76b00463df7ca31ca974eaa6986b666a84ac229dc2f926c2fdeca9c88e200dea9c00157b2796205c3bcd4cb890a6f057f4fc5f732c221d1b5ec80af740935269b0c0c4aa8bf30c7f9218026cef1bfb63ad3c34f2a744b10460910f5270c7cb30afa6ac5cdf8faf801cd9a219af5131a0752aa8765a367f081dfe39e7153c56be942a400d902d2f08f7684816a7b4d028f16d927d566b946964bc0e5d79f5b546551e43f09b0143eb874582a324a70ad3747e416ee6d1c151ea7cd930430de5842596036a49f84f76858568de2e21b998a19027a7c23bf1b83fc9836ecebb0ebb24055aa67909f4408504289ef0001e5ff9992599607827157e7bc8fe40544a774373a054da156ab81b26af00b3cf0fde077c186ff1552c9d81e3f2ab3efeca312800d322d944b074c2f1a4cdf7bcd28a9dc92f610ef3f4fa1473cba6eb635989727424bde0a8b858cbfcdd41107e36ae22923b1997762be26be37027cd182bc168e0980156fa13fc0df19b7356ff25551ed9aeeddcf9262832c158cc6a65221722257f398e19ba3da1aa36df8c25009955bc191920a80731a68d3e57510d2c4e21018e20e6a4489c48a76cca3e3a5df1f3968dc57db0a1f6f6eda4306e63f61897ddee030cf6ea6fad410be106fb216d9903134cca47cdc400b4d474d6263f6f2fb0890c65495ff93dcd1841474608a1dc58eeb06f20896f1f1889044a022198e937fb5915609339965fe0fc5b9f393109060a6e6814e623512e6d2895bf0f5743e26412e07c0dfc4a9f028a552e6f56097159709807e311544c6f500d0da81c65159889b9d188624575296b27624592364ae5a03963fa38c13ee1dc8b63dff680fc2159ff690cddf4e6f7f5b2fd6bfc945e849e189db2c1caec10b752b680663031254e5303fa8813b18877ab16b1682a8ab752745f579b987292438e724ee307971f41396bf5dcdadcd097cea3f5b343569ef201a6178c4a88901803009123829b23667f51b53b567eaf2e9a548b8c12bc8a4cc33f4f54498a9f00f0ccf284e64e5d0e42a483900e6004931d095fe2d655db2c2debfc336bd04c5af6012e55214f4380aa06c431685c90eed8726a9cb50a98bd24121ae93d005a6921bfa46e8afbea85b31e8b257b04df79610ddd8c5ec7657c13a4553487b0999192a06dbe6aad836e20e0f1159759d15ab53f7dfe1a2b620f0a49f447e610c3e8974d2122703060171577b998c45ffc5ed286a0ce7a95e2317c61a1fde0b010e28552ab51f39fff86bfa0bed7723b6a3b5753dda837474b85451b9db0a18e542579ae7bf89e1cdb6e2f03d63e8db2e810f3e8cd75ae849c47382f09097e2aeaf45d667e6971ad54bf2b1d53da478054f4c5f60af2511fc4054ed8554e6af62fc0ff3b11f9e697109a3d275446aa67e692f06ad7a7d4d06ea3e1838c64a574fa5611e4b48d95c8b748cd3c3fe82cdc1d2a1d9c2667638874aff85941a3b34fdf53bfd83c6d3a82c1d1d2f605e273137a82bb94d8cffad8c16a823d610efd2f40dffdf5bb805d1a7c0f1a33e0430a92e677352d15fee12be518f14b35c0bd154133c8b697c734111600bb4adf68202c8513beb92808fadb018b604cf59629ff8e5988ba69da7fd42bd1ca11ba81bec5912286c5f720d4538accee518fadd83e2c373aa350596579c47105f5c4862d3edc8d26612799ccf1ae882158df1a657092c135c2dc10aa976926f24ecd8013f1761eceb0f4210b3b875028aa22f7035acc37176e25d197dc6eef125f6dfb614ec8369769d5e94b3093adb5dacf591187bdb2730cbc26c35e1129d1285bd86c2188f196a1961788bdfd18c13486d11593a8078c9ecd612f305cc4b1e501de5d5a06bccfb5644f82ed993439ff362362beae3544234bdf24cd2946c7d7f4be38269e5fe521bfa1ddef4d438e02b89cd351290fd46408e7891c0733e8321bdea3d19f70ea58af6aa4297e9a44a5485251ac70c546d36d257faec94d5915b8e3acb0f7fba1d82e039bed53d08e0f1a9a6b72ebb507311c5f2112199494fc1b9c9a485b1f6c2d0a8c11f5470a26de24f7f40f755de28dfef9c4150cd79c262236851e7bb36c47df7ae4b45b81456e361d7c8a24131486e7a9ec292459fc5d44dd6c4df2ae1fa04a5bc7d9d13dc1f786894573eee27c59eb0e7bfdb659c070ec5784a38bc41b1857ec8753b722c7fcb313a09e0a3cc0d51742cd77b5fb510e572cfce0cdf1f1d0d91b2ddb76850a2a9f5a92cd3f37abd6a1ece8a322e32f62235852373a900329a533eff588ece69e2d6e5fda37b2129b3e1780e11cec191e1b6fe1c1cda6d40308d0ebe35ede8dd23ce6f41def9f8b96bb6fe763d458db3b0dca7583a783e8dade22780eee5287ac50461e310390d05c4ea46a9cca3c4f1190b75b37bdac2faf90e517f531ad23fd7142739acb341838d92d376b5090dd7fb283a317b4c4b36560b8c136e43b6707f1cb12ec44f7bd42ce97eec831bf8a115919b69e1e600edc6aff811462137fc89ca95f3ed19b5d52a27d4e8945560796179db3384bca7a8a1e9cede775a3c20ba2f803dbc5825880de77e29f610a7a86cc931ce134b24d10cc2adfe81cc7390b37d18e75e246ed18f70a1fe21bdcda36ce508fb030f478bb815e8640de5aec78ab4c91b619eb1534ce4d94f2521118affcb928e92ebe831753feeccc315fec9c92b22f8bd5ce7a909f91a27561d807392ac0db480097999dcff472e4b374378885135c64f2691ad361b8816408f027c8f1f68048b44fb4f3097f84f5a63ee3a2754f8166bd13c9116d5b1bc2144569b7d6ba3e7a8da1dbbb5e0a8efa35d6e8ac97a62de4440a44d359fddfa436e8a7a63140ac2c65e6f9d817721c0ef8b56f8cac3fde8fb1b1a9d5ea362648cbf409ae4d02007a57e43d2dae7129571e31e14198faa999fd346ec4086ef60e50d4d673df706b23e7a17f73103ff9d4b347aea1a547a19972425c17b98b54430d8dc2fc284ea1387fcbdf4244b4a1255a75e0725b1eb66c3f35da3b18154c37008fa0c15ae9cd7c17b295e333bcb41ec94d6e881829e67f64eaed4c67f36ebe5ad1f7389189bd9007cf3db736775aca3bb24fe0ab95d075cc47dddc757ae4c7c333b4e48f52ee4e6fbd807adb662d6209a7986c9b6708c8faa25d782e59a3556ce08376d9bbb873c84e3c96485c06c40d86144575abf2079135a3025e8b869a3bb01fb04b1d4bf9cb6e2f8973208cb60d03b7cb3f6469aa0276efd625bac770e668288a85de3ea37090c08056d14c596ce8ef91bb05f4b99e2ad6dd59d8b3ee844f54074eddf23c0bac28aebb333b600b4448ccd15d6a238fd36cf24d4491068530f4e9b3afb14b36dcb4e2cf85bce5d17eaa85a8e5bf905ac283432a69cd185ec881d286652d6ec1280053be6008fac09f437b422eee667109bda6441f7cfc1587a20431912e1fce82856f7979dbf0eaeceb8780007d0a8fa49e00c6b7cc49ef40d92fdabb83535cc579d12e5b7454dc18f6aae537ecaf1fa79a5ca4abead9e16540d7ff5ae544258cbc094cbda772d214452b84f52dde77643400fed1a67c71b1f014af296d47a06ac852121afe2baa2c1d4750c044824f1cd4669054acf67af862af737001c59390dc92b5efe935df85383ecaffd1525f056b0fac1de818e9ddea16b779a81aaf72eadfc10c2659822195fa0af0303231e63bf65730ea953243854e5cead9347cda6bf3c1c89d6e3c8f431adc8ec07c155ffbb6b22cbd568369ace48bdd0a00c0f8df82b85b12fc2741659b1981869522a7f9215949b435d153a14f919dd5aa41a927e7467dcd2ff27ad943d5c43baa2e1d5bfdab01be6f1fb814fda892b3a83bb2f54a757923d619eb336c78a961b969d50b921caf531d6e13c76e28651a73baf6038299e1a8b0b83592cdcff3d3c668dfa66a226e8cc82582bb96fffad87133e16bb85306e092028ee24187fdf0723b949ba4092a9ce5718d9de2742545e1fa2164b40ec08e50291d9143dd812db3d944d1132c1751155f5ae10d6f0b5b2dc864b7ac4a8e145aae3f6bf0a770c860878578fa46b3cebac318cc4550f0a2c6bdcf7b165fd58e311513b56c063cf3946d3815b3cf09fd77b24f4620cdcb839e46bee8fee97ca245059b176ce7cb047bee8070e8f7654c492cec1f2389509a37c27c5b039458ad6c440992ff2281fadc48c358e5c68b26e01e2833cd21c7d5e17640dbd6150fd1b63d15711d2fe1b375402c4d89f10cf4e20b279423c094bff8a16c4e5922bbde54758f9e4b0a51c3c280548d7c723b9a898133fc24dff08e410c59a89d1acf17823bc68c0f3b82835050425ba88e106a634a26cc67f6836b30d3ce6da12fbedfd1d77bea8e3eae922e971db0c6e5246df2e539244ca95ad39f85f61879f6d6fe02169db324d30fb985d9b0d02511d7536feb09533ad2216b93dc80f88f69da700203c1a5576a85f4d678a8a3fe9c4d7e702dda389da761e4a0620bf897ff02eaedb9f3cc4f5d59c2796651fd5c5469658361a3a171be24e46e0f7c02f7c0abae93c2bd2bac19221a8d4194efda2cd0addb8170101a1e7b698945d1a3fc6507cd8f575ccf0daac16d442cbce6d2163a44c63bb01006c1d53df7ce12048d1df75bbfcd516d59de57523fb0aadb2e16dce503469c54f9ab488a9e71432acd6adad858495f2bf22b0dae13405782151e24989579c65018872cc6c4da1846e49f4f449ffc22158c99a875ba8fb0891f04057e46d854ab73566eac4b24c2cf644fe79be8b2d076f0f1279d0d529463f7ddf92d11a0dcc1d87e9a4c36b5e407c43d14ed751ab91fcc6f03830fba9a55ba4a836c49310862f8c4ae867bf700b1e92b0f250ab5416a5dd6ed94cef95894c1eba5f028ef799223ee2a93baaada9a12945c96d34b2597d48cdb9cf3911eabcde036ae2260c0777242ad82501a20681de26410bd490f871b6490c0e259da67bcb8d972dc35176be02ca99c4af4afd57c637c70542ba51fbbf5ead7e9aa86a541851b7dce4b9608239f28f182bb084ddf8ce302d18809b79d34d3af52c0b9e4e86bceeae6785a0aa43bd91441debf7ea568f3e9bffd2f2b5a2d2f7188caadcdf1839ced0f12a9ce2bed9a01c97ad11f33210319eb017986758539ca2fc3d38bdaef2a4dd9935d76f54263797526199e0c501ece302dab5695b5d301232e21ca93dcf89ba7e1c41a7cda00444f73c1bed050b625bff2b654fb034a34c3b6d5d256525fb454946af3a57c638c0027018e6315025820038edba7717425554d5ff81e0043b46183e7b038dd1eb313b21eda7a5252bb79429c994059f059d05ee5e394b81f4cc10135bcc2a20d4aa71271a20a2ec6608bb97d486ee7a9ec7043669502947021c90b6f941a9a862680b2a5874edaeddf56e2783c014d60e4f2ba8e5ee39a094b67156adf7deeac37ce1fe055ea0555eb8642dbb7bbb7beb774c2a125c455114a94cd7d18a5db5d714b483cca69523cf0aacc5dfb48bca62a8e0af3315efeb2e092448ad5d9ced56ad2d91286a51c1f70bc1fadf0a750897bbffc617f03b832f1a4d99546e0b780992408278b5ffffae73898e6bd0753b58201acdceaccc0b2baba1019b56666532dbdae1a9a87b6f50d7dda08abaf7de7befbdd7ca605405a48427b7765a16c8caecec0b192d4836a38561655666adec666545a85dcb99afb5de5b513ea8c9bf070d9bd42624c80b43485e641b80406d340c0bcc66f76d776f773e6156e1f1dea3b68e729eb1f3b4f606c824a740d060e7fd075af718306e10d9f9bcae71e05a1c5964c8791a6515a65081cd537737c75dee9ea7fdb6f0561744d8e2e91482ff5fad484618974aa99b4762044dac60e0c143841c56de17c1e1c40a061956ea8b14b5bed9a7f7e2432877a4675337d865094c44c84c0f342f6ca5c0d6860aec5d3d35f8c4bdb5d69807ab28cb713d7a54c62b0ce655987f8d79f53eecb17aad9abcc2621eae308fd523c4605d9f1c51aa4a64b7b54ec971026c654062b10a83da825a04357985d51912958858ad8adbbc06a456f3d8d75a61b00b1b65e1f2c1c3353ccf74b3bf8e5a6b3c146cfaff9700bbac81e8d7cb5adb75321910557916405e92496ffa0ed9df741cb23b0d253030174110f5132d4549c305365bf64205a92f2c4f3328654a57b1e2573e1650460b92cdac8b448e5a22d2469a98344b3132e05a7ab78c346b7da17cf15e006ad92c0b4f56a50717b55b1450a0b47414246cd0b220276870f381bd5af62acbb23cd1e0c86432dc2c5ce4217610815b07761791f84c51c1114e80a812c4598424313c3102e80836228810c2153934010377ccad7f14f409b69f2a551e37a99bb2d6e2ee7a9e77452b62214607d8a44396085575ef10466aa81bfad1337428f5e376dd5dd7eeeab5f751bace5a8bc4b62a0abb632ae3b42ca6e40f43813155b9e7799885a2aa1615d71bb62dab43dbecb87525a66d926fcb0fee5c5b16fcbcafc901db90ac372a83001998b6655b15245be4477ed9c42f3ebaef6fd23487f839c44be7440cf8720da308d9ec406e32b43cd9dfe5013ac06e2553db2a4013b721dbb2d60ea1aa3ea98c116ad337500ed09a3e424bff30cc26bdd22fe80ed39ec1f94ada1695b13aec58d2a453429bc4fe7898f60c8e0e3de36f2d5525b13f3608cbc4f6605bf6b4474e1e92dc6075b0d6dad2cb6eb104e1f2c1f36c16c2ebacf5bace6be5e4e47847c0b854f294a7c25577ef2aa71f405119a05df40ed434c5ce0e166021b75b776f776fd791426a0a2645f59e759dcd7a56517446bfcf058aa7f5fdb6511185133be0aa60eec4239228a77e4f2ad941e27516bca97ed52937a0366827a8c967b5c6218a255e4ef48c06bd6ad7fa23674405921fd65a4bd37222e6e19696166bedbdb7f680389b2d5fcb6d6192513ddae45f5aa2310dda8b410fb366128410b04967b4d5450c1858c400ef5bdac6592430c46e89010387d96cb1221fdc77a4d93df7d9af087c5f1012a45576131f58cff8d7387bce2c17848b9b4e90d3663bcbb2ddfd44d3626912528ac297a857020b9808c3587fbb805c40b556cea640556e53007201a54055a37c4206bb6935a8499001d36af27650812b479a9e875d2970b6a660b3376963026cd220ce1269d170b62c47840626341e253b5eee10690d0db55c2e97cb1506155155429cd7dddb751cd7dd8ef32e776f2749c1401bcef33ccfd3f3302e95cad24f3a7bc9a7939f18f320667fef82a27a54d153d5e8d523b3fa749602ad11bfbf8eb46fe8d35bcfb2b7784e96952f4f5652485ebabf12b35ddf866254e5372ad3360e069d71946b718b79f7d2af198a9ce7aa06e9b27106213372ec804d2f831485134ce061838014aa66074d090730c00985110af9cb21691ac994ca80ffe52a52a1c191a66db8f7afa12a7b42d77cefbf6a94906a7211025680f94ce906db456e616d93d333352704c35b9a5c6ed1964e24fceb05038e418643000910b44420ce447126ce70a688271a171e60d3676215d96b1d64c7165eb61ab44d0542cf781254557f36a33fe8166bc64275b5d95836968da50495715fc2d640e5ac434b5ca1c48d0a0f72309bf98cebd9ec05483ab6020e36d575b5731950e0130d8d1e78dde5ea7bb1047ed18fb8db799f0882a208822228e2920d2ad33d5ac0f931125d23bc2647e73d7d8f74ef1f2cb458c1d05df95985e1c8c377b8d77597eb6a46c1e5b8db7dbb76d752a9543ad104e534500cf3e0c1e3c6e3e63c4ca0a80c501e94c7bd97c709f95b75efbd49693d03a9548028b8928d4b304408a5fd4be9a5f7588346a6a22134448478c9719c901bd88328187cf1459d8b87df1786df17863798caf468a1af9318758e4b71dc97372857ffffffff7b908027b0f947b86b84b5ddddddb456abd5969a1503a0aaaa4577418f24f191b4c29a868ac364e1355ccd96eeaee38be2fb76e8e0cb7d9f6d1b259b63ed1585201882210886208c0a5e48842dd992b57609a6f964ad2ddd24b0216262101bc795a003363fbf15f946079a225cd4ca912ce36e9898ddc864d55a1bcac059778fe950957bebb48eb78eebb0bc465482b96cb68ee77960365b47a70059a7f27caea755b6458d1198fa0992459c78458a38f9de88e85db84324c062c992d979ae8c846469f420e9bde927e8cdaa492ccbd213d1f7468c88c81e292844f2014fc8192ec03362d8ec9a9f2dd30c93daea0f075428217041134d5439cfd537a46617beff485fb590cd2df423fbf959c966b4203f79f0c750841445e48089dbed49112b0d0411032268053540810dab181c2c1185099260e2830e371fac4822821038c18328ab2e7f932f448ab4784e96ffc028c1379badd380b39aa040c12dfb6161ea65d7752c2ab048acb53c6e64ebb676ad5dbf01345a47c3c929556f089fac141e418bf391644e35f9e3e0dc00572dbcf4e3dedbf578640a0d94ba490148109c1ceae52e75e7791e8e58853ab9511fa2619468db2aea64baad9e6aa9528a04b5c91176d0cdaafa2526b887fed1a1548fb816fe0302fff96979905013d86c2952e88debb4aaacae20a49abaf356fd2109f62ebcd534dbb716d9ba551b25b0e9b61b28aaada0282ffd4079a05e12efaf6d1b35f9b78dbaad34c306d8a642bb15d4e4ef5a64f7ebf4c84d410777135411f805e77bda3aa88a661ad92c794b696aaa6fa34476cc4b1b35f5dfbc3337f952398e540097abb5914db76580fcde857ef0fbcb8aaaab7e2afae1ab3004451d251d54d5f96b792b742bdc56e22af743fcef2b19b68833eaf0f7a477017c4c1a113df824d288931fa207df88f8dfd3d58be83fd2881323df8b4f5754f4d200f1bf7741f4e04b7d52ad0f820f7e11f1bf8f0157d3e87b710cdb43fde0171cf069ee79f9e12bf13d2ccf7eb0fbaca67eff6981e450ee17057075a749063a3790b5b67e3216936cfa151d20f1440748b4ba6d15cafe3f11e8f1f9a9286fb5bc490eb0e9411e54835c6eb3ef364779b54c3327a30d7185db4e1aec4836eb491b22289b15496d551ece36cd7fbe2860904df1e34136bd49eed74bedfe56f2a52315c07df7f276b5ea0ee9362b7037f1f2891400d12952cc327d220550725f89d1d65131884143eeaf38df87422a8aae562e0f80826df5ab5238192c389a1938a0571f29a49aaaed4d6c8495cd97fa666d0d654b5652011c8b2df7b3d872ddc9fd54258aa143659aa454a65dacdc272f86ce0360442535268962786f697bc6852e069ef0826656e169f272d95c3704c52f043d1f31402f40cb0dec38b580d3c34b3a7389652d4597f8a2d1683412ddecb620e2154f29c70d8164f414a0fd6d857034f748c14b27d8af0c4890545fb46b470f96c0046a5c0902fd41ad8a152f6f30f41739d490fda9103e0415c28570215c88a6b06aad157b582c9608763f3c185b31f4c48e85ddee9801e3376dae0155554155b6793a1f7c6ffa125de3bde94d0c45a14fb21be14eaea8e00a26a997221c960cb9eb50158b0df6d3bdd8028b4c6d285a2b96acfd3ccb0297c16f9efee28ba1da36d5c7a7bff03e9f1afb815558eac7141f91bbb7ba8fbae7442b70b9fb0eaa57daa6fa0405f9882e17025a77a82d5645e5545685d9278249e48ccaaa319e656c1289843189a4436564e8191abc87caaa3c38e4182ce0bf71199c095691be66d4830e2038fdacac4ca23c509b49a3111e3d1e3d1561d288d52252c4cbfe3c2a93334406a385d739c21eee2d5763261da56a2a71adf1bcf4b00bc74be26a5ae5c8019ba7930d445bbb5abb5aa5984049fde488da3019fc68c9a2dc752ee0a33084453f227dabc6f39e52cf1b895c72c0b4862f3efe112647346fac3f1d8e61c32a09949b60fb3d04361b06b3e10fa491476548a4e7794360f34daf05aff9ec8b0f34ab39d1dcf032ec181e6c459158be9737baef5c3def44d37556e4a384dc7df7df77d77dd8891e55798bba0f3f31860783d947090f8082452ad84a9dea4879c9c3cb1b2f9f7ab428b2141253f60fe271f7a3a41d4df4f95d8e2400cd2fad557fd4e8149caed68ee6b5d61a902126b8fe094a251729dc6fd7755dd79d52208aa21873c4bd57acd1024e13f11a9bbf4839a879a8aa7e959a0fe6c81aca7f7eb87bafb5770a2ae3544e1db811683e84995f21732a3258961bc187e05778cd6bffff6fff6bb59193ee7a9e57034e95b8ee0e6977f7d2085b1d060ef31712f15551f445c209b04923fa91d60ddda232495c425ef5096ad352aa26efb339c13a736fdd9bc140077fe9db09cbbb7c7f59513a4e484fe3fb5315a5e3a4e571bc8e13195fe3fb712a4ac7498c9ff1ad0abfdfdb46f4a3ef97cff1fd371565e3fbc3b0ab189646baeaac4863a42b4e04c31862a5b4c610516c6d3f3dc2f42faeb8151772290ee4325e40653036503bdc11850cc46305773c41c614d8b42e235d9546ba32217bee1cde9147c663cf8c1b23ae26f05fc63a62df01b29077b451b1dc8000295e9a50029278c714ea550bc00e668877acb10162878b78471a181b25f18e25bcaaacce700499c0bae3010cf0825a824d7bdac1a6bd21de71e6a760d38b110b008343a8060f6462606a0891b08317efa823b3b8f818208643bc230192c0a62d07905d3e0cc3b1cb378b3c83e58c91826118865d078e9dc3d2f455942f55110298c5306112ef1880224820610532e21d73e43b0220fbd0adda6a509d5559e562862ce1076c7a630c0c8a086c7a0610eff839868b02c4c4c8a1026cda3bc26416ece34036403a4496b1ca882ca387352c38f28d9156173183e00d9290973c66804d7bc7172525b86496b1677c3cf6fc93c69e986f197b605ec6f8314235acbc0d29f18e364a2716d4c8a39165ecf918181b2375f0658ce0c718a9837f63a46e7a19a9e718c1af31d6f02b29197c17ea24f834c0c701d250016146ae2c1b285a6a32328c0d1266d8f4b24abc630c96570cca942aee56bcf47120978243c84d7e23de11cb68cc12f0031ee21d492688771cc5c0f0b061d3cb278877146596b127062606260135ac10f3a4b1e7bf65ec195fc6d8437e8cb10700314fe371903fa39e00187dc84dfee4e837f71f9d36facc4dfe30a3c3dcf41a1d082a1344cff878e93f2ef320b7b9c97f268633cb0c164ea70a22cbd803f378ecb1f1a4b1a7c6b78c3d33606c8c3560d3f321b28c3d00783cf6904f1a7bc66f197bfe658c3d311f63ec81199de6350090a4cb688ca4cf703ce941356248b7c1907eab261f5a39e1e57005b11b8dfef2d2630ec57d1cc8a5b8c93fe6079bb634d2158d91ae70d0d58c9b59c69e9717d2ab26f0439478472eb3e01a336268814defa50016971709b1058877ac9965ecb1f178eca9f1a4b167c6df181de63f2e36480f6f9eb2f7a512a945413d54a2d92ca17dab03bd1bf87dde144bbda006bf0ffcbe0ff4321586e1fa7c70b95c2e57795dee1c17f33c8cff735238299c20ce5551a9942be54ab952ae942be5ba9dcfd7247563831848c1c3aa080c5e1634ac9c803e64b172e2a5522f21326eb3bed1fa16e4725195cbcddc531486f07bd7e742b931d2e8566af272b9aee77da128b2222b821f1882e0ab5bb55ded028aaa349a0c6a495421e5d6adcb43ab282f0926829ea80955e1bab980ae929d7b77b2ff8ddd9feb22f5e89217e6ba6d807a807ea0d27ac697b066a071b6de1e5aa2e0ae809abc6daeebfedc16e4cbe4d2faca50bd79596fd5755dd7755dd7755d34d7755d2e1a6088a62826a00898d6dc22156c0eab83a997306c3eb773cb8246a3c55a68349abb68937eb3a5a5041260b3cd920683c16e8c46a39568b4ee2c702d75d0a6d0acd460d5721c5769341007608427188608282bbb77b6fdb09a7c3025ad35f960937ee11da126bfa19504134c5630882f206225f26200de493a4faa6251957703a549681e0f3f64ff1d5d60d3dbc9fea7245cb4e63bc29706883f7a17441fb2e09d2223e1e8c5cf095f04247cd23b4dae66f2c14d9a9e128ec76bdc234d9959e6da75a4f9b9d65a6b252f409b524abbfb02fdb7eb064110bc00f74dbbbb3fd20c7b34c7cea15fa77744b3d7f2922757d7284845893e7c1159c485091dbc38c275aec45fd121d7171c1095f1f7744a3349b0c73a5d6716e2063de84276aee8ca3b7d87bfcd0bb0e99dde792393c9ce333c598cd0b1e3c6b382266043c02cccc2603012dc8041e99fb6711b44554217074fec80c765d3423d73b3f2051695b5127d4575ad8622c8fe3c2c25fc3ca2f6e4c6821a10cee3435134e64d5efe83f3e028f025ee431547350d0a219a15a12848c0bd381e8ec5e970ae8ae290387784dba17133f4803b87ec687fec13114ce12c2872c5c19012377b44cdc294b88bc7f258988559988559988575b0cf454b944ea7b2c4d8bb8c4b258c697f36d5f3f186d2a43fef337db95f9ffbcc3ebd8eda5a74ebd84c7ac6b9116c8ee3a27c14fce552459d4e2718601db3dc83051dee7e7ad540c2f3e8d39bba03099ce3b9bbece652f12190745d57f18b15e29ef79eac1d97cf193b799abc60972544abc9a973eeb810fe83574e49a1ddf33cc24312cf57a7b2bc3c63804b5ea9068d19b863f918cfc9e823f5bf50f42459921b4aa4d953d420cdb6a2b5e821544fa18d2da5674032af67ff406b22d26c20a8ad5960d2225cb2d6b39e95bbf7767b8dc63b48aea51fa51fa5f7da182a58465d79f78e5853aa79a16568012fc1f0a3b41c097c60fd1efc5e700004f7f7385ee67cfd9139dec5a92820359c1c20281042444845c55093bf006e62294aa9542a0919eda0b23f5099465926d665adcb5abb049780ca384f0a4a5d13570a72132ae37a5d97ab5a6beb698a30e62530b04965415015cdaa0c025ce98a08076c354ab3451867c07614656badb5a993d310716a41e1ae6eeda0367df68c73d6519d15b975d078a9c3468798fb86db799e475aca1643535cfd0354fbfca4c8a6d8dd7d8a278400777ef1210056e6de51d4c74725dbffa8f85863c8768c21e330cb58c1ef7ab9484b74ddf77ddf2773b9ce663200025aacbd09f1623461705509557927d8cb87259708558527245e7471b2893e4609a8949b6c64e8cce8f193587600e479ee2211934e3148164c1a89c410fcbcee72b69ec21cfaadb5313c74cd1578884584e33e161bb4d6aae3f4ed606b77c7aced3a6b5962a63925db99f90e1bb0bd5c07c3f67242b87b83ea2d6c6268880891a121224343448662a68043e87b6304b871cf39b1768b00656ba42501c64cb676a8aa661c17c80f3da88c8fa0b29a46d9b670d9d211842378740ed92c692c070489eb3879e9251024b756bb48ca56d96ab55aad964fc7bcc76cd683aa46dee36b80ebe32a704ca6b420c0b2153580ae744c07c8012eabe90936db25014a8584b05089cb42cf9d72b3ceda3a45029c04a814ee58d5a854230200000000431500001808080583c17040281c95cdcb7b14800d58723c78603e9ac8c3912c098210043110649c418000000821c620658aaa13bf705a6c5dad22db88c098a5623377a1a3a6f6a3318c2f22a34175d1153c104768a2d3825afce7e2bffc936ebbfe2542095e915443ee03a3e19d6ff77c28b5b458cc2c90df1032a9f68484591eaeb934a9d67411126868a67eff58e5c1bc883fa172ac5851266c26673bcd475529b02399d362d1dc4fdb3cbf87c9992a460a0171076704932df0ed1ae786483d0b517a2e4e3bd41bbd0f7f330d96898005c35a31d3400890b29d8b126f6360eca2bd3278b52c9c7022140f04714bd4f030f5383175e7a6732887f6bf1c6439e645d41489ffaa7b626db219711508568c18fed634e738aaac8de18d7d1d25731501cbb4b1ce088c47eed9532dc163153db9fe6d0de7dc62fab52645deedbe8be5ec4f4c28fa8924f2c60970ce5205f55879789bfe20034a9a81137acb5646050c4b2359dadb8fc9bfc0d75cc038ac27b3384316d4e4c4c126de80e3731db011ac5110fdd0108285ea009c5d60d2cca7ca3e9ea6d55cf788e609300c929b02c63c9c23ce75aec290c358df631d8b3ef3800f46b3802e41226889950005fd45611729a679c32ed6dc8ced67be32142f6570e8f62bf50a96793c85ed8cfcb700b9532dd45c2566f23618818d639362a722abaf7a3a6ccfa4e5741ea0bf4007346ac4bac2326e4bdf40a0539ca97386171dd0f726902884ae0e2cd121973b440e481223fc8166612bb5b34f18b6aaad806c8632758e0ce41b43479385b50b301f6949ff7c4e0cb6389f58ae3d00771e19c3f1d0670e2cddcc46e2c8d7b633a6ffa06e25bda8983a1d11cdb02c66ac82b0ff4465eebb5248c62d009f064e6039d6232b9719f3b42c5208f403a94a77324a8517453500a052d3cc9ead6515ea9f8e6ec770514a66680f08fa4074826c91e96b29067a86c1cddc68b29e637289606898c5af77eab559664ab4a07c39225013269279c79982f20a16eb3307174a74befcf272baf421f08dc5e702932f27e4cab67b4f31a8a005ac74407386da7fff141d420385ec08426440bfb95475fef253dc7538d0400e5adda5f1d5af0a590c5936a77e0bc65bb052905935b659e62420565909a511aa7295597fdb66ee7b576be92c912ef78fb9e64c8fb938c28f302223d1b4ea138cfe428c0a130a006d13fb0575c0766a8e78af23629711360a2fd6f31850f9e06ee03809b1b628133106f834ac779709caf71d86679bc79d6a50eeb7b13506e547a9d626a0380e5e2740b2ee3ae3d393ce341244b090288a378a4ac38c28360eae13975260c2146a01dcc3202649f1681b8c9825ea25b1779a8956b8ff66d97b0659ee1ff19b6cb36e48f400687ffbe2498e22507baa8c35e05c7f2ad6f01b790f1f41ddbd585bc908e13fa9d4886f1c0c7199dcdd09e0604cbbacf7368bbbce14036be99b1b8523b9e83d2f97c80b1331827b4f5f0eb765a43bbeac868fd8b6c0113e54cb80db6f2ac2e94a146cae46ab397d6a9790545be7f2e1dd76ade559804bedd5c66c471582d699768469407c9e698b3ba330e4177c521091ac1fce7e6afe27e16e319c7a7a874abf1aff65efa85b816fb8bc07eb5973fd07bc24af51dd0bac7f2062803cbdc1d23d2686a6ef5442f245f1c56be68f54cd36a52f1329af128d3c4f22caad3c8b0ffdb82057cbf7e73912d99e264de762214eb483363911b909da78a1f49844910fead4afcc9a4beae0c95a8661f4839d639f5990028528a2de2d8e9ef520321474a91a7cec327d4f834a3522d5294931c5dfa19d3841bfe64a8ea1d9156dc99ae825a09f7c2ededfc0ed47d5e430d4995fcc0b50c8a75cb26050a3af881c2dbdf17a0ece1612aa321c344c3e109abf873474bf1a43401bec9ba2059fb67d4460448b10322e4179ea3ffbb00cff3da5ec07bd2d0467e1955143eb00aeac08594582880f84f8346fdde62ad70f4a6721b7498fc030928109bf1f30cac3db6f079c2cc10cc97ee14d153a43f2f5ca582d9f5f4b40807cf0ceb7c749e17325ce9d27d12ba09074a57dfb1b57e18c58d170272502b06d207103a19f02bd987567a7090982945fa8dbe95b371b660404b658b04f586fb237056a2dfbef436733702d960f30cf980723be0bdc5533cc30a4c1ac59a4c3e903e38d57e6843940c3a02351af5041e2fe2e4773b02e8dc3a507322cb62d0a9d921d3a092dbbca4e5a1563efb6f7c49ad58c883577fe0bf7bf09cfad2ea427901550e8a5e5e46eb0143a456bbe3326e9db3f3cbd46f43b86067f0004f589303aef00c864ec88815f789dd0ce8b3149f4e377e3d67818b0086bc4c8035522bd922f23a7d3381ef77429b8a253f67e6524af18786879ad97e95170a35a6bca043302b2f384e0bd4266d56b2592811fa3737b2c7e2329349a226f0785ac3a547de921b3df34d555d259a4f9c40b6b9870dd3f42a029e8b18c81bf6ac6afbba87fdf98c85118431cf034eb3222bc4999b821210ee2bc25290a775b63e0af57f3f28f3989592a03bf3f6f8db9385ca8c849db5a8fc19581872d6a1fa963a62a0a9b7c492091179e376a61fe2cead2e7062f09e5feaaa0802c14069ffe3a2d9654f8ea05f61e1d6cb3eada57603fa250d176ec85999a4b334205a8e03a160aec912ad97ad6c37aae8953de6199bc8b7d13cb60df1f187bc5c45be698f1d1879f85d6be3c1e9e986f0ccbdd9e66fd10b94ccdb1ea1502515fbc1948a5e99b26a48b8d268341222675a69881e8c59d9c065036dea22c0c40d278e29a98cac65a2ca26533cca92f8575b025d52be5dfc7980c5c495306c6e7303a27483cd1ef924226c5e10d6217c035ca510eaa7a62599e0c630caa2f897880fda3147acd938b70590422039671f0572ed8d122eea3a45ee46ad735e3fa40ea11522adad96ed89981bda036d239fd80a927ed5177def3c2e2913e03057265966739d347fc2517341ebc898969d304e6dd8ccbb4bb72677edc81f0c7f4059156f85c9d1b25a00b367dab894a5a92bad70b8ad9ba2829fd772b8703fc5d8d0b07b14da09a0140815322fd4ad7b315bb5a18c25a142423eebd4e9155e1109185649c7b7cf11139e7d6bc478f0db38a6a2d237d9294d5307616fb04dd251af48e8a2c940e9907bd032b35ba0414d87785ef4d09bf85a92bfd3969cb23e6a62614a73ac2dfe0db260fe63637f90fc2bef5d18a4e3e0023b5689dca9150ea81d19538127de33f5756a913a9e74046f49b2265eb7dc74ac6738bdb525e8c6eabc806a96b8504bf71d6b674c84330837652ef3f52616ba75e114c1065342aac8fcb8952fa5f779e9aad969bce933ab13c60bc321eb51fcc97066d2d6411bf1b65135724055f7a1611d356562f0ee1bf0fd093d2a943cd031d1d1123dad560324fde4a4a1305ef45de4436ed2997f1b0169c033fc3e9302df86e8b1ee1287ad25091d284a5bebe60f73014230fc19714dcc43ac215e447f883731411cf6b249c6328e1520516c91007b40b4cd7ddea03152ebdc55b29e6c22523ab53118ba736f00009637a78a502147ce1ac669069a97a74718adbdc6819c0404087217ec4bd4ca723a779724d6ae8f08aad16f83ac9572bc817ad5056ed105ef4d02fff413ecfe50c93d900b981a697f1a4ec78347bcf4e4e7a35efbfc422e8b3637952e919150cb4449ee1eee36952c5dc079bb148ff648a3a28f98ce137d5347a36c6a864a256c47bbc871adefb7055a497ce7aa4dc5ce685a093248a5ea1cadd9f7cb48dfcd40e687385081594793df39ef8538ca7978cb95848bc565bcc8003b5b5d3255a5da8c23a09f39f24d458358d1719c5c90fa30e17023688bc686112fa786564ce2ea86987917a377640883a6650821666d59407b3e2d8517a84023b82312801e40a55b14c317e2031ac5946a56de70849cc232401c76399c8b61d1465f091e518847163dd028bb091a1edf0c65b4f2f6bf54b58843fd22507c4b748b4268bd977fbd7eb3d7777eaf2c89a5fdf6574450178c740220f217fe8b4130214342a21ccfb63df3800254680115fa62a3e7c2b5a987723cd6917e7aaef8e9a5ae5a84bdf59fa5da285ca583c9dfc97603d1d240eeb9c6ff62acc51d7848b5dbdf2d215dfa7aaa32d24479557165b5e3983052dd66d10d14f05d7aa4040ac1aed8ea4b3893d0455872e9b8559cf5fcfa0425a22d651668bf7bfadc5744540b53b920edbeeb8f715856ddc7648ec3c8c8d5bbe97242b54fbcdc7b433dea3024088a0c9ab3589dfe14104f49c31adc2453e3fea170451b1685ae8ec4d6b930616f79e760884d1a1d45ea0254f2cd5dd97938349200210342eb4ec6f1e2bf3b1db83014d7546d15546d84bdb441ac39ca7fb30b7e8ecd6e4a3297d8a9ec14dfaaa71e4f36d3bb16337598d493e7b06d9c97f884d4c89fac91b98bbbec873a2a188353627538d889022036ee63ed84e2637f93b60c587b8cf1c0c84f466e23e537e67b943889fa4656db3cbb1820ceca6c564321403d106fdbc9d3c36bbd8c7105726b18d4ccff379f0e33800718fb88f86d6208742ab4711eb424f57f420b293dbb8577b44f3312e1fe18f003875f19458632907e611e892f62d47593f3607646412ef6695311b370717d9f927a5f538588b4158d441b11b89b97d7b60e972a88fa50562d1c6344836b2c39a2c7ab13af38d8e099f324e4dd35f2e3c7e88cda082d826e2522f50542560a84d95de0b0979939d3da47233b60fc268fabb564543e8b7e24c35fa5930bc3a9750fe650e5c3da6999f2f3bbc42a56983c5d7b1c9565c37c41f430644facc9c13f0c669b2d0f67324a1479ae2e995c2dafe3054add67084283a7e6733c5a876907ee666f62b3b32dc08a06875d793c0b0804f4279d3b7709a3a4c3d583e62001195c95968b076ab0f8e4fd7a1745c7077fab38a0a6751ca2eef2c38d3c19fc8296ae8f4342ccb8e5b0b8e5d3c633814e3aef0bac145414f0dc168432201aa1609de54c0b59392e2f6e78aa00bb669d27df3f6a75cba787152b33a4236cf9861076d8ad855587f9a0c5fe432f93fe8247d64b87d3bcb580cae65acdd632810685ac2de28be8a8aadd674b13106f4ef17b7db03729a2a5c856986b5486827d4080c20f4c6e75d32a0a4ac95236a76ea281c8b779595a6658139c96516184ae02bd609fb20353a30300222fa4a21032013f4ab221ca5f0619330d0554a5937828f8e1777f1504187f69630c836c4c52bf62ef4d909d05fed669ca32266b7ee9ef30a2427005514b151d47c24aef4ed72b7234580cff4390f6a5770e8ab67b3a431ea53672b1eb5fa66fcf0b4d4d364a19e21d85035297fbd6a348c550715b53a78764476826e281614d53b30cbe80fc89578f6c94abd4fc5dcfdacdc0d70da1d06f70828467b3f38397f0bec71ed8f5abd0ddcd8bfe59ab895911f925a4852cbea2bbaaa2fe5ae5667dc0a03595e99918f51419fea338b99788a9472f0664724eb0709c1f425ed4b7b8acd77b02194f7afb41cc8440962dc2121851546e92292eeaa9605f8ec839c41aa3c8499a6cfc9ff103e7b48bbce50fe9f83214e6b3282a8d5dd213aee007e0008e33ceac2f9a461fdb4e46605e483b88464c8bed6b4e737f58966df42d5f29defc3764d0bdbc169ee8070c6b9b64f42d324589388e82e662d2cd0b302f20d1a4e5e8a11b7f1cd6267eb224a4d155ace38315a196516aa7f9550a5e5faa944ea81f44daa696c131006b7be4cf5e9b020c3f55e10b0ebfa12c70243f525c0d92c7aed956e8f33f1b314d2ad78eaf87e7d6499eb3839869abcb6739a6139aa0cb13abec3ee3f8d37752f673f581217c935e1979753f794045cbc4185267ecd642469b50d716239e83603f844624c77814514612df59e0f5938fb788bae19a122876a376cbe0555a2c9ceb3a236a32b6a1700e7aec2dce9399880db3a50d4484576283265393a518246513e0bea953a22c6de275be50ea1fc6159fe69184b7ed4136b840b6ed202cd3d8b6a62b246f1ae7d646f9aa5a16882965749e56368fc9edd839c4fe829cae16c3ab8754d9f13a413bb132d5178a34f745a3908d6ad243455327b78b13e56d86c34118cfa83fcc7b0894e341802b0e20a2562e9ff323ea46b0aa10ce41f7bc71b074bd3a36385440820c373192663fde549ec3d0e150be1b984bfbcc514d3826e7c526ddd60b1c4908e892d14d4885d7422b4794e92186f3b34beeadb47afbb28282a69d82440620ee1ad76389a9f762c960b34e74133fe6bfe8c6ef57545e202f3ff8bc13bea1dbd2e848780ea603537bebbbcfe1569169c6c15ca364104371b309c3ae166d71c28ac616014429a302118e2f75680e5ea28225a93c61205e0aa25ba4ec6eda0c304e259bbfb272fcb9f10be6563462ad47c97addf0795eb4099db049e5273577e3a5618a1424eff6447bc0d736638d3e2563413572312271b1fcb412ec090efc0c6a8cfe809fcd0c0220cc9e3687b1f895af5900431e7d6514129f26b31e2e14b1f278aeb315f216a57f74ddef4ef7db17b128f6706b7545765d8b71a3ff25474eb29a10d20478d8300cd0835186c96a73b63480a527163bc39d3df33e3aca1b5946712b007000bedb4663dc7e2df183ccb80e5ee1f687af76c55a5d01290c26b29a7002eec1f615fd73f76079d8eb4fe61adfd09a6be9d54b4e930a4839e5b051348aaedde5ac14493e59f5cf30f0d32b3f5aad0df3ae07cc747786be58ccd7bb95e258f39001c3a8a7e6dc5ac5fc82af9c7c3d2ada7a44479bc364225d6b0077343481552973a5edf57c286c13f945e5850e60e8e0ecbce4d039be5af8f630f7d367a6073f7f3d97a824d17cd67731ed80cdef60721f2cfe4d246a3fd34817e73d07536a7d111f326c37339692fe5e520e05cc0c6edc40b0659dcf8341347c4d9dbd54019c63283a29cb8af3ec30e63203546503e90ce9dde7157537b816192990c5c00d33ef7c6a7bd517c77f6ad02560e399654e4cf55a7c188778e2cc5697fc2b5c575f322d5211aee0135ada63647a6b5c7b8af870da080db40cba4212d194a18a6aed3170d3c2a21f0b9db2e14f5cd6aabc1726efb60a3c6327c5a77dac640d9e895cf1940c499313e662f2a43e6a4ff152fd7a32de4775b963d4160e0da99cffd34d1b27028cf367c94706f0a91be8327ddf26c635367dcccc5f51d60cdf22a1fc9f43d602a011730145a809c2b22f7d01589c5d1dd670aa10e4526d5fa38ec5114511a6de7145401c8282a00dfb8c2041743e16da31985d26004dd19eaa3991018b0c2af7f4cf686ad3860062837dc766de27498eab805ee854faefeaa5b63d1a93efc8c952c36f9a6eb7f1e4d123394e660a442155e0bfbbfb010e99701650ec1c1e0633b3dad68497e81379e6dc09e94ff47442db238e123f1072faf82cb7c9cf70a50c9ae7e000723f96bcb39a472b86a0efd7523086c0d42492ceec02e09055b3fc44e3d8a24ec5e2144eb84a3db2a3ad4faee7436d25f04c90c322ffff01e98bfedf3e45e8c4241a442a8f88bc46367ccba8681c9d5c5deace38c2db106849b850ed09f4e84dcd46f53152718f39d59aa92b59d8f5c495520229e2fd7c887987516917b597d05410a9c1bf3196d4754290dc10ef8bf85a177164b68e35e6bd0d2056999a635aa290116d8a527e43be74b1304c677e48381e00637acc18e8b85ab8646407a6dc19e0b6bf6164ba5ebf82750c692a499d2e96bdb87684dbd282e19da62dd78c90b9ce42c5f163031ab29e0741b360caf538141083b5c05df37bef170ce5a2de75e4223048983c2bd052ccdd4c8f9679036768acd31d29fdd605f5b206b76b693d29ae1cfaac06d6dd2f0d44d701eaf172c337c2354e9e6b0360ea6d37467c9994bac92ea98a389edb00331c1580e80e62e7726836a9e1f83551b17f41c557d90317b03c41d8f03c413e9007195d90162208059faba2f7b977285250ed0aa5c27375a19e1da187f418c19a2751a75a7e0604f134247c1c4661aef6794fa2996e4a6fb94d8c53fc82be467462525af326784ef90faa2ce1615de27c7e3f03e4e0557749333ba788bef65272ae887a7e5c6e8846a2b5901128d09432ba2c3caa533e573e4243ec579f46ce4f5ad31e26f317883110651596c62ed61510be3513edba732bed07e868e15c0e67903762c1fb166996fd85c81c0ceca59aa6456e236ed25d497fed121ecb041d19f8d3b4283b4142a14be3435b18884b190cd09828de3eff88a833eca34cc1cf6c09ac1dae1b5a0106c7f48b0659e682678d7ebf55c58971b0b3332401932fe3f2b407ca67b6f574b29f65f6bd1f8ca41e7bc7fc697ee3756784c79d5fca94a095b8b8c5e54b3a3564ec11db58946f47685c70f000b063bd4269db2b1169ca547a3a7d69283fba83c9538172b73212c4cc421ffdfb09026b402ed5145cd0eda4d3085df0901ab67391672fb2da8b48c32a4ea815fd36952c0ebada2fa5ef6e3496f44cf4949f6da162ec22d944f6dc0013aeaaebe4c383b29c7bbbdab5558e69fb57e44f115e1b944fc109bf3813f391dffd02b3f4e5becde14d5406a0dcbab16f90602924161af444ccaccdae966f28b6668a6336ea85f816d1cdab1d0b5503ea8d48e5a62b3d9fe4fdee87bf773f8e52e5b54fe16c14faf0520719c4a963ac198575077ede27068216e67a1ac8051dd105b11f2dd90778f7acd29b2a2835713dbbe560cb41fe1d58f08af4bcca961310510ce5cd4da59bc88c3f857bb2dd1118df44f548b74aa840674b39194637673ffcf695a25ee0c55121e527127fbf9ad7f6e2419045e8fde1c9a1482903ddb1a305d6110073334f1b1a8af7a5dbf7078e84c02091eb2e9d5901c9ce623cc4de9b6b89ad9376bc3e7ac47ba00dbc7221b30c26af594859dfa588461e190f564f798199b460bdcf2cdc4bc18b5a4b3d165dcef88b4962c64a213895c2888c493b1e0115bec5e6ae03c84e4dfc344ecdd73ad7495eb6a2b8cce05145ecb1042e73c10fcb69bfa0a215c87e0a3086de234164f2410452ceae6db4e51c7aa97b65280139bb2e6a87a9d19e9003a49b20374188ef4e512c5b9b5ddc82c15c9949c25a0531a658163bf1abb3b7f402df716cc8e516b9db0513c85d8838f89fdd627850d349831f1a2c52899dc40e4af192ea69a32dcc4604e33864ae8159afc838327c43c5d4e2c1e2c52ebe2d421301756e3403b838c1545a1992a775b7c69741199522e579116f1dec501a9219bbff8b339543e4d0de4cca1ce4c954c821a7a59c3d0bc79f4673850b9629888436b9f9d0501217f0ddbd4ad2a777919e4ccece7bce59f5e29fae61a162b8fd79e609a68f50cdc598a3bd8c3fceecf706ea3f8f5b930d1c11ada999fa0701f98e26f93621c4230d3858b9b640a462858bd06c05e22c5cdcb9f935ae59893abcb8a54f80a022e877d866c5bb39575d67ff5a8592282c530a9258b50f82c16e1b91034038d386cb3f0b0d2bcc8f458d4a236892860f53f16c566da3b936bc2ae3aa7b74066338f8083e34b2842688b7288ec66de90f3003fff081826e5bc2b7853be7efc7a31ce94cdaf94d3c45a40ca88e1a516e4524fef5224052b3226e494c2c31e2999e601fb37f480527628733f52eaef05ea717ce18e988937693c5be5390cf7e0e2263ffe14c28d7dfa5c4df206366a72c8893e615d451a7a9dbb03cca3c1e1d636dbb163d5b12aa0e3a6050a0aa513a59dd753f9a3cd641f50b2c546c5fa2fd3ad7a596cf6e86f20e00678c8ed5e38ed30e370c5a5b3424e6402dbc6bf27ee28ba69a90d101a5a2a83c8e3ffa043bdf6caf5040df82b1c8adcc58b7693e6330e858cfeb67a580825bdd71a39d1fb3f8a48b1a6702b31ca5febae7dd43632394ae00c3735fc6ee4ba161b164ad6126172c46742f9bbb773801e566440af01226a498ad047d85cd07923b0fbf21615f69ce4b4ca1a2300c26e711140097ec1782bf40ce4d5c04743f5f746c01b43d6792dc06200fca5d641a81dfca96f41085f80102b6b5986bfb9b3919171c52b53351601e6429f371be69497fee19df083f4095654d899de0273ccdcb88de1fc63b4b7815c08a552b41219fb5bb2db161348429ffe5cc80b138f6fe46118a7e8a9f978e75d347e4f2717791e4e8836b7bc0e2be1af36f9e398834d0b00fa594be5d5076d568ab04d67224e5ed0fed372d8a6e651ec4250744a39ba7213e5f6153ab7daf6e207bbcb0b0ee199f0f50900a9805022595685642f5ab339998838ac7f81cee51efa74a64485d813221addecd3eba7a3df7846a3c1837748f16109d91715bf45ca38eff5bec26f4f6c5a3d0091257cb85b2e7fe0a19933d6a02b68677782f76063908d803720373b9c61f639a7b36012a8c788b6ed1483b0a0458e0043556eae03aaa6bd2124b8eb0319c26e04d857aab0bb86a20e8703cc44be071eea5c2b77e0a02a2b45843c4a48f34e402846153accb657d56608b723837cdc831fb3b63265b8eabc75d52b1e448679215fbfff7e26e566b410ca25b6a5b15b4f28815d38d72365deeae5a9b0e1d0680e1cc2a32b2b5fcaca0d60310c570b157538c00a54f38718654dd655b52f32afdc6322e644b88720364d4c51447bf63a5653c66027cb6810f9994c14485bdf04ed6918789db8360d2672c28fb01f2d8242cf19aeefeebef191a8bdd091fd984df01604590b98118ef1013518a4e761ae379898ba454fe17267012201feef9e0b0a251207ed7c3f1478a39ac4a0c84a719ef6e275630701458d32de7aa001117bfdcb7bdc14e8248ef7a8a6d933e8d6f5941b0d2e8a14743bf153750097cdf9b90f411e3138c27f15ccf6f83d31a528e838afb256be247b6603463b81007dd85866172e48886dac0e484173021b498073238acb0b542795dc65f74671012bafc01ac26b6d7a3e9a2d8b40f7ec36b3dd78e8d51afa6ba38b405afc4efd6d2c9618bf33d4ddd85b84fe3d7368bdc7dd73853a20b3be01af3f32cef9b804bfd1a4315e4831cb44c39e9d4aff32ce659167bbc2d20630ff2c70d2990508b84911f94c61df69f6ac0c11b5ed02d149c20fe9227a79ade4b44d57199c5c4c5b539dfd7d3518ba5bf4854e55f30b639e1b6a9adc5475984eaf7e7d53e038ec82c689f04aff91085c55938c50c8ba0ad1893df7d07a1a3e7f08d1f214a6d221fd4955d53fb849087373493882536fc3851c14c0e101136d5c8cce421f6e60df6074c7c11074c3913645337f65a1d7d1c917cf815520f0475b23add58dc31186bd5824ea98e5ac81da492a1391b40e4d04f8e03f159c969fd314c5fc29ada2f37281368dc3ddc6f4ffe8dd57c0540c5962e4058a9f0abaacc07e70e9150abff587682d35450c0de4ee590647e849c600164dc3be3a0591a4ead703c431ec1cd9f9e08ea5c60aa9109f6d08288b6376580ee0d83aacdd98b63c7bcfdcf431ef77cec3c96f8461ccc31abb697645cc3ef0fa7d43a464828a2d46cfd251695be17ea2c41ed63f350b446e4aa34fa11efad0e893690919d5d2bca8034aa0d4826e0b5204d4853ca4062af576c386d4d5981557a95dd6516d8ab718bfa9e96415810531dd8c58b03658032848d172712274e25477e2ab31d0f0e5011b26b082e7e94d002c61dddc214a26a89e3a700c8e25b2a04b5d990ca7a0864df46f536a2d9c94b0b62e2af3eebb776147456eb1b5ff0b623bb0c4d120d823a2847e5810a474d43ac9aa4ded13f8e4e40012eb9c0dab2843ab8ab0060bd66f7c2b3d0fbcd18f5f5c6863b5bc923fc1b8c198278d335c395713848efa23af37edcf6e0743cacbd17f95fb1f9b58a4f524392f64d2ca44d6ee9a2e2806ff3d3f8f14933f853c82aeadb3c7aed4fadb5ea7ccc0b44daee0b262c4ad1153495d8e847152f48818e04c73b06d60feb604d7e3f106e313904594714570ccdf0b682a9aa030a5215d70c1a6779e0854aefa6fd6e7e099f42ee2d27ab04fa8af92c9e480c5950a48060decc2a548b66b03fcbdbfe1e389eca34cafc063a7af0f621fee86db2cdbae0c752553fba6fa716b2b737f92a0360308d29f31d26cf78f19963069fd8cd354aca84e0c3b90df89968b0fe475001c211fa194bd52f3ade60a656276fcfafbab910ce5968c951854c78da1549d24ed265d3fb413c46ee397b2bcf345fb192b82d77a1b9fde4513fe6971cc0d926d6e7093eaa03f789dbefafa6fecff746158fa3455beeb033d7cb3cdb394afe7a5a9e97892c3038dc7cd1ee322868e0efa8253c1eb393ec78b2d2fa3ff26501053972aa1867015413a2b8227a16a4890c90cc8d0232dc8f8089b228c8a9210ce52608d6f471e9a8c0cce73219a014e4d85a592e8d2a090beda6bf692733deaa5fa6ff07ad4bd5cf1675388cd4131b2242d9b410db5d1f48dc3572bcb09fa9bff5267fd851128a82bacdeeeeabf398587bf719f1984b46d8c3d499526ce4e2c7bc39ed6736681bd02981c5c1c301c8ccad3f6994925c147850c7a8c8cb3cd42faf32616441af70132f3e563a4d110f6e3b65e6bbdccd18eaed3e722a06a7cabfbe9c82e955d7b7a24f0a49221357df85b910fea2f0a7decfd6666025c0b946bca39afb950a94be5b298e6a3a8f384c641393fd0ea097d441ce48e2c06e9d01b69d6c21eb2febf2da391c097c187f5da19f70fbe89d30788f6458c7c50ff7278b892a88af383eec6d5d153a49b480acbc88040c9888ec9d71a7d523b8f206ba309caef62e6c5e3bc22765c33de380eea6844c8e7dd4b20592c68160bd5c4c32e8bc0c39136624d252b162dcc0c5ac414acfcefdb3f8774d1a224f687a57bf447f441f05244af12178d44fd425a908b76160ff818968e134f68ecccb8704a03aba54d3ff4855ebf0572fc857adbdc6c61be30d56e2540876d6d64400cc7be75190dd2bc4988c2cd36a666a2669c10b46bc4f5af360ab3f41ce42fe146ecc758252729b0c1b1ceb831f69db59eaba8648e2080c5511610542dbbd77994772c92958ad6a5fa800a882d6f20ee949c5825120a72ea4f23761478e797c96538668fa4dce7afd42fc08cb6509364a9e2fe5e4f5713deee5de37aeba9068f2bf09aa12a0c760a401c3f6076c43b3f5ab0b8a3ed0f1d340cd311ea98b88544949097969e170310b3212d69eaf382f56ce9e63b50821acfadcdfc8326bfc0d9b1118a6b7c3381526ec92306075c4bb438d5a61e9914e84816c12548ff65e373d66f5c300f185b9703442847fcf6983e54431c0c765eff5477592e18fbb08824d057167a9b9c23774e6cf6c4957af3e10ee0eb4ceedb54e304f02e9422652b626b7917802fe1f90724777c435b222429b6a87ec37b6d02b031c31702a058b100e8a3c0f2c95c6ea662185d086795e794b860a11f4819e9b30410369263e3d580ac981b6d1fd7f6a4283214020241cef76cd504ba9d05cfd0d4d2a20eada968cf6ca0cb6254dd4666c0fec0300cf0288ad8c9d24a35ba0791957fee94543cc4e410b2f6cb0917f11821e40648c86e5fff76bd07c41d6d5864aa2b0888eb378864c67223c30f7152f39635cf5ea0e564ff94d954c67adf18fe0c4f36fa45c84e61726e59612f6dac8b2b28a74d0b4956d263355f0df8c3b29902bd703dd91060b77510816bd64503577ae2036d5657d9c25a568a5e64aef83bad8200cd426de6e4e9c29252f18b02de8333d1acc522d06b3ae3462afb9163664c8523542f098531ec0d761438c141e00ba5abebcfdbb72175cbb513885099c524469afc67d83a638141d254c997f800f50dac10774ad816a84b53f0dbc8b5480a06b02148f0efc09d43dfb445bef7a3a8de6199609429820be5704896916c78811411d13feb11865b1e31d0437f3ea78b957c4a23e05ed055c532a501bd470d862bf6bd6141a2357405d31a454e16c91471102ded32197297cfc596ae564183d50cc5a2c24f5008ac33cb79909d055287c6c0641fb959d127cc03a6547624cbd9e913faf9b9e377145077014b151d492a3628509285d434c92e9489313264c74822dd25a83ab9a1b26d89641f8abb7def2d3d82c564cae0ed9f6be59cb7916c3ad68b7055f9aa3087c9922b47d9e4f042c31a2af0ae02d80e65fc975637ce44aee2754377364cd4a635ae4582c8521b8cd9c10a15aa029417c601a6c93cbe2eec6e2fd4e25cb6a635aca3bc81b33bd2021130e75e98aa2c67ee2c4d7bac72df93a3081d9384273b4076e18ca79b57ab6b17687d8755090de434e802b70d34d500bece1b3f62bdd9f5949b3d3254393d6aff7e0bbe9591845c84e7992401c8efa4ba0d9678de73f5147ea045824f83a63c042638b3b1110d436ceeee59e27e18118badaeecef96ffeb54deef939436407013861922db8701c1efeba06011a26e4d91df2ea4697b60c356b05d48d6907c2abc2a300cf810a21e3a23ed908c98a27322934826142179411e1d1181f0daa852be0153c5c8d9da7c31adcbe17841c58602278ff04ad44725e2f4969adca9fdb987ead7dcbae7eb88e1674b8fc742a4d480c9ecd321654c493d6d502ea097a831cb1b99599cff572968302363174741d7a4be302664d7232808a32befa828959a620a949a997d89a92a4dc999214c823a24ebb29e31d1a98548a4fc6d97f7b93219dff2e2530db4961da26348165bd69068f1501a6d499755fa09f09ed9b3a2daa585a230aa9b5eb265a65facd0e54866120507189120a9b825614627944e9e4aded1dc52e239706c4d35b0def6e07a5bc65916a3e8357d93eca13b3d74b4086ee2e4c9fe7eb071cee5f102d891521a052e863fdf3edd3f7163fc6a311827e782b0fc74f8b3df6240662d14eed39d75c01e01a3ae2231ad5683888197088a24db85be9bbd2edb758b886503c0a4406bf7d121c0cf463d84683f15b73e42f076de7bc727ddd709a22e81deec5e0df17b0b18c6a8834183eed5f66a21e73ed28c449751da97cee4e3b7508d3d5e7d2a3dc381ed8108021fba1ffcc3f80e846148bad2088fef82b5112eeccd5e25f6e6625024354ae0eed99d0994c6fe2f9c7fc345996ec3b27ec8a02e226a7d9c5067456e191907fa2768a4620071f2e853e0d05741c32e44ef8e62ddcc7b9e0aa0f3da920e28b551d600fccabac681179ef138c57648173bfe4bf897d120f957df91ca8c996be51f3ee3f05fee256168af5784a9b3c5af3b92a398243d5559aeb118a835aa81d8bce8b6a712d6a3e45b0d82ef3ee5ab9c7e7b6190fd9e3081a8254a0f5642cba578fbdc9e4502cd0c4fde74a8836af0dd72e45f920a1b4733ef6d4f6a5d4c265d4f4f2a6c95e29b46a4bd8cb213d23e9f149b248c229a68a8652c7514b9d7e7590ec22d4bcecf0463981b8460f7015fbe21a8adb461dac7c9f24ac163c1a89912436b8f7feac75156b74d8548eba97c07ef5c6bffda59059a29f5ef11569eab05ec7c9f836f0b24250973c936328d5aee0342c2e214f9ef61379ec3bd79c434b8fc58f20596e994a2c261a4f1a35822ea07847fe1f3210cf508b29124319a715b3161821b4b6ecf1f990620ad8f4294ac39de00b6dc75358dc2aed25e700b6d867b13421620f1a84b682e47f1617b3bbd4203047258bfc66c0384fd9027a576beca8b3d1c20e43bcb9ded4f72cfcc1d4f83d14874c092a01b50064804d199a9e6dd6a80b8d8dfea085f2a47c4541a0c60e801dccfa4815876b57da459c29906931f49e506b415f71e9d445ebb4ed902196bd17c37bb39efe60678937c7be7e506805210edeff7bbad3485cc33dc47d987d8754a75455c71d49965eaba9bf6ecd64d802be649953b2c18da6f984a7689c6a64d34443575b06cbd50376eaf5cbe4337ffe000d5468f05a43481f0ef0ee2de08f08e22d0efac5ecdba667f2104173f391bc24d2bf7b180b088502c2976b6be88bdd6641771ab52655563f81f203f893d7e8b96db64f7b55af26716c28f0e71cf0cb8ce6c14cf4c663770bf2c17523d0769ad42844f93afae80c0f82759be337709dbca8eebf1fc7b5f2b142ddd92d51c01f34d4a837ab63b84d23f00a78a26d9f018c4a712ac995d13aae35e559fbfbc70519fcf184f037404a41422866d62b6371956421a8942d6731aebfd85155c9e9726ef9ba508a66c51b3ff4e04b4833200cef0b01a0320b0fa3b806536c447ca3256d7a9e13316590b8e1703f34dd42163205048e45c114714906df18fb41e50d5f8505eeccab1671b37389fc470946729c2ffaf7d3df0d522ad6d848d203efc460560017207afd7c063412b99db0c8411d0664e04f9a8e0009d0f11c75c15d3d1340cca654c37a67e85cf2dcb4c0fad857880a2f95845e4dcb9e07c80970b4ac0b31198ab440cbe434d6def2396f54c8c3bab1409f8b2e8c813d5ace080cbf6f3d8f6dddce7b27b3cb618d12dc0546a610851bbbe54cc8dab9f68c81d451e2d0977f53393f801d34c60c8cc902aee88edd6b6db5782d7f79d0e4a07ed3dafb12f7e6b940247f4c8118e92aa75a5f24db01967816224ef18beaa719df91945b023185f6998f280bee65a249e67e0f3fe0a3705a814f5dcb4d58ec5241bdd4863f94be225c029bc77db28f81117cc800b6dd2e453bb947d4498b99ddae886f3f0551ec1da33daea909f178a88463a98b5c0463fe4a06781832d300a03e7245eeb1ec58a8d559d0d575019397d8e06001c2c809c3f7229bc1cbf090a0cb91209f3ea63b601250b3df6928af8873b9b3634977cc89fdbf3b709b4a3522c4234a900cad40e8b16a5e3f0986453934c3552cf982519ebde911a7347a5c0e0e2febf5d701371b648cb1f050fd76929f9f78cc32115729e17ac490678585b0bf56c2d11594d7e079d24d673a1bd468cccf4566beb002e68765f1866680566479f292ab316f58cda68f46845d76f2f28696c37c43717c6cd72ce4237283d9c3046f1a303b6d3529019cea1539af49dd1b7a66f00619f20766e350acc6cda40890b3c76932df171ec221941823a0325fff950b4639f61baed4d888bcbb7aa1a96d740c260e0f2a12a56d6d40efe78f9d05d30d631594fb4eba439cdaee3edfac8c462f8557ee4fc5583b9831a58237472990ec667d5945f8e8d1292a073d3cbd79f9c5c667717764ca8250a53350214a182402de4ebe849c7efb9093370021b19434d7f48cd7e597c1ce713f3fc2b6fff0bc8fc635dbb2a41826ba83823c61b0f5a8bd1ee2f38b009d09947799ed81ad5bf1bf72863d5e4afbfa05ba6c9fa16676c7669946db4baa581e4ec6ad75e25676561e5d5fa09c943a332bd902815181524eb31afb1fb41c8be2b0bbd83e0db45092d13e757a4f9e9b9ab4e28a9ecae633acbcdc8a0cb54e621b0c859d515e8547dca2643ae52d6c0e52e7d1b50c4a373c65839342eceb475feb485c48a0736af7edcb3a3421f6c3356f0a24eb5ee12272746ced06cc6991c162fbfdbae22c2bbbe953a0628601e213b98752502415c56e4adf4195cf317220e4002e534a96751bf1c11d615654d25ed91731668027ae5ae329b557db508f39ca76adf07216d3e9eae9a840c8a03dbb0ea3bc3526f976fe18618e7e1757da2453d04481a0d74829ae7514782558d481093ece7c28610343ddbf2db6e7c28c6f956084bead09bf1fe808973f212d89135af9b51b85ac2591074d419d59ca0ea6e7b71dd6cbec9f4bf2fb86153f60a21a9ae95b2bac27ed31d99aa7cb35adec7c04452359742882b3d27bfbd7187029dd8e22f87300ec64bac9397966173087df6d5d4e40df25db02a4d18ccb9fc804f126d30922a75cc32584bdc50780fad0467690e650832b41f32f744f97dcf177d20db9cc679d3e4eb995dd276197991e63dc18470da7f0cb5dc792fafd6886c123b2cca887fde0be0363f8bb6380f95d97401ca6780aaa7ed64fddbaf743c1d859a0d8d8ff77cbb3599054b1e03cc36f491ee5b436f3ff2da03b4d8aa752a97a6ab782937e3b8950183b6369d41a16a1fb8ea1c556127cf4586697541913eec6ea171f4d868df039853d2f24de3a12fe916eb4557519f43a2c1d42512125b191914f777ad3b04144fbf37115575b9150a99648cb5fc4a24e158d824b5d834c31609d4d75286621390dce830cdcc52b4449a3bf85ebe3e49674dd8939608b67c048d83961cc0965a09534bfce70bffc1ee61532fa3b4ac66b592d96507ebaea84943c9db7252c1a0268aa90b4149feda79958584f46cef0eefcbb2dece7b43e6a46e3a81e0e1faee055e9a5338e29d52fe07f26b1061d320279ee2dbb4c64b61112b2ea41045a5874070d9e8c84e96a44226a74ced95125ecd52a240bd8fb3769259ef44774d67cb6d3687907760d61116589f2f380fb7bd30c30fd2d04a8a18a3397837d40310b124d65152ff2efd32b8333267c27386ae34e0b25cf3e05a4b191654fab2b6c4c7547b3861345f9705dc193d14d44e4cb0a258506f69d961ba066ba59092c88408dd51513a51a5b7e597f2c5823c54ad329afc12a1913fd4260f4f57ea182988f94485fc5dec8805c1dfe3ad7a2d4f44e08308444a6b274167de0a633846de458ae62b0845acaefbc0ab63b111f77828c929a69750dc373bd38bed10dcbbd2ebe3ec815631a08b7035b9cf9375c9ac01f03be132a981c54d83510a3095ca510fdad44521ac6b5537b32fb0e807701ccf50c23b03c3d2007b9b4f4a8bcb3cc35b53d6f11b6ee990f5565cd447012c2c82adaa2056240ac01f8f7c9740dbbc8aad378efa8791739673ad57fe81018baea36ebdca2b480605ee282a77756e854e2421d2038ee388f670a7e59071bf21682e6280b164ac8a018b8b4f579ca17642bd358ba48945f5c4550b8bc5449781e9c3e3188c36c1b4db92de83af4f609c5cd3da394681018e6094aa8538cf4c5ee09a6c2cd6343dfe45e01c08d188c589abe72044888e7dd8843690e58cfb0370ff1fe3e1ba0a65c442935e7cf107d97ed8ddfba438d3c2e26e7980117d37824961a8220f20d90e3ec3854c497dc7270d0d404d99758ba3443d0dddca5f6089e5bd44d4ef1ea11270f24b2d44f61558915f678bcc18fe17632313926870af867c288dcab29ac9c82a41eec7dff35d105138a332889a2a86e9dcf8cd6dc13b59b3207e9a2db4d53dd91a2f31df2b6ad0002c010b91a1d788fc01b98d164698ef31ade63814747af618a5338b463044407817e67baff326d57500e317366f8407cdd288f91e3630fb4e8909d24068c798efdf73057b8fe6ef4ceb4eaaf2d5b2fb8ec240e4730230624d41041a3a3d23a12d1beb0d2ae67ba430ac496fa19f1bc1bdf5c301f6d61033c5ff65c4ae0b3903c61c2933564bf33decc903388f3ba210a4e9b018ac5b2e14ac9a99a54370c01d7cdab026a99d2691042c4586a5fbb7fd944a408d0acdb49630f02429092ed219dd45eb1fb3602c1a2b42e667eb7d14dbfaf75609553fd38fb321cfe079a6d8a82bcdc9a87dae3e1682f37da6d4328a24a0d18ce7a547687669a6fd25c87f2cb20262bc10448120c65e4b8158616b270e97b40142f7d3ecbd699be4100ec0c2527e7f3b7b41a3a43bacd347159ad1bf2e7db56a332a8f9c11ff5ff3492ca83dc5a3b75ab2db3ce890d2c3a10a90c7604f7b54e120026110b4154bef2a9f27ee76a51c74ffea3afdff6df904e7e620db6a0f1b5ed86f96e2110fed113b3350425224aab16d2ad72d5e2478804c2644daf054a6af17a12d23117d0e7a01694df6ae309d4395f81b4e48a4dd85b7a67e8b2f8ff80555d6d98b046f45794490016d360de811cf0fccd2233f30a15a9632413b6ef80e4486d7fdc0117e25ecca97e770bececfed6f469c62f589f0c5e3da24d2223b4367c6e7c95ac95ed75dcb489a87932c02d9029ec01937b6549c358fcff0ca7547db2e77b04ad746008f33c5641e550cf11556e4b251b037208165bd18961f76dbdb79617931b3e70b3fd7046da3ce3f7b60ada3df53cc9ff649c7c2986c92feb42f608d24aa1b923bf689dd43e677a5e118115a2e48a4945f0f57e9e400601342903e3dfc589b0e507a088e4a0ef708f91f10d57267c575e1482cbce24ed74e7a4a9688024cbd2a2782dabafd81c2b57a533e530b8906eaf4a500294bcbaaacec8339475c7324d45f9a04b6b216d60e6dbb607abf6d02f778e8e97f5df47215383b572ded5d79f1863d4e143e471633cdc74c85bb06e5642b1135ea05aa6820ceca10d9983917871b47eb09420f0d29d42074cf93fcaa3b61e2220fa9cec50f4552852ec4d6a941f84cd221380b8b473e999d907db9752aa791a1f6a3121b5604417e38eec1cf34075e16f5be7c0c0928712954684230fbe444650c1965e95e95eb682f9dda269a9286488f36a86c33c97b98fa114bf8523372f26a192fdfbabda8ed6990ecf9aabeffca48e066ef3e2b5d23da5e28af995fbd98a887783ecaeea0fcd69958a2c9e30f1595e5db683d0af59a64741e429fe7de857faed78930d75223d3d023e4c5bf8c598e28266870f28678cda4924f7f351f95ff0a3628255a26e31f555ce797be484fdf5fc32a086ef18b26e598d7813e2f06abae6eee640abe612f5b678854309a5c8c92ade107af0de9de551d40e47081c9f3664f65b75f975afb97b9f60fa30071d92e1cf3863be4da5ff0474724525c17c44a0e896654d5799656e8c7a713ee405a02c71cd2bbce66920ca4f33d21bdfb43193d3f2e6831040d7c0c5dd43f31dc90cf82d97b404f111725860525a05f8c52682d7ffdff531daa3786994e3597535c605bd1a12c1529f94b74d93f219b07867d2e3af52f87db124acbff4acaefb2a0352088cf40334ec91c3eca4d7d4a95780e3d65d235d7c0fb65a3368e9252268789922c2910ae0d427061c0702148168d308d8717feaed787327478cf912eaec65ee4b4fdd853414ed22d205015c4f184dcd28b8098462e9a95830ac9a19ac717371f3f84a18afa35ee86bf82071796daa23e4c1cd33be57154cc3118ba669457cc5d9852f68349775818b80cfbc134a4281f18d27850ecdd23c4764d6ada2f1ba2d7b9020e1660e094fd64b5a84fd62c0a8516f4192952669bf48d42c3b2a6932cc4fbf1026ada7645c59c82f5c8176712c54cc2103a1f1cb80a53a3004b32fa93a959895258e2f380ef8646790040898b022917b62b752c0582d9069ab36b6540d84ff5e561b3aa7544572e92f0bf0baf07126f2aa86ef65dc7778bf8700bf85b438c40f35973d9770b7ddc3569406cbad258260cf00a8c864705a2422e209bad3110f5a1a81d6b63b1169794f82db04b5f8ab7235b8aeb2e7099384767a84f1454c4a3bfa13f837e359676e1f84ef118fb1d6ae395d0929e58d3dbe18177c4ea8a411510e33e2c9702c9cf6bda67a9dcaabbe34671152ea75bd55d8326aef89ef2babceac802f53d31fcfacb4b0ed96c8bd282aeb4b4a985ab2b103e5684d21f1e432ba144e3a4de7ce3f52bf9b86a85d8af1a3ac8106d8fd0c4426828821b6389bf9a5ed4713fb9192a986ff9e8fd07d7c49996e58d04b1f3b9ad1a9edf905ae584defcd317500fd2a97caeb7514e41ed350d0e2593a607f9cde7bf81eb6b7bef5df71bf04687785f992d47a803ac596269f609c150c976110282a752172bdd480a2540b34eb07284a09a1cd75370f023f3d51d48db58cb341479c72f9d6c5c767e84f46fbad609585abc07a1a35af8da353107f5d3939a5313e8e1ac300513da402f4ea7830d49837282d46064f8c1d3088a164aea38fedada8e2bd4f353fcc2149fa003bf64e9c6b25e249b15f80fc8364ce7f207b038383f23f21d05e7aca06b0bec2f4d7c05a7519366ffde2ff12ee8a9c8fb6140f02d5d50f8e7715e56d173aef6d9552847046aa8be699c0fa66601d7ab80b1e110019f859257834fc925f0a31f504c9e54cd1a4ebe14aaf7279511a3bfa5b2f1fc1fa150203b3652c11062aae2289c961b03cec37b70f9f501f4077929f6dc505ece0a6e4220b79c2e1edb053887a5cf0d624b73d526a79119d6842e606707d193cdf9f1304ae8906e600739e3477df7252641d2e50be0c6c74fc8391fad6234edd6322c594dd0b6dfb2094b756632f8acf469ca80658d1d54057986bc21ec92ae3579481a3fb74af34e4d0214f4b66015c1db8a3e921345f10694b12e619efc937b654dbcdac10fe1300782270a20f2d7761133269daee3c605147d32960d0e3db8d13c2ebc77c976211f7300f7f30ba0699080381ca940814af0859695521cbc3c800f74f90b79113d153a5471e9d0cf0416a1aa18234131834b4c54d1e9b44f3841d5dd2d83bc2d94987aec2e79fe6edfbdea85147066a5c8a4af17a0fc6762d70e94ffc9a3c85c39a26208e056818632a1ef6c5ad97bc3dd0e2d710b01d16db85c0be006cb87c9ff5e65b00d0b5e3d39157c5efa45b5294e6f5c15cb9bedfff54f9be3aab8ac938b72ee7ad96d6f24f3d51d0670bc61ebab47bb2014f281af6478e8da5c4ba37e384540d659d63271b43ba47ea4260d4d3d7c5a821522cad5c9711fbf278e1ce806aa1ed55c0bccc30898446053edc0fe02149a37ca78b8aa1b769d873ba36355c7a507d48ab028fc7538076832e3337bc45bd642e2e061e91f9b394a2a2cee49d266537e40f5291d50dcdb5bafeb29410e329b5a8cee08afe9e8835b0ea5d7770553e83d7b022142d89e3019e30de841bd48e2c41baeab8dbe40081e701be113f668637a2b2c0bc71588deff4107a7e5b4612f395598f8729e9b190118bd729bdcd09d2cb6be7c586f6bcb210a28d7d76dfc08480d2558d5ae2c152b2ceb986b85b9aab745a255e23998cb58ee2b58d4d4f238bffea94fbee47c1828cd76036f0332c1b6fad0c19c63258c9aef3b68a543d8028c8f590dcd96b2e985486bd06b15782280351b2a2f3dcec21d2586709a8a5a0e04add376b20d8ff3885d1e7072c03f4afff00740ad649ed54f6bde2d2d74d4682cbf23a47b10cb79591e0fd9135c91217f598ffdd42930c3b469d8b02d73d3047414abcce78f24568d911e9ac74bd4973d0fdbb33078d417df4d9a0e72d3228b0f7a8708908cc95a7b3a625a7747a994c55855185590c898f05240b82eeeeab19597de710308f9bb9b81b6eea798e002ae5ca5dda80799d2cd8d82ba63689de3f5552f30d147b4986096bf3f3e1c2e5247911bf3e5a49ec9f6b187d0ebbad33922b96e8fd7d8ca43b50a2d42022488b0f325d10c7352d55c1ec9c7624c725419260e996676fc1141fd6c943b4c972e0f824115f70a586c0896b7cb159156430ae7cce505644ceb2dead762d336f891096f5cb3386b3f4574a4c538f1a624153376cbd3532c9d36c191a2320472baa7569f96849bb8b3b507387109b50db8e9d44edc08b5a5e919b1d7153932a165021134e77f8acaba3afaaa07a2ec850a835ae549165949b3e1d3d79e246caa29f0d9b53ae08f29bd95d1eacd12d85a278ab89e67dfb631a7cdd5639ce86b01242f8ae5c9f37b6da6a0daf33c9ef8fb0a29ff7b3cdcc4ef41b9dc4c78392110a716def8edc627ba2052ddff0936afcfe0275de7d3525b7c59fd74775298f1e222d80e1a9faa64d0b6c275e8351fb5783bd618547fd54c9405c1f6c2d7d5b580ad2141c36169575609e6dfa7f57d6e2d78944abae509c8e01a9f6eb7c835809a1c07f1af1f5b2735fc98b6be9cec3d327a272b61c3f1b5d1d747bb7dab2b033d59769cd8e4f5ab8162638968575b42c46670d457791292bb0ea54a7d35eea6fbf56109277a78328494aa05de1fec101e2386b4ab58adf30e8cba3a624232d59807e7699b1305ece87ff69aac58aa35fab11d7ba66a7ed5c1b9b396b30aaa5e055946bb485723199c0edff2050d8c77168cf575812c928e620d759d1c425cc7a507a3a94720da6dff6ac7d370d3b950e37432414e90b819afa85d856f5c567a58a52886808cd618daed7aca103e46d5301249eb2c919870d1a7611b4d9a2a0437f88d1cd9408d09013c52ede1655ccca87cf1887aef90e48e3d161d5a96a63333f48b25506188f53f494d23f9c7766bb5f2dbe271764e5d848dc26001aeece1ee8b4cca7970e28ac27627b3326a0e62a047892b2e46be4919caa4e70a17f1c146a97af754658831504c5fb1146501fa4b800ed72cce3a9d640e024d8ee66a15341f2a7a95676564ce8703a73806680456a0013b56350272a360ca5c78d3c592f7c1d281bb11ef60a11a038b14d149fc5c6859fb5c83be979ba58cda33565d76bb0c5eba1284b163fbe98af84dea55dd664ba0bdb81eba6c9138aa741ddc531b261cdf6a1153d7d923343015b3c246c846a2091a780d662520883075b27c8b6f37e28127065c0eb5249151e33cca7b934588419d7bc2613b5743dc7c94361f449cd79091368e1aa87b3ddd5497022ccb6d8b09492a723d76913b79f617bb4be95268314827d536f0aada8a45e3d0e242c81da715406f4988e543e5dc1dda2d6cd281d4e6cb5071a71c3af6c1368253653c9229b6eb7688c8bfd88155bcec8655f492ead43b3da46aa86740be9661274696d3142d4fdb653783703aeb8eaba95376a0c1db76f8d02d3ebc41493f79944b7624e00e21d54f9d1bada1f05dea5111ee89a5d30f1a38e39c97ee18eeca49fb32bbd800279be0c4089d6bef33ab73e4d21805f17fb90537f404917bb27c6ed93a26781d20571c64c478fb118ae59434988969947c878bfea3320449a0b4549132fc52ecf3650ed99e00194f1617da5db2dbe2b2f9f2f2a8511b7eac225ec1b1dc970d7eb1206d52078e4b6f130aef8f8cbff893ddff8550946d52ff03e8ba05448ae20a39a16974198c841e35311282cf1ce2ac37269223504f352ab048bab46e288603647e4d644c3270e81cdc04525574e24ec8c0e560ce043444bd0f5f0e23285c806b56eb82fa93d5bc3e585ac95831d7c5d7a8b08848005b4d6b7128c81c9476ac0e1927235608f3f71bda54d48229d126f76c4ce33897958957e92af14710b0b3981b619370c1b728d1955adda1301f25ba8a0ba1ce62fa8818feb21cfe3e0499ac95b3e19905f22f8b82eeb6960f17cdb6b6b5ac2b4abbb5166dad6f08b68aac6772be3e72a56fb3cace03aea7a424981620820e6159ac80b17dd51b03ccf702fae715655e301232e21c555352049ed66e5f49c61e4521f92b4a12fe0c6d44af15f716598fd4e6630455baee30860411c4afc313c5ac028601f0aee3705065c100284322d5fb7b596b0dfc79417586aa8e719b0cfef1b3beeda59b8810912bb79452ca22065806210611f87eefffbcb7b29c3f1c719ee4d126fcd088e37df838df587100e58a0e3658f2e456c6fd57ed1414064514063f04472bfb6fc43e5aa42d4bb32b9aadc93879cb7e4b156caa8e3db65a39b329293db65a595d356a5378887acbeb02fa62bfc756b32996b5c17c6a404099629c33c6dcbde1857e5370ab231622053c9431b97c618309a49870eec018d3d24a6cef9cb30eafb3cb5281fecc7eeadfff5420d9c0eb936ae0f9da6e159263e13815a84c28cff22c47a93cac4b08285a405937d9089a93a0a74c836e9f00427032dbd79af3539e7d3768a85dd9bdcd4a781c4fd2db2716f9d19dda7a4399002db0dd28ec0a5525db1567da15ed2cdaa22798cba6b418a1818493798643f5253c79a3dc78f2d6ee0dec5643349548232e0a85e0f7b8e3ed628b90330c502cc26ba73695bfc31cc7bd006fd0c0bb11bb6caa9e280e91443aca866bbdbced64ed4e5e469c165af796816e3c91d6a7126f88aa1155ffe589b470e85591d9ecf66f8c375ef536375ef5f555aa7f19715463c6b931d2ab22e1469e5d2bf4e5fad854226d8d7072f2de663c9cde2e8b6be5d955d94f3d596b243c596d359eac3ea2a9d61befe2ebe3171c07e3ebcb387dfd140e0b635731be6a117eefafdfc3ae505f1f851abbf2bebe8d5dc9f8fa3e286057dfd7ff615733bebe0a406c10bb1ae1eb0bb1abf0eb0fb1ab90c6d7c771fd4b04b3ab3109dfb12b9772f4d5860fa4af008852fafa37eefdd448e628248c64a6ddaf3192b9765f1cc96c338d00105d8434a249a4dd54a324128111567ac9541aab1412c4ca63c3f4247ce93f9358e34b214da9468d2fd51887e44e126dd9b2a5934aa4b1ce44117712c42a73a9f1a5ff48a2f8a490a6248a4f12476f1a9146636d621269af21d69d91f4e28ffe2389a61f85342393e947a631484ce7a4265490743ee2638d9544dc45b1c2def4a3ffb8587a1ed28c4aa5e7a531888e2e2af92c41451771d15875ba49ac3934f8975ef41f17492f0a694424d28b486310981e72c143133cf49028345617ee25f16604d28bfe0b89a30f8534a2d1e843a331088e1ec2b821e8871e86c271884d5dda49629019a11f7df85f48e41f863421e71f72f04d60088e40443f6ceabe0c310529fc0345914864127d6ffafe1b296053b473d10605bee8bfff4031f45f48f38542ff89b89b42a69a50c45d24f61021f4df7f9e18be17d27c61f85e380691d1f79bc2135ca82069d2374500388018de879e08fe06b788bb09d46fd25b8f311fcce9d3e2f7e96f0c62eaf84de1092628e9d141c78f471c2e2948e1fab588bf0b69bec7e310dcbb37852718a0fbae279e6ceafe8b9006ef6d0a0276ae091e9ae0a1e346934d5dda3d3105299cfbfddd73214da77137e5378527d08cf7ade3104b10e91591f04c7eef3a497f6c629e8612b8a1c58ce786a8127b28e1b9fb4ebfdebfbdf7beffc007c30f431f12bd883f1ffd88f4a4d29746b28ea80554d2f49548fe0b047effbea9f43c24de0f459bfa446aef6ff1a6b094aec5a6b0abdfdb1703148b70514f00aaa6db04613b6dea761f2f5878aee5598e7273bbbdc81c9773adb9d6dc7539ef19006c0942ccf0fc5b95fdc78ff1d36668cfc6dfc7f5c04ef67b22e7a30a781e076053f6757767ba206650fe4f279ae52e9318a975e89b7befbd33fb868fba905c64adbd39e7ccef8f39856962139ba2ee722ed35ab9560065397fd0b199038e878bc2cd6600ead4c4409547089faed7aa064e62139bd8c4e60c316c5e15ac8a352d90bd99d8c4189b32cc6081b0e90304c751e02ad8940157c126364d194fad235841ca39d7d16fcad2acfd9544c4877306348412262280a1b59aa208ec0a932db2c05a2fc50d683a6cb104969d96dd92f3840993189c5872a455a3ffe3c01afd34a4a9d9b9e3b88eeb38aee34eb9be967b79b82814829fc7ff3fef3b10f6be1018b6421818f0beeebd722344888b08787e1ddebdefdedaee137ce6144e6a2cd475348c0cbbaa975faef2cba2a12afb4a544140bd23ea7bda816a1052e6955891db0d110bd03b5373d8ed937d6acc472c458bf9c8f95e2e73379643695e16b5d6b4a6796bcc1c7cc81901901a1fb61a51125e6877a1cedbbadb332841c50b5a2dd4da0e0d8956180a85469c0c85acd5428642d60af7d6dd361140067ea23e3e3eba3bd97b77ccae623dcfabb1f1517394e00bf6f2533568b5f0c28ad60e175db50bc64044157ed8540a3487fd09d017fbd507129c7471815901efe761804ea3932e353ae9d29f94f19e8c7992d5eb48036fe4e178e2bad71eee1d8639873b442146078cc591b25173d8f7715903b02ad39412ba48c2de3664ba02ac02e092820f6a05b502e3e2e2d20108822015fc03bdeffb40f0fb3c30fc40f0034216574c338a19441426a8bcc0c78827cba0621c83636c3581095eb9ef3aadbf87e28516ddd217fb30889942abd1308d96b375e1743ae59c636272ce119e7b31f6f1f1f1f1a1621bc94b722cc3a808067ab99565199663226c61b352a7bcac7c242b916526b3bc43940c83d917a6fc66da4c8c8b9e87b2f2694a396fce513a2ce39f89a554a3273d69cbb256daca28fa85c162950728e4e2912b92613a35c735edeb9ee62d080b50cd4ab12abb039d52be38d865f5806598acc70eb5da2b8a7d85465bc24a5928140a8d19965f5927e7c0720e0c0683655886c1601b369281b6b078df05185a2bda56cca766740bfefc122008822008eee49c4d7635c49e3801e8f66ffefe5d4223e9149c9a7b0a85ec38c249fa0344051001f5b10f7d87df91951be830841c4a31c77138608aa022e4d4014130739ced281072595f6bad1dfe4edf90017b731c973bb0810fac609e42cef33c4f2b2a9db2c3932767162562a0427b7e18c2862c3f4e6081658b19e7333eebc1a970ce44ca2735e37cc6675a3869673217288f54cecb4552daacfcc6974db950e4c6ccc5492c9bc930101094959ac92a4dc6aa393d2c0a509a8cd264942693f560a56666a8cd7c98c96c0a7777569b4599cd6480f1609d23bceb7c5cd529735cae35db540915a0f7ce3e80d87239cfe33ccff33ccef33ccfe33c8c3d8c6de7fdbdf75e6fefadb5e7799ea739ad35c7799ee7799ea7b54de92e6fedd9efb3dfe781a11ae8f4a032f5450b02409004bbae0b29eb6f5dd500808492df1afb3eeccfd8ef61c313bc7e9d304dd3344dd334cd144c354dd334cb8fd61709384c0c90abb2fa6561ddb6ddc35c966db560a8f0991c701c9827adeeb788537578a083abdb5fcd7b4fa7d48e3b62bbe3ae2a0fca822105c7367543478298b5be265af67bbc151d5260a2e0e049cd5c7cb029184cf090a660039edf860a78f5a032d4daee64ff8cad2fad39bfe6eb55b94e521bada92fda8a323365fc4d139c3062e7496d0821662d5b8132071b50e17a22058c56b375bf5f02fabdd741715f81aeca72634d7de1e115565f26d08c1872485272305678eda103b8f1049afadae1dfcf115095fd2340af970ed33481a05c7243a82ccbb2c4a1b6e680950715c2b8252664837a484ac3d159f56555f60794479759156655b61b59a02b0fd8207ab341413c66b8e1cdf61f14a84cedf9390a5486f606541e1b8ba53f40781e373507b5dd942538435be54079e0a839ac96e97e5399fc16fc3cae5a1bda9e5a962894654f6ac6e946b7314e9d7bb38389d38fccc570d9ce8604d97befce885f1b7db1a3f1da6c565fdbbd174728f450700e631c5e9b0935fe1d14cafa61a40454e6fb2d9de46ca7233a22cc8e05afcec9ab5bd2d5d0ede72b2a2b2b4179907ba88cf7a7ee053e84ac45ce41962237b10257c5005446f72764f4931d10b409ace6f1a1db262719380c5417d154f02bbdcba25bdb4ee76c41b8656783cebd5edc8b7b715fb65d5695c96c329bcc569e68ba4fa4bdd7d7eb158a44da6baf3299ec41da695070efc96bf3aec53784fff3c4da7f884435514df43d59ad108da456a2e745ff44efd6207097e35ed7c5fd502f0e9407a539429587be81ca743ad4150f75c50d514d2b088de4eef549aeefed79d766335d65adbc658de46c35dfda2e017dd950a8cafe36c2024d846d1f61db3270725a5283e681eea12ffa8aaab25a09aab2bf5f380d410b570e4e5268ba4567ebaa74b69e3b851bef94fd2151a8d6900d69bc5028ae405f364055f5215055f56138d52236d0545cc1f100fa5231976b0e0dda149f7941c8d280d5b36251fbffda8bff48705b9b58957d1e1ff4de54663f95dad7425ffb01b2abfc56386a3f91bec795acd686e0b4d3abba63cda44af8a0498fcdb47121380b4f6aa7b7311c43a368d457456f04b8f1db0cb6a852ff453e5434d62676ac534a2a3f3cf747825f0670fdeebb4f4670347e78d5ba8ab7e78fa935a6c6d4982d92e2e2e2e2e2e232e406048b8b4b29c5e630f5fcfaa77415728c93959f652b8edb19e242e1df7b41b7bb4c6e896ff93330e0fa59f05e3f59651df580eff70794bedc1968118d8979c24998d3e974e272e630c6b8561eb06c65e1ad9353d402ee68671cc781b5e2128b5dff6a59962238a4ccb5b64265d51b3c522d45f85aba84dcc0a0251b781005a090bab526629579339b03cd612b0d268a936e71a02f7f0740c338e41cbe4b8b529d941bd000fdbcd7c91952bbf7416efffe8239ef057038b8464c5f74aa2379b7a1c03479860c09328386dcd83368ef6ded8f6bc8ea04fc24b2b737e278afc77aeadf95ac3e33d3a68a743da2eaef11559f8bde6644d5b186a4471c9cf09fa06af44380b6f4f6fe45048d46a35d22a8ccb5e6cbb4d55a2091f82f3cf6bff79ee44fc00431033356169ed880af9f057a55cf0238d65c95a5fdb8aa518fd7659a5a6331b53c6c8707346471411667ab7f66eb765d2dd3d2b2a8933408086aab2c460c5366ca4c992933cdab92f23a6fa7b5be26299c6b34e28c9e341269911cacc3c07031ee15b2a028f47df51ac1d9f3be1f8928fe25ef4d4fa4f5d54e65465816ea1ecaa8ca7ed87536a32f8d38a51fbd27da90de34e2944ca5d2bb18afcf55e92fbd8b77a14d6f2a69503f7d21e51fadc08124eea1dbfff64864495b6844541a8d46a3a578606052a9ff7a2dcdd22c8d867ec6cef4d83494cdb6d10fc2e0494b3f91d6877f30097260b59616290c9eb46c98001295e92e2bfcf246abd1c2910bc121405b3296f05c7da8271e200b073f1cedf353f5f9039c9c2b3bea24c3094e9e3228a2f27b0ffe77f98b5e02a49f79c2073555b0768a4d8196464d9148441261780ccc0e1d3869633b64a31195517944d588449f47565b4d68ccf1465406df7b9bb093ffddc662b158edaabc7cad58b182d2624ed062f48516b34a98dc6ced5a5aee66f0c06d8fcdd6f21d2dcda66a11bc96265ce1ae9cab13abbd32a93b00118642211aad858f48b62f72402302fcbedb0be706067eff7bf087745d90b6771c52fbe9743add6e683a98f2b229ec02c7114159fab9540ffc86ba85d1e8e5ace5f0a5f9c07bdee97fdef77d387e5feb0b7ddef7a1af2dcfab32e5d5c26941f7a0e58d4ff2090b203bc5236d53b5891e9d785f6faccafea8c38e4dd17acb380c7d287c1cd684be8642f0f3aeb6200e48f8b084909b1f408a8082eb727e2247d1ed5b22a88c7e3d5e8c6df5b73c7db16f8970d169ddd97b2f0e311c53968019c19273adb5de7b71c0e880c940bbba2d5a737e3afda7381d8c3198635918765596d3e965929306b17d578e6b6f7d21605ba2e70f3e17af0ff7e13ffa50e849a111378239d76551ad393f9d38d74d71ffedd7a32bc74565be0f6503865ef4e1f5b92af3fa742211351aaf684475cf47ec7a8535a86ebce7886536bbea1efbf8c87c643e32198de78d64f579e970d2be04606bb7a206f35791f650a42d1c8a2bd41e8264907c7a970baeed72a173699073712eedf22c89c7058e2fa59752cb55ba22b947e5a7fd769c8b2432d460090ca27072040dea81a9431357a880320317534ca1821aca2a5e2f093001a5c707052410820c623e557770e91987a2b5e601cbcb0275b984d7bdafad65a9655466072a3392b5cb4a9377ef80fc5df75937d97b0c69b6ab575197366582c9b576755297a1027ed3ca1f8f26904393fb74b5bf90e6ea31bf0829d4806b57494306e4efeeecb260002161a264072c35e8d09a4152831468d9810c451869d9d7a596ddb2db5297bad4a52e4b5dea92bb8027d503cfffd9540f1c77bf4eea3fb82f70525b6b73f7f56a7db5ae1507cc2924ffc0ee88e1de3b737b9841015f20f8ca5cb7b50dedbdb7ebea08e88bb54185e3ff7918ea08a80f7ae564bafac2c005bc91a44cf4fa5b7b3f281cc07ea7f6bf0f6922d1df7baf3853e3647d711eb316e310fcbc21f4e506e7f59a49b1025e9fcb39e79cef49890fc63c9f8ebe576b8f49595e4e8bd0b182b26a28eb2fff4116cd047f82d625bc3ecdbe8e114e4b1dbd75f9ded87fa0f15e84f79929b8fd0f5f90d6187476d509fdffd7d86c361b70db49cd71e17df10043f0cbaa53aaf4749cb6810f1142565327e90982b4918bd76e690fc89956d2587067638561021d28a86df7eb07df3e4d478fe8dd77fb41516bdb3bd1f62a663d7617db54cd6205c5fb9d684306e8118f582471c7cfddbf23a6a97aef4da3d1be1aa3cacdb7f2e034877d91e8c919bddefb044f0962d083560b0590d293a415128d38d58617024f7805bff2c827e01c009ee338eefea5e787c5799ee7799e27c8e9539ffa46653e2de7798aed7288c5b5984de92cfa2c398ddfb2d7fadc8842d5ee75a9cfeddaaff356775c57653bf116746230891e2c4954f9f901eab1d995edf9c9494080b674b6d994cd557a8ae064eec1e0c541dd7e8cd36750107dd1678dd3a73ef5a94fcc71fa1491e854fa7eb966a06ffad4e7778a5ec815a6a38a30ac5a6a144662311c3dc496600097d16bff4414df7b3dcfdb58c73cc13c9da98293d4348366b6e0b77619986abaf2be3e48596027e3e607100ffcb0b7691061fba5a1909b1f40bc5db3bd5abd7a6b2dc5bc5d7d50e00708840590c9d3655d81a0711ca7f53d754c56afd7347dea0c8afb649dfd787587b27e8c600f007ccb02c73abbaa028075acaf24e04eed9d46a256b3cecc997e0981d1a07b0999016661f5a5ff1f630ca38337512eb902b831317092faf8a03e5664c91ccdaf2431980f2cc62626a68ac501a3c3c7870744ad5587579a339d82e7ff2938d849136652eaf0d67a7f0a5ea94c4807ddb1a96e84d39e263bb228668f535e2d5a046daa26e0074e525b8dab004feaa84b9d4aa5521dc7711c9771780276b95cde3d8203565b105bc28a133e626a623e8e4a07ae62c0497a765d7777b092001cf80a4e3490d3ccad22a9839c7ace2228529b4fcc88ea3e4ca1baef6dc01f719e74a3cdf7e188f338e0cc153550b76cd9a2a55ffd1fad750ddc0c00e9414ebdc654f08675dcf1c3cb300157d3ccb16885d993cb34d44960313531954929e4668f30c7713a6acab22cad600605c60b17a6126904e3850bd3ac34238df22ccf4a6337229148255289549a552a4369558a5d71efb53e8f7976c759068aa299d01794e869073f27a93c68a83cb8cfe15c76a5c5aebabf4110faad666d79269685645ae6c94491a8419b9ad16ab32837dc036591466fbc85ea6d14fad1984f2093e51cf24e9e85c6bc13b3fa8b6d1a6a8e9ca4e618fd8ce5723817d672a32ff80734070e4214278ea95836c3b359d96427731c379b896c09047b6ffb27fbd4bebe5bff8cc51ec6dedeb56e4d61b455d9e7110427e91519a032aca77105a541afa071c5bd7746d7918610bcce70308030d0080f901e3f947012731b564b3ddd77c354a0847f5c059cc43fdd7e8fcbb2add2d7278e6895c052ed365ac0c90dbb36854f20bb3a4016bcf6ae9e243efbade35c577f2456d387af7a7810ec834dd9c7518270701615b4c088560b37b6a545ed0efc26c480931b5669dc9bd0c3f7bde97b6f5b24bf262787f439f46de0c0c94a2b899576376cc376cc1cc9bd5356957d72d36ade48725bf7e9dca8c76e2453b8860838994fd2487ad3e8e2496f03e34d0fe34d6f63c3b88d1d0e8e6f72617a1bd29bbebe69c47952471c176f7a1c119ef4445a2f4414ffd31369954414ff174fa4f5dd1b0c8cfad24740868c2fc97816623cea298da7a51fe12330e3698c2cb8f8193fc2c8c2131b173fe35910e14b4f5ba2ff5c881bb6635b561269b990817afb34ac1b06e363844233be14ea9a1cd4cb781144da2afd0c11623c8cc72ff1de44da2aa1c42a38f85f4d8e0b31756dc8788c87f1dc166bce38fabbd1d3b012e9551c62fb68bc486a8efdd3f77322f9a3ef9fb99e8877401cb3298b7a40e95fbc4de95fc418ff8e362ffe34e2c018e9cf5c914862583e45f2fbe9b2abceae82f22d6be972ecead5e97423fed11968ef4d2b6b1fa12a259bc39dfc2b837d2477fb0859591b4955ed1b6cc8a23b010cec369a70547e4afba12fa34e6e98152f14cb836e2f1637ecbab77bbb3f601996e118e021f00a72b63ac809d7377d2ec1ef93faecf2b937ee76d76d9865bd34d9b32d259f7b8acdbcb261342b21e8e4966d9e1d65d3babd9d39c8aef013e7bdf762d9eb7327d9308d009bdab05d5ed68da02118810324335481a1657fcb2e0b034e64b1528513570f575af6376cc760bce52fea483e498bca8231eed825e5339f2fbe042ec60d338d1b56da30d2a69d5b08b55c39a12b0ecb6a0e2174dbc55d03dd32d0d4360155d90dab39641b0724b24dcb41f996cf0dcbe7799e17cb5c9dd6ba66c3360c0c11e1b684277870e8074ed2db4d8ed5b149720c95d12fa0d2777c60c18da7d3e986562487ed240e1c95477d1182a081921ab44072c4882c7e3061a80205490411d482c18414576640c2081a946871c0d6c38bc90c4200d3a2653b4502fcc00ffc7a8ea082529082940b69c013ea96ee51c1759b98a8b4ad3805b96433220000000413150000180c0a0583a150402c1e936bf3dc0114800d627c42785e3c1649635194c33808a218838c330600000030861042604335015dc03c5f4f5c68d33a9f7a6b9bd3f0841cf22d846256b5a5fd6d4a7a1e8ef6ba8d8136c86566341f72dc36f0dfc7eef7dbdf75f290cd07970b8cef4f96957c457de74102b2b066625e8617825b85a9c6b04f343bf7c05af2a38704227ead8175cb909085ad089694205f059dcb9adb7add8b5cdaf3762e0d3e90846c60637cefa6a55ae8aeb1239ad0f6235f053d868203c9959084503c6f106b4e898a3533d3aa72541cf3d096969d8e66c4d37530617d0480dd1c94cf128ca30eccb9be637ae04cbbe893438e74e294ff3a2cf3b93396e1231ccbc2838a719479537a5d874f84290cd8388e57249d699c30769078b8755ab974862faa1c19d2f0b531cade60145242597839889c633a1a3fbb1a94ff0658ff87a00d18958181113d5934d29fd05bc7845e4d506d5aa830d5bc80110a87574d2cadf082b31bdf80968c61f109553c2ab168fc8d3d8f463c1b45d49d6c08b9b8b7326adca0b0c0317183f7006f2868b48e5f87f56bbabd5922e1306c315652e4089b932ed28dc4bb31343f872f1dc0c1279a7fab033e77fa957c14f7507abefaf3b527d4dff67c7aadac76bf20c77fed58eae7a29a6ed44d229efbab4e52ce9bc9d03851d3ff4d2bb870aaaaa910d8dc5373ca6686745d8a9b84b5350a4baaa77e5fde3a9be1e884522233128e87607bf3f9433b61a2db66806a161aba4b84d91e1aee5f9915dc05ff2ca7b51e27aee8cb2787a3d3f61950a1dfb4c41e486d5b043608a39e432f0bd8334f633e6660f7f0ea6431689d08864db4cd235fa8e126bc5dc9a766464b514862f02d5509f81b14fb28344fd48b22fb7e7d9a062ddd718aab14c2f5d2b27ad3b8e833df5ddb0348ba7ea471df4f15cd067d09f58f39ff418f9210b76adfd48f588e99141b6c1e968351fa1c08b60ce634e9a3921124a8dfa6993620f2ecf2684a2fca8b96ab0015e461b1a017d20018e086422f641134bf3ad45de71b0438d77d04a662cd85442c61bc769ecfed565d8380cb3802aa7c800b5d3339de5865b6c76f97df9152a87a43422eecfaf28597e3fdc2d0388e616878bf989041cc94522c9f3492b2d5103ce5d8a1c8e70a6cf14c2b1ca2f0969b74754c3e581cdeff55b69be54d8d63c11f4fd1f0052a1ad7b00958b43b249a534bd9ff3b174431186ff779c239792456d3b4f601bcedf770f0fd7d68477c47890aa7bcbf8637f38c08acaf6d56c793a9129f37f86972e93938a4f40f697c49455b863c9fdfd54f6e400d9e6846277e0910148e44483babe34f51b1ff17426bc5054d1d8d54f9cdd0d91ca825f457289ccff1a673bcc18bff7521f8cc7c9b3360cff3afe13bdb3174e61050b4284710cb81b8ca4f4260c16618a50e2232fe04ae9072a62d2fa3a36c23473bc530ac78a11081013d90e4e5cbd4daac7f51510d334809fec6b370e2f22767d4bb13bba0c219bc84cbbb643bf4b0cb94669128f3cc926aea253dadb00318627092b57db30738a817fd4e7443eb868844927ba726361f1f8f4499a4e93bd4a185239325f9c4431e7ddbe2187eb520b694feae3b732138755a102b09d81532c2b23535a375b4896f748463545674e0744234626c69b1a171f4dc1689d677edbf3ffaf755b654bb86e3743e18835d223a3e94640f3b61403a12e2e14b27585b54d0c1c39329434e2c93d7e34015527b28a716154013f797658802d088ce41aa720a542ef5ed766b0bf94c564d1b887791c22454fb2c3b82f23be7cc6743eb0097804115ba6d206d805f9e1ad0bb6949b792e68aada9c8b52409912b8947e6857c43eacd08653bf1b747a0712cd16115ac047b10267f38242de0d0f25c2cee525145d874a04501a4ab400d0c254d572853f90c4ceddf135c915fe83eeb9fb5a28f4bdaef0816e69dd52f1294124a9c45f0cc6dee69724f3e841954de4f65031a8cd31ab0888f94bb40cb0d07fc2e496e11d9983184f383a2ae6b25de9ee1b6379b907be42038417bc23b9bfd89960b1362364d03dcf8c5d9cce33ed142c17ff9d68a78314474be4e83b60df0e80c348c850f247bd8c629a9179ac6913b7b28bb1f622693742fd684633204bb90021edbe53aabd54d7fc22824381265bc84911ca2873c317cb320c8b8c4fc57f8767588a17454a0d8e7522916b9fc97e7c008f6d83963f77254fc1d48379b16fa0839cf9a1a006df7002853d360d13697b6d80ca2b4fbd8a99a70af416fd808678af0d26a91e286f696aa54830e8cadf051305b367c882c12f2aee76884823ced0a544815968a6e52ff30bd67d40b316a092ae4bbbdaaee328a75d6419e1955e1c2b74c5db02a77de0bd44c43119076699973ba9f85990070c028f1aadc198095d8fd4c98b9e9e480556af30d8ad58bddd08f3f2ee540195a87a8beffd8d2fd273216b29ca54ef6d21b1f5acf1ab358f22aa6ebb55e93db64deec757c5097191e84d35a51bbf32c0a802fd117fa064bad60940a05ecae4661778aed42306b51b0dc4b584323602903c45fcb09c557619f52ddcc6cc08acdfa583b9c6a3aa6ebdda88eec8939fafb0b63682314b494e05e5880e5aec5a2c0840115d58b0a7e66d6a2a8ec568ea563af88e563c074e000d2fb600a6c20b14cc2d49158723716f9c6e548bd1438d21480a2276d62e5682a4e2ce4754c10fc7a259dab01c910f693a3ba3ec7a767b8b9f52089dc9d1c6da8cba280cd0fd45c1c0c13ec00e58c69face579a9d9d25611ced17d1b0912b22b109fea6eb8256fcd6e326539553aa37b66046658cf7cdf499533d2381091bdeb7b8b936acb9e2ac17f144f282f2cbed11842b741ec978b4a076c10f50974467f59a27903181ba0a7e5b57cf5bcf933f035008d05c12f374e12acbd7169f1aae4a30fb883f4691687bd22daeda26e38c60abc5b86e2d6fb6785d6c509fc11663132617e34d5b2c0d4e6d297276fd74baea37f0221b9447f6c9188b60a1b8623f88c4907229b5d19b0995f8fca2605a2078832bae72f085b98d4e6e5bdcb3f4c0fa211b97e0190a00e76780f34aa4a002eae50fb8266460e29fe05db5a93719bc8ccfe4182dae98b9316852cc5129438bcac482a3e247196f5417435d7de591a37f0f410384f3f3bb8ef37861f888e08b3d8a372eb1858967f608b9237a9372b9c53a379f414fac5174cb12e802b630d6d5f5a1725be52608de0cffc939616a706360fe3413384c41fe15d6f8cdee550bf68caff813a87253948888b98bf3198605e840615d75a4a2bf2ffd2322271735d9096c16366e9afb3f192fdea76e00908d8cf5d5e8fb575f6a9d8276dfa8cdf83f1be8abd0032287701f37352cc6ebb66f67cbc1f9b6f185fb410e2aa57850beee4e0d33c212fa8ebd07e882777e45f907d2094649393df934c967f82bc50b33b48636f67408ee0cc820aec257866ad3e5b3daccd430671afbf72432814b02193335b69c38699ed32753c360cbeaea3099323d980301be71c87c30067c6fd203afa4d022f91c4f6915f4a3f0bfdbd5e44754734bc374487e8e883dc6e8819bf2f311d24d64b97cfad14d8a2b0b1bdb7dcbc9dee78712213bbef4a5cc8ebc4b408398568b0a4555f2c38cbc1c546dde6ed7ce7c5ccbd186913ff0bf2f14cb187b828813fa7296d91b17fe430ba09e1e60baf01fba34612d73eab422a92dea362bc5abb86ef553a22069fd89d7fc3e4a58b10a9052d7180716c0701661028cfcec61fa39c4a9279de3ee8ad2394ee63d6bc06e55566a98c248abc9c7c5463f875edaa122deaf551bf1e5ff1523d97f17bc25e8e7ccb4948eed7d9a1d4ad2fb326640453cdf7ed38a886e61cc0e30b0a390d946acc3447bf2686cf1a3b13398da5da4107af11f4168106cdcbc3cbc2a8a0d0a70e9c562010d227745474947858dbc5901e36b964528947527153c8683556f8575957910dc519e89a81bb86500e48246c04c45b1eccb050899020b6a509ec34c8a9ba68ac48e24e682864180b24201642ce84ad478183b1cf8030434cc80830f72f9e25882497157239723199843ba62804a3bd9b088a6457db6d8e358e305c2880991dc18f7153e5b2c0969a3e7465183cd8e3430312d0e6ceaa159f19261bc54e0c09920fe52c3986661826706a96b2bb41118a1a5db009b1c4e0a781b364e5e645a62ce47537bb337886116172625844ec2e7bc40c7a12bf6fd67d97cb48a08e20745821952edd618badc3013d0f483c126cea739e5625b630d73c0883013dd57348e9d3483372ce3cb9d8d4d5ed5b9520fe041792865849fa8a91c9f6eca62d327a213a7990f6ff2e909400b6fd55fcd70d768faef6b40de1a7342b6ada313a7d6eff9c1cea0e5bf98325e2d1c647f04e12ed2c83fd17afad18f1082b60f08a3727d79da737f6fb45403f0ddab02b438b9f57ead5003eb2247fec4bfb30a042c3b531da7c4d10afb73c43a84a97a09346d4787e39b448eb33c9f5c040128206a1b222229f574d6962eece9c6046c0003f041937cad71750377a1c5f0cdfe557b36c66b4464a6eaf3fc5561a626b40f5435738fe88285a1757073e4947cb01b541c39bbabd3ff46d37481da856a6fe3feab50aa59386f453c181c142b1bd205866e6c25d4060c843dc037bdf01f003a2d4b4183c37319f92dfeda1b7ce27353c90ebbd3fa234cd782a0d5b71f1b88065d877c1a1e210b2779aefd195c0fc35ee8bfcc0bc3af272a2cc5bbb9a4f2db50ee33a2a28850f85d0def8b8904f2c49b0aa3f6d8a093f54b34f08c7331323a5ec87fd3240e36b1b26166412bc13e7c26c8d9114785f9b4b2ecbcabef59375fbfe0eb6b1fb4d5f7cde9058877d0f4043298df08d9d1f796fdfe55a5441c02e9d8de1c460d2081bc6ece852a50f3f749e53a5174ee0bed1d15624114a368234c25a57aef19c2cd53cfa882318a633bf188ce1cd5120fe5ab07afdd2973f20c0d02383c924ebd84f03f9bbab5cca98a1587b81a9159fa062691af055de4e73e9bed21188431678203c4b2e597c4808e2273367338b98e9199a8f78800df24f79d6663919c49f073800e0e54c88f053cc8047de2800136a33978d8f51728cf497a60f6d6058d33a3df448e58faff6688f8420967df0086351503be0481108550840e1a44e36f723354687576a1a57168f824c6b9df7ba09b3c54ff32d8d1b7b11b548b8f2ca9fd8006430f3822a0979829806b69019b3cb11e4fd4328a9ddb09a403f5b20ccd9bea383a4ec07c0c220aee52f87f56cc85ea4bfe672e6ad77b1955b4548727700e40ea75144040dd07c6c72842114f6846b000d61102627fe6a372a646326d0e18800d33c485e9b8281b2eed53017fe2fbffb31aa289e50928f354341024062e75c4e045e20c71f94612defc422f2059f294cedf446fbe29b9748bcb928a3ac4374f993d631fd8641ff49b9a8e5fd197114e5f0fa982e0e9941db26d6bfc788e05bf02a579c39a918fa28d329135173f5a3e28def58d9c87edb25729372b1d6fe3f73d93b2bc3be68e33ad971f164d188edcf94bcc9e130404e0a9cef436935841b96bb8c4847d682b9a34fdff03faf1389ceef278947951c2f6ac30655cea7481783f5b44ca0a8e4978401722ff5da315ae38b89382b3b5d0a0e186620f07bc8aec5fdcc9c713ca906f5cc0b6c41cba450044aa3c508b17aee2a3c3cd675ee1cc75cf772b16e3e020abf06ad4455c345157671d382447b450e3020702566328ce624820c5e3961a6a61d5a787858df12ad8221eb4d89a99ee7ab5955d73973756edea13fd535c63803a4b6f5e27704656c9f2e0727f1a0e8c19aa16524fe056b8874f343d6e409ffb34c34421bdf3ce00d1a148426bb294b8626fb12294d6de8a72acbbf7a82387103b9fc4c7e570733c7c66ef2e822510517fe951ff81aa7c95a17e9337f1ab71166592958925f3688a68751849e8c643dcbf24dbdb804f2f9e9d10d0923b6bffd9169cd674f38347c0ee5d4b5733d9a64d3375f5359478dd7be1c80b232ed5a0ed507d8914a9b7e98d6359de34631abbfd2fa5144c3d256bd3ecf3b211cd96342e0698ea0869a2312d7ffafd329f419ede21af818ba36426bcb67c40d1e5198d31e52f63a827f9bfe685312c00f4aebc0035c062a41eb02cbf096807a0358a1635a5fe780131252fee382df190e42593607d8ff6c4ff6cf50c214a1fccdd048436a6bd4c49212455d2c517b3f77b9bd6c42da2379b63b917e472f412aca957e5a268361b382caf985e7189af2ba554143e1bebd04b8df122dc29bac0f49b56990ee07e28c28dd3a09d378e0f5e3f2b0acb064fa5a1bdbf99a258eb7c256cf594ea8d36e80e1545048dcc5a44e2c05e4521092f06d67cdb202a9a2bef6c25bd912ea1dfe65c43288af2f3ae7442d867a6a6a200c1f366607a8a62babc486723bf07074a3c702998b36107ee1cf7374c7f21350838f90ecf2b04c6d37a5d21243123396281b073a2fb646cd8fe597a749a52cab82e8e6adc90691cf1a8bd96ef5562ca4e74b5208f39b45691df827866f431f9654e29af312e69184f2d0d65f0efa115c92beadded8baaa2afea935df8e826e97da7db274f66685cd3044e27220e3e1b5b006a164fa6a7031d9a0a605eb866e8ccb146d0ce3aba8411aabed243692150254f8aca84932b389d11b53c28f315e07dc7e837a9596063689df7cb65a8680f9bab2781a0374886c1b902a4b44b44ad9d6e6d4fed151ee6d10c5101cf07dc69fdb3b307ae144aeefe0819621cd55a4ea96c546f45cf6c47f66d5902a350b14c2cf14448db6ae54108682562cb9522b668d683c35bbb889768a63857320c5cba14680f7547eb61f6c522a8014ebc6cfa89c8cd1d277bde852c98c2f6cdcd5ffb578638c764b76db5ad5e93a19b0c2c0283d6c5a0e72e60710f94ff30f3467bfbd028fcb35717e2162c5dd3836ab28828d5d23abfc506313888db8d0273129826fff415016e218e6d6002a9a14480de21b61904a9d863dc7563d9c2a2aee3d62cc53b3b1d7a5e7f0d8fb6241ff98954c0ee3d00363b101a738b35028b955cb9fcb84ad5341cac78f9c32c93a9415b46f5b7ac782e7fd38c0c38de15039fe20d2f6433570d503d1004ba656290033b41aed261582e68d03a278d2bb9e0331d26bf8fb3844ba756c749de3c6b1d0cefeb1cfd096cb7fd14778dce317c4044ea3454a1011bbf306d9bb03028ff9b9c621e984eb22e8c045499da93861156ecbdcc17e932322770ca2a44ea658e0d73824132481e083d6294bba241ee31ffad8b8a92460fa9395b41b81aaf6e1b46f01e6e2e666395d0d9f6403d484f4f767e01606d4fa571202bed76c1724816dd42e202dccc60d95841c97ef88b3f82e02f2c9270b454d6eef5361d2dfadaab04692c6d0e417848f3bbbf381a90908ecf4db9728dab6109006777c8eb972eb3c5c4f688722d2a3fa92e5f0dd5a8ef15db3a2dc955ed22074c48b3632089d7acf0d33b41945a2e0ce0f8c7a9951c73a0f550d317906ef0c6670c4bcd6e323ac439ccf7aa556120c3fd183641febb3c6df033ff5e87d387d316778a10efc44910e4c5aebbfd256c1094f3a6676ec4c023b8a6c68817227ecf88cc39c258b907b7ed5cec8864af9a7ed771921975fab558462e42bd86c9226ca9be13a3eeab6bed602ba053da02b92ac102848967b084feb3bcb63b2ea02840dfb70b2ce139e002a6b68f8229f9c4e59ffe931f22d0fb2549004c0142e1a05da141af6f3dacaadfcb232e8ace969315060bc0f5694033755518d9b3e268f303550a44f07f70857372d2eadcd13a6521872d0b2fe97482c609e613d53317d7249bab0462abda4cc9d59e01e3bb4a2e797ce4e37e377f515412f5b0452fff2b932e2ec8f821207aebe910674601d036ae1ac674247886fb43408024c1215062309b3eb1a2097ba77519c234c35968a58ff4c03dcb3bcd20c0228235da336fd7f1eb42016a053718b06f6b0c006dff4d28104044ae4c064a15f2450b3eed3a86b1f4f2b0c1ac9c20565811dadfc43e2b24485905331a30ac934e73940584624451dfb202b7924821e05516c222537bb81ec7f3b2910cfa0f6f47c6b9ecdf8db45e442a5821235089559faac43ef3bc9c4ca42eed4007c0256e0db6dba39dd3fe4ed800fe83198043bebf3702f05a39b8adb16420a522a6131fb8406621f77fab86a4f863bbfa8287450d56dc080d501837d2b4314619c6e8ca0587ed8a39f83e6cf63bcec007e6b310d84740226b0d8fb706ff2603f92f77a3b77d58214bc79b05dabc497aaf4272967c194a36321d6309e15681b4af20e4a310f23905bf6e17292e50e895552c16e3a68f64f6117efd755e0854709730048b3bd495f33248292a00cca6db74bd3fb09c10d4ec3ec170838d68f427d027202c9e30c13e90274ce04c03054b4a9e2d1f0bbf42b9da8b1d2e57604f4bd0c5dba44cdd5c38f0fad8a9b35060a04cfce2b003c652bd4a72f4106056709cdade018518f6867452a36a921a80cf117d26a1a9135c687ae9fde6a18f9c8dee08314c735f1b7ab13044d12047ddbe41e965488363dffd50c88f1f0e2328631c6943ffdab85244b2025910979c9f493dca5607c98bd9dd489055b1bcb59f513bc9e3abd0e37fad8c0ea3dcf16671305ae4c686a6dc6d765194ad4665aff906097c41b6bd6841551344e2e1af4e7496d779363a16faf860859bc52d96e73482a26c858002720497d28559c0f2ebd721ad6b0faa76343cf8f61aa072d8d769c3254018fa291195b7a23ec19a0bd4252da26822a853b3df52cc6514f2062b1839c2ec022c512c97a02a38b186236e4298742dfe13c652382d02d48404cf27845661c004968b0ecf2bd56498e8c235374df3476128421d64c85a4c8e80c25bc55a90345518802130c1e8523fb3ce93ed7a03d327943098fcc67e06b5cb933dcf5d234d0b3fbcebcf40ef5bf093f39f0861280cc40bfad88091bc4c57e7ead083a58f6e41fd70b7e6f1e7187d013a5dd874ee0c2d0c88057b59ba0829c634fe2b587296785382c468f0dd0377907e3e7099d47ed86bfee8b673183aae52684e6404dfb45697b6114c9d3d506bb63752672b9204a2ba94954e75335f5cbed7e19e5d73174435d7a58eaf5da41126eab1d76674cfbd757f1ca9148e86d371f210af3430fa61d5fbcd035102eaefef69938d14a2ce591e9f4b81bc451f0a78dce72298ae386a44e3b7d60235bba3202d78c7430755fa5fcc6770eacbe3543c0145a918bb896550c9b5789e27260f5b7cf3adab5fa0379d16a93f824c1ae09deb7ceb13db333fcb8dbfc6fac0055fc320962106a96121c7f9dfc2505cf17f188c13b7f4f730e0d233d5ae9218a0850c1451b460194a8b0f81d7216e2ab5d9a19f007d7b34b01f252ca3ec2b968c261c2a65c69a275ca672eca32c163f7bf6b138fe1f4e082d71a1219c086fc9be1089987c71c9b43a54e160a3d21785195d4714663d5fe45c4012cb98fd98f1643d7111a439c44316da13efd9399eedc4b2093acbc5b99920e4a0f74edc34530a5937b0f52ed1836d1b736af3d2fe4834cb7eb5b84217c4a697da92caefe0ba53c54dc7d4ee2092d98bb2f968648f850664f6ecf8dfee27b56135ee42d9bd711e2daac876605d714d2c19478bccf61ec0c3571df7c9cbb69b7f711113956148913279889b2d69f62e20077ec27067b79a2d814973cfb8bf73e339a9dab56401d426b7f06b564f16ed7b398cdccdbee650ca85e2c87656bdee21b44c9fd2c104d4b272d864d6dbd8f7adb58cbbb759f955ba44504a85cfbba7d8f0f3272bc85031f46b1d38eb2d6126c1986f26396996e2141b3f3c9366dc9ece4dd555fa06cf2446cdcafeab1123bd64641ae94c0a12bc890c904914d9d2f42416b3c6f5beb3b45d2f69a2d1bea4bcd95e126eec544267f503dd40e1c4b94b15f7229669b67a3509e95d794f6678787540534e208aa4fa33eab85e9471412821a1b94b8dbaa1c4e2641a0775c7b402ff8f604f857a2906b43c5e0f036f2255a0ac704555f4d0d10f4d72811fc03ee9bea447589816b9a7bef45c707ff26822c648af49166114144dc262a9cabd89af914d5a565d3019cf2649fe9f4e44beda31fb7df871ac9b4de237d9f726d165723bff96218a3e6d7719c7096e0501bd7e0dd19b54bda7722becb668f5456cdf12304a1d97a53dfb2fa69e1b6310f0f4c5be9ee5680297f878aa7cc3ba59b1629d56710e4799bd7d6a234b51039e4edfda343c95ca8bf1bfae5c4d061cc96d1933da4c35b83a8db30fc80021e24aa0842959c17e4f852f1bc872c0a72caadc6dcd9c2eb583f7fa7dc9fa2c7c004d4da0f58aa3086113d81c981979b8df1fc1c0dd091460ca562ee0859a324b2ae4a6af6a6531ce1f2fc0505ac1b99d467530ccb65543d2984822b1dfad0446e562d21f6259c010919f8e1d5a4843608a332a6e62c8141ec5c56e691268179e3b02f1d13a20f307d66cff09ff141f734bdf958468a9785a49852d5037478e08669831018b62263b1b4db69d11e092f9f7feaf79f95ca635e4fc7a950056d597cc5e153d3d236851fea71200a44c4697bdb4ea0c7a33104eecf392fb29a701e8f21460ce579b722413513450f68c6dffd29e77d9608915ad3d59a4c06ecf120d274b80d58e2fcfc869d4baa14faf159b2956049d52497d443c7f09b19d727ab839b22e76d098ec8eea8b6de9f421a760ec2780dea470c3cb49a5916d8f892d55c2e80dcd81f36c695af6330732ec7be6606b2c25ae39ff8fda519e36336b653cc782123bc28711e9bcc64696d1b0a91db3d8c34a1418c0ee92dd5f6cb38551762afc2c423d2d004040876494d080327fb15780b1e50a0ab5f03bf150724e33769d39a270219bf86e671e568f6e918fee86721fb570d4bf23a94d3e16d9e2fbe2fe579026b277a9297a09e1382948dbea2b913dd2fe2e7c537120465be777cdc90845b60cdc3454456db3333f16495fce3573815632da6e85a7f93d2b8652a1eea47d6eb5984fb54f45bf16f0132fe7cf007baef3f5dcb7ded5f66cf54a2f4c7a45018b92a142ba24f68a69e9d50cbc3bcf2b2cbe7c58f43b62918e5d1e9248cdb510adab4919356f6653b52d8d429ed5cc4e896db00d90743af2b74d3846abf0a9f7ea3c14e7f66d34d38fba093344b4e637a46325e8d78ac1f037533c7bc1f93110c447d9acf591aa62aeb7e82b6a3c22122545e6214127d44faefe93a9e8f0013f00cb161dc5d416cbbaa686890f55a839f16694497449759133cb9d719b2e8ed9503645602ca7117c0118e4034d546a5e41122d28be07205781e16d7612c11c8a8263f4c0998fd93f968fd53622c3c03389cf252c2ec51215459357400c2ce1abc1dc4745764c18e679d380112357f651cb4d6feaea98dad6829c083b10873ed5b774863b09c4144ff56b37e8b51ac5b2b99fa652e298ab7c95f92c033b2af3f205f4e733493c27f36975c87cd264b482ae550df8f95982699fd3746dfad6b2dfbb1865022fb9a62dd5b9abfb9cb0d0f34cea0c001172eba857fda7cb010e9ba2e78454504267528e18728f5dd7e90a5b67a18c4202ad1601ac78061b39d2b51115ebf792d7d093614e0f9e90c5f71b34d377f5a09ee723c5ed7e4ff0849308d95caf3dc44d9623c57f02dc931b9f1c1bdfac0fd871e38c8081cd1c874c6c8d60c5d150371aca07ca4debd098d1aa70180a06ab7d70b0c6cab5b2301339ec994eecb5b58893ac2c006bb6e1e3d26e848925475d68e11b4a5ff94165b34fdc5077c280b444d4862ae15336c6b6d8343654581511e6904ba4c5134d4b423eba9296c60100a39c262d7c6f169b8f2330a2ba08da724b05e2b9d9762cfabb0d2d3f74651ac6818883b86a23b3cf8b894c2663d76bc009382f4accf0c80597f2ae867a5296ef0e488b1e09b1d30f5da6f90169db862e15b4b6e58feeb7a5c4d7a65cefe8f8299eb6cd4c4cb7565a02a3197fdadacf32f12d01f77fdf8ac334931c3eb54f74d484c398fe6b33b780256b74fc456b98b05b98d3f8b0e238b159cf1bb391e5a8596a43667f6da035e76fd55103d97a92f2de7562ddd53875b9f1d35f6c81431eb617c611e8b4b76fe969f77af21564b190ed37ba8913772798e14f5a53ea35423f11c92bb04decc6816326825661179e9b934f75923e2baadfd20c49f065c8933d49b91db8b280df452ab8281d6098f14f848e7fc3226df9337f688e4ebd25c2e535c1d6a9f4df25a2d9ec24f7b6269237bfc654a7499840e87dc7bb4344fc0c9caf1e0140dab830c96ad798150c138665eb911badf99a11676bfd81cbae6d470898c2cc3bdb517c44d55e8e745e4b475c43e82060108fe8e0aa104b7bc4130bd2d0b6a30204e97d4d51b2fd12ca1243d0f3917505e11ed4f53e064a2510726455079d7e12e6cf1b6fa49dc6537a121ddeb36468b6255146899c652fb24966679e3bb10a02228ef31174798a5965d9d25ba47eb38290c38a7948add35bd6ed49bf9a1e4551ee1dce3bc32206f3de3f0085f9c2bc436158f0951ce7e8ffe2df557a1733bb56350dcee7cbe68c1869f81a224534d3618d8992bd825f1f0323a649431ab294b0749252195ac0816141e7c9c94aebbab60c54f59e754621ac8d8b601c4f80d53b36676539af3a5af23adcfa43df0903240c901614590af7ac93bde5132e6b358210288be522cbed73d6abce4943250ac27a92e2c5de68bcb13475258832ca2c9ba6f0ede6b53d8d31ff4ff0b2cbd61d9136529b3ba4598841a76ac1ed025117360aacfcc2cba03561882d8979662ab9d18ac7d2c523dc7283a3f86e48ee725d7d716071d29724cd44c0e33be441f2e5fd017a207bf5218b341ce8aa195f28aa23a8b592a08a996630a7eec687a5289980d92ff03a2177024c18ffc42087baaa1480b3446242722241802a9bc0abacf07086d0bfcd7fd575de02a47249029fc1374a61e7229caf12206dcd2b9be0fff32e4462848e2a57d438eb4b40be41f14dfc2c4aaef783913346c9317252948c6e0e290ef7be734cbf60d9e5cd5186905606b33a86535339db716d2d4ad324f4341808d6bb24ff80f79ad257895b964cc65e511f1834f1c08deca12d363ab53037d198d91a5e84351de72bbafa5e6a43881ba60d9c9390c9346e4b3e35168ba36ced973f09215743279593949f00ac0ac7a4cb8e8041bc9c58633d40ec0fb4234c22f1d1d9322f2068edf76a34de6e7efbea9c3e4bee85ad2484c7ff115ec99bd169acd9e5c0b9ae5e52749b9dda73fe00d732d25b7bba1d8daa9371f84e0969b5ff073fdd0b5b82c2d0832b00c2612c5471d0f8286bc9050adae09576434d560bf38aba4a4dfd6c5bbd78690f267dae994af6b8e67cb60b751fa04b35a2f1d9968b5fbbbda40c5c8713d7bfe3145453118a2ca831f7f827dad29ef2ed1661695ccec4864b0446e12816d02b4a73823a0464b9792106c3c3809bd9b1dc5308cfcf16b1a1dff0b6ac47fbdc73d5de85fa43a4ce892b980d77f22de710d957525d934b837825ca8fe66f2baa3cfe45fa1dd53b6c6f3713e6f682a52a38fffaa45925bed648a429eba91fcc632d0cc8b5d3e702264b7d191f7c2c7b6ceda5cdb748bfb3778e68a1b1d72064db20f4df205c1181a9ab2ae1ebfcd94710f409ea2ec48ae6a79d83ad725b01878b87f3469e0be538a5db9c176aee5135bc2bf2e8dfa4e195771c754361a52c5b47f29116220897f7d41ed703970302775652594f33e46825dfd331a2743214b038ce531e420ad4a0c16c390b0c84585666fa2736f2eb420152a5232915ce19df0762b20bc686302e2269d813ae80c994a24dba9868aedb9948d7c9bb17726c870c2bae6e27f02cf043d7be0d7071d47924eaa047ad768801ea9a1b7f8c29a60fbfc18b36d73400865b7d7eb04c842aea1b407506beb32403e400df8ab6646d098c3e92d2dfc4290a3a56efb5b82101b91b46ff8805fd5da5fbb341c64aac9a708ef3c476eba0eeea7648f8ab34d5523f05bfb4ec51f8703e2e9f36c5b4d2ebb623ce7ca39ce517a5244b1377f303e99f3a160988868208c182db0f276bbd711ba5fffd0ae1b8443260f31eb8e4ded1863416e9b7b79f515851a1f4de9165cd3a76cadac1d9b5394cbb22614a5d1c1a9a9830fede5772f39e15a2a843220a0533d94d7c0f3bf00703d2930b623fb90705c34ce2af40c6c0610820069915776f24642587115de4821ed44556ab086bbdc6788c51ccc4ebadfff9a9228605c9f4690bd753df61868f39abf5aa4783180a1ce22e6942317b671992a60dfd3ba7186dbaef1b4bdf81ff0ff857ecbac39ee93fc04c118d58edd8eefb3d86da05ae8664d4726d0689d2c855024d1374e27eda0b17804ceec28fead81514c3a7438638fe0120fd5bbf698bc22d244472493220146ba02cc9d422c91257a41f13697f44f873eab99772bb0059caebe396b3e34fcbbc7860f7ddf8088d1c6e763e13e17f1188b7bfbb13445186d16e77f6906f4c25626025f7f0c88f82db4f326cdaa3940b6e7d12cc56cdea9700d8331495dc52c575161235f3a930c3397e54408ced2ab02cc5b00a02d9880b431f52bf23fc574f8a96adc76e7c46a3f1e6eaf104f19adb7051db6603003394fabd176dcc7f7f3cde86bb3d5a3566ab422d7ec14cf41df4bd192f63ae0ba13355d57255c928c9af343ddc675c721db2653df0d2e6700ba99b59be0ee156e4010e8facb38303d5b7a8b41053745170df10f90d48b77fea458ec7ee1cdc243d5c59068b60bf41a5a1a4aeb16c111470a4a4870b7a416bb3848db4fc840f519169d3e26d336faeae92c9e5523149dd43fe25563260e9e25e0cbf87479fbf1085be2021dacd3f8a12faadf27f6432a297f6178de8b618d5a3354d4a8e3cdebc8fe6aa13e766e45f6c56d05794dd010bb501d1af6b800ed835f44bec1a46935d03d878c5b2d4c4fe7339e6e5c825d5a9bdc51fb3b10cb1e69d782b6517256f88234e4b48b8b98ca80b4e0a11dac990b01b095ef664211ae51f9a25d6b96a2bc374d12aff06b29a7968597982270e99d1bb5081f1e8c4b134e3b442f96b7032eaa52cbb87e9f7da6f147e13a54eac8c7abd7f8ccb6f9b2dd1a5bced81f7495127c297e701041851edcf9ad0cdc87387073a6615d56b1d50a9ecae7a72f241016ae2428c4f4c47b1a59394c678c0983cf13999ed8724133e89529a30400edf4fea234565071cb4a425dbbb6dc5c0b221402270bad9f6e2352ee79d8e13154114833f3f5426138b9196263432f903d89bc642647e85262193ee1b75e38b2d0bebbd2c025ba24e379d71cacf28de1cf3e0933268730b8c59cf9ef02ea72ad8d969250df7f8d7f233e90dd6830df0eb170b9402e831090c2c8a05e8804ba4952325b1a06ce793ed6b1020ebd867181bb165551e16045d8c58f1d888d0ee8984dbe16c0139acdcdba772818f50e1d8a8cf3ed708b47bc44859b9a065335d2e7825569018b9d383c00cfeaf3220ba2d5bc6166e1174ebb41ef2fb5407aa54c0760200bdb22e82f3e6503bfe7ce8f107ff4ee8b199ce2a4ca31c323f8c466714adb22484769f6e1877627089f4eee885e72b70275ec7edcdb264b33265873f8c7423f9f284c99e524f65dec1ed3a5e539b1b53c20ea42efb151c4c030b0545f0b3b6cbd240dade7e8c2c3f3c5874dab981d132c8887c827c63f0b8741ba9b1e248fc6b93f141b33410a3ed005a802b735df73330a581216cf6bc496c53eb63b8daa481eb5eb567e842853f2b56c2640f0538cdea68e0642b460339be5534109a68e08df961e4dc2771860632e772c9e5a4d6f96ef8dd1dd087e805f88ba01668c3d6a854214103050502e297860c3231350d34306a306ce9db94f5004aaa2957684b60ac9b179782e7b933a3b88605954edf51c1852b1c1da68e7a06aef94c374485b0979e458edd180b2beb00decf97a27db6691b973c4759cfec6c6cf23f52f6a1b16124c8b5f67304efd6a72edbee16ee760d6ad6c3169b7e3e699aec2f88a239b5f4fdfdc2fb99c9c11e344377412cf6cd27f3098ee482080a5fee3fa1746080c78aec7a0d842de9d2ff8cfcbc28c1aad415be8108601c0372226b8a2364367b89c900685224d3f045a00c3287bfcb261c3e97e62ffe977f27ae626fef12052c8d81a8faf0aba921d5d46578fd4bc1f9535243aa596badbae223f219a1dc0e1a36ce17d0c510889aaccbb46a4b678cf5b95ee0dfd6aa7dd36bad1a25f00fd8acb4fa56bbf9b3c9c02de039a7e7980cbd972a87a74a090926f63ae8f5e2fa5348baea882811be4d80728d724526e2320218d6f7c9f5375ed64ebddac4303ae2fd09049c5401998b7a744598b26c272fbd1f96f8ea69142ea06f3ee8c32fe87aa042b0fe64f069991a879ccd45b3bbd921b0457860d6ea116bd1eaa6a5ad41891aa88e4ce927f89c1757a82ab9ff53a0f7876e39efbd01c7a8eb9d7a4a61df5ed59874e12b9b6aa3a11174bc7dca274541d19004eb4ad1f3b1b4a0b92a5029e1183fdbb97d479cd9c7e78062eb6ed500d9edaefa04388f88bf742e1c7f2924914c4c3b1f95ec45a64bc7e4289dfeb62911bcb95006453c4ec56cdcefd0495077d999e64855a30c3d74a007868468f6c579f23b6763f756b4b005659823c29f0925dd52490269896e7aa8575d68d5ca5635010c4537c36c0d9970290d9f207b8dce77512e722410b7b97e6bc1631b78c62526b57fc64ccf015d0865844022c0ee1f77e51c16b6d3ae9d060f070cad2c84141af9e47801e8c4c294d3a71193397e1dc792794dc84ded4b91dd98906384acbd4634606b5f4eb98f8fbba5a9f12a92de817f10ff92ded17425a1ffa528e6eacaeb310b3d4262f98f108095d5d3bf77cfa03e6c23c8e6c9dd94615b73c9bde166757d7cc7c22a0c0a51700834f8f3aedf90b8d7182a18085d33e8c420e5944a4c515132e8bf085d629c1a9efe65a2ef29ffa8eca599d683a046d000cce616a094b94217358b4465f21493fb8a4c8c5166db9991eeb6a61c96110e4723286e331c7cc916630e7c3546569acab7f02444fa6f3e0317d00ebd5947e981d05491543660f2ca7604d23b4dcd4ffaa18f4c0ec07c9ed5cc5a50b3ebe321c3aef5c97548de440241573eb23dd8d18b9bb38b95b93d0854d29aefa79d48ea8f6dcb906ea299642257043960132230bc6d30d9ecf6f17abdce0b68e30c9aaa38c72046c8e14dfc6f5f613882a454e0b00e30513c0fb261420ce1b4fec51f468dae53df8d6613070f144e63fdc2373949834d461584672e7da29ab8de3fc60be064c6e661ddf77e9a3453befa9f9bd6dce5a0e5f1d7ca5e1b750610a5654e394b43fc31ac3368ff50c1393d540282c76b7a68eb078ec8f490c9072ec9d2438502dfe1d2d3303e334ad604c86bcda886b4494a146db00b7eac331806792917fc15ece6334897b4165b2e965e01f5d3e779e05c6ca8d9c4eeb8ce984c3814bd7fe783c650e3af843676b3d9a9a527224aaa8d9afc92aa837151af28b05ff5134252e3f3fc3a8d9f1c3e7da642801fab2da9f1b7aa940715755777299dfc7ce7bb7e0425a14c501d3e0afe9b608d775db3c652858a640ada48a7bfad97b9353e2515c5fbab5712e8adf1db1cb5f91883e5587c68c29199597cc94a7774613643dc3880b705ff1e8dc465186d9e3d1c1b9ef8eb505063a03c128f959b95f434db491b44ff7c9af0963e8654e101dda3ada4693c9d1833374545228419ac38d8100d7a8c48b317a82687816117037e74b375d23979642f4b49a64d0cc24a8e1c8a061813c7caea5e73f7c38e264cbf8c4c363e4642ce7783c64e31acbc70f36734a008ac6ef063a03c05521c53b33225581b9fa47666617dfa37252e8399ad296b5bd8572eaeae3d908e987b89efcf7e064752a9e688d189f903b7ba449b2b80064c5e69095e554ca9e7272d0f13e093c06ca5f025c62133597abfaed541c3c4302302de81cfd0e0f1438de4addfffbaf8cbdb984bcf255e647815e6a06b444330ce03706b2443516bc883aeb6318086118318f1ed1d1a663042c8e169dfb9d2dc1b0f3f904e4d0092c652931cb3751ee093b073ea65fc86aa4377c1ac0f2b67859579dca947c39ee2260d6066e9ea46a295986970fa11ec2e70eecef87115215c849e5cac6a2ce2f210004656b50fac995cde4ef6a17d6afe4fcfe5282717d80def363cbc0c06c119570a544e5cb840ba1eea5d29cf81f92eceb1d1a5236a2f34bffa89820e67cb8292ce4b4607688c864efbdfdf185817f2d62caf051a2e96a4f20202279a5bc2df8bcfd96a5493a4ba5503bf4badb4a46b18e9b492344b2bc16f8a24189f00a8244a2b84834ff9865064f012d4c3330273a61956345edb23b1b024108510d88669aebcdc53f3aed9acce81d10acb486bd1039e90e1e2000616aa0bd7c4f818e6d164c1afe7a4f3aa4e36fc8ec74622a1abbb08a7a36a83863fc613e99cd03274252cff2cd369cefe9954ba0800ca906083719bc17fd9ca1b1b433d6b1567d0139947ed649009007392679679cadd3d75551aab91ae5290e548509187caca0126c17c03f0b4460cd22b05094226cb53a573cf2bee776739c7586f75b03a46e112aea3f94e17be951b48c9e75e332b30f55127a7fc9ee24282780007cb6673ddf50f29ca1516b1679ad66013cb6d372c3d777673c6235d1cbde46982877b031b8c7c9d9aff921a52b64eae0d841d068d3cffd823e5355d8223ad21ff5d650048b4b881890b132c0c7e196efaf33f68e031243e1d6dcbe619ea71a52d3fd013c976386b6b0c59eb92aa21e74b2b856373ea2a9c41045c4ec77b9d4166266afae08b86edf7e7d9fb0835315d0d4e9ada95471a0b0d59d9d22a1e41eacc550b8371468d931f0b83c9e0d6fa2bc339489e16989eef4b042f9e2b7b93e427c60f11883de2b201df74937031068af885b5b41e56da96db59260ecaf74225eda7ed606182aa30c20522576e526591b6aff2ca2e365558ed1cff0fa589cc3f972382053feddd48a7df43f85291822e0fb8ea550a30b6302a9a3a1b1185e92edc56736ed865b511f0754231eaeed33c8471d71523d01d084596ab776de230004eb133f162922ae261c2c01f805a249d45a43493a652813d5bb23a098799558e6b08c10f61f3f2159cb856d878548c7bbdb5bb73602359d5dd73ee86c69e483d14e550460046d6487097e4e716ce6c1be0127b24cb98d3bdfaec6b2627924cfec0f1fbefe54af4b0c8068eb7cdc3088fc24abc70da698e3fc388557811ffca1541d4938b694892b0249cf6b1744651bf07379b6550e9028e505b9eaa1b9a55f2d687840d74a527e9629e0f3c3857a851d659293e335fd0b90ccb228df2d5f093888d918df4dbd7311939c593768eede5193b33741c1c15ed1c55b968bba4b97cdf0f0665664477ab70858010bf4488721a79d51f73800213a5eab727b1a629d44fc39f286edabe3ee8659cc978a985d1883d1e1b5877346a7e8b01baeb562b37717820b4576fa7c56b87ee5b35ea4378cab72f7bc6cd30c1da082d7e0655969eca73d8f73a438c2a0062a0ec5a3df78e5638cbb2d8c3f0f5a8917bcdef05b348c47f019b669d10f2f66260584f84b56bad4c2a23f9eef412a0fdff1de56970b48a9c5063c345ca023c61798038ab592dc3d52bbf8f943205016c00ce9e83c1993b49d8ca924ffbde038dbe8748761fe1695a5113015fbd9faf3939f75039189475deab113ed224ab62f9c71caca56cc306a28e9ef3b6aace1f459392b34db0485317612070bdeaab30775e1f856e9de949be4e1e34a52bd28d40429d58a8915fccd2b71ba4864c457f00c3b36ee83b2fedea0198ae9f3b8840e2a3c46b1771f7cb0c27222dd4b9a259327ef6da331cb87ef17728b9a6eb3d61d437d117578eea2b4922f3d3c162d08cc10ffd8d3ccfb0f338b89cea0fcc4154d0bead3d9d7fdc66dd401632aac8716eae910c7145c3daab59be8ded10737d23a3e42e4e73b43be61f0b06a75d013e38294ec6c204dfd53e5c9e3fbd57382750bd81604cf1bbfa3d5f382a1c9fa6229d3da5e3878067de611a44ea650177b3d05068829148fb92335ce62759d3a477f552db69122746c0d2dbc405ac25bff71e160bc766dbfba1f48c39997befd143d7ceefaf3ab1224dd91cf905bca3bad36c7bf956edda6a1c3a904e754f29d9c046ec5595b06185c6cbe01eef8af5ee058d2e9117eace85fccc8cd02017f2ec48a6a4091c4accb087343152a1320388ba3a72d932d12df94e4a1fce64ea709176ca1c0ef84c37a026198ff176eaceecd1485b9d43826083e5e8e6ca5e27b2c8f7e3513c1e48cf57ac53a9755762daaf2f20e276255677d15497e4858967178d583cdc7a4cbec1a189d9290c0cc3b21498b0d1e31be70c6931f38f1f049c48ede75fc245b533ce54fb6e40b9dd35dfb4a9b3b3e2ed89706d01e3b6fab5b4765801f9f0254666819866ed776192e808d34108c0ca4b7ab30cdcda02e7ae48bbacb6ab21e7b024bce21c3ba943de726fe1f32b6f2463e474116757c0d4122c779eefc00b0a76449d3bc1d87c918825c52fdfec4a941ae9dad6189505fa6d9217ce0a2ccf4e5ae1de44c18778c129868b40ca430a304c531593a6107c0182125b59614f90276184afc8896702266bdef7a2b3e00274591d0dab364607f4034a0a51ae4297a39662bd87be147aca538b752bfb3f873cfc60b021b25740f62ba3343ad0f561b8b1c9c0331f2a292f516b4b1fe29ae68a51a3e2ba3a9964c932c9108f0d5c9ad0872207157805c6ae7a441f9ac09fc0ec3df61e12a73147abb782e8bb07976bbd5784b8917dcb4a611d66ee57424d21e7e4d06c8753c83bbe5b7f1dde6a8b50d19dc6a530def01b01ac2bdcc67d8c54a2744fc55644e42efb0579e4ba44c9e4245a446c0e64e736a7cdb4a5f4cfa2e1263fa4fbdbf4a1c5b8f42c5fb14bce848c0dc7dce04fc5eb2c0566f9c61e398dd007cac3af52840c652235a22180166e150a779ee6f64b2fb7914d8a7d1af8557b7e45ca2102d50bc329bc43c9fdbad4dc48a0b9caa0e7f89acc54e2f227b59b9814e91f12744f0de09ed58f2c75989d2116089c42f661eb23d44eaed725dd7e3cb0a1a5718f35b40128c0a7bb83662ecfd4415024018988fce95e0a75337d7cbea5e6851ab390e6ebdea268ab6f694d5730054690f191fbe58f024331d52388c87d57a2047c5a1505ea052f1c52bc72224c09fb3c5aaf5b0b1eeac00c0e97a5bf7bd4be4f75e1af55df622ba284ab087fe3489914d5c8292f42f785e534b969fb38b093b8a4ec67144213e37b1031ce2e26d41eff833e0e6029194e8153110706ad6dab103240cbf07ef4c94881605b9d1f0c63d354cfb1cc2013bc5a66b484cd134cf721e89d8ce58a1ce0b2ede04cc6f7ca0d0113413cead62fcc05f9025884dd70e434e9f69ab4cda7ab07155d79db1a734cc2133661204f08bb1487ce80eb18c0ffa1398726d20ce505dfa75078fede3bf363087e36beb2458e1c8edff00f4000032937ad4d819672f9d9f4d89284483134120da6732490b0f5f15a83e8fac27aa3821844f30657bce3ced7b63873132d44d0d1b06b01c82104bb8f3bead1c1314528383c22f48851485fff1e3838779c8c77d0d8fd2eb7504445d5266ca456960b3cef41505db77c848b3275b79f6bf4053f21450b1f6743cbd12cd87fef1ff5ca0d6950c7237f7a3b28f36ee69f81632e7234eb415f37e4117f7a1892f439f0d9e708f3c0a31e733aa9b7fbe4bb1d069f3f83d25e0eb99a54803090a28f4ef8907800ae41ec76d6fbabb12ad4b7f139b34bfcdab0c6f546de34442683642a3ad7b4a3cce8b7b8ec6fe33dbb7fc1f15addc49a02c2b1bd77de17ff0cf14a92f93dcad6d57b38f61e2e33fa59eaaa55451c460cc7127af299955fd24fa5aef3e6e12c01c48601b4573867db0f54b04a35045c9a6c1b6d00955598cf2cf9b6feeae84a518e4fc2eb84f3071fe92d167899c7e4484557c3795b6d7044fd08874eba72645d872a6d4d192481fad55e322f569148d4b29094e018156a1f0a338a02a565a86711c06b2dc8589ac39c469546666c6789621a0d728a9fd84f65b028eebf55572a34aaef323ebb2e2bf4a3c974f3f05547a9fdaa32b5e6d4d2e1329b2ebe712432e7f481673357e3f4590cbbcc672a481b837fd787704df47fed247d13547c1b6c362ed53a8b10aafcd58bd3b87fdf89647185e570222dec82f4d8fb41c833f4a4b5850c6e42973f1bbacd5a56a1212fed5bf7baa1981235079aa37ef218828c5e76ea0551366d67a593a99a3e46425bb35db80dc66ae3ec661ab2f1004a43b540d25d39e741678ef256600a68ca256720f8a0a2e4cd34edac883d304d440d4b971ccfb9a78e0f8a8b24312d62ca6cca9d19746dea7a45a0b9a56fde5a826488193ab2bf5eafdbdf23afecb0a560a13138a6d9f28591f76af40c78ccd4162f168742c105d025eb97e70428cb35f2f1f535c586f63e6bea7cf1516482c7339b3e8a5d755c2aab182665814179618215088461cceb704ba84f1609d5e1932c8476b43bfd21ec04f0f214f7164bd0a36afb7372b002bacb7ad54701897b81ba5b81eeaaebcdc6a994f987382abfe2820e6bec68557e55c395570ce9c7484ce884fab7632dad820c959c96a745d5d44bdb0ed3ac5829821f33988e116d2dd7236410d95af9170c8b6d188a142ac7e0285b0a595d853586fdd67f3c8081f4591f3f75d35f06f1146c32c14f3fbb5bfed1169615dc28b284de4cd75df383edfb6b21997ff953e044d574f6c1bf32cee2155136da51e689920e7dbe27b47a31bc87ee7d31a53fcd29eaa436224be091b16c2e8efca9e4e98452ee5288e26713c8535ad6dca01b67ed0f70ff24476f24cf30de3ad746ec4f65ed3fdff5a3c7e4f9586064a43ba3dedfa47a54c48480c7435a4c59e04dcc5d1ca2f73c0eeb412a1088ced1d5f16c82544f262dd3c0d4c33976bb537c3094897a2b4b16f1c00b741d90e190eb584dae58d61ac7e1b591cfe029847df9fe7c391467feb604bc0657a90ef415fb4ab8d236a40e8ca5481366741e1f09af363265103458e98ca5155d968862a5a91e0faf9b04c95d7a2344ecbc17807aedf7ee3d87ce8e555acd4ca14ad07d96257fcbef712c74a88197eacd2af97062650c91c256af3b383645540ba62f02bce83ad4a8b6944f1b73e284cd41ae49a3d80f82eb94c1442385413308440407eca5aef80449ed6707957ea644099423472a2e246b19dc828c64a2eed764e257dd4829b0c5f61b24dbc008678a2e568c23c03afcbee81ade523f5e5f924261e37b7624659d9564254be7dc743b31e4479995bee305cc0cbacbcfe03fcae9f834bc39dce11c72820421ad82a8bcf83285d27255d57ceb775ca220ac48817ecbff2293315932d91d5a8427ece222479946d918313e30b34ffb92eb35ad1aa018c53266dc0e6c6742428a944bd3afa3c085ca06f5c6121be095e1a1c3d0e1e98f4d65a3450f90198729c40fedd014b6a51d9421d6fe1a2ca82854c1cbab8b614185c5233dc13b0b889bd7697a013428e0bbba2e483f0c6f72650a99e033f7fd7d62b0083972d8a19945f5c12f5a0f388023690da03473cff887957a1a3bb407c0ab3ae55f569bba5dbca904d1f98b36d462a0971b04f373b21300549d9624ca7ed83425eef377b0df63130d2928163b34d77669a8201c95a35a33446c6448fcad41e2ca78fc71228eac96a802abc5e3043723b2ad375e9ce41390bac25f518dd9381049cea5b3d9a00193b7ed479509ab342ab2c35e79f2fe17f6f4e2ebf5ffe330b03d0566c706df8e076f5779adf49ffa4009011398bfcd185d4a54f059f45254fd5344c030daf1287fde60908296b24d127e7120ccf90f8c49874a1db369f22db23a33b49f2e8d4f6af26e1e8414d2a1c362393537ca565a3ab389524196fb628492aa161121c5dd2adfec5747f6ea668af91a56afdf727bbd89dfccfa5051a99a2adfa86d8aba82f4914abc3c6678e4b084445b15523109046d193361b47da8d0f5810a25650902d41e6783d51d627316fa4c4040381d2348bca0e7669f23d7f86c261cb42cd0938c8281cb87721dd5af89ce1470f905143fefa79ead92e4acef4727feba6b413cf0df4fd08af973cddbc9e16573e4aacbc88b52358b9c4ba6b90a27bb87d275bf18b692c50479abb2b27375e36f1cbc64df966e611a2fa5ff62f04499feb459cb5e534fc71899a176c66ad45a32f3d47eb86c6bc7edbf38efd09a4e775635708f4145f47362557b7b189b2c8966247a42d7fc7d938d3e56a5f5ae0981e194de97d4e33903835e8929d362ea6c24aa1215ac84c1f0b4dac51a15489afda410a3f8e3e713f59346cb68d5fb791dd6345a41fda4b1df757671d37ab5cdcd4efd77f56b9d8a29bd43564ac79f878a587160e1659913c21d0027f08e69716ded09531100500977396c980e1d48096da4f69ed905576b0ea6cddac9587541bd6af9ede686f7009f4653732af20e5c6b2c5f293bbb46f973841fc6ca901a60cc64059ed31b74fdb24774f3cf10af660d79bc3b413f68b1b186c0a747760acad669227696a9fdcd6e0723f4677dfc6405eebaff1d869704f9f7e02eb5cb814c86d81630bd05accf8b61f002767d2dac8f67f7e8db176d0e856fd8e8812380dc4d86ba74d57a1d7285a31473fbd78d5c4c718774d18924af9bb12d24e4439be95e7f41c0301612336397b03cd21c2a72c2755888660a50f5991d97449e4c0f390c6a206e349d264b450fa01a3f8591f5ba58626585f781de31ed105adb130ac809c498e1ed31b9921cd4b3646175240e50ba88f48f76652710cfb194da8c11d5a4bac89a7e14f2d74174d25a18eac354c698e532dce52dcb48e3c021adb7dbdef8d43758fd7c963a09cebeead004b029020b4aa9ebd223cce76738925f3844819f56408c461955a0f497a082d82a5ed8fa65e0afabc370c7bc831b864fbcceffb1edda4da0016258228bb07b2d058daff665dd4b443066228ec270594e60f906464eb3ea03261acad145c31364702a1c460104c2021a92a1525b3092aa9a0e2d5e869c604bc6be1119673ead7c816061e046f9040e44cfb435ee873e6f490c1bc6dd1736b203f0dfd902dcd218886331cc4b0d416ba6b3d24ecafe8006d361f2d0fdf3fa9b74e2a61361166b6defbda59452269964080524051a0532d6f2e0defadaa6fd6b9be52ca987f67db29123c98548c5041e6053fe6ea492e324372757c3a385a384244d4ec89bd23bec5731b2a4df47b120d7d1abe58412dc942b30e2492c0645aec0903e4ca11f7ea03f74457da6f40dbd418ce904ed9944b3f5f298f9c48c621e4d98c7cc5834f2e18915312aad28703812a2c05c3fd15010114d209c1f10499a27a20d145186fead1c88367e4343072211500dd4ad7141585001dd7030bba6ba36d99bb8c0e20638adcc881574109dddabddd72e6aa6c68cda849412c412c70078c09f6ce1a0a0d5ab1882f7e303c9fe66bf655d83dae364817b70962b1e404dae4ca0d62e68b0877a090fd1c6738c315e793f47010a0840005a5a4ea798180420203f0055adb53a7c80595467dcfa36cb6edfee6b75dc2bdb90bbe3c08103c74479e6a2400cc653bfe2a05e3b0aec90903f1c9dce1029a5095aad96a7382939f796b736cebb47c825b064ef3a4a94f122ca48691fc4b0c598b5a3fc004d9fa62e70249849cf3b11691a26bd2062aa638d46f498dc156023724653efa4138c367e2fc626d3bfe7812ded3577d74ede72d7b35ce0488270af51cb5b33bf11949892170c4c46f621cb1fc207247c08228e88ad0413dbb6514a722451c655c084fb80e405dec4c984329b4c412203fc792bba1511cae6dba6bdbbbb4f27eeeeeebe693d9dcc70164d27dddd0d4e348afa49f4da8ddcdd24d49222ba153942c9344deb568b841e17104f8000a2a9ab628b08b72d6ad2b2ddfb34e188b3bfe725aacac09f2957aad3deedd6566aedcdb239e7edc1284f61196d243e82e511dc73eb1c8f4a2196906354a18a9803ef7478303990c09f71e4ff88400c94e410c4134c7e94183992833494f0e24995263b50c99e71125880234a260cec5e5dc7a532846f7ac41dd2c64794999b8f1d2323520b9702dcc6b3d3c46807c90ab08d1712d2dd9700f2215e89091912c21293690e63110205fe1aa83b49a4b304f1e6044914f183ccdbb65a6ddbcf6afbd9b69f9f86c18036a00de8c379e62d2e43caeeee46f9bd18ffa350118542997050ab5e80638e912c1b33c596b0980c790440fe9ef4c2d7b94156107681a186ce39ace80a5263fed7b556e78ab61cfa46603cbecefcf8feb19f7644e27707e344dc88caf4d384c2f981aa913d189a52ced948f026adb51dd4f50034cfffcd0046b83eada48c43dde5380cc201c76ced47d59c6f1fc87cdb153942a73efd22b448fd62ab07cc03eccf076281d48e87760dc4442be2786afef55ec26a263d643299febd9a660919c2138447ca8d89989e73d248c1ddddee5e4d265694dea49400934963eeee76f2ed9df3de396fb70e14b80dddd7e5361e4f71dd95dde1e81b2f297bff18731944a3537a43788244303e13787276707ebca4946a2740f9bd189b4ca81e9e21a6ccf37abd5e37501cfa66fefdc94866571105085bd048819bf20c39c55cffd33dd13c5faf5773ff4284e773ffdaa5cfcd93d63be42b000adcdd4719f971d3684f467b3ed31673cddfc300e3c27cfaf4f10b05690f5d1d49af07edbeaf617906bf7285e3714096e73492de0c7e85ae6030daf3a89af724edc181f6f8385dd19e68d3b028235b0871074d5781f5941c635186fad015ed915e37a94d695b3ba725cd690308b3a4da09235762b266272408eb28f4977c64fa7b3b98ec118024d53ff29ebad9ac39e757c34ffdaf7f6cacb5d25bff4f304296b7ac59fff3ef9437bbf766d77edb0692298da6f68f4cb5aaee18416441fa38f12417638c479186eeb4ae5918efe0fc781720f0d72cd6cb0e1feed974cfd1d931daa942bf493ee6cf094cb0acb4524b6b6d29e5d0c5d7d67bafcd174db06612168bc562b1e8ac73ce592b8bd537720a131758dca06b1a8607dcdd05969f89cebac635a170c4a273488d0e610f0e8e0c01f258cc81dcdd6f666d76adb53a50332c16c9080441100441d0bbef81e0052f78c10bb2686c80e7ab8868dd97fc79bd0292de8fac59566230980d22b640b067058be56bc59386526d05c114785ef398d3da9f8fc7509fb4326aa88146926622098bc2095a6bad066ed94f89871705d640500335d0ab610d3d951d6547989aeedbaf51dc02790d85748ced6c0f01f2092cc0d9942e7a8cfc138ac09bacaf6a242798599e0e0dd49068e0cb6bf737d5580d3d66071c55d914e9d5b0c50bfc6553b413800059263cc13a413b41e93388094e10c7a816f1e0a142c883070f1e13f45454110905b15a393584825b68cab4a0253d6e53412b9b2269282b77b7630a6cc45de14b4f760debab86d5c85b32489e90829e600bae12bc0450a50115597eb6caf2e512602d3ae109fc45589ea0bbab77c89f44c04057dd22d62ca2277f829eaa5dc41859c32322c2c022ca48dbd3025d1304dd95134a2973c210c70f6a0d431f42a13cefdd9ba1a76ed8f57ef8622daaf8c04065038b104d54a4e7ba3b3bda8551248d51b4711cffda856117b686c814e46fb5d6186dfa7ef62731463e14e9dec67296d52a973f2f5b951bfd80c3fbf54e8eeb605ee07ebe0fae8bd2dbaaf6533b0991de8b2569a667aceba3434c512084f115c697f4f0e5a115973b69e22cc04ff3e7959ef43aa52e7b52a793bdcc600822835b9e1ffcf2949120b210d2e20455d6284212558f229e080334638ca198cac808a66891640c28d0e002062a10b07000228908a40c2154c9c769b564ebda30b421840a3d2cb9f75e7b6bbdb6d6aa03f57abdf00d27b4f0e7e55829adb56937ed628cd7ced0b649a9651b951fbba78746a3c94202a0c0dbc74dd977f453f7ccd0007f35d9d65803ab793112021b42c44a6bd976dfe4a99a1a9295994caba9a18a96907b8fd1e6be719244922412d7e544199d9d979e1eae5982a0b2d2ddd78639358c1a0e306dbcbd04b2e0a04103c510f8eba0c630581bc1726c7c64f9926c29724411ee59bec8f6252637fce581b8fc0d977f71e1be057359b44277c03173bf4589126dbc060f7ca06fb46c461b1de28d8cd23ba400711f551dcc035c7e7b202fcf7545f0bffcd6bd7c919677f9a8721f3653919919126625cb2951fa0608597e1a525a1eff27997c116d74b867799ded4b6f493144958dc72718db72e21e3f90ed6f6c8fb72fc2f2409e7ae960ecbfb8e07779202dffd215297dcbbb94bea593402c8fbba8f2ee01dcb33c9023745abef4d1816c5f2a7d0c5155ea70a933b97c4b773d86e53136ba52cbb7d8f81617cc42727996222edd8fff6a6c743b2eccd2790f9397644275626091419e62e974581e3fee88909e65633945951c0a723924bd5c2a010926e52f5a99400e57aea8881851b1b090bef411268652d7afee7accfce831f3b3c09f048a568e608268e015adc060309869fb0ef2d4f6460108404b0b025e4724288180324dd3509924e18718739cbe550e49d34e6a21e6ea0cd8410f0668811be8477a9f915cb3ed151778befd1caf63c6947dd124ba7b4c85a08a264cc490820a21aaa8fa4d31654404433c31452c0553b470a2ffc66e77fdc8824aa452777bd4b4707e5060d6484f074ad3b6edd6dcbab805333014398663801773922693124331644b4afe389b34b07f7b17060f1e0d88bf18f2408ddc230dfce1d8fc645fe2b4f62db4f6bebd9feed3d35703f524cd7df96d1ffe33d25b3bdaf704a363933ca1838a88ed826c2450599d3b45753b23aa8d72b6470e4f10f88b31b7827a3274101e9c56abd54466937acceb31d6b265cb96ed0d91da1a30d890c33609934efad4808d749f0b27b54a949136db9c7036e6247139d2ad60ae01710a5743d25497a7b08ba7b89fe13761fd7ab9409a98e0a1bbe448962deff21cc96131db78fcddc1bc49729809aa77404a4fea5abef440589ef4a4ae88cbb3bc9ce2b57e4b55c7756e3c8c93be888de71e08e947f811ba22f849374e18dff9f2e2f21929c7a7a5f31849a7a57b9de831f82d29c7c7c6e3af248701491c23f5c8f199ab1e1e30fe96f795a76e48313a55041753105afac05fe8017f1ee26f213df772171befd2c9b77192411eeb60fc08d88f03f9ca09aecf52fa92f7967482a14f3b8f2a9c1260d209e531351145dfaf066bd8b639ac0acc93c01cec56d9fbd57ae5e702e34c0586c2d0d7185328a594524a279d5dffc41831ad95b6b4b4bc5e15a64901f80084154f7c603fb0dae9842309d5f5d303209ba09d5ad5271f31e7a054b6fb2cbd87a303cc13d610318203155684aaec8958e0894a7e0370742e8e245437ebe21a4c9a1052655d54c9ceb456ea51f5f54afb38a972446543d760882dc250dd2ccbee7f02c8b16f240db27c55a74c37a82cc814a4f723c71df21940820cf0b7c20a7d6332b97bcb3a716d96654ef0178d6a2683d4a1b9b687083d40a3bddbbb4dda165bccd19d6443a1b456eb6b57001f9c122263fae50f757a0a223de9f5b32034254a94afc1af410a822ead0d288dc562b158cc63b176a7b1582c36a934652d85d10b562a2259276dc87a50652520a122a2754051a6603f93401f04060a0a0aa2bed303c46bae0e320dd208217ea417eb3c16656411d9fb0df89340abd4f7fc649d5c22a71a3d78f6784c7a289c81fd85c0932e99424157f0e7318f553a3ffa8cc74cb158c805a18772e49039729472b4c1aca1bf02f12988c7e4c861f31715a8240001efd4dc5674bd66e6b13bbcb22f7e70f4baaffb22a24764aa5d442d2a4444946a9853a08f8ac08c9a49148b88828858442051ec75f43aea9bad267ff53582c9c67fdf82ebcbe735857a87c3602f5d6c853bd04a8964462c0b724529723971b58bfacb53f7f5baf1ce4eb2eaeb871b376edce8eaab1ad52845af2d8a5eafd7ebf57ad5577d652f17598a22bc0285f23cfc23f4dc501a0c325c4991cfe93e8b3cfc21f3178fc25974afbb87e10cb52fe28cf4e48f14c6c0dfcc4cfb9052d6d09f9ef36adbb66d9d7692a0c7c8df066005df283f76966559a366a8193c8c5a5174f79095ad567c516a2d0b24f8db97cd89a98d8adc3f24a0756f626a080a311569e8f7a362e9dbb27c70b76eeb5a0fdba8e5b22ce42f366971bf753039dcf630407e04294ae4400691233e20254cc152e1a0824f4b6583ef10aab6dfc04b2e62eb8afcb7ef10aa48cffd87a1903ace89394468132202d6444c86ba85ba857cce3993835f31be876a14eaff9a7e4a37d3368e643261fc52155f7a7cbc07c68508cbee2712aec0440e2084991d60faeeee35359da5f1f3ff7f7384e338aec7f49fa0ff38c79d72c05e698cb1da58a3b5d1de5a63be2577fbb4df6990beb93d363d441b2110f8faae9f5b6cf9e39a544b3992ecfbc959c8fe33c05cb06444193386f020c1535a6232994c586093c964aad7da7bad459950f405240067a450412889a3a3201c77c41d7133c88c18f88b4799cb5fb3522f8fbc238e23b5d06faf069c98b901fe1ec72b7d149e56f7ead62d6a26e728c876062b8991d1ce8e911196f36659b66353033cff33cd6ba3670132f171a43c6580ce5f21cf9f9d9452ce12be842cbf8405d052964f032e65f92513e40926fe67c30df904133b178ce4cf88fcade3fbc793cf53e71756c8f26988ad1c3b181756c8f257c8b29b57f2e6b2e3745ab24f6c94beff562f977153d2e4a8e309eecf5c33c1870926682de03c43c35af83c43bff2fdbe697983fc489596e8a40ea0afbd4f8d34ff9e169023e9051f0bc8b79b6101f9b6267d963a20f307eadbf9f4bd762fd06e76528c9a04e5fa2cdb7725d75f5fc9f74aceba6f18ea374baeddf4c1926737034bee19784a3c259e124f491bd1dd52c62851339d7570f8ce798a4f6ba24c25cd39e7fcbc2cb13c5d4e9eeedd2e17b304c79e3d784a3c2505f82103db7cfa40fa635724163942a7482cc3a34b122cbf5920506ed9ef9dec01eec762f8152f65ccb9f463726e6be59cd39970b95c3f2e4e7237eb148080bf761d491fa9c60a659871c3a377b4b554300ba947c3721fb5cbc5ea0e5d3d74a5968a930e5dd2b340bc40a4a1a9ee913f68fcbc68fdc94202fdc89f564b7b1e28af24c6b5d7ed8f682373f63927b5c2e5ba55e0a0955cb974499794b25d3228282868896b763e9e922b39420e343e7dc2b4e0394619ef605ca06166e7b2771a30659f3d67cfd938a4d0102008deac04b829b5f6befc0a586047c2ca9047c03b0414d241498f10475c45462118de4ac390d69d90ca2bdc098d428ddb368edb362e5efb2a9d418229b0b5d6dad83aa8845784e1d0cf9c73ce299d7414980565162037186498500002b7db2e729793262cd6640016b8bb270c5c6cbc441997eee50566e305c66d9aa575becc79cadf0b6e27bd5243a6300e346e58e81d927bb92207d9b5434141b4deb48f8b8d5597bf17d20b5ec5196134118325aca45114ab08a1080a1654906028062587490fffd72da5524b4b77975a30cba99144cff35848a3c98f36c32543ce8cebc84b29182afad1292afae6fe07573be7733a59ee34220d119c846db46ad87f7dc6abf4f8949da210f0d7797eb75aaeedaa116d62dff4111dfa280caefbfa072cbac8628b2dc3f102c7528e26f0d760172df899f98b452d8f1f484bf738327b232a99754654d7638070e76ff9224c5de089b3d73a1817ee8c949e7c6fd6c1a066505c8cf18e3bfc85f5750c74a28dd4a9b6ef506bc885780a3f0eaea9699d6a260e4274779fb1d7fa7d9162abdf39632b4e4a35ead756aaf558964d8242799e8947e36296e0ed775a70765ed6da2c3b5ae5db4462884318452a1b4c54ca50919eb544d234d831f23f4f16784dacc90289c27649afbef65b3d753859d2931f435f1c9cbf9f41b126dab4a965ef43fbab9dea77bb88629226557faa7003debaaf8b3c8a173155ab98ac269aac269aac269a2ca2c9ea265be0afc1997dff24c1d02de9dd26129a4433086727cb31d46b915421d45282049c45c4d982a924c6c8c99a4455cc255a930548661865b2b844130911914f24b56a9aa6b3c362b16e8c6102161887fe11d2d666d91ad8e6ef45ce007be9b2e7350e5e0a3dc0f265e07e0821e225014a61a525d7f871ca5e3b655d9d2e68d9fb9dcafb38d26be8f6da6b0f2604b605fd8025dab6f75a6bb3cc5a6bb34c6b7bedb5d6da5b6fbdd65a7bebadd7da39e73475a5d7ee40ed68b9b66e18c6418da966b55aad1a3bfe97aa551638b07286ca86bb8aa23a62450024aaaf590de49e6528ecf9670c5469058932f2513ee0f9a68c3d155514c6671763fe89d28b471ac8bac9aa819ac0ab6b7d5c3e8eef4c0e298d23f863a5b5d69ac5de41a30ccaa36a4889f2a19ae8a8644eb96cead0880000000043150000180c080542a160402c1c146bebf80114800b57743c7c663e17c9e39128ca811404310c649c318000428031c020648caa06004dd2a06a464ac8f09b600647f1e9e9cf64055dc0d0005d015b46ae3c67371f197713bfdfb05b2ae8649dbdee9ccd09355bd45384ce990d40c14f2679beddccf3ed39fa1bb737c67281451317d3abbea901d061bf32ffadfafe3347f1d7bf6b1d1a1bdf05678c7c1e17ee736d754aa5a0c15a3a0497f9b0a2b2d72ddda82fd93929405d8d25353d1180db27c74105ef11e97e799336f38e2badf413d28d66855ee92cf8a00d2e2be65863c0c3b95e1b9908e9304def6febdf7d0268ff86ceddca7bc0cb0112ceada910b5f2797d35a2c51f129a87d83b9fa422f51e53a732f314a7ffc2db517feb7459b8da100b46486a4a0f3df000ed9efa7f6c2e8ed278f8e5df97d249eb5df9b0ef8b80af8b500d07efda5bcde292b770f5ae6cec9733567c274371df7bd82654bdbb7c739bf334dc09bf1f510cafaa66d7593c681ceed6e9b78d2829e340def324bdd3022593f0c038759d8532726532a153afd8b1ace34db2492e261623740911a6bf8ef00820db976356254a9becf54ddee116ba29c4ea3ecae9113a78fb249279b9d5c11905bc82b4f10160ed164ea04e48e183ea6e78c9a83f040bd8526ba894b92e2da274b92becf0088e7cff7802a8cc4db884181da2e48c863957ae3a52eeceec8ac33376733c68ba646adf64753c97bfc49690f22904876a6bcad3e01dd26c5b709b538df215eb30902e827d47e9cbdddf109bab7b25ff7bbd5cb5af2652bd9359fee57abd9a62bb65accf31be6a7ab3c06c6478cd078e81e3df635f7c72cfc0bb264defbfb403c41594d4205752b84f5297155f0b400e79403b017d8ffb0d5c228c2a7edee8e180508c9d875148f449b61f08815171554b1668cf80596f6b01398a4ee8d2f3d7993981ee27266494aed7801e07bfc4110a2a5cebf896c5185b82a0016919e01e650205e6980edbb1e04e0b6357125ee147831d4f2948025838fe399430ee86dfa4d345d0eac3c51eeb291d8f7baf47515f80b7324e16e9667c420804a3734b1c7859e505858addc6748cf239124b9771d464f56835d630239cfd6688cb9321266d31206041b986a3eab11dca8cdd8963f5d23a60738cfd50b0573dc8a9d0358f35880f35b50a87cc1c27f1e7f9a9fd84c406555e86d029569d5935c865baa0e1fb9690f431248c7449dc2bd5c7bf6ec921b45e7f4c9b2caf1b9917a53318db3469535018233cc54d51a66c07c9c7f1e75159c5e39ebea7bfe67539c8c6ffb6435f0c73f5eafc7ba5e3703fdaa8383670cf9f2daced5da8b39d2915e4f7a233b8e7217f2523063bb659d9348c408372b815e7b3ffe48b405166fb9fd6f636aec7feab6249a73527e2e230b3614b2c693ae22623cc8a4f4a109e21d9712e4488b3c36db2f7e70bb1fb1f90c2c5f87645097029352ec94867fb3244c7805a2c36ea410816e299ddf6922594964ca6810ee2aff7176279c50360422f91b0a5563c7933c7d9e6a12e8398c6a7efda93962ad7d305053aa413c354769b668762fc532f89e95413d65ab9aa7f5d5b14a75786677e32894bf169f98645f531df36c534a9c259990ad0cfaa2f29041414d2fc90f26e44455c4201ab8c3f7057120b1e216add59e1f33306448298fbeb39d1fbde3876d5b2a60fa447c1b0a65da9f2aa38ad5066a015759013236c2f162a7a6835851d8ad0f47c670327056ec36ec8e1ff095fb9ab11c0265dff2765ca5a6a2f858a37a660d7f55c5fb42a3a0ef8463ea5e6ecf66b68e2d1e3e60615180b89805f7589cb15d04026f8d1b7e727ae579c690022ba6e0525017e3ebf07c4afcef3ee0c9576b91e6ed0a93a0e3f8e423971c29d66fbae4a09bdd28fe6d1b6494381dbc414056c32add70a552694337a7b48536311f24dc35bf6226f2f03a148e5f325e218f166847a913f7a2f9626bae819a6b3077c914e26f6eeba0b4c5d1e3ae25cb91ec1a431cfb1683304d1c5049aaac9ad047f359d2f52268a3e5c41e3e206790bbbf70ccc01af1dd4f58452ad6c2ee73191090d0d6de3c59da18a11e84bcbcd27c6249a07360b18acffc0b58cb4f14bc343a82da3426b3fc9ef0aee02067aa2e07be3d47767c588882fae8b1047c2520258bb3df6c48a51c6de904a3e335afbec94b96e7b174848d01236a07505111b1c0fb5dc9e161e9c9220ede0852bd773968905abf80265f368f3b9ebe813cd3bb5a721308035993e3ee246ca5c7d76197feb5f771bc0e74dcac982ca1dfcd8e5c05cf9325a2308edca7a37d7150a6b359b0f84935b05f9a43646c9130db850e8b1ba19f23283b8f6ea3e408560a3a252c935f1ccc578f692b468bef7df18d3575432603b07a6ff962f03e1a8339b8c8cbb0e24eb6761bb2d23302bef047e1774cb33aac4ea3d29b69ac59c739c75768302ff62e69a4447b4699adf6934b873f80ec9d035e8f723125ab7b47c793d97ef4850cfa82f6cee595a2b39e58b61660c429ac75babeb776ad129469b06e824e119a686c08626c4c4f1cc1f4a9410127bd55f9913c26e2ca2a596e82c39f71c102dbc55b96bfdea1c2026bbda5af917afe8d2aceab72b1e4a209ba130b5ec65090745e3d5e66dcb9038ebec4162607b859f6d4f287259beab3f1c770b928e0fe9bf75e871502083db3555af6377ba243786fb5bb47facec39bccc74044ff29e6aba91e31572ca5d72ea4fcd148712eb7a74b793464e40a25971ee6029f569528646d83ff0e7ea1806f0000c8f3483ce2890c772d68885d8f10be6644eb2c0f3e2333d444438789f51cb444ca441f15d5872aa2122bffd65bda15ed204adc0ff8141dbb65648a9f59269fa11b7893cbb4fd40f400473c033550d138c13790781a5b17867941dd7258dfc31b550f514a742cc36235c6386715426f6f13dd82e68232bc6dbe8815683326baa3dc18d01deb0987b7d4920b366f53ad6661a6eb001632bd525455678c5046d03eecd3a85197cda8a9fbb1888718e191bc130a7c110a64b48920bba234842486ec5a592ed9e7788c25f877c9a95f336148a180aa0108ff36c2faaadf00b83f83b9625c096a9c12f6c098b0653991f5edb76fdbf2f5c4dddf9db6f170e7dcd3beb674c195f9ff7f993cc24d286b4eafabe90b5c80b2c66ca371640d969f544de58bcc0a499c5a6e60a908131fe08f3485408db87b90281787190a5faaaa234d5c5d90453515f5d5787a21ea00f5aada7a4b828aaa9a08f335f110ff80046489e26aa7564365d6853119dc7cac47386fa73d2a82c2e92806ae20697fd527d85229c17d458154f0f2d5a4ec292b5a546bc8dce030832069df8fd0ba412691fd9de1f5bbd4a896952409ee8048250747a1f0f13fbb3bb534d4c6c31c6a4f11a484535f75aa999c52983f8ca3cb9210c2edf27323793d4964ea3c69e0790e5aeb36360111f37f7c59df5ef35eb0dc350232f9b56486c8f5698b989eefa13897f35f8af273e5e3ba76e97017cad68c8588eb615c3de6cb878626a9d623f5ddfb3cab2029fc49d0cab7cf1f92aff1ea4951f92295ea31dec8b159d15bdf23b0a2dff98aaa749a319c9fe8c75e28152ac5bbbcc008aaae2e9a49a7f88e3748de35981402bf17b2e9566ecdfe90daef8d859a1557c0038205e1ddb509ad644fdce43a8c16bdb6cf07ad115a2ff7df061b32f44ec18ae171150bc797f97b637464bcc1c0f5cd6a0ad89f17eaff800ce6d62f6db30613593412765074804e20ba0f3693b755b0ee2a34b4f0ec3f15188530bd6caed46be020340003b8b09f254ad3cf149c31171ef685971db3dd13219dcb1142e3b2885285194cb1fa8e8f1ea1c28fcd90388029afbf7daff210c4d977b1a93aa31b05ddb3663c1c57eabb247d734c6e8c36e542ab26f53bbb07e180416f7081809509bf119313c49bc8d1ec5b2127f709e524d32d9802b862832bac21e69705b74c62e1675ca2493064e9807f7d11bc8d354ebe8e872a69ef59839b88a78bbf9713de070c73394c2be95577ae90643565d5d4cb8cd7d62b460739b56d079fbf74fb88b1e5ba5d816095a7f8c9c835f7a9996ece9f007af1d8e987c3cffe987dc4bb6ce996f10178a53fb411bb3b84110ed9f218c9a710ebc500518953d2ee39f4ad5e55a8a8b3b03ab65ec708894939a71e938b5dede6cbc285bd8f3ed545f55a32d5a0c777beac0adc2005360e4a64539682fea539b434becbf22523d5f93e96280952f0061af012401d306375f2487f9e5d5ff0d08d95b1510ed7a54fb857f45cf1b7088e903e6da0800cf22c91aebad16ea57a72e0d5801fd8ea9ab97eee9dbc29589d719042981497179835fdbedda8d48f3555736eda9e9835ca459e76045231a40a12987f178f2604742739a9612eef280cd88001437fcf38386240a3653e6aafa36690195e64a8b1769d19030d5490ec2064d0d568221398b2318ae8e0ba7e08676ca7767840c4b997ea038a5c3db2c8226a0fa74f1c143bbd4dc7c985c9eb105acb599d53d8e5714fd7d8663e4f7d293dd77489526a0c51c92aa2d48d5c95994f06704a7494865bdd30137219d6f3e142128c614bb5250a1a6e978c9a17f0a791cc2146c98e2faae696a3368da673ace54b5c14c3a64b71b8b37b25b1f095f5f873fbd8b4f5baafead88a6ef90e121bd0f385ab5c3afd1f1c17989951ba516865334ae31d48fa0bc0fd46522386f32b095a331ce9bf0d86195cf01e198e0cf3048a8e5ad105d982aa35dd5653c17e3d765181fb9e2cb3a48023a7ff4494d16272190ab8d70f9f3a817f5bb5fa3de8402ae6fbfaeb169096a176abaa247fadcce0b0b9156525f1ed9f3be7f6965ec41eecbd725fef8517b578c0f3dd85d51fe9c630013a1403eaada46add7cb00231a3a5c14bab5ef56fa0b1615d0a40af6f8b2571f7d6d3992d98dfbe23a9fa1688e65b0ee567360376ec7af76e3638f78050f5e5c339b807677fff8b11e5781040f929c28a8bd7a0c7868eb91810686503f12b20d4eae34ddc146ec590d9587858d61a0d918355cbab462ba1b6542bd3733e488113e11b1ff7b78d9b2c6ec2e79c70c86c945e6b147cca3f02ca27e107f6fe07840c5dfa0d9c077a8b0eb2df7b464efd00fddfa9e8e6f3927c7323beb1b59693297b13e96744679ac3a5f643ebd0917e03f2760f800f410b1f62b3bd0fa93342694d9cd2024d9c58bf88b44b695270246b550ff1633b88714d116e299f72488e0c2e820cd760b16e813849a2dee3c91ed8e63000968880f92190ad3cd21629d69d6b7281ac531cd0773d6f8fe305a863d686460c614cdfa869a6dbaae3fb213d0890c734c12918f1f191e35d18cc47f7181233695f77243ea5f58d849f85351d8601c02c151470fe4c24d36ae0879c261b1cd69f24160076a3fd27ae22c85c4666adf4eb92064ac21438a322c9187babe0b104194459991b32f31399726c70ad4ff843347725d4820e9e4c3e44233c125758d197b42f6ad570b031ed1edd5ee5f0066a858331d860d11d6adaf418fbca53cd006f764db1efa64df86d9d7df518e87dfb9aee4ef26df801b51de6f5496bd3e38f97e33a8526118e43412921d8057dd88e6bc605bfa8fe57f9cc7867c87cfb769379af05b3a6d647a90b79f226b295fdcc81748b58fcc3365afe84653c3e3ffc2e9c2bb83e9cd087ad2d176e902a182a7c272affe8427ba5a3f65ceee1fffffd99c5816f08aa09daeec8e04fe38bcec1b767f9e76705b4f2be162eac1d9eadb3bf79f4747d894a4835a60200f7e0c2089f82e4ad143e1b1b35bf8869489155922e0105ef09874500457c8cf9aac27362726f50303a973d6ca5ce130e5a736f687c0c8eff5762805d74d684f1fed297676c40fe4eea725d6557febfad6132dcd2f5131a30ae836778013a945b204111a591403ef441104b21658efef2783b63a97f9ee956a83a2b4e05d121b6cb2a51df89c9c30175b5c381a80701b3cd4c132eff21896186b3febc11408e175097e868d7ce77de2e6de1d65e9015da6147a720a6f81ffa1fbf46940005439e151a07c69d91524a8ff811d80da68781d519e84a938aa5dd00aad1e705f0767b7a519cdbbca23f5f1a998b5f52dd10b09e682d37e63c9525b90d694902535d1183f36b769e076488e35f71d1707c2976b136a73857546ebbd134e498028d52a4c550ad0a716c42afb2056181dba661b8970146e7e9279f5011e3f902817209825f4565ebd96efebd7e9f7881172623bf3c8b3e2fb67055c59fd90083f5fd83e9af4af3b9e87e6466d0e791cd85de941bfb0d3772b29fbe1fc53da8854bb519eb723523d46f9502252afc0b7808f949e0865daa16414d9bfd16ef7a950dad30a900c6a11d0a3a6de023d8f9516ee95450e64f697675dd63e77573b87c34d3e3ee32555414ee2fb1bf2876d72492bc33b50fdd353efe9259faddddac930f0f31c8c40f485eaf26b796b5775cb699cd82937cc38853bb28873e7b6ee9212b056aafa409d3d1b2d20049eee5eb2e5912f155e0de8bbecd2cacb3a5c8d54546edaced48803735b43318771a2e0fee4a6e5417d58e5abd7009080f3a3a71cf4114ff81da1dd43382f105ed70c94140912e6148c10b62a7bdff0eb7d75a4ca2b1827ee23178ee0532b5b253d72e5547c1b91bcfca995d43f84a4b6411ebebcbfe3ad64ab52da6bd1d469521eddfb2453f599aad88e446fe26ca575c705aa5560a5a68cadee9aaeadefe1e27b49a9b4c91d54aeeebd899b9d36a6b064ebc70f3a39dc5b8d432c883013a7d242d0970bf026509f98e6e4b61e154b35ab4d9bd4afbc780801da8aa61bcb56e4272d5dd6955c468b244e553b3c8db807be55b6b795f33168f11bbbf0a6c26dab56a7ba82edb7a3d10371d05c45b6162b28ecc0bab78e732865c683399d451d2eaaf402587ed92d2b0b184e4dcf02e6d9f5ec53da8129d6ee8ede12ee17ec71254293e65ab31771f3ecc0cdc037ec41ca24bae3f4a071c2847f8b827705aabdca581ccb608778ad1a0771059763af6e9e133d21040c27059c7af7f025a5362cc390eaecb3ca5dd649e2ade2eec6eb0ab207f86d880543cb179baf3c7a15bd3d33fbfa6bf2e278ee87ab9c9af06bd54e218e081ed46a0941a19b700a9aeceb4f304bf7fa16e3cd26f71abf8295e2aea2fe3801e749625e5ec94e6986b9342881edf289e3d23bce2939e6d9b8ce55bcaedca0ad487023ac05d836f956091f8e2406039fc69fc23a19f1d9d12ade15fc0af48e88f4f85dccf79f4568f62d379de52140ca69f5467d98badb363288b1bebfd42013a35c392ddfced735c9cfb4ce93c9071c934741797b73faa6bbd48d98c44bf5ef09f026a8c9a2090ca9cc1ec2847f5f40b9bcfc35ec9386cd9cf997d742593736f3b0810a74825b205be90eb6a399563fb608ff8b6653ffd5ea8cd7bd4c72d027d7685c3c108d4a3e1c7895955bfc98ab1744f106ec7d1626ec75b2fabf0e5febca3fad46003aa4394e98d1a88836b6141b321dd59143078a662bc6a37e38f080570cc5f340002e32448640070e8c74268831a8bbc8877b23000ee3afb3e142833f5fa4d16624f4de1e20111d782ede2c7fca8d08699cefff001e439e5b9dd7e57c596e2d3771f8d3d08a205b95e415662f86885d38f648339c920cf5b5f452ecd3424aebed66bdb856edbff4f398aaa39deb4c92976a826f8bcc4ffa6dd4384fe1bcc28a07f8cb3fe5725fe283a853944a52db6cdab26e07e0a6e33064cd4c2a0096e776a92009c91335161c7c1cf1a1856e91a4b1b5b26775adb4ae1b829f1966aeff7113b693e3a8f21448f4b2776ad9a1ae92c2a3ff75f704747b9a14ac0bf6ea3f998edff902215cd816d2a3e921ac9a465747645a3655dc0df91788f3189514d344c7a6c6c889653ac8bb9bc8412634d5537d2de3048844e326126c1bef4666fb683e50902075257c86213b36a8714e66023ce93249012d0bee5560a2f9f54a5dd8a275209ff06d042f1f208b7019fb004ead3381605040e19837917c633abf5cf31f661aaefa2500b06d62e68db36400a755c95b5a38f9795683478049632eb6afb1b52084c4cf61088b8c5513025be5601b11042afae5a4bdfb3c9a11d046868b107917c54a1f0859ff17829ce15d72a16563d1bc4b04b9875508730987dfb286d012d85c2b9962baa776b2819739d3f583e73b35cfa93f09a5bb2425b393259b109fe9e171c9c828f7b85e276733738b6db9c850e4fe20eb8c5294ea13298a9bc0b535b571487812c23a9fbcb2d224c6bc4fa790446ec6a33b8a25e18df9dbcef69f4c6c6f7151997b23fd5e8cb7696f9ff06e0fa2b476e98d929ad5b1d358a26f407a57a8aca3fb08273b7cfdca688c0f789c38175d18956dee9837d7d4ea3a06d427dd6129ef198ceeb0e51ec96c69c1a1e91349878d264f8217f2b11616620112b83983f915bbf6fa2640bf86c9971c6f485f33f5f9a7b39c9adedd2cb083e68eaa1ad3c83bf3ba70e268f5cd48b329c48d2be9b7be96533c5dc47a948c17b0cc318e4370182032580474de18ea4d21162bb20cc1ef62c41660f3040bd5c9253ac5c8e1a82d64d93522de0ff1acdc9ca41f03b3b41fd2f660779a9b8a9e86909dc9d5857e718227765ab0d205100ff3ace0ffcf7cfbabaa7cef6dede322f06deceb08aee6d38eddcf9fd1ad0ef293e6a666fc1fcffa555d4bd7933039671026363286f0ea20177a2a851c52bc13e3eec3fa7b05472dde8c5a664edca0c24facac9d9db29a495ed6885a8d05843a601d2b8f63068c2520ff320033abb0f340563580ae4ba29127e91691ba22eee76dd3c5517650dcc7ee7daa33aa397c55b076f4510d20c6c3d2b4e8003bfd862f00c5c96ed5887f23fd734b1b1e8d69d3fdf3fe5cd7a9a53ed95db2defa8120351cb688aeb33abbac7bcbbfa5c7aca98a71f629377c0038a8455b1f89759ea50bbb997311e4b130c1cf04fb3de6900e106da97927221a01b7c94c90dd14407463d71f0a2203f6f99f2a5eafd6d50cd8e14200b02ef6e06f4dba3b233a6d3030208b2cf737eec5f8850d5182f50de479e505656c8b74b8034e9825d7748416305d8c8cf64561685bc16d9e52433d516234605d2700bc0db195e32650e9e577d1470a0c7a0452378f6ad5ba38aec20c905b92a6ac1cd889483fe41db91d942b644962db78373b5f9a86bfd031029989290cae2e64f6783f03da25d443f33c7c485012c7d2100824cf1a9d28b0f8bf7eb4288585410105d4f7cdb0794579f8df857b2814b42af899df02ac810106dd8b8f082f6461dc248450430fc63568aece2ba3cbb97d81421eb70954832a906914190a9d6443f3894219002cadf916349bfe82322fbaa8fb9ff3b7978c33ce83922ca6e0b13102822dd143c9c2ba39767070a84cd296fb1cac419f9a66868037a923282f3edba1b09ea537ca6c0bf279629f3b09fc3170b60b22f815037e3d92f0f3b60b42bedb77be6a62ce86a30ad0032f18b753cc435e3192cc58013d32018d916f9be95e217e4e5eaee3b2317ad0f57c21a55c3dc61dc504d8e9d4479012fd13fcc4a065edc4f4686cdac304919554cc7859abb829a3c76536786fa7711b2bba80b5a00217d8aa3443bfd9dc20a75df4119661629865c60ae2bb51b460ede131b090b46e6362de4bdc0b70f34298b0f1e202508029c168c38016d6001f584c052eb836e399df6aa2ddc6d5989834fd705937ebe7806103d7003c85d23295a80feb7c7c03b5d9b286d316ed401af8cd04df45caade506f9771380a2c78f8244692a31dca92107a78a5a0a1980bfc17cd1e3131acfe52baa41191a4cb69ee196f1e680e56d34b6526adff5d4ac13f73804791a3da1e36bdffc4435ff6d434e410cb304832495ca95d4bfe1e229f4f36388a9f27a250fe3603353dd753c38172c03cef3c7e8af045b6513722f30f6073e21c2293200c80b3ad4346e8ac3901100709a322f2bb079ab2bbfb04590eb6d0ee0a555f6641b1dacd1c5828492f1b5219c631746e75cd8bdf533a61c1c319b97f5a616516c5bc186b671f368eb75fd2353b49ac7ff4234d69b7829c1f9cf626e2064378c4bfb671f224345113339170547eafde6a4d91433b77e1ac23cbb16712a2ef9373a8ab60d98fa4c265cf0cea223e1bea108bc3660f7c2af40bf572b1604d274f3865f0976f8f96c9b8cc569ffcf9b4e7642c52fbb56fa1b763efdc1cd9f9227a07400c084c7ec150d1c04cb7b1cb3dafd680ad3e418451fb0f722a04568b4399ff97211d9fa5016f6c41ff01f5adcb8c5d72053acf88bf02952ee444403682a64eec16ce67430aee053fbdbf501cb28a2a189df4a94b7845c1d5ebab45bd440355a5c907cde115c18fd7a64cf0c50a9ce144f4dc5a08b89594793d6ae8a2bef6dcde0362105aa9bad105153b72d4292b33d820e81d565e6da5dbe975ae1a6b31c6c142c86cafaa3c3cd1d366491354159b6538caa0f2a7b1c317db711635058efb7716d846ddb9705d79d01204ec8a1cb6e5122461bd2ef429022df2b7273df2338ff80819f9776ea6ab6eab50e897ffd7f3dee56507fca2c693ad66a1eddbfb47a56c22c3b629a6bffb4c88fcd31d7e2e9633f23ff4a53d13ed6a6a63625f191a583c8d2162f2b45353913c9f748c605f7ca7e5c854432b16593835f80aec9017c013d529b444af2e23d582301996a3fcc42e9472452ee77e2617181dca840fb884cb61340510e43b77325904df848a69840096529944ae7a06288fbf206a14facc26775855b5ab4d682101cff7a9db1aa0972bf779d91559d30f8fc29dfd709ad0551b6fdfa912609ed894efe7018db24b26d00e824dd9d6b92ebfb38665569775ea3f8b3d6654ef519d895549ca365acaeb39bb778c98303fcbb2fc44f3106c350d14f9eefe9678c5c52f0776592b4746007731a62c75470dfa699cbbaee0ab16ce37fb107035ce48d81b0929c813bf24ff0afdc17be465cf4b5370400d26cc3e7c0617d5a83a1e12259ce7bf4550370be0528a6a6866d81dbfa1280862c0d74641b0fcd9a5690dda6596c68b0fabd5e99213b109425f058a87a15940c92cf7095e09a62fa7916e59506e9078b5c62549e3cba72f5e2a03c6289707654add41eb2e03f5a9a6d786c00c951ccf4b2506632fec15590f627dc605f27105c54e302a1023a011db2b4c7de63da00327d36067385f111733d0ea9975164ae0b0fe196183e1ea30e8a9daea57ef66fd3cc77c6e633c4b6dc139f40302339fe4ff07312deeb63dd1adc93256e8c728933ca12b9a77111965399945f7751d8827f10be763f17818d74843b813256da187793a9a68889f2e3e6efb237078cfee086faa4c396b7ad1f69aefb79b1f7f7ef6c75b9a8965978e568ae67c66e5ef66c62385e1a3455da981cf0483555fb83278205f55afa1a6f625647baddd564b381cd140d0a1cc436582364737103024b580624ad1c66d093c145a0001e5f47f1ef22aac9bf6b4be3540353b074ee16672111829c5b8daea813de19d7efa3a2a81976c02480b9621f4315d20853d3f64041c1322344ab6f008de80c11568130ddd251d6831455625c13d05052c1dfc0551cd5560940c0c61bc4bf88c73a8cc4141168421d893a8e3ba6a49b867df1800506f6685d15f4a22a3055e7497c7e18ac8e05bc7f70774b7411d88f09ab3714fdb2eabac238acf529c15cddc6b1ef3b39ddcf8fbf9683a65656b921e2f8e20cdf863eaf12a096f354607495dff4d8069bb418cd4150028e9398635f3d4ae66ff9af8428149dce220d2ba3cf1f7f1f4e01270baa77f5673d52335664edff836b7532d0fde8be4a1066655f7cc96884a0c7f517fb44ffd67d510a0e922bac172a263ea0b48ec084dd27f7580297e57d7f596a7017182ac8650f90a74b72f89243bfdcd9112a2e11d15ba1d197cf49cfa0bbcf1e1dbc03156dcb4fb6067e576682eaec20012ccd111f76642c58f5255a4cced8ebf199d5e243855063f67b9b6a9bf7d4b6f355fa945ac540da0799272b0ececfde2b18b046d520547e5965e9e39205bda9ba145167ad50d364212d035041392f0686911d3ba2552191b723f703e65513c62b001bff21d64b2cf1e16de42d13b9c07460e4ca6f9b2aaaf05d81a7552af56a0e9eaa9314bed95292e7bab447a819f5b3439fedcb6d37a203e4e9c0d9ece9517bd0bf4040f79629069ed7b1dc7a993d99e2bb872a303e0f7afc0310958d5d089df8e959b97097042d570a3e092c3d6bf6100667ba8452d545cd6b3164fe8065650c58345c11e0a2de4757aff9842445470f5ed709a4a3b1d99ee4f47cd6583bbecd41fa80bde86c6e14039cca2d87915a2117a5de6a3e6e8179a13ad1179fe5fd88102d881d6f2a10f360d674645ea2c4ca954d1edaa41375e60c1c2863d0a05d6ef1b9244b518438fde75b40d3453e5da353882e4c667faa60d562285a3a72f30fc05d489aae5074d7f350284261c9cbcdaebf0b61c47bddf449650ce2e4544d0e55c96236ea6e26563643fdae0b6bfc3bac15b8eb37f2298768df9d23c1f4853a5a1712cd1beea656b7da5daef91226ce2aa52187ca5553ba6fb1dfcd2a5ef44a149eb874898cb39f8a56c5e13a5ee94a850aadcf8aa094bd4eee4d0b74d70f25c445c70284cc6375a3a0169eba27b46585030836d6170fe8b4d8fd8dd5284a75855a198327350088ef894ef5d90f0c3426298d4dc1b2b7f114505784c0631255f2cd1fb7b8fb32209abe8cc642274dfedf1262b20e129c716a234785757afb529a6f561eaf202af0f10bb7f88868375ca2fbda0252a8cf13dad4b0f0cafe0cb0cee9208f750b3dc8103275c1db7caa8bed8026f20f8de8c7e7c8bdb50b551281778ccc01d708a8bd9f5c72f62e815f121e4454bf30b184421d31e28e3c0ed10f146dd6a70cc4859754f83cd55ec34b286bba8e98f94a67549db8f0418b765753f7670a2775c2e7e41318fa1b20d676e0508cf8d2f0db563bad00f481a4ce43aa4e9ba6953addc720f3a0c2b98d7ba36c8bf7e1b42c468f3948f65b3e4cc1b644aa4ecf5804fda4cb6c7cc5e3b0f2ee02aa0db1c2735e09fe8d2551a9537319024f8f9d4a412e05e1618e1189b48a93f135124af51155a0333f420d27bea83b91cdb66de713925ee59e94e3833552645e98d8acfca69b667ae5705717539ba57b97092c5097eb93066f1cbc06b5576f93e1f77417d857f9ae4103934c50c62bbb47a4e0a7016e9d1c32cb827b017c3e8b1edcc3bac70f18b2e57dc59813603a5739b41e0f3b2f449f126d2326039f3bd3cd9970ed187fd840590a801d1639857add946812ef1eaa7520ca96c021420d86322c0aa644a348cd99f1d72cb55dccf0ba8862fc3cb9d091190174c325e125dac814f8454869d3775de5be67fe240827941b6ed940e5b06591f8454b12958847ff006a5b0cdb500cf8bec001501570678f36a200fdfbbacd3c00043f76b2373a8aa20bf88a6faa071b49021370826b27cc2e801f6df891d831ab1085ee62440cab8e0b934fedf845a7961e836a9b8f7dfdb0c20e17cf94d76c3acd04f45097239fdf5fea24128543d727746bc6407c498f4e6dc327770eaf237ec295a0efb3ad1d91b4db19f2a1673128b21b5fae0e48149ccea05bc33ce60694f9684569d0d9ceda8439f031386e88392905878bfd86b34b6410b4d88728ec4a7b4dba91d043affd12da9687b2f1e71061cbf85c9f6c211806bd39a5dd14a298cca97d8e89623c4a41d826ea7aa7dd08082711c2b41c549fe7af7f47127a428a279b9ade201794a580fd194786f1f06cad0977098707bf61025ce50d0d5de470e49c6a98f44ab4405e6bcfd7570dbec63f6907163bd77bb8aa4623969f9661c85bc1f114b2df4c7bc5d5844560f0da14325da1eed40957a797fd0e6b0442d2aaa7ec191976c11f932ff372579f998f9164ee5d2ff76a7c30e79188694f1f53e25919d142a8449c750167a3e646c9d631766b1b336648de2ece8a712e6a00051db64920a8904a352b73c11464f22442877503185991efcee7564b15e8ecf68298cbf02d5c2f4c6b1c0d958bb8216f1e6633485a904e66ec6830c5049c9919348fc33336a59e87f1d4d51319c9290d66c385e0bd606865b1201737733f592e73d03fd71ebca766f867a5b33ca189012a08f8af3f6d803b8b23153bb90a14990d357c4a5f8b0c961b0d2dc223c9b0e16f71a82ab0de00851ac8e51be971635637c32b721157aed4575c49c4dc839245ff643025990612133a53acf955d61f7ab359e0e5c839b3510926f16bcfae67a534ae28375ddbe13620e873651c17d26df24247422a48a73e494b9846e403650d8a13f00a40cf20d98caac14c48d0bfe1ff95e40f12056a71e6e2581c30bf25cbf10cca90b9bf6cc4c754fd1a22675d722eca376646e8bf3b55e18f31ee4c49b3209827a6eca5e3caf8924ce01d27c9498f8a0d570c4eeeab33ee4538f92dba24cbae8987cfb64e14e01972dc00bd29b36671db32a7736c6f84aa468d0f920a754abf0b1b99582aa191e6f68a85f2bb0af552608be99d2087edb5124b69909db2ba4b50f6a6cc0e001a8f1754b04e6ab05e9824ceb865f1ca1179b54088c2a9c6dfc886afe1b8b984305ef608e2709f3a37821907f418e997ce09102c2dea35cca4e219b1ffe592d4ebedff81ed527a4c1e0be06358802c89c7d4d4d9984584ab245e66d8a528f13abe5b7989b7a579fa071b4fffe60f535ff8145c75f06a2b199aa0070188e6d015660d6237403a5949b5138f5a40471e7285b6e740fcf3e2c1c0c8aba77582738cfb24ef7bbaa1a9e191a936bb1c39454e35bdd86c33121ed25ff9f2c3eb38251a126cc3aaf51af0f5c603469d43ac8b91a70d72d550748f48bea76f73801c93338e105906f443337248a853f7be97ba0acaf06af8aea3c53afc4d5387ffdda2d4fcdb038930d4d67efd15e88052fd2abd6317b87e404ac0e23902b90001cec3a6c026e9619fd75433662283584f65ab7b567dc86872e8254cef30b30053c72bdd1302c6529088c558f33ff706c421168b830aec1d18d3fbc47391a556f271d0896f3a960319ea211c64c3b6836190b70667f866251fcbf18898754cac14c65787c92440303b0fd1179c3afc9a8361927c88092d23af0c71e95b805bcc9405016b28de38e77e61f049e98202fc651051a730e36cd9573f4443019e89fe01e6dc8ef8430b610d7e51fbeec6f7d3ed1f9c16eac93438454a5732585714af4ca3fdf117db3767671278bb8143d0f62da3e95a69ce10354d9e47c97f35c9d284bf12e0d833e20fc6702452cf8dfc8843f32d435ea2ec3fc0c4bcccfb262c46fa5022f1642a225b50b6e1b6c626d5ac0bad3bd7592d34cdec6980d38b65e2d32e12b28a3b81e249b2f9282d7a6b2cd90c8617e7adfd4f002f8c798f10065084fa5c9a9eec889acfda8159d0aa640e96269efc53a2878c258acda089208dc001c2e443a55a7ac3958469e719bd94cdc960c6ecfb6f6234c10406070aeb240e0960ed835d43a3e15b3d7bffa3051302ecfcb89e441284a33a4a27ee33769ad1b5cb33180546985a20631aa30a372bb5f7936bcb2c4fa609aa1d91db8e7b4f0dcf06bdd7aa337139392834cd5f23d0f2ac5d6aedf588434fdd32538f87de0f107667b6388c8fbe6440320061c6a6851dd90c84bffc97270a1a06eb6e07fa6515fc03efb185e281ef57d1f25c488bbc1550a075f1ff627464bbac235588713b2922708b7c662bb5788d060223299722932e8b066e8757870f6a16896b8c05a7425702c342c55c8c30d072888fe7be6778b73305a33601bdcc855782f2ccb1c650e15b30f71c84ec5e21680cc119dba0b11508d0728c45909e895c65b16056d317ab6bf6415a72773274805d7fa4e6b0bdbd7ee9a92acaa7b0ca14d8a10f94d12df822032d42d67422fac335d6c7fab3e8222c85be84e9d00284689278cdb69c1fec294c7d1635d8ec130645fb6e4a8a37892cc5c7a7e8148b20c5863a68f8a33899aaac16a3cf34e8258570efb9c5c4ee8a4893c7964d9a098f987c91755070cf8918b87453c7e003058412d951e37808dbbb2e3cfa21ee690a75a8b8783d5bee187dba7df21c334c7dddf4d67fad78d300bffb86acdf419339a4d0be203c09649c4caa2cb47b55e64533b70bb8f3c386aaaabd9496d60149d1ffeaa018e373ab5889b572bb21d9c3d02f8008a405713d986bd9c88a4813cf1f7bdeb4797883668f45a2b967f882ada3cf63d11e243de0fae0cb705173150a557b2a4bd8f64f87a8efa5fb576cf8da4c4513567227897478fa5b2ea2918fa1eb74c37d75dec6c8412f3d743d7a17829098d3b7fa144f22d78dd3f73f262bed3ed4662ea9f22adf92bad261da6b68534840f9737828260efb4524b0df8f72adfa2112f0dff69ae7fb8cf98e99d2be0b3a18e72c44bea09715ce8c56f860321db4e7c82bf31d42123c06f882342f7da76354f44b45ce0c30c8e1efad22c45b74a5c60395d437ffc393ad44dcc037073a3a9179b400ea8d6c32b7bde6c37ba8c47b9f33e370103713b9da86e74d08e393120486ebd7e7b1d7b0eb97fbbe89f617111d7b0dc1fd946a4471ee796f54c502bf275443b090bf02e5cedf377d8888e5b85111d1ffa0225eeaad6487df9801f5d3fe23b09c012c72d58e1c5610f7a38af239eff3e1dfa1311b2a660c0dc070b02706ecd164081f93eedd938ceb07d080530f758eb64504e0e772c98c41562a8474a37e40436d62b7ecd7b381bc64543325d3d24da60a589c5a6c1e06773d983fd2f161093aa39e6cae0772e2cbe4722f37cad2c05628b05c164b9c693e99aaafdbe926d3a0f88ea2d7c5c8b01463a6da8672ddfc780056811a36b64509a0bcc8533c6adba2a000255448613f43bf51d3097de6a345c366415fe344e2d16758c99c3f4774bcd63f35b090cb03dd6eeb0002819bbb179c9ef7a2cbe69aaf8285001b65db48556619f137c8eaa4ccd997d667b5cfd5730de0eba33448ffe827e853c55c58a3cca15b9c53ae4e450ec488adc0128aa0b5810cc58022d7c9cfe160e19817234a5894f02026709283d46aae1af320fc567451b1b9c79f82016c8ece28dce24777901ccbb41a18d377565e5e96ad20feaf32f75a03e8933500e775b3284245c6409e3e5f5c74498e864e862b231a20c013e253f70e7e27f8d35ebf78109f42d27a608162b9e960ade4155d4ac9cabfe3408a259cd515c2fddbb4b021b1dc17c5cdf4b68a3f6547dcf9548e3e3f825aa1c7d481ada9bc963dff51f1a588ec99c5dc20a4914e3a916c0d38bfa89091f9d0b2d5d077e60a3d5a54aaec8c2d3adb39aa2437ac1a994ad2304a6eb4f4bd5dc7c44443ef3494b36d73f17f459470ac137c9c09f3ad44f0252d4cf197dd92f9d93292e55a27d1bf76636568b4d86daabcca91fcb642681421809edb9b110ed68d19f5c884b090102209b65e9855c2cdf41ccd4258dff97aded92e06b981572c5b65dcd8cb9124c8959584438ac410f263edfe476f3e48acc9b76f7ed58cbdd97f656957a0a11c676ced3430001eafa0b40061181a190ebc885b684be765824a3b3f59e08bea1c981fa5ba7840d403cd1103b50c5de351f00bc22243a6559ad5e7cb865bd442babb3a502de025cb52cdd7993a85a99e03a196430504bd809386d86f67ae0640530b1c3945cbbff3a54b1623e420ed81647f1ac1633e2fb5a0ad2dc05994df303ab088cb23ad78b3866c647435b3fc9f96ce4533e459d4e0b3a4a928703c827ff49f75714266e4c0ff3a055a6bae0e44b027bd84d1c0de3868d976436bad242e53365b8bd40a2da6392d6de104e7f2455787ac51da9e3611838b638896d2a0498a415a00016b61f75770e79f41ccb710740ffe2216d25de6fca690335c9800bda325732cc95abb4775c8da6dd216a7256de90f7d482d0f5c701eb2b8bb3bfd7c6537e8965546a358b7d494de07d405c66861d99b03db635fb4ba276719ad501db21271c2e300e7f6f884606934cbf7d4d54bd59b7e7d19b47549ce2ee5017ef1126bf2a230bd7ca66a3fa3c4083f92937b587276aaa96654a86ae6b05ab1f4d066985a6fed95def7b6335f212401c7252f3b1eed4a6f9cf8e7f3c8b94e8307daf1719dafbd49ea46e1b91ea6cf00307cde3fe2a3beb4a85e1bde585364130b07a83e4abfa1856f3a710586c2384bd9e3bf3284ed6e293b5f35f9c014a935ba790e04f99cbecb2fef6bde470bf007a366fa0bf9c6bfc28a45c452c8889bcf55507a01abcd30a1bd6acf935b63828edfff8a3f8d20607fafce0623cf7b547cb1047dfecaad6de1f0a8524279f02a6a5e06d23ba80436fd83f733732602fa0a0580c04dd3207017d559665ef8274b1b1e3a44cfdf0161c4cd23b7fefb6a64f0dc54e5e1809c09827e9d56b63d0a4eff9291ebd378dc171ebde8be5e6dda2ff5312185c82dc504ee51fc96010c3a388a80ba74594777752c100ecc28fbf702e9c04cbede03f3f78a29f872dc9e71d4f85335c7bdc059064af9da61d82b0c3c862183c59885bdded2af491a8fa6988f3ebfc5de7d12766046657b4dc3bb8ef7a48488458d31c5089fdd026f1f7b3548201a477f7a65071f6f150a0c092d951480c9d704ea95c598bb92b4d4b698a0b559445d20a4c4b63320986dedce8be1c4c3391b2650672e263843ddf45df89f89f89e43c9ea5790a65227224cac0fa9a958c02e0f7a7e45f64a8dc2cd67488cc9f4caf20201ab9ff7f648455739de0c830fcd50596fdad4e1781e5c2695ceb81e1cc9e0aa35f41940114298546258b6ad64e6232879d3b2d22a18b023c4e13761a206e7b992081a3174a82e6a71223f847958cc41bc1c59b2baf9195a49134a70a02c458605af7614500b03d8f49e021f2f51957e4f41844f2f4265209dbc18881278e80a1a0509f108f4ba355fb492bc125107498ad8f161590614dd0945d2d2af90fa067724117e4e0f1a8fe0d5baa159b73e53cd1cbd35b813bc0e5f1d75df226fc5928b60f0981e300cd85bbb1c9588485c82175232e24a9ca168c3b4cb425e45b482d7dc222f7717928552ec9b5dba2b3383ba5c9e6c64ceba8c6054461a0eb0b1f3b90d092d5ea852daf3f8cf7b04695e56c9bc052f94d4cd4edef6a24e77314a0eb1fb9eb37cf73ae1c44e3f29ca05ec4cf8f3b155c028d8d07370f5423cffc78f2306051bf753ca12532b99980234941196c6faf3084b37df659a7501b43285cc54561f8b3b8295f8b8d49aab879670a1b432cb6b517a2877eb507d1b78be05f066ff1024b9179ba599c13f2b9a79030cb123c1eb630f65c9d41c3468353cc46c75e6d10eb9f46d14c25186967195112c1f797e63a2d7b73f4eb23d4670ff8f2db9822496579712583f12c9204a90b15160371310a78c99661dbabce4225de4157e5e971473304efb8220f4830dc9eaf0544b16baf904e52bad4416ca8db79193f54f19c647da05724de926dd3d0bd7b428b5893c29cb5250cc433a10c77282363a6af7541b27df1b47029cf33a9da73865e2d2aa282db3cfdfdab1b776191381540cb19cf1cb34a957dc3bae0c89ddf329f2e805f6055272055c18e43dd1c6286212f0b1eee49a986d489185d1be79e093fe6016bff57d12f49838c80a5dc8040e82a309973a830c188664053a9710ae89187cfc8029e1c274c12c8c670a7c70205c28e6b83db3a3070a7ca7001f643e43896314f8805ea21644cce4eaf8d14eb41f8b4087546d8c566b3ee6c21707d99ec5b587ba25f091262d6da157f0c27f794682cd1344f30d6b6e20a50b2fb66170a90b90ca8dfb8b1115dac0bf029ce2cb82e71504f78c6379a6da98218fd779185482ce9e75e06394a40effc3bb5506a9161b2957e7ee55de90500bd6b41fa8b58cd5cb0610f798c984410e781a9558446151e60c073566bb8702642bbee81ee6642b12ec33e7d4eaf30c634accaf0c2f16a73f1729d83ded2b29cfe5dab6695f49215c2eed98f69580e7b2d2c7695f7d0914fa1486cf84edce1fc1380bbe0009580eb28a4d04be88a4f18b1a9facc7a88624c0dc0c07a82dd838cec862b2b9ee52038e0a5e8a92441f53a0b4eb7ee9ad06df437d5dcfe6d9eff5485c0589cc066e76ddc887523778b8c7f9e14bef3b1a14d52b5e10c4ec812646d28e6d7298efc6f4a25351c9b756b20d5180a2d6be52434b4ae643620e0af5b2cdb988cc86cddee311021a754b253524a3d0798f25a917a4db0b389cb80b0021234cd7a6aa7c62b171f2102226ce2c8b0c9112b9166495f9276c390560c829292a5001321cc6481abf6f24977c22b86e405f0d8d8f73029e23ad8860dafc0a6fe15dd8bc1489887fdb4576b5293e2cb93766d14958c17ef76a76cef07f0f742603f91c7f911375b3b85547a584b095d6b7ad698e57cde584b5cb2d4375c280f102407916d70a21d200b6a22c275036ea918bbd52d78adfac41f35e04c6bfd71260ebe67491391532702d9fa0840d5d6953bf2ee439ad5a54c820d061e32bffa17af340849cca133b4c30257696381ddccb07a461c500201258fc3359e9efe9cb3194c637ef5d2e2dc16f16bc30a863aa44901e4c9717323f062048fdc8fd3a618c6692b5b22f546fed93f71fd598a559139ec5f89eaafb2ec2382465ec5a06ce4273e2606e755289050d9e909f6255fe5cffcbc3e0872d7b09f7aa9d930ad6cce511e45d6af8672dea40caf4a24b82c6d68161f0ceb787c8fee77941f4d41f7eb155512b83941a8e7b2f14b372154c03a610482ec417dceaea630c7e817a360a7810d0f7ec665d3beda17934172a56962017da8e058bf99c968f04fdc4b99f5e32e3c301cbecb42c87cd0ab207d50a929a82f79ca3002d3e757d84c3ddcf8f1051f51fc00ece2d69d85cd6eae969bf11fed9d01c3930a262eb1a52d9d29a09eb76e21128a617130d2f7bc5fa82dd4e0961eb49b07feb22371d189333bb6c193146e3d0cfb1a917246d7ed33bc37aaa179c49a28e2d50ba9fb1fcef7aea82164d3214972d5bc6a5c68cdf4714ab9821e528ba02e24deb076fbae3a6114e4fc9ace12b2eeb6bf06585ef309e8c61b69089626dc0945445a7934e9350b33efd80d8983f6563f399ba05d835692492eb0646979c5d7dd8cc1b8f985c4eb254edbf11f97a67977be9760cc99d12640bea554296f8db0dc9e245eceaeae7faa3a1d98070963759adddc0afa21cec8850c3c88cd2f69521eb0ef14e8a03bbf2f70ca2375c1e44df1d1cb3d4b45aff18581a7a76cde0cb8cc7e32c221918de7acf20b8ec6e3023c33e72200bcb04f3698ee14da536e50df99b35ffd2f3668545cd140beb4c9557eac40c1cd0480d6a9987bcee8fb77b5c7c8aa2cf73a69dd879909b3f5d639ad218e43123757135e105fed3d075424282d64d2a0d1a325d4e1da1425d1383ba95f9416c244d4770157d830a66339fb86ca8588ce2aa970ffdb0768c7f957321d73091025d552864c84a12ae98f446a02b09bb357b8d905e02391e8d2041d56d1f1aabd39745612a172771e3ab1d704b4fdfd3e82659caacfff3e21c912534e660e700e3669b3ad814846925e2be9f894904861905e9e53c34f0ec769ca02794e9c76247105198132338eeb2b3345ada92def180c07512004b089465f3612aa20ba0af3a44e99b2218cd243785df214eae4a241a4396deb9eee947fe22c5b6cb7347105e150470bc3c9872ad4dc6f93e8c24982ad4f1562a29b3aace693466d0dcd9a5113d43532f311145d2bc47ff97e65e42e9ac364cb674908e17118137e7a62b6560113f4e1034b34d789155c304c50d892c879860cb2d3a12dc460fa4aa3cb915a1e6630481a957c9766894776fa7dcb542182ccf7b3ef40d051e64acd554949499e031eb099ba08de23c204c8262154ac18780d1c643c2de55c03545284ee1282aa0aad3d057d879f944397d1694aab3b93455b43f5f1745b466fbd80d12a85664b775207c6f9f9232e6f094a33105104f6cf0c3bc69183ef5f1c3b35cdf896b9266210862f08ec7add11f00f19479a4fe3e2dcccc0a68e426b476915389d06cdf4905f3895d73483d59c692b73df32545d8ce04efe006cb5e79fb94cf19a717a9b737c8ec39c79cb6f9a5a038f3de5343a6d202e53c877e80b0808527d9afd932220ce221c4f0958ec349838595735f19bd533d99f1c61cfb13e7d44bced9a239a7a9f84e51c80f74577c38e11f77959c808b8690ff3c7b8c6fc4ceeebec58455aa411cb3fd35432c43f84676944367716299ad96e1c3eefc8db960eb454800035fb2df83dd1d2d86547068243732ffba48a455868219440ccbca0b943f6fc31af9adb53ea0eca12f64dcf6eafe9387c5387e0bce6c9ffce8153fbe31653128db54a6dd213191ff4fc004be58ca2cd2a02331ca5184c9b8cce881e8d0422b269ddd764efbe6c62b831e07c5fd57346a96a334a9ec8cd687992d7aa7ae014dd4c20bfb62831e786808917b6aeb9e344588bd20d4e11f4af1bad67e0dcfd8e23be57b984362060efa6a6421a19a65a61fe5222603111a922e6e10ac3786930b849cb6f2d54f435c211e9ca9be27222f60361a8e30c0b1af53422d29e6da05bfaeafab42b33db76c8d77b3b546105eb7ca7d7b0caabc799faa3b3c24000e2344a2f781325c46aa70d336bdd51a60a5626b7081a69fea370fee6f8920fc5b32c2230676007872dc54cca8e303a290e3b7a488127338a8b67cd4970fa9d7d1dd282ad50f0374ab0cd969aac8eb3cd1bac2d62f0f97e6468e200a1b961b7998c1f82129ddfed6bf5eda1dd3aedf5d91ef60b063907088d26b48396fc239381931c0495c99de4627a155a8f5472334b80b252040d2af44fb65adbe47372a6358b45add78393256a26c8920fb66fd90f86391206c36dee69db86412b6f0506e37b4aaf14ab6fa0d7188d1c5caa2a03ce0e73ae30a7748d2cb6ff973ee095900a3792a4fb6cc56010b2025fd99035abbbd2cbe520ad62b48ffd01a0edf86f697ba425e45f39aee15df2ebcdb50e47001326d1831a869e55cb98f7f378a7d015c91b30f68dc42f46db406b36120298fca0a7d0b6ee5fc925520837819835ce1bd494b0f68a10b7b11194dadcd6324cb24a77c50f75e357547a292ff545ac3a79c25e70985febb627de24a92e71b755a97582532a5b7271b083920893ed97a03f46507cc95edc9dc0abe22039c2895a946d373c2437a11f5e50108db1cc4ca988eac93c51eb89406f02926fce101be8d7453aea52c03428e11d578d3d731369972062eda26c445723eeb1bf52270353aa2b533a3b5f1b6715256c854d1ebc224eb26bbd7e2cc9f5e337368ef4fbf907ffa6afaa703f69f5eab3932a680887e53fdbee0a475617e2f0ce56d29d856c4a2f02e11437ecd31ae2eb8136f738cafbb07e6f84efd27bd12585f54271b25096a67f02cedf4f49084056fd2e0e885247bbd84e0d71631cdd3436b78865ba39762460619e202db1c92f1e2bc464dfb337493238bc26c31cfeaefd696a079c30e1bd4a4121eed90a1c89684c955da5604a5b9f54d0e7af2321504dc2da5de8f82623dbc2a213aa7af191d0d114f8fb24118891fce8285cc9b990ddf0fb1c8cfc295776a37f4f85b596f0db42228a98c6aa3b88780a92eeae7b54be24e1da9bc910ef7e36521798ac0e88f722b43a997e1695595fd660f4f5c4c80eb2b975f6449c22abed461e415f2ec57a8ba55c03a90f0f23de194b6f80a60763bbad5f52de6146ce6cbd8ca3df018800918690eb91d65d9c0adfff16cd01af2696499b8a3d3c5c90ccdb3d33a1a0e640ea9acabe115e270e74c2d4bd531975ef6d93b4aa57e5350b091651f110c65d658da89f74f9e180ad8383ec187b005989b6518d70749da1c3a9d59638d19cb3095c0435f3c0aa798ff0b7262900524308108c7527fe84adb68d5835b055628e6692593a4af25761eedfa596a8c619cb94c4ea16099621267455f864b052566af3a9d4c90c27b0d60aadb51e925310ac9f7efabd775759100d0faa5d5bceecf2c3dcf7699f4dec56ff771e3c9bc0f47c288b41cdb469400c07a8392fbecac9a52cf185fa973102610c9a074851871cd5294f23aca2253cc712cb16682def632db5c51da776ae384e77394d250b8e0d6fa1dd2850b6a711f2c597249c095c3b665ab069c3d79284b2eeb02403482f0b4b3791c70ff4b249dca4d94c984500ad46579d052de4743bc20c3d0f987eb589f97b5c5488f62d4abccf92254194ac5c84e552e8b912ad9edf0fc7ea15c8a71758dec124b2f3a59af28df8554362612089e04a1c411885ef8e4e30a62bf6d0c71b571efca18c7765d8d26aededf87d5ca015c3ac9ba05e4e2027a42ba7a55208e61351dc057aff100974b26a31c20a6f48ae019c5253c8674f3c9f0a5eb686e43e1a6a38a226e9da9b2baf75d0e64e7427103c0d0c4a21f512874b8e2e9dc64be9b365bf6fa997ea7e8de25b4a4ed2da54c49a667086b0759074b2740999c10a819e4e7862a3caa2018d83165d00b44b080ccb101a473c1e59e9398ebe172cf490bf3ec9f908d5a8946d4209ba800e79ea0ead387fade3ebfb370d1b75ea23c183ec0291f54bbabacee76817e48297d3fa294d22808d486802b947e8b17dc459f02b46721ba52c048943e535f114bdba5f403c0f46df4e8d2d276e904f336211bf50d698958df3a8d5157dea4b009d6e271751022a20be8746fee05c011a7bbbbd3c04e726762ad881244b47fdf9c20846933e702da88955a5bab53aa66d24b2483a8dd47d4278ddadfc8013cc405b8a193f25d801b71be3fc3f83bdd79158a77656d44eee976f776b9ebd0901bd66873dffad4eb766d04f2861f4e1b6ed86037f43823f77461b7b4b73e73923b6de1f9bafcb4b289f099b42bea2d8176027a691f8e59b7041f2eed434bfbba214f2622f77459de3ea3b3d9acdad96c0666e0a16c6272c3e7917b3a37773636dd92332865df1ef84bf0c05fcaded6caef6b1e9ea95330cd09d4c8925ff6321421d9e3ddf06bad7584d09fbfacb5947d0932164d335c6612a5ecfb692d02b277d93bf82159f2cf46be4cced4b3b15f56ba099a9aea93b764fa2100d1a6705a1bc01adc890943be44f93ad3678a0bb42f18a07a58e982f2452a544391444005204880dc79e33487d90cf90a53a6cd92242de400c572d834ce9375b1d0311342a548a8e325488e8e427fbe6c00ca499917c6b07400a255f59b0e98c903856a87951f5a5ea0aaf6f8f9b1cbaae3445001aaa4d9d2214f9fdd942b2c52909ca19ac24186968336c1800c72ca8829b1fae1244e141c52bd1c5843b472583b3964568ce696363a3fa8b4f152652a8a470e5994f731e282010e122657c4f819c0d418296c785598c82015dea086080b0d47e27061f215c30570e8c400c5ab0e8e1648d562a0503f88aa0c9c23527d98d8de84d1b165858b6a4aeda3e46a10171c2b1f7f5018a4e5853b529aecb0b3044b47101be61ce293a3cc20233ed8ac98b285ce1c2a3b5447742dbc973f58429a28a9936766c4ca9f1d0c7139d3458a66c6ba6112a8e969ca1b313345ee58c9e101156e8091faa2a50c140dacc9f41125769658e964d891004e96144368c23859410a8c7ba19345030d607200549525055b5e08bb51e78b470f19540e398ccd0982031e272c17b27c69c5b93af2ddd2c6719696a4ecac17292c7c5d66091f0f62e8cb22f3c9fa8c33589f29d9ebd6dc95f44c585dbb7ce687940dd403c6f13c27fca0f2920256974250b00cf1105465a7aa4e10999a06734b1bf3b450b9a093287b527310fd72cfe9ea7a6041ac977b4e4bae079dd8977b4e4a984248c1828673da21eb3909116da2ed724ff7e7d22ef774766a975a551342e185254aa1385cd2a0f930c31e345f6e8862648d545803ddb9b8cae2656a4d112d3d42a27240f3c2161132586854f46a022e180a031507cb8908873113a5cb530bb60cf1c821f3ea19f4e43086a3cc10373ddce400edf1da3283a54e9f1c568e773131a4d09329532d30611301267cd8e40002c6c820a9a9e6c3438812dd9b1a9ec6c84801a363458cd50d4031e8087b08f9dac2b503cb202c303abed800c667b747509e40211eaaa403ab27284f507a98597205c81a3351ae8c9112fb91a6298a0a847a5184e8f66c99c3eb5324cb0e6258aa745825aec20db4a3b30548080d3bdae0e80ad4478c93950f54548da11e60be94c123c3202ecceb01d5440c49172b563abe1d1cceebf075e5278dd3561e2b2573ee3871112a42050482c50607205f47921852c1cdcd088e1f5f5e72a6c8911571405b04853944c315317cd2c8ca5c1133667775054ec83bc280a815c68481b1536690913538e0485909c94187b6a32db8e07344ec0c1f3432d8d0b463cc912b215276486121878e042091ecdf8823f0ef24193f8b80960cd65a6ec93caf262941459aa4b08393d8921c13baf104caca48a0313d724d06a2927a43a40bd098273909e090840a57979d0d8472603d1b87300c0ba9c6f3e437f8a2830d2f48e9d85287d54c29f30503973045aa72f3438ec0e51a17a007ab88f472d721203d9ec479c5ae433cc0ae433874b41e500a061ccaecdef0047d99cfe07cdbbcc1c80888943d94a33a2029a33f7ba49c2945837272dcb6bded36f97d5bf3e3ebce3ff3438dd11fca428c52e4f653b06d6feb9df931e4ca2e9ff9312690981b5e5c58a255a7e763abc9098f2d50b24c51d3260b188a8562b9f3798636554f63ba1d7a68d7131f4e595210c4c38b1f99cf2098ae3343898e2c374a7c3c514d2ffea5292a074253dcf060c2e60500102ae3c3c9922d63b67c99cff3c12f6ff8cd9dcfe07c1b9899838e0b470e85b06060830205203d2fb1344258b8ddf9afd3e96e50273a245d3b2e5df27c72806cf9b082b2ab12168491e8f95248cac78ea814ba0c892f2340903c9173a7498e9f4140a12e7f8b15540cb6d2d4e974baa8dc9c1b084157aa8186345d7ec394311876c8f578620f584e0145a2f0724d26ac8a58aec7222bb9b076ddb0e7cab6d90396eb916b6400e5834cce060869e05401a04dce49b08a71e186a99c0ddc95162b599c3c5380e89240391f6b503a40d0b0c9d9701d7ab672dc0c08c338553b9a7d02e3a550ce06ce891138355a8f9cf3b186028460c5c9d9e0af1c390f364cd9f940f3b183363a2e5ca12eb91004cdc79985c64b2c04cd47366306cd0544083d99caf588b3930b893c8c1b407472366a79c4721041f3d1730cfab3c380e6638daa460c9e1b391b38ac235f72fe3dd6c0d9c9a1d039276933607e08009a8f22f0acd19323d723ef202417da683e7a18962f5d880118000de60e32e0b1d1b33ab9618f1bb6a0a73b137443eae7869546e7825073c38f46c799981b82343a7ad07243198d8e9f951bce6874f47075c390464710446e48a3d1d1c395badc15c8e9861e6874a4e930e6754bca5d7fbaee1445163d14b9f890ab3fab648d14e4ba767de4ae313bd7bbf184dd3483d33f81e9d66fba5c43313920288add46d7a5e8907c535bba13f303be274e4cdb095b939336a58ed445c52646a8064e03a6877a8ba29cfbddf9237874b185c0748241dd55c84661756badf396d8b94e8210d5e5a04d3171724b065b22e896acc7679f28e79ceb3401d811fb7b4bc6acb53fc2bc9699d2f8466daef47c449ff98832313f3f0bfa3d9626884003afad716b25adbe1fd13777ae9a53958a0e2a3ab07a3bb07a3b98dcf9443d1d7a2ef750c8724b3e74e717e0724f479714e5126d7ed73c48412cc58b9bf52f0083c839d9b7a09145e0bc189091508a564c1a6d269bd55a1105641ffe8bd9d39ed25a8bda8cda28dafc682251116980a40962bfd1bd81b7bf7ddf95d80d96311d6b7cb04095959b7f73a526255bfe7851d96395c38ddc1cc15396183835a42973436e72d9aa7a03e584cf9caa9cae3e09298ddb9fc14da11601ff24e4a4f47b9ce129fa1642df265302f89c608687c5cbd89e392bf0989015845c09d2c506ae5a8367f43802f6ba253459365ddd7e1e8b58108b56d8f0ba4e9e982dfc887fb2f01eedcb8041b55cb9534f519e68f245271589e2f75c13817992d047b33f104602c4884da660ea5b0777c4f2c4894e2a71a7c41224c498253ae93a11e7e3b857a5ebceda04f87952a6ee181de8619ab7059296f8574c0b67bebe58f50471e170b31526064914382ce4e6c3981fa3c85d6926c9babab9236b3edd4975e77b274d127716fd350a619a4003468c49a293f86b5d5dd74f1c9a553b2617ebba6b31c9a274b967c5e4f61cbd5b2032f5cd8b569046e55290236239abae37e08ffb7700479cdfbc9e9a5c7de4df35c7bcc0a28cfae64b17c5d295b8f404c5feec27d5cd8f66230a9f8362cbbfddddfdfd1c4b19dc75c1efb16cde6d9d4e6ccc0ed8d5ec25109c3626efb1fe1c3f4bedd71a8a6f5a5c28124da6a1e812cba5147ca2419851effcd93883f491fb738025ce2bc290277c0e611db2e2e5fc671c274b00b1c043072b39ffe93ffd433017740ed2c0b1bbf4cddf2792292acfd249dccbca727da98b33b925adab2765cb81e86e39a9b8d39eee2e0bbb3ea76cbbab49e51f7677e9bf4a44a34eeaae0bfc846c14f20632887eb7eedc724b0f97e7d69c69cdac79b59b514dc9e84f9d6c8cc56050ee62a2ff375ced6e9e5b97a9a7ada1004196f482b021de8aa2cd66c7106308fb4444f45dc43bd1bb880ff15c1b81e8458c1f9e48c4e8e189448cb4271231864f2462149f48c4587b2211442323798871f6761cafec735a88b1869416626c5a1b81bea5e0dbf16fad8d40df8a407fd644b8808480f5031546e752722bcfa10be2796b6a0cc418e38a63f9e1fa7f18cb29a59c3e4ac6e1ba999283dde807ce993d32b29c3a313ff0c001c992c1fc6871738779d6fea924a14efa3bbf75eeee8ce45fce5e4779891e6239ff5cf73ffedc499f801ee2f4ea9b3ff52f3d5cff0ee888f34b36f20be6056cac949654562f4acf2d69d6e45e54d89d4fa94ccb437a41e4cbaf45fc67de1228862f3a43b81c01932dc1a13546d00b6f84d49ea95f4bfc4b79ae6480ad222dd08064100c51b9e954c662c0a18e1d2c7c7293863b75b0747692e828939b4dbb2a7da41882d221ec506efe4f8996246292a6019658d219f5d22c4aa593b468283e3be1aca05fbc4cf930e40982cc1ff991fe5c1b819ff64c0e8efe1cd21a0a19f3d758345d266738cd427221ebe70d27ad36522a632f47d4e59ed4d87c0e2ef7a4b82ea572254a8566b97376b9f3792cbf6ca7fb7ddff732dae982cf6339ab8df3826449ef58824ff7d36119b353c4be5f02b602cf09d70b1cc355f22d300c4b1f7f633f8f331939a35e47e17b2ef77250dd599b9134ab6ff3915c10e7e5cb64d94e973fcc20a9899855029058f6541623cd47ca12d94c50eca9f920288a34a75bd22c1ad368ec457b663b97c5c4b14ff7f7f3b27589cca0962d4bbce297f18c9f66791872b864c38935e6c9cce3338fc1a66eeecac9039b6f693419ed74d9f242f4a6ed9f7f9b3cc76c71fa2380c9c1fc2ea294452b7d602e3ae9ce1e8eb0dbd4711806733e65c00a2ba914c09d3fffffdc7ae79c3b6998bb005488d745df5ab0980f4e55de07ff4942dfe6c3a01d041239279bbd55e8c68ff8b79cbbaa3b1f83361804128d5a29fc993496e823b7a3cb946664095c89a510c0c452c6789b0418319899fee76f4919e3ed2f2ac382f6e0002486ab05499ce4e6982439e6280993ea01c14d9c2b718e0ea02a284273c474f890e1c953143d586168961495c175090e9b355a02874446fc4b43c342971e254f3b6cd00085386d5408c343e8466e3e8cf9316698f3dfbc36ff461b451a083944eea170e4ce8985ce146ab0b2cbf1edb19f98e130292a5ce56c24e9caa61dd2ec18cbf5d85892e49aa68d6e1a67b064391303d701429e5f227de7335398dc12bcb44eeaafcf46d503d92d81df7f3233333397e04f3f64a416443ee3657793f88c17aadb4f3bd3a5ebf613e97255c94e5af6e57216d1afffbd1d8b2829c2bc64d452e3fc463f57bf285bae7e48eb08f67a9498abef3511beebe409fc5aa5a0be1da3c05cfdaecd5a25dfbba279f3c62807d6acd88fe6cc2da086bf3c00126c2071e2858c9a393ac668002509941b0215f142a58e13b19a2761036e717203289383a3ddf9b81201eeeed3a70b525e84525a9bb2bb57ea94d239fdabe539e7f45a29b5b40164f90e717e6843ef199425c2950912254a6b484e4ad68e2a07c52b8a2a17450403455bbddc5b410be4c9765baea85c1097b758f158103f5ceed2a10d1c71c4e52e1db4c8b888175ceed2c1090556c8e2d1eb1ac4e7d2cb3d25dd4a349b8dbb8e19f893efeeee5ffd9dcabf9770b7b7f57b24ea1b957fbbae7528faf80463c0815dee9d386a606730e832330afcc6dc92e87e23ee6774bf5b92b8df7390fb95b9df835f9238f7db45b9df6eec7e4abc5cdc06bc1c58cf54ca801e121f2087e5b0755d7affdc7a891a0f183f341a026e49a4428edb2a8455a1b9fdd5a644e896418fd19811c14ab7e431546b8a38b9fea2ad4897ebff46845cff9b113bd71f77e4caf55fc271fd99b8575585c2bb7a611fa88e7cd0a29fe162e1eeeeee4e410d8818bafd338e972883c2380ddae54af1ba138e28b02d56a8f4b9e3052b2cbad3231287a943ae22ab8f8bfc6d238a26d298f9b71e97c888ff37d1d673467cdff77ddff7b148d1377f109cac087b3207f567d82ead2ba82bfc7edff7f4ebd2c6a5ef27e8fb95c0ef471ab95127559288b402df5f742576b63bc0cfadb5364741a8fa543d5503066fcac506bc5c117dbe634f3555dfea7710489cd5fa483080a24dac5634ab999b2aa6e7d6c7a08d38f560104864b189d573e74a353a177efd7935eb183048e85b9d3b6ead4c7a8a91ea5327429e9c6efd529f288918648a4d5081cfe4d6ee39e7ecb73fc9b2fb65cfe428c039aed8a0056232dcef69cfd426d0e8243bb3f4519d5a75f2a682345557bd205bd4195963e642b2a87bfc9b1fd5471af31a44897f7b57bfafeaf754fda9d5c295665fff458c4e82513f85bb530688d9714a29a529e658a482c36ebf085044fa5e7f36e27a5cea5b7ddb4a25b29a2aab938650b9f5b9d6d91bd2a5a76ead543cd4da5cb7be9d258e57bffe14ab323bb76acd392737b9d4224011fb1b2c04940ff8ce0f682b09608cce77436ed9585942b26ed95a42a26ed95d9aabdbebfad39e734efee0043736d10aa8d2e5b85ef9911fb158c78c616299f4913fed12d2b18e0913e997b5cb75ae3aa6b4ddb2ee6aeffa1321114bcb64d74965ddb93feef6e20c49afa4a539ffcaf3af5cb58b4d4c23d7bf32e92410d79b729edb91225810999a3656fba3e0d394ba7bd7ea01384edd9c3e7dfaf4e9e0fbf7eec13712694d9f3efd51f4f109b4cd0a5fd05df0861ffad9a8b43b112c88bb5d63f17c147cc412e426c1baa3bb5a270c1ee846ada52cdcd5aeee5ca9d2dfbaa5077447b4b484c3dd6eff28fa88ba7b7768683a435621e683b552afb5d65a6ba5d5e7ad9452faf5563aa9d00f3ee2f67f947e5f0dc547bfb735145f0d994d74b77d02b406b7c76bc7f1daa731d29c97d64bdbbbc9ce1ae552dc8839e2036b28beaf7c3b1a4da2fad6edd31a0aabc19458d29268257982a85faf8ff532a5583c6ce5f9fab6f27c05a102b9f7e3cc9434b704afbf3fed44095ebc4e8ea0554246e2f263f7fc4c4da3939a2c8bfc9936592103c80b4c8c1cad3d574d006df5d9218a90d4dca262a689570b43ae049a42a78615ac44c103454512204a9cbd14c65cd6e1720f489a9bc29898095f339ede7084fab5159f9dab81232834405094d966f397b84bfbf071372469cccc6459f330fb1e1bc000240218dd704b01b8202e87f872dedaf3487bb771430fb49eb5fedad84ca1449bed7e1f4942d0d70d12754b1eebdbadf49e82d89d97067a0a69cf2643987fb32296330be7470e25b289c9d682d792241e48975bce398164b9f367963bc5fff02e44f20359c42e707e34bf88c91620c4716af9d12469f48d7bb2c902868310d78dae34e29dbd1f60774e9a9befcd34e6540df08aacce9d3f83741248e8ceacc9e3917e08f371f4e72fc9a021ee430556e043e887ae47952d5c28ccabcd953a48bc76c010c59f1f669c2653aa4491a27565e5060c6b0d99305bc40f233b04d848f598d2834b951d4c10a8c90c5c3140b963870446e2d7126ffc93d734e409ab909c2d2455a8e4669316ad3643b8109242c48906fac65997377f72f5f8a2a746bc21e301efd0ae4b101899a6167ac09982a148a03c5a778a5cf962b34309a01bb6d09df3a2b2a0986c15dad15600074fa03737bcdc61939b6b046929a15ad2e59087b39b9d677777777777374fefee9ecfedee5e492bfbe0b71bd28d605354584476b93a8e20920b27cd714e073035675feef9984626afd7a3caecf5889a73ce773aa311c9e8dc6eb26845778f14bc72751c91950b39450d6239679383f922e811e7f3ed152ef77c04b913b475126dc3c30ec5711766fa23f8a5585f123f729ebe062131629467cb99204678847d31a4e6cd9d14c4e63c71c139d9c108941f14b078c9cd9ecd0f9a44d222fec589224ec4c92e6f717a02e7071fee7c9e3a70cdb43bb142bb2b3a1bc02f496aaaa85499c2414a4d53934052513218c9124383ce0aa452d3891592ea1ad35101e783535b4ced57be93ced9b3a9ad14aa41b193bee79c6cac7c4465d752b204c18e21e40888469716f1108b401ac882316ed26439c1d1d3e7035788d84992b51588506e3e6e4974314cc21295441fbf6f13492b056e29598cc3eda6b4c5052b97c4e4c09fadb5d65a6b59a46822daeffa42108928c16250daef0b7181086420428c80886ff569e3130a6206b7be8d3ba84fa2e8d6771277267ea40d67e26c763f3e5f12f82c8a36dbffed86c3cd481182647cab5f33c1a5eff52341190a2e7db7c0063919a8a385114434a6948b548ba2df70beb4d4c28ffcead653a14d003e9325812326074d03bf04f0c1b72ac07fbeb36fba5f09e6d7d529f55b6723e51bd3f85647d4cad61680e7ad94fc9ed8671fbb001ff983e40b46f24f801171e92be83299dde193886c2049e3231aa39c61819a189435316099623ea220a8fbbeeffbbeef330282b60ab449f307dffcf55c929c538cf4002f31d804c81363adb5d65adb4a29525ca013a7a8ee494cac93cad68dfd11d3d9f9c1a43339f09f5ae65c2db19c766e7646e8f9a61636d13118dd98367edff7cdeffbbeaeadf87041902c4db8604896e29d91460e92b7beb1e85b0b94b6d368ff2599935229fc7ddff77ddf079224488448412c495cefe04a7491c23f26dac24f01cf7de4fbd105663cb7020efd3db76ec95c53c747f4a3a2a6e8d58cf2184e960cc6bc29508c4c6187becd767595a5c5bb2ac65bda00bb75eac098772d8cfec6a6744f6226e868f89821a6fb7f3e3a72d176f9c89fa9088c58b29d18329e4d74c5ea499184fedd3eddd979babb83f4f609d332ccaca8aeff3458837552d9651fba610dd6627d6bc015b16caff6ea2fd71559ea2466ab547b664f511b714dc292b06d3df8e044080d7880cc52eb810911661f526bc9250f46b83485517d4f71e9db6ca2c805b2ec6f31ae0d1ca94803fcc27009a4616a84b5d65a6bad48641bc13622912d398291e8885b6d44d75ab204e20836d17568d3a674d2d994523af956e957bf1e23886897dfa8939e6f5ce3b93c8e795d4b4c22543802dff956f4adfc899a92ec249300146d3f458c4d58b0b0ff5b092616b38bd3fc92b317180e37cdec02b3ba274c4b3e23f96789e5e4e29a63be8fc59c80b61b68bbf104e1a134e196c0845b5f8c63dbda69675b6bedf78db37ee3aca990ddfad48325d9eafbe8e581a5085bb86825100f82604c220cfef020c659d547a14f4daa1d965697ac2c3cae2e1831742480edb0d6daae81e4a46a4104a940f0fb3e1004bf0f04431004c913c2ef036760187edf8c2c9bee389ffac8dd4a14c939d547fe369befd8224e19486bcc599b00d5e926dfc07f61dfad7d3f4106fe0bf0fd3560df3f2b035f902f3ef28387510337dabfd70b0d4c2a7fc14203b4f74fe14a4bb425ae169dc47769098ca663b209dab4840f1c891394525a5301d27182f4c609db8d4ba24b712596be71894bf08d7eafa0276e5d2a21e3d6b20605c113532cc847f4bf157d2d293292786b096880df27b209a7515e388d71ccbc16fc9ca25c621959e2baaefd16b7be091f86605b393c261e73428609634aced331c11a9b55bbaba9011260f017eb39d123f3988b4e024917fee128fa91ff8bbe816fc492d380b2d16a016062c96968b892ff8b7711c20b259c0c77824d348ed715e6f3d29113a0f703c71354509d2eb4a30a7a29a5de93ed130740ed28e06ead9dce5b9a3bbcc43cca92604a72628984b5d6e228f0f6cbdbe423fbcc4ace6cb329809596fcc85780b8dff30b3ff2074151f4a6196eddbaf45f80e0df8f7c462a39704711fe65320ab089ded9fea4beeffbbeeffb3efb81b046fc464ca735e80aee37d66bc3ab1c97c96432994c2603c1671a9b983dcf4819239d6076657d656389822bbbf4bf9186e12022dff77ddff77d460f4eaeadf8706f7debfaa982d615d4ebee574b44dbd64e3bdb3ef84db31f8e2cfac81d7043b4b3b662662d790208e2022219b6846b4711d782e308ae1d435c5a43f181202982f85c74994cb44b421bd2b1dea6dd5f7fb4f956b9b66205b754817dbf61fbe44a3d3023d5ef6b0582f67609d98892d0499cd537f7b7b71bee440a175fbc31ee6f6792cf192e93b99b590040412c2795577dfff194d8467452188eb3915a1094c99ad209279408a2e9eaeb4e1627166e001932224e1043850ac920240cd309645843c3133f67a8b879294750c082a2baa183cf34c98186c8902d3f066d00a686a92239fee828c3cf0e0845e667e6079952eb4f9fbe25a91123313333ed1b4edd5a6bc9b29b7ebd81b825db53ea2477932ad450e3cca4f4c85cc9162f2d0065e5edcb872b382485b7b4c5595a6263d9844b56fa2b23f3b38736182e5261a8ec8c0db4b9d1edf62a6f5d3b644b966081d9de56b5646a4f918af9452a4a7a9976999441bb932c52d1739233549cd0e7363983faec2661d8cf037881c8aabba7842177924c2693595b7ff3d671825fe9f7a57dfe1ec3ef1bbb3e8f80762959ceb820298376fbef9ff60368876bfb1bec1bbbbbd7c7a1fb5ccb7eae9d6193e5dffae5572959d22fe9f73dfdfcd6d12f9383633983defa14fcd2beec7b0cc1b14805d5e93e1553a7bbb207477a65a45f5a3695eed4d650d4b763d9762cab1d4b7bbbbdc7b25eeee91e9ac009228bd6a0cceeee3e7dba20e5eeeed327b3fb9ce4bb0798bba8e4ec56453d2a95b2682000002873150020280c0a8743029158341ee7715c7d14800d7e923e684c9809648130465110c4300cc3401001c0004088310619641043e800a9ff087fc73ea4573c88bfb8d14860c8282e38c60a5e10a712d2e79ef390ba79f26b3f18da56941976f2c15af2949b3db4c51eec95bd345e3c1078f22a14f36d6c9eb9f0d70e81cb1d63a8f490559e447acf10b27db147344f6049f52e47be67c62e89447ea711213f8746351fd10e2744b70818204f4d0bbceb4efd0d06bd8802691dd25167c4237b7c00451f9ae17b746349c7b1e5c90c08d438d634e3cd02a891e29c87b825380cb444ed27559bc144265f052468f9c50d3cbeda13ba331ff57318fbd49513e15e811ae087b885c3123ff46792a280b04f40972793f0ee665f2b29db7ce8b3f07462618dcaa43c20dd488540713aac59215d3d732ba347582f9b00b07bd9f487aed82471603daf3513a0bae709587100d1d10e44be80237150dca53a3bf08a16e3adee6cc60541a85b9aa2f2fbe761d267d9c9c402a8ebcf81b6e8c083c91e5070408c462e9f9fadb766a5f25cb9119dd9ec1faa797b78408540c98584327e1af8d59f041460386291274f35450fde1b1a3eeb8028a069f442faf663d389d472a5668e8db87613002ffa171e6344dc1930b386fe58f66c3731a17f8eba8d4ad32d1ea2711ff80a600708f8a6294eb6b1c8128c5bb61b5c6d95ab8da9fe50e8d228bb2a980239e1acef3d4358c05c35ac2dfd533822f196db9ac98abc91da834ca36da19129f720f7932052fe293c426e1d990925d08c8e126a68cbe71033ab068951ad43a9bc9a900cfb31348a95388608f6fa2fe924fa5eef60289198627088cec2cb9e0b9dfdb4d594a5038670971d6894e8e1c1b92d6aad697ac45108f1c2cd98ae94f21c2caa2046439a14570f89a5b44d4af1cf61ded8826a5c0d459ba078c390a6db4c04ee818fe258d4c3146dfa519bfd6485ea9e04d98f0be73fbb4bb8c91f08d1db7e74bc125ddd9d6c51f035b70cf031a3957974ba938a8b20d8d8c3df0afc4dec3714f999c49cd4918fd95941f7d91530c55eb2a1c9ffa6257a5407e60c9ec81881d48142d2e0d9e24d477c988c5c15834fe347813c2fabe84fc6dd3f893337f09c9971487c12bb154c340427b5028a56c81ca7fdd7f3eb2da1ca19dd7adc2089a5931c7ad785e83aeaf19dc421481b1ac52e3661a0747405852004c83a9ff0b25ea20c1aedd702cb764f2edccd23467ce5c33fce67a70a62953a09f9b0212b9befcbe13e677ccc90616b509786d7d66cdbdccc058ef5f25d50988e915893f05a458481a4b8363f46cd8646e1c3e35dcf245fdcb17bf37943ae841a07bdb7892b594cd15db273a826b074ec9b08aec44b3a69ab9d8c9691b41b1aad0aab0dcecb90c5e4b0771859ba65145cd046e48015cdb47eb1628a7214d467ff4b863c671a9165bf869f55860892e605f706de31e6678620393ce3d319985913c478b5e2c8d8bc4565ece78896ff0f260701f17fc19048b3171f44f563c10a311228ec4ec449c354da3b74af0206aebf975340e3f892d016358ea38b770a617e572254667f17334206debe02eef69eb8d81d46888cea07d833816bbbe6cf93f714aad1f874c1622dec376f18fc11b45ae9386328d3dcd76bef9970435f65f69e76863a819f6fe6afe3664a959670318cd173a60c94943029e7a10bf8278d2f17da38354c4ea1b49923cc14a9a2d7ca72fa16ee8585a24b20e514314c1f1dd5d24746f8e451311232345de71a46165a35dc295b2e3faac9572b4b429c2be38e250012e24e90c0eb07face99c35d9c4f13ed6562c38e662b02f36d871a46a7d0dbee95c6f63f3ffaddfa274e136e00be61be11f26a2534dc83687b8bc150a34f76ce6000d00442731b49d2967a2f1f727964f1a9f61bff57a5f58dfec1913c37e46eb656313735d04338dfdc0ff60ee7573f66d3884c5ff97a4de8b56d30e07bbb9938f75dab73fc5af814dc23d8daabeefc448525864d6937ffd641422670db334623511338a7d3c684eb95741917e3e291d041525abf4f43ef705ca08476651032ea20383e8c4ddaeb209e57d5dd50d0c05366dd2515672ae4338a19da536481a2363ae0f171adf1100eb5a71d5a039e4a59551ba6ca32077adf8d79cdd1aae6513273333b5bbc6bcbfd5f268ee4ef04caf790b51c884d3c9e6dbda2c6982834e070757d8690f24139387ae378a9209f41c29fc4350c24fa2f752e5386e04ae632c161ebe7e49efa09cfac1c89a8908bdeb593d399f9398da19f20335feda82dfbacbbbe2adf1e923e5d66fd86d2bac502099bfd1048ffa8531aa98bb68ffc5a44a28aa64909c1651fedc3bea7b8268a310039c2f5e4f24a63c0e660667a734f19c3b85ec31a3d44ff63683fa14df593683911edee980857d7a085c9908c02b131c386935d38516107af6e2208120c572251d8bfcda63064b8b388359aa0f576a7a6dc3de5ea6a9f8af3a161976b5598e1e1b91a0b4b9fd7bd64eb9b7ad97c2976369a9ceb1c8842a33d86289f6b6ceaf798b5e58af6c1e2057c2b57cc7df8002affb50ff2c347c9c7fff8c0791393c097664e1a653cf4817bddd3fbb0f20fa72fc7f0b3567560c7418d8f7628d46266c2ba8647167a479d45f2d32aac0abe1351ed4b6909dad7d5e184bcab360f2edce48347ba834727649a4eb068b6dbab1682ac617b8b082a071bf1b1748969c354b6a20b138cf4e3775381ce606a830f64880604346d4169aa375f970af219400dc9d2c1c8bfe100f92627214446a9167a7d0e58ce9b26c41e690f95b88d448ddf35ddf6b9aa574419ea48dd6e2fac4203e8762910b777eeb6609cb4356bf68e1ac401342e7be9831bf51dbbc9a0809d81f0d7e939fc13e5e8ada390b44e355db953afd82bfa779e54815425a73e4ccf2a4d51234ca26a53bd703db513c573231692aeda305084002af201fa7f96c814a03e2e1e70cfc2cf609e97cb33a64b5d6a2aef898eb61ebe0d720281211f6b1513891c269b6d912c9238a86d24b8fd07120aed15719b62443957ee88e5dc188cb3cef7e5ba8ba055bac560bc0be356df250668f3f9d7b83f0d8dbc327240fb201240df5e2887f93028ec7bd5bd20af5f27e97e5cdb110105696dbfc01aec8a7356c53fcfd013b6fe2637ae688b480cfdbec162e72161c262dbef363ab8cd28103033868b817545669785d229bcba1a7c5ae374a920332819085fa20b06c59543f1d28cbe159dbab979e02d6688dfc8205897ef17fc433aba17da5345ddb0465977c348801b3bb8fd5610d136bd80cb4579e1fb889c03fc109ef4b00331f07b64a935c837eaa1daa822571724046b2bb1cc2a33894e81f5271508e8bdd6499236a991676defb92f0efbada3f12b11d4f499c53ffb6c47e7af83cf2f788304d391072f5dfcf178658052184f28fe88b843dd6c2ebd05e8de2b9f85e3b6e922f55a3f73a736445eef316bd7fa1972ca06a7f82f26cf6e67e52a1ac099496e904ad7816698f19820c1677a0c6e125345cb9174329aebb837a9ed37292bd133da58d4d14f92a4e5b1b5e22dabf5598de5f486baddadcf3e636791bab2a1da773b9927c8c0087e48f1f23b34f1e875ef614848bb786f7536d40feae57790b8bb7f1907f7813716091b8cc56cb7a7b4e6ce0a8c865ea5ada18bc5aa69c7b01ecdea3a0c395d3532afccde97968e4560eb6f89a3026443601afb77b4a636bd76dfbbe12f44c918326ba4d8a8d826f5e935ece5b084541d49b023278b95ec421546528f942975065dbaddf766b0d7a6be04f65db8801765e463eec6930ef5da024c18076afb3d40ad5ec098d0e6e800ff75125a25299a0c08d9cf1fea17dc54eecab96d079138d696321404ce675cab67d98f81c41529ccde3d66f257d6b5537be364d68cd4e7cbaa41e6713b6a72947ad8f99f223cff7661ffb7f2e6f9514060891e1257cff66f05e577acc74d4aa2edc62b6cd7d67c88e471702dd2cf50e526c5499179ad77bd1aa19da69091c1642cc797af516423bd9a88d3acbe4f47137b4cb5eefdaefa1f78b9629b1e20ad91585eeab01f00ed8dca33f31585ae7c34cb6d6800b56ab821413bdc5ceb84198435f10aa8a1b689e99097aea79b887de2f41adfa31b48315e4606e0bbb431db60ae9bdbb5e2c9fb943c06c7fb4d66f969e289c936d1b1473bc4a794997cccbdb41e990589fe2d21aff396e125e6cd98042ae127a2e1d5e0c6dda88a2ec25dcc60664ba0c3f23d35164445b85e09044839610970dd8831ce182d53d188a490c0a43f2fb157851de61ae91f56d46227f2d758fda25ee7d2a1f587cf8039472fd4a5f0b9ef2e1cb322c9a95fed0f225ff9cc7c6dd4261cdd1ab5ad8b1cc7d3df50e6c999d238663dd716795edcd08af2b2dbfd4331f62e225493976164786e583892d4a83ab7385699cb43b829b268115ae92a79e7e248c828ace825bc1b322aef69334239af0cbd12b9e9a897e5bec9cc55acdb18808438f31393c0ebf00cf179835f157f5fb86be1c24730f227a6efc86914af9f4d3abd37acb605a62f220a472a9c83c0efcfd0eb16e00f2fb14a43a9db73fa2c4ca677f3dff20fcf293ab1c6b558ab0c1cbb93c33317d7192ffd5b9aaff79c12371dc9a1f0ce68dd4f311c82a3c64915e6ebaee5e6d0b282de2198a19c3a0ff41ad781cdf637fd7a2209114bc883533ed0a8c7cdfa34c180e1b4977f05b097d9448212325d9bb474da50a54e1d990e26f8f2a31990ef6a2cf6492dc4542397c2ba51812006c5a33e92f1539c6aea20f01a39807e9a0851f6ec3a3be7ba8cbc7f391befaa57b38c76a5c516421bbc960aaa2ac0a0ba414b43d02efc50de3c3f5ad6f6f2a8b9fb28366378b2b27938849f787cd5334133c2f61bb95ec34bcec8cc72fda9f59a4e766fd3418d8669f6194413ea2d7de5d84f9c0305c60452dfb4e43dbf3fa687854fda2dc31c0b258743d648dd0dd43ae76e58835e225adf161752947194152986d38f524ae33dff9243e2c22f4c3061a7be2d58aa208f3f93a4162ba82e082533520c9eaf816d1175cfcf6c34b71d9d5e7f127e834f6cc62393e798284924174f297af92dcea693a42f485284a24e568601159838f3a3e280140ffbdbb68f3c2b11084bdfb61fb91240b3d145f425416d995fec1b317a4f02f64429f04a1d1792bc6562a090910467e6a3b955184fffc160b18abc267fbfe2ac4bef084861a7aaaf2eea97303800a22e3998425ae0fed37fa74fb98ee81fcaa059fec209704187216af60bc6a164f58bb8d06e8a6aeda5ee4283b63bf5d8e28759abc7e0ce92828238a3f947715a7b35effe704cb1afd82c2b84f47b595e98d33e3e6d6c8fa3543dea74c30b2c37a9fda1e9c1f0a0eb0dce6c1467edc8393ce27a1cba77bad462c128ec82c970af50876ea6e18625274148d7eb5d63d23d80e81739a55f93339dee641ce4e188a0b8a962bdb08c692187c2911541293510915eaf71f9c12602b19403c4afbd6d6af60742b78d4d96e8916dea873790a107f8a17d27129d440f6efe8b6b723d35262882ad8b1b410f93cbdee35e5b0c51f8dc719383bc72811e9cbd9f4716f9c33cf0b4ee01080c8a54a0c5b5f09c604221652e446aed79e8f8e9dae8bf5f3b5f23e2fdfc9ada00067dc8839bb042687ae85be3e241bfbd4445ae10d7224a4b843233e451159090faa1af46ffa603ad29e433dd1a2cb4b9f7250bd7082addbabe0f2e349437407e63ecae4174006e5c787e11c967b57fa1c183ad1bcec4b4428aa2df2122326a15c335336abd6a44a48485cda0937d5fd019f92217f22a7c7cfe28cdee756cf6b5d4e1d61b603212a31f41eb9118956fc6c40e301b80f6de03f0bdc9688b84a7a168f884174325e420cc6c5d1a8d04ba00068f10f4eea9b17024d44b343504261aa92cc7ca6a38e9ba4a6ba648cda882eae92a520ea73d608719bc43d14880d89df810245a6a9cdf485945204e46d1b13eef6403f7016f8e93bf40c35c76029ba878145a180a116abd36201645c7eed9e56a75bd912ebd0a22f038c31874b07fa8c05ac6e58fc463abb2fb8cd35ada56455ef3b945a387126de09732c5d887b120d8edba7052670ad5a276454852599d8030d918ff4c10826489fc651738004ff57b45fe25a1e128109bf6ff3359c4bbe6fc9a350ab23bfa5187e8404dfb1b60e7cc6a5c5f4ff25cdbb7a9c58d03fa28e76601849faf9d237af4e093d7101c04bc6eaa1000e4289b9e08427a9bc340017952e136044773335310308f512f4028679385495b3fbe81c982a1c8e5bdb5c56b200b2a1a4cc6928523e77213d00b7c0e2028f931feda08813a4415888692c78480292d144128ea35aa4885d9e143100cad6308ebf01365effefcedc9451bc3873ee13c954531abba09597f540ffa3347d0ac34b0b5b827e0166ec2911381e0cda1d9b0a34460eb98e91a448839fa3c193f7f10772993e05818c2a51301784ae362da9003b267fdb073b57d3d58512c74dc0bd6fe983d6316c927b1535f4e9d864507d124fdd21142431f030cf6221d9a2d449185a71077532614104b97441a0ea26348da25f7eaf4f290748d1b16ec07965a8b43cc62a2520e2e4a7aedd81ddee83ffaa7f4b2b1a4c24118ac40728adc1e229ad8189d83d4b4ccbafda23e8f30f32db0b99e3e7b199fee789626557dfacb84e2aec8db59264f51eaeccfc0939e86f0134b302a9dc1ee3d7e103b686b730e92fe35fa0c76c206390d83162f9f947821b7f9e41b58b87c6e9c806e8b04abe88951a57d06db485fae9211e705493bfab080230a4b6988c6af2a6d895f7f7a865c4e742c4bb8ddb51a9ba21d0939641a2358f66dc08c75f7f9e1c4dc69f30ff7402101af97fef915c4391b6cec721dd0bea215764d93ea197f1aed1429a5e6757f37f652b30b4bcfade8b1e7578485583bc1f8274d63ebaa6bf5d55f171d3987004307ca4f64e9e63777d3427b2cf76eb48eea6da7f7b71a4c710276e3fd19b976f0a0b421654479b04f2d85e82d3d5a234bb340fc3ca2facdaa2b6c9fc044161508e4887ee513ef739eef009df9126092c9cbce3d1429113c6f98e0187aa29f267bb218c0af0ffd95241166194a673038454971d1a8ab26139856aee178e87fe511162d8e9da82914fca267ee2f951bd10ca548f51ff072be239f9816ea50172f8987e8ca0d4e728e2f04162aead3b14cff09cac713fdad6a813f7b890a459853bff88961e626090267aaaefd6cd0d28ed1b55ac3588879ba69d7a28493c6ef64e0b2adb3366d5c595473d38f6e5aca44c9e9069d8979a2c44076bb7f5a3f27b296973267564f21fa86549ec382ba4586f22221df9c08f60499a3adcfb805fa38e4f990cb2241372adcf7a2d74e2ff4300d42ba949475c96d67c097a657832c20f2420cb3323cbc66b863c6fcd23107f3d29c99683f319fd29cb168df98dbc1eb0f4fc27da44427a2817620a892efe64033528dab2a3f146f891ad18265c0b2e67ba6ec79c394fb83f6e4b7c6ce122a5e2ac70aae60c23ecddc2226ba0de4ec40c4ab34b84bc3e5328026d5b3f921a0142165da76345a321421dea19a4ec0f8cc324c55f7d232b9994fe3b142f0213e6229597aa24e8017e9c7875c993a66ddaee811c5c04ffa4366cd1ecdf2c0acafce7893986510b0f00d11af576b584c26e780c57d34b238386ab1e461fcd95028bda7fcb29754d22f9415f9a67a6f100f345a390fc6d950fb6231cd5ccb2ff3b0a4d0afc2f8bea3b3786c6998ab4e3829a542215e023b9815302e51ab4f11c99ea398a5dd28ca6d33737218f27908110729689ca86e845925541d732a31b515c472586a0462c374ec9ac1732d0a83bc2a825e15b5ad10c157d361b6e13704d481d9d8d3b761dcfaddc087d607900fd1e0939213f53de8bb8cbfaf7c6b9809f847fe8c013228d050d4ab08e229298fb807608648280a8a87f1fb0641e3bff0984d4fcfb1396eababed00521161fa141191eabade739f31dafefa52130419e7f16c753fbe8ac87cc3b483c6f02f5ae8d49e64e70ec3a61e38cb79023d870de025b4a6d7686cb420e04321e0bdb9d967abd179d55248902a9c0a2998f0f6e843c1db7aed3734249aa3182d6507d643635fa5a75256587b5f2bbaa15b98d120866639718cb40f45e4007d1ca1b8b6300a1b705ae2057b6df815cbe0cb5dd9330783517f233f59ea45104a47cdbc7e18411acbabe162967b12d98e4c1cd164dd750489780a60844ec3d436adadfe0b6044a6c690b0c00c04850feef34393db3290ffe52bd43f0414b13c1d3fd162c89f6a136854679cbe2cce58490cb80a55ae3b297c6f5386fd1f040e482bf7529e786e5587ba5b0270202563ba7b6b43d8723d42a5bc08ef34300ac191705b944c1abcfb4ba7a77a031b9c8d11a066fe61cc16b6b9ecdb40dd3bad235ab4d5aecac495c96ddf988324534984240f57f0be90c0a999cc1c6f82715fdb93d9ef12199cf299b84915f5e459caeb87bb2cface4253241a21c370333116568468b73540bf3a8ab35de8bf9e3b021b294bd2e78ea8c7008e9a4a495990554e344ee4798f9131f30a600d803955f7588fb35f490339bd2ee6b1130d975282866cdd58118bf52230fa8f8696a400468c1aa8b52067910522cf1afdb9be47fca78644cc5d31cdb3b379e2c64e346004486d1e7486949761b68e2d557132519e295b27300e3cd5c2652bf0b72f2cb520f44f660a3750210465bcf1e939eabd629ad06f43e48c1144dc88c80561af48bb27d930c96b8c4c00ffd92fd9d84b6869697efa8cf67425952bd865196d22fe547629356eab6980752202b17c5338243cff8b24288e1ef61c0e8002431a15452001b608d91e01d133740e172ef68fc006d291ef8c3543fc787422186150939fe155f9a3fcdf3158a3fd951eed0b2bc9975778916a0d434f9ee45c49d1036de5e05888af2714c493c0ee73a248a7fa792235979e6acfc777d92a3e0a9f54221bd17d1e2e9f20356a0fb75c12e6bcfd9f46b9ca5c18cde30448409c00cbd07601ad898522cb5b2e316a3c2a8bc8a72ac843e5652e76f984548d4be4834f8f0ec7935ed02f30590e478a938ec6f07eba7029b858912546381e743ee7b3f0cbc1eeaeadb4618ff3837960fe256043092365d7464f1586029f0c1215c0443a8588019645599437c24e1f10f64d73e552e8d9f38827cc7013740a59c4058583e45919a33d098291e1869ef07796608468624c3711e0995b852ea5b7259c9c5dc916762c1d8345f2ccb53f2e0094133dcc48f1ef33e8dc83259047dc2772e0cdf45040095eaa2737e633a348a796aaa257db04f1aa7d8a22bc4156dd77a56d8c97f394fed28e9c10c458864d90e566f84a74e57ecf81f1b961fedcd26b50476a32f9daaf41fd1e3a69bb4d8ca8eee1f5265e69b1740f6c3b5681f36b53557dd43d0ee3a97499b76e6088d6fd5ed66d06bf465094d353c6e357506ae28e1b1057dd375760c9271eff4f3df35ce0a3e214794e30a8a0bd0c1dcf421f6fdb4d086ea8e15dd5b81e2c00447e563824fc672ed7eabf2cd4818b26d2ac16f9d71249b62e861b4132327ba18a39d2d283f18da07703f1e5f5ec886b14bcaefe653d4349d65be6022761c5b4b40b229a95e729589caf61ac34db0e31f7822719d7d473d86ff0df34a80a7211c289a0c0768a2f7c4486ea10cf4678840f96cfc2afcca6574128c6895b79134ed09242e8085271602ec0fc74a32afb8ab47b0fd14f423b9c1c7bae6576dba4e6ea50383f525ecac121084df6d71da0f8b2ebbda65b84acf919af5b288df297eed91ce5e0e64900b363776e30a977de1456c0d1f544617156daae885caddaf920a36613dfa127a9d06c0dc781d2a8cad6c8056838d22017447b4d9ce6266adfff98ed589161e7cb222dd010d9de9cbdc32a4feb7d0d26934c426e076912bd2a0be83ff94ea57387bedfa51ffe0321690e3a88882aec199bcb2a203a10fa79baef3816a668cd039d86d0287245190c6c4a7aece1f3356cfab0f544a99b2eb0abe21fb017233711519f7be8def50193decf76dc48a54e8254aff4b6d547855c4ec706e139381f6f121874f084e195033af4a236bdffa28f712430749a5b6de1be55004f97d3e46eb13f6052b6a95f86268b41d328598a3a5983d0650f880d230df16b89a613ad83fcdfc853e88aa221d633ebb8d8717031a729d0de408a3dbce230dba12bc8fec94b03f2b15f691494de7f9221ec47989488e424bbb332a036c90c0eda215a18ff028e59a51f0138d02c6da286d5e1cccf245c0f3e53ca2690bd5dc198c5eca08e798a4cea118cbd7f6a5dd0eef4444ea434f48e86454d953897573755af938c161dfbe5b85ad354456237e5862648e981f3dad6cf9833b6e6b89041a243b23180b94eff4fc84ff2c6cb6f55c1eda2091b44242403591566a6f6c4d579944a132bd232da7e959e772da3bed97363843310737f406e52247fdd0a5293545a13bcb2b7cfcd0e14957dbb712c5241ed22c27bb4d4c2e86ea9cd291fbf532c2cb0a5c7fa414bfab925ed14488d2f2d81073d5d09abe746b7d7e288bbabb323d7d3e240292cdc69b5382c41e4124b50b8de05b5b6eef063d523449f190e1a409c0928d7cdd5b6e6c3c7e9c004ac0f3cbfc0cb5726c824588da698a500fb3915efb59a82c7d34f2400c96f1d6d96bdedf55434b8e0fdce37066395e057db754388e6545061b9ea244f826c59b9e5ad4485dca71d7247d0a1c1471402807a7e5ca19b49c79311dad45ab783d1250b56a5a48d59b7e53efa393fcbe0acc72b1974c6587acb589fc3e25fe2fc6ee8be1d6bd8dffef7f4b0ac655fe0ad04d2685f9a878f619af48dda9918233949c8256f8877e0f54b44c29845b01f4d3ca9a11c5e64706e985dae248ca9db70197f43d480b5b04a0f38c2d0458d330e1221ec2a93c3a90c11d462383eb5641747b65bf50ed46f96daa9c12ea372da4f67fd0611c0897873ac4489196ea8ac22dc0e4360577b50205c5a072fd6088c59e246e1dca86ceb33c88244111e35f5a503342e2ace64bf934d7cbc52728109123e8b98ca8a290e8be56a270d32a3283db45c0f5640bf8edf7ef0c4ed2011fec32ab5641f9b81d64f88cee88965cb6f9cc83730e26caa924faa52bfef44a51db2f7384f924947e35ddb37b6ea33e15eed5598cf54c2f5ecec69916ba344f4b302d1bc8472a6d6ea9550e7159170d2348b6273894bb384ef6d523f5c5cf0780d3eaee0c1052b4a707f9393f56777063d52f4cfb1636eecba087b56484ae7900617b1f544456869db99cd53ace5ab1219f71a3c5afa631b854cc887e75ab14c28897f7b88aa146bb0e1a272651b6ca0aacb35fbe09259bcf3060bcec6914e27499b81f19becd4ec3d7926b0d04c3ab59afb58987a06e1b7fd5621e8db165c229f2b1a5b842789d31e2d37aa2206e086257beebeaa72457e000a90ae415b3ef4d98510e6272956048d5cd7c9ca07fe236c62dbc102206dfa824e729bdc37030b6b3d4a402e8cf9ae3d4a9ffcb9a044e35a616e79164abf757021a7bbd443a12dbe993bfc4151bd45ec8297f479037c66d8fbdf49df353444f26471eb85d69785d7e8eb0a97298faa98ad4f422947f4c8af4edcb1624fb375357fd475cab97ad8a7537da246596b2d6d15df43062a9b676e16405f3d7e44413d311a9e80431e2fe89800672f7d75e7187489f2aaad00497ebd0b8a330842acdf40bb42b96eadf832546b5714bfd2a3e7c6b5424801e4224a07537faa85283893aac21ed4ae0255931d45ed90337bf4662e42641cc5bc8e196fd21fc91ce005092cc080f6901d4f2d450aa6fc582887906fbc4c2e0c0886a5a362b07c309029a8b601258942bce2b010b654341a40acc00d57b93a003a8c38e684e8a6878dcf9937049fc28ae78c1ac75e2bf75305dc6e2f9d1f6caefd971d0320bf8ba8475447f58ae39ad603c8639b262a83f376b79f62c6d05a59f01c2117690569ecfd91d869f76cc08d3b3f5a077c0905cd2a127ce6b38e51dedbdd58f02f8ba8b07862f9c99dfdba72ebeff51c25b1fc7a18dfbd834d117cf3163e96c8ad1091f46e85aaafb44d38d4db9543a5e4036e53060f4ee902d10aa8877736393605abbfcedcff37eec32f716a01a8e64540d7247a535d3a8eb1e58dc6687833f876db37626ef10ef45974359a1b4a09f7baf1caacab8cd3f46090d89135b3178f9674269dc056724a8546b06fcf3524f5922018fb21a38d446378687bd2459c30f5fe0f9191304f65f4b66ada8eb79f18aa3b929a6bc5bf43a0feb63b3b54bfcbafadbbe8422e1c1fd2028c3feba154ccf50f92327815999e42244ec05b791240d21bcba5a607613d9afad4634511911eb61b2b53dfc8af3062b08a8d497643170457037a454883273a246b24044783e780494d93d534842f6803464b57eb6c716b3ad890598a273e3b299e7a2ed097c07b4c1e842ef40ffe7355b9ec228428c48688dd4b33173b397ad79db41f3e11ed8722176767454594960b66a7fb0e0c0f6c096275b00fd338842b6db4c84347cb633e66ca8d197ffd44d3d2496b324efb82d05c34278b92d7317ee41b431a9c57069380b98ea7d637ba3684e3dd881a5292aca4880b41e6c74285f1a63382434d1e4bb1ea02c59521f6f8531984a02624b7f2aeb64d36c7c0eddf39b19d7f3cf07b6ed33a83f4bf4b9ae9989d88857537a7c61b65d7c746eb371252c6a5b6af08fc7296acd169d453fcb0737c094dc2c76e6ace5369c3cfb356973dc08703c22799aabdaaabb02cfd6ed15f890fe23d77f9d521668e84bd5c952fcea3efdefc31f2c4d3bbc102f3e2c1daf5b6279184bd18a77cdd39c5c4076311b3fdc19ba0963da1d1aebf5f752dd87b85be9734f0e53eca1f9143e5b6ac05857daa1466c78a0d03f4942c9cfd572013ec754e154229d69cb4fa46c8e14f513f3cf541f5113614243eb40372a73a6dc45039a97e964ef61947b70cca593117e8a8196446e12637f0cee80d7c0397c354218b2493574e28583c05c420788f5b978681ea9648e775bfc0b8af336da6d17bb09878a0ba32829a8096c0595c9589f116d6c2967d838687bdd86c6ae7a1457c8a760c14ea024a7e12836c9418b6a521c99646ef97dd53153a55ab25e5a33ff59643f09d2f2a443256d524f314f13c5626944a0e415f1f6f61da86600ace922a2fa8dfd7caa94c107c695e5757e6f5a0bacd69d53bdeb090c66d45fe87f01aa3c5d43a9fa59f2843837b1fc9bc8e6e87c02dba347cc51c1ba9f33e90110e7f813a2e367f78624ec394042121e9f8b8e44fee8dbb116f8a49f41625ba1a8d9ad1d4afe1a98eef0bc3fb1ce345ac9879895e47151d91e2e4eda84059b61e1c904812e6717e830953d58bbaad652227c1509767f387b40f6afb6434ca608e6fcc5d5eb6c43874b8262d4f56773fb429f20d3db499e6876ca9d0d83977ce1602db595b55626480e535158ad335a9f86f6ff215112a31ab488746f2542c89787543062cc553c29a69e417ae3c710ae87385e595a1f8605c7fdc1aa5468535d787b149b9c38ba8d81b066423d87f254c7c251444306d77d402f254f8e6313936d817e7f69fbfc1841b423716c194d770c32cfb261cf94c4266e660091d58388a6218c92480f4c606836f634384b1b378cabfca08ea60509f8c8558a350fc6e857aa3227f90181cc9fccff8bc6958f4e5a202353a2353251cda90e6a641f10fc41bc62f95f2b0c3bb9b72514724d16906d902103b1caf974832c5d8f4d7fdea9d5c81c3f8e1ee2f5095a3b8879bd5d111fffc23b61db436563bf596a8930056313967bbf409fd4ee69147f5b25c2eb32c7c396fc5e265b01c211af42b49e69d0ebb9d462a76223a24eb178fccde99cd76af91c1eb02ecad47ce8e8950c0d75f3779e9ba792fcbf26b8f63fe76913a42205e3d8eb6bbc551daa6d18262a334d303785667e4523d8cdef84a5cec0e83179f1f971b0df75a07e9887d95b6ae7bfb79d223eb2df95ba383625217a98b473a66b3fe6371d52b86592f52df0f63962355c5a9e93ade295445fbc1d2d6c49d4b335ed7c8995c662c9f1d8415049eeb24b559ac9d6500de7b828c799c001aaee043026f8870fd1160316f9ae03030c1b7469ef0af1bd83478e844704bde942c3335dece198b854ce0e96f545cd0b95885a8e97c1624f5da483de288d8ac74d1285d2c1fd74ecfc8cb57e00667876c0888e528a27559b12ca4ddc487cda36fa6bd2ff4f2c736a5daed90761d64d980a92b357ef0bc7210dec05699f81a10b29a8b784986f37edef1a4f3ad68558f4b38e543a981d51f44ef7ea8d7a058102c428c3593857c740a6bbb40acdad7aeda4c06c41a4e3976835b1bed5ee16644d554f63ca80f3f968896d2ec521ce91579e04a35bd1de50fe71cbda7986267013143aa1f7ca22e0d99c61e0e8a72fa604f69312000049a16440c35ecc882efa6930b5a0c187e1d1cba96c2fc04532c376d201ed31928f8930800a19092b1e7a3bc32b8f62856f8356d7d601bcbf56625404a3e60b3c7bfd95115abc50077f5820282701237c8703d26bd18c9f06a00f89ca39e416dbb65cbde86c3a4480cf4151707cfc2659c1dda31860a26afb022210daefad2369324c2f9fa48104b931d3b8a6a2eeca453831bd70b6c7bd565a747a415c22d9d521266d583ba0fa1756960c462a2fffc74d1ab4a1737d12bb7a7374a391544af69e6f36dc18687d603d2643d1e5748005356932ad3918d4949d744e102fd69244ef2f0c50302cf0cbea7e0a7a23fafd662616b92e15564db9a5bbd0ce1cb044e00603cdbe6fb4cf3eaaac2cf53740a31249389d751b9ab747c4debcdfa955926ad3dffb9c13a8f72453a329fd51ca5c632b63f9e61f33fbfccc4d68fe40390f5f14422c0634497ae05973c481e773b462a1e529739188983043a5fb9757c51a571f26b481a63be01e5b4ed273d34dffb93034ae0746ee952d7185293e8c393aced94b839060faab387187bcd507facd92d8f78f176b48276e298c1236d3edb8ad44a6694dc5a91838cbccb68502bb4318a46c9281e545f2549a5493c026fb762ec6284ffe57729dd3922556630100966fb982f88b940faa5049dd9c850f0e8ed9832104e48b9d8aae8e8634125a9992207fa9202808a5b91c30e2dfa8f1cb30c12b2f6c108433c46ac9f0eac6c9d6c203d9d96879e4226afad1046ab89355876eee27d394d09f570ae79e063856d7fbe65d004b70c8dfe47f83dac4b6c94c61dd926b43cb7a24306e90febcc2ce12498866ce3f36c1d32ba3a50d27930ae8a7c913e5c6f3a9e076be4bc27990c8698e6a9354e9a70df1f2db9e6d6a7b6f783a6c535bea065b8aece8f4d052591752fdbd486453c9c611b4474a1490d3fb862627e8825725114864bbbdab015f1779a0658848871f371f3576add4d3b61fd281f9e953466e043713a290202bdbbd7f0cf016c9956084d96c56ba0d2a1002f8bd6279ecb4a65d5f6b5f812430043e3f7527430310f2c6681568ebae64ddc48ee4d172d21d76b5b35f374246d1a0f111d57c8aa6001b0095a952b9c415e3eb0abb20391f26bf20c599f4fa205b1269d97c045068df468628d3860b7501e6e4deaa493864122bf31949366b4d846d9ccd29c73322fcc6851fa95cd14e1b576e169763a959072fef05954b37ffccdf234571789743757a7c3b1b76a456d5f9d9b35d1c4d27453875abb4b0f2e3e554608083443a0e0aa98878d4b1c487ef06da1cceac1b5c0a9fc9a988141ddb04770cf0d3a0f2a37a979254708ceab78a23d751165b09d16d400a0f32c7ca269836528768ba5eafba13d1005bb8723a910b3593e044909de2ab2761bf97b1ec5c714ba0d43699e347e80ceeb4d05dab9028efa0e107437d0d2b7c7d310b6ad07e0d240d0b212836bdab9320dc0454f0382e8b1c8f0a587a8a8720edfc8dc3b26fb60303df3c7b444a4499be2a4c5785cdc3435306386cfd4d45650688397d292a042a0037e75d8a716e5a47081ee905c70499d116f3279a4ed867d944fa472088e39744571d549b5a5eaa474481d0bb119e3ddb40a57c7ce47ced0833c2bc090f2f3dd2f5733a2a2b12d8c0dc0a098ad25185de7d0618b70108d287b13f1b6f26d45ec80b722b34b3b8a9ee0a3a2da158bbd064de77ee1b0f4e715fab284287d652b3e8b4afb1a83116d859a0701957f27b8e12e31a5794b8f8466bff8b9bf9db13cdff2f0480d82cb85c7afd805d8a16d85e0c5412ef2482e977ee4413b6c377711405d6b5d293babb05f7740e39c50e95f51b242e73e3b458a428340e1a4083ff0d8961aabbe1916a298ea69e17ab94b025d6445e20eb3d2103b8231c3da0bc950647f891c5be9ed78b06c6bed9b96df81a971f005168b4abba983cbdab470193aa2f0856b6924863ab9aadee876d1547f6719584f525cef3d51b96c3e840d50ca997905ed20c61291983b6993d6b8d0cf128166df37091fad9ace6cee727878f025558fb6fd72673d54f10ffc74cedecd1e1cf929ecf81195b6b69c671b2fe93113e1bbd1cfebfe627f18091b6434c52badf00d5f1bbdd69a8e5eaf6d8314aa107efa01ec55da0d6b1b49bcfec08239cda2e54c35ef14ba936fa077511c28790716b0bcfd1ed0b81e2396158ed409de0bafa564844902ff477220aad92ffeec987501717a725555d3e2b2d709303bb644ff144e37d481591a41a27d4a3592faafeb8fc8d8c91ec1fcbc69f7d2c9b30e1e56180b247d669ec60f2a421783e3252f4236280b418f2efe30cc55c87bb9655ac1484ea6bf77a23af45f8280d3c7831eed64dc1abffa967130559f1b2a11627ef23836d76f45821d99fadac20db1795debd6679c530816cfc20177c0e3e2a75d1fa159fea01c42db7777bc8380243c6621f4d2cb95ab64aba6d19c0bf9db12ae7c223a43c6fbd254804338ef370d0c6354974669bf1a49740e047cd732536f75b86b3189671aec46e80af1ddabf3bc692170a5fa61dd9db5dacb4c805371572e69724f9df5b4cc423173851ef20191f9dd3ce0d4545a5cbb6efe33409aa476dd3530ddf246c838b5c3a97cfc5fc03bd9c645290386d8d62470e1ffdb41dfd20d1a17ce881c871038ab0182ece0d40328d70bc3273c19bf75972f7dd40fe4bf38f902b3fb638fd31a534d934b1206c22fa87180196a0e115588d0115b787ea3a8102e3eab81d49cbe8caa130f8833dc3101fdcc5b9c996ecb19371c70a212edaf8b9fb0868c8d16c8942fcb81bb7a6085a81f1ad507fbf50ebc7bf9c6065b76b4def9db0e0df8a0cef58b62c8affb3604a65ae24f4fac7b6294743eda36ee40a1ab6d739b56011dc682ace1e2f905d677856105b1b50343450466ae7a6adf05af7e608ce12fa52b041155b31a26455b7dd2f871caf9bbc938f58f29b099b47473253c373ca0494df4b456581399d494694b310315ea275f306d8f5f1e40ca1b8f038f7693f5dd304e154f9a67bd201ca0e4889a575a1e1cf7dec0ac18399da364bfa7aee77b483b06fe9d975ab24d3a4f1d1455466086134c5f100e9586691be6679b23302e0f8df1d4ffbd256f2c6f697fdd546f668f9c3169c9793991d20b22ef3e86053fef1eba001b98d851382cc0a5f1daf00f7c4913f1661e98b65cdf3c459a9b4862b46461e9ceadbd1cce991b22b2bf91a91d8473cb2588a8034fe44b1a8f4254e7d8e83bad9966051e000b7608fb440d020e53d4e695a46d145a69bcc1b49e488df8c66c961a6b1c5a8f9a1809262c60c00d469ae4840210f224c0d5062b02d2e298c049824fcc8ad3de5c82f9091b6e2778a6a4f3df21a093c926e6e324bcdeba3d402b007110bb6c61d1dfb51134ff27d7e9511466ec9c14a5a66354e5c80b7397f6d3f9fb46322b9ea8cfa08b5dfa8ec6afd44b11af1a7d61f80e057418320f56e15585a99cef0461dbf1327bc2102bef09b3e8a118956629c141c0cb2a2a26be85e7e136874ae216ad16451e330fb0497cc9ed5bccd3c560d2d2c05cfa10df63511fba98d46f74101bcb1051e7f4d61000a4b95600c977dca618cbfdf2270560ad9dbaa4251f2c02652ae1d5d41521b3256142a607b3ed1f698fb0803d4a599b4475c305b6cef50cf91828949c9257d8ac1a8b2a2cd0b2949a1054a501f17f20c643201f498d38d3f69fe1652c93469fb1e0b6516fd048924a632a7fd2a53a29ab9b38d79379212534d9cc85f99dcaa8aa0e76327f05a8508b70057567d120b2424365dbc37e23b6e6eaa4423e637b856728791568cc9b91ed533110075765a283d2601f8374bcea84e12bca06dfd7598b1ad8c2818039239506cdb4b861dd6c7be86875bc64545ed9af097df9baf2ab7a9ff1834d32e3bd1c3b3ee1942e415d1406fed18b393980a4bdb4fc414a1d081b92bd64c13c5fb2fb4e89ba3c8b6dd95b957f61f38e1a8b0b69f5aeb0624ad27f5703d05b813c64ad0db9e8b5d944ce40a5f301cfcf3c649e407443b92b905762ff89f930155c66b1c76e99cccd165b8da867a08143ffd523846656f145ebfd91b4c63d0d983a5a57221b7cecf21a370918da336b411f833ed1b1805a3cb7a8fda3db1d2d034248234b27dad3dc4a02abacfdaf3ec423773fb357a75bdbf3766ccbb82f8d5e8ed16b5da8198938e394569cc23d79a4072b354e4cdd16415db8cb3ae5ed57dc92dc397ac73afd525fe02c7dbb4444adef0dbd7045844dbf54eccb6ce006d333ab7dc4942b3aaf61a96adf47131aa643a08beabc88166bc2a04a7164c23bf36d33246a4b493b69374861885b9075452fbba5f9a4dbe6173506a2ba33918e3dd04aa591159bba28bea84c94abc8cd09aad7c2e92b06e278fd2da20ab82e9cd1c348f0058afd7d7734b07c74f3a644648dcc1abde18bb7f4a0ebd5f0dcf18f4f2faf37fc7eaf174b84c7524600823a520bc32d498a68e281f0670a6b514f5aee8c248a068505dd29b029ca2adec44960352594910ecd3b8d033d9e80be3b3bda954adb842d8bb2e1260af852abaa6a802a35869f5d3421fe44e5c71b53a497f76a4267d73a4d5e9f13f976dafa3a834ac4c227a9e657d1cd10f81ca5e56573fc27e14649659a88664717130be2ddbfd4a82ae379433be8c8380282cdc5bdb43c70b4c1d6489d0c6927064e7b45c46f665df2cac9f0702a1cb46095b188381cbba0793e020b4dc482c576e743730e7539a98d5d508e2bef894778ef4a8c76b2a20934d646e9e19fb0bee57339a47e1f2e188183a9f22e66c964133d7421610063efeec360f9e506657cd22c5e18f05570b7b6f88f89cdd80496e01b12f24bc9133c421bfd8b654644916340c8070329b3008b86700fc390a10849d74f99abd8cc333ee688eadd32e98baff5cff6f45c7b349ecb49acefa9420d07300fb54100eada486eb75b24973f4c032e10f6882660903904f87e6f9c3706a69986ab9593a5fa4aa0eec3dbd7960cfc7cfca3ab32b435f53ba7d3e152522150dcbe62e3a8726ec7dfc10189c0fd5daa15b5b4ba2526de7831f8ef0dbc0889f85c48e1aad74c69dfc3363da0edd7098d992640836ecf0dd10eff2ac702213d14abc58277c47fb21d9ea676d6bd070ac8aca07f2e58f37c0f8629d8f26bff39ea549db90678ed5eb6380d005630451b97a7863f1a11df5efc84b24343e9cae58e6d35eb2fc76885007afbe447a2275c1cadd4dd4f60f6b58a1250ac376cb4edfd872e67249f24fc934cb3716a2545e5c0f31afd0fc2fe02925ae67c708303489ced85c3f13bc08722fed895bf2719e5c738f6e04a899dfec5d852cb12a0a9784907b83347c76b373ac4f75bbcb503ef2fd33f4a877a3e8ab7c4af54734e4bb440355a388a6a5019f288143bf1c00bfecd7debd4ba26f78da602482b175326ba7aea5e877a19d85224095008bf04fc4c056aff7c88b3e640873e4a42024d88e77680de2a25b8d1ba0847e78c125fac0e3017a1efa0fa9fcf6d14dcf7499c65409706a367efb56881f2b675f81321ee9372a051598b65b7eda23eb9da3b48aca503ecb3238f95d0efbf182b04f10046f5433c7d88c797b8750778f0400fb7e80a212fd5971dc7696d6aef60bc0521fa8c74bd543aca64238dba22e4733c444787f8bec45907f8e3ac7fd50b7d9478e5b6a5a2f5fbc9ace4e8fb670cdce9ba8dd0224c1895f8738ac43928516b5466a64790ffc0e35f1de0230a49284447990c3caaacd82c8268715c2f0dd55503fa1db4c0e1e3a7a117090428063a50a664e56cf8e076e67a26e2a493faa8009fbd5dbe51aff50461353afef4463962d89ef509ac00d65298e971cf2879f04ed4817ccbd84bfae5ba50ae69f265e5da0f233b51e32ab394b8684c4cf3142e7a820f8d21c1a3479e07745d50c856c85a85427d81c2570713feabc44b3ab833efb56c1a6ac0a35088fd1a70cfb219b5c49ba6b00b24827d930bd8a44a419cd9b8c359e3df95eaf1ff4ab57336eedb873d47a3ca2bced1f821bdab1865a85ee1733612887904891b00f94c3ae7a446390bc1b1f5f869875578abfd2ad341f790d06bf225d5d9387f8cffa5a005d88c6a916b647ea430c5a71da8fb6ab468e5e94e7fc2c4a61dbcdda14d7e09aea2f41d747d37c22f7dea11287ee2c159d7e908573a3af4fb26ceda01f66e23f1981e0d7dfdc7ac3a589da47e49a4e5ef12338d20d7aa115cb63a45e81c4cb59509dc287d045a99fc9823e13fff622c3fe04a7af00126f38beaefe074409d32faa41718f15f1efccad8e28c6ab9e83bc2f3a028912f9aee1d3c32578c08c5d277342945b811fadc63c2eae011a889f974f033c15e49b8203dc24be039abc3e42fbfc5a412a7c8fc7e6e8a1bc3aca619f1c41c503fd125382d0836b697615203b0e6b2c7880c888a79051e08e2ca82b6fccff71d2a69f09898203ca2bca3ff3644dc53a2b096e042a641ca4595eb50a51e3435df9e85fcefb8040cecde7109b7ff969478a2e4a4b0715a0e3824b6fab95cfaaadfc8274bdc03a4267be3dbfdc18d811ddc2f218722de25bae1c91065137edd1495ff8779591561f8114b7cbf311213469d04683955e23d8477692dfbeaf0ced6574ba9366ee0a91c9b9ddfe50930d50df45f1b4280156d793008038682dabdf7b60440bebef207ca1738e076771e469d79cff30d916d375fb3c5a9fe6edba5040225df066e6d7baa26bd710cfd38749a8381ef7d43e4a52423b0a1e340f15611a38459644291d5018cf53ab1659c9ca343fd8a3eb3a483f901bd4b4fbc90672677cbd7f771470a3365ca94c51accf8452d6144cecbefbe1ada74b56c5d8293b57e5aecea33adb38b8bc1dc9490e70532f4aa804edbae3373bd0a0a030755761171f7fba377baf63a167a1d562c980903116d400b34320c8687711f8a75d3ca5d70639125a70e711c43f4e5c4dd2409352e4f721bee08b0631eece14f2138487205736c3cdd46c38787ae5370bcdfbabe6ed7a5421b95bda188abd799ce6ec4be0759cbe83688450f7e1a33916c60d01029fe06e17ab37cd3c4487e800e3378a5294c571f6ab2020af18a837fbde99a0eb6cf44734b6f507ac2ab0fb07cfd67eaaa3c593d37b95422ee565aa47b496507291d89cc893159a446e8e8a713c9f06f0199db6edc62da25dae4e6334ec44312f118c744195c62f325b8b9193333294b4547d2b28d02ee694c3a9ab1ddda66f9f81c6946ad9c5f8e9ce1deb9b8251ba6d14d0ef223259179bbe6fe33ec79920c6d9433ae4166dab1656bda102074375e0c35fda7baa53bf8dea30eac0d45af6dbdd91a4a278e981e8c49d0e150ecb867c3be3948ee169899d61e466f5f80a7861484437c5ba1823a8e0d26dfae85e9d676ed2683a0ef5a8aaa7dd4bd6a72e41917e9c89bd9a0b830115c37bbfd80c2de0e0ae6510c102afcc962135b2dec901dc860546e9dc80e79342dc5118066f002908472461f3c5d66ff2fd4fae37f2683ded5a417f4b4ccdce114646210395e09dc06f985b526fecbeaa6ff5187da2e8651653ef8261d4ad95787b1173787f26c5ef46d8e93118163417b7f4976ebecfd7273c8a6ddd2ac242078c2965a873a6607626f0808ae2814da74e9486e67a6d280063566e360134ebe82a3ab5db5d2617e337ad942f985ee8fb705d91f42eea9a63a51a12920fe0daeeb0cad1b07c7ce9b66676e1e01f97d9265e7de357ce3531ecb8de3b6075c092b0db5ba706cf51fc46002ea89a5505c3012c24a076649d6a3e059d64c4f9e1e197bbaaa3ec587b77ea692677717512e5fdfb2b9f4b4ee953cc0b45c1d5765dc98000c00597408846113b005a29e9444b4210051f00ed5b798b0bd46c48778af908dec4df696524a99929401ee04e104f204940b2b90bb3ce773774e8eeb4c89a85dabacb25dddabaa96ea6404b9e7deb78ee3361e0d6e1fb8a3c11630ccccd030b3d65a6badb56ab56ad45e231503b97a5a76d73c1772f56a9e9335df4170db26c581020a068827c82571c7eb2795441d039880669924a7942d7be29873cefac508367982f16af50f82add60dd60661c56ad06d4a931a9096ab0b18ab1f35c6045e84b7d600991b5713244fcc011da05c1f1c70bc72b4bf5aa4f12e09b8277e00224f8f1e4e4e9e04bc7b572b4f9625c92a5e0cb6ab15c127c01c6bad922b0479ec5002adb5166c2d8001f1d2003b116b12115ce1ba6d0fa4b4daaeadb5d69bdaae8d02a3c028f0da1f519ef6bdf5422f0b71dcbd5164ed5a65955d6bad40b1a7bee2ccdd278cf348e8c9f3815c47cb610de3bc1871eca73c6f2153094b51aaa2d9b4146832c5f752583da25a39a56cd973ce39effbf406be5db1aa529bca3b62844b508fa01e413d82ecfdd5b6b55ab328abc7af2146326d3169e5e0e8096adad20a682bf6d45a6badb5de6bc1562b53211f85a6699aa6691a8bfb98eae9525df7d1449d1bb6c022df5779339eec52a0c91a4dd6baf33a6bcfd108ce9733cc804ad5f4cb961bb3d65a6bad0553b2d381b306e3bc1a5561f8c2d2d0859aa7c3b8948d3af31b3627115d225a6badb5d65e6c73c8b5b76dab75ab73dbea56b96f47e3f89599b560bc37f0237c73e335f3010a120ac21a3373fa1225269261b52bbc117a1020eb46adb58a69977c1967aea4793aa9a1be7c797a9a619cf55276f7fec296e5f9a1c766441d15c11995871cc1c2caa106a04224623225aa6910473faa37a4ea96fa94601cc1084e8e0b3363994c44ca19751040040ea5945909ca510b870fa11af5430813274b50a2644c36212a92b21d4141f0587ada82fc48ca0194032807508e1cf6db3ca0a41c37805adefaa3ea4509d32ce9e86886a48495a31991391b1c21081c76b7101d3d4619a5b70b017febae401dad1c1af1526badb5d67aa73079d86d160b04a7a4be2d3246d3a226880b203a2c5a98b6074a23630a484989d227d55e6dc71356aa9bc958489e5d04692890672af5456eeea28e8a489e958b3af43bae489e330450f886a9b9f42c4989c969c6a47483a419933d610c0e1b09098bb5503ec4e0eef50352ce9892d804c61e4da389a14387f62ced63815f8d19b6cde996974fbb7e85c3fb7aa93c1c150a101ac9f4722106b49cba2debd2b5d65a6badf284fa312a451639264002c99d1face5c2d463967474344352c2cad1acd65aab4c1271fcbd7881028a29a6f8b00c87d2c8884a8fd8d354068cbdece5f8319e002d173dc042bcd054e4b5d789a6e119c573cf6edb76ce3927f5e8aa79efd401052526987336e9232bb23ecad2525a7604da0f749c13a8c061775b585b6badb5d656a96f3f05d4a0d71490c0d188279c7234420750f95e9cd8d3f5c3a834800048171109fa0f893af90a4eec69223a82dbe2056b63ccc1122dc1063881b528d8c183282ee1b014f4eab67b5fe5755efd5651e76ada37e448ae600d9d154c58ad2801724d79b40b8164fab76d5b19747d2df2849627ecb4735c4dcdcd4d8e37801a841183d50db07972448065a854caf568b07cd478c0bdde1701fb9e04382fe509b1404db34b30d45ac10ab672c05a6b4da53e20a52d2fb7ffcdb7676975dbac7f974ed6fcdb48aa1d7a569456abd5daaab9265390d9fa74ca7af5ca3be7cb30033a422499de2f72b3dfa16db34a42b0c4e404253b32ca2245260333beb0738b17e10b3bbbf8d8352dde058d8f2a459dfefe5f010ee31325f344eea722d890f1e12aaf647c88f3ea657c78f34ac6afeec766c4f8b0b388f0b2fb89459d7e9ffee8f7d1127480c32e1a9301f0fd5d64f336ef7de1b5f9ff426cf333be7035635ce4df8bf16af50f82366427c217defc06002fe69b69e385538617b2728c198b853364b9f088c81a2fe4720b8f88cc21550a670ea952c8e5902a85ac1c52a5192ff42c116ac665c9fd292fe472536ffb6283443932e5ea838576c524282ad24aec915c54003561d1075e0ee3535c228be293110f483994474d3c40bd5e2f7fe11c97665872b8f21a5d6303d3a7cf39e79c73ce39e7acb5d63a5d065e2aadd48239b4d64a6fdebf568a6dcda1947a92526b6bb4b67a34dac0260c0deeb5f6beb5f6de7bafb5d65a6bf1bdd75a2b238ebdd7edc735f8442d6df9749df2efddaea5d6526aaf03b0dcafddcfa5ad96bb757777a7dd8f7bd95ab7b57aadd57d561ad0f941b81c3faea67b4e8eee9452fa855cf6201eeeed6830fe0c73353a353a6524817aa1fbb65d5d76b4ab6a3169bbc1a2353c38bcdffdc41002962f14ad64dfde67b5c2d8737250f6972f8d5422cac32c490d36c90854f7c9eb4ad34c0c4a15842e29c906381e703d53dd275696d0a108063d68c10f38b0410dae402145882641c062ff9dedd0c5053388589480468be204560575a625c592b86e83d795ab45d1841328982042cc0b5f9a9a76e081e6051fd0f0258928a00801ebd5afba1c9b7610c10e33ac6c13b3d60b6cf92afec0bef287721e50423f8ac49ab8bbdf2cb3d65a19e030fb09394e53100fe7f199c162e7136747483addbd1edd28a7942d7bcea79eb5564a2ba573cef91199b5523be7acf776d17fd89281e28e7fdcd1385a47b03eabd64c358f0811fb4476ea175965fae9a099b6871ad0a9158965790dae419334f50bb5d4dc34cf8c385c111fd42aba06494bd9dd14fb0f21eda23351a7ff9bc9fee0a4e15076276483ac179392b29d1a70288960924812399122155913094b83eed43c3e830243c65bdeddee2edb299416929456ef1079b6d72212d9e3f71c42bcde81ec4e9d2891fdc6b1ffb4620987144af6a7506e725a4aece97c2f95cdae4cbcce73ce39e79c0a88335aebc3ad9ea4b7731123ccba9656faaf59626d1344f866d65a6badd45e23e0648173b24016b86d330552d448a13b88aab5d61cdba35df5f399f2366d46b1d4d8da83e602c6eac70472f562e43057ef459e78ab695784c1ad32cf39a7cf39e7f576b4eb7e78644e6929ad37ac760e69445162cf9115599212931351bbee6f324aec897d2f639248c8e79d67e5f45904d206f98108cee73c199351a23cb1831049984c27512a25a3c41eeb05c78d1cee06a85dac5953c50e4cb02ee8c2eea7e3b6927fc77141e6c8c88adc12a3d2c4367b4e3965d3d8ad9af74e1b46004246e4a4634b4c4e50311cb277ac8994007f5c090e25193256b4ccc6f0708080949468f2540a29503f7c2dc6597ed82266d679743465528888644541382192c52726ac0a1c4a264c9a1cd5d4b5f57e33ea6c1fc16d4e497d3de04ea5c4d819605bfb6e1a0dcbc7bdf409140907a862cb8ccb0bc7ebb56d1f08beb00e58d230030ea352d0d320af11caaab5d2afa10bcf7ad6b3b60d4a9212939394524a2995fc372882143147875caec9379995e299f17c228eeaf3214684de5a6d68764dc2b471dfd95b6b174d98cf79313c8c269ae022874572b326639dc96ae5e459a62cf56d5f88b54fca9040cdd88ccd582c06552b5485aa50329fad563ebb71e693e9bbcb5ce6b249270fb15f6a913c9cc46995e491518ed31f5f64f9d4fd249fa2cdd6643c76a19c7a16d5515146b99d28b7162445a4724072832448ca442f38183194e573fd6e1bbbe0c4130739ce99a50d4d40c890fd0a01873738c836b20ba0091f209501a2074bd8a05de8010c141d644da8e800eba0eeee2622775393dc2c72777783373f958891e7c53f50c9fe2b2164a7b225fb0f4db2ffed7e1ce4b8161441c514263478e1cb9721a22380b862056178008417683b88c194f9ca21e7c392dc3ffbaf0f5c727f7d822904dde4e6e5244e0eb9fbd48307b237ddc0299122185d7f20f92b5f224cf68fbbc137593e78f3d2a869c6e45457cc2802cf124080a5a7c49c3308779f4d2f350bdf936e7800873b594cef586950ce321631443896a8f3399699191b7fb99361e43933133f1bff76a28edcc93d931d8b13111d0b1619d098f512234ee4d13e09a671fcef18ffacf0226e540145d471191575fc758e701781a9cc36f5e9c7238bc44346f9eb58c16ec5a9c8281b7b1c88a85325fbbb535915417325bbcd4e25eab88ca292fd25145146c51e79352ca366484556fdb0355bcd5302d32bc7ccfe3e50c0e4e397c8053669fdd64e13ae362bcc5c5f85996bfff7ce1238e6f83b4d3865b382fcfaf50342532e5dc6fa0d60069c5d39360951747586c0f32b010cbee955cbc71fa8f5721dccd0948f4fbb260f7edd4b57d8fbd138d40a095d28a5943ee745fa568cb8158994fae84b1670e0f01d3be8cf380629668d1491a152a8748ff62164dd474a29a5945efd1db6c3d12e0f47831e7311296304652cd6d2c891190e5f9952fa2cfc10eaf1f2016a9e08638a4f72b6fd20e304b3d4c58a9c9a3514928114991fe38e06e9c783d2203959bec799d3aad57f7a43907843a44f8394d62f941f06c98929ff5a6b7d9fae3d04853265aec8dc572f6ce59c1c0e1935f7b5909381c8af41b97e4172b2c6e55a670d65909cac7159fb6913c4e60b78ae9ff272f490e10026b02c9379c0d0bdea6bfd800c9162721199a7b8d0a9baeeebbe7af3ebbce88543b1da759eb7a341da43fe94ceeb4965d7f40fa0054fd92492d0e5fec826b2497dfa92a8d65a6bad9f67f739c9b6fb69d2202512124a09111283091c4a2e993e0d2513a72893dab5d42eed6d6c2c7885693ce2c958834a3cfb42da3524a4414a3f7bbb869e841aa44cda85a341fa3faf2170189fa0d06e973fa5af233e9a8520f1690a510e23191eacc8a18cf14c187da01d5442b50813777ac0f153ddeed1b3fcc223d2dd5531eac82955c66bc5742fc6abd53f08f6f6f3d11a29e5a4b266ca0f084d81befc42fbdbab7073f3f601e0853203e0250b9a8f82f1a576496a458d1fe17bd6bf27c2cfa87917dfe253956341029c0232054964820111cadce26bde8607838d079f47c63192e507e4029ea7b860e341efc810cc060f1b9f8d97defc6cc4b24f1b356fc38361283693113151f24292186cc9106c7a359e446af1492ca99f2bb0f62c94e01b06d9a8cf2853e68a5cf3d263ca211228aff95a884c391c3acaf30372f3b306fb280789737ac9f1e6b8d3836cf7973de7b4d141b3e7f98547322543c7449dfed782c32a65c62a95764d59bb1aa9c17e21600f083354a8c274d2e3d7f8efff45d841e63e093b0c9969bc7b2f3ed2f86a91cb56d1781aefd3744ceca1f1fe7484afc617ae58dff78538d778df17de5c13f6de5fc5fb31debff1de6f29351b1df7e9dfa79f4dfddbcfa307e7b8552318610a6c83dadd67a4e2c89b9098cc224ca74fa8f9c5079569c5b37c153ccb18b021124cb1058b1327b8324510c6304182301ce0014c0c49c88c467044822069690c12ec081202e4e08913ecc52339c01132e40006e3fbc80c1d628021b1e101ec088c4fa84de87ff1b1d0262800df9b5391b3dd4fa7e3bebfd5b84e01f57d34d842422c5ad4e47454922c5a7c21ae71fc3863fc31f2fcf8ee7eb0ac8594b1f8421a9a54d7753f34cf22f6a87273df3e854cb248caed7946d519b52b8c5145b34beea614cc3a085dd7e1a7c1342c884dd3bdcd8cea25976ee64ba1f34cf792a95db2e6895188316a576ca424dc74c54a96b0fe1955d7c4a57d911d21c98cbacf668599bb5761e68ef3663e86671314e35f7c8c7ff12cb4cba67b99596850f5dd8538772ede795e7cf760bb587cd7759dea83549e0fd587914b0f1d33afcd78aaef7e28a7ba54eabbd4174a1b1ddc77df7da1cd0a2894295326e3b7d1d18560eebe22d4c55754f3798b0f7fd2090d148c652f3e1b1ed871da014360186fc3038684bd789b0648d88b97b017dfea657c888760367f238393dd0f0623c6934c2e6592cc2c9a45325ec2b8b1f9e13c32bed507e3537d2fbaee87860cd8ba573b05dc18de108cf3629645d72b22637843b0d855bb94c48a6cdf01b229f678b63e6d841544794e16da1585da156de647d88ba7f39bb2fa0883f1d4a75fd17164ada3a125343c310412474a2ff0f1b37eeb984f1fe8e61a4c704ddf689940e0f0f5ba17e3d5eabfc396bfdfc8fe73c98bcebc0cc2caf4b7a65fd8d26b8f939d54c91939a3ea384e76522567a4fc1955c76d3faf68ef3e95f21b82429932da26372935edbf7bbbe7ab00afd813734ee215c55828a9c82ac23bb9bbb74da5cabd331375fafb55b97f015d62334945d68c196e1ef924e2f84b1c2e4ec4f127c0757739257beca9806c250d3a13196bd0bf841f60ff0fc00c3894312a4f3e2010af16232791f20519b2bf27e5d4929adfa38b943e847a74f1510196df1fe77b2bcf14e68cffeeffb47fda46072c7f4b2ab2c00e74bf0ff84683fdaf56834dbd9c0fcc03d002ca2f93b291cfe90c81e33b2b5a0008eaee0412344e292762f31c4c90d25254037f5db93795635395192cf970d2a0a813e7e7d3a39cdf93be1c27ba7dff42ff76a7ee4faf75f76feff6399d0775a278c6c6afb1fb7aff8d4ee7a4f369c7e8eefebdcf9e483958a34d93228ac9aac15ce472c8caad4991c35714295b9ea47c000c114274913d0993449826a26061cbca589517e4fecbd57046e42a66ac6c26bdb13a0d1b96f8aa0a0a7448514c69a4b4ae2aa5ef350dbafabd3d243d44bb8f646354b39ff82164b2a61bb63061419559d193097ab862c3079c9aa077368595b117704162c10a6a789ab243a988871ca06240c306727861e610838d0646e604953db15dd64acbb1a90a95a88b5bd01aa59d4d55a6e800cb7288339eabbf7885abcc906d8e4d5594e4104c928ad1e5d3bf2b6f7f9203581299af42cca9a813032c739822622fe61a3452e2c09455232d31e0c06484820ee4b8818cd10d4f72c8988c40d024070e454088b9f1c2d11b1343c05b8e4c3f48ca360abe3932fd000b93154d389137377d25b9e4dd0f954b344fcde5b7114a43cc8440922f5f0432af620a3250b88c4c2d7ff96422c63849f012de242ab08c32d6904ac50f5d2291650b64523c22b717c3a1ecc29ca9ee2679a4130b1832d99445e934533187f21513569aad8eb01194ec069704a8048d1a495a09cd0c00000000f3150000180c088482c17050302410a4cdf514800e698e3e6a5a3a1348025112043108621808429001c610408c31c0286488c61ca09c917301d80f7496547fc5e65996c1e8f014ec5f8e82d33961170e62825cbe57fafaf4abb07463e4810c39eb04b9497e6f277956a278b1c120fdc05aac2d1becbdf99243e6aa8743b00416fbea99cc2193e56f2904f0cc719a51ae96521768974fa6cef1e68bf7b3bf60ee2a5363ac93b826112c96e2d99db716a5ff556f19d1903af5b6e49a999975e5b8834b7364b86846ab7fc5045eb46a83a09c8a89e7e530d90bf33896c12bfc093c3a630b7fbb542336411ad8fecc6b4ef9675a296e665693566f1fc24b8a520addb75bc81f47aa314057ca3d65fe3393ec62e648763ff5f77ef7ee3d5d89e91e97dbc1911ff7ff0b098fc6c1053ac9a4d3fa120fbb47b567d80d096afef912a82f8f26d812c9d90c5b775b47b1d5157477756ff4571757fc682aefe749075c5326659cadf38310cc528c83fbc14349327995199de2145776cc498b84ea7f5171a42d7b5720530c3631912c0dd7804d7556dcf9c18a8c9a21f1b7ea78f07872ac57b69822f48c22d4ad6b4a8e9f7e8b8e94a1d7de44ea6f3ccb9bafe3a7d3eae94ebe0d826ddbd03c04de2e331d436dee7766dc9ba66711eeff1508272b7c13b403aba1d8acd1d04288231061a42e48f39750cd072f3db3d86cb5208c98375a09512905529074d2ce58b4d157a5dfdce10a09ab231c79091d5e8f2487487ac3d9ab1a588036379af2097a29632ff4513e89e92d471b04587b26cd3e724fb71bd3ce415edad7e4586e4c47c42989ad2cd1d54ccf45c5008cca5d81199fb77092ce9d99b98bd7c96dd771114765e3a6a04b1815575ae9d7baf30984ea28421da5e7b3f45a910ea906c9461d7b65ff972dc7e71a5ba7c10616b97857e0924cf64319d59205a89492e12b4d2615f8dfbf0be09f22db33447171380c3d8ae6de0d51455dc26aa64b0734886b96aa8f1306ae9a9b31aefb5974a74a80dfbe00cfc2f7fc81d5d8607b1cc28a70f0d437500e3f8589fd5e3218675f31a17348316e1543d04484b245efc97c1fe43004d8707b7a1f7c001775311adf57074929ef4d307ed34ce24965b50b2684141e5977b1264c560eaa3e16c284a8739b85ce6c1d0590eebee731fd1c3add9a3717b15970f38f65c65bd7822499f5900a872338bc1edf2242d0bec08cfd1e5b10d2ae868fdba9e3d5766ad074e2b5e42ad788cf2eb6b893eca2fc594ebd25a11cd1f84db830dc4ce1eda6d08ec94613e71e25a218975758f84c8692f0ec81e9e8b114cf7008d3ed27f1b3c9d7c5642cb0327600d0fb2a9e69ce1cbf2dae5432857284ec180b550a29f21224aff7a4b9bebf040e759b638f01a61778bf5f375ba10efcafd5c63d073a55d6618ffb96f0b9bb183708b0a21cb700699c98ced40acf48c91979668be11c123e9a54dc8c874e813ca66c6e71e0572427fe0bac61e4673613b25b50fa85dc354de1966030aebd93c96fc03243ccaaed71bbbaf0a57d4652712455071d0fddf0a111183aa7d0975d769583c1d521f7245b8e1f11da9a81ff6d022bdb552d438d3cbacf221be4d62bd9e68c61b93a19ed0793d51976280e828bd8b2c295c8b2446215b468460355cdf1da5ce52bd726cc340f4d4a564652a5c747338b2012a13e7e57ee939e0930a73c7e846d71df1f5ade663da30a7e5d5aea89f2736dd25e32a882bf6da3d1a88fed9abaf5cb0329094499c1c515daad81b2c91fa9b85839ec80efd8efa96bc7ed59e26b5734680033770bb666ffc3214885abd17a3d801f4c04a26fb0b34104d2cc4df87b5fabe38cf52068715c543d0439f47f089cf231783770388588e3028b358618c7c33455e0c6cd79cf49cca361798564bd0f7ffec75d650a80a07027293238d60e701693735a19b8e8bd8780d38e0e98d4742f7b3b572ca7f09c7ecfb62147f57833637a007d9883595dc62c265489577740c9b7875dcd79498e403483941693423b7cc3fb2e003a4cfbc3041537bae1d7eb21e3b341ad399fc8f83ad647bc21805e2c94ebb40b32934eafd61aaf4b534791b446519718d0ee5ea8b063787c3126535f12161fc112b6cc754909ef0c53e4b6ba132ea6c0e5e4aae5abbd8bb3456d7a45d6ab5a56a40f887e987b89101d06d3ba0b91c2b200cc0f4adc53555260d2e8f8636d8444b15e832a1c6a4c2b85ef3ba4888675251d578d72bb141dfe93216917cae092540db889381169033d9411425785b6ffad2e195a042594b7fc7c23f748627524037ab20b19669937a9fc784dbb68848b3e4271249c31da51ad15f733a4cef7701335235f6275c7fcb495f75516efe88fb93e825e33e742323b0568ecdb52b7e1b866c4d3da0caf2dfa2008e103060c93003730b24a379e756c84930e0fc39ca022d3102a275f44b6192b322d44cd8ab19cd2fb9cd2d4ebef4ee03f8f7a8f8c4342354074ba6119accdf1e66ff43fb80fce34f2ad88990d23825d6745a7872da341eaefcb375f5e82e89dc3813dde255381d2815877f267309671267c8b7d1819646bad4ce50feecd86fa1de176f843c3f09cddd2131df4de77dc20da8cf4476d3d5543993b03bc1ebe159f9b0f1bf47156e7408459c0408b3b815bf36141cbda19e33efd25ec843daa5545cdbbd5be21057720b94f2859ba4125e8a2faad083cfb6a3be488b7f6408c873debf64b5cd9c0a8fadb0054df46984212a5d6b20d2f0b049bfdfb266e9a331f2dc815a76283d0f9c5980504e5ded424aeed3ecd5ba7e693a0b203f286a49e768033350d789049042064f88adc4de650ea909e26412667a08d677ec516e8ad513ac45c528413dd123e2e13798dfac4c03f4162c1ad4cb121dc5c3fa29988682801f0acc7f5399248865374eb1c8140b9c88e0fec8c41df1cbf8b655fd61e790ccd2f7d04f00da61a990ace1e154f78586c32d06dfe5aa6f6447ee37dd32f7a8dd16dfaf82d1383ba6ea82d6d93bb768850da3afe3eb711096a55a60cd95ee5f3e13c185ba979693ac4e3ab496f96fa1a17d8170fd73fc7a4210df74bfe677714512c98a3329560821d0dd32c4c314910991fd13bee6b56c442f8d7fc13fc9a1860f0dc10d694a1c23118c4d372aa987eaf01e2b96a787a5b75e6f46927cff331e25afd70e95792bfaa2075667121ba652559da47ab4ac0f78438f4b00017b6b7da7e8489359337b3a09681d94868b1141988973d5f6f3e03dfdd259e22a6752fbbe72b70088d689ed6283c7b208b6db6ec074b6dc408b19ccd8592ad7c9fb162c3ab1f17cff355add75c1eb577e5cf817ca996cf25f8fd0906eab4673de6f23cb30267ebece4beabbe2452cc916b8461972ef6f863321d6087ca2fa4709bf219f3223e13172ec4a410fc84245b882cc70cd1f969387e4c78ed19b2f1f588b318f7e794a0321c2a4127982c988564060c872832a7c9c3baf5488647cf431c84e1ef8b992667cea04108f95d70786542831805858e6a9c12e4069dc629ad52a068015386bdbba812abcdf85f999064fea7743aba0288720835ddbb2e10917fce7535a03ac18d6fb90fb21c76f8be100f03a285e552e969a9e5781aa95c362c57fc2dc54c3cef0712294ddab49010d0a6be9c6b1e383f8adb0b901f06503261ac6c7fad1b4ccfe75660d166bbc1beb63e56b5c95cacc8a2997101d3acc4434a029c697390e605fbfa2ce88834487a9eeeafce794334d7edf04273ffe922ed56e570b43d8b8dee6743d927e69bab3438016e1ef69e179dcd71b8162d410b094947ff02a729759f07bd519b095ca975aa51663695d12896483ce44a836f1a0e89a4643c514d5f60f4e3a75f21280bc77af18e52fbe0b96bcbe1f82ae7ea9d764a4562f9887373a03efa5386ee07b00a28262446b36ff8e075074852715ca138aea023b0fc4a6da827fee203d1ed03894a63702567f8562fa33308f5293eff23651ce229c3e7a6dbb6a330b4e69a38dc5f104adda60a59abfa10da002f9700c97a8975a6eb5d7f5542484080a01b9591134376fbffc2093741e78e444d6633778232d520d8178b3b37f5e1c3d7211a4609497bc05bcfdd2754a110d76377a1ae279a11096747d1aced5801392029fd3652a35e13c9fb1341325caac97c548994bfe92709b0ae6d676bdb01efcb223c8b767bcd515c2f3d60ffcd79d0664d0f8682f03c3e51b765d679e4798165f7f40fea52ceb9aa62ef5b732cf6ddf25f2b772c4893e7bf1aba7286e750e100037e00a0446e61cbad914387ee7c107a3b5089eead3baee95a428170fa004214356402721cb9f034fb6c56eaef47aef486e5ca283673c8d4a05517e06d2d310119dbd963163982c846a7c0cc2e466bfbc8bf9270c5e2afc4dc766ae8aa22722364296e139081c320e3e83c101ba83a8e7a9e93d39afc1f7323899472473545108d93a45cf3d3c028e9aed5e2b3a740b97c8a4f6f6fa74c0ab9fb5e10f44b5b7cbb09b731ce442870256e90d9f128484fb1df5edd067947330fbe48cae595c8e55e243bc032bf55e4a02bd1264a25a1a69c043ed606c4cb1603de2014aa70e06a53df928d521daa8f2b21a7cd8966d80456fd6be1df80117fe8151a70c69e22848b5185d54e00c61001adc5261a5c731f5f00039c3810d0e1eccfcaa890e34d6bcae99501b5b0baed6913ed1bdb9e470790ee92976c2101c460b340f8caa2f7ed3fefe06b30a2355b3942cab7d9beb6739d1b38b5c9b008b53dd8bca1c6b37538013346a0695a09bf10a4c47c25b152a9ddac9f56c9947e4b70585d9b6bee54ab113845f9c5f5d61ca87791cb51dd42543524c9d5201b8ce1602af6de90ae74f3fd7e72b6f1272e65aca737c37884b46da67fb1d07bc8daa3bd1143ce0721edb2327ad35f6fc7aaffc2b19e24d65a625163207f0ede4cc38dc8860466dfdc873fb38370f6b85b418fccc7fcc96e54e665429a861608bd924d4baca9e9997021ccf135ee9419a37a970473ec8f6e4a855a635acfc7486c5f4c83c49bc7f2c02ff187c7572339dcf0d2eddde450361a95414865fbc44568a2e256540ede6ba8051d5e69fe9e2a641e1e6b371e84c9098e611acd3ab96fb379e84716715c7afbe1f10c6585b60d2f69e7e3e13eddd23c7a0ce54909135377188a4092522325c8eb473f7ac1d4877ef09d2900832c7c95ed5355d20492411240aa4826d47f23c8a20edd1b53bdb532c085216ec5d7009abdd2282351785a282523d17aaa7803c48100303e40291b24f9bdec93f1561c4fb9d131a7bf46c6c1770e01a4b750fff4c800d699e0c42ffbf4331bd18d4b2ef7800368fdbc03a01e7cec27af3bb42fc1174bbe26a542e6464651a093b69155f937797f820812de01a16da955a4f825b1cfadb0497e518d1937d4a05873028ef9bd4031ea1d64a4a1afcef19d7bb71fea19de2907bcb866a04de77d05d218d16556b626c74f4de6ab91869eaad0cf290db2ae1118a844dd7836a76caa804aed35757fbae07b872448ba8154489a9109be5b5bc00bd711be978f795dbd9d0f6666bfb0f315984d7a577c28872ba2e88585e639cb9e4cd0e13be790922607383bba5de6aafed4fe1ba7751522732386bf6c15843f0e1d0e81597dfc2368b2f538cd7918597d9ac2be6c8c0fa2a8f4fb8f0788a7ae3bb6fe255fb5158a85fa6f4b0ff00a94ed2d10241023dcffd23475bec86ec8453ee27d8c3068c227e68af055acbe11d1fa166a2a7a57d448f7dda4efa4429af5c6c39df0225d3c0349cec0fa10c554925af59967cb13526af3633c8f38feda1072f5d2a7fc36fcc6e597f4c9eab9070326705e7f24499916092b1fd5b9ae061e2a27b209d8612d923e12aa99e331765307bfa03701b421b8aac2ec4abc340d7e84ddb2b854ed79b548ae56bf0c67e8de628674cc4e46fbe5c38c76dc1cedb44ae5a007cc2165a912540b85d64b2fd23511fc596ca66fa6a067d7837036d4ae6eea5ef84fd8f16bd714bba84cc719b7600105d782929176a0c18011ef54729ba7e3d5fdcc262707021cc3fce4bd661bc0d4a84fe4b9ae97417c27f1ed8f61836080ecb3f3170f551ab948f4d92bb27fb91b080c15adc76fb415c2ec478394a2e083aa8803eacf5e7a4668c2f0f202657d1308c16453b5186e6e73d84d790844a13c4705a6bfe23db667c272570548409193d7b40e2b29e0ec0d87f23b960fbe02e8f2e12088f505c9ceebe2001cbef17fea54b77285dcadddf1d336d817e30880dddfa407e40c9f78d17a870dd28c0afb8cee3f6b4284dfbe84e21af30b5dd8b71908cb027325611d0aababee3592e8b76b28b689d5c1679880594c92f2a5d789e4d9519b89b06ca7e414793828a9ab52fdee8e22d3c3fa6501e54a88f3b3593dc1c153e7e9bf829e0cfb39842576272b942aed8c6fc846c06a4aaa7e40b7129c2fee92fd099aa0f8ff7edeb81d0b8d58ed9df6615373b482722fea658262ca0e24888106b0d3b6aac036d52e4f425385c3b3eddc0e7a7f464bfc67e39b6c07612be7ded270d28d3d3701f5f9d38a6e0663f98386b2dd05f48a82c775b130613c090304d078966622ae547812dbb88105bc50e69f57b5a781f04a3b023ec9c7dbbb0856a0d654525fd754e40004efa779d1cab56b23a2142852456c81d7310ee4e7a834687f2402cdb647e282204c5c670c38d527cb44b2e11feac5e4c9880c11b1d04c9c31261bf37a9b4daec38fb32179db7d38a9a87f37918950f59b863ce8741f756a441951193822b44d904a27118b8de2fb16a37be194fb08f7823fbc17adb596340e77f250d5bd59d4043d40410cc33499ee1714944e6f91b21f4beacd1201af961cdf44c297954c47f13b470ff6b889b499c7ebe172e5b570ed03fe5c0c2a9eb3d66f3448b74301e5f6edff2000104d9752304edb5758f30e79a7828702548a3884e5684d80719ca2bc766edf3c1301b4a7a69dc6792a37b113d4c24315bb6fe5ecd8d5392ded88903864f855d4168ba7554bc8be4a3cfa1c2695f2d21c1d0c3517fce04b99263ab3a124e9cbba3cc7b80a7dd025a0cc3beb413f1a403bed8a5119a384dcc0d2ff6ecddad59812edc8bbb23c61b471ef591cb11a9d3d21f15f30850236b8c70937ae556e2257a18c8e0dc4ed37b723c42aa626a2f1a32c3b5453c8c7ca5ae6ec6e51476ebfc974c98fa52db54a5ccb51c7c0994e02b37db35ba1b0271b3fad9f22d462bd0641a9b5263abe41a175214e30dc79405d68ab125328ae8a765b3516c7c270cd2fe02695b6a73bf5802c88786c20854596dd7bf9095e14c28bdd941b7e1eb392767a7274ddb9f073513ee4191ec59a14747eaa5bf8becb8f57694ae304c4ec588e3f6d421c3d530ad45111feb5a0fbabc54e4eb701481ff2a4f6928516620caaa5427ee2a981188f8a2275c181d54f99f138922c4106a1dcb6a211b710be73a546caeb9f30335232f978b4eb623e2419c64f1288dfc7686ddd641d3c11db8707e27e08050bdd878b092eff67adaf3381ed2723aacb549979e5523b207e28a1bf3293bb6a627dce25a245214978c3295f13891e32bce79096568f0b330ff3eb53ae6c24b7f0fc0168eca5784325729a6a88855b890ae2075f455101285ac207aa40ead9ca4a7c249cd3c7f6caa6a41e3796fc7a23641251349ac90ed2fc603c1fd67d04ef952166f471d805e45104fd4ae9476d79dc29ab6c92226e1ea8e65dedab8d80cee63913f8a560453de7f841b82873ba4f3328f0ab91d5c16080f52989e224aa3c2b4279528da34809d927149ff50ce3f3df3f1c3fa563dcab1441b0285afc629b50a06205be91331e5d45adec572c39c180a8fcfbe6758430460057ac005425469312228c54f0b21d4e76aaa2e7446ce6b538d02b9b60c7db5026ee1901384851630b761195e35016d1ae07806495ebfc6b1acfaa17d63b6f127c43f3cc0c6802491edfd11584aa7e6c8510277ecc3980a918025c24b822fe5aadafea996497e8bf08984a1ac91501e92605e7ddd5f7936cb7c9d98276162bb792096ec4dc58d0018de0f9d979f9ee29c6e159ddabc8d9034518724e970ee9ac88ebac1007d1897e5e6a341bf14b36074c1619d31e9ce89b429aa1ca862fe70450da442d3aa132c9dbdce2da5d858f34c4f9784219b7600286605101dfb1b3dff8288539470ac5ffcb838710c3bc8d2da4d523ca12c39b12f884ceae12af475a943ce75aac2e5a8dd31c390e21cf1222494333795b460a1ff660a2426cfcbf3903973bed7aa0961e5c997587312751a0c25460ee13239efa7aa9b12b051812c166e659dae990bb40b00eaae0586c95479deb8779129019c1ebca31114a3244d761493caf040ea0d5fd066f3fbe38e60813bd57663ccf9562a203b44364e005116af00b1085915544644ef98c61e6458357263d7683258d83f4bbefc2afa080cbc5862e89a87ed5ca846ce9cb7595a88b2c887c6059b606e63859778c0777c92bc82cf470ec7cc5458834f462c2e77ca940c81c35e5bb8ed9000adf11193aeb1942cfec4983078d38f0d2d7468425acc05eefd28220ab9c3c1ba2a551c3fe19157e8d8bc1b0513fa1d8a793970ff701d1c8834d1f6c4c674027c60c96c626f26295923ca46292e7397e93b02a8532753f48c2955727c68dfdc14b81839f5d534874576d43aea83f0ad010e6a1b0444f382aa59c11869e1759a66310fdc16c335612c1f8343fd37e7e6dac90a75061bcc5794367cee3ecc1babf91b99580110127554cc3a78ab01dd0d2102c1cbf1607fbd690412d04fbae196463a9a57179c5ea4c0472bf9cdc74750dd8067b6ce7fe796baf8c050bd8180b1b66c5d6fdd8f448d98ab8d97c8716bbb36daf0ec3bc273b0dd183e1ee94b019ba1124a5e99d72fd4553c7077516413d8926d0112946232f34aad057bb76e54ff748d6cb7d8d37f6d1461d3ad3d94744ff1b5a7da7283a89d83c08d86ffbed21a5cec1ae661234afe8e258f9b699830d99cbc3f04026957d834257290463ca9ced2fc4e51792d6e01b1af7b5da8e5c752581f10f045944573ad4a382a6109a1b0cbde6e166a7cb96469470c254a40357e6744a71f14891820cdd00f92fcf1974b2a36fbd64c1549c08a3eb01ad306cd83c7275ce5e7921d796f64f75ca0d2187744284e1f7f7581485cf7ece163b79fadc0ddb064de7b0b59fb0975ff36689ffba9a83f63fc1fb4501726fad79512d68d90606ecd50d7b8a22c358dbefd93874000b6546e0142cdd0b5cc7fbc17fb2f562f13c62b707f17e9b55b7b70578999ee4b1beb09762fe43c8a1ccba1ed73f84570d5d30206107520865e2ff11081f16cf66eafe07886373b297041bb3d2068ecbe1753c11f4668554780257dfc7a60852faf9b0cf4d3dd0641c5d79d25581f76b80d9f618a546e1b2cdc47b5b2fd212c7ec80bb3142917de7edc8e7342010a19f1d810c116c06088907b70a88918ae660680fe558df1f4c6cdc46c6de131c9a7ab176f508b4ee73c2160417f9f68cb72f2e6924410f6bcff8f465a07d8d3348338942d3bebec74cd56e5fc65e08fe59b3e515d1d8f7631ba6bcc367ab81fcfb86984c5134e070c4f925988e030004249fe77d3b06a3f52f2e0427c4a4cde47c99ad1f70d128c2fb78b97601889c0471996c16f3f1d798a38c9f2db4100d3f9f668a3c9c722cca03ddeff2c9f0196b8796bfcaa9c6ab45b419e99f82814e14ca528bbda90f8e7e900679d68dec197a90a652140c1a5648c3b00160466a50a77c7a7f13f6fa64a925399a382ae5c793ff4f94df8640513dfeb767b442dbf8b8a32e77a20fa2d9349a3484d1ddabf49c873d5d90951a17061880be83ffed6e4d5c2a7d356a1b80698dc99e4aa90b3870ffc2fecebf2ba37300d0b2517762b177f917980cd9a909f2dfcf4215170ca186e60de5fed2003fb09af974f3c41dfad752a2edefc28dfe452734e42e11cd7cfad826622e183eac8538b54cf1d0b3df074d2781a35dd8649aa5ceff37ac857f3479893439ec98d802d181c174aa946fb9c86c6c70d131f9531ff76fb920affc8d3104a33c7aa7762fafb539d08235e75e989bbe1ef91d59c645f34215b02e631f91ee1989af9f053fdd8155560a82e9510250f9d9d579e6ae68bc072026f7aef04385d17843a19b86a415c45982d7939fd57626bc8f361a98a83c8251c3a8037b9abd42aa670bc4f30b1bcaed9d06934118f5b85fdaa44a630785c644c95fabc3384b7b021d2f0cfa1e4439620624ee1b036dc535adb75ab857d056bb80749119846e0344f4eacb325a097f6831cb7dae2e9a2a041d6d657ae0cf013a481f0eaeb3539b07d881687b62f7c6b6b8f0ddc892ad7af14160b04a639f7ac7dbb8f480533af425e5b18c7e2ded0a131c818840e1c7593c3cf3e3e836103fe8faa9efae51b4c542b9ca81bad4809f2ce6bfd25f5f43b4f627e7125651c6272d040d5bf5afb62797396f0401ed31710d36d8b11b4b251bd7b20d2b118d4dd3e36d5745cbf7afd4d9aab0e73c31438ee9d8ad5def4da33bae2ab577bfa1f911d7a14bfb0dea9d562be7ad06f1f3423a21b341b1fb40295c07bad2bd42662ce4eb4c2182648dac36adea744c1662165b8753ea20195eb799a9176e140dc71f35fae1ce3d4035630c70864fd7daaab81dc87e79728401fb8b5c01cfcbd617d472d67b1abb0db41d6a6835a2048e6e8436d1b80b435c614cec873b21d9fa66fece3fac468801a82f0fd2487494cee976f0030f21b0848b2df3cbb29e1b0d1a25e679903c097d18c1120085aac262092b1d8409f427e0172884c3ca1033ee1ca8a03981745cc0b34622b24e2fa997700bc90be701b16930512545915618a29184b17e296419df6dce16938ec43798f0c0969b9c3e4ccb61be5788706d7cfe642328d35876307d2d21b2d17672e9152417e1beaa7ffb50c4e3b554e507d9412987015e289677f6612d6f1823aa72e3fbdf5d1d60d5f7181aee4da9c6cfac008e57f40005e8895378b74f09c8a4a1b3e59db6bb96ab63747e08346714b75a045a1301d2c5fa8be85f5feff1634c823181257d49055a564430e7cd3450f059910602b03705195605c54b4aa6ac1a1278e6083fdef02b616abe64f182e58067b87b8ec169e8cf565a73d3528b8599a6234e86484d65fbd7f3c33d51354a245753058e8fa3a8c548dd56f080361e52667e9a543402dbf2edaa0f93202982118f08fb80b926320b079f193fe8271740f0b3762d3fa47c67aa246bbdcdb1c2adffc1adeac89008ecf7d55600c1828809284dbb646ba2d16726795280679a537cfbdb62fed6d43d298a62d43e1b24850527be680a0e924fe454e63375a9feb31cc30e7353a9e1d53c16097a27e7dec936683f72e9c7dcd8490d98cfbda6662204423727278dbb330b8856cb1e120db75fc3b7b1515c7ff393cc7888b9349b7996f50c86d3c683c950640f95508af8ef919c893adce339cac4132530e20e9c0a5482d6ec02f1c89fcc38041096a1c26bc349e04da4181280c1c7e3caeba86b0fb7f6e206b4fe99d609af04ea228feeea906d86a7a2c5fbbac8981618fe59ab35313f16b3db296f619e749e89fd2339488a0b4f0cb07dc00612a5b65e596a6b41d6450e67a3370aae671ed12bad11acdc56ba38860e661c09c732967dcb9ea9f32341aca45cee0e89f4e71eae8f7425af5e6b92f89c578cf10721fa3dca59f04590f79d5b09d5fd88e5329588e50bf03a6ad1183c6ebc9a847d1ff9f5b44c98e6a80a0e8a5c5c103cc633cc3220459569d31ad835cde37a286687945173b688ac003fa4e666f23c299525b44b0a82c6853e51f68800a0d4a12a6b3b6436022866afe37a9e225ee9df9539c946b86528997ae910b1a8fc99a3c8e331de9d6a0ef088869583f26be07106bd074b3f5abfbe1746ae8d4660b492f6d82179fc9b47ae833f09902a182dd64a15dde64d00fc7ed07efbd03f57840200203eca03454bdc35e8196aa3fc2be778743142b0d0d9833c0a6831862f4af79efcfd93b7393a070886f21affae1b2c7ce28d3b8bce26f5b4699c8250dee076392962ebe80fe06a761838c76e7370ab23d0b97d15ff6c70a29b44683dacf82ee3de3677041022041db1b1cd5b4480d48cb615f87b3b6b8f835b9904e2416a9f71d6bb061b675b15d50539a44adb1e1a6b1fe29b942c3695cfdff11562b4ac4738d81ee3a9a448d435016594c4b1c7ac64c66d1d5e76f32fdab51765c1f0fb3627a93a5dcb02eeda86b65c619e41077475ca4f01db1320ae5fc9b12def2366bafbcdad733c12dd8976a90020218e64ff5a06078e07462d543f9bb18e788c1c726c17e78ac21eb4942d0be4346350edca7ea8a1454b7a4cc9ca85ed68ae9a49409fd8f6c72be4919b099caa4858398e50825404882fa1b2c6b66cf91cdcb5becea1fe08b368a8afb4e5dc8a299718e70a32b96160a507b7876195e3ccf6b41f560f148e112a57374a4f6d0583d16e419bae4634e7e4b5e09570794c11db5491f73fe4ba537f4984f4294f066e765e9e3e9bc9b3482eec8737d9aaa13bfee9097b1c97d0c850d20ea256f3f54803416800e14e9180f5def17fc09cc160dd2cfde2d3a348b1e01a984de7925270ccba6ab4f8834a1c01b8bea2071ee8e8b9becdbd872cd765aa5ec95058b41e05f416a4a421ccc43f5cf8f6f0f99bac5edf33e18f68a2d0e0c936c024ed50007a4c380e40861353cfa304010f926ddaa528dcfb821b27b892bd6ebe09f98bd2101d4ecac344dfc69bc5214b519c339f96882d8876478b29c2f6ac03e208477bd78e04ba9260d51be6460a2a75471b92a149ea3cd174989bfdc55b4c7db1bd4462d645c2762085bec0eee5e2e3eb9c9d4933b97993bba0af7846f7bbea179e0bb24726e3ef2cba6a4196d671b2c08ebddbd4efb4a2b63d52ced242ae06e05a5947681c5da0ea9b00de19c25cc8516c2736922114d2b7ee8bd7e7be61d9015dc72f38b2c6131cbc66615e22cc16367ef111004d149a2f1d14283101c214962551fcc322f777e927cc4a57a46ecc6547b184a4510b8b5aa4c886964c654ab4a1608fe32948cf863d71803f106405aa0d00af89b09d6b2be5f49814de3bb6e3353cf79340177ab3d19c0e386326bb41507297c5d3b825d28ccdc96d38b2ee8ef2111a40a6d8c44a91dfeb4f5dc064f58b2a78377cd8dd3b131763cd3e002e25148eed8b83724818b07eeb7a61cd667978239813d8ed3e8396125b8f12c539852f6d79adf29966055f14951e22c59a0f61347bbca4ff472ebdb680079abb14b6b9d4f774cf2c8e4b791d5b4c9900a2e0ad1000191c8dca90f98d86968d18d040286d445a2cc5d9eab413421a7d3c4324fa50b37375f45b5130102442e39f461ce2f80825cfb14133cdec4e4a5adc0cbb83bfcd888414fe60a818fa86aeb7221fe334e99ab4612099f774bd8f3e4caead15f431089d62a466b030326f2383baf0257d49b72a41a1510769369aa56bf49eec61e1e2cce8290571c71327bcdff54def1e6ca63efb98660d4dc67ad64277c5112e59e395a423081cbaa538de056ce7db60c4b758b88b7a17c6422d3fdf1c831900e49fae32614e4889ea0d498488d527233fd8f27f39ae3e5e57cd968cfeb67d2c99b1a1b18096c91f53b13bd3051bc4b8c348f50169dc5d1be800154cd2cd6765e9205da78af10a3cf0263fbe518d788fc8707e8d77081591c714fa78e1867ab1fea83a30177fa9f8efb8ee219ca4b047da0a38947ad2004adae87347839b393a84d60a97978e12e9e58a4724b75582e539049ff4d8765c8d70a423aee30c4de1c780ac41d3a6bc3eae97da10b6e4857989a90f8083b592b59b452163877493aa532795b10a6080d11668691084e2619764ecfacebf383371e430b5e5ac3ee008171d34d9f72b37ad9f9571c66893dafbcc8c0d929fec9a57bc4a9951e1d0574b85ac14f7958f0a4d40a735a21b90317ce2cdb6c056e4dcb5299449ee1b2746aea915f15ab27a784ddffab756f7f4493d949eeab1444cc6d25bc1d5687ab5eafe15a957be0417c6aa57c8ae18b1cf0d5899acafd61302d13ec7adb1870c99d4ae00c61cb348f3d57b2a00ca1931cf2e75b41d6c6e49d6d933356157a07854d76e557ac0582f632ebd5bb5d2dffd0db9b58e229d9439e7b63dba426abc70e9df1f33e9b871cb0c8ff32860265b74ea89348de2982c0e4c871dbf92c1dcc226a3c081900f03eace60a8adb4727c93d033caf57ef9a50c93b17657814c16dc994510f8b890252101f6a4292854829fc4d2f0505073e7c154da792f555b09312b994d4894b322bbd8bd3b26923e78df768776b753819672378d12a297646aedc58c3a7d205073d2e3651e473d6ca5cfd3e3c6075f14223d7b3bd0b5e9095357d2bad1f8c02e6109e1a28fc3874eece1b3338db7f836eae16df7ae2ffe387e8844d6f926cae76098eb80adbbb0edb763003a0defd710a2270ea5f1417950cdbb81683167aba57216650ebb2cc7c8ea7f233d36fbb233d38bb36926f2a21c99278f56fd9378914f78302cca80f71af2eac431eb5737802f5498087092029f78c90a77e8bf4995a0d99dfdd8f4ac7ac16ba34b2d7156882296165cee0ba40adf1cba069d442d12f12a3dbe48bcdbe88d131cac538982b141820f71e620a12399e771af284b6bc8718d56c9a52bdb0d6c28c5815e1dc81a5dccb1490218dcd10fa3b5d2daf25f596804ce33c72bf9b718bede8b415fd4500dd9977c95af685c0487ded39723099d3fc772f6180d47b387cf3f7dacc2c7abe72d48b9bded90ce5141b96262b1c96996eb525362597eea501c9508b1c25e965bf1124813e578a2e6c0f385bb03e07922df28c5c03a964d74637f18ba137cebc13364405e436f3b2c401dd8466555abf32e0d6c5ce90d317ee10adc35cc9008853f98ce1c28633db6b414e2e418664e731175ce801faf33962a2d370981d22c3721320d02d60f54fc5a2a890e06e8cef8f6a775a8013f3f44d0a9e16856ff37e149eead85e8502287df627e7a2f16b95442664c4dfd50608b9a6aeaa440a0cb3c8118c3c88a38494dd27599b3a1eb059f49b59bb998c371de82207c4bda53f139581d68749d00123283bc4520f8ac530732bc66675e622a604ed5828547ef0e2111599074bc189e4706df6a98c50025059cefbc507986880857eb5ce4c48ae5894748295ceebe396cfee0856231803230f882c2cfae3c3779541f6eff38f00debde01b8900aae4a95a234654e24bf0a884ddf5eaba44b0faedf27dea9684d13b0e61c83507cb9b60629967e3d791f8889fd479fa18201015c85405c7582a4e37359696af941887ce5a462fb13157f126a6900547e890170d7c3193a0cd935493e04a45194578bcc9bb62a719091d95431e950d407859d924e00f5cfeb98a450095398e3aca922c09a147f8abd9d220c54e6960271d57883d18b15c8626e867bd45ed46e8bc36623b7d6fa7f82bedc2d7e7280b95d3209d33d19ed93f1f29cc71cd29f026c6e3fe0538688a2081410890b5a8ec4cde7272369a4688e53af946f2e76aca4b4422f0bcd8008f5750cb8e0fbbb2292a7581b5f94664e5061e83e3a8b928e01ea095f1505b042f8a6205e1c3ee95ae7bba813804ef08877e6a548b032e5b81731207eef558fa0e1f70c66597df861e12a53e52c2340c169ea59c5d371811fb24a390c25d14f531f2d82c55efb4973532e68c25bee1aded3835eaceb4cf42e08994f99c865fcb3ad5e68e456d776a19b33a2c7c7e2069a469eb76c5c8e43d1065d50526de282fc3d655e31c517ea6159dbaa5e831a75deeb914fca7ab9383a4ced678e574e5500b8be6874733e8a9110738c537255722619cf3070e239a5b3cad30be6e30916f9cd084506faddb188330810c45b043c014682588b9373ed5d84260646d5644aaa2fbed7765259e25e51e58044bf774251b5ea79bf1a203218b1a5830b4f02a0a3fd0bb49a65966c95732743785d3a124cdd43ce545510f8fb0093fc059e14094941ca2d3b1e50a7d9cd3620a5624e4843b4b0947ae66b680806c2edbc26327653edf4cb410e0e5722173afd2769a76c811559698ac4396ee7e3c6a702d4f190170fe9737c52a1fc29764f6e04a738b7bee733bb8de34d5241471a70df8ab5ef158ece745324fddcb171003eafa520b38081d2953e86865f4bd28986e900a199abe9eca66285b03c5d238f8c232656c8b0e1dfc3e07f28da6b85551422512729838c3b0265a556027d1be44b01407f265a61105daed6101ec4df189124fce4ebecb2203670c1813090d7abfdfb543e2af39f20e35e3e0a7e5d8bd4ef71faa3f7e78b8571bbe78f9ca9e42c788392d8197dbf467a71a8d51938a0c07f972949a2232d104d878a3420ac9414cc4c7e9bfdd71779cb1c5e80d966b458f4f58c0dd0ab4ee1c6d07701c86302bf60920df7717db2cae1d41bd5dea32e5e09b0147c42ed08675a3ec17911895bbb80c63006ec875d89e6601d9bb301cd65a2e1bf7185c1f1f525dbe07966378182b6b009062b48110085e140ada2cf7ba14e8a3e66f9eb7b4f5d54b24a083e3a556bfb62923c5419098361332b73a15a01958639f9b8ba4090ddf852027898c83644dd08657b106ae231fc89d24b4238280ab3222c7aa240223bb6465e0375bc5010cd56326d7136f27e4da977a9ba28306176b28ce8a84a721833e0367194574e9cb4ce8a0c8b5e6c3814bf87e10c0fe4ee901884d27525f19c0466bf11792cf0cccd75a462e492921cc3e03d3744b6ee1db7a7ae26041c7c5d08517ccfe6feca335b42b43ec24a18e1f2b2920052437237d42529ad8a0f7c95eab1511ed294f3579f2447ebe6c6fcc9498da6b5e2a858314e93e74d77c3d09bf5195b6b04475194001afd78341478b245d7feea9634e04fbc337c87f307d1551275b495b5afb6f789e7c9772e279ecab4ddc7d1377499bcb1e63f76e55f9d7306a4b9d267233e156057410accb5941881b727be66732eab42cc53650a35ae2a5381ed2a5334e59fbce10a6a03722f8af4aec1345075661c87870f9f5bc27e0caf0307749f3af8b041a84fa117380137fa6bfc183da3acada5d308813a20a017ccf5cbb7071bfe2c8f19c723c563a3475af6fbc55b3fe44b04010d63091e954dabf51d193b45e45a2b57f3c246eb02add24868a3b4e08252ca4dece66e6406079215614eb627113027782aa8daca3098ec2e729b44b41516cfb24763f6af553b01d27f1b4ab1ff936968ec284814f362261bbe73d9209a7e2c39a9280b211b0e147b98afcd89c97a581ab5f1eacc699ea264aa14c165d67801781cba80ebd002d211ae55415e6981801a0cd14abb4d1c64ae55c2219456788d2dffe957c354e32fc6d65a5d3137d9a1e45f47945128c97e1d47d57a948f6f22c7add3cd2967e6ab5c00f5dcd0c4c3028745baf43095bc540e34db17f7f5aca4ee6b149fb072456a91e1dd5a3a23db2433d52d491c3e0c68d3e4b3e82d29e5600b8fbfb0b92c6ff3aee044f7ce235c32c60acb15a6775c357354711fe7e5e8620084afa95578738561446794cabcea11c313d3479ee319745d257860316a46f1602401acc717e9ef84e1dceb418517448fccfc8394196dcbc6f7b34edc975966fe42c5d23adde78bb778376cb3f8b523cf172df9d5984eda0d188e4d685020f08960c6d08e59a65c4729aeb180bf6f43a117feac08cc428e931c2237562f6e4de7e1d3bd205ed95dcb0b1679c81e9cebe6b58cda38cc470b3f311e8433aa40dcc50ee5b5ed2c9898e4aa7d33552fac7ee4990980b809f35a4593c89dd0ee13bedfc7def36346d3f86d7e0fcbdb28034ae286f36f12866b056608d5e25596b3b0b92a2bc290a4e289028c589916666c716c44961d3a41272bc20692092ad40b733fb4861c1b29d3c6c25c2b81d15fb473a14c4b913051d4cda0fa6800a61e470a1a63fc9a0cd4351aa867c0254490efaa38c15ffe6c5f522582a5c18e70eae9fe0c28923ef75d8b573d664420fc7aaee06f3c5c9a8f1409f49022b3f0af92d0eca5389ad328ac5e2799ba78221e337317d9596e8e5e49f6c31ca023c574d781fe06aab5c56722277eeb8abc66659189cf7195d154eae6b6c968c9cfb8edaa7371147d853f38cced024a0407ba0347e511e50002f67928fcead46a9c04632fdd91d00a0beca6c50607a6edaf99ee9ee75738d3abfb61f61ba08f37068335c385add57af5c487c8b81919b495fd8f77ac00dbec2664644104072461fdd6608a6459420efae260f42dc91ef956965661d25f696c56f1c491536fca5d99701bc24436dd734e6e45eebcfebcc6858a2903881d4ce0e9439de9ace0206be1b45acfc34026a1b26b8c0bc6e40582a1d33b0359a87343662595289345df1830218f1b2d5bc7e4804ca63c633b98e6b442a9fe621b8287cc6c01d4190e1d87cd7e00cdeab3c659f0849f774f9e4885cdb42ff56b08450008cc574409d9c0ec6847dc93ce161b7cb10121568e81066baf6ba5b93d084977559117ca4069bd67ab1860d3cf584e83fd1707485b15b62eea875b6757db56b2aa97ce473ffb9c6da7f4bd27a4ac6922b42950e91c18d0a5ce6e5e953240bc8b8081a7f5a6cd3e95c68227768d6970c43756037bd7d91d77af63b49584ce64c564adb516a7d787c8ac0452f22e603446e9ef3aaf75a9c21dbd4f8354d9d8456ec2656bb8936e771cc1e7e17878669064d37fdca57c5383f6792535c0b820af0f341886fea7e17749e413090e136bf8189790c6380b2ffa7238ba671bcedecb9142ad66be26197d50785b64b8742e43d430b3e512596df815c5390d69c4e93fc5fe0259a5d2e1390816b3386e114365f24af95e00f41cd937c7dc3a03e9c19332199ee1e1d876cffda1f51ce088eaa807f94288ef4f211a51e9f67a000dc4591e8e5ba097ebd8712703695f02c8305e81bad7bac957158ad748cf4cf80548608cdaa90f56a118b92fad2e08e7353f85b5eddea3483c00300e5d320e1e7199b07e62090d1be9ed4d24a830065735b629b1ab077aa3fc9242db7ea9a094f6360784ab171412b7b28da47fdf2bb7753d41a6dbdc98f69b307942b130d9209e800e8280be91b00d0bea586cb25a41b984aef2664a4652c3f7d9eadaf7292caf2c3b1a6951e83c7a75cc588e11ca45b7253635f48af475c9fc90076938889b19a7b028135330ecad92206a8ca0fd7a8ca970685af5d0d1ed6d076b1e2e88eb7970be7c9f4ab8340fc1356c224d4b8a4564c923f06981b2d6360b9bb613302c275fb75609404ca938b269f9361d0b9cc97c9dc2510c53cb0001fde7d3e88edbb3a621e048eadf8263d24ba90a6baa73111c8f36ac478d40dad98369fdd9e4089a39dab3848d05364ae0e4a36dccb61cd3c000424a102536a434c43306dc499793918407310b828cd94a6604535cbed41a56ad919c37b770a0f7ee066beed02bd144fc857e0bb3bf443b6daf9d335c5ab300f87910481a2e20d9047587d04184841084f21846a3217a425866187fa473021df0434edd459fa99e3912c41b480b10b2f0582e65ad83f4a1617e2bdf300c265d778a15e197fefefba73f37a76b3975fba383cfd056f8915fec446d96d3c99a6e3154a0ff7edfc4fe74b3dae01c5e9b3df644182363eb0c23bbe35e1114230f7f512185d1472d5c9be484c708d771ce751f91840dad826a5752f3d8d08c502ddca70890c930a0478fe125d0a3b7fa8713938da28f92b20f8388e90409e510447bb607283017a178ecd9de3bc09498c6ac0943463552d42c3f865cb42e1364a7f3839b1ac6e25d0c59e7e99c39cdb5669c107c490c40aa3598cd1508afe552f3233e0d7408952bd80c109eb2f156aa726ffc8040f41f100bbe31715e1f6ca8d11032b6827cb30ab9814c403032abf0f2684840b2c1eb13a6212f4f275ca131bfaa4ccc8721613f95a55649eb6f825bee72b4f6b4ae7fa311060d931f69402db25c2476d11a3fd3fdc28ab367a432e974f8b593aa287f92f0e1f1ed4936d85d1a6f37343d80cf47a5184076632db4bec42ed0ca27d4be6bbfa973b8599c71d44f6baf3d7bab243336c6ece6690d4007f7b4a1b019c7c03aa5b9bdbdd9682645f94006ba6762ac7a6c525aac457ab4bbc92f5672c2c8800c33bac1f6bfcd0262f9da706ca2034aa8ba895b304cb34a070d2b551a0cfa41efc570aefed2f24e0ce2a863d4272c41261893c8d650d25b42c41fb9cc950bbeab01303008664f9620bc1607d30eaa50d0c0311cbb84f982e544a25c321889b0fe92112409d97bef2df796492629032e08ed089e08a91bdc433d007ff0518ff3e50e6901b1271925e16394d47f30cb28011543b02327e0a1d4a7f00947e695071f85678ce6f8d7a7de691023f5db3ceac719d382fad4d744a9a9c14348f54f802175fd2b5f9ee4474de4df51afdffd03f2fef6703fb0a35f638967b8dc0f8f5588ecf5e88ba32ca9457f2fcc68c23b263bbe1704ff55f869063f75383b6ad1ffe27073b8f447fa5d105cfaa27712cdf1b7f6de4e52e2de20eed8493449ef14c99e7bffce6ab82b62a473f61a96332cd2cfcdcc16c9de036ba4737f98752f9b4c8b4e936427923efd3429fb5317248f7f91e444fe448ddd49ea3811e59930ffd7ebc89d64f7a2ec477dd43fbd7405d3a2ffc4b54b8b5e8fba64af445649eaf8d7a3fa433daa4464af49641fab13d9bf12519b11d11c222fcafd1aa645ef945f40e5d631b83ef907c172c71622fb0d599da4287b4694fd9f64070aaa4f34c771d020cafefdf5a93e8d36833b62d7cb8d4706f4572c84fc844069d11fa88dea53f6cf86fc3322fffae45fc7f8b710f689eb1e6db494f9e5f2e578bcd9c4b79de089c76e39c9b4982651c4c0e89fe104a3f329c87cf2319f5cadd4122dcaa646e42cd77f3ed127efc91de5d393e04f7f4e21e97ff10519649c71c6182a75e84fdc4a52c78728718904b508846619c680cca17f0392f074c693f4914f4f4f4fd60c2050c88c95654e29a594524a29a55e29a5b4d65aebd34a29a5d5412f404c702b58298e75777777777757eaddedee5eb3c6fd5185b5943645419e53faa86e9e9f237de6cfef163ba9339ff2483092c4203f0b90d293e76c92ad79e7f6d4f322a5ce258925b25c4a428829592e49f1d23596e9cc9c7a287750b872490930592ac125cb2529493e592e256145ee58ef58d4534ac59009ae54278a2915cd27234be4402db045d4d21355620aa5f389d665229135eb50e64deb6e8df5aeaf40dc573c8690ab5f302e4e94dbf459093042fa606066ff6c86a20fa943ff470bb795625168fd354f69665238a570afe17914c5e65136de37b3fa3dbd620b1499dfdf78ecdefb6e2249cadad784ac4a13b26aad7848cddb6021f06b5ec8e6691e09ecde709fc0b06dc279b4323aa2e25628781ed1f9f43e8aaf1edbb4e2110467f0f87ff128e6a6afdc28dc837f7eba43ef693a1b7a38d2785f134ad85c32891acf22a339b3fcdadde79c39b39936b3a9cd9959aebb1b08182cee94560a22c5dd79e2f6c76255fc18b92bcd776baf88750efd0c8fd6563c9370aae04c7169e311491099fb2c3287a7931d14ee389b7cc6ac7e993d0cf29a4d84c8d44c676679901b73d063b56e7fbb797777d7b6592b75acc5296608cda199a4c36e12b613202d6c7287728a32aee4ee3ae7777777d79fed576246b25cdf9f3aa0399487d5f80776019518094678b0703dd0bce428440fa3e9a7c1b27362dd5168be86518c340fcd53dad57137712a464e4949529e88806044525393cea1df454aeed8313f638847c278e613234ab94cbfabb11a6b1ea924732f61446977692ffd549d1502055aec62adc4fa4a3775ac95bac8521df4c314eed845b9c654bdb346c7c4845296cf740223b2c4461a48f77a89e2bf17a924a483eba0df2ebc5e5c9439fe9b9d0927ac436900365cd3b44c2749cb2a980e6304267b9d4afeeeee8e947d6759d6f6189a4f938c7f13f97713a527d9dddd6ab51bcc549a56c87172a9b5d632d2a7be0365df607a472e19a144f61f57893b4e2f53c99f86ddf70bd1f77e14b1507ff72e44fffbb1a79df4a3de1f159a4045e8f142b18fa8fb8f19f3f4e4c58b935353d3952b4a4e690d1d481dff0d09687ae9f944731cb6c4a5df3fbfb3de953e55ab3d69450540eaf8df0064ff49c6f482373c6e7646d2a19494a219aa72a701063940b65cf94cb8f7fb98d68a1a38c8936a594bad62355c93c695ffd340b4b8b2054671e58f202dca9287746ae59039740b135d6d55a794524a29a594d2ea4d9f52daaf80995bfaf4d39a34ee7c205adcd9ae5614d70477fe4fcb166b88b1e5a43dc91430f3dc773b4bdcb187e60fadd43b359fcd2b369f7db63dcbbd6f23b6f0b6b87d0f35cf3c6249f6dda49d64df46bde339fb86927d1ff5cecdd9b710bd23978a5892b39ab36f29cd5361d9bbb78d69ea9d2c1b5d934cce3e1be70f59dcba70e99dcd8c2e60c2642cebe924d1ddbdbd023c6f349eb78ddb6fafd9fc16024dcd86419acd4b9bb7c1b2c59ad08416b3a7c95e442b2cd462d64b7ca872f64d247da8b5cd3abaf4b36fa225bd2366ae76d23baacfbe9f489ffa997b21a47e0b713c0dc71164def068a4f386b9efb19be4ec7184466a66a15421cbfe0c6609a11fa4c5ec53210bf533a3f02b04af2e13b7e73cf0f7f06842f67e0b4713b671c34668666d2f730f6b7bcfdb77216bc32f9983fca0e15593428c0834ba1803c3972d5998f83282325d50e1f231c0bf7b960763079cf2f632cbcffbf086ab16b3d749227b2e7b2060eef6f8a7c5ecb3978e94970dc116b3cfb2efa2ecdb49f63d947d13d521d4978e15441f09ccdf462089cb922c89a3d49f305690fb8451fa134631f8933e4c933f94642e0967110934674e2bf38a6dba4e794e2fe22b88c84f074f491d4b886445e1f00953294f5c0489872c2159f697b9886396075e84651fe79a3bd9b3a5a32e50f27a151957bac4b7f4e595f982ad7fcdef99ffa22fb1c9231023cbb71eccecb698b5fa5d2dd6a0e6916c38d12b62d5acd2cbe58365bd1044082262adb51907d965054c48819d807ae2c21b309510eb081546b24f0404b742b8f7be86339ef635607bfb9d6b66eb5554bdd57eab4597fdb1f53f1d4479c43ba412091232f3d45942ec38f3f691645aa64c993265ca64edad1003646de6999025a4be4879823aa7ffe2d15a141e3d3c82a20d5d566ef6d5c8ccdb671fd096bd677fb33272f62de9237316b6351fb6d0e008638bbb90cfa4fe76b062fa21fc04d3c5960250d9e285153fc6dcd9a2945231ee947abd01b3bb7b08bf861a6128ad957a91061a673cb9538a25a5740ba5748b08cca0744e4a84535a2bf582d25aa91765743932b85a5db0846a29c27249b17eb73812c9e1bb726d22caf3bd4dee3eb3dba7fe2745bb7a03a418b9c353eaf409b97f72d64e29560f548bb3b073e65f3d90fb673bed867529990a67fd3b936b4b4a6537ac9bde9433d92f907b26b75771ffcca0d4d0e05065b95ad9b0a23d6710d2e76629c5aa59eb457e6e4915e0872c533a279196d9d387cef6a8c4f94e6d47b11938dd49e507983b5b997a3f5270274ef6de99b37aa066f526730fc19c659af7e3cb9d2f7f9071e7fff0c2ad8804fd18c3f37ea0e0ce47793fc448793fba5ceff3f209dd023a587952fa703536cb16c6f00232a72f2075a0dcf9369e943e5a96df81de8f30ee8d57b3ed69b129e640eadca43b7fecf1f15a59546ca79627a50fd53270cae1fd0043878e1c2d164e0e1467a5b3f40937505724718571ef9940c144145b4247964b2d90612232e24ad3bb515f792309cfc7ab793a363434d4e48d2f50658e52655443e0481a1a1a52c283eafbb1a78cada424c70c2549995efe56f96be5cf953f1f41f2c78113dff7bd7c227fefdf5b15f2f7378afc7d4c2b60c91f0b31e48f85a5fcb52043fe985ac0227f4434e4efca67efa8e8bcce47ee82e4ae93dd77aeee650cb97bef1d1fb97b7b516022770fa6d042eefec51972c794c216b9fb9e1e72f73f1d930a25c81d531225b97bee03ea9a7a2873bf7d409c6f5b2b6fdb56464cde988694c85b1924f2f6f328dbd73e20ebdacb37ccb03bd5287beb8d28b2ec3e4fb86ca40605c08076d980d228e84cb293e57c2246854ce9db2bc6874c1f14e394e9ff181e327d714c1899fe8b0d2332fd9e1f36aac8f43b4892e907b5f144a64f248436d2c8f4454022d327c10437d018228304510a4552e4d20a5690e9b71116b9e737675ca0ac114ccfab54c8e899be3f36d2b993402570daebf63a68bdf37c0d3965f79f4eb267f0afbd1774d0e6580ab868138012c50a3a8060045c52404202252ec2984146098b30ce844a17289f99850a2cd408638d24d48021f76bf00135789364b1210d269e525802890f49482041310231496b509f454343432e885b1ab999a2e4eeeeeeeef980dab916131772ca13972d671c71460c0d1cd058230da53022500385eccff301b992952768769ccbd3901952e4fe017c400df698a08c29b2bffb5b339c64ff205704575861c10927c034b10209c60a2ae050430a612c1dc17c4abba1814505273fb6b8e395403e203a97caf02103db3242055760f00179eb87561e3d305fa8a088ecffba54f3a20a477f7c40ee19fc90538019025344ee97294022f75ff001f51391021630c8fe3ab68a0a70f8f880e8ddc07ea9e20b0bb9df826b05171c734700ae411e570520a30a1930e4fe1c1002438c81822c4655da580236de5c858d36a808028c124444e1336019637dc44993fb651bb93f001f50db21bc31ccf04282ec0f801e1c5080c6183e64ff1e97670d2531aa400110d9df25458c1cb2fff3f8809c8913496ee4b0e5c9964b7924e0c30d5b1cdda0254b0b307fb14ab75ed44c5861851ba88a3f20776e854c3ffc80686f41491f3c5d48200693dcff62bf2493fbff03ea03207119c000f2e8030c165e601c11860c6150c9fe3b5e24b0228b00a810208f728a16799458749164b84002001758b23fd88510d9ffc52e5e5e5c91fd7bbc1893fd7f9ac8fe1d043991c9fe4442f8024bf61781041374cca1561373c96a8b054d728a15120bc9458b1417680993fdc12d57b2ff6f8194fdc516b2ffabe7874b11d9bf8320225cb8c8fe399c5a3120797465e7400b157468b143762dd86812a2894cf66f7d406eb4e2208fad2c70c8220b33b23f98854af6677d40fe6dec50b4c46444041428b0f13ec0061894b4c08395299860db1957986c38592cd8c1e2062cccc01246eebfd981933ee05cb59ae94b6e2c503061c9fd361f0512354c2de47e9a0fa8af74d2d0d0d00c306f6c6577b9f2e823bb73f12ddc251777dfc22f705fa22229fbbb57c124bb57d143f62acec86ec512d9ad70ca5e2589ec57d090fd8aa7ec1f44c44a52f60fe10a51f617218cec4fc29537b22f2d69c9fe936816ad3e207722c50754eeee38669029a648cafdaa0fa89994bc98f9801cec41c9070dee07e4a00d5ce471e593c796142758a20243f6252a60b27fea03f2f73cf72c927ca80f88aea40841145d72ff074ea142e54d89828a10704db93d0f8b15ef2298bb7b6e3d7b95a614e57ead27ca1ddda17892dd1d0a2ea0fb90de7117ab58c1dd5da43c978a1cdcf9d5b138a194e58910e4fefbc419b9dfc12a5168e895d8189f2207947b6ebd5e8a2de56ef716f0839cf3e948eabd22fa738cf4b1479086a4defb23f73b2ae57ef71f7433618f2730552834935698d205ec8446830c0ca9a7d08228cb29b28ca992e5145980c8b34bef58ea3ffa55e252e9e3930d3994e9193287fe5855aa9f5161a47e59e5f68f9715f4bdcc43500f44ef1d42e4419016dd22fb352043c10260765cc4be8bb777b8776771f755ff414a858f1c51fde5f0cc9ce30666ee3b6b5321cb7fe625ec86a9ffa09bc147ee7b4752dfbd8439be3735430b660e8f22e40d8f00e68983b4224a33ea25d32610bc1715fe844344738c17be680ebdf68a40bf02f7de5bc29cb7861983b437c81d32b57db9d0220aeaee3de79c73ce39e79cd2bb534a29a57c570b049d748df629bb4d8d8a0695b2c14e746912117523e9238fba6f0ff73b61961182225c80dd179a6738c14ec87102d8c548da8fe0cf0d37f535df512ff34aa673fce557ffccdd23e31e267f507ee59edcab9e43fd90140a0b217178484dcd0ba132dfb24cce3b55288bc352cee628a8a02128fc34c7efd33cea55efa8ffe03e0a7f40f32a9ce43e4df79ab5e3ad6c8c190ed99f3e75ffca4686c3e4a128642e643164bfd90dd95fceac88ec1910d9331e9c88e6b83b913afeb01f562eea859086a45e2584b4fa2324d01c177ad11c9cc7818f04cdd427e9a3cafed5fb29ce9c64ff0e5b881657ab5fb1fee6c7971616f6bfc17388e62471338483917ac470efd33c8e5f3df8363fca980d0e81e624f1340f90c6bd011f8542a1f010cae8e6413c6d3ee1eff80748d80fcda1effad67fe0fa16fe233bb050889b3ec01f7e888fb43011cc03b32c2e6148eb79fc3feb3f78d6ebf8233cb090f8818e6f7d0b1f61611190c046a9c4e3c79ed64b186bd514be84edf8517c090b3112cb8322aaf79779945ebaf670a89e47b8e3c330c7bbc27f1ceaf8d9e3c1971fab7ec541374fa40746f20701f048603636363d1e0058c8e67b60a455078636368f5d7fc4069b801ffc1e1f012d3db0a439208f6fbdebf18f93c8f53c5e02f85b9815c483c74f5818fe8485acfa3d1e09ec266455cc0abab9697d0f2c74f32d8ca47a9c4702f390e51d4e28843404e76fb010d203242cc911a42137afe38ffc1fb9c13a1ee75b1f012d77c7b3702290c4ddf1acffd7f1ff3b5e023a9e8559413b76fc84e5c8f1139643c26ec26933979852fa49ef34a69c932bb12b4a5762d3a9c52e2dd29f4edbe6e2b1c281c31da1a439aa702674b5585f479823bc2388965a40cc45b8ef1a8f620d4724b922094731774f13b2b4bfd1b4b7a1f91b2cc4d2fee6258ce685c0b7f90f70fe061f693dcedbe02348435a8ff347580f228175efea9d54f797f2dc7cc77af089b4f0c479f99530a4f52c2c34bdd01cfa2d4cff0112369f581f4cd8cd4fd8cd4b18ebc739868591581e787fffe222da7b2fb384d9fc38bd747f404e51a8ffd0d5e2056d1772df8e3d942d7e19ab29479324c5e888b3bf7de761ad35fb9a7dd98674ee68fa8464af619be1562151353883f69d6c1efadad4dee61d4db751550399a36959825ab2a6690f73e2f6644dfb1ee9c3236bffd301e569ed25d5348d7ef768da6ceda9f63e5ecdc341e768402f2677fcacbdf6a0c63d17765dd7596bb3d0e6db3bf6b6a8556bed5bca43dffea53c2388d97e67b55fb171ade6012bdbb7da6b58d32c4cfbdb3bdfa2a6fdf4b4a83d9023bc1d4d55c3456892460508a48e6c97edb388d27e32b36c0e39ce30ce9a524af1ff8e3e6a4d9525131311b4b1a9c0e1807a8288a3eae5c8f3318cf8a6f8417bc28cba313d0185968c06a28d69264b26264d7e40e30b1bc8d4f0e4e88924438a3086f8e2430a4d92c8e04935b068103d28265e964c4b56a0ad8088a4269ab0b14df16264cb681943312d3183264ba6255b989658a9b265cb166b6f0bcce074c1b9304ba8745b5c56964c4b84b861890c291fee4c964c4b5010630a252ac8b889064e5ab7612451316ec6b4c5ddb2645232856542891315cccdb264526282573329417aa1a2c0a99d2e4e964c4a66404171bf2c9994b0e07d2903c3b559327d400c0f1f787ac007bcd42c993e30a58abd16cc1163a2098e16a556ac0825374b45ac180f45a015229c978dc1e6d5f30ad273a5cb153037d7be624331d4d86bbdcb25898b14f03e15d1c46cc670619565a846cb0b38b078a259225231495999a086992c8e70f840c3d532a46a220725292b334d3079014574ddf896a4a4bec0c1c3e284b222439725f641c135792f7b0493edd5f30ad2b3055107c412bbc509f7b227c0a1487bf5bc82f43419d1397289ceb14d533a6703edeb042ec490d96bbd8b458aa53caf9775e385faea7905e9b17245b3f665c612b7d77a778b239a23c140c0154a5930414016a32a4408d0e285891813042c3909e088ad4b199996eb65b994048c4e875b93e552122bb62c5795e55212258eb838592e2531f29ab85d964b4968a86e244921cb72fd0dcd04970bc36971b3326c1a17e5f4657169aa4091b92b24b22f4008a1c20d4f5458e2b970bf32dc1097e68bb6c305993a362e8e263c145c1411a819ee76c455b9b5072d4a0e3d5c9be5520a33fc7067b25c4a2185266e96e5120a645e455c2ecb2514d020c1f52c97502823c6a5ab5fc30e68ce7cd0e76660b1677bc3bea99498fa07412f959aa1cc99bf592d95f2148ef95dea5eca49a17965c5978ca1e8dc7a665eb529da3d2d76a1ed3c1c15973bb7b73d9a63a6d297d25b2b1eaf7358363820cdaa06c6aa69d1e4a03a76fccef65b685fc70744bdf66096a16e3ff4ee7d5b5fda0ddc709d36f49fa153ff54751e28570f0f009d88c3dfa1030bc002cf1b280577f4ecc3d3f1bc77bc45bfe087e7e281c3775514a76a633600728fdc3c72bbb04bc6729769d69ba1f8c220cba58ee336ab7959add5a382524a29bd53a6286d8a1aa5945252b1e7f7bf63b499525a27ed324ecaff1de1dc2c683750e3dc1df44c4a29a547fdf328ca7f56b053524a293b70779c27bd2970fa5b795333a8cb22339bde3ca50f0e677257a7f4a9a92c43699a9dd81bc26edeb5d975f94ed20be7c99917cff69a79e56040e45fd24abd52f73efba134afd42b45a5b2eb957aa5a9eb3333aa55ace54d0fc011777e57ea3e339b954df7f502df2bc5b1f2ac00469f2cef8bf2109139fdf68278e64b40cd447cb8f7fe6d5ad178201712a139770bad13a1994111914d3844742fce197eeeeaaa842975fa7bbacc5aeb32d219892b779e918a42a152de4ca5ae37c3d1f308ae3c5534ab707833f4dcad56ab158d47f3b1240e725ac34a0075fa1cf0a64d1b0739b5a9a159e150d9749c8dcd66359bcca65b2342b6e664b5ad5eae3854de504a69adb5565a416fce596d32cdeb910368b7558f27b11ef15b945f63351a5b3318c3e2e0aa8ad2aee22254d6998f4e5b6b4d81178f52ce595f7e0cd8918b542a1f854a7dde4ca7e270789bbd51b41a50eaece0caf26d2af8f68b3c29a594e234cbb3b3e5dd2877663006a594d21c3c6c68d284490a2f79b460eb79e4901e82757f559e59ae08fdccddbdd455e190ee61c7795de77137214e0eabb6727852b63875ecf01518a76ca4b1c8467af62865233dffff7bd46070e662239da5df2c67ae1e3d5a5e8e0f487a38eaf09c467a00c499e309c0024ff68e0f9d258cc8463a4fa923ff82f9f2e497e111049a2c47faa3fc5ae977346465b9d2ec5d5134eb5e1f90c45996490c2c00a2b343c7c7721c64b1cc5a7681273f2965880130cbef82782f2a7111aa23c7b519064080d4f70c17a99ee36379eb63f9006ed2e8628b10f5fe10bea37428cd52afd9c67d5e6adba414bb7ff6fce96dfbb656eb9ad55a6badb5563ab30b39c50d4ba1e8c775e1ed6e2c03f3c79b3cbe05c5195bffcaf780e09372c081061203a9410f082dde4ef3c4bf28973eac9d30b0e33ca033ee68ed0c372802657dd277791ff64cdf74b803a963a289c4d1751bb5dd8e29a87556ad7777b7a59dd59bd1d9fddddddd343674b3a9d7ad66f6334ed3c07b2fe8f4876696b35bfdffd84f2c16db38cec5ffff89fdfc7fec27e6b11868bd3aed38af6ff823633f4f797ee8ffd3ea1ef77d9cd2150ef513933ed2c926876e3675960326cc7fe699eeee9e9edd188416e597bd5cb95cb7dc652bcff69cdf3e34cfdde675e85e67cd0e7a2da7e40e5942ba896872e3123c8f209572922cb16db1c395d77d3d25aa56a7ed81a093d916b4715a56dfb590c8c2b6cfc2242cf4c036ac3d9185713893443db0ecb930090b16963d510f6cab9d4dad3bef43a5bacef3c69aecdfcdba72afb5fa7fa8d49d515994dc3e20fa63b291ce99d62eeb913af24190f25e9a99d58ac6fa40a9aeaa7e148f2664af8512b669ff4369880130d3950c31a0658a8b54acd9e780f6374b1f1afa5893d32c96608babe9fe321cbbc51632e6caff11e4940f48be94d26e70c49d4fe56a4a29250b676a9d829a86853800cb4020505f778fb8881432e68e3e3ae73277770d67e00bca9dbff1586b35ab795a4629a594d60cc668776a0019ee67f0c59ddfdeed0d4a70e74f9d1d640a3522c9d662210ea0a0d4acf3cb715ccd386b8db8aa65465cd5b8ec021cb8aa6546465dd775ddb6bd9cc9db05541df77d401af6ac1ab9164ab16b31d2d2795ee7a4c583d9de99b5f3bcce494b125a2c4cd6a881eabace888c4d0a955a0161e7121284dea91c029a270427116c83831f0de40626f4481fa75e8d280f0d8c83c9af1cc77538847420d3759d0ad60aa16a26dc263eb2d70f5e6f9186358ff2ccc0e40b91f9325885398cc21ad6cd70dd2541f509b9d9e2506928ffef03b249e6d011f9a3df0b923114834024e559eaf3294ca6280f0a26dfc7023ab833df4b147f663c98aa83c9e7c29b8117ae16bfe98a06262454802c3a1a0b0b7369ea03a2461ed01a98773535300d96047c514888f2d4c0e47729231a18ae3b78af13f94eca783730650eb8cc3c4942818088cf4a3926f7ce8e3c7a4f4e90bbee2d0864b82b874205d6ab64d7987038226b39c090352e324885e90625730456ba60233604f33b002754e05491c10d278cae93dccded8817c137224bdb07582280ee960d2ae47eefb73664c9fd17743294fbe9f3bc41a5e5aae1850b6a5822f783dfe20a5e1330723731d1a044ee9f3706bef2b89ae14bee6f62afabc009c989f0b6359abca17d68440163082942ac200858145f8af0f2841a2a8480098e8a013631d4e9dbd6c8a36cea716292218b262280618c2f4e1fc8828c219c38220612c49ca0e83a297db2ea544a29a5943d7d074ba5fc1df2fa6acb9c73fa742c99cc96b9bad7e946ecb670b52c99624821c8924b83d081040f4b5a50e2850b5c20b1418619460004d20b5f6e282a73c19bca92a9e8293b25e94a706f964c4527c8e36b4bc14565c95494d4e46a6268f0356299174ea81a46358b0badc6933b41c31ce3648c51e7c83cdacb04890facf1f480a2234e8c0c8d9b23cb2b62c2c8e3cb062cc05c9a2caf8869e2b3222689488c0f3888e1218d26ea547c3de8ddd566bdbb02b756d7d595e7d52b827613ffd571ee57a967b4c09513e449a7a720dc4fa7f96fabf636488f2b8703cfd49feb348e0be716a4c79593e777bf2c0080a87dae9a7d6bb1f5af55ab5eab66df5a2c7af36b715e33af59f64a3f73b75e5d66afee694e37b0f34757d18a9c684591e3369f54a422276f9ee8a43775cfdc33bf29abf9eff8a4d491d469764f7fb1a79b5a50f2fcebfffffffb5fc69ababa92527ad6bab2c45d7737a59f29edd923cf4792a59415359e50b9e83a77ea2ddadadddd3a3b501e28adb343eeee965256183a5f7976364d101fa2bbbbbbbb72d77453dae1d8d4523cd66457f364d82d3bec70c453ab9ed16979d0414eda830e3a389d4f9dd2eb3ae83083c826f59a519fb1db36cfe418f07a40f37aa74a71db80bfb679611e4c96b217d0d2e583c772603f8c91f9a3bf7b7ac811e599b7c3a3053fc8041e1e6c2562a49bbe6a9ef50ce9b1b867fb80b2dfb8fe97f6e7fb8c55b9c13cf2efca1c3badd5dcce0d38207ff43759e281ca75736812153931c18431a921bff2098631f29cc9730c0e1e874d39bd451f06a44ced7dca3ee90efe9e77271e89f040114770e2126a1e41b43b4c70be8642b0f2648c0c2880c012061136e820b57821c11165b62c412104cc5d8deca87ee18b179e0057ab55131cc820810217b62841164fc450228a2a52f0448b07c3605981487bcd7047579e4c2f2cf156354b7737edeeeeeeeeeeeeeeeeeeee6eda2df18e626fa1cc94520c7677d3a658cca074d2d55540e6f84b0df898d792fb2dd2115a1441c91541eaf88ff263002b0329c1f57ef77183ec9ea4c07cbf519a7d0159448a199014709ff3680a31a1f477eea4ac19cd1a95e1aeefd93b14e92c9b2f208b48310332c745983f7c1c4076c3ddbf7d011760b941b883161d4abffb8fd387ecfda19db3e6f9010525e930a6346f623aca75777247d39ddd39dc632027782da562a654943e3c32fd97f491d96bca9476ef89f4e51794a4a3df85adde691e1f9eef0ab4fef6b9b00423b7db42eeeb076439c76eb316aea40efd2ca4913fe8d7f0255ea3ac874eba76a6dcd141d617b7b5ba33f4ce915b866fd8ecaad9aebb7b7d96575cc2909b77bdcd7f801f071fc179fc36183c0262a11b2c6136d606e4f192f2e0af6f298febeb5fca137e7d1cdf75d84f5aa4bf85dd848d9bd130c492e67440736e9e157473835975c26c9ef5c1b49100ce83f808d2109c07df06b3eab39e858fe060a4156679b07afbabb798e581eafd55ef0fdafccd7f003ece832eccaa18b3bef54358dfc24248de0bb1ba6769df6261967d567d968787f078d7bbb010abc3250c09a279a8444d99143929119124040000f315002020100a880442915012068220b81e14000e6f943c745c3417c9b22c886114838c31c6100280010010430019a31a0bb068798f26b6eb7b7b2214da68c9210398e08d5018fc9557a4d31382e2d0dc2ed6a715f8c1a1fb7b6ff6e9ec4df0a4ba83fd7c0e6c5e2306c71d3eb0851dd72860f2ef5f530d3def372bbe8deaca1d9780b0f42748c0492460002dc926c2c01efac43749996aa794f441d7fc0a33e30a4431a24520ebe9bf5e4ba10450c9333f1960c3c89e13450c8c7a00b63ea3e03a8b4723cfaf8eaee7e9b6bd8dae00312997cdcc7d52206df47fe0bafac5103ffb9ef014bf821f81da829e815fe5baacc6c0d36b480bb1051dfb0115924d05dd1f4f64d4086dcacf8a1535d94cab63814034a348d7a57f89854eef08a6c276d74a61a265e16c8ad0b9c57934537f2c7a7bf55b5fd4913020a306048f3e2e5df9297968048ddd501ca4e02389348d1d8002bcc887640e3a1d9e36b66ecfe1430c799bb991cc339c1ec405221ae8f30ffc0a7eee8a8e1f4830f71be8cf38092accbf412ffc20d6444ca81cf97cdb7b4eb65e6e72729dfe813fd5d5e60137b01932c72bd92f0a06cdc86b92c82f5e9f91e8f0e32bf447a5710bd963b28d5e33ef0e421f2ab5b720a715b5d6ee71daa0f42afea3970ccaba1f3a1f40065cfa58784761867b4ec9565f4c7f1f5c53c7d937c3edbf12b2ce0777168ef12d98ce61125019af474290462d59bdc6556b6ce364b0810f8e1f6fda56aab6c1d5e8d8b7400c984af8e739186f5904f5d19d76b7dd7a5848a3bd6af4e732df46eacf0816ee917d16095c836a7d556f13f537b592ff4d800021856f33869c7b832e82f843c8a939a227568e55db5d26ffc83d0bf751065fc2d2649abb4c9344a6a6e7e49fa8a71aa2f28effa83fbd0a146b5220f5a88b1e271cfef190170341fd5716625143792521a06bfed477af0ef6425eed3c2709363de68d738cf7f71983a777ad10b9dae0d7be04b7a68538ba0309599a546422080e4cb28cf21c5d6f3a230298b5a896e65a5f347a585254651b391c36225373858e71999b349f3cc948c8b01a360369d4fd3a91ff5eddbb71193eabf51bd59f60a4c0e2bcf8e8ec0239b855ce53abf2bebc19c29cccdb3df333ae7590aa367910e5677f7a6cb9fb45ce35455465c5d4a7b6d4ba6f44670b7cecadfc3aa3c7eda122ce216c5ea5fb23b110883e8fc75f42246ee4607ecb7b68bc966c9fcac67a0e89cbbbba75b40ec4938cf902fad3b05d4051208628d18b088eb9e474512794193a6565503d974d120714ae5604ec12f843971a5377166871f5ac4661149cc4e9c1e5c89c9e2267c5c3c03db2fada49dc8661461926a33fba7c7b99999a8908a9971d1221d0a62ff4440ca91c4c7e8ceebe4f5a46f0206def27a65340329a5e4da2808763b0c1757fe6b0c6e4625c8c7b8c73453778a7320bd92e3234ea54fe05d97b738a06feb082f5dafd087213e9714a445b7e61d529720d58c4f7b35d551b872e25fcd1781af17691a1c1fcc0da37da42dc95714e1546a6de3118aff7d5eed565babd60c656b7b5ad3dbbe8ecac3ffb1ca2b00c458f32d57f46504b0350a1b4480a90d87009aadf6cab76196607bae32757f6499c2cb435a1d3cc16709764f3c449d556431b5aa06ec5d005ed9146f8d2c4fcd2e880694321987cbc989289fb25af74053363a3de5c1b065bf02d66a0c16a845ffedfa707200bcf32c4c355404a8a4e45a6328b0aadb6925a42e2a176415f530aaca2d25adf002b03d1d94518839e8be5a3332d396e440d035494ab851425405db6b83416f102823f4b81b896b9cb96b51684249e93dcd865b2d9b4c3ce04a67d326e0a6c20dd3f8a036e204f242605f974c7f0b93d4d447d60a8e1e2076ca6c396422fe0794107d6ea0dd855f2d82491eca3b3f45d61f6f21c9dcca691d741102d54c9549ebdc072a60801fb7de16e4b05956028fac6da64346bf3a06ea5e77fcb9be372e3cff820067dfd5a922e2c09c953c91ddd08c5b7da2c8c648498d92d6cb884f0dd3be8c1e05f301fcf0c44423d2e10900e4962a9a24a983b01d8efead336ea44a52e4101287d10f76fb0d99bd0bff4811a23c163c2dfcf62d7ebd1f39dbbee2ce6a4149c21397c38ea17e58da973aff284a766a3a1464699dfdce72faceb54016c9cadacf729948266f0d620994bc210c795ca22d08d061954f4450eb646a1c5206d4176ebfcd17199902e16255a521f7d83c29b295e799b0c2ad308376ea7893723a05e45f139620977dcf1625a4f17add07c626ea3148dd8469d36785e8300c46943115aa6db1711704d54c2d64680e784eaa5d629d90b28b5a4c428fe76a3c33fe978f3812f34b36eac641de8137ac856863fd46588671b1c025c47ccc900a7fe5cfac3a4b5c1ef1b39c45f0b314cb2e27163146dea9e462b9a0918652b3bee489ad4184a1ba57d91a2218c80f03bbd79e6ae72349a895963cb3f52edca69a54dce2ad3d682e9ac448d7399d88702795811661ef370e03f8e7357c3eb4bbfef159efb5825c22e339215b7773bd12cb57b1323391f85785bb6eba54cba9b0fb524bf2f71e160c7f0ea20357b187d597b910d25aabe5e4266d31e1777eb71c3b4dd34367a6786fd04b65911027bda56754067b936ceba16bc89221e7dfa8dde48fe767aad4af3d82616091460cb507dd43188dac603a37055974e1c1649bec338d3522f8d81c266e53e43d3b4c5bfdf01613dfc64c7eb4b9036080eaf62819e96411597a7c897a10d6e43bdf2d8dc8aac3031f2e18904e77f4ea34f6ec60987db4fe2ac0c2ec69df63b9b26a74c0d48b27e26df9c6e8454fb70ac92f225264f6cc1e47a5da6433fed44ca74f33eeaf144c744c012995e30ad22a32a682e481119f1c0059eef98fe35d8a6d89e5b1bf07e46aa2ce30721e19d56f12f55f915d2f4d8ae5f052a9fba6cd54bf161351ac8fb76986fcc0432de32b7870baa45c484dd330d409d9367cce04249f5f4b44890b2da0f92f855472839f121316637701bde0ca5290c0c5cdd0a1320dd5d81ffce55f2ac0c832e48ee09db39f8f96d6e8b43ffa1b14d65f32ad9ac3656e88cf9091e40d644f5c68511e266e9931784604b8080e05f27eb1688f68f220cb6c9b2880c82af62f98e72146aa68043034fc8ccfb75fcdbb04431d835ccd0fe453fb89d25df4f3ed8abde79ab885c29600a2a37414208fd9ab8951d44933687cd574ee32034b153991f166c9f0e52f01413ffe661c0c423c0a45e9890cd7ea63e015aa61d8d1e60ba1b783499538a26801372a805196def042dee6d2773d6384e8a518e8528309df76640f1a14ce26951c0c84a3cd85eeaea71ea8e7d0f2253c8dfb83873ab5340e509e034087d4030571421cc2753fcf2bf693f6c59c42aa61046e440256a413fe8da9a25c37f880e4327f450711d8582e4fb6bb934ed24f7e70f0191067cfe7d6e578a5402c933c2810b3c7cc91da1be0caea91bac13920f7b24f4bb72cd0ffd91748386fe8b273ce8df1e53a067b900823d8935dccc3084db03213e1dea68c58914cc0cab307915762a180feed7164f7308adc27d911b07c1bfcd80978e434cef226b31c98a4ed21e60b1e4160fe9c02196988e32a13f44f9db2b2ae474c3f04fea6830f8a7ed1dd2b30d4c38d9fbb2ee12fed751493fde323fdaa8b4956dd2d774f4b5fb0073f74a1bde189073fbdbeadc4f9b5e20a14c8ae683a695a031cf44afc7674c5c9ec436360053fe71865a6986e9a45db651dd81279715c780a43ea33f1524a80b705c9214b3709abdb18d0aecf2f8b3a799906d54ae5cf83d5b32f085954fc9edda6754312674ba5683d22dd8c7ff344d5e4d0a2f1f8376e3700a757c019c12f3c7dfec70d6a9f3bab3433871a280b8ef77db1d3841711e31c97b609571bb01aba808656addf8859d815227095d705bc1aa4ec69e97c55c6f7b6c4802cd5dad03099ea4150fc73fe7d1dc33aae6769a75f8d93afc9447f4f8902829f2717a171511f325088509bf919ef2313a6caa9b730621b57d20a045e8f205a8d83d9793fea401b446003962683f4347615029213c742ab8e891a5e78975ed5827f919cfcddea1af76533f1d904cf1bba004f5e76944c36bed6aa9355c6ef25a5312b98be891d56086651d1a9790b4a63fc8d27f462eea81db7f62d4de037da3ea8148d0d8fe2a7902b7a1b1b9267500b1cdf35824c28e04e9fb5ae237bd38b4dc8b709fb40d6d8f16bb4c68fda23aafc8725cbb3f8cc602b4540c7b4c3ad1cb18ffb80a3bbedc01cef75ed632974b2522925596be99ae6d3556d919194708e2609c3ac51f3ee5db8d9e3d43cb6727b918ce892b524cfa4b78f245bb1d1d78ee63e6e1b5748629b49dad144acde8e1a735ea4b99e02b00139c4004b5ec79f2c6d78318e536c145eacc6762ea90296fe9e8183c58a00e7b6f0b59dad8a74dc16a410e0e231ab2d46734476e7489962df8724d79ac5582e74e02cf3c6fe73cd06296d80ffa5efc1c507f1ea2d4e77e4634e7e6a213a18268030f5cc7a72509a406e3b7bc7eea06006accb28b0ea058bb2d8d2c39063e2cf752805e3cb8693fc6c544f033fbd6a32ec6f535c8f219f93018417c045b23e1edb615a1683c61c8e1c84832e76520e33a3d96152b81a59112c4ecbaba5bf868bb05dcae48474d4a750724d5f7b3eb6ad7d6a47b561b046bcb811b952e482b7f3b057acce67eedc11d04e0795dfd049aa80197f7385eac27a518a827bb4e314b9b7811feb3dced3f92b7f0ee5546b7b1891dace42fa0ee374f84f25eff322311334429af3eb813129b2a5777fe715958b363ca5595e7d1124d1e2a60a9bb6765d0c8bd2f305ad04c1cd41f01d59f67f50a87ac47a0ba8b68958e58447b0a9496464d33317594de5e29aab517366afe3865c0a46698a8efe1f366f8878c6b1630f7fe60bb104d7a0d3ce3645b71f6e79c1b2e795b95954e24657fd6bbe0ac6b11244ae06157f2f56a0fa4dee9d5b1300eb8072805668237b5741facaa866c80933ead7d32e5b080ea9112ac0d985e9f0c8753aa693884598b3ad395ff3be95888c86cb5d514320ae1852c08d2e0ed473aade52d3ce476681838b8396db01f87e17cc4414f3ac05dfcc251b9781260fec220e08dc15fba501ad5343a5d0850aab278ca22b044e8674ce1c83dc45328735f107bc1d78f483819475a421e0142146e44e0f18deebbaf12bd24488871f84d387dc7e36db0aaa1c388089c49122c37e8fe0023ee3df0378ad58a59d8b18bd1f09d4b78a0033406e10b63c1bce0fd46274ba4bed3c380b8daaafa889f17e930b9107778c35b45c1d704ae6602bfc5498e858214a34a74514842e8def320b00abec6fdc1e967d5fb7ee738111e2afb1718dbb656fee3df8f1df0f53e318e18bfdfe35f6736c6163f430af26c6219113cb27798badfbd11f294a059e49f3ab153a9ade3e3ec8dac4586ea9a6b3ec427a1821df792aa311bec35545d571965a97391e76000206a0a6d7caef36116603f04f2585885768394af4a2f8c8e4edb2d375a06aa94f75cf1392551e2b61ea90cc80ee9bb6bf1f273dfe90502517d1956c75ad87d7d9b86e9cfe2ab21324157eda30db8f82d6ff6e3055ca96f643182144716a50fc9e26cba66f4808ef7fbb1f74da4943b5844b4ab36b7f043d68cdc56910a02bbafd34acc2292a20fb2703cd4c5929993c841207f4121ab4da4755b2648e02bf826f4745509694457f7ac8228e419ef8f16e89c846abcdba6f36f137a3c88aae6bef6dd7cbd9e7d0d04d8e50d180c0b515881e17bdf2854beb00dc01b08dbd493c3df48c558fc02146b1002674af6a65b6ce53fd90f5a22dc2a8d6d13c2ebf521d95494209c3377ce25ac6dab939ab21d63e38e00ea1ee79fefb9845200dfce625e364ee0fa662bcbcbabfb3b149ce52859f45e7f3e2608773b9bed15346fb4e5c2dd73de000dc0249f20554674a733b31fcb11557aa5de7799e917da9350615a144497975625711e8ef28147d18e1ea58b6344c979ffb9ca9c84c557d872e271670ee2003b904afbe664c23b20d727145bb09f351ecc11635a3a30743cbf24c092d689cfe294efdbf07adde46fffbfc76bcba7bfe1f0ce282046d6086a9ed9afda08bb411ae57882074b8b37980a75acd2a449f36b4c0a67e9ed81dd93258602a4ff30e81b1e887d7f212b5a7575ac8b121daa56b8f19673a68475e77684618d88487cae09958f42916b07ae99cf06c6bccd9d6079b8e83d00fa94c064bd8659267c11de9ac5ec5327ca416fa12c661c4964747c7d0779b91577c6805807626e907fc5a32806bbfb37410bd3a7da038dce9dcd9de5a06e898c0fee310e195cb37086fc92d12a21ae59895dfcdf45ac1234a86218a3ae82dd395d675c269873cd3b2c98a120f42bc51a4320588c0412c6e3a075407f13049c91e7d8e1007df0a33e1e23cfb9a87ec1938f460f0e2d5801445f60d598eceb0815d12715e41bcc70d8ab1ef9f8508832d6eaf9b5349228a80952c39ebe8ae9a3a292514e2b3011f12b6ea9f4dc27a3564398a8ba697ee685c6d6b8547d9c29a98cd7d248f559bf3b8a7f7ee52f78a06fcf24f16b755ce12f464f9d077f7317e1a1f052d57286c5c38bf240bd1321dfa0257481b189c226242fdce35a198180e25f971130cad2e16295bc872698f9c1725e91dd732cb7540f748d1f95fbdc7d1144aa89dda555ad082742a00024f631c4ee3fdc85f11f3de4779756b7429c68ba55cffff1b25c89ce81d13cf8a3246b040056de0c9e936fe5721649fa5f4b7182234be1d9046f08e24907f2334cb3d595a9b9bcb1d19f5171b0d74a17cdc1d40d7ce6cbe7dd9e20376502694e4c2078988ed0a2f9dd57030d9b33988ecf95c090822043d749c9152f7330b46e22b4711a5ec034a2847dd7531611ac856e65c5b1ad8f154cff84bf3d5b082f61390ec2cac209ab202237217c3e8bb5b450f28097801452b2e1c1b953b836d5c129d4be88edb18bc2ea997cd98cc191d37d0fd2eff1ec2ef526620c3a0400d1129adb96047e58993e9251dc0c47e00c94b8427b05c024d4b486d671a731e6c86fbfca49129b0afc90a3ac8d42f8f4cd281f8479fe062067f80978b2891561eaa5f6c14d655eb9f86273efdbdad15fa65113212b9bec498927d7e118a25ddbeea6e200079315832ffc0ecee75a04dd2d061dacfbaee589069b0db296722119acc664a8ab42ef68962b86d8577b722fde121979099fd9b10bd2555fadd80d6212291093edb60f07a4516d9c6f3ae1c23c8cbc620dedf8454e83318e7a4ef29fa34518eea7766d268e83a343f61d77162708e1ae656075ed57315a0dbbaed93cf43fc9693ce7c9310891846cbfd6530302e92ebbf347945e45f1543a354ae7fc4ad5884e0738499f9a742c183bc35c41c8faa3265edf3bc2b34836acec425c010d5241eb2223b5be80aac2869c0be6ed7c7d1d48c6938402f83f06850b311ad6e090a42211135c0fba6dbebe83854c1929568c8a865b94b822c0ec36d470fb1136a71250ad730928a29e85da5992536ec9b99b1ce2930ed6bc9fcbe00ea1b7556ff30de9afea1b8d9843a7869d2737f791958e8154021579c38c7aa150abed60d08ca7dbb0afd42052dd0c0fa77a1d9ea831d50dc92abf554083c30068c97bee8aa16642e965e68a9804f5055062d6629c43148334be6e0712eb5c77fef2c8b508d869bf7cd696d1780b064af7e68a6105172c5694f8e4265aa8b76da3115b102e13020df1f38ab51f7e5294aa9bfc2d2e41df33c480c3f54267ee85325fd1360c20df0dc31dc02e8c1b58c9154d4cd3640fb86bfa4b34327c4711acd63c5bbd0211551d42f7bbfd14f822d03e1f4c80c50bddac451a163172c42df1e0a26be4fc608034b5b43740b1e202ce00c079abc9825bfa1328c799b772084e12366d261fabf0a62350aa2bfe1a8d9b0ae13f44f8567539806bc5348337ca8add34585dba9164c82080e6420a3cd804afa9dbb2509c396ab237ba1a74aa443f008248146bebdfa14256d50c3ee5ca0ba0533a64014e1119a805f0c6ba0345dc1d8827cb8eb2a315a91dbcbca16e2c22a97e994120e784a1f3703100d5a656bb0804967d4461ab37a6d9a24840075bdeeaacc86ae780d4cedbd9e5bd3ce7b1ab32ed9847ea387999650529e2ac6c694e6aa30370f9c41b79a659a520b1ae7b046486a2480429580022322982913b5b9eeb190e6567b509abc4ec5998e58159835f967d840803cec045884476898bdcf7fd49aa546b49c6f4b07ae76e85219420b9f740da060e4aa4479e894421863d71d9fe0991b66eb55805a26dc5723dcaba72d780e1796ce7d88678b1d142bfeb9feaab04a3dfc52a206b3571c088aa7b142593fc24cc71948066e9741a5356746b2b0489e782892125d72f2dcc116d591bfe20ab1de509c7bf6693c00800580681fe9ac7695d1cb2f44a08e7cb3303454bffad00c943b9745803333498e3fa0be6472e1c8f0e37956ea62a41345dda47f9a9ca14f08abc3c6f2b9ba79fa88131186c74673423025d3be43c42a0dc6f47f1c40bccd4f51dc8fd906ace6f87b530e7591b80601c88a509bc10cf1154da097fe4d68bc49f09ebf38e4cb9f2b8a012ba8d318e6bdb23c39809083f118b1424987999197d515c30805ab978ed09ce9feb90b3528cc5e53b2b5eec23a3156ac8674f27abde912023ede407123cf1d7735c468a599f0b8004dcc6a58d2ad03027ab7d4ae653de553f80a9f45585261f731afb21418699ac79137dd3758891260b75952035b8916604cb6aa2fd0332b1551021aa714543b5a0a21c8e8e0fd07e0c9b0f1c72c14b573ddd4c9b3e4243f7b336a27cd94f4ed567ed2e8829afa01e1be1eb44a07b3882e0d93840cc36d574e901dee4ecb0c3fc11b3f74546cca384845ef121f1f74ac0b257b029db3e8d8129f1719125f147919063d44025de2039e5fd26d6b39250e1889976287373fe38d667e259c5b61058a725011694d6fe0e2832b12e2f227f74d08dccc8f6abdf29c5b00e370755c5de86c4e34e9d8579eba569c17f4d2a1076a9f31bee0842294761077dc5163aa7c209bcd85b2d2d944d3ff857a80af2972c671dbcafbd301dd0ba0aafc5cf585f0637158435adbf0e61d60ab29418ddb1389609dab1e2120df2f91468838bd804bd2b13cd613fcd28e8f33f6b89c6b02286d938ed222491dea1df3203442a0699a1e27bfbf4865a8add602b1047901281d7ffa9390e2b66a07d5584f32060bee4ad19f2df8fe16e0ea5f9be1a96cafeadb72a9dcb0b7c96aa9195645923042618469ec3647e8f296bb68c56b944fd84ef738caa2261f444a22e704d994eaa82ad689a2bd540b474ac43e75e2e8dba1a88f8f007759a867f96d31ed11f3e415cb5b7f33d4a04de58b0d9f36618878d59d418dca9623623d7dd7a9d4547268d01d63b4b66e5dce2c823a21d22ed67f7ec1525d3e6e5d7f9d8dd5e96d710a9d405a31315a30c4cda8ff1a21e43b0dece3ec26785abb3e83d42cd846f4a03c71f23b4f027461997df1a96c828e2b81295900e77d14196c9eb3f89753195d61342ce6123509f40fa24c0fc18fefbd445a6cc9359fdcd3b7992913a8bbf95f0aa4c2074e78e280dc8c8239fd01b85c66e42e9e659f6cf7df3c1b4d250b860818a5b23f84580899c3cbf6ae7993d5c68d74332dd9ad899a1641ad7de5e804779b698c281f4f65ae9713a90af7d68a480503e43576a1a4fdd09c5e7f352008d1cb676368b560aabad7fdd1a76d7d09f72c6836dd1133d0783490d8b704aed2be4b9a69467c178d0e96e1143f0f17fedd53951b5427c1c42f46a84aac987882f26ebdd0500be0fdb06e4ec71182e4c6cbe508b41c851b9d1bd31b0ea02828ee9cef5b2ee157b6d360f0432a586e0d4bc5c8916d79223b2c698a809a889b9906f68543b603a808771962102b3d12d2c123a7ba259934952659fc79ea19e4ed5e60df0a3ffeae5196ef81cf740cb412b9559c872b436a9f3c0af9cd71411f16100490cfa3b80c8eb97324fee245b42f61197756bb11a14b2784e1975f3e382f1080b6d3a0932a3d08ad19a32b8f8229a52effa75e539026575944fde603fc7e57cfaa9694d7cfc37fca832d01b0569b59f78f5a911457ea7e5bbe2a14455f2e15ec03c06413ab9416b19ca92b232685c485c0bb7991e12473a1363cd70529be70f89835daba03741634a754b852be0b3af2dc32d0e2b56eb8adbbc042672bfff4456a4303a9eab8dd2913b177a0859a48fd1da32b31589c3982d44e6c8ac76a81c41b9e52ed39b465ac9b311298f3e9e6124435da7c9a0fa14d217532e8add241d846ee1bf9d7c69e963cbc502a841c0b49f1e5ce6d0622af380a7ed081d2427e44fc435e5341fac8825d18d963cf3de81a048b4fb92f83b13c41fd97a69e20f7ba988e76275624f8e3a60b7f6eac5739d78cbfac819a941a97b376a534d0f50fe7e6bfdc14fef08937a8c4d1a2b706ad79b9582a9d3b8c1ee22c95c2d0919961776703a40c015581babae011c8c6106f77ffa8c4da1a197e2d58e17ccd1bb13e1527f9f28bc350fc7bb47eebf1a807bc5f4c54f11ce04f13fefc7d74bd130b84fdecc512061fb9f2472756fcf73c0a33962d8040723d37f9af4c32a039edb8549feba7e5c5b8aa446c996184fda22cd2c26e5bbe8297cc63c0480f7715538526ab17b28e856d3d155ce56e5ce9f62a395028bcd27ed8d90baaf29edb4d7b1ba97ddd4caa50882ede22ec272df46aba69182e4940cede60c66717a4aea261157444bb8b926cd609b3232b1c2985401bd178bfe26b8fd42adb61b7bd02ee824fa1dadab34eeb655289fc56da997a63c328f3257dc1a836c55e3909d8122b316f813e413e562897c00f77bd7206fde198ec6fc418b5e00f9523c7bc302324a9c2a1bc31baae67e8e9e704216ca41f30a4ce8b0d951964abb182d30c0b401bb886f2557519872676aee195b8703492c39a7cb9e1eb559ea5c6eb32faaa201e39cd59e1be1937c69960e3b3851a362dd27a9fbc6c4b7508dc6bc12f3867f007ca9a1fc49ca0c637a68d077f6dbe991e721c838fa3b49c90d22ffe5b7858cd220d7ab7a62814d449571bf0343cf59cab79e5892ae7245a7ce9285a0ebda87a4e524671080722f18699bed10a450ec4c203efe3bf6df3240ab183f5a2da1111b811f8ea8427a9c6098009bec08c3fdb25cd04e21dc868a0fe3906f9a455380a487a9270cb87adb4bb21460c5a89da3f48aa4892ef5bbd4c6a1d0d118e803c09c1d8272943b68c521686ecb3612a7b0b79b61a317bac3786294dfdb6bd13f8fb73bbedab5042b1e4bd36c26337a1f370b149a6482d3fab6fa6396678ae40ab015eb3513d5864047898ea33b863ec78ceefda6e8eafb0b536be1e5327682d6c908cc2da6f0042db40b610131e515b438ed3f6be66ad1829fdcc35a109989f05b3728b959249b917fa7bde22ebab1836d82c878d27c4a9c9d5e0bf906108b79ada9faf8750c5219b83e0ebd835106d78f4d37064b0c201ce56944b31042983dffa1af6892e025fb3342a36a58a59f582f2fbd7873746c9808fad185f8dc349532cbfeac692d96998c4fccd2badce67d62be96e57df613268a56e6b39f685294b2f6ece7cd55d3986570f1d8ce41cc1a7bd03f9837b9300e1983bdcd95e3c91aecadb8673f0fbe0534473d55627b5850198d9ba7e8737a3c26fd31585ea0cf6b26d5eb652967f90df570e59e4ab882c573832932cee06651546e39b21379dcf6fc2178b64dd3d73424b9fbe6244d4be81e0b52a27af28abbaefd266940dcb61d96445cd478093c58860e2bf2472b08ec7509208a2be82ce532200a2bfe3a3cf6408c0e7d8004bb20b1ff8c3c25ebebe1c66d296326803ca7b46351a35e87e5f8ad2fa738f6721b7da1677b8de8828b4415804c28f5449a7b69f41283747c6128df1e2868b90c6ad7eee521b726e9f6068305ae3c219c6e613d31185c8a45575897ffcf5a97dcab47059b6e7c766fcc5123225bd96e65dc73e3ccf9ba1ac4a2b39649fdb52413f9c06cf49639c0a3236a71d61055a5a1b60495bc743d6137b77236ca2dd9893284964ebdff3ce759b7da275c413203ed7378891563adba5e8db88caf839ebf3d78a10794fc554f304e044ccf7f3a19eeb28c8a3be953e32e95f67cb239e93594fe77405201b52bd1d349c1cc4ffa11b53ad560f5f9989e8c96c50a8298f385851a93fbfb6083199237ea789167c5825e40c2346cd610aac719b69cafca291ac9cdcfa353d0705f76d56251b08cea3f17ea8102009a73c6490b9e70ade64ce4a92ab9a24434a85a7bc2c2a2901cbbaf524441664433b6cc089264a824ba438fb3f3e410f14ec31aec11c82ec0676a30895dc6a2f9cc62d4fb59d68ca53511169fb1b96b7c845731a4f4c2ba6f4f7758bd554ccb41a4da3bf14993752f703835e0e92215cf6594775c449288e9615e2419d68697448e79a8f8bb6249f48b6ef708a0eb054a0a256b5d8eb9516424fb23ccef93d77d38e063d0ca46c053146294c32becd0540a042238d7bbeb8b78938b008b3b78eacce0314a4204471bad29898d538f2ef0580ff4751bd10f584a077f9c4a853823877f650ab18ace0f226530c0666035247ba137e6e2246785ddab39c8799b3a10a3ea1f50c62696595e01ba752001297d9168c22931f1b2d2c986388c95131585602864c9b4f7dbe92b1ae1af7af94c45e576d79b5e642e907c8e3819b805b5f86b2158d4861153bf5522668307645b20d70abe0e3de8ed475f155ca35bf25affaddf4d281f0c49a4e3b87852587b4a7141841cf72b0a99054863a001998b9eb13599b778be050cc28ae5c2db047175e97682dc7e2ea25880d1acc99ec6ae743e34013a8d4031334f69720e7fd293fb26308398e1c56c33982bb1decdb12b194e3b8e78e02e907412bd34ac1374dad3c0cdb54cad1e4ed61d9795e36e39532e6c4566c8f6c991cbb0f30d770ab7eb3674eeef8c4e57f071a8b65bcd88e0038a5cc78dde770974681736df1b5ea494d36095a5b08d18229b049107605f0f31d6483ad6949a97d422a3457e8c3853c5c583a0a41ef7e02a4625e36e2150a138402c4f5b01710a5bfd6109d0fd55f4c53adce16d00fec66b58b1c2e220c4f597ef6360c68d5c165b7ca780e39e6af3164db61d9439fa22a90c6df86246f4a3d01180d739cbcf7d680a1385420ef84563f358af7b2a24d0fd9ac133fb386e6d4dbf495abc5b609576948fdda760a1dc46b60e85b270902ab762602021eaea2e64402385697dd9d9d26d362881566a49dcdcc0ab547fb7c1e5ade15d5ef538581d5b52f8bdeb5791f68e19e9fc3eea77403bff8b3b117d95537b7da0141243c8665dface445d42175e100442eebd0fd45fe069be449b2c7f03db7d6e43c5d7fadcd96397984beffa31c02dadfbac0a7b4dda03dcc1ba727f7f06647236e75e4fd98a0cf1ae84d712a04fd0b2ba227bc0ff59c20a0bee4081fc98dc1f5a11820fa01d85a68cd9a23141a22b8f951074886aa29a49a85830235ae4ec3932aa8652bfd3260154b7e78332cd4a231e6e09f200540a58c5fbd4fff3a7f3ebec6fadc25b18c017d3c0bc125c5d53ec0298e1993116a85a256767a9df6c7784f2b699211dbd990ce299c3e73b5ae2c0d6d90a526b0a5573e8823ec8b66a9bce469b199f0253acb36aa47e42b11287af8f269de8176aa10d230c841ca3638c87d0df1a33f60b868747025eaa21fdcaf120eeb52a542e3a2954fc185bc135fdbea0877c5601d582577904e4ffc430c18a79ac8ebb1aedfbd0661ba84e36c51782f1a48dcb839cd7c0327244227feba557c4abe8f208dad71f07df771b0d887981631250a984b4245ee568404a5bb96c5471542cd9f475bbc25204aaec0508872d1ca32238aa72a553691b9f7b6246025f94c0ae11f8455c3b60372c2524edc41bbf48f48dfaaffab213cbbd0fbd4c5aaa7520619f07db51b89c6c12ad97ef0b883dd58c2a028768752bc4e76a3708716d2cf88b5a312c9e22a571ed5ed6b07ac670b23a7343a3b9171aee8ae9737c1a3c5324da0bc12fd260d61d8a0ac08960a9b9578d08438c1d5e7869e005fa7100b22383a54fc0920e71157bc1fba92c9e534d4020bf942687f9c2cb06e26eafe3c777d778597647c386acf43698dc84ba1dd3ab33f42e021c00b53f66f6fc733f627269d6c00894557ca7750c6eaf588e015647a4d4ef424008ec9965beb8db3b4a730af2a3065ca62506b9915f5eb0dbf9766f391ba890aeda9d8051c776bbc059fc598b9684b29ab4cd352310e3e0b4c616eadbcc2c8604a6f0aefedd18a2f7859656cde4e055014e7401dd5a703ff340734a291e46959350ce629606ae48b9a6e3a4a12f47215093fd1a5069a4f87348baed94ac3ea76dc5f9c67d00fd4add3d61daebcbedda2da0fb14c5930492490897c4bad9b5e3556bc73583bb4bb33b7991cdf23734497bd23c18ad3e25b40dcc9ddcfa6354a3dcd6a7e58b0752f30f0f062079e6ca986e7e2a9a52f510d8c7c807bb4136594621e676d61ea52f446e942f9a7d0a02d3256f2d9bae517d66fab642585a4b391f0b6d8a2f4ec374024303f7c1672d145a572bcd23bb4580218839295c9ac9a9946d180b2bca6a14433252f838f97e3985cf1cdef8136f93a0847cb980b2e11398189fee9876aaa6ea3c9333e37ffcc20d56bde47f973d1eadd4391b9ebd2e9bc210f957d09e5ed25fb4a607d6de023f8c80eacf1949d9d008396a7a6163f0b8d6ef37e800e508d41dc04d99d9eea5794c7e61db95c64189c4e4bb90557b0068046de52a38f6bf094a0cc07ca953ff29fb8f4c6c6b2abf74256a23552fcafb0a089fefa2547d5c3c0a85e2c31523429d66882757d9908ecc7cca8773e94d327f19c6665cb2d878d8e0b6ea7d2611418cb41b6fa80bfd1f13319b312d4a6a02b2722d9aa0212780cc03ff69d044478669f41db0ef5e5b1f807c439823e3efca6cd25fc6bae13c1710bb3494564c5c3f540b66fd8834e21cd5cf78a488e9368729084d0c8d4651508487e86ce96d27e69c2c111b8612c82d6edf1ffd56d57e374d9cef13ed58e44c98fc8c5f08dbe75c8e1f567ec35880229d40b746cf81da54aeeac3b79f2694435234b316b95d64bdeaf020391ed2ec705e2decbe16d8731d60d239e0c122f413c7495fd132251d606de285995f64ffd3708e85b31f5dd82a4f2b13a2d76ad3c18814ec98d42af63008917461d44730f7554488050fbcd3557750f704183ccd6ae51497104cd02538872ceafd2c87680d1913da2deaa992ca244fdea0349a9f04276df889d57941e259dc0f57194e0853f4da8dd057dd80fd4fd2e2e2ca17d4a9efe34b6e7afadfd7bf0e49bc1207d22a9e9feeac211d0d5df323e76a53603900e88eccfb81f74ff868b34c7028681adf48c2ae087c0249029278cae2cdd0fcb240b129545463fead16ab7c36160d9d4feb4d35cc143eb189fa9500c01ecafc5898a0d9711f135e7139f636ac08d4df377c344f61bf6fea92971d93f8019bcd004ceaad08b234f8639856505e11bc78fd6277d0a46531fcd9a5918189dca36654032f44a3ed0d8deeb1f85c7f49ee9352ee6648e3b0ff47bc3cc8dac021903579597a689ea37a40d6ae7230c5c3bcc629ebc300b016c8b7fc7ffdb66e4ea7185c8c3255a0732a1c5cc00f41f724a5a8e4fafd9e796b6a4773737a54b2687a4f224b70b3c0ef2b6272a0fb09d3276da096511f81d25dc5387fe8bbd07de56306f67c97f2030e68f666dfdc38b980637fe5d4f877f5f29b02f0e2fd5956694e4b727899f7030eeb465e516110b41057879edd80ca22fdfcce8516c82bed2f942a13af33d1b78ed3b7455dfeb3b1e40552af1ae28161182ce618e8d90f913cec790b1f0af29ee6d3abce7ad147777b21749eb70b531fbdb718a750f9292f31d1070d0f7e8b168d0ff2b7527f047c9d171e14b19bc151f3f2818a2f1b04aaa829a2c55e2ffe6a7119a88285ced8badcfbc8d14992912700bb45709d3aaf76c074d0d84ab1c967dd644775c066cd8f7bd065afaf3c8f46f0b254b4c442de9dc3b328d660382e78790bb18a23642b75aa6acec373eda87febe5ed623cb60aa0e7e2484137687b7b843766bfbf0a9c8e6e2b2b72af407c4f26615157b86b0867cf853805d3d49827f5317efe0482a0a59b61f8cb21098288b67346602d37e7ff6e736b0ab770c8e7574a972031c34fa84201cb3ec68c7b8ed1e0892de4fcde3dd5433b1edb6ab6acb3858873465cfc75a844af5c72e47e463d85597c1a4487b363019f84c8e4214a16b8e27d2b883466e9fa0192f2cd06ab55188c81601250458a4c7172582407ab6dc717674ab4771b1b4055102941f8511ec7c1a710e7b3fb40094a110ef6883eb7a2a229b2320255c58f62d16e353cd53362c3fb9d2ef8d30f6f092a740891c550b67e1fb66e0b9231960521bddf09fdca19397511bade335686281a824807ebc6eb73b0eee87a9b3b57a4035ac3b3add7f90f6a1a19397cc91cb7c51f50b4ad756156c08c18ab2e0cb316b0b703f90db682571642358c2d27acc9fcadc0d9b672bd1bdf89f78c74239f1b5506d799780bc5628f8a443780d22bd2f033dcbf4af2b4b868063e728b2299248843c86e971f92f95cf87bc1de177e797870c47e9cc666a482c18b6977d33ccbba148f07148a1dc1df5fe2b4a6d537b87ff9e540c8983ecf9021f221458284c12e3dcf83280fb1fff38b847a715bb0489757e8fc82963fd3adf8dfb8931c5f0b18a20114594a86fa8f29b077553d5e745fb05d10d2906df7d9d4b6ef5c37d9e2984905c4675ce7330715f839fc9fba5dcff6b4d3f9860ee270b992d5921a804668d1163eaeae24b79861ea912ef8c932ffd8c3eee16ca2b913d055a4bc1d31de75adbc0396c04e0457e499e6e060f8f3c114970dcf3c3d360383cce389b649037183c4265a5c1c47e0941996b492b2671de618c41d6812bfe4adcc586363fdd2a2698c2aa111b39100b2e12836102e915437b9bdfce72d8ecd9a8506e61647357b6612ea6f9b7dc720f0dbc577a1c7b1187f784d8746dcb8eb76610e3cd9d8d3825259e4afae83d96beb9b6169c43b2fa87755bb0dee879390925ccdf5ed4c545d9442b0d6ed0d21c7109fbe8abf2245676a4a6327f3f110565d8d113725d51facb5d5e2fbae55ecaf4eaa94524f5e012f07803e1cc81dc18ee26f7a6f9cb2a8e7bd4ce650c101b400eb6680f4abb2271e8b8a1de40b99e1a81d33b315091a12cf74bf9835b81f3f47be6bb16d1cb79725f0d412b10c8fce49cbb121a3ab603b8c8a96e481546305255fbcd3f2fbc63b2d197f4c641d9246a8cffa75718b27f01eb25a077b4332f88e2612947f469a19f1bd9e501101e8e48808e20f46368e7d1bbca0146af4e805d6dffc30199a6bd879d3334535d249cddde8ef98915e03592ea6870f2a065d106a2f74c6263c6cea58e06b35d4bb00e36c258fff38f8d7e2b9d7541ead2b4f52f8475e3328fda11b8a015d3918f5f51149306fa3172ff26692904843df2e5e898bfc330b2c69c32a2f86c327adb760c0e8c2efaddb7a85e233b50f29aca086138a8f9b34324f3b5f29e2995d454927d16f9cee6fceb3b496897af17c11295c61a2ab1f07e4063ea0dbd72f5b8e0479f49a6720e70cd8912d9a1c525a38bdc30b41a994c38b1083230a1620b08a4a62ef66fa085902564196d9c072d8caffe117ed77686ea7abb6ffe71d02622ee1dab2ab1f18fe2a09930eeb72cb84760bdabece292bbefc441a285108d764bb0592a03e4c7efa2ab222cc2a92a0ea27c7148a4bae1a5dc5138d8bb01dc0ca3a01b4db420b84ebf34f61ac5cc8757a623906ef4d7e052b94fa38ea9ed564ce9dc16b80066dd5847a8e59711e09c4be695ea7467273600df73a74b4164b3e0a3f116a62fda9336dce35e5065987a2ed7de6f0bbe772ab76ac98bab0e967e9d5645119a1bcf3359954dc377594769b55f035180ce4399008e471b5e1c0f512ff762230d17183776ab29ae01c0675c9cf2b4b48e8157fb58412deee2406e41ac33f2e8c7dc585272c31f0133e3a2d977432bddb8cf5b5abc7bf0251d9ad84dc241f1f1fb6e952aca45aaffb2283fb967f01e3cf8197db0418ff6cd785b69b6dd2f91b90352efa10f18f989d7beedcd7eabc4ed1027955c0e295b5655871091a2ac8c227dd9d76df353763f7fcb880ddd9a2f5f40ed90a74f07e0f7bfab0562001d6b8c479ce66c85937dca5a13bce99737b1d8d9295bd2a9b7faed750f1171ce1e8ece8005caf71f67b859bdcd2396637336ebd7e61c2bb869bd7738d7d51414462e6c3c0b9ea934f4ba6c5fd08cdc8ec25b01c5d5795474ba6ce5840cc479d91c206ca09770522dd4e81458a0a5836b3ef99ac3028532e1422d6feec7defa1e353323f4e908e17e60d9c7929ceab4514e86564e78c97572925bc15fa51ffb86f7c0b0bd5260f3009dd78a43f4d5aa02b3e01817a85776cd86186867d3449b88d8f076dc5a64eb006f11c88015a60dc41e3b413209f78ea2161b770b083ad4b0a0217ebb91a2aa396b9eb31d310e7f7a3f4c919e2a08dbf14f56c1f41c0c25027d29fbe4cb7184ac10d570d603faf908b78cde93ba9a33eb483988ec2364058929f530d5b89ade262cf762fee05b0afa79ee3a8d7238754e743ea280bae2fe9eaac6649d32baaece75a7f0efb4ba41c0e51c58f5f5c3f7f4c2ad71ef9dafaa4acf26617c40ebe86857aba475cf9195d4106224101929835b1b39ebab6e0e6698803d4ed0604dca4e67abfb466d0d05871c218def3b28a8c2243177ad937448310c20e8c6ede8727df1971523397b9fd51900958a511c5579f9d550410b7dbb45425a2b937aed40143f4dfe368af93820a34ae43f4e27b7aa7cc746a364880aa0111d08d4f4aad979448c674397f2dc080fb629856a8d4edc2ca1e4b320627b3b805ffed97dcdc79fb547b43a650eab3e13880cce07b0633404d5d1c9b035f7a61ac4c950d666cb6666da9052098177334420046480a75685eaa1a4f8024b8a47d9853eb6c933b124353712a9d73e2988ed6004cf00bd77c618467ec3d9783397ff6b093dcd36c5dfc247431273b9187a320dcfb7901747376252e08e9559ad9950e9f5205401467ab12c6faa72b66ece6de02578904637882069f9ec262ddaa87754f4b3fadea89ceb5cbbdeed06595c8c2f4c3400148f9109e6bec60a9ecc52eeedce6cf22685d2c38d058c1ae67c737be7f3e47fb814e770edaa72a9c147114b85d2d55ad82d6c8be3ea70ac216683faf524176d511bb4dc36429a5c7df1424a4ad357942596b0af95deb6c85127c8e2acfed525b8c1247c706c11e9557096a9d91baef164960546860d9bd8699391f35a0705a44a2d94dcab827d07c790672711900fa0c344aac8cb6c2aa566e4c30305e8e9e70faabf42e25008278995f613ee8b19b64a2d4044fa2c95d1b419d64c4ba47c86d3637bdc839cd767a1416f28036ea2a2259dad20e85c9d4aac05931273f80ff09e7a4208f3cc126e9f435af39997e031494fdd7e375420df15dd2194dee085e90161eeee0dc5382c9f40765bb5a517f4edb4c1bdcf774eb8b5e7c10982446524e9a9fa043f8adbcbdacd1e24b049ceb27974bb1bd5892c7b79fe6ff360939497a53bf97c78169f59c3011030c648a0eaec919fea5127726ff557d70cd9d09ed719c96b43c4d37883aa6b384d2f802a5ff83a3b5fb7b1174bf19ad7af2c2033eca640abae67424264728ef7d41dd526d00908e8005f48125994af20af04312f80d5ca9f5d7bd145d889f870d99b51c818d0f887f76405167d89085569e6517ccc7f5ad247d53005c1c67f4ea399e8996071f172007175a963381d8cb5f8e820032c75344d6e4723e7336ed45d1d3255bf6c28eeaf7f73eb8a58e7cc75d487b71811ba5318e8785dc090dd03552b6e7ec8741cc18c8ca50c1227c11d0a2ed79f864e41b5f1c517cc1a7b55dd87598e397239cb0a679e76991ac511527965d17068548ddb6c181b1c179b9f3c8e1a48923b23ce89101b3b08081a085ee99e4bd9d29db4d7058c96cb0300e48d077aec68bd97ea0b9c5516522227bd65262b4ea35439cebfd52614f15dc8e875b73ef50ac8a33970fd7190c4e17541450c7200ed70d142f917f0afcb35d94a6266197eee23ee40547aa90304d3459eba8d0593ab52803fd7bc15c798f67ce95471c3897f424ceb661400b8755f9c38c117ac9188a51c042e53c854d15a9b9906b8b759f4a206c1aabb14cdfff3993bee06609f138f0c7fda4d141961dad0d4b3684514c5482e63857b0733fab52e9ec1df74f15169217080de27a1c8c2a1178df2461ae6019369223391f934a11798660708686c381670881e35da28bafb4d935977dfebd13d226a56758621a9c23ca557617b6433eb16af36f21914e44d0c1e9a2edf7b55ed1f2ed23d1a25e27fa85280a010438c8906a8d333479c5dc43262fcac80b66e41a9f235311aed29f0b12a1aee119015d02d36f245ba021fc5a67b6c645543855b924b813bd856189a2db1cd0a3184e6162eb44c95182241f56926eee5b48b7c37e0cac909570bbc9ff40b26e366dd9488eb92e1a02a15339f2e788af938172772e303f4aba9c2d521a1e975371c4fadb7566d1fc56a505218e8bdd2b599680810b4af234e7cc26e5c74da6682e0b4a0f09f4f3c7955c8549b9f8737139f8b339d6c9e6422524f28cfccf0325d35b5ca3f438e6bd9acaf332414e7d4865f20ea415f405a3ae6073d219b05b10669d736022177cb0c5e57e575d963e256959f714d902c57cd8b91a00d6eea564dcb5ca45e916173b0418a8ff3f0d9b995ac173b2b6d2f4aa9fed9b244f888a04367d6a6f0a9556b75b90ab897ee4b65947dfe62424f64d8d3adf13107ae09e8e4778571046eb121f9b091b674f3611a552a50f0353c0c928f60e586968b08810b296439d3ab4f751909823fd72d6f152b94bb4b4f871529d34e43eedd494c1faaf058931e934b1103f47faba5bcd2b86c9dd0546090bf49d8d6bbb34ea0df94b9d3706f3fe7800d0d60ddcebc249bc348924d5a1bdbac35799d1ed23e7f7e68d0822d7bfd8e813abe6a32fb2ecc10004e6763e43fa6cd6912a2ae8f66cd27fb18d55cd8e0227099978023b936130f2d6bfa6998d7acc49a8f95226fbaa614a734d5818273f8151ccc68e6c8456d0f2b2b1cc16465e56e6a8e36a9fd4427ddad06ce8d74fb564ef4b10e4f9bc2043c96d85fdc2c0841ff9a01b87f2a8cfa12e9fc6e49ab931d49d59fd9b047467537aa2b2a9ecb94b89f0a961219e207b8bc8448f5a5463a94100bad93784cae757836ca157b5b0a4554af813a911ca9548d61d5b15e374fb32c70f700fbb5c50de1c8be393999e1c5175dcc9213aa2c925d93b068f870271c677604e2c5b7bcc99515b0e123d209aaa183d39492117a2f2a36c16b5c6d60e45d23d7fd5a809b0e03719e02b88777cb7715fc5dac750e768dc76c990c3fa469f839ea95b366c87345b85e8e0a5220d164396974c449c8cd843c91500120f51564d273d922ba809f62d837ee0aeb985d8d7c597a608525c8096be9a439361498d6f45dd1b24d803460ff94a01b282ab2b33f4e0583ac13f3fac7580b5a96f7cd2f758b93c939f102aa28f96119d5050687241b34306150e36a8701c540c516cf5cb0b8566ede314fc94f48250b388e6247eed571b3b59c66c5b0cabe4637636ee9784731d08d7487dd2f9dfc445c595b8e6b7e23cae39fd4b4c1f7d1679d4e5ed3e0447f28b9310febdb12de1f0e3201785e80b83fd128e8cdb17e70c58afd5ec02da4546b4b2a46d43535710763766e0fa2742a0566e5b8932139963262c5dfff110aaacbdec6006b4c76381537697208026678b51a4d5bbc327b2e371817a11de42e19b6d9e145aa55084814fa43a970dbb29333cb273d6e9a8d04ef82bd13259615253603c7301f2f4216e34563c4239938d480b0f500dca8468e65f7d0304f68dc94a81caeeb6e4f99a3735f13fd94d0e527bb61e06f2292a3b6c79598530a5c2c07902212622fbb2017126fecb8d07e606c935c6e92a5eb10be282d3489988e365842caeadd663110e98c574251719004b1cd6bf63d013638d5aad005651396ffdb3414e2e746d43d42799fcab4d2e2d50ae25250274a44d28c4a38e4f03f44dc17edeb7baf90afd8d117870b9f4b5977336764fabead5fe50e4253abe6e008264a69979ae35c633443c7511ac2fac8559ed2c3e1db0b8f444c469ced8e76f3693551cf860bcef840220a052ef7a16aa378ec823f0aa95268e356e385c1b3e05650953cb02a9c9e1e7654f87db322383d0c105104521994b13a5e018a0065ccae933f7426a6e0ed933cb1e10b7761d11267f0901d76b32a2b81919ad15cb21bafb46f87560a0253b54212b55b1c81459d6eb1f15132a6da4d11b322b8417c58ea3196d879ba8b650911c256ed8bbb113bcb9b986c15a95aa75cb2f1ce13b29b80aa71ae81dadcef3ca464c34d0a6910a5a96e177d869a9b1b0e10b03d4fe4c5755ab7869d41d3583635bfeaa852b88ca17a3519afee5e7dce3a55606cb82dc17953a358c066f598d93ee6de52e27d8dbba8e1a316b783c64c509c521384f50d6a1372ec8ca407c4e423f81c7dee5106d57f739044202cf70298f9b1f2a4cbe10d82f5805a74c288abb0ddd56f4a9c5929194a2dd4847f59a5bc8e278b860b094f936dcd3c6f6c39b8c3acb6571e3c9c1c69a6163db23a3472b2da091d2cd422fac6326edd75bf5b344a1bc9c9530531ec7131abd3fc271458c8af0f6e7b056d8f589f5f6ed398160446c2746ad7c2f445c65fa0c6c901b39328ead2778c1f54ec3dbd5a6cdf37d8c63e9e4641fd3a6b47cb2483a6340b895f51c727663d86a4a1e8356965208a265c3bbab986050657947dea6c928e582b820daa5a17bea45ff04a00bd70135d554d47e2753cd6a9b3e06523d1b30b34cbe3f9d2ed9f478418e66eba52b718a594006ef4586c54b4e1c3732aa7b48d3b3dbb160a5f233c9d0628aeaa9603356ba133a864f3d93dd0091830fb966bc488dd34b741fe1436bf23218d28ac6ddc00ede14734523ed970f67648d4cd6f8c4a129353e9b1d9c4de0942210f79372c9a2dc79c3587b1c3aadddb88d78859f676ed9ac3e6c3dad72b6f4d1c6028465282325211ab94280f21cd0f1ac42811d30e2b2e1aed42cb67be79ac7526159da0fa3c25a35a5b3d89810fcd7f1706774f8a3f9e9274e8b5439681e11b2f8267722fd510d5700306eb600bf7a51e7e2223b12fd21fc18d5dd30c0df7b152cd4a6015e7feec1635d02d31e579700b338ecddc815026531452900ed777c47e3b1323f46b7d787f3497c2ef2a35abb9ecdfab594368d1096ebda8a4e083e60ddefd8a343559e9819c66ec1830ffe63c26153d97e6c6afdbb4b8c0299af151d2f8b8bfce10d038ad54f1cf5c81ca23d798f5f4c2b3425263f7df02dfc5ce1e34bd56d99f80d3aec136930b1e5b6682b811fdbc9aabc5371bc1cf626d05538dea6660f7e32d1509deb0dd363f628f99b5e0a333363f53b970f614198b3b09a8ccb2ba5401cfcfd781aa26c5714bb3bae0f12f730dfe4e9f469c218fa5d3fbf1ee669b815ec8764b538406a3e00f96fdb5f4704d693c3aefaf3d1ff610946e6911329a465aca16624b34c8cde2a38fa67036de22600523223627315bbc9aeb2012d2ad0e55197f72056378804239622c9db4eb62564ea5eafaccb23f8ef87905f11d677637010a14035a15996945a2bbf07033cec92da14815dfd58be9f83cea6b5c782309a152b419e6ff34c5cbb84b9741ffc9adbcc3763a88cbf34d919de5d0585db0ac28e0828cb5c6045642d67866b8cbff8328c618a0c7ac59892b589d1445d251169b52e2ac5fb7a38ddf43bc3d0ec60e858706c03a9f14392c91e62727226ab3e89d416434874c11ec4f5bd8f0c08169fb62c707a4275bdc8578b887ec8d2b8ff247eefcca7a886b1238f7803c10c2016d93f1e01b3d7d4601c6e514e77913465b4fea530a818c35e6157e5dc5bc90352e4af899e47445e9cf108ddba86a87b236bb623967fde721faa71d93a5a861bc68c82f70ee7d9f94ea3cfd40fb595b5787672e1150a41b674f0c26ab4a5a113609a8018e9d13bd7c0f5c8baaa8ee44ef2f00b2170b2551ecfa6df0a76b89f1be6da1ac3fb86da00a5b63a58b93c65aa3945b8836269a6aaad033c5486f33ad732b168c3f36c7869bfb2a4b1b1b7b93aca5ccb71f08659faf8badceb8af4c2f7fdf718329c56832d82dca75120c9d40e78905edeb2f7e24cb5a3bf4dcaf2ad88e7ebb9b28ccb4658058cfc58061a10f419fdb0c8b865ba27629486e191c3369e577504c2b08720096afc14e248c36f85a2f58088b7a9acf2c6fb2c53ea548c9b65caf7a36f9b787ca9a24db39419efe98888838d4e78d4c2129d6484425ee5a5fb54b5a6f602556b0fc2e8dd5c036b874984c0d192dc779e1bd6f734a8d54b5301b97e386ef66660efa3a9e7fac34b2a104e3b0fbad3b84728400b97027450548006b91613a2048b5c729902e52cd967571299c00af581f08d564b6e125c6f595c9c26700977ba98d0ea23bdb0903870a2c3bf3443a87f2d629a52fda02c7567093f9992e3959c82a8eb4b00dd9620da468955c27e070493fd40e304f8cf96b15f3f24dae8cd2430cb1ff7c5b5792a590d8cb6ee724e9e65d1d27683b69b5905300b01c83aed384a1f83439c7fe2c1453bd5bb3a6bb6be24b8c311662d3b020f087eb6ec83516ba672d3c0ef1075583fdc22de8a44512820d6d2e18434146a34b2ca8f7cd858bf86545bcd84c3e224418927320c645793bc25ca0c4503f1e74559dd3a6994c2d0f78d4d01332b72337910033cc7f513ed62024c91a566ac35c20f47e7fc49c754b8550f7a98f5c429466fa8a50a98e4a4a576abff3c80a2b41ea320454c25cc95e0381ca57bae87fad86cc1ac43cf55282ee8242af80ce2ceff5c0a14598d92dc14eb8830ec6c58071f49fd476530eaed59d04dd0e213f41d549c6f2cee9079c744c131fe436246f0f09aefb43c5bb74241ebd45db5848ba507444774113224f39e5893d70363443472baba6f0abd2363e3884aef5502ae6e587bcb75f75890634cd5c9d4a571600ab5b6ae95481542ed1627fa45ee2ca6419eee101ca5e3b81e40ad51f945e21aa49e28e715658c8b459958dabcab6e2cf07d4e4ac28d8516e776e483d28de9316fb76b30a2b5658fa411ea95e9c6f15cc3989c4854c0586c70aea65e44f10ca46f095e29985436c83ac2d443eff3a9a3d5133aac936142e872976e2775946281849814deb88ce7c0cd6b008c95b8dfa0e1c237374343c05f848c5b671fb48b671c55d00a75a08c72a4ac6ad3c703f2d330713a6f44740e3eaa76ac7394f5edeb06a335ea4e15d3543d79111d77b94c69530ccbf0e6bb1cca1e882d2751621fc88479cba553642b49721adbbd9897d8d09a1bf1df2630922c45317f5fb435b214f85fb5adb8434433e79f43acb1e2e13b55faa398874282189b6c2104719b3b0a4671518e945a47846eb1f59666a9b70e9fc6f647e3802567628b99d26b5d63a41b9351c8d672d14909bfeecdf779a89d6b2275b66aee0b050b585e93856144d3b01b8d73222c3e9412a041b0622c0514c03f61ef938ed3cfc4e22a501ce9f880e453154abea45598ef94cb1eb6e349decc0a5abdaf3ffef367feed04b85e5710e3624c9b14d1d7bd4bab7f91ef4d2ce0c7ecc13f16ba6bd1328fd460fe2ee40734061bd8a11660cd7727a0aef06fd9f844d0d88ee7ac3624eb8e13291f8e9f440a1cc662c92c8bdbf0caf769f0a86c40872a0d05f1951608d603f948317ccd4597f18c72b1e81efbdfe4836a329c22ad49b6734d0aec37cd0e1507d18406e998e914000e4859a0261747c08da77cd48bbe45154e9b2b18a6efe91be4669476b7051d9d64b3f9e1d4f8324fd28ea5f80639780c014ee3af88c3145571ca8690aea5a266045412ee02507b4c13f1d8f7089d89b5ca5ee21d84637cc97c63c64c5df78a7a05050bdc4068ca5b758255cd6f4a8049d6a8bb1983c26f6bceca34abd5d1fe890dc573f92cc5ac4c0b4d6d2258e0ccd8c03badf120193a1289141cc4c8e56c384697460a68fa1f4cabe296863bba61328209d600fd2739c0c57dea9b11ed2d1e9c271f1cd2034278591f54776a3775be1e08f523001af6e1b462453a160a6e5d6d7b133c3be63aac219831f19fc39a947bfa4894e83e607e2f9ecb014413776100048e5bd10f929be9845070fe9ddc02a13713e49d66e33cd35578045f01b66a44d3b9014d4d14f28df0353d73afa63d03a1554aa160702edbb514a6da4eb7c1f622cead5baf2c1b130227acbe958dc8a66dcbc01a0067203e3e40f226f66c0e8fd63bc68d1e69b681f9438454787ea15a80749b58d0c90089a1ffe41e7a06a26de1bbb412e68f406a009ecc3a4a68c7113441f2e4aaec6fcb14edefb69e0962ffb084cb923bcf63e03241b6e11fc2fc495bbac15071e57ffbd57d2376c6709a44c29bce4abda8b4840e9826a1f40f30532d7e65572c336f45983aaf373c6e062df8cc366a77e324b5341e58d37a340d1ac4ffaac4f0ce080c1a4055131551fe2f49d7042d175cde9ab99654b1645e1c1e14f7a5e1005b222c70ede57b648413a94bc26ca20aae379e7fdb80491ea8438ac54a8861734f97eed413d65170a726c67c193dc3027776e2432c44183d1aeb611a44144c5e05665b81bb7245eea43029078f75d473817b328345ec14829f21344154c5de4049d09cff46abe2696f9edba0647a62f9b7609d2c319856b57e8d2eace22c321d12bd70fe6b41d7b4437ae962f0800c7cf9795afc4fcf2a25235ee3713e0af3224d4a6f530bc08f259836654456b29116c21606204d8966e37eeb0848738ea5540e3429782974734faa0999440c915826f5b52120ff65f8f82f96b4123791ba89e4904b20cd3f61f9e3ee2e99c58168a67518421ccd7f790d330a317516346600a062aca85520dda25fbf15024a37448af11d28ab715827674f58acf31bcd35d7e66d70e7013a7bbd0068ec43841a1a0a4febdb630ad65904fb1adb8b06d3a6456d4e861efd7e32eb7e28ee49ae620efc3bb6b804a9e671e47a668b86cba6b1bdf97e826a90f72e7c7cb244c06f3b54778aaa41997725ac81899d4b3f05fe4f3bc649c2b822c624f98663b885e6540373b475d31a41b981af5d7ac412f687efd13b024838674c672fd71407260757f02eeb9f7c56f9c5dc7e07977347bfc60d7824b4bfa8699334193ab33f2d5e1061af9a5834e11a3d9104d346e4a94cf056f1a06e7d3b569a51acdb1000c1c725d007c8dfc31ae6c7d802c4aa2dfd50f0b5dc4f90f7a35c82de969edc3ba6e95c5fce57020cbfe08463154af261d86f9de25ce2c5cdbdbf0d5e0883dd32c06d1b4451aadf658db68c5eacbed8c68c0aad66d11624e9439de63532b3a04a56f1507a48d0a0217ef0bb5abb735ab6acd62c1078378f65faa894d112acbb36cea2599580a9b62de030db87c32c327e87b9df8d171a324b8cb7c8c9f5f25577c437eba53e5423f933ef9a11ffc2a4e94e4175188a53fb4518f01e870e7292c798f9f3c72c30f6d66fa63bf2657a84d1dcb60940fe387dd760ae1cc6076d9caac0d5a71561560c385e3f6e9eee80959766e2512133c38176571ef7501956292ebf0738b5593657c8e2feae65ec9a9fd53005defc3058897eb766b18838b520ea4d7548b379235e837b469b817c8f76fa1c9c9e2a6d6ea9e4fdd8c5359e35d649c626e52b38bebc3dd19b2c56f4ed0bfbacb45c33cb3c25ab3cff8e308a9ccc84b7882ed512eba3170d29f7e7c4e35b2bb678139411f6f3dbdd5b625af48d4726311476bde7afc17b20519d2b17ea6fd786921960a9cdb7239595b564476be9bffaee775efa0e8ffd64993a52c32591b1b922400f7a0bbf5b2a121cd583cb38228ef8d0a1eb4cee553fc85665b73029fbac23205da4f13906e38e9c74f1398e577ddc66005d3a8d455f65cf13c06d19e8864252057e0c47745402b297d4197599109430e2099e55882396ce3964c2e941e1115a83d0c209d6fcb49c34b17149d321a9c8e979d3b3336547609d4e208dad9689d7dc312d660f823e8c8ca9309f9768cfdc94976ec499d9ed086be767841c6dacddc418c62aafc7354889e28bccb1a9b4ccbee680da9a690e04b47689d25c05f1e9e85ff7f0622a84f3c43a5125d0436fc03b8ec3a1683f95bb9a3ca32c7ff04531d85d0630e1eb224d47b5815e5c494e8ef9a3d5f3906b5003fcb4d7197fd2085992d3354ccc4b7c871d4a4f75b3eb137bbf72917aa737624877792218043e7e1c5f8aa276832e937f0ab7d8a5770e21d0e4146aa040f62add2190902c08614a77e6c15420fe757c4969645252fc9513001692b28f21861222d454f8a582bbdaf2d2b17d757168e7f7194c2d98e23aae2865968157ad535033a7cfc88ab3449b719d4967c98a695f2e539a710fc94a28948dca158113f3505978722ad2f4e5a49e0f50c37d6b96a8a1a7e9ca1e0c6c0f7381f377b85bfb6e33c3144d4545938cd2a942abab4336e54d7a4ebb9faf3ead7f772b5e14f5d579749a2a9520949a2add8e6d4564668ab16fd9d86093f5449df4f7a3fa93e858da4ac9af3356d33b35d8b09713599fc235b857b16891b9298ed4d348ef5ed7c338dcade5431024582ce0771a260fcefc31b1e3c7d61d2aab84a0cfc23bf431c8343991d08209b0b7248a956bf0c6531002e7e48083c9996daa75b1fd9dac9e28d924acf7496fc1de27fc6c777e7cf31d507866a0075c1396e0dae9f9cd85346873ec3d01e319f610a1fa85298557c4750468b2f1ec4664a6a04268e961f5fe76a79ac6a72b23896eac36224e137fb7cb347e4e5bac73da347abbfd0276fb5c4be1d08a1bbaa7f652d919a47aa390cdd71954c77995e82471f7aab4fbfc6fa274f75b39a906e53e6eba8e388da65252fb3cf37cfbb861771af511a735ab8639c7ca3946e82786dd607cd2364669e3a7b4d1897659d1394e044bde97618c7602c8465b8e5f626f31847fe8f36ee3fc175ae8eacd41a49d4d70f39ed8fa2c5b06b86957f9c1159c82ae9ef775bd97bed7cfba18031ce0d2c15ed793a63baceaea90fc703e1a30015cacea023656d82e768e095a0d6ad71e24c6ccee6bbb51d369bfc1311545e2bd15391b3242ef10bf785da4ceaf335bc742c8178280deb756e4f4b5560ea19674792c48b54535abbe50d6845d564af8c93ceb01a805f726014e7c9d8f1701b4a115a1c202cb3e47b0b887dfcf95fd8c9c295c1ff9fb6084f674ce05de9d32fb766f771f2915ec75a9ab5d22336e80a7503c9d1d0a9ad3f2e82b714ddd73a3db688241628e13ce05b440d42c448903da8bb6815930d03a4a07d1f733213d401a51053c3ce60aaeb3a20756501e3ecd6393b7ce808e23cff1312b29546b14680b00d9f77d2f3da054393f1800969127150cd5b50fccc64f71048be52d6d4624b1a4d9ca6f646f42a49452a624530e0824083308ecf37e0c6b0cff9baba3b20f122b261aa411ba0ada3d123b0af8fe274ceda0e62f7fc11ef6790f8da6555f8093da694760b7c00c0d50a6762c03e385f246dfdc474791d1596d7ede83e6427b56fba9a276103524be026e4d9412dfb3d5c623a45240db0edf93dd1176cf399f7cefbdf78634375b52e12114517f15b5e6569a5df1736fefd8dd7d24caf8f2e7ea28ec7385db685121d49afab7e5b96e8bf0dc312a0faea3e66e228c51e8c7a77c10ccd70179a07cdfac1d32adb4ef3ddb7daf43465b8a0a21a4cd4aa3fe7ca91d7c4236cd3bdae8ff6ebcaf21f4716edf6f4ea867f0dcbdc88d3a66eaafea4bdd57f4543e207c720cf89a06f41e7e3ff81ebe2f825d7ca9adb4ae5245c2d17dde6448f870877dd8bafc1a659492e5596472b2ff8d4e4af9453242f8cc6c331affc7fc2bb7558c317e8d939db8d116d12e7428dafd1b5d8c1f4b805f14a17dbaf9bf47a9cba53d4a298d0ddb9ba8b5be9d569beb1bb721cd3da0083b6e8a60326766666edfda7251df379d0d21c32577677e2f7a31a7d69c0f8afa0e16a17efe5077a80d75e3f6832f7cca3c9e84167ecd55dda1d678bc63882b2d84222afc5503c9a71c445fda2ec69dcb1fed4f94da69d7570e1f469631da5790f80a22ffc5ecd375942b95a25561755d3e267bfd54b0230f0a4690bcd8437a4d5e1233970f9e5f7eed59151e0a3583c467f3544bfc542e15056a5eb34a5e441e4cfb07d32c9206ab7924085ba23d130a7bac03f5aaedc15a4504613596490b3652b3cc3a503fd42f437d134b3c55106ee2056126800809fdfc70dcbfcbe51d3371e9cb15f8ac49592b230f4faae91766eede2d8c6f8b60d71b641ee9168bde77f1514f1f155ffe9413d052a97d05913fdf3f8b301280050000e6ba00dcd3ef41d08dcfb3085a515f423c2882ff972fdf0edad75ff93006a02685679ffef85e14a3fdc1175a68adc860651fa613d2f9927876561a7cb71dfdf934a393524a29e5e6247ce88ec317b1571b67244a7f60407100438622d638638b1db4c034b0040d69fca0830d5462b0ee6700585a10038319622e7881f5731e74e482124c44e1f2450b4244817503c12a5ebee84408db69872e4f080628508b8126a5a6452dc2ee28b4e133e57662e3a39f79dec61b4fe4deff79fe79b8e1bf1ff2a1de71bdb9e93edee2436d0283a37670020e1c59d46a33e184b3d6cb83694c13178c3102333228230416607411451531e00256536716b3d6f97456192185c1d53a58e033bb70627c9da794524a5fc9d579ead2f98bf3ae4dc7d2e65a3bbc04f2d5e6ed8e96946c4c49c460383ec381a3d3790f1cdda863a3e540ead2961410ba2a8d34cad085194588f10206c6152c9a74418416345cc06c9ee18e140cb5306c740b8c46bbef128e1f6a4a29a594aa341d4a359dd75ee755d0f55acb653b7a5d8f03a95657946aefdaf8e2e8e8fc50bb36be2d9d8f4b1e6854a3544747d3f9a1f6a003aba483efe0b30e3ab0b12a347eb445fcea9ca08383aa542a1c2a4ad5a04f59534ea965bf7a4dc3d1583ad1155b91a2a8aba543a9abd6f796ed8e6eebe9d6fda53adf511d9def5cf4551f6d47df451fe787bcb5d5a72e1c174ece67aa1b57a59146aa5d1b0cf1e505371051822e31f0028927548c40238c1319301baabd6a6a68ea860d574b27526abb22ab87d4c6d7344dd3b456bc3aadeca16a84d567432b4a29fd57ea860d17fd167d1d6a571f591bdfd5363f07a7fe4db5a95169f3b3ad2b32638aa250daed2a5583026957db79fa9481e053aa4d19777260b0d13a5ab866185839f30ad6e67c15b721cdf1dbb041edb455037594ba5c5c1b48e563be7c7924be82c08fb72bf273e11f41088552a807414a4ad4c7ad2f87b21fef472fe0cd6c863a9b5bdfa51d96ed8e2eebe7368bdc6984c15ced3300a0a969988707d7ffa5e15d002ff55dd667cf7a0d7647fab65ea7f5373fb7ee21d5eaca957d6be37bb3a580e4b25857674b615ed6c3ed85e3973af86c6693c5faa1ee608be1b04a703c8ecf706cd95311e1b0b12a733eb445fcb22cc0dae17bdd7d67ebd13dcd3952acbe5893cbbd34748417d4ee48bc3ccdad68ea733edb5eafb677a9ce4e733cf3294f1a0f7a5eb8c79fb66c47ab8eb36ce7ba5cbc88d11c96fad07cd15cebdde6816cde756c7774757eb258acf9da43dbcd6ffd538d30ffe6875c67b3f9a9f2d1baf91b1f389fa96acbe6d3c01d23a8ddf39289f08533939125ccd20f2a78a18918bc34c2b89245931b50a0c4175ec06a6e7c478354ffb220f120b7f15d757de76a7df73adf713f69e6c369bb22390f553e58599665593675e05f960eb445399f7aa81a2167daa1e626e7412274cf7c9f7fc34e1bf65db625a4633b6e3ecb4e9bf3d0764277c8571bdf9c4d3eced680a37b63f375b3e9264f4b6aeb8a0809a5d11c92eef1a7410fe64840d0a276ccff06940ac6891a08f5f839e1465f9b0bb5bf83aed67962a58ba48a0306d5825a9dc8b01851440d6584a8abcb4e507ae852712e3b41490a020a0b2833aacd65271dc688a166979d74381373a039606ea84828e160d1c1e688273756906ab2542098a89a6c66d08ed85263c31312645a905436c420432a09256d8d26a82c495918744aea87969961fe08fdec103ae2c97bd889061f58c4e0020399257c6851ba02838f2c4f54907c20b1254acca9861a6af091c496170c98ce98219271c612d50c6aea8c1a1ad4398666a5aaba984cea4d153562d4541431064a6850ea3422bb624acd13f5e672931926d058506b2e3799f1020d66ac50e343d52e37a5216336a53903011dc8b42e37a9f1c2163032661e284ab9f8139211d6da1cf7f353ab92f7680bfd68e7506e41022e027c2e7f74f6a047dd39a8b774d62f6b72049fbdad4341efe7afe3d57bb8e66636a8abe41d75bf25d7650dbabbbb43267242c8cccccc3af287baffe67acdf5577cf9f4e7f68a760498b44842fde31c7c98a41722b96012daa7227aacaa310c8a9aa82c6816d563948f85d7ce536a584c2c50cc41477d40b67c5036fc2cdcbbb89e8286f2e4f811eaa247e425920a13b7b3b8dddb72032a5cc03484104ca828c18e8cb0e206193891041034d002d6bd58d0bb31e7ce9d3c2900a349054bdc3955f074271513dcc9ed7806e8a2763beeb41405e9d6ec3d28db71f7dd6ca63e15533f37bfac4acd212e4fa376aebb80dbadae7c4ee3ca8712082aae4cc1d295ae17bb71c5535bb87029cc8553982ebc72210763b129d70c7daf490a6d474be572fc5083f501572b29c464fc0a20658bdbfdb058eae28b3284f08206089c8080c1861a2cf9e28647068d0ba9403273218410421c2af7de93c274006d258590f2a9504fe31fc1f8d9835e43e0436bf460f08f605dbd2989e4d56bc2b6634c7d4f6a8025c635107dcac97f3da950a8584a03831b44c111b0d792da8f443ea54222b89254790fadab7ad08b88d1110cdaea3df219267f85a5d2ef842e1239e5c164eae53f2d26b8ae54d25688cfaa21f0871af51d3f69cdc91ea90d66ff54fea9ed9559154a18d29c7cfa3ffa530f6fbc29fbdc89e03eb7cc2f04b8026ba97f5bd1fbece9f60a423bfa47d755419e65e6509fd94e04f7bdb30fea7d6af379e50bf5601e46ec235f7e023828c9ce0e8b25913427a50721f11ef9925697ac574ac95d29a59452bec63c32c5d4efc9f7210f9a307f20244014ca0ac15fe150dd5f44b457d1d75e445449b457590a833e24d49c9077519603dd51eca29e57287a0929829fb22b9475dd1eece3af6d401a01fed23f015c00178a379ed4fe27eabbfdd0d6ecc7dddddd6975a2e67c478e1d63723071d3f78370a6922082f6fd5c7fed77f57bea26d4698d5e48a828105f5a23ee62060f5b9aac64ccd341251e3f9edf9cac7f286c469a8359d32b907c842fa4d265a71e9cdc171f85223e70518a12e17b435f5412543fe2a59186312ce820031cb048b1012c1e557972010c616ad082140c111f88a9b21e4888cab2ef4900b203b5a792cfaa1e0dc477fecdd62352c001f3a781e60feb86c5a2218975d303989f1ded43a8815e42583f7f5aa1e6228b95dd6cfcaccc884561b2e24f20de131ff5885e37ff62fdd165d9eedd9bcf9cf52cfb0ae297f57e5956c97dcf7df35e38ac241c3b425f9c1771509a42c5a987d88dffaefccb12638c4364b9410d8b8fc37acfc97bd240ec1485e9c67f39c4f7dec3f9951115e7339ced5d2e49959c6f59ee45a4f5ae7759a32358cb323fe835acaf79ed5311070785cc7150b0516536d97bd25c7c1cfb9258db934d601a68b2b6ad6fb4e18aaf964dd28aecc48dffa6d48f28704f7c94ea993bd745d9b841040eb9618d1eacf5ac1a62c31a3d984bca129cd56681e670a8dd672c1d1dfb949ef52b1b6ac75c581b0a9b91e672b65573d1d6e6e2af8aa81d7369bd5b97a5de036df5c0098d2cb016dfbaed3447d41c100f42a17be2dbd88eaa6c5735dbd5c8050510a488379e3011d72382efb24610054728a93004fe107f56290006317081b97e763417b38f4f69ad2e578c313e2dcd4510ce542376c798daed9c71bd0d22446c5823eed2046b594ad47a97357a6528adb105d66aa00795706041d27e286569d4c6f1acaaa669ab9d9dcb538c00290dfa1aa539b878f881e7c2ef5add0556e4101fad95ae78a8c1a964ef852f6e3febb213d215f73d4a0c14f4880b84f7b3d30b3d40a7175688aa179c4c400c1214d721c0658e2001152b5000050cba8065363d0131485f4cea5446da4c29a50fdad47420b8fddec3961cce6ea741a00b342f804963458b31374178f1e4a44b931918306567d41e5bdee38104da4a0bc06527251a288d81c290bd07fa2aa93e2ff27d728cff6ea492caf729df943baee67a05529e4ad552a375d1380a2b27a842893296ba58c119679870a046143bac8184154fd890c544994182939216cd4909ca4d5d76527252461a7f2d619ba81dbccd49195500ba47e485b11261630cbf817d6ff06735cab1cffb0f9ac0f9540de809fdaa115fd3b4ea311ee9245e5d9e7d96323640170ea1bb8435860a21a448d40e6a903297e836caef628cf159ea453496289496e34a66f928abadaa269fdada69526b9274fa0292e04348abdb265e4a09a5fc28a1fc0ba59412d2e65a07b472db244bb96ddb7661034929a59451bee01fe032153f0f609f2568e30690c6bfa1ca2a4ddd13acae74aeaee23f5f7cfce00d1daac0dd2333f38331ba7ba550f43565f46fdd10361d8cd8877d7a34d75e125084d0a5cdc939e79bef56befc1f7ce77cd89c86baa82b5197551185bab081a6ec57b4b93557639ff75672ac785533fe9ead64fc05a4fa1e05b0338e6ee65bbc11beaee992f42513021921e0a03ef61e1d2a9454659f2d727ed8b991d55a5e51b0b84ccb8523f0c220dd172754d1d4efd167fb3d94d5e0df401b0fd6be4a740046ecbee7292e57711b8a1714280d4ae9b64b89f8eb3d2dacae77f6a92cd426202d425d5645188306e01b27a3006e0ff609e35508815cd5197637f7357c373f6e2e6d8e550d7473731f7caaf838d700d7c940cfa9c26ddc23f1fa3393e3d4bd849a7bf183eebcd9ebd7354bf27d03baac22f29e191fdcc67161c78a1ce46220a1e6806e0070c81e1714fe9c71ddb8a97e5a641042f89c187045092d58c41863941709f721a5c6685580b7c8cfa5f6485fb74bf1354dabefbd7eb1bb1b4523dc611fd8831995c11cf1eb96cc96ba02157a5ca94ee090f802b8adab73bba3bbf4226a98fc86496ba404165f4216021004b7da618443aa2306ebbafd21b6fb946af4756f5bfd751e60fdae4aa1c30f59f61a420831708fc4dbfdaced52f97f402d193c026f11edf6fb0d1d54547fa8821042f6d7393064668ef43b7e5601c66e0a462bac71fb4b78d6037ee517f1fbeb744412f350e1e7d2efe477b484d47d2f511d3b1161e61e793785472d07d8cc3593e361c76ebf7f6f1d7be6c831723f37f77333c76c3e4f397fda111e6c41c60ea8ab0b6f66f3606f759999f9ca951fb78c36901ab77377f7f80e2184d0dd5b45a3477777cf713b77f7a32bb7087bb9eee5c2a6a77a56c714f4dfeda494f2860f14294fa0a6885d81621ff6e91fea79790a295b9ed5d1545197a79082e5be101a0dda4059502c2e4e19ef994a0172dba43e95db0eb21cc1c4605cf9b1980df7c814d2bad3761ff019f2129e0c32cafc0e1f3bb3f773a2942133a51442c9324efed78c71d3d827298b11ca09e55c39b3ed26cbbf114286ac710ff47796929da00e7f70c2892b577827e3ce1807059527d35c5a3d8aef75c9b8b3cc5b903fbbe594527e6ff087bcb7f8fc5ec68db91bfef3ee7e1fb71494dcbe293c17c27b74909624c2100ba0e065b5f39a524c52b818e3fdfc23eceefbb07abda362aeff80b7a90b79b1fbbc7869bafe90308feeee984f691058509d8a4769ceff005cd4eec5a25cff1786832600bf4c192fbcb0810ddcd99a7043ed15fcf10b4c02c6e14212646f04b52f3b119174df734df69e79ba9fb702b73dcf1397263ec685ecfde3e794458c1aeeaa3978b9698d19eeaa46c91e30028d75d9a94a0babcb4e4a5cee6ac70a28bc88bd07a5be95abca509fd5eaf773fdd52543c63c52fe7b22f8f65c73dcf517612ed2026976c206105aa8ec60030b332c993082d8155f9ebce0065c9c8888719fe6bee7c9719f37fce67640a92f21ed6f5f75f5faf1ff792ff4fe392db2a1335e438caa10f5fb1fc11cbe7fdba1211ed4ff1eba7d3d1f2ff5798b90f73c98d1118cf39e67c2101032af9f1af25f6e8700a15b6af79c78b94239b4d010dd8c8cc85c798ac1e4cfcd28043950023663d05b420ca108bd7948735b68ba13892b34019bcf2a22df218a293118e76a989c0ce3ae410ef367ae2d3ef119d4ce63b43e0df5e6eb6b9f7a55cd67611e368f7373f3381096818ff3cc2c66d623739f3f7ffefcc9279f94f3792c8d4b8cf7f1c9d554b9ac561e839f535fa7fbd5d6f11626137b4a5b70723ae7e6fbc63697de62b33516f6e9f7b1a562b9fde6bfd7d24090c70fbeefe7f67acfb79fc840499346a3f111a2f2edfa3e9f216a4d3f35508d6da6e63ef5fdb485ca7e16fa9ee4afccd55e99fbfc95b9f25310fad6cd25d793484384182a38137d20d3c4962e5c9cae8b792af35e5cb7c175a1fb9e34ba9ae657b32fd473596a7ba1fe5dd405c1044f1fb05017804675bd8def7f9da6b9f69807b5fec6f7bfadd1f40e2aaa8cd97886b598070ebf97dbd7036cfceb89b87ec72669b93ec98db7e172b95cefb24a92d878d7bf6c85753ea5d56ab5be6595b83ec98bfdcbbe7f7dab65877e8caa10bddec6b3f774441e18457489c158683d075277a9659360e06587784f01ae6822067bbd0d1bad7fbff3afef3ecccbbea4d81116471037fef5cc0418675ecf04c25486b9c87882064c6230576b7b4faf07c213af2986f4dade19046871e645c4d5bac1f49c9070024de674c4171c349da6df4bd27ad76b88d111cc658d922899676036def537ec4b33cfc01866c3c6e61998cbbe7cbce4cc50b726e33dfde43dddbbfda4b91c9a438a35d707f8a276ef2eb5bef3586f69d92dfdb4e5ed20861527dd5bc8f4f7f716a528cdb5122c87fa6c337951e306820b8e96761073c509a4a8c183930ce060050d9930a820810f99bfc73a88bf24c562b1159c3410df7ea7b2f4453ff9954766ca92db7993db4b686ee7516e4f8175eefdd4402833af9ed254fafd49ac6550df332cc66a01bc90b10731d70735a711f67b1bf441838c1f7373d5358d1fa5fed86bdcce399fc0db3ddbc122da7d1a9f9065ae2eb67ce8f1bb2d8b1142b745b4acd99f47777766d67c43dd271fdc21db6902363f7777f72605640913c661c7f8de0be3689eb43cdd639b5db502d73956b53a6c7e1a0f0f0fff946008249a34b7aa2b204b9ca135300c41c445b9a0cacb4e4354b99da6ad785655d3b4d54ea44c2cc020020b69ac846143929531363059918206a41fda440cf347e8678790124f28fa334492a4956a1509264aadfcd00488124c4dc85831811517928024412688343400d18214040d6400824493f730a5d5b5a2e208a4284e3ba092904e602f4f9134e53aac05f5f55ecfbe1e303f3e91f9d12649427f5a2232497c695fcf3245326409b531244616a0467d6c847d4650e5eb01f1e55781fff28f60f3a1258a46d1bedaaa40c4d13f82bdef388c0ec8ce35b72521b9457f23ee8fc46315b0ce80f34412dacb3e18a283200cbe051a886f1a553861831b9eb60b40a2763cf0a2a017262a6da5d5958685106308519d64a012071ab73fbed8142998f0e9307171fb88da693c1cd3960f2e844d740063c5982dceb0a1041b20438d19603983831c8849638993a6c385666ab2a3e64a143575d9898a19a91ba8c8e009151880a1f2051a51331d6cf801c4142935c4309d740fe710c575c613ca53e97754a3b64a79ea1e2643cf4811c3d57fa686b8843463c0042a790f3bfdf8210b142ffcf0e189054c7e4c698a9225062d3fa238d13d7c3b5a5fc86a68ca4109ce54d4e5a61c345963fec85a5d2eae07fb6436b50a755b2311c07a0c9ae387cb6cba772184b0c2afd9509755446f9b17ba0a021e2f84d6480430b72d86fd27073b6cad07fbf0ffd0ea7afa3cb8a1be67a1e6f82985352f2287a19e51d6480429335e3b8c725214d75c2a73c19c6b0e72283a334de3d88f7c7ea11ecce3bd581d23b75f728da91272cf711ce7faa9f6c55ecc831254873706ffc5e28bf98bc11a8e4be590bd9f550d36d090266a0e662af8f48a56af057911e7531f3f0524f7d5b779d6dfe86cb4399c3fd24038ef6f44e759c7b2659c0dbaaa8437a5b9688b34a7fa814273fe481a285309c1b1b43955909b8f9fb315dd7cfc4c5b7d7cf8d92a0e3555055915c5cf79aa0a123fe76bf86639b6cb799c8738399fe56c443a549ccf2901e78b721e3a20c7d2fa38b6bbb12f2145ef6bfe7db41a540579b6c6428d93efaa12844e68ce9f05d29cfca5d663a07bde67361a6c200910519f0cece3cf58921e95cb4e5890ae5f7fd2ed5095d00349cd1b69a09a8da8b9ba9960811c0d6e431ae875947dfca7d48ed3e0e4bb9a932f1ff5f0bbdabd262f7bb5b9f7a4b921576dafc996c36ad61d78e476abe6e017d16edcf155dbec90d1679e54a73ec888b3432219aacd96a37b76b455733ccdcdf946502f4604982a87718117be461a88936eaa553efc7d8b5b575fa9e7a5761b05d87c076fa44e1f030d447f4a4b3532a95817199ebac8a03406b54697265792e0a7a5b25316a59b7ad553939818950b80cb626248170c18540ec4cce045cc0c4ede15234394f79892c68c61427a549e30d04093c99cd040118b3b1f8506d29e0a97be53894ba6054f5a9014c6892c619640ba338c134c77de69a3d1ede53f8f3437d3b8f3254044a57fa3ed345057e40f359ba7da31983b2d5173f3771aa8a8ffa982f8438e37abe652dfbdd8a780e47647576b20beb33be257f535ff96dca96db4b9d49b405455241c5dedd9da947d4a25a49ebe051a88f296d436e50790e6e65ba06653a984d04fbda60a927dea555bd14e7fea535f9b9b9a2a48dba2d4d3d75441524fe1a7b69de6e6bb8ef83de2977e25d2a1f6d312fa8be8af9a9b0ea0d6d5dc7c21dfdc4c7ddb2eb32f21b6c89fa65441dc52225509f4dd8ad0dcfcf974cc0fb7dcdc928d85dde33fbb6aa4b9f90648ea588cec5a0954a9d97790fd4b38bafef3fb07dc692023b5db32260fabf21a6263f966ed369b0dbc9e3a022fecd1405ddd116aa06cc9e6771a88533f9fa783206c7ef5201b6ba47be6f3cfed680470a80ca36fa483a81335a97ce9679b90145d7510ec9ed46bda6ad5d53b53f46173ffcee345ffc170e172735c06f3c496fb0dc40eb09dd1fde652f04b5d77d2a7f6ff25b5b65083b5cb53f430c6ede8bb8064ce9ed6dd056e91addb5e10fdefdfe63d9cb92f0418935296803dc69823c61823478e31c618618c31c6087f7e628cd1638c114e1f787c014b41d2ebfe4a76766ff7eef6f7de7b46da9dbb13ae7c6e7728a133bbbbfbec7125b394ef8ba67cf3e17c38df0efbcc7fefbdf720fb40a8c241084a6a708c8fad74d9ee5252f6e1f9cb9021171182d279e23b94524a2993be5cf8110dc98c06a506ac4b4e1710c2c7c4f58f30c618238c31c6087b85ebee36e818a3c718638c58308f2a692ea38132c276791ca3dbc873bd5b4a296516348d075a72b67c59a2c9e52f4a34b94197bf68017359f246556f85ca5fb468b91dbc90e372c02bb6f07221849007ec3262af22703cb1e17b398a169a5c7ef831ac902afcca3e19abd87e70820a9f21e4aea2c3a9fac31b3f15a3bb7cdefca574e9996b730b216600c69dd3dddd394a89c58e5e3142c6d431aaffcd65a717e033ad173e7ffc2cbab46ec5904b296560034de5974fa57caa28df8a1baddc4868cec1cc1e6a9ca0b66a3f3841e5efe2def0819225f15097a1a862880ba1a8220517def081525397a1a842e9c28f27b08fc718638c8c64c6853246a98a568753ede718638c913719635c512899555a82e81125470cd8f1d3326a919c5346c8dfc90899a59531dee4fbb7bf9696031ce5c6a93ba5bb6f0cbf4477e71a54d565a72a4bcccccc5576b891a39452ca2a4f5094320f9652ca38a58c31560980171c32a494524669dddd3df2bb7656f2bb1574e7c8ce9193ccfcae9dd50a62e13da58c114e2c32e92b299d9d3d33d3b1dba5f943edcedc29b91ee1f4d52a42e8ee68446686f1a98e3315c5eeeecc91bd88bb84cc247394cc910168a4845c64f13ac618238c31c608b7ae88ebf66711638cf1c518638c1c638c314228c76000941e593040cad8dddd3c374777777777f7ebeeeeb7b64bbddedddd30875057a4df7bef6d0f8855c13e0f884dc1b481e27d2f8b249054411566d05c78dfcb7fefbdc73cecf3e69c737ac31a27506301512be0c3995700be704a19234cf220880adf75bca0fac30068a1230c7d7777671923845b304e195d045f00b7285a149652ff733bf6e28f9418d1a7298bb24b98f8c0508f9403a33726604585dbea763977a2643763fc0eda256634f8e34604f61ec2b89444097f4982b18df1972498cd7dcf2a0af09724d8b346fcae4b460e5876c0c244867e0caa60061f58e84109d812263eb0f74839305ec2a461f49114007b8fda901400a3465588de1b99e05550d6a80a11fd678d38e7f2c465b800c5520dc4a4a08c138c617c54022f4a4081c2c4d31063c018c6441f8bc11e1d9375f4f1bf9745fea44c3db79d92cbdf51ffa427a4005730b186d1e5678e6e39c05f3aa30b6dc7a9fb525742082384ee8e464c298b314620f73d672ea574e9f23b132e7f46ddbddda584ec5202b94584ee7bde32c92c7584a9fc28f8fd999452ba949bd63a9eea37d7312ca494f2a9646e4e4a29259c52c658ada8f1902184b091c8c912b309001731c618218c31ca18218422e3cb3cddcfcbe23d9e0fdda7bfbb7b0e77f964362d07d84c4a086f71a3656666e61d02a0f2a8a4cd776439e914d108000000055315000020100c060422c150340d645d4e1f14800e7a96446a4e960c845192c3300c420618430c21c418000821c418aa9a32005db5b6e153fa874f6c0fd58cb3a24012b178105999e335931a1af1266b43392c68d3eefca7ffeda473b2341c5d2cb0fbac776d17d32e09136429ce8d9338142af5b4f7de44ae361ac4574120bf3a9664e98a8518e63c8bfeaa68577c055b847afab84f00bec1580329b06d85e7155dddbff686dec120df6e1b50e7bbc087f608fb166cdca0e3cc67ab338acd8bbe0c1c1ea7954aaef3859b2babf3550b574e91658f200a31542fde0487600fd530fc6d3c8fee4d79cffca8cd9f5d82d5157f0e68ea6a9e3a41660091d3849279f8f359c0f51b42d44989133b2c69fc7bd3b538f79cd8ebecc1a5143ad343e69c893b21df9629eda6fa685409e8e0a3a7cfcebca1a96c4bceba22e960bcca3a8d2bf67dbbeefed1be424d7d0359ad03fea8f04a516c3ba79ef3e2c3377b407d8eba19de79440317589f05d1b4a60f356fa91d02bdbdebaa1facadbab2d610efd0d6ceaf5f4ad499c439b98874f0bbecbecab3da7aa0ba64568845441d4dd95a7a539be11e2874294faf1c337589a5f94b7ee151ceacdfb43d7983a996a642d3364e7497ef42bc4511b3102ff55a6fc895888a7800e1e1756694199df7e6a23382042b8302b31a8f039041aed2b3b15f0d6d7b40d951796748ea24067a9f6eaaa97c8fa3ca7e60426c90b7b53ff9a638a6e0e54ca41cbd1f5b3d4110945c3b03fadc187ab79258f11ad9105969e7ca103d2107db441d95353969b92cf13eab69546a6956a523ccbf0c7bae38648069c54aacf17c0f70fdf1f24ae2b351472d17444e394d439b1f9e730b68ee8c3f7353aa76cb7e597703a987d4a136c619aad00f1fbbecbf45c408668e2ac12de02757b00f79e9288df93ea2f4d8c27c0b01e173fbfd78c8c613343325e08e5befbd1f5739acbcada3a725061c1b9aec8ce879a77a60f8e11bd6b4856031b4ef3f2d3fe35fca47217ecfda14f8af6b9c78d541d0d0ebaa9da9e6ff358666d372cf359ce425073826e6e33e86e719323eeb1a201c820b006c50aac07e0afe8a4a6ca7200be6c84b9b7751faa1627e499bfb067a92d3e796c1cd47883dc4a36043ccacae86519f0830a7eb999997b5a9b7f7171ab4afa3cab224cc53672762b937559bd78290fe86c39ac013218b233209681c5a5994070ed4cac5d8ca5390721de5f9fd1882d0ed20c0335ff92b7d4188193c03b28087e5616d9c7be915cb57f3f55987e146bc543c84a1f0368e333bcd0f0d930fb786aac1858f806a44230eb40910786b2e3154ad63b67bd1b3de7cab63aad335edc7970ae60b10c192c89ae564d49295ad2e952f93adf2d823546874ab97f7df96367c4fdcace98e077b6071c13a0b90f96203ee4c04115ab737e4b3f4bc195b88049516803b90905ecfc9ec5ce80f80c8b8da4fcdcbf4fef6baf5490b94559e6dda0a23377edfdd1b82ed32acd35de57c53c6e3d55b6312591fe12fda09952d11ca2ef71008904d0d8263c4c766a0f0802781f146f9f3d5f1ff3e0547905b511ed9dda0d4c52aa52259a8a52c52ef8a592bdc2b1ef85bca33e8d0da3c277cc6af8e4a24d0c9aa48315ae0355ddb99967dabda37708e71e888363ec09c366fa8302ce0a8d7af19f620a085c01bebce107bcd3e5d717a058734af81d5f224c1005e96a46233259fa2ddda3c4b40ee5e834ef91cf97c9b7fcd3c94f18de5b531001a56fda02b02683ae64ed5353acfd4dbf96cbad78d10e90c47398b22ea4d4948c3fcf1b490b3041e205c9b0af55b469fd83ac176921431b099bab13ac3df0949d855bcf0d6d8934fff8e58ce738a2c91b032b7c733c60b433d2829dfee630396dbcab6573fe506af44dcc16532027f6b663163d0a55ba5860ee6b23513a1674260196f2ce598a540fb9a28a3b87491a5e0b9c2d9a02669884148da3727fad1c24642e63840729b7b64f56b84f137cb4f229af963e92e288367f247c845c71cdab9079a5e1c9f46bf22843ce236fc91129d6ec87de684143a27faa49373c4b5d1eca62b83ceaee434c883d947a2543e8c1f17eb09275368a04305095a489e70836c268021383c32c9f883667825b17275b95c9c97ab5b018deffa56d3e30b609c136768f1fb47ae8eec1955fce90f2ee74bfc572f4872d882af15f8b18c103ca7d9fc707ca1e1089939f7e25566c7bfdec2c71d4a490fbbe902724d8aa32bc93bc8a28c859c899aa103499671d0c743470389d6b322e98fcd2e3a3eb54bdbd9f645e8d72715aa357fbce4913349b4b37328fd52c044a967601dfef021606e599a98cb69ae80305eb40c5efd19fe754eb9358dd08463a7f161090158396e8b0e6f7140d55a7e1e6adbc2e1cd9181f51d86df362aeef850b3a8bb79fd4c61e374ba39403e24f7d779388b04c1716d298b9bb2b3e78fe3420aedb65dea2a3b6cdba71187f0f6ceb41dc8cfb7e9c0c099111ed3412640704d788087267f7d30d040b22e242e89450f04d480f45ba324162b2680da0452b7f4aaa4fdce0f00f19f7c3818383c649a94a2bc7625871b8f425b165bb6097194950b1b78326e5ff09af1be74e08de40ab97064c15c6bfefef66283fc91defa6cca900438f916a2b62c0341dc6fa07f974c41af7804e4a6efcc18b564d001f394c7784207078d670ab28507092e5278bc78f68d8230a36928a11025dd15c593176751f294642482bb64f9ab263bbbcf1f6c6b8c235fdb7b83f6a1954449a2f0c1f003d4ba57beb4738f08bb02687f479170288a3bfc933d60595d149db20d7120a8e2b037b72da47ef9d3ea09af9c39d36f37cc60a2de5a941eabb1b9126bc6deefb357a25024a315646645aab3226175aeec54d5c98e3cd9b3f64306609565153f1f3900704a1a5ad5b0c8c3a2f896cfc9c739ef2ec0c4bd2060965b413946eb37c3822c81e214313f51f6bfc88078f335db4ff2d06c11798cbcc17ba077a8ea1d5bdfa2b93c0bdf4892f29c1b2ebaff9dd5c172ad3371d95f877e849f8dc8af6484c609acaed6428ad045e46ef8c031c0df355adc34f099389d07bdb58721f6a03387a478433c73a057234422a59ab3f1e436f04bfc5cb8f9a4d8759c3b3d642726bc56812294404c9488457e83300405717f71abc1c0578855e6a46001cfc3eb823d3d60827edec2c05cea8bed3df4ddc619dc429b3c3bcbfc8ec066deb5dff38aad16c5f89acdfddd219847a82303a70540a98ccc6215c2eba47455acb05a9e5dccc185a302e3af9496b58053c2f7b40996f55fd9dfd3d7000f8fcd4020e32241447b800253c1afceac8cd9c49e76fdfbe137ec0697c1dd5ae3448ac7d22e3e186f93f9d8c7215a4ec9bf86121c8c3ab56f31fcbe0eb6b9205a1dbb2c25dc7212317e91afdac359597ba85d7dc19c7a60d9ee047563c5b189a8ae802f83c474dc840afdedbc66e45a5997cf1114ac86bb6eeb22be35cba06d3835f614e5097094f53e9a7002d22a67e6c1856aa4129ac3670c1d5ce8fb898cf253d949717e193630fdbc10411ab5d21fea1d1e18f04811bfa2d5809861e64554f1c586d81e3f57cd37c6f50e037da474c7ae69053dee608267d7eda26f420ab374b452a3b4b3089cdde99dd3c550aa326b03760ce978337100ac30fe942b1e0cb70b99313a25eb507631b6f93f911218c710c72e8a49d1506e32fa0ccc3c343f204a2e5a30bb5d787662b2073690ce90ad7bcdd6affb0ddd558f2dd9a2c93bd3910df525a75595815ac4c0b81e54d082b102dd1e66a43f411608214416db64d109aa26460856b5010d6d05baeb49922774bafb2ecf188013aeab6d02dee5bcc0294c501fe1789510459f7242ff919531cb8451accaa4c660ae0489c991dbc31167ab75d2eb878da7cb78577dc0d9c628d89764e31eb8b5582dd5a4c06289387c738fa79cc961c530d7d8930f806fced08f7cd3296baf78dcdf0f892ef2f56bb675716e9b0680f5dd5c288e87087b3e76fafce1fcf67c426fdfddbe85475121a0e802dfd72ee25646cb5f7ff64d67740d55ed843184d89bf0d2cdac33cf8d29a2eba8e11df96f088dd46b438e8e654e802bc4b34f3fd8bd2d5af1d93d94bfed164eeba0c2e97744301d58f8b40a4c10296cb3d7e6e46c452b70d882890240b5a0607c38a4ab5582074e06191f46a575eebf0e40ded311054074b01b9f52a8e071c2c6b2c6df888d4f23021bbb1bad1d32027c8131cbc96b0ba7aca99e1240955fc21f3dd66aef9e7ee9f533ba55a3214a0962d2aa9b41496025bbc7c95a6a60c8a33f9f7f5272bfa914d04c1adcc58ac3cc94055b6a3ffb76e915486326ba0f16954d85430ffc6f7ea619f7efde232a4630fd7d9693653c92464c3466c276c50cf9cc2a2f13b7718fe32a8c4d6fa692d4ebee100ece83b37479417e54dedc1d96ff3199815ba73aa56d1bd9bafa0499a358622fa8d544da8b8cad968b5b3fdad0acc91b4a0ad09856a8bec94f351b9325d98e8116e69bc3be63fc5d49f247a7ca83b00ef31734e3fc43756686c744b19407d39294b46d8790ceac6442c2740e9230df011e2fd283987a5ac1a02c611d14c2d31801b6ac54a8df17665966df48236baa1a6baa95eded8d330025e0573baa33bcb50991ccc6d1f0a680df812e24c3712b3c897e571955acdbf480ea39f4aaae5589e6af06965d2f6adb4b75011656fb661b1ec754e0a988d538deeeb49459e9ee448174a0ed9f3374c7b45c676d7210d39244eb466b762a106171d76e3f141ddcd4af49657dce17989a40015defce5a61c9061330154e319909d96dbe4aa65d74b98377931d4699d9d4afeee4bfd54df663ce338e348dc2d5204e4d26e10732102763143bc558517b6f5f7abf215ff66b34228e81b40fbd498daac1d9be0008dc64473b559cb6009b9e77060ff070e3f3926f9e31933e82d15a5b49abcbd64c0ea9cd3e4129f29d2a548846d3ca51bb5f915e41d730962febeb463a7abb372a96aabc1af4d0dd9a4cd87915d9f416fed2fe0a6c5a32e906310fea2ec1de921208e536442e78aa04ab7faac6e1bea5ecc2c5624956630cf4674ed34b3e6670bbd8fe0a0e3dda01603187c0777fbea1a1908621da9395952571a56a478383e408cd3ac039a4ed983c143db772a793be6a33176733ebf871633d51cdde740e596423ce173016d2cd6024dcb0f9a3149e72b22fca10eaf6c9b7ddb604d9b4bce54165f8e635e9e66e782dd4292db9fb3d0db3c74e5391bf490bc2cd35403647cfd6a686cb0abb6c6f316b9c9ff018cae0804d822c1fdbc8f13c94cd9476d08c8deace3c1f2332bf324d868ad31ce30378d55ba9738cbe270547492bf7836918aaf35c2de6c1fc0de01b3b3f1b6c004b9b044f77445d185f4cc126fa6c37406c3997821495f05436caa9c0b5e0bdb4d7bc84024865c0df923b6d7e136628f79a500160a4003ef4aa0ea1a2ff72eef5abcef63c7a4847573428ca8b77c58a74c1419451b70fffe4c5a08b1a0c248131d75a30a9a302a7ca228d1b4b2daf33182257c9c1677aaea673bca8b4fc31fafb55dd4fd9873c693f2bb67be77632662b0ece6143aa7578184e592383f209a12ffbb7364aa9ed7be1f1408b5bf83e58397cb871cd24e2a780f9ab9287bf7becf7c0d796cab4da0fc04e616a5a850ef580f44b58fa1e8d818da030c459aa111a66903363b74267b403eea61032e7805d53901fce3a599e9a5e31451066f0286853a17d13bbfa79dc27c7d806b318ef35c2172115915b597b5339210eff3f4d006f3f05b1a0ff43d677bf2239a94ae130263fbed4255dfc39afc922b3fee512ec859b2dd2c909a1a97f246eb1594ffa640b023830bdf0e3fe051cabbfe72517eff7e389f2748122aa75230932ce1d27822f40bd52b80a8995178ff2520b065d91a2dc541163727a4102f8bbdb9770e5e7ace6cb770bd69d2ac9157aca24ab27f701af9156857d0f953b3177917271bd12ae1500cfa1cc9986a0003742909696d506fc4354dd08069d642d3ee669922779b032658811348241340a807f9c30ccc26924810820a37901f6a3260206695891c5a98828689bb85875f950534b0ada027dfcee8b384f9535191ae0f949aaa176e01737be18021a32818983d9d0cfb18a49c26ae65d2d22f431a063d561a2aceebd1f010aa7538c416b430771a695d19c6d1917fd14c34df610bb1a59e070ab24b638fc7ce1501e014fdd778199bc226600eb6014463bb5477c37e26f14d9a4c2e86cb02bbdfb04f900e23cd78084d04fd80ea69681c539a03df69f84237301ab5263d520b33583654b0ac91bd1abff86c2357034a47ed7451f180d6c198212567b17e876462abdb680f0d32fcdbc3a581b613ada3e3c5c7881910800cba3605c33875aa111452062e8ea62682b7aa141fca5e08f3c4c552f0b0ec6a6e8908e3f144581e6c134b818d2e5418bec9245ff031c3e4b1b792da12c7b015666cedaabfdfa9db15e9afe946347d2dd6890f53f20ab828223ec5535eb2efb5dadaff4cade57471e602797d9a3832761b57d8665366161ed937fb9c46be8fa7f1df59039484c8dd761538968c10fe0c62feceaf5f3b2d8c40a12cfb04059f88809c20e5650209005d5bc72390bff0755d849593a05f1a902776d4124923b8f3fe3cbfae051a5ed6d2dc2adfbe358971ffb40c1e74ca0f8d9472f9b82262c92ece7478509a48b4d0113c1eb5c1919656ee92079febc72d8c081f540cb69b88131340ca569f4fed0f856478de9293af3e2c4cc33ac94a6b307162b4a52c78c153515523e0d3649e9115ac887e2044ee48a5ec8062cde12fe8fa8f271dd0e4668118e5aa820753fd6842a048b4e096d0044b31df7cba2d88802ca834640a1438d07903face7e8b343d3a988ae59789b0d9d0c1154164261483cee107e19950514447cd2bb6ab1934524d02fcb851b3b78cb6a76635163e331ff33b5e635678ec947f156fa79597d09c90697380f2a6a97de3ac74038e04454e3e43f7ea6d93befda232d481057b5efd1a868f8c3efadb122b2f49ac1a6c95a7085dc8c08abf6268141ba154731a457527e67a0f92dc2c06cf782a1419091318632a6beb0c6e08704f4d153e9dc80b34966a1f91c9d69ba8178ccc1b209280b99f89d7fc4251ef6527396b54396a46408fa66103b9a1cafbb8514cd51af15f67ddffd120afaccf022e0be15217a3f79729b88bb6d40a611055f59d4620e08b4e6818014653d9663dfa0d266498265b48737bbaf78c77836433232036700edd374d5f7a37a49b50f255a1972f408ebebf39c201bfb0aa89c33d9b3ad843d4632e82033f20228faf072c629381615fe7b3b00790d235de5c82a9bd05c348c3504640a4563c42e9ce070ea6f8761a78557cfc2fcb0441465bccd43a984f0d3feac6aad599ee5bbfee8c4de2bf432c12b674f81afa312ba99327ef30218a60adc3d49422fef76aee346332ad648a0b17aa905c3343dc623d79129b0f277732ca285d84119d5b568814677943b7ccd8c8d9b86d509b18313478853de55622b4abdce88dd0f3a99d17c85de8d9b67197f029b5c1574781863717083933f7fbf75a9a89e0a5e3c32eb3e2c94378fad1f96ba941a38ef3cdba5f8004f69962be63464144b27d6fd8f09c5fd96563de77f430cdb01857bb24a8b0f4f71db0a4ab263eb0755928a11789d9595afc9f2da4d7a7291b0af7ecd55ce921308b2f763a457cd50cd7da2f4ec060380cfe7aaff2a44c5155cc4050f7945cf6e50c102d806c6d862fb7303b2c17cebb39ab8fdafbc9dcb37f0d2510bf97dfb8d3918a6f70f4adff7ac2a0f5786c48b5645cf9ca3266f680780d3035cd369bf0979a2720d7dfff0247141a0ef1fe2647ae37112e87b68aa58537f81f33b19b7bed1be3300aa2b85124bb5f8f87e7bf801271b8b0a82fa065ad191cda49990c7eae4ce17ec8a98c88cefc7c5d6e559de7bbddb8b1d755e03b2f11912960f4907a890aecd8003662cae0ae931ba2f789cfcda1265f8af901eb67c601d4e6d4c36423aaa02def1d06e100aece649f4fc9e62a94dc65eb8354296a7f30af2a2feecbb317b3a6f45f320ab75183140c25220d49933c73466c0a3e84b621495a0711295d63ace60fa84af825947de6556dd61bad5d2d9c30ea2e15390741b77655871c20fbc9c1122fc2373c7e9be0ed2c20b7d8621b0953558ae372b2d59c0c6bdac9dd8f41237d24ae13c09d8b4da401c77afcf5e55e53febee7d5ea1a65000ca5a11340f6fc42dcf4d98d9bede8629970864e59c95918a8ca620c116763fa2f4efef93f0d6ce538d9c59976c3f23bf156e18ea8bdc27a0b238073fac3bec2430349575565a1fac82e33daa307093a9a2d623b8d4261945d801dea6700cd89bf4ccba4d1c84aa2a45876835b2c7043aeda5928e20bd6ee885fa31f6ede66529c1fcde747c68c83a7c1b48e3a05b83e4ab645ede1581c9e7923484e9af97b9480c43325880fdfe1ce99052f63931a3746e3fbc55ef0d9e048c5ae6d6a15e2d202d88d0ff8a0e8a303a9e93450ed5f360e3a882ffd4c8ca6f1e160c0ec950999ff75b5b77b5f289700cea5a6ba3f2e0ff35382e75e887cc61baa01267c5507a1b97de680e8072f3b935517e96e8f1b1565fd790960cd5b5561a585a210c003ad5175e30eb2c165573de68480b300503456c762df2b3b02596b42548a5245cefaf16a33d946a548bf810d0843370b1b800dbe5ff7a4ec3d3311639944edcac077d5c7b08a9cb44b48cff26b0e3e41a15d8880c21e1fe256ed2f3258e70d0b0e0fbb0139ad6b15cc06c90b221d5c79c7d44bbe3f9e272100d1e48e20b7065acf6a4f04b8824b3f22560303537350e3c376983cbc2152bc0293025862184c24eb17bc1bb5b1d012c3b25b61cfb56bc7296c70db18cae58300303513f6b43966bbbea555a9113509494a5d06b0e28a67f1aa2254e741c489fe0cf15e11461771df2aa6fb45c25a90410ae9f972f542c6a4d0932afeefa7a212fc6ae982fc9e783e9b3f8f17a7c0b52872e59ba1eba64c3a09434331b5d9c2cc161e7cc2d544020b99cd4f7ef79243a25bd5279d080130e25bdafba91b176685846797c34316a3deb3e6f69d6780701010305e88896b850bee1413577e28cf0994b3958ac82aa56750b0f34e045e405cbd1ccdcf9515456081e1b0e3901e29a5d6034dd0efd096e7592673d6c590a3f605bfb1a4241cdba6b3f1d229adff5d7f517fa7e51f7b147b20e1bbd6b85a9b9b8a48d0dea17570f48eb3669e14688b64fc62adaa804f32b00a6664450055458a0d16f422d8a96782cab0bd600e6a3661e69d6b0f9a2c5a4dfde33e67e9888d238d6d09fb26e3f4c7fd672078db9f71842cbbfb327c128560bfadebf4fd625eaab25f528381d82bf0cae0bc140fa2f48a746aecfb886935f12b65eccad902801cba9195a4e002866ebb48012bb3dc3a0fe73610bcc7acbe162aabee30e3107328e072467690f9f02f022ec28dcfe9c69066dab843925cd03a9ad1b9d5f0d41bcdbeaf562bfd37b2f32b3887c0cec0c8bad6158abc21fb16208e1a11bd02f72f2b17d210789cbc5d46e4a2ae7eb94ea04477e650a6cf63be662a914c70efdfc9e3889fb7e594e5d9aa7e16ddbc6c3684218705659fa1c4a94059a5406618ce75b85805e6d3547e2b578a7cd5c7bc9a958073219ef17f6a9beb433693924b7159fe43d42b44621e95b28447692d0c81cf5f6d6a9e157c2f6f6c4e8fd57d3d1ef52a606e653b8bc434874b97ca22d96aea640ab83fa707cc4163fa392c10ee8207c049bfbda820321c2d2357ae2702dc89d4838a0db4cce62105103c18f1f972afd4dd436a09ca1fe7a46ac69ef51a725e2a908e4bcdab609b17ae49c28d8d9133cff227c80195892e5677517a23f8c27d569ea8506964d8012d75456fa81bc110f865a1b363bdd02f5b32503b9bc7b7aa178f706e5f1ee61c50bc61700e286fb87df19da82a9ad16045309877876ba6d81d3c842ce0f67c15412d02f0613fe3704d85bc6903c39f4e1a93655eb810423d69872a8470946203432ef539db70f9748c9bd2cd1ac9be10e9390a687749737fb6428fa9ffb4838b9dc29836a50c641079b2e7b6c59af4ac5bb340dd8cd3b31a99a1762ed34a40b5a726841251e6310ea9bf12f4fd74efb97b09119ffd6a9e426b8b2d0babe2a5b976e06338326b6619b763001884f03df1f3ed9b93fa80c39d3c2a0f6181a8130691d0b5fe249a4e1e100180542dd3ed3b3a340d9f241a36b59ee037254cfe8c96c5f58e247bedf00b18cabd632e17741d29af737b58628b794896817cd5d7739fc4ce3896c8880518eb4c022fb29745f0ccd7d051fcb34614d0c83f96c8132740b3727ceae8e9f9c17c598b628b72c82cbd0d4ba20ee5f35c910cda2ea3b0186407e7a178aa700c83f87becfc6fb87987070ef5235234ca5ef934bbc5057d1fa41604b1565ec4bae6c153635ea2ae5a200ce75c297a29426b8d4b0d32947fcad47a680d57dbda41fd95dcc7774689f85c03707616be010be7b2aff958103a7a56d56b248062e27c666fa1f0ff534f8bf04e3db5e6dd0355b8ec3967092430ff5ba255d2179cb0bd74b4ed3b0618631c811a0e088551167cd5ff863359194ef3b03a046e1e40e02b3e8e369cb3714c0a584a034d51d7f68f8c5735323f4db32d5d5067d57cf6d9dd50f68167a0420c22e4f0aabe006fb84ba21a23e8bc9c0d69142d4aeeb84e4390653e0e0c4b474b1fa9e8567211088dbd8e5376265418c812a40bb025cbe2f5f4e7f94f4ea50b2b54cf39890610e23dc68758004057d0057844600725745cd64a5151213f16739ce89c39ff8df157a56110e610ec29218d24fe58685009eeec5fb32e9de1dbc34e4cf759555020643b4c08d29d9b577f71ef6c2817115738f77595d423be8e2e18140082ecf868efd36b8e17dc0b233ffc5c9a9567be1d233b27f401a4c9fe1ed6fd36efb23d89ed61a5d5268d4510496351a2690514be2483296e078811be21060406b91a4a37ab9e6d8d57161a9de61e0453769dafbfe68aacf8af2138f211eaa1635f80cc1d94213de5ed8cf2d13d4dc902c42bc53fb7ba566a03cb8797d36be2fb18a892f5fbc97deca64b0ae52bb3a36ba6dd13f64f2e115a3b6c91e96406fdbf1df92984904b66f13fe1f8ee049cee577c08d3e9debc1f6245406b32390432a91500f56d48737c71d4a1c44bb50c602089783485908354bf156c989b0f30383b7896f2df420560db4875f55ff9d56053e938228922bdbe3236e72ea2d1d6b87e4c220256392f5d83fd4a94ea89da2d4d28f6a4d8c65ba3d1574d1418a7abeecf5b8f7e759a74249c9a57dd1ac0ec544119f144ad68e75047097070329b44209ef21e0e9cd3ae2da357357a72e65180ed0a9c9f699880db5349c82319a793b43283ec81787466fcd680d6b88379e94791700b483c97caf93b5b219fd6bb230678f2828ba107fa002b502d302d889edc95ee8b90434400cc2b5a5e89a7c34e5d072cfba29f1dd1ccc6ca90a02293696a40bf3b82092f0f80efd27b56bb4039b419beb821cf9e6a3c79a19f9420c5a8c4ca626e3119217e6e18e8f7150c6f9ec8c7c2220aca6146a0467e1ba4b67e6a5c62abf7747ab094a18e2252c14e7a3c4889e781a7f0c94f1424aa4488a4f13ddf5e43d9d25aad0b5765964b32551f730dcbd08105ad85f6e250a4c6d6520df9d57529b6147a260896f2e6ac799c144bd8d8e7de1a26786ae57907a5e7de94e601aa7420961e3d21137f578f9c1826e215dca856ee4bfb47ee2ba7c7ecf1dfbfd4d34b8dcacf007c5fff136a9c6c0c52bc4acf2bd48ab81be57d458436085f7874dff72662ffd7a12275b5edb14cee8be79496116a09db521346eb201fd15735f54c8fb03a545af870ca8366571737016cd69879385a95a700811b9662e560b71eb556075f6c851ad4e5ef09efe76188a6690bc4e906cf385325a195d362d42312247d54c7862b51eb51223f6704efe89f0778447d9bcb79272dad18fe77de3009f2eee3e0247ca944487e9975189b07895cee854537cece69963a7394a4e9d7964b1c7812eb8d885d72d066f5a57482c466a88064b80e239d317bb8d323318eb776a8aa64c432c0a8154b9ed518c7da60e8e2facb96ff83c652fc5603a408284a104a5f9a584a85189077a0bc807103c36c7fbd2abaa970444ad41969a55848352286e42b4ab979cf59b5a2f00cd7391c07c5deaa728d6e62f7b3b4a0febec155f8c7da6628d6dabc0d7bc68177f921a945414a753c7b88f73671da9bb95bd9a5ebfbdc6ea1f4feda15331b1cdd467f0cf7aa6a0828dcb20802343bfa93313380de74339dd100cdf5cc7a1046d457a63f65256f31fd7be49af2a2f1c94a28cb49fbb34f0a8cdf2f9e343ab20d6fc0773fde35b7a7f1ffa7a44414c401254b5da62adda12c08bdd48c924a8bf0e5d6ffb981dd1f82f10ce36208aeea7dbe494ed540576f49357ccc07912ca8cb67a2344e3c8f45eaa0d153f52958eaff8c502ba81c533d8f54f89b2c8bab96ed0397bbdea6ac3a03ad6e3379d095d704efafb2b507f84ee0cf89587bda0536c073d0b71abba57881b40cc7d05154efa2f42bac7544e554c41dbc25a13ee2c61d1172e90d900302e0412ac8af5bfb89913ee763842ccfce4e75d10115f280eda3167a1f1c377d6d21e291587a3f4fbaf99d985fa2884f74013cf2b52fe25d2f34e111f10cfeb17ee97bee7ec337ef00590826ed1ab067fc264e2b2cb5b847064e25e0b917b9dd5ed3884522ce6f548a0ad9b0000305647e3573c597c1feb1c1be6dbe09234753df588dae8dc152fef226901825aa5989447b43185d216f97528745d9542977042bb97e7c3c1e3600f5b7a2d67fdbfd851b604866e0363768b2b8a3eccd32811b3ba19a5de8ff6d469ce01d431c82f6b1ce252ec64c5c8829dd2fa353cc37452ccaf71f45b558c119dba5a22e84ec8d2fdf5c23480ba9218b799e2218d5e1b5763ee4786bbb5cc6b8adca3d40abdbd3bd7a950331600f79cd71c8dbe8eb1805ca9008c61bd771154788c4e0e407759db825dcc93a2f691a8621acef40033568d5eb12745fc30c8394fe1063848802dd4c7ae585c58b678980a12809697a55fe3e58d75b213fdcd43644002fceb9669c11444f74ef8a55369d0299cc2d5da14416519b0be36a15863dcaebe1a233d8b81c18c74efb652c84344feaf964617e3a95e2a87278867a55356872312ebf73ef4dbafae206e433f107127977f6f311f600c47c4eb70808d822250c7a89492b912a0b8cf8154cdd9f1eea0c080f04282b37a12b32ba0f685d84e3f4597c30fb0a18f79f34234ed3955ea1599bd8776e35de1a814fc68b8b10a898b48d0851f66754d0e61b8d1e220dd50ca0882dea0eed2449871c2147f36ee4380c1912c3c40f5a1c2d8c951f54377a01751e1ee2dc8e847ea1ada4fef10c6c5fd7d0879b1f19ad1c83674b488dd350c4eb626db66e40343bd2eaccd2def12a2c16793c2172ae89ca30555d34ea73683f89e6b8e11cb0738b77081aaaefb9b9b2080e7700de29a11edc66f18740cf482db816485b14769c4bc73e7b9a6bcc568084c55d794ee113bdb0f613b0613ba961492daa0b47ad202049184c230a2ff8439418e5dd25887c1577a5024b09ac13a3c88fe7ff47c4ad537ac8df87185ff630df4f56161c7fd4c50bee6437a3bec0a9065dab22693b28f45d4ce76baf98daf9031eb79e7bbb0ec563875d4cc2f886ac388ee5887f6e0a85e6570e94178754548b924e076be52d83091a945476870d436f23a687b80d270908ae14afe7e6211149be07c4cf21809ec96996ecfe473726ad2a2646be4e371ddedbec2cb743a43a3230964fb8d34209c2b75294c7ef279cc5e1cdfd0e189f59f49618634f8ce798d72905bfffbb1ffdd0ae93d2f1affe34ec6da8a4d691eff1bdd0636960f46eb38d5710ff773e098cf0a5c31be100527088881f00c4a51c87847075c97c74815c97bbd41a6dd4039891e8a2f66532957d7eb88eda41c622b74b42703e1652ae120a28ab64c5ec104fe136a322fada09bce61048c4625ecb61b140c70415c6f2d56ef5cbe506a0aae9a5d3e62964b3d15bc522f5924d43f3451ab1c72c804aee00b1e70bfa089d939def7d3d95aff5edead90535bebfe88a9294779882c60841e216e6223abf4250e086e3f1b34a720959e94f6745261b89403042090560aab2c325791c110c1c3abfe45fa0e8822161847041c01dd9908607d918364d36ad7dc8711909f9342ac66089d9009e8275d0e8e89ffcef710447321504b0f54901d86f0151c177b9a747346c9940820a89783caac8cbb0e4bd14620bf3d5173b5f9780b0801cb2332c2428cabac027c8f4b287901b33e288045d47e20c2be90cd72563b096386248a497a5c865c66467830c596a07df10a93bf14860038a61832341d72d98764c7a3fbebfc340f57c128256e6b55399ce8272c1b718fc6380479b4cb15bf1190c142d9922a1b077a9adc59b75867e95ed048bd900c54bc1affd4e9633c9d429cef1da0f0bdb707be21d4c8443973e1467f810a1eb6fe0066be652d8211e0af53cddff5fb61dab65ba948407b5080bc8241ba0785919358c915b172090b93e91bcba377d72370adb89781e1b291faaf6e4064cb5263d3a833ff1dbca61dcafe231fb42d4c88434e5a589e4fcb9779cbe642cff2c3d263affc9e4888beed23bd700a4aa04ce7a39e739e8a2d5e86a02144d585f5f71c5d8aecf9fd46f53cd72e338eaade0eb219fcf9c0154d161297d5409961d5db746429e3bf8b8e0b63a329e0f929712d4a64038de7f275b3e268e4b524353a5314228f40686334b84207e52041629e27b22fe84b25da0f14c7244c2d8b48088da8c800119541291997789f266732884a821cb2a9c8edf1e21ec4ee5769ece9a6f1c2b7ce757d06396985fcad37fe37c2414f9acdcce4593143e5c1b8cff8eeb31ed41335cc8e0b0ac653274b3617e8843da69c6078978e702c773ac8e19647e4e6fa7875745d3465a35615e19af792f965d87d01589d5ce823745443ecf1e55ca00b8b6bbf0acf70e3559a57b150255d86393bda933f08b34033db2b844acf67d54a38187ce3c634883b638db2528a7e3cf46c4f3fadc1638a182b2dad2b55802d33a952b06488cba2cc49b2531f016d8ec60014e346d36a0c50b059106dc81ae724d199e602ba0da95b44d304173e30ea24e02757cfa094ba25a441c2520832ba7697774b593ef17e57cdf3b11fb803de2eec315204ef46d39a6f5880a45a16779afe37e4faf284cb88238ac1172dd69c681983e7a6fa6c107dc6f4a1cc8cd88c66743a5324416fd6accd33fc2cafabfaecb88d3d58c89b76915fadc8199487768cbb4859595d9658b9a05c67743f6c54a175915f65a849870b076d1db0586a94fcaa0d5eed3701b56ba766562415964a36b96920272b7efeae04d6504e5c107cc1cfe5b2f54503e7bb181ca29cdfe68325c7a16ce4a9f3201fd5f3677ac576fbf61c85fbde3dab389b4f1286bade2754ba246f8cf5eb9c21dfc1542dc105608ddc5f5593fb6823cb13132e4639b548e95047a22ed0c2c5ffb0fa735df453453f85cf3dd0060b9c37ec814d00e9bd9e0a69c667b2b6101c3ff7719d0be3e5e63f2380f666a6b1604be23948782c82f787f04a795886ca1ceb620f63ac92774203ae77262574ea85a0f047e803412b7441a852399a6376b4af9c759a87d4490816d92876f3472966ed2f63d8aa850cf9c0f49d245ef410a12ecddd44d6160e99302d3b46bfd8136e82ed6bb2f35d2937c588b4b1ea8c58bd69246a1543a8e59547d2f01b8959498b740dc882d09471c3603eb3b863c85f66b07c73b39dbc20e1c2c3f3ea4db5d60eba99e7ac1bf4c3ee648dc5854427f4f40aab3a42dd19ffc2355bc62e204d08dfe607f767653f61fe7d7ec55fb0f9c4155ddb716f3b8866718ee44101207ba7c7bcf7a7fb34309f209488e6c0d84a32bb04d03a7f90686adcca6adfb8139a7d845cb1a3cad332c21dc3200535b437422d8d20951267f011f3f744f575c4bd6edd2b3e987025c11e427d780a119ec1270148226ae7de749c41a0e84769cb6b81773117c6c7fb98ba4deeaa001d04a05a1041ae795650a0120abb3a27060d41b6c51c3f3e699ca5e9461b22bd4cd9d404781819e4774a4202e7c83572df486b4304e9b9ca6f8ae9125e70b213fe79a3ef6fbf151461571b79add16ed0484f4a2a860643716288dfca4f9b7f31a5ad41e573a271e124df3eaf0471cddde07c5a13e874417502c278ccc63d22e60a0b1d8c4d03c6ae59ca225278567808c8ba324b964e77a5bd01b0b4b329f8a104b18c902e3494c52d186f0b6dcbf26ddbc35083338c895c9c7e38745536e524403269079e7d768f4ce2da59119a98c5a8065d3847ecfcb769c65eef17d6ffbd2c9e4d48f152532cca742b33450b5f46651f2e05037873eb08125e29e4d12cb299f849e8095a352323e3fae036b3d16983232ee85d85c314497ffb4a625a00b2e26b6e22b221c3e5a4d1d45d5225a634d34a15a960031bcecb7e035bab1533fbf755d00b0e298839222641b3e0acd26f52d5c3b70f377542d578faef4f0d36036f56d3c12a8cb398c091bcf81c5ddb9740bf34add0f936ae4cbfb5a87f288034755c56fc63aeed91a7c748c24a95b9b2f74c09f5d37975fa030e19c6985d67f7b91e8f96d861bda38a546597518d3e9912302cd2e8c365a6ef8cc3e226acd057c5855e30ae0829766d590dc6504d19d41ec5c957c873f8de54a3068fdad7063b94d1f0ace17ade48130b0edc438bb9d7a9da0b493193618bd2cb17549d83d4424d8a7f90542588bfca023173543e584048d058f076e091da26df3e166af9145df3fb7a1b2f5389cd09e7e2c750400d23f74dd51b4e3598794881e60def79f6f9cb08ff2f35be2ad48fd609ceb7b2d343db15e9eef0b23b3c63ee29f9a264fb3103573df1a95354b9051993acc08c80e62f835075cc958e8fc1eb8a68afb5508bb07cb6bdc7e0b7736accb51e8b3fed81d84f0383359e38f5dd879d42096ba146b20e35c247c78d59eaa305db89662b55645deeb96b0e9368b3edb85761f667cdec5e413e130de1759acdd3ed695d1cbe02f045968ba37b91e59431f6661a2de217937a2cea617f1c11e2419b572ce40167fb387480457cdc8015556d636f885920223f891c4ced227561885e1b7291ba2ebcd608e7b22a40c942640da3ab41fac9c096d3d624d970d227a4807403a6427dd9a15bee91660be4fb0a29558b0921bfe940c6ba3af383d1567e826a20e4fde099572cf8c79a55a566fda13fdaaddb3b4623384f3dc9a6bccc225d6529c0e2b12eff805613c2b837e11ae1e4a1946811cd70b2bff2e116439ff8bea85ba390dea3352f8ad6fd531aa226d4f903306572f5f0f496bb62c9bde2cb1b4f3e6cab64295be4e44b01394fc552b5d3ff385317a7b8738782e7773f0c4cd3a0993610c2f577b63ce2a992dbed4f14ebb9ac0575641daa60073036b6c7eb4637c4887e2cb3dddf1536898077b107eea79e1cf0dbee5730beca6e1ef97598914411cd0c45eac0f8f595d9e7b8644567e875a4277405c5ecd79b06622bb106aec43d8fc8ac267867598db479a715157816fa00e9b1c636ca42da9339eb42bab4478760e82c514ee40f092194c54c7729ea01840388e4fc384db1c2b1a96592ab9c2a9df76adcd58997dc6b6a2b5bce2d6e2e2f2f6deb4c41081f7aea47702f1759cab870b5f4da39d3cf59c9e76551845b9713a85b070dbf742a6e680ed9184b74d6542d8ae1e3fb3013ebb5c491996de90a063877f8ef34beae835717762122947bafba2dcd69888638404d89d819943e48d45a1101bd08bd833475642d0ccefe2a9dbc5f0be419bf953ed527b4d9cff8820b2bc6f336a614166a28f5efbfb0a00d20d8f1053a2ec2b24a2b85c9a0bd1526731c96033cc968aa32848c0742f603424fc95da4a509ba8b565f56d1383fb5e44569191c0bdc9749c948fd09a8aecc4b155254d3e1180a439124f0bb2a76ec113a2702750b987a66fb290ce387b6dd0bc468e6a263e46a2f6fdc971fa33e50201f035876a59111c0feca9d1f848a2d6e10624fea4e403ea131410e0d8bf3aba6cc8cc603e53fa30dac4b31ab9efbec40b1a234cce7477cfaad188b491885279c541b771615f0d4307fd8a67546ab86d4c8ecc60356414c0b0f19ed624f7dd7bd2785d008349c25186ebded50d45944cca2d666dc5c432ed95db2b3ae2f099e67f679c1f8323ec4d90bbbc1ae7593e4fecfe10db7e9d57445a2f60756a35bbd27b444635b4f00ded169043ef06baf728dc67a1492b0ef58136a137aadd4c6203fbcb584cc6f391ef1ba9bea7388614c331054ca0444899f84ac8e423324c589eaba26bfb6ed63a0d73f279e1cc36003aa8b0686e9c689037d895276f10dfada010209e4be363d4ee7e659dfcc13719d2d95a2ed8ec9f6d7485821217c1a518a9d689393732ce2755459949dc981f6443179f45135b58593b4b71e30dfce7928dda22df267b7367be67ddfccb48a98f51e618dcd9eac7a3d14cd8c2cb81d6eaad8cc42b2c2c75ce35d6a986230ed369719659f92d4531573ced0f495fbf80aed44f6ac6bfcc2b74869fe8b236b52cf05d1810650f4e875ff2b08cb58afe6ab3f586276be1a8e1c68f72277f1374d153c8eb7e7e1e97ef044f334f70129c6ab1d9bf64bf515599a4af2598b814ba48cf97b37154fb519c13b45037dfc5509e46cf78663ffbc9884ab688567191db8d4925daa9b39ef201d2e7714407cea2a0a6fe063c93e8e5a84a487771cc13a25de1f513e8b4334544b5e3aa8ce441aa82c2b75c7b6da52bba4056b65e3de6038afbcbe43519211efefebd2b53aafbca949b43b43030a3dd92250bdddff27b40168b0825341bec009b24bb9a5e7f5fb3b98bbf7c60e52869781c9a90b268477a90c1f682f245d8cff09aa8aa7209129b517572ed29d5d61d0bc474fc418430d098f86838c8401415e516322cc17702ce43f47cb74255db8ccd62f7e3538dbfe0e981cb529aa480b84bf71e2708a7054ff7d9c7afabb12b3e76a5ad067f1b0de31d1c6f5e8705ed25064243401352df977b19cb3784de9110d37dfb9156ece8ec892d4400711045e284811aa536db782d462501bc65539091284f0dd69de26538a846d6e82aeb8f567347de9942ca262ddf5f460dd4f8992f43fee8752e336ff95216f2e9232a6ec295d103876c9fbe8fd15ba16f574aaffa87e72d56afa02d5e32260c8b750335c68da30c8d4ca6f9633aadb617dff0286a2e51e581e3e2e226494c89ef4a7b5115594a3d31714e8906d5d0dd281daebab8157df39c7b30cd9380fc764eb3579a889d230ec8ae6473752ac7fe0e19cbbfee0f7841894db7adfa1369a1c8cdaacdb45a4810e677d781ae647f409cf49b11c8c7f178ed0c7d168a8434b6096d5cccf5050691010e093dee02af6ca962013167f56d415937579eadc25fc920558d890a51cb1e7fae5623e5d889efee7859069677fb9a1f0a5e640b62841d397bd06ed46ce54578f8b079042191a4dd77044947dc279fceb9bbc403917bdb596e9f80e77a832ea3a83638e098e241fc05aaf9a64c74c900d3eac83e09117d9c7baed7ad4f1af2aa004bb3976941b775f7c2d03c0464b3b68a0c75a4f04163f7776a125323c3ae6a81ec37284b91afe711b9af41988e5819282a434ee7a7e2e4947b7298b269397c344aac8565656c236fe62d7637eb34cef5a10f405fcd50ace068f671c039c1f5384156eb8b17fe8f2da899ba3fb39b8e8615dffc30a75ff8a7f748f4202af28a38a301bccea5f6c4d57b374999fe261d462f3713378ec1ca468ec6ee0592424ae489a280fa51f83d264f4b9e511de71b1002b06249dc461418a62bfd99921578378a37256cc2848ffad4920b5b8fbe93a9c4b90d50eb6aebecb4abaf4829a6a35093e8d95539fcbbe3c8b48979477c70d0f879995686d18c81acc1a3634c01768d02f82741c2e1ac32b23c5a59469586a1f4ad072a794d7454a37c3c4322e6966954b7b3612c7e8fbad50196d4928e0f787940fcb47ee92234b4e5a6022197810a1749c245b63673d1230de8b5cd4a253de5469fd1ce8422cfa982c9ca7684d37abc498801488f9561208b6c1ca4b234abc54124d0d4a1b7f9a9ab8fc0d031d036dc7160e5a62abe6b6f091e0433a5983fea47fd5814f2ed8b45dfd325a942c18425e3716be38a7272d2823737d3f9bd88ab2fb73f59510c8916297e2aa3da25435dd24cf24270c3f29007d81739908e232204948133821dbbd9fc52ebe925a12cabad732a90fe173837fab0df159f6c0c5eb2c46db6ff34c56f843aec9a5ca9f3d68577c4cebf4ef85735b5270bbea0fcefe97ec5c9a3623bc278f52f41c255d2b97f93168077b6523c38ae99bfe94b3d2edc9168b4e741ee8bce62bffc6eb667c23888ae9f076d0846ee35418eb58ce3841a328ec725bf4340df4d3c735eab1415477570206fc7ac982b75e83f1719863926ca4b77921e77f4a54d01718d550654545f83e3c5803e6a30f67e28652fc07b566897ac4ff789af19a703755c63f60de953ab5d34ecc5cab9657ce897ca8482d11be5072d605a04cfa73fadce0066152d62c338e7cd04f6d62a1ab859c5b3b610a42a7fa27f0de92b10cc94dbbdaa1960e23a7aefa9d290cd4074df9b1e1b10b990a8e8b4be5435f7801c60df2c54261437d390ac5015fb1dc88a45a393d211c3a265938ab114b50c12b44ac6738fa53055bc8fda920dae15e455b8363c42a0b7eabec3b1abbefbc475eb57c375aa07850214d6e154fea826d51685b4fbdd688875a0d071640c8a963facee6bec8866a089f6c625384e65f48d9294240f21ddcc365237bcba1299a40124694ead7c2f7de68c0ebcc8aa392df66f330ac2658c6e41091c789915f935ab2e1987605ec64af1e38887a1e0bb25943bd57f099233a4b963c7f15389ed8e6fe93a0c340e35420e2bdc0181ee7228780749d25eb96952e8081eedd08b472cd95dd99dd94ce3da35402f7fdff75a8d596c275a0f6f8185877c2733a60e3b2f96db72564624bae4c90e7b0ce08250d544bd58b7cae04af17d1cb7e59f5c8ffdcc457281ceadfe98c63074cdeba5c436e55c51680bf7e450edde41a1a3ba7b655c046da85c1727dd362d9881b24134de9aab1102e86acdd36f8e5086feb8f8ca0f222bcb231a010b2679a16050cce6702fbf5c096df14b6491ca007151b5f5235241753192b36bd9fd5bab5c8ba48e02f2b68b9b23cf28d584390159ea6334aa08acdaf503311bdfd3da309245a6387597c1480590923f70ae6b8db420c0a062e0e31eed37476becc87a64b7acd5d70b2fc0b42f2a3d012446ed1f586c5a654c0fdbaaaa2c5be129c6ce6f7fddf7f904243232a87ac948abd00f2df1afa28b76e1dd755572d2982bbb9cd9cf6593c0afb9e94986a93f067fe301dbbda8574dace5e8f5d1080f32d295a4945d12f8c89394e2f8d717e560fc54fccdd306086f01f8d96dd144cff175f6131a8ec8c76e08212dc9d0264264c401317105fb3e81a50c6817941f6c0191ac62c4c07162959a01cfe89c0edcf2e2b7f2669adb990e1b5e6d43b7af959319d12dd4a9bb45f200e35295e7bb410e28eada54e8a5aa229c143fb83cd6f5336156378312e6db6aa1dd8e21b0bcc6220bd73054ac1b45b59137ef259f0614160ebf5993db2be5814cc716710d49813204a7d78c6370dfc2816f8d50f1e6e8b7d01b27635cf2f0e5996957e2f1038a29618f6ab1f784220694b1dcc017c2f03cdaa5fecca9ccde22f2f7068bd373d3f812ecedb6370b3ed06322f2f09c560f2d455801c00135c8f8259afe365548cd4bf0e5a8d655dabaf90deda8ba460df111dedbe6e32f8cd1cbfb08246aaaea3cf09f9f18a82adf9295c7f47c601624382fff9b371412047f06ccb532c0884b7bfcbfad752bb27016850bdcc66091c8a4d681b84e796a5a9a339e37109311685d2f73f321383e2fe7fd3aa5434b4afb882c9095578f9a7a61a3f76a8be54b6567181634fc1aed9fdbda8d42f762ea2362851cef7eb28202ea0a54484228a877109b6a8da62cae4521a9f3d1a058b7b276ec36059cbc0ab4bb3ff12baad82830354b97d4b082cb3ba71df39281943109f3b95757121ebbd78f841746d71e1e681c8ae3bb0180dadd3f9f909a216c0e159ad600670d08ef7d3289370030635fc723c1710f0dbbff40528c4961f1b07c385bf00c058ba584b2d43d235834ad1a2abfd72db77d2344b33f01c465f5c1f155f29edeb0af85db000e02bb1d9479e34cfe1d8e380d6211a11a8eaee9e7bd77ae7902514e56e58ba852505b0ecd45447023d6a1415dab52d57eba4349e3fcca19d1686d6a483487692733184b96354945df4b73383cd140241e6d2c170de21ac89500feeb80cf556bfa0f7971cb13f9935892206ff31ad18435daa5f3e64df8aaaaed30c4572fa281b99b6ca2c3bdfaa0dffb36e18403c1316215d54b243426287cfe268d6fa22e7cdcec6aadd94449657e1d18f245fd2042c1d10fd1f16d27a9b00250521b569e66c2ac6dcaf5d0988632bd5e203e3f047c2eeacb25423a5aae8fa4ddad06134b126f1eafa2111564e220ce1433c96b75ed99955b6bfa20cb8e4a4b491a48bf72d7ba0fc380dd9c839cbd82bb4d4c4eb9aece98d979eb765f03a13bee3b3b90868e9e64cdbadfe46757719a21b0a8b8123a45825b0c5ea0e09ce7aab2d0ee46d140ab50169701997806934efc494e65d33c0c3a8413dcb4d2dab4f21d5282f38896d2692f66a4c273a14c37131f7235f72b0eab04e25e7223880e980917b89b5cdbbed060c927da241112f95a1255804f62397263594d51869064cca13cab795569fe7d12c96c860ff7e24d02dd0b5278340193d5d9e69e67db8d1acf4d717a5399ddfbb110645d9e01417dc21a903c3eab56d15f75384d7c6d2578e5cc9fe263c5a00bb72d9929eef7e1ba9f494d852b58b740db72450ab79eba58795ec113b0b3a1b7778ea4c1becfd1b37782f8fcb620484d3fd244fdd24a4302dca13164b2aa95692912ab054a29d4c79a1343403498f03e19a0de6972e389a6cde8183296ca45b2f36392678b2a0f276413405e1fe199bc8396adcce57ac87bf154577822f7969f8fa36bf0b9a6b5f8c490b164e0d79243fc2d814a2d31133d727c39d1f49703b8d0afb6c44af50f2ab5d68c04f9c2c0c1a797d2badd558c8af5b51106cd03bd1b41f3a6cc15f4bc80c4761b72bc089e567fe667d9f174a2a0cc98463ca0475263e25948156eae70521f05792603021d62c0398be5ee63b62691a90630b77a3d05d7f6b4ee8d4aa280e76746b877edb493e65f6aa76271487edc366f74b415896c9a13d1b9b05523ebfbcc4c981610603ca0f7a9f0d48362f00482b0918ebda9ecd2e587968e3c2e804d182457ac2d07080ccaff1f4202c4c67551de00d761974e443c658c49a9a3d55014a0348bacc8c01bd52ffdadad37bbfd4288e6972e305cb4d37756cd9b6b9819b5272cc8e82b62668e070f139783c9f0da70737eb25ccec999f1490b6169b44532d5edb330457fd819a7f184830888bb1c7c979f8045bcd4d040c7b5a26e75c2eeca4f57f46a7b829449027eea3324fa9025ac95dced8146dd84550e08725ac58ff29130cd867374265e0cb90bdea8a49020a02f351496439c62e300d3060a253b2b3910504cc5e521aafd6965cc0b1b31a6a215bf334a88b55ca503395d3bc06eced56a43c0891d2e90536af031c1d0a9aa1349fa35c8efaa37b0165d36169acc99202b5b5dab0f658f167f98ab380f50a8097c95b11df42dd113797208cca4e78309197ed8cb2cb3e4c968757a244cdce34329e753581e38b9ad3e2af594b7dffd813ae8e638fc0a88da61938b9ffc704e05cb6609dbcf28f8391a144a9cc163034afcd216264bea2b3de8667515aee083710d16e7e3d1765b41ee4e24035bd38d7369793f1d64ef9a5213f89d1724484c3186375e0a8aa7927d638ac2c05829f6824610db764353fe7c907bd55bc4e474873b2f49a0c7d7f31eddb5a58fcc381cc2265eccfaa4978ae5b26bf9c116c4a822b116b91b71c62f3db478db932169aea2cd67a311ef885979c468e70ac90afd08a14ba80863b428d326aa1894bda86d60748ecc216b6f11d27df0f3f7665c4ecc0a2778f0534993da61b329783e4976f33ed82f51c958c7246a5a0acefb52458df822ab7bd65dacde9b69ceb97f018075b953b21d20722a85f10ded2a88ec59d9d987f57c4be7d5ab4dbada96ae63981262474bc1013b83c447d6942d217d01760a4668f329a17173a1308fc4b33b8c3fc69880d04cbfbcb5293f8bdf41723c3fabaa3ac80257c1e671b54305f3d770bcb842fd65ab33c35bed4b6099c644a9d402fad02103d3b5127d074f0147556970a3f830290628f2ce76d111590720a92da39088d5297545f5554b1e7e14661f999a3b4b5d4a93482f1c4cfb9f7992fb54a20697024d059e7224c494e835ec032c45d0e09817061585738bc666d2b80e5d350aa9c19f12e3746ac78ba84925cef0a7d7f9b8b100c6c99e2085e565419ebe0fa23cbe8f45ec7252c1406a82ed88fac7beda0f484cb817868b3f4bd7fd154f221a6f1da49275dd0e2fe0da88a9cd7c28ac4f79c800c85188d105de0048fdf42ecf65648de27329b4017b0d21f506dc1b3072079b7d58488115caa9dacc9c03346978ea8b130ff3e91191c175eeea5eed83c6573a52fe74bfb98574339ab80c4734179636f3d7cd6f18970bf41b8d891e777cc3d6a748be928ed386f270067701bf50fc4dabc65905ffcf49fda692527181a90bbc9630aa97d867ec04dbb7f6f45199563366d85c4af914f6d70077e6e3972e8c8636163f0b51797eccdf115a0a4b9d166798dd9cded2ddbbae53f5a0e7957ba35cae533540098a66041dd08254e919007a1a5d3cac004419944cfa94b0bc00dc9baf140ae73e5d8a9b2bd6ad70dd1616bdee7252168c62337f5c5f42193bdaf3bd9d397b98e2f49b3437990634f8344d551222d0b64694642ad8bccd754d292d0601c66220c9344ea6171711ce4349820be427b58521c8fdd1ae60843e2eeb97f55919902cafae3a332219e22b5115bcacfdf790eef0707b498fe83bdada328a6eea2dc6eb626a839974c02af2661555c553cea701465b41211ac55c57feb43a0aeb0c7e16363a3b21597d8ce7fa7909f3b13d3cf422959c80ff7e8d3613541087eb9a05ab668bc6cbcbdf6b99d283214b56a2f3c5c43117fd25b19737a4a673d7950893ae11f6a0aa4500a05333b9b68899b835a830f84b558a27940bb5f61efa2b4917b4f8d5e0174f994948d35ec23b0fbee5f3648cafec35160054ff812a94c0a659edcd497382b62422140c9f5e9459ce481649dd40bcc0a70a08d79b7420e9236af2a886a8f8be3230bd9e97529bb5b5f7da4c1c1a516a3b246bb6739b78adef3175b4d6bf02cd356d34a15159c834f023227045227b2fc2d40ef333ce0ff182d9ea7b227d3798ca658e8f42f9272977d7aefa9bc163c1c303341c0598e969d723e4693cf568e23d5d881beebcad49a53657745ca0bbfd8eabe0eb46acf198bd2572e103a4221b42774f6c0457c736998391ec9e52efe143b99c70c931881d62db3e9f4b2e06cce1fb32a8230812caba8654a321f29df60b35bff1786cfc0cec5fbef633702e8ff5b4014633ecd972d8438f43fa037288fe57e6e294cc625b20f946da6df7c6bfc707b633c35cb00e8dd34db71220caf55b35225588583a41237fb539d372977a095af4b92883589aa402b2528285f9d61b87e0c2a838b5ed630115130b38bea72504cd641c69310399d688993a6395b9d8221931139183b4509af1c50dab195f3ab56277efc34fdd8d93145e4a6e2ee7b6067134f5c6d4003f6c25a7da067e1469a090b6aca3d52a588dfdb19e879009cb807704729880d3f97d98ee06635c852dcb330b65eb4efe21e291723f727dbc3d88b0bd00831064741d822a6e9de9d67af25b433b75864cbe863090fa6709527d1446808834577f47190d6db58369b7d674f28d72a7f09816db0764085f5f4203b902363654526260b772c4464759a6223452a657c633210773f1bcaa6183e6ba1e6b772933ca8c55937932cd5035e0b99ac125b029e8bdfb9078712c47548b7e0c680890a48660b5521f2c73636888d32c00bc27b6220e6126577b20084160aba8cfde274ccee8b6734c69f9dce7411d1282676f6304addd4a463b1386740f398b703f670a0d7929efed77607006e585b02591d92ee779d09929a5e19aa7271804ba06d3b904859ccd63c46d8212ab1a5307c92cf22c90d3bee3fe72ef1153206fb3f6006f92488dc287e8085f69298d4cbccb4255b6a6ea259c5d047605a7d9ab20514035b2e85258e9cbae911ee1201462fcf955fdf69c8d6aaa3ffe40c751124d9bc574f3ab902638320a8df39ac80792c72968a63a8d8491314a1a8b26ad623202c71848c9c63fd3a814d585bd2104950cc60a819f203cab8112c606042c8dee288ec6b5b0ec612cf311b1bdb1c3c928859db6046372206e8b708fcc3ed1e711aecaca0b616a5d528bb3b379c725b0954ea5d5b688287547f967e5217a93d971b26cc0c0cd867c30766773b9d5d950efc33a3163ca26b35f13392d7ac78794c44cceff72176901381948ceb9d5644aebaa797dc0d1bc33915cc61d051a6b7d286db8a6c6a09b0e15fc6b0d335022993444535c02dfb0d833c98832c9e1ed421785abcc57a50278dbbe08f16176d7a06dead2ecba8f1a65d0c63cf5588fd791e97f55fdfa359e9f98a321ea087b32b186e48c305cd10588171b40357a5970492c907b4889462d74b88dbab98fb402f80960a08d071853f40f2656f54bf1f0678ca8e170e9223016467865d18ed2d9f3d4501a5810f9e02cd50197d2207957d4478fd117f64f7cd053eee52ffbe349af44cd8f4fd877dbe405f9d8802351cd03aa3b5c84c69e84cf6af49f55bcd617b67814671257dfb8c452f43dc68a12a3513bd6ecd335a9ff4daa9706b94c4b3d973cc198ab9aabf8cc5bd79a180599c2df30749a46aa5a8f3ee1b679f2a81c2bfbf0809e17101c34eb68c61ac3dd652f09f88748a32972b4451c416bdafb71b6d504c86f00bf007b062b165008e8c952d0f13226381d9880629374642465b27495ffddfbccc483845b3e9188fc392a2564650f91c49ad3b188cd5cf919e35a60d42a5010ae8aae635ace6ed8bee758ba800f47c693083a93ceae866a6213e25d525e448317dbd2dbdc68a13eee1ae8cb5b14e8cb04f1e0df0d0085c0036ceb1ebafeed606fa02598fd717541389c0c7076bc5611f1275fbe1e1e674ea1e9b66b246b691c9a2464fc1be7b17a1f6d0e6c6f1e3b525b47459f061336ee5e82c5b90ab1836ab550d5dcf708042249659d924c787cb0fdcc25b9510e2adffe737c3b835ff55d31feb3a3f849e953c55cc294196398ef62f7be63a7f358cd6e8ea194c7329d8c5449e6cd4cd5360dc8196de3dca70f0c4359384551c98a58b39f7d5cd922ea7113b0471842e7a84550ce6a7f12a0cf901f8ab1e311d71c30f1e7a2eff0ce29efd5bbcd447a89b5397dafaf133d1a8e0be1c719c2e874c35b2238f31b2e4d9d3fc5e4e71c7bb69060bfeec170a376111a0280bfd4c616e39f03aed46fb260d0b5e4eed3522069188ed2ff07cb97fe8e88cf59a85677332d9b3b3c651f46c72550ef4bb82e775ff4e2ad9273952adb1ac868c2de9014469b1624c9e29cb94e347a2439651ab635ee71780af7831efe155f17b95573717ee510590d56355a16ec0e705f88d8c4ea4d3174984ff24a9a78d3d094d2646524e8817d0e223f4dd3c6f919047ec728c3b4df5df610c3d2d765a6987b14ca83f5c424deacf91ef4e5d4b80dc9cc4daab9de8b225145eea6baa1fc4c85ab21ec2b698818f4cb03e2689bf98c82d4ee87f47c1c889904221422d678d6a8f2255225e3bd3f3ca04b2ae1d9afdc8dfb075606bb98ad117d866d797c5d00abe213be8892c36fbec6087289602e976d86111b3654ff3ff90d7c6f399b860919a88539eb4ccfe7d2a33f7637f79da259e04c525d11f4b7ff847d1cc2b5b0645685eabf0f891e9dd71823fb8316f190303f96fa8ca8f186466d07c12015149cd9e78c74410cf581c1da63505d5bb13ed6ba5e094b2226252e36510cf8e3ed59160bcc9045f77e1506fccf8166b15ee71c5466cdf14c2be70a5a6a10fad6821e767a57b21bd6dbc6646013c6a712f41572c8e0d5e2139a2d404b3b53d7c3805d2df8082203fbc8dc6689f656060d64d45bf35202fcf92d3a87e20eb2d87b7e80a29bf6ebdfe60de2e9735527a762a3426ba25882fb5f376dd52ea97bddfb2fb4ad4376f395409ba6f0bb62ffbdf45bd8cdedcdf5e79cb5b357ccd4bb58cfdbe2ec798f883c9de72bc45c01f688b203adb2e8ad3545f8ac32f88b1d22fcbc31f89e5d3a98beb329bbdecf79b4d704fbe1e2fb334e37949d063e9fa7c699227f6edb52a2bcd09203c6b7f8ed4a32710efe4414579876c89e24d6c8035b0b92c2b2f96286a144e3cee7f10c23de64d70ad4721e660785cf14b4644dca41d7e11beef3a12bd84046e942b1a34c4659d41a9da18eeea5eea04b821517d3036f8df33d8b60f9b4c5857557afa0c73264b7d25be5f422dd99d683ec8c6ca904368652d1b92588fe0ebe5d806d47efb25be8940bd7b8c16458e952018d9ce17ba71a908c5a3bc9a544b6e104899585f1405917f4b633b2a59d17f40a3384947a75d68907dec98d2494267db60ab9c0460939721381bc6fe968dff8156e48be505aeff7ef1e51a001704fb3fb2b90ce223c701efe5b56879103866042ab4cc7c56dd45c4e89d0c91fe93b80cf170ba9f394f380d717ace1dddc67abcd8f63734905da68f69e82336f6782af1b92098cce94c8509191a8ab99d61d29004090d21e1b9aafa46d5014d134bfe72c7567cb16f70c70974a9020ae2996456204a62950ed39ad3d17f97d649564acd46eb9b4c4e4789b5c7541ade90175db26ca152d9207d2ff4e656f1770d1c68284db7659c525cb7a2624a648ff5293ad41e1c66c122b33d793b6cd25bfb846c42f6de52269952ce052306ab066f1bdff64d8b1a473a6fb6d1026bfb0a460a2cdfd1f2b5b67429f7dd091aa74103cbbb0c3020a1741e801082085096773ad26cc9f9626206c601e9d68c79cbc1079e51c3819d6a8e347bb8fc33066eda3dffacc24dbae79f3470d37dfe99859d3c78fe09433f1df18cc2332278fed9843578fe69359b3078fe69643665f0fc33c974aaf1dc017ec23961879d725b21f3f79ed9b4c1f377d86ce2e0f91b10cf90e0f9bb8b9b583c7fc3e126089ebf87e0a6079ebfe9b09354d96cccb09354eccbdec24f365a697e6bb9fc6d85fb0b3b75f0fccd0337a978fed6819b563c7fdfc04d43cfdf4cb85be07ec24d52d889067f5f750a97bf8bb0138e1925ebb9fc23e4e0260bccdbe4a70037053d7f05b889f6fc2430153b45758917eacbf01a3d17fd53001e6ad2a236f8498b22a29134967d93de3f34b2173c69953e24b2e46f608d9e03cbf421d1332d6a83675a14d1eba611f90f58a697b2535fb3f44290e360165af25558a6efc04efd0abf46ef523664b10f7d96c2922f64999e869d7a715ea39f371c007ee453cbf45176ea6996a8465fa3ef6b547b1c3d3cb053bfb3e45fcbf411d8bebada514d034b7e0696e96bd8a997c0f6c5c0dedca9bf705f385c915d7a281be39f2cd307c04e79c9e0b0feaa223fa445f1d8d181eed2f7006f8c0f6953e07df12d9b1d0b7af1463401ece84017c6bf78a64525bd8cb1bda6d6e4d24fdea495e6e3c672ce0fa7ac6b61a41af8367fc9ba15eb32f06dc93a1586319fc9ba8bf72aac3447c7d2208963c5f09aed937aa55e25ad63d11848ef57b4c69f583dfee7588e15c33a3d936d7a6fd24fee8495a63fe1db7c77f2e496b34bd72d1d0ba4d1a077e9c325ebb52a8615af052fb9647fcad22e8eb4044e1c53ad562d19d52a0e7dd66465fc929dd7b11cf72579b3cf5e332ac1522c6bf7677cf9f79ff91f009fb33300909311d6e46df1b8b1246fb7c5338de5adc5c718cb6ff14b6359331ac3c8b1041b0c83b94bb6e7acb325cbd729f74ecf2ce34b10f7a558d698befc185fde96be24ef04465fe6ee049fb374074bbbb4d2fc264b79e0dbfc294bbf60b5106f0bac168ef51ee64eb4cb943196a0ed7163295af0e458d6c8671acb8f3196b7a35f1a8d3c6c7689ac356f360bc8b182e7230a3e14a25d18c67cf0c5e8580c637e632959f22fb0460fc3be48b27c5f58be5196772e6ce9566eb6046db6142db065ad025bde8e6c495260cbdc1d6de93adcf9d6966f4be7baf327b0a5db70e7b7b0253573e925b27c25b07c23b07cf942c057caf2ee766079c757c8f2a561791764f9d25e3773b391837094928d361cd04f7ca32cef7af413c74670fc466f9c31bc40aa0de6edeb07180461fceab2bffb17fd09cacc397d9c72e6d3ecd94aadd43cb4424fc8600bc1a194524aa9f70945b0b5d87b7fcff2e7a214cf09389b98ba573d2794b2bb4f2f6a2895d25b75c6df0aff560c0d5def87aec7338631e7e5d9e44966b32946cfb040fff36afff859773690e96318863cea84ec4ebb5a6b5dfae0fa5b46b23b2a6a42cfae132a79097e7f5806d82b4c4727e46c36eb1e679592403009dba698408a3995bc577762efbc5dbb10816580cd12f26c72272b22bff3be7a2cc35fe6e3ce6f5aa78ce9466020649ec1b43b4a961f4453944d10aa97de91eba5a25d81908f5aa9ca647564ee27ee38e117f3d9b5ce1e2f6dcf84ead169e7939a58bb938efc2f3ad2aeba7f9390afa8805ac71e99aa76cb0985dc49a84241f38a3fffeca7a0569adfb4d92576503f318d61cca7d1780609211fed7ae759aebc6b1442da7cf3a6f22a8b351f42221ad3fdf912d1e8eb5da208f2e46ee35f5b504277efd69a2e256b0ad17c3a3e55b751e8f4515188fc09ae841506b16368559044ec39e79c258811fbe79c73f6ec5622acba1da389389f7b7cb30484cccf3dbb67fb122102ddb9df5337b1286e9e24fa0f0981f51ec089481f0479f4d3087f36b361dfb6e508b7a98dbdccf6a03736d23b6935be918e363ea87fa394fa0b211f51ae1cb2aebdcc8503961b72c81c868257582c908aaff55780c5a2001ba1c39cc1fcf3ef2b0f83661cb789b0810e123d6e38306577013f3328d1e22325871aa8aea0ccb9c3268928c050d935d3fa0cc82c66d3a823379f654d40af52efb2c6f58397ac1fb8cc28122177b94b9adc1ec95ad11f1181003e5f1bb36a177bd108b82392db816f04dcc562e18356c623c462cf44c42365a2e7ec6e724a9dc7bc3de6b5027a8c06ceb0027ee9fff173ec751eb39e2d2d70a9f75f8e1e13fc159769e00b3b88acd5c4cdedaa771222e6e0aa79598bc9d7ed1a5d45fb40f4412f655b525da64f3425f3673897bc2507ba2533b75233b596f75574a4fe3a12d9a85feca976543bfef0c806b1046b31fb5e44f0a3e08d58de2e910def49cd16ad9df754bbf9a39fbe9b73a415c450e8caf5c8a1bec584c953403fa6538aaab6ca6375db6b9695c7cc2dbb491e0ddcb2b122e8b2b1dce6d2d46b40b0319b846e7f085c60586ee7c13253e196ccc49eaf34bc01f4938f307a10ff36202fad4fcc1515ad1d0b4bba64eda625b9ec98c8b97367372d8fa1b36b732583d6aeadfce431b21be2041c273b2d2941c076e1379bb6e8c8ceed8f3e620a9f2d3b1320b8b363906380ba9c38b39bb668879d09b35b8ba474144a422c41fe67db7788e9d31875e608fedc12323751eaf369328fbe3d9a9d99c6a31749f3f5c3390b3dcbf7d5f298a2f7ab24d459b53c426f2a76fd777516dab6b3d1f3a6525caf968800b49ffd0dda2c8cd1ffacc299b59abd7bcf3be6a5efc1d7f94cd6d7a3b682b131f4e88fce32410f046b6d433abb6dcbbbefe78df2d87de0bbb5d153bcb9252240ecc1bf111b6ff023408cb883c3f8cea5da51ede667adbe17adc0470012e20e0ebb3d76cf4bf3e93fc8bbb2466b30f56466a77deddffcff9ffd3c8349224eb27867e9f72e917aa053affe8e0ee4592b6f69bef7aedae974f4313d90bbe7341014b3c4b2784f2d0f3a5e1b3d3623c52a3015bbf36f18c9b2237773dc2ed52ef6e18ed22af644b2ecc8dd1ebee4fdb42555e5ddb4a509b4c68afbcd1a048e02f841e9376951348b8f79bfef9b94099870aad2f61e469d3ca6280f6f8a52ea795e04e0b5d29ca2cdc37d843df3cba36f094e5a54d7b2561bbcc7598efaf4f22dab8312d0fb3dc8774707721f938235e6fd3cffdeefc7a3eff4310510ce9ba39fdfab0fe6a8ff793cfa965e5fcfeb27be6d7dccbba3015d4a549f6ff59ee6f0be7a95d63fee35c6c9ed831ff57ed395fa7bd4ee58691f9450a3fe1c4b3afb678f34a8ee833e4b6f01507ded49baaec674a5b0873621a3a66be71627c6852e5e80f056142f4f7c466d3bd9c344055b16204042d42e3d5e59de0f4aacb00b3f38566d762138a396b5bac0c4d93110586b54900911030b5058b0041e259498cda8fd613b0149d89f1d7db73fba063e3b1386a2ece8c8534629cea8e5343ea08064e79683f8b3130ad381268ad8b91d0ab3732b215f28bcfc996680a09d4f20e423719694fbdaa5a48acfab54885a6b05adec78eb0cdd12450038e536282afa6fc2c9d825259150339e282d084ae7010818a4108554ac18ca200411748cb0e701085868c0614cb618976906a5d1a080820ade662db0fd0c6bf44fd6c58c1b1294d57d9075f1d4da6824140656f729ac8b17b2b6172716af171958dd0f5917afc2da7ec50d0904776aaf10fa6962f17aa181d53d0bebe21fb0b687e086e4a5a39f2616af1700b0b6cf5917bf81d53989138b97f8a2a8c9da5e8675f13babc3d977a7f64aeaa789c5eb5f24dd9ec9227d0cebe2afd5fd08b3a9b792c0bc386c66fbd90de967e378f423055bb36966cd5bd2d85bedd54f9ea495e68b118a0beb5848f63d0a47d94677e2a47d52af46d433aa9f37b359e69b11fd01d2a6e835b2cd6c37fb310cdbbbb0a11092ed4156b2b1f024b6186deaafcd92efc22ebd27e927bf72265749986439a141efedc39bf5abb3cc4846344bbc0f5ea3b7bd91cde88dfe02a38761f44946466f33b26539cda2591ffccdceeb4efcbf5613c5129ce0822fc97f76174e9094dee8951c4c032725db042cc07cb9b63702a3b3bc9bb39bede937cb77c93adf6cafb31f23d99eb43db3924d88916ca2db5ee9cbdc055f9230bebc257df92fbeacb9f852bc2d909ed9c9c11c697e8b17c16953ef60b69fb6571a1dccf61780d91e0698ed93c06cff02ccf62ec06c8f34da8cde48776d6ff41fb0d6b519dd2cbd466f64f4b697d1a28cc2701c99618ca32d0ef6644ecc067176990b4e1b19e09c997989b2cb5c707ca87844ef32179c2e70b21814e118b9658d16115b63c411af0a5c33c491eaf5ade13a427761573c12f4814f1617247daaae24f193b5064a123e70aa8e5e9c81a058ab97b9de78ddf22f6d0e0a666e49062521c67cf8d088ce831263b8641943830d639e30f866cbf38aa6ad81946b6f9230b8e2d2cb5c6f8cdcb2a6c5c767a5559cf68cfac7aa839f571dac0e82ded75abd5a1dfc2a25ef6dc550ad88c55ad117a53872ffefa345f57b5bf08b52dcfe49b6e8afe0477322a41ecae6b4b2768f81eeb1af36eb9c734e0eca52299db47a9ddf7f55c730e6738751a65ca97fa7a035e7b6ddbd6848644ab5802018e3e67010f43c0b82a047c137c6665f2c4504fd854215d03eeff3fe46d60fb200e83d68bfd924ba8f2213f137e61cc9d6ea43b5327f8a07541431f3d003b3b2d61ab485d66e1ac38e486bade0e7d5aac7b02376999bb4d2b15677ea5f6badb5babb17faf1dcddbf5ae9dcf1e8488933a5c4c9437986e731c07e95c94babb1130e479a3992c4512b1d4bd103415a54f820ad8379aba7152b4a21d26ced4bc7bcf5981160a5f956bc95c3081af556af26dd6eb29f0cb05ee3b0bf73bb8303878e11e66de2c8008df7b229db2282629c155d6454b8b9320b02082d08314341009acdabeed277e6951b049c4b0b9f83502213d5b8e13263a8db74c101eb545deac585073442a14a132cd141e702d286cef5894516d64c1b6b0ed185444dd1d884bfcf2d1cc03645eefc294ae044d614288a0863626627d2254a582993864a9e15eaec1a6b9a915db10a42f9d6483da2b3b9e56c680d9e2b04179b325b4b8864df75aa6ed975aa6eec99524a29dd11f5818fbe5d356ffc443c9a373a54349bc09fcda65226938db7a7bf411b11ece6f764cc3296ddaeecdf9de6cb3e9400015c441de4cd01fef7b20f1903f17bf0fb4f06be77426540319b03b43129beb3ef80ef6c0c636309be0f99fd1efc2c306f1c76b9a29957dc5beee2ceefef6b67b43ad49d20ce2bfbeff94bf61fd79a24973ef8fe579f2d01fcbe84d898a5ac11e38ec046e818baf42550ef0e2b2588b15136b48b8d46ec64de560cc33ff6fe3a32e2ecc32ff90c83e12022806c6447fa461bb15137be23f958ea203fa0efa38fbef42be841f4befabafa82e2f55563692afe3cbb439434853bff06085ac492bf3ac9fb733b993ef6d5066dc4b2af2c30afc02e94c104c21394c5a5262c8bebcc912b2e3168c004c243b9d618a9009c179c84913264072c031033c49e3f2e64408827aa6688020eddfa53e62ac43a228c0c6cf0043182094d9416ba204981035cde65301dc052c1b8d2dcd9e2228304d7973b5c64b6b0787d147263613183588252a028d66a6537b9dd4ff47d9e982b1042c0d1e34c6bd1b9b2ac384bdc92bfe26c85950cc8abb5d6ca4de85595d75cac89b5f2c63b4a5555eb9682c145f4119744e42f67595e58df38410475467c645241fcef1b7edf0ccc0a1b6b3e8de6fd4c367addf3f2fc0efa50369b4473329a2cbe56144d11158820b76430345b75fad1ad4db568369537a8d904fea93ac8acdc92ddb8bbcb6851440408fa146f43e8c579fd6ff08ca25b5f049e1113af80583d1639b9d59b5eb5de60a4fad5eb7c6f4e2fca53547114c191ea8d79ab7d835ee8fb67fda6816015f4420f7a916f09ad30d740c0a3cde0440e579a314002f1c04ed409134506fef049020f58650f5694347ef064002b0a2b01a78a192d2f90d1a3c54fa5b2c1961402e960070a297bb85475a100848c0e390c11f6c91074c64d0e5bb2903c3942c88ed7135da6603df1339be200262880e1f0a6c91e265884a933a7093a4698e8128a810521a0104245037dc8905cdc6cad90652606377d82b08292d0b2c7881df28069594aa3440c94212a40d9e30295e200ac214d5439c205853132c450c44f9f27ea2ce11383a1024644f18705353fd861c2c50961d82c5981c90d6efa7851261a2e2d3a2079c326870288498189227a9ecc691342a17a928416d80d44d89161871de26439b2c5ab4c153f7e644fc0a620a1812659ccb860c400605494a89375a70f9bb0f9828d24b82c31e20f1426498cc0e68a0b8e92392964e983431d3972c05a08631246e6c2651a1be0218a101b9841c915093869028636298cf9f2f5029d5df9363a312c818498346ff8ecfa493ec367c2be2562bddc050487262278b90b4816d6d2710056856bccd685e0721790166e78b90b4892302e038e27809ca00186405fae98d310a1012e5f451ca173552686aa3748803842cd12590b77e60c7142cb98336e5ac0c102e76983f5041461021d29d3cf60e906c806705842cb941bfc0904bc07c856a03a42060b893529b4d0e7cb97049e9d24b6c81ce955cfe31c8923495c8ecc25d1f72292e410244872cbe15871a950428724fd0879820b9218d240d1c5e27217923c342486a460854544181016beeb96af65450488982e3520997343579019822e770de1225231e8f67bece431123fd1139620291e2b279292a80cdc252409903d5108e922a2e4469239f2f3be8fc9f9b8dc57bd4ae66ad211497ae1b0789124091a21495ac35152122e09379bbcea798c4b229392489ccf24dcfcc26942a04949494945f49449eeba89e473eae6cddddbddbdeeee86fa238a47acee24724bd6aa0a72e49f7e83555555555a3b7e6ac97faf76775bf9d1b21222a7034f10b103260a2f7d41a75a5555557565c7b77e4affff0897eb6180e4b9e55f1c8a686922c4090e77c4071c4e2b09932a244c1020845801e140913a5f0f34b0305540debc31403f155112c51c1597bb92d8207363454997d50e6b5a8d9530dd60e4340f3d747be1eabf2195e4d14a755274de4a9c07385ccf36e24b77b7191ac8dc7a4c0da1160fd57814d174f77cbe543e9be987a6534a1784c8df3db9bbbbe77cefe97cefa5babb5baae7eba43c5aa9149ded3dbb3d983de79c73f697b0e76c8846635e91cec7deff68f6cc4f47ade43ffbf0b6f404a02a62734ef7a0ef20d98b70f9fbd2be654fb37c190cffc8dffdfb4866c5a1da057c446f9ccd1bed7056265d41ce707834fe9c8e0269fd4a9dd8abcf102a746173258ed78f2a1cbee6dc71a28892dd7c3267c5fb3f4222fa5834c4c425f2974375c9eb98f0d0e1614a9f3858f45c3a7ae8444125cd125e522b2e77196983a54e66b145f4e76f2f576badcff5abb556ae5cf963f6881ccc89a228fae43becec35176b5d2788019b4131a201152eec59b3220368daac5942cd952d4247d499218733377429a36606ef8bce9cfadd9f5a50dc41f42c75ff1bfe3a7f297fea551004df1b752008be078e0e3ae8e0f7a0bbeb3870f0f39c7a75eaee4e9d524aa93fc8ee742cc53745dee84123829f27734e10228b9d313fc0a0f5853ed5a537b146c5377385c89f231ebfe65f7bff9092fe39ffbf318d11cba19b4312ae1b0785f3a072b886f2bc3a94f7a473e272d3c69c3ee7f4d9c34ccae1a0705050b81c0e9783f28983226f5f449c9b1cbbe99edd465cb813771b47c7293be94876229f9dde91da4974a4660a13a526063e668650034507a5305400e9d16a020b09305ea78a3888ce41057944a951c7f44564b03e55bda193aa75d47d56ea939a4d9ff77ddff7a167a558eb93fa6ad54955d7ca4979c0ce5ed369695999b93e9f49a879e39f63aea976edda5597ebe6ef87ea3ae96c6e6fee6666ce81600e945dee42a22497bb75032cd2116b23149d7f9b2fd698bc88e5ecffddbf4b089cca24f480cad2391710c56a852c68a2bc6961373fe74e7cc4579e383994d10346a78fdcc7dbef308b684ae6fc3def73ba3297c3f346afe68dba1c54ce3f07a5f36a4e87a35fc4a43b198b7be7725c7a005d8f22ca2d735f5d9add9f9cb71ce93347e2feb20897ce769a075497ccf598346f47f336ff8b58f216081310a5949224d78618b93e962249fd84627f1f7e968e3cbce7a134bf47ed12318ce994463046c035fc7ab436ad83ee1b7a7c7dd2f914a82351bd51ccb799729809f154083d12266daab6b0c5425c513dee8f8a58b88890a3c545441c0ea43c108960138ab5092e731191450495bb35a6c73ca2c32f7d1db50a9229e508fd1edd53427e3e724a9de98d1bb389bfc913c492e530603af15cc01ccb98080ee019f3876ed7e8d197be0ebfb57ab57ab5820cc326b5d3ecca33fa2d68a7b191f8259040850a59e982328c7e3a6489e419f49bc17c0980eb3edd27dfe6d85e95315fb8a039d3a68f17223b187e88a850a70c0f35d0b0e367e63041980461dd9210d21282c94dd356b5204cca8809f2c2135949809882042684d7102d51862833c6d1b816856327dcf24a82c63958f3c7cb4a1d3c80bc3010d275e48d9d255d358079586081fdd0431ed0b398f842c3136402c9d08019601872e62b6bcf95d09cf4e79cb5cef7a741469cb53943887350e4239662918ffaf5c7e827beb82eb154baed7dcf3efcd63187cf0c847c74e7d21b3638fd87a6511fb11cba7e54549b77263ef19dfb8258329beb5fffa394becea7f74dc1bebeb4ee9c21ff46e6eea474da2f0668ca6f4975eb0ebfb50609810205daba5402e4a5638ea39834a854ce363439e990b911000000010053150000200c0c868322a150240e7461903d14000d6d8c426856329688435190c428088410630831c6100080318020a2981a321e01136e3f946740d236a4c3301551effc995d03d7c388c4f09e029d21a901e25b03e3ed8593a58ae20d7ad631f7d419298bfb103f74670d96df9296db0c5fbfd9ae2df8715a16d768ffd8f5736f493b9c6951f188b9b27eb899e804106a845b4a1b0595d2f635c494eeb6d80a129c10bf9f9c5967e5348c9e1e8169bc9dc8dab81a86b78059d6c247cf0cd39f232b993ea2401558afdcb829976c5c60a2a06b482558e305d2b12cf09fde9ccce9045355151202dfb1ecdecbe4e6876fe0ad3668fcd3c8d86bc7b4d7cbca27b6271bc58a9e07cc7b39e1efedeee4cbe8e85665ad54e9131c899b1fbe6d1632205829dd2f5bef2d8e769856102e76d3baa2035ac69c15dba95b2b31eb890290a16a4c1f6f53026c64364b0d22aa9e94545df368412f7717cc9d1a38eb38dac9aa241ee5cbbc19a6f411e666a46dee3070d1b99752024c43cd20d12f0df405b3358f41e6c8c33b951306e4ddeb9cf040c18d8b8937f800b3937a2b3270549b6858c2a2f713f2e8866e9049983671eada74fd80493fd3098188a90dd354d3de31b6899e493ac74275a09c2bbe6c1878e20531704362c0d7a3a43cdc9c36186f2e940c10452d67e7bab1bb271d46d8e88533c133e62fff440539a310a4026309a6049ce2eafeaeffe81c94484d133bb925bf7b8387c3d82cb5c093d3db546914be7a3038d56fefec8a576bb2b8321a798f11eb0344d3bf6210418709ebacaf73dbaab2af72848c1a4c1d3bfa55847476f1c99563fbfb21a0a3757f7d41424c6abebbbe942d0669f07726fba98983954fad0c91de0e8d342b9e7a5b2126bacc4822f0af5ca5387ccc34c32f93422019c7a31186dab2616817bb98526003396c2178662cfcb766cee5efca4012333580a4a8e8a1c804874043c1807dae320b8b7fe242cb7bb276a8965b206f13389bc194df2acd052e5078497034eb2e8257b249bb3f9ac11f24a28625b225e4d7a5fa0bc6ac3140c8fac8bfb1b4a8b8b08833b978b7c234112e275618b5bc9e1eb7f87239f0a2e75ce5071af59600fc94a5d56e0e9d2ac6957b061db96da0ae004a0aafe414923e82830b4d40758eb3afd00dbf77e312fd31d35fd305ccaebc6308d4c46ee7a4bd4614f142d1c1c1e2e4f78fabcc1af194fe736f1bc130cd621d955d1b9dc6ae09e3efce321ef34d527e2450166e6822b15654f7542f4fc860b046dc9ab2649ddc70a797cd6d5d1e49eebb5fd972a0193c63238a1c971c5f04496247d6e2e9da361a1a0d85e65f23e24260d9071748f0cad967cf7e5f43e5c1a44665ee45f65d9b621ceccc579460e961be2f10407ab70be952d0987bd4a3968fd04dbb313bd6393be39b9d289642b84a3682c63b04d03ad311deaba08c7604fab3ceb4044b947d035170f645c4f6c6e1846ac284692eda5357b936d2bd7931ab9b5e9067b4181bb1faf150052c631537a8cdeb06efb1da1c3c7d018df2e747d245859c203fb8b23f93967ee104beee58be8cb2f7c2775afc0316fb366e78dbc0a575029153e70f7e77ef8586202e9dc3082a4cf966eb7d73c0e9f7e64eb363dab1b9fb85d7c87e392bedb67e638ebb18e15f66b32397b9a077c8032962853693406926d52524e0277689b3507c7d7085ee0ccbd8f4fec3186fc5d17d10c36a6e464c9fa15e0187dac59526a61d5bb037028948e6d8ef4bccc8806d9e0197c380a6993346fece10e1792006f8ff03a5760ac017d6a93cc110c8004cca909a07a691b1cb149723a766552ff30f447d91dee7dfec1e3e470449d215e6491f77ebbad4e2901e7a20d24354693a43d4a48cb32486588c5494b1f5ff4af7683dc772ffaa30f0d74f2d6ad53deda0e84802b7522d92caafd0c4a5d3202ccd25d580a8a69bfbe36bbc557c94d4138e66e3e171780536dbf94fbb24d5e0f2c5a6c26eed976c2ab50842eaa733d7ec68350f84a343d34c725384be634790b1e93a1737ac001b17f92969733535d5ba0a7f385baa94b5df0dc263fab3f53bff7a164112014f79e86a0f45059fb39edf4cff1402f34e85a77a0832c86c2a726dd00484d2775e3520a0bcb4ac9aa590fe3ef71ad424c9504b739e838bd748bf0340f5526974436a87df59babfc714aaabcfec73d8b0174167bf6a8855b39dc88da86213d92c6b2c74ee8553dbc1a38fc86c58750aa20d129dad79149929311a01b8d95565d32e9449113ef66c25d8c1051bd4e8299c16f55ea0ac9d5d0c64e01ddbdf3969417b0624c11c3629cbe70ef6715bc42cc92f1adae8d9c2322cf9ef079951360884ebead65981c1d675e31e81ff4e85e97c84f21088066f94fe96a1038bfe584f417924f6f31c9a633e9455e750072bd72aabd31a1e6e96b97a30357c4dad45353451630dbbd561df4025adfbb581d432df33bc327e42eb2b05f47ebac25b654edf4917d7b5487698faf7a31ee8fca50e77815ca0792ebfe2db1b5412d87b0d05aa0af506016549e0b52ff1ca0eaf53b92b6bb1092379312b590bca4f464c6cca430a053b4e20cde4785a6a0bfd6eed1178178c03055e2729b491614f38e834ef91df0ebcae516c6c53d07dfb33de6da79eb93d27cfcc32c59428b2060bb01f4bf798d19a684261d8ca027c86f43212be78be06c02628a287d0088fc81e5ad2fb08bf44c81ca5f0505115aacd17c206b564154fe82dc9001abf07ca169b31298f71f14e749ffda172b13b8be806ba1c7667a8c3e22d1edda77ef8458308eac4cdf48d286ae33a6e0fa6e31091217d856dfb487042686a11c72b8a7fe4d27b4681120bd435f611cc1498bd94e89eef875e9e9f01aca86e5d49c62f2af10d8cc184c4c57286a8762eddc052a06ccde495b928875f9bbf2c16fb84815b333bcb902f53314b25b8d29206fd87ae10ed19b74d5c4d8b9c56a3f3ba1ae8382869ef1ab7860a4a4108025acd891ca43dd1a6c0423e3cce378246c284a96a9c6035a0ea0de5d4aa39eacba23088024dc37cda9870e6ddafa10c696a860c0bf214f3daa96fe6bc56796926f08a2c458707e43635f6e11473abc25622c54ef7198d0cd94d983e4b6f442f7234d1af9d6bbb3f31095f13e63d0d4220a3374652da0c320e81b40de717b55da9055d1e75eb4d09e983684cd00506fe65649852687eea258c722bf963aa02e800792d93347051294f89cbbc73c2235076d0f1f6ba268695131af89f4d5a4c9e7884353033890437e8149abc4f9a6523e93490b1176b3e383ebbd74cdcbd067785281bf8b236e8ac5078fe9e9ce9c4293b838e41b1131e22f929040017ea830f15c02249013801c746ade797f5758d59215e44938691ace887a06a6eeab08441ab9ff69366aabfdc722d79fcad94776ed3578035545383c67855bb5a03661db499e1878d6e14db59c719551a991543b6728c8ad1addb069df27d739179aa5c42af820169b63dd66d33df76320f016bcd15763e6069399a095f6294a25fc09dba378324545431c6f5d9f32227431c1c0a39dbd346e9cdd5e4f5cd5b48a955981c00dae0f3e5b0dfbce5b9fd3d331cc11615374aecf9a2685b506fc326be9c8fc7ed336142dd451052cf477ff28b1ed78fd2beb0cf293956613764ef9acdd2e03fc12d9586e92e612b37e273afda4c8388687ed804a2e19638aee3867224b15248f0eeb94e33dd57adb792a5f9d79c0d71a25ec568d42e70580468e7955d4818be50e79193551868b71fe0f32756ca66cdb1a8d18e4932e539f21685f2c1f085b5d6bad17a033789e709e3c934ffda5a1b29614dd9252c640f217818b0087bfeab6d4d2c85ddc471f30eed476d6177706541e6ac1042165d182aa85eb8a43acd1df16e45d711670a70de34ce2f6fa88ed6db2cf5e99853d8f9d3694d599a2a977cb583f30c2d0a250b0eadf57928e625b6186c8434bdd14415d14e4ae85a952c6dfc2fab7518dca310e10b702892cb02b0681a12d33884e589ccea438403ad033dcdf36c5b8b00fb73366d9ed9186e84aa55d23c779bca4c2183620f07818acc88f558428558adc30a448c6d54f2ca138cdfcd2ce273755a7fe49c28eaa44501672423edd691c4b9af9adc997ccebfd51eaa0b26e77c4762afbf59a81ff8344acbcab1814a0dc5041f7c44ef900ee4d4ef628e537c1a47f5bf5aa7395c7c80219356a1debeb9e8c3d2d8de6acc8c809e2017383a5c8809a6e944de4ff9fb0f3c4e22682b4361074da148137be0e8dd0e4db73387c9269cffc4104cec446163477a8d22116d453af080265a060326a28d48e1601e9f95859e43bde1b5ba00c160481b05042d1c13659c2f64c9463fa40c58fd43f520350149c22605d6a47bb870f853022e37b3c31b8f03a09a01d4b0b0faa99bf0d4cb07e2fc49e233ef8c6948af1d4d5023be4e4dcf1955618bf44eaf25581d7ce744ca5bcc16fb829948e316937bfe12babf2c2592369ed9d0af78e45256a6cd2e8239eba16b5314457cdb0452dcbe1de725ad206ad3de004e93ddef0bee85d3c1750b211419546d593358ffa34f2393b069e2b275aa367006426f3d9296a2c1b82c3262dffaa2409434e1fe104f18c70f44be20b86c3dd6751b18d69368551b7d53dd6f49eabee50053a580ea1559d781a8f1bc05e7d11082d5bfbe0cf22c5e654136b16d8924996cb874e6a0c14ead42ad3baffc48be913e0dd2d85c4c8b2d25a45c4a8e9f7cdf8b25f1283945f039173e0f8c68bf2a9115403210fe04c9a05bbdec62f8b2bb1385c778f48cc9980b1f0ad7c46f9782238a9de72fcbec49496f6a6630ee3bc120393c884b7c45485f37bde4e25f23314f1c903570f0945901d9ba194f2271a6f769808e46643441ab765c033a905b45d8ee6d42ab35c741a8dce6c00216d140ee781b5ae2a680892c4510663fbabfdffe3b1dd21e1766cebc19687914a286136ef25d94bef992e108d14f173cacf5f18f31bbfa63681bbb72fa4d26ea03eb8e8939b2cb39f64bbaa4ee6633f1eb369a7476571c8b4a6921d281b50640df9460f62643d4051a0eaffac9a788557e223184fa5867c3eb5a89c45bb670b1b0843120fb4ca46fd338719d883a7aa243903a351328cd1b55cede70c110991c763216634dc4c0da530a5264021fc7a39562f43811f49fa6aa034866868dfcf2d4bf0cd11a701b80d0c0307495d89cb34d03f76b37dc2a5d1f02d61377f1e4502bdcd9e470139971883b3129ec0781cfe1260201dc118d11b6f78eec9c3c5228879f030340a3af04ab2489398fe2f587cc8a509b8dc0824ba42e701269d263b94c138b86f7b8a56282e920dcff490007347aa765a1c038380b0121400c9dd40312fcd7ae1b69e84a2af1b0165f05d39e6d1ff4cb6d97039d7269af8576950c73dcc182f110266846719a84dc2b00129cad3c3f8930750aebc53308238301b76d1aed65701eaeda1af4a1b89521baf64713a637b90ca4b70de9c941b5faa8f99c17120962dc489443693bd77b86bf4a4104562262d2067367e523631d003f0cffd599d7c31e2fa210311ce68f62a3f2c56f766cd7f9a2b816592b98df58046dc7d90fdfbd49411a89ca49ef8f7d780cc1962649cd99c8cf1eca47c7c568e0b258c1f2a2b55df480c6b1502797bcf77095612c02de0bd0770fc23a040c968b3639a77dbe417aa3d127467a413f789897487c2c0eae07b01fba20f4d160c2f5111730a430576857815810899a904ea2b22d9e13e4d5914518cb5c50ca6049b157250fc0ed15d0f9e005bc12185acad37947e3e5377029b4a7436ef004224b58ca5f2b8f08c5f1703af892d20b05900420c9cde6520832cffff88c494b8dcda77dd9e09679fdbaac41faaa48eff7546e25423d15f2c9905cc87fcb3a28f52b768556e63bb9f523a02f7e2ac15acb80b7703ccb1cf02afd8a22715e58b8463ad11fdd6020709d5bcea7ecc970967b65739b23479200b100267d4959a298006b43ff61a0364624b0dc1e6238f563ca7a47286166532a25eab39c34866ce8ca38634d3ae4278fe1a7d1c2584499ca0efc673470a0848962dad2be370971f17b46c7a0ba0c6b0d63d73eecdc2e978849d50f06d305862eb9b093abce7722c0afb4e0a78e80de3d342fe9fe13ecaf3ab15ae3e3c38fcc22b36757b2eec924be3cdf423c71b3c999ca1d6b4c420c1d61681a2bd6e53441ca7ab8f5377fd48829b5c33e188b78297c66535a868401458b639476f1065971e6d06009bbe4b4eb8293be53cdb613b392e71521d37d7aac12cdde5d6dc6b900439576daa92fb965c5097f4c2c9d3043670e5843fc5ff487922ec8b2403bcff3f1105152ae389e2f8fb34ccbceb93ad38e66b7d3e999a86eb7c763e8c0fd78f040fb7fb38e2d27171afcb81d08efd2f3875319c0a85142ec38bf509d20999fbd3b98445bb27ece81cc96dac062c084bda53891f829f21912e6adeb87a18ee72de57a455737b0d152aff7c12998a94d6eef459797b27e1ccd95bb7a971e0691ce4811bf41b16e5710a6b14114068c3828a393858c185ca2e6b20b19443529c03473bc06a4bcaa092dfcff2dc7003d5ee26614c3c18e29ae47821a3b36d6cddc2688fa6a27237061c31002e827f33fafae6b2def8f328fcd4f58e5ffe8c092390a6d6d6b1b5d48376cc0bec792e88ed3a4f785c7ce56f85abd18bcab67de1ff80baf5cf984decc7119de0bcd2988a4d0d592260387d927aa38ca48596c3adddf10471c4acb0f6eeb2b7629987853f51b9d6efb9ec5019d694e3b400fd62f18248e506d0fea440dd38872d532688a8abf85cdae436760e0e0b8a7b042029893ed0ac6a5c539e08f6a85f19153e9bbfabd05a34f532521c3c2ed9197fbff105c688d86f802e5d9164a062b954e49292ee949bcf8d24de923e019d90d293723191bb71ee8a7760d6a2d34039bbd53cd9f5848a01b42142b7f162b2203a2cffa77a93fc92507f523d669ebea9ef257458478218b4bd5f996b39acc8cf30bb50211d179a147c290592d5c90a175c01c7726ec9f944df31d29d65ab4bea0d23708498080a165aa337b5ab90d87da33da0b15a211d7a916ddf80ce477f32e2b8fab9a2683e8a085befa0587b6c4037ee514b47cb97e99011dd82a44f9717d7992dcbc31e8f9a648bc06730f45777965efb50cc5baa5b4ed8580e6fee02a182b21524af8f04c811e85308014f9367f87eb1ac0661a7b12f965dbd16374b2087b1cb8247de0285bf8cf731dba6f46c42befbbb3d07157be79fc0a058b1689fd387023b44d5c720d6e695b12b92df4db62f66e311bc6e19271068098e2649119407c734c6f03e0b6ab82dcac85a8931f861963c0fda2a5b298a0e348a3d58f9ae0a90e22deb394fe2447f124fa99f75d68e9f4cb9a3766f29a27c671746e061b7484b52ccb38f86a0f51d4f2284556f75039a4bcc2176b8269cffd6b8e1fb954d718e9bb186fce8df13a1ca616a5dea8d4a7b7d3eb4e0ac1fe7d79866bb13108328aa480b15bcf26abb23af16746832e381e724658aeb788a7b0673961044ae66b14e8fa3af3f075016d4f661abbdfc586467a8f8e83160ccf119aa085f642fa6ec8c2f4b81454b75c3f5e39e62e0ddd9b21fb2157d4cc629f982d35500d4b564de43a72da2f1c60b620a9eef0756de246ab341501cb3bb6e1ee6eac2c1006ec968fea524530d2cf912098455865ea253d85d1df801ddb0a0b041354bc50c1af6e1f94945d7c150a6419ad421e70d8f20f351d658d0ab8f16eb2aafd49130ac6f20c5d8b6dd253cbf51117cd35a760be76e42c90df2f1eb941fb13c4e749ff5440a3c42ac1ecafcaed609375f006afd6ef80c0ccc4c2f4f1846dda808c7e865f3fbe20990c2c6ace1ed427fcfd3fd001d527f7ada19a46be6a4e8d9a193bb2ea62a42dc76921c2fdcd1aff25d39262aedc49e8e126118b1c35ac19d03ed70e850e784e2ce66d5d14727e9ac6b55bde3400be123145aec6e136ea47e10bde174cd3c8c09483aa5ad92c87543a990a56116a8e434d0213cc17ba53f3a1b3066496a5d453957f609280dea162342853dd9afa7a18e4433cb0b968149cd5b12da89cfadf1fdf7d42471251305301ee57cc1c175cfd167c2a58a5ba331c98163a3ac0cf2b06a013bdb55f3d699404c767491c48cd688a6b38ab690428bf0596328c683d7ee2f08eaae1cbc1f953230d40ee813265dd6685628e66527cc3ff8226bbe8ea02134d9644b054c851507041cd198a390e29eba5d974b0982591b9db7ec30333d9c8b509ddf8bd0579b1736d422c9a5cd5538d595096268c8732329f67ada3a93adc8867bd5916f2ffbf04015c9046ebd126d7660376892818c1f486165c7fde0766f0efb73ac5afb1d6996feb0e2d1fe8d580cef9cd0f54be2f191ee68370e1e8772783f736924d9b8613d529de8a056541b95342119e6ce3bca0fce55362a816d3d146889367790c02f36dd41b1ddc8c89e44059163ad104a927c29d03e9ce549c65611d27261076ef52b18a3ec6b0ba85f142e8a2259736e3c22b7d29ae831caf998239fe0df97dd5ccd0f654b7550775bb3610a4d29c6302a082a8736825a305d95988c8064f03041849a6bc83d0607feae52def9a269cdcc44e2da8aa9838ae0f0ec0b01964b6f47c602f247f08b9e6697528f47efef044bdad99e467f50fec1546ec8c75ccf9b60e1d2338c8a39a1fc6dc466ce6213ce66ef10fb6cd226190120208eaa8fc043c1afbaf74d752e6797317f756d79737075c5b4cd17ba126dc3256d6691f4d28c094c73048330c33720b024a008b8e56f51aa246ad2ef33b114bfa9d734b05e4f47d9756d9fd6c8037a8f620cf59e27497a2ddc101afa42bc8861a09d374c3d710e26566f965d6d69149782beb006b1f293c1540cecc99236cd70ec45c21dcad967aa4056b44a85350651ddc7038dec48acb7739e8f93e976e39689c60378db31c48845b2ee0c287c99a1d183a322b59d58a1306490185e8b2df41d60df4e91b6e72ca4d757aff4f385ab12c7b304ccedd6e7a112705ef9a1ca7ab8c9ee68844d3422c3a12c16ad43b341ef84d9e04b0070633e23b9b3d99e3747b15957fceb4d911a9e283cda9030f063023c68bdd555c5064d6d5485f33b61ba3d905d549b61d8b5100e64d6c572cf9d38891d022d8544008e8c4dcc7c321c862566d540709530ec17ee0f382a0695afbe5c3a3cdc1110c55d91db326e853318810bcc1986c83a270d08a70aaa1370c8a331530ada335a36f2f811fee72bb3fae041aad9135156c3fce683db300c53c2b8265461e67667cb5b319512f019b5e31f3415b5ca46b2c2ed5295148220ebd7d8139b7a12976c88bc372f302e8147048a7172bc61abaa662abe04e37904b42d22f1e4fa92d25f348a453cb315c7047b195316f3fc9d019bdc2152fc06b863ff4c6807d87cc1892df46d84fe812dd445d71bec8a24fc27aceb93600c20bbc668f7ef3c8095611d4718c0fab9900d60521f3752c80eee3f098015a4e0df6f22d5160dc81618dc1d931e281cd4ab10018cdf70c890d1dc13a9329e71e7f1c3067c94d1e6a34f3fe1f0723c7c5c571895dfa844c20cb837cd6d70fbc8d5a994d34757454366ad6a22f72755886676d0d2da30c68939c2a0853c788ad4ee3d428c7412f7394e51aa80b717330e17054f160817e3f4870e09b511e8dea0ce788d59dc3f97806217221f26085a9390a45d539a9e6180c65224743c6ff1c33d1a32dd03cc3ec8a54e808a8226439625ee8583320824a42f93bb8fa1349344d630d3d2a4caa5f62683150a546e5cb5fd0db85041e9899ef5ab44203aa36758e49e346f598651a47b63296a0f95e1f7747c24115163f2074e03f03e4da1212d02a8cb86d4202583cf8a4afb031d1383d27e600c77df44ff210850041edd7a58be45bc944f7e2d88479e2d72b35a9afa6671856e634ab8dbae6d1f4a44579c8220fddecee3369ef576995b76d6d39719053648df8a27f53af0bee7409bb4dd9397559dc7d2e69511d39c0cf34470dbf02f26719762c7111b9e57f3e3280b701bcb436017a7518e720aa598fd1ade7857413f32185bebe41470bc1bc3dc53536c0be2d96a55135ccd1e767b58a38c5d8465272cc0ec22d2557796c8408ada28da3622a822ddef6cc4618aaceb337b11fb659e4cf7c25c6561e881c405af11eca5fb5005f3aacad6fd6a108406380a73f957dfee34e71d859cf254372d8a8af41b0b1601b234a45fc64a65ffa1e9a47a1faf368618ea5adb8728737b2e50228c647abbbfcea3d340d295ad6335f10b60e21dd8d25c18b787d492eda744483bf5f4b7ff4c56dd661afbb9fe02cc0a42009bfb1f5c017b8b098adb9940fd89c3a33f9d27d343412985bd210d4e1fc665069f0e5a23c69f91361ce0bcab756be91b6fe194c1721ec9369ca87420632df11b4a94c20ec2d8067bda545dc2cc46f33c15f9d2b38db7ba09efd3c0440319e7a0153703a9a1ed275b98c5ec6c343c2a7b67ba436e1598cfbd525012d7231c184b0343c0ae112156b9c5c47f822eef847c66aaecf91dcfae37028412b8114a2e9a7ed645b9e8b89b1b0f37c6d6c906d89ecd1901ad218b9902f6b94cc53007d455d3b7b82a0b96a27400b78b79ff4e5588e18fdf2eb08b8515787ae83fa82b29dd655c81bb154bf66d3e32ba678ec98a4689965203776548da309c990417c05e65e0866b8028ef4f12de6c53addbaa90439da5e236bb00a5e337f2aabe9b972204df415028a1720330bbd9ef57395d28305767d2904db41cb3e4c0fdceab47f7924ce020a238308647f601f51ce8183d70ce5ce32efae790a277775914c9963863cbe8da1251fbbd66c80ee46f2c71885a4e308246229b9764816661a1f2c2b18f09bb7010c82a6260def4de2004ea6c405c0ba8c2c074c1d07490e276a5eb66d72dfbc526c2c019552cb4402c07a77a4c6a050441cd892cd82bd91a634b83a3ff7d4499a4c230c654e1c1f7a17b9dee1bfdbb283533a75b44970d0eeff5c13acac91167b85d86eebd35e54e7d253a99620825100fb38b3841aabda70336c654f87cbead6f66274041e9f2656ca7faf0e4264968143c58877b30dfc37de7fa27538e80172fea1b0ecfe2b915cd717e347aec2031738f621755feea81c80b0e8427e775228913baca1de8e484bb8a2d17acac37979ab329f0b8459dc388ad606b8317d3d310e69e3db15b42f53f492e54bf699f02d0caf916d769a30b111242c9e82dbcb9e2c0a579b3dcc02f45d60e1a11c893ba829020130ea1d3410b2d8de64f723b91970e24fdbd3f231b45da9c2b6e542876995e5711dbd1f49f94dbc3054d8f3eae708e354329277f8288fd13c57a86f47e8654dccc2a3f769ec860bb047dd41732b3e986af53fc6c60e6a70f185db2f6188c21c1a972465409507f65acf9f4812c4edc0098ea6b679670b6399b3e6aa3d5c99172650151dc78814d78eb23c713c06568b81416dcefed4a5bce37cc090a0e1acfa04b0ae8e224715c79dc3f453562e84b701920d437dd99d6c9b52fba79fae3a8675542911acbf523e241a42831294b03a587860d98013b627c1780c77c83be18bad284e3fcf3f9c9f19c18c37bf02e1fde6f66f20b653a547450ed03737284f39c6b3e834919af6569e3ed6c575aafafbcebd812c72f0241e35c83a6c5fc6ce5153301ff556a821de49bcefdf1c33b7a282bfe7f644e74f80cfa9335cc5f8b3c882ccff6b6ad324be01143b62ac4e749f2c00cd0b9423e5dd95133d8b955f031fe67050d1f70f563c9ff4c7124d7cbe8accefcafdc38f1f32970ed985e124ad3b9b67a68c9350add2fdbf68d92201aca379d12d3dd797273f9daaec45fea323416d3848375811dfac56b04a7e40fc4584c277e5f9774039876467b8b60943af7808da07fc21d88f44455a39db483020e7040d633ca94a33c81f54c8c0dfe4563a43b87e0d0a9dbf34c00fa42c76ad6fcd395dbf337911c691d5a3decc77af4006ec2f7897115ee7a17ad4729265b60414b75a9c966f8e0b2647e2d8ee916ce7dad603d3863ffbde976454af39a35a69d040075c4d4a5b946f352209730a9975a017c173be1a0b3a8f2c613e8d62292192d1f69938aece47729e2c8a628e706d6bcd41da44843877679d5e7ed49cd0f49144962805c360e720176883efbcf40a00d783d6dba52bc7511fc72202e08838985c5a42a94709b16b67718248fcebb92feccfebcc4d1fb4845f408da1818bd9357e991baf449e33516de72e1029b7ba3cbcbe9c54b4f30fa18ca998c64793f0ca317322a5a1c95b0c655988ae41a93d71b7713ba59989fbd306bd894c828b0c9035c4494a35a28e459f2c0ad15465ab71795a1544d3aa14ba5637e253e60cdc9f35e8c65a827b9635cee3821d3bd5ca5828e0197c47661716d344f0d81856897ad0aa104da512322de3f2b0c238a9324d3862c54e6b01b48a82498cc78735f19ca8c0702f35d4d6a8a9ed4d9f1608272bd78058431248dc59740fca1c1b1d66a483478eeb6c0ec05d5e11960e95070b62ca3ba10238fb4c446cfa26d09807c1fb017b16e7dd7dc31d06c933f19ddadb1db25b17b7ab6ab3f3149efc7dead18cfe152c6d0c838fea6701de619c3ad8a0e20de27e9ef2f3dd718ff2ad90ea3c9c65540341e6308ba9a6907fa796487b70cfa6c6066289b8133c7d6b0a54e78a65c873bef015abdc4da9d23b7993f523670ddfd559052ddf35f92de70382de5f0a0dbe0152a9f806fccffac2cac018a285fede90a4731150ea678fe8986c68b49454d883ffd50510b13b0100a49d43b5f476256466eb2e99213b46e2378ed99637119787c98c4d8e454fd5a2b1bb3f3cc5cbd281db0f98aa5436549b8b4d452c45e1018f06a7b7870ab86b9cde8c2019be51162b118850df95380fced6ff92c9d9d60893254416a84ab96e1dd7e053f655bf883a3ce41ba5f8d116902961729e8dae063afba1ece1a63c4493cd4745964234fb21609ed538fb61726e64cc0ca3706e7cb57c9929022a0843396996367e24f20d20954ebf304f1d76e7c37f7df7334de7573272f975e4e95a089bd7ea5a4882c4f1222cb7f28168da73982a28ab4ec4d068ba8880292a8a6a378340e1097b009f0aae46cab7d9329e4455d8023fbe2e18a73cf527242a09a1314d180c8616b2473958b991d486dcfbb9733d66c2d5f1da40722b7870ccdc10a16004f934d290569920b8d1e37142797cff330e03ae48147c822b67b0e05909a14567fdfe46979d25cdb7b3b8b3a13b013b21d96d988fe4edf1432d4c262d63b27dece90eb4fda0fafdf53db97c0b18d54b18384be41afd49a23efd1862aad9a913dd273ff7a92ca2302e85fa6e7ac2a1ed4cdffa7e2b04c26ac788d1fee72cae0b8a46ab3239ffad16d55f11440e30532f5ec39758fb86d17ae65aeacb32068f27c9a03b2978f57350881e2e5deec10f6a82eaf18aa961dd55aeba275014594936e359049973930d000b0f98ad44781102464c9c9706dc3692992d42b4720d4ef9471937fd5d0422531b342164299516d984b9351533f2cbaa22c186df85a6d025fd0b77bdfddcf9d7d52e38bbe360d3d116d22a1e2abf45f95a9ffc36e5b33d2e904c251b5e616360c42d97a39731f9034c40c8dbe9a04a164866dbacf6c7962ef91ae7eb0ad2e080f25d329cc2867076a2bcd5b47b7b5d751106931c9f53acc607a491de7a057b41ed307a28e793a6087ef4516cc3fcf427a275e044f1d82b794a1bca99b9ee005c9f7f000fc718521dbd131bd9310fb659cda6dfd5f50e0840f3c8b03be4a24969e537c9cd32e697de4de1b0de9e3ecbfdb207ec7f878a0b72f303cbc801d147ed81357108e1a27480ba3e2cee663ee46f1b77403a71203ab515d1798ee30095b2267bb332a708f5a231b55916f1d06a9af448ca1ac240cbdd467eb6a4fce5da007b37e9b00920a51505e986ceb45c3574fb6790429cfe0d8d294e7ccf02e557a0e6aae72afe3f781495f46261b85b16e8b075444807e2b8e26ac31185c61a0cf9d19cb3fbf8a936b875983332145af9bcabd5c1d0ea18c481654301f55a3092dff8217f55edb6b383748b0dc4aea6a245df51adaa59830036bcd7eee4b9f35b68dc0f9d2a1383d8495079d898007cd9782f5148177f6fd940a505ef50a3223ac5e920aa2b9ab20ff2249c69669c32eb6128856e577081204f740f725472d4e08d3671a243003683c07293b5efa59c94e6ef62cb2e261b444bfe31f9c7c4849d610ab1a8042c5220d6a5c53876c003d349f11eccdf9eabec1806164169ce519652e77e81b4024b952babd63676333e8cda6526bb98fb4862690a98249651341de2459523e9e480c3ff1a8780598bc4016679001b9069aecd12407ad033242cf85ba05a28058d0cc804e46bc0fc36f1b1ade00ce53183c808aaa98505aa766d98977a24c401ee452836b194c44f79c4ad9b9832e304c8f0ea6dc62e512ea3f96d9667262e4a8163c9a94a4be0dc806de5c1327d1bac8857dde2eb93f6e73b8a974877c01a0eb0e8a2116cc986f4df63c83386eb68c84e19cab55ac10f25f7122acbc8cf343ee191161cc563f5a780f67ba272ffa45f78e36a56a9ab030a1ed4369cc8e7f244b7c8a46500f861e194ddf3f5af30d8681994a40804596dc677d9dff50676ab8e712e9e3fe45ea1de627f130e60efca429229971bcf7b07211bf33c41fe86f1ff0a5574494b85bc08bcb8247e88db881ee83e09b8231494c3f5ff9017e506f88a0840fb2eb1d987a07eb0222ad75129823bbddcbaff7455739236cf00ad50adb7d0577876cdf3a21bf5cf47035f363c633947deabd3ce29f9b533cbb6202c567cef79fe1b4c16153ff01a3be51ea27663d166cb9d17e8d71c8655228b9eece14b291766bd2a472ea17e8d9afb5a1dd71649d1af87a95e7a668e4c646fb9bb3e73ac521dc81d58107543fe8134cb2e1de1d3d0d9c56192e29e8c7ad8a0d46cb0f3fdb662ec5d701c449edee4c95a84827349d704fc1c3efea0205d090122a7bb51dfe64854a69994f6a9ae2e4f8359fd0c2992676d585f314a9b84faa9a06acc2487862730022b4c4858d46ef6e61471be858a7dd64871a6ee5ef1d53b9784438a2724cf464fa7065cdac7990180755c83577e94e452b91e858322f9dcc893052a3f805cf6f403f0e46d8f8cbe2dc2927970711df54de6623c1a3329ca4a9c6053116cf00c7e2d0d865f2bea9e941eaf2caad551846b47e9abdde7099e623f51a5ab21bc014e19a8936b56dda4988c32e37cb10aec8ebca52d33eecbe55db2aaab9df6fd14fa35afc368db8f493927d9b5cdd4a6a84881e4469a53aebe5f976f94dcc9f70e1226e6e933e89d007638a82ea17be45d9832e24f6a3288e59513bddf5b2c76c86822b05a9c8336f7ffa51f1fa5fd11ea675a083af38139e506cb4ccb257d862b0ffa0c85bd08ab23a80ff0c31cf8ebbd6d251e95ff991ce3913c7a300d6a690c4a02505a4f81bcff03e69b72f1e78b300a19ce7da56ea1d112aca8df3607508833141854dd17b98427c7495e491c821204e3cef2bfac2f6eae6faa61561e115c385a43a017f6644ee0bd37efe1aa667b7526d03f20df6e875a4468036ab5eaaf196d06dcf994c627f5d573f2d5670eea2b3462295686b6c9b9301bc38aeeabb5f2148de8fce0964c90957ce16783b5ba3445046bdfc55b43f00d336ce807af211b0f08320d1b9a0bf1aec4f738f852956cebf53d8036c0fbed9847050d06e1fd360a7f2c5639f20935f26aa72412213907459e4a6bba0511b33f3f3686b92fb63cdc7193ae319ce77d2feae5220dd6fcbb47481328ff0d518dc66001a77fb26f2fae466f3b6784ff0b7b26c271a8184aae45e28fc031b90556d4ec72dc345229a2e972dec4f61e4f368dfc8bb8eee1b27092b488b271284b9416712b80ccc519fe6f599d81e0e4f1e4199ac880018a25f5dfaaf8c3a9060cdc1d30e469eda13f60e87367ede5adfdeb9dbbfb4aef14497e0a61b52e23ce06bddf12435b692017d60a578e24d0e423201549136a54f9efe4a999ffc848f3185aed76be8d2588439e47aaa84017ddaffd465a9a4ce34fe5c4910386b05844e4043c3d018d43577a0fc52c9410356da0df216c529d4e04e986265b317b625b059c21b999c6879840cc799aa1b038cd9044e3f51c30c2d98bfae8a890c2b039a695afd0b9e49e529947cd5cd5ab279958569c2116f261b02b0f8804477647b7d633b4a30e523689ae7d7a49130d6145f407e600373ee0ecbb9770c00ced268e746ab90487e4a4c54467eda9ae230531efc7ff4379ac1ff522a02c4c5dc0c8ab3fe23e27f9101e60944855d28bd3e0fa10da087de22414799c50d31108222034b276d8464408bec5682c70da995e6f595ed7f4cd412aab92339698b7c6c24a1f6d80bdc19363f643d106d5790990cbb1f487c61c59016113db15d5f7b02e5417896f743800982124644d8d18d6614cf44ab581c84628c3741c3819b6c6023fe15168f68685110c6beb59e8d243d66b12cac715a493ae300395e766b819fcb7ca27115ab82ad1e93a76c02a59124666200eb1a1672dc5b092c3f39b7a04f1d9cbd0a2ee2b466b0dd7510679f0e46721dfc11d268863cd50b7062c963564de92f460f5aa41ca3b32fdb8bb6af5027b7297b898ee315ba5634ba84630164a416be3250887e41faece44da8b8d19033fcf27e1eea20353d4aaa6540a32b227903f603a04666ec74b0efff437e1b37ceb7e98339151fbdf5d29d77f2569bae077f03c3b5087b88ab7b58de9d1760aa25f358451b70f67dea0c51071fcf07a45218fc1ef4ae064d68850e995fb987fe57b6372f6584a5e79137ff67e9d24e4d6d9b9b9ebffe8ffd3420e83024442ae2f7fa8d1f916c515d69b0060697e6bc5095513c51500e45320f6b5a38e87e0c358d4908c2c98a03118c9b2c0dc0516826424ad7d00d1e64c09a8f2bade4210d56accae91364a7e684619a1f54c749f77d59c2808d115552f0f923fdde3a04422c7acce81b4c3d6d2a3ff846b19430376c902e9474a0d2ac798dd589a6e4817f958f1a96bb32c2c8cd6a5eba256c5956730110c2ac93cec14a7a64e043560ee806eca870d7c7b6d89581a1e79e07ef7f93ac4cb2b49217ab9a2976451de3a7da8ed5cd7e05c1351719dbd11c23c741437b480f81a61eb73c96ddb861a6506f116518bd3b0b08c3696ee90a64a64e08d1f807af42e9570962e4d3087261c1ca3cf7624d83ea7439011eb5013902bd3d44e627bd8e50eaf29eb5f7f130d708b514fffb363e9f1a49c8c7990d47b528e199c9bc079d6bf980eede646ba9743f70966727f217589c0fe46673a482f49915d856ac8651df4e388ce537b144f98004fccc76eaaf7554e9b228916c99f41877491959eec2773b3917c58d90d64fa905afba1bb5f40222fb65180601030d98590ce8e9a30fe77d681624a65b92b88745bcba1f46dc0ed54868a9361e70064869fdabe6a69aae743bb0ef02ccac2b36c20039ec87cf2470fc42899fa4c8eaa1c44caee41b77e5cc1b105bed85d499ce742f719edc54bb712999eda4704a034f5c93912ba62d7fb9ce48474e6bfdaa90c4d3726f31901d3bb29b9511903f176a79ca87f393ffbb8f7b6b993941017f39316e63ca250120bd2dec072fbb0ddd66d1299255643299e67a44cbe5ee78895ff328233ceaa6b97f15323be89ee7ce9b1af8c1f510d3db08ec0d9003b19fa455246d4aa0a6248584e19e5eb3f36b193ea739def1d4b3df559c00fa2618c6978cff43771e8cf141becef7f8f12f2b745e1308ae1eed80d0b9abfe901bda31a22c90fc0f71402c22f8874e57fdc80326c3f4f487d819609fd48aa7d3be1fb6a6dbc61af799906ef61b2534573ec12a860d8efc381cd2c12fcc56d20e6300797ca4d9fd373634e1c8a0d4eba006250f23208f57e4eaa1dfc9e2891ba5e2909ab78b2dda2f4d4297a1c8cfe21e35848330bf4930682336fd07bb812fa1f942a28fb830d58c1fc6719d038417b8829bbff04dcc6413bb0973ec2a9ffce14f26be6259246846cb1c6b323aa56352231a387823522a498ed6f4ee02a1fc38c15a16edee70bf575688b8e173aa63ec5f526e20c7ab7c60fd53ceed2bf16829b886bf329a823188ca63d7c50d16ab697c7ead9ec0aaf39227561ba3581060e9b21dda8a109d10f13af8e27178757d146c905f117556128a278324031b1d2fcdfacd4f774f0b869aaf27095dac4ad0c235433c93efc4a6a04a679b21c8590cb3aef6993a5243072387dee1b2fcd6a335cec47c563d372e65b1e10a1c78f68f5d1c164009f466c2f630af5f3520b930d4ed43a18b6fefb1c25c8c7f842aa406204ba72056b8135f88a58ecec2708a03eeadf1545f98e14f6406eee8f145a35569cee5c019191d854925a2b4980b6cbb251ca878266ba14850f7bcb47274883de7690f2b6bf14a809aeadfa8874cc1088984fdc26c6f43b291705f8f1b533a6d984d623e2fdb33d11038e3a347a7e5764e0ceba32586f4cad634359216f96bc4d6161617b3c6487783b41ae028d92a365e16b1d14926478d939e76d810f93fb305e7a34eb309189bc88ab699def5def70406db6980865131cb79546ef9159f9986ca411e635d4c21129a18adf249d25364519d322f2357904aeb5303720a0591e0996898efc937a32c0138d323a478599f6ea274fc1077f108104f4776da5132cd2f8e8926bfc32ff0904ae18480b44e3e39af3760b5c94c36dda70502e2dbc95746b799deb772d04acdeb035f8b5de8205530dda81e38c683e577b313595538dcdf395cc1a54c6f3a635e9e4cf692b589f8ca88efb9e2bd0d6d9f4c8be300174ea0a24b6f12fc4280c6035cdf4032132637f8d722e0c80cab4514f53ad82af2bf544b76bfe9b699aa72bc85a1cc6bba762f0bf8aa35a5890c8ae454a10a9eb60ebdf7bb1d8a40339b13bae43974c649346c1830d5118a739b8b873da352cdf6f8f9f188ccbff257940e6cf551728ada3b9ece52d45cd2398e9e260682fa4a46f1973c6804ae164343523ff1965a75cc9e853f65f349a5918cdb5b6ecbdfa5e5e0f741db8ec662d07698b5e5e4181cb082d58abfd1030cf65d8409789d3f2c5e09c7459c08d49acac6233e5d504f6481f812d68629e3b18f954eb09ec14e6f14ca8219eddda9f42c8ac2b2bf82688e5dfd04364d1b3fd9edc330acd7adfd1c95a9dcf014761ca67f2a964a07cd22041a6c9b43a0232a947a0c18ec8923d06735138a59e458dad64188060b9f453f2efa92ef4536658659e48648666d5fdf897febd23df088b668224276ce1c79bdc180a56821f90e31b8ba552c0fc46dfc4eb8b1248b57dc7cc7647c8c43b727bf975a4ce4097f1850f74779d06b5fdd3460bedd66ea4f6bc23b455182daed3bc331b3d26b2f35b53722fe12bab8d1968d78961d4186f3ef839140a82d4beab99e1afbeb9c9811d26ef6b449da8e256edfc3a43d9758ad9131a8ac3d080d8e5cce57e8aaed4add435943f3267f947a9bbfcebd8b7fc2545e0a407e2bfc4091b9b60455f45c4d8e5ae80df8501e9351e97e6c5119563e8d7c759c1637b26a1557017d31bea118184244737d1ff259893c9a45e431ccf2a1a9fe3a9a745f260d09186f231b14de823733f9c7a5be9e6003c0d711adce9858c72e757e4a9e454b46bd6d70fa7f2b1080d7e6fe6ad6063f75d9be0e75dd86d60bb208eb2ce8d0748274e16463a21428f86aedcf4f3426a6e5605b91894cb154a963ea977bd5cde8c3ad07203d4acd77f0426962cfc05f03d3266441e464367df446586ff26f1871d040a426ab98a5e6a6195895617b74f59bb3f61b5e0aa7cab5ee3f7e73200e0611a41f6085eebb9392b05a0402bbaaae5021643390f965d05b6b7b3059cce0215569d95385ab3107be5192f0a1ae1723053213df655873b3cec7b24d23f8a7475b747e1f0424dda266ec94a45d9d6f58c62d04564d09b435412c041c999b52cca88fe04a7c90116cd0d5ac20c39e49210278d9443d12fae03e3ee43a8c8bdcaa975eaa894fed6957b2429e0f59dcb28861508f904f73dd4268b86556d6501ad75f24e17b4829bb6ae99f3a0c6f158cbde3eff64372d26c3c136f8676ea16673b24a2c4b75a9da1a48513617e19d8ee4a8d9609e5a413248b1226909c93b168dc205eab3715e772c5d3bcf9dfc58d743140816a1f87055415df7686bda0ca720d4462d9feda6a5dbd87289526d72d3d20a1b625019e74f0da22d45e3af384b04c22d92be07ffc56d246bf4c675ff66562a525e2db1587ded807d964a11b4e7fb7c02f2aaf1de11ab5a804681de2daca8a9de9834a370a340b261ad66ae5d90f056c4f2c69ec77729a664f52c5b642ea600a12dbd4f0088182493b598d3a29625773f6d1faa2e397d95830c5087d4cbc824443bf4991c1c88050f88ce96f9b4b42be73ba82d3549b9eaab5f921d390ab011da33accc624cdcbaed3ab1f48d76efd5d41ccb590b217db748f582554315431bd18dcef5cc5abe75f52125606291554b68bc17626912b5f122b95a84a2cd84616144b8ea309b7981f137a9b200f5ce7fac796b39c14330e2b421b021908827c5da6abb9dcb1c30b34102013faf06d650e345521f07103855e396490063c0d183a663f02b33461b4f308f74b46667022790b21656d2cca1ad786174cbd74367f10d9afbfa68a9460d8b05eddb5a2d72f09f078855b15c8808c675bae20a7c79c9ca84af58052a9ed61106165c7b53b0cc668c91e483400bdc190c497e421efcc407cdab3e009b5c43b39f0496bda435549d2274c87938950f24447266a7125525e1aed2c49b2cc91b82df7e27d17c42acb4a8a6983fc88f58d46b7d9469ea32b445894f8e521fdb27461c7852ea353f9df4210065dd35e2d9c75a85f2e5111fc3e0278711d6141fa1e21ac0ecd1c1675a8810d0e4d6247b9f188672863e6e790f18d23f0484f63989724366fd06fcec43873502181935e4cdab08b64609cea3a2b2331a070c7c1ab6d74caf676358beb4edb96744ee336ad1283d92d1877a9b86587bec80d582dd49040b8d97c388f1d2f88b973f44d3c2492ac786146d45d3277f48ce9b225240215dc04aa63dda3d6fa380be35dae9623ee3f04360b252dca1158084de417f80662f35d36aa17e4aeb14fcea1287c97de48621979abc751eaaae7c5c85c87b8b8e162de1b32c2bb1b8ceb3013b6cf582a0c78f138708ac02f82ba5b86254a804d62e15def2ad6ca1a7b4e27e1cbaeae4ff4c0ceccdf1525ebab522761d63f73065a2b53a352291b2712f53a085a6a69ff8160598abebd0d3dcbbee356fb9c72304a5fc403b1d0866df1ac25f10a781b3f5655784f5dcac48b098f314c6eb5560a7f91ba7d88626a262c3a92e9efb3c5350b97017cf251472eda927c9e2a208578d0da0fcd369b39f6222f643323f863003198dfbb48e7ea9f57c8c9105e3df1a00924f2464e48abbc92ef8dc6e193fe1f76401fa299d85ece1bc623de68cd575adb3d81ef4fc8c897aa277c9c8113dd49df3b89c71c04b5d052033cfb58c933b4a3b1db7a102b1e61003b1c9333a22981013cf36563c8a01740bbcc3337cb3d557f56a21522459034a6e867c5d3014565107f5993a3d7ddcf6e3218e3f4d2808accdfcd8523e45aa92b329bbf97eb808f7d7d8cfe55cac888033dc770106db6d6838144cfc33784185bfdee2b544a210ea5856d0a9ca261095cb90fa64a0a6ae0421bb84bbed2d534a32d2079d078907b41b7b161e27f62c3c3f0b2cbc8dcd9179163e07c7c77e08ad66ec5b1f699b1115c66661ec15c646e22eff19346237469dbb8a704dfb30657640cc977fd94e53e1b28097c7796b78c57214cb50421b2338e278992f411b632b7c3206e7c6c73e667358f6c64f9acc97e40d8be34b568acc8863fc7036b6c28fbd8d4f616c85b6b5e3c6cb3c8fd8dbf81b2ff3aab11543d812c0a98c00eb0661ddf04fb64533e4966890f4d46c2e312fea8d8f3d8e8ff9d263461b13edc6c7c6d6e97de0185b275b030e8e8f79034c5a8ccd1942fb498b7d3973382c0e7c04da92f027edc63b2ee7442e9b410377fd6323df18a7bb4e238d07c038e3e6c6dbf46c64264a8155a3921adf2705d49d9d9d1dda0dcb3877eda4549efd55e3cb8a53b1e209c78da71959d3c5af14d9084e17ffcc88c34e77a13e66c17bc3523bb60ffd03cbf893c698b16f7dd433c6fe7197ff6b6cdcd83646ff1aa33f2c77fd65c69dd71827ed354e5acc3869342eef9046f0ce1827edb35dabd10127fd634b2a7f39b970972128b40bceb9d908b056168bf581cdc3bcf355567da64e9fa8648ba8d6f26f9883f4b5d676f9c3909599197cb6ac5593b53a10c249806a63320d0d0d3903bfffa7cce4dddd3668ba344e1a6b4eff3cbf254d8f520eb43fe6cb69dcbd9da64d2d1bd14c63f9ea55a7b0e47dea513f7b86e5576a8b651967932bb6e423b7499555196793295b72ed565bf24e8a9d4da26cc9b6db606871208bfc7974bb64c58ab034f521247180fc8052bdff2c08e2c08a706c60e4b670a71435d8b9a18b383714e1f44c0dec8029e31f84751f305f2e03223a2d87aaf33aa4ff5ea7f4e0e7e0d7f99ef43ae097beff7bd2f300bff43d0f12cef7e0f3f86ce5675a0907640a5de6d551e52f61b118625cb64abeffe120c8c2fd6832a87a3606e6060e60bc4928a0548852214a29a544454b6813244c6168eab16dcf490a81ad4914ccfa2227e7a7f24ff5be9c5fe4d838514f8ffa7e8f06bee1b59933f1fdef94fd07dacc973f6af4e12ed75dd9f5098312e6240695eeacbcd637cb41fe2d48d41f73e74dcfe32576803c9e734ed1042e82f83667147402035610f81cd4320eda0df193a3db4c2b8124128934bf1f409a1c5940f587548444e28f3d8c1144a5f468c781ea7de94bdebde0beff709f8b102ae9bd2fbd34d9b15dfdfe7b1e2291ec64cad33dd46cd27168dc45fa5c824a5058f34ba537fda48125d3f308df14da79bba43fd96a69c4264d26d1863a263b69a02d19c975520eda6410d56fc94f7c67a39f490d3a413d4a29a594524a29a5f463044129a57169e9d2672e7a666868bee8f3a8baf3e450cc17fd6c2c5799ee947020667ee6259ef4c74553d01c9aec8a8a8a9aa350283a0a4507a56758d7326ec24dfc889baec85654a4d3cd59cca55c041de9703a5d8fae77743a1e9a2f286a1819dadd42ca3022256168abbb602c772f954aa5151d2aafe6f7f2f27283caa3ca0d59a422c34a2593c9f49594841606e3ea2c58106e04117d54708d222aec639b821acb75ba1f6e229542cef560800f197498889e73fe63befc439355b9e5d439e001a5f7ff3167a5f707d232531b71f1c365cca3ab256c51c7bb45ed1f0e983276c224f147ca8adadfcff56f595299c85d8ef8f78f3f8b556b8e65ab350fc2d9f077c2c9ad33e1889a9cee124d6fd34332385426c2b9d46ae93f9b9f5ab2976c6d72c81b576a9c151b17f2cee802c15afdc4a22dd4423df31500fcd20906d4b53dd4bee19b9ebff465e34a263b4f37d35d2590348e2e970d1b29340ee72effd816b5641ce37ae6b337ef2ef265f557ac6ad5064dfcc6f5c99327ce64f42028b5742007927193264be6cb59bb2741545a83274fe60cc5bb262ae9bf1c43e919b1c92753cc971ba9946140041108f4435408d7a43fac875a52212a447158541c03cd173f10e3707326733dbcfe5cd4363e32f213e3beec1ec67d3971a52f9ba7645cee968f9ac1652edcd0593487ca6ab2a50a35968bb95d56b1ac77759b6df97279c97cc950a07a34d6a4f2c3b8c81fd08e567001480885b0199b53853923139f41213edee0f468d26d58ee7277f7905b36dde53c32cc19ea48c89cc1ae3fef7ca96d8ce4c60ff533996cac05f52bd91204415b49b664b98ce00889cad73f5bc2163e6f6a50513dbb12593788bb1b4c3db081891206788082e290a0001138e839c31430e281d24411a0b8e17004d0f77d4e934bd2c30f92a46ca0c3103126484b90b881e87623e265f1658104053f12e67dc3fa4b583f6debcd72fe86790f8bd134654a433dffdc73184e0f06c0bca773a6dff34077eaee3c46347104a05bc2a0589243220b12113924a183d00e067078e2861d5040043926deb40406eb221663a2879f98981da2888949527988ecc09999ddd9dd9d999969683c0d908602a0446906ff4f29a51406839d0006cb75f1ffcfe38258cc168b318103096e446e44724cec60831ea6a84011bac8a1e8f3d979d4fb92524ae94729a5e14729f5cf632a38ac47a7a076ccdf320027c6b1580fb65811a0dc32b6a3513471230212518488a11da2a0906401030333e3303c146d202686879f9898243120724312277888a20230033d6cc054831e6a497c3840229764870bf4e7eecc4fc3a38d10d83a3b3bbbd3b8f3e74edd73ea6ef35dfaee43fb29fddca9f3c0c4a534378b1824660c762002c5f1081d818a471d71cbbf11d121872e8c409dc6e66b6eeeeeeeeefe74506aa383aae02450a0767377dfd0c5e522acc0bbc88188bf1199312062832439a8a03483588c482d166362061ab8de5db80dbec3751fc29945399f2865dc169f6d0b876afab25bef2508e3c79f2f6e59171084616de9b329ea8c8afa82508539f87e432799333a674ef4118d035f31654c88de4baef710d7cb06e2fa770fd7598b5bb20fae8fb764a3463dcdd1baf9f29f0d55bee1e700c15a57966d3d582a5bb2546c596f10088a4629ba5d0aca3600a7735106d3f4020781413abe27d4986141c67cb5ce6f37bd69b1b564d11b72ab4e39a1214db714d53332f57019cbfa0ba84b33e78b66ce405902686c2e9bb3bffe3ee68c74fd7fb8ccdd7987a7c60a7f08cd1f066b5201a60f4b259bc3b2436825fb81244b3609fb60f01d213803e8a1b62d8588ef3656ad9ac2d134f6608b45e509e57e5689e9592eebe16ec422270d0834109dc8f4015a29a5b3288a7528fc2d22a8de03632424ec49d6e350d8a53f43901c37a0c501fc9c2134b0f47cba29591c746e403b7bdc457ffe70179d010623c97f16ab4611d5a35588beebf67c6010ac3d1dceb448b7fb69e69cf16677c98334397a608222a827b8dea70fadce129cf0c5d7317df8a29d3dad18baedb4e58c62faf0bd6f3dde0382b5b643f15cf7b89115d78d9c3471fd430f9aaf13d4cf72ce0849fd8cc492e682f3821696b2a2bacf9c91da091193eb4d4c977fe94bbc67bec026a7ee368fc2db7c718ff7c0f0dbf5f9ea27d9d27ffa76e3246a6bd2e9116ac47b3ea736060676050c452216f96e356c5c68fbd6427d732ce6cc731dcc991e4cdac3a417981404938660ceacde9f4299b3d6fbd31c70cdcbfb534a82497b2810334774a34b5ca7435c37a23c0e84e94e78f0028441ade20afe712d7640e6ab87bac33951af1a4baf32827f1a492f8edfbb3b9117f58ccb116af8a5f35cff96911ae2685cc6ba26d23c3c466d04cbf8774fabc6469aecbe9dace842a3f7abd1f4479efae935fc3c960f5d5cad300856160b64befabdd1c4054f8aa7f2944070164d27294f3e9257ad8eb1a7ad98a7937705e9fb64ccd9556420f73eef46791666befa51a3f3cc97c7f80ed3c5c3352ec4323dcc19ef5b064234910f0ec494798f5f60ce7cefe510d75d89174c77c1243d06d3e58e6319f79c1234b8de02f7a3f972cf813cef7199385d420dc3fd89eb5acc390bdf95a49c08d7e0b08c3f8b712c3a3045e474db08ae0922c45d8e32e2fac9fb48e097148bf9f27f19690e58c6bf355228f3457124982e7fa21234bafe306c59734bd0dc4e7765a42098a4ff6aa42198a4bf6aa41798a4bfca487b98a43f0ed7d01eeee1320a4410aea13c2ce3ff81eb9ff2afb63c0d4179b8fe28efc1741d4c17e23207823b992ef737d9f274cb79e4856b71ff5e713d8593a180e39a7c2efc2b60cf63a0a0f621236aea67e9765e897141d5fbeaac5a71dfd0056adb12e6368e6bef311065222f6c405110992b5fb98bfdc16e5cab677d94395181c0ae67579f574ea315b8a254ace2672b8dbbffaa4190e5b6a4d445fedef34e39e88bd5db47d83cc1e04e982ee9c2f0274cd9b5eb79a0e9e7db742a4a93deceb2ae492ff645ad99b9de7ba6f71ee63d560ab326c632de7bafc36532defb1e2e43e1bd9fc165ae98f74ef8721291cf3c63e967684bd80d5f54fd34e9d9d0785057af52a5de7bde71598df782dce5fde9f5f5a73b0bcba5f52f3877798ffae97d8ace5d35c696cac37ed25e634bc5b676bc5ee679d478588d97a9f13af45f3f4d78999f3415136c6b07ec659e07ec65645ea71f66c1abf23c641ef630abc32fa3f293a6a2f25eea6dbac6cbdad196e04d8d8c43a5bc376d0c5b8225d812bc294f828d71e7b76c19e396ac73b1306cc96ab17ee7afd812f4bec610eaca325093deab2cfba4be649febbd4a2a65cbf0c1708e3570cab8134b73e4eb9a316386cbe59af193164383068d989898d7a14fe3ef2cbd8c134e384106bf0c7e19afd37fc24f1a0a636b7e8d9f34726c4ddbda41feeb79a0f035ac8e3f0affb23a4b70fc51781dfae44f1accf8c35d006346de7197f7ae710677798fc2d8c35ddecb1875b8cb9be13d7982cbb816f39ebc9ecdf36233c649738d93468e9386c23869278c9326e3c24c4b335f1ec97a1f5b721a12a3c55b28e4c89123ecb3fafefd03d7984834efdf473da37afffea267409bec0580f7d94c13c1beec5c0a5ff66e9cb4d93869b071d200304e5a8d71d254e3bcaf71d2f80403ca5fc98db7e907a2a6ee913943ddf0fd6929a8ad8b839f274325f042891640a179ecc64a57430e96930f35e94e641df7ab8f7d51cbae39106d815b9b3366f996af79ffd6f9306bba08cbf8db789957a1853f721cdfb9960fbdd6a4bbd778505d5ec505067aaacdd9e963ef369275c24f37e1615aff52c2cff9e3db1e77f98b3f5de6a9f0c3d8d882f12bfc10da8db10503060c8b13fb156c8eccc73e07070c976ded58e159f825aecf89b1257861bccb0ea1c1b02d1af8c2f8d27b8204d0a5ce3dbd4dc7c63662b945c17a8fbf07f93bcead0c5b826e4bf0a6de041b34ad2d63dcf0475bc6785bb26ef8316cc92ac192605f6ccb96608d215417eb46ac17c9409d4d9ebef422d71fc64803df932df93f4e8d650735ae75d73f650402bb2d7c63c61b6f635ce1718cb19719595081060d1a2abc8ccdb1f12a7c4eccd3f821b416647e086dc68cc7f138331ec7f3e368e1656c8eccb7f03938e68d19696f630cc0e318efcbcccb2d1f00167e088d76e363cf1f5be159b039367e85cf89f91b3f846663f3430226d37f365d7ad3587ace51b24141473b5dce888871df085e06621f9d0faa5d98e0b0a34401d25c1ced625fd49d3923d23290d6cf457a86e5fb5977e3aed5f7334e447d8e0664befa81a8a85f8da9f7d133d4b662a01f3eb52d01989eda21379c33d4bd115fe5fb7bac3ee57988aff2abd7099899635ed4d58b7ffafa25d7d3eac52f6b8bfe10da696cd1fa069834d2e69cec10daa48927d34fda8ac8129077e2f7777fdf0adb3063fa4b2313e121ad46aeb9cb961af93406dd6e206abde58c422defb81d800b5d2be110048d9ccd034370c2160595c28911774ae1c4080a774a818b72f90682b5defe767b1819d39d5cfff2759d89e64f7ff784c21bdc576fffb52d3d38652c5fb2e5edf3cfb2500bcb09088c6f4d967cab71ffb8f258275b5f68504bbe9d9e6ffe93e46c5b31d832e7da3408d6ca62fd93e43dfd3c9dbe84ddd369acdf1703298bfb3dd79aa4bb2da30eeb5b9e65d45982c3b22d56c7345363cedac68948bcbbf5560ac5efa7f3cd8665251453be9595adf774fa6aff9e1e65cbb725794f2eefefc3652cdff2e22db4306e13066b64b9b17ccb8335ef992395de1a76b03ceb71582ccbe280b692749734924e2f9074f7fb7aa34d191e8ce84dd5a927601ba069abba7a9a4a69adc6eaa6fe6875d90c56c5963434d5963052b4e53fcb8a947a49b82994bee98a8a62d82a65a396ed38ca51ae4877d4b58fc4ba263d6709cee9c3cf113f27fc936524a527f9f35193fc0591e669522772dfb07d0841e527b121ea674b98a2a218b6ca74474a42997d9875b026fb8be191e439ddc543caea4dd70a09f3d54f3f0fec58870fca7d3c0f36675336695e16ac9a22f2de7bf6a92dcf5b9ee9747a1dd19bb47a7baae99dc1db9c353165b719461b23992fff1b97d1b09b59ccddcc4da30134e9a42068e4fc08db8caaf7f5abcd51b8fe4c04f306e6ccf49ca3228a27405b828ce224ae97e0fadb380e02a68c8560db2c022ddb7474ac8d13fc8ea3529f77a87cea79a8d89c253829170f95b549d90a0671fd4b142ef832660d6360caf883a92fab0af83073667af055631da7bbc8fb00feef417ed8062adfcf3b1120c6fd9e6dfe2c56adb690a21e06f1c507ed9f40f061383d6861e62b65c82d8ddff3f72793686793a1355972be5aa753529f342a493dcc6529cbb66ae9fdf8d5831b506aa73ed5e00616151535f97c89fbb84f03f9fcf8e87c7efc88aaf3a2a229a68cb5d015e98a8a74eee33f3d535607729f9ef1dca7e6b2d6f7a59f34ffac8eb55c03df64d9c63ad04221d20a03ea134e188f529bf75e5a40d4f2e5d26fa63636ff35a8df152948493f95e402147e197a86f494d27749526777bee8d31f5570e9574123c5a55fdaa05fba2e9d2f0ac4cad0247d979fca4fdf4f2ff093accb0eaa7fdbc932cdb6053629decfb26a0feab7d3a4468584847a47a79833f621a6173167969833a614cc191ab81554700debfd69d19cb5bcbf0b316bc0f777db9c95de5ffea9cd1d0793fc41c2aa551e1db891af60720d1b9164ca98c80c885000029bd07c39b35075f910144be3caabc6d4ab8cf5c331e54d23eabff1f4a4517c705c3d0bb9cd6deeef46f40c1b1919f991e37eb87c03b17450505017b18c7f8b6d9c63b751fb60ba8cbab87e6483fff79d7a17825aba0d48bbfab900ab17691bd00e8611a054ad4660b0b0102a25e562ebb82be21a37022388a577416ca4c88b983e04cb68c008ca08d70c5cff301459483c710ab4bb365a89274ff253041ce386d8b2904dfc928576de45b8fe2b23cf17cbb0154f2d6ce432b0ae74fc7017d7301196f13f3af914f3e5cf1a29152ce3df32d2176721e9b9fe2b3fd77fe556380d26e98e83e922c2356ec432fe35967fddc1ed4e3a98c1f51753307d896903471762fa10b38849fa0aa6cbb9c68358c65de649a6cbdf054428b8ee20b8fe358c548fda86be5a0f61f5cb135c701124c87cd1bfe5e422c64ffdbef75aa48f549f07ea6bad8ffa492bc9fb7d9ffb7fffcd977f8a7e1d83cc194a082dd224a594a23e25c64fa56dd3e2d3ccd9e9e9a73065ac791a69e68b7e0a7d1415e95b932d652e2d91977e1ea51489570224cc840913005cbe5cd33c7ed43b2e763b2edcdbc17cb9c7c4fb929988cc64ce9898b2f6c18e99ec9830f1bcfbbf72869db2f01bf40070bdd18db8cb0f6ee47aefdce56fb23624a865efae50cf74ef1cf4909c6c4ef8a2e5d0b626ad649d0a003ee9bdf174e72987c73d7dd4bb988ff7eeb612f3e5f150b9735cb302bf9f6d2b1f1f2bf73932e7e3875a6add800fda1ca6813f84e663ce50976d3577f5afb8863730658ab8bdf297102ab515cc250122f98117d650a5d6443dd424fd90b62431c452a9d572ee2e9d01993eef3065acc574d1a7d49695f2f0cc17fdffa192a8330feaf4d3c5f7cb2f973eefe6ccbbb43d70291582f60e97b60d975215fdb24f70296d279772937eca5496e52efa6c41cb9644fab05627e56aae824ffab7b9acf5425ffe9c21b4fa93569ff2d36f243dc3b9262943992ffa75642377d1ef23660d633165e8d39e16b8a7a78759c73d2f2154d0b2117ca449fab124ea914b9f59375ff471e4503ba749fad241fdec4abc51043117fea45010c71243138c67666671d4d103308d373830461ad6ad0557c216d5c994b516d3e5385ceb4830770efa12be0277c1f5f71f7c306523607da076e07ae901b2395d258b7a9679764e2aa030f7cf6b21af89d7e4e320c4a07e9018d1fee319c0f430e8b7500ea5674a6fa1ec0b7d513fa9c021d7337de7153bfe1ec4a465447c2709a19ea95df1c4f5f7a223d7df7d4a6185ae654df347a5a823e99929450e0aada2a767a6145718b9148beb4f29a52d1baafff88a8ac5f37c8741d40fea276a045b5051288a84fe040afa11a29258a7a3485a31a8fcea57b61c72552c47b9f14375252ead7ff9d27f52d45342028fa691607326407379245fca4f47fdb4cb3ff525489f2271977f09861bb56e477c568b65b12b2bab52b11489cbdc7fa82d6b8aa3ace7284fe9ba5bfacfcda3b958278aa282f6484f56501ff5cf51eb884ae242e57210e88dc54411736be994257ca3a3496f018b5ab2ae4f9c0c2d8b791d37739672fd771860cebc180ccd9c7d76ce17abc99e7976ced74b9332b14befcf7219f830b7645d2f46c37297df528d1054ca1cb0400e8532d5b40d2827ffa4888da0d422366a7faffba71d1a731638bdcfb01ebc2ff3e583eaf6c611e352e0032666cfd9b37bce9e73ce6e1b179ab999b97904e014292d40b8f33cc4433cc4433f343444446d35235eabf54c7b05c896e7f3064131655ef34a6fe21f2cdc6d5394ec741768fd87249ab30e4215fec50ea6cbfda7f5281ea57679e7dda6818ff0b43667df13ede6cbbb89f972af68a849971faa13302f240f2f7487544510346a4104910379678b51c2d6240aea4747425cc89ca9e88aa4fa78e55541bac72ad730df71766e21425cb65a59b6f51cd58e6a47422430655c85d15115e2725455fff54f50cf4cdfa9b158beabf5d490d46c38a3d54acd68f7e44888cb5646b926572ff4e865f524a732325259d6a77a57a9beac2adf09b9664b61f2e4c9ef72d57ce747cfb4543fe4aaaca35ea5b26c345ffef138db5a06f5bed21168c2c96df01d36f21da3175057b592fad24fad1d2bbffafa382c0fbaab7e68fa4ad8a2be6ec946554c99d19c91bc16840ded2825abf7138fa6ad2cea74b3ca4169d25dc6f5f7227ea4f4b29aea5bc6366a5793290fda00d5d277a6ca966ecbd1c58e6ac72b10c23ba6934d07aaf37891399bd7891429f98e0a6a398f5a4c508fbaa84957f5cc6c52e5b3e1402d7dc789f44cd965175dafef0fd6279d76346dbaabfa872962095b54a6816f6abe5c7a507da76752ef1f56b1842d2a8cb7b3a342d5ab1e1c5b5e739bef388f4a6aac22db42a01f9f269d67be8498b71452b061c3e51ac79dda8ea6adacef18f98e110dfd7652eda2850dc816454e48c805a32745464517e49acd87cb6a65b19e795cf05a9394af0b463d7ccc99cba52f43ffe819b6d18791e4d32a3c77a709400827cc0b0e15254a420c46c54874840951f96f9c04f3a1420511944091830f1c410716e726e5514f535020ea9d887d42b9cee2f3f39c79cfb60cc2371c57620e35fc1a60084f31946e78bdf9e2ff38c7c98a76ce979d41f886d60f70821c0b86f0c31345788086001108c186274458d273019aff4d0f25a8075d86b237dd44b5460e6ae9c1c769929f447ad0de90483d48a41e3738373d43f29b1efec22f20039c32e539e90d114c87165c6a2751d8550b916d968b56224bbc81ad892d8a2068e45ac8619817148944cbb869b480a982eba20f19bc2660d6d8b08ca75ef52befcf4c804896f70f4516fb94e3f42ecc192ac7879b2f9fb71c724b9ff2a52f61b77efdf034ce1bce1e414df2a03613a00c00e9501f8a2ca6bee575549e95b2658b06be3497bce2a9e57556cf527d8b9d34d1b20b5c03d2bca8e534c28195c507a29e74b8560c6cfa95b1253eeb579e656c89b6b5a3e5599e07eb57bee559809c0a203e0d2a8f63cf98126c192190831f8679c113385f6c4b20b0907b36aad4b9a12500bff82962ca7798f2b61543f8a787a1da949427fda9f42963e9f94793a5d2cf57db64681f0c68926714e23fdce52b5265342299c0807e01a5715ef0a644ba84de505bd862c0d4908f607567e9e7b7789b64b2718d0100442db946327dbf2908e9f20b7e412f6eb9a260df10045b00422d63a092908382903cb40e922f2c1f54cfd6180e49efdc45ef3fd22934956e7c034d1c564ba90e014c197b00a7a3e4532b1de91d9e1b8b55eb8d75c43b9dada7a2668e7b1afc2a7a3831a5863e750453c6fac33d4d9a7a4c162c3d8b552d6dd207eb346f3bda086f2c00f7cc5ccfccf5cc5ccfccf5cc9c8e79741dd73d3d3da59d26bf68f2e874c3b70af372c54bef4a9d2245e8f3d3dd517661eb7cf80443b74f18daf073d8862dd0045a3227358416822e4b3d087ed8a91c1595e74fb18c34fd2aab4fe5a87ee59be5576c8eea4b1ad5b8ca613295b5b543a55a49bd8acd61f9d44a05fc9cd4aba87e6573545e659f65650459c8956791ac9e2aa4d58cc991384b07b62ec596ac684d3c52a19ed181f49d1186e94b53d63af04d0fce99587a81bff41f96be8652fb700dc85a812a959405439b7a9d50c5eaa82ce3eca485395aa657fda4a5522cafb23aaa67515996d729499e2f10b42518b6b05a5a58a0ca5cad4cafa3fad46a65649b4acba85a7993c559fd8a9dee52fdea4be6619b6a0cf967af5ee54d5f5da6b3726aed58bdcae3ac5ec5b2565e65abbb4c29abb3047c9dd4ab5efc77198bd5517996d68ed4ab1e27f52a1247e5596cb832f6f0d4ab7c0b7c21ab51f5ab37c0a4cd90a35295f3486571e023d0525f4e9d294c8d25d13bbd80baed335ffc65fbdc179ac795eba517c7d685a5eb70c32ffb28b46093e19bc60798c2d11483f8e0c3205ad80d9db8a8f40d564549eb108d0c0000000053140000280c0a86c321b170482a506269ef0114800c819c467e58194ac32c878190328c10400800600000000000800c06b60067e52378efeeef8af6ce3df661e3d0a0f6bc2d9c676f5aedd8c91866c5a8b36e1f9330f36dab32e20d9c683221aebf27eec3ccb6206a3ea81ad132ededf6d97e8735864bd45153fb930d12d4825951010a8fa3b2710ece8b44f8d8864f06bf5c0478811239162c6369d95a3a803fe7ed2f73833d4e5a64fa1d6757cf72785fed36878ea961f20b2d98dbd74785d91cfe0dfd1e7130d20566a5e599eea541922d9cd3c6126a21645d4371ed599ffa6760de6372935f202cf1454fe2cd2cf5f3c8d1a35d1149ef669d78810ed02892cd4329602180340d81b1ceb45dfdf5fb3584729f941d81c18e7eb1d1f53c15a112ab9471fd82f76a3953ed2fde2d2caeef31f4e4d5205219476a1ae5f687a6ad65b69516e41e02ea7405f53be2543414dd41667b9d4077405f8f81cc77acf262b6eded216b63983b03985f1988b9d79bc8fb2eb48785916d82c8f7e1258ccb94791eab0643b282491fb13bc47cab4d8b2734c77f291f86af4acad01e6f48eda0a19b5a43d3ac8e29df630389bc582543d07f34b072d282e831890c30712daf5a0de16f03e4a6afb25de6c6fef1ab0c2dbc7faf3861c5816a6ccf54f83ce53d998eb7aa4216eec29b3cfd8b592901a693d1b093c0c645239d1e9f882a6ea669dc84a8321360fab16a5f76f6f6646db277badc0b9ae5428f217f101cc0840790bab7e4aef40fde3d9d99d054344197387c6ea74af118ef8b5c885d555dabfbae5176561d768a695f2fc79a76ff36766cfbae2cec84f11dde73032ec007711e4960ddca039de2e9c5f84b5ab2d5b62a12d53a54b538f60b4a30adf2ac58676477f88608c816cefda72131e03715e670797ed957de115feb2a3ebe943f481d07bd0d12e884bdeb27046d1bf42fcf1b420d5cdbb9a3b00c12dd137aa5e6ca099058a6f21347ddbd607b2a7f508906a95d9627e228348e1e76c34fc094ddf8c3e14e4013b1476ecc64cc7343b78919cc43c91e2a8c768f75832afbe68fed0423cdb278f5de404189e14273e8ef87024735f04a6639a0abaf0f29eefd9fff8daf7c6f2e06fda1ee847d5150d15aca4d1e46bd240c372ea158e0c4ab630871d02a2eae78f583bcfeab966e1ea96ce3744358ddb5557d1a3fd3bceb8bae783e023211d96bd5f046f1d3bd295f4b7dc440ba8310ade9ed912ed4e882749f9b933c7360a32a979107ad8ca61a6f522b03f09fd6916c15d7b61245366683c8edc7adc35965cbd202ca4ef79867cb3a7c172c6db131d1d63f62130066a44a1e47f8ed86c46ce84e3cb6c54dfaf81177107a551db08fabbec332e7abeff4eba6a361851fa1cf4fa70f1d5d55f39cfc78b7c2795429d2a081f51d8b82e1796e67d5773a4d95971a83c268e71552bbf4aa42de5728846690177593c08337b8f6ec630eef845df237efb6b056b11d87416a1e1fd61680ccce4ac7cce508a1b9475a5a2879caa09ad4c87dc7a9abdd8838eb6d0e48110bb324b18221456c812af5a20b207ff9a91148f04ffcc1ce57681fda296c47860dfd76d9f0be05cab838f4da4977f97a8dceeff447048b12bd17c0e46d42656681328630682f42cc0237ccd0c32ac6110f4db38c48f8446f44e6fef0855e79bf71f9e6672b36b811a305d27e67466ae89104f785707ee0cd9cd517f8f1f3743b516b4d1a1b9344ba634faeca04bf953f819e4d2de32cd40de424d8c3850761e4b94ae02e2aeb8be30e6fc9b83401fcd5b911471f98fd9ac6caf0e2a6307afe2ae4e0ddd145b5c227a1db4601252c589a2a162f94020994ec15b80597f8f386dbdffc7f6e379440e344f749a7b069fd8f0356faeb976202e33e43ee8f835722e881def7c15b4f3e44a4dd235fcc367c7718d8ab4e65623ffa9728410a56def540212101f8c21e2ba766c32a7b5d9ad61e69bb75af1ac697796c12626b175c13c6f1d8f2b2d8a4dacf800a5b79db7ad58d97d810549750620b17e4763f83af65a6fbdf8b9a0ebb0da34b7ddc857fe715184bc4054a7ea7f1195ef633a05304cc3fbacd3906b4d63a6acd33587ec2db381208eadc3a4e77205b764504cdbdcbf0372b4c90553cdabea89ab8164204287820e28722ea5d4967a3841ab4fa042e7924aee3261697a89fab6ef86316d8d4785008ad5cdd506296c67982fad455d00d19fa2f180b93ee6277bfbe4ee644b3d966d00b5803cb6007ea1df0371776a6875c4d090494c0d700150367080373ec8ee0b2e7c03c207cdb8b968a3bbafa8b1f54629f8e4b0a4b81036c4233fc3b98a1613e56b4bc4968c98ef40c64a71310c60192daa8caffe129efdfba9112de9ee00454c583382974d2a9a1f27760e637a1b9ad0ff70191f183e73dea290dfdf53d7c00af2334a152215e7650fa00a3c4db4ac89c1ffe7a85e303717e442626f5bd45de840f8c37235d0e1148c2dadf6c82a8eaa4baa464438b3a7c095cf616ecd7776b3a608e12bb85545fae7b6ceadf800e3ed42ce02c66ed2d932e0f78220eff5afb2f941a86de118e2bc93fc7988779afe8298eb5a6c9f7452e454111cdea472339fc47680ab31d11df60312e3b7b7a32f9896461e5c380737a2ca0f14832879f46b4091d76d9578d17a5d126445a147e183eddb775c94117ff14cf9cdb317649cc8f13a8086ac1f1af9c33330170ee13314ef210ed60437bb7a50b8894f6804dc9641ee24b5ba164e9e284954a9e06e72bb41c9d4e6c7155226ea9949492be681a856f312d15a438ff75ed07c2b9b2a6dbe18fe4cd6f6957e918a854e3933c0f0b45122ed5ef46da133300b8e413c014742f5ee650a37b328b0c8736022beed9821c88895b847cc05e5718fcf398c78b88c0df2570987d16eff86cc0403206c9c108d907018dbfdd23cbcf9369357304af2575a942502232b4cefa43fad91d81329caf0f9f2521eda51128cdf43d23675d04a6ce5d64c8914831335c0e15817bee3842a2f25a2c5d3d9a00a39fddd45b3078221a1b0375d2293ebfb3dcf8c4a7bf17d86c82d44ca87379f00cc7603f619178cfc02715245a42088840122ff7c7ab46dba44be3305905f570970e3ded065d4a113efebf67b6457d0b7b928c3384b17ba00010a947a40239a759a8c2e07ca5925213b8f39af2f8877bde40586e50f30514a78885fd2676c80b5a8af5462b033e8b5e1865756d041fdcd8faf34f20030c6f43b85eabe5b58fb05a9e9f0d3e92e7c6200e8f68717e1ddc41fbf5ee9fc9c1acd236cdafdf17d5407590be2b3cdfa8c25257447cc04957cb1ebeeb813a43fbdec48094391ee3fda6b9446c941323c7c769cc02233ab2d3f21f017b89f7b9877900851e038d108829f69af3b27734f344dff24b0db9d5c1fe3a78d98d24b55ba4a1cf1a045d3e03a37fc031ee1b07b33c01b03f8eeb18ebc5c374ff0f20820dbc55c798a34d2b7677b436c07aeceb1fba096a84cc39635f7fce041db69fe6f618fb77b7a1cca16b0090680cb0b4a9fab3e50509838ad4e351ccdfc8abaeb1aea2f6c30ac89c81bc196e29a709d14127d11c411b0acc1c2bc90555abd79b08e5b474692d8e0f261de10563db9ea05af21527eb93ff8849872c1befac504e2d5a7c2e7b2213006dca588a2b2e4e3bf92162a10b6c980391478cbf43e1bd27445f45c8d73f6809bdaec0af410c28009f22b557f5e5b504eb62c24c572ce692456956c2c146a154b4c22b5cde73a486a95d0ff03ff92850b2ab66c8854efef002d2670592818d7028025f41f49a797789dad8d3b309e783f4259b1c3d7753c5aa10360ffc055a8b5c8193e9af879358a6c79f30a0eabb11f113c810594edb9c6b99b2975b27a31e0dc12dd7e18015f839ac0fef2d3732efa2a25673aa6bb023c228cd9ca6810b8e49ab8fb91cc400bbf5737831a2b2c1f2ef2b3742e735e7db9860c43c17a6027faf3c2f9d1bda2253f569113e4cd18af6f49a3fdc869f6b91e7b7b252274af223b81eaa904a00052433d759e0dca43c49c360793f1071271ab207cc525c773b12c8fb60ea81fa9a0e48e1b3e6f051815cc804b17931701221d2b4da0df958654c70e13dbcc1436834796bfe3fec59f3752656808b6e3d2e6655904b08218de8ffff318e5e7d02d9ffe49ab0a9ee1d97fcc03abe938428c266169f8dde85731ddcd39a00f6040d665580cff99665d16e3afdd3418f45393174336e246ef64a24ff9b1aa2d67c3f559a59126ee1f2ce24103577c17ec41813c8968421862d91c87fca88490cfc4ee3c0132b20d151c502cccdb620f483e8493d85a037125a19caac11ff08f089c278b6909ec46af983b65aaadc12ade3524c9550ce188a57ad752f305b170f5ac9ea826768053d09813c60d474417d85458acf9b7e9da9bf4d13050a227f8752365c7560cdfbb2b4d090d88471521657468884bb8b7468eca49a5d6ab1c03055752b2b07fa530fe587f5240e24c677a8155e118e4d7aaa91fbf9a8b0545952aeb182d9990f7411d8d5985af6a17029c0b4b990154984e36a5056923cc33e9c67dd7245e68a65dddbf66e8983f434dcd5adc75cfb96e06d849ce7ab54460a86bc390beb1a5b8523b87eedc8cf06295c1bd66f578c55f8d170f4f71577d7ed0cfca778f42c3879c83e3a5da4502ec80b1e6eb8160515800d7ab0fb52fd2274e7085f64f3f96e409a0c3b4dcf6ca4cd35df427430e498a43d324ec3820fc1fd82b0970194e4efca6b8fa13a7a814920c42d9de73299058a21423d75c007eab8b5517d7a3ef9d9ce3e7bfd565d1edae3c359e332dd9f5e4864166ef6c3fae19909bb19e5ecdc19e185eb9a0f4962ddb5e6c03fac1238590cf852bc2130ec080ec44e1fba0a8190b174b0a749e8e781f83dc9cfd68deac743a2f21027052cd93acb95ecfe45e04618374b87329bd6b5627c63f8293c16f467fd2f1b1c254ae4a29dc556bd1e829eab4c6439f1694701e80bc59e8c70a3888b3d2aa1c7588eba84847c07c38991c3eaa1046d890a14866cdb297e1ea66d924f666b5707da77d0e4afe79476528c45ea3ad5807347d09650730938ecdb79654235cb045e1411cd4a24afe9ed62732ea5a3c3bdf434f8671628de56dccaa0d873e907b8f1facb82567bf091975b19668f96289cb75d7256bc80c8155a4145d0616a67fd2bdec45ad325e084d5205f5871c6059ea8029169222d050ae10a9ae3a112ca428b2a16481cfdefebc0541714660dfb57d45d7957b457bca71efb5ad380adb8f478230fe3ce44c06234a43d8427f0909dab0f4d75c2fd19642a77253154ef3ef9d849a43dcc79c1fb69eb96c02805afa44cef945f6e281d1bf656285e1e00bc58108bf9a44d995ef3507f118e9060cd4269b44c06fb258204f6bda39ba59fe4e4fd966f249d71e9c5497f099ea46ab3c911a36c2c248e0da5a244b0016f338fe7f0b64f98159dab73177adff94c6da6a87dbb685e226688d63d184c94ac58184111f29bd4eb066fa13701d796ffbf97d1bc94dcfe94976299e7d3cec55a59c0427dfe025af371347afb9fbb25c11572ef28023cd5400cef3e01d4ba851fae1ac9ddda994136e3d34abf865246275037ef5b858842ab0b4da1805d7a7d24edb16f7949df58e52dc40d7a9bdc01307674e1f0dab8d22b6c245a18a330c31ff293e6536af85e625c672c8d4d69d6a8079bd644c3b7015da2c1be27aa8dd071219f81575a42a1f17a19f589e00a3a3a8a172bd2f7e3a4ea092c7bc77af3e6f095e36d90217cf8eaf28dbb93209862444c063b242955d271490db4c6ee2b0c59b17bf87193be75e95fe23c411a5f285e2537d5a18b6f63b492ece22b8bad1be4d53fce6d52951349d9cdc52c558b375185d5ab692b2f3bc742bcd3caabfca80657ebe5037d9ba32c065477fa893ca5c5cf1dc18070b67f295fe0ec0d8bcddf21786021454d3bfcb5a5fc31aa535b6fc43764d2db31234461416e0ee2c887e1dba873a8a4f943d6b04df983ef863b3f0a53624d2ed09f99aeaf8db381e0982ca7c76fd277b830195a5aa4fff040a2011851ccf4d96b8cf8614ae0d974a7455f8c9afcd35e54e41944894c9633dab9cd027db7084690ebc49066840ce4fa0d8862c883fe119c0e6adf3e669c1482c97f12cf1669e04cc47e3a0fa10f597abf2e62be06fd50423da27c915dca21d7cb1e528a89c0b5c780fe62cd3b173fbb0c3f6d045ad66fac122c6e83c988e5cb6e9b3ae453c99fb89967d14ebe87963440c69a39b5e7be89ab6e0bf1d77ce7585097e575304489ded53a39e6152cd2c44b0f05e5953e15993e6627932679be6dd8f49efc0089db8f2330892114d862a5cd3e07cc4fe1257731ed4f3a10d8f1293ba435fd3279861aca5b4ade68ecb3e9c143c31e916bbfa4a4698a49722d4282241e07909d04c9b3a9ada31b6f4d3a38e9c5a1bd4c6b57c45b88ad898a9f96b4055a00a5354c1ba5889cf4ca8d7673496a36fc42c72c921e6ad3580cdda203876891fa882cbf7d2b9d12b9d02782e23d535a67921d3b9241285961902bc203f510579115260d81b34f8444a1ac09b329a91a4f53f499e4d3c0df8a927d594b1a259326155ba9fe4eab4bf9e03c6d175e36a6cc399ffc09784ac99117916c9c9bb053e52c957f492d797a97c2ff6f0ccc5a539473ef27a206d2e2d726bf28d2a41ff0302989c4a5894a024c0d9a5ad9d8de452ac5d4bd0518dfe2758ccfbf25e490628edd1b73234f7c4375b1bb162e6cac86bf3fd7615942cbae34adfd0d3b57c673b5e3174d7e89d700c91c0c8d05c2dd4118eab3628c38b1d62088ab948180f4d7e31ac279dc7d9457264643389fec0f4e1559f66017598a7a9a3ef562eceb2f276ccaf48fbaa928193ca3fe7acd2b2feddda03226e9494f443d7a72cf10f141ec0884eb5dcbc3ddf0eca2697a3fd0420370b12277eb8fd474d26350b17d260cccc18680cfdff3d4e81843089f700234cc62cf677e4e7293545a1828cddb1d8ba48e766bd0499503d13a2ce7096367a28db0257c8ebf4e084be2808c80ca48981af432fcf3ac75d9fc54a6c0721e2cc92dce03a589a5f44e11f07887544502bbc1c3b3ad7f8de00feb283be936ba2680b7a5874361de4609fce9f6077414bf92c7274257fc6f0e21352b68134af1b1ba7f56e0929b60209a3d6029d15e14f639ae2d4233b79e2fe4f240d49782ffd46b57dceafbcdbe7abd257570ab83b449570d1aa4cd635fe4a7b4a3ca862c29e3c88f834837255dc793ad868d110950c13b0f9f3fec0f7a1a9d8fb5709b512f28fcb3666e85fd3d9d8a20854a3ed73a7569fe06254a9d5b04d78a10d03bf558f07e34c3dae486eed1fe8183ef28353e4f47dc2779a4fd9e36744dce91249481be123118dc923475efd8fcb4cdcf508c7011dcbc3b32ebb1aced0be69c53525691438c332c83397ca0353ef0b2f18ac70fc4c97b630098bc2d0d438eeb8fe2f91aa15024dad31d396aca897ab06c1bf4de481bf62bbf6e3b03232c636c66d9c84258649c0182b015fb45e2cf4fcebc968c6253deed68c598d34e7fb26a7b1b3d2c4eb3c1a87912fc3039c9a8424a926b26745afa5bb5723aa775afdd00ad101fdb69fe2d8a031ccfb13da4d0725ea480173950c6f347d34c9744a969a630e8ae295924d7351f4c9462e12ad58e34ca6f3e0b72ca25f9d4df01cbb6ebe4ce30eedb3d5f6a61093343cb31a1acde763ac0d085661fa3267d79605ad09167472ead9a2384f72577466f71b1ab5685d809c8ffaa8c99c55ec2acaa693da121dd8618b5491503c1f6b8043b2352adaeae41de25e9a1faab7c649ba04d9d90675644cf9c0f747fbf3dd3314f3160f6487ba50761a419edac2d73dd45a3ebadb01a000675b2efc25dd3f36255c3b192026dbb73bc4c061e1d0ab76c30a5eb9d42136e278a4eddb42cb7998c39ce4317cf89cf8ea190b360f7ca5e669015b7bbadd316d01309d7b838bb81d3b4b3f4e76d2f4dea261ed6d6f4ca16687f41aa8147cd4dd7a86f24d1dd8416cfbdc6a3c50bd995c91de9505cf44037bf6e5ee995dedd808b1be50f2fb715bf6b40ef8abcbf0803e45a8fd9b6130d7b18d63de502e79da1bb64ca44a2306f08cdd6ba2b4d6642927419fa0d02887b7b47c8eb6e335aa6eb70afc128a80c2d8e7a53545cb69aab3118369b586e6fc9d4ec93c8b685cf44b99c166b6a4e2951b780bba42bd382998a03d4b871511a243a0d7b8d363efa2150bc7c179b96783df6256ad7b9218d2cdba7e8ae3c6320da173e3391bcca448793da34e59e75ca613f3d19b13da1262caea79b358a8ee3e675a7ff15ceda90398739bd7f9d4edea3fd994da7b1d245bbc1dca9fc3c8cb30f77748a2c5adf18eca3a8308801903151532e7a37e7cc9c075ed2018c73a7623bdfbce442ea4f24014f9f6fc60b43cf7a8e10a2f5ec551760c2b3b9a1aeadc0347f2df42d8144cd2ee0ac431caab05aa6343016586383740b6ae99caf59e505e9da9b22e72f30fb3c1624c6103fc3d0f67ff1d532801074a55a898dd86beece6332d5450be432840292b5fe6bb2bc6ad08cd7093dd9cb0963ed70aa6cb71f1c7f096f66177f316a0fdc37f4c83a2e0829ef94b521adeecc2ca701122d15c796899202e4cccf9a80036950424e527225bb72f10df2c12b0196655d660b0a90d9eb4fda2a02a5d79af36cbac46c66878090336acec46ee14aed34a4ca1d7f188bee727b9f41a7c625eb5946b50a7d1a6243ad33653488ca0778021276c03b74c60fa88b987d27bf707a7a01d1caed95e3538be2e307b028d45c5508f928616fd38cb3b1863aed731c68edc2a8786593c5914763c1505184c4937b79641888f2697f6d6cefa55b86d1d55706de29bd2d68819256cb7b12fc05ae6a9fb079d3328fc10fb909ec3070a34d3354545afc765fa084b3fa8d54be8fecf114cafdf20918c7c71422aa29698003b75e96f56b5e4f15ca38d2e127c85663f64330df1f6413f1437a8783dd01507510e5fe35a18c06327c25b701293fb1ec10c0a1f7fd3471d85a5df3bf0eaaa53d419876a2b49d9b02e433505ae31a1ffa63d27f4451f14243aa9fe22b51a5c22e38be9f853dcc0b94f4811a0aef042871cc30e234540784253efe4aef7359b5310b40e5c5b4591287e9252d9bc6425c86bb838bcf0be9bb59a457976e40aebdba5ecb22f76756411aae38fb5a485c732d13afad82d444972ccde77482954e2568e37cfa1dd292c51c0a2f9fd08537fca06446f9d599ce16ebfd31468910ff384dfca9c514118eaa870a2d73a59447b6cb96e7c7d327c5e77a76e0a89cf6a10a827dc59c865fa1ab2541800f095e8cb465c66c58d8d0e1a96840efa2ffa93ee2462e93bac23b0f58d0ae6ade498c70d60e635249c07650f0ead0703d5715a2d70464f1d6fde6fbfa18132e09aff1b0cf26121ccb03561bf09b2f7f0df8b0fe2c540aedd071fdef3ee77b68cf00f2d68b2f0d13362cb49eed516ab6a2665a302f212c5e51b36aabe8ecda78ea63e3b58108aa2f782ad76528269dd77b18c84bdfead83ffc3c0ae6bb1d575da491fc27e4ea2ed1887e81aa415ac4c1d75b8888af0ccc3ba1f8ef0dfade0b4218291ea90873dcbaf763fe73a1aa7c8ca05f6f3077f3aa96ab77626745b2d1ce0f676c6faff80ed30bd032f93e01784a7ee8bd36801f3aaf1bed9dae520933a2071a310073776e380ec79cd86485e3799c99699dbd717f971e224d4330ef953dfa78902be01e4b1918b5dc068315b477daa2a8e7f9980fd725c51025dbb02136056edfa02dd5d61560973dc385787037940a6ea6317456e26b1374e83b3bc92a47ea3ad5d143a76ab1bb7dad4b52b69ef77b4ad5557ae50c83cc9d34c372d5145584d0e62455aa148b015d8dba210bc8e3309d3f9f88b45c97ea31115e52b2f79bf23ef3246860b2d3be34b28038c0553e4f6a773731dd77e8ebf749458019fe8d2bb0edac7c6dff146c28098e9245660a921024f91cedb21a708f7d5c171c8e3fc4f847ec3f43c19ef9175f7189e2e141158db7e1134c0f18074ca4b7b31fe050f6b4bd264a4921e2bed60e34acea0d844030383d847ef7e61466f9744a366813da144e455cd623ec16ce50e8063887c13098462180e13089914ef93de635ec66a2fac382828d2d6c9f32a0c3cd14ef5e0a378f218678a896fec546475c0cca0ba7d9905c0da0be2424a622c60958459785913e546d94f302dba5f00bdbe4c6bf37bb1eb296c435379beed73562c3f9ab35e98ea1608561df7b399feb7b4437110eda32e29129abc4bc38fe33b68c08117b72e0c10d02dbf32f4e30b93f0635d2dce35c1791114af1daac37ccdca6ae1b0415f635c140d1c9634ad8b554ef1cc2807a3f1c989149ccc36cb8b0128a305c984e22c2c9906753a5eea1000945caad5ba676a5a52cb46a55de0a9869e23fa53d143b07e3b76b134a569e82aa618713592eb4b77d7a1c7670524fc9d9f10e9eb2c8edea4ba42ab509168a258a8d2a28432050cae78afbba6c667d2d6452c0a692703924ae8ddc629143d823f8747efc0187d5d7ac9de8d828005db78a6aa6ef69819916a287162618abce83dd79dcbad8baf8e689175e29048bc330a9f43c0fa5320f0205625bd6697c9f1133c58f0cb8c8bc16cf5d901479b3854d7526ee32783ffa21f2f0ac83e0cc3654a7cfa1d814ef39735f693392407bc304793d2e918ebd4cc2bdb43428cf932132adc9fb845cd1d3f5b8bd951dd1b4e766eee775951598c4675569a0f6d94e8f42798f4dd2f146085b86099086ad72d8c98785b97daa99e95ff2aeae0967cbe61448b30dd34e0269d65f32e0a906084fbfff862c084815d9b67081e719781b1e81f873968730d576046d8408f40a5aabcc508084a6bd1de8aa5bf534914fccbada5e9fd93acd04928d5b447cc504d19b7c50a86db24c4f9d98a2a6f8558a16cdc0de9d5095c07fcbe147ee3449197563ba00bf0f3d09f6b64ecdb3ed0c407da82869ffb5a4ead4bf474a798a55fa1c5fbffe9349ec40771b6ce1cdf134da3ff8ce1c4e933ac14782d8744bb7281150b80e118833f6d9b016524d2d0aea4dcf01f7ad09aede1b0113f31e2e9deeac58bb438dbe6e53a1ab80021e1c2c561b31f86d0d97f3cc955ec89a3f942dd0633a31c168be06d61a2ae6868d011103923d61d4bc66dc242205a0dabf02f827c0547963cde934515989eb74e3034003582a2973d960dce8a33839f0f75e9a798a4760a56a8c85ca4dc92c62621dd845c76df37ec6c7a812556c3c1fa2ff42e6505309838270d657d89420f42ed1312030fa14e02b206e186b8b401a25fa44366a96a48511c474848c940bbe38200b3fa11c23097843b585367fc3253e0cd2c8c3a33a61505a36742f5c1e68e59f9f01bc6da2f92c37afb37f1627ff23626a818c87d25092ab897a0190118af5541d75955a8c191f1f5022fd173ecf60f70e40db0f9e91175a72bfc841665fff2298e67151a3741213969ab3a94f4c8426e98026e3bced3755da255077e67983d77e937fc4e68ef78172314c5bfe766490d079711b9f7997072891fe36fb8581930e8069934735e6fa3cc51d105ddac33d99e04381d478b1e580e7561c0bb0dd4bae1e88f958f7b23471c56a1450d36fd24105ce139d897d7ca406a297d170423893f66686734543bc420c42af17b4124cf8d5049b95d805a770dc51b377c6378493d67e0aff39863e27273229d672e9b8cc25ff752596031cc0d138f31ac8330867b18c7f8380a33ed0bd1cf8137947752a73b60e6649a03d1e0dcfa13315696a73209e1fe61c32a815c84715d2442163609532d452e8dd8e72532e4fb30fb29f55c591c2f3bdcb20e08f008de25683eb291b69b2e41553db25f1d0efcf94ae20687577aacfa92c267309a28619f534619ed073fd491584aa38c200cb3fd969501597d793e46140379598728dbdbe77c6b0c87dcc2e5aa254955e064b7aaba9dd5cb42c8892365f43e555952c3577d27998500dbfed6f5b3d15b8514504d0331b4d01329f623f6dbe83451ff3dc3107aacf886b605d141c6c9caa73f8bdbdef9b635098178e9beb7fac5b4b9d878a2f2db85a3582d01fd294589fd7520195ad6ceee4cc8e2eb34eab7a47e1ab56af079c254608487a81b720d3f454033ba4e4dc02463ef8599458d26632333b0eef932c53f112a19562777a92bd126c69bdae75709d6a933c3b5c5783c4c4e00bce7120866a360df59e70899eb880d74010c93134c997ad5a5196386d803dc7eb3642b77494dd12a4ac3c6d96f6521cbe12539b96c778251a51ad3c4b9a5e68fe5c810858dd1968c5f22e62c737d16a6133c7907bc0a040362b533c5b5bb1897816884aa6d0e3cc34f2fe6d34ccdc30dddc2441740b1675fae3859dc03e711278d0669a823a80915c97f0a5be8ee62b6fe309e13a1f374f16618e1f77339f3589fa64833fb38537dde719b5fb3b2201f8dffb2ac9261466353f211a7bb05bfa839361bd91c04044ed49400170c2a3f55e891303431166bbae9ba6e1351d88499accfeb764c9d003af29907bcd8079ac0c0987bd369926e95b92125b9ee286e36aa46145c481d1eb2ca15baae34f2c72cfe33d5f36d406b10c90555fc1d6902c47f89471a9fbf33825e0e5f023f55fe4c1a833242cc67825a1a9f6e405aff1bef24259ab4b06c180809746a697638fcf2b54dcf27b521ef9f3a0c940f965f52d393d4de253e49ca583fa5fcef9cd8ea306ed042fc91708a7b1eab7d8bd2f0b35fb8a57a9b0637504d6422164a1b6cc6756b7d1ce0f14a9502dc5029b6777d14844bd2a75ee428153a390ba4b86a889bb700f0b4f47954e3bf145d98ddefe75ebd8331aed19e759d0e939a684912935f5e54b163121b8e9de88ccf2e1c4d7bff015dad7406147bdd82241355fbd44b56347889fea1429586c91d458ac283c58c7048f7ba0322ce181b7a60b3658914a7b6e67b63edb877635358dca4f7b5291c00202dd0feed4116dab5c545a58d63a4e889e89cbd85a408b50f57ccdde3dce35e1a4757a51f5e85c6a380c45c202dcd6550f962939c42098fcc05d538205d25eee891811f0932672f3701110631c9106c84111361e491db0dd9a6b9784f22a385865d6cff469582867859ba9d3cded802f18ef2f7b03b3fa965bc849d06ae5e9d1d2af7e4c1553b7583840c93ca8c95c4dd9be48a197db703db0aef4954a1a9ce75e8af074fc8a3c3b61dfd455a304063b7f7bb25a83ed14c6632a7fc4812178f83262d7f61142ce8317905f69bca34f84f7dcfe56b84c69d762866fb335c7fd32395692820647709fcccb48414a446cee5e1e096624b5824bc7207c52356416be042e2e58b9f59d03e0a3d0f3ca851ed5b07ee3524f8004bffe265dff902f0512f153b06434c87f52a2ab063b54e138867ad9f2c83920bfcaa9d078b82de1af553c48960634bb701e0bf86c0f9cc6525db7fd69a69739e6d89e679d4fdd5fedfe620079916b82ac66e38b8f7935f3a54dcec2a4f0fa751b07fde39c9473020819a0b573616c4481234963992a6028e274478ca949e6b5f0846ef02f2997b39454e6e0e3e6cab934d52c993f1114e1c761a6c7ee4ab92a36abe971be6365ca3f4941643e699d48bbeeef8c8b14d11a4b2374f99e0111216ce03a5c0e5361f512b29ebc146a53062c3b839f7099126b24745e1a38bf7df726de344c8b3d092bee26f64ebc9787a70263a51d0d7b981f5c6e44dafadd0f0ffbff5e856971808ff49755bb1311a6cf36f8c46e3a1c39d9f8524ecc43979072294ef8016f28aea7aee490c6431637ba1f5d42bfec420a0fed4c71c2ff9506ce23f20e079558982e18c07707a5261a03deffd40cb91026c8b7a5e0a55815d7d9730b5c9e6bb4e1466801146d77138f279f2ceb04bf67f79151561da0e71c51cd7551d1c60fc2af6080eb0838f43609c675e334ec3f98f2d9d471c6f6c9e52d84c5cd39bf069372c7ff83f05a842b4581e7411bd42afffb030e99870a53f9bd3ecae37e096769ed4f2a57dfd09bfcdc51c7b738334561da05ca5da6b9d7de49b8c7f3a4347e9859d8126592aadf90988c94f883e9f754700082595c30af2a90ea039d847c2786d324a7dc9d012eb4fc22c5024b87313fc93bf04dfe97051a7e2ff91b108298a6bb50384103776df8388e1c7255235f238c37adde2226e288d6f02f12f990a7e25c6756e2ffed6a5083f016129e902c2701c8e5c46f66bf796606c64592b0f34819c1b744f9d7d47ed9e175f4487bd6c1061e7caa9b915dddac496ed40934d4f8e8fc7f2cbbf01f9193e28fc8b20429690d6ffe69e1788103a114f4925441da8a1e86a148e6606b0d30c15b702506f56155223e4a3e2ae25bc14466b404d5365c631a4f84558b49064b517d5fdb525e1a158e738cf85ca7fb659e30a871abb7e31620c902396ec059235cca065aa828e458f7e119dfc169c583448b389a4fece68f227cd487865846cfc6b971d47ddd49469a4bb32bf49593588bdd95e1445153843b319e20ecaec52d0e1f3723d030c6a9731a8e95d033aa193ed1f53e3fc1537f5f193ef50b42bcd0678e61982e163683f73d5a687f43555531f3e80048b926b004a0c50f13177fc857b9a88b3234f779609b8dc7524c603b51b2460dcc78b792ce141bb8d459f7bac1ff03288d96fe13e0bb8c96d6089a3b528787e646826b5d6c64563fa069d662ff5744d20a4ae86e05103dbcaf7764adc707679f986ac80a7dd1d43d157dbaecf08a15e78029750a8458fa8cce5072a5c58142b829c79c3d71c29dc26219ba38046dc6020b630f8d0e6a5c7cf2092d20634651de4112f4095c149664bbb67f5c45c4e78ecca6aa43239cb1e445067198ed7677aef0c50d995412f77ea00f89110bf54e5b32c931d22fa982a476f46ac3bb7dcf76c5ffbd74ec57a9e79d391ef719e08032e8e864fc9c842df8cd4452294d0548e4290003dbee0b212314a56af1a4e45f464c2b64460cb70e9095942f69003bb37481fbd69272097a61e47d0eb54ede230cc7c6b74fc44b10b0bb79376fe9b70b19bee4c5f3f33a10690e7a4d90d1473d7b42fda4655a6e28dfac69a6db8710591a0cd1ec13ed5ae4fb33ccc1f1ea4796510a15ec8f269bbbdcb504430949d966e9794a2e3e1e7766d11fcca98871cd7197952f789e35f3100c22e2a0d192a31c975039702ccaf988d255b682cb90008a52a00e425f2c3be5541708b54484d15337fbb4e84f9ed3de03ef64342e3e1b98bb8d67fe43a11e689ec8e2892a8a77390a1d60b656279239f7c683849ddc7e0f1444d7ee2788ea7d5e74db8ee50e0ae1d1f9a6b5ec413985093c10663b9344274fd7f5deb0ca0eba0d680c9d0f0031c932f5ae9b04a062688f010aa66fc728fa78709464002cf5412206be7ae39945b433ad184ce613afb406a83e35143e028ec22a8cb20bac9662a9f3b1789ea1b4dcdf3b48218699ea0194a07082e61b890c7bf343fc8ee93768c3c8759f7380abb489d9d47be1a60b65a1356fdfa93d708b1c7af36d6178182aa212e9a94ecd6db721800c22ab38c8d21f5f80399960893a8ea2874a483acea2d4e0eb9d6ce9f2842a21f84aba14d5509938b602d16ff239d43ca217d92bb512c57ebc7461f73e0133c968e527cd5f6bd6bb83e9feecce7ead5ace1c26e1b07a9dd63a93dde06ff775d1c1d7d37584ec2817f4f4e92f91df925e89b0cfd66a249c5478423e93236dbfbf9e9d11e25a1d89796293cd2845011babc3c99b60151d567a57469a96597530f785f374dca81a08d4bf895dcf7afeffd6830991feff75f3d55934340b4f2ecfe15dbe5de28b3d8798969dcbfcef88c40a088857f1e81e40f7cb60d103ef22d9cea672a01611cc005a96c58e67546d783fa666780b6d12babbd33f3bda612f67dfe22775b578439f00cfd4301043fdc237b72592326440309ad13a7f4eed69ed9bc488b51b9b345720f02f987a08f4483b56defe187ef07f39e0e4880c996f844a3ac108af298416087095cbe19d18229daa290cccb98b0c96eb83de8e8dc54259b73f9744ecff0f0a05292b1075954dffd108a5ab241c13d1d5fb915ac470b5050cc06b659f485cdce74ab2eef40cb723c791142af5caf1c5654c2e1d11d4231b9d3e4d7e77de87106e8d33ed0a64ffb95ffc86a4af0a72408520a7ec9d5a39c6adc594c66a25fbeb3fc95bf1eb706d0d11dd3bf919af4a74601d0ea4d396a4fcc6c2063ec89aaed2b8f7da6bb6450072d88ed62a223df53cb42c59a591790bd3d9707675cbc7b2cfa1c88a35da8698b448d377af72e23ab273aea50bdbd2415d78d3638539de03b29f67a34fb505354b32a9d96bba7a017563a1ff56acc22a36645931160f3f2e6d2cc639c9b948ee8604eedd005424e0322e848cfebe1c7e551287e322e02943e48ed39e48ade42b1b3c70934f13743924aab27041a7b56e70224c23684ac4583101e02fdecd426a39095ec1d6b73f3c23e2ed5f8a3c2cbea3a51d9132e670d05724181bc80cd5a6b14a6500eeb6ce7e034e06b111e6ea53dd4047b2d5b094bec246d4694e6f392022ca041b4e34e0e41fd4a66d0b1c666b6511903f81900af3e2817200d86dfd66081e439e84ca4b2e136526f7604e38e4ab07e87d95b7f02b3e3fdf95b624103d0d1ce551fd8b9d2e960b088e4543d12669fbbee7b127fa88370456a586776b042911388402e7865d35a660ec6b0484620a2728625aacbb6cb8784a7b9c1a387930f46e8e268fae4885982011caced53d4d0b75ba5381893652ce1a7ae7b7426b0d497813a4146efff5a0c3907b257f9a0ba2cffced716da50362086f173a9b0245a61906786556a89c12ee9569c7566add799421df144038904cbba86db67566852a861a71dd5db80e3dbd65de9a674c65490cdc3444dba54f3d60192c73bb1ef48edb9bbad444abe6459b9e283c60714231f0899a67195cdb3381ee1c314a03a9594e4f615ac1fbc103527509b3cfc26ea03c5006ad5f043d0265567df877e114fa363fd02c984b64a2dc0ba9dae4615fbbe1067754947825bddc2f5fb7c85762c30768a932aa1cc73047bc156067c6093e4e0caa0be72fe29afe838801a975e5b148fa51dfea29bfcf1c9fe7416d00a6fe12ffc83d68881a82e7be08f2e1d3043c2f2df3f23498942e086c41b12b6030213d3b92aa6e7ec4fb7d26ae2ec2c09ab22164bcae8eb4f2be76ca973858c0a025c61a303f85bf3c736baedfc16a7c4373c04479f34bb544543b1215ced247916b8e8381572f3307a4e74b1049497bdecad8b8d1538a0dbf9f694dc80d5cbe5bc015021f51c71ce9922a532c50e0be43a3dd0ecca9a26cdc7c2e2f6aefcd0d2086a3a8d05b95176ec401623630448e68497c2814c9151bef55935454cae84a0c7d06eec7fff2879c77aa6a734660d883fd330321bf2412421c2cce789ff9ff5faab39d39bfaf157f780cb560abaeed002487c61ad6c8c3914c27eb4c33aa16eef4c6891d0864d4c08a2e72412b2b52ab8fe1164244ed6aa462adc510e97fb258e43efe71979b200bf0e4ceddefcacb08f4e3aa2d7957c6b7b7581fd05d27a56735be724953947dc0bf5c29c117cf4cb9bf74ca8a81798f928bf750f6f8ea309deca5add751d79f2e97694c2e464881c309d31d12ccfd53f42a1bf19b9b049126ea0e040a2bcd532e76c301606df779717708b75125c5c0644d8c381fd87d1cc28091e3b5ceb82675ac82b755058dd5210f78cbdaacd8312fe316ac4114e42eb7f20d0145402b99c7def6907d1c74fd968740ccef398718db3b2be687f53f721fd350f40e7d50a423d90ba51efdc544c82191590089c7d66d4ca10add18b41ab9615bf7b3a18ccacde3280e6490cb6062246b436227fee81cc82a031583135aa1e4102df5545281b1cf2a028275563abd5326a9a1cb47a34dd200cb1b814d127075c1815a3de280ca6a5502dc76fa9f7f935fa50f5afc567783db61ebaaedb162dc9af07065bc0f393fb1ef03a6233c5074d6b0716dda86c408b653c71623fbd59fcf63b730bf18e1e49c7b908aea300e5e111d7a7962aa3c123b46aa8033f69caaa41c2bea4ff09cdf5a3691a407a9fe36a1f230115cc79de3d4cce5d61168ca3a93fd2dfe5c2f139fc1c4856df6dfa2cc13c492ef7420e164306ade9673ca07b9d952be094d1800643cd3cc490f12124e8c93768da91c6689d9c6fddd9fd35f54212d16caa01a24258ae7e51acd0b96a3873aece050a402d897f4287640a6bcb5c7647b870e6c2dbd4150f1260d34dc24104952efc8b6f2bbfb2555362074e67942c718257d3bc088b44d628379274b92665832d3d6d4f077172cf8a3848ef35d4dc888ca7e790ed9c3c71fbb3f37474414e63fc96e628bc2fc928eab55c2f210e178c5017825614c3ae984cf645a06dbd2ff550ac1f95aa7290deeb1a340a1cdcd704abe9fd89f266a794831dc444391b3a6e4ed0ce54f6b3405e13509f52a72d03fb140f6fda24995caf0f6b327caa2c16bfc31383419deac321024c428ca26a7f381c956347b16a4f40bcb45bd5a98be1f394104ffe0e058486764df7a59c335cc05b86ae4330665ee289c4c32b829b6621d173c2552a304be0167b59010291daf849fd38634aa9531fa966e0eaea9031c2a5ee80bf26292e9a4a107885d1a39a3bf35224a9e69844df83a39a22ce1dcd9ade97e085c61e72d362bde6f84d2b222619ce314d193a0b5486734c136c0512209873f508f16aef11cab4509ef0aae657a86ee4377952b436425fae087cd7f2f2e1f3eeef00ce983bf85b72cd618af0f3eb413638179556f62f80c6e26a08948b7587ace8ea193edcfc8c21083eb6f772d3e2a2e1f167f7199c6367ec8252600e0ca088f9a7b7663c0dfdc0b11fea5e673e23cddba65ae523195ee728e54616d9c52d3e3fbbb8c4822c27ae30ff7c568d247ac58cd304a012f3e35c60784b6213e7a299b1b40d41f0f8b1996af714ad3911bcdf36eab49149275ba8d27400007302ef59ddeee795f7858482af5907e66c5523de26bb93b1ce08e30a453e5445dba8f5ae0b5135f3cb643013fc7ac27c5681674ed6d512bb1b890aceab35c14d298181c034dd69de59205e7b09ff009b4d81e5b61ed8a2fab54ec6c6285b90227d66b91f04bf9bba04d6a4f5252e7717b8c7010c49a2868587d6446913db0ef2bc8c17be2993d05e871d67104b4e16d425d2a749c6968958959c06222dc28dc6c1d8c92236bfc041aed2ada3986481a034995f4864ff14bf4d46c8e58190d0faf72ef2c42e615077f4d0562c042e4cea97ab5af84afd7815b42899d123b2bcf4ec476eee5c2cae71f8689f8c49c7b8edf616175fdef2d6c1d8623dc9541d993e6349e7f6cf8769d6aa6260b818b0bb48de99487c6ecab60986db520feadd4cd54d006ef17bb0a5266b7e5df5b902dde5cb130e8559ff7d0a6323ab59fcb5ace6d6cc0b611988613f7eb26b6888c015f3febd1f6b6265224af1de4499e8428fab6790d4d57468c5ecfce6a263414798aa6111a3ac1de5743fd8ddeedd4ed2cdf256ec300edfcc610c95e4e7db83ee980cc143d38b72eda3985d8177c343368b9ca395ad9cfa184eac6f751c7753e1f1aeecfdaef2bb9cc656376c6f0d430d943bbd830e48e5411b34e6b1ab6cad9dcb91b61e52007bae45630a935000d944b142d10c060bfdaea7aadfc730853de0fa1179a6f887d7b4c1de19886c075abf752dd22e9a5c49b9a37b087ec5141c845f1227d97f40b70554e700f355917662046d950b990454d435a2647b650fa2b7aa3f45807e1ec8e0ae1a3decbc98ddd5e01d4ad9175bf8f4c23ff986307b12b803c460a2f276541d5d98c548daf187efa11d675d89f4cf37fa87e9ddec228c1c19db425c46276b5fe6af80bac64f9624a0963365fba8098c7bbf2b23079d6986fd4bf35c90705af3fabb7b2081beb612624d94b6fd4246b093989b910f5b855b22ff65635de9a33d9c8cc449dc584ca1fa8b16036cd5389a259b966bc3bb19f193e56e4c4073cdbe7bdc386d68e4b572e4cf88a7d9759f1b38cde276c12b002bc6eee106c75fde0d34891ac844c80866d47f192af11759fcfb6c4fc901a1239cc8561ca25df6ae2c1d880cef1822584af380c98b3cb6567dcf8196295625d07fd59af862a45da73f20483a19da877d3b27768f1f527476e2594a041052df198e4d84493366846d5f2c1bd8e13732541532dc3bfe576c54582af41200cbbd82ba9cdda17e819f6300d2ce010685e7bba2d807116a73cb451cc2e4dc937721525f6a0bd5d1cea9e5e6d9091b48ba4051e861403275e94cae0c8760c0d69f3ea64efc73696176af1754195fbe5b87f1b32a814eb3d34c40657ec492a9bf2c48746b3fd045ebb4c464e0c20b5c11f740d082470dabc140f9143b6d0820d98fa1ad8ed39a4fddff7773e1cc575617e52c0b118c0c72fd874243ddd3842fdec0a52de86344e48a8bb6112eb4b500ec057817dda916d0d68ec83382ea941e558bb827de2c2af4a242c6ce73e4088657d844ab76760a0969244c6f7c7dd727ea9ac1284af9ffa00b6965c094fef0ff0695656e087b643c112cf6bfa08e86e9f71944da6fe37c4f6c3cf6ace9fb73cd9649abbddf644f8fc0edf489647c5d7bda3067b5724f618bd46df115cfbfa9fcac3f09b91bbc0a2609c565620bca657e16f2369970199ba0134480ddcea277a906dff96e0868a08d36dfb473b19887f1779f1412221074a5443cddc1fd026b65260cffcaec23c5a0704732c1f269b179bc3db5a13e05172764c786dce5815f063bbfced5fe6d93a803d687ac346c53f87c31520213f49ceda8d8ccdcaba3043ac826758bb410ffdbef03409c5ceb41a4556c65a23bcd258d61a7a18bdbc1055a8b097656be46969d64303c60403e446c4419ef04055fe6dfd487096532094661308e344c0ab776b88f56f9721fba1a2c95faccc6b706dcaff1dde50952208d797cd75207f7555243c835e98b1a84509a1eddde40aaafbcee7e4427041ec5fe0b94c4d6146eaca10d909fc0fa0b6e7d9e5d47610028506e2a3f38c4abedb4250c1c21a169a39871d7aa65daa2960aa052b630a9bcec17f3f0b3a97e971921d57d4d94fd02b834c64750ea2fa5e4501344de9ca20a7f133e466e90dbbae6ee01850a8399017412e49b5608c9f7eea97b6bff1952296ab417673cc601281d380398af427bb4faa18beb1fc4cbd3d6acb3a90828c95e2fe765ec4b67481ca2141d121b97dc0ec10dba69f80b3654381fcb78db2debe07ead2330af56289bb18625b04cb66a733ea75f46834a478e6f82f04fa4fb5aa608871ab4baa9d101ed115f895ac236d20d3673ec6390b5612335c4b4f00fa9d5a1d78c25d4b4f472e06f746f3c8ccde2e8ae2be9d4361b5d8d3b5c45f15b27f74273ba252bdf2306b47e6175bbadf580b7d817de25a170c0e5165035ecb1577a8f486a4e199ed1086069bac221abd0a40d459412e9e47e441b305a90281bfdb1c5c7db4841c8f07c22c429641176087c36422936a86dfd8c52033ad78b4e225bcc2154cdcb6f2b6482eb9423408f392f154123bceea525aa1683a8e602fdf7aae60c5b5024ca426378c811acbf77747cbc53b1458eb17141faf9a7ebcf2e2f2fff41f4ad9fdaceb8c0933933eed90b9b2cabb58a4be16e559a734a80600a136a81b961a82b4ff36d49d12d4aa2393f254dc3427588f8f870f06d38f20bda26d33ecb2463694b89cac4b003cadeae13fa79569201f37b4686be76e708e5d8c3488f2892a5d8606b9d5117f0978f3e4e31a01a9500640804eeb2a3513a76c28f00321d5e6d1a3fd3cec9dff2a29a7772bd9a75f6041f5ad0e91d8704c3eb14a29a124cae029ed7e81a644a71adf61419f8e5b2f26d11a3632f3aae938df70bce6c00d6429f5978a52687e0b05bdf6ce010338c1ae439c6e05a31c94d9343818b8d38db8fea5d026e03999aba91612f978aa0f1c952ade0a4540830308cb5235c586bc790b09a60153532d89ff957b387bc59ad51ac8520ec0f49b396c606a6973249b1d92ac3614c5a7e6024d41a24c217fd324c4a8ad39e65f3e69c657917a79632b4cf28338269e1a307d9ced4a23e5b22dc3cfbbbcbc426ab07a02a68067ad6578b0d82e26432ee05619ea4ab50fbf6ea6fb31aeb5526024c685eb9003103b85b0a10f9c60946d4452d72d402aec2db7102c8c61687e35a3d5e8d3116830e388c40acf9eb008fd5ab24d545365eba744969dc9f248e509bcfa2a1c26a74e1004590cd59dea47c052f2cf70387af770d26d0d451464d05aecd5e608928db180fe8d549f64aedb9a408bbafc48f003218908d06368195f73f1b467647c5bfe275c299691648f41e254f71381b317536b6a3796320c42f81d35dfe2527efc50bcb6b3782f256ef68c92805da54ef7c6311fcba028e4c49df01196a15c0a567a8772444582d4ca3d86128738d0258410dae6632cd33b7ea849ceed60890ec60ac1d286339a6889866fd59702588e3bd5ce89152a103901052f4c248c3f3750985d34e2f2421ca3fbbda523b5635b86b952a1a7666863795a1094bfa80102673cfc34f9a356452bba7ff2f9a2092831a2445d00aa84914b9fa080a5bf9e96fa72ab0382c259bc0214a62aee9e3ba955c82ac00da810b28d2083534bac5f14b57963e89322507964c6cc0f4c5afe5872dab68a83c76ce3b1f119c0c03be558fac44cb9c1d3a79b32a4673877907033c7588505cad9dba0b4b5851dc4c14d47320e956929e95ac433cb9520926c98f5ce9e0342efe60f538c154e4a2dc1557224c3b7040a4785aeeb37fb29b54178b8a778acf818dd9b82c9c2a3296f6fed785785abc13f08aec18724f33705870ea72586c9eff24262f898cfa74a14bcffde26eab87eccadaf5da356629dc30deb9b6efd131915ff4d9ee62818074e682f4a964ae8877cbaf8ffab12a8dc5ed10865e208aa33ec9f6b8ec239e2a06c79907145072b52efc5188a3f4dfbd3e122ee9668c4ad10264534dc52e905eb13e1ab89f2092e18b4d1cd2d8a7a48a5259a61cb9dba30512a675adaa486eb9dd173495089cc7d3ee544f36b0ff051ea74f08de11bc30c41a8783893f4c84d988f4fb13f65aa48e1b1377b8a7967c45c1e881ec782bf394f01b310deebdb829b9848648161444078f38cecf64b3e730cbe0fe0c92922969f738543e05728fbc8f7df47af0f06d6e4009a9383e6346685ac4ec8afa45bc0673deb9d5ceefab816c862910167ae2269eb8198b9a5d12d9c6c2533429fff1dc0197761c4b9db3c8e0f547d8cecae6b4257d670a45e949c1c388f83fcb6489a61882249976634596b824519bce0dfe5515e52eb08259aead997542bd184b3dbb296a111e3975992a6ace7216c01bcc2fbb32b4fcc9bfd062bd5117f2d166a5ed22c7bd254ecee5473be417bc1e1f34a442ec8e42a6ab951842e2f4e080204a267cb8818a43978aa99b34ab4fe0c76f640295a000db5dcfac7c25c67afb2e0a8f5d9206740baa26e7536bf9db587e4552cbfb5ce3d1bbe70b58f7bbcfe3dbb6cfed23e98d4ef04572bceb3619da5b9e437c60032aa7d003607541415113af0c38d9278906c4bc1280412aa9fc9a95531835ddee53ab438e31ac14cd59c82fa689c3d13e6cf6f181af2329eb5d933063bea4d3cd57da6607f89c061717083654cfa7337fcc8d782bda54fb852bf3608649e5147fa4a245de4ddb9ab44f8c6c069355594f22a86912a028d35091007441edb088e10591cc53ddfb80e092679d7da6ef723b9225dfcc29aad154e6a16a7a1625ed7c8b852ec183f9758408841af36765ccaa11310fbc73533fd70dd367bbb2ba8818ab50caa516b0353d7f0af7d8562707709c57bed7bdf2072cf92c6837674a753906ddb1de177a669c7b1bcdc7e58b202500b3097262a2e84d9927171a8820c0e7c7b031969b5ba4e0755c0579b604ef4bd26a7bd269464ea7126f19638679a53e3e355d88d84334b3763312a377d341570379b8594c9fd37d057f775bcbecede22a3a035e82ef3423a859d72439f7fed32a31ec734568bc3d6749591b4555135c910c5b6f8720f8908e9c0c4419c3ba50a549ab574bda45f1d9ad3b00c0553f6ab58d88e802e0aa0b3733802a8172422d1beac485ab8e48eb0d704c32a1ba20da255fa4fbd2886cc3a72bc76cb05f3cde62cb585c8fe83a42ce97dfa877b1def08fe7a3fc98f327f6f0e3a659f94433919940e869f7101511233e09cc55e6d775d531344f6491ae6dc353925c4e52428e5ac138b292f5b711892784d2c253db39cff1fe552f09191e0a63ba697cd120928cf5061646420f27909b49612b4605cf2cc29fa121822441176106d00c064511b9a7c19ecc678719144d0b2f757600f6495a9a5cd2a0eb213e15e395c65b89eae1de7039870f6ce612cdf5bbc5c9526b15bea055a1ff001b573c694d6245e66b798ecf962d69c54ce753b4acbc54ec687538fb2f23aa076565f7878f0e7784f8b0eeac85db77792e37a8e51752f8c9bb37ec85dbe187d05f1d423232e7a02b2cf3c65a582753a9f2edc284668a785974c458a0e18191a9445cb8f2c60eed9f1a084a59baa376250957fd3ea31bd460cedf70b8346fe733b174b74514fb8cdde059e4e29534df3767f51795301e1df2bb855af580074accd847665c4e278a38f52d40afc7d1b1237637bc58c354769f482a79508d952c9120d10f5ed57edf64abe7d5e5d062868014e8bb43a216c3f67d9727a53b0b66c657253ee64c57b6d2c078280a40c15f614f0b1867f1bc5d3708159d5c2115d3cfb28788da8b18a31d75951e98531218af0c96188ca66c9dd3c2a176cb2710eb936565f6d41ac445071dd310bc3da710706675590f0e9d65001b44d31df70c3f218c969c21a34146eca73492518e0f3e41a9e5261553ce8f27540ca0ddf1fd782f8010bf58772137e1a9c43ef55183adc183d6072db31e57f25b0b7c0224549b75c33efe01afb4aced72ae4363282181d395af626cced19e217f362e0b812db8ef2643c198ee335f93869ca7c194c9ae4c4335657368a3c993de24467eeab7f5e62f1c7d30f54a188cb0735445c3c0483341b23da57e6b0a842b0eb34273636aca41adc7ac9f5b278589e6f4133d58c2e2c23e3be43a6b62e8c93aaff6cc7c224f0f11b4fbc5e150e4e7247c5e45e159cdcee13513d9612d897514cb6c031cb38c313d1178dd638507dbb4d9fe7b5b4a59933e640279b0d709d05a615297344d967c7ffce35bf2b7137ab5369f5123a66ef58bb22bafd62620bec56aa57c743ab5f2e4664dbab031e3ae221f0ad11330d78d9c3b0e9b96d04dcbac8d5cf4be1891b6af41392b0f48356a05e9300f52b264a1c8b0b983fa56e3682520bd83b4eda5c04a4040a31e51965e12e8f02726b9709fa949f5965501dad43bc88ea3e01bdf3ba9062ad5bb5cd2f0762aed759086902b6663cca361e6ea6a1d9c97b1a3d48a8d0f71b347ee0376750df7e9b9b7144979dd2b2be94bd23ed389c82fffa439cdf37d5b383541f57bdadb532207a22f43f586b199d6d93b31ee3b97227e746f4cb064cfdb595705610883342710dafcde08e694ba32bfc0724fe2322cdf558313164819f54c7956a7ffd522363dbe86e910ff85d591da66e46e6cb11f15c12c46d9072db79935671317c87ad78c206b06287de639dd0b31d4dec1bcdd89d33dc2642b7dd29d8bc2c87732902dbac706a6f73658d9964dd7ad5dc65a8e7ecdd1e752b6486db44a6627e8a1093088074db20843929ddfecc1d0d9d9cda92d8e5e4b54df2b992c38d93bd46e46de870410ec065ccd649b0ecc00752b9c22f1931b3f4690fc46083dbf668df0dae261ba92136b1446d42eaea1e0849554a27e1b3356deaa4274188a63510faf2cbca5b8dd8e5b1989d84b08f9fb75d6b09ae06b05053ebabba7bb285cd0da881073225e125d1671b5b918e0d5f636d1beb7f6830cfd043e28eca17426ea1cc0c33d9bd9d51f9e5d241f2b2fe06ecc76849345552739bf3dc6f16743560e2a1cf85d86974b41bac75ed27b1256636d670834996dfee7c918d5a1db1aa9ae7cdc1328a71aa8fd0d3a7d38576d7543c9fbf91cded31cc71acf7a2738c64de69367498247c3021a90fb4e4deddad0859695989f815422fb6e7d4c5e7417b317bd4939595b881c4fc2305951dea124d73497563d3437e0278b897de3ecec1b0ca7313e72556b7cea888df4f47cc6edb07bd021ddbfd204a6fef637c758b79122b10ead02319e3d79c854836197432da46fd0eec9340980d8f567a805218df2b54aa7a562a9db2f7745f7c6fe805f8eb69c5d22b8666f2bf12d1be9ec696229e82564b8237f4caa1f7021b8d9e3c0cee658ccaefce6e50df8a52828c4567fb04aeb17a6066eefab3c26229d46e4ac68a5082e243b8ae5abb71eb92c2ea24e283257cffa4da63bb98f6c7dd1a5c751513c702a11ddf13ca3df7b41f07e28c5245b2f10d826f3a3d5f164eec9fa7bed77ffaa48539791a3ec46a9d7243ef5778066a628615c5fe18cc7511fb5ae73009a61045ff9bac3f2540a15c2ce6c86b606dc0ef8e8bf1715bd94ebb898b9ad8bc46aa3601c3be38dd9861838c2dd396fac481833948e9e11ccfe7ecb0ab9506c0f670069cc26a9a3c2a1711f72c890488b325dac6cd488df3f1ed73c124d7482c3d6b591bda0bc22e1f1881ce7e428ea9c01452e74ff949eadd11afeedf2f3b8cb6b51d71ebe3ab8fbcf4962cef8f3b55cd30f59d47a6ecc5033222bd3c2cf06780eaf53c4fe0405b7a7bf0c9f5ee79934c859bcadaae5b47709fee355c6a8945417d2d05f0472685304d9c8b3df98631b939965a86c7e1b5b26c4e3e066523a91ba1e1859be6f82797a8b4ff04fee13551c55524ef6777ba8db84d3c7b5c0bf75701dd5f6308404a8a07d28994b8d20a62958bf774b83cba460736d0443253f13eaf4edd547e0c47b20ae213797f06207899b1dbcab76bbec102073383c39e099615c444b3fbe3c7001b59ee504b33dbb2de4623c90b99d16f84c4f129828f8d2f2703e047ff3da1af2069c20ff9edbd6371f9baa0bef72c860a9a8f6bcd984fb13e134231898e8e6a6545245fee7dbb7cc7b34568a003bb1d43a00e2762acf1ba194ffada5a31a3386463012ba98849c05a6c2ff02637b50bbfde36f2c8c214e2b29a89a8922ea039cc60ff03b87d70a0badffd0061ffd1b71230b6f4e5538db6f97018dc371ec8238ebf4cb25ea9aa38f3a1da2cda8dd090e0f353d0773f8819150a49834c561a514832f0c4640e1a576006e3b9994ed123342a479fc22ac31b68ff270590212e30d06b528fa6aff610e283ac442bfb6d43073e98ad22dee32ba421860a09e8f0b8329d4a143b04eae8ae94572018564d07fa55238569078969d54cf5cb956ff35fc8b9c5b564e27f825af35de81fc0b07094e810efc5ab07d28cf2f5a1afbd80c17c7b2e6d475179f9de2591d9502cf82c962bef9411181a59acb5dd6dcbbdb74c29a5490911090d0993b2fc0cd3c84bd1ca5c9ee57fbcd0d54695a47e652f3f5fa7b50eca522b356b86ef5b7e0367303dea353002a647417901256864fef728d008939e4957da7f7fa22b8dae381a0116d37b6fa22b8df2d8e0c1ec25a524ccefc3fed1a4b4522f292915292d152941e9a55fb16a8d66b5d2942a4a4b4253a477ffec60223e02c13882da8492e7c3b5a98b696464a494f42449a594f4847ba86c94e4b0af5bdd9a524593208d552d8ea7bc55b5244646566470367a01cae4dcfb1ed3f774ff9d7c53a53e55135f171bf753fd63424242422e0483ee2acdf2188322927e2db5fc8f04c5190ca6ff6eef1cf71b8db318146741fde2a84bc90979ab7beebd0e8c41cd9a35eb489cc5593cb23cb86dd631688b3fcd72afd2ac1947a08db36df94b29b44cc359e38c082d7c31fdf748b3fca7591e756c3043aff2d3af3002557fef8fb366b9185eccd07ffcc7617126636cc16c2aab442a5a0d5da8af70a1388b41314914cac2199cb3bd6f9192ce11b4a8831beee7c3c2b2fc909d701395a65f11475b2529b9df9e7e0c27ee2568921c2b4d21c6274f80c4620de4c993053223ea9d955444985c84bc8537e7dc5e47bf76541d3f79c2465e1ee68da45ee663b38cc0fccb1b91f9d4cbc37c4fea657e5f1ee66778791815ccc7a45e4616034355e1077c6acbbbbccb7b3ebf9b2def691dd812c3a9c7e93bfacd7259c5c0f29d4bd77d0c5b3b3a0123b8b4d090270bea44570ed161e2e0533a500108581b1d3bdef2582c0a53a337506accee90e0f594224588908874a346234ed3963e17f24b98b1235b71c444cd8a21ff082d4e6c212da64685842ccef6f139b030664268a50831b130ae824868c68d32d1d6c487e18a19ae9426444d84c8cd51309071a36c05142cb4c50c9988ad581c260a9a5b7fe3f38f941ea8e32d9e98b404291f0df16d8098dc48b33f0ec923d206330aed87634b4b4b4b5bc34b8bd3df42cc96664b356ac84b4b528ca8cc668be3aa5e7b8684830a43b35511ec5284efbdd94a5bf3518f8ad14590524707ddb3214cee48d06c0593e3244f478be9fdf7212f2d2df9077690d4fa286c26aa7f0b6dcd13ffd9d1ec0806ab252647bf66152d1135ab6753aae6ab583f9b813acdbad17e502a38c2005118200a0ee2274f8000d91a8f271e4b63cd5a4101b238a886c97720fd1ad2467cb6c68b00591cd49a9efb0671d0a15bfe9ec97bf93398e49b3caa7213d73eccd65ea7794c3171d00104fb42c0b2fcc10edc898c63093138e2080328f16fbcf5e0befba9841939ba1ceb57a76371341ab7c65f4764ca71dc33c7711cc771cce9ec881e63748fee1e9d88230c10a454a423e59c2ad53f8ba507c53e6a2747db4e5ca7b5cf6b2350403424733591715af5ef21e6d6ee4ddfd1557ff74d79bc377daf9a32bf6828d5fb49f54602c35e82802a33eca33e6a4f478bd9e2a28c656ca48509866461ffd4991bc8a674d0d1d1e2b42aefd025256f3594b97dd8473cc5c4d2636cde50ae1ba4a32ce6ced6f8efd0b1475e142495514b8d5f437f8cdc4b6e084ea4907ea0a4aa3175b498f181bcef5e8240a697efc51b0ed4e181bf37e277601052d6bd099cc5641d0563ecb135f16752cf44aaad708401a8503aa285338c60c20b24a446ea21cd356f248f48dd410efb81c443fbba2e8132bb1a36927f4fb31ca92a2d212525a1a11c1a2a8a485b23f5775bbb6f284da36c458acc13413dcd6a169785c0ec13fb1e6d38a07e6b3179df694a66217d0275c4c01b22fc2def239bb4e57be6b7b8fca42c3fe9f3b77d38abc61b826df95751a2cbc2f23a5ab0b0fc747996f92c2e39ccaab3353c321670653e64ebf22b9be165be0b9dc1e55ffe851a99ef42dfc79cfcb29d9d214c8dded4883951a3dba27f544e9c38595282c24a75abe69aa6d1d048d59efb1483564376e25b8d4e9a81a834fd5a699466259be59fe42aacc44bac2255a31fb989d44fbc42697989a548696f5efa56ab4070575a1ab26285ad100d790fd526da568c8d5ac9c2c23a8a1e622b435678d88ab7aaa9720f7537f8a347c5c54f0d555cfcd4ed63f5099aba0dfc8afaa8879aa8fb8eae66f8154ff7ebad55cfb788810427ce00faf99175b4089350c98c65dd03000b2159478dbcb7fcbb1e0200164232ef4d1f4e303c6a726f2b50241dc2f1b7cb11151aa91be5d99a9a33a616919a189239883b4f9e00890199b1e030c340a849b37828a6b3e38387838275002af2b356662fce3910878d9bf87047bdef28ff3c01528185b110b327339e99fee3ef4d6fc4fbee5711f8ba377ddf77db394286a2b6125b23f3e4b70d7bb24f80c4138f06f2645b71dfd775ff51fef1567be0ca767cc47a9819ecd1686c891a5b9bb8f0c0096c4d911f220a186386aeea355441d2b0edaec13db00f8bb31c0dbf2a5562373e4c38ebbd8b860656031428cfaad1356860612180c244b6c6bd3722df7b55b38c98be7b23decb57756f2a22dfa34578093488e2c40aa6ce0e1f3cae184f60719a01a85ac3426147319dc0d66891099a29720aa1f8b359cf869634144b584bfac55070cf7a36c6d6f8f7ac972c599c1a8be335e917d146a559eefdf258bee9377025c3f6de7b5b57a6f7a9261d2da6ffcc7ac6ceceeeb3da4b5c9266c84b5b2fe996ffd2d2e2543139863206cd0c6b4613eab62125a5ad7125d373e553bfc7b589884eabed4fef23dbbec8e93f1ad48342519fb9bb134f5af1cb4ca07ff14ee4317531b6c65fd290a99c86f850b358dec4a57295c5611b2cce149cc3bd0fe11a3e12d8c69fc1df1ae7236c8d3f539949bd93d450b452b4f546f98bf83951cc90bf78b27decf7daab2117797c014a51d1e2a0166085d9af6a500828b0a28546568cdabf15bd00e5c88c553ef73f24fdb1de6aa9ce5035a104e42d4dc8452626e296a3aa7b0fd68be52b22c771dd640ad7ceec44324e10d560c316ee14efc4bd9f780cd99e33ad4ca62e0a2477f730a8547777f73675ccccfcb58666b91055b3b478e49b4223451e0b1340cd02e1e60ba6a1a1061d4d262751d5fb68f8d1ac06816c527f566aafa77ddb27995d4f3c4cdf5dbd1c24f3fb0f0c53deb2afa3beade9dfeff9f4dfcff6de49caa424076c34987e00e9a84eac595cec95502de19346ec7ded46d2e583f71d3b5eb862723bdadd6656d70dd0ef8ded39106816936d14dc161050102ed9ee8dd02647d8aafe3a16a7b759ad511d5be36f34232f9122427c2d06fe3670c7d6cce21f49a499446977e2c1ae130f66b96dcf9d786cdb8907db1079c7e2b4941dcb5bd186590c6c61c7d6c4aed69431b748fba8452d6a45bb928692a352aa543cdb56fca805ddaf728931b5f86134751169b57fde166c0c31f97763de92287d1122448af08f91d37b46beefa51de799c358a75f92b12217d1906b9774b458f17ce1efeeeeeeae0d2b634939a74af5bf446866669424099cb8b6057de556fc1f5322d4443dea13ba56db9b561b95ef99c0d5f6dff6db468b98be4868436510079a6675200f7bdaacda8a1f69c5bf490d549afdd674d0bf644d8a71d0d674a4374c3622ef6dce6f9af50ec66e629cb7129389ca1b24a67ffc7d0e0cc25cf731f87734d4c12be7abc464a237373753e686c38c1b3feb75bfd6bdbd473b1f68c314163d62d12c9d39da0f67aa7f642f52d55deef939d5fb3303b13929b6f157c9b04c97df599c99da55d3661fb2ea56a9301ff28f0bef12caea12ceeaa2727917c01930b65e68285d5cded2be411d5ba37d0b28e39aab744c3077e8786286aba3eeb8ba6ea8bad3c2d3786f69df02b8c918887f645840ac8dbf3309faa3d424694d1993a333786979647a2e7edc623c746851e3fa61fcaecaaec6fac5a604cc5ee625c07b36d155b71addb1fd72ccbbbbbbccccec03cd81fc581b9ad529246618abdaaff88178ac63ec0907a9e8540094c9fbcdfab56240d7fdd027523e622726589ca50c84ad218273980bb661227e1b48a653a57803cf7dd09db8d32fed9b3382faef8d30e941f507808a2fcee27415f5fdeb33a77349e6c4dcba32145df19cfefbfd69a29ce7799e4783b04b902b03bc37bd04b972bfda7ba14fe5368e934de639b548bf18461c323517448c1e658c3146f931ca788af251ffbd07aea47bf74254adb4e23c507e1feac4f2a8ff6c60097956dccf80a29f0f91cb1cd63b08780d7d6a0e5e25ed80aa863654d093d473f09b153d468ff1fbe53488fcce412985d810720ccb36a65f55107feeb977291d0c55cb36fe72d9669bd537dd8a1fe3c78f8f030a5e87e4486a9c2f98e126f120491224c6e43a3defa3214dfd7ecef024294fb3ac70c14993aeebba8652f953fdea14cc2b356c65fc5e04e7700c7f0c98029154d4ebb40efd42bd783132df2998972f1303bec36068b74481486a880ab28f7acfbf17d09f4f2cefb1cb7b2e2e2e2eef53437ed4cf6ff1a90b1a11aaac835627f522d806f53ace82fa667dfffd995e7b0f1c126b381769a180daf4e6b9d9624a2a562451dae4eee006c2b407fca16486fb45f5d7ac2f6ee6e68fdba9d1a62b3dcff49e27e97bdff4a5aa41fae5cbef972f3fbe17411824c2f7aeca20bdbcfb3168bfaadad1b07f07aeabd3f257c957a7c35c27579d3f7538fa451c674ccd33ad121784c7cd4d554b6716b34851738cb9608637d52b3355e2bd4757fcf57fb35c7ebfa4a11055e53ebec781af82c2e47e0602fd9c0e2f549d1860fa659b7d1398835fb952a51015a7e4f42a879de80ddbb46c686e1a0e28cc6d6e59352d3c1f5dc3c54a1931c33df278c7b4dfc1543b683548f7df2fb8835655ddb7801df79d0a0ce2fdd7f21e8d0f650bdfefae5aa001aeb760f6531f0306d94fbd27f31d231313f3316c8da1f3431db42a43c3fd1db8c63c4b0a44c580a86f01c3af2d3f659d3354d5f9ac96ef96140d676df917ba2ddeb780de4f904fbf27d469dffb408feef8e0017b7e00d9251b227e9822d3ddcc63d8babd1f3971a3973e95034065f27073730f590e048f8eaac816dcfa2c57ac888b7e84a44d295aee7fa8bc25c4f25e6f5a64fa43cef95155474dadb434a58a49d54b7e6c520efeae686b8d8a241c50d6b5c5f2bb16e36fee1b75393b7f6467e7d57899b58d34aeb81f5da056f9635cad4ebb2a9229518b7477777777cde0f6398dbaefba8edd1b1debbab9315215e166d67c848754184770d7e2a4dc592e4735d77cdddd571b82b34bc7eeeeeeeeeeee6a404042c25c1a6ec6706ddb6dae168744a761aa2e15a2aa38ce6816444d8ba9d4862b0d6c6d4da4b2c492ac9dedc291f94525263f043cbee1647e11c73bc093d0edd6742d404249696347ae5d17ebb812904bd0ac61695b27263303978ea5bbbbbb3a7476b8bbfbe60314ae9ba4a78991a67a8cf1638cc1d3c8d0e0a607252abcf8a93a626e00063ab81951305a23be99a1492dccf5f1a5c346d19166f4216e6c61b12df221ce2913c98a67fb01d4980561b86f19478bf0006af54688cdf02dde6cb7941d28a9a10a6614e10a71ee608afd82676b78fb1e2da78c9c2a2968c25b1a568011532ae1015309031cac3afd38c6703253d9a5850b82704105ffd6dc0c8183b66d0ab8c18cbe3726a0e2abb9c643c9905885a8aaffa41207195168d68d2be68a69ac6dcc75e372ddc45c31772188b9cfcf4dc3e9428000ac4000025ed024a5d269275430bf206d0487700d573cdbe7a85a5dc5aa5673d41b244bd1e7ee461007737f079ec7c2271e2c30986086128623338c63c030c40c250c258041081866b131661849304309431031284000cd30fee0430f30fcc49610bb123b23968598951816625788592156256646ac8c58156254a83043398526cc304a21c684d89458146250882921f6849894181951624e98a1bc39f188ccdf64e77ebfc98123478e1c07b8e1b2b15153c300390ad06211600002a0c911000ae6f81772a8646260523972787302beab4d43239535963ad81c4f981cb5d5e2af0ba1edd220cc6528cc80363b989c52f1e0d97eb9a836aa4e83528bb940f038a582f9c5a5b919d826a8b85c37cb6d7477773752a10d8185629527e62d33263f8d8e984e4cc73da6e3ecaad1356a2c165b72edb535ac4b49877574474bda298e757deaf0bb4b676773de7c73cd9db96352ca2ddaa21063e48f1c9963e418636466ce821243380942be7c2edde10a5d747d759e309d7ed17546e4333a2abdc5edf4f0fcf0cdfd7ff0f420f1f4fce0f9e1030724a4f83c8fb448fc53461939f0bd79c2e46f245e386bcb0f63b095b9e4335339a56f344cf949f94d3919082808498c31c6e8302957ca8d0a25ddaf4cfadae041ebd8d9e1c3c7fa30dab1e363870f9d98d18e7ef980b2b3c34865a4325aa3227cc082e5b0dd90f56f2305373d147113589297a50d1bc81d3c3e7ad649cfff7f8f0f76e283a7c747cf8e0e0efd6a293a48f1e1e4df8976c4fd87c9ef3412c186121c5c6c8cdbead76ab491c5f4671e19bff8b1582cd627a36fac71fcb8c7474c92deee1f234b13232a6d4adcb88026da2862c6779a57ecc10a2ba0c2c60473ff071c552633c0004744a1b4d42db9b7a4f4abbf593e4855350d4ad84242dcff38fdb7d250e04a5b6dab2db1f6018bcaa34ccbcf6479af4fb55fc775246b37c76aa140b3988ce58390b20ff59302c50f42ca58bebf4d3494df35fac6bdd7696e6dab73843760b571781efd28138bc93c1c9cd1691cf4c7bade82c02923cc8f4a0c1145255e49d33f7c21a1259cc352e3f3139ce3aef7a9517e441cc672677b8deec075d563dbe88afbaddbd7f83efab59acd8aa966451ecef19faa9966c517520d11092d89ff9ca37d7cba38b2002c6c01db8aaf52bdbcd4f0abe7e9b04d7c1b38101af2f84ce4424b8482f00212932bcbd788afb99ed53199bafc3d68630a734a2bfeaefe58ffb3fcc767eda9e21c2ff6c7bf45e6dd969999b5cd81aba6451a75ff5953e55ebc80c48cbfcee29c53f5afa1d33a382b0a5373075fea6a77e01a9bb5aa3555b862cf72997a57ecfd59bcb3699d248910e74417308c7fb8d5a4a578a2c6671faca8911a45258492fca49e309224b29824c94eb84f960935fe326ce3167fb848903df4d6834eb37af46baf759224499224998bb3712fc40492193d9872c552154a5124c50069f6d3ace82da9107be80d3f2d16718e56e333160cd3e1567c980b1f67102afb60f5213f6961e6439652e3cbf8a30b9448cf502d52a73c537d7c3ec239343e3e13b1381f8879993f81f6a80fe5f62c1f320ab89f1f9ae4b77cc829e8dee5c3cfa402ef531fa23ef03dcc877c84731165a270abc4e78161bb453887068d4fa45f2abacd42559515452aca44a81eea9aaa9b7aa84430028a2afa4f1f9f6fb03839a070b03d8b15dccf1cc86ff9f8ac83c5c9c16507a67f29f23e75c5f730397cc0a7cad06d6bf863e83e0cd8c9adf17f013970d34016d0b7c61f05f6d6f89fc00fe45012111111c56ee1e3cb6e61b265d25081311e891ea744c1094b62288191e4458c417416d35f0e3c7e9e718eaf64a041e2f7f3125715f974f150ec8807cd9aa5c36d0ebe8a67fc9d9438bb3454e0b79675a37a04e24f90bbbbbb031569160e2b568cd8c5e11805db8abf48ccae2e1293a5ee7b1e3bfcaa86c3e93da4a8bd8c204db4ab818666c5af3e4ccff5d9a069b4039c13bf39686be2bfc298fda737d5f56fbae27e340bf938c15c19939ed3a3e429744d000c23a713c7bd7c8e0259c9c00591b32efd11638cf1ab21dbc4df6807d826be80c4f4aa4685b04d74c5162716bb71a3d5025d350685ae1ae4faa88d247c92383185164ea0a045932059dc2a5cb4808c2557e0e0891bc8e2e340445b23974bb68906dc473671dd9bbaeebfe7388ee3b837fd07e6c043e538990357ee5f4062bad47d9d18e798aa8e1466e8aa526adcc7869d9ee35e4e2893fb0fe8f441bcec449970d444439f6a7a0e0c5395ebbe5fcef13e1a76affd09f4c0651b8e6f02b7ef5275d3844487a53c153d653344ebf4eff4bb625e6f58cc0050994a04098acf4938273559a294482c0e72e962a59ecc9de810e0a8ce3f6fab254c0eda4e3c8666c84040fc31a859364073a3374accc836fc0ed0bee93692242e8bb12588c66c5929d761a8d10cf99ee42212bb665c31a58a1ae3af8d294c3e121f8795189104c5e725f139283e270932fd00ebeff39f296b3c55ffb83832d6d4c1e92da0b975eb0f53e176e3930924c46165f2f48b65dceff4cb9f7b95c3b4e77e9d7b710e3ff71bc37c641caa72abc44ff091f100adb75e035ddee27e6abf71b408d57e651a35a2f137ad21430761552948f9230054e6141f99cb6f0f38e7abfe6c04cef99e708ef7dc6f7f7aef4c9407a8e5e5c39ed140e404ea0032122bbd802aa992a1e4aa20c2921fd9ca989c7e654c563dd80aba92a1fbd39f681026da5a7d987cc4391f0d95bcbcbcfc0be58189f72fef1e5df5a02b193eef3f9a835fb972a2abef7deae99de3baf7e18273b6ead02c229ce3bd3f5bc1433cb08dff067e1fb86cc37f029b6d3807bf8e13e6ac5f414eff3d17640b7903431dbc6e1f64fb0f3cf10686928714336424cff70c0eead609dcfa4559908d2fb60c334a0086951d9401c6139900a0d08415bac0011144f081d680209e89eb4e2ca7ed4fdc7bdf7b1e0dbfe728f79bb76d9e89eb4ea8cdfb8e3bfd0686aa6f7aa733ea29d4a1723dd10e7c75a341ba97f2a5a77d7b8aa1fb0f5c79bffdc979e01c8eae7abc5fb9523f1af209fcde033f707aef17042fec7cbfd1f0f4df7be0ced6d3fe706ff268e813a6eaf6de096cc981af54d4e9db3e34ddb05b13deb05b13b2d4ed4f7be2e15125b397bd6ce5a07e6db0171abbe5bd7ba8ff3a10f51364241be524ef6ddf076ed010f36bc848b032927005153680419426ab841fc0200a298096b0c18f3f0f9cb3d589f48b8586a6d7a15fa6979657796bff05dcd5f63e32565a6d9407c847e6e3042e1ff3963f939e1726ac17a41770fb9531f1be884c862ad3eb0f7ee58a8c4990cd01ddcb16cf034355dd13cf7a8bc63ad49fbe0141b647a158defb664199e84db316c9f7811dd39f7e673f4004042fd4130db73751d37bbffb5a9d7e2beabde7130fef8b66d950627294930435eb6668723dbacfc1af5cd940eeca952b57f88b9ded4fd48523939342d37bcf7dc8485f540f94265007dbecef09021dc5619b7d4913c036ae66ed03e9619f2a1be623db361f474b4849a85ea9404a541037378722db6adbb439c5ddddddddeba64530c6186560a9fd8b1486fbec96f60ba5c666d69a9bcaade918bbbb3b0641f62fe3222366669927a1a1d9dd5d9ac5e16ad55e2bc275d3215c3882530f8ee39adb9ae3389f1aab772c32d25ee02d4de8e9f42bc66e5fe73bd0ebd8fe1287ea34723d664d400c66fc306adcee1fb5e81fb5f6f66fadbda51612f9bed4d788a9685c373a8a8c3ac618635ca422efd4e3e5abfb77463a7b0034981a8b8bc050412aad6aaf83a86a33553321b1aa76c54f510d6faac657acd03c7677779f64e0aaf64e8427251226901e2a1ce02a3502130863f211a021cca01d9a631827b839f2021c55b8d1220cee066fdad52ce6e5756f6fd7da63edee4cf33d3f802c7333737312cd7d7384c9df492d18a2956cb05f9cc9e06dbe1c4310edb7ee6a52b4e83e9130b9d7847c4c982be5dc7e30b9d7e4aeb6bbbbdfaf6dbd8171298aa58d4bdbb631d7bc849716a755bb3d93ec31491f99f60ab0c264216f45284a50fad54afeadfeee5efef61e7f14f068c84b28d05116d2e9d8d6d49a336613733fac51e517a754b1126899f731e6d26e5cdbb6aba4ebe86cd06582d9bde97dbab66d93db6a15810e0888ee3d0a8469db9e9578ef710734c8224551b471753f72ceccd2d4b8792036ed3ff6cbbd9bffffff976099ea564f17cca4d9734e9e9cb3dd02eedf55f4ce5ad8ba5cf34dd1c5361d5d2e971833b022263f0c05931f1634f9612798fc3022263fcc04dc073b32f961434cfe602598fc3021263f6c36f9174682c90f0b62f22f0c88c90f039afcb01f26ffc27c98fcb01e5e3a548a739673e4c7360dd3301fec67f2bfaebcce98fcaf2cbcacb4f0bdb0b0fa5e579833dfcb0a937f3967a6ee7b2a99981994b735fd91086f8bd395ba01d342f5ba8fc154f54c1f83aeea79dff79d3e0665f5501f83b17a2ca9ea427da17a2d73b2a04ed308fbc22e1d3ba7b9d9a6c54377779688da628c3146e73e4df3a2c9ddfdebbcd0dddd552a29e9ef0b13eeb4a13eaae57c739471466f59efe5db538cfc4e4dfbbc1e5d5ebe1728dcdd53934610cede9c6bb1456bd96e70f20031759bd560b8aadbac064398da6078a33618a2be06c396da60f852678b97faf6b434141233c6e46f21a9130ff697afc1d0851aae22dbec73f5eac1a450a14ff524a478e897eacc436f6cd9526391d899a677727350dbc0b83671fbdd6a14818c5b6494f79d4c1dea047e9e89673d9d4c26936b3c3c2693c9b5e839f0155e56d462d7997630ed6e4cd59ebf4f8bde2f4df540909d655c9bba6d9a465d9a877e71291787c99579a8fcde6dd73386d7bdc658247631633482bb775d67f23c53f7448a6b0040f13ae5467c7ba9ed9193cbe242b01fdd88c796aa75a669f2d88b0cc6ed889abf21cb355940d449fb5a4cdfe914bbd3a29626b53c370e50b507c88e3acdd34993c984faf673a95e35f18a015cf9bb324c4cd8413a96f94d17afeb561ae8e26cf962ea7e4431e774bfcf60cbb2344dc6eefb4e3dfa3bf5687191a18b5cd8e9b7c6077a9aa4ddda68f1970b41bb70b53987b57e6999a9af39a7656db4df97900360d7a879a0fa738ca6695e8cf7279b989ad468dcc621000dd9c21380daab97da2724baed7a91c1e4a79142ed94150f6294acb4483c03d221a5094a8a122aaf748245ed3ef6ebe573271e12949202a9f1d86a542da9ca1afdc948a24a1eac543bdeb2e004e6b879124855f8f852df4cdd8812a5f6d330820a520d9c50c2063750410d8a28c1132bcc6e009485144270319ba08a720219d9105184a8e044141c4491610a25328e18c20a2abc904501c4171ec74898231ed4fe5494217c504609a2a0a207339085aecac3145688baf8d142c90c9969080846d3fee5c44363172327fc50fb5bd893000a9233ab29fc5c82a208b59fc527882f9e98811432a848b1d4021d0c018a2a4b5ca10a0940c21251a43ce1028a1958200c29bc60ca93283d8862a28147c9817482523ac90b48c18ca01d486185143e18c1c4193f48c1628b2dac38143318820ccee584a4967d3aa8ddefc91563698a1c28618615491061937eaef003458913b2c0820d23218ac045942d66401416f10324883822849312c8927e30a92628841044120bab5c66cc50a55a1cd38987731398a8fd9d4f0ea45005165c607414831588400a2394a8d00413aea002930c8c964879e2e15b8451fb3999a31368f1042f8a4812e4838915513061450c846a607aa28b24b64d014c50a2ca052031c34f353306162a58635c1f2831250b244800842b84400329cc608c2e8c9658420f64f1872906677c4e0f20c614d22f7e1b54333e860b360c283041e5092ca87cb1c411164064d185135c44c18127692185d37ea96fa6b80050aad4ee2ff54288ee91dbfa9d8b313a07b66cbf5713a67f8c9b16abc084a5616ee666e69cae3ad7b2cd8adfaad60cb8b0d386e1c491ba812ddb530ca81ae9f78232fb8b1f9f0a9ef671abdbd3b7a12122ceb901e76c1f61301f1f06fc91629bd8d33c78b626fee9b5f7ffb6dfbe0fb77722edb7d798a85f1b8d52ce498486f237a2cde326871ac6518bac44b3a2c643bca4beb4d7bef75589388c87b65525ea1001998f61634c5cc0c25831be8ec35e728a1abe34d8e20c7991a971888baae20c9134701667c8f7e1cc599c21a7958ec519829a41c0e20c617121018b3364be02166748cb2fce90d4c76c8df72fa0e95db697a0ff07ee2077983ba8769075fb16708709f3310f84ea65feabd203398aad896f02598aad89df815c83ad69c24530473f449a757384c9517e09b0b6928183cc6645cd85231a11180f45ed599a4663b8151f00350ec5d46898eae3d768d8cae2125181459888879a45c33929b689da72b34ab3e2cb807ce4adf831e03ab71c050ce522908788b04d64a943558a8e8688865a966848d55195c563eabea77dda89477bb12d7fced17e1f89738cc039dafbf79386a1be2ad587196e12f395c5ece79eaee27fcff2de48db9a1251dff33d4bcfe9bfeffbfea33ccc3732bde5275ae4fb165ae4f45c6d212c8c81bae5db61547f16d0f50263ea843199447f3ffdf74ac1e4817392d0482107853ca58be09ce61c8d2609c23dff56e75165860c249bac0c639efe439a09b12f329605c44bfde2a06691b12f4ec1b224d2d67c91d44a9d82270dc6da109a5c85f29466f5731487668980f2c036ae15611b5f9c4eeae11f8bddb8d16a8160232175232531fd9bab68403648e214b6710da9ebd30b62e46afc9e1f0e53752b3ef34c75ff3c0261caad7bd3378006d9efba27f2f3f3c39d26a316ddbfc5e5fd033b2fbffdced6a5e10dfbe10ddb0b5dc9dffae2fe02fa68566ca13b7434eb66686a130440046bfc8fc6377502a8f1b701c477c5624e3f1792aafb315715e6a62425c3765137f5b0d4c75f196531860070b292611dd401ea742bbe0dd0e4d96956fc1b23cc90558373663e3e8d854967d9567c961e2e4bed3c99fe7b5464d2028659da616a7f0118b607a8dddfddee3745d1e9aa07f7da733e35721fdfc6125303c2e4ef231f8d4bf58f3d83511dc57a88671202a1f63f5ea7e316b76621b1bbbbbbf72be4a1eda2072b358251651635fc6a0d4aabc4838621e6d69887f93036f3a5199525a0548d716b9a0d69667d61316f796f202f154dfee8f25e0bdc9bbef35ab6a7f12da9a711f330cf8111887998f7560a1893a72c358b86a01919191a345ef546522fb3270778cfa55ee67fd0785511261ded81f91668111a0ff345521f2303e73d470354adbaa7f13eb2554787f4a49e062d2253bf32554a465b190d8eb250b37852a997bfdf8469f09a28938986b0985ba4dc73ae3dbf8e4bf006eec31be48737746ffaf006efc31bbe0f6f387d7803eac31be6dfc0f25ec3c4f478a1a10b85015746a55f3d8573660b65a9d968283fcfd4492ee6b0d4fb63806129ca4343af52cd145d6f29451e72184b69b672c4c6124a4945b3a55f96f055f52f00e7d4d05c6ba1468780bbfb07a6e6a8b42d175539eb14cd08000000a3140000180c0885c321c178382012f65cf914800d7f9a447c58970bd42488619442ca10630c01000000110091c1b409163b9551ed98c769e7d5baad3df3dbbfbbf24def67e21a0b9e115e1a782e8416f7b6b57d48f145cc2a12fd097deff5743a54a891d8d2e57f635e897d73790a349a29d7eca5e5858a982dea74c94af7d8f43e45b63de070b5ac899aaa188d342abce80567f699c4e22a94d56771f786873262048753cc7ce88c530b67e8a06a8a370723acc2d4c68fe41ec6d5bcc6602e66e3cd81f05836a8c723dd79f70386df2351b416da86917fb50ddbc47a723b7371b7db83e5bfda7a361ef5ca80918648670528357df0488bb85b968c590bd10274fc8176447871c68f9963a7a412cacb3f072a44feb810ea520ad38bfbe13032688262f4ee380fb0264e23f82bcd28e6f58be5f860f18329053035bdb5d201c943af1c0b323d771451bcfc5ec473ed518bd5efe2dd2d2f6bca2cf0b03c657e4fd7d5ec6d39bfa44fc728206c55aad5af535b5f75feece4fe8d51a19734c30588d9a9ec7b3fc6e3c82bafc972a343cab48ce4f2c6774752b59bc77f7e41ca57f3fa9b2ad290e5f5fdeb10ba8324948aa27c2c9278b296b0a530d4ec2cc6d36f1f53b36c120979761998841ccd1bbdbc21d4c168114e64c1aca2a501f502f6dab1c0cab6b05e512b029eea7a1773954f4b8beab37ed17b74734b5491c21470291b137b0b3b7e5df7dfb7850669465654f33b62b83149decdd561c402249d0731dfc333832c37df63af9ed0a4030d09b98ff129e208efe8699a220239c68c5ed9a8c78f0a707a9cb7ea5670681156e05ea31fbe471efd77ea2d9999ec66a7c09afb2fda4bfaf4c3d49035950f1cc2ceac7bd2cf4f0a932575448fc057d5e56c1871532941a9661dad7f238191c1c3b85d6ab499f48d82c70b47840337c09341969d2cd9638d9cb96bf4adeb1843f466bb8698340fb582b1210eae7bca260f989788b3848883ba8b7019ffdad50e043969bf4bc8c8e2b3933c466ce1f738e6a5f550f269f004088841a684d0237cd6d3348b18631aea710e34b3527c90998b24fbe5762d83f01ea34612c09b6bdb39667d1330919324ac0fb47692e9355ae6f7f0b961901aadd5c33f8b4e9b877ef73397c376ab40d52178829fcb6e62222fcba5523e204631cf4016d311ddb54a0e90b4f2c8c7ba2199d90713986a09e2294d88a2e9e0fad835ebeecea744eebfd98b4e978939362c71ab1240e5f8ad3e380079c3fbfa9b1845c025d83c73030b9457a46b60c012454a5544efc258fb561ef68e8e63efca41cd53cd8eb8029885b21c23b177ec8abdfbe820ff3e960c1791232f17e20fe5127d1c64c985b41b0a64d386a060fc66518cdc65e174d66711d5cef7bb2e64cf414674d997244f5c1ec7ba9193eef8f455eca919fc520abb06086b47ad21c0bd77f470b709707f58e7a26f0534e95155a9f63224a7eac807e5568c13d56e3a2175ce8a17743282cb4a0d4320b336c8ac71827ff36380abe25603eb102023d5c865e1d56b76f6fbd638142ff74e1e32ab9d790c57b57f30c5930320ed6c136c69500413fe9d89c5ad94a9139d00a18bb5b5037fe9ba9ef0cc4aa1cde81eacf75c466148890019c503cbdbd1b107e44d1837b7a33dbc4e76d45b8f10378fb80ff2d16578b7dba6cc9ff02afc8789d0e6337d09116d8a9185a301b91f2402da6c553e707dd651b5db2d2b2103d6fe048e7f972048fecc6c186a0871864d6ee00dfae7eed60661143c8d669aad017ead43a54d7af299d102d8f68a5b606e43a8ae1dda702a4aac7e87501831d8121228b8b63022b1569d82a24da8b9505e7fc8cca9cfa6c2e2a02e3bd5b3e393b3ba1b503153dece15934015085c788d9d8e5d9cd0f05182449c81fdaf52fbe20cb1ab40ee1aa0a76ed786f58b4c85593905ef3eb13bf3a17f20aa6686e91aebeadb8c0b3db9c52c8dfe34506a546ad45cbd628332fff195c7326ce6a82899939f9317625fb0c273ee4bcfcddd40215fe0282115fc02fdbc24db7b02763e382278b9de87f3315d8fbf050fa8291fe7a4e1d258f9e48e57621c62d7b0326a905769dd31bc16b510749639a2860babfd5ba5e95a710547368655e5161954135b1d29388c8b2260757c384f118756859ee612ed16061474525821c85632bbda6011de4066dafe4f8ead9a07a6cd144e20c5e2e6d5a0df53ebb8ea3bdcdd509dcaf872eb9fd875f90efbb389a8b37844ef3a5cbf72555406130f18384341ccf2cb99d484d91e11d64cbcc358a82426b19f95cf5d0b71c21dc4f79498db48230e51e1374b51b083f6b1a08788fcc666ed2e3fe60f5d0fdd1fbb370d0a0bd380d594713391457d0122acbf809a27f931f430da415c8721cfd225b2c84449c8263ef762bfb69de2fa7aa3c9ef844a5df40b907e47057f796c458c48c4c9d08effdd0963736edeec26d50c5190c3dd66d0ec378ccd22f46e1006b124d4ba3245080331e265acb929d6ff82ff005e980ac4f2729ae3349760e86dfad094cc3efc86337d53551b80900fd2f285bde2f103fdcacc612d7f9bd0cfd97d2d5330b27288ed8c58bfc9df0066ffcc0845db121a18eacd47c20de9d270634eab27d41ab26366f6c785843909ad8b39e1d26ab5ed4d04aa17c390a41487cf9627f63838f38a20f3910405b35e6d62dd4e3c29965a633d60138b04fa059d99f968e509865f67be994d7e3d0d5f2e45252c49300a5eee88d03996c633af0fae56ada28db32eabc4a87f5240385b6b4564c9f5eb8a9794238a9186c813ba6dfdd1ba4bf0df12d4b7f29507241db2d42501f1dc2569024c32b03e522564412ebcdbd1c7566620f6374b46b8a64a34bc8b56b3fc3614af4454e29a48b01324724a4832aad425226e2526bd8da4d96280c24a84cc811c756748b046a610f46d9803ccd88b393ee53ed6015b5dcc81b7d031f803a82b756868417d9a0072b69e2d92dd4598280e15d244d3d045e82c22426ca42b20a4718e21de249202be4bdfaf9d6d6808ed431f094e011774f3aa8bc87ca7e1902f2f0e798629bde55cbe1076eba40a33ef51ee718f1c6ad4d8d18fd0410c8001b837aa38f86043abea8615c5eca52951a19485e248f8d31a1a7cd12e23041f1e30412fab9826002ff7748ecf526fc335598f7b888e3ba0f995eec93363597e01c35029f1b98554e5609cca5812a4fc48914e4629ec6641401b98cea0a5d5b58f3371ae4e4f492ea4def4a7bcdc31ccdf13e90f7f0bd2eca2cf6c1dab1bd0696311b3451d8cefca57b9731a8e89707d4e3deb314ace13805e56b037dcd3d203e21d8ca8f17038d68ab9e857d2f0dc3dcc4e607edd51cf7e78f8e0d136fbd7935c94317d26a45d09572c90f5d98f800fbe57ff10bb91f3b63fb845d6e734fd56a7e04ef851a0460d2786bdb3d6a9857931d8c4149bda60bd4f973b11c6e5107e1320b81888411a276024a068aa37a469bd1953a4c2fd7130233497d2efd40492713ea7967fb6e2120fb83f2614082e77aaa20127e9f40f270bb2530f060142402fcdd1e8459a2a214024bb20f8f7f9df1af41d34cdd37733486783800443e05886dbf40ff24854789aa6883a0ad6666006a3d4abd229e7819c65e04bbc003db109ec6573c975631223716fa01aa86dd115a3d0724b3e1617c044127611424881c8bcc3c3a708f0f93358cf596e499f8974805d03065120c1d16bca7f95a2b679cebba8f0848e72a50453fab75b27eba407ad0b5b71f459072a715fca0d5b22ee8e8062b405d0033178b19f0e2e782c8dd56cb61273e2fcf54ce9225ccb54dfc60c78445c2276a75774d4a2fe774a907218d89e40703fc1395482a458ed11bcaafca04240ea2d69857e01992dc11a510f7fc4cfeefc7176187aa83a1ecef960e174b694663251dd7d98ae0daa99361fec17e9d8712b9068a7bbdf4d987befad6efbc428fe846ccc1cb49bb8cfd05ace50aad173ec8048c72a15e24d5d20e6113e307ff31145cfcd058a06e3bfab76b865ba066af9a9ca9229205fa52a3b37c0854f804438072e84a053f10f8e455585c8b371fab5aa3fd4c4d2d3d4401ad29b857bf88d8c3eb01e729fd767ac660466a2e3843faeda9e98a4ea5a035bd669ccb6ffbaccefe5520f1479312ede3607864bd4ed902066d86f06875e2894dd78b830d56ae5f03744439c87a4608669d137194f7c5f9feae11e74f1b184500c608618a4472f170a246346a792336327c665c13b3f82abcf9b79341ee9e71a8070834f41e58d5e98043b4322d4c28839495804c26c6ed220908ba8d9d790c7ddbe566ef69adf0041030b0a088e458812519044d2a499be8070702293eab277dbf536102d27e7d91702a92fdeb146e46101127f13d45330a028ead79ed09e8e13cf49e70b42d45b7cede0e1364806112bae4ab2597f404d1adf96b5d5958cdcfa4127fa968edfada84f5e5fd6fd3ed5e677de045d5ca94b0ac229307b56461305791539317a91f1847d119a159eab42d6c02705bff4b80a02f36bd52be6cd794021740a385a8c35553af243470947569f2e8b046d751d5baca7af572bd42b1518a18cb0a46cc646c7123fb76d7cc39a86d23da74c0ea36960e57672cd48672207513c48bc97d3ea631244d3f97664710c038ff16bee3889d4ef98b097af3e48a7d22abde3a7d6348e5741eb00e2480aafb7ca43a7729eee7acdf5d8cd37a1db3ea591870204fbe23e1e796528b6d3e8150ac1707e78bcf1ffcfd6f81af4bd35d6d32b4c8f581d95fa209a861d46e5e6c66d2485d982142429837e02eb7898230715e3651ad3c6aba53042c6c19e44bce40cc214383fc4daf4510da9e765cf8e947da8d909c0c2bab24b39f4112df47b24332f60c20e53ddec8c4abe1eccdba244039b8d02d4a28f18cf3eb8a3e30e7b1cb3bcf5d736581691c7410b9f419b3e6b4fb00264405786e01d1361b4980d9c5daa50d127a4b5b9d02b939f92e96d2ff3189338a6e5e152f3150d9b483faa5a364d883cdb3acf930ad848a149b1c0a12f1192dcc7f14144f9864e66cc328f8a8e98163633b08c213ec4788a1cc5601303e969da4d626fc5edc68aafa9f40c24e34bc20aa0a760e28b3ea745bd860372871113455dbc2a7b167d5ce4acb6621fdd085e885defc6c6a183b478dc6a0debeaee59bab7a5baf5565faa2250220291757a293bbecd87ddc1dd52df0fffa7b53764f15d29a81bb572533ea41ae45a6ad355454f5ce13b8a78af78d4831906ffe6ad22223813cc89999d901ca1a41cd4cb9004375228b8cf559cdf98f9c97b951a4504badd94e2aca27368133d68e609ffa7aa409c58ef8a244a119f3626e4e5842b54f9e9958caacee0af2356561293cb42c4ba169ac4b0bdf661e5c887ea2f1a6d1762eb09cccc7849741bc853838806b329d8f2b13952b49645fc6cbe71e73bb12d9746557af5fd9fb5489fa54b870d16ca9ba7f18a6a3c2bc744e35c9cf1ec74c232867340ea55cbc8d8fc08cca8c5d97fb8be303e237a590a0405b47c0234fe688c667402367d66ada7380ebcd4f665512dd7ca7e8f9a133f2e07714aa8883f173e85df2b2b4abe266bd6ce70d2fb02ee337b87c6d0cc4de5398d5050b0ef159cdb3f1476ac6a981dec4f2ca533f472aed91c3b9afc37b93b86a570eaa76af9adb17113c4372ad3caa45f78a72cd99681777f39d391f7a12b584bcc953d52185e03eb64816310a7fa42083549bc2c1162e15c48c66f5c5e52e98879cff3d327f51ee4d99717941609caee4921d463aa760733aa05531d5bda5f3e1b391673111ab11d8bad50eb32734dee8411e03ffa78942ab85c60e484eaafdbd64bd8674a3e1a5f63897266595e45a96023a0912ae192c092566c7688b9c8d6428d33f1dee391d819f5231bb0f2d5fc192bbfbae2b5f20b8bb222bdb673ca0d1ca010783323c8715b680c0ce4d76504c9f5e612143ebbb16a15a3cc35a7c7149a9f3f6c2185eee67899c59bb32522467a47f31077fa42f76c28670f8553c5d1d8fbc520b4de29e3545c5f950e66c854c02fb27a3c3156b4aa9f334bfc38358d56cd55a1082111af5e2030d4f92e253821861ec469ae1f8915875e3233eb1c997836948273d3ec822d283d76fa84bc9dfc30a426147420485ab30b18fc0a3e04397015844df6b11a73cab8648c63e59342b96a2ceb570229c5933dec115f6f5040088e1d1f233002f21ff43d658e45e1a045f72d882620d997911be4a9aadfbcc0ff29780663c210877eabd8b9a76ce52780acfa0841341f156f022d784fb9b42a308b3795a470467edd54706656637887eb9f722a99a9a3a3fcfdb112ec2fc272e46510b930098e4c4b47260ad9d1d66a76951de51170910cff8f10e697fa59d9b88eef5cd5046077c029a218779205c0f5908f73bb4de227b4b95ce4729a3cc291c991c26e97f111b06e97df7d4cd3706a06a02045fe26fc54151c01394cfb37cd49a5a8ea4c8b6f1534cbf7facb3891036656334c6145090201ace78238094dfbf803107ac6258e44f73086ed68a0edf8db2ffe75db1c0ad0cd5655530d035d95f32a792f1bd7a26ca2e8de477dd1c7200b2cce99d6c704d48ee515086f871cd3e7eaa8fe48fe559f24446ed6a44d1a4c898bb8e89945ff0e2a1970d4810ebb87ddc33ee9f87384bda9a8c80bb057e0e4d7b2cc77b4dfb471a84e334b7c47d14b9081d485b62e8ba429d0f726c6277f86ed76c2b6f5eabcfcc9213c21928081cc0d981b81cdbf429a967ea41c89f4079aff0e1ea54742304294a3a2ab46c8b37b3bc9ca8f3364494ee7cc177831de0f26d065656415a06413b4f27893f20eccb9234034d1cb13543225b194e9e0d0e573a6e2c5e076525248ef77beb6189e239def236cdee368191467789e8260a71a018e478d44d8e2e521a91d9e1f50d717a743b183cef1122b5f5bd1c255a0b1bed3d8367a22d6ad54b637300e5cd808e52c464734a2ad874fe37d0c6e1490a7e76ef1be8e34560be0862d144c319847e8c9ab7ba89b7c48f30eef64fba88d84bebb1a3a8843930a8c2dc965ddb32c51c3bddfb481a0d98b116def393af00912bd830589e5f057699fed9658e66cd153cb3d9c370e17f7fc377ee9611cd8a5e818d9efcb105de8fa763820f763342c2b2335679a2c1fd47de39737505cec5abec0e9b04d0f2dd476c994f3b9948ced2db7192ab604a616682bc5d76aa01bec6673a3feac9062da82afa3bc64921a9f70c571c1b33ebc24a8d57d1f5cbba8e774f6f81f6f5e487406efe4768206e07a8626bccfbaf945f0766550562a9d1011be8e51902e88d9403b5aac7e3933aa41d43db805253c472cad605faa4c6f74880d58fd576fb59ebf879d62529aaaf9ce68672a2af567984f56a006831835a7918cb1f5c76974206b1218276799dd6c1472e54c5ed382c1f1c94b05960ed783f7b037253ee3c780275b5f15a94be48d90398d16cae9d5c59f3ef582d0d1cf797d37fb31b3cb50e6e495f2b25ab0d40c251aa7cdae5af525924e7d24e7e2c3b1d21c309986bb1bed6ecb8a55970d207a4c6c7a6b06b16da7b6074ede10bab972442a1cbc5239e51d893fd01aa36401cb988a8a102955879dfa383557f5558ab7fdba5be959502a8b00370a01a900ddaa14e0db4f08445b52cff22b47cf40b58d563135fabb052b4add1737076d639017d0a7fcbd100a88482f4f9ff18d67fd49eb889ba42411532c47a04cecfb1f09a6d434d3f7d0a365c8f20783624f9c05bfc4d10ee0dd6cf75abf7a37bf5170a81518b5a55adfaeaaf042eae912fab3850df92235a3e36c214a72dce45367361e41a4c2749ef272010c27427a9140a153e203937bed03cc0e5eea8aec73eb552eb3c561e511b87bf80ccb5bda9fd03dd08ab95468bf14eff7bfbdad8de303838e63d10624cb99af91d2bd36e16632e68dd9be51273e8bf6a831a9ac44e43a2fe6983e1467b551bbec1856937324ae22c4fb2f76c18d15b3140d32e2d5539711081bd1a8b4bdd63ac98ae596083bd3f3a6b5fa6d53fc611d2a08450e33a5d52c513d81e10e4bf352d02851d7b00cff3e122786cbb40a13df6b36d2a0944162ef2a7c00b3024f488f8a6ced1dbeaa8388b8589ea5b4895dca6e7e701db44ead5bad532c6b491a8067debeb808371079da713777c61bad7c26c9370151f3cc73f0e755030b7a70d58987773ed9fe26b69f50005f24cf9992d12a1e0a24d4f9a8ec37d88fc11ce6d55ecc41436932a6a335ff29344d634a701978b9b561cb2d0644ce15c394a025c31bfad0018cb7aa66cf721f44f6b22622c384493c1dd112c473c514d08225a390a5e65a3009cf977448e99f9f9ddbe182b967200fbd1dce112a0d5e98b80d1a45e2236dbeb7f3cc6e726bc53a912089e15008a3b14f47da5fd9614ed7717f6eac49f8224038bd4e0050b4273071562094c1389884f9f5dbe2beaed5cbaed27f675318021de2edb3efbf9205be8ccbdbc1a25524439b0756abed5e5f2c1a64a9407a654e0d5e7ba33049f07f18058b4d5bdccbb62a63cba52c752fd289a2e83e3d0bac97a3437917e62598f39840b5580dd7f4dd93d3cf6f485afc31290d42bc781c433f5df9cbf9d81b8cddebe27d87469df606c01b83389e52ba51ce0cb2fd81516072ce7898f92808950d63f3f73f5930a7cfad1e21637fb4827929401e66e639697bc06f0060c9bd9fe385fd1c9147c8067bb0dc58e9e3c2d70ea67fc54efed440354b1c9aa19ec86e861abf5cf4545f04c917052eddf46e71bdc737ada115fd68906a8e3056dbeca11f3ac01e0bf980cdcb49db3f4115c2aa447e26856d0580066c99417dd6bf51f03f16aeb8a7e4736fd1e7fe5ca67b6e1dfbd0820f05066cf7daaa00bb7392e0d5db1f581744be14ca11ffe0465b03e711fd5a278f90372d2351ef2c2f1784bae1be838bb46a94d4f2b1bcc5b84fa328beb5629f0fb6aedb24c468b4fe73865638b3b4a271d63aa2bb04a7594ca82266c6fce6d3a0bca416957c0368c18be540ec4b50b8a18773229d76fffd4c5f679cf64cc321814910d1dafbe8e7699b708624293b6d54f074782848a9d7c1d15d52807413f2a8f37f244d751fb16b5fbe41f23007efeba9ea7de4f62ede5fd70abf78ab057e142cd9dae07e2c73ad0775c0c5ca410f6678644c003e5240df0c2ae16549ea6566cb978dde2511bc06d96378f5b525ee7aeb5786d7f80e4576e748c9e0a5e2715fa10caea48cd9282962522c76bc3476d9f87d328f23833c85f278400d3f42feb404b7bc06d3a875dca3070948668b7748282482a25384034e7bea66f3635bfb6b92c276672aeef00cb478016d6e7087a536a349696202981ee8ffeff0efc5d986e34051f1f60634344de04cfb21c8467294dd6784b819c6dfb5184a981cde8a8e536035ad93533ce2abb33210690c978e6520cf63d6e5dc72920713ab84025a5e0ba9b2636b9eee072381183abb7d222af69b8b5c3a6add6e82d7fd7bee0397b139a6de5674564cdf3c0d14c69916e74a1c3249a760f8c02eda8fb8390a40ba751190e3b290c38237322e5b326670b7dcfa6218e3481b7911ebacfd0716218d5ce32e45ddc4439d02aa135fb440e0d7c3d1b7a09e09f485578860dc06ab94172674110a879a0893c7106fe7e1a1cfe430e644387b1a24e10e2dc1097ae9d0ec772cb9f1ed3be167a9ec7c181eebb28cd1fbf87d7aba6eaac7f3f3f9d7fa510ec7d6e535c1dd6064399129d9ce805f88420489df336fd17282cdda256a43254e5bec8d532e9b69cd9f6d6270c7405021c7ab1812adc751a0befb952bc2e7eb8fc6fa51a5d64d3ca8c1dfaa0495c8de1df47f382caecc874422de9cd258de68b87bf7df14983994e14a85d0bb1cc437669a90f3f7421a38e9747a4f4a098f8fa59c437387b8fd811c1bb2d8daf1bc015c5d02da80a7e16e1854005c5ec25c8c17e659011a7c9fef8a45798cba3a0f5a99598c500d78e640864117d765a0fc485b1b47b958acb9be54463b0e37b134a5014e11526e54f02b50ac34321dcb69077f5fa1a2c28b82305358250a5c0ab26b83409ea6cab4d768609fa5a4d639dd57313fd20ac3c0652aa65681527857199ce7481845d89cb4fb3f4105556702dc56b2727d1f8931d04c2394e74c5c576dac1987e9d8eb8734f8949b29fc0daae39775b13467b770de0cf08b19b3d516a52eb051f3072b395ce9b1f2322d6549ce28aa941525444c26b6fc66b1047bd7d6b092b39c41fb0b47c1ca9130b088b2afd06710bb2f434df132d1baf7808fed4b16c2338faf1bdafa0b46da98dec25423599b0bd57d79f0fc1d3222ec595e9cbe4565fcb2a42a02ca6288e8578de5e255cc42f0a1359e06efcb98647a4194ed4d3ad9e9931c50f1db01fb896a90cabf9c85d10b4fa7fa20ba6093993fa3f2232246e95a36e888f4fb3532ceb03708b44d56f244db525b8e89414dfa6f43bcb0a3050a63f90706b862b77b4df8d4ff558737d9795bd74e36423f8bbecfa61b3e531de9ff08070194ca7823162b390235a6cede75a01e5a3f9b991549cdf8659b5b7452a8f1d765a5677e14eb615445c72952d1364bbd07dd44b5186567a89bf2e5fe82a80ad1fcc69471d4dbf3185b7e5652720a4c9bc683bcf3f790dae8aa8b49a91420000fbe254256bbc79c5a1ec43c4bff7e1c3a44acd1626284c076f40fb7d7477eb42d9f4cf40b756ef4980c694c0b21324ebe61a230b6408bbbf232196022940f736de7f5d8231e2060f901cdb3c6c318d59896f40a3a48ef3f33e2d38dca409e9128adf7d9443151b750250b9e49d9b263733d619f91b97e108c647f576ab3b5915618e51917bcba094f45fd1f506effa0f983ad6797576be0abc27c9ffc8a4abc21b0afbff13ce097c2ba9184fadb26893d8fccf34e56f44a09892f6e0f3089a08ed9c9b6e48754a0d36982764a03a1fab743f1b24722255420572e753e2b49afb5e4ac3748f0d9942c46c59d993ee99e96a5870b3300686c9f01e8bd2297b98fd2e9b47e90433d041d4c8f23c43440acee854753386447544f0accf6ca1f72499846b750379f2d9323266096bdc8cce4171222e8f7d0c01f75fdc7248d405a7cb41b7ff93f80d8235c9c472ed41eaa8e3d259e4cb0c99303e7972c9385ac989a530911c94ae62164338072cbfd07faae834b90650703ec10ed9d063454969182c0e604a4f579116a263902ff095aa8e74248d6f57137ce0cfebd02d53a28ef380b901d0ba181ef6fc0c878c13ab7ff6ffb0cbe35780f694b76b208864f773404060b7241139f006d99916b3868fa9d15c620d720d112000a42ca5aa0000e581aff6ee567536d23ff8b7281ae4fe00c9528ea7c1899f8b1f3eda4e8a853416fe3e82b8ea4694101a030479dc370aa5fcfd1327e9d3dc78113f6a98519a38e41a3d36f07ed1324e44337cbc5abdf329afe51340587014410114441806bc5ff3da5417fab1921f7c020cfa943ae1606b97ff20147dfa2626c19d93d88ec1f0980ec7e0cd8543bfc2c27e6620af915749143f021814cc594de1cc7cf606be1805cfce8d99aae54392ca3d144550e4d25a845c4e9db3be45ced948d422e667bd27b679eff42b7081edfafbf963a385f019ed093224c34527616a16678d5e4ad727cb0b1a71b305e8d451c6e5ed85316565740e06689d514da85fc1491b9785214da6792e9aab636c4d60920b67108146bb781ecc2a38c3fd207b4ee2898e0fbf192680837b5e544a353491d6fb3c200948aafae854d2e98acd92aeba71d45e44126e7d35326dda2cf98add39ed8c9272e02bce44dcc9924129e72b157217963b160ed9d9b406c270105620689ea34c800b2e17249c2137034cfdb528f5bef811757a8c0be048f3a980278b8a860285258ced11c1404db8fa00263bf700d0d3a6a9008b289fdc11e9c04b1c1ee03e10503e155949e795b29d82fe4fe0214ab5a935da5f90c9e358b501c23c3c52b90623a0673861405a6ac9361753c1e00200a80023458294bf3c000eddc713a65b9032e4082f00900cdfd24754dca8073f8649715efcc89908c3e69ef1a83005be23830c43f2776efa7427f716a468185a8034b691e45c71827b0015f14f98f5f6179e9e4aca13487a34db7141d696734d56d6dd92e066180b96a009b48a5a2e41278e0d0702be034c8dfda80f6ce841dc7d1b7b656c197eb9517465314e2160ec583d5689cce9217646e176b5a18f03174c1814945ffd3a9bea481ede27f4fe43153d00d571c5a11d3c4fdf74583072fcec06869edcb3fee486c0698063f824bf4f80d93d4c0d239518cc5905d0e12ee18d2f9c8100e9bcd21b32005d96a94cbac2aadc41880b4a03444c920af1d90d315be7039de945d8474474f0685ea09562018ceaaf306350c8c335e0126d9f6e36d5ae98d4d2a58a028e1e8d2bd9472fd6d6480cdb7c330b5f00429d290933d3d3f2ef925b5ef948f6a1a9c952609a956d39e1e3667805b496e7aeeb21e2762e543c4ac52ba4b5a23b1e8a2ce11faebb7d82b2d3da7ec60ce2006cc1f74fd22c32a947840056f729d018c4e2e0ebfa4f5cfcb82d9d7110decc17e8526dd21c44c64ad397270da39adf4468b9874601f608a000cc7471a0dfcf07dc0bbc3491f06a4320c7796859dd035fd6d0a3c95c3dd8dad98848da817dfb72d2df6072e6e301e768ce2fe6942f31bfd974c1cb3fe251cd04a8a0b06ea7cebd6da2ab0d1a821056b4f1b9462ecc6d30788d12ea0d52fa8c1cccc75c10072f84ef9417db944f3ca210f5b8a266cef1efe90ac025b9e6e6cd45f3b93350cc2a9cdb1d8493f052985b7812c5281ddd4566cad610f71d89d78f6735f737c10984b239ec74bb1e8c978482f30d99572f9144fa05e9f9dde892755fa5be02d70f6cda86a46e646a06f7e8a42725dc62d87f9d49073a0326986f295fb6728a5411b44e8299c90f201767aa2940160bd100c6b2cd3c3546395d85ce55a4f138b4b51b79c845b1f87db5ae753213af0419ceaa1365ffa8a687850ecfa14491b28c40569785a82cc1faf7aaa8e261fa2a9a8ec237e353e457c005ad962f4c89c677c09fb97e7971ce6bec131c7b01c86179cd0e728567118c779283262ff496352170ea6ae6fae346f6a696e96d8e4222b0e4e819e2706e238083d2e5b702bf3d411ec26313e583d601ea3125e854ff40b0460cc38e2eadaf46b19e8be7f24484aff31aab00bfff82b16c766d50f1c013207a7a3c01102fd2774d34d293f83fd1d5fcaf6584aa0edf42e9cfbc83cc44cf1453403ca3da1b1409341c2ca610521be67863525dab21bad16a0b5bdeacd84fc0ddfae77dbd70b4ada313bdc42000d62d611ec1f86d3a67f76937576c0ed11e3b33fb3cc36d23da22d5078288c1ac600b01a6a57e6daa940790c9e1f9b00e29c838da70e9f4f764d34734c37dacfd4042ef09e115f40ed6b6913af4dfa7d201b4f495f598de24a264c2e053d133b1bec45e2acacd7dd8d8c108aa7587b121741a5583852cef66861eae0505cbd3067062a7f8d3095d560d3b22cbd5c34057458380a7d03c1fa42dae75a2740e96de29952923c02960631f7f328bb32911a2d42f755241dac633f797266042deb468aaae04335bb769a40909bb7a271d95b0cad0c9b4797221f591f000b5ce20e98a81caceab42ff9f5be8a9c713e3a0b47fa1555fb71f7dc00dbcdf243cea9c3452e101ad5349505745ee218ef9d114253d50d08c2bad6510035f4553d1b7cd7d4db59674519b93f4ecc3aa4ee5b1b25582b74088c5ae4824ddd7ce8737e38f45103e7aa5d9c944895817d238406a50156fc0b483a9c3a5fb5f72aba96ea6002f90b536faa1982821d33b74126228e5ae2c9ab9378ca2c82e7b552802f4dd2e4ae317fcddb691c5b17fc89efd9bcf37be5ed221749ea45abf994c5be20da0b02ccbf6f083f707ba7b2ae4193ac8106c060a29111ef67efb9c02a334f56c7dab37533f75eabcc62b3c9d8145474a857932b77984745798c743e15286e5f5175e849c70bd3420a0282e140d8f98982dfefd0e8044fb7258c89af439eeec93db7feab8101c908067d1384908dd0708b310664cb2df432431a0fcef585478a2b06636fc4c69226f45ceffe9ebce98e4c9815ad858ec0d057ff35b9928f3a56407fcb712be32898ea45b9bf07cfb45ffdd76bb3a6b1f7625c3349c48cc49f322c75df108ebb02bcf0d8431f38724f07c52ea63d39183e25561a113fe470113328e5c21dab7611e0574985cbace51f28368f5f16906da62dbbf4a2b59b820536e1cc51c3186f4b124860d2f8fab7b425e3d69993757e13e1e858e3e8fedd41704b21446a6e3ba40ad79f0009ab3e47ac07b7d5eb8c1196bc8d5f7ba336ee922f1901ff22e27c0541e8bb1332ba3097967b2cf5a25423c083ef49641ea40827d6ab54453b6f391b1ef671c788afabc53784004e0ac3055b7404c593e51ef303786acfb66eb3b6fd18c605a0c24a321d296ae1b1cf4c828462dba46620726a7300cd7c0ac296964519230bfac14caa3b5e55e1ef81feea6f5e44d5ce82e5240968ad1d73013bff8ac051dd08de376d7490509a5c70fd73343cb4a7f9afe3a410c3d29b5233f0b9ec5dc5ef05108668a980d121235196b25cef934f97db918ae2b11805a21c60df916ca627d250a8003638e56590ac28f393f809fc7fb243cb4db18b73c10acd69b6cc62f23bb51432b1167d33137d9710c9941a32ce27c8514908406e2e1e4a4b0070790098a812ff4c03651ae3baddbfc0a34dc3840fdc39700fcfd985978537a1760f182da49c74a3a4b0798a2be03ca633211ebd17c41d63bc183eec26df59683f385a2a80f90ef1d93add32b09b6fa930a59c5bcc2ea2a9e7dd2da603bd88a6ceaa9c0ad45efa70592a3c2c514be4a7cc03e2942d13fe37eb0c9110f1ce94abbba3e3d2143c4e9a04b45113bcac509018ba5543b1e657830e9287b6a18e51eee27d6498000187c126553eafd6b1329ebae9f514c6553c28acc94a64a1b44b14aac16d870038b232eee457742e3bca1a3031689acddb851f0b5a85111b7311c0514a6814c01f9c594999072d3096b7d505cea4b4994e001705a6cfb8ee6bd14fc6cb496df24466d7bc0fc60c6e0db1df59d92989ffde46abea4ccd212551895f91d01d1b33c49f64da1637988ce13b82421d6443b922bd59726716e0defa2b9db4992495c229a196c424375fff4befcc510d691b2870cae58dbe8e8abe1d966689f0bd9191dc599a860127934e847b249837770eea1e0a4dc41ba7fab232eec5c15a0c4f035f8c627de68d5ca13d7135c0eb5d3715c276ce8bb99eae28a8f0bc69722ed8fd78418dd3ae99b7390832fc76507939f17a3744742f381526e1c160bb8df8f3a07773ab575cc5c09baf2b9f5e07c4c6321a8f1b879c62ab607de1d2c8bdb2905645b512406e5a905719ee8e0b3d71313ba60c8cd4c39b4d0d470ecaa44a6f44ffffc1080d255d824d76979e7d9800df8c6a123d03572999b78ac3dacd188a09c7527218128a2989de2d55a6c1f4578fc10a91b797bb8e36ef3ab00d6cb123861a8acba84dff41456ee16c4658dbd5d272a37ec3cf784e2e1e3686a4911b8eaeaf4350f1af36c56a5702767a0ae4be41fb8d1b90728668ff6bd59e42f1210ca5b149fb88e5dc2a9aabb032165b717465a5873b2a0650a23ee3789c70119e1264153638e84dd4f0f57ea4ea4c69da63c8c49ec712f86501ca387d1b50d7bd0edb138234791cfbd7717d7a3e8a914a8d9b8a1408a901d74366306e30805681bce131d43f19cca17bbd6a45f2345188b822f522d71b51b9b789b1c7c8156ddf1bc82ca702671918fbaad97b50246b5008befb786107970fbb5afb2f9a8eb7af54408fc07578b9c5d9e05c9874e16562cc22ec8504094b987337774ccd2e0fe0ab231e53daf8b17371e0ac24b98eac34e75bafc728ca210667268cd0ea9931fe2203f4b82f8c867c6c267b8dabba27f830bd3093115bb07f299067101438b11bb9b6a28e3276e2ef55fa41c965c3d0125a152079d545edf295a738eaf960178e481e202be07876257109cdb685d8ef807dfe3ab5949ff68a7af248e5b1a7ed2a46896ce3280ec961f41a14de69b1443463dfe33f67efb3dc653fa1e32d931ca564c76281b1c8b8b89c98b5e431169c223f1a55c662b2de6d512b27961bc45fa60fe0b10a1d8164cc3f54f7c7fffaf38df12afe756c98f8308afe695378b03e45d6c7bebb77cb03ecd371c3eb4b26fd15034597e6fbc3b1134f97b0b092d3ddb1a1ff6f5be9e947e03c33276a144771419e15a38be02e510c75e9ef28ae856135fe5fb51d72bd3bc761b257fdaeb5ae3029f486cf26213f33f0bb474679c46f47e8d2e617fcbc012d054ef4d45f0d27c6653e0a3e5c3de49f0c84be2ba54ff56e2cd8a1055eb3cbcdf0b1434d5c7f7d2597e561d6ba1b7709886a9b75db967fcea762c0882fdf4c447ee95e9b70bf5500d94ec7e5056290c500674f2eb519d2b782608205b261af2a0c59e20fad4388b89a394b502b254de69dbad983e56d36af0c12ea014949d4752b080a43021af12b4a5d071065719c8dc59f70208e08e9ee8184c820d2900129e804c7da1707c2d3d341d77f6ae2a17cc54ed8de049c45938a6bad99b411e6705f024168dcfac0b0413b28b50f7b47b9eb8a62954b3058c08bde5e381e232be760313a8d62073f0bbccbae0f91f3a063b6a461c7c8a7e390a01f3c58bdf453280f395f4d1e48bb29d8d9b75d35aa14a547f4ae86590ea78d97638ef4c3328124845468fff97a298f591d75fcfa144db31d613b3ce28b64604750713ada3168bb1a1ee6c07804cef098574d451465976e0b152587fe2f08b3b7402542c6a88120107d69c787e526ad9267c03c889b57c4808f8790ad481a68c34128e6bde84880286d552a2a9315c019307acc35f2589d12ed7923f4662cdb69863da80f4e71cf6e279a9e451d3d04f2894473f480767c59e069197d8e109c86e5df088c86dc07135af9d7d181daf55552aee19d1ea2ba3702d2c6fed065167260ee4c8ba5e7e2ea553aea2740745c990e7e36c0c31ccc9ced3c51fdafa552f4f077f043dcb7fc1d4087b4f56eaea317a599ee9470c9213cf5c10410d906b8dd64c86125a434042197ec269211e0c60ecddac6ff2dcae4ab80b115807f98488e8a7cc88c18052966bff92fb15c080680d9ccf4c4f65c584f5b8b23b4e024a8c55d52ce92df8e1b20eba0f2531b411428cd26f1d0f00919d86bc5fbbca9b94c2948043111d5229548966cb67579fa792b19dbc4bcc14c9cb084221c294405200cb69380f14564e58d17e7a527e855087af61a499e619782a53ec75ec0370cb2501b71b1c0f839565545b0870bf7ecd70ae34b0259ed206766776c8fc989bac2f58c495b4022cf1d1130560d329ea0be40d464642c229e80a04150c04f5897e6a3195ea6051555d19a3f49f3c456858acf5c5b18523d7261acf1a489108e73f78efb02387f49d90ed59c184c541770d3f773d695c632a676b3be7f3855da0d48504a38ea3ea643367d46c595506906255b889c4806f0281992f6dd642e3fa1f206e911c91030bf0314cf798e64bad41c7f1f9a175c7ccfaf2d197d254139d8de32d77d291e6d005e6397426c9416eb1986c252db5121f1aa261665a796d1595b18535f824f9c8002230ac194fdcab2542cb49a9463c60491e043a9de7431d6d209a6d45ae5302927936076e3394bb6ccd525abc8e2d44800fba1d600cb7e62fee7edeb9792de45601380e7b933839791e3f7fd0b2d477cd21ceb338c7dab1ed661c64989ada48f7a39db9dc3886e02a73caf02cb8c35542c6d3b950fd3f6849f52193db10322b0e03031effc7b841aace407be6cf6349013891ea3f9ccc08afd339d27c4a3d5149ddecae5ab365420c67658e42caa6c391ee0db61090a52630e7b05aa2ed9e1817fd4ec777ab97bd7c5f2743962097a16b9ca8adb77cf51c22b237758b31ff92652f0010960f809a998bba1c99d20ef73283fab9fbdee0fc3e40ee4a7b115ba0d7e331b20a59d75a86d7085ed4f6bcac9120c045ba43e53adb3d650b60de56bfbfd0809e34fbfbe13a949e2676ce226ee745a3776fad32975f01d4ae7adf0753a6b080990d8e0cec34841e7fdd01aeaecddf87d2b151d70365b4bb3831b4f635184615a15ca2c0c8fd2ba4dd1a1a4f4fd5cc9140e9e8b45f44a2ee8e1b390cfff95ab798b1926c994b82bcc98b17ff08d7fac0764da8a976eb0428c078c4222a3774952306e821fa323e844a8043945fba2cc732dd3b5d9cafa5bcaecb60502be1eddcdc969b8cf00eaf40dcf65a16283bbd94bb76a72498938a41ea504929d18a28cfa2a7eaa87061c810d6e238c4a196302a2cdc4c69be2e858a00ce4479f748a114f163f7c728ea168f25341587c225c112660324ea95e262184ecc46ce0860d21c40fbc5bbf3f7e4bb0ff2706c914f16a27f8dc047b536dfda6807c7a8e71ea723f05e2ba920091598d7e85e46760ca9d577b98c81d2f9fd0b732d616dc5a9ff79ff2342b83ffd1ff7dff7adf9678c9b9ceacfd51924df3a3be1a2d45cb406439b9d5cd05777367dbb68dd8d68b6f8c1fc45557e4863b5d538d98ebd0753172bc67c07c7aff46fc4344b81e552b93e419af640359860074308b2cea0b9c5ce242d2e7867af5b66515da7be135a58544eb4ebc2ae788d1f8dd64f29433f4fae04cf50d53762c7a1afb3d50870fe1c5c3656c96e8498a8e11407ce8e1464c39e0134243a9ac6b95f1c380136107b32de4270f791e5aaed26d25feef42df909faa691fcac41e66eea3fdd93ec4e9236a89df1ae62491253832669de318c699f8fe6d70e1408c2e06ca9a7350b65b8c0087a746999bc299d17b259be67190914b044d4fb52ffad0f399ae38a0bfd05fdcea8508fc9120f1f8bc5627c1634f2a221a92bd14ecd60011973e64bc2c7cc52011b4923fb4bf12a53811e0fd58cec288f51e21603a54efd881c1736a83d1980509643bc7034e507b012e34dcdfc51711f22e490833f4b7ffaa140d518840a706081db6ba52e61063ba206c9cf42261786b570b97b18a55817b1829eead8a8c07b50a7092034388030881536edabcd08ad464b3ab7a8381a2046e18d49d272c7124c4accb6aa6c6194ac0eed39f4d93aa68c2c7d8c1c6f654bd1022b24ba3c5ea4da4ff31e420a48a4477e8de2d9f2f203c7e8675859b1ecde1c12e759cb86d30b097c34af934454a620ea2a8ba8d0c9d3b791695ead3efe0c16ed3a7860b9e506725edf1484ce90fdf64722143fd3827b7c8c9cf49d7393060351ef028b25e1d30bca587ce79fd82dcdad4e7f9d1ffb7e5822442855e5640586c85dd3bd9c14ece4418256c496b819d5bd5ca176fc5ec036398699955b536c0b04ded53fa68a53792daa4e2bfea05d9cddf970cdf6e7e3f32e70872aa55b9d2df581a9c1bbe9df9fc80b049cdffa87855a68516552a204a03d31e24f40be34d6515a2b056986fe6095d9fb634b76da28d79ea224c64cebf4f0b6f7b2feee4c603e7c454180a206ae5e80a6d087a8da8541b425fd6506a11717edec2c790c84cf48a5d850511488a705a7aca9ebcd64b79eaa29440808d9861ded22b243f8e7be5d34dd73e5dac40069612813b97b9bbf7e04711f5b7e279fc4e0f5433fc55f8f33ff91b8524fb5fb7f6b35782b80442cf059e325c7bfbd61e716dab507c7767afa3c6b5e06be16a3c97c235b6b8aa866d751d6e382ce470660541b804452511cc7856d8caf63d84cf1442705beaf0b68461dd9be8ddf197e3b904d49937f263d7cbf63143b316f1a00cc8270edfc093334b1fe8b35ba8ab08c52e1383ca2f0320c1d6c777087cef03fdf5ba558c8e58ae14da1adfd756341a6c1cc60e3ab502c0f158cf8c47a7f1f5c8e797f1eb4371eac51bc47447a96ecb0652cc5877fd66c36f58efa849f6c49fe1ab3e68c49abc994b596c5a6079a4841b49877d4262e62316f45b86c2609a59073a0c58ab7ad58e7f0b0d871a28a5b3adc9f65aeca598b9e44a34a14813d481a657b58c33fb1315a64ccc98f19c47497bcc68fc6610dfe805a5a9073ddc4d58e316334553b1dbac645f7496d132df0777f6f6bc1c2740af80f43838bbe232047f7f647cf54f5f6bb6a3fe6e6e4208bde5c8ac3aba8016432d3c81e5092818a1397046ca305ad44db8d0d3b0f4ceb3ccfbcd6c922030d3a99eebc98bd863deca919885fcee6a09e35cafd2b856ea4d4379db71b92bc19cd6a343bedff6cba68a8efc21ace3d4df198de7c130d1e7d09ecb3a078ee35440c36c952ef8ad8a61f32bde5649889ab96a52716ed9e1dd6e32f691613f3f9dd817283310249072674b21e4365d3c8147bff9e260d0e03377486b995a856ff4ffd1698f4994cab3125d8836e6f528022514149ddca6ae53ab81f488f8d603f1bd368b48867137a83a104425fd8b670e9943d34ac4f87a01a7c5beff4b0eb93b732905d86255ca4485be323085f535409fb405f7489d4d5a1bc58727b7ee96cfd184282b5854c9d9665e9f8eead54acb8f75192ff1d64822bf9d3c92b5d46d552d44f708187186d17c11aa7ee971030da81d4795da9d6789b567cc9a17245b030fa7c450c7e5063495560c53c272fba270fc15bc5a2f9c4ba8bb52860a6e6775f03076b9a8a75b4b644f1727d08315df5e6c5850058e7ae0f47f8e51d6859a8542bd0cc9d100bed01d0747753d9fc21a7771625e30d9c885609edf66945a7de9895aaf599aa6e7f56ce6831e021a26fd000722c3c0cac91b258869850f47f504c3d1885ed8c4536e8f792dc42cea381685e2d767fc7e88d5169de239c33857270f6882a907e0b079fa457df3ce93c7fa1fb13010f43d51afbc7e4d2d5aeb14c2a6e8f73e0510e6052aaf0d0fd7bc7dc0eb679db823a3802315e9e2f080d7631f456467e3dcca31982348c5e16101bdbcdcbdf402c80b8797b7d7dad958e9e989b2370687be99a9fc5101d2234869cf5d481f3f490e94d151d6a353e9b85106ee5f7643fa529262dac77a0b951dca94880ba2c6bd57ce7305c7b87b2e5f20326d7751ce7f6863dc1d0ee2d2862517d4fc14a1e4e28c14e93e59caa815e9deac57d0990836cd379f3f7ce759beb2c31df6f9504085c9ebd3fbd63a160b8752efb18b4c53ed060490ea7955c654e345cdab386ba6381516c8087082ecea45021e856c2dd1b8a53d11a90dec4ce50409271a05f0166f2c3c060da4c9f02386bc5b21df3f63e2f40204464b2235b25ae4257f3e476a34c951a2aeeb3e62a36f0ee48f754ef4d92325ef710bb2116290c8d99b3e9671dd47f12de8ee1c546ea803e02b67748b96862ce36b0595933a4cca66fa47d8335f729e3b5e5627afad152bf1bcfd46880be45d8c3a59592b3a2374a2dda11cfc85e5e45f6d7a5a13d0ead624aad6d52f56312603cfa472fb0c17c9e07d6b9c35ed7be8b626461c6725928727295d02467ed6d652d64856a0c7e58edc60819bfebd165dc6fd6315e0afda1704d2fbd16f7eca9d7944494bec799a47246dd3110a3e3a925be26ab87218151abbd693018f73d5fc510598abc258d8a028e938221f7abaa051ac89799af54bdb5eaed3fbbdf3ae9250d1044116fe1bbbb116d2b9dd6befb3df86efb1c2f6857fa835fb927fbaeaa0b4ca08f2058c771b1122c7cd183b24f9bebaa1853ef5a82c275ea3ad972845805ef73aea0d31f7c469d18fa99f348f5b3ec40ee0256a305683d844b9427316f4a4378c4528314a051c62e6af2fc23bd030d9269012598f9e97015c19eeaefda59fed31b99970a10775788ac10af9afc96e028fbdbc0436b1a6d7aa4fcacd39cddc7d99069db99a592b934f83cd6605035abc844b88ee5e1448ef478ffef598149b724f5cf5a36a19474792212fabf5bbd8cd73b0d2869d9341599a2bafedb98366f02d410635c65332ea6d723726a9ec498ba4f00aa68efad5bd8317191f842dc27a161ea9ccf8f14cc31c65b1b90195ffd698cbbe9463dea8ca01c1664945476b87a8d089edecd365032e2f28adf6b72f2db9aac8b0bd941240a16469ea3b673052b92eca94a44bb3c3b6ec9a6b9bdbd58d0c6606c7862ebdbc539b5d224942c84cd5ad9649d9371e2145cfbbb87c96a864d7efbcdd8d6d6b87ad67b08db55b340a4401f588559dd160dd798df67478e6400ba8d270a9e9bdfdcb0db6eca513380cb644ad9ad81e66d3c3dc36e989e8e6d39fc6c7297a339f105df1f34f103a9c898c7842ba7e508200439e87c83042d2a0c33d826e9aed4088090519e8180bcc1b2f8df581f3ee61aa530d50e85e4fe0ca463530bb25ff11aa5c0d8cf1aa6e6a1ccbe507649d9506438fe72eb823cd8bd2293f18944e068d2bd0f928df0a8d8f51e5ca18dd8064ec1dae8a22731d10d8e7fa86b1dbaa0774987187ebec97379ec1ea0eff5546f2e40bb5883f51d1dc258b8e512a63159e2a4f6c07b03e5cb98f9bc0020cabb4d4901acdc7e7db10f26cdf085ce6a490c5b222ea2de39d56f980df007c4f49b26b9681e8ca0e6bb9c9acfa27544c7bb44e81f70d1b036b9c5e4815832aafa1614affd80fa93c650214f7936be6f006497bac955a7b0117d70af7427a7c5ceb3c3d553e7c1279375cc40f2e62a108491229425e704080a98eaf57a4001826b0e6f36a0e8983849e5b265b8bb5e8e5292586d5c5b5efd5021d4afef17da779ecb95244e58eabecdecdec127801b5f7a8f89e236f3d444e626f822e59832e73511072111c38aa422f2b27aea325de9be50a6430307a5381c58fa8aaf9ac29471b51e84f754b2bb8696d53d85f122bd84657206579656c56a46a81ce031bcbd2f53adf5b0d64f888177b3314fa6abaa107edc574ccb5a2588f2a325efed1bdb4ce465831ee934cbdba7bf47bbe6f9e4d5174379b579d301d93c9a565c544c865d42ece164d60fffd02d54571da523d6e742634db2eb046d24467bb17b1c519cb0a6fd6687712a68a7a0962cb134d3c84a4b37e66ef91f1c6741646ec108d8b79ba321bb4d688500c3dc9aa342d9e30f13d01e3346646617849e96e777553b2f8382bb971b822cfcdb6d39e02f8c3baba02dec424814cd6b1aa4599878f812f6ef0d87cef2660504938d1cf76388d0fd1536b5cac520f2801bd753ade9d2773ea771fdd8660b5bf4b021d05045116632156767afe0cb62aebc8cf6cf3ef9eb319b549f78d6295e016c52fb3135e5784c436735064d2cb7b9660da0e6313b3899e713fab12904fb90fffda3dba6bf36f3e705d4a3a43698d5ef8b08140dfd877df3658e005101fdb7da97016dfe0e0aefeb450c19d0124293f20e5c1acb84eafb4417fbf395ff3f7a084c8a06301f82e9d17af935b0d25d3a60aa4e1e8f772f49b4dc0499aabddc6ea78c2507bdb944881386e6cdc9223e0cd4c2c28c09a53d472339227b8279c8acae45d5c0fa72aa052e37d2da71a8cea72d3c1760779bc8c5c6ecc3356a55952806df8ddb05ce2c70b4dfc8c9e01dfbf1526455c99c9790b8e94cf807b80cb87135ab10f036140bb59d0405f0293104bf69fd8ddb2b897079cd7d4eced62bbee6f27940c0904c396975ef4ccca8cbd90e74b9e26af701e7a9ed360c382c4c03612cf76c3b21591000207d24861cdef6572289346913f9c7b1ecac1c834672d99e64335cb8e96e8ca2d7c3deb740e16a7fb8536f53f2a0f69ce0ce5e1e0342bed2ef63b31e4be6b0f0173b1f39c2a1e8bf0f3fd2f6ba40568bd66e1ab7d8b7a1df566e36e5bed31fca141a0425d5431c8b1a339b2f842c878c36827633f997d0445352cc7e0b7725ca3aa2d0df3f5bcdae04de6d6a770051ca6bce957fc0ef6fb055811d740870cade3684286605982ecefdde4b265b3f006a1fc1e0e770dc82fc584dc5a56a7f4ceb57081cdae127db995fae2f8089c873a0bb91f3abf4afb0b85ea8a000ebd84f31b3d710e71b670aed013c63683a10da7dd6be7b72fdd42a33c0fa684e2df8ae68fbee14568326e189616953428114de16095e75f3931703782cc2e9f8962cabea39d6d623405892f655efb2c9a6b12edc150bba45d9809375d357a6c230cd37c458f717af0c4c47914115a69da752cb8eef4ab33a9b7a00ba9dcb92d36e996c32ec35961c830f5ba76a1dfeb8e56b491fc1a39d25f71e3ad7c3887193704f82abd2738a57e5e32daf94578f454dcad93bd6be16935331321e842e03d4e6711fbf0f296873bce4c21748bc58d18091f4d9554c6f9a401fa04d61cfba1b963f4bc890ff57862744717735717e67d01d8b928344d88006e752b5c83a41974a2932b4e7c3b9248f2cc4026dfe26b8f20804bea892ba696eb7ee24550fa6787169d3d04ab5d00963d2235148d69cc32d5c032faa0ad7511514293846a482f669df176d6d91f71f75008a9823cb5569b5aec62f7733d644af3ecc6672ace3b04db8d18e8427b48bca328ffdc11e99bb36a850b06bd91ba0d0fc915da8fa08671433bc11141113f12eb7cc4a1924b99460302be1fcff8069fec783cdff3aef40d193d75ff1795dd23126e08e519827bd545481c7d42f76715c8b484f0e7a64fffc9b7c256be7889fff0e0c93016191081e8b3a2979361c5d6ca5564388c6d25ad0febe0f0e2fdcf6cec819cc6a63ae701a4301159b333e298ba236bca1f0004a5ea1c951ffe69c9a95c5441e1adcf8d86e55801f69f2b586e0ecd84ce7bb8db4154037bf869c28206cb9534d587b8d221ba14b94000e24f8808c75a8b7ab7d8a1ddc51295add39e7a7025e49850e4849278bf91da299ba8c09c9d3eea217981b1d16f5a4f815d4dcbc0410f387837fdb4d31dad7b278c1544455aa516c2cc7d10cfca2f445c346a3b157c9552d41677019e945bb4a974e4eb7a3b9eb697902fec912f06f220de50df716ecc18b29917928f982f7eb81eeaf5d4b4a613d577eb3da10226cb17f98c67c6180eb7bdabed1df1acd8b8222d42824c1720d14142652b5a17698a1013b7b3bda3de0a67840905b54c000bb80b44431483305f2d8b43217f6c2d4fd78e9f8390ae21c09e991fddbd9e20077609343714b353f937a7b76956c770142b670c127f2a7e43772a0901e462cbf699471999cb17199f3af013c3c583ee0d7c6b8a5867c3f8dff99983213d086ca3484a5117ba91e867bfa2b334670fc73394395b488fe60eeeb7fec8b94971bf92c19bbc2a825099984c744083e765950a87d233999c8595d3f3c173534624678f5a5809475a6e3f4e572be43f2bc5134e0bc6800cac1f271c3aec750bdeda9283c30c452d289daa596b53ea39a1046258661212c17002bce1cb36605c2bfd1118a112fac641a2e0453542f1f89b2e19e301c37e9e7f7132433af941ad7b2f5b4f6fdc34119d2b112b15924e6d2ab09090b15548d99e22952716892150e863b4ab6654204355a36420633ced3b66653e56e9e6ed03cd566d38cfcac766ea28cba05d5464f97115d7992dd55c29fbf27410209498e1941b625438178da867b94502a9474d21bf6102f75ff5019de8aa65212524e8a360eca96a521bb3eb74e1ad592b996e7c908579d5712957adb6c4ae7b5ba7b9b95776c154a5ef2943e6a79c8240a4c36f8c6c8e8393ad0a4c46fbb3801915a78917fbbd8d85a58587d802b8bc6bf8195e2930aaca1ea07ae7d0474b280d0478bb7d5d0a6ff6c63914559e6e7a2afbf95fff70a95ec03e116dfdd47112fbcd3bdd72c1947b9fce911d02c0394e17b1d9c06dcd0fafdf8c72ed72e05ce6f216e75f34c5942af47557d6f48decedcef2c2674b9d03a8eb645a95106cbea64e8964d73951fa1a9a555963d370481a91781371439d5e3ad04b7109e6497fb64a383c1c9459f07dc3636538d3141fdb6ecd50f952504b495e0c0b08732e7feb68b342c6a457c48ce1484799a5745bef5a664ffad022e72b5740db1595296a2198f5928db4fb252a468fe939b9b37bcd04feba0e1095aefb1cda2d47a979d0d5029b513b83c1973c5023c5df17eb2dcb53194565f658e851071c261b7bd92d4fe6392be815b18ad3f4491ab1eb4c614933bd98eeececa7be290e474a02cce21f91895da490d3678674c12255c827dee2be59bb5f01d731715d1aa276c69c4230182de5039004a74a424b3e23297e1533da4863c8c7d4e476869064d3f6a405adddd63bcb8dbbc357586b42102b1a7daf2a5a914e26d4861a22e7c6499d88606a74658fcf0971f7a691b9b44ca216e3c061069611e6408d3ef194df156d548661c5149b06d2d0d03e22bf6058fa361a801ea7640edbcd6e1828473ca55d8f4d69d08b66d61fb3ef47660765d5c1a1f5d1fb980c119464c87d269c359d63cb99b08537e77f6f66a8c549d28134029fe54d943636539dc7512f5f0bea1e4d8502ffdc0edeeabe450c2a14ec9761fe399a77aa06b6b91da88545cc8e02812c6705b84b202c32c9862df5c4a495e68ba0ae04aac527735789c0d20160b6ef5b31b767c4ea5b8985f71c54ddd8cefdd4e0d83b869df222acefb51b63aa68492c58f910b61eac1de8537fe0c9bb15014ed4e1a2f483353017f84b2f06d58f929cfaf0654e39294054b1f0458b984b6df7af640e81b933c41cccd36f30eda0498606542904f5e83b48620396835d2cfa3f8825c9f73fbfaccfbdbfd0da4c0028094a47cb7ebc9ab13da4de9361fb363511be1eb951f6ed8b3b461492cf53e31fe4ae852a29e8a95d19392e63853605f05da998c0c86613cc46d15aee670f14399812beafe3184f3e302958467b55256c3b09dd44779f67dffa953ddad6df534bd883154ad873c134c37a73d1c1ef76f6eb25046aa8f47e7b97c6b859a2223ba0fe630cd6d604b0269d052b7e1b083830cb6373224f44f10c9c918ed5c14a239a478778b49d75c6585d3099a12f4e1c379f97b5ee1b4b4d6ba14f35a312132b480132a00b3700ee388e6b034c81e2d450969c0102746a88231f79dfe9db701eab943efd013be57458f5143c08394422bc0ca81dd21d5cc80e1e242698979814c18bb36c37c5709cbf2a47465a5b0c3d655bc51f27e3ed9f7388c0ef5effc845e037c9a2320f94339eef2092158e6f9312917df96bee7aca62c6f302df9406073fe8c347788143a1e55edbbf62e2fa006310c092bfdf86a3c7839125a449c25c7a9280c04310fa9556f0b288d99ca823f218636470b4c988a8424263ad01c84d0a0a1b80fcba1b773528ec93a2456496b67050ec143f09df7aa90934ffbc73d5d8fb951760b4dcb8669b3435653a5d5df99f0b3bb836302806e79d0555286937b85d0e8bf19828fbf617c519358e439302c996b2827aec7ade1ac00ab15fac850a0dacce2e4c3daab540f602e8eb6169f26395b843fccbc3634b093f8e0c5026a664e10590a17f914e869c6c65a74aca3bc8445de340fa2162fbd6c6c6a6581fbc104d2684daa6cb88700b975f1de9b15bc39aceec1cb2bc1a65eecc9dafff428d367c6a3897141ddefb7bd70b465af48cca8c16cfb5b811d45cec33f42dd680751c3ce6d230f5c99c9b8bb36b05402f268486cb2858eef58449c8805949bb118f658835af11f610b75e8a0198762153680946fc163bdfe27e70edcfb9bce728670fb8526435fa8acb37acfc8ee3f9257ea3611f0b4a96995f42ce402421820b4a50afdb164b0864de3d4dcf992c589fb84077902b8877e6c0c058562da84f38b03920d2a5b341d856bea58f010f64b697d597e9c0eb1a3b604bf79844e841359d6fbcd42fc9887ec941dfc3d075cd46e6e9000691bd6faa24d03fe19bd031ac682fd5e4bdcfa8757439ef7a5daa6194e852a08d2705e20e8dfb1c2fd598b8b6c790a4a10a6f8778a8ae0710994deadcc3aa47be07807d3c7864fdd032b6e4910aa1631d97428ef531ab8b8fbe7bd26c610b483066ea58ecb3cf92f5e8cb38472f8246b6d026257747defd7a0bb28318ace949a2d528dbfad53ddd6ecd16bc674b567b60aec0bb774f2fcfd94a5fa43df3a9c022537f3ab8081ecdba67c8daa4b37abb4aefc9c272cb2bc9732312e95f3e3a787f9773721c515cd9bf74b9f3e0eeed7a6c563c7b80738344a2ee7717adbce6cc34a2a265916ef29e9160570538e8ce09268cf1fde6031c5230f03447dab3c4ffd3c69a2fdb63cdadc71a36ca7f38f46f15a31a34238c320d8517911ffa1bb2f3d2fa9c10ac6827d23af1e7ed304256d17b938dd01a4c5affb5eca32997091170d953dadd612a71f0d1fb0aee51e627b73e54e48e950eb26cac3965d1b7f4e430de11becb25ae3307b0a846cb8622b18931f55b7d8ed268ed6998d192771135834f6991801fa6cf737b9f4ca95210c0803ab1494fb4d68586fe859635e271489ce3201a6ee0ccbafcb51ec10ad563945db51611ef70bdba34c4f15d3f71326f7de7a99871fc52956527136857967c70a9ae32f0675d3fe44c6421284f88f9920c97268c8a54e610c976f8aa09456516d6782a3f533bd200600cec671b63c817c087416094789132000900809b9287d984c661f84d3032d380fa1f1b5003b1bf81ffda2e874b8a7f6b23c0d7f926dda479f8c44da7b9374552379185011082ad1dac54e710ada0ab8710f166ef0d5b5b521ed51895819b7389b52401046e9ac55e30005a70c3c09b9aaab66334e95e530f0ee03ce87b7082f7a6dbb1afabd564758a04d109c2773636aa2470443d267e3921db73a2102e5a3d60fb539d4b2878627e4a3ae05a6645ded88391fa845d52eb7b603108badfb55533349f7dc58963128fb30d180c7650ba5bc4aeebd58d678f283c1162b740674546797b937334603305d6a2e6f8ea6c31782f72317a1f5854928dfa15901897e243d80b080b1803fddc7510b96eb88dccb9f4fc9cdb78611dda5b0c612fccc73002ff43be7bed04fcb880ca8ce8ab840a59eeb14306d619f51f1c2f6034ddd04ffcc9b5d35f6106b92a57d10fdcb82036059bc1b4d6329c378d19bb7cd699babdb40f02531743d19c555fd65cad8808bec7920224449baa4e471b14024d147accb8f2e0940c33aae1615f3681a42f9ca4e87090b5cdba3d42defb00f3ba247093ac29ecc76189ce71d6ad8a8087cd0e44cc9c60cfa4229c0cb4564cbc9f20a5e5d7ef4133f45809fe9381a5fc961ff3b4fbc0cf0eb26b18fbba66f73c09662407e907b330dfdf1d40152aa81fb82c513edaec32e7b964213861840ae9aa4af3308afeeb1e2acd449abaf466a55cb0d1cc0b73fe7f44a864b6887ecddad534fc0380c7c1e2314c42cb345af8d54d3aaa4d4cd6d4d184633d3cd1f8f2e40b65e9bffef01441d3e9763692b1e291d009735b3c5a80c7ada927933357e8914c49d6ab5629894caf13ee0dbd71f3878d39828c6ab722e3fb6730152cc08780ad327a900cc336add73b14d48829794f6484a16f045664f97bc12aa563d76b7630f190d28aa9cad2654ccad584c6320c7e0686e29bca1b77913e32418d583b63c9a5d874b673df7b67c3fccc5b6ba79373d688c929b1e6b8a1546a3cf9e113e8dd6bea0b79659386a78299f0679eabb3c02e5194ffb7b6f201e6b91e2855282eff037e1106d92d850362b1052f2300c77c0aa02832ddff4e544b0afec0580ce75fcca3222ea657d197d38fc31a2ea76b9bbba34d12566a0cd7b5d13e683d0ce49a944c7bad1dab1b24b3e05362bd330c3e36a676183b42045cad7fe3da8b6a11a75205e1d54304926a3cbbfb334da00a0bc466391d9968d541492dc1a9998169748ac6400abc2a76ee0714274a07bbacfcb254e5d30cb57230f4a0b31804d6c58e44722b18e46060a77fbc0abcd74c7fef56a69ba22932820139b79d792753c667fc32e40294582feed1f6eb312563d013d03b7f73486f4ad0db758e34c60eed54c65006bdcab0ce7b06e74c529f608113809cddd34d3be54bca3e02016d13a5b285fd18896208c47588b287a0cc5faeeda3e4a531d06b07dfa4444be4c956c84b35e3152a51475316004ed821c25e7508d34b4907c13210aacb41309916ed495479355bdd4709a8a0ff9f4a9dd9899e33601483c1577b4b397500245fd12992da3602c122192596b6129a2958e73807043d3fb7257b4f603bf7a51da513b0a9782a0b578619454a83f51aa4cb862014b0684223e01592ab3e5acf7dc1b434ed68a5dca88683524347bd9c35effef0d0bfd7f570159679a6bb6d274f099fdcd74cb2df260152934596c7450b08f9045238570161c48c36992aee35853634356cd8aa353af157b1f70797aa202866d7de6275f4033fcc8500cdbd17cfe83fcd309654c0f55d8f540b9e2a0d341de6ef3e667cc31ef8cc387bde28159e42531cc026aa7fa51d84e108f7bf19c5881c3bb3e39049f658f824f770442c84b3fdce8fa22c90b51212c7cc69f08d6adcf35d8dd52d266e0c3f4909817afd723bb69f461bc3244a8895448dd71d21491b9b78e3a2a0d89ece67af43aeac0e19077e956b18fc15155634cdd51d3d4f9c3d75c2d6af4f749c7becf89b8110046877df480c04f726f6ef71d00b24da23d20c47c529a60059517c2eed1177a6da51e3eabbe73639088a8d73197829c4dcac56f5155f616fd73d4b4b908361e3cccec1dda58b9b33fa7ac987b0f7aa6625cfc2c7307a2952bde2b117a8d4e7411f6fafe682de5c40e675d95f07c1561df8b0e2cffac3059ae535abc4967357e30c59036fb690354dc3de047bc0346b537583a00a9ac940237a2b453aa9340c853da8c51c39d82bd1edb8e4e80d1e1b8b106f41852e641e347bebf1fb4b6cff977a81378efd1e94daac0855dc012278709b9f1232cb4dec1289e7565794e6c4655fb5995196502d33bc21518d5aec7aa9a5bd227e25977dea08e1cd39a7c279ded7c681ad0cf228606744b64b3e998fdc8352ee41850dffbb2a7febce10a94c7bba355f1f538dbbee222aafed256153271148e7ba456a9d25e75c56d3ca740a4eda7416d001861039b2ab10bd9d8b2798ec426f463bd8f488bf2dbe1f6ba7ad1ca69aced3aa1044b3070c87a26bde94401bcc8aa0a476df387effb433b0495ade2a39c11a4cf96071f7b65393ac39c11cc5defbdcf7d90512b4eba9ec24c2008961ac37f65f41b889e18c703ac4e5e066d27171d7d137cccf378f1f7e20f23c9e2249c9ab299c2c138d5ea84e059cce437404a635d03acfd267be1ad40fd8a8258a979bb07b445a43da0a1df03f20153ae3ec2a0c91a9994289fb8df6864c1f29b4b06efbe8312ed0a8a78349b549c257bce034c71b28de080a8a64e4a5a0c4de302d410c8a23b6bdeee800440e28e281307405fe5cf5eb7ea1007d5fcde1b57f895da36499834134d265198a14f907217c3d985f54a4399843aeec79a0e819e06163229e1c78c2f1f8aa325a28eab40d532720155dce911170767f561aac640e8315818f164a0933016f1bfa8b25985f8b82525877e1458ddd2b10f6dc779b8e9a73b750565511021659f309ab131c2043e1bb9c53f2e2aa5593687a1f7ecd7f7bceed0192b83afebe96009a431d896630c86b7c564e540fdb70159a9c76bce8f61ee781fef82d70729b2762a60d848bbf4a31c463d1d90e3f50f3c2c98e86a597d44cff511bbf4c790cd7ce5ec7283a8f54246326caf61c043b2862808f645ca119a4c2b61d14681be1d4d46c616fb260757ea2207050dac43bb5905c35721f4363d452a3cdbf693b462c3906845eb4ee046fe15e6854673d7830d15f8aa23d1ce75fd7b722c690bf074e05cfd6e926e03d920c37dc4897160bcd3490e30cbd3e903c22149edd61b28009eedbfca4c102c09a64170a3f55279cd4b6981d13dfc5d6698fa37ffa02c896195dae5ff2648a88e2ac5be16ee3798436272a33c174914f1c99d68473177161a80a7ef2b5a643046d7384481217db7bd11b2ac32a533e2a182f82726f083437eb5bc1372a115f80db5a21d6c4d68d03babe8b81a57920516774e65ac730635ae94212c6bcf69c2f33ebed65cde426b8f2e8ad16c8db9ce8fb2327fe4870d78f885f33cc609386bf94dc95063fed5565332936722dd1d17435b1912a439d33f3a56cf6b09bbc6e06aaf689e92b84dfaa299bd793404bfb927f41a3d6bf63bfee9bc068ee1ed8041c0a177597ccb134151add99d253676470261ccd280674b8fbb68c9e0bd2953947ca80296244689d4d8589a630309c02e453918ba95abd65ca7264c5e874ef99374ee999ee816a3363cd58201e6fa587b111a88a44a24e418b4a86e7d4340d960007db0452571b55d755bcf61e5a9e94f4d0b26a2db86cd5c4072121f4a3266ee032252c0957adb20ccd8bd0ec85a9e1cd50ef0c24d735c87a12f97be65e256e7f6df351109ef87777a12fba916378b4a25751ccf0c7b8944155bf7b94207fc31b869cb01321a498f96b5e7ecb6422cec5a83bff548c776fe8fe8ba30d7a8f4b9efd9df33f11ee85ccbc97191cabde4e04d926171c5f530bbd864ccfe513f4018b8d6d4d649c859c85866f9b7f24730e376239ea595536011306a7763a5f55b3b7721f28e038d39ad4d2652f82b073f9a5c9e5f3b4a6bd0cd228570d5d7e9f54856135c084231a3d151316dd4e2a230992d7df2003a769ef1faab4738464ee427ce1de5c31bd4a6a2b414cf5f2098f6e26d1708277135e6903c2f59cf8f952d826688defcd48e4088abd5045f147ca7e3cd61b0e2ef6556096fbaa3631e821cad12cb71c6fb807c0083c433261acb79977ad7624362e3da9951422acfdd04d73cb92a9440f22b55f266fcc9524adcaa8bf68d2b47a308df07d9235a5e451cb12742bad508053030a804aaed1cff5926a3ed530fad8464a5274efbb6ad4aa69475dcd0bf944a9dbe32c93b0f353a391bcfc3e3824f91e1482b9037e4526f0f81030094aeb500a41dc4e249a0556c371899c26e5e143fa0535b77735159fcf672c352ce416b08fac2cc9af559a071d77caaf3220ef50294e4c222a6e91d322b468f4a4e09c80bc97ab2c3db207820e9d32e50894cca3dde0d98fe59b51cd128428345d4ab83ddeeed864de06d3f0d66c9c4a340254978693c284c60f99523616426b69f20b7bc03ab08db3a2c436108a70b2ee0eefae601839d97a8c6563f44eaa8dbfd35b7b5ac3dc59fc120a0eab2e9668b1cd683e6931b84fc658916b2145063dfedd319296b9de68c4c1d59eafe9be4bfe5bcccdc5c4d63901829ad4aa776b64de8c1cfec80ff6c2232505d39f72d28f4c14af0487ca8e1e220033af17fd3d2e0881051122eab0d9e1e87214ce583a7b68e6ef991686b67b791cb1828581b039aed0ef6a27ccfa902522451b58fe46a3803a795aa9ff9e93076e50818f1c9fea40003b3be863793ae63159a3a296340a8a8e22a44b4dc5c628c5c2590eea30d2486f4239198596d87017e36fac5736bdf325baba35ba2d2e3d5b9f3494e2fca38fd0d173ef9de94d145b5aac3357fb258e8f54284910d6482827bc069ca3838a3c6fa4abe2d0aed62f3ca747c41cb5efa5b4eb7594d0df8ae8a434382f81205d38cb869c81295adff4d518db66f18c1d74a9e2f07c97dbea7c99904a8e599103c5b65b83faa611552be5b4e01f15eb2e38d7196bdd3dc0ccfa799269eee1454dabb882109ced7905a37d4badc3cf791f73d99c7bf89b4bc1507d4662b704eaa044075d003fc042aaa7992d42f253151666e990c3b7d5222705cc27719f5d4d2810320d4329a7362f8c38ed4a9983ac410c09cf15fe4c665dbd9c369032f307167f113e4a8eaca226d5fded90737eda9fb9be9f60e4bd98285178d525bc009fa360cd146e90e11e3b2e1cb4f1d539cfd5ba95e86654751d3d1c4753f41af830fba50b322ec1df0db640179824b12a4e9564478ca00e0cc017dc889d14d7fda24d2902eebe396db4134681ba9cbe2d624ceaba47f4700209ca1630138bb48a23291b943894881f175d2948ad7b27c4feda63b9e9e73e8c93458dd878fa3b8bd780f74928f5a914c6ba775a93817b01008a6d6e789c39e59c5b0b85e5e6cc99f7325beba56dd94d5fd6e2f9675f0209a5df82ca72e8eb211d7f3de0253e13e91cf2e2cdc68b130a04d1dd854fa0f750215cdf4489fc3517e92cc3b8b94f138378e51527b983732127b39519dc27e95f677cd73b498e8a132678bfb22f0de41b1ad63209aa85738ceb1cdfeff997446f49c94d57040210b7717759c3fa504a822bc16e14840e6087921c3f2764e4a17f27d3ba4fdb074c8edc24792ba325578cb47846898a8e1f307a8a7b283f11646dd0900a5e5c986c75df600c87421ffc70230910b1834a27c87646b43a2ab2acdc2859b7925ef9de782d1fa0a6a834b7354139ed87a0abe261b5f2170addb51e131dc5a95c99b7c6258540d4a236fed506dd0b1d9a08ff1b8e52c24b5db1f782712a3303f615a6cb079e8753613a2662015feadc348671a2da674786c9b957ee21db8254ee20cec1fe64384ecd69c637ba75d9780274f4b5df56bbe29cb58f3bf5045ba3989caf00e2a0232f106a0db4f2eeaebdb7ca35adb28d874e4df9d6208fef5be54709e5b72447039fb3bea29ff789d5008bec724a6cc2226b428332c3858a2d5cd54eb49ecefe67e24291da5476c641495c7feaf4b50ec41709287fcd91f995275b0e3a2d3636e8345b6e6e20e5758f4f3dbd5c61457a924d5c1f6f4ddf143e18e5e78b9eb5595afd2e32ad92e396d06c2c0575b2912472d98d0eb903e2ccbd5c3a919f692bf14036185dfaee6447d1a9d144e776f43245b6e230d5d69f4e68468792c3f735426d80a1d4a0a2a3ffc1a01371799d3f5e7afc358f9e2c75a3ddd074fff56cd8c91ef46589d3c3230a03b78197d8292eca3726e502888d76bc37f314ed64922fa4e80af347b43e13e84f276102f63a00daabe099a8e6194e80ce208a024e46939c67ffb036879606f7cf2b982c76e895feafc98d7ffcc9270880d74acdfd96e47776af607b1a16906c7da9dd78a3371af51816a95f366bc1e72b7f1285fc2a775a63a5ad5f27c97465c7d7a4b36026627f51b4396e8208bb43c1b61d5d477dec13e8ad0ed1e6f6bbcbd967a02d0dde8f3cbc7094eae563e52ca2c7ef9408a92d2dac139fccddbec420bdb4e2143d12782aa4580bc6680ce3428c9f3b21c1ef3381e85f0c8e9d49c7ff495f8953267057269380a1254b4d849d75c6907ec4bafbd237fec07af879597f408e94fad5931ca335abf0f5e0b151bf16ca27d244898deb0fd843156443a09690fbcebef522b7e3d25d8afdbd7732a2d271966ab88810dc5e437490bda7dbfcaf203be2bb2e53a6d782762100498a7ffa55685c67ee5b924bccc082e8eb9644471cf8f7b7459c27b7f9aa98c5fcc8c28453044224688b18ccba1b01f6ef96ebd9d41e32172977f6252a987ee3d0a3ce9d994a91f406de62e1792d07031d82f83cbaf37d7ca6346cc2d47585aecc880709368137b2b4e00514a4027addb9665530ce349b0ed01c7e6a1890a5688e53991082529571bfa2cb61cab1c68492697ec65a29bf5458117031fc23a6d36b1d843e8ed3fa8ec5ca02a3669ed0104a1b839345bc8bab08c8a7815a48db7bcb2da594524a290323061b069505d46ba259c2134d49f1833a7aa5eeb08fbef17fb0b8898185c566414a8c95dc2f7db4dc3fdf6b56c0df44f10ee3afb0e429841eac11716690a8a366099b404dd8132f2246f0a9c24fc3e0fbb3eca054c5f2d351db723ed5d9b2ea7cbd7a6c9a8eca19a1ab43878282825a1a5fa9feadf75a5b9e2b6bab920622f8f48b288a22c65c8734c59fe28757ec028299f43d955f561e825f3fc025f8a11e9970fdbaa375d7d350290a481075f775c64bb97fbf7e4bfaeae391097f80cb0d64247b4e0253ac43d13c54f3da4a6905a658118deea3464afafbf5e3aa854dfaeadbbfafbbfd1bd6659bf3a5fdee8495b467832c5f0ef47ea0f5afe49cf3a89b4b77f737f2e062726749dc051fdd963ea45afa9e96177c74fa2199e88582a6aab2fb9b2a7dd34e68c7aaf451a83a66a58f52d94a6aa3a4d7566bc57a2bf37546abbcff25bd35a91ef110708702682ff0a1ac5ddf9fb5f734dcfb6591703fcdf975bf6fb78f7fcf0b15ef4eeefa745f506b8df29a4bb35af8b9cb16d73e8ff6579be9d2937dc1add4ca8f8b0626c43dae4869bffe026ad139933585c285b5a89c5f6553e59fd287f3da3af4cc3133e2033547ced79c362494f019cdcc1133e2f383a2d5427d5a751c70d22dadba4a3bd8db5abbe3f5fee25e00f4da1714b44d9feea89c3e06e0707defba8ff7e12aedb00f6133c59e49c0b22e54ceaf395a4a1fcf68c99cac237394f4103282e9b4727ecdb1018e997362fcea4179c2177d74c397f4da182c564434729a9c9023e4841c1c5a859c1723999c1463913f638a7e7343d3d26b636a357ab732e6e8404bf29a9e93e4a9be8784643adf1156e9610c167150f0883342f402870f149c12f69d737730267e5976df7df70f80d89bdc561900caa8a0f04447116f8b69513181d7e325f5b058e49eb8c05529a3c0db62575344bc1e2fa937e537610b3931b415042716a34a088a179430445d2ceac50d2b6c88b7efa808e2f57849bd292ca6c810ea642980a298ddbcbcb069b108dabc2e147df72d762e1d40bc2dc5448dd7e325f5b2b86c7bf3464841db7d8b5d8a59df434e8c5d5c3535214c89558e6ca8a2a41ecd92d6d5d42821430d0b141bb8b8d4489dd830852ccd5989b034652b36445192464d8a0d54ccd28899dae0840c4b8a0d527e697e29363c214b7345b5c18a8c34444c6cf81d49936343978e2eee0394d95d7cf674a0365dcabcc0da026ee9b6727e61fd6a34b04608adf45a39bfb07e7cc19a01eee8b79c5f58303808582b42c092ca671df493617047ecd2719938a56f329a991e96a189e86017b08f950dd67539bf7e5afaead764dfa90137656c2bd45abfd6b8397f403dabc59cd6f9c452e707759b66a069a8c34fc512e71cbed6ed2996d88b102f42ee28fe4fa0d52c887537641345a15b90ede7db74db1efd5bda1bc79aadf79048ac8dff162aedbb5cd87b913879ce66eb000005206a31eb487100e2ed1989dba82325d9a24a4eae4a1bc51d86b61cfe7e5b0eb9ce62bbc37042687fc2a5e9aaa8141240ace5bf1d04b5b67dc8c390f4e9cf6fe31bbf0ec99129ef7183a7529314f08849da75b50288f67f0a60acb82a3708c85676ababd1cadd6e144bab0bcb9bd5f1122ce94d0c43d1eac05d222115f944abd365aed10cacee9656674ba0276bf9831ba4cf759bdacf9603213bdaa7f6dec737a806178d6e62bf4daf5c02ca8905b493ca70ecb45dbbe178b34b19deeefc09512829c9c16d48a4baa955864140369df1b5307293088758cea7b64eb0167789f0b4435748dfb6edddcb47a5dafb5d206e0bbb581b296dac19eeb5706dafbbdd166ddd8640360e06ddad85ac98872ebeb1e8f7e2e69cd3f6aedd96c2849169be786d864a69064a5c45e5cd511899e65b0bb766b834d76bf7debb2bef2ca2f5aa72341a8d66400185a29bd88dde6eb71bcdd035c1ce7ced0f4734545af1ee7be78a5924646f5119529a41a519ecec56b71bd4eb93f947957e4abf5f982d13567a0454cebff4c2fefab85937c9a1d2f70195be5aee5a56b2c7a1ee7c740e1c38e038d831dbb4477393e835faf8beafef29da28eebd39e8a2fef925a519549a01cf0a6e3c67150b79696ff7766fb75bb53071d03aa4a91d0a19888a9dce4e7befbd779a419db75ae0817fb7b4bcfa70b8159dbe0f57621c0e87c3e170385c0f5bce59a7bd5f79af7bffad73a51b5f5eb510faaa531b75a75f2751f54dfa6855a92798ac1779bafed49f4b77e23e80a0af6bcd3fc26954fb701ce95258d3355975a8fd4836f5af7d13a5d16aed50f4e2579246a3353d3d0505017d177dbbd1f6a3ed6bb6772a7af1e7124d3797424bfb59f4b5f740f434d2c9f6445f13bfa8e8c5f74044fba7095f7b4ac90eb8a7914d448ffba6225faf1c75b9fa63add54a12bded9b8a5efca725de58ab8db5a29ff0fc3b0cfdf84af56f3f9782bebf07a0bf919d74b272126939f03bdc9ef61d8438e0a7644e02f7e9cdfff49fca71ac51f81a85afbdd3d08f3f977261d1d0508e74aa3d85272229bcd3f8439cc4c0d08fdf812132c7c7ef000532c76b148628100d9113c82132c78168e8e7128e1cd2e5f8cfa51ca79f8974736928473fff2c431aad0b7d17fafe4eb7a7715d8e93390cdc5e7c0f42fd855eec2ff44eb4bf8124066e4ffb0edc3a20443ef5db2b8937b289f70b22772299e3607bf1ed5128ea288b1c086575ffc8428d65565f98346101855fb45d9243dde5286082fc5487027bf4c15e51b1321296292992db92390adc69646d4f60ed51e1340201221477d033605ef8dec46031fe6d2fdc1e931f6e7c3afe2c82ba9b5b0cede5fa8d1ea85205017e18ce2d18636c31c6a42f7cfe6f778df4ed910c451d2d95ec96f0f587ed40d4dd7ca1137d3fbec0264d30ff43dd8501e9e8523834443414f440a11d62ea10f4408f491cd013bd07dbe348a7dbdb6e4336d2c9f6b707babd13d007ddde36a49b4b4d410f24f44a35a41d887ec8369d887ee86da493157e27db0375c06487493a0d3dd1d013bd1310e98188dce4b64739fc43987cfc36db0f914dbb098803d02bd59b4e48679581b964fb205d68bbe982741794007d5d02229b5eb0d45fa9761237c55a73f225065a47b795930b940f1a9e5e2b2717a818bb4aa795930b9489eca7d3f6643970ce9c7973f6256e9dfd380f11a69cf5c05cbb8f665c52701da259942ad02b9cda5cdc4c84149a09881914d8cd829cf899d9a082c1cf4c850aa6206579feb060125266830a4f589e1286e8c8f3c5060cc8bab86b90d6ef05953be29336584f17cbe03e54b67c65b5a092e409951e4d628477a898202ae75795273ffc23fcc7e12a49e9ad412948e9cd2313a696eeaa2dc5d9668a29be9fc39189524c290e004e9c20cfda7dc38145e13832d91b5e7b6fba7bc31581bb0feba6bbe3426e7577cfb12a7461a2b47c8276eb9927ae75beb5e4adb5d6ba2dbef8565b6badb5d65ac95a2b07435acd0eadf6e2acf9d4e0dee00635e7390cb178cbfebb8903c790663b6ecfae75bf74640a431a1f4a69ad75ce79efc51867ccabd55a2bee5ab5d6f4455c67b3a9ae19df39e79c165b5e851db7faae02d05c3bc510dc3e4271666bbb734e0bcee9bb9fe79c734e5168de6a734e6bed9c939673cea39d73f678425457c39cb3b562cef7e6fbb9acd9c46c0337aedb2320df53892badcb0b304a2918a5144c0718a5148c520a16a6038c520af622ccd2fd276b900310647a8be043d8d61ed80028e6dea9f4e8c5f1061a84f7014aa208bef8250fdfaa6ec7ffab64d4143383fa942aafa02620804b4b522a4aa5a1572dd45da75410b8d1e9eb3618d640da9c15ee8351b8db6d252dbf5bb3f97bb2907842706580fcc8c0dd2122feacb1553295051414540baf3317b54b252be9d7b26a81f6f4ab9ddafb6a1fa892be35d19fbe25627b9fbdb24a4afaf61754faac960d5352a0a76fc582de67e194f4a7cf9695f437a5d30c6a06d90e1e2ca0c890b3e4a3475c2043c5151b5777cec2967c540925ab80133153c66a7841a2650d99971533376e742cf96a901aa6fa2c8b925a1996cb7a95f483828282828280de363201d96cbd7f6d64eabda8acfdc153d69e3632d568b41f47265afff3427c6afbf2736483257f3a2f70dbad04c1af3e23f8892ac1391f00293a727ca4e0b240dd2f7bba60d83355daafbb9b9541b4bba19747673b25e1e1e5a30f191341f48471b2c36c2aca9b38f78d972e3d6a34e7863e52960c9516f666490b367fbac070d84231d666cf0a162a7043a84200ed8c7856bacfc8484f910594a0270b8c4f16570c967cbcf2820baa649070e5cb08ae104b3cc9948d2dd5c3a2ac5f6f567a84d4825918170b6705fa4433e7c47054e2a7611e7f58714d12ebfba9d6151cf23024f57afa1c7f06243d462f866486db2aba75715f05a0a95e734e250dbd241ed2cee88b70b72e5ec8eaf4ad907bb1bef7627cafc618b703cb6bb2d6fa5eadafa8c59cb31815fade9bf3bd99b62f4d6b0d160324ce6fe69cdfcb79be57e9f7fbfd7ebc5f591818dec2f9cd9cf37b39cff7222589091be3fc66cef9bd9ce77b7fd70bbb9abfa2c7897fe3fc66cef9bd9ce77b77bbbeebb89d984cc6f9cd9cf37b39cff76ad092722fd6f75e8cefd518f3923480956daa1bc84371c4341a8d46a38de3388ee3288aa2288a62188661188699732e66a4e212ce6fe69cdfcb79beb7df8ac4e4369cdfcc39bf97f37c6f6f4f9525f590947ebfdfefb7e3fd74997bb1bef7627cafc6185764a45bfc909234e0ea5c9dab7375aede7b5c52536bc7e3f57a3f7a54b536dd53eba9966f6af1b47a1aa2f411e08f90ea4b51f66c84d4872fc55bb2d2a2a8b50643a1efbd39df9bafd65adfacb3d6fa66ad6fd6fa5eadefbdfa5eadf5d55a5fadafd6f76a7defd5f76aadafd67aefbbb516c3300cefbe5a87e1bdfbeaf0eeabb9d6376bcdb5be59677eb3d639e79c75ce396b0de6acc1c8eec5fade8bf1bd1ae33742621286c4fbdbae8867742fd6f75e8cefd5b8d7ebbddeebbddff59084d3c8c72bdabde38a8a8a6e4560bc3c762fd6f75e8cefd5183f4fa3f0da89377a547f6ffa3c71abf042dabde370ff3bce6fe69cdfcb79be1709090909f7a50fe98d90c4783dc9e2fb78f93e91f63e5a99c1be7beeb9e7de6bb55aad56abd168341a8d461bc7711cc7318ba298b3b8f5bef98ae2e7bcb7de3767310c2b40cfc230fcfbd6d63073ce6bb4f6a64cc3ee38dcff6ec7e3f538bf99737e2fe7f95e0d1a3468d0f01a76bcd2a78197a461af084bc2fdef76bc7bb1bef7627cafc63829290997f4bbd297b4432a73d6be247eb1c6fc62ad39bf5883f76aacc17bafc618bc142c4c8d071dd80f7a99a9d6fa6a4ef7d6fcde0f33ff9cf7d6fbe69cb9eec0967a829482e2b8bf507a815ed8f6889e9574d76a61cc61de4f3f4f3d6db57be691e9d2a3fa9b1a9595ee7cb8d2671481a212d7327f36da7bf37df3dd7befcdf7cd79efe7a48fde5aa1ca4b7660cfce4a0fc0af50a9072005c2b3b3d2d7a4f5cfdb54821f625aa7d5e5d5e9aa70ce0b5bdf7bffe268b7d75acbc14b36e79c73ce39a7fdaa70ce0cb5d659ebac348359cb7befbdf77e50ebbdb7fed8b49782d06003663ccca33b565e1ab89981b9eb5f848cbaa5aefb5544a7000c7a4a7982525a8dc904cc0af76fc7b8e38efb05f69fc06675926f83127f68348ff4f3acfbb9c34fb5a63aeb8c31096493b78ea557716f7c6fae3a0e852a77d983709e54df8ec53a0f0b63f42ca65f0a057ecd30a55795b2be1297105f501dd77d3baf5d2dccd96b75777befbd18aa07e5fc0f74198159d25961faa863e134f2f55a75de5beb66aff66faed7927d4d589f6adb3cba936350812ef3cf5be7d1fd3a31e424a04bfbbab43f7107f3accc249d156e7d81ad4fb856349a4225f534689e85dfe24d0cc12487cd0e740e7f875bc2975eb203c8ada83f7c0ff945d209fcfc21f8f927e9941f04df49ebf7007ebeb9ab75b94b76f89c3f249bc0cfdfb45f73fa1ae4f977be5c67abc5a4ce872b2907b302fd5a3109b95ab8bc6f5077f95df409e5cdef1bf3fb6e129847b90782e0e34010247d1c7ca83b107547ffc6a7df4b363d2d3585f43548d2d36d1d35a8bb5cf3dc960cdf03077b4443fe4d561dc2175fc95ee06413051766486484412df1cfc0e4fc39f902279c3dcacf7bf628ffa52ba4b6a096c0c49d3dcacf81259cfc5d9935a80bc85f5bd37d338cfefdf94110041f04f5deafb7d6d1721a65d204536785fa437a010475efa2e36698f175b9a93af8e3e7a807f04732c78193390a7a183283248aecec6c097c0f9c73b0a9043bb2f401010a8a74b2ea809fbf537e0fdc093f2773147c0f34da7b183999e3007e2e0334e7e1c91c05490fe0d7be46cea5a9754af6488bfa413d974650377bf6283c8d0bb8e4886126058d28267af0bca8b886c0b96ae164cdd94483e206cf0263e30b892e335684d0d3af66852df56a62a825f6eac3c18f911088d8a072d586ccc69d104496ecc07141e061286460263e6170aef8b8281185460a9d165bc0ea7829416b161d22dce653d0c4c7d4941c297a8ed83370342082551656141e5f63ee3d51a646a77c4dcf153b533b688410d247068c2324b8a9c2b36f703327ba8057c795293474426061a3038e06115729d470d1190335a7b5b5d21140c4d070b30576e2480734579a3c21db03c34f6d73e207b7704b1b56e0c4e08e99b113bccc891d988483034e1834584ebe54ba2b951332403e3948ce3d813fb7b933e9eb7705afa4c3a74f913c5d582a2c99a93d1df0c8a155428ccc902046df47cd0c1205e55545366606cf982938b40dc07820e1d2c749151638b10ae748084676143931e7a70288181b095d497cf41993c5450970ca40e0ec919e23374e60e70a19167b82ecc0c1c1d81051d3830a90255e4660a035ebb70e3a429c18a16a9327cc9419d00263b8cce64c8153e28a8e580bb4a8b8f25244c9949a09660a8a9b155c59586682cca812457c636a09ae5b533f68d34f082fc66821319324c597291cbbca559d1d6366e46049ea73f3e2c25921bcf944c2cb1629194aaea40133bd4cada87df0c3855995b1116cfaa4e9be5e2b6f1a8dedd8c346c50e32661cb242f885d84286a607ef323522acd265cc1b144660904566f4444e1d2e7ec8c81192ddf44142e5ac0b0c332db898f093818b1aae255a7490cc104507bce83e719762af423420c1c6911872b030b1f265a26c1c4dfcae6c718132c50d1b1e9e3008fcd1a2b145c5620d19be45835e429879ddf8814546f443a94fae3a04ac534c58c926b43406cacb01829716322dbc507999784202860841c8a0802153a7da9966f4c2081943b6b0e4a003c56e6931d1836785980adb5223471409fad4e289932c116a90c06162ed94408343d03507cd1d2a35c8e8e94934686298203c3d620387122c78b6e84c99594a748929282296a70e8a1a7ec47271e63c9814655bf4e8300347c9c652424b4d082845c280a8b032bbdd14f0a297b7bce1ae5d6144480a086040162682942f48c2f02b256adcb6d8d8c305889728656c645d5a42c568e1e21927451d177bcc8ce16832ad942001d600fbed0961850b9a2eb75e7778306f0d9d5276349542023934fcb41053652b8a7749b129a16b4a0a860a1d39a642c841adbea80911064d922126661529242fb2fca863a4440d319d47ef687afdd2a57004ddddb1953a5360e0f9e5f86d308e54d538c308923e574d4e600182598c76d288c1318386ac8b4b4a45b670f8cca94a23c28d3eb382d0026262a89505d56cc057952e5f9618f192e25448fc19514648d5189337584a3c6e56e0ede93e1c6e62b8253cc9e0a233a74ccf902f1a7c8bc4d895254fbaee4871d1a2c5fca9289275d504ca0514fa85ad9038a377602ef45421093b237237afda2a4aa5b29132d2aa0565002222e2700df901828fc9a790b8a29523e01af27b72842beb0ed90aee7c606d1d33768b44915cb548aca861a0952ea0059912949c3023424c8b441416c0588e2258a6aaf0ccc8951555ad2579cc48e888e1234f6da38747c04f96ac335fb4bce0b180383c3e13c32c331800a4d66471d2c525c2889935c20cd3991d7bcc708c5539c1df012f614c767b9400157aa95a18592310c1f233060a9a1952f2069a009931429e3875a8ee2eeaa298ee13c52c628eb07a5336b740593191f3a607151126c71aa143b7e047086f7e70411146cb87ba1341dd55ded7077c82ee6801f6a409913d5454b6325a606250c68091b3f9ef8ae8d3011920564bdc08d94a43022c6d808cc1f86285c918c5139042a6c80871b6b2c8d85146c8d81f1053d2438b89951e6146464c41bacfa8ac6fb4ab14572feca58ac3c29f1237a0bafe5009016584147ffa01c6879aae3a28e868fd68aeca07d5998f1b5cc8267f92957744628080670c8b8e2e77d7a4926884eeebf6025dda3d0ebb18da7166ac44095b58679c44d5790a92250b4c9a165b64d4993c32dd27224d0cb9d2991e88190242941b47beeca112c54664c10db039259449a3e44bbe958c85ab4515d0d5444a981622b0ceec26515bb669e7c79c1f79a2f0a1430297232b729324a8d2f2f77b13c2961667bc44d1c144c40f004491d29af1430a888c0b49494c40ba2fe9424ddad84ac9c01aaf355777b66881b1246ac8eec3f58746d61454182495f2a619d7901950be623c9932b992281f398a840c1c547facc4fcc9c9a9954ffd9a316ae16acd32c3a2a85e830db2a45230e14203454c480fab256ac49ed3858bac8519235b515b45b09489327566872a450de1e6e9aa45d41cb03c4068dc5d319c12c8b080e2844c8f924ba336d1136a00cb903b25d8d07073a64e21d305260b11212498f1a016499bce01ac245578aae8788933e5c9182e2c3c5eb0ea90a0267f1d2631209b42020c123c85427905657da8d205c2092d118ce0a1b2e4e3c54004978ab02049c2044161c5a4aee9385fcf5a2b2c5d5a5c94988115c4c50852f21483126b23078b1e1779f0748056952e527af2906959f2f1caef502bbfe222c28a6b40116248193b64988c2dcd7db7a5554bac416ed7094f848624ab6357e52459aa5d71f46c8c17d345089a72a8e4ec1bd92c43332a000423170020100c08860462c120c9d2400cba031400114f8040665838960763915020075214c64008833010c4000cc318649c831022b201402eaeaeabe8cfc4c7118253ff80fb509bfe77cbcbe70caf2aea7dbf65886a20cc5fc52629be1c846eaca637b94a878826eb05e64c85b14fcf74a2cc9a1538d617c93bcdebec14ce2124d6430c468a6e4411c92e0ca78add500af2b63a2847d718ab9b2d3b0e7a48e80221ab14ddde0bd207758a83d3cb8a61ae939803415eb4e5996f49832798ea5bb860d0a8d13cc879561d4200a24e13f772d13a4bf749d61440d9fde96b3bc27d33149266877fd19afa0bf74bad62b72c52f468ff0345e5209eab2e7cbf773ad04021aba9ccf8e4d969cb7f50da9eecff78556e1425cd02ffbf938626866e31f5e69400f27439f2a984b8a83a4bc60a6378083b3490c76f4e4da6100d2f78a524f887b82af210d458762cdaffade2329ab81ace6778df010c0e7df570d20f68da9f5f60b0071d192ed2b77324b48097e1c934c71e2e06034e1e5db92c60d634914390d4dfa5b99cf1f8dd430fecf105dad9cdb772576bc411f97f76b2881695080644405d045f7dab7cd633914c9e9b551d938c3a40e05d908016bdee2ffa9edad0d0664cc046770774ba4d96170d731abf06685a7938229081e0f3e83f3a11f663dadd608407564e848337d29ab28a3023c72d118f237cd4d476fc574a6e93c0b3bd0fbe6b95ea1e3edd9b4d245597d0b3a8283cae7e2975e29d228fd9c92cea368f7e9857895c4621ce82ba91c8cb2a8a4f6bbae71963a98f82e9908ea5903a543d315106bb288de0e0cd7b38b9f866e612236bdca296220aac48b033926a7e3edb58daeaca2e3446e35db2e82fd51ca23b9ffdce3da477c155db2232e40b8e8fd43eba296fb367ad455225dd8b140bfbfe0060ae913cc5b1139106682da4af713b91b19e1fa955e18e154b35c7a4cecba870b1186fb3a706f6dd38b0150df6a238c1e67e5ee9bafcddcda1dd478882ba54ed3796cff518d203bb73a878bf1d0cb318df3159ff97a17e955c281198375ddec3633a3a6949f4d49a3d0e22aeb97475036771ecc89cfbe16864203d1460cafd25bd93783ab66882ec5c8a77789afb089056c716cba0ecb718e007dad77577f355bc43fcbf373f9bf176351460c2340a991c31aecb8a59dee94ae10ab18e1e5a9f17098f8fbed150ae950cf649fdbf38a3af29cbdc501e990cd9fff98ab5d1c1da6ab9f024d5ded1f7612c25a34be9bd8d83f559e9624a49efab646ff1d39621a545e311584beaa42b870fa590a23c9300708075de5547014c20e73b020ad54876de32f49a345ccc5de0fd2d23d43463da3cd034c65b17bf7050369a7e8b43045bdadd2f741dd419b18191d9126f820f60db20d4f20ab85545030e8883e45de59627e798970eae4c6f0fa45711f67b6f6c346c803d671b7d6918325b7a4f3f5403a14786863643ad1a4c187ff131408e4972bcfb775403d95c738c6a726cd1b03bda5272dde7b74424a7e48335b48e1f0e7047ef157d60c946c75c6f095fa0aaac10e723b05a0f40b87271a06e930d139f8197920240728cdc4f656af12133bd8bca2f465a35d4a37bd5c077eec893864856062a08c108c22aebfb14bd496130483f92aadadbac5082eb2d4b0be561250779baabe0bc00244761f099fb52fb94a7ebc67a43f782cc2ffd305283818c3475edcd17c431057777a7909648143550591f94bec08a166303a186db6d287cfa9771eb5b261be5e9072ae8a61c5a402555d100111af3c724d8a02d583b0e2cb44491f83216b2107f912ce3eda189d696f0c9da21d1c497d03dc1bf0da0a05db64280b5408b1413b2d37fd9591049b78428a709abc116ee34416838ce84a8b114f15d1b78b69f5d237f2bc533d6f32e5ff291d12c64a9db647c8396b8a18784d48b31a1989dbc849d544d848c5c4ec9656d24a3b1c8eb72f27a7d0b80c612f7c7f5f994630834854d4b59ce5a8ae617d734011b7c8a15d3bc8673ca271e1992317a7892e29b1996a309645960aae2f5efe180209aa8d074e2d5c3734bae379a512bb65ff878d8808e2b719ce5df330287c7d823b648208048f5178d1e86438e2647cc98030fdcd91cf61503d92a382cc15548784c7fe0de97837330229a90cf89737a709213efbd7ac688595a61caf582464e8d12a49a3287b7f355e4b24c6f8b2f4bbe9ce396705e8705edbb264081136b0467d5b8b3c494392e63786389699ede25f49401374cb7f0cc6df8bb01cc382eb14d756e072fdc0e203d5d5ceb11b5595cf369753c6d3b879e9ebe7cb757514a379cdb49a2c09902338b1d8a39383f86e2563f26304e2ec2ebdcc4b1446163e95fbf988557beed95fb8bf38002e2b01b4b1ff913d0b396076802119940d066d5d10490eaba34a6285d8684c7cdb334c29eac4e32ca33d5833fab1e02ba4026687b0c7ce23e9b9d957420e915df37ce511f54e6f53fb7c033a648121a764f2b268faae1ec77ab73716c7f117c36ffc710fe61041277dc4eeb236a12c39e99a6163f3a8d0033b906b26b5271af8ba3e705c21d44475d8923ade714d3e99ab489a48b8c88923f7d63a45b568e2e1a8488abd71348200d2e5c22ce7c2e1109e78e1f72370c3561f7e13782ce724d3a3f7fbe41734988e54e7daa5f61b5a94459378412d619fa289e4f557fa7043272ec740baff64cb96b17b35c3a044353a16f6a3c44a6880ef80e93e0c1eeeb24b04039691cde73ec272cc2017de904174e33cead3e843b5cf298070938f33e83515760949ead9b6470af67d68a8b5c6046cba491e6355062e2bcd5b4063553698c52a8cc052ed661973be4d2689970f73a4705e4df5c3a52355f1eac7a06bb63bce11ce86446d4ef4faf4e01f2ed59bed150402ac7f7b8298fd9b8ec5017adf56e45dd2690e3528023ffd49bdf3aa20c4da6773cbe96dea0ee5ab4b854bfc19f048b5f7622cf43c1a1b26a29716af7d6cc45f4af45d03a46d8267fa6c0d77412cf80368d07970966636d421e14a0e31b89d0e700aea491bdd0b9fc515206c24920d558d690729657e62de018a4321e574b1a3c71d31eb4dcd336b8ba56ac35342ae2cebdab57b8f94e6d99b57c1e084739b6811c80e177310f71cfccb43a3011859393e01ebf96122d5fcac14bc761978cd6c5c915ac93c4b7d0b3c253197681cd09c1f91748381743e49b921162b06d5dd18c3a849a546caf8db88532dd7f6cde502cf4a8b1e79ae8b43eb7ef2d41bf0331947e3294fb9108c3a5b7cdb438bd06d4217df2c31a032b7e3918c09953cd9a84e5d92ab13a4134ac4d74fcc87bb00fd009922954b666bc33c4911109d9cd11fe13328f69a22d0e63fe7de627f7b940fe7bc06c44e538250e78a8d05ef573a2058ec0f463907aee1544d9715be3f4baf468a49a62a88859c59654658b9cb4f2ee1ffdb47461c054d180a8cc77d58f8aeee5ddf6e00d9c5f461009bcd245073a4849755aaf0ad3aad2c0e8b3d49f5488a35e6f9e8ed729648f0f8bac6733c38b4fb9809f2e9aa34eac64ea51e6d92913458045539f546c2b309e3a3f2f968016bd28c9677437c7e864d2595db9d6735ae826da883d498b15abe18b28d11ecc3787b6c54c9e4e283eaa912c891f6fe0a78b90f9af23c9c5c797ee382c4eec2c1016a1ad103f6ccb5a0b3c51925e2205eebfb8e3ba39541ccac854b68d5aeaf62cc5519e92c99b969d5eda23abafcccbfaafac2d34c5093b968ff6c552c07ac59558e214a7d94ef56ce2c17877f8aeac578e16b0d6ee85b065d48e565792875886f8d60d5a39c9552154c4e46c80569389e724b110751d96a644050cba5479cf72282fc1647536ce9b4d6fdef93974e18b2ca4e9a5383005d353b1a50197b50eaf7eac1de76440cb32958308023bc638398e09df844522e35bf8b9e125dc199f31e546f6e948020e6a2a6c86809675b11c1776d23254972711cd6b5f1e943442377f0687a0432a3f44926089cc8130283e94b0040a247ac16c11d985f609858d59547266552483e37d8005a9de669888030c5816f344e79141e0503b2b7e7a6cf745a1b2b63ac04a1a9d16c609e27f23979885a75f5c0cbb7e0a514d30bcbb22271dc2c67c3ad065a28c52f1f9bc9e1e171dcfd236e9f3201164c8dab180d762fc45a001057d03d6a59f4fbb3bd73993502f2e8dda64bb90ced3ff4432e73d8a9760055596238b753bada91113416b9aef4d064a6ef806144b67f7cb4c37a05e4e55237ce9b36f12b094898b5986c2b489d2bac09c546948fb7a22a7506d747a55cfabe81348c37849bb18701dec74be5532620f8865290496052b6bf20e76dd2b578ff806dcbdbceb8e1cef2eee58f025f0e0b21fd312d310c5086b7fadb31c29d8db9785b1a204a02fb0d94f142201b8a006df71d0c9d5d6a0a690c3ba33cdd56e52ef314464d3f4d44682032e7a797d47f0ea120c0585b64b68b8e703c042839f461e120e82902b8116dc2ae5f08ed06b5cd07f965719c261ef661e98bfc748fdb07ab81a22239bc00ea2c3272639b86b234af3f034dd3ccb053aac794d20285e76f44ae7a444ccf8349daaa50402536a39fd56d5a1218a99e2fbb31bbd8193c00e00cc5363309f74c57b10d7b2a18573d715647a8ca8784a4a578f480aa257948ae9616f5b145dd6d071699e6ebbf596ceed571c341ba1fa011997cd49003f024ce835f5a93282a698be54790fb34d9806d7ffd0d3ce8bd733b7b7dde8c912776c9b804d47998fce0418f4e1fe370c0874e923ea08470f23e75f8ea653344d17eeec40f4042817571e12a669d597ea65e09883ffa66e0937d79a65fed0dff170c05d3aa7528c88eb9895fb47aebbeeb234e03ad52a80599375292dec8cb0eb275b7fd3db98b2eeeff390c158473b9b28b3356744f042ed532ead4b0a9149380f6e8524feb1d3586b8033dee12a5fd1a3c7c50a7b6e4b74eb2049c5348272b53cf8ed07e00e296d0fb28a5d3dade6748a73d5f708ab14af377cfcb32d747e14a9973b2c62c750e1703cd8a40381f67caa035db3a3e10c3d5d50c3e91390f06ad3512706fca963bc84d6e5cc04d4383b283a5e80a49e0c4f3123f7f01031102030f961c5edbce59c13e83cc893bdbea9557bbbb0fbec310012a71303bd2961e8894e464ee3b210fb0808045a05938e08f595d651450a7e3910024e9fcc1257913015f0d5b9b13bb1722854171006177f33768d4681a6bb21d968ac8f3341b5a75aac9f5267c92d3484ebb624d9b7272461dce529543764bf41b4d7b8222469e552ab66b30d941ea33279c5854bfce8d75968b94397192ffb24afa403a5f994f8b839a2a81b9b4b60de88850a8a4e360cac5ffbfb07d12d788629280804b81ec60e998002b7e3323663bc5042d86ffe6563dd872702632cfbd00883865560616700520e1b7d50de9a481b3046a1e24ba3f886774d8090fc20fb0fe6cabd2c022cb361447bd87453f1eac5da203c05152395c1dbf701edb542aa77ddde9b4f5ca888ef5c16c8ea5698a9643953a84c6e2a0a9c8de69771c019578a8fe7e32f1b349eaa96806689dbe8e3364b9c19d787ba2188b3d564dae83b87081628e2201b2a49c8a32d18f4843d5970c3e96890f0e8c3d0d47df842cb4157f3c7f7c5f5ed1b577579d71810bbdfa644e71b03b6a086ef78f0e92bc300ca39a32167459683c60c958637832e687cbf3e46c53f6ca204e297b4bed76561976beeb65067f85339f0d1bdca78cf6d788b8f93302c68a32293f2ee30124914c60eb2cad44f332bce596f66c7908822636434b0d48454eab12b0b68d0e749f17827c8f8b0ad6bb8ece4dad1de5ef302a7cf00fe5bd2013f5f2f81030883d321a49533266c76eba47bc3a2c8211ab5358ee1abb4c408a84cf806c05ee7280164f5b15582a1253c6935e424701f82e6c43836a44118b3337d0b46d8a60e8b66572adbc3406e19f33b877e23bd44a98c3be7277a0a2a93cbc51d7b0a7509a5a70f20c11e379c65505311d407cb09bb008faf5e41c09e6dbec50860721dba6ded18dba916086b4f8649b5b107c2ec137119edec80d87d53a199ecf646310a0d647010c54beaa2a889184ddf843697b4619cdee898599d881646b384d5c26cc22764b2ef8555e0694d0b3bbb526ff88a29abd98f43ca0f12ad460040b25f955820469b11270cad46d1b8e849a5c10e02793030a5afb1218cc2ef843b015cb19c7f0df1c61d9a3c94ae622b619f21d70384fbc03af1ad08ac926365be23217fd049f5434e02b900384dcc81210c3f349d0fa14dfa6d6607b71a95709365f8b424c596d0f6cfa4587393c964d857db71229b88ee8102d307856d0c51c4c2e2e47be6f5b035a22212fcd36c5762c1cd0f5f55ecd13daad73735b0b17d47b7cb396f2277e9acc2bf352e97a649c4501227ac2d743724f9159dfd4097e08350373511df79824dfd619fb9e5bf162f137bb3c9b6e0aa7600dea756975293c1c8e1b1363198cc4ebede62a07439c6a2f745f147436b1f521b8f8af89c2fcca2c061962c8ac25f1343348ed456e65595e120c71a18be8435f69f19cfd01f8af6a6710cf2958692b8ae7fc0b04d1983faa67ed4ddc5742643a10bea3123e547caeb0059ebeda349ce3048085f741c775959f1ddde0b8bfa52b77a15b0707031009a048e91e2eee91096ad95687f970871a6ae5f2bbcc4759d35e41ce36e4e64fd5de66d2dc99006273ba96ffb63a9af7b0584e4057d01df331dcc4f1171d41112e61f211b2f420854cfd4445a55ef1bf3deff265eaba1af3382f3c32d1eecdd19c08c67a2a0c4e2850c597e255038820ec43aab689320ef5a55dee45245c035ad2ab46926dd193dca0442614c86dd3cc0e2575195e3047dbbeef1e932a2a4cc23c47537c1907312c6c14ea4459d824c04f5ca59b9b1fa1e1242661a3465c75aec5aec5c77047650f0dfb3f1f82b3363689a7f94e9428d88385f218e300d04531d8fe0b945c3374f4408f5b9ae8643b05af9e48e6bfb7fdd9025f3a635dc2d403a0f69cbba75b8e76c4e3e09d4bc088ceb292252e769a296b90f236326faad10f58834eedd7cd60abb92abc8eb215b2c57b3888b51d082274d54f9375fde9f8462532edd9dd65b7ecf685ce1c8b40d6e7f47a85b9b9e5ecc01c451db39c32dc670834afa5d2060773e43c743fac8220e4a1ea31143b085be0782959d34ea536134f7f94667e20d49368ce3c7328c3121aca0cf9a24db276b7097a518056109f1bc8aa2ecc95f8a649f5cf39989c9ffea2a840bba9876927f9c11e9239753793c0c32eaaf5e243a54a67c2d92925916213a8201cf32a89bda80364ef657a876f61966ba89d0154f092e8c22da9780297c0cee8e28028a519580340c08141acd0b53b65ccaf10615df89e25ca780642b9f2015a7976ac121342297fa0f3cc1ae6bfaa31c3a51330324c8cfbd7c93c760b0d2a5ed06cd0a0b7a23afd57ff677e6e07104b53bb2b026345197aa969aa0d84c4be6c8d280b90dc182b344f7bd9c650d99e0100faa8c4520fcf892e42eb3097815123b9724df930a56b9438bb9004b097600831dcff6f2fd2bc9f43d2e52a2130bc47fd5afbfe009c8fb5634cdea59539cc74ea3054ca8664a2a49f07c9993eb99f92b95a298060f7e52aaa88b166e4be6b4dc986178de8c65f3fdb3684ab97454c057c172da7a5108a0aa78042bc9585ce4da446188c5aecb8184cc887e856189f5eefa3d0506d6f26cc67f0279de33c491ba0abfff1c30efe9436583098c3adce1f4a2e9b60eddc1e0f8f98b209ae8a09212d2e76aac32f53067311e23b931c3bb596ec346c2269196175ed3204d8cd13279a5e53ddd18e63301279ab8c9dc4a37cbbf6e2478204e78e33c3b6113c20761e44d52f724aa4a70d628c47de53bf10896232a0b265b8e30f03e88406bd4e33aa20fc316e6c9d584030a586b92ef825f0cda7a821af1ca30dbcf0a9bc04baa2476158d6f5ec177a7aeb1ef78f883eef9a4a7fd5fb9c51b8b19e1a3555365e8c95ee0e657d89cbebeb47a2ad21d8e5574a44901619b3a4e5e57f3058b36d3317e122c863bb4c154dfa87d061e3e1f4e74069cc120eba75c616743dc1ebb0e1192bcefc0d4b3999b0bd39110a0e4afb25974abbec30c85f8403f3a74368c6971d3f096ac1d0c305aafbd1381051f3739ef07ec74b8ab977f05b0bc1a1af1b346d61d1e712a660413075a191b997f347fc1aa9115a7f2f8476e925086df11c311c7665aeb72eb3307ea734bd19ea3035a091ad27403253816f172995ef7d54bcf2abee44ef6e9beac1805c18e77863bfc4cfa828f2396d96f14eb583b5e335b0a8fe2d724e5510c6666a4971643e92fca4841b2d33e8713e573c33d531c643c9f1b3ee5d740851ddc48ae1c6c3a2da76f2ff3bff6bb3afc5a2c3df901963e606c2066c04bd092222520d077da0b8d1c83723c842d2156f94306085c606ded8e17cf885346c7b87db1268ebf5057c01f7bdbf275d5b777a1954e0d46ae4c819ec69243bfe270e22f8eeddecc11edb65dab1d1adec839dac2354e5fde6775828763a37f4b5579ce6d30b453ced773a65adc297b3e9590dc2facb2f1aaf6750ce1f92462faf6831bfb18ba74ba6c16aa595736b7fde01bf066401f5b996d3ea1521d9becf31319143d4f6fbbffb10d711a62b70c0b938702170945d86d117b6d37218b44afcba88c95e548f5063c56dc8a2aa08f146d8c3a7941db6e12b4513a3754dd487d120d0c4aff3b580063b8d69993c4fe1fc040569ec01d32a9834119670e3c8c12549ef3dc2fa1e40d9f4caff68a1967d528900c55fd3f752b8617f03203f282199004a6bdbed182cbf73d17672d3cea61ba9886f311ddc255860809f2704aede2dfb87a7b296c0916ba9086b3a5b279718065182a29a49e9adcd7931d46ba05b6395c99912d73c1161501a25b3093d845b0512b9e19271d1ef018cde0151a36d6dae73f5fc2d60571002c2682e5807d84ef6b03b698019d233e7512d085d7d5f99656be3a92129f04a2582c6931b4d6805e47cf260c54f8ab933ccb84e8e019c23c6400e5801dfda3741c14627fb0ddf3b429c63b16c7986552f71c1087ef80c1131d840000177872f2aadbde83774b8f6f698058380f61ac396ecd6c283cc8f5b551bfc8978e6d8ee8d6741d37124e5f60f890c4389fd1b9a6fa2430dc24b1de40500bf7b323cbbe8332c73f2387dd6f5197a1e5345e926bcc880813579a1f50a91df8813ca8eda5cb99de51b02357fc332d8e750b9f979ca30a6cb9e0897b1abb54200e4988264a83707b7b6b7286c3df54e8be8fe8ffb31daf5dea6090ddcf5f27f42e161604fd7f19edda800b0e4c261b58794a2e1a79d687aa8b8051cbc79f633b33511b2dbb09c22c13ab71fed1cbfcb32fc7f51c7265447be5ced7b45dfcff91e4e80b98e6622cb6c978c631eb0eecc799351c2912dfd09f266e9178da94c97733076bf9ee138c96bd21c954b61b1c29772111fb0a722bb079a6959a5b9965a98bdfbb9f1b8fcc7e6d4e1cdc230d76ef1c31ba3f1d5cb3244374fd981a23e649ece107597361a3ccf30a0f2c980d7ec68f839fcce71fcb0132b840183732353efc76710a5d0939faae790ba4b5a7fed84aefdc0b738fa811648de4a0787c0f01e18a8c98db7343c6c42c876660626d35b9f2353f488a039dcdcb17f1f3199b440d0cc52ce5193670c60be645a1b7989d116510cd19af3b7339e3e3b971d3745cf97b58a50b31cec86d4961b6426a99a76652c2448ba857ddc1c07d37dbb7a241a8957440a79a06eaf1c45f962ccb4e39e3e285a9e82efa58db5c9895fe4cd8cba839e70b07fe1766ea64766f82573386eab674a5132bfe415da59d2ab3cec3dcc6a1f957abffbbcd273fcc79f5e291bd8d19109b02761e03149e467e4adb5797042f144c056279ab1f92519dce440eb9d98d3abf552c1ad27388cee27212e4021ea207283396737696f6c0b51b76ed2605c15fb283f41ff23474a30bcae82afe7a3099c2e13581ee6c4eec5dca6adfa7a1dbedf19bd77a356cc104626dd1872f4de66dd2ab03cf0de6aa627c3efeb2899efcf6eb362524263e0a6cb6dc2872f6fdfe7831638cacf7050a8087fdc9f77b3d31c602d62c2ce4fac27898108b1e9e8008ec97c9a342c51a81a827a01dc7cf0683d52b4da4c2168e3c3fb277e5b44473cd4b3367b4d3ad698a52495a487ff322c4c41a4437c0d814ae97294260d1b4ab5f8e4eecd00f759aa1e40467d134dec35dbb1407ec5864d4830bbb9236dbe447e6b3f2d168bb1d4a562c12ed1d048658f85af589e70321f4a97b68b5dc0954c4a8d3ae70e5c6bfcf2717f784c4be8e4e5484a62cb527902cf2d7ec56dd68efbe09c0b7065f533a92f498b963e4d5601fa44a310bfe302e70e55e44243c38b93ae72c10b5ade2c4d25a5dd24b441bdb6af6e98d40918ed2dd69824465cf29d3c89be559c5ef9f5c504baa0f0cc419ccd7fe597c0781597f4a110e3f1f427ffa9be06f4ab885b555cd05d71647134eb5fe02a04dcd14678e1471ba29b76408be083603482d5d8ccd4c098cc9e882fa505c051eccfdea7a07134a204bf716e2890dfa85c243f4876138a9fdb4325b19ed88e9aec66fbbcbc27a075155e7d1ee4b7fc074f9faffb2fb09fd55724ab6036e385832c2af61c6d8e8045fa3b0621fbe57a2b3649f0f97901119c98f519b488da12c861117cd79368a8c8233d8552c6e359ee6261174e2199474a03ac0a9e7a810a652b91849f52cbdcfd4bb932c414b7834d1ae7256788bcecfbe411719d380c85444e31ae9557f3b94904a2dc7d53a99c875f49c73ee6d8ece37d0f804542230aef226b502e4b0dd7dfbe4945b2ff0e61e6e87bfac08bd842d22296db8dcab51b9d50529c1da4a8fb3088e331d2de3fe5488976b7730bad865ca2e5c3dbe78863e2cf0d00bebfb9154c4774a676535d9e6c464a3ea57b11f75a9ba94e1710b88a9d697ada8274c0dca117930654b33a313eabf4fadc3ac9e079134a011c67bae1c3daee0d8c7ce92f0de160e37725b4e6280fd78488966bb5532f43459c49f95a43d495aac55e81d83e9d92102c874af7398a6710db73cc0455d0b6381ecec6dbf736e338ea3eae5a5339bcaf8fa1cd9cd92039c560ce785393e6dbc79f2b2f4e322c98018e86cfd4560268928d52d19d172ab95085fdd921136e73edc09bb19dc9cdbcef7b6ff8171827e29c0321c47885b0ad2e6184f48ecd7424dcf2d84545ebfa5a70d133e2166681f7c8a198ae21b6233959c19f3ae0671ce82a139142e512e69bfc878cab36f6f5c0aa5a9a1b88f80102a112182fc888e55530d71ff845316c251cc6cf218b64f5a518c9286d4624d875152291866142872c662ecc90fe73f19da621c42fb142e2be9ea78dc12c0fe245c3361592fa1421a7f6b7610f353ef2ab39cf1f3a30563cd122c7151bfc1fe41af0af9d245f94eaf3cfaf7e79279fc6b79711d25175f606c4abe1a7e83c8945dcc43de5047be3831ec63918a5e66a82b0cfd76b781ca8e4d371b3f425b1c7b9f5d7eeed0d62a990dda2a7fe1fe2516875599c00df541a0e203c1327011e08e189f808fbff2daee41151a1217b575d73299d6d9bde22c5cf48afe07894c42537789bc947570cee465e13cdf65e16ce4e9aa24d57d0f5f5c9d02e4b4e250712ae17fba3b06da94a65c740e7d3c29fd9be112a56836c9e0208fd7293f7ee302b17403b7bd182e81c11f9b9cdd4422a68be1fc715243383dbe0ef444879857ae1c080f21c36db75377412a15bd899d4d1f0019aa8c6a59d740e70057b73c8633bfc92e52334ea5a50c61b0032072cce68a732fbd1858622db3319c6f1bdeb7798d809b183ec3098e8dfd453337f3e52ce0fdf830cc0f9feb5ce125442888b1bbba5e2779b6b8dc826e4603d888d7c722c56871a231d3cbc061affdb2268bb1b208887c276611f3b52feccac1cd0d2bdbeee9eaa8687b9ad37e253ccac302efc6d1eef3b1c2ec5eff3a57961d6c44b43b4380843e996f5532650433e481c16389e693e2b5d5b91cc60d04f3374885902f0e32b1e049b85aa9a553085637bf55a3622081c6ce439069e54b8f654f391a3d5c16986142a183b6f011baaf9eaab4259b7b7488e60d88d4c344f574dceeea24ab0c2a6eb650953daeb5eadc788f488b9638b796dd53652b2c9a087d4668176f105025ae9a12049da199c027b9a9706f5061dcd934b39f15d00bae8bfafa0d3af7dc05798cc6c9aca22c68e9aea703d8fd4b0908457df2e4385caa35605ed109e4e7f0fd8181e6bc70a9397a663a3adbb9c348f6021c812e1114610a6d8c6f097819ede8074e7727b558bc81d3a3cbe50acb4415e98ce26ec9d78199629bd9d090ee10e686a0c91b5aee24b592224815af0dba67fc9164eb9652b8c7d0fc1025c67f9bf8f78e3e8637e9e9d56592940949b2ac9c845831204e5bf8c48a0c5aa5d43cda3ec68870274de6851fb768457363e5ceff8b94760b3883e693be7e8847ced8ae87c94fc2e69044e163cbe1ae8dd1a099908965c0b2648934411d381bd55c9568751d388f7d558d0cc087c152044dbd7e8c4b3de660def06cb164c346c38914cd688592218a7a64cf65f5e7c71d7fc1a2c5f30abf193a8c381e7fc2c70771c145ef55e2661a2d10cd48f3b4467a2dff030a958d2701cce704004d41d80de4e41d60e6b311f7fb8a88abe51b70128974a9c34f66124dc300bdc46978a182e27f86a9757d80ab28ca7371cffa459948c4b93858005ce478ca69614abf90bf62d95c3099ef6e3739b966be59776ea1069639af9659c1528c270011cade968b2619ff5e81ad9015cbff8566d1ab0f75ff9b0ee98019c42ee9eacea82266e954bcf662ec650a09c488aa667aa9ca898da73f033eb4ebac4a2bcaf19ab529af4efd4024baefc28d952a8277bb3756e31f94c133d54481a2fa85da605e562a0e8963171a91553142ecda4652e1a27821438b051c85b94962dfa4cfe2c961c438b6867e8d451fd29c1aaeee6b7b9d0d563798c9bbd8690cbc1e79b7bae8e507cbaae846c9bb1db4043a6241959da48ea53de5e9eff7ff6e2ca8721b1ffd2229af4d490db9eac6804cf9bf68376889f4d6dfdb6155b33d7a1ec800ef56ab9bc8e40d20486a61bd0841cf2f2eef2ec6095e073b399ce2f9c43a86af27835d7824bc00e3258c4cabb9953ede96b04ef00b62185c99430ae420b1dbb1e187e97d779d69e7199823898e1b270637818a7226b9619b0c025190690d1fa6c3528a1039c625b4be077579ea790e9fc1121681261001082bed042d39cb4a30cb9667492000d5f12a48dbb11e1cd4a99412981e014850de0868defdacf1c22f068a3bfa7c8ca27aa78595cb3c48260dbb4b2d56df59b95e9ec13b91f0a1512d05fd79d179085c445337b1400c0f989d22402d5405531192ac9c3e3480005d827e03de2b05faa156705c11a9d891ee58d87f56a3d1810495766db20e76ee4808c5983eb81079da1ffbcf0ddc2e288053b99bc4eb97b714ffa28fe07cced4a1db15726eafe097230c3642c740fa57c18d875d6cd1064619f527ea76ee46fe8cb36ef776a1f39e6c19dc06b721bc0ec8f3449c92460cb6ccc3aa7b18325f23329ea8ea861f834eb69dfc7db0cb814553724089ab316421be448454cc460b5a2e369988efeafeefb8f2c72288aa41df4926f15ec97db005037903c35eafd5c58003c49d72a3aff42bf72710b8fe74f9b0e231c63ab8550d4026163bc989afc796a0a1b60c3e89c3a898497581372e4af5930a1b82776b8437a0e6ca48661be07715ab492879ecf267fef6aa47cc181d5c78f983f6f836ec34e9b9653a8e3af41e1e89942cdfc191063197ed90b190d158f19aa124f8058b24a1593804c71df839cc07151c023581d370684f06290488e2af10bdbbc8fd1b19b11e9aeda79e25b9c2226c6ee8d69bc6c826ff56ad804da1ff70162e294ef03471f1af4ae6e96f1f88f633ed6dbfba35c7320a8b3efde124561047e954e1876375234a3a8b8afe70d7dc7919ce6c42a3e432cbfe9f99c3ff56b24aba148243848a76e3584815b4caa2a6a89f466e82232cb72c07dc0158f3e1253819adf03887d025389f05657a46260dd1f4786601e896e9c2713f10f46586baf3b33af6b81fb87e9f1007c2d97e247adc8f059f77cd803a1a0acf2bd9d82203427f6800e9130326b41a86a483306046befc9798c0b97659f7056c27442d1b5ce7d0191a12f864b9054c6bbf4a9c75bff639025e636ff6db572295b08823643870aa62108f84947b73a35ee621eeeb4b5342e6e711fbcc00218c341ee777c38c8ad978dfa9501c2c63a268e9c9317120c58d0caad49c8fd2057d8290066e314e30d64fb5b2bf0d999e2bd6a952e145341e737f5a450765e6e778341bce4534c018b96637af1066d87d40ef2e6bf89efc4a34664a7d87d13ce12423dc7fcf9360e30404c36a7207fdcfd4f4cd0c16eac55f43ecb0858ce9ee6284c1888ab838135531cc7b656b368c6710fa0b0780ff18673bf37c9abde372cfcd2942663af8a13344569308489d9b183d43aacc1e85d5bb70df9e338a62e2803b3828af6520d610363132cd74415cb397d2cb7e1be46e2069ca05f8cd3cb8b0588922e8b2a998dd1cb8b33ac93d29aeb729b665fb658b1731ee6f86d2b30e91a61350c2adea749b669fdce8af12f0d4f06c1135e777d4a1a7a4b8805948811f6ae7032a583048fc07a0aa60a81669995baa6e968e37de369b192052301959f8798e2bdabbc8018e9fd36dd43117edd191fba5d8ce40a02053ebb37bae198f6c1f708805405d620c4d28727427a29334343a6065436c506b64e1a2bdbf446ee1bafc9212b33a8d8b756f97b778380d341ce84973fce3bc143434048c84d3a84939ae7fe6e176ef730c69442e431191ab662d93846fa4c2059b848b24eb6a519245a94000a61d14ede7f653390ef9e2af5a8343ff2c4ba1630d7c23ca1473959b1da9c73a89f9eff8420d3a89b89670d022cf9b4601c8c4a83527eb5e85437277efe39c76b1b81b133b2c501fcd83b35dc909746bd71d8aef7c8ec0279a401a940990d8f651c32d87913774e3bd7050164f9183484b526de9fddf183390bcedca1231df76c63eb541c494fd4db68ebfa5ed32b45079ab5c46f1c31a5f9e44c3a616982e9f8ac71f2eb7be05bad8ccbbf7e158646075708ee4114ac4a57005ce80cc374243f067cb485ba1aae2e7333c98b35c9f4b211187a26aaaaa84d52952404fa2ccd23ddf67dd1a8e24ac2e683cd75bb801d376f9e8bf2bb5e52d0d3ec700a1114c9a55086ea11036dfe2bf1a86c7293b69600765bdd08f430ea94ad6825e8acf623f9aeb67fbca71f7ab14a142dd69e0da62a66a3b4f03166ef9012827c90228701d624fdfb2dbe498e989436770cf46fec6a3c8d7021d95606c8e7014e90b31f2eeba7768587348bde1280f8a9633a74501a89086a7d65ac572391c9d4318b9483974df8f1239ecdc1737b5182cce3bc6953ddf6a83fbc3192f4463ff3748435c790f4e5909066994da53946a1bd88f0d10e5ae9b1d9f00aa6c1cf48c7f2852d025acfbf7e54407a772708af7c41981af5d02da2662a71f37c52ab55c7e64f154df123726ba7b555f45694e8f3f2593ee2fef104df79b00031fa82ea132f37672e2a6d5d2e4e074d3b2f25bf98226d9f086ed2bfe963e8ecd664215626ed4c391818a20843516ce51f2b2038c9899cdf40f3249adffd8968c72424f7a40070fb9e4760a2ff760fb355b388611e7df7c52e63d71f2a3d40402e9fb14a2ec0d3a30648828c1fc7e83bddb6887564c83ed609db60a131b21cec45f8a9c0f6bc9ed6bd248867b4159a3d1e2393231e4995d22c75fc6a87558508cb0a96e4612c0632701a6409c7d4554870b949f29717fdab4f089641b90f4dcee86b05379bcf80b88b12ec1c347430e05e265e0e8a44c5bed589519c6aa719d638fa7882b9301578a18cc6ba0d8c1a862c06de041c87f80b53a50d21884f131aea2e69af4d7ee2a5abff02618b6e5d733b04d6749833d61835d4c5981ade832d4b5ba5ce5174c355176df342289dcbe323a8780d86e49bc9bd3adbab40440d60fa538211e65e10c83ff3931085af9db339ea68e601fbdf7097458d912908e394b06b1ef2a7a38103910c82ed516e40aa145dd5d14c898c6a1ca56aea6ea7dd18bcb621364720ee858b326367518d6bd694e0acb126252a85bf19a4211d4f9b94a4bf7fef1017e3b466bfa5e4e3baac4f7387c6778d116bd7c118b3ee4eec56090d185c5284aade38e18a8fdb43554b3cb0d5613488eed290c012c20d1ad77ea399fe6c572a6d6d58f487c25ec8183ff65f8cc4d5d7534f825cdec552c9778167a65d69dc7088502e11f089f96fef043951adaa37c8558adf2278ac39c83ef133b29889ccfb29d0be008f74fd3d2f583a7699aa95c15881b642d926d02cec45603512a118f26de10912cef08aad0eb908a485115598c7d15f3dc54228f3cf839004498e1e571a6c0c446940f46dd42fc1c2dbd4e1d992c288f9140bcba2b63a5839d627e585e02fdf14b850826586ec12c89d29b088cf41b71d9ec5b90c893ea404c58f3ff4ce8866d3339bf333ba74aed4088908abb214a7bb1be10f56fd7270d8cd70b05e1bf0f14247a6fc88ccbedba7df444956e7f352209a4a7c588b54e275e3d4d75aaeea447b507ba9646996f360123651aa8e2e776d25e5e3d66c25ac0de777cd5274cdc82665c5248285e9165c8d8d4c583d3ca8ca9c0cfaa07cd4de88ad6aa9594e61d6a1d19648386b7c64324445396a958583f5c28202f5880dbc6512e440afb848e8ec7114344ed8b55950d9360f0b63cdc874b2d9b4e51027c6e5f44946f796d108a84b0352b47e3380f9fb1b13840901607d9089205c29039ae9d941d211371468e424f0b4de6a66f2bf06a309d5ef1a4bec519dd61b1730247ae5dc9d637ac870759b093c70ad946c8978d441b43611589572549313161d27a357a5ace143014eabb64159be888539aa7a2b2b0e270c0d740ba4d4a7edcbc5daa3c64285615b7f229f9155e060e1ff56144b9ba49ed6056f9d5b255cc49b2e78f03affef1d28a0307d13a13c2b87661e39f3c1b7e0978fd5d47532d2e1cffe244c624a9ad247666287c5da8a5109752f0272f89f30aebea1940ece6c0f5f3bd759a6d0cd28a13f0272b52ce1ff86354f8d6da32eec04e82e4dc1025b354c8ef092b533d1895f0d0e2b97e7ae1452346739d2188dd14b0ba9f93af9782e35f9cc49cb29a23bdab3f56e54cd9da52d309d9a2799348eb10ae50a616112389e8f79b0d4bf5f30e1158acaf42a3a70d137f428cd03e7ca6a650ecf796db5085a38f3326a78d1e3ea246e88f1f7cfbe5de3a3173c4b571c78f89113ac287b4152a87afad6effcd288d531af9ff3fe7a8552ce8a89b398a9a5812f5b0d31a7efcb74af3b15fd8ed73263b4e3dd11ce5eb45660c638e42aaa8c54c36b322a488996c2fd392b364592b1cca3d7d72c985b66c88f030199b126f7b1b39842e7ba264364a0e45401592cd5e0eb6f8645ab28aaf0c2f1c14e54a4af6b1ccd348446494790a52ed0ec5fe83bfcb5f4d60dea55283fb9351ec7c053381dd0676af15451216ab48c530a3243965080cdd48624706e840bcb18480587504f26e570e4f46127168557e41ec514c890127b1c928d641be7615c6d09a937704919f822d5427986fdf130cbaa09a2ffc8cad9e4113f62934ac4f4a2e3a0bc42dfdf868ec5d1c3698b2f4ca1063b1ed35c0178d381c76ceefaf93e4971715e126ecb8a3de6745b864ddc9cdba84cd3692a40434942ec105132b886b85cac663ea1205c9131e45393d8b17c8728f233f4c3b34ffd406ec3ad75aa22f684291561a111bc78b9c2ae02260fd0e674224e63ba03793509ea5e76cff0036003f387a79f09309f54220be22c4468b1233a5dae575debde4b10898c8813d83ee317cf9908a0e915ba2aa9e2f7a8e61b23353c8091a3aef0f57ddd78b3c87edfb3d8a1918f9b783db03580f5506b833be41291a85083e8abbe620436a9d359c943bba747bc4d34d8f1c20320f8efaccb27fb6e887c7246b51728067497c13d417588fde6252c6e9dae78152aaf3d85359aa128d769b248773394685c2f1540a99dced487be0c16f2a76dabf6043d0c59974f6ace0ec4d268364a51888efa102d2e8fea603a26efa82fd322fea359b6f671033b00d0ebbaec1fb1ac3e82b92213641d581f2f3d20ffc17a11c33d264d29cf0de92332a97d8a13023a749550e7fb0598b87929cec5295d188c3ec4489ca1154d86e8ce7b1d2bbc4dd907bc6e880a9320b12286025156bea997662765781386db424b71590a6f0067f6933d1360e2896e0c9789af01dfab63f4c60047f3387720c865876a72c5ca32c6a2da740c567cb266b7fe139f5b3beccbc1fda2fc721a5e10604616e80cd9cb4b4609a91cfa2f7d9a2e42d55d8f5765cc42fc9d8102bc87d9d323cd7e7d3ffa61e22c16c7c5acb4e08bafd4692fd77d82d48eded9d4a26eed1a786d8fae806597922ced03844853f8871a77338e38259379449b670305628a53e5b0b9a2f6ed36014530237a28c047f5bcb6dfb8734b95757191cc7e094828bb76e0472cf1dbb46ab8feaf4087313561be3e2db80b6778731de3e4407d3acbc5c63e6171de72bac6d9f382989dd24eef994888ab86c01da63276618c14314799091a2934e3a675b41e56f81868307b702ae826c8b22c6e3f7677d2e89aa2103dc29cae5dd2524a237564d5489ec575c64ecd4e15a084787f1fc4d72924b7ff7e924ab4655cfde41712f437e5d7be900e52d71bb4794103e1d73a4725beb145879a7062d9542b8dd8ec0f741882b46bc882edb79738f61933f4ed70d8811fba361c5b38cdca09b1971e44120898599004e43f245744a4c4e6f85a9208a89ed13407d258e0b757a0a411f6d443f61974624a247a58027fb05c5be9245c350c16fee78d447103a1f34313469d682fa7a4e6911f97bfaac723e07ed4e978bb4a29ef1a042cbbfe212f6277d0e19383311159958a717ed1442289ab1a0a724f3f5dd785bcbc6d5a640ff067ee32b5f70784bfc10f841a30f12aa8c45348bf969d5223d1b7a846d81c8b2b78bc7a6f55c4d69adf1ab2edfa0e9b445b269d4dd36d801f871a8488590e1c864b87b2c4a3460f9ca727e1bd23c8acaf0f566a4d13ff2bcab3c4aaf99c046841c5a3fe1da5496c8a616ed8b4010839022398a591ae131915f48876c40cc28c60e62180a57678521028037208959cb767783150c9689a06148c9c9dd8bb14463308c538ab6f033b3920f7d36dd376c45a1d4db5ceadaf1df6df824ba391c7b610dbc7ebd0edf20af4596dab34fea6fd56acb826db6b8fe21cb8ad1cff79d2f1c32c86dcb0fabd9b04e86df55c98f31d62fb18895239ce640c929c76933ab2dcca8b4c8d8960f4fe1dbec711277d226a99f2176405b191d00df744afd972c258724c2695f0e596557801005a722bf27822e62a6c97bf780c01459a0d268a04a1daa42fa3d9021af49629ec819febb0cfc78d976362dce3bb061ddd24c43be6c8788261cff13643a80cdc1d1829d9cefea93549b8671ca5375080af1d6e3b41686a33ae92729f9fdd08061bc425999843da024ac6f37e638feb73d38c93693aa2db935fdb3c62e08d36a836c25e86c85225493f50771fb81c1f352d320c86d22450e772b7449c91d60e04c02e6a6852cb566345c69ef831f9304c159ef48fc3a304c1a00212c7f695ac8dc8558ea310005f1ab65ef80adc4787fd118cc25260e601557b113ff1b1ffe478539a64d568cb548d03cab6016232158a4818499189c1b7f2399b8f2bc77b5ee834c71e893bac609935e45699d03ba073fa0e125e1fca699b0450446a9a47863d25a47b8570cf3886aeeae5de867b72b93df3f6133025ffd669613012a56fd03150913139cd31e8253a7c7b8046c4262d11a1cad5e692ed71bcf39ee9d26d2dbac29944682ed5016af0ee8d827afeb67801be87bb851ad98b9687a184c9640ea5c5461fd6d1eddc5419d6ad07e6f0c90225a2233a0fd38ef5c6cd50ae10760c1f6403fdcf71a3e83a9701892041bb810f0da22d7e9f4ab6db090be4e4ed558f88a116082594677c1fa85f775d57635d694e43eb4e21ec8800ea683b3c0de1278e7fc44bafa436033e3871e0b38f8930cf5fb1e30c1953db719aa58cea218acf3a8b095e5060bd40f3c402d34687d745f9eee7a6c9288b2705d7ffe962ea8d059473079735a6ecd9c1bd1f4a36a9e20210ce1bde8f5b74a0388c61a8aa56edf2b0aef737e3df0c3cc3438705b8aa8777d31a39ae650098bd8dfc13be1dc6ac368cd17500e11a3331d352ebe4484051c842d7073b12b38ac549136380ed0218310c84bf3e72767cf4b1dec7b63d5a3911593a2a8cf1c5454bc9696fd8705d97a54002610954023a4368003bff7ecb8b68e49dc19b638ab6a970809fa069e680c7a6620898a533fc3fbed3f14026f79bf29e53e128bfc7e90a98411164e3cc30e6c6a4e8d9f3b01d145f42460d060879ba0861ab9992a50b850efe80af5f4cdcd384e57e98e12ca87f0cced6da40b0244547953705e3536b6c88a5e24a3a68e4c3bec45f4935380d08898efa176ac6a8d6a7eb8e599f7e17a9fe48490dbd23a21dd34954cd457441fbaf57866dec09170d5586f977f7cb43a93b1b8f29eab8171ca31437ecc12943366dd863d3cfd2f79373cf9b4ca0bab4d5f1e30903874052e0d6afc2b489314268b17eb3365fc89869aaa8dbfa3fce4b258d99d288739cfc03b1aea60f335a482078737cd3e0c7c59fe310cf3c4a4b931ca14fc3885546f597cf6d547500e96b3421df8d94ded91418aea45bd7cae5cd66978d083149e032b7ed04006a20f01bfb94992f4ec240cb2b8a2313381d5b91a20e37f7084854d9ce443ed0c663292819ed2a8927bdc4e06b20d89e5074966179b59a8b0d4b1279bc5a5975e92b8b35f14c875c628fbfdacce8167947fc3c41840010c81c62fccd54b813211fac10f448cf432aa7f909aaccbf877675b94c201c44a97387198d54f09682e2bc04db4ce4bf55414f3f6251307dab1d4d4dd67e2374e317fb76ead5cb78f89e1888792e55ceac5aa5eb15aaefb72b3eeef8c013c7b03fa80868457204cda4a072d6644822c9c7ec79279210f48ba2216b84860323261eb3da988ee61ba5ea711c3c8a6839e7473be71015cbc7691d537596c6396e339ed1ef1b86c9804bd1edab00f1d6872fd7c4b4bc8de7bcbbda59449a65d089108020845ba70911ed6a8434e2a1ad65c911e1a01417e1e9e394e3e28b2d2648146ae70911ece8e203f184843a721072b4e480f8ddc90b3aa089715e9213e42f6982c240d876c2800228b8b7ca2a44f00ccfff098285ca2480fbf28c8efa7873262b4da072678f0901ed6b2c88f4506330c11457ad8e4934fbac5c87e0775c58a8a8a92423aad8f5ba9567c4528c02cd3efa0b3ad327bffbbb6fbaeb541b8ce76dcdf6bb7bf96e3c46b37fb36dbefa0a2eee27383fb5d02e1cc2c26ffe4269f50b4f97f991bec5f6bf5f2992203e0d499e34e1b33644012b8ac5fb4da88d95ac2954b30bb0dff92fd41af3c77fcecc03b623b603bc0ef2ff21d3bbcef37f21dddf78fbee37e3f0ddfc17d3fcd776cdf7fc377d8ef5f8a85b0f0c3316ce2418fe6a447f5a908fa08cb9406731c7670d8c16107871d1c76704ce151cff33cef19f321e77b21789a5e4f30f29152998f4d7d76f5c066ff9acb99bd1cc1c4f281567b9c26107cec3779031dbdd4481d7e1db7d9da35f5d979e4fc6e8a439ec849c134d83e52ea75d6da5b1548a9577f4b299d7466a5b4ed04fa4ef779e79ddc76edbdf5de4b7dde7b1bcf3473dbe6b66ddbf6be6ddb94f271ce24426ab64fab6f4ead95c1dddddddd7dab1cc7518e738ee326c7711c575487f87a4e77a7b4565aeeb191bab78de36adff0359db469ac7c7ac0679fd65a6ba5223ce5497d76e0cb7d76a562d3bccdcac59dda0da4c0ee5d423d0edfe720add5fa7cebb4525aed06eb3c8fdbbce9d13438ec24a5301b4b8b88fd017d94f938b58a8850735123c11a89865cd9cb9d264c10790a813b4d982fb9bfcb9d260c965cde0c83e54e13464a0eaa138aef7a52b7fbe6d5bd525c65f4e82badb5563ce6ae94525a8d989f3b1eb3fbf6fd3fceaf2524817f6a802dc1b12717e44ec345a76b5073168005e8d30de5f90e8238480606611fb7503041094f5875605051d6c3aa70cdbd85c29239281ca1c9c89d86cd9c260dfa913b1886e40cac56907a09e4504a29a51998309dbc68065c824678345265f33a195d34098f4b5b4786a094524a29a51cccc94e23255fb2bf2de2733f437d88e359511b8278029ed9527202bd94523f41a648644a29a5d4e8ce8b335e1ba57406791215d14459c73e40a0e22ebc3ea26f371f0c5812f0a40fccebe08479f0bd08f48a2b72ec67e1ccc76c46e979428b9c3d144914ce7c107dd11789438c8020891e8afc8862efef307fd85782b9defa9c58d2ef7e0befb45169d7d53bf44d5e5b3c154b70aab9afefcd1cdd57a92477e628b9bfd386d00bddaf3e0a6ddfe43e0a8973ea4e1bf4bbd09b36e83b8c039ab716f58764e1fc4a32a7c21ad2af4574706963c8fe538f27513d330710709c7ae8971e0dd027a3b21e1f7d4c54a6e26cc2090d9e4f34e149a28c78d28c439ba02f92500fb4321527d7d4e2800a2e27950fd9df4b204119e883de7dde7fde3195144f62f11ee443d76a6d66750d88ae71ef3fcd74ed8c500d4dd786de7f0ed135d9bb0bb184ca2e6a18a4de20f6836c4f9f0b83704fff8641ee07e99ebe5018442896e9b70883b478fa436190a1ef4692854164ef22c44f439fafe18683c219fd9ae9b3086714a86ed6a38c6c29e09891d0a5845ee55345978a7a8263ef3d2c1432b3f7b3704863d9a04216399b421259696145df3ac1ee54514e9e50ea43b4cfe33951ca8c7ef8d91a4f701567d5a49a8543b617ec70fd400e79b27a7a4c1692e893b8f026fe98367e4c1802dc732a7af402fe3ce5ef4ea2a43cd100f4ad1567485c30101f874caf24564491b3270a87884c48a2ff1a08d91c2afaabea02460c296d709d45ef5f4eab2fba0abfc9172ffebf01451f8a2480f145ff22096ef001e38b9e0431fec537f9d1281cfec3b0e8bf67b9871f7a153da28af1309ecaadb8f52fae253b0c304638ab1fe3a1c8591583f880f131c42130c4a6fe4bf4c8bfc9a22f97608837d46ff245d8248c4d6c72eb30a2a2a8bc6a283b5580933060844e154595bccaad4f5119792136bdca6e5dfcc0cc5ee523ac8753d1233ab874a250070ee42c1ce252504a58423ed1482aaf9a39baecef35fc20c0b4c163daf01a34648530734ca5dbc4c44d45f62db987d42c9c594720c14512855f86fc26ac03f7a86923844945959c0810f72fe716265426740d2f1ee5369a585d517995cc6580e9ed3ed7fd0c6b087902e9baefc40dc8f2fc69e7974064b9fbadfe0d4b5abe7fefbde5e7b247d7e20664b90ca1fb12c4cee5ee2705ec1fa3def7f752d689976e62874064775aa91cdfcc032ef773b945ae690b052e54d0e1091922b85069b976a4aef86c90c70d0b414c8152050e402de0b2b1b4e04c21116a920492395298a820e6aaeb94a0888f0a97198a70324396312f6410e56686b81244e97542c10bc99715154a9ce8ca0649155ed79b1968b892268c0c4374fd201fbd16e14672d2ab5b3765de088930e5083a5dbe88a8109502233f7099202a89152b98c1010bd6e1082580e012d41c13335d55b8002706297a091350f06448494d61c226cacd185cf45544691d336c5e4811c1224b4b089f226c2c103f54b1689347892d2545c4aca1d21e9d13c87456c43c41a60e192f17a23053d34c21d4ee17ca8529146cb150a607203c2fa916be0044a1b0a58936327079522f9deed50722403e1c845b31c8fd4d2637124aec89038589269210a3dca0c3151368a8c8304b012e8328ad779240613126cf1102073d727a08a288372789091a6bcb962876c29c004ed59ef14e114e2881e28b1e29cacce0c9f9ea8ab0b480664d0a54c8c963c98c600a365b6e10024b6b89122734b1ed9923c50b66b89ca002875a7f082f4b589922a2ab0420fa0e0953605ae487234b5a5801061436329346d6992954649c5499e2ea84352d7ccc09562c922a991f6ed8a871a14a8b1216dabd385c05f0bce99263268a3759ca4c2f514ea0a45025052b27c0a9d225a1250618b644d163478a7b191aedc104363610e1460a263cdb57580144a0dbd848f5b7f082698306271a813d9763aea1376dd4af7103a68d505019513b156456549a743501a34277d55f4ce410468d1226dce12104689690c107384478b5a922668f1798d5d6143d5e5ef22c12850c971a52d8c1090decf9b262052553e6309912e3339b6aa2cb04512418e9b680582778010924174a052e2e479cb9da9ac325430a0d26c4d9c14b1e3c5566563725654b4ad6d60a57595b56b47c40c7062f546658d205072a350a686aab062ab78232b50505cb1614a9d693a71112a2f20c41979b266caccab8f0869c4f86f0b2031e3a4448d14095a8d3a93b45a848a7e2dcd3441138a487b3305d4cb8a122270aa65898223d9c65b9fada49169395a70862272f5592f958bbfbe047604a9956720ade077f04a1fb96f1138129756a778fb3a8d22ff5bbc10313e3a7632fbd0eb8ecac0f9c07c632b17c4a7b24e0aba4db174b21dbe5dc37c8ce71224c262c78f3de3d71c813e97d880483e0a30f1f4324d815c0919ef855e012e320fa3154f0ba8b9f084cc14e952a2e00fd928e4d7d9c774e09622b8d2a9e2c5f9a3b5579981061c2c31cad229880e3644f913d5d8800c1584f8aad2a82c818e1b3a9105bb2cd5027834e4e407fa092658e0e7680008289deca6ad3c5049823a2b042a64912d507355fa0170527de70da956d5b6dbe6ced9933947b6bcf0fb9cbbdb5e7885ccab4709407450f285f52d081412b892ffa8208a4f2a4a1028938509cf01f7ed021678d1d3955c4a942e33d0175c50725ca60e192640911a35abb067effd7a111a5ff2935d2fdee0535a05aa214fc94cad7713d2988f742ee4f2cf6a550ec4b988e58d26634d2e03e302cc70cdefbf1e091c1a70f3e98056665f0bfd01f0cb9efab4fdd8fbe9fe1e5fcfb3ea5aed59a9f2ad5fe82e7074f2f7ddb36e86f30a746a2ff7120e7654f5ce2e00c2e3b6b6949497fe9fb7efbf21385d0aec425068f409122883d0946107b24938c894326f96dff85dcdfb0b3d7fd154273fdd4fc5fb106e15ac10c995123f8e8b3c5d27a7777571bded935eab58a3f7c746bed971d6146750df12f103492cfd99c33892b6940e557eef34bf659694b41a3e1a33b8d31d70a82ae519a47a04a3fba2e55e2be2033fb3355e1ce5cfff0910d2e5bab6b478de4efef53e98279e4ffa38f3e36927b7ee105cf2f472deb1ffd267d59ad756a40154277759c3a753a06994669c8a8d29049cae811a647f3a132065d9b11a862c547fa820b2e75647ab33057575425e26b234a61ffd5d18894d4bd629d54b97e9fc8820654f37a4ea29e38992cc060b00ff6b150bfefa0e66f46b97f16f4c269a491c40eb83ca35e84319a55b5fbf51fd0b50c203095349847f5ff89888080bc5cd2726d2e2f9c518d54dffb72567155ae0400ad9e59f5a79afa26d7ca956b7dee7ab4aaa4566bf374526be40ae3c0e9deef60e63b59e89a53a51bb429d23cbfe882e73badc146b97a5fb9af9ef7756a7df9fe8a6572fd4efc625feb0fd08b259031dfef40d87bde7f61d958f9fb6e258f297b1964ef287bdef77d9fe779dff77ddf44bf707b2fec60db5fcf134510c015575c914bf7bc6feefb8af43bb4140f100f6ab6e8519325882421ec49b3736fddf0c651f8b6a758d7895c8213fb2522d3073d69c847cffeb6735a009b5d6c7200e71c57b9ea20b0f9812501af899adb727efb39eb4d8dd4b59b038056cdba3e55053c63244e2e679411ae5cce2499ce399b4bc24a32addf41cdb509044fea2d2a5eb9068c03afd5015db336375125da16de68243a459a185c36570642e8dabc79a6c8f4270999fec5b80343128ce07b2493fcfee3662bf9706f67d95801c08124231b8d34779fd96321aef62be75e75989375ebbe6d6190d30fb86caf1c02900e08f1a45208cdf55da96c3d408c72fd929bd6ea7ad094faf3e395ba4fffe476e1a21b69ba12600b50b8980207680a11788a98fcd5293ce4cf82325c199a4265ca54c6334f719b6242be028b0babc9d3f0081eda904f3f7670a8017d9c6aa88e60c983877c7ac103391b607fab13a5c817f934e486b44784a1220cf95444a5a91358486b83162c279035b4400b49c39ef9b0571cc2c28a3c31904f3039a47d28728613b28a18c7b4a291e398b6ceded8ac51320459c356a30349c3999f5e7dfd849a306a68369c5dad1790b8229b082c3d5491dfa48287ae2984950c57e447378083fdbf2aa70623a4661920ee746da00ddb4c145da6c81abe90c29360c9c18aac216c8b160c5c348264df5e6ce6c1cdb34b9819aec88ac3d746dc97fc4d2c59e849ae4ef29dca9f8d72247f1b58c38f8adc224efe3279052b9f4cc3dea2d221b791bbf03598ab3c9f8727798a42bc2fb002872bb8663e86cc189c905566c55903ea5b3a328861433e715590f5ad3864e2b942e504f2896a9155bc8e834a0d0f48c827ee8b080c6ab2142983440be453cbe9218d73b1b026ca89cc61d345d6f04613d2bb4ca1e68aace1e4b285fc38d08693891aa6b822bf0bdab0ebcce024ab036d38bbd63091226b389544919f3726890b541f68c316c315658833e4078236bcb1440a2fb2864d7e3050006ef0cc030a95a718036bd85d66481b0e99607240b3841cf2c435f102d98ee3a9b35a12361d29a40d87b8093a9499229f3625e46ddc3f2758624417b2862da7095975f8da2b0ba1b91b69fcda8b579eafe64b559ea2109a012dc281a450bde7cb16ab49a1c62eef323674a9819af9a0436edc21a908458b4c51468aa461fb50822216c81a0ef12498acb1229f6a9a1dc8761c5b125e4fb131643b8e279f265ddc1336d09e7cac20db710491e73f7147cc90ed38a0489f3877c81ace7cd0a745e2a8c0455291b665822d265f9eb57e440c113c240d5f94b155ddc40f5a8c203d7cb10299c60621ae203da43186d4ea62e585f490861452061b928643260954e894403ec1d290ed384a30cf941cb133851bf2298806dbdb1432a4b99263258710396091dfc422831912899a2b3660d128a8de4455af1daa6809417eb60838287ca571210929d2c3a212c821be43172827904fe00e597086d0b450b13a0e1a3a985f81749d9e938edd111a083a08ce35df57ddfd27bdee5389d77df78573ef53aea491413a7deabb1bf5f964eded2c042ed989dd477d7f5e4bb93eeee9e6a58f0cd63964d346d7a8520cfcfe0f3c09f698c4a14ff87d3f3990bb9f3fb98b7d1d2cf41ebddfb22702fb1f05c5d9489ef7d4fde7ed91d38e2f968a40b759de93ac1b376e643dcfb89198afba6c86f51f1708812a81df78ccd2e2820955d1f5d83dcc0399fbedde46ea361064eeb706c42041b1fba8fb3b42e67ea31d95a961d0486e94c70a86e90e931da63a4c29605a82890e9317d31c26394c4ae0f9225f4fa23060b0080632c56182c3940413124c5d4c28603a024f90c9083cbf99de309d80c90d531b262e26364c4530ad615283e7336de1f94c69f07c2622f07c262d3c9f69083c9f098d11c824840c9029881920d319fc59003299c1235881187e0c18165821aa01401fe9886543265829562e85b8fd3cef3be8ec3d54eec2f273f71e963fb2ff7caf7f43a8eca1109b3991829936fc8d0d7bf8dfe948607cb7a97cbbfaed136ef56c52d9cbcd08971a7e8c68d096b87ce9e852443fc135a9f202665a51d3f5856bc6f9c02f3d49e9534e9864ffd29ff8957f897de9655c8b871e5c8d7be527f097ae874a4991ddf31f2b408e6543f698fbd32e1ae74b5a27fb37fdba939dea99ca424f5a7c59a5545969e17259b5d4acec5fb53c69e8fdab1ad997f54df552a2d689729184e84bdbc40995550ecaa59592dd5e657f8be549b3f7b7658abeb44164b75ad9df7279d937d9bfdcdd3dcaea2afbf7c44355e55cde35e51e25758555f1d4afecdfa5adca6ead32b8a14811445878a10424c8d27665cfa2820f48bc98d1938709b2b45ed9b1ca64a3fce26730a717f35ff47c219637cc572eca454f04732a9abd0b98d38cc84b267a19cc89e87e794565173f04737221db0a6342967d0b9893cccb432f04731a6ac125b7f82098530ba1670173120ada0243420e7a209853d00dca2cfe07e6c40288072132d0639813d0cffbc09c7eea98310f3064fc319813be58d9e76130279fd8b79c1c7b10e61483fd077382555a2ec10c825faa32e8254d06df833981f8fb0ee6f4adc91e9decfd8539795df71ccca9dbcab74b91dc16e6c4e100e48d8b97cdfeedba44aef56e5379be982ea2f0c559b9fb6f51159becfef8005555412c59b3030a469038a441862853286162cd10a4b70c88ec2e042ec7d1e72a8c2cd38f5d2a5754b07bd76c85c9eecfe303107eb8bb8330a7aa23574fba71767092e97f30278a8bc058e1154d59a21bc01534b7280a17a1eccf2d6dd9120351f6df8aa8ecdd32ea40e68614d9bf166131d2d2831b1df0006c98a929624b4b0dd9df3109594c9825a0b195431e174a77c62ca7f495bd4efd764295aee8529413abfd4101ae4f7812cdc72f4fbae1e313575aaa75562ae585590b98480ffe41016e714a71f55d8f2fd1257a54a9915b69935cbb50b694a9156edab284c7a388e8e0f206ecd223985315a22770d406c25802f72832c9260f8f32a894d6255addcbeb7852798336f1a4d28dcc239da3045dc353299d4eead75a2b8d7603bbedf290f8eedffb5da3e52b94effcfb8ee565b4b852bb935075bfe4eb5612b8f76377680b2e65190430fce1e3fd1b4470908f4d3960eeaf57e53b6f90042e10c2e7c39366e043f910faa02f9b0b8414f2bdde42bed7a3e47b7f0a8951f97e90f89f07897dbd31b14ad0836137d2b492953748fc6f84d17c2655d36e62d580ddc8fdfbf3cb93e8dffaf73dcaa564548902f3e8fe95e12fffe7cb1148962f8b2f973205e6fda06721963b841e482c935afc4f733d16cb19b96cae98587614f98262d977e40c796239ce6821d26a088949e58efb458feefbfd26af51c47dbff76fdc7b450d543c3dc072996c6f2cf9e84934a4ced1b5a6ae396d9a0137d19ae3862719d1255c1e271c9eaeb5c8dc539fe73e055a42e62c67b98d7b9f90871f715fc3ca3987c7cb476e684b0da714f73788e00d7cfc9a7ac04d8fdc8b03614d3d6016fff3e5d4e266d5e781be01183f90d8831e718fc5490216a28f38bf32f70eabef493c898fdc77e6569847dce3d8974bd957983e1f13cb1df83fb14cfa794f2c6be4d2a7be13cb19572cfd8a8c0a762840e38c1f5a0dafa4a9e42356edf0a2475d3e72ef717ce4de457fe3e30d2470d965de644e96fbbbe6a346e2c646e29e88093ca5b82f52c9257ac4c5f247419fa24a589c5357c8bdaad0e811f74453dcfbd4d4cadc7fe023f7dc7f1684b104f6e951a4924d8fc2a329c5c4e45e8d35bde811f75a53cb93b81ad012f388cbdd48d6e93412f7b32606ffa41389cc051182f3f75e8fffd1b5fadcb5402bd112fa887bce8b4e0b99fbb2f344c91c47ab32c7fd177a0a1a897b2f743a6d83fb2e74af46e2fe865ec747cef1d023eeb96fcabd8b25a66279392ad5485770e95399e3a63ca9893b712adb85a550a631b8ec0a7c031e1f78d039dacf645a41d7bae9e4fada68d28af2fca207c572fefc713e96d1f0b5d198279d755a3b77706973e5073352477c214bfb53b497cb1ab07fc1bf5fef571febbd5cbe5fd7f4d8b9a4490bb8214d8f9d3bb1bcdffd7743d0c73ab9dcb99c7fdfab8f539524de4f04a8c4f1b167ed07b80933e8fa95567f2240a58e8f5de2f6d97509c241acceaa28028dbd1178daf09fa1376df8d7b8014381424765d5722e9b39683e5a7b6f77853971f665968e33fbed485c9c09bc7d394e5807dbcb1e0361ce84995be6623cfb520dca419e44bfd65a6bad33e0f941321f67f4bba8ca98c04d4519145394eae88dc09ddbf799637b7a548f1aa9fe4741ba3d8773c533c72696505c383aad52a51e6b5f8c6bd6461b7de4709480b79f3173044a4d8f3aada66efb7ff7a8573b30b028edbbf82fb7fdf4c2a74778d62c44584d6f877fe89c7f4536a435a3b6b8b104decfeb3eafbb5540d0dd9d4e9ae7d585ea30a76e13a295c68d251d3ee3cbb047956830f08389e5053fd1bb8acfd37c6e016a5789bd065c31dab6d92ad268b4aed168768a7abdc062c68c1940b4da2a041640125ca1c460f3be8e8c8368805b6822ad0787b1560f2d2dad1e3e564feaa1d557333e590e006090df123550f6babeec0d56636dd04a4d03e8daf6dd5d6e7697f36d76ade9e95f6ea397dbaa9d7e2fc6b2effad148febed5f5a36b3fbaeb07a78477ed147d7c7c66d68ab1469a5debdbf7d67a04b7595a695091d10d1dbff9d329410dde2cd639e9cc98311bc603d68c195836b6d2ffb5bfd9fa1fc58cab1db6e8a0254b0e58acbca23a236bb005cf1908d670b87283151b6aa0a1aa8ad04f0b2a433eb2da949a94da0c35196a515e74306a54b5186a506a30d49ed45ea835176a2d7c33626023f904bbd679fb419c75bed9e327cf998e1cd2298af927dff2270be520350359ca1be7ee0ef67091bbcefb3e1016037d6045411877f70da0d0661979f6c3472816e00c671e88e5acc947281d41e00cbdfc09b5e864181c9ad17c94b93b0665e00c73973f1741dde025a2feeebee4ee4d7f7e73ce393fcf990d026f1138c39abf17305a14e231bafbc119defc85b393753706457fb7595d386518ac009c61e90e76f9e6be9f918c20330e3c67eceeb74ea8ea4558be227166d08fd164723f0cad1646f0fc0bc82823032b35ea0aaa0665686868e2c64368cf9253ffd370c3f7b9095e90e6458b010ae981d1f58b4c43538bbe9e814d046b17b10e0293aa0c0f61f0a76f0865201f3cbafa6962eef7b1d65aede089552935f291c5fbac55214c4333655937e6e25618d59af568a47e1a34be6af3ad49e0bdf4c87bd11d8cbe31c06e219ee96ba069e5ea16b615c1eeeea6d1a3fe4a695e9366d44d438a826b123502315865cc19a0901e1a1a3c7ba34735448a620107537c5f7b92063ab0944b1eb9bf45204b65d9a3e91137d3d1489c73f4fecc03cf734c6e3179c6818cdc3de4bf6149bfbcd45a2b247b13f5b00c02527e99d66afb02200773e2c01b7e17bc6119cb9472e205bcb22b9b03cfdd484079e6192db7c81f08c2604ebdb968f1d3dd3220c7ce02838de46517cb590f1abedea4e5acb208023d2c855a801e96b10cfb82bca1ee2eeaee202c7341342b82e1a26ff86889fc878f62238533b7b97a697359ce9a7c2c023d2cbfdc61d9c18011e382978558bcc008ec62cc683ed65a6badf5c7db34d63ec242b10223191678f855e06f64549f31fa377905300e6c76b147adb52e39cda98b341aa9cb59106841aef49bfc36d296ab580191d10c194133400b661c5d9bdd0826c3c3b2e436ffef488601e89e3f1aa0875f8d2ebbd8dddddd17801e667917d0e8d18471810c5f007618f8db6ddb401bb6973b0fb92d7f3490400fcb9bd5e327cfec36fb9733366b1f67b6b5d68a6badb7d6a0350655e69c73ced9f997d21830d3fdde7befbd2dc613b79f1b092d4cd072b5c9c780e93193d66ddbb66dcbdab2b2a0c270627fc38664c0f49bbcc99f789f87d57f665801dc48d573ed80db3102e9cba8f8d348dd036d00d63dd879e7f7760eebb1fe0f07b283b05c3d90fd4121b6162100246db04c16c2b57556f1c08f867773766ddf050632fd691f04dbac5342547cc1b84254db2871bb6a696cdeed3cb176978b519d6a19ea3c4bab3b9d67bc6f6bd3e6a3b4b37613b7eff2566d6da4cde68dd2c738cc9632e93ccb716d7698694329a5f727f793b322b53d76d972b591ec5baeccfcae916abd8d54bb11ecd402fad9b86a37ee5e8ac7e36ee78917d6a3b5a0f540edac1592e94f1262b77a5fe77dddadd65241d1cfeba8a8cd73ac5435b4f9e601b5ac156b1f55305721f5521f81d7b1702ffd2b34ca514d126a8fb58e402b908dab76e3c46c5cb51b77efbd62e5b61e7fda276ddac8dac8e8f4e10bd8791f488577efcfed6777efcfede7c74daacaa5d6a466821a935a0ab5a9da921a0a3525b524b513e6a4b386a26a6b26d44aa849d54a5043523b5233522b52235223a1167585157bf45441c5145f524401c5134e3491074f95e56a0110a56ddb46273f45a75414ed00dd36a5ec5f237c7d7d7d7d7d7d8df0f5f5f5f5f5f5b5893dc2901945fdad8c52fe89b72082b1a2504a29ed166ffebccec8fd17e06427e8fe01b452f5ffb81f0366cc74077950a5a5251aadb338dfc264eb418bc9f6da3a4485e9d3aee782e864dceafdd0d9b4ce4c7d528e724ea918615aab206fb77bb0fe389d3f1c7028a7faeeb452df9cda3a25e67a77507925957948ab57f7e1b9fb3464bc68a1dc0f43ea237f1c38003d4c1a34bcfbe1c00fc9d9b925c6a5474255d43d30664493ba9005d5a07a7f4ae15919fd7eb695d1cf7a31a89921adda6269bcd1b4ba535be37c5e9daa0f102ec0e3831ee0770e006090fbbd8256c235ce470f100c7dd41eb5d268349ae779dee7cdbc55db5deaf7f6d8c25c29149e6bf57537dd91e881bcec0e86376c5bf17b0ddc609a92925680c6ca54a49446691f8d2a759ddba7f569cf396bcca3e1cc379cd5e61ab3b66a592358d4bc563ae7b6bdfb7b9ed99d7a7533403f176fde77679db62b0196fb346dd094528aefcc5d57ee5aceb376845cedb5268871d4ab85298df4e83af6beb491fb919c46d7ea1bcdc143a7bb4dee4f40f7f878ec9947bae6b559ecea49b7fa78c5e6b1c1387add065d6d9eb7f2a0e3b4e14fb38474c0c71146292d0e5c903d9feea894ad975435ea14aa110000000063150000200c0c87c482a148164569c4a60f14800d6b923e745436150a43490ea330086218c8186308010400648c514851d10a00badb33f6415b41bcdb8dd500d7ef236ee238dabea1f9e056ad9de9ab4dcdd34704717d0060f8659b906c85f42f22f1824c9cd8f6e72b4e09ce47b2c721a784a458911b83db15fbd1f8fc445ea283bd730d21a820516ba0fe7ba0eddff515144cbf138d8d09d5c61c30df43adde7d3cb4eee73509e4b0cedb74efdc86ac4a2c8540b306824e06050eca84870f4a5a074cee2e6c4195279d7f6b7964134ecd424e30b6c6139e6ebe2d302769cca02946c89f67426a8718628f5a81138a2177acfe1966679f8338d7b7991a7101c249890ece5d7eddfbd795d92c234d9d83458e580be41a622e0df12f79fae22980fc779a173f5131d69e5b2f116b2f6868dd46924465290b88e92b9a98eeb8845dd64808188c57a6835d4b8203925da83c8cc77a7e911ba26824d20b355f0974992c2b30c5d4f331a7f2ab38363702ce576c0eebe1869bf57fe94c7e6dd628fd087b94935a1620bd878cea5533e4274d76de4ff6be28e09084dbc828dc4530735f390db814227d5937b0083d3bcad5b71908fe83d3ad26e2e4a81c1eeb12582aa71b64450057f842dbb017296db401595810e5af55b91d76c36c82bfe6cf3c95db38792f31a01ce82ffefd19d8a0d028afdd07b3376bd2540ea08d3eec5eb6a4e3fa0d2beac05c597518f85d047f57cb7a30f483af88446ab7f7f024e51264a209cc12dccf2e6670f1595fdb5ffaeb0bb0a3de1d6d042c42dc5f30cc46a5d326b6d4620158ebc7540b9bd058d1ad17782f3344af928af48087f2ba60fc2369e3b313fd8ca46817bcabba5210b38bf1d640a11fd2c448b903130338c414d101b3bf3098f3bfd2eab4c96bd87661ee8f644fdced6a238fb9b81681ff55fdfe38c21842e7d27e655afea803b03f5fded418ef820a413010b187666859b2a85914fbe24f5d9815dadf5f4dc1d12501fc01df43049026f8d69bd9d55b06e1231278d0f90cc1006937dc114ef7790ef8293444f28a157cefe31b33f0af4f5ea9bd53245c0d890519d6908057a4bb5901434a97b687d30526c5bc4888efd488b577e0cad8531e1ca150b27f07a9c9c4af202974fec6223d9768eeca5334cda603394b81770fb1d6529b9a762fdf7e622343f46f52a7b8c077f8800b68f9ca4c653b69d3aec6a4a44933d4c41219382d7ea4e831ac66fcbc658d213ea98ad008d0cea66171cd0fcda0cace04a923d61cead1b5728a64c8c737432686fa3c7da8e8f9ab6ecfb5eb30d9167887519bfc2e7ae3b1b5f9cbbeaf60da9c085a19417422a45b6aa454c774614a92b29341d16a26b2c0f409cd6f384db5ee7009b6be8c85f38eb644a0d6c6b0fb15f3f45e2548541529a90bee945d134728362a512c9e18154f77343e34cda253e32982c8497426b007fb0e696ec2c1d9a53b5499a9c4fdce4306408815c29d35d49a9794be547c888c54b8f66ef963fb4035057893beaa6b48219c9dbd4f42b7debd8bcffcfdc679374108c076d78035193531cc7a3d74aa95d3dae615d92ed4f3dfef15afc74da4099779331a976658d1c6f874582c94282e86c9e1ca0695f3b6bca6844cc4d511d5e576f32bf0a9d49376d40300c79298a1dac07a4e352f2af09e0d6f8fe7400736109b88f03b44e07f15c2f22a8ebb0a03e08c8c1e351e0cb5b4e976ac208bcb1beaaf46188dc5dd5901ca3030288384dbd9592056ba92685c003f7a232908b35783b467b9d604a1c599df4d025d9ea261465fb8057cf14831c2a09f50c015e825b5587ffdaf50727b2d02198660eebcf60b8fcab34d18e9b4da7bc4998bac545716da3b9035bc36ce4cc919cfb046343e8dfe7ad5f019fc9962ef6e5e04a1fc009a278197fa04d53e3fa98acd09a7c577ea9900f1fd1b8432f1f7e7195851c9a9d12e26a8c31be11c6ca593cf968f68b89dd80506e319f9f5a8180690f9358aeb951fc255beea9a4a6a8a6f9555047c914919f9d787701595ca8f67f8289c7168d22947e15410cd483cf4de11ffd9e59af573780e8126849b45093bb15991fdd4fc1ec1ff5e2ce731a054f7bd7ba6dd97d5940a8af04ce3cc76b42ae328cebf69fe17a02747e6fc96fae1e2e5c0f0daa81db3dee9c02ed9b1405776257da8dad0e854957934cb10083df5e8150c03459cf7a0c901a6cf9e4f530302158e35c20d6be922fcdc138e0748b0ba0d0fa118bc41598c21477008084dc87a4cf3aa751bdee89a2b29e10f167d407a4b204b2990d348213f42bde747c878e4e70acc72ceb176b4e4f4180a2b0280b60cc890824031c71d1244e947645933079658be24d43d4f4b151070244a33b0141a80b3e3935584da5dbb840e9a2be85a2716ab5439be436c87d3baec5291a56903a7eeb3e16411d27ee86b33c959ef0e017f874b104c870c4e33818ea033b81cab5f753eb32cc1c51508fafa475c98bd8f270a966504529e3a7e2970023e628aafb9924574c62d8cf162fc29e70afd40cc11fa0ebd002e36b6ce083845b14449c050143da785940a98a169e424b5d4767d1c5eae52449362b410dc7d90e3edd3874056fff61c7b6290eb869025f02b63c30ce9b8116efc0524faebb0b617ff233d0277337fa5d96de1b33187cf5c73fc26765bb6c6194045d0576236a34a56c520702a35482e1d3fdb04468eff77832ae19db8a098528f099f051c68320c070c8c6ac28bc2bdef196f8f0d19768e57db496e69426dd28d01d61bcc5cdeef4b998fc7eed94a311c68aa19a386eebedfac2f8a2ccdcce524eecc170e65adee08e09eda9377c19f6d8fc423d0a8a2df70fcc34663fd0cda659a97180653b084a2f930f1b175aba79e61531a16bd46a53a45e64dedfe0f55dbeeec571752713e3c9789074d1fa85453009867a7492678eba7b0673d7e238743681dd6fc07bcb32eefc3b259f2b75c81fe5d8702ada077ae2fbc6432149a070b41dd28a96f705df97bf91c90553616bf52bf1593f520fd20d06844a148e1c3fd1caff4dd8346225af88e7b29156fbd9b8404824c89687fe1254abe6721ae03e232f2fcd4eb745b32c2ad3fa075eea3c506359de0f4b3cac706a0e046a5815c9b232b14c43fdbd2c4369409a24a0dd84d7578c056a366231da931fbf900ab704ede6da8791824394d1f73ff3edb8a3a7bc4cfe982f7461cbcd415ea4ed524f188d632217f8d37474f4b39f849cbdae5a6842b31c93ea9ee1afdbfd31a41b53a29ae389ba7dbbe861a0034dd28877a8e2b125f6310ce58c99873ea0188d4753222cfa59838394c66a73f7e335fd6f60791998f27c57356e6b409dfd5a53432a58958ecfc8978d16f57c692982ae64d3568e05229ae84e68e5a3d792f03feedb8e463ded8f2c20e57c8deab9c0f8802d617e71467521a5f36b67ca2e548e17342220d2afe3a6c54854a7aa5210e1c648215a1e8ebc0822d0231a1d34384e3b364a11c205aecbfcca0ef4259ad6c295c9abd9821c3b8d8a9467f487a2498f0edaacf834c65b6b480b5307916ce9a25a19cc4043eec7254d2f01963ff873b3890ab49fce61ed0c5869eb7c558db1052f9960640b3dc463e8dd2244728c324126495bae0ebaf73e708828de81f1e65a9a04126b4fde0ef098b1b0f8859610cc099a7cd479e843b24e0b12b55c70b7273a2a5a50867817580569209a670a9a31160291976c399f1da92d22a97efa488b4fd0e7c6519e1c84514d8387657b088e6a12a96481c599cb686b633b82bccae367a85794da2d0e48bd1c00a36f58a89c21b81087e39745dc09d2db50d063c5b877c782588cc969feea5d22af4c087cea693d0af8640442624153279ba661ded192d853b2d4f1fd913795a721343a086318c0179405a98a0251f3efbcd0f2f3ced4e040f64020881a7fda55567ec6b219a2cc3be4fd264ff561d7f1b3a9cb8b80af9b4d446c517aa65e727714ac7ada94260d262e3b982beedd707aaf1fd4a87803ea9deb8a109cc2b00ec0ff282589300bed360a8f76fc0c3c934f2f11efb14311d8528616cdca55e9d15194bcdc2b11462f52857eae45156b70c83c69dc1941cdffb5cfcdc8776be970621533d6989ff8375dda0e63d35b0e9172c0e5345f9bece7f4c88b940854d84ca30081f263f600cdf9b0d7f3a6600d00ace13f5a33748584287810490e16e97aee8427b9b6b6595875d8cfdb5815079c79603020e51d76b5003b63c22ae005eb2697cab613dc70f6a7c79b2795755325e087ea0d399f019a2e03112471fa3d085b8ccd3d404d6e50d6d1287383ce63632b29c6d38dae3d4549461473844b030513dcdd328410438ce0d03bf58ab19cbc6d49af0540e85923dc409c75163c81214638a4b41b12c197a47300cbc05a183533a54bb6d3f4f33d3eaf8c960748ceb2e6fb44228da826c0336f407357e11fc5fe21f0b600053bc5ebc988d70091fb78b850a617775e0f65bf23a803e44a8d20aa405012122512acea55f52a30c5d9828254b0e76ec51fe8b93c4ac96a5ec83435afd31f51f36762b3a481924e14bea352b6c7c1e611d4ca602af05bc4212ca27fe8cca1a1f07581c4029b66a4cb89880ac3755cef44484d3829e0a7739c9628e3cf4b90e9058efafa4497d18130a0fce72328a7ebf78969da13163b192397a611d43311319be578380b25601793b8a79a00b585606025dc73c62cb284963dfed198352967626d2045a37ed0f572ad969681d8fa9e63e2088eff6a69de8a8b9f99c758c6ce432eca959f8885f66b00072143b33456723cc147a0d885ba8c622468b84e1729c050f40d4f4d206e7a29fa3ca43d325ae583b0b857d90f2a71eb9135985dd43c47c0d02a29a67a2edc961e8579ff08a88d3237558df206d5d2cad79f86085caa08f211d79e352157a28665d731fe9778b2521fdf13acc08616e0dad1c22f2dfdbc50937b896b9521707c6ac31ab6a334bfd9e6877f140ab2b678b95b5ccfb500c700306509075d4534020126fd331ba88666d90739bc87ac35eb133bc9e19a4e5f57e5fc42dae3f0ba062973411f5560fd1849a2e33591d09e64c7c9d7f38f5a210c798615fa3005657cd66dec44982bdceb64b253e8fea73071d60e041b9d23842ea43549172e1bd90a736b8422ec4e5ebf544dc1d89b67258ab35f652583153d540da33567f393fbde163167eaa69d9c32d97c755d8c1e41da67f59805f13b72b6fb764f295f2ecf2391813180d1820e72e0f2f4eb5cc13a1bb1deb0efc7185bdc18af4a47d186c18e95c2ed4bb64fc0dcf94f0b418c2936a94322d6d503e30fc169799f3dcdec4699853ba9971813fb0fadc37a8ce39ab636027f5babc8cdd934ba9ffef58b04dfaebe6b5086dc883b2c4af4feae432db85085ed9c8dc4dc74a16bd4a2ccc265b43243376ee95ce906934d72ed079210de6a7b1528028055d408d2cb91ef2ae13a83cd336b2170ad08569bee58d213e2e31399d64d7bb8c99c2de590f5188d1f920c3d09bd8a7dbed3337c4376af957e6309bb784fd178a134f48c83671abb4d2c0aeb35a90860994d7bf6e9d3d8b5a30c9e7d4f0a3636f8c85750e9f63a7bd1a8ddc58fe4d7e10e952a2324286a68feb4ccee064a4b6a9bcb4ebd5783974616d5d3793bcf1ba2b6348915b7e4d7803e2bd94d74b4239bda918d2741aa9085d71559953448e19deb4c410d4f40a941695a1b3eb9a17d1471133072200844912505245a8d102180a09df1c5e4fd4cb17515929ef0dd23ae8600c91ded40bab8555949964c0558fe4b328e4beef046fa5edcbea878360fbceb316447121fcf2d06d953a82ca7c0ca2cb83cff1e5bab65e998975b4a46db6091d1e45ab4c1eb6e09941c13a827a286dd80ce918ebda2905b2a9f78e400add531bb65e7558676f0b419c25b4f012b642471e58ab6cb307621f3bb44c707a85e99a4bbff61aab74d63d7e4b94a98e6c3321df898702e306f20d78a649656eea4f5126b0a94d719714e32a7b14d4684ccab7e32c547e727407b6a2201360d960eb9714be444012a506cf6e3c29ac09dfadca44b3da4f585982e4ba5cafa1678a3ac5f32693fd84068cd7bef572342a62f78684d48f4f37719aef875cb2a7525b3f1db24b933f8bbceb9c2c61c376c2fbdb402e06bff41f6294b92a604260c72e3643b05e536ea48b9ae64cd8d2aa05d05e528142ce3fac20091a349092924b909db56560b932eb613b46472311a2339f3587e34df6b4cf95ed9600b185808ac897dd396029b1eca26b074133e79cfd29ff4ab47b186928722019b7f5287e31bd127c8cbd5bebbdac3a47015799057dc3c4f6abf1e3665f4bb26ce98d836c67dff12aba8442619e28d37bcbcac552c5a4bd170ae33e7159c1d27abdd4db271f36f323f77453b2bbc4d9c8099377c0fade6551ead222aacdb0b246db7473af40e3f2331b91ae3df6a675c578854e5da186bd0ff89df59720da881a4c8e808945746bc3979415e5420a7a7f648b0923ac9c462c401dca2b7ab49413e015c1d9e703f3d5e5db21f2044383817ba1d1b1815a51b9d002fecf1824b0f3960f78e9fdf4a043a4ee8b0488077781dac045236c419b202e92042d6df54552eba60b140df8bacdafc5092aa7cf01668359ad24c318dfc80ae6cdb536f49bb4e03996b927c8b82633815181e40dfe41eaad4806e1b918fadf04dac29d66cb60582b40bd4798e04990e25c43fd9cfeeeefab3782aa7b8a5b5e849172612fc01ac581a5ef5a72013bf6074349c5b562fde1e214b31e6a0eef9971d9d24bad5d5be3c9555da4c814a81623eb69bcb58326f1c57953d7af48061a2552120c8f2f9281c4d085428fc55b96043a8a2a02a8e95309688f9c0e0bf7cdcbac5513a28cc13e25675c3803324c9fc24ce55ef637eeba46e793c7d1c23d00f29b1ac35f1c07527756cc7ca88429af009ba97fa772085c02da4bacae1d8b25aff21537ebea25581ff067d27bbaad232e2ca778b53b08f7dd9ddcdc26c99fc7822748395ba2fc1b06c1b7b0f83a4709421d1bdb94d83c655fbb2fb23455e3e76b762728cb50fa084f8bd472e3fdeb8902e1f3c2105f2d7fb2342c2bc2a6ad2345ef1f3250d21a34f2fb21e33c3534bcd200b756124ccca3042f9ace34fb9831541a60bacffda7806795fe1dec01e0490b6c6c12befde29a691f9ba0a614466926dc859460d10c77df205857191909992ba91130fc1503caac1c101a621128900eac6332b44929f26d56a5243be1b096d21a545e31cc38135033f1a756f84d37a456989596d316983e5b375498bf1ad89b405d831f3c9081aed5de443a1e3c88011a20297d39c37aafce8740d8369745dfdb0ffe652ddb0943de30e826b6bd690126b40b229afc8aba0f9323e12a83b8fdec1b96141643860daff88dfed8d614a7130344e4ac97de1e07243e2889da5e7913471a6013a3e020d3caf4e03565b238c4f7a1235f798700f2a092e334558a8280f905cfa1d7865642e0a881a3ddbc9100e5422f45d96741b43d59e4489c5eab4556b2f333bd9ce3cb4aa440aa78aad6f23a64244c0272f94be6095e3bee10e7bbaa928ac485d7fbcfdd89bcd10c723d9d28912a14f8e4c4844e83ab47405c9d1d6cbe47c2ba8c9bfb2b5e0ace3736da5658c2855f22c5328702e9dae7eace2eb11c039a3bdb0388c693444c09d2854a3f76061a47f4c1003cd5fe6b01f3ce0d6188a72443a28978b77e5223bc54bed8bcc91a9549d9ff9bd88bd01428fab213bb1fa585c05190dfa40f7f7d66e783bf574f757a6195992e21999fa92ef8768721b498a10f350f94a64b03acbfe78083b05cc1115b970bab638c7d8f343c7b92c590fd5966f2ce0c542be7723136ee94a0e36578d6dc86336dd15c19bbe2b35cce196f196251a0e4e7ec6d734c40b631708d06e564a1e7a4440a257fb5644c9f5883cb5114ba256b320731e3d489991bb4407d2709fed2d640dbe41de06cb1db1cd90e6a951fa779c71b485265aa5410146d38f831db1527b5b557138a03236545cfc76b590aa35c2a379e28a5af83c31bb9c81e734a1dd3dba9c3d94f4549dc7e0eefbb5b50824e2586c64ba6b116924861ebc95860f24be76e8b5aed4afeaa819251352ed8a96d2902f77e4fe0933fa2f669d1ca54bd684cfd1798c3fe1838167efb44f5f887ed7b6ce184af514da19ed69c7d798332365b05c3d88a4129c1418fc3ed32007bf4da04e9eb7460009c7a10b6fc001c8646bfa874821002528d26d880f97bc0df8b7e66ffd5aa11245d9e442eedfb2e1e48ef8f4b7d48a35d2da77c170a9861c44b27684af4ea82f4584a98a31ff415c775dde831594f1c7f385d238d3e8429f3ab7e74ed17efb4c0da7ecb0e7597924ba9b9cfccc8fa6dca2dd478b8e91ee06b9a2752b08b874d90de91a5b141f451d166d331e8c30d0a9e78d778709e90c8dd8d8f857cc5b29a4a63c302b3352aa6475c8b101b8ddd321f57c3cbf6e6273f82488cb4bd0a47af5cd3a57eab831862aa54b12e2891709fb2acc5b09f567bc8cc4aa4a16aed1aaa71002972cf0018c765a8295b5a7d36dd30067ec4ed15c61f7b9282c76065b39de7e1649b35a19a2a9f5a9d0754f5ed23ca6c2740e8efdecfcfa0be1a8436819ca8153b6e8bd38d39407263f7dddbb02b885447b6eb7783ae5a42ac5b0e08c4b6c843f27dcf93802a41efa7df69899b5bee48ba0330a2b1bc095d04c82cc4a209b7dfd19205ea325be56f19e93f5dba4845d18aff5084774a183bd665e3beb978c937c253c2b6a3893280c653bbd0c6ba7859696cf7ce1d7113a472711eedae25ec246adb182581f488b9c1405224b94e1200256d9f29825b26824cc8eb4981daf9f12557bce398bf5501f5dd458df46bf6e4c98458a5e2c630c10765312610ba5c6581c9416e4f458969908a744f66c7a0cb7cfb10761b298b41b26c0c05dc1c4630ada888615baf509512bb3046885f5a96862b2eafd7f081d840596045d3a3831bf12a7279c4ae913a3c70510a698c0d295aa34156fae56b85b4f182aca0b10f15ca119aa5bb58dac9a0c0b8469041ff195e02bc671c40e3192bbfed106fc17afd3e00cbfd15c4cdae33945a6f96fc3f0a8ec0617123f55767b586b2fc9f9c232e32c95c97879d29093fab748d08a70520ede62ca285158229c87f30963ef9d88f869f32ab96d6890f44c376df7e4723fd92313fbb7351767dac8f74fb4097f6d67e72bb58c92add9bb531b503d7349fd69f1711543389f6b4675bb41ad8a38f45afa637dbaab5da0d49961550e8a9165087dea51be981b72cf25813499f7e267b718f794d20a912e46b2c28f1c7011d10561e8d6569d326b4327f90448814c2a3aef73af077ed3f69b405b54107b0ab4620ffc06b5e271c1f018c6bbfd0531acd29d4983302221dd6250cf9598ba7aba18dc4ae43058344eee8b3b02ec1cf9018f8343c4ffc7b58c128efad8c072fb8fe7a19840f4b860b1bcb580e122dbe5ca0e3e4951eb7f68c6d3c387801d45ff1ba050ebc1b0d779e9810707c4c818e5865759343b05ff00b84dfa6ec7d02bf44f1bbb128f1df71c18fbe9c97df474ba88d4e37fc029aea110c2e8013e60020fd1682bd1e7e1258c36dd85eca20edf434d66d8ed497ebf3068175880c6dca31bea15aa407d5a478a6029f00a8dbcbb4f53c6f04c6bee51148456298f6c1d7c2cbbe664dc0a7bf9f098403c2780b0b472322a9167ce497f78dcb67361ebeff3010ca817dc32e4f5ee8d2b7323539c260c6bbe84a173046a34e7bf037d66b11246283d0ebb3275278b3a54509dbf07ba3600a34a36aa141146f47f906a54f9fa9cebc8952649318278486604cea1d8a3466e4d306e0f7f344c6325215a368f6d8ad9d8a38dac6d633e23f4dd76d4976394eeef214833da79e68b0aee3442d9244bcb616f916954e59ef60e25e22f728a1332992b6895b8316d811d3f777d5a9f4c9362259ecf85c819fd1de269135e1344b81489bdb237c9ae722d2698cd724c0dbe138f103a16d96cfaee2516f47f9f8df86048ff425be1cd28f0f69265839eb1cddad6b94fbd1c41f2a5eb2aa4c6aab4c7aec3cce33c819ea5a96535d2fefd7c97a8312bd763d98d6f66193b3026730509c1f0d47112ac7a04e50ff03f9ee075b38a3ccc656a28feadcb79b745674cd50e587584c8f206b03e9d3f0c073e4e1bc1a12f01a944a6ba427526356359042a1515c3f8a151227bfeae0b7d63a50acb351d2a6cbe61ec0f7a93635d0f801bfa5f01308b90e64695de982085170a812a0b69c4466f97b92deae2212a7aed72e42ee4e5a27aac4c45a4cc64850fc7b8994101ba80977cd0e4c25b6454ad01f8be8b843f15c65859f4c23a6ef580f4b11a97d03c5247f0b8b216625727d3d5419df8997ea75245c69a66a751c5ecc8cb59c6f5fc99ecfc64c5b4d170dab90049a776dc838f3dec2f823fe9d5cc42ddf9354399390024b200d2c8138fdefc3581d9351b4aa872b8c01b49e3aa3e5cf1e353543ff3e5706d948986ab1d34025c0069b367d7cf4d7e874b735b1ee74a6bf9f51a5597460f2444b99547fa24d683e3cee4f81b616e23032f9f6e4460caa1d226ec7fd5c655ca774118aa47750cf173558281c5cc214921ef2b66a20fb69789617cc1d1411787a8093927302b1ae578a983b326c5c51612f38eadf7f114e9e9ac9ec45d3d53349daa66a908bccc34478c6c3985c6a464a1594f7cce51c5793f514711fbe9d90185ecbedc0d0438d43edd30bb53cc0bf60e3102e517f1923170af4b02728ac32d98f1d40616538042356102c8a36ec656388ad5d57f5c98d5ac6a7a6aca1d36f46d492630ad5c51c3e1c83586aaa6fa653c0dc67aca3cfb691d2bad0a3c74d96f8c048bafa40e932d6290b0be66c12f4aa622be87afd9ce9208623fc4a0d80a3c724e86ceeaa3c2225a5544ffaa26b672a83baa189f2cef065a808a05cb51539edc1c8892f213915a09253293f3955a0ca11b8eb855d5d3fa38d313187d4c66e9d0322f1a4bffcd472b921ed6837094e9586ed5618c98f867809408ee97ecbc3b0adec73810897084353a87e6837caf08afb3c48b03e5fad4d3b51aef146cc59e7dc585ab737b5b712d3003034d4816a4bfd6020530ddc2c4430ee3e1136b31d89a971a19f2776fb1feee8a47f58a6e66c86ee6bfa72037e9822569e37af9094546b5d0998d0c93a6837ef0daca1142000463d711d28b7593019f14912a2b1b22957469c933511ca44995706a0ffa2d1cc9221e56badf88ae39460b6aaf13267cd43db8e40c22755a87b5b034a88ce69226e6d512ef6e86e6aa370ca80bfc6343d4e1d87c0c1ce8772832475c1497e839982809ff19022fc4aaca2ca86f573a4e9517d44fb94deb3b3d7336377add288ad15a813836f29da496f109ef2b2995f10b288259fdda6f921b45b6f021d5047ea922f534567922d6205a74a96140b67a92ab25e2840e26554278f160612dfa00e9381e165849b09b33faedf53c646e81e111c3d0c64f009914530b97552f7c645aa5ee1659fc8673ab0912fc128aff79660b5ea1ca3bf7a4339e3f5bf937fde436ce5535797fef4ce5cd10007ad435d16f543a348d48aa2579b0871acce9ccb24c854f18ecfc1b4b559d978e63a14d25f45013cf302ca6a35a769d0c317881a6b40db7dd5a244c6254edce3a1ad9d84a5a188405566a2ef2873e37fbd7331769c59e345ddf3f18a3579566b093ec5c076f19271a418b483bf18f7f14ae6e02284e2621449fc158951df63a322609a2c951d84749c979f663e0af342c1c98dda1dc2ffbdc42bffcd7036329d4abbc42f6753bef6687f8145315295bb424fcf5b65fc89f305012d03804e481b4a30b2642c55b4b2e845050180a4902b113ccc408f43a25b7b99a47cd8b4a95741d8a173327cfa968ba0a19ebc333335039b5b38f369a1d08dca6d3eec72781442924829437b0a6018b8895cf6fa100e1546e945b326b0280373dee741123893073f635c75b1781715e16f206f25e86455aeacd4dd3be99f85aed426ad90d881fc40235e09b0863ed3d0f90a55aa2390fbf99b043189bdac4cb819382905f13829529565c69989088d6c999852485c8937bc42c87450339810097f26eed25125a9684bcaf06a50233d72d5fc1dbbb0fa35f5dd010b6a52e3c5704e9465552ace99d1654941a23234f681366533674afa3bd5f1eec7dfd2932ee84db9a19f0629170c9426d66a5540428b03ddba4681556652e74cd6d514e36922569512f8b8babf20642a3d380c1c97961df3a997fefbade5b147aa3e31f7740b46ab8984b91f5b545adb829f5cd6dac28d4fc2c900dcd51fcd44705e0904166e2fd18bc71e4859a1490b44f3d517de6eaea6fda737c36b17292b900682758f2e17fa1c027eaddbaebda10411be5a24457a6a823c210683f260ebcf113ce584ceec21b0493b4fe43e718352b4db75be02397f82f75bbb5540d640ab1371eac84985c38def65a4420e856b1fb859c67a0b0bec597ace6dc5c57a2936c34558b6e2cfa3e3739e8d4dfff09070315faf800031f63c4c38d0f594988437c52d7ba45ae001d60443af6b2048a6a3933a5d1f6cd57f41942196b6680d62d3fcea3e3e37beb1f354584a87898c26959641c00f2549256004a8d961a423cf5e78ba556f2b5ee857b611d4244a3e2eee524519d954a746d352c0f355e1776c91c112ec614ae03821dcf3c7d2f23e8455180e982b165cc274f709f31fc7cd02d5431a25b87ddc76abd990f986dc6e35c3ae21b133204f1fb5375089c15d1ac2a5c1d2894b4b885b973ea5cb379f8c6faf0cbe3d72a715ea293098e2763200cc2369c3ad74569dd0deecf55973f74e63764ba02b5513945146fa6d58a071346aff31e842488ff53bc34ce51fa8b3b683a47d9759242b8ce32cb81a573939167b66640712adc099132fcae260abae4ca0a2475ae72fd2c1c243a1c3019eed2549833992240370e1cfdb37b389f83d86e8574599aa7aa3aca62adb7b4e4425bb5a3a00212abcbfa9bc27c257c50c6718a12c79007953e526a9b2cba6c13930ef896bdb38798781493f56fc0f9534fcd411bd75c0491a241f023359609ccc124d733bcaaab523565b726df92be23a3f9151377c71d1f2089cf6af01fb4768e45baf84028c19d0e84a99404ab307fe71ae7f346661b72679bee7765f06d749c5bb8e78fe88f453195e9d33aa970f1592448348a45008e3025dba0988db265734f1d0947b12ec8073542ae3aae0d74fea0e2d64f463667d10e49b9946b46489ca3297a5b4cc2a0fa48b2e65773aa5a92c8f9f3ad35d697ef89ab1f1571a738a5882bcd3b5de19a42ddfab2fc25d28e32063996c51e468bf08c98717e7556afb9296f5f6ecd3eb139f914bc8f770b0d9d03fc92dff97f08893fb2ebb9c38a31d2a5113e55cfb136e89d3a6102088704b206b03082a481d52d242c2acf40b6707aab1ac7c3c2977e110675619fb48006c0a6e2bd281ecbcc2a7d84d48d66e23b681849ada2a4dda9c7b0ec69c0eb3d70dfbdbd5afb0baa472faaf16dfb6cb4ff14c7d81202d0f4bfc3244d30800b20b9b93a2985d8ed0d6ba0c7a00426e6d54b7c5ab0a14745470aec89db6b58887e6b37e6262feaf55001d668bd215bf33b937e9d68d64e49b5623df3716138ba33a0dbfdd03b404c17c45893c03879ff2974715416cd3f613d1e11070f7600f64b8898c9916f8abcd82653309ea6ff70aff124398319a7546668be4b9af994006b8ed2e02b3b28fe980a57b000fef55dddef26d1a184ff7b1090169f1feb6b7a53224898e341406be08607fd3bcf901291c0c0ca0340c026cff383397325b69db04ce9bd30665f726d3f265557120cf2c89123b443a2af27d892b387003e3e59b6488c7376d5d240f8243acb43f0af9482e08666bdc000b3d31b9ebb0e35e6d1689b365e9ad59630e851c652ae29500fe44da8ac6bc83588a3b06f3f36472bed7797ba21e171e6b39ee09945fe2c2b7809741f8d3364ae33c990ff79641687378418d2d2bb9a61c3edc44b9a1a7c9a1dbd91878b9679a430480c6e9654ebeeabed6cfd1c9d309c77b425d826f6d77e156e5aea7528bb7b4268d51000b40c351d2c4f3f1723abf6ed4e3acf995f9b5d336c9a1a869491240b11a02352cd168597c01c7cb5a74936d8c6337dc7c95fa783dddde2824c1f401acd04c1ee80bfb23caa4758ee63f1ede0290ead013105cf4a4f85468ef91a8dfcc92afa161581ed9c9d4479f4c3c3863b2e4fece1aaf09f8e0b0b3765b0dbdfd34a5cd444e75347d39921d60775c0a6089f8dd31a96438b45f2e5c9a2f443ad315b15fbbcc5028af75f1519e30dac1121fb9ac8f44711973e980a8d4eed7741645b3468213c0c4e3e26247006c4dcaea5dd87994d96aaafe911fe8528f20137db09d9f7c5348b5807ae262009e6b397bab5fe5995ce475492213d716a94372ad31ef67d5e32e25c1ae838644c0c708066165b5c8fc9040cae991c63e7a337618eee3565fc517116918430ea51ef715d98bb0e4f3276111f321f6ef8d31e5bb95a43652f3711725148fbfc4258ab671aa46c765c741fd80f3a06f952a81fd1b5b899f932bfc9afbf23cc046937f819e31cf0ff143aeb1a9325046092adad6c1f027a8758aa9ee13c7e287b037091dc74f9e7e06664ec6440988b10900ed26ac4ef7e036c45ac85e13c8dba7e16110527d8340db7547d4f80b06018fa98a2c99767f15f266b5b1c9a4085680117edb3666f18b9cec75a7e731ddf9a0c996c062bbae0b39e52efae80ac4ab7b1f9e33575821408074137f9e44b6b30e0e6f6e797467bb3fa3c52970e8ecc588259e9b1c185347280cfa3638d0e73bae92a079dd7f224ee595442ad1467fc21e3cb9f99832e76393ef630d4391e14fdc31fc93779e0304de0457815422a300d9030e100f4cc4a18205cc7e1f7290a0a86685171630a193f8bc96a751289f143e408ed08ed516141a7b7bc1d944de2de6ab5dfa7fe297056123066d63484a80363557427dc9b7d340f0522c8e9d5722b344085e7fc91f5d7a36be8370e4bcc56d366c5e1b56f8770de03ab8f3785cbc7c538c6c7c71a8a011061cae412a84914055707f4f2a5a4060a7b264d3a6f7f602b34439e4d033580d356f8b3a2b68c8d770e4698de2eb2b4c1e24d998b130a107be22c1cbf9a30707b052f667634e214ebcc5ff1a1862382bee937f1d1cd98e5c452e29f5d4a8e9e9820fb92cd886b6d663af42f42d64e7aab99e72ccaaf0635dca0ea434f441fb597c34013c6960da9fc97dc0982c9434d9c2c7076d8d9d37ef9c46f2510d3409cb0cd9790ce172f8e106728d66a1265ddc3c4be28fca22ca2d433166b2cd00bc250db2490fb4939c76aa501509ee27739931fa3c3abe1a55261d50d8c618ce0414f2d0704ba4b402b6f6e56e140a49da9c90c7d51a644ad9fe875f5039696635c55a76c741f0bdd7f5a6ba571dcd34076f0ce573e2b8e15f25426b348b990bf6a7509b8e6ae2fcab756498cc14e77f7654ab97235d9d899ac582e724ef80bb29686aa951a8a13232dfea5a87d89034936433ed3c93bdb1ded3f87356fb7f5a1c2d58d0092c85d7ad59e8f4e49185e72456206f018302e89143846d5dee7cf6e8619bc368a99218034ede8d07d587e22427d30720b188a17ba2bf5d46662e15a718d6a5afc1d332a70be410b9459e7e393c9b9804e99beb40c7329bcef63602862cd20d599d7e16bbb76958307d7ce117b3257d52a9da223002d1535b4e7b70ede9b1e74dbb20d719b245537b4a4db90f4b26d3cf363bc81d26c8c6d525ee291d19cc632f943c3a65c6143f13d21bb950228fefc223c392ef418ffda1e502c612c721469ced1ab730a280b75e43cc7155f9e9711f2a25d14f534f136108ad7338316eb12aa3233de53cb16b617af41dd938b8484737f6e909a4a4016ee82536dae9ef5c5b74d6f83847875f54f54ff61bf38a4eba9334d7bbea01b8cdca7e6fdc19b18e2212906759acc5ceabb269132e0c91c8d0f8df336df6f77c8c4a5c2f3336c364fec236cebe09a524b3ca332fd1919c7ad2ca658d04b9510e968f22541806aafe76c631a223012382cbd908b0ba94cd6523071ce2fa42282ce0e02afb3c71cfb77003df999709b8188a4a92e9d3e40340ae187028ffdf15f41c0ec1edd4f96c503e445dfa123980e52f26f8ef9a40fcc2e396d2a7ac00af6ec2ce006efe6a60af85ac7c7b6aab4e90c4c062b6f7a4c3b9ea38c04126b9be065600de2eadf31b9327a01def00d54d31d1c4ebc6a6d48889802db9ddfb5ab925652114a051009df1986b83d6cc11feb348176159489411bed29b9f3a52c8e16364b521f4acc3cba2aad724f1b2be58b571655a0149a70b307560c99a84dda385d1152661a44ba18fdd2a705e3f2b2cdbb82013153859029c9f6f417077c708d2b5033a8b12806d374e86791bf13466fb6e61512716b529d41f9a123e574a9e1806ba59fccabc43ec768e4b9a0c8f2be2960bdd1e0078a2233f088081791f9bd2ce6b11e8d3e40d2d8c7853fc6975b2e1e3070c5888148726483150a7f1a0f8c577a22f269d54153e64e2bd196f27007ac060d2b3fc0e81046cc19baf02b42557ceeecd02bd2ffc276a600afa97fb7f7934c4be8a5f295295aac34412a5c7cb9152e8f92655d6954010a63b2ac76d761fae97a95544a0f312666031d2c61d1596a0425b7832874ade37c470e16b47896978cb0e10e4fa0ceb5c5c7c5f50bc65339ce5e01f9956c4a68e994cf986a044ddb651bc5a572cf2310d4b43c5d2661be5574309b33f3cd22198ca7d8959b83369f0d72985156ca3c9f91bc11acd402a2d960479ddcb68a55229d294bd4f76dbd6cdc91200e76903c1154a7a1ee92245ec71064e9c724f169d7607a77487eec401a3c38e61062c7af15ed343aa3b4617dc718d9a98d01b0072120a773dc8ee49bc177e766802f3158295ac9d8bfc8c254f202a0b57bf7631fdf4b35e001ce0985534639b85834d7323aee44f7de0696043efb21e983c161a9aff578138432b8ff5d016d4f587d91a6f5bf29e8f8d165280cafbebc10a70d85d7adf0e61dee964f7cdb9b068bc243f1d9f513b26437eb5db1e4a86fa3c0abedc6359f413b7fd8d692c56e380078b383fead9c52a70f4c139aa3fbbb932c20e86f216cb98628ec8d892076561ed6c899ec63432dc46c917d098f94a63a7471f0430eb8a80a941d02b20997e6069ef48953cbd2ee814cb7cdaf3d380d70382f5e9833a63a8f5e6856aa65df1e98cc3ab2a603553cc64da13926f1ff45e8fdbb3ef75e55c86addc23b97bb1ed00c91439d4da8edb50f375e5d0f11a0455f43b3ad017065304a1090ea0d36aa34cb4fe8ec24263c6f36dfb6172dd96e43bfe729baf5fbe2724e7ceab4b504a32e1de60ebca2ea8c8d6fb4d24f355a5bcdbe2595b1e1e66401134cc1eb103cd5ce1508567cc3c5c5a5c4adcc00ca0a49cb4ba88b95536f477812cbf2c5dc0ec9c068a9f8d01d6617336be4a21b358b6f5ad32cbc33c0ca5918e8200b52d7c051ab00df3d83d99ef3e597be9eccb7a11b9c725a0e03c2d46bab682f6bd8bc87913567049451c29eb2e313930647882a0e7470efdefd14ebbf490e7cb9e31b5bc847ec6ddc08a67c28dff32a840db6ceb08ba12b66dcbfb47dd87c0703cbc170eaffbcb97331af757a39c15098c521756f6030c2994e598d8c3430067915700653998952d6f55872be2d17c3cbac08ea060705754c9b2ab5bc29fa134b9bd7931a2e4a47dc78853f08647a3307fbc48ba8174fdff0f0d8602af63ac48caf76b289cedcef2ebeb912d3b2089f5961904cf2c30b0332c59848d934cd9b3cc45041b464cc6fd8004f1869106ace06b0b63259052d386b2de1a53b0d1b5ad82085f98cb06a1b2c0f61e6c7580f6c90119f9d8c15080543ac45ffc8365e1b602a71c3ba96e6ccc2da7349d2b435cb18d2c76206bb828140fcaccd80f0eaf7bc0344e12b730deacf4b53a060ed3f2ca853ed4e5f9ed7a786b96473aeee04137006771bd9c33ffb1246d83b666673e1847f4ed45a7ead0744607eb280df3e868b58f301700d8a11fd68082d9368ca46bcf2c25ebaec74600903043b0fe654a6bdf5537abc4b94fd2b7e6ffa5e0140d52a8efb09a1a1f2d25b96782c04d9712f53c95147eb00cd91ac2144543764a525928497d026f28316e02c028b62cb5cfb8160d28e42f1d7cd176fb90279e027393fd551f59c98ef34cd88d4f35b43c4163cf211eb1524380b7255a3d1fae9460be142d81f69b2ee2cc45795128381c64b2d5fa0ed57dae19dc853e01d7303332472756525e7af5d67cdf318c7531b82aeac59c5f4efcf776798c00440ef318efd93cb297b7218d6ff833d0c6e4863066c8b5681834d11c904eb455b4a0e9c7becf22b85520976d45537a00a704366f08bbdeb6ade34b45c5606e6c295405798c181270293851881a386daa5ab98ff92fa9568faecea51d2d569b1a5bec5d1d46238f5433681814ca99bc5c2ba3f0a8e88d5e5929e26c38031b3fe07ae7ec48404424181984c9458c7e153a6866b62da184a6ec5cd2aa1d4f960b949e88929f447344f2883280f60f03ab18115cd007a03a601be18c75405017300f1c4c62c19c51577e9480fd7a3ed014f17785475bb0b2ecb02155d63f8997bc8bb31a1845939c56c7283981565ecb7ea5003fa891e95a75024879856d1b37374a938fcfe7c532abca991878b87c0d430943d42917f65a47c8dc28ddf6dd4c8c5a1020935e796768fc8e0cb3b5c0d10a5d1bbb03b8530cf2c9cf3b4e0ad7bd56e0a9d7800aa132325ffd3028c4ae5f3aef500ad1b1b27a8f6a82a9e560466195d3a4a9cbb2e50cfc7fc01dc45074e52294cb1dee48b6c12f9f483093f0048844ddf76ac38f57627b137e8ffa12e044fd8868693c8c888d5b67820a9c40662c837e26c64528b6151f7ff436d59e27da786eec6aa3fdb7274ef7c0d6d1b8b28e170ea7a4524475b425d565743b4cda3b8e49c7c3def98fbf4667a256541cb08d60b41833d1ef149341bfafd3ceff148f57562ed8b6b8fc06ea61a808c10dd00919fb9aeda928b88b86fd1c9b087bcf73aeba8b9c9a2a07e60c4021485fa69aa272f045d0d93be4d37f577ef5bff3629576f93b4bbbb2346a725a2e391582885ea0dd3dc0bb9511b500fc26fe2e917ae8125a13a0cc1db4137da57724ffa6be85c09292beccf2023a61a1b4c12e11d49c0b24d172060c397d6f1c0fd97e10d6262eac189bcb726b2fda5cddfe097472cf1182ab896fbf322599f6b308bcb5f89e482a96c2adeabdba2ed6867f519697ce1cf76720591e619c8cc6ee68aa9c0d3236e3840bf21df89da12c6e15a9550550aeaa3f5def36b24076b3191088c426369032a5d5a7db66a2a47755a4972eb423f07f403fc535ec9a167052dfa3b6bc1167077ebc00b0972948f7c48a98c4c37f0242a679749fc5884edf137a12202059f1bbc52188699a45eb42111688a8416afc2c22f4ed2b3a9671adbb89a14fa752d59a659f9f6fb53511dd0f3792ed00047a0e9d5839edb651404eb720a267bba603d5bbaa7c0fc1cfa735785a69dd53d104846e2449f3aae9b0b32d58eaa37a1ef907f434495e50967aeb5970524281fdb596b4cfda99049a05d873141b1da75a1fa95b3f3e7a1b95a4192e9dba02538eee603f4bc57d80efebf00247a378b00d3fadfec96b684c3857afa47ad9783ef1d51bf02b0c2c1e552b808c886e197acaffe32a24c8bab158e5d34090f3702530780e8089321b5f0944916de4ddd76fed48f33591f676523246c709b8aa0df52120a5cdfc827c4ce9ad38f62f5534e9f0e6318217b0de0658960873dc2caa31d0974763a7fba776d1466a9445810844237f5247b22f4e1045f3fcd195cde093fc3166424db3cdc6535b7ad39d1393111e8f5c1c09f67f501c2f5f92a597f9f1f54cbcb90338417cfc17be9b11357119c4b87ea2431747feea825963754d4e71e396188f2809783a21475e9370199490aebcfffaccb90452489e0c6502d513421faa93866bc0d3b5cb29fa48bc40e88ce80aeadc1ecf2728415be32d23a8c9d80c404a260cd5435185d6a46bd5d6788f888f26d77c0e2b58ee61bf502138cb92538409df8de0e68cee22018bf97a293fa855c830ff611cfd7fe9d169b1de1a8520bee360aa7bd966e0885e76126e406271456effb91086a7a9098ce3eca83e7e2f020dac6466988fd6544ec48bb6c0e7db7a1af51511487097cf5178907941eb84886ef8a85e8243f25ac1a23d561738b8c6293ef05aed96fcafee3b67e13bf817c8b4e7f8500b0d1e8275ec277eaedeb1eaf43515e7953acd028f31d452aa4ce3a1d14b2334cbf5f23c45b1a42e40b2d0439dc9bf32a9feef0530ed10d2cbb275fb4f9e5aaa4f98570df988b1578a4637921b92d2945482073ebd19d06071a5f7bc5e3764594ffe9a203d995ab57e95d608447e18c46a56a85f43864ef55142ccab0aaa07a140b6bb1ed78e3140087d42bf40cbb59e347d9375ae6b2892278717ca80ba4a479111018c5b33bff75f372993e967952cd60980e007d4bce9279bfdface09fc2708341c25fc5c603d009b75730ee3a19784050d5dbe872af33081139e13c7d14ae54414a07168d3a14be4338376d5818e9c2436490738a393849ec6ed05dc7d269adc2acfa0b193d238f7298fabb85d1c6ccbd07a4ea1e95abdeac116621167108e75e6fc4a8603077c0cb89732e912a28e20df79252223fbd8e77f247106dd20a505cf09592c23e3f0e74eca87a51a103be9b5e3d5d145db05e04ca60a6e0ad18274341a30282cf09926b95fe506de3375d7060251163114ff922b3a59775f512f470318b485da93daadda6b3fe158aa76db2b0524a8c25f6f834b58dea983e8313654b2000264582b575c68f2d0d93dd0f1c13532911ea615559d9c614a85574b309592da44964950fdb5d937a033c876b5fca86ff6003a0c6a03532531009b05019547ffe48403552eb9c2816cebad23c3f705483544ecd068e2ca837045d66386e58df8c48201f1368375272ffecc5753b7d64360350622393e51636031bd2100878b976975a2a38566f52bb5f66df73ea2b820e108df1bba00fc32594e49186d212c4b945020c29e1ed1e0c02b79d50f50835143a683d42ab26ebd7f775d6970a1713a8bbbaac6c27cf45aff02272d77f7fd98b682371bce7246d8f5ba04667c8ad44bea7c764998587386ac688e89e9c1508f7a3b33a8ef46526c61588ed45d80febd2224f757403e76eb126b73599b78be2bbeb143edeeb732b6a5656ecb867fb6649a83afd6ac41869f5de68ae89f6ad3b282c1f308996b11770b7af65585413bdd5931a95ac2eb45db0e239a056206c50effdd72f84a85c708600833c25c402abb9b4941a5e46a54691f03b8f7459406dccb5cc1616c5b4dccbe138215eb850d47cdd153e1c3080ec5a653f89865365adefd37220741c7c47dce48a3e3533fff8c344a78f1fb794f97a501512fd299f6d874caadf86645f847681592c7024f7cc15e2d645037bde537d4e36581124c2096eb3dd840dfb8d00dc6a502685bca96dd0a48a0e79384ea1bfb7b410265f44f8a00614e9b112e0844908427680159240d33752e69de9dc2dd17722240ea0dcd127cdfc490a15023d9be7b52b97ffe2cf35c3c18e6941d5ef7eecf6ad9bd8a93a2f8937fc2d18f5d6b71fe2a4551b66878012e2a82f411185a641f0be11f8680ce09ed4947b497e44f1cd7a4c9894995cb705e3274955397fa65d842e769697b5650e6c3eb2fb1e75c835de1f2bb4013cbdf6ca0e010665a3790b4456fe284da350812f2568018711bb1a93ff93e31bb4a950c8c4def8b16155b6b836125ee1c8664ea47602d028065d9777ef4a9232a7681c67b27b520c0660593284630d132d69145c9a2195149503d5b29d765e4620b006f3b4da155d16bd1d283fbb7a71ba0a47870fa262a6283ae72611584a35fe3028e301c2a81e2ac6d0d0d5cba6a2eeae7c1ac231cf34f376661e342a20523a1f6c9960c8c8c3204b2cbf6d2ad1542c73b68dac1ee2722742e06e87467a9e911e5dac93bcb11fb4a9a3eef89c302dd27ad87541a5a09f5dd8418292da26069c52edc9a2ee095deba8189591d2cabc5596f142629d434f2fb32c2e0317c69906c37fc733b9a3707defcd5c7696f9ea1b87f76bf3e89902b2fd9fd8f58885e02c58fc4beebeaa7953ba3544c63ddc29bd136d7fe2b178591bb1ffd0796c523200b21bbcdb58114fd70b40503232c3adac184cfeb295836f2220a0f32a3bd8c070116fef0386114c8e7718d2823813ed4239c41b8be0d964778475faeacaa8669921f37fe882ef428151a7fefc07e14a7ec518f705f2db44af451f5005ee05c824cca1f3386408a1b8a0acdac650c8dcd53e12732f29cae659575031475845d2f220ab4f7465b80024114b6454ebe4edb6579c5e54bc6c90edad66bed01ce07d6eb85a41427abca64195f262354d09d1f0a2fe5c96c59cca50b36c9d92938d371d4480d5be3c77d55bbdba173780b25d99f22c88f30033e57a02be384112874776c04de2399eced7bf90541d507b85669290d5449fbff547d365e77cd72280b9cb81ffa43abc4eb644ad4d40a1af902bf312be7e3bc764a01095b1a84263de11517b9a4fe48f7e8cacc6a1e155611f7f8797208f5683b8e3a3916ee8934b193042dd5e4c5b9707f5f555c21679400263d9ec7053be6af37aa5a4b661fac7b93317108dfb7d2e1671a5720b77b6e60de607c4e675369df2efeeb266ad29778c349c43f9f4f84aef1a13f7d1b97b71623a5da04baf80caf181cd524964b3e632b2a8d44eb5fbdb61faa407530d108e2b00040814128417f5e0d632f37797a5c37f47a74865967de7e9792ed6d661908e66ec50f5a367c48b526935c0d9c3997606637db51020555ce6c4baf428f4b4bf1e9425d080958c310b5925e501bb0e14a0931c4ad047e548af3217487c0cdc8c4d1061975982d3d8035853bcb071f5cb27a0a9892927835ced2cb393d9600fb106363d52ca4bcd8464f1dc2f6e29d8c6c00b3c8100d7717ea16bad8c30d91f9348d0b985bdeebf85089a65433e7de73f52cd10b2c6314f007bb03b51889b8bf54a0cb306d86531683e69a28a5104972b2975df67e0d328c8d9315f1c09aee3983765171c8a382d0eb3125bbde8a82a5d78f34ed6618d16667478a113217e4a25c0743dbdb3199f1f93d6de178d2369f329e473410d2ec7cba083d340ce0dfcf1babd292d3e458abf2a5ae6c7e17503b5795087967ba311b4886914d6ecd93abf2956b2e974b797b35a847aa467cb0c03523fbd4e15aee8834f1cd327338eb5f8e05ed918bb313b0693c0e593beceb6a616ed46074fc58baab840be430f89ef0265d34f7a1d6d51327cb39c2a7291d8100dd5d70dec1137dd8cd4b2e7fb66a9349647b09515826558ec2695db2952e850cb1e728e9167d47859bef837f9ec08397ab61638c1bd75999ac3291b6c0273068433ee6f0c80f8c4665f706294569181d2187511b23629ef9acb12036a4fb5c94d49874d744b3fbacd2df364bb91a00f8749e8e1d097276e527c7a39632b28bbc8fcb07a09fa033d2df40ed0646c5cba6f01cacb00f613241dc0414e3ca3670ddac4cc15f470bf44df508a4128fc055afd96b685b73c9c68245b4dd72fe9fc11c419086706cf9ac0863672c7fbcb03a3f7e03095673b51123746a4f5f3e5cd0fb795df56fa8ca30fcb5ce06e491e544da6f686bd511cd8521de4390d5a25498bb31133b21640940af679501748dbdba231f23e599b0fff275d08cd6da76069241ca0652d81f410e8cf7062ed24754114aa9ac89738986b53e4072c61960028b7d1640c2f189788c4a1819ff29737e3966466231d73050f6e6e96e2884398d9ec410bc3808ec934927dc490e90ebe4a5a344cc28a2a21f647014294c12d7ae18706b573e33c1940738a69c3a67a0b0b3ab54da36a2ed87592c27cfeccb1f9825d6cc3f6f0fae1403440cc1acc507a46ce6ea09d4be529587fc08b191c475edd07f49179f34631e3d2869096cf615ca862d0a342fcf7398d6ee07738a494a938ec8a7f3ff709ad2c676d16f9273ffb39b728ee919bb8587b57754eb5b10f016b9bec33d8456aab9e2d00c586f344658899c211302f5383f98fca34cdb734c9a8b6faaa0ad086ce87338ea025f059ea721f03eff9bb4d2c242f898679723b6b89521f0ef97e3ee5ff2cce00c9cd52c19a7f919572ad23006c121f0a58132cb6b11216866193328bbf730f898e697c265bb1e72833607cd423bdfa634f2f8cd0abfc26585ced3ac8a19840e794a62cfdd2ce56afbd9e6661c7ca5e634e972c8f30b1ebeb83d8f2624644cfafc3227ef4a642e5f7433f9c27334c389ddbc20c9c242c929f2ca58ba731959d3ed5a1ad4385f7c41ecfc433f14523c93b8f32b10a6d3a34decd8a8caa2b37cf4a630544abc18ada3d2dd67c579597aa21eeb4dc73be047e2dc7857468a0b3c6cfdb4804bb13d516f4a518554448bf1a5ffd1bf0dd52f69f317b30a065a064163549f86ff841d62579bcee64478f8850b2cec589ef0e078d7314e15c895eb82620cc4d10bf7859004da910a4e02192c88bb61821417245979928b26f7cfac45921abdedea060b08860aeb269e85b49e10c6e13b87cd55216d6824068077f138e40459b1285321edf2c70dd30b18ded0bac9ec47ab6db6b8bc0a69210cd0ada77ac1d00cb952c653db3aae5c8ab2d9b5ede6b45e276ff6bddd13590013eed1603bd2000528d52e355aecc1917aab6e382d0269a8c16e3cf455031dfde70e6b6b7934848f190999d875a84c40e8531f30f94702072c201ad01dc745a2d7be62e35632c5e2e23b55978c0fd8b01157b099265ba0d8ae58c4e87336f7f6e0a349843e2cddb3f0b4d1c77b28ed1bed6b1a5c9ea1af3825ec77ee894d561c4c523f088eb82a41d472407390b3fb87958d890de4ba414013ff5fc150eca7981522dcd6659f31b730cb11216e27eea6cb0ea897fc9e192d7ad7dcd40564bcfa1479dada527cac05af369296fb021e9cfa4383ba7661f9c0be5a386afef4978e26daee8b9df5d8b8716aa8e9645eff1aa5dad156a6179dac2214b76652285347b6a30d980324e646a6c97020f0cfc524c5c86dc8fc9880b5b60c0260276f1d46dcf0460ccef67bee4306c11da5575c4bab151a4742dd23d03aa617faedee28b3e02a1a8744a26a79d05351d31d2dbd3b1dc6182d9443350dfc7a70ba419c924e3ab441b1e2f26219c40f19136f353f71dc12272c7a3e860fd184b6afc956770825355f9e243874181509cb0999dfb9b85e4198dfaa0ef427d739a45d79e8aea5e81d3194510962c1a2504d067848b9f2cc926e5311ca754d0a9c95231a7388e9fac77c6c01d2eb0c0227eed170e3f07d84ac3f9a70cd0fc544ecfbdfe6cd0980def515c566f365381e725f0ac195706cdc35bced7d120d2ca013a60c1413937e56bc6e8d3a4d0f66aad1c6a1d16e73dac5767dec9ce19f341d256e95d5846aa89177f270eef9772cda8603b030cdb0b50d113df0112af871948d497db825205ba6d4078789183b323c2099b09bc6dc02f8f8957517f2afd965c2a49cc67e187a00fe915239dce84283b171e18e8a89a8e9cb2bd664e95d308c03321c63a8f23b86db44395783b15cc4e21339feb443ddf11896eb93b27ed0127c99ea40754a29ce0e9ae148785da1912349135b43b83319e030a6fb83779f4cd4632bdef3385dcb227cf337751da95718025cc8d9337325c12845c1f9f8131a02c887403a6ae059889e21643ff1fc8d3a334f41fe918b1c3a5210e5c321f640b0d1fc0ebd7c94c3087dcfa8ec021980607ab1951ab4165215da2b17792d7b6c12c0d70f284033bd690fe97b19610953ae12182c4a5bb8f674086fdb71abc298d94467477e975fc030cab077b0970311907fd55465056da42d2c4b966e9aa38137928d0dc391b7f0f53ffd164af315c4e3439b1e5526cca5083ec08634126d03f2db315caa359cfa7bbc07e22c0e71e904bc0c03adc5e568d6e0857f6ef805dae69d5483a004b025e962efec9987127d3ad1eae44dbc20cc4ed55975fa8069fa14a71bf0555924515aee5248ae532cf79b32445f7530226684d53856cdebbce88af827912bdc7629e9afacfcb24e00f63f29002b733e3406f8044db2229bc426f60d05d92053f08eac503a06c1f57834c480d793e5c1917e14bda1b44be10fd255612a667235502b3268287316a2a5114431b65b11a6f473c2391aaedc8b924783447752793d4ee0ebd86759c02ed27c967240b0342d6f5680bd286cb5c691ac07c9a74f614a4730776ed0c01b7464983efadf87c34437e3803a93ab8e0899bbf5eefaf74044e617ac2f4221c3872695ec7fd9a25828b712b2ae3eccc24df2a3c149f61449c8b25f7f6dae9656ba5521bd9c1339871a856fbb1030cb2a2b161ea6ceda6341e95426a56fe9dfb1a0ecc41d6ba303d2c864805269f99c00d12b2907814bc17edf2dbf46f3b8e2d3a6a901f80bc72749c9959bc7a0a2e44a942c8e53a4f17b94ef31361cfd86f59ae40fb230c4a0e4fe9e86e7aba6482ce74aedb3f41a1c30d22cc0538d02b570f4f5d5f7ba0a75de05e38ab0873cccb1b2c54b6011b9e4ef33295e1ee935775337e9b8ad4a5989ae5cdc44b3db118888ef4c5732ac141dac928c8c2657859d188f63916558235b8a05667c9622963093cd7aea482cc6483fd73efb9187a3bf8a5ae1281f328efbade0fddb95c83cf21fb226bc16be91f12bb2d2709fe1cf4ffe0a866b1a72d12834d52b54c6a7f1eddbbb4981268baa040a90ffe372b62c6fb9f74f274aea5815e13d7da4ddc06258339d4be886e1bc37693602f1a296360304f0f1cf7b5a7aaaad291dbc9a42f9b8e2e73d2de4081c166df9666a9a8b17a8c95e9dffc58c7894638a22c7029c8cc7316282c5bad57b3ed4a55a09199b0477388ab4a120dfa379b2f474f1e335837fd7518643a5667c4778cc23909c2d4ec45b59bde1d2991e527091521c1a4ff55d7fb4481da07fb44609dd0246e7f58fd3d54d080062de44ce33dc91a468ed372b1641febf4b2a3b8e7db8671780bd1086f604d365e66f0c9f8fb2f965aed0b9837223f9fd5e69321a03399a86c98d1cbd85fe490462a354c6dffcdec14bd177a38c6e6f7c49f3e8b855117b4abb21dcf52ed36c35e8124ad8994d1677348eabd07b836084a45779afb7a4c18e2d90d39a3764bc5162c239a480bdf171b8949797ccef665160211d530280aa24890d4bc5e56f05524133d8c618addc6e1b2107338d791c9492451a0931f357cd37798d755c8205bdb808a250defb51eed749ff7d2c8d5b93fd40eb71dba905e88866af1d41b1abde438b85a34b830c494991031d5763c2730f75617134676e79b9f92c2f44e534f25322e11a49913203c74bf719ffab9699458ace6202bd3dc2f16c8ead99f8f5566f7eaeb02b151793bdc6c9fba65246b627fd24ac8ac7a6d00a3be6c44d01beab1321e70373bb380855ec89f4a679a293d8319be64017ae340c1edae89624b574c4d5697f874453574878097120df200a6ac87401eebc96463c9166a13e488913f9152c1d1886724089d069fa6a4ca53deb6616891dd166265134a80c5216f1c1a6f26da1148f80a1b6e8b2c1bb684a1ea9e7128e098a55a85c6b147d2d0fb5c580b88f29496db2443219ab1c049fe05c988020ec3b8998e1220744b2de4ea069ad0862304e2bba2541aa76cfd01a475b5de560b3b3a38d80706a724bc1ce5503fb13fe00a02c57e1985e88f44d87bd1ce03a60b4dcd3eacefaf42e9329ccb2062b05c46f2938a80348a95bd02615127220114bcd376fab8c8438a92f91dedfe2a2c9f9534a1293b273c270d47ae69c4fa0791b72a1e9970f57200a507b2b936ff255a39b9f21ac72c7427f5a49645cf13f46828470511ebe06da372f201c7bb874c9271eed3b682abd688e7c1419c433411934a428fc755b3bf13733b191ea74d4012bcea36b8990f73b77a75279fe1f93dcbf029b24aec864edd68c08894a0553b71774da43aa6a07264a9219d0700058615271083867335f0302222f0766faace8e671c0b6347d0358c66ac281d6832781014dcf4a24ab4a40578e6472b1b909224b0b7f2264f403aac1d28f5a200eb39a0ef52ad6b7edef94d644e80a77656da101a6e208b8e2d96b1d117acb84c5c3187e637c4d0d50ae670a3bf75c8003350785abd111f90fa62f4a411bac6e45f95dc6621b7be98884eb310db590b677b72db7943225290355098108e708e175492a7d62985a56b3b2cc1b2670958e35ad2feebaa38cf1e68a7445988be4b0ea535aac1fd4403a50df6bfd9b2878a4b97ead2fe99c7d452ff971a1cb3474e1e7e7dfad7694817f64f913fc6125cff0d26943fd4e2607bcf513382a71cf76873844a47470fcd14873be3d0595640b1ea9990b5b8c0964fb20bf607369b1b6528bf56fc2c0e3acb1bcc0165caad205b906f54d183cb672addfead8a42db8d0b9059a39b953ffca9daa546ba58ecdd932e38ef991c7d1c9d768a50fc91f9eccbd13c91f9acccde7b8f7247f82c43997cc516fef217396fb0f9c600c067c02122d2673db73aae75c1e824b82bcc431e99815ea312d66c9efc59843c2a1b0c261922268a87afc49be6ee6e56c05b25833f86570c801fcac70d675c520128771bfe26631e00fffea471f7277f7eaf58f84590c18fff71c58bdeaeffb074581bfc797a38f02feef5158e1d0d000f8fb04ac5e55c42c2a7227997b77222fd74548590a0ee3fe729845a5ef2729e20b4517b799aa080c78f63d48396e42398c7b0cf692b9440f2e0cca59cf26948e4d28610b9500fb10f7dc09cebd739f82cb261013c6bd749a404c991379e118c20acf70fc317d0805993322737388cc893f7836f0894d992a0ce12b428f5ae49468917b1a3695167bbec0dd4c8d32b3e630ee555f5585f3c961dc731f576754e6385596efd46b903bdc53d06d903b9c7b60c2b8e71c88cc7d87e384ca9cca391fca2e749612e430eee537448a8fc3b8e7de6716756c6c2a997b0e8516b9e7bea35e7f22f741ed1f1952e64f248c7b8e4603010410b4b161cd5ae65e0e39aca70cee53e818f519268c7be944ee70dcff58e17ef4a1ccfd091debe7be48c7fcb947a163f4b9972f2ea48015aa09a344962679e4f1827340dd2bc220028b53e705cb1476090b96d50e38952513962adc0f58a8dc31588c68c012836d82753c7552708e2bb836f00d924a0bd6912553143f746a609c2c99a210ea8e308602411298541a495eaa24613941d212642401c11d25396901146b581b304d964c507061a76056964c507059a3ca19501cf1048a117862a0d0210d2896dc1d70eb8caf0996f9629fc0c25e9122892b494c5c71228c2b26a8625c9972c5485e1c954717b703907b3ddcba1809306ed06182da0089251c34a062ca0e12573c908197211d2448d0030c8b291a2051f444d46228032466f00006594c811d11070d3fbe208947ac61838f2f350c2e0f98d7c5d7c343fee3882f4e7a6c99e2e388293c106a71f43ae2891b40265a8f235030f4583c854718edc0c38a29e011506ad8c105ea8f68e2011d5740f1387223678b1d4765dc80e3a4a4e3a8cb4d97a89ca3299cd83015e11c41e1e242bb3942e249cd17219ba32088723419b98e78a081468ba59acb7354030dad8baf87ff7e8e379ecc484113e606992e4aad2d88584d4a334945d8cb910c1238acba10b14c50e483caa9089b8009946fcbd2ca05de15482aa819ba29689f1833a4b60c795e6ce0969c3a2a68b84d51a926a06c593c71247862675e9c2e08ea8c8bd17679749861b644c46444931baa1072c386d91451f73e3d993c3e3c3d3e5d38b36289a9882d6a9855a10475b1ab66c96445298f3f4217463f285df98189aef68309b210e2b600775932fdd083089e746bfce0a4b3e107a15593301c104c1e0e3ea8e093826db264f261884ec8871bba23b02a4b261f963cf5d086bd827964c9d443976f053da800861e8e544f78264ba61e3e60b9e02f4ba61e882e0db7c65c1e704e964c45b57b4391159d0830ce92a9c8cab604d764c95454821508708e2c998aa07c5a14d56069c0322ed890f0ca0c2e0edcca82db8265a2d8963057c5e3025f253ea623550a7818e2033c04d139e12d4b261e7e50d580bd2c9978b8010c1e9c20c00aed52f9a289a1b5917b264b26219498685042509ae7ac9e0ecfe76e96ca0409497a790eaa758ba62087f574ddc8a45e865c949ab61841ee44a0c5f9228fcfccf24eb9336beb6bcdc473b656aacf5bbd5a1daba5f0d43c3cff37210ef83a3aef3d25a5a02933eb9b72e725b6c8938373237bb5cd6b0155ee751e7e9dc78aad1919562b95f2419fd294ed5edf10fa2fb1b5bdbe210e56905ad84c0632d57ee7e31b627bd8cad2c13fbe21d5475d6da002f29dd0b2131a369f8354071edc0f62dd7720ed9e1e9dd7abd502c1fbf1fe5d2e8c83b85c184b1fb5171addbc73fb34683eda726f6b813c0e93f972d8e779f5507beff4e69d3c2c224e5151ae201e68d0a37b69efdbef56df108b51b82a6c89800030c2513a8bf4c8f33570f22007c94342b9335fc62342e2d27d8464eeabea1b52e7ec5940956d73d67782923cabf80a6a71ba4ccb2fa417f9b3bd04fa204b1e2ed08625ea1449e3c9895caab9735166f1e1d1d1913b60118f274e968010041eef953b15a435af9c6da625434f98a1d96030a70ed30619a68884438aa99dadbddc2ce2ae4532a70e790e39038f124c77d35bb630e529bf7c1941c266d7b9b3ec3cdf53dde4f938cc3303a30ef29c8f45f629a2c8fe40d2f53a3ccf4abdcfc880ac222e5b855f1822a11f85d01459c8f6f739cee6271d720616797a22e023a7c78e1bd26f8133a0cc06dea75dcd37a4baebf0c9f7757c029011420b0ef9e68e87e772f91db823cc79e150c7e971f3c366c3ad9c6f489d3e669d18f088ef51707aabc5b2016158acc1b9b171e1d450d59441a60432a3d3edb0745e1888284e178f8a034f7c17967f3b3addf3382e0a8ceac0eb3ce87a3eb81e5e4095ed33d87ab61e6a639bccf3f1745e2d8ffe77809ec97c343a3e1a1d3e30fe6874f8f0ba1f4f06692a85d8bca4cd8cd2a9e647f9945d36a0e8b0f92eb026070dd89a324439421e9d8ee4e62417c90664cdf25b42e3e4098f063f30c08d001484234e2b67622ec3c4c8128bdcb974ba38361984dc5d7a715e2dca07b38fdc791f8f2a5c6196d79299992d9a1c35de04714e6851bed492e51423ccd0e6062747c70e6f825229773cbc098ab97bd09be02b77614f4b030d1a392d9a335eaf6e39514c7bb84743efd24aa953faf633a53c36b983c78b3b8ff8e272521247f250416d3e77e92e95d39ad52b87d7170dcb5b32333357a6255912e790ab1a77e92a970ea54e3f1e2a30a5943aa5d4e3f182278f9719810e2795c3e9b83be4c683da77975e411d4a432f7b0fd9eeee4e7db88b94de4c7fa80c60867cda72e55ccfb6bbd56ac91fd935ffbfbfbdfdf9b41ee387ed51535852baef9a46aeeb87cd6ef65623d4c8ffd78cd46a35233523466a132ac4a0d33a5d52ce6bc199b729a5cf507ba7a017535cadf56ed6063d18d4b4a0205aa32968a73cb0e80aeee4dea7a008e6802e3870d418f9d3efd291c78ec236e4eb31e42b0447be2de477bb77fbb18b868845b0c3eefd1b317816dd0661f7d27acae8301dfbcede7b83bac3b478efbdff2ea37fef7dd165f52b1427a452a98acc80b47638fae4769ecc7dea5bbfe16fbb45ee777e0291996fbdccb37017b67a6442d92a0cf21e45222abda664d84afbc9c6db5a8bbb267f7864fb0da69f58503d679d285bdb516ddbe9c74ef2c27672f7097a0dde8bb3740b5582cad257bdd357b593cba693c3ecdf8b9d6e700c509f7e02ead390c990cfeceb30b2ed31b2ed2fb2fd04d057854cda497260bfc99d7d617b9130db644839d4025f02e546b6568d6c7ff693dcb1473678032361e1091e3d276bdb7edbb7d6fef5b82a3af922a18b69a463f81b0031d6cb3c412c3b31b984faa9f0e702dd4bb933e2bf41938a105a08d12cd099a7795be00c38c5e4587f0464be1f002da3c9f1333fdedcfaed73802e103bac9fa761dc7728db13a37aef3f705492bf11bff79d7b32a0eae7f77da702470e1465fc2c16eb4b909915b27ec413c4e038337e1638cef7561fe43d469ea0cc2b95f741fe7921f77227c5813209cc0ae0d6c58e327098651d42bf1394f4653560082679e619e6b464be49028f18af60c32902c39cd587c1ceea8fa93a54a4d466eaf239ab4fdf1d46a5189c93a9ab330b8b634ba4cd06fdee832578a4fdf2fd837a82207d7c5cf431e7aaa1357256876a60d201dcef93288aee7e27a73875baa73bf7ba5a3b5b2df5b6d3ca1caa9185d474b20d0ddde4fb13ca6c41bec01c923f3c5dbe3f677883c4740fe94c79c006be384ef036dddde7f542faa9af41014e8149c0c9e4fe1c429a535c56ffde7b6feafe2c86fe52cfa586aed0b562adb5d65a6badb5d6da0f76c096f674ccdaf76999b4d6dad0c9977b2b6f3412b6bddc84b4287f78f2f63cf2c7f3f63d3eb293b86cbfc9b02577b60fea0f8cf028066ddb13699d16226b77bb9b1b8940529e9a9bc761f47d94a0cd2a4939522240ca6c78a46b281b4699aca0ce28f4e94789be2140e4ce10549e04a1c06594c3e3b216287523531684e8f8ae29edfd7d81c89f22f5e9bfcb6a889d052a97a2c490644003d3a888eb677323b0aa30b48fb3d7515ab4ff819dd37953c363171d8df2c9a8632306482d93b285a0bd64a9e4b0a082cbbeb7a36b1e3169d904d3b025f9e39f2444484f8f8ececb75ad3d32b242da97341040e08003180cb4a150b2fd86d2d16f4811187a861d66a5dc88c12acc175d668109b36f2f16b3b5c094b591c3ecdb4fb5e29e66936c5fe016ff586da02a8ad91f43b0450eb3ef16a9c5a26cad7d0ce4cf04313069b6913bf6e737a405fb454a634e51ce770d08e758b38501c81d6f61c6b1a323f3058f5ecb741ae62937b2bf989df6cc14d44902ebb80d71e0f165be9b5e51d194f3670a265668f2675e0eb368a98f754fbfdd905192256d90746ce6e977b5bbbb5be218a46cf6e05e4d0d424c32d879df9094844232994c2633066e86c98c7a42a265fc4ceec558b2def325de53d5e77dcb7bfa9d23794e5e78e1e4b2e98617cea8efc719f581decf4fa5f2fefb26d265c9ae978ca9f91c354ff32d2485d4f837c45bf5549a5548d8501548a61b336a46d5d4d0f0b66d5b8dcafb66728063c790e9d38063cb90e9b7c0b161c8348f738cf7d3adc36ff1d52211b94347a9f495a0721a4dfef03417d98c72187da12d869ac849a9870ca54c67d4925353c74609354ea52427fc9faabd64fadd30e1fa4ab5e6e9cf288a9d883f8b62ba0abb8686345a9417d2a268519412c99cdcb9332aaa63fead16692f39d19430681a05cadd5c0690922d26a57a4ba6df5a64901b8a35df495d033697865128e40e6d2b9dd422a5ed288396e2b814084b853c3eeeddae3ad336dd772c2fba97b2e3c91d98bbef306252df71dfbd177914976ddf755df713aa6604788a9961a8381313529daa351817eab6efa26ed77df70dd57d4775dfb5eefba9fb6eca9e2fb07ff741ed4f2d76df61d75accc9f6bb9fb2fbd176b349ee7efcdcd51cd6bd3bb5d86dd162f71e76538b5df73751702b779d0e1af5b424a7baee5d1d7b7521056acd1a5167d7d0b10b6c4b4ef227ccf436987e12f221da51deed26a71b2a4b173882336da72d5850a453cd2515765227e148daddddf439b0b3903bf42fd85848204d7287be05fbc903dbc961b4975aa4134c48ff860a5daa27a0357d2e4b4a8d643e35556aea1876ea58cba5b404c599b4700bbb5ad87a384aa84c5dbd45cb66bd605c62dca5346b32caa5d4c24a63ab95664d69d694664d69d67ad6945c4dc1048900d356ad36c1cca719c61c63a91b49c746ac04663e515c695c1a2c2ff0389532b7b4c4f5c89c9273b9cfbd37d129f2873ea7e2b89f208e72271711964b42b796391ea8ebba2ee75ab8933aa9a3909df4a384fbfd8ef7862192077653ca2847426242ee70dfab7e74cdce1940fda02fb89bdc5fc0a39e7b09db7f1f837dd56d91cb313dd0ab2cc91dee1b74a716b9afa06fd122f72ad0690ee33ad0532081709f025d05728773a41639a50daec0cda593a874d23c72259cca8833c78d96eb2273480ee33e498bdc146a917b0f913852e638ee5bf87a1df323ef4a676f9ac0a38797acb50d26db0e93ad7dfb94ad2b5b30b21d93ad75a4166d95d09568d1dabf8982476bed7bd8695fd0ef96dc49febc3215ea9817e9fa2253aa068f1b997eb7988e71324df0d861c6707094c07d8ff9a1e1b185684499fecc388bee95b4edd2fe6e5b10176ebeaca7df35740c3f75e5fbdecf256a91426991dea3259638bae0fdf9b1581813b98cbe5c11b5c2f1666b9dc81086ee8ce6e9ea29cdab68fefb1e924268debf21d7c861f45d8a84d1af60134919ddc8573fa4d07c50d3cc801e7897969cde3be2d1d57dca699153dab07e166e8dae5538b60d63df909b860bcc6a94998c4e3b4cc7da7e73f57bd63abf9b5303991c702f91304f2607dc427287fe4f121e7be95ecaeac20c7c81b961b9e34d2bd42265e28d3d26d39c9a3ff9923bd91d65e00c4ce8720d482848d584b61875352945bca00a2e238e1a8cc841871d6448411155e10217a8a14614222b32439b103da2d2846a890a1743322658b2c1280b1d88a8c2440e4fae6083054f40392308a22b3256acc8ccbf5246a09a7fa7d08d89a6464482255020e88269439a7f392eb8e0e6dfc9a24d21a3f6810ebc00864e015b4e8043962a52c4a8020ea96484105f7258c387378c9805b591a589158480480435c4f00697a63cbab8e4f9392f0ea4c092890b943cbab264e252c34ba6088f547a1e48c1e1fd2c1a47084aca0e4b3a4079c107ee965a530898645793d198dcdf6a24fc5584eaf7d270f4af3fab57f7d99fd722102276d164d8b2c5855c080cbcfa449842c8653a77be2a8f2e2402173c4a9acc851a36ff5edc09d1e29cddfc6e12e9c21e1a70f72a1e60e0d48f3a5a9c6ab264d27294b2f37f5a80fd7bfecc730a4082c9f639ee6bedba5a6bed38d082476a4ace4f4a6ba5209262488b9196223ab395c2294fc924c5529e33334961942593162557964c4a5cb20b39131ffa8648e9011296b9f51d28c1f14723999352ca0eec4f81fe12a4cf81476a762aa9f46fafc525b0cce3cd5347fea8b20853e0ee53e02acfef0075e67d0a54651192c0f7bb09439de138183af3421ca7c99df9de33e99917165182cc1e45eecca6b9900accf454e8422dceef0902773f3a98fa8e03c7cfa96d08275fd62879fe76a4ebcf4a277140b9233fccf24aee56579cf2912641956548e58ecc4ae6ac40e75282b97b4715b8bbeb134ae9fcc91d6400b26c82fcb91b5a5b69a554feb8fc80541148ee20b9d3bf830a1c04aa72d0936ef421dcdded4d7cbb1ee7d3ef57923b4ae774b5e843985236a894f3e53b21e8eb9aee04cf97124bd7bd66bbdb5ca95773e0b992bf33c5b5722d783e75a7549ad695fbed55ad4bb7f547eeb72c5c6edbb6cb717733e252dbf59427652ab3c0a4bb4e4068e0f19e81478a250c1eaf194065009181058ff4098f778c28c408038f14cc0ac0f8022809a806e4055017405c006d01f405480b202f404e4059007501c2a2098f9749098ff40aa02c4056002d015501040510154053007101da0224458a7b758c764eb7eab66ddfb62139d262926e4102e9c7000b12ea86774928162406a4ec7e3f1197ddf0d5b09e39e4fe71d290270cf28dd4bd1cc6617fbfbacdfb4103fb5fa72e7fe8d3ea4bb0a55caa691c169d3f1c7452da348e4c3b5882e57b964c4a4fe4f1c6fc86587865811279e4692e2cc10cf2d23b53432849c9c866816b964c4a3f6c5bca4659c1a4444483378372f25a08501a72b5d7caa163fe9a8153593265a9794b5e544db25c31254b0a6a5998982e2080a0b974fdc80ee487e0c5ab55eb7eb27eabdc54e6fec0ae53365549173397accca0008f74ca741021cb174204f610b29cf207878409e41292e57736c80f14cbc97d8190e503f1c0f9a464433fb2e862597e1012781f7c3e3d59fe0781c7abf220cb071a5a75703d0eb27cd907583c50f048658064f9df84c73bb341528d1678a4ad1d251f59e091661a9d2c9f0325726890e5b7a2a8f1640659feeca6875dd5abdd54a3923ce5ce7c17ecc7b0118d7e9cb8c16016f1980287c6099ce383081daf1d3de694dc068f50c98310bc0c093c5ef0dbc0e30d792cbd7a5c0fb75c39419270373d771f3d59880af0487fe04445c1e0864bee9741b481b96a4764009b1afc8881c7ab430315c4cb8e8fda063e94f07833101e25e0618d30041e29072384d1c1ca03214f3db4113ef06e80288163d7cbd9b1028f54965ae211f2019b80e0c99b19d38f47afe7cae18114440876c9a801e45d771f4a84e05d777731bf7408014848901f107c64b10f7a3c10c10411b8ece1c8818c4114ba94efdf3aed6faf56f6ebb4459f955eefcff9bb23f7a7dea9d37fa7ff4f9d52ea15a4e0fbad3da6ac74d1a53cfe8c81698b7389564aa1ba2ef8debee20a215cce2c45d46b2eaa1d6660f91d0b324a684801aa101a62a11fc915c5eb740b20777260c1d373987e9dfa3b7575c1bda4349b94585ef8cb2a9882c39cd226342e2da9abb448a911db869325f7dbe6e56d53c291b66ddbb66ddbb66ddb6af3693e6d357cbf6b5bd77c4b29c9dd9c737aa9b7a092eca13fe1ddd6ca1bb7fd05714cb0b8c5edb76ddbb66dfbae7b6edbb66ddb4f17ba4279db9e2608e300045a37e5cd6edbf6dbb66ddbb66da96aa1d42fd7ef30502da665efb0fa543ccaed315576ad5f1f8cab0beea7da0c33c3b0cac0f4ed4f099bcf3d351497e510ff5a104009b5d6ca39adebdcbb999ba9ed3b5049f6d4f65c6501acb5d65a6b7d574ec7bca6ca2cc9932fbd3699fe66ed04f1ac1e2761d486d78d8a7ba4b849d45a6badb5dad62261b556a73aa6d65a69adb5d65a6badb5d65a29adb5d65a6be5d24b4a2028615a6fc8e8b65aa3906cb5d65a6badb55697abd65abfd65a6badb5d65a6badf5e5ab76a79adaebbc10e3276a20682bcb9f422dd2a6955abad14b39ba03d19c460c01844afcb101bd5dd1a5d489fed842ccdc990441188c030e6e7692f4e917e9d891bdc2d5b4df0336f0787b5e97a173aff3c259d485441f5cc1e3159dd5d3693a4da79e4e3e61fe8e7f14471e024c59f7a9700c21f6fd0dc70db650e9c57075e15d54e28f8f67032f8c6559174a8751a2e9e430ef292d3a15215a74a7d9fdbb79930626a27d14d5c9174bc6c232566824349a1fa40057e949bf573e879830fadb4dd9bafaf97388299b50ab700c41158eb169348d76e4711ab5d08c9a46f4d08e3c4a27a24cdfa98b8ca4139e52643e4d252e610b9d8bc81dfaf273b96c1a3d951d6918fd7e2a9d8408e9e9d1d179e5116728b9431f025236d5a08100020730d009d34e5ad129ef13ed5e4a111d794d4542923f3c7926cfd769918a2dcea62121a12a150e392023f3ac1089c3e87380f5aa28304bb57afc32ac9f3548199a33187ae672d8a454a8e8645a73190f4fcd796a2e4b81ba3efa940b479c0a698a76d4a31f6dda4767dea31d4d518e5e8a87a0117fb478369809636308799cb522ddb4a988f4efe591c759e3e1502db2c06642c2e86350ca0f56609628326d2d4f717c41ade85a49ee500f6f4680fdbb0409ca1d4aff260dfa355aa5ce51aa3d2fa0f2fd6e47beef4c86eee3f480a90fdd8eb2b46dd843f4debeb7f6108397489974217c4a940bc91f1df9be1f8520dfeb4f0203c09f67ee56ac5a5d1b157d7e03478abd577474c02bd7e71141903bb8c22bfbabe8576bad5baad69d10d45a6bbda9adb3b5e680c2b3d6fadd5a579efc2895524a4955df10f72a6badd57aadb556ee8623ce750b4757aeaf2c6badb55677526badf5cabc3167bbd3d101afecf447e9bec2abede6f95cdd6d678ac8e3f316779ee7b1be211d7e74a32d5296cc0c6e5d1ad9a2c951e3baa1a9719777385de30273649a992c5d32b94129efe8df2ecfe61b62e33938d61bcfc1d1b2bcc72bcc52cac60f8e748727c1b1e29ccf0449732d587e833c58325fb8eb85bb526adbbd736af172ef9c5abcdc3b2f974a71771add3b2f974a71771add3b2f974a71771a6d5e5a56888f8fb5dc4ca566085278494958fdfab325acba90fda7575bbd542fb5da1faa2581973abd7a0165aa97213cbf7a095d4373b6d36ab9542779de01294c1a5291b9330452048cd4b6ce5ba150e48610073ea1c5fe4ff5a9bc152bc592329c0c4f4f4f2a48d8447219174e28920d2850a0f88402054a9ed90010d4b2427c7c686abe2e4bf98be00a5285a4ec610f0f0f2761f6ed3b074e09b37e9dcbd4da2ec7bf8e28d6b8dca5c20c7526c7e5f26c24544a46b90aeed367547097ab5fe633e16d6ec7bc0eb490f986782823039e4f41d627d353a6b6b54d07a8bb67c9d4054ceccb3e6b5d0f39600166eac24512f752ea459eb368468b6e061a2a567342750141ee9e760c081706ddb020226f1bae6cc49129c5c2d4d4032dcaddbc5ce07bf1d21d0107a6313ac8fef6480aaab421e60b33a060418f29baa421861710403d316907aa08d39a3862c8e66cfe7b4c30306d817d88ae10fa72c597ec4fb18f932ed9dfdf7da61401f31cf0e859b124a693dd26092d556c0903065412b311672531acb1858d2e61bc68a1032dc8916882862dcf87870b1c5b9ad263694bee1b65bf93a9eb1a3f4c42c3249389863126982579c14b7a62e69fe4859c2166f45fe8a121662d1c146892d08449fe04de0a8bc04f67401950c8163c62d6d795b2306ed6e7d525f73cbecc5ffe284a4f42ca3cf426ea5b38119b211828b27d99970993789864d6a8acc06896e4050f8b11cc663ec90b355a68f96226f34a66491cc961f66998e4b5cc92bc20ce6642a7f507f693bc20afcc64c222f0fb2b9909d982c7595b3dfe699f5541d9aafa79d5a83fb07ee43de66a38ba58e188f3178eae826c435f12c284e9bbd74926153284a16196e405ef8c2d33997fa1a34049c2e30799b0080f8bc09f573faff6e755a91a57dfc98ff52c70015a78dfe068a4b76fd08f5ce65648987d2f485f388d0ca56c2930aefef325b9639de64a47484926cd4a0b9c66495e48c5f165e6ff425b01664679c8304bf2c26be66111f35f905666342c02ffe8474576f658c1a31f2d6121ddb9c8d6c33823dbf7a3ebcad66bee4bf20728dbf726f963b35dbd552d61285754b6dfd52d17c07b9c9b7798b8f671048029a07afc3207f5f7ab6f0cfa91d7fcc997dc6905ba538bf655a083f1302ddaf740876a910aa6ef4f2d5a6f923bf653d6fef52cb27dc74202b1bea404100fe02df4a316adfd1e3fca76c9d581ae86e30a2da594324bd09f5a098e1e7debdfe00a1edd429d0d9050120413587a10238511516c388203175d6c18aac28833fce93f0932eca73fc779a4661c0f65d6d9a00dfc996a415fbef0f4bc75b27febafaface3347c992ed805f373dadbbd8e49976c9ef92d94207309327bb0842711c043b73bb35771b32f9dfaa25178f27494aea398b67449576e21ddae76f59ca103e4ce9c3d34e0f96060ef97f31d5c65f90d11810b9eaf1ac3b72033e0faf65d2dfacfdcad167d8336f0951e2061d96346189d7c1da0679d4bc2642acbf166ca0cf223fbcf12cc4fd1701465c29b3cce29934a18d383353e48038ff3f651e7b294cba9037be6d3a30f386735f778bc813b8f7403a73fb5473b36f1a4d23012482044c81d7ffa91302506cc85a94f8549aec3fc7dce6fd9ad92e27d507b619217665d3897fc48c9b585feeeeedf0305bbb2fbe8e2f1460b092d9938f44797edd40b7ed0c0f33bb99333236b64ecfe6c2d2aebbe86fb91c6bb41ead310bc6f72679d9021d7ac1367102ef49940ba8600087fc0d4ac03e54cecd60cd23373f47421118771a1d8f5bad146ee4fc1ca17e4094858ff6c92fbab149d829164b78f84333c70c835f3be03877ee68529388cc8343281f483913f12648b25703d29c77192e33cb5028f37f0cc7467032d9129e178808cd57085389454903b61727f901d3a30a76152ba97ddb70a4e54f0213c9f5b81cfa1ed0d206bbf816d2c889e7503b95e0f3138005326256c06a143482d7283d103e58416bbfe093324d2a20b60661bce212672a76f1410354432bed8c2200084425aec8182e7df045902d7b64974f3775280ffde39e50d1d96418288c1045184e14410209849a143932b56a891e58b338218d0e4430f514d448c40861d4d4d9821e68b0f4dba902f43e8b024c23e91343c30847d22698c476a877b9b5bb76d175f0fd76eb6fbd673f6776ff7532f73aad656c5f1b004ee73da4edbf2eab5d6dad559fd2380dc7ec8465338fd1287becc5e6bb551f63b5711700cefbb4e7e371c8de4fbb112e00d7cbf17e323356f97b6c8eda0813f8f9256c4653ad0f8a286952c5ec43034b334174469c287254f7011c7cc7e907d22f66f487dab63a9b7efcaf13cee7297bb5cff4df96f9eda52dbe6b2d984669f887d232b18652b26db6e32da9247cf22596b9fbb9bbcad8e516cb76ddb5e768d0e5bda8fadb5b66daaeb5236c80c78befc9cee9c14cedd226db972debb30453d07dfbf8238a9b084fbfe204e87256ca0f71109bf0eb1df90770e1c8fd4d1e2f8e7fcd0e1c8ef2c5fdd4a8672257f240a9d7c8db89b4d4d4465d9d4c453d620cba6256ac8d7e3923fcb2627a8e4ce61f7714cf8ed6fa5d7a3dbcf2f004a72b50490f423a11f961b675a1c133af7bb20815189ccb400f63b0cea10c77e7d1ae2d8500062ae2fe61a8af2e5583af972224a6665d9e4c450eeda931df57ebcf5a9a435880cfe38742301875e2ae50eb8fd9c24f44f9c2bcaed29ce7d31d32c0520e62d145b946fc31a8e344b244242424b320d83c8804b00071b3b50b42934c0c1860b597010fa6249972652cc261459bed0218a2e02a573a8142db84539e9d09000000000004315000028100c07444291582ccd4345181f14000d7b9e427e589a8ba324c8511032c6104308000020000001022456340e0ea3b75018128b4515e620379ab624902391998b432ba3d170598d4d8e501be4e488c29f0cadc2adbefc2c5a8aa32af140d2fb6c7a2aa96605bb27b36bf8f9901edc0c0186c534b914b572bf0c81ff607048f51ed1b034f2af5a019c9b09f8e0d0d52fc621c5326473fd84452112e72221fa4de9871d5311c564ac84343dd3a739b08286b5381ed6b812545c10bbcc1445213122962ec6d4f72aa1cc9b7b8eb4a45dbcc2888917b3c1e62685f17134e8bf7ce86983e3c2546211ae5653932e75dd03c9774d697399bbe3f8310570c969ad0d3e7b5bba25f12f6ecc48a6c2b45517a1e609c744e74661ce722de05147948f6a82c60ef9352a62139a48c0dd8c391cc19e0251d57394d013df77b75067dc386068ff8afef4c2d7f2501bee55c23d85626bbe006ba5537afad72e5968a17f4fba8c2796cbe070192e42b72892a78529e42039ae1b2f613e3b836a2450642ac767316197985ab8733b1ba9e6a908bf5860e84e324f5446feebdf9f87c672db7d072891abcadcf99671fd3e83d46855206ab4c48c170f34d64e0203622a7668f88836a3f476e6c2bc254ff7b1ef8310848842880b9f057b5ce08a4e498840bc7ce8822527f167d9f08a665d4128d50f5d2e51f00e0b32ea878f8dcbe016e4e9fd7e486ed7a3400d6a9028df2d925c4c1331e4ca3dcf645c082f5110b6173c7e966a543177a1a9a2e33dd532240e15f80e5ce95a6cc91906a053072cd5d73e2017e000900f6be2d33ecc87dab10e0db4c33b18ac5cbdb3d6d419d857e06684f426f835fc813c5dcc98fed4aeea363be3be12defacc52a3944c49aea92781fa779636bc8879466758d550200c100dae08495aa8342e87644aa78b5565693d9b58a5e514934b2cb1b4b27cc1b051babb0a5d38b410a9e4e50a1cf6ae17af947259d3197736b1e9d1c395f10fae487956ae838475afc4114e191066d61357642edec2d89642b174d782dd8d47fe94c3ac07baed965e394fb1c07ef60d4ebd10f32728568ba6394eccf795dfd134146068af2032ad31f17c8014db954a925f6578ca0588f1888c5387c8f0bc9e3256da3c635341ad3beb72bda9d197ab95e52b0f52da2593d54f07eaf71d83d92128edfdb09a9ea11cee80885d41bf8c379091d0884c87d412233c33944b62ffa0303378f1ecfb054d1d4be46bb3e79e30711335b13a1037e24fb3e70e0937511399e075143aaa2ff8411fa32632c126a46ec2f152f8898be1603be5631ba7c6c18d131fe00d5446a89340424feed48e0e87b0b03220a497a4660540d35f1f58370a9b5ee9d69ab6c6fe86156feba27a524ff5d1b629e6732c88b2942a1c9476fd9d7268e96db986a82b89bc90f44982a4d00fa960ba4c43418b2c67d9209594bba10b7c47ade8d0349a099b390dd39958741c430b4e8e34d3924becdf1cace3d590043c0f770a661a9651797a2ae34084434e57b4d2d296b5dd6245a01ec0a60eba82df2676cff5b80d98b539b70c976ba9dc03544839aa0a47e64b022da9cc7b84053161751adfae439c37e0dd621a71b97885d5760ff42a74dcd9035c2a07a4fd79e7b97ea67c971cd3141fd86afb611575684f1be1387899e14aa59e41c1b1617faab172916bccce3ad7a083ed8dbfe3159bb1a0b014503554f230b79607a3d47bfdbbd5ce78b3e53dd6c09fa2415497e2b9e2458b3709cc48fae204602da146706bbd4dd1e2a966b50fa369ba961a94d702604fc541248df64bf57b8961d218a3685f7cefa5b31277174d46798af7b263524f035a4a06d9270a4e46854a3e026576692c9ed2e0d24a9d5466d8056ee79f059a6e0fc4a1a5f43c06a08baf899b6ad1ae808f7ac2d509334d1604959e6578329345333154ea6ffa684af6a30731a68c848755a0b3d56d39dcfad69f44270d0724fe77cf10da0b9a9355275f1e2aaa1afa28b710a44506a2db845a0cf951a0006ed229480da33b3f57f542becca06c7c84e9cf11c93f4651450106ab26c555923d582a80b3a07154aad19251c5b5ad633d60413c9d4803d496ceba0d2888b9a4aeb787550e83ff49087de8a9500fd5f5be67b6b13b8fc341e54c1e7d94aba023245a49ff4013d3712dc789a8e3b16c4c83116f159ed2bc17c61a48457d49f0dc944368645b0b82601a01108f761b24a7f2afa6373ebd11ddda4c457d8cc79b9768a06f4236200ee21a125623ba3d7da004da6b6b88e7e2420035f97e08876ac601a09f9ece72588cba59effc8d992095a38f892c9679581010097bde0e211eff753c172f1069189de085f45f9d761ccf5979685f725121e4f58430c2910c608415e903b5d8093f3d936fc148e6756a108a23561b2f8d74257c661c76a71cc9197ed03351bbb630cea4c755244203c46425e9d5a1345a44c106b9d607959f05b1e288ad43c835295175e10d756ada34aef6c3682ef8024b876beed9f3f3e5d8099767d0e36311b3a83eda1974c4ac2691291147cb60e888c1081e994da585d20e252fc26779c4efe403723cefa36ee97851b4dd61a0f307bf8b243213749c126ffc86e68fa47abaef4fc9edf3c9eac359b38c5e37a452e3b7df47e92524568ac031a75ce170771e4ea49bc1a705ae1e80f13b131fdc33404f3b4efe647760328b50b5d9966981953ce1814a3b85d57f834fb69fbce62010054c554fbe0c003ae32bac51e4caad6259a02d26f138cecad8867b7f11eaf1d54edf0cb3225bdc5bbc22a2e16bd078889c542661477f986e4eaa5dc238a58fdf0af21510c5f481edd8a61735da7038a02bcd1bd4f7fb5202cdda574c765ef7da7d1aa1f9268d338d1895750bf922fd80d39f82eb452dfdf567f8d711055dc3bd797d5b9428fbbd1461369bcaa21179612470ccad83ec72e1f7c65a992d4e727f239a33da7ae1c783fa12255640a3e11afc7031057022a4c8b707a5710c1c11cf7b064d0c138daed8d999e2b8a3b2a9f719501800a9c0b60e980e00d1873645852edab173384dde771b1a7ae144030474dda9e336162f58f7545269a54ad75287ec2d9f738c5a1be509b8b82328b08029fd6348fc2e7a2791e52c700d12c7f4500e70112e69bb239585b19a000d0d4fdd233c26f9fcfd903a3af3156c482079a368f2414f12c2f7641b0b53ecacdfd2c8e6feb626ab242ab878fa54542074196bc2135a5e14fa0cc4f2f16a75851a8a99af35194f1f4a8708998d33282288980e61759259413c439c67a066a533e8f5f5de55e743ae28458cc8fa378ce59cc877cc1e786908be5458ddad3e537ecb7dcfb27a5fc8a677c872578880f8ad69c2168aad24ad3a21ce66046f1bd6bc57548807d8e072c3e28642cc06bb364af12225c2bf412b81950cccbd402b5dfd035ed34cfb27dab6e5cac5028601a573f3e8a13e01cf81b87acb91cfb18c3f2481031b49504124e2ca9ebf44c52c5e10c654fc4011ca24e1d42ba8c27ffee08d1ffd549d8b3226a849a248b340ebd5019e2cdf5d3ced0e4621f50c463d4b3094bd038b9980b9a901a375c17814bd4b76290219a58820dea4e3992278539472c40125e4f2289100b60bc66155ec9d77c96bf8938493d879efbc1d8014936a74fbbf262d1dddc4c96434e334d2fb2f344c0a543c78c0c84f00a802abd4f0843b83e23e2750589a3a61d7e6745775a16473f58da25e77e0d7c4dcda9590f3b657b9f5232f082285a7c4efe975c4f806b84553da01773afe89c2a75fef94167bf8942acf96423c2314cb977bf50702302f24f6d5ed04f4d7faf0611426632281e3b6789f6173c20cb2427f2096b8e92a8f5ea6a5655f9e8363a50e924a959126c7efd4ec119504b01579ec634d66577087cbf39caa2db9d187b5eee4bc086daf81a83f9318430b967fbf8e92e184f140fede03446e3e059ca08229c3077822903b8d58172a293629ef1783b7ef8974f42c3e37e398e21cf6020b096eeafe7d0f66cdaf7a100a7db98f380e4ce6bde2c1164079b6802a7112e95dfa743d7ace35b48750be34b8434fe16d04bbf05ac748d3c7c8044a7844fc8deb8d1ae184f0a6b11dd2f38355ae5a78f348a5391a148c341df9da895839ba31134e701edc91f853abec366b7825ef6e294cbc96231b41327abaa9929a6f4d15227e2ce3f874f59e30d5fba9365da21bb989061af97c91191b128ea0ebba8847aad0c1fedc6489544590ab1750aa4a8bde76784ecf92390f0af465fac899b093781ac7e6716b4bbdcb4b53311354b9e02569bdc934ecf847795701505d7c7d646dfeea4d6427a732b1aa194bf892af3e1afcc614014b1c04c6e5841ab581588fa9f8cdec9be584beab7e0e433580320d7ab8acf94c74b7295a04ccf2a0266adcb672e1b000b8b630a39ca4b1f60150902f29e4cd5ec64d30b37425d5fc99f1d9c5d9049a14d19d57c8c71338f7e40ae17d6680a2db01b6a22a34b7d379333bb0d0c824b3b37f45d880bea63cdcc6f5754359b80f81a18e9bc0217d50f9de46f6c5884779809ec1847959c11b1781d1433002863d4680399e701a865a2862a380ee0ca973735f2d188faa046b82fa59451c98a53d8ff48625013cdf59970082c030d583624aad5660b8ef5ed4b7104c30a54d116a1f6beeedfc474190d8e0c4a8c443a33751f7d3a23dfc5f9d208a6fa08d8238f12cf4f006f349946fd4527812c4f3ff0f3c6d92509a99b019e8d795a0ec66e1d6eaca898fd4a540eb03cb2e7cfeef05103d21d479cecedc00fc4a26459b5693bb02e18820104a4f9e53e3de6f70a82554bdcd01fa3b292ee36f4d46881251e681509595f0b005d34ac493704fb5a3ccb3dabc6c1de1ecd2ffc399600bc314dc5762ea4c0b7466478876226e1ab8b9e2b3c44a29dfc6fc8e1f8c1c88569ff5868e8b934538512e1994bd599ddd0602ca45658b66281e895440375451d8e2e7b469ef70c0fc4eb3f8843300a2711e4b5ac420aa503d50e72a6283dafd77482b195bcdf8e62dc52596868fc53cf6b2f5f119a4389233039a1694a9e4cce87576c3644e34a93c2634c9c228c12f04a65784175c8bbb815a1430147a80dd14e19a44cc3ed7a1824dbe0b2f3a080c8d1d60484b158bc65676b5ec90e7f254764ed41fcb9978a65eee98a70d30cc0d6d1aa3e7ddee0d4522f58528086954e2389d74d548d0b0aba30f90459847691d4e1e363bdb331da62a9d81c1bf383286c36d8c621ac01de359d699bd3b4dc6483833144defcf22454ef9fab4096b395b88c29ab494d0c58a46e65869473f9ef7dba0a5efd95ca61ffab175bfbf5ccdad0d619f123bb0d7baa417d2baf6ac3d94bc107463e9b99bd3b4ba2cb88e9600551e2e88e5abe65368800f50868d7616d095a7297da53820ecddd86c96722e2c9a4350f8ec53da2cee08556ad9ae6db884aafa6b80d0ce7ac1d625690ddef953e518cbcfde37edc7ed47647f8e15d3e1534f84adcca27e16512f3a57831e4703dfd792652419016aecf73d41524e092f6fdc49de4be39d701ffe0b5e1952c4e82b02c9827bfb00da83545129f02254e3744920e5cc4db2c353ce45b45d9072e54c6794f3631d5c61944869801f9e008ac28ff652bdcb64e822b4fc52b486d35da6aa47e6c18e6860798af602db4060eaac1e3990bc98585dd66ac12f749d633f0329b63ab826c24f130028dcf549a4fed12b733991c390cb9df0fc5f97ac4f3489c06f6e374d6bed08be3c1e35d093d86a1ebd3127e0f24fa1671e5f5964576bb161a8e4394ca33ba5d53af6b836c61e2400654b32461aebb56e4b4009cf343507d86c03c1c2742f7a34f9bdd5c8f2d12c4a12a93e5db4cffc266b39782be799e90fedcda6bd50e74cdc326feaa5722a827121f193c41512d95122b6f3092b8caa0a60331c4fa8d05cc5f8b59d483637dc882e6f1747970bda282b742e3a01efda79cd3934473b4beeb44217b4768a16b4502891a886da089895c10fa94cca704d28f78b4e424522af43e1a827a06e2ad97b686d2d79db4b4c16b186d15fdad83cc88652004965ce80142a6111e9037ea51ba26b599e6cc5720adf3c06bd4ca2ff5ac33c4c919091ab6a108a6c69bcfa25286eb1f9a8daaafd526849730de535d89ae6443015e949bad3b41c2fce05c78284b92cfa6ea00a77b6e3e5e1d17c8e27a4dbfa8b78f542094bd5e30cd92ba8f9b09b7d0cb8dfd1a741893a4ac740045e840276c59c662cfd04e6942565fe2aed972cb97ac3af773943608a15203e55841c50a15f59c1534c42d7e3de87c8217323ce1ce33b24a3672f74e235dc49c4f41fa5448706af9cd521f5b9857525234e87d40f5e5ee9c892088c3fab30e2abc8f58a0fbc715b61accf99d98ffc6f60cfb98dae742e4b6fafc0f8b282115bc14d7fc6e809a5ad30e2de6208fb129674475ea797ed05c446a0a6f15cccd2c1cdff7075fe78c3d10fe1601035c12096cd8159e406dd04c79eeaee23752e41f88b1e8e0b12a92d1a1d608bc17609c19e1d2083ae8b179464aa7fea8c1a51876405c893970140bf8a4580497c2688695b1a69231a5ed28637aad9c9d43c0e540b15d66b34725a1cce643ee11b2b5c23261120def97f3a15ef96fd7d4499c3d5fd57053861ca970f7fe30d7b87473f8e26c2215dc96ca31abec841202b7050038153cea7cf6f900f33cfbaa1ab38d4ad3703a7cae4b7532af6450947f7ad82cdbdb19e0a1e2b3806b4130c9f1ebd3fd45bf7288199e2358bb8870a53ab891834f297f55e40e65003115bc89eab09324f09da0c12ed16d9d98358638c30e387832332f57a69e8ee4681c29f7292af13314cd28ed25109e61c0882e51f0e86d36d1bcd470bf69859bbf30bb9f6c35d3675048d42489e92046f0b162189342d71b8ba1ad12a21bba6e3116d5f9178cc044c93c2632bf2317c08069bc92597dee98338259971672f4adcee46b2690ed1c7e12a991504c2836a8223e7a8fa818d7ffe063e226800d82d60e06dbf83b7bbd115ab66471c522e4a768ebeb592269ba03bf18efb2d88913f2a5772e39ee9044ff11f5a70925aefd979cb3eff2b2ef54e18f862a7ee3b6d3a410e2c277e50b4f2cb45e4b7a71c7c809b0e223b9196de8b6f237fe92442e219d218797fffa4f255f6154f6ca073a477a36a5d8802b5c4520125db245508d932f64be97e976263880caf48de99508234148a9d22804d33e63010fb369d7572d6dc5adf0ea2cc9dd8054da07d84a2a0e83e7f59224cc18117180da459f7821a17b18bde5fbc2ed6cb22ef2ef142f71124fa95c9885016111f4db4d2dab842ecec92c2b08feb5b906969ce4128b458511c0df56b6f09efbd7dbe9fd48f7bd6672bfb60f6651d1f163c3ca8c56ade0a3fd52d0552afa8457c9a2965862c4eef39418a6eb9633ddfe1f0f33796c95e4c7f41be968dc0b6711b63c27ceedd0a04465aff09b5e9fe16e1a62a3040b8cd76e253a2de7143b74e283feb47e384c9fe1380f424631d9e49a745a3bec7ee3ac9bdd8252e0c660a88d8a3f844e3177788f697dd5899362e2792a03e742d70bb52e5a760707fe931bcc278cf0a32b4a72ecfab78c7a0fcb6a94c112c1d6f85ac189c2227db8cc97376c042a25c9da6534b756ee4c3326bc331d29f3bd7a6c9fbe2ffd2abf573cf2de87ff9b805dcef2d367ab8d46d68fd70650ac9c6a09d5a05de777aaf7b8892ec5415a1bede6f8428848c4e1102ebdce3dbd75c036c818e6ee8e1fc7749d468c2b7764e8e2b9d5a30288a54176af32eab8a5e5db6e4591ffe0aba9ac1d3422d116a8280be5e09ff7e5811d926ba2d791a0850cf430172193013a2b4dc9918040a6bf16fc1dc111f7f4a761800f7c80f00b1089a27dcd0581a3bfdcf8381802a821e67ec981d3d982a482166f138b879d0587cb2600eba3d2e2c7835c027e5d7f2f1484c45c209f84e48ada3faadc10a85537361aeadaa039040567a10c7da68bbe856eaad99c8598ad68bff9f5a7c602bf414f0805c194ece4b2c314fde9efd6d4144233eed298f331cd7fad5103ea8ccb49fbb5e812b56e7b7ab7d49e73b0b1f11dd0aef8afa5ae29888057c5b2c17b430ecbf82129796498cd25ac49bf6041f016c3fe737f9bd791185639474e9d90a0e61ffd6b04940c0356c4274406f1977dc2299914e7abc950b1e6586ff01b0e608cde41fc0eb25dcb45947d887d206c8081306475a32fe4bc6f4310a76514bb940179f29ce60f32f9b74d5cdd3d52d4f73fc18a2c24649add0863c7b9eaf60ac63d911b9594f42e19fe541826be6d0f975e39827206c934b40c7d65d1b4ece675ac1e167b15dac7eca857e72082b253ea19295c68eea7d87406a46b08d3c070a208f3ec830fbb5747614f2d4dd79c54a4b0838b507e22c5a578e257dc266949c5a8552beeff8806cae1703148a5e4b00d553a6b601e70333c4dac9294a6911bece2c03c42508c4171095cfe548e08d95e5a4ba0913789f1faf9d7433539ea8a8e6a13246defa08983a79461213af5799fcfde39331619f3a4158fcf77a1477e69f99bbaea1b932946b54d58d9bf2aef70a7eae0244c71176594e5a42579f7973a44d7004fc7ed92fcff2400057542b52eae12e56856637af6f9fec452a3a6a0ee7328c196b37e9d3799dfabcf687253910988c3244542461bffee6b301926b8f4006c212e288d645ea941e3511f208c46836e0ab6abc19caa81823e57d98c3f671d172a8b5705b6536593e33145b30181fc8b8c92267e02e1ad301889dbe7d771acf31a8721c1303a5336886e574ab6b7add60080ef7e817aab713edd9d4a971db7d355f54a47e18958b34ed6c66316c0df5ec5ecfd25dc7524b61b31bb580c1bda29704c34587a6380c2af2b1a3b5e33af3d604c99a6c96325c33b2dc89fc6d8fd0f3ac07cff87dc48df97186d530208c5141f63a936a0183ad5769d45a70007329e172b3c5175f0e569f0e55b45498f0bfbc7c4bf99f4e84dcd1d0e9f74c4cb81e05e73cf9eb5d5839862a968995836360a5908ae511ad0284d222f97053c7204720fa3b7c9b1ec2c5b7be01fadc5b06ee159d4d99670622186b2ab7f40146ec8f665f9ff14d0de81904198b313ff4b9ef6eff995ad408a982c3e40407b65fc0bd72303dac5a3e48da64ff3ea895783d70a13bfe783c5a40c480ba313db02303ba95f3b49edfe8426213d49b4c21bc1110d5cfeb9345352816b37ebee3082abb38873418104b274f71cc368725bd5271ecfc922a631ab047604700e2f9f5c6e2341071708f9e5beeb43c27ce33cbbee13f6c714b091cbfb603e4a2a9370be590855bfff20bb336aab14061d62f3f5178fe94df155dc843872d32b0e74a570a46bd8d3d5ea397bf163007e53edbeff5c08fdb58900db9ff42baa575dddd4b02597279e47449b3afdd589aa4f85fdcc712a582b6133d6101fb2b422cfe0c4548273056e40aa46907ad0a0a755d9a2083c357d561949d8eef9de99446b056a4ebe8dc697066ece796f4ce8c37956eb1c81ef51ec10f50a3dc18047c907a45ca8e33231f93ab622978886c10bf46a58ca8c6f9d320b84aff8900701455403b2362e3381f1605f5c6c1ed545d9724fa8a75bcafdbaf133e8809831044648192e5ee0b7ef908973814777ea7d711f6299f3d8b4cc4df4d50cef64b222807b6785e08e91a88793229f8eb47e75b10c21c912b31c2bd501e1749f575155f3694b5384d21c07222f0793881a025a090dfa6c294b2f85e816b07d419e7bed7b57b5a8df0d2d609be2b68e2bf2af1160c3305f6b07b3465567002d5b8635926bf0ff546636baa3101d076fd7f59e7b62d755bc11365048e63960229bdb8d201d639df4c744ceb9d1a448a15079294438f92901407827eff280707d01886c7ef09315945de51d27a9c0521a68923b53156f7258215d0da07673df27e23016a04ea9d25c32468b815d806e6d8df5d76c0f6663db1248415125e628b6ceb042ddf5020e00575d69c3e6d97419f59ee49e084c5ff0cb1dc3d73c47495e04494a631e33067f9959b9471ad0a642162c489ac8dfd87597ad64fcc736abb88f61380aa37552f5f6975db40191482e2341ea65a53388217126c2bf7fbda84a56a4f5019e00b96ef6fe5a7ea887a051ffefe14075801ce12f7beeb7cdc7bf231e2bd4058b71b34109030d5d4d4d42c384254afa8fffcc9b3483a1255c4d2a4c871eb1105c60032fbc879e9163d41f93ab4adc4d0b8a418b1992c11f456e3faca3a2ab5871e7b0cb5ee8c700a93a5f817e08c431ec8b27f8b9f6c991a51ebbf437c74087e540ce8ea71f4e67432b0fc08d46ace193a69efc391153b9cc48342333a2f222e327d24317444e73d8d75052f5e3421d0d42f92e352f33940e147d58635c474ebd27f6f910dfe258a051838e35bd90ac4bed0adc1b63790570c3e6fc340c515e264768be12a2bf24d13c4173c25ba765854d8d14869066c8a49103983113cb6eda4c52bfd44e5c321414b17211662357150aabeef0a14b8c154fc695cd3483dd4045d5d7150b4c9dac8781f0bae4353dc598b58eb50499ffd38ca80f17bf3a315b77674f9136af7c73a43262ba40d85afe7724ddf5c2e31fa1aea092a331c0fa4784d3566ed7574bac4609bf966e338d5f4a21cf65c412a73fc9fe119a0680516931b030e6e4d5012db339193d385ea3dcc0a48049cd4832c897b58283c2e0cd238e09ec0e70b8f87a709ef3fefc9be04d411ca228e0e2e4817f69ec7eb4d77477455d24ca0ed2c3368f786a14ce4b2da69aeab81456951e73164e9f6c9f06d985548b6a5ee1379b4d7e80d043219ed0af6705e7f5cef18f01d7f48f916f8708a11e6803543a9488882d83319855abc41e17611d72c6978f8645eaa0706052789a13a966d6f1e12bbb2b66e9e3903b8a35c5ce4bd97d8e114993be2664cc0460ed4d98854d9cce1bda25f878bebc7b3678ee28794563f27e1ab0136dc42132b3154c41d682b0455af61f3b010e4e144d168ab7e9680c852bdfb0f530e7bad3e79b146dcfc64f39855a55143e49cafbbf91aafb1d7814e5ffc391ec49149329657b34017f859b19cb48f1e196dd8b12bb93d888e61980204b43251dd671e67518043c0c7583d26202b449fe922443b0424087c6f4d0ee64cb6d99e282a4d93993b29fef4de798a8b4802315f464fa09f81cfd755e2f5eb603de1c06a722832b5c45514d0f2b7a01c9c19daac99d3a9105910068545581f28f416cb1095f564b640287bc6566f4c7bf50606ebed787b05d739933519f6e2f79ab9bf5a0e951e3585ca06f8f47ba401a5f0face1f589f76468daa63e0ff02f143a14974f594cabd3a6b0f01c6fcc38fa0efb95038d7a20f287e70563d6e3db82f64dbc64873cf5ab980379a88c701a477a044621cae8e0aac578e4bc56a8d6787e55c908a33c5f7f91678c02eebc412c7932b197225b8348c7e658a9f808509c4959f4295ca52769ba7c7e500d3cb3a50fd9c640cf3d459b9548800a704f5b670a5045a919428c4eecf005900c9aeb37811b76a95de6f0697063267b4d4befb7d3aa1405036756de41fc25e47ef97d5e52e9bca3d3b3d9832d01d0f36d0bdb5934206e5b6bd55d9c1159a2349ce0e676949f298493297c0f6f352f8a8dc917931294639e0e796f57ed399d719e327482cf9760e5ec8dccf7c5e05d5d52d0d0ceb8b5ebd93182ddc3a43d7d68bc7e76dd34a93f283032de65cee7bf49f491a7debe6f5004056b00778a1047c92785736e95ec1bf1d4507f5058b6915707a78cc38734c53c5584248224ed1fae2ef215bcd292abaf3874301ed93407e672c5c0e19e3321c5850912207610e8983bc14cb525e28342b575030b542cced396480234e1916d8500cde06f4ba3826d689698690b9939b2305ad9ab839101ba540aaad3272fc779cc118bd7ef83fb0e9fc9641089e47e39b4722ba7e4074e90ac70017f8dff3868097f811dbc51404d704566a8130d38a1716485d031e33a9e379fba4f5896641bc7874ed978b7f7b69b064f0f54bbdff960ba404d77a04b85bcf4783476a280e0dfbdc4cd441cacf841b3906108b9bf25b600faf3dc32886502676755e5362fe57b8f067f86677bd827459212dabd962b18084360d444c85669a198e8f9a66af73a3071a21c060d3f5f92f158c7f59b9b923e8dac59020e8140badf6df3c4b5924f224bdce719c78a0791b12b98ebfdb4a41644d60269ede0e03aca8fc8ca5621ca22892148f20d3475f960ee968112f36eb53aaf2a76a8509d41b13e88cefc4ecf41373071f09ebf41b48541629525afb74d568163c3cc0eba7398007c02195f1ad2333fa546dc5bc79f09c9cf9175241f8dab12868c32636d2f47b3f059ac344e803fded527339aaa851949039e20c9d95788db9eb358254465de4339823d67492a27a07c7ad936423e7ac82d9a6cf67afea1d1c96a2376a45c8e3b5424e1d5cc091e7a20747abc23dd969456f848ba095687de03a099eb25d54eea1964b2cf529074c7c36d81a7339bf6d941cf2a69bc5d3f674c0aecae5db031e4658f018f654f4ffab87006699fec9102ff47157c43bc0e0cacfad541df1a981ad42fa12db72a7a2e573f1c4f374ee0f96f086d263f8b4aa5ddefece8bb5df02aa8c20e23a89e73e4e686d728f99865407634dd88de08d77a37a33180af6c56a932ee28e4666663fa314b7522ed94125e1c78ee3ea2be3145768248773b45ff61f803c4ead90c31e83ea1994167a1d2ee3637720012ff26e4beebf0a7aff5e01022085d2057c85f6bc586ff52bc8c8dc799b1ec4502329236870648700f1fc8ba765e5adda77b4512f5d4fb8e0dfea6130e62aaba964b334ac61a0563410d5b70dc51bed53d4a05c56e3800b516170742f547f7bd0cc763da36a1ef60003ae49af014fab3a335891bbfad525d6cd6836f69446e36b77592c1ece33d82cab16107c52dd850d186e98fa8d1b466b182ad9bb6515b7da08d11eebae6441dc009dc9e42a0c7511999819cfe404297a09571d9824dff381095c678a5d110c99d51cdb24cf9c81a51496cf833af6b03a456879052b9bcaa86095e02b034336f78dd40d86b3ad31ab04a6abc361ba2db49145c369f9ee6be987cb592acf994721518698a0df3aaa20a65709d85bc4501fcad0e212343123c83b8ac1121236aaf75b15a88ec1922a17436a8b164893aa23d45ddef6f145d6138a1d5f35c827fd935e8d22a4e7aeae3d2151b78c14ac4828d741353ed7adec3b4dbb023c937d12960ce40e6d1f3031fdb459680f12580a8dde2ca7e7d3890454de6b176efda6012c04e61441e357e09452c6b7b2b7c689b7ce1fbd685c7db47a2ee3e1949ecdb6052ade64081a39b49166fd1703dcd0138825c545a26ac6de23d6c03c5e61ee9eb1e4968a493d86a08cf1f130c9f4ea605b559c38232c63a04cc47a1efced834bb595d203d8ec2d21a390d25588ce682823e752c380f9563708e334bb12a231e7aba465f790a9879d435d2bd2c8319c314d812a18f10497bee7a46c7eacfe2f9ed44992e71a8793471ca802960186d967a2cfde2a85adb3afa8328308b067fa63e782a98d578540ea7dcb1938a20c4732f15ebc342eb086be23d62a3a692dc5771aa69e8d1a00b0788614528f8d15127d1924f82156de7935bee5bdc031483fa968b28abd131a9c66200898bcb3bb35526fd24c857a1738ccadbda9604a598ddc234e99c0cbd51baf7490ab3a25bf025e1dc07e643913ff9e7ff7e34bd1e1bec6191fb8955967f37494f05d31228c1916e87797ef56e254faf0bb624158368ac9682fdab2b2c46be30c89fde966a50246c81643dbdaff42b1c02a6d15ff9b1e56c1ac1098644e11d064e86d6a3ad354bfbd0820e418d0b850a20d82e5ee7d56dbf6c3585a0a620a116c23b1aea6ec4c3733d77513204bca244d5ed8f4245cfa7d5f065441fbcb6d4979a2b3439777b6bcd7a03379367ac88ef4fe1aabdb2b6bf406c6af5461a25e15b2767d381ce8f21070454909d6a2e1f20d2d84924e5d9931aaab5f849257bee49c6157c56a5071089b23ba28152b4be4854d377a4256303a48d61b5c1d175e695a88800a1b0cdf4c7cf86eef5cd9022d6f83f9c3e318c78708da80d72a3e8012861afb22e09caa8c1428948965ac6b629a9a807ae4d9ccb0e19a5792dc6e19ecf0045489b250d65951c4dbaf64d0c813dc1c39820e69fe6867b0a64cad1359102925d0cf6720343551ab98d23546c63c8f63e7974e8cd7f63802d05d054006f78031e8134efb1f629b1330c0bdbba2ca9f2207a6d4cf27c04aca9722316f7676656561fd12be26fa3987624a3bba1c43ad6eae4621725f040c60f231d0e9ab1f023701c600f41e2c91440d54ce30a6409a85d9d7e400d6bfe7361091470f96e135bf92e4b3034d31dd9a1a3345e9deec2bdef99af6643dbb7a3a4293a51a9b443953243a06a1168ab3c907bcc1a1f7d07f3882d0e48196cf0eda75abe37601f7fa8e867e6552c947883c36140f10cb42130811a5d74fcd9b0f6ee236104e4680a641624532ed706020a2bd41004c34d7a83970b6e209978278b19927a429f127fffffdba243763a43b9cb8db59baa4f19f1eb19d580a8ecb8e87d70635002567864b4260a98865c2c40c8cc100713c50d2359d38257462ad3aaec9f4e19d462147a5f0732aea711b7c7c03f888bc70df0767864b1fb79d6819c342a1e39f9a9271980e0d57fb6d7d6947336c61f011efcc110a7f4428e4499da71b544fa220ba9d8bee14d15f55a4cf67c27a9222a17a079cb1c21122234de87f7c15b7ed27703e7ccc3f1c6fe13e661484deda398b3477de532071f2c8d3b1308b27a7deeb829ddb652d246f7535a5f4ecb50349b812e61b96daeab1d224e311b848c52a4e39f9fc5958b386b6d98a2983097167130d3b9b62037b9f275f10c8b07564f841fe3b2f272c520b38c99ab3be5ada72ebb2379fe58924a9858503977b360b873f0b966654c36970f9c5149b7f16639cf9222814157efab198a137eeaecfb5ec5a2733e1298e803e99ad97170a9b17ff320203025fdd8dbb242556201764836de8632e176f60f9720f0dafde309f9f42a78e9a378f756ae4c1c055b184afc1e76128f0b26ed2e731380e8e97f6cedd3fe1601edf8ae2cabf4da00294b3a035120b0dc36077b433b3910004e8ae2ff5d03bf6fa445cf9f432e5efb5995dc2f06523933da1ce4a8b18423c0b3db421dba1d7b1fd8e7f69df26f762fc2b6c47dc34d643716dfa6cea734b86a7a11f2ea0aa57242c861b9f04b3cb6100ce80c97e100cdf926547947b183450642794e0333176b7997c455ce0d835a1cd2efc0340e868d88cfe4ac4b85324baf9f3b984c7e70a71bf545a80c470a0d08eb58224ae26b2cc2bd192c7dcb244c08b4491b6826d8bc79903f85ef3b203d74f21e8c95a09d7102c78e9bd691e8c4db00d0385d2c3f23b22d800b0b688997a190199738b27e9c146531fad88e619bb524e9e6403a3b11b76a87631b76bbb312b0f00a4d12d582f40660ed75a062b7dc584c0210696e5ace97eceb8558ffe5938e183ada62b384eaef1dbfb74aa55e66d574a484103dc4101da001786b93de5eb53c9cc19705bc36591c76ef0a3f5f33e789c72d49657edf56d6921998a0b1d3b74b410c41d203825c1d4c0bf86021f05e89d752459058cbc6a441f32a0ebaf9c71e1ae8b79c15b7427de3811f9b7865837453877c4870cca40774a539e39101a12ff686cac4a3599fe942e3fa169b7c9cb45d735fb958f81c2aac1cebe40dc6d5fdac9ded4b6e0643e44cc0be78f9e3bf07001f3dc70f96a9ce4b1d5e87e9ee31a4b0bf8031d10cc1545739e50809667960c9aed7d3b05e81c113b64ca8f1c38950d1c143f984ae039db00c83a0f1aef3ee1e2a8b1149de70e9c1620f7d4c61b4bd4342a05b3171d8d0e28b4f6a034328482a7b861eb471f23458e091af3adfa7a4757dd2367b63eec7b21009838657c235d5c9abeaf627081184708665780d7dc5ffc02da4d9a8add4659a309ccb52788b7234f28c040cb3f98d8cda6f2f0cc87f6eeec978c208d4a2c9a0c064b566a7085e9255b60a04d19a4238cc0b340194b06e35936f7a35887fa119ae10ce5102c4c10de907f9930dc29ca22dc9dfd28faf8521e58b9536ef633da0ba03efbcdee0550988ad42058607dcd7e2cdaa99077e157c3618100e371f3f4d186fb8f4678340ed40f8bfb32f7ddef9786d5f71abd1f51dc65982c64bb18c9bb066ca67f864f11cdd85017f4118237b739ff5200a781e8e13902566f95e22424606eecaeca08de1c82f2a7e80ee05dfc6dbadd94f08bb5eb237f6eccc2c47d2a2546dfb4f78223e1836e3a24333b37dbdba7d323b233a50f4b1c570d0eae553c0aef8ff05bc5379c76631f0f24d7378752706f81c9cd79e6a984d650f43e4b59f44d43427378a726a360835c03122bc35bbcf7ae47cdc32da9c4082ff00e7101fc1d4fee33375ee7239e0f7ed561af1694ee8ceae30e9bff356bbf3013e8815a8666c8dba44215e7b7a0e86f69fce3a581c24e9842d1bfc2cefef615346db0739a2e67391e8c23142386ce675276777257dc6dfa050e216aa17a6c09d921027987f6dca1cf11c0ae7abe7429461f209839cc13ae9d3dc2f0766482f8f8af3024a1c9286affd481d27eaea7d00e3fb323b9d8aa930b3c980e1fe466d2f680f8e0534080d519f1c18b5afc63bc086e2186355eda77a15ee7d43864ba49c5815f7fc634666e2b31beb443c15e40b1bb4b0dbc5c10ea1f24d5f514f7f354122726b6621cc19aa07e3e2cedbfe9620e5762aa88c0f284d43aeaf283ce779ad0a06979be8a8b8f41970fb278b68dc0fd9c2d14e6a9a1489b83ec4bebcdd7f8a849e49b7701bbf6350ca7a1bd0c5cce7d34a5c23525fe4cc32dabd83705d8492ace08292e9d8626cbf87c11375ec5b158c20804cb621c292bf2b110665063a20309752515056c2f48033361db68d97fd5504f84836f0a56abf0bb920f12aba6abe2226cf7fc8a8fbbac09c8b31c6ccad2dc6fcd5849d870d924abb0c0d89f3de475b4c1fd7b113f913cfb2d4901bad24b3518970a049ed058979086deae7cd9551ead4adc6e31e0547237d84c20bfcfad412d51382ea60bd9cfeed343f1a38a38341965b944b649f1cfdba2a9cff2ee6baf0ae836ecd48024d9919f329920c4ac65b3a0fcc85a6df02826ed8ad02a9c00f7093a504ee3b1f2ba92923c9651b229e0d452ac98f7f4e1465004ba7c58f4318b3afb46b786dac61ee5f9de665b2224a953a01bf3e7bccb5945c14521f03a7b7e6c027b2b5a6055bc7c35bb4f8dff0347781eef7c48ff37260873047eb353a501f601182646c0b98f3263f92ec2f0eca189bfae6d08c6ab972448728431a1475bab095b0f0331abcc83831bf8ecac52889cc1fa8017d458326c2f4df7057c649776a6959a723dc2e04f72e8fe9e9b040440fee53b4cd972d1df96fde30eaa187ea267825fea8b61ec67d541c01037db7e8529c497fe9a14dd3669a312f89844e998ee4af5d25d5fe396ee0eb432beab53afa9fd384c412b53ac200bc4f1973a8d3006e62ff07c821c2845c8b04234f63483224ede35e2d533935ebda751da22ac6343e3e25568289769a84eae252c401705aebd31234781223a2555f8f9a8246712b17637f6d193172c345f6f520873952b9e098a5631855f0223a6d19db22281ef4ef6bc3d37c169da9f8892fe9b525e756637ed605e902c90f7f3b29e6d4913e8ca1d929e36edae28758d1dd73214f356764cf31fef48ea9dd1748d1c1162a5a42a2745b77f542f238f047d2b1b9eb885d7dc4bd402222a62ee6c03c05305d3e6184085b6a338e35a3d5108cf95b2f184fda3debc4c153200a9cde374ef10a1b2aa0ff5f0a792c8d42486b433ccb62f003f5272f00b4fbf6340c6cbba7c5c50c75d03046426d47fe29f4f7f06aa64d2ac540ff9a150ef01c487f857990dff510f7bd54a13e35ea16f7ccacd3861c22f3371d39668e5f00d6c7a82e4eb743380143631a10e48705d2e702d66c48b4108ac5fb9b2e5cfd5a01d707158ae416f5cb5eeea81451dc8b641b6604515b88f6b940ae254bf4587501d847bee9eca54f151400d039bdc9d375b6c7ef8174dd4f793300a3860a787540f82c09f014906c714d8852f393759c3ab55458b8293650cb8886a60301df4cb7c1076f71713c53e4db0d7fe6433b15f40cc269dfbc40186f0e364430e8b7d19fe86ec02b1983dbca702ebc2563c4756921d03ba913e897164e7216cbf90147832134387ffa104519ca76aaaf873630f1a4e39740decd24f85514228708ecd597413a096fa073a2dbdadc9ee0f078667154d10cb172df9158d6e32770896be2b783b289aa40f72f4d24e7b4be53dcfd21625bd15c0a74dc4370cf8683ab3218d8dadaee3d8d59908560ca68f50e860b6acef0d453f8e20de210a89856079b88315788425e1e52fb9bf072e684f6102081e06a02c80eb2df8e37c25502817f104acf2336bb4b64fe51c12e73a22469ebb157006597f90bb6584889a975cc65f03b86be0b80471dff850661f243b126c83db741ff70dddcb197be9717a59d51b9701c136f590973318fd2c8367639cca5342c3d3fc5d68feac316f9e777ecb25e14e4fec34d69c2fd95ed0e1a65ca9ba871418c0a90040f6d087bc430ab034886bc4b7a2355432b93baec160e89a763a7650e48bf4d5e8a11b4184c2bbccf584c809b319b194438baf37f49fcf3d26ce5aea22af60f963a93df3572c28d789c54da3144882c9fe63a8d8e5f06291492ee1f73f7c4f8e33117ace2be40d63e74366194702dd3d96f7650df65e9d2a9ce9ba2a00887cd11e5ca537fee370e2d7481a17ca3a84604fa1dd1a1cb0046a77a579e8d51d261d8f5ab70a6fb93b2c0c25ff295f99e9eb63e2060f1a6665eab0f0fe76742a535cc895046611d5b779887e322d24bd3b076f44cc90dc11602517fd042433100f00f4d64d45040a1d8779523fa7eac6e1e90eac72bcc8d257d05ba2f3f5cfe3ed65256bfaab55caba1547526ad1be6c1b99eaa878d0f374ad5cfcc060f00970d4b2436fd82cc46183c7d830a2dff8c8499393c957b19b7b0f64e4555a39a3526e9811e4c28c8757e1a1dd9187247541a3b63d5b4ed338bd9b0af9952dc2f8f614224f5311a2fa4ee7a10e73451773d2488f80f7a17562968b2208e813e07579ff1c023f317be4d1941b97504e4140d901e55e020f13e3749559b1769af89809f3e972ab74478b0ccebb23c584c8f2a016c2b41861e178025d52cc5eecb111ce0544af86617ba5649f79b575c3d19f42311cb0d14457561ca28a1de43c2ac110c2a7602dc4ff1b679dd641f567ed3b9918ee3a1eb906d23e1915e900b11b23d08b31547ce0ff23ebcb05a59a1bed9ee1c1f797210322b4e16323a0f595ed50ba4582d7475a0fdabe5dc81649835db099ab203f54475ea5b3341ac0d11d0fb513dfb3301eaadd16a1e68ac7db1b67af6c8e5dbed1ff18be9e653cf179fc53183654da6fabe627c41633fb82569db301ec3f6a0871e470659ac2d9127889734086ba6266a638ade10a47ac8edd791e55077e11a10f9820b7802c877d15b2b3131d64da76ffb9dc431988e0444bc5bce97be2e65dc560b40795768b3865da5ff9fe5b768c7d5970a13d1a9c5777686b2f56518279118102abfc39a41320c3e8acc1df3a574fb5aae71d28a2572542ce082981da933c9a975a8573307a41f2c76a0d225f71a84c17e1e228ac3f6a1f93d250fced7132b0c2d379d48574ead99b89d2d00592c456d59462f3391fca88d4395b9c55e76fa8f62050298995fe212dab437fea7751c7d925b6617484cd5eb43bda330c210d2babc9d4032992450daefeadb61ea031537f015f5de08b5ca7e00abddc538789ef837a674826e7a094c373ec8e893143ff46db0a6dc9bb08f59adf1da748562da0d0d230af6977e4196ad2670c1afff201e0e6f43f7788f0ad82621a3c00cf02879f98b4117ea1584ca9db0654caf9354827afab5b24f07b09bdfcc82ba121067139795d2f7cb25d0afcbb93c290f52624450643e6d537c08076c740f8dec75785ef797fe13bb0c3f03d6eb2d85c5794bb2ecb145c29fc67b62d7a3625beeed45d687fba608fb20b51617243d540c1070af775e71459f6f0f96695a9ccc9c8661696a4c6e23d1ac056e2fb439af2144ec828d0a12231821663de6c2d58b4f422b465c0054ad55208087f42d4ee18868a5500a20e025886b2fb921779d3d785ce3d0184a0221e2fbbe50f8779afe6dfc62306709ba4fe165b389c91822a51eb30dfd051d14ee694339bec0d30879d0bde74c3c3aed2e78bb6ef19e0fbe23b310d2f6e28dc1c92f26261c22b9fc61c69252201fc38aa2437e61670317d060d667e07f27916b488621b9c94c666085b4be68998115c248c01521000ed30e03be3bec336763f0c0d4d552a658eab3d470415f4f0c77bb29df80b5c3e99168319b6630db0d01979ac130becc781f3bf4c395b8bea74e2373c89b19b234f55ebe1ad8c5a0ef7f4ebc5c17cd0388ecb3374a0cdb0829c96bc8972d695014fdc1ddef1cf435975c1ef3ac7e93af8ad832fbc7f1dea5006c7bca66a0c9e78e59c17ea3c50587862132cbbaed01d3e86c73aac661e003d2674a8e41c8e7e39eb0c3dcb8899ebd166f74191926e550eec404da0bf5f019f158206b8f79efa08024044d9cc6c697c9c6d4a14287e6352ba93f9d5b991ee8f44fcdbf4a454e76237095c6e01e6a43c7e575c95e13a4b35fe377f79cdd614923c1ebcaa27b5684a236142e0dc4f1de146ebd96406a42003b2239c80fc48271d43b961e885d3d7595e149dc7387bdc758ebdaccdb743022df3e5454595e8eca04c2b6711f20743077c48733380e2e557ddabf21464673551b97e6882258ad4a5d86de9cdce94c5eba1063593d9ce01a379f7803978a16377d4fb40bbf4c084b572526327ced816ed5ca5931132839283cae0665e8cb85cf70bcd8d70784b3f6be4e012ebaf8ed44c7c89ed29828bcba0fd64bd213998c122b77f005265536b6db525c005e94b6b2de038d8aa66c3d299bc3e66295768984fda24aed3096c4a5896e2edc5bb1891ade3705e4f11412e4543c5f4b845805cffdfc980aa2acb799a7f4b1ae23480cd9ad70979cdcc0857ab218aa424d67256a7f5c5c2fee00e54cd85270332b3780d09c97b81db032d9fb418960fbcd7d5d63572c1e8500fd8bf2bd9f1d8b999a0a16b73ca0ae8b461e6c4dbd38d3c7a0279c7665fd7ba17d88ac113f3b79a4dfe73f994b4779235db08ddc59734c8242bce09e59207aaeb40ef9d6f66dc2df505012216b024d39a752e437776069004e0418d9a598a7c703c11b7fa964ad2110f615058a55b1a482b145293a2878d92f82682b09345a8a94d8d657df1915c6a778d46e2320e78beed80b7b478a0bd436822f5f987d2f8600c2494865ca84de67af03c319a19c06a706129137f95c49a5d191a46e507b8b44a5c9f8efb833fa207b0dee8d0be5d11ed1dbbb083450c7f6bd517b34566ffa4793beb0a8cc9d87c8160c4554295719e92c47e06d3c338911f33294aa147621e19a715cd86d4e279bd0f75be5dea179147b414d44a3ddb264ed559f85e73d006419b19a5f32afb8158d13ecc05e605012c7bbd26a9edce02a7b8adf15a5a775d3173caf7596338ad3072ebaa586f93a4a3c68c602d4fee6a770b9733ae4cca5d45ad7d94f331d3e7352049081bcb2e0f5569e7b97efe33ed73503c38595659afb2eea465d74145aa09baacd56b42a9472011761ba669aab829aaf7cd1590813ecbe44008d255c3aa0132cc79989e1ed592010d335ecc5e59bcebcb584a1ba5864e79fd929e09f00d63b11b72b92b80b77823b26b117e250fa6cd1bfc328905d67419ab31e9bc7cc57ea7fb276cacef0f5d03b1a557e68ecd270d63a5cdfe3ef0928f307b8242808207ba6691a9f8b04d8d682d379875f3b827c8954d123392badecccddc5b3b23d647cf431ba7cd4894ac33c12b5356dbd543f53ee5c4fe9512bd018604eec88524519d4a8ee47ad9489a143cf209e988641fad0a9b38c1335aabf4b739b5017fa20285d5ac50bc17bf87382d5e8de61f046672b9b12ba7147e9a9d337ef381ab3079276bdc8c0946c955f5d8ac36cc71327660779258da3eed2abe521fca31bbaeffc7809c3991612dd6cd630e72a330185812453b703145265210a9256b1b711e21381d11b41692319c31a4872f19c4f88f5e6d6e5e7e01c5bbb767ca3f076b737bb894962eb6b923b82aac900548147fcc0c6d7b1e65b1b6ba483845197d875d90e9d66041c3b3cd7de2d28d8a954fc0818c4b20630f6c73b9f9ed7374457609ae6d6e16dc875ab42afabb026c2d79c6657ddec293532da9e815a86051e7fa8b6d0cf954ec963cceb9e03fa39d2e372c3357e02c5dd1b91cae10d2addd609cced16671fa20495b29a77835bd380aa0cee5a85bc2408b4a3a01dd1e48c249405d700bbe1f365f087eef40d3a4f7d5b9bdf5a386f704663ebed4de70c245ea71f34443340d3b8cf8a1726017ab4085a6d307e843d41d5f2e49906d04a8ce7df613258bc0f71c8d0ab5752ebc691a7bca7718e83ffb7bbb5f57ccea0e4d4d4da5e740ad0c1ab06a54a5c0f5dd769a6d8f3a900d3ca83ca4804aa966b44e7eed5a55450fb288067efbb94dbb4788cf2826328bae0b1b25b38d51987281407c08214a21583cfa199cc54223c6ffc5187af70a90451048e756cf96521f6bd45b5e2c98f812d77a40a8aef89d0fa87b97293b8a6407f06d87c5656592bd623293c34f99d8a5b744a36679d112c92eddc4bc0994f7fac718fe2af55b388d711f03f3b06831f3e66922e3f862b733591d7951be19e043a77651049e44bd2b032cb8a3c86a45f2c50a27d8a3fe8bfb60c321d4bf1e143f05190ca1060898701d769e35c1fc889fec425e548a619b095438ebf1915d4529ea8b88ad8b75386e47099448671c92c6f06a102c4023f230e6d095038659df9ec3a8883ee57e6fa68b40dac98a120d3a00e4bd6d3369ed7eda7761f9101da04eff433ff9af4ffbf52fd80dd6f05f220d105eccbd70a107db3fef19ac56400ab333b448ce27bbd77f4b5500bbbf466c0b76993252c373244d016e16b13c8609e720304f9537894a0aa99e0abaf59463912c4047e2176c6d695ec4fa1c93d21c27dd527645d6d2a846f5ddb810358efb72539108c8894843bfef3066da6ab170535745c0b1041162e04ae81af330be21aa0ddfed7d59cffed2b8a1673af89eebaf3b307e9a429ea76bd5d51c59c711443a21377a518c3b304652805a17a407d7f49592ebb63b945b536099aeeb5f21f117a4a7e342aeeeb833ab239fa35f12c00c59e6440c93554e3515ea77d0dff69cd6b48a55acc60cee599c18caa2a73fab6ea405efad31919bd401f6e902836210192fdf4b2ac4a1f4e66e3c1ca17ecc8ab52c4c25ea7f2aaba9a8e3c9d3221b2d0ac68d9fb289f43a6c96fe1f711fb32ceb0305f7ff62025f1549b779f4862e07c12e1557f9d40f56227f7dc1cf3a08eea6537068e4f3458b61ac8bf47db94d996c092415367b4a6b7af06b598e693dd4580225fa83c7e5e9830eeae9f566e12e2dd281081db3f02ae0f5622fbb28e167aefd3bc52630a0102455e603c7113f37d051357a33254bad34856a0c6cd44cad8e5a7569c46a5d59c8587d51c7bda30a7cd9daaf49e1a36bfd675264c883a23306a070cc690db61a5506d2bf742008634a02dc940a4bf931609cb644e3cc59d969643cfa46111a352e4d12fe435df2e8499206645cd9054ead001dd707c0f51a3e52d1bfa38d93000b2f03b2e73435229ae2a87b5403fcc4c256285796763fc9196caa63886bc30638c0127eaa14ea2a5d60352a2e2c7ce5f1e34efd1c3617fe0ef24269f62b8bce8aabb8ba6a7c8cc2079d14500395794b7d9e46973d562a5c1f71859b71aa095dc3a6f80178c8c59b5ed78adaebd7968643707088b968b33b1821327eeefd38ba08a79f373ae93707f3c6226a23e9a9bf9556cc9354a2b0a84b084eb82bceee23057fc159d128759fab3fda75519dc049cebe0b871a21a5c77c22f0974654613ff7a0559a4c2c6732313b253b7223b345a0970979a9e236da1d410efc816c02bb6909c8f893a44afda88e4cab5151926a2408b754f8c1dd340f6ee739694bc70891d5ad47e547aface76a6b29cf1844855dbd254f7c7d0b10ce7feac0d9b6a6b04500dff1ccdca496e998ab9e8497b2b94dcd9a58b8eaa903a52da46760dd46730459d4ab89abb30fbf0e65bb4abbb6f84e9e918cc2e15810825f2e2876520fae1456516c98abc00d2e0f40638dbfa81b3f166648c38b91692b1b4d547190a0b981a4d7577dd94e69d3bf6e3fc79f23fd6a58a1d8a5c8674c383692d17ddf8ddf5b7eba1c8fd5d159032c3025c4d82a3469fdda9ab52464f9bdadc0a2ba8e6f4a0ec372b1c889b35e7ab099593b35436c6b65be13319357e1a2541bbc27d27853689171cb0ee89b786b4ca371059c52fc51de09ec0a9677d0a4e52ca4f1688827397d9ab359c7bc41f05fdd530a185682496b1080caa316143a96832180a0d1cee822c0268374b9ce14fc2a7b697edc8354dedf51fb8f6fa24ff31ac76b94bf71fdb763b05468ceab1ed7a73a95cf7400fd2d96e82c2787f0e25d70e02fc2c4924c212995aaf060f0cf2bfae0b3e0e4b31d8b2180ddbe9305d4c0c4847596f08a753fdd5e30398d5a9c1d4d84dbecb732220553caee4f950745dd5be3d032cc871b834ab7bf9ae194ae394fa99140a5a754a2d20c0d7b6a36ed7baf1f0a77c4ed4470bfc588c9e7bd9b6969dc8d36ec1f7e763f79057077dc995240d88ed8c45f91b129a8f764eaac4ae05205e296377832f1ca750c6712036cad6a8263157f53d801956aec48c2460277fa65f054052b14a05ddbbc690fddf3a489b5a3445adcfad14a91d8724f26a594c5ed84f38ec3be7740c1fa7a884f9b4f62505b4715bac7538197b5c02c3307c1b8c9fac9c0476d85decb2e605b15782e6cf6f0f08aa7f5291e3942a2634106575a9be2619055a95c8e84a7ff2ece17e863f5ab3fc5dd6cf5bc2e29e713fe6b18bda72ee02fbea902511dfbb8896198c8f83a04f51e5d3247cd227ee8f34e3a15cf0126aa1ab677ccc0ce4252390f770649d765ec4ee3af9ea9243eeccfe5bc68b24a56e2fa337da06c2fd6fc8b050915eb2427bf2561d67c78ced91f331201c5e3d8fd3ec668cb596cb9c3415a0224edf24a554044f2a4b09b6192f9efd2134104228a0e5276164e91e2ba281452445e542d6a42bb141b32013f58715c87866ba4dce603e416cf04dc7f0921127d66cdc4762a6bc1b89ab9a339f78da246b21f0197a0677e110c8bf8cfae19034fed838ef46e769b08a9cbc3f257064f1382d81e94843fb426bd79d84126f62bf44f0514dc232a8991d6a0b310a965d85bb4e61c93aa7ecf49cf695a7a9f0f4bbb637ff87a318594c76af4b4a76f3839bb3fab481a3071d5701f4f1a711937684034dad3312993233dcd01610e42bfbcbd763002a2aa3bed1fa33cb8d5376ce3f982d5692d8df4a9e271f7cfbec2e29314856c38cc1548897b33e23b51880b43627fae33727172fe103ae307666e986391aa82c22e5ce297a4a828744c222f5ab513b6488cc1e698b3ef969cb416543c25e91ea728e991b196ee675e7328e58d7ad7986cc62fd6101ce64e2f2cc5968997f0e7a11b8fd08376a3add3d9694b3df95f5247ee692a8cefa5ed02919a7efc8cd2e11843b179c483605f97047f9233f272b52f7774141df8642c9b58f9ce9862b9df609208065ef4cd8ba296a229ea587ad829d0e9548e467223f5afc094c3ac9ac527146d511fd4626a3e8cc153c0b65c61c83234fa2143ca9eaeccb2af601c0ea06f5aaa5110dd3200f154f792a70a97118b1a3f289cbe05084af962b325b1280bcfdf08a837d7044ba544df7a1a482710e019bba7541a15de378b5524a5e52c4b117a4b11e77213eeada3d4432ced2af16402f4abef62ab1cdbf647cc24cb1a909ea4a060b9a75c44181609472fe721e6352d8f08dc39c9ec56d2b7400143fb99f97932ad4b345c7a1283b14e2a34eb8f874d17b9f45024c8dc3537c97af4b107c624039d87aa3590ad9d0a6a7257063e692f8d2b723ed6c8cdd4e2594806d95fb83e7fbd2bf705954d5b2c959ff9e2b048a6b2be687dfe7a43ee052e4b9b58953f53c567914c65df0b8795bfcb636c76d6bed2e6ff165fd0c98bb4ffff7e9b0c052c63db59288359c5bb7059a470497dfeffae0c0a28d3b6b34c0ed38b7361594873f1fafefb4dd914d4a76d456fc47470e5bd40f6a25cab701002c82ac54bfae79f776558d09f6c14bd47ee852e4b1b589537b3c5b1980cb27d69fdfc799b9c5b88aff27f7d84de161e4a8503f4489865faf7bf373d70e01c17c9543797fefae75d7a28ecc63658a20753e75d200bdd5cbcbfffbca93705b5655bacea81c9b961a0322e34761bb2223b93e15d5016695f9affbfef92bdc098dbca52f94c0d7751594a4d17bdf5ffe71dc3a2a00f1e3fb2589e987a4c217f1769bd8ce7a1e0e683401e6e312f6369eee59e8a8ce7f1c759146bb65761d8ce74bc2306ad0e81ed430233bdfe36c126f092174963e8c91a03a141c42b472f03fd0a33db87a856b81fe2703a2da67253e150c6058d646a7fbff916c332be662d5e1c33f14eb811e72a72929009b7bdb8539422ae0c31b01969818628efccd5c2ec7d173c2853561a2b8a2ffdaad882fd0e577de86e6e869e803c26cc42dc9bd1a11a2dad4edafcb440d6db4163b4b09d61181d47c1bf9c8540cad30300b3d829a5dba43c1d553230c5cf4c44b8207107431b8b1df8baa871b358d3e13c4d61dfe372b29f325b194860e8e2592626abaf450990833ed60a627603bbafdbe9484216a1fa40d8d2740a2a397f52e7dd2c6ff9c22c8b73bfacf52b337ab9dca8074ebdf3c48cc3ba1105b9c42503a40f66b6fe724217409b1dfee2430863c864d9e97ef10b8f4f030b82d4cadf23a4ffe3cd4602134c60e6a3f907a83d3f6aeda5ac6e5741f0289c319b01c6263050b277d0f600eddc36226e94aa2e6860cc650925150ec59b53294899ed64741422aafe5b0e47c8118f13e7b2a77e732809dc17aec952179c00e862f8c036f85190b81fc8dd39065cf98aa667102ec571d0c225c778d45c90c87b627c2dc735d0cc0e2dbc6d6e6ef43d13b7515c2844898113ec8a0743028a8c2b40e166e6e0f04f0804507c75a00426287226c768ccf27830e6096732d9972e832813e67f5dc0d3be02aff1a12f17c4c6acc10b3a02f76575acf458ec98f313228a61a6d813ea48d7e8c2b03b3853b14250d49a8fa1a260fcfa518bc30bce508b45d71b52492633318a3b01993289eb0f4397f7ce08bdab4b00d4b0a1d23b240495c1f6a107d265ef44e7b8aee67571485ea230fe5888c75fdd91c34164e7bd896f6c7fbe6479251341f844149172b5f20ca6af0e77660947335530d05aa80fd7baec12f8468603269488bd70c5962c0e031714d61a68801216a3021b2d317341c083596594e2d05de0b4a72f26a9f0b18d03fa3692c0c2e00b2580bc646136bedc6ba07f7178e5ea6cb8491d1df3ea4af20a3acfe8cdc0e002dc39f5d7cf7f3d1834bf192b8bf87eb64eea2ccd247e34e08f32acdb30c5f0c9c3e142c09d7b728afc31d2231b3ec1031a607ce7283be54aec768816df45341cade5c78a324e23afdca9c705e558995a505ebb00ada0374a0aa41c78cd58ab05037798125ddafd13d151914a159832ffd54c82a1f29137af38bbe892243604a72212a4df02d44200d96c1bda6d288d45023212107c38556b5a0fc34dd37f3e33877b900c2eff3debdc159e98b881e856c32a985a9289d82fcb40c90ca3214d1a44166f9d3a209676ca8f8ffc74d050b179b20c437d27b03ed804fc4bc74d800c99ee189d2fd614603b5d35e7ec3293c08a935faa96c70462904bb39d590a3f8e7a37a721904430fd621288782114c8ae30a824a379a735cbbcdc1c8a860a1593e6c384dac1a7c5abc5dc541273ebfb0649a34508af12e9ae30624416560a6631feb0bfb51809b7d31482e2c9d1a730173aef164852586eda4b528e3314476406725a248e6045015907c2d21135d8f0d6d7dd9998d6510adf4653d4165a7f02457f569f0623f7c171daa1a9c0856f1030bae69714a153e03a680221114d6ba50c9edf5bd57c7f62073ad2a508c35b51100d61eb23f44c53122d6cc64eb3ae0cdddc6a292aa6c280db4b688bd418a8c16daa6cd340fbe94483d4422c9368b54fb140779e374bd64a2f4c0c088074b3408da4e38a9e14c41cf7b56014f71e741f1aa610cc188202b03667f2d3ebfd61838fa78eb206e2ccf002a10d54a028d86e1a9ad86d18e160307fb903eb026560fa524b0a8a09f457e21790e9402405aed90c790e19ace49da0adf4df020de22e7afde87835c5a7b771ac1b7113aa7a6d6886a2a1d3c4715af90e16955aa3236f201526ce21230f3100d5e27483ce0ce0dc6b0a4d7e2488d0b000ba61b7c3839eb0bf83ea678a6928804e7da93059503ddd91f1e46026a385264cf717a7c0cd2e61b37ea6f374eb3fd189e3262e91ff02ac673adfb8e4957d32c47de740e075f4365c50545929d38f2f19c4cbb1c3d049aeda9e5b494f09bf5f9dbd5f22bce66276d9191265d2d00013eb435c92f35306c089875e61290d965538df08a43c32b1218e2e5a244f6431adc163b8a2b475a51382cb600bf78294d44fc655c62b8a8a977e5f191afa1257e471c4125c00de8e401cee7ba2170f7ad134908eb7fdfa7a92656a0d4493e43c35f0e6914d42d0e30951f8b5b6d073c64119ef553485188daf4227aca8739c4506e85f38978e32aff740247e72208ca3f4ed4de7334d5bb29634d03bea3ab9aac44676594c41aa0104e1bf3fc0761b61be6cf27deab505522ff8507e39324a0846e1f0c04143b8750ca520e95bd5329157211d3ed15199594dbc55758a9ca9a9e858273d6e13ff62a944e8173377a87f4c78796d61dc09abba47ae8d84323ecd94cff6650bd3e4a472be133067ab785d72262bf9aaca18eeaa82820372d5f8d3be0deba37d20109d4dfc3f69e28a45449c16d9a55ef371fb07227eac8051d22a83ac5cf347af19102b218fe1211f15088612db1d7ab93c27597adbc553119d8d20a5014122d109173b1995691a2398c905427229694edb16a5b495b7204cb8027ef34c2d51b39193eacb105bdcc28a6f108b71c5fbe04bfad02abe2700ade8bba4add370b239a05edfb4578f155589327d6d46b505c6d5205624877df1eb06bff0a57ba8226a95099000bcdb2162d179433a3018917f706b525a339fda60f54a32f5054e7db52ff1817dd7c92594fdd276177f91410b221e0395f2bc1f8629462c00c2095d14ab8242997c96d5249212171d98ebd2b3d044561288c7f54c9ad9e45907d4b59e8296df318792f727a71fa6282218adeac14ce2e6c6618a56abba30dbfee3a6c80d7a5ecd2e1346731513c3dbc3ca44a612538b38413f7168cfc192cc65680637f81d599e3a5fdf24688d29032f6c7fb4f7344ccd4035fc0535775a5d370b35b5949a1e22d0a9ec675e9015234201101aff08f45e62d7fbae24bd06eb642b14840417391f25a7aeae4490527b260f55b4b0fb8bd6288741ba1a5dfe0834fa10c0e734a8b4409929987745961d85706c0fcd540a212b7e136a0354ac4d30ba5d94d466559bfca90bd625b5e36daee76f60446e06fed0d0c2d449e04ff6bfa962ea6bf0030b3e94afe27d150a5c6a03d96ef3e188ac803465201a263658599c97e423caecbb980439f6359027292a64414571d8c18fef3e62fc2e9455c86631450fc8371e1ea300fb54ca8f82fb5b791ba425560875655fe26d1b46692caecb37993abc6d58801d30b0e0cc88427d82bbf327674db57cff4cfd5394223eb3c1a9d884b2f699a500003812f334f53bc893a69d59f46a283e5afb86d14413cc0e7e06e5377c47c8c881493255b3e0215a0afc1a10523911560834f43b298bded7550ada710fad3d553d0ec09e6cbbb38ea12620349a8babde71ead7bbb448098359c5a47272e5378a71a03e37c06df4a2761b4c9ab0e2d62a2bdb6d42e5238e829d1fb961991da9e87031b464010d20677f0ff194787031f4583119f3d931e4633ca01620ef49bbce6313799d28d020dfe853e459f6a3848fd59d22c3e2a37a809913a7380a774d47152e40171ee4c8695b98e210d15995824b012e67457c6f9e07529e34f5de554877d2f4dcd86ef14e2b67621cc5b610f01653a91ca736ded44a19f99b27403834de60be46be7318203078344ea032b48e227db8476fa2d5e795297985750c05381c28c112e7a9ad81c7b968c2e71280b9935aced3ff8f9b26cae62cd8663a09b601606a69f8dd58184e1938e80ac7330fd3e5d80834b2251350112728f69c137b61ede395a0c80ab408f664a0ab40af51183b6425c2a8fc834f987513817e089fed1bd2c7006ce1ccb11924c79660f73fb6c1fa4a1e5f094b0ee3b0c3aec4779d8cdb7267b3483e66bac980936d7f93e68cec3bd4d917f4ced9cf134b11e6740028214d0b3cafca96eb56a55c94d58222add6b4ab93923745dbcdaf9817da815b942469dfd167c26c56fa8a25dd2e41fbccd1473283bd5b65a296a7965238aa83ef3143f70f5da604b92c821ff70f6d4c4bf9fc518428ca3496f8986a22c25c65acb2e2f4d1e420a11d0ecec67e0f654f9b38a09915d006f0c2b8c4ed8cf009fdd8e82604ee8526030853ca3386ce3964c885bb7bdc8e94f7aa5e0a46bc7321d6f6c738162253c8fe649135efbf51b5f1738e8000f9d02f50b9e1c4feb6754368a9daa9870946c4e3cbd1c2389d84d19a15d469961017176b3bf9389ea18b141f67f2fa1ec8c63c8b7f5415cde30443e1eaee92f6473e8021948f5a6f2b861f15f2f46fe79a427fd3b71fd576f2f2dcca1367503e1b1a8588eaaf6785fc06c0f14351f6d67212159e6b8fa3696e0cc435c0f90b25f10b74b7087e8a1efa7f92250c688d1784a2103464096770931487be767b8b996b7cca4491da6339dc5ca3acdbbd8270942ad2185f78fae4cb6091411d0bd47f2c236ea970d3466a043de1c0caaa1b94752af6ffe59358f135467d0e15c83a4c0bd7e573839b03d5e99429279e8e8e95a153e2e02bbb95b5a2ab2e557b33447a2b1fc633d37d5a0108fa2007608a293ca04c9284414adc730a2b313741fe44095ad30c0c5d6265de0a81dd56126a62b3dd732fa13008bd71265810d6f147df230c6946b663e06ac2f77b9d7c99f0cba72084cb5716b510f205482d45c17d9938df1a100a55f96eca4f500af0683f9483790b331d98d3a296ac257020f6c805724d24ffaa268355129fc1a71168ea1458317cb3c494d503121d9166407f5d087820088c90a44622c8a0df429d15eab8376547d0a2f41653bf8090af7b2da5b70e7713fb16f4b48128a58ddb504fc3ef2fb1011f64347abe88cad0107c7c5cef4e3089e7ee544aab165e2bc611d3f359843476be5173be39288863eabac59efad0171b1f0dd283c2e65cb70ac27df3133d96c094a08b88c3a39932c00cdbb5a590ee8a411e35168645b0f9e7627f6fa23aed8bd5be3097e38c11e13280a80b7a7c18cf10ebf83e514cefd08ffaa2663f0b98f3a57a18f41c7ad4020dc6f5e69757063e1072e80f4a0cff9fdf284d1f3e44d1507c74d1531df0c594af5674e6081ef7414eea7f6741a343afe66b0b253d0ebdd176093d2a2410aef969949b7f7dd0af8643d9f8222b049bb3456ce36608f169e33be1beaae5312615c0e335f779d1bce7ffc2d6514d65f32c407fb0f38a6ece071d078293c35e17f819e5e718e1b0db33f3b3afa19f34ba1ae355b7456c584e04c0ff10873c6a3ac45e9f490706902302946f204f07014789c13f0973c986714bd113bc4a1741bfd5360e112652a820ce8cec8b5e0541ed005be3b52f510427f80ef383a80b6526a5c12358d869a2202313130650dcd317324615da6040d5c88f82637578a5a5b464ef1b042fcccafae4f2c870228ed6d2c9b7c5dc338d33de31078627c9a1234ecb0256e98d09fa4b7667098b5b1203f082d42f8a798fa115f65e0ef511dee73fbcccbf470d3aab50173389a2caf56e5487c00c6ec74600067200920792639389f2ffc544f1d7613626ad08e377b8826158ed155e45aaba2c3d473a2f6f1b8ded1ea59d26849311a0ccd65ac6e6e0c8923d3f99b8da19c6cece181b21e6b629994a6dd2f32b06898da4eb55ac546fc54dd4feaf62a3859293d6f4ff8c21b1782c4d2c6a74c50fdb8e4ba9fe5b4424996dec328c687cfd631b0ecba7c27ce7254e0413f940c484f4c7c401f349a618177230ba248bf4b3360c786052e224a20e02021f4678f30f1993f13346cb27573e5aa91be95083d0c5d3bd50bc5148772186a9750782f4d3cf0911e739baf5ee538083885c223f3454f05675737ebeb020df96f5133106f7540c37bc85409aea1e040561bc6a0861ac536ca7c0234f09793ce72d16b703544d941e4c3d03ea98be8b5510302c391df01b829d4d5d026102aaa24d3545b3ec80f49dd90592a5fb30565470797b78386599a193a87c0e74e8076de98f161ce0f73026af9cbdc0c8c95c0753c4c4646008be01ff7193ddbdc9967b4b296592019b086308a708e19cd37f4eaa69b55c901b2351187d8c2975204ec0392202cfee00b142ddbff45a6b1b4cebeac5df1f821a829944ab905a73abd607ed9056d35a472ee153f1045a86afca3e7b213b11f3922239215d6b0d5ddf0d2ac9911c082d824c15691ca9caee634c223dd14ee8aba4d9f565d2bd5e8f54732daf0ba9c2a893d80a399f084813e4ac507688d0845ae22322c8fb3e4b12be83b9db0ccf5a61f6d26775469fa0ac50db14fa44bbd031774a93955a0f1ca0bfffc630a66592eadf6a95e0e5bd38a2666e8ed7d17e5de7bbcf3ba256b4bfbfcffc3d8a871fb5b2eb40fbd3a79944bb509997a13023fcfd291233c9a3983cfcfdba569a0652e57ac17fe65290e03b59dd751e655dd4855d7eeb000c92dec625a4c4d4f73979455fb4c8941212b4ba9973ba94181f51a4fff6a63933cad67babfd6aebb5362a8a1975877e3c84af1d56095479f80b59e46a14797e7e8a24b8eef9905a0fabf0d0635189e8b148826b20baa2582610a00934849e33295cb1c8e7f9f94cf468fcf94d7a7efafcfcf9f92ec66df468e8e7fb187a447434a3516e54e6388f6afd76dc121388ebbc89d9839eef57a8cc6b5bbae8f95e65027131629c509993d9fc15a61519920aa3ffa68815312a5b8383b67e780f5a716e8e8ece394443385d8d966b933f5ac8850b726daa815c3e2746c66d55e673268cfe9c39de1c277eb2d7f1c9beab89a1d159edf688a313b732e53c240b4913d1b5e94caaae3e8c74040929ace33bfaa25314e664501a9d953179b8cbe7642e455f8b3e4686f42fcabea330ea739e207d8e1c1f5b0c5192cea7776b8c4fea72108415ba2a689840230541c8408687272f6178204c0fac2da44a05b90b25054e05e342e9f0dd60ad131a7031441939b513fc60c437874e1753c00431732a636608951450628c54778cb00943d5fa179b2bd844a159558a8278c677f05d7f36dd6eca82dffea6e8b7e76efc763966d89871a3e79099e9b6a0e93731de6389f92e662611d1a80df4073d9fd266d20f933bed9ea084e66fafb53c8a57f1283ce809f448ee4499d233fa307132f49c53869ecf6426adfe8339820f4820959b1377c4a9b022497c1cb307fd3da5c031cbccd7ce0124c97bd0df38f4fc3c8188b307fd7d41788dde359f9c320fbbeed0a17cb51c9bce0c9ba9a8ddcd0d9aa16cb51b3443b96a47a369519ef47523bb4d67868df69f8a7237da876ee4a2bff116585054e492a3ddf550767de38d1451be3657dd041335c6687f1bd99dca8859620d94197f6a82c8460e0afaa2aff1e14a54aa11141474ab915d1365d74536319387e7a987b26ba7f953ff4d7fa04d1e7e81b2addaa508659e3ce9ab953d8a57d1fe504f53ce03502bf33ccf07bd90100fcf15edae81b2eba0ec4d9387eb55beb6ea4947d3b10e923b4cc8f0293a8f922b43fbca278f63a812957ac671ecc9ae57d9354f6622e66bab9e5ab08e509c152299c1271a9fc5025d8bd9f548a4e66b8354addaf1fa918443fbd332b11c499a5e5054525def5e5d8d260fffab3da775e5e1cfe52e4ddf127da292271a7962b3d721b7dfd1fe375c4708c210df7bbd39a7b59fe7bdf4e779d7da7aaf67ef755d4b9fc4784efa7a0b6aa5d6291dbd36a9d39ae8a5943a21b157ef5f302fa9b049a9b5ae6bc337a15de2648e44e6c4397aa348b1d6b7e8bc644098788f2cf375fff57a75c08d6789f30e85063b168a92f9ba4fa4ca964cd8772985a26f1aba3e7625993ceeec42df21c8bc3461f759794e58ce69cc4226ec5a285d3facf32644d727ef92aead56927715e60e3441ae5584e7055e1c3141d244aab061072b50e46c3884d9314185d30cb6344410450f47785518a9ec4c61cd607d5268a1539f89568d169923bc5c29b6cc3011233921b9d6b798d0bb855bc17121d2677a91f6f7568d203fe8cb91acb03142ef793b838d16bdc92f0a1b2b9aac3a48a164ab0ef943b291628dea902ba0915466c91d3f642563526348954053b2e546ea0abd5fb82f0d5516244b4f3552b732248f9e6aa49250d1400ae9a946aa360212484f3552330c818234c6b06d7106b4610b28c02eb610a3c242f6e8a9660b225422d8820a972da40ca1c59d3130498403428806a7211c941f8270ad2b465003529a45095dd186cacf54d00d3e2264d9015d3185959e19a07eaeb0e9c013e5c9a703a494a99e2b76e0814543140f8e9de0ca8849bc22a3e448346cb08837e05851ab1976239a26aa845068228e0d51536112af481b9a5668681c006f211a543026f18ab4e1061519060fdf0e3cb30515ef86cf50a1c35592a1e9c3313235585a94e7011b2a94dced920395e264d59cd90108afc10c1a3f28d19ec815c6408691cd963066b67809ad90437aaad96245750519b4823b061996209481f4c8c0222083b608eb902b2baa0001192d604235a48f9e6ab408b14aa3c58791a6450724b4d4f0051176be108102700622765c7cf8124ea3eade6aae7e42116b21cd24ebb8e291f495d20e1c31165bf77e5ea8fa1cf6884a9ea752b9eebde0db8abfe2ef5be15f91618f157dea7857e24a2445a5cbba2b718a6f3517d1f5420ce5caf563165e71ad1612126529edc86dad78bd4f65145a1eafd3dae9933a10b53104aabe1e9ed0eb5959d22b8fa814fa882e669c47900c436bad0555e0873e6405c22b952a0cc3107be0f7b5a702017d9febeb444e313d72fa3ca292e5f151c1af74486bd112aeb0f91be8ac77d112459a3ce6673da1d0e15783c4a0ab3c54a9ea5bcda5ba5e88a1a42e1a45e8ee8e57b5865555abadb532317a30a6c338a6b3d6daff3caf5677777c6b45b2b556d56a8a73cedce47ee89ee7595b55b4d65a6bad551c8b8e88e5f75673f97ab2705aed1d3d9189be764c4c4cf465bd6fc56489eebb914a926050b544840596f3a9cd6d48311f42d86c365588c3959d4c3fa758e494b23e8420fd774b63d235846aa62ba4d72a553d93dddddd4e14956e258f98564d9cd0177da62148921c599645abec6395a1afbe4ccb59774cde1454863832ed987cb2d8f6ada59456a7f6ae486cbd0f03e9e9029daa564dae76570b5637b93a0c43a355a5912e8af8134930872380a3e98f9104fd1dfc756774a040b7281a3365d0dc6c36f3c16228ce64bd77fc202a9a66e61a2cf49e6fb4986b681abaa26ec5af68fabe65486fef92b383c92ec868fa2d2f66d0f4df8b339afe0b084d3f86e4c4175968aae68b9da6bfa4464e1260cc34550386169a86d145d37722c66c9686d6c485a66abcbc512306189aeac4680ab55a512f69484981ee092d3917ca50a28b9c30bedc8c28296e299c498142a529a594c6c8208dcc5c14bae228e4b6b9260eec2a477a80f574a74787b2028a0a312210234514e387841e916212cfef790b41cf9ffb033d81e0bcc7b88324853f690b060c3e38cbd7fdfa3fbda223e0db07dfbef7403f6948334bc5126209b9480a1b7dccad0a1b5f951d28ffe48abb9948858d379c43b146150b6a8ab9e779b2f89e795ea57a9f798382522fe744d273d43eb9e757397c9ebc7a56e6894d1ee3af7ee8f1c5cc6307d1e3d3bc37e8c0033d3e4fde1fe8f143323bced750d8f8740da5d4e803e4765c4b8f4f6f6e469b197fc8620498fb565ce31feb8f2fc594cda969999924fe38d22cf448cfe8f1dde6fda81af74a8f4fca66397ace758e7329ba138908a7117ef1db3709d69ff778da37d69fdee8cb5d73cce4f1bd100aa40a92cea8bbbbfbc7f4bd93ef937cbf845a3446cbc27cf255aa30742a4367b222ff5962277a34be12123d9a73a797b46ee81d041495b8d06f42658ea3b0f1e71da79c93942e33da82e8ddfd1370d1116fc7f4a4474b5a30d8a213beaf5f5d30141db195ce70e19a30fc39f10c71f448057ef8a1a8148a283c292975857835240c29040bb91de75bc627a76c82a104144480b1b363c4ac647d6bca5090f3860c0d0929368c29593f27ebf1647d1595582f8ab0f1dd35055d61768dc452bdcd37cf9fec6578ff09f99feb052fa4ebc8f7dfbfd0f3f89fd87bedfde9c945e47f3f4b9f5c44ba5c307ceff3f87b9f87017f4fcfe33fc167fc57858dacf15579cf9c1e3f1cc707f39e385b059deaf8e3bb6dfc1aa3d1f8e38faf6fb9ab6554c38a1edf5d1b8f6f0402d28d16a8bac34d55333369f523f823f9e3cf8f413f7ed55599d08f4fa998180b36d3fbf1e9138502fa51f5e3d332f4a888f5538f7afc9efec8e3da64e8da3f8ef6c7fbe30b654c3b083f28674c5faa07caf5cc04e236ef31fef8013dfeae57e871cf9d0e7ba8f6c9b3fc2a1bc1711c2d7d8dff93a9aec2c6273395435fe38399e6e86bfc2f178138e3fff913be0772c1e0f3dfff7c0f43cfe39fa5db1c0885337b8c3fc6d1e36f3a8eef93e92e8f4fe99bc9637c20559045abdf568f3ff5f45c5e4c98de3bc624393e09fef823c8faf14356768de91457a46ba6c7d7b4697c5a1b9fcec6a7b4f1a7d1e852c1ce2c0532239c463bc469fc33fac260148dff7720bd9f9eebef8b7f82fdf1bd3ca4b954b0566118ac3279e0a62325c81d96d1f8b70a179ad995a1471b9c45d1a38d6f2a1c26c15d95912eec5461f859188f24e984efcc24efb10aa62cf43261f8311860ccd9d849e337e02e859f9e4b8523af0b6cd2f843fcad9e7eb8cadbea95063598b4fad54a95b758a4ea90d25fbd90ea59f553f45c2c540d8220f8f4c15781be4a0e7de1d94c171501df7bcfb5a90b74a974f485ff890ebb905090defbab701affa7abb21f5a89ffcb5519084bfc104589ff93aab29f2f25fe0f5765208411a54cd4adcac0236e28f17fb62a7b95f83fa82af359024c89ff7bfa9caa2c9c218912ff57fb9aaa2c864389ffa355d9dc95f8bf59951175918b52e2f7a6aa4c4789dfdb55d965934410257e4f5765f34c89dfcb5519101a26a0414a4ed4adca6e90e00c1b549581613c3955990d23a828f17b35afa9ca88d294f83d9a37abb2d81d27a6aa6ceeaa0cd329f15f5d95e112ffcd5559cb036fa47055464e89ba55190b8912fb98a0c47fa1aa0cc89930b712ff7daa3220244afcd7a9ca6a193980c04d89ffd66e5395e12d4afc9756652f1294f8efacca6896345c6628f1dba92afb3953e2b7bb2af32a7020b053e2b7ba2a03ca52e2b7b92a7332a2a85051e2b75255e62355e2b7b82a9b67d028c289a85b95dd196c505506c21959b23c3955d9774689a911257edb5465631a20ea94f82dcdceaa6caa99da55d918751381ce96f8ab5495d12c25fe8aab3210ead48828716b87127fbd5599371561c61325f6f2cb93d55262da81128700258a1194f82b0da329f157e23752baeba6c43e667055f6c197204210e5ba31564afcd45665aa124f1550d1a5c4b01d4afcd4a9caec9c33b92d257e5aab3594f829adca7894f87daa0d19257e4c569908a7ca98f2e74e39f670e74b09342bf1c7aa8ca80738257ea42af364a10f3994f889e050a7c42556419a12ff12a62a0bd2428b12bf9309060e5e683fe86a4e55f6534598a79fda16dbcf1565a2a654113594782c318f131725f64a8caf94f8bf5d95fd0cd7e811065c349ecd66b459b9bfa98d671acf66331966e5c6b41994d9acdcb829c4f14ca93534d5a5301d88bbed69bab6097d5526211dc8ca54bf899317a88b0bfede7e2e979a4ae891cf2f76f56d669a3c743e47ce54811c3dabb53e53adefa4eea88853dc70e08c3666441ddcece07920bd61954eca97abb0d9450d6bb2505333630316b332342ca29ac88186449a5b9b0e48c141514cb6f06867d5e64a1d9cc5152f5858aea491e24a146dae30b1c58ddb23fbf5439aafcbadad43d46bf544a57ae9ad6650ea95d6ea391d624e77ca43dd6752e5803ba554695eebda17bbe657eb73ce09f20c79b5773efeaecbba9d53d585b51893ad2b2acd17529d525a35fd59e9f43ce9abde7be6de5a9568636bb5ada1e9b5d67a6fad6dec3d41a8855c616a6bb5f4be9d4f6e770abcb3485d62357054ae00220b203cd085155da4d44c704bc3c59834681082ac53a992303722a0a0c0860ed854b73557b001f3a6ce0daa15e060068c8de16de818794b8495921a9078b5a3923b805a58034d2feb5b249e1493ad0f55e007e2eff36ebdb6de1aa313bf1295bcd72735d33d1f8a4a3d768befd3dfe39d1bfd3d694618fd7deb8c28fadbdda0bfa722658a99e6795054e2b1f75e7befbd6538a15f2329d2d9428bef894a225eadfe8a4a2b727ed63e26ada593031954d85748ca660d4d0617ad22d2aaa7a2920a43f918ed8fc7d0a3eb7d1854852b7164913c3d3e3f404142ad21a2a21a366e58f0d97581110e0c72bc603a32d8c143831eb10d7c70f0a383231992074940827c004208427429c2084a43482052040001302280011060a904130a70c40027a080e4000848400a0a5800039234008a031ea004021190c092096c1598ac40810a30b1d082059a5c00031970e2820636f0020c313cf1197e82927d969fc49061c82fe40d640db8909de40c640ce40be426d902b9057f163253ae40a640defea4fd57c84cb20a396f8fd2fe135892259023902190b7efb4bf92fc80fc0ec89bd2b47f03fc936406e405e44da1b4bf02f2a636ed9f424e40de344afb23206f8ad3fe07f0479237cd697f144ec89beeb4bf01f2a653daff482e80bf09b984bc6b4dfb2f6502e45d9fb4ff00b200f2ae36ed6f24ef7ad3fe01c8bb46697f00e422795729ed4f24ef9ad3fe24e45d75da7f4856cabb4e69ff11f2b633ed2f42de96a6fdcbbc6d93f6d779db9af6179243c8db3e697f10f2b650daff83bcad4dfb07c9dbdeb43f90bc6d94f64fcadbe2b4bf07795b29ed8f94b7cd697f99ff51de76a7fd3bc8dbeaf48fbcef4cfb7390f7a5697f1f79df26edbf41deb7a6fd63795f27eddf23effba4fd35c8fb42697f1e795f9bf6df9133c8fb46697f1d795f9cf687e57da5b4ff2bef9bd3fe39f2be3aed8f41de77a7fd71e47da7b4bf51dede4cfb5f90b747d3feaebcbd26ed9ff3f66adafff3f69cb4bf05797b4fdb83da9e4dfbd7c8dbbb69ff227fa2bc3d9cf61fcadb93da5e6e7bbaededb637b5bfd9fe68fb6bda5fed73d2feacbcbfa7fd41edcfb6bfdbfea23e9cfea4f697db9f4e7fbbfd4de92d4e576a569aa660a82a86565d18caa63786d2fe530c8e62a347f608cf1e436131aebd43ef27bf7df61b86df31fcdec0ef177ebbf05b03bf33f0dbc9ef0bfcc6c06f0bfc6ef29b85df2dfcaec06fa6df2bfca6c06f157e33f93d81dffbb7047e2ff90d81df11f8fd80df4a7e37e0b7037e33e07792df0af8bd80df09f89dc2ef03fc46c06f147e23f96d80df27fc2ec0ef23bf4bf86dc26f02fc5efa2d80df03f81d80df467e17f90d80df24fc26f25be9f790df22fc1ee1b7fe5dfe0ee1b790df1ffc06e13790df417e7bf03be9b7ec37d2ef0e7e1ffde6e0f78fdf1bfcf6f1bbc7efd86f1ebf35f89dc1ef1dbf61bf75fccef1fbf51bc76f0c7e5ff0dbe877feedfa6dc1efff6de3f78ddf45bf6bfc1efa4df45be877eb37d0efa0df3ebf7f7ef3fceef9cdfa4dfe167f8fbfc3dfabdfe06fd5efef37f69e3c79325561339fed7c965d3f810106183e5d0c31c4f0e562c8ae61d8c00636f049bdf0c20b1fee85ec7a032eb8e0c217a5010d68e0bb6920bb76210319c8c06773e2c4c907e524bbcec0052e7081ef090318c0c0e78481ecfa0216b08005be5a93264dbea626d9b505586081858fd6420b2d7cb316b26b162a50810a78534c4c4cde8e29bbaec00a2bace0e92840010a78390a64d72ba8a0820a9e1413264c3c1c93ec5a85094c60025ed4dedbbbedec7a02129080043cdb92254b3ca825d9b50420000108784f118840043ca70864d71078c0031ee0d5942851e23529c9ae1fd0800634c0a339c0010ef0660ec8ae1bc0000630e04e254992e4ee9264d70c5080021470750b58c0026e6e01d9b502129080045ca9145248e1e252c8ae137080031ce04621000108b8370464d70740010514ae0d091224170a49768d82010c6080fb74c209275ca713b26b0314a00005b8b523478edca623d975014a28a1844b33c10413eecc84ecba0402108000766a6969c9ee96b26b0208400002b0ba010c6000363780ec5a0001084000ac941123462cce48761d8022458ad82800000000f60680ecba08092490606d448810b15044b26b12949494ecd3902143acd390ec5a49041144b0b5114618c1368d905d8ba0b5b6b4b22cedacccae7508218450a7840811527742b2eb103ef8e083aa030104106a0e84ecfa0320408054a9204182545c90ec1a88071e7850a3929292ea2d29bbf6402693551b1212528542caae651d74d0417d3a3a3aaa4e47d975071c70c041adfdf8f1a336fdc8ae39d860830d2acd870f1f75e623bbdea0478f1e742a168bd15d2cbbeec183070faad340030d7215e69a4706196420b563c70edc8eec3a03180c16a543878e9b8eec1a9623470edbebf5827a65d73970e0c0f1840106183861905de3b8e0820b6a4646464d46d9f50539674a73b95c74e6caaeb305165830f5ffbbcfae2db061c386eec68d1beeda46515191548d1a357015e63a1c1a1a222222d243424242b656ab05d5caae858080809e8282829c82b26b201f1f9f5a85fdfc34fd64d73e3c3cb49e9e1e9f55180f8bc57242922413995db344515c328e63920a73d76218864856abd5920e411024a252a9845498ebf0fb3e8c6315f6ddfbaa30cffb0aabb5b65c8607f5148fd8d9cc6578eb32b8c80af36fcaffdbf97f3aff2f2785f3ffa2fcbf9bff67fba0fcbfa7cfc9ffabf97f4dfe1fcdff9bf97b53fede4e9793c245dd6c504f4efe5ecd6bf2f768deccff4ef9df9d2ee7ce8af2bf37ff6bf3bf50fef7e93af9df9aff6df2bf34ff3b73a09dbfd5f9db9c142eea6683f2b74ffed6c9dfd66c93bfa5d9d9d4ae569d7fcdf95729ff8af3af51fef56683f2af4ffed5c9bfd66a937fa5f9d7d9d4ce9feafc694e0ae74fa3fce9cd9fdafc29943f7df2a74efeb4e64f694efab7deffe51ff347f217e24f64c91f4912ff254cfe4e66b4a69a937bb65b144eca73feaef3f79dbf4ff9d3993f9ee12777af6977d2aed3f80685fa0c6690de82821205ac6caad852822eb732a03c09238517da4e0c19375496282d03a529a594d21fd28a1509eee8fa75ce1a5d1f1495ea6a85439c3366e83081458b11e526672ecc0f6634f18131333a6508650d1b4d7f044a29a514ebd0f53109d2e8fa330d5d491c6a8c00091f0149448d60a6f809338518a6ce171084f9d2fa8206ebcb0f2d306d585fce0429314584ca61a809a22f37c2680993a0fd88c142288c0fbb99f522078bb901484c1aab24aefc84791342ad60c8cb1d12cc0882a68011bf682501d552e287f0cb1741524cad00ca4c90189d5018314425b67861d48049d8612921077b318281e22a718478432d33a3b342c3f2a286878c22b012703ea8dd08060c3945125a8864ee8801959813be90d0214ced16c64a1a47044166d705bc2386de2ddc912e3e2548233dd5dc8942ef18983b5af01972d453cd9d1e9eb8434574227df45463e7ce78c68e1947d8f1228b14143b685432902b3dd5d821f3183fc6242649fc38e2949165080db738b821a4e200e114a72644539c28568670e0890b33781822a5c6851754866071c231acc594a21852ec0752d3ae69aacaac0aad4ad357a9bdaa38c5aa3c51d8b4c1c514443e34f950f3c1c98727fa5c3c61c310ad888b2c575a5366445cd07045874dd014c483190a9b6bf01b0a9b3cc869d18f612e380014438afd4012628a105684b822d43a53e5671604022a3e43aee08070ec4b530f26f18aac014761538ac2a61e52438ec2a6fe69c5309c2c39f0c490623f9086dc90f381938315f287a79e187e93062b8614fb81346416c583df88511b67709ae1897cd3268737565019e283d49b277498bd0983c39020de10d134c406fcc68729b8a653bdb961ca17a5294a0d4c41933704081b8e613178b831a4d80fa49a53ede973c346070ba5cc102866286cea8d49375258192243cdcd13b421536c6ebc340dc9a1c98d105486e000d53a4336c658cb32060b3204630409744594226d0d2c224b93195968a0810cf554e39482af062739b808f2f554e354068cd3123f9082b4f454b3e58c2b6ec18bbd9af19cfe1ba627cc1fb446d641b7bea3d27b5db462ab577fd795243d6b6fadf35f3171fcbe5aeb57e728a9f5955babaca2631923f64d4e64d91c92d1ae3162a3840889c249d5d7b15eb4d7472ab0702ab06033cb5081059b15195aaf2b7225ae56ab15f692764c1efeb55aecfa6f55657fff8d12fb81aee48e600e0946ba1d79f6ae91baa3cab3235cd5cd22d1d58e5cec65edcb49e14195f58a6315842483acc4b9029a36260effa80d1b26eef33f99371de2cf71b0a0abc06af19c737eb5d65a85a27873ce69a9c05868d8ccdfbdadcf7a3b8c5a2d8c3f15f8d605667bafb5b6b628b60ed66aadb5b556950d1484d3c869b5a00a54617b915aff8a2d911463174992385c7db1582c7655a2472ee19670385c8c2449156e0987c3854b3e93a66af46003588cac308a412ab0d0ae96a623cbaac87a6dbd96f522278cbecf94a99ebef32c1569ba9403484e598ccac8798bb2d7e6a5ea02495aafc5f55a9e1eef51f94c1c0eb7845b8a5519adbfe47347bfeffbbedc1c2ff6c2f85b15e6b446e5eebdd6dd2badb4d2baa2b9d6fa7ddf87546b2d42dfddbd9a1162299d73aef05dd14c279d742ee10aa3393787e69b14a594524a69f5eab5a8c89caef9d37b6ef55cb5f7292de10afbbeafd6ac82f7bd0bdef3d822fb2d792f770f027e9f277402eb17bbb5602c8c970f31700ec91a2351423e6be728410a637a36c88e6bedb5d5bbf8b3d65aebed983c2689df35bf394aa6adf8e2afa52dc5480eaeb05b6b53a0aff9a10f3148b7d6fa08e33da65281a40b4d388d2ebdf7decb63a5ccdceebdd65a7bedbdd75a165af662dcaaf14613d42adcbf45ae212576d19068acbeec9718bc1f8d2cf15b71c8a7ef477d8ad81573d9bf734ed6bcf7decbd393bb6becdd75d3baef75cf02ade6d4df54cfbbefbce1281c5255859fea3f55e8fabeefa3b5deeb53833c9ec295f7f61d671a2ec3077314294865e8c24fc3e5ca05be900a6615f861a6214591824bf0694865f821f52a595bab6a83f27812455506c3ac7a90c552a954af72b578288fcff509818484425bab108bc1a42fff11a4cc8efbd65afb736b255b3f9f28ac61ed9ca058345bb3de7befcbe6b7c0e5a2388c6e8e1c2bab03cc9f2a83ff650c5bd57087f7d57361f05dc04f56502caae04fb1a8ba96f0eb7d870a3f1843f97dec52fd031c385e8a8883050b162f45c4c1e2a5883843d8216aadb5567bedadb5d630cc8ef3d2a3e278d51b635dd5d6060b162f70e260c182c50b9c3858bcc08933844a174ea35de7b4d45eefc35715aec47025f2f4f8fc000509b584888a6ad8b86141be202c71ad332e74cacd546d12b9545a85511f6e48faa191d18b8cc291acd65b80bb61232aaa06d515895c688ee6721695f06300220919818891a52324ab88883a0dd11aadb528bd71a150503ac70ac79048d61b232310d133a9be6dc712124ba0e5e8729daeae6a90a8b45433a571a1b31c3944a5fb394412a8aeaf55a8ab981d3f82e8a9f2aaeda7ca54d92bf194ad7eda5519c260a2927d1d3be891f57b55363bcea354b88eb101899ed3a14354b219d83a65d566ab51b556ab5d711295aaab565b6db548b2b2b2375558adc8fb38cd69fe5461f47b442eee94dd76e3e250b0154c54c2bfa322051172f187bf3ba6de4425fa4b2c918825a3c82589132e4c19f05889ac51566b4c7830815431295059b5555bb58d59c44490fe1baf442eef062914b9c46e754ccd81540fcc1ef4d7e86a46d34faa4e5426865cfa3c9cc89047a8fa9e60fa64b09b32c27480046edeac600c08536e8ed072041a1f7251b0d290a1940b72e8c2881054f1849d207a7ca1b3c4113cecb0841941f87c010a69a04f9a0853c50c0f68ac90428ead0d145e7270e490808a37c5123d7861143c4217e4084ea4a79a3b7534d6530d19507c373ca39cc4afb72ffcd2e11bd454054192829c329e56621977c671cd194bd4a864284f942975c650f594314117d28775020f08fd80684c11a2625439158d353c41a49d26c270068b6b501909850cdb75bb46695a71339ad63db4514326ce0f62dcca6db380a24c1a3b54be4023556e7b03c3cc07b250628c2b53bc287398400b175de8e444304689cf600c86c618a7e08bc629b0a3f103894af84934b468f27f44251207bd8fa814547f74ada16b9d5555678d6112055674fd160abed0f55f8caeff8aa5d1f591a6de9c00a76b14d0f3884a406ec1c72790a241138cd1e093a21248befe7996a8f4c3aa5347b37e14955878a67d5e14957cac57437b46daf3bc1240d15e09b6d05e1d1ecec0427b019eaca8a44b5b2b7a549921110000000082000317000020100a070402390c647928f8f814000f5d90465e5830184a05418ca62886611896018000820000c618830c535575008cc290d61b918a4e087aa931bf74ef8baeb4206852228a6390269ea2fe0d441b68a34b082942e648d4c413d2bf23d2d38004fa5337374a26e4c723eabc805c6910e1a442084e459db821edcb22351db4147dce48a343696931bd07d19a564842b6a8e044c49a0e9b88faaf216aba4419f9908223912d2e08ff9a68a1878652f655cf443a0d883c89f62bf55118e231ab49a34b260e10f6adc99686521173a34f949180d4884336256dedf49cfef82c9524a10ff534099c9dc462461eb2a9fde3dc409e5de333bb37640b7a3bb056eaecaa86dbc050b573ddb4682ef36737ab803b5986cd5e324c3a9ca6e1b0a5ed70e6ac128af25db56988f6a321752778f9ea7bb47bb8964cc6707d4cdaaca900fb45daacb51244644bed3f97ef4e2ce43e5d54a34627299610ede6f6e567237451cc4a45f7a6bbcfad23a4243d33a64c53465c74f5c5d2b0cbf21c62305d38ef79fa3980e3a754b397cb37615b96aa58a19849338248bbd7e33737210355e254fc1c69f634e20a99226ac4fb248af08334dabe2aedd880d30777ac8f38f4f5c3a028508d1b6c49d5845ceed9e499e4f3a3047aa5e5c2590a6a95fc886db8e1c8ff393a8a52f21541dd5e557e8a17930bc0c45c2180f9c6b395ed1d394de14fa75c29f97317eb658414b9bdb2a5b17566a5066ed174f3fae13b300467a3fb2303f259e26da6204a04a72ed25e09a28af106ca8f887ee1955da2d8f110b00178cb79cfdadcc098d856f74613a267e8b6a9a3224dc43cc270279a617a2e5bc320d5d181e4cd801b53a098ce76f28ac0f40457b29deb5e7008635fe2dd4a0fc09afb9dc0e9ab042abb77d095b29c9a7c85a01fb0cfa2c6d9f013a4ddc7a0720b27a2d973e4aacc221878fa1ca13b4d53af0a2eb30be5a250117db0400bab79f9fa93a9b6cde1d97370d7cd9815acf1250ecbd5257035235b31d2319ffeee7551241428e98ae34f69b367918b6482c8d147edf4e989097e39c25e35a83b4d549d2741198482f5bb845824bd0c05a1e6c7319016e2d3fd759111083cc60bdb74c70682782f45d3a0ce544557576f3c035aa478f4a818dc3476452f574505a81bf91740973fa3eced2cdda5d176ad77ccf560bce5bc87f09b0ff830084f3dda0ab593debe6cec3d8f9bf14c225130439d791fb71a6ea98454e17a8eb0f0ab8318ad12c719a467e2ca7ac9343472d22832ea5a6768971529330be76c8c41b7bc178e7b1e8d1155d89d7a42a0ec9098294702378e8ad32469800dbe9468c1986178c833bf55c5fedc7443d5101853c53e6cf64b7de6458483a788b4d3d334ecb9a91a22ab01d86f25500dacf520864a4c9742ac4e92f66f2dab032cacdec6da3e2e367b453d8798772517a1da5e2a4610d929e0ae00e4ccb2be3110570c05fd100dc9d0946130a7b6acc39b1b1438ab7e37889fe9377b7f3db688bcd28ea23701a63e38083d3c1bb3b14512d483d3040c6796f0354ed272106d84dfc48e99174331e22725998610b3de20e4d82990dd1ffa3f809e7b4bff1bdcc783880459aaaa6e176e6a8eb807cb67654bb3bde86bcf3aaf4224aed42bfc15786f5af07442c0cf0cbd9b324ad7cec4f7eaf5027c9d5c8217f0f569f9c97ff6820371ec89c12f8d8e40adcaec0d58f6d4fab6ee48d7c28d5c928f15d1e9391dae726d7b662e49380032702d9c9abd93b74eb900a615ed374af77bfc015873785f76b7f35ceecdff4fdfc80bca0097f99affb3261c371e8c0295bebf508f56c88bea34d4fdbcd41ac4510be34cec9051eef01d914867f58674eb53a322b92d9299692d763e8172a23e963f1f73e0be3b9220634cc4ed68b4389e320823d0c6f428b4c583ae50ec35c11a7cac882e6df2b267b90ef111120ed08b05fb547b3192468dc0f8c06750889c4112b932822af87d54bbc9da9e6cc88d737f861f5ed3ee732a2a0cefeeb3cc32bb1954e55d6c831afefc8695477e85aafc9366bb5b4a6ed6a03c7f3e80bbfa4749013bbe57c0452ddd2e65c29e89405712fd17b36da215c7955e86fb151db5f7c364f9b912b1bca9f5082c7a5297ff0180b0e8dc87b9cd520c50078445b00727f6724bd4c00331c0d022bd54990e87d2f33ac7e72c170d83e6d0d13a0468300186f49b0d90c549825644791cc23427a381e70943e94723c78d505f5f1833ee8cbeecb514bc98097b4c8b0236e01256d30279c1ec2ac53a643d30fbba52efec9a8e2b2cdf05e9b21cb457a9f958edcbb6151d407c1a5084e9bd8ba716994eac520459e2b7a048fa01208c166e25ef2270856d737c3b27c5f7b6f1f76ca76493c1949137022b74b7fd3a2c24b614e2e4b7e2eb5da021679af56ce9a1d1aa2128c5bd4870ee8d5644fd58837b094a0991af013f3da923b474d6775ccee3fbcb0fd68c68c7af121abf7718f576f6cc363fde2274726df5ac6e17513f028524517179c728c4f6cb11fbdc255effeaea3ea471520008b39e46367cf3337a4c8f90a2e82e1ad322fcef96a9f0148e1394792b5f7fe5d7ad89501e696e6723ec997cd19c11d6bc442b5c09fd650bf1425e83206b04b362605f07a415e3fb07432a11a596c0b072340c06e8ab6a3a7a68fb0c237a048f4433e8a9d328ec1be67fb3b4850eab5ecb7d7329b38156f8313e964b7e84bd803c018cd2b69dc0dbf573e8cb2642732723484939a07ad9d63ebbb5877999dc4f638c3e3c00395f3ae3e0bef89e6aeca814381edbc1290a6d60368673310a839e02a806b91d6644f1e44c107d3416a8a1f47a98b2bbc54b4b66a824e4ded4a26e1a37da1f9153e4594da9a9260faf15ee0b7696b5c3bd04fc3a45d740e5991733b921ad51867580155b1c60f39e03fb49b1d0f475b8407c16301e1c0dadc9c5bb5d0d000586dc63e3016fe8d0072d24c12478c721aa891472dec8542a5a33692b3967967736168a51b6e5e5885e14c662bab3c3e6104efcfb4a64030a45a8c324bcf57e33f273f102233324f0de3e25e3aade968e0286b641206e9668499f5404d27120d9f691a3d131d4ea787ac9c8aac80104600a69df13afc906c182d9b181ca0a5436dff90ea4dc6c226cb95f0f6d33e13e0a58bd94740b8d82eab1e4a9c3024b65c8f4abc9086ed36a42035525503e8606ba28fddf31e6d97874b341ddaea5c3a0c92db09fcae87de65ba74f53d264c70eff8fe1bf1c8b45343e2cfe8ff54da1758ff7900bb738bc96b7d0c09626b6bd07490a3ce961ff100b26bd70ab885f817c4299c5a386f0455fadcc45e1021cf87fafad73f42bec7b4ef6049860248da26e7a86251e9d94f7c4952d5b65e5bde1970e987193b5b63ad45e2a71aa1ec364c72a9ca161427740034e3077b38c5604d0cee04cc8f0cdefd1216de08e5b93f505a7e41da5ccf8b3c6328ccd57aeeec14401a0e68fdf4d04422ee747fe1b2599aa6de69052af34001260b959bcf288ddcd0ddb772a9bb1c6a83dda556084559b880ddded3e6d01703786a219937593d985edfbafc19f0e27110fbba5d4861c5eab6e3b50a814b888ac3c17608b5017ee229571ba1e6278acaa15f74e250b37bbb3b286336e9ae660d13fdf20de10c15b024d51440df24a208dfc2c96a3d3b38fd9a0a97e534d522f151a254bb3d1a7c959bca3d3499c7d911db0825315c5f258eee1b2b3857dfdeaf2885029b59548e9d5705e561f9999dc6122789533a71012177a16854ab8fa123c476309465bad9bceffbaa189fa42ffe80b1df0b657de27c082d6750536cc68b9b7f34b12d725906ccebb6e550ba90ad32edcaad75d4f0df86efffb48f96191a7e86686bba66f29dfa6d6093c87d0671eab1c2e51c44a955e7c5dead497e8c0f7a76b71eda23ba11bda48047d22bbc0c81ed592f05beec8f8e7b3b55d4946fd55fd62500ea0cbf6d9cfc463411873baafa6b0e474c12549d49b3e7ea8da1049649ad2aac186e42dcab3a9f34513e37c2fc8f260a5aa4ec1febde68370bee6b83f76147693187d5e84986acda408986bc1358cdae09610960bcef430ddafa257390dee0342b2658714b060182b2d49f7e0ab45bba9d3deb35d3aef0b08a2901d79a1137c7055b8aa9e5e4bf585e5b0bace1e315a3afbd848e2815e9450ba65618bda391b7886f64a60f81ed4738b388e43f1c79c87267dc38fe0929ac378ba5f0dd96763f2aff8e64ec2e59416d441828cc549268ede896d48d07c696aa279cc60d9edd71702770d1c673a7a0e78d310fbaaead33662228566d77f60b861777b6e78b10e5ae3cc6849d3700850bf171c5b1075109d443d51cadb5021f770f5f91af1774d3b1f5aa2192df26f11fe9d9f4bcbe528b2a39e0ec6a34366f7646651735b73ef21ff65e4baa3ee69e620dee5eb4b37dd678efe763acee0c239efdcd9efdaf8e7b9440adc758b469eddcef37f5aecdeefbfc780e4d04809c453f9f5c31e9736f950054b79222422d4514a74458894498c88fc369a25b0021f60308e60f137055af9e67e29f3d17ea7f6e52279246543b454518dbfe92ae1f41f797839bda2cef50a19eca8ff0e48902dfcd06d52f2c9f8646e61d62471b04be73de396db20d74651a129243f0b9ebe9192785fcd0d2a04e8ed11f0ed90006f80a454324835be9cf1c19040c1ee2c02ade37eaf1e4f05198092e51b1f82884827223903cc51f2d4c3afee4e6c539c33f75ae34c1d75589ea5993a66367a00662a761a726928d1816acbbcb96792f6d2972186207bddad58a7d7e4eb8bacc4f61bd4e118c442fbc2d41609cc3af81418ab916d06cabba306aec1eab52191777497a84e200cf6bd7000196fb494e2e3829a8fe7b052b3c5040d0765e2b26dcd767f83c72149d45b2b47bb838ff7a448ba4205dabf9b878e4bb8ecbe9b883d52728d5d7511bb5aa3d36f42b5a267e055c789d56626d50562a043e4097a09cf9c4c0b40197014aeec6e8cdbc88479d2f7352e62f0367d2776749a9767cc749921f6f5ced268b0c285108bfdd2943f0a5d6ab4f512d3244c92f01841f24586cd9139f8c778501dda48ed77b523835b1f4b7893ef9cecb9630499585c46c0654bf47ae9dc87b89033bc8b0c55cd66302fc5b919b75a88028c70cea280ba2b0357f9f5b4fa920056810ff0b3ae795c2f731de0980843ec6db53257f270a039cba0472eddf1c335544581edc7db602b49353936a489b4bdda1c7a714835f970226a4a5c81e89d644e86f145d1673140d701f8c28feb93abacadbe5314a0405a3cad5fe8b7ca8a9f41af97f6dcc4e24dba5eec13fb948c770b77b4d09a0ff8ff88d53a013c0aa833363df6c2bf6001bb8719f7d4daeeb24f6ed05f02e49786bd6a4ae593874230314b358920b0ca6f4a31e25f5c8ed352f419e3123ecf2cb86e5d832337a3ee2f1a4ee7721b1f6e764147803db8bd675da75f89fa9a4b211137f798faaa41a8b0c5a529efe58e5654466ae8025fa55467a5769cd93d71465edf5520d84de44df1c297f8919b4bf281e4f13a4683b20f42279dfdb875bb3b4d74b320780fc7c66a26553805b50f89a64122e23ad91925952a0af0f98e41bbcfd7862daec76aad5a1e56e40e10f7d06df66ab76a38d24108c6787e9fa7ce47afbd74c146425eb9456caa0e0aba1f1b1b8dbaa98e88cd5d6dd82228943114ae35ba05ee20f95a5aaa57a891e70e205f1a49cef574cecbb865f47e180a1e0b1ebfad2072dc44a06d2a792e1de8d3dd9badb19d051bd668ac07c3352d0e4dd8b068c74decfdab930f6fa21ae5cdc7c245b7db7777e364b9b5a5664f43020a9efe5640eb81359d4b51e54b112df2eb5db810194bf1c440c9405790ec126414e76585145f532ebcbd83ad6d86c939f7c0f214d5f621dc0512db229392068c0f4e56751ffceaf6bd8fe5713518bde488c157657d0ecb5a7d76c9e13db381cbc854b64873a90eefcbf0cf115a6dd5871633ca56ca2d5d6bbeec3563f4d8b846813baf3b6890d2975e696dda7407c23696f9b214fa52d1a1b35be9e43eddfbe68d8a144ebd77331af8e8ddbba05c97b1b395b82d7e5fde8c923115e4b484b11d86f075b1258ce27a1b1daf4110edbbb22aef92a7c56ff815b02058795584dc7b04cebe35ac7378d5d4ac2f1c973fdecd1b17f37b5d4505202e86053fa11508feb0fceed3ba51ace0ff91172baa0d5c20176f8b6e979d6a7ae150478d5fd739c37b0c3a8dad2183b8120ddea6a90f54c0174f6214f418e854664b6f05c3e2e531ab6a67b4db5b0d8d5001855f4f89db12d1288b4af728386d88157b85146826710e3a0dac8a267fb9a9e0b69a999bf1da5817ae573d0054e3b18c8683aed7cc73b044aec5f87b026d0b1787a8fd39dae5060ee930cace7e9915db174310150f314ac0c9a098994bc37947e0e46bf3a29464a64918c9e25ffcd8fd8da74f422a02fd015a687b17455762f651d74c05889a5643f6ac35ea23ac7e3d98a36b2eeb6ab4e66428a624ab795f17f919e961b7d302f5286ac05f52a9a348a3a7f3f45574579a22da131301c679c8ac5b8766b8217ae2853694e3f016ecb209d6651c6742e42cf2f7e38614a6dd9e638401c9d69d91e322ae92473a402d221657b0a25d213228e48443a8b49f0770a0192aaf546c0767520983ba464297dfecf93c0f09cde0e2983e4490a3433f3387367b9861e73a2c7a58c39de181dc1591263f6af3d2f7d09607a12ba2e5948567e3a6d07b93974a0fc586b03a23b72ea16c240c8f7293f953f0b54f445f247cdcd271667ae4c974bc4fd741875c4fc935093955dbab786228add7672b5d5133f166583871e8d86bca5b9f0bded7df5aa298404c603fc09da7d224832f4813edb9c8835b8aaeb83cc25cc8db277b977143dce1debfafe4bd17e9b8554be27b93280948d3b5d9ab717e3f060a53647a103808c043212de546ef3c294b9c83277e30748ba46d627bb37f7b9e02b1a6324f44d1dccb83a10cb5c5d625937063ca0dd382a196b8e7979306f17f28b8a806030d62a5123407a1ea97f4eeb7f7ab81b1de46bfcc388c42744be21714f3d88687dbf389770d1c236e2eac8268d34aee8c772bd3752f999282b15c934cb5d477be14644dedc3778d945ea84400f8eb216f40a4a753f4061522ec092392d46d5ad5c740a8c054c6ce71b55978f34389fcc78add545a3a59a32b750a8c3654d75cf2712a7d5df0947159d75bd7cce1a0472d907ea3886bd6d85762c0bbcf052406b26e1a4e93f96fae2faf4edd1481418c64ad5825c6fd1b2e588b878c513767d3043aad336e00da660c1f2c92ae04fc2b3e8a50339d3468d74a1ba1946ba22bf06ec46629d68fa1581c2b9f7162549affe234a563239744c48f5b91667abe030bb1d094a23c2d5bc9f5c03c291b6ee9d48f152b822cafce0faadb04702151c3c4aeb8c89a1c9e4d438dc0d120f56d52ca2996d43f2748f3e851f8160d0d6feff95e9d8d6b65484dee938b331faf69deabcd6b01cbf95669bdd9c64f1135916e26660ed8e12d0ed80bfc2bd78f992e749c2c69106e4776956df95273bba0b4e2f9425da364dd86e436dba304d6cfa05f32e5cc0d90a3e839cd8b9eec9934c3c0c18f4476997ab586630fc4151935cd8a5e3fa1c28e8a3121eb5d57bbb07ee1c51e8944ecf8e130e00e03d426277339cfb2243e369b2b357394c29a3564fb591703d5ab928311527428bffbeab4e7dc822d010d0628d8e97624caa1ea1f533041a814f0d14bfbc1d5c4f24e9462cbc37428732b9b8ec4c2e86f4124891f4cc4ed346c6aa186a6bb70ea5a3ebe5be08efe643d58ea9564e1af4f33ea0c291dc76114c45f3fb016373d2051d1f3c1c6b6dc0f293e84a61c99b9965a2c6eea16c283108b964f8961391276475489e6ade7ae1ac725d0791a38897f5e3213abea8c03bc723f6d89ecee0308ec262034d17a8d04cc24465d09b100641b9a7257c91c0cce9fc60e28d73ec073951bac8301682fd325ef74e65f6ef60146a69428998d084ba9fa7d9b7feed9bcd318027a7d00b3f609dbc2a9ac76352366aeebb714f1702e8ff46007f13f8665724c7d00127608480ede2ddead0fc06079a349bb053f708d49093eea03183ebfc3f4771492ddfb0055444ba3dc0760557f4472726a283acedcaad203c8a8f061bf11b49e046ce25609c2757d08829add4f028ee84aebcbb07e7a050c88449d804a02daecff15c50bff177ed2bbb4a0164319bd786e94fdf92468ba26d4b603d2f0fd9c1c4556fb01f3445453c7ca16b28893bbbf02128e076814a850c91db7e420f247ff76e042fa75c4b370a1d6265e9120d16fae0d7fd35d333272387bbb2210c4ad8260ea7a5f2323fe6df4843b0596a26387ed28640faea8172e8e986d50beff47305722aab779c21d88d28c3d132f41502a5820bdc983b8611d2854d62121be0b4c1a65005a342bba05003a9212de6e8183a05a17f9be59cf30fcf211fe431d2d09412e4a34d19aa4ff48f98479f023ae019ba0479ce1ebc1d0572269009055c239b6ef4d90711264d4aa002459279624a77baf4009372a43b24e22fe6147243411824a4d0b9e8e128d72dd574dc49b67c6fe634a6db6d914b2f50820f1aa01af062403b260c60004623a5a6ec4eda511562b2687b488df24ac10ecface880effe4017ab71a0e48a0c6f7e77864ee83176a31834608b49c40270f584fa048052ca750888316d3508420abc9857c400a5b398126072c9e4290c32ce620c8a116d39024418b0964a4a0e50c219c9810b69e81200b594e421087ad4da1086156a69084d0961348a290a509f412906171cc1b623987220eb498429105594da149822d275009014b53d0c400622d68924d089d30dfbfe6f5d0955c0bbc066f0fd8cf07d42e8efb9851b90b711cf2ad64a1fa296de48f29bf3e1dbd0a5722204ac3f0c9afc725c439a6165ebce6cb53e514801f8ff59021eb62c1a050ed00a8e320a59bc24f9552150d487acce8d9464e719dcf87c74d80454258c3885282c49ad89da2fe1af207e14e292ddd52bb87e7f8932e0ddec1d5df34c065ff5fce36f4d29921a007684cfdea01cbcad7829a5ea73e09f50af1dfef3befe77a5f7e7d2aa11f78d24fa7f9666ebf9024eff9651468e38c0781bf77491ffe00b610c57b4ec0cf80b64678241b7e400b4611687fc64b6d83892a7ed037c5434e63d8e9a2941941cbf52cdba602722b7fc0c52222c6e1c2acfce514ee019f8b363e3cd116a834ad0d7572a95c958b721d4a62d029c3c9a441640f71d7d7be01f41d059fddc6a4855bbab57019b065eb39d45f4ad581fdf25216ee0a92cabdc2140c11a67a2ce1d373359700167269e665953e6bb0972d0b40ff16fe5c09378b5e3ba0ee9d2a6d1cbaa7fa7a13dbd0ad0ca278271f0322e54e72ba605b8a0919c5be2c55f45e8c6681629f145d7c279b6e89fa4e8cae602f9d9534f54e2055b025826b996a5b3c55b811c13481722f805eb8234b9c406927992ed82ecd844cb1278b2aba17a3b948b12f4515b793a55ba27e2f462fd849c74a4abd13982ed88ae04a46b5154f15de8a605aa0d8134017eec8265ea0dc49a2156c4b3321a7dc93a58aec89d12c52ec97a68aef64e82651df8bd117eea4b39250db09a40bb6457225536dc4a30ab722982e52ec0550857664891728ef25d1055bd2989029f764d345f662348928f6a5a9e2f732744bd4f6c4e8853be9594ba8770268055b915cc9a937e2a9822d114c8b14fb02a9c21d19e209947b49f4c22d6926244a7bb274917d719a448a3d6954f1bd0cdd656a7b315aa19d74d612ea7b0174c14624ae64ea8df874c1560453228abd40aaf0ae0cf102c59e24ba704b3a9312e59e0cadc85e9c2631e59e34556c4f866e99dabe38ad70278d3509f55e00d24a2ed8be4869db8b104f1d0f65f35eee3780eeae4a153cd4f79f22847e3ae442f05055d9511ca61a09cb361e1304e7c34c4546b265762f895eb825cd8444694fae4dc8dbe79c554d1be0b984ba403136159c360e8cccfb743ea92004ca6047c40c0d16ad68b88503282032840c5145dc6fc382e9d5b0b3f9d3b79d7cfd9f3c040aa2381fc18f57a381d47883e420642cd0c9b7ec80224194901f6945039fc609c84321041f41c7838473ee564816d90a948928f652aaf81e840f0cbe42727651a8d84f8b8a9178999b492fa74328d10fdf0e28301751c3b9a8eec9ffc704eb462ad641778196f72199ca5ec1812c54c2610cbe4553fac9e0cbfb901cbc54b5b3e49fb4066b10e73820fbe1870ad350d890ce5dd87d5cd630a5bb814a27ad9071384a4964bb6410a5f44375056b0b2c0650ee494b7b135422cc3475044d051441665d116eb22b4ae95d6331504a32bc595b13bbc17684a3949ce8a20c04acf02c7a3810a5bcd9a8b0c135425346292f4c14734495397e1062112ff336844e0b444626157a518ac9868206a5f4f9c70aa5140e216e794e49f462ab0dc8cd510849748f237a422909df8072ca7309e6a83cefd7d28571fca8da9ef43b7a99a20fd2ae0c82f441290f5fbfef4ce41019510aab2a1a4029833ed004a530f7513c0ea5f4a01a3929e8e45ad8c2ceb16952f20f2c87632c9fa78545f14a058b4caa1eda128c4ed7db8e1c99de4c908c7047a5c821a9904b0a9d4931950c7b12fa8344cc3d5de792fa2a28cf72032380b0fa76b21a26c618d7d1e7f76233874b69be048a7e205b9e8ae68ff98d00e8b976c18aca39715674ae451cd4dc278f255e7325325c5fa68572526627d35a75ec513640e0e915a32303a651eff7012cb08207721eec44736011acc809c7ebe575d2785bec69e72515404f7a2f2045da7928a94653faaf146f69003b21e7e9f958de9b7a1fa625f8c989e2cf5f4cbc90751c10b4384f26fc164628cfbe4125235fe8d7645067c264e323beb8064ba81b671b84f0a10eac4e82817a1bfc73526f40ed59ad6b1750447810d65bd0037e344421a3be49fa697484f1dbdf606642193f6ce0e07dc8a032810b2259c3bf4b441d47ff05bd907b108b286e1cde463accad82cde658222eed8b10f18d559b05dbf3e1450555c9056cf7c33a7528077311dda90a44b7d4a097f58087f77d2b2180ba82dee0020873a224ba21a746f9330554802588a3f841bcd9cdc5a9bfe13bf9ecea251a7d58fe3fdb7b48831ef2720f9b95b0075c94b8f41f1b39153ff8ca223984d3537be04c097e27a4c05c59bb16bc5a27222b45c6fa310687707827f2b36b87368c610726a905b67b9f2e88bcd9ca7496d78ff56e2b854d6398a568916dfdd70d2aae90f958f51590d9e8e0947f02df54cb5960da00bc3146ee70ee2e8a783640027c6d4396c4da2902a5982bfda171b600bbeb8e0670036279bc92f6c9c8282abe8af045a0e21b6081ed4e559899f311f94dc63f9fc09930ca2abf927f664938e50c94ff02193fa551420d41d40abc56c062ed9d0941c849e93d7c0c92df95d89f3adb5d96a4d87d1036b3c7f7c4689bab7b3e980e9557a0d5db44ec7c4be2f01922ecbaa4cd2ecbf0aaa52947ec81be27a2115e481ff9abf781bdf49026230886a604f6506b6c2c3332f709bb8bc1b16ffc430a4bf210d0abec009dd5aa2eee112383483e63b44f0b0940e0bb035f7b3e8f82325495c76f0ef477d308cf7e0c3fea72ad1f5684157fa0ec87dec0fdd44527b7a2e5bd3bdb1ad73fdd43c69fdc24413beee00429e77819b3678e7485e112e63c9e9c1e94ab7be2b5682bfca82397c01985c7a61fe49e6549527860ab7817b095e03d899b5a9670f8ee86cdb92e9c213038c460b4990a85eb2d3e1d273b29d550e536c2a82876b406ff8d816a9787807d1b16b8061de8c8d85d518b857d1b94f5cd17229660d3fffe572d4c384708c720339510228718a7255141ff0ccd45c05abf7d84b47d45c6737de26b567e0abbb56adc7827ec2a5e9016696aafce4d5744168e42c509fffcfb084f207923972d8b86022f2068195766c20222cf617d375af260f3edeb793729130e8ecbd3adfecd7d3f080270e87426eb80ec918d16a0c1de54f7a0b9fce8c9a7ab2f6ed2a035ccb6f382707e19fe4d397233ec086366e7c0f64e6bdb778071d085b29674720683429330fc5e7a81eb77fa0333881bb6bb2acd977f46e821931da30e9b642f435b0a155ec3d24f3c3247305c36db6ed5ae90a34333c82e21c7f1ad80eaf5f215ad9a96a236768eb0f154753a2497ebcb6078e14ce8feb90b9d4fb0da7543849e007bb197bb9a90bda4cb1cf11212caabd0382f0146af02a0589394e2e3a4b2485a45034607e98308f3906773151efad111dbb1437bfe247cfd659edb955fe0958c2e7b1bcea8f95613c92fe7223f8f608e4fa69fd768c6b3079e746fc5965958495e0b1f2202d256132d5640a49ba7f1d9a563514c15c8c02ffda354bf060dfbdf4a0d181a25e14c47664eee4568a56352007b6c0bafb7eb7941d957059101cf58cd20f23115dd1fa3e62d37fcb20b76b182dc448914798c54fd67f67509c5cdee6e6d09680d12bcfe1d746262e1265be9dc4552920b884723da4537dedc668ee445b5152f9b6cc7292072bbe6fdd8965b0ecaa03828fa9087dc69e2a79dff64e269896780bdb71f6b3d5bdd58e9e8c9803d8d63654f40d87c02deab5dabf432e17ac46a1c25f4c517daae8b81a81b4e590681180c8db9c7366e6d5c5946d0d01fa196e857e1203a86f2da0401b7c907a37ae17424dd3f05d8d356e9c5b75e07085b2599e3fe7f9dc00fcc2fb19d6d7c1ef2eeb96f50ea7f0c7703d8734921b60f3c4f89b953f814afa687f002ae5fa7227fd7552120df63330c66bf9ae852dbb307fa0bbeb3b266a4ba7d44739aa26d75eded566cdea454abad840e73cd8ef4783997c1cc2309863263fa04023018811bf0c1d134f7e0eb224db7fd17d100eb1db0fa8f33f0ac9c932d4b73c8793d9c53a5d7ce3a9064b1b7814b6306c3b89c40338016fbce91bcbf186f5feb70fe5fe46089e1e2116e24dd6c8a21448fad31ebb165586e8220347369b1ab3b74e9158a68108d0efa2735b93fc3de8dc031f359a5605d5c9d76a6e6ab1c8b26e53e4031053a4c8ab65c2098a7d26196cfba1466954580232a792d7579196e217c938536697293e5b26cfb057570849cb2f718ae025dc730ed978ef06ae44db476904f237ec5c620860ff3665518915132e710f52970516cffc1f1e6569afb7eaa274fc37c6f13f7624b8c469de6159273b61a1866869250fcf2e336ff277a4453c2aa309e969d17b88b51bc1d8f85e1e1cfdfc04238f3126457cc541935d8ff32e006a874ce2f437f2f1ad692b1b10b2147eec4b82a8391cb8c7acecd49d58fff246da6b1ba06d7acedd56f365ec3297f96b1a3c2b8021144ff2ba5a7b56f807295fe8ae37676f07a75dd6837a489e2d3be14d502607382060ce91b603ca7fd4bbaf1b18cb56f665c7792784b0767e08f30b4b663fdc610b02f7f505fdfd8ce7398eb49f8fbc0fd678b9909c66727081662dd51145acb763fde61fa710cb3e75d6284e342888c399e9c70d3b59e683582c3d1cbc67aabdfbd21a7c37ad9436d305ea38a6b70844b9567e0956fd65a864a166a0e01678fcecb74c9b75b4c8ac14567b166cd6ce94efe89b6dd18debaf73e570d46861f854fe161e7e2d7851b4a22de7738b0350d9fd3148ab518205b30be577815b5cb368df665b77d4a7816b5d0979f9d2894d3acb55e166361f6d7bc70319796cf8f776e6c9a95701ac8fb5ac892efb47947e4c6a2f27418bc9599337ae31a1622a7f08d1be1f9a77c96b55fb56b0dbc8336ae10638aee70831f120e4107324dfa0f6e3831dafaf32e1805ff8eab7118bdc4ae07a647e970b06f97f83f581c072988f24bdf57c3d5bf2accf742bdd7f40235fe0c9d2270f7b0ce51eab8a443515f0bb933d09ac26ac857a0043d7b7fc97a849b52c729c5e3dc450426305afcb6cff0b0520016b57e8fdc202bb14870d50b64f1803e4f106a384bb4b80fe630d22067f18db351840da16a7f8efbc7810cd62789f388b19fdb083f73b39037ebb7f45c49c3a592ba6beac017eb4b291323f3b22b5f77373c0a2e1b910a36d1cf504cdbd3e6bd704e37b93ce8a999078fcd3c90b499417ac01534340212d6a9433c3379dd934f0a363b4671549416d91aa88c953e840f763de42c269731fde6d33b025ac6cd20ac22d46b72329c815771605def684182609c8b02ace1bc17c462bc045b9610e80acd37c58e569edffb8f0aad1ad779c573e108f71f8dc8e5ce18f99da5ea60c1731ee3097346cbf5751002c12dc56dcce7211dc6757d0a02768ca66635d706a77644279c8adbf2edc869193d179ede4aa31a6e4666f1d1b06e0513bcadd3e4efb6f8b36739240ecaeb3ae132a8729e8f3fa39b6a7704d835883b1a92d7b95f0b72431e48056cc84b1d177d814331ec9e2ec24d109f2f149eabb46e8c437773971ae781ca34b21d1c0d651ff4d4a37a408f235e4360830aad5f84d2424108cef5c2f645e8345d00076244160ba84953010ac346df9c2a0576c240e672b0527d64bb79106d7b688aebbec7dd7653b20d8c158f6bde36fcce77720c5bbb72c0d3ed2b01d4ae8f589e82d8d63746add07afdbb161f7dee55a18e8bdebe64e02c3ff1feab3a82e507c17b5547c4d25ef771931416f71f23e2a78aa029197440b39769f216206ea861e3fdb5cb7e6be3bb896d66820e77da373835c02873a73d0f4cd50073af37ae0e496698107bbb9b4e84ef0ab155ac9e67540356853bcb61975b7dcf4773a7e19b2cf9434201b26b41ea0bf30485ed3c058bef82f1c1ab749aa82c546ce14b1ff74b74806de8f2618881f164ed3bbcb358fc2011568564cf726728b94f937c1978668f6c80a182b59e15796710a5063630fd37269fef609fdf72e78dfc9ec8919c92742fde366eb797b27c32205656931ac26a75a03389b35a4b6ced3ee1262bdb7a8689ef3eded0fa971d8caa421b673c913e4a607fbc08d6dfdf2615937869ff132273cb0beb622cd13360678b4c4ffe21fc4285c62f4628d64fa8a61f231008acf39cac53fee5096f980c98c3ec6474eeb1eb5ff85f475424a77c7392c2b74bd07119490e4a05d5b29d6712cc6a4a474c2de2f22dae90db4be802829ca13b7d10414f6d9e8bb8fd845a53cb821421aea32d073ade80ba11eae8ed7f54a3f5818e9680407fd0dd2f3b6a99d06fc657b00649d2c8cfb423c40a83bcc6f0249d1b8242ef5df632d5c70a994b790eb7a5c5de2be3cfc1e81acdf43b98138c025df4802b9167f3f821378816b82ec276d7a815f78f52b5c0603ca6bba9bb96cc94f731c3701204d07fdb1c7309f96d946d255816df4cbc5be67279163d5258881b746aee91e3546c40258d8da8ae3af88e60b8c1d9da24378482544621c3178015da828487be77ce5053480f01f057ce3fe4da3daeefb0776c2071a64c5cf9bbd035fed1dfa22c3702248f098605fa44d490b8d75f937d27cb67ec09179be0cbe8396b98b11ef7430df9d846b46f70fecbf7f7cf7dcdf154f85a0aca4b734379a17c2ea6b722b3fbef278464adaed697d59a1141e676fdcceac591b43bc32e57dc4b1366e2cedc599cc9ea3088a2eb6f197a94247cd29e3373d9ddfa3500e6ade6414fb4fcbf96081cc5aff4f7746bdb30a2028f3c27b66597fe47b30a90f805a86fb45755cf46518067e74647aac7922db740b3ebf555549ab64ec212896c78bbfc0e033ab12cc83f5b5d0d12abbec9591b4609d1fcc9c15ce91974f18b69edf3c39e81e12af656551acb82086062ce04d1cead4357f32e2e28d877f49096e225354a6846d210cf257b00d7b13f0a52d99af4d362e6c57d7958bbd06faace30870073ef54c127cda58d84fe283ab4907df49db4eed54d9ba59daf12e363b54e8baee6377515e17c316f3abc318e75d7fe5263673861f736f12efa90c571ebe20e9eadc0daa4b42a798241b880bb4caf765b5c2abb3224cbf05a906f358faff69b49a42d94f5d55afc746611e760a0d6dae13e486f54aeb6f55df6d30908e35b4027cca1cad853f12c1e3304c18da2e5a6cd964ed3ce7307e13b8c79963820096340675131ef2704c516e84e14b0b22be4222fe6acacde41ea536b344a50afe51a7cbdc976179ab84c7cfa80bb93b738a6812f0317d596073177e51e466ff0459c66a4bee900b764203d173c9a749d1eead74955b396428057cfd9cf1ba714628c4312b7eb786598b86dbd37c66799b051874e96c58f8479be09246cc5a6b69050378a18dad75950d174b9e8ab6966e2f453d24ccd2a2fe6e063408d5b1c7efd3228be18bc32d96ba5afa89b4bc7199ebbfe721c38885ea0601939bb2910b9ebd09494d203dd2c97a2e3943477d385a353b3460d10a88e777122e2383232adc77993584fa8253d7a5aeab4659d8665a18b8cbc1d3cdd0dacb24bf6e104c399ea11f0cead411f3a930bd240f95de6bba58cc402a71b098852a11c74d772abbdd2a39be03cd93fece377be55e011105de400f6c2b878b2d03d4e7e8363f0d278f59c48fa1411ddff5b7d1e6bf2b40e6d59991f174709790b27363f1f581e7d39d3c13b39c204e474abf0ab41f3aea72ca0db9df66ea714b425463ececa1c7d5025ce5738420434bd551996bbc4729cbe9d6827cc0bb68630edab465b63859b555b411e67f64059193ec14a2d5b3ad0097ee8ca72c878d57d82ef8d6655ae7ebe3f492ab9e9065d747314df9b69db5a9f7a7047a8fda52f025c860a1cc0c3766b6c2ced55083c5ffdba3e0b88d7c450b3d2631bc2a099e29fe7e856e82984084e86fcb70847ee69464a24659aba3f717584dbdf5db738c4312c090f3da2ef9dc7cd3eaf17a17913c9e916564a0160e6ae8c3d0e3aa17adc290cc569087da7d9f2bec45c36f3e0bc38b0716c7513483dc8dc0754b7ced0afde800f61cf0bffe03ed45d8a70ae57175cb38f4dca8c759b895c9d6cf9b8a0b844021c9198a42a379783347e13609c22f461b340412f916739735e04aeb6250df1896e267faf1d1efa6bdca4cc1a29ef04fdea56e1afad0d695215c8082aa69a731be4100b9af4b192dae4313781a66ce400c2b3951ee612b50e0557b996f984674f6e5bd62653da44e63b753bb8ba9609d16b02305b68adb41f7e6c2dce3134d4046806008c7c9bb05a03cd162c358baa7a1d178da680a09863d33856bc30b684ca8d2f15a01eca10a630ef9307fda7289332d5ae061521176c3a5dd727e9417654bc1605ccccc6e52b8ac2736662e0acbe4043f095c14d838bff683ae4c5751578e94457da431e4fd7c30e0e24acc06919fc3d93b50a84d3fed4c1407ae8029cffd605d55c1e7f9d96de84516e3d23adf3d79d1d36bd3694f28f374ebecf8a6b6d4d87a7f66e42bd2f60efcf4f775349d802e982b5bfd4c4564d181c537606b94a1a6f59183e56bcd6e1ece217174e1cfdb3d177659ea6082fe1415777ed54aecce113360fafaefc1ddd0005e5a1c50a399dc3d1a25535237a3834d998f9bdfca2aeff4af23f1cd3b27748d9e631a07f8aca6f530e8d9e3a977f6569651c46a2a75b78d9ae36398cb7d3d172ea23b0764978a8b07d1f483dd75070365de20821621704c0073f8021cd8dea08c1b985b008a0da1c2cf98fa9e198e3744428c4cf40e0e0243e03182128005a0c9f6eac8e7110e007b59ab81b83e4b26a8cb7e63ff8c695ed05ea3bc6a3d398534ef9cab986dbb878c0da7f2284083f2fa4a1662618996a856e2f0a056ff47323bca1fa5a316d9b4740e57420f651c8c2b9ffbc0431a7a13dfae2822550bdad1b717202fe06e202d5665f79dc6069c37614bd8d4a02e4f6dbe81088ad28a52fe7f9b22b3a58090f46bebe2409841803e9f3cad7fe16ef070509623521d055b20c33b506d30453c9bec9383fc411dafe9c1e8f3a9b58c88a6ee2e1a28ab0f8725a690c119296bd891b8f18d9166e2e655430acbd07a84d8c99e91bfe4c7ef54d35be11a07f959c92a01aab0a0c954ac311460ea41b72c1f74705c73954945c0b58e5259cbd8a6241bd79d47330e5ec4f92043700d0aa9290ad32959ee320c41e995c174774fc2a5b1dd44aec31502a6490f04d384adb32019b5c5835c9153f4515f529a2d6609b2485c9f0ca0d4caeaa8c6105923f82a32431ce7615f245daca24f54f734ed447d64f68ceb96a3864d4e5f98e0ac65734745e5782e620f896e1b0e488ca3fa7688aa21d8452d135cddc4d6e42d99b2e34f642f078c90c50afbd3982f1bb938fa778cc2e94b2d15718a91f4e92d28949ae0117ab9a0b7b4508a6aab9a18baf3c7041883ed208b15872a3ff2a0766df2a2a5535540b810589e7da3c316a861308b0bd5e17182cdce3bf1195905978ed3268fe94d2b02e78846b17439f5a1b1e35ef5a842b4699eeddfd8c5b7147b14d4f05d1f7d0662ab7c86366575e6721245d3281ac5df875284cbb50fa973b35238e21c00b129ea332bed49d1de8545be2b484e3c0b457e5800f86789c6c3b97235320cfc25d1f50d994a782fcf2368d3662b4a301f40bb5501565b943127dea31778a98618cf2ce4ebcaadd03cd05f8cc94d412d4aa7b915437b0a9c168a53a3220923ae3b107664e165baa9e4bcdde838a2df39674c1e769e4383d2df0fdc229d44116ac8cd20d54c1f21ec19869336570c3973e53cf5df5305af112081a682364a26491521063ea1ed0c7cc8cfea82afbb587aa5eb262d9afdff3c4591617e6eb3ccd70760a8bb3d3b8302b1c6fcc83b59e683f8e0b9b4d89d1d74628318a28c5c795819a8fcb5d918b39858f1e90524752a4e8df90503f6a4ab26def1e02042db4a498280c092e42c8be47802200fa193bc26c005ee0537720ac66f579aa509f8fb8e6d714c0bb13c2abf7ed7d1cd295fa1ec849e46c4c8c2f222e8a1038416bb428f1d4d113e577f9579288a53f16f56de07313f1c389a18d4670b91101f48f044159533fc1beeec4ba6b7a5a1a4f3a8313e8b678811486dcba62b3e5a7c825635d9cdb10320028b397708f083fb4503f5b044144b8913b66f5c979745c5e090ab943643860a22628bc9e780801cab7614e2260811eec1fa940571e9f2a43bafaff264507a9e837f1514a99fd07453cecfbe53e9e93a5f9ca57f53e19c3dd1ad5c27b2aaec5f32f1a5a02a3def897a25eaff0307e96fdcf94e27584a95c7bc3c276d26951d1e3d901550b173b46b62c68c8e6dc6d8237332cc6000cc5080c17c147873f9383edbc234816c10bf82b7c4fe09da4b5eaec1e7673b2268c634f80f45eb0129d055e81c321175b4875468d3f512dbdaa3745f4f89cafdadd16c403801638bbcca6ebfbef961e88a6c16e3ba2d8f3c0e4929b8742740e782003ff7148950e17057101ba42b23b5df430a955474dc636fb1a3934aad26b252306001ced50271cd7707f592136310eccad4c8de0db2d650099a56540f923e8c9585a397b67f3a556584eae9caea02fa46e124f31fe721c994bb5230f5b673607f53e67a2074a6f8b152d349520a27dd95f76a85b619dbead014953e4c04a07735d34f3a38674427e050ccd0e30fa82d950b601201d728afc72b4da76ae14d1ec25d759264e39da1461cd3d7f516a6530e2c9763f905d99fcc4a19d6ffb1dbe78ad5e72da15012fb3553348d6adfe992c9350a38592b96d942f994d9ae8b41a7a8ca083a830111104b147d9f867843b56feadf4164d1f03d5b24960179c4ce06efda17278e512bc5420d4850b863c4068c305b88cd7d5600de0c03ec437db37094e581dc1a1e70bf6a5d2dc50f5ddca451991efd183d2066923c0e7a5a45a8e173a0eec31ef9079d1d28eddc2ab87bf19a5f4fb671fd5b543580fbf786d3d8487275424783ddc86931f7854f350589770e840f6e39a575e9046d7216f202abc0daf64fbea7b524813468af1339bfe7891b4ce5fa13fe8a465b7c491474310610050dcfb6139d089912e31e188efc225b8a99243c77204ae947ff2218fa32a7bcd640eabac0f77f66bd4e061de38ed0a4eec46a0d187dff904bcbe8c16be2ede5979beb2f9a01bef7b191ab4a12eb60b39909fbdf3dbc32b800957bcdae58234bc264ee6a7b96834932dd67707cf5526e6feaa199d166ea306434f43306db5805d24d7fbcf240210051dbc78eaefa1fb71c11691d9a904dee71abd5ee06d117385f2b478cd05a1da4488364f95d6f92601aa9af512bca807b22110e4fb98bf16e96ac8047a72dc17a5992d92cfc4faefc700dffceb03f8e7a715305337e6c2745eb166fa13c56921888ff23385d93b6f4aecc7137913b1318b6ab6807cc8e88ed5a61c457df1615d043dc0eab236a18752776da0804b7385ae016e0797fab6739f69bf3c69a807f83b645bdd0b560b0bbcf3923bbe52e2160ae7fe37acfce286e6950a4ffa07ae3ea0c3886c741bca74009cd78152d14d04bef51b72a93af116e1f538810b984a20a0a9f76cabd06e232661ad04d7f801ab9423d69f50a439b4ed687cd05d6d01845ff10a74cf815d323573042f76cf713f60339983aad2e942f6262886855fc63ded31c91ea981c8028d805cd84a61ff14ca4120706fbdde3d076cfc4fce3b55a3bf49faf16874f66b9baca308286a1df0158d472633c8929add2a52c5c4afd41e5a1f73f49cbc70538d80cef957e8e775805489dff8059e0fe838a3a73ed60838794be4ff7b07c7bd515309932214e13b1958f55d26fbeea1d602ea7794e0c71a232248c88a3f1920afa86c90aeade22760309ed5aa330e96048e83c595b0eb482fd41f74bac698f1e809378580560090705f129989bb8fe81ed8c5634a9f78e6135533d066133d2ffffc3a623b223d723de9e8f8075ad85a9be81aaa30da8a60bac548efd66dd8980410476a1020c9444f7357034e65a2f65a21a13bd681dbae456a5e93fd60e1fd5d05033f20f70f6acaf448e3b07aa3c6f3401fa0ab6eb92837c958f1e79aff0182599f962df17d93a85a1a2b722b1ca6a157655f5a5cc7e40b7dc96c00637e3eaef6d932cb40c747505cc9b9b02b4e3098a7c68053366b0f7ab87423a1594a099fca9255cd95e456fcb03b06af4df06b7ab5cb8439eee111f7f9993cc90931d1039af9e3bfdcb943bbfc125ac4d24cdbcc03cbf3fb10c036733caab550fa13280136b7d3b688a3a972187c5ac80acf69b0edc600849e160d220eed917b99c42737c234975677be8bd5f4b8d4bbf8c4f4f0a8a6f7236c37b330bd8bd20ee93afdd0b98fed9425341b7beae423e3776d94c1ceae2908af60a6bf7a0c4eb47eb976aec3d98e7b6ca7d0d1b76b160ffa4fca42ce96742f06f6c5af04f856fecdd5ab7afee3d06f8e9756a54337a62ec02aa68b403dc10884e3b7c191a89951a4ba1fd01424993557062f7c70b7b51675828d644cdff79b822efc2185c2be6917d289368b04d9d300b6ba06e0e15fd715dc87a9d05736085e9a97ac8ca5e55b04cf74c35649a526617faee01c8dd27dbc497fc7196ddee25ab0b1fc8f3fbcccfe791d09ff4a9ebb89eb82144aaaf2b7d48a16ee44e31beb1b07537a8bbbc40556add6f5b4baa191ee62589f56699ab097f9a79b6c27c877f7b70414d312c423219933a6a42dc3ae7c0211f45e25ed955759754638f3f716364a5b27b2f51c519c40253569a69139aa731f96b729b15d7b509dbe6b0ee42badacb52bc7ae1571d1037359ded2839fa5628c514110b084b301dce26b4bb1733adb957773d6f1a7e544966988cd576127ab93660f1d87540568e8e64b5325e9073ea610aff19e1ae3c1eac6b0f3644aa14ce3a961e460ec48f517e2e7eb20bb9d8e043ba3dd00f7781ba4713c5a6cdb874ffabb05aa5b954fb1c5ca077007bd11486a7dd54a7a3bdf0e458b9f1fc015fc563099bbd40e050bc901d004d6cc02c8dcc5f6285a540e016e56b98fa23ff60eb51ec199b1d57a73b22e580f604b18190950b6ebdba170717a1e300de672d7f2da8dd542db4f627276695d6cd90bf303a0d584be93bb41620d095108b61c2ab4d49527b82d872bdaa5a038683850465e01ef05316f5c45f8498e03ea6bffd845e503ec952fd82515940bb0837861975a4c5f40a5f07bbb6e3bb92e6a3a0b0e27f40d268d0ca8d575245bcb12a29404ba60e86663fbd99b5c5accfacca02bb538080ee314b55c4cf2594a4b895983a6496caaada31ca2e37becd7c24351c2c403a704e1a68758a971f2111228c7f4f3ff1314584ccbbec3f1d0d8b4e7b402508ef30f3a3ad63b5f38efe80c23cc50db6fe09e596617309dedddc09aa7d0cf564a77ae18244fcf0a6ddf283beddb856291221108b057089c1c42cacf3a2bfd5078d81add5c3b4f47e5b44139e7081a15309f5f93c2b252f3ebd3eb9c23a0080d47d72db6cdc7292645b2786d64b2b86afeec30d31055cc4952754366d7730128d3232a0e8e3df29bb50e560835964a12fdfea65ccc4dfbbbb827a91e4a8cdca2bdc049af47592253d2982576f43e6059c5f6945a67db15ef923538d20ef106a1a363793e7e9658351b6abdb47a4d7bc149e1c2df2c8d3b3419eb6b06d1a027d09cc47f4c8887478d0440cf3cad46e083c24c087bf069c08f342d41906d58c16760522931db3ad6ca94ee9dab92ded1796bab1427219e455d3919c9d8f790f6f71c9e7b5f42ec4d1776d071fada167ea23fedcfaca0e3f772d3bd8af38b6d0d03c4903fbc9b1b8e29b5ad28694e3b2eec75cfe88f2c594261ecdab9ee9b5e47b080b9227c9ab572e46c241ad8ca310fd69101421204647784301cfc9ec13aafde221134625b0edbcecd986fed91fd0e1e163b400d21f06dc0faa055e0a1535a1e0efd98a982bc2dc8811b69613733e93aac8daa5109620c797ff794b5eb822e7ca2f01e6f2d6e86cbbea296b3dcf8e610844b5a80966f28bd87967725e66e9ea2e47c514bb9eafb5ea5f947d0595f98a78c7976abdc5025b7374803dca598420e7ab68bad74155f945849e96f0c9f866aec9365d20a079c9c2aab2c6f3236bab674e7e54a3a651fc27c7389a726306c523fd699fb1a59d67068b4f0a1d5b65b8bcd99ea4a976bbc2d06d501eb89c445614ee5fa84d66138115db0976a6a97d15f7c364c73b11abf0131cd09af62ea099cbaf50fda60b87c633f9f91c85a1816e285e2422513a5f9d5b22331bc82fb56eb22ebc9af1605c8206b28c260bc5a2c598051c7ead9bc5970ade41e716eef185228b273dd51df16b2b4c64ec823e66fe170e021bb79d0c6305a6ec418c6c31b9b8d299afe98784e6a0f15a933f34ba1e1124c61a615257cf52325dc695871bd1d71277e73e1d9b365c945c0d60ea1a20c450afc0ee8400b2e87abfa1c0f41a3510fb73769d9c1e1796a26cea174081a1698924c761da1e15949a6b27454be917e4867d2ce7f9c3733830617b484fb7d895a3e068c1196695c17e50cdd0c510ed9a6342a61282fb4b4280fb265005a48703a135037c5af89fc2d014b570b61f5b1a87a71f2f73cf75597546fa144bd566704b7542ee001a9386c9c013da8d67092ed61a5b06cb4a865b85fd9286202181a8dd2c643b7c5d758a615de8fec451583bb9058aff86d92920f5d59a998dfd34823383a0e9800cd92b3690573d4120885e5f588e7f743734b4e0d29f60ecbb5992198258b9d3772ef216067cf573d3178beed7a74aacb1f141bfe00186e1791d446082a0bfd8f940f1f0d4f33f2609477e2032e11bcec945244cc5ede4090a17768f7f8327bf45bdf016164f846ee05c17c3796bea5a2ff45d88fcd9592d4d4a8e645aeef70e4e22fcc21d90a2b1eb344aa613ced9f532fcda9bd4e0354834c6ddddfa56084b156248bad0ac2e012555c463742bc82ddbe2e08ec0b9984672b51eeb2e6ad20eea61824289086673422832b4b1cfc0d7722c2490f19d6d93aea01924aa141d1e148522e07aab975ec540049524be56a2ce241ad3446108e1b336becf4c169838ec30863d90e8e8ec76ed818c2212f01a0884ce5322679db35d85a7f75bfb423dded6d23ba2becc5b842e2fcaeff66bd8ac2506c36fa95c020e79d16d5b190d6a69c9545355b34b7fd8810728f3d24102922d9433a83c055df4e8a9aef1453b7112a96d2c3824bc594770c40383d76d28312e8bcc1131745913a31e5d476abeb6c28064c838313f859c34277aa9e093cf534725d6ed6b6db5b9020e51502b460b471f5b2122ce2c2bc980246036561a6a75900a8197ad0125d9a494e146a580b60f64f5e4818b023fb119a5d77dc5efdb7ff87117069c3fe11138ce7e2976dcaadeea8df0f3d370685dfbf2037c2ac323516502e61f72923c7a7d7f3be200eb62bbcd64a5e60eb8e7c187d8024d7e027c24730b3ef4a64eadb09c3f52e0d2fe17fef2f0d213a62055af037ebb2d2b4c2396990cc9f3e61ddf5a97bba6ccdc682c29ec17d481d49e39f9a1348f2b47e9b6cac885b3b2ed5b4b428962490612298f7001a60b3e8924bb8cc41fb3d7b3083c1e8cc670490d6ff955700cda360647c5175e1d2db9d979107a3388487fc37ff31a709f434792e3148bce6dc207c52809e590e061ba41ac6217f8f0ba9184ccbf7136b0b9cf04b6f2743ac4efad11306adf914c6575d1397b53f77c4e8c549ce492f3ae6530ba4e04bd20eb4326f6a01fd0c192db110a256db51d264ad9640f376dc69650c4b7811eef8f6b1b6b0b5712e4a51837cae771599d58a7bba0aac6a9aa9249f501faa1ecc7650586cd771f9756108a3bbec81d9e6ce2c1f03da360e735a300e3b4a0703750a22239ac4fa911476dab487af0e0b6691c73cd9e02458ec75e7055a30944d1fdd1457a9061a15cab000c86aa03b1a80399338a05928ebdaadf54f21f4daeb0d31ecd5dcb08869da4a42f6de7b4b29a59449a61907e1064707f177fce7875173da6fca27f35edbf46ff538788223c501cf9fee8a3d7acee9df4e91b86f6614f91377b99478958c8ca451cc5b3e04837174db382de3baa9695b76bb9384c160b0680483c16030180c0683c1603058348a303030180c068bc1603018110c0683c160b09899335ff8130f4253060683c16030180c56e4b5bce5239231137de4f7ed25df89464611c977a2d28a49a65e6e914a25f09c3153c21831b78587522ef79a1aafb22ea5359e656d1b47b78dd332ae9b9ab665b73bc92cd3ae3d59947d899d87fb8e475d700d8f007d43df86473f1ee984408009e4aca39f68e3d06f56cd345a2a0254dd6e17c4b30727b85f37cebd4ef84d529823cff283117c992413938d2f1e75a9e1ede89bed6bbc0d7f98daaef6f1887bfca13eee4fdf56816e70d3be70e6ed48be1f3fcbd77eb70b76079d4862c24c6a0b16348e3ffd3870126f3c727f99a47b50ceb6502e0024bcdc4023c3c2062e5b94b82229880a214c6784f9228631d0cc30460a1d4383b7316972a9124555507964a30a164e7839722599018829c0882186c885316480e56a09c036f4822c525046972698d0028a8ec10c76b86225091133a4913402ec82a0014821a6a851468585142cc8969e6001031130207d890196b0480a163154c0822fbe187344b6021b394589a62a7789314653cab0a43ee9b6173e29aa502970b0d24af693fa541aa4d48da62ac64b02c6249991a58a1746a0826bc3141c7e08b28204144e1cdba0b5a39d2a2ad23471ba01890c863445d82dd270c921ae45f8e61633c592ee0731697c48f10053365807bedeeab617eacc61cb90c3660a9247398c4a4425d412398c216e6549a24c50104ac2c860054a4ba8882282921841819430c6c00086284aac2f86a244e1c2a1290c56d8b1a1e83a428c2f4e20e9a0c58a195618b3dc0044165cb63c21040fac3086f12822c5589a24565a49c324fbff98f08aa59921fbc7571a2bd9ffb6700a9fc9219841e1a630556963808618331a172f361c062b9e550ee72b3133a0dbad74ca9c158f0fce864ba388bc857e871c9e9a165b67fea059ab54b07da985f3b50f28377650eed8f84dd73de487146573d38ffb2ab0fd40cc29cc0f6318330af4b58e3d3899c3995bd3be9b7df6a1905da0fcdddbd3856d3e2e07156cbff935e77f82f61dc9246fe4cf56cb558786865c43ae21d7906bc8d53d3c535c4e1cb95e4abc5c45595c4453fc4a963664e9724d4972a5ba43e54efde694cf956558895c6670286332d63d63441f6926f638e33aa15cca32d63283c3e9724d99e2a09c442e195c75cb7dd2f2767139b03d193c73d7d7deeb6b4f42b5afa986e08febdaf549d0beda6fe1defa5615ed93a0bdb5df8246826d21b3dfb3709ef55ec980267088b3c437bc4f06b72725614368a4d56a65165299a6a6077ec4c699ef4f3f6f9c39bfd9d19b0249af513629570012b3098d237fd20f9a70386180fd6555aa4aafaaf4aa4a4a54f07c4d25bef96a07630ec4df4c960e73505ea4a9345ff328caee699984caa7b40b12b333358e9c5ffa46fa5795aa52a522fa4ca34ac6752491cf1738fa781c7250aa8a5016fd96f368bef0cbdd46a95163e3818a64dfbdfd0ebf8defc81120568d1a201b3650df11d41fd91e6803aa9e09d9fb3b5b0422f6b07f84dfc46a1bc77e2873ffb559f7b05f4f9b8f11bef2c6febdd6dab8258b5b1ac7c88b5d80883e914bf7b06f85681cfb6eadb56f3f2ae1a01502873c72563ce250f7f460c2dbe7f18fad14138ec16cb5f67a219010cfb3b3bcf7de304699376bff6fb6af1272558d53047efbf6e32b1ec52df6a391448ac90f6de4fbfdb57bdce3b297d917ded0e1a0ac1fbbd838219883480f92659f5d903b71348efc156293cdfe5bf5d8b55659ebd44efea9c691ff44d873bc5e8d3d24f5b04de34c1f41e0d494456cbd23a41f34e19f453194dcc18fb79ce41c9a44b1bc85c3dc8c17dd8b712af560c833ed536f1ecd20279f2e706ce5904ec9924e9930b9335f7e23ff5e8c53a9396159fecb870af622bfe23a354b1f2e30fdda01b1612b594fd5398c197b2a7ffc2afbdc372bf354fed96719c6dce36f8155e3a9fc6b7cf7271b8ffa54b6e6374fe56fe3b3f1364fc2f6a8ed6db64fe52d6c6fe353f977ddfb16a322cf22956abc08f32293bc913fbde889e01eca6bf91d96379e82000993957d479064dffd823d8be748819b03aa9ebde0b6a79f416326f688612452421107a3b32470048eb1ec5470cc0f2061b2eef58771c1d28cdcc241ff9c2d64cc9b408ae12497401aca386e6b80eb441d7f32700f4591524a29bdf46b943fa7742b5bf73b5177bf1b75bf1f75f73bcc63dd43ddfd328b51b7925c92b07ec9d44344598cfae7ab7f1e7577ff8c757713157577f7d3a356eaa7b07eca344494c5a8bf1ec99dcbeafeaad4dddddd6f89b274f7dba3eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeefecec864b4da696f0a3cd9c6c1219c4c3959cee305f49b6893cae1f15123b798346058cab8d09083880d8428c3460e292d663097a6a636014263fca0f309a12912fb6f3125db172831c7d57dcd09e20721288c3ce79c738681431d3272d973689377f0c8ee4a82c8fe38287b52100992849424116385c3272579cd4b2400a433f2fc39ff4691e7e3241762797e171dff449e3f5d0727cf5b0254d4496ab990fd75ad58f950fc1c7dbadc8b533e94a3e4b13efdab1f10563c5f624ee455a20d7e339fe815638a19213a138bc5bc4af7d4eaa134a5a125174ac66a75291f9011739de12e27b231d648b1f8e4d2d793ece8e56054625322bb9e4a48967dd9561489b25c0f679ecd0b2329bd8e62b1582c4684098db70090044714ea6bf1f58abd62afd8eb7526a52315f3a018139a1af31653f4c9d0c47832986beac1574c75b34814331289885e44af48f48a44b1d5992cd6f2a118532c07148cfad3fbc734a6d8993462f5cccd2276021cc61893dc89482e25bb993723538c21208b180092e0b03e7ddb0da94fbfad035285d4e73e435d4dfbadeb6a473ff350a85986f163a19a7aa241fcef9fa069b57adb6b5ee74bbd1452998b592baa2f8f2faee8e5e08c4c5f8c3938115006d393cc3ef321fa286fc56a7ccde3b7f15ab4a03ed4dbf88ea04edfe779fab05f353e157dfc40ac9a4f455bde14391d3949faa984cc9cfdccf13b538f250346f2964bf127de923f639aef685d192d57b9fb5bb4f1de7bef8df2defbf77ebdf7defff1b8e5de97392bd7d9fe3e0fd7c9fe7eeca17be8df8f43291df2c555f2bd3732e1a9b7de7aebb5d75e7bedb6b9bdf7defb4d944dd9fd68aff3a6697fb5ab5d6dd3ac66ade6b9bcda4bedded7fd78743f6eb91f8dba186d61023bd2195bac7b3a40ffbecc5e7ef2c775e8cb2ce74b23b33efde982449d5affc789348eec1e31ba87fe86f2288b7aa8b824b51562538e5bf5807484a40f1a665ec36124c6a24f0e17a49459525bde086cebc3051cae16905543b2a79f3dfdee3cb3143978c50b0e6351f7f3e315dfc1c19a4f5f2584fe7daa1272738723ff786cf94e9be185e889313f3cd10516acf94696b2ec9f4a21c96fdd2124f9218fdfc88f3d2c9551a01c733cc11105fa9d0f0c30d294458d335ffb7ec76b52dbf2f562d57ecb38942759d43be5019cc14b33f3e90287b1a8355f95cdbf17e354aadf48e3cc88c493a7f58948d806092fc190947ea447b38e2af89ac9dc77aaa8d438f36dbeb97a2aa01c93d0605a91941cac1e50ce3c9973e80c81e90423cb2e1a43e2d74f25a48633d707ca99e779dbb81c4f70e801a0dcbd11073b07d021f4ebb77540a89011baaf5f6cd53cb78f9d03bad367decc9bece8fff8b6753784a240bfc69c65dfdaa71aa2fdfd205af68574e33ef3b80fe29ffdd6791a05f2237f9c7adb7761535353ae1e0b92fb62cb33e2e0a4722716796c153938a31252511977e3328fcbd7eb4cbbd98d10bf1ba10b58ceee773724fb544372f68532842e987e7ff16228ff789548d7e30185fa5a5a6e5565df2974193570d1caf4b509aa8464fadd8f1f9522124895aa67bffb41a423188d23df7a610736b472fd22192407a9fc89f465642c9ec9618cc598112a32c82d8cb020e7cb6dc86187d302e5693fa21970ccd489ec349a477cb38b83fe3952e0facd2ed9ff86f7841c762acb9f5e08345f25402aa19e61bf02fd659f99107d68f63a9b80810cb80e51f7684f3fda70c57538fcf48dc89dd3530d9ef2c42af4e9873cddc393698b526a85e3e1b898398de329f2ea31f2c6a5546f84fa2174c15af578a8a9f94e9037b40479435f8428d8c6d7780dfec66b2962f335aa07d4bc065fa4e635a8f98ad4fc8def48cd07ca1bfa36df45e1ff54b5c6035035df112db57e45f0d76c1815232c842e58fb54952503be9fbb628ff8f6d380ae673d64f43fd06f6816aff54103cfbf8ffa90c756554264068032cdb47a9dc1ee59459f99e97b107deed3cfa1ef837e03baa77bfa20b8cef6f445709dece913719dd3d32fe23bf47fb4cf8ed843524a1fe58571c9f3bc259db64d92d9923aa5bbb423962315438980d13ded8d607ffe66adf6dd0d89d97ea1f6dc6b43b6ef3a6bb010bae0ecb9df361e30fe5a5aac6a7b95fdce99a77913a708bcfa40048481ef17cdc41ef4ad67c2d20ebab965da5abeccfe7ec84376dd5f4bfd719baaaec37e36fef7bb9bc0fd5a5a6afd544372fdc2a7dffb195b7f088166b580e4befd90876b3f245ae26b41218514e217df9f7e1b909f09ee853004f60f3f84213065c980dd12c1add68fbc9937f3458882b7d7a2a5e5cd57c4fe36eb17ae72b3eccff9a968f600fbf78b58fa473efa15a93f3e3f147ac95d5ab1cd39e7bcf6da1d7baf753cfdab71ce39a79473529f75da285d449a447ee44d7f0761cc3f5d072affbc95b51ce577906302321199e36f118d7fa60212b319b93f66cf48e3f4cfef2965990806144b1129928966363aa57bf005ebcc69644e000c8163ec39e7cf9c521aa79f014ce0e801181cdf832f38541211c1c1222ea47bf86f416648e3b8fc4000e1e81edda30bc2d1d1516fd13a51440615bdc411497cc1a4082c4c88c40451022523965c6982e20c95d399117070c524038d7b46498d7e017765cb17a41ca800d343bbc088305c78085346931690e1c55d828c30b8b92445776c5dc33a36e4aae245caff7f4c28d32ac2b993aa4891b3dc4955c2a490b8a3546a721cb6497d816263b0582cc624535c52952e502a67c3619b318cc6788d7194a2e224a50a968d04b823ead0c03587dc11beb993aab8322d836d0eb91d3698e3381b1d4c1c1af7de21284a4c2e206596602e206030397a0114335b5cb004480c8ac2bc00c40cec6f874477c50e31e470753a03a3728bd9218995810e619cbc602db7181db868a2c3145ae82026cd11ea074c738bd121092c68e6191b9dff71eb6aabd0d6aef3390c418ef1025b778faddd54565aa994eeeeeeeeb1dd5bba26c5ca49279db7df7ad56bec52fe3ffd6f1cffcdfe77cf3be83777f7e31b27feeb76d9da75c22f68320b1e806db3f50540a7f4eeeeeeeebe64ae95d4bd1b4bffd892bacb69c4b55dbd0667762d077952a0333baf990ec8c0fd5cee24223468aa26559392a26b72eaa146181b61700e83189ba915b7c46dd391b7cc236f3979dba86091b79fdbdf1984c8dbe39450de687841de1edc7e45256fcfe33a9d44d445eb48245a59a3d9cf2c9b9246cea61891b3bfdd8f8cb27ae72259fb788a241988521aab66522a85884cb748d5583a8ac2c16babe1df887b751081c39bb92c0a9927925c3d648f6149767f8c997882bbf872f8664713305c116508062a17cf23b68e91739df8a984c8e8ef23074c595d460b29563086e8253dcf646cd2533adcfb534da0f666f67f10a7e4e72307acb12200c6044e80e082b3d4cbf707fdb17fcab582cdfe67f93922fd83363aa6e0ed6dfe11c2fe3636dd5383bae74ec861fda617daa72c2e88fd2cf35248a9ee7b2a5a77a454b7c70c187c2ff0af781e9c475b3f4f37189aeb77f7169770fd885042065ca7939c2079129414e49043820244eea5a4274cd993a05cc9fed9630c12a2dff246a8fe4f773c0ebef0e1bff5e1a0fd7e78724cc13c5b2895cd5ffee62b22124c96f4959678564beac70f7b64f93dbaa78ea012d23f9168e5fec0bafa0161c5137fe483207f259f27256fe453cf710e19e028e598cd578899872125b189a5a53fd56ab55add101fdf17b6901dcb08819c86117dd3b9fb66c280fb95baa85eec15ce878c064dca9684932372b8ea016fb9939c70b162308edc494e883431706de254029c156186154cd78b9328659cb8c04941c64d8251b9939a6ca191814fb9939a8ce1488037c89dd444055a13f846eea4263e6c5170963ba9890e1725868b43e2758231d9aee8ae60a21dc99bfe71ef936c69cbd6e48226d70a97d614e605204b4d4938b122d6e4050a902b8c80506aca1204e4054c4d454340aa689aa10910325b9a9e34016285910657761003e3c82d068b163d608962082c5f68195850a02dd9a104302c24c84e8035c82d068bcb0a2c4db27cd1496e6e54abbe333d87c706d8d6be6163539f4ae98837727ccfe1b181cda986bafda752a914c6a7d50a04ff31ee243737aad5ccde54ea1f0457abaad1cd951cc927f7d1cb474702786c4df7c3561f3e742821f9f070ffab95ec7cb50241147703d0967af4915fa9ed5a6dba1fb6daa8d5524bdb0310bf868c87a3e6d6601c5ebc8d636d56272771cdde75da7957d7f35ce7e79873da74aed6bbb166af94fa1881a983ab30386f5ee36de49c934a29e594737aa4148c4e8ecfb3da5aca39e79c724ae971ce1c1540010514504001858d44f9a4d5ab539f7eeab84d6a32bbd2d6a60c6082c7a7948e316a4eff54969183273ed23df6909d6389255a5383ab6163b361a3a16c6e6447474da6937e7cfccc89654abe04895c7973f4f3ea23950eff51f225551ad1e5a4d5de4cdbb8ee8442459f13adf3714d476b6a70b7868dcd868d66732343ddb8f7ca0deabd130787a3fb411f471724e6f93966c8b3a2bf41eebfd13ed386014f3898adfced57a3e21c58a5d2e1353a00802ff62bebcfe88303e0d1673ebef75ee7a0498de7f0dee823710d3eddbfddb3419aadcabca168bf679a69ccaa0924c6ecf9b78a31d2b06d1eb0405eebe31e638f4aa774777777af7572f004872c0c02788de3707f2a51940328f40630fbbc98b47a0004388fcc7ae791691d89df9a516d6e721e991cc79d84901c3051824f69b6de1125b5186c106cd08320707c692f1501bd36cfe813bb876c416655a3dbe4a4e6799e73e6ade3baee87f65d1724ce150fd7d17e3ad85a067e06dd87013e100cc110ec9d99e7073a8aebcf269216b32f3e66f898216366605bd8569a7269cef7187bbc808629df149ed38384b0983ff840a2664c97d4c44add9a5c77777711a400ca0b430441c60a90605f58d1831098325678c10a636c076b91b7df7eeb7e6cddc7f918c2f1b7f7000b8c63cc6858114d668560deb6edcb9628797b114c903bfddafe04b9f3dbabe03a336fbfe2b9adedb10b600cd1448bb56dac2d3369dfa14dd65e1093356dc887ac317121956702ee0b4c929674c11dd8d0caf669f7233794a4f1c58b0f3efca0c11133c04910f1c30f5bb62843e3d00f25fd18ba07fd7e9ff4145d714af774761dfb4a2961a47c449f6680d2cf9ec4a024e91989adefb6cf9e05fa978b560e2f17adcc15a980fd54f75b85fb81998e7e9a6793791853da501cb143932a4c80254b162c202e626071c28b184af0c40e2cfad1453f1245171238ccf16ec621079f04b500d39cbea17f2fa63999da49e4cac9f4a717a73021a2365a39846586faee48f88f2e1989e487d1f54060cd25b38b1382fb13eab9c7df3951c284c32826a72e6c58be91e9736558390201310d9a6840bf55b2fbfe4b4425bfc6d7bc4a7e0f70d6e9f1a39ecb3060f94d34e7778283f473bee0f6b0e7ea9ef9f4636830454d6f6d1cfa3cf4e98a3e0f9d4ef00929a8e03af1e977de09dc7c82e70fe08c06fe84ee5140a69f42f778a65706328d4cbf3095a3505e9a668050809316000144163edcc8612cea9e1b4cbcf8e0036c73975ce8639503f2f81d291dd84616f98dfc5ee5803c7e870e1e1b971a64f9f14af7cceef1971f99e81d1564c4d23ba9a628ae163c44471494d0381280356529a59c5170131fd2c70fdd223f1ac98f45f26316f9def9ffe41081c35824efc55266294a5d6192e50a75a75e02feee48b8657078ab379fe0f8612cbaff03d672884728924ce03062b1a142ed0b6f77dfd9b80ef79ded77a74e9f92d38956ee5b21fb703bfd7d7a3abd1010ebf409e1efbe6f85eceb7450856cbfe601f518f53139755dd7755dd775a7d3e9743a9d4e8fe4d4755dd7755d477f76a7d3e9743a9dbaaeeba8e6b54c8c915a0760778ff187749734ce68e395dd0ff9dc8f23d9c6415fc0110e71fef8f958f174ca07181c3d52ba43c7ec298123b07d95cc7e7a61cc31b3d98a8bf4558f69a5f4db2817638c600a3cf28de13837d002ef70d0a3bb0eefa6d8b0dc995fa842f68f9ef633ab94524a29a5da977ddb17aa80c272a7524a29a5945a6badb5d6d24fa8fb263472859ac9062c2124d45a6be79cbf8487355fe888fc94bce9afb5d65a6b9d9fd0fc5a6ba594fe121e16fd84687f107f1e6904740721500ee3bbffd7dd41644daf599e91b45296348492b670411a2dac235afcb1bce9078a48ae6b556cf325f5c2ec0791233964616614b4efad39e7fe08108bbb0ed20f051666d6be15ee87fd1f90998710706fb94f09508ba5e4089226155c11461968a4d1c4e25e0888c57d42dd6fdfb7c27d6abd50855c3feaf1c07de72189ad57916b2828890b2c25ddc41ac2c1e23e26dc0b211102626dcff1b0b847c26ddb965a817c2c778490e0a8808b1e9008238a1d9458db07010d0505050df1b0b81f0259dc070d5d16f7d488a34133b458dc8704880729929cf183151f5c68012be8269125cd155650d092cb5282626ab5522c25164dd01290a544a669b1b617da910315510c697912831896161b4fb258c192952f5d28c1925782c204ede0041a2d90589286148881218b22a660c292df5fad6843493980d9bcc0a7227ec8c18721b0963b298722ad8c1c88aec0457270dd6b6b6042a88c17115298946a28a2a18c560d444365c06a187231b9b431560a6c43664c980c891d90e882d8a14b97446bda81042498a2b4d1193fc838fe17e703ec6383faf1d8211f5cf1585b2b9d1dca4651279d33833b78ac7240ba83474e8eef397a31c7eea136fef74e0723ad150c59a4caf24d9461dba8f3c83c3c48c2a97f759ff4738fb2ab7626ba9cd5527be7cd244f8ed5f672e7e7a7239d59d53c478dd70f2aff1480cbd79f7a6db594ce39b52d6edc8f83fdf3d338fe4bdd171124403e4006ba9f8a3b65a0ccc4b649ea53823ce6949ea5bbbbbbbb7b944cdefdc5796f5db6cd031dec50c523bb35872a2e8302d753c76db8866edaa66ddbc6d53ae9a435d67a1307f5ec94435a91d7e09cedd64e10c421ab3538ffd401af3638b50fd0c699b54e3ae98d3abb14449793567b336de3ba130ad753c73daea137dbb2bb6d9c7624eb84cc9af9267c0dadc68c4e57feee403cefc832e7957176acb1c60b385e4a4190d1fbddcc763f68bd514f67c058be2d7180814d05fafd26bedfe024fb0d6d76dc4004e6862b32bd818b4c71282253d083b9c3776c6cf892a5fc783b1802251838c6f28ffff8472ab97962b0d16145872ca5b4724596360c917974a8214c9662ee18281c6518dbfc4d520b34c2fdc29851f8ed0b815a993e0b56f536a5a2df3d801858877f3947b83fb47121daecc8f245f84a5ffbfab375b2a7defda0d50321470b1cde2bbfb0abf0a14ae2913ba0dc344dfb1fd791210b36670f66de8a0b2c793c9a1c4ecfda679e9629a594ded7bcd8ca7e6406daec41aedfca41f954eef0f080e08ae700626022201c7915681c3b8327c26e6bb49f3be137f3eb9794e73b1997d18fe944f744474a721dce4717ecd173b4c0a167c99e05ca162a7e439eef418de33305c738449ebd6344deb84efcf845237227bae4cd7c997227a6eb031af0e4f2fc4fa53c72558acb792bd042f7d4071d74d077c025baf66980057ae7722183eb032b71b403020849688359068229821c9d26a8e4ecd84445cad0d4000000008315000020100a87c3018140209446d3aa3e14000d718c42785e361808a32047611003318618030c000400000021c8206445370038cedca38aadd0fdf7d1fb804c5438ea82341b231000d17d7441340a1d119fb98fca621435e2feb16fa3b11907643f921b57717d22c6127b9625f0f09e5eee0170fcfe7789766f53bea69cb1d399da04e621834296c15ab750ea1ab8ecd8341a2cded7b635d3a526d85fdcc330b258e51bfa7d5d0831e00a7ee1282ef90e1f41932ffbd2bceaeb60fb22181effae6cce677a0d2914ff90211bc06a07d83ab134ad1ef249908e461e3796460812d8297d62314a08f9149502e738ed28187b4a3b9b16bf45f4d965904dc87bfd2239ebfa7f8b4b46d1d013859db7ca12f13ab39542cc9e9745252a93e559196b5a162392ff149a03a35b91438d1329caf8332aa8453b73871ed8d6a4236f125b12d64444397be4636956e8e71e8777b68e1a85fbf341152f9e8c477ee6d3fb775c3526a6f66ced54ce2e6e957ef9283a0d5f8a880d689946c561c7f8293b103b2253ecaea3a3985c3930d655a84dfbfc9fe162b77b4f62b7d96f84b68189f74ad659b242dcc5ee4ac0ac01c2ab95cb958e67408c5e78110fee097bb4873318ac56f621c9508b49340ad1d5b9e1bd8e893d0922d2a64b388753cc5434724c9056996197115a17b9719955c530e6851882eb25597215fe529b45d77c1472c35f0c92e238e8b3be23e411f37ed9b16081dbcfba6131cb0966d619cea3198a41bd8f8853e0fa47e2a770fe94707d92d1378ea88396209ecff732348131a5a4267e18eccc41a06de78d646922ee4b93175d8aab7a3975cd87055ff88632d9fa7b0f854e7da68ba34914be2a6f0654f5c5d7718d3a032ff11915cdd2601b2a6696676dc06c6a20d85da2887edad17dabf4d35b7d6f7d9d2d6b39df943d2c09e4a57284dc7ef7c112c03d546daae98f1cce5165677ad8b9d034b1fbfea561cf463ed92ee3f290efc81f21c05838bf2a729e1954ccece93850728ea2976ed01310fc0ad17ba317d4ef848d694ffd1a4fd39d2b983a473ff536d143f4457e26b1b195eac0516450637e305a87218160f03837f024f7b24da1a61a4378bbef74c4442177517e2aa9078d0e9f6f1962a48f3bea5f42581bc904483f4e907c10f223b573fdbf221e07f5ec3cddcadebd447ff7df3c8f79c442e4d604a26badfa41525c17a05e71b8628e2295095ff06c1d455108a7b788b2b98c40d76dfe9c31849b15d5d52db2cf4446abeeb1f093e212cf61ca5b3fc88ab629a5081b868b619450eb02e20b1ff4ad29161121207978bcce86aabd5e9493b6b125ed14ee1712421d846ff11859f6eeed56b95d95b1f7511e7dd696238a6d3a64fe25eaa11aeaabaae98961a944c6c9fe914bd738b86c73b11cf3c8ae03e107b87bb3df1c7bb60fdffdc65ceb7d546b27b9ca2d76f4514af20c77ea003d7724aed69b06f46f3018e13418526266a8515268c05790cb201cc54d2920a8796ada92b9117d58129bfba0299066de27d56584e77ede28dd5286383bac30f101df6977b63d97d809699fa01060899d473bc45876027848c00738196679c3da20c863448140e14e9eaa100d8c85453c0bc8600d7b10f0b9a878c81ddeb7667187d0256eb8a1410db65cbc8454a0265ed109f70fa0e7e84bb2d1235fc90e141520c21632a19b84b2f270581821667df7e4d5d74e5c31f75c5fa8f6089d86732816dd906559faaed4edeb060ef01df23ad99b958b9055760e1bdfd983a5372c5677e98e16f63adf6831a812eb3d6f1aceeab7dfc024716a9cba4198e930a1664fa4de5f4b7a3cf7227dc20f64d6b67d147f914fb39a9f66c5b7e89b458b58e42b538f5b13b839df52e101e7d58323f06be245c34beba8d91af857617d1f41676a56f7ce8cd6657e27fc0f83a73931bce237fe8b61cbcff9537f888e8694522745e641d334bd400b88a9a9fa500c20a25094fa76f21b500b153ce5141b97e49cb8ab368e294c5e8a1eb4f58b661f8dfde62934d250b734b6dc0d5adac396f5373908909fc955b9620b418bc39c60119dd6c4d427c477ebce49027e83f1abf9414aa54c1f628473aa300d2d8d8accc124ee57774b40c622303a16bf85229dbba65989f909ce9041627e7db315ac8210c18a5ce444d74881d1f485841b7d01d537ef1f503f463ec4d7ed9e2ae50f011e1e07be9cad3240f86155dfef00546762c3ab1805e8a64b644aaaa44b1546012c8d6db892ea6d2cca89253c5f6b12ad04ebc740e9a804976ab2d973b874b5f744754950d5ef7865d478f7ef4b7413361a407b03a3c771221583874e025d769662a5582d67ebf44f5f2c1da0cabff898cecfb4f5fb299d8cf914a7bd27f80a160a862a6cc16267784221e955e263155a1a6ef82180f5e48e7311bf92760c041b1d63de2c0480c5a224676f4c2773623612d4bfb537b0f4678b2ed44322a3d16ae072e0e19a54d6b812ab40682c36350a89e2a7c16f1d946235a176f2cc12cc83cd3c6cef99b327cc2b7bd30ce328dafd154f827f46d438ddfdc0481e507d3c70dd8044d4a7430a0a839660d5268af3870d516fce2a84b233f3b24f84a92bebb104530fb5a1925100231dd12f3a43aa8904c8b4f4e7035642f6f6c70cad9b008159ff759d544a2e188525e5dd98084f41c5bb429adf765f4004ff9a515e5526bd04980cc74b8f8fa39eebcb9bacd7d30c9eb4e6857dbe958b55f4917b7027eae674c65c4ed87261ef370b10bb8b596bdba750b5c4216d0ab0304a5d5bc5de113c5c1d6e6fe2dc01e723bb124458f4e7915442070d0466097694c5dc18008799b104032fb94751bf148d6b1e6a206020dba7e4c91f24c749b8bafc221d974ea4520bfdfa4f536794ffb258d9ffdc8dfcffa01088f514b3b44e89b3a3178120ce49534f1104d7b3c6de28519669e08e3c0a82a8cfd428201b7873948271b77c7e3cab11cb6b2fbf5f49a6aeb31d86384abec3f03bf01552ee133b69cd747f7d3e59e22a3d3f477085bc9f2e72d50351a4830eb1f36f92b300c00dfaea747e0f66324993d5dcab203bdf2bfc320154776843187ff014b8b12e0161de2dd304fda83bfc4e0267a13b1ac87f8cf71c3890a69b7e977ba473531c21f304072f4eab677cd63b7fba72929624cc3144e5b512d9c9aaee3d5b35df80a4d392e252e9e09df7018ac3e5fc7a8fd7b449712e592ce50e922eae90a69019bb3ee2ad85176593ccda502af2e12cf3e34f11dede2484eab4aa29e4c30d38fa3ae90e97247fc25b474d30e81af54d9cd36b4aac7f21cac0bcccba0db256ba7b22aa92f86db6ba0231b244a8677223e89c4659e95fbd8b6018f5fc7f4cf9d7fa5e796e16471e49a47b8683d3b05e49095389520f992da4d77ce3e434734609bf2319c688765f0206d37a25370f72ec15ccec96462d603f5d31424420abe9bacb35bb87acd4137322d53620c3a1758395846c159d2c70c87542c2514c5df33681f219d121e2a30d4505f9aa0c4efc219be4f9494e88286da114ea2264b7a10ddadd12c9b6576506b55f79191557ef6a5658b3aebfa42cd0db1570f0448a65138fd0f1780b30666e402e8b1926137e1d3136815734529457cce4d6e2a3084d2be429c3ad1fa39227a3b03da59d5252b4badd12c9a797958fd5a81efce59f94aafd09a47f27fdb0bebe45b14f19e92359870d4fe80c071bc736a1f7adcbabe2ea112035ce199a25f8191a3b409f9596817eb0f5f5b0ebffb9dd06f9dbe5ce259e3e1cab1474e864bd6739f3f9a8dd65508ec557d3e7446bd3933ec6dbf848de12b21f87a367115f87cde3c17ec6bfef4ea71da299e9a1d2441698485f9c241add886b62648443a592b1f99537873489284b64144ddac2331ace2c2efcf103686e46dab0f23760c6e36073a26aae2f283436c25571f299fa9db7e495d6519dd79688beb01e4362d54fcf4e43e1616ed5d400e63aa0fa84a643d95c977fbe665eebc65ad362434cd3a86b6c8edbcac4e1502fea9184459c6df589173d8903167bfd8dac9734fd331d4b0140519a5b68249d3bcb224e50c0887313286ae804961e411f60aa0a71c4bd7b3b968c14a0e710304697c34d1078c6580b51e3c8aa3f9f94f731b947014360207b8f2f2e086f4a574c8fe5da11505523325b38c292e07ea20c87b4d1c792fa1cbbd14b2829a089f281f514bd1c0c915a1f26451735a6c088158dfd3746ba2cfe172eeae70f721bdd0524a11b8482f9f3160ddeacc65ba51268015e4cb47bd9547fa516585f33172263eb6a76884949e0441087dde1b89a033fe090829d583615bcc9d6532a9ae2d1e50c0bda9a38ac5612b48f59b61d956d3c629ed9eaf2c5eab00dd4a73e2c674af4848ca5d2b8e9ee2c84c7f4b710cb9808fed5389c10347feac332c4bd56f842dc204e25eb548b7983ad1159feb559b5aaae025eda544395c6479dd978a8a7eb72b1b3df7b10a01ed0e2a2bc0665d0472f8d4fea32ba52704eb3f0c167a1ae89b56a3ddcbcf693dd9b19017984943c171402b5b9c31efb1229fba646906d46907108987d4d26947a1a8cb50bb7ae13074c9673a5bf0244a317c612adb85cee81f115e471c508537071aac120524812051f641aa409d9fce3c341dfbd6ddc38dc642ffbe1934ea60d6a8faf1851a6c639371190c2e260235b052dab77f509276c0eeab05afb31181c7279e2498237127dc11860075bd760d1fbc96ec8781247bfc3fa665d580378560f92dd53abbb59843327a8ccd4813212381fa6a93ed55b213308795b76a4c8bf0d857635fd3a946742434c63bec395667805fb3ba6afa94b50e1a5222ac96d4830a059552ec597623da1c120b54e0cc1075ccd44cee46ce59f4d71dae96cd7385aae3ea8973876bbbeb7748942fb6d857b8d0d405f6b90221f8c7c3e2fd214d356946a203a7bfda0c58bb14eca7fbabf59d0ac72d7fd1187d0cef818ab17bc1461762d67ee9d46c15d2f600b62214ba52778ac70329b3de93569f39cda41ef7f110968a70813d8e4f0b6ae71a3c2c06d9c127bf90e13d5259db0ad67c17e3dd16012c00a2f594148e84107935a025b32837a74cb3b7208170f7b585068bb7f638097b57519002e134e2e19fca0e3a02336f2ecab8546152d874d10941acba8a6f3686638f0deeb1ea5411e9e07adabf9ed1daaaae322e99d8d873bef2ae749ffdd99fca290b8c849a2333a9f9ce2f8819bde4674e991412f620d665a962ac121fb55d18b3a45d79205fb5a4144c9cc48769d45cac04bfc5cd916e097d74c5d636fb9074915ae38f3dc97184bea653726910a470ea49ee6fa196aac42c8bd582f3b736c436b271bceca30918ef5fac324985f5f158f54d32da5da70e0c0c89f845a88205b02f5064c9b36103575469bf23782f7adf5f0e97bd258e873b92219a134e299f802e042274b2d1309f11b4c9adcc9ac3c9f8c7385e6fc18546dd6590d8112cbd8d2b3d9cf04ae05b1daefedbea51f5c81c158ab0530bb2def01e53666c0379ec8dd9a670d648dedfcbfdb4ba6b11ba558836d25630c53e2ea0790076b9e9ca8b1ef4311eebb06ec7a15e9a7358b3e9e2a1b2d3d21aed22a4956d2c2bfac2ef7c1083e5b86151ef828b8a69c4bc9d18e005b52bc75308ac7321869f88de5cf3cd6538c6afdb26464ec72510ec35465dc53f08f08cdeb88904085177f8483e923781e583ccba2e964e283f2c9c9a347e661311b55e3ac1f43789125d429e2439660ddf965c278ff0692282272214d4334c51a8b6842ac66e999c41b924aa01de3a52245e6fe2cd08b353ad10ecbae0be62778fd683e72f0a57a0a2c15abf15152af5a4d0f1928a0f19f56d97cb040cd12faecfcef77afb0131f659854d7e1d11d45aec35016cfe63676be1861fdada7b3e06cfc5e445465668db7e6ea04b9f3d416e2b32a67efeef43235c60cef7a1d637e75d69e272941b9e7fa9e8d5cd7913affda7559d730545a3affba12bee1b4fd41a183a9e3a436c7206f09ae054d1fa6fda377436b05a84cef070dbecdcd24ab29ee82839a0f5a6d828023e442c89d9d0f83e5262bc59635cfb1b69a4c5dfef1e4c01704b954059a7bf28f5177e5002adca928c8eb11378f84256f9d2e0c448ff8ef8b620486c519364699a6782854d1fde38601bd8238a7579a4ab48f76e130e21ae116b5b4ebc92a3c1820f7621f77debca28535b8b1ae4859a5e720880da0a5fecbce76c34d1f5c5d162d25c2869e9fdd4c7757fa575df49d094fed2129ed165945e09755707d7cc831c56d2db634c2c217a8372c30f26104a67060ff53dd6a67509b15acf7554f4c78a795ea32106954056be37d8d921d4da01951d1fb83c048f2b23418988f9c340a854b2f8a1a074544e28d3802ba49df810d3bf869c687ac8b2f3acad46ee9218cbacef65b7ef79ddd506ad4c58fd64f80a1ec53dffa2d26859007eb00e2bd97d68451a148211a5e034f0ca0962823540d460ab6d8672d3bd995c0a003b95810cb2969e5fb53cdf442ded68fefedb332c33671f103da0a9e0289513c6b14f23c8347418eb53c924a36e56849e8cca43a4a66b0c3817c770d3998d7f960cc9b7674826d48589b1e24d90b39d6b0411269227b9e260e0576a729bec63106570ee1e8dc091bbd55f4db503cc054b8afdbdeb5f5a67bb9b09cf5abe5a8bd99125280de92eed7c0c158ce5763ef55e91a5298de320cb118858a71f28e3a35fef8ea4a5fe59581fddd2fe8ca7fc9de4da62381b0223328e6312101aa0821a5c2da32c104a22d0e52e5b0d8827489816d11ccd9eeeb71db5feeb2c3efe8ccdae0a39fa714624c48ac81b893444b7890518e2cc6f2ba449000739d0149b1fee33d1ce58847493989e2866d619a408ffe4b6677ae4d5ac392d0a8edc684e49b1ce628f283105208dc0bacc94688238870450a711813ba57f1f75543569b20f7a14dfd22277340c12564e96f095df110ec851a9d3b61f2a03b78e3f7e33143713236569cbfbd992141361dbf2b61566303420667085059356e84430072f450a2005d940c6dd1dd6eb91afba5bd1f866198344f875fc3a5b246b23cac5246cc3f23e9b0aaf016d487d205bb37b39f94b255646df780aa4352b707b00a5b311be48afb19abb028215d01481325a48d8cdc05e5d74bd5f33dad3f2ca7a0292e74dadb2b6567f898da0fa584ccda7a2c376584831e7a86d5a32d4eb9820ae370497edb5ac7727f7d3f4de41abab70ea325b26ed867177d3448fedb5a97e57a7d3fc173f7f28022a4ac54359818c7f5a04243988d39662a8be8cedd8cdad07b1a2066994a6168924b1ba056c32aee82663220e244237f53fa30053693d9dfe83030ebf92a7f8d3fb3a38480ad0868ccced4038ed96e1efa70d466596ba71b0860b6def3b8f57e488cbf4d9ca8d3f63cc7ea6b318b4edcaa6036f0699f7a0fb7826a301c14e7730f4349d7bfb08d119a2c82b4a90c7fdceb97bba0a8fe6365382bf9aa66f8a2bdf28eab7d4035267899934bb0af330ba648a6a4e1aafaca90908f30912d37ad72be17b9f5ea96f9ec318e573268a9d1d7c2574cb7013794792152c979363009ef97e29e394a590d7c726ba6409ba2cb1d995d2537092107412d2784b388ebcbb4b671b6100922e34081740402a48fe9cf555dc3d7ad40fc354312f7c1665bce46e7ede23daba470e250f6a38fd61fdaed41bf18a4bcd0a3449bd9b87a729d5678b3d5aaade4242beb6dd113e801035458ec7b50361d709f3edbe9e9e854bb887eda939cf2d702984d4feabf4e167584eb37e8283b03ee5fa71d704272bc67811c596e6119b554e24b8955190a4f91f475bd8b1e93a6b264ef7a02e0c2ca08ca71b9a5d357acf6df24d56b8ae26b38009ea7def70759ae96bcd59a19abfcda881d4b70ae1e3efdf73f29b483c64c3e4b4685a143245df3687f996ed4fbc63bc83ac9e506f55594e375d5975371286dfa05d0ca0c6ca1c55f02c270f4460c9401c4dff12723d0897f3f7d0cc1d565a0ac3c7a03e29f29162bfb17ea9c99513b02e93cc7a2d440f7c35b8359a95c3cac55eec0b7a4557ffc0f2eff1a66a48ab705b4574fe996cf200dff7b4d19fb95f5596d9e892d3b4eef55b44a8bc2b4ca4a3281c22fa9cf34491938b4ff8887b2227cd8530d59619ac362e78f15b7ff8792eb5b98f1d6e70d4a7d4e44652f1489d5d88a7e39e1558cca6f6948d9fa8332e1c19ecc73c717f81ce417187d5edd09a16a2a94d523d7e0b26ba4650175c9642a70ef1a71c65e6d56ffd40914aaa85cf7b0a92d060ca04b877f60536f5acd6e2f1213cd60b3316f333358030888be6495082d66298ec3833f68c59ba9de182665afa53689988e39d67022f248176494044970a8b86bf1c593be03f9efc577cf138eacb4703087a3d08d7755b3fd830a1a233889ea2fe1c66afee017997a3c2af8827b2a570115e3ff9a82e1aab007010dc482d986efc4e2910c4da7e223539b922f06a06c802bc1b00c91abb2ab70d49f1cb0ec1db739aee3ea35a84d8b601c50319fa3a53c80a7302fe68c71228908b6bf61994c1a73287b725c46e706c99b8f481f85b154785c5818a3199a62fcc0f4397fca0b3ba0b5870d85410e0de1f3956ddf2f5099bae06bbf1b28f2fa0c1ff59ad94b83a653b1fa6e900158155778b14571a0e1d9688e6b1117ede26e93604557bd28c8c007e78176815162edc219878e9477629c1cc062bf0bd0595c3750f38a2f75d1cd101edfd22f78a008c0c2c34861b8547a770d6d3ee7e4fb689e856df9b8741d68892f40bfb4ce458e4dfe091d8c2bf4bf25362451c659e9cadeab1620e96bb733b0043205ae3aa856267d60a9bef2dcb9b575d8792efc1bc05597bdfbcb3fbc915a13a4a591302aa119531bc15b9f9200823b8d225cf34b8c04fd12cbc6589fd0b500fa19f930f5506da87c93c262b8eff2fed015c912bb4990b9f6eb70fdaa09fbf69fc3ddecc99e02c58916383abaa1921b4f61236b47da80547defa07ffbb630c36c7947f5d697d94efa437eebabc21b46b36d8c20254d19be11539935cb024e19af22b7e5a243e163bc22f7f6e6c49cf26938c7f31fe930201bfeb74c8be4b52e713c9d01f5b5d4663c00bb51e097fa89d95567e7657996d580745e70a059bb2356261999e08d499ed7ca54064897bdef2c01bc1c707e8c394f01af617a906adf35cf494fcc930333bbe4ef985d0f6c0b258b4397fca2662620054199e3e81686e7586b82f759e498aa86cea926dc68264df3fbdd424614056f24c9c01be5739ef9d582d6a3dc1b41f20420f4e4c6849291f72c5dbe93fe8e25c9487a6fc8551e450e48f9d631eacff02696075dfb3837bf23837184f76166942dcab9f33e8a4c37b53ced11088c20618746ec2f22015f657489ea2ed12ecd42a312698af850ea2ebf19dbb9e7ec01b2a64a1468e43730abacc2cdb136ac74a72d21f0f10472aaac1e4fc8c273ff9e8aa5f96f36f9e587bd410e3a7e2ac3aa44dda79974813391cd1e2b433485cde9340cbb77c5fa883334d469b89923c80593e7fab86660fbdcfce80cb2de6238e73bb726f91d15a23e34d1b9e9f1daa8064ac5c0391d2da4789dd66b2e50659fe987e7433b8b1321a0e0a5d55542071fe2400b405a06653921f0c32db69c11f501d38faabd738cfedcc35a1ccfd34fd9ee9ff7a22a564979ad784a790bab20788222b56c2f211532fc5341daf36bdd6f7887e1a2922799127d6ba750abafab9772a674bc3867d0b8199e7937803650fe597d6114c37d11be49f2c699c499115467a1b16f0b7ed17a8aa90c31e01381bda803d5ee22f62f9b68fb0af3a7ec5d60c956df5865616a995981e0306278102b4ad1fb047a504c640be40f88facb053f2d543c173c642f8c52474f4ee81e5b7a142567cead6ee306371da72f13af6079c00d18689345e6c1dbc52d765d161eef19f6f1e024c2cfb2fd19a78743b34e9d4135547667bb2fa11a6a31ddb74a7034f6c652bc50516d780372ff25ce601aa04acef46e096998ac3b33ca5a4946638f56d71098a84f5f1e465f9f33e6a6607904ea73e027d2f793c4dc24c767472e94f7f386dcf14074cca1e33708ef539d20e3443a470f5c9539e59dca5ce54fd97aab167a3528fb65d533582bb50af7ec3276e6d77059acab04f2205cf5a91390c9af0a359d804ebc99cf79f9c5db8c16e339841dc157d40021bc8f9e1411e852383c903d5a5841ed1f5a9f53ca38db70fe3ef878e9fd19c5a1eaf9e39ef9eb243681709be69447e8e80b40c82ca8a5c745423725013227d1c82b1791aaa7a1b508b8856cf4b671d0a21de9f2026ad6d0a58c4f382f004ba11e9eb55e4b58611b1bf70e821b0e50401b12a87484c98dfec6c5f2764a14f8b4ec70f8a6e1b8f3690a17b4c201f8653010cbcb0c925e12a1c81c56e56c5214930356a0548b2e56ee9518aa4a3eed11ae6c9fdf6c3c93acfc1a1e1e634151c2e69c72fb5a2fceca25dc1418d850cfcb1d771bd62e01b4390de8ce6416e1601443ecdfb0da9f56a6722448f63e92be39c587256dda6bc1ef20e9b3dd26cfc582c27050fcdad4752842c68fde370701524c242d43a36f51e2ef18e559e35eae3cce5cfd9d035b73a5c4341876f2699027ba2963bfc07ef4e57a0fd99ec4bb05f6a694ce730932397cee5f348a1705a007198fdb7b68d4122d69a795ffdfab08c886ddcf82adae36483af83d58f815643cb465947bc158d309c39fce63e366603cfb614ce7ac23192bdb2253b2c184368c8ca40cfcc2a6daec95d4f8b10e2d59fba2f6cc59ebb5208d7ab9c8dcaa8e830621b43559d6de5066f2648beb38a77ccb00b5b0b0cdd79e69af56441afb51614428075129fc4ffbbd9f7d080b0a26aa90d8524a7e3ff0a201118130fbdfd07d3389aa314c06921c9b920b856740f42a67837928003f7107a658c58ebf9c1825b2d30511e073f8d126b459f249c8643f243858fc422ed79940a96486188cadf73034fc34ed1d8741f59af6acc17b360c941021881077d59a9d5e5ce0c089e14f420c8f3ea6dc0436f4b32c63b128849564d8c91714b1f1bbb175fffacd1205fefd25b133e716fbb023befe75b08111745c2ba229ed252bb71620608e06b91166089e38df053f36f67af78fa812aa8a6848392ad69343085819cf58454623d9c6055a4744f402e916443250b9b61473cd5fc26bd552a3216f76215e864b09a9eef72da2aa7cf546843675f95393815ff8affe6171752a9968c3548280e0cc05fd55d8f47cd08e6e1be86088949f1651c7127e5d7b2c98351b5951fe88f189a24dd868404421e8bfbf93715b34c28a815cab22dbdae7c9ba1cbe58a22fb298ed54b4839a1127832352bd774f11b422ba56edde7d805bc095c01b5ffaeef6f5144b2dd5d59c3f4c8d8859487565f1ecf8b7c86feb135ad5e869a2c6eb42794b065e68760aa1b1aef911c87c09ff41fd43c11ae442dab881dd01b61210fba28cab1506ec23dc5bdeab147e98b90f22435cb4de53e25e6460eadb02afb1c5e7658ce2608092923b8941a2f323e9a951186002d07041a4580c883fced5cf5c269ce8c754fe4de9da54eeaddee0753a816134325423110ae8226502970d4949380ed1c0ff2c2f08902371c3ff5c700288a73fb4a8b18f1480971c202693eac73a09354edc3eef6003304a5c2fe04eef9ff321383219217a71b389847dc60bc07d1f5da9769f2692b86e36c73c5e02a570b48b55a16ba41da8514792c8099eba99b652138dd0ec66ccdacddfd1900cfa8033698e0d74f72577bdba4fdfadd229618193727838e0d305c3d1e46eae29e886908ac709c6814f8297786f24dcf8cb00ff8ed539940d56fc216809044222a4d14ee30e5547a33925aaf15befc680d834318f7074aba5a57d9827f5ab8007108664e02acbfa627e3fb4d606e8b21da6d80ab4abbec3973cae03589fbe88e0f0108065eeace7f18aa748fcd817c6c3ac8483b9c8e1a1dc04af38319f196726842901cf7a0b1bf02d0b229c0effb2a1371729f4495d2058862af597c10c8ccfd8d85d831a1613cd41324f958e7636b3ef0c2b019f396cc82f8b48333c5ca1f576085dad6309e450407c0a43f6ea6a3338611d5136f8e21f2ab4b9b01c642a1d0227400aa2b5ef990e642e0803dce65d8316c97ca82368e254e1706890caabb4b0c7702f26f9123f4987b68a55f46da135ad653cf3848f71a70134ec966d921450e572f2127729f5c9f3dc9536899fba778456c852ee1e483af7d353126dd1eac7d81104123a97b9a9307248fedcaadb78e3be14a092f66ad7abb7ff9ed54be8943f210f95214674f8672466dcb6f0c314c1c31c0b145d45b48e95ec31b7e027948caa10748a76c4eaaf2835ddba9d92793834274e687cc566aea512acc3b2d43fe81439f8ac37f63c97ce089224a4525505825536772b65b29348932fa8c0a408979ad6a4846d70ab90ed10ab335c43a255df562fd619ed6914f0fe39a202c2c65c2a18a80b00ca5d5ec51b66eddf60f0372fa6a3f4f5b67ab20fcc841f65f70455e190c27c53360a8a10beba9670b3bedf28a1002600efb01705ec46da167ff1fcf00a08477414c8a968fc64d1103ce1ff5bc9e63d1114edb1b0b35fa841e106f9c5a8139939b69b994236c4b9566d3f0ca2f2bc5d7ff764afcf29be517e2259d1f4ca22da64beda4edf40505c6c370703f3a18cd8da94b3c420603b0d19f471096e1fb752b7d87b7fd89f07f0172c0f9c222114523eb6ebf753f125a442ddd9e1d544e159d6ce7fa7bffa5b903975c8a288a6da0f3b14970db0d2100e64e57e1f71a9d796449a294eaf685a7a5f1d97ac7925ab167da367ec6f4ac6e2fa9c7c5d964aa6e4600095d607e916e3dba588a6b0f5f638e99114416ad8e31ae1b3ef37244012340527e1a87037c439384679350c56df8c91aa0a2b08d5b2fe482616f92067e122d1eba3ac70a0af65f0e0147af3c948b95b50a56392d439ebad8c27be7dc3b4ca5551ca5d4d06540d8b405cc9bcb167001d06884068692b21ef868418d8353502ad4ae78b4d1ab066c7d40a93cd53035b1943e1edc28aa2c3c6a6486b1a193f5f8c41506426b9667e32a7be16ad58754926ea6c11e87ace7b72713746e38bc8075bcef2a6fe590e0fa146a7de70d36e4e1dca59ae0b64184c753508a5b03d266ee3ad607d67a5e48a238a0f74557ddf9133a7a458669d12a2c9f98dd4304f3a31c26e88d7b75156d810fa9a8d9a03802f5e369939a606253c56d2832ee11e176bd5a452144be2e3bfd19e0022651507e10ccb42a4b3ad4f3cd18e02b384c9c7fdd18d19109c3b3fdeb6b1c7e73100636154b22ff4b1eb5396fc6084c2d1d33ab0993c0aa3a6b4224afd6de9365166afcf36c76483562cbf70a2e912943468ace78b0f3c79b918575f8867d443c1bb4f063dcc88178cdea23f959a755e7bc984426c330fc55674f9720a956fedf154e8f599927b06228bab55d9e5f1e68be5aa917fbc483ec366f912a67d1e0140e8f85439e7871409a4372726d0bf964cc282c0a111c3f801a8fa79b78f75b2ff94571abe7261f29f43d65ccd6d4bde63f61b56995b59cb74be34d0aec815890f2d23db6e022a4527f5e663ff7a4c01f67d4de193078f20fa301400de418ead52b3eab2ceb1f523be00161bba3ff82531cb9c15f36ae8d9aeccda381be6ba6c8b8a3f98fcd3f9cdb1d814ef6d25d480d75a3477451e96f5a2b3804c86db3ac562d4907badb944bc82a98f4ce2bd02d910b05dc762f3f53cfa0303ae7cd56b0dce7285ec9f2b7d3160bd516558b1912d906bee73ad18535b87d892838482a8077bd8a6d690942e364db451567c496bf0d4b0c9216bab94b0776ba6d000e5a11d558488f4b9db407fa4546c996596830ae0869c3de6bf3e915ec9209607666a7efdf154df2d0d49e3fdfc4005225a5f131789b639961b5198a00daca75fd773b778ff82220fd46009b8769b98b2b07cd5901dba19bfb3636d8b8848fc26a26b73a0db9e4a3188c53bddd6045217ac4aaeeb6bddb64740bb38ee3ab7a9ed21ede92375de57aad9cae8b6a5759cef5de91ec5fb2fb2f97af4cd2375dbcdd1b44df0875c51f5211884e904c8e53b6cc1b7c4c3bb84eb666c8cfbba640f92a7ed3def365a535cd69d34b889d4907ef242e58b16726b2a17eb612259041eb08668ac53fde5830711a5ee9b6372aaa436c00f8700256d932d17ab451598b22e662b535111268a9cd46b518a27f6992bc2e1f5510ebf4f14b11232a393866457f56dc959dbe1b2abb2e354d6e89e10c1ceae7956809754ad0ae1b148488e83baf285a18a43036392e43610235101b01a6d5a313e4a754b6e776115a863a75c4e0cde215a3ebd782391c03923934f7747e51765620ca76a683936e2133a60cd0b370dde8ef24f95b73cfdaae5cd50995e94294ccd8577c3698aea97b3b5552418a94ef50204e9850bd65b6fb4359b4596ff41b8702c6764dff66cb68a59e0cff9d245bc243155ef7c173c616b679db270efe26f8899e1282d2c394a231933b41778334a3fa006e376704999ed708e5c7f6428360879b30adb21572463bd6244bc82a2673895a3bd0e6b7c753b36fece55f16601d605da3700c0251076bd1a4e68f78c3f4be24036b9a77fef2315a2abff1651692e49ae1dd9abf6d973b333f752fa82adf3c7ec4e4755e26f1d448b078257679df6ab1df040de253911318cbc115087688fd73776de8b254bf869a881fdfdbad80813e7a83cdeca2d6dc9ec359d54176be5a1d115a4851fb819dc2e238c4dbbe88308f604a1aa8a0d22df93cbae5a5f2090af6964d74b4ed42a940f3208ca045b79b953d9654c5f9d896b9164a16df1d92505bbf27f0a567cf02d5fbc9090bedb3273e0a0eaaa53bda3eeba46e613176d5d8ff22770565d83f3236ea2aebf5039e99baeb49efd2c91c351ff1a890a83ba8c37692d97eb1a938dc5132488e8bb8a169ffb4e83af59c81c05b484c1d26c1e97e667622836691fffbac633cdf63a7a8dae4fd8a530453a463683e2c7567b487c456230494979a0f5f6a151c3a6eb43cf8fced8cce4b720bf753757830e49eb34761b47883856827498858753bab01712bf52c8171df78976a072fd71aea05b0d6bc2aac960d1e471cf15e8b8470cd628ae2e60df9412521d8900198dff6f2b80960fc6fd1979afb7068ba30dc00d7dc06ca88a8e71fb05d69b4b9a8082118d4e5adc14428a7e5b0d06f9dde3c07a10badde7ae630441d9de0ad45c129af6dc6d6b7f2b067be36846ccc6f8207f0ec597fa65913c1637c5952ba6c09934f4be1c50e980d4d5abf9fdf8fec97151554bc3daa4d8b263998ebbfd79b67695161923d20d627e0c7655bf81e6c2888dae75c0f44caf47af5ea38f80c6b9b5f5da0143d8a4d46115a3f40054e3a6621337879c3e008a492d7beab4ebc6aabc2a24661826300d06567de5bb4efc325a536880c6ebec7fcba8225bf78afa2b70a4615ad4aa12261a60e6716af9b3c6ce67fd1b3133ef50447b84a754924621b487f8413840b292bdef5c40c89da7a4242019cf13fbe6e1c4925280ec8db2035102c44016cc42bc12ff7158ba51a19a4331cf81c8d35abe671cd6dc1ed7524a2463f5385a7b8ad911cb1ff32d13d0e7d8205c65d1eba0d512ffa0496ccd236198712a075b9fc4690cff9dd72dd5ef208612fa3f7f7b88d1ed980f6534fb2e849e5fa154467f011e84d86918fe9542d76c3bde34684fda19b7ca9851d3833c0c30a01af7261df7c9ac3605e9cc3a8d22181f003ddf73910a5f69136e360e05cbf8b8994a1e9aefb4f2181f43a8e1bbb2e283737db8b12aa8acd3d2f59d1afad435c001c70cebe8b1209c1675591ad95d694dd27640eb65526a6954eae5a4c7aa382f6d590c0d6d4a87d50fc7b8e9d616741fdd9d53114e467447d18586a9f048028bada56b61569c37332721953fae595a570bae924c2a7965cdd57867b337c6ab03da5f7b4ab7e386a16002a178a080abd65f763b8c7bfa10d9136ccf0484e1f8ce16f2fdc9bba29e7f1c7758714ddb2f46ef95e696f555118bf666b769391e4ff066d4804b4a855c01cabe6c367245b18804aba5d045771fcf1d88d8df19eb7216dcb02244a2eaefde4cac5992fb25cd6923e59636c53f03865dc63d907870432e7ea76a3536724bc90530d74ed7be3e819931a21c51606e9d28cae905f617a83a9ca20b711773f573d00d03283acf264baca200534260cbc7ad0f4b8d211c43b3ab2f0a49dc9b238c10fa5e7631acc3fb3ce6bfc89f40d04eecf60c456469ee96b8cfb763919bea01505a204bfbe5598b1ca54b5952c1f0e11c473408bd6cf13944381732cfd94198669131dc954ee9dc69a3e14b0ef5c743a664dcb5f66c9a418e89f2b9531afa95113ee5f92680783aec0bbe81c826a18a09b610916f85fd7810f0c015920c031d8d8fa7c31b64378d93ae4db0910a1b93d61ce32b6f6245b829f3695d41d72b628e8896cb95ea886be023be35bb7d202b0a90661846ee9de550251ee06aa56bb9a94c29a117ec41ca1d345b1affbf22440d9e1dd0bf5a6e8ee62c72a68b234417e222f6e300125873557b878cee1278f963153123cc87d7d7fb02d6110aeee5060e1048171439e3d0e6905518c480c1b1769a3e94811bd892f528336c08ee368e57eee5ec7b2492a8ef3b384331b905daf60e87d0d3f2eae621fe9c9563ae76025caa82f3a8019dfe7e8f71be9fb2a0ad8968d20d892c9c9facdb140f73d012b0935b5d781f51d370d2c778f7231139e6f08ef85333a39eaacc9164fbeb7e85348440b6ed818e64908928ccea3e62c327b9c2c5bc585c3825c7155771dec4a7ad5d73cddaca2c3ab740a409c8b1f328f3ee5af4de3312340cc8a00b9f0f0dbabe98c3ec3ecdbea63c0327d6eb45b9b031ccb95a9cb2767e8b2f1e51631c9a43bc5748f88bdad63a86b94a14d9d7e1a06de5173de0d56aebf32b6d0f8bd0ce3b26ddec2158a0c7a6faa4808044de9e0d22f04f7f8106c6c6d6406d55c6db03f0620e33a6ab723e23b23e48e1088b7f61b925ccb01aa1e41ada27babfe2fd84edd9a57c5efaea5a3cba191359e0638c5b5f238eaadc6d3e7ba2147ea93b2d97557b0ec89b8b0983eba44a610684531beda3b165cd7c7783467a61095576f1bfb34227e3283ac8de9972fb90679926fa18ab224256c06679f7b8081aa4fee1311a3adb4c3a241f56ee9fad7b28fc5e0754cc6815325f4a34f57ec3fbe04538cdcdc94fad6e814b272d503721889b1858dfbf5dc717c7b02040c24f2679d2bc61dc75ffa92f7bd735eb1fb7cfb38fe5a5a45c2356617959c43145a4329e52f48411367442a9a7e6ae929eb3adc338fa6c3ad6a8fe5a8f039f2a23af7fc33d4f643128ee07b314e8c5c04b08a267cbb5555d71d2964955561f64fa84703d7d04e1006a0a1a8e977134d7e48175cfd4ab41941dcbf9beb3f2539130459b42d36e462753a72e91af4dcd025c6b39e3840b82a897b0d3672383e08f31002fefbf3980a003db96dfb97827dba69bdfe13a63fa39662cd37009c73100801b15a8ce798897eb0853b2ead930bf542ae2bb0ea0777d82208ff44e3126f5df53367bbbaa8a4c3b9f088f6bb219791e7b3ef7f4e20285293d56f26437eb8e1cff8f4798ce693faf907a803042c6244593e0561904d087d097f0c012920413063d87bab79870ee00f2294dba984858756635f435301c171095b15cdc8d27926d10e99fecd28316e2a4a55ad136a65019812bc96efd0cc741e7fd7053761c2c2d1439a0fb43305e76775a7cedab8b5c64d8c4610da0e7984dd5cd33943f8d28c51dd495e26e403083e83172650d664645c1436053c81260de47ec4ad6d28cc5e232f2bfb495060e0d3cefe997e3b2c2dde7f26b50ce22f94ecf0b96004976941ecc25396461c96601bfeb72a33366ca6cf65e9fbe69d97d7050dfd64623590ad2ca479d420cd5c483f600400bd81ccf51c6ece03bdefdff4e78a81c818a35b097327e44e840b57770f6d1794b2dc2214bc73b406f34715afac4047ee11dc5c0ece5c5c76d7cc9a9904de3fd0d6ee4371a56b141389a822c66e5747d9f2f5fe7c5224a0bff2ad808b214ab167b9c5f31f75ac60a78fe0acc33f12ee1b7d2ba7ea598cc7b6f12279627d3df053aa4259db989969190cacd1cf00eb7d252117582bc781bd9cfbe327817cbd093d6c753d2c123f38eb51d7a26c6d05fc03aca6dffbaf250cf670dbcbf956c44eaa01758120f9ddc9a50b765e683565735321e5a9ef4a45899e9457863d12b3ab5546c7cf346db92615728fdd08d17617e7dc3951d92d3f7ebc19fefc327b81a0137c5ca13375789fdd8eda03bc016595c7bf67708610ae78b939b8ed4314657630aaefa562601184ab1d50befddfbe3b5b9c83e3320b714d20800e88ff46204c87de887fd7ad12bf8b8e37cfeae91d73b6de6e766d7bbfd8b4e3866b61b9b00d3474572d9be074c7115d530824cb387073756500d03e666f796d2fcc8ea8d24bb3670162168320ce50e3ae5c76a346a7109afce5da1305d7757edacb0a5779f54c7720004bbe82a893018c1ce48cd1a2904361b6e62065a5beb8983f1a97b782478e644767a1f611b0ee2cb4199716ed04ec16e80b6bed883fbd0913228ce44c2faaca78451e723c69f1fc5c220dccf1db032c327ea06de00dd2740dcd5d6e55dfc1194ea6d4085aa00c115817e72edef85f0af9e320e107af4fdf671e1308c2ff71bd2cf616698de9e9501b9356baf5c443547ee19c13cc7cfdcbedb5bff1c950a5f554091a85af2a89bb59b1afe142f956403057ad18e59a86d65bb5516a5d0d33551af94826f6c9e0c4b159ac6154d9243ea01da91fb9540f19e42219e1acee909c64882f6c108c6d380673743b891f053ba14cf20757eeefd8713b1a139a512dd8d03a0cc033ea516bab3a109fd3e10ec9e68318a1d0e09ece3d8f4988aad4887e7d11e709ce7e82101f17d8d5caef497942b3c08122dc9450ac7f3260f25f0c2abc00a58b86908de57378474cf5796ca023ab3449914e2ace904b916d03de348b82a838a743c3104872e8dddaf7da944e205ecdf987d266a0f20af547910db7f38a35e015eb6bda71d9b4cc5f8ccbd1af6c27d6a151291afc0d872c7568aeb7d8b4082e67208d04ef2b53049d8b942d7890fd57ed5d97ee8cef63a27a47119da186d608e733723029473392c2c8b0820de2cbc14f46b8a6a7493c6e553553cf3371b62d75ba481f742fbde81e911efb7b96e0c445183d1f122059b902d135274c1a12848f90dff21318aaab97a2f1a9188af4d220540f49838f5211041f1dba8a548cb7f6979b38d54650ce92ed4dff9b3ad3fe01334b2f1074c5dac6f464b903ac5fbc42c296bb85b7a3215bbb50c773f997ebcfa1f284e6712f83fe68f40d29882a42eaf700b8283faf49e1be99fe216c4e047a13bde18dd8c5731cc6d9d982900b8bfead7115e2064c9ebbf86183c942c79c7e28bf434f2b46263c9a1a77833756e1465de1200a2b41f05289451bdebb46ff93a42a7387f08ddade52d30ba937fbba67b87e0ea4c61cf7b8ad54a6279265f53b18708275be704983a35e08510a32c79cd89ada77958ccdb56ccac70dad38fdb0c0d42e5b844eda92dd94f6af6ebaa6899a3cc6a01dcf3eaa0be482f140acf209bd5b91f6d61f4622a7fe68e243cdbf9f0e7b8b83858109fc1de75c8b2cf1372cf1763d73bb8e071e8fbb599398ac02e65a1f0c790390435e480bc4f8d12799a13e7b46cbb0cc49c092ade5e0d8ddbdc7f184e164255aeebc724b38d49dcdc3d452a8a05b1ecd5fe647863272167904a376adf5c1f0525fa26cf1808ce18b25a2f4fe26b52a7ac5cb45a4f4f626b62af2cf5e21b1ceb398a882733217aaec01ba0d5da27518800f15381334726afa0e186a660a58094f351ac98dc1b0fd2d91425e2c808a57d9901498154f7299309c0e6cd71c6683de28836b2c45103277d0b4b48b9a82fa8769284ad490f589f5e1dac007ffb1f8205db389f0041b1b4e27fb434f325da3e00befa06bd733a5d3636ce1c73986ba22ae310c70f7d90dd8bb908f8637be764f458c1f6764c2642b9ae9833ee29773fe82307c2e81c65b274ad8f8e5214accd0e2aafc45530771efed5ef8e3a360570b0bf257d3580019cec03e14b28e196733895ce214095de1eec0da0b62ab99e2bb6ce408b3650cfbb4be5dd9eb17e60211bdcfcda3d7679ca5e7250806b7d8fc34ce909c0773896d2d7e413100b3c51620c00abd44f7aafb13c03217452894f46758557a3af8c0ca14e7352025d7b88fedd88fad7c581113137ce935906c04d37e790f58bb1628d77200c258cd47b4543b8344765a6f6a97b9942dc34066bc3f6a97b9146dcb44eb47101c33d88634eb13db3d70b812603824d6d352aaf03d664695dc6c7b3f626e255e90f00657acc05c518275630e801cb80aad12c92ff965ecdba8019f0f3df4beacaa423c7759055398408a494843b586d4c475a02b31295bb957ffa020c988b529afad8a037571cfea3523a8ea05c331246a53302191c15bf037497d2dbbf94bbb2ea48021908ebfb95a0b9c0c5d782e20b4b908a98a26b73a548d0e88ad33a44c0f00ac8ea791699a8188d620984ca04ad411294780d4f528f47fa68a7f84692ed16ce3328422f388243d6907b94d076cb402347373f6e849a2f5ff6fc12a992c755d3067f8ae4c08e43b1366f93235266779d54d063c6c24517bf008a1f657343aa1552d3dc5ac0f22c3559824b4043ad09281e8543d90bbd88d8b7e05201940a0ca9f1e72e8916616035abc7333a5273e9618b41b0d81cef8e9e50c81f776fd8249f00646ab6598892296a395a51ba7dd843b8907bb34c3a2e25876482fe1f8b60198859db033d91fa583e418d8253655b9609eece4a933ac3214ee340700824e09f4c8aadcde30c3db88274a29a63f43271c30522809b73726ff45a1d45011868e0daca6b36bc982e1fa9e8687c71c7f2d22e9ff919c28d38234b44bc0d07e74a1da6d9a380e019504c53f1012a6059701d8c0f1fe2ed664346a92d39e9e2b3697ddb590ac7eb149c8d0b7c15ec6596d913b89ef0ccadc8b30d1e00a3ef7c2f2860f1a05bdb19a0e14d60d1fe1ee5af9e1082a557bf29f20b2a37ae0b274971e3279b8d3d611f3acd8b9fc7420d0a7197864c47e409c379be03c97aedc94cea9a0c2bafb9e4d0296a2cf12a3a295fd6547cd819c637f693aaf41d768cdf33f950490dbbb0c9bf8e6ad8d76397de47094c4b952a86b72f7dc034314ebebf9e639ef498a13b7dadc79ee00dc28568948daa0d8e1dfd7942897f74bc9bbd8ced31cea28438403ec4d6fec3a79c13e2ae17e7dfc308b26f8daee31524efda5f7dfeaacf462f2a90fb3ec43a64289129c1664f5c11c9db90eb419d93d11e23837297c1b547b1a29f4f6f5f189245ee4884e61849ea8996f08c8e0bd109aed93c95706b9c0542bb95cfec0ec143a202e57d517982a3d9357fd04d1aa5f2818fd14699202030c8ae72facf156213928c13d241fa762a5ec4f2c796739542f67777751201c1cb3099f93e5077d5f9df31d6615ce98d79537761585fbbe25bc65ed716fd0af00d0622cce848a2a64b2cb833afce97e5a259c469e689048782e65109907518936c173ec22ab4de23dc7165fb676ac27d6f4778ec17387c812bd73f8609cecf48e6eb831923fde8c9f6be1994ab7ec53c1764cf0f394597aeaefb1bd2b4f0cc67ae05ea8772137866c4a1ae397daf82e849ab76af00f5bff937902f37f8bac95d82367565d9f085b8149092192d34ac1fe197a9f4b99e1886c03195ae2e39ad3b3fd7fb3e3518eb1e8140b2e6bc4c239067b539fab50adcabf26cffa9452a9d0a47c63f8d94d377d8a4458e4d0d0f5cd366c7df1c3e9b89fe57525fae571b59add570733957a9da8c6d57c187ce5bada9f3efcc3c4e9b887b55dfd3a06b3920f3332748039a13efa3c8c25a613b5f7dc731575a4d0f040a41bca92dac218014222aab3af10cc078c83ac5f4a7e4c9e0d396d96b9ff22d68228a3885b92282069ba074e63ff21455a2725b7e78fb8b542ae865f31bb46e54785010b3d87db2cb0c44e2313af4ff780055b554ab438673b59d20e5ca835960231d0781029616991f811c0539530edca704787a710d8835502568562c95f86f47c9eb95776e2fb5a301067a4d70667134b448a8cc330f7df046e279779a7143ff010f5e61f07e5c579a23659dfc45bf3e96111708b8c1262966385b7ede95a15d5132af34a3a7178047eefd14feebe7a0311201c3e9271a1e5c00eb3ac7345dc8e0245a4360bdf1098916908114333336a7d396249992eff8ae96db9e56637190c0f9446e5a702f4034ddb9e54e9c50baaad08de0ca1648e45a773a41c954d8843416beaac5f1305ba6f377514b4d2617c925ddbb4353b65822ca124b7b4bd36ad7e2f239a9770d5d5d0a6c7708246c02f1f7b72e3b98d250cd22dc411072d1b527e2a1c7b4d7968e4b43292b688eb0a1d6a85af93caaa8b7ea23838e1774afff1e4ffb8af322d0ab827200e717eb7f23e3143102d1fd097368a918cd1db71b7a235c3186ef158740130da72c4a06bee3a2d7c059a9ea503a3c4d34750c516e35256bd3b0fa4de393c1a1302f2c3def297f9b8391873337b9d14f3f8d7338775d0da6586df917a284583567f1333a40d959d269e824c8b71a8227670c7758146fdc822819082f823e57384be7832b59565e34aab9955ae67af0b63cbae5984063fac305701e7734d079063440ac8c1f14522a37e2b48cca49d140b93c9779d3263de579b1e6dd70890fd402ebb091ad7dad99bf2b521170d8fa7650e58f631c1343adc2e50c5452ddbd7902247daab2fa1ae7d5f719cf05786c1a5c28935a0304df069dc0bdfee92d17604bce6204b089f6105c068928d97cdd136b47af87aa6276a5645dd29562d38c418365a58d39522e40952a580bc56af6a728ce0faeb557b36e2227f881466c121f3d387b381b73803e44b46c58ea67dfe32c381b12a320c0394e4b975d7d7fc6584ccfb72c1c52cae146b1206ada0a8d9ddb8645a869a2d9a7bb21f36ee1e394c7284b2514ae77c4782fd69da9ae3db747f52bb8a1459581beb786d6a3f5cf50bd01a20948e74ff42f7dd90d6184237d7ef8b8d9f5fdc2092160fea89eea42dc20efba09ce641ac815931075f161df1dc2da89dc578b6e06bf4b47f557f6e67dbd0f47b6b6018b8dcad4efa0cdd41477b0bbdc42be30d54374ef9c51f65c23d1105a8a7e158e7ab91f41ac632d2683976143aa1dae47edf8e87d48a2ae3a2dad9a93d4ac0dbf1146540c5f2a5e860ced1bcf62dd44f843da8ca5003a6649514a53cbb001d827d912921eb38dcb3080d9931ccfff847bc88d22a3f0d0301bf42a0f48718469a5eab4fd61e2406a47b10c991c5d3f3e901c05d422b1ff38fd677aaacc7d6275a76dd48d8c5f7e9da66147a6061eda109e87c6b054be36f2dd3b6bd89699adc29473271ac801bc4b4e562967c054e2be8d6f8b12108506a8cc5b50cee4025c4a60ad8195e78575a77320415c0561050792609b07b5b0456ef2e129d4ece235e131bb4da498a2de1a6ad05478f899e1cc60360cafef239648cd8b9d6c13efab21d4490df90e19a0c9c66e076d69d06fb2ac7c4a60135300fde6eb91cdc7162451a99a25eb9145497f4a4f7e98413b67cb1057dd7c239539a7e836ada95f9bb9194145c821124f5d68914a056b1d0527ef577dc4d2552852a09b4f76612b1e71f51806874564b9366f476e4baf9020799717b798af14ca3fab8fba9f9188b630805fe601d027c3a471ce6e454e36169f591145ea32d97d9b18e72607907d83291c995cafa238be2a8738f3969501d90cef7147d3a564916f0121b6e99aa5f948318535ecdfe4e9a834dfea29ea39eeccc9e9da1dd61534453b0eb12e0e4c5c853089afcb35ef710bb0215294a8531e909343e96c66f0b76ae8ae7146458245989d9a118a35d1257308f5fbc658a047f4224b0d5f1ecbfb8fad5c76d6d91edb39abe10d057af9d89d0af2c359ae8c574ad4053ad08fe7723d4ee6db2c2f5f2e986c2208abd909fd2cc8e4702cc5ec111d0f9c2067ef214ca2b6c7b66cb1591169f82982ae24f933eaafc08168a02a31933aa42f74112c47ca75811a2574a272c56a6d30e5ea1e1325cc01973d188931a830ebe86c374e90b7c1051f4de931c3c414e8e2375e5d737b2041242e043c0cfdafb4245f5d74e19049a47cb24748b8db88e9836242050a753ed5de29e64b8660dd0cd0192293c11e230c1960fd1544c1ed670a6cb8389dcd71a7b4accd9a3ffc01a47f51cd2534a1a0bf9936682164aa2dbf87543c6e25d176179cff4450b6c828ab5ec605017260b1dfebceeeb15c886fea4eb89ea057cc7bc6bac8ce2d82a44a2136338ffea019f5f1d118fe419bf19c62f376a6a399c16d1f1629808ebcbcc1969069d1da347b739bab76e17eb442d51d17f82cfd1947445b1808f8e50ab05863b39da71b2a24b50a45ed5b70b024b256d51790cf93e75d8faf112910e5d25f55994b13122cb298a0f851245aecd3e6ed384391c9c750b44bc9c3aa23c3047c042f9b30367a528ba71e12cee3f22befd69b2a723c94fd304c08c046019ca250073957c603f384c28d45e5ec6f71539248f4f37ba5f57f10e1b84abf5721ba186e4e673db5b909121e507f0e45f7ddc5476d046087628249d1266ef83553fa4ce4c679cbbd4fd387a96ef1629666b5bd13b0f18ae4fc5ad187078a4f6cd0a230062d3fb3c35ce6200e9129b8c5504f0ea779d8f1e157d248c27b22041c4d5e4a4ef92398af429a45d916b27d9a59e2a7573f97e1735d71495c589e476ac4aad31a6175746940af39c5efe23f094a640aa65b61698e4a99447e945491d8242559c312e727786f519abc49c64413fca51be6f13e10b683b81602acb41f174df8d47cb89cdf18e49a8c01ed2cd66b4be994788a97346c942b490cf1f2948f7a71f41474364f1e0696463ce1f99d2809dd696df0093b891ec753399d98213a2db59dd3391bb22e2987414e9e304e4fb4101d06a70bfc26db356f9ab99548dc64469093f5d9f4a0d8e4b06b1aa2910e0dc285d3507070697ad59fec43686ac66472a69698e5cb24ff318ad564fa7b60bbca64e3d3c9e216a19f98d674981e2e61721c04d390b549c67c89d9e8a555dea54fd52513a27402309347b825bf5c4b1391965261b30423a7586aa7928e5772297556f2285795623a15a25223909729a520a59092dc0713bb7d285d913f6933b52cec241f71d268b049d99d49ec149336da25bd812cc9f0a4d9119414a0e2b87524c95e48ca473e123bab30d4483760a48dac489f98489893ef4b2017bd67798926526402e30d94f37021f2a9c5f653633313ded671085cb68d79529ad525917c4cbd1a51808fce2e9dab3fd82166c537f5cad5ecd725354933f8256da3e9fd49dfa3f309f43859f0a108987b2106774b54b3831c2453846c4d739d595c97003ef03a3cf0d56d383e707581c26de03399c5706af057044b33230adf6e98387ca40ba9288e1705b1b94d387ca22ed4908937037a3d2501fc15038a35d6725a3090ba4a07b608a411862faaf59194cff3b18a9537d24ea9de745fc59116240fe5681dbd7ada68f40b95a97369ea6d44588e6c9d5528c0ad2ec227f01cc4b621b08fa8c5e3a0266b2ff4a10a6a5abf88dd7b932de596292529030407f4064307d24bd5d7f48c6bacbc5ff152e393910f35116a69ced695285c64dcf92c2c5fee7cef844c9d2c82bae56345892b39345969f21e34a53bb1c5eec00ab95511135708314588332eab6585c5e3865c1525b02822c1ad96882b6ac0b8c15eb844394137171ea0d84b94256c700b5cecc5dea620b03405212508262ca62bbc6a4f35efb5cfb5a9659a46b3e9cdcd5a78fcfe65bfdbf2ab27bb74ee73d862ec6129644ab90a9d8ceb36f739f8c5fd64617ede0ac6c5867e397642daade538b461211bfe21894bb7ab142e57df0a97ae7c661fdd6d4a6ab24a49bd24f34ad972f76c4eef2ceda9542af5a1a73ef575aabba3478fdede6c8332aebc93d22ff48f1f673f8e8bfa261eddf8b63fcbaf8ee257cdec0ca5d28dbf55fab0252efd5afcea55131bdff20eecc6f81f7998a86fe2bb997813dfcbb8ed65dc327ef6b7fcb8e77afbe637e75fee7ec2628f5256675dd9b55a1bbff0ef066cb19b77e8edd5e5573ff7cfdddd6f83a93fbb9b7da73fae3fabcb9a5d2e3667cf97ffb3a15f0b43b888dff9651ecfc065afb89e3293547ef6ec711fdb1517b9461ce99f67d28f66749f73ae7c224e7c9b24eccf67b13349c68a730037491619e95ff6f7976d73720d95a6346e8baf8e405cf65bd63014acc6ca56f0ac3533b9810041872c20e800820e6258114a33ad0f655428a1747c289d84628f8d9d96524a29a594524a29e54ba4d873e3e5cb24dec9f1f2e516deb17919255912876421d9817c761279a49393744a9254249408443635e170e577404a0b4823b2888cf11c9100884092c81c7e066244e6f0cbe6277cc35f757c61b51e7ca16d7dfcf19337c618a36ba9acd24d65399aae8683558d1c36379e7643b26b938389584802611a7044b1be0e3e16ba01631a7a70b211c28a83a4a6a2294d35380abf8688901ea9c6aa3a40f399e1380a0f311157ea54c6168587988869288a4d611bf8c9f4aaecf8def13021ec10dff09311cee027f1c37ae4015ba72dbef4e28d328abecca4f6526eb9a14b257ec5d78c296f6631a16128689ead2cea655e9c1950badc35b0f1c30e6a1cbabf90bbeb4be72fd6fad52f9bdddd5e13b3babb735679ba7b65cd49c20fbf5ca9099bddd804441af4091051549a80801a03082cae6468d8796313104ed40ca734aac7c9a4db41ca9017988470209a010e4e30181a020316424398103d71430c4549d090842403111036043595200a94214d9e9c0c8921a8088d864c4b1049644b4f2c8d7a411028c01204161c374e21840b34d866075593ef00c0d1f1cfa552a94208a1c795ab95cb153d9b9487c9ca5183c58a59d7382d9bdaa77de19c4fe767d369d024bb7adc4d7573b7e9cd736e60f39d55cbc565d333a7ee349bd3e59a9e3975a7d9f4d66a7048222430f788917b6efc8fc5aa9525f30ebfc7c8eddedd3acc3f6877333333a5b981c5165d94524a5fb058e479cfe8a4b1478b3511c7c5b951a5c313635575d55aa329a65b4f083d52353ef67edae57d7ed5e2629cde59fc79aed21a4eb09492a5ec2dc6f84d9f9ec5166d98e565adbe60b1a79b862356666e66e64a9d6ff34bda1591b5a613d2cfccdd199759b594466bd63d6975af547677b7cff62c7377ef9e5e7777773b875c08636477777348442dc57534aa8eb3a2e3b82a5d2ca6e2a2560315e5bec2921faf392704bc1a5c8bc562526b58675263a5cdba69b43da35b9df3bd5b6705bc85b06245bb3047bc23ebaa5bfc626de3624703f59471db0a3a30d8e6fdf8c462345365a17c851faf17ed3a212cd6fc7e9aa9af517542ec538db882c681ab33ff99545ba159ac9a7d67b552af02fc6209f08b57e0324a8f54434d407889c506c2881a2a6134018695312c53d023615e90420467aa6879810a6230b941162a3670c2073080a089514d805105132d351c25b144071bc218410c2b30a28ad309b5c2587063e45c0a2a9e60c2a5154d54a25c7eda850bf510c6fce01de94ccceae54ce71f7f40baccf549ff10c3ed5ac3375d11382e053158e2053d08f1c30e5a4425b898a245072f94ca6001b6ad5578a14273ce2bd77a32366c591e093699e0c8b954185f6e4871e5cb0d2976b801831b47493b6c1121eac68d2b57b6044161038c15286c8099a1e36c1c25cdf082131b4c36acb49395179a6c096fdc1076e3ca952d675eb061c5ca0b3eb67ef6edc3afa98345c2908abc3ee257d19d3fbf566b670a7247c27406107bbc59656c17776631c2fc285bc09af6b1d89a6519fd1acfaae8c73aa113d27df57ec53bbd5a518fd33ee48658eeab8fedaf2bdee99f95f585f56bbcec8414f7b55a9b643ebfe6771e6bdb366fdecd37202ff7b21342f3b2a3d9382fde154299f22afdaa7d5c6543fa5d7e391b7b74224ee41940bc99df6a759d8d1bda80cd2dd9d748b0cb1f3692d26606162c58b0e8b0e0ca952b5744888a93fee49aeb29a3ddd0bb23fed24c9742bf8c7af2f3bdd8c33fe76b806ff8578c8823a322cefc2510d0b0fda5bbf0abbbbc159ff1b6f835a558b90136b0076a6d017d3e823d1f3b23b10ff201d98490f3a91071fc833c104c892686c0201ffb1f963788c75254b104fa784602c87998176f100f4806d120490954a2dd00fa7c4639bfe5783d6e3ec70bc244e9c69ae701f1c63fc70cae3f085fc80ae3fae37cfe3fbeb086aceb3ebc1ede089ef38dff8dc7451c7f494502e9628e3fabaeffeb0b595e0fbe505e0fbe5dffc3feae2f4c422f8fdff1b253808ee7f1c5ae840fbeffa73d165c2fef4f07e07b00b8bc25f7032f4cd2b7fffb9867e3eff3b1eff16cfcd34001a08441031028f64a6c90c00834ea0ff23ddfa2c286f4bfa741bc136a673eef5f54d8f00727a157c7ef78fe1fbcb3e3f9753c2fdef76cfae3750f98ec70af757836fdf5d36d287ef1832086a5421f0de217bfce92cd3ea4412900f9202fbb1408f03e2f3b233d1fe403cab4c801ec79d91989bdcf0714bd24d1a004c6fea75b5ebc36de929bc30b77e0f0c22886e5850c832c2aa241fd144e3045e1ea86f3285cd17861d779e1d3e52c1a1873f9b550164d4a83625e8fb78101637782ffe468101d6a9e0928b1431a4362cadca006203f256a9e0fbee0e288a0274d9cb002e4a741fc5468030302f9587dc3dfd3e380205f70880209f0c5bc0876191bda54d00efbe0613bbaf1bf6c6040a52730108136fe95c0d7c53b3ebc13a3086aa2907b5dd6892979cbb073b8fc613f6922de8951b880c6e56f1e78c7add86668a2c6d239c49e27bc139bb220f14ecc822fcb21dc45d161088cd2ddfd3b50b04557363d46cbd280bf3c0191961b3eb8710a2c48b878c52fb731c2401d111851207f11887301d85fede089ed2d6e2ea374a7995f0accea1bb03d9b14fafb06fc69810d63d3f5232a380fd0921070698209e4f7088001fb48bcc116238630d21a02ec8f79bfbfff4f3b331b19200a2bdf005facfce8deb59ba3ab5616abe5337f5ffe4225971621b927f7b296e5a3a3638027acf38e9c99cf963146692d0cc6c576262ce2f0c3982a957a6de5d9ce1fc618b999999967185fa831738cb1ce99d1d4cc68addb0d2ffcacf65cb76619b59abda05d7aad53a49c22e51429a59453b6246ae6b365bb7bff64ed48751d6d7524427d7c523537b3a6cfc251c345d5911c1e7747079c8ed3a6e394d2894e3a3a3a1ec4094103668c2c55ccf0004516284a4ddb132254888ccad4c0c4851958bd4286098bc174624b7d138da0a0818809a6a46125861fa6187191814809a09cb8f04483926d628a2b3e541858afc11250c6d8eec629ae30e1bcb03434c8c49051d279f1bb4b0271c91cf91cb75ab94ddffe422565748b5e9f3e373abb7dab3ea7eb70f64df339dda54f9fd37d4bf99ccec1176bc9b031245a2d2498df2b9668c51063aa38b2ad238670c2459e600b1e35f6026784c609c25c6647c1d075f75a27bbb73bd484f20cca33280722c5c2aebbbb4f6f67a876777766efcc8b0c2a870a6c987511664abc13724cbc13665d7459f22f5917128827c91c7ff7292377fd61c9000ad66fba2be9546139f5f58f6847b437425fb399f4cb3e23dcfc50e89e4bfd0f779e2bf58d3fe7f966a9e78f8364e7c745fc72f7df5e7dd39ffa8052f49780b57eea8dd44ffdfc54eae907a47dea81e8d75f02b646393ad4ac9d1163b71bb7d850f515c8de3d9e2273b297dd0218b47d938596524a3f2eea9bec79895f59f69c65af534597aa8a3df39d87f8327db978fc604963973a40f6489e189340805c1ac7b8347e71e9474925b59445dfbd578e226c8cbe8af321426f9c6f24fbf9d9b891f936ce0f64e3cfbd3fcd47903f23aaefbefb806cfcbb8fa0eab3f10f05bb04fce18daa3a1c24fbc345ffc558ee46df9c535b11ed533f440b93788aebd56efcc84920fcf455b67966763439ab61abd50be58c31562963cbb031ff0b16e3d16c0d0bc7cdb3b78760a32b6e5e7a37eee6a45cd918630d5b9062dcb0e62671e946eedd8d5382d93186e084f5eeeeee7ee194e0c36e698023bf319eb16d31bbf1adb8af4a19da5499135f5e56bb7c66aeda35b7592e3bfbfad04dc2dd5e734fefc832a3219b95e38b520f64b35639b3997d4c458e39f31dc8252b993d67e633f3309ed129b341d0b787b022db8ec8b2b89485f3fc4c1572e8e7f49dce09844a9a65dffeed37e36eac3c9b8b7df9caec5371a31f9965337055a82dc4a8b0f34705253125ccdb5f55c21beb5fb0980194acccb82711786194e4c46a3736190da1c5aa6ae581853e7752b9dd5a39bb42426823c2035437c40c29256e8a0d1a17a68d48a876894a55998106aa94a4b560094aa6045185d5346898b0184c27e625c98b12dfc41b561b069415106561830f4f96600a228c10911ecc10f1816875835416b6e6c629acb8200c2b4ca92dac38b1155951828195241efec6299e98d2d667b79cb32b96d6da36f7e92bce39e7ec8aa5bdec365babcab9acadaa43d656ad3ab4a6dd33cb66d756d5b1b5d45ef35edcaa9e758b7a7bd6b555ab777bbb675d5bb4275b908886a2ca4012719837e6a0eeee6e668f13a2754364a4617aca48d1532666d9c7fd5996655936339ecd5f8db2a3d3844bae7c9692f906ef597b08005c58f931c6e8dcaae5edeecdc4265fba609fc53be18b2ff33cc84f0401af2aa63cb97cb71ba494f24a17632b9d894273a3d2192635d88aec50444a104ab8421a75fbb7286d1776b67ab0f2b72049369c474912acd6b258ff9a4f50b73f9c646e73ec6cb6d8b8d4afd73f8b556bd3d7a50fd3a19452fa9a54b289f3682acda5793493a2c2905f0384ad93ca0dec0e141b32d42cf249c34e2cfc3a616cfc1c508c747390b9611246c249377e138b06fc860c35a9f0eb0636e449e572e4b8bacc9fe557fc6edb62a713c64e2a04c862e5a472e5a4c23ba1bdd10659a5a72e4b5fa4138be11deef89795e4b364179b2de45bf92cf9711e51223a191464c3c8f4d328f08ee4970a488e48a002dd33721c287aa2d4451630788812b7988284123628ea12c507a6255888a6c8524498166c310348420e4ba4314317475a9001f95168fe23cddfaa4228c80536ac95f562d6894a506e1897b4d75af64af7314411444c7cd8e10722c07e56e45932a50b2f465fba404171447f8d9d7931a2e9c6a6229a746e6c2a62caadedc33bf46bb596c5fa072106cb5fbab04e184b73d48c0993b0e6b1dc3e1b13e8cf1f42812ecfd492cb5e12bea92f049953bf55036543bfb59b1f162b7726a4eea4998702e51c0d40b2486237dcc092cb9f7d96f11695932ed1f67c74e5d7802d569a611d9fdb4cc442bce5ceccdb8c0b354ff7fc4ed43caa67f6a1cb3ea3906614bf10a0eaa7e119c5725a8e956a6f9f931e45d1a31a58f9213dbafc5a6d7f2226aa511994a7d6bb7e8890f0c40395413123ba69092b4660061a4d8c3873801b4e20040dc698e11466490a2adcd213151bdbd05116da08788a4e4d45105d7efa71631312996bc5a44410638c71c5b93f1131963e896c3daedf5cff81735db217c290c4bc90b913d2efe1bcee92c5c0e2eb0792181104cca7dbb305192373dcd7affee057915d590b6b1d3629e3bb94524a195b5012c6a8ebed5337d8370fcd47f9c1224e1540a8809b7d44e1662f9fdb6c4ad3b48fc537231461fba12a654f41971548a15d92f882a64990a3294b910e63801183267cc874012385135cc684e1050718b211d46c36b856968b1cb7d520a58c143001834b0e59cce0a9e0288b2845445001c3c4458c2d39dcc064031644f12207141a64ae9811262a4b0d4de812930caa168301285cc0524314146954e1812f98a85c01c39723b688a95c0460a3e1870422084869484774585cfe9c3edfa7773791516c5b8c3d1d63cf39dfc3fe6c6e1d638ceecf5d658bb9c40cce984c74ad34455d8ac205f2c9f6e4b2d118274da6b022240618da26a42b4688e102991f7238434888edc626a4292ed8e44b767257ad1b9b909848296756460762babb334ac4179b1b9b88389a734e5a8998d244c41321372a3109dd15bf687cda55ad490b1a396e6cd232a60579a6057926a4009581d4428b9313ee1f224348204243460bd36d9e1f279ab0bcbce02ac39bb42c71f99df52cd78d4d5a4a70e78d4d5a78b8218b291574bfe7e36ffdfd6d6fe3854baecdcbae085f9bcf6c0290fd1317eefdf475efd8f9e76f28ded1b1e36527e4757ce192abe3bbbb7bc7c74e888effe1ee04c8eb7dec020080ffe16d939d0734c8df5d1e0b1e7c741e1edf9617cadbfa4d729ec7a4e751097d79d43c0f6fe2c0810387cbe5d9f8d8b5caf09bee73baefd1bd8fcda5fa2d935b864817902896070faf03d72791220e0fcfc66f2c9b9b86c9441cdb85089b223284bdfc25b708e6492cfc6279043b415ed8278ff8c5f1966183628febf25326b48862e11d1ecf4f8f628feb19c7fbf8707c8f2f64dd0dc7e77ca1bd61bd5bbddccd87aacbe1f88debd1c3c7e77b7a7c011efc9ef7f9d8fbf8203e3e0da400e47b3e05027c90ef8937c8c76c7a7c557e7e84f7792ecaf9c27af3852afe0df4eebbbcc91471f869508de71a1faa6e48836a7c587dbcfb3f9ecf83de7479343fdf3cf2f1e6f5a6920d3664266f62431a74a9107d4283628f8fe7a72ec41e119e9f864002e1797eca44290261313287bf02f91f02fc7c4005f8a850dfb09120eff33e1fd0085f90cfc665538214e1e5900b9240698397207009188b77f3e1f575ce470f4fe67812ea8663d7f1cd8db7f33dbc017c8ea7f32e4f5e566a1e1a34292b89e1f16416f2c9935c7812ca939706cd23fe48e7110db7d54dab3e6a369b463e451cfe1b2c220ebf085ebc3ebc786d5cae20dfe3fa0802b5b68041be27c64c220ebf8fcf67e3fa7e8a3d37cfcfc1c7dff8368dc0ccd5f13c7e63bef96850102f822e2fe6bc7742aaf8fce6f2e48de2ae3e9c47973b99f4210d72797c6577f3d1a0909f6ecef333173c42904fe8419f2f2727c8badec68734c8a35bf8e5d1a4b845a6a9122405090609723114db781bbf45e9b16f6e3c891471d8e5d269c2b25e4808ffc3cc24f6e4e4f870c765b158ac8f9175a3c7b30fd7f308cf37af0ff9daa02273f86dfc56b90078a1bc01f8adc7c74e888f9b2304f8201fbb1480bccfc7ce48cffb7c4001d1c51f0b32080a4f2a3e6dcc35c62a2bcb2a83fae90f09f4ab01c586abcbb2bf66d1e94a09ab1f5b90d52bc02f9600dff0536f851400c91ea094e12108045212c1141105a65e894a0c0b96c0edab27811586b0e13fe9b87884c803087d2ef3fcc0b844676234bfc983db67943d0f13a3fa4d1e4c7d46f459c886486217e7089c31f6ea6043186c9b419412c8c384824d1e34aacf1df1a9114140f694bd263f584e1356057e19e1172fd9303ef553f745ec915cb378ba78d3b1c50229792746c9856c2fecc0955cbddab3f492f4a59fdce2a7e733194ddb9da3977e985dfae1bcf43df6744ffbd2afbc137becd397b147f5f439f620e12e7da75e9f6638f3551e8dc71e71e6731e4eca9baf79b3caca2ff7ca65944ae79fdc751ae9429b6f3535db26e7a281e914f1627c31b3b7c58e014b763872810c113061448516207bda17729ee4819070d756a9f1b6c6f7e21b7f15cde77262397e798d2f4dab1e5fda6f3ea9363b05f84da576522ccc4f699a46b5aec8fcba2cfb5969f6f1d22ccbb2af05a3617a440d97dc55b844bacb2ceb84b45a3eb4ecb56aad58ad17efbc8fb8f381f641dca1f48b31631ae39bfed7e1573f0931b0f235ae3b054c5aa9d615995fa65db1a566aa59a652a9a8d1f895ded9acfc922b564b32d324e7ce32f739e79c53864856d2e3cfc52feffff103487c452ef274ef1fe34e8c5f4856d7dfc5af1f33b0fea1ebf5030624ee8810a9173df396772c96538faf56e996daea2a353bab553a3b4f8991bf08b1274b7dbf003e84d853bf9fdb5e7e0eee8bf3b5ef8af8c76d59573d8d33bfee59f6de794c8ce6bf9081201122cde817e7fba77c7eee915fed1a4df4ebd9eb4767fe36452eb0ba4a5b14191465431f5a9a435366d1f5f7a7e64952e29ba11964e6ba475d77a8ebdfcf9827be89f7678c33dd9f314cb19f314b44d75b483611e5928c3dfd2c564d8d6311f22811c7a5c41b7f2ad77b10e3fa902433c4dcddfc320c1bca2519d8b0854a20c34625216ee843d78788a65c0f5be828296ca5eb4c43bce4745b7296465437442e5df985f34a6ff6ffe9e85f65096480d57e4c6463d86eeaa274fd4b10a3cbd1751eb67ec915e009db802df665c78008ce4e48d74f43e3859bea554250b0df0bf6b7ac2ba13f6543f3dda370bbb7a1a1799aec0b971cddee0b9144a6cb420bf343ce7ebcda4b14ac7d189680f683a1c6abbeaf85f90dc58d6e339f7e26bcaebfab4acdd7a8f99cd88741a552a9542a954a65adb5d6da6f1203ed2bb12a954aa552a9be490c547dac312c3f33775c83b6d825e892b9f26b81a27193f0070ae053e6892250491c238b2b37b49c804a564dc0fe9a98b9620a48051a5e1001c534ce18830854428386f43863d8f24212175264124e76c00254129f90924315910c134374e90254129fa07245524e127f25c02f39c60f608a1acc1827208a523471010a640f4819709b1c7b91064d60012a915135b0c0e328d2e0218a6661460c946a151f8840f66ca400374d053a38815b4a89a832a254006e1bd75e1c63872527ce0446433081ecd93c815bf7431292120dd79e1ce2053a2481ecb5a4809b4aee6006ea085432c20ab488f2bae02c5308c2305313849427a06a30e9c1a88803ae3d8924831822903d1d5ec06dc5746688241b529e28dde8e2844650074e3e24b1b8f6a21249481481f287303118021988282b4c207b3949809b0dd79e1ca3459623706b71edc5289c8832046e1e1859d1c1b517c164f1610ac89e4d0bc06d07d71ed00e14ac000a5412b98c3182081b2c402539845e071b28795c7b2d02a22e86be1bc0487afa806b8f71f0c28722903daf0b10a8ad40aa8109324025236cf912a5db63285f6e180279f008cea8a204b2678305a8846536464c41031b03d92c801755a2c04d3a8941c9c5fec4b2b2f6581187bf064a13336006b48501662ee35442ca32059cde1606185ddccc489a9394923b05623abbb1498b13f2ae22a7b14517d338716bdacfaff5ca6e9a409fd2ec047ae6cc193345e8993367cca822f4923e8d13123673b3a79c0ba922f460ead9ab92fa94b019d0a8feec4aa845b25bdfc68459fd6357699c1ccb0916b6c98faead491e3112432da1228bb3455b2ebb2ebfb8e988a0cb0cfba25fbe4d7f26bc9648f923cb6a85c11a060b63e5c7ebd4f9e5c702f317d266fec9ff2c64fc82d5307b58965d16b2d789d1efd80d613acc23c1d565be215ac98a60b78afbaaae3fc7efef1c5c7963c7c1b562737ec5f826cc2b3f1a277ec5af222b6c661b11ded13ef2581eeee377dee6c9a07e1a237520c9440ab5fcba0ac7ec194bff2999b9f97540061bea705e05f8a62530021a96d3e122842b6ca8a3c42c3f671fea43f418dd63f4e8d1638cee2e70915f72d5b2627fdc79711e98cd360f14377e967d310a208c5f7c96b0f56de8ffecee36aa9f0d7dfab53f3333337f9318c80f03508a04252862045256f0c41410c83fdb37d2dddddd9ddd4eefeeeeee6f1203fb8321f2cd1256323995c316b9a74c4f999e323d6580ba03b75f973d299c1fa844cd586439e81091080000000063150000200c0a07c4016138241652656def0114800c6d8e46665e369849434110a428886108328418038001c0104390518aa84c0022bbf2118ed4465a27509d35a67b9de8ee7649978c1b15e92f2325e8b7e0a9629160286172406da3f53e01b25c592b01f602458f56546a21c20a9bd2cd419436d6a58f4aafb7a581c27197f703d7f3c807dff3702785d228af3caaf425a458fc3e431d3d51642d780d78f0e195c6a4e7420d43611127ec8808aca7415b61a41ff60cbd38d3ab89871ad61955e3c6650f22ededc8e9eb72b538356323d7255219755954f055c656fc9d747c4755ff022d7133d0b1611e8205b25c43bbda8912dc61be8aa46845f2107026c84fbe8dd50c3e2dc310ae392d96ee211845740bc4d46ee815eb6c2f816dda4f47d8fffb0ea6c27558750601fdb524050d94631f876b863cc6135ff4cb5f22ce7c1165a3a1e31b97434179fd376ee3108171f759ac0f01d33fd3dfc211bd0c7f156f1a244f14394d0dd53fe1882757e344819f28703f2ea37cc1a3e105fbb1df970b656c40e1430a78d418805b4a9e197d5019199158314908c06d2475a4401ec1028631425d6546e6516e765571c7724328593a541e43b19d1a899a5b2264feccfe20f44d6dfa26e7c378f8fcfe1fd2f30168bb4a12078ba43639276ea6a1be030b4f79ef985badcc7bf6dd2b371761b440f891049879929d4d3b53a659a23194d856ad3be2bf318883c529a5e838bda5a574eb21211063239ce3350536c6c6065d44c45558aeb5b7656fccc293b9ad81c11b9b84de943764db4871f748021ab5c459da42be1972d372f381129a0bd3265b16cdd4ab1b4f1cd89f10ff7f0189f1414977b43d97ba77e327e27c3ca057431658fc2c36475c7885694aea2fdd7ab82b0023d55dd9320b64cbc6ea32622bc63345482de4937104545b2407eda05284e3cbf6564db49032530d3490947457bf26a2f30ff90a6995b270c8cdc1f40bc15843a3785bc5fc6192108db6759cbd115adbbce76919fe4d58ebd9940a770de2742c1d05fc0b461980b3a2d1ee8cd23cd69c597b86769e45a5e1c8df97196f01ec6ae6fa03f2096b144fb2234737a77f6e11993c3ae1be76196afa77fe8e53e6ca3df0af994ed698e026c654fba971125ca1650221f16b804224b038422db9f876ac1682849b26df7b00155b57db196b28ca21ad4fe53f1c3aa1b71a8a75faf17d7c6ead41a5980259afc03c0228814b4bb3e18bc19b693c5a705d161634c9b8757c43b3a2b7d224962bf12a8f166df303402d1e60033a2e2ddf105010970165f009eb7fa8ca0e9675392552bec667e8666f56b355c44aba6cb44c1ce75f983aabdd1ca45f740222496dfc9d3a6890d07046332e640f4fe193380a166d31cd1d1b48e27290961691c4dce37860ce89a1f2197e753e6d46125b11ea2bd68eebc0d88adc80f1c946cae6acfc69c71818eb5f7e0af66eab9463f27df9650ffb6708625c32300d07f8f3d07d0236f00f8ebfca9c0734558ba5d92562c6b6b3a27e0b05b13d337c84dd74a8c78cad2b8822be32760ab45909d5669ed9d47a898d6a2f07be67349ac1a476a38cd54045aaf47ec30395430cb81fdcebb47822293a8f0ff122597fb91e6119ead869f6ab4a78cb8d21e621a1de43dee96dd71e56e99eb1fd0377ab8ba9518eb68da2eef1769a52f2c4505769b7a1138b109afda393c7aa5e3e90d0f14a4c9d9da81084ae585bbc48cac00a41b9c18e355f81fcb5ed73cedfadabdef61b50131a6e610751752f0f34ac69f6ee963cb1bf9099e06cfd57c1d4f1ca5073383d42e6b124fb9adcc6c108cd9d7dd585229c4328855c77e7f26374eeb4b2f09222db46b5b83be42839ceddc108eb5eaa1837083a96eac2be4fff0c6e6cf3c8a0a07e89fcb111ed1080896d22a11146679aba3c08e108d7e043cf0fc0b57970f70e274b408586050b29f0255f22f962a6f13a89970b5191d4399ebba6c5e6b9598e419ff8361a958f6c2e123f96e20a523c8f8da105f0be0df778c4b217974dae592cee9012b8de42b9d64f167268429147bc280f6e633703f60e4f268037813d96c9d3b5d8d37879d814c561981b536ec423b9b2214e19806f2af53b840321182ce4ef087250d61caa1376a8a369028ed8ab344960104b717ae84f283e5a579d65af64d50b6385f36938805ed854d250e7a734e348ea20384958ce872eb60b06098ac9c1e31ff50b1b08cf3c06c3d3325ce2342c992f3d441ffeb4f93aaf29f853c8a67aeaca76ac5d67e123b56b9f4ae03ab48cb190e15239c6af3694728f52017f4d15062740adb52c5aabf97feeb7fdb7ebb0f64bfd02a320a83ad5a29024ee5a361fbf194eae4f694665a3684e8874594548180ed03e482748fde598caf700b1854b02c203b30d11c87d5e1bbf12bb7dddd6933d66e6f8893fd76c0e69c2a01db8406830386058349dde226a0bb411ad0f616ac9762e444176e3e2acabb21b20993d2ce571fd0f820d3b3f8131ae0fdcd0930a79e2f759a24e70fd0845acdfce54b2726dd0cfea10a39b39f8ca37615b85917a72f0481843411fb325b214421c418556c7b4573c1d007cf50c321d516ed82742e065752284d2c4c123694962fc20b22ceeeb88959743d6cf4ea6993ed19ccd2c9531c366ec47d087095a0f5bbaf19c0f2868c3493553e9235924adb142213af378a5ad5784d77f58b2e4166dad872f769abae98922b02088b035f68e8e62f7b517a2c431eeba287f0ab7b02913124d23ffd1454734fad539770ab29d593fad65b78f66ca33a83ec628da80a1844ef4567a657b925ac9bb1dac8cca067e911737bdd1abad80b4e2de4b25ccd7e580d703ca4d8db6d9105e55409acc17bcdd37c075cb38d29bc0657343ae40e34db56b5fe4d30d93b0874055c9a2960340634761ae889ad135b5dcdf6907ffa685cd25ebd89e2bfd6a05a4bf7490052550ad80f1c7bb946ad9d8af1c3635277cbb57bdcea20da98aa30375c6f249a121f3ca941f2252b2ef9625873f2bfaa6f79efb174120be2644567f679819e501964e542fedb2f0a65c0dfeba047479a7c4156183b13f53bad4885bd5adf248fb592862a186f9643940b34025aef58c402c66d3f3bbef9c8260784643bc255352490a2a0f9d06bcb7e9b388eabb53a51ecca63bac84493c9bb13e05cd1c73e48a7342d8314c8a84a81f66bbd7b660ac61cde0a8b4c13b514e7b5650eb040fa8da06da9e4475a3efeb35c5721429f56a0e30bbe929c923b3b247a01fc00cde255649d27e61ea9cdc7e42133cf156bdfc2068f4dc085c590761487b223bf1ff99814085794af57373fa36d4fbb7d7adacbf3daf20cd31a5ebac13ba2ec265cacd5ff08a873a53f1079a0475cef685fafe4ca7c15d2c5a80c7cd37f5cfb3fb581f06be2782a05f7f32c55d1c5f8a9352fb1cac91d6862b1f1dde0e47e6efee6f3881909f109e3589d37c0e61735693e3b9d60ebf4f4e048f8126323eaa7cba552c5ca35a2e6396566f88620d559c5802a94f1626b2fae62ff150fb137ca8a14fee18f5b801fbbedbe997dd3fa5a071f38636dd598af12abd62311970e672eee9ba24bb7f7200fa86251188d67c3a9b386f95626d21e17f0bfecc6348ae297dcdf2f7572275051dc15c382044dbe0c958c8a9f9d3eeec197da486405fe3fc2313f2b17d8f6b66bc028f65894072d706b50a92e08b781e1ed68fedda5b0abd04149c0192c8c525f7201c692be21e9eb6fc0fa3f91df4ae7754796f6438721269c0c1f15a01c2ada8cbe21b0eeab860de60fa8e3c267970311f343f721fa948ec1d7906b3a420f86ee2f08e2cab670995402dd7fc8ecc3b96eca1aa9f7cd5471e69862a2db296cf047dc812e84221c382fa6ba1080bed3ea2738c68a17ed1c1e73a8450c39ba5a76d95bc1c0480310e91aba6ede028966a2912b54f32b6a26c11a381aefa35cd7776c574c532e9321d53cdcf9a676c2726bc2b2751530f8cf4831011fdf1918360b5203f607843a47d5751ea3c100e8bd282f5ab0066127a943947dd417ff1518102572aa19cc8ee1809f824c4286e4c801241cb50d00e16c7e64e9304c1824afca814f93d4b850efd865e757926adbc71994429f02e4e3740f7b3ae401701f3772a8c184ea4c1f56b857c962977d9d16f0b85d0eac65790bc205643ae6d7ab1eb81269e52b68c1e8293bb4a806f98049eafe0e2b05fd935a72488a6598c53db4ddbc19545c3ef99a40bd1b3ecc28b8d17a7f0ed4ef451f60728e00d40c7438cd74c69040fc082679a62b3141e258911e2f87ea16a76152dc61c201dc5046b7ad470e8dfb9f0ced081c9950ddbb2e6e0c3d580827ec41840449023fa125486673ca89092ad84e2512da95b4012ca1fdce9a24e8082da0484011580cf29731075bfe104bf47f80449c3b60916211d1969915b388e27074883e1726808e4724e903ca327c2d80d37743dcc2b449a49e8a413f208b07439c578a0a96a5427f7939693ae72173370d4953ef06ccd987600a055fcfb2bd16dafa020312fecdedd89d39ad0e0970d8d6ecc50818afff2575e1d063e2579249a8fd43f9c174d8e6cbc5663f05b23707d67ce37c48e9d84b4cfdf30b0d25cc8ebc408fb957c1df338766697df9f88d4f1107f9a0f020d0c0150ab62815950390446b2c64fcd68a0fd943709e396b6e99bfb512f8de00cbb12100ba00f09addb7f4e80a22cadfdf5de41f21dfda398ef9f494c3796c358d88b246eed4177ec46c34444486684fc8ec842afc9ad799cf6f3fbdff7610987964f43ead0851c70fcb5fb8a3288be904aba9d9fe14a442e7d565af7549cc80d993aa9f6cd6df644e6e93b96e0002fedbcd5846741ee031f92d8fe894d80091120647f4bb619e7c32365f18a0f1b40fee786231333c8e20a5bf1fbced0864aa01152a2c540a9fb3764acc9ef388d855cc0f359487754d9dc1d21129e5f532de3474acafc6d86bf85b1f297bd4a3b10880541da0e4e86d6b93810115f1b18c0cf8ccd8a9a9857db1fb41a402d0adb94d9069080291276a7b0f5ef841bc7d62b7b96ccd6f2d5185b563799f808af7c99ceb33103a203a65187075349269edf54bd9f76a0dc764588d0344c674719d4477b6cc1cad7f7c3bcca9b374a61420b8f334eb45cc9c1f6b6c9cbd2a4a962a8704f4b8c8a08d3ebaa7804cdf9b2caabcc9e44cbf4d3cf1e7b3e5343d240687b7107bf1f1825e574432946061089f6662dafdb66366b0ab6937b3ae8f0c941c15d06d64dd35140559b68f6695889a5bd987df32d24174495ac456c88453f09cae14b33d436c7c3e3e53183ffa64738ac757742341a927e4468890c3dce74e7cd27b74aef63200604ad78ebc758470bfd3a821d82b0eedb7aa4c93c1025925e047bac6d8b5131bec75e7d84bdfc196f51ae2270bcaac5822604cb0d44f3a65d61d6cd5d70d38ab5ec6272527030441ae8decdaf594c4ee69e334998fd9c3e6c84a6dc5e941144ce450ba636dbf18146cd3318f3777095cf4a432f93129ebb1384f088b21eecef0665cc621966992801b32949aa303b0c4e9743a2de30e4b638b98b5b1cc430ff5fd3b2293ef7e6d798e11d6a42b6ac9e81273471c4685aa2a20fd0b01bed53a7be34f16bdba4e92741f58aab4c0641a6a3842b193dc3522dcfe0b10bce7cc1643a09bb7495be25ac74c50970e1b79f3f1014102186c7c3b7a1346d7e10af3591d7f953581d0354ee48f93358585e7f87813b3042030f1b84e2804ff73a5c22f182ed551e5452527fefd7729eca8269b7585240149c11b4989f33c58df511fae285d89552b0cab6845413fb9f1e34e945461b59054d1f88f6c69a40694eecf211af999ff32196ab306a4d42db703a00a35f2f53222712ea389e1b87daf63e03fbb6affa17101ca21dfb56e16b8a680435ff1bf1bb519229fe33d11cff647cf63debd64bb4291ab5c74fbc3effb965204465250675184ac1543a19a47ddfce78e65909add83ebbad357fb0451bc42d156db031bdb044328aa7e5624006af128c229d42fdcae25c9e833acf89ab3a73c53ca8459671324f5afde61e6e23f6530207b1ac3dffd5570b3b5faacf64f0a9aff3fefa21147b8fc863e824d10c764fbc48748dce0a9b74cb25138945984874d36b2d1e3b749f26b05e962c84836825c55fbede0e9cbcb130a3bb9254a90c753f4d258a2b69a114cd456aac018965aaa9f478b6366e7661b553e0cae8669cc26834f8f5b0d2cfe6bfe8aeb7580a1338aa4114fc513813da4e9aa2e3fa35b8a24b7337d24499f28f3e518bef050ec499ba239c651fa99798496285065d3ff0c161466cccb33f452669cd53ca3ca6e5f5de49eea71dcc6d23f730d9919e1702ebfdae2018c200088b8730a5b3a5532a55d5b9540242a17b10f99ed621f85411df1311806e4b495b0412ea9897d94ba140b17d28f73b53686ce0b693f0c72fe47e6d8e73a1fb439c177ec7d962ecbd72e2c87da21dd5f36a9b025d2616f73d2c01f004bdfe6c1f9b249f5d5e5165f1c867a9163f4871d6bc526b1df6dd66897ecc7f8ed687d4f924b5d42f3935e00fc9644845895fdd098b61079e9a3fbaea4738eefeda5a4e9ff994bf74ab2cd5a8f3e0225945555b14640a4e04887289e15f91fabc868824f7f01c6df86b235b7ac69ee925493491641f6e6a3a49adebc7485a2d3af2c4ea4eac3727e2626fe98255c0c39389526c8a7275227957c7881816d9a73032965e0dc6a87d9b95b073478ff3eb94d95b526031cef6fcc72a1623dfc45116e81f959eecc943feed588f12abf1de89387e77a4d211a8941e38cf24c389960a03bb9cc256c3f9ad5c0d7c88555fc0bdca5118dafd15d76301286c6e178f441442093175d0f6a3933684032a7338fe9d8ae6c661b5a8eedd5bea56aea5ec4dd06e38c0c7fed69633b786d89ec3c78d77fa6b170664ea3e3eaf81186a5acaf63989cf59fce66af1d3cf695a8c4c3788efcd2d8d9e4da5a17b9eba6e7b46f2dbc44e8f74c6a7d494655c88bbf79e247239fec11ebb58453e79768a43d9aae22769b1ce4a375d621d0b940897d4d75a77821007b5c9b2b4726bc81fd96955d0d0d7a7d7ec94822b7c5cb4247200e47c866634d6aefce92722e02e6607843811aa8b3fe92187eee62aad0642a60930cfe33890c9c5838419e96dbeae63955472ef96d360da2fbebbe8ed21dc111b10fd05e5449d981d0db5f539268afd3e08fdb6e40e1819d79462902f9f14a9f6882a294c45a8cc8bc2c3620a2c9e70697f1c9c36d2ee976b6fd63ab6f2a99221f0cb2431aef9dcc821d8ac7cc085476a5fe6c9b96d2b8dd7287958161df25032654c355795a914bb7ec977a2c1601812bea5350d9cd8d211584d8481c717c27c7fd5b6f60d9163a7f1cf57fb83217909a02997cc1ac3544fc3578992f75eb1a09ec245dc47bc868887ad3353dac4ecec0e105fc4cb40907358fb167927197ad743965f88ab1156dce3853350fc4443b4ea42ea587aa988f8943ca48a32455ce51eb75c405d3af73553fc70e0969a82a7061c0689f86664aafdd05737458a6c4d5161ec202a95cb783afe0bb2072f0cd785f972d96349465a3191d13491162a19d13252eaac4361888ab289551939baa3fe6fb7435ca83469c50dfc487431159168d00ff80c0288891855e9ecc715ee2bc1c403ecc1bb37d2e7cb5a108a358fb156a4798877c30cb2442ca07f45dcc45682552b890ae827f40579f09275030956ac07a87c515e84558354e49791d03f6ca54c65fcfce6c2a58d7fb8cc25e0e413e3b72296cc8f76c4da23b1de8d67d1632bea0b8be518bed39902b8d2b15642ce1303189302da80214a34b5dd2adb6890963fbd6f903bb62e08dce0bc8006cb020afb8b756132aceb1569dc179bb71fbe1eaf89d1d8dc8848d3fc75fd958cac53a0f708d22bbdd581871e2a31bc3b69d869ec529c71603a7ab9816fdf8c1edad61798a447a41bb2b2ce24db6043e6aed729aef1e2875492bc4e89f520e2f31dad69805d4f753c7a920dced593313219aa16035e3aad1f6abbdb21bab680ce9080ccb5ff66ee36a804349e124876673f07c8ff793034aa5c8f511a627e5b29cd5b86348134309f6b38c2af09eaafe63c0017af9dc0283c4364aa14ed894e20996fb52bdb192524375ad19e209451c65d957ce257c791b33ef75ec0269f316a63e0b90e9cb84f639f35b4795944e9d8aec895f31a101171d4086ac37346de12b89ed9ec5fa689b4c5f03c9a59a8a2e29bfd15557a303d9cd70d8cf48de7417b64f9fbd207d616b586f23198252cb18ee71b79e63b95382e9186aa93432e4a9cba0e58ed7da3d84c070dbe09701dbb5ee87372e14473be46124a468f540d27747a887415cae160debc68ce35c6953d15ac2705b36b618b3527c70ac60c19c3eef75b74e276e58462b37f5f95895674f33c5cba5cf4c87434c017935222a98172dce157f47ca7fba3eb9b6a054529a6bddace09248fda91d0e603f8933eece81f5ba768e149748ee89dc41081beb2ad5a72292eb58e52a31e07609c8a6f0327bce92216dad5bf01a901a9ceea9117bd1fdafd7dc3a6210ecc79a8523872ed3944aa8f00f189e45b2897f8fb9941e6f629b206ddafd60067bdc3fc7b0072ccb9059f2b3fe61c709ae1b51163858176a2f9a6353e0530055efd4e81d0aa29176d82c5414cbbe0e2731c6f9a3433e26eca43c739e19a8738a45f9c1c5e0c4ab4b1248236da287195323521b2798e906f2ec21df4191c7652058da55554acc2b4e13c2cee52f7252dbc90ed9739f3000042a5d8efed741b3497e34886b482010718ff89757b74361d51eba1010bcf40daa2afc6cba5021b0d7d743f77ba967244a3f64eb4437177ff05e9a02b2ea519e2324b97460f1c3bf2b936345d81f56351c9693f349ecc0295ece06136f4de4b44481e7fab156526baf2440843c2a6aef8c31cc1e68994886b6027acf7a6d88c1e1056c5c023363486715458d5e7fd0437a004954d92423d88953842907f241d23e37b6dbb0a45d4412b154682aa3783b203d6e490b40631f155c965f69dfec5022d193df9b618a22359e1ec7549a1764ea43ab9190548b037de00a8c440a0dc3000e4187603d990e3ca805babbd1a0fb08bb5173e91e2aa3f4bb0d50314df1ccbc9aa51b381310b2b2cd004535306ab8be8bde9da6a7d3468c4157208fafbad34634b9da9a3552353a47f0808390961a011271819e5f4fc13821d85e83a6002027650ae5ca04d042d552db861f5b4f404db0cc91d52931b65d48d465967b6b6391c82770216c3a047165757fd8d6ae8dbd245e350b8c07ad32d3998749badd8883c4491537652b186306f5e139603402867ac3c05c959e00479cb49c6d0312a8dcd9aa9aa6b765d9e5dd8a2dd1134ebde98e7b9e53315026d42be448b2bd1ae1c5f690af16c22d2268bc64e375a8932781382502fd7c383d9032d5a8541b510ef66266128d2f4b369a65cd86352e97caa1969899adec41e9be292c42185e77f540883084a59fa3302741f1c7400dbf088f5928a7e121f6c6b20ddcc21a285cbf96ed4a5a06c9af10a90288ad38ad3fc638d9b5483f9b410f73716ba7244d84431ff37b57b0c564c2d4f1d33f69b48728ecdfe7441fc00c8a66561c6fbea11e109b9eca21051e8573b86309fb8f128969c516af94344e413fc9ce53c12ebe1c10e1fd1e951c679680057f6025caf3888be6bfe1b75121a40a1261e4a5a22172286c3f246b012460bc00cf4138d44bd1d656f0c455113b20ba8a540beeb7813ef98f434d73d8c2e796e786630b586115a16feaa5b2664fd7cc055beca73dee1ff84c2627963cd2ed1cfbc27f1b5a7497e20110a08d5de3de443e15473b3126d751bf5d05e6ad5068223b61fbb4d76a1e2039ae104a8eacda2a83e2ca44979cefd2ef925edc8945dc0405c1e87d6f88dcee41a4a1de4bcc102d1f7f0a178017008e8aca0a5f3f40af31050dda06de0681ca1e04d41c41c2e5aed4be6dd749053759735f3a0f6e93e34d7f7f3b15c041eb400606b20447c710aa5963b0a0d111d2e92f356f2b1301b3463102074bf6e1d0d75b9222641cf28100eff7c32d78121e173eaa1bf91681227049f5ada3698ff63b7d09aaf19339dabcbe03d72f00a3d0ba009c0ceadaf33bdf85af83bd4b7fdac3ce1de0f2864fc885f532b21fd571bce0488004cab728f10b7a1988882ca5da89decfc01fc0e6a3b1fed9dbe13f68531d0ffbbd477bc3ce9e0c84cde0e3c1e8a7f4b2c0a3e155de913b6468c4860d4e26048afe0f703ed2f55c54cf3a7e0edb7d39ea4be8176b53f19ba5d41363477e695d513b4110094d13ea66a28e66432cc5fe4398b50d43d2f6440b12204ea3c9bce7eb3fb8900bba88ece7248f18d9c79e185261277fc60e8e6b31f558d329102846ce07db97ceaa7089c13de6adee1122ce5acec09b51a78a453d572476443a2c1e720a7b7fad9b782e70d60f4b8e37d0003d2196bb2d06f72a1f9c3aa68f10f11916dc3c3e8d1bc60ab6f262ec498713149ddfcca9fdc041b9efe35488efbd4bf7a0ae65b719e95e9b3468022b9dcfbe297b3465cdb4b71f2a8cb85e23cd34bb7068322ff2731fbb217b1a26feda74894d88589645986f8b565cd63aa83f77dd0ef9a3c385053641b13a4d92710d9432f7bedc7d78dd23e0dbe0a07e141c4e62861a0fd3088fb4f0d259f4f09b012bb4c98bcf461500b8aa80e93d264c663bf78e45899bdb7b36ff32b5c47ecd5f94fae177a7a956fc5a408946e60ebb5fda1efa1d63e74951c1e05eb06a6c0ea9f497dab49d9ea25a5701397fe520d270a76a41bbde614523e7fe7bc710a766d5503e5955cc5453031277427b83e97353a18bc4ef4c282885e50d8eb2d1375245c4821f4bd72ee0da7baa6ab7bb23f92c1756362ae647b7e3b050de190d240d76fe0f879355e71a85424de25b4f86175942124507cc18a090cf4bac8cf795864de6f363134d205d17892499d32338daf0bcdc92b485e1778e67519d8e22b73b8c5876b5f3199de921aaa191295a090565c9e37ee58fca20e8b7f2e7af855187aa2b38eb5e217aeb506a0fcc1efa1922f511bc5f2c556b7809664f651083263bae2583f5fda3dcc986600687529da546766ad830fc16408d3ec7917aa22f098685ae373255a1109930f9b8534464644a1ae1228ff47724c44186b9fb8724b8fc59daf8bf6a2a4018d1d28fee47091d4d5629f4ccfe0885893c6acbed612a359f0068928b893731b9d1d856546dfc4766608e061ac859d730cc44362710467eb3fb77619f8fb1f740db970c1d7c25a59e3177ae7584f0108d5d5bb999ea79c6fc07df575a10bac79c092f897c65b94f0d5bc1b6ae3fa1bb7e70874137391acb9f75377126931325cbf1e999ea8407ed607c5b23f045b57c22088d175a22e31c91abd197056b887045cd662f0bd5755bfe3f808462a00e4d1cc4aed188b254229413ba68ef61d125f67494b670f89b5c0b673e655f13a0d321f78dcb80ab706a968f8fef3dc13a764b9e87b0a6826619a545cd133e4e23f9dd2f5e9c2e16da0601f2f68480d7a0539a7ea9bf16d6112b57b8ed8ee8b567f4002d7cb55bfbc2b598ffca4c1565b06c28e696fcb1843fd27c4f3cf7a344405c8f896a58c49950b9f897e75fb654029e7db5a74367a47b23ef7f1485cc6b28fdf34717c47265706dbd4cabd14d02e47fa105cd04a4dbf6f12cb9052303495ec84b3b51ca5cf66f4a948f466d5ad633a1bc5a46338632dd967cff67f1ebea432a0300adcbdbe6aaf84778aeb0acd3be2b9f1c51a74acb6bed9c4b4ea14416c55d2dab26af6e9935fa303983ae4740fcf75eeaff6cb9f21bfe7fddabf679b7271692f018b7e01944bf4c81e594ea4597a02b9fd4153f6207657cbfe6e54a4d0647d43a9941f7c017d1c225369b244f8c48f4386f29a28f9a7ef7bf34563e975d4a93ac7679d883d31c081ad5ab9d1f87d4fb511aec8f8adbec4d1cbdf2059f5315ae846e6220282f494b26fc7f20de9b2537c0ef5e37aefbba74197ef7bf64127b3129c393d187c9285f13f316e36b5869b0825b3c9c3479aea30f03527653ac9d7f7e469a8c4624020aac76b8d7f0f782818db61d0965ed15faa3d8c1de31498057160e615e32ca80edccd93ea890335a4c1b3e5915995e2fb9dfa54d319ee9181eef8cb94a358406007727900f0fdf7ddafe79b8f8047cc31ca889152363dbea34fb7038ea50fca0180f79e234f7522911b5589e0ed7729f90ba07b56964713ec312d7dac905e9fe207f06f3acb78726a2e16066ddc295716754a465297b6ef7a6fb8203fd5efdbe1ec9b56d3631dfa25637f3e8bbac3a8b10eb4bda599294f2b2b50ce5dd33ee28829a6b109c99c675c0b711d7ab02837aaacf3b228fa1ef444674b05e8c7ebe919ff77f3efaf4da5c2f02a74e82d9088d53f4eddbff86fc76b43d46137a3e586ae7c31c9550dbe452fb20121e47268956d743249323ad1f4914b97ae171a0eed2d0e7452c8ff78fe470be36ef09f8c3d0e61e1f990ed1e01f83590e450a74fbdb011512b0d56d631b8822d0a276d5e4262052b1c1ea109956311fe2bcef7c7b5253525930b464dfa4214d4d254d4d07d94537328ee0554b4b439942255fb7bc8f0e2e475c262f0378cd93fb8ea1e53b1b86dd6a48a100629af05961e7f296f5f12bea98007424d126ebd07f4b64e1cdee4b8b1810902cc4d28103a111708dc4f9e62b3da4b35ac0d14f6cbf470e5bbfa513495cccb0acc3c7b7cb93a25f854e2ca702575758b02b4642e4edb7bac99aec327ef52926c72ad28a8039b81215c257260b941001639306f6de673cb32916c9e2166e746e2c5a413f0dc38f0b85d856fba917ea40bd577aba8e4335a2f37f49b83605aceedc9d16a32869d62c00b16194d4889f80d10eec591f51c5886ee5eaa9e8438403704dd98f1ea7d8b4fda10f38985552c315bd67e428c4e85d89fe64412e4b70b6f06f6230cb97359b09f4214b366ae1b850de28f360492a2cb33f9599d1798fb46997bad99f868247c87cb80b5e3c3bc3128f2a1ff9b56bf651e730ccc994fb62f1d4ed60335498ed2a344166e17f985b91062736fabc389bbd20a9af4eb839d243bd9a94006b7b5bc625f1815b574432c519c8c0e6d325d0d107030321e70dcb6f63ef5b207e4d4c1545487a0c71eb540d8e1b29447d485dd0f66200731526f06e3fb9b8b96723b4fc8d877e5cd47eaa3c523c24eba4654d561d7ade42ef514a7d3307d0a8fe8e13bdd21481242b3452a498d6f9d0d67fac861ae8695df2a1bbaef22dd17863177b63c990507ca490ebb5e1129a4cbcb758e41e6561ae7e88a2be31719f61eb9986c545285f10bbd96e7ef76dcc3775ce60c80bf9b62442d6d993dfd89c460a8e726748897c47bdb947f33c1af4faa5f87309a6d0bb27597bf5b34bc12e4d3bed8bbcdee3e7f3745e9ee88cae4c19c46caf54e4a523ef914c66ddde554a844c694ca5b97bdb452a9bfd9a208596ba3b5126011f476493920c0774bf2e68b71abbeeeb0bb72a80fda166f640bc39d9507a362c5c8414a53aaa2e8a6dc294992a29b9553111afef8a3303ede244e6b7b5714083f34e126245b5ada38fbecc4ee5b875be0b3c30af7cdf3c5b2cec98a812eb09f1d279fde9af444769b42be0cb3ce6ebb2a46d7d4c72aa0e48aa5136f8899fa02d2db11da1fb0675bda0c7e7dcc760b782938503f64443377b69a35d2f05f469b1d38f93f046722dfe013a51f1513adf2617a4ef896abe444bd698e2fcb4d45a33e4aa1f3024ace8a071aa427e4a9591ae83d155828f9f51d112236f3b971034bf2d3b1fd797d469ad1a7114dc80734629322ad682c0c17031abcfbd41cd0ccdcb45cbc7c2d6cd3018a66c243f167760ed901921b0b14a2f5c985c855478441c2c59d146ba6782b77ed16b8b70a866d3e92545d36821fe24c65fc34f2a472fa878ba161aa74e7deda8f1451418ddcbf3dda510d3ac9df2046e1dd50d306fb283837db400005c129eefb64509f37d20b1bb9f40bb1c0c47d81b3334a04775bfa8a7c8a04c3d3651eb2e9ee66a97ccfd4866ebc8f9e6407381740d3f93e12168d09dcc606806350fcf0864e1e985c7b031cdab5dedf64296df04402daf680e20188df75e2371e4ebcd4cb6dcf044a8d2bc8756b04865addcc7e5250888572f5dc49603e323f346b50b49359f0775b9b440db3b4210775b97f5385488bdb4d40913c9b923b7b6f218f24d74a6ce19f6553a3e101997f141c708f4253b704267832db9568b4152509bb3ce0479429f1a9a3432f48a75b36e079086a17232c1577664155314be45ea3aa734f1049934d60eea058134c07907f149894c8b350e67c8346da2a46ef92afb984fb6c7c709bdd4e771a153cf50c6c59a884866b0b0ddd7996262841c7ad6da9278372319010fe8435df4e51cfbc3e32688bd1f12324408f18446d67d1245c8abd346549c2a0c488098568a4968cf4b0131558cb15e3f1768fcf1d1d44aac5e091e6b74dd67440b464f228abce75142cf8b8592f4f206feac2112eea15e6c718cdcece796bc71f3333b98fa79993d7ab0089ea4e89c65e0a8f6e1bc4807110b491e617962a8246a444dcf9e2b90df1bb53f02a21f87a25585baa444918cf2fdd251c37898684b53214e596dcac0990451afa4db62678c028490f201eadd1f3b9c70713267e8921a7064bce82d54661887e3ea4a71a71e24eff11fa164543ea458f462b2f4b1a086b67613d6b01bf34af9fcfd8968035797c041fb8b2306a3358174a743fcc0d1ebf1dcd253f34f4e46fe538478fd240e648ff32b06243217fe3e15c2596c85830a7f314c050eb7e7ddc42a9b5ad57d662602b1f8ea508963a0aee242f254129eb4c8e3fd36421cfd0de080aa2772140e59aa7312586d1ce2f60a7f2b6c5c8bbd9e5ae01a3b57e3e6d3ff753478e382fb01a9f7abd3dc648ae00c781cd30dc844bd6435b403c08a504f14f8aab092728a89b5b5029b0d27e25b667834ba906faf71de932be9975660a3a316e269ee1e60f0c5e6305523d4b78ad230c9859163ac611ba8223646e3230b7d2db7a6cc6c6eab84843fa27ad58f27af001e5c66675d997afb3569567ed32f04281b3b6a3a14880fcbb7f22300f246823feca2db846ebc38b5310a7b014af7fd004e8bd4d022d504a6d91a0efa107745e865e527d5b76a4253a8f44fe7083690c67a97bcd1f6d4c2cfa992d5fa8bed62672e7b1a149ad80e41e822315790187d63c91aaa027ecaea77789b7a2269db28062ea9e1581c00fb56eab0d59c87952a2f3ce13cf2e222dc3a5e42a5f9810fad8411af0339c6fea6830cfb6de12bf7e9e255619b273678f46b748f93c0cc7781719810c59fd520abf723e5971dde1ab490afdb0d5777011f7ebb31bc31a36a9155dba8fe0a589474ef4a4b94e807b76ddb9a91b27001340ea012df09f8c0d6dfa057b0525c705dca2c786040a5326e960393df6da1faa9211dcb18829da89228491eb0206002d5bfbe57f6112db6cc57a36480856706a460761de80a3d709723122f9e38e2934b46263b1d6b0188cb9af04cc5853d0dafe9f305e26bb59fccb70a2002a48fe82451367a38014c110c659507f8b2f9744a722f52cf5e5de606b33dd5d046cd8afda451d78344cb4fd017bfa2a364c308cee0ce534984e19622607899559303e953754effc444d3a24007cc026ed0687017faafffde13f4cc052f2a47b5156cd45ef017880a2204ec336854021f6e8863b26b62df7439f528b202741820be46943ec8df1385a3efa5c278272390e5006643e9f6c9388a06044a1188b25f4367e59f5ab41c47f52e4b2307aaaa241ff269b28d82091f036a13125314e74af603dd1b2c1320a55fcf823b0e496a0fcfec98c87172d4f507eff2840b634bceab89adf042532740b4579fb557032344579fc2ad1c994238cb8f7aaaf5ec9399cd089f6cb88123392a6f1547f199309c9a4536fe9a1fba3b5558042f1ec04612d99936e1ade2450c6f0fb12e8b7a544773b76b0a755c4cf348b88498bc193207dccb8f018873a87051d2277712b2f156620092554de7fa3a301cb21ffc5e722607bbdadd47ea6e50a06f65e46521833c49c80bcec09fa66f909822a2f79bd9fb23d1fe7060fb26bb33c8d512faceb4f1ccd403a1992dcff688cd71aaf425a338469ffb2547e4fac79966c118c17948bfd3e9be4d80fc288e76f26745448f5f4982df4de20232c749b8230cb6a0692c67ab656e5f2d6b2b2950c7163c5aad52fedc0211d81097b59cb4341014563a8689c2106db6157fc5b3488bc02ab1adb6312b493b64c48a1802694aa605c5941fd10d14535e954d46264405353c3c6a3516243f2c50f73849d24c556c5761b813507e8bd50ee7209df0529537d5b9a25496d96da82cc1f163cb68eda9890e9971c6d5b01c085cc585fb9896c4c1e3aed110ebf648f31a19c0ac6840a763483aa51a2215a00823aa58f5b14a94fae5a710524e239328d810803ff4d55a1693bb59b6a084854f9a89446066954402240537aab1a74947c07451e76e20d7ed08bd26243c84594caf142058484de938ed5a7269faec1373f5379b0d7ff4c1e50bbf1e6ac41188ccdaa269b36005fac7e8f79814e9cbdbf7f1dc39ca1ff7e9848ea608dd729b430a8cb0b8443301b777884935ea939bc48951226942c8eacbdc918dc155173af2590ba543644d77eb5904ce9ea770429942e0def0a6737a176b8260733993232a90b3422e28afcd830ff5a356bc2b268489783cb149b569b59f84cd40807780d67a7ec011ecafdfb7911ace189565538f867c76caf529f544b49be6075a112497a7590a11d6ec757015c0769385f08a4a93b526d1a73d585014a555f237fde5df88fb67c8cb00304613649d5b76746dc9d04ef0c2800a7f7d44e2692eb90a04aa19df09f6e89f843e7c5077484e33e8188012e5ae4f9f0c97a9eb331839c92f22bed91e2077852eb925df25f708a323283bc149a3c30c24db066f8b3fc1fdc7b26ef6b10cda4beb2b251d8b1fbe512453bacfafe30701fff72e706189768a8f21acfb84447e6ea04e30b0d39983c21456b96e13f62d0a5bba669fec1dd66970700b52ccf926dbd29a696d8e7d73159f8df214dea95ca22d8859e8e54c9a5d615e81c5906303292e8da4c2d57402587dadd2525235a09be60df89dc601592566a1f98dc60ac33248032380fda0dd1bb02fba8e9229291e1ad9d3509e65308a8ccbb583f638ca9da4b4b8769b7fc9b2e671a7c45d1f037b1270205ccee945aca4fee73e4bb1c7afd4119b4b97c84f61a8ac4e0f893cdc031642853765b9acc83364dc6b4eb60687633f835e6217be421b33639e637f743ffe1f2fe7b72c2cbc320a75ca2f46f5b1e90e89f53bf4ff3f20ebced71f4751b0824dce59057c8ec03cf8272484c2bf296c31cf1ca89c609f7f060ff3ff2d49a59fb96a4205f23abfd617928cd8ed789ddaf6ee4c0d9145d6e6eb0ce8e6b25c6b541e4f80ce7a25bc7d98270252a163ffee3b35b5bedacfc130f22f8f2834e1224701a4cc29d2e4f04bdf8e449af93a873ca6e6902fabec04a617be8220f22f86bea8f0ab2955dbd506cb262b63b0cee0c8e6c0c99d6ef63b9a31ca78a1ccc1e31dc26b51575a038f8aba8e5122b4693df8daffe2312dcded83abc9cd3d4c9eccf91a05d7472a3ae12af7498f17a554183dcef49be6e6cdbf335b132bd3f29e9ea48f7d937b407799c67bc896487ef77a108723349ac31f8b0d86b914374858590c2db1fb8f5bf769d7defe17d4058915061ec07019750f8e2c9096dfbbb4a1deab5e9140f7223f37ae980813a01dd6297d1d5b05a251212eca298dd853f56ef59b81a68fc768040d99dbfffa3545ee0607e21d42d95b32c6b1baf2e9b5aed56c57208e223e70ff6f0e4e5264dc883e5b09febcd36b8caf194b997b834373df5ad622407d3a13c370378eac0457730d3d5ef30c1802aef8f66f00aa751e148d53f29178c2944e391c657e1315536ffbbb83910089030696925d2ef3326523afdb065b024d28a62c0ed7262054a9f780a40300928066074a5d8e0f83030caa8d596370e63fdeea8f6d0215a02fc665f77ec5ce5d9d8159fa26623c46451472b905a366d6b1303d0c30e497831a1007916ea01e40dc8f7c67566c9fcb0fb11cf27a75200c8caed5910514c6e824e3f03078ad4ad5570f397d4e5e0831931adb8ff689d6afa5a7d4729a100ff6b2766b7b433c0747c6cedd34de9c7fdc3b3f47ef8340a88599b0b9e2c08ca41297c5ad2a106e98523d486bda9a0b3e02d970a4051aa835020055ad1e085cf37ba6c47c60a4f1147a07a7385cb0e717bf401c9a3e7500b393ac17ad5ef3439a992ff5f844878c81107857d343a9e9c2d6569b6c4b80f0852a92899ae5a9095db732b03b881153a4cc81112c9ea8c52ba245321e80859490b6612d3ff357cc44c6139d3f70f9a6e749b3e8a334d5a21771f644165719ed67be1c1d6df45dc617714932724c8ffa0e59a01442fce40f290ce05821a74d1d51b545fb42f23c30f807bb2a12870ac789a0491ed78b3d5594405175a1d1deca132e7e977d981a87c2c6a58a588b37b2c38dc273b984d5ead4f48a75bb02c46c4e70f50f31798faac6f9909e52d16473ed4495f8cc4fce51d2025b91f3abb7309597611970ee94d2d09d8fc99ccd422de364940127b26b35fc45b4afc44bc22120f59a30d447225f15d855acd78bc45352d0e2c7aede8d0681ceba3ded26df046f111b862fa226141d5ecbc9b33020efa88d91d60fe6e15ed38c36989689e94c2c86a2db8f9ea0f14ecbb29e147c2f9ac08141f8f922d0660d5439d65cda48cbc162fc07a84ca831f202b7bd32517e9aef51ea319e8905bf821b9574d3aa8bfde929ed2ac77b66369fa274fe8fbf58727b1f65ed4cb008314ea9e435c157269e041e3a909c9822038532e55ab152e97116ce97d0c8e600e573d509e367ada90bbe4d2e9550527702b281c2f5cb6397c64125e72a10570cb01c92da4cb881211bbee12843849d72b4982961c19873885f450f5c29f63439be48974f304a0b0558e055b5d3bfb0e4c25d44b2e17cf5523f4f381231af012bc2cd15a5008ac00269a9d5288162c98c7ed60817559e08b89718af9e8222bbad451c2b28edfc3ac768773fa5a268f4954a794a5162f76e02633096b218716b9856075a2c8cded9ed51b709b03e95a330491d705aa3e35b7f3585455083112a96291dd7659159a2182dce7e188b90a0add2ca91f2b68feab401f85220f6e446d5cefd128e0fb392fa18ec06fa07920544b95fd0a3cc2b3071766210729c3c23c0e6848a66362dfc2071ac0dd436b09024e9e168a8105221fa427b7b702ea9f8dc08d18d9148b7ce2c336ec7eb9804e7d3448c4cd6823007747306faf0a4cd141a70c59a51d142d177619d6da9c00a0d79022cb983a1484d4cdd3bdc62a782b1b26111d2af599afb3e011e87263a3a70c65b3deee151fe4811e84fa4a4a032e15b323b1a4c27c40c10d1da6bdad5aeadf143064efc1f3f74297640f1a850e4995207012c3a8f793a69480ca3f2f5a2edaa625dd9a649a73339c3729c2f072d14b94bd4d985cfe2168eadcd3b97f224c0c8d70f19ecb90f528625107849343a2c8d7812288ae59012bdf38d904da205bcde6bf2eb62c543b30887640edfc89e2f962205c402330208209b24eea35c4dca2369940d7f42fb7358907537c20e2d26d90e17e539c9fcc4de44630632ebbc5f39e2c011112f6cca0fea667ac63de1bdc16f04400e4f8851378fd1006c918686612b513044ff8c5fdb0b3b6c3720044472f33bcdc085371a70b7dc830a092854e04b59d613e8868732268d2a277cdb07a27fb5889c7771dd58d8eabf6fa3539cf3811dec747f7e719bc9a08daabdb1129a54c4d0e8032edf40173c15118fde0ce569abcb0ea7c4510c0897e232cb4df8f55f0763a744e9629d0556890dc21b07e6745d9e10c49f7ae8b9a3a0491e058fe78369347b18c8494f81e764777af299b6092a47ee0bdfc66ae11faa872578f843c4e7bb049784d3ee92a812ce269471939cc64444aa96aec686d2e2e231be1b65dcb3282f4615e973f7614369529a91955fab55a15cf2dab802186ce9ed2d754cdc50f444a276cb654ef7286f6c88d9ab89f930e29d0484de9e7423dc2d904d943f0c68420ec1f2c51da5678f4937662e73b3ed4d14683e1167a76e448b20dc0c8d23175d1b57a17a0e120b9f020fbd8e5381a9c8ba139df1f9c2e9c0e6650cac0e6cba5a6cec0bd362f114c3f3a4d6fdb518963b90557975b09a0a0fd23efd6af2bbfad048193d006b83be9f8b7faa05020393e831c7976ab4a280318167428dc943478e29d762790f97d00613f3264c10ae034edc1a946d54d8168ed8fbddb301e93c55f40a94d2178a89fa5136da8c9d212e9c749249428e8bf6c98980b4d51e475931070249ee9596ed414d0e0983404e52c195337637d89e015ed06439a2b714c74b322be48874c8aee7e639605db493921e3f5c21032b11734818a5c958511f31e9353d816fbb4fd0a0670a1dc96fb68fb2504a063e66efdb25342e327f77f391187c3f46537497f0901440e7df941d02f6100e0805f7e22a9973080c8e1971f38c03f30ce70f0fe28f81be8b02540f1f463c9c0ff8f7651b34b696d893d09c629aedf88eab6b347fa1fdf19ff98e90da56c9ee84fb95b8cf51bd21afc3f3147053c9eb8e386eaee83842077330d08ac50bf3d03db993ae1024f02e1e07799525732b069e2950d406097a7b172656160b64f05b1fde10e17ccb703c2cab1255ab2eec43028894840c33786e1d7c46958de9e49067025994b1077b4b1f13c158ed6c784361ee53b9cdea53dea0d7a63a471af5972d8830156af29fb32779ac6ccda05fe2a66ec629875335efaba054a90532fdc7a7611514d0c387e7fbbbe3b9fb5081f2002bdc2476be7472cb6748fd0036f53f3d94fdf9571f7c4e832e18490189456e7bae1f7e229e0631a9ad700a2a29eb30bc823e64c142bf1542b0b49e909cb81bec0444d4f921f661e8aa489999d4777cbf1771b5284a2060ab67803008a6073b0f125a979c58f93808ac65aa8119d5287ea1a797777c24cebac7fdf8ce529acd8e1f4ad92a8feb9cd988268833113144ff5cc6d991e95f62a7bd68095515ed90e1e56ae32e126de38035faddf2e15e6d031c57621f548c1f47508c44d1000a54b3fed71a44f5e875e0abb196b8637184cc194f6f16b6f1dbf2e17716250e5db2fda5132b23ad61f81ce8f0c2d3b35fad555ccad0c0984234c7b4e8bd272f7eb504ff1bf68f69dda3ec1ef1fad2dc1c1ff5cc4153ab0a5779c257aa9d7ee7293a31b034b13eb6e921aad550a08fd7af282fc17fb111281b087ea6e69a01d414a20281d57a13fb1943fb5fcda73f486762930da310e449d52dd48110baf91894ac6318ce17ad66de18bc45427ddd70886ed31611bd0b585c8ae9b1e62cc16c169f340c29ff3e6838700e831db59486af9d77b40384ffacf5ade05005f07f27d4aee0b421f92294fe6e14f65ad6ecf706f3cdf4b8a1c0797f85e9d9c9c3f66ab53c949d039dc25ea1723f45fb14a1a807f08f8b63bfa9e7e4ce234892ba52da0d46cdf0045421db36ad927dacdb931c329d9a231ef5d2150962df6adf8ce9da57aba00652e48d6a25b1cd5dc92e361a9e6db0087866b1c848a0968cc4d82d2a5b108a0d9b51dd51424fd1b939c8ca373034d5a4c9cd9d00aefda82046be32ecc3df3b0ed706506af40c0e666f7ca430e688c36bfe961c4cbdae6db508101d00415cf4ee4d909092e77394ca064e62aceaadd746a139fa5c5e76cff9535499d1e71e680745a611ab8361359d1391e0713ea4c69c5f0b2bc18da1c043bb99480b324492d0db7da58aa72c8801fcf3227cec6e0f9324d549e35da645ce863d0cf08299c28195d46b2639e985cca8ab39568bf2174d0fee689990b2da6aff5f1012c0323f83ab48ac1260127642e4e520e0bb5f75a031ad4b6cd8290f344ab1eb6c82dfb8816981321b425f80a891c8a3d2fd326a148a6807d673727511a5120534fa203cd1534e8a7d25b9a10783512ad40f66ee768607c20548be579daed9448bc7d82ca57328d329d214efab9e27de2d8b03ab4b22a05b26fe5630395fabe644868f35998b14ea43262d940247b58834036ece2b0027464d2f19b30f90eac84fc5fd0efa495e133c9902e01ecafb511dbb837018ec40d30c9a50048cc3869bf948e12208d6701e3034e4313209f633412df04a9e74d036d963862fbd9f15ab8fa7d168615bb4ddb2a5c6aef0fae57c893da9d20496fbb9f35365094688cb3b81ffe492c54ecc68adad8b489af766e86cc31605b0edc0ce563a57ecec2b907927f8afad50b78cbbd8396255f9181b482c6174a9457175e2684cd8a300393b8ae20372d1269c5e45c61e8c4cc0486293d1381dac765f7d7a2adfdbc162d5fdb8ad6ea53dfac9939a3151c39060e1d34997ffc8ac01c1b069000299a880cf3ffcf32c93b18c55de1780c86ee972df0022719e6eed0bf61c46ba594d0904799b37433f3b2c5ddb6cf423200ea59b0c6241d7c2347f78fbd706e00ebd16e0eeb462b07f645581f4b7719f9ff2a6b710620090fd5a169d2f5c9856015eb3281bcdd504c0c871988bb1152dce5af9e2642cca3f8477970db55850bd462ea31f000d543da8f48c6334e4f096edba137eaa161abb44d6833c3c57eb61e80c7ed25102f285be0e1313fe51b6afc8eb5675b758b65726c18df08bbcef42ffc6e8e994a8d1d7c73566d331659ae5ad4b954a8aac648c76d4a2ecfa82862ca324305474526c50f361640010d20c36925a653a88b6267ca8be1bbe32d6503d382d0a51f6aa89ba2c2d1b74a3083cf0dcb602ccd22b9a367adf54e468967484123b6d3aa9d5304e813482b22e8e6134569589dadf6b4f27fe7049b0e51dc9a09cd85951c9576ab5da0d34df19b321440da8f1b5a91954fe6cfe940cb0fa8db84a472fdebe1a50c1f778824abdb69b6ec6b8f3c0b805f208c22366a0de99afdfa2123e74c252ae2a53c22d52c8321acac5c6a44db98e957cb776dd560d36346394fbb611b223421ceb17901345a555560bdabe9ff2f1ce90efa1db64f7d1b2fb88a84a3a5c2b041db436af519db8647e7581ec29a66857d7d862248c1e8ae1eb70c745ce2ae117ee8b433116318986e63fa5f8f5066da6f2c587fe39551ce081d7fce4ca9a20a813813be898b6c072748861977c95c51f8f49b5ce6ec7a11479b5facec6ad030f6fda830850fbe46e235b5d39f2b0d9784361040ab1a1a92f0c99aeb3cec24c5eef0b48e15140e3ebcd1856b7f792c42390c5a6ce9f6e05e0cdfddc3e0919a31403d8523fb4f884f935c2b341a15dcdd4e8b01c1c926e1911e7cbe034c382d47fdbe5e1fe60030aa2a54791748284546c39f1343859b4d4748104a06cff1966a52a96cfa17ef272943566a5ae69bc45869662757e68f3c82a94330bae4f81ec11f69b50ca2d6d3f9eaa679a80e80f465679d690d51568b296d9467b506cec0251d5a8d0a83e4e11682f13bdbd4a3d8c317882f267019bd36e03928a9673101f8a7c157e954937c0139b986f748a4c5083bbf60d1e85f7511ac677890b04432a0fb30d322615f4e2b549c156817646a76bef66fa18d35396625f62c03f774d33bddb4b37a15332be4b220b6fd17071bf190428dc4b5774cd8c3b7c43ba66a6ee67eb42ab77497f0e1f12435e2f90f1d33fd2bf3cff000d6d9111466e67ff26b2d76233810f983ef589a20b134fe9bdf231e490402224507486855c6c8ede59141354fb10fa9e786deeae3d93a608717eb462205e30736b8909af472b8e5d0aa0bc9a55da593f1a4a0889f0caf869231c769652065a73f77c06fd74aebdd0aa58a0875ceac6edf1bc9248a08b30d06933d33a6aa883ac2b44d0db3fe46aae862feb5bfc197ef1f4395b8845ee1b3b8067199ed12e34b4961b68e21fc899ff028663169961cc496d419ee888c52e45c2c07f58a56e2dc44bf33bac7ca1cf7389614debf2b4259153052d83bd572d01742e06ec9ca23e2566716dc282581b5dd64a0b98a1bc4beb98b4266eda4c2257cf42f309f83f60a2be3bba9df29fde3ea9cfbeca88dc58aadd716088cbb7065a16b2c764a3e4e71b72ab3e01ea5152b3616330d11ca6a83e555ebd2662bce6a2cf061f468fe2b068b19c4a187562c2bbd0622307d6b2cf006fd98c4ff22fa36e0c298ed946cf9920a430df3f35b046d0544bde2b21fb9416e87316dd20ba157b8f63ee35f01065d19080fe0489365d838d9fabb692d017246a20b8bc0e0ee947b2f57a84026e650637599a78f22502837062ba10ad168ee1a99838fa4bd2b59e8ad6fb2298dcd104dc7d01be2737bbbb835bac9c221553a2c9256446f393469d9d0ae3eb48570d9933865c246fcd5ad73e8993d059cd379bd91fe358c051d1700df621ab0a183d976c3752526386035fe2cce2630d05b39af73aad46ab1f153617bfbf336afb77c9e8ed2b13787edc665a7917dd2b914e4a2b4c6a32c598c1b8b0eb477cce570427c789e874b86185daff150d8c60f6d9d5d995b0b84a4b989c0dba50f9ce39e64db11706e1cdf6a715d65099b94b42b7c1c4b421e1c542eec5a0ce306337641bd7ea26ecd796aafa3fdb3957fac69a54645b177c014cfe60a4f26aca750982d9167041707b162b127849cad20367b28e26ec35c905345443b29d63a097875d9571f00db1d10c7f1525ca8e319f8467350ad147936f5c48de7242058b98210e15ff50dc8f626c67a9cd824cc1b58ead4d4c8811a1e78b294cc7a7d795007835a552cf6133a3fb1c98dffd68cc0478ec07a244a5db73fc5ec5a30d08f4f706c7a0ce75c455b77d36987d608a9e4ff2c55425fb77bedd59c8eeb3eb3f9364d7111cec7782bc3db08a54ff40c6e9c66f4abcc7f80ed650ccce8f10423b86fbc21b13a4a64b28211c1e66f7b437a2b34ab68e4ecd32f2302a085e4dc5c480a7b64dcb017976a227d0f1272e5ae6ce5a27bfb325664236678c34fe486639e7b6250432aa39380bcf077f7ad708dfaea88a815f9b9d1aada247d8da4f77cf998910925496cdd3efd02f302de6a1802c4e4deca88333a7594be883ef57a97e7ffb9ed23a9255071a3ef586873cde54a310728d6f9aa9be33eaf809807ba5cd0030a9fa2845b3092b24a07ca0127e063ae6c8d369a35f26ca411df7492d962d008c0b9362efe3527dab45512e13c63ae808d3138ad9ee6fbbf872a02a1658dc9c927e63498df73f3494381914028c843300e2c428b2811d972ef2da59449262903db07ea07c908bf62e5a59d67e2d5b6ec174aa0a0c5040777af1796e9dc58d2c98c30a3cba852a329de0d1184d062c40d5fe26e67b4547b6d70515eedcc0d4c54f8c175875be4f81d842d1b34545bc516b7c8f46a5b689020a9b672645282f97302a156faf06d5629a534c8a554ca39e95c452999bb942fa59c52ce39a764b5404eaae9e8f76aa9d0951ec9801e6d78eeee8eba59a5c2a856051e549b7222542f2cb33c7098c1e3e8e8e8e8881edda38bc2119384032e7008f55097b20bb3574a29edb61369e2ced5da69b55abecac212409629fa3397522ac6a575ce39a507f294adf990704a5f11c1927266524a89fdccb6cef4c527cff72bcbb22c3970fd6343f27cef8139ca6760e4d55a61eff39aba81def7efe67ecef5f4af97539f3ef6722617afa7ad883dfddd6c9490053081ec52eb71b30d20a73cb3376dd394e5d76d08cd5886bb10b2ecb27f0f9ae7d33c7dcc3cb1cfeb92312c5f0dac1022404e97f46a19c4bf94e7b521ec2dba27ec974daf4b4ab7d3351d943aac9a8efe884ac94828faa1bf8cb2ff757bc323d5522925adb5594128518dba93dcadb528540376e25b4acaeea82fae7bec52b7282665563071829a641491aaadf2275cdd7009a7acf55e5aaf2bcf6879f2c9274d40bd9af835405c58edd5f244284bfd9bcbddbd6fcce6f589ef7d395eadd794ecd8050e6bf556db49a18b6a776cf62b164e165e6d0aa7212842780ad96790f9ac745e98e4e2b3629792baad94686bb664cbb7953f015f4eef6951d6fe08a7ecfe3e93dd61b45c3769d60413e23f9af8f23448bc79c118c04010de95947f34490c853a884357a150aa8335d88b9a917152461733d136dd32bd4ad93fa594524a085f42c7edd65ed41717faa4103e28e68479be0d1ba853d891dae9d047ec4229cc127b07a1a1a480e386cccb0c4e3d2a8307a210ffc6bf2fd5c688459ff11d33b39e50e0c74ba2495eed51ee9f4c2851f1bc7a9442ba4bf9644cbfe88f7fccb3cb8c3104557b294d5b11ccf459966d93939c73916b0e72da7c9a8f17122270c555f9780122ff4aaca22f67b0fab82fe7dd464004021f7e77e57488535ea509dc7d957db2d013f304643fc1b77773dfdd3ac599a6ae5a134cb8f0cfab893f629c49393accd22d9c4bb4942d1d768be146b4ae5067547bb7b828e910ee905db463bddcd3e9bef4b0ea55ddafcb8429591ec455270b47df6842a686a5ead451610906cedab93e64ce28e6d778738151a7d7eab5b51d0bc8efd5d4af9e678e49a75f26ac399b3a9e73c64c42adc7cb775a9dd2f953fa0095823f259cdf5206a2503232d55e59e274522add7ffa805db2a35232318bd54c2ff7946116ca96d37d316936c357adf77a4baf53429948c839e79452bed75417cfab7bd1a7663f8412b68cb4a9d84b948c0d21544a66897cdf62a0eff3232494fdaaf86573caef21b374d99ea34b972e9ebd57591a21b1ec654aceebd220989d6eefa99473d299cabe02a357695dbd6e29646a00538898926a02bbacc6e2f276855d17cb59ffc2d349a9ac1a60b53c8cea5e234c0ca5f459f1e63efd98ad562cb7d6f7aebdd9c5fc5d927ef66aab90f9d2a54b973a6462ed585c6b51d57ef7a99e0da586bda9542ab55560b31745a506b618bfa82814c513cba47d7f771d3c9b521f2a31067a15a1af7e64f93acfdf71f2d2a4417738acee61dab68e0a6da3f53b2a23c35db53027dcbd560b27775785b792bf635b98d77aefd4a9b276adf5df0bff8e4c3f3829e31d65c77ee1cca2d6ef6896334b99a58c59ca872fc7f4f2fbe5682f3ff572e895ce14bf20993eac996fdae0ab99af6dfd6ae6db2dc3aef9755219ea8c5f2d95124eaddd09da03bbdeb7895d4ad419f761d95bc97ff1c95e2586b12c4b0e642ccb2158f6297b508e5d87e72e1ffac05bab5b982ba821ae7f3f7f39a7bb2d4156694d597ab3abfea45442c98a4fbcbad7f8cef83ae5e63146d3c4ac66bd632cd3d789d4ab7514924a34b37267b1b2fc991b5c665637762cee2a66dab44d8901b40892831b64696675a3875535c022923454292d465f588da36db20903833be7b6b2b84b6954f270c04bc69e15a3093fcdae7e649bbf95c42eea137ba4543eac1ac07902adbfeb612f938295e1ab639c9b570b553e80ac2096a1c1ab4f29a59c737ee7b9da9b74515eed157abb796dcf979bcf4f963e51cba490ce7366b973da682fe15b51979a8eda5a867dccc77ce27ad5219dbd575786a1542f0ca7672506ce4de1fce70e27caf3ea2ef4fc4929e5acb68abdcfab10e943a416f0797d815b641b45ee16b9832f49d089d6e21aaf267ed472e1c7244fc5d8c53572d4e13680420908b7903fd47aabe4f85dcfdd52edad82d2c1859fca6fef83f282c3135b3c2810490ede7a3d3259ca205c295ff49abac141879299896204495c261ae12ffd6f4effee1efd5dbac026f5a57f5e3fb253207bb3a48f8dbebd5b207845e1ade8cdbd58af267e086350dc9d90e37bb5ab11a27ca1445d65a524aaad3555efbd3d378c6a2f0a95a272eff3a8648b2d64acb55726f56ae2a36cd4602f093a5256dcce2dcaebeb00e1c75496eaeeeec1ed8673abb8e5f189468245cf90e1773d3d43eeee72bb21164774d0b3a9a183a42ae1f33cfc1d0c611a173edcf5f873c224bf7f2d1f3e1f889279b14d1d506e1c0467713b8b3b54df542ebe8cbd2e24454aad51d321f36ae2c7540afadf94141795d2e1037309af267e0c9d3b19195cc5edeaed6a5f4e7f1fe17701fec3401868094f04822fb12abec7ed7bf539b63c9afefe2fba5d8efc027c55bc91a63702dce07eee72308088dbe5c81d6dea88e489a19096858a22eb3ee351b0e4cea3283d28837e0d898aa1ac7d265bf0a17e0cfe3eb0cbcfb40d663f422df946df5c4a5efe7af9685471b76571c767edfd7d608f4d686f88cf4baeffbe75d1281a4549bab214b90c194152841328ad2a58daa6737cd7d2365d6489f6373cb7c43f368173e6805a63d8f1f2f53b60f6ceade978af005de643f30194b38f4db48df6f135dcb58fe913e49a0fff0bd7eced06b38fe8a4571a8e4df44a6af78adbc526ef9b18027307eb06331547e08bb225377c0cfbc0d88413afe67984d20165ff178d6e48b95d6c92e3c7266de324362185aa92c7d3368dd4bda761e3ee01852208e0f51d5cb170e4a4af36847f2479c8688413d27b3314ec54dbbc4c9c120dff1d88a0102ca2650b962c55945a4829402972312c045fcb162c59aab452b71a690c0c8345fcf0589df231ec319e8c5df2eb0f32c9121c9ac9988cbdbd4326e3b6911782b40df657af7a7edac6b197b1f797310cb7932d5cb22c295d414a3a8a029b9cc4b8d785bb6e92553d88640c17e523bdeac14d9269b81836d2ab78c44f59a291f88314924532fcbf5082f4482985e4906bd9b2cad86727242ef670909e0a4397ca5ab864882567c959dc4eee90e17b15a5f74eafe2fc7a55e54a0b09ca9193268a60822409922223478cfce0433b3811975e5d18db320cc3b08745328c4b19462d36904e51034ac65e36049edcd72477f14af6737eff40addd56908fc9c75690f281c8c71e834cdc873445932c1ffb296a34c93060c9fe2fb4cd9b728652767f59b2bf096d2e0057ef050bbc1a7f0838713b96779f6baa5a6c933f371df3e30664fe7c0ceb81e10efbf932fec440b0971f9fe236d22b7fd946765efa87f9982b797920d8f7915eb9f0f2524db87bcde28e35f10bfe3faadc975f86197e1be91f1a49096b486114c5263da428a2e4f8f5ba4ea71146d83a967c3743ecaf267e4a07b77f473e864018b77e0320a0743104b480af94e4b39757d33cb2d759f6de7befbdf75e8bc78d18638431462e11462cb2d73618969334c93939fbcc6d46647baf46734d874fe7ba754159eb361094b387df5df6f16d8dc59df6b44b972e6b64f81a108887c0fc18866b97bd7ceda1c6424ecef07b351aeeb08f5dfd0a25fb639f656d61fd88ad50b10b670fcae03e241b2065fffa36b892fdada63dd6232763d9d7b7f55de598fd0c77adbd863b98b32eebeac70d484f4ec6b0067232f6187eaf267e8cf582ff904885728dac7328c2c2882636f2438262e461914496ea0416463829038b24c6382d81a9e0941f12142058f54a8c6775add83a1add3fa577470c21cc6ebc8111165df8acc8debb89fd10dffb123ba8a104b21df1facb95fb8e5b7b35f02d9cb9c772e1f6458bb2d7ad8dfd1e3d4a77e91dab401cbdaf8adf4b7c2daa573d29e932f7a49a0c0977e0783550da4c8fb1d2d883550ebbadcd4cd5d94939e786dad9c1d2faf3bb7afd97ebce0eb743f9a0e14eef3cdbc88e7b6cd334babb5b48ccfd56bc748b72eba89b8a53ca29bde3169225e9854020b63b486ef7d93f9b691bb7b0573633107773f6a0327454b5b787e53cb84dafc88059f6705761cedc6c86b006f51dea7a8695c27f327696f92094737e67279d7462219de7933f6fafa095120601d66cfd3481216497b2bdea24beb6a65cba37945964591624c7963fb3e7ddc19ffefd8e85788634cce47abdf7170632bfc7965b31c5efe14bdcf3a0f410b627cfce24fd2cd2bfbc620829a55ba53be843e1bd02484971cb2b039172eb4165597bd563b3c8fcdf9b1357ef183bd8b0e17baffaca5215b18c6aef948bf26a675a314226b28e107abfe3e8f168c95e297b09c91bb6b23bb1286b1b8bc7a148e324de64ef383ae9a51be250bc8943350ecd38d42650497592bda85eea2b2608a29796b47861a8e08557eb6aa050d3bda78e0aa84aad663255fab088abd92adfe5754a8a4ac9d025747503895c628616cbeb8c2c1c26edba4124f6d794d3a55f11b2f6fa8b327bb34e4ff76546b3d98d77938a34d1a662178d62638679c217a74c9acd287651eca202d061267914ad89961851b250ada1560783a6ca40abf3602dce09345b66af9733b1d49aba56ab02140033e00804f451b5b2f29fe8d55e2d2ecaabc5d18252364b88319e5725affea4b8b94114a2219c94460abba13c08db75d89fac164caf96a6e04d3a6308247477772aa4b35c3fdf219557a5754a19825a5f8d702e65ee98bbfb4ebc527eac3a5156ca2a72bdba5bebbe0295d85970e1eb44aff6ad71e77bb556ec7d5e9da5049542d158fda19cd3abf4c8030ae5feee2edda9f44b52e93f7148c37e71baa623252387c416017a20400f5ead1f65e1fe2c16f63eaf3db82fb5d62afdc724e19332c3a451149e8219adfa729ba9b8c261616171a6ed8447233f013b345b4f60a15620fbc3cd696df9a4aeb28c58fc79cd3aeb9474522ae5944217754aa594524a4a29b537bbd8adb506b9fc290a8cbc5a2af23dc93c672f317a8c110bf1e12f5f7a3483e5b5dd5ef16a676b373bf06a3bcbab2deb856556db11327970e77bb548f63eaf3168498f3f98cf5fad172e52a47e0d3a4242373c475ff54a370b0f10bfdb5a6b75e059462827ee01dfe14b88c3d072e77bb557d8fbbce218c9410e9cc85e082184288bf2c248a6b18990209a9e271642b37c48b3bb1053cac7c5f34ab31ff106f5d825592f38302cb8d89ca86fa5b44b665eaf0d72a72d5b91e511d91fca1a6c8f3b6ddba539214b16fc2b3027962b8b12242a16ad6b13cf3d35c68d349166a6ea1274a7eeee90884ad3abd0abcc6a41224d0b8d1782c49b2b976e2af5012db4f550d733783948e2cd4bea4229a59c73fe3cc1e0f76828ae3038ee8008690743485a2821593942d222a9c8c599cd7020f3853bc804167df73c2231b596e42a23089e1617172cf181346820220d248e2869811431aca8c0bed42782bda8140b07479106858806f882cc08421c3829c0294896e00d7eb094fbebcd6f0a12a54cf39b82848a960cc9154b208db184075d70e0bacf700727de38074496d285162e5c2cd1828883568048e20524f00287308ce0a0166354e182055480d08208195c9bdf142a50e4eee629548c64975bf39b42c5099dd291b03441b272940190df142a3d4ca1c2039523b29523467e70c319527e5061931bd280d29a820748504cd172840bed99174588182c71418ea5062d0c2e885573941e488084eb0d66065cd6363003290a212e08e6600c17603103022ea8041ac097c9817bb8a110a3881097d383144546425ce6b13d9a70f8c00c4eb8de485882cb241823b0010a1744a51089400617c4eaed47003f7041afb5c560043330c105d927a070fd31ce400639b8c20565671cc1f547fc036780849224b820cd8631b8c6f44d1f5a5088b8de04f0031714616791bd78f3d368a08194c4fdfc04bd1d1c514488f30fcace5832e27efce5fffc0451252b4538ffa0192c4170f283ec096e50829bfff394a4e07e8262c4e07e265e025fe225fd412817708e97c47f1f14e105cc28f201fd7a31aa6d24edad6375f5259b15bbf022b63dacaa015606d2117b902472b56f91bd782382185b08915046d252d294a51da690617403a52e493fd7121a94b8a0f7c4123a90817201143ca4a088cb22d192235ce64eb0605202182419e27a6335e11e165ee0a005d9cbddcdaf84d74a4111475c066160c41097b525c2e8499524489e5c395204450453b4b86c4ec144042daa240726399080cb10975d573c192a9a6288cbb22ba088b185cb6c15344831830b42b5b8d708e864948888b8cc74c5134070e1b2972753cc50c465b70a132841c4652725b61ce1329827474c29e2b2182078201aa208212eb361c3133e180a81861f9cb124828d5bdb00a54889eb8d65c4652929671071d9083d50a1c46524583144e43c30c1a18823ae3788a4c80c4a8509204831e27a8340c8e0092e2be10a2b454f4c2005132e33e16f60c28922ae37191d70410ddd04edad179471847b4f6090434b460ab47153412a4c88e008f7b230038911a7f27f5548b10225eeb598584112d79b0abe8a069cea0a97c523425c6f389470198c0da369a657f07dd8018b1117bb304388238a430f465c506fd862c4ca9554448716604048e27a7b2728e121091e70bd9d8c10610026ac504308aeb71314455ca6d9b8bd333eb054f4248b505103b1058c25ae37150db8135860c411d7db3ba1088c21aeb78703101c6971bde13882ab811768b4b8de64a470bec10c7740050a25ae379c2a5c16c229841838050862b0c4f50643a00347040675c72ed915f76df6fb673e3b62de71e30497e742145a28475c82940e8747bc49354efc2bf428d037379a06720151b8927d43f5ea6fb03aa3584e8e1871031f5e20450b17fffb458bdba172d4fc5b5be1467e18460513ef9859e2f76a8088724f2f3da071902c45f05e0a4227f0e183eedfa564fec6028fa64510e1ca2d30f06e66525cae9699226cba39c711ff0df7655a61608ce26d3b5e0d937b91266e2fb3921c4adcaeab746beb24108decfd9bc9722871fbdfd682e4aad420b924ce45ac7aaf26c6aed2495e0d7c0da58ff07b213825ab4498e48aebbfec52b840c60bf35dcf6b65d9fdacc63c6377c6defe7b3970bee963c45d7dadeb21c2a46e4498e4a7adf072aeec7d1c0f19215fb07ecc3c8bf19f9fd5ffac629f0b8542a15028144a013eb8f04f30db6993fff2cd5eb22ccbb29898ec8a898989c9ae8c849ed78a89898941a15028140a8542c5c4c4c4c4c4c4c47c500c0a8542a1502894027c705bdadf784384899298ef181cf45adc1298864122b340e4c7ad8b5d64cc5e5e5ececb8bc9f4724c264d7b399af672aab52fa7e6641986bd1c0c7b3533e7ba5ecdfcfa726a7d35f3e9cba93994cef972e694f2e548f96aa647f872b0f8f1e5c4571363bf9c36cdaf97e97a1f37d5c7361fff0d00c12effae5e15fb7cc51efb0b4b018a1b6dc4b55756fef57603f22294258e7f0591f2af9756fe55e34f91d7a5063b20e30769a8b14617eef435406e88723610e14ef8e12efef53a314eacdbf1b20f8db66a3a3cc3b6b8ad60374024c7aff57dae68fa2ed6384f5f4f78d61ce369621f135692c3e9de7befbdf79e4ea7d3e974fa1b70b8d3079df08d34f0de7b5fa75380e2ce7ff7743a9d4ea7d3bdf7ced71e4208ff693c5e7eef4687bd7d6deb82646b3720fdaa1e578edf43f39098e35f11b8e25e0fbbe4ae3e864d16e64fdc5db8ab425c55b36727742892e157241f3892e1bbe6e3453c24031d91ac019ae713c9adf5304121212121950f070c819962558f9afd7ba863872f1d0210b2da140311e216087d7f1ff99d0cb9e221236cd7755dd7857d260939a2b8efd18afd46573185f2b7adab4f6b86efd17414fb4cac04c718c017438992f852ca88ab6c8f31e277376f54f647a5a67c331ed748814da37e8c9f7df62095fba2c0602893905f941764995348f6b557f5e343391383140273632f193e1b2d85a7ef26156966fd3c3f859f26ac6d291c88bb1873c4c95f9f840834516b6d9b09f3f3faf7528028e0bc02cc9f9dbb14f2fc54bc81c13a3875f1c5d534b5894d8b31d02ba9b1f019e29ec75db8ab54842eee84b9b75a6b9d6dbb7e39e70cd2363a92d639e79c736633cb66ad55e7e5c4fce4556b9015945cf837727075200a30cf57218890b6a93f7157e7552b8544579b96f8b793dc8fc9e0287f9e12851884605f7be5032863df5bf68dbb2d86fad7d34d08cc34bbf1650412a1648d852dcfdf893295e5cb77268890e3cbc767333fdebf1f9fbe7cc4dd755dd7a75e8dfc930aba07c5be10193ab0d39990e1842ab48d0ae64d3f5fc2601fab0cf330f846afb43fbdfc067cafb4d786d45c3b06986fcab4759e356c7764d8aff46eff06d26f1d060db9d336f2539bbfbeb76dd470310cdf5ec9a7313fd933c078b3235718e2c2bf9183dbbd14440166297f87e765779e87c0d70151a74fdadd7a5259fb974d65bf667bf5ea7a6d53598c815e5dff72cfedd5bb92af9a1fd657cb210a3d0455b5bae07fc2404b8080eec77f2be458e3ced3fbbb70615555df6afdf1d7587b11af17702a72c373f1879e3bddc834cdf702fce590842a2a70256dbc6cd9b2e595529e7e0876712f871d4d4a4278a8b9d05c08781569e4fba6c3e2b1c90070b90d8ff4ff8837301ff3f2619041661343dc41a28c7f96c0ffb91ff14ffc7be92665a6ffb8e85f7d035a02fff410f3c4bfd757a0f821bc6f4036b20cda9e9f1b10f874ee14799186666ecfc6b6842762d5f5f16d7c0858357f03525d58059f874735fd437817e2db78ff101e7e0836207c6c7e96bdcff5f67bf40a19ce7e3e84d835ebd69392b3ab72550013dc177ef44af64a6e2fc4937c91daf6b898ed7130dbe34c44847ed434916fab980e51a0f9fd9cfe31c71ad7fff440f1eff43f3d8f63957c7f55fdd3fb9f1ec33c11abe4ab5a38bd3f4ffcfbd967a7edc5bbc1909fb62306ece9ab7a74a6ef63fa97efd119fb17bc42ca6e8fbbdbe334d3e60366ecb5ad2795b1aff99af30f00c6ed8f56646fa612b93ec33f3f447ef52af9980cefc2059461957c8e935bddee6cbd301f86f93bf37f4c099fa77e56c907eaefbf206e217e7d9ef8f5e5032d9198a79f3e5074cc43b1ce03553c9fcb41c6952f045b5ab1810837bfdf06229c54b9fcfa3c723ec53ff0a75f4a16ceafaeac38bf7a5c6b91238ddbbfa97c3e4fff7c57490cbfbacafb715387070bc7274b87070ba71f7e1c41461f6a3b14ab76e484f45f98ef2d0440cbfdf172b40c43d27dd8b5e28d1569fc67dc78441a7f999aa1e1d61feeb115d7a0ffeabb009f62a0ebe1570cb48407e8a5fe85fa44b8f830f4c3e781f02bfeb91e62d5fb81dffd44b8da04b841fc1f3a3c54ef85f0549855ef8196f803f5d7075a32310f7df840f5fbaf4df5b04ae216faebf3f457cc039f3e10c5ac1c40602dc920b2fe2caee48d082d2121a11938c883a788faaa7c5165658dbee892bb67f44594dcbd289e39ef47461619feed6a86331946a2eed6444872fb9d28b390a3d2e5440422a79225ade1e4024a9265890c2bcc68c285833c0c7981c609a45092822394b8173b641492174532cc2f278d7b03cfbc24713bcbca7f637f346596bf27330c219944a22a464b52889861889828fd99d632436d87bbbb9472851d33be688a3bdc754cf86a1e7eafe69d20c57d48579ac81deae52619feccea46c3d6fddc3d0b3ece4d0d463eb0840f4cb2604247d2932e46e0c04319495c8e1a37bebf4c0ff73d8abbf75ec68fefbd175f743168986204263a00a35585151aa6a8f385d42c3fe9c70bf1c6be0b59661f287bdcfdc73dbbd548801bc88746f2e1917c4cee60f146f51efbc7496a32bd3c8681b07fc1ee1017002dd7e8e5dc2c1f1eb54d4b83ab192e8c0287b27c09956409a1c81f32f46bff38a96aac6ae174d2f08d799807baf27150c9cbd9d243b26a3a5e2ad2c89735e2eee224550bf74fff23e6615ea7b51d2a2697e66dccffc8bfff308f06b73c11ae1ff2907e372caaf7a725d5c3aa16ee6bcfa3e19f250ff3687fc249506adbe38c228d84bfe3e51852afa6ffb4d2b6b765d06a9b8ac7f4da9bb086efa6e2d1febe76312b3f8e0e0e0cbd7aff6897358456685cc211d73fbebc94a6aff5627946f2ef3777f14f1087bd49db783c9a87b3690f700ec39d8d3022b24dde0b88ffe67777a669e6b37a01fd1366d90d21eee3b06aa7be8a2753d22f94fd4c692d3c2e005aae0c2f47cbf3a1d0cb199a708b3f184d4aec3fcd85e62cc689343b9b4efc116188383342b77b5b324e856f42ed00309f046e890be77c135e8efcf90078391e9760cb231944a1857adac66f9e120fb75f5353e29c6d91d3b6bbcd9fdf35de6091dbcd0f865ecdcf41c67d59b553e4fafaa70cbb88697ed45646ee4fdb74af0a19daa6630999f62d9e0f434f4fe8244fc824cf22fce6d45431a85a30bd7d1e937d1e15c52a09646f7a1e8c3ef6a637e11f229cf63ba67fdccf67b1f072609e2f5f6a3ae48c3473bedd6a9adc1fbd9a2ff14eafe6e3d8e1367d9a8e0cab2416f916ff40244438c78ea81cab5ac8b2c7de2dfe09f2e2fc0c13e188703a7660883453e99e70c5351a755f2ae81c24ada4032b8caac8416809bd32144514ada229559e706184c5c50e193e8e14bad882c3ea6229c3c7914286aa9d17697cdb3ed2ccef82283f31f243e22209cc8eb6c39453af06be0066b8ff020b4e126c86b8efdf4bede83f000bfe5337ef08891a40586305581061c1c1e7019f051f27feeb58f67b5859fadc3a6834ebcfcf121efb633f688908121a9d48379f9fc7c9ed659fd8c3ca8deb5b9a53261860cc0ff8c088152c21e20a1296071419a24b193618010a76180109152b4ca85072a28b150c891d7c0002113a18a14405078568d23aa2061a6cd1032125f0ca8204a12221a4a42f949070a00452522b8b0b49a9480b129724468084193e2081153f6021b2c20a2b7610c9f44f10abbc35ffb7c1fce4ce8d34f2a12ca2932499aa16e2d777a1ff52b5d01f9fa73f7613d58a7ba88fbc1af96f93b91569248aca4df54a92e0c3854778b0ffe9c73024d221a97835f23312018c5c988461ab5712070e6e67e5bf1919db6d9816d2bc1af8a88eddab5723d34929e59572ceee5019c68f714ed8c4abb1717f3edf5708a3bf86f3755a6e7006af264624453146a218e5c46fce984ac59731c6fa85951faa0421672f6f269a1010c4ed9a684b07b564086de00ecff1c58519e64f3fbffff43a0db770f991e3c3d3c3e0d306b5b44d5ce554510849adc591fc90b41842b232467e3e2dd476585ca5114d939fc38bdbc1233edcec7900b1c8b492da263ea44a57a011e7c300ad3dcc14a5f930409e0df38c568eac18c5efd819b66fb242240db27f3469b8897a05bf89da080db24e6f01a438a8f4ed573439e8d0cc000000004000f314000018100a05c341b1784c26289ade3b14000d7c98486c52194b44599003314a21639031840000008008c0084d6d144000d297fcdd9f685d7ad3f019449d5ce087b404118f2ee5bea739dbbb9384518401c443e7590b026979b9e80c1819a6a4186f05715789eaf8032accf12570201605e068b89a29be0354469f4291daf82d1798b50acfc3207ad4c1099f1a07c649ebc74bf70d1ec07f66439b0e24cdcba1e550be9fc0b4ad8d8852b13fb3eee083106be3fad5e10efcdb087618fd8e89cf234f4d4440c524722e8bc064c623787894cc0a44c780ec2480ad0d1a3614a4f6d76e2d1e27ab0faa5800c1be9750f0d9c43d698c7f2d36f85914c364bf15333eca09173fc910e0979a93d4ccdd9ab6553e691234e5d0a760690c667a89462570aa03d7e989691ec3b168c7cd20617c884e6bbf6fd9e395369114c395997716ec8b42c29e4a352cb33a48216b75333fe2440e77698947ca9b15aa7199c5a156339fd5eae6588b152c1bba776274c5d8e081bbebc519417e87515066547a5df6bb9a570d37f62180fbb838e14807166e44aaf9709e83562374033901f9e2da695c6d9422742de1592b0f5e8612548d40d95f772b0a5c0a2fd882b56ec333b889813062f8ae10074c909effd8dd19548261c50d1cb7593c1e181f15ac73ff08e5b45a42345c1036489618c2f94f784bb35225fdda00bf7e0414d62b7429f82fa4852cb40849c6a5db3038515aae14b6a21f2e76435793185205faa05033926f66915aef3489b98ca9e5e813f43a2f0addbca9fe2c05573434a0340b95de74aadb6f0aac5bc44c661bf9049d25df6e69f1a7c1f736fe55b8b2fe91582da0b8592bd9444f0dd1e88193ef63b5ca185c824f4132a349dbd0460ef9057003b0430d6e2fd2496e0f8d8feff2bb36002d13313023af234500fea7565d05205668f304f4c37c3881d15b9a25fb4ee260f2bb253ba844486880731ba1e088d2bcf60305d561a03917678e08749149b909aad47c3e20216f8e00a183aa44e653057a11b83ec36fb7766a769e11fe3d7f7b98c17eb66c660d9a0e687ef5c0971d96e29f5122d90c8072c523265284b2485b007e0591463da1ec710cf620e3ee834e5d6d47710c43a258e2978ae0e1beeb77ff9e941a3e902c1b18885c658410e9f35b6a838e392f5760b05a2d5a6d94d6ab2034f6c17215b60fee55d473728206750f7b011eabd44bb53e1494cb5c80f24bb53af45d07a782eb07f4b36dc043964e000ad70009217d50f43ae39407b708f4b9e47ecf1420dcf9e4cb4e04bb6061fb06ca04955e0f117a85e38eaadef2d36b630451875f37dcc35ebf2e285fa704a392e031ff6615fe3c817df1c0f6814ec57e860cd750819617fac370bef6e4f608522e3d62489e1c03ce85b25ca447fbfb416807f8e44c7b174ad51b7366b8e022573cac97572c04e373ac3e1f1d5b2b3882b7a3bdbfbc2ecd8e786ecb8b3d66a7625fb7299ff260396956c1f1198acb2519dd653b6420b5ff4aef8e7e195e7ea0349544adda9b83a343080aa6589e75130558e0c4c85d978afa26ccda601325af88aee9ffe458cd4ff4115e510f29f5e0b11f5cf82d23509891bb1d237cfb3966d3564e5cf1dd2e8128837ea60af471945c17654460292c89cc9d81f90de1b832312e9c6b3d87f855530b7dca88fbacefdda855bbc23eb95da85cbcaaeab3fd5d3a1a438be64ac933889e4289c6a5f1cfb5eee7ce76a0e915fb6f908bff77ae3a14d7dcee829d02614c41a5240991fe24d63a0e788cd2985d59cd82c052cc781e254b717f80327eeea247a24aabb1924e6f48608a3e4cae6ab69a9852704d6ddc1b6cb1260b1bd7f2b9ac2ae2459ec6d68888712cb75a475eb3155562c610a8cff66e8d051e427969a9657b3a2c90d11e0ee287a40c97830848f85d026509ca09408b2b4ec33315eba36672234c963eb104a4f13a91961fbe6346fd3e578e67d6ec7d4f080eea91d18e7f7d1ec557d4106b44634b6530e93d86a9e7d290abd22cd85fe6c02c71f0f2cb00ea0a3b802f107210c2803235af5994c831c97440974a295d4b480748313fdfc59eb825645726d4a452e09e97cc1c3c270823a9e8bd17340bee20e3bcc7d06df209dd4f3c8e8eeb7bd8a859365070693f095f3d925a355b40deaa113a52aaa2eb732698d37cbdc0b580b8463d69d5544880050655bac9e13b5a42a286e79ca99550cca58b925416013c0a084c61c690ffd837ad36f3e0332151e1bf7ec533e4ce97d7968101ffc129f818bccce918138c5b1746fea04d03d6c8cf4fd7b535b43ac164c3fc0f1c5aa21cc158bf03b1917b4ec8785abd0614cf9343fcf2be3ad2e37ab1a5548d75969f13f05849b7bb6760d311c0fa13593bb44c17c3cecdb101660304169da4161fc1fe71d1216eed8cb405602c3cab5d3683c69c00222de9f2b1deba46225372a9d34ed713849039642d7b1d12771d9e09d6edddf55d217190b4f9016b20e3e8ccbbb8969707ea16fbd4869922743a71e264d011789ddb5b309151c166e40ca07096682ebc716d1f15538bf0c796307f33181647854838e811b0bfe0dc742786e7c331bca52d347bea282b3243c5d114970aaf4391dce67489c95da90575bda2e8be422a7b68169725247683fe4d6be2d2713d71052d0d5c6d87117c6fc8a3884121ba2b15fd74dbdab381065047d080f9baed169a9b4e7fb16987071cc8706bcb7787a3b626a8ec1d222dd0108c8c2deefe259d607c5729f05dd97d2abc2ed7601b62b9f964e2fd4dac38d4604b121cc2d640910f31e8e38e4d64fc9842513e6e385ff769ae328d4e0229e11dbc9180a5c72706f9ec71c32534674e433bcaa5946d71190ac8e670d0919a0a51c2bb5b6d4654797d384bb38d63cbb733995ae58ce5ce40134114d2c43050dbcff009afb4ebefab830eb297f5952fd080f5b2e3ec4950bc7b094ff5b845968475d65864895e91a95745ea1924b8f52dd4d7983b9900a1219d2a0d7992fa4bf56d0aba7ac1c01b852e64bfaae8747f4d2c8276bb9ec9fcc2b72cd0b4d443cbe8c50ecaf31f99e9600830374f25c6113d4268c8028840f78281cbca2a3fbfd3ec689b0f80611df44e2476f76720590f1e0d5865d9618cb792adc19de768e693a449f62065d8e9b3896259bf6610825ddac2d4c2e4e6e06eef342c2e7318875b3909e9f237f17ea29135682329ad20b493381e8c03147d84ccd626cae2b74d49e208a11b0052e0312e39bae78da55c4a9039b28def56a0ebf791a474b293d6e358ef2cc1e4d8c0f1de1980f19f4691d47ed441780dfce823eb0d40065827e947452f0e8f18b5b26b071fc43842cfae238ee5aa0ee019eff551195761f1ae16f07df0cd41c69e778d0ccc93771fc3bb0548e6f0c0b86daf3cf74d5f4a12eb02a3611896a83480c56b21ca1509af25cdc464686e0d993624a27b206a07a50f6ab8876e135f51ed14256c014838c296dd9b93369e457cd29440e6b78450945d7d14aba3c1510aeb59d4ca2b967fcd90aa252219f9dbeedc63d024968abd601dd3f600491bd26f4447b718c0d690f909398e9cd39d3a03bd609962e596368864a76c0a83d8740fd0973e64a1526cd4d16dd106979012a1ee99eaa877dc0139ccd5a0a55f5dba610c80c2a029b3df435a909911c989e84a9a83ffb2f51277c133916d1cc7ad97f8d3a5bc3de3d5c2f4e1fe046e9ed2ffc8e2e0cf3f6e4ede21384f99e96cf65443e24d88c14574582751fe612da82af8b84996c2710791493949b625bc08171326650ece837ac9a6e5e84441fc54091759ff56b0a3fee5ceb3a5ad1abf058091c976c233ac80155ad009d75d03bc4eed91903f6864597b9a4e4736b6802cde9d6c2d0ba501f5a4d1572582803cd008dd3c76c26b3b66f90777b495c0f9cd5a0bf64af2e59c60c5507114ab53b1b108c0c66319020f9aa013624d49d6c279c99f98ec397d2c14b1e63b03d0088e6da4fc8d7757224f6a19fa841d1c461a52057e4aa344eb76ae10cc8a297967df54fb1b712aec3c3318f9517c6606f2908f25e25506625df043ecf05abfcb05997b59c4cf7ca5d0fb758fe1d4ae2acfe28e2056f7103c8e4b822b7e43be017871511554a0541670ceef9c07a15278714401b5a1221fb4675aa5ab041a8071fa4ed375163e619163f6e2c1f9854d12f4c070b5b2395217d7154400c23389dd2d1da612d2931f16f04de62663b11498f3b70866bae6e5740773729c9fdeab5ea94ef6f5683284843d2c0d9dc7b81d073d1761c3962a085eb0b76a85df0decf6ce274c8d19407c0032289c5327569fd0d6a664ded26f89544086c4f79dccfffde4edd96b26b68bcf0ea95fe7c456d05892accb837475444deccd61e40f6216593f705049c2e29f72b04f378c93c10adf45084045d01b71f72af7df743858d87a633cd254d35b66c4a2b4ca863564e93c48262d1c013f27b409ab00f7bfeb24ba7e85bc042b31542d3aa85ba1a5efb1d248c6e146a6a7d967c6882205784994930c048c4ab6135a6ac0d6daf1c914d9efa68ca09c0032a347663898f1e3e82e0f95dcb369787b06f8331224c6415ff5f5b8fdfea4287307e412b3f5d23b07ef9d2f462a8e5db5d153cfcc7234d46862e04f23a07d98ac68810c1771583f2eae208e3e421961639eeea7931ee477e388c7f105b8675ea6a8a7017e8e3f25d4f828dfc172f97e10e06498c7ffe6e06c89680d9c17a6d997ec4807f69d12e9210a247d5a68b51bb07c39e5cc758da3bc6088312e5eaa99189361a21fa9e9932f618fa9a399e102de108f3449b9d880261c7f8c31498552d4920f3a27f0b1b074911c8a649a5686ecd4c9c01f4092d2e5f68d85a3c7c60497a1830277ab0b7b1bede62c597fecc800ce932491d9ff40c518de77b9b283a55606ac4a2b104119cccdce41c916ceaf77dd9ad1802eca2a92cb0a0cdcc4f08c44aa24885880ad582cd0306b8451135560bc3dcff017ade001a6892ad4b80b13e5a0f60c6b7f981876bc1f6e1beeb3ea1ad91e3124faec8343f7f21979d713eb532a0d4329f69a228843770ad39015fc4f507211229f4a2d3c197262b98f3b22fa2735fc7a3d41f0f4caa565dd5575d8b6aad6f68022e4d4232abdc3625f7ec272f3d05efcec49d74bafeb45526e7e6c315e6127e676921c536bd44276a983f3d8c6abe95041ad01e19e10cc878f29b067eed6beaaa53847ca879fc44bdd8acd0054afa95b4907a5fb565a2044e1d77f463ff62d9286da05ea784819909bf8afaf2bd1df21c73a2156a3d0227b4d74b8397437c35027a92f1afa524946fac6a62f63837e763ce443d076913b169d36f31333d3904ab87a61dd47e4145e9af688be8b7dda74fce44a6c36dbf0c4c022e5ac0c088fc32b0a93fbc6521c197233e5088db795410c60db739ad4a78fa6b64edaa2f21e2b5d9ca470db47b2c129d5df6586c12b97fd90929352a7978052abfd23fb04da6206d3ec750d8c95b4d79c2c0e4825cbbddf2e05660c38686b688cfba9d4312501106d058c2cbd6a7d0a4916a0640b614a55481887e908fbf490251835157d15f4d14c8804419a31d46ee5da3529e2e3459cbdba0d359c220be2cba7073b6085fd9dc0dc1f18b3c93203ea55adcb15094119a8864e98f19815b31681bde2587b424bcbb21ca0a0c84e147f27243b288eb3063214ef178027f18402369cabf5596fa0c800d5d2b0cc99c93e493cc0acdf4dca1194ed3582f9f70f51da4657b31678134a7dcdf831aca9820ccea8419612755d51dfc77f9f8d96b91bbaad34c5e6e6b3ef454fae918a337112f1cd30a2e48722dd1a61aa03920c82c33f42e034f525383ed6c1fadf20e7a445303a7004056c2d01abde6313f87e1cdd7980b290b40faac75c7f40e8713220629c77ddeec3acfc09f5df757c4381cb6484beaabb43afc4046e93d3b0d2d2dbe8ef0910a5b8aa2148927fc6b9f51e6076da633755a2f97273294bdf3cbb849834ac9890cc9755c556976656c056888920fd36fcb80936104f7dc6217b4b4762da97205cf822521e1441c9b984dfd8f218641a22513b76fa9da5becb5f7cb04132503e04ef7b8c8fe2bbdf1407dc917d14088c55cd82980c28a2b1ef9151ce6029a4161419f145870992f81eeb8bc3d07d42f2d0e8d7c27826e11946701e3ac592e6b3a527b86f047c25a5510d9cab18cece06f51fd27b06641339639a17a580dd292d49e9d9894505bdd41391d2c757967f0db8c03617a6ecf99a6aacb752f18e339a1fc318616d59b2915653eeba4a116371ae5a0816e41316108d6a30881550c80aefda9e347314731259e049f33a716585ea0ab1f22a41975bef288dc721ac896d4fa0f72b886fe6a9407431bb3494170ff770ac30fcecd2625c0e8f91affc6dcabcc7b4b8ef22bed169abd2cec1f4dc113ddae97d61f21e5c887393c65da9db34545be79539eab42addcc068c46b042ce5f6c1f4ac38c2d0fb768d1ceee2f859a3af392e5faf0d8464ac1dfc3c1b100188d0e7f0faaa55b965da48ebd3e4fbb4b96e5f161a165d9073ea0afee3fd73ee006e8d16b0b8fc54e0907146dc8718be7852bb1374b1387132f5645fc7aca9af049834e43343749ced93d1f227a0552693ffbbc385a27c96064048442a672fb63089414a2ba39ca2122a153e162fcce3a02b444cee46a61e45ba49e50c3c4e009a33431bb929fc2eb6762bbc98a821bce5e81ab0f89c1c67f7a4dd87a5372e719e42441bc43a2bae14ab93f82a4f99e4310ac799e1bff0553378acd1601977a7434efcd24df500bfe6aae29bac55b35a02432e0ea826c78a3e15edd580574dbb0eb2d86284310d60d587506c16965e6f40fee4a93a85b3e8dd781ccb316b442dede26400187bdd4732fa1b7db3f84b43a8e4611a3f8a1b2e1f5f42b2a59b8fc7d90ad7986291c1e199dac8e3f64bc6c6a3683cb1a7e62a29325d4fb33ebf8493973f00c738d052486c71269ed540b2f68c52635ae7ce00d79d112485e83746e0d54bd00cbe1a1cbfa3ff9f949de46fe3a91cb4d38f78046e696951fbe8fa43f69177dbfeb61b7b02058dde4d80cda6f57b622a3606449efaece5d903bca2589b35a3e87edf4e1e2bcc6f14dc2cd8542da68a8849ecb491bca5064a323b85612b4de0d84670d49d7a72c14e418a03fde0da1e8e38bd0486efed5e92fff4d2413420ffa4eb39e921c4746e7c483851b4e02c8b9fb8553923e76a4d376f2b909a4e8b8519c80008ec389c5c732be6a19ddd83264109e138e4defb854e474f279ef91a83b4ecc2c575267238dc1464d2513a54aa659ae808127fd2ba6172d38615b05872926200f97b097302806b525375e61ed6b81d20d71bc4f4e973903ac781e362dd39d8f47ae5acedbe233330a9eb262087e0b77e7d3d72ec9ba707e59ac2c4fdeae4983c13c793bfee9e91b83bc06fdc066d8bc6debbb8fa56b73db18c28577812ea65b77ae7472d83f721df0454458c06f57265b6ad2b682640f2c70425912d1578a628e15fb921ab8efac16e560649e667de661d1de02e60bfe2c125c6a7f1cb8b56b3bc03370b7d8083d2d6e07063d1836e5be12d0650beddd7cc532f0917259d306937d35fc12df035691d9463bf88faf997cccd7797afdd926f0535ae07e4893a909fc1bb9742739059f21a846c78a59edf9bfb25aac07f890d5eef9ed64c96a81ffbcda43ec5e2d562cf0c016d17b1affbc5a923aae6d89c3d95a23ee83a4d332c97284362b95a211a6b0cd002c215edf5b890f194a3e383f189705abcb5ff65ee7d02a3bd7ea50b824a3512c781a0acae0ba87e767d00d313cc04e997439e4c8f05274193151afc2162ae077e33f45419dbe36ff7a79568ac24f8f09e859af70b62cea6df58f0bb85a26ea604ec5913ea2b9a0a17800904bbdabb0da8f98b53e2ae27d288371d970e4e53b88e41de38800cd3548fe9bcd02edb9236c210aa29ea03b8e88bf28d6cf087bb3ddacfbc23befcbaa4ef400942ecdd45101014e55f5865fcf0b900f68c3b9f4e3612d0de40c8e13c9645132a550477d62fba962c2069ae468eda656545ab81b09e37bf1a2cd29af52b42d74b92829e1555165e548fbfc29359553012d7795fd823e28dcf54e2b1681a8f99e380a377c984256e2ac6c30d469b3de2c7772059540a00d2f5d757b553355936a69f0cd6a64d7e1f36c873fe6ce18a108f6219478d4f2cafc8910314a041465b85605d50a196b872fee11df5d86db84f448798df9a6fa1b0d3e2b8b3c338202031540878b4c4912a1953e6ca5b35fab313617ba6f7d3495db7c6cad8f804f5f4d4aa52d231279c35202fae6f4c3726f18e9e159affcd355856cf24f7afc8e53708056fe7a663398527715e437d096b49b43cc0a12fd81a03d87b5c22207f4b52748a94012296b3c39208c9a6001b5b44f57c50426b982a2f91716563181db7720548c096ee34594a402cc6a4c90a6be02446a1d05709d4b05810625cf2134e77b65d513295d4ecd9cde2608df67ffc55933f9028c4ebca0625889007a89b5a2b8138ed98b14d41561befd0374db1d92753f171447d728ba3a6d3bcdad5828169a558604fd628bd2a5016cb156f2125a7d2d2b0c5dc551abb54c0448cf3d3703da94e54d120731603b792ccdba85f2ce47c71a983d04ce230f04c4b1f84097f987231678d2d2b26003c66e783118a1ccf5443aa7210cc1aa88f8da248b6b1b402bfe3b08e7a4924c00b132b1261107c2a470294a3d312e4ac9ede00faeff5197e4b893c9fcaaedd9fcd16116cad21bb0173371624deed36b38f5708e42454148d94ac422832eb5a9433db1cea90a2d289926efd678ddd0f81333507f9b1f83f9cd942155ed891537582a267e1305b09a6e417f4a67d769905eaca9981165ac2f2eacc33ca9f87c2b0ae9b294d6355200f2628a946288f2f9e20453ffae2a54319c89ab722ba6b024db8233a8f3673f6c4ff85a41eda38a8d2093686abfb6a963efbcf9c021105d25d7039fecb3248439a89722d06d87e0e0ab6774d5425d4ebf63b6e5d368fff1c0717430ce7e6fb9c0441a691b68998a7a6afb03274eb4cd21e7a9e872ecee0879da2f0756833b0e183f4d61c8c88fbf752734e78900a08b53e9dc810cd83e95f56c4b7e1177dc274e650cf056454207bb47089880760fef50269015dc4a8eb279f00deca3d2e72db6edc3fb81cd3ddd715d510c6f977f71a1b80ffb472f29a78755db8759e9543242135b07581c7de5947602a08e77fdde8706f36916b55a703adf5c44ee494325b27095fc6054a4421c297c4c0a140e8dc8ddc31f4d7d105aaf008d33dd636aa1666dc0a638595f03394d1ec7e4e32722d69248080a7f8b574c19648cc1e200041f4980b36b5d69f5cae51583d0960c3fbb3d3459dde41b29920fd9a2b5b73b3e3460da38084e51f4452fcae41f7de803a6a21d3cd2cf4e66746a8a1ff131400fe3f36094fc63a6bb7a6fc7ddd3d209c0124c8358cdb24c633bc3056e704af21420e34eab7d5d878ec34be71cb2f30938bde984f1633bdaccbb71be4e460c2875b34b467bd8c271810531f41fef9cfef32f9a48d34f032df59f7ed2332047457c29637e19b2b5893cdcdffeabd4f911c569a49e009e40c36de672837ab9af45ccf76ac31f48838bf3563aca89263619165a705d3da6cd396cab9bdd8ca789be4491a2089315080cfb2531637cedbe482c99ac95fac81389d6a37379cc509291123692a20285c77e8b70da1ecb699dc62926f7efe02823775152f163cd9137b162ce817a73292a0df95de97d4e5251123174a8cf590dde9da888644862d5c1f99b1ea66412cfe0f4aa63c74b949cb53a62ef7adfb5d13b20c8ef175067fb1f8b2a71faf7b4a31f6b6724b643a4eedc8f100b6ba0f701ee7579a773a71f4f428fe5d65f89beabf50e06fc6608164c82d65c2350507a0a4d43a86ab340b8365e11b5f39358c0d2490fd217f060e2ca2797a5f9aab874d97c2063ff5503b41581f59d1b4aee5a40fc92a42ceb2a2d1174c480513ba9cdecfa6caa5cb055f2c9d0ae8a224a93b5f9abb79cf56a882902e6931d1acf4f28198b01fe332c0600bf5f9b57e775f44cf223459d531901aa3c0c52fd505d9c70274799c114f2fd92713d79addc013ecabf2f96462f47f2e19053b1299d0fe05fe600f1f6e2ff26b34e8c99f771d7f6e5a31e742f35bf240598abdd8d382cd7fd5ca2399d32b442ebddf8ef97442007dc6f0a44346fd1caa8fdafcfc2c52a68904cb6b38d32630bd4b96e00ce7dae5b442f172538a5d49719bba0583c726bb3440a66750a5f0a340ee2a9b500c61a3786cc7525ac917e16261ae11059294181da6e6a873563891a64bd37132e4ca286d2e75ac19271333e6e115cbe6df05176b7b2522d208da0838ecf2a49ed11ec980cfe430718c826b9035f884b7824b5e48f2c1d834a75cbf46ea4c770efb104ed10d7fda25f5e2362fb63589a98162baa9e8c454a436908508a150cf42b03f74926b02c0f094f646206a472530dac15a076d00174e5bfff6859cf6c05f721f51f3372f076f0a3d7b50941d96f3caa5d6b38522a8067a05b81bf1e0549cdd4472187f46ec8e1de6494a71adbc500e05091d22ac5469ad679afa06015138e5cfee417c27faf6ebc9b281bc12fa179e8602bc27136bf13fead3d18039d82187a504a797cefe9e9e427681e420659016cd9d9238648b6636a12ff4df953437f0e9e63b273d6ded3d435ae52438ae5a7b5eb3d34274f1ce59f0603422f8ae4e5fbedeac8156f7bcc35a15fd5f43a20f985a73061dff36ef91260945564bc8f482e7bde4ba2bc9c93058607130e29159e642fdad71f3136108076bed2c33a654dee0c5aa0655a54c4016ac0ade832e25189dd0c0349cf28d8f60d2ee14b53c9681ca44ba6f36a72f0be7232b392c4a2d9bd058d304b5f4a2010b92935c804082da300905589f3d2237e0e9920a276e9fb24b8f35841a64ebba84af6c6543d155d4a8664472e5345d33605c4460a01a575b49dabb637277af61c93912d7bef132ca1c9b48b20a76684e5e6576a0d111c1d5932ee3b0278f022b001a423b76d4ac4078a94a8d66398411ed91b875d1b847ad6be154cd739cd6b01a0c58577bfdecf1a3591dfdc10758b95c2b4e0eb5f4e592872df78c9a101eaaf3a8577f856daff03cf0db6ea88a576e59a41baa3aa08a0601ae6fe780ff5fc80355bbd9c0852760221feaa05cc28ef2027f7201cb279884a03ab143577df4aa61b9da8ceecce8a90f5c05cb3a9f4cb015010722928b50f9cf763ba436357d1f079283e71fe6cea28cfd3826c116c10ea26ae59ab4b240b82618ed695bf87ee82692c098ba300d929cca420e9ef91862dc45ed550499e9d0a4117145762e73114ae9bb9bb81bdd6435c457ed6e668ca6a9ddcfb049019a122e4cf999e9a4c24d59f22601072085b6f839256d74ca01c1d1afbb4348a46543a9bfadf63e4fb9331b735dd4ea4547396e9b8206d43e21b288bbd4301e331f8e23ed1e0a302b9a153a89f5597d9379c56fd96f57afa424a9de045edeace0e2f7b9cca84ec3d044b5790ee7eba30b249f8b1368c64acdb9ef8c6cc721b0d2160eea23476fdde6398aa6339bead71abee27b562453e75b1c36f9f5077490568d1b29a01280c53b3375e4f8940389dc6d8c0c982bda8b51d567b0109b7d5165b10a1c8863cd1fcfb2ba0e8febf252c7acf71881814e693c74be38a2560f868b48320ce19f66d7fe3005b051966d00ad72d4fbd411ea0bdb89de2bfb8e67cab6607c8c4128efd11fcbaf9f88fea7f679569bc841edb02bd5a330b2a6faa4217e62acd3c2b51e5ef1bf4b78b55c4a9c66c11d2a41ad5aa53ffde97b134893db6f7ba185f360e53582ef9ed00d4e3d18d3e072204be56d61f5c33249b5d5fd601d1fb08053501eef0babc73b99980085c9beade1ea236a16151de9ba9c1a5fa2681dffaf77280679aa6af7973713e1053bedee38e9f45e1bfe54d5a4db26a6577e469e873d48c020eaee14d2cdcf86b4ea2488759dd141828f228e7d22a5a9405f4f3f804f5d2404d11af904e4a1ace3f7507f17487ad2f65f0a9af7eb34185109071c272e0e281e780fe00a3c62d7fc795b63ad504044e7a6086ac11093bea09127ca8da310de567337d31e0fba32239356d31d84dfaf5ba5246c84008727a6e15f80c7fce826fc48602396d3af8c230a7de700e5bb060a8480ac47670a4d21f9b6beee83f1dd56a9cc2471ed1ad970de11b1e6ec49e9a234728325fdfc01d3c59fd44a251061f1f82954b4b698aaa29b2597b5c4ea403818d57256ec975910bde54a086d4bc578ba9ec15a45f69302044f4371bd3fc3746ef4e201dcf5d20fefbef06296131cbd246cca7e75b34d1f9a7d872dc63e1ff18b4358bc324ba21f668503d89aaa777440c03eb7b553d7f86a5d1704044f9161835d6c1b3aa19719539458452ad1a654d97ed1a46f54caecda5a06d7375dba2919326fd9606527e88351d12b9485df10044013806b078041608b2aa5039b354857a60fcbb629201b80a54a7df5b001c1c3afd26d731a6f9c047fa715f6047686a138df46fadd795986ccc2f7cbfad3bb7d75ebda8692b9d735b6356eb8db61708a8073dbbd2c11f3dfa2ce2d786d24e7b3ae9a9dec5892bc51bc49f84dea31b36beef0bc91433da27a4efe4c858309f52d51add20cee1e48589483918742ef6da03af5b64fc0c28fb11714780c59b2e860925bb2f0602631e169f9fb1319cb4ba63381191a0e02868538295d995aad364130bf1b31d1c4ea5dfe4d9e802b05b80c7b8b7bc0fa461ff1da67958f5922bb192bbbd5cdcdc839b871d0f727bcc97546cdc8a292e68b429a62971318a6a84f430a0e58b9549fba5f7f85fce62955cc1f62f613c8a90ec3f1876195e9366a2f8cfa325ece83a1a8353c4ab66414028f7bfea98e0507354d19103b520203a6e2d8b6e5d59acde8d4e03070fc01c8ba73efdd39519b269ee9d5b2e4bd2f462c97edd243c3cd5ffada122681376b2504b48a163bb93aaf5d8164e0599809fb45f39804a51de0a5564dfb8339c096ec8975d9fa5db8062c6910a3ed644aa95da513a31e8acf2495fc68118911a0cf845c18fb1ca02500d350f5e0f3ab767c1ef8a92bdee44a2af05c2ed54a1e6e71942abc6ac22d33a86ca00e634a6735f13f185d8282ccaa69c9b4b5c0cc78d78bb5de9e2a8d1f823a2b8b865e3d952d525db84493088e902ef1aabf84e0cdf71694741c030f73274ee30f579c200969d7a68c0c5e134403fc54dc588657eeb006ea622a128ec772ca0c8341b183aec28069780fbb69f05ed7d408a4ada34ae54b78eb734bb8f516ef7f1e7e64089c20288b9550bc794b9a5ced7c36ea06ca4f5d134d238b4067ef551cba2cc0d6f94226532eb09eec397089d8eba2e0ffc91854612a26487e67e603e20183d6442a535c226eb459956214e84b348791298259c3d97621ac746d69a0997160e422a4860823f0cd416025d87a3d47a9e7e0ea112713b11865d05f576a7de806f1e7e013145be60d5d7bcb46fe6af43db393850a7dc83c8431097694cc61e962b1d9c1a692747ae6301f6e24496bd1c6a5af1b9c55633905d4a82cc3b49e0f3d0f070c16d632b7e1c1804dcb267c729abae27d56aba119616d1f7596d605e414e8d644cda1e02527b643d3369bffc75604a9e0f3d8ffb662d59483d4c19db5ef0ab622d76df142dc726e6130d4cda7a8224f9312cd6682d579e497a7f765cb6aa4ece260682aab68cc956d69f871fe783471a742dfa887fe48e7f2858282acf65c0da824042525e2e4be4d06b5b68ec3dd05ce6fbcb59de1a67cebda99e334e668407e54383061f6194f86bee556c325d6ef9d07965da0e4f1d92b0a46555b34f8a5ef542104e9329432d60a85c6716f373004d255d55631d5bfb3763d1628fa2dbce4cf98dc7580317e59eda722189d04c4cfb3c021682162551399747a6c1578217730ad8b2b2aeeccffc3a3bc5da181986bdcd70b7bd285b6ec4c5ff6b614bc2e34a49d27b2e591596a8a1644230b9d1da95642184e1e42cc4c28d1672b771b32a2d2070493563bdd0e577c4cfb67746adc702dc6d7122c70750ec8a0054762ff377a133815a368f4170ff4aa6111301d642ca1765d600b3d74c3d1d48d1c5194d6ba5c0008b20091c183a243c000e1497e5752ea6ff87aeb655eec0d4c93bda05600c9378d2ff19d6be180fabbb7546510b5032fd9c4f5b93afa2deb491733745b92e96d7fa7cedf6644bcf2cf486eae4901c0c210d5e85383e238a9f4e69fc5e06e172495a6f8d25c747b17ba3d5ea92ebdc3e32a99819c1d700ff29fb007542e397824ea887f23902e2b7862d6a8020908cf35b58b6b107ecde7e54140831380825d9734f8192abdb58527c5f87a81ed2a7bbba6523d6b8aaa9f1f6012ea4e97aaf1e739546ab0020fb00a1f8a7a655ef9cc253a234348ea2115a900daa37f5258ec70799dd9818d02b59db75e5784b4d35892aad01e0a7e588f47d7e5dc5ca3d266da035ef8e0e5fd27bce6b4be227a95bc2037d1fede8d40de692b8a41495971b525d6c80a48bc227f461cb163f79d56349038ff005978a32a9914a6331f2f9e31ee6eca2384fb7b312e68a0aa29531174e0159d744903705c3fd20761ba301632675785834ad4dd950c5f7829a16260e5e95e42c8207750b58c32bd0864949ef93fe6119790ed92e3258de2fd7877342b23beaeb2ace8b43812f687dc736262bd3b847e5d403302daa8022dc265eda6ec7fcd82fb14501adc1f74e0ce54aea7bc4dba51a06ffc9de62d0fad6ccf26f5cb9bb16c3f070a61680d80d874038e43fd0e2f83710ed67510305390416e0280b6603c4898a1a6854554b5558158c837d13f3f6a0808ed800963acdcfd7729122728ec8129cab2049792774524501b680b4fdddcae21f68aefa4f1a840c858356e3e60e296c519fe6fbbc2d83e877ae44c2b2ed05eab17dc93504fd9758603aebe1f3957c40ab0397663de01bf6fd9e19c3588da28b25dba93f040dea874facc09d8f8e225a356a82ba22b680cfeb830c7907521be98d3dbae8fc6908e0d2f63969357a3a5e5b7daa041d9e036a1cc8de70f900cc34a8df1c367bb0a070ce909c5561d7490f82847303d76a2ac8d142f1ea08cf24f13f867b3aa44ff4510a823b53e73808a167b86e1eb005733693a83dd293e6e1e0dfa2cffb4187505b34e835caba770280933d70ad81e17a5617343e6dbc0d2953ed462bb33ce59e9a55d5787c78abf757d32dae96e4ccf1be02247fd14bf6dd680aeace17c205e0ba3ae2bbb9e1a93a6c4573e6031f9012c108f46d3c4a03d54741fcdfb0917f7cda12ee7e10fa1c9c5abe55937dcd0e81ac7397fa1397a4be9507cae6ec549ba721404b91c653499beadbd65b717f125661baf50f10c1bbdf47bcc87e9baf08936ff39e0327d3a9f962c4b0a746e18f1e280151b29efbcfd6c577bfe7005debd84b1b710157b7b80778982be0d038e4005662de5c44f1a79de8c21deada909daa490b39b03ed9c0234841805e7e3f59cd6b471caa8f3ee3c608793fe81b90fd3cfe898c3d887a08e777dc7449e9db0569a5fcf3bad028440c01e519594a09178241db24c69db5a05f0bc6530d21e9c59df37a001461f88ddfc7884ef3adda46a571f5238b81adf05f07d9910edd0ee4c3b1ac87e0ec0b1fa12ce9457b861a259709d1a2f5c9141331fb20f4cbf414de29403153ad953812c05f23379b498cb8867494fade94a29d352e7a3efc7272ae97a4d67540927f0f8ed1c18366f852cb60267dbaef2c6e22a048a706714ff090f9b80d1f225f80bfc72fe2cf82d10fd4110cd832aec83930700477af3bb5bd949532abfb28a4199a5f0c720c92c0fdd221daa58a972b1210cb9e09fe56de8ff22e6acc125cd602086e82ab0becd226d5b82eaf56f2d8cccef9eb7caf968d412360664226baf43c05eda89d87382a1aa3ba08bd5dae92583354128d331697eb813b68f499193f948286aa8e39fbe5e18c16c42de1956638f1761d8eb971c00ee7d8a0f79781bd380782c7f411a99c4dde1846b206677c3d3692e916c008185389451d2460b0b1061d8b590fe5d770d07fd9059049c11ac59ea01168bd175d76c0e91e631b4f97f9fca40f2001805c418c82bdcd427364ff3f9af454afa8ce9eedba72088d30c7b96bf34bb9546642e2a200a692e091e5fb1a921410536d77fc03a0290c7086d5ac3552e8fe56be214f33dec5a936eebc43e2838013bfb011552f512ab1f0c7bd722f21cd7d22c0ef718ef98e4dda9822ff1666e2418e859de43f23b0d9c7b34aea83ba462e03c077c3842cc583419018154d4a2b3d63967d4dec9b6d70c189cf03a757a91e977392a4b049fab292a78318138d88c704f6d533d31a82b4f8e7cde8436db1a7c9d8999ce9dfcdeb3d3e93937a4fe478d4b5d86ca5b0881f6bd09b0df5013b0fd0e66eb8463b2d51543878797ef1839ef844665bb7164aa9f0e844a290f1f2365803dbfc4e44f7ed19260dc3c282eab19a382cf917dee1a564450afc00fa97305fdce3224130889848638bcdb2952833129568ae0d8404c2ccdb4df1394ae43f3fb637b255a4141c0412fc1ea4511ce8b843e1eea11cccabb5531ab10719c4fe46ca460485ca5dcdd879393f192e66f54ab5fcebf01ae40b6ee00700451fd96872110b7247569a278a850980b61b5d0d5a31c383316b3cad8d999398eb92d7ba9f9d99d92b2c7bc4ef231372d12206d4d593911507d363df14d2cecefd97c017237de799e9f71f03c1eda7975f49cdf67d772a8ba18cdcbc5afbbbe57b7f9b3bf0ac6c9511fbada5fe368cf75aa586cf0989602284b716f962651088835b7011118056eca5b326aa8f90e3724963c83cd2f995685990b5530684ab645361c9c163093c0d0239a0a9c7676790a9e9d2d4b94bb51643d2348eef255d6451fcf3010908b857f6b8a4031c70545fcec31ea6604fece13fad6ca8e262e794c16b3dc1181496e959eff1fadbc1f5b31aa12a1def3f725a7219ae64698b92316ba5ea8ca3b119f2abcb911178712eceed9b7408b001fae8919455c5236461ca7d59829751c35ea78a36e3ceaaef2be8611c963c8d2a2696abfaf02786bd5f7e1edc9b61089df1be0a677f9c71b88f7a8419dc767a3d904411b97f9854901627ca75379e8d1e2c16149a140ab76bf718ff7e87ad63f9652a47b45e67d0903445b393bc007e548c7478065359bf8d342deb6c4c7d4682b126585a51bef14474f1520731a064bce9ca87e10b103dc39a7bd62aafa7abe53aeedbe0b36cf7003aae99b7c0a7b24f30d42ee3b0d981ebe36ef3ace63102122c05338c6b66df9ba9d15465bdf50583fbcfc8ec0387c8189aab47a03952e025d4d01c48fa3c8e6224b2b8eb257f53a77477a6137b04447ccbe98682e99d1748fd5c7af7fc8e06d2417a901f8f926509b35a9610cda2f77344b2df0399d42b8fb7ad1b2b7f18814cdb0eedefa42538c70b521fd7c3941a41bd8f5cee4e0cdb14706afd03358bcdbe93517350c1a33ea10e80662596d27c5d1483b39633f8bf41404704dead99ed0592ded5b685de16c634ebbfac6a153357117cecf517b83a9c107aeb08e8ba61a74969da9ea6e5d3306afd18d763ac5279b9d657d788dd52fcacf76a6bfb82bbe3192fa460f693fd44e7545f5376853654ebe9df7d3736bad1ca9da5ad7b735ea8be4edbf85fe85c0af720321b344b01daa21f3c056fd5efa7b3efd158c0e7f93f8f3d9f912e6a3559c29e91df7995eba5934cb4380d379940c04b011c48a52a11cdceea10040494418bead2982a8db39672c362a486b8ddd7e56adc002633d9a304218fd4da10a5540d6e6000da35b277e6b3b7c1934e469942110ea55a2870db902a96c3872f6a39b5eee33f4ecad974da84a58aad5efc6a5a4d331a9c3db5ab002a4076ffccdf6def114e64158d29f99fd20067ee184950629a568af2ce18d160a66545bfb295a4bdf5cbe1b7359b0abea3f47868ac6ec89dd00e68a45b9544d245005b80e0e789cbc75c52351b4220d77d2e76da2a298e6a1e27e07e97b83a00feac8efd7dc486ae900c57eab8afa0c44553ed87917ba9e847d11fa4cc5027368ae22e139e3ef33377b3a01aa97e4514405c012efc4c5fea9b3747bceb2ecbb52e7faf150edca74e1604a15458bf41736d514883d45d4041d069a7b5781a852e9733acc5e281037a86edafdc15557f0bf90968c60854156a4df833716dfa345451f045e8399f305efe486f9c94c69544886d567f927ef5208bfa2af0c0178380d6060e376380f6ba01489a40eddfa08ea1be471f3e47ab2a14204ad2044ef4e380c304e75fe992379ca20a6b7c2d0cba0b26eaecce8103dd1ae2fbd3db313b10b2b9c65aeea125f99325df7ee7028066415c569e55bd20ea72ff79abc2e1465fd939d9be6f997a23909a85c11e29a35e723e796b5b60f7f4005814cd37a1314f5d77a93463e2f31945e8794f99e1c9c08161226240dd5d16b3026089dc89336ab3dfcc072f3e0ea0cd0221883dd27cbd3209b167b0633b1b7a85506f0d2796bec61c95bd1060dc17a94e72f2a4cdb6be96066b1e420d238d28bb5f8f7de2a8ffcb7d7a456a1ddcdf8e0028f54a29febd91be3c2377fabb674e347e7ef74b4876f4c4eab83ca8f328741d8a579e312fbef47166abf128c4ee1f664728dc769e715ccf12404efb2b220976897150aa6e59c53db96117b1eefd8a898b1ff03a045c20a326c3302dc4729a96e6d5408b6ae06845c06a28528d050f360e72ec1730433246a4c4a967052a9de5266d144c7158daa1795a5e703649b8b7fea96ac0d146715a248727aa956d841876b196ba91b70f34fa35ab230bd2fb441f93d87afc60835f8ee924988bdf5be74153a08f1152ee061fc20b70caa4ce9978014db908c3e619d1fafcd06f44d1444b3458f14f1d71627dee669d4268c8b9fefe5622d6f21fd7a924221ef6cc9bcc4a7b8ffb311a9be11a1963218d12a9b9de2d926c92535d63d91e9774fa124eff3c8fe2265b00fcfbeb410560690b13914198ab29b8ae4be12d60d98960623476139b3665b915d3ee345ff8bb7f6fe6ee9e89d4a2b8118d9a6ede164776551ee89a998b540bdca479817b7c7615b265f8fec17028ac3029575b06ca9fa29f116d778d3822a08b91837bead99a62cb98ece13868bd39a5d85734d0539a4f536094317954840bc9fc0a45d0efe3bc0b8f4b2ade0ecc7eb5cabfd537a33c85508d868c96828c2c896fc3ff403653e91fe107e186ff2f345bd2327f6bd372208d408851b65a291c9c86c4ec21a32b4a224822bedf7ff7dda041daa734a52c9b6a41226f4b791c8b0bcd4588edc9b0685f92ded290a924a546bc27cde61422a0830e41d2405dbffa1525fdd60688645ad36bb56a69639292c8ad606080f4a91610f769f93b7811e70178ad9fc0ba9e644817d7b77ce4d65d5fa6e55953607e8024fce418e35bb68935dfb32725aefd59aa9caea6129eb8e1ae8bcd8722063c1fe6056581239520b6b626a07ba08e78a29146d3d1fbc6d149608d71ac0916a3fc17a381c13d0a1770a734e8883861c9abae70a9c83053b16e9fb81513cf6e903ce25645e2b6f423fca91c97f908a231fc21007fd9cebb6736d2519a1831330144c78ac71c6739554b95c3429ae8258775ecd12b1ac5e895fafe5abd21e6e0059bfe7108cf5a149cbbad118e59f04571ee7031c429affad4ef411ae6015203394f8aebaaae2997a36d67edc1326a8a3353b659a4af27d4d24b0733149719d3b16cd1229cdc917dc87a8dbbb721d9d1c101ba534725cc5ebacfd6bcbdd25333cb63cc69f39c7989649c00220627478d436640955e6b792fbd96aab321088c829cf405793ce49f830275ac91c52f8dd993495f74752f9936508b2101705d49e246de57e406808f191cce9ac0b63a3482c4e0c25653658cd248ac8a85c1c4562e3162aeceaad169d583045734d598e46c04957c79b02cc8d0e633ee6b37ac28d1493ca01b1aa3d5c1145869322c7862fcfb8123e180b2d44712ed1c4cca1d78140003334c4cddee398c59b712b768eba17968989d84ab227ddc7c086aa7bdf6e450fb7ae2a597aa817682f7a91818630f6628f4a816a5beb38787051807a66a6b35664d2c3ee0e58025dffe9e29135516336ecb32c82f43420d4ed0c72243a9f6724623cdfc90b15194cbcf7fc59034fcc05708ed761503b9a822e0ef8f1825f893ee8114ff6b9f3c62b57ecbe5066b3bf5c2a4cd6e8f763d877f97c3ae8b633595f52acd1a8508e3d40f32e0100005110b0f854e07c5aa91fc789848f834f62dd981e1253e4b1abed2d36dd3cb5e6fc3a989aa343630326fb59454c6ab0cfc1c8edc76cf57fc84b695899a9fe6562b3ede2f913d8da35908209452a1fa3027c01e362e6dc5351d973ad465b59520c03d73398e6460703fa4290dff6dd9fa85326feb946d432fa4a4b6058b8c65ad8b641f3f244e76b393bfe585400f1a11eab9489363c371e9c61edd46bf5b2169bf5dd5141345631aaabceccd4a5264915bd2737a239a5c8439617ac64ba93c75f4f6252751e2435c8895cc2c5afe0cbea561d2d19bef9a3cb4b2d1efd01c122715793b7f98007bddd11a7c8a31d5887852ea60c009ea81136e058c7cd89880c0ea9604a3cbdfe44036f079eb4eb15ada8a5d11ca34b4a3f397ce043ef0ac3c18bbc70fb2d9e008a2f1465ed0f97e446325425cc16842f94d38d3d2d8c09e84ba8e24501ff29a22996a3f020a5b6023ce42e3f5a2d8c98036170ebc22516e6fc691364436613165e8209208f2cb0c9b1706a8078c187ce2dd0ade59a346244f89eb162e937d31cc5607cc4a7ac9f087ad90003d83e7c5c243b35d46524a111f5c08b4396ec344dee60cb5d10e139f634cc6f85122cd8b2275319a678b0337a6c8e373c750e70b21b6c10ccf437805e145e0db2e032607e4aafc61393433c3cc4af77a0523cddc847e379f52d2b49a2ee7da4c39105be552ad9b08b267e241426dcf677391ece65e5d44009ba704a600b34dec7d03f7ee851e70c1def90247724e1440c089fb49b906aceaa477f5f28f8c0c7fe7aa42c933020be0e01f420faf4e6f54600ce297860755d62844983087feb6f013fff6a0d67baf87b9b881fa5294873f3074c836bcaa7533fba2ad40d5c743107147fce83bdd679fbfc9279247774b4b784017d23d51143629667549451d1c3686f735f2a5174ce9b3759603add45bd033fb17112b978fb7d616c8411f05d0783caa26d71f48225ee7951d360e75837c525ccc3b17a65d8c0853edd36450c0afb00a5a745b40a0405ca4896eb8f9af68417208eba12c8f944459badf62583c56885772cbb474d896ecbada319498b082d7eca422ac9d4291138cef114087c0643ca8c9b8687fcb9f86f208190be8a44c8f362cfaa9bd692f300758493d09db79fd42f3653f0a0055616509fb0169dfab3bf9f696fc08764fe188c1c40c8d8340c43f0a28230f22f88de14de3c5f4754983713545cf24b4799b359dc9607066633032c7352f9ee221a662f6b0e006e6dacd78df49944cc3586afa6b1921a35a8930f407c548b65593ed1681991400171d2cbd72e9080c3f15d702a2afe1ea984d2479bf1cff1e041dcac36127d0eb8ec137f004511ae9c5eeb13a0a2a03186588cb7a5afde05fc8b3a33d2186e492f26b4a0eb060a3fd8127457375bcb74f94029dae8d0ecb004dd930b6ced8dbc8022e289fe6e3df2b8d1d360185045c5fda9f8f468c0c8f33a5cdeaf06f2ea9856481f42a34cef555bc380a70dabb20d9a977fdfd5e921794eae973eff84d22557496a561801c2a1d1d0d7a19c509941055572f1de724be8848b59ddfc72a382c5f998b35a3863d415f83ea2bcaeb1f59892b2b1111bc451a1a8808127639ab1dec57e941f3a6fb16572970187cde6860b70cffeb19b33f22faba862bd23f13d9a459e005927aac5a95280c5edfa556056d3845792f8e6959fbe99aa21700d99d487b579c8d6bb6de3329fa8287887660d6f55f95c413d8d46165fcc45f402aca9852bd26284a247234fb4e3119f37169b58d6d31e8794cfa495d17980543abb593184a047c1e023ddf5b8186c2b50e0dee5f9b1036e9360edbcd34a3bf8e94267ad570ee707694d380cff8545537f1a5ab2304c57fab01970933003a40ec999fc622162f66a1852338c59d6c1626e3ca4b0863c41743c6e473599de17e831210d20e0a5498155a27f24a1cbe93c5da6ca2f15610fb06673c5a05b132474514a55317b827c60137d2133d6c5ed1be0a94a0145d60ba81a415b1f38001fe6fa34188d89cb144ca64a3efd11be95957592b46037d37c79ec95caa0a4f1f29e91e768bc7f1736524c4f89a10b3bd998b682ec9f2cb54038b3f1d7d953ad72eec0d5bf95956df53ea8b37055ff650602d4191ae3da88807261403c2bea571c9ecdfb372f30f0418fa4dc6ca5b652f550ff1e08b29bdb9c6bd8c9f29faeb18e347e0bb998db9a908b1f9145d4a470eef540470279f554888c1df9d8ebeb45a4377cd2b78059073d6b3cd092ab907b057e0f537c65fbfd541d23f0fc3a1c16ec482223c3c2d5b5319566c223d13b3cf5c00a4fffbda5e4ce9cdc4990f177e550910097659f56285bd0e54de077b1b134885a672c27c30fe5c66fec7f76a59596be1a482b4dfd7ef7570321e5d1406a947a65e226b5616cc1d0587f09857efce0bb4009b153fc0fa1dbf69dbba51df5d885fff8ae306734a0c3521152586a44afe5be1200160adb0d644ca66a98d1299778b42f832237c52b2a8ab809c233d51b344963e96d80fea6584e683be862f4d66a252e42b9103e569f381eee766f23de8aff3458e7146306d72232ec00088d77a35868bf8f1b9e264a7969af73a802f297412a990c8ad5ef0f5b17d86701c773732adc8ea0202abfe4f9e4f3757fe36dbd9c06f9d09195153414d35a2acb6ced98b4cb161d6e5e08b3d4afc1e3511f0f39d019c53858163daadeee46ac19a97bbe69f3bb87f1352d6bfca9104f3a409cf7df94d68e018b7df786ef9681a32b77d69e3b7269d8bcfd014bd95f8784013cd5360c1088e01c616ec7fd62bb02799a72ac74a9fbf6cf93af54340d3588ac083ec050eefc72078a50ef76a14812c7cbb282cc8a5cc12a382fb1e6e23962f514405535200fe3de3f323f7b8721918be098c58bb776a7ff0e3b4022f6fcab2be2fb08c159b4f0e2c24f1527ea8246405bc1f6e6285dd23a5ec01ccbf9478d959b2881761208f2bcb84cfdea82c9bb499ce551317d3d704b3f75f74b695fa5124d88940d6beb569c54d315fc0a6f07a9fd1114e0dab4600b09e195ad949d04049238f9e437c4d6a33fb7fcda7387f948f149c5579cce47ee6770bde492aaa8276cdb688c2602f9b3e552d9888ad08f300c02b909f04480d9c8191a3e4d3132c4c699d815d655718d6959aa702b0440cb1909b7e92095c3b92a7c16da84382e691cb5023340e2089e2bececf24843f75eaac6d1ddf3e90e4fe4210724d0ffa67551d45cbea2ae82171b41e33b5d433f733d8708b809216de3de15f4529cb29545aa6dec5768722a22c1613efc4256263bbbb748a39869061ac2a203c14b1d2fc31de818998b4a5c0a40cb445f96d0cc3d410f25456a696799d7f7159d235b1d55b1b5e56938e1a4f42a7058b5473d0abc47c17490ec764f92a2c8f3044891a3316a532b42d28ff7e39b9a146802b24dd0d1f16f14f34b970b971d21750733583af9df02d31a599aab30780b13622f92006e03eb6720f6307158b1a7d3c9ca5bdbf21d9fd71f3ef69d9dd61e3408b0bf918e662d7291b79b8b3ab828310b8409f546dc96cba0af55e1bb7ec398e9e40054b5db1591e0c8443c4fa03eb49e73fa6f80872fc43e4e45ec0ccc9337ab04ded428e773b5eef17e11f362391fa8515ddc50c434af3c386ae2cad5b7252c492c032c4f5ed1505e8735cb090382bb3313308d5140198eaadc9a201206d3618a4d3abb0aa91304cad38526a8140cf84036ad5237b43033583547375e81e9210ae360f11e620ad03fffc68296d2b798e548fc65b43361b9655208c8306baae0c1f037c4c032c27ac6fec2438322cd91fb45d0b13023a24ab8b5918dcd73e8053417010c81a4bc19a46c7ae747f18a842d8e1421e41a9988b8f5aebee2742d736471462a8285e9090e33736f07798f94d1ffd92e228586c1eff2186c50c8f97b854e628a6d617401ff33fac1404f2003e4fbdf76714ef7e761e49b8feb2c8c827c6ef7faad19ca04d98470f8ad8dae372288e55580cfd2e50c09ddb78d28115818f60c50a1ebf2cb840fa16d075ef1ec8a1d54ad8c6b27caa2ef73da83186730416d6460bfc2ae2c71d6cb6fd709057982775961c787e1a21550415bb1f2397801fc45011edca693c0340d3b51de76dc11dcf8055a9ad21a9b2301b2c81c567080cbd332667bdeaca9fa189a1a446d676ce82c4867d24ed4314a2e387c97f231629044343fb94a118bdccb05097ba4ed6c60a8a2fd5f5c169877224b59fad41f711cd8d3cd16c3f85dbbbf253a60010b93d90509f6343edaade417fd876fe578ef9f0ab3c90681978f4e393a4c48025f56d3738bc4e122dea3b2ec94922ea0d2da980e4961360cffaf9b8a0d18b02be4ad282183b0b21b1cbd6b6ed23c5acacb9a2e122a9fbce30fdce4ed793f3ea9e35bc13ed39edb6243c4aff8d1b705755f42437acbc2aa80c4cb29ee8d54f4f86780550f28d323c750045335fc06ab2e96350fcba4b0e7c35874d276e40f4c9d974ccfe2c9177a07aea5a1198808ae83f7ffa7c2988ecb9b9d5c1a640eccae0965ddd4c80dca1b99bae3f336ed5805b83d74b71f425e020882d563d22e9263929bb3a3282cd62b80d6298c07a76665a6b328d5d91caf4e45b6e33f199cbb406d38c9be4616ed6bcf63b907c416fa5d80c83df9f31669c116ea46fd8c8c9ac4823165dd2189abe3f17d4d5c29cd2039458f73091bfbdba209b6b57619493346ab02a91bd9c6b6d219fefccf291f965a70843e58bee5dfdbaf670ce10b66d1ff4db8ae45ec698da85ffcca25eb20d403ee4b16e6a67e487c6ee834b56a7d560ae57c7b1a674efc9db4813e8c2130466444d290b2670135b318b24b436fa5069b83f4b1524d432a956a2eb2892adf8a675b525911229f0b616011783ade0a7e0cba664564b9a55b3ce3110f2d7e18d440946a7f43840d4c524e9c3f49cce0722ebb39f756c89e6039b6c1e5681c76b5937013919b67122cdcf0e83e8c158df5e6ae7417bfbbc08cec36d968a8eeaf2f912c4e151338c557b7a40ef6cf5a4f18022280d5621b3353543c893cf9a77c4fa4dc37dcd20963ebbec62f39562d901894035b2cb9aea5e4d46b28a7c5ae8b34fb94a0dbdb2349caad46aaff4bc9ed4d2d1950583c56f300619b18145d94e27c145a9f1b1e15fd151c242922bbba2d70e41cd4c47b207c6fc46d7695734d73474bcb201f5670488c180dfa57b02471af0eb45266a858488a4671c672c94350084c1b4d54c46624b22943a509643463d6ce31b9c43866d659d1cf046e942458815cc43d5063b9218346cf680cba086633c076fa00aef7531e8599c9ab44de90071cd852f2075fc3bc06503bc5db2949303096e998eb20a3983c059ec69f7a27d47ce8ee18401552d3b68e462c34f8bbed513c5af046a0668db14aabe85dac7dc86203eaddc46eb202c1d6fbce44ff49bcf696ef3a420038184986ed1f66b42eeb3bd4c0609eb61ccdc20436b901fe6c6f58e62b0d40f73ab3764f0c9b511b332b9d8c662f1865c92100308f899da659284c63173a99c21c992a1983b89696f1c33bcfe503533ec30737b3414d8b82fa3f95c1a156943b8c33ee60edccd1074d16562517ca67ca17c4ad4ad82ce23d7b35064b6eb37ee9bae6e5caa983ad18c7806a4d4da38dd9606355174db9d420e4f7d57e15896b5bd5b652eeb01b913f03921f428490ea3581fea8c65dc711618b7625c6770111229296f99e3eff098eb68cd36f748e0fbfe732d87f596ad06963e3aa766615d55d28b665d780f644692a08d2f25ed455ea61443d7462e6ef85a45800d03a5c8c8b8f6cb5e355380c3ec53ee8220b7c400ab2ccb311bef6b2e73826f376fdc89e39bf3f9919c6441599ed6e5c89f661ff62f1a57554cca3197c6e6b226f56458d096570af35410e314d55197bef7daae7ee1725175a6c5e53681b5cc1c05b8a2dfa404a5f50586942b37c4b46574b712bf8b95cdd6165a78f1bd210303f53c315da7574740f064d819243a1b61858dfc3f07b4793ed0a3692c32758224614f0a10f8c42c055f1d2380e9b83decd4d446837862be7e47036acca002ab5e5c8960f412bfc9259f2c657ed06901d9525ef7d0f77500cca53b241d203fdddd36c8a819bac872f44d8b89bbb498d76365e42ead113e3892b3c85fc63c081a397950fdb5a3c63f7d64d70f031fc4db642cb836ab7a5d76538ad5c3531df9101e9683406b2629891095c77ce307f76985edaa2dd01078ab70b57cef0435a5ce65b6e050afd3b1ba547a2f70fe4031e91c433ba3f8d6da801aeab8c34e76abe5d866696b9c486fe5342037e37c8ce21452d3c0bbd5491c2ce84e76ffd8bb7c1c333c3236ec1eb5c6302bcded2e63f68969588279b57a97b98ce3f8b481abda7e30d1e75e557375f6c688f2277c14128a07ed5253425c29bccfa18234ca2dd69791a94d0b10a5282c095ec6f289629eacc0f04b73840677a52bda14ad9c5430a62e4ca5e3667bd56694730e3e13f26cd875deccaa46dc4262b591d8afe4807ab201b54ca6e05e4c25e88714ae795020d2e0991e8daa17455cc759edcde901ed09ec9f2dafc8c90f6fb310c1b8231dea0d7baff95eedb03744ce8b51bd9bb37947793fc93ac5323397572df2a7b51d506ac121ae4f53d99f78ed226a9dc7df070ffd988e0d679309e7718e292981369b6dfdb464e9e9da866b6f55f43f6a29f9e1afe62591d9bd238690178f7cd2bba51efedcb5910d98058617ff3059364418ad3cabcd8afb1c40c1cc0b16eadc16f2c0cb10c44d74e1cb8806725a60ac492673db345b849c11a37f11c627732312dec92501643c15522208e9d73195a33ca625637c966786cc1634c9b924f05096aaf5dcc4a51113ffbc1a6fc5b03234784689fdc0dfa562c4bdb6976429d6b6d07e0b6a04688b85bb16fb81ce958c7752c500a80992072830495b947c5dd20f258a8eb8ab9d1f3d7a22d2864898b95e6b4076f07095d3950ea101d9b8f1558ed4b7d04f888b7d871c8ed13b1317c09c3bd0ba2a7cb3acec440121fee87fa80c67ccdfeb01b1bbca754d7e5fb5f1a85d53645579a961bed3d5f7f589cf809a1cfe1f6e0f43a095d22e684aa54cac400c6188141036c97dd8b730533b254983a0360d91c8485088e646251e7b011c6fc0296f68cddb137a93049638764edd123725b91f9c038eb96e9a88c8252377f8eff6b3650ef96c1283b6bc4b54fe8e40a34ecc6ccd9053a4dbd1d6650468b314418bc73a9c6bcf19949876936f31ed4bc945224a8cccb25e34d16e813321a13005d1ef2fcd919cfe4b13653c7b0fc9bbe4fecda89db713bcfd8add43792c34a9ee4ed73c42851668f8d868fdcd563848e1d63f003bb9bed97b162caf22d92c39f25564ab11062958d5f10882d2947e19ee2ac08bf4ba5f4d56dd4a858f90d7a068e85876ca0659c0285a4dfd4ac6fc86cae998c96881108c15da2d117dbb2c4dafab970f54d23d831ba64427366edcf6c8c448fcfbfc582daeaf393c4b2fbad86055b69d81e1c8cd9dbabec74566459113e62d78af2075e2ac3894684c5a8abcbcc074ebe410a3a390ed8c6315cc22ea0ee4bbc886e48ad3ad73da7da60726341d52234bb25e7915bcdc067afe0228cbd08a9ad5802dbcbfb91c28cf3cecfe0533023a971306bc148c8ec7ba05d08a993adec13b49f9e07aa42a0d27ba2e5b7eddbbf4fc1f80e568fbe8da5ff6ee39440b396bb948afd072c2612ba5e31f67062cbcc35dd216a1c070d50cd8aa002acdf41441b7525d025f20c06b802e451f6066dad5d2ca4f6ce59e9d5802bd5ff92a33370139b7e252018621abeb73bccf63002bb468bab922f22ebca6890155ddbabb2f18184d415c1ff42f6ed8bd5518b80d99a95473ba36842494936c7c333eb708bb5f46b12a936e34d0f3a3020b47a897e128fc7c069cece6b0dda58cc056c8f1885804d9422edb765beca251560a58810de6a68881388054d0445dfb14fe9de593916e66522c8787e2403b1850e433f1a925a69df5aac4d1b38b20d4aa0b6f98f4597572ebd39fe3dce6b288b7302c6c5eff96f0f52e6987a861e5dee7ddb4835960840ec0f193fa2ed09d780ee47af96a490f28724f57dc289ecb4869ab1add410157360b8f0e97d2e6ed6b164c9a5ccc1ea5c223e67e0863f51e96dcf41d6fef8c2c608960d34e507cabc4992402a2ca1c24b03096966db914fbf682da42111529f40a0901082029c65ff102beae2b082e6bbb9c03ef1c2a3e451f835b3a749811939f59e5f852fcebe516a6bc2133061e34ce24385bd71de6101024532de26300e8769e0116e53ce12652d65a442685c4efd1ba2c2702b155ab7f22f412a41db77e001fc01d6a33b8778c9b8048db5bec3f1d4be087f73e9bd1908ce58c98bd7fccab7512db3a75d8be389e936d4ccd1178ad15f1ec05b9bf9461472a057fa6672a60bdd4603cf82d168d60a41b93eeef88900818cc5f0793c113f9161d10eebad5e6c3d5f0d8593f913e10548305ee373c0ce2e81fff96c0a5641ee85d375357759192b6f2c4b7f9711668f4d5f436763e89e878dc130683f60390b5ba042f4a4d6d6e20d5b2bda4100442ba02ae8a905020e74a724f521d707e6a09d443cb4611a292f3366687a2c6691bfbd1a7aa15d9343ef3c06568493b7fc6881623ec1cf3d346f88ec8b6c7f6b1e0ee443309668c0bda21bac8984aa978e2b6af57c2fe9850c14179795ba0060365422a14f35b7ae4f833bce9d80aedae0e1656958536f9da212821711ec672eeb8b44cb9a5bfd1c5729ad193f4f7e137d885a4d9a46020444ec81544126b71d1f291ede296d979314a330ec79e3a626442a14c1ae477677aff364344c537014b4930353350d628553a9b2c4694e6f1e2e6e6b8ca5ad936a1fe864e5d9ba34796e50eb30b20a6f031979c898c608fa98274e865fad24aa2d7c3a42bb64e3c9d2447c35be5a746392b1d396b82eef90612726dcb3adba7011393741dbca499155bec6784c63b4749ae67223f16e14cdce3858e50f0d449169cc07a93976a28a2996ba8c4b188b6fbe43a8aaa40cb54e724fc0454c367d955bf75622d16459c9af6c718d7cd04faa8dc408a91834443e395d31b3aea04ea0d324802b91c46c28bb2ce1f27e90c3c9d5848d2864ecb4780db75ea0fadddf4ac30ccb98c84e0430fcd3c8347b95ac571d3dc96c270d0060698ccf07c13180c225cd1029bd168ecac9564e017881d46ae0e10228299ff43e0aed83e677bd673a0b1e97f2903a7b6d59b20d5b916c067aac8dc4af3287b5f7212ca6a6bc3511266ae3be89b14d21839411b1537b7549c8cb2f3491b46354e6d2b5f358ef91001664ab4936af8c13338ab4e830d3d559090a6fcd20470ab7a8061b3da188edf5662a65004cbc6f5384054ba3a3f6913fd6299027a4a0119b1818273ee237fad1b33e8dbc252fb3823389ff0d99db64ac45e07bbea76a20dad4718ebaad85d550ba1d8a28d76ec68ed99e7f2df393596392e835856579aa5207bc8828d11144a08099e3773ebfa7575a0c239697cd3cf08b64222c8a93c51904245a17296510918f694096f83f19d88af479c1142afdcb93862824454fe33f64df1100b5af1232bdea59416339fd45c779ee3667c0bad83504e8d128188f288ce4c8abb1b49f8db652e97511e191a1aeac868e1a4a48df26538d2d36ef9106ac54eee5da3d9724c793d81dd2e616ee66c3b8d0832140c960f13af1fedc199e1d278667ec2ed2370aeefecca7adb206301850ed90422a68529908e7ebff9ff6b0c2739818c7bace2972f1a37d1bab29d673ef240f55554d5def6597583a43a46e329deac53a4d8d76d9ba9aae4874c95df18f343d903f0bbb8ecbd9bbf5a049c46f351f8c66490478b21ba625eb19807c3d8b72d9a944eed8e4336f5403ef2100b9f15cf3b11c797414bca717e551f171efd4999b68dc8b3942bdbe74041b20ba013ebff632829359c6a1cb4a0c4a07540203e576c0bdc613a9f5d16364548b3b8c8dcc7074ce740da110a06c78a55a4ea2a84968b1bf30b358d95cdd6844d9b4ad827d5fdf5dd6a674485ab05e5c2dc0403e0c493275996c153b331e19e8d9e5883b24d4d33be686f959228051e4c5af83925ac668596fa269b1ad92bb51c05abac2bf35a3f56166322aa2471894a9fa3ae04db6a669aca5418c490769165427012bb43cc7e31d34b02ce48903edaa4e1e6873d0ac931dba0bfccdc5913ab28dc339ad53d1d4efd1491b279db814ba4a153a9d3a2e3f3c854198dcf5ead06cb79ab175560c56c47b8b8e65b356f1ad318c9f2166923f42ac6d29e5207048ebf5b239153b6537debcbfb81fbeb6a8c9fa1711b7a0e147e900df9c3a97d64b3f53d9bd7567a6017257ae336da108b7ff867db7b0ea86cc221419c2de3db26f59863145147cb8a10781fa8343444ad804f4e2dc7ed739b84047b435076518343bdb18170b4a9badd024f038cfe06eba44f33cb021722657ef84dec87d4801cae607616e293da4ab971f72faeba20d9724bf227340c8f4ec48412e6bb8ef1a68bb2e48fdf5b2fa7d8a6c591598b151bfa5fef249eaf6560de5657a7e975365b0425d1255c5d4786a5262a1d39607f73d249f5bb8f1725de8261f045b0adf654ab186ec941889f0cdbbd2a6aa66012b0f8ffef9e3c38768f85b8306a77ea072f08190ba16b00c9b12b55a7ac320718b30d5422a8ab54f60bc22da028a268acaa5920282e9837bb0371981a9170ef298c3dca2f0529e2e67367dd8fc2c4ddb2b8ebe2dd6b8b0e811f4407fd033cf6fd019ecb80a0a1e45a08389b750834ed6c38202c28059afc890ff186c25852800b3e54d306514b18abce840d329912420626fd6ac3cd27d3af1249558e3221cdce83375c16b78408ad2fd80772a97d521ae42feb9bd538d9a402e75b03a83f2cf9817233728dd110a8ded735c820861ba2382088abeaa3b1901e1372072bcfe3283fb7fe57a828729d4c8e34e3741fb7aecbb08a36cea27cfe68e585d277533df7925c541431288cf101f24ec5922738806f1fe22374a592120c5a52311fc2688f8c8786c9ed1287a4417b82130f2dc69e69b96f2d2f85f3e5203655a2e85b8143623bb4c05e1572bd278e0c8a3a783ed989309bfb9a63e696dc5371de8988a45a38f6c2b4267d8e353dcd35105f578a42186c5e77feb49f54ca2dac3e6a088882f6ba6e7d3278da10e464f153212bd8a3af95fa38d8f091af606afecc43cf98b6fb082ae0862bfc691b758dcd473772b9e74806e4c9706e95e0a2fae95175c2da96a6f6ef8a624f7be59bda42c05ec80b9abfaf41538ffd602e4c0d52f3f52a09c88a026d2e290257bf3deeac872f89702e25e8c32b21235b9377422665ee414154c366ec1f72b3263d19c41274feda4944efbc8af0b2b00f23e8aae80013546e33b2226c2a039890b3e91c26240cdfe6514cf941a53b551ad90c5cb76c165cccf7f5b65b67a5c49222abdddc2407b6ac7800977c0e715c6596b195e70a2941bfa71795af7a50b265be62d9eb513a099c29ea2ebca00b48684f2d211263f655179ae4d2d431a910610959197236feb14f1165f9fd34a2bc64a4a55870243ed9316d3454e0aa4869c815d6b2142e32146d2f9fcaf4e348a26c456d1c78178f7caf022e986bd6aa6332e77eee0080ec531a6e053ea52da9d5529d25b4a3f2ca52ce83b59283bd4925f16d5cb9033a8cae8658204cd2d21cd591465c6b22119dbbe32cc6b94323bdb8917b310900fe95b96aa9b3a0c04e9db4f571d037ed9ee6c4b9708feb747be667795900a087abd95fa448921e1fb8428c90c9255a39143c2ebf979696369152a69402bc07ad086d081f63247fa5973faca520790d15ace8497cb118bb116bd0ba5f5404de5a27e5c0af433d54cdb9a2aa56a5faaf2258ad15013ed82febbf5ed38850a758fda65a2d0013d517621c75234b26aa5f14c7d6ff2037eaee474150f3da3ca9d6da6ed7afdc77cfc47d57b927a2b19932852a68b922ac39ab60eccfe694324d22ded3777a6f047f8e3def2377fbcaa88fb5f2b755ba317d0f3281df43365d57f57adcaed36f7d482a4da1cdd668d356bc9163f4bb8f7915136df4e7834049574f727b103ad2d5db6f9bddb6faee5ead4849b920d5c4d4ddbe8d529140eb6f5ff9680316da7edb36ee653f1d558f7c8128718ea1bbfd12d38f79d4bd9c3b08e8c1ca984a69691e4d90fc9ae84fd2ea672b31d1f645605819ec6522d0d111e7f0bb44432527b62f8336a4accf2581decda19868db810413ef2602597911aa18e58aaa6c3f088c46c9cbed975898dac0c0bad40614eeed99b8faaefe8f74cdefde7b1ff53fb269fbfadef69554aadf9132a7fbc34ea12b2b5aa55dc544f499a051349931b4b1daa70fdf4645202afa1461e2f6416ed4f43704f86065a2b8791e483651da34df23e9f8225fd1c5c4d465984868b33fe01c5ddce8e24817f74cf4bd67f2b84adf7b10e87ba48b7b8e8130c99f421b13cbd797d419e4dc6ddb9a6ede315794651b6bfb2d4bd65450d15654dbfdc1d6b701c5fadc2f4c048689b6ee2cb2b1389f79b6ba6db46edcc817c85680bb6d5fd44ff3ce94337d6e5f8d1ead5b32d1f64571ac0ce8b7ff205efa1ec9b7e76d05ab7d5fee9de3babb3d6edc9d610fa7dbfda4611012ebdc23b9df1eb7fae0ffa034ecd1973e4886a081b3e7b160e703791985971c698d5c0e41003f6c7d53f84df45bdbfdbae741a8df43b6c810a610377a46ee2773ba237c5063e514dafeaa460bd63fdcac3ee0d84742d5a75630d1f6f77b102a08f47b0a67a4d93011b759cecbad688c9501dd8d7a67c4c7411dfb1a1caac1365161aaefdfa4fdfca6fa0540639ba8f437cdd7bec9bf6acf345f9baf7d11ffbad5a9ab4da127a7e1e320592f71b93ef8be7ba6ef3bd2d54cdebb9a0c7f7e934cfedd772411f0fd9d623d5f3bc6f51b102675df336a31adebaacd6f00c75a5bacc6384ceae9215ddaf7b83419df649b7a5ec6d7e3f3242471bfe4f3ae256bdfe563f3199fe30deae765b8344d93f1e313a3c76afcad47f25a7a56ff5033c64cfeae4a7237c2d817eccb2dc66112059daa7352f8a3dad0043520f348a97c710ebfdac3d80a0dd209d6b5ab75ff711fe78dd48d5cbfddb85d0f9392e8fcf0919cbbdfa3852fb08405019540577bba8dd6c8fd3690ba916724aaa36ec419b9fc1bd7da2e5292d65c2bf2b1bf8feefd7bffbec9bf7bfe260886cf914df3c3f921e9d29a9cd229ce91fb6ff47a8604657b3285a4ab9295c91fac3ec0a69e07df47d8d4faf0057bb55aadad6774e3a69e9f5f291526ffefb5075ddd8dae26bfef274904fcef89cc9e4d859cc30ba9ace8b7d43c7269dc33b59e7bed399208158d64e2de238970a44b039f48ab45d51ab1c0b1a7b47ff8fed5906cfadec91262332bf45b0bfd9ed1e7f0abdfe8d2de237b4ad733927e4b2da133ea3d553088fad88ea8576cbe4c469780f9b2f0b214ffc4fec063feff2d9192c2bd3686307623144fa1282ec6914b0d88023202e79847dc739694d875e44f21fab059224d21ea05a00456c6591788e5c47934a77b53e722412321a9fe12b70501d968578346582adf671174bae6f63ebedfbc6fda7869dbdee543e3a06fb7b7437d1af412f7dd50f3b96d74cdf7b17df73eb4e7c826eeb5efb46fea7eab96721cd3a808d40a964389688d6a639197dbd36f82dc3ca2bd641eb9b49f2fe54db289fef720fd8f7469316ddc90b657dafeb53d6c7b3ac25e2f2fb7d77c4fa3a34ba3cfe475ddfb00bfeb3cd2a5bd8bfbf0fb2697e67deb7d741f924de177df229ba83085df7d53ebbd079f639c13d80776dec873e358f79a42db6ba695a17d9d52303c22e177a48b7bd00b9f43fadd6f2493f72149646edee8e2344e7b4dd3de7cdd3d83b52f7da89b846482f5ed76cf44bf235d1ad37c97c6bdf73e3c6e74096900c738ad56cfb5bd9d4275236b0daa753e0e9adbc631f8f37d84936ca2c2e41f7adf6ddf914b3f8536d1cb8d6ca252bf693ef84e36f9871f922e2d247d74691fbe46ba3e007f3e53f8fee0cfb16f92eb83f9e033851b525473256cef8de214dabe2b890cf172db9e8336f7a966ce097633833c567b4a567242851ec9043e11fb604fc8a107be4732856f43afa715825e37bba8db66b471b5bab6ef36d27f7eef7dcfa560672dc2fdfc22ddfbd2245d94745192d26ddba891cbef61926b693e5f26ff49643275ef2411ff8e7eb73da7553b2e71b5b29c29da03b9d5b5815ffa42f835a0e4067ee70be93c97fe24818938e86bef36e7bbfab9db2006ae08405ab0f6006d6c73939b424e74c58a80018ef37d235ffb71d77e95b9eb19e499f3d340a413ac166e75cc008c96112413ac66e4320df13916924c339ec8043f83747dfff31ce3d0b544832442257c22f5677c4832d1f8094822f4693c92873f760a754b9c18ce4a5b8767e4d2d6b1b93ea8fff320d097517fc633d59fe1fa5ec6cfd76792f194a4fff3959cf1f599683cfd195f5ddf8c51fc1933c807c004dfe4e2def591ae0f687c8df731e30130e36bccf8a61a4fe339c631f139f60160b453a8fb1ae304dd8c91c6c81ceb7a5ae0f77d4ff8debb84f87c8cf063901a78df7ba3ecfb9efffc430a4f4dece8f0c48b07761832fbc59f47149072478a0d5c9ab040a5cb192a78c42ca1ca8245d50e3bf6d79420892c35587cf1c50ead2c5492f8f0c4841729317f2bfe8f38010f073883440c54a88a18c2ca046638a4a9e2898a144bb238c17295a44e93246d98cc6ce922cc08b078e12a26b2d17c6868e876919743238883950dddee7f55ca9143fc3aa980294fb0aa9a2cf14591189e2c31459c2b80c0e14bacf14085e1660d9d344a7401c68e952c29c8004395113c717e24f7b1f4727a4972564ca18aa9157098a289162a624d040e5e6210a208122cf49a7eb19f45187a2375c2c8caf366aa8539b166a24e94a821dc5ca19386033f88e9a207189240d1c4180eac18b343160f47aea809e2c995254aaca498c022c40622c898a952024587993d30664e921d5290810623bcb8a2c6ccec8a304f74ecf08bdd5c501015a8b30516477cd1448e101d7071a4cc14292d607142ac9ffbb986c25f7ea003669228628919138a9889759c2f44c8c0c2123b272861335992584541b3450a7130a006071a961002ce1739ac10c41552d490c5072c8a48c9627c030b761aa28d0f6fe24425a1429b18a70902cf124754e0328be2a598622a073b4dc08921c679a0a8d0408392333330f9007fc90c821b4dfa4510be39fbbf9c42cd59f1ff8694fdebc4450a2e4e302147ce162e311276b8a2031a1e92b0c148ccc6183150c000a686199ab09c19dc305901c91369c274f17190d3130a50c0305bc34211a920255eb0410c961aa63089f55b31c8c741ae7779df08f32f272579de44f1e2421d293dc4fabf5cf2b97a24da52c1152d5362ee203103556c088c2d4aa45a3803c417b105547dd1c31b2d50ecc4899d50a5c59a24508a781af271100e280cf0e104294eccd0b193c4112aa20083021e375fcac422d018d8c0444e0c8422c6ff1f2b4961f93f1eb5c6315bb85c468a933baf66cbe0f0c5752bac681d4cca9ab60e2675b060fdc6987ff9c3fcdfbf0cf26943b791a149e406e91fe29f83fd496ca5cf5e76b7bdab9797e57860042654a16526460b1129e4b0c5104b44a9c18b0f02b88282840f26b4b12185983fec09edca2ca4ef645abfaf568fc0605d04100addea7cec81a5e0f6fd7aacb50dc439a61115d968fba6c076b17e6556898737bea6907bebf028cb5150cecb06bbfa4252823975247f25ff176c921d30917f912fadbfe8c523a1699af6fdf6dd7bc041f8b9ff78946dda77a48cbd3ed7d736185b97a361861124a8e2c487216470c2664d163765bab431410918b621f5d607fbf3405236a4cefade587fcafe6edbecac2328a0277f7f201362f67b0b3c64ae9c4042852b40d029b26d1fd00bd687d43ba4ce305239602be653929b60173587ef0bbfdf4aa6e0c8d0d0839ca3d5fd1cbbaf630bfcf0c39f74ce6f8e32114472edb7ae73fef7db1804fcb981dbf63d7abe8784401aebdae0c3f7be45b2972148cae67fe0ab32f0ce1781f3b247d7bd0184bf92ff0b8cd9e4effd1c3d929bcf532804ce51ef04e291ae256edb9ebded03d6344df336e76600f0581907c5bdf650dd6ff44708538866bd9774fad48acc09a6d8bffe42cf3926a0d70017dce66f19d20d327f88762bf773b457f33009026938f2ce211a90fdb9e18501ee685165061db258998af59a254d906c61c78aca8958ff977336cff0e00f03a2071816ab39a186866afd1d2cc75951b4b6ab185e73a71365e1afe4fff28701f179d0af601f8e4ba13f8f28e9201b0b5e19c8395a93e45eb0f2bbcb9f2c3bdfffce9feeafe9af98c77ce248629d5c78c28a1916b600238c1992a474592305a7cd953b31ff178c091f7a15fde01c9ee51fa0e62db670c36a26043cae1b4518818c18f0b2c27eaa0c267b39e1c0890787ef25e555fde7e7e7473b82dd61194c09375eeacb2e90fd0019808f20c04295fcc14461ac0cdce14215e6657d28e0d35472c3f8a4ab0266c430fe17456b8f82bcff08f15d04f22902cd496522b8f4db5d14c9fa9bd6a1141695e65150510ddfcbf1c9fa776da76a6c78303c298238e646abc178ea052b5f5f2e4da1faf60a19e1d2a5796459a83eacd6b06734c1f6f49209a686cb6d341f8873ccfe306c6b6d28194ab555cd995651d4e9948a1ad9aaac5c65ac8c9999d9060a962915330529d87e9f4e2251a7f459c9a92b79e9ce4389f2642425de51411796ddbdddbdfd57f0c6c3d475865362d2c8a5e7e7e1461aa969da8f716964d2b8f2d20feec04b8ac732b5fa7eab6f92d21b7e309112188c07abd7ebb3aad2da604d9f3c6153e8c693ed9faf1d3024d81012c759cb7148b01d30d80e241852911df7e94b34b99394591816dd024a898d1428951615d4d9aa94d830d255e13df832f5e1bc94a2bd94faafcec18829c696937cc1ea3cadb556af934e6ff7c2b6fb3bfb7cc5a9f4b74ddbe8f695be921b6d24dde8a6342251ca836e55ab9456308732ad94a7b0a817456c447555701779d9f35fb0201853ea45b0176ca8823b67a078bdea689ef6de5f8386491ce713811ca03a188f8d44e246a5d7aa2595906ae5a1549194ea0e2febe7b175caf2d4993757ab5851847030ebc8c19cf3e92449a83f84bb17841ab45667a5b3bfb4332c73aa8451a40b2bf2c4ae701f3bd07703faf401270147ff10f1ea60a29e5f5c2749a04fd45ec90bb86ccdbd524ac298a87dfad7ebddb0de71fbfbcb7edb2ff67350bff074db35ff3ac692a8eb72f80e85b9d10a3bbcdb4b96d95b02bddc885d1bd8a04aba6a2535e8cbf96f4f57eb7c2290037d19070133d63edda78be47364610353dccc19020918234fdce83266872d3a78c104074e7b9eddd3d17bed59e64ff4092b4b0e9a3b565453535456530acd5c32a3e6d36c8a15345aaca8a6faa9a37a894bb594476165c94173c78a6a8aa7a43a8abe64b0cb31731cc7b92624833c79eedc8ef3f74621dbed4821362837929044c9212ff993daf96f7861f945e6d7e71c1904f860d9df49d707f5b5f74129e9f26fab29d49574b91226eaef6e8f812cc2b24cd2ff49fe142227e03245b125e0470de7a7390b21d064912505e69781340a7da77e7ea6679208954932f15392085792dfa9298359ea1fdc64533ffd4a9be833e99a01653fb595d64267a0b7dc7cec79468270cfe3f65f90217eb9e7aeebcba38c1a71b14d72dd3692d34696c3a489294768e1e48a33599c9254451d9162872c5d149956e018a1031760f2d860811ca214a1c2b24267c9d4d7455e368b65ecdf28462821042043f3c8e3e1475c5b17e2ef466f98971cd7ede414ac114a08014815cd354dfb5cd3348dfde946376d1b800e5616e49b085c756990fad4b7adc76be357a3eaca6422385de9edbb47d77dc7ddd8832365dafbd79092431c444467860d48a4c0822a88294ac4fac9cc123162a6f082c4484ca3d374d65ae7a4dd93e3dae96ff53957b5b456a1945964a379a43da5149473847959f4f2f25fb02fd98adc826cbe3f7d668ae4eb114a9847f45dfcf5394647ede9fbe0be924d75f2f3457262882fb7e50c4d6d69e2ca6077cc95294cd5d38d784c1053b77f0837d5e79e8e4ddd6f1fd0d71e84fadc5361aacfcd26fa1ae9e21815d59a1bd02c1104121bc41798b89282eacad40eb1fe2f2b9d4eb598b2e2d45527b283ba2858a4cb473ca7122c2efd40522221908694cd7eeee6c944632c2bd1e4e50f739f5e50a7378a9dcfaf438975d5e7cb7959bf6fbdd185485f5e66b73e433163ad7640f2f0b295a4d80e782855f1d6524ad77595fca68fecfefb8f6cf2c88ee4624cca4460800862d94c7252d5c4d7652ace96cc4288cc2b13c1e5641d70ba22882e58eeb5ef20dad70fa2695f491eae0dbc87cbef3d5ceee19ab1b0d965d8ec72c8c34b218e188195277ac0c2872f4bc4bacc183658d854a13ae225d6ffe5c894cb231503d94e7ea0d87eeaa8114ae81867ad283ec75489d0af24c7f8edf5ffd8dddd6137aab07fbd099624aaa83063e64acc5b68420d132d54d0e2853b317fe626b5439d7b325d77f71e9d2e1dbfebd3a74f9f3e7df2dc424a141723d2796254e857fb2ec42f8ad6725c59be5e53843a9f5677f7cd4b9db47bd39afe18e4e5d7b1759f8928585f1c5792378dab314c70db285801086c1d406d81988eadfb9a47dd3391972ee43f328e003091bf7765af912c6a3892581898e7738702fa7a041e73654edddd56b76ddb2e82090b58aa08218495392f10408b0c3554e184942a26318f9ac2440b175ea02ad325e67388c0c24489246fc03ce1944d7d246a7bf905c1c0cea773beacba4fe766abe90ca4ea68c11a978519ace370c2f60d291335d9fd0c9384741e6f9f2d99d3d5805e219de70612beaf0ee0c1c108aa21a8b8c98ab96f20f3d1596011f3143ef8322921f90492228889c0638c80f174b98d923df836e93da5dd7f9d12dbd7f30ef271c03d7f0f7e8efbee9daef7dce8bdf5f299bf7e03893f51fc61ee7e230b77124830c505cc9d386c6a88f99d27353c11c2c99729a862fe5f524e888f338062b5be9c0ad6df6a7e83b08c7ac0cf4f67a860fb4e0ec2affdc75b0fff5ac739e9288523e7e5ec5cf38122cc28c103174e5c49f3556040a1872252272089f57fe9f48a8f3e05462c5025937eb0b27f6bcb2538ca1cf84f265bb46a2c0328bb36a0181853a589138c80ea220f1563b6c83913c50b2194c41e7065030a61ac90c4912ab12b664c18220c385d6879220317ac8f16bc4cacec79e478c8bcfcb221d3e918c4bfdd9ff2e8eac1b2973c67b8c1f62570577b9edb36645e7fea0169b5215d49f0e7a7e27842e384a91fe64c7167052cd298e982850f79a6081345acff4b4ab52e957bac2a0192c9cbfee1657f0643580930fd70a3f1bb30d8ab2cbb9b4919ff6c61797bee32c9bd1ac6714c75f94390e7ca883c7d97e71113cbb88dc9cb8efad28a5a19910e992b7b7e4e083655d77dfa07861b4cdb420ffae90fd16eff5c62fbd2ff0ec291ae1e7c351202699a56291ff9e3424d7f5efe30fff72fbdef9436828f83ea1bb151e5eabf605ff2df88c1fe95fd3805d142141ca0c043840c6e62ad15f27cc123058b306e88f17ff9e69b4f01d40c52f9e3b82dc8907aabf70db23ddfcd4159dfad7f1b8368df97f392b2f75b71ce33333f07f1053ef6b1bd02554ddbb620aef3a837dd6baed192395dcd9fb6dfb81e6e7f92c40d44706521d8401f3dee031b0441ef033530629d948960f8411f1454a98f8f8f8fcfe7813e8254a08f61ab5bad16d716370e99f531ecc15d211db67a2c6c47a5d1928dd02302c9a0d37ffa87b7964c488fb53e61d22702f9843d7aac4f8c182c234c9201faf8e3eeeeee6ec59fb0875f2e4a9a11f6987706e8a34da211faf893344118c347b4a2d8d3124311143f5114454f143b4e14374dac229da28b628b7c8096ac0397bd5ca1eba4ec0365d9348eb0b2a2db93c99e5197bfceac8b9d6c1e2ee8be6e911b5110d65e24db71db49e6c260a1654d9e362470812887302740b903c50b3ab17ef6e2c5ffb7ffd9f291f6f4f9f905070b1fce0c21439d16e224cdae2041d3444909c088dcee65aaf473fec307fa0ff98bfeeccfb92b2143870bae1014ccaf301fcc18fdd6ed2e5bcc60820e2a7881831797053677aaa8a2c2093452f495e1c0c139c42ab4744142668e973a2a0cc0cacd9ba8aa2c1c8ad8c0e7ff2cdaa3d784ddbe1c562571029514a02c21930587165937e0a1426205c61b9f3e9d9178bc76dcb932e7d4c1a78cde210cb0e2421d2de08489424707a820b248020520e82011eb678f9a3e5f4dd8202f876e49ef0f9d2e2e2770644e16178eb48153e54a183c20c96ae189257066d49caf2b6c5019da575fd11d5117eaee1cbbebd3840a59a4d801ca08a07228819d2f5428f305cc149a46ca26b5fa2181314e49c8a04005082fe03ca921d65358614286239c949943c5ffb9257e340184541549cc04f124c917542eb081014f1348ca1f360a02f9489cfc6549a6d63b675041051628b3365151208ca9528526ca113048f052b84faa892e4404ee9c8b8a7ed186b1ef0400007cdae7385e104465d982ca1460686105a60a2b2b30c07042c30a2a689ac6815a7d24ff6677bfe6e6a6ad4ab2c59a3e1d8c7e71040abeb462065c24602468989af2226689355f1e70040c01a58cc95cb0c444fc3f208700a323d805396aad46ec46cc0cbb20878e1d18d45ae7053974803f3b400cc604d45a71e8a006781ba18bc9258e5caab55658adf53564c18e221b15200083a30a28802520070540b5561d19500c805cb5d60a72b5d60c9098f932738cd271c6baed3b1e3c6a6566d86b0af177adb5d65a7980f307ac9526f97863a3020a26033db3ab86264ed0d1f02c682335e3fb0199889fa332c21873ce3981986bb7408d6cce392768e7ecf169c50043f09bc1561e8d6e024edc5e5a8deaa240d30235d482366de3454403ffb7644ef69b985dcdae66575750cc44f3ca096b36bb9acdae665758b32b193de387db1123867d1f192433518c183ea4cce9daef9ff133f214c29acd66b32b0feaf340f0039dbcababab89e4eaeaaacc6c36bb9a5dcdae665758b3d915d6ec0a6b768535bbc29a5dd5ad6a1db76d75764565761595451c386fb0e8ee2b37596dae60d3dd575674f7d59a2ad474f755775f6151318514514091a6bbafbafbaabbafbafbea0acdcfa939f1362ab09382d9290071d3a652030041b6e48a767cf1a1c98338c1c651ad863d7c03ebd7d3d1b03effd3b37e72673b97df03aca3a54a20328473f4bc873085fc0b228dc3ff07d312e7f0a290c00e9fff7c7c7c7c62c4b0ef33fafdacb5d6c7c7bef5796b7dec8f8cbe61ecd9534b7d4f2b0c8108f86179b5a7b40cdef50d332fa7b40cada5adf40c3b3a868ec1c73d2bbe39eb8ff7f5775dd7b147769fd7b97727e11c836adb5052e9a5a7b135e8c75a4f33b5da559fa397bf7028350e7ffb3334c4a161391d74c0b4f443a97578f07a3180aa832a262f7f0cb50e0fb22c9665c05007552087c5863f20088220650bd2d82d3db5dad56fc95ff565387610b18e1f8d63e376540de9c777405ca8754c8071f86b6425652ca7024ce43f25509f3c2e3a2eb83a58db731dcc320fa00cb0366dc27ed3601c8f6d44aa55d3941cd63a30601cfe5e66c044ee7787ff3cc3cdce947adf96ebcaeec6a29797b0b2751091387a688e5389d53563fb6f19db7fc950f03e61fbaf139aab03a53be65ad9fe4b02db7f9bf8c0cb04388307d2ad6ac9d801bb4b5c3157899ea2d74b466ba8bc5437cc4de282b95f6c5f24ec3dc2a505fd03552051a480fe58ce91c60678bdd8fe3b654770fcb7d2ce7cf34b0ac2f6653250585df6d20067ac4c4433490b8e58ab0ea9b0fcda65325c88b94870d472d65ace8a334aced3d393112d8e582dd0dc1d72bcc8d862ca9c1768dce931e2632caebbbbbb1d8b0b23b7e75b61520fd7fa304c6a8573acdcf0c13029e4ac7765e0fdcadcefb9394beef7bc0517db3d93b95dcccac1a28515d626408b17383bef7c9b051171b2c42d2beaf674d8a48d366f8b5c1e29bca32ee238e1041ea8286ca008c3041131a718b290810e9d2c4cc0a14a4cf69a22891d2894d8191346ccad84c943c4122f4b74a813dbe1d36189269dd7be27cc1c57063a71e97c0e4e1277be8df3f446ce1481ac0871c1f56f581022993735d437dbb66ddbd35a2b27132beda931939af69ccfde58e3346d5362a24dab9556d752f85c1bcccb3fa78eafbb187957dc886a2182737cdff57cf7ecc91038cee29058c65422ccbe4affc8bbc56ee92eb722716763d912e6f60f5c562c4bdcd9916d8589ea0f24f0197bc653ac58b5a4665877f6939ca727a4d798e8a7164ca82da0509d8b93162f947c3933664b1830540022ca0d557401e2082eda3c418200df940e4cc14203104bd274a9d3e34d0c39ccae48b2c20fda133a9f94381bed2758752e7c87ad388be5707123e6fa87d04f6011547c424255889b47de0785cf5f0a718e9ecd44ddb31bb51b85a4e842ce8105b73af8165cd9518cd79308070cb1431b26cc90897a2a43a7091330593e44916707cdcaf7e5c0a63ba20476be89f5840b379f24095df8b61b362d8b0a2436284e2cfec268ac90b860892f8297c9b80142fcf182a77b7202124f8e38175a15f48a70f220861a88824486333a4c3163c50988999a19c2387103250497961b1cc417dd48796eb82d6e94706456182b7067b2b8b832ebe6889a52fcb1a4ac446345db73994c96125756be9161e587cd8a112d6deba71d532d59f9dafa298bcbcf653259b3cb5d269325a5d581c2c51826b3bb30913f4fa1eea6f2d2bbaabf547db11241b501c57e1b888027ac4369afb1b755961bc1e93b1ed5565ced353a5f5ced899bb7c3aef2b9967378af91d0b7ad984853c244da94f2529b314c275e6ab2e9e46aef79cf7136a058eff26f70805bb7aeceee9994d450134d7c36a058eef2db80623598a6b5aec669da0779a93d47027d676085f6ef475d444c1bed28a2a16c7aca3c92e2b695152d1d0544899cb5542fe9a73b1da3b1fabada43afa231565666e19eefa573920d7632bdfc9242691b37e23577cdfd1c9cae39fd8899e021012c3856b4152657067a6a62b832a65203759ddbeffc1e7ee708770825b907afb9fddc64c84465921c84bf92ffcb1f9684b746e7618a893bb1d0c1daf3fddd14840064e9c7b746cf5a72e629168eaf2bb117d19610dc7fe90791dba76f85dffa2408a4097ddec1f7de87ba530a4ed1a7ec75656c258019ac8cad469842fea1931e69255e01d060656ce54173cf91b28d243130f68c617feea9a9fd1c349d8797fc7f95bce47f5d61fbfd88a73ef0587d59035591480b3f8cd90a8e8f26f6d1c4969b9ac73ecfdab8f7c8267f6efef64ba4d87b1753d7e1071edb3a20239490259595f58229fdf0be39d681f29efb6fe4983672ecf3c611b238c6e6630facf77d41ea799ed669da73ef799ee7799ee6cfddceeba78672236f86499ae79ee64da73bbb7b6e7f57f91192b70e7c14f5c3922db75bcacb6daf6960a17e1d6e776fe9ffbe9f238184d0c562f1e81a9afdcee08eed79fba40f6fe48d75cfdc6978b6c49085141ab4af6192365a6e9e778a0d3f46cb7ab08e62901f87e40dd537f4142d1ed9b31b6eac467654177db17573ba728368dffd367263f7dac8b3d9cfb33d998350a5ac67dee8df51501ea1d1a864ae564435ca10dd08032000b3140020180c0a060482d1603820689a247e14800d80903a74541b0b855192a328ca2063082104106208218608cc8cd1c601485244e28b35ac1a40710843106203bdd8fdc8ccc04f0a9e3caf6e3ef05d32f64f27afe5b1122667bd452a94746e11160c66d5850c102f2d3616a817d6f1a998a948868ae5cb3a90eb0a884ac5471715a59598a723a6199e44805dcc997fd852744665209e36de8d939e09cca72a264e3b03fd627921d29c3eab2400e50ee4ed98089f4798280bbcbdab036e82596240bdfe76c61b6af9506f6f9c488b5a1ff4da8b13dac05a5d536f225a30a000398d229b363beab23368517b52c125b3bdeda2d860ca81adcfd29d1420f262131633a10988f9824f31cdadb0fe3903d09db37be63b03580a858d94c13bceaeca743b561cdc080b5bd1025e40577b560a954f3dd18e49568afb0ce5508f584939e6466b03da18cc5ca6713e12602d2190e07c3707ea02a94726130a2ca2b69ae1200410d2674291ae86d70d46579d86a212d1ea9808148bba821a14e364237e7cd23c002d234cee844b7fbb5f818e41d94bcbf3a80b138c9bd60e6e5daa0b5c64c252ee00ba1d75d5a6b1a2c411168a780ec05d3cc92a4a0293e79f5233407a439ce3cd36084c7b060250f818dd7cc605a26d253688601dde693398875807a1c77949b3049e934b1004fe6478bd51d350b3a21f82fa1a3346c4264a4d35db0fdc7ff9f241f85aa5cd8384ba7f7852a72bd10e5498adb4d906d2785196523b1c3ff03dfe5b0f52435cd3f343b8375c2aca17d3315759b14764296d1c97590510ec3f428f32052dda600b43b0e50d223b2e16f6ba7923b57b8c5f586f240727c64d481dd26cc62007a73fb3310673db0fb945f3aefada0421eee7072459fd1fd7360563696c715a2307a081ae0ad0773699480431758016348c4318c0b1d853268d960891518a77b04d1fc096f498346eed3fee94362c51b879f2624e6b551163778a091451f11a2b7b701c3c0e8e83a71d8c1d672c859db4988d170e4f323c345779270997dd07eed01e8043e340c661ea0aea247963fb78cda1559a6c906b505ee1c4d1b07e25a68111b6aed9b2837fe16de6e3e9ba3e48c7e5eb1a1f0bec96c93f0439233b42e74ef2b4754c87a5455da79e0767142f2b24e26bd46523a9a24f447bb622d0e3759b6ef09a8d1bf0b51755ac94a9e4c4aaf4ad6e028814a359e79d1a6f1e9a4381499c07adc1098b8dd954525bb65ed24af1cab05e516faa9b69f87043ae6db9c971330d924c5c4efad515167a5f3d85e67ea467bdafd3da2b9cb93f8b31697b7cb8ca11ba2a53bc66988cc1d142ce705b73e372ebe246fd5094cc648d5b4bb1bc3839d46bb9266195166f0613fc9120df148c3a88ca325ae60da3b2d6b863d953948f4c2287fb77d2821ef06bbf351023a6fbb6ede603ae4a45247c322d7c68dacbe066e426ac3ec5ee351b3772fd861bb91e8f1ed24a919565112696b3523484bbd1e9268dc2dc88b8018d6137bbdc40936d04d26289e903ad2e0e8a9ac432b622fca58e5d82395e6350bd8dca37a359b64638c425136c7de1053a42dc8e58f5251ae18eda27931ea99b6a6cc7090d0e77c70093950ac45a992289b045a11a8d51380411b622e640323242ff00525ba361fa5e59c5a7933f9930bf005355a3235949981f80a9ea29413d95e95359acd58093b0a36719993e82c98da7bbf88a5d985e4e84acbab2f9f312f061d1d25dd9cc4dc6269b616afab15ebbef7f747126514e56912a79ac5057314ae8ae899f3f91d4821f913370b5caae70f7550cb50d12bda09f181c5a86103b46bb81817a6ebf40b8f328c35e8d19c341dc2f2a64b2e262046cfb865c0bc1a0b96da6930895221a55b5851ecf9f520b0550c074105a24ee958c01d9561a5d4389413ba21ad3cb8ba507554c0c5bd04d16d507ad5000de701e05dcacb7cd27a1815b171dac5113f2da235a18edf5aaa612235c4cb5d66c1840115cbc329e4806bc8afa0631d850893bacc499ed4e3f20bf9fbe002a2a18bc42ea1b8ac188a1aba428e23f506f94c95957699bfab72e47ab9a5e46fa451c0f1358233df327c6d2c62f01e683a3ed54ff637f138b432952f2d999889af870a7b67469247315b8f1b80b1243e546ba793aac6da275aa7730f1d91fd382e44eed7db8da0d48dd39f2a96abb21b92a15f3177610d1b90895ccb617ae6d204ccdd98bd7d077cb150ed808d2a00a60d7960f11a367fb04a87a5494d82fa6c02f5451ff2dc45f0c24f8fb36b94744450684439109ee664e898c34fc3337e5647b79def320e6c26f1223abf08b0c64ebb80a92ed9e585c68d005f710bb597c1efc7da604b7e53e7e2bc0e0ef8af680131b440818d34b01413012160ac880b7a61c2834f81b3df9b3a275b4d519138db07fd6cc01ba981df4b5e84844ac6c276a03d74a90f701af4eaf9dbe9e29df111185e16650191c35a63c9b671ec9ac932a0f59cc8d8cb2a305f92ead9195dc9ccfb8fde428c945483d8a9283ecbd1efaa4af2b2f5b593a1b9244e1734857fe969310693bfdb5ed4cb13410cf630383ec8e7dbe4a87a91d5ea78bd76253e00b3c07ebac68182753b8dceb5b16c0eab2ed2869a03e4de001222bc3cb11389edb3f4a7bf66601270b97ebd9beca42de060eb8e66222420825a28a7a262d67d6049b1aad1ca50906ef881187e7d150be37e5b5674240f788c846d1e961020d8f0fb6294db254a4a82b933a2bcbf69c85ca45e108042d5a0ccb1ba4ef477683e112e15c02b49cc40fccd6e0a373f325b567e07b902695c0e40dd25f7c19bbdb1b671fb850a4dafe4da2c336bcea52f4db65254f8c0bef9387d7efea94d99f622f00e40833c4aa580cda8fa01d604688e04d2cc4ae9b2e2f0ed07639543921e51cc0b8f5f71abd4b7dcab18804049191fcc94dbf52c9a44deb9df94a102e24f9dff6374ace789ea6fe1a6304a9906ef65d583f9f8c868b0e7805ef30275aab876819b3f77b730f55306498ca2e054f0a82dc81aed069aed06352a953dd14e2becd286fdcede72287383c1106550c15cf0dbb0464315478dd60970216f3dcbb576934f532bc73a5b835eaec973303e3bb77acaf261684ea29c5ff132e6ccf53f0e06da905944f763ff706fb38dbe1001e2edb45a1819ba06b684d5dfb3636cef50981ce322acb937b371571878e5abc2102cd705d09ee9211140c6a1e0050834c46bb376a30508f46d5f36d9fde6af8c2c8d989bb5e31bc7680ffe254739dc05dc7dda2dcdfdd137b5b1eac490d0ebc5fbb94480fbd3edff9be3a96524728627d67386624d89a11208e96618b8c110324c99dce3867304df18328b910f6e1a3e3c01ba37524433101b0f5f2b91a3a3d5a434062c79ca2fcbeeddbf2e0ef13d31d34c523d362895eb0e377e9c0d7f8d577fa61c1929aea196ecd60675f2e18ccf35b5d6063e10812101e162d0721202759de06daa65edf8298bfcbe19a2b79204b421e4c63c1a0bf1597536de94057f689d460af94225b8601bab25689ff5b447add86962a5b0f3cfaaa3c9ef6bb39371f21ef14b46776ff968496d30720d0b99f25a8fda1546e8c475e8016d96e3cb9ee01b9caa586fd3fe1405d1a6a7f1ff71c2108699d67051f2d6ad759b1d279871b0d33158e2a90ef970cb7cdec6286e298750a8f0cb3171d10eff373e4d3f5425c3db5872bc044d8a283f5f25b93eff4bdea1c1b5abd9ad11ab4cccf91cd5fc2943159313ee92bfaec8a094273ef5fbd570a3366ec1f2443a3f1bcf17b6b65c3b208a3bd9237002c332a148589c967542c4cc4490c6336a5c97a0252c7bb714276f1c6936be174ace4d80dc437bd76f1a6dac0723f7496400c8394010b7bb81a96468824354382cd9063c5ce22948f2c4ae87c243d7f90eb2842bafc2d55fc43520516caf4202a208b0c391a3e9b2011a8fa9a01bba10f03a0f10563c26329665fa5daae4bc31e968a4103506f6dfe6e1d4b3d46ad1db675933a3641bd778ea2249a46c50e263de53a96bef2ced11b86aca7468128e75b1d072ac74a05fcc914453af634cbc0a4b9d269c194f167a070cb5f266f8924a4bf51bd29391c09d476336cfc8d89286ef2d46825134a66510529ad1b3ae5746ac60447c020c4959e37a4c9bb386856cab01d1c4d5a3f1de0fd60a61b06ee129221537b7e041dd670e735b5599b0453b131b62efebd9290491c1e22b5b01c365a89ecd508dac118c379ce3af5f6661c4ca7f9865f8d82d7bd95fb0af06e94b3b3964d0b083381e18b1cbb16692dccd29e3e520f791f1dee7f35f177a65730e1d6bba7fef4ddcb0d2dc3dc27349d550e159ea01484af2a1862bf14dce299f12273a0ceca14f0dac4e0f1f993eaba5fd55adb8e051b0ccb4355588e1fe849ce602f5fa09f9864e10e41122f722875716c8bdf4e0df886707971f1a26a39c99f4db1909e5f98364b53d84379a11c51e60a3bf636b30657aa41eb8f0be9a594c26d5429554981f5479be68d185677d643d7d5c856b46889e54e20e4911676c3453c7c829d8559ba83aab301d1d9ab3616bb7744d9926921971375ae11268159c7fe916a5ba6788cfd12d73b7de199b7658cfb12a117a6519b5d04198693eca870168e07a2b25d885d462cd32bf99e09948cbfff3277930a79b3a0f0f15192840abb6a4b006f386c44332b2ba90b4c57e0f96a52d4513cd00da99055818253e1efc1e3564157197557945b455f6ab61e8613587d3e33318d6ade7472ddea3074e2a29c90e16808ffefafeb41868a05f5a1f2819a800f6b493e8d43528836112222b700db3e0d861a30d9efdfda27e8fb44637089c0933c8015b85b079906a1e0aae0a3eac0e02a7e8d089083ebeb5f8d9ce72139d36c8253bb634da21e65785d2a03f46a9ed96a313fa91a528f5fef7d690f508808ccd95875a3734fe8954b0b4af31b176d546414d93fa90c2be74ea235c4dd3f3be1ddedaabf750a1cb45d18b1f582dfac660a9f9e64c8cb18823b4342f665ea7c39749db42c915f1144753524788c4ba063e868f8010de2b193f4fc0fc035371370008f5b4352c72b717be16933684f7ffed89ca3dd0ac2a7f71c04bbb39231b7ef5abf56c54819069c929348f6323fd10fe6c3354223d2c45b19901a3f2073ccf7eb4e56efde7164e4722510853294539f6ce4391495b3979a489b6699768c071bb2d7090ca64fdb9a573809088d689b0064922d01e20b00abc886abbd6fef1ad3ebea920f7dc900283830517fba8ad2ad3e24ed2d205c96a4a58b6bc67b1e79f8605efe58bf981d2ff34ab3e50481c61dbbd1df428d66750938791a0128e66b8b641d9b561cbfcdaac5557c97c20b6b16e73d20912e7588c2e58821d9f6ecd16045cdb48a16931783674ba167f1130d1469dc8656290eae00048a8906c1249210840b2d013eebe4c849dae08985a53ed4e619d103c3c0dafe161d6bd32826e5edb8107b500a23fe93154eb554e14ce5b1ece7671f95e3f72d226bd52ad7fe9482907691b725b4b41bf5061fac27645cb899524ae2818b529370e5342d7fb6f0e72621aeb5ed44a5b08e35854dfc34f7c17df870621e61d0435c4b7f983d7974393bd260ea70a42aca0b5d269fb28d3344e9d253e2c3d4bfef3221fc90a20b6e5f90b39f3bcad744691ac2da5a822f31688ce1313462691e254b97efe90aa245b5470c8941c4fee0152cfcb87146ef9cc781688b8b801b2c9b4ede1e8e2113c5d0a0bebaa32d960d8336367bd91146932c4b121e84d523fb7c146b3b805e88baf4168045aebeee51b4943df32894dc821131fe4d00f4cff0a0a14165556ceee211eb51fa55d6e473f8c3af481338428211464a7668dfc7cfdfd6690e593b8f2057c9b791d0937a674cff53e842e01a778f29b3b17ef1c1b8f0aa5f7705e4f8f5881096f6c8dd3633a1778cb0c5da981e9981b10117448f845aa662af6e30fb7e1282adb987bab7f8d49bc03979f3f3808579871edc7baf35c7ff20ae23c4dd7916c3db33cff9a3ba44be4fd03dc2c9476e0256d6979ee04616c62ebd200df96a693056ce8ecc4bcf830f9c66c8d713e34aa5b69e4589475ae5c0914ead3dbd60e18f02366d097adce64421df3f77977753edab047f6f6fd1f7152b0cfd1f225927ee2006a024889f1565bd07a47017b36074d805be22f428c76a3067c53f75879e5f4d4d65cdfee0cbc6ba5220b86aa80898fdef77ed97d0a8c9b4f1695886a679f3a078de7a0d6b2091aa898d7ba108db296ab30b326c96b7931527ad0a25aa6fe4ca7ec106dfb21af027a9809f7922dc3878c55edbe9d0ec0591b60126b0ae8c013a20c8270f13fe9f44d87d93e4d4737d0299da0acb17459fc266da3c05bc04916160ca9ec597f2b30be587f85e3153b7c630a5e3c2a72b33da8db443fa52a68a827420ecfa25ad69df9d39570db0d33bbd93e97a835aabf4e50c1c945782de33050d80845c1083e5cfa49957eccd86542dc01bc6bc52ce235dd5e99bd4f218d16f0b081138c6a7a737eae626e0b3959e33d8dbae1727954c7616ab8178dd83f158b582ca38fc14a8cf9ecbc516c9284a2d211f3c1dfb88c8592fa10f9e23f30496b1e52631e55fc1de331305c013627b4f484c99fd2f9aae8f8be38f55b513782b5616dc94140bfdfc2a16b594d13350eb779a7140208b8e68be9e4b1cf0a06da3f21ad2108437a2bcd13f3d85438ab72d319edddf0ab1409468e40dc6c5786fda9fed56c19dc3399846214fd4a41a188eee4707844c4cccc1ab9498d7db1ffca7500a712306fe494d651c26ffcd198bdcef8701fd31075be710061f95490eb7c588e6bdc270446afd54dadd744b526f0f8b4ec3133c0f2b14d8d988b880b1020f54f2ff768a60c50bd25a1977311846c12898819ee9717a7a256b01df081b262718008fbb048ca1a648b348078315f078d5d8c08ea4ab013e62397c4edc00cc41a83743c52e477ddf84b59bc565a09fc925850ab111146df58f8302c973a296c64747b345242a3632370e9e88ef385923e8a60fff37b348511fd93228f76af7b2c20dce5c6139dfdaec3a4b492737d282237c111adb0b8604b9daf22f7bcda693df990116d7e303d8e32c9be8cb5f8babf9a6272c6ed01a3a082cc3cc0072a55d79da7d9627506842184a666a826fa1f8ebfe44579af3e5382030fa00eb8bdcb3852e8f0904f530de64ecc16d8bc9672437d26493c4670679bb2a712ffacbee1807a50ca2744640585e194893d4c4a6089082e5173ffff4be765179d051506ab68c6f09611601152342af063a07331b84ab90c19b4b828e09c1b8a9caf3741ac9a4527683881a43c98628b32350848252e49509cffbac7bc94b043a7e0c489fddb448fcf9a2a59487f98cc20e4dfbb69d11374529334bfa9a61418206b0aae7c0ed42692f1a3c0c390c307289a54184f70ab8817bec81d1ab1c910f1636a290a54b12a4f3138181d224c53a347a78dbf3f7ebd62051100160ec29a3b2b98b5bc781218d65b812f2dd26b55d8f4a1469af6cbbd7c21f07e0d8c201ad74897439c9fb669647d11f659deead678ffae12edf07a66792645d3749c81d37274b19579d6bfcd7ef447228213148c04ac1792bcb9cb02827825db8e9ca3abab681e83745e3ca292e87a6077a6fb79b96994d0037b11c5a6ef32375f19d748da8fffe82f355f1524b4030f1b9687c53828de4ad18ababcdbc7bcfccafb47e74125a0601980549bd0b1a3a2a0c585c7e73f9042c996d4cf4edb26781e8ed011428ef359d0c5804229a18c518ae37ee2a0bb50ccacf01c406b7ff6af8babf0e8a7913f228a1fe83fa8158318ebb32274839d85ee08ce7920acd84746aa7ac867855fc08a5a9974d376a7586bc019e42334d21c858bfa8d3a28fc990dc4bb48c5ad190b0b283ead788e3a1b3602c418179fbca5948facc16d6139602da2c1e052bd8bcd112836b2a2818132d43110756653f465ca21ccc2104b8232889fca97f1717f78fbd1f478c16942a4f5c11fe9c9fe8225cd67e0e13a28092e79183e5cf1904316cccb7af46c99600abf6d34cc3cbc47e26960158fffa91598f20c25a9819c2686a0eaf8a10dfd362e5010805950d479ef060d17920c029fd0259f865cb99e7c7cf040b2f07957095382702dbcaee94a8d3b849146b2aa7152df48ada73e545b1929db68df10ce27c4ad362ea2763da652881ab260a2b6aa4060ced006bf022b4880daca5f270df904922ea8defdc57f0f87b2cad42f640a546d4582ea0732b1cfb973e87200a39bfed500ca9fc1e3599fd852036ec240a255f0bbd6de66a9367bcc1216f34441ecad012d5efac5b4a49cc0820d0e70a1f5094dc2d17a729e6fc722c2c645937a4de337f7aa27e40ab3f90c2573da5a7453affe88602abc56abeec33c05f6bc1eeff233e52ba8e8d5ca1b5a8941ea4b087656ad9f8c7dd773fb07d3ca0b977f6d9add6492fe7b5411257ec7e6e7a3f20b61cf10ab88cc389bc6f3ca11b87ac197f9e1c4090f22c86ce0525b2ecf3754f99e29e4b407205beed200e6528fb6dd135da161a0b6588b46e8a7bff1070a90ce20313d89cb7934e35562a1fe39c384a5ca784220abbc3e47fff101536ab0534600663fa0b9eca1cabc554391194b148f4950bf7e2b171d5b049f6e6d31ca9c01bc2ebd366decdd21a5b99b1a25fced80b250a0bc90ff03a695ede0b536b389c6a6b4db5f9046f11e4ed178438556428c170d1ca14996a3063d10c9d9ed382a472dbd24193afe2d1a13a12452b50a6b3db01614949ff4a097ce44e4216c668427d72e46d03b30fc13b420cdc72e9839a361d25c066e3faee7a9365041c77dbade52124f0c010476e714091432871e05169e10ae5dea6490b70ec0d05e9dc0ca091bec74c1e4b955469cadabc262a4f3125ddfbddc45780de720c50fa870331958177fc86750ad8f579d3ff3ee143007382f92835a0313e067207c880fddd87cdd93096024427773a21d86a29881b9b0abf1915fbda498bddee0a6a623a0eeba3331fc9c2de703a66e2c7700b87e1f857b1cd5df0f5a37d4eb3d8250b05566cacec86d808312afb1d6d551f7d3e48b91b9f99831f1f60358ba3fc47bfccacb9d9e5fa5c1bcaa5beb9d034acaf1b67d01d30f741d74dd5ad1df9fe733f64845fc0914ad3875443ff55243970716dd6f28d614a08a1f76c2c0987eedae57d6a666cecedb5516ce827061d5d88d54405dbf6689a3ac45a7f382e5885b88e2cc4a831015a436a571ab0c1a243c56980388607689c095628b8d6b5af561175d9e7e59f7d7b5c8bd9d73934e890a131ca6ff6e95b47e8b2aa8419b8ab73b0d26c60ce9c472dce57063b0b3825c69bd5f7c2e919f55b3befe12ba35106d455400da7cde5ac8df1e39182dc509010b5cf7bcc013f4a524c7dd87da2ce8b87188eddae093166398bfd044421044a5a145175a97b61684b6090c93eaa946cc5771efa9c445ca7a58b2a48fc8c2075427d0129f95a1d1123388b7e3ae457057942d38be4315e89bb70b406f8c39771cf5911c2d04adc82880d0455e042b0680deeb57d5025220aee41cdbef49bdf6b51e8efc9cd69efa57f2f5c4e6112395c6d9c7b6117f07aebca097527fa80800501cd777d6386ece1646e946f6249f71bd6437e53043516b4dcb807ee7058c88b435bfa3010eb860e1afa555c26ab81f4e6a0e61584537fd76922c4e8c17309129939f55e840c562846ecfdf902d0c649984b8610cc4a7de671ebe75a2f678d565687513de83fb0df11b4a76837b3d7566ae18325d9ce084e0a52ede90c152032dd0bd480db24adc68bbba6816e9ced3947c701e7a8c3d45836b41b89b48ba92911878f7f7104e35fef82b892f1c0c77affcdeaeb7122c1e9c3e8ff914c224c2e5945d0b2c64e7a61dec2a8a7ebf64ebc1ca7acfcae30e6d10f4bb536f24dd14801afeceae611792762460f2f35ccc794f5340a85f88e3cd2a45f7823e8472e70e34c944ccb405a807b57dd2d56dc7d1fca2ce175f3ea282f46e9521b8d9a8758726b62a821a87a4c92e95bb968b2f5f698c011cb9cbfbafe864f91d2c99b107e184e53e8146ccd0cd99a029ac7946753ec0981454909cfc97f40328408fe2f52ca40f3133f126cec0090c6260746377095fa3f1809daba69f0837f2bfd0d5db4fef1c188a0ec83bf61935c430df2686036b0e01e56aa2e0f533121d0d5bfcb53d3acfacbc8caa5040a6186b7f748e1acd0d91b365a822e65279544dd653735ddc4064714b4ccd38724f6829f058083b2c86dce23422637622d1b7043d87511844851b5fcc62f23a4cccf119302d54548cb69bc3d264004cb4c530065b891f8ce25c73cb848768a16571986630ff38712f96bf4de4bc7dc3af21aa9dde7548ec73340a0e549a64f13933b5abb8c28e4af97631d11414e7b9be40c1eb77b9ecf4be0c206269b38cd422c78603fad76bbf7760e8cee8ab77b5a78ba96713ca0e9b3ae8190c4b78a65539cd1a4c73636819cd0bbc1f9391a9582ec4668888e4c2c6b424bc4fe6f013a3d17606ee58d7111be021acccb19a4d2e0047a647eca360ddee012e85a5a19658f86ea06f37fe1b560239e489bb74b76d97c66ad640c4d5809eb9a2581f42c1e0dcb00c9d0db840b04b140b8dc9525c3bb73ee1be5d9ea49cd7d577576cefd0a220338cd7da482b1e5ccd934a52defa8c04a03a2cf2c677439e2059bdf0c04ca9792561f7708be81105b2c6de8cc0e4c9e7e5a92f5aafc70b0b1095abd63de7a23d64697d25cd79f781bd58496689890518912b9fe4708286643c4357804ea66fd3143da2127581bf961d650547e6e24e487e8a859bed18187098efb62e3ab9306b12f3382424d3ed7018b48fa5eb2cb08e9505370baac810c8c385ae14ec5fabaee0088c0b7fe0a77d711ce17e5e77f2fcd1d82a4a3d3bb19af63b3b010e8b3322c861764e8480abb8901ab5ed82cbd35c78a3b13541d9872603d375d891e724686be08462466636ccb0a0f5ebf044ccd8193eb222a3f645795566cac58aa8871c94ed46a711449384dbd29ce6433da465af9d913d68ba9a88d488d498595110b0847c4d841c0982d85b74d852307d4bdb8d61148e40b5565ccb8657a395c36cc1bda682ab3b1876f067dad9c0e102a9d292ea6e774113633584593534716f7da0662d15b7a8fcca8af71fc7f2edf75847d83a09a9a5eadeb7e788ec594f89523592a6349b320550d6e556e91421acbacb6c622b0b98e55bab68a61a0c782c4ec3806022d4d532ba12656d511880755dba6a34cf93154da6b757e024576a434b78e0ca0e980430aa2ecef100a4b5b8c071e1830ea72c348c15b95dd7b53d0ff66e801f98834d756abaab4128581130aacf0f257f5eaee62a92d7bf8543cc8e721b1b0c678e08307336d04e18c0863365c624276ff930ac0aa3a689a9971847b0448368842c5a97a504240b43bc79320160194259543e91abe267b70bda8a6d1dd6881d5837c3b3f42f89b4b4860b314919a05bf12d070ec0042e5e2728f635c32ff031bace5aa0bab6920860a867cfd0a9c41b96960c3aafc70cb8692ee83ae5ce68bb405de4979240e3c5896f031ecd594d0c02b8b9b5529d7a214cf209690ed7e180dffd842ff237a8d8a7b47d03a9e8a5dd104027cfcc31648084a8225d4d9b0d5b81f4921fe1abdc3efbe4f7670f9b5c7b44a896327765c55bdda7c04c0c67c24f6b15830b480399908a9f339288b6f12b04e679522b762fd6ae2fc0128bfb36613baf6d082029418378b016bc11c30a03af9b5e347202cae7fb61507e3acdb97614e9e598c16f444625e036694069a533aeec4c31ee434f0952d803147c3b68bff504b0cfa5bcdf77b0b8b184e74eab949236c38f61e6d5798abaa6122ddc5e3b058f0126fd1ba723b2105fb74d994557aa6101b1cfff42f5b3cae99bb6631e9da877a79bfb57240fddb481ba29e750b244087feecf2727ed128723e771712c6615a7489420463574830114f61df7b3cf7b824dcf5dc604ab32dba66109b6037a1b91b8e4ee276607efb653dabf8a58e1f20e12bafa559701b5a10678ea1c2ea8d18b5cd544194092a541c43843b01ad80a34fb6b553a0c011d91b143a9f2024202c7cb9549c06891ea804a521ea57c3f45e1f80f144a3190fe329728460f86cabcd04b3c0a303fe924557a1b6ab33fb7ab1e15de5b374cd7859507ce516681d2a08408eb45d9a20292d883d4fa6cdaffd53f99d7a0b47c32d93bacf181a10ea8b5500ba37d9eed4a7d4a3a2a89087498536f79e1f0aec7cd4d13542cc8baaf5d19853e94ef0b973fbb60f9d5f94b8d4a22993ccea22fd4ac7a4256ca19f60ffd149a9cb96d24b3e8ff5183a2c6b40a7abc14b568fda34a04a68ad5e906c40597394a263129943211df877446d6276a99294d45aece254e2fe9c98aff3c38a42faf2654ea47e4ab2e56823e8a6653eaa3c9f07e7c8ac65e77e442ace5acecd335eb470ccc9163e62a35e1e7c9b630be7db240a13218edb4ca7560e6cc6a4156499182052db31f4e6168117389c4925fada91d1e9a87518a7a9f21e1e2d27c934187b53614e477eabb8e1ebaeb204d2330c44a2c5652f4238a91054e931641376739467a0a4697aeee44070564de48695e5ba63a6d7fc328b4a7f6bdaffe1a75451ddab72967b854619227e2b7318a7885184bbf18b0e8007440b1a5751ac352341c428a373ce1bc19f59e8692b4775ab1589153b33dcee3a9f72eb951d59d806a729cfafab2fa3092ef0f1afd803890c7b71173b9a5ae2aded56443f7af1c920bf0282cffb619313e7018482ac8cb5d041d396c8fc5e0972ec8f16cf824e575eba3913a043c368c3589bab336b66a879f3119450065c4c7bf14547bf710ff901e0732cfdc35aa8d3895ee5512b70a3e47d67f7f70482c7929178f7d28b26d9bd2b81b78edbc8c9aeab4535a9cb8d7d80036915eacc2c30658e17e977f9552d4776b29919f9dae8390296a1906999647aba8bd05f0d16222cc69f960cc3a842741e39be5bce17b580eaccb8b6d36df95ded223f0813e7a27a085268f43ba903f42b100d79e8187b5bfca3654294e0cae2739d6278460834b58a21c863b42f8606ba66e1bc88fa102e56cc872650d0ce35a28150cf911cda99b3315328581366d30f4bc5f41621bda2d2d96cc4f8fe888a3daa35dfb24acb168353245ccadd7c02e80618fe1b710d788de60eda2d25e4856ad1cf73c898516df05fe50be81563d06e4521f3cb4bfd3aeb62ade0539f62fcbea21e00107f2571b4dc206539da3d3f59c5bdac6ff84bd4f697cedac0296bc14d27b24d51b6d1ec3a20436cd0daad13915dd84a9033b17155d055e398c27e79c3f1227fe4f8ac07aec976b2a86e778557b8db579f05e6d17a4cd9d7f20e295630520f40a750c823a67714aebfe05445274173a83d053be484bee06a9a62778ba9e420d640a3751f18cc2ef2b8644380d834a21dd3a38a1653fae9953bca4ad99602ef0bdcac021cee334297abb42517e31938ffda68a7183f8d6d60b89c2205b1d1eeef8084e2ac292241726b3fa24b9dfc2e856fd4ebb43b6fc4f6c515a2ed6deba619d10f09bfe5c9ccc0fc284bdff20df1d6aa31fee2d36178f3850ea916968a8158721dd706b2d72f579bdb27111b6e7bbe9cab9a312fa1d8586c82e9d806230904b2225ad97e7ecf62cc7de056f0b24662b3170db766b2770d6437ea81efd7519432ec3947f6c3712f3f6468a01ed50b725f147b658cbc9638a9388ab71120d5384a1a198219803ee2259520696d38a73efd6deb990a3cd5d9a6c455c3510ac303e15ef1702ac70744bc7b658ba2bf7f01e28a3087b6800c7899905b8e50ef2f86fa8eb89d15e4a38ff5b3a21aa1264e8fcb731cdacf8304482fd50570774d7c9c9c678252733d78a3d680d26ca3d927ac91dd5ba3ec72e79f62aa21ab0081dcb853f29dbb184322c9d2a50eaca96535288f7eab014636eef30d498806d7845e7b775daa3b5b7c861e71f3818fcdd568cf20009ba78a9e5cbe856e876da9a18cc0b0fdec57e82cd8af990dd3c361227b71db436e1c1be5f23b212fda6cb324e2675c36ea039ecd3804f8a51c8005d99ff74d66ba36acf35a22de7bf1b9ebaf1ce88668a5e67f996bd26856d2f9be5e28c8dcba3440924f82828b515343bce60f889ae7ee25c57b7ec6f117fec203a0971c86e641006fac84b6482c2438fc046ab39510bea2cf480793cf55d0edf74cebccff3b5eaa11b7be1891cce11410197e74e50f4d8f89b0a30899ef9dea779e1a2b635d083db5778569d10ff10a263a5eaa6f386619185ebd7e05170606cf9649be75cd1af00cd3408ce87ccecc81c59600a5b83830fd5eed4d66387280ea07e591d3c5d4192bb58f439a490018dceb38a1dc0149272418a7f49761cbc8705e6357931c7a7cce66c5dc83714090c1d416056bbc690b4b488468f54d3fe0674ee6b7755ae6d07673a643cecce41f180deeed54e7162fb6611c204747735bb89dc25c92798c8c902fc5583726d2e700a68cbd1f1a3a2dbaee35985c79eb5c4e43ce7bb3296f6e23cc4c9da6365dace6278ee608293a80767c0cef9aaab826b5cb06eaafdffcc43848a74a6daaac5656082a8250398670a2d440c44ce2e7968450d83b2b9436df4519556d608826076191f441657a42c6f775d067af8fece3f34b8834ad4f7f1038fce286ab706e5de946b43c08a300449104bb80a38f428c9eea2f31461406996ce8bdbe32adf5f61db4385bf5ed5f83f2f4cecd3a88200eb285f04fcad220dce231beb02351c16299cca3a0d7cadf45300b0fd7e1404854b17ed074b001c6f65a8b2fed9ed7bd020a76bf684f3a4e0d45b245e83c3d64b6309ddb6c5e223eaa328047cce7ae3bc29db063de57b2e6e01de967220b29bbad0b4b667efc8c2dfdbde204ed9119cdaee4f9d4efc8af2fec234089da4d750d6f5333c7f0fcd30b46a150b265f56039fc5855c18f98590ebc7aac4faa0ecf063a390ff7959c8bc246278c9d1caf1b6d25db924acd731fce52a320245d94e0e55e4de801335c23a598924f8f883cf8cb70f9f267659bd390bb4be3eba7b228aaadb504b76ef2cfa3832c1a87b4ed5b08fc433dea34688f4ac923692eedf6761ad908e168794ad8efe6688aa8ffd7ee9f17276664c0526015ba2d063d6a534a1b5b580b79be10884ac9eb7818d57f3f4fe54c070a1d44b697f9b933ca17ae51c8ccef76b825839424656795be577dde824684a71308f61b81d4dabb59f2d8590037a24e9f7fdd251207e041667ac086996b10e1fd351c1c07da74746b36429461de2df2bf17c49a93efbcd59bfd1785fa514dc2d318c4d6a1d4038f5397007cdec1e2802d4930f536b61cdd474cb3d295e91c6f51527a61a4736665b017f49a7a3774e34cadf8fa15ffdf148dbd53d1843db83914cb1bcc93c60b71b7e5a0ceea69dfb11a8e5f8b5f3ac1c4faba68db8b9ebaebeb51db669678f07ce3f123b626113ddf91c5d34dd57bba4fbc8baf12ed9c5b7c9b871c5cdded75666086cecc190f39447c86a1238dd300ddb71a6bce38cbed525d5ab3182d06492c06131befccb4d189077e2536103e68cf8e76ac3d7ab8636f93832af4f6518681ed0bb9264f39b8e05d926683d8b3c068e3ae0157684e8f3b2a95c09ef1cad8e2e32f296b78cf4fd07acb7e9dc5ad7a4f618a5ce0303013003ae6e3802be24bc6fd83a1643924294a96f5efec4bb7f7810e96ea627a52571a6e8804156d464cd21e066a6002719c0d0690bc56be4621d676682c61d1557effbe9e7ebe6a86ef22371a9a37cb5b03a8b0a3ea47deb8495b56eff85df32fdcf44d56da2cc00bb2d1bf9539fea0e82c58584740e3d5673b578968a9e09c2642721c3c9c24f50354173fc6cd7d731c1b8c8c0d49295133f93caa1b0c9e06f1382a2d185220a0bdcbc5cb6516d15ca56a504f17347525df9e884bef05e81c67cc6c86fa362cb321431313d2b9b4c2b924ab247e44f83231bafad5882feaa0f1fcec50f09599c84c9b582383ce87be488dc1f44499d9b037e61fb6c376003a19e9e6fe524d17f7eaf5c57c01e3ddfaab55bd539dbc0e6a7d4a821a975c0f5c75bee8b0e5dfecb7830a9d86f0daee9350c70286dad04b4b6842b127932ad55a58fd8b7be53068f6f7e7480fddba52f686f6d21997173dbb25654949fc5dd47779851fd36cda13eff1f3476d28f8c27b0199091eac0bdcf67fef67aa7aa8f21e0b670bd7eff8a80c2ca0f844b4870a171115be68d72aa97ffbe14ae051da6f6750e7cae2a3951143ffafd9072ec8ac4060c1652d2342bd628ce3eac64772c2618142a16315e4a71980bf8987f35f1424c4ccb8065da48a47d3457e4236f76b3a6404e591631ab1d6a21af4407587996a40cb4dd336dff867a71b8382af844c954c62555d890af1ea25a189f51760f653371f3d16cf29f76b8df40992069ae8e0a83de21636c6964f2291117867abae66dcfb9129896bb2d26d9e7af82da5cf3086b86571d50ad376278822f8bf44ad8986814e0673fd82dd78b2cfb50da1641500496768b439e81736943a750a5ab29543b2979358f745860cd9d01208b380ad800c55b9e2b4f3a72b4ecb7fc44fd299257cbd848a26a036a84ff3bcfcfa3800f920c22b7d00abbc3aa6fdbad09546e50166386464bf30e1ebe7e5a83cc67f8ee16e01777849f40b0b526047ecbeb6edb200ab14f277fb83f26d096216ded6dac2cc1ec39fb869c9f340d51eac8404f939f9458b1be2fc37a8c2635b46062ea1175b0a82feaaf6d96b14f14cd7a821bbf67697dabc4bca5316e0802b88f50034559cba3707f02f4b1dfdfc19df9059780bb54f20a802cdf9e05f3570692bb9ccd681f88fc155e31b75debc0bb76ce07508c1f98830b4ae730851d7b851ec0d420d55bffdf7e2b5e4f469af1e358364d82dd2db215f96c1045d6c8386b209168a62c441f4b21c3845fe9a91fb5283b813742690460a1ef8f6aea01fa52116b7fd004bed1366a95d697b5c90d24849e6a4e81ec9e2cd6a3f3eaa2dcf964df8ce809d0e217d29e5a989ad5da1a77cf0b02ab3c2252cd3ee6e5cedf6eb1e7dd8b9a635a0cd7433f28f89bb965929109448914ecc1a87ba6742fc088f833bd92f4a90e5344c4ffe31daabc91b42b013df96a559508c5916bdfb8444093413600299d89d072fd7d3e9ea0b4f61d03f3f02aec633fcec7fd4518d08a710d6931a409a168cdc54b88fc02365c75cdba96e83c256c8648121b99489871a440f3a53a8c1e839f3c6735eda9b08a9ec78f3de2bad9bff45b744888cc24b187370ea12e1261738583f2ebf8428cc44dc7f6832360ddd81da3fab24399bbf522242ee034c5a42215616e256342541b31640447de487b81d12261e65839a1aac25218b5c0a6fb5090ba7da5d144fc5807534b5ba0c9572f9ab0e5ec87bf1d79bbb2228d40edec3ce03e02ab3b286888fc3ec35c3a819d9b701c36a47c08015cf350adde108e903a276bcbe78135bfa62f209d0519f10c5778742eb689ed055e73adfcedd2b83ebc40c995d419d88fa667869d2956b4d3172e6fa5cf1aaf3fabb1040ab7406c9fcd084d1c9070de4bfe5adf10e8f7d86f70192dba761979d355f4950deecd794c6194d82a7e6121003f0301767635f32e942c4bcc2208a55dcc5689b61dd367fa6ad9d559c8150d281f13f9e243743bb1b20e466a1e67b165cecb2fdeb576dbb79a7e8c1bc443c47f66684f5631d89988c9c475dab6532c345d3054e0e8e74bc9896b989ed12f2da2ac472a412ea31b40303ee63eb58fc808e518c784ffba5b1280d44a94df9bd7937a1651ffaf3c0a3db9fa6c56630b9e6f02960d59eb372bc39c62d36c86ba4bd239fcdae182675b305a4fb5d832d252c6ef2d200347dac04b47d2c1aae1010a0bc10afa6efd0d26cef9a9f39cc088873b9418109393af43bafffc36e49d82a3929532da04ab1aceb53b1ff882560d88cf6daaddf961abbf49f1a6ab84347ddd459cce43a1e6a76532a9ac18811f70d40020e000f611e75bd8637aa48ec5e4afabe8026cb46a04ad204efdee2e4a98bc09c895c67d1bd376348447da2f4abb7971853fa9c631b5dbef922403d0c6ce053e2ae19cdd41fe8592397cfdaf5f24016ae71f28e8f1ccabe2dba76a84a554413c0eaa0103db832d626dc98c9cfd41d4a7ae6f004c4b80edaf720fb95222becc8da1acafa23ec2baad49acd23e704ecf2b9214c53ae15e61efd99a34c533261b706193f18349a46b868b3940fcf90acec5c3db5db29213000b9178ed9b8d5151955a4f7daeef49b45e90b2f1c9f99a2e17df2320fca2964295d3cad5010e8190b6b6579bb75cefd3ba4150b37576fe954eddf46855dc6f47f1e5149428913f3467fe18a37131922f456a07a369e90392b4e717c1a9085dcce9e5c15f1d5c82cc4ca96d122ab2016bb52b282ae8c7a5372bbcf2e928d7f3607af2c1f0ec7dc793033fc82e0fad1c60ce2d542ba9e10558d90051386df12cf8b9618d1303c334f07e3b05fff9c4ec11c84f861c2ab2eb393b9e8b66490ecb2406884ad3516ff5991ba195421784c9b09f8f514716774722e8c0dbad3d842045c2cabb2ac39d75a077bd20005e56d30b7598cac0653a1b4ecf9f7cbbeb8e4a8a81d6ca029332ea03801ac286580c1d4c15c7c55340c6709d34d92b3fd25cc924bdbbb4b3c88979ace216e11a779b63dd4bbbcec7e16554f7822b0a8b6f11069a60936222562914c395238b8a598af8785fd728ba9a1229d0f688f1ae0d8884336056ef8fde7ffbac14ba461c9adba99fc3e4523667a5006cc91908f2a3a925ce3ae7045532119b62146e5f6ce88959bc6361876377dfb55349844ddeeb3580db16028b34f7a672b5eab7ffe02eeea90dd1acf835abac8ae7221e01aa495c3600cc458ecd65937c52f0cf8a57d7ad8e3cc8669452af2eed9dd40c7007fda69d8d662fa4c92e93b417eec7365f29f8127100fdbb233c0f0235f4766cd79c1fb32ee355b3ba5e47aa69ef7635edd9cd61ef593e4af2a3c12f789be72aadbec560199064539c1ac204e50a81ed8e9103449675630ce75291577516b5bda6a86ef66c25d874741248b8d2c68abdd976758a694675ac6e9563438054c1dd12c52a046eff194d66a6812ee528fe49fe935f009480565d4fe1e7a51b882ef983900dabebf7d3b32dd09400c2d1d68aa4bd7999b0fd27ae5f1dae818e349161c545671dc056449f3842e8e58ebde5ddc740a0548a557433d0085465dcacf982d50f5c11265ffaf31c2f65c11ccda58a3806edcc7b4ffe368b665737235cd93f14072c2e9866eb296c1ab524a9f0704ac04eaa6be024c84f340443872a95e80001a9cb1b7bcf29edb9cd8f4a758ab7f60bdf67a992761bd15fb83b3e9a0082591d2c177c559ef75857c0ce69a611be83e10b29353da3ae75db4ca25b5e832b9486938da27d6ebb100f4673eab6e187d3add2f48926d7340d4cbeb5627b4fb54fe52bc8ff96cac845c56ac6cb222bda6654772fb9c7aff9817f43f9f7b138004b075d2212480ca4df28dd3b60d3f603efb861e014affdb8604bdea9ab1a66a77b260fb333fae5b3f527c924dc5e6bd6ebb974da5e4d0c6273adc5a304b621f7b6c0a2ef68c4de750b1da3e37cfd96c3ce5032cb1e1766c9256657066b139369aa0c6168172514ab40d896c3aea18efa229e104094c673fecc279a01bc8747615300d2927c0117722a4eb270eba5269d1a8144a188ceeba49f6bef0afabfd0d75978870ba2627a68c4e5b2730f0e6902fb919d4fd3c19cdeae1a71f81106ed19d045880d3e527a4a874843a195e83a6b2d784b4cd09303b445761fa996fa5c8c024ef00c9c76d928b017ec518c9b1cf61e4d511817091e828b6901c8379eea99f92d77fd9041f096fb168f4df37fb2b5f44b586cab2ee227af6bbd438c028330a385c7fa838534e0e1041ffe6f9de4da2ec7c08cf68f05612b2259b4cc0ba65c6ec6b13e1329d690d1d87d2805cadd3373d428addd1303dc5d2f5dc136c99e5325d6e0d8d436900aed62d7d89deb1ab0816876f20cef7adcae9665bacf494d3c27c534943c70541cdd560d62a168796fa0725c2981a0aa0190cd6ac737a91be75699b087e933b29fe8fc8654c29e9c3a6914b0a44ebbae74452fe3e42f9ae4bf9d1eaf56e223ec51f0f8ab255973c64810cbc79276ba949d5301242e65ccbbefe9be98963d6c44b55cec3a5db25a1fde84cb36e00f0f90aebe861a968677420fc35f409b9dd51e8b6b01fe894d0de56f53792fc374a95e7d3001a6af8851bcc3f6be7f4790112923b579ee24c191621ebf01a58e8ab8563339ef96c37056986e999a56589a68b46a04b27c46c61cafbc73a0d873c3f81c0fd15351a98d2e8e294deb49cde100cfafb5aa8c648acbe1644bd367490e1d677ddf85a47721e81ab31d9bb5be6dec37cb26a1a5fbb13a09d46f01879f7a24fce5d06206d74b3b9edfd584e2b34424799620dce64f47512125ea1e84b7885b7b38a88d3cd39d7a9e8925429590eb6b9a45c6850a38742f0f4edb5607041396a110e8c35d64f02963f7bb5fe9407c719ba03607cef42573390be073019853b15565f46da773224a20a1f3e86fb3a532be3a4f8bd3a43ae06dcc8e031d685701d523a77c9867193d2ff1693091feacccdee74ba447064b3844c910ba9b68d35bcc9ff945630d07057165e883998ff357fe287b2999b71901567f6baed1431406f011133a0d96b5827fb39bcbb35dafa77ae2a33eadf6d81d3550f655710aa24013b824007bdcad5fee88ef04f7b38e5196c9b451dde5d5b5825e5a284d1c2792f805a54a19aea081dabaf962eb8815feb1b9a940d3b15987bd48e93c6632ea521c554c7e52643b6ba43af5720099981d4738e0380eabe6e6f5edcad60275ec60c345ab319564ba59789c07938522acdcb7de8fe812b1d1bd3a3e5da153563e7bb4f69d938324498732dffdb8e2f7a7cdefeb0d60c6db25004bd61af37ae4b5dbd20f0421754e73113d9a31b61fcd73ddf10fafcd1bda0e8c7698f9ac6e650350b0e6b2e372aea89b48d212efd6264ea1ac2787f0d4b7cd32fd978816b32608fd5d7f1bee01183cac475cc56c0ba03aeea0815548dea16fbd914d198a0ffdd028140e20a1cbe056cee6fa7aabe996fe82e233adfbdd000caeab39ee1daa0175f91653ee3d0a7b341b82db368efe54f104ce8a4fe69e91187c8286bf88e3b3c5be2ddcd641f0033b50ef1c29e98fba0ca306e5000e50dd67163f8519f8c25c48992779d3986929182b178dded5f6d0d2254caf6dac6700d2c64488e0207e47c05d70f973fa074c17e589aaa80e362c280ad79bdce63a84b92c230e56a2dc654b54bcf839e66859056fad85c220875e40760ec71be179053e6487481cdae9c5e755bbcf114b6569011a225c5837693023155e7b6b38fdc74814f54be0a0dcdb4648c4b4f633aa70f27d6adebf2d6fbc5a7fd08cecccf05a3690f05740194d476fbf664b6145b440dc3b23dde54f2e0285e930ae3ec2c9684c22e7b77b6378d04d4762e577becc27f90dd3bbed53ff8898c4a1cbf028633e695c906fdb91afcacf8be882e2567058c553c328c340728b93a419b2cfb5e7e6b24c91b555401aa8db26d1556c24600632153a6b9c8ef245a799db4daf17c5c90aa984b84c1230dba05852968568307aa3c7324f935fbaa0732959de83a8a73f50ff97d851a0e23f134cdc9a82002eed30b944ff920eba994e980124e9ac854e9119c3454a90a2b9e8490bafc5725dfafd1ee8c29b821b53fd57ea65fa17cff67341f2553a30471e88c4c062c222ed0b74b2df6ea9a5f4600a50521f98ded7f0f33f3b76edcafa4a58c55ed1abbafe4c40d8c579c3751814d0e9a2a0a444e79fe45932802e1f0e06ce81f09a660c3fd45276c7cb8458499ffe7338ff12363e9764259791ccc4f8a854898c7c38a7339afebd753ff9399559f5f1bdbdd1c8f26d0f895ffb5f78a1ddf32f9de8bec1be2217f2ffdcecdb957851bcd13363a49bec8ebeea18c05ab306a7437d57f89038a37f32151aa18fe4d2a1d23f32649cb9118b118c2edc719d05cab36d053f073ab2946187d90e5ca1524d434aaad5451995c658f9fdb39870e5906044068545547211fbca9c3f646a1af39e8ec3542fbe730c2240d7fad10cb9d80bdcd2bb240014d00179e3b310646d06f001b120ec8c05646b16cce2a9e5d6913b84c61fc0d6ff6a114abe003bcb7f9a60aa9dfabb7f47ec30fa95ace0133f4b4bac11c7b391c054b63e6d0ebf0d302f2f8b08fe4d49b15207cf092293d03dfc622d28a53b424ceb4bcd188665ccd9246c290e1655f2a4fead6991854cf2862c5e76f0c1a887cc88e77cc33592c91f25b7a74ec5e9092d523e1ecccc4339403bbc794b58f3f6332d04ebddf38259da8731d1bdb8a8a49fe8423bab39879f49e1c02deaaca48397714f7f9aa69da1bab9b6400093c646998d8e6eda8da85c16c0ca2480c801ba82ccf5065395bf06e093f9cfec96358cbc084fa528a2ac15e549db469e97086bf69a0a27a171d5ef0c7ccdd024dd4eb42183c9b01043661dad61b57b9081c675a273156b6b8cfe219292899ad322f4dbd288bab925df733f35f09968ef1260d18e84844b62fb64d2adc097b8f01a81738b453e6b87195032b112beef13a017ed8be53891a48fba8538910acd64d56e6fe073d523885a5f992a17789ca61ade8bc95883993c679b5c9bd63cc13291ffe9ad1541fa934fdfa4f1351aa39613f289663f709deecdd797a329163dc7e102842acfc22877276060bca275261a99a196ee8dc568983823adf6eef1d60472df124b9e31867fed5a4abaed6a85cebb6d49a00f98ae44fbe20b53c7336c94c9d4f87de1d243c00266186acca139faf5b9deba541d9020132da0d804a791cd35e81e45f5e7e3dd00fcb515cc7381679a41c580894c0743affb31d3a4cb6f62081c664647ff356c99c9f26d6cf2e47f349821739a223af320c3201a2d9b2a24f5bc978e3d8453fa1316b2645f14f4a0f09d2770d59e412c82759301dea8cfa32ce44579e73ff49536dd6446746b2662133ad723ab2ae167012e04f072786952f2cf89bad0ffa06ab15e074f3e5e88084f338efe5eb8db15bb725a169f83547e386131c5242741f3881149b59cd0c487c9209fe87fd9497dbf5fa6a75bdd1631d72f24f0c6850171834035268fcf7a4209e17eb2cd823b7683300387a86f8783e4e15d3ef63a24689bad48f98226fa8de723ec6a908cc627b7dbea5b68fe299d5ef2fd2e7906821d49a9faa36587cdb793005227f67abd4936857437869bc6c3f493dcf4faa747a44a06061edda3b5f155debafefb16e6f7ef189a54198921e55656db6a152aa3c60a117ed3fdd5d6528a446fbcb5d399b426965fb0cb3738f6ea2405a1cf1ca52a26d7a7bae5515cc7375eaad68ea263a844f4560c9f6db0ae4ddcf3d95552b5543f1e4a9d4bb21c994596627fdc222c9779dee020f322216f664938c327a1c2702011de1e9260b9bd034156b7df2de087d9414b965a35133bfe667058fed01446d1df94fb434be40f8e5c884044248fbc2a8dfbff56a0a93e5ebcd242fd5b6fe178d55533c689e6e5442f3e4260dccaba68af192df61cc1c1b6a5216d48da698f729c804e688344179e50e38f16b474066887ab4cc027e3fd406dd4e0219478e78b6233c3b417fc458d070ab023c926a21322f815f9b546818a1b451585172a28ae34e382d3a4593dc1d59342640f127eda3e7bf25cc86d9d74639b1ee0f5c4dbfc7bff51b9edf7bbd91be43808fd16be8c3a811aeaa3608964f3512e794f6ba5c47c2a09317c8e12caf0c3f214cb410676391061b2f52407e07aa2ea362e444b7b2c8c665feb4bda330beabd8d8ca4a6110c6d93067737835c752ae4cf45bc6c2a41ca61cf9c43a0b344c432647ca63fd32ac7d9fc490c47e35abb8a84d3e8dd875c860d4a5c86b355f31f4b647c00a94d9ee0316948590c63d490b826148af26b35fbb3d6a56a6d87fdd4e7d30064d5b8da9fa8c75819b6c7211e786266864f86f88a8b9e72b8fb2400d1bc57508137ab4d6d6c922d2d8224999ca7d1c92cc550aedb54e182ccc9afd9dbb9ed572f032c9a6768b4ffb8f4b4c03f33bff89de90e5257a05317c0c1250849c2eec208fbf2f1180c3e1e6a7f0f407e7769ebca1bc585804e70161f5552d753150b2d621734ebb8952e85b5c230c3b601f6909807d268dd9c2a3346fbbf646b0576e090282b551c0e30dcdd7d0635278772da2abf2a522859a1fc9cd2f80a25340ab2023f4996720a78fd092a3512678e41aef9920abcfcc3fabb9ae4dc60437cc26792e7cbb78b3159594e0e4a1c26bbc7a48293aba1c46b3eada411f565a430c7a10c30e1ba5924a3a8b8bd8862af8664bdfdc571eab5dd4b21beb97162c437eb5bb0cb4b5cbb73d9bddb3ef971dc07173fb7235ce381c98d60584c40239932153e0f007367fba9ed3e1263d75ac3d59c11cc79f4aa14cbaaaf9cf3bf31abb313a89f8a0fb189785154b74c8b8fe9b08c19b861ce2aa1ed701f4af3f701d49c1070600c80e25d644cb9129246ea665816836f5d0a6479faad95b29567d398e8c7e8f4a9bf2f57bb93d1d5a53feeee7f6a4151f520e358624179e76c2ec00931198dcca9b4834b610dcfd50926e445324787d556332f7372a6a1a40ff34e417477f9a52c0b555c2a3183a22dfcba6c6a8d903c0866830f36fdbe6b135316cc43b1f219356f150341e23162e423c543ac1b36a975a8cbd58a1406f63372a33615ff05c191a20be8c20dfbf23f468f614ee1e8e3a7de604ceb0219ac8277c089c630d15472fd4f502523b8c3d6ec92ef50fe3c1ff4409c37b9032878c424a8352513b4ddf472d1768bb2832d039de456ef7a118bc841ff49a9cd5de7faab31b1f363a2f3454e016065146553d083aa6fb1955e015fad2e468839be4fc73c4ae7722d357fa409602a24eafa605aa9036a5eab25fc7de79d4636f4c3f67477590e7883436ff753a055e80fd6db4acca45b77b661991a3bd403b8022a2a247085474d8fe484b48a1586baf85d60029c6960c82574683e82af0903f7a16a0a27684180403e049ffb232747d03bc9742458c9699acfaf3ab15ac3629d097958195f847a7d15bc4af3233d5957e090a4808819865fda9929a2976253028cb96e6392a2c8d008916872229c618233a2028ef2d3b0efd4cf3601a10e26897b376708f438b8d1d00fada4feec098a90a90b2520b06564d05489231d06104cd8e906a1246d483d2f7ee79723b451dd32bb97eb100a0034d39880969c8ba9a4c1ab06b59f101081268815d573fcaf204b968ce8238888afc6db63146cd85fa1edbed3b3d46e711bbb72c9e50f42d67e6f863d948a07630821df176888f389414b6f1e231ec33d4a1e1a75f9c13fdc1e8399faea14208d85cc1ff1174b2be0f837f7030b11cd0f43ca11248480cfd9500298c9f3ed78ab51f5178475f3dd769a8a3b8c5ca314303e16680100a150c316a0907f454d232bf88d36b00ea0797aec498375a28dcb74867b5b6c0bfc519ed0d3750e5073a332424f93247c77ca43de779de73ce8980b87a80682453a6c86c163e63a019ac93618189b4f3594054de523cd1415f3c2a33aba2a0172c2acfe7e37f33f47dd44d642608326779088450cefd1a78f7e4021b94929e299f31615210fd35fbaadf0c51dd54c41b166d4de2dd37f90a95bf114b15c7be1b0e46ef5081d76b63ad953a22053150950e5b618ddfd941d73007a1d14307280191bc714104f61794c52d6520870420a619335f29203ffca329af4b9a1b6c8987591d2a376b0b77975be9c3db0691fc0fe52f9067dffe5094883ae5587286fb2e0edeb2fac62e14de749248066cc7c524f3c2e4163a39099002bd586c322d1a7c4ed19205d6d90285a925bf7ded076bf72dbee812ea6da01127630e31162f27f0c644501ad8a4b326bb45f9b42146f25f5bfa82f7c16bb000d5d86efe0ca523e26d4ca80e897058ec04987d628ae2f62b11d3ff0c59b3d36e82a150594a9534f651187fb804726c73898b68b24fd908f75a3c1f34f06d5d87f8737c24d604288625b9c132783ba3420949689e09b4fdd8adff17a925872910a1c2228ca1f7f7a58a91054c59e5a3ee66e8b8080395355397ed3300fd28e02ff439ed031528e276a271d882e75a2174fcca7784f799b41b09e2c67c04d5b28e28196efcb0783df0271b7637c8b96eec92e8f5764b6d59f0800359e59d3ffcdc6e6bbf529dcbc396944c94e6b89945011e3424d10eabcadabf2aa730c73ae6588641664ced272ff5eab52a411728dbd7e328165a5ebbfda518344e22905b67943b17a3e412cfda228cb341a0848417fa1a9f87bc8ec100679d80315c8ac2c4a97a12b910fad7c85d7525bbce4fda4c8616342615480704509fbe0bc622345e6a00c4f481d05ec34a4cbee7a7fd6b3ea0df455d8c06f174b0ee65f5bff32898e3f8a40849e93ea4d6f8695c2e59757a9c15ba995c23efe35a7a1ac01ea4ccf67775fcff3ec2a3d6b5588f19526476ba8ac425189f71390720e6b4234f179029c2e9761259d638d501894e60668a2f309917b6772f0345920a2d15ba363468c20b1cb8c04e9b058044832339ffffbe93f44358789008b6fe09ae3f2e92bf515c459420965e791b75cd0d5991c064292143c74d343be58e0dd2c59b8e10b6c9348d33958169bc4b20300bf69757cac65d70c57b592d91e8ce0c20884b0de134041c8e4da034ee7e3fab7af62b0b727a0e1f3059374dc8de1f973a267a9a8822408fa141aa3abf9d764e72e7da75096c236b2ee1b76734802c658edff577ed4f12a8cd0c57f6dd5821397a729260cf11f23e89fa51a4b0c247935086abdf3845930d1a7b0a3579fd3aeb518985d0ab5f0fb9a594587a225a3cc6518a571103fef4890f0fa108af52aea47621d7fd9cd4231563e2aae5e02483a437a3b23fa54ecdcdb2567fdd84a0f496589861d0a53246155eccfa52174b95b3ba0e433c907e8328f37bb2565103d7de35eaee9b6bba439c67c57886ed98a456d0adf4229c934742e20f0969d14e192de1791db826185f305e61df23ac3f3a0ac543c6a7164b3dc0a68f92e560b5cb2caf4e14c2d745c97a7eaef8960f0edf10c68ac1df0beedf8e7a54d3df8e2f1fa950d091ae8f99797e6d131f1aba10c2b773221443dba51d79898fad2df9c0db992225e3f6af8293af9cd8d7c579be5a2c824f723c53b386191432b7c46008985054a8fcf9b9453be4fa8030a954ca5595dcda38b85242f6470b24ca9697b3629149a227534e978d3feb7bb88c711e28203fb94fa28faa201f507df51b8ac70e06cd6bc26c85e56d29214348ade72ec9f1e1e9b04ab7c0ae5220e2f9d1a521317b81b1fd5364004a5627bd00196c138a9c85994e2f70ba50b1afa5e9dd41918dd90622321e40a6f05d1f59a8309e0d9509ccb165562a79049a2422dda8db56544fc86db051997c018b073df647d18c5472fee5b156856603da56cc41c5df149e82e15626705c0f269b73c74a643bf391e30b4f513cdca383dced5daf64f79bcf2598af3da2a8e5ebfd3cbd617ea77c141b9c9b166dd9f1921e15787a883ac02c9e324455ac86176f65be8e67454b6965e66238c5725106e818312da83999649c47ae10fcc45d934bbbb85bb48a3fe14a18fa0c3dc63c0f8546b66d38e5358dfca308f2c78aaff4958304b6602c96702197ea59f2e7286ba40833ef233b99b8a9617b61110a41f9f2258033d24bf57b88433ced429b9e95e8b3cf3f00fd919cd6cb835af2ad1e3f39e3174c49e4f56d69376b376b14560501133ecae0302b72169e4257877acb1173ab3cbe60e5a0323a5ac8c9878a127302fef4ac923d2cd0639fde3fdd5c7cb5b4456607009c3fed3691636cd8917eead9599df30a1dc619868708ce911509919ef68004c01806d81ae1c55d05d712944c0cc62ac1edcf4bb22614664dc6b7d22e50e7824f09dab24ad29a704c04ef4a91f621738517c7f4aec3e977c354853b9cbb18f7e65a01a3631df5eddef1c7b9b06afcb6065bb189c4075de8b94025c3a635b256a2ea258f6a760a7c44009a7dfc51aeb0fedcd545c79f240aa911bc9624ce1b85e3df942bb8564bd575db48afed5ff7ba34885b4ee8d3bf4e6096ab05480b2b0b607271ffeb5813d0a5ebe7cf0aca6588525ba4909889c477a9490f59502500628e00cac22dd0cf5c952f59acc201cfb0916c4124c216b8686f55f9a2a7888cca5ea2f17791ce204ac2e81247d38ecbc4458d81a80644193a491854710f7a4419131cca3ea66d92af4a6c3d075bcea1b76bca15ef30ca0f614ae52979381278195bbc8e1ae8106ec9ad82f7e0f82e2e09a48754860eb54707b41c20485b6cd3f74ea6f9b91382a6278ae9698ea90eb0c540970ee11f856a46b8cf760256701e6219c016538521c412122f3f3d72db44c922a0dc5fdaa08f96c5dd8a42316bfb2d65c35e13831a8e3b61e38c6ded23955534431491ebd31993e2dadf2064735cf47c852eb937b65729e81ac6ce5abbb498df1d6fc2adc741bb6d32a8cb02a13c3fd3e8cd9417667268375eebf3b8a02d695903da527baf56d450226aef714e60a448beef7e4dd7ec1ea6ced02c5bab316854306b8444d178e71d631611a524946cbc75c19213aab0f605c860977ec9a2417ece00c47b69b14ecf7add1689cc527fd0c67ef1e5a888d79390d8829c28df3abc27b6f1df85f3e8364ad02cf4e20c3b57405187d8fc4054557b6507079e9f075fd4198a9ab04b92e56214eaf5af706159cea3b0c5eae0bb9fdcaab40311494c13792cacb51f4f4cd53cdc1e426c3f3d6ef8671991778ef808de73b640a51fb199f6a60f92baa04e325f97262f3cc3900cdc8213b11a3b64e459ba5428cd8269a1416732e93477b3f3ad86dbdda94237dcc4528c2164f1814c227ffad6c61deb34f15452e9bf4ceb063e69812a670286c47087c11d5ff6993a0b940211316f27d2178e06fee9bce1e689540d1d28d0c33e5a3f72e0e303ca0b15254c8b3df52188d75632c5635aedb9b7c09ca88bb9b41cec675c9d2f45606a39c40a4edd141d25cb91b6d2b0ebcb21b98a06fabb204d1060f390326dc8cac0a18471e3f0a58d4dbf8c4fa930a7bdb0972ec36d18f091bbcbe09e75d0b5167e04d728ac133a06dcda6454dc00e44124bcc98b875c3329bcccc193559a6896c8c1b7c220604e897fc32be6fe92e1010a5e887e985ea9534b30884f90c3b80186d49b55b240b22d4eeaa5c80f989d00780acb776fccd54cabdba263c080813fdefdea10066a6e071568ace914648e5f818935f5fc72b25ef746e36227d0df57f37b27a38e1d7a4a3945886a65c6fcfa59aa8100586869bfbb0aff62a9dded2c6d19e251fde98fcff9ceba70a448070bb3ceb79a2f1a0922b1c2f22fc357c8cb1711cb36307c706c0a49533af29bf05cf5cb4360b94fc60595b9f400c7f26f7a605dbc343547f3e52b75dc9d19961dd8bbb58db7046490884102b6c8de26e47d3f1b3a6cdc1fcf7317bfd878368077c7dff08296b28f4bb99ce14d29b4c358a3f77f9e0c8ca17a64f5ae1c2c3c646c0038b89fcf47c7709cded496ced8816f30e015fa56f82511a4a97dbd3d2086ff49d0380604f7121ce870bef98dd134a67619209892e2eb6d4fa3d60aeeb50e1367ca9f810e2fb34380ff8cc28f507993c5a0d5dede589e81c9a0930c61911429c9dd99127c725e93dc9a693b1df387af181ab927a7600b7d172570b4c2047241549ebc23fb3f662a2b9d799e61f4fd6d1af82fdc79958b0a04812d2a310185461e0eb32b9e400c191f2589d01fc6fb597c8652692121fc8fc0d8ca896b04a26a7e60fba616e3448ae7289cb7032977cb79f806e6adaeb9000282c71af2c6119e6ffe9118eef56779bf9405087b67cf2f09315f821ada15d18d4ef84a2fc847605019b6501cf253bd04814a4fc7098925a8bee7e9f779886a76b36eec8ca66bdf7b099147c0322ee507a3832535687a1bf19094e3a689ca218d35ad69b9017fb438389d9eb37466602f36d8493a6ef629af9dc3047ac182064182011c7701129e52b83e3bc0baffe66f0c91438cebf74324878bcc044fc62d30b2ebffd3c3269c918d5d823cb8738413280ec02ebf11d3e89c32b463136adfb9085a25655ed21606d9e94fa579c855f1fcd9627f3049b6011f541fdf48036cd4040a2ca50ff9cd784dbd158819d7a1f8763f74932596835bf6c4b9306e8635703807f91b356c0d9f488e8c6956340390b66a2fbd49c18d02cd30dc19dc72689d89ab04294044369732478744f21550f3e7bb595f73e84e6386f03ad4f36ba7025c090565c69f47b1d0048d057a947b8d6a7821e9831e516c3d0f617a00e770dbe6dfcca8c1e5c2506c9c807936dae25e95d067ad1237a0c800ee6ce539c61ce41c3d77f592a367691ad74466a393cc7d720931d492570b148679c8c4643ea5000d60022ecb35dfe13dfacc82e7ed26073a69ed9f5c4504750522a0956d8871c679282f40d53c87ca231176e6cb3f16ca0f8e15703f69905ae71b6a86144333a8c2c0b3d81e460ffe03ffaeb7b389f556d57836999e562081434c3125f105e97612b2cde7813768be2763a76632aaaa9ef9885e72a9855e2fdc101a0ba18d00573283bd95fcf152dcd3ff2a157c57bb292f097c7f24547697ffd81fbc0207f07841953bf3c72c024d6d17b43f8d52b58433325d41e628c7a4222ab4e7a3e6c282a39692c3034cac274cf6025a013e6a5e30ccba9a0e851a92145a328fb222d12071c03e2b20318b1151dea729d1a3e1b25b81767871f0f441426607c7eb2388f0ceef57510c33bf0eb32ee67708171b0a3ab99f1f6cae2085d1c7bad785e75b8b6e2224a4edbdf7965b4a29a54c01c50677068006535c80addd2fad75f2997da74b55469fd0bc608b2e0f207d7022b9931389c60694f6f79f56a6150c52a034c80d970f4e249ad33d9df9d6bc6dcbdb73ac7625fa46a0b2caf097c9641a49ed72d6a6159a33add0e400a1e70391ab0e9eb6b99bb8dd706ea4506503597a9edcb258a49d43a83fb4a9a5b3032ecb34777a7e80967964815e1883cff27bc661e7b1406946d5aa032bca4fba6899f3d49fa5f82cbf8d2bb46d26cda4fcd9e6a239b69d217034c706bb4273728ec1894e2f4f95b44da81983f3d09d1fa8eadccf24d8366f2f55f1835bbbe4ac614a7941dbf4ce47546788fdeff3d190fb605975549ff38359e480c8f61e4f3bb4e9d8a53e7c1eaa17eb0b497d48e6afaa0fc9095565f9e990cff2275559fe184d8d31fae0df8e0709b4434b2fbf3852a72acb1f8e5e40780be8ddfda4746727ff474ea5bc71d016c81b043ab4bb0761eeee6f085efac5679982f159fe9979d032ff2481689973ce1609cce2c3e1b68d06468509417ea265b63385a1a188302b845dc220e994f40a4c6782d652e025b48a8b4785068dd0801641642edadbcea4050f4ba48023d022052b5a90806f1ad4a253c20a11098c144c50002673a1c32e1f5416f008ced30018203a26c0f4202ee96e3b1318241d60a8308119eaa8640d937972428bb643b3b1c301a757b6c20496ab8a314e56ad2aa098e827162d53a14445dba1d9d8999234454937b14114a72625385c132225a20da450e121ac820613bc27f096819c750eb50b382af3bc810b4e1ab6e4840d62b8315531c4c5911b18241b74a04805493698f20405135c17251bc08063428196251bc890149535ec6e67fab2b46dff38255a50a1c32aba1068d0890e49ab96f20f1a97a08988224d56b034b9e0dd9a8a86681af2a254104269971262124e6c41a77ec8421cd1025ec294c3129ab59d89290a13143c02a625494c48b6601ac225e8d40a3e2774cb09510a9d93c0f229c1848416308c4e6d674222043908bddace8404920785d6db99908832051219e8aa60422289f845e3ed4c4890a0e30b2e8b315974a1a45fdb6e67ca224a2923cdc8bc5c5ebc3c3d41b15694e24ef4b91efd2afa60ea51aa714a0c412f77f8c2ecd2929393979faaf35365953e8df63fcbf27f678746fbaf254b4afda05c0e48502e970b82120a021294cbe5a68ca05c0e48502e970b82120a021294cbe5680cad6deca5e942c7f9c1e172fce070b89f2b1efce4f8c1e170191694cb0109cae582a084828004e572396fe6cbe0899e468200d1ece4e5e91be7adc6840da1818df26f1c4c17f3485414982e8ecc26417eb674a93f573cf02d2800b23766a5d166370c6067756b7d3af872a552e2addd63dccd0aae449f4e83aa10283b3d5d1942e36e7e6eac3f312b0a8298ba80790205403f5bbad49f2b1efce4f8d9d2c59fb0b3de94657843e3c679fce6e646eb554b74852f2027efca101ae070389c0ea232fa3f76565ad0cc6f8031c09e948823397e70b81c3f381ceee78a073f397e70389ccc37e3c1721946478363b7c6d2202041b91c90a05c2e1704251404242897cbc9c8e572b02f330848502e07242897cb054109050109cae53c372d046c0069bc1c8cb841d595a26983aa1b1b5439111bd45d87f1bd5aeb69823a3373ac0c7d557759276b5b37b3b0b579f2589567539f8ba087a105456b6b58ed97724fe55977ab5a31eb65dc16aeccd6556dadaf0e77d85aaa8375b5b3d67b6fceb1b0d48d12d06a2feef20786624aa557ac96eb2533038331636560d0c854191a58ec6585aa4c47c55c3535362d1894eb00396cc9695aeb779c334c6b3d83af95b189c1baf85a7cad4c0c192b997f8932f4cb0865883e1d6c546158cdfc46cf67d4673b745e1d838820d444cfc7ae914c611729ce9811dedcd000690020141212028017800064a11256ca3a990030be9646001684308fc2d7d258806377bc74d892fd797af112993b1a1838b35a972cbe306617d0dbb90e50764b81966a15b2d1605c5043106829d4d4e26bf1ad01a359fd99a67784aa4cc8fe0b61a80b0505b342b4d09d079612f2192da245014ea794ba7b7d6dd7ae15b4e1b475db7b2feedcbdd6306777f728a595d26fde6aad416ab5402008864ed688a2980a271115139076f7d56ac562b15a2e777f596b31d04ead95666bb5b56e9919188c5a2ba5343434b158aca6a6c6c6c666c698f7e25b6b9541c672ccf92e770fdf4691b3a8c5f9a39e6ae55d77cffb9eea8dee795e8bbae64b26749af36d0b83d2cc18ad993634c694417f8e949c33ea4de8348706000250ca040080009432015810805226000b704aa739ee0e0327362343c37185196776c14e0d1a6d00f7ded90535680320c0bd37460dfbb0997cef1d67843e6346660e450561a256a01d1a8e2bccb40150026010daeeb6b4625a6ddcc8a94c043ca95d7b41db7e8af6c7580773079935d6c1b66490b92bf943cbd0675868dbf7f88c041b0c854ddfd2a9645325288ab6187a8188221338f126b218651165850722a26af47bf8f019102de7c77cd05f447fde28a58fd402483f841c5705435b086462685bd75f6a18069cb44cb1e2040e2e28d5a60a4eb66822c414286851529baf614db4ac7be9fe66c075bc665da5438c095eaa72748821f2d2f7a4ad9e676249fb64dbf9d6755c0a2b4e2908b302102b80f2993daa4e6c4e323687d49ae5b10514314ed4d005182935bb0108a42812c56986255ccdfe1cb23f89ece754b11af8cc1a9961a127917d0ca2b4db9a2fab4e8d82bfdc1bc579eabe4f5f701da82afb46e1b0ef78c77dbf8ee00d1ab46de2f67dafb2993441a214f801a5b7fc3907f9d3fef17df7b9fbbeeb82fc097cb9a0e7eede8736fed448b47187d451a9b2d1db1fadd53035d617c7ef728009f8f6f74d2fb4b2fcfbb7ede5718ae40efa41fee4455909b874e36eafbbbb7b757b4710e6f7a0c9927c275de3018df9fb86d11c4ac6fce77612c7052d4c2858045a34b211850212aa61733e25611c883a4299a24830a24b984b4f0dd3e076a6305ae89abfe9f9c1910516e355312e6121850f4f2b38e962870d909045091e4e187282d34338718ad120022526b845c289e3c7831b062a0c164aa9ed4c61a0d85a627861117305524dc808b4870f44d58eea8fa03aa24bed8a25a80941726b47f447b0556a973c9aef3fc29c3ce0fb975c07377942d1928fe8524569d7d9a54ad2aeefaad9f569d7292903fe3b529bab0e3e007ef75903ea9ed42bd502fa8f32d4f7a048e3afbfe3bec53127614f02fdb6d221232324508c8cb61841b1932ed1b609355b6f9f12559d0fdfb2de4641aaa9350a085629954aada11e551b6606f9eddb5c29a6810e3edf3436a0347d0c52d029194224b926fed17d24b9b67afaa1f84868b5d4ab54fa59df58a5542a63b561d6b0acedb5069fd91b36143ef299fd9a543f50ad6cfbad91264dd64857e314e332fbdabe8a846d3f9564db178f6c5be4befd283b37fbb67287e484c2616b32c55f8c8c2ca0f142ca1623a32d509e40ed2bd3040e459e4a20aaf98b625c762f258a721e9c7d9f0e512333df1b2341db66942da44855c76b3a738916d5a071b66d462db1b02f55da9726edfbf3e62e93330a0151e8a831ddccd1f20b2da36a47b4d72aec6a6fb4353bba97d5d6dc70c845d1672ad1f2feed2e659919541e668d8b6546f9ecd61d7c767fce198567142defd3aca0efb4509e9105273c81b6df18631f9fe1d75587833933e0b2f17b968d3fb531fe1e18638ceb483bfc37368031b6e110e17f001e83f10d73ee689d7ebb2932c6760823230b966c1c8cb6186dc939832ee7999fffe53a3e2ecb9fb1d8ecfc005ae6cfd9da8ab3f3f7709ebaf34fc047ce19b423adcaf2d7d1e27041f3a03936da037ad01c1bce04688ecd45e0836698139d4337ff063b3daac8e389ee1e7fa9e78f0738ca9d7389336df689cfb20a3ecb2e9876a72c75890b2323a31bc6602a8cb684e9aae0b0bb2e29cc98da54c05dbb6e4ced8c801874605586e47a42c366ad7bfc610d54870acda14cbaeec11ce6f4a09f961d909123f8c33f72bbd0fe398fa7c61efce1ebc01f923aee8324adca4aca8496ddf750cf7b1a077cc0fb4a969e97bba775396b6d83512a0fe691369638b4ecbcef1e874673bc5a764feb66f745dbe698dd7565594ed2a6c7d01cdb0d35f2a017cab8d11a2812a5f2bb7b1ba5b2bbff1b9a43dfc38283546bad16ecfa341bf35db41c757923086d83d9cafd37557bfd0127cbed33c12d0b887fced0da6d5f044bca90bfa44094d227a1ee2fc5b556dbc3634694b61ff464bd5ca65bb4f127b1f1c4d11b754aa2371ac579561b3f95522b26435a628c332df143d1f28996759cb94ae93871e3ac4b95c9799c87cbcc203ffeeebf874e5cd5994f13a752e15fc165f8e90b94ca7753bbfee73aaa181803c9d807a9175fc74ac8fd941d6b47f490d57b6d88ea6bab51c8d10ead7f015ed324fe1d2a92225559142ae013d920699bf456ff036951183e0df8b6f03f324afdf0c3ff28135a8638e727d2067e1865a4b71a3ef65d6f340acdf96264a16d9309261bff7caa3af4e632fc394f26a2a039f8bdb12ed192cbac811fec7ad821cc15bdf90cbfd7269fe19f3337a1e613c61fde2211875b5296dbed76bbdd62476e8429badd6e59aadc69698a468cb6d19a24da46976246b521eddbf635b47428d5761ed587cf6418e9d5f62b34cbccc09e802584b96db3882ef9cc3e6de233fb4f603b15dfb1663faa5b6bcae6eeee5d98350cf4becff31e5cb5d5566babb5d61a7636777757595ddd571dee94b4aaa4ee2d77c1aab8de07baac10eb61ebfa9cb6bbdfe359b58ad6d69a0ac5943886b3c7c32ae935bc135bdc6ab940eb02288637ff37bab5d65a212a3187bd2e58eb42bad659a7ad76ce5a6bb52e5c7cb118aa520f53a5a618dacebe93f8bae0423a86eba33082002daeee7de0bdfed65b9ecf7b4b8fb5c530a5b74ab5a7eb88ef9e3b38bef6b591c0ae2f7a5aacc0aed7bb8097175fdc6ab9c04fc6fb7a70a58ced6f5353862eeb6c35b609ec9b59620e1d06d9b7fb9598a313615f2de6b03b67d15a0b523279359d67c20861c0a0b9b5eaeb19dccc1af6316c656331d1e77eec6bc2d4fb4d8dda6516b4d9e64ee635a806ac4a96259d314297cc0d4a68ffbabd890913174dd66a9b6dce511cc87605548000b42264e2022ec1a272e1c3d255a83993e6d39e73ce39676d625265b7ded29c9bdd7a96e8d362fd4af4615911ec1513fa55a28f5699b04228c390ec899caa226968db1089a6252508e369d99e925b135111faaa60685b237697851662df0ed0ec9aa4c8ae4f7356a520dba9ad9e33773540d826245bb625c0b62f43f4b15774988289091bc44071000817365c11e68b156240026fb89201cf79624c2e367d1bdc0bad1acbe5480736fd98e7a07092240b0d60a0a480410a8a405a01a9051e926aa00d50324d97996d7319d961d3a623271471f2a1309d2d8a6cc000db3e4cf4b1f9c852b1adfd1912e43ae79199af128ed8f45f59d0b294004549133825311f00c20927505614f14592da048f9a46b0e4aa3baef93f34c75da28fb525dc5afa0a952feb1c6a96e8534980da1489129468dd4402924aa70b9fb26d12db360d75b1eda7b4d658b4803347b4477cc144f3ce90fd8203dbbe7d50f4b1564c61e24282a32b460851d32b60b901ea87288e1c55b086ce8b6fdaf469fe990f6bd202e5669d43eddaaf6d0b739b3ef542c360bbc9c2a68f2dd31653ba2bfad4d9c5924ddfcea12b42d459b52ffdb0e953599123253f7c0113c5113d96343541e56684c2096af50a239af8acb5d6daa933a6c8a6ef339a2656520aa25fe6571dac73055cc76b3695adb587ea4a6bfd8e147254491ddd6752887fd7bd904aa48647ea4588be08f47bf8180352ea6119ae3ade18be37aa3e8ff9bde6efb10facadd57a0e33853951c80f2b8116e2070dc0b0f1fb9c81c418ff1d6bf80c7ffe18502a7f0ff5c818d0e7657208f8f93f32d7215e7b88d07f1f9c77d2940ce25371c7ac89e4041f2955a4fa9984b128f210528d3f3daa0cbf378aa053ae34a30b6d9b44369f4c6ae04cc6baffbe3ece998c75ef6532d6e5df017ef63219ebbe1f12ebbc9cf30f1141dce159f4e1ec61a22ac33fb4c4383bcf7d3bf44571e348db60616d8af69dafad4a4abacb33ab8ae7c667f4fd314ccf0c2a49a3c5da74e6e535e8fbe06dd52c22045dce87e433ad74d8db794c806f9bfa1e3a913aeb39e0a7480ee8b69fdae216470cb0d0b0bcbf91ba5cce93523da53b1447cf09b3869e2f69fae03a228cdb36919c67dcf435a54510b9ed1ff583fc69e70acefaddae1dd9f345c54948b47c9a83b669a0bd7b3f7fd7c1bcb1c7de9f1e5adad841e3b73d175f24fa13879444d25463596537bc860e8f8d99845482dfa64840f479d0eff9b1482b2b41e81a6a3f67188c5e1b3b687aabb5df398fe7504b9b9a8cd99ffb8e769cf91044adb49efa3ff5693bb5d6d7f561570ce837e29e5152368ced4c514a7b6eb0d608b8ccfe047cf42042cfefc1af312a922139644878e97bd9f31c6c451f7ac7494b3cd65ad0e1c728f9f52925717c66ed4f293097511abef8f3e9d3d80d627931d48147b141985f78f981490ae0af489676049c27a6bf6c5bfdb25d554cf1459212292c61e58a9a7d72858a1121929862c90b4222f4f051ff73eed75a754fb52124420f1fe01d73fe5e1cc1eff9c004881ddcaf245195d9a21ee3cec36017300154752600820e58a1c30a8eacd054b3cfa3ea68225270240215c2c880829afd9e1f9a5a14ef518b41d79f48210ca08c20744d107ad6a4ecf0a0358c34fd92be86813950b46d473ffd1f0f8074ec80b98ae2ef587d480e097ff562f82b7daf8f21ab0f5f1c532fd62992e27fa48e15996d7ae720980db633908e51539d5599fcc144b32622a0263ed1ac85b07befad3dd5d6bde7451cab8fef534fa42604246d40fbfb2f450a095f487df189d47aaa387a0d0421fb7eedaea8000b42bdf6f3b6ef41cc923f4029f042ccf169d0b3a3f513d974c76734039fe93a057019b5edece0f059856110a5bf20407f1d1edb678c80894c9a4740cbe110f47a5ef798ccdda8a9d0be6d39a4e5ddb521748c83fc239309f0dde5b226864958d6b4bcf8decffae2dcd0f2dac841df3a439752892d4faf58b8ebbeaffb70f7fef75d30fbee2ee33e535de3eb65c69f21c69f3369833133ca8caf77915e6556e4a06e9084f9cc76e14b9512bfc5f256afbfdd85610e5bac9556a5c45bbfa6a47fe0cffffd1c61834ae1973b0cc30f5cd65a4bfef80580e30fff6c6d33e710bfbfab877ee0fade8efbdbdd5b5818eb7c74eb02a7f85f96dcd594f40feff1e711b67fe5f7b9f776013fecdbe6f77d3fbcb71f04b93fec63fbdeb4a3ed3ff02ab33bd72e3ba57f63ab2f16eb5be490d7bbbe450e39d2f17a5775d5d5aeaf7791435cff7a96eb5f3f84f5adfb3b58dffa1dae7fbd8bb14b925e652c72c78b2c49589555d7930fa2657d1b52e87ccd22d8066a7dadf58544a83aacf2f6d4536595c52277aaacbe46d738e30b1de483e6f8d7a75afd4b1aec833238c59d1a2468211fb4ac6f2307ed63bc3c89b26badb6c9827f978a3e6077bbee93297a32846db26097904cb15346245962dba61149986a51f7ddea24ca7eedda65d77b7360b069f77d4f9d47fff7adfebbfb7b1bdedfdbbafdbdd76fa5477a5fbc309f7d2d6f64e1f979a4d4ee4b29ad5e5462c07b6b4ada3eeb56cf3fcf9e7aef1c7c0fdffd61cea3df49d0b2465714bad5fa1a9a9380ba41985f6c4d5ae0ee1facb77fff3e8ce6b45ef5fe7bc6cbfb369d33c3835fe6ed8333abbfef5a91f7ebc6638c838d5f668ce9a72ff3af31a6c9d807f55fbf83beccd77f3d1539a875af46105c5c80eb675ece7a1f59afb2cf7ad76804c9d73e2f7fea8f42082188dee20781edee83e41d7e6b8cf9fb5ebd1e63f8f5fb668d31ffbc1db61ac331e664f6ad39186320d07d810a5a25450c67eeefe5ebf6aa286e213441c7eed3eddb3e1667d18c30da1694bb22d64565f69f1e80bebd19635a3bfb7d64f9933b8d6f8a689b3f05f978b2515c5a1f9c9da7ab4c979536c30b6d73a707d01ca749ed09a0df8027d074d3efa15dedbaae73281ac00610a9d99f0f8a29bf39a24b5a0f0c9c31b514a182c4a24915a95a99eeeeb7aa13deb6cfb4d0feb63006f47d2cb6c39df0429b5020daf36f4c384d452b4abdde688e2d5716684eee61cfa754fc1e5a2bfe9bbf3342446480d72c0be337763b172fd5ec486468d628d50613edaf54e93754bb5fdf6bee23d771523a49e8bc7a14a48fc3099d6d41371b87f4409498a626586c79ca573471228726487857b4ddded4448b2a89feb637352122a583566d6f6ac2836a05cddaded4444aaa88866d6f6ac244034d8c846074d745a843d4a785f6b63731b922f582bedb9b9854e1f1a0ebf6262654801b6862e22567724c121936388d56a0102387a767c226072419589cd4dce0148308a29895281b0f2ca1b1e156938312183410c5684802ab124533e5c8cc0d516070d102918c152718174f96bc70589a61e23a8292e1c20851ab869718160e432e1598b0b232d4a222899e81650215129515124b52549e340998883644a97a280aa928a58e9680558ac429493ea4a1100623de5114700b2719c83a50f9b61872d2d500e561e104d39094c59ce0e2c001aa13b30491c541831316a38549c55105e98a1981128a4307229b7d6832c3931824253866b80d20866ecc11e15308be1392d061862462f0220915c4152461e448eb2fe0924e4d919fd029a794175a4608718ace3f381d8563b8c060051716a670719297580a620917220c059722495e14a1eb76a6262e64b6332db145298a5438fff372c733fa6c7ead3773de3b6d73cef0d67f1aeddf61c098ab5437c2a46114f346eb7fca5ad91b8a3af4c0ef0335b081b36bb08ef7b899c369436366436376e3a7b5711ab31b3561a7baf6a626aca118be6cc4f0654323d43a145d7cbd6c68507761baca6265e3429021d81de46e956fd9a06a001b548d1bc4f8da5a55c87a56154dd5f0800deff6591db705f1d74d2fdbec8d39c360160443777f6b7dfc2b0c9633066f68c559533bb65655b5d3da344d5a6d4803a2a5adf7e2947b06aa327ded8ae67897c315c833bf00b2edad467d6dedbceffb400f0c73288e9ed2eada2aae52b8eb6eba3eb535a5ba2a6df5ea572ceab0afac5589d3b4d26840add5067a2027f7b29f58ab79694d11f9a6668396484929fd1adc85f3896c6ffcc239ea0de60c821d06af052b052788e44d1a74acd38e1bcf2edb786028a6ec57c7fd316cb6b5d696d6daaf09c554e82a9bcca60faea86eb974b63e822df75ea8ad69597455b5bb0d9c92a8148d5aa85ac8ccd00000200003160000200c0a88440291389003a9bef80e14000d698c34705a30974942a12087710c44310cc30006000800439021cc40e7c63a00c05c9fae68fe2eec09d90ca7bea418fd2d40ca7bab4504005c71cffad36fa51977e464eb22f419424c2d3d38f04e34298664d9abb1d4f8793146e0024afc82114fca0586ed4a70cdb96af104519545404a66004e7ca34eefc301c384b0045928828390d0894e0b4b036e2a43af8b15453edc4fc1ffb5161a64f2a9dcc7d94c8c0a01d8da2e27e719b74e5a559470158960b8c27fd9622fd38fcfd27b4f940f63a4c3790a16a53352d99bf6c42af6b4becefb7773ced66e134ae83ca5a9f67ca25c260011aee88e76b3025f9326d7a21cf7759ea5340ee32badefb1f59c6e2ba377425db1a9ecef9bd2330a55f291f6ee82401377e692ef69d1497a0ffdedd9f9d781caf6f0b63bfd243f04587bc275444ee650c3a908dace285f08fde0f78ac6bef98df1f14e206f2e68a0898bfac46e83e5f2cf187413f2dac0ee5cbee1b1f43f828afe3d03f32afa3053283191c2b6349afa65e85c5e3ac66981558bb7e9ffb51b9d21215e91f7a26838a221904a728ba1718904cf4d4bf2c17c5ded97678a7a3c218e2285738490b2309b44fa8ec610c01f27dd040fd9d7882c78ee6c1eb65aa0c47c7fc118d218034b3a29e85c8caff92b424dafa0e5f42a53917a1ec69ca6b05ef986f20c61f2d90cc4805e5c9da9d1522cf35200ac67e178b323ef33cdca54cab19fd6198e89e42605b94b32eee8d4863625092b1957a8bda4119bc5eb483a5db4c491b0e3785f245f2875cd0d54f0842f0ed32392388cb2148dd3be9d6c57541a9c01650403ffa689bdc27dc94622602408a00da19a0908e0076909e746c3913e72ac3d858361102ee9275ff41c8a593351d6d83c224eaf0b7e74233c955fe1276d2248c6e19557eca7a9aad99aaa431e872246048c3e22c88464594f1aa3c10dab1a6984c3189b5a4b6d333a133db28431f820a8d4f7356204d5adbcffb858db73676e34819012ecc515279c0be777417485b1af0f91f29c0322988d04cd46e43fd72832fc153fd0b2a7da1b84851b5a621f09b3d74df82b808814181d583d34fadd488456e5ab9f98f93037ff9aa3496bea5d2a90296b78f188d53c910455ed591f5a1b74e3ae3ae131485b1dd4097416c77e4f20c90267f9ce1973884c7a05aee79122694f3b9c546492965e95663a6d6b980681d31bb97f30e06b44251da99c4d32d7e520e374e910adc0c57faf158b79824aca3fc21729011f5f6c2dd41196539896b95f3417b022e481f59e734e13d1b082d478924910ae28f864f8bad74cdc15e3aeea0f000ee20e40482dbf8b3e98a527fbb5066e8260001394b262ce1624242f0c9b2c029631e89f1e65522e62f2ca1c11639b2340c87eba922d08a5a187301e9474dac2c0119446b8f6dc5e38f761f7ebf6050b818091d14953a8add1d8777a591ea067cb116a76d87ddcb53d6c3a3a3ca1b77af580cb2f18091b189b8dfdf28e77b41d8de71ea6e97d423f179b3cfe9b2c44df26e3fc24f133a2df5fdbc798647e716b34ceab3ed7c4825183e96884773c7085ccbaf4da04dd6a854137d61e64f7deb5a15466414322c261dff15b5bf86d7e838d8bdf7f1abf731c6c1027d44574c609d5a99fd5b406f995441dbfca3df6d23abf7872fca24aa56f3268a601f827e265dbb1ebeb13ddd7b1f0fbd9111ed2a97286ca5c4e02699d50c47c5525b4a510db215b5e157a40f24536a2b2fd7fd3c8635f5f31b81bc0ce7fe2b1e5b6f49ac36ebfc12bbef7d9537e7a4afc748afdaa82daf5f67a607cb290e490dcfa5171d224388877f64ad21c3ba123caac2c449d9ea31a57d7e0ad4e304859c275689296cc76ec240d2719913c40fd512af955e3c029ab57085e30e1b6de388cd0f46814891205ed84a83f34f8a1fffce1ab17e98f8431985aa536ee8fe9a82a04e89a53de058de6d1ef971af9ec530908b0bb7a4189e411f7c9eef192378d15369a577eedf46f7400e0bc6199fb1f7445e882bdf01a22b37e0cc41f12974804ff7695cf12e8608cf62d831dc168f511798ae79a5bdf401eda80445b9be2002370f2acf9d3f5761da380f46d8ec4f1f5a8d7d84e7d7fb5d6b2018e7a1977591d03d7b25c35242b3a348abf9d9c64f8982aa1df8d56e91949797fe91eed66c7c873289694293e7fe14fd6a9ceb936a22a4cfa42151cec35490a5369020b9012353a5061b224b06fde89d62879649c856e0ebb6db9a039aecd92a0538c861abfc0072e1ae78b41836a28b8e2e03cc37819d399419cd2f0cf22b255ea0d19d1b5a1bc0cda835040dd6109f4517c068ace45f5c88ea2e2b1d47c44eca4456985a0216a2481edc1da14fdc6bc463fe39099e3ded34ceb8f7e4a7d9e491fcb83fb1932439c84a43e1acc4827bc8cf589910acb9e3fc5280e25eb7f6db74f73c62aeb4b0e3b28d55932cff89808ca1f92793d630194e127417db59c3665702e7b346ffd44d37a17e491d2eac6fa7821df12c5e8fcdfa7eddae66ba5b6cdc2cf9860406c778117249b312ab40bc635c9722abba97492d2651cb93b925ddddef15d17101366d85cdd6b2326c93dd49b406c556baa0be9b6667551b9d27d3f7148a100ae111af8d3a1f80080ffd98b58c1e48f6d12c7ffe5adf69c4acfdf7ef09f4e9ab3424b851f2433d9cced9913c38173868e6fc11aed90ebd9b7160b314594fbf015ab938680cd9e828b00354f05ba2b61e83cec61dfa5c15a11bc06cd9464e40176026a05906a7186ac5899134e7386279cbd4db0abb3959cf66743e71b4377e9db9ff82bc6994e017a716171ffb27e84f90727e60a681f76d3905395b52889902a6be781f3bb17ad00e8be2b809c8966905365f5f607f5e2289bf9fb68e7e67b288ba4c7799beba3a32d7ec047edf7120d03c0f8eb60761c6f58c532ad6e9abed19e6aa308704fd0b67ccded4cb452078073b26e2b498f0172979c8a3bb19907c1673babc1e8c64e7a703f415316483ebc94ebd8c364674ce6d5f2710b32db866959703cb4fcb70a0cc4257cb65e22defcceaa24326f51d1df9685aaca9cb175a2c78fb93c4859bcd936ea30df2acf3a890e1c76a57fba1b72af4b31e5125ac28f33b36fab69e7c1fd62ddae3c0ef678d28a95f0fc6672d7bea727b6c5861268dc47c412b8809cd55c7112962f616fdc61401498ec81650bfa8a4e9c8bd1665811e44e5a0e4c46d0afe7c142c06dd33136dda860dfbc7179403754f58d0297d3ade8203417a95edda1e26cc002fa7d51da63c6be97cce2f3f82eb98043e46e3ef044daf07d6d925615f7f759b3aad695f6b34d662a695ed53c16b5a77cbfed325249e3aae6b0545b4afb6c9729f53456318fc5da57dad7da64a692a6555d0e8b5a56dea786de6a5bd5c4f7dacaacae53e1e2feb9dcae305fb7cf5c3549aa9ccfe2b630c89d9fd1e943c44a93b7a339bfed65544947aae662695b9af86c2f53f57450558397b474db57d4bf7abcecea9f5a797c566dd25635f3abb665565f2755f363b915cdded7b38e9ec14522a38af259d68e60fca86da6548f8caaca65517b83c8cfa410f388d4add6bb2067050e2dce1cb34aeb1c8d46df8f9276804e3b510fd118f2ad5b0cdabb816c3170eb118ff3e9b4f25bfb7106a7c4c6c1a1c5a040027876c555e0b632cba2ff78864d825a7ac1d8659c81af9534ee893c9a71e9611d2cc8884bc1b907871dfc3a0ade3c3a8257055780751f1f834e14338de51b6d70189b6bb00a9a9b89c841384112b88eb7095ec4ce0e862d68e3014092e1d96f545102147a9fc551159626b7455119c105b25de4629ae50299857084a7b845b2357c1a5dbef18022f6e3b00c091b7c8bd3432ac8690d28bad157ff4288f4110e3434bd50d91e17e2f75b0f66b4e50e59d78790f693c60846ee2813a8fa4a2019765fa609da98679a61adcd22bca844fae23561260be80e1bf502bc179fa98bf1f24cbb107e1db7581b84adf5465c12cfa306420251d58cb76c8a2e7d21a0e5fae71b10ae62db549a4314cbe13daa8ffca28a356e8331208b84e254dc98d1361050e81948628f0e2bc6b2a2619dddbc71058b9e0bc98555ec0ea11e739be82236cc0bedb9c6b447d13371005e7cced2201c467e590970e4c95e7d8f175e072d68a60f9bd70fbc4d80374f29cf963201b66680653ec46d485eec6a48ea94fb3899694a2295b63c7a2f63d549e6ca71f209ace3ca0000fc8d880338c1f6134f17548e838cbc0884b886a6c4b52ff6c3a6ab1da3645caaf07e8eeaee61b33c6ec9974570b5620644feda053bd155addee87bb0b36bcae9c817a0174479032559dddd2c3bc2aeb15a8391e1702168e1565cf4c00408e76c326a7468c26925910102cecdc07e91de58e55e415989878e10985bd4dc592ee4ca6a07e4b773ca19773341f675b0180d8c473505250b18917f10ad4d97dce1c0a322c49cd7ed0733efded126442598e3e29a4785462019e8c72dbfcea3d9c050163d04505011a630eb8fd7bb6fd9f186e247dee811be8a4d81035d51b1eb60f0d5bfe3750af257b9fb9dcd860c7e284f45b09848d764cb2fe4efede38caef95e89713991e3d85718c6310237af0b6787b2c86cf945b0b5c7d311e03e1a852e7940ae8a2aceb77a25565f079be7947e5946f2a687f904c7c7b2102d96cf9260f9a6efd4b2e4b3321bdecb52399722756418391deb8bc27ff68d74bd062aa4482ed530bc1044a0015d462d9fb30c05313e0bb2169a930fcf51038a5240ba0ce0aeab00b1d125d2800eaf4d9525020a9da0f99e138ee7e7bfd181c98166291e2c058be05be63865f4fc628951e4221ba6ac6e374ca017fc22e81fce555ad5467727e18e20af3d053eb7e9d75262b793b16a64e53f0837043c769680eb5b5f4bfd3630a16b9b1e9d639070d27b25432636e5dbadad7c2ca9596daf75d9dff269c469f4ece6e0f6f8466a143538d3ab3b0b4b0df284f9e3b71e83968e08fc9619f07c88148de67111aa1f9e6cc79605bd7cfffaad1c6bc49a492846d11603392cccf45ab4fcc86b4e611e0607832ea79e26e92133adf5ceb2c9830cc93673e47c13ae6acfe7daff95645483c4058d0eda57443230176280dae3fd404e04692a7877a1509bcae0780442b1a5d336bab18603766166569636743df4debe9d789f013e8b7e44e34bccd2c14955c948095ed4fd174127aebc85eb647333766511e3b2ff76141889966195416dbdf22579953886e6f205de687ad4d082056975c3fc70b41704e98b04a0dc87e2afd0b44b99c5d8deefb676f855b3202ea8d8fe96328bee15a199a044d2b4dc391d164973198bf9fde2c7b6fe58903d5772b8e39ed46e4219a6a39b4dd9f331c551d16ddbd4f1a67ad1e91b49fb88736f3d5b73add1c38644131198a0aa83e114ca4cc8d498d6d441facf05709602b1ecb53ae833d1a23258d30108df7fb2ac283cc323487d956616584d26c2a1faad67e76532b26b638ac3664d31012d5533e934ea31a597abdae1619035198e0b5a61532830e864bc3a40aa3102837271b847a751beab1834dcf7624d9f86edc8a2a26bcaa219ac72b605fc226e33b0a128f0df83b1be42424d1d7910d3c440b8cd89d9f9b84a64144762facccdb937b8331f521654ddf0800bc15cff67e2661ea83f4c63f7a7aa75e00dc413200484afbc10a2b3b93f2f89f2a61f82dcf48263d43743fffa3b75be007167cd9fce0034dd9d72bdeb6e0aaee509981236978f2a73737f1adebef0429a61382a8a98c528e678d4147ae0de22fee1a75f6ac5a6bedbff95228117d99f718ea0d97aa945f62319e4990ae547bc227e78f9b05653ac448ae6da8c3117b0003820783a8ed6461ad548934343a92b8c1aa2e9638ddd599f2b4b1c6b51fcb3d57604b8278698428f77505ff86857128b28f820f369aa354a0d7fac8e3635c1d99ff5e3ffeac024b757a5059e160bbb0f6a8df941ae8384c5af3af2b926f719d47881c9d1304702a550fba4b17a3b0a88fc0d44b02c3bf3505e96b8218e96a60a8d8007e374bbe1c0abdb36dba28bc0e3d7860ba3143b3cc20e61e115dea9f77b39ff4642654a66d97c9e2be6c51b7fcd75cd2640bc2a0a1ea239d79911420b76a8f9032f4b86f98d49fc974194d42d0db35b5fa0e873f07ab4c7dc6979fdfc44f3c46ec3bf265edb57607e453d8f47d1d47035f75c580c76f964b014c70e4a63b6a5d624d7e82c631e256fc7ddfeba480394ecf50422ea120c59e9dde518a08e6b43cc93555d93173a586e096be66994a913b18a7807bfe53e20eb3d937d08e2d3fcf883e52d19ad570978a5959931b59e6bc4b296de470370da85b24cce46fb12ae706c44da0da20b17e787949cfc3e068c970f2d29659038c1984f8c649e0f8546cc229b6adc8d04b4043073dd3f9e5deeb4d679332d000a70d18dc78c915fdcf98dc9631fce20a6ab3fa974bc2be84ffb65b22cafc8a50b704b05dec39d27f22c513306ac32bc5f0399ed1d44db340bf55465ecde7f3a954079abd4161811380c175aa6cc0af538f917c048469921e8714582f9378bc107cb30ef27dd7a9a72eaf3a804babf4cafeeeedbee6980a9da17c378329dd81cf43c3705b2f8de849eb5c43eece9ed13ff1516b70935c9b705afe42bf31ed703b3e21c4aecccdff06f9bb42f338fc62471b11f7f70de32dc19a5e9b533d79deb88e60d391930c0cc46edafcad0220ee80c4d487fe3542c6f73c0e2a6bd3e791223a7a7d6886b815f2a9c086d7eaaff35e4e3ece3d8b7b71d828b15a7f9a0498dda30312f9cf089272690001c059e7d237c7a9ab077ca214523366612ad9ac42eacaf7777e5e2848d6d53aeae9866effcf64670820b2b6aa7d9ee3ed5f5bd389da3753d6a1da51e579b3f270c67d9edc9c945bdd0c8969c27f5130fd100022b430a0321f7fbf6c37878f5fa687b93b62f4d13e1e83b13774db76128c70029c1bbe907168407e029dfa2f4596c11f3497491bc274692d4a41a72b79621ae1718d86cffda72b864bbd6d25b2b72f5bcd2cdff70dce0e65e69e1cd59caf4ec6ee7e9b70f3de5728952a48836fc1139ed57cab8f8063ba495396324e71f7d6f4bdf11eed4d577d286a91eca4c01a10e2d3a884cb25ee20a72bdc23eca56f9346d1278910754659cc25de978eb6555f18d8632897acc44ad47cacec94db57da064d86d0ad98f92b129f93149dbca98b5ab3be1fd75cbe2160482b0778496871fe0dadf7b742c15b3969c8535145c11319d085ee7ea9c464ddfc5c15a64733ce21faa066c4f2a5bb752e1bbbedcded995f23b80c7191d91361657a5d68a32ea3bd64289c3f403dad87ec948049c574e06446417af5c633d455285cf92bb393728ea8f7fc113645c7e26849c74ad4466dce3df5dcbd61941f129ea7b87b54908f05866b81c9b109192b1aac1e00a0e3d5cc7babf9024cba7bb53a6cf612318633fd6a638f3c8d64c674be54511675812676a5565809c8db11ccc6a45f927715ed6275cdbcccd8a77069504ea08b970c8c19ad7806f4516771fbc7a0219c72c152debe06d7ff64c4113e984c80dc31d298ce4535e845db36c9a9d6d642c0923b880cc6ca211ef0049b9c7bc35844bd39397af7c03e11ce868db71edd188a1d50253971e341ef9a14a431fcee359b384ea612d2564856cb6152e58ee9ea19b6a9b02fd9016de3b306e34404a827549493c3427c291007e7a0c71c82f2ca37717384bfd49c89781b5e70e1a09ba4d5a6ad0b76efa0434d9dc48831b6f90bc5a0316d280e2816f325870a9c2301b84ba2e1ff961843b8f9e7ff571a5a55f51837f555635f05b288296bf16e7d94d5e0e89743030d82606fa4accce391ce90797d129e188b090af6f786d374d9dd41645cdb84208902a7b0a403da09b218179527ec2d1d7b7011433e5cab1d7b493e43f53f14b54304d32ddbec48345e27b2a71bebd4e07206ceb6d0597329e646ad29026d3e3dacaa03ec34b6523bb9c7c4d7faff0b4c7e52d09782aff6c966c2c0d2368125245939a24c4c69155e922edbff10e69a9dec9333e25b0e0e6f52ea5416b0004dcc6fe7694b3694240a07488c81f117fd27bf3842f83db2b40693439d5a349f85f68a31e5b518ad27fd4f2b9521a00fea4ab71042ad6fdd40e6bbc8b9a2da0b4c5795b45c828ed4ef4a3ee4a0395fea7d39246279ed2866b2c09866b44d929bd883a8c0cb32a4dda36dcb0f875bb4c0a2751072883a3709a4b43a7e450690f231da571c0371738ecdbcc864e372a1a3054f441f5228a34ebc97bf4b4ae256f997365eadfa6401db437646661c768a783772101881dee1e4ecd49ef1857248f157f73103d46a3cde741f74c7a512525eef969be483dd14120b16a8b5e99adcb2b35f682f937d3765d1f495c822014b495482d7cb64947aa1b9439119c9d908f06cc500f82595d6b31ddae02a5e812c54f3cad946ca94de3d8ed498cef15232321480f460e7dce4e4387d1112a0989b039d2790a2d509aaabe5076044831d2b303ad3c7a21cef0c3d090d330add88f7d7e0807b6a7474efc6489bbd3a2215289256d893c9858c9898202195e20fba6291db5ca3463e21137b343d7ab2e120437306cababf4e1f80d89558f19ecac8e39d9c7ec60966d7956517091e48eb4894d092f2233540678ace202c5c896316f54e848838705da9a7570e85882f1b384393ecb1fe1d78f616a9fd399cd283c02ff5135da1c29676e2855fcee32966daf1bf2cbc1e68dd468ce65749d9cb740c8a3ed648263f0a98ac1d69afef1c66217ad2232f91df036ab1d811897af1c1714c66a22873b9c0cb47067572ade0ebbeb575014ec89eec063e42939fe0136452cf33caa6a0084671c5128d851b3fba9d135dfa9f12adfef89c28a2815ff506e0f156d13914ede5fcf6f3842acb4bc95a9e516588edf01af08d8cefb1117c843a9e69e3bfdd8d4fd36c7eb0242232fc4abafacb2312b7a1efe832b2ac5f16fe11564b8b16cf8bafb01847a93bca4eb9f53b1358ad94088c505ed2bd88d759f783162bb59b220f4fc61616f641f635bf4c09e687f6dd5506fc5d5e5532cda1bf4c8e7338c8b90cdb010e2bec7926d472bad713e7b7a13c9c6cb5dcfcbbe331c0a389c9feda7431c5f2f88b3b88b65d95458a6e4954a87a0998918414e8dd8430ea0282286fa017dcd343df1a1f3cf3fe3237b76e122ea163e5ed43f9f2b1358b7d4df8463ce4a8f77610593e35dcb599e589e801224ed1a584614523d14e66c3fceb906307b2f3e5d79af2e8a8c10c025b01020b46dfcc0ef31b2de4537ed822ff806e994cd8655f9fd56c586d5a0058f281a42dfc73e627302d5b54cd7a79d9b3c1105cab772b7b13738d44c1dc6b73587c0e1580b8e522ed68dfa65f0979ac86d5c27703247a03028e41e0b7a1325d2ac6e045909faec6c79bd6e6ec895b30eec94a7642c89b543e23efb6d6b32080b511c44bb7360ee23a0356e4d3193b5ad073555d5423b2c6410f5d7151cff55b833c46003dbc06f2a13a8f796c8bd4b2fd1b3520c03bff1b89f2118b13e59072c96e9f678926026a8468885b86669b86fd7ef28a6971c5306acc8564321092298f8258cb8c03c45d5c55e65da669a58e76920f3026e2d5dab0230276a5262412756f23f532300e8a1cbced2028be84fd76c96f607dd7138ee34cc0155540292ffad24c782768400a27d9e3425b98b5ef928e729a0ca671d1f3e81bd45cb288839245d6a65a2da652df68ce4e274b6b4c1a561af265310f0e6560d90015b44ea429f876774773b564aa06a832baf836a6864899b2940462ffffea8aeae65167941b0e3070fb9f84816ad976eef43a60d340999e3e396d3bef011436612987e605b52f20b930a4724f2016f8a8f01d108d752ceca680bfc5c5c087a3c280bf726b731fc94db76d6431dddb97d76bb04c2b7da222577e90a763752adc146e9096a03d962ea68972abb024c10daad602598cce873d3c9b231f300c332497968c3909a6b89292590feb8936fede9a2be06f832cd5ddbd14181bd04d2d5536d28f9d1666c0c506f83338003545f22a01012d554f2d56812a8505fd19f7e5e2b9d1e6302b188129dfc886e572719148ac520aa2996395f914c379fa145ba224a900cecf494e23b4b240a319e9191908205546672bd0d88dcd2a2174f60a6e5354a73e600f2cbe9259a84861e09f706f23c04dbc972e88ddeac7c830cf86ad66b38e307c5f1beb6913dc51bf82b8e5199bf572264f11ce48b3846ec17f1d438be9ef2261d43412250e9ef540a5defc3ef7198eda74b7a7461dd785cb98e90f492ce4b50744101e8b0709720925b8bcc256092fe68b22eed2f31f880a0a8fe715c38112788a045ec89bd6fcbe33d1f50cdf6a1cf7c3efc582bdd4281d781a74f8b47cec551f19185f6d70990705f1280a685ce20db4ede6d9e8fb838872f6914d0637158940c0420e0d16feefffd59835ed468fc39da6b76d1ce13db53e3f28f2bc8dfc603398cf8143478b2eaca89ac16c842e869af85a030a2d98f8de041025e5fbb26d80290c2fe04a6cecca55faddb75abc08c0fd4ac07ff4967f2236abc433b6712a0ece36518e075591cc37b7673b32b556737d01a5b907523529365cb39ec8d231dad2bac8241aa1d392a8b3ac461b4e28c180bc337925e863077809c9ac507e75778dd0e251d4b62ece61e62139c96245dfde907e72dd7c156df1c94d803a77b90169c919005228a42c6b6268ea53df791a5a9b2ed05777f4eb37318838336784834b617b608b43a3dbc720bf8e151bf6ed4b0580c08159005ed9dce9b0061f774c4d821d3eb955e46cb684f4fe387bd95ac6929bf277f9dccfed1be173de9592016b5171f15019da6923ce6e899dd0c3b9801cfbde7b9e8967e8e29f9b6eaa2b6fbc525a53abe87b9d138949acccc2017c9e9df65c0a6296672677f3b7923bc221cf316b70cdf87bb735dde3383342178ce64fa3ae64b3477c339420ad0168c55edd007e68d10e887a3a41274d4f64af1c87df8549523a9107363dffe410a00b87cd8ea044aa742578832447bd915ba4037ee24b4da4e65a4c027d53f24531d9764d36b6978237eda9e51bc28ba75b995c5d52e298bc30974184df39cf22208a8383d3e238f35d87e579f4148a6b5d1537d793d3a9b112ba9227ccddc8ab0827471bd880af59d20f127237a7e420c89e27813e8fa988dcf61145df12c94ed2c5e97840fd1a3923d1e286618471cf82e3b15325d8e7e7b6231efbd0e300a929b4fc93e0352e0d360df27c362ee1cea28b77505c257d777dda1d1f02b71f868f523d96b2452cdde21a5793141ba400b053a1afe0db98c576e8ca9ad65bdb5cd8fdc84beb8bd90c41fc0276304367b036f099a1be4a962134ca9b48fc1ebb028bad4c63878048ff482d3dc95baeae3441665a419c43cf9f2fa994a2b01fe0a90c529ead926a83ed074599875237cfb04363135a539e1261e0b2ec5930baee63e8d5ab730a04d4d2a82e410db89507260d227f7769e396fd204afb4dd7530ae8c54a4e7ed78b167bc051a40ecd85b01e4f0034878927f6131a79cd73c6f7d4ee92e060de3484de0a6fe4e4262af80712f567a58c4058c09c38031e5b0e132efe0c7e5a5b68f16443751dc134d0700276eade613407f21156ccd4670d5b83cd7a1b9009d33e05b2036fc7fa44cd5599f0971c45d72e65a424c2f6b2b84c62dbdc689593b3b680fc2044aa0ab4f03b0a3e09c28114c9638929daf248d89180d51cb59d28b1fae86d59648529989c13bdbfeb1d83e050b1967243597881e1a4e54b16bfb1918b4d6a0c0025ecae036c0f31a4e0b55b87c97e25a45db8e2a6debb54f987383583adeeba6167c0e3af1d01d662d3e349751f05a8fe351e28d4f37bf0a56f882c71018ccc01c8e6f059451937286d43871281e65196925ce39eb00e1cefbb80503928a44921883401bb08e91eceb9e7b80aad06926536b44cc14acdf67ce15a4f83273b3bff23380a26a699626e5252afc33b70ddf85180fb980972862aa4c02acf3c1d9a2536baeb3a6b3344047ffee982f895a9b93791dc6ac0b88f957e48ca880f9911b2f6d870a4f07a13e37d99b774ed59241e30eee656fb8e5aa21645d7d82c3cae04a66cdc73381e8d9fa52d7c6e68180ee89b3813c2965edb23227c7dd6336c5ad4ae811eedb0bf14ceb8bdbd41787ec00a824f3b7d86ce9b38a2bb8fd364eb175d12f6ac2a5640749cae40de910f27da199673d5e83ff140037f2d82591ed04ddfdf0db78174216ecdc8d3beea8cadeca650a31ffb7a8120fd20ef337aac9b00ae04656bd0632d71b33805ce2dfb5c3ae3a95d6f09bbc459263f7ff2b295aba3393d5e07c259966caaad6a4a734316cede8fc475963d232ea247e65b32a6aaf32e49b1e20ace67a986be6de43841017b8e90e15be551021fb032956914cec09a849350dfd1cdd4c2abe8d08921473cda3dcbf9db85dd33037aa468a58e44559721ab0cc5e20b271fd254e03166a161b14e0977695506c87b320aa16a2422f0d4203ccb437d1b5fdc97db79bd8b80be01bbb6ef8d7f92f0f109f2f61b6a83f473fa98afb7882b2a7a45b490f759f755bd260103ff6b8ac729f5e7ccfe8420e37f370b392a92ce132c0a255e389068be67396e4886f3c03e7695807783b77350cf6bf6168292ec3b75cb43384b96b716d5b1099cd767624dec7a0fb231ece6d04d8ea06304aebe1e7a10a30a215b8fdeac98dcf67662d883e2743e3a56d32b020092ea6a0244ea2b704f062bc34e259d1546d78b22b48c9e6e028ad1a5142ccbb829561de55466e5ba4b3b2a0ca025c346ac82af8f5379e4caefa928e8dc9ce7cffb5ceb0a0102dabbc2bd0c01d974a6c1f873e8163ff9a40d8e482c32a448102bbc4bbdef320921052a7f66e351f2132440219c877eb785ae8a50048b8de6611bc631694fac751578614fc8fb81393bfc3aab34f59d9876f430e879041ca2755f0b004e8e362d58a14e65b3ef4cae0c1615d5317aa99634a818eb50b82303c489b67f681133a790f3d1331babb2c706d2f0bec6dcad5c39c1e4387e93eed0eb915a852bb3d218bce32aa62cead41ecbc383c60744ba25684148384620d9e548f33cd99ad200cd93004c0dd988c6812732b73a470c66f44c39182404d5f761632a21512a8588642cd8318fbce108a898b0b530bc68f77c01e9ca09453caed7f3cd0bf61a93132e72f4f42a7f1872abfc921fb66ae37cd63c1ddee038316f106b012be5aa53bee645df8cd981d22abc141c8042c89c1ba959bc7fda8ae514d555ec58632913bee3baedcbae500ae352b47bc15ff03390e00e1e0e463a25c5eadcc0b2d05be2c73595dbcb39cd883c6b4ad0341cb184747ea81ac8b93519d41a055d43e03558900a378b217c096f3b4f724ac8668ede2142a4d8e2f75e86e8d4e1f5c29a3f38a065a1cd299d33c4a1be48e100fb380069b9875658a14d020d182bc9bbc5fa16b90ce1b6dc30cadcd1c68f11df688f2621818714634e0eb60fd1b552275630e627452305c39ec93f68f63d01b1ba80a0261ba2d0005b09846905b197383e0ca16d6468592ad3bffce823b4f0826842a88f33ec90adc3451ca7e5fa2030758abddf5d363e2182a892ab8f00e6fb5d6a83f96ff89a24552de7fe908289cdd16aa686472762ae2226a31b430ab855f355b6961772b21ad25b7d29763b3eb6f8f587ca28df4652b07e16ec165ffa94408fb454372033b84aabe62717da1d268808e7f179d9077051364a7c6a37489a6b9e5317342baee1cf3ae14ef4328b656b5f6c610d989bf72ceb97b439ea13a8d9197ec64024cbc0ad456c4c957b829c34ab7fa6ed2655b1848f7397f6ceea55d6173eabfc7abdd6ea0b64a6c2f745cb76ae037c62d0ff78822720e6e52f548c9d21d3312576952cd17cada685b90eb55c7afc0deec6a3536adcde91a1f3d90a150f8c2f82dd40b6b59901bcf1c4228541a45ca8c2f77a3bf186685ef6f565dc13e5341aab50590f5e5a5f783c5ca618dc77c6a3dd7379c2fd3a61bb89bfb19cb8c47f2422ea213475cebe964861166b1e7985f9e43c07480c65ebf7db81b3c2a163982d1037d96777ae17b8cabfeb69f4f7e68349e2d87d0e7a6ddbe87b9d9eceda07fd5aabe3a08f030291bbd7f7098eefa61859002344a178edf16ea475606f107280483208d2c51b3b1a20dec03e4c87b36eabd80fde487269381bc7c2c20a046481e267c5f472a353ee3cddea4b0c955129f7d11e8c54b43fdc84ecbc48b956f7715bd7c3614c5ea63af1f4a9f73904bb16e99659952326e05759b57d1601a2622f7d09d8bdadcbd33026ab8b043659a7ac7b7f690ad87341b5b08386825402153460f231de9c8d175f5d1967ff684f0bf3d6258e88aad351c03b09046ae75b43d60346299ba80f43d0abec94f1b7c7b1f1df5ff3ad02e173c404173cd77c2f0cc46d166a2eb8d4b05011dee2f1a558ce466066905f7c64d7a90560b2003a33927e4dd444dd6baea7372a87bb513ff962782024397774269c0e8f58d4bb3288df68377e6348d428ef53e6fd7a4fc9c3445bc39edf86d24bb2124bb18405ece731c0fa3166ba5557a627350ac062b419d328b900857f795cbb674205d36a813c6f928513dca044e1e708e2295db08c44fd59d40972a7c22ca7b24a097bad055b4ae0cae54516821af60a9fe1910998bd3a543f0f3ea49261813172923ecf2534df50ad41ec8d51864971efb8f9ac96084b470f5b6ff467429b8e96fc009f8778e481f5abdf28e1fd8441fe51be17dfe53af80a33b6ed1a71446f0332db884a2bdc3589695ee4a02b6a1cd37edeb59e49f5e36f513ea6517ffb30938bffb34de828d9401c968b9c3d45f88f14a92c67c40d4e2bd190752ab7295b16affc87e087b26007d92e1c2a1851f9183bf9dda53c626264b00916cd00ba2d9091097d9a66f1211a86e6c87e34747a5972cd79c66e2ac1bcea95894fab5190f131d2a03e8d5aa1c6e64dbfac84bb6c0099f976cc9abc72d98cf5a8a7c41be9570cc7e57e1c283137cfabf19b48cac70929cc130ec883429fff8cac82460dff10bb00b6293556237ce8e7625efad150b4ac50cde2fb33d9d8f8156be0e1c5fa45eec81d9916a15565959954dfa9a00fffc5195928a4c3e418a176f556d69d5e220afde0a1d3d458f131f393f5274bbd6645626dea51a932f0fa1de52b85f00e416454da9438e399f4ef6bec6c3dc7d26458167d2ac1cbf26ed52dbea56c8ccc4363a68b9f2448932f911bd67f9618de487f90a237557d15a25464cb26edc28ee0f99bab36d87f1c3fb539b033d4f969796eb5d50d037138366b2b723dfac2f08a506c5ca134adc0034b23bf446689159558752ea1849ad157ee626d59bd6c798647266d45f6f0b15999b80620d9a3b8692b2d15a2a986a5d6eb37443cba2f2eff19102ed3c32a9b3f2449b2a016570cad62f270d04861809d216d488bc660d83665f7f0bcac95a4f09287a31786af4caa746650fdae9524b65dc63394f54f364d43f509a4636213890c082623daaff17730dfd36bf12f7a99e3be02d7bd30ba1b7cf05ddb70d517bef9d9e3985b706911c571266d971d9bd31f478a2fd83feb1e14f2bf48084a133f4bc404b9c8bfff24fa405c857482e5f2e36f8b9e4b1150edc2f772392cfe3f386bbfedf803f1a31bf65765d89a1e15993b2cf56527f25f3a81fd6b474106a1fde938603fe592df79b835b67225c093b203fab507a5996a53fe1a015799d209e77a967b300aa534641c3c049b4e5c8ee483c5f6893065c9188c0235de14dbc1b89902f38f72808ca52e17c85370015c149745793a058863bacf14619df43dbcefa407831fdf21216ab3946853b559f83563324a4452657e8a7865b985442dd6c972bd2f99b226db820cd18373488a9a7f24e374c216c41f9295b0f707d1e65e255cdb0e9bd45ac2553e822f49fb50052b52f6e7ebba45adeb34ce38b546d56825930155b14d72ac5d3696e0adc7eb4b9bc2ab278231956ee6dacf2becc09a77859c3011c9b4a5719290abd1d7434ce37a3e4cf627d616f19ae5bb466ecdb02097b450ede4b38bd2bcd5deed6764a51753f36b3939cd2605a40d12b85ab289bd2643173459c01eae6f46bbfb4972045211d582227a23932484419179053b1056eb02706129d18907b1bfd6d5fd15ca7577aed77d7a019ea16344d2d50dd0f2b5e51e03b994898df1108344c9afb6c59065ff33bd761f2fecfefe0fb2c7ce37914a782299ec50aa91be0388896ab0ff08535fe1f9c7838aab2ea5215f50ae0b74cf004b2778b7932ab137c232e1eb4c30ce3a173b1fb90c6d0da71e614802e79f949b6f941f2addfc02cbefec932140c9e34e4c4a059a7fd008a911c5af3c4dc3eaf400172f0d9f022635b9fa5e184561a742f73727222284416592d65c905183cdf07cf0c9890e8dfa952a02cae307a25dc4944d5d6215ae43f4cd6d8ffcf2877829a58496eeb3de047aeb20bbe444686fdb47be2176313fcf7d47740d3dfe463faaedc01a783c232cfd11f11836bd1358c8af08ed3251eb4c070bd21469d0e5fa584ea69ed94f92789566d09d56817251699c9e7ac4ab5274585eda22a39a384ab285bb36ff8e64bd3d9abdecd8b353f69ffd20f3366353d33e3d28b9b7413a608b43394afae3c7b6eaae773906fb285df33132bb1a64cc991bd0705dc3e76c8fdcad78d7ddde0d96d0a27084c914b71aace7ef58869b8dd1ce47440ebdf4d15a6a9e0f64cb7c0c9fc6223fc9ca7c2f01dad07c75eae0e942aec78e7189f9c4390be54c123ec91ff0e81309014ccf0367bd0192e2a8563a324e2fac01c8057a676942144cddad4a54180623034fb771fadc3075ea8190a4a9e094e96a794e0e06c419cf326d66bfaed6698bb52c014e3752b4811a652907d1b8e416d2ed3d4c5a1e781f9dbc30ae31948567d826e400f8add09595994ebd13cee926b8dadaeda306178bad4fe4cb128377aeedd766d4151439fe16345f2c2ffce350dab48e59ea854916723081e4a7ec50e15a684591ccff91a2a7f5468271c20815abfa4ae21e74989ac57fe1a24d3d53222f40d384d90632888b008662903eb0e43b590a83082c24e81c6d6dba2cfb06d5322b0f2c5be8a9816cf4dd2c388176a04f52fcfa2597d1c4892ec75a66b66cb779adf6dcc63f95e37618079ed0b409c89ecfe27bf7b7cecafc58b81c3f52ae9f6ac65801be66b961f08c2ff9e06ae543163a3ede2089c1242fd77abce5a80f8f25ca53bbe32adbeb1fa7708d93d9cb546d64b9b17dba4d2369212aa672a25a03e6a58a7e25dfe1d24ae12e935d37dc1d0783556a5f577b3f2a96df2f7e4253d873eb67a63d7871a08173516165d4e2a1629c887a096d04a31a23ab7c2e64c88eb58e057f9f288bc01c7f5f27052a7bc8862fc61b4c400dbbbf9ce7ed173faebd05626bbf0fad1a0a7262a1fab65b66d6dcf8436eae896e821b1d250905b02bf081557b341395d158d128c7628d28650e6775831aa0b483d33453444143e71624977fd09093846739880bbc11c6edeb82a5520db762f7f3fea8f50c1824e2f62880a91d02237e894b8fac953138cf162511b3659f6b7a63ce7f3a0e32e336b0e00addcd1d7ac998a4535ecdf09123336455fa4b506aa970a7bcd76e3202e1c8d2abf9b404bf3a2dce36562a680674f54e3f1deea982c1bff9b985f993870cb3537dab515ba7d449e3d14845333d657dbe9e2ce1f0800ea61c365e7d14cac5926d20ab49e7f2603928080b028d8db50ac137800484805e349a14fd75fde8654af5b1e77ff61eddd758006335604b140805b2d1fa4b8aa3038dc3759e070f9909bd546732ad4257f64a96b1d11de08dd7ace4c7dae2558b3502d69f43ab75ba87c4cedaa71794ea805da0ac77eee6081d28f4dad1681f941d2fcbbaad4f85cf9acca0db3835729bac2e49b12a46a391f87eb12f8168f674edff1dd7bbb171ce100d31f897c43faf45ef42db12e485dfea49b0ca47158dc7a1fefd5adece36a28169e2b99096263ad302a7888c25e67bb695035c3304a31437c72d6687c71671f4937a3ac9b11b3b85b348298a3498c84491b0606bdacf1afc9339373006bb36e8efb4ea3bf53491f4df67e5092564bb6e42a044bd2470ee4695c05bbbc10a76e91cc89004263b25bed8ba2990562e63971f158d51fbf3434fe6cadf8e01cd38ccb2febe0322d4010223dd0817f1f6b12ecbceaa9804848b1795eed604d5c216c25fbffd4e97ecc1aae93892eefa33bd62deaed805c777904acb18351c41c1d60baafb541b454668a05bdf21b1eb5d41b9dd2f6f6fd5ef4d5266eeaf2867621fe91d7b0276c4db0784e7b3a1c1aced8bfc496412f0b7a78899332a84c95037ef643b63038c82d122e6e8458ff268ce03d9457da938124d3250b74e28a3318e19652668c6682dc5414cd0ab3114ef5554d3b7bbf6110a554f691d10bca0f502c2968eeae8b3d22a08b4fa0e984c3a2d41ff1f6fc15f8a8e2a25ec0e4c9a341d4aae5d6e0c6276876cb4fa1ee4ca02014fb97785804c5e815d7efc1acdb1e40471d734a1d07df6da55c9ce5d56b4ddaee573a16e6d62d47e3b2c1a51112f55f413713f31aa44468556c29b6c11812f63850575f387b883766446cdce55786c78197291aac637b19852633d0f2f7237b7d88c8fe5e318ebbf39f73fbf138f79f1ba5a70c740bfcc8b7d50ae2cd10c14211bdc6a4294829f214baeace35029b95b1c704648b2e1223fca730a81a3343c0c825e8f55b7b04b16e194bfaf1f1599affbc1de70216fe0f1101b723d0193f874cbea86dc2ab90246b540b2833372ddb7ae2cd0b950c701e067356e584fc918480f037c1a4828e85e6abf9566b012c006ee15069ff6f361e130a878da86e2aaed3fa5c1c4aba6684ee5d513ce9d4ea530aa0affa6424176b977037057144c79277647d34847e7d07eccfd4f61872e3c20016d08e46bc6e105c2d15d099a909b4b0eb257484e9b86127a21dbb5eab4bac8544f60ef62ec3883396cc4967e9749a045e1d75bb9a16259ba9cb3724b46477ddec1bbb430bc8cbb68afd7dbb7551c54bc77a726f3269fa8a4d6f9efa822eccdb47403d1ecd09c92a5b3922e86495cea03443285e8c852342807c86a75e819882ea2fd2fec85e1ae04351a7c495f1779d7dc2a4123da9a2e25a0ce600edccdcc280dbbd8d3169b7e2a24652023912b84da0545bcab4c1cd90235f0fd173e4e3649e4077653372c3de7557c3036712cf736136bf76cd53e962ae4d58fba71a38e404761c0f4526903adfbbdd9ed49f66902149f2ccea75d7004c9d7b0368fc626d0c618a18e3901481831fbdeed2b05a2fe324fe3a144acabf143411522f8f6e18b9bcf8e5bb40930b9d337479326a5fb4bcbf7f36f75b6f7c1c4676beb38d47a31992b4c33286b8e33cc43c7ae5ca6694894b6f3da2c26870928bd8bc06a18c7c9b8539157dfd75d3c825455e6ce91c6666e957f8214675b08521842b85a7a1c20cea6ad2272bd24a624565264f03be1e933ce411c1ed39a8c43b5be832eca7e4c4e60bf67bf70b354c3efb386c36b75f4fea31e604ca8bf7e06ed16ac9f62d851427848396e75d737372738b3c65786e9f4865d0e845b26996a8d3482c4ca68f3fea33fc628ed60f0f266cf5b1b8dbec690cc9b4821601fa3c7888db8219ebfba312043c2f29648d0af08da21bd36d8cc2d5821d5db288ea6e2cdae52f9c0fb9819b60b77d10b0017b26ce4e1953b10c66d53f550aa9ed190c8499e1497823b35b6d2aebc19081f8f27e0f7c6598818c9c150960e2c38b1befcdb7d6703bdf0d0ce1a808d55ea680f5f73d8e916023440431884802ccc7084a8ea66cca10075f759d3e5e381bdef9ff59d16a05d2429c4892d158cf9610d97dd15a088e597bb4bc45a582172837163dec0ea540f6df76c74356e1c39d47f850031471e25b1462bfa2692c0d646ef25d8a905129d314953afb16906191829e688f4a00e77961afaf0fe57c6f60501734ecb67bc185058ac831806098c12c34994127f4ac0222542943d4fc412aec104897198478664540c3a2be7b366cf6755221ce4bb068f16f0e01198f340f2cbbc28f7c576d2ea81314f6aaa732c9be9ff77a6391e2ca35b98c3dbf6046fc03aa323f4ece904131e22a1e551bf85e0a3388aeffdfb92d5b177d67742a534346e2b42c85daa45be3d23e4aa78a0455376ab0ab22783a5ada30c67e220edb2b7902714bf7e3dea0ef2b3fe3e2e8e4c906bec5698eefc3ec3c96ecf0c3774bc7177cd645a0c8c91bfa8683c9953e708647a82561d599bad6e79d5fdb673dad1af2ecfd8588a2d41216732a30af2181cdb3aee0c42b8d2239aeabfced25264adfe40e083ea70f18b748fa9bbdcedc03e1d0d9a6a29f640ca5b0f43c3af4837cee5bbabe31ff15c12fd77ea6f73d0e29675e199c43ec12fe8a281c9af84c06b96c526c04694f774031f102e60824669d104c43cc73627b32b90bab77a86c37c153887a4f02d412a82e704a6cf2a5ce5047425d720f8fe505b70c3e3827ef507eddce3f6260b26169af0c34a9bdcc2d08a789606d727b5ca792a29d9fd185e22eba5a6b4ad114980468f048d72764d5b0bc30753cad5bd3b65d19b9667282d3d5a54125f8b72d8733d759edac8e5b3878dff613829fb387f9a1cae9a7383ef33af04f9729c13bf59ff6962dbb4ef1d8885deecb08480a03f292a9667ec34b4b9359a8ef079b5dd937d948ce72780e0261c42b321d6e28b02bfe1a11b53fbe942cd2be607b7fca9b45f59f32cac236335fcb0691e633d745315edb50b0d60d2e1c57c2922ae2da21581a920e26d32594a96af466ff10e12e4c54411d94bb0a1a796a2144a1ac44ddecc926bc23a54aa12537041425bc42f5997c8ccb5e7e8f3ced68bf4d93a55e37d94c1f8e1519cb186a6bdf4f5a11515b8dfecbea5f5645d5f965d943280722bb4fb43b44d80388b20d24e8c30eca10cea030197a8a08f427e3930fd9e133a64f4f028b39498046d332a388da9dec4945902f451a3b62911330ee3e48631a977eaab62c19cb62c45e8db51f41fdc63c2ddc993eb4aab5eb000e3e14b4e0f62a3851d927b4d3c8fba0b4bb5eea9ac3e3774251d8a27e40929d4584436f629af3cc1ebd969e67c7a2ad97b47d209e22056d8b50696a5977b4577a3282a21103afb7a11e6a0570602aa88f8be685aae5743e900ff935fd8e1c124d40578a4f2919ff33af9184fe91c0b12d3352c4e961ef438308f8a3085793310a4a32e56d92e508eac8413644de29381915e5795edd24117103699b05d30010e8400f509c19d961760f7101822babff2b7165bf58f4f50ccde370f7002d8b729f7f4d04e0026bba6da3d99b3e2d457ba2fbb1e8b8be2919df10ae21bc3e0939876206ed43a433407fccefb1c24c175b3d242e879365c73e7473dcd0f73d3f33d168f22403bee234ffd3cb5a4a58a86df82d2104f568bb7ce48b62b0a8dc72c41e7e386ed3fd1e9c7bf17452920e4d9450be31c48b23ca39d3d1eebcef85f9665131f744160133fd95f7713e6adad5362931715c6628d0b3f5adab3c993219fc5e53f717eef55de01d499292ebd7ee3e232683a0fffd1f5cefd455b561fda31de7eb9516a74e2d205866183a7859fb017bc0a3f7075cd3a3d1ecf4e0692c3b08c42066bacb53b92360a503582d3962d137b0443eccf7baabaedccb5c1d297fa5228520b3f1735813854cc40582999c34835b51b4ac8591420bdc5bd5fd68c4fbc07fbe9bd6ebdf072cfdb74419ed7ee2e9b80ee5a8e7eb28ed7e4566de7753fed365e67d95c29d7499f15e8502ffc3873fff803bad9b7b57dd5e2f7734e912a54a928cfd29abb5885aa2cc72b78fe2afcbd9f75386b150fc98ce8f70de5166be2b052077d5b5a3db307f0a8e54dda003537bb101063b57a36a9cd23085c338a16f24162f79ca6d0a0354b684c5abf9fdc852d9273ea863c2ca902b0cdb0a3ecfd8d1d10dd3baa924cb49f1fe39f1794ec03c3905570711bb7c6c5e151b0ee2c12892d4280b78fcdbb41a02364902d8096100fcc32114e953085804fa03383fe96a2dbc64410c2aeb3e91eedc54fab9c9e892bd39fd0d8d9a3c78eb2a7a0d6ebb36b3ea697c56e2f6c2490e6171dc64851123343340b35ec120fde5cae1fae3a6a0c0fab55c3c57ffc26ba8bc1af5d0dc60a66af06a71cc238d9644a16d1f417074f9fb8371c265f29ceda1a56a801cf2902124a0861437ca90c61d09246993c8a0ff60e9009652bdcd090644b03a2639948ce40e42b4dd1115f11c4b850d0da2f7b21c1464ca4c55dbf6a450fe712cb292ab15796e83301f41e59dbc6c62352f07b381a52c03f1bfd4c28e14fbde78ee5250842627464cc1cb1eae6a4f69828b720cae2bc382f69e9ea05868bf94293b16421c7504ac2686e7142635abd4c0a187d209575a8b27e182b627e857243db3e016315972a896231231c6f3de011c96be9c307c39a0387bc899d111f06aec9970c42a4bf054938ca79e103913c616dcd51568f3940cfd406c0e0e9812b46946fd537a3307347da1e4024a2465f8936befe9fe853c986b6bfb492f6f4aa2fc6a2910b86f411296b842e3fa3422c367a715cee126690ed86d3653142f181d03affb808659a5e7331385c27513ca38b37d98dbd27d18a05c91365d8d06a83119422044d6a6fdbd8cc275d63f8cf873051e3ae81c0d468f2472293680d63b27f6e2b982507ef9f0b679aaad0da59f485c71219a9bb3dbbd616f3dd49a45cd6e855420505296570b7322bb3b7857a93e1cd4bd689fd6a2d34d3f2f6d0e763ad195c2eb9ce08081b14b9e3633972ddd2e76f85861bb8d240835ddfde4c6957bff7370bad72f11723bd39941cf253c14907712d71ddfb1a3fe897a517e17e774e963c1c99789094a4299c0189b77117310343d4369dfe7801a4f3397a436cc64029474186c57c822d217c547cbcb4f6837a128bb8a3f7139aa5d179d5520a9776cf1ab93ac89d4453cbaa76c74998883ba8c51b47e7db9b69190ef4219cfc7deaa46c51f8856be25d38435d31b90464e858b7e03351b1f02217dc5e06a18c23c3a4aae45ebd829de62b26fdc2125943fcea4d30ff927b959a31901c704039d03af87a3efeff821fc384c165d630c63511a29f2373918d23910f856b0c7f2e634a23ac3895fc6a12562244638df7c62d4a240b7e625e5647bd1d64fff9952bbfe12611c84a85ebe1705c6db0730a8e549c1a29e0e6a79e950dd10caacbfeff416356ce45a0a0b55c0fcef68c6b5ee059a9a422b172173404a1a4c4345d71759529c5c980458254bbd34a4c7520a6ebdb2c9a5517d57180535180982c7da97000a942f10d61e29eb932ec3937a5fa1fe7363aaffcef84da34e0078494020c3e4c12c78c832fcf0c506144751c1aa540ac1d9079f33c9c6fa37d887e476c354718d884065cccc22c8a2217c5e083bd9c647249473a8ce212b128b86841e0424c9fe8482c0c0fad8ac30614576fdb051ebf19e2ad34dc509487003bcbcee2ff76dd280317ea22eb7c40a65a4910164de1e480564b735d17e21fa5e205b0986fb401e0e037be5de8c69ba4fe4e1feb2444ad0a2dab532058b31afb81a07f5bd6b4297e14231488cf70f3de005654a684004af016c14b398419617078e6a0415ec4c05a341e0022422fc63340655fbcf3d7fd201e5dbf8f1eca3fd409d14dc14eeaf1a97d88f1b0a34c3d82e41942b9772857f99994cdaa9392c1fd1a0688761b245af16dc0b0acd01d7105f940a70b7218b8b1b67d8bfd1ec7d2f50852dbac97f4832d817a4817255f6308c98616db92b105091a3b9fc2d9a0161a8ec9d50a8970b10dd6b0eb92701888f050cf0777db483963bf118bdd4f8f00c911e0fb967ffcee4b175304a65e7f31f1f8cc82e624324ecd04851bddfc0181b7722a9a29e2ee90c0c596b88eb4d50cde915e0edb40fecd2d6adbec87de566456f5a98e2333eb8e9d7e0b10dee51ea3a6fd285138d716bb262eb736479bbb8b1b65b812a60ac3310ec8a9d88ba5181bef810cc7e91c018059828699da3d7f7874d3e5af478e8bf198676722afd81c8120faf17740af0902576097c2cd280110f28014e76e7450be899835d123a34a941055f32c81d3b4cda3e0bc14b3475331d21128799ffe9fe582747031b78d00cba657af26915dc8bfec97829f19a08fd224fcc59d5f670848be7073a6676896ee307c6135153f42e159b8e64a34c2f343264aeb46be102d632ce17e262c0a2b6f8f5b2264c5f685fc235a879f98076fa3cf259b286796e507c0a85881199b9acaee8224b4c2de04a229200224a2841561ddf13d35e8b4dd43b8622068815502274b00d579db863f3f809f27d6693191b70a11e4479caeed8bb84504a06d1ebba9a8485630e852ba5f7e8e966689f15b51b003074ff662538193519357a53d7c9de2715f20b62df0762390a5255bc99049d852a0585533f3fccc908bbb56323de50120a32e75746899915e4298a3eeffcc81da3e577cba4c0334c48051c43032a5cca7c5e300cd29a0e4b1172ce70a7d28adea8a89898351f71d200f689174e1cfca2df0d26b82c280e4ffc1d5dab5f0ae0d661281b38ccdcd7f74b35eeea905bec192f916513931a2843bd4ea6b1be091b706079eb2624a4edbdb7945b4a29a59401c4077007b107ac2f43a8be1f0441281b12896f2f52dfff3b78b739ced2f683563328fc3da68b40bb08349cb5a866cf7efe240453c91d5655723f1d43aa1655df9f0026781952856fd5f78356b676e2f78357f5e7e6f7836aea4fecf783fb4136f587ff96cd686e46d5cce85525cf40695d3fa8f283eafbbdb1deccc8990ad8cc871abd66af17660f50496d32f043d6bb9e83a38cf55e25bfe7b35949d7b7fe078997f62ae788973377d5f7a4b1fe4a647df97d93b5ce4a7a95c1cbc68f8ce8588b627d56a9d9c3fa1a52600ec1b034d628637d38ca38eaa52c7cd7585adb076aaeb3be352b6d8f4e59a32c1c39c01d7c709c95fcc6d265d5e97ba38515dd19bccea0e4e827222ce41788f8d0716f9f53446e48a19fb7f7de9f67dd9d7867f77aecba518ff8da592b943927ad47984c364fbaec3873b5650c8ec98c15accae038c146921fd480550110728181961e4c4e49141982081840b083d40c4c9290e1614d9427f1abc16628f45b62e58420688ed071631a2254a2eaea0f326e3fd08842a105dc95104a192e4a3b9e7ed000d252e204395f9315256c803923f2dcd27d34c8804081062d4a43940441a1068d204ebe0889c244070f5a98a28c4c40c404f45b42a48409e685363228e191e5cb9a23c0305d478b76ae8cee7cccfc4d9f532e74c969f16c5b6ea0924311294cd43092440c34d8ce14e9f0a10a8f25723fb4ec9316224e9f532ee06ae8bad8e04293387738153917f94e9f532e2475569f532ed4e0974a56223e95904606282fb6265838a93212a6860a3768513244f47c54515500c812391e369248f181028d10358e9880bbb19005f79099ac30c1a29f8c8ed43253c02a45567607fab940bf5b9fe1048815486982ca94344f4325ef754ab98042995eff8f7a758146873d897921cc982c5ec20c554ddd96d831df49e3389428f5546495cf9c38077438e78e2e59db4307a14628d2bdf78eb89edf013d84fc9dcdf776f77e972f3969f331c673ce2962ab75f79646ebd601f6f83eba64e79972aaf131d2dd7718638c31c6f9d225101c4b12a448e0f2657cf3ef8c2fcef83e257bfea0df89bb8cef1de9d08c4d42ad79856ff2502334086dea734a012119916c5e8d788607a1b914591aa740573e5664d553f53929d49c57b6a55bc5d12512b87c7fab0101f9f890e43f52c724a8e9d685888bea7846531645ce279453f742f59fa43753af8247ac261a60095a72e8a0e4462537d12404c286204bbe317cf7c945892b59053a0acf7d4edd96aef017b6949b100f08dea5d1686e36402d3713e02594d03144054b43a0c051d0ad991a4265049863078eed43eacb8102924e82f292c8d1e5f6191bd9c74d4f01c13f3aa81b443f8a7045781001b1c2e183a8c7158e221c4449493943b8dac440452447b5e3d34265020d2f49a48007272f637286984131d8cb15829fb775571f5f4b2709b4b6d2586cbb10e77b31c658e7dbe57cadddbbe2ee929a243d7bf52535497ad786fb929a243d8ca3021ffcca02f0ec3c0fed628c43ec61bcf1b5fa7a17dfdbe9d77acc2449e26bc94b6a2f939a24bd0c8644f8c318939aecbc0ea7c2d7d447a87dc2becfc6602febaabcb66aadb556560856f1f3ead6b5d65aebe862ac19d76b816ca562adf586652b0194a0d5de18bef66218ceafdcb93aae3516da37509bb55d425052ddfbc20f04c1f0c3d7862c0f5fcb6aed16d7dcd5b95ed9058b234e35bf16bf60185f0b8bddd88d15e2f8efdbc70961dcc559dccd0d4e857a11ebc78d38210cfb6b314e0ecdb911e73fe71687c3e16e84aa7a92a8b58a70fb08b8cf9873da39e7adb55a6bed8a7baf0a4a29a794d24b73ad3e64497badb5fb8e7cf3567ba7d6dafb2ccbf5f262a0eec290c8be0e37a0f686cf39e79cf325c6b6b6d6da6bafbdc9b95d7e127459e7efbad1034b9b7fb342852567cf7c8cefbdd75ef1c43de1737d449bae36576bedbd16cf5aefb4b693ea74a73b9df1add25dc6f716830f2191fe0fc49dfeca7597f1bd75da52db69d108185777f6d6e94e677cab7497f1bde19b3b8d6faeba18df7cd31dbeb74e773ae35ba5bb8cefed09d5b7dabbb7d781f04147c3d29c61d6bcf74618256dd22b8c1757dff78178efbd370882e1d5b7241856d39bbe6118b2ac101010d0bcb2390c35a8bdfb15b5bead2cc055c62c2812bda0760f831e91ff9922c1d4565f7730e811654191405de1aee851eb7e8bd3cfa7564c6d30e8059ea64dd40906654191cc0bea43511b9d61f654bab4d4e98cafad9a6e29d81137f8d4101cb6c76b03bcc75a83e0016b2db6f63d60ada5faf6ec2d0dc845c697c78857295aaf0f8e9bc2c1e4556d42a6e816905a00424f0d81e2e55a10a27f54575a0092ab08c1a26f8d011d0ba911240b4700552f77ba0860450ba932dd4ead90d4ed932c14d1edfb04d1a1c20a9d7b26f86a0334edd6ceaafb0190900b6b497e05b0042f815a581bc571ba041df491dcd8efeb1c40f4fbf7682aa9a9df0b046562e92508044a37001033449703f5a07fbdcba382a2d0cb15d78a374315bd9c6cba05dd5edaa3a446faa54bfdfe2c6953bff4c98ea27effbee6e293738ac709fd3e90900b0f7aece8f73f00814abfef011851fdfe0876f850e4e5c8860d47bf4f936e3dd428f980622ad2ef9cfa81a6e3b45ce1517afdcaa528e42974247d6c3e5ba3ff3e404fe670fff362fd5aadf5e7da00fdf36b2d6a03f66f58bf9fb3f732b21d29d59fdf027ab4340b78e38fdcd26e8c2fdc4507452358c2e9dfc7fbd2a37b73aebac818ca04bc9cb992e77ee82af5473647ebd4efb3fa7d5a84e7b74cb7dbd7e0763bbe8ae8bdb8a85f8c54c98b6d95bcf7666917060553c949ab2a3961807b16c2fceebf193e0957bdda906896328ebaac7efe590878fc40cd751c12cd51565f365e76b97e8d2a798ffadc473d92b4ad923727099f6da38d54c9fb096082db2fa955ee6efdd69af0faf6eaeb7a743dfa5502bf216d53ba373595bc353755f266a7cc64ebf75748e1e536eaf782e3bd6d239cd4ef5f5c8c18ae7ffd7ce170aee7afe9646bb217ad07bff5e0cf77cdf8ec6bcd580fce0767b2f0c1d1893547d9f78db2e9cd4a5c85affa6502af7aa9711f90cdcf3fcae6c801eed3d662cc18a24333ac52b347d6fdee46991d39c02eab4ac61cd0ef04eaf7d69167f61080077e6ff5a7ac4d46ae92adcd7aef5bfdd51beba19b55a9d9a34799fedd7dce9ff1b6e97aa3c437794a166ebe623fdf65e5ba72a971e55c6cea8fecfbf92a7abd30833cef7b9c68ef6f91f774c6454bf3be278abf2701325461a628f5903264c89b714313406e599ae030c568c84b63e68713362c0049e16a08031a5233dc564084106686bc7f194d8df4eaf10ad2a7913effa5d4a7b5b234efef113896fa1b2f9ac9e24333f391ade5f73e4bcda0efbdcf5a6610eddee71eee950da2d6e690f7b7aafee8eedd7c6854d0bd6c3bd3bd4bd5bdbf4cb6f65d75539305ebd651d59ff0bdefc0d41fd67baef7bee33283c0f7fe8a50dcbb72eabc748f8fa5c8c1e45cf73e6f9935cfe68de95e36737573ddbbdd9badcd213117f15cf7bcf2ced8e3bc056e3e679491f3378f33ca40f222e76f5e06cec7fe6626a39f436f9efecdcde78c3172fee663e0dcc4f28d09676b37494a4e194aecb119b734d8ac0e692b5b8b8df7c8d22ccdaa7b9f54f7622f543f0b42b0ff1b35b0fd7bcf666b61ced2bcd79a73d68db2087bd00bbc67ddca0da6fe54d95aec4126d006dabed6ec7b584c1785395b63b182505b04daac2eb261ce86391be6ba67dbb9eefde71de9db57f581a9245525bfa9cf4b0be0f871993d9efd7217eda25dc4bab182b4de1339a52dca0ad2bde91975efef91ad7939b1a87bb0191d72cdbc234bf39e35f38c2ae97d38f38a2ae93d38db6c668ff7610fca6233312ff0dedb6dba17f6e8deb7c2a4ee3d68b335d66dd2bc1745ce270bb475af0499baf7b1d95765695e4eeb9baded9ba579aff5cdfb9fc24bd6ad7befb129fa8aea4fb96f5ecefbcfa8d660effd87546b0f9b01bd66af39dd45dd0b595f90eedda3ee1dd9da576569de7bbf6f9e51fd69bdc7675e6ef678adf1035349afe5f5a8a4e72555d2fbd6e8d9bc5cf73e014cf0d2b375efbf0afead7b544da71fd2ab339dbe2eb25a735ed4bd9fb5c81b4360e16439bec9531280a983fff1d7afcfdd7c8db60ec67a74f0a6a883ffdd2055f2c65649f0856aecc6801570ef3fad533891a50882b5144e9506feec29a2668f15d75fd26c201d65f5f97b6389c3d4c1c761aa24f8a38c8f1ce0ce9fa338eae0e33489fd666bdd835fd26c1d3ceafb614ab6063ba2f595eb7b2c1f76646b30a5b1e49ac38e3af87384dd2c0d1c1a82cffe95b05b079f1433c9aa19444b92880e7e49a6e960492ad1c14f51557ff6839fc2aafef0079f749a41b6832982e8608a331d4c71d5c177cd7425f5f34f41656bb25949f0e9500c3a047e4f541579656b0568e284440e26104121cd10f864ced684b054e5586386c90f1686c027abc027adc04fe1d41a4bad5963c9793896299c3af893071c432000539f02d051b00dcca08a671e6dee1e51599a47d5f7d3ee3deee12c6d2c3f5073bdce5a0f5606ace16025f733800da7dde5fa594917f8b8875f47193872807b38ce6f795495aa97dcaaeff770b666bdb1e41eae5ba85e7eb754b6667319378358bf3f4f9941b4efcf546650fdfd38676bf6371da9fafe5cb4a6972c2840f4fd57cad6f4d0de7fc1cc20fafb2fced6f06fa8beffde6cade5646956260b108a7650f527e7f77751f547fcfd9d94adc97e7ff73483707e0e894e9cc949a9ef1cfafeb2c3a1eff7c69acb5566edd33af02df9871c0bd7f763aa2b5ef19d34d3793c3bf1940273685a40e7317e19275ee72d806564f0f5eb3c1e65a0cebfd0af33cac017dd9ff8ee4f8c3210ff0b9dc7630c24e0c738f13a0f8e2f707efc3386e88c8296067e9e694b035f07fc13b36969f9084cade97cd22d2b31f59d9dfaceb6be5f482f23366abace97ae337dbb82e85b86ce9f78f02bd3ce83ff511a1289cf9dfae64f7d972d2a9b7351d99acec8d5d4fae53dd219d954f5fdd365e4a2b257610670fe9ddf61eae0cff0850efe137f62045b54f6448b5a80f3330c8106f3f5ac5103fb72a22c5c5ce805fb5daf2a5be35a7b571fd4cbc9d65e2f30f482fda2685f4ef6e5645f4e3da47ad97819e2fafeefb392cd388e3fe14e95e435f026613e2b9c9137cd1e2de09720d4abea0586f5afaa57551f4b34bdbec0f4cdfa194a8551f5877e0da3fa6e5159dabeea2d2a18745e360ba52c6dbf380ba32ab93f67164255723fce2c7471a12c422bf382fd3bc4a16f1797be5d547d3f97b2b557d5a4ed1745cea57a4875d5f707d1cb1655ce0d7ee2b3b235d0cad2f66bcdb955dfff5378d97a55f5fd2d305055f5677f8baafe4c1e928efafe5610ad33a518e2f6874da193ade93c97eafba70db7a007cc9e6944af0f13c2c12c68d2afaf48357f4d5e7c7382a453ea040910bca109d71330ac2852587508294737529008a728699b3bc2b2b937c8cd97d748a73f2fd3954e3f4a719ed21c4aa7aaa4d0298b52f129d5a1f475d19153a7392a5abacedffaf3d3755e0c8974c4cf0989c49c363de77142a21c9cbf0989706ea630f59b8f8544373af6b09028761500b30253d161b0e7493aecc5311d862b6106412545088b285970910bf630d6c3bf2114293d8c02e4491991667992c32526cc099a30e27b6f9ebef7f32d7dbf78c3920d337c376583097ad7e99c9d3ce9584771e9e9254fb74daa9c96bafd7752d4e40424be751d8ae344f3a757e4e2cc51240d135b901d47e0987182910e48669c683861ccd07d524837d1ef036d315281e76251c353af4c7ef45a9938f5dac4470d347af5e1d124a5dfbff7022da14149bf4d27f4fb2c0e82239a54787265873336a830fd804223446a8729e4646a099c3476001b38bba3a4ca12157a9d5a5244af3400e9f5c3af437449e12608a45e17254e98c6f4fa1f4fe2a5ef245933430ffd3e678aa1dfff412509524f1227fd5e114b55a843228b05c91412a45ebfe39a6b90e7250c2464fef4327684887e976af4fb571ce1c9aa85a8226e8092e201252a2f446e48a14b1821271e6c7c42b1dbed11252b29685d06c8600667ead37b4f0b8620186a5beb3ebffefdb3fbfc2fbacf5aff1e6f49fad45ced1e45dbd997e17db73fff8bfd79ccaf6574367c915f8f77e7efbecae8bfa555115ee8df4f813924c6e076c650f97a28537a2bd6e1d3f567ead933a7d4b523797d36f020cc9ef9289038fd0f2a59a7c5511fd49fefe7833083f673cd6728264def28800390b6663793a69f35d3f7a762dd637377430e5a2834d0319e372168ed6109d8be759751d820f1bd95d69a858828e8c8342973311072d101ee734a09d785117f278c103160c995a025051c88d4b082448495a321301656137c62c792238cbe38b190d4820f1d3c20cdd0840d0f4da0d94fc29be4a98d0ada8bb63c86b09f28bea8c4d44b51ea4b522565390ce749bbcbbf2825a522945ce07656e9f9a484e39b5252c18a8b5ca9a89764962b4d4ee8ae30b1815b4cc14044fffa9c8221cc92aaa6923747af906cf4a8d4fd4ae1b22eabbf5f66699d5504b3f68d14a9d2eefd929ad0efb8a6df7f1edceb22dc3ad3b3e7d2ab2b9a2603968f3fba3deaf3e02d4d9164f869ee9bc9f0e801bd1afa5e96f76cefefbd3186f7dfc7d0bf7f86ede8ebb1bff59eb5fa9bd298b4cbdbf4bbf1284225d345a8bd86a16966cfed75a45716ca0049701b659f7e3cf5ab91d8aeebf467acbbaeebbaaed3f9f72c040168d3a689bea37a39a3a977bf4710cca8de3d3db5e85df7e50a9edeedf4aeb32a664dc5a4cddafcee27cd33fc5f37ee0ce89393ec3eef999ea4ed5ac892a38a7c3be6a9647d71ea2bdfe4e140adcdda678d5a2dd4670174c55802d19fb785d08a1f1ca853a119943b7d0c98ea122e46a8b56e02574cbfefc10ce2fdfa70699776efcf4b3798b47baf8bd973ed88410b289cc7ea8f9d14d7a700ec9a0fffa545fd1ecd201a33a83efe7b35a04745dc0373a8e4fcde7bd9c4c8b72808d5db0777776b9be938a9cd96fa00e1a8cd7476fbb6d7a758a2be153e94fad82324db07575655b6db6b2b9d41b4b71873259582124b486942868e1cc2acd1727444d5017cdec7b57be9d3ad66cf882b29aea45066444162a306ab1f662802c7100694e48852a54a1521b20cd5f701fa4e9877bc434bf0f2f60fcf6e073388641bdc05f4fb333abe20c663ee9cb2f9720b9ec1fd39d480e6fccd9979f0ef4cad855f9faaa935d65720ea03eff5972a355269f57106c7528f4038cf28ee5bea74caa4d5c7d2ab965e7de8f57b4c71b3e71be913da448d3419a93f4a4bf8290b8bbf023d0d15c129146ec50f8ebfa438d906b43c4090a2ba224c1108b48836e131e32aaa00a6cd0c619a92b419aa06a052c39a2f429890d445b4b4162c7e16d07d15b9d4188daa3f5235e32f359ed9cf21510bfac49a851fc555b20aad78e29ec5185b10638c31b5ffcd424042ff7a161a812a490710032f817a15fafa2dc00b8233aa97e0475612acb41cab5bafa02cea4f8e401ec94ad6c72d1b38970e2ae91ac2edcf4a7bfdc08cea7814bab31695c451a9fa940af7555898a9e273f6a9b4fcb409cc03cc58cf394f313e2c604ace4b702a96ddceeb0c5c2bb32ff2e0b03e6710aed5a2f9f4e3f76c089602f6f72c04fbb86abdf7defaf7d8e19fc0b4346b67ddd7ce23caee18dbf1c1c9f15718e1f3cba7c265ff74fe30e1f39dbec953d270fdfb4f83e058d4ab51afb1ab5e636c2a598b2a596dbd9638b75e7fc88aeb126683d9aa54aff5edc3926ced95b3b4faf7ebcc8e258ca97ffffd2b676bb0244bfbfee3db7be5fa67b3b4affb1266ebdfa750b25a739e42a97f0358ea5f492a759a0cdfef0877eddecac2ce124104b4dbd75a145f14cb8903e1844eff86f6d1e94b48a7ff329a3df4eb91a5754250f7a332fbb3cb38eaf9cb6aeb5d37caecdf3c967694dd9103dc6d51d33779ca0d63efbd4b6d71f72dd47dcba42d6d66dbe46499ec979649db7452ae35e1b23a7a00e6910da5b4247dac2c932b5749fa202545f2dfd2b8a5cdd1a5864b81502e5ca7617562ea34bf65aa358a029375aa3f4fb7dfb7602e1135bdb44ffaf5a68ad4e8a5852292825e5a2efdde4b874a6bd5efdb3c3353fdb99f9beacff5c1f6b6698a488fdefb881ecf0cc224bdf46252931ebd98d424e9e1cff729fd281e6fbe95a4176bb292dec4f88e16187d8fc16a3178473d29cdf2cd9ff3739f636bf650224a3710e1f61170b73fdf67ce49de7b2968679e7169ae622fce9df6aac5b9d3bbd67bb37d3c70ceca5ac91a3e98edd5dbfb58737b1ff896652b9d20aee37ccfca179471bd179c21c6f7de7bb1bdf779e8cc9de5c163860c09f3455f7dbb8c875cdd653c64c8900e0afdae77f1c63c33486bada2ebc06e8793f4826a55f0acd8c117db4e671e152a54a850a14205c8d35129ed34d585cd0bb01878a58349695db610551d8bf5255aa8a1a349083337864a8e4311545f4c38a1c697a112c8d021dac5050480b12d1b2c1159c14a102d4f45745aa6d8cc3801ae0c9820296c71a14a842d648e78a420099b995965ca0c6bc6932455369401223584099f1523e49eff5a5a248481b557fdda99d084bac1eb773083b095291d7a22b164869c18272b8859e1a3a226cf40c1881f5d8cdc50418c113290d7c748a7dde7f6f001a4091b58c64449c272d9a15b3b8990ba51020fb829430419b2d65acbc34304032f796a0dc8c85035d27f6c0d05aea8a884a5a1fa76265485aacf0ab8d01053ba1263244b103694e1e123048d125c96a4d880e4062a3cd7cc0a246594d440e3cb94102af002440d34b4b92a5204990e071f687ebe293e158ced9ce8738a8a86973548bfb528f1a6a543402c1142093329f0c891fb705245683d34f1e0e40586a61e8488d26409187cf8408608295245e1067e2ca185082078d801f7f7c230ca7146054945b838b9519aa80107131922587821072286eebdf756fb38df7befbdf7c664697819abdda701cb0f36344e6aae38a5f9a04459c9e9009a1e44d2740162a4c4ea940815a498608997a5312b987749072633765039a172e35665052543d65a6b2b09d630c859e235d6506575a1aa424a8616be285193a609245418470e45f94c0a8418b1c4c6121e483c60e204dcfcc71a1c0b251c5992443fc1120317810c8d15ce340121a688eec618a8ebebf933a75045c1112b4bdfb50a20a288981a88b449a3c210082eec77035453b7f64bd392a2281f5bc4e03064adb516e44eb3f3e0290a0d1c8d1344a161a8e4bd7b105e546da70dbdbb72a477dd0e48aca0043246640922ca507782af761deebaaeebbafc621b5e8aa217afdb55d7aabd241cd6e7d4d38d3d657bd14b70ce041e826b2492ac39411855a6bbc273106017fef9b08190fa98e01b074f07df51b40e4e66aa28e97bf4a95204479dfaeaa8249d9354110243151f3ba2beb33ba2f9891f6c3954703a51383854895652b8b972cb6112c3f1d130e480f900f9ac00c2e56e861cbd9eae623874b8a450c1b48f0c4635b8e61ae419e0f0e249b45c6bccb038191da194a416c80a73f44d910ab7d8f0705420151dfbe9f6d5704353b9f28ed4e8aef62d8329b6a91872e85062c323674647064f38303932c01d65c96153b2729441142b14436896ad6ba1871ca18f1e50f88c701712a011fe9501a7f01c449681e3ecc0f2f194022d4fb410eeea938b96233cb4b480464b0f50082eb2e94ce03a633c2aceb7544955c16a5856a49c9820b54414fbe4424566c9376710f751814715956cb1485b3be79eeeb2b6ac6c5916143ff1b9e8e303044423802669042067cf2d75a7dece98f2d972b16aff904ebcbc59619a8b947ea4b5ac3bf254928714bfea4b2d086aad758b833196dedaa5b3b54b67a641506fedd299851ff8e9ad5d3ad46a0d825a6f97cecc636ddeb9f24e5763e0d554530d629e2ec3629deea8a7670f7d209f52a6c99dfe62ed3bb49d5e7734d5e9f42b50afbcccbdba5e1376224829e391a9b83c0ae8d34aff3248673cfdeb403afb8e8bf50fc4d7d65a2938712a386d553cbb393f002c1b5e5dc371aab5287e597b1dce18676b4951d45af7bbadd5faededbcfc81d75a6bad65d5395b97523a72dee2f691e0dc69be75b7bb0eeb9db3de2d97c7ea32f6e9403d5f4d67b5aceb85df07821e80e1c7c5d73e4056fc5a94ee3f6479a44f6b03f94ccd279fe2ad3f535f52eb16d723108ebbe8764dda3cc02449125f4be26bdf955f2f0c8391b11b6b2d50c2e90d4e0e758993b434eed3a74892a4ce12194fcffda394ce3e0bc6407df99c53df3967d7e9ed7dde07823cbc32dd672c16ab55ef38bba53c22e75b73cd820e9c7eed1068c36f2f3140c369c7000d9ffde5d25ae711637ee7b4ba75adb5165b6badcde09c736a6f7bf35a7bb79e136baae7c55aeb7bef8ded94e283219105738851205d6badb5355c458098478164adb596c750305db5bb7753248efa08b57be0cb78b64b87e6ef4ed05eabafc5214ebfad392738ebcfbde3c86a8173ce39e7c4f567bb74e853dae5997f3f7651dcc0a2ac7657c718eb50d985bd50dce03218ab9cc1afae159a6dfc37d77ec769adfdb2f1bd42f0dcd38e0fc20e37f87dbbbc2fd65adfbd71acd68d71ad1db22fde37e79c654bee1e62adfd62c1cf7b101e9c35a118d597da160e8763d1a06151d0d0b931ae942fd6da2ffbea2ee37d5170b7ee32a601801c60ba7ba83d5d543a5533042ce9667592f8e2dce9ed8512b83dff0d37b893829645bf570b20bb02013270fa4277e456cf368b87267d1d06dd7bef89db38560b9700e71647c17b1f087e1e8c2b0ebe4222fc2f18783f272579b4cb9470fa42351482792ac818f873ef3e67ed9bb51aa34228268969e505a650d5408b8593d3e58899fcd99e0f48f2ea0fbd6ee95587f02a2909060a1b5ce784cc42e1703821a1d903e515beacee883be04e48847fc782167d4527ebf379b2ce640103d70e7a109d3281099efba8348db9f434e9ccd8080000040003160020280c0a87842281408c04c2a4e90e14800e65843c78603818c9625190c3280882186408310418428021c620c3584d750004df988abeb3198a56a7683730dc5a2d97d20be5467b9e09b554ed8621f6348f0087d2b9ef1de1d411fb8f88ab9ae4b2dbff687392403201af1b9d0924df9caf1bfd1dd123ac273817ed69bb56bfd151770c7538e069dfbdb40ee2fffcd2d17202a18efefbd1a800d3ec26427c4a4a7f94a16d11f78ac161a20c2c28057df3c36ecdfdf60472a7327c77758ac1d7d597a6a0a6dba2d97831fc28d113c1e6dbff3d1ac6cc457e9f11559937edb5f3853fcc77358bc76ea3ef9e877579dc367a35e26a6e230076a7b1c142cf8148910a59a0fb27efb5a6abd77db7e3700d7263b798b7fa1c2f21bed91b48c63aff9315fdd5ba2977f2332c57a29ce13bbcb891eff506a7eb9decfa74a8d270b9819e4a145b00e6dd0ef2ca188452646807db3e074b9f9a2ced5c432fbe8ad8731a1b35927a5e06d9489c941c73046834f4577e804dd915d5b750220f581eb34a66edcba0851fd9b810e9440de6a88ce66686bf1d86c6505f7e0a73dce605284b75a3915d4c44e6f517a3752fe42916b746e35853c938024578f6585e1fd2d8f881b134e511a9ccaa7e22bfa155638d812f9c2b0b186722be88da9272aeb442ed1cc090668144fcd9f7f7ec960cef7b66cc4748e75a3156e81e291da60c0e1012501994d374274d4b40e9efb780878fa5615802cf905374cf266af2b6297c3a0a18975a3ba90923913fe8c538c6f8088784a3a6037da5e53c1bc97501f31208e285a20390e18d7b4c183845dc9a6548f932098a3f7d357407e7633920986e7a535ac8339de87168f06597c267dc7025f7c021b00c4fbf9c9e421cb199c734caebd41bb955ae452152889b267c020576dd032b163f8868a79586ae1257947ef07d1f46db9c754b050ac21463c3d246646718e0bcf7bf89d30c106b02e79dd229756c00cc2e04e06e37019f92bda8c4308f206df4e6697a9751c278f41ea84867f0bdb35021216ebd877dea825e1d0428f9909bf35b11f057946d3fd0012eaff18a0a49a3413e4b0d879bb97696b50ef0680a15f5ae6b52959bc06828a76469a040f6338943f4c8d19a6d3a8d1cc6702f1ef788bd2fd91068214e6a710ee8ae0f68e9123877155560cfe9998f3bece6f52f68333f135eb0d00391e997e15a247973cb2d184db9345e0dc0d226c7153d1b08e8f10322900d17b395159ad2e82e1ce99048c8c2bc366f22c1b099aad619982b850f90a4ddfa52c98cee43e8068e050e56aafe801b744186553b8be6043a4e3fbed0b8bb8a348bffd888aeafa846fb287bbce71a3a5c409abcb3701b6103c53e66e210a290c978211d8dd44529e0a33b3b053fde907f5bc0c8041383d9b9268ae652e7b9af226a695065996052941c43a8d234c23da498888a46c06e44202e73b02163ed971c7e89b57670d4f80aba862a041f1016dcfadcbcad253388f026ffb7dc962342a2723a4bd492c3f7ca196fb17714a459490e95f9c886c97a847cffe7a0544d8041a60edb3b76e187ed15e621c0c4da8b21c189d3a6683d37e3d6c7cca7563d4b38f1fd3c64033f4ff2a5c6462471ea1a4fa5cb0c58d9d5f88f2d6592e7e00619b5612fdd162d8e21f6426b283e2892a84fe8963efb4365fe6574d60d0b104a11d5f9c9e9121d1bd803093a5cf415c8224bdd185b8e8c70ff59502c9f90a58d4050349ecd88646a4ef8616ce23a6838e1db3b23c2be20d2c6c602a7706da4e4a415e0351e48453701282b45f361f36bbf74abbd097b59c8749a7dd7249e17342635e208b55bb23c2291c62a10ac8a0aef9b2b912eca910e94a724d4f1a0d9aaaf6e0d52cce355697bf8d285bb401b747391210742abf71b9bfc7ce1ea52c23f3a4768098c8825eea612f1d072786e42f601bfb84417e782b0976055ee382f2dfb4be92c3222728e532dd3a1485081a3a4893ec143125808f631300eab11cd4ca265b6ab75f03bfffed06f2e2a1a89f03aa13769ec0bfd8b44ea93227c01bad7d34f25f92f8b9e385cc6f95f61d2c6cf23a75184f635746255fe2e9410dd512d0bd7f947384aa1c0d106b2f8bb4782cb91518cfc4465371fe914be58805fe4b9ea13c2974e3c1623e326ad3092235932eba4d38016d1605c8c879f0e612730e593aab098a2737ffdf4da6eb0b0b3105b0e666d961c517ec47a32c8e82bd7dbd125ef27161b8d4734eceeea68211619222e6e9924494720005c97c42e2d72cba0876fb77130915122cd0a56c26dd163c32ca117d423fa7c2b27694b63fdf14d6c9b99d55a5db19de45bbe8e4d8830a57a391159cd956578c41ce8a9df760cf63a0fce3369672eb9f6d1ddafc1b6efc2da762c34d6b152112e96110db72af67c1821287df0b9a9d392f04522042d7353b2e61fdb2df725c118cf9c4d37c1751b6f62598f097116c4f5a6a98450fd702226248abc8d1f98d94438842dba65b6b55bf51c4bc612cac4d7acdf54eb1bc2432623abb30e7ba7bd3f9739cac9b40d0b34b130a4028e44343bc60ac2d94be3801a6fc37fe009f44855d07304d433399dc05e0a68c006654eb2ae0277a9e20d92a8d2000ffcc68ab47469437b6a39966c88130dd0057f8b43381f4855ff2d6f02a558dc455e2cd1dae541b3690f66e528a7a716e97d5fb8fbcaea21a5ee9ecc59cbbd7647db90519809aa5fced2ae3e20f492b52be028c6b7bc4bba24d35a646848ce689b554fe20a04d1d9d3bc2ba06daed3c5ae091a08af2eec8250ca0cfebb2e3402d958443086dc81744673bd97a0b56fb1c06ca20815aedfbb00a4749bb70ed02d30dda41e073508080df185807562ead6ec9021e8dbb3e3c157d2de021545bb1fbf2a4f220851d9e6747ef34b1cca2dd1a47273e62eb7d4e3308d00828539e582b7b28274aedb4ab70e0c9831381c5595ea768b1cce8ba0332f35c2ee12b1462c8d28e3b86c5920da8b1728d5a9951198746d0f8d564102a570ba720290aacd83d1f8c26d01520ab6d7dfb68d5c35cc64f8088bcd86fbc4f795a78c1576e001c3bde028ab908be55ff9947de42675537825b430f1361e303430c28edc349f91ed140aad7567e4aabd8afb41234c7ed77042e7705121ef4bde82aca8ecb2569118cf3b4f92a125b50ceb0113591fdee406af568f8a3a911d1e2b26845ab108c1fe5bd0a30336d7b138243ca2d0b610220b5f765487249287edb664ce032dfa763946f45dcc63177cae2fb9758e6c4cf0d667f3e1e5ac82351f970c804dbee9c3461833cceef0efad4ee4e996aa2fa54eaf7dc7c73e462e958dec905b66d3c074520b848723b4b55ee9a33a0c6847d714d13e0ffc4ff0868ca4159ad12336c4821ba54a6f5a86c6e8e230fcc3b2fd301be4eccf3bea78b66623c4e472c7b41e2083b25179b1f7fee52c1cd183cbf2a1237283e72335895ea17497dfcf5cd269348971a1163a886f1b6eaed77576916cd9c999928f5612b8de5f324a17884b8a3bd7093fb3793af287bd0c38e3fa5eb583ed5de01a66fa24cc04dacb573e952cfb8d2dd2060e934b6d26582979056d61c9b6bb6d426882b71d2b8b09e797b8b47b3d252b2d8446a52001573f95e45a356af3f36b450091303fbe08115a9a28060652c5441a2878af4dd95d8a0bd5b04694ddc52b34e9f714ca88350a235ba5525076b06af20ab66e2e0055b6c98da419a5b9592b58b67547913c04206070a44a8af01c2c515e327b066d95ee092d581ce86a36894fe5d4324592eb7ab7715ab8b0ee16858636b0275a97822d0dee104dd574fb83557adeb93f27c39beb28cfd181e4f9dcfab60562ae036573e69aeeb40872da22de8c8d57ba45c446d788173234ece7b1c359ac24c9f02c34cfd850e353b30f2fc6581a79b4c9e48695d5a5078d94698b64508800ad19889d083ce940f2da9e740876bdafe2da89d4721ea72d9ce9a979545925faf327af232a6e0385d6c25bd00a4218666e72a54ad8a767277b780cc9539674d34559644560f39d5dacbf79ee4538b88f591a328f1080106a64cc3cc4b1afd7b0759b97c5947841e5f970a1c0871556ded01175d5cc159a137ea36331c88bf9fa80ef350016d6c74f4d503c8938767e992848337144ff34047d271897e15d1f1ed12842d543d35b5c7fe30233265802f8d28f767e5bd071f367ff62065f3f84a4d30a5a18d1fc7533b4258f1d951563fcd2c037b5dc51d9822f97ec9e6588b24052dd30530124f1671ae8e7a138bf752431164ad1e83ba5501aa0edc80b73aee438093f0a7894b98be84067153038c7aae87205ca9e7527213306b100833f822e84bf8b483280ce5a9908203f41c7e1ab242953b9e9176587e9f42c3c0570aec0a8067b2e8f89d619bb918ed9063503239322082541089b08c563f5a28b5f15aa9a1752517b181d8f3d8c2dba8d5c5d1dc638c5e44dc6b32e3382dadfa1f6ea6e38b684a2e41b42f3b7f911b940b005a7c81dc284a28b87fb0cd9c5530edf14eea3ddd1a3fd7501f8e8b360074269ee3c40feca9ac79a810a03e2e24b3d65c5b80917b63a9c51b6260c8f57b88149a25d2d941d89a97a31d0b3409e478d077bae0bfcf98a659b5a56dd7125fc10d452a9d46ff6184e2d02dbb24e852924c681fbead04cd8613050c628d3744735ce2078a76e5e068d7993a8576b51cb4e3722ba3ca1a4a9fc8899a042b0d2e4e5a17a71efed3959027cfe6aa6801c4ce4568dc2e86a6b0e1072744d8cc7e5f35180d86121ba1c3e961aefaa721513cd309c99796bff03b8ec4d2dc70431e81c722e355dd6aac6f4cb413207b4c05090bb75bce8330dcac28bb4033ffbc5cdb77b0447d3f9bd9b946edfb30fa011511b29f4f467313dafce381e2f0963445bcc5cc2c45c5626786e2a57204ce06721d16fe6806cc75a7afd64c62c68715ff2c8ebf3c00774fd1c482c0fd539c9f9cda349a55e43b87d22a66dd7173f286cfed6d4134479fe814c493659eeadd3e7e53fddf61b9aa173d74186c98074d95683380af156a2b1800a75ed99f18d832d9cbc55b2f8870a1a8812095e29ecad70ca72cc1cfdd3cd07380b0d0d392627846f655326d41db34e793a34da5737f282c467dc189730963c1c97d93cec026afbb665a529c80099cd1b90cc44a3a29f99d0af615e5898d82ec1a0cc4a5957f911d9ab912c8bd0508e5e4385fdf25cd9f4f78bf8e962406caf21d1428f4978e559fda23718be33d1a46f04e8f00fc81f283a97e7ebafb08e36bdc9bcace258413814813cfb744408190dd2c07e2e62d18eab456d386595b8df44983c957d01794edd592214d4d7db8718724828680121ff9b990f983dbb55eeebb521399d8551aebd403c1facdcd932d61ee37b6c8cfeb44b0cac005290ce89772a37fd59f00868cdb4617b3a271ee98115253955b472b36bf51fd6fe0af837d3ea32a0d0ae5d1f5fb76da671135ad08e44c0d3d8f259646d916831bfc908505b1215a6a4a9531eb53e810f2abd2e317b570e7ae03c1cc69e205f1f99818721ed3b5efd0f96b086976aa6bbecdab417437d8d41fe5a8d25a58b67c92fa21f55e827746000036e1b6bfa63bc988e03709f597b65615e79eb67e8f7529be9f1d52e641527bac2bb2ebc66c42ae47802dccb707f4b301966dd10ff811eb2604250d49c75fb680e49d4ce9d6f08342c1893a4eb666e0cd450b5cdf8828d2b7969a02c220ac4ef001adee047dad401d5aab038c66e9b4aa078c172ed91b86b7f40807f51319853ebcb4810365085c99f6c28fb3e771eb0cb61855a0ec984fa92fd525133f5f260df1fbed423bd1d70877ebd624bba8aec941a427a2ce41ed72b680663eb51039d9d4b4df2357f0620009e0b5e4f6cd711516988f42076bd88ba69b49b70da6d474ba7e9aefa46ecf0e826c4c7ef1084cc755a74bb48dde29d3046975872640977ea4bc0e8bf3efc144256bffa9332e216667d328536dc2999375e5863ffbd776dd5c4dc0ba0c2845bcca8d443793d23b556729842d2872d241065043341a7de5cc5a7825b5f292ca34f42cfb083774255c11fac944a448433e5a7a9f341e4cfc480e5cdbb27ca2d1d5c4c4f526303e7298df9103dda916180d90a2f56ff663e431ba9289687e76c5f740d089bfbb8f38c0b91fad1f3d3e6539fc9f9c53f5e887eefe42de9cc06533dcbd8b6b4fc51bb8f754cec69286aec2341a8495463ef0d2ff8a88839ef42b1982513638975031807d10b3ccd6b8d8934360a4b08e236f99e1bbc961e628068c9af62b465f1881423e22e5b568fa4b4f5e41717ce39d9b519eadb94e97b83b9e2c31b76e1ae2df06fe451e32911be846abcfd78bc511eb390e7665fc3f10b3bb3f35f84d91766f85623af08998a18441d3c2b6b67a022e160b5ae953c2811f34e84a430f31987d8199733a4a0218819ea9b1d1ebe225627c92892ae4b5a6882a58f7a51e41670c4436343169dd00213c5cc8908d4055ec0017014c789a4abd63b899b0885dfb2f3304f2fe6182feb77c82c2e8c65370bd762ce502427a49cd4822cf89c05ad0487984bef152810eb18312ac9c935342f53f4844c6de0835321944c5db9606f352896c9b8c3d884a8cb31d566a04828b7c3aa3863574191963fac0af1ea8637a9888ee3ed3957b29c7d90e03f5f76d234021b8d9dfab71b1fc535281c7805fef13ee905c10d8dea70052a9dbf0a8093bac934b48d8864ee4ee5c774a66643e261fca29b23a35303c1813cf624c561eb35e2e24e61a9c1ac86bfe288c16b9d8b0f158f12c54a1c1ef2aa72635a8d82e8e62116b1458cc81479b9a4d084568983ccbd415fc1aaa45b0bc7e3a04f79b0d8a8102f000c8b2c3bb24367ac5792d4db8fd3ed4944ea04bd0767f0e941715516d571a20413d376d045c3f378568708d5c038b3d277ee2549742a8583e95eb5bcb50c9b7ba37be0b8f17d4bb948d97103d66255ab63904a5af9344db685dbe739e544b06a5a68bb38313ea91f42e1976726d10fa06800d8b04a584e66354efe95d42a60b68a070dd16b877278ad75a04824aa727c8f5cfb0ba66baf24ea8023ccd91a5c0c1e206a474efc56e3081b85fe4477e2f6ef718406addd9d8d6bc91956f28bf73fe0a45180c5a7bce5e1be0527d6dce44d6c8c517c0282b3e372932ad9ad96616f36e501a2b9a97cadb376fc53d47c29f165a8f506bf59d2474c0c1eeb2b3d1c200f6427622de294a769e2d921a3970ee8bd91ec7a7f1a5f1f02b817726b94e62061574826800bf98b9d888af9a2fd174061c383066060ad2bfb892620d5d7de83e8dabb402e74b7c23daec8735dcb4fcdae2e9a04b0f0e6ea9ccc1bc1159448f463bbac1ab7745095c9766229f2670037e337b9ac64c295b1b587299cbf857db8706d74ffe07cfabb2b97a496d8ef5f2180355b47fd24baa319a0001a88f24850ae50a691945f22f63d4fd57a04797b1d5dda54b4b23a2b088cd7d794f6677d31062b51152cbfdadfc70069dd97fb2fe26fbe4336be570000a24c9b464d944d9ed4dc363b4cb292286eef889327813e5d0bbb68db728152678e866d2f94d06051ed4938ba070d4b767fa9c09659d31102db316744f51713bc798232758599dbdf8ab45d84369d61a11f69fb9785930802ffa8f09f15b4e1977dbbf8d5426ba21336a81e6ec30fe608f1b5595e9ba6f82b6841c7be44678bc31b24103abfcd3e5db0f52bf12e070be629d3ab7e406c3a3a777fffbc38f2a8f65a901b6e3d7da119e2fadbe176173a161c0abcde10b7add2a93d9f6f7a5de85eb579afb2ef8d05712de2be5430bda8d31a82121e4914815eb1278d4b2d9001b7ffb1b0d4ef782901a1fd1b0d44571165ca49e340b38403cfe202823777d139114810fd766d9937ceef524411ff006f61ffd8808c94173ea9fa7096d31773b7e57c23274830778176ad1abef6cbcff5b192746d590606a4f02f58ae38d7090851bed54aa5545b4f8278afc2ae4dc6a6775b30a0779be44ca30abb1214ea219b3b50080ea9fd22ab6cdd9c557d9fcfe2b686237d791a2f817a9de6c7dcefcb311085ec653fa2a525a16653580be6238e030889056cb7e1dae855a0aad650c732f083d65eabc5e345dc40e58941acf143589b97fbad235fa9b400d4660ae0beaf21f4a2df9f41174b2e64fb99ac205a6988e42faa6ad17f62aa0528317677e4bc7fac01cbbfefb38d4100be9762ea419edc9e1a629322df73ae6debbc07ee032f9ac5462960590ea8b3ad16f0a87002f723ec304d0377a9abf8dd2db2d51063c517b9d4c7f59f3d6394d583fba07b1656055417d1301cf86cb87badda69c3596986621a8805cb04c0a2508b1fcd7ee8fad80dbb144a603b33879c6a8e82e1f430c0d4f020affb816f1cf12dddc7b7ce4a7e22def39be9ac3e027e25c0e570d728d18233b9d649e1ec77934edad8d740b646513746a8d138958d989d357e6b6f892ecaab8cba266d248a06ea64bc28840ee35642a28a45e493f58b7a46c81317f50a966272c431342bcc9b500743b53529be8204c5985cdc13dd4309814659fdeb63dbf3160d92d8806460580afee027aa21fad904cc1c3a779a28939230c24693b66021b4900928be31cca9c005f9c447079a70d1ac400d2f639e9e1e4f21dc82b845034e9b62d3d24ded35a3c71313ef5c23bdb2ecf49f4c98ccc77843961330a1207d0251c69efdc10ab271db361cf153f6498cf35b807c8ec595ebf1dcb72d92cdf12f97f7852fd2fee07afa231ef9461e9980c1f988bf04cb6f9f38d2b6f088474f706d6c509963f26cae82d27d73ff2486979610f7be786a4d2bf7048fc49c31457c0a360c4207df78aabcd2e634d828b40819dc81dbd33fad76b477cf2fe253518e7d7d38ac68622870f877ad69d1c9201b25249fe8a4ed04e222ff1edfca0ed0a95a81fa1c274c745d2e5b2c43e785c15320a8368cf196a1ebb0a906d23ee845ed18d1875d56c39d8585a7dee72a93f478a07dea41ddd50facda4e94fe56604164a87469978a9ebd98eca6d8200b4e288518d7d391ed542c0c7a5c21f3b6c2fe273bbc8b82ac99fe3b8557617fb87ca9e17b514c737ec098e3d39e709d3c87b0f1df29fb9ac0daa6304d28924acda069f0b43b092a0cb541eedf12668daa0c40fbf458233a9f936db49d91cb330633255914912a019f9a63c52faba7ac80e55837174c4cf6bd784703f80557d4ce5e7104a0e422a39a1e62e635a8414462d000e00e08626f92f7c8ab63bd5f39ee433d2a0f5e3cfb990e5794543a097fd21b355fab3828f4a1bd37abbd68506788b6b55d9c3a2c007a745660ef395e1a3adfeea5930205ab2414c01dd3bbd9409f6ccb3534948b1171080551d9afd50447b8ba15a7d777cb95c2b329389dc1ac7fcf1b7b1f134e020360ccb8f06c42e879e5d67e0625ff27524998de3a65f78ced944b1bf72117c5c8fd8f029decb7762b48a90a037288ba0b6bf1174da09812cdce65b82c0861a6bb639d6f1c6d0137475b191df73e9fddefbfbd734a648b331a37a7fadfb1c0f2def581c0e92ad98963184a0ec8c6b2c804db815d9cd2d5c89fb8c7f4eb279202caf0abb3357745aa25895a41a79e49b024bfa03fb72188bf919fea4c3e611198c85ad42bc3cf941b07d2691eed4756e2e90500cd704548910b19f36328cef41bc982984d4fda903c83a408e466b910f39ee3c64295b7d19defb08194f9e81504542caaeaf70bada00728c353b94a58caf992aef65e0bea48e0fa3d68b1b4cc64ae5c07593a72b468d14318e34d633316b216a799f48ec121dc79173f54482709f6bb8a1ac61f98ec217c71f21c0b30eae12e32b10d33d50c7976324754955efa646e909cc4d2fbd45795fd889d687dc71c18c4b278e19872e54cf0fbf3e24507a2092c0da2b26e8b6c24fa4f0af5e45e81518e9740798591f21bf5cdee4441a31dd77f9c451fc895f55aa644b0235f6c78ac7302167e279c657df833573734b8bdb1986f349c9c50573850a41c0cd5234323f955c4ddcdae94cdf6b8c2af722e1ab2200ae500f6c3d7516509148a7744f04a50c46818feb9e1e42f9c496bb91b0530d63cd997a7fac5bbe8960face443f7e365c48eae65fbfab28f91de52a3489dee9f4a37ba581481a78905971cf14c9ad74fe13dc2abf82600ffe1f90f637440292585018cb5628c744fbab9ce7716ae0affa8e79e0de3edf6dc15c729d27a376b96e3e3e804506d0f2cd85c4b89aa35921c070f5a2c0710fa10a59927febdf434ca1892e2d9af5c91cd1a1f043e81a8efb0c88f1af3d6de469fb20cd8b7eec54db50ad0f11b342035ce0da5598d44462c70e0bc0e62120c45877268bba9361bc14451fa6ef5d5b96465ec7b090ff753b7f124c68212d3f15374b4ab00bc5d6c87b4522c1029998f9218db6694a150238b6ff4dc4895cf96cf8ada859447742ae5b656ada2bb6d7508eda67a183af84f15faf1b71bda6ec220eb7e422a1ab7aad3cdfdd78dc82dd2c94cf6e61bbfe16a132530802f72790bd7cbe1aa452c81169bbffba489b8ff4bfd312986f80cb2ba2a6bb0300c8d72abfcfd2af8a1671199ba512d3abc3eb8860254e650ba2fb1834059fb8dabd1c3a3fe1a150faf1fa62480d210fe503968a2d67aaf273b75406cdc7ba96633641e0b8d8f3e69d2f0ebed46cead7c9effac0ca37123e6160ab5d2df53a87e4b1dfa5c3ba3414ae6d88e59a23a6880bd47918c078efa22b8f4890951072bf70a34717c57096976705a222c70016eae0c822c9dae2ab01f6fbe68b54e1965b71f30011239d0015773c3ca873df85c93d5cd05b66443c46115fb69d08fde41bb9435a72345d108061f8f47f4d2b06bce8ccca919b053594e9d52dc17185fef53dc652350b2c50cee5c5edd48b458056ab3215be16241b2c1b16b31e430d8084923b880e92107c22a7f13871cad42d769a96230a68973e68ebaf399b9e8ddfc0d1f747db2a5f35a3a4476bfe7c2e9429c63e5e64345431ae8499aae332a10bb389e2165d37de3e793ded8d9a344850371d0b3f20208a350da3f4d9aa0ea31f3d3ed06431d859ad4c242d80c164a949ee0ff9d3f4754a64020496e26a5729d8158f36b66d2babd92647db7a7bc56bdcf130a7f40e54b5d1d81a06ede8c1e52c3954ce83374065dcff8ac73c480512ba036febfe59d6d626e320615272818fd6e17bda24cdaf0a73b9b61489e40fef6abe980f9d20f62869756e0b14ca43a7a727cc0f45b1f58f419d5b1a6ab7d328983621f42c9b3e213d61b4b7364d317e2638499ccf534e051a685b8799f3b277268b12734bf751157b1b6d3cd274debc10c182d706c1b637187e9ed082be4347982ebdee23f49ef253191f63b66fad65be6c1526c17469371fb85d76fb74f2baf054d5edc1277a8cc0a2badfe263122fb22fcf7f5451417dd7e6a9055f240b5064552b5adff49c787c3af15dffee1779a8b340cb66be6fa0793d8e0beefc859dfdfa5ee80cd592001b0df39c4e762a8a2f8be6c09f0abd51e347070592d9298828832548cd1acbbd863e49c5500efec495f6c3d5e5f0a1d72927be9caaf19ad5f79f7d86174b2d9cfa8317085fbc189b918a5d08778900e876f4f01c0dddf16e954d3aa302d4f01c031ad1dbbb913813576bd0c317e8a76ec06573f043a4920ca37ed25dcb13d5eef51d0cfcc5877a0d75980719b8531ea88bbce32d94a76431cd27faef724beddbe4094c6a370799c23761546a643737ff87e0ef9eeaae83374671ed1c090ebc113bd00771e6de203ffafd51a2287e49a55209c09249164b5665edfa9d23813d065c968c1fbe8a46d7f9be270d337c1413f966692aeb80b3231f24950e014241c3edfeb203f773d52da478ea585f68dce6cef3b13e356e05a197cb7c9563cdf6e73a835073b142bfe7fb121f7d5875beb24c580b841a69ae8801fb8263a724e40ce60cdd02f4a3f61c3133b7888cb5258c18688c276cb072d8ba8fbaa21c7a50265a7af5fc2155a0efc3948ba9590df0b822ba288b5a981395a11a721f1b338bd548f953ebecdbdea79628c215b31a3f44d5493c42a5ff2c26fdd43468b89871d52b9d28a99be14f01c5a929dff61fceababcb02fa83b25fb2cdf6a847838d8de9eb4be35110c8530b7bf888d16eb13dec597cf1994724d018800b30b1bedf0822e50272016f45b73342d6c737a857b872ff7718795f0c643589afc2955a4720d9155fd5b0897584218fa83bb4b087f89a1d72b16f58d30eb84e4153706d9cf1fce6275a0dd82173c146cd2621ad541558fa30794b1875fcb2ed67412dc87d63c771318b6f67cbc2490530c07b933a48267e0eec3e2e3b386d018e67b37224951cc6f75f075f6142aac2c3dc382780cdbd39d00dfab65107cde96d15cdb8ec184464b05869c64bb64b5a1f94f027ff66f9aed8e4103e9afe5c0c38621660b5ac61749076c5eb9716a3a1f263e8a0ea69215f000ebfbef93cb421f32774f5babbf803a8f4833aedb5bfe88c2904e9aa6a8231b1816c4bc8d0152ddf808512e9c83eda316cf72c360f976c13894761f3dca9f924cf42a1a1803c1d546c245da60930e22b34119c9694653155f0dccdad18b59101498c76f99be8f08be498783d854a46bcb38b2252018c90d453cbd9ff71f912d109778366c4f579a619c96b2f85a7c7b66ef9fcffa6ab9de7e959863ae7b4857a9f7fe59ebd14d6e37a039c3c70e2d788e2cefc54f1f6e31251b9210b0492c83f073bea0e11dbaf099e478819b9a48f0d2aa28039775f3bb083dcb0fabd907676673c0c241a95dc480fa81339f45e971e92fd5553d1083680f44b907842ffb95f8533245cdf8894a8bf26c78a96621f27d4db5c376508e21d371e0a2efbb263e53096bb6a5b1f5b154e5defb182fe042ce2154ccf90cce41d0d493ba9823578d53adf237f11ea4f20a247b5e2e1d89943ca9dfcadc8506fe004301431cc7978cc83a57e7ec9c7c789bae0aa3617c2f60bda12ea56f90958783897e62838fde05efeafec353fa958da0deb130cfe7fe041e77a6edb2314a96f8660aebd0056284b00b45b85cf62965e439b537738cd8f8733d09a282231a56c3b6dd1bc57dd98fe368afff6334bec868946aeb9c1852e30b2d1ead4de15b0a40e0007bcf7e974a31110c4f203ce4be43cc85303858d5337c2b02f70788b4d93fe8518d02c0df8c54476396a8c8ce5909b3b46428803f8e13bae424527af02ddc8127c1d7dd18d23fcd0bc7b0b457caa8701db8d252de83a6a08e07b924a4e15fdde638b5ee9d9c6693237018d3fa9d2a6dbf06aa4c33231e77187ccf0b69365a5c1a7eac06b9ccb80947b3b6dce1168c50fac8dd5bac2b264d4700bedac4286f2689f04f35ade225edbce7226dffeaea56d43cf41255c13599cc990713eacb0fda6352556e97fa47ef1e7c96bce8b1dc841486e0004054f1a4ec379ef371d6a2dcc589b72c32f3d00d3ed0fa373e88e6a0bdbf40bffa6d6a4ab2f743dad5ddb90830b5b04de37420f46f2a00251129ca181099871e1ac7f89ad9827c5dc47e8d5e8273d425f8ddfa0bfb79026d26c88b5c4bc981cf03b4cc8b50e1c9e948af03431ea6cf109e641f9218408b8101c98db2954401351d6fe089dc0175ee5040de8e631cf331f4735f7ae321e61ca619e119dc76d8cea73e700ebda1811113e1ad0551cc28e5d95f22dd74993d3070fb766041f69027a5f86cf46e94bc404d38e63bca3c7dda97c0b83b486ed984f1db608bebcdc0f98c9161d6e4f4f0349bc4e58d79f0ef7608401adc5500c00a6dc728ab2b4e4450f83313071dc63720851ec77424b219e5e5c81d40c44ae828fd00d870e3f0c5bb73a08160fbb92f92e018c876569fb4e97b560fb55ef98edfead006e72cf7ad0d8c4dfe157c0d44fa748c953dca494c33c74b41bbe6132088facfbe0940022867716974fa913cce0b9e80956bfdb792dca5aeed0d624b92256c977e9d2a9e801d3eaad543a03b67acc3825e1bf1ed868803d4fd9ca5e8a42dcba757d39350a02a5e87145208c0b88d9a9053fcdda8edac559fe712f4a44a9060b7b89c5fe506924208e00468ab2692784bc36e0702237225c5f77123e717f04b9cac5ca13580dbf83b5c40ff75cafedbf049c18b1240c064e544d352becf6efa861bab9ff9704ede8ed88cf6660775a7f0e054a88af36d998a563b80001ab2ec4f719bc0c3e07a6eda11025f37a37b924ee19faa7b2de5308e9700f610d0d3d29ebde7e4d6ad735ed7738d40ff5ed7b61f86c4eb3ad3081b13f6ba539bf71d1d60662450d753d0e6f14707a712aa132152b644ddaa7397622b48a4461d57b7d5d3e38c458f35e13efdd7f7087ba2876164d661eb5c27c39079b6c4f81b79c561717b4d2fc122f814d43bd11a4d9310dcb68b3d5173ba633e618deb11b1d9aa602c61c5f9b5d42e627d986efa4d6ad9fa271a87d166696c3adc8245ba97ef6e71e9659dbb31662adcb5d35afa0f0e82f663573a20ac7fac6cb6a90a05f510b0bad7c3511dae0f3c8619f8b9604e64ca38727cf29db79e27dfee9ec17b2503bee2e441043de70e97b1d77ff5462741194a8eb86117dea99824f4c63e7746ff58810e2be95d62350fb77693fc3db29240c17e1b1f716fa5a8a2cc3839ac952648a56fe63477e5d090170cccbee345182a6c98f801c1b928d3834a658738f605b0ad8b7ffd1bebfb4a7a0e053c4812d25c4438eca246c590e6fef6ee9adc44e53b41c12c039740b15357b35eeef461d3b6e5d3df0c8ba27434f3a19a77c6ab80c0c5db321d330785a5b8bcd023a35ea406d4e9ccde51424fee20276d08e11173d37b86cfab13cdf4a262e9455797998dd9e44e684fec660a450a7c8b4e7c0c59eaa6bb46757fde3d856e39ae472c545c1b80df14e9eb2a5d22c471740d425d23782751c12e16d65dac7161530f2b7a71d87bf00f72e66289f458022167e982bae19ce81f3ae30173bbfa1176e324e389c88afb7daef339efa90e59b6b7e1c7cee2eac37b4e3ba8d2542805ce49a3093b0ac552365a9df10ce752cc92e7b49128c469c39fd810a2e24633fb010f230926c7a3a64f89f988242f127df25b6ac4608623932fa079e3c5b0a10f898400816f40a4310fc8ac07afe75459fe8cf1fad3d97a99249705fa376c080b543c8b7f1c7b06c91a878cf56b84fe54bdb43538eed959040a5595689c2b4d647246221af176669b489f1e5b90f8a8c9037c4ccb63067605d777776d097dac4e13b13cd948df8b9605e6f9879fd53cd4f7710db253ac76e46e538c9e66f96cf79dd676984476c9a4733687c9f1dfa54d05a3993cc70ef74ca5d5bbd85729fc1930a2553b59f2350b67a60809b37fac8535a4ad525b6d95d232395601058189737cf29f22fc5faaa573d941aa74787fb922317f3773219dc04b00ee62505036803dd59a2c95c697726b0767b5546335c9b13e2b01d6bf8cef5f79d45f85536c7c186c3eb0a261e5af5acafc0f83852d195eff38d553642e9d317bc5a91c014ca88a362305374bb00243ab6524c8801d5890d7f3c80287cba7ac135325547ec1b1c8213ebcb989f586ef802f85220300fcca74b677ae73913dcd0fc0db722784abe4e83eb93c7de56a8ef300c5a51372c8681b43b03fcf62354e7d4b1df5e304a97c3dd5849762432abf3fb31ab47982f46b1c4c33d6fa8eb27c39f3456760005b77872717586e74361720bfab01d4906c8cae2da6b9e4be45c41d4cc7ba399d6882992b91219b7a17ce3f29610706e419cd66541745f68c73776a60831da00bb0fce8439bf3e875ddd77faa383a87bcf554e9a9cb3766238657551c736fbf9c7e733a1f5b2e620d53bad0be4587c9db8f4940ebf5e4c2e6afdc48208a928a0275640e3a08283f53c48a8896bd46f42601650fddf1d162ba28f313497c6d6e59467ed89a5bc70f18095dc5e3122017dc42294cb4dfb9d887ca20075adc07c911368e42bbd8ba15eb5977498874e61fa6b112b9628bb45f700034860ed348de0bafedfd3f3085227a5f0b50ac9ec82ea5f2949f3a5768712174322b76309e4db3a5f702c5190212ceaf4d18ca8f98a0641fc0adea7a5c765ddb8949d5800eac82e00e68a92e6e6acf2e26daaa3107de7545bac0cdc81107b4b7a1c83a91063c283ae076a871ee0816fde6097c30e4ec5532d751c1bfb484be6f0c71cd1151041d329f12576e36d5609e3cf3ea20c631be9e19f8c7c11208e555450366dbda3ea35738166f6cedcd98ae64cc86ce3243e9af29070f97704a277adc2bea8de8dfd17342b400e9f8f06f07b10f373f650034ef03f568d84954f7b159104596ba95217550019fc56f7a128f16ccb8f1336e173ab7c21e40e5e6ec38bfd1ebf5d63f865fecee5459c8ea0c4791d4e7dcd3675790da546f8b95e77935da183820977d466995a98c8aac594a65d984dbc329c39aaf808ec6f9a2a405b682d2b91b480a6d9269ad8a15815f4a9fa16a7b7b432d4346c6299118e684c01a1472e22237d6a5f30706badc40168b00120747b5796d5a9ab294ea9a29f868140abd99ff9bd7f77f1774b6de0c4ce9cbab6ab673ded1c462301718be6cc6ed6c7f47b7f09524918ffa3f2d972d524e5be14145426c4b66d1563b10b6f0e16ee18b8a67ceaca183c1a969f553388c0496e2ee6ba7b329218b2fb4885e87ca9f3425fe3337db8883964334913f711644882af10ba84b2117aa3601b8fa9dfef76c6b7b50960a835af9a905336e1c6206cab3001a488d34a2478758d7632897ef4f1c220861da9a78f30b9f6087df7e940b8d802776f55216fb169e17620b14dffeb8d55bf6b94c18ddf34da0c3ef76b3e3c40ff3e76f81f750098b510dfbc2993dbfd25a2c42a1e3be148625b3397e44a91a5c229e3237e0e93d7b96a679d0b7e47a6dbfa84b9513c98948e6c5e2a4aab7e6f7b73e0e9055fe35b8a9b5980cacd1fef3d73f8cadc631e493345ca78f6a4035abd398d98d3c5f83a5458378b013d37286b0c7f6616f522bee5606be1e61510724210b5d46bb88178acf75bfbd041cc0302b7fa2c08fded90cc2043888e2f9e87a87c2dedf3b75bdb176c8a8beb7e39b29b09f7419f942f59bf816edb3663e013a0a223009b4c6aa7a37048706446771389e0cb238dcbdd46265da21220507c0d8198a98687bd2ad2e20c3515e1ef27242113b50d1d36ac6da26ab05b04f0e92501d713d7b55d946394fab98e8f649dbbc1b3998ca5d9627eb13bd046c0a79c7a2dbe411c2c1c9d2087fc24144f60996df3ec69b9e0d4e9980416d064ddc8e16409548c5e734fcd9faa9de2ae300a5b4d8576e800bf139ac21ebc98cf01623fde0a6fe4385808fbb31591393d594a2d6300e802e7efc639c67c4f21bbfc9b9fc034370bd18c773826713ab2b5cdb5b673b53b63516a64217e15857fb273cc2689f4a4624b6e29ec2be3fb6e3069169e30612f11079249099e9b34c33a2236783e243bf6441b48fa45ef1c138c8cee11cba6bb81a16dedccb6ca52da04bb3da24c88670b46e5148c5237024a6f0779b483b180c5a7403c53f9a795a4654f203d3243066445d6ed29f2453cb6ab322ae6386062b330ccac20be8c1a32a62f0d89ea972c10e3b1a53d298ac44b0034f669755975da31e574bf2428c2f99f21601fae43258287d7b6e4562ee036c75a937f5bece87a2892ca048f75823586b5041e3c6b4e915cb76cefe7776fbffbfd7c87704dd164691708130c98c407a890a4f089c6cab2a01d3631fa0c8c4db192fe055ef9cc113005a22e2780d8f23dc087a1ff01af5c8688adc9aa1333116b44f1cdfd8071a226b2c5c85214c8faebd2e2f34f70ca14c644eaa2c125f91e2d84bdc1984984a4beb85ca2ca886f97ab24760f4e6835ee6ebe3e79d2def0815e9a54f24baf7af08de72f2f5e9008f99ce21781dcecff089065dd4737d3bb51192544eac668a68ca35a9fc56a2ce1a35065d4b721694fde5b2c889b2bd8063824fb4ae881f693724293178b8bab33eed5f254da82f9320b70b2cac079137da816df46361bc6bba9acf424a7b9e3963fb8579c29e2cb2856106da96cb2a2ec9e8ff0330a1c1dc6cc795709a909c3ce2c4f1ff037ac2141a3a62d24af050e3cc92568c137ac1a00383483804f7bc948c5dbacbcecee230c685c13de5a232afa989cdc2dfad4857b936c7652fe3de8703fbea2917a3160f76fdfdce3f8b21b433a7fa972e583607b8766ff83e409aba7636433544561ade48d44f52a579006aa211a98e5522f7b62ee5e175c8e2908b5d7b81da2d5aeb5798ba241558cb7ae6d6ba10f63aa3bef507041b2e4ffebb4a12a34f0af0e50258e6e5b81561c8abfd0ae61a53519e3e6d4932f2ef458b78c1a4e67416c3490c4353c452b212725aeb90f7921031b5215830e03c43bfe322ebc20ea4e38b3f16d73f4cbe981ea709c407d57cd39f77bc714c74eb9971665005b731603b0bc7ae05a6bc6fe0e0851e06ea20594cf83d9d449bfd9d94ab2f9ed87eef3541c9ea308600266629f761df2eab779a563ca30717dde96295b25929bcf5ff7dadf55a402c5e883fe828117a3789bd3042bda385cb07877e4c7cd0a9566158c7e822e052d14ec4532b32a06206574805eb283332d52a223a6410fa215fc065607b09b8ff42b70b261254003524a7be1f3db461887d87956014fafb8b6911c2ed6845c5eee75ae72f005511a8f540805e4432210443f151292aa1ac09644941f3deee5b9d35958ed1dd05ce2683ffa68a98273562c849f10fda3bd62dc69e68ca58d4bae32b1f459018c8e63936c9189df091a37aee8728f88626796eba3436099d2802bbf384bedabd9367704737c9ec421a15e5e4a89c064b2d0b0343dbdb06c2b22c65b0985135256df260424e4d486ed021d51356b81c197fc942c3e47208bbdf269f5e1849745ddd26f6929e3f1553f4a7f666947738937e4c283881576d4964414dde9a1ad7efab604e5980bb25641918128865e77719ee46c0afaf86f1ab13ff7e5604d0f287de9584b23363be92c25327bb72622de13e129cd8368931ebcaae24c8a52c0a80fee2d3c999b8c424325544531db04282dcaab440a968e7e09c5c1124a0393963c86c8bc9a53bc94a5a53e0ffd6499ced387ead6309e0d9ffb0ae50ce3964b306fb43018d5530f183cc9a5c756e58499e17f65a9897a3e2e45d05b5332c1427ab6d68f391941c65589eba65faf4f0725986b93690e906ce32d7cae275ad0a66ed1ec7476fd60a4ed7bcf4861add8390eb69b0052c327126e5a70bff0880797b6463f247ea0e170edd42880476edd5ddefe8a83f04c573b4102767994f971b14ac193c4b74d1634be6fe22fae43abbc6fc71ae6e1bc1cc70914e5f7e1713af20903b6a1363d21e36b48a2cb584a3ada8449746b8381d00f7ec1f323cf41ca9dd4c0d44c8bfedfef097537629370b5f18d7dc75ce14153f65b052baefc0f30101c81075e0d9b0e12c89906a46afdada97f9d5dcc7774160e41a2233f9e51a49973932f61a0e454236c38c7464188fd291c8c473e7a03d4835384ae5eaa24daa0272855080147e7d7469b51c7e41d60ad1582e5c08288a89d636a91e561d0afde75b45c606aa1814733e944525f58c84c49c15e33f9d41cc36a99af19b646cabbd53e9edbbc19cf4071d345b4cbd53efcc7493686a28ba0a1ca27bcd35237e7af020414dae9999b9cb28c966d379763a313377d17b770c3a1cb9c1364fb185ec1f87b68fe03926e7a8f3ab1c449c3949d7b223f45a3c247fee725d413c64cb5b19a1c961733593f0affb667ad44169db4c24264a3a98df2d8cef772b79d4b8468c9ed659195d35259cc8973c0f60a2b216f4308a7b99e73c6343be27544a055d08a8fd80d1bc0a0f728a217890eed95d843025caa8a4e5604437b23c729f81c7596f3da183d1a25fca0f5320d3d41befc1f821d30fc230014f5844b8e8ef7cf8bd6e5a807a68641ee05bf63579220bedc59a7255d7c740a3c4f88300bff0372efe84ae8308b0e24f5389431ac13ea05ba07274309406d9649459487ba16043201eefc8b2213a7ee83ee607a2f8877dcab5a8a1eafd16c6de0b5e13ecb164feee09d05d322d5c5101f348464d91ca6fed48a990338ce600795a639b7614486c333d61e0bc79d75251c0b973f3199a22fe5ebc4b090458bb3f4e2c007ad1b484661b0f5ce3d3ed09841ef05bd92963609e87135cca6d9c20d60efc4b83fe04cbc6847ec4b3afe433ebc952039bf9acf57cf51ef4386191125df79ac7e333df16c24e9658d707c1def571712782490ad4ca8ca09fb20fc6c6c8e81a0a1420dafda4a69cfe301cf13e92121040d2e8772762016fe4eec9a8cf8c1ffb110efd4be38f8664fd08fdee4e8c06d7afba674e02581b52a3ae2b0a0050ee6ad64e40b12a5299771cd78d921589c87b618f57d53fdd863ac17728bde946ddb61c48f58038bb66ca761643a7da5198ce3a38e5828a408c23bb1e0f775d20b2c95ea3ad5417a8b445208bcf14dfd133321a18f9267be759ec260b06b5664abac287a303c366cb17509432a397042b00beaa047be30564aaf5d24c543194ef4d483631de760e8ca6eca114c8eb0e6fa1217edb76168cdefc448ceadaba8e8439f4ca3588b59bdbc8a65728c188ad38aefc5ed261ff40c887990cff18b3d9bf787379f31827d8d6ee5ebcba992f470d1aef8b37fd27947f31325fe39bb65059522b42af4acbf9c76607a186040844105e48da1061a9d52c010b464decf864681be2e27c330bc5c3cdf1469a50d5ec902e6d9e207c72c3c849a33421feb6fc43f1a06e559a6e8750d182598c52aa01d295ad18233980a456ec60af40873c43c4f25c8b6335234d7948a7b206245729d56feb2721fde01422330694aeae06dad973f2612d3f21abe757c399a606bc287ab74c01b2762e7549daae4249cdb93016f7d593de48abbd5a8a42538d3107d1298fa004342d985bb6b379126407f9ecd08e8e898b2957551590546c75475d3ac54946a8ccad4efebdfbdd36a2534cb0a1b02ab7aa3c2d487a0397a6ab841a141da54a41b7b70653b983a46e824e64516840366240b6123031e6db3424ee114a8f4ad6ccdc674f900c84d220e2701e185d8ba31a564bb59ca4d91280266eccd369428dde30c877af30c97e0acf7095cba1308f28e2908c2c1c0cb476ab6b237a5c47c345c16f2d6168e5b58495c83ab0a78977981281163570ffa5d838cf97d34e5c268f501112a7bee21a0f801b159800693dbf63374f6b0e63f04803d133eb5be9d3805bf714faec589987c75674c913131c6d5bde7c66db8d7ca71bc21cbe62e767f6c86feb699b0c8ca7c498c036171e440bf2d9e60b92465a18c562e77e62f38de2f6a67cd2d7a046f4b88d6250f76e08227291bdb152a5bf719b81b8267a70ba9d968dc385044a45a1952f40692d2e88f6a241a98eaa6c01486bb940b41705ab05de5a81f3c5afbbd6e5354291bf1423e0d74387297e49a92966430bb94c16dbd421ee9bcf046f32e69d67612496811ca3848ce663b3318f49d3f850647405c49698f9dec58a1081da7617abbfe3f24a4baa15a5e5ba8beae49411d891448e48700cdbcf2ce943ea8fefd2fa45fec1cf14e86900b6744e2abcb8c422739b7dc8f2f91a6c8aa70fd93e7f3198c122fb8b614f4be866b58caf58d8a48471ebaee405020a1022eba9a1072d7b26e6222f9e7bd12f83dc22c7b115befd369c8f520323bcfae691babcb20a92f899ec22b216b173596ef544e310f12a0960cb6f5c90adc5a76de04a3161d43958bb3a7c22bac9df86d56c27afb9db14245a6cec46833425bcab611c02282746237405cbd75348aff92a050179ddd7fbe6f53574c516b30c2f3628fb39eecaaa58f1e639159aa5d72b56a48ab6807b16cb8fa93e4cd98322d5ff9fb6a8e7ea0d3325ee4de732186341f6168d93690d4cd98b2a55ff12c4c8c5fee4622c862d9584db43950afa9f655cf4217967069ee8806e473346a877f3a21f440e8eb9afc9e062e27a132771d510299f1afd71e170ba6361a4a64ebf90e742fe57da337b3dff4b215fd9651f34ba9fa78c70006d25ae7aac866bcff927a03fd80c62c53bf27102e6c323f69b59b54fe2aa67f17dfe983bc2c0ad3c488f3d55759e224260734b80084187fc883126b8a92a3b8aa219c5dfd137a8be64c5ae84eadfb871df8ed3caf22050f99150511aad6b56f1fdd8b3644de61409a0a56e29f168fef317e3d941a5ec0776cc4af56f1dc99f4df2fa67bcaeb93f8cbb8d59ecf4f6b52eb3318c3f14755bf6fdae18c878e3f14e4209aea9cd38c3b7d65b6804c89040e0edffe65fdfb6b1f9bed50d471ce3168b8fea7a9e4ce49940bda3722615f72a1431fe6ffef4062750ec545789fb376eb838a5437ff54fe9db40e88ae2ea6ec0144eb2790f94664c133e9d8a40207401bcd0d35c99b438e6c60f2f3ac6dc5635a2fedd08f62d625583a97b67baffa86d08d972623c3ffe98582456fcbfba6342ac3abbabffa2c3f69333ef97f8a33b7473076f54852ea13fc78338a58c69a88aa7f04301649ffea718571b5478bea33c9879f4ef5bb44c41d462524e5b3bf1321e92abf2a002ba0ab93ccc043ecd9134a055da32b80234068102d7e5e7f402816d9e217155e051861b70da986a9f4dce0641148da5d2eb96beba7a09b50e59c2625e83a228f2dac6a21c9e0f3c51beb6a966cba0060683810eae184e0e6ed2f5deb182e69d41a279286fb4ee6018a800301a2c81301ad04209227cd4ebcb5a48895d4a054a683e8b7b904be469c02235a0ef266bd6df6e5f9001af603e0e1a688d778cd397abbf91386b7097d7f44e5a730dea2bb749f74c0d3fc4ec09f3a02a155c2bb78ea1b1b962905b3a12826fbdc6619740988cf52f1fe73657f926532b91960a6cc098f7cb780f924cdefc4f1832845a914f356775e16657aed485168d6fe116079eeaf8bfa066ed745a81421494e2d5ca4e230d4e060bef1fad55b9f9722b6f0c84df2a30cbd5fc426879b4122c1b25aa3abe9cd3b761018e1adc310f6621f247b92a0a1a298a1b649da4c50f0bdba5181243bda13a7f6df1040ab76b820fa35135c1ce203ddb826605877714a65baa3833f9d2d8a69268101b2bb2532e1109483a16a0adbb8f0bb81ade207ac158402b66186fe7ed01c533a71c29d92afcc71943dd4aadeb5b4134efa6db00ecd7776685a72a2c1503664334bc916f419e83d800b08f9a9b553c0268574d314b42a72ef0338626fc58c3e99ff413e2fbd347cf4907f0205800f701034219a09514ef0fbae6e19e1dacfe6beac2e12d43de89fe5c1bf19f3a35f56d36a5ffb05d2a00b595ced1513673115b1da25debc80076146ecb608447d4db185e6f29897844d686baa57b3fa396faddf030b69f663ec96e63f13edd8a6527d04268b8ea4091b42a078c306dcc719b885458382c1e5a04c46cd310cfa604445cafbcb0d76f093e94478e0c016bb66094687e200cf0f20a3ef9519d8ec1395ab78087ca7d1451bc9d97ac55f1b711a20935baf1f7157d6c3f2901f815493b35751802323cba3a30239a4d6749d6f1e0217354708477a3cfd93c2b6f8ab0ee239a1d19fa10fa04ceae60e46f750d894b1664cd850ad68fdbfab3d49ebd1d31a7a1f6c488630325d528ab38574104f85002f40422c28a5177c010cc4d6f277d3eeea20be1a8049e9f93c6f6682425646ce9ee4e45e3093c0620abb4d2d25e0378667e41239ca04ad8ce1a9662ff82653f8a0e8f71a7012af5eb9b9d41f5617974d180e695ad5a2d28686314dbe6bc78628796b82168aa543e0229260b9290867e6368ed98ad95cf9db9ef635d93dae715475df751c43215c06102fc1d82aedfb94daab9c67b320afd81c66cefeb127e48ac0409f3eb8cd77dcae3a43ed6db11d1a4a960cf34887e2a133e9f22fc3b604d1825c489ff8fab0a1bc9844937c3000097cb7edd6c82902c579a1ec159a64904e1a9a6876c94cb77b143f852cd5cac4feadc8936c7558213250b58371b743f5d7138226b437931ce5fc5c29ea52539696c3093e729b4fcf26a084d8b8af710ebea40f1bc6aa7676053dc0067a64eddf51608c8dad6e5307799eedb2264a64e9132c48c9335c71d6c1696d0e41c92320b0bf09de1d4badd0cc1939d0f1549cf194559fc74fd1fcf66f45a5c42245be5990693d4cede8afe094413fbe757e10ec689e1032b73903468eb60669369f9196fc3c3522995b8a448cc6f0f7b1609d31c84590235eb1aff4f509a5e5a4d49fb0b70b38726d525c39747b44116b886acf1637e819378ce94a66781867c3c6b92f32bed869f91c8721ded694ae8840fe0258239035306ec4475521e8d04de097d25d044a37eddea3a1a725e6ae6429d08bc0d06a793cf901266a65066acb086904efcf8f7489a0a4a8ed788e00895112549a39ccf3b9f458cc820a36c87dc1690e8df4c3f6fafdffe1f58b5cb82928a2054e1888422fb1b57826d7088bd7111a878004aaea57daa1e85d50ea561536321984be6fdb3297d8570b5e3915e5873ed295959a1ac9bce01941f5f9af03ed4c3a13428af028342c86a01ad06e3dfd22b3743fbc8b30a4f08a604cf8aa7b98db5406b26c388c06b2b5d14e6b6020f27eb2627670d6ed6739a4ecce0662ff173d3abd9072cba91f19257cbf84e23d3cb6afaa56ca845be97c4beb7801ac46aa0fb2c6dc98169dcb6e10a6c345c4f336dea75ec2c9e0c37de9a332d4c7efcb05d47ce0a071cd73dd0d7d85fcd240b28510c1717fa99ecf463e9ca66d6e7b3e08d41b61dfbe5eb206b36ea54808f727a4c9d2c4c62b7106bbdd4f90a64d518325c33944c177342290f0fb04d6016284b40c1912118f58896316ea1e4b84de281c04c4cf4e509207e4f7bf6c5242205d2b8db1227484a61b86dac9700d1d5bfaddbb61c851cc44422c581513e865bc7a250561a970513057bcfd60bf4b4973e8aa04888ea2f408d0cae504a590cfd25180b0ca047d8e696534f686995382c81b70ac31eca56f1bfc3da72f6b3d422378f82acf8c46fad4f0805fd2d0905370c9417543fabd609180b2ca96f5cd56f71e0f9b694b8768528fd426f793a326f8d92b371e91b1c69e50c6d3e2c2befa84816bf6c047ea3776779ea35e6aff7324f1481876c0f02ffc27a170766042c62bab5582be0a40e03b7c58053203497beb0065f4ccb5ea4ed38b568a46b389a4a0bbbc4d26222210653bfc17d79fed01283fb86c8f29cbcc0cfb36bba15e0f23cea1ee4ecfeec5add477c1b24ce6e4400473966efd2b3a476d3d89812deb92bb0ba1d0c766e5259eea187b6b548ec6cbe67f784ddedc1c06b4356efe780cfb7b44f5aa6e2643fbdbb367430ba5c54935fc35871bee5ffc3b263577c2c26c640bc5ef893fdb1c68f1e1cb617afe0e633c3feca745d3e78726b3b5fbd57a647bc5f7c375be991b832a04ad6f268f915b1e706e4f4614c933f839d2e0c5a588d0649527df54268172fe891b95886b00a44ee2157c5ca5a669cc1ac5baea398e9f1aa2ad5fbdaef419d5fd062d655b065e1a401af65622a97fe8b769d237fcf47abdc6b605d0ff33f68e9508dc991762390539680e5c0b45ba8da2cee1d5ca9166e002fb53aa3739e9f73c1ddb762f854f510a350e54d0b72f509fe72435cca64fce5460d2a173868bb7f537fe8c168dfc656243dc7f09b82a6a6583c2cb76265c71b86edb592cb6c67f7e8dcc2980f783b53bcab040e7e778c0367c0796a9b84ebfe189781a399dcbc6e66e7037cbd0c6e2ebf67ab08ed12b75ccb927e602c21cc495a7575fa8160b91066becdea66a5b994321afd3530456ab7b957932d1033a5537c0292a9c043abb13484e9db893ba56b13d67865fd0ab00e0951781910dc77500ef39adf751b02ebc2d099a77951cb8ec21b7f228c56417ab8437ab99ac69154b45ee17c22af5bd1c824f3020b69ceb966c8b865112cd0f307012581607c5d880bd8b06d84d693a1a98dfcdeaca28a79763e854f410361bd26fb8b4af03b955d192a90d13ebb6f8e2a31d22fa4012221cae36499785f13f448251e44c63230b5ac2e777f9bf33bfc5fd4dda342f6b699b739a7eb023101ce47e333f6d36aade497925215248eae14dabc8a025f64325a7a50e16cba3a266d692a42b5f824b08c3854c96524e3f547af132d9bd516bd959d59a4c8df4f16a38856be90b488eb45858a5f0bbd384ee09835a287372037bdae8e2cb440a3da94dd6864cbe5e9d108b085c069046821a3d725aa94cdd5747f74746d08d80238ee2911d13087d16b92ba99e5531d98ea6778e9294e9e24e173780fc59f5575ed94269f8a9f477dd3ab542d677870807ac16bd3c3bea4f3ce5244a9da29a7291141a6c8bc46043a7677bb5520885a351dc7880b8d93f406740c1f96c08e077c6dbe79e50d9860a3615e8260bdf2e0204b0f77e725c692aea3eab94b3176d4a34cb00178f1286ba146f7c89c9315244abb102289a1916d37b2db9adc5b4a99a40c450b820b2e0b3f7502a9a6c7c09f8063a2b7d35bb497b1ef9351507ec91f1a1a82f2a287f2152e3ee9a15c9cb528fd50ee668fd8811facbcd142050f3a0082e0ca963349c4e88973a5a45e79538b47fa5aa3ca90a59395d9846c7e7c85163947bb1be7e50843960eb6e997ee66d3d2cb6c7a949fbeed412dde3aabb33a9b893f18bff452319ea789f03ec62f69225b3d781f43eb2a91180f43ebeaec2de51cef050f8a07bad0bd679dce5d7fc0866a23bd6724a47f914b72e772893705351573ded83642d622b306fedc1392c9914ddf861212e9c367a1ab122b9d94abced379369290b8277aa40ff3e7204c5b579f4832970b2b12d28b746b558c2b121e0b75f675e12eeb42fb309ef74a7aa7a4c4d33aff180fe395b4c7d09a8773f9b5ed8fedf795b20e7c18aff4bbccfbdd4bc1d04acfd3bb20b99ddb36a794715d9afd2ecf30d5b36b6b6d02b85d03d137877e165576ee032d4842b8c1b77917d2abab365ddbafb8542eea5af8cca6d5b5bc699723dcfe63cd8a35d189638d4af98129a65459d5fbd66badb5d65bc10dbecda00e04ef579f3bcd29ba7c3e5f112759de8485ac4d925d5625158bcd6f9795caae5a9b56ae4d2b17f05691528a77c5788bb531cc482c5e7fcd3a69e9a1fc3ff7a2d253f5c0dd2b7d8fdd2be9eaf39eaab7237bec5ee995f494aeea127a283d4f4f855097e82b690f66ef475da23fc24e631be3cbf9d35b2f7ef660d0ebceb39a0ae92bd2e774ee5f6420f8c90d557339e97399f4316054b1fade92a6e14b35cc483f6b499a49e72cd6a2907eac45891f66a4d7b9f62c722904dce2d7c0dc51ade4aeb5d65a8f90909082e436d20c49f72e427021e4822e405d8b67f1506e754f6b512e6ebabfd532d0e5ff9f3537fba4ddebff599d6a922e79bb6a9d75895fbfc869ccdb95b607128469b378309b40b76eeb1eca5d64ba8f0091487ff4d5e74d9469ebbe0cdff6b6163f6b51ba179132f831764a3c183078b55ea43f42ca25f836245de28df4f6c15c56df06c1c4c6c87e65653fb2313130cf722d2e2f5d5f5f5d5eb87e65ee732bc7722bf795fdbabec0c4c6c8c8c6c4c0bebae815c5a259548bcb8b172e8a55ebaf8cfaca7e3ba6fd34bb62f09e94bec464aefca38f0123f332f8b687aa48796e700e1a34a8ccc1f6fdf792ee0830edab4b1e9bd6a28e8230ed168f8494e73e6aa1cb405a68dd05b5cde26b9bc5b3d01160da406c7f796cf069565d2aa1c7ee6160d525fa2578307bd4aa2ed12741e961e8a9297ae5d3b32e51f54ade85f1251923571f8cddee676f89f7b3a754e351a5b4d35f977cb6afd9f6600ec2b4c3e7651d8fa5d7cdb407b3b7447bbbd749d1deee696fa7a97af4a9ed0eda3467f4d657e4286c677fb3919d596c84dd28d3bd02e756646a34c3657fa51dee897045396a86d325deb8779fbdf5d65b6fadbbab7479b7d6dfd5dd55babc4badeaf3f67d52cabffb122bf1947619aa56227712c2ed9a88ee22e7721eae28d38dcb731365bab586b20b6577e23cacec51b267d5b257b995923164e9577bee6864de34cbe33f6f0a9f7e03d97d2e017d06321d7309e8d376f4917220bf2af1d1b9afa0ab5dafe84ac0ec5cbc6839efeada35c44649aed2dd973ca5afcf44c39f7c5ee53c57424656abfae53cfa4ab966d525fabbab5d89f328fdb2fa6a97f3d87479d3ac89ed94d5a3ef5eb3c6dc5cbca9de0b88f1fa52270c1150fa1c9901cc106532cc49531fcf5aabdc95f828d926fbaaf447bb8a106f15726b2e83b84fab2ceb773536d6356bed62c25ff3cc86547546c59c47ab524e8263a6abb7cbb347576cfad56ad6a0978ed50fc2540661ca4549c8fa545720a0a6636e7ccea39f630be95eee74facea5fe7c2a04dc585fba97ee3ea557cee55a58028954ac3ab99618d6721efd7a55b1aaaf5a81be247740987881dc6b77cc6d5fc7dc567fc0867c7087f62dc6ce24bce2ac89baa42a6757f97b16ba28d27e367b3cc3339ca5c525e605ecab8bfaa815bd722c8ae557561bfbc6c87e6265605f78f635c16cb5118fb3dacc369bcdd99cb3b7d5c60c5543da05e19efd8bb41988f596e13cfa7857bd732010f9646e623375eccdc2dafe95252547a77b89b1e9b273cf0b6343c34f6c233a9ebc3b0af16c3105a82ea552c61147d11c446c6bf55add5d10e76eee5a541815e220d65f9d613ca3d57e3ea5d16a8e319ef3d27e16020f3ca6750f9ae66922e1cfdeed6c4c1c4571a4b55a0b9ff6f36be34ca4b45ae913c1338ca9ee31f31a0974109e61f2174a21626fc2cef30c8338771787b31eceb33ae8bd598b2229204ca9ff5cc25ff23c477188c336323071affd9241ec3e85b17972d3441134c1a7bbb9d454c350fcc9035fa41ec28f59030c79bcd95273c97e8ebc1bdcf6bda3782f6d76ef054910244192835dadd0b612f85125bc20026896628cc3b7ab1e9d67c71fb306f6eb6117cdea81844392334cf60b8166913912dc336c8d9f5df2c0ba34400bd9972a29695a3843bfc8f913e58624596cb85f50bc9cc4247276366796adc1b3fd43f0ad99f362cfb03581f4114c8079028615ba90f990a10a2c459c30d2a50a89bbc40b1189a4aa3f5b5c9ea0a303983131d420860a2346aabcc0439e313c448113cb50c0c48c152086c8d266893659539a90a2ca113990f5a175998256a3ccb035a3b1c982251447dcb8c6cc9838ffdd0592fe888622316738ddd3d19821c7314a84f814d861801fee15337d1295a7017dc0273079f7710d7188432cc50af64f121a46a93f4dde7d5e75baa101fef2a95e3ccb84ed9b43b5b699a6214106bb4b43835d71f7eb0e01bbdab9749f96c98d0b62a72c1876dc82145534118420365631f491e008b23a3dc0c1227302dc4265493ce2ea22b6c4501353e508de4d3130a8b1dce7aa7222172db46113b2b667985814b628c4faec92acfdc4e2ccc2c4983082b1a6ed98bac89cd8d716da334cac875df2c04015c48c87a47b862911dbf4e7076c48fa4d969cd65a4be23b77fe8b11b416bc548706b6dca75ff54829d6f75ef05e0d0c3066b1d7d39c117e89260cc3d0da7b7fb728221a0a97d411004890e5b85d28419623edc52167e56c36239ff64c97b3afefa3f3a69fd9d7d903a9b330d415d73a67504c0150872c475ccd3faad609d925dc1da45e6d41544eb610bfa1bb20b45d4fd5beadba14da25f865f8330d8220d30ec35aeb6f6bf7e3195e08d26d49ffde2fc9d944ff5e7af575fa46146d2e8771a5d47105ddbdd65aad056dadb6ea5afd5af2c7af56038cdd7b6fad3b9aacad1498c1709be6684726bfb7561c087e2d49100449ba4baa5d67f94c37ea5fab1e719ac4157091e5b81d07fe0866dc086a1c54adb914023ee166b8ad8339c26df58f3983feacb34b08c01602ee9f5df9d3b0fb57b22e4d9a5b5bc35cb533ebd63ebed6ba1e248a733ae19067adbbbd61ffebd4e9ac178b68fd6998e792b50ac0b5566b2bfd4a75dd56b163379890a16187b026b26879c091256f7e7bc888f90157194126ceec8f2001b326861692b44900970c4f546db921e2c9d39c01c111b2cc3d5955a1609f90e20e146990a0c3a48733338d11487e90723565cb145f45e0217351a8604416953016ca1c11449aabb12e3cd0f961f71028799a91bb6708cb14352f00813503561460a4e89304123f40e9954cdb5a718c28464d9cd93e2a63440a5b7cf89386ab6797f0c1cf1826a2209963a567adb5d65aa6336449d6f7aae7f6c29120a24081c99a2da2979a3661ce4e152b209933a84c49cf3e6f628bbdee4abd8c48cef9b9397fee100c79f70c539366974cb50c129b057629a94cb86e55a3c5e2ab31cb54f10d2c34f15297b01a2849e6765d06d9ede9bc999e3a98fca687210d1453b86a942cd13a62c5828e16beb091315c6a5fe42c075a0f244dcae5c3c6891b3647c624d60872b3e609167ba271d375efb5f7525a0df4592d042dfe5c9d2068afbdf6da5bc17aeb9df75eece53768f064ec063e5795668fc1fa21b6bb27bbedcfa89d596a9966996e4ab1f59d57030ce0c25af787e00cac153fc6fa826538dc8d7f8240974fefcec35d5de27e82fb5b0dbc007eeb49973728c843c25d650036be876640970050d2e5d0633d04ef2a03a0e029025dfa006cfcd60400d065048f07f05b43bac44fc100867e0b00363c8800630c00086ee89282b7e1c18ddfb211812e19780078f05b58974a7f3dd046aab6ee43a04b00fc8ddfa2409710bc0d9e2e697c037a08c6e1089e9e023d64f49f400f1929f8ad0968e892f711e821244e970dfc901e42e27e6be89f7449e329f82dd765043fc1d7dc8176f1441b10553d64ac80c8852e89de6eb9d8a0d6c843c2a7dff2e7a18f749941c84158418d770e3c035db6f8500f21f7d6912ec317e240e8b7a25e9739c20a5ae0104759f015e82163d56505ef7ac8587fcbbf852e8f3e4a0f21f756a8cb166f05a08d84bf65df025dd6b7e0b72ad0a57f0535fe490f09a330117691e3a3f490b1862ea3fe490f196bfcd6d3bf2eff5de821e4de22d2a58b17d243c85d65036d84e8b7843e872e6b7c8edf8ad2e5d3473d54c52007e02fc84ebf2337bd8e2cc1e788b2a0825e0ec0efecf450b9e97164099e821c809f203bfd8ddcf436b2045f2307c0c99eff949dae9a9448a0ddca79f3694400000898f28b7f2023bd0359f733328b97915f7c8c8cf430b2ee97328be7e517df40467a06b2ee95328bdf25e9fcf9c57c1719e928eba2ecf92d328bf9b94cf42bb2d01b65a22f22e2b2e70f6521e7a2ed5b069384f9d1d9b65c9f14f9dab36b393cc28a8d963d66704d1123fc6c31d3f26c83c71c7c28800773950df414ed6df03757e1404f796f83b7b98a00f454ed6da0aba64b50f56ba055f8de74095c978e65cf9fee13a2cac0957ea03b8b3696a7c89f1a5f88be05b329e79ee6bcb47eed31b25983b6fd433bd309cc63b346c6422cbadc79e00ffc45d12fc3acf91fc2d9fe33a4126a8559be31d8672ef98352881519db47fa4ca72b064a315664fb253bb2fda5b8f21af89b33aa034d2ad5d85cf29fb59ba33e60b3cb302b2aeade92ee114afa27ec306bcec8fa51ad23f7512e176679d305ab4e20c6f782c1a1349492e54013079a845963643d2964098255fb5edb40fcfbd5ce71a08a0cc9c231e7f9b7b8429620d80ec7a89025c8b57506f7c5877210ac3add1f069b815d855c988af3b4361dbbbfea84abc2283927a492f2fe04e5fc5c8579aeb6bf037848aeea44e5421c1870d80244a74c142fd5890a8958152d332ebc50244a96960c2a188cc410041d16e6b8f99a520320af21bc76a0e2c3086315dfa664c889a6ac6c1fed89a66ccd1e7db86ae5c3f52a0866c1df0de1cc257f3bdbfb845284637386fb715e19f81ba17e0578c8b25ed1701e131397fbbb02afb8a27420c3316f2ac1393f326f2a6f1e6f2a41b0f0e74de52db3fd7d827913e8457781fd0cc0b76f7558e63c0f0539cfb91e8801e4aa4ee00f04b93617e8c59be60ffcdd32de74b5ae828162d589bcf1f4f4bffab5a7aa5a07c2682379e87abc4d57a980a357d3ba6a457b359bed898ce4dbc6a7ea81686c59573f24ebd5b2ae6a1ee1585d02c54030e7f9833fb0edffab4e35f0970bc15f98270cc9daec9179475d2273115d62ad5f7f615656750ac942aded64eec3311e561966856375c90137e02ff4f98756fee00f2c4380f30ce03cb10bee1edfae7ff7f8f61caf9e41bb6a5d0823886e7cdb01bfb02c1cf30fc9ee95375dacea547bb7bdfff572b32ed7f6aeed2d3e4843ba6fcf5dd690ac2ef9db72f8ab4bfeb51c8e8565db3f57c9736497e1186dcc012f716e408efeef2396d5d6629c736f9457fc483002f3b781842fde5eb4f9a6c15c7baf45d5dcf3fcc8ae668d8a456997ca97195605cba654e60cff1b45481c5b77012d75196cdc3f61a22121f22919b5e1c69be6763cf425e9ef57d59fe8e7a4fdad45d1469bed71d9affcca6e7f8f82c445ea6e7ffbd95bf157d5697a8975495e913992746297b36d7f7c9a3568efe1db7239eeab1d64cc25d09d4b9a692194f3fcc65316b2f42bbf7227fe944cfccd30874c0e0d744912a3cfe5a22f29d9938d4f0e3d7a48fa4fb386cdaf7a7c48fa7f053a30266b6a1e516587197a27d480f0814a6fc5e7f29468a67702ce4f6f85deb21044f1e932b840783278391da82019c361073d717a4eb482991a5ee8722106197afe7ee55846d96a15592ebfda442e84459ca48d0712b7271a375854c8e3068a203748666cc8714f346daa18bb9056882e3170db5a99e6ec69ae4bf0eb8f9932d5a2aa874c19145d09bb82c119da6e0d0f621778248f30ed1eb9b88f69b5a8d90defecd26633dad10e1fe1d085b5ee6447af78dc39ee8757c418db708f08c1166f798bb712ee0ec2b49dd25a6768132be85eaf757777771a75c3c66344913ae835f74f50f5bba06a575757b5d686b75e5baf1dc3b0080ce28ec00122b15808651d8ba9ee5e6bb5b6deeaa5ce19764518100441d0ce504abdf55a3a73a5903ab37eadcdde446fadd6cec09006ead5ce8680d4da19b520e82068b340f0aea194d23597265edad8b556d6803288d4ab05dfdeeb5dff75efbd985adfa0b516bc645dfe54cb71a7dd16cbe0dd79ef05ebeeff6915d7259fae0158cbe566f806d28e5290427b86e1299b19419264b718f03471d3c27366e319c3c2af3a1e304728d313138d272e2cbe3437e6e2e24b7397186b21c33dc3f074f1bca62bd442d4a60989a56cc80826b72b5c423f5cd9b4c64826b49ad4aafc6ea38d89255044adac1a13be2534aed18f92991532510e135c569726980b566292eca8e2ebd2c28e2b6258907c6139d9918395921d5b5a53085a6187152f616e7c4a7660e1ca7ba271b3068d1fb06762ca614c3e69b9ae0c7272d8f4c61c35363a56483a61b63a454827c0463b65b53b52ccf0e0405aad02d4c1a2c24496335128d1a3646220c3e6481144504abfa8a8080f0abb68b78b8a8a9e2422222292b1899e888888e89f7787883b469884705b484848c6167aa1c7e40b5be8736479b6d0bf901d2c4eb861c2dddede1ed3d93727bed461927341470eb647747cc0b56dbde6d08971268a375c6418162a854a3b0ce530b1c3395ae47879366ebadc69618c0c13e70e9e95a411a70be6da5445144785e9bdcc702a4c087689db158e9a5de318d93527068d6dc48d24cec25961fb5f2a3077948c15d1e60c1333c0e841909d2447804521d6f31e94e744d81241b8bbbf1739f70b194dbce1b2eb93b931b25dff7995e9081966d51fd8e5517eb3a6891dde78d9fefe4e7b8098a3264dd611afa5234800c14216b02170e8894af0ace6f16450eb00d2f6374898d0b37da422ce5d09fe1bb2b627a5521b9f6e2314cf84744977e572ae1916facd19d4f6f56b96897d0813850d25e42ee96fd6bc09fdfd6af6c370662d0e7188431c86427808e370180ae1218cc3212efca1f08542213c847138c48f0b7f28cfe9847b8ccb43592843d5f0fe0c8b0f5a1cdef0ee12a2c2a85ad6d11e6f5a081893642ef7cfe3317169713931f1be562effcd19d5fb686d2729bb3e4d974c4f784cb0feb914e1eb40104f3b593e9faf085875d3a66cd72fbb7eed5a6bad3d1c86a196375d8c9f76d163fc2290f0698f439cdf665d51715e2dcaf52ad7acba547f280be56a691fd2688eb1ffaa73b98bd589fe9c9c989878bcff5c8ee4aace559dfc47e6bee43171ed3afbb072d5a5fa1893375d92b9dcbfff74c9f454b93026c95cee9fc7c354e55399f3aafb715ef5ca356bacd8f5ab975903dc75e8b1581dab64bbfa0ff765d5a9c8e8a58888de88c8e889107d91d6853f7b453f7ba15151edc2e527cad5a5bab5847ee8a99637d1663f9499ea12ed85322d7cfc6006123a884110a499105e9bab08f9cf97f4a654fce7bcda55bf2a57ad5e402e9b336045b4f87e0568c8f9f835f8f84908b875a1a6b16fbc3fcf9fccdd0a9620678efa93be838db43ef8d873b5d65a7777af1ecc32107fb056fc13fb835eabbb9f2c6bb6c6e44006ec57eb0e0b34f05cdd9169fcb49ac90117c8aa35a051849c140c4b741bce5a062190f0ed8ba18318bf8eb9b1d665087e887752fc73ee5ae8cf5995f214ae224d9db21eef77798af6a7889e12cd53273ca066085f8f819f9a3a616af70cfc093094b8a1d7c09f80bf580deaed5e294f9d30f61a085b9e6062a64d1419f4746044155104a100e80c11221a2f307c00857142d00c6c04d0050a2496c8c108170489679c60b0d28488296eaac07af3a7084b6c9aa543d71b3e43f850438fbee1e186384ad440e589208a986d7010bbe4a5a1036708324da43c41d29ff4319f1cce5029f2429cad2d3e10a65c89e24f147fc020d12bc96d66e3ea44b5258a3b4ee83044941d94e8cd9f3efc89282964a86873e6872e4dbc0f6e02e7cf9e222b845942410e2834214bb3040d572aa082e68da02b489410549da66c5d61c094f5c09f9a9a3ae1013543f87af7a7a64e38a2214e0ffc135ebcc1eadd3fe1263605949e3d02a2377582510c3d506fd59f3a011743ef6adc0d3d5ba90962bdfdd0156983f26d8fc65aa5a07da8992fe91a0a87daa15f73a9d6173508e66cd929c618042d9a5d5230fa45cba0d915d4d982207803c1cfcdfa2008f2705390e03be08713f9a07d3c9489886e4ffed0cfdb902632f4424f6a225b44c8bfddc80741e8e910d153f5c8a1ef41fed0df1f1a7a223d25f4433f757b52280f91b93ad1b1f6e3287ee99b263e8dea9ab665466dbdea53ad5a2758b526a0e572823dcbf72687f46529a151bc09d4d3abc0f726f00716728c0cff867fcbaa934e2775bbfdecddbebe57cd1a3e6fba56ceab57c99c51ff96afaf2ed5cbc27ca07e05c3813149e672ff60f42bd494cb477d15e35a7d115041e25f918494babd9026b2d543eb4092870e24f7834feaa92d50f7205f484f416926aa1e55cf7eae0ee53997dca378dcfec51bfdb2372c208e7e59b09b1ec18261f0bd6c831728db6149c9b6d5ba1b6a9dd5574647444ce6287da6ed4ee9f4f0f14fa13d59ccb278ab351de1d7fbdbe24ff14bac1b9fa4fd8d467b9a38427572b1ba243e49f6c8c899a5326bd0dede309d2a0f73497c71e611dba2a82b9739437cfaa58bddaf2d8a5fbf3026c929be5833ae4be287f9eb9228de2cd2c4a7d5f278d3dca28f7d6980aa59636ef1bf09b962d71ccea64f69ba2462f5c1ae9df0db232dffac4509695ded6936f1c74cd3370b5ca4b1c51bde243695248d873b3d0d6fa22f8a8fbf3a852f3eaf3ae1179fac4ef6c5cf55a7fb39b23926be9b993568afb33df9c370441d7356fca33bd12d603e9faf488f0f975d7736c4a9d56bc573529f6f4eadcbc0eef93aec9e78d674d01dd65a3a755d860f7e79dfc18bbfd424542aeb1a3b6fa8da334f57b450bb881ef5011b3fb3c36f9393b3433c3bf41faacabafa384779cca7f3e7d3f9e05095482911ab5ab52eadd6d54a63f0912cea3e723bbb3a9c5d2b05dccc7632bb86d9d5875dab33d9d5a5ecea5676fd39c5c0f0fca2d87356e8003754d1eb3ee7552fb629aa9eed67cff6f5dd6bd6a05f79f4d82166da20c07ca07eaee20049f2e6660022b1f62a41392a2668570ad4a5fa18e724306215fef8a1ff29379deebd77cea67f6f94be4894296ef66c3ff452e4e32eeec9bfe19e7c2243a21dbf0939dbd3afdcaabe2ba94e481ba9dd6a4a0dfdeda5702fa489908ffb9bed876a4dd781cd463eee45702ccaf4d66ee4db5e4ae86f9ac8ed85de26f4446c4ffeec897824cab3279475f7966fdf63e86f7fff867b213d453eeea76cb416c583e84952d781edc907e1f642194fb7722ba18c572021ef2dd3a75814cdac01bed59c519f864d1b2e663ef0643af991b954bfe2787a820082a5a59c59b01012722bf79a33eabb0144d231e7e9309b649df76d99625d521fb622e755a5d4f37cce797afc2624d29e64ceab55fb9c39a3be0d41ab75e1ac57ce7322fa0a24c4b9a394526a2d9d963aa594523ba7d6d5b25eed39ab10d99ef36310e7ae0cb9b67522df4681ea446a2a26e66096a2c1cd1a37db4dfb974d63d18e3d32b28651660dff7086e9e43c805ddbb5f7e890d3fefcab3ad95f5db26f6d0e0e69665b1f996d2d0f16ccb637af6d7362996ed0579dc82775ce3784b11049eaac6dfdccae0d19d914dfa12a7f91ea7cfcf069adb6ab7d8939a3a6753eea32d4ba7bddcafeec6fdb2b1eb61747b0b9ad62995d27178b8ad9f40854cc9baed6bafbd83f747fbf612ed9b75bdb72d9d6562ae0e3fba106b5eedebfce25ca597145febdf75e8c2fbee0bdf75e1c82e1dc5d2ae30c17e250fbd8cfdf9b667835fdd5a5f1c73a8eeef4e3e57224497fbe34fa585d1a75f8f83d3272f6e5bd7ad26623fa9b67d600ffea994e8e041d3a79ca7bb5c71fbd4c8f4ef8f4693f823fbe1d9b356a03b68a8a3dd63f7bac4af6e8648fd54f59b1f6f84219cc730cfc11f7e013e9d2cbc01fd225a97542e0df84b40ed453b4877b1137fad8f8eeeeb82ebd9b3d82994be38f62f658cbecf1cb06f638da74fd72d3b5af8d815c338873b76209e9f3c36ef0dab91bbe4c1e3d1214e2bc6aa9125a250449ab7605f5087549ebee5ffb9686a7e7f9542a23e797b8fa5e6badf49f9ef746a49e4df0ed3e5fd18a39c36bae8b6ad19c41bfd67250af396a83f2f16dfcbec56af73ec01432fac0ac1b296764db13dc5f3aedc08ae4511be0579f4bb4e8c5beb986733e807fce074afa0e84fead3f6b1bd08d35c843525dc2973c0736097350151b7caaa3d46258020974d02ec10470e317e224e098350ca8f604725b486e830fe5fbd25aa7972f854dc379516f78e50d1a73ebf1ea02b9543a751759d2080059ce2e0378d3d5210f18dd4cb489a4339b6dfb6d2ed92a0044ee709e0d4a5f2171102735829c688ae0da134d115931f64433c6cfd6c365fbfba65fe98bf5b510e40cd3e3b5cb7acbe731e1449ab36f8a3bda806ed71ae421e9535d7339cf819a04eb9c354a985ddb04df2450417bd628c104bcef0b01b76fd0fed524cc4183b65b207e82ee6f5f8a7ed55613a944683febc0be3f08f5b77a6422f6fd6310e7ccba0c80cc5a33105a469c3b0c82535b1583f7751887f7de7befbdf7de8b43f05e1004411d74eb3af0b7dfc3c1a7e929dd83fe4c4fd5a75f95803dd5e8329efcaf35b3a5be8ba93f77394b9c1397735e9712536c5c085bc8dd755e21ebdba0d5a3f368ec99c6ce6f839a0905b2d4e9660dba7df4a639afd045b2edcf2812ec3e9a33287885aea64ab6d5b82d66cf30b129242ec7f44483882c2de022ee386931020c637470b3c4135bb28c6e7c30b2a40bd8d618af2a83ea9bb15ed9e1c8718e7acfb03c5b1bb767589e274b44ffb92bbdcbdd577ed1276753294113ce291780f2a8a964a1f3da21f1f60ba6d954d6f8a7f7a251a3aca1cb275dd6f9354371f0f4ddca9b5a3c59e2ae9c820df414fd7297e514782000fd250d0a9ebe6b390502f8f9d329b0fa9e00f494ed6da0ab36780dbec51fb93872df9737367deae54db45fd194fb79937d5cee6837f4254f068da71bbb3a21e0e953abea04c2d3a73d9ef2f80fbecc11e04b5e07d4a763c75f80018ea71f8237d978fa2378933fd497b832d7fbf2e8c697bb09bee451f0a58c92c6d3974f35bebcb1cbd9f5f42d1ec9f72608be821297f4656ef7e51100bedc45f0167c4963974f3936c8aee512cce7c0852e9dcb74de912e9dab46eac843c20b328e3c24dcd9461e124e903d0f099ff290708714089a497c208743c74d6a070e1c3a747993da81c101743c02b403ba147f851e8267e81283a71d8036d6741c40c76f5d20ea727cda016807107580a043d443304d97e2e740a8fd16eda6878c3b7489c1eb0061c76fe9b0e9d281af81f05ba22e673c0d04da6f89a32e6dbfe3b730d0e5ed755cb0b1140e0ca42e90c2e0b72ed8ba647a1c520f48e57e6bc5f818d4fe8287f2e0032de3c11846fbb7a070fc53f640c6d64348280fc0df8a814397323c80ea1500c71b40c3d0655ed265ef6705b0b14bd2a53f8e02e0f8ad9d7f5680d9db2840110e291c5997fa8bf4100c4ae5df0265e8b2084a97bdc72105f55b38b42e617c96faad992e971e949afd16f8bad40ff55b3d5de6c761f431f4103cc1dbf0a0e8b76cf4f49071eb2163efb7b6912e657c911e424ea0cb186fc303a3df2ada7d2fe9f7df10000134ef6f03babc1f1644a1e593561fc95aab572f4146fa4e6b39407004219776857a0e4bff52d71648415a3aaf581085e84eabbb3b35429cbc116aad73da398652ea7846d9a83bc36b67750a868e258ab7a8ac1afe44d140967886a828513258f0872c2d14b2c4514f2cf0831503595a185e7012e582055034214bcc842cf11559e216c8d22e61812cad922448a28e5891255e214a0523169455010244963805af18316a3ae82d0a05b2b4457e51be41108c1654418520b2c47b0ad22918c88228c89187af4f5a0b20d21965a79dbc399dbaada472a758449152f75aadbd170c85a0d93cc2994bdc9ee3ccb49a0edf4c3464d044711c6b4c3a7ccb9833e678bb91a490d0d010112e17611c919191d19010291a191919397d11b620d6a36a416c71756cedbd200886e1c5e08c4669341a9ee59c379fe6ee9627c3ef572a8ae358abd96ed7de6eb7db0d04316d4613997460717cbaf1b6a71b77acd56cb6db8d2485866cf5213a54b3d96cb7db8d244921a1212f7b2ba5b9a19a0e1f8788886a3aea9e73061985ab4de7e1a28a6a46434246a491d1cd6654331a8d44232323239a91d10c1b1985a0d135b2d5c88d8ca811d578ce983f94848b172d2c51b2aea8932ae7514050905f08737a88ed2833bb9868ec7839b1e2112de84382200882f7576bbd59d087f44a1dcbad7d9be7d35a06d447b59d26943b6da65ad3813fabac70cf0af74ed8f36feee1be1efe5956e1a9579a60f77ddd05346bdf5b3dfcb97b903d0c829a84dbbeba0ab6b5a8f9be9d2bb074ddf2309d6a9dbaa43e13ec0555cd66dae51cb4cb4aaf902ec17c5a23e137e9498873d6987302dc48a9069fe28a031f0805b59db50c6ebb56afee4469ecb282b386b370166a1e343d2b6df615a0813370066a1eb43b079784a47f6b18864f6bb565c439dfbeffc5f4de6be55cf05e8cf5fc1986a10def052f08d60bdecba6878b434cfb89c77bdff6b466a3b8d27befbd955200d7469136cbf886b846ab0d75535a754bb3f6be78adb5b7e21c669f33ee83598c5a6a03d330d4d3799603faf652fa38cff9c0d5d6b56efd59eb83f5b19e6158c35ab5b56e2914a2a5355d072d1ee90da0fba3b779f64748ffe2a58edec523fd0b9d1024ed452cfbcb0e9362cea648f60c2b63f355c6cd16272d829c6181a26c510c477ac59b7475d653f95f87401fe3ac75e3d5ba712432c946516ce093f4d4d267f2031f949ef7259941153ff4602dc77cdbdcbcd953ca3afa2f95ff3511fd494c44de83d9e3d5257fa6ac75b487d2e7a79f779fa4a7f2ef7e2ae99598485df696f40fbdd7381873159d8e7e147d2906a844d1476ad3cda4ac9b3f3feba9ada97be47f3dc5fbfc530d7cd25329fdbf94d2ffcf9ed4eef5ff4be9fcff44925e3f554fea7fe9973491fcaf755397f0da83d9db5197fc79cc1e94ffecf13418030de85a0655943729cfde9d3d3197547bfc233e6439e70cbd03bcc9dff6148a4c4aca4f4497f3933e4913790d5597449da9b0f3e8d5e5fc21327bbab6a02dcec6592d4ae845a222289fd5741db4f8170f428b7fa1751404ddbb48fafc3d923ecf24ada39fa4fffff5946ee69752faac896cf5f8df3d91fc5244fe77fa7b5aeba8fe244d648b88265f2ae9f56b4d444927e9599748f126bdd24b2529bd14037f59bca84b4fca4a3a33307f7e0fa54ffa1e0cbcd6e9a6eee03ed18b445fab3d0937a59cf40c642d12113d0ba2cf3a5d07fa935e4abf148b2fc95df4a42e7db378a3a7b97c9df8f475f7e793afb34e4cca3a516bdd7d0692b4d227bd1403fa95f4d4490f55c95cf42cf22c7aa30c8404ba8d9e8415245016796e5df449459fcb24d04d7539070d1a3488cc452fb28b4c7b91d6c4c7d17c7f452ee95ef146b9a4dbe8837893a8e963f18b5e2ca281a45ba41c50cd03ea6af2e98ab9c5a22ffaa29fd5a28a349ef48b9c6181f26c5abb80c7acf1a8fa9ba916e9d0cf6ccb494f1f27853c8668267a320fbd08d6a288b01662f7f8b396018e418306edf1b38ebea694fe0f7d7eaa9e483ecd5977ff9faa9773d2bff8495a775f8b3aebfc49df237fd2df4ffad77a0aaa2eddff9fd2f9f3d09399841376ceb337f3dc4f8eb3e74228ff98e21c6db9b474dfbe968378d3f8a510dfe33b600949f758d3f1c3793e9f4ef129b96dd9ee1add0ef0a6eb446a6dfaf7d6a2fcecfb349753aca4d2e2201c3468d0a03d1faae672ea20536cd3683f031f29cfde519e3da86a4b9c41adcb73925439d709126775f2146c889355eb621481a7204f3244e0c9840b0563132e0e2390f1cfc2bc677f8b9a90f8a775273a8b40dee1aed4e608ec36100fb2db4547c8f0e77d289f39d91ead716002dd54eb08ec36a881d89964acc6065fac632db365f84afc804d5657ad6bcc7b80b36d0e0d86a965de43d91292c4b56cfb475087a4bdfbd5cefde65275af3793cea37abc63d7cac91250c4cc5973a68cb80704397eba18f9f2052805724a145c73beda586922eaf1610d162d4abcf400a60505acb0039a22ba0c12e3e5cf0e708c3c3196e54ad71f10b898294226cc141a58c8a3a4cc0b64bc02bd1004d7123fec48e125858a23d49c411226414483105e53a4941943e3e3833129e80102ca147cbcc2b22a55b869018815decc20848fa933442001458d13236e443c3c981984458531265570e698085450d6f429a3e384cf9ddaa708962c5fdc7889a325830f0ab879120686df9e22b6c22a0e60e54bd70d5e390caa12610054fab8006789227cb0846df40411674b063f37d4c9f26113eb810d16132c28d161f279020621eeb47963e585277c3020832017da28616264cc9d2a7c88a8a14816288c10416acb9c3855b2b6447972ad605dd10153e74b136ed0f0f0618622509081f323e3513ca04b9a15be06a55153254a0c081da88843049a332e48083d67c634a1039434225c912150154db889e2e70f5e61caf1e24211b22850cebcf961aff86800cb22c20b4f28a7499816aa6c65f130c70901ecd4d9c3820f498a3811ed70ddb9b2120316a84e1b1f0b00426b890f331c49d28348968021c0c08183c49f3d604478eac1ca0b3f1b8cb0908377a940e688228e3c21abda814b861b6a88d3658f135044c952c44d951a7c5a7e68a9f3831b28a460a100286462471424659618f3458f94098c61a1e149201bbcd488758e58a28a3842583902cbd69712594a18192285d04e1b167aa0b2e6cb1c1b7c5c20568787346337fc2026d2f9e345258e162680ac94d9f263b380868e117efa042168e67920105712605a646c00e3a2071b94ac90a489234c00f1e2d28587c9113556423c5536301142cb1f414ad0f11143505694316c7e4fd2d82a274062ba3c9982431b2718e0e5c588335581ae84854e54c04b9d19c6ea48298325021422e2f8e0e54f1910e15813577ab89aaca1222bca8f0f5a00e4848e9e3e5cacc43965579e78020927eaf809c2c7971f970c5f557298c18f2827022870081436c56b09d9c573e749561328107185aba6ec89a2458aef6b4b880fa498c3040a5f9e29c8c23de4123994c9c1073a6ba08840b505c31612314a84c911140a0202451c2e4037d0a0c49c212377c28e84b103840f21147bd00c81756507ab89241e280b74e7c8923d7fb0c4385a02a500c5d79f1a8e84bd99008e151d9cc8b3840e1a383ee6a8e0e709b1417e9088e06de61d25b400e9899305cb9738b694421476c2daf019228c8f3ac62b852a48c829224bd716b189b9664a163e408c6df590e4c72e8824588842501b3450de4c3f5b8c7801cf153d657e18a3c6862e4f7e592a884cfcc6f0bc50832fd012187eb81d1d5424414413699470610a0d6e7c88c3842025b4d484bf15543831868d1616d668f181825513587af064c16107186e74526833050a126260f021812ac6ea5011d4c29614ee9511c67cf121d01f1a5e5842c99629b4c480a5099d991c08844d0145133c7461391121871f9e848f3a368ce9b2c267092561ec0e4954b44cd1c2953b7bb47c247da5c07567cb0e2bac808d28b14706416c50f8a1aa888f013c69a342d693185c808291ecacaa9a24f91979822542035881bab6f021628c1b371cac10e648123230f0f9418424b05461c5c393377b6010db8c60266b86372b88f9c923c2708394344cf8bcc004a292f287893150c6ec60e60c903128c01982ce1524e41cb1c49d262ba499e2f526900f0bd88007cbc80f525899c1280ca5500497122a5ac4b411e10a09104a6cc1724510a090ce44c386862969c8a8c061881f5284b08365cdd72f0929d8e703cd0c542ce1a10928bc269b1fe29209f664d09d2f4accc0031d6b0304f864a912e68d1a397dea9d69041b2e5bbeaae8038585352ddae851e1cc97415a3d6c70e7ea852a47ee3861831806585a81ea2cb932041811aa964db584852a8e1054e54543113503d00a0363840b191b347d70c8e2840b3c78f10121a629810c0c75e6d8f19d1944fb1224852a5bbad8c04213416159965439d1a70c192f28ca5c958531d246ccd4d380a4cba8240df664494a2a65cd88000000006315002020100c08454291408ee5a1aaea3d14800e7a944076561ccca328486214a4903184000000300080800cd1104d035360df3f0f5522f4701ad499d7e338bacc7de485eda06454eebd43c7b9adb9a101170bdf5928a61bf4c88b8a7b8a3c30af5e252606235ea510b723799402e8436b05c37020467ecce66bb46caaca0c7384f6998185716b9cb597891f5cad046acad908f48cc0fddd0bc40ecd48f6fd51e344d62b98f1c86fe0be226cd2cb45c12b8ef9e4abd4a6376798da9b768e36d12b4ef6a2918f00c40007f56df3fd743e2a7a7d8baace25df92786251a2fb5cf37573c559355ae21163595bb38cb5f4c0e39d91e551fa8c5a76c3a53e14cec385d5678b79a009dc6d6576dc472978c8850aa753ba565e96076db66bffa3ad66aa127293aef28ea4d4aaae160284fac55723646ed9a1c095d24870ac5e2b96900fe1283874764e50e98817b4be4eefbd92ad392b8e718db34c155dbca1f7d46a64340436d9092addfd75a47905b151283c86868bce3ec62b8c44310e7f8400ed53e0b90b92e5fb6c49700262b8bb8899c43e73c100734a39a52872d3535a85469f7b74f90789276ae99cab8513fd84dd5cbb78e5f2fd29f69ab9106e10347abf9020ab6134f4fdfe3b8b40da6d5e034c0461685746be61f8ea09f7298a7ee7e51c81038682d3ce497054f95dc311e2f4aeffbe52d63865fdf7469bc6ed655e3d657f81b94c922238ae717b7044bd0629391d5b1c05e6c9018b036217a08fd41b2d19c165b59fc9db879c2e4c4fd3f8b0a11a5ffd7b328895893ccd96654ed727dfad3b2e093dcc18e599e44184ca7b71ef921fe8d7906af1a80c5dcd216bcaba22e44ddef4ef16275e31578a837dd6fbae6bc7f2f83b3bf9c066fba45aeb06567e9de506588fcf6ee6c63474ecb7e721eefd44d93312e818efbb8ff171b77091941777993e218bb507289aa55a5054933e2524aeb652d5c9c0d2f4ed0dd43aae7630993ed259dcbdb83f8ac064efb27ff67ab82bf645f0d2d66ce9df954f9d6628bd616b7e7543a938d1a14c3e1580f3c0527fbbdddb5fbcf42a32e891d1d5648b62b512cbb4d768e2010ea64af719ea0d056fa49e237d87792ff9919559dadf53f2b5a825e7a63157bbf740edbe2cc4428001e70e50f987b6132a9f095a30cf8d5ccae26c08a3a5c10932ebf6c1519f348f7888f41ddd484472bb9662a763ce459e93f72d9300fbd68405f18c7b39ab680193040d7f51f6b54f6aa2ae177a67bf4e3d1cc1a9e34c3b5858d907a4bbb99c2b13e14241116e7f55b7c3a54d9a243cbe60bccae84af73a82c21592a14647b80d0c69942488ffb1e0f985a43172f5bb7f592e684e095299de1f0edf29188074a6aa67cba5258fd184669c99ac6e7ea277c5bcc07498a852b0acfed811642bab5284d585130c561060da55a88fcb72356b0e17fffbfd34042238abb247650b9b97e52238330def4204c4f286ccea2f4de2e6c875bb486ee4c0fd19a6d5a1ca0df7c6d75a7ceb216704dcacd781fdf988f4cb7213fbdf776e5e6abd868a06797646c9dc8977291ab78463d3968e241914b631d8fdf3c8155a48403529acadc87593990f9e973f8b4fa4e7990b9653744e276016e7490290e3638cee63e4483c6d4e42dc701db44152834e6174b7de02dae1357beba68fd9b7d61e957a22d1b2e2db20e5c092d4df45af000cee8ace8792fc40d2c6e45dcaacf4c37a4bb3ef3a546c97bbde2da1b4f6b5701aeb7d891d28a6c35e30ab0b1a13e1cbf0168eb2b3a4ad3f3f77d3e0207ea51b373bb2691b7c79f770e2697a1731835bdd8c591928e3ffca2b089bc025553ee3ec5497da979af559041ea96f8b4c6cdfb348555bc742a33d19e6bd16b96ede85a2e0320bbff47359d860c08746eb26a628c21f4ad7f117db70f0cbe19c68b4e695eb1909a4cfb0248148c831663d681f7c82408812f0ae14629322a56be66a9c11171cd220cb764fa2922d69690e752a1be56d87c81c219cfa7b18555cb61b2aa196a9c71d15abd61ce2f90af01ca5a99ba60202bd9caa5d65a36ec440f93d77f7f7b5ba10f8b663a0802627155fd2681bd5ce73d4a200ecd5f4fb9b6b2f948b6a86528cedf7f0560f46fe84f9d3838475fea04f97eb8c2c4a4920b3585a8882eb6066e4d665ecf67c9ae698d8764c55a3933b8b02e2f0d7b20059a0c9ac4b1a92a22fe30dacfab323de5b44c7848d034e642731cc59007bb1bd0ed6d64a564b020af7b9444949f6776b2cbdcb342ef321d12080693a40b97c61948e1a7609798bc93d97295442ed80181de69b2d2f1144ba75075571736dd08714391474efb655955a80eec17ebfdc2b75aaa037277038ae6dbd674d3956378305b278bdb577a5a61f1ea728a912799ff4c80ef7604716fbdab334719d1a79c746c2884972eb08e625dc180160a55213b502cbaba59a693fb28010104fc954090a63f96a26f6bf0d80c026ffda06224b7df62babfb15ac63e44e1cac0edc71628e97c4f7cadfb4f4a3e3b232d487166219e6905dc9ef016fb6886db392a0f4e75f00b4a184aa82c4f06e4f75d0878b303eb61d30ff2be60b6e8627d17d5859fd71581d617f7652651c75fb77417e82cfb9046989a056dfee4930cfb4e92dc9d661f1fddea5b3fa960096202dc77dd71640c7253f7554ac999012f02e82973626fd033845c630f47a15d8df70d18bba481abb6b116ab1186e43f8faae928eaf883533131fc416dfd2561163b408626bc3174dc40a3c30d1472e4bb5f571a3019688f60bf70c21a47da0575dfa1a361073a4fb76c4b6b5073102afb3602661a4c0da9df2e3887e4288d6058985743bb3832e0a927d0575c2ad5be524cb50b645057e55c0e6f2aec1cb11145c64a9bc31097a0e4e32c872c9cfe17413f7addc6f0e5320e64c3fd60d3ba782ab183b33eb4d73d4c11c159c3fc636737a5aee9bd6e65ee6341a609c7eedfa4630491e6e99adf126f67e0a046f85c2e4302e2a323dfed5fcdfa8f5b3bf67d4b3214519853a9f946539e72a3be6ef8dc30962b02a4b62f309a25f13b3075f599f88c6fbd1ce9afe2bc95aa81f65857ee415a3ae460a957d4ed3e0233968f7cd9351cdff98680453e129f1d58d3207fe10ae12b0c9a1707225b231298d90d42526a64e8c38544bafa4130fad0651b7e777c493e6774629ef94e4829adb99190afa79b7b8c11b4fc39828302d7d6040cfe04107624d85d4d220920bcc63e1f1ce32293f7960df2a1962d448082c4f6cff9a610bd45994c95f738f585018a1d540165c7b142916cc4890419081425397ae83b0c70a6e6106e89133d3a117bc5fa06e216c7d9c9c4c1ea833bcb54b0983940a34ce3a6daa560f1e3562a281206cdc22430a42de256d2906bed6c18b2bc2f3bee165af8d45e8150c16fc28aefb5b434507796afbfc4572f65184670c0382c21880bf5711e0c796c0f08d0a6e2dfd0c1defa82270b7bb481bf175412ea196a35b1d082ee01d2f50fd8fe14ecff81c86e25e559b4326e00a5bfb22cf54c72b6fced27ff51a0a059e744de77dc61123ee6009cb1a5ddba6b9fb669b8a2b5de9d8bcbba67b3a55a504e196a98aa3ac12aeefe8d361a0ac5b8a6c0301a36f349b71f2f8939d2a98af3e725507c02c23f40ec0dc030ac3aaca9d088e82dd54762e2a8c5a40134e48d709eed643abc529449309effccd0ad335022005fcdb3d38ec804548e565019797c602c3ae4c60ef4ccc03fcb4ab0a3ebd197e721e27e7a758651542e9f88d4ecbddcbf7ff0a8c67c623d60b11eb459dc4d19d4bb70a9d9c65670d0056e53189cb1c99c6add6aae8f5c07af35e6ab5800f2860ce9d0e2e1b3462527d1370a56dc6da1d1a814cdbd139c72ec43307819458ad494f7535dd35b66627705d3bd6fcf0b5482c7828f0f97b98949668efbc6f339a35646809a187333ecbcf33d8cf6c9d11005cbe0b3cca613b621a5d8d81806daa8940f3d3624b12b744845a4018875368cc3a5971a7e19ba143d8fb16c02ff38b323e1eb6dad5879ae723ae710f4fcd1b7a8a0ac6c5e2e4a2fb378486d27f31c92753f1d50c2c5b4d9536659314807afbe74b4bbd03f115f9542d956b1f9c3e30000abecbc3ebd4331bfff45a804344982af4542249ab76ef130c6dcbbefa3531a3b800b1c9c448fd7e70055428e7e589c732ac9623bd5152d2c74721999a1dc61d72ab3eb4d72b05c853b778395af1766abece4d679be3048b3e24d322b2d39c8281589db0536de5a20ce4a220d020225b0969cc532c90911012c9ec5f2621ba38df861d467dd86d3faefefea7614224f3d01086b77fa11f66a403db7506d4040338b7165b8f03e7d7909d1f82586c025cd6d227d8bf296d80bd178af665e4a134f9257d5a66f2d00c9da1e8f6ae67a4a369848491b8b31c1030dc3c8278a016dc783584e27ec0e6ff51051cc8d469722c8d2df9158d5cfeb5a14741542e3b747569251742454ff453509735d50e35eaf794ccd3c11177b28c605dcf77f86f3a41686bd745f8654842153747d9b4cebc0d28561a37ba316392d84ffeccbc10eb4471a8bd3406f4bfce86935c6f461043112321b7e4e4be1735f9c6be25924528bb8db3a7547d3345f50d86eb7a592043253f838edbed4f257ba2faa1af00f60a4ebd42f7007c2a07174a10dd659f83ffadc0a9855ad709d767f62269524cfb3a3d04ce0617301b82aa98ad2f654074ad32393d90ce5430c1f5483f5fc775d211196b5473b64766b91969be392ee2756ad5b1f095960aacafe8933613623b49a70585cd5c15145292a167889ac2a933b3b489d44897a53a535856c3b91a837c9cf63664570a16e7df54bf2a233d1df88a06fda44379e69d2113c0ba41e5794320b923745b16a606c34846d79408dfc0af5e16580c331b7b74a36c67ae3001e03da91a4587f8bf211b2f0ce5afbc4408869270fc216044a45830140668e7e7f7c9adc288eed77ccdd366fe21d77c334f05d56a25fec3b839af0cb2a3944f7dee9eced49e884355021d162620213603dd9226cf22414bb43a8d7637a4d834654217dcf33958f6187040fd9abad950dab911a7d24207d8081e914b7fa09047bab535f0513a3ea7d6817671a2be74a30e34820bf12a2d42d1b4f31329a4ff0a0023c0a10876d2904080082b44aa057695947365817804ed5a9c40c8de51250ab6aec9851d53df5c61ea075e39ca83d486389516aba0135835e4bd475a73dcc1f747a1baa318fc9ac829fd5791313594ae936bf68e0613e16cd2cd2fc50282ed6d9bf39818a88bf72843e61e7acb11383db2daea7e6be5ebdb01c34a0829080554710de03d3e8a083651225a8cc9410ea539ebc03e58ef7a456515e4dd93484e4add34dc8c551011dcc4b7b4503058231c9d9b049b5f0ac50282e96d8bfa6e8994e936548c8a15e629f01f845e8becb0d891c3363550580bc86922d4c81efe1dd445352360774f9490883ac1cc46d2764ecd8def1d52b0a92f6b077522d1f2924cd6ee48f4db0458fb2476c8427fd554280a98e0908d08e1b640d5119e1233862085de81ea9b9e88ef68dee3abb12389ca5a590339ea2532e2a81bb5227c482d0424b531559aab4162148ad50484cfde6783cf7d0f4acfb25d9c113efb0e6f1ef4ceddd63f8a3d73d277147906846af2cd1fc1ed6069829d34641b6084156152caaae9d9deea4844b78a1507912044374c6d82340525e8d44d27c5b186b2da121011e069829d34f044d8b60505158b65172ddce2b895c27b3562a137d2fa43b3ed2ad557157665d3f3f04eff4697441eea58a89fe191c84e765a2e997088349f6ba145d56b8508a60d85b68423557371fb3f5aef67d45c451e01b5d5860ea64cc8098d3a9a9676ef90fb05f0ed51588a912a0cfabfef2b9c56c1a95dfb4f99013641269bed055546de6a8ed0cd63f031f9e48921840f45bf0951dab2662c59a9d00798664056839b91b3dacb8a6584c0d243820ccff9029e47187ee2fa31f30125d1bf8dd1633df1c2d02ffb4c9379d8a15aa61912522865a15902b76e310ae430b098fd7408bae698d5def41784abf155eda5f9384345c9eb16db8ab3ba757cb357cfcdd6c48dc1347fefae0291959fb2b08439d546c790990203c09723ce9c59042e192f7f1e1677f9b0f8e404712f347a564a942da2bfd21ffc6c85faded49bb220f4bb78836f97a3f0c62e59b29de4a85ad33e8b1758ee27a934db3d42d91328dcb25b062a077010610038934e58711c378c27683df4f6cc81591dd8071dd39c2337e25cdb6d74440085b28273e485b5a9129c8311a6e9ffa0a5e23c1035b536f8f092a70a1533e825ea80fff6318341dcb260cb480813675c38d05ca1ea8fa021402caba10ed2fa10ef4a97dbfccd1c73862119b027084c7803ee40d3873c63887cc949c00adf83a86afdb786a5835fc514446c24eb50b93e4afafd5264227b924bb7eff1fd498a72aaa7822ef648a1aea79098f4cb36d18e71f8166e2a80a64d89767c163918282259c695ae2406f8526ae1ecae7be24826897ae1eb979654f5d13d13db3a40b05c763477594756148abe8476c82314c1a82d7e67c198161ba29e016229d1d4b653aa548f09d3ed6a6ea7a36f422ce9caa1e7acd8b8562b6197b5de48b3626f994109dc18a972fa8d532ef8027ae202e5c856f848fafe2f409fe10cc01abf32094138f01a4bcc829b9248274bb29d99a0f4c848b99d53fac5281977c9003253c0da7d457273e216135752adf22cfcdd151e0762010f925fa24abe685d5b03dc969e21065d45bbfacb6452becaa6c85194483619d6b94926e86f628c3b8b7e684d2e786e1e1fba56fffe61d17fe797ca8310a3e208bb0f6cb97ff0f97a6ea4fd44e366068ca1d7bb406b12dd52aeb91032eaad60265b3589719aa8066617b299a8399c1dc5a18d91f08ac2f7788d42ea9d7cc0115b1f4cb0a76a27b1d3509466444184b918a3b090a898148bc02190c1c46ec0a013f2ff98bedb560aa99b13c8cf4cbef7cd49182a49ad22a3de15089f17154bb4f0b3b4206da00314c7d04990f76acb1abea04efbc8f1ffa09ee78a3694a43d6db9fec409f2f192dabd3894fa3985451599bb201e9dba6aa0e897a4ba9868e0cd6cf56f291c97ae0519620abd494f0cd147a98527cf22ec8039d3b8acad6c82b0b951006e81d8dca4ccb745e3ef6bc62997c483aeb0c12aad430f575c141d84930455c15543acc3bedeca086eac93e1f9539e84ffaf8345fe3b21cfb09137e2c14282b66a3110ca67f743180d6c813aa9dd676f2bf03dcb60cca44e395c7834204936b36ddf2b3be58b3f48d58f2f4d9d9af95efd0a7cbcd45347118ef97f3a0b13216e42641ace7c6bb627ab3df43923425c0453158f4a3f4a84bc1013e6fce725fb70852e42ea8d6943bf2869970a77a4859ea4832f07a65a3042f559ef74cc9904c437db9c3b619134f2b1cd6fd9f948d78dcce471a788812232a11c03d9d18479840042ba3e77c86250d9c10521e72165ceb45e0dc52a61a42613d4378e5e0f1857fce344ef09f4558a204fcaaf673cf81a3ea41a9e06bbaf36e2dbb924dc5e6a7f6831e9a5d473aa1c6dba8b5e9d0c299e7d5421cc7f262edaa94be4a1628173dab827cc15c3b60b097a1857d19f3c858a0dc2029aa7a26aae869e80e7944af11f732742a1a10a3f0875cc5a04ba9e62a577d48ade996694dd5b2b4d2ac6cf10439423e6c938181d712ec337290792ea05ceab300461e7cc11cebc206cebd5036e09994cd6632cbbb82ef994f101996110c3a80b910173cc3f13ad3cbb16a9c2c5e3adc679db04096e38d5cbdc02d34250df77a2bc0d3c24aee66ad84f3c30894f473652e8cd3e8fd02fd7f148e2581357afd89c52a1d6a96bac5a0007a60646c9d8e1f3ed48287ea082e47c3ec2bd8dfbeca935d81de100317105efac6d3015bd1fc57b5b41d78a074725054d31b5596f0f763857d9503dceabb04059468c4c0ecc8c7435a15446272d1c155fa4768312c70aee6fb7b21096b5b5efd6815305b56975d8aa8210ebafe20f9cc8822277a72db4f9ef61a13dd6b2b053d5774aec25c099b36238dcca066d69328250f891c25016c30e42d48a586a9ae63d9051084b3152e7decff1778cedc056a61c8a05f29713b2a10db1c0874c3e1b5f087610c7111f0b26ea2c0e0b8836750971d8110c99135a4519400f86145836a410701f00120e7d8984350a4633332e2af0be24dd1d628742f63dde33e35878da6ddf2d87831489087550670fca4edc2ac159c81045d157594270c9810308748141028344854e520021c39edbdc2408fe9a781224f6a03a5ef61b32a1d8635449ab42280d98266634a72f18ea382b42090d52378e485e6fbe45fcdffb5e1b01d086d7371ce8f6a4e7b1bef48b52f63c0a817acf83d95c38b96e2d800a5737dd1ef6d15a8d427e396ccd31051b8b9d9401d4b79271b80c2da418c110f84fe5ae1e88144c2b07605dea6b88a41e0287ff84ada77c1985842dd881a88ae7b209dafb66038c93811f242af3af505b087c60e0e31ef51ba4ad413d2abc6a570ea20ac0c51a7e6653a41a17e25137e294ef99e5d9959b9c067a70540d21eaf44c86bd5a76a95f47ad05ac338f30faf6d77d2718472046de2402f2df187590b1933781db2156359a3f99a413e19a7ceeeca638e960154d843c50e456d53245972c102dbcd9132bfeff72450cf757a9dda83de1c263353e42f27884519badeac26698b9bdbb95fff3e01230763d6d4b78828a00fc4c2f98ace9b00d22a6bebde88da0ae9c4014005964b8229cbcbaf5a525412f33705f34f0c151796b08b7954b34be07110236d316a9e05e3466c08c5fecde37a6f033a5a7bd5834743de73268b616b0d8bf53175705f6b848a3f09da7760155faf0835c036bcfe9b5ed2bf7f740def0e0191104a1474c18d0471c1fb2dd3df57d593322deed0615162c858e00c804273e0bea6b07a1a71a854972d9f4e71fb2027f844437ed8f0c2bc9188da975b9bf154049b45517610737e269ba6ba058b3c3073d2d8e580e118f3a3cf1f718af07d2683a5bf2fb850813c6e04e7ecb862f2872b61a8ba1af3494a4189043142d86ee08fa16e1d95344037d4dafad4f3492b1a92f8d928ccaf8d192613c8171344ace9b4a30bd18be7a04d714127fe1bed795922e4a808642516b6f0cb77fcd3ffbbbbf48b413075c3996398722fd97f3adf653b7ee042d3e4dff003d64bc31c150d9b710706e46731423b68885140b76e98f61143bd1d4466ac4c381faa5b7cb7dfdd8bc8ec1a81a3247470c3a4a15371fdfc2585db0714166256f094f50638249f7e2dee33ec450ec01db14019f4966596494534a1885e4112be455b54fd209080886e8afba813c187efd4f93f35f687b5a956b413b49b5c6dc8343c8514c1130585969bdf8dd4f12c3b01ac4121c318cb09fd9973adf58a575a6819718ca33bc4bbd040862754b50affde976a05afe0866a2d0e8bdf2d622d3905917ced04213d07e6b008223b9b22028fa550c1c970115ee8ceeb98ecb43ab48695e23bcdab1cc30cfe65ae3fbd3a101532b3eccd53052954907223fee50a4d7b24aa2d461148483f5624ba9ce4d88b601bb411c0cdfbc0b75b9f1b582512727afc03d9cca1ec38346dcfa8077178cca789317dee466e8038e5557685393baaeab7f88f1bdfe41565c38ebbc02861a43e44f3275b4313504b9a6b2969026387d02589a6e09f5a8c434f539d7b174780864978283e72191c686fd175ec41c83b185ae12b1cc4ab0ead5fe2a5fe2f3bf8164df5fed2ade8b065f216cb14576e119c1e29ef61ccbae37a01d78042ca4b7cfa97eab2ab7c040522dde05afd1a8dfeb73ca7cedf18a415121c2436ceea45bd7396d5f72639e7e2269d8094285e203005b654b988ef48e77d9d7401867ec29ba7e8355241abd130c6d6a51536294e7f816a8ffc8430f4ea81c4d01e499506430903868a2ef1fec10cdde11e9083b412c9de8b10c4893f41e131ee379028d7ea013c92a3788b7b5712ec24707242acef4f4c114b7a96d7b2ca9f6f3cc2d672cc0a618851a4b24378a1c414c2a69f13c653b1f8bffea2035b55d607467c9dfad0e561482b012ef667f6802411a3a267873253e94e703439aa017cc355de63657ff3d0f76f9a04fe7c0f4dd3d3a38fc29a38c4dbeaaa072dd92ef86a42e11344a64211090f82d00ef844a857be3f137ea54bc19061d71607f22d007dc8026cf9943f00d531a309d286dec5612c9408d45498f015ed6ffc6a3af23fdec55b2e480c8471344a05555b88d6893e4d98e66ab9e3179c169bf394c6ea0123ce6ceb5db23f58f5fd051ac0787280492af7d705d7cc1b7297919e39260322244caa4b6a4db153195d23244516bad65403967dad029ad26fd043b8a7aeb16730c2a36e52da553c899a62ce514a33b6404ee35e958fa328127ca9e6ef5a073c70ec947b0052b8c01df534192016c9b38ab9f42dd803724de8f7a91a65ece9515306d4c1743acff6dd681088b77ba61f083611cfabcd32de827d81742c462820682700e6cd2f74c0d06e5d309427097a8f224a7fae82ee62db8a22be6eb444e9a01342583fc62b58012e4e75a84c2a65e59daa4761e583c4038d73b48d1654c02f67462ee823e0a52d0320ff39508e1fae8c76773a1bf0e0846952c9edd50cae6e1d18a77b32a278eb736b465f1de033f927c53889bc0c83ece7e8c30e521b903428178a3cd863517beeb88eb045452a6e8c10f8fd2c71856467af4d903fdb13832230e79a772a6ceec4af29ba3128990698342c33583cd8f87accd8c54b9cb565f0b3441a7bd4eb1f49ffc1c13b9a70e18e86ec3e4e759e35d4f0e17928a27a0570c01a1b6909bdcdaccd0c2670d3a3110a81fd418229090ff65a20d5f2770747bae9f0f8520f51cf9155c744460b853c84d669f80ee5317115c3d79717143f21ec271db7c14aa7aa20adc3a911fb63dbd2c3af420a85212cb25cc1401462204b7ade9f81c314cc0d7cea4b1f3ff7a5a6c4477f6ffa49f6d67ced50f210a4ce4d4cd6aba81069ad45f12c93c0c2be51f4af9191b413e18b07d4cf444a060a83d40c71242f2b6973424892a10977ea920b2f95a31818edf39f6cd7efe035e6d739755a2e4dccf07e0d1f2d5323bca38197090c7cb585038fd0585658abd4f097cc0944299b8de83ec00a9fb56a9d189c19195f2e739344cf1110c2c7e4a8d28ec7520ac29faa2512f08b2d3bf3a2a15e463f055825f7fcddd27b4c59cf118637a7fc9f0fdc59dd8b8ef7048f51750c80e80a0ee2f389542d6f51f315c6ad2ac7e59a9f71781878627a01f5dfeddb29cedcc73ecc8f48446e79eeefbeb06061b60aa94133d1851a07a19304d2d8b91908c3efd390dbdae274c4b0e70260b79992bca0b995864ed42039a15270bfd3213c48198fed4fa65110796a4920f4d214034c09a6458790e15031fe94e90ab888d2188a33a200aabeb36030f744a6944e7d1d0ecac2db1ec19dda5125af336a6b5700807e8c31140ff568703ea073155391ec7fb1211697e39ab34cd53d9837f2b521d75a9fd22c348dc8ded7652f6870877ac74571160ad7a705ead71203b661b28cb7800de5ade1be69dc717463daeb8181b655108da7e4e133ba488b40134684260a667ab39c608a50c5f902cc959e1c0c9a2502e53bfcef1429ab2cc59ad1536118c720e61b475f98bfca71aa55dc893c660339f99a7d4d9a16bda53540678ff0b1a2ac603b83d7a63bc3f3c05ab9669e27db6374d288cd98492cb13c9927784b0f4c0cb5cdc322031c5fd0d7ea25f3c93c0e0e04ac94d336011cb2a60c8febb28c00bbd5a6db9f04bca7006460e785e921e2680c829e240e37e9ba4ca6c6dbd57e70aa81d5f1c6bd2ab6c30375f70e55ed615bdb87d5f6b7dfe92292a510ad8e6537d76c238f370b8dd43417a5f53963942d9b61eaf12405f600830cc39491b8e3f322c92d1875e600acc6de502ed060591a60644c08b53e4fbb96927ea0f9099e84e8e83635605244cc6593d0011b1b53a2ad0353956601dc71122533a17e02e8421f0ff6be0800bda0218fc711e2b89166358830a10b41f6a6a3a6d6e71a68333eb3d34fa4700fa538742cb71708638b421c99ddeb4e88b4e840f540e8c9c5f2db4fb5647d37b39f84f32640fbc7199210acf03c1f7019265a7e429ff86644c48a3388c47596fbde5705afa1554b065ca7ffc0cdd0d383d6710c73dda8ace9a7db5843f1b83c91de82f168538d6d01fe7742e68385db28b76d78624e8fe940cda7bc3e84da4b23b23af0fd1f17515036827f0455fd2ca5dc5d91dbcab9fa49dafd6ec4520060ebd95b42a44dfbc6f6d1d83d1f4615fabc208bd5039d2956e96b6cf58d8f2b9e856853b4158b25ba07d0b1d14884ea347a379ce0778517f945880aaee93cc6f27377f06f542b9b420253ec7c7aeb8e8472fbebc7a795baad717be7f1d3c3c48f03ad51d400d6f8d40c13d55987ab261566e686aa749ec534695f11f663ff947b60da2022ce597fc0fb34ec15f3e3918897ff5eccf1f07bac2e362ec7c86aa73cf85944bd1e6ecb20c307eaa1c649f4382c932530b0c4fe8264764312710083d456ff2a47bfd1cc78793840c83037aa3d59c1d0f81cc6d9eccd30ad57a0c0e6d13983798a996a80905a0c8d90a37ce066f73693332a7c8efc200522ef1e015d69360b8494997d333a4f4cad936cfc591a5a3330867692b3e26f8bb810959ba5dced6c3d3ed4b7f5c636ce9c04a84e4f11f929d49d4d4511e5f21969ee445d0e0165a8afd473548612b885dda606ffc7c625e995c3d240e27552f08ac2b15cfce5ef19e512da9b5133e1838c87161e93b24e0522a760a1f8c48ac5a4e4d28853c63d9c26435ab6cf732cf2ffa8c5f5c296c12d0e22a19837c4cf5a1b4be55964fa4bd75c1e6bd46f823b1d7dcb9fdc3004bb589633a5112158b2ce8ec0b74eab43b4f99afe9bce21e88c703046cc0e902abe8940462090e1766ae49dd80a3d5c10592f67b59d3049ef19b4aca9703677ce7cc7538481eba145af590ce15ee1963807c51deb81cf9658f2828f0ac726074ac72be304288d6e0c6a640108383ecee783ca6d41b2233e0850005022e68bac2ab4a4865f2fd9e967689315e403e330169b530c9f1b5a5016e2ad6abda1fd8f3144f5f8bb70c8a10aab62625b930624bff0ed2cb2bcff5ed87b6126d77a7c4762321f65c2a284005149073bf312cc9897567c569f49a555bcc5dbe3bb7c4e222ec34fe623ca6bab2a5f8b2dd85ec3a321b57685e6634814f5173103ffed5982da3ca96abb2598009b37d14b00cd3588bd9aa522746652e93241e31b7484092cf56d8b32cd31fcb56f60c7fd26091175dcba06fe59a0c5c497c6f34ad37eae4c3879bc859504c09f0210c1e1b7f5bb8dc67ff3b9b596b3601f01920b57fe6a4e6de4c10f7aff55358f9f36dcfc4a3f4c070c769366bd02a93498c226bb2c19d5c36317f5cf50c6ebbb0431db02d3c0765e331ddb16636c16428749ce81d0748e56cf2d3933f8ddeccecf1cbd36ce0941d5c948bf7bbb94c9cb6ef0a9ef4ce346af930657bb82708347e47eee4c42370434418b279a80464a2449cf99d725f15975facc1b236218c4641878c75d910976070f13773a5a259470497e848835025954416d5e37b1aa1fa514855818310da5e68a4492a093c7afbb4f792dbf1df293ddf57066a85f80b409ae4a7cce42cf67363bef90eb49d439f82925b83b92a45715c3c75b98a552128c36f7d2da06f077c33d90250c98a0870d17056fe8a5f13b836ca7e5508adf8c8277c6eccb3c0698f071bfeaed4293caea8ab6a5493eda8f32df573b786fcb38a2c102399276336cd832c4b2790922b127dde5d3f1f516945470e27e62e34e7ac04bffe2d2b3cfc22f0df40c2fe939062f5dd3b9d353a529e2837bbadf93d51a5ed13fbd7abffe068bfa30e205b320b53040ba9e64149d40a392610754cd660437ff3b48a29237cd14dc0e944b0090270af7fc8cd4beb764186f2e6e13d0fb9fb73772ba89678010cc8ed65b30ef5de7d4a3e40f2113b4dd9022f0df50cb7ae3b30c96f16266ef381f86ad58b922f6597f2d1a770890b2e81f9793ea185a8a162d0131992fcea24e0710ab467a49dc02aa631e2ea66f7eddb5f2b2a8bc3064d34a5798843f2454e12898400c2c08eb89e0b70bbf65911f75ed06a5a2966d5783a2406c27b13db449f8b64508cab6c0d3264d286897739b101c4ebc90b0e9c42ebe9726cf26d173f2564e414c58bccd4976cb550810c12d9f9736368b2e20e020240fce9b9e0adc77f7479b1f7fd67bfd672fa34c95c75546f19db2b47cae86aba52481b449340a7613fb2a1322f2558590494847e931452093b234608271c462ca31a972b4b6a2c1ce102878246401748d9dfcf86ab65577e4de1c018df6a6ef889b3990486fd6cd1eea6dbd7d4596dc9a8706e615931ee039ceccce7ed5394a1ce33322880130fc6d82d70c54667753a8c3dc03a75bbc7c1830bba73009250cd9f12fb175bf208bccb8d6a43829717a7c26fccdce67dbcd38a707c5be3b3e2ff81c30c342c79174f37afebd8949f561856601aba33afce703db49d086fe5d7d9b2117ecde06e04ea6518d09592f348d23295c631dd8bfc4a3afebfaba3a9bdf441c4a5bab5f8e7d0f2bc43822b7b4d40a0f68785384f5800809ed7042bbdebc18b47ba7dd0709927165897d26e0fffc280496b8989a78fc82a3922827134d0379e34723732132439b069285bbc3225b5c69735d947910238a9be754fe3fb55ec8ee8f1f7ea25de2f63c5c25ff893e64bd03914444d3f2aad3b3b4928811aec53699efbe9e2bae7ed9410341813522d605b0456f618d2bf4ecf185dce1578856ecff3e666d2ff82152dd65747415480fd74b724c522aa5e4eb1f12014a9201f9f284a1fff0ca605737e58d7f3c635bd1374f59533c6481b1c69d4ecd5b751366782f5f6e1b069c51e9c92ccc7972ac708a135555f4bdd9e80a0f0dc828a26cfd1ff7547121364fe626fe00f6efec41a2fd33774ec33eb94b107fa917f86d8db62f833d23fe42cd237a91a4074d9a1645a99709d8ab5dcc69a79da584516d16d283f3ca89b7a53ad56ee410848c460874cb20a7ccd30e5d6492d7da04f8e2c1fbf26aa0506fe7f471c7865b926a0a1be1b0ab038e655f71f179a08ef40998b2df39e6b60cc7d796d6f99ffa92aca33d85feb53d93b5aee22e8c408f2f34890dc352df3297ac88b05c539aeb5b9d4c7702a42d2ba45f551036d9b7c9a863b6893af9d320423aec1c8c974b9f6a38678cbe64b94ad350127773b0fff9225dd27bdf124a38692ee280b7e49d0d6fa646d81c5437f9a95e555770eb3b5117ec72be469180991aff029ab20f2f91de973dbb5ef4e4f69ffb9f75bad01138a8e9fcb0341a35b1edf97087d6ecda132dff5d024993fddaf763375e7d4383600e27be7f618efb7a89fe2211c72833395fe292965febb7a55a22f306a3ef82325c281fe5f271c750c80f4b45d71f7b0bb887b2933103f392c891ec7f53f22baec770b82be68367f6455b2c697356536c7754e74d873cd0013856c7e08f81912f50cbe49cf0a0a108d2d94dfac76405253dc07b632a32a953da5275f46faec723a770a9c7c87dcbfffe87fda95afbc92439536b57cfb2ab16cb71bf85ca13d5a96823081373989923be6515ef4f047ae78cd37fb49f366f16446f793cf066639c1f205d565287f64936d70ec5587809e96f8ed83011ba5658ce0441e560cbcb8060563a973e93925ad6225bfb0b10e2405ae395ef2d16f973c298e891924208c5290a851c82d7c418eef4e5a09df5d8ef2f79477d9c993182f97898cc0a4563db3f8f0c24851426e93808674f098b1ee0da719e38e45d6a57ec9e151bfc4943056bcbf45f05bf1e94ff3f1a72c7a620576a26a742951ccb0eb5525114a2a0e1af4c8b5e32b7f6fc285da2c62213da4a000c250f46bc46928e65334c4bd63afa541f564c7ac72b4c486e1235e714ff418d55f05cc349a30c88217d46cc87777582a49a3c354172411dab32f317a36b4bf15ec8af8e5009f8cf5bffeafeab6629180146c3001eec45aff0d6e07207fdda676713f699fa58560bd0559dfc614820a40749fff886b8c5f049f23b415b33073c131f3f5ed9f875431aa4840604f651c6420077a9c8a67028a071e3b09ca5904b9dd2590b9416860c05f66fd50305c33be05773edfcec2f72f847ba18e2dfb5864a170e916be5e7cf727d8d6e012eb6e72c4a46425a5f5f0e0946a86907890aa7bf188ce0748a508dc2329752e2d3ac6a1d7a28fcb7e41e83746269ede1294585ca2cd20ce4aeb3584e551c4cda332b5516f121c14181aceef9c2aee1ac20711a282f848ff61da4190def1ea872769a7578dc13b92fdee4d1b0225a94563eeb34046d8faf62de039e45216ec7d4a76a67bbd9075ff3efdfbd6f509d3b63ba0d152dca69c04ca21014c448e25a2be2f33c4b9fb1237e57d4687d7554974a1a3961edc607af8588dc960128747cbe7a75778a3c02554b1011d5e0f978c36823a4ab84378b6d29aa96e8b513a04c56d2ed729186cf25b51058399a4451d44c36a8c80efa6421d1614908638f5e1d1d324f97f8c4f0898f83403d821fb9a3c0bf02b9a00764c7c8ebbb1d347471403ab7d5475975e5e2a416e1857621bccfce9877b36862e031245c99b228036b2af0e3815d8bfd048a1e1c1130f146219402d3841efd4e8e0e0f2769da99fa10caccdf3020050f73d8bd03374864daa2a8524257e04016007fc0d79ab03dd3480c06d6226ec46c485a4677f90fc2b197ce238ed4b97efdb1176e99dbb86e84c7d8bb2bc92b822d6326a649861437c665a27d609b91d7cf94384fc177622347e8da54b44ec3cc3ce1eac1216e563c920e786e013e4ba92128336ad1c6fc0468eb580ffdc1c42575a346c103c44b27b8b1e0068164e7b882554d1f4287f3f3e104b7de6b9ac7430ffa3a7f4ac0f068879dc464d402062519bc6207177ca12a386b8d49e52945f680ba93d8355108737383280a1030f806890141d398c6f347c66e08478db52f98c8db96f8ae9a060aefa4a9091ecaddc5b32fbeddec4bcc5e30a8024355eb951fbfe5353357e98902cd458d66f15ebc9f23708987ea1dea707117e9d0c308122ddc533a68ec8ed060e27a351e712f8a8319e03b194723d0b5c9f4fe3263b0648257c017d3ac38a103595772ca55c7a1980646385ff820564a087066a9701acb4f92a1f2ef91d24808dece54ac72099d82c89352b637fa6efb3b2f8f6004c796d6ef6e3286b146533a04be7c3c057f14bd1716cd37d7e96bd5ff2ae6dfaaebd496d3503a7210420a7f0e9e39375cae789ef91623d739a7e3c8c82e1c73c165c556470bc2bd784683580618a4083dbc35d330bbc34732b20c0624ae80593a899dd4305c63a985ce292cc1ea03b69bc226761cc7bdd2833025bbefef9b9e4ba3befeb2648d75f2757287cf6f421f9acd411818e17fba652718d2cfa50eacb2b920438b25880aa9dd5c1bd7bc2b1db7027807ef313f3d74ca897a3f4962d45b07ade0de23ad87d367f11e0f29737ff51e013440de8100f645014939a31b46c7335a41d9e3e7ecab6e59d1f3fc767a9787fdb0a41fdf38f921f6e2805cb9c39ab68714d07effa2a8c265ce69343a9ced22e57dae6a6d36cc0916c74c3a8c8cf88f69f449efb2aeab9414b2fcb5586bea0e873de68a51e96a95b73b9bf549c9b87499855d73b861c8e9915e66913b9f5793c43b119cdfe031f1ce9b9552bb51e3e26b9baf82618adb386436744a3f80039068429635883c6d493f12d23da32fa9826349f1768837cb592f503e5c299229c0158375e04c44ef71548fec1b4568012c7ca6e3419607005cb079f451cd42d11df57fd8d32cc9806b1b98d343774822b0b9266013350fc32454b137a4c27be3a7c5de5cd986f4ed97bddfa2607e861d5f5f77818bc930b470d2d06f55799fbde53fc32afa38f89b7e0cdb1fcb19d72ddb034fda134b85e57479389bb81a136445cbcffbdfa760b552f8b827470d13f8b833287bde84e2933547239f63c34b44a60726ab4709223934ffce97eeca27b8ad2e48ee3648318e91bc9449e3482f80ad2b100dda5be18a8e154f5075e26fc3062a06123b2f667f2f709e2370129cf5c99a68878133fa67916d0d9c825518db75ced399af4763a0175c19ba1220b7bb10918150fc6cc581887ad0f78e3b37951a01bc293af86c1e458969d07087a061e0c0e4a5b07bf3ddefa7ce8ec1b6578b2e584f522b9b268766e4ed097eb75b37f1e67f012457e916d1b3b1b15224b1a4746c1dfda43c83814df20bb65ade9ff3cb37cda03900bcb7d64faa5c87e390f933f0dfd64cd821730202479106923b2f2ebd57baa8542b025edd2076951c38083cafe9e9bfdca1261f56c4820034bc4da5440a93e22a1513536983c3782f2d3c4178eddbb8d5c59b70a1519843a7351cd973e175aa17ee117f9635489b395c5b26119133666d82a4a32c53f271798ecea55eba81e9d876b81b52f2c8a47cd9d1fe7f088eb0c485182b8ba44ab1ce8d37b850e96e6162cabf0d7565dca3f2947f9a0204e853a15107e3b8ad113878c8da5905d42daf3b2be2db9c07bb79d15240594e95a988daf425461949daa0ac78fedc28b9f04a2d8e9412141cb9087e494551ba8c9dcc0b9f0bdf0431feddad7e9eadd457c60a4cd8d6aeeef6f6fafa9c50b3f32805e448d277b99865395a9b8afea114e53acdbb5849ca99b3375677d7916aabd026aaae0e440df5f114962f8ab105b6a2d3964ee85e4965e7270cf35d386db3d02c51b69ae6081386c3c700b33052b5c581d076759f1d250a6917a51976e5a56855cf79f6ac9e640631319dc0399c61127fd47eb4e0be4fa59356fb8268323edfbdc3a11841fb592175cd7f98892c9f8d6e3cd9713ac135514867593843f7bc93bb82638d2fece5d074af1b35ade1e176d16994006d1d42bf0df55ff169099d57d9d52c9819e477e5925f52116c97939ab1af1faaa42b77e4521a740df87ab6a20d5624978aa3c8a6df579a67174146d6166396e71ca971bc1775110dcc0c690b998fd1f5e5dea9b631cd3eb6853a1619559790c06b9c53f6b8b09f7f53a65c9477a12524a4882921b265cd6d25d2700212e134605ab5009870d8aac5a23678bfdae47e31636b8d8582ee1322731619a167f21eaaa951ac0ae22791b8a3bb259d38b3d197be249eb3e06fd36bc2f3146e75075b5e5587e07082ed457d45a30709205f8d52b5b7432ab85d9d47993b546c1911846e33ab3cad2331a2b2d5c88783479d4cc9c2722ea2de9be350673c6760cf8c0334a00cc9a8188acbc152509cab6d8152ca3dc05cbeac31d6183f568f87b47d40aab909eebd031820f4bd206822223f61100c50de2c46e9534345ddd5bb14a6860b7840ac2d8f18a4f001783ac7f7c4db7cfc3182f2a1b4fd083d8428692b0c808c2f349471a19190f52fccce24f93d13446e1af745f3346a61d695f4741e98f4913fbba83d47036dc39b15a8f8ce4b2f20081a8b3836e83447092381355909194cc026aa72501d7cb94ec448993479ac88c1308bf627fe47698db06334613e2db3bf4756a2d0341d9337bbb98550fa2cd428236661bd8ef06ad21c8f16b6ba87dd7b5694d4efb15f6ef091201d15586692b2ea84ad90166a7b4c02b92df270b1d4a203bb391139e981b2e5430dacba359018b85a1517c972e5514d30e9efab297f29a04eb8af1d86d1ebd504d9463799529653a13f7620a99377af4d248dbe2bdcea5cb80116a6af855408eb6463e89f27f124b331428b138f06cc8a30b5b9ea1464cd403433f7eae101d437c395edb3114f0d0a16a93e08f72ad6543ed3b5b6bdabbc59893c16523489ed71b55b08c09f74fbcec227604f6977546d6f8faaa18da7d3481f198174b05c952795c76adc80bdc3424e8cf707b9dc828f4b54664207ef9d972decf16967e979a79476106558b225957d40903f655234ade272afd6b19abae2d366ff98243f2868cef3e1dc3e6a5916804f3c057dcc4e679d6d63bd4d2765fcd301190eb2dc3de0f5da31fed49be2ae35a3100c51d966343e88b3b0c7c638abf1af094b802916558ab6e91d960641957b06d2d4422e7d560f0c6506d6cbf061ec68ec206f9a146796793685c967be1db53df4d5d831675a1d16a27651504091fcfb71a9b80adc75e672eef2e633defe12c715cccc67294e0f00610722719ae635da759f83960a1d8137d8042c4577b5c0cea63cd982a3b07b73986bc6ab04ede19e970b3190b3f04a8d2a5a70e55768a95671adabb4138831232b1f3d9311878819c8d0cb0c8f7f99c18bc808c468c18d87bec9c4c9c40ce47c658e4f842ab491969084b52731f8376924f4b48be239b2676d6966911f21394e0f7cc8d08f6d3566403656d3bf1dc5285d212d23117b75568fbb27ac698962cfdcccb5ea2a9ba279b598d00759e115a870723a5893b5d177ce767182d83c764439ddcf5aa330e4214edeb5ef9ab7d79a88b4c898db1ddb2135f3620953b64c8504f5bb82980a34252222a12adc87d49d2eb16354999ea3605fcd5b01efbcb266253f9646b1f6db5458d83a97607f8a9264a374b6c334faa8d946f27759101e46dfa45c0b8f255dcd16cc2a064c737628e3f3f1b018009263c40c83b3c8efc40d01f5234d51f31a338f698ab0c31b6bca2b6117484fa4c9c4a390b419cd3d192facf7eaa4813d1977704f41bd5b0bb7f707417a5e025f1851dc42ca08b22be2c905b1b0e022799f1f66d305279981faedddf6fff550d855560b06fc1f21c2839ed41952d051354f9ab83904e9ef7b818376a26cb06a36d1308aee40869838460575f58a70f06671b1a69d01f40a64b6884d93f7f359c971c75b0d5c5617cbb47ad4afa554b93055ddd9c47e8bc0e5aacee15aee0102054ac5503bc1da1e4da5ef12322f5c66cc35b88440c2cfa59403228fadf566e815f7d7a2ae45c3eaaef13b21e774f3c0ace009d0a85eb56715cb74d061cac3773d1dd25fb33f3d987bbf252dda64d14156c4a46f3906523ca376e30dcfea6dd8c2560dcb68e226759afb45b20d9a21fadada9ad1eda91c0fcec2e3f0b216192e5ae47fe8ff31a8c1f3e025e7e0fe1bd9ee9ddbe7954c38b2b0bd01c4e880d0e01d3238debe82ea2706f38992913e0d7aba43517aec891f8c24a73414c8d9e1bf22a091b0043e9083b80405a28b644b003a4a7e12ae1d944c3fd6831b825aa85d6bee7ae7f99d857244cc3ce301f651ee71f61e9bfd2b88427c5733fc4695b42240d855c9fab2c842396ec0fd15e9ced8b85b2bff84b3ca4782d7282774e25c5d2f43bab2d6d70f1c1d2b6210d89776a722efe97e6f84125f89c7dbf8974120ef66d615685cd62df6215ebc2fc5ad7621e5d6bf2153697cd54c56adc5e45fa36156ee84b3d770e97f085f55fff9b712503616a411e4b5dba9903301fb2850e5505b354e414146b68ec6dcc2728d8836aca36d98c6df50b542af543359268ed85bfcb7fd50c08a0e4c3d725cd59e3c2dcea3be9c41a35f14cd5f7ec47c46a0ea0b493977eeadbf63959edf75cc332a7ecee656d77bae600c6a71b48613ff7f6a617ad5b08c4b9bbe6da03b36aa9cb20816056cc2fa33d3bd6295fa8ddaf0e2d1fa3a96bf900a3e4cce1be33836f0bc5ea2e3ffbbd29bf2238056948b546f4d683cd2b480a419f4fd800880de87ac69e0b91c6f4e5dc0899c4bb58a3a9f7a7eab4a28a2cae798a988678ade1d233c3055623fca2b11dbcf29e60a275b963e48bb68a477dda827f5b545f4429dafd4f09c4c75a3413e6f9572ef9d7f1ffb6306b84d6320b4e4ba5d02034549e810e65705a78712a15f07acd38feb9110ce97881b49843fbe2ac05f0769daaa6876b4285be5b08b297d730ce06a7058976090b3b12086ed5585a5106b66e9196bf8e82375a197e581d3304a7fd01b6976bb6cc37236a39d9745ba67385b8a89a08b3401333fa5a3c386d491c3c43f1e3fd6f5a31cd66876eadf2ecf249808117e2435a236163d0f2072dc76f65ecd64ef2826b348e8438038c9b023889b151d96725dfe431f793ec11786a0a9845b9279a5c957e747c1de588fcb2cc8adc5871bd7e7b674316745e43837cac7f93bdcf169a47438988d126c0ce5f32618d04e4d53d7cad337b8633df2c9e29a559af3929a438fda89f7c1be45accb8964a0ada5512a1ab87f498086d935be700d0dc8693283d91ab003e42c33750e92942b0ca240a3915e26c7d8af711d48b916095c281ad17f09c5ce078f9927ff1e3251386b02fe2e13641fc542a85df3bbd8b94e1fd91bdccbf256666dc506e6a7118bc674edabfd52bca2705ef42b9cdccd5716be8454ce16ab1eb936fed249f01e17b6935523d73dfd022a873c0cba8f06b1ccf03849453919bd10c025f7dcfe5abf9ce47dda71f76944b83db10c6f86ead0dd92c188fe78704cea3a3d343bb403fd9f5d358960e3421660373d20cbfde28c26239bb15d50c58845c1c0ad73f3232c8ffdbf11f689a24ed8b57b67551047a4c9290deca236a096415217c234f598dd867ebd98fd61206febdc7584ff3085ba2f0ed3fc16564dd7c0f6c8427e1c1486648f727759c3693d8a8e17aee846f1e500958e65d066235029767b43e8f423f2dbe144a39b292f19fbdc348e5df3040ff78dd2c410a03f9d678b3ac16ac19d84b1d5a9ffd873080e5369f858c07133cb3db6ba0efbfca0e3b0ffe05db70aa70537311ca201e6de3bf16bc68bfd8ecc995a72ae8d28a30368d2bb435ebac1f45e31d31d17322bb28b18f9c8af88d2944f78660b00e26f22b186b7f2843fe76762d5c3bbedd1c334285fe1f4e8c5fb687862ac366b0089182b64a16f316eff471af59ee2af56080521f7f0240727c7ad8bb43fd724c8d5c1efeb7e55e209dce43720c2faa428014d07b08dbec6e7e6800b92d0f498a1e23bb815ff77cd3d330591524cd041fc0e268a4e94f706800af7256f2baa60f2fc87999b1774a53885c174ffc2d33553b417ce47294e07072ace858ab547d2b078a3bc789604c775ef89a19adc88f801f38458eb26e8ceb610abed0be0610ba72089f3c8919e30f3149b199a11d4def828f444b603ac4ef5e69b470e0ee8e06a2cfeefc1d593cc1cfbb6c30506c5d2ec96d326c30da84abe4a32eabf660b2b871adc41da4ae70317bda6bcace7d28b4b5105be15e1417557d467c950f874c51d50cccd720935457952e73aafa15e5dd704bf56c9a7fce9c309c57a103e1d031214cd9ef8e1b56956339e8124cc8681cce5ee84c13d561f2c970d719db12747c66c4caa3c7858f7d17d39297dcb1c2f30fa708dc4bd80f4083eea6a6972503dc5433a0bf0b27b2172b7dd4fd368603ee51923fcbe6c6adbabadba04a6bcc1ef0ed085d3eff0d11dcb81dbe322866c58d93c9e0f7f532154437a96a80ab84822e4bcf7c644bc0c5d9a320b9b71f84ae9e9aed41a53115b07503fb9dd37e31c7e02fb0ec10adb5e638ce5403ab0259ab8bd581979f6b8ca684ae7dea09cad901868db54f3b764c6d9e865b9e2cb2f93b75c4c77413a325c158adfb22a8f159625bf6541d07803906c121d7387b3c6dbd67ce4a278e943540838289ce6e69df593a5fb7d2a47c9a853539966423e5f237e1c6b282db3d555b67ac493aae4803c2795657ea1ce0698d9f2143b6e56b9d3f745cea49a9d3c2827faa4c629a3f7fb4784af695a753b7033ceb48a7687054b1ad4af1a076d0d84dc13d21a92488d7e407a44442deb6995d8d5c5eebf9e8a88079810c48e394b34bd4371890bd1036dcafc751d5476df0652ab1565fed8e852331d52ec1eb854bb1625d0c8dcb468a578d157982b45bf0e111a087508a879a1e73422146896b194cd39479dcccb2766968c8314f113c151bd20ed0d6e87a1a1ec492e06424331186664f7670f34abcc91ee0b0230d6fa75bc034247f81024d8c72a7183d930dc539453d9521fb18d1282da1f10cd3f815879e3d310cd33e36114cf3a6ad422fadc3a38463f240f7c7084c609d692fb051c4ca7dbc4460ecedc7fa34dd3773b7618fea51f08237e6f69fbe22180f10035fb4b67938fbfdc094e211b49f5c8381c5417902af069ec7f66001e5a6f71050ef68041eaf0b2ce0e66e3ae5bf9af8279a4069a05fdfbeaf49d0935544af142e1134f2516ea4e231582b5c6bbc7be033c0f6a708a2be9525174700643306c86fcf2092881f3373d059893598fa6dda2e58f887fd7c0fec0e349400aa02c84d8d0fc32c598c461fd0c4fdee6508015d4bfafa52580d3d003fdec126121e1c4411b6756b3ea0ef3d274bdcad48baa2e64c745650b22081f7f8ca597f03a757924cd2a7630210479c809c7b6a001ccfad2f09e2c82dde0d1eacba427a5fd7a908f588db265b0795728026287831dedc81d1d0fa8a628a919cdab9e0c9d41d6ebfbbde77cee514f98ae8aae3ce09a063e3cfccce9585b176765cb5a11bde31ab2975e9dbdc02dd315b9cad54c4d92695dc3434654a0d4e61c7fb8aea717b0b4f151170a1a76c6508be74dd46e1045cfc24a7486d2cfba048ae8baa28aafebe16d7e8605eaf5811473c9f1a2093efa8312fed2d68902d619b8e7fcea13c6d04372246661427a98ea654a173a931f16f69dc9ef6349e85710beb761ffc4d3820d8fea5bbfefa556ddfeb180b6d695f26f07e9f1ab820245f52057a5b4a56e19b36d671635334900d12d37f1db77060352b3a317f9521b3ba46d6f12974279952bf540f7692dddc6359a5f0ea9288cfc412a654a092889d323b951c19238c555e74221724418ca43927b8755a62fa0f4393bf242e9eb438d538440072f8f65c6cba1ad201997d73d5a0495b5a86a4c4d10b010dbb703f2f112707267efc656291a232307321a30cb7b6702d4a9ebc4b2c954ef15ac00d4540de4d8c108e7c5fc1262d58de278e4a581d6d3f971d82f65a00544ffef1341696ba4edc7ee6c4d833272c56870593f22150253ea751f07d517e5290258b19dc8712b1c6ab778ca29fed71207265639f85a034a2e018528f70236a7a5b2a6dc15b1184cacfcbdbfbceff32cc5c6886aa8d474419844f1c93f3ac8f88fc7c8128f133cd6c27f0bcd6dfc321c78438086fd0bca2739d0945213941f2802a48e8bafa3b9325ea796ca5caa7c044e4c729a738ddc850f4da4dfa2031bdafad6243ebd950c0d227f6237ad047cbdce96a7f768a5b29ccfd628cf69fd0545891d7133eaa0a23ef348a99a76971ccd8d94e5cf5160fb27841d357ed318cdde1a84a89d2632927eea4b1e26bda7237f732240374441155e13155ea77437eefe6321acafc5c62b664c5e72739a47aabe70aef15ab564317a6e2280d2b8dac79cceca9bdf10622639e74f34bce785ff4c8edd345ced2e33724000bbd931e2650c59bf48e8543ec44d37dd4ce2074e4198e1dbdf6e4ea59bb696bb94250c847319ae1e11f36bf2a83aec870bee10a5152b666400edb7ce39c456c55c11aef9f4b31642dee0508d2582d275043b68532938f7f94a7e1ac365fe379092ea852e61ba198e307ba71d7f24fea3135966adb11e28b601f7906aa23b14656bff94ac16fd26865d0be09a67a4e1d434d99622f783e0e9853f278fa4ef3750911d92e3b3ba9dd7f86dd94f7d96a1849ebee4c2bbe1fbf174fcf4fb7df8223fde793330eecabc3f66f39feb3260950b51ec0aa19b0c5b1874a01ccd5e2a19f10f10febbb8fd8ca1c09ee69bbaf2e79f04be4802828bc0e64b6b0bd55cf57b12db8b2ae9837be2ea0d5cb3e3aeb80c23cc4e83d396d2914b0851a927fc4e7e2e45dc7dcf2388eda72e31344f20d9be44e3ce7c1614e0dedfd131ba2452d924d1a3d7a0e16892710f29ccf500219ce0981cba52781fae9e450ecac54358c3aca75fc0bb1afa43ad47c638a5ce19da592656b16254f6b74332ad0139b454e6c74c82ed09da304eb3c206320ed41c447d0e26c791e6330aac86e5ba2c86ebbc04527d0d697594c452d262ae8ca873e3105c9766fc15c1fba05a39d35af63c0463727d9e7f231189e6af342293cd06acc92b2c585f10dd842f1c9ce961e1ad7394b72489fa75a3b480476459b5ab42d50349d472d33f0979b1b3cbb016824b0e20c715f90c1525cd43f6d8fe13fbe5da5d3cd7b4daef1b3911246114c7a58f0ad5454f5b102ea1c151fe0324ccbd0fdaf93c91065842cc69c67c44a977f4e82ec2e66c4238cacfe0cd63a62502af2db91919f81fba9dbb15f2ce3ce2878e732e37788f416983c96e86fe1c912627ad9a1088a7ee132e29b1a0abc14c2da7a33d2224216c9bef60c4163618b19f4a99ce8fd700182318f456947ae0043129e5e9870a93b5e88b66697320f54878fb230f176af42bd7c511d22604e3b1b60c7d298bd1783f908590453d241e3300976c162950ec26b1aedd83992f877e9406e5b21dbe3b80f23a83d44f1010c22aa15ca1af1251ba310837d8811b27813ed951e11ee6f8efe11b2581b4a201b83e90a9c5b8b88ba3e007fc2a11da087ccf6ee95d720e5e6fa181eaeb7c90b636217d34cb868aa74203a6451fdfa4f49b345af930f9eaadfffe6e116958adcb977608cc58332aa0138611a18f837646d85a84f0264b158326b37165014cdbb73e0ecbe41d7a4de85d313b291c5f1871aec8480be7914b78d062e4e93431d5ae0830f1eac3ded695eafadf4d1b34d14b56318a36577b853f2d20c5fc6873b243cece275d21988cbdd60ff4ca0b4641688d814b6fdd7f6e8b35f5f492dfaaee36928e3189c71728249ac4264c25d1c628e56877a3fe9cd950cbc0e98460ea8391e26cd2909471a2a0c0dd5d222a1bd1f04c3d0f693382ba2485ac910f4603c18bdfb4a9b3fca1b205073bdb0701b774b11406199793f1381743e0033d62d498a0944085dbca1ab4aaba454abf7d186834631a17653638cd0cd16be84c3c99a34c643af2c071f30a6d0e98aa7dc29bb379ef70de3f18326859a12bd9d1cd0b68773af1b2f482e58d85427935ce30a3ba71a39514ac400a8824d6f15a2cd48d89629a98e5e39632497f4c716102c67281196e6f2753b91f0844263349333517ba569c483954e3a4af7bf7132300e914ba6815d4f9d07d113b72710c79cf8fd673845e10040fed5de6046ed9ba625863e71b2a7388b3b52e1b48026e7198f6382f6d374389e67bda5321ecea975011380f112a4ef0dfbd9dcb9e98c59cb26b8fc18c512a9386671e80f2a7a02776e49251db1d255719849138d9ec21cc2ff152025f32e088439b7032bb39c37a0474bafe18799f4d32b927d112c18eb5ae565f5dc2bb660bbf7232b7d7bacbf79fbb1ba1fcd600a241b61b6c0e00553e2787cac5fbbe1ac8338e14f55290611676169496ab0bd04d9da86fe7c54f265ca4c0eee865ae01077d75f1354e2bb43e1a265caf29a20fd6c8c7e0a706f317a3d8c65ca26e0b83ca0ede45e7a8789c192fc63362de7e76eae54acfcda396f0789401f5885c0a43f751bcb2275c7eaad91757f0815ec04c9db3a2ec5a59b039164f743ffdc46a56ab7d2081ae5a7d78740b6ce2231eebc5ec531f8468c021787d192969a1c893338b5a5c15f1c7d89e14b29ba3523265e228da863a92f27e4a8feefa25a6dfa44fd7627adfd04d3f0a1be452b9cc48143081503e724af47526fcbd610ca2a73de36a926436970b1337210f1cade2e91d385e0b123f91e1f06c5350afdfb402c31449b50c849d424a9e235649f904434d8c0ff5f85a6cba70007cfb8c3d2bfd65066afe8a0114e6b724c8675468aa7f2105dbb925ebbcd5c31b9418904d59714b88e379201b5c19163ff33a3a66983caaa6f3ed65345872f4333dd52e28cf84b303a44299084287330c305673a6726fa9414f419e7daf94cdea20fd057faccbd2c6e38329a43e04c4e17895e0f7a53eabd628cfc93d778d9a252f5d3b808a7fffd04bf0f0aef51d775eb1c4481b93708aeac67e73c9a9db666ce1603fc98bf0bac76a9218b854fef0bf957c8e75c611482adf165232ce1b7d7cdac92b4efb5dbf1ae571424d5e7c7ba8c9a343405dec67322e44e52519cbba69b21a6fd361b279fe3c66d1251cb08f91c26eb97b6bd8ab9384edb3062089a91c7d4423a3178ee911284615c375a572ec4cd77e8062fb352472e61016e8f7d48e43fa150f561c4a1f9d9ce015eb3b47b3bb8daa4c97d024bcea9a50804120ab29860c0501e039921addfd8cd949d6cb04dc32a0dc6685d8b92952f5ff6c49524ea32c4e7e7c8a818a906e995549965bbbcf11398b401f1dffcea887bfda5770d0863790550e2c2a9d38b6ab21e363ff93159df21b10187cc149cb65923b507ba2bdaac43ed2d5655d4cce9659888f3018c928cb17c1b5b7893f4fa26f3db479fd0048b8e1aa7a667c057b7cfb85a7ac741a5f37119f3130c95dbdc484a58961b9323a256a8ea39806e514dca792b355bf3567fcacdbd4f86e128246a2c317721853ee932086a3da1e64c469f15a90e9112ba262b9dcc4a171452f84ea9047546d925f1f2a89f8636041fa505b1208f94af2e3abe3f378ceb145883062f82e768d2cd384d5bf7e3bb613304db88aeffd129e4849e36425d14e41f8bdd87a1b4a9372eb46ab103fdadd084e7aac3b788b0c7b6c42a120263dc6081e6dae1f403bd180566e275ccffd99fafb55239765a4c17dbcf86bf776f68492aad77830f3d8978848b757dd58c31df1da38f720d53c657ba21238d18e15462d6c82c11ce75b81d8ac897dbafd921530403ee9c36021ae7759d59bb43ed9d64f064bc0178c9eb9d90423e03681f2f837dd3a9574f76c5ac77c51412627d0dedec3280625c3bd8739b7922d4ec95e63f62e5450c18f78923f30208fa4d50d5d485e7f8c4400417ad1683c58445812ad90d83e077600e1bc587370638caf873ba43c5866beadbe55afc162db30ac5cce76c8dcc9d801153ff86ad436b80f15b158d782219479e863242446e8fa569e6e2b6c9fda9cdc32f46403142841ce116b2428ce29b1f0d8880880b4ae130d0f869d18f93434d24a7b9b6ab8b6c4430c77bea6471ba4fac862e32479cf6d4c8820894f404267228982ec13b3dc1aef5a21fc5a1a8ae621e6b386f3e1c522aea350884eba9faa50a4d8ad32e33a5df009516d1655cec9bfd178fb12c34a2c638ba376e5c4e16eae698cd6829e7da4544233c0cc4356f1fae2e765882a46ae1e35b28c0e4615fe14eb0b6972f950ebb9f2f58642365faeb6f4fb35d985530a8309a08fb6201b0a440a15af6b00d75fa4fc2928334613a94427940b4231afe00c5fc0847c4619a92188b79c943859a64dfccf059ffcfee2559f8e22d535d2f9d979ad83faafa75ed9170f31e35c322f11bf17d397bc449aa8211d2b1291007874602d28829ab92451fc754f45d605c0a7ab5c8881eb88b2f9b171c4ae7791fbd054011417dd3e09997db9004bead72c7f09391dbaff80332e7143e8f8d8cf1773b51044f9b9534cbf10dfd9f59aab09857f36017607bf2467c9c920c71dd60c53fb452cff77ad2ea22f9d8600a4017a0ea2121289e19a49ec01f38c749ceb8ccd148e48a000c976f34462df34021c623550333a6b6403ce40b53c37c1c3fb886e7a307a71f3b15a6080fa8f60f6b566feaaf1e4631086e06f3889313d34ed67a34cea12d53cfed7570418d30889c36e18a4714ce7a9c636beb40cac9257486c093224c26fb2dba328f0a903603ea02cdc46ae16a29a6fad406c81ad17c69765e5b7c218afc862f4a182a8f41ba5cd395fc145ee8c0c852b36c1350485262bfe7601147a082408baef83a8f661587cc6805d781547af5e197e59d58c1c6bb2b32d46208052ea882711b419ab02ebc485d987952d839b0c23098ba1a9bfdf07df8c476a4a15811c81506f79e07393ffa25ab074a892a920eb1b1b378661577f4ad84c10e386df8b90105f493925819e6782da71d8b12c31380368cf293bdebed6c03eb401a240946b1121c018d4000da8ce39708e73f629ca422cddefab5a2c46a71ad1a0d382d832212673c8738c191c1b04cbe925909ebaf7782e6c2bb926311cf6707e0d0fae6c7a8ae950a0d59d76d8095e9f47c70645738c1118408110ec9aea086d673502b7fbd0acf8c30f00a1a18a170acdada314e83e156d2e66147cf7a696614a67e31be00f89f000ff67e9fa0dad44a31745c9cd3f21f56a77cb602eb7fa1c2d8777cd6f565601923e098ca852c5eb41a9cdf2c52d293dbe0b9c20e3a3296e6d15a366252d354072b5a1e9b0a1cd91a7d27a87af14e57e23b9f153a879735aacaf4afc69ccff1d818ef2b28f6f411863754e2099df2dc3e31479458a664a948c1f9afd202ff640a332beafdc2b8f76cbf907b6831cf555854c0742adbcc5735148fee72cc64db2f962699ab65b04f2539e726cdeaeabf0a89450c8a96ceb908ab1d2afbbed0be94050d82e282e0eee85403bb32443d85bf1246df604af826febb9ab0bb2f2c67f6712bd269bad77be8322594f59d6c7f7e825ce21b7ef5523bbfd6045f1cb97f33b4d6334956d8570dc7a5791eda292950c914fad0906bb9da480a7f99b37b9846ba6e09ad001eed8870a8d996322c058b1edde2580bda085ec371cd0851384eaabc819247406862987aa34247434c10df075489178b3e2a3607c1edf5a91fcaae9c446b6f615517704decde29259f09eb76b4a655478abc2445a76b8d3f27852e5ba1474e4a8805bc2426d5d62540fa54e03b1a7f42fb481adda52b3ae4ee70af7d18f6fe176d064114485ace3bd3c572a5d2d5f13e7294497390f7f6a876844138ef21e1a81a7bb8ac329c47ae5a7dfa49593a7c5f496a8592414e2e3c6a6623325374c701a9e6d2ed9ae04ece59880910b84e330a3674070d8b1417344a51237b865039e1ab4dedc13179e487fa476af856cdc0348c16c2ba1bd11e6639d480cf1bf456a4ee4ed2bae0f2bc5ac491517a06fba40ee8d501309d668b12c18209fe7d920c884f7bbf8e5214b967bdc183035b0a85d3ac044281bc85adbc263990666b82956dae078d276879ec6c96a2710a3c6fe25d23d23d8e63396445f0ab37f0377ec9b1a79cbe6e96ef8a99db3fc7f0a3954dbf69cf79dc9bb0b9087119342b0356edd04ac97b01af9d11055549d75d8cb11b3cf8851be573344ef676d24fe805c25e66a1160f808528e19490990e1991bdf1641cdf72234176a4d879e23b75d3d456bb9132e7dc5f09622c0c358adce7c04ce90d2f48963a9290d980ccd05e86c169ac2af091889a6149f2becfbb1d33ac5d99c78c7e702e2402f8bd2662314337e1d0940583baf5510a376e884957365d3e415e6f9556346e1f0224c3d30840d61051cbce2aae1de8b987c6e918222697a6dc9795b5d344c9203aaf1872dfb263aa9c40f26f19a3a3fbe325943a8cf006d4664d60f08f90d007cfedc3770620263a96d5f0c084c8102a728ae77b5a22b7b59e574e0b2a65a01921d491ae334c84962874f0c77f0ba2145db7a6a92757ed271e3c2cb1001f1eab0bb9bb0283daa616a407145bcd60958aa395d65fe54e41459e8f283bbee217dd10706011b4e08212d284a093a4cfea975036c27bf648b0844938aaa0110b8367bc6dc60ff1fb8693eeede426f15c70109e1975c81b4c32e471d7e48be36cc17bf54d9eb59c86932861c2885132eb4beae3e1cae086e805c71365ab446f6ab12d57fb07384815af8b7cff51e0056e492c2349fd229852a7c58c229d3a00b8f7145b0ffc5a93b2acc1be91d8941c2d4029a093e014b020f3f953355935fdef76fc1cc0c9dd56b3380df5fb56b3f3a8dec5ec14b91a5a771da8329a81184fb0c3357e522bdf46052b6e4f01a9fc032930b5ac01b77702b5003719e2ccea851c7b705e6d0b03f75a85fd6b340928e4403640b259e7259308f364c53acc70bd8b43895e46f5cb7e331ce5e85bb2c5470d8b388f2f61cb40169567e540b9c9e934e21ab5c9ad201738fbdf0ced0068e57a152555736c9af2201d9957683fdef1e81132ab60bff2bec82cd09e20518bb1690c100e135f7c39657ee4971c6da58cb92c94f640ef30c6a3c6e5435c1ae87214804425da7a58c244fa1881cc396079d260ffb909f222a0119c62842b5027132547f1c3c4774f17d83abf3c3e0b69ee1c944d4f56f024ee502701e13f6357295ce2a4452d9d5483aa0cde59f219acfb778f98679beba3c24ac1de4d661932abc8c7dff298c8e55c792378f386c4e88cdc320ce46b017ab276a7a5f38035207a95f76ee24ef0d2ce9b7cdb9312b8c8f3bbd2bc5c1c1d218a609a955a577d121456b6b5320f5c4c14d981b1d2800c6ffdf57b6935f8e0d74ac06612a21179e72726ba2f666ed72bd021cc06049ae13a8f59309c19a5038d6e1e413493ca32049671ab75b5f648a9e5e3254b8134885ac295e5a3472f731f8cae3ede2fc2e3f23e065213f4bb9cfe48715ec560fabfed52b0a795a9927ca9e0b711382c89254492bde5de5b6eb9a54c4906b30806092e09230a50b982341e5d2030f4eeccdfb15ef6cdaf48ce9b614636573c5a1982fbe691086ae3baf25de9e6894bffbc745b48948442fdd5352c44a7254b48774e13be7eb837e57a1ca7353a0d6a83f37a8bcebeac9f1306671ef30281c17d77ac9751b3ecf59a6f2d33053bed2bc43bf7970ed4ecb56f20a741f9cc4c9d3ebbb07c36b5f84c71ee1fec8f23fa1257dd28d5e45dbf0c832d59722d0971152d90d50a47b8ddbc6a9b53b8356ed41bf6549183f1b73b5f4ca436bf0cbc43276b4fe10848e1022982b0253fb311c88a3a9cc273d953ac83c9e863d82885fbeed0a7b22986b99cc2d9e873d72e7093705fa0272702a49f8004488f81ce21dd219d43fa3cfba9b25fb1efa94a36cbbe8ee87d2f26b3dabfed86f6d9a58fe3d7579b3fcbc08e3dacf9a673f5b6ddbe405278875ed4753102e21d6c5e7ad989ab69651d01bab88cae3fde3abc7d5e61193ed7e08df4b986d31cf120cd0c9f27deb69f410697134b8b476d2397d1e871bc814ab5c5cd28967bba40a67b447dff476f466925121ce2e01037f49a0669cfeb45453e0497c0251e65d69a7594a028411d25a8a3044d3a972c71b104d54b1a67b6888e225d9ec3288691b08a8db0896558876d8fd560580da48140b486d6906a6acda80602ad806aa07fe7da05ca267781808080e66fb791d400c50c45a9813fa70fb9fb90fb90fbd0d08b2cd4de1ec7294c628341f4422015d4ebb50c8170cc146a8640d7b77cbb40b5bc98d3c5bd56c4d9838a8838fb107620162f2101083b141999dc8304ef68bf83bd7ccbde34e6de4b9f278de9bf67ccef3759922dd9d73c176f568689da98fb2c53f338ee63ce5a6fd66ec67e6427a594d2acd26cf4d99c6f569addac3d36b2130772d8dddebfa6b77fbdfdf70cedb77fbd6d4073a2344dd32e0be415799153ab7ddc742636833ddc3ed336d6ee1152e9818055aae490ee43150f41a65ff99703ab5429bde98128bde93e10a45fb938506595ae15f2ffaecb2ba18b5341128e7bebce36d1aca0ea69d4c610d4c6dbe7886f6c8fe375ae8c68d17a4d6b9235e92b64a49b68287c26eb2746fea3cbf668c8498152e00eeb71e066637a0a538d5ef429a549764095ffec24aed25e96f50eef30ec661ecb02f2a0609a28a16c7d89c0e6d5847749bc7b42e70715a786e715b93fca7ad8c3f2f0ce7a222026c5b26c486b739a85c6da28955ac9d4dc448b41789d32501bbbe39830eb288fdb7a007b7be0c5f8d758ad52ddc4715d3e38e012f8d1fab61d4c77bf95c25908695d20a96aa2e94d8911a0001e41b9079a54171860f74092ec0748b030843b955dcc7a8be36e8eb8ab1db57337f76c37a3b49f3e636d3622bdd96b364fecd9c4cdb3c212099e18bb11a37577e29d977e54828888e8fac1ed429d657dca67b20a6ae3ee8e027e9b0e8d17e3df751420bc7e66d37831359e4003fb4f21888388b5918b4f0ba3e709b47bc91f90268381e1b70ac326126f3ae8b07bcb92f74195d0cc30fe07a4e9259ecaff047305d8db8927300c9c5f94be4de4c5f80faa298adcee5a5f56205ad5dcdcd4ac8c9098431f3cb1d6d4695c5cde0b6a22413f3e73c516c24e1ba8fd1f853a493f8ff2e3513c8a47f128904813717f077279d8cfc3fb77dc1aec6f59d00708ea5025470dce382e901adc7727c66f5ad3176ef2bacb106aee24409dc47bce5a5128e8ff3aefda6a2ab01fc9fa6bc54247784ab2cccd232ad9e7aaa7e4eac9dc7970832f2d628d62cd843517ac7d4e913ec36019acd5682418ec5fad8b8962bf913d997b0bba4fa5bad883796361852ffa796e19066717b31ceab9ca557ef3051d092782a647ad5e780da7f981d3625f581716651f5495be8569d2cf3e40eb11f29a6ee9926e16f5e69a1fdb90bca32d0a763b0bcfc2bb28511cc84f4343d71dc281940aad4c6a1d651dceb28c0877707433eab99bbfdb6eee70ee1cc9aaa606a3501955eb35b3b88e8039d6cdbfcddb4ce4a0e60ebb3b1054790c156a762418f59e27cb09755bccc972ddffbd8b5cda11faacf88604cdb508dfa123614e254aa0c8bebf330cfe934a66431b73bcb75d126b9f82163ff3f44081ad8f32462bb447a3426df47850fef1336a7ebcd33d02daf419f8f0c11d5a724058a50aee9b1b479c9ec161af815f033fa7068e887ba6a5ffedf09996ce1e3e8562caac0bca3bf874dad7a626f4adf14e56d2a3a97915ea80e1cf7834d155f0e1f30186bf514bfbe5bbc1a92952adbfbe5e37ded8337a704f4ec47198240a6d478863ebe9afbccb974fc32a86fd9015ecf5e46c3daa1836b12cebecb18cc3b039b25232fb22cd0e74654040cfe60576c7eefff277dd6ad5483c3b132bd6c463e54d2b73e575f8427d500a543992a88a714ea0f4a4bfbe579e87e9ae5cebf228dd26dd174140e1389e0416d5831cc83b999faadd07d4527c905c5789075b1f1b3f9b20f31bfb95ec4dda9fe8b36cdf2208f7a8d1bba8ff02fb1776bab017caca162c369e2c34add82edd5c39ab69a49b2f37053145cdf05b82089ac0b2befff56c82e0f8a320117b3641e26fef9f519b2038520ec7cfde7fc3de9f7b3641701c3d9b20efc564128e7f6d16da682dcc5e2fc6622f46dee7a22d2c629c13e359e19dd8305a1c0f6b9acdde7a382bc0c3414c511bf2ac7ac2ace113b497daf96859d7f7e0d1cf2851f3bc9ae51d856bbd48ff208d0fead24bf6e55c364ffc2f8280a2669e1e26f0cacab6fde962e146d7bc2d9713d70f314129b1dc0755190e2465f78d6cb493de67772c4c733a6794a8f2ab10fffe9e454d5dcd92ed1c1ff0661f50f20e2c1f079625fb725a0ec0f2a50782a564fdca6bbd65a63ffd5cb92dd9b37c4f4ebc2d198fd2af7cf62b2bcf72879ceeca0f31c587576229d744581d9b81367d6627f3f420b9aeb703dfad7f3dd8929788fc9a3c9f428c733e8c5a47ab1a50ef6e4e619bdf53f83962cf3cd0f1bbf3c76d5ada745ff103c79be55fd684f3e241e1f733132394f3bafee2e954b0baae9be57bf3e5673d0cebbdea3498f3bae675bd9c89f2bd97f03517665acab7de5f775af3b2fabdd7535018e60c1b65d6e7f7f37a38f0659ef73c03da7b52656a9e0ba9a8ceee9e420d2c6a6051038b1a587cd1c23ee433450899f87e11f08b1052b1f54250987bad2aa9d6880b3512244248643082e486f5f0be1773afafe0c51879312f46de1fa4d0d87150011cdf877a86fb3c1b62580d00bd2717600248e85d94b31143791d095441eab99a5034722e4376560f70fcac113d1be214128dcf060ac908c1f8b82a7e76e1acd74868255805cca0720fed08bf208b285e00a5096b0738be2379f97682a4488848c80892262d48a25bf083c488b685234f4819c3142c037e5288210abe02b3340eea7b52840a76f19048129cdb09154f42b004ca0f49ea7b52840a9cdbc9c3edc4675e92a025d193c0d17da870a0263c6962098eef3fd4d201ce143f31c213d805bf274518c2dad35e687c361307f8f93ccc9966f8d0b321be56a22fd69510490cad86351ae8103e83bd55c57b1f4f3c212f7c224692278e38e2e5e5e58978b14778a0decf4fca8bbdf7df7d1b31bf3cdd7458d6a7febeb5e5e0fedefcf2a7cd87fbd6cba75edeb4dd48fd7d274ad997fbc3bb7bedf36ea508512d6d3a47e61412fae11de792df1542ac217ef4c01ebb0e43a21414443ee4507817df85927ada6e68dc75e103ec82b2a2661f22ca28eeefdf9be56df9a10a35fbd01119cfd91fa6f08368ebc17aebc69761bbd1a673e4c5e0047e7e2691bb1614f7a3cfbcb8fcbd3fa47f94a8f2f3a382ad96f75f2cc48ffbd196a7c3962ff199fca208e183e7b38dc7bbf84314b55f6eeec12fbf62b3e395971609920b8590c86004890f197fef63cf86fb7bbfc7b53e4450e1bbfcdb6e0801af8ff762565e93617f647ccb0e1957c6cb90f1daf3860f3ec9712fc3669bce911554c507420bf54951a5099cdb493b696ee571a08b959607effab6e4900f8d68bcb3f2594863faa5160f6f91221cc77d13f1ae8b700f8309ee769116db8d895ffe5ac78183e37e724f7dc6e5b997e7643cc73d0e6771c4a8712f0eefacd4952eb6a1bcd8ae228aabe2fff0819a5dc84772b6866c26fcc769e2e963d8fc8858ae4d07cb9fe88bbdf04b79c703cb928763097cd13f3f524a29aff53f6d3726c78307f72e2e3f9d46c6bbc8777993d374ef72338f0b76791e5c2c8f0fd4bbe371dcc5decbc3db0927c336145745efe277b6af70557c209aa8d999f8e476b2a38bdcbfb79978d8815cc88837f16ce4cbbfb76128c3f68bcd1b4ed9fc98b878a8c3c5c33b03e5ac63cfc19ba1e1230d4fc36bd7cad764a0554995c127280828e8930822826f7d6f37ae65e589537f6d9e98861897061be35e6fc2810400826a7dcb67f7f1e1c697c0ed467622ec4a641729d2448ac060a2089326a8edc6c4a9d75cd0de6c4c9cfade82f410e36f3c9c6ac2c5e643f44102dfd75ed0de7a883e3e38c67db1e9883e3ef85e8bf2ceba3f44a9d99930e12cc42f3978332f1f5f9b81f68f35c4bb1feb67f0719f1fef6e4cdc83fc18d28ddc265e4cfcd4e3b82371216bd311e3ef0b7d31d6c7b8d6fd610a35bb8f8fffb850ee5fac855f8c8f71fd5a47e25dfc94f5266cc0171bb16b3250d760d018d68db40df15face3af81724a6a11d1bafee35db422f4c8b5e488f87ee37b3305f0cb3dd2bd0bf940554c7d8cfb2f2fed11196fc980d25e18db7a784d7aef8470f1d2fa1e8c6d3af0f6b098f0cee26eee9136a8831e0279c7c30315fe27713be8da9b1befeec3bf5ebebbf1ce7a1e21a8f0531669d371b979d3bfd86b4d8f035336cbe870b7250734654fe2b88fef423e03ef8ef6d90f1e372286f748f7323ebe13e9ae0bb92a7e8c9b67eae5e67add07cbb0d15596cb5b8f39ebf23f28a996ad6f6d8ef82d0c9bbb19ac0cd685fbfa2d4e3a4afccec2674a2f5c5cd49541ddcc4331cbe9de78d791c784e15b9f67d17dd2e74afa587282e35b240be3dde3ecb4f9a9767fa0a2f663972752934b8a48c6716a3c1b9e2178bcf3e731827afd75a56c928b7743bc8f48aade59ffc367fca1bcb8cd117a5e92d68c3ea4377b5b9d478374fc7181dc9dec63ce6ea6d3e6eea893e10c4be970295c2085111cff06108ae3edd11a5201646559281ca872dae2ade7832613a5b5b01d44cabea544fa9ee233d5bb96d2b5e1b894bd2048f1f1f14182e60726290276ffd182c210053bac62488a30086187d8bfb3701a98e35f6a62a6e56952700403d6b4809b28cbb2bf01712624d492ad9c9ee5c4f21338bde9b6643926cb622b54ad602415f52d3e3f281ac9e688495fb23628a9249b87e0ec1b925a90ac8f167f42e50eb7b00f55d985aa6d85b32bbfe363b67af7385e92634720aa62089e5afad216c481ea8f056df7b9f7fb7574fd792749d24992dc217e38c183fbd1cfd11d620158a54a8e13b95f4757a982777880f4e5e93f3281d17377a569413ca9cf39d15f6f1037a85abf6e4b4abfbe7dbf6d6842fdc262dba494524a4d4eb96ddb9c9493736a94529a4d999b0aa6611bc661179661159bd808c3e46318b6dd3cb97bddacab2347e2459cdb681bc9a2e6ca28342bc6fb71a3dfdddd188c8ef4371ba4313542e24764594f1f51dbd150f5cf5e7c6c45adf6960c0eb6e46bd84fdc9ba66197e735d1216740022644b28776ec8290c9f4a98e0242a82b14b8d4984ca81e353d8a8a8ade18607f6e148c0155d3a3a8a6e6c5497b409a9e0c1429513482220abc181f09a1c2cf8d823706ecff845c90fdfb39b59aca8da9949cac92244b72f41390c0e831d039a33ba473462fb1543d954f950afb732a18d8e71c5118ec16945266997c6cdeeb4aebce1999349519ad9926c4d558bb4028ce3f70b6d257d636a368bd7eda205d85e22c24a3d77b3616c62c4ab3cbb95acae245b95197ba5bab0f9fc74da7af76f36c3c3b1ce31cdd8c72e1aea96e2f379d2da81e59791ca7f6bd6efe0ad2c4375f9b9fcdef951b5d6539c9b12cb0a8021be178076acf9a4638de99d34eaa49ab6afd3de7cf39affc86f09f77f0be9ed92e86201cdddd531a98cfdd7dc683621c55a962240949c09a086ea3da13c1ddede63a8af53af698559be7358124604205a189bb8b4658419bc323c8c0ac563299fb12dae8b299f2cc1c81b5cf43b0f6af6770afdd7c9d4650736320263ca7a671ddddddddddffa865c2d3e61eb1b78fb36764afd11660edb6e880587b88b50bc48477fa66531058450ace2e8fd504670790eae8c558ef006ea35af662accf0e982fc67a07602fc6fa67417c5d6b0530a90e26734762ae2c18d49c72f9d876e2965856a952a509b6ecc4aabafaa959c9c800a9914b74a5302b1a4534c630058d1a4c314594a217ad189f18c17add11ca1cd615a20356a942af9085297cf04449118d29532451a483125178f2683ce1e1200184af97717e7eeb7590418dbf23ff82f2afebbaf275fdc4ae9fd7dd87eb667f697515ad7b958ff8417befc57718df7bef3d293487317e775fc1145f8c99c784fd22515aa29696a8b9993cf10414445dc4b2608adc201c631654ae9002a58a185732a92e5e2153f0de7b0fd0e047cbaa7179cbb2de93ed5cbf4cec6030191829715a968c11fb793d283b785c33e5d2e138df4a93d4b23a17c5a8bc36faaec7de7b19b5acb6e9508a3d9bbb47c4102cdb9e7737f3b860ecaf29ffbd37047e3ff0c39ecd30f8ba2c494acd262b42e7e2e55dbcfe8ef58a13de9295ccfb14c947f0ededaf9d5425f5868d9b3b1c5f0c4c61ffb8ddb829ab9d836f036278df8bf177991c2a1cb9963804bf17e3b7c5c67c9f630c2aaacf009ad6f3de8fe743853af12def78c54aa64688246ab1623ab1b460399956e4435507e7c82395582dcb826f59d1fab6cf82b1c3d031bef5b03bc2f8967dd1ddea2678d61034bab9078f7c88e6d5f05d83ea1b004e93f3fdd32afd981e0335a7e67f9c5879224e0535e50a219ce64f31dfef3d0386e5fb2ba4b9f919343e8797c1a5e5858befe7e133a8efefe1332dba096eced2d899d74ef6f1e089d424b1fae9a8fc14d4155856418557e13a5da8392e41d11a77619fa3ecf316f6f9235aa2e629f39615c0dfd805fc0c1bc4af581c74c0267ba4478fd764ec0282e8619fe3609f770260b9d13b79b23494ac44e16473c031f6c6fef033ac026eb0c91e010288d77eb015aae42b0008fb83fda93e00f9c38c8b9eac0d4903274b8015db5578e75f5292c3084eb6e6646956abaea381091a3dd999192d38d901dc5804fc0c7b001a3601cfc3e6f0272b834df6c88e5fb1477c7892b5ec0d3b5ecbc1f278ed050c2fa0369d12dd617d48807d10425ab2ef21e0003bec7baa1b6c1142aa66830ff6e7bd1b2c40019f1c1f4e16871c804e5600256bddc03dcb6b2e361d16140b899eecea8648cdf1646d58a1271b0052152da638d9185215319850733cd193855172c3132cf4640150524285e9072cd686bfb13d3c8c5dfd0ccbc39b6c006ac0963d628037c06b31f6c25ad3182bf1ca0603f4c043001ecb98989898ab636c630d454f565505cb1eb1a1c136393859193634308ae0426fac8e93a561e669665e83d1a23a0660679e15a1cb7ed7c9c6000af2814cb4cfb3898dc4b3a1097a36d0c7e7d938f6d7f1427d0dd2f6f969f2fea92395864dc76a927bf094819e6cea645f686c00603dc76da0d85802d886626b6a56abae83414ff6621c52f0f4642d8d0c6a9e969eecc3e842cdf3d29385e1d2f2c205a98a140b5ee8c9ce50523243498a9eac0cb80096e6351a5b80d7fac662e073660c7ab22e3f3dc507e039fc4d1435471ae8c9b6e0af4564d0937df1828acf40474fd645ce0c54f46451781583936d8159deb24768eef3fb5ce5629fb7d8e72eacab665897e1b94a03003d59161b2ac0d0933d61d4cf7812434fd64414034a00e8c9aeace88dc5f1336c8e932d618da573a72c386c2bf1266ae233f267b8f7d7c942cdf40aa1e69e153d59d2153ec5a9b8cf0e2ca839de404fb6e21dac10003dd9110ef464b99b2832f46437bc03066a9e3394c5d2f031b6fb1babf33056c6cfb035be859de15116c6bbd8976fb1f75f58fb2eec3f8d9d7900d8184fc3e2bc0c36f539581d3ec7de78cb1eb1f1267b64875fb147f0976c3c09efe03e67ad28d47ff7edf3d047bb617f6a721e03ab1c1a9fc3fb80340f894a3f67ad28d47fd7ad563535bce955bf83fdd961c663609573f334afdd6c3aaa1a686c3cf4e01a6a68262adbf8641b77b65b867dcf061aec7b9d0dab63df53d5b0efa976b0efdd90d32bc0f2691cc1f273e81460f935f6bd1b62d8f7e43f1222eecab72e12f849293fb7c0f367d8f770c831b0fc1bfbde0d5906964f63df1b00b6efe1d8f774b0efbdd8f79eb5ef756fdfeb60d8f7e4cf60df93ef49293f57f9588ef571fc641d6b33f464359a1824d41c4f36c32b9f1a7ab2182641b1182000a5613b07db32d8cec2e7c73a90f5243cc8bbcf51c2c49a0d3dd98b85893b7125aef22755e154b8ca1fc650cd71063d59a9ddd093b50850222a2a6d21077a3a424314e3091af474c4e64df608cdafd82304f81b3bc3769392cd6d2202dc860255fe3516a8e6d0dc2e5aa2e689650e1d1ec3dccd13c075c6d27c5b0efe00eccbe17233e92ba2fd01762bb0f78cdd4447f442088a260ca2a107070f820ae91b375e79bfae4dea519b4c3132140a85aa7152184dcbac1521ae24989549869591483ffafa9ab6e954521d7529cd5a18068542416b8bd821d620dd388a8241699462196d4ca335ad8cb0c8d01656b5370fd0582d3aca66b4d7f967efb011c4da9b09028a4a7ff4189d943eefdab10c73edd9641ab7d539ca46a35ab9c69b968d1eb3c1b24d7bffd173a3d1d6f6bd98cc6211b70dcbb24c3a702001132a58315fcfc86ad6b1b36e1bac9f360a89d1df6bc0450c23aad9ba0cf362f1cfe99846ad152dc43385df0866e544352f7464b9cf7edb388ce360de06063fb3f2b1a704c36879e4c2674fa986b38e4b703f7387530387e9bb2fa6e5151e59278bc56a61a12cebe6d1d377816ac1721a3db7fd8872947bf916679956ac9570e2d7c41ab9c5826ce6e3531d2c629187467f77e8289899cf4097719a708c37cb87d2cab2d8d863ec7879503548e1022962d63089d1379e106a2bdb7333dc778d2549a452a954aa1bf7bde96c741bd511c7fddb7464e315fbf2e62a6d587242386312eddbb23288fbe6d7cd88370bb1f69bf673d3a1daa5518d42bad9c6d43efcba4c1bcf37257c6b069e14861ee506228cb4b398c91c168ece65d79226ef762466ef25656f524757e9ab734813f627ca5efadf78077f35af0cc3329865ddcc1e0d2ad594e714c2c16d8513217289154f18d9b1b242c9aa01760a8ff5f1555421c412427f78e89068051121de282741d0e20bdde87f84fa9854a10447dcd67b16c9f4ec235a824f917733fc79c3ef9c96d6f83bf0e767f87fcdc7f1a965af6536cf25d48733cfddd38779e17b29cb09d4fbf0d1c34711155050ddc40fe69c557e5043f054f1a2a070e0c0c15103071344a8d5aa5b996056319ec9e68e65f570a06e6e646e62d4dca45e0c9b655c52162a9572497dca65f2e0c1030f264d9c388949e04704d749813663a05e7cc8bb38e339785df40705ce5e7b528409a62f5f8b346e373aff9066fbfe9aade09cf55dbb19b65dd7bd6043b81159d8575b0f5fbe25038ae9a0e63682bd03f55f33f2330ad7a07040815254d4a4c9922519852184a8eef6c4ac961cf3ad9f77e7ba2b1914401fa7132302c3aecf450494f2861c0a7fc29fb8b21b89133e2a2adc21a51ba1c27ad1e4270cb5817cfa02d58994a0412f5cf15d88d20528d853d0ba7908b65e7e9e00f6da65e75bf60a02f17c400f966fedc8b7aed8f1dfafe7900f53a78939b107da4bf5503d098e5873ea4e65fd7c83a50c9652ba6069c252ca978f159918108a77e65f52429394524acb5a31addc1df8fd905a56da39bfb4c34975c46d10cbb5d64aba4aead55029ed6a14ef3c8cd3ecd0b42418c7a5bc59ce87190a5f432e218d81a030f697d51808c5d8cd42f07577e45f42f0359fb675c121f0a33dc2bf7d5ce53f8442c2044a48890753569a7ec063dce84322755a378e73adb55618ad3c7116d218f51a471d38de96f83df847546a3fa7f11115224aa569c48db6111d8d6ece34402b0ae350a8a6b5ce793d7ccd6990d452f8b244a89c56f967b3f4a2cb9726f70c33a050b5f2344d137195cfdc265e18c9ef0add45f2bb02f668ea4095d89a33a8835e8cff0808f5c16723d7d9075638e2be3b4c43b0a48dadcfb45e9687ab1c370fde3946a1508daa70855d1c1fa13e2860d415daeba1c98da7502e2470f925cd44c96bd24adea33e73272922765dd7c146a2110155b2c70e29b8f3fb3ad376a3714d41859f6b27895852e1581bc197857fe679100a9e1e05cfcf520a9e59cc69fb3d088c2a55a8600861bc421a43c76e1ff607f2b2c03bfd3e831d59f626da9b3579c8e87671a835b1069a825f46a1e644a1fea59cd8cb9b3b4cd33e2b9ff1293d4663882e05c32944409a1d3f86dad811323a1bc60cc4894df91e67736259d57cbafbf65f3dc50fd5b2df2c8e2088b3fa8c5f306b0bcb3df8baaec93befab5e0fe10fee96f75ef1be1763f15c1b98472956b4fe61b2e535aff9bdddb0a86f12c3b07949695119ac489384e1a86572b563d404c26dfe4ffb4f85fd6677b4a5056a03d435bdeb4aaf6b25457bd9c581317b6d07eb01fb88697fcdf9f2bf679c364f6cfea55d91f663dfd9c74d07fba8d538e9bca426659e2d39fe922d39a411fe0fcb8ba93cc26b827db4a62c64088d364f4ad4c62d6b44a9d767546373f6cf2638e52af7d835a2d46b0583ac4c5edfdddd6d9f678581acf00eb6c2d75ccd7fdb0d4c83af65cda2bd75634db2dbbf47638cf671a33a9915053cb1f5a2454466b79962b75aac7fd8a5c5ba261b4c502b76718042cdf17dc7bf2f4b7e4b6fd1e16fbdf5700aba0d20b47cf0c451fe654d4bb3a83564590d4508cb256a63d943706630fbab879e5391e1135c99f800ce328804ce1e028f26fb239e4dfcec623e183e41420397cc0e8506c3a975bcb0e8c5c0bf8107b5fffba38f4585a969d74529a594d28b5ed745b1ed29fdc78d2a690555f44bf4aba53fc281add948237deddae865512e71d2e96284c43b3bb37bb5ca1258ee1e84ad2881ea4e37d6018b9a2b6e97504ac9038330f42030e102185ea8f58c0f93507275c0a276131a40ed512c8b8fbd6988477304f4f166b66fa0ac61f8f4cdf48c36a39d4008e9d393506d4ce911a4794b9f1b68e56e36b08fadd9d85a3b65b7a1683ec5b378b17dd6349fa23d159fa197a679bf46ad53f129768acf74f654a7339fe24ec5a544f1286af6293e85092a3e932111cfc267eafb431f9f19bd37e1ddc39088cf9c6eeef12590c6a73c954ff979739de2171803e6b24f31add86c82a2e2ec5320139b0ff1b31fe2f97833dc67269bace1ece99bd93efbfa66e8678fbd1942da06ff2cfbf96cb4cf324824a46764d9dbe0ae0f7515517e9c802c780258bb0d454b22e836d0bda0c0fe50c8e454071afdcbe614beb85aedc862dbcd17fcd7c5cfe237f6127b4a309dffafc3fe6654760991c2d87784d81a82654751d4ce3b37410821bc3446d760956eaeb7a61f2fce0f0c51a05ea5754eece65a6f46cd9b1fa8c72557343ea455fe3f495811681ba2a8d5bb06837cc2122cf00476819f1460f0897e59ecafbe30ccba2d39e4fbcbf78731c6b8c323af0b44be779ced4978abd168f4a3d103416d197d0f1ec55fad56ab95e556f3c5d799f21aaddce2cc6119305aac56abd56a75d1408bdc4bd4108c614fb27684dd2c4f10638c31c6183d62187c4c30e79b0ff0a5ffbc32edaf0b7b15b3afc36260ec9b01f8fa9eff62b0f7f17206d74f22aa4351cddd65510db3d4f4fdf2750664e5919a5026b7aeeb9252da2cffa585167c6845fbc428c33d1733d02316cda25af445327405c36f21560fd3a311c255f0a7c0c0cf29f8d905ca14c914c914b58c0cf6b97e66600d93cf701c37daa80f3ca249d416ee7b30775df292b2d6ec2dc1972d22ce39e79d39734e795db74547c4f22396f707c9ba350a8fabe0d778d443253e6b7807ff39296e7ee100529f81d76fc648501b438fddc5d79cb68c12a27016a7367f421a1a9f0a53651e7c7d9bb4a63a46780ec1d7f715dd076b1ab4dcdd7e8bbc3e93e0f84238fe122a10841f7e395a6ee71d8c311621e4faf7628c90ff5e4cbcd93f6e3d780fb9c78888df8b6999df326f908b7ad7a2a3b3e07d1172c184e1253f7b36cf667bf9f4d9702f7f7b36a397cf3d9bfaf247cf86f4f2ebb329bd7cd2b35979f9a59e314d589e94a88da5d4b13ed3fcc5584fe18bb1e28bb19e1bc9abb472492f063ef662acf72f91ece8c5c0af96db36abbd18f8d4662f06be66b1f962a62db50df032951a6e4183f3cdc6d60565c90bd15aef177e0c32c2d6d367435fccd5fd8538a3e597457d6addf3e963f7480b8f51952ada4b4b7f06e9761afbc5e9da8d2ec30caa13337e748a9a35472c7d001193d24a41cd650b1c4b18e7162f6dce8861727ba772c6ec61952a92beb4db53c1923ed6f206815536efe718b30fc74d87de386590410d02238c0ea5cd421afbeca5cdb34a1ae76b1be4f7f56dad0c5af8b2b1ca2148e18994299240852734a6d0515a710a293af84cd182272498c28a272808a4c8a8748db694450c159a11000000200043140000200c0a86c422c16038249336397d14000e88a44e76541949a32446510a21840c21040800000000c0c048da000288571df742b7621445137b24b3e80261382691c04475410f524bf395691bd49648b9db2e4557c9633e6151f436eb6dc76645478374880cc1b4016c8f822e7a57fe254410fd296872fd0513632732753e6dd064c353210c850213a8ed25b2097cc60b0d04a5aceadc7108745ec000743940a2490b95574f6aadb3355519abded4df4aa8f957693abc6429c80f4c2c033026fc78090fb285d0d6c07fccb8179c04cb35bb1c1ce0368a06c6b6d57bd75a813a8c2a9aed3a96cae795ea2458bbf0250a2576a307c1f4883c3db847e604f2cc8d5978f6c9d30ede379b00393708d77d11daa5794d7d93b40be9879b3b73b91cad933a57d30a3b6f85be5334f399064bcc6a22a77ac1483809d664e476f79d1c26235cfd89c8e455c12221d11d6652c172ea1e24bab81a6adfda6510e2796c9c6fc04e495b08e824fda29e38a377415c847265f088912a4854e7c76d11fc8f113d9b65e62406ec21b73cc1a11328143b01cc630aaabaa68f9c99ba9f69b040eba9d67d4d0f93c3881fe6a4da8a72779d9dc8abce681f0d9523406ab292d22874d32710434ef06bb351a745e4b2e0488ca56910d20c8f2f6ec381c72c6ccd3e09158e68ed297aee61f21b7b923cd13e157d849ed6ed7a3d582a2cae4917c10a2e7e2a5485ab55c9e6b0dbef5323f5657b4f48c1ea73129cdfddbc646bd4b15028aa907af2f2127d19b975b341a903607eabee9115255692e45f2e2c1170ed9a7b586fb1e4aa530315d6428c191ab235e3fffa9f5811b87a668b5c7e2314872046e2fc1244598cd2a552009072115d937f8a27aa0e7c133724dfaea717fa83b625d28afb94b83331d0f789866ac8de6271922afc88b4c6586638546f1ef0dffd84303e9910956e76982b62e7fa40d802b8a2dfed01c39216b91a3dcffd129b7107fd1edec3003456d752e346931db25edba4b3dfa368b5a4c31dec8c3f552e1c21390445dd347c4669e8644d733432ce215a99fe3d1d9c8847a71f2fe7ef5a23bddd9b91e0f41eb3a465bc4478b270d5636b59eddc22e9da54d430af6e37bb9eeed034e36cdd8185891f61ed6eca3a30b30a8f788173f49765db70ca87fc1d24596a7a6e46e99558720e6f28f5d986d532a841f235cf46134853a87e91c783431ccc96507601e8ae8e89d6c21aec575cf98c99089587e59f69e6b3268264932c95776f9b7f70a645bddd2e6b4c6c6f24fe9acf5412a07d55829ae44d95637e790091da7de1c3e0423963d84ed82997718e637112b803860bba226aa1c5851b3723b65b6f3261c62d062d6cd213379170d116dd1519320383a99b543e9f2cb6c769c2c438ad4c9da6c669728d9ebf302fd0491a014c033341809c626397fd05fc20c97e04314f3cb37fa3e4a56e1921501aa4920ae5f27e3d2a69e35bc0558855d63c1045c3aeb0e63a7ed13224beb0560254b95d1297b649f9162582691d3609196fe3fd6516a83574f3623728ad6a4f0cbd9d53ae263e91ab4b84291cf2ee8b7ddee8f60356d8c1f36468b6f9b43e5a659464bea5a999289863ac39cd80cce03e2057175857eba116e146ba84e4078a02349c4323044a024809de53d8d142d3ac4fcd58c8c0e1810a32a63ddc7ace01da4b1fa102eb044bb370bd0141720034868fa24b971f634b850609e4622079ef98e312a970caeca24f49e5e4c7a0fbaec4d777b5f3f2627339a4a39cf2065145182a0a40c08e7eec98c1c0b9e64a5ff118966e89267772b1dc06679f53d5c91681650edd8fd9e0e4f206e901f88de82bd6aed42077a851afc56359ba47440f588ea7d004826639c2fc47c68854ca2af2698dc36e82ad8a9cc5ec479d2b2143833921e3c8dc488b0792e860216c5724b32c1fc9e52098781d15b19191c400771189f94931c7703ffbe793ec08537c2408a4aa8dbde39b7b864a5a2f81ac8f39c0454f4ce86e157a0d428727c849c242323fc6272d00ed09e060a338549cf98dc997a865841e4781094796af9218926f1009a3749227020ed62e85f6755cfa46dbecf2eb5f89e22a692466c6d3f89c69c5361e54006e34ea9c1f029ced0b953d1fdda777d94d8a0e759f5e706e529e277b5608418136e5a67b4be41c0d1e4e2949e4e5e90e84ccf50296e80e3101247fb40ce48c4d31de576a4bbdeae0e1a658b56802552bb2cac74a0b18f1b6705d727a67bdf596ad6619ac0558425b184106468359c63638e82c4c6dc959d8dfb5cf93eae82a1c1102d1625a7f21c25c2105795f9c00eac98194bf5d0adf859454ace477b5fd3df314643ad253f37ad13d1195ce40eeeceb059a50e8476f87e23b67e18e46813086dfa33b46aad4c9eeb462ac93daf63d6f929dc22f01c4c93706ce4b22775fe31581239d1c661a2e932197f36175b03b2fd86e3fa33690116b0c5ac7c7e0f5a2e869905427e3a0145c0c20bc32cbbf748419ffe01213912e6ba38edaa5a8edb408d614bd902600427ce9505e1009d3cfecbfa648ffcd44c0ae2df5f83ffe4e572a8aaf7575680b8f68e96c5266a67291fb923874bc574cd36a1a7a90bd4329b97cf2638f3eb26f0615a3dc761096b3d82d59e1460587d90ca0a21ca60704966c82b1b1db1d0c4bb18b4f1231e42f26ba9fef781d93f988221bbea620c09be0e24f18b781c33060b900335ac788619261085505f2043b50def7c71f6fcbaaf8803227e65efad97069ae40cc5f375c4652347c25d974b12a603244062bdfe3a5c8619998c44536b152bb57db91419b52244aa2642da0b3a0b3718cb69204ac19be0addef6c54c678a1f7325b6eacb8eef179a85d9613b808e253ec0901fc696c367dab9e26fb0fcbe121182a87f3f6e204b12941bb43c11f48eb9aaf97c752e2ea8679cb9ac245c91d1df512f11e892d9958620a8339a58029d0bb2e03ccd6b3b1574439084df9955c5c16b7e2773062604000940bb169fa2352ba2a442b9e6455d26921c48cea4fd7ff26ebdf0dd983add066cd2da073f0d9bbfdcb381adea7042199476bc6e51b99d4bebc811ea6070993a05a73f50e73111ddf527c2fc137da73237e2c00a58edc5d1f5a89ca21fa10360c1a561a4c8b169e4b3b12ece21a4245276044303b1de9eca008181d76b75b0f8d292e0152e34e2378a258db08fa9e57b5b4071b86065f7eade542245a36a81afa2dfc16e60e8d11b1e01ff04c3bc21d46c46d48994ef6270e7e49d0b0cbc0d2b40021efc5c86eafc02a445783d35aa94a2abc40aa77addc99a28cdfcc8dfdb0c2abfbd9598d7f70e0790e90087b422917d10da45d510f306e378693ca5603512d76aec8514e9c1386e3e544d4327b52e2228cc848f89d142db3ff21d859100d764e8e5dff15873d0ab1d6af630b8969200c454c96f12f7ff887a17a0c1cf65ca0d3fccbf9538cb125bfe9ea44cdb1e113f48a6abd98a26b73233c9e65c6dd67ca4029adb9293f762954865e4de2cf11a5db57ca36e66b20ea6b99e8fab4c79f231a28e3d926f74993fec84d1d475cb3b21167f9f2062c9dc046650ada5405e109157a9dc89f965db67e3070b2c6519206372e034f1635b8d1aabd66555804ae7a786d2678dfd664ed380ca00380686362568f0fb77e6869313d96701cbbcf5d01baee7f389d5813c10f1c36389b80eec69da59b79b49c5c6f9af2804a8248bb81a9acdeac0b488553bd7a700465176cae0478ab8e19449ea14f0ffba1e76312ab12237884035103fb7dc0c72566d1cfc72e4fbc71c425242f0d20a51235eee9fb07420762f148309732a56909d5ec9a8f01aa5b557719357f86d506c4b83eea07eedbc666fa66a3b63ca4a445683f511d87d455e36712742219792de0437c86a12581c093915987f0e79259e27785167117a9cd0e13d9dd0a94c7c4f483c8601a0b01ce227fc5aa97493601591b0a340154b6364e12ab263dc0543cc1f473559599cc820937391bfa98119e8c0dfbdd03a559464fb6a1ebf0cbd544d4b271c58b01aee81893908a0ea194476f9753a1755cc1ab80aa6a4f940a25e53df205ef27ca663432fa4e14997618326a10fdf82a4c2d8344319e0a32c5b73cdf6e7e7e83715d43c94256b414c56dc1877271b32e4d6f97787a5f3fac82157e1c587a8b685a74692da03f53a6ae42174c1b9508c0b2fb73fe865ac421633f14765b410204eb78c225b988d076fe43dd35294289210870782a12253313a143838f7640a72268699b63b0aee5e816f7ead6c1dbfa5c02f98683142b4fb681bbf0aed686280b6575251b26086320857b0cc9632090a4a04a447b9b3e8b0a3f7814dfe4a086251b84ab955d8f2c43fd9a70fa06613facefa0f0ea8be8b5c1d086e848f80ae67beea86998ae34e1559c669fc5bda5fcf43d8651373e16868b7922386e90fd800889ab5d468f043652e9337e31f0981cf7d3e52590822e4b32fa710c691641bb97f439fc4bbb815640fcf0054cd7e60909de63d01835795f31fc2a7fbd8f5a4c3557084097aa4fbd273d57a21e5b5fd03517686d4a01e314cbd1dcce246c8ab86c5abc94dc8d0e3286f8b29a295c823e7a58fa70b2991e37ec535a138ebcd7b3b9df99ce264aefd25e0040d9afeaefffca59d4e1a9904a9fc6b64a8c90711242d0ea1e3a3a4898e5bacdfeea17078544ad8ae287aadcffe0403dfc1045020c1dc92f37e43158bacd6138eefb6341fbd92cf40df462d61f2cbb469b313b814176c1a34faa421c719ea808d407a1bf1399dd72a2d5b7e2f74143b1cd4128dc67fef887626f069a04e7e7e9832bd567a0cb94245bbcba5634e5cf2dc0930b099b888cfcaaa2881989bddd435f58f0ffa266c75570dfd23300aead8eb45ea01254396091d0c7e781312d84589abb298396e33d8f6928c6e0371dde12865f3889239eb6eb7da35be9cb3bdb036571b2477369f7003578e129d6077e8fdd82192f4ec3893aee40d122f811a0a99a9067e4065f76454a7d6fec37ae3e6342fa9d62c68cc1865d77f0186d3d27a2bdd57b26feea7173e264752c4c7fa265f783d111e95cca1cc6fdba79023f51af732c218ab2141613196d592d48bd81d8975b0ac0a382da22740651fd8bc969af634d7cbaa6ebf20f564047feaefd16c2f61af209aa7e41c66290985d7af6dee3bf06e999d31499dfb5abc34cad048342d27cd90c932361957f7ac371fb03c21fe1a279721b7f4b4f36615ffb7170df145b6d3f481133d3085c8f16a824bd6fc06939a9651940ccf186727d587f90ff6825a8469ac812c28b4aba1cd1da8b372154a11094ca228cb637d24e701af777f4800680e7cbe36f0a2cf54209f7d08e0b57c02227dab8c67013d0b4a4e9892e9e055e76e3929d65953b942ef91812a6f155a8e1c8a9fe198f8affc8901b64a6fb3a7c11bbde7969726d3c15d17c81d2b2186f8292fb93f6fe6e3e5e58d3e6332fea994e22585add86938d854fd8a731a7d74da20717b8b2435a492235bf66877eb03cf0fa23e120a43854a1c43d3d35496c11689b8ba97e8624fb441b74df56a0094578a582f33c599ac279290883a647fd2f89838303095fc4f3fdb9cf51c6175bbff186107efa04f14ecaf47bb4a9822123dde96807481ab98d7540c8debaf4b8aaa0b9e8ba680bfac6b38f0c17ad393944e737d99047c4c7d530389c2691201ebcb730c1309e462a741715fe800d1e35b8e0cc6dbd55d43f38f80e3f82e6f0b0ba8c2ce7ccdc8897a2c497dd3471c7fffac23df8a4f6690c7ef2d23df742ee81d9a3f00e36e9d78c64f358a84a69392c55151b8dc4cbdb9d3b72c80ae1ac157d9dfcb24b5880d4f3eada4cab6ae5fe9a4162fd3f0d0196fa423556c27d140aca265e07ca746d9ef2c840f0f832adb2e83e27f34265d90f438836dace0a2d485786c8f7b95b3494a6fa2ae56c9a1b1835b71018d22c004044fab31eaa3fc2bf313f3ffa8909b73a862732abc52fecd4fa086005061c071e80e97917def80a9b1b7fc08a0b3747668800a52966a28d437e22d3a22495eab15627bd1d892ceb349b8624212533cb043b40d04e80570708ade848786e888f3dd1331932ffa474054dad9d8462b7954d5a9c92f71e548973148821f73f55adbfca07d5029f3d26851d96c531f342429eb69a6ca3d95ff8c19a60c4d48e1d1c41d31f2c4cc154793414a9d25e64deba08d698ec0eb669203145a9996ce314d817eb125ec14acbbfd43bb0c165f8228898347a8dfedb6d8c6f0896d97f60c95a358898f16347fc53d2878c328b4e0808ad96450ff9b3e9ef872ba0c9e4281e801d8c3d5e9828f179b0a226ea8a15bfeaef40ef2d7502941eeec9f77dd9f767d9b57faef81274f38b70c74659e329bf355302f86f17fae90a2f76626473ee841b39163064bb8e0d70fa8c568e89a6962b2a0a9946dded5e98f182e648065120f64b3fdf996fcf14e207e905118fcc9f452fed26a2eeadf0c0ce4845d7677f1c09a798cb6e54fae517227680a11c86ae4b3cd62895f227d21c3b65c1e47858882544ece8b8861e85b7ee708f0ad5f854f1dd039fdd0c1f05c3d337515001e0f90faa52b5aa18e81e5bbd403ce30fdfc480a659353e2c04a3bc67c31d7066ffa9dffaa5231c72f6382f18478a8102e213e64df2ff54e342b6dc8c4badc6e58e3d85ee195112edebd9be4e3774bb2e8bd8ce73e55bb1ce72d46aaf168c60140e10574c043d5cfd235946a0180640737b3b03b0f76668871eaa7eca75a680aec696afe44521e6e6ab05884ef006b50a7b51d36b258f8cfe9acc42a0d8c825f35eec13e5a86831071ee1e3f93c6f2859a392ef6b8c6434a7f28e42ee5828f30abde08c4d88ccfa1328e89ce2481d11d44936b0e8e48a5210ae5e061f4b685923c7315265adeea0b6988c8d584198ae443553f914785ddf60d940f993ffb270df89b733d6cbcd62d72458a6a642654e4d00f45b997b0755797ab6dcbee1bac6f92b026f02a3a194f9d28503365d2aeee48852b430b3266254d823b3b28533322afa3d41960614188f0d128b833c19d065c89ceef70c1d2ce6245de17a09031db89c2497f8c35a0d36523033767bfbd33caba6c2c1b7b9128fc0945bea646674b2b889d4840dcd4969ab34facc3625464e47e2be225cd18e2219a7e066490658ba685f4ed54ab2b4292a49f57ab770124f73a73d0c742828f17f3db23271a6891d8622b151e01f15351318f783d27b869c7baec8c1e70a6b3f6e61a38ed5154e316912ec1393f6b3d99e160c2d419ddfe81ff45d2c7cd441e6d07c51907a0eb3f12fef441309a657539919b1709a455127a8511f7b3901ad39b9824ef19181c82692646b3572f3f752a8c64f196c99b8be4b10af119e33db77b6ccc1eb72fe769306923ec04c98b669c238be4d454a4a4f74c04fa83e5158b8b23ec7d0c22873463aab9a26b1db770e1297c1cc05cc13012afd7e92c07821346d08d183ed09f67469fa71b1b653caa14d87f558c463a6675ee8bb372edc70e1cb8ac9c5e4ae6a1fbd48bc6473ab941a532f4e76eafd8567b13bab7788dec8619e49c2267d12a4f91562947e2483369cb15ce7258a57d3dd4f9e807e2b17b4124e49d2ba107b0091adefc627e8264ca08917e2b043820153b6c675851596d4d865c362c2dab1434a0aa49f0d2e2c8cd9c9d408c7c80133981e7f06c642aab25097e506bbef782214fd6bc4902cf3f8c0d7aacd5efe45bdc8821227dbb9157f8763728ca68179445644aae6b799c8b908fa36c230cda34fcc00c5a550e6e425553e9ce84a8b955a530a1d1a09d044151bad169e9076534751f0c2641b76ba53939813ca6fe100f4df60fa30f4f24f9da2d58b2405f4a20c8dcc8f8d13e4618925a3d4198acc5800066435c12919d67badc0f556f54431993c86720173ba5d75da6d26e04b7279eb669939b0c5346ff2452e2ab7b553b9a1a89fc4b7fe39512b799a437fc2e2b7e211379f177ccae901e998b1a8c516b6e19a24530147c73172efb6b36567f453af20338985dd4b9c71e04037aedfeac9a480bbc055f5b166e7dd681d8ff72e58b2535a6a3629e58ba973bc6fc5f920dd5122fd4b6a969cff1746956d8d047265791762d50d865856e437c18f7fce949d819764f9cc83f0079d3b50e5af3995b7a750e80236fb0fc7279b5180da8e5054ba16a4bb2a2b3ba4549ebcc7ff5d595226ff31e81a40d6d03deb28ee0e4c3077fb0bea28519d890693c3b2cc0e33fa02b56862fb00b9321d2525d954a8e11a2a4003ac84a2698aeb32008b4278251d8caa4f65929fca5862a3476cef6abd543cfca380ef61573c04f68455ebc69bd9c6160d7372efb2bc0e18a268d92855235dd1b0f27ed6f9b28f36565b3b9ac1b60f2cffa97c3a9986ce6a1777d36933b245b66f968cd2f231889367750c4350232cd5148441239e3ca3125db0a803f8f5eaaf294018e0f137e9bbd3c4cfc211bd6e7d981ed37d2d40bc26ee78b5098d278a0bdd433557d9eba64b13b8ae09b66f11bc4d3b6924b22f779575f719fdff42b5b4498b2a89e1627734e0f9d7d420e4b1e0ab0996dab681daab846b5612387d5a54219778401129001d64c2266add4518d5776c36403610365863e06b8c062c6bde56ac0d90df572eda2abb09c6ceab2cbaef623d5722f7a4a70498f8bffbcbe4b1fa9a5d03ea949b7b787348b09876b1b4dc9afdfd29d82641ca501ce852cf4223c99b4f58c4b155b81eb02d14c0d8cf86cf891b7f03fabf2086b721daf73a00d4409adb6e136977e08addaea86d40b4a7ccb91e18c0254c816789b786c9b6c7d3d5dfdf63a6946e8d0d33d94c1588cd2afb2093a1fa89337a47ad4aa67b09a6c4e157aa84b90662e81dd354cb1bf9b3b447aeb1f41530ede531a1485f39a0eda7c16d71914c36c2dab9c6f4d38bf5c0f7ed73094e688b474cfb1255ec4a2575b34cdfe80cbbe328525f63e09e45c7debf79897da37c94cb56e41c55c02b38028fd1cb71153f4bdd682fdccfd10bd7abb23e413c64be272c24fa019623ead602c22929bd54f58f7e88309d5747ed19df368e22a249756d68d93b656a05e22c4498df95741a1aaa50c9acf0d41b281b61e1a5ea9951e22065b44e353b831a2f6a80ea84d5fa4e7902f3e621c7837649cd0eaf94cf3592ada512599d455133f58cb44e5a3ee67fbc471da1a5b6adb5f0da6d20c3bb317f8ee4f27cbcd67f8a1885db7982b19d5e8348a7cf16b816bc075e4c87fabc7d0fa13376a88ef503ea24a3c185546be46678ce600239f9fcdb901b2adea05e8b49b981995ddccda91bc69b0850020015b16d68816f14d59db9941364cde7b5a5509faee174294ebb350833fc9e8572de0fec4f832f66f116af85bcfb83da65e76120f7bcee2cea65fb2054463202fd463f2e264851d4e8df7eab31b2d1dafa5e66812905b2d7d8465223426f0e07826f4e62d13980f43b8d1034e12f769d73409346f367f2a83ca7a2f84ce86e22f7af67325866cc449e09e405a282ef4ca330f99422a293c23f5364ebeb5ffd8980c08b33abb64051f546e974e97f78eb571c171e1c0d3c6979478047da91235dfd0208fec2c45fa2ca08a2b01369a8fe63b3a4c97d5900d2f91dd43046922567bd729273d92c2e08207d382c4bb6d8281ba71c72ca1167610154ecbb2c08d6abaebe45571afd12d49629c3c2921a9127f1c2f55b6e139f8378e17b64a8aecbc9b4aafc2b5df36a0c2016aac7906cd5dde3945dcd7c943f59bc203923a776d3b07ca0de19d92ec2e735abbf496822350956d14142107a14bcc57b6dea1f9379cae88faa326bdc87e6b53aef8f2c4a7321fe6d0e42d8782a96d282339b59fef2988900f040b33a562384463f7bb765791575fb86aa3b749c05111ddfd5bc7a6896ecc1a8e67b6b8d11f8f2763693ae5d6d0a3560ba12bcc8cee3f805267596a81c987af3dd776522c6066c4cfa50628c37a6189b28ab844d8f3847a0a05158edf91e5ea7094c41030215ae677112c2d0885a2c7effe464cb2a0e6ff2f8a6cefa1366d6ff5bbb31258f8e27a7afa45005ba15a41d78439f2744935c7fd528f77cf2f87aa44e03fdea41d3f0721fd114caa3226853b7c2c74c63a8228b0fde19fa53384c7950dc6502a5905774cbe48b0b359a886e96b20108ff69c817346ca7d944c0b9694a060ac6049dac29497921078a8ddcd021c7621684606edcf0d4290cadbd5707d8ad73d4268946a454fa05e135df2ce28c68186a79d2ef489466185543bc79b84ff898d5eb6b6811d51f7685917703b1ee752146f579a0f5a92ba40304fbf777b21961a4b1531cf0bc1e16115378ef4146632c77207c78c645114fa16d99be834463b7ef1f70747fbd17070bda07370e443d1dc07a3ed0f573206bff01abfd75850f70fdece0b82f35eff4644af871d73880126e6d790cec7b55badf1d5e5d326f2481f820e1b7d0f31895952a729ec1b8b584c5446c35b8baab2dc38f998a01273f2226c8bc3715c8f5c89aede9063735e01ecf092e19282812a301b172601c5ce139224559cd42f0a6627da60e7e6285d35acadc01acff035d3f07b0f63e90eb73806b9f5ea11e096cd615a297473215337acecee5a9ed3f4f858cc135c0788163e1539562d36f7511f1c735c98c1adc7629671ba14b4ddf2042e37bacbe904ebee8352e7f2d1ab0cbe228299c6e3bc65be94f8ae16ef8d683578290dbf54a084172a658241e9e1bd6b13a537eb7e1fe32e61b7022fab70de02173e0de1b243cbb4a8fc1e8679af94a76f8259161ee9b959101567b091e0e051bb275a517c6a1b5af32df53123c239567bd7370747bc14edad086242dff44876117ac578e4b165c7f6ab78c7091049afe4cb399d3499d269b7474d342b351b3c1ac2390fbfddfc5c781a3c2ac86e284c450b178b73f32ad90e5e0f13a0f47fce0120db2fad153c4e7574698a7d6dd4b7bfb4ac3de135c40b37b8e96900d104a7c6b38511177ac13a178e5a24aa2f5d22df05d995059234af60fc196065a262bae2e175144d9e973cb2a20ca0b260aa0d211ab48241eac04dea8e712523bc81cc4a1d77fd339ce1d25eb795a8ab1d4d9b87be9f15c4f0cfda193c58224c9fb8d69f88b7a988ac21d8d65aecb5cd45292d04f5d998dd929c89502330c67a0d57130e7ef29f02223c3a55b783c266b155f0c5c4a94467f42ddfa7e25f3c4498ca3e46b65cb7e57aaeb44553146d3c22b150f9035720e9092d73d7128c94fb625b1f5a0f051b3c0c90e9134fa281f46f5698952e7c65292544449deb73cb1ae87bcdb643a599ce5bf27d32c1467d304c25bccb953379171ee11d342cdd2e4c97574751320a1be1e2ed5fabe18e5ce30e3be0990b691b61f723fd903ad95c93ded7d5ce99ed58140eb7e6fd5117271d2c899fabeb13aa45b6d8e58d2226c03a6ff67ee0a7585b26dcf8c4eb308c912c9e3db393b361cb54e1e65f428578fe3e37984a77ca851cdbedb372258ce237b33097bf0e70f5f05e3ff158cea8f63ee2902af4f0742bc7d6afb585990f06b4302eccc249f168d0c82fe8fde5ba156c1e63489a5d3e2702bbe4879894d28372009764caf6daa29d3d5039d155ef481d7c02c6003c31d45965ddb6a30c1517f6ab52aaf31285622050888c38b42aef66b96e2ddb14fa08b7c33a197a801f4fb6a09c05f32006056bbcfcf58b990d3fa9a780811a4650932117ce35184d00ef2fef480d9cff2cee99b6f8e7e13c8588f6d9a0dfa0a4569c55882f0fb6f1a2f7612766e977ac619fcdcb2f3b0d17cd8d602a6055d4c5c70f3089f3ad59fd1d4fd825238fac323faee142a0d94d19ba535d3bbd17185b99fecf5a9ba8a45049be76198d754ecf66d64f0f8068baa02727075966cbe8c6b2c4e6795e98ce7754eeacdb87710e4774be942808dd2368bdfa5b9e16b0f4c61742226645d400825961099f083fbf98064117c6ea9bb2c4c36906e2357de393d49a648e7e7ea17d639b8d06d94350ee6c8d579e1812784ce7405481ab234c15d824288cf201581f48c1c91f9ea9063ca2d5fd0d51c4864e190df546cba01a207fcd8f608d1e83710abc2818053e8a4969c800f3dc457fdc51cc7d61d1118e6442000c1ef6244d6dadb54de4e8ce589c8b65a380945d873970039373382da6584fa2db4d202a756a464a82a2df2dc62791049f547ea87b982fe4cdaede3ea0a6b10d84e865ac3edbb69cc58f0f8f3be7464583c6eb8e3be0500e9bfea8db387bc98692830b809066b0cd229a155c420d7e6082d5d8f47c84bed4664705250b5caa0a2e3785cb9253a208cafda192bd332a2562f28ff701633c02c960bf671711e9ae17e4d58ba44a405d4b64d969c774f5d1586dfb0e5d114f72c0b0e97aa3dd0eaae5c7fe767a30d83b050298c86c0c61696602c65527ec0f2a229bf02d3c09b8895167fcad6dd18eabafba250af19bdaf8d059355c3701f1b3b19553f7efc8eb929a431f605d00873449e7f3cadfb26ccee76f1b860849caa95cf586004e085e9032cb05cd9098cd37bf8187ac46913504bb5525ea302719be23536a0f2fd3f2b3c38be0f4ebc66c204dc8ffe3b26dfd3f51d99876ab9345f707d8bfa41cce59a192273283b2d4f4744109e8c8c88519ab079af1b38e168ab0eddff858a7cd42d8c517f06e1bdb6fb59e36b582efd8c810f60d01c687a2f638df1f68aa1fa46280fde591b65df1bc90ff4d4528756c3225950a0eab9f5857022bcf6eda682122c322684e8b91fac2085ffc1d810021c73cc2e773b114d766655ff882396b7361b330637ff39d397b0fe1a9dde502d7d3ca9e4eb61561ed9dfdb58c78266655a616fd10fafca53ea49a292011c50f32e1ec20da880251de179e4c26eb4371aa605e034c1d8cfd213d4ed7ce03809cc9ae53f938def49cdc10334cac97ee2c3706967f8fc4087c13d667087598f15602d75552884ec1b5f6ef02ef414077e780bfb480530377dec8cb110905f1753311b332a10b43c5013afb62045ea2846dc80dae67aeb41cc55148a0d15402d645149ed304a5a5bdf8a50b338a5cbaeb0f420f8f616cef170a012a305db7cc877e77a22b7911d24e307113be69f6207cd9ae3f2da8f8c240ba601e2626906c65796ae977b08726f2354e1513fda1d02c14129094406da363c429870b32e2b9be49192fb46dcbd24678deda2fc13e92e2f6efbd8baf08449cd4a9d4125715ebd961c1ea1778aad58678d8499bd1a4977bb8b53bc03e9e607422325c55996405a4cfbf3a6ed7b3062828e6e6fd1728fa4b3c1bc58b709e771f143859e4ce7d7eeec84dff11ecd2d751fd859b861580f2caae105c78645c4dcc1faf439a57c093eeba590fd9eb7943df77f9f77b50cb929fe74248aab653c1371f13545e4a8025d59097dafc16b26db83b64321ccd9faa4fee04a4d2ef21961db22ab41e2101a2e2e537f21b44313ca6b7cf3cf890d8f9b887fdf00efa52ebcddcf60ec0108905bfdfc25439b150b4f3a0a1a92384d3ca93cdd0c61b559757f2f19c752c2278aad4094ae2723861d0b86089f2320db6dbd04dcf29b054384a6c189312e6717b11fa33ebba831dd3ffebd31b0af46b94e2480b9a56a5107f1a4dbe997f371b11ab47205153b13320605e49641a493b1007bafe6436d4dee2b52dac5d9b5af0a122f82d73fe0667c11b98d06b94f497edd1763922c2197a4a290992cd8d6c0ea67dc1c30de4d2e970204ef8859bffe8334b0b2d10a41a7d1fb453f81a5726f75bb23fd2f664cf73c61c5a82ffdfddcee1ace440fe63a4af23951d2f0eb3d2201f023c66f18732cd3fcc5a868c2a89c56667888b9571e80330e0418b6632fb2f65ba9f4b787f10f0dbec6dc7f9ce628c1595790e526b99f66db8f44f0adbeb522a06e99836510241f1b0c1492d7b8b11f414716d33549480198d227f3b693c602a1cf0878c8bab60829a1c84b434122faa40d9cb52f6b03ed2e59ecc8bf20f487bebfc319fdd781320e08d224d4bdc0edb32252c13a5cbabdc771e0ec87addded8e1ac94e74b7101210cdf4747d8f9a9f7db4f62470f917a975ac5cabfcd94d43b81809a51f3d5d91ef5c1b34d6816acd8d46c207b43ef2fd5473c97c4f5ff188d7e8d9e83b0194f1c094ad2002cb840fab2256e77ccf968eb2f4a7f87f25f1571f22231d2dc50969fe014c918f9b6dbc1841742988c6237182e762ed05973eac80f240ac9ba098a4bb1c8929610cdc34f1e1ca03c802c5a3d70364e38a31b22a40f09d519aeb92bc7e4e36363ab84f7976f27e68819ffec250df01f51bc523394c36011d431dba20691bcbf63bc7cdc29d68e601d996613597ab49a8810db82992e541cb54dc645f6b9e07463833135db607e3aae26e9b82885fe0a0159e07785e55959528241b22c7b5030379b0ea5a02262440a24835e5e503c8fe6edd0f5ee41ef605b7d551c2b9f86c2e14dd514a0e06674bf5e11dd22c72cfe9c8fd75a60746a960654c122474c8176a513c1ada8b4983247dd9f8e8919fc47625591117164051094d7788014eeb0553386ddd670587da5eabe8f05c319761e1e52986771f9d514d3076d9c41ff612c0ba8888a140bfb3d41a0b537221a3506866ec28ac037b7fb48173b93a16695b61bbca559bf7ce583320a004f2edc9fccedff536d757adf6868334bd303e386440d43e839409d43ddac3e906b7579be931db174483e737bc70200ab9de66cc0cf5296e5b9e0509faab05b76fd281852a6f42c885f37479e49f1b6c2bba41f351e8ed1dab676d4d1b3cd2671fea6f624054b4a092526ec43533fb37073a6c3fc2e07f7265f0c7df480e05e18ba18beb02c69bc2a8848bd2ec8d2838bdb6ecb4ee50d0babd8f3d356fc5407f77d6d3531ae6679d13018a1894ceaf89220d937c51b778eb287984988ecf23d5cc9c61ffd8c12b0e6f82177154782ab39c3eb1c98bd0f90891b2b46aa74cad4ecf8fc4355fb91f0dfa4dcb50ab895fa869298cef5d9c354237d96e9240075e07bb91a4d4addb2b9467d75b79376921ffc64f102121fe7b524e309fe3a3483b515a32e4b5f950f944465ce6a9724a7c7d1b90d062acba180da5d48e0fd8be1179ddb6bc0f387a559b4300946f4faf99a8e642507c40af5900371e6e5857eadfb5d09865513102e65b82f579dbcc073ce1e4abf21a1006401aa1f45d0eed6a0858be89d35011b36b689a1bb9175f55d5c15bd9bfb67419b3b350a1f20fb52077fed3ff00fb41e69451a5805018f4c5704bba9d72320001ddda7a040a4871130baeb7c8687f018af23a5406a323f7a3f82fbe17c17511db15c724f58b355823abfe073d0760afcb03d0d2e8960122ca769c093474a7dd838534770c79fa08efdecd9ceec46e5f04bbb9fd250486f7bf9284f1fd4e8aa9c2c92ccc3edf1587193468214c08448119e4d842b09f7edadec6befdcae85545c8f9f453c343f3509a2a1990150ce171f9c210eabff156e6e73f6b61ee99c354c03bbb5e2cf479384bf21cfd7053f86f2e91dce89f9d5a0fc193a3d991eee3eb9f4a102bfe1e7f338646b2ceb45061706314c2d74967600b0ddb974de10115a48bd6e407b65b96fbf68801e16f5676c80f909e8d8c44bcbb59d1fbe816aaacbda20fc079ac463705265eb3f5bd6d5abd526012e1028d04d5d24267e3dd5461eb76bf75cbd23666f71e4475e5f4dd2569e55f10f2f62535e9e870d87526806f24ed1b5ab23ae38dbf798cc7975a3ed26e5f8088986708624ab40d162a06577e1747bab0702c45180b77fe3504899689ff66bb0d9193e614db0e37f35a1a5d6c25029d431158bd01c9e816960c7fec92afb2e61541603c4166c3cc771b8d9671f7ed8427c703acae392c8192e7a7c9ada887ca4c672a518f4d5a694829292130b5301c5fad9c9246556d57d965fb34bb287bbe7ec2a6d828443e3c09b9ba2589a40dccc5157a8d35c531f21bed419a893940b6008c09b3ea261c54b37106e8d3ad5c8c3ea601ae7abb381c15ac35caf2994784835ecbd5b267446bb6741a94620319a945424fa09a31a8f20d9a8529d5979a8b82a1c3684c907fe17ad4c6cb9cb7d2e54c11eba7a2d064bf8c9c44fd636e5c83a6c901cb70c36359552a09cdf10bf1eaa884b590dc56bc280df884d5db035a089e42547bf73e58d4e920ffaf971920a1d5d36b3dc8b4addfc27ecd64bd8bd5108b8d750be0d4d17ff84cdd83c05b357659fa604a9ae226bd4f29fefafaa4a2cf7fb5290c273ada42530f5789f335701aa06d0e60337ecbe8e53add6a876b8d2d6424ae37540e3701469cba69d1bca698763a2d8eaae7efb9cc746df6fb59f70d38151c36643d54565fa07ce651a5fe66a18f1e517f26ea4d3e33c3764cf8d52898ba0758ea1abb93930601de3efa36a681f8d3a82a62e3d6f36029c93a04713480d2f0d5063f1a5451cf3bd6c6b243647a06c051c8ffe72e8649f0d39419d2f65cf88a35c7c3ccef4aa40bac1fbb1839f02dc0f4cb058a0b46f84910cb5a7b4a1f67e128df333f12ad6d1141628fe8087bd478ab2a43ac9e6b5539bf46b0d093201b0b8b8172b29ef5c727115753bd166debca28cc46dc28da9a71091052a6fe4050f2ca8945d421750bde5b3eb674dc875dcda387854e86cdaea3024003dd2da178788129701abc490d2a60e65cd6e58668f3e6acc663ac5a582e15b6186607e888f5133227554cd231d65b0355caa0b0b30fd609c0007864bae7dd4b7f94b075e892827eea01b48e145634a961b3ffc4668ee70059f3302a9c75027e318bdfd90ca0bb494385980f4b07ee641a80e3796bd8026cbd7f3397abb27daeb2a6e45e64a09c7998d48cbcf51242a81136253b9ccaa550b6d0d738f41371d1d1374e91ff953eb06d2994347c611de66838785bc490d4fb43efbef9830cecb99b9c28357f407a33940d2741ef3e1e6d610d623de8f5e869f6a369cda5f07e5a97a9404f39aaa9514c7c5f5cbd15dd6d48d656773c388be6c71e16d17533940d220c6062ab4e9be25914ef67a792908325e195f22ca7af4fbd90c7c513fc5f6a7b1591c2b08864b99055eb97d28a985397070e0003534b74a73cfc9b64b6bdedc0e7cf413a1d86674c3069cdb7d57f19671d83773c9831cafd8bb5deeb2a249ffb76bf926ef89c5633b7cfd6ac915e1e3ff16fa47e0d5cb355fa7e1dad9a17533593c00300c094d7f47e7ccb7deee9b32ab6c3e7f82f3a744435e3edee259df40c0693e8348322cb221373c7d680d84e36518bea05bf899c14a806083da78a9ae98971ae80967be23917d82a7d806315bcdc13cf70510ac45bf14133cfdfcee61c26523a1521bae66845b811e7a8ad000e6e248d0b4c1621d8c0b88b7941431061f2591bed26af37b311f8aa1f2bcbdb89f9bd62824ae124cabfbad8df5430a5c5f62251a159848164eefb3f67969c365232b806ea967797fa94f5682c622afdd3d32edb039569e6c1fc85de75b6251dafaed7ecdba1070076af31d879315d968c52191c85aed0811bac2fe0997a223990188c897b5c439ce9c3942d1214f697c11a1ce7880301910609eb2c4173d7bbd2ca8df3399f181fe75cd0b9281b949b1d3e95158d806a51c6f1515d65bb9122dcd08dd18bdf4aa94ebfc25efd0a18bdfddfe136b097556f6cb445c21aab47f1c20245b9017945f3318bd7200b4b83f786d30dcd6de0de2ca60700aa8bcaea7b5f90ca13ad2e32b2d511b719b811552beee15cfe03d266e3b2b86f1b07650ca2c40f1b597e5975506475a0bc571d210e584d952da10057bee68ec05ca31a4c5685e82701887da45a0d73a810f2c68cb1aa3c5b7422c45fd1f2a9a1c88878e9bafa1b3f6219666daa573a15287ba59f39d52110aae65e51bbfd8a05b3d8d67ced74ae9bf1bfaf568e3cfa2c9a4f85dbf428d78f166c27abd76826a745ae53d20ff771f8be029a55b21cc3d342e4781b021d9545207506881bbfe03158ac881a69fa158c53a754c18e13ec8ce7da8d9c38aa1b02cc2d4791d7808301ccb3d4326123305520e8bff40e5b236d2352a1e5e99415622a9faf03269d5aa5c4452631e4f0c83145892881d489b86a60c02597f26db2a71d644f6888b95691a8c07e1eb59e32b0f3972b7543c5ed30c461e967f80cbc254bc128979da7ba993629fd87c6afb3b7ff6563398737b1aec41bd769b645c83871c8a6bf6ca942aba777b175c6f155762a85883f2ebafb1f65ae5abf6e84fcf06a301f9fde430b501a34ed171479ec48da03d8519895422906f8e6eec296efb83a6317e19bba83ee54e7deec75e6cdfab17e46176226e11276561f66ab7e5be588d5bda4f6c92c9aeb996cfe248a563b3c6006eebd1779ea6099d4c8ac3d0c70b231d7dab7f33884cc021e7e997a121b776526473d0702bab457bb723dda06699bb87f19ea6ac0a6935a8da8b92db5e55420ea9ecfc5a4b8f85f835e76eff1e92a5e870f2f7643b04e80a622e8a41c5709619f65a11eeebf2902dfe2c6322b463497f102695470c44ca0360fc78dde875db9530d6a24cd16d8325d84fce0724961cd2927cd0d0680876d60e1490c15c28a2c42255868f82e0e7007346d6ac2bb8001b675a92ff87209b83ced41ccd9143e0bb4a5ee445507c2aee73252b13b2cb72b578fbe4dd49fff1d308fd8c3965341ce42616712e8e42020828f3739a042893bcc291bf8f7be2a25223e0c9d858308eded7a86174a2cc164ef3179cf2d9375dc64111dba695cdc6e2d804de67b721971953cf4e9deeeecd39f1b627ea990728d2805811e4533ab14b0a14c54f18503ed2b29d32442d58c183a47650ff5cbd1e777e9705674385466d036c8caaa16ec08f668ba1e8d5096765453c7e7c63634bd8a76a1d13d9370120058d0f85ff1433f4c6c0a44c765d21fb378e04acd2b4bc65e36e0c21f540c59aa4867bbb930a13a4b204c24c1390042cd703c1da579f5825e4e8a40178b1574c93be497b04fb0bc0e6d121edddb6bba84c2a5642ba8d62a661ed9e56faa665e7de2022891ee3b09394ea5643a44b5fe8e7b6564bd0227336627652b25872d9b4f0d75d178aef953c97b33d876d57141c4f1b34108baee98d3a3ed0d7247d15a42f630fffbe0c2544fa69a197636f9a105588114c9c09f029e4b57ebfc1f8618b14c01e1225fd5c2accc9cfc37e585157ae1827bd94c5c778da377b6eda86b5443f6fab6843ee658a0909475ebe5604193213962638a8073e039a4d03f07a02b63cfb0abc64056d8ca7b59e71ec05f034775799d2516bdc4085abe23433d529afa0ee6de9d15d0f0838849eec5424d4b89b68198f7a9e33f09cdf515adcf0df72a72f811330b0840364a8399f6cb927cd62dadbf0152720dcc8790acada951ddc4023213fafe40adb4c30c30523a985d2907feff0a0adb56ce2006fd5545e848a94e61c5f235e1432bd6647d6b7a29062495c858a2a2a5646eb0bf9cfb45638002f1efa2260cdf248648aaa126d6a81073c53977b5574cd1338e2fe9b651b970ce801335f83e172d19ee1965ecd4e1ef46ebdf7d2a66cd7dc353b196737a9cbaa21f371bbd259a0f5e81cf4ac1169810254b2b4c18227fcc755e854b1f63f7ab08f2d98314692f8e209506b0c25f1f1f954d9c44d8abb4a55acef92439a0a1c47ded26251a0371e76bbf838ae424cef55cd5a10cd0635c70ae91aaa7357cae751dcf65a74dfc132b4bafa982b9e70e0cd008b8a570170d1c6bfe7754cb694e77b37b9ddf88fb6ceefa35d2200b273296cdc7b88ce09e2206a21e0d80db147b00fe44764b385e29b34c45619caffb5616543134932d8fb56c9fc68b6e19565d9fcceb2946f909252fe50f843a55aea15c0396c64c46c1c81f5b3bae1b1d9ab8be2a49eefff85bb76fc0294a9241649c9599f10b7c790a3b795001d7a742d008023554703c41f7f976fe8bc1bba829a7a59982bb813fa1a272df2cb689fdd877b8266df380e7148e0311dc482d2a893d9b30670c0d95da83823d9a51d84aba252d584f15287a8cd4868dba90a1965b7516a056506407101bb4c361410c01f44ada2b50fb148485cb6ac863736ebe263bfdb51bd7d1166fd208434dfdc2d416f8ecbb250dc20e64f79143463e6e619a4567dedd0c242a6916debab73b45b8d1eca850cdaff861bb5af151ba00a1180d858332c1a81cc5bcae9bee2b0c23e32020ac9f592826abcd039d5c5626b85dbc3955abee5c27cc40bb0c88f91320e1fa1bc5773ec4e84d305cacc5feaac7bcf829b42a0ce8a6aa2a187d3b1b17317997334424db6ebb11599b1ca4ea8384ba8afaa809f5320416aed186183c0214be82d6c3d49442780551cef74a138fbc2902791872a5025058cfae15ffbfddd602960f635232e557b4e3e24388080986b63a32cd3ab510e8e57305bc7ca3db7a974ed4174924191d6a5c25230921a871c385309c9148c574b36f811dbd7b96240d4ad5debf356b5776797d56e4fcd7fcc8e1755d2e218af5df52f81d8c1b316d421acdbd4eb1788cd3ee83b161e32f4750e3c63acfd3e590f6998f5dc8c1ab982995d31c8511ce743533c0fdeafe10834ee574f0a3072daa4c271c5d485ddce51e5b7636bd97f9e087d4e060767ba2f08757901f39056e0e3ddc573b6e469eb82a0f1d86c47da50e860913b35e5a3c66c104f24cc793b0420db26b687fbc3fb6787c669a20cd5bed14c563601c3bf44f53e9a8b83828910c636d98d880411f741787cf19179b44b4d8d9305b9f83ef00e49ef1bb36404748c9cd678523f7605317fb1413e1626602e7990de4b15a5d206028fe80744dc8a904759c0e691342123f68bffd6ac3d64e08b778c2c64f65c41bf13cd27ce92c4fa10660ef4ea2fd1043c763a0679801b36241c1017da492afea213b82d5a976fd6b0cc6776df52b25703b698aec8dd2ca7337b517e38a78f5bcb86d3738725e30bf4fd9e3ef8fa84c35e16231d94a4209dc0b001da3fbe13baa9282dfb61af5d98920899c3150880532632d8401e91660f44eee4216a22182a806a0e8ed6f32746f6adf6aee162ebd513ccfb08540603d67ccc5fcfb238e12946c9973ad4843300ec8dfaa84e4b3efd8c3606de70bcdc2c762d7b3ea6ed387d854d81021fde89709bc935bbe683f722b1c50a38b443c8d4913387b4ec010c9287afb919aeb8bafd430f148e92659946e8b176d18e54962323f957fe81c182a7f9a21a35bd511b9235e7e53e66a9f9bbf22346ff325aa3e5e36ac72d510c21e1be34d22d50d0a753cdce6f97576ffb7c8d200b935f27b8d16a4402e506684fddc2348436eae57a2c87153058aa740bd48422599175e177c6f01ea203cb7d5baff31bc72e42ee19a5d8b32844eef7ef2daf54956d70eedec85e5f9b7d114f06f378c3940336f99314ed5fbdb7ff62ef9e6a4a0ab739553e8f9e0363cf02ef2365d16497960aa93571a031c7327bccb41f466eb15c35b74c221016343cb6eacf721575ba74c89e2ebf70d3b3c65ff9fe7d341ca4f3dc7d5076741c329498b8f165f33593abed24cd20da66e14be710b86a738a3b945e73bb147d304c0d0bccd09b03dad138bec1fd44e751a65e3b11faf657ad5aea85788baa4ae1d25a4421554483b3c6bfe11727771c2a3d4acf699518167a848a1e48b9105de9ba5781f69e451edc069e004d0aa342650b8f146ac97f3ee37e3acd9809ed66260b30b69895fa04874e507a74a446fe9e9669c14a05753cbc37198f1dd97cc529c89f65cbf184c806c025ccf245db37c19c5a5d74c03a2aea7cbe2db5def57fd804b0353d1bdab3c87b91cdc159753878454504f202043e1ec4f9402c6833a31816b5f60a19eaf378a0f627e9bd02b050ae0d8dd6c19a1255122a82f8ad1e4716d1278c01e8b17e44ad9d3a087fd5cd6c7e9d3ba59216a97e089bf41774b658e73678734a0da05579c84c6cc51b88a98c4e32b5e43a2ed4c2208c7c3ad42ba7d02348f80ad8e1588b2214573518f241ebffa4efd34070ac481300ec344e9059c5102f6a2d03dfbbb967ffc5e84431f298cdca963141c6b195d9acbcbe187d73e0b30fb11531d797cda5165097ed81ab2bef2f2dcb974a74f5ed1a64a2e8bf7f5b1ed832cd78399cb5b989bef662e04eb0e7b65747ed8963a9602fa571e30d141d5234597ddc1fab265d04ffc61fc0e5146c74b9ef1c39b8498b4ebdbb1f4aedfbd418463412b39bdf4d6c561f9dbf2361ab3e62407e029c4cb2bd43122568f02423b463c24d61df2472273b20e60c5455c66bfb553699eaa587d77dd435f573c037704ab182216071a168c60922bc47351fe35c60741cc2bdacd685cdab70f5baf74887fb9e089057d6c350515d72aa1da9cce97d1a64bb184bd671c154963849f5c24038d3564f2a42cebb6adbdd624066ae9abca3a19a4238e56e149eb6348388ceaf6bc5007d7153f03c69e79864a07cf57d55e086f0fd806110edd51cd31eb80f82b791c5146467fb67377ac3970185d1bf09e2c2606d9d457b637aadf664c74ea125b5d450a708ab1fb62ed4f012ae37303d832e9b7d1560f72ef954b52adf477cc90f9259dc2c8f84a4bb52c5bb95b9d9bbc494f4f42926bb56f5124bb226ab13e24fa2d2a258f2c66fb49b9c40a0d6fca07be48fb41bf05aabf454337fc2226fff3a97b005cfaa0340bf68dc5f65de108d69f82dc5042c657f42e48db7306d273ed10e2621bc70d020275b788864a5c2c32c169cd222c166e4f9812d2dc2ea8b65281e2332ef9719ca67f5306d0b8ac8e52c2d9edb90e95697aba48f8930a2b70d364d11b73e131de32243a0149721ad78a6fb5ba0806193253a0cfc4a78b4fdb7f14c1091aeb7e360add5ba00d66de109fb9a5fa75f32220ea58e4b2ced6e62bc816591294d915df551b6256b60a87f7898b26d2eb0c0253012dfd65d12080be54c3dfe7d1348bc77bd135651713123451492e8282d58f3f2c42897faa1983ad3e144e09e006c3095555633a41002378dbcf82bd23bf66a853eea0b9817bec31ba4125025a3a32af2027ed0200b2823ed1d4782dcc67503e1a3152fc46a9ea53dac194c9518a636fc065025c2b45462cf30b31b877695e064f2d050bd6de114f17cdbe05187d760d4b9916d0644d99327db072c5d1eb650d0de6cc829ac62e4a0d477b52620d8f0dc20aba26c171e95176e0193689e41b10db92298c181fb14f9ebc30acb25501509ace5eefc025caf986d739a6ae473f14320c632df0b2f1c8436ffc9c5d8c2bf3698161a47ff484d569bd208392fe20b950ccfa5e5a334d92091b5e33bec8c62b495625411ef61dd54ccd8f79310942676e2ce51fad52f443bcaf428427dca416b285253508a5ec7bd0a34ee1bcf21ece66a8d33da8520f80aebd315cbfc5575adf760a591d1ee98f4895ad464e0e7893b7dc323faf655351cfee326bb6f7f46c6ea9c6fc0e52633a5317c5d38eefc61c2a4e382d11520511a2e14bb0340a09bf43de119191af0db09938cb9984bdadca7629845a621b996ccc564c63c846848302affe8c54645d8aeebc7b5733b51cbb0a17b1043ebcfe0d5692f7b5d5ab437e1285ebe2ddde51bd1230823a2fa991b5128ad3f2f40c114f7debf80a8e695a7537f7e22e5b4f12ab0d399e536d79c43f432a7fe92bfd366d7175ab11487de00f26162411683b93f61ab2c819a5b7d53e798c8592d5526444d83ffa590dfbfedb9fac2dd5d244bf7f7523d15f4ccf2d148aaf3a91ac5ea4d554fd9b5ea8ff929bf8cf50826fb3fd9b091ca67e697b75b27c4882fc39fd0bbad2d2b2ef66cbe30771aadf6dee8f3ba625abcdfbd19096b8a3f224a2e1f7f350ee4658b487bac55ac475b96a0723a8b1380892663098b8bc383480ab5b1f4ec53ee1a7915321f7eb9941a9a9fc3449227febdb030ac11cb3b58b012b3c23630e7401efd33b451b8f4b46e9a62e87291b9b8c57d11ecda22c3da2bc1cf386729381e7564444c74d87c8a24dc1d5d13fcb67917f06be75f41162752a81132d7f0f49b5c9a12f7b21f3d21cc8e295f5201ebf506c754131bcaf4b32151993eb67f0801a7330411eef24565a355c2ee2d2f4e1603e3724f99085ad43db0ab192b9b82bf67e42fea076012b73cd7c489c911abe2363f94942272028215d4d797af06637a2b27409c9e27ece956f61b2c0eddbde5f14a5d7ec4995a6692423a3fa6095a394ee36087792bae88a8bf9f543ac4fc8440d3135acf91a3bac0b1bbdcb438fc7212acd3541236ad1a44d18acbf1da6871153a644b19a7015527e07bdca395345ebf8141731d3b064900e082095c3fdc2a7c01ce2f5c640a42b7b8f860a372d41eb314a348ba2b1fd3d2836dcac9c5771726406da41320e13277516d3beb460614ac3d0283f743eca2075bb8444e58d35d25b4bc93ab7952716bb2145170e1beff6a14b44c3b9b345fc2ae8e2cb73f1916999e64c2c8be0fa1096594f1a9beb36a70a9a94d11ead3e18679dc6c70fe44e355ad4152e5d886f195e698fb83579ed1c77709349875176ead0512b651df9ed87753af3073c4aa94b794719e55228260b9aa96929cc827961fae2453e735b43de7db5c08c5db0e18b306520a9cf9ca780e29c6440a0b0fae533432e347bcc4213027ab677a8cc841ad43b662556f58dc12f7d4e9226dc48cee24e38d454ded9e2612b23a9251e7cfb4138a0b80655485b192409d7987a5aead5deff4992b0425e176640e838a9afd2c01dc5d6f9b729be44c6e906b031d2eacca7d195d0f23f7537b7c784588591be071bfcd68c7cff4f24d9ba21c94f1570d6300a679c20f9ce4802f6c146f814cae8e12d6f781e2e2cbddf71bf5836b55cbeea5808364951252e1cf9a661420ddc8b015706d09da62e91e1609f1b65fefeeaf62c24bb68e342525bddc8f7403a94e1a8879dbb1b14c465fdf27fcae4eb95d6ed2ffc5f377eb9f2774028e5446a3b417bf0f20975bd5cf6fd9cd31460ed8334ca296b77bf923441f2851c82e680b0d7e2982372a894592c756138c0f67865a85c73b83d07ca92c309bc0222a3ba1354488d66d0c8b68c4615f513ba29eaba171442cd9cd8cd17675e2de4fa4b819c2332530ae3744c53504dff0f7e52322c9c793c2d363abdda780246b88a30452428e22cbdca1747847521672782c0bfd907462606c2d7e2b5d3acabb36567730e720188e66fbb6644171b6a4ca5e8a8a2e682c942f917cf84a2335298dee4f45fb4b5f72d378d8eddc2ea0a832c1671d5d9f5e1084fadc1ca57a3f55b9165e935177eadf26b213a6e42e79b91c6435b00831f9d5310c767db0c507ced63f41c84d752501b9d4281dc14a11fbb00f3d0bc24a6cae52cb4dec60ce06430b48fe9bfdc07e8a3f9fa56249d767181f549881ef6122ea5fc2600447819b68a763563739647e0b81c119ba9c51603b05ee342034934661e28400f8ac7cc6bd2b984885560f6eafb86047e6688967a497c8199224f33a0cea627abb70f6d29725521a396abd345919c253c4b2899fadf68ba1a29704c3ea887ac48376808336950d3160f661e69380da3a1c09554566040cdc4d36341bb51abc3927f3ee8edf3c048b829f6d00c732dc593791e7859a24853ff8d741e1881a0d846d733684c322c81b9c952b5221bb7c98e92c50bc73df7243c443238c4aecbf56853c8bfabd69685728b8b999bab13ed60ae1c0f4345409926132f7bd8b58f0277a46847d545faed429e03fe767496099560cb511def501034c80c45a9ff25380dd28ce3bf335a7d0a4b1b8216267ed0462e6083a90fd778347d0452aef40ca4e906bb54f8a77179fc8917bb306e2092e77a934c8138244c8f51f93fc896a648f2337fd1ff0cac747e423b4d85a6bd7f138e7afe3be58326f025c34748f1f1ea0158be901e91624d221aebf1a2cb58cab64d66fcbd9d77614a521563328ee761835cd70c276aa69af308cb49479925c542468cbe3e94377c2fab76db1121e852b896669b051d1a5f0df9a5e61e45d324ad0b7602c4c0478316cb22056a3943d35225169d9996700fc24d58868f7eb540bf256991d75c7c256cc77c77c860486ac70b58cd9e8e81c122f7a5b5e1c39d9ab8bf2f94f4a75116c38e6412ecd20af6b78525327c7aa703c96a14132c795f673e95513a43e1b40c40996773f3672a42ebb682260101d8ca93e6d0d5f1737420b2980628cbce2c4a464095258a1d976af41e6e05ab4e3027bfcc628697c5427ca38e44593948735dd9dec65adf9a9664dc5f177b83497959bbb4b0644eb3cb640ff16c5932f34830023c44b634a4c3668697daa3c4b48e4ada781400abbad5a92199cad5a508b01d432de5247b32474513d1c5b2b3db3456d3b8efa21dd7dbf19d64d36c159bab4a6b1a617b9963da24d2fffb3f3eec3e84f6c277e837395aaf5927d26130badaaed8d3a0f8e714a2efea51016cc469fc0265e8fa7829d722199b03bdba49ff2b89edb791a4db2e770edf26ac9ffcc6ba75616cee1778632d06029414707f5f6b368bdd398ae56fe0781e05518141e4634486ac015a5c9519b3836163e897d1fad3a4b84757be2ed6c89aa4e1fe8adea21e7a2c14354126d3cbb2fc98613a8fc7ea1339e74afef8bb4ce8f76f4e4cfe41f75fdd69aa1cfc5b5472d22c441d2e9a829a92663cfe815e7746de265693fd7eeab23261eb32ad0bc9f219559882963a959540439d5681c79a91953742762ce9cf78a124a7c5cf218ac18ecf7586897a96e4f20ac739c52ef7d01aab3a95436e800c1a5ced538762d23edaaa92924ee66e27b71f411b10643465c542e6ad7981d91215a96c86e0739688b3cc121e33fc322b59c813b261b6560aaecb003d8bc98cba970683cc40c65117de212fbdbce8a1aa0306d564b9ce41ad6ab3e9305345d958d115e7bf74ca095a955a8e56472cd3575aa77724b0958ca0c15392425ec9a40e3a52efa0ae53767a1df5ff5e044ab4879079ecda1157add15173631339ad49b78599ba78cbafb248dc789030b5d8c77b218f864d0be4bb5a2cc68c1e62b1050650a6af06584be07708e071addb87e100b1ba0a490b14c72478fb5df1aaf407a6685c326b44b75d6864f1c586fe3c167741e5a09672f45345457dfaf076dd8e4e320ace19cd56962fb4d2b7b2b0da2cdf92c84431b1d48c13d68c484d495cdb94fd80b8149093f71377aad1c898327b30d33f87984bbf21b7644f86e2a19d1b6e4d19cfd1c6b7315be74292fe99475b7668b23230676ae4ce45040f9bdf82de6ee34a2aa55ee44dd7d4a3a1dc58716b61dbfa2063badfe34495b0283839dca7af8b0a673fba79c59b93cd9758cb98d49c93391a497d72dc36e53bf9a8c0346b5d600500366426aa96572523fa247e06dae685b0d4a594540201806a40ab634864437a494d84361d26102a4fe96c083725765ad965efd04f297d63da1a359d4d22456aec0d2a691bf42ed908c4fc9f43a027e77c4757fe94b451bb5affb9ddab0f0a828f24f608d76d14ee13f3caf0577cd9dccb5966bd25e409f4d79784841c11074e8294424734c7890b56dcdd9809be7311a2728cb8532a5e757e0ae9df0b09b6a6320fb9d5f950edb0c83d3251ff01257e6cd3bdd46a957dea7b48843ab1fdc398ecf8040c2ab7e503ecc1c09c5d0ad3f71fd3374b5b63107a90b2e6bcbf25391b687732c683e8e4f2dd97ec76589070260221eaa56773fc874c301ac264ec81eea7cb7bb1d2884de9a3409db788b8d217b784923f100cc6ed9d43198ca79231cf4549bb3743df9698530134e1c4ca85c9ad34af3bc359356f87e8a8a772f73ca67b6c0ee35375a022a0cc1d8152320c0fa57eaaa81dfce540882aeef1a2dcd6d04a614ab863e1db97133d23a86196618a9097bafde0511435b28c2e36c9e475610736dcea9debdf8caad79c50134862575aa20c4959751a60581a72a51d612e06179be0e9b3c3c9b74ecbc20fd0863c5d000612396fa307e09b17b3a8433832c64704bcbcea6a44c16effed2652877059c4161df64a5a494e5f6313e871f91e261541ff829a144dbc20c6f9912e3cb11d6b3ee836bfaa963f1c4006fe9653aec0fa28fa1dc498a94bf82f91494111ca3e728072ff6352f8af1a39a7be20ec3421df866d2f0778b532970f9d7256a30a23249c07b91628b10d87a8422e464cc578d7c14e71dcb5dae772c51527498eaa33495f8f78999fef8ba499b8fef88e75e7ae4d6ce31867a447c144aaaa67eb87b0c4f49d448cf76d6a04455786379cb87f6a6aa5b1a0330865df5509760c07383243e9d03ebe5447b61ccc1d54de96e2bb3cf239e6639474425c44687b3b94c9fbd11385dd744211a299c0105927662c1ef765d0cbd0a8eb45a0f620c982e8423956d413dcb4a59989a8720e0740573147fe0350f158f67b281072b468f93a4fbde3a6b601468090f5b1c0c570bddd4be80701b950e6750e0050d53387c270fd9f60877ad269b3a6753b508146a43bd38275e028388fd51c07b0263481271253a755e93080877bb4e4ee25904365e2db67c104c6e0a124e13113d10f27837bc737f2560243562ddcc8a2750b96694632dbaefd32e04ad9c6ed82c3b428f0f74fe3ac2659f47e02b07db110aa444fe70dad05be53e2810ba503fa7c01163d010e2e651202aab1d36e9004d4e6bad308d2c716bffabff8c134d0de7018332a00e0d4fec11775edfa3b247831ed10de044004c99d507615661197594f0df9c6f8634db962289dfee05860ab557ad3469d5c8315a3f9829750efdfa5403ec73127be38d10a18782fa30bca08052d9206bd269112d7b174a6c17b30641e990ee88f0835e8adb471cdf42104df06efa56b98025445b8a3889e9639a6c7186e14153601689698233471fc31d2153591d3f0927863244a4dabce648aa8497c855803b5f1246771b9ff399d60a030b855bc871a6a26130626cdfc90bc820a88aa592b134cd9677a8beb080ad505c3f213c0693c44eadf24a0f31b2b5849aff17a726fd3f48156a3e92aec248916fd4e0a53110ed4475a50abdb6b582d7d6dde8746baa7a2aa859cf49a753ac5ad609bea6f78273c5b6b4798ce2e08e9e97c2f77474b27abbdc1f8ae2df844f1c3c57f6ae71a638fb17f9a037a2e9a4dcf32836b43900a255d69aa0b46e374baaf93dd2f00be110e3be7f45d35faca73fd63b7a8dedb5143c13fb1bee16f9fd96ff49144d3e897528a207bd74281861de1a00d41e7f0627c2183957be936764a6307d3983cfe627ac5d181a2ee2e43c4461b29250a4396944a99a1968022dbe2fdfa2f9ab0ec4d090f5492ad173545c379289b889fa394394a25f7d074ff9efc1504167b0c72dc7dc4bbf9c9e2feed26c6e69a41cea92354b1228821aaa479a3aac320889ef7968c8d8ab698f91be67a428e1cb2bc8e221c1082c95bc42dbf4672a8ae814faa2e1db905b11621cc1933a13eb32c3263ef193ca854d27d7ba05e0022712de952b16f6c4464129834ab02eafdbb229166f4e29541109323c1c0d229ad3c1eb56e096101f9ceb45427ba6fc3e45511d016f521fe0baba422b846ec176206d29fe0628fa59d27f801b11f8a2ae79645485296d8aa65e04c36a9c8a60e84fc0b1ca42ec1ef58b700ad8f72f17bccf67f0f3514f66ca2cb192072e039c43478b0818e6c90fc8b4f0b40978e5625d6d045ff076015434ff120cba585bd251fdb281cf41b24d70e317c92a9b849dc82fb4908d1e823291e516666f0bb6b4183bdc230c9d88caa30d331a72bcb4a742970f2493d9d38c17273dfd31c94d43a817652aed381436bac530899f356b566df43e4cd3ba98308acb9aab23ae739f32463e150b0103331cc8336e3d74a59f5194a0626710f6e6ed8565fae41b89d3330f5cbce112c05821f4495071d91c3e03fe41efc7073056b43e55c128e05f11b443702f32c35609fa73f747825887d1de47a83e6c0a5268ccadb05a120819de8f32aefad8282d633c5edc7b8f29070646efc7a7deffe545eacbfd98242c465a4008aa7208749130aba8c1b4ccf010ca091f4af41eaa7cd638966970a99e76822dbd59e3932aad83d42b37d6b04b6b5c84395ecaaaf212d06aca1e4e63844a78413ac1b52c7b2d6607ad2e4e82bc1598d21ef6d3e1dcb1f3a6ae84ab58e1a6c29385f926476cc0486ba6fb8cc137d0c4ce3fa31c6bb37884e5a9dda6c79f2c3ca7f49a14dd849c7488bc0f4f73f3c29cc232277e29a947cc857eb2f78ba900f727e891913890ed204e63d88c6f69118d480528c5e4a0d91344d201dae535b647f604ed4d184bf14d21ca366cd4651f0f70df7c4aaff880d65cbcca27a83ccc6c544027149593208acfa4f9cdbd35cd2efc94a7fe1b6ef382475d8a5479152d8381dae8cb247a1e9b8289beca33a45425c1d9216012d179ae53a20cbc77d6f9a9316d9f7cc2b7a691d82a90905a7a2d54fa438f380cf97e8186fa1c19f240dfb22500f2871886a1aaa78bff478f12105dbccc4b9a216b91782854a348776f83ba2f31d60aa6c47b87243cf3d9b2c9054db59a0646ffd54fb6bcfdbeaccf0a1c97074c7951c31a796501cdcd857e1d53f4094f89e09d56f424517b9767d2b3f48c5d064ca3cfe59805eceb9153f268f41c7dd92d74594b8e4c544b86189ccb0e384b48351a268727dc7fcc61b9f2cd7de7e3c954b7f3501e8f033f2726cad2865c5802001a5cd272006e0555585d272e78b5c883c42391a88756270f29bd8385bcc03a280aff67af4209ef75b449486dc6648ac449765ce12fdf476b6c5c1424923a4566b7d9c389c26f44b041ef68f531f4bb1e5b666eb06d3145da5835ff77627b5c0050df730ab36c9d5e764508fccd0e8e7b2d7c13f07301dc1f4354c6ae863fb6aa470f7b684d950e2e1ffa99a8d539b7a63a640dae1dfab9c13c89540a8d287805df3b8f426ee1fbe47b241633ac55d8ab37c575e77ddc5cc7bdbf7a47d5ce30c64f67cb3cdd201c05de8620f4a7a5b61106008984f1d6fab0c8d8f9e0e96d06e5dcc7a8bd4c0e3e61a41a1d972627b619aa08152f8f53e86d1e3a6837a77e8d0d20d43d6f3bca966cdf24f13a5fa2b352f4afc3ca54345aa8e2763509f62ba7b0a579602e9af18b1cda6b0f1bdd12e9256bab025b364259ffba7d0588bbbc3c95b7aba257a55f2682cccc53e80315181f40e3f6a4280b28a078a7b529ba50fe22b98df61310351ae43cf475f84d7cfa025413b80102ed9db172ed71fa9db750b800476d4bf4c8cc7bc604e1be6b1afbbb05e6a12fd18de6a991a610c0df30c49b6dfd3e18e18da6cc50d7ea202326299f3bbaa411fe5d0fb7a1ae8e54ca60c27619d25625e9a0c202ca6d22a8debd07c196714f112a399cd85a53a79da938fde91b37419e6b4473547057a3199ac0f378d3b3377b990a88f24582f83fc495e7938de7bfefeba9922dad98ad199d58ad55caef030007e5496b3ab5f1634928cd4c081dedfa1bd3815cdead98b74b5d9d03184b1125222337d922179881b6aed65876e021a4c411fb15a578dbec3cd8e0e440ee83b2764a08a69b0a10bcdf676b6b60fdab0036abcb7a95ac7f7f64a53603974586af87c60d5e4fc94c9b53f8b87fc0a783603d562b29c1a660651741694c4f6095938eacf4c92b02345138a349370bedbee4317ab42c4d7efc9a19fe41751980dcc3c9c759c4050d5ed1f8129e72a040985e56a787306f46b2198dd3d09e192c436108cce320083206d35bf217c5e70156554feb437d421ffca8bb0baef75faebe4da5ce78db2c51ead485c03c582b7b9309b7869ded9f1536e1f581cd9abbf34dc3159ce52f2485111c2071884b8225082560415fa1ca2492b7af0b215ae81ac5638fc4893ad94a56494b4f7a25c4c375a0e8be9b36163523e6226a35fcecc3d772c6d6dab0ac098b336c577c7bf20a05164c092518c8eb4e27998fa5604aae7763c4f21a7676593b9834c9bb11f0e1695454a1a6331dcd4d2f9560939d15d667a63adf594dfeacdce95fb465062d0e0051c43421d84c8302d38c2b904efbdb7fec011702c3029b05c47a69797c77ff5bc0c43e566ebe68b22e47f4282ecaa90019ce041623a1c6d3e53c0e84a404cd45ece0fb932ab3e4b3b666ec1b7311fc73e14ffcc71f6f7a52c09e766e294d42cb6f4438763906858dbec7211dc87acbc7f55b440f5d69a9805980d884433f7ce261ca350906617753561d9e229f2c5f8519a1829f4f94025c6e99d403627cda7a866a9b8502c24348a413c609b4a02001bd59dd833dd4550174b14ea8c36279b311dae5f40ece78e66ac812f904d2b981e08391ec8f66553233c54d1f7f51dfcd8c6c610b6774128ab618e7b1a17aff7aff89f4d53b39facbd02eca12635d7dc74da1e8b6847d5607701846a9d264c49a0ebf04aa9f2117df24c9e6e89ceb30e7277ac34159fb15f2a478a8063f7bf2dcf25ecea2a346d5be84b6348c7c955912c8c8fd3372f3d3578d82866ae430c9e070cc9a2f9b26835d4bf9c904ca0b10fb11bf6744ea6215f127945ba264679d9e3e12f30c3f4a997d2195da8e2e03018a041f761086cadc49081c34640a1aa6bdd8cfe21b6d95f4ee8c9edbbf34715f813affd6894354487ac35ed704a5e26483af04c22a2b741508f97e5f67e479f5bcff8cc7353dfd866f5b68a69c5903d858553430bcdc1088c05d33cb8b070d6a8093d46569673020f1432534bf86f57b0810ca779bd1abc6d40397c2723e2563418822ab7c0df032d244644646495c8a58f6703ded851ea42ea1834af2ff298f550b6019fda78df6fbcfc10988b61dff172479dcea861be74ab924be2c1454f9b17e2e08c8be44d35e09383071c52b49c7b321db49e4bca24cd5684e3c205a2a1f1e35a474f835f2c50ded2ef0dc8f14ed16ced62ad5e804a17e3b381a61da9b1d05636b9c5f6420186b26a37aaa2858d639d3385f5541874df259ef5b954a1a30ed06cf1b75f867fe61d0b17749335283169af187fd21e9a9e18d90afc5c522c57bfeaa2a28957e8c8eb496e65c54e1146600deb178ac6ab17a7753fa8bb3bcb684bc4628b41c950d2362d029c17176ba2bdc4e4677e09e57d143e162b38b5b889ec6c2b19f4e84a8b5b62f02218a2c218a9c100466396f49966a017ba30a4506ebe480d217e5aea7ce3ecfe8a2e034b1a431214d422f9d8dc53d256ccf2294d9262d595478054a462a8a76ebf2367f865281ba6b0b8de8af107efe0b3a7a05041ecb94ce04a11420d1f91f64efc1407eb914363dcd58c02facd1479004391dfbb373eec7b029eee66e099d76a4f43bb28e0fc47b613478c9ad6d834199924accdb623cd277f5387d599bdace578b855dc3fa116f059c4be5579248621e91f02117d5933ac27049b46a434f5a4b13cee56286c353125bf4bde46899c4be71eec2aeba082c617489946ab1ea57bb58bfec987d01e8cbb7519cfabdddde81deed345f705da9f89b39c69fd54e76d2a03d8565ee7481ddfe80a1e3786a4195de25b797c68a2c66607486e1307160e08ab576ac41074e4234dba12081c1f494435c0c9b0398f4d5e91320cc9e02b687da3858470f175561f81597c29a0aa904253f339fbbec634c4eb09cd7ca35e309301fc7a01ca1dd13d5f404e6951073646295c87158dc8be6d67aba4ea6a80c2a5bd2195def525a157fe6c0bfa4349a32fdf3cbc3589fe94eb888a683ec8f75916b4ac07b06769170a4a0f4b0235bc492b21fb4d372d08dda61114b6cfd5d26bb24bc8de5b4a29a50c6a03bd0302042b5e042c0838202aea57187081a3833d67f4a01ab15ecadcaa0b45e9a27469faf664415582bdfaa73c018a87699a3ecac23e9add9533465d7761af3f828b1cfbf944f129cb8ebdbab2bd386b2bded166f292a9bc55a497bbea4cb7ab1b63b3cc25d19d9df70c893a0df6e0d7b3eb58d67f7075aa0efb759d6b5d672783ff009f3bf657b8b4e37bea58973e3dc88e755cd6cd344d9ffc209fe806eca32eeb22a469faf5f1a9735df64c914ad3f4f3b9a3f33b2e125a699afe6e91a6e9ef68f0f9445dbc78173e53e4344ddf3a8b0ddefa8a7b7ac07aea4b99ea657deda85e4f1dd5eb58571ed4b739aad76ace089542a9be54d6d84edda31796becc26c64232a935f93a8157286e3e2700745d747c492f4f147bcacba06d5ff562b15f87f49dfdd55af2c38589a4abc8b3a6ae35c162bf8ef59dfdd684f5546abb4500bef6b4610d00c7c69ecfc7283c289ae64ac7b2afba8127cd4d3af613d5ea74963c4510ab0bdf81fda23665ec2399bd96c03ede1b7cddc2559fb8b55fb4ec0b9d38642457905e7a89923e6ed1d12cb6f851e565f9225df4725491c27785339abfb4235013bf4cd75ee6e05f615da5729365a6289d3c51ec52a1b2aef2fa2e15e3eb5507aad4686e96cef9ae52b8548c2b2cfae8e3b9227f99730f06b381b96020ae880bbbf73f7061f76e8034c90a656d0bd626018b30b535cdfca4d6a74b855b8c573a2613dcd64bd1bcb007dc3ca08640915f1f46206d54c45f51e5a28f7ad5c188c2662f3d96bd7417af5faa32e575a55dbc7eeddc4f9d0ab0081045dc11f9fdc282363e51d8dbd2a6a878ce26916d9f7421926f5f771c4772a686b8aedd5ea719da7567d2ef0c2c92dcbbd5c2b02c92362f1a49f9d5e7de39e79c372b9314a8383754369a3f0a597aea85c23e959d3cd1107c8ef10f7cf6c919e72cc2c678d47d69fa4ac649f2c67aa556e64b841feb2ac5ce2db29e717474e46fa6529e6d6492c4e71db3b5aec3986692acb55835358331c6584cb9d633e6e37345ca718679d6d65a2b8aa6cccba6e68e98d9d98825e65bc59a3b22fb0a85fdfc9a49d1783e519c5d2952f9447362f563f5b7e7c4509b49d1836fd167f44bf45d26e0854dbae915b8236648dc552eed6ae65cad665ed96944d14fdc0eb69fb8fbb55f362fbfb06ab45788eee2c5bd374cb4b924687c3c715fe5686ed1b1b8ea605b4bf3b2f5c6e0d2c63170df981f3246660735f59e3f5151785bdbfcb3bbd1fb8182f133fcb90146acc60fd38f5f7d3f3f2ddaf8f9d07043860fd63672f011451b5e68f0d808cee0b911e4462dd750563de3e4abfb6e187d3d590b88c168818c5fcf4a05a2f599d5a8f9b84043747cee164bb4dbc7043d305b6aed43021e983e6329be1cb0befa7c887cf9d5e7637b7463a8a81b127f0a9aa1283a6ef08a34a136cafacbaa22d43cfe9be2439197a6af797bba54d8ecbeb2de11d69e1fb8f8eb3dbc4d7aebc30c21b35ba3c38c1f3c353acca8f5d4e89065befa66c4c8e1519b27b96a11373566e6cd0e23c081e886ee69880a48c2c4d48861c288a981b7c90f2d8f29c1c102edc90c5e886a7037044584060f0b55b4642e29135a4e833e21d3e7cf87530c485cb8c189072b2cfcf09802acf18295b105a3f9a2d56a89b021f157df4ccbf3b4cd372282d96b095ba3437ec167137072ce353a64a6476bdeae60eb51d52f113639449d30c3171fa0a208ec90c078f284e58ad213d1041fcc1476936d6cf68ac2e726f84ec127ec5583490da27c4a4743f4d1b0fdcc57df0c22b301bb6ae64d03f7b98cfa8c93f3898a70836207fdaac9f904158b6fd6c25f27552cd9d5bffa66425ef5d537ab3dda7ad47cfcd4136b0d31923e23d14884faf1b5b6b1b9b92348388e7eed1f4cc0e9b59bacd73f123b589d5e3bec8ed0ee52bebaf61a0df52888d7393bc658dfafadcd82fc8c45511445bb5bc568de4aa921aa8fb504cdeb5b8a62f52b5617922bc85eca388af1ab6fe6f3167b697380043c39972c4e5f680873c3d410d84b8c807d3ce5d3564b645b45fa5a43a0369fd826dc348f5a9ecd9af8514bd8dd63172d890bf4f0a81cd40bf408a9b06a55f8fa28cde31e5acdd6c4057a6a1501155f6baee064a8a2e8b2ab4f4692f7f5343dea9331f4d717c349c5e9317abbc36e8da49f5faf2460779f829c9ab7cef376674ddca8dd2a3182e5796ba486a85e620422a2c7e7ae9618217bad21b0d714d828b584ddd510d546a921aaf55a029f396436a1ac766963bfa62fc6d03f03ca7a3126512b96c066913f9f1557bf350156ca7d61aeebba372f3acb41d4ead5d1ba4bd55c0eaea75ee49863d4be56f9ea83b15479c15bd6afb9acb76c814789ce0e017ec45122b03f7ace8934fd1d0f2faa3cc7be2ae6e2551de86022d5eb19543dc56b8785fdbc82445f688e072e3e25ab4fae48413af615d7f54b7b75c548bb8a79705da73c9f6425a1ac2bd2f38b8555614777a5524efacb953a3dc8bef3d2614180c72e9e28092f5e3a5597a69fe380a8a8157927ebec64bfce62453e5d3955978ae03d90e380a8f2be58949f62a73b19fc3d03b7a1dbcf36c48674bbc5604d6c01fa0002858043a061308844eb412bb215f56eb6db928e48a7341c3254f2e1834a0a945a6011a012ee869b0199f576b8dd8f1f47bbfe96d98c7684a694e2522b3b243b1c119cafe884a2deccc84cc9e6c3d613f61062d9f9d8cd84cc7a454145f705951fd14f0a0c67290824d8c30d713f704a418228fd7afc9e824682bd14497ac5c3934dc8a6f4a8ccd3efa7828d92598043804833dbac472342431af218f682e0944eb829ed76bd1e3acb13c2fbd990d87a44843d223aa150dabb09b1e08ee072457245428a7a3e723c5b119b5291912225a05d15225c8f0750e9888e0a0e88f4e3d7b3059178413c2ac1a1a012905bcf08cfcaaedf0b06058342825476fdde905cafc88e3754d42b9262d9f57bb81cd2ed8704d8137243b201d97a4a3f84484333dfaedf03ca4da96f47d497790a9af18efcaaecfa284ca9c6e603ec8a286533e4acad3d2ba0636b473fa0565fd46acf3abd302b43c1ceb9fa826e7f735abc05ba9475a51d665f9f302c4bdaf55192ac26549544c5a1c9c2b2de2d217001660186f0a5a60b086140f01202da6a911e82161050f78d396003085d0d351a10f240780a0185597c43c058035cf6755d0186bc2cb02d30e1be5ee3651b20ccbe6e53a3655faff992bbeceb354f60481b4c77dad76b6ac84a720ffbea4b827bd90dfb1a60477b9aa63b1a5b6bed8ddd30c6f8deebf9efb5d6fe6ea92a6ef0b11c23398ea7c92ae14b1724a125df0947381b9370d1c40b16db8f051c704f38240c3fba69caf8711cef19c37163dd647d687df5f1d8f1d0e59e2b8a464471870eb3075766d1144591cca2288aa2986342bb3e9a499038f922c1e529220f223a2583c24c47561136374144183c812285461726341e0b689892b402120075f048471e323430635c2153977d789bfcd0f22f313baeb45258ca3e32b36385bd6388aa25c2863479b478a30d5584cdcd0e2059474f9e318ae26bb76241f60e1f03dae3575f8e302060fbab2f070c1e85dd1fa15c7341aebd20858108d57aba1643aa0285a82cc9312546500e14d40822bffa7218391113b2f3575f0e22398604e500c2130b7a7df5e188010ea7476d785a3a70e4b382102a2f641886c0870b744740609890a5a633797068c1b1e52f0e29afba2146243654cbe960a18426a5a0179ca2c400aa4f56825060e487684a915a0eaa1d317a0505a0f04b41464d052635aa93901e488e7e5ae002a5d625d76c20f1302684439763c99b5f7d39b0d40a82ab4bd3b48653ef0d5139b80e02c425a1caa569fa02e7c4071930bae915958fa6e5d16a74f468e5f59668b4472b105b1bcb6feddb95bd55364ade4afe97b262122dc428493d3a9c1625d813b46096e228b95e82ca8a0d47894b45d35b57404d6cc68dcd256b1eb18f36e3c5fca228bacd28ea9375c668e0573e33560992643466b666694f98c862581a90ad246292610fdd9e1025c970f686b3164732a52acd558ccc9ea1f1c0ca40830d5a000880eb830006208055f60f49701a7cf53da111d9d65d4e724f7878db6a0f0094a255181bb60580918e8686dbb6de3ada9931ccb6f50d7abc0c8c86b6d560e947d3e467db0c9a8031433fed2ceb64834e6a494bdb03182b743283b62d8d85b2435554926c891dbef6199e34c60b93976db56f9f598c1713b6d52e53a331c1407bed3140b62d436c687bedaba11b4d52120adb9a4970291898806c5b3ac9a56008b3ad0a4ad1aa04493eb6d59e32d2cde092b26cab9d3cda31f5b6d53ef67819e8488a5511977e3219bfd7ae9b8029c0b0b2adf6ec146492dd08be760ce60a9b788951b9c20b75874d329e3be449b70c4c33529f591319624cb31a2d005f7d4d52a0830664dbe0abaf490e06b6a19b87afbe2641625c6e4970adafbe26316439704e708ec90d49b11a700e4a1113196448709191ae7705ebf011de318121490adee11ee63129c110ccb37809ff983099827fb809039910c574c040ec84834c7e74c1410c060b99d8f88285180a0f595f7d391c6427e0214faa456623a73e332c31a83cabd1724735320dc8d642ec28db866e660ab21eb7241997236282d3d949cee56c483928454c4ddb6ac7463a9aafbe5ccf8f6dfd1eed989e76af732ff35450b1a8cc5bfacd6c49f26b02ca2c25c56e0066a71cc45f7d4b6290e572104506938522152619511666a83c14a9243dc9439e74e685242cdb6a9fd96882a4598d46a6107b010d03d9c814622ab00ddd56444ce96d85dd26c12d214ac2817392bb30bd64882c88ce41d145315f7d4b7008d14517672d8e644a955a616da4754b5ee4b0ad8f47bb1598d80cbbd72ef678a92d3130bcd7ae977e2530b6c3efb5e726a07825c9b6ad63a760995424f8da2f18a196929482f0b55b0da5872917644ef4f0b5579e34e5428c05290a9f59932c68f6dacb8bf30afbadd198b46cabdd02d94a15623118baad8e2401dd2ece5a1cc994aa3457658c596f36b01168041a878c4363105fad5024c135c948807beda6935c2e12655bed2594a25c4476a4e8b5ab8c7464101c74af3d75b43371c894ec5e3bd9e305b7d53e2efdf6571f0a2f686802964f3127e06bd74ec1f209187ced5904230a575998606cab1d8b50e270952529b61387affdf2a44d3cb6d56e7d664c321566afc57304aa21b4cb96f658a37df529e9bdfeea539204f4da633edac8836105253ade093ca49c506e05bb3e4f9a72a111d17a372337a534150611f280f0b2e87ee8aa0c8586ba9b4e7844b885c7ebe17ae0864586588648865b70b827219110490e4b125a957448da0302017f3f22bf222045bc21de95303ba19da505a159098df2a8942b996f7214a2a1010010041443170000100c1087c381240bd42c0f547c1480126d842e56402a8b442251883410848108844008030000000008c020000440100364b40e68975639f4b1d279c6df040856dd27f71f43bbb9a107565bd0e04faaca28f26fb812267c71d6c1d75022f42753acb9334aa6ca7c66960c9df9cc5c3255e633b364a8994f66c9783593894fa69aa9663e193543cb7c324b8692e9cd28195ac693f9d252bf9bad28304c07af36993acdc37f7d41a2eac65a2046a59ba6f68744ed69d2861719b0e7e6d1718030655459a8bb393b80c2e98f511644d3310940c29c2ceee2f697a53acdde3f307288f60201ebcb93489907b22cee61cb3addeec9285e00e5b1aa2c5402cae139568dc08907d61b8f6679abdc5ba383c360470d663c1e2d1d9c333c2b3052c12be3cd33d4453d0c1da6aa29506a8339221e224655dfde9598ab90ec2adcacf442ef2a477390c72ea8bb8318d6a2c5e23adf3e02026d6a317bceec97c08ee50fa18986033f243ef6b212c33507fa2de80eb74275a3877d44f67e7cbf93a2343f034648b03364fea10101ac11a0114c6dff052fbd2cbc1357443d03da3eeab795ad3803eebc47fb257baff7d4b55d9c044bc336b96b9d8427614b569f08c263db936f759f897c4cd374a1002dcc2e175010769e58e261e2d1c281e7a2827a22657fb1f25069b41e9b3df833637fb54a7cb48886799f1df78b06ada1818d7e549190f70f4d3dd1983ae81ec9b54c791bcbfa76af0d53aa5396eec0f8561cb8c02b069687006bdf9181d541baf5a683c7129889ca1155b213540d8a7db14f105343fd32760b4013a077460abbf0bc502494a603f016461d202d979d2fab62bcbed65140c31ee9345a365dcbde07129cb1aa2db453507e4f016fbd6cc0d54cbd0d1acac3d89917ec993aae15115fa1c4aa6ccef2dd5fa2b1df1d4164e51e74fc02ba342637f99e3948f48c2a74ebd831809330eeafeae173bc723f613cd6becb93ad7b395e8b30230daf5b8d5d540003c2e7fa07d07ae44d9cd44a1817324d7a654fb1bcabf906dda5d627a91d3250aad6803abd2807a101b6e3a63084f24afc87b604e598206062b7cf9fbe072acc0791822299bbc3a0be1a9dcd9467de4c9211c9e43348463c631d37434b5d91f406bfb8005c0f5b4a7fd6779d667daecfc2ff4199733476feba2331f2885a1dc0f33e2900a28ff4cac9fc52bd5f4581abd2e9e0c086a9eaa5dec22d3c6b9944eec4974c950bb1f2ad0c8065ee1e784833cd99845f88e1a146c797ef6ca581d271ed24c001541ffb136a28ae11a4f20d0e9ea311a88678cc677f6b040e97c464129951a6cfa433e24c9799ce8c327d269d1165aa130ca86955a3430a8a967a93f126d0ac1069b9fc0d3715708e8936f4554fad139bcc7a31c72c653dfcdeb40df30df01e21c2888dd4eef31d9e026d806f5c86fe2bcdbb3e600c2bd15fa2add4cf2c0ed86208db0a09d2a87b1bd93ec01a722f9c009788e060dfb2f32edc32803d097b4e3dc902f0dc7255aacb90bb5ea008228258c079625bc7d0a85fc71d80da2057a648008dbb4b34e3c509cc20d6a2fbfe435c2725e6ae9b5e248031fdf085988715724200942197df42107c13840d78fcd988197b2b084b64ddf1efd2880e1142aac76195928137e3008564c341b427dbbd833378591cc2a63f72aa69031406cb321cf28bf234c76305589406a6a31e7848086a791a3e2576db52f3977ce2695450d9b28101967dcbcb474a056e89c5b8bcff20d88999db9f32a538044ce97d5189700aee94e527f03ca5631d80c602197f7f1ee5c620cbaff8ebd2e28afa1f8abf1fa2a4c1f35dd1084c1b1dac9168b324bced1f05542b833ca4bd8f95f840354ee38fb934dd10b3f8ffbce4064305bae4a952c5878c03ea1f0ff68477e103ccdde4d42f58ba235c75c3926ebbe58745c71b9f74e260101545f93da5e2167d87a27fb554584396c7edaf9258283db09b262c66c93238154b4aa5fc083d3180e4fa2c4833bea1373a9659f9f358f75fc0acf480622cc24ef9537a1e63c9a2dad39bc2507d4f63d16c7cfff2b6b5d9882e4b4354fa403b552532c8350ba501fa6375427fb0075696069b09b1f3b078864c3c80a78c685e10ab38eba779b2f05d4db2b86e9cdfee759c25ae48fd15a4d803875263618bdfc7acf70d445e2662f8c0f5a458b1a403f6bd20598a24ed2fe5d3ea80a0c982c0217ea5346c915fc9f9af3d8e585e1e8a172839b490e57ad6f8a512d025655161eebec8e9fd21901d96575e7ec253d6c939682c08e5f7f3121f166d1a4a1e152a3e204c50cb53fd3f25f6434159f49f8a4fb105acba59dc11f31e9b4b0debbfef924901c88293b57e9953ea1a99ee64ae33cf037fd665c15966fe1b271d429774451710384ada9983cee2c73e7f64cf681e69c3c2618bfd3953aebe2852162ceef4aed2a8fa76dc533996851fb4fa71257610732d39c9c83267164a406a9684e7d406ed929f034d935d0145bd2c118dfd4f97e2d6124b9a7ef341a57e1de1ec59fae9dac39772140ccb1a5bf247a7028e6b3c71e1acf5df73baa22b71c2edc4fc753f6db0688645fd0099aae2d73c3e217672fed83c5d5939e858e0fb7989efa109a3f8a753ea638b929386d15fa5519fcae79287e1640cf58c3d1976e2f63aa7921032dd495f273c0f2c756421cbafb2f905993de02d9f341d301455287e7ea4fa89bfe684dce9fee14b330ceda7e57ff4e94a1c71b0a466888fcad33f65014e767bbf2c01fa503d6fbdc5a55685a3e684dce9fe317faa72e3c68905f1034a5c2079f89b4a7b1f7f4e6e5e59ea0a8c364edc3d93f86089e3c3b16445c9d3a5b80961d917653c1a4e01a5637a32ccc9e4f14e65199d39a1d479e5ff61a556143fc5125738fcddab31965541f331ecd2551ce84faa3fdfff6753011b359cdca43f58eaf90843cf50daf9d47bbe7dc8b23405c70c272d820f2cf13ec2916f9e7b7532f1ea4555c5bdc778c8ec133d27ce079438b6184bc00a3fbd34b079ac8f93b5f0cba5a08f57273baf702e95cc5973d2ff74f1b0a5313e322b85117e4304bd630f8993c9c6374b3b9ffacfb70f7356bab2c73ab1cb2c37de2f834ead43a9e02a5ad339f83c95b30c99ce3593ac5730b7109b5c4a39636c52e2fc953b8d8c159c7c40aad89a9bd534bd3b075104bff917bec04d6288e7bcbee66129083968d9b971c25de1336ab77c1baec3aaf45ba01c533a0805312a4646535fb6f4bb2b6a48839029b4459f2fa8cf08b1d622f43916694504f49751e47b2a2cbcc39d0af25c09a035637e6d2d8ad179886e588389a92e49550a95e1cff1f9fa0c465f65336410f9d979981d9c351ca8391fa1e5449ce55928e883236d65f60d009d243a139891a1305e218daab4cd6b84e535cac8cb9313889c5a833f271b2aeb6ccec99e7a48902fa3f8069f8df22e2594a1186f0e6c44b6f2c7283c569ea740e3b9f965c6b89225e691a366ccba2b965e768c2361fc9cd6df1fb232523cbad9632f80a59598eacffc8878a90a23455179051ab769854eb01007a5d1f629c9e9b4475fa3caeb6670557e843935ae4778dcf89c666beeea00189c54e8e3a70dbee1b3e2566df6fe0bc10811b7105d659d47b6ad14510ca542501af59801162c72b2280f4f921a0bd69fefcf3f63f0f88e245956f67a6443f3263c8be913a7c6d404da48ca97a0bf7ee6abd64120d56d8bec13d82cfcaa4004f934b6ea7a0bc119d30b91087356d1dafdcc492e1659ec0a2bd5e1c475803ebbafd4f9db29ec67da0451d8be454cc28a94e7987ccb9624162e23084e5a4b36e9956abc1b826a2a16e83ff40a0c278552eaf6ae88bcc9644e7d64b982aea997b8bd62d2c9d3585fb6cb61e9325e0def785acb678bc048bacb74e84b6955ed9aac81e0c547ce06ee14d3d2da0b84d44d6ad2a3218cf87876af09b734e3c6cc907c30b66e0ce17208b882ff0b6384229c1cc35259c6ff7238a2d7c31dea5fdeecb6340487c0d29e490e208a5540634c23338e01999b77e4e0d38a247e60192387e7fb66343cb2f79a89efa645def7a641672be2d1e230b8e20178a317f6cf02d8ae50d8db07a670846d37b1ae09df889d11206a678e2bfccdbac5a0c3814102c84773df043f141c76d85203c025e42339d2a020f43f854405ec284e6aab1acb2ec46ac8c6b1b3ddf0f02da83305c9477597fac751a4d5acff13b4c65ae1428a590a76c920871d24ff1f0d76a9d850db922ed21e204b435cbd26518411c3d6e4f311787040ea6a39828a003938132015819fb9466d3cb720f9d3421e0403a6fe24299ee08a3a4c5f8ad82a71c841a95acbf82b9ae84d4f96147d293977b80dd2750acf2935be331ff8a517e1e1823fb0c11c0d9cd5432c28b94d1eed377463996a0807861a68a70aeac6e8c0d20c21d760042e81a48a6a86170fe9b722184b6818da73072a2b15f3e6005dad252229ae214ec980c12bf614cfee5fc7777bae061db4a4c352a9bee02b0fd33932644df833d6e3455886d826eb5fe82a47cc71c65eca2e594d87bca9659eb5a8a754c74b927ce93752e2e522daee5a0daacf3512de983c3f70cc5bb7480f82ddeb0d80f28eb1f850dbb1ba7c1a63181dbc781a98fd20554f3c20fdb4de00804a916ef8080a6db7b01bedc3361bd8263321ea707d899f6b08fb0791de5cbca273782282209fe41fff535124a05376004f00ba4238584ec32f251334bab86375eef582721d4538a44a843545bd7098a0bb0ebad0cb1d1e3826d1f10691169f77c61c1b12eb683c749dac4c91a96bb18dcf71afa03fc8511ae611e00e8f472397dc7ede8b959b2e225c1ceb811ddf8edff74e7cfbba90079f706780803b142607f290d6e051813ced345610a6e1c1c7b4da4e162d060c38cec866f92b21f2c7b69cbb5245333420e0bbbb37b0aa1662e6a5fc81d4a2f68d216ba5f671c0a24da13608beca76a094e5c2f74608e41a97a820e1e378de5073b1238082984b8dd25da307665304f650586efaf37fae9de8c181c9c62232caf209bf322a2f9fd1a53c18ce53dd68ace9230832111358664d75a9e8229eaf7717841aa20150a008a1b3d556a1911c2d19b7f91fb11206fc52ec35b808c09f03f21479606c9b6a7733472bdc8cf2907441dc4e8d155ab026cd6a8ee5736a6d716559d84a53449bc3c58e02d3b9708cb9eaea0d7fc69ea52ee816e826baa86bab6bb0dc25e2bf9930e204369e4a21f208b366a98a51c9c1f68cddb29d35b77329127aefb1b7807a03c30239b27dcbbd40f299270e7c091cf5bb8caa81cdd79dde31df8bb92398e7a136a269fc205786f6c61894fe77ecab26023285cb0f8c46066eb9eef97641bbef707e669e7a4f7a4d3feaa3151a490cf401bb515f0eb73f42a842dd1572ef7172673bbdfdcf0b025c1849af38abeb8c5d54ef570f9d256f2b9cd90c08dfac6c2b6115cc0f5d2c64d383ca0eb54c23e1f1eb2bef842130c6093f58bd533b2147c6516a9dd813e5ef29a3b83f5bb91815ff15f2bb1314271cab0637cd0f3cc001de7e890d8a75bfad4fc1ef4f3a2ba6911dec3ec6e1a4487d0b761c2144aea12be720e8f5642a91c12e597fcca76e8b788bc3b5416d5ba451db5748e8af485eb884c6cd17061d61ff243aa3e6a37d5da9fccc7e74f67bb578247a08b071ef63b7952ca3e40979784220877a09d08a8c6e756905c836ab292e90bb9c4098de92d3e56e6ba2b3cedaf7f0f19bf17a42a599a626d69c44d2573b71297cfbd59decfc603ed29a3a6a2b2c2d7520e4f1055154b1e14055ea557eceaf38c3d6cb56875e027fb88fcd073fc97c9f60d8082726bde67c4610af24f7c21ff0840d005931d4a0e2c16af232f293fa00aa9dfd166cec107cf870faab86bca5ab1d43f1f2117d2dab02d67c900d1610e2ec5333ce260c2e48d925bf0f079bdde886acbea4c5da637bbb840274811cf26c7faf54be1db4a8fde65cbf4a92758e1822f4168b3d0ccc0345e1d09dba57f9d1bbd2f836dd80ee3afc80bae5e33c96286faec3c7a737e7e2feb52e5c8c82286fe2ea34ae106ab4bf163517d66f7aa188e6de54ea7eeb402d29ec95b004cf6c3bd326bd989a5b5d6f2517c4a4b5da3c2deb01e48454d512bf0dd86321b264a1fe74504612b36f69079c8c363a951573211470e6401836447430c245e8d6148da01326367b2058f3c374639676afb4e4ad5c9c5c5bfa03a873f5560857e409c367e8f5067bd8c7169a0ad0b7bf04503c009e99398ac56e8ec73b4f77037950de04a1b37a1bc4f3131e2174c8ce8038496e2a13f9ba07005e1484bc2184d448f590efd326bc3902893ce391ea6b21478be796782af78c01f8155adc48e746f09bdcbe346ae75bb234ecb80f6bb12d2b4f49bf8749132c430c87130227b880a86e2404cf692f281e4b37f213b5c9516066c02daf02038b21f27a07c5f747a68cc1f4f3791a7339fc9c975f820280e38bbfdd4ee54044cfc226c738022cd86728f5219773bd24ab827c3025065aabdfe86fa9fbadf1966fd7f32f4095a5918fd1c3d0e8f2826c6e6181f53ffa845e0e2ea97d18832c32d6b04e5719b2679dc1920a20297a2ea6e460e18bcb80adc74851ee850e9bb2c2d349368300a212aba0400cf12f649c67a7c6d0f61d45cef863a1bd04dd20051f6718b4eb45991223ce098d2bb341fdf09560d939760141c06dd919eea0578493aec0baa09ccf1d88acd6b0eb60cfa971214b661263618b162b25173474ae6b0ef9de5e388919b0a43c59a9a660b015837f4859d19be1560ce125e54441dacb863551b3aa7db6fd9b050d2388f943caf045333795a643947399726457ca46249f239fca0dbb3fa23b6881975393a40b3d15263e0301c9e0ace32d1b52b31443305f1f18f2450009a67b7bc8520dc534af5a49cb22a6a0b20a1b50c4c79552b905cbbf6ba9dcfa85679480a77e61f1dbc5d8574f3b233e091a866810b5b5359431f8681efa87015d540abe69a481704b2b604b4a7e0ab872b6bec5d6af119d863c273c1171f687a8eba551b0e23ff259633af5047e33123fa231f689743a639493c447ef4f1350c3723bd9e79b7e9a013c5b70b5b700cbe58215ff1604cff138383c9f83e79537e840ca36dec21e241adf34d04b5da8d1959d0462ed6f1215b898f9c1ebba78f1ba2596fc5851fbb6ec924ec2f99104933a7710edd90b5c9311562c026138acd74222e9119ea24bb08c7fcbe6544a96b6779032e3254c68725239f83ace4438e8220290fc70a31bb4fb7a4988e79c61a366a5a9f76df77563329d09731e7b4d63a19ddd2aa9e2cff2354a7225db970c3b2073219323cebad2aec72d8a8177d16c8f86698f30d2730014263c19f8a4e1405f25ca573797093c87a46c2d57979660bebb78fbc3b8b079eef5c3272feee8a6809b625d0bfcfc399119d48b384375347322ffbbd4a7ca81eb13136b05d30a63b30a26d6126298ffc89bb9014dadc2298732229cf9521b45ad32f917539abd144f620e0b2d8f4c3abcb76723e67cf72aee3c3afc9467aaccafd7e74f40ccd9a98c883cc0320b10734ea91be78586c9009158227e0973d28af5491d95f9f4d53f7a9ae729e57d3ed0d64750b4b8c2392557e473f212c281fb077d861f4009e90a7c0425c4a07b7d589cb7c7dd0b26c9fd50147fe96a1d9e09a68d6921581993598f8ac4a443217064768e1e8aad8b03f9e3691c83767b60eb2acf208d0f3a8f848740b90dffc319dc3b2f24dff738cb6bec8d7e994c5a3d083778fe5c90249b997310a36eb656d76e1db2db93cc3ca524639f52bec2b55061d61ce2d43a1ed187c6f6271c238cb830ba95e986a22ab55f4da82c2e87f76c11f5f065ec1a5081ad62eb2484daf60bfe46a932ec15940b4d1d6246251e14634d9920811166e98738074c28f34217873914dc913c86dbeb91069f10cabdcd3cc94ebe9f7436c6644f2561ec3042cdbb1d37b252d02a3c7f47756654ea84d666a614a2a05610219cf09e9ed2b13d801b0d629b9f447c81dbf4ed86e5441f254b523f9ed93f416908d89afd296c43b4de045ee36ae36cd69c40ca71d73adb7c2720ddb0741e290c87258e4151ac923a4d332fa16e5164636106171d38639cd1ad65160930ba5b0bd1a6ed73952db680eb85f313d1389b0877b0eccba71009a3818cfbbfb4115d75a5b422ecd0923c6c20851d8fdcccfae59b5f188176e7213dd84e4e56ea347d8f8e6e776dcc6acd72d1d4d99b343eb4adc71a50ee22778ee5876908e60159de5b343110b08b3c56ac2c8c8a688400fc4372bed0b7f652162ce5e7a0304428b0bed1021e5865d7b1647f57514afbf9ba0d7133c23c99c34322375d2867c4bf3026517006fb6abe1e66d00c5a4a6a2df7d95340f5636ad934abb505912ad8f5f5ff4852745c1527c50415309c184016293d04cdc31af7dc7c2c148fd401d0636ab9ab2f287f1f4e4f84d405c4d474cce9189f8982c00e2529349177266ee53b02e4b52273773bee56379b1d7855a4b50a90ff3b48add3831fd124ae6514a789da25f200346a0b0fd50fd9ad5f3e838edef6137b10356f459590a0fd6d977639937434920d8d3fb3d9b49d569933579992382a6cb0f603d86b5f95412d4d8fe286194b9822af40825b861341a4426173d93b1e3f493afadc02eaf33e8c133a67912e5b665b62fb833322e6351c411b9aa2500e91b4f1900e59aba51e546d5a15e67470b6e3f4623d03fdd0a7f7bd05ad31cabbc329dfc88170a7da97e4522062216f28ef19c93b8024ebc99745a2f846a9aa5a9738237e898598f5593c2a1711daab78bbbb49ccf2214b041746e6143d6c0f2e51ef2f63d1e8f9ae3ff5bdf4f7f07448e45765e5e458f4f4713df088fb82e67dbcbf16e23e240cc17c2bb6c1ca1871a494902a7658922bc0f2b4e2cb2c32a6e71034e4cf67136e3fd35a22951fe5683b8c4bda7e2b5506bb7a4a1abe96725e39e685f9889ddcd012340c7b64da8a9c39b16e2c0370b342a6f6d864c63c47244d4623ca066eb2a648369ddaed5172f8df7c58d64586b91ad469873179f836e341e2ba9457fe2237bb66e1e8a6e6b95a068e0a28d24002669fbc667f170880fad33dc72f4b0a0008dcbf514254517b5d0bffa08ca1f92865b7735569fbd4053cc8a467050b56254787b493e73b2b291a5794c95dc66a7a3c3ab406b6b8e6b4f0f4028abc44bdb44c3df047a036f15839c6c016ba50ca7e04f0b7c228de843364df9db92f890914ca25d58ad4bdf715309bb4cb91d4022d413d4af71321ef256f6875dd34317eb547c7789a864baaace326196fb5bff96979ab2e693f23621aa2610f1fd705dcb6df6397e60aae9b655779c125267eb07e783981143ba059a91429c5233bd7fd62cd65eaff270aad67415cd7ce90e578c8255064b18fbf665642f0badb4d0c0cd4b666f356916acdd5f25384603584522080c667676e31950fe23996c15d3a12a0d670f4820236833513ad198ed22305e5ba3b148f8389722d122d909397f604f4998621ed5f6da5b6fa079502a9d103376e16ed454d1e8c7eb1db80696f578dbcd61c425b810df751c9ea8b5d3dba84a231c23b2beef89a06b7714022f3327b38157b3b49f5d2f2ac90f9432b11d7bf30c2cdba302cb460eeb47d328d866840acc118a37e96dcbd40a49ed6e8d881036acea16a06975fd204f99a07b4027ad29912d661df7c7443da106699fd52d4a73c362c3237f4760218a8594b26c91ba8d0404b26d18d0b438a425d14f01f7807fd319a34ce39c64acf7dd789457eedcc051a29f03ba1e94371ee4571a9d3d939e9281465d8bcde9e86c751f8738c0e143c7ebf65ad21f09e0e18e712b81f7732dc364f070906ba968cd25db71f347ec3d9eda165d846498445592a1a814ebb01a065e9829e87661b0ae1738e8cc09340007ca7d25edd9c8009cdc1642e2182358394f55a52bfd3d4a401e11d49d896092323fe341f78b87416e2ccea28996e5a18e2487db581e4ef96bb0a58b2ee47c26a7671956ca6a01e7806776e1051b496896c0ba1068b4aaf1e30d705f6c25ed46e794251d74c56ddabed67fa41f518930cb9972dd6a477faabbde0e69d90eb3bb9d092db1a00a3a9589bc840130fd34c45d257527d29dac1e676bee00bb6269b030b3bb0ddb7493dbf44f002b2132ffc7bed0af3e019a7844040cfe6217fc224d19cc19e838f4f84126aab8e7ffab854bfec275874a1ae58026f155d3a85e86738ff73798c38793136003c19d903d270048e2f5236157b7f21536d12e960466fdd9626fffbfe514ae211359996ad375b219de5f4b138857c99098cb45ef89e4d87fb67cd86682b9ce736fdf7421ebd11cca9f7e2f1bf70b710081f459548512fe49699e92d8c46feae84ef1785fafa352eea4fdf197521417e4d8430bc1018b9606b977ec058e1020077dea42830a0d090e19458811e9b2a35ef67bc40df70d72a57d3385255c98a30b3d3e554a4226566180a4e5376397b7005a9754cac2e81986c3260440ec871f6fab77a39e45c7ff28e81325ff30524aca58025972bd5e4b5dee89fb0746de30b98b4b3c2e8713138bf70230f22c8faa222f9d14ddde049d28730724cbcfc092408e2115e642082fe17b88cd24b3571402ea1c6db6fe65f6b1a2581496205978a500a2aa09924eff0a4063c0c41fbfae630f034c82e5a9005f90bddd0e18e3725e0ed6c924ac77c54166855d9abe32962a1f09ef6b4772b7e48703aa8ec133393c08390ed1f3af22fbc92b0ef79b88addf691ebdec2894aa3719c238827696bbaf79b66d973895ba260a26adda8a8f31e0ff501436240dceed94189b14d55e0e4d1b9ced679a45c788fbcf69abac59378abeadc95f2d9a155db296d7e6482e539656067cc2b2525827b9f781a89ec921d74b2db005d963031f18551dba53c5ba05609c43440f0ae6b2db92f759ee3716953699634c30c489ce34ab4df084bce47e3af9176b5f146abd3ba0a6e837011ef3891b6e14302a468744f17b35fec283117dfe559729881b45403f9b1a0985607fe144398232b13c74de25dc2e5be320dd5f163194162db2108f1dff823d71242057b572018fc20c69111d73836a9291573aeed200471d43bc13b069c78b6877cffd5aa6f109acd8ff417842f172fafc457924c42fc31e27e249faf50dea285a92e1326a54b5a1686b8cdc149d10bf613c7c5d9f95aa05bec095be6f37eba3aadbce7ca55fba21cdb6dc0367cca7390b4e200fb15ae1d68eeb104370531118bffb53857ef84d6501800656313bbd02ace3f936cd84e7d6db9a723bd4b205233ee71ced7ec72c6380849d25d2d1b18cf1abcb9fd30f5282e625ec5119b6a7e571112986145e9ce4c8ac239c285eac368f0915fd6b5e4ac6d35f409cbc02050163ac8ab6d121e128faebe0978c2d30661889eb2eb8cb472ce7b4b4b5098651c53cd62d77cb49df359ff5e3adf249be8793d52c3ea612ad0cfb42403ea7f168859308a69351d0049b4d61120f028c0e2c475a2940ca8d7c65416aeff140d8479bb2b081ae0302b62fc4b8cfa70e03a0c1c068e358cb87f116f60825ec7fc141b9d4204f446301f99f207dfaf5a137f5bdb7b77935b6e29a59401280864097a08667290503263a38a04ac8b9ef2caf8293306c6fbd240f738db3156a02ea7fb502377efbd63b6fe5eaebff7ee1a1a74c11b9335c6ea2b9792f2c2f83c0dbbf3a7be7ec3ca7cad8e8511036327ecc7958db0116c84cdb011765565238cc50b1b39ac85b02299053254c884594a7b63bd30f329afd7420f078f0748367edff7c9c239a519100443710b8f97442693c9c4911704004f7962068dfe9427260de9e1294fccd76c2449929cd19e7e15a3f535517c15751007b22622b5d52b8713786444e0915981f57c70ce7c6dcc171004b58c27a66b8c95312b8c01f2352ad3e1ecd6147af0588ad824020d5c130d1d0aae720c8ba1556794d5e9a64562b276db1118186480e1a205868916981c60b09af054a5481f07de7ac5f5b31c34e1a9a9e720572a016ec26f474bde0eec675771ff93f27aa135d5e53ec4093f9bd3e53edcef0b44fb94ee56f3f8b1ebb12a317dc9231662fc42c60a873587a7bc2f53be2801cb78707fe29e1ec9433e1ff8c6fd22e34b9595972d2a5c9355f612c78bd89f39309d824871676e031db5d84b16180f0d74df74b5e129cf4b112f4198e0dc45ec853936eebdba89c558b349d52f188cbf57031c52138b922675e992a7cbd89f351a4d2b705cd458659b1f3109b291f9be602d978b142b5b363d7371c14ae9dbd2c6c62408c43de571b9c105cb851886c28e5fed875f30c325ce5312dbde4bbc990295f44f9c7e3a527678cadb52e7f153de96387fda943001d2f295658b96193e6bf97399fce0b494d102f6a58f4ec8a9d76c478e438220f741a794d32931a170800448726c2c6bb62347aa693d966051beea0a353d96f7c6508279c4a7cb7b63c07a2c7569f3efda3a88623d9635db919ba5cd91723aad4d804024c750a61d87449a54973647cae99464d7da16a82e6df8da7a67c457afdc1179c4a7ad187d43883392ead2e648399d1253185619118e9069307f5e5d973647cad7c6e065f1daf2d6cbd908da0872c4386244384236428f0047e4119f53cfcd4c72346d3749974da68be22661bf4f3e6951ea5a0b46a4963ab5617921c2153b38705270952bbd2b5c5668d917006c38db911f394e89898445aa56664dba4420648e18a38eca9316a18e4aa0aca3b207d451019db879107482e7415047451b3de55d59e1f353de152e9a1ef156bdc31ffd67deeabea9a8af9df2aaa0f95a07bdf9eb62dd7444a635e5755c454cab9d5dd1b3e9e18a8ccf804c999ff2ac5cf9d04193ab488b34916340222586a71429747d33bdb373f7b22856b8bc6892b035df99e8d934f2f3e2be35e1df2708142859a4af9b0153ca0eff999457e54b33804e7996650e5b6ba37f35b048d55d9ce2576b2710a1acd33fc13fa9d056a1813fa5fe560cd427385c15252f72badc87b1ca112b9c14ac1b6b4755705489f1270e0b12bf28a5390ea36d2c6b4ec00c8248d50c160351003d67912a0882590a489f3f28c40964a50aeb859b3532b0e8534589d612e864cb8320cf899707c507c7131e0441262ab85a396add583b12f4a5dae88d8650b249d5992a08b7d689971796677a026610dc36b748726c589b6732344010890904410d52e9f220086a80cb4c5270fef0b53826284c52c6fee8298fca0aafe1298fcad69f39b06f10151a52c4665fbd224150a3e4f95a675504f50cc0c74c5fa5f6d36bafbd4e25719ba41d8455894f741b22a7b3eba39af6230b82742d9ad422912efa584973e6f5b1b5b666e055e27bf1ecf2a26cfde920b46b4a85c982f86278fde5f5da717afc3cdce4756cce4c13e153e8d7ac4fdb9814fd135de98ae276bd3180517e8ead89018cf2bac5e90d45c1f21e6bad084b9224d8f7913967046403586b29bedfa518638ab7b6d46add7baf8bb85d30c6780a0681ab6ef8d57507e5b5b592506bad52643259962c0cc3adeb3aac135451acf8abb5d68a71ad9f78bbc0c7188b96a7b5a634a96e19adf55aeb28a2fa2b59175f565f4fbf5e7c7dbdd07aded7d4531e94a93f69bc2761b0e3ef53b1c37afefcf0a658cafadf7510045d6bd0caf928d8d4d4940b8c41e092022b5fb27ee211d6fafd0e500b70e2b7b63ec1b7b45eab5405a1da3a43a416d70e3c3c06a4744c516cd48dba3da62838982cb1fadc539e0b61cfa4c813e029af053d633f7e91875f8fbd96fc019ef2bca6be09589322bc26622f7e754b654e7f24c9289b159e35c9eb8db7cfc813e28724698228c434746b95359225aac51629a4444e35b82886fbc4e5e31abac6d5f5c5503307e1f106adad15f6ab37dc1a6e3861b334847b56abf5999f759f3834cff243506a074288cf0ffe43cbe34fd0b50945e4207c35cffba163b2e9fe0d41d7a16babf52788ef89d33e9187a076f03af69da4bcd84f4ce4441e9a67bd1c7cc305b36aebbecddc691734855e3dc4aa22aae37dedd713d44e44234d1479dd50d5897c56649ef575cdad0c1de210bb1612da6714499a081d0a6b1fc913e387ee779f1a8b6409f26726fdfcb57ac56fcdfa9508eb4307491344d56d26e91cccd23798421e9ae0e844267d6b6591c0da1eaa435af4a1a15a75d532aa88b3bef68a9fe63307691b2a74eda4d35cac24e933d2dcba3e891e0e793545d743fb26f3ea9ecb3003af320a3f19755ffb8c7421b334b145a2ed33ea9eb5cbc4593ff2c498ed3ea3f0a9eb3e674eba25ddcaa822e8938ec91264d68fdfcbf2cb4e0f5e3c39f0a2286e8dbf497cbdad8c2a0198ab5522394c577038a62a18e398ac6ca0ab35ac981699215256ff5c366a2d68caeab5726849096575f0c8d6c2102f65759c173de5b51003abac0e01521f3965c51f7235365565f54b81aee6e54b59dd925082d28549c911136ab0a44031c4e34a19018bf4b903945c7519534e4002694c8c6960913eaf000b322c89a2c5904685b27e1aa0c52002e54335b5818b56e9018e6f3714d9174097f2c6804624ef0f906ed27dda53d2ffc0a66f12c5bd3645bee8698f8d9849e4439180199f7f4e97bebd43ba49f6694f597f57de24ea37145449286e299ce6ad7493ac7f9e8019e54db27489ab9ab7a7ad6bddb7a77b2362e54b9f7f1b04ae0db057fffe1e809644a640c8fe1de08cb2ff443714f56b9d2e89954c517e7b8a0b3b084b5cd7e6294cbfe4fb4207ae952faf90829d7c5d4ac02b654e0541d0c7d2820041a7252508d6ea60fcb5d1383bc68e339e401b3a4dbc8e74b5e942811677ec8c70644d921682c21e1484666cf32008964c4abc844bc7708838a1900315f99c8c9ce0d495c32985f23ee501ba01011220acaf11280b108f405b9f0305713252d27ff327cf9f37607427e0fe18f1e3c29f335645fe58f9e34524882e081faa196ad8bef4a7f96001b5909252d9248a85811f2dd0fce027881f238fd960ec87c7633f5b785c438794f42bc541c0e7cbc627071fad3f6d5f68aa3d8dbee829870d445fd3f05488f4b3a4d1fc9c3d9d40c8a99fe4906bd050abd7219396248d606656274731946970c357cf1cbebacddebebad450bd2894a140c9db4363cf1e1e58c79e365957c79e3056c71e2c58381d4774e8d8b3952bae8d7af2ec692103a703eb59a327ec4f5c933c5a60d83c535ee481429547c99f3930219f1e2c79c2e011444389049e37376c78bedc70d281c70a96930e0ce6f99127ebcfdc8e1c383c5932f0c0e30563043c27e0d9ba21e3af8f314c50820947e0f47a70697900943d2368c93023c4c797311a2ec660bc18a3aa9aed916105a9c60259eee0e14166861d49340801cf1e372da448d1f2854989849d3b2eecbcb9b2830646ef05a9e54bf2699045c98f332990f112010ba9d292c29617805ca1a3f58c5f96f0eb8c1a11060a7ac4e1f1e60915a016940d0c5763a6e88191a5048c9d2458764c50e1031bba187b8061e6825fc6f9bbf8de81f257e8ef884ddc1ec514b0028f8c215d5338bcf0ec5c1d408e083ce0b4b9e2076cc9edacc87d012b659851c24043d7e952037705250b7755e7080ddc15aed3e3cf5c3652e7c68b3a35a89caeea50ddb11abbc14268c27807c7e33b43ee9846e764a5879ef2e8c840670d17cee985aeccd56a3a73827c7478326c7b74a22acf1127d1a1a3029d227fe2d2ca706a81cb7d78aa41d828cdac4b2225156037bd4926e9593bcdac4b3313ba9266e8b4baa42dd0dab1197ace321fcdf22894edd12245dd77701b4dcde16113f32de7af68ecfe7507f0f92b76a7b0fe1cc92d3941ae9ca93bde9b3f8c33f3d72140c4c8595a3fcbeb35bfa2cd611ad0bc386151370436adf012f66ba62897f079fdd614fedd2a684f04db3123961d5d5e7396b8f13365880cd7d51db12f7764f0e812c70530c3117b53c769051139348680d9b8b174da3e0e0ab4710c911f5853cac8f1c2829ea5bccfda9f12bc0278ca8be302cea04aed1dfdd45aeb8daa6f377629f7c3a576cd9618c2723808de84bd09f367ee48296651a1947d5179e38257293ee5bd49e14fdb58e5842542fe1c9bac6cfd691bb1ecf873b4a570e34fdb3885c69fa36d05ac3f6d63d78b3f471bd71b167fdac61602fd39dab2f0f9d336ba80e7cfd1c6a5ce9fb6d10b9c3f479b94357fdac6af347f8e362664feb48d5bc4fc39da9080fd691b9f74e0cfd116c5ca9fb6112cca9fa3ad49f979fd691b9d2cf973b44149f2a76d4cd2f5e768eb80913f6de395227f8e362541feb48d5db6fe1c6d5a78fc691b59c0f1e7d8f4821bad1fad9b2caad18efa48c5e14c2d2bc6a6194c8a65c537cd509ee38fa695154d3394d6a935299515d482f88c7006bcf2faf5cf7393ff75ffebb566b244edf39d32ff3cbcf7f3e75aab8add7f0e9ed53120f55706b201e466ea4fdb1a3ebc3563d7de3bab8d4d7b4a99acee13ea7a7587ba7e6534820a6630676fc250178f57d308a890263c78707874f408831aee0346b60d99760b85661d3c901f916b59e550d68aacb8c1d00663cd01305a846d8d00088e20307a449842a3a5ca46d81876458819356eb8c040a200ae213ae6a440e76a47cf07fe92c5c79f307d786409538444869e1867ae005df16a8f8a913333b4a8d1228805b87c8159e9f9fa73430cd1043702a1b0429609417a1704a9d38351e38a8e3f61ca4140c664a18ac1220ad70362c0d123060923648d81f10146d045a3cc113660ba4c6831070715921e566ad4f9728db4b6a848c983644e9701783c7eec90c14b1e3a5e7a70a06b50381227ce951156644dd0b3b1a6cd9c2c3ab2807578c2820a2d64b893b5e78d01c64c8561632584333dba64ae376d90d8b0c282338856315205c38e232fbcacbce0c126a408a030535db0e294c0a5c58d205df4d0a1c1c5640200263e8e30f0e5042b429cf829b34304096964882226479a295b7a68c87205c9972871568c99f005cc980d1a6239dab8e9c00fb2ca70e1020f95979e370308240647a0155880e1444b8f210d4d90ccf011274a0c217642289205c78c1c62c464916199495d8dd0012e1673ba58397380291750c85123cd982157429a67889733488a8085a06343921472784d1149c18a95cd44acb2819664461b292bc431c1c7d71f357bd870c942634545688a0f8f408b313c884859c306cc07ad1a33ac80a4469127527ad89c0c92c2c29031557a4f3288c2e7ab0a989217b444f1f195a0a3cc95ae2654e808eac1c5470b3c364db4827cfdb019a8a2c42a899a11b2aa48cd10abbaa21a41498f0e141f9a466122d6820c2190996243d300116302551e2980d83cf971937ac142cc9dad15e8102961cb40c2571a2f5780c0718263421bcf8041f2c29229407248364576d40864670d1aaf1e46032873020c5c704a18244747d599de9b1e42d274357980035c584c413921ce9a315240ae6c2122468e9729515c0800131f454d7a928c4084aa6bcc0e231168c1841b6d50c81243d7b8a4294f0f18a888817dd1aab11a23ffd99c4e0776d50cf9efabbafc308861cb5a3538fecba07f6e7322e5e767eec3b7756ac26e1205cd516a2b89086150e8b3c29a3f4ba7ed3f3562ffa9a143fe931a61b6a684d4f15afa5af8effb7491927e4ea726cb71308ce1c110467f1df9ee77bfef9321e1ef437a2adad266851d27128df3d569755ddd362a19a21b820302e4cc9619ae4c822c6179d0ac10124c625b59ac881896ef86c8dd1c9a2b0d423ee8d27ce1325daed418a20296913020560c2a807932c38b491a2c609a2efa6ea519bb4af60c9fb1acd9a8102634603789ea124d180f0d9ac7b80629cb1a0669b26e12fd4fbf65b2213038337693e8df8b7b4aa1a46758f8ef29ef4cd79f38293f7ee8be7ab12d2346668e19126424603327dc9185adfbe97e2d325b54b0f4c1032e3a9fa231a337477edd8add1056ee37bfbeeb91d646e5251d3f5942e642e6595f48030f6ab85ecd53ea654f86d8b5a84b5c433e245ab36637072906e0454e8fdcc3007607bb73907e9d3991cf6a33dfe033df706b9a79cd675ef3a36d734a96e0e04ad6669e1afcac63509f7fd9ad596472e1cd418a22f7e0293a78111707296e5ee41db687bd3f28dabb22bf1d6dd0adf965134a4505830609fa5b1391874e54c4c15451bfee5b53e81b3cf40d5b4515f2d2894c15b529f49a875ed3b0a3eecb1ce9696ec36e0831300960b9c04dba5eb4775c298afcc8efd1ded5ac0a003fa9181d0bc09200bc7a9179e4d54c51e4477b677a911b993ba925a3232f720c8eb63fa06eddb6d32523a57b333fa85d198ca137c968d7afda657a911f7dad64be97fa4a367d0f3087aa9129b5b4cf99cb7675d285caddc1fd13e96966537ed20560d6005cc79955ec265d078059dfdca4ebe636e94d3a35f0e759c140f384aa3bea9e750c070e1c76cc83dfa31bc2e8e6b7c8afcf444a976e5ee54e6f523d3277475ee56eba91b933f22af70e451eac8adcaac8cd4defcdb42ada5c78aba8e0f1691f4a740a7643d8254bc0a05a54b074e41dfcdbd48bfcb6b33ada1f3ce074c9c83df868cd0ef28fac17eb486f882af7a3cfa6bb54974b3f00fdd7120b82f67e785179bf213eb8f99107a74e731dfc68fb91dffc2c3d28dda4eb1efcc8cfdc98a28de2265dcf804949978cfc03108cbcc39e32f2222f720f37f3c8d4a402e892116902ffb7cfaba28217ddcd16152c3de01e76d503de61d39b947d043707f63fbfedaa07dc688f550f78d1a6e38eba2f6e220f6c0f8adc2e09f7a96dd78bf6d9417ed765696f14bca188dc1cea73faf595b4808807f4265928221e18f9f775e447db66daa917b149bffe667a406fd2cdf4c0c8c54aa230da7aea8d767993be9e9225501479d1b69976eaef144d6a832d42227ed51ddb10aeb170231eeb4a97ac2bca33877d1879dbdbd27aeb1f282087884f551f919e0f1ed84570501f530a8203fb9f7f379bd466b2a97e6413bef7f2c05eb4db64f729f5d552ecd73f87fa76f974024c23b021d4daeba1f5b82308ace3226f5ddb51863f478cfdfcb010b548d422551c42982f187c9ebab6e4f7f9b5202a79c1f50f04c67e9b30d2f979bece81ef71935bbd4adaf381d5843f9cc90b8eaa04d633f9b4a23caa75027b6dce2e9c043905a25f6bbdf52d69dd4e6f47584fc79a1e8f29164e7e7a3b04b170f253abd9768ced78f3678d86531fa73d55ba040b75b90f62c62fa7cb7dd06d690a46c8181e5e991462c090a348eee5383286078f1d536d7e086231de293b106ac72498724c91253ead9fc4b838ba6e122df129dd21386620c124a6afc62103e3068c50e4fb7a225895b29d9b217703cb0d30124a37c46eb029b1eb1b61df8d333aa76b8008531e9a38ad2c5a5a66695d6275b1f6741879b18e79fede7b2dc677f772783dae1e8835f2de59590afd776da538cf6e4d1c3c0a3dad203d1b2b6459fd2e56d251a0f5e4af63a5eba78e826cbb4f3edd0d41226f2dafbf2142bf2466286998f7119f2312944a0e02edf789d00c32f006312983b5b5d4a7ca0b5a7d4e40624584a533a7e5826dd2d36af2d6b5236925a9c1c85f0d311a754c08753b663aa7311b367a36703cc6638f31761ad3444f7b3504d518fbb3c477ece8f247732f2bc7e78c8bb39ff666cc3083ce9f3814c0ca4fdf4c0347161135a34ece876994798c69a4798c31c6ba9cbb8c3a2739b6a75124a4a1c23f60afe8e48054c0cca09299c0d1c1994125c3c60c282c9cdcf46628717253abd98c9ef666f078fdb43743ebcf1a8d36b83c633d2cb1a75866e80c1d0c32ac704f06960e06dad31e16974031f8c4a0c2ca4295d37d705293eb614da91a9dd46010004f7b585b5f3eed6165fd894b410c27a6b360a526a1c44480337a960ce292e10b9a0d98308707902d2c2340ee7c7bc8718e2e4c9a215d183153b42e8c5507422b1664ba30faca2b84375853606e4fa5570c653dcb40994ccb340882206882aedd6e4d7e6ede9e30d487da6f6128f3a34b01d387325dbb6ebb5a6ba8ec18f3cab3fca3bf51f6f3b620b0b5db29c864c4271cf8816006f3f77ddf87b1fe4cd1494c591fdf5d5a24ca13bf7a30eefc898341055f0ce7de7bab29f594acf673e2e58a852b2460ec0b575d5727bcb1d545892d92904871a36982beee40598a55c416e7a7ecdabf5a6bcd97da3bfb2c98535624088ecadacd39677aefec73257babe06eba649cbedc7bedd4d4d454941df3e50b18a73060a5665222f1624608174cef45d51518415660f2c000033eed55d169a157c5c2d58fab21547854f1f1d5e388981120516408a9d3260a982b19e1150e7094334bf3a5e9879cce6aeb85112b2955e44ce942c7861b2448fae800b3070f9222564fbeab16e218278c55d767354587a9f2f2e4d35e15952b250c4fa97f92896ecdb3be95faec779fe33deb537ed182396576fa15ccd35e08605f710f86d708e7f195d763c7f7de9b7706434a3ffc0216374e59aee8ae9060aaeafac65c25268c8d24d1d3674d0a4b88c0f10143903e3aaa9c003a5243ebd830bed165a99a027b552f445d163e1810cea2f3d8c40696c5d409d9c83ee4ae19191b1995123079cccd8205ecb9e8a2cba2f157b18eaaab0a4b112b2c56583d2a1d3d174b7a5457403c964e5a7a54547fe67239877b54538f31c6383b61c9dbcd5bd9f983e5ce955e921796cef2eda0b773d2bc28e2048d0a76bacafcb4d7a2cf08070a0e8aaeb782cf0b3dedad705162fd61fdf5588085df1705cc26d106b408d3a089698b5e0b3aff7ddf57035860d9f0b4c722c67f4f7b2cacfeb415e9ad9872d1e78553133bbda9ae41507a536a623429e9db9ef6a6b4f4a6beb25c68a1850f3a0a046d05e242328805a7154aa1a7bc41415428cba7bc415a1020090a2488cf9f4840c49bfdd6b489e40d02d706d42f17f6dc8d3afd4b6f4f17db038839ef1d1738056eaeea79fbadf7f3fb5403e563a716c428ead067d92fcdc4fe912566b8745c96a318ca6cb596566f0d9a533d96355bc5fd679eb86a6a07c91263d6d8b3ed2bcdd3bfd41ace1a08a2a122afb9cdc922d3a6a3ee131d346890cdc4cf61039169b3486659d2489ad3669e7f34f18b269599f4c1efc3b6fad9d900875d87363d92a2d88fa0188632d9e7e0a8a194a34502829f9e7c3068d0202c38a9dc4067a784d413044160ff3006ea832e1a3549e02f0427ae50d8eb49c37c751416091cad0975dd82bbb71209a6263ac18c4e503feb41bf3d55076b387c4464eac1de90b19789df58431ff24f9b1e41583367aeaf8b66e9a159f31325664e9e68519764a336453dda7d4abdb84f8c7d1636c91c43cd5ce635f39c79e81acc73e6d987cc53ea8299cb662ed246902c714d4cc53c52b209f45b5da8f46b9ea45fed59932740d79b3c2173f2047671864d501a41986bfbf624faec9a54948de7dd43f5ba062702c913e0751c112b4a0b706acf4e249a34d7609e43fb94faa82a6442cdbc7e69429116483d8dc82cc913e01e77f52bcac6914e508394b44764eb3150bf249da4a054d2444996c015e3bf6f5fd729910315746c6aeaa3865ef41b35be7881e74045056f6904328fca1f9a1c841e954f48e0557878eda1a9a282af34029953d2490a825c426326a5a71402f18e778321798ba05a60ff3e08554a832579b57e5b8fc9b12150043de37befbd77e74a92266af9e6ec78cc82a89e7d244b644c96c0a41799a5e79aee86a0456ebb1d3dd0c12d6981cc56f7e9779f489ff729c17f2e8a325114c5286a248a32997b158d8cbc4e15217a8df270c2689ff6b42fc3631df62981d803fb441a73b44ff772dba72d8b4d57b473cebbda53830f35cb3c2a834e4aed6ead1703fa9374d084aa39089fafe8f84907afe33c7f9255ac39071274528fe592cca25a5df47abdee33f762f5d3ba11a3dfe76701be9235aff935ab79cab668bbc056bfdb779435aa456e0fcc88dc37345dcf9ef39c2a227bdd623e8f9c04bd66d24813b5e633f204b8c17d9f1278d81dc6ee03fbb6edce4e56ebb7a37df1935e9a943451fa58eb2e375c279a5d1fafd36ef6db3e734fba0665df1be53732e9cb7276b1cacc9c8d6ae49ccf0e92266a2e3a695e57ba4566e93653c83998a0d788cc994933a9ee8670ff24f853a7211cf24a9ad0a5d3cf8724404272bb4fb7919f06915c3354c90d15bacc6b9d2aa2965f362c37179e1a7ca82ecab6e8a7ccbaa82174d9c675ec0fed9b76d0b35fe07e12488084e46eb3956345c6649e3f3ce9a7061f9ee63392e6d54f6c91766952d204e950b47d56903c313ee9b5c8fd72bdfffcdba7061f729fc93d6e5ca74a901dd7a922281e1365611886a10cd7f98eaa0f0ab2e5fd69af843941bc3ef7b41704eb4b30f30478da23c148901f5f3be8737a4292f48450f58298e909d17af3fa85b259ba288a3350ac1b388420cdb1e3907e08d63716448803832128826005c10ad6d1417890925da15fb0466e5da1481f871cdca77db2b6cf28fba09f600541bca1481f1d74300cc11c8279fecc8e4d281aa85d04c1da5545808eeb9c1c6a1acd41acfd243df453d737a10ef729ee287b923bca3e080e35d1ce2810f44a5e30560ff7599f74d03ca3f06d74ec190441afd843af62a1d6279167ec3493469ad0349fe10afa49b46b18d418d71ae8501a8358147190e368d2274972a4553113340f3d9bd53598a20f6df06b7270d0ccf46b9745ca5e9ae158cb5ac7524d1591b396e91d7abe21ae8761c55b6799975e655eee9b769a67d0f348dba467179d8349a3ed330acf32b9c7aa06f4d145faa25735550415dfbc89bf2c93c95c26dbfa75de1a8e3cd978a2f1444347956cddf227adf21cc71a095a5b5b9884207acca37baa51d23fc747c2f930f263ce160f35628d235c2d62bbd72ed12f4c96b50c827b97f76e377a06fdf314420ebaf825fa6cd73171ef3e9acb66fe79ce2e7a0a0d9e7ddce0a3872091832e24e443bb7e098db2dde829b47f3e1bf299d3b290d35cc306a2dade6998cd2430baa6f99050b977b4bd1bf74e147df4998cdcbb5194e90fcca1cce952ce59a6c1fc6990aa16bc23529ca84b290df483cf5384bbdd2713fb44ff1ce7ece157e8e4ae63e1de61ae1433d7a0a7201dfbf779e82986fc73b18bc84597ed1435cf5ecabc74a15dbfee2eebbd03f76e173ac62e7a0ad0b1935b424efa6c57b09b34b477d9879c68d7f6ee730d7b37b477b3bd23c14809dc24ae14da4507f70ef4990bedbab5c34edbbb59b877bbafd04527378a1d570aede3de897ba7b4cb8b77fe647bec2bcb9613ebaa53a50603eb563ee91876baf46d2d06ee122c6f7d93be4db11d92aa56b710e90d01d21b02fbfdac3577dab3d714a0e7bd035da7b89ef72efbe59265d0efde9537c9eeb864ce8502ef5d5dc25c32a7648aebdfde5199b9d337e9665b0521fd58f396666d68922ed29cead2eda5f9e80ba0f93873d117307391f4d017407ae852370cb4cb7c017a5bd5a521a1d267a55755b03473d2a4b2aa4b33afaa6069c8c54b5e1f32b55f33c590ebbd237dc82f59c912a4f6a1bd1b32694ed27cc6759df4d9de913e64ea68e68eeb3a178a72efea529982e6427be729665eee1dd2d38bd2ba1d7d16ba3665db45b7e25251c1432d81f7eef346dd5cf5ed0e96ceec797700fe47e4eab4075aeff2267dbd884714da175097747993aade760abc225e29ad71d83492ee5693aaea924f52389c1da844acf76549ea948208000000042316000028100a08842291204792385bb60714800d81ba3a5444140923811cc7411083310cc4300c020c200018830832c84993560010c888823999fe157f5e5dfdbe04bc4d1661cfe86d00c4d34434681f1ccd230431bcc75314adca758d6be05d51e801904d9ea4b392175b54b05e5d54283fa78b77f8555f0a360fbe54afe8aabc4e0dd36ace4866a77978ba9d6ea9ab71d1468e9af14307ff7873a506ae5cdd1caa28aaf2301d7d289df50106050b89caa874e4b8e8f29cabdee768d0c4a56859825c88f9a8171b5e3330ee65f72663d8ff83dcbfe43bca0fc4fb1039b85adf13adfc160fe14da62d8a2f5c6cfe0e0e52c9e6e0c8c479065a045f641ec3525b8933962c1260d442fdcd759227560f1ad2eae72a75852188065c2a28765c7b8b0e515ee9e40e12e7071dc88425b67958b2ee7d98eabc83313e8686f1510e00b5e0a92e491146d6730d677708cb09768d526ad83f881a395be7afed71484d774a1fe404b11d4a92a1245179bdc491b5afef7d80e8c4453ed682f2c00c75afe2d18c559207a045a8517b389a5d5f1b0dd5fd8db89d9d12823feed4a7d62d5d9b9621502968061a7a604cbb269591baa23ad261054e612053103b26850ced7323e962bea3b8764ca6611d3eaaa04103308e3bae821c1b1f5729f1f96bc08baf03b34251c90898da4732596b61abdff155e8b3cd715b1922ec187f58a5c49bdf9cff8b092e61f494f875b92fa3ea13e5e417f7ab25283be8f070a632f28e81f598d20d08bdaacf9a6a6c5022373562ec33c415d6b3d4b5fee547d8a30d6a92e8636242ccbb60aa6dfaa9a52991f521065d1482f4802dc24523247a4358f3cbd9ae89219813ac3ddefe0e4c0e654074facb3a26e8ee08719d976437ec724075fb8c069b2dcc6cff0816ae3689433ba379a51c8152917a29e26317a0b52dc8782119b77f6b5d783377dd591374c307d4f0c41c367ac5ca40fee414499f109633f48394df1f082d18afa974a266b818bf567e0739668a2f0557a17ed02d3dbc69b155ac46f7467eca06911e77541d8e6cd15d5064f80613aa3fd2e7edb1b2673b6ad885dcc177a5d5ab3451eb971fb577d0c47f89c7b15f43f924314619a3a977271d8d9ea3a44ac307d218bceb55efd7f0464bd006c35244fcac360219dbd2150926e3fad649701f6313d3fb3e72810a0868b8b7720bd0441f2fb88e229a1b3c54a281039fc6397cfde52c9cd40082490113040f48e64ef489a595b099b79afdbfa612f9f30c3f9f73d6f39e1a66cc2ac94e1b0c007b0ddc90282f9d7273bf2e068192a3445f69f81d15c2995a1a9256bfb1304c7e1d2ce41ae4b6c23a07c08e2ba97109056a847c6a8ac5eb2b28fcf56fbfed41da3a6f6e3d21e1d08dcb7deaa759e256e9db7516555230ddb54a9ada989eacbbe65826de75a1ef9b42a793478f756e0dd7d8bcc1b7d72eb85f4d5882e8f0aa08ee72f88177043a4ed857248c55fa5831fa0947b2d647b5871a7cfe3ff376d23f52ee13d88f63d2da8632926f3a84beecb67ba66ff23c34d07480ec53f162665b04a27c109f10029f7209d6ffe2d72a7c90ad06024ba392596ad14d733ca13f0fb6348e4c2e4edbf4f4bbf3870019760bb5cb0e814070b5f9cd52da491b103660d88a7308fae60005470993fa06480497940aefc4044ac49df5776baf7af0818a1c150caf6cc7b7694cf639b10664f143de8fb41823c2b670e808c5a05cd408b2694339c0509655d8e5fe94908b716740ba6937c79ee2e3b8b5b385a58a1bf108ee34cdab7c0def36d65d534031dc3fb52c5bb13a8c85911f4be1b2ef7341ca8f6ab8bd9c2f7fa6610c933ca3439c159ade413ff63758e81e93dbf436bdced6befa7e6780cd0a65e3e334dca9c66a4ed01b529f92bf7b05198b99a2084fb166e8abb90e768f815b5b307d38f95db4694bff5b2fa0256b5e73356270939e06ac52fb4fe63d7f3e49b5e4e869240f80785b9da92a69896e18daf2daaf84c9b60fdc107ee527293b50ad5b95e213c85b291bc4850e645c44adc9c25568d0efc1e863e9087df44566471b9dbacfb20fd28034d5b886e723b019cb3e0ac9f4af968fc32995088982a19223c2d7a2dd339236c4d5a814ab02ecba304ed16621c9f159af0355e662d93383a58c67dc1559c387d93c3918c7a4fb86150d6263c48ed730339f0febb56bf820913004a46bcc404f4a4eb559054fb7ab77d4c130ef079a13a629870bfbdfc567e617400ea5ced037f3fe997591808f55f1f4dc0bfcad98193f448fc6f71fe84d819314a497e2eef0a9b3d96de8ac4ee998b1d8bd9747e83f3afc1f29beb5ab96fb25ad470b93fafe752c6e940ce9842971a1e8093c88a81a919b3b2c7a1cba435844a6b95a943b7fc21121f7cd0201a276a59fe94cc776397f731997a0096d5e1a7d5338050103b10d854ac2602eda101024d13facc3c994bd1865c2389e4e49c6c0e8b727f98237da6ba40fb2758a782151926c572f5c48772399fd918ad5d5cf97206e7f7901f3d8345758fcc36513ae1b92b13740f6b477bb91aa61c90f9cb2b9930a9ba9c6689925592549e7730dc6b60964ffa251e5f2a794269c49cf87d3d261abe3e01dc6a8d077811b61f0406d84509d64cc73dcd5b2ab0cc3705fc3dbbde56a207a9b4978eb4b4335a158dd0f4231d44bcabf2c4cb4c8381d47ce072aef75d14d47b76ef224e4f9d4239b87e8b019cfdda778380876783af519787f77ee88220cfb3201764f69d2a16347638500968991e5818a4376c3d5a9bc35cf2c4906311b136555eb8cef94e40c8db848f91f4b2f6737bc8ebfe920d72182aa43ee76b0007558a5f66ad4ee4245d85f0af8ea1299d4c8794399c3948d310986b4ed51032e04097dd001ff4745fe28659baec15a773686d239269015e61c801300bc7b47d692cb28b7d7de83e48942e75d0e660ecd59fd26520362972ebace1c28f7c11b2383ff82677f2922023a2487c9ba3cb6d9b11bebe514e09bff1beb572287750ed8bee28c84b7fc890d237fb7cea1a288e2b96cf9f1c217e079ef858a094eea750f42620ea736644ba0c78947c5ca07aec61de570437da366cab29f497014a6821b32ada8fcc597cefa933f25105bdce870abdf10f0a67d5e4b777f13c8af55f929eeefa1cc560cc0f7be536efea6e0f2c388185a22b3097047f7d262e1bf3cb9f9117528117e0b48831d7128929d2ec712e295b2cdf513c3ad818307a82a6ddf96920f9a0bd3e3572c3dba08af52f7e27cb7df6d7393c7fb9812e6c254f2ebdfa498a913334e4f285a5b228dbef0074f80bd812b31f7d5a26e6e496d9fe34aecf1c8fe6d4d3807aba3d9e3be5fc5bc688969850f88f2624ffbe77041aa4bc2c45920a6b4f0a4c4be2627970e54a48527fbb1676cf6fd07c4aadc8f7961b34c06e4444af130c85c9d83a5de1381f139b43d773582e673bc2721a0f9ef97c130357babcb6d30bcd387aed5928367950d86836414d90e530d862dce9919d7a405a237890e83e19789a340439c5af87e004f430935479201deaa7ed2560b111976624bfd1a9772440cdc86d549b1201786d3726322a0ca226c782ca5fbf9def9b314d95c42a8bea123e240a3b2003e2c24fe07530bff68981e2a7c46b2951d0d43bce91579f1b8aaf2755daf14a202b158db19a2cbeccc14e94d95d798be542fcd245cf54d199c86d19118046bd8cd5d2a3e023afe6219eebb359d75c3400954e3ba614c8be7f901fe2dd323c793c820ee28cda7639518c634b7bd725c4de379b476ca60145438b75a5c08e43b1c0373e4b394a5fb27b394815843c620f00d9efb22c96ea9f97891f2e45f587bb801887fd7e53f777ac8d7d0e6e368bb0183ee8f14016a87052bfc3e859bf890ac8d7c87adff081c543f64ae298adf8588d87782bb134a9b4e3b16cfc3934a82696896b1b7e3a1b747a83058f11070089ef5f0266d731e5b0f7bc8fe30c51653d19a133c022715a9f9da42a55d6add94ac9591b3b2b19115fd4d371ea10decb40b24398a95174e6c0125fbc38b19f9fd3947e63e28468a674800d63ac2d1147d0910c7090271d3639f80c3b2bd438027822f75b838702a2d03db71b8fd5d94a329a71166acc0694b50460f0f3d18655e4c0260caa19444b9bf732382fe4d18a47559aff60c3f6e6ccdef561100b99bad3c1e63f1061fb72d4fa182c4e5b5c7e52b7d8c4c1399d1ecded3064a2805477b6d6eb946686c2a0b9c8fc18bd2b5a30a8510e3c476236c9c220b5e858dbfc8539eb2114f6505cb115c0eb4f2ef6b5d6bf552c16b1a7835d71a9da095a289e704ad291b6be6d047ff1accf56c48b4a1d6c637b47f636d466c3e3333082e6e69880aa3bbf6d2f4e1483bd95dd692595790d8773ab558cd827fbcf3e385804f6627a4c201f952a2fd8daa69a85bcb41570a54e2af2736daa9148b6bd71b8831fc4445f63377d3add893653b260558e747627bb8db027be68039822d1c32e2b5fb611debad5f4f86a7b247505db015f0fddcbb42fa18629102339912740bf9fec8cd38aea8d3033ca657afef2825adbd59aad2898eb7029d61afa00d6518eacf124c59855faa17bc547198fb53d3b73f91919b98d6277fbd266f2ea71be66380012a9ab223d21108198ed60d90b6fe0550577b4cb63912a473d428695e93ef1b3dd1ff1606e974b847b6af9ccb20b30c4fc3520ce8feca1215a09f105357d300c325f40cca7f0654304f595a03dc9ce3c4fae39258e961ce536d04b95ecb271be25afb40a6b04978e54e49e62e41bba66015129ff7773ec98469dd75ac4d772039f1c99b9d4df20d67014dc586c8bbd17bb30d653cc85170383bd5cf289c6ccb353b05a818f0fbb841f0e72caa57dcb640dc18b8172f3e1c51934fa3a6233446561393d09e05c00ad0eaeca001a90a7eb1df6579b93b055af63b2c1b4a2acaaa89b97505570312417a5312420db26af57aceac3936bee04630d470f1a6ae0ac79dec35788c60eec592fdc49e2ddc84670521e9553f980973e782539d945cde352d7a721d57035d1395aa0f075154f1385dc4b1c683b8ae342cf07109e2352a7dc1e6c8ad739dab14d712f1ef34e56e164d3943d037ff4a13e1f0fdc386c6b7d3f66b617b4acefb9a3aa9317112d5283a540ed2fb0ec0cdf43c87dcdc2a0770b9ea6ce83d6d760c5483c01aeb8bd7acddd3ac0a98e8ab70c4c281d809c10b72055829d1cbd6fa937139a0eb6eb18a7e77c052d8fe3c51242c47d83a88b6171b890e694d73ca73d1256d22d01d00ac893ad8771695a4687cfe77f643d181fbd1f845d55e9b9a1b3328c7bacf0b63ed0987458276867463552086f5e2a2d6a1c055e30f69482ad2cec8a41d0238502a8da5d292a6c10fce44dc9f6968dec86b8204d21a8d2a2a6351d622f0fe1617d8164a79509082551e51118a1d1a54322c7b9bb50649610583abf4d1cbb9cb38e94c503a73601b0bde3516746a59f43bc870a4468f50ba40f91b33dda2a611712eca6e5b34b25b3c588964467ff93a769c96450d31a6a27b18b9bdbc3a3d01052d9d8212604f8078ad38daa23e7323d6264b5a776bdfeae81c0a4614af6dce689566e9550bbd5a1191fa6d403cf86766494d0eb85c17bccd3a4a8316899fb5755d0eb0e05411f7db889e565a15a14c03b508baeb9910e841b353a42117d0ef3665ff347b74dcc1563a21c39ee5aec6f64c61d98b184b189d465c9eeea7620faf6c80ab36c268c2c0987e8aaeb3b0836c1075ccca7f9aef7838620a0405e9c7a58e41556c40d01394f9a9e5dc87149285e546748df146adca4335bb22aa38f9c69fdc0a2499914a5c7b0f57ec5475298a443673c625530086a151b0668ad4ea69e2cf9c37852b18a084045aa36e0e7e211b3db2fc44cc5ec0867ba1ed3ad36ce4815b163263dd373add1fd9491ad2f6399204134f5ded1f00bb5e509070b2ae1a8c134e1e424d99098657db889031f5efb455ae40aaa78dd8d1b3d1c5ffbc23ae31573b16c747b27e65e59908c7a00e3cb8cb78d22f801f59569af70b01f205a8984635e8639e80a642f4c7ae1a9eadac36462043cdf0d5d4b89e76d42adc989198b8f692cbd89850ad4cc6d1689b1992a7dbf605a955b25592f6e5881a59cd7e07aeb484f6a54c1d24268d32480c91f3f92f38437162a3ae8091a9956d3887397b7dca223b748d8423ed499bb7d2905686d05d79d0e325b7cc97d5a56898b961d65dba916979ea1f900914b355dd588f0ce4927f82f7dcadd748b31bc2339d5da499e3e8004c51d871c35481419badb4b597df1656fb57e573b8e150d2921aa98b526e3133be578efc16b3bb2b4e5b88bcb2467e54d5700a07a4819133f68c837ccbab6c91d7c4003cf08f87eca6c85c95d9bdf218ef7a5e077ad199a103470dd8014697c5aa71d3d36fe9f27b1d4cdc0521838630a9ad82b3237b1548bc677c1e9b0fbd48183fcdc4c56bdf820b365a1c936c5907a15015341c693f9c755871dba50c8bba35b34ba3228da38eea5571035681d071c72d58000fe95f94374a0a82435ff5f4e3b9c22f88539a6ffd454e1d4645c6d02865160c932e43cb142ebe67567c007211fb8691245ad93a2425af571d4f80d695cb28afd156df853ecfa5bc96cd905e0f467d9d452a073a053799e129364a0f4d71e5437f7102f442838b5054d974b00c1c752dabdfbb0bdeaa33cd2e8578f80e4415d015326900a26e8c9e3c2872a821b5f827e49963c44a10d45585588364e486865fdfe7b3f3b65dd1b6e2425dfc8aa614d5e07db640a0b3e56e3ac1edb0cb119a69800db7e12d3a1412eef7a236de11d029fd788eb09da6e047d45e7fe145eddfb9a388a0ce64a41823e2bcc93a27b0447c182f7d52a990d6d20d8acb81b1c0d1ae8a9864fcb892be1a2ccc58e0bb481bd9a662e7e62de8218f2c0261b1001d436c2f2173b640e43b756473afea47a8da5e849afe962fe905e291138261a8aafdd0c336b80ac098a982b93ab5e1dac349a3c18b74533783da5c5f4ba6ae31884e8d9cdceb0bf311369c2ebe89777cd15f040cf3e117eebc244af350c9399b31a0697de370ebe338733c7689ac607260baa0b0c8bdd04ea2bb35f40cdc637303877b3fe27da076bf68ff59c668fa044cef8d635c82132dc34257b467916587ee1865a3ec20ae1b8ce1fb021f7dc6d217c71ed65140018ffae90b1932af1280dfcc4682d6184b57c7bcd5325cb787348107eed15e3bf38d6f59dad7bd2e6135b0921003402425fefc0dc4c845b4d99bd50f69fe0a499a646f184dfe645cfb48d4a07ae85710b40b71822ec42b860ba39227d957866d08915604ae98aa7f9ed7dcc54ecb10746d18bdcd8427fa15e9e580ac764b037e8f14b3bbe84872b48be10e355bc88c3ca48c703e227e41bd96afd2fba1d2ca5b561b2ad57e80a271321fba46e8015628396f46842dcd7934486c178b4cbb1e74689d1a7d563e7ebe571e0e15244c54d341368bc2b8a4e6890402ff4c533c73a509062d08067427090a99f4340456b7e93d207be6661d4cfb7017d28ac4e04b956325451893257e40bc603510240656f40038c7c4b289ec0b5363ca57c6c870bd1d1f4b22d9a12f1fc3cf09af0558e03dc5b310fa434a1cbc7e7a49acc0a75206ffa818bc9efe0e7abac983639b221d502d3da6279479ddcf8f28f6ccf524920d461ac69fd767845a1ee32a76a8ff8a9134d17f396c4b55c4cd4feb2273a878e8e2ccf24923e1966d571f58703bde5173ac33adbc132a5784133c6dfef1c853a0f54e5b68908b528030f897772d49a29c70979d79b932ce930238cad324e6c41aa995b88ff29dae8addfcaba961bd81a60b9218ba0aef7b87613fba903955d04f707e3e8901eb4fe16cf794678f89209d5eb7c8667afa41e5a359479e6dbdcd95869d3309c13c5d458fed2e2573f67601e0b9a3606884d3b2174094cba46ea4f2a18925abe35110f37afdb1659fe5a54595398031d3e2226e51c88ba766471195c8f1793be49399042b0203b143050a6eacfe9d07c48a82c18d31d2ae697ed996c5e9e622d6741f7799e6eb9292189ebf24afd26469462e631241274827803502c61ce1c674f06a89a0eeee00605514ac212d0410704605c60aa078727432b8c2d594c686cf8d32bfae40748c171be15ca541a8c15b4ad92f95673c154ce2c01180758f0704f534487356efb5ba5c352f3245ae098ba786e60089813d99061437a0f42f244a9b75d5278056405da75bbe0e81aa3aefd38c730548e49e066237e371be07c5a530d57d5ad2296feed6d50c3eddb3628c5f3d0d3e6e9c37008c222d30e71d798800546159f86e9826534fb33668a8a3e3aaaac1df46bcc3f44ffea1f1bd286650da5a4c8eed44c9438b70a588747a8be72311f13f6ca285194a6d28fff9d5fa158fc49c031a45ae7366b46e25330d394c9e64ac0f23bdff69cb3ea3301b93883eda59874b6e263110bad2bd34949df619a143c7d4cf0302f5432df81482e484a922ca11c26119a99b78ffd6dc77c8216bcff215e9140595ba4aa86cc15001d96fb5e583f89407a3434bfa564eb7ac694c1a545aa19749b7367f3c947580657273309a51d9bfdf780d06212421d0a23ac52adcb6ecfae4f87104b47c51d39ccca207a6f5177fcd1044736d81d407aa6dc097dff86a7d46d07f15b78ad1a72f0e515047a89d0842a018aafb99093deaf2920a296ad65b217dd49b32cd09b59ba0a916df86a1edca5cd02bf83c58d3de35e09bb1b76c8b2a23db734ec07078301c4920141884604e0809a8cd6de4a0c6c8612f90f21341066967076dc8d4f84137c2a87eca59458b8c813c4275836d4955070b191729f9915c04b3d6ea88e8182f8941c9561981c8bb77ce9c5c166a5f6ed369d1cd5dfb43cf383aa119c86177ac4e376ec6e5272219ff3387beee9a15f20322c4c1916b015384249d9472cbf40d8b041ee268d8af755cd98f4956fb508414a717de845bc015e8794da0e062c585b05451b4f9f83cd5c56c694b888faee81c369171189d6cf087de5ad214ad8fc3325ad0793fe7c510848671a44b6e45fc8842cd15c017bf2512be78c74dbde4117b5c867d6e434bb4347c6d9dca13c9a725c361e93f79e54772c436aa60c4459112d0d1256490941b5a930950c243e412a41c1ff9110e5e90e01d063732f92c8b7b79667893f7034e1d4ede9f891492fac80ca5cde874e29dcc35425dfd1c8256f3e4079076ef956b8a52cde6fc783382ea383071a61a616769c204232282a39cd5ce1ea042e50f2fd4b53ee7e3483628d15bed17844a9904203230eeb6daa967108f804bc49c3ce0719a132dbbd33f3d5bdb0ceb35537d935bbd9d2e23bdba7b4ecc3c4141de1fe49c4d023c6eb75f8ffedbf27668d1572dcf1c12e087f90502d48c097a6bccc737fc059b4a1843fc14de5a71553bb5a15896f1a862624936649d6715d1e8e061df387b1f61410f2adf09f1a83618053ed1fbb0b749beb6a0874ab7efb16403076e3c5c99a3a3228c1a1479a9b3e26745f13e92112541415abae461be42f32ea4c304faad5187a5f455283b42876c172c62fd9af4bb1cf70fd321a14a3273bc8f3e8ee5b9e25f3ce9f29f09e9b2095057bf5273c34f35b74062c1051cbb17f99e72c7433208ad652ab4376d96e49c228f6ced5373070c7823cacb6df851b02d2f6140a022aec492da18bf70f8a154086d1b7507d8be58b232660b94f552eb9666fec61e511a5fe4188d53e60328252657117a3138afb62029859cf0f385291519513f238b06130b36ac3db68673cb087d2c083b8834578eeacfc75aad78d163358a065cfe09fede0df4b4e0abca15b00d230fc1cd508ee22baa2b2f176e165adfdd7cedf82095a0ece6a2514dae0e328071c6020e1848c84bff1e7cf0d0421a0a03e3ba7ba97c2ceeee761a933e3de4ceb3af17d0753eda2779ab6638775158642aaef1e8149327922d772df067b8398a7295475ad6acdbcf57d679bce3f4d3ffdad43b68bcc04f3ef8d88b3a5ae1f38a4e205e0b61ac3416ceb3bb6c280d7368f6677cbf74cc70b4b3d238b9f3ccfc13312375cf75520d245c7f11abf3f6a95fea7cde28b040e1e20b43f41ce81a74e80df72666fa379fc775a1c90217c7ce2e9c4f45c018c1711b0a06f778a5a84034a55d3a01da31999baceadc1f220706c80785eba89e8b7dcb319698607b739b4af588dc2976c43d4bbdc4abfb168bb4f3de14ea1a6a03134405b80f74467c0b942fa56fc2f53d1da76d10b3ec20ce6696cdb2a316bf0a62af6deb5d8ba8001ab064d2a158ab69723e1c44e3f5323fd9c7edfa1af1b2eda7d496f9ab86aa8c0f2eea9b5a9a80fffe8ddddc384f1f76c3288b589058a64fdf39541802e3e6069c0550d10a90a16e378eac1ff93349638421e0c60ce94a942a7af7ab9b8131ac10624c958a8895b3d1b753f5198770c63fa78db2222eb86b682f4036085dda9484a80b68c891ded1e3ae670d69109c4667b0691ed2b4c703dd529032de0a197c08c8b998078e6c74db4c694a46f6313326fb00a1f161c4605fa153469f40edf53452868ce0c19b22ed615512d82f021c3b520dfd5a627dbc9bfaf900c52676a40c79ea33498dc252a6558d8f59b0f9ca9c8e0d127f41212dc7d3ca55f76e8c471b78a08a2a6039705877df38621d1b61ce14e7aad45ecccbab09ddf2611b0d36272fa0a4bc72c9978a997669b93e400eab650d47df02aab5ca6ca3f97e19f7df505cea1ae2bbc1f3ee4bebc8614b5cc360e1615f71ab24dddd737ca82384af029b399ce3a62a56ad7c1d560abc6cf76a5a36a36249a37b027f1924201fc4f7b99953f1c7cf4537306b5ce8c25f77d5bbbefd9ff5004f2047a63e7f4ace3d4a4e04d947eb49181fe4278cf3e293ac54ac67f02011780473c7e6c80697666662c7f731be4962fd8e00710b61dd3d06283baaa91c1d835a387b908fe429fd960431c2d2483133f7208ca01d729a19da6c097f088cc6f385d79680c351dd0010556f8e98d346f131ad96c5de97d9ca2f2fa2df2f07bdded4917e83768bf2d20ea2b02dec55ca152fa4eb152158e68c28bda60effc2ace7a9d1372c4802cea25d78855665e5acc56a2dc9dda6b87a81e2dbb32824e2f8af61591cece25a846f493cf92cbda3c49f241f502debd85952f39650f10eebc0635854359fedc0abdb7c6decd364e1e8f6c89754f2116e848b29abe39cd4406f915783e2224d5f2b72e0ad94a9db41ff923f9766ec14bce715e677c8bd7e66c4b13fc16933b334a9cff0fe200b378fec47ea086fa87e4b84a7b61714dc1c29bb28e064316a7f6844f04b8c3233466a176fd9b57b4e672384a5eb9ca8dba2c8822151bb38d42fbdb1001c84cfb090a517eae92cc5e203f9a4d3dac246c15b2a4a3e5db9a8279dc8690ba6144f345a778df40028d3d1681111ace433644701cbbf8966e7a32f1ac058cb8af2eb1652741d0d2f9f8abcb95697bee42c49a455e65117b99c9641047755e6a2b4ec072177dd4b352a430fd2dbdcf89a7e5774d31b42ff654417011bc3ad7e586a2cd62bff5f182023e2125b5c64346b208ecbba0121d5e81def317f2657caaad870add1dd9f52aa86c5dbf1525c6508550488fcd0b602969087116010a98e87679bf22f41f4500ecc08621e97d124df2bc92a48525d37c50e4ccdecf5eb4a08dee3af6aba6caa3cf0f9fb13483d16fbc26ca63b062a7c954f4f6d64f43a4196bce635704adfb9aa7ed77f752e513ce43535cdccc4765166b016f5b9054ce91652e1f12b37f65a883ee0161f67ca1daa3a8ce4f9a983f6dd9a617ea52aff8fad3d7172d8c37f3a03438e1afaaf57794fc86f9d0f4fccd1c564bc7e7b78ce9c0240c751624508979d086edb6acd7d814581a4e2fe75b677c556e23451dfff67f36af9f4aeb56c92846aa0e585f696dccc8633ca82456548086c0d7b8bf2c91c39bdaaf385b2ad8304f06b739267bf8bebc0ee7db2168643b74feef4b3735b0c5920dac8796f8bf01c9f8816f78a1da42ae8e7c20957ba05c7cffcf9c8c401f2d00f392c5adce9cdac857a1a21c94bae37c4333dc32b3e804ede35db817b05cacf3ce1f5d816f444edee4760c8b5ad0f10dceddd143e7e2e17968266bbb6723df8ba4f0d8ebf045ca6577a3992ac012aeea57f80fc89ed661084aecc9e808e280c52ca209a5cad02d790a404b9eb13aa008e6330cb2d5206701b642d03c5260e8d6300906f6746fe299bd3df757dc14a76b8a42e6e54d93ba8f4a08294c37950e4c22bdcd1bac1a06ea3d182388138a1a261194a50fea5eef04e3ac6c5f63d4afc9828d26a17323f7f19b7828273b507d7103366957f1b651c9e1566fe9b84861bb5d67549b25f2fdf822599df055d72f3cc46adba3d0cf3264c81947cd6fcf8c7cf74a2761b5356753359060a80462aab8502582752dd7c8091e2ac188f85e661c7c4221a2ba829362b77e6859b6c9eb2552971a7e1ce36c7c706ee400d3caa5b8da13449d08f63e2304e9ed613d3c26f8f730b509e96ffddd2652d74e1f0864d7e9c9021b00aac13aba7929c5dfda6a9b4a5fcd22f2cd474dc1816e985632188b0aa1057107cb45a63b6a87024e30a55255ba1ce4123b573ae9b15d9df47b2009edd1088645635912ecb56b6b658d2d709c658e4d42fd5b4e09b7d9725a9af014884183cc58313669b9d1734a215c2d8b256b06b3ff75a6a7e0c38451799673980e4047d94158896c062238eda717163b546626ceeb53e38c325df3cb9632b5e9d1833fa1b7b95007504523c65f5f251aa9dc970abbdd9f769799d933b7dca120b28964cbbfcd903bda0439b1a0cb15dc914d8b6e99c9608936103097a0d155afb037b41018d12f1ce08646b9318ac0aeeb786ce5ac0df416a0e512422f98c7f2997239395e0ee04b5d166fe574a8295de01c10095eaff37818b016e4f8bc394ec31d0c3fc9f288a62002890adeceac6762acad7f45e622b05557b9a3a249476956594f302192d59d9f02ba513eff50025b27dd12e4a826774f3049a68cc5a4f7dfb21353ea20fcf01fb2c873d4e66f827237174caa6dc4ab93b66a7195988f177e3be4aa0e1b89f116fcfc94aebd149e1b4c35ef77bef85a616ef9a3eff5ecb5764ff2eeaf22c4900feb3466b9ee0c4cceff8b02cbe61516b15dee802b9bf0f1654c1d88adcb0cbd6193009cc8710370d285c8a7b34c297cfa4c0a750830b87104c52888d7f71257ad360841b7cca803a3ee09d25b1f9d0b88178d788fec8e14b2569a5ba8fe19a82f24236793b93e2ad8bcbe7dccd5263f04ec39e424c338df56585f7db4f695900b0dd32a4aad812be24b111e5c67888c1fcc63e8834bd85b7b129b291faf8f479486a5438b1ccd4a2d5c80209eeaffcfaac00a5ad009aad1c864623ef160b62b430cb7109888b9a5646eae7c6f9ab635b58fe4791cc2643408c8c9083a6153f83edfb3edd2740e9754d7fcbf8ec9becd0fc204086ce6697499874306c5852d4988e88840197c929ed3111f61d945812a9f705dfde281f3c5213000331c32e148305c847d019950b873d732b005ca4a7d9faa1a7b682c475bb2105a00a2e502f5f1ba93db6a816e328fed80236198da274243ab6c46f3d453d243dad0f8341526d53d476c9652f16b6a2d4978ab4b7d52e8c723c75e1ba882b2cb9528059b44be37c37060f21186e166e2f14bbb883b588ffa55e99bb2225ab0a436ba994e8d95e488b18dd3c4b9e9904c6378b211cdd6ad96cbfc1232deee920fb2ac6645120b81c93afbcf749dea6380b923af7735ade5b44552d6604d92b280bc61f33a207f4f15bc2a6da8269709067e0d1f5d644a647a47738b39ccfc5432a2a719d6594e8bc15fd16e323325c670844749e5210dbf3085eaa4c5afc709850b323e8253c5c92a594c96cb9daac22adb9542aa3ab334802eb3671a7abc9313105108a7f8ea16113c22dd3ba953f42d4afe9179f49c51d1b2ad423acfda2fe685e3083b6423272436e338706f03c6d487bb8835a628ab109ca6a1413b20f4453084cba8137e8bce9c324fa3743a70f6844416c031e438f008cab59b174938a19e27dc5706aee6b726c91cf526e36d6d81fa506294b23f7df28aaccf0b21d172f13f0e7c0d485570f11c6d0463e0ec6ea950b2be0f281401d6cd71152a4f12199a097516dbf1281ce2753f8a85663e65ba65d3a1e0264e02f51a15d24c315bad0caa8960e887546e5950d6fbd69eb25c25519ef23fbca55a7df1ac2fc6e81517027c8e79f81f1ab4ad1b0be1f94eb9478126b52034f19b97a03ab85255f34878245de2d02483380e577b0ccde72ca56e5e86e6f5be6fece73d630359926f99f90d0590739aefcd81ead1774f2f1bd00d9390bb0ab7e1343617f9ac4564941618271bb3b821b3f96b00d6f40afe0d3c26177ed4d994448f9422844059d0c8818e36d83b7654a8e27cf17e9de7afa4245ed315d8c161a65b594055671c7be538e91498319a8a71e180d7699979364af1310e67a93c9a3f366afc80d39fc98e90c0e7f53e9547a7ad9d60e0aaf384f39a67c4e1fe3adb8c7fb14e7ca1892276edc244e42525e58594f2176cb851de9b7c0be60af224ae2b1c1533a781d481e8a85f64542aad246566ab8235d3093901fb8cbd3b2dd5bfd1f175919d28dbcb0c79efcee67da0dd3ae11fc9a808186606f68c77a3034500c0d6d8120ac7e283198adce81e57e631d830266eb102433bdb6c26c753475e004806a3c0bee01a56605660bdae593744e4e6e48c50e8e25333e516bb2d99422cbf88937d69fe8819790bb0e691806b0c1fb9dac5092451a50cbc69549123ae234ab5af738bf98ed4e51738419e954e5078b0bfd7fd66a0839828c2e923fe535e5ce5f5d87f4dd6dc4f6b8662a18c01ee0bd353c9ffd16aa9b940b02a6bb3725372aa0297c9f7d512ee23d6adb851232ab61ca51e72fda32e44e78a18557b862867a79c4db59aff68b190cd6d89af743beed7de80907427dda40e927aa177eb00bcabcd08f1a045cf784ff43670342b217ad00161a984d5344f0c4e568b30a2090208e5f2bb6cb0d47f167c924fa842139918cd75b935e55184ac593e528aa656bb22999a60870a940b7a8473f60feb4a4bfc589699902c549919d845bfaa04373a8873c429e27a6cc8710e5c06ae4a1c2f85025dca81a420e5a98830ccb629cfc10791eb8521e521407ab818f14e247a9f29895b4f83d8a70609c684cad3667cdb74966b2abdbc96a081cce531f4886db3ef2cda260ba7b97d565fa07348f353063b5522a6c71d114d175f92a7a7112cf9cdcf745880f13d0f99676b597665d3b4f85aef8cd59cbda4055bc82cd0cbb9c47aa581624b3acef0e3b7dfd71a9408c0f80edd32b72613e60a5276bf6a58d6167ee857471a6c997b8e1516cb36967e73874bc15388a4fcde4495e71eabe7975a84d6d4c29de253314b6a794d0c8ac53abf184127bbb50a77ba7bc804aaa23f60235dbef854087f74c92bf9807d611c4aa9c6a5616b68327637ad5227498b35ae9731a6b46aafc3968aeaaeecc95d5ae0f660e202ae08be94dc6fd1ce0bd3516696f33c6a82026fe9bac24ff31983855d2819bacbe52f734aa09051fb1d42ae9cdcf1568c607ae89d4fe9d9b63701e09b0ce8587cc7362082b907be195686d91c69159b595d49ccd625a21c0c1fa6dba4f756dc89329c8a38b01ac96e2694e24e7a68156e3e97f32f8b0e9ca5090107a97108e0404e20ba26cc94a5843cc5f178e8448813774587e2d9fe5c7f25d3f56dfe5b37e2fbeebe7f2b37caf9fd577f958bf8b8ff5bbfc5c3eebd7eab37cd7afc567fd5c7e97cff5bbd28f32e5a5182b466064ce60ad01630f1012d30c59f20c94345c5d25745841e6b2e3b4e1487edf3a2e2669d481f80c2de30ac964da4aec265e7784b68ab1ae6201a3c5d801ba71207f3cd11047f3d27525560c0ad1dc0f6f839c9c9452bb3ddf51326222b6c578bcb792c6eb4b8116b7e2a62c29263259a55bb1583842c9d555448702a1dc6af227f7eb28724a99a7cd2349dfb7a3bde10af9856b0489991231bb221ca40d47f22b310e77585ebaacac42cdf7dfabaa64bf17e0f4153146e2bb2374f440fc4468eeccd1ad702c245ae5572bd18135f715790524e82b142372443097d838dfad065d237a178ca917082ca686590f1f723f9422879e69da74407e59d79423984b9b47e2be6fcb1a2e2f5c7390a04c8923d8dd119a7924f1cb224973cb9c663e12fb6551903db790cce9562c160a92f2abd5e88ec8a2901ca4cf07c487720d7ac4ab2eabb8a23864582cc9a7f756838e11bd2b52d49ef194a231e06e44ca880910a09e3b041c715ccce962be07f453e0fd61400069180fd055dc60519957af053724be41dd7bdbe2eccc1717dd38e0354704ec8631d8adfe1b6f8588a30d6b8cbb43072c0687f4e6dcb8152c497dbd1efe7b74f612a20e23a4187716ba13dc69a06e24ab9d1285b428b858b682f0a7130cec103397224f3028a89e370ad95110fd46ae4244b98027a8479c6f84a53a812a1b8d57c8a3d4164ca5ba138f7164bc925d4c3c8691dc2f12474e4bf8570313a9a1db804c6b8e62433ed1d8bdd5fd43b02d0845c565b4b7482262df0e95d3181ca1396350372047e99067da1b7f481a37df520fc14340c931d677fdfc5c9df904fd8d38269c016435e88229202643f1989a96b7338d2d19c40d9afb5a5f544b8ab66912ca40940cf62e24452328fe7527f231ae1a8cef6a33087c3bc11e604abf149301a9224f14400ef10d0198cb4aa9240ff84821601f3d0251bdb234e726a607c2d9ca9aae4e1b8f028e42bbdee50395c582fc8317c780a5c0b727df98e6479a03e0b4b5241cdaeeccc3338761eee4b941eb23e05585524f55eaa6c54a3ae34a61e7d011eec946154b3fcf076cbd264277a9539fa8582b4e7a9ff2c3711b0b264c9a3dec38ce4107b642f6ad8048a1c385c5142abcff1d7f6f67e498a92492a87e2ae744ed1547f88c2fa2a646c28ec165cce29617c61d1afd7604af5d8686ce9a93b528240b348833dc9f92f0daf303ba32be541382ddfac3d0c219362eceb14cb704093e37ec94cd2685cc8e9c9fe677af71d468eac18bff34191c411e4cbb0bb709c0215a0da0aa5187831ee54be450bf9533e5f9e8b8355cbece40b091daa5294bad242f5351661386570550d0c9e262a7b03ad7a910857e09009942eebcd43170effe1c40f05a91813ce95676b57897bc1e08266b1e2eefa5e71c2af8b54bcfbf042efe9967495c9cf042029939353fafe987c577191915cf0751cb71db6a8b8d2825e66489f34b741189ff06910e555792490467ba7f434f028dafc9c9c2caf0f5178d9a70e43012cc157a65c4f1a0555a23777a27bf069ba5abb4a2acc4e94c7f0400b44a2ebb88b092991c32c1aec48012ac5b6cda56f8c13a753c0aafb6531d9b137e015b9c0a63411227213723152f7902a07ef0425340b6d82349f2178ebbcdf671c21e7ba480235bc8e68a402044df6705479b2b9a6f5a6bf9208cfc7dc0eb5f54361d8fd938464707b4ceadbb51b2fce2145c612ced71cb9b40e852e2c705554f3a4ccc968b76ea4413c2c2b70d084017a40a43f754cfe2702255dda6f49d7077e7c3cb11ae6d796efb3334fbf372bce7175078e9437aaf81d9f2acb19c6a4633b93cef7b681d347f43673ddb9cc2c9e1c6b8617bdd8910267bef60737c065cca3a58c13f0152eb0d99ab0bc34c5cdcf13f37930522665e62ca22f2c9a8505c59e994b51298de99c310b5b05fb3d66cb37442eca52a8c3fdc899d723f38a1433519a2886ed97e713daa2b3c441c2d2b958748a987a7841183a22ec76e25b22c54ffb0b44b5d090341b672e2d4f80dcff6eccdb4e0970d2178daea22e184144d800802d98d32c60c1fa52da16df8490e79b52203b44431da7f1b792ef4c9a1ff236089cfc0aa4522d390f08ebc2a6453ecf1d651ecd7e5384302f2b90b24c4e9346bb9016a9e1727abe1d88977878f755b722bde435a4b2c5d64a22814d0fa9463bba5ce46167606866cee9720f6d2e7820d765042b9affd08512888514b120ae48ea478df4802b6562b475d0504f7883f7d88c927e392b6b1ea7c107d5509595011109dfe6361f9ed16e68c4e8bbe4aee980b4108a475a2e745a4af1fdb9012bdbd5ace05b641a39266c6681d16023deba07d63a43bea647887f93594ec0647c8a79835151f42b63ca26af4a09f494dd32df42356b8b1ec81425e911bb47bb01cb48d7a78b3f66ce5d60178bfb01d3c41c9324629fd8fc131bd4aa56584fef237b6bb62b15c739b8f2a6312a40fd6071638fd0667abeaf5bd92077b463c644f519bb8a04dc1241f739f10abcd9d603fb5bacd5e8f8f06e533b6890f6849775fd123d0fc598d0660405c897f3765e15f4f67ceda39fa0d944213e671e8a90953fc66909e1a3c8a6d3ffd2ce70c41d9044921657c9417f95820a544fc264125efdd431d017d603aa6f7a9da03a6e7f5dd4e69e9682ff3e338e24647fb02408132d61b1e4e8b0be49a1851bfa71f17d7f7f337dd57f9255f62ffd61e9b558cee63603a934a2ae10b9e7df322d8319c05ab0fc7100823d43ae25a1433f2a51bcc0b95049ff7b8db3477bfaff7f78b423e1db0939f5237790c0c04c1c7e41ffc0fafde82818e8bde129594adc63c0421560cf9d9c6e628faf75d3b2976e8a9185a7e664cb3c8a3e6c912663a0537fba5a7eabf77338e2af39ce62319617f183009f641a885a3282f7198fd25e432ed7d9cd347e5336b5270fd12ede32807d8a080b34172cf6f19605af24ac52905ca5f5901bbc73f17c8e0cd6199595c737571f915d25cc2dba60f40cb39cf0434fb7780a2511a250d510ef48cda83ed9943d078839f382b3c8498b3e62c7a4320c49097a3a84e109ecaff09e38e6bb64473ce55501e4d638aefa26b16a9454d25574d95cf33c8b2267a12d08ed26a5502074e8eb8bd3be1dbad12ed72b9f4708a34fd8c41b10906e41fef693c80f105a4075577c630f6ec40e697bae890c60f85d21449fe8acbcbb6bd4bc8c028005a5fbcd65cb7ea4f37bad765f87083293770b1fa33a5dc9df2b5ddbd8e188a53d68c8381afa10a23df35f3dc785cf8ca973b27874209834dd25d478d8ec4851f43f22995dc0195810839f8225458983edb1ee9e859248ce19f00d3545edfd1beb6fb62b32901c1659fcbb82d39213713997153999d42f2de016ac6a38feb9aead0fa747f08d29913caac6b7bcdb77b62c3e420efbff1cd0724c287b1236bb38008c6cd1bdf2049cf388a7a21aed8d3481fae924d60beb951d107f76898586717eb2de1da2e047a2260755728d366dc6804a559865cca9cb42527d66c4b131f71a6fa4d1e0f506b48da77cd65379057e5050b88465ba322e4c241ecca5bfa55bc9ca458e78f0389710edf8844ca96dbb329be32706125ec3149f667cb445be84b2de1c0bca999d7f225f29312731573a06c5252b44c7333254f92b46ab1c040149e4fdf1973be2133025e0e4ab5796bf058fb07a29b3d4f08f8b7fffb260c90b712c2c613400026d3f764300f9a05beb204d3341308c641b53bace6979db9cbdb1781987eaeed9180081d795971e43096152ccc1b5c2564dfe61ad4fe25c0099665321e2fc795288d1451460d85fc184dbe8828e1d801b350377b28107f2a6a6d44b003604850afc5121ad2d8addd899dea71a954b9b3cb909b1027c1355cfdb4a8372c8d5421a2a464e14d49aea86161a162aa4ff453b8f4f016b4b53a84ee51ce0170e7172b39d6870b5c4e0a8dfbe6ecb10b6f1a3d1177ffd9e792c06cad98b3adb019b2492784fc5e4327f09bcbeb06069510022f459efb425e2d6c67df2f0ff44b764a51a65e7bfcf26a723b1b6cac65d746156a39769d2a0dccaeeca2bbfe2741c42c44ad3624d10d2ce1bebc8b3ca8cf6d4e52259d595f6044b9c1a2bd08b19f44ea75d630635a87e8f2bf4c1ee6cd5514f7203e453950d16e84b0da5107a0ae4bed67f2c81ee91a853b7c2f967a483b5deb12891db0be7553448ebdbea36d37431c33eab85a7e0265f4546b05d59a86733111e3d2a49b3b1c5ace33a6609266b6d74f50a793d633790b04fe5da6b90273b04c249cad06e8ec19c1df3b844776d7efb9395ed151dd394c0f879f7306e45691008b438684f16b09742f0b4ba4213b7ec085668273758a267560e523ba8ba699e14ee6cd95a1633710b8d74cf2dc0c86ff17e26eb508fc885c91f4baf006f362fd1c10574fb47aa74cd55552747f9ec2cccd21822210f08b783bb7cce6d723b8f7ae55f458dcf0318fa674f848c2ae4d97314c01f4da09e0f9300b657f857419daaedc9ea9ebec3e6660b6846d5a7944bf0da820e7e5c93dc7c12177520ca3da6e6ba7c1f8b213a455401d8d6173e392e263e44a77f772716769ec326628bd8b3628942b0505c4c7e3fc6abbcbe0b1d06607fb0b135a706731e4422043276441a797cce7908416dddedf2b761a315047dd34f0a44a8daccc611c0476a21daa67c8f137e46b74a85dbcc9152dc69d7d87618d0e3d590e53081d4fbfd61360ef718782ad7696744625b0a17eae873fb740f872cf667ad76ee3bd157b472ae18d2c87a4fa98268bddbc4c08bd91eea2650fb8f87ab1c0e2671e603bbb9a064cc18d24ff9bf2da02e546bb1aa812f85a660b9e4c07d295e89b3960f1d121ca367b7004eaaec8c03186d3de02998509769544e040a4625d14ea4b6f33778920c33f97d9ebd8b70a41c7c25a047a95bea62a0fa9e9504528e7451f4ba7b3aeeab7668da320e5245e2e706ae4de69c848934e98e2d3a831f83b1d98b4dda2381e895541534b510b459929c0f2104818a4444fd260fdd3114b799bb38ed5c9f729ecba9cb7d5685983048e8e3837d8c2ce3942320de1b5fe0e03c3e692cae43bfd1bdabcca331811339b52874978c861b426631273b20996201e8277a3d5d519f0bf86833f1a8e54445bf67cac3a38dbcc6a09080efd377b9ed6b7d4c1cfe60414d3e193d439febdd33ec65c74c78dc6d30b8394edbd7a838c6a20ce5cdb8c120e298ee29ff82eedc3587ee6233828a92e9f81955aec661841618136b029315b3fef4d3172498709b925112f363e2b2fd416a731f7ddd2f16915fafb82dd53c335a8d63be30dc8f19f41f29f77a49290fb8259c2d1ddd52969dde072e98aaa70e502045c59fcf793c77492f1c798902902610010f70dd5d7881528950f119a02645f60a6b56698efab72174c75fcb0a4243b4980d3913db8e6f5e3391b6ba1a09c75c0ea048011fcec9c28312d0d58ca137779ab7e49e035c2320aad5d2306ea8cf436834253278568648b23c1b7ddef1ce39ecd7e12653fb90456528dc62c9c68a78ac16756b61e99a114f42d3bfe4f3d0673b62999a8172d791689535110332b3836469d0e860e2bc4d35ba61970cd0ff23109c0feb40d1b6249ec77a15b2e1c7457c9e33f2be14af8b0621edf4d904127072da424564826d7117d8e32c6f5bd992ae25c3171f3c4c3c138f07bec1d22b57bf7771211a1e2cad8580c91310efc1d6b07918b4dcf58d4f105aa48efc535582b16a4625dd98158469133ab2a68b0706c218c93185d997993648f8d06d66714096334d54a9f6868c8116a3d5c85dab5a4fbc228453c2510864c1d2fe81422eb52fd388c483f7a2c3a0a0a07f2c70152f57d3b45b4dc394a07c38935ead75b880e38a927a83b08c7743d7bf2921fbaa017292227383c6139cc023dc7bf48eef38b9f02d92e1a91b738594b8e861dfa5c3df2be9b2a72ce51c92d7b489d772c0755f7d61491f0b62c6b82786bcad1cb385cb7fa7f969da2b8c5db5743c296869ea3897653648af75b01e8e3c9379dbb20152b2a6c54d55a9af416664edcb123a35cd747761ac2740064d41eb2fb540f7c37cafa6ee5341ab20779d48474092ffa03fa75a9fa804a25720e368a14334d2572bfaaab8ea54978a5d82fa4e45d419980977bad6728c9d30a749becf6a7a8885f29130d0457a0ad3310b759851b28a2e942b6e26dacb785fbc9bcc1afc35f0a2cb50bb3f77996940f4686004626c56fffc1dfd4d0fd536cc6ef1a2f3528f0b3a6be665909df3b201db747bbff146ad835ed6bc24eabe71aa3fcc610ce3ea0bb13293effc4f2f18702f0ea857e4671312f380600d7ef5c6a6b2877b4dff968e02bdf1c1d03c37d9e11f85ef8f06a4346698c20205a937716dce641a4cd01077360e55f144d193662bd09321fee955e370ff326c62023ce5469cae59dd94162726fde7191557b3e410d193adc591f0707c0c556455e3e613416c89d26ffd10a0fbd1c7d9215570606487391b069c5d5611d27569c0a1d650e67b7b4b18c66fc8ebcd889c5b23ea319f3b16e1121bc8b72f551fa7f48f09315320e7d98c77400529a11ea94dd68e9f7dd10292bfcd5f6a6f2372fab1882e7c55bf5902192154aca0845c857635761cd17ebcdcbc3ae3fa18cb971561c4091a3952996e7023f5f9fff92569ab58f058dabe2ef681c85fd00dd78b60f63c32c74903bfd7f0c5f94065a4d87ef50c6cc2b8dd19d154ae541a1afe2adcf93ffaf4d99d20f8e3545833bc78909525422b5f77683f0d297076f19687081541a0ebd2bd8b5db729cd79c21d8cdbadfe640bc764657d57c3a90e5fa506e8ac1f7812dbfae616e9611c94692ecc8fe8bfd207f8b72ebfb3e5fc0716c331909f6df684ade7f456b90d7b1b55f801213e1e6a26906ba0c99c170b4e5a3b78b480ca3a23043882bc1066b1cc86718cda270a8e17e820d8e0a42d99ba80ac621622dd24fcc21964006d39d17182cceb0910972dc7651bf2d85711410339832ddcee8066635a1f232efe7d6aec67de1230939d1abaaae0000907adb4130370845ebdc61ed449188cdef19d0b21a1f852a595ed34f34c4970429e83da880b4b0093eba55b81f617f0edb900cb30ce6f3116051cd39e1de913d4fbafc182702eec3b46c2b1b026a0419115ff57e51e1cf767686675a5ef02bc1c24ff0f60f9741f9506f20d895860fab69c2df7673988a1c8a9ea470f35104db5e172ae71710f7a01c8ed2b1a74649cf9cd32774f1eb98e89ac8b168ac2b077fd58af40ef34ad41f0f8a873bcf1f4da053c547e7112d584306ddcee98cc4849ab5a9e8b7a1b78e798e8e4e0c3b2b310e1acad634d74ef4dc36d53565925d089fcc6fc0449309e0d534a461095207a6497ac75f21c983cb3c0a45d24f0740b893b52daebfccb6ec312bcbba50fd913e195bff25c6780244d0e15fb85f01b85d6c9ef7ec14dac0eb4dfdd320555a9cc76ba608130669522ee015e7828fa6b22aac5611ed2cd101db57a2a98e631052b48e2a94a7fc9547ef928919918b14fb09f824c3a14ea93753b3270b53ea4c2a993c51c8172400aed0058298fe4a06e10206b60530df7b45189b1ecb84788b4d311aed84e23c845fdb8c373f6fdecc80f4ab6d23fd282c76a59fec52aceff0798458da6d6b02c2d0b5ade52b33e59ea47bded95a2f1d8a9fe1d13993b67f01917353e12ef164adf5bd69a55e93f14a8502bbebd2a6970e56b14d5110da7b99777150494eae634f58e72f448724a928e31f9b300705b0f4a886a2fffc66ec0a040db7ebf86c94d6059e4a761b14c1888ee55ed795ec4cd416a65f3fbf2be6975f4c251415fd322cfbca85edc2947186948310e12f65bc69c48322129cdb2243f5413943b0fcee468833efd1a83c2568016f04f2ead224239e02777bc7ef2e2537d8cdb81795f740663dd748486fd7e1ee093a10e6de063c2c0afd1a7881911f2a0847bf726e63c17df7407ff3bc717d6f6136795792daf5351d159bef08947dc70604054cec71a9edc3ddcf87c0727c03780783e3000e6295440a2345f170b4afb6e40e851b568b025cec5f1ed1e2a056610d869626820a6214d40ed0f26148e87ec6c5b7c629040de3c9818544051f82b8c1b722f482039ab8828d59300c434a07471c7c5c549861390d03d0978e09f57a8f0e2367f25390876de7e90749f9a9296a2b9e66bc8861fb2830308e729cd4ec87db918297cba643ee3cb0ba4f9511d7b834168921cfca6f89dc7b6fb9b7dc5b4a29a50c570835089c094e7d3281e535af51bef36c0938df7966a24975cdeb0e41b7ae8939f34cb061a2cba37428535b14afa7bee3d4a7add86df65cd4ad96f210f5d7f39179ec74a84e7a3d3ed0f381e75c3bdee3a04742e6be7ae8b927bbcff3e1799ee7437368769e8bc73d0733eb99a691504e5d869e8fec7687c7ce0e37b714a57b76887ace3f8d643d7e0af58147aa8ef2c08ba8e1072ab6208112545a3102818ebd1ff735cf30061d779df47af0f8d0a40e5a476d1e1d6e1bf5e91161df7c80e03b0fb7e740f0d5b3b7c3edad5724ea16048f75683d1e1b8947abbcea1aee69a41a1bca339d7940ac6b5e8fead9add7a3fa059dd357af5ca0f738e83d8eaf5779a8bceace3d8d943912e8de75ceb7cd2510cdab4f5a2d52adde79b657aadd43e93f5ffde071d0791ccc9c477799f7e8ccbb6f7a8fe699d56db8d5d946eadc771cf480a47c88e2daf5e8cea30fa523363c498c0890ad216a435fa4cee3ef68a4cef10e9a2c89da422b57e7a0770eeeadf3360494bc9c00012522252fa0e7c36d686bd217f9b879d527fce61c87b7ce89643f444bfaeb6057648805bf79797cc25f6e6f4a7ff197c3bb216f1f61619c9eaa26ca05d7ae2a7258e5744a6365408e11b604d3d7984fe0e6234c0937bfe3234c09a7c7608482e9e7d24f9feea22287307584d1e928c8d411df5f892b1faa648c6070742d51c8aaac3af261c8fc942a1c2e2ab2ec640f58750516a6c9ce9b6fcdcf09707c843d51438e34a9311a7c848181a1823476d454f181e99c82f8aa38d1c28e9c6e0c1b652af0b2fa086ba2ca83b0269a54e0c2028caa9e1a3ca91d1d1b5fa60447ef52f1e7fcf8e3d3a5264be948d4c973a5c994e2d93dfd10ed4bd0f140af84ec479067be84eee508f2f5433678e9af9794defdb8e24ea75edb3c9d9352971579ba6440a506884952495269050e92413801a2cae3b9b7fc749fb04bd5a8a3915a77c4169a9feea329f52c553d147e0641e5a7dcb1aa8288fd749f1fbaab12d8022c5d4699402c5136958c75cab468572e942dcb8b6383535a629df71223bd395b3e392288c2804b0d0076717235030775a380fd70e64654063f4f87f34222c9bbc60f3e781f613f4881fd0085524aab85fdc0b4b4dfe038b174e3fa9223aca9cdc39aa0fc7c693b589287c82741e9edee60491e42bd8325d9ea21d63b58927bbcf422cf19679cb1832519024a6f41c42189a84ebbb71e614d4c1fdeefe28fadf5abd71c6076efb3f86a1ebb6d4351b794cefa28cdc218d4daec409dbd673f6b192fa0d62b987af3cde3e16d1bb77115d415d4f403f57c4fd7c902b5ace17660acae28996e7a6a1dcd75f49d409b7b3e89d4efa6cf2652bff3eab936e836fda00bb7e9fa95ab97c69cad911f5d3864ce25fe8121873f40d5c31cf5eae0ac739c7ccea9c783cba806540326bf3e9d57ff993a42ec59d6798e3d4a277510c9f46f2bbda743ce33bf9bd2632db33c27b5901874320d8e3fdacf63cfbe6b7da7dba1bf6b861ce278eb9be3983a74503a1e0a11b29e818e46e96e47c729b153bfdd0e7d88621d3fbcde65f69b330c1c7f622844e8a56b544af79e3e032f2a3979cf853ee4e0bd8dd43992e63714aa61b74321893d46df228dfeac8f3bec5cfb9fbb8b350c96366f5dc3a0f5f8a387f0e0fc0ed90067a4ed503e0f6e57ea5ebe82579af21fbd1e110524287dad68defaca45dd3add5f9e73f79c472371cee33a3ae45c070b99b71adef1aa95de06f6182fe8fc6aaa3badc30ac42aa5341d4a7cb556bdd3dcd53aae5dcfc7f58c7ce6f4d147569e44b636cfc755ddeb2ad0afb6613d2076f380704e37d63afc833ac6d3f3e13a1ee3051e90caf9f5bb572eac0dd10a7ce558c7dfbcce63e62b1f9ad7f371bdaa34128fc7eff4082aaf81dd860e3fafaed24038cf5eb7e743f407e73b5e43fb88cff94a5f24cf773ca5c39d1d2abdb63da1ac4325a46f735ed5abea1aaeb57617d7cef17522d9e31170571d5f1c97847bf1d649af87b6b975cd3ad59d46d25c8b59d3d24ba75b9bac211a26ad7a44ffa169bd21262c1941e1f531b2628c386cf522e9750f49fa904ab7313b2934597d7a782fb51fbbd770b5577325d00f4d78223a14a2b21e0f6ebb95be7671e160ea1892efa2e12794326a598644c5b3eb30fee2e71f96b873afdba6949c7bd8c97f38cf351fe938eecb9d7bc85446993b4250e3ea72e593ede330875d5c7274b90504f59d409eb7551d0fcc6922f67e7d6d1f2d4d54ce7f9d72bc66c07c7082f9b025460df3c18a0f502a92aac6d7713743f2231d603fba51ec5d50b2bc19f081e93befca780aebc1cd534a29fdb13cec7651c9a18a7abd2d2ca1f2d1a6a66929970d59e51382c68120d201f2351761ea90af391113b4d76c82f5b0e5238c872f9f808f301e5cf89cb259add32b09729caccca9dc52b2d19105a403a4d421ddba7579439e1f613c38f9ea7446c171c6fa645d3ce4a8452db376d614585b9fac9e16058c71f43c0bc6d3a31ea29d91de0fedad9a900ed15e9ef051ab91aea5161283e8d3a58ed3e311a509536aa926ea1a6315a376384ece7a4cfacc6dec3edb91fae8d3edf0e7b31de2f86c8741f7e5ab9565599605cd2ccbaabb62c861c5b2b34a9dfb98deb9d25f1d56acbb4c2b7d2624c76fd64a5b4980a5a6d1a17937ffb99366d323629dfc67ce58ab8c3646a54ddaa588baf2c4c3cb4a963989845996e9137864da13a51e3d4bbdee2831c87c6a36b5a6406230bdfadc115b26d4a7c99a3fee675e9f4225bb87689f65b30b95aa12d66d4cbe6819d70d75ba6e20528954d8f5faa383c6af9c166aa4a75a76d9d5768fea7496911e0e2965c8ca6475e560f4c372a1f774a7c34826874141414141dc0ef3b643d5dda1b3de5a60d6eab1c6eb3a22fb4cd6cfcb1d3a69d5fcfce0d07e7e58f7b31c069da9659cf8b864c8d765e675fb54c92bf95ac9a5c9f2f139ed9c7eb78ff3d02a9ed57e5045ae4e3d4bb964c8e1ad53b22c676ff330493729683f55ce634bb662ab84cc696c693a944c8fd401eabee9d8aa63449961d06899618b2868aa582ddcbcf51cd6cff8f020b664f420eea426a39d245bd235bf1dd04d013a9d49b6a86b7e34a76f7b29c9062dea4c4314c85a8f5a065120eb442c64eade74a42535c92c5297d1a94fb77356a76c233aa2691a114eb66012b341891f340e2848a30c27416401fb6206ea3971c9c9420d1a255bcc8182e90ee92d3c75112d7a1e4cadb9f44898406c699b2351b2414bf36d73249a4fade44d40a975b79dd464a4f9d6d25c7a464b2ba3e91ec4d6740aac3a903efd48eea6a3a36c271d91adccb9cd245b99cb3a6b75a98328d0ac55f3ea52c7167d2c67ed6cd649ef83d8ba8ea5cda6466b94f7b3486411cd91685bc906ad229923c9b6920d5ab335678d0253f3044b03876889cb0a4230f5b0e4c715a71219f13ec2b2b0220b3040b226fddefbd18bf1c94f9f9c8bf09bdfaa692235942e357d6f100882177bb62df19773a9ef0e833c0fac518dba9e30ce9e75912623946710d429d26404fae7772729b58c96be1d29a0f21ed7fc5ec7285d84a6bc08e83b8ef2241dcfde135b1fe89f53807acf2eb253a467e9a7f7e8223b457afc73e9f5e826b98f769ceeab8be838b835bd79a6278f4b8138af9a9b70d8fcac9ed152de459a2e4a833b49a985f2ab8d50df077ee0f48c96be9dd464043ab893644b2e6547b908b33ae820f4dc7ba6ca4fd7ce98f9017c849dd1f2d2e371f43998a4e3dfcef611e87427ed38b82f05bad3b595118fc73faae129efd1557f6084c57e543f778d9143216e0394ceba488f67c7778742543dbaa9f3ac8b64e7d9ae0e5d1537e99ae6b26d7aa78f509ee234ce555293357ce703239aa6f3ec224d47d9515e64c7753cb58b6447edecd5d5d92b0d49deabbb57d88f8e507ba5ed15de1d805e9d024ee505c087378b261f1d737e3f9d397d043aca37dd41d3dd479fe79df47952a49a4b07634b8b2da76de618be5c90af1b76103855a4b67aed1c3b0899b641881428e376a4404654499b730a32b0b739e89b7f8e37ade39fee76bcd3f1ce330f08e8db0ab57d9fce5ea17cf6d1e63776e7dfe63b3acc1edd73d4a637cf87e6b63f1d077dd36190a2cfc31cdebd42adb283b0721f0701007ec3e3070957a8bdcabb8395fbf891cf1100b608dff98d2dc2839d6fd9b3cd735087a0ebec0fba64707bbe6d24cf51b9d321e87d5d8731eefc73fc61ec5fc69d83fe619c71f7e1cebfeffbbe8f0cd0e583de752ebdeb400c7e9f77dd0ae5abaffbbacf517a887edaf32e8320083aa83f0902082008ee50fae81bbed200b8e1473e7e631fad4070d5c10df7f1a31b3b52209fedf9d16a0ba9e67726f607f808c3e2ca6310cfe8350209f2995b5a6f90ba43212e44f53354fa39ab74e95c62c89758b080f2d7f11560ae78bdfc544882d2f3b8a75a798fd7a80029fb86b3def14e834f2f7d3b6346cc6730567c79ea1d7670c7c10c44c7519ebb6e67ffd0d971b2b2a33ec73a44797408ac5c27ebcfa31701b9ed0fbae4ec9dd7a21ddf3ceb30c867cfbca2cec1ec31ebf8b6c31510947f9b833b5ce9ec1fa81d27ebdb9bc70ff2a0e710e51907f257bee970f39dfd4197bc6d21aaff1c04b2f26f23ad5c6723d9406921aadfb610d5abbcdba110d5dbf0e815e8b07e0da79e4bfeb0b1eb64a9b65bdf76d8b3e364d5f03a5935c0227087f2798a78dc731e50da6ed39e4baf28ccac3084ffdc7a45f43de91585a067ef367d9e1d1679cfad5baf68bee75b11e85984ff76689d087d2fac9395daa1d27b3ba553de79b74322b4f3ce394d44fe46a4fee62e31f2ca253fbbfcece046c21374f918097b3fb8cf170ba6c7f111768599bf1eb5f46bc6e9afe34e87411edcd1d9d961be911f7494fbe8db39ca73b004f9d9abf7637e76e97787d8f30724cecfdb418df24e53ef07e8a8f99d9e9ef5f41cdcaac9f27cfeb791b0cb6e0b513dded763be615018e4a3578f8715a2fa12e40f9ef7486005152ba058e10466c56b090909ab42cd478f9fab8b2e7298aace04154d9efaac585a4b698d9652af35d65a6b8c34da1ae3a4b59bb39b2c8981f428299d74ab71c63867adb5cef8319bf407f56c73d5bb4a69ac91d61a6bad35466b87d0b7d3baa8ef9f7b4faf3b4a4c254a29a58bfa0443e618638c31c61863940e901f6747271551a40342e944ea87998744ee6bee72f3995d7a3dceeb91cba6ceb6bd72d559a70eead2ed8ada3a93aae6994bcd5a5f65765aa9636ade4eeada9529c03ce75d9e3a34cf324dcb344dd332cd87f5eab39399a669f53bf9f8c796d1ccc480deda592ef342ce916a176eae3419cf5a6bd5f5533d9a567d1804dfa5d48585391f2a7579bd9e041ab91dd6d7ebb53dc212afaf4e8413f3caa9a76e5e61747a7ddd352406342531a01ecbf8ca9372a538aff2539a6b3aeba478b8b89d4ed3ae2d72cf5333b2cb78e349d5c05c8a27bf2c27bd9ae995fc211aebf5155e6d9caf2c9765b26655e37e6835168b6179e90151eae2e4f5242879c9f27aceabd7836e797dcdf2faba875037afe7f6d7490ca816599ad1a15b447575ee50cdad0b9bef72a6e59b73de329773c6d9cb5dfe8ebe50031fde6903acb5725ce52ae636cf3c209687cc21739e7abaa7ccb22c73755e7df378647b0a3858d5c5a9a366d5eeb0820fba84584d46c2dbd5adbaaae757cd358dd361e6dc2a1b425f0b57f8fa6a5bd9eb2b796bd5f1b9a4afb5f3a149bf765c8ffdd8cc630f398c77c879845181e5f1dee6d77da98e8229a5af74e5649aa24b0dad53bdb232dc3cbc1e6a1e663e9dead5b67b70efabbb7b702f7da5ed1edccb7801f7f47f88da212ebaeb7e810c98677d848d71faa8836386ea26aba63c8f3fac789178ea170a364fbd0bbb32d9a987048a259ea6be36c1049cb75ebbcde3d7acdee93bd3f2c53c3d751e27cf33a9fc8ef70499ad74429163cc08950f6bad633ae001218278e9f14a5709118411506a48410634504c0f8868822a528c11e28527c050d18a1e83d0988646fb61ce171ba899bb831c27738698d3036c0e94394c14c7a972b6904326f3786459a65d989c2f72788854a49623c3a7262b4a0ca2c7f0135a2a4fa7acd25fafd7cba915a5474f8aa13b2a156e8742db0e833ed776c8f2b25db798a06f47969779e8aa4a85ee984242412c96ab54934aa5f254a935692c3620be94fefaa4a6599dda974c92afd61005a24e89689fadb4cf36128fb987c4393fbd0425252f01bb43f96ad1372fbd6a3f5df1cdcf0ac8711259514705e4bc1059f1c3e8c4530fe5124fbdea0fa8c8f1cdc70f23144fbf587a03660e0c67b8b0448b7211628d98d80e3d84e1d2a24574498108da8c79f2a1455d457728e960258e151ddcb401438c1675a73b62144a9e40814618342089a2456b3052450b489479139bd2a21e4477587084194378a922091a6b5ad48a27217268a1063748bc69511fa23b628bca9d17081c671742445d4ca955913539297cf863648cd624e7c87f65448929c100cb0287129ca0882f2ee010660c228c48a20c1173e030b1000b166c68886920c90c492c4901142796108d0007296a96b819420469ac711fd27c58c48ea82c682f1375d44ae78f20bf01516a2253c7f4307aa4734697932a89b3c4cf8f17b5fe7ca186c279b270cab83da481530507074de7f190c6563acbc411228e9527acc49142cbc4ee0e69cac479c559210e93130b5ec627c779fdf4d48f77c5ea1d511046e18418497c91a20b2ee03861e50338616e90228831395401070927d240a34c1a66ee0e69e0040107cb8cba8218134f624cac105b22cea7b0a83b9bb1959a8968bc114144838ab75688a8898bc61734b2f040c444126fae68395c3766de3c7113070c19148e78018c2fda30bdf93663886932022fe6fcb046078733a4b09d1b306758f1c4142d69a66cb1821671b0a0d104196c98608121093766bc1b9438a3ca19469c21049921b4283a1f6167b4f03d684499809532348031c5112d2e2000a6268c2dbce042a5091d32152e42668841b98c600d1919b85471821adc2451f20225892e496498e10a29cc80e24dd1c2c58c2e66446186139d53a5617289b76ab0329680b5814534965428e2862f62d0200756061a00f0a43481a1f0c597248e2041145a6e19282823f60411424243dc2b644311657c710a22f6e68d0d3e60505922a5e989112978513e64bd74e9d5f0d2a3f42b5d25a51242082124845008491c298119166658a18a0cbef08105187038e20ba6a730d913991af64989fbd485ab639e80c06da458f3d48346431b2e3d9daacba99c520509e510ea523e6d98a08842861535c04046096c80818c209afcc050c9d8818ad7d43dd19e62e09ea87033a81c831bd818d9c204b1a614e29a2c48a85892040e61504183c3208007656b9ac6bd10eb6898210ec258228c299ed8c040c612c7065fb9c20c232d40818e602246914116c0c70b3ee6f80204e0234b7ff4209fb742461ec40b6293b5791824cf58210f62038ca403241c89814fcf05a83957ef76586378873e67e887728e84333df5a19c037e28cf781fca397687f4e5fc9c93449ef3d3e596cc04372cba43d5674ec50256f5310f6152e9e47d6202397979c14a991c7a906203302d7828a3430a6d584881173d3258a1f1c98a262728399c09d3e6470530a23882cc0d2a9c11c68b27862b50a2842103a70997265f5290614c162c483c39a3a54cf660c893076badb5d65a2218b2b59d76660433b4a0448c2f28b05bc680e2081ea6c072a6150695309abc27b793a206229e5c41030aceb442d55b2b98b042c314629894d1a515060c328c18de5aef85b7d612c59063ca7bacb06913e6d49924c4e4bc13770c4599adb24f949c52f964b073f090bb8f303664887ac8df47181b259ee84ad63ec2d878f93067150e962a957d7e38c82a6743c4872c31340c2ce79c97ee88b95a5a83881066305e309dc8872c3d046d04aa5f49781959f5bead96b66aa55a5c1bd8dce0260a09ddcc563a6de8f90863934298284548288ec185044ec230f1448d0a5b98625872a50c297480e2e43dd1792e10514416304a46107b938291238660b3d4851723b6d42e758e79f25a0a72e0b93670b0e6e9b34a4c96860d295802c30529b0308c784d238ac1863567d8c061638613d9b0a6024a608982c9182e2824d152ca22839133495cc1a586245ad355412fb910128272af10d10c3f3f32d4fae3b540f484e8c90f910b423183ad71827df144adb03562bed65a2bd10b77f511f645105f60099a4fb31a559fee192d49df7cd541b629d0556fd541b6ad1f59eb5ce64cb2657d73aa65cb6aadaa8d740831354314e8fad0246281f3200a746975ea95bb9546a739bd4a8f2d9ab9f54bd5e0f8535d524e635da4e988db514bceab1f715ea773beeda3cee94e92deb9e7dfdc395320cd1d44f538ca7bdc939a8e6af874291dfb91748c5dfab68f54aa6d2477521005d21ce53d1ba5b94c9a3bc92990e63536d59dcbcd93b257dff611f56e2749271448933b6bdc9e3b49beb693297792e733e9f34881eedcd1743cb6a4b6c393e2f1d8925a6a88561e9dd4649442f98e2e829d731d5da4e9086f49c58b7c5006b52305ca9ae61f1891b322494d1ec496f5cc638bdb45ac47cdab839afaa763cbeba64bf742cd17afc771c6f959710ac89675a253230253369e6347f279e7d65b75e039f623efe8db423ee88e4a2f7558a78ff00752f5cdb98d243df3ccfbc16939e7397a9dc8fc6d6790a3d61887d039994c59160b7b1ef6e855aae4d775b4235221872c16abfb3ea2263947cda1410635003560f256cea09ef39f779af7ed4891743bc76d6e52607cb50c4c9a2e9f656a3d4b9a5987499f1d671d2ab499d7c33ad2ca55fdf3ea9f6747f9d448791399ffb9e756237d1edfbb4e64864426a8e3d440c781643e43ead933d7d14cded2f14f8749fff9d4a15292063a3b29ce05584fd2f113e25c00cae35cc00724fb5a1885f2eb9d9207a43a2a7b75cdebe179de9d5b0dfad41f52e79b7b7ae5aa5dd28744e6d32c93568b3686e0b431c0d2980171a5568772ceb891ac4bef87d2cbea75bec20e7f847521c6c9a8c809d5eaeaf4ba8aee30c2b5b4fdaa6ee6886b59affac5b564b68b9c106f3443ed7ecd49c76ca9ce85181e484264d4d269979a3ac21f9f8cc345e05edb1e904e7d721ee03e4aa1189a9f9e632309a12e6475d0d4313d47063fb707aa164daf8ffb8b76459b52830e94d6907d8475318396c36baea189bd8d8fb02e5e5cbc89e29a438402d10b0e1c22d605c7f533a5cad70646cecfb14bec494c1bb43a9f3ba9e968fab7933e9f47d2e74eaa3b692791ad6ebac49c5e5d576ac9175dddadd48a1448033d040a54dd933c4f6afa76d2e7dbb7938c2850f56d9f0957a65c20c5c94d9229d2a5e40a2ccd9b335e78934525a82002092466de7021442bcb9c2cf9cc937345b610ab90628a3c430a1253e23831458a04134d90830e535e53b250401a4152cc4c29228ec932650052a66821d74434ce4833229b23809003c31429924a2c634a97292829d32849166301cc8c561821f114728cadc0f4a834618e3115dc7c74ef3df933632a2cc59abc900685c55634860a48c4548042a8688cab02102a54114368882e7260d852e0e45ed182164513274aa0c296244c8050a28649d3929a18131b6aad456a543982aefd186302e5c320ac432c852d5200b324968219cd7be3051325bff33196421ba13454fc146d219441996ce3636c89171c2cfc31b644cb872c99468dd647e561d040022742a8b0254b09bc2f9a28824a0d66e2201147878985ce732384e6e98c0c0d0a3635d73b038df631b6a4c9e9d6186d8e20a12ed46031440b478a283384078028c2cb9614b668fa218c1dd379660cf11589cefb185b42650517624b8e3019a3052ed0acc045fe186322f3ddc718d31239e854b1798929598a257121a6e449111a9e8f31a61e3efb1863aae295e1b6888b1b2c530d6f634c528ad04429a594524a4d4a29a594524aada34ae06aad95d24a9b655266d2da5ac29d5a5213e01c387c52d64dad9a46a94629a59452ed6ad56dcd649b2a19ca4b974c1428ec389f1e242936a0fa740bd01dd86718dd681edbe8ed5ea754d3e48b6a6d67b6c62228f2119d32e0f813cee873871c662046c76f78060ff871eae33400db6974f20ac43c21e439e7dcc7397523ba43ab9cbad4121bb0e3d439a03b809c7a087407cba99b407710c0e900e495a9636345271a4a2ceea15be0a1d08712cae69a16222444e8b16f5b2e417ba4ac08965553870da78e6de850beb0f50a4229a6884cbe1c101949adeaacb3b143bb8968afedac5369961eb280085b4a27c9d78e4e16b9849667da4837120e0134073a0401fc68498502490f80965b2890f42d5d7ba44016dcf0b9f2d2574f38d4fcf8a438981c983a3226513401c6c78f8eb34c4a39e79c734a4d66b34adebc02f7f1508ac932d63975d9e686d3cca51ac9e6a97390edcc8ba0c8210e1c2111ede5936433592f6d424e9a2ce9d2372da14c96f4aba59bc9823359d26f4826e944ba7919ddda2c9b73ce3967b62b9c972e259ba228f21ce1a798acd433412762121b0c4c20e941a6c097ee586ad23c8c668ee68ea309c4010592ee814243fe75ba4ed6c7c96be5f3ecdb9eb6b186102f907e0255c273522175ccd8b9e72a11620392e205d2439610063a5fe9eb3e3491b418fb1b72f0a13cce1d3ebec3737b3cd21d007015e819e8e19d40aa7d43c709d4b36be838593c3b54fdddd961fdeb413a3bf4f98bda71b2baeae9f0db4284aea7bb6d34592bed928cf409347d1689d134362f7b66063313c56499d164d51863bcf129c864511c705413c9587b79443558d33eb05b1ddd148dc99ca379ebd7359d3a435b984eb4ac2896c33b75d03a3fe8928ba4c8a174b2f9ac6f47a8dc7463c2171c5a78dd973aa6e2042a419b4ea240aab5d64a3d20f448f76a38e60e94671e33576599b3b20ca5e304ba38febad769d5645dc7fa47df09743d84c7126f22f6b1739b355997db3e59f36e4ddbd7d2dd512c7009f69168c7c56d0f4d8c31c618eb30e8ef646d9bedacd78bf1dda13fce792b0a933d68eab89f4f17ca204f16fe743759d8b147ec9d754e677b7735092a43e64a7767ae599bb9cd9c4a0ce68f2b8b9cc8954791135d77efbd40cb9c522f587afc4152e5636c09cb87e047cff13176e48c8fde8fecf702721cc23986c839af1590807d337bb3d4645d0fafdbdbdd7bef66b78d007712d4c45a6badf52226d9c77f5838b24931086a820f8024cf8fb1244e5e7afc36f84933c7318644cb4b1caf8ce3679571aaa6ff8c209ffab6225973cc8cb2cb54fa9a7775f5509a3d2a9722cfa581af4e75b89fd2e9d3358f47dd3bb7802fc0912f36409ece15e0880ff15b1c2fb0452964fcd6ba1106acd3492b5046529424b308706f7640c83dddc145202e5e80a3a80439c4f1d47104e510ca600079ba2402f7902f804c9de7de9c553f5d70f500e4a5264b8b98f27430b887bcdbce9a67ab797dbb77facf25826bd6e56adf8aa6f3f455b655b40849b6fbfacc0247a969d62bcab24ed3b43b71c0315ed405aa8099acf85decc8d3cb2ffa2187f9bd266247d4481224a59101597a8c1d51f35272c16e010024e823bee6f1c7f3215ff38a5a59aff1367e65b794725bb92eefbe91979a668c3e34d7e0ed9389f02ac71bb5d65a6badd57fa4d711e44b973ea59cb4822025b887fce899d3386de4a5a66a7da969ee24deeae60232d7f465ca34fe642a6055f621bf2747adc60f4fea003b3af74615ea68c60834773e00f879397acc709763c55c5e6a9aaec2716a30fdcebd9d202503f0cdb1e22ccb3c4f56e6a14a173549c9afeeb34eaa65eb4b4dd47d26c11df5e83e3f9345dd27ab88490e7d9e5297d3ebdc56321f9ab6ee2c0719c1455eb2cd3bb887fc9a698e35c9eb630cc91312279b79368bb2e4e97604f9999f7162c2e6ad683e34a58e31245a3e7ada9e79a989bae64333cb8f626203a20e89cadc7ee671b0cc1fce4b4d7227f1d69d0b98bed4143d89b79aa4471d73ce39679c3fb7e7a3d24c4a2d947e17a150d444deb98c7c21060421004865e36eb1c678c154b27236812595a2da513aa79c73e66a5fee1b671938ced891d8c79891337f808f312359fe5e23997a982a613ef5e9fda835697a406464d910505a696a9ef09407d56145fa943e347f969aa427f168a5b6b8ce4dadb5b6084c0ebb9f4560e8f4a2e8480e53d54a3ba668299331c73a6be6144f3ba7239d80688e5012a233a2d3a55acc729752d2d2c598264ab8a0f202194a2ef0d0c51364ecc0041a3e785b82a24c771b7efabd1f63469e04259155bb199d48f4408394131c41860b4dad50f54656c876e88e38b3c60c21b0d032822a53b4543ed4c8116cadc734de7abd73dece34574b7d8ca190460ab637568dc65e4eb0394f28f5c0248d3170b21013c3a2049fc5504042005a945690c28c355f6448c20a238a5e417cf73186c20e643045e18954218ca1b0f4d1bf8fb1579b975e27d39cd3f3212fd53ee20f9173648cbdd0c45e62ca604ab59deca8c4ed74953d0c992a1a091080008314002020100a070422a158401e51b5b0ed0114000b91aa3e6a4614899220875114045110429031841062003004110308ddd4196848475aa04346e6d0a02964d2416e3a48eaa3114b3c332d0dd54e4a0b82d4a039c7203b236eea7808c2671cb37707897ab4dc48c0b74604e8cbd347b869126d39ad4c9a25cadc3a4a3fb20bba712915c5907369a399cc0cc7373a76ef0e92f469dc5d318d0f0d3a25ee1cebe928373888d04b0bb1c52c19694b0adce2787a7718d28d26e89291b969a01533ede0160ebde2408f8e6fe7a0671cebe978a3e31e1d434f0749b7344e5f46e2a4811e71996a24ba2422d6e671234442c75e2db46233694b1097cb230831c83e8bdae9b1a3e5b45c236432644d99a8c61cfcb10583a2f5ff495f37fc62414e69b1fe128c30d3564dde2e9c2a6dbb916003c0da62590bc5d6e2ae9ddb639e83436e930cfa1eae990f10a859a6f741fe3e66ec57882b0b7fee9290d97ce6379f49b4af779d5892c4864b8af68cbd59a4aca8f086372387f6919df163c6f332319a7011b2a425d05d45024de8c92991f63af5061dcd6480c80a32cb44a0b6df7973f3ecbccebed66cbf1614651e6ec6d3d186fcde6ea8fb15ac67efe27cc2433f48e330015fed674d85056207bc0381b4dfc4338cc0fdd445d904e9987281f78bfa9e93f6de8d12b14c6e2fd2c175edfd370f556202357bd0b8665d9d50e1346b5b4550f05395ce39b2e44b5a047f4da46d0794706c49943887262d42a37eaf1c500fae87e796d1ac027df39a03697fb1c669ab2f1fd12e015ad2b720388bbd4a8f3f47b7094d8f68e271da274c02396c0243cf6ada86aea7d6ce757d13034066df74ce68f1faa34e181fbcead5ee32bcc7a8acf982b7b6e87a91bf6709c900b18f89224a4634dbed96d3453e4d2a8bb7b27dc8855464e5c13ba49c40ac5c9b37d7779e1e92c1adfe4c900465403a7c5f3b60a74765e1011b4ce0cccbb4020c58ee2019c15743b993b297a4cd8689273f8fc850b0d4fe9448c03442a2de40dc96c35b89045ce3b485d4c475b05f703a050b765466c2059b5f485fdb57e07ceac3f0db3cc9fb4c056e511226cf4f11ab5cb5bb9fdb55648115fb391eeec5aa37c59f214e08ab342d97f6d7cb5c6a9edb0c333ece03d6add53ec153a19af47788f53266788bbd6a1d19b812a121f6d006495f4ed1d3f36a09b42a919ac575f09ee2588eb0090d92733ef28dd6bd13d40e5887aad52f3969bb7bfa2f9b14ca21b5873fc6bb775f2ebdd09d59a9b4820515c1a16d30ac24f7a9f25ff0dea765b257efe9dbdeee5d308628dad008e3b15a4148a01a90d273401e4860e0d9e223a5e5b1f7138fd9bafac6dea98bdb051c8047ede4c331c461c5d12b3398cc8761fe50c2c9c286aa5d209e7bc08b8101835bfd633cf5ea20d67e0342675fb45dd6b2155df9448c76cfaea0620a35abd63c3f22c1506d003f3442e815e8c727cf3cf893d1618e669ae144c230a218ae8079e46f98bf47fab03f751b49186951e75184d2fe1769e388336c5b763168ffcc7d436811d04f49c70d78c3f447a6ea44a309d414353d5cdf5d0f8d5bb72f38a430fcaecff4e686fad995bbd444e8e444b43096c6a803cfb9126329e360d87b25d6d9cb5896fd07f1eec41d13656f7703a530701f70499c0bb23e815e7018e46fbbc1f95fb129e9886443e7c6412f22541ff9a713e1ca4ffab81d261b0f3ff3bb42969bebfdb9ad60dcaa6801b0ac2bc2ddf54965f40e3bd7629cce327e5a607cc0f2bb0ff1957de2093a524c7199f9112c3d220b302b8046e4a8dea51622d9dbb0e83f95e42b8a9da43d645b4a5b49182eea84cc7f95393e06ffebdd4f0a2f8d20d3e24234051ddaf91783c5b170b3b0df5dc123a49551b4a2a3fe7a5f8e8e1d2df6874d306c47bcef399ce616f7d825a492226a89523bf5007bc6992611fc003472a794102442c0a59a6dfe7605b6ed3b3be61da126441eac9b8f6e43cf72d319f2e00e0064132388b11235713d68e2d0f0991b31f2f3142a61f860c5607c409c309f1c7de9f3e6e60f7763ab90ab2f72128a2109e25f27ed588bf8b5bd0b7e285787f0469335f3910c70e424b8ba10356dc32f5ac6167d48218316906f4e996c3918043e18fa9b67531456de1c63596f3b0e50eae11a620be6247ab10d8bfff0b7aa24c45c74ecffa3c0f9f86de75a0194d1e04d27e156766873d4325cdfde96d2db77ff94d5ce96663e562da39828ab7550c17ea9d28ba627a8ebde0ab216033522c1c14b8c63e05d44d4444b15ad10c89110140fe56a889f30e031daadc1a9575e276f8a61d71bebcb81e351a3afc0f54ed1b416ddbc61c0ac510a988a2c3cf1f63751871e19209688bfaec5b65476daa90fd383cca15f714623047013312d4be0c8d72edd68de079419daaecc64e52193271e3a23f3d5e048f8f5f341f7504cdb2b12251ffa75f2ee8dfd39edc999a9737b8186181a11b068a896c8ef93803b6a0ba87da9ba342141a9e2cf17e36bd1d0deb6c62393131528c25e9c963376f1d5567c011d1b5a3c974a3ab5275c16a38655234db6b491bff6b919112b96459d061b67bd849dcee27135af3e828b8c34c0a7f702e3546ac26b418f589a109450dfed42895996cf93168a40802695fc4f2d6e2369a131bc360cb75c95bcc462659b5c10a48d290024d294c54b3bbaaba064e8700d5faef9bd031c0bac46ffbc8c363ca30943aecf2e4dcc4d89f4f6b84a4382d9dc4d7160c4f697e3e34b0f3a23761aea9cf43d029bf2f5ace4239b4cd7edcbedf22d14954e2c87eea66f704de4ec845cd7b9bd638472b08850f1b331f0f53c02383a54d04335a665d5519d0587dd28f9f9f61a066a2d7a03dd201d499e5d803df561796b32b02baebcbdc50a15bab66db0da763fe101d96971f4518c12a6d1b40def959e569340718f626eb28bf0ad6def27746a5e6acfc903b264820e63e94f375d78a017c7ffece08bb051ac74bfdedc040e402619d4527382f05209bb649e5f740c15792858af8e33d30ea147fdc07c8ae6657173734c0b264433080a4ce26bb3cbd7ef7eeaef5766c9782f38b1eb774f9ea9e3e030387255e521278f1c51bbd1bb7a5dd415934793003b62aa1dc43ca5c72f2afa39da1e4018f10435cb443f664c7129ee93bd57446abd495f57d6847b622f1f659c7c56f5ae62ccd39d3cea229ed1fff4700fc7bf1a08bc1a592905b248fee77f8e5c9748b53279f17eaae614cda198c71e15bb46253768205958b169f8e936d1f57964bc6e447fdae3497c4c8b540ada6e3cd21a96ed3c28f64e20db3e18982592cfafa4289d822a40512cda5e5fe9024509179fbce8fdcd85c2e89674798edc04936d5b8debca729dbaedfa3c3c7b0e06961e41714b19c18c22970e9556a30ec669163f9b5ba2d83402ac32cfa1c5be30ea6479c1d7f9684ac90c1bc84665551506e1ba1904e7a229bd2260e310a296a555f317fd1704a0f4324d7178db42e889206a1773471ba8288a414b4c9105ad4c13972fb34c6321c256a5d8e8b53d354bc96bb6090f7cc749a0222879b3f56ed830ed85821fd5977a33e7302fc8de709bc1ffe442b1b095a595717b15a97e9bf7e34d93e19b025976be6e351c86e5315ad08dfb082c25465887468e98a854ee077af2dbb999ae818e0532d076379aeed6c8b3983c2866abd4537d960a75009af078d9981f9f3b5b88d308ea9584f0eadb10eda9881ef01b5392a3a3a3e18d592b9d8c271fb0b86168852af5d3764889e5b46af61a2663f1cbce7fc9b3c1bfd0e1fd41cd65a0b2a960a0cc37f0323ae1841625858117af39f388ac773bc1804ff8c7a52bf2e29737297e249c87475fc16c26edfcfe623692298b19f2da4d456e0317376ebe37b68c15b0286697a9dc5963040415a655e60cb60c35a62bbdd3c72b241b2df063cbb72dcd11d20c59994d9a433dcb3f12f2a20f17ac15e7c15b82f383b3678961094704496ce3fd6e18988f17e85ee3aff946f74babf72181e3260f743b563fc0a6cf7a717d15a5dfde838595ca129d5d186c3d9e3166b3c5a6e0c704812f818c7b2fdf3b3dab6cd093e599e2f4d79919bd6d5411106c4ac2e2aaba36dc9f460f3b461dc74747f783f666d442fc75bd7a454da3e826d0be3152d68dd464caf2c9b6a7f4790852fede4cefc144d9da20bd7c4d88fe1802130002c5746f16e96fe107b74fdc9f8312e2a3413d41ee6c42c5236907a06bc2df01ffcc91e3ffec58ed6a3dd9df82aaa7e81ac9b41a04335a4fb6aa7ffd9f40aa85ff06b3f692831a49cefef7ebd27320221efaba069a0a36d44f3373814331e188e2586c940a8b58b314dd7571ccdea00c42a16865aa9a7d149aaef405e82c689500525d063ea7b2bb2fb7d98b9fdef637594ef0aa123beeef7277e2bee8cc919ab9d0a7ba7b45a8b65cf734238614ac881cbc3709cb68dc066c0fee3ae02ceaa93bed500f671c1976e9156167103e8e0a18a8f39b9c1bc38b3dd8af353582995deb568c9ad2a8df44554d9924002a791e7de8ccef2dc219778513c4ef0b8cf8619cf4221685c2692f6aa82c8b249ac0a2502f79912ba47b735c7bc306f9a9d7431bf22ade854f19a5695ceb376de3353c54df37074b2f353df366b34b4fc78f319b5c5ae565d0e40ef21251f94082d6398070d3e895ba62e624803c56b4245ef6ba3ea3602daf70be38a64a21e1443cb678d27a2c142829cab825c55cc7c63c003d6a1b3d63abd1f288cfab01c86903932ee8a5433357663f154c374b2a253af08df50cc71ef1f9963ba24daab508bc7205b3f4acb6ff8482e2fa10141077281f7f11f9ae5bcdadf21e73b30e851a6666449f556e19945b9123cacffd0fbe83722ec0ebf3e6ee947e87fc1c9fc34e8cac9cb7de278e241a8dd1fcc69b4c5d895fddba9a95f0ed1e0127c28215f61f3a6293834569a30e265c10c51a13dc40dd64bcc06c8df42a446051220f11789a0cfc2ee550d0ddeb89f6073e022444be21b0075bf151ce007de4e283e7e060cd2fc2aadf2245e6ee6efb1fc4b1cd650e24f8db0ac28feaa9b84a593d94d3b0ccd0e31f376ab8be494586f04ca50d55b69e4811ad54cb16e609a441a91105cb06a878098300361082c7a3ab14d15af1300893309311c74bc741a599e9d4ef277aaf98867082f419d8bdef642342f5e51a2ac75b46ef37cde7c44c292d27e982481917f869521b225a5bcb45d5c87e4ac272f644ea4bed69607cc16e6bd8c897579fcffef8e5239398c2f86b5824d53a0847560e58d39785cd23bcf8ece94ab4084510d1bd3101455e597f12bcfcacb9b3508bf00aa4c7fab2d0f72f044db8cdc3d3d817e6408afc4a69b2f6af13c171b84ff00a6caa6451c478d1748a9b3a9b82e2200105a5f28584024c43698b85b08933a2210ddbb7b033e2da46bc7b125a8f9cd1c94502b1a30203ec713aa9b83fba7ed000af2012b2199094ba8de08e52cd120fd7982ad274a4b8d054bfe014e050530dc4d463af707c64b8cf4a21bc7b90e6bc40bbee1178c725b2149821e1eb90181ae2fb8aa72725109de8f500c72631242094933649b405215650d514081ec4dd2826ffd8a2a519525d2a2ebce1b1cbb273fcccb26bc1290e3389d18c4f88e369300825f70dfb4525b2429e0282e5adf86882bcde7f60f4144c3ebe73d54d033358bfdd7fc6ab0323ca9ad4eb1a3ab7c74a5dbfeb04e9de2c597bf0a0bc6c3f222183a9c2a086837508180e3d524cd455948ac93a639859398cd21b332b16ce2181bfc3cec321ae67ffc0f8c3efee3478091e89dc46af93247a2e185686b7d12f09e2841e75e4530bc57cda750a4e84d100b29ff047036189ca5fc86348e588c92c2bbb28f6e5123b668ba1b5844603b08ac529803788c18d0d2e869c5056b29708989248d494d4b6fe20ea1a9742a9d90f07fa9140679c5b862ec1c1120828a6d28916fa650639847b2ef4a3fe436ad5dc15960989876eb29d4c021c0d775a11925915f0d57061f5d61a5cc935106810dbd817abbb418bae6abec1043506df9371d33f574c56eb41aff228b73455f6db1ff2490b55c699f88040073428620de0034e2064c229753b1c185f67ebda092df9190dd1e983eb4f0ff814839c0a8fac6147c8f2666bb592a3bd2ff297eb915409ed0be182d44fcc1353149fc62b5851b4d017c6541ef18aa5e5f6e5fe2eec8f9c40056034531581c5ca49cb83bb0ba2b4c488f7b3476da19e5bd2ab04b6b59570a75d806abf8467374f6dce0e9b1d479d6d39db8e7d2ec1bff9f6fecc49604ac3facfff6ee1da02086789cd9a545cc783b6e7124d3f01a730ea62382f89e078af40297046ced302f04012bdde2a73814e6ecf6049a1aa7e5d1edcad2a4f9a80082646c5d79477f2d35b28013a55e3cab908e505a7090ae486981b863056a303b911bf28baef5e30f1f0f76f2770c7a19751f9bd76be2b9abf604a5b37b01ee1f63345059a094b2bdabd4849db9db6bc4d62bf3eb8c41d8493c57c4cbd018b4ddca19b2b7c2471b8e1e30bb1e267277ce8f7dd9f63806753224593c3834682e94625894dae5100f457cb5a554a766787b5f8add37614c7fd424bea617b03c7f542cf52f0d980868bcc76fe7e907cdb30e2297725a6da77ae8d8ffaa00ea322add32633cbb53816e8e72d7821f470835a99d1f6258d6f4ee73661e08e0f141abd41af663566b9098ae9d3974792a45c79611039ec4983d52dd33952515c1df684e0f474648c9b6df72de3664e61cfa04d018aad76a7c14c6f301b3b9a301fb7884a5ad8c8f654b09275b7a2071400ce967c84db5cabaf98a950d7b0629f274484cead6236bb7c2d62974fba67840547fe735a8e74690691909b016c538791aaecf1110595088615de4c08b0eeaccf3e2456355087f95c542eec793f8ef6379de2782e015abf835196e25b8f1954a931d58a5a13d3d70920b9facea2e36362144df468f0e9d38b9502f9f94d0e0b18a5c8b0455d8cf03c9b61a19edce72cf3bd6861a78166a4c2c2506aee78a01a589ec283cb28430e0e1dc057b01d1b7fce9e891af1395a8e27a36c0a85fc7f21e3ec3948068dadf782ef3d2efa2dbbeb6e6c4a6627c5fc233408b9de440eb94a8b05f8d46b9b01a175b2ae9a6b3b77426078f0a70edc0ea8ac101d7f15f69d80acc39499aa32a45c15e1953020ee39e4643690c7ef15c081de62d07d814c13ecb5dcc10aea2445dec791662b9f4a3452142f1247c95be69a9899337c99f56e10577966c57cd5e1a18634c126b04dd6d70cf6d5386fb1d41120c3404bf6c4aa690a27730f31a5ce69dfb3df9b54a002028d7e747c8706b1762b2fa53d5ccb835abd43c7aaf003dce2d8591c80ba0d0a85e8c16113f5662a1141ca3beaf4127bed23ea8d1dc7cae0527d9f22139e41bfba1d9460e887a3cea1c58369a5c3e8c803b9a44526d3006891387fcdcfb84bbe29bc31b4effe3b5998f9c6be9d49ac30200ed1f0f1d709063db35defacf189ea8f1f1d6e62f2c976e49a40915278c7ba50c4d358eba14daff8c4f3a15c4a3c957e66f406cfbf45c82245d08772d6d2b5c9a595d73e0c27239280f3b362a41f328e3244764b4498a93cc7c618e76eaea09bb08b6679fb9ce55e64de1fbe29c0471f536f0eee461bc30b1c5a1ad99f97a6ec0d1f9e83297436a43f1fd29c5b2712433c69dd63ad19080cce9c58229c2c84815207e77cf43a0656af3e687509c3e8b12fdd64a61200f1dbea9a65fbfd31560c9b08c7502458205bb73c47ebf0cec3b8f3d51b8be243fd0158a0821bc4f8eda48db3e583cd99aa3a01fc2c60c82f0665067a6af8e4dbb4192d1eb00e2e5093d0ddf4fe8af0c737817801bd2ea8d5a62b276a50aada5e9c7fc87fffdbbff60bfcf5187bbf0ae7adeaa8daf148da1850ebe83258add429c938b4bee5bdfb44ec237a293850facf0c3b35ca7f5e5ac3f35047c67e5032383b0ada32b20bc6466513330ca9c73d323bcf463a26d64452bf16f0778f2dbba3afa40b5d4a0e039961608847368ed851bb6b65a3627d78a806336b2962ed5fd195871da7942f26d7c05ad188637d90976626276f0a86bc3865181c28e626d8061773bb9b22a11f542f54fdbc626c4f53784994705ad50207b9af7f78d2e145b7c071752b1607cdf23bcd058e96b8b86058af5c148158b8ebfdec7d095834ae16c95a913261203ae4420872801684d16aae59ad138d1fe0d89882b9d3a3f32ec5363b78bcba54deae7da56c97b7101c1119f1525d685cc5e1d19a6ccf53e99697e46f99fe268b61537685e9cef8f3d1aa9a5d5b8e173f681c5830bff6cd283a86c5f18b35d4a6e1849198528e6ca2f9c0416ff38db6d424f88440ad6a788c040b87f5400f3d46e4b6f3628f6fbc622d70e48b8ecda8b304a0b2a9628e01ab19410ba2055da429dabde55efbc07bac25eb83e938280739e8b4c173ab5c44f3d826ec6abcc639d0f63703e4666a386544ec2b0dd0003ebcb8983d82b688d435b126247f647a2561a46df0ff3cb718cbefe07fbd67ad29718c6a13d3a0ba9250ce3172bbf1f42a38e74098334ffbfc8630049c9f2b49dc29f32d9e141fd2b5d150c0954eec582c047f52763bd2d404ca952ee038adff183c537e95898a9d67d3d8a2ef0ffc8276b0e95f54351287fc6bddbe4a81265e172ad1b5d2a2650a88c812eddf43f70788453862b2440138f0f41e622e4422af1913dda3eb158f63214feec650499b080f29886c4fed7c7b40f64d62925542d71b62443c943838b07e9e03e9463375e86e6b7d8086621cdc8d911cde5fa71ebb0e969420cea12d1056e643623991766af16ce9a2a8eb18277a7f937ac86cb57218c01228fee52839e7c02fa3979624979bf912888a49dac9c999b13f68fc7889ece24d93ca2c935ee0e02a170612fbc73e391c04c36fa146791e768571a8d6e39f45caeee44b7c4c14c24c00b10e3030ce99556ee03cbcd2e5087c04f0c3f8f7921bea9da1dcc2215637e83b8f209d4f2240ddda8a797ff3c7bb0af66ee66e73043625f73865ba87a9bccad3119e53f2fdcd7e37106a9bbabac2331757405131ea62fbe117d2324e7883d3a77c9ef54a311a830b4303fa1b8d457dbbff25f843ceef265c19073d9ea7edde1dec4039e6aaefb75e3e4453c5506b953934f529b83a88ee26ce17577e773a6ba30bcb8621f8c3d9fb9943dda612791a7afc30a21fc4f7f480989952397c39c5287a77688035a2cb4d9073a148f7b47356f77c8c718ae0049cc881640a6e1d99689f737c40ae2ba6e1ac9bc6f2bc64640f764be5c11996d28671ee5880c94a4bc4770a6d77629ce3e0eab8a7ace1163869ddd9f9a049578e394f124a0bff24755ffdf1e785ef465d9f48a500cd509724ee324f0e31de593bd10e185e9e3c67b03b4572bc54f1e1557232dbd32c857978ee030e556c792c99493429c03c528080cc3ddf8febb44c66192305e8c0e0ac889a198e3a3942d311faabf2bd0df82b68466cfd84e3b3fe69cb71ed75573445f1bfa1f4635eb664c646abecd4093952c4fa9129ab04ff84b44cd10341b67c4f56bd4a78054c65a548b89b1d580386bc4b310a3e3eaa2a419ce6e3272ae03cdd763e0190e785ccb42028dc6e85a5a097321048f089b76169e213d77329171de3f48ffa9107f3d495bd639a5f15c572d57b930c64a64a24a6a1ba1f0f4b58ca2aacc050c94263bff8e226172daa322182a46d64c2b2e6009dc1dd0a66894f09a03c88191325a9ccaa10ac9f8c14a649a532514d19d9e76627fd00f6f04a44aa618b7baaa88b2e7cd0e2a1b5fde2f99bc54110ae4cdcb4964bb8ee2127e27bbbd10a3e28894942e465a8e20f0caa3323de84f31c49dc95c986d2de343af96514b4b09b75d4f859bdf02aa439ba67a1c30a4a38b1629c76138c91485c9836cf6afbd71a39bfd1ecd9414cfa1f16fe5017d7a2be0204b6eb736dcd09c0c0726d42f9c48dab672ade064e6787850286147ce06881f0a882312a3a53adda882e64891338b6d21818f1c04ec8b5c6ccca14cf873b43199a8de7b282a418e785f085dfa22e093896c43e64f1a88fe2ad09afbbaaf7942655dbd4c8d55cef2b30e2527020580cb2dd8aca10178f9bd84870fb081721c8dc7af960c529463fa65e7fb339b0a7841a567a3b2023ff021fac3a5bfc548c0c105008c78ff29181ce6115383e0d314be1272b511087f4410eb0a8fcba55181c1271ea7412213cb564924487412bd83ecfe2a657f3f0bfa381f220d0c860e26442e69e4dc3b2e75fddd975911e78a2a8f918e2a1aa76b591d1fb6855968f32c57b154c478d096a1bb12324583b0874422171bc0f7e54fb27b15855430a04658f939fd05fbeb687b4eb47f92dfb685d980d59c8a97b6cefb84591c8d3b3b02139118d2e7397a3599698a96afcbbb12cefc2fadcbdf462d2f5cde2bbb404a48b3daae284dfd9765611ee6f699f8a640272369bdf6921f24a4bc4ad5f607b1859e0dd4ea8512a95d7123bb5b0b9c6f4a5da63c3f740049d0f78f8839ad2a150a6f2a10fd9c54de22a8874087f56ada5ca6beab0ea0b00f9551094d4b057464bc85b0ead0b43750d55845b8586ea56b9ed07581f5dec449aa9562b1b75080a7861f300413ee72e5a0579e072000cb3f7b6f345518860f5fcd3334520bb3afdd7f0d2444fdec1e0d49e4a5411bd1f22ca39264f5d0ac1aeb3dffd12c77484a9a0ce31c095a0f704e5a3ae965b976f9de968f99a5dd149ee9f8a497fe90f33dd7f7f300c55a92c4a436aa32ab40295e781fa9c15154e85b7705ff70616e1f4f0076200cb76d096e601d9d54cb25421facf390fe9318a3286dab12633a22c6ac9b08e3b6183aab53870f7203fcc07d18d42bbf4e8652e6e88287b0c38a1049f7765146a9c874d5e5c8d434ee4843d8775f1f5c941923b50fa85cb8dff607bb54f3760b5ab2a7828d0aab482a16a77755b55556073c959d3fd31608418acc129ba0162c99410eaf0c1a6f8ffcc1c619d55888961a25f52080c9b41570be2eecf0fb5048c7a95c8f55215a82f94f962a92fc18545bbb9d80e12c5a897139749ab4763a3d352dbef696d2a8428413f2780d6b5d9b810724d2c88ebd94bbadc6251e007043ac327ca9b19c21c9910e0e40a71eb53823fb0daca5b3479afce9340dcccaca4faa47e83c04d5d811af27098fc81122cbae542682b30703daec0c5e55417a7130fcc42fa03e221cdf2fc2113293945077503c030488ca7d11c02d6a0b59fe0127fbd4140f607a25b83b184ad06fb4d49998d252a4302e9c5485555d1264ca326fa0a3935e733d2ea220b32c888b44e1e4c4d830d94ce66e5b8d920f4e68c4c87e2ba3d13198c2694fef41dcb879d84f76b5b899f0fdb7d22661a6770c1d6183caeca3a1e9ff58ce4e6fd017c33f333429cdec7b05afa425f72757bba4fe80f3ce4cb40a036a454797aa333e308d3e3165892460a6703526502709d6bef35b66ba07a299199922a1f55e620374b0bb3f1f9b39dfd5393617596c15f83fefa44959bb929f625e58c264b58bffdc72a9b3e6e82e79196bf07f3d781d95981aeafee0fe341aa46253709fea5bf0cc225c728e259a5a76cb5dae371c3ed66f2e7f94370340451f6914c5e3b6fff6993876f108ef1e51331fc50e474f96244eb5cfceb593a12f75b9f6b731f5babc50958bf17e8dac6f5cc7e056d8444958e311eb2e095bd8bfba1106bdb986e32b8ce30b45af3f0febbdef1aa9a943b29e0095da95c77bea834ba82d2368478c9f239ceb5971b05e2229cbc1ceba224874f468cd4d3533f13511af3bec0a69e6409ad7102ea4b92e779d6f1bd4eb419f6b8d1c41157ba304fd667c0264018502311eed6880cf00096bc985482febfc104181eac1ad6ce73ea5b8fdc4115284c022a754eaa374564c941395a6a913afa8f262aa9b691077c472a04c0e191d9bfeb0aeec0049608b6c278da3d256d5435940752f460b5c9570ca14c524110bdd3553ff122fc1b25e3e376319beebc37717adb9ce3705a7ed20a98c9fd61409d0176b5058150cb65dcd2d30ace606526b4a492ba46d75cd96c6301eb86faec71a766deaa182a14ec5687ddf80b42b6d51832ff9e520e46bd7c94a875de2abfb5450034dfbcc66fdecfdf40940ed7a8792b9e34acbae3db27fa460bf90d22213dd708284de867f9154ed633f41abb8b8c8044d7caf7e01cd04159e1c6d0ad4da71643e1675ee385c6dd8045a0803cf8d084028ce991d0278fd127fe2e82fd2715cf9e16a651cbbec951c046662344f417fdcdb61f9d5209cc46fe7c5dc3fb10ad9a08e746170b4c41144eec03667683c0009e4619b094bf06c87c7b19f466f820985ef4d3353ef0a79f129f4d40095a9b4862683b38c9e387e010ff41e484e76bf4aef15525c909c990ad2f7293b90a23622d018c256497c91bfa39a112443b5f831899c1242039efec05bcfd87e19005d484691c39f6712f8d4a2743a51cb04b7fbdd19ca0dbe0d11c8975828bbae3d0cff4a417440b8c35a180361361c3833fceadb558a37c0c379700120f113ce70812d426b80cb52a2071df559f4d6faa4c67c2dd36afe6b08a829825f4329a3d61db08f41a2bcde7f8a1512a85a001c314d776d49d4a6a00af1d4afe5ef8caa729d3bbc907b421c16901d78228889f07cd4043a4b087555a579f7a84d45a64e3e3b708321f861d42599b03a2006fe912242ff9ce5caa23118795dd6e0930773bda3be8fa8e1095383ae0111f95674ee5781a652ce963c2cef8db6bb02ce04d733809f65b855d90440ede3eb517d931d05e66ecb8274265922642a43120311ed21cc401587a2c1a6a42b64658bc33340445ac4c43017643398423f0cd2c579e62438edc54dae8e013eb6c9ed611b527f677d98cffd1314574add5d3f4e0cc8c923159d4da323bf42564a6863cc0165e126b4b718a286a1ec06154fc201b35aded917b25493fedff1b31270d83101721732c228010bebe3627be325ed4d71d9b971fd11291a4f9514d40af7f04ac5be20fecf4c01ed2844a494018872d941a03964a07d9aad65b1fa09f9305c6b40f868d5501f9a68708644b1b7dd6b67641545a16c8413924252dfd541dabdb8c293ed3da35eba12dd931be6e6bf98f6e353e99e9161ceb3ef240359d16cc32f1f8aef86526a6a92056709a0cd44eb89926c57ba89ff26e1679e411fb25422aa08a45a519a7d25536c643a5a95d0122a8822e34c3139181b41b8103912ae3ba10d9f644082b38515d727032f13cbdbb83b35f0592beba09f84f3ed5f72bb8f6237444c2cc3f867ed81983c127360167509aa32cd13f23225d672046229978b2c35dd61759fc1243d4b97b097642fa3d66e94580e73f07ed9469ff321b6ca6d517d90164a2643632033f661d384f10225ced0189214fe723387780355b5168b86ff263ad56bb77686169e24af8c73b250ec690c9e1f1bb4e79b3e84ea82b6c23fbc09617296d982093b90f9d49aaae4d1b52d1ecccf667221338f44eb124a7b5721406f420a0699376723ea13cc2fce062486d9e3c2bc223848dc8bd85ce2f46221a1ff19d9d3add31010c84f3dc4617a0d3ccb8369cf0c726c323f148e4a4d00c5b06e77a4286e9c189db81a31286f27c8e6ef0172b68630b944f9454a22846d40ce9d7b02182effef2c3b605939363b6c841daf9f6281b4aa088fae051323bd39bb88f78caae5714a90c16b92540204c93bf0c341ad9f8b57cf00494c714efc5bfdb39c648a2b491d5946c6f515c5e4123a9272f97480980fec7a2bddef53dc24fb86bf76af7fbdd8447162c03da63b919905f71930240d12c673a5c8bc18ef888c08890e8a80397023ea26cae1c7c2b23285b0a6fc2c5ddcc01b6754fdbfa80acd514bc144b5cda665fad0f41d7323d0b2e25eb88e1eb17ddf1c0621066f04349848d01d932acf583ba0599fc8e12863fd0dccb103ba294f8767da3429566b1541c230b7c3533e5a8f62c24844893b0b719550f778a97768a0f4758afa115e193e8ffa337cc37c519b3d207ad887ef92fe7f8b618f892fe79e836909626f12373f01dc0724520790fea3c358dc5dae0e4fe46cbe9aa43439e0a072f0e86d969b95210548428191636d5ba95da6836291d80a947836ab4a39afde001706dcad525605b531e0c9756543db96743dec63b78c56c3a92b6b57123df8142c73ef4f13408e70e2711b943bb91546f2168d11d7990198f35360f5a48401ede8c971ba8e47583e8a3e240ea7be7f9ef71100c314aa5d2f251bc190d34d6f86ebb528209c16e378533359f25985e5a23c8a846a2a5b728e1abd12d84e9f55a4efbbb40a8a3a9152b6f86587ec0cb4a1f3148f6ec934ea41a4fd8e11dae7beb0ea512dceaec47c4846873cd9a44c260171a9812ee8253c7bd3efade0d0198b03798125e7e0fbeb0672531cdf3c3162ef92a17a46ca97c74ff3cf3152d98e2e767e6b405a5ca5b0b6980a3ee4f1601958d629e5511a4851655ef29edc0795369e0f1d9efbffc83e047d2e55fdc3dfaa8390481f230ed9ab39e3eca8f0d620504ff353add50d2a7daa5ed02bfb7e5e61f18db03b2eb8ad7af04362350b1ca26cce2028ff6b8a2796ff9ec54666a2df80da961f6c7d9210cac4469564292c38b9e8a7aa57f5f66ebdbf8a542227b480fafcd55f7a262690343c9079d47d2141ddff2787bf1ceb4a97e3bd32c2234409f6b14cb0a606c2ec6122c393b7ab1d07d115c3f38b804da869501d70fba72837376fac48d70c8eef41d7daaaada9e21fe5b3e258a71bb34da4186a993d5cd980f7e43ebe8c83b1c700c5b91c7ba0f35c4ae80b63d5fe14b2016b290496d64cbf18776cafe72663aad6e6ab3277f1079002e31d10998928d09267b2cb739a86cd2472a2364c509ac1e6b7b7edada6830c2ddef676c9966d03b48da3f0f4f3100a3b81d4f865273b6db7ff59a053a621808d90f03505a09a7fbbddefe13d9a5b63879aa4b28fa416db14e79210cf56080bfebed8ac1114b72e85803b60b2a095685f610508016ffc180864113d63559aadec101312613979a534a53d3a231d14bf8079b249cce2a083b901656f1cd658b3386f344bba04a9390690f077bf6ae3a718b2a6af1303ffa0d89a91942982b4343a16754934b152b6826347048c768a8730f20bd9afbd0dc8b170985e6de69694956a860432bf1a4b3654f4312036764651c7d7da8f1cd29a80060ca182c7760aa4292d6abc857b8be6a7917c4c5d2a32d306dd776bfdfa8a5eb457bfe8a72c98d54124cf72d3afc50da204f4a3fcfdba4d2181362979f6a25a090cf7a0b736e85de272c308b92307dd3ff84877ba300067a96520c67e5dfc3f0a47f2bbd96132c04bb8a24502b154122e859cc28337ca3a504beb0992c8c98e2156d8044f6b858ee1a1a0a18fba08059c4b33f49dae45e5f0416d3ee892cbb29e4d1cabea1ff6083a61b462717633ee629be6b2afed2d4ca97a7ebc0f4f4e0c958f372162866ee3036af138ba0caa6b47768264280e5994db1873a2fd773f50d6d5ea53cfe26a13d9d213bb5e0d970d84949d25589af309a4495f4c616275144fd46d1bb2e149f6a6cd4d27d127c1630d33ccab6a94b65260051536ddfdd9dfedabca84cc0a2e69d1e101262f7cfd76551e281a3a169c8e824ede641827625efa83eb94408f9ed82913c5e2024af570100f832db65dc94c1391e6c8ab9d53ea0da20942a7fa301d0cfa51f8c9a2e211f577acce290f68975d6b3cd979cddb1a9bbb115ec1a1626b559d2a1901f748a51efacfe2614ed7d3e82e7ca2b8b65e9056df096fc89ad118e695698d40b3f12063f89cbfbda71d9696201ed21ccea3bc5f603ea827e66e5c95929dbebb48966c026880d7c712c4709b88ff554e7228833173b2fd3b76f522612e19f9481cc6078e99540547a32754d2103ac49dfeb475fe6d43b99c4e54a97a4bced2ba7f39731a04b6469339fc7ee3cba4d522c37dbe19240e5b93a598d803c05d5881482d3ff09de280af99be658281b0d0a9d712e11348fa8ef3a6a03de717e884f74f1c8132d7835b75171958d8f66ffa773117e2493ae30b537db46e86089b5bfa94521e27138a7c96b0a13a552569bab9d7d4b3fbeba2cb6f2355a49fb5487639beca570a502c66fbdff2b3f5a6ad0a75fecdb842b96b39e8b0829f600463718725ada5d69510cd53cf09b346bdee5d188f7b4eb3e44717e5d47d3e5641532568e9539f74044690f7362a93a4493b2d174e3de177a151f2d6d3d0b5f4749b1cb6e1fe3c09e860e7b5741c99ff32f3db9093daed2991bd70a59d2cf5118b56b729011e0e357ae4ea40d002f787e39817001bb88c319d92d8ca57645ef3ca6fc17ca8a7bbadddeac3be907ecc77f24fe0e8c8e1f8558dc9ed683bc9580b331176531d87cb76e02cd9a89953c7951c6fa47b0dde41f4d8539d7752db99cbc81333b6999ae562cc292a578e6c37c09a0c9394c95c0197bd6aae582638af08c9bdefe5d1e58120b642675ea04e1913d2d800483452a1f8f0a738160d020d56ac71bafeae0ab6c08b234baf5d2eeaecb1bfebd64f4722517d075127f2fda4f6530b8483ad9630b68ea826765a96204060a0f3c4ad8c4847e9706af00b13ed7d3dc40b539eae3400a969ed73b1508a056b36fd4d30edf9249c2c0fda21e7d62be24a01290c02c8453cda8c98ba327506bbcf4769841da024536c7e93750e3f512fde1dff623cc175b7f03c82577f4775e50c4e430571e0c0010046cee780426075a3b387279a03841e3c5c5b13d01d90c89c1ebb43772579c881511a2170e64269987be568494e9b02f9c78df92ae491ecce2072809dc08a04b32a0629e5a5c208424e0414cbe722bad9c984bb7dd011e124fa9a08ca142a5a166569a5ebb3019d75d46856dab93521f5fe43068a9a4102c0e2033d54438ffc08c14cd93d1ddef82e835bf4a84abfce0fad0bed7ee434ddc21f12bba44b90c54b5cfa827da1dda7c6bd43ffc9064a8b1f0e50307d3d28889931c21190742072df297a3025449293fc3a795354da846728f27bc8f4d7c16ef13e50570f03328f4109c02609470a3643be206d601a5075735406bdcb15aba2ed9bde334e967e051711d71980430876ef80c8446c968da3396b14065ca32e0f6dd9f2d994995fbf7874958938975c2a8d14677340d1815a1e59231c6db37189adb0dc10d09f853c97fc4244a890ca2aa9fa779fb1996ddd4cca811020a75d1adbe7b680631f49a5fc4b2ae9895e9ed23dd6c15ffe836ade3d71902346398bc4724f4803d8cb7d6b2ac954931d29e84024dd1fc415161288789f7a2801fee5ecff6f0450a1c8863976884237600e2e7acaca69a46aeb08840cc1ce1d0507ee246afe88abc8fb9f40cd3136789e9fe5144a80663b4d4952046fc4b2c3ad4c9b67398080fb795cab3fdcf674cd74265b08141e3219ade141a951983d82ecfb3ca685e0876b7c1b97bd177134cc25c049b25737cd36965a20d0b06f92339f64139648bdd8e676af01695e0746973e762610efb4ca944386ea4c7a157edd8fb65843c8267596e938540efab57b3d90660c6cbb663309b777cc5e338b788469aed12294fab9387c4923a5e8f1308f4a401137872d5d3e6a7a9ec5c68df56152f618cba360e4371ae140785a04c8ec8af9a090b7c57fded052af15a2e02d7e8263dd565707082bd31e8b5b43d53ccfeae12cd987b8395b93146017220a31cea8fcb7ea878065350b1ceaf86f251650bf156dde21900314e13991fdec74ccdbfe761432415222daa3a7480f00758a2a0f2e54eb891a02a42741c90352deef199ffd87dec06bae1dbbbdcb193812707bd05b63f7977e40b4766aa04ca254398c001e461eefa505021392aed384ae57252495d851f51ab176c4684af3aa93312f9e7d3ea7a5e12421efd12687773147341e53547930e83f37080c760be8ed21d49c5267dcc48c117c278c3a7e2f4e73fbedba5ad7dac3ac39cbfe77508f2b74c58835648b8d4c4e0ba9410b2c9486953d51e6f1d8de43a1c33bdc6be5e40f5682331d45c909e6835e6796a81f6977d10acc564703493c6f632d85d2390193e270262ccacd6a8aecfd54889312f02d2913be27324cc2dd0c187bc222df027f80648af90329c23871b16f8867854dd07384a41c7bc6db25dfb450f5385c2814de3ce9f38acd3e44e0f817c24b6fbf460760506aa524ff7e71be08f7910c6b38d0b8139296bf22d144f87e8f1171cd983fd7df0f91ed58724cd503b72de7e1bacaec836622681baab745f81f9950a095bff4ff6192e0f0e34366d19069b5553e07c62002d54dc8d948479c635e8ea91443743e89980b4d273d52e406be33a6953cb3148c3746029264f868d9bdaeb8e00347ac37bf2c97e89df7e19f58532b8770e4ada5e8fb1a58739e062be189956ef84124e82f0c0cd0f4c8682380c2828b562dabf047ca0131069f9b8b2a969860dd846b7051a2a2be67e05da9824f85109371becc87c144e909284e85b7912e0993088b561fcf3190fc62857522f54a70165aa7b7ca3c1fc9806e1aa9af0aaaa7e33e90be40a984ee81c05c38723a14867a7b82ceaec74d6c8d8f7e5cd4e54d32f241402ca9465b5fc5245b01255607680180e86c26a678c6d14a2a832816d4072f1b6bf85f7ec08a64f50ec37a4c6ac3133ec366e62239e784cb6b5aa259ca3e02a55fa6f304056616dee673d1ec0c47936b0a5d4908efc728f0638c1eaec0908cd2e5f57d6646c14d7cdfac683e2ddc0b5ea4394c49e5aa2e85b515880f3824014320ac65505cac85859a0d4ce527ffa087196249252e1e5d641c72061a0f68bd7723009fad9359ca1cb617c1d6d26dabb2e3ab6905df780354cd376b585dc4f10f230f1267b457781c71f1e71608074c5433872c62ab47f74a462705b203cb7d38abe841c6852ac735b6968e73a150f29c8789ad43e5cc08a6dd04786e18137208d2929e61816ee0fdc8b8d0d4b35eb0babf282bf38bb9d995398f5740145b990c86967c526e987a4fa5459968d6a9dabe4e50cc344a1c838915e79d0858404b0888aed43432363c8986c8217844c1ee2ee2ecbbbbec00e2700dbab6e9b8552d38ede2b3e825a5be233906741999ba096b30bcfe9016f74eb74d6c6dee96ce3248d5d7ce840939d369a71afbded86f5bc19ceb26cd9306cfd10962304aeeb912c0295b66f3ecf93bfc3698ec0c522ced8ece5d9d3ad5f0b858fe4d0c4cc4c8a4e0f3b94442a10948aba1b8083f7865c3930291676dd8d79a97f4e09bd442263cb3908d607a421244c0073a5dfa71857c9bf358d9f4212ea4b5efd14662ee4e7160c869421f9de6dd70922aaceb499f42b8759c750fc282afd2d8715f8eccb40c965037134dc2132f74c196d4dab70b0dae42a4adc06f234f356c71d94bd9571d9921397544adf8a915c4ae20e86c4c40b5df82fcbdae40d2d32a6dd35f6d4e4da12648be7d150bfc0f136bdfef6f5e158a6178a2f3c07cfa15a87089a45c0ffcd4c1e1cd36a5f1446938cdcc996fcf168882021619ca51bbccd2acec8d95255c83217c44d29f955bb12c97d5c5ca59f20860fab5f49080d8ec6b17268f7e74e754873e00ee040d54dfef921dc1641c2626dd035c24026f169e715fa065c7ae3b16336979b907109045969a541a5e5920ee873b3763cad199fb46fd41c2e35c93a0c55812237dee8f453958448b229fc3d346e64bc4d700e5a37bd564b5659be1f648766d50f973bef47b14137af92116e5d79d4884b0daf0dee8f75ef3a8223e55b16359d3f7b414a98393ef149b20d3179eb1c91213dd459dc95e23170c8b05803b9aa9cd37f39ae06649ccecbf98c5f23072cbb9be1b7f7e6a9210e80eb88eef79000487f3aef5ccab8ebcd9482489fd2774b3f6470420b53c62dd1e079b6d261f918ad062d28bdc16464a25e61354cc1ee75cc82049fd215c8d89e46f088ef7d577d5fdec9fe1c8c9e9a595795724fa89e17930ec8ae5ebe5732618a65f721264c62c08e6e67498d84150ded8831d8b8279dbc28f2389df2e9f797c96b498f9bf834e58eb145986738d9ded82e41985ce585c56da5c5616af9826fe1619d5a74c93ba6bc71de39561e95b488fe1da7f60954e29a90926dc4efdd21043a8be12635ac7edfa99aeaa9580ce17c6336155b3eba91cd020813aee4f27bccae731bf2befaf8dfda329929744277ef2a9be10930f4461a0cd6734b8beb18062818856ec75ea35f0db36d850bc6c5d27021dcbe890964b5eb7ed781ac62c8dcd182772a47f37ab8987129c89b81e9976fe583f3be49a34ae4b1a2e89ab6541601865c58562ff1cba3819ee3d8b8ad2289a90b8ea9b8926827e09b0916a93a3a1b9c7c9bec53b0f0f07b247df2879ee17ff19123448c5764f918c215d215f7552b6f8222e320f91e9b48266cfe83bf7f9e38037c0f14ad98f597c565fd1ad9643fee401a1f815253fd8ebaa701b196791f14f0213463fd739b12c38c10755228d86b0c3761af0b3feabe7d10282503aec93206da9f8ebd08c59d9e872b06e55c865efe1b0f119f2173ae70672115de102303e6a9e98fa219495588ce0e5e813d7922fd18b60831ac17c3d6efb9a3dd39f29a1515f81189f3fe1bbe70e7d9f1f6221c79f6ef0941b342a0e07a0921d788dba4b70c5cd1307b85e55a837ea8c4eeb226ba5fd3dee6bd2a7aad8849370617fa7cf8d99c4fcb94180103b685c51066620a942d1bec678c638aa00992d60fa599b865b983e2625c65589742afa521b90399e00271ceddc520120f4e75e10a4848538b49246468945026a154b658eb504208a79478775931ee1fc6cd04cd44bf63dde63f3815888d7bacbe75f7fe27297948fcf51a8e1d8c95f3685be1be63645e87a99e770ad25186d2b1998b3d16f7ee7743470671091e900de403c64da3d09d00ba0f5f471211b0d167dd5fcb6a919900be00cca448447b164277519c448bb4cf2cbcf8465b8f788bcff22926e191a243c3cda75238ca5c76230e708f5155c2d64f00cead769570b91b447d663825925ec932d10456727f2eb2d8452ca810419ca9836eace87571c0dbdc471f1c55b07bf38b88df878871c13cd5b7d54036aee98afae717f94c3e90381fed08db7b661683e1dfb8856b3d0912c05f4520b9ca4d074e361a1acda0cfbe79d82fa683ff6e25bed08c7d45bc06df18985275dbe96b8086ca7f29b01a0ddcad1a79359a80e69ee5f284a68b03e182c89f7c7f1849037d4bd718b496a7def80a2b86e9c16e3c7e363912a4c71623be9b270d2f623f6c9025147e3846aeebb6111eabcc177ef638398ae605ad5c327d7fb946725f284ba51a4255105421c81e70e6c0f37fc8695589a0aadf21ab0a5df5bf4f564ded45a30a8aaad3a89a2e54f5df54a2976887f7650f8775f5ae70f921d3eefc4158f9249e9e7d64c8560ddb6db66018dd6f07c1f8db8379ea09cf0d3face60370da10926f4649d0ec9ea226d1a2187a2b6ecfbe1fcbe1ffea53968b44086780df67a93415335e40d944fc41596818f3f857da7c635099b4082e921166f1df4d49bb1c0ed284d41fa87b2a6ee027fcd17e116023293f095c06cc01da921dbc559bf22a436f806c167a6eea5e8d43c4b9af1c84be3d491d364162c553d1687f3e33c753e9e4415763d491ec69f5ce8ca11af4036aab844f22686314be32e6599d242cb91052f2b3862c56d8d2c663e23f3cec51d8ed1516778497aefd0dbbad7aea20d6b06e6da4e924d97f0a2d26f81717d3257830341028be72462312a625dafdc74dfb935778202fe5e39b6ffb5bdf187e61059b31f3112f20f6f44354100c6413843068604119cfcf5f57b1f1f1ff2740bf71da84dc58471ae990251a63a95e263bf0c4e3a73a91f2c60c5684af95a1d218bcf61c93e11729fa1ddd4b8972669f5a13e1e1803d446bba2f68c909c5a5726e85ca46fdce55162feb6e6787c4727c9e07a0ba56c500a909851195f2ee57ecf8370e42acd645c5c6b071d06079d7953ffe260822acb92e422bcc6c4047a50d401af2d63e0b08d6c2026ba0e26fa84448bdbca9e44a6ba3449dd0507ae087458665a2699108f18621f4caa8c925d3941a2c6ce7d1a7c1e5b9ea7d9190a83e0ae2ab6f3be31ae2f54c9154bd2c2d20d2735ee9038edbe756b69c0fb78e719fe2ca146ced748792c8b749b6aed1ebf427a10c52f358a673402255283f47ff0637d086ac424a19c4d9f2cd6edd182536ce6b7f278cdc4389cd0761ea642104df2df7636c065b68746363274525c3ca9c4fdd7596b77f1a46637606057173c456304879ad36a945d7f68b268d78359001667f75a763d4aae49b1630f527314acb71de36c592bfde0518fe6f63bcf5cadfcfdb7ac1491b83e1ff6aa2a76688447c097e9198530d82ab9a385c31f624d6ad7827193b733b76f2240b42688b140ef60ade86480bb77a0a63b4649aaa264ec41629499936fe81e124291beabb399a68b05a302d5058d61c0ca4557d85d2aa4d59e218c196379d483009a3cf1e2170eda93b8ae51555d1f1766316b48275b9a4bb471f2ff78699d7158b5acfd3b1490b8aaca8fa22e0ad7c0884191da25136d5a24d4af3da1086154902528ad29ca2514c32bcee104e9053b1a8766b85b31cb91a6c63a931090d854b8206c7002c3bfb55c67d7bc4516cbbf3c52217428b593f823a3fdee86a7d3e96508737c6e6e35cd841f4b325f5b6ab8afc7823681b7ee293c0ac6167f7c1dc2c0f659acf682ddedda04ef0715d85cf22d7f4127aeba860651002a766920326b7aa56972750db222aaa4eb31b223927f2062d4998520c6854570ef27e1edf4333831a8e21c73d90b0a0a466cfe667433e8d8db1db430c4b20c58e7007be81685defdaeb515d81d8ed40ab278e466b87b4186a885133e0a5d407ad339cd4b48851115896c30bfc226547ef592fa0746741462a7fe6f01ef0da35cce5ee96be7d815280b6d3144d380d6b624188b04e0c84c0d64e81f0343a879cbb600befb4bde8db6c0ab55db322370c4cf60023a0de2c7929572702dc831d496db0d48dd507dbdf51d8f0a1d37e0122fbd83ba22c3171cc1913a7088b1d97f2955ec74b220df5f7bd8e06c14b3c05f293f9f612608b13f7216be02e7d58683ec0429bcf27746d561661233007d0d0d7915ae72ff80db18edb6258b0230d0c1ff1b794ecf2d52f5b896eb719c6c68197a4778ea9ed6416666b646b9c9757f872ad979f331092980da93b05215f627dfb460111337cd7c30c19f2c99690ed09b234bff8a522fb09484680d6783123b936d24de12ebef4b4c8cfa0f4d7a35bf1649415ef5955c7e8621eae69452a2e89870d7968629a61899c01422421d2e68f4103537220650f07a897873f879a8b2b399f1be357e52d2cf7293fb76f624b492ebce9d1c13807f72021eb72aa3909a2c1f1faa47683a555e8a99efb79255857371d36f85ea7819d3e37d754a9341d3e7515fc402169b1bd70260b8dd6f2f5ae61fafa2a17bcd9f6f086938c37ef09432b3b3def176509e4caeea060640c08dadcc19806e4a1a4028fdaefed95e2748c404fab39d70948520fa3c7c14ce8215121b90b2513b73437156323392660eeb514c9cf1cd25a09ee2efa0eb342a3d10fc919c25de3543f1f7c618ab5d33751021e30496fc2f962e911337ae99841e2c7a1fce7f411e4b800733cf809bfbc848de5869c1b5d09f909c5070f3f69d2282fbe151d5cb26a1602ebf5c6a8b58fe13adcd03781b7d15c8237b50e8c35a12adf73bf92ab66b7dd350513f4bb82ee0f4a44f6c718219b438343db2a55f2387198b32aac8b5ec8cc6720dd913779a38b22e32d99e699aa89800c3badfd91931b6bde4ccc7b51c8ab6ec87b5da9fb53ae482717cd39275fc39bc8fa77e38fb0c080661e8ad5270fa83f5b1d28b16119d59232297acf25048b2a53d45b91496f14afbc6915f2aac4a6096070cee9c0c4e919345a565b9099f513195cdc7fda5c784515ea0cbb0e615c1991794d0d30ad9609555338653ae31ca24e4010466c11afb05400643bcccd8eeb2b536c11aa4a1c1573c8fa66301801c24e36d5565efd0754b31fe4869cb05bf933739a826ee104327bf6ba4d85fbd3afac0a0ed4ebb4fb4afa6d7ac52f3e5661914ce29c7edad359c00c26a1928637fc656914647ef34870748d8a6312135889081a4c3e8bdfa873239d31ced9e0e9456ca7e8e7c8d09e3e8e2d12ce845d6a1fadfe3bf14aa44c694b29d5fd69059e308bffc730ca12c129ab87412dba6428fa667972a6988ed5416af328d294bb70f93dbffdf02d1fe0bd661d54432fc4c85fffbbcbf6d987b06c9539535030690b112120cf357381e705514387f04829989aface27c2438a310f32eb74287f845245fc1f0aacbb65bd5aa4748f78d883cd24dc044cb26e27c654e04a0f7ed113644ccdeaded70197201c08bc8330b3e2a9229d05704a9728219748737c85356196ca55aaec070d27e8781c4b9c48aa645994af8d7c58a004cfdc7137c79745394ace3011e91bd8796634b8344a5eebe73061723e357c89113080c4dce895ba1859116a5701c596c9e6a64ced296efa2912366b53a25bc47e1270c1682989b6fc3315d6dbdf1defcdfbde716f09a30121db886a183d0cd3a102af10988e6377753e03eb082cd07df8e85a439e0d7e8538467da72411c44422f0fe2c9135e4c67d10a119150de43c55d1068a59b5f5b43610cab57d36904e6d8b138c83056254ef46834b213d34713c3f245b5e9c70b836e2b4fb001cc32d54ba189a5241f7395a85b3461470b4e5f17ab556502a0e46a8d16457e95dd67bff9c789cf50293e42e297e7aedeec57dd042d37e093808d87bdd885e148e4901b2da15a2b97c514eb0f3e4873ab66bcc981e15ab657683bd503b03c01043a1813da6cc16bf8b99bbe39f684ea72b1a5e38d46e202c94f0e597c1d0ed09a44156844746e4829ab9d28af7de47904970eb36ec68b9caf771005b40d2ca5f33d052cf087700fca6a5a5edb17a5b082c4fe5a2453c5efae64aeaebb7057db75b94982c63c04c8546b1b889cd995960082bce015883df4d939ec28cedbff1ebc75f5d5581c30318a3fcbdfc2efe38edc8a46e3229faa93be75c7fc7e763419a01f691a3c76add5ec13e2a0120cfa51b035306aec1ab94fa587007adc4451561ceac4130471b85c836045fb1873df13e619f709d789389af384d40a80f5ae4f650c2b2e0fd8a0d953bfc9dda3743fd7caaf9d775ddf7b1c2819c885a7510bfc81c0909110fe8da0c47e4847b49020d8f69372441b7e705e758e02013906439fc91e374fc21333ffc0a9b859121c74d972c4b1f6fc08817710c8fb193c5ad1c0bfc92f233be85d7b398a402b456db636c2401558d070d30065b5af4865148155ecb249e907dbdcdcb387d8af02da2db584875e8f0261f69584454c8ae589d774ec7907919c74a6c5f1abcb887e1021e3d582271cd8527d1f9f455b8629c6f4890ec465e8fc25f309cd316c36393962ac6d5a89e48bdbb06ba92fc7a266a7d1a74b32fcb7bf96e4f8f666e9695791e7a6df76d77dc00d51b2cc2953f4316887e26c131440cf14699cb2ff6ca65648a6a32fb7bcd3ece522372067e75562a951eba95a78de2ca945a8e8ff15c7af0cb902dfa3591ffb1909645f644ffeed0d3cca4083dccc5cdfdcb182386028a3242e9fb5156fee0c66495339ca753b46344e3dda2a2467dae05638a7da4f40cef7d486d86bd8dfd869ea1ff76b240050fc03635dbc27a197611e39ce5283775876c0254d5cda38e0ea016c3ea7e69ee46909f917f7a19925d825566684d3a1c800ea7b17ee72279845ce60e78be1d34614cb959fa719eef4aa5c1ab60f10adfa4631d7397f6a1ae361068403554d9e0af5845dbe71538d50ed8a376c74686090e76760cfbeeaebc5b91079f889b8d75eeb0427484751fe97836da5ebcad432d80982c78fed71720b0c3e0afca100c087fb78614fb23c134fc0fcd5837b25b416c8542540011acaa3b8958796354c21bf90c848c62110261630ccab788352afe6e78db5c1bebe23706aa0f9ab93900d0a20e36aa30a3fe813bb88d5e90aeea7a6ee2c057c0425c9cfebd856cd8ec050484a2e01575a4ec9a85b098634eb4ecef5053421721072b170af23717d8a20658c51518ce8741d94c377e926aae5a17bd3ad04c9b4d2b693095ec4f6176058c962100aaec933fdb6c0dae80599a6c58319dd0cc528cfcbb4b504eeacfa47506a320100ac51853aa524465c2b77b43d2df2ab526c00b2434fc0e8f62ff271ea4fdd82335e1a87c0fb69fcda339e0509b27ec8f2c2792ed0dc9123106bf7ad07b7819f00834f356daf3657e5262ad3f8fe9e738834ace594e84666016883b600214d97405c1cc6019af7e12a3dce6dc63aec6dd0d08e0c27a4e20652cbe0dc90ea5ce37a78662c150ab8545ebba21003efc0fcea75f928b3f68b308aeb897b7210ef101f6f1c45832eef353e2bbfcd98ae5c4e5d95f61756c0c0b2a3079642e5267da82c05564b2c561a6b171ac1cd5878af0e179dc84a04414678fea7cc2e6f6076d4af290f4947e032c697b575ff600ef4e199a7426fbbf806d5c9f6e6423c0626aefddd5108043a8617d4718576a3da7eed721d502887bbd4d8e8d1fc2c973ef89bc7c6e49f4ce2e5fc92e2f00607874c6c902775149c057a6e47b74567e4d6c84f3ce61c884cbb560ce7e2f39478ceba5f89836ba49dcc62073410cc904a30d12c9d3ac3c3279060978242c17d2f03ac24777c0f5bfc10de8cb7859bca22a97836b70466c379408bcfe59f0c13bb6a2ef96a052dc8805a2c1bcae61564915b3183e0756af3eefa8f78be6c3374e14a04dddf13c83d199c20d6fd4a448c3d4088cdbab8a937b05de9ffadab77c25c400baf75cc602761f3a8b60f253395451689ed4d0d5b8bd607d0516de120fb374c485368f789c3d2a5af8f634bb3e42ea3fc0fb7c42ffe620c1dd1d1ab83676b849bf5a6f8de8cc0324919850461e916f4d9e8b88280f260d7263b3b08a2311a041d5db23d6def6a131b444521ca31b5ef02a056261021c5d46d26ee06b437be1a31f17f5c427032b43cdfc30b572a88ac6c12bb1e9a7763c8278c01fc457cf43cef4eea1297205ce250369d4f24b86b06fe96f5d878703d61080efdc1fbc2cdbff55e6a8eaaf384f1a5e7d1d53a02e345f7cf2bfa52f11b6bf8f7bc9ee368e6475132daf7db311911a0cb25e59173e4ae9be2018736157c840e9a02f4e10ce393d6436ece222874737dfdebdb9f5a131aa2e78255b2e0854fc231905899f64cb3259b9400346f43e050623cc9a032f8faaa17d1b604c16cda14e162484bd1a3775dd0bb7ec5ec02613263e375a17750fef0e61af3384b2a31c907a7799e0c260566917c417c732199d9d92cacf38ec53dc9da1b86c091b1b0769f908b56f6e71ec7e7175d69fb1a9f02c72ec5f1ea20f1417a0f884fc2a62e9991efd5cc178e04cae8d7b9229323c9497db6e8b6b08cbff666141fcffc3487a0f28e4927ac4cad08f29760b6cb87b3a72e7e601f1db8652d5625b0b045312ce0177cc79c6f0d95aa8954a5bd05a80afd8b7a6aa54410c1c01769c95ff036c1fbf14c468a4b25298a5f1273fe92e18dde7881718ec6be99422c071cc5cccccd31f42f62422c40d6cccb02cbf4c8ee035beafac7d7faef0d087b132fea473c00720dbdb9f28cc9d22936dee6fd1366c66aa34853d6537c0fef78580036814b1018a3fd9465b400c25d51caa17d15355dcf5c73e0731a675bffbfffefffafaaafafbfbbf3f0ded1d76b6b6bffa2ddf814db66565849983e7744ce6906106d423935817485e76794819739d1c2caf3a900a2994e82245366bdda889881029a594016f04a8045604c20d7c8b5aff5201cf056317dc5d5c7a1af2e75ec1b680b77391c65b84817d1a45cb42c160908820cf5bd409f2f0e28a32a1a92f09f0e50c4d5992259849c37b8941c1b248a1be4dd18e5ea4c423629ac274a39f2314ef7bfc1ef16833252225ada3b9876bfbd6447bfc1e75fde3f7c8eaa8c667d503e80f77de97ffc3ea5bd479fc1683fe4501fac45bf1b1335715e50caa02494a60949908fae90192e240542d3e12463ce88bb6905f72ce39e7188cd523fef20283db98d77dff8bb6b06130d69b8fbedd43d0bcd4e6d8c7b2a761f373d424ba4b31d65014e5772f43c6c2dc33de1d4577dfea0c2d0f6618803d080e799f3577c0cc0c0d07c26861d6c15db4f69a8504b4d6da847444834ab9194b979e8fdf22b0678dd2ab0ffe1ebf4548bf7bfc16117d0bb3e7b2993137f5b839b0dd39dbe4adc7dee69c739b55b384c2276868ca29675d92b5d3c8cb0f9a1d1c5816f844d0ec18255930dc619173761155e92192db21821341c4b6f9264dd35c8968df622d362b2d1fbf4464dfa6e4c8b79aa6301de6f14b74e3dd30482dd0bb24cb0e68a610210da52a8efca4693af2add314a613057d2b8c915fa09fd704d1502818241231623737742af931fbca24251fbf2b8cfcf600e68710a9253452f5f0a89dbd2206cf9288770592ce3048c591ef8fdf1520be82c7af8ab86f67cc7a3ca8fe5dc0346f74d7805f187376b39b2aeec16019130cc6c4a4302d1f7b0ad3936e2014f3a29ca29fa6d72f0bb4d72a8efe127226e1438ab510630c70169a8b7b85e08a01087a59b4b030f409068723380f0e4970a0a826c5554cb156e499e9c193b3634347c6091ff0e5f038e77c88a3efbddb863a22e0e134a7b42711f05e18c0622cc94b70a893c6418088a11820970580c899a4ce82106188380bc6022201616e317fa1708948dcd77da20062e631e6e6242e314301e637eec443a8b81f10e17cb85945aec349f01137db20495228c59364d31317934500ca159ab93a2c1069965c341257ca0d6c90159fec88b204a20beaadc8e5c3ebeb84db93be9d26cce612ab70151858ad82a52d26436eae8d120950fa590185890ca320202a3e1d277c820088515c0c886998ee440b77cebd801886e7ce097c882ac194250dc855912040c89094c8d1254248882f44130aae1597986f602ba30ff78aebc2f5297189c405107390bce666b9ec26c4258542203d6123278ce3388ee3c833c7711cc771046ae1e203d1f79712977c85988e98cc5c6c4297ab01d1893bca103f64ae151805351cb90498dbe5ca7089580c03b952f240eb6a8aad4814255056a0784981e54061e20448c993be0f4d5f2ecf6f1b10a7b80820e6c84f4b329221d724b23519e19a58e212cb3213578a5b368970b15c0f0078b8790792fb8094244992244992244992048af1a42fe7a9014122462346cdc06d1dd7b1708bb22eec04b92a91eac7157339e880e800627672c4d579730f4004c24c7eb829b86944d86b63285c4a4baa58fcf83852638a0e1e2933da666c9d3dd9ab8391b18878b9c41ce2870b969d3c201680e8e64671d762642397888968b93eb80808c4dc83cc1d82b78401a699a61dede80e05feaebfcdae9f586c77549f5bafb1d6dbe87eee80eda9b5ce6ddfed763bb53d812fbcd3e6ec2f9b86666646283ccff354773b9b5d4737f8dda9bb1e2ad1807fec2d6976ad6ae07ff66de20a577085dcb50b5c214e0bb170850c2324181c82711e1cf2081b47b9176313a5bed7be7c49c497fd16bf86fc58f56616bdc6b16aecc7aa3413c9ab6fb6fcb5ad8a50ab17db4ac4ce4a886ebf55594e5f317f2559b272737a321557a541c9dc0aaaaba72224be23afaeb76bd815eceaca81820a09498b145f0eb35d0e213c9f3bdc91e3aaccd135dc91e3cda1f46dda9f6c1175cf1fb24fc54bf59371a059bf536d3f84c3b8253f0f5fd0f86918a48537fa78a729cc3bf54e814d597d2bfc11287eb2b79a54db9167c02a1d752f81e711f8ce14d48f2e82cd86d80258e6f3e66c66c31140a0c166c30b8cb081183df31dc03c7ea74efc7efc4e017d0bf3ef14cfd760c1b2628e056bb29630b2638da56176045684b57eb8b13681c291542c62ad7008bde1e81982a863974ca9e144ec08cbc6a6036485e3b152d16299a64e9031e505dba2058fa1ba1b24766e7c00aab282786285843d1af2026df5e9b1caed707320d13081894d229648b16e49fdb03ca442b05552588da0ac544aca88b04f6a6c16b2a52e14552b938db50c469223a9152c8928132844edac55575815726c10932326d4d4bd451f6bdad77a75a5235553e589e54262c95858b111b49ad910b192c8f22385950167e56d6d13c2a6fda8c91296c586a327c60c25d6cc68ad7202478d115b3572d6242a6c0a28889d20d4c686385b4f88ad6f5bec13aa9a1466ac3c4b2b0a2e581828d8291a3e32688050b3b206895bb592b0406e6b693557c69c7049d1c152d570d104c45dbd54c4cd28c1faccd0597dd0394561c39640299224c89232d7ebcc6a0d8b5a7338b1518aac10d11a2403687d65f0cc61919b639d9ae430b286588b61c6ee00638760ad576ed4588162a3925625456b8d1842c39c183d45eacea6b0269cb0288ee4b04501b276f1589f68154d0591d1e4058b959e2dd4d273680583f2615d40856057d0c1905ba19ad87873631372c67af5585b70ad34aa9844517962b592581d46abdbd088279f9da7102b171d4b2427a4c9eae48d05c286e44c450f1eae13aae2a2a69e3e246519b12386869c7c889c42ac4a74eb931cfba3c9f0c39b11b6a6b3b5478f158d8b6dabea1175e3894d2a62b48e0dad2660f8b04a3042b04ae8d61f39b22650de90d8d81367743dd62fae354b15eb238aad7b1291b44a1911199ad1e4f3a3298411ba754d2e45932b6f576c4b672f7a747161a962a544553d2149ba61c462883dc2e4b3ea600a5143856e18420e4b93a6b775081b0b772622357ba4909a5c2c11abb91b6b0a196b0ca6a1233687053be5c41ae5f32d36aba15bd23133b7f9beb8d2d37b2f528187128f8833c94a093369495099e4e64326bd3c63d2d80fd7fad949523f494d4944414a25be9d799283c12412267a48753e3c2429245024b8113bd646ca82485b18f62b45ea09228b587cc6229c10c74ac7823c45ad9f0c6327c8c34580e942d74a18baf7de9bf3f69b4402a96e03a5ec17098e73cecf5d5b6f8c244972875aed6898a669669487748444b45fa41e148bcf05ae85d76b49db8a696f71ec5f747d57aa1e3256dbdd31c6bf0d65df1d273f69a33b4efe51e5196ef273933bf15ed2f89a57ec153be226467356db1f07e1cbbc99418715e90d5751ce39b087813c7149f6d88c66b07923de426df630f0de860d3eab366437b116f26e76b2b781ece697e56833aa264e7ebe4726af58d08ffd26ffcb4bf05b99c7bd438bb41db3cceb9e3978c8bf559db7d0165c21f7167c01f70b36ecba2c7fb3994660e404571e7feba14a6bad73ce59ebacb55e80af2da1e9ec7a9c018ff978dc732f03fe8a7bdccb80a32cc148ac1e7722ae1b1d922adc0685d7dc70590e4ce6e3f1da10b71472d88b0eb70f887c40621c4b5fbbc1ab88c9ca38287b6194c75d35a2c192104a063b652e2b347881e1066fe57c781ccde1e5b5da92008dcff8da1264b9a8b0e0f628dc63b5bd77bef60466e5dbe3be7b19c814dfd3301665d85414205198691ab612e79b73bef9de9cefbd39e79be7325ffb7bea716fd1baf058c599035cb6a8cb1c6406ac1d79c3c4de30b4c7dd7cfc866585997162bb99102c7191f6e2f8a193c23621041622392a4b6212c832b7541630b8b030a56e0acd9fd79dc7dbfae7a05803c12358dbd7922ae3304bd8dc1b06f67befbd69865954fd65f625a40e0b69969afb6babf755a62780b564585082175a33529c205b2b416504aa88c44cae684912672a7d515f2b785f3ebc5d647b5171f9ea41611c45e05eefe965420fbf99a5579997168c199ae563ca02920488a7ab46093e42ae44d9a9810508960f48f1a2d165f5a48fc6708a8fc64f49876a6a8cc7d28db7abca0334b2e2122d33a3acb78b8a379385c9f1ddf16e71e970cdf8bd67fcdefbdd5137be5c4da54fc6f049cce397ebe73178fcee509272de35b7c0b703c6dee64c427e1ccdb590a72deccc4d0c3ca700818c210a34c3265b635b568f5fadaeac55e2d1963df738c769217ed542aa1343e706e43e544bf1e34ed4ead9d1fa706527f8c5b39c64b4b46030ab4889afac35115f593f7a825f1c2d6bebdb1910bacbf4aaa23aabb676112f341ade4b8c068fdf2ca42c1463632dcc92c48ecc42d8b9dc9d649a87696559253a18a163ee262042058a593dbaa7306916881f5d98f0154d8cb63544c362323c636938e98858a2028b8a0640d972a73cb140ea79e2335a7c4e1d82008198d2c2896d880059735c387888b481b83a415e11c1a0f1da573cbbab202f2b39d38a0ef53579590d29ad8eb4307995563a7c5661173079a96e6a60625b4e504e28c352d4ae9ea008794184d434c6e8f99668865e260c4c176259218156d5a4e346dab0c7dbf047ea7bfc62a57d9b0e7d60950dc9b0c0d0b06e60d1f85668b683e2209a978eec5c34c0f463a67b9be69c0d937eb0a5d7c2f206fe169202c3b607f9438e2994e630e087e51c5c81bb68604967840dc414921af9cce4733f876a2dcf1bebcc7d3bc79d43280ea2198cbdf3ac72cef98b75f4fcf953a02ecd8f2f98bfcdca4d83d439c8ec2590c7551cf79a739224494d344dd3ec2dcf3475b94dd3d45deb8ce573374dd3345b536bddd334fdcfbe4f9873b7c0df052e9430a096eade8220a4a80d0b31d2fadd43c8a5368b5ea603106282276f344da04dd979e72846c7310383e7ae9b642ebbcfd771cf07fc913df62c37da511eb0d751b43d7f64f7f5cc2b5b8eb6a5da4296bd6c01daf43aafcdcff370aa3f928781ab3f72b741a1b0a792fd57926a05b450b7c11db0d41fd4315de6efec641fc936f83af87aab37d997772850ac5f35b8c7af5ace9b8616f70631dbfbab830b1b279477d344f7eed216ca30b3a3e6366b46dea89f247b267b2ecb6e66b38cf639e538933d0e596adc907739e7dd699624d947b28f2874aa762fadbabeeca6d4ee639ad28f9d74a9c0c5a50763308a7916f43264ad2fd596a7b6255027463b766d93f6386492ece686f1eca7fe10360f263803820817e8800850a013d4a2495b90425f7817e81e4f87779a00e08d5d9bbd24bbee678f434e93faddcbd2ec6d307b99c71e87bd8154f9ce588f3e5f4fe658e51a6740b11e5f34a2c72f5acf7bd6a67ba3ca5111f0d58f3020448f81f43cfef13eeee48f2acf7bfea1e4796f5bb8076ef630fcb80ac4b86760d9319043fe8cf9d9abe9d5946a5be68dc3c94ef66ac88ebbcc8853f6b22c7b35b9a6fd953c7355e64d93fd3d4241b12e73e741e9eed8a6ec1d86d2963fbe6076de477ce1ecdc86dcf51378d372f60c6c776a9bb1c9969d2c3b49922539e6ce339dd2efbecb507cd9cd329dc76f76ad1fc0e337c8d1e3e46fcbf2cc65e627da71f8d84bdeae87a12c7f6517bed979a5892b946ab9cfed817fe6bd1ab397ea2fab1d43eea64deee5cfec6dc8bd547fa63a9665b97b2e7bd90a3b04a5372d9f7185dc7127a9a032da42bbbbccdc91c78f1fed777dec24ef42cbf94bce6a9aa299e793d7f21ef89b1d87ff1863c2c0a01957e0bd3e661f093739ee31aec071851e0f7893bf25777d5733aabbb39f26efece809243bdf71de7fa7ba4b20f9e325171291a1788ccaa03fde5be1e31f573908ff26c7edfecb5cfd6595034ec1e75e96d9d4bc6f9bd604ea8f83f073cf37f947d52677ddb52a83216f1fdcc974fec2e3772cecdf20416a579e845cc2b7bfdd851bed630717697eacc78e7f631f550ec2c75df8fc71af71b6642035e0f47a197ebd13f71ef026d79cbbc772536df35639901d6b90797d3646f5683779069cfcb977f8495bfe5afded6ef632c3efdcf59f07feb8dfb43c563bef26d798aa87ae7b2cef58f590bfec6d3543d977c0dfa97210bea90a65b430e3e44f35588fa06fe1da02c6bd872f8c2d4ffeee3d72c6c718e8219730e61c55e477e73ac47c10fd38769bb26f48df04baa3a806a26d0abe445bdab1e3e4adfe36ec8ef6addaa83668d7c016dd8076ddd1cfbd9b963701c6155ab48f3d567714e821bf465bccae7b1ad0b3ff6ef2e3ee817fee372d9fd59060a894eb59525ac7466a000083170000180c0808449220c771184ad9f614800757bc344c382016cd258128200883188861188602108461000682180882200a6548f003f85e541411b6f7471b1a1ee4a6cdfb49cf48f4591f13ee874fa9f232a5d44eabd4c87c1d205f6a00903ecbee47122c5ca0b18be7b0fb818f9d756a30e9e00d404cb5ea46551bc81c9e614c15146327275bec97ed50c2f544fffee7ff8ed6b08061e9cc05c10153276b97f0ef17741c1d8ad07eb404c309f8652872edb0d39444a00990803cdfdee637669f3fae13e4935e2a6a922d8a6f784f91152674ee3855b2e5cd1990bc55cfbfb873ef857c87578f6fdfb90eef871d3f600bc7f63d7c3aece8607286d531557cd220853fe1c298de71692bfe0c172c76f9cdad8826add82e8c4cba238a7f41107ae9af4f8783e606d310ca7cababdc418df67b26369d7de6b88d571e50e6d096d8e849f2dac495e5cfc6bfbe5663f5006b0caadfc8ec8fafaca1ecb8cba0be08d4c060a33c993b87076841465f7f83293163db7addd1af62142e8c6cee9bcfcf81c399b4ad3b9d62d5ef96cc04104ec77ca640757d832b922a1bc2d4095096faaa00880cb112a2d8e45007b619d7ca2361a405ae4957cae8a2f9a03a5608775c9945c075e6d5c2f41d6d62b948c0e42dd553515b8df55644d651ecaa7aa601823c22044529d41536eb8567d41a18f24cd3fb09d4c98ce54efaa9967341800ed6a8185e3069a96d8a9e697a0ffa36db4aa3d5c8cf23e2ac00f523668a74ffb6a1de8a072727909826e428fc3fb762d392a6dcec7013a0245e6eed232cd3e2a18216c8641b1755780f521c34f8de2da1517a10d5de9ab515bae26debc1f3655d3f813776dab6cedb4769c95a084c5d1925e98c775c46246625994736c1fbb896a097662ac1db103eb763dc9a668ded22c0cc21acd9016d88343f52287687616f0c38e319017671b3748c6c0f30c5dbeedf58f12561379c032ca14bf017470cf31a23d074cc489db23a6de39f0c5e18e020f20a98d7f03f61f53d256182da606404830b66276c30831daee9a91f00167cf5da9c9715301619240d2226883cbb92fb79d02b5e39ebef0f909d03b7b27ee5794c3b1bfc078a843c4ecc4bd2f915f561119a74a4ad8512650a04df8c187d046d31b2fa3c5e862f5bdd1e973d39f681b6c891cac92f5651e3b7d4e4f30d3239474da7d3ca70bd69546f9d3f6cbcc7f44cc6e59f25dc9a1272eb84d58a0a7ffbd736ad61c13fb3163215a11913fb41f99da192b475c7bce96e4ad03b5bd2a55a6d766be94f32ba27a5422412c316cc7c28721457a22ce80ee3f446a101a1034bcb73473dfdb2a8aeb1f03850a5cca5761c4980826fbdf51af22026a280dd249e792d378ff671cc22b90824a12568a73cc5f1c868de07047138c9129d617fc017631a884db3d64ddc7e9a6231750eb86a570cc3544c6f0eba237ea5c774d003c6308d2f88f70f49166c4072c80e2b007d3a4c186928179147955fcce494d8c9c7a408b5357774419d1d2a1dad407897ba4b05c68553660a0b8b065d9ffef5d075e3d3d14b2ca801045fbe70c58bb68826d2df3d6f528003e3e42c5f6d3b69c6f35646b174b994e34437e409c1dff487048dce054533f3b7abe0283df9987766c590736bf63489ab8b19100edeec60c63aab71032644d90804f4fa2ce97392da9967d0264288dbe71710b65d63cab3603f6c2f275c97044f524e365a1e1c8e81c7b31d5717eacde91f43d3013f4b070e7bed17ee79d15e31228d57f2fa216d048d4baeb9262a5f61f84192ca7db26b15c967be97c76012dbd1e8d43662dcea6fa741352714be061339548ca0c68378ef97e13f5261087c142d5683bb8f8a1a28f581ea059eb0fc38ac923cb0e8c2a34f05e10402c3c1293bc1b7924ced9f2bc56b88bb9c8fbeb8bbf15bae70f683c206ceb4eb5b359d0b75eb634e632e19b5fe557f3b65578eea6be42eebc61dd0879fcb00ee1333783b0c79f2cf4da2a9d461681cfa93895ddeaa9aadbaca8b45e22b35743277b045854ac7f113516a72bacfd6a32377eeba0e52bf0c81ce4dda698d6e3e20e9c36be2dd1f02e60e3bf2ef444dac33e8fdd7728a83b3ad3c8d3db359b4fd2501c055d1b1a9091d2fb73d6e28b48f59b7066f2053775f899a7e14ccb57e1f5e819241193da229e854acf42e1efd30536f62479938e929b53b48b8532a731754a72ed8522d680064c99264a33e56c39d155d1968b8e8d95aec87a4837595ea5041e652ec56eb1b255debec82207006bfb6918f64f7ef0d0554b4c0afcacadc93fd40b2d25f255eabddae6403bec77066fb5ffee53196efbe989abbbb5bc8121764664cce7cbfc7f4ec5f3fb222c526bc0d4673c613cec560a34ad303f815b555ca5cad5d11a16b7d81c4377d95802f446d056a52fcc2f3c2f9dc480425540f84fabab01725ac94de46131cbf4f833cb197ea434d1735bbe866dd17cdbbd60236d4ec00ce03873c2cb0040a9b3165afc8fe6ce46f541f9059b855587f8725e85145e21200883aafbce96b6a9a0aa78aaf7c668cf87d4227fc207636d5da1688f6ec2d1c2215e6f2a9782190b53cfb3fef21d4781ee6d5b85b37a346a8a9fe2bd9fd2d2abca315e3155c8f13bcab490b0275d51b0ed05c53329f3c3ba2acf7ea62fe944cd35deb84551eb4097484bef3293c615326d8eb77a0362b7562a6ab72656f08236efaa10f6154b29ee1482ed768553f1cb0c926882ef730153b16a1c6db73829ea65996d033d4ffccf89502f6147489e90499f910163524a86931c865e50b8d22b4830278d87dcf488d07c85c30f40f422a7638d050ba3992090573bf16f4c1941e27fa89214d6bd156cfb1164ce92fe280d0491ad55b2a857d34c4aa547a275adf2204b9821acbc184c3af85f12015fc8bdc0adc09ce428a17296615430403d5e4096d6ed61976605dcddf5a943f5801df3f2366128c5760cde4b833eeca14d98d9981c013ea3dc7780046f05158a83cf200464865fd8bcc27698dd67eba35be00a775c953dab80b385fb7b9e25355999fb81eb15f10cde7f66f1d56e8af346a8c93bc03b9b37891221e8ed4c60e1c781e8fdfde083f27ae4f2bee4c0e0f0d469717da67e7609a908b59af2c1f2b4617bf7258c39ba34bf2eb5662eb139480d8989605a5ac63443f1df914230d683dddf996d97a030f730b3646282ecce5533c775093988f6753a04051f48d6e2d2d31e42ecc855dfaeca45f2cd0707ad29ccbbeb09472dcaab43ebf3325c9dd8f8fa68f42fcc51b3c0a96368beefb39d048718c23ac99f7daa0eeef195c1d78e2e06c98847f6b442a9301705d824987c126e89af68c6d59e59f9e693e9882309885bf3edeb16f13cfc50fcddf1a69e32f44c19031ddc2091ec09b3d843a92a95daab0be16d9ffad2ca602851b90e0b3649a03bd3bec5a2da2c6e56eeca2631c5b3fa4e30ebebee3a877436bb558ec736d4b1b954f7ff5993c93c5c1ea199ea1450027cdfa1d5c349a3e48ec88fe22838beb2915211c1dd1a78472e467d8754342612b1dc5f9313cdd01c88557255edcdf36d907fe2afb8e2b714619a0a9756a138cc4e69fcdd4ad308215e83ea7f8086464ead1ca4597d16fff994f238a641355ca0a6c4b67c16437cacfd82e877c06b3099c26c36c9ea20dbddc220eb17c6dad630f6de63233687c18e512714e6c6c71aa83e5b9c1a60054f35afa4efb75e4c57b63c8771febdbab8e178504f644abdfec36884bd6fec33f2d2fafc6768b9b7c0df3e2fb75345e131a1415a8df35417257dfb6e01c4165be8f04fb71da80f1719c4452d5c89972e4d06e190460681c8c73192a13cef98cb6b86381e665e1a469b1dd441b8ab24c3e4c9c3a865cfab70001dfbd4238a9b1d8db81b81735264fc72b0559483ca575b033677d9dec4b0a44c0c2912812d4952e6bc947aca30fe64b4cbe88af69f04e31eccb9036c51c7cd79a03dd3f5190ca9faf87fdc12a0904e7d1c31747e91f59e75bd718c98ce219b4f7432237a8fea56d2c96f102081dcf576d423180918971c1f9b33df51b596be0483babf01129f031208904b88989cc34fb7b7ecc2bd2b53107eda07d5b90dc38b416bf917abe71635239988aaab931067ef8605739aedd3a4da09c41ad4fa46a6b2fc5028ea2f9f2bc70b7082cb67ee88bfffa32c8c2ab8cc5def1668b6f8a7ea007d21bf52e564fe1dc38677181b277a8dd7061171fe3b6cf3f73757042785fe354ed07c6eae19bf9842269fb3f9b374f94d32734bedca9532153ce78842b48400100c0edeadd8037f60193202935e1383b95619931a62fbd307f8cf2d747d70576db8599605724960dc1abb6a54481e0abc72ef2701aeb3b5cf0d94f60896c1c803ff84eb4ac92fd76ee1509aa6e9a6c4c62154291e4dfae4b39a4322af6789d4a3ca01ca7cf2a1ee1bf928995d8034e4bd0e5295858cbe29c3412c86c98de2c8fe8669cf6fa27ded9a49c8446fb557e7327780b5fd0dc5a38e9ddb10ddd303e4d4568f768150cd508a0cc5404cb93cca261cfaa8e7d018ed8b2ad2075ad1d031b75a6557262afc94b70a9764d6b84fc7b166339b1eca91f1ed848b8142464c1eac0ea57d54d8ef9438dfc8281db5f8ecbc81a5a1b18885625f3f1e399de0db5ad8aed44e1243870429b92d37f8c0c85e333f4c9ddaf79be49fe4b28cc328ced6cdbd960aadb3724fc1114e4f1ab1075f847bea2954252cfa683ea416dcf5c05377855881ba6261598e51966d8264123b621f77d555a50b67532aacbd94c47744fce402f356a67230620a87bfa7994541bf38b0cdb18ab7064d7b5cd4801d5e3287878cb42b9d8fa614f9a5752c01448f461babb7e9c52635abf6d5c0b226b2d6446504d79f1643b8fc97b424a407443c3000df11e1a25e443a36df0c2b6521844e3c21693179cea564528a5b3010292cb973640f9aed827f8c522a1882a18b2a2c1796c4ed4084dd1d7b55cd0657348d667fafe6891c4e6770ba57375f58c168d59c7113b617671473089d4c0ff3fc7ab805bf9904bf023eda650b205f7bdb9be8d70a0bc034a6509f3ef3b1f91b76c0b25203426a200db9410892bf2584ecf40632ff40d951c9ee4970b61555841a51d376f0ee593fbef34b9107f25c1bb4dd0b2acc100f824131e167c98d3aaac069719a4b321339422e8b35c039c897790cb95929a20370d810e8c1266d14038537e75d1d336504e3a148d2497d2a958c819d20b01facf9d17c7ae62e4b7f10ca931a8500a7bae0c288ed4a25121996262505538d8c41a92a558c5d84814f72e9db82c90391678504a9a43787c0e6e5bf8f07b6fe1a9f905d346ff40aa4603327474f085ed20d6b988c3da093fc021376063205f484d8b7d8460538a923d78752a5db048fdb34e424e472af6e81aca7619dcca8280826db0131c2822c122f3b4f50aa4ac0d0f4e9940cc3c36281d3b2445c7ae154aade364e3548c9bc2a040d7df7360dff1081a9dae42b0ee1e54133ce0ac294e38c643751958e09793abe0f807e0e96017714daaa5f9b44b3884e4d3bbb0f62a5faa09bff38cc7efccd3ccdbfb7d18ca228581e2733cf023f9acdb57e359a3ca275a615283dbf75059c882ef7fb5dd86f059d4345f75109151844a7c7a596d84bef5751dae1a95ead41a883acb38a26edc127b9e6d98ad42b5927e6ce36854fed55518f428eb023e0355efe1964ea3e6e76b6bb3eb6a9dc1fae5302063b136ad382665b3d53020b7e9b2e70a2ff5a1e541b6cb62b964401742e2175e13e0f09db56e10c8b4953dd20caa072814b10747c0abd89186857a7a9578906d3efbb01d6c751fee8537b9f607277a4a189a98e0e2242eca51006b2671a05a9fc4756c61c671aeb99bddfda0747ce2d17967430aa9d860221bc48c2f3bf09726886331f28a41e4c2c020e4ab941bbb53d63d71503201225c9e284427269571f80b393fe42548b5325f08ea9a66bf83395608bd8668b1fff31b470da7fd42ec24fcf438beddabc8d3456355b21b961d591b5db1672af40dc119414d3380ed34dffc706187a4ad825b0ef493535741c4d347dd59b1f859a404cabdd51b288440fd4efa9e8718230ac9714545bfbafac6199a3821067ea237bb4ddcf741a8aeb4f4d918f07720281506b4766b2c550bec69c711166f5517ba7d29b16130176ee8ee1dc4d99ae6025711a5bf571570c4fc412ce30067a29151737a6c2c9407df073e7e1a42d8fa6ddc0dec317dbb6b97800d43f93e5db7bf567e4148e4d78723d9d64fab1eb1ddf3159c75cbdbf50a7e5c2da56637cb1f57a5d71167152d72db070a770fc54b3b0f5312a93a7b0b340b3e882826678c6c61bacaab2e07392ace388ade4dc8e2a504a34ec70a07f5579788c704a7ae0245842dd06cce582bfd35f65c654fd36645b08c3f0cefd3ff43bfe34a383edc76afe867c19de476bcbf0ac515e1308ae34677200f806123c0638170fab2b5b640c1e91a0170ed607f45e409106c3d4639608818d639908a191f496ccbd98ca0d2d0911707fba83f49dc877ca680b562495ef53b1f42e0e86dc1894c7343a6784a1b0f07aa51c9c1bc0dc30d94b2757ac33d42572ada373468a18f830fa3c4df19e22686ec005290727db611e25501c5797007b24131bcd1bde4b600ea0a79035ff9936091ce69c63dca168cf15f42f18885fec23bb9424542aa0119201001a89a467f63a193a0dc8f241f280bf86c3ccf27f351019f343a710f9056683a80017fc2d6757f51bcfba6fa7d130dec3e68bcfac06278fd35d16a5522a210a590bb1a24490215619375bf9310f246e9c713732144294f4d038f27c3d90f93a86863d3431578eebf654b1afe554b2922f876db57ff0dc61f9113b203be2433f43449788222752528007236b4b3d515e103d8b24b07462c2be52550eede51203cd50ca7da875012f6036fa1b03f1bca1680349487907aa4740753c30543d99d2c0946a217bcf41c124eba6b187b8cb63396eae994067cbb26734a6e1777874ad5db918e9d31a93c5a4ef392c7e4342816c84895be4ee0147bbc6f8c7be189dd688505ddf515245953d5742ca8ab8050597711515cf64888e671aeac186d961ecd952170781e960ee711108b85a2ada26aef4f568f109de3fdd58980e770481902c3043acc8901f9c9226eec1090b6f4dfe5e910d812e20b9aa55d0f673414d34204b644f479ff0d0172f4001dd881368635e19feb7941f349d906fb4bf9cee20be4433e8fdfa19174aae1bdab52ff40d46d287211d77052d28da524517715d22abf12fbfdf4f6257e1158ead493843f6abbf11942bc6e39b97e0c1f3998289a628b8ca837b113addbe76dc8af626d8d3ca408fc0028f65f9f1ed2a5e7cb9d4a79c126a2135e6a746169037a8ea6d0ac3802481c17b86348c739f5a2ed30c99be2292ed6c6c224fb5c2d594ed113d64278143fae4e04dfbd009a7c39e165ebb01f264ad74bf712391fe9a24a85e023611c926d6c07473ebd5de6192913cc7280446c87a20aabeabc869ddd8a36aec71c11e070672d9312d8e340dc117923f82e4049ec4f47e46bb7b22fabc721426ac04e91a6555dd223859f3c4f206876779427bce66d4b23e52d44563799cfe0341f396caf0c8be4a051b9515fb45ee68bfb9bf1663064ad10bf6e661e0f2415a0e135082d441b930ff4d4c0b060cc932c80efc9b4e4b17cdb33033386ec4df00bd1d3406c379c49f104d1a1dd88c510d580ee305931284df595ad28d8d9f8bf182c9df2fa27e0b2f220dd5490611ec57118acd4f6f6693a53ba757cc6f5a18f33c309bde7e38f8b1228ba24d3fc520ed6ae4f424d90c7a206b5bd55c8baa51fcc710885f0797e0347a6a69337321bf406ce0fa5e70fbc7631d14f3d2c2bc14726009e1b8aeca3581c407a0df3e3820f3e60bc1e2d2c0071e6c14c65b385673ef6d47ca4b90b643ade60af3a7c597734eb154cb9e9452c1a1a7407d38a58d28cc76777563c90b980c9522359d5f0c372dec7c11857212e43f7e91667192319f3279447e09709793aba09f61c5dbdef79e524be688661fdd8fe41f5f1b1236f77bbee8c87386ae2581dc19cbd3aee941235641b19ec66b7482ad96128dbdb5a88b6fb828b90a8681327aaf2813a44bddf12e6640a814ed6d82b04fc19b05316118854c9f0a080d19ac6aa2c01764e390f92238a5457e2a8fd3415e83207395e9f871c91b768d70ca39dd87eede26350cf30c67b79e17a024576223364b4a3400bd9b7763ca216d28e1fff2e3853c963c37a7f7bec0183951e939d9cc9028cb3576c17dc6e24be75c027e1d524a3fbc39ccdd355873a810bf68ab37811f2d36b24a7132daf0eacfe568456bf743f3546ca7ec2f158413ba7034a5e1c28f9694119b650baf834fdff10cb3c2d8e786c4453a44bcb533003dbabc326072d3b4d01ed6f0b8e0f1f7e6ea759987221fc3bbc57c14353bba3c2b257ec6f24f9c8ef4dcc265fe9b05c89b5bcb6f0f36555d7432c6f171dfd6a58d2d835e0cf4722724972ef8dd2099397858af139cad5a1c1d0505ad925cf93d82823a622590c69a81624c31733b88b59fcc5059d43ca84df2fd4c5ef65b4bf96a3c6a94cea950d77bf31e14b15fa67ac4e70cb55f118c7d1af0e4df308b097af4ddcd4406cd2d19e7cc52fbb340fb1eaf964411dd0a05a6050ce8eb6eaa58ddb1f89f03850a43baaafc729c05abe067d523b3d8981be298b5e4918db164880c74b82ef23b09d07313a271a88f9d2410ff2acf104b054ffd6f2242cc1ab9808bd381d2e16d439120dfc7ed3c02a5adaf34092cf488ade99cbfe9995dfdcce6ebea7cd1330c5199e06868472cba671b315ff8c6f4a94dfee282147980ad421a8b98712ed3e22db2202d1733287ce338cdbbb6201faa1379dbd4cfaea3e8fbee6880687c928e5f7f8c1a82c5cc9d349e717b8273bcf32507a777e81c184114923304fbb539f4e64d49731a7cbdc09f51d51ea0f6ef204facd71b76aaf858ab63900112a15516654dca80564a5877be01868f72bdaec9a307615322712fc26035b1a73f449f85a7be7e67178382eec981f741a2472c33b8a159ac39c7f7a1b5498bd5251b396e497c298570645219aa08b0e60964e35c2b4098ba6dac114b3b080b5a4425cea270642784eb9fdc1facd64b44f17e108795278010d661207fba8d11e5d2a5d451aa3cb930bb68fae2e41aaf7321a550dacf644456c0813a05a0fc9581ef01f4498e9509bfa54d7539796417681d89a467d25ef5f839dd473336e892c1866902ee6ce6553605039851c7faf9453f08fc82b21063c6fcb4c3c16072d32f864cd9bff981e541ff6b471fbe7f7dc5f11df9382b08507688857f6b7916f5dbd217e013c18d910afeca7463ada9aaa1ddfbf572a4d6ab4cad4af1805fcc77e1fe215725f37f0e0f0bd22e6895c20656dcbbed077de8c044e15d065818374bdc2a3354e9005d7c1831040503b4e47eea68d41b168a6ba77162d98cf271f560f0da1daeddee0945bac29d0163d91d5312ab4bedf01980301b267346cce9ec31bcbbfe3e10611de415a91a4e4e3dca241b1929e26a9d811e147bc26138de45c97aa72cdc36932b501476702bcf55279f832595babb0ce127b2983186b39dc95fec0909311a4fe5a106e7c9a0f7f3b64df3f8154b19ca5fb3ee82aff0ee9b1f735cfc877cb89c3f72c9f7e48c3b22f48de8796517e2d8e6ae04eef599780c03abcd6c523d603ad1c45577d49c2e96b7f40014f3fd6ac53496a2497f12a2bfbd8dcb4473909bc2989dce3fc2b612c7ca05f6fef8b9b0c15d198cc9d8d789e137de0be0583877380ff185787752cfc93bde45b990400a6a0dc301982d86ea16c1ccde5cc7541021574543afa2467080fa60d31139aefb235ac8b1949eff26e4bad2dae34f0e2413540e0b70e3b6766f6597966ff4a0f6f733de31d689f061682e0d9905374207e968cfbbe9d7cfa8f9c60c1364258246ae91f7965dcae324d907a1084c507b1cdc3a14c4336ac8a29b06d69570e3686d74668166309473163477cb9056284deb36f36c01a6cbc61f6b3b827493c7d06d60b11388178b7cde7781ad4e238d31bf0c060c92b03276d7415662882d85403b922b123c14d2668dd90aa5f9362f9190ae1599fac2863bdf8102eec0cd2a5899ebba7463756e9784313dfc86f2e24706187ee97aff80cd99f5da8f57ac0a8ac8a7dd46d069b7ee055ea360852b5a6a1cb627c5a448f21c2e8f46ee34529280c55474ebc0d91d51045ff9dec7230cc5456fdd985635e44f6f2bc099016d041c156ad03b2ed011aeb34d0926b5ea3990646d21f7babe63f92ab35a275d9d990d5d62145eae6e52f3fec08862da741bda2524a1ad16db2fda0d122fed3f054f55240f0381df87e86240ba9f1019c0784723daaea09394be95e57d6e8ae65cba86482971044a764a7b8503b3d228afdaaecf5bebf704b7661e1d7f187b1fc6d5e66ba52c4fa672cfc8e04b3a4f7d6e798e96966272f7e571747d559f1ee15725a07a98cab3b5f9d9bf6a576626bc00c2b34981b01858c03a61fbc34b4e04513ea6bac9fddd44244a85a64db057427c9b8525e74cc3a0bb7f425978b046b6cc203eaaa703a7ed97cb8b1c9d357c001b3f6eb3f86134a4c57aa9db6d6535def3567e4a56a29d9bfe65544c49c5914fc9a5558010af3445b92660f6ba08108062e426cf5900f49830e12df860bb2986cefc7df4f4ebe2438e894dfed41518d0110ac3b2b0fc202a8358e1ccdc838eecb7d7c98035ca06deeeffc1da1c48c663ceb58787da54ce7aba582b9451a67d89ef43c705b6f798c474fc6e87c34fc598c2a839f36d464183b904b525f4ca8811da45e0c5d4bad44bf6731b2ac80cb3599303a4e2671404c9031e737d0de418f7a5cace9945ea356bc88ba53a3de26e1995e46d8591709d3cba7f7204b609c5de55914d496809c970d88a1e6e5b35f704eb0ff7a8dc3ee3a06d8cb935a4d075165e430b2f4570f27c02a0585c5eca052bbe94176227ccd4d99d4282dfc70c0cab0b1dbb91aba30c7c1f87b6dd9afb01907fa3e5237c1cc7434480edbe3a06f663fd406ade1e9d983faddf7be9b29336bd15dfe037f5e139eeb04ef24547e6b71073d1c6c7d3752a3b4c5c57d5c5140ede07f22f833f26b392f7e6887e25f89961e4accb362787820c58c4a360b8ef352b54763857c660ccf5206eabec98c7bfef9331cfe34af7d1542ad0a6c827c89afc375490c2966d29144577f932add267e7e8b990cc6604d33d5b76e14846be76664d9613920a245281c82b0ec6a4571b1f65bcf4aef283e9376e39cf32aba9cc4ce95950cd8142dabb0b68abc4c16cce9c071dd359450177bafac59c72451594f494b3702f435c690b645ec3dc4e11d33d1538f3b228f3b33e1eb2b0aa7339b965a7c95ea0f7188fcae85e975b7cd7d011a11e0757bb53936715d83c99e4881be95856c9a876d35e2e218754becd86f9ae77a7d758eac36e20d40292736d182a4922c6bade054ff288c03958c27925f2cd9c21e73bcfedbb9d2a05439d1a2ca6bf639bae68659a4fe587e536872af74b3b5f538bc92d25c652a0b9de5dcae80c9921a6b4b3afc4878ddf826ba1a6f2d82e31da4d59725e9624edf6b4041f91681c3d6e0914d52d84eb230c214471d52f9c627ed0e8fe228249ae646be3940726088da1cb04b16589788ade063627b05068d4786bbab3deb9576477407b463a23b6aa2a268e190b22f3447e29a03a403cc71a18ed342d29ee29623dc1140220971401d450582195a570b4919cd28cb62e7344a093907114b5a0522eb4857f720b5a63c8173a48524d29a45dc0200cd1bf17388e310ef107188e6087147d9112d7d93913fed53c0bfc3ac88f69df8e118c7318a438b1dc6809cb824e46a4ea41813b32f17787b098707ae9785beb13efe59484034a104c411b51d44ea342119704721b4348332200eb2b534018150c7f869698302eaa8eda071d43fa82537cbafa42efd629e8085a0f944525804f906d26ac137009fb62df839b81d1c386677c87de12eadf1add6d5576f6ba68c494a74c741a495c6eb729a8ed6ab64444753155d1cad1dc8ea20a92d271105534b81ad8d464f32f242738b1b0e1047288b1bb15d308e886aefcf384ad9681aac4034122db8a95a68b16bae734967d4481b0e280784748d4f44e99f4351846178c1f58c569585c89c462123ef20045946462a315531783ef8c8a5d0688d62fe3d9026dec4227f9a47f28b0347ae800d3131c95c0eb1ec3897855694145a94039359b98af3fddc19457e6742b2eb60a96d1df9e4b447be3b5fa57f68d7fe34d768f1488d10e234162601676f1acbcb9543f3287ea7b5b7ae7f519dc1622fb39c47b9e7a5098ed65b0334e7fccef4011bab138e23dca711d3771c594874692ac8e83a8c65d1548d90b5a399aa1cab475b11d8718cb468ea451707bba315c77647bb833d87b0761461d3685dcaead0685d6644fbc8d4d6d1a344d19ed1a890f91c571d2e1d65f1a8fe9568522c64512543019fa0d49d1984529a9eb6263a39d81cde1621bb2a21445b9376d8d26a14adb1c810988a3c83b31360a3133443b9c291ebc8c9f1381d2b82a785818c58d20cc5da91eb405c83daf92296d775ccbf4d5395dd0e761ccf0a56b9dd7247b20d67711245831188c28281f01b82721a8d569ad03b4c6a2472f58ef9cf69e588d43a2ccb4c2b2549abc12d9346ed81f1265bd55bca156858552c9fe47c0548e38cd4dba896d12316a3a74714c041768ce641e02f8278f64e54f875a4310ab7c31f8e1f0e3f0ef1ed38ed4f6314ee8e1fc7bfe3fd3bcafe69cc202339348692dd0e123f8d980a215d5a934817c7881f0d18a46c078d91405747fa7f1aa3206747d91f8d1864a493c628387280afe310f711d25bad8dda4afe56ac3958914d46ab28f20eeb1c568ebbb20989ba4de41e70cc28774f915bd016773283487d87b9239823ac2693aae5f56a0e6d93244e47912e4d5bf070440747695cda96a8bc0e6f8243f36d21c1a391b69c96a76d0b6e47178ec08980ec066d1493a000da77e2fe8e2263344ff9cfb1638eb223b49e647c3acc8e69dee2874334fade6b455c6d028a923d4c5b50d41da5036a7830f8808fcc72481756b74e3c50ec1e62685a639b979b0d668e54de513942b69d2a7a9a2dd799f80198376b14408c31836c420d41c0035f92a6ca63fcbf5fa9e26c953c947198c6d16cf7277b6fb2a59432a594523805750457044d449198d6b4dc66ccd0716f25312284f45b3db41efb4a83332acdb2b00aabaa0aaeaf55bd25884088ed90be7a8b84c1d576a18661d7b5cea9ea077ef50ec301e515311e4b0e059d704a4f924340224e49faf001e4719c2e801f880d0ed404f0af36803f6a3372acaa776d17425f391414714a4e66efc395cfc18f3b500ef9ea563d54929c8263ddcccc7e3189882b32dac2fb33560c136ad5b47608c3306109a6e5239896bb4230ad079f16192999abbde99a56311234a1d646472602a6166539c2b4f85acc06a6356ef9cfb822257a4cf72727d3892bf3f5bbe9b60bde78328763444ef9d6c27b1bf729f7348e63bcef694116ffe9c409a50a7bc5f4ff79b28bb591537a59219244097c6d8264ea43f8fa55b6bc11284274a0615ad5b599d6f0eb2892c1d77fdf3d23467903670ec7a81a7a4eebdf70aa6748a635640ea77ad31f7df811c3a1f2da1f7803be62382015572602a61671842073b11c580e28bd6fa686e5580931e5940f0c3baeb9dfd8ceb6bf213b38710121c466599e5c4008d1d3a387284864d9a1079accc40b84cd0e7f42cd645b663aedf20a21824a11459b44d681227091e2888a234c61842e3b4042f3a05dca0671c58699796edded527e444104289a60628b9656c20521106558b8b8142780e871a1c785279e5862892774e7142874a50ea34ce7fe76290ba6ec1336bacb595830775fa74ccde10a2b8ea40445f143101453b8e81ec124c77eb70538a59b3a31f38fc9d6e4f7fe61da20451098a8a2c50a910e6468c2cccc59672c430e6c7899b034313373c6ccccccf105d304cd87a982efee97a2bfbf311bcafa4ba8f6767747145c331be0809979090e4afa067d744377b70dbe8adf245c850d7ff435e03faa6169d8ee6e1a6cd6249bc1365919ec22591b8666e8ee8ec11166e6ac490603ddddcd9ac8d02f68231d4317691734916e010bbabb7b05dddd3da4bbbb55d0dddd29e8ee6e147477370c275813fcd812fc58213f96043f76043f44102404422008fa2a7e3fc0ccdcbc581540f6c7fad817d603ebc2f6b8c28a25ac12b68a4dc22261a9d8234cd1c408bbbb4dba14818b1447518080083fa0f8f1c40f277e34f183891f5b7e68f9b1c40f258c3a0b8e2ea636dc062c495c41e20823daca10aa14516413c58608b6894245084304418820a60021e5878d2283ec03507ce8e1090f40d8c1890e20b841a63fe8f191e904810f7090649bcfdd0f644f78085abe21d32838467c8097874ce793a02efd5abab71c75b710acc5ea29c2f6f0c0cc3d4be420882b91f137c9f8bb3b885116255894644149dce04a1684c40d8fe48fb041f6488c5062e50643a85244111149a82411c21041b041081b82a8c1141a804822c5861f98f06e86c490c97f45c9c9f1b7f47b8664fddbcd6cd92d2d0005073e2ce90107de23800061a877c836356aadd9d75124f387935f799453db063438a1cb1b4ec525da8562d9870e00e107d90cedddddfdaedb7d3043b65d52870b7ac68c120f9c50c21b8d67113249538398fa57267bb873e2a40e1d64fcebdc931862faa31c8a2fd11fa1830b7430838fb5d9dd1e1ecc20dbe24c4a867bf68561b3577670246ba26c5f470f82b889d4e183e8c3890e3a7e90698f073c12b5d034cc2d2a3a32777b72906d6ad46fb5a6c348364fa819ad21808e18b26c89f8052639e0e005bc4bb22d461d30c8b6d3a965f43313714a9f61c4c0294025d3cff6e32e510f0ed9a6464e30456127cb2d85b9d978105467e440806558af16b800cb28bd3e0676b00cecd59280071a46378c7e4b23691b6018373518467fcf3e3dd9ee68bb991dab10d9321130b54a0b9e4cabaf2632b70b154f48c003d9cda67a6cc85c6e6a34370ef64d3fd72db09cbe74295c395a6c07befec21dedf7b6dd9ffd7d11c64bb1851f372e89e41e8f191f623b108b5ac34b22555bedaea63bf1498f184f9443500e596fc158edd3a7d129d47defc1b7bbfb225f5d987906cdcccc35d8a7623a3e9910e24a90bcdfdef78db17ad57baf77e1ca1c19f53d793196e3c9c85b0b53f6eb28d26f5755d55909bc3b36d84d2d3930bfc32a96077e93d63433af5badf1ee08ecb22cba724539d54958feee8e61bbbf7edd1d91285a5983398b298b5984316a10c6f51bac185f64a6fdf66ab51817fa6ab1f4fb6ac2c764aef282a3f95ea566f13cecc67bbda1b30f2bb9e9afb0d34ddb7ee494dbf490dde95ec65caccd76dfdbd5b9bbeb196be9eed65e44ad799abef73558dd73d5e6c6c1d2d774eedfecaebafbeeaeebb2afbbbbaeaaababbbf3bda1957842d7b508710a50c9fe94315114dc4f003b694d0e4c6bfa2fad69f72c84e5aeeebeebde53a7ea54abb4a6866c85c859b9a5d0db23b0a00e1a64fd7ec3291b5762e0eed1ba184d218fdaa8340877611ec23c0c8cbfca88f1b8219827d1d0b8199a2be58019fa6ec6ba5579f33ce65c0ed371d239f7d87e8d76339c721a8ea1349cf298777228c65d9bbeca1ff74ec695de188f5ed9dcc7683e621ec8e3d4f02b5d3ac6e386622c388420bf3a70bec8a1ee55da80d60fc5c887dde069dd64bfd92460012f2fcfcf80f7f2d68ba63cf07533d053051e3de6cbd790a138987ba8551f0188f3c25e8103f32f72e810ccab1c9a98ff52a04bb6c567941635a7c16835186ad593e48c1b184a6385880045610587eec11937ec6486d6f0cfe0179609c23936122c77226857951efc39fd5c84931beb2aacdd730e717c0ec78e4b58474fc61496425b0e426c27bebe735bbd35c3b9aab2a0052174eaaab98dc7acdea95b6739cb22399273ceb11df8e370389eeafa78edfe6a03567fdc6503b2fe0ce720437e4f2f27bd3c4e9d5377bdab0575e1259561ec6252ab18f87d1276ce39f75e13d0eff89784e1e0ada22e7749fd693b81441ce79c73f9ba7ba7fb411cd7746a4dbf23b21cccaf1c7a51d5ec4536633854d6688510bae554e550e90a134f8eb857393e20ce0b3c7ae0949e84dd805385a1d25b7b69e959589cd23bb6a339d6c278e450c961f1316df32d4eec7acefe3488fdd330ccdf93391b7ce594fe0ffc07a57455b94ebbe2537f0f73ccb11b104ed51d7d88e580d265e4b93e0396a6028f1e93245fb8bf993f549219c3e0af64d41183ecd21af8ac345668456185d364a73990fb43e99a99891c263374980d1d451ade70ca9ff38bb11fb4bfa9302264d7dd9d479100926c0973b5024c86b258e66a2f66635e654a0e7335391de355750e96566bd6bb862b498c08f96bbf6a52a59122a9d262bc2e7fc776fcab87aef1b0d85d7ee95c56655555e59c7ad53f2c074956f2e2d4c31e6297f3f7ded3c664c0a4320c8bdf0c47fc57c8cbfb21eba3e6e38514486f69418fb3cc9035affe613bfa2ea3bcb61b9ea1a0134ef52a87a2041271aaee5f6d403ffdd72afd77fc955335d8a915381c83dd638a82eb3141e6749c330cee611db9d9a5a551da13fabb9f1330043146f8e40aed092ee3981eb8ea3ef8dc2e1596ae0e8640e0d930e0bd77b914de63e0fd8e7709f1ebb252294ebd5df9ebe323db9f49a150a6a851e08a2c7ea58019258a530fc894b94ff3fe886239dc5fdb6fd1f5ee6c4e0e5f4be3c669399c7a3753f630bf6cf676c920fd7b0cb40c929cd902c4326c6820c0324e37ee379db25ddb23e28072f78727d2bb138904218424773ff9bb93bbc32a9e5033eeee2e83cd0816aef27bfdb234737b0331795b8bbf26821d6f41655996bda7eaa62c7badaaba11505597eccd2f0a3333337777373373962106d043b6bbcb362e836e6e2f62a3edee45d4db59d0ddcdcdbeddbedc5c5c8a8d37b1eb9899b915097666564581b50c7b9d83ba707763177165e6cefa08ee1c3bbb6aa6ba0276e79c73ceed093533af58cc0b5999e1c2558e7021fc279bdd99ddd904ade93fa1fc994ea8999662e4dd5b7298ddbdfb6f7b9ff61e9c4fd739e7dca53571dd09cfd2a454e44f5a59b933cf6832136adb48486fe7f0fc4b09bb2c5215e173de8ce51080ba2beae42777d309c54e0acbdbb3eca9ab9b32cfdc5d992633a190b0ba93203277954dd01ad4099eda31774ff1022589b5eb1a333be79973ebfb32e7f8ea179d99af759acc84f2d84f8ae5aeeaaf5f7f96adbbf79eb4869979d7693213cafae1c90b9dbbea1c43c8acc1c91e39f23b2d46f742a7b2b2ee8bce49eda6c94ca8784561ca366bc7349909c549983276ddcccd349909c554babb793233a34ebcdddccccddebc326426d5b76f754ea5c94c282e2ea58bac5de5d4e2a05bd7d9d9fdc4bbccccbdcbccd7114cfc74e5c8ec476d33b3bbc7d7c4467b77d77442cd4cf102c58d685777f7554e412b1247bbfceaea7b7a27e67ddddd7d839d5e5ac339f89d7c6d3aa166baff396f67659a32d70ba335a62c459399505c5c0a11ebc549278a53abbbada853bbbbf69efaaab2a7c0eaeeeeeeee3ec248e50cebc0bcecea4658d1c829b681e5235e4be3cd969b4df7bb1bc1a45f59982d67b4669f00eabbbbbbefcdeb025e26ac6e2b4370a05f6091e25ecebea66a96a912684ef102858b8daaaa3452e8ef75d6b5cd59984afa16a6babe54f5295ea0b8234a921811f25e5555bfed1e250b8b533dc476fc7ff69d741ddfe5502581449cc8c28526801f461b304d1c43bb7785d80409633c976236541dc529f6573404229deeebbdd74e00ad393d20ddadccdccaccdddd7df4a25572587d1b07e6a535fa3a2d6d38d5fa2b7f56794c27d40cfbc0d26d82446d3ae7849a39b96d77870eddfd3117116432affa7b9aadaae9849a794547a2bef3e1c8872b3696db7d1ba38cafb11cea2e3641c43c04f7703e6386c76b6938206f13645127ea5a31515a1300add11183a3c94ca82df2b960711196a259948495b933cea8eadeddc5ab8467a87a9643f0df739b43c9c2e23c7f87c3653b8c6788e5d09340220eccc9e9df9c9d9f5c21f23b77ef70d48d5d5aa9c348b64d7dc0fb7d3569cd5e0c8385d6ec3f1e60b49a490fdfbfb92149ab2a12894482ce3d84ae8af0ba2ccb415845e70e3af820f65c073b5226445942c98e54912bf2ee227697bbbb9d7b42d0833e291161c2459f14796f333313713a80106640e5e440be0335d3830962b00345c5dddd1d0a6883d87135113d21d8a8c4b6d16ec37beae498989898189877fd3072dbf978fc2acab61d66c369efbde7fe3dc76cc0c824ce39468c924dd2fdb6f0583346db245da601a6161d4591c2c834616a91143ea6d5978be24fda09e7b0d3c9244e2e134ef503c06d3e1d4f18ecc69a7ecb9ec52bb388f97dd7323112a867cc93fee5b7ea49f2e55bab00519649a096403dad5f9d1f7f9f2d7f62beffe5b7ec5fe4a645f35912a83309d413e6dd7c31f207e61b078cfcf177b3b785c678dc74d94cdcbb786573dd6a15f48a2baeb062f6b75cc1adb7beb10a54c9f687643efbc674de6f246995e65ab4b421995f997f79d14a5b76c37ad7e297a28ce6a30652755d596bb2b5257b427fbbf7741edd42c62f457a898204a99597f71612c27c848260bd3e413e413e41432207350c472116116e1c642e472eb9fce18f2427918286604d2205092161ce414cddbfb12461ad564818568a7285a24f106973f1efb1c65a48c8450b87edbe2d5ac8b22c228ecc1cb107b127596fd2ae97871816532a758c905ab1482412894412827d9584848482545028666560e8ea7d99b82cbe4e0b32bf5cae647409138ec15b2aae54e615e62dabd4ddaca6ee52c985c9b46469f473e95bbca985dc786adb32996c7221f9da9661b6f4d76fc5fcd8c98f4c55550a7f952c8dea2111b78ccc57b07f2b3db3dc96c97c7f3db704e29204e259f16fa66596f995f96a6b98e5afe46acdf2c5f52d23c3aaaae25f25dcbdb5f8f7db3299f065b865bed430e677490b175b0b17d5fff44bf5dfd58bdc2598b4b6944aa5d225f394ccea21a623f3cc428395f6ac97918991312bed66bb25b9a55db21b1073694ba56b77c99eb0e3f29965d7632f972cc9abf4ae84c95db2347697ec125f26bb8445112d20c330dda8b27c3806fc5209fec2eec5b272b1ec09f0314c677de0fbfbc07ef81766033a66c3492df8b44fb7dca3f98379c9dd87fdb95483b194e243c858843062fd1b5cf8f1b187fe7cdc7ddc7ddc8f7e18c2f70db73c8fcc0fd7a8ff45b846f3fde9fd4d3091599c7ed32b97fbb70661de844987fd0f42e8cc4646b39fd4825b748b86debdddb285c310b11823c6fb241f4e41f99e8576fd4973f126ede561b4ec4b9a1523b325e6a7baa6f5db8e6bdb71c5df803a46991898c5be04d3fd72692e34df71a9151f231896b1220a22f3a71641411464da4c2d22829509050d4e28a1cbbc26fcf745474445473e8aa218a2280a1a8aa2301292bd7e7c798b44daad5e29c6ab7456affdaa5769a5b7acedea7ddef78ff53ce6abaeb7aa0a5632af82fcb9dee281fb73bdf5d37a18b9f1bc6064e406c496bc7e576e2db0c0e3555b077a730fc4f3ed836f59414be37dc3e02a58fae700500125bf5592a42483f2b74b02f17cd56f0e0647e9fb696ced57f285f58de3fdfe56bf4115849be9dd975e301d58fa52efbb078049caf4832bf3fe07f6939b0648a4bd2c4bd3795d572968be87984ee9ab188df4301af6acb1f8a7b9571f4ebd64b3b2f665ad17a1a5b101c10aca9ff8efabdfaa5fe71450c77fe917f04befde3b20161aa656a6bba425643de97d849686da20398c0199e6a874eddb26a95323020000450193160000180c08074422d1789ac549d2e50314000e71944868542e8e47429120c6410c06310cc2200860082184010090610a12c406f1aa297d7058837f8b1b6ba6a3b8da89d1f84a5aa68b30e13d60385e72130b19bef353782d285777e3bd89d566e9052d618c076c4c808e8500728c8f263a684805390b015d0acdfbce444428b4cbfb0f86a096e182ba0791435a78ad3dbd979bf5724751718fc17e493b7bd46a4c5151462999718751b334a9b008287b845d690e402665510ae7dc076e317093071a124bc8174783f64a5b7d8e745ae5c15166fabedb2bf5b747fb077332f64217482da436a5fb07ba04a95cd6931ede4c49c1021eeadd3b99c01be9461087682e8cbcfc22e0356a558965f15425002f19baa154a91c6ff1fb49aa6e207ba3d6d0741af75ac4034dbbefa51eb864f631084ae52be461002f6f6e8208539d893d6672ba87cf7df15a40878ca5f90782498f7a24db0365ca3af222b1e5c51a7065ef2e582a19fa29cc43bb45d58198ca7179976ad19587758125487c092826a557702c42741466d2d6a2d4e341fdd4fb54ae27b63eb3779151a080d0f83d01bb1b6d17bc62a79aac957200a35828c9c2f2c4007d474a70f84bf8bc5e099938c89c821ee590c6094ca0a1bb517b2f5375eb4fc18f852631266cf9f198566cfa47c02c04df6489964ba4e76012a1ef892d5488256fde05fb9159ab0df7f5be07661c81e400d9dde857733ba854fb80b1d0eb88c08490951e422e08fb3e8ff9c36587d2a368ac38febda8643f72ba3da01ae40e32bda8c30b3d3e04f9316c4d0218c7bb76e38c00666d68f5d0f851081cbc539d666f27282a877c33926ec27b1a2a72f53a6d4f49e924cf03b6c93234e8addc105a576a3a245d155571a7e57ade80a5eaae159affadd15307a1fdf323ebd23bfdd0d41df1ab9892a1bc612c95d85a73749e2577999523d279015efea0c24817036df00c1d3b0e0f24171651f8e371b98c1c041698571975608392b8da919886024c379bcb3bd654173c928b169d6442dc342d87a587c7098b6b1fda20fab51f7490a56e2110204efecd23031460ed27b558f93b03e30316436b0864d7ec293fb36e78c9cd36c48c6e348b38f1085c2ced5c7953e8944ee44094d88f46d159b1e356650d22c3eae2510c821ccdfa28f074cbb487abba532896739b645a4084556515565fe82e0e94593cef402bf53b290061303509286c9fa877e1920b9feefc52697b99c4e2e2359c86e5d380123a184ec5c8a539fc1c14b4360fd0a1701db54820bda9385cc04ecf9cd839f1855ce143789da8752b4d10f49c1625745413776030ac05ed42e0920e1f46f1f0fe9a07e14220e3024e8f1a6a83a4874d840c1e92064360b25b18ea5508620952186ee4bb268cdcee469e32c41902314b6808341ee860598eef790d81a3aa6dcc817657d882e1530a41e0f0c8542d71f0136678678e4f6143e00a3ed6566a56f861b9f1f16bb854a85b3719fda4a9bfbdb021d06c157023086ac699e1fe5a39b061bd2078d2d0a8432037902ccc2499e61d02338139509b232f18702102c184fcad04767f2a37c75fdd34e70e8106fb4afa03aad5498f3a7d2fb07505e7326067bbec08ce7e77ac46d662952ac54edc215056400a9f76d86a007708dce721707a61c0a0a94ff4e1b6fe98c57cab0d0f814b7f58b76a58e2a78d831c5e97a41f026593c41b4f6999129485c1cacd6522b7301a794364571d8d5a601a93d1c4177263e19876c77e4cdc38154420d854e1544c8c8d260b15040411c820f838bfe74b18f69f26eb2c47b35e9d85d3e48004f942474544203218ac222210b5441e1b9b8e8b08dcbd110bd5f2cc214a03801d657bb38b5b6e6fe250461a5d7953372ba5a2bc70aeb37ac727f709bd4542bd3e491db35f39fcadb71d0b844786e5967bf45bde123f4f55163a60354f52c7977c270b68217fede7065d8be2bc92165cc567c219465ff22ed01012798b33b5747624a60d3acca201f1c5a6bdb3fa27d06315f58a1cfbaea4d1c465e2c42aff5b23f435a0631daac354bb2a25705df2bdf38ef57e1ffca72bc700e163293633940990b038e33d7e995d953aabb74bd20ab9785690f07ac424dabb6fd8b302c5abee19e4a391261ed6289ab4a4bf6070e8176b92a1fd8570b2ce3bbe1e767eaef77610d549edada1f17fb6211c91ac71d38653810bf6c5680a2de393f36e9ed5b0796a08086ec44691d2e31bceaffc707dcdcecb3f862122eac32dad881177f2a4515a068847bce0ee0eacb1f7c21de6f98910a9c490c28f13bd2e80134bbb6699625caede7908fc03f915c2f66c20d65633360423f2a67871bb2ca104b501745a6fc388e221640562f9cecf92c0c7acefde7ee1bf21f58bef2db0ea057f697aa762c0ba936ff7a5c21d5ad98006c532dda13e3201c14df00115fda881f9144ce52e2d3527c7400ea1d8a396767527e8e7aeeb98ee81565dbffffb40911fc826e244e9a87b06d2076ab72ce7f49a2a60ef4e33a58b5745c7bf0267614e4a3fe21ddca8ad2c5fe6385f1101f9a1d3017772494607bffe0858ec2fbb17329e13fe79b007353df199e0ac836f8c071e88e776952c35e4cc75c161bb3f9eec6d83aabfe464b244a6f7e6d74096badceb9011498f1dcf4b788a70d663a2180596afdcbda721f720ffddbd7732ee5e144bf7dad078aadb8b9a120577b8c8f47acf855e707244a29437897a129018e41053f5d7f55e89737475dd2c97f56979eb5d79761cbb3994822ad2becdf46c2b03a715428c76fb5e85a0bd870045f46999471b4dddd8cd65829ee306d414a3824085a0413d8a4fc51f1e5588f71d11fc1c756897b7db57395c75613b29bb769df7a63bd29e5be3c8a5a3a63ab1aa3d63df63eb34fd8f9b5bfa86d074029d8e3a9254e795e1d8053085504adb3198ecc0a5155986b2ef0d153c52a9b22be2b7dd548dbad72b661029bdf63d0377c3ae55ae9c27dbf780300651b46310771c32e9eb1d930380b187b4b37d4f522ceaf63dd9dbff8bb69d79f81caff1a21a6b4df34c19f168f3e451c22e02ecc9e699f81c80fb0728a7c990ff22db1199dec04a7490cd48d048a10598fe928ad42908f6a9076614e66a0dde42a3be6764c3a7be37086077d8b95e570baaef1d5593526879a24e51c65e60505281a52675e64dfac36972f5bda2d205aeb24b89fcddc89901a0f067cd1923109d9f3a5a790987d69c9eafb633374e402b7b93d0f7d4d4ddfaacecccf41ac81b272e8ebb1e766e944e699b481b8ed4d3915cbbdf40edd46472a554a6d3daab6ada0265d16e4572dfa07ac3180234c01eced2d9841ace056f5ef5f0033b4abe77bb03b9b91195b55c7f7f6ffd810c98ae44cb3b55c7f73c26707cafb53262eb9aae7e3f03ec5f90f848cc4442fcf1bd42a67944a84d81b66ee0ac2106dedc0aa03f15d4f75e18b10fcb5443ca40c48df85d853bbd8ab9ee10903b86f4d226436f3c7c8f9c637665e7bc5183cf5f696bc82a0c09cc2e790794e507e7fd1569f2883364254a40146aa627eb762807f0d961ce0871eff55866bf37c97056dc7b32b3e2422e575cbf1fe8fb14f7de1151cd3e0ebf3a0adc1e9481956d71c96d94bf597befb20e4106db7bad51512fc3528559a37826c26053485b1e97b6363140267bbc0fc087b7bcc414125fe1396b1f0efa839807f9b89a4b4df103e0d4f85f3aac66e55cb614a70c619b050d997cf7d0342eefb45e1918dc39ff576b59e9eadc73f6e1d8767cdc006d15f5be80dba6cb34b2c9bbd511da8b12d015bb2b3d1a6b8df0439fd50b01cadb346847633b7e4ad74a1d52ef226cfacf220128c61c67540031ea32f3950e57e68a9d4121125bff0cb962a7879fc89a3ef1a25ae9cfcce3a750e46fd17afe1f31b4c7ecad1d1c1344664c194ba21bbeee417899ed7e8455c5da0200ba6b19d5976db63e86a947804f1832f8c7e3542f9af95ad0213a012c719d222101772ce158cac31155f4d9d0b871efde4e1e6c07db8137eef554915ac339a19c8ea83989eb74353135c6382bdaee017424dff859d29806dad02e4f1eecef495c5748264e658b2b8dea95def39a0a5b745834259635036c67940747d7ff5764e5ddcb1b4ad2916d536092131f90f0669f885fa2a198c3e85399489dd3a22d3a7864c925379d802b031970d327e679575281bd2c06089156fd18ccb57b04465432877c4b984f6004832a1cbebcd0e5f40cb52ff89ade584fc991727ed45a169d96a1cd1ae511b0735cbcf3ed64a1c21455a7b14665e62fef750ae87b139d328d36bc9d33598dbe69306fa9135b862536e0cabda9d55f5ef35f3fee55054054d17a0971343cc8e5220284de932052f25913d1aff87041d432156e5b9c2b5ea4e7b47f04f4aee8473f00f769502884b777522464efb6db63c975f124f85f7a7d820d35a9d3f53c51c44c567b913182c368253450af440ce169f251f3308fbe85e0615ef07758a9b90eede85957f551d5dd1ab8289e42c7fc1aa9a98b287aae5ab60dcd4e163e3d0eadca41c5bcb70279888a79c7dbac1bb214bcfb1c62a2bfb6ea5058ecccf6d1d4d8ee030ada008b3e745b82ad23bb20bef8a5a7b43d660fd4363eacd8bab733a294b6bd08bcfa2781ef286566740b629b2008ad6d7f88988a8e7eeb90499e04bb7c596ec7376855b89d62bdf040f91c360a6b5cb44da441b567f5fde1d40067267561a985dd508246f403308a3ab95fa33234e409b8827421f3db301fd203b39feb11d55ecef8b5c8ef5833148761e1c2638d6a500d00d09e78800257c8bfa89980777b8ad6f974646ab90d6dff4fea9b41a7c3aa091b82e7051aeacce5f41840b9fc023c50a5a00319c4728de0795489cae16fe5c4b7dfb9478e05015ab7eff3660a73fa8465ab968cc78e1f1cc840392c0ad7963d68e4adf01c3de3de5c3850824e8206024729a88808b6c37243beb2b739084c9f8d46642b4bac269fd0ae9a5a149c559dc63cb90359b2f5abb55d7b3b43a64a8139261c97ce14a683769e12fdd61eb0a3600f3ea8e6601118d8a3d70b1477a9141143615bd0499ca247b0bb8f54c40077eb27898e2b5c65f898198611ba7e36a123d67bf3a730ee23ee2c24c5dbbaa9729801855a18141988b69278241dfaf14a5aa05f79a872d6e1cc567804aa1f3402e6aa01c076a1ab90e2437f4fe1c5b23148c29dcf3b95cd74b6302a620d8f78794c487863e06d08b66658813fc595aa9982233e541757c4f578767586c551a80294ae773f91c004549b4a254350c7fc446c350ecdf946f945169084fc9a106baadb71bf1521c0988617b131008174afe9a2222f1ed3096ae52bf430c46608b919836842300ac0d4eb56cfc3ec97ccc1f4474703b741e68351e9a4282cfdde6a4266ef65bbc586f80899e0d8aa2711bcb08ed56189bdae174057fa1472bca20c33621daddab6352539df48ae4d1d62bc7adbd5c5bc3f9322146d906be5aaf96cdb6a807c65873f68e4a82f14ca4795dfba20fc59538eb0c32066bc6a3231f0b3e50b55ee4999ee027108ba4f94e7aaad70eea4a8554ea6b5b01d357d21d0a3d883ce9371e0de95a000f3b0c5472fba931d2bf72b12529fe89b01099fa552ad4152607eeb61fff9115e23009eb9efc97e5c1b43fed8f2ffc3272f251292b5f8c442fa56d9931b1fb8a71f659affb0ce803f4add86782a1a456384fb4c37d4803bd56a832253032eaafc4766f875314885ad271ba52b41f2b97ed8bc184cd28ff12636108c9e166ba00c8d9b59e67e70f843aac8d53455f3414eb14808ec9624807c2497c2bd6b7856edf3dc97a95b37e43756d0581c073d4408123ff55b2e4f95f3584c2a218256b8d458c9e1da4d4d6612adbe236b9ad39f21eaad1d7bee0606e077d5fc259fa8e4922b74e13fc2961c4fc4467ece269be8213eca93eae941a9412e00622e6bf194157a26c0909de8771e9fbca6fc08f05f00c2d30841fdff46b425143e84c8f426bf134337852b7d6dc827962095960082d5cf43fb0bfa9e2cfdd74eca45a418b91d778bb4e847d3a83e22e01924e74972f61b004ca64d9424207c18735508fe86426b2f6479ea65a7ac009c223ac622e4b2efbbcbbaeee5815b59edbe9c113d4fd959b7173829886936e0db61e0ee2e2f34b374eb6f1dc066f61fa825e0a3dffe1943bf8452d6990c1d1301f9a07cb4f3ffdaa600433df0506b2da25936cfaf521f384d66b220948ab035949a21b22194be95e277e8b2a1febce1770751124815be31779dbbdcc8a8a4fb0a21d2cd2d38d0e282fa307c012523e4e748d016c5439a7b3cf9040d10101677af34d1c186fb05f2f550c86c7cd6e5f2c95d8f7270ece6296837b72e18dd5e329bf5bc3b5f148bbe2549c250afdc0ff33fd1496919bde40bf21ac1bb93fc134eafdf54f9e2ef548d50d4184e38a24fa785c38f3d0b90ec02b22e4aff4791e0d84f44d79bc2943f3d6ba05fe81b9e8c29735d73785a75165b44e87f97c855f1bf2243941a2476b7c546e1bd111e8f32d23ac04295164a30ae3ea323621d160121315fa477a009e0f8a3631a8bc0f1fe1f31dfc98c6194f9efaa4d1e11c456c3e168bd69a22343c14b9fa941dc2b4f5189f661524d16031cf4b80ded9ecc1cfd1a63ba2cb48f4f205585c9210fdcd8f5303b8468a578aca753ac2c3718a95422f90978484f6b8e75971df8a7802437da2471cc0d32e4f9da06d16f5f378b7a07c9044265ccc30d2f41a1d9438e698ae03ff1091b92318bd03ae352aa3472f11a92a5a4c4c953ffdfc9f5f2535f32096403073f577e78d53a9846f540ccb4014619cc95a510afa1c2c45dc9bc923575d99f86336cfd6533a17fa163a103c71e32d184044478436c4478cb4c0aaef9855046077bd3f01a658b10ecdc906f243b6ef4123180a6ac5f6c5c451781510550ad0b3f776a403bec80f55595c61f5ae9fe907e63981dae8a25680d32cb6d79479293922723454a9684843c12728d0472039494f9768162f7abd210842535f11a37dac89963af80755a33e8cb09dcb392c4ca679e4bc7eab544a2de1e356f231f485dd6d737dde8e761403121e1602915b27516e43f3d09e7d49c4f9d4a711d53e1709cff8168058de9a6d3a6441d24629549e314d0a7ad95f416915ab7f9f9b5c64ce3769ac82a513dc0b39269c476a6121689b77fa09e4ed8b57f57ad1e454e3966fa53df61d9481e38795ed03def61e9385ea20d777c3d0c4ccf4e7dab6f8647ed4578bcc3206889967c4a0cc01380f51769d2a05485ec3b5ea8b5f47a7e5535f8440208af7475c68c74887a235ad4ec67cfffb955996d405fde307c0224454a26b57c019163ba9a98b1af1644709ea283f9958db02faae7dd27ba56cae4ba0fccf2bb98c322837529080f85ff8deb0f52fbe82f363ce746f265da0656fb7d7005b100c023f2c6b3b307f92b77653c32b5c07d069b7c4d15ccb972ee8c25a193404cebef7bf3443d5be6dc253ccb7b27ca9ac42f286d959372c1d86833c4ac4ed5cb09409685306dce3a3523959710e530e7aaa346d468f30f73f3fc1bbe95c10677ad977ee6a6f0843333d9830fdc7e3cef52824d1bbb09ec9c88352d6fb4e596bf4447617472fa0c9f09729e8b84d48d507aaed8d9579c5b0d5106bed65287549b49b88a9be1fa79b46eee6f94a143c3b83f6cf7ad2f8e14ab566bf7fbc50048dbfdb489dc12f20a5625745ffb432acbc42ac2dc9545cc8254884866bed6f19dd620b78a3d8752cb94e211dcc8d157781cf4f98f3df22db1926163c44d5cbc11ffa5b90fdfabf97d213fb25d0290ef5e09a085e2a10f8b29905040489c9b928670bb0ab99f2e5f6692abf674af09dfe01a8b1b2570dc20f316d57554749cf73ca66b8e60f9e6447f6c3acedbed20e6d2946037b1dadee565781040f2de70ff082e4e7f7571e47c1fbd9b94101bca4677f1036bb5481d9de3b7dfc07b63896c8f30669ed166d2235c60328fddc9c5ab42b5429769c85e96a6b9eb6d97b8d12da6f0c2b7b4b125f0cc3f9618193d9904db3811e87d324c0d4073c209e10c0bcb572e855cca92d17c8329198b6a6256149e4b3c6c317228594eb2756b6aa1493da7b0bc9057cc1abfbfb8dfcb67b13cdc83ecfd007aa2f605f0b29b60ec33e9a3359e494b5d798f89671c56ecf004f45ce37d5dd2bac0aa8dab3a04cf3d683b1fa7d80d0e20844a72416783e75ca09cc67ebf808293fccbb2e4521fcab5f21438eec964cb8250d17613a8cfcbdeadb8ed15b2e10653144caae8bf38b2caa15465abca16e79258e84f8bb531262ec0040f378f58ddceccf4b320c47d04abdbba5afc26a49c7cd2ffb6b96ace21877c70a9816edae02b0b308067076f1b6675ec21ed5480bed64384744fd808af4398d4380effc261f080c3be8242c91925d2ccb7edad2a3dd2a55c209d40b6518d8a55cebd2fbc244eb96bb5080dd82f918c5580e86a12b847501e10ad3ad03b61ee6a03ed628f8d7c3e2ec1ad73b0bb5789bc6b27a773807eedd88c4e92ae11cefdb3aea10478030e1051f85365b6c8eac24be9d003dcf8017c2e00abbfea75569643d3ff59db419839bbb3aa75a9380870929ec1aadbf6e825132f2255b93901957a38d3a77f61b05229942c904a38447c102d8b9c4fe19061585961f3f938a814902926089c222f70d1442e0d5ce10f87bb590733201815942cde74c20509e5a7e5e9011bf35c1b0309761c224d663661adbc10cc56f5324dd2b5a509b672fc54881810c22235756b749caedae0858a4081afdcf86fb47306f7d406a61f0e019bde2de7b83b6f5f8a3ec48513de8328d85d2e3c8d97a6cf9c2ba6318a818a5c2f76d9cbf98c0f9aa17175df68a3de374a8627c5ffba3a4d0498cd563e9683e9f3ced7ab3fced4188c2fde4f8dac2b40e075d17f2cf69dabff933bdbc9189e3108251e803094db7a4e25b3263d8d29cc628ad3ec942a37690202f5a14524ccea7fbbeb17887d99b04b72a2784445acf44044f03f92fc297199e5032e336c0f3f24ee3785ad4dc2f156a5c451791603cc30b545ac85959b7f0c6e076228b017a2ef2d9fc3dd9defca711cdde4a322f65ea891c1cda8d859bb36e6b13fb45194053250ff13f10cd6175936ab8ab94230db48beeb2c01742c163fbc2e8cd61727754542ce781e141810ddba270484dba7ff9a19cd6bbbaf91347ad10dfc7918c7b3cd08d32988e3f0285eb07d101e2d488be85639714d337e95086150735b08ca8a8ebb3f972940beef9e6e75c0d7e746f1fab476fd2c9dd95d4e66a41180ca87a6d27fd8b1f0322fb6a267eb1ea2f93493a9f5eede015a7eebcc36360a62bf9982edbf8f5065b008a74d56aa152385273f06e2bb88a5a1a61c5759f982637ef908d4410e342ecd03968407f24fa2c3ea2c2b7c536913d231aca1d4030244edce9e1f0be8263bbeabadd8c6673c88e70bae8dbda922e4204eb99562949fabd097b7255f89e84f8e0275568b7f643c6c4c7f823f1673afb25682a8847bc0c57ae84aacbf84a5d3ba0d209ffdfcada1d64b5be347ad0f9d40d7ec05f72b91ce11ab384c9868097ac7f0488003fb086f9ef9c512b1c1a7b0fe5cd99ad528844ec922dc3b7214de776672332ff0d786e865d27fa34eca03a3aa2c49403b139efa949677256f87d06059f0bfd381484ab9c1731f7edc19688ad152869a3dbabb20e2c3df9b289ff214439c15b21d79b152f6595a2e421734dfeb17ffe9db0566aa4ed4edf8b1a740d0251530c8d79752c592d9038a1b1506f41051a9c0f67b820c5c592a98c3000fa59c7be13ba494e9d9b6fab0ac0175e50b88a72f38acfe16915faef8db303f60f1be4162248690355823ab15a742ff15fcb293fb096ec3e56c77181e53a3a9a8216a71e7cd856b8e6923211384bd6278c779940fcc9bd9561708127e4559d0728db2c912f6bc5db394f771a031b78d2b33d862a577928e4976418c2354849b5812a754a83eeb0967e75a9b8e83c31c47cad326ce86ae74b6613d596b8d121b564c36a0056ce4a14996e4a4b9ec4e43d6f41ee02f6e8319fd1711f3527e1aa729daaba201553e5ded94ba843bfa74512e7be812e34420fe6f64b829f3c9743c5b459d559485a82852a60abe83d423d71c35634b8923ca31b3b223d3ffcabb8231b5f3b427f5929121c581a1e75ac35d1d6c0f2bd21412309a3192bad001fbdda9b089daf33250c02de79770cf29eb1b0bf7c2e1e48e9aef9aeebdd1c55d1032baed57790d606f1118ab52ef44eff45c190fa0c8619983d6ee3779ff925c9022602af2b4e69a01ef3e18ba5eb2ea401fb77fdc140df2ecc7b773a1efafe9d445f44b50546cc49387f0e88ac357e677b58fafa7947283918669464214686093ec26a830e465f3b84d395f5100a6e13a16b3aa297bfd42e94adc49a95b2ee085bdaf5ce06b59578fb047db6b2122dbc3a90d7f3755cc41395c8c468452697daf9b69a49edfb787689b54dcd036685d7ada809a83be54dad6b5f61bae0c3fdc934b6a8174747857f2791972e43f9d6fd276708456c0586c34101c846ea1bcb799849f625c2efc7d86c7906da8ee855c77839c36703f8ca5c5d1652139c3a89d3b20e6d2ad9304f66925b65cc3a484ab53e4f97896b828966a791a995e17c8a371492f75bdf108c9d4097f3cda84a723109a55f54227bb7f3bb1b8de473a1daad80496c8ddeb7f3a81db77b23f0a017d78761044a3721310f239bf9388465738b1145e0885d05e9d5f13d1d4e4bdc19d588a1da36067a32d504c1578d85131b324f6b57f02dc1f8d8cd76fdd870b0963b90cf11e23474dcdee4bb3f47e2ca86a2282ff9710caec1ab54b34ddf32816dce851f81d09d269299720a1b50027a48489c515f9e2a938ce0e38bee651220dde2998957573ec2947114b3f45ce9fa875fd072e86df856597c1645ce5970fecd5e83c0c1741d0a864a903c139899351f9352d261419d141f235d6dc2b88e7ac82c92735db13a4ac61b1a339341c24deaa442bea0c29a9a1cd37754def2941dba0175d14739d07b5fc799c3303ed6e9bce1e41209430484ead526fb86d2bee5024804e51edb07be4b922341b80719e56ec9ba7a3487b0e56efbe3c44a2b5d255b26a288f9cbd14875bcf109358f6d94a2b187e8c29c9e0e41b45cbfa41a57e59283e2f95cd09a44d2273426f781aa13d127527adc23157c233d9769def98dc85350b890441444130a6bba5dd0a5a93eaf6570e6d9b1d60112cc12746b14819d481ee156f4ef1a5979bcdbf41d0b63bc59dd3496131a0a525a53fb462d31245d83657185a1f25fff1ba5bb4e025e54b122a16bc9a41ea06ab7cf7116e2f165b035f0c8c5bd1b2bf9501f0cb672f044d1269bd0cc5c3194eff5c33183433a808bcebce0b63238f382e3d0e50a6c3f75bb3beff915a75dcdb65cf4f4ebfbad1fd3818cc98021b97ef82719880e3a543458f670ef2e66e659c7ee3821a0a5f7477cbc788450f8c1ac17f75377a008e874a871f270447082d13b735c33fcd64e893b4543aed7aa884e49ede04b0a5614d690054598c396a8553adf8cf04516375e71a97b5dfcce23997010bed2407671ccd6f5c5c34dc85f37b8951d8b8c46490f3f1f711cdb54351c371127b701ae90b5d348714fe1deb44a38016b260062297a0570382882456d8eb966b5642d7405e67b5993acae0f4d15c0056961bc3312c83e2c239c8e50c5db9a040474834b2b27385abfa722b3f835f36cdbf842978115a1ef4619028885688133ee7ee296a8ea8a376fb238aaa9aed3eaad7377d9eaf999c30add212e0cc28879e8abbf4d6bc6082d34505a4a3472eb368d6ade9f5ef218bfc3b0f4b79c5d64a595309ec4a458c365d7550b046887de09de7da15e09dc94ecf8a81645290d7c1d827ce3a8d59d84e0c086174547b4986db83779970073d853cee80b1405b3eb135ed0772ebc36e1b0072f4e4dd89e72604917ed6a1a09721a59fecec341b88fc71ac1e1202f88dc8c8d64901e1c22bc5121a6222d77d631c75a952b86076a884b58527f4d3dd81a8fa2000c8cbb833a19a96586ed27f3453fc133dcb4bf4f950a2fb54015b6504013411768187bb49c598492996830980a6371ae895c39eab3b68a9e26105b63b2165765d9ab9c9c1dd296c93707a25841f2653c7ec810a9e89ba380f009aab99d3aac5a55336f98cb023ddbbbbf3fb62e820805961d2f7a143e848245fa28a023c8bef25288e0c32b9259cb9651c6e8337b2c9221ed24510bd6a75b48d11d6e15f88e32958a2d36cd2706a1676778e6770d1a16332704b3ae8ed081c3a56318610939f982c22ca64632cc2a46daa4e88348fcd8aaed0a6084bd1a761fb42232f37d25d4c141b80efacb88153b622be74d09c355d39958764b572d73a64cfb5ffc87a5886a3a6c306d6635e326624a0df57e32c7e3c8440199c2e402688b22c2224477a6810213a9d5b85576ec0bed1cfd3690d8b54f22355ae79e2bfaaba2e9961c523bbda57306ba8076785bd191d78bae262bed344de3d5a05629c3b3a63a1ee42203c0acdd8813cc7e6274375978cc0db3d55358020ba6cd237473a28562f7dfc6db5d9247ce3e515e48459dfd1ee7cf4e799d536843cde88a778e77eba2b604c747605e24dc513825f80e47ea52887c1c7ea15f623af05608cb8b6d289bcfd4d606bd7fe56e550698ebd801ad51146056e2856c8aa9c997a87a7026b0bc015fc31aa6cab23fce7b081ed2a96982d98db58ec622cc9f11e2ef00e07253e5c4db2ed5bef18c70a6740852e028bb9e058a32729617babe66cb817156a86bc0f78c05cffa62c81981848d056549f8b1dc64e41e7e381ae3798d159603d0c61b20f9bb5e447515e65f3861cf4447bfc5adb01a26f4ae111f85cb587e4717096cb5a8e51b037b04a3bc66d88b0ddbdfe542c502da96b077d82291ed1475621dd916cba0890e78f52c782f89ea92f462be2dc644f461951583558b774c0cada65222fcf8e14a4671e14a3cdc48bd919790b3a9d1f597f3758ae9daf3a95814a9cbe7329d7aeddfa0405049dd4c2e38c003a4efeb9a209469c2fa21386c30b01260fb6874ec62d16cde0a7e5eb690391de80c0c31fd3f8af845e089a4657d28e20ee19aed1780efd5448136000df9b664e29a20d10725609dd0b0a984e890d1e47db8798e3817b1ebe99688d5ce182e7ce39f894ce7ca8001bb761fbf8ff9b7e5500edc01a12d7022889fc3927e1d6e0604933b93368261315ba516c5bab6dcaf3e32f25fd3bee28c9d8eae48c9bccfe7884e91374b33cfe412f1913a088573d15fbddfe164fec344605ca1819240443ce2ca1051c8898a3c2b9c2b01d8f8c3747d69e26d9eca69462c8a51cc92cea240a08ba5347f0549287ebf7288f5ae12a67226ef20be9b9ed8f53d825a3d02c1ca8693c4b2378057c3438138a19a4ef1636d3a7778224c6dcd0831515fa10b0ed96a7926d1ef04c0eb2eea7ff08333a9691f4970a5a44901a7ff9d26378d1d81c2b2a50b3c851739b5ca54bb29a597e5d3d58a9734e6627dde041da2817451fcc18e3a2f95b85662761454c716b27a1f4f8874380d3590c60046d98925725a068433650513ce2b2be4e81321d972e87bd6972fe16d35619907a5ad373c9b7ded7f2255f142ea67e31c317a10a33c5892f1d849a0ac2e59b4e346576b9aa8107e2c68c3dd4403f9d9041db3b5c5739ca9966f0814ccef447c69c9d724cdb2ed8ff56433472b317ba3189e3063e1505f6fb2e40ba9f9d6bfea8c87e04c3f4ed6969c58c21437066724103a7564c949a83b04d65cf5fd512ea8d6bba2cff41cd3ad1ca305ce4d94ccee8cbd0f73d0c77855933c0c329570e567d0b9135a122dad6115162c33844c00424ebc53d1ac6f950711e9801c5a225307e903755405a3aa0b0c40dc8fae59f4f286f905f1276f90d6e1f23274cfb54726fec389543779abfacf69a57b2f3bd84e05291843bb7ab724293266f8534237b864c58a5c55e497cdd429b901268b02143eb808aa76b2f806f563511813fddecf2127aa69b733ab568d84c1198af4f265b9014774397682cd35212a09526661552281340943040913a69e7113c92445edd73f18b0e642a06d69c80bb95ed3a0b34dca92959fcb8d6647471870ff16fcafe86194fbd45519a116b003313b6158aeede3e7f654d8430d0e4350aee2d952a2f6bd00c00e58a0590f1e4431c21dd444f01f2ad1d8aa2f607720ba18655fab147f3f7c10797dc82eecda0832947814f0a8bfddaa314f897cd38144c7d7c4f8db7e1b7170b1cb6024141718291b55871c74c5abb20b39a138c827f31921212c5d29fb51de02a315d0904cd39c382277b4529b36f8c7a91e0b25161b008eb617f4b0f93c0a30289ab849ea08b2a04945ea5a43344891bc1aa74573d1078e474277861fbd63074301a366c550549f897c8f897c341cee3f94a2bf786fe937e9dd528842547199b6368ab957af20dabea902d0eb9ea646074743b97daa0ef46b8094dc836f72a828ccdb174b09dd8212cbe7a2d2341aa59886cd13ac88f0d99b8f523eff0e99111efc687fc0967f92bd9353a494f21a835adc068d6c7b80f94ef41bb8803e50e10b0369b2bc797bce7e77115e6bc45d0d11477df845b56c97fbe220afeb296680e5ee0489661939e25cc1beb580a7bfac299a370857d57717e0d932a059c807c42fc713d2e80b464565d2324d6edc8b2be606c3cd2ac1b07c78e961314c24b162076fcd728824a861d07cb20d1fef09fc1a2d10e58a62b2da500aa0dc2355831b452e458d5bcf569b52c870bed62af7e585bdf5ca173706af17793a34c622d147610524bd55e459d0b311f4d797b803d6c71dff0f40ba999eaf27abe3cf0c8d5bfeaedeca4550d6d40e9742a8ec069a29b07a7ed27a2f6afe92f0f9801a1a372fb818597847303a733af21b79a46af56fc680f0561b858e72ddf1a357eaaa4dddf0409a5fa573b0651c148e24bf1b0d4ce29d06fd3ea23a279aef4a45e0a604b2f3ca81ba45b71ea087868e4c45957bc090e0cea27909c80f804dd08a35cb7c3eaada0ffd26e1a1392853ce6196f4eeb8cfb28d748473f99a3bdc2d4122b8e5e209694ef1853462080dab833235a726a66c628bb7bdfad07ae93042a08ab3bce4c819d73d399b1841f3297018d39efc5f8a8ed65eec8bef5e8c44462a0b43f3fe59550ba09f91b48659262f7f68428cd57c15135ab97288f73fd893896bd8e7f9a68953b088917d148a1d61e5a9729ce52e0cbee1f605a51f0cd17c56ac6d9ee450684a53faf7d87c2a2f36121eec289ecbf96b2b0b88847aef2accb08ac3ee4ef75e7be126d9c3dfde95f7c2888f7ced25fc097e9d77681c05be95790dea26439008ee49710984d26ca312faa33016a436515fa9ff8c0ae7ad509606b44820841768f1c29de61080257a3c66ca9d29b1b62d07dc68c43fddd8883fe56545c11cbc418428a2529ac08745fb270c7f4816d69e3f6bbc1fd3389ae59653d9a39f98c8c01c246e53bb49afd7aec93168d83bd149f8af58d0e9e56635972e4e1f2b2b9b19a451776ce694fe764a2d2f4e63989d5b87766eebc9e758c6b08911e20760f85e36a5dc1682a354536c1a8efd1fa573ab17bafdc04f418396b88fb7fa529597a64c2649fb488d0efd13846dee12b70ecca404c8a0fde255a2b164e9e97c1cb6472e1ee15f78a436468a01341800d11e140f4614b254f3944fc04e39ccc0d9dd076bd1ec4834354c23b3a6d8cd17911a04dad7def4403f90bf6601b8e5ab28844ebf4e5992ff4a576c4c7a00f252ea068865be3301d90b8e842519660d94a96c10056f85d7885f154be2b57215e688dcda1be9d3c473f9fa3e85b725c76e962e6afb88b11a3869e283bca18c31dab157a5040ae8283a1b6df63cc78dfdaf23346a61e4b7df597169b6f6b9bcd24300234be2ab9ee8b67477c36f44b3f36ed9bfd7c89070cf0ae1bed6ca6d9b54b46b251d984209f151fe21abbca0ad157ab94f6d2e4cf92767c792b3bf941d84d1323b61595ebbb98c5c4c1277b127ca4607f0a53e6c78124786aa5a5a29652cc6abb557c998ced856a18c5507abe698816fd113b816911aa0d2e53d1e820d1aa7c73649f8ad553dce9f5901f9374f32f02149242e7730965d901a123b43cf9a442cf7e86600881bc62471e46c922959e3155fdd44080f699050c072922bdb033144ab51b549625d327b5b4c3801933561b2ac38e3f8977d0f9388af06feda81af5eae07f71f7a8ca7e72b9def229c18d5c5eed2742b12ae3b47119fe08a4ba982bbef40286e80878b700de5872ec415998c120470b4fa0490007890466271bd5371b2a95401fc4411a1532e8078c08035a25edd909241e7b707c2a9b05a3c09ae1ae14f16a1596844acb9373898d14531f12755da60e28e6791ea67f359bc3da6c4fdc2a0c56f882cfbaf8aa02b953295bff3e647aa8bde1742b37194392b09ad9f52bc061badbed7647f87b7e2fc96b097d636a6a4d46cfc9605b6551aefddadae20e90ba76b63539403195a1be5453c22d5c55ddd1fd6a1b7aeb72b17558df47d986a3c70923f55151a61a651efa0cea684b11e8215837b03fe5498b49dfc7fa4e5d0ddbc25d5d83474446bbe7b7dbadf174e9eeb3547b547a2d216cf724809de28f79841f14cbd7a1c39b64f6d0a67b94b6ba1939992a25f63e1c220e1b1f5ff287b20d4aa1f5a6de07ba3db23c41a632af4809d425f1f2cc1be8e6d3871eee9e7834f139ddaf3fe5753010d9fc8a06a59c54338fc38fbe0646025bdc6fc0f77827111c5a23635212902ef77c3f1d3710f983571469f01f3865e8109d9448cd91b4a28ea60b4f1171b39d676c61dd19bc1901f5ddf34a4c8e69fbd0051f5eaed917944572cbf26bf822c03ad3d429ff70d170fa4c94f178a74c5c8b97bb658e4a8a871b1586872239ebfcffe5e49ba74289ee24ab071a34ac3864aa880559d42cbe8654cd48660a269f27616e03faa270dcb1b59bb4e0acfafa942b1460ad10c1109b8c5443943370a7675d9b3cdbb1447ef7f0f6f66e939b99522caab61a0463612955cb282e311162c4eae124f8596047006ede98fc3d9e34688f5349b6eeb2e5d70a4ceda2ea51ea82f732a31321970e195ee6605ce12e341b83340bcb8a70871828a09ffe37ec551851e5db8c57d1fa60219ea48b68a64c1f844da223123f604adbbb91b00dbdef8ba542266997755297dbb16e63881ae972270efd917ba505e815e653f33b6a0a11b8258cec370119e16278c45d44a81e9a37d9cb0cfc61e3f663e5a6d343a9323af74df531fc734b377354edb75d2f7ed63a0138120171175e5dca55cc1a79832e389cfc81cda97a2ca8f2bf6d34832bc74702560e2e11f11bc45a60a2446e0a85b8308f6e7052415da44f0394aa1b6d4888485e8f7c306ab40ecc36fd708cb5b3e42b1472ebd75cad12bf17b06aaa6cee63527fcd744a836556132555d9f11a2d74dff43fc38834dae95b6d0a9537ab521bfa4efd6413895d51812aa879725b06492c984054a23a2e12e8a1a76e40abb2b2a436531b915976ba118fc8c40ba629ea418d9cecdd29b6c697c823d044f74d765a8506ddaede2f50d4eca8214e542827d4c3f3445ae7085c2507853bf20dae4e76804a544653a690323ef8aca5655546919cbff0ed78c46fbb6aadc13275c529bc41617ddddfeb89084b1fde69164b809c8023eaad739b0c07696be79fceb34ace1039ffed753110211ee87a782d88ffac45d47fc2aff8a1ffc75ff39b4918186ba2d83f18750b0d8a04283868c9108147377d30373adc9aa00e863b965257b1128ea524ab6f2ebc3aad5a96795b3443bf71cdef03978f19a592ebcef0351e8b18cd767b3484b83bc57bc0e04c5d150c5984c875cbc887ea35c0b07719050aa69c0f62bd5c4f9e60be30e432aa8e2b3d84594487a03fa02f2a8cd1deeaad2198133bac1fc6c5fe0cd0c26b2cf06ccf80f57d2169b50e5c13d57b35f1ba81aecd1b17c4362e6056d67d9a7ae74d0114ede2a8e1cccfe46f1e035d1ea4575a1d260ce59bd4953c8814670fabba5430ea861ba116aa483fe7f014e8220c3d74b71beb91d4667eb9905173ec07148415241ddd72cb816e4713d59f21e3408eb366fc82c8e3d6b1a9e1b7eb847dd0a50f9de6dc660c53033aecd5d7cff17bfa7684aca6987826f23673d8fa28ce7d22f3da9ac5d0697e2d6482c52c2067c0de818750340ed6111a9201e506b8ac88d7e00fdb11299ab71f2aaa07868da8c8e2d9cd5a636345087e1ab83fb232232a3627062a6849ea1361397c0becdb7f6e627880b61669126b40868068c57b52ac919b5278ad45f3684525813eb65e85ac04fd3140edd3d2a7fcc3f7ec6551389f9f12a5486bf8920ed78abea852e68cf0da2c450b72939129db52c06d2aa46d620e550d5ea6ea1b1ad370d9a900ac305343cfdcd12703f4b4797dadb8e104013c1a97df2c9d3141ef29e2304890858106940dd6dc79e98d3f2af7e148f216c0a2d7a190dc613a80325369b43e4e08307ea7bc8d130297c3e863c6bbb669486b4c7b0c75f5ef2b2e222a9847cbc3747a300185e058b69909fa37431d4dfef30ab136a522018b5ba75bd039281b1f5743135eaae0ed9c78f03dc2a2760ff5d5e37e9cba10ca81aab9920b475d004d44219afda36a45135c44d467a91b9ba7a6e6fe07ed6363702887dcf9e4ed2cc97732d9ec580a3be27f3b1fe3b910e0109db5261e74c27b73684c663fc4ca921d8332a36858e38a9fcd81094c56e2cfa61d4c5eb395f867a863936f6e2dd619eae0e5974932e9a2f856b69c2830eb7ca5e115eb8e17af671efba53c5110cbd96a339091e7769e9e3cf5e6b9c9333d2f00e9bdac2e88d13f4b5dfce53ad80c5fdaf85e7ddd7a43f911162f1a4c5211c4e7305119ba0f809497e2a8151ec2e875036e0d7e18a08dc167435a0dbec3b407f49da2d951161253fcc714ff30a57f5ce91f53803fe6db2162c1d9bad00ff7df8fd2caac8cd7ef127b9b16de3b435efabbbb8fd30fddc3eca1f2007d301c0ecc95122418b5f38446ded30224f456b7a61ad29d2574424f1f446963a0687cd7a2ae344d2ba4f71164e6ef66bb257418e5bc97cc18368ce1a43a0ce092554a74d40d65e713bbcd21caa0d711d99ce9344f36effb1ce71aec953f253aa55f394de9c3df2d2b452b71953e654a83d10a9a0e1779ead5c1b4b58b195d03cac8b9ada249bfcbab63da6e916a6b06d191b07ff81fd20efc87f4c3ef21dac17f400bc62af963a052bf434a13f10e8b43f401eee1774877e83fa01dcc071cd814d67e2843d16a3e178ab8b0d8f7aee7866561e89d8de1d410776a0a2225c6c609b54a7c7f80480c9afe685d7f4c4fe824ece56d7cd47e382f8dc08763373c0700174bc86c5e5528feeadf321d7400623067923f2de02c3428549036e8cbe891c668bc01ff0c41f8e578e2b4a46aacbd3a1f7d73884046fe9453037e56da4f1b90114ff388d8de85e18a9b06d71097e2fd5c08cb3e6ee06d2e0a5833029d3de98d39a8dab875919a91145bc7f4082ddae63ecbd723c6092fa961d5e279e7e5c355aa122959c72d88ed0a6cbb060d0a0394214e832fef75cc731d0d6886bf3cd781e7edc07b1f78ee47c4e30b9a3e0e7e4d542473e0885bb5ee8768a7260bf4d80fd4e28782b6cae2722cd210846ebce9a87ec63c87e1894e77cc09b3ac11c019232b876ba5649d1cdab92755757a3c29c946981a8e7a3c06370bc954b8b67513de0900d68d1cdd50f31643cdb707f8221aada9c0f5bb4ed794ede12dd1db0e79b0419788170d382fd4ab570ef3939b8c7b3888688c640f2bf6a8e862fddb3cc249eabf24563141e4fe1903139afdd60431cee36aa25ffb32d6a58d2c2ce103f384dc0028e708bf473dde24293d5009c9f67e494d404ead12ca3414dc05838bb75693a407408b971b1e850b88bb3d1c91ffe25308608ddf7014483899ff38d79afe319d15442c2ec9eb41c03a5522540284480d8cfa11f7f72e85218bcfa8b49296c0a1527d940afed95b03071ddbd84250466019d74bef2fd704c05517f37bb91084a579764adba08936fd57587e4f49a870baabf0cdb058d557853f750e3d6ced9b205c15989dc3b26b493eea134a0d17567889544ac59162d17e8fcdf56d1d5afe3ef2658058cf89093631e0f41d3730fb351849f6a71046e8d9bb08afd58497bcfae6c88e3c533fdf2664164432d19276e05b87d6d29b2ec00036a2b94a1f82e75988a80b612bd30d6d8de73d3cdc8f6599918c4ff1d5167567f0793768bd3e64a859bb8b86413d895e91fe12d909ed1b78d6cfb93174bd6bd4ee96e9aeda900202c1ad416a96f5f31221fd98b72c5de788b4a952075146e410c5767c92cc2ce363ecdaeee68d87abac86355af56994c192f52806ac9812a9718dea8005be5676156a9c57f0a8be7304fee4a6eb117b683de734f745ca0cd707b0a77894cf5b84be1abfcb949ba9111d4c83343a02769bffe277e04de70270fbc3c44d43dbbac02a8a9990f20c8054a0c64bb93986fabe56b482cfff5eb296e8c1b092e297d912a9009ba05590c0072c026521450f571f62737d58ddfd2692a57cf2155ec9b4c31406086a27f2de857b6e9f0823081bb3034671bdfe1bb3d2f85b91446ec3884c6263c204cca6d173b452cdef7035e5bf24c0a202414cec2271a9186773695ef75e6beafedc4aee5399c706cdc4bc1d5256854c80179f4765675d530cda0c48ebc1990d136cb5d61f32f65da02faf65c3cb9f13fc9b511fb849d3c6e5fc7c7d707e5dd4295c11448c03dbad978294437e82b6f08ccce689b5dded1f7fee2df43fa00482fb8c264b31084d3c2d041096d7a2cb2e1924fc55ff26bab0a345288fa519569b2323ba4f8ef589cc28172e88aea2453fb5fcfb60e4cb18edd3ac2807db3b94574ee48593ad022aee9ac7237682d36c2fa570ab5344a6502bf4622d299f4daa84efa17d82eeb60b5115811d9b6afe9a99a6da7da8c2ac51afe1767acddb12fa18827917027efd63f0f286a06647c815698c9caac06cd931c8f0ccffd5e400a65afd56123efea8b693e66931c2f5c5a155041074d8036a4803b15310282d2b1d613099762cbf801591ef8664043b488ee9ff7409aa38b00ea422672ff2d955e2628df8149f075b4121cc7edd76785a75f615ce76ee4a15d5cb6dcfb6c8c8268180022dedde7213b2f79652ca2403390b750af00abbcbbb840848a26bcef97322d981820176f04080274de3cffb601a1d236965ce017809ad3cc979093f78931b9df0a8bb3dc30e7ac0b5f16b0408405858d8111d5fb37dd00769a69ce3205da5e3679834001674bc1539569e4cff127e20674e3fa2e36dfa6ed0c1609beeb6073a5e0739690f356b5e4a930f5b6c21a5e9072c6a1082df71040741e40d260852fc5abf8705d8f13b7e860680e02120dfecd06fb4950e6c72d002040e414cb54912469ed5871046f810afbd7c6942aaaa164c29d13291bc79285efe355953f2c290c87f322144d2df84446af249081211b67ff335e79537617bb435f980d823b9a5276c535de11d5e557dc47e87ae8d9f031defd0b50340f03b7e2a83afa91d0fc1cf50c90b43d27f44bdaa5a000189c38eaf8da49426a4ffa9234a4c293134756468ca07049226bdf484213d0929c044b2837c23815979301511c66484d3bf176f7e5ebe2fdacd175f00a0c98fc0a2bee38342afc30d075b59c70b81d4c30e74bc8e9fa107422f442221da9080e10d8e9ab4470f2c32498c99809b2414c893f65002532922cfeb704668da3624eec7eedbc81a9319b683be8452b66ddfb4836ce3141ea53c8708e4c961d4733761028f6f7b70d45b48d892638f6f422e97dbe5fdda9239f71c75cd43f1a8ef7bb8e57e1059c24896be839e290440d3be4ff32ada23f65e458bc6442037e7111d4de6197bd4a191b80ec31e83c8126e6c5b13f8a3433c262756784205289ee2a410051829bec871d2f232050a54bceef20f3a15a72295fe298ea449131c49d452454e4a38078bfa36fdebd73f435c13d2ff11d5595670b9020b13b46c45800b020f98950753164c751ca045095b9030e9edc60516b5b834e9edd6f5a50b2c6ad169d22174887b31e990fb930ef9420b939dd76b1a607b7082e0542c7ddb5e4fa4518381457d1930fe150a2ce0bef8b6bb9972b95c6e8b3f4325363ad8c730b8789de015d06201055c2084496f97e94e0226bd316120032040f03b100001b9839cd5871807f8ba32ab0fd7800166f5e1c3c728c0ac3e7cdcdfc092ef117cdfc783e92e7dd7ac08bd8eafddda253f102275904d7b6e3206e0651060d21ef727edc1010fc03a98b407ed6186003ac08107aae4a1f281296748f130a5dc065d702844999587170c65561e4c4e4fbe04008c931434786aa202005660c2c292304ac460518b9f64d29b48b680935c78ef0a9f787f49280b8cb0b4c70b960a19e37388ecc98c2f6a591aa3bcd8b9e2c117435e08e9a20b860df4b001327ac013051543f63278f032661e1378700e5c4159b579baca75c9208e2f92d766cbd942c8227a89e24b61dbe777184227b62d4225414134202b57ba6c33780ca11270db1e04e79cb38b8b2a1ed8b66c2e80b69f349b8de632b80c93deb8089fd068b62da02869d9a0b04fa39800f4937f442fd697677f1b2a8b680f248a22ed471a592e5520bdc5c3469b06b703bddb34ddae45f8c496b3d5b1bde76c369b5ea2812dcb66bb34886f7bd0f3346df06aef42b1a8dd89de62b93a591c219958e4fbfb072c56a3a4ff6a4f533581c4fe88566541a7c848d119a1927e92d43a476a4d5ed140c753d6e4efff47f1694fee5f2534f18a7a6848d44286c4515369b286d9a6bdf83e277c12e455844a6c4f415ac88f30e3a86f3f6eb70c2825977ddb9ab68d1cc923ea555481426f4efbf13d37dee8ed8eef5ae1135b4e4ea884166a3092367401bb404155ea45290d45e13ef9e2f5aa28355256de462497a4280618e88fbde7280624197bad658ba3a537d90d58d441e0145a729c9c9c9cbcc891220aa73659fcf23eedcbf169ef71c4b7bd431136b13dd0fb132193fb406429fe1d45dbd32f36201a49f5a4962d0691650866680a2980a1e01f519ac2bfcdf657e4f183bebc3f8e8fe53eede953c8e43e8db4f4b6419a8d5ca2377faa27c5203d279051974c5378cdfdf141ba82ab30814c289ea02b986167cf2d33e6c4cc38b3bd6a1ac576ac1239e15fbfff24e7134e501642a57f4dfb23aaf5eb9cfe5a139acb6ddb7be909cb93cb2181c948ff9f044593414f67073d48b187f1a70924f652c6e4ef6d5f66193d2b7c42fba0f7dced9b087a5ad0c79e060681ceb583c8251b49f5e4ac3cc6a60d521c667448d08bef70c227b6bfef39254225e38f41fa6f33f0419a43993265eed5c1061b6c3873c30da288e6023321136ac6cc0e46f497f7c7f7a92951a4228243c8e4c301872a0c720899d81c724843448790c9a7830eb69f18e82fc51fdfcf887fdfcf844cc4bf67c471d4fab5961e86a04183468d901d422676871dd654404545358e3e50505555358e3f4c9026cdbd563cf0702f9b0a7a0899d01e7a18472028501332a16ad40431c19a35f7b6f13287cad187f089a537eac3bd42f0f82164f2fdf0c31043ac4226d6ca8a081e6c42261f1b3657780e29efdb3ee81d88f1fe483a102193f12f5952fd8f0fdaf4a437a533d96d64d02d02cba83e23b0a847285ab6f862c9b44521a86c5b0ca105549d3a51e2b58de338fe11b5e932b3c13ecebe3ea51a9f52854a66f9ed496fe3037ded6dfadb9e45e824e86d16db3b9df0c9f8f7923fef5ca1923044326a0d6afa672b7c329265d3c62254428ba25461d2a53d25ba24d58f7583b40adbc6eb57844f687fdfa1ac0895d8a272369d7f6821392750d43f86fe6a2134b1fb42f46602250a2263b3ab7d4ea8840807f2ecfcb2f736a193fc32d9d3ff2912ff87de32bdd1a769ae38277422922e4438e94df65345f864a4377f51fc2431f64e45a844f662e94f3bf6b117b587a1b7d8cbeee5210c251a3ff6e0a88dcce82df6a31ee92df64a3be4f1fdc717426f14a46f70cf3b156193fc32dac3141cb28c9c2274729fc67f9fec2d25b2bdec3f4a34be8c14955cc8a268d3a32e3f3558548249a81bcbfcea438e35366a33996c8a1c6459e3713cd0d33561520d1fc2241c4037344d2b544264e70944f62e878d959c5aad661526d5d8d890a24d8d20a400aa410ba24d98f4538b42092c6a9a11a2288a366ad0226ae39dc97ea6b1c84829806ad09e161126d920dd6051d37e863f479446964c47e019da6c3299ecfe07d97ecb7ef641bab43b68362b3359ca9ef6972c650ff4473568cf6a359bde5277ed3d8a3089efda03fd90658d567bf1a99b30a9464e0f428f08936c90d483c81ea44b9ca0ffdfdf8b08953469e910d93f39a904b03781654b76d7988c7f7f24cba67d65bf848865fcfb228e4be1d8c85fcdc6fd9ac652e3c51a35deb56ae020cb1a144e9854e388fec861028b1ae87f92a0ccca03882c99b2f00c83c8b26907fda8afae17cbf8e25f5dfe482ed54d0baa3d4d9776d36c5fcef668fb32efd1f6e5b747b2bc0ff42359de9ffd51a5e9b9ef961c615d7ba96e1b36fe88d2b6d46de35d4e98c4b78d9fdd204b1bfff3e203692c4b75db78f1691361920d727a109a1526fd90d38394b22dfb1a5a8a5009b8bf09e4098702cb6a5066e5e171b04c9751306d29f0336df1412a078b5aa6cb0fcb52ddf6c507a7c371257c029e8463f91b47c28f70376e8417e112f02b27c2877021bc8d07e140381bb7f21fdc075fe36abc07e7c1d3789553f90e8ec6cfb80e9e83e3e0536ec66f701bbc8cd7e034f80c2ee532780c0e834739191fe32f3894bbe02db8180fe32cf80aae823f790a0ec6bfb8937b7114bc8be79ab89c60420420f00026079440c2d208226cd1d200062c200b96520121240004045c3980010a60e503020cc0830e04c041152a53a4286d808b02e549009c68d004004c9628499284e408d23ecac0971069e8cf47cf1f8d3f7a2bb3e49d47a19809f404caa536ddb03e4613605e087521546bad5ffdf11eb1c501a72a2ab1eb8f65e0d9b556276d51158ac562b16a2f5519521328e3a9c848fec1da22e32a896db7c8a812b1acb5d60e596bed6d52fa6499859256237902eccd0ffdb166198528517daf6455d2213b165b78b2b0f8660b0f960f5e190c1fba7ecad9b5b329fd1bfd1f7436a3b731cb9154b20b38a90df7c9256439e350ead4dddd9f6813a5d4cb764e4095d6ce524b3b928e017eadb57af130a43535fbf76d6ca7355bb8e4b62593f8124c64e59ae8daf5bd62ed6eca9dfc7dadefbb7a18ecaaa9be9fe1941e13bed934ba60d30f9a187c4f6b49e8f625b6910d565a3f9d2b0f3a458c3cb9baa8b32797d6d6ae64c9446f7602f1fe66795273583a3cc32775894dddfb68bdf5de7a6fbd5feebb36b4d65a3d093b349b55b2d65ab1844ceadb492b1428c0d9980b0537d6dd2d16ff5abf4259426f5dadd5566babb5b51bca8091eb740112980f698dffadb4d25a69adb4d24be99d1f2477f749b93875ebbe6b20cde9d4adfb12f7ce28512cd65d1a9db6dddffb1d96119af6b55f7763f77ad7bbd7bbd7bb37d6dd6db3c8a9d93af6a4937baa7412a9593bf95c2cf5ab576f9522ab17d0fe149a57f6b612410241d0c9dba3bd076f68c17bbfeb9ffdee97c31dbe16b4969ca5f5ef8b3ddd31fb59b05aabbb3ab6c9b6ced85729b93c9b81c948dd0d91c03cd2a4434a7792552711a97e6d77124b7daf7a329d032f88045e59d5a575cffb3c295a9834f320746c9371d5aa73c0efa3f3b3144c46a23ec4c32496de9c40245a9d3a24308f6429988cf4d1211e840b753fe327bef75e2f32b717f17ebecc8bd49f5ec4bd48fdd9751d5942712a3c64fa1efbef63ffbd7d92e641ae7d0f671ee47ed5239b5cdfbbce7ef767f7c7fbd3fd2d9776d7e99269775dd9b43bb2d26e86dae5a0830eba137e301f52adb647bbe86dafa0bc517c09244cce3981ff5215426fd308259a46e86d7ed83a7d48fec9b02329615225acfc420f811741bad1a74f8f3c087da537ffe5699713cb8828c5a67ff425b7e92331420e0d819a0a9e6cc992c6de1b1f3ba84beb0e3edd6075fb75b52bc60358ebbdf72b4d0a9717d65bdde6fdb9bb7fda09bb7db7f5765dd7c51cc455bb95e1aadd6d67adbdb6d224407f10a449c12297b71f6edf7329f433fba149d9caf53df00b9d949245fe9e4a554eca7d5f98e4e99bedbebc7dd6ba757b3ff073b7650f0f4229f59b07a15ff50f2536745410a3a0a38296955dbf64dab5ded0897f758f02dfd3a7d40944725ab394b77d308f64bbcfc97ecd961a16064546fa94873446a9f75f69bdebb6d7c5a8254b9907f187d225cff62e78b63ff6ea41d8644a964db708d03ec552a0725964e7d32fa21e39290fea787b693faf64897f7ec6d26edf16e3254be86d2a4d232557c9884c7fbaa7bb234b2edbbebd151999db5a6b71a5e3ae2ba8d9a52dc2516ca7b3c299edff155122ff1eacd36395bea5a4634929914ba26b837a16f9eee3973dee79eb5d17f28c065139b36695080d3d8b6071090d99885fe5fd08dba73cdbe93ce1d9eeddd71a39e71a35665e6b90b3f2b815e3bff7696a5bb0279d14ecec20f0ec0bf6e402026b8317633c7d66919907f1bf99088dbf9fa711ddd69bd1598d7bef252b9217cea8f090bf1cc35be3ded0c925e77d905e7ae9a6b7e96a97f6b3086dfa35aa53d5767f310ed1e4729ada6ec12c923d880b29e2318bfc7810ff2e13a1d1f35eeaa8b1cb598f8cbca1128af5beff71d9352676fb3cdd3e64c9e5deefd17902b92fea9fd9f813c87d992e7df6fdec45f48f17f19941eeebd8f76379dff77687c52ee094c2264f3a29ccd9e5cd3798399bfe0f3a5fda6cfa427abec6a651f77932c731fc222631bd4d2f4c32ebd1be31d6f57d7c3e1ffc4714cf2851257d6aad1f4e278be4e18d0a0f7956c92917c83e5f2ed52e7452f3f7f43c987b724faef9e9ce3db5fa4cbc6bc54f8ed8b12e47f065325036e7bcb11bbb5dd775b687825a6872bbbced198562d333b94dc34c75ef1583310f6f586f4c8758bc172445f136df0b93a6485e12df9ff5ea5963b12fe6d7bf6277f72e468317acf1e6a56ad3ff21beed7e7efe99d55a3ff6cd72c4126aa1fb4734d44c645f49296172697769b76c09bd4d4aa99ea0c6d665e1d31d625916a12dfbb9699824bb7bbebdd3a8fb6262f28d5dbabf0e3be9484b6f3fd7e97881b3e9a0b035a9779474f75e7050691acdbdddddddba57b75ea953db33f70cb1bc6875a9da3df6e4cae5d9f4ad755ad6d9448949e7ac35a9754917f529cdb316327d72ca05f2a54e2869bdda5aa7d255ee4e6e8e57afd38b78916edbea45eccfb0b02d827d4a62b14f9f54b2caf45d4a982d454c16c1eef2dbeeb68a96ecbe23eb15f72c56a657b7a2256b74db4b2d598772d80acb83b7c2ee5021e60cfd3897106e663d58e657304c2acc696bd9be5463b2275972f1603b16ffb9adcd4b2a0af6e96b29743216fa554acede3e8b040abdcde954a099e26a5367cf2bf6e46ae3b4c19e2917c8fea4756b6b4cf6254b2ebbcc825de7fca1d02193e4e2d43d40f534ed68a1444e5c68f2ecfb592e94fafe6dae26b4b67da771e02643a957a0e82af4763db0426ff7a5b490bfb9e5c4c9234b4eecd3886eab24265b25169ccdb2d5b36bb5933327191298478a9d8167cfad0f7c6ddb9e5b1fd0da212059a51c23ed532d34eb926ef60d594ae4fe92b9a7d2d1d02d7fec2bb4ef58fee00de58501927383d958bfa8e8f63f8a8cc0296f3f868a8cd422ad293ee4496ff856df0805dc85c659a787b4e670817560ceaeaf41f5b8e4d45fe2734e29a4a8be91251ad436396442ff864dbcf726737af49d56249488864abc5caa37efb1ccb7135b2cee1f956227973f6af7439488cc56fb8cdeeaa88426dba7df5dd2edbcde8df1d5bfbd998d4375066e5a39bf767f724581edf27bdca4236b170bbdcd6bc9e95b4a05f2b89574c87476b3debd358eb55b66446dbde71658982d2b650f8a1ae81d6bc7ac37c10fdf31c9f897a461928c567bd003719db5f7f9dad39045e5b208653fa24c268a3799cf572732f169fc14458f92611b9f0d8d457cd0622f2830a2ec4465e1051565035b4a347e9068fb32d7e6118dddf19b405fffa3fda4b7abbffdd16836decebef6a113da5b7ab3617b227b9bcd5e599d9165d31e95047d61d2184452e518be3f32d9db9e8c2f937decffda46992cffdcc837681f7b1048033dd8899ef8c5409b2d0402ea11459f7b6bd8c03e8d621b149a05d16aa30d470eecd368c45b829e841cfb7e1e3c778babc506b6b23690e505c6939d9c5754571417515d515c44754571d1c50598d8444e64626b0c3c534becad3172e21b2f309eec60517a95556e738d716384ed813e106603fd05cbe5de3c2191c55607d4cc3c229cad0e9c01c34e16505d515c8851753697d5934b95a144378b1d7b9fa24498522eacac4de3ef831de481caf314b372050b03680ff4e0080ec0403ff340996db5e581a81d7b57136bb3630f32a0015ab6406004bb44022e01fb34b2fd7cd0a6a977a1a5e05eb0a544e2485f050c9ec0c291143240fad2548030b623623e68425243428e0e5ac035dbf801175fd4b830425301a0a852c8c0004d5fe40c3b5e2021c71ea1a9833135db28f456e48ce09190c383a6dc9c4784481674fc11b521315e32514ec1fdeb30c4e012c830e70f292326ed314311344860561e355c95c1444c7ab36188597ddc20849936b3f2980a62d21b130e404c7acbe1ca1131d81c212104e1080925e870e508174876581d510284235d0e0811a04497339d21c00748ff4df3870784563ec83d00026808d084e4c3075c58f92002e1075c98b0c3102a21f7abae6c31c2c2c2bae644b2a3871d20cc79801084fdd51422e0cd57ae0069ae6c2ec2c2c2b0e644b283871d3fc3a403ccb0038424400873cee93dcc39a7e7e038cc39e7f4a839e774167c8539a90bb4052a8686a12cd015a80af489a640c15028f7329c0cc7e31bf0315c03fee56278061c037ec72fe016a03088b1bfb55a2181015acfdeee8b8138ec0963b9f3f168d4f8b10174631644ab8db21ddebd210801f898deee7dcca3878f087e682038240012265d09c2a4506fe0c5dc5e900c4cf10d5de0ce894d70e75221a3a08b21097c801574652c848b20407a8443bcbe2c44a22d80f8b8f510b140be1f0b43720328f2cd9e5784d322cbfefe871abfa7655a04d92f79df833ebc98f781a43f8f3049f89db765de77e1771f7aa40c244308c2279d4f98a97091c3f7f07eb5f049f7b2072d3082635444890f1431320123172491e7020cb030c8e08d07323842e2084fbbb1a70444f62390ca69272437e8402e73a63fb38db1d8f673d5ac21c63ef6f641d9dffb312d42ec972e7eb0bb21f6fe73d0dbb1fba0ae35e93cefe767c91dc02954d6af5da31c91cb09c694732472e94f4f50f44d2e5d4a6aaa62e5d2abaaac6c12b9f4ab2bac3b815c7a569656a7442e7d6babcb83934bf7f2f2af6f895c3a9883e5624ce4923e3d41c99ac82595929a02b37249abaaacb013b9a4575758e113b9a459595a2214b9a45b5b5d3d717249bdbc7214b9a460142ce723452eebd313140d39b9ac52525335b47259abaaac7ea6c865bdbac2b241452e6b561610b63a4a15b9ac5b7babd62eecd58b12d5ea55ef50a219c5ae2f38edfa48c0203a794f2034ae2858e4259587ed521c9ee788cd075d8793eca93a7ca8508dbac30604372208a2b71a0f9bf7c8e143cf1f3a80ec70092208c2630ef9a81300a11404a91384497432dd1560aba31091f70452f7e482aab341220f95d48460aba300917d88557690085b1d654d2e671d0f96489845389841acd01a2e27168e2a13c811952c88541561aba3506523a31d72595464c48222458a9cc9e5d09090092a306244875cde6e3f78f8b03a4a0eb9fc2d448990e859644f1dd3e8c80452bfbe934754ee5c807784f9872a638021083fbc43a619e008c269a5a039c25647a99343bbb1d5518edcc2a4a309a43e075f8e60ab7175327d1009b61a9745a60f2661ab7174327d3009b61ac795e9834ab0d5b8ad4c1f5c82adc66191e9834cb0d5b82b327d1000d86a9c15993ed8045b8d9b93e9831a60ab715564faa0136c358e8a4c1f0c00b61a3745a60f3ec156e3b4327d100ab61a2727d307a360ab715264fa200e5b8d8b22d30737c056e3e264faa012b61a0745a60f4ac156e39ec8f4c129d86a9c13993e48055b8dcbcaf4c12ad86a5c13993ec801b61ac744a60f0a005b8d5b22d3073bc056e33cc056e394c8f4c10160ab7113c8f4410260ab714964fae007d86a1c56a60f5ac156e3de64fa6001b0d53824327dd000d86adc11993e78006c35ce4da60f5ec156e38cc8f4410460ab714564fa2008d86a9c04327d3001d86adc55a60f8680adc61191e9830ac056e34a6c354e884c1fc482adc6b5c9f4c12cd86a5c10993eb8006c350e884c1f6400b61ac726d3071b80adc65965faa0166c35ee874c1fdc82adc6f990e9832260ab716b327d70046c354e4da60f2e61ab713d64fa2009d86a1c0f993e5802b61a9726d3071d80adc65565fa2013b61a4795e9830fc056e376c8f4410860ab7168327d3002d86adc994c1f34015b8dd321d3074fc056e372c8f4412ed86a5cd354ce4c971b50b0c14b19a71abed000668614a49e64502186156060212a0c1931635a78c1052828175e68618c183261a258806185185490e1492a8519b0d53830995a8dfb92a9d538a74cadc679c9d46a1c0a995a8deb92a9d5b8dc54180e67e4f0011df29cf1009a0eec600615581507d294c103193de051b3813563f8a0811fbeacc4609301203010c49d361710c20243548008afab3024408122c030c28e9b2f8ef002892ede74617191c41613d0024e551870b0d551b6b27d4b85024c204913261d81c104b63aca15d9fa20258726acf8c1ea2873b2b572e20b3656e3bc00020a3741c431a24d1445082185048690734584d610530841459b2a8230c20a336eac60734468b1980a939c0a972381c50f6fb67ce05293049d1e26105aaba3f090a9d551d2c009ed16fe8e264c3a42a243f6b73a0a9a4cad8e8243a60fceac35b9470c3dcb79f0baeb59b652a7f22ea68789dd27c9318d3af2d6af2119402b72691fd31fdae4ae51120074d020b1271d3465b6176ad0f454979e08dd2fd1df32c376ecc11b96b0c5db58e84f0d669bdaffaab73bbd6586edae76a412a0a5444e058b8ca97c914908da4b4164e90ff830d1b539a4f2fe7a3f7b864986badddd6b1d6b9799a81c9a6121c9d4abae5279d08762cbc9852c0a156797b905385c2db899964a0bb9cc1edcaa4443f62abd744e52152973ce99dc94b5cf42ce66f097cb5991553263bf1093fe556442966462c14cce397f5be34f158fa9f2a0bff53d5325f24379d08e2cbf4b82816d5ac9cc82993cd50571dbdd5309f3d4ffa8f2e8a6b2ef2f167a75fac7ae0e6549aa1ed0a17a5e687b24d6e8512247d39be46f6fd70fa19639e3e56ae8aea44385f1370e851552cf4a09153179466ff4876ea6ed55a90cce326d441fe925e3a6023f52044bce66b3d9c6b35188de2af954c4e42fad0a4c219860e50abd635f06ad092605570c739cc9d21f8b6fc8d493d85d64e50a25b2afa401147af39db4444a13df97f36c7697541ef4ef4db23683cfee25f436a357ac48690205a7294eee947e0d006bf7e5d9df86acddc2b46fc965fb166fdf72a96e251be80a25fd12ecc6f238976037162157ce17169e3378e2ecc9b5c2d62eb227d70a356c7b37fd3b16ecc9a582179b8b853c7b72b15087823db954b0da61b2c2608989da540c7d073b27a9eedb7a2fd57d1a0a20d7a00964022103aca33b570a75f6e4025367973936e5026375fdfad5b5e6294e546d29d5347270139167dff6e41ae26b5b2e15a4f6f7344cfabaea3d8d832bf2eeea7b64fd1263a9dfbd935a3b72296f9aebb2e987754abaa736a6c16d7fe8cdcaf68cd5aefb5a13ba94778cace572bb69df5fca5f1581c97dfa4d6c2e37b31900897cf467466b13efcb9f4924e6f3f3fde472fb8bf9607afbc8a5bcbd6742735db647d69ad0db2de51a45f71e1630fcb223a9ecfb6474ee4f168bd1c7e27d0782e42c47688ae9cf9ee9a916044b0fc4a1d893dffabcb59fc9b26efb3d6469cbbbed8764d995deb60f7adfbdd7fd11f55a13fffb35d6fd3bb5f5afb5d6da1ebf2f80b3d65a67b8d63a3598fae696b47fdd3ab56ead15aad38b00dbfe154b7df2b364f89c8d6367d069214e0b511bd31173a6c749ab446f13fbe40233b57feca744f3e96d4bddb58917f6f3bd6b7fbb9c60b34964c9149ab73a5464c4be065528918965df4a085ae81225aadfe349c422d9ff994473dbaead446f93d20ea8acc80ea8ac9aacd33276be38593c4e70a2ee759fd39dcecc298565a2ee3398406fb72aed49a79e378f532efd69fb157af3da7ace39a54b9e82422e5d6afbc7d1c2125274fb312a9d913dea7e8125b8972a1377c74e4ef192cbb1c9fd0a38c54b2e85f6945243a664f9337d3a387307b461f973029c149c94ab0529ae16a0a69491fd7be84465d1895282ab851c9798ae5d7e5c62aae012e3044986feb8c47089c1da3f1c00a2f3e5ccbd56cebd370337de77d63fbf9dfeb05fcfefbdf78be27f84111e39c41b7f7a8237dddacd90c16aff4e2ca40ffb673fb2a376e68401129847f2eb555bab3f0d4594302ae2a24584e8845a6d572da8b676b5d6198668094102f3b456a0c404b5d65a6badb5565bbb5a8728a594567a295da2d65a2938412b0852adb5d66a25a8b556fbf56dadb5d65a6bad407ef8e8c1e31601045057ece0027585900e527f0e1cb6b1460b9af90d24308f148f84defcc36cfad58d67a9a93694d9f42b257b2625ba7b96f6297d3438feabbdcdffb928f379bbbf18ceecc905c3995de228b00dcef9f3952811ed3da044b6cfe34fafdc81a5d09eb73de4f910c98830fea9f163e3817ebe0694e8c64f1c5ffbf1c530695cbadbc71a7966fb4f95a9e1f8f171fc4866b9edf16b6ffb304cb2e120b3dc76b6e5dacfb04926c75cfbfcb4c76112ad462e519a48d3f967d8442427bd3dd972e2f12acac31f14ffc68361d28d7c03dfd0e2cfb00926f33081f8815e1626012df99601c98034fe1936919178beb2c8444c66c11bbfec6d7c2c4cb2219259f0f6b1e163a3890f89492b3eb22f4cfa91914b767b3fde8ff651f27cdefb1aef854935ac777dde7b9ff7c82c3fdbebc2a4cf87ccf2b3bbfbd39bf2f077f41ae9f9fbd427fb944b76d320e90d6b28fcd1eeae8bc5625b9876096e8f5caa1b874966585858d813cfe5dee6221358d895dca03d0d6140fb242537b6fd7a631d50b32797196aaa1425f2bce88d8b863a60b5b7f3be98ac07cf79c19a12beed46d694309b444bb38dc1a6b375752f9687f7411a787a11ea65cf07cb80c9e58502cb03769d6c97b54343fd294eb9b47776fd395b5971dc6059d936f68cadaab6ccae36ccaeb9ed8407cceb4eadb36bd5da73e0d42c2928e4b2c2d9d5c90a87deea5553db9ca1b7aa5dcb7a66d7af5265dcbdebea5495a244ae661aad99453c2764a03250a85dda5dde3665adfb925e9627912dbdd1496f240d2b97454513ab863844758a12959ed79e5c35b4d97557cf0e58c35753d59ea69f3ea41a098ef8411b9e61e713a321abf10302dd9805bd102542fb1f4345da0892255094b4075642c8426ffe34f41253ce9db487f13bbbbc58b70dbdcd904bbaf5553c94c88b436f601403dad7f7ec4825a1dbb3e32597552aceae5f7a55ecfa73533d3d12ed4bcfceaeefcd99446855f5aaf0eaecfa5e1c4a14839202bfa627964fce2106a79def4ec633cbe34e370f33e451ef200ec5efc93e4fb72a59ceada24c96536ba8872c67d6edc9b2686b680b24ebd3f4bda23cead3aa4ae4263179542d22767562d7bff5832ed604523fa66f1b7aab5f05895c52a8cf69fb7bb58b12957e237c72c9da053585c37604a6361c3de40103039bbdc9a58381d11cd8e77093e379b0d3d5d51564442ebdabcbabab7b50e334f97e59ed746495226e1b4d56c5c9cacaa24920979e95a545eaa06a63656545bbcaa55b595d59ed102222972e2535e555423b767027cf79ce7343e4d2739ecbed80004d9610bcbc84c8e5f40ae1cb0b8208ce2841a1b7fa5a53ab4d2ea71694b915c14d07a1ffaf0591cbff1b4d571b767d304348734e505633bb7e9d610e71b24a4d20b5ee293964af7fb5a6d1dcf5af1b4a04df3694e8eac6f982c24b560122971f4d839921adf1ef11263959854d2e6f9b7ddb7810dae8c3265af2c3ba41850c013a943f790eeccb6bcfaeada955b467fd26a4f9b50bab5ed13251356b4fbab5d8b3c6d9b34651a5d855ce9c6a45bd6273edf965a5b36759b5b298587891b9cb4a859a3dcfcc20a557b1fd3f2cb6bfb7b5fdbb2bb6ffb562fbdb29b67fa562fb53ad55ed50a2e9f505f6219537f7b4eb9dfa55c1724f505253555616a9b457130b2b0ba9b45a7be6ecd69eb62bcc8ddaf39b3cefac488395e6aa4a2b4c1aa74d691a3c4bb63c48736753fae199142d7239b13a2146e86dc8df88f52e74628b8484fc8fa1395df8ce88b327d707e2ec72c88cdc96e2424acace7e1ad5796d19dab5619293227cdbbb5dacdc0f1c7239646dec28e675f7eea22121462a133bc5896ca964e44879785125c36dadd60c1728c54b76cfb27d5bb23461d7d9ce76de90cb71a4434675532f70d2211144e8defb89652f93ddeb1f7b1074dfb719bc36de422a0f96e536587197db5d6e839dcd6dd0c31dcd6d3016f3c4eeabbedb6ad0e23a521e949412e5b4e63e7ecf846bb5b086fe62ac91407bf1d34d854913b820ed294465b4ab620a0ed7949b3da566cfa91da6ca906498f9e232d33515866b2a07872b0a0b3261cccc996301d7183864cadcc1f2b4e8f410a78726e6a4d3c3105b8cc9e335c60e79862bca8b2bcace6c5bff7e56ab143885ca4fcba1a0a468579757cde59eac16d5ba5f5f601d165696d7d5e5f559595dc5b4b4b66453535520d6c5ba59505052565657a297cb3df54c4d55e52fefcb03f3818292fabeafca0638eb82f097fb72dfd3b64f69b11aeeea1a33904b4fcbd3f2b6b6fd6bc3402e3d2c0fcbcbdaf63b1c9e9567e55d6dfb5e8e9ef7a03c284f6adb8f691ae4d7978eaeabebc2429d56a7d56d6dfbe18e0eabc3eab2b67d11825904dd5437d5556dfbf956e3d1e5ba9c7d1a3dbebeecd7f071bb6ed7f5daf67f7e5cadab65df06102dc1b5ba56f76adbbf114468e8425d28fb4113dcdccddda76d9f46c1d717d8b65fabc076d92eebb5ed8f427a0cb15816cb666dfb38888010b15376ea8b2c9485b252dbbeb6c0e66cce3e69f4f5655f47910a8c602dadad6d7fc705441854ab6a55afb6fd0832a85353f66ff508ca3e8fdd03c9c811dcd5f503490649186b5b9ab5ed4b90e44e2ea9955590aa844e4d0d2da150db4ec0240900f8ebab82264b34c05a5a439c5820978e8545540350815cba951591273e355504250051f0d5382f231cbefa6b436ff6a38449be01be1a178691a9e475c16725250c0ca65cbd0046815c7f8654c038aa55ec6c0e2ef05d7d5848e167050a00df0ef0fdacb6fd2febbba244e597f5c5f9acc694d9f6bf369f1bb7953e11636fe90c5fea9f169031e014a2b1271d1ebab6a77162e432e799ffdfe8d05051c53acab25a50b66e9795e9d5cd2f2d33a6815cbae79e6463e4d2a1a05c0af4a929afc26e657515e2c9a563618122f634ee03b9f42e0f631299bd7dff62d6a86ddf92b6be3083b818db92f1a22793e15f3efee5603e65e468e47234380055c34249d5009bfaa153553f6658d9c85615eaca4607b0803e2c8a05e4811b566b6bdb076de499cd234a450399d22e2fa00de4927ed12ff006f634ee2bd72a5579d82febd3b60fd2bcb006de0d58c8f5411cb6e6e8e87f5a46621da250ae3b6850087e3c02a0795b81870a3d9e7ca4f0030c902f123805f13284c2041474a9007b7a839c902161b9be30818044d8d3b8337259a16e9846e1dbaf364ca31b6fbf969946406fbfd6308d6cbcfd4ac334fa79fb75866954631ad178fb558669e4f3f66b0cd328bffd0ac334ea79fb356a1a896fbf92a963ea0bd3087cfb156a1a99f1724fd823de1043a010dbc0e00f28ab218bd1887d3e9f97bdaea7bbe20d2d8dc56cac8631b2ace190b0498e0d92327d65df11b98d918b7a580b7e1849408b0cb9110ae61582015106454746db081206f5c8119d6c9124d59044c91226006852460327017802250a6e831a94a44ca142439519381040071e0c80001f58912a80010e70050120242084310a28b148655900031aa0658b08238c5922a1042907303d00021130e1042e4db92e28788972fa024686149e5458810c0b616210d3021917a05e1843260a861864909a8186a81acad820c30d66a6702093830e319c41436607aaaa343cf4a0668d0f3f445949b101228836420c1145c495046428c20837479041e24d145612314c204a09384b30d144161927a29e9082224e145244c9d1929a828a2ae6587145141658c8b0c545270ba93a5a446dc1450c5d5d7841e60b3b5260c4400118c2f0aa8005a22e40e60e063220c69706c6d8001e32cae0c01830333ae0813c1f38c3c3725d50f0e2f4054c0a4f2aacc04218312db800f5c2183251304449cd4069a8c196b181de60c64ee190c3a7c31934358adeecbb186152859a40ec53d140cedbbfac50675e40833dbd0154ae9edec0855c3dbd410bb97a7a0331b97a7a8330b95e2d7b272364f21bd332a113d977d7be6b55294a54bad69c0a1567dbaf51b696f10ab89787e1147030dc8e7fe15e7817dee55cf816ae85d7f12c9c8e73f99663e157b8153ec7ab702a7c0ad772392e8547e1711c0a7fc29df02c6fc299f0251cce0ca2d7a8248bdba8821c3234230000000004008316002020140c08c562519444619e15db011480117c8a4258489fca03d22086511cc4514c2144002140006004464846e30031c958d09429e149380e9a18cd10b66149860fc81709b6fcb3106ff15d15e8809fb4d3b65810b5e72ae8614ca4e35351362580f4271baa4cdb6118e0d88bf99deb30094bfaea69e1fdb4bd0cfa20bdf0668e64302cefaa268d013a155fe8ca8038fa98459b9b136e5816351d546fe02a1a33c223907753f849294138fd03f7a97a92e633c4b1fc57619ffd2a843f1bd8d72ef8014cd705afc876838e73a35ae1defc600950e14a7b162d5e77577a919edfdda6e175953f43fa8541e6708029a6b9fd7417693b483792ea893b5acb712be59d948558a39e0d2ba59b65fb3e951239232b54010b60a88d3f3e278835ea536b770033bf530ab62762e8cc64f199101369723cf1c423a61001c2691e5c2b23522bb64f8852d5dbb513c5b3bfcfe9eab2c7719df6598e3d5facbac5cbe8f144130088868ace706fbec9a15de7694ee48f45b626dfb952279b1930359d5f32ca664b45c04d3a05e6dcf83632992740734ab80a2090546a5d6de830ca8104c1f6e1a4b32668848ac09edb4a96dbfc56d1fc24239fa40ee68b4efc133ec485230de8021699de9120bce4c91161295bdc2bb71a12f50c2fc2e83b1de8403d5d907046d201823379b82d75e6b844d7135e989df130937785c0d01ffacd4e12251c2a0ceafd16f07bfeab933faf8eb857795af9b9006c27cc255fb3cfb7e49cf85d8d6d35ffa0fc74f2e4f0d3b590e0c016c0123cf6ac7075e3ebc94cf6a0e737c85213b9f04a181287b6040060d074238c0925c634e6dce05f36176a041b0ab6041ca4cab69cf16928c09482bf995429abfdf58584f5c53ce5c335ce0581f0c8fd5d885ec559df77a639489bf5c3a8d5de45257527aed497d03275c517af187c53b86fb10442099ed8c01e42be1df4099489d08e89b92864db9952c165a1035cb834039301ed50db574d2d8601aedf672ab89459709c678eaadfa452f6f765ac56ab196f426bdfa3730ec4896d166d303ea04bcf32802fc9ddbe3941d3ab49b44295f1c7a92c75e99f2207d38b2b980c1c80fd0eebad869ace5d36ffd9ea235a141130c9da20b68b791b0f79a9eb2c27d392d4801fcc1decde51d1417a51ab07544fa1ef17e1ea471e268a09139ca475ddea0f7f10c2f4dcfe2a7ce79b25622349019414d877853781c7da18d10a3cfabae15a8f4145a50ed8ebf57efa4fd23b26d6bbc43723108c24f8dac105faf0f03e8f553b53ceb707bdae112c5410d9c41b27f6037a5d0ccf28274c4c47ab04f23781044e08f0c454a157e8a3f44e145cb15c0ed715301f59173d99acf5159ab6f6d088ad0e673d466cc56805105bd1807d145db5ff5d97f3a7d49c21d0e53284bd73402ba57510f5407af35946e63887a4c6e8276d300ebdf969aff306d66c3b867b8215725576458b1b84a80b9ae6d643e92411f04992df9cb16bcc45811b963982156de46e7e61425cbe904554ec19471d7757ccfc2c4bc8d14c5c1d8ffa06624d8e70ce40bfd524ab8158f4b8584454cbeda62621c5598870ca2f5bdf5da726c35262deb2ea38b3424dbed0af2d3063bdf5a349ca11a593853fedd36d6dac9cf3f3d6ffac22bab3b46562eeeef9388859a9e12eaa62c64a01fd3b43123c7f34e3e3548c7c4bb14e0aa2fe8a9a4896c90420152896a4e2bac528f22b0dac9a07d0c6d23bf3c8499f4f11045f747e0dece08ce9231eb0012e3273eb7274cf6a6fae44cf951e4040e3eac08de3e680f0f0368cf8008b98e1256cd52c16ca3d024e9880aac39c7bed0fa891e6779df0e7610c4316eea493de8ab0e6a539ff5e8fdd016a8ccac2e61509f450d7f5583d6b02a44316d4fb20e8d9d2dea203b6468d42f9382bddee0274332776550db14b232563a47e9b664933393f666fd1d071cb0ed3640f2a8458b7a376a9848173d177de607fafc743acec9dd26b774f660f3f45024cae6242949c4e498b07cc7317c971cc0eb4bb9dba941274cdc8dcf45ecab42820cf9d108e34761d8112af4f73919430ef33691725229d1e2799dae3b674aeb39ae6dcfe48c673296fc1403cef48bcc7b06bc4178fe64e810f604a5a5800debb929e64ed1a81a02a0db88ed30d9c6e576024057fa4642dac75f5876dc95496b799da4a83ba4721d0b91e3a354691e2e9cab7b87f24ef269bdb2c88f63355698bd69fb911494bb611a73596629bddf36890a90b485f3f0e8c55be05fe242fb7e704abfd61e9bfd23745e1e6ee87e6a6490ee3d39d3e34d786d55ff7e7c2b3d80ec63b741edc324fde0dc6bc3d60bd1c8e9c443827326276c1ec47550dad3fcb0cb46ecb489d51d80cdf9583e204b8ce3516aa7eda3bc4b78b76d0b64ac54d12ceea7a820c2464fd21e3cdaf15c5e6ada52b67746b928c04a3b28fa147ecc3cb545a697ae6c6e9279112142335a011b3256f40ec41913472e2a04e41a73dd3e61a3678fe9501cd8e570a73100b15927a65a51a7faf7f910cc91175aceae154c7de9c88860653115342f5d1393bd0b5a46b111b7023ab206ac4f4a72d3af287018d10e0c53610edbc9c05f3b19c452e6d5027a2919a48338bdb417d98cf30f0ae301a7203b77ad0c6eb2fdb148cb45917ce765ae9913784f30a2dae51ccdb68395fb70456747e436d1600047bb6bc8cddb69382c82e5568f6ef38e98636cb0245de35f9981d24d7ea562249d84039b42bcdde774934a9266d220b8a5586caf07a514abc8b16cc2f15cd9fa0fb28a5c4a5e05d47465b944a0fcbf920ccbb3010a3ff213526547c334367d6e6482dde56c0fac6a88709287cb9cec80afa86a8164c68f55fb19f4be3ed65ae432d86d2586f290afbdc70f54c5aaf04df79300761afe1d8a6156eb19e1265ff6a990a54304dae285b2f0235fa163763a2329e37843f3259106bd738c4e233ad6e20204144de83cd3358bedcf4738537ca5a4a69e0da203720197bdcdf71fd48c1cf3031219e1f054e6f9d9370ce9fa19af1d4b3e3e9d88d1524a9269a49788a0709f98168c7e66d24bc9b28f67f06279f717a85554d289acfc512d7dd2a66ae78cc7f3d39e2e99af82c5aa688ebcf2763419b77055c64c779fe7a9a40d6d3267479ed9b726f4cf92103284b25f595d88abb47094458b697d410fc441e5975c87816fe527af711c8f7ce32b1202c8b1402ed9c59f9479cbb5eeab268a77dce7c7a539a6bb537787cc6e3d538be72dd1f41e9fc3a1858c45fbc47d79c212adcfcddeb00a6b5fd462c309a2077ccf1dce75a3ad775e89c1e3609981d0c37e8d7b55b7742308317c018a2030186c879485950741cc1ae5786bf44c87cad0437d02db4c19e88615b85f0efebc4f9c2db268e92fe82ef84ee277dc8dee644703bc41a79bd7b8a2f758ebb02ed665475c3c6f12f68252b74242441cdb7bcef12c4cb21ce92e39f37b8dc8d86d7a570d86c3fd4c2f76b5edfb2d84fef641533e9e05ceb1960f6882997309a9bf5955ff17881fa42e102836bdb395f41e46fa668b67305a844f14dfc0562996b248075bee4a7f29cedf2a912a7d87e9c37f99a51eee696c4d3d1757039935d867519bdc41d97cb2b498d50150b802303bf8b0ef1cf51ab081aab88277b93b402a710c30cd4073384608110d19128348a205036f59acd0a586b086b179af7646470549b8b1100cd48b31dff9b8a1c65178d431d05a74b8a7e610202ce31cecb004ebf56e027690a91a67af95ca4cffa670c506d80b785933b28811c34eeceb8e7eb93034677c1b7a5a341bebcbdaebff080c0b5daa2a9e81fb608c4fe2bdb74685f6326e4568416dfc1949233127f6e83dbc4ab62eb5415d1135c1f6592513123d51e338565006f11c30bb3180507ca0930edfd183288d887e85701853c9e6fa24201671788459b96eaba1823d0bacf4ab44b4f16fbbf889ca0f4c800ed3a9274c12ff0406efc40348544ebca6c070e613ddf5467a0d4ec464cfcf659bbe1d84119ecd5a3b10738686c1560f5c3754fd0568e5c5c698d36e8c7c808c7bae5fec0f3c5bb4981b842f53cba0014c4febc41522feb1f0c811ca83f17a8b540331b6ba4e1408c291dc53412d9579fa03e2361229fe49829bd09d727014e573e41411f11e01eaaa087ee49a07bd3162d40d028214a91674913518446baf5aeb67ccb67e426e4c47746093a014ad1aafc37508722f7ad3e7c213c870c13fe6cd114d4b2f0fb629a00eccffbb91e6da06c54eed86bb979f7b2e93804358fac34d23ddfd7df0138a4d56f6c26385364129ae00f84d105b2d25f309784808b4a738e974c5b298cd568b7854aa3982e99a6d24cabd12a039526a99482a652c8cc75940e8459e43bb13a78402087fb0ce0531a385ff3dc482c26be647c0df87ec924456ac8770fc60c27ea716abd12d7daaecec5fecd7d55e2e236d4d425c96aa4ff73063288720af97b79510e4271fd9b351d2890052923447e91c51f960ae2b13a2de2eb4c27dfadca345a6b01ef9742981f2555e7a99f2403689ac25464c521cfde306a36c49f67bf955b54260309432e5a57c27c940238f34212a48923de5ec903682dedf387e04c26c18606f73360a6404dc6d9645d16b905e8c7312beac50c216b479c3d12ae505561f39e41333866d9a3b52178da6dce9086adf3d44f9201344d612ab24212288e2f90c10d8df0f2571470ef2a6f6fd138d87ce608b6e229c10313b60658e3e91222ea6fd01af0543584ac1d2d2bd81587e12ed239f7f7443246d3b4e74d7c0e7750b22112cdc23caf75425aae37f20ba5ee4bc015bf37f69743f820322a575698f38724cd01116655cd50ec2ee1ea41838a6c71e2e69b2b292d0f11e08ffad1066e2db09966e3fb7e5bd521b0416c0d45f6ceb708896251296273993ce20c214a729d59970014273f5dcabb122f2565660e31c8aa2f1f219e64338647cdde4531ba10a99687b8d9ed1367c806f1042f7e51cb699af5a599137e549ac07550abdd3213986be70400af24258b92afc4dedca6fe43418c1989a9e300cd6933e3c44518f2a43c132a842bf0877d6f44e1afdefd63abfaeda904f3316b6f15fe5f90458eb46a71b043653d95e7bbb6606e38ade3dfcb400096bdf4cd0cb10c9c279ddd83f257b696ed1ae2459945aef06bf4127a662bb150b6deb84433e489727fbcc9e9592f45a436b31d0ab0e0f769b470f249ca03c75b88b8d130c74363f8789c75ee88f78cef9ea4f39c79755ba8eb08f6f298a49b371aeb862e0c00958188c7c2c210bcad4915b990af6496b3555759cc5e81b7f3f45df7fc84a92f26cbb7ad6a86dbe11ee4e0a3db6be3ee999e22144aa14fc8f3290d717bd73e57ce2b918f4cd4181538b4abbe5f9acda9f0616bb8ad2b41fe4066b91e001c50b9a8e57db50716464698b5213895261afff76be308536944e6f3fe2d1c75acccc96f0233093f440c759dc543072a5b5a0ed82e8b30bb061433aadfb5ec7dc063afa51906d0c7e4a3d1a79c0842bc77a1e50336b60b7ad541da43a5e2d94b70a8dfc0a9575a63abc9fd221f0f1815f1bd8ba043899e366633877bbf1a038fb2d7a7cd74e8b8842fe165a97f50fba5f2698a8b0b70575998affd80ec42f30213a1b4f4e66b72c7658f4f831f517c7d6dd8ade7f7704766ba0fdc6ef1e14a9e7ab927fa201716cd0219b276ad6cd08fce0a777d6dc1dd638d97cc2f5cf9426f4c7c0940e255b33721bfa0db133e2f389c126162d5262fe15fc137b2ce0bfb03827e9721efdedf9d3270695ea55d43d60e78a75955419d070250860018cbb479d2711a7dc0110194c482d7df240b60c6eb6050ba78c5d53fbba5a5acdc232c5514ac1bdcc954c682696aa297901dfe52f9a4fe43eb1e8506ab2e65f5ba71bd86765021c29a5a8df6e5b80ccababdfd46f51149e2d6407200fbfefe3f5f0f263a56a8d169e8c92fdf615a00a2699180dfc78f8d1d0b1081c358b6dbe9f52eee2e3dba4790c40b754f09a1869b727d811227c4b08d0abf0d3c5655ffb1506c5056fa420ab4299625af1139dc8b6551f9d8c3727d4903075bbcace24ea8b9165d237598a4af222a81435d3c8b928fb1b81b9c4158a3fa27d23851fabbc570a2bee0a7fd8db75a0912ceec36aa95cf511e472078af389ee125e23868c7b6565515007cf0ef6d54152776d96da1d0176b9511e001bda766515110bb521d001e90e3f9f900039e1d9605d4c312c03d5002a84324807ea0076580d50f54e1d28841dc55289768b94663a1b50e5a34c9ea480b1bc33490d8985ad5911871a8b3d32c8969c29ad9a2c465d50026f6d9d2a3e7710d039e238da646a2ffd59c0e83358bc4f87bfebca8f0fc3559e6e64f229abf68cf993f98975cfe0abdf2b709dc4195bff9048bbfc0c5a6913113aa5efad438a1e3b72a58847103bbc4bf39bd8f970b6b320687b9b158f5f4342f7c8f18c2dc196f63b8dc97e60d1799f67071d5914c909f8d81b7750e8e1633f05baad9c49001ad2b8709ae1abdcc7d91244356a4416aa61545e2559afab74037d718c959acb87341ef313552e3d9dcd910473b04d188f57d8ccb21b2bb21f7d3487ed2183163ecd023b25ec167ec668a6d0f74c801255d003f24b901ea15400743617efab095b3347093e056d2207eae98c1a098377d64f528833345770f460705cdbcf5512bb7d4c2e5e6b01c90c432e55f667e345db979c1d7a9d415f7f745e2e188ba314ecc224df4e65763781506f0362211ee84b39083639ce2df0640a5a8748e2eb3a499534436b00330bb1921493d431b5318d5540adafcdf5311433b9b997c117c642fa0ae64a3ef96477c296923821509d5af589da1ee98d9a14e6d4acc0dc9c04d1af23c3dd80d49e02e0de93c3de0c64a06e249d02d2b29548e9791108a356ebbc09dac1e7b1f52df987e3cae0fc84d33254374cf27eac79a95c5e81d7f6c578f1bb8570f62d321f3ea7dc8be00ee03eb29c97e6d3e7575c75c80fbaa53be5980e5cc79a6097d12f06bf389e5d66b23c75825e3983e2961847bff653708c0da6434a0071de5b6bf8599a99f2c2d9785c5e1c41753dfa62ab742f28fb853144def7f3e798bba26430f2d58d6f0041f39100d3bb15fe2bbc4d908caad20cab07fa60697dc712a751c00256e4e5bc325c79842e4ec241514174094f1b65c0d269deb54ea56004ad8bfb6864b8e31957a5c80a2f4c7d6a0c804c9ef4ef8016ef2212369cf46288176f81a7dae469f82c16edbe8c655cf0f867278f3b7955e5a1db074d3e1be7e815a94213987d3a748dbc4c9a2537502321ab67e0716c4b339d590fc909f2c4668c507ee45cfd1ddd01a26284f58b8e1740ccac1a3c1984ce99f7018d81c3877979d17e7d2b1f3c83f3a063cf8d73e8b07cfd567e413a804c76cd5b139579c4557174d2dde99ae8986804321550a0da9d0fd534522bea7f1d7eaa57e1c3ecc0303706155c85ae8883cf426f86e8a08a37e7aa5cc7fbf1af6f9d4953e233cd365b9dc8b6df50e2b3a7fcd481dba2726efe05afe2d30b0110d8824015ead8383810c0e32e775d875668c894224f7eeac65a2b8c87b6d3b7310405675cfcb221e83206b14cfe7f5b07901dfd1afba40645a2bbfd78d7e90c082d43f2e6ac58f4d0f0946b629a89fa37fa022ca0ac8f23334ee148e5b16adaf7aeb90e9f20ffe1284ca6f42a754df22c0ee44182644860e694afa38c779c7440a90d0081bc128bfb8c32dd608794210868faa5cae575d86b6a2cc2041b519a2439d01b4f819cae6d0b06bfb7a53641105b8f48aa150eb7dcf790a59c14002c885aa99cd0ce77a13c3309119f0a8dd92e73dce3b1b1190da842f80ed61d1ff30499340653443f17611573c1d8d53ae2681e7c8eddabe53d95aebfd6210b054ecf5cd745da8ffa5bdad2cc6a67bf5412dad575ee71ad551281552bdab26bfe538eeee7d814ee7a1f76170e170ebd197fb210abd57a22318d8725bebcfbd669dc6198118451148a77e803ff0ebab0c22b1cb1849713748d658a55451b0dfc774893729fbead8725b7f19ad03cf0c2962554145a6bfb87021aab274fa55be9e86f4a9f44610a87028531d1ef84a74ff088e143cf8cfa726de19ecf7e78a5741d068e5b405a95f05107148182cc1c1be7a0ae2dd3c27293d65880d274f08f25169a714d0686b8812c8aa048f487a2971e87228c74ec82de7014641b36b56f545a337224f33fa016350da6d2770fc527fc52441d5a039ec3b0ee93f55efd917627ba1499de40f68d63a3a5cd49c17512ed33c2a9006f51c327cbce74258a220d36e29c2813e545c827c61e2e041309928a50b36fe95cc58867df0af623392f5797862d7e5ba3b11a4eee93b75eb5cf1f635a061a15336db0f65d07a6039d2490dcff3c971bca2e526ab0a0ff4d062e7c39284c3e9baa36c0647c94672606beabc23b7e5fa793114f4ca90b1015c6efb6890933e0ddc1dfaba192a65ae10c50d298e80c8efa91b07661d8fbe22855a36aa3d69456fdcb642c1dcd68c6606f28133f3b8acc7ff17e2e6d53003aaa9569e3c7d5f080be51d27f075fd6d368f889dbea8abfdb531ee31c1be520ffd8bd18f40871658459dc98ae8596f00a68079b91dd053e2569f8ea65e85b10d208a9c1d5d236802ef9258e06891d069e498bc52dd7ceafc993d66a06eb9a8ad0d00e467882227f50006dab3ff8b845d61a52b3fe63411428a5014452a43522dd62dc9810024ceb8e1b63705c506c7de2bcac129b9444131213f6ba237671d06717b0fdc72127537a2ddfcb4d1dfcc8aff018b2e56e61bc5af3493b4a38ca7d3cd403e11c34103cdf5169610b8c4b076aa155d2ece6b1a0470731f8f445a33a8a9d5c114e31ecad4dd4176401f00797dede25c42e0315f27017cb12411844360ed8fde4ffca6bc5635be89661faf0dcf0c3c26754a140f0ed281ac28db1439666aa7975fba94a7752f1a45bb492d3ae3d4d6b15e26ed0d596a3f3c1ad21ab1964dbd3ef8c0c372327ebc6abfeb0b88cf8503a52d3b96a6f9382a99cc518bb5016a669bfab1b5667f1e52379d3ec00a97c3ad3cf2c0e467273e802c5b926396f7325067c65cbfd2ea10bc4de7cab68660a6bc96290411b21c829ae3576530d2decf5bffa0d7a63e53b9fbf949fdfb899229d2b752caa0e9cf983b907f2632c64c1959cdb3dc390dd9ba2b59bb8eef73c1cff51666df19ae8a735b9f720d90eb9006434560934b84d83aadcc421d04842a48f521d8ab9821c2d262040a085a1e47836a669d86cf8ebf453a63db7f49b7ea97db50a03e3f9d0eb7039dbe92278b892ae9e936058c183df824d4adb6df21752d4410d8638bd4832db7e1cc89d92f2401782f8406c1f01fe04611d70eedd144b861ea971cacbd13dab54859f3732aa848d4967bc5d7528cbbc12086cba7ae79333be9857cc3508817973d58bf7c8ad38d3dc890f3c361d221f9d20e8e1aa6bcb3805e0a0aa11500305920453065d99f79fab02e578ce99966bb74b3f6e0fcac6fda5f5aded8fc41e6e376237eee7c7ac003f9a9b4333baab4b133e66064a0dcacb74d2dc40891d1e96707a4640e40f77369684db3a2b3a97c7475d889fe9cda45eef20e52b7d1bd14c85a81199f16fd08f66cd233cd5d1b348c20bffc0c176c57c8db8679afa37e6aca9b5b15ea7a23aa90de20848dba78e9671a2e9f4b097aafde4c1d03e275eed286113dbc026936d8b2d6f93c1da1b3b7749c83d5948546bb9759f15a7ae40c031e243ac65766f1b94465048f497a3e7527c5432aee7f2fdee6dd2cd9dec3ca95d249360716d7bb3989f94c6504d3b4c5a64c3117df74f5073094cecfe8f3b97af404ecb5162c78336a84e580b28b4997cb07872ae42f00a5b6c19323014223ecd77b514742338e8af234eb64436a44604d60bb7a6114f3f00132ceaa7d7338820460184c7e009f52383eba240c7a2a4e1b8c1bacb026d173b5c9fa43b2749040343e7462158c4aef4662a19071087aada720a51bd827fab8500ca9426064f8105810211f13042dbae0e4acede26214946b3df0f4abe0bc5ae5b062dbe161ffc50ed2abf531d2f60a1e64c795544b7e7e1893db30b375bdb824733f3c5570e772ae5b70392010f280bc76e135837d00c2cdb4bbabc00391f960cf86fc88a312d28892ef0046258110c53ef0bba3628201f06f1bb62f2824ec1eb38f9a286bb07af183ac916d273cab934ce3c6dff9c27ba787e26109d4a6d01d9cfbe7126d918bb6ae028097145ec972b26531e52fd308cd060c1877dc35497a65b7dd4a9b82f31b5fc70adf845c8a47d2bba1561de03f018b4254e5cd47d760f5c5496fac4ef1a3e034c400769479679e450b8565257f622d57914d37c75b6e105bae1177a707c4413b295e3e238983fda01f1b9c65c359b3ffcd5adfe431e584ff38103fea0843ea3f5ad085378bc5afc6f06185a86114d2bffce38b2a76bf1e7a5720a6efd649409a65675b07749d1a613ae620f121399c5903be1f4c6d9af626dd396dda8826d50d84b6ede79acbbfbe612b7d5296227b36bb73fa459616954bbfc5823e008466bcddcc071c318352171b848432f8f30fdbdf8502e675c49e628cf1bf0638837e0b4650a48b5b948137555d28c7445bf2315a8c5709d943a040194e8f2718cbf4d0eed81f75d9bbb3f1e47a421b1b150a0b688b41d767541753f99b5d19c3b7d95c1a496e7df175a81433885dd4dc8d5fcd525bdc8343cf089703329d404c7563f0b0a5b8d6acd6b57a155c2d08157a0dc52b318f7d3b3a68fd891f78aeccbe15591df43371e1469812a04835b1919fbbaaeee21a743a88bb9356f5e805569b0f2c93362327e5c5a71f362566660fcbb5d4e01b83885ce661189e46f3d6fce925407feca6042db3be79896eccb70bf4a328d27d3a2799c53354de88d893524b0ae309ecacd19cef53797f15e2e79661386dc431da3fb6de38e7f96326b100cb4944e85f79476a03a94f6f438511496c1ef044955c1fdb163e22a14d5f64f5b4633118adc48fd346b61b60583635bb6c300a6e6f38546aef4a11735e6e86da43a083ccc6d485c2dcdd37855767579ee3649e5270109b749297b9fc2ccce94edcdc67a7acaa54bcad9b8f214cf59279cf2975cf6aab6a6d2afc467f359a242edee73a371c9a3177c923ba7e5b948fd8e8fa9be482972a715e3e929177cfde685f7718f8d4c16edcd9c0746c0634356c49b4cd995c59da8347c42e3125226d45c7e563efd505e59f4a40b80e8e5982eae4bbfb0530780ca1fff24bb19bc6cbcccaad4e6cf817d36ac9b1b638851ed9e83ff2281f937a74e620a5ea9be342c805a331d39bbbdb7d6d356e5c71135e13097829a5b9c2c2e66acdc9ce19a131631088cabb7bae260502b9f5dd3c77fe50a9a376d329dd41e2d1d78d5858461b45a7ba5fcf615f81746c77920ba6eb241b69e83f1999118166c3f34ae1549c1848c6979e66af6cdd805ce80fe29b291a2f39080a0c490de071aa841d3b9c8f9cd8edd0b18c68ef63d8d2ee49cac01280a9cf357655a238db61087280765ed51e670bc68995b5492a9bd4553249f4dece62d4957316abbb1ec7308713249f405b33625ec8408b299d7808ed4c6c65255892bd7c62a62bfe2b85ac930a1f010d1bb5baf321897bc46233e0573750a9282c3faa686f132ce007f5d39a2bc5936152f9425a6527d61415ad88988565f62fdd48e9afcbf85b39cff92362b15213066e8a0cf0ee0d933dc78b7a01e645888b69385354c74ea0289bf18f0a5d35e587c4a30af7b88cc4178bf2a48b556868dbe9564d06246639f5f89adbfce65a959bdbda4a55d9d461539d0deb17a132d85b1c54f7577d01812c0a6f20b4ab0efb39500d48d82d873b8bb2fcff29fbdc75a4403722bd199eb63effe1ce1881ae447f0332bb21163d95af8836e5dfa3dc83defdef31ad44383c531c4698920acd74d970fb8f8db1b84993055b5753848c3fbccd61076b09528feec91ea75c0a2a45908b28688e7b0bd2d9213a32e0184b02ef629783632b637d6761f5381b35f8d8e73eb5d7857aecf4bde6650097d84228cc463e74005c14c37b4f1d667eaed57f018b37a76b6b016aa48a2aae5ace098cce3306cc7797aa6a9058b36116fd3452f862fbd3cf707830bd069bd6965ca66d03aae6196caa8a2a8007e27703329a50bdf350733859f395621eecd1ab0f5c24f674393260afd451deb5864134914893b0d787d9d00f5fd1493c083c9dc05c44b3d4e09a5bcec135d5309e131d2442f6cd4e8c452f30b8b1c4ac41752d53fbbb8bf62da5e06347054ea05499c4afd30405f0841fb83d53ec92411a1fd05958288c1bee73275049f5a8c4d139b9ae9e0096cd57cce3c4cac5fdb9a28e67113113a771cb597a9ad72d34790b8c0786792a43f881bdf49465309bf9f30d3380484eaf2e8c0134564d5490b7dc539476e4e344f30319e00de61c6d5ee5d94c920a648fc434ee2baff8252efb0d28feaf2e90a6bcb36967a3a93ce315fdce385d177d63957bde5f0f7d4b261b365156c9dfbe583d3eaa90110110e9299989e24719565264a29b9fb4300889ded004b3776b9c8a04312d57c1c793b795ea81a52d0eaa5cd6b8fcc2273ebf58f1478fcf7927053a6596455944e7173c1e3bc50dd02234e8a6a22b7480a5a3b644ef5270c1870342cf2211da2db54108f7438aed998f70e258f8318d4eaea701085454f73f4592052baf4d995976507d476589f4c031f077867a40949658d40881207d07cc42fce1b8e07870d3654d708119f35fb040c0e85b03f920171ba43b6dfccef6d8117071e62e27afda0c06efa0a10aec13630d2a6cbc3f02f8cd1b6ed35256a141f7d13b43af67986fd6052f09381045404db2f5dc217077fd48ebfa7d6e062f4904a995f0f6b50b2a470c67ce46de38ef1c768c943e86b1541d96750dbe791aebe10acf7adf7cf9180e0aafde689086b557862884c807573a41eda8bdfd4e46246f5ee74526a32e27e8d548713711d35860f8a97bd70a11bbe0e986f7861df74ea9339eb8b1c9c47a71f595a6882f7e17c8086216d61f344f4294fc98366ecf7ee48f351262dcc480a0cb2606e7647828ca1b8d7ed6582f857057a558efd173a4e748aba439c58d6c7243f7d6823c56f19189ad4a44ea8a72d83ef9702c384afa7b1e9ce0cdcadde0adc56c2c6e165cde32cb468506d7ffc1bd7dff500e6216bfd3fd881abf16aa3ab3114ff8b9d155b0355b7a2807c4971baabda9f6a2b217d5dea8f4a2d29b8af6d84ae3815e4f78777aa7daa64caceb2d3d6ed0c4e70a337a9bd563a65eb37acde831534fb37acce831a3c70cbdcde831fb7ae86d0e87c25ef4a11af07ae9697658a081a58ee4e98a22d316140a8011e6d84f619f332e2d0c51bc64960550e606b7ba5195bb911f7c0d233848ef93d1afeb8379e4aa23a9b781714da7ed51c005d233379426104c2252377f9355b2b5da81b504b6d1ca817e81ad40b8582e12e04c9bced64700f55c50e784b8e891cf5bfb3694895e352b834cb8b97124676f56352964fefa554dddeb2c2e7d2c3fa9550689bb42e3461e7c12420d924dcf07aed38699a5037f1c6229d45cef12c1baa74f5854f2e68078e3bc13581e08a0be8965b34dc86be33f1db669e7c1c18b13ce79c1f23c9ed918ddd607bc3d01a87bd4f7595ace0ea2a2f81ab676e55d53909aff8911fc461048bc42f5d3ee36d33620298f82035f31ce3717c6fafeab4b88d30840fe60afb11569f83f28a1e007c63461ea701809f05ee9946e0ce84a1982a76f5204d59ff43f6b3d7ecfd60365d367dfe4ac9af4625193e8904fe571aa04effc02a986e7dd5d64eac421dc523cf3e97f3eb56d20a949d0081840d8d04c59b21b163f5bd5620102a970e9898c11e2d03ba3adcc3d9dafa7c7bb82f0ea03009af8c97a157686ec6dfbabcc302b0aa3a05267c2bc99e861f5eaffab25ccde261d9626aeca158fecefb227b5fc257d7be083c227362d4790f0406448438de62d24e3bab5e776d90f5adcb78cbd2349a75f55e74345adf64d691f4c752d1ac24828bd427a9a7b23e38d02495bb6d9e308bc6459df11f9b6ccea7b8458d32d34707753a9ad618f8c55d47722df02a0a5db7c339772e3244c5284c951a4926b617fb625da45a55f5b0b4a0cc57ffbb9270453558350df31c36d80f0319837069e8b70f0db3e22d25b0f5e0d6d4ce20730ca2c833aaaa47186521d678c17987872039740b7dc32ff1107367572a3e6147072e47b2c1b3ccc11469124ddb4c0516d944cd7e276e7dc0cb70bbd4dacf580be8f032bb4759a4bb18328de658d414e48bdb723721ea3ff59a01936358dbf89fd1a71d46044520cccaf7cca036fde8970bf449339f4e5149cc52099d7ed2f5995a474a2fdbf13fbac3046a153f4ab8bc0a4993327ee88161b37086ed02e1a659f282a2df632be811b2c0a04e52f7b9617d5d73e81deafbc69ac2abe51b85e79d485d073854f809418f4b9756646c223ad9a0d2b1a581c7013f187b14094222d5143b6aa1f0cd863013c4ae51589e5d9eddb03c17b892d64872b39d38df012a637a84ccfedc7343bd53c7e8b8866b1b4659bdd5f751eda0fc0c8547d29c914eb69d66e937a6c7afed45022c2e276a1f4ec01b88d87f99778e7f86570790d9de0be251689163dcd03602050fc7ac0dd3198d52d94b09de2b76cf922d784b6235f799cad59c26dddaf77e78e0645a8b5adb331f6c0d712efabba3487797d7e3c35b87ca5c70fa5a0b0d28e423ebac834f60032c0f89bc352ef26b0941cf6bec5211f7524fb0f8aca84f7b7487f3532fbc96377602497790a7f72e7102b3dee6dffdee03e788c004e7fb3d626fc85c9a8006ab39134cbea5c2cb968a0f3bc7df88f5430d9d1d8c61434dbd4dbefc923dda7086416336a86f02a1e92a2849b794d7655a629c162af130ddd49c980022ab65e34a32062214eb361364300fb4e942c34e077f887af7511718bf7b100fc1abfa92141edacb505131922496f951195ccd54177d93d139b43fbe067d110003b7c7a0dd432d50145c4ad2b2f9ccc24ba358a14832946b858618120ad4d82da2f44101329024876d9f12bc172562e8b23587a780017befa7cb9bc4daa7433d3aa69851d20122a99908d10b8de2a18a812ef5410fdc6dadf3f0927724112c3d723253184c47a088a4c45b4b7e0050ac81a91b9dc81f052422ed40be17c4390f21bae824894e9fa64d45572ec9d4d82239eb25ab9081f56de23219fa49f43a129cc240d49c169d1b83160c0026a474a9319000343a2833866ac5494540358437bc2a9d05b331567dc7fc27fb51a4c0f8cd60a6a2cdf74d145ef46327842087f18e7510a3bb5e3ffa16d37885d77f10b7c1806330ed2b02525e4e86248fafd65056c0526c1606ed94c93cdebf51c7048fd05e983519a480774e53a5c93bb51c839b4cf89aa45da91010a7ad37077f4e274b7a236c1d506c4b42825e968d0f25626c51998d783c379377c44a4fa2c4c4ed833b524f3b193ad6fba0e68eaf7a95f82b82853d30eb1fd7a88471471a3350e8532ed385d1afb1f189c685e52aa8849537cd005373dabe5ecd5bc516f8187226db69ce2a191b72833778da2ea07cfaa9f5d84e288c49fae3401d1b7110ebe99a54df26cef989167a6f014d8664f23b8508919bdfd6b601b93a3a9af7d6b956b3f83d833517044dd8cfe0b3a27cb8a44c2d3a455fb24a53c535958cdc79208121d35f90889b51763f47bc3ae83501d11e8fbb0ab8bb83bd453de623277f5a9eb36ad23ecd4d6c3b500e488848e921031071d979cd02afcee5056459637b6187b968046f3aa71365e44ef9273cc9a6bf4de3c7fb29fe47ee4cc5e509dfa24bcfad6a4339aa980f26047a18dd20337da976cdd39a0063ab3772c78be7a8be9eeec6347128d7df5c996ca35173e5cc627b0d3e670b948c3eb7251305459fb8a9b0bd0889d59f932623304c49a3861743bb4283553194300f54a188691cef065e497293159a61639c850457314914db34dd4f0af256c744eb6138b918f7eca30f1e81acaff24763f06fcc73cb5eeeb6536a8558680f101ad8041fca948599659cc40bdf3f9ea7fb7bfdce8c0a170d65326746f64751a3e99def018b301f6319fbd2753972f0323ecef243858c40accc1ea56967f1dd63fb91479558808ba17cee57a9d8d027e5c7cfe391a999a7ce7e432a98d0a836f49ee3fc9894714f37ee2573b2b620e1260f36840ff1ab1ce09fcf8d5137dcf090b242413e9e2ccf50f752319690479eaf6f4b19d8a77937ba2d43401e012f18a4e0da00018dc4f382abb1102a2b927be5cbf20790b919a351186a97e1be665cdc40ec00aacabc6d58b0d8ba569ef576fc65f13e05752abd72bb19ba59ee6a3b8c92dc16773a238ebe4eacda758253fcae1f42e491ac7caf671477b7c1c4b8c156ccc4a702457e5eab400dd6e08ad2f90a9a56d6e104eab158ebe13456c7a8a0c279ac6fe6e2a6c4dc1cd2646d683a03dc473a2d9e062db818e22f356e9455257818cf5f955e3797f87785b6ad8cf56ce725510b6c598723d5e7a070397723624a373296c6be0843273457d5d247c567baa8ab3a06d6da10d0da8048074924339fabdb07577c337a378c25eda4c013efbae09cd16d872fe8c31ff4a66f1a19d5bd720df05dbe7cf0627959c5d9d2ee6ca25c9162b2206fe63ff0a916c58491afb17047c8a0d186dcf907235fab4d4ae566ad83084301e592e404237f3a98089834c508704d95dc51e2d474242439a073004a88d73c1700e10105b851573e607c149c32b6708e1480f6fa5f62e490e282bca9e3f7c2c7bb9f31081eb23d398ced1c65858fda3dab0041578e724b582fd306aa0a512006652b35bff018b106d2d8e4746ef2599599be81dec1f6796818d834b1d61065550a37ecfe98a7c546b625c0ba0b362eca4953127fa7c4160ff8405c871448007bad716a26c008a257237ba3517003b3470196a74683ce6b701b918352e03230d901ac5a23b86343ffc4e9608d1d65e708956185117e02d1b1f926f2e46b73f7a50407d93ebe84f8440276c91d70bdd4a008cff78fb2d4465e252ab4573dff0a4ed5bf4b4e6f087a89e03adcc57b55bf30be64039ebe9c6ade83102000b4bc67dfc602dd2e93516b65b6dbe1a8350a180f5187c251ebe14971d7b42ab05b809e193a2899e3347221c1308ca6d89723ff96d341a23f89c24597dd408b4230edef83d1339d2d8d362f276239520fb5ac57895204ac88b2f376ba05d7805de2ace9ae03728ae6ddb6126a260f3fef35add8b305190e66e8dbdc3cad9077a76becbd4354b83ae994e3e54ae53423c8c0458c04c20f18f5ee9088ce6c918388e5b33102708662056688a26c238facdaced8147569c3bb558a1abeeb8a1e410302a4ab8ace0f3cf3e742c48d3b1493d0b8c4b5745be684381ba4a6fca3469b515317abf81506596407ab50340f71b97c1d08c719195c520c31bdf10b1e3d272d19ae4245f8f6522e388ef3c99debe69ea976a220b08be355146f4012d0e5cf501eec4774a576904831d21b52cbc94beb2e35c78d548f0b1cd848392fc55dd5801467c7e225f590961a4a5c8d73394cc0c69f50d2d913ca159d3b83e98cb9618a938488a5135793afe36dac61ff93a2151e0d6ae321e7242fa0e6151ca074bfc377ded90758b012ba7a0c6cd319d033efeb359833f5158ca6820e99e2bf6c3532da96ab999080a58d2ec8c8a5a1ce849bfc8c11ceeb69364e37ea7a66de1654dc2680257dc972d85fe839412431b1ab2dd7f32b7fabecff91798d75ded7ac7712665cef00f156f4ba9430d29e3e5934a34f92cb59e29609cde2f1e56ec4e335dc212d00abadd6f736f16d13d36e915087c8b65f2d91425e0a977095fec06f18984690a46e93fa1c2b3b92cb6b743a433568ae94a78b20d77fbfb28b6f47b09b1ad57c45af9fc92cf4ebf2e982035a4799f3456ac1e47f790af3b9361d5050b7d050b6f34a534244bb3821a761d9d593640f7e8defbb06f2ea8cbca4049ac2bfcbb62fa7f15266070552231186d3d215858668b79e5cecdd998898525b40bfa97b48b2963170397f55f7db39bbc8cd91fb56e755702b7f1c9f73ef36111a3b6b58c44375dd3e41386c8b5d7377983a0b53595d3192884f142912a38e34abe567aa10459492f4da1e14bed288e013dd1c94663b4bf49d2096671f2070909a7c3992a2af1b612d2a45d4a016089e0c7b07ea20ef9e209dde51b22f14330d62a56f178c1f9d660299785a5942d4134ec98b3f19e350029d32e39232cfb3e4a3acaec243938458884a262619f14a84617c7c6d4e0a1f0e8c22d1b65eff14cf6c72264ccd377b63e56c061b191eb8c12a8bea403a6ea74fa3db8846886182ebb36ed2c0e2583232f370483e8268e55dd648b9c92abb6c0290aa68cc5bf7289caec68f9ca8b2aa5f56fe8d40daeb3e824d3b48283f9b9e898cbf8ab44b024980e26e307c9799283e29d2b239aedb98b8b2e9a79b97c129a3bf2438f7a6d00045967ec573e9091611de723ebe72952c066aacb0972239e6b2b4703c4811fa57e726682e5103fbc609f37ff042f675a29d723746d054359c5ab0cd5cfe0eccf01e713e6884522d9089d31b3308957fec8b393d3e871e0b9af81158e13069a5d7b87e0a4954bdca1dc2fbfdcb46b90b828832235d87e5c1caac76f6d972599f2d4c94ca08e5f88619a6c0c71d057274dd63d0eea150e43b9323c90463576fbd6861bb35d286003a493741987b91c68868fe2f84a4e9569862df2bb0fc7e314ef685c3e4a233bde75f4199e89bf0bc2df77976d247e890f524deb58edec8fa6bf22acad27bce53017476f065004847a1551b209c730aecc618c88205767cdb8a74e9bc3f6769e651dc61555aeacc2d52c51530e82a3e5dab3ae035fcfa7e403a1ea33eb8d81857a14ab5dc119906751413126a556aa691de92fc073ff169db5ef28056323b8c7a6da27f5cbc40d17ef71949324a10039ead10fd3fb14f263e31196598925b3c2b9692bf3e25a6d60f35fccfed783e89feee8334d443c346f445a7b8ec4c9e2f3832029bfd4145bb1698bb70ef32b043ee71a1daf39b0242fb9d1d12e391d85803201f0d022cf21f85779a6225f3f7e50ad565d84f6a677f704e8780a94a78982f8bcbe88883a220aa37b5f0322827abd2689ada76b480e26e5ac45ab757e561a33c1b9ee4e0ae4f8c506fc47ec4a1862a0cb8c446ad822e9b6be05759a25011234897954ba95094083d59b7bfc9f3e0263f7d8331ea6cf519849c8a2e1d036e3c211532448f5b49fe56b81089acd727aa44a4456b190f2f8fb30ece9d534cdff61163f7ba545126f22c3c6ab9b0478554a55c48d3d2b444386ade28a6f83068ceaf23a97aa9dd88a39cca55208475b0d3ae5078da0e783bb283616792c56a326b6813cba889762e485e111fb9d6291d8b35c1bf1f6ca01f84d1630614140c4991c15f9922bdbdfad621f759114dac38475578b7ae20b36c63231a0d7bbea47c28d5620db82380c9f562eaf0ecc08ea1419415e75f6bf79c3c7ee42abd2c02934415ec43204c056a9b64f286ca4a899813a138c7db34ee45c062c795cb36458efed1ce860ab676a0b3876807cc2c852559b38b296d5d03d7e8603a7a9ee4141943ffa4f0f91070a9e081fbdd3211161096bc89bd87d2dc0ad210e428122b57d496214f2a529b256e273bb00792405994327c0af71d73b22190cfcd072b38fbca3dd4da737bde5b4f49b6c6aee37f911178423d0b91f7f0e065618b21dab5f6ef87a19c44bdc4e4a423430741f932a417a52e3c7f1415c88c8d83ce9eb510b44a45d662418027d4613de6ff041f9b77a4016c55d52b757efb75f2834a627511d35e796ccba1a212b9be5f46386b4bb9869763851085539d054faf608f00aeb60a64af5e90d4d36c5af9a592e51aaedb34b3246356bd24a254c12337bc6436e7e2d4f8e28281a7514959e93132617a2a2b59d2de99426303870d5108bb4ed782dc6e68be83390a65c892576254dd1eb563c5b156b245f22e6fc96b68bf1767def69b733185b1ab49f875b2caae471c7910659770f8e0b4948fd7f7e9462034b37e0c015818eb0669655727e769157ce312bd0b7cc9886eb15bb9d63e15270bab8679aea500842c7115d5d6733cebd9ad6a42fec093a6db076130abbc5d8a1a35b17a85d060fbbea545a0a9a2f60b94e9094cc6bcce98966a49d51c866f88c3e04a35015844c2c26ee3ed7b77bfb5dc4cf0ac5d1a09b6ef4c3d965b64c32cbc1f7098be51abac66f9b9c542175b8f62a88ed53daeb69f8e1e4ae4e2ad77bff16264ab17b5b8111e43b576cb4a3fbf6b3e1c4bd32ce27e8135bc2cec2df6a390f7aa072865956d290f00d29f902d1b5caea9533e95ac3ba46a7053b9a0ccb167791e2d12d7702c32fe2c84da1109f83d1d5d402bd86bf3ccc62dff530fd4914f8ef888292dfd7aaa66ac513943d1c9996406a4aa46ebd74e248a665454f4fcc0467543dc02bd36646b46e953367fc3924769155f6a8803aa585f5558068e88343d99d5af0e7b5d54a08acab6af7e7881bd66e4be7d16818a9276eb52e5b5b2962e2b9854443c83dcd90e92bc473055187d69a3b34ce436c570ac9365703d65b507a7fdac0be144cb8602ef751a1b1d1f1179386c1dc13b913359e72c43b9e90bfe85564f58ebf7d338d56ed65b1f6f3f7c018ae40b23b294423267ae88ea69983bd1d50af6a24a6ba8d28057d479d0d7972d567f61d737d618d6850c768cc252ab4cc7f7f213597fc2fcf28bf01a5428487dc4c212c6aabb2c5dcbebcc2ca961671b01572c3d4a519dd91500eec411966a1e517fd45ad41ae96d269393abcedc893b426c93c5f326d03b6a1d3912d2babea29723f989f4481ac2fe7ac12562ed9880ee05d097530fb81fd2afbe9f002ebaa86152a9971f01bdcb0283ef41262257b94265974b5e4125dbc6600e8ba5e42a16f8639aee74de2fd0c243aebb7a584b315e28aab5d9f2031d2d4ce0b3132505ed2dcad84eef5c48451a11783ee95b5adfea3af90387685a29aacbf9fc872c8cc895bdbe90de15a2ca111dbd368c5850e3d4410f731c4708d314cdea0777d1d43b1fa13b14e2b27ea559da1b21c1dc0c42cd16191ff9ba9653507175afaa1ba8b6e2778f32414638bae10819be0a1e5231c3e09f3e9a4a3608cfc7c3e43d45d10a59689e768b6506e4f98833ad136bdc99f18554563b969961aa1bce34f02846318898d65531b7f3d6942a88c579c0513f024a1366c8b63183b32374c12789c33374a2d5774ee77e7f2d603f6c71e0011cc01a8efa21b7be9f2d1d32efd8e0c53a712c803806af37cbfbc17f11cf114d14828ea37cf23949d34b007aafbac098c2d4c0ee8b1d7993e5d098184b333df4df9d023c322cef19056162f75d6477b66a8e202519e20407dee7fd8d10cc65f2272b5cb2efb9983d6c82c27d0cf9d31e1ca77619a18d3e77810ebfab2c9ffffe310e998ff37413c447c1e65479c3c17ccd6ef9b68365d69ac642668dfd75b2d1a7fcd59dbc4c7cc3fdd9a4df0f775b93eb30360cb46707d348185fb1a1a1264c6f061c7619e71ab35fde183e6d4b3b291dcd0afe49e4ba98f4f66de8e5fded63fdefbd3458abe2a885a24af427e011c0437fc0c3d139de6dd7f9d7c3a7d522ea53fa9134f5006944b345342186a59daffbacaf80754f93ddd3e0a3feb4e40aeda44296e510908214f71a03c0a5f042b76e98b351e5912f4f504d9e52a02a9d99ca76a82b04b3ca9c82ef14cf55691ce3171d4cb2fa5e23d5256328308f46168d72ed74545eec14cd74787d1569bb550481dcdb14cd1e13a6f6b429e8ec699d50c020e07b84d574a12d0f15a263bba987217e8d6ea2494fb3410008a0aed156b060551706b4374acc8c5cde4466c98ac86d1aa4e86ff779587118df2e0d276a5bc124f790e29432b8187ef5f213ed43e2a03f6a4c257c89b0a5d074e7ee15a282cd2cd2ffc8e8f672d3fbc0ac4f70f2908d13d28f8e9e23758bafbabc37a927e8ad6263edbbf95fc79e727544f24e90f0751e9c041b6149f68ff0a9f534a379d17ec51a63703876631c9127cfcab4080189fc083e0fbfe1c143c5f9b31891b8b99b3ac9c0b0206e76577aa387583bf13833e01cdcc621dfcfcfd7c5520a1759039d144c04913d56fcbd27005c3c4b458ba0ff6044e83197c31d93ed41a8afb80cdf59d64c6f551f94e54e646e6a59e2815b7e95d33f692dacc1d5af2cd322e2120592fe24a11405617754b0a20eb8a040535ffffadf590cafc89bd4b9e89dd84c37eb24ee7589426c66f43434791d8f30cf2e0c461d8fd6ffcf791952a7a9512d7091bf7797e85050ee87ddaa9c7a2817b0fd5411b3bbd6646cf3bc5627a0b744603c57e37c9adf486f2176e15f4922bc87033543da38a859126329b83162ebdac52296a173fb8c4fa6eed64e73302afc8d8655f8d2dc007a85532e6c8f64ed782bd20a762ff2b15164839eb4a8a9c0b1a880ab2d76474a07a16e47a037ffc7c2c4474cb4392b0a008ea02f175477c92a9143ce1cd5e3dab4a998c1f47814a978b1d78fe0d3fc5634abb61e390e547c605af54f29b132134d11aca02e6bc1ef45ab8601347dd9806e75b42758d267a45b7c65135a7dbb2e97633685284829c245c69a5ca6fd1cbe0c4ecd91e081cfcb64c1cf141ca190aeac67f82665c9d0368b0a6e627492d446be2a6ee729bd3412675a33a6d3e5150773c728e5335152c575c1a5c9ece0e3e3af653858057c641a08086a375f0ffa2ce8b7ab1c615cd26a3dc3acd88e0a8d0b788706b685f96249a0f745012eeb371ff9902c3fa9432d2c52a8a545a57772ab4f68ab51c096bfab9d24d2fa778cf178a14d8270f97bce776b1ac39ef924ea31cd54da9ed9504952a2297cc1733920e74f0e440cf62e2a42a5f19b2a42d38d6a1ea71122dba0d2a7fdc15e20a6953ff07dad51bf8a7b9d603fa09690ce81446b3f1abc76a3bbbecb46d80d4f55dcc7c0ae40fe57e4c90611a4dfc3d3259d2d80529b2bf7b81251c0b08506f956171b17b1a2fb794d001aba0b83eb0c5feca019d8be88fe9fe9dfd9c68d415440054f096234521a93e4ec263bf61cc33e99a004bef2f0b494c63c35d7c439ee6103947a4e9ddfbad7722b995df1e672a91f458a43345d245de330a124245ba4b243462309f005ee880f32c562fd2a2ec13cffb21c1b492c24e0a10f5813c00f729fc6a44f44c0d407179b433d25dd40d207c85299c8de5112126645545e34a895015b0e8e5945bbeb724dd97801c32962e9ed459351b16155147014fae1138a802873e10d37894dbf9f97f6f1524386987bc2742b831261c302c9bcc7e98c1b15e6ff3126ab4775924c0f7c624c37092eb3ad0a458e29396661813fd841f40d3554d2510fade0195365249132f83ee8fe9458928e14b17f4c3d13cb774dc894abe1a31f03d78f619b6aaeeb09e4f13463e16e1a72c34500c31e405f3f2e7716ad46a44b238773542c4a173aed0207dff0b9a1244e40e97b9b883b2884b2f36c4956426ae6dbe14eb58dbde21b680cb631571c00fce45904639db555e0059747143c5419c6de57e46c736df1724ddd9976d08f4f9738b15cc825b278ec7298a281edebd1e7143e41b6b4861c00b95f6d5526c730ccde5e308d586d35e93713e6ca3b832d1d40f8c207d325086db4c838e33e1ef7d64d166d9c40a8fcb8b54662b467c3d53eb9fdce1a56f2500dbba3cab70360cea33d35a06e15d409435568b317a074dcf3abf9c09bd6aeb7828bd6e0c98c6390a8492a1345819c7b7292d280a08d1b0d380522f220e01f0d934a7041cba13f80044a531a1ffcbccec20eec9410bdd799d82e02fad0fea1b79d158dcce658f426872709f28d4e9cca4e4e62c91b9ea3fb04b3112f3b94cb32573bd86b07ceb44831ff3e63c23a132f50b897941dfdea5a050226e0346c74e6dec3ca670d95787dfab932bee4b81e0fd5025cb62d2ffe30c1889a5e193a39b1f41f613b31d87a0a17f5535bfd0e2bf9c9a07ddca761452cd7e99640ae26c029f4ca77b63c0a9ebeeb5123d5f38394432925db2733b8f0f90ca1195e43f4745db1214668495ae6eb3bf763ab1353f3079ea7c23a99314682aee642ac8bc462ae9a067c9bed12f451eaa02c787a5e62400b9543608941a8ddfc6afd988ff3f73fc7197f02420186208b028ef66e29f037eada4099f64451f66ad7c2b7f31fdd607c06f2aa212f5b1f4f1b67f45aa6d38d678d6a1b3d3db58ef83e4b213119679888a4273170be3efb4e6e456ebee2913e05d1e1bdf3aefadd0262d041d8def1bd52cd665172775f4069beaa9f992a969079f4dc6070fdfd43822968a4089235564f028ce69dffd5386b19a8b72668fc853c9bb3d640e330cf4c0ececdcff447b37938fdb22931999197058e82d54914ef3fc20fae27a95a51179bd483639a0d11c82997dcb04946bde680c1d71c6aeb1bb1c081434893bee0aafa0d2489cb16fdd4625b886e8f72a1799d4c84ec13558bfa32c88286a8a77ec9a2e658042a9c1b863f6fa6f4a13c923f09bd442a5b4918a7be40469799694cf9f2f232ec83d7310805b57c0f8824c41b1c737d6bfc9d7c32bb776cbb272cd2674475326458e09a17d9b755125d8cc3106653bf22a06674f7fe9868956370e6561761e07510626249d5f48d3242ca2adbc750545f18e545ace6acf1cb6dea2196101ba006b6c69d33f24938e66db12c156886e0b23729efe1c37fd291cbf8c1e31963fe10eb0cf244503c005315c88a0c940e92e6410a7c0299cd359d6f26949cc780ae1655036f580fbde64300777ae257db9cc0742104005075f56510aea80c04706bfffef1e9dc795025a482b2dbd8f585b048a1e7db7311678e6ad988d2ec13beaa233075f335e020e12f84cea6672a9be82170ef04bc2d46740ce199654845d517ef164e763f260a6bd201d40c1b4d94048f02be9c9e5ef62f82780da73aba57c122f0c829ce6bb97c58787150b8df29710c3be227a00c44e3e3e2ac82691d6f9084470616479c5f77769fd9005fe109f519f2356adce391b31691c74c89c70c87fda1804d5718749f0f48a7831a7957ca9233af84679ac156258ba1000a94f652abd453bba8fe6695c3cffc91405817cce351e3a3992285279623a52c99b414b244074dd4468ee4aa8764176edd957d2f5f148011d0dfcfe0595cd43aa136985cf2352c35c7f10587da8ff413aa6d9b2ee157a58ea1ea892cef577429145cf0c1ec6df5ef169c136aa55ae0a99e522b116bd7baa4571a36f37a86258b9cab11b47437d42d84178506ad29302371cc6a5f46d4ba143e6b78eff1038c39b12a5f4e2e9602d4e41e7a43bc2d6cc37828e88669515a81f5e33956dabfdb562d4060a75c864881f895e4a563f082728f92eb474c6224c35b07eb5b6f08a8c6fd5dd64ec819010ec93b0019977f6b48f558c6955170f7deff41738a50b9876704bb6546a78a28175a74bc7fc9ba9659a2b7bf2eb2442b6dcd9da4184041b5071934c463df2d6ebfa1fb1a15f35cdddefd3c0860115a56b7f58f79351c906fe7816de7491d66bb3e8a7fbc2900d7cc1bd721a630a844b02dcb86058acd1d2585159a3391a7d4edd0fbbb1371c5da5f7261ef86a6e54f87377363b30ffcb1b91033bc828786789e42dc0d5952d02a3202c69f4198441c7208d9807cc3d18ad862d0b9d2c6f2d52dee51966b03b0f01b418dfdedc6bb95e470fccac99b740fff3fd5385576c854df68a812107645e975ed4ba36fdc3311568797729a24d8447dc3e8aff6cb9214e6093006cbec0250c093d3da982d3f3db8234f359d398fc6666967f85b39b7278433cb178afbecdb0a5398cb5cbb8994ddcb7ee798a5938de50a56ad8d3afdaaca54e8c2332b6631166733ce4047d6904b5df1bb467759a16614f53a8c45068a0a82ae4a8cf333d3b6c0522d413f90cf994e6b13949f8d39e118fc30ea69ff30bece948b6d3b0168c3cd3be887c568112f18abf9111bda5c400364ce41720a40296e80678d912ace6478f21c10cbf701b6bcd412ec9b8d9c5445e243064986061d9b244554064f8a33778efdd5ef8a6f7724e7af15adab3a621dde0dddf9b3ab032f246cde5cbc061d86c23dab88d66513ecda7ec94869523356c2c918c7398a67e38051f2138cda5708ec36ffa5b94314d5200871edbda492a2b3dfd8c05dc48d58fef172a1e9a5580349984d2011422bb34e7357b799956bc8d93c6b4f9ee949136cd22cb53ffe661361b752df80d944a15035f5400c7ac9fee81b68ea5b70686ab3a72e916d5e6d7076ec905f9b435d2fea824d0df4c44ccfc61792d0fb4c259f5e955a62a26a65b4df1ccc0b255256d3da3390b4776248cd976411d245275738c51830ce705dd6c937eb66f320d7d1c85118efcd885a3477e64b52c01e0ccc73d1a9d9ee2e930cd368481ef0f9ce3ca8864856a06dc499ba2f016c96844232002ea2db6a4c31209e1ceb845ecb1fa838fd364de87270dc057b4618ad3722a7f5ae8aa703b7f3994078ba6a8a4cd56192a1e79fa8fd507fb822ef58a0bec958a0a613a240a712c7a0fd54de642fe92f0bf9b4bdb256f40d84e49e25f04439687a1c230f55e685d0490b19b4bf538ee4af32c04a1d1d1de81ae5ac5dd26286a445ff47a087ea420e89ffbddd31b85992b0e77e32d74458d31593981148253cfc330c8b792d12bc78ee2d138604ab43cee7ba6dea36fa80f70e8fe5517e92fddc44e21a26405cd3e8c7ff20a1f0634e2e82c8fa82aaf19c4f0df85bc86c69e492bc697827298cb310ae9a153e164907f81bbcf1fd10e6c7b18d23ef3e068b0ca5d448b5ee1ac98b3a1a0000865cf01ad66c812c067b727c809047658899e18ad6520be4cd9d98621f68a04a9418667bd8bd87c8d330a07a6bcf22841b5fdf2cb13a5af968b2b4c25867e34a2605b41b6da99178b86a5a5a706ce9f9186943316f04eb8b54ce3b048e6232b483db2e615a76079e3221046fbcce5cd47a8b1f22b658df91323684b5fd96656eb9438fe69d0f0ab15f7eada7f912cb591a85cd46b0580c5716381fb9a7b392d76c5411e05fdf8e8687ec28542d08f99624b44dc7c8de68ea51db2978addafd3aab988664f5c0ccdec0c57189beccacd56ad87ff3ed750a59a8548081685217741e4454928a3a6f88f6e8d309cfcb6643816b99a1f4cd71a4203f5546a9b8c5e0c3184c9922513a4ae62b7892a9febd425b65f831c2dd11c0dcdad8add340a2b16e2ee241d61141430b951047878ad4d1fc97bd9633744c64c3932f4227f2cab0310548bbbf909b87701aaf4a4f7f073c0ae501d051a6f1743a864ceb503f1955c68f14571719cbc9a1a5df223e8f18b0c2aeb0a7ed3886e89bef947cb461fd3d8a60f0128b7fb23ab7d06eb9dde4f14cc5c2856f5e8dfb03660863c8796f5e4dbdad12c92c4807bcc0085a026d7a737b51217abda524b206f9826d9a048aef3661f50d096a322c4e6cda480dd1ee52ea3f6a422b550052bf5b38e12417f005604df8200a18ea221992810295c8e868c8a1180ab39b99356052050bb3e3da9912cf62245e1405798416603a797b9e64b1f6a3b6a1f3c012bea14c33c14c9de21f0db3577890db35ddf9951b35a98dce01576304a61ce0598d1d8354e9cbeee3052d7ab1b12dbf36fd2979d14a5486cd4e0632fdcdc262fd2e4e143208d2bc139e4904b4b5142155552b16637bc9b9e727a9d5e1609fcbb7c834d09af01dd3c72a8698688343341fc28f4de9e77e0c1eccfa82cf4095a3cd504c367af9d7f23e9ddbc42c646f1595534a1fed37bd8bdbe200083fab4d3c0c59484bb6df5065f66a4f2dc82cf771626096599a9c83af8f8dc553a7af4f9a4ac71215c0944296f2d0da8bd75dd5f6922b53320e217cddb22b1e3581d075cbceaece5a23511cf9729ecc49aa6dc14db75cc9088404f5a949752a46df7e1814ec0ddcac261f84df76159c66912316aa24c4a9d12dffbb3ae69d700975210cf3102ad8d33b2130886c104df8e885e18257c64f44c4d31100d2b123bf1ea95999389d2e72f72f2b9400c632610367b08f8ae2c97dc9f7000ae3a8b4962791da09ce371dd6103c5523935d9db9fee6b0330fb135c9227423dde2d950850717ca67d2d8579a2942adee5d6665b483a6f19a78cfd10270508909a2e318d6af860e9ad9465cacd82c57ab396648efe6c06caca38f6a8b22c7e1b1a35a8464a78d35159b78ab8513077d2f4f89d62d692cd87fdd0d29f38fdbb8324bc3274f98977113162fcd522d2618798b2a7f1cf691604a1b8801dfa730808e975fcc90485505112c601ecab035ed95a44fff83144b7030a33cfa35110382c291d3d54d9ce12a6a23b6afa87c752eba0cde3a6a6962875fb9b5a375535d9a9ee7382e3b9178e474f7259604d3be3f37beeceb82bd378fc3ac346be15bbdd8cb359b209d932edbdf7de52a624032d0ad90ac709b18718197e5c4dd08a48ac7e5a24bd2bcb02cf67dec3c76730bc56c3a3e99f6fb59fc1200ee438b072f61a48b3d904d066cd71def9a669524a29a594daac50b4d7c050ca779d7f40407c9d7746997326641950611610bba863de51924c30a88b020589e69c1f89df793f7b310e615ff7149c9953a7ed18872473b0073679f8a861b3b70fc85d449db36799ac50b4cf406de3886ddf48dd091df8cdb2ab9b14eaeae40fb8a53cb7d1b0e533488b85a66331c846a1e911fc64e4581fbba6e6610bdb343082340eadfb1c588cc1c20b172f5cbcac091307282e6d160eb224243d85a62ffcbeeffbb68ede376e9a8d3768a2f8f9c3157abe078fa997eef113923b86834c5fdf332a4cf9c21d03543f29247d4b01cf17f278c983254b9649579c218a578c79e9736367973c32654ac79d60ca0e30b06b8f8e360e7172c4ae9d9e1d755c05815df207bb2483442a54f1858e61e0501c921be843663ee290f414ac704c4e303af668391f46a7cd55c40a382f5d04124a686fc105762de61ae8820b2ce402bba4831cc8f2491984bac4381264100fec40097011058b486e5b2106a7c5a236212e3b1bcf2c7a5a81a4c733d2230e496fd264723e1d85e9da9a991e3d13a68bd9a494eee3c7a41886f9acdb06ba56a8f2651ebaa4f4946c8cd3230ec9cdc7a453c598afc24b90585405d36a2391f851e9c8b54a59bee95ad22afdf8e103ab3f263338b7134ec0a66b4f60d766d864e70de9f7c9c52ee9a16bc61e729edd67029be7efe3ec1b878849da8a5a47ab4261e963573d3912410410445815e97c82ec70666fae2870c00521428884508dc5f28d83ec7016cb9ba5390a583e966f4c5860131f3e7e7e7ebc07bb7cfc3837d9198c580927b06b7deaa4ecf2719742d2811ccbc79ec9fd1f312ddf517fb050cb49ab728085a4af3bd272805d92c116983e222924fdabab1a8230151285312adad976ce03fd463812d88a885278faa48744cf1b131dfde949ca27a79772a6b0c6170ad1187405e15cba0f76495fe20303c9f8844ac442d289240925843e5efaac21ade293dbe745b5d102390fd50238ab7eba469a6b1e1ec9cca54723f97948b017626e609b3b1f02b5916a137e6c981e836293f498f7701a83ad6a78a72d992fd31be9fc63209d639a6fd873669aaf77643af5d6c69ee6ad9e59e6c9229cf56cf5f065debd20df6882119c5d07729fb7a623b3e03c614e2f443763249d04122c8100cef8e8b4a58a95e1c33e3a6d71f3ebea08e70c998f505ae0f98f5070c67c848233e5430ae7cb731fa1e06cf905370067498532be75da851651f423941671a0d660795e9e4fb841a26ed069da02836a6a0a4292b14b2ed154869bb87c6cd2d2a4e44c70989c3edccd474a6e1c37ad8f504f9c717ec2cb135b3e423d91f433d5434ac5f93e42a981e2d7b7b5414dd3472835653e6c7d641af33b3e42a9c9f2db03cbb04c0dd287112a4d969ffa100652b2e6c41863a6d1b8fb264d1ba83465b2283c4adac640c0aeeb3cc6b8d5e098949d945de7b30903d1bc7326364c973d5e769d6ab5f28060d1bbc5306f22eafd23141352df926a55ce0eebe4ecee0683a81bb5b35329dfd570cb36d6c9aeceb92ae5b77a24b35a4462441b958e4b3f201e989c12939bc496a3569398bb3c3a77e3c7e55927ad941fc3beab733ed61dd6ddeef42cd3344dcade994646c30f88c7ac733b58ef88bd144ceecfc9d84bf0db5686515252b221696d505aa51f98484949d1896242476a0bf69b13fa430b2db010e7b0d0420b5c4cecc7fe600f883c60fef163c2e124206ee22656c34c9cc46ab8899bd02c2d53c68435816168b689658a980f4e5ce4f9b0c747272de4387181e7d95d70640c3cc038c41e87d83735beb0c7ef165f7c2165f985f3c51712d287f1a904125aec52e38b1bc123f137161121fee6d8d648243efb00e2901b3ec2b182020d5fb8853d1e7320c79c82d49b50ead499504aa53e8c6e9994a6699ee7f991f81e18a47223cfa57b2e5d456b57b71aaaaa5727bb689775f5483eb7d530c2c1ca74fcd19401dd294cf9a201e040adb9b3c6698d124c4a4c5ba0d67c7942cf1370a441628ac1339df9703f32b5f1e1f6cf64077b09c514f5118aa94e1a2e6976d85a845d22380a367c617c622212f6ccb7c317027dd4e23f09b6d8c514882f04d2d3abce2905690e1fa5e00624a953b047d217f608e31390cba31f7dea93e953ead333428178b4a4c81d3b5a985782945d4ac1d8254951d1e79caa7efc88ca7f5ccad31a4a89433e43ac23abcfa3475d73560d375a833e10c9caa7af38ead9fe7a4868c6791109ca6d8b93b6964bc209fd2a2545278a099d959272e345893367a2be576078249769d16c13cbb44c6b5acf7d500423d419a78f5067e27c2b0173cea9c337cfa823159f4478b3a78d8a0ad5146cdc75829c366cdc1506184e6813a9a830c0c0304c0a738a61d8d3761e1df3f143c9e6f388e6b1db5a5c15418299c4c2c81335e75c33e7dc68af5a5b7d346197d41b483c7d08443f2498a2887e4c1702c403888839f3d6fc6411516238e1e1e3071d748e88a2ec1f6fe1d1fce8444ac015c2aee8c475409d613aa20c9d617ece39e79c330c9144830b94993bad337e429991fa39897ec8f08542bc07108fb8a540e5dbb8d104f6f55674c6d874ec01c37a9442118a0c17ae80f409c2b07117ccb7f2daa7cf5f695c4717210ed96c732206b2f2e8f9ca35cfc8eadbd5ae360e1c6fe59eab3cf38ca856ad6a55922ec22e26ed791ba11e47390a0af9c1b573dee091ec38cdb5b9f48c6c1c385f6be95ab6daac05ecdb23853abed0f5aec99e916e23e408b1f3d30827333e04e1a7d46394824124c4a77e243e05833c370257787d4148a8bbe735dc4e10d2d7bc1ad9d54e375931efaa94e7ea91fc0d738dc9745aa39fa2b8221c6416316120f17fc4ed2cf3f1314a297d69d5a4a67dcff7adc6e7b19e91f6d8ed5b67cfd8267c4e9d3d239452efba790947128967647359e7b6377d33a5ecc012be639a75a01895cb202af0070bb11791323efd0f37df8fe7cd73a6ce9cb7875b771ef8835d14047645cc29280251cbc79624c32618b5c54a8534be4d014bcf7916c7cbd78f502ed0f32eb8c3851c2f9c30ac0ca8173861679ed31c7331102830bc0a416831fa7e0c8f24a639e640aed56dd36ae889e97c862b884a3c241cb8b9e61d9790f95aeb699e0a23384107aec04c067ec07119c8812d766915a849c3649c33cead18b821654b44afc72d4e7093b22c583ea123439d190375c64b1c5b98be8c79fa62074c929ca4707ec9d3e9b9f3d1b931bc3833e85378f309c1f403f80825c4d36b92c7b36b60644f8974f618bd24d2c56c2bd070c408fcd499c91c5fb8fdb6641e71c846d1f4a79179c6373fbeece87929a5cb1566f8a6c7a8979b4bb952ded012d08a36df0c93425bd58abaa5cb07089f56b4814cf47cd335e9a1f7b0f34d30dc582b8abec9e82b7b20e24584d3cf8d1ad9d805cec9ae237387ee2518b703f62563600b2485315f38dde92314982d1f6e4a288f38643f0b3c3dba4c0122cfb3b7e212e12fdb20310e59ecb3faf9ac107360e5c330df2e4e5d98661c9a990aa8953445aed0f48e3a8f870a028e2a2a88a7acf61801ec4159663f4347de90fe06d3843c1dfd75c3180af5ec40777ece6cc53d8dd52845d04d7d1f5f39dcf051a08fad8ff195c314d6c79715a9232c4e58dec868263ebd96e6bc96baf8c5e28baf25367abc3b31eeae8c4861b030edeeaecce2852589179632df62d7bcb2b9716a00083e9e3ebe969280ba3a5aaf1ccacc570e4b2f2b6fbc10101a1087bc96cebc0f06e23fe636256cb578f4e0f2216d7d38993ee4f1e17c2d7979e510e7432249e775e5cdebca1c20f98a618b967199a6f9b67d72398ee334e7bcc581234837c2b275ec5fd3a4672493124b92a6638f703a8519f39ab7c645d3344dd362d05c6097e624bcd1344dd3b8cc63e621f693a90c4f3190709e79cd359f671808e79a4f347c4773c6c340f8b533413c0fbb34b9539b8785348f532c012f5f283df390efd0c6e8f621f6f1a3cfce329ffc1d3dcd5308f385f4b527e99b67f5c89dd2988ed881f6f3f3e14e2deb89439ac3f14d0ff94e06a270c4b739691e12e998568681480c5c3245d8d1acca05194f1c8ae30b778a91d8a53956790abb342f22398d93360f07613c2ca4b9e63bc5406a88442495d881e61a0df98e26a7c421cdefbcf14d305cbef35ae4384076ce6bd3f70905335f36bb305e54b27cb8bda828c9181e4dae89ba8f1e7a8c43e1f4cd7f08e9e16a71cc41488c42cca387d3e311f62c033129c180a2a3098a0e25cc330ed2fb5df804fbbabacf423e8338e79e1ccd168e2657e18568090f7a96f49c818a43e9c763b94fb3aacab9faadb3f44c79966f80678ea887ca23e7034328dfbf10f4ed9f679e121f6781212b88821090f2cdfafc7396732c57d5907af415abb258cef97495fb38ab864f9ee5996702170401294ffd033ff72181945f812510c05330a8dd88824fdec77d3ca42c9f1afab80fc8028d3c5f81461b38eb68fa80479303c3a3c9627ddfcfcfcfe72c6fd6cfcf8f8fb3e88f8fb37e7e7ce8cfc7fdb0582c168bb584071fdff7f1eff3f5efabeda3e7cefbf808a5c7e97b3d13b6bd7daa6a7d9b03ce6fde9f470ec2c383fcfb7ce53c6a64964766b1bc886455cfbf1a1e4deae3e3e3e33e55b51e04a4f8f8f8fcf857a9b3aaf44888ff39fd9cfae7d457fe03c3b3bc88f4a9fc2c1f12e207f9b80fb8c2eb73d0f3a3d9e3c984a2edd9b307cf1f49d51468669c579595d7a1e7a77b345aafe3ce875f1d52df0ab78f1bf5ea98f32d76a5e9254b0c64dbddf51f67192ee8235991c562adfbfcd4f0c90af40137f04786797225a7fbf8f06a5bad563edb6a864f7ca4cface37e346d5bcfdbc2275a33338be59f8f872cf77c556b6cfd78387dbc35dfc7270359f90fc872cf49ebd9b7276fe4b94a057a747215a8f2f01e2e1f44ec92e2c31d13b4c54030ec7f0b82e4f90c5e445d7af7e6bb65ce99779c71e75445330d46d9765acd64ced1a715c94cf64d397ae694b3f4734a4ca57911ce3c231dd771200f764df70d1c017b0dec1187a6afaf30e5c33c046ab18b7eecc2269c9ede737ac8636a98b66d1cc0d8c949d334ac72407b0d6c81cd3725b7208488c8e5728f8a6292e7c3306ceff0988c35d1b1c746f493721097149ad8f3f08e64bf094d9f18066271b52902bb36b0880e5f368d1461d774169a727cdacc66b6fdc6373fd73096afb55d7c8b4ee5f3409723b013b8eba16bc6f785304ccd3338c61aa21b77dc9003e5061400f808e5469839e7dcb82c5996719d1b4878e2b66d5db711d5c69baeebbaa66d34b581266e4148b687b27b56f05b171b17aa8d30506d0001d5060edf9ac37ae292a03f4ca980c6d7fa80b68ffefc80beedcb8881e79b2595cd8e6bf97c91259bdbfd40356573bb969b6c02ed8052ca00ea8e065061805e6f36f862eae3e0a587067d3167290fa838dc960180cb47a000a011c00b89bed3ac46a82fca7ce43ecf885ca93c3a55dd7119b769d95461de32c3a69c2accb3a83c514ddf1ba7e4c554714e8f9e8541b39332688249883e48fa0c926012c979be98c55834b7c88ac86d9baf96aff3dd4561862f6c4921b9ed6e4bd337072479113b8039ef5de255819dfa04d8a9368994a0ba98e22ea63c73b303d62357141784e183c872f4b68161679aafd0f4c4c598f72617505c20bd6b3ef38c8025c17cf3173e20e583309fce350863300873f9d3b5e841189844fe0489e4988ebe176812df4c21c44b43a4844b23e39b104058972fdbb2bd61c5690b9a37aa3069720138a4621c14dc7c719ebd156e3d22d00fa90f81de98fad0913e7465f99028cc8742d07c189ddc7c189fe088f3619c78ead835384a6e31a3c096c8c2682b2d1b1b3570948eaedb685a06ed2f3c2f0b151ea7151e253e3c61587876f0c163c38f9e961a3ba2325071a1c114406a363882030a2648cbb7b6ae9104003d01c0230029a7726a9705d8520c604d0f2708904401c818600857168490b6e5009d1504a831838fad8e212d8e04b0d1419606514729e0e5419c0564f1e3e9832880644d4134268474641820c490ed07225a1610ac34204b72000ca884204711375ebb5354c603b22811b02f8c645d8c90c5112a487042a2a581c01249cc9490893181eb12812d4a322c27dc20813b4813a083021a1c28e04921434305acce924c0c267256d8a20256584093a2c99a0b38c142960406b8312d80c940c645033c6c000b0770e8409207d2a8f2813a5c880108a6c2358cd0705227045894085e2388f3240b284f51a22041d3511325c8cebc40c604181127f082021f529045055660485a011a31b0408f1438a66478a8a4110356469533a290ce80f324c3194c332c9d51868633b8e8b0499a520d6720d96067cace0d9c184a5ee0b06961658a1cd62cc191c3a1b9b295c162878b9d2b3ad8a1210b1d5adcd86ac6193c88b1a5eba207ee8d0f5d143f7069b8240144115dbe04b1f5e025872f66c800660e213a36c2d819821383882ec474578c89a2082e8d114a902153268c9932b2684a4794516522b1c5963a726cad33b5b50e1e25a496985168681c26dc28d1049c3c75c63851674b9d2a4c76f2701a293b52ac460a8e145ba5989aa4c66841acf1b0b0d96c682355c549d303c51db61345941472b6aed217a1c8782283cdaf5321675a053b2fa438cccc7b81de183be84e810a48d491b95590e18b1eb5a8450cc3b0a4ac22611812866559966172b08ca5e40fe8e3343eec0a9665485986a940db36243359a619c92ad0d7da2aa8a6fdfca47c5ffc584b86615926264aa1e92da01610500ba8f5b1184ee3b4edb9ba45bdd539b76ddbb6f87152c4300cc3a246d9f599d18e51ccb32dcbc0b96d73fb607a51f46f4e73948b1c076efcc1f42f9a2ce95b56a704e79c9b44471964a327a323691a08c41fccff5a5b45631e6b2b6a240c035bfcc194405268b6f883e9add1de9869aac9a252a8284a566bd7b9cc186f564995c5186e9cb08bc188fa211fa1e6b40903ce47a8309c7e011fa1e628bd0beb06f8f852c389b37c18edb0186228ed8e8943b00de3cc7318639eddc95477f83db665bb2bbf08bb78128db0cff219a48149e4af8f303f68ddd915b46012f927fcfcd09164d174d8b07057baa50f5d053cdf2a870f9d36d775ac0a55f098b76af5b9a0021a5f18edbc99e9ec2e8811356665e5d9778981442831e49c40066122859688511cc240e636c58876c76d5a16555e0854e10b2f3d0e3d9142ec4c629eb9c34bd085ed608cef041e7148a460b8e82032bc7c842203896f1d60e372aa37eb719ae2307d387f3b884e372ece19563ae3898c2532a84ce559e14c2766ca8e9ca92726b951b40a4ebb3be5dc2269a2d9dd9dd854980c0829a5c4323b535bb24c9b4a72638fc6d42ab0f181e2d21803cf1874a6e80f9b0e749ee0d003471b2a359ad2187ae824410016b440f3411fa1b4d8f24e1ffa673c5c0c2463da2cf2ac360fdf2ed0aef18b6f10d0aef1f51dd2ae11eadb88768d72be9dd0aed18bef10d0aef105df22a05d6317df23a05d639cef27b46b74c13714da3572f11d85768d5b7c9380768d70be8f68d7a8c5770968d798c5f70bb46bc4e2db04b46b7cf37d02da355ef18d02da355af19d02da3556f1ad02da353e7dc340bb462abe5740bbc629be5940bbc6167c4ba15da39bef9d42bb4629be970aed1aa3f8de1868d708c5f756a15da353d710be5706dad5015d1bf043283979484c0005e703ed2ae4698dd1156a60784a9cbc243f6c1b4ac6271dc8d35a820dfe6883a72ed9482eb4eb074fd90041bbfe78ca86cd049105125e68d7c522892fb42b8f25c0d0ae41cf041d2168570ec43841270cedba81983443d0ae407486a0402fe6092268570ddeabac38b4820c2bc63bb2afe22875558da2f2234aa9d7647823485f791149abf6aaba92ae1aa26b06dfab8576ddf1bd3bd0aead6f76aa6304edfa138511748bf0cd2377f19464aef29665ecbaa953867665c93153702a33b4ebf7aa223cafb6a0be5539575baa541ed71ce72bbae23c738e7baa7304edbaeaaafae62bca3843bb523158949104edda62ba76df0c6709da95e3020dedba711cbabb5c475955bebbbcdc9ae18d20dd5bf72413b4abf611e41de32959216857ec5b3a11361116af229c98e80e4c1b668558300b068f200e7677777793d8b46cb129970c0f2199768f8af3a01a8bf60c71da80578d35cd98771d6b9aa44ea7d1f4aef3aeb9769d791e333bf522520b4a8271579959a3cc75365dcf487cf66570c918df3ae79af48c3033c62c59738cb94d6325c93cb1e952f29c55dbd69040cf6cce8ed2e8f39bf1c39c9a60c439c66595db6a94cd8f6636676b5c9679b775599629d96496b961e648da1c4733ccbdae9d1645f3234e7294f3224cb7764f7bad4e6f4ecbdceb2c32108e9feba65cc765d8469dabda77d3f6224c6b8c3e42ceb58ce33c28c9e4b8cc356e629ac4c04dceb77d7c8571c16f53a6605c74e63d31954f06e269ed717a90a6791e5f442ca9f1f1266b8728405af90c66a084f09a57897b8a3e6fe94d20162599a9b27b4a10f255339ef4ad3b6f04e92a14fcaa56897b8a56ae929eb9acb27b8acc68608c3ee4363d48cacea398ff7c7c8571fae8ad0aa777beaa66bc8ee2a9bcb1ae53b5977999f432e97d71689f735aa3d0f6f6ba5554c5a293812c09a2d3739d3bbd9452252595526a320329656e4b2ff1e29bcc72e364c7cd6dcbea922e82e6dcba2e79c1a7f9b6daf30a7386a377db9cd3f3cee6364b00f44740ef8152cea0249b9c9c922dcc403ac964207d390847c9a92814c1e88942b10242c41085e287aacf2088b85a12e79b724ec960de7cf4a42a8a7d6320063aa17773d73705cc1ca9f22269dbecbc8278ca34adebbaaee3eac66d59b64b313e9321bef508cef9444bf9c5699774b1adf678717a8199d2464bf9fab2e44bf680310eb9e40f26587ccd7159aa8290f04f977130d9e28b2f2f715e5ee0bccf396f643b4b76a3c96d9cd434e6dddd5522c18dc119372e2eb76d522ed9f349cfb08a6572825382dbe693f38e7fceb9648e6f4e599138d00c2f79d298bbd29f080b425c42057789eab2058d3b75b2f899711ca7699aa67191779bd9cb87392f2f5330cd8b92b78969345b4285966993c37c623830785e4034015166b5e7d52529cb0bcc99d51e2636cc38447a648204f2f0d5922ebef5027c7cf930e7e7c6ae257bbee998120f3efce2f4e858ac05f88d33d6a0e73863055fcea9a9b8235dde626f40dfde8540f5487c15f5e845604e074395ca8fc45781419d1ba93cf34ee599abc0cda34bf9eebc885c2740bf49e9e5391ef31d6e7a4a358d638d63354d0c84bba331c773876f3288901f1683deb26bdcb26bfce455a395b3e05972eb1ee71e079ab71ab0f415b3b7924dbfce01181eb1c66b247de5ecab498181338e9d9f8c7678cc494c4b845d63276ee70ee72366359e87929b3e73ea1ec77928418ee338038ee3768773fde115c86aa42f18b41202e41b20e19c9938cf0b839a5ee33ccd5d0611b20190b79cd58441e011bfe71c68ec710086acc46ee45166d50620104829df91ab558d2fa5dcb1ec9a77648706957a0655e55cb3ce5ae00f186e200bec7cbfddf53e56c34a2b5e81469c6beed1f5bcd009d07eace60383365f49f73c64a55f812b347d4e9c00515785aca48121e629a1984729e43156e3d43989d52c116eea3856b31d641aac0650739b1ba6a9b6d958949aef71dbb64d3fe2c7b26de338a3230f9608e7730bdb2905bbccc306335fdf0e3ce270122d916d863f360cdb9c68c33cf8c14036c6364c7224c2c2e8f4461db6c2889608e699900f7d7ce315689479b7f26089b06fbbeab21fbf65de39966d6050e79c4f0cc38836e61f1fb29cf3a6de91f6058d38f7206481dd981bb11a730f9608068624e0b8289575599675bcd8e6b3ae7f95f355a58ed5393dc0547533d21cf30e0c8fd8f3c0a0cc399f1e2c11cca773c039c5bc6bb0f360892c1876ce71eec11289cffdf83a3ffe6b9af6da6718e8c17630575cfc34b68eed7a635ac779b8497e7a28f3fef1c543139727faf8da72e77928f308f8f8d2a2c707a4a7efe3d9d2cb87372f1fb2bc7a907af5d0f4ea612a46fdfc5651ac7e1dc735316ac9715dc749d068b328169648a8712a578121e72a8cd7b59073ac5bb91cc84d9608e7ddfc8ccbbac9724b1997b5141858d0447235d29c05bf59963559229973947a1f76e91cd57cb51cd1fb80a18f73b2e5a18feff050fa0eae056a1efa80a10459d80ef6998b4db8503ae6957a477c7c41a3ce5990deca4009eed8215b9d0ffdcc595822d9e619e996340d493f56d759b5f395e759d7f82c2c914ff34ffbf190ba8f872bf70143a2ff5860e621f5f590825f38ff038334ef1c6321a4de39185270e5a1afc0703ee62a0f3c625e1658e89c8525d2453d0bdb01064629ac65d9d1f246ea9565eaa5c5cb86458e0e5326d06b30de0d84c0cb6453a2680b924cb139412fd3316600067e991e24e354e2598b980662644f036d3c7a190821035750f315891a08e14b96d536552237a3739b27c1e015692ea5a828abd3370d4cfa5114bd0873b04904ac63b54d15cd659052b4f986f96abe711b075659ed29dac0a41f451ab80603bdb4410a618d3d7bf654f109b681414a91122ba2cd346950a6974000cfbeb5a4927f4a8cf1019bb14ff0053933ca1e14de6a1b0f02529e5dab31c6f8804c4b93361e3d0b843025c6076ce00a667c4562116e12820edb56d940612cf365c7e4dc6ae692336f0e281f605dab6ca0482781949f4e355fe9139b2f68f0126cd2402c6ca2c838f6ecd9f350d8302826fa0ae6340b58b082f575ad7d7de952c6c2058b9617162534af2b637677625bf8e36be90d29259625b1f15acab3748767e0f2d257d33bf2d8c223e98aec25911354e1cb27c1d049d44b29ead7b7bde25749ceafcf9db1d50269cb0a05a5b762308f1e0a4f6038c10acc489ffcc10ce174cf3b7422823dd375b9781e15284aa1d0b5e8aedcf48d24891772b4ae0c78551503000080310abdf60b09d4f9e6501a8618514b788c15968e0522191758290cc43a1990656c80cde880b4f3813340808611a711823b23581840518304718d12e031c1b28182365410dd58819c92c26f50915b45061a6ab801871caed4d1c5d7defaf82aa287efd5c2c3528ec183c07afdc24ab542f2ba78a1817aafaa6278380036a841b5ca131e608b85d8e9121142c0b37300bae2107f5f7c420c21a6882583436665e6f0aa28acd801fb11d0ffc421feee744fa179a389858329c6a166f334c518b0917238ed1c51e871b3744c11eb78dadd63459cf24652c922063855968b45da3851867dc1ceb072220dfb92493b876bd8306cd8a8bd61e944a5955a1cb68c6865edc81c160d5eda3b57568dc513dbd8a90887dc3cbc72f0ead93aa20f3c657fe0182217469240ccc05d9238081bd68b52fc6205cc92108c250c67198277602278cb8af1218ee1b245748946789164c07099304cc48e89466c9978843cc3ac848724f366c2095e2436420ea644a5f21628a59b3403553d00cbc640eab0737096a5436ad93dbc0395e5a14adc22430f34b00f35ec0f37443569989c688209344b2891c419248e3053e6bff05bb1562a1f95f7e3d116ed1ddd65d0711a6419976d401ad5322dc336c0e8e4a0bb254725e522b6ceabeb110c4a62e431196a94b9e7649e83ba8138c4be41e540ed401c62a7d50371881da87e200eb16b505d8843ec195410c421f61dad9feaa486200eb1b3aa085a8843ecab9a8138c43e8238e403571a8843389037101d90045484348317998992fdd25f9f7168ddcc11d0cb0fc4201f84fdeb66a24439fafe08e8d7a31c6dcfdec212195a8f7168413341cc23be482484e033436c1262a212452c41068d192690682209279690bf5b9989a96566993a4c2cf3ca3737d1ae73e99bd7d0ae33876f6643bb4e2bdfdc86769d387cb313ed3a95be190ada75def0cd51d0aed3866f9682769d357cb31bda75267d730b68d749c3374f41bbce19be990ada75caf0cd4fb4eb44fae62a68d759e5670c93ca37bfa9e39bb1a0e39bb3d0f3cd5accf1cd70e4f8e62d62f0cd5ce4f96617c4f1cd71e0f8e62edef8e6174c7db3176e7cb39c36be198a8d6f7ee1f9e62fd6f8e6396a7c331830f8e630ee7cb318667c735419df3c469d6fa623f5cd6490f1cd5274beb9ce18df5c46d4379b21c637db09e39bcf00e39bd190f3cd6978f1cd775ef0cd30e8e29bd5a05db9ce37af41bbb2d437e3a15d998c6f668376653adfdc06edca637cb31bb42b477df3549c6f7ec305df0c0717df1cc716df9c07ce37c7408b6fcee29bb1f8e637df7cc5375bf1cd557ccba76f49c5b794537c4bd9826f29dd7c4b29c5b794517c4b09c5b7944edf52b6f9966cbee50db4ab5cf32d956857d9f42d71a05de513dfd20aed2ad57ccb1c685799e65b2ed1ae92e95b5ea15da513df120bed2a9bf8963ad0ae92896f9985769568bea516da552ef12d77a05da512df9207da5526f12db7d0aef2ccb7ec817695665e967949e6a5112f8bf8965d685739e6a51849c4cb215e867999c64b212418f9e55b8aa15da5976f39867695417ccb226857d9e52510df920ced2ae50fd287973d7c4b246857b9e5250f2f77f8964ad0ae52cbcb2c2f759058be6513b4abbcd2552e7d4b26da5522f12dd3d0aef2886fa9867695397ccb27685769e55b36d1ae12876fb9867695687c4b36b4ab54fa966d685779c3b774a25da50ddf120ada55d6f02da3a05de519df520ada55daf9966e685799f42d5b40bb4a1abee514b4ab9ce15b5241bb4a19bee513ed2a91be570eda5556f9de39685719c3f7eaa15d2595efa583769553beb70eda55cef9de3db4abfce29ba7d0aef2f5cd54685709f5cd31d0aebce79babd0ae5cc73723d1ae4cc737cb40bbb29e6f9e8176e539be9906da95e5f8e624da9563f0cd35d0661b6857b9e79b6fa05d39cf372bd1ae1cc737e340bb321cdf6c8576e537be3907da95a7be7989766537bef90aedca6d7c3316da95d9f8661d6857c6f3cd5968575ee39bb5d0aeac465786c1f39dae9c465746a32b9ff1cd3fd0ae6ce79bb9d0ae6cc6370341bb7219dfdc85766531be3908da95c3e8ca607cf317da95e774e52fbe5908da955f5d19ea9b87a05d594e57f6a22bbfa02b77d195e37cb311b42bbba02b73d195b7f86633b42bc3f9e6236857d6e29b91a05d398b6f3e43bb3216df9c04edca6fbe5909da95aff8e6256857b6e29bd1d0ae5cc5373341bbf2d3373741bb3215dfec04edca537c3313edca2df8e634b42bbbf96635b42b4bf1cd4fd0ae1cc5f7c4c10ae7b034af60611db24c2d3bf0b06de961fa40d75b3c1e928ff7b015b42b43f1cd57d0aeecf4cd6f68576ef3cd58d0aecce69bb3a05d79cdf70c826ef5e4bce299e0797667a73c244fde7ba327181ae12cd3361991b4b4c5fcc2ab727ee24ff05040697b92aa64910d3b5c61821b78a8e205a52d549400871e7697bd56adacf8d0710b79c4658b2857e41b1200f1060a9609274a17384f74c0b48012841623c8e2e58aefa2f0a045b3e2c9172b44b003982abea1f4c003f73402219e42b0250c154f9ffcd04337dde54430c4144f3d27bd3e10d182f7a4c811789e47849b6f1623c5378f89e29b8b80e29b8d60326dbeb90c5d2d9b18a5f2422afea8385ff32dc8dd6541520fecbc893702e59a52e7e82a35e90a42114f49e65d89fc90d768d76dfade68d77de29ba35d57cd7747bb6e9aefa65d97e99bd2aeebc4b747bb6e13df2ada7599f85ed1ae8be6fba35d77896f16edba4a7cfbd0ae9bc4f70fedba67be5bb4eb22f1bd8376dd23be33a05dd7ccb706b4eb96f906a25d97ccf706b4eb1af1cd01edba457c07d1ae3be69b07edba62be0140bb2e11df01a05d77886f01d0ae1be6db69d715e2bbd2ae0be61ba45df7cbf70068d7f5f2dd8376dd20be0940bb6e97ef02d0ae0bc4b70168d7e5f2eda25df7876f21da757df83e00edba3d7c238076dd2ddf3e68d7e5e17b8876dd1dbe1340bbae96ef0e68d7cdf24d44bbae0edf0aa05d17cbb707b4eb5ef95e00edba4bdf3f68d7cde1fb03da75ad7c03a15d1787ef20b4eb2a7d0ba15df7866f06d0ae6bc3f710da756bf82642bb6ed23708b4ebd2f0dd00da7567f87600edba327c8740bb2ed27711da75ab7c3fedba317c17d1ae4be5fb01b4eb4ef91681768d7bbe8dd0aeb18eef1168d748c7f711da35eaf92681768d737c23a15da31cdf10a05d630cbe93d0ae31cf7709b46b8ce3db04da35c2f11d01da35bef1ad84768d53df27d0aed18d6f09d0aeb18def09d0ae918d6f0ad0ae11cf370ab46b5ce33b05da35aaf1ad02ed1a61f0bd84768d77be99d0ae318def1568d788c6770568d778c6b70568d768e7bb09ed1acdf8be00ed1acbf86681768d75be3140bb46a9ef1668d748c6770668d748e75b03b46b1ce37b03b46b8cfae600ed1ac5f8ee00ed1ac3f8f600ed1ac1f8fe00ed1ae704a10ea814ec582a631c2a3422020000001000001316000018100a064402714018e7a128b70f14001077885270509ec8023990e3300ae2388818638031c418831080199219190480b1405a1a38666e41a623b341afb10d99edf763787161538e975fdfaf633a22062b834ff782b15980e69af69f7786dcf9fe9a8e5e8977c17eea7b03c6a379366a833454f075c8ad8c9c0de8f49636d95279cca1be6f2ceedc5e19debdae6f00b7744979ceadeeefc8e6aa50ba523e4fc8f1b7fa7f90975f29cb2364ec51fd5fc84bf794e58e765dfc8da73839c4d384457eabb551dd4d40db19dae33fac1d31b31b70dfc13b8c627ec968024d259938836fe7a98706a046f567c123ee2674968eaccd4bdb4389e78cace562817234cb767f68aeb52edd46624a1f7ea640af01a16311e5d76ec941828e262ad495d439838137c8a6faa0f98a99e9407e64ed00b13701a74f82f0c18b45919a759a63a842b392c6a954bad69efb79683c5a75a9f6f141d4c32727bd0738eb26c2a0abbdb86897a77820857f04e19b51b3ab6aa3a8b4150ba3ba642fea005ec38d18cdda4fa439ab6d7342daae98e9fc5803b0d15c775f15b9973731cf72b02a9f052d8c2515f42b85a73b98d063b082add5979cd972cb81ada9cd18cb6ad4fa477ccc835ef131cbc4912f674bd0f3b2d2a1386751557e0ea2100b8d60c1101c0ac1412114123f709a4124e470ed4eb6ddaf467df7b07f8bbbf7c2732fbeee83eb7e420b2e646effc5631efe129777d07fc4f1f18444f9bcbb4823eb8364060846c143cf1b9ee526844cfc7c27afffe917d64de92407b478dbe286eed8c03d754a7a8dc8cc60101deb01b065dcd34ca19831431f73fdaa5726b52552b7dfbce9edace5b42cc4ef83d0a830c2cc22caa89ee9318afe7ce21629024c6c2af96176c68c52032ee12449c3560c1a53c5692e887d86f2a4365f42f3640fd8316244e50195252d12f6949a6f17b2db8a32468d6183e73a6e748755c0095329a8c52e2abe9d261179d2048442f2caa181863ab010ce7215cda5344c4cc9bfc18912a452e116517161bdf60bb51277a6bc07333710c87499b11f8d468c250835b19e1ee4760a751ded7aea43b4834b929b73a0ce84e7404a835ed0deeb4093cb0b0abdad9870076052405bfed276b5be3ec309359e51f603653ee1b6733b783bc812f816f8b2610c162c63d86dbc3d6d13180d9094fa47584c2b1a3ee5704d96e580d23f98a1ce39d9ef3df9c1ef3de903ef3de103ef3ff183ef7bf203ef7bf283de7fe283de7fd207df7bd207dff7e407def7e407debefed5ef1efcbe27ee2c7469147d917b8b4a0f4604bdefc90f7aff893d704219dac405feed0602f81e146858854877088e8913c8223da6679558326159ce2ee3a8b0468c8089a77c1f21c5fe4d3116a4854e66988d7bb3d9dea573cbcdf4fc57020582e1c142af4a4a8cca570b20c4e9e6d4ec6236ca8ec996e2bd388836b2eb3f5ffabf3842ff77e7f08fadf625d6c8aed61402730df2079bc7b247b13dbe19cceaf8ca344be323c32c8fcd8cb36c6c331f4b701dbb5426914ebbfc85833d0ca1a33d49dc1bb2d9c7578b4c20a205f415d39b6d144bcf2f1a07281a054b1574120206cbf7fd2ae1da3a0b57affaa10c215bcfab2b3088481a93e077c6647c122be534267094b4f7f32b29fa4a8a7b622c2532bc71a4ef787aa3ec7c908a0c1713d09ab8a9e471d139fb4305af98ef580a04fd7c2653c6035d5adf3525538d893292e9ad642f238b9a9abfc984bb569620be374a767636ef9a8aacb5a81c9191cf26d4d30f188ee0a81313f16a7ed1a923fe881793feba3d80a73ec111476cf2f57eea714d09e8559db564010974a5eaa716328c544a60afd5ad25058e802fbd3e5d1cc3dc5207f6b67574017a28d9b1938b4b822e83064eb2b784f361ccc97fcdd1b19803445a3bb697610447cb7fd603468fb6f068ee39335359885619c2782e2343b182158c011ca0749d823d51e7360458613ce5464b667840ad8201d623a34e0eeff7b5006f6ef86c0478217bc7c921907a58a13db1bcc198aa0d297dc7a4d538d94448a96dbb69c44c2f9eab9b69485384b56354b0651dd89ed6b42c1104416fa5b9424343394e46f6bb115e0c044d2bf2a4273115b5a11188ec65974870386923ee1188fa3d9af8146ad13aa55ac1a67a306fc337331c10316dd3b508533a01e480eab663370226cede37e16baab1971077af1af0a8a750488f269d02c47b228a25ac9891225a70c11416aac03b49f8ee3fc9099f37577849a147ce8d4cdcd7b8f86e6aa2d913a471e65315b74a9562aae0dc6f9cd1db7db0db34be13c5a415f53eead544134bbba2b754fbbfb482bdcbd3e804208b92208d7d974137baf370497ed90cf055f5cc6f80412472023faaae22975f8491e019cd998075b00104f9bf02e5e65c68993943ed4a2c665ac1a58ff4362692206aa9390b512d1c25dc8204c5cff8999ece3af5143540626a0367e9438acdc0527d1b967431a889d9e8c19ed5542b931bac7f0f3db1514227bfd6e568fcbfa26f19e3ca2d60aeac2ec417bb1733d3d447565f60cb0670f490a00f3b9f4de20b39538e8963ec483181e123c4c3ea28dc55f2c446727479faf0191aa98a1f1a0220475ff2519ea6ce4e143bad98fbe89858511c2a7c769b98d6ef26134726b1b1f0979b4cd9cfa180d297cef5ea24ae99a6433eb9c9789021d46b753eb3c411e5a398825c8604934d653e3e8f0c4c72e147f00381a803dfd4e9c6b49cba71cf7525e37577693a331c230332661277c9778a4ed7be9226208b70698b182d5b7325a7166a3c79104558c0ac8a870613da76e187cb5312fae9111a44ba05d032111e82a3fe343e8d4f75f6f4a200fdfdf46a9636f6582eb300832a2c7da8cf84b8bdece358a0a5fdfb88eaf5161a66029d93ca73036eacc816b311b96895c418d32eea8d65345c312a4ac393eb0874106291e8f9bca6430b9ad0279877a160383a0e746d8916c01529c4745c31310ba2bb47210bf26fe18759c86d44406d7cee265bfebe2fcebbbe263b55fb778b913968a0fefa9925f81e379627773aa65d6fd27256602dba5850da0e87055a5c89755cb545bc5fbc3c59c68a9bd411dec74b357aa8761b7f7274a367ee95b66b0b5cbc520a74fe6ea8fe9e11a99cbd5ef8e40555fd5acf710f23272fd275c8da450ff090feb4860dc69fcf6b301a3950da6f5bf4b8b7d4d50f535283cd943c12e5da69f28898f2b817c3ef26bb18ca14b0f67b7d06a2e7459a349f152197813cc4236820ccd579a8df888c1644b162396ec8d00870ba6462cab3bc954a361285299928cea770ed4345e3ae4614416c4fb6969a072921a768d0bcc13de06d8eea64a5326d76c1c03b9d78a3cdc1880db5e5049928808baca20d4a8621bc39023806c832ddafd93801984cb2214a6e031d6d6ce7208b9a12e818fb091750d8a3a33a5198a01145fc7e00f3a06ac445b403cb36a29a316235daac9c6e6c563615ac9eb95cb399949dc941b9549665aec5b18b27379d633b9c0cce706dc910c232caacc08bda0032b9b6b858d870eb9b701327060f3126f53d520248bd06004e36b1ae39287522213eb9e7b83871a588902d3c98dd8dcfbc0c010b1116de0d5f9a586d45bdc555fd9764b31ff1c617d8720d7ef3d1212c875736af838097799959fbe1ef1ed6cd1d9bee88b98796575860ff2a8dc13ed60f265f674f7442e1ed6574c08b70f077fc48255ec29218a452660a00c8a5e3510d491f845ce8d111fec1ebd2c3def4bf16fe9b273485a40b4d0213036a844af4a993522e149b00c780bc842fcbd2ad6115346ecf992f8406a97cb23f1f3d3f523570d35a0a048790b5d10fb3e2a9dce4c3784625f947ddef45004ae473f1bf4eb4e87a9d0242a6131e6c4c600c4a086104347229319b4e8a76b3f2fa852bcb0a26584cab0a13efc49010aac7f8b7d54692a34de6f8ef33ba43270e5e4dd3973a6c0c093a3e4f1f13fea7b432514e8617d9f81b30c6f3bd9927be188e0edac7c92dcd8b7c20bcb079ee580d4e27488d59d741bd41394f53c94cf8f195003dc4db500487223d211d1ce23995a4c8356eafd210f463dcf3f818e12157c71c5ee6a1a13b4a1de1c45112c723f9b3a2765e1f6ae09ed6ff075417d4b2e37d6415a3da39da52ac01be24c2aba281d77df068695f4e2b4d8e9e95e0d1a68957c489410c6640e80cc175fab9b8d5f77bbfcb2e1dc877dfe16dc761107af177dc8ed5813d0d17f42a1dd4c51e2f5cd769459f60d9f099a61b1d3ad5e64a58f7c267995aefd0f1c166b5d4bda504be7ccc4fcb8ffb96bf7da88c23b206ccfff10b147503ba2a1a07fbe12ac344dd10fd95482a7b6b895961dc160432ea06e1f2eb05cf47f9b643121d94a16e70f01962a850c66a2ae1d1a15ea739989ce5b36b09ee4ea50eaac05c7f95845b5048959b1ea2b7340293a71c9326516d8fd25a704f31f018dfbf4566e3004c41a2ac35d006c541ff0287273e18c7cc73dca9a604fd2d9329c4453ae2ee962d0a2949d7709a31257aa9eaf24c3af2e378446584f5f614499af3993d669ed708d35aad43eaf738765c7ca6b0ea6bbeb38a06472145801d406429b921e30ced4a9b01bd44eddb4c8e9357398a56de4aee380f2c5ddcb499dd375372bdf1a8d155a8580725b075cd2635e8348da39616867fd3e888810319d5de4705cdd51e2ce3860b48cb29f48bdd7cf31876bb457f19ea6d9286e60746889683cca0fe57824b9d33dcbc5f959ecb640167a095f090df4d315ff62d46f5569a56b8721be834454b2f4c61cc454a5ff1aecfce9437d9ffef0677026db1d09327d9f3ae0e69b4ca11b83872ea459b26b42a10749e3f3196d1c53e0099bb2a7dfe7e0b5e8730ae8732cccc360d2bb9320736de0e4ab2c1b4bda3033ed02a01ee0a3c79fe62a8d3f88a1e288eb6cb16f929349171c6cefcb6d326f5c48f177a6d49e34d53fa5cf4beb44e70d0c4e7c69145d44a7a012cc6d7da51cf5377d829b88517ddcb2d6b164acec059d2fc0fde5972064094e90b53f24595093ae4b715d00a316bc8cbd2717246b799eb25612012490eb254408279330e0e4a2a2eba863553ccc5ae3fbe728696fdbe396373bd762d6eb0820f83af19e35fb8d8b26e623a74915b483b74ea2eb6b4dcb583eaad49dab3cfc13c56e4620ba63e0ca5e92db6fb69e1db7147724238139b314e10f45f738b20635b5e73ce847f18c409892fbc7aa2822032d62ac19da222b079bacb18c2fee97e6716291ecf65543d3d29305321496fecb7c740bd1275c8a62f7aff54f2e0b9c77ea4a5732caf0c024169018d28e2fdf1554da8bf3b282d1ccc3f4a6fb675689369f79196be12c2b480e7610fc832a6b0d054e9cd58b8b6def7a0a7b5e00030ab25bd9b1ac5bac2b43c3d00608386233390e50b20031f9fe4dc2c4ccb48a127a057f681acd36214cfa95d92a39f781efd6f9272a016bbc49ddecf5c4f25d4a2b39279c92da9c5647f705e8dc0e282ae3ce79ac9136f6d6d9e61e7d43faea387136a99bd8da33589508cc208c17568c16e7780a018bc844e9703763f0cb60422e8ea707fba93afab542b2f902dbf23d4c209df3c698188b4ce3c5f6bb751514ac5872fbd4e8e37ab5779ff644c44e49c42cc76ea2b6698a3463f49bde432686001594119e30261b75e441524715e4da75c3e97d2ac1b3b4fcc9682df1d4494cd4787ac3320e01561fc9862affe98e8ed2d48584447e6cc75cf8d4223eb16e436aab2dc46a7a5c2c65146f911c338642c1cba35700c670f05dc7b0098e85b78c5f6455d71ff514fee9f97b1f249c2ff0a9236107eada62d4b95eb0b72468f3bdcd42da5112c1201705f9dda5781e9c8e2282cb47977d81ca9f737fd11fc4bed47f76d8b4526c4f2bae32e7073998aa33f14ed8c3f1c6482b0979b0d49a4995469af8d590a491f671b4ab9e3f3fcdad1f25ec84c19d5c5501fa501a89948c76ebb34c34f80230ed45fbb308a953de160f86d063926d9de9323d542634033fb2b3301886386709c59a7c145b78683b2b2d188136e0fa38ffa4def1153287b4d2193a08796e9e00b75ba5370fcaa24d994cb900a811424c2448738c03428be4e44357fd23ce54ba3b45395862b79f1ec523023c00d624409e255fb2fab2e458fdadf58d0fa43a9221fc63417b77084ab361f3074db3fd08b1c1c8d3f340378c65ecea09221b394bb4052a5c816a4ea96791d94826a5d1f129b0f7f587bd77b0f9b890129492461cb4819fbcbd99d400194f0143b77154573db5ef9ca6da8303a447b12adce0c8f10802e9cab545f8ea19d189ac3c3583feb822b69c6dd78aac07bcf7188fdeb7fd6fb4e6a200969bed8f9b5c2a9271fc5da7a26a57131f521682d02b765ff77d5e9d6108510cd77b6c9d48b4bb305af7b41970e9efc5a5911893ef021673258e93ceb5098039eb477adea77900f78128dfe58701a08b68c5feb638718db44192d358f6d2a18c5a1c1ed8268b79699495ecedbb48378f941343e3264ae5b9b16902fea417439ea3478c814e69856ae21dfcbfb9f6826c460abcd33589409146cc79e6013239476079e735a75276b564abfe01ae4b0a1f7b571b8ace98fc6d6fa1c7dcdecb1e223856856546ebf019ec5e4b3f8f083f07a5f9e8b050fbd74dd9271611a239deedce9a1e1be7060d122a9fd2640870ed59a4f7529048a1be46dd6dd3b9f33c8d5140b49e489a95349c6a61536b4e543de7ea9b619bb0ecc591927e6465bf54a43230b62adf2fa9d29a413d35a827599d69ce3c942fdd5e0b51b3146928adb284387d4d75e7143f25da3f4036bbe6595314367723cfe327f0ad1bec87b3dd0bb97f63119792f2c0e54e25e37aeded36f31f957affb2c9c01840a0c520d5fc4b87b22f3ac469d5bcbf4c03109c17ef9ad42c71e7a61ecf970da2d16bf681caa8053c0042c1c5c8efa797f38656b315fd54aa3522cba68dc547a8f01b8c32237aa0fd9616a989ac912a1492ab784f0ae8fe7dcd9a4ae89a579dd0048a6c883a8ae6551494f88f2fa9c54c01093c879974ebbc8867eeac90cf50087195e196ed14dddb538d0175823f9196eed8256c1c6d3fe10be4dbd6bf0ba937fdd860b437fae4217d6314850e2fa89f67ff35d4ded4780ac4b55f88c6c278764859903bc9aa21e1a26cb4e6d94ab29381828b649245c57781e1220322f039b58f6f7e5fc8be82dde673368a7b78487e5e1bef97eea92c0d235245137aa28d8ae3198dd3672da790646ba4c7252ebd4051eaf84d4708203092e0e6bfa577be0ecd821806ea5d3e5ee9098ced982dd89c768a4c363354beb400e868078b2962410cc82f02988a51322b05639cbe8f52a12181921488b91db2fbbb193f486517693d17fcf1181327878bab46e9ee06e165752460e223e6626f13f7c96139c685915688165ba124d8b2725848c134d746c6b8477f29e7dc352908e7d0952dfe5d27b93e894682360ff8851d58174735f02dbf6a19341ead2982002f2c389371d4213d551b2a6e2d9950e9e2b2011d368c3e417f365b01300fd187508183fd53aa044712e2c6173c3ff86318a1d9c4c8525363bf62b8f1da1e3083b2a3ca385c13052fb57c6b1ba8fb4a193a1d0fa68eae087b348d4f0a4770c3319fb29dfa258996f3ced72b503afe5ba9abf55e081c5edc7b16b01493d8dc98088e163937b6b1d17be8defcb4614be7381baf158a4e539a3493a7bb7dee69df54f6fe8d05f96f44d8e983fd31f41a760975d2d78e08a7bac69abb735fe5ce6b2a7851e14a49c9546d2f3192772445e8b86e529bd5f5762ddef881ef59cc85901a65e3ecea37eac1d7fcc1c3991ff488a6545c5197117b11e5baf968471a491e6eb309d60106c4c8d42e18664e22a2cf2331fb0e457131490d4bd164ae6b1ade792f256fb24e8e6e65dfd8cc6375f692c8817a350570a96cd21640bb3b4da801ca9d8876b9625b144493c1aafcae175f6a3f1366cc1a5e01910546066281166780104148be75db3e2b803b075bed98f97770f6fc610e2c5f3a37f05d0eb6aa342aaa3c18e839845427a0ee4a0e258d29880cf33776715bd21606878282d0c2e549b348e62ded1e2fa63e9ff7c2a614746f087dfd2bb650c1c1aba451676ffaf5b9a98e36fba502a3c09fe63d81465986267953d8ad692db33ff732b52ad98cef517d6c8339e84e0986675c74dfaa27d62f813aead19fd2b6280ba925ec82186892ec7f2c1c801abdceeb8478f979d08626eb61d63d4c66594df4e123b21ce98093fb171dd7152589890cf4382a755d88b6a62da05c6ecd92a5cd3e12e6f5a1e0b97d058bade6fa7cfc0c803451b1f1113e4d86314800e70e7bee3a3e3d3bad5fd287035d387fc8fc017ef78b263c4dd55b68a6209d8db6a9521c0b92e39e321637142faa4ec315b948fcfd9edbbf2974b68230066ba22f4afc7de0cb4acaf3b1d8169c71adb8a986bb6837c7c3ec8e9dac5bdaec8c732c9c7142e24c823dae80ed31fb930fd7ce4169fbcc7356960ac878d0f3ab928ab2da259c359347a7af2da4fc6512dbdf23f05e4a0de2e551d7128f6fc813e8ac3b00a4538eb1ffa690c5ffd5b28b44f7ccde5b3170799ae799563140a529bd8213b1958761a333bd49bb91746eb70f1c7166c017ce429531eb19dd26a426acb3df184aa03d815b6346adc30e5b5621c784377b09e13300a3fecfa78f19fefea732ed68ac6a72ccd0c9119eb5761454fb61e1d3752bdb78b8c2d1949f59018fbc7b9db0b794cd01e7c41d6182c2ae0ce05176e701c557d5c75964790148a7a3caaf89fcf0aa9e39525ad6b96e5276768e14c495b8cb2135559d2b2ba7433192ab3327b57ad3800ce6707f214c8b4ab8f81d9f273eebfb7e6a3507d82e2990d5788e03143eac42d2ab7b0fa73c403ed13cc26bc10fce475a7b70b574563aa167d6f9907abc7768005b4363ed903c617ef1e22a9455d2af1f1bbd07bf9d13fd892692ed0c034b82bb76134b0ffb9c1f47700e39d7992e163fd5d5d8acce481e08f83dce224309e9cfc881cf8389a423ef4caf98c0fac9608b3de40edcb209201ee3e6856cf190e90cc4dc90a117dc341a0d9faf7340e7cd3a4c2334e7786fa583123b583f7e183c6da07e099e137440cd5f2b4e48c00a55bca47469e2d8fe8cd4d6f3e8edfa16963b07c4f6209a4a976a855e6c0f50813eef0c0ba7529fe9f7fc85fb4b3caccc0ec08f6c3fe5fdd9ae57462a2a58f47895a919888086a49adad209044954114c78727c87007439c222196ee13bfb65c6950753fc3101afed5cf5c98227943ddd6678d32de5c8e2df0a2f95628534769b3057068cd3f7344f0a8c1091830a80b80545ce50592c64023964844b0748f2433501c2e65b4cce7cf406700cff4f312c5d3835664678d1d9491b279a3d6c40fe57184314c9b2239f1f9727ec10378224441b794b6db56335aee511fe3c8f8e6258391156b8a95ab3479cd6c5dab87065b8d05e8cf6af5207342782d97063227ab1eb9421855e8ec03d6a48a4e62b537fa7ef7eae969d2481569ad35bdda63ec05b8b357efbc69168304d6c326f3d376708c0d77f646b9156652dab731431f6b0f5342b17c631e24ec5311c1f95f07e04cfbe052c3cef014556099b6a1c9862d344fcd25d432401f660c6d54a3c33a9067c4bebc19f28567ec053fce4e1a105d7b142b4bbc99ba76fc4a19d727879cf8642ebe56b7fa3d56c117e7de2b94fc9cd5ad889233e1a880d21c436b447ceb32aeeab1ff114b7b7cede8c2eff3b942f65a2f2f3f5c42909c89499bdc9f3c02860c903df1821154608c75bf408a61d3478159c2cf001a449e6f930b4634573e5ab8ec3d7f6b6de03f2acf59384b571c51f1a9901264fa75115bd18b9085a7d45a038e44634f29e01d509c888919a8338b652365e8732236907877976a6deba1fa76064ec7ed711e4e01fdaa35b5c03f875b5b6520372f3b042548670b9c2e0de62aa67f2c328a2a891b3aaf98b139d5e1ba8a29c5aad41036894d566d7aa50a43d0568657f52236a8025ad15a56411ac68a1418ac65c03980f8fb3ab162bc8883e61347931706f17cd483e92b7b93c38720139af47c49cfe88a4912aa26dc7cc0620ca64a31e1c7d4bae84ae93d2f80c1dc49d08f50fa29fa8256e44339545ea4c41827a5caf3ce0f496ae8eabdd1c21a0cb1af79ac8e85f2629d10746ef6d3fb2f7a1a48372693a7e1f16ca76bdc41812ca10f37a56dd6a311f8d3083e5b4a667c5eda0793d03b2acef287f84f999914c334a22fa6e4ec95ba51e3859d131dd0f3da4898236b50ca93f13c370c655e1ffaa1ac2f3ccac6842feacef74ff30692da87690cd9516adcc8a10995741d19503f55e2be4d05a96f112a2de31c60966c9e7f050a961a6948784763e0b8d37c24b69026456074cf7be48d4b9e7ec3c7c03348cf7ef8600dd3ffc5992b4cc05572e6607482f6ce14bd7508142ad8a4b63314e55ddd97ac32c0a30c6cf20e6253a6384b3891c914407affb5f25e34457a935dc8f2b51f25de4cbd271fe494521c724fc97e2a709d439f0991432cba14aff95ec7ce37f43a7645dea96a28dd173735a13f896a9a90f8dc83c93f26cb219f0ae9ab47269874d9bf15179a39a8594083532f216698bdd21cb2242bda9ad1deaeac7ed647ab572a0e9a4a8304afa46586c17c239a1fbd71704b05a5d13b27b2b0e70891ba4878de5a764973227d40bd49d9656e8843e09558fe3b585b86652c7fd88a2cb1acc81df7683ed9a2d15f1597c53c155a784e837b1c52349596822ef167b90fc28446ca643b92d23a4088fe27c27f14e154f411cce627ab90c9e946720d5aa34993b145b9d75c4736d322f7a24b209894f950ede2ea7a2faf6115819789574fc0b41c8d66c2951c9174602b84e7fa85bb732f9b1ca496b265f85c987fb26345e71e56d48f9dccc6e99e91548de140d07031a992a790cc9f0e462f95398f040db3510c8986f07bc4483c417d862f83da4eabe574cddd17c64a45654812e8c1cf0198f1e804de9d222a63d47be748adef1de9f36394956c33a58baf48c751c9b9de62f2ef288f60f35c01b22f431dea63f0ec292da607d38cb458ea050785a527fe93f304eded3ea1a6a4fa12612a38bf98f6b7812d41af7312a9e12229f777da7d62625cc1c39f5d9fd2099f02aa1a386e4e326c89685694888f42297b0ad4cf407440a7ac0cea108e649ba2b32dae1b186a34d3780120a8722d2ba3281864cd89eaa84f98e13dd7132c2ae60d3a16f5093df0c46b1b2ba098d0287ec81f67db519f285428fc0230c0f5196eec0fdf6c5353357fd2530772e5716a5f9896845b3b8105d52d816086946a0022cf9bf80e1b5a4eadea4d960cef24b186ecd7c1a7e478d49f21047ee9b6c4792dbbadc0a84e304da3fcca677bc920d205075b9427bb2d4e8e1ca0500ffd75d26728402f0c4fdb619b2f124645ca3aec869f4551c16e097469c47a242439b25bc2a6b393089094ebcbda03f20d2ff131e548eea062e758c127fcc23be200c5e0cfe58de4363c94f157900bf43f479d2a26755bf431bb256efd3d710645c391f6f90c92ed8e7394d300ea48002e718357f16a88e1cc5fe9ee87128c1a79184213b8f0092a7267b0c221824eb20e8770247aa03989245b33b006f89c56e813c5c42c28a023dbdcb08054d0200be7b2e313054702b480bde3757613edd0ebd2cd53de1243bec630b15c77d12962f1d8c442769a2cc8ce193e7bc20e80e98e51ad3c317b42f14be0ab7482cdaa217b02e9c0e41a6b33632c285ac1fd5ad19d5e69b0321fc47475d61a97bf8e4aaaa4f60384a70363f2c7a12717a3a6d9f9c24797e531de08304aab6bf1d74fe804338065f1051358800305c9e4c112063d1a99229bea251d67d1428f14ab883c0f54e5a4ec96c1cb367d749de5061a03915ce6f59048ac2e767d5f3ccef800d2d6f18bf34d1557b4a59fb7387cb4b780402f08aeecc45d9a5586a662fc0f2aa5a474d555d75a6a881ec415a467b0a01b0a2e5ffa0fca08971984bbe8403641678bd124910a282ae99c6792e98c95683fc59f42bb9f69e8ee0d1fd18bdf617bb699a4f944255e73d256cc04e4965546400a0dff27e5400518e18e60a8af9893fa1a216f5a88bbdff3317212717155bf3a7e450c30cf332f7bd6b0a505986809efed4ffb122f56beb476af9ce4c78f5cf5d5ab04d879559506e7c034c9f2a39b6a94ba05d514070c673cda64b0c0d78d1f9c93a3f984270ef8657fe207b22f86b8cb360b4044761b2f7bc6333d50a293afc2342be60ba509b403dd45da1f3432eebd6fcff354cdba283d7d9c7f5146b9f0f62adf1016b5a8df5482adb21363e8a476df318b48896ba2b8efd9b010ce01eab0fc3298dbe3e3170f79d0e8d7ab6fe33dfdc58344eaa4d2f2aad005c990c90a4e18e0083fc0459550f3c55d073555cb83380e8a5c1cc30c3a80067902f1123365aabff68aa5d9f718d9ab1d7f362195f2bcd5129c39c51773f2aa1c4762bf454058fede5532010e313f664dae4b6f63e4a60a7576cebf04b15aff3cba9a424f152647c4048e2bb096e9b60945f33463e136befe9ccba87007f5fc016cb6debc3605bb78dbb17604124fb316d5d6161fcc8d975c456f1b3224011fd0544330834998932e29ee8ce54edadcbe92d0b69b3f07575f658eb66595cc94c1b79b00aadd9adec21730062ac00ee633da21cdf1f24a27e3ae6ba43d4df60ee149f0c4b481bff544cc86f351c0a91d2e548a50b041bbe06084086b44fce5de6732a6720bb67d1baa68774ce980a3ddbc06f8e4a0fb9ce55c71609788cff4e9fa53110156000469fd2132bdbd38f418f6434e0fa3b79834bfe1816ac5ce404c4fee2e5394ceff438f09872cc9deb9d9f906e738a10ca957127f617135985a29c81b84e07617573a077cf4e33c1cda9b9ba4a7dc54632538949c2f83374d219afa2d98b6b6a5c2e19e9670039909e26eaa29fab23b8490d9817bc394ccf86bd63a8504bbd12ae6af8f7b146b3db8a9d441be19e34dc360c64280bf8601815af6415d423837ce855f99c10a4299518d5c1a7803fd76fd20ab84b6e7ea17af806249704c13e0e83666191564fc6b7d0e63605910c1117e538da5fd5ec3a3b7b1427a8b727b1e4e83a74a7ba4461e878756884100d6810be95edadecceac5717dcb48857de56b7eb48628418a6511c2e9e01ba99103f6e4f9f756e1bf002f75e626e6dde6c43553d70e68153241e1a480003e6db707176296d68efcc595ebc54704838fc1a92651d8a2637e0f877301ad3d0b25be4ec82e30c2e09d739b5a586f2e835959a1cae472bd6a455bd14470832cad31cd3f6cfc0d12e99f7bbbe0c1c0fbf9c34390adb1219271b935d4016fd6408ddd1f014de03b7f3c892c5647b82493005b553f744540674e3279a5abe724d714f623c730056e69b72719c481b3d096317b76809d36308cde11c0884e4e9123051a77e218eb36ef61b220e895a0897d648c29d9e0fc19c6b38e84f948b1f1a76e7eba61c0f8b5235a836361e4d22715f294e5377bebd9e81f8eca3d39e33987a0894b64046d8d1142ba04205ecfe01f90b37e8b6d720118aae5dcee8c6817b236cff0afad0814c7e99244da69987e376cbb899c76b82a9a6c54b62dffebb261d8b11ad73f06912210cd0f921761bd23cc00aefcbf985175e338b735abebbcb8bd7fd2c0ad5c3ae8975289a494a8774d8a46c1e823239e1394504c269c23654548360994b5f0a0fa1f7157ee65807ceb4478db3afd04c6129390499da2168b5a8072087432841f234e8339a9d735339c099a8e4b902784a5c0454c85f857ed890cdd72d09771a928b9bb5534d45fd3387a8167fd6e8f8132fd5d620aa60200d7fbc6385ae22f6d3035dce7b8206d0d2803d2b2b47671bb046b6dd9f3ec33b6f3e2d7bba80c3178ad5f1d1f61fefab58b82c6d83f587b51a30ee7264440c3fbdb50600ff5d2653fe8d36480b2b3492b2725df332801cb5d68001f740d22df56e902b38ec115dd83e484ca525a16030593501923e64914bc6c5a03322e8b1b15c65efc36d9a94ca53707ddc555f9dd095bb656e1628cb731f2c47f376ee9251bf9aadec5ac1fbf4b162bb8f5282d3aadc49c3b934970a09e80bbd2574eba8d7d85b95efa7dc6fd47a1593c99afb0fdedd109f1012c78696db072d1e83fc873a4f763e43d9301ef4550e5b8780cac4cfc8c0f21ecbfe586e21849f79dea10d6c81dae18390a3c2db7a018dd1d40299e7f90d70d25d10a9d645709b6cc3760be72a5b7ba3018af9282b1de149dd707f3526e4c361e0c7707b22b7478e9dc8b20c865f81bd9aa0aff0b10035adf36ca56bdfe17db6ea1391cb3e9499571a44b4668cad42e4c12a96d4ba8242229265959d5baf8f9fb03a227e7e1e8db52cd628881de986f6ba2a704b739210522337d2c2e2011e6c0b876ab72686f2c7941a5e6b7aad5bb2e2e56f613054d8290ea803bb394d09b5d26858ebbdd522c12e7a24c0aa9b7e17829156c75b41e0882168ad159c67dc586647210ad86c6e5bbc1748edfe6861e12aa4a108a412cbf62b0fc4a97c895c08f0ce8512fd651270315a42c0d630edcb9f507f2ded9d0e6e47bac08aec8e6908a31a8f467febeffce7a76b5a50a1d6a87d1f0319e5eb6640860f29b50b6446874d0ba77810f62d830b1962ab90b3c219c211c44ead01c8909221ed0436587bae6ecfa40d7dbd8aefbfa07f999cddb13106e75d13619d500c4c539d2a70990a4efd28e686b5be3ba80ae9bb8970ebce01e534828f8edc5664aabb7adbbaa5bd5c7c25497626b3503ebc603baf0d1ae7cb00b1fec6ed52a3a6beeacb96d6b7a366bd7fada7a5dbd2cdc4d55bf55bfaa8b85a96e8954e97b567df4bfa68c1a290c9d69820f77c5075df1a1ee5b7d7d5dbdbeaa6ea93e03eace85bbf0c1eed7ad71c1ee98a04bbd2e3ee88e0975edeaeaebebf555f57b7519507716d88d0b77d5d7e1815db158577d7d3cd645b575b5beaa2e1fecaeabcf07bbf1c1ae98a8abb2beb65e553f0b7751d5edd5e561ddf960b75e5d16d8adaaf3cada523f1eeabed5c587baf2a0ee79b8bbaa7eaf6ea9130f75d9ead5ebe283ee9850d7ae2e3ed6bdababd7afd629d5b764b5d5abd7add6a9d5afea2e75b1a1ee4b5d755dbdbeae7eaf7ea953af170fba57eb6382aefabafa7a5dfd55fdaece6aab5489f5d7c47e5331211b9fc360ac4fdaa3537ecf0e2e35d574e64887206e88b42c7b47219e9ae272eab35ee72ae91453f73694c2c3efe879705e09f2da8faabeb309f7db52d54c1fd704449fa408991c1277cfb553cd91987fc49d9d357c509927fb421bf03bc313cab71c373c15d80b8bf8367cef086de3d78621681b6f3d26b00dbf2f2cd176b8ad308936e1ec854bb4097f2b3c814db8de23dc86f4ef2859ed247cf1a988722c7196c97f1dc7e0aaa0142764bdda38e93a3813356f09116e71dc7892c6baba2ae279fde3c1e9b94809b65f28b4fe91de81f6ff932e30d491775459e5531e65aea996f46f9c1d9f1d0ac52aeb0a2411c9b51e3b3f15f40f88a5dbdddceb3a2eafc4f636f1e531374e580a076baadffc32f2308cf552ce1bb22dffd6cfefe076519dd310e5fa01cda36efced9afffffca2eab1ac6d459110fd5ff8b96e6a057b85bcccef5926297c852dece99fa8e1000052cdfff2e956dfee138b796dfdbdf4211a1469fbeb6bf7b872630736d4643b05f5e9255c9684576985103d3f8c33c41a2d55d8395e015fdfe53d72a4af9b0e9165001e36be273e1ad735b2a091127989acbd2307a1ab84e89f2ba62486a34d75bb369953181e7bc616d922b9099c56af200772fa5dc2b452e5f51113c25b1b0bd5fef84c121b527fe80ff14eed232d28d81dca945c5b000aa5630494b25fa974d4a20be93eb2fcd91a60728746b5e4ffb824cecd6ed51934de537a7366f12b691d3d3b7a196c1be9443c1145e614be82da4f87c1e5d1e34388630b181432b61471717033b079d805904cd8b209d55c822abb3e91f74d5933227cfad56cb6f15fd2faa36eece58b9b41c8cb69be0666719fc3e94d81e5313442340b06cc2c10957b050861397b996a4f676bdc487592cad77588b3f3e308e9dd719c2aed283132ac02177df02c23eb010e07e9b3302dc945cc33e688a7be29a3c978e27a2562f8b34f38fc1fc096290042034180065a9faeaae84c5bc767535243b59fd5fd3f1cd544f6d4e3faf37980f3a93b91a61ee29351032408711be5acbe595c852859f57489b6159f0adb281bb71459723be972c518bfd8d0604527b6d1e1fc2fd20e1ac6fc06b40bea757fad0897043fc292f00b3f20f3a6e8d210605be0bb1d52c981336225f5cc0fa13421eadcd52048379cc4a764b356bc468d98e0d100c4003e6341653a8308f8c587a791663bc56a1c57548489ac3686ff7c29fc2854b5502922ea6389b12ed529cd2ea6cc8f418c90ec03ec8689011d29f202ca45227dd33aeb6089be3959ed0691f1336aa27a1a8f7467b792a784fb4b53e436ad74122c4e9d9b899a5a9ee524f4cdfafad92004a2dbac68875e8edf328b5bf23602a97e69668b6e5ff881293fd1c5e8322ced9a2f174094d35bf9bad1b13f1ecb82504dcdd400c3b74f6e75ab9ec00b8bde547e9226f5559f987ce793df7be83c58cd11ce4ba1e85974284aaef4bd955f73c26414b7ea9e2a391a287996d86f9ccb793cd28d7213f4a09d80ca1031cf273e70485fe4b1c548f0b43069d8010fc46c4ffe697b89251effaeb57a91df55333a9ddaacb1754c42c54631774b0a98b81877efbaddd9a463e817dbbfae7dd9a0bf1e2f947978b75d57d8a83d6c0c0ff2ef4ff6e5e6f9996b16f8f56a6d68d5c8bd597ebe47a55d0bafb20569e07284e57dd8f7edd4ee597110642ee9f8b4176d195ae10a39aa5de0d7c1ed15038a847e4f70623120406584cd0d9968de400958948448c0449875aabb0ad9e4de81432027a4aa75cc08ecae792fb96461a0fa9ea32ea6d32817dc171b0d56c5d67367180a466418392b5f7dbe5c23fb41c473bea9daf85e2ef9a1aa4831f0b2aeee4a8c62d8d0bf7322e5c9e0cdbfe569bc8440259df9dbe46ff7ab607301855ad4cb01a29df89712114d5cb0fc85c9286cb857651b976d5efe50332da3bb02cf0ec3a3c01fab252acb9d88526f0be8307c33782c5f33519c5f1f85992211f81e62581c4be8790ea169d1e34e50204e62ccd44a6bc2ccaaeef5966ac295bd7bf558a56a443c3f3b5b01a05fd739ba955045f01e3e8831115e13adc04f4d836e01023d7e67095d08f7a7efc5629930cfc6fe36632cb47a2453b374f77bffb8eb9b7a87bab02f9964c7ee73bd70a2d43d087cc097699fadb24c7959847799aea3d5d24534b29a62b95a6636c3a61cb4c6d5ff470fb214fb93633012e8345b7efc87208610a3fa3c480d858f782bb4318c3528866c8884a7c645226df5b229c68b194db408b41aa35d5c6199b1a27ec9930666e508b427ad833e22c347dac48d1e669d1e985e7a6bc8643cdc0b096e20da85e7971ed73b27961e88f5fe6c3001d771867f3b527c4c82eaf1d2bb6da54bdc8826b9092155f69b28118b5672c2f42613529e0b757417b250b5b76c827ab2113c5dc4d6508e834f31f27efd141281697c10e140f79c8140ed40a1017cb740e41aeb095c8f259ee8302b7f9ecbb0128fc5873ff4e73a54c04d6382d4c1ffa53374c30bffd331a03edc3ae0e2d42429da23957767e984bba9c6f5c2123ebd0533816f4b29bd020496623ef1ba84fcd9b9e1daae3759eae9175c85dcd03632437c806ae4a6007cb0562150458333a62d44e871f7d43da09b91d81c6891749fe6a445ad30497d34056d434f746d3eb89592a70549dcaff265a76b0e35ba805a0c8775ac20f6821c06049c725d21599a62714920e8516782be68d2833c7f207fd2e2b37c08011e298caee601a22be3c097b482f15e84f09ae79284368337e5aab78b19a4ae91b36d2dfdcd2796916872f0e70a3d123b98fad97ea045d8584eb5a2bf28856808c77e9caf9e5468329c6cea1d789350a8eca1fd1a53b4249d974356a4d0519a4e391912ccb698deb5326c6cb899676084a0193ca6d4adcb1bb6c0055ea0b87f5fe886815c558690e0ad6db139a058c01b2d870fd58883c80cda635719842ecf4ef229a8776835841c4b18bd0e043738b2fd8c47f540bd761e29540343081495e29421b460a011d233209317383224763af518b7563f8f451d1811e3eb15b6281b2c79823d9be46774639754b3562a8d8075205a43b1f115f1f59e601b7617255adc8872607ff72dd704a64bb583e524bcad93d56584387a3b77676b2c61b6f675b708d74701e05b011e2d3256aa7039622fee019b5537044414004c432922493d5b9fd106db5cbb0587826f49c5b7f70e93bd277b2d2cd8b964dfd689df4816133d7395e439b599c6a280637a1746a9e49581dc1950bd3ed80ba02e1051da955628c4606d175c6e3b03704788e272805cf425f9b972f1c5d992af6e9b63932e5c00e99c4c62aaed30bb1dc4b4d5a7dae6c32d656561d8529aa3f2a1b8374c82d904d8b8799e18d86add6011ce2b717aa337802766ccaa664e2bd3ca34fb93b3bf305468500509730f801b79a4a6f726bba171dbc34053f9fd2cd5d58f6045aabf34f74e55ec6a2c0072520ede9515b5553f4d584daed2ea2c536114eadecbf288c97efc16992d98e202158677edc0f2de0cdb60116a672a64c754e3de833b4c8f9ff4edd346ce2657347836678197f5a52703aba4fcfd3e047932a349171245b44d63eaf26dffca06980bae401f22a5b680de39b35fdb06cb1d3f20598e7cdd21c4198ded8c56bb8f687d8c375130237413f5806c4a81e68d79baf032b831175a7f05c13cdf114ffb0220101540000a3ad9f733d06c3137165d2f48a226c60624fbf1fe63fbc8c67513307589544b251361e0325a94638c890a9370d63e12561dfc632314bce51bc3d181ecbd53834ccbb533b8b67c79cf2c9ba4daa28b29af03b6178c8d613fb8a3811cb10bd76aee852bc99eb638effb3680f8183f16f1589c42bb93384a642f6446360e8ab2344c880af0a7c2d1683dec809ea22f30c5d3224aa77035671d27d3726383cf9164991328b99d99428a1def3ee3a47f02210ce0c92be2752accf4e60516095c2b1d1693a89612adb145d309b2b82820579fedc03deae9990d5a27b6bb2ed23d2c9405c73dce6e4cdfa0104485a5ed8956cc3ecfa576641201c92a026bd79acda01781b0283501722ea3a3e3a375ffe6a8077d958eb8a331f0870abee3d80d1711ce92286f8246991e1151e2d2402a518abcd23076c44428f0d9bd48a18529ae37eabb4c8304fb5561d0563c52ea9ed75642a2409b2b5418f090ad9b75e86954f642fe149f7207801bf6709cd563d6b41a0bce3434f8613847ca807af894a1f9e437ce1341ca7118b2a8a5057537f876f69902b2939efdd02d406512a2643019af2f5b7fbb03b350c5571b2b4e99d29201ccd58ac136a1253ccfc438dc806c857243bec155654547886eec7bbf61d08f88cbf9de49ade9ba6329f71a8154ec0bf4f2e3a7a491bcfb48b433d8be56a227d5493fcac557a2dcaa9b0fbe62478cdc4de9e4a566a9486332196392a4e82b580ea33c6a6baedf74b106fe099b8f78cfad7d331ee2610ff324192d10210cafdbf97ddc58985d9adcbeb79d4209caff8565aa8bbc6953c035ba522d095f1824a0a8cdaef6d7214269082063d7a71cb2428f4d34e81a4f29d09895a5a9c1d7daaa251862668f4c94644257c26212f5d88fc44f957c641df279a39acd38d4b939e71447c51c17647a94aaa4fcac2410963c6f36bc755a2f26fed79fbfc46abfe15e7724305e15f782ab4ce1b9a1bc57a8384829503df923497ea86ba74d23614c73eb3d8ebffa32401d7b19c02c62f4bb2a7c26bfb486ac46af4f073baeacacc0f0e6997073bf7f4388f085c20f2b0d0ebbf9085983476fe850ac46e3ba00abe579054511172d0b29055b2523dfca1d3d02d606521a60aa7a1795b4bc7b8f8679f89544e99bda932a991eb2531056b9d181316c28cf100f90613df40a2b72ccdf9aa7e855573dea8c8ce2c11c54b7c81d7d10ea0bd2a64a202b23597435729e16f28ce7ebb5e562f8e76e5aadb30636af8d2a535f2efa354246e6f6e7823a21207476159d073c5a452e247c2af92c7981021f2fca6e6f442be0d9785705daedd7a58b37b63a3b558ecdea9c91dd2ec9541d7a76b652a71310431f4e9deca61d4100deb05c68553fcb2168b2d78fca1f1a6f92e43e98dfbde1edb0c682ae7336d9685f6203c19d3b41e4a48223138a8f3d63d4673b166dd16e1a14456c534396ce3de482b9e4a10d08e0188617971f45062aa0079f65920a618df39ef913acbbea96a38c98da197980bacfadab768773ab1f2962b1ef328ae6bcb20b376d1c8481b88c0c7db89796eac8af5fc1cb58cec11951f17706563c885ecf9d04ed08ed74a9ae229dfc4038dac8827905b1a50a74007fd0fe083da1f16cf3cb7bd678728c564e34b5eb595b35d7b9554ed6e3616f7238b62f9070e42f776bdc316c1312253432a3fa35a9b6b6829569f30754c091d6c452f84e574036ea5109f7ceb2fac9b6fa400043eaa8519fb8f20f2f500359c1a70700597ddff9aa9cb2f08946c2b7674d38169f885e7704ebc37b582021091c1e00231e5f600c8e84649bf804db74526cbfc9abd7bb6f2f112c51a5978d1939a73898e2bd91237368dda22d1572e66fb0cba9a9e4285b31aaa48dfd46b86b41865fffa0ea5cdf1bb45f277aa022e02270b5eebadc69915ce411ab5a1719b9a609898c46cdab4f7087c84e8c8236e9496b7c9855eb945d40fd996746170697cfee9ecc5b7d6f63a8212bb10e41285d3cc1b9104437afb3f340d07bcf97d143133554553d7c378321884f8ad109222eaada366082ceadc56e9a0d39a3a5955d9cae2a7edee0d88f2808f8903fadf1df616e2665e9b28d4156b5be74516ee9f5b30d9be00a7ada7b856e162acb7dacbd07f28ba0272c06191b3c4aeda84bf406fd9af6b3d14988a581e5a02e591da2910b64992086769cd4fb6b05d8cd065aab53afa3a26c6cf23cb4d825d64720d8713e720dc828c64c04707984ba10f6c71b0c7964be941a8e966629fd4525937efc9f95649c7ccb3ae9dbafb76a7d0a2de1d6a5acac49af41a4899d7684bb8b9520397a9ad22504fe00b20cef688e225067766ea6821fabfc463a9906a0e80e5ce2a1082dfa76f314c68b5c6107c3bb502cc19af577f840f5ef66013bdefc22256a3c16e050a92f8bedcc7dd398b9233f805231f98833c7a43e0bab6103072dbd37324e4e2719a9e179610f726c1ea28dd0595153adcded7cc7e3ebe795b738b00683f30960e26115b6bbe8fe51c900070cb5b4f02f696b86951539482c1dc09f78cd110d0d4ea47e1179e8825fb9f5b331dc31f8058c535db46f2fbcbf81200fb8cf1e1925b46425bf9ccff08aa72c374a888670d82f00194e89104d00e191640ca70646efb85c4f83e0dc6dd2eac990588c089ed1af7c4850002e6d7d16c37087f61bc440c328ea07b9878769603017b174c3fd763d93d7fc420349bb4f97cd0aebd87168c1621c92ab88d072592205c820eb40a8c9fb35d2316d83792b0604979b2905ce53ca8669e40b002e680075740c4308aec370564dec00ad86da32df054211420ea39bc1233b62f36d7668df3b4ba80c19d28fc94d1b399fa2141666d4725f247d41691d7c398a386cde619c469667e4292ab9a33a3134e88db3b400dbcf522b4b1c028dc51d61d3ad645b59058d99d44ce06efb17627e37b7655ad711bfbfcb70f8be332a01280817cc491f7baf30be8bc3ca710aee674338d8633b7fb65312f7819a76e84a4c1df716c41f91a00772701ad5ac766983b00f4c356b4a98644e387d407ee44d39e8268043774c8548c457a0d89d14bf958677e5a5ac661d4b5c69f8291cd60a6789a08d549b81d793823b5afbfc0774dc4d16ee6d607150b30504bc6c462f8849b05a9c95b2308d2e054c9db5374dc6bcc950b2e212a91c494e9deaafc2b6f0425644d4090993adc75610720fbdb939fe3e6f0f88760d29bdbee41faf188d2fa4dcef1472a3ae2493a9e00d9120c54ee0a35bfd54fc49a8b89e7d5488da8f958c4996cbd38388a7502153db4abb571ecbee7e37bae84d58bdfd5ae358a3f9033db0014ce3fd5c13d7b69c35849af651dc17c64e84c1c33762d7735bf623fd5bd278363f59984215313ba0674cd5d04a331b264a8319cc5be454a6643a3ef299f00732aa972feddbe35780f3009333febbc86ed823b0a65b481555870d7d90b331bc9d8feff9bab899015c144e989faf7fd43a07e3a17f174b7df4c763cafb7b79376ae7e9457e9c293573f99bb84e221f8800faafedb26875c3920a2104dbef74d4e792b947c28dfcb8287466fa332f58d36a44e7c70b942050c80d3d97c3da1fa5429dd6b93e8721dacf1a71eb87e9b7e8aee57eb869ea6ec1ea39685e116d9a4ee430e81571d0400f7ce5c9d8eec063a5cf5d6a504e763940aa84db193860ebd481ad845daa8368d1b253acd317da9f275a58959fe60071530f3585725e75d0d771439dba09516755ac0e02f1e0409055baeecab3426bf2c9f0ea0075f8a8366e9b4d6db1300b40f44e8bba9795b9b05834253293bd44b0b81edc4944cb9fe877650dd058ab06dc26ee7707e450e6f68129599f9406f2ae8bff3f5e06ad9b943590cad277266c5df6849881965fafdb5f5ddb10a654941859bb1b18654e94ccff373f4eea305f063a63394c0f5da23ef75683c554ce1aeb20e36687c59781561d9e0c5bab41450d08423528759badce0191299674af7b921ea6c506716535ba73b19778c40924f2bc874364eba29bc1043621077a31694fcc1856dfe4c0d257bac060e42a77a84cd6f4cb11c476446061dd5e68a75fff917b3648f012e0be91dfa6a127eece8eab590993b67421b2d6c1c218363b3d3d51848681b9883cd5226d71ffe11fd116d300c5310f5f67719b27492eebb5ff2fca50af989f54dbd373fa4ce6b69f1a808b2a61700e6959e1ebf6ce70412c40d9338468ceeb79eb76a6d41fcb433381bc9ed075315c97799ada270fa54969b00eae7d5fca97dbfed9f7f936a7d27e6f7767a3e035e9e904f78b5720b2d45141810d31f39228df83069b3256869c60d344550f483d04e7ce64723567e09b08212dca771b7ea201171b26c0127618609f2f803440c7d0813ef1e4234169fcb2a9a3bba51d935e193496309650f9caf875e8d06fbb98fd545be405ad3985f0d815fe20c2dc314b6df049c2c3259cc498b5b23c9b8bd824086fb6806092f07b3fe3c94901ebddcc660310a2f9cd05ad874fe825248da97b2c3249018c2f091e8a7821ad1efcd9095c3d7e2f885ee863c04d7fbfa9d474d0e37c7e25026220d0ef3f9035712f9b29d098a0016ebad27e977a25192816666f2714f68899897369dfc317c80438ae83d5513504e6f13ea30f2414253666e4ba6b7f4ed034d9222ab2a85148d2924d43dbaa3987b5ea9e8b133b1e0b932acbbfde58a5b50d364dc171c7d0832a598a9235ec1c079320fcb7130d7622504ebf291ea9c3211c7e9baa968c26027c1d55345c439c4f245f72c000f384e33062e2630d2a941438bbf33d92a3ee84d163e45d90d6be59ef73eac02a06700f50a52df2779041ce4bdfde9399bf28ab286cfc082f5b2886aa4c56bb3f2480805222fa4706b498983f5a83b505f5be6f74ec4014bfb7bbb0d1fc242090564b898a691ccd071ac1ab14d6e1d9c9afea7b8668991fd7a893587204b43074a943d4b8b96aa5e73a0e2da49227eeb69b4ab98c3dc75d5e44fa232c9e2ca64a8e26c46e7225480165b6529880ca2da40b0082cc68d5385686b4bbf074d43d2e23209ba3278fc9d1aac01cb9ee926d51c390072f63710f2e317a30821551d8cb7e00e4c3f2ba08ab8eeda4569c2c831891469c934203ae0c5fb52780912fa84073500aa178420a80ea6a9715af04646177691f55a2be25fddc9a9b120d526a995d10527490c7a1914ca70691a2ff0f6c99b2f2a90589fa83f3b992505d8bcee70e513c144474b63109d0321435930e9f6190b8ca978795fc7f2b4a2364f524ed754825e2782d5ea72722ea28184efb8c35970b642b65f25e13e72e8a1444f36542b1a6a8895bfe3f77b9662205753fbc0d8257da71b82ffefe7fb5a42627c05184a6dc1c8d2900e5f586d21d08aff5d11f4fb13a636482b990677a6f908a8356d8862d00b95b09ac624b3d8b05f2945da73bad3863568563a2b99dae1e17a2d80de2a3905294fe1f0d783dd60fbd6dbefdc33e2a96d25754a944355adcadec93ed94adcfef2f4aa5fda624b32456e3c3b8fc9310ac8c9beef0da39e8caf9a8f02f8a2d6284ac4722c04ffe1852c2c358481705fb19bef04493de59b23b6ab83c096da72218576f5e27299d9c572034b32cad1a306e3a0bfcf5a56a2719fd50e66a088ec40f3b852e98eb2af1271f03aef7e45dc35becdf95012145bf44516df1290df48c420369ffb6e91b2aa0be90cb44b62d166fb824b108644495cc82d4e0d2a1d45877df301882fa4081a55038defaaa92c803777677c578c00b60269dbde4f3504be3167831ee5a8886511bf109038dc3180ea22c4d397c48e9e60eca1d2d46adb21f3ae828428440224df3a8617b4c887fa2c55ffe877ae9bde2a5740f40bc06d6e630fc06e2c7f5b8fadc6bd3b7cea6d8e37f7e6a354cfc7a6c168eb854e4c4899210ea8278ed2dfefacb7a15baa88c1624ae90dbfd49cdb344f87d40b20fd16ba705687b5b51d580d75f97e390b19129724845cc3c55d3c9c1b017daef129956efcda6c8ecb00270a19403f327dca5d8c50f3e4cc0960ef0a2ec34a251cd48924a14104621bfb54799afbc7d6432b32ec424a98785d7da4bca1f698cb7727cf2cfae88680604c8ea8b7cc53e4f75165559a8f35fb1d361c7610c0502717d371b5d3dc0864f223ee9269808387515e5c5a958df37c90bc483bec6d275c0eba041b0b189668078fb2f0f2df44518ef8584b35330de5cd3927c815a665940e0560381b821af835023dd1fbcacdcfc0f2aac0d7f7ef42f4a4044b151f60bf8eb0980f471b1207ddfc4279b7a211ce187a6546141e462bb1100e467e4e3bf6c1419d5051080e0662027a924b803043ffcc11fc344b19e4b22416b5e8799c9fcd70a120928f3b47d2c5cb22692d1200262d089e9fa89ba2384380c6b7a09997bc5e78f67a64fa0cd4adf6ef4705c34657aedc553ec3e223758840b3b48e23425fe82a188660dc6a7537f3aa621973e4cf3b4c8db0bc7b30fce2b7884085253c20c4b24a6b5a61160b82e1f49615ca16d0cf74a0abf9ca28f5254d03d26b880cb47c5ac199d43794f7fc7f1b6a980681d080e14422f0e588fc383c025c1677c258425926a378a206a03a9019b184a86e7a3f95be325e359e613592800499304268b0d46db897716ed15d381e04d6dc96c24b6a29c5247ef8f8b71167b29d2b76581aa9b2eee1548c0027619440c062c62521ee1b0fc15a23bb985cf93dca0b4eddd369a1307f23adaa9f2cbb88cb7b49d5ffbb0309b21322e35ea347bd7cbba2ec6607a1b27b16acae3500c21b04f15550cf6220c10766531539e79ff90f866e93f8b409f31213fd1b113c20a9435c60d2e085b272627f489565d261c5f92ef81f34ec05af7b08b15c69948bae87834f90212dc1283f709d411d875068ea6473f2e1c2410e36e281455eec1c2998e75931cdcb6513f8ccb099be8bfce4de017b0131383b6fb1dbd0eea185c239c8e33dda75ba749ac362f4957b8bb5506ccf773323fc8bf08a5bb4ac4f9d1545910670040e66f88f1ed6ab8b43593bfec86c08cd9e40e1db5a043edd56aca85ea83878e71a2f4166477216e2c4e0c290b722695d773c3cddd0385644425cbd7c8c6ffb942789b01e7280354d41df25d7bdee59a18aa079b15b8e327d3c3983073ab726f2b99717a6b0ba019d10362f4d9816e1c18e406699d14159dc290c8c58957c42d6119ec41b0ae6c0283143d6d02b2b9930555a82bac728f49a1a19e5ce4d67fcae26ae80f9f4425602c60a45e5e469b8dbc8c50ef06a8383f7bf2b3703cf24cee3fe599416132ade5bcaefe2dd214a91fc3621af3f7b8d0784fc718a32e5735ed7fbae5f842f85b8d761b6c66eaa64e255058cfdc2e251cf31a6046fd2e598592705a0dbfeb1b4265f1cc5b8f01bad3011798fe658daba8ca2cd65c9497b67a9e6d71d2f2874a8f8b200ee6379d96cd5fe30c8facac73b631ba647e71406b02608636596542bc032fed518b3e5c6a9d61e91f288b8edc8a6a44483adab16a4b74e8ed5540f8ece1057c81e6360567e4a736f2aa193d26fddffa1f97d20f0fdaad1d92240769d55f95fd9beceafe0f89ee3d225ccfa5fc7b955ad3a885a3280afdc36847d61b26267c193ed4bbd723bf64dc1baaa2ba3745aee272831eedf5e40f8dc14fb053a6aac72c2355516c8ecd9c250793a6e6e0f9133422058f37a2252cd34597db00e25bcb78ccbb71cf8c9ab5e94e7c8c16a99f46bd1fd698c9030f2a5ea578bdba550e25a2c9ee8ae105d530a26230a155bd2403d4ca0635d93177f1bd55d60b4317e24151c627e0a658c3d7ac38a005bf61afcf2a0ad03fdc609e753f4ae467edfbc88d9dcd6da1669be160fbd41fcfc900756b8ef2267583f572bd253645d9643212367302e3655a4a6d9de7b5b84526a28abeb4885d895627fe5bcacb802018120968e9ace8122e1c74b5931d81799cf6ec11180995d12aeda599e79eacead0bc89c8d6a1cba2c035db699754150d9ae8b3f45e67facfcfcb06610ac49ee93b06f1bede92d7b73ced7dfa2b3357ef8dd77237f62d33827ef47e05b88752fdbf0d601b85a83c417b3b6b85fefa9003fcc38a78aa07d97ff1c3e2e56325f21c9f8ba4ddc74b0226c121c595abfcf2012e9f538968d6bdfc06a7851f07462d60534e3e4a679b23f221671b75a8c88f40ad3826d184d7da988d0fa5dc753bc53a941f7abd3678feb2cf01be3beef8cca878e6e57e34a8faa0e22d0587b3d6c9a89e38e459efee759084a10d097d63af4997df34d31e45ff4f483aef95dfa1acbe511b07024b9ea8b2a4dd94cf0077068af9ac11580c1547f79bc381365b9b609d17ee7ab8528592193e9c9895c81dd0fc5c7d83541d596e7afee17c4d20f49cbab0c24fce13c78acdac630ebde1a6b770dcad4104d73b702996d15eb1c11763392312e581be68bc72df19e05358c4292d59bafba0c3a8afd221d543400965eb8f175cd279085e51600033c0b07b4e6db96542973e8336b0bff15b47340e542b0b51308c9479272a23b9a66708a889bb37b28a1d4a1bc1edbe0dbcf02b6d1e24e2645d9b44e21000c2d74d975c6cc4e8e7b99f9b8cf95171b27402366c1035e39eeaa0e854d4831fc5cdee34bcaca9a0ee4171a67a137dd7e19aa826815a69af58804e418257266c89ca5fdd88128a57a94b504648cd605b2d21b2f894716c68a138041083c88bd4789e80d174df410a2b0c2cb8d9e01c6a0a030ed600a58661115c9b016851634065e1e7c1a18084e7f01b8b21c8f3f4cb24182021b75b398c6e8b02643a52972e9bfd047f0975430a0a1c24557087bc346a5ddb2b2dcb5a77efa717e8088f62351b7d2dae0fb0dac9ed03d82818d3204fab3678358c80c40f6a88f3822106f823939eac4855cfb9e8af3755fd94063d93a8025622e9a3508f4f7dd3c58dae396fb0a46af4b9514b710f79fdc2ccc8beff22520e222a9ca6e743c250d8de832cd2fd06898840d5fce0d13c61ffd6c682f6ab116d9b4c8c6dea6e8079277da7aae1d2bad416d508fc15285edc85c11ab8e697a10e9f71b89752087f7f4ef659158aa98fa251046e0081a7bd1e371efb5d105267cc50ca72cefeae8c5b3cf635ee3f1108c26c6a2863d3d0798ddf021292263cc283c2ab8b3926729cf54c6409a4c2465e4109390f01fc0d048ad38e9152105809291d6062fda7645cce9068a4b2ad47c14e098c7806122c3dc8b4d560b1e37dce35fb45f7b0d79f763b920264510a7ce2d14398b0fedbf709e7e83f6d62af014f07ec59fb25217befbda59452ca94523c0aa708a3087065edcf53dc8e68c762e2537d11516ca2c55741225fc59def2833d23b3bad39d36b3b1c907bfc288e00391c8e3d7140541bf7996aca44e7a7da8b95d6123f9ed6b891055f6e14a27d779f968409fbc53bbf3ead42a67fdd6e98bfcdb81d51f91bf7dca7c5b8ba3ae5438dfa2e3aaea30743681304967b4e9483ffc4f75048a060fb3fad51ac278a2011f6f1f3b9589783ffc44f28fa0fedbe5abb322c2decc76e6e19fb7123dd253e5446c90a2b46259e036b8cfdd1c4e72e41890e9be05afc4243e3d13d7af402891320ec08d1f8f47c39c21a9fe8d18bba4db4820549e83667543b557c6185aac80c184fa413dc3d7289627ac2e9726b4b9bcbad2d54b6acb9dcda52a6b565ccd52eb7b684b9fdda0532dee47bec34f72e7f92232c74db53a243b9b0ab5173ef6e284c7c508ab8b28b91fba0f41019cf07a5c9a852042bdd978b95fbc4bb0f0a13773e5543c4edad08a37167e4ad888cb9cec9451e7748b9be7ed51823ecac288106adb870b95505122efb7fd083b8d0a7193bc8c25f7613e1eb65a487eb164ac66cc4902384b091a694ecb27b3a5358e32521363da3aed5de2e3661a7cc6a1067f31c93eb9c1a657907c746ce0d1d9842398e1d4fc146f3dce09e540e1c004801eae0f1ef712e477700601574f8fc0a1c64a1f31d2ab8e7d33f2b700b2cb8b003c883413ffe420bcec3855601310c4131bc10001e5048e532c0e04331345100b848480032180dc11e44eea3c8671040d360c435f4e81f3ef8ce0057340cc063ac018783e267407ec0a31b64155147d602c53337c629e784186683bc5145462985145248218514524861a66d2c15d82fa583894c1f9f8787a2c9eb1e3f3b5ce0a0f85f0a188ec5c9a9393a5107e5a81dbb63a3de80366e0020ea985f218779a7b50a26f6b12be4380ba8de6183bd9f165c000a7a81870a861802202483e4f89e4e26d3b56dda956d18765d5bbd28dde625b7b8399157d442140090d10b3d543e628842340cd550f4c3e8fa58d10007b01d79408e820821c0101b8814b9a100468e18008703e480001d90b0922440014a16c080062c71c00320c024021298c00e14f8786852010b5ca007273e60e049067ed000101be0400782f00084481f188288a4228c384209892494882205044b4c61a289105071e2091154190109a0b05202134471458a294e8005055464d192822aacd8c245052be8c28216b8c0cb0bae80c19718c8600660b0a0410dc2d8200b2dc46c71031c7091031d743166073ce801191ffcc08b325f9801e30c9a1610d2044108435013861863ac2102194560538611cc6873061a692c1d01094970a3842530418d2638a19fd06f1a0a1d855e03e90343109154841147282191841251a4806089294c3411022a4e54198193008a68a5046e8228e21529a6a827c002e46141011559b4c02d55f32d4bd886fc2d417777775bd1dddddddd4da5bbbb9ba384f106a5f60bc64bce8b5e55528a65da663a599c1c1dd48e8d1b291c29603c54ca1c590e00e8f84ea31c5fc83c38f8860a30d5367ce20ddf5941da80281666266fb4b083ee481daf6ad406d0cf85a2392d60dbb5f3820b746b1d1ba05c89b31901d2a4a41b679a66dab1d900e5d65f613332ff92dc052b6a0b221f5361127b41a33d9a8ee9faa732472b83b11d463969bdb04cdb4c278b93a383dab191d262ef5015f1206c0ec918dbffc341f0b314aa6069b1fe594f0e1dd4ff6a2ee36e6b154eec830357d0711676e08e1b1e8e1f1e6f21870b3a1a880b52815f5881c78e56fdc0e002c7100403c0c385608001d88e3c1986888ab4e65854580118f5f0f1450d3d030d3f8450c38f159a3b006f003f803000204741840c1962830d448864453ca12dd5b394ba4193a191a431b455f7d0b04cdc336205d1111c88b6230f8703e480001d90b0922440014a16c080062c71c00320c024021298c00e14f8786852010b5ca007273e60e049067ed000101be0400782f0801050903e30041149451871841212492811450a089698c2441321a0e2c41322a832022e24e00285951298208a2b524c71022c28a0228b96145461056b8b55c10abab0a0052ef0f2822b60f02506329801182c6850833036c8420b315bdc00075ce440075d8cd9010f7a40c6075ec0a0085ea46006647cf18508cdb1b2d816038c18a0391383edc84383a6058434dd1c5010a610c2144398424dfc9e623bf280d48421c61a22905104366c8c80023350d01c121d003913f7fc0c349a8aedc81382edffbcbbd44760e25e8b065e6ec6681acd0a2a9d8d4646d82970ee354cf1e30e368acd6486baa041ee5c6ea520e9f2c6f235d628ce2bef85379bd9a5d54adbe115e5c53f4cdf8f6b24da26f4c7184f6cc4ec13a330334f57be6c6971e32736b26d45763f28658512cafd341b975b5ab0b899d4dc3b819d382eb7a8207333a939fc24b7119952ae5cfab5d60a83c08cfba05c4c3e775509238c4d0051e13b0fd14810d77bc862527d236a5871f1f9ad2c665ccf008e356e8544475c6fc4c52d2d52ae3bd6455785a19e5aa0365498397aa4cf4e9c2e4018c3aa7249154ee95300abca71992ec330f646607f3d275d6f44cf8acbe5569619780672dc2738aec7ea3e3b2b2e53f2c7872eac2e2ee97a234c2b2e535e8f1d8d6175714944f01a2b2ef38da02b2e35be3c42002b2304b0e2329f81a8c33299f4a1fe939e7b82dfa2a28c0bb9ee3694eb5d067aee131c1766c0ff897f7d6e6551e2424e759bc61d6843764d91fe94dd3397732be7c3137a9df01a400c1f12c146d7ffd3e1c3937a4f495c4ccff3fc39b21c3852e0726ee619d4727034f48fbfc66551b2aba41ccfa57fe37ce8ee4ae1f44e3a4b4f52921176e79fa42eea6ddc7823542b2e393aafa45ae5e88cf855ca49af71717c0d6c64df9f0636c2c9d179ff1e6c847a7f2336da31b271e3fd89d828f5fe436ca4bdbf0c6c44df5f888d70a4f0fe31b0d1f5fe30b0d1093e0298873fcb3dfe82d3887127fa091701ac1247204930a1a0566a092e1360516453f099939fe0b27c08085603c702614f589090729092702c0a94947494947270a8983205e553a8e8e464a95265c756b182d2d172e58a8d7a05cb0e2a055ab4dc885ab4741597e543ddc5bdeef17597cf52dc385c0e2e057fb4eed25e76aeb8145787cba2a45ae5f81c2e8b52d12ac7a37672bcc5e952dc0ff56a7f83fbc15eed6d703fa4aed665c9d1a57ca86bcf594873e2f8b5eed15ffa0bd75e749929c678f9e2f266468231cf5034b57501014b93054113c23604939a5318560c9c3172d6e8100145c64e116cb0b95146ca0838cc48a10dcf193d68e44803004b3a8ef048e092d0b95141093e4b5881092ca8b1a3099e137e9ed0c21b17a0001485202de37a8d1790787c4035040c44c490148022848c90e188212522248a9210801246517a48f101821996a0614a0d4cfc68e28660a5659c5359e28007408049042430811d28f0f1d0a40216b8400f4eb48ccbe183967100d0f15ca742c6f9acc0c20eefa7051780825ee0a182218600a4e04fc611a5e04f2bd12af858005e1768292058620a134d84808a134f88a0ca084800455f56503b366ea470a4c0a3754f0e00e878ae53c167051676783f2db80014f48206796430bcb9450a7004871c746025400903963ce0f4191309ec7003464a2d1fb8b9f1db4d12fdc6936ebcbd61c05f08cb8d885fd9f9161cc4dda37dca852663a1b12c34f6eb315ebe7801c342d73da0b6e25e63c9819959b3f206199b3669d49029c30517ebcfa8cbdfdddddddd9d7499bf9e72f9bbbbbfb02c302c333333ab847cb2242ab00e615be9ce5255f4802caa072e719d495b2439b0ddac0307edc0b6bfd690db4d9d921d28c04154c067ee8310c228a6704cdce32a9a2fbb13c99ab3b8dcaa8114174917d0e8728b0645b8df93fee17dc5bdf831e6e08bbfd09cb153c2c47b00eb470e488c50763c43a05cd931ec326474c0542cd70805764f91996e9c6526471cacb9b03f26b37151046cb9c69c1c841f23f47fef7e4ca609134e3772728c5d67047645e017795d6ebcf1c890df6fd2438c8da414575f5ff97a4bf401e243dcc2410eeab54959acb9f4db1fbebc2c1f8ad63e8dfedec55a5950d8f89dad515e91559fcbad1b68b90f74b9b54515770b28dccc371de8eb40b92dcc5ce7764424a4d5c5714bcc9bebdc0b9737c88a7f842d1417227ab3c9c4a0b91c74b985032bee31e7b8dc1203e67ab7f77b478d83f8fb0519a440aa2ccad0f70a7fe8c3a24bbf222095900fc518ad54baa63bd63ae9533af4558d7e11a5944a89e2c657e243403ec4ad2cb05cfa2a1fa297b2ec8d83e0ea79d321ae6a17841094d5482dcd02c39f2fe7f2634d94f2b672e1bb0dc05cf851cc96dbef3fe5cab9ca4dc4cdc29d392c29acfc8d83e0570eae1c00360589b0fed960c7ba62a556395f39c7ed3fe94b7903336e8c5db5eecd871caa755c6edd60cce54de320f8504628e5363948ce8d524a4ddd6990f3f92c286c57ad8cd7fbcd72754108b1aadd749765642ca5853dbb2453ec97f2ae04720f482554e444dacbffd1e3444b525c0f0b487347dccbc13df99c42b2856df3a5964035b503f24e5f52fa18770379f563f46e0722d7f8a7650fdb8a7bfc45d248c96ae40e94ae944e95546e86a43037bbc262a5e08f3cc22253e68c7497594cb9f4bdeb2aaf70b96583316ee65928ddcad1db57ae0809d10a24c47c3907351032cfab1752fade1b4bff7b1fef8b5bb9799de3811cb4e6d6af5d45f2045b2be5960dc6dcca5db7b1602952847e11222c176358d3a4fc0a89bc2f957529f8239f6582a553994c6bcddaef6a8578ac1f58967bf3bf1ecb1d813ff3594fd83bad0f5d4feb6b3ce6722b0c1bfada111f9a2c26076d075aee7cabddc964eefcde6e9821a906b71f880fcd9014e64e1b78b9f38bf8906c1e6ae69a96414dcb9cb9dda5e913c2a5dca23bc7284d9f1027de86f8a99bd3b439d1ee13d3e684c7b84f4cdf57e34ea72d08a669bf853933afebdb8260af09c9be8f9a6abc098998c9b76fcef41b8699e076e4a4e99cd414b73771bc717cb32d08f6da67dbd1d741b2efcebeb9eba536398cfbea47ffea2a3666fed5e24c6b5a58811ed01413e5cee9fe50459f7dfac81102b877840b4ac6f987534a1f86cb2d2cae5c0723c6fd54aa22eec9a3ee80b827e50f25fbd92ba5122ede5c296536b54e81e585f5da9452cab1a0f0faed7683fff53eae0ce55ee55bb4f5534e08daafaff84d92844dd5970fc446d9cca80a975b58f8e0f636248ac1e50371a39f4f5f94c300c9819babd21e54edc97d5d3f792eb7b028e2f626392882d1c19def123b42b60e5855521cf43d91cfdb0d957bf766ad1565efed343238e54a29bfc8c7952fe59194fdc589769ebfc3f81013a1c69071229d33699ce8c6f3f71a364e64e3f97bc987d8b449a3864c1931ee311714cc0dcefa8f7c1b5c8fffc8df4171450ec47fe4d300cbe571b985859bdbdb510f1c243f83d03d39c4adf622bfbf84b952c6332c1be94e029184a4c4462cdf091bcd97df44b249d3a6db1839df276bda3cc1c2ff54f087b7171fe24b0404d01be94957ca06e38cfd6753a8eb25aa6b2b40582fb96c35aefc5e235fd6cecb950f0424d279f9fd4587eb2ffec3395bb6c2723a9ceeab9f6d3297cf5cfefaca95fc971abd74f9a9fcc93ec5e41996ee7e1f405845f868ee228c165b4c1f14bffed63b56150b9f85bbc1c9411e7dc32084d424ad4391a1509facd5da54eadff35473b286b0107e26bfcae3a4a1701f66f26794905297cd1443c18f5faadcf9d32794d8f1888ca38fe75ea7b49e5a2707e97cec8a17f7c46fac335e6cc618dfb5940f7ddd13671161e57f3e777e8f13f14b3bad13c555cf8c7bfca7a9cfed946629e7d5bfae7a03fcd96ba6c8cfa4111efc5b0645973b1ebc834ec4df7fc80f0de54291d117e3050b951824b959f3a5cce93ab1b2ed48fcec7483c641d83d76cfb40de1f720fe0366725abbe1102d0684f0ad9583f87170802b9ca323f373b61c2cfc49a572b62042f8e2e020ff231c1cc44f371c7ca5435ccd8ee1cfa9efdcea36c47550413a1b0ebdd2899ac7eb1db509b9ea9fdeb41d5d1d8b8a85bf6dbc1dd58e4505251fb5e9105792caf79b45764108b18a1d14023a6522eb353ed4f62f17852173660949a9ca152ddee50b737199532a27802f01624ab36123eea233eb43a8f93fdedcf940a6853f3349082651ad421ead6d73e7a3666b076bee9c1c661b32a55cb9d7e54e3bfef9ac068ec9ba4bcb622ba0e2ffa9d477d6d3b21891af6265351f2fddf9d1e7d121ae520fe566f171fbfe8099ca02476e773c365e07e7f499b448742173a10c9062b0f445cb3dc30ac6023532154a8b95db5728ddee9ef84d9dd658c19a1be3a738863f7635375608acbf7d7f1ce2a45a6f068074c3c11d6ad78643afaeede80811a9c7361de22a653fc3d150512c122dd872a3ca22d1535229d467d53dd497caa34dedc9a5502ee59a68d7d4f515cd63e73b09f5d26aeea150dcd7739ba9d8e81e0ad555f7be26ff59d6dacecee770be1de57cd694be10beb4e3a95a735b367fe7330eca9da89ddf763cfbd5fe89fb8aaedde97c8050f66393a2db6fbbe89eceb3cefff0de8e6c7441745690c49b4ec7a262af4c4c6bf1a1ea9e6433b514c77ac2b2e2771735b8a8b999a675cfdfb2d9dd5d392742dcfabdfdc6a5dc8bcf3263af6f245703be004c8c2d17a8b9f19b4afc4c889daba8ed347d945c45944e2a421ae5a59f9383035590289ed2e264dab40cbb2a9d3242ef33d2dc4f8b31ba00763bcf19bb591da58a2851a224a1944494250c60c0922552b24cf6f5026137840d9b9f9b33f27b0c1c43e1fe17f347937f72fc1c4f1885b80f3aa137f64f277dc44925b4784594327ab9228a762178d98efab38ca9945232d71fa394f1bfa4a9926683f47edba3b289633f6a5f73627761751382fde933de8e268642713daf53e45e5fe97634619683d360acd44ef2c46d47ded532d6f485fb8af893a39856bfbed9cbec66f235b91d651188a814af54ea2b9a47ffb51d49da03afb58b36b0ee5abc4231c64b48ff753d944bb92fce8772a9ec62809121bb1fe114b1bf38a0fb5d2f2f2461506fb32baa7c0832a07bf4bd584dcc5e887fd6650fe5f6f5b25e4ffcd28e01308a561a3745d88aa395c6cd999610cab4d2ac6901618c0f333333ea6eddc52e8913ffc5baf2225fa3b5a54b860515e572cb8a375620e1dab8dcb2228d04e49417dff941b915c9106ca55ee9ec2d5a9f4143d47f7efb997ba4fec3c0ed4f0357fb8ed06c3f9675776b1d1007f5e4725cca7d41d72facbb7ee31ea9e7e8da95ea1e3dcdc37f7e06bbd65a7bba4710f3f00f226fed8038c89f763caeffd773bde32395f41246d36ae47c7811fdaf684acfe283165ddddd92eb49b9b15f642d31d68e0e6117e3ff8013c9126c7767596f42fc4a8ec749dff8f77dccd8cff31ac64d08652561fbd60c084af13d46df8a301a2d1fda783f6badcb9f3308bd5142c901751e07215142dd52615f49d9ec3efa526cdfe632bfbbfbea50f33f94d5b0af4755d5e332787c1ae93bed5093e5c6ca8ee11beef6715434040bbf37239de79ed481853e1104b67b5e73eff3bc5a236482edcdb2740005332c33d07d6ed41e8b19f7fdaa7a5b4564a78a2faab80ea154f7a520e21963bca2b9e24b177ec6ea62c3f8d0e74917fa900f35b75a539cca85ef4968ba403fd3e66651630fe33f4d340f0a960a79da55ae775f105a6e7c0f7cb9b1fbaefaac272cf4284ee461e00f7ce84a562e742c177ebee542f772e17bf630ae321ee36c5a8c93b9f08b97d951da7dbde54230fe03cf5cd8e4ce471d41da0475e94724f7e01f817bb852f7121bcdafcdf066c341f15da97b7419cc233e6c336e947fb9ac990c975b32107333aab15650abb529a77295fc073efbd713690fed522c27ece74a5bb051ec584b58772dee75cca4165d064db80ca3907ee3decc2857b99aba5f4a8d1b833495d6959b41f686d1b4051bf9922645d660facc95a8f1141b85a0723ff8aec53dfef9b5893095ffc06f0e08769e7b49b032c2cd08aadd4a1fec925a2eff6449e96616556280aa563df994cde58d0865732b6573a6cb75755576d4b5b405aa64ba5c7f0dd5cdd0cf30b165cdc2e5564bcde58dcc6c42c6483c67677bb8638dc0c297b44e02c4d3c79329db22e7e3687645ee359b8ce5048bd52ae98c7163a38d4e2952fc99a4ed0ec58db758e443cc19a498f95c02184b9c9d22180773c5dc762f952f2cd7bb7817227de7a40f37231d0f7d89bab5b1b8e7473d67cb2eb6d61d3983ed0cabc669b2093094180c2c9863e4ee6ed5e759ffea4e58f86054b9bd1db51635a82af2c117c218dddd1d0c22228721c34c187733646e8cce71e699bb9bb9023b2253e3dd9b11544fca27762c12d87e4ea3c48776debfb1f850cf2b4b5039d6f4ec4438885278ecd989789ea76b2d29e0e852db7fa91bdde779b2fb54372e71cf773a25ee39a33a9dee5379dea9fb9e3b8ca586adff719a5a299c3d4436dec7464cc2ce2733e6ab4a96a4a131be192aecf530946297314ec344c91236310e71cb4c14d7517e99f9c24d9925334997b7231ffadd7a8fb9e2559d234777f75ac685afc1771f18a3e029cc9dd2dcf3ae67f3b8634561f9f64ba11e20d189a7dd0c4057a7ee08c772cf9fa5a2cccc3ed8c8f4fe45b0ec894eff798fedeb03758fad3bd23cd868037a723d733db8e75717445e53170407f9fb1fa14990acf61f2f69aab9b45d79cd79a2277a4549a21a106472e8e189f3129929e5cae529e54a1931aebf895de5dafe4780c8a187276f5469ee948b0a35ec2302cb5f51d1f5ce7eebfcea7d32f016d71f462124ece7d3f3952af9101346abf40b7abd564a6917f97cb116f910d38339843c7a0ee20ec51d6b0adbb293526ef29913929d2a899da5bcb85e3ce54f869e4fe4397dbab8945239797a2a2166201f8265b8289382cb5b9830f163849a7bde5354944a3d915ed11b1b7f138a5d51ec585258f86e03301cc4ff15c5186311243abd3f139692253f64ed7f4884d3edf0f323e7b33380af4e5d11ec3e5bbb2bc910d6f45f9189cbb8afdff00471f8b13ad129d573ba2212767efc4f55244463918fa2d83cc4bfaeabe3a95254ae01f7a98a688c53462923b389453ec4c4b8431928ae7f13242c8a6c9511c5e5cd8875cf51cf413efee3ef233920f958c7ba627daa7c4f0868832f61e79384085b31ee9a14beccde639447f85431d5c7f3e9d8f15c9d93be4edce973d93d662963f4587d3c959452caffe165a65cf72d3818dccbab1284e4a0a49fa5c43d96eea9ee9ebd550e328ae87a20d5452f0b049f065524d4834a390f940a9539e2fafb1853bb0951453da8d417ad712b3d41c4a16395c04638e79c4b605b9952df29331b80aeb08f5fbd955e58a7823ffe49a2d8cfbb8ebd8f0ff1cb6a3ca0254cbc4d13ae5fd1a245e624b96359b17cf9e38c400850e488b330aec87ffc85dcf3674ee59e6bdc1b9e20cf3789124044d8f56c54dfdf8b1c4b8a4d5deeee3ea64d17646ec692ddf441799612967ee5e7a17a141eeacf9014e6f2466486a430b72af177736be456838dfa421974b9bc1db106846af500c95fb8dce2011437839ae476b07433ceda217734753c436e04f262e9faab6af42d7ee0c67f80e5eeb8dcf2c19b9bc12ffe72cb0b32378b5e70d1a54b9bfb35e936b7dfb57817d6076cffe75a7ccbe5f72e4dd82f4e2fae0cd16edf762d2e771b27e223dcd47b4ec4457c84b564871e804072a24652b25d88380c174ec4ab5eb16d354ec4aba1197ba9975a3e1873b9e5831fdcc8237fdeebc6f72851cc8deec1cf9522d1afe2f73c07bc1db17bdf37841d1a3f208343c4602000ca2abe07e41721bb236a58c58f9d97e168180630702c0775b95f45438ba7804695fbf95c5f22f6b773613f1f1f59398efbe2653494ce50e38c24589c33da58912589820504aba5a1461a6cd2e0220d354a80b9dc5ada72f9270ab6cb4b562eb796a2b4968cb848b7bb274b6ba29a34b260c21299d61217b12394d72769c27e7f61c5b086dafb86035d9d3a4e02c6c6ac6e47a688e2b6ed356d9ab8be04a8dc4aa3cb850fc487e085ef03f9d23c9691b19f5efe151c9ced5fb290ac94ffe33f0bfbd9af916223751f0aa9a56c257924b1797d2abef53edac7e1e82a7b4884f3f17ddcb3a6d495917e0e959476f28d9cba7aa40713998d8c543271d763f527f625fbb81d65a7e7e1f4f5a1dcbb99fe64dafe8743b91bd744bb1af692fbe2c5b0a65734c7b06c74557da87e29954ad571145c75045ada49d5a7bad98bb1f25550553fd6eef3b9b1bbdc68b2f199ae549068fba8baee36fbfe53ffc9f66f9dbf09a849d1adcfded51d94201167dd97ba6654ddca5d5125d458b6dcaeb75653955feb51cd5e5a94f63146a2ede337e5549c5011e783fb01846b2c9c962b5bd84f75e3f5ad71f2b3abd3aefd54d7cf29e5c569421f5fcaed88f60ca369f9786b9675550bebdf31661fb318b32cd33ecbb2aca35cedb3e74cebaa9c73c624a212c05cfe0a26f3b9f5596e46b65cfe5a69965db0fb9a702c232c7fecaa7b5d4a8cfd2258ab7bddbe3dff44712519748fbede936aeebe94849ef5ad9dc791b3289fd232834ccb8c302d23bc699911838b32a30b904a08853d8544ff6fafae2b0b7e112452e23f6bb0ee086f15fe0ad2ee887b9e83ec6243c805d2ffb4083f6ef121a7b917bb3ab3389d4b7dd5a39c5dbc4788f4b31e366a89040c4be1f3b8d7eaee5eab76bdf5a18c62f36bcff46bd60e769e3544835dff4fe7f2e3708fda3cfcb95db3dd4393753ee59ab3eee508e217763aaebfec083fdf12df79c0a6cd15badc62f3e5c296b07f7e7777c38673567864999b63ec7a1c0885f2fee1202f63256197883eeef57ccfd1bbe7908503fb7940a7cbad32902e65736b1791bb330c1601a9423823572ece192b2402af1aa5912f11423aa9a6c14cdb7cc82e6da331a31f33396146b76b72d94308b16cced7306d42fa7dc950c3b742ad290c321c6ce4a4ef0f7db31c1cfbbcca3c835083518317195e56fc55bb24a49ad62fb36e6d4bc2d1f94cea70d1360d07c7b4e570bdc2d1bec2cdc87cedb7ed08d32c9764250ec5915cb6aa5d7203d772260d425b5b9374c3de725cb4cf3296a7cf20a52729a5849a9c9993769363583e8f9a1932a640876e620e8a7c5b6604e152de8a301a4398d053caece5f3cc5935ec79ce096bcdfea259f6db963d9daeb1919cd3dfdd1d7b7f8bbae68c5a4f9896194bad36517cf021fe93ca90c8f473053f8bb3e766e2920c61fba92657b3c2caf18d70b571eefd3cdd52e37c55b91faa93209090eefc0cfb1863166346b15a63fc4b8b3b3c7ff68fbe63c3648d509ae62c634a3aa1cf197c84db9c53b66f493e80c4fdd853fad867708bd9a454831af614fb264a32fde9f97bb6e7b4215857631acb5e5c6ead41739bcb89c35efb3038047b0abbc8be6d1a36b32bc3ae8d085b6eb669b03d4268ba780539be58d59c4ef1905e50421861952cd7684139b6947f754f3cca2db6d4e5d61a2b2284f08a18ac5032817d4c35c3a9e3e3726b8c18ccedb30d334d88a3414ec88718ab3a279c2236ca79fe2cc7b669db86e8689487d26d6bea58f6a72d08fc4a397a21d7db910ef76d43e089833ce250ceaab1391cce5604fb8ad2205151cab144b9fe3eb26d0874c2c97b62a31ffcc2ce4934717d71b86ffbd8691bf6d84664767f6d43b6c7ba7a63831dca360f7f24616c198665db35b559449bbf991e87633f86126e864383edc48dd47bbd8665d01405cb46ad3524e0d71ac22c6a36301a174a230dbb2f8e20631f9ab3bbbd7bce88cd39d9486eddd9166476cf0c83700bd2d30629bbc8503cddf0aa713a1b49385b62b05ef36343cb417eb5d7007e2739c2f67fd508d6c6e5d61827b8f273ae846468854fe2ad446a67690e62bcb623b91dc9ae49ece05308a57cdf88c0cedec0f6a0e8864af55c6e89e1844bd95c88411869e59cf01a3c4468652466d8ed726b8c272084ee268a453b94b4625a0af1290ffdd33bfbf4e509de74a7a57ad8d8d850421e4c1c180f9a8c953b1e20c35aa7949473c26bb44941869367fd7ee63b84d0c884df04085144e647973eb8f02bb492b14fd6f974f4714f6add2fa3277d8851e64aa02b9fa5fc232c5b542ac6ca041b3b289d88c3547e3ce588ddd2de2823e47c8050cee884d7a8dd171f12911f7b3694924908a3cb009f7f4c2b05c1e48afc274ef42bd94945a25cf947c0f0405b9b4afdab52f0c73d69d43de0f758d30fb6938ea2e69edc8e628e9be220a97dd6198fd1f552fba9695ac742826bac23408db5c44a8385c6d45867d0ab6aac369e0f7d9fcfdc92dc832c33b4ad792034693e1435356b52da8d6d07f774349611688f0f7d9aa799eefb5cdf6fb31b548c256e8669362eb7c458737b333279a0afcdd7beb71b7ce8cb5ed334fa3cb3be48c0b0383456193c2936caee4b26d8e556186a6ec6a3b1d8d81c3945b05f275df92c326edc27eee343f0777820276ae23fdb11ec9810c1668fd26183b5c6cacbad30c6dcec7568ac3174682c3152ac3052e034969a1e6f3b8a8fc48cc5fee335dc0a63cb95bf830f452972248b0b39ec722b0c301772f3662b68ac21642c682c21743b3456106cf63e9ef63ec405befc1ecab3e6887b140182837b30611e6c045f8ec1410e3cdd0a894e9d0770fe64bb2070de1289d97b2d6856c3c230c2cd80741a4ee9384ca6fa1ad7c3419dbd077072c0e9b8cc3f7d920f653e3465b605d13a7a4d3e64ff646ad334fd66d73604727390bb7f0d73a4d8a8e7663d39b62326489260b31c5a8a8d725cf97c51975b613ce142274799cf76581d42d3fc2c3a8cd034bb76596c27516cc4f76797e5f431015c603f16a6aea8d46c1aa872e814c9080000004315000020100a070422a16030cd43796e0f14800d859644644e9e0724490ec32016860c83060800800800000844d33612dc812e86c086694ab98f852db23941376fac464705ba095040d5b851e52c5242ec9a7aa39dbd70a6c3be4eb3698018e82da4857ab1ec77303819924c419e13c4fb8041e206c1abb44b59eeace894f59d2e91f51514aee42be8e048b0c3be04f3daf2830ebe38645f05a5575e852fa975e13361820a14735fd0ebb4ceb60cb4d49f661242b3d77a8b3a8d7434da7078cc15a165026eef548583ebbde6bb6418f8344bc3b3a6252497cfaa01011aedb12cb9e94120d997f392a234f738544f467ef8f571e954dea3f046d6a15e9409c63d89bdcc9eaae08aa30360b751bd090122b5ac066d23c3695af2f172e08c843cd304d66d037c61827a077bfe0441d002ede5267b676e42fade4717deaeaa37025b5d9ce48772a07655ff10c25b0d6fd4454bc6a78bd077c6365e16efb4c6e060272b6b63eb589edd26533f20774244bfaecf825bce795dcd5883e30005fd0ec8ab4148427a2b7387f34700a340e9ab24fe7ec1d5543f90379c672e10d313be7e9d128d06f5e413901bd8523c86369eee56464507d7e5c782676d31e02403cfacdb78434f2d8126657078383dc3052b9b35833a31bed312c0f25780721416d5defc8019f2545d3d3af75c636b0de0062381e065fff8b215416bb492ad50d4e8da7e3c522ee24567a8ed8f864eff783652302060c48d4811844d83a97d92c7ec6f6868a53b880835572cfc41355b21ab5f8f1c7f1f4bbbc3507f15827c432873c83e8b411cf67151316533b1bb5776e0e87d7a8ff485b15aa29d561584fcde6f8f3e99a683e7b175249474fd02ec2352f7f9d2e9d5362024dba136ab9c7e88a624bf61d1d00c4cea29efc620f2ec42e0f1c71c68d09b5c3554b7a699283993f85484f2a5d82ba5951b55823f96ced225cfcf6022300533bf1c65d65aa0afa42162430f0a97c1952de4a4fb7ac8fd4583af030b300d4fd65a4f4eb6c1c6e6cadcc222e30f2113c3b278f725f8b5c480663e796d9ea27a38b9e48e95ebc24f4772b91af245b49765701bcbf5e0aed2da26c0f074556265fe15f94122d1cd8c500b3c78d0e1a0407212ed26db7561fb1532d55692447601856d278dd8953139f8732c3212dde20c7b0a06c124d08f87f34741e1f26a0e70ab4953e6b876f2976013a71e371a241e9db8aee387fc74f4874bd8d0e603736dfdc9b3c6a7b05016fe65d388a00ef711f8e6cb019e8d2b755eeaaadba78d7ef2f969335a3be22abaaee1735f8f30de20b1df3f949276db6f2dd5913b7e1616116bc798e241c0944841ceb9f26b1ff7fff4041d12820d7bb045ab877d368891745f65a1f3c4168b979b671b15de8933d8324d105d102aac6c58cdb51eeaf92739784ac4c4944ae544ed32343e2164eec9e3691b271a910249de0ba866560501f034493fd70f4b16120ad21aa4b9c15822699684b4d1eff1b306c01035dd2c96c035d63e260d58f42ba8494470239155847e0ef1a6d451ad282a2c288ddba9b6872e4a81e43494bf2b188289980857aab6abba9c9dd910c23ca68359953e23a14f69ba34e8239ee36ab144a8cf0120b5570e42d40ed05c5010611a42144277c482557c3e5a36c84cf0cca4e2d84eae57820a8a7c1ae48841f9c49f742c4a011d7397d5c3c378781d99ed57a9770fe47eda7bad8763ad9de8a330e653630c77211308ead976a547cc88a44658207d1b5ec525e00efdf1ee61c57dbb4320ab9171525d9da613c8701d733209054fb77e29215d60872d027c5d19f6aefbf2ce879acd7578a28a2f8525b5e34125541d4020af429868012515b8ce137a43e847516a693f89bbe5970fedc0eb47675c6bc3105e03e2c4597cae0d628e4aabf07b251b772acdd4c00cb66c0d5a0a18b97ebe289c248e21d41bb9c74f6707df38495ca53d3f2bf3b4ca3976a5f013434d1b38e6ed8a92f584d4bc319dc844e6d27db8d38ce3999910fe4470b385813582682667001edd045c17ba0cb7c002c869f22fd14bfa62a0085089a74aa99e9077daf63f1e7f61d3f291a3e991a26824f3daf2483c30200d3a7301147a977b447294a56da73869fee73d00fe5d718e2b16801644d2074cbcab3a4199f634f37510d004860b0bde6cbfabb51982cb945ab56d265438ab724ff1e796a03a300be5da5bd8dcaa4fd8b4df459a1a191c4356ab8128ec5def547355115e91211c8f9aafde37c83a75d114c4b7e43d4553cf2320ba9620a567fb0923cf3f018e3f85388f26e80334e39b14dbd27342503406c188166436b848e58241ca8ea33ba28f3c967148187750f77339129df1415aff44b0fad44d92cbe5aa365836604976125c8c680644dc18390f4661c63129ee2da7820445d2676ebefa8419358f7e3503449addd3ba5fb6027f253bf26487ba60e3fb57a5aa75fab4dc67c403a5f190aadc85e8e6e7d754d87d80804a1bea9d0d98c2824ba9f9f773de903730ba6ef0425d55ed75002889283e4b13feae70f6b13f1fb1d6f329ae30cf773db2b358a6f95198cbe95c47ce4c5b338400700168885ae4086026707a37053d36058025c0c73ad0d437136ea0c87cd6ea45cf2a4b7a4fdef4f0d426158b8e7445ed771d21ee015c04843f37c42b14df2dc22ca6c45f6bbaeb28686b8e4452326369e393906338bdeca2fb07f9e7365836c2792d7132838371b90f742e58a14e75cbccd011457f2c0b5f1445074ccfdac682084a54c776906921e7e9b755a46b10b23be13c0f248b7d33e1da9867c495ffe808801b562f73c4a4c7a6457a3e4990398f2b775318666dc14f31ec2d07514a24918a05a137b49b020ec80f925f7b4074e00461b81eeefb5e9acfefb10e7d810da758978cf868a2c7e15ed9c45cb24929d41385a854864a236884631111c136e419e1d3f3d2313b176675ae96fae48cb2ca1b4c67c5f76b1377fd9bb7abd7ae013c4bf915c301184a77726495c49ebeadab10afc91ceb9461849de3c709761479b02207a10e8452dcfd7f0d6c2a9da3794597483217b363e06b2d5f07f6d48fd626dfbc070920a473e43ec66bf7c268ca362d05801718437310971f8c9b3f0d0a976fb0e7742041eb4a57a55cf492166a9334ae76e91ce007a039aea9b3c3e5486f6a78db58dc1c75200c397b0495cc43308732c622ae4c58251f046b38eabf1e4b0debed4b7c51164f91eaec6cf372ed18b1015ef2de7e22df8cc61beacf42804a9cc8bf8032a917cd77a263a6ef40601d05e91ad031a3a650cca8f6d438ec85a69b8db46c59ec51eba214887245a3a5653048f2b928bbcc0584c32993b27858870aeba030c365028a7002890dc51a09656f0715ae4c49e14fb779695f39b8d8f0c0d4441024dbbd5fe57aa67c58265321d9b991ac42c360a2feca4ba2dc1f2464c80b6903d874e28b67eac603f43f98cfc584b0330a40971942c98f50fe6eaac9188de07a8789035fa818f6e09fe314e541a2846bf51105a2245a84ce74494774891bc0fe460af1be5e43c2e4c1f923a1313842ef89ed1afec0ab3e91278e3fcd6ed8d181274f5a7e516f8f49dc16c11a5e2232c715374258793d1d39d9ab9f8a3bfb03b76547471ae2a2a449ae2efd17e5166158829c09418dec527db721c215426aeb25f99f47f1b4a71f9c8779c9f05e5bc8e19120972438151f56f3f7198514743b35c63ab38ab9be64c4e76d5972f729f2e51179489e16d9035e93c537a81f137eb0253bd1ff8191ef8c98d487dca025e0fc7dd225bda045b5f658e78f3980c6a26c3226a8be7ca0b3c8c31156ecc19ea29e74c97f9aeab5c99c09a41ea60c8f4638ffc3b7f4c648b07294ded1bff5d677ea686dc14b556952957a188c7660a8390dcb4f47401ffaa87a5439c9029171a7a06e934cfce3771fcc98437e4e969e95fa3efcfb4e7014ef78bbe0891e44df6f482e806a1362d4e8ddb02599c820b5ed0590eb9f4470d4af1200c0594e62bd013c62824050df3eea61860412c3d5cbb6e6be75a2fdc22a9f09da1b2c39195e6a76ec36a2e69cc4b917055aa2b64c1ee86be36bbbc800a120d805e5b43adbb60227a6003dc605662a0a9f6c4d71c83b2fcdc4d63e494922ae23bd947e14e181b8bca28ee3a9537ce2bceb4868043d2032dd531663aae33f6fbd02f426c3d142ac86c8653d17cd5adde09b2b45756a757843dd0ca5b1cd112f058abc9c4f01d12b6f46a0ec61c969f4846812c4f05002023b282ad37980675063b5be00c2267007411ea23c225fe648425da787d5ddd24add73882c06cb56ad5c87548e00a5d46f5ce1f1055b2924a4949ebf83fd6f298c0515f658d3046c370cf1477caf866dd884cd8f89c52d75ee033d680fe1e050e226bf47c04c6def9c11a830857d9bca48aaaa49570ec9cf87d8e41ef5510273155fb378a59c9d613b85ab6f65fa04144186bb552d1bed52b015ca468bfa572dfdaa573c2c1f9bec698a10c3440c12095f4292114d2e1bedc8c15917ddfd0a2f346e7c1a103973a8021e4941b70803b62e0b028058d1f46eb25a32928ce25e816f68eb167900be53f830f747f2c58a7f59e4c3c76b51e026a310faf8145e4562e4b989c0b9a525d8c31c4cb17d45ac88213445a7af1452218d59f6d8b7880f0bf69af24f459f28f25d6bf9677dd04cc6f132d9920c11b1dded924400d574150d0c42443ce7f3a9846a277bb2831d6895f77fd3216ee81ded95d5055b46b2897a7a0fed828813354f4b95c512d88957870bbdb4d99340cd00f8e8618a881374254c05e5b688920a74a5600a76eefe4aa3b0f914d38932d8600619052510b1ad540e502b9f740c220a081f13301e80816f9e394263130d8eae64eb5eaab694ea76c34275d9500f93ff5c4eac7f3ce1203ab30ba718b29e016de95c5533a1dcb1970b468af10b56249414ab51b8b65c9255dc9cb68ca5e89a654b694f30b80de347b5acc761f9b4864705c85b4b5af3d29c57e62d66417671a1713084aefb6aa140bc6b6b825a012a15bf4480f34299efd965218d4e87784c60e280230170dca481f0f7d27b26de497a370368d08a980310edf5dad0523514b9bd7ed6ddaadf041ba01353d489067275be6eace19d28f33ff09ab59e2d1d8ff6660d4f3a1390327053ba17e683e42dc8c71e3d3880ecb8581ba34b0b01a96086ca87b71d81a6ff54287485528a18fe08e323e41988a8395c3c4c057733dc03863eb6c006c2c608a1baa778b8607d2aaf4042fc740e6f318eafbb1aef4bbd6a9c2a227b6c33d2099b191f23cca56ae16ef113016cafd7bb8d152c46613625446ca1c0bf1cd56e7962f4a6cfc0c80d75fb5a6ba8e306a85f446a9b8db83d166ca3a3afa7cf5f3a933613c5c545ae8508098ce4517d375c518a1c30ed75041dbb20f4c3a35c06b9f38f1fc5ed45cc87fb00fd3f38825595f74c67d253dafff80a563d85c3522c35b458acb3833128871631eb656f8e66e416e5a538dd47837698be5b6fc5097ee01920f7fedb0ff3812bc290e7ee5d42cd5a69904612ca4b5540b09f2509d84319f00e4a98d50cb326da46f8a818dbdc71ca7a782746f6565f4ab989df47b5435adcf0221cdede56633285166149c2e934141342c73cad36e817966995225270f134a849ea7285b99ed3b25b710a4ccd45b75dad2211309b8288a266547c28c19e86c18baf4bf5eda0d40c56bc1128ad74a69015cf5df7dd8317efd5e42bc9bd240bcfbe9d3aacbbb1248272d2381db5d58ec5d380ffb12e6338afa50f36816dac641c1e1db62d4f9b27869b91b06615f9018453d0150c20581dfe10cda857dc1ed03fc5d419d6b328f04c1cba4c0309301335a97ffbe9cba91a115e8ce4ce7e93e8893fe53ce5953286446f6fd4818ed50809def633e9df59b2bc92f2c230b36451e5aa23278c41a8ad9b345ef1d0fbfb733ddbabbf8f2f81f19fa22e29c1fcd17ec0ffd9955fa8c315a4a15daa8723f9f3d05d8a7076bccae41ff00288a10a718c804434ca699d1b1a16857ed65bf7a62d84d9e163cc1cdae5c9b86f292895a2887c63dc7b7411edbc2c90a19a56b23f9810023476dcdcba21d34afe3bf5ef4e6b0665e33ddfde948d32203c40cd79ec332f8d67ee21d143824c48197f1182b176a9d3e39dbc381ab124e3e1b5638ec26c4fb0763a5b990f7f80a57b5668269d3273fa6fe3911a86a57464cec7da6c91d0a4007c65ac1267d7c4d051d3638ff46bd4255f6b0063964c2db91e62806539d3eac9548008b861f4b7857174805521a435ecd208bd1e90de3ba0a6b7a1ee22920a2720f19b409516263b6688f6ec9b1b6230d0c449422fbe0f62b0272f6eedbf6eb7aa2b462fae7f3811c57288c4d8fb52db6f1900f9808248fd537b89633a6a7b4ceea0be9d2ee69b9442f0a71fe41204021ff0100edb47d8e61576ff15ce04e8d6d0d630814c591a5553f99eab7de0b8561ad1f0b6856bb33c39879d5bdb0c5c42e681160ba987abf36e53fb84e0ee8cb3cab1589adb9a7c05995b04b28245d47e01b0e9019a29c3bfc21b00c4e0abb40c484f7b251ac32301361bfdc9a2a6008683fd3f17f2bbe54fbcf2e546dffc61ffeed68bcd2c3d3c7479bef51796de36db28068983120bfe777d07e11956285f26ad0a643ccd7f028cc7ee957afe574c04b7eb06b15f044d13284d49273cd3d1258666e333280fd70659d19c996224c2a6e621896d0f1e2d9e811555bec5951baa2ce91a27e3edb7e116ff0da0a40188c6fa42e04edf100e9908c5404552d65c83e9d56ecb942dbe91b22f50ac0ff0d5554ba022b85f9c1cebcd61beeae17e56acf71516d68072ede173700d786d1cfc139b5173a8b60dc4f82b6568c61d6883e0314ceba6d839c6950d378260def4443f3563d306cebecf309f6bdb00493907ac23964a69e096259454593056862bc788fccdfd4814d0c42dd97e781b8021145cce3392bb8e7cd2031a6ff6d047cae1b419a9e20765000fca89317219e018b92046ad441e0f2c837dba71bcb6a8deceff546ff9c1782461d84eb337f29da129624c43d5a1344104d11737fa187cdd48f2735fda5faf2a1423d12a992a94b67f7a28b2ccb65801665ec63325405a7645c134160615481762a4bf318b5440204a7cfcde6e8a80404020ecc88db70f5b503857bf901195301298bb3b49bb3fd5c0012453302a18a637d80444911dfd1e348024a0fc028219e7614691523c9b5e83e4315bf7bf420bc04d1bf26ecc04fd79affbe3767ee605c7008057ee0cfbac35b720cce5bd33724dd509717818969686c9a48a6ae7b4d96b6637eb99e1a59c63ab7e98feb2e86252af79c1e3dcd2072f7d6a12c52289d2ffce47181dc35ae60a50d8b5f98a58402fc8e5324889d2bf820631623c3586985bf3508ca81b7df0848e04de97dcd5f80e92895b51cdbcc0e2ae8c477d4e8f0717d1fec88972e29063171216f87382f7024b3f5de25a3f5097c5fca96161e9d5c1bc9a8dc07a9529c277aab7b20c3621361c1a9370ef0b5d9d6760e0fcb6d10ecbca3d80a24f06118ca6e34aed17bd38319876eccc981c1b96a1ba1d9b9653006108e3a60d368785c05442ce9b97748ac0ba0167d16339fd9a24a1f45160341587785bb9b03236295a58267d075c398c01a074be62de63ab462006f870f729b26053497c70c41117b434aa4f376211da14d730a2d35467f744efdb772b62bed359096d22e91b7efcad4ff3510c321436e8d0cd319a158307d2b30ed3026203c1fca30935494bdb05aedd97912d823c80f49bf08dc5bd17e9bd482f8b7b2dd27bd1f44620592f82bc41e076f69e6ad84696f700ae469ec9b2b112e585bb8f1e3dcfac9ec1d9376464701ef1d16f7cf076e1303b279bf0108631646173980659d8f859ae10c8303d172f90f5b96acae6be165a5f36a57ffee4b43402d5047bbf88348f7031ba868620df0828b470edbb0778fbd3cba1244c2c7d6315973f7c6d10106d023716ad5741dc7bdf50e19f46513fb1caeda3c0c05994a85697980ef74b15f9a97ac8eb9e33d5598f7bd220404bfcd2a3db773f5657d61f538c55b1f8271c34f8e5f39eee5ca5fda91f4b60b609b4e46fd20060a80c6a22eb6307dd3e96d9a0d026eb1121ac0e2a22981b09064c9ba7f45043dc39aa30fec9d4eafb0cfbabb3d9dc3f6799e234239244ba9d9ef9d76e203b246a24eb0303facfdbeb58c4013bc0ce46fffd5d102958d9459cbead7712562bc8d75f1c4d8947ebd130813618f7120323864f3de8fbf0e7c5b514d71fe965d2b6b896541cacaa5c5c755831ed0f640c6305b329b25abb10978acbed53650785a0a0184b17d862a98c4e7745ff68c30ef7058fd3ef7359ed52413df9fd599cbd13ef45feccb5c9b26be0c3d39d0152ad7e3240c2c2a7f19b56d8202f00e5eec53c45e078decbeb41cefe492b0b214a29eab68cc2a24caef8de8cd855341db8b548ce4012c4f7d4e2ccae9a751671c31ba75dec84b08a18bc29e931bd8beff692d41636c1cdc57a2fd6dbe2de8bf65e84bd17483e0da16e00b512a93100078209c37ac554b3747d7f96a10072f0877073819d00d0d9c1a6a6147699f26dfa96feffb67ffc13651001d358129c6711b766caaac69168839c1fe8091b875b34e17d5e1a77d61f71960e19c444845909b5a01d8e7866454b67b91f2fad72c0eb46a2bff448337bdacd1ce589c24ea66a2a4044acfbdad6d7cb9ee5f1afb5e346d4deab12cc5dd19251715cfa01e143b8fb6a7feb4ac9dfe23b5fd10cb8fdcf755db74233b3936b6947bc0b6211a8549a683970e7f5ef7d463cf0f6f203fd82d22c6951306d1227453f2a6acd6a072701b00354d3946e341a6471ce5a02c638390118a106c8c58c13595c8296463b0f99165f152f5c3cc91ac03af1c3e9c0d68d9979af2d44dbf2d54e00b4b8934a00e7d7e69ee0934547e9548b5ec23668c2d9528170810c4a4a50ead1dcd2de8f478180260191466036cc032813d47721a27965276ac7fcfe9d533ceac4773254144bada95b6defba612d5acbdba1686ed2e540ddea5aaf98c6ba07e9029e139f98bbab1940602b962fb48fa9fc4558c46bb50fe50561485699a920fc6d0c52ba3f4b749b519213432e2ce97e1ae1af1eee56f50d0ef88f3892a5ede72e7ef8e64c01085c08cdee0a788af9f6f43d7bec9802ddba4bdadb86a173895c160c3f74be1f196e0e6c7cc6bef43dd98ba71c2cc9912af860de6db5f7c130c6d091c3994eb49c4cb0f827c7f82de81bcee76274e4736e9c70982b5c63491617083482f2344db18a4392b9c58a56ca00978c8165f55f9daa3298fd748a6d2fcbd6aea1178532221e78f0ac3fcaa02c39929e232ed91c10ddb4812ace00e47aff381a792c4182b7a028d156f7c75a68f0c1482ba9bf8fe1bc874f10691f04840985cdec19715f230f0dfdb473d6f61521d743ba4a8122cce9407ecf708e1438b394260ad21b678dcf76e607afde52f8aea64d6e4ac8a47d84db5c0155660e663928c8135e76fb06699a213ae6a6b927824cac0fee0864e81cbb0a916d8586b2f6614103edcebdc6c98c916d7b81f281060143c00ce50c0a28b8da368270741a250a94b113544968a5770b6c582fbe16520522b5fccf82a26c855c880f2038ca5ed0b2657bd373f42ce226ef2f96a95edaf00c4a029362800f5b666dc043566f7c27a169dff14d0456ef06a5abf36bb2434fd587095e4eb7f99a2ed51778c5eca37a070c3dff26ef0f4c31c468ec7b596fc00940c172f6274d4a82615f46ef949c261f56fa72f137e15213a751fbb6e086b1894c4b74cb1569a5ca5589286937de180a39192acee9e67402ed82962303ba3bd3ce2a066c198f387ceb7c91d52f06c38dceafcb2072944afa19c4dbbe5ce348d5f784974ed7ec59a1ad6aa7dcba31d6af975438de2c9c74e3a02db49557dddf4237633fbf72652d540ea6440f3698b23cc4079870622736d12762a2133951133d11133fb113c3f37389acf99a92fc554125ba76c95739052476bde00c1652f066417e5f1c8321bffeca24c04a05396a2ee8aaeaab17c92e748b5128ba10d8e2a3b56717ba961e55fcc9e1135c149cd289c513aa00adf767f0fca78f6db10f6ce64df83cf4d0edfffee443d89fdc2161a28586eca74e48c01f7b38dab53299ff9014b501aeee837fa49b7ea46b5ba1cda42973fff1c666492413f00f3524c5d3e94a3d97127783c86c4a85ec5b05f460b471ee19a29ee1696b7ca2a6141620def034aec59d4c202e3010d172cdf868205ed8951ea8709ed19c464318c52bdefc19289f6002f91468160e5e3983fd7009ae840ea256e4e4aa6db8d820b4cfb5341112acade6d2d85103dd5937457bd73d6b13829248a10d615c983ae39bc153461bd16ec6a736b06432b14ee4731089549ec0b08fd87130616f6e536ddf472d62bf5499e526816ebdc9077144d5e18d10909fcc308b0ce64d848944f9a5d4a2a7632234762d4523d5b0bf092a530cff673c33742eb948c62ba5d41542d759458d558c7c6ec500d50157516658ebcc666451b2cfeb385123b40fb4038b8323ece9238ba214ea7537ea216276622831129f6b3a5ce7f38821f69e340bb4779fa69c4305872ca4ae65168a5fb4111a714a1f6c84b443511eb3fbd7d41c64a0460453b5c82cf5c7616aa56a2562815bc6320f916bbc430c0e36fe79a6017f689343581bcc391ea238637176dc47ca9e55680e70dfc13bc4710965b3d6f11047bf9eb8edf7bcbc08de23a775e5c3e34ec3d5e473e057e11d259cff5d03964bd9f67604bf35dc9de6841f9d68e8874f83a3d4284a00c41ccd05bb82c03a0f65b5a3b90e57ccf36f3eb33d353ff2108a5f3e3308a638ced21b859f6f26205b93f4de62c79b9a5c09ed7f44fbadcac1605a0b77a6122965df368d02012cc0ba457c1b26c960ca100040dc599699476ef787c8b41c7298080fbfbb3d534acfc4ab40132e13df095522a837355f8f37362e88e2b47a09b66da8526d45095ee0ed537147585ca681472175e419be9eb43b4e97f40f7226da7caf72144a516a3c0fa7d1f18562cec090d5151d7c2c47e98a04f766c936c82fb3590fa065b2f34f6f6cd3ec4945fc96a50b80c56b7677fa7b5d8ff83b0892fc65166f3f3ef891847b6995a0ee4888648365f17c2937c9cf1a6854db3b0ca313c0d51acec610403aa62fa3ff29d7dcf611420ff428dfcf6e13b25f856aa62a30ff4989bb08a201faa62ab8926f62c4299beb46c838ffdea8677ab6ea80a87d3d4ae86ea1cf490a71ac97747374ffd63e2c347580aee29c41cd76c17f48be50721944c949cd4fe268943958caea1d59a4957dd3be5c7f0b95512a3c7e65013024c85144c5dbf33e001ac97b6b8ea38808f2a47cba0428a904540dbef568b676a68ad1aab5ece34e01093f8d474853c9279a98673672d0578c50040d434f95776e5374ec8c1806da47171940972648fdf9502dea31783d20a000f6803376050137e287840b3391a2556db8734a5b32f0d9bbcd0df8d1cd3e8767caf20bf6f6e15f0204eb5b7755fbae546e02ca22f43a3b5f752ce0422bff18de13b2e0b29a9c196815b8095e0532577d981230407e5bf03bdc605b5da7abef1302b2200b33cef4cbb0bd793d85b6388a9cd670a4047455ff4e707731b29b25e016da18e8cf38fa674ed936cfd3fda91884d102266a4654af1556d8f471a46b530b071df7fd7849e4719ff861ac5eb450d2aab0b0566bb0f57aff3600b9a7748ca93e7483751fba32c40ccda929355e2dc54dbe5879a9cadebe58ac9ae006c7be0de4bddac2b0315f682b726108070f873e596f1c60df022d85001561fa780b84ad6c1a8ade6e1c8138503656f69ad21d286b6d0e11f3a4ce0a8705ee6c5463821e4b04818b8424d6d645c1400beef28f3290036b66d291e31407ea4f665f0908cf8a478ba062e170b930697ed3baf14839b33901be26b0d2d7ea222e6616227761816c1631674dd25109506640ef696d2c01a8c18da882dee8cc4fa97f07998c8ebf0be1fc6500c27ead4815244d8c40060316fb458ecabaab1ee1b97b20ed9f506caa91178d1443cc2c544d94074e19c123e9cda182c6b30b97a03960551f9789bbc7aa38b4c472db9c0f4f277683df5ecb924d9dd0223ce41cd2dfe95807c0ce9354fcd5031e876429a55691fb9ac1a31e1d6796a20202378366fde984065db56834ccf65b1906e59583cc9f3c591d433a97df6310c3cd7f86c9e69b50f57ef91853a1193875f1cc97368455692d6b4ce78de2202158ac4e2f5b81cd5ac188898a49ffa73556754dc82278c4986c04fe3a440626a70ebe45d5e76a8a2fa404f7d7561822a466b900a41fb5dd5ed72f44a8de571ca16efb2e1ab94bee4f0684a1ca658895b70fb10ebd8fe30b0eb620ffce4363da2064fb09712259d278b7f0b838b05e51e0f9094a23c5fd35b2523373864f566148f3755fe4ca48f69ef9182d677d1a543239f95125fa0d00d5fd41ab455a44bdcbc92f145f2f2d4b902f03f523957b6604e7933ec72bb4e66ae2b48358441bbb411e01f814102785e327f6f0eb8f07631e2c896f3fb067a172c1b94c2e1b0daf48c47e26e2b8d3f72e2a478a647b4f4e79719fb6d1464464692c991e36b0d417c37913c6443c77375f167b39e6150614e7bb8a303de2e169ed4a99ce8a92644f81b2879e298c642f48d6a42fdfe3347fa540c843ae43eb6b3affb3a145a8bc7ed5f016a4b2884f47808d82e391ec94852ed626297a78e621d754fac5bacdf863834a0b43bb825fa5021ac0c89c950b25096c93b371663583dbcaac7ccdd0409d679037d2b30f928f156559c17eb9c4d2c2a7257c5f9b1c6c2be8fe741c4bd324350efcdf41373b2af964b4a9983a8d825de9809e2ae365f663667b112ab18ba27680e83881266ca43cefbdb4f50f04328905b273a5b844645b0a3f52fbc41a54daac219111056807dc9212761af1fd3a756f8324d3d6d72ce3c8925b208bf7d4f220f0b2acbd6525d0d6aef1d14471cf901eeda2cde81bf378b2588d74bb12bb0379c10e37d37436161aa82c150b0eaf68b93e1c4f8b95240cf7ab9d8dd0ceb6d8533742ece3082c56b009d0355630ae65b67e14c7994286ae186bab9007bb46ff9b3fe9f0a07dd0b5421b049d7d9bdd269c65795fccb0cb3b6f2041211dc8c0f5ad2172c6ccee0d7b799710aaae48eafb33f22e2478d4d360db30efd1f835421b5f6cd802e0c9ceb8deb630af4f2fd4ad453db9c46451612530270ef5eb8616b62eb88a31fe5788d9bcf2d9d096b639677d4f332aff30b46a8b98ada3611fc42eab7d354ce1e5a2b80256e86d07f65e4adc1e65ac5f048583c06524080c71317d4d572104a381d2660c8f9e405d24f77c4040e0372ae418341a78fc9aec9e4b48563ee4220ef0006511ff7c0c46bd71331794391d86a6d5e1a4be7989e2572eb90bc4e0db146b3157d1a219e31d766ce44ec07b50f5e6890de73b2ffe2c82be24121404f19ff80013f6236f00838b96186c17915bb4cc5845d705746cd70201a4768310eb2340c130d5630d282425fdf72d190ff00271fb267eae05ba83d2906006785ee9fcce877fbde855dc9fc9556755091604beda8971de329097de09e4b53b74702d89ada3e3c635e29014d51ce91cbd4e854a89ede70e212f0e53cf553c5c3ee328bb6e90b5165a7dc00e3d2d13377c5be5093b6e69eedb604bba909879516ab3b4de758f9c62415f7138a6babfb009fb8a6c96c09e3ea15349baa51fb5d5883dd341107f4a9b4b1a313256ee0a3557a63df1cefeeaea3108ed4224bf2b3d0fab0d77316b4b71a674124d7f8e97c1a77b35596eed47ed55888e32f547c8bc5a06da3579e1265db52517e45a7aa053213e5e40e103450d09d9a2254e7c5d25dfe80ef0993a657a1046d5101ec94b31cdaa44b0db440993fe706990ed0cae9503c847f9d6829f7d1f28e41f65289a5ca68a6a5e40b07c87be4d9476c9dd04d399e27dbc1986bb545093e53c0730fb47b295526287c2fa89adc455495a8965c9142b800e0b9cb5ca8af359c115f142df904e068d0d6848d9ddeed508736fa9723aeb812d0cbdf1d29dccd174b2881879cb3e78b04073316c431bab1a7c65aca4949395f402c01baf4925b97d024dd045bd02f45dfa7c8b4e32050d76af5c360f68c853837f35219d206c7ea64fed3e8ac674bac5edc364acf859db599e0d1de466693065432b78bb1132a71e8e729af5698efc41ba4a765310ad624fdfabeb21a336f57a7f39a3a4d73a7933a8c33fd2afaaf2d1269edbc07a555ab76518b69afe03506178e12fab7e411a7201b78698be1066ac61cff4cb307ba75f77e15735b2a2757139c3e1fb59b6695f05449029fae82a67a8698a9abd5583f00ca762dd4a91203c4bed9d0fc2084a1bb78150d21ec848a835c5132813c23b0fe5353c332bb1d7aa60c42a99663905b8c497c8696ecfd80c211c15b18fda2ae20548bed70170238fca972df0a02c209b2bba3b0b0c1072b3265cc5b59e51fb90df6c4ec1c1d6f026ea93df4739af20750727cda9c165fd0aa67e4caf1766a6c0246d34c147600ad133f6354f02335bade2219331cc3f64cd9c27dd70847092c1b76ac570e10133175b9a2f0568c8ecc6efa364e48bb07c0d18a0cb5d161268c2255b835bc836008a89f0d74b0733953995fc0107a0b8889cc6509c70b0cb690dae5fe69cab177688a3afe5df196fe6acf86b490b9a7554d5fd6be731258a04fa35be083699716d471f6f073d166a704186bd927243104cf1c7e3bb88adf8da847bc5025fe3991662b0d0002c203dcf9afe5fb3d78c0ba3b976672a2f29503c64c518f0c7b4f9e28e308e21a7b198781170e25482501c303b3ec660bcd69601402ded90b341ad86a5e0ede43c25d27e7f476092d3acfc9affa09b4ba482c8c30eea448f565a5da1cebba0e3c065a7c3d3bb40b2c4923ad3d49559b90eaaaef61e9d8d03be6d85d4b29d2e5b9d2c88f6e5282f2de8532cbd51f51e7ca61d541a9ba573ac1121ec7890d5eab820900e81fe9159248a93d510c921ff8787235bc342756605de0c078287e143a0a871f98ea13f9d598c8a229527c96209865399f53802be3c9c1422aba311b149cfc9aa26b7bd95302ecb2a2921c9ca5233dbdd0706fdbc414dcc8c041470d96c7b8988c970761255118a393106826cfb317ee119e06ed4e4b8ff04141d7e65f58ef2193f7094affb570a33656d147480cb521d987fc4fa05a4b43e0c6939c097e71d0e073aa50329211db70156920a8772e1271aeb509712bd6627ff74f4805da45e1f1488c9201cfa658f977854c50e43a8bcd21ed84edec229ce437f3c020ca5d0f29f98be6e0c9b548ff89a1c39c5d19db5769d1f90f9099b1e89004f844778c65c53a8b5b839aee118e93671974be19af17209a0e1f45d9049647e0ba9d3deeee72df87bbc1661949b451429214e4984af938bf3fbdce674154db674f6fc321ca409e244927f0e7cb3f032737071ef333da24ea103214ef6eb55d1094c6e881e2a47a16a6c8c2107d1f51960760e5e52dfe76ea7bade4e85f67ad68c0fd56bd4c94d556d81fa849f5bb0e9f48a719d6bafc6b050d2ac6ff300057b42c1984f0443c10525134d69f950c11b8e9f2db0a7c6760ab766e8c07b36a5ae50350ad67f4cdde87e4d13addcaa2fdc9e746635299d57724aa6aafbca4e6bd30347bcf76cf9f16aef98a11b581b751fd4db2b756ae97269914d7a0a1f9d2f4ea6d44a49f8ff01c1f1857112e29f765e5ada2f7e1077cd8fb054439a011dcd42b7eec52f519037c468d3fb4890967216e585cb912b5e2bcb4ca246b9957e00b436cbe690b265d0454e52b9bb78928ef08b8b6d772b4b466c231fc32c254ff2eb60747a846423ad8934d3a545b95f646cdff781cf421c5c7e53af84e3345e5acad6864951f6a4915f223a6db58e983d1ef1442e6e12d3e06de0826bf796b13caec89ae611319a7c6094c9e50dbdfdb850b00892a1caca395d6e288f3b7bbf768c882d96f67fb2214812abd4e1dbd31ed0077e546b3bc07662ca4c94b86997ab50a85ea800511a50f51e9ca7c778ff24debd2ca5924c22b87b584c8ede39f78ac2d1ac68905b8424f1d374d424ff96e57b1e4339ef2f49e24a330d66deeefa271460b46a8685ae470ad93094d54b323fd1fd4150e41602b100fd3d467fd9a72ff8e23deb57bf22f945b104e34e979f02c4553a70da895e472dec7bd951fdb1f815215057836671ece421e8b3aa1fe4d617551e773d627db18d829a50eddd06d84f95860ad5aecb7a71d8efce19abfa2e3d31c5ce701dc54d5945203208d98945324944e2e3ff72bfc9608788ec427514f32b97f53e19b75acf91c2e038b3e778884824f31840ba934a787decb587bce9cabf9290142adcdd4d08f54b35ef7d618735f0dacf1f32ced922711d68569fe0c9a52d8b4b7022215cc5b102b0f9c1ce7dafcb4aa3a0dd8e7cdde997b886e4af91526e1c807f2b2963656016ea84c88b51ea970b4cc3c4d6d3570bd74c43273d952069c7bb330ffa17b924952a4523659c659c3224a1f698360e2aedfa80b3b15548e6542f3c2f5f5886135e03b022d8ff8d3140c4dbae62b81cb8fb85f90b59b3c6e9acb4c8ac5c57270e0c788edb303bc455d8dfa10a23def5f09aa041b63b680eba4648037dc503ef500087f77e23c4418ecb85eb2ee902224594d5551b861ce20777e325c23508741964114ea4ad003974d636b3176284a5c6b7c0adda1c5ec272bf59a2cba1f4c17b6a84041dd2b15fa3524c32eecff9bb1f5871ffd5942d34887472b4813ac85dc1d429470af7e305f996588812c9d516d0c849a1704fe60d22d27b729ef4b088d478833c71d5c90cc08ad0114a862c55b797910587eb767cd8644ad68b2e7463427cb3a477447fc0b704c8fa0d987571eaedeceb76456668866c02e520dff8b01560aaa8d8e63743626da42135a614ebe622f1550d800a2c0312e1926dad25e0812d174b3e2dd50f46946dc3bfc71d3ed25840c88864587ae3d30335d4dd78dd76e92c163ea25ce14120d1fc65de409f6985912a5fdf38dcd4dbefa28e20ddbebfcd49c35cb64e4e9f63cfe57d4a0268c3f9457de52f3e0d21bef3c11e1afb3265a92545742bd60c365a41fe204d489184727e3f381420ce9de3359e01ff96d0724c0c1a1c899d847ed3c50fe0e24261aeb9fd7bf1019bcd52dd3d512c1d7481f26e3e1cccf49ec9faad03347ff66e5b0cb70f7ed79ef397066ff368f9bcf8de9ce3b4816479c8f3963f8f6ad3a6712d182817b379c8c102360d5132f6f4bd0546b3d4a7d4cad098a18b3644373d05119ac4fc60739cc23257c38dad381ee15fcd476017a9e349e1312f9ddcfb9515f9773a0ec74f4bbee38084edc7c75c69f83d71dfde1d336df0a780cbf3a7d89e0ec6806087dbe8fae1461a3e04254ee3e2c8b51c1283110b72012d660c6939ca696dd59890bea3d8c8bcfa293e846a4daa2b51e4295084d37d7c8e1a4921d3cb5fb911fea29817d6a08d28dbc8ae8afcb2bd2e96b7a8a4d5216db3a51cf6855a72d2599364c5b0353dd4b424ab4ab5a63bf8c24c0aa6f3f4b7c6b6ced6d76b1b1ed9cc7d86ed38fcc1f93da0b1de0bb2d36c0e07059ea3b4147b6816d99bbdd16071a3e533babd6f08f3a5a7ce67fe516207173ee597a6daf0abd43f8db5594de12f0b35e385c0bce1d3c88e9e5b6d5edc115000e3bc813f4e8c7fee9acff606a241e8e39a3414f6b4d457e74008668dd25ef98f5001af81de8e1e167354a02e762bf88f1dfd78e07b2e5425d3f98c110290488f569c32e007bacf26cb485328f5d6c44ad820d580b6d7aa7bb0a7692e16079a437037d1bfb2af3e55505f3de43ea42d0e051e0d661b87bd78f260a8b51c1a6a2005b7698bf994b1f48f6e3984e115028d88397f6facf4a7362198132627856ab31b4bbec0480fdbe5f29ecaf339efb9e10ac60e74791198412dfc1ea818d0f8504f551ac54588c38c0c2dbb0a351796cb1fbd6e6ea31719817455a32765f7611b59a151be7c2657890c062a32729a9679d9d2d263fa4c9cff36ff91a52b1189b6a3549104b0619712ca935da93ae5c2f7039a1d5ca71f49258327e957ce655a496591ba92dbf6fe566845fa5b2b1fe5daefe2916699c582ee5838b135fbd1a9903d44a4d482bd95fbb72275480019da142232c8fc32d806f15d8f221f88d68f57cd02a1f29ec4056e30760dbe05f65964b8686b74cb7e0f8fdcdbd059278b32ea175ee9ba68430f685c10e3d61b69a19a2d9effb995ec3764b50ad768afdd164af7977202cfc1ea1db01487d5ba12e25d298e1d56f018439317b218a1d5a59b366a25ee4c33cac717615b57d15c99e8e5b187e0ab833650d4b4bcba8175e0bb8a72d8198ec9290a14b74ee4cc219c67c5d114a1f821b7fc4ac4e22476f1e1226c5da7eb9f209d1d6e912818b9cf96f8e5c4b8fcb5f9101d65919aa6efa239bebce261afddb4a08d6be6524c1ba7a53561d98ebbf061479c1fce5e5f132095c63f1407a496a52717c4d81e286de1eb3fc345205f5b0e66b4c0fcbf9aea3260971a8cc8b781fa11edbc81c460b38fa7fe3491c106f4e636e850cab003efa2ddc2ee82df5602e0b5fcdab1a6ff0f607cd407872a96a91671e541b075071d37127d2ac93af8d7e580223df2a8686061a6c62d2d4f926030d5b0c6662cd7370c8f173f1b76087a18e724bb6c70c7de02d3fa36d322c1ebbfc1c9ab5b5549878e0eb846bf2875b89fdb94d2d30415e34e552e9873275bbdb91290faff0c3314d5fdeddcc0b5709bf68364c0e8c2d5f6e0e9d550383e9be40077474e68b0b59e9f8acd336894dba1748565ff5f19caeb01a80c640440a663d9280d0ee55999cd1bfe09fc074835112ded64cd380c966e47b19a1c3294e0ddb52e4e69f2745a8626e34a1a1208ce2e849b98ca8b283e0a097605667baa55de551bfb826da6375225cc3bb36cebf8ae2db80532dd4ee46f194d8b40cf7626d15a01867f3457d26c9995e63143daea7face1bf67ea49618a9b8b1e20741f3c1611b51bfb173ea2790cb740bd4e682dd10ac4c5286a85e292d200538b15e8734f656bd2d3a825a6b8114a8d3cbfdedfbdaf13905e2aa2ee26a76591fae4a9decc801de894b20bbc1f738b4299b0168ed7333472aa899fd752ec11d401e19b361811a5fec071916c8ffaabd2d04d9fe97bc823337c16f2110e3f0cb2adec4e595e455d40b4e246e678ae1089916d560dd88c4985e019d2a4591fe6d8b369fde30590fe8188644027a8e2d115268200ea631edc81166a5182de0c7bf11155545e0184d49bcb84e35cadaa0e9591ffde9d78f9f4d51730a059a960cead8a95f1ac366b636dec821d047a112636c69343f9a00adce37365c5bb753b89bca90fb4c584dd409eb24b1baa83ebcf24fa9bca40324cc6ce0024b7e2f6fd25d0bba83cba32d24a0d773ef285558671ea926867ab7a04a4c513c1c6f2e82ef0992a28851302521fb1992ac3d706d80498290b194b4f4444d36e5d54a4269f4ed2770a2d3d3edf5e1d3921a146a3202fce4829f30af3566b3ff41df435de0bda7524e71d431cb11f84bee2bd70571c34c216182ce1830fcb70e32d063e745063890b2bdb9493e23b1ad65df1b8889d76ec1575a427869213e27bd41fc45bb18a4ff5806f62ff7b10a1335284cfc1a828abc12431885e3186b9c97261b36d593e92b4245f59732d206a515812757e8286f0964a3f5183581bc6a3adc863785af653bac6be8326d5163e5b17c63a4300533e73cb8effbec50b08b9a247b3108e55e668b77eeb84ce1d015e612a34c8172e85b2e199c271eb735993513f7cca2db6cae4a643abbdda35a67e7197bf7b190edbf17d352289af9762b864007e93358b3664bcd5116f2c94b711928517e788d319c0d138f95df511d85efc469f012fa121250a035a1fa063192174c578b383ae0b3b6822768e4702dc3a6ff5e31d03b64bae819edc090d8031733d0a837ce1d7009511069825c393052c2cd6c62e1c20071a56e201c62c2f8eba8f7b48fb3a45c32d61eeeda023cbd32d566613ada9f20d970138a5d811852515e844e7efa01a31c7343f3b8e0ea56a63fec6b33aa521615675c447b1521168af93aa00323f489fabca1af91d536e39595bfd83f3bda284e0c462da92681a4e75330b1bb458e3a18542f0e3308a50d24b2052a8fa9a02b80289ae5ac4ab69f7c0071fa7cc6ed6ec39ecfd438dbe8f7b766fb4beb3184f238b3170e21c0d34bef7940b0c71e461793ff414592751c8ddad4c10f88bd853402cf2d819573646091e933e9c774dd556638bc14c2c442a528638b1546b8b04218bb9a7886234ee93e2dc8f4619d7bbd435eed6d50785f49f02a396d03efd04fd5ce2bd189a9c055d34597527954d71c36f5f0ab7f41394df29792eb87e4d0d0767c122836bc110b0c73b7d868a297b5bb70626a9676f5be5660d32aa2236f3ebe2aefb1687ca12b8f46e7a137228ddfc9ac683dc1331a1a348c82caa68773f32d1c0831bc55bb21b429ebf53a7672748e24501fab4dde0ab971fbca773abbeecf7b4c8c8fccf8415ac1cdf8b9b6293513e579cf1a5dc234bf59fdd5400be8f2ada777fc65e7873bec2d97d8a6b8a99e57dedfa8eecccec6e87a35f09e7b0265c6c7e8ebb1921721ec99ed1c7127db2541c3cb92f39f6b41f5abbc965e419e729c6b37813c56af65000f1cab53f2147263ae6d469f86640ce70ba4a23d3c0792ab0f0336c25cbd69a441949fd10cd28bac898f82656e526fd741520909be033e63bc583f364803667236e1f9da3418c2e27866064ed9c3c292893e697d9a4e71376d0d802aed9ba1694ff82980718c3446d1ead79f101c53a706e095cba9849b94832be58fae431f851984986a2b9c50432842dbde0439a2a997c86bfe9e6baf5df52a61a2e1722744169605ee5e82b631f27e9c4b6874dadf3d7cacd1d7669e9383845cff6ca093af9b4186c160d020b5318aa0773ad72807f0d108a3a08f8475bfac707f51965097fcca759dffff3412d5bddc8f644f78c83916634ba1b2e8521a4359b9a7a766d6d606637e5d0052beac86f8f1283b364139bd10d7ae6dd6101d6f82b3b004a54a50441b4765f4ae44a57ebdc289e74e3e48d7fe83da5d9ed73bddc4f1e9fc4369741793ab16b6283fab4ad9a1033d766f591b16ce18c1007b2e99691587f49896d55f33cb8772dc006dbe8072ada75a1e2d8122404dd704d28b2fd725889a4411e51a975be61b66921990370b2ab575ca37d8b2ab7084128dee302be87c364196c456b47e3239765b7ca232df736c1fbdc54637e697311d52ded34ed47442e18106c312a0d08b60753e4ffa2db0b04e17a66f6693d016e3e98a0f99351115a0c41d1391b2db45aaf19e1642d656dd8618dac15dd1a16dd200aad86d8e403adb1613570e5cf09b7a65e1b35a6233744afaac61d874475196938eebf3a0c0806ee783f9a94469bb41dcc476931b61d467813cbfef58f59a8a3db3f522983b2ee2be896056f9a4880f56d3ec7613d2afe7232991e6ae59f1469698dac00ca907bd905360fc5328981315518f781f29d8dc8f67eabb059d2d67d4528c1e3922b5e8662f92e9b3c677f4d14bf1c451b9585b2f09143d8d8372f2e1d754e4a1ce472271b06b5dc47d7221701390e955d3a4a8de22795eefa9c500ae98f7428bb652feb02e701d7880d24b4691250c2c51fed5060dcf78e8302453ddfa97cf80abab6c7c6fad603d7ae74a550b368091a1d79c6360b6f2ad94b571566314b0e413bc5ff38bce3418f168e31e162973e995f663133f0e2b3a02817a3b7b9cfe29ad38f25f47f78e6a10dc51f8d51bee6286e5b8e587821473e80a874ef4f3fa1f256ce013b61a55b0bd8e8523bfc03d69981b8b7b3a287cb5feff331272e8f6b32e76eb9380cc832959d58c5f8a9566308b2e09a08c633b4ec4a0107dd43dbb46e127f87dbd1d4719ffae5da4aa84f95ef4f8139c68b2cd069d72803efc72b382851ef03cc5f1549912ebb3e4115029c04d9baf1ab2757396edcadf49efbfa56163669df9e22e17bca99a41b36499be81f45ef5dd196d46a23212fdbc05694160b1dfb240c36e9404ab3498149d39f411fbadb57cfe355eef71703f3ebe533e64ef373e36c078b98dd19f4403db8f441bc1282c1df2b29d59e7adaae129eccd9b656e8be44a7e60be373d5d7a4b97406aff04c83c4d37eb6489384bdcbf26d89ae654df5258fdd7636f38dac2903842e0bf97c8d22743056b9bb7ee06399116c1909683ce25f5cb15c9081f330f500afb12cf186b7e474534ac5b34b10cf55d637730a2fdd315a9474b6c9a7e13e0f1c10dbdb2fddbb522ee9797db37fdae20db64124027dc3157f459726bbf34a2a391ac1b495c309b02c1cdb7fece1208bec6d1595d6c374d122512e832e4ac1167a87d20d8a53f9afac66ae549afe48e933b9539a4a12cc08516819290b32fc8c47ece5e410dd6da7721f7b0a7e5da49aa1d7e8b8b1ca0a56bff9bd4f31f3633311979f34ffb61677a2a241b5a2c9517585ea0edf6b47be15315108717f1986e9a56989977b22dbd6addea996231bb688218dcd693a76b06cd70872ab38d277a1d9a86faa3b8c4066d7aaf0b72785b00dd64fcc522ecfe63f427a788812510d33fda5b606d03e1f9642d03e369fbe5655ad2c7fa7700f0a45b87e00e56a7bde5697742aa046f86136d4c926fe4776b9b18fa33229a8e8faeea690424ccee4e3021fa11358ccc1385fbb2129136009a8b6b00cff30b7c61aaecf80439e9dbae30fb8a08147da38541b49c6be8d221372719ceeb63319ed855bfc036d666264abb7e5ba20366d83b957dc317ee1bf1ce36e3a7c935fc08dd396a97be6e78fc079ba8d5c5a7a8bcce985216130540a252143be4be9ea3f623deded89c79cd3686e11c84a34f18e3875783d2feb1dd13141f0fc8fab3a74964e9fcfbab5db88b5f8d4b2d364e5d6ac1cd0953a0144bab9b9af1e6ac3225a6d169f3d16374bba5ba39ecd9804a0399ad59d30c5ba882cebe14db5f72f125227035c59456f0f1cadcff00480f319c9c6ae954fcbf300dd2d3215a97329240b891c29ce777e21c7514754009e159133e22827f07cfc5a429589073d94a6de85cb0a382bcb971b19c09df76095083bf1e906b1dca71840b76114381900de323c2e88b68debadfeb7f54a45d12bb728167ad56bb4fdb62b4d5c754c6444a1b2408308522262124c34f90d62a0111cf694ea98ef68d201a389d98e44120146a8f32a2a60fda92147a2a3c88cb37f97491d0e48953194d2865b33f87a61c68a428d47e2b9b61e28faadb65bfb3309dc9ecffb9f820300e8f431156ed14c514af3fe9f1d245eb72a075f614d6ce47c4a94c07a663edc39a2df48fff1c5ec06758b1ee777416a2f3233afc31ced13867a8a4733ce6b3285b7fdc1b81e7e97ea0668272db6e9000bcb52d20456274f017b701597b68b85bb350a66f780109d6c83d716ce5b576ba8abc45a078f6cde95411006ef7b0308e4c0d29ac3dd0d3aee5833f714d3cc0d35d0e827bc0bd60702527a7cd4b0a4149b7c1c44ab324667e03adaa87898da05ccc32842aaf67d957eaf64bd755f1fa41832214535e37fc2c2b3469bab332304e093895e3ee7dbda3f05e49286b637ed3f0e37718f1ccf4e6d2c07c54cbf8c5d8d511e2f113beac2673c3a2c7643b59f5428c86c996238293b4faf00c8c22bfbdcd40e12b33e950da54abca5b71fd29e813c0ec7fe374b7aa6a8fd0bbbe9d257268e233b35ff2e68683674c8e42e9e3c5261b12bd3ed12d326a2e3c327261a07c83413b05019d06abf6c4ca151f67ceb008d5605c5b4e3a51a502cd21435101d9edca440bf177b4f8a60e8990623466b5c0953824f4c3598af7196c35a407f64a71dd9c12f2b3221804a7855f80fc4b6dbacd508cbb304db9c284a424034f496d7d087eaec12243b200f85a8f947cc2c2f2132177a618ab7c05c35a6afd7dec6c0647c8c3aa23af1030798f0044b7b0b1930af3d4468b82a1bb732178fdf3d1bc9b2df9d355275cda6f3e80553cfed70763549ff06453ebf6215e941afacd9c4f08823332365cd065af4033ae63c2a389bc00052b94886c2da48000a7ae923eb0e31e772e7f515ccaf98b785838928734e103ab1ead67dcc180f6e1f364782c67db33b5c88601b9ddcb17114c3c590c18b84aac966dda0559004c31ac1653910e058a056c9e58012b49d9a717d5cb5cc4558141f3eac16943c4d23c862b210a0c04c451bc3c90f3afd8a8905ce77bc335bc868047ac6637b024e3b86b8d8d33c17375cde61d76af4718f7a0cc7c41e82760b380fa7ff5e1967d0a41df364fff1828d0a79a4dfad7921cea0983d17e09e9900619266f34dbfbcb4b2c30ef16fc13b0680e7707fc491f0ccda0a70622a951aa7a3dd04290d705a5219ba7218a8b340f6590b40d77524b2f355aa0a93c860eebf13e48d66d946115a2703e08004c5997e1fc9f78b3a2153db8d6b18547244dce58abd0c310da5461d8bfa602f9eaae2a04c8113ed1ee2bb758309e0ddf4d567b364a855e73214334b95243f91fa8de83ee04792d4aba5e523d52cc6a2147957164c7a872faab9200bf4c3b3f65ab6a78e2fbaa7edf49c0b7468533369fd63319ac35c4935be314d0bb109cd06f358340652b0604d6aaf3aff514296d7a85332ffb139e733d375e2a34668a6291f10189dc622e790bf004e4fcc1b316b0e559908d32c712ca84543bde895105e6e805f16c4a5414df6fb2e1d2d646933cac4ed8955d06388b6efd9745556dac66835cb249b269e1af24cb4deea03a516f97d1b126670b8256ff7b3471f752eb2da612405f7bd5f6905b8fa8976d4c4363ee457e7d95997f8f94f4cd89be053028fcdd2469f485b6b2bdf016cda7ec470c2de9898046c5a56cb1bb1f4116d8ce4d2a0a7adb41dea6326710d6687e0b4b89443ffaeffac420e11006c09d7f72c5b53967bf00f7eeb4979384fa8118f8591993a6f1a49fc1d265479102ef8c3acbaf18bb2982eebe4479cc83e1e7cf36046a817d108f2218b7217c6a17151e88a4b98f3ac835079859526f26de8f817a646c0528ae248caf829dba76fe202b87f42496ace2b60ec97979283b5933317cd8b1c150305205137ac90d442e4b1f208058e5e2667140f334d5c3105220bf10d4c2deb070f5e75a8603c37c72603c8d1f77aa35c3bd90c1c0e890711fd5b0373fce8dabc0c00216229563a6e48b13323d5a7d8806aec246e3e4c7ab46043f81be270ea73b2a0ab45de4461746cb12adf59b227ee9d315602b874930a1161c905b6067c863558a52159fb7a4729667c20cce4bc29409caef5359e67d31755a98d151a80a0485052db52e94e49869fa06d9b5022f6135d1345a6e2f935d604098f21eb452bf510d4ab2b35bca281e992bc92dd472707f211cc77113431fd22528bbb7ef4b238ef588acab66201773219a500fc8821ab6af9bdebc5936a3fb7f1f56abff42f4168b7a7fd60b139449d4682c0b01b33703f57a5c24a888ebf04157871f9602a0f689492b7d30acaed0e8741d6f8ea2f7c70b972255beff3e131a0f9b29b9177e8adec526e1d6273ea785670c34d36ca3ad009b8318593d0d60d2c37d4aa60dd62ebeef2b9f31011c4036f7a008a13e78eaeca3a790d0e68c80661d9c017a0b13eb739f007d60f0571d642c9ef4b472fa18d460ca0a60c1da2210b2e01762b4eb63f8e88bd1cc3441e388ea29d94a3faccfaeaf48cf9640331ce414f0809153ba18887e4e75344159bee975b2db89f0374c6dcf214f3b15386e876724b22906946542b21030890951b68665637fcc04a73ab432dba5803117625351a3cb0fc0a0f18df5d9e4d8f740a3ce4aba86542956b7d1e35c2d9e29d5fb6e4e02797db00ce7bae4e34377a70597a5b9440bc01479301d1c80bcb63328038caaf80fd15a27b0288030b7d009bd4e1e55f38561c831739c856bd5d0c6b75c8d631f00cc3d91df175fe11b57c01b2bc460058dc4b4196371a841dc1eb268cef19ad17b2de8f3c8abd4d5488806aaf49532969474f0c1eae0c52e819e48127d33500bb00e38241d193faf2938b164d9e137089784a8f9aec09499c0c60978289ac4f9c00b238660a214a1d3264b83ec94a7903a2ff2f17f6f6a9b3a0b6f2291424736ecd7ac1d7088977e1734a7f65bd9d6537d2462c4c9f7c1ba6011ca4f4124213031d6cd40fa7eb5e1d2937d1d24d30c7e48cee360dd5f0ece89d4ad6b7a28774259eea258dc804cbec821063266b6dcde9009b2498d4369fa0d54b44b7c6622c472317f1069f8c9f56bd13f5eafa2b9bb2dd4a3dc29301dafec9580121af444f90f512162952c40df0f086f8c18738e82dba408136fd89dbd53b320c3a56a2c6a2fd4b1ca0289e626a5fda093a193140bb9ea2e4e264eb79c831ff30c6d73011b810365a295f62ac0750553815f3e7f810498c6dece4d31b142cb0ecd5de80085326840092809fda9adee822e4df63afdf35898ae1ac20f2d019699b332b94cfd375c3c165e8c25e9c4b60392c969615017c778d4baee8f5b39857e4b327e2b2e5c949f115dcd95bdaabce6195d9433b7f98b67e4c5bbe4fcb01bf085c02b110764fee9b058547659b39354a25bad8bec4fc05ae78a8651fe569eb0d30d7ed42cf80075ca825bce7c7be68b0880149d23532d5d282d95b0c8c9623fa8c77fc12166b371e736c9b0ea842f0a8a4db5b6f0c6e986d1cc0843600c95712deda44d8561cfec0067620364a1f4ea4b5a567fab7ca4441e148ccee4738b2e897877ce5b7cbbdcc8d56d94f87f05818c2f1eb16f284b3c52263830ca4b42b198a43fb6d3905801905b115d4194af8e04ddeeafaa3c1307f3aea3e9d02cab3cbfcaf36724f3bd0e876aba6f155322be53fc5e11343d9e2aad9cb9133cd14d18ab6854b3721d1f0166a607e30580d95f0a617319b60e0b993131fc91344af7595c2a11ae2d1d068ff58f35b6617688222444da30ead11cb78a60b7b831f85e135f92f908faa95470d8d3fc8579dd2be73c13e63b5cedaaf600c8872847bd9a8a23029d892d9737b62e131ff58c066261ebca1d9edf5560018c2caaef9b21252de06577dd674e52a925116f3b8ccb921d574d6c34e1105db6b6651f32cab6d73d76a5211135ba31f5cc40ca2077668f81711573c31a5b208d28c2f7a5213d8428dc7c63f103a69f21e3134dabb3c56fb4070ba4e92c1924f53ed7e89421608f2e7f1a3c7e8fb24a845d1a42ff96584191c70be8989fd5ac0952bfe1b18164d628b6f9b94691da96f598aaef69e7b14059eca5b0fac25f50d2f2cd486e3fe04839934ae0d7b71f1abedf0ac4c3299abe1d3f9036ba2c1e34f19256a506575f03e79e67d97599b0ad89e436d43fd31457de12de8fcea3eb8f57e3eedda301b32e548220c2d60c216b48cf9b6f41ef4a72b89e5e0d2134a1d7b2faa7ba5d78e93c46a373a414542b9ee50d8b218057deece03aecb6c47aa3e31143ad077ae52582ced860eac28e8aef072d85209942ab662456cf6a812290fe6d1fa6fddf6e15971de488a3225d7e0f69450945205a2d48a022032383b43c979c04395617ad01bdc92bf6d813dff50b0c6c7c1aad90ed05461372ab752b9ef40545a5d29d62aa5955a09151b8f09c76ae5f60fb56ed4fcf108748482d716c7548a41c5f6256b6d992631ea34f41bd4133c76dd023ab2eb56d8d59c62940be8389114d19f2c46b7a2832f0ad0a5e961b1559bf419dbcb693a89140211e7b415e77b73393151e91d9dfa79bf647fc8d5a82724b6e0a214d5075596ed7180c733620886eb856559351adbc98af524110938a99d95852e7eb762aad99522cf643ee314e5a0f8071a4410ba11e5188c5a3e713bd10e7034d81e56c347bdc8ae7c5990d17f23b9b003a68e039a8052fcc81478b8027a59914addfa375e3f890081a3235efc5b389868af88fda6e08d82b4783a43670abc44e6e7fba34143c2acc65b82a06967b91d60a102895b9216b77b5a76073e292a15d04888940f6c42a16025ad20c0a9a013bd59d43d3716bf40dedab57b348f823955c913a7bfacced3a0a4a67ae6fb01f52325751a0386042986220a36d8084a28c91d39d93320df9323a9c6d0e03058a6f3874518c0dbde3dca0296eec8a8420e5d36ddf819eb87ddfbebc98f6b6b46eac6c3483a6eb5fcba8785caef06004284d980b91af2a1e5c6f0b9e71767649289856e48f2ca21d1d1299eee0301e45c7da94b8f135c47262ab4f2ae314e94f9a215f0a9bf03a53355982f31c18e8ade2c308754ee4fc1a31db6d869edad656ff94ee6615a5f4a876723552e677664b72e5e43307699c71bb1a2bc30d1ae4dc9425ec99f74d37352d4211d936d202d8fe23071d0d2fc326bf93df5042c8a19b4608278bc6fbef6a8d9a9eba6a2c7983bb6a63cd4a1e9fc5743ba8b57c04e0a23837d26c98449443cebf84a46f303ad4eba9163488c9431d408bebb48530d4ce23973e63c531853b82186bb74f33684fa1bd36b7fc24dcc520ae7487b7125282c1eeccf64c99b447503b7b4307a28557c3f145eeab47fdd875e60c15ca15cf94c201c83d91d46ddb7df42b05cb32d0fe5125c14638637febbd1ae80250888140c908040c563ccf062ff37cd01540e011180a025084864bc199fe87bafb88024e1000104540e8110c59acf8b7c17f5170809082c8180a4d0209138b3fcd1c34d7b0d120020e51088040a2e1663c61bfcdd68aec00204480a07914060c563261349f382e260b2060a4648bb2bc5f054f7990210c081a51060125b4f067eb9e710d2711c5b48cb005eb064b483e65f3f06108a484966cc22e7769f6d33a8de8fb0dfa95d342931ade2cf52387af00f9d8b436349d39b98b93ea9d6f4efd722b55de9960c2bd57f3f8c1dc5fdd93170341c241578d8324871d0fed81725735a99da57341016d4c6082eb1852c49c41315848a6d73151ea40825c94feb4cad5d731a6a67696e9cea708607c4ae5edab06c56479ede81bceb5f0db7bf59cd5ecebe28af539503d66e53bee29181b52e0eac75dedbe89f04d5215fad310bd60aa5ebe579aab3012aadf019acd0804c336816561a37e84b0341f792c44c4cdf506bd5960b1cba64cd3059f7148f441b9cf0fb996a250292b6041302a52b9863d7c08a63521d9571ca1ffbdc34f73c83ca8080121c8430d2b6a6b919196056b16172fdbb32b05ce7bd2c59d47e8f4c5647bd77c0c204b31d8286d0b6de6b8c58831f6b8d5bcf9c51fff0351d888a66f1353b8f85c9f1351a951412c6b11134940896afc1ccc0409baff11030f069c1e6a3e403107d4d07a4a271fa9ac56716d464abaf71c835c0ed289ce3fa5a7ad594ae9a252cfb5ae17a0df83a51b4af496f5f7b99054a8d115c5e25571c83b86ffd6d38dca4c8aaaf5f33e58033ee4fe102b48b61ae879952caaef80360fe27b336343aa65936ab356f968565dd376467a1f69b3258afe7bd8cacd57f47260bebde9685c5ba6f64ce42edbbb2b15ee37d5959d57e836c16ebde2c0bcb5adfc8cc4afd7765b0bece7b21cbcb3931e69f4579e8c228e02e25381ef7e5c7c7afff3e7e7cf8f5efe3839f4fff3efcf8f8eadbc78f3fbfbefdf9f1f3e9b39f0f3f1ffdfbf8e2e3d3bf3f3f3efefaf7f3e1c3af6f3f1ffc7cfaeee3c3cf5fff3efef8f9f5edc38f8f5f9ffd7cf8f2e9dbcf1f3f9ffefbf9513ef856489a108678c291466e5204f41f69bfa9fc52fed1ff43fd97f69fe227ed0ffd0ff49f54bf29fee9fe51ff43ff4bf961d521d533c3b6fb07fd57ca6f9aff947f94ffd07f52fca7c03f0bc51faadf4291f99bf3ddc488bc373192ef3906e473c4c8fc38df21868cfc8ef8dfcf98833f2315fe2cbe49eb1ffe08b4f537be609f71c6ab5124d2cf1c6404fba0742cb8b09116f29c6e807459df8894ad67bb02ec7ac67082fe71377f2124d92b774a4092a58bd303fb6c625f7bebe5ebd37ee2831c0647a401543c685ba73f776d5ff7f8a69fdb21d105a30639df96a655b0c350ab7a50c3137f26b011fa7649dc81d85d03bb69b82b1a76a951f735d25563bb69bc0bd4209be22b70c868885034c41eac82b7ef2fbd4f86ee5f7fe67bd0cf2e968852ea5b8f8822bcf1b437d03f00de2589b437d17884ced224da9e09fd411709b7b1bc961e74ab515c6ad89fe81e389318dbe5652981db1b05a5d4de88e6b80f89db5cbe940ebb058d629f2de1c2497d601ae40a576cd1b8f6af24fc3b44fb3568e5e270039424302c22ddc38709c2d95958f53330908b69ca82617fbba2824fab5851115b90f6f1cf421502809ca48bd67a1e6f31438a5e62ecc8354cf5e229ba7ab25e957d19f51c4a8eddc1b77cb439202aff49364feca369a1cd7a47bbe1f83ef1db4a85420f7bb124b01525bbf9a3790530bdee805052a292d75419f34c039c99cdb066b4e0cede8031d314f64c1bb831bfaced59c8a8434d227816dc66a8f635c7cc5866c9eda1f60704339c9b84489c3ed48ebd83c43213a15cb2b13cd38d98ddaeb0e5b96c5e5223110c428482840160290458000794e0004420881802161831cf137d5ef447d85b8acb05da23483c82b9a55d5da0de02e4104021005a80b0687c1098404d2594a7b93c31aaef0a82abcb9393fb2a9c49681425262670daa84742eea9abbb1c6c001ef8bd50450adf86b2b86f9e4bdb47fc2e31aee7432117f09311c66382097e64f64d4d013f3ebf47eb8eb4997dec28f66eb45561dda2f2c93f49dc4e2b7f670e444b21b2a622a1621f4ce6b448032c75d41f247b898d975b4e8bb253cae14a81b2e028ae903eadc1bad933d784866e47855641f03ccc76238cd90db0b3b660cfd08439d31ac66c5398f92db0673660cfd28439af1dce7c43b8f92de06736e0a6f3db9a57323a0f19da5ffafef840ff4bfb8fe287e67fda1f9abff4ff9afec2ff249ab42955545c0415a3e421a7f94bfb47ff0f5dfe0313bb6fcf865023afa88550308a1731c51fca5fca7f14bf287fd3fea1fda4ff47f343f13fe50fc55fea5f143fb4fbbfa1e12f43d453b8e0a0b86cdee92b921c7f1fda4b534bf56b042631b78310253833323339ee1e568e29fc6b2527a4bcb25cf4b33756d79e054acac8415e088dcacc15991d660e64ceb98c8028829083dc447bfdeb8e1a75c859ae3b11b76e6996ab978b9f322f48911f51c2a2c2e727a25b40854eb861f61902c3b69317d7500a0bf7f42febf1fb085ba9fe99df00a3ec11929e61c1e45f16a1525c814fd8bb560021ed0b345600fb2f1661bbfd18bf44a92dd88f07eabb12c772c403233b734687faa379c30e56bdfcf8e939c2573342932da5d6c13551aa177ea9270fac6c3c44ee5613b9d926736aa80d72e846bfa9579d3358ec934e1da65b8fa5ada3391395769a33941f810f164f6260483879881c0b4534ecb4e467dfea0e08dce2cc469e16e485798d87c56e8689ca1b838c2860685d8310b1cdef001cfcd13f9891d6190074f401430b80b22adf81ca19689b6123a471c5719874052d450190656866cd90840028130177d23b58c3b3afd7a651e4ad007a6a96be5a5f11e2c59efa8d089a93627d1808cba433b630d1aa32c0341392157a1e8f73137376a75b0618f8f381ee9a17e4415a70fb81845c8e308328515edff66254dc70a0beefd8b972998a5012071321b4c7148f08da86b626065f4140ac1dbd417b40f843fa7f3b10faa25aad8720a498facd61b17a3210663aacbe2473c58907f32d4f317158d2b0f69393e0aaa17fb11cc86115b2e0a9c9d5d9799bb2b25329957f0779f5c096538d03fc18d5fb42d8d5aae8284ad2663c11b5740475cc393e83c71f3051d874b49fe99b3ffc037832bb7746225bbfcad5259bb05f6c40f5c381d9aa78374cfe49865d323a67145a9aa829e2b7b453421cc21bbbfa85e106f0524f9a88c1c19d231178ff1f81718d8f747d5f9237f5c9659050ed2199a842dfb41aba4da3a3d784327a4c6a079d760bb8178bf0afb7180b9e0f97b3ec4a2ac2780d229aebb5a2710d0ee36714fb028c99004e4f0372236a793800a644f67ca3aea84ef4d9c869e247082580cb6fb334ada0b036825c7ecbf335a9f0bc7a788d38a151c767e7f420645c010e7a9d5a81011c1742d6aecf3a4c4b03805782fdbdb2c389234442479687d9982e215ec84d8418c7dea73c785c3902e563642672e8b5b0c493503a02aa708743ad743bd06e9bd23f1aaa855dcf1b8ffac077ad0dff35d0e88c646f633fc748f06e4c7141885c870862d090815cf4e03d825f965bb3e44825b01b5a2feb7abdd8115a7ae9e2fa105b8aa5347efa03470eceb722fa0e0110ca162e58fcc925f0a291c4be4da16735ddb71cad9ad003a895e0fbc392d1c64f3faa18e927a1e6bb11254eb0e587f76a0cbb1f487c6e7d74b226e68a022c6d0f9d0a130e7bac7765fe9e975a26b72e7100ae8f0a4e76c12ec35d659f1c84b75b902a09b7a5b38f55e801ee05285303869d0bb794d95d7c297ad15ee01db45a7f2e83babddac3b6aab3cd4d857543ab64a1215f7a62735c7b5a1c1bf840ef671a99f791cf764c3402d9760cc13eae4a972bc6ea11d74638f53073a077ceb774a57deebee5c963760a17f1786795bfbd8adfbeea6a5777b4af7ddb55fe762abeb48f01bde62d8a83298ee3bc72b35d2dc85d0b615bc70a4f50d5e37c2715532942e329d737300220e60c40b27d3d632ad94c2e57322b1f589c1502275cac6465a5ff909f0c165da08ab5c057b10f8bc92cc109296b02ab111bd06091942630a1b23ef0056205382c2eb30427a4ac09ac464c50a18be40fb5c968bca2df00815b4b2afc1ff405fbc7c1729fae52e55655bb870299619ab8dc4ea1671d0ecfc3b47722730fa3ab8d9f7d4208db7ace9d7a21eac4e6690c0c3ec6a12215cde2fa2078fdad82389c637862187f70f95c2eca060745261113bc6158e19612262ff4f2587d1cec3093e7a14473ce114108a37c47e36d6d342abf0465e8dbd60ce2ec208cce999ea30f43fb808e74427f823c8b3a4738443da01f401f221d239cd19e90cfa04f1187518ea807e807c88788733467c433f413e441d431ca21ea01f901f214ed1ce11cf5847c007d883a8c72447a403e413f459c473923d913fa25ea85ca729d45ed02fd1275416db166a176417d81ba54b75cb15cbba45e405fa82dac59541d8bc5afb20b64194d6000934627180883b1890fc4c04882036fa6caa477694c943213ee300a12e5bf200857785110ddc34541ba4a8b82607099d3d677a51507d9ba541c64aba53888d687e2205bf1c4416c4d138320137a2d7190e797c4029ccf2316e07c8b5800673dc4029efb2016e01c805880f3e1c32a80526733c021d0e4341e70ec3c18d6c534f15161e8b485b5e84a79d13d2ca9d8eeaea69a425443f6b2d6a3c821fe3b9c62bfe02e06bf26e300a9626ae96c5fbbbee7e059b332c9ca9c05b38390b57a6686c5c13367659d253bd38ccc59b267ccca384bb6c8089f7190c550ba838d80815297018c3037f21967cc148800424c6425408408137e04880fa19b3cf94e1e4334fe06f4f1059e45c60716491068cba603e4b8140152ebbaffbf004ee31f00a578cca099959f120552473a0a895b2acf16d9110b3522db5a74b2cbda69817288e27b5f67456474a8628862cb650a8d2008d4f6de296218f0141516513eaaec6a550d8ba2d24b776e6c3900fdbf5393b0a3c09be3b8eca5bb1d3166903a481d86b50d86b526450954d1485016db0a4322a225230496c8523341aa76632985168a3418d69a20019024008e2d43a42935084802947ad1d2d192a3a9a224f2088e24a22186476d864c55b2201521cd045ae233244a1b122de54062b8d479e83044c22163343a420445e481171b4a0184a0a506663863c78c1de48f1bd4118e5b9a1622058ea68c909033482447290c492e29a8a2a422354352a92847ed49498a146b4bb5a7a425440a184d29ca51945464658969890909071200465348435a8a72906bb410c9191e60a506acb90306a8512dcd28bad544f2078955f35aba51341a3d60a4c3a88bc8860cb1488924aa2d9124399246e411899424408d34826244638657d2cda8c848248d6a426a5035f12800524716a402885a18ca5093e55654d371a4444b8d8f161eb9fa6987a850228f9d3a41c8497d5f62cab2ae16485244e73f5a40f9b0cd3832a2028193ae343a778c28204c9459085664f8245104103bd800c319a8120110d21e866f415b00da83e78e0f3460b120822a104871d2c564490104dc00c04d0e586078c1820a720308a0730132f8347105384c3bf4851755a8dc00e09604103ff0b0830d35c41086830c72114c79c049d75611747e20e28d99969e258a00c2871d745821852f176cd90250127876d0c18d0c5c86d7dccabac5002445147c82f021071cd8a411b3c135731154a1f2c056d6112aa75b8c22e80461a68c182ed78c8081ad2559475e8a288aa023c40f39e0c02686346338e012c6c056922354456a9f2645144d0811c40f3ee480430c69c688e160032e4fe4c2aa2c0055160aa34903336430214019982f521e883a61832f42321790d2c843a321a23046308e5aa8b130a619cf88404629324a2c957e900a901580024601441d4639c800441cb51b2200483568d0206db5194b326c31722c05a02440d20dc9e8a8c8682c2a222222c52fe29274c01043232423a49a8c23224648e4004b6059ba781c3515251d4dd5966688b5a5a25c2d48c6206fb53c5bc80c8b648c4648b5a718034cbd304c8ab264d69e64641985e8208252138b90c0192669a2e4b665ac25d59a387d319c424b0275b2884454b702acb28cb51ce40f54dc5145a4009e615151015e5c6cccb8ba80649205836100480f2c312d3149b0c4067ac493bc1822e9484c74636c4648640c22b15a0660b21cd564140d20ce0892858a1390124082cbd1a010648c4a4456372323b5062e95355a6a1035252d4942a0a84a2d0123235a6e3081891616c200608be21283d744833843a5b457664b0c2033c4280290478c02209225c9c84851d2910cb2c816137280a4255e0c938cb6627c1d69e9c85a9284a4b5f46522b96178a3f64424a988aa468ca224a52c1e11ac304c3ad22260f7654844da88c422078a92888e14255075a59422f938d22a4a320a208612a41eb52ea41b4c0220900380048e1468e0090259928e4aa320318214d9f2325aaa19e520a22289202dd57c542b2324a3a41a145103b5292b914807b983088028a4231e6924eb088ea32400908a64c1ea521272d454eb51eb51c4c23001193525440a101180d4a326c00c2972002dc3124a247be48f1a4934018f083ad04167185ea883b606061652d0004b05645cac7779ba08aa4020250a942faf260c68514d056942e000036aed071fd2fe6041c5025507f0c81180d1191173ceace040d6025403d858522a8ae3060717d09c49010513cecc4069f20155962103f69556a88b1d047fb4d821a76f63c2e05ed59124233462ca8a202991270d1a2a23446e3029251d1909a0c3861aaa5cd34917035b4bb2a8844839d1b8c988512381830c30a0d167c81b185e6001cb03518a10c1c154b353878b28554988201915c5d00507194e00a1832f1394400209619c74551df1b124864182310eaa01aa5a8c7e6a548c4e10f511971893189140c2b37467b4331631ba1963206118c56a56c41e620147031009102380f1c6684364bad520a231de445b4dc6a8449434221d1d8d464644634d24455181ff4ffa1c36a624fedcd99ef146a1aea97938a73164880d8877cb03ffe2588f7ff1ca92929844d6649a56e8d474819ae7382e9d9a7629cf99578c777fbc92c8bf283e183c48f005b6c5644b498ec9d6574e0a8eab26a9aa4e4df99e652fdd054f74ec9fa719034bf3d3ffe7f2361a1f55ab6acf16589a7c9759fbec36a184bedbedee1c8a774d20fdec117d7d91dbf3874e17398b3dc33d407c01c54d53a04be8cf8d3950381a2f0d4c0692ab232018c006911e2efcd05b83800c57329e0ff2cc2882818c8a35e1f5030d1b5018e451a284adc3111850312b2910c7ae2a0a40805c21089600dc10b1668938b53d47471421080b037a1450336c4c1922f98880547e5025e2704256b100a12e9638134216792a0b73072b05885afc00e2a85ca0e64f1603ba04d23cfc078778f04a57c07951eac73f015c864fc6b0faefaaff4675fe5fce78848c104f24c8897f3310863fe3caeac52e67ff3e6cffa49fff37ff3fe9cb1fdff31650ef25c20df6ff4fff22699bb21df19eae3dd595e36a9b91c736a38e6d060bb61925fceb6a4f57a7da54eb3531cfb8725c3bae4784db9a39d5bbbaed8f576ded3a578e6b17ee6ed65dba9a35eea893195fb61958b6190bd86648e974d597310f9fbce6fb0b56a79a04496daa66be3509929ab1efeec2cab2a452abd56a2469f28a8634115dfd7f7f5b8c1fdf65deb7778b42edce93a86ab7d5bc623c9c2d1a55abeabebfaea38454249577ecc36650efad773abfa8c6b6c4c5877750c0348f6f5b0afe7f593a3521353d12d4ffdf74f7cb4fdbfb7fa70388b050ea511dd86bfa7f1fff8fc001a21546a46a55dd3be52550a9b8356264ca481123448c0c3122c4481023408c4819893262646a6aaac81491a9215342a6824c0199929a8a9a325264aa489122448a0c2922a4489022408a4815892a6284c814912244881019424408912044801091221245c4c890a921458610193264889021418600192235246a88112153428a082122648810214282080122444a4894102341a68214094224c89020428204090224885490a82046804c012902840890214084000902040810292051408c484d491591222235444a8854102920525252515246a2a6a28a4411891a1225242a48149028a9a8a8a85d147e029866a80eec91451191f97ff46d483a609aefd63c1b928eaf664e75affea8ba302241ea13102aba7a7dd9ee7a7fbd665c2f3e6be729b052f58c7364d8b43bb73bcf01f5ee75adc497f189ed06e3bc8dfbf9529db3baeefa755fbe4d4e9b769e356fe75d942cab631f56320544ea727be5c3575a83f1368eb72d6fe3fedf0035ff5fda8ccc233147c37fa7a67d710ff77ccdadcebb56764ed0fc7f95b71d310179bc79815bf74e0bac4ab69c2081fa0f7b9b91f9bc6d879446caa81f26d63f3acf9ab7a3faf6e5e277ccde26263eed58deda7a49be4cccdbb746d1f4abeb2e7e4dddd5d37a7b99b7a3e9de1aebff0b20e0ffefd6fdabe7db39e659f3f296b0a3c0aceca46bfda45f26fcffa5bcade8fe0e9f7deb9dfdff01fe5f80ffd7f1ff5bffb55b8d2422cb11c0ffe3f8ff1bff36fe6bfcdf8494523ff8edc2f3b4c02fadc1f6edf5d22b1115b9fc3f046fab61714dcdbb665439a48cfa313584efa07a52515143a4ec6e0704885944aa47e487c625bfdd6e5e29dc9d63dfdd50dab72d6f04a0e6f5ffb7b7d578f80feab3b7ef98aec28e7916b53cbe4bde1dcb05ed06f22fe6ffcf6f23eb7c1672db8cbfe969c7aa6eef2c5dcdb6665d754e4da8ddc19c5251f533e5f789ae9af73c2defff65fc7f8cadf7ce9aea752840bd97bcd9e18f086299ffd76f1be33cdfa56d54a1ecdfbc27b6bdca6f17ee6aede92adc1a78814a49ff8ff4ffb5a3a39f8db78d4ddff189f2aaeb5647e36d62a1ffd3e2b9f136d1cdff33bd4d44f349f6e519ff7f8c7f2235ff7fe56d620f5303a17877cc261e05fa7f00def67bfe3fdfb322a97757cd33d53f5e9d2ac74d95ec9a19d73ba68177e7501be4ff5fffc7ddff03dff655fe9fefb2037b3c7d9e164ab8eddee1138ab739d40e9f9da71b6a874fa834fb7e90a5199f3f725067b19cfe10422447648aec475429a4482905c533b63fdea9758742d3ced35d4265bbdb97435da0fe41fdbfd1ff8b5bef7d6bb6d5bc79a7fdee9a35eeb6e70bbc270ac4b563bb7bf565dcbb056eddabf6ff89c8ffaffdffd2ff8f3a5000a3f468c321ee491d67ee28294d71c286845691ace0c0bd58ff4a696907b924eed03256712487646d690909a9d67670a9d525a4da2f15f1d0b1c4a8168919f138231c6b118f3342b22e703524ab58c7b156c7185eb50a94aa58c3321c2aede8b2c01559937670f1225e91b5cb0257b54a2eedf82b718716b226552ff54aa91eede0a285ac4a3c86644de2c1c54bbd129f1ceed012c301b28ea317f12aa9222155a5a4ea45bc52aab5a5251e15287139aa48758947051524d5f168c75f29edb0ede8e2c29505704555bc9a32854dec8c70ac6784b55af31aab18438703b53a5630b25e55a23094745409e3c3c343439b27a29892840dc9861d6c6355823385091d3a7862fd293a28cdd06113d5dd6fe0c86ac568cca8a812ed30e2d1c5ad71381c1a6589315054491e56b028cdf8184695c888875893a24a76b1a22ae26a4646b5c8884747c2d5967880d5c5c82a126921e1c418642ddac1d545dc07621579782056221e6ec4fa31aa90633770230f375f8b44720a0b5cf8ea82581fe9afc46a3be3a55e9df9fa444a3625b17e4de9ebd7948ec82214b8004656b15230d61a0f0ac44a16a06441172f2e5c5900378e5378b05115d99c888cea143a453b9e7422aa5153eed8a6fc609b42c756aba4155a52ed52afbad42975745380b071f152af906a977a85c403259d88a61c6143aa561e9038249d88a614619b7354938698632baa48738e764c31c23665089b519d3284ada81aed984244d18e2944882399a68e6d4a9c20a6c4e132c58720e24cb1639be283cd8a15ee49a72942d8b80411c72646d647c34df1c146d629726ce3c7b8f26838910425b22a91319810f16840e9c71d57c871dc711e71d192451ceb5813451a945e144531d188c715128754abd56a45d508a96654bf46d6a3a35a13492b35b1d648b23652208a15a98a5b447b6cec643daa443cac50803b228f28303ae2d1492d1167c5a846010e898758511d2b11513dc22256c4e30a798502dc58c72a8a89f5abd548b446694a0e4f8e95b472544522a4fa5bb5dd6b63632daab51d5770e0c48aeae392785ca1e00a0e5c118f4e6a89b8239c68c4432caad52b244eecebe3c60a47694a1f5b0d361d55be7ed511c684c34634458af17b1021519ab10317a21d5cba08b9222b0564455e8aeac780f25764dd8265381c8f7680d58644f56348f12aaa443b8a8a78545023a11455920705589466103d80e5ca884705b54af4405125ab51add5ba545054c5ab9a91512d32e2d165e9aa6654777039da623456a5193a1c203ae1bf4b056415af462858882ab983022c57e4d5c7f85aba1aafc418595e6435da51ab1f430a512de2d145bc1a2b0a6215799c40c4a38b7855e3f146ac1f63e7c08cb42b92c7961969575e845c8d3cde7cb5a068aca5a034e58d92d2943d36243d27fc394189137e384106143cd073c2057a4cf0a28f106cf4984082091ca49dfdd173d6070e01b8d77396c2999e120095c0441025d07056c2972ef490c0c4107a48b861053d2474a0010959086d5185134ad8918366a68d19352798310b63a68b21415948c1041e22e2b81981cd0868481861842f5e3c5186883237c490c604b33261ca6010a809324190a1210d19331f90d9605014221421420e7a44702185326344c840842c84b6f063c6c72c09382f9889607601a110b290220426e284d042082084a005842c40500284227e78c3068416500801842f206cf9e2832ba058e2033b1f04c1e683331bb8d7f3c1173d1e7c31c5f086274b105a96de6cb1b9c045850b8ecc74f1800b06015ce125c9890cf26850c4971fc0bcd920060e9654087364a64c8c980e2e187364a8832e3c40bae2832328403022841b0f663488b094868c1209654018610c0766c66c2121861725fc392baac284243e27e441c14e0a42a8d0c30a6eced080e685346758386b410435635cf8f282182e3018195a2328862c6490620626d82041431135006143d90e6dca6cb8a10c061ccacee45056829bb210de84d1c1cb0e6559d008f1b0059c2a7a70228e123ed8f92108208e7890834310463308d1c21028cc2943440774be1411664b9d30ec1c7161041647184971470f1e3b480091c49b3c33884ae8e1208db8841e0ecce8e160833d8698c8a20926f810d1e78d132e3c61068a0d3688a29014b72ba6b0e9a142083fb71baa00c3068c157ac09881d9e08a4358fcc962461f2d8cf81307500d5bc84093819e2f29e05ecf170fbe7419b94032d4858c3f826438e185115fcce861d00c368464ac0086062284a101984231d20cc508241e5a9a626989e19111590070a3258315b66420860b00615c60638a2e476080e6a5860b197821a381172f5f6a080243038a0d6c477060eb210c8d18ca3028410c061c8ca151a883db151eccd8f3c10c2240b8b909a105b32e6544e8a201191b1865646031828c26ccd09843020e25a439bb2004132ee872c21728ccf09302122ac459618633344c40732b4bc3250b0b3302b5d0470d1d17debc40a305186e64d66cf912c38c42326031c31e3644d0607b53c38c176c386b2363cc0d5ab4e010280728dcd88e7833238e0e316cd8210b0b687ab294c043960de08431f640a38aa33831f6f870c40f48420001470e0e4120c52004129a12f40c4118e208f77a861cccd133cc20290d87e405116958d0c9204d0a5c5a13b83b4763116973c63a19a4c1496b33da4963441a9923d2bedc2984270b249a486246117966a029b1c46609347accec39248689435d9a10c4278a3e47387183f3440c1aa0381385085218fa3285212a96b6f003451578ac00e20a193760e142162668f1c19f4219002ab4458c3f81a0e022892e8610b4b4831749347ca1c4c2a014089100865918630a81190d85d1e59051da989624689845962329b41835b1250f9722232e5002a20b0f18e4e085860c60d020cd972214c0188db041d2180e3420c380a1a52c0c3184048d21f4a703427e3c20e4c40784960081d011211022c28c10102210824386909b3284681881d00b66089d2181d0590984c89c11f2c004421c9c40e802148ad25220a442a0158cae386314051a2326d224c1829d16e6a829fac1851d5e6803430c6b8c58882105194898a1c88c0d52181a32a861d0161b0eb52174431738fcc9c10a3752bce9a3839e1d9040b3c3c31c384440f4c0439c1c7ca0e10718804823078520cc085114c21063e6106d40040674bec85244187504d9f963441547407187093c4549206144124444e429024209b42596c41d5ed88063d263b466dc736676c484175ebc18360148909f233e82f2d4c11dc9a9f511a4c3483a91c112826a1034439af189a412a0f8200a4160a410a4650a2442546ce1a78a2a9cb0e248892b8ac0c2872c72d02229863f68002195b0c5078192be70d185962e9008090ae4c5155f4431888b3b4544e08c7e3822f4068ca518704868c2382b6466888b0db8b8803ce467893f73704a609069455d0c6b80b22c893b02f9d172d4674b0634e81c718973c19218884d9a4024e070bf44200f027919bb8081ab79814111202f7d70569632a82da1c198e70b89078c0c207046681be4c001920c382217c2902c942d893bb65841cc98c298da99e8c5f64b6c51b6c41618e08870bfc4165a70625d5a02501aa02e6a1fd43ca875501b5313532bab85a97150dba006a6f6a5a6412d839a971a06b52eb50b6a5c6a5b6a5a6a596a43328d3c441a220b916190609084c841e417a417a420b20b920b3210b9050988fc436a41664162415e415a415641fa21a920a720a520a320a1209f209d20fb907cc8264826c83da41e72095209320f990489048987bc431e411a41da21eb904590744822c839e410a4106410a41c1208f207d207320ed9030987e481442377207520df906ec81c481cc81bc836a40d640d240d241b720652063206720d0903f902e902a9866c8164814c43a221cf902b902a9029902890279026906764092409a4197204b20c498614813423432041203f203d203b20c79062c832320cc901b9010986fc426a4066407a213120bb9017905cc82da416320b391cd3c643a3a1b1d018c608c648681c347e317a310a1abb18b918038d5b8c80c63fa31663162316e315a3156315a39f918a718a518a318a118af189d189b1cfc8676c626462dc33ea1997189518f38c498c488c78c63be311a311a39db1ce58c4486724629c330e310a310631ca1981187f187d18e38c3d8c70461e46b471875187f1cde866cc61c461bc616c33da30d630d230b219671865186318d78c308c2f8c2e8c6ac6164616c634239af1ccb8c2a8c298c288c278c268c27836963092309a194718cb8c64461146b331841184f183d183b18371cc28662c1b2f18b98c5b462d63967128a6898744436221310c110c91903848fc020419e2192d8e4892249f24ffc927ff9f0423254f1e9b9438b6e76185690a0cb6a7232509b1e6d933a74e1c21534a0154bdf37ee9a8d4cba1d4f2c947e6b8ea74b65fe0dd1aabfcbab5db9fee6e8d856dbdb5cc2acfd36295f502b5eede251a4c87f6f4dede795a5ea93b4f8ba5bbbda75a6ded698ce27abe40a1f5bab797d33d97bbb7a77b19e7f23d3b598a511c3fb5f6ea2a39bf3c5e4ef75c2f17bc39a77bae3cb54675badad3a7e526ce9d5aa3b972ebde0e7881e6b6c1bbaffe05318abbbcacbbca5ca933b770baac3346715fd767d11cdf57cc769ee376dfd2eebbd39eaed76751bb6faedcda560ed479d7ebca0175e729eff6748777ef16783bc6282e6bac7e39c7951cb5415eaf54ad2f5a7910a37c638b5661c7264eafe0f34a803306e67aaa734ee5f55914c527afa7deba571d9905e632cee9eae5509a6a69de9ef22e1910f7cbc31bad374cd77996ece6b6eee574546ed7e9956abdeabdbddc357b4e35d00291ea97738b519c12216eeb7e40f57cf1c9d361d462744cf33836ab905f5cf6cbcd6cf7c53de1d8c59b49293c7b3d6d66fbcbd8dc5af34ecdd35d6ff472ddb3f84451cbc3dd02754f6dcd4f5c8c577bda52f17e79ede97a5e5303ab2fe3d3661fe63c2df9e53f84b86bdfcd785b20de28363137efeefa4cebabc26eb78f6f79e1aa896bbfbc0a2f1361cea266b6db574afde0b8f6cecb3bae576559d627200a5cd5272905ae9a7ab666be3c7ecdba3bae4f57f9fe1ea8a57939ff55a13daf597d19a7e6fdf1387a79643f8cf352d2857bc2a45f26b5bce94daff4f6edbd9bded40130f3fa7c166c5f73ebca359af1dd012bbf40dceb3d51dccf14885a6017b71c739d8ef39b75bd621698ea9dadfcc4b65fb3e66def5975afa7d66815d36339b2fe55668d6b6eac8c52bbedfb96e6e53ad7276e9e17dbbad3e7ae9a36d7cbed3dbd6a69de7d7b4ef9d67b5f7de60b046adedd5bb5e2bab5d953b49ad99e67dabb66e7c26c6bd6dc4a2e774b7e377ab74e576ddfcafceedb79e9ee7ca7cf5ded72f2c540b595dbdab10e8b89aef633b5bd6b62558ce284bd7baf4a13d77e4d9ceb97f7cb73fdf2ba75b763b8f32cc7fce6ebcb097bf7eecc0b9579caf3e559f3ea9425595957f5eefb0bd60de42a75e7fc9eb9caf18f3b1646256b5eaeb775e7ddb1aad375bdab19d77a81965f1e3633ae3d7bcf6a669b35ca7fbc94575eefeee9f2f4de31fbe375bbeb3c63ebb3c21ede374a3d2f3fb36aa9cbbada7f3efc848beb49e7946b121defedad7b4fb8b872b9ceef8ee77af69eb90d04f29eae39b781c0b26bbdeb132eae8a51dcddd9ab5fc7c12d2f5c2e972b3bd9ed59f3ceb477b3935a3ae59d7673db5fe5b8e9dc598ecdca7bb896bef2d6277e62dbbb9bc7c5b60ef69bebfd756e79a6d57b57ef4ee7a6d3f2f469de8e5e1ecfd6bbabc2336b33dbbb73d2e9cc9bb1ed3bdd546d35b3ddbae7b4665bf957cde58457ec9e3b7b623ba6ab2fe3a76cf7af9b97a7fceeb4a74b6a9975bd63f8ac1cdf5fefb65661b6b5bc25ae4fbfeacbf8eeaaa97ffd0275e5179f7757d3dece2dde3afb70e51768b7452bb755d7f5c97562b6d72d2f9c2fd5bf5ef31dbb952a0bcc49572d79df1abd7b0ca7572e06ee525eb7e6fcf26eae775b5ecb9d9a55d871f5652c663bc7bdf2abfb697978ebcef1ef4453cdab1cd77ba6a606568e7fdd67795aef89022dd9ad195751fce3fbe6a0eee9dad37aa3d5568e73c28eb7fef5d4767d72b29b4b27f3f272aa73b65578566e834d95ec66735b5fc6b95cf9e369f49a579f65d615ee2af5e15e29ecf8b439ed55f36e9c5eb91bad18b555a7abf70796b3bf5ec578f787c54bddab70dbb17a9e38586db726bfbf8c6fafecf9ee9df2eafdf5255578a2a82dbbce756b8ecd6ba6278fff78f817ac17a8793dd5e9c9cbb8665b318ae35825dfb7675cd3fd43b84d9ed62d2f5cbd3fb05cbfbe92e3fbeb77ccfeb6ae4fc2dd562dbb8fdcf1cdbacbccf6fe3aef1c93dddac355e7e454359522e1dd284d17a8bf9ac49ce83216ee9b3a5085578cf3bb4dd39661ba6b6a5e2ec5b6fa32bea669f58942a9408e3306eedbaf59eac230155df066dcb3ed3c6fd57e5a6ebb3d4fcb2bc374e76979b9bbed8e8a8a8a4a47a5defb55cbceb3bb67cdb355779eade6c53dccbb28afb602f5eed5f3b4bc6a2b70ebdebe5eb5a768c6d7cce5b8f5757ecd8c7d786b8ce21e705262d4d67dc5b60ee67a3d5d56316e7bfdd1ebe97a7ffdabfeb8f0365062d47ed5f2a2c25e8557ac2a508376737c2ac9e56ef7953c7cee52b49ab76635c1617d55f3769b6fb7bcac79fc492d79d54df57aaaabb672f3defc25bfb8e3d3e67d3bd9b578ac9a976b94ec56e115dbbaf3d2bc97d77cc7b08fa755789e5673e115ab5963ce2fbfbcda7a7b35efe5155cc124ea7f07581714275839255d509c3cc92dc93580c3c2ca6aa066fbeb75df9c9953bd2b4e48295546fd10b33cde151b1e89c3619661d2f07f38fc71f8e4f03318fe972fff498ff4ff5efe35183ed270986538fc32fc1f0e35f8a196ffffcff2839bfeeddbb26ad06e206510a932ea470eeabdfb71fbb3292954eb8f5b2d9b124039945fa0cd9d6751a0c6a2a2e25d53f3c6800449ab72fba2641628c6d3e76e9fb6eb9e23b340320bbcb9cbedae0a489014099905660d06c4faf2fb7a712a2a319e3eafbecabc288a77e754406e83484436b6abdf7fe7ddbd35af769d79ad3d5c2bc7f5fec0ea115d6eeb9ccebc577c97bc63203e7fff2ffafe752f6f5dd36e1f0ae549e7b609ee386f49804f9bf1121ee619ef4e96253c511407bc9d0bb9fd79edebf50f666ef57b9ed6cbbc63fbf2fbe4debd84c731908a8ae72ba67bda6dffbabc6c4f7bc577795a9b15962fcbd247bfe753b777fb6ad75db5e4f5b4f64c79a7e5f93236735aefb6f53e4075deb17be62ccf7677aaff87f2b605dc5859fd8fdb9fd5edfbd63f5eb5ee3f6e7f95eaf27dc7eeae7c973f6e7f56352c6bccf78df2f5ff09fc8b5b80885249fe45192291ad8a8ebdbbf3f3f29a04493531100a0a6a9772283193ffe8dab462a746a138d4e5d91315db3a0865bb352d362f10cabc3f6e7f39a5a2ba3ebb75e7545417887b4e375954552d09a0af543a5dedb6de6e3baf6153f5c8544aa50a09175aaf7b7b392eb428e7f6e43d20c3ffebde964408dfa579e2344aaa04f243f732fe714fcb336ff661ce7fdd7a99e7c553facf876f70df3127e6cd509698f68a03a9a8b8e5fc72717e797a77aebd742f6f09b7eed6cc96ebb4fba24e4e0bdcba8b737b6229f9f1ba453936a9a878ee02edee71a1f5d25dfc4e517272a4cf0153de76a4ca7fed019fed15f35df68c351aa42c5246fd90e25dfe47a8e4dcce6fceeddb718e77510ec5bb63546afecb2080408daa4976d47e79afa7898a20800002354955357394ff5a0e35176a18d4b06a5735dcd78418b16dcda16c535dfcd615e27b4e35af26a9aaf99eb9debb67ce3cb591009d9b354912dee6e3d9ff0fdf5644ce14b02d2c9c170eab22a96426fe1380186f44fd8f538838f1ddfaf098cd50f7eebe833a358fef9b337e40982d97d660ffff645f138fe9ed651de059e3cebb6716d76857bfbe6d7b695ef35e1ed9ad7cdfaec7eadd29cf59448a887ca5228b6af259b03dff4fa56681e1a26c3df11ab2e69f4ac5da5ab28595e5f5f5034c4a16589713ac211f0c0163dece4bf71dc31d03f1468598d986e421f6ff9b6a1895dae5640b0c87b5d5c4cb0be7c57585398e728118ccbc12e0d3ee9b2f930bc46058605086e0b6f4357114b2dbef79c1bc78785f60da0596f59585d59505c581ac2f5fc6bb7f4d2d0183a2240b0cf7248b0b4a5756135cd69327595b4bb6c0bab2946c5530ac2c06ae9c346902a52b0b0ccb0993aead27605f156cebea4916932cb0aead2e5c5613274eae9cfe1febff9534c04094ffdf9aea7528be8c33b6c0bb4ddbadd6edc21d13f233149f05bb3b60dae5b360d7d45c3e0bb6af69ef937dc79c38f165bcafb99df4fb75bbe5e1134d95f4fbf5ff5935aca198d80997899d9c9687b3ce969775d7ff2b799fedb7e38c7bd7cc5bff8ff5ff57f7ccdd9bb7965c2006bbdd2af97fdc0259e38eb946ffdfeaff6bbfc0ff9b198b6dbd771690332652f8810cd4468868230b15a305a69928c88ea15187b1a9d7e9813386008311a2213434c4094a1de23d810812861e9cd7722a33e210d27c99ae2b4806844de21d0222832030448cc28298cf82ab7e124e88f18b02559f830b2023142df83cca278a97a1888bf883952d46130a391147f47e8e8731512bc60ce31335a48974ae989167487210857ecc5e44737a2b4932481bf9cd1fb1b99053c850109d90a1c75701234df4e02a8f98444eda8b79acc6ee46cae36084d2f8c011467e012b671f6665459a98969646a6a56151a6c327fa004c134780428ab412069f0b3b514f0e9ffc1da601c6049890405c410aa451862da6d8b806e0e24dd600540c01e13bc0618400828ec8e285a5315f2b3480e8c4c5e3b009096218499cf9374bba1f82b17c181c66c42e411831ca385b1315658b228202f4ff19777ecd7ab5599d9a2e6fa79ac761f35fa96c5063a0268012fb4a9554a97aef9eb526e9facf8777adbd774fddfdf1ba0526d99124c9ff233902f564835afaaf1cff3ac7f7d72b1527bb269591ae26b6f25a7df672426c4201d31c55935455dbcf6bdedd04699517f26306d4f2f8ed5d93b7b346a68a101922240810a9a80734d4bd11d0e86b5f4b22bed1996812dd44a39f21120120ca108f80d48a3ce9418d00a3f1e888a8468ae2df18cb1f5f74a0b680f84647887e4691f8a2281211091995c61745911cb544d1481c45912c92601447d16804e089281689463f8a314a722c2a6a4aaa626d1c6b65624d14c72451d028223d91581bc92b8a5646511c8fa08c3a46712caa8de215a328168da203e20d5124c7a31e884823192200a2288aa391d1c611299a1147b16814c591cc89632d0949c8b824561d89443dc824a2d138d6a4c8a471149d66101127a849292d21bdc6affda88258239b6a44a3483ed107e213e28f6fb3d9c451d4423c1a1310c591681c49510c22428947e2d2388e631196e8631c6ba31845964a011c2120c6a091630c41241a03106b2229fee835d624b1f6232efaaa1337207f470fe25bfd309262915833126388a4d9381e5191e214298e63ad8e4b484d2291281a45d5a40a8812c7a4a2a3d14814a9c471d443168948638d1c13798ca928923f4424a5513c321247ab918091807100f2c917678845e328c6a8d9c8da18c0388e629158eb89483d4425a25124126514d1316e1929218de2ee68c968141d108f44911cc59aa8250e301a1905189546a3914824c5511c452a7180516934aa892411298a4544526c1291c42551148f88048c49a4917854134751a412c522004626b1368a4435d1c8a82492230122498e636dac8946c651cc31268948e2516d1445914a1c604c3222c5da514d14c52255c491c01112520122911491c41a0e1109894a898a0e0244036ae238168d4657b4d98852d212c5511c4551fcf1468f3e0458444053b4f83ac5043f75a6ec88028b07ec132f4071a2cf83ed58e2bf4cb073bf6c11ffc40437669eecd04e1c30c10a202f2bc4aa89090470a16505883262020e282356460b459c88d1a3c88e24918813a22122ba341288d4435feac220e0870ecdf8d46705fd54a31250e0ece94f01baba5440bd41e3cf6a84bd8e48ccd7da967ff2ab78d99cd0bcedd6cc5da0feba5977113973b2fa3f2db6f5d771f0c771c60cd89a06fd0baf58e51dd7bb75efeeaaad6492ad09ddd73c71ba83eac0de92b735edf89b75e5a9c66377a3f5feee890235aff654ff3a0e56e1eef956d4026bf0e66aabeed5bc61ff5fa446658224a7a7a4a6a60a6a05494f4913d4fa5427a8b5d6eaa34fa5f291c7e683cdb9b33d05fa30fbaf54e6ad42d3de7d5aaeabadf7ce0a927df8b45702cc7baa85b6c9ff03c9e99e43d3dcff43497d8d1c5f3c20d0017bdeccb7f674576bb7951fe0c6ccd77680060790d5b3f674bd5bf7b6edbccaff531d80653b00c901489ce630f03ffee9fa1fa118cf91c818a40926c43d6a5cb01263e87d25a8c25dbd261ec366d5bd7614787bb7ffff62120c4e52442a122455aaa922a95581175a60214d05ffbfe56d3bd09eef32e578fb9ad4665c01c20e19073e4125949082480840cf183650e84883845ce24e901b664600d306278444e3c0370254044ad2c23c912aecb0230a2b520d133f7a905f864a1a88408233455c200089aa69aa4aec8e74e1c44442a1c256260c13465832b3441e29634b418a2ac44839d53a05fcb1adf00097a74264d1971638f85383d50839ba18afc861ac4993332928b16131d609a30c054aa47046099228c61ad02861e7ab0a143380b0672cf3c4190d7b4228208aeace98c50c0008b89860c7179f39636f4ea553e6882a642ac4199b7829c4c58d403c704fb819a56cd8b3c31758153ad0613302e0c50f64360a66255451231652a10c1c217a8c80392005d189269694f04684b31c142388407c90009b2a608470368307a21a3943be7c900342581230e2982e54ba8ca152c607385cc4201bb0284c10328123488158251012d9046c2a10bba08b572700511081cc9f2003a7e86309510b3307ba8115a618630c177e5a41071552fe03c5091b80d0d59501c8807d9e2d401c7190a385aba7c9bf59d3c49d0223c705342764c13b41ea4e9c307cfc7b29c1890f046e90e19125e481788c984aa1852a86bfffaf301600a133811555d09f420b81ce044118d998e19f802c0b18211be40112977fd205b22b7c50b35b4af3e3e78e0ab6343a2358154a9bc18e0d37a43c11c07dea224d04306ee620692f2f73b048b3c08d1447e6985b8e2ba248e319c28086405b5e08197bd2b658e8d14304ccc71c7127ad8ca28a2d4e020a1c299a93c624c2024ffc5067022c6ae21c2244c49a03a05c29a91adc1ce2a3c111a0413bccb021c6e6509c1b94a01d844153a6083587d20c4a932bc24bafc083140e855981cf9b12da48d126cc08873a1f42c11ea893056f3c380401085d17801183030250c01c5a200837693a213c447d7139740006bb1cd14901035f28389444030d2ea061216dd8a61bfac3c513833a68a2872d10380de141a1859e9418b925bc300de1a047cdd9a3829d0a5caa183aeb40ac043a391c10040860862ef08109253e721c41040e4d0c89719173878f113f2c704489212f19a67c61243044060e90181af2474892d98d04d44821c4908eb32e451011c20e2174f164e893e8170c7180162a207a149aa20c042bf494969913010a0d01c7e60111ae30a214612a1483162434846135d07960a910082fccd9126345f6054cab159ac08a1178040dd0e2cb10850a593357d4847161852068e8a2d092231ca8d2240585cc162c0a3d6d50a70017cab014421245a19b0e51c4fcc18921b1b4270c2fd2823114d2c1cd1e2777c2d8d3027ae80610647e10e2ffffd09c30789822471164921c597cfe7fc492ef4966812395a85ec65db64bb42262057e9451a50e4278df167de3a34a72a67cf7c46378a3b7dbd3f2f8ed588eeddf342d16107ebeeb6c56f29e2fd0bc955f4ca637b06add81d02ab98f7bee70b7281007c411efeea7f3b4b5db1eae4fb81ffa544b76ab7244a4d27d73d0a29c8a0aecc7add6795aac1f7e3f58fd507d18f4ffa669e574deb5e28319f08e691f501fb4723ed4324c1747d0ef14cd5d2199dee8efc7edefb477f38c73554f554f5454555e288ab349489eccad38505f86e98237e7fae5ba97b7742f633fff543ab4ffff8cebc1ec51fbabd9490f64a8bdbb072db387dac33f0e4e9faabbe0ac81e3b579170cce130f7eee0df6bb03dacc039adfb79fb857b9dec683976fa7e84679bbea7d25f89139be7a1b1a17685cd8d0dafc7f19e56e8d85b3cae0d5bda2895da0e6fdc826e6e1f44b0891945f9f45ab7629af12de0684574c781bb8a6e6a11d7d9edc0e687618eeb0030e1dfaa439f34aa0431b32dcbb1bcd9d2716d3c1eccb309dd8b6401d50d4de5fae5fae43925cee9a3f6e7f5560a8ee597cf39e2fe6e15e2fe5b65b253da71aab779ff07d8129cf9a6777161515188a3bfac64bbea80edefc46ca9b263783de4d9bffd29731d727af727cea1fbffbd7f9f5f9525e51dcddb889ca416d765eb98f8e6d39f4f912c51dc59d6777b5e5e085ef8ba2b89b50d9f22a8a7b0e3f14f71ca67c785739ce4129d5fbe6ebab5aa33887e2fee3568b8a0aecc7ed0fedc7edc97130c301056a7e833687835719a60bde9c4371c721874312eebc1be5c7add6beb797e3b8c72fd727af4ce9d42f37cf53df60795ab5999e29bf01c7bf530f37056f9b3cff4e4d6154daacf9bf626dbc88e9d44ad566ca2b4e57f67cb305da601b20afcdf46bf715bcb9ea3c2d5655e5b682214142a6afced3f26cc8d3a60cd3716b835919a6135eb15cbf36fccc9bd39c36536ec3963653ceabb6def73c2f3771cf97d720e5bf86a8ffafe1bf67d406390d3fd0302c85bbaa7ba5c18b8626a0bdbdfa6c66d3a7342f9b323652b8d834fdff60539b41cfff7fbd6d062fa56e861fb7c119847c69dadf0c4c32c8d1552bdc559d4d06b2d294c14b061cff5fc6d0a7ccdcfe9cd86230fbd2c6f003665c0c5631d89e87e5e82e6feb253afbc3adf1629ad6b6c6aa34efe665ac33b7cc5b6d6bb8b0874d0dacbae360f0f3258a7bc5c18086da200c655dfbea79e26090f2ff250c535f9af7446d90c380e3e74bf50ef7829fe0ed7ac1ac6e5d75ba6a83b7eb05b2ffff17acfe7f6b1df076ac73c18f4e0999e5d26d17d05cf0527d59ef2077418a0b53a80dba60fb17eaaca64fe9cb6ada7c99af98ed4ab6aa9a32355effafa6b600e8bf8535ffdd6eb5306cc1abe41d73fb6b01c77f699ad9b200e8dfc6c29ae197e76979fba2fd7216bcbe64a12963e079e2d20c4a2327cd99bd27bfa7def502751ab234b50a77f70796c6f65f3add73677f649d9b2ac768f294be8cd1ac41a3fbd3a6576ebd3b3438ead85f306333d5b6335eccaafbfd819d89fa2fefd64061b69ad727f39af677e6ff7f649debedf7bc26d60a72fecb6c956c55e0ed2b90fd9728fe71fb332fd0e67a7f602b68fdffed3eb2e5d5159a4ecbeb06debea5429eff075615d688f1f459b90fe0ed5b2a947d9931974d05afde69abee4a810bfbe3c0dbb190cc02ab794d3c76795809f0760cbc1d036fdfda3d13efaa388ac1c82c178ac180b76ff5aa9e311712b2aa2a25f5a967cc65bb35f7e63d275f777b09af58d5171515d8dd69efd677cf6b026fc77c5f61bacb99375855d5733de51c3f8085835555682aa675938c81a6adaa4f55555bf5898a0accdca2a202abdaaa4fb633b4b3b2335d4ecfa61e88edc93bb309d39d1f8ee29e135ab404b412cc4a404bb02ac374b7041c0fb4b793d02747429bcbcb74bc8d84df3f095665988e84bad39d9941779bc1f1363368ca309d50efceaf6906cd9da73533f5dc66e6a80cd38dd0e77f8436ffb611bc7c19a6bbbcad7b2348f91f21aacca0ffdff69ebc3272ca949561badc7979d996f9e5fae565acca305dee6eb48ced2feefba27aa364007dc6403272de0679ce4606cd97613ab2cff5cbc96ce570cebc1bf36b56fd3a7e0078fb564e7866ade4667c9af69a55f50909ef46a9c25d9ead4ff5a967cc0524482a3cc92c10783bde77ec0b78fb16bfbc0ac94585603d63ae8b0a7bd5e5e1ed5565e6cb3907de8e71fcb46355e69692aa8e81b8497d32af99537d65bb35cdadacabcc2de0ed5bc0db71cebc39a8ab7ac6409c92cbc31b9bb6104e5c08361c087dbe40c0e0ff4f6b376eeb8ee2cde3574927bb5d555548b29090e92baf7d73d089f036404505f6ff3ddef6819f0fdae4b23dd10f2aa8da4ff635f735f3edf5f4f559af1cd4555548b24e9be6ad9eefb6a892ceaf0f9b4ea8a87edc6add6e3baf42c2bb51f8bea6bd5aba97b73ad768581490302041c8ae993bb0f3ff1d60d0b17937cfd641d37f29dcd9c65051058664eb25ba03f5eed9c6a060f6ded6a9f5ce36c6ea53ce71bdbddeb58df9ffb2e3dd35ebdd37c87b3acfff8b89f35fee9b83545462cafe5fcc6fdf1eb7419c4d4c9469811df330ce5636a8ac4ec2b3737bcfda6d53c69599fd7ff974d6bb35b03e655b7b967777d5bc28aab75926e54ba7a66adaca8e4edc735acdbbebdd092d304c9fffd2acc2f34c7b29afdc0671ff3ff5b630675a7877952b795b18af9e2d0ff7b20ff35fdf3ab883f5fec0c234756bd62b34b3beb271e0e74bf3025320ce1858efaf83d9385863efb6601c78296d1ce8bebc1c57301b07b572fce3d9bb6bbe7757cfde833f30db0679febfe41cdb3638cb1ae39d6d03f4ffcb9eea2ab4e8797ff56e5b6fedba6b83a9ffbf59df1f986d03a6ff2f53307d6c60cafe4b13efaa2fe36ced89de1dd467d5baef6a3dcfb4721f26dedd1f18182b5feaae2a30243d274082a4661598a32b01eef36ffbd2e6b45fcadec4bbdcddbfdbed18de682e687ffd8bd5ffbfb087730a046adeff0ff0b62f01fc9761ba8e79b877cd9c99d35e95537d6a126e8c925df306edaf9b1aef8be63ab7e779e29e717a655f2ff306752e6bbd51b26be6ad27e6a97fb9ac73bca3f8f2eed6bfa0284544c400272922a9acaaffc70d911a7176878d3f0069879894c58bb765c1e26d59921020060d73ec6998103c0d9381a76126791a2690ff5f8a2183090f0978c43c131e2ecf8467ec99f09c358c988cf8f14c475431d9419fe98822cf74c4d3fffbb85123490f5f23090b5f2349075f23c905ff7f2b3ac243e599f0783d131e069e098fd533e1997a263b411ab61935accc7c0dab2f5fc34af835acf0d7b0a2f235ac9a7c0d2b24444c4a7a3c9392029e49498ea2a21a3d9cf0357a00e16bf450f6357af0f2357ad0f2357ab0e06bf420c1ff232dd1502281a7a1c48ea7a104d3d350e2e869e429f434f26cf134f2f8f97f25a41a709ebe069c02be061c00be069ca5ff472295984e60f24c27543dd309479ee90421cf7482d3339da08306139dfe4c7476cf44e7c933d1c17a263a446c59d4bc2d8b096fcb52f6ff4c4b454c76aa3c939dae67b273f54c76843c939df299ec20f03366301d81e2998edc79a6233b3cd39135cf746485673a72c2dbb268f0b62c5cde96c582ff5faa41c5e76b50f5f035a8d6fc3f138d251be5d3db782af436ca1c6fa34c7a1b3f0ebd8da6194c544a3c13d59b67a262e16dff4b326c3cf1781b4f34dec613f93614f8e26d38f1791b4e81de860250fccb3812c1d738e2f5358e34f91a47947c8d230b084003cd99a781e6cbd34043a614a3069c375f038e0c5f03ce99af018784af0147ccd78003460028453ba6f801208708655f3658e16524e90c489d3effff474f4ca0ffdff31d33b18eb2ef795a2c27e769b1c678447171b271c9c18506975a20db163f4fe8b943440e3368b9d1429ab6c52c4c05635b803ddb58536e0bd796ac2d5529145ba678b7be318efbed3cf34a70ef5e9235b7f789796a2d2d7dbeeab6defbe67a8aea6c5a2ef89b35c7bde2b43e2dd1a2c4a6458779da6e7b35ebfc542f507f6933e539bd3cb528aa75eef98edd5cc7c07b6a33cd756e7bb93b8679bebd6be6f6f5f9f0eee7897bfcf614056a5eae5f7e6fb7269a7e093b3e71877277f60a05dace2f1083e1b678bf9c93816d2057cfde261bc825e4d9cdd3c0abe4c4bc9c6aac0bd45828fe71ae1fef820977caed7dd22fe7da4cbf9c00b7f8e5e5dbeb39d142f1b984f39b81daccf689b00bfbc53cfd15657f65dd7b7a32b93e0bc4777bf930c7fd4cb9388ac14eadbd84fbf6ae9b70dcc56f7a056728bcf7baf692deeb126e7bda2f14ff78509fe75d72b7c6ea1c37d9b7eb285963ae8b3718bf57e6897f58d6cc77dfde7d22b62df03ef18175ad9ff832ee3a0ae6f8bc1dff1ec81a77cd7579d9e2f3e4e7a9bdee189679c5b27d92a1746e978c69afcb53eb4506764dcd757bf66b5f31bdafb2b818b76077098ac5becafec5301cfc8b1bfc8b6034f8173310b778f9173110bb5cf02f7211b7a4a5a5a5a5a5a5a5016a62460e3406d07fc204010051c113f5788e9c15d9c0ced4cb39db53c1106fa4bc9b3848287959f2f3318cb0040b0c7cfecf0830e6461822db9b39f2c6ac0a2cff1d0032efcc1084d67f918ae106739fbd962fbeb0b05d4cfd0446c89e28a3baf31c501c548204d83c1080ad21880898f33d14b80432dad5d78d01b3004b13300fc11e2ee860c01bf4502a10944105627d2fb42ac8a34e9c6f00864f21893ce7990ca9e1ce55076a1eeb2bd48e1e4fbf401212243912b8fa235e4c6c71c404fa22746878b3400c805e881620597cc15be2a57c65d072809ebe9ca010102b74e1f20ab80953351c63be130235f0340fa647c0864285b8d88285ef916b90545468e2792c1902184505565fad72ec48a00a0e4f80945ba13e6fdabc0060a0307a20b23ec79e3c32b8a0078b0f608914dc8faa26fe06107c8ef492d81e00dd380645e8f336625819ab01c2f335e820f102173c424f03851b44e8a8e4f0b70c6c79603077781b161ad698b1b2c4cfe89224e3811d6c2fa34cf5208532023e860e0168315507f84b5a1840c83c7467b89480f0bbbc1860a8b4232804061e3f9fe403027e50074e1826f1786202bb1a3e9297233890b285e68f067d0173451a3c7f840a1185094d8c86465bd82e00228120684664508833f49802cdc8a8ce0daf11005915993997649981a215197982fde82d56447a0c8812a706054fa4e5022da810466844503d5c6080869f61ad4f0c63c4806133ac81e084191a57d6a0d51cc867462c90fa9a0d800fc29218c08a34a24c9530b644e9439ac1d98282105e86e40e4a92d893b44a421500c404a73d753c04a88999f79d8d76c864902a81e56c5c215011e9017cd0460bea8811800a297e9c12630511aa30a41b877471aa4097ea46261c4fca08d3acc42e5298a2c509351493589292eb5256620e4214987213b446344184c068cc88a1e80582423f6ed012255e713a21f844034391ca0356419af8b0894b8a0040ca53af4c0c524109759ef8d1893bbc2cf0b323ab23da888829b1a78733f10be811f61b327c4061541912436ef84fb87921852142a08f074a190e3d32987a393728217b02407d377ae6c8204a31f531c4e0c419d181e19f899a8281244678bd99ae261248c1ca790f465e17322c69fa2f57675bd69059f35b8cae24104083b39f406b6c4a159ba6e787f8d88034d83cd0000e0a45f1c108df5b237e8d1933f53a126a68a1c120db43e047245b02a8cd43f142e54f7d53e7bd24309a00cf973bdf409b2120f46842c833a9d2ed3f15ac79aca32536541083975fe0460510890664fc91072c20c235c5145f040f16196000238a17e205041f649246782920095e779ea8f36596142e1a222bbc023c38c1c01310b4bc9302365c01060a003c026e648803029a96efb1b370c95f58781e0c78d184a11a515f9514090508ca7902a8c0f1624b12035e80b22a3d6ea052fb1c7d06c001c103810f604bac0a18e6f93784e8a14e9101623c003b1ceae814d0f136668051430215be7c0d3b0b7cb91a14e469a85005c8214ce36f5f80fcb95a5cf1b62c3660310b32fd0c0cb2b0804615315ec60854a0395c59e263ece003153abc78f24b7f6a504190510abfa400177c7297ec95780f633a2011f9a41fc69c10b185f94906f8d028908a79a40c0a49f0c29e20fe88d009582835d0e68faed84133008bb4370a6494440716b47923e1106caca0fae28d8e5a40fad123f24524503149808d0a5f44c594646a088d27d2a3049bb42f5a9e688b140e42b5199e08ea8702acf89caf39b125dc4ee8f0b510d00cb4f84c7dcd014101a82084125fb37da0230f19db9347d0f8d18121cd932200b9c090929427773a00814821ed49282d5480e030e1c7342eb33354a8f9d14e20075ce042e8c73359beae1e757ec442001301a220f3e39428714ef072e1c7214208ba8d807f649a12c300a5265eecc2092b2e70007931892c1580e8c1f7620e566c94104190174d10c204a4818417bd685083164594bc78258a065c08b0f422952c5974d4207b71891749e4a912be180405233619f85edcc1d7a09d30f6a2ed810c7448f1c48b5fd5844b0a41feb7c0a1c6091e0bfc3f91074b861268fce3d15c4c0da6fccbb10383152a18f87713e807034610f41f0310587469e4ff4c16122f46f2dfcc4eb41d91fd7bc074b37ad4f8fff22526cc09f9bfe506902f0cadf03fc103e9093ba4f9ef4b61f8c824f90746e1996394e6bfe7068b112e48f8d7a5b93307b5f20f011736098848658d7b7aea2faed1aef18e8d135da947cc5bab2512e4c4dbc6ac440b3ef81d2123c48b1698993a327ce1275aa0a70d550b4854118b531e23769cd0885830309b2244c34fc45248ce9400467811871b7815a9e2d146cc920407111d9c3ca2961b798660c9d346dcb2834cc899214022176c16042dca947841188080f0d1a18a18f8a95269281c891ae0d648d5aa256ee0a34fd40240acc4b21a8ea02278004dfc60865769410c392299def08719601ff12c90d6939b2ca6443485fa28b047461d51863c5e0984f15526eab0c5a0047200a588440881e664243814f91cf2d324e5cc8fe80514343e8232f4196f6fb41000214e9e3108046807d0b0449bb1ca07688f3b837e639804d018d0850cad9108233a036a542b3280296878000132458eed50678703487464155f792abac44b2d8d62aa80305e6b887880a111f00204798804392156406695bb199f59e780b877ef2e93612036539b3510df9ddd65bb7d776777be8cc5f2be639ac9bebdacbb8419279631cff7c7eb58eca242302199de5e6397d299d83a16127f98247143d08730fe5ffc7245014e9b08490bff2f6ec040597df49084feff514a1146acc1c1078f98ff27d72c6900a603062bb6fe5ff40ac44587a503c864f0ffe414f4490b7898d2b8f87f118ba0162a15980c35f8ff1a9a13d278d5c8414e91ff1fcf2c10040f13c46a081a71e2a144c31797ff17171843c549590666dcfcbf0887c47204037724f8fdff8881014c254071801043fcbf889e99a00614a4fcc1f1ffe20c2fec3e869b156efc3f29288b086450e3830859fcffd8246b0129bef8f8f2c5ff8b452c19e608624d093afc3f69234c1d2d42307363c4ff1791f960907887ea90d5ff8f5108124341a110a028f2ffb5323a23117e4358e1f3ffd7d4f9c73575c6288e736e7fd5eacc2ddd982465c6ff0f40c4fd23648480baa6ce5019ef308ae32afbe5e9cd6418580acfdb81b8eaea53d7b91ed13935e974bd63e0bea8797fa5ee1bd51b456dcdb6b7557f54aa275fc6bf2eccb66ab3769db9e6aaa579cdcaf153d6784cefec03b5347959f7e0ed55abcbdd9dd0024dacc7ec4d77d7d527f3725c6ded6dd56aebbe9d639f7083e5c6ee46cbcbeb357526c340ceed0fe5e22a75ba6c79dde66a3533ee55dd6b988e5305b70eb2c60c2a3b3e71b5dd2a19831b23665079a262d0c4f47f6b6e3152654f94c911eecc6c8536782b33fbb2e2caa4bc509f68598d304184a9a0e86f618261bcbe34efb6f54c4f6c31b0665cd17bc50c08d3e33940820334bc72ebce4b399052561eee9c8326a0e5c292b2411eee036f60f612e02f5dcd7803ab6025d33b335bbec1d197b69a17cc9affaf5b5eb82d30e803b599ed4ef90d4cd4edcba02ff68b4e67ae2f516f77af1a34a101061a0cc9000b6eef2f586fd5fda23ce37d2fdfaa624eb0bc9e6c2d3c79c9fbbe63bc6bda7dcb60840c18f0c28597355fea5ecd6d7d779ffaa7e33f7455f78cc57876273cb3eed9ee9eefdd3fb2ce3e9f3d7b627acc0bd61f0c7cc0e00a0604f449c2cf1f3ae1aed61eaef7d43c6b1eaef31b4cb5d09771b9432ce3dad336db2d2f9ce63eba98fd97b72e5bef809ad7e5885b5fe51da7f647762f6873c1efbfe4616e773578018e2ff98d8b1cde31172fffe5dde95ec6ba8b8b16eeb6c54fd6c25dc63d5f734c9b1a6b4b9c2d57b6d492ebb3f27e5aac5a668d79c65ae4648db50879f99a5a6ac99d6449cbb2a6d465e965a9ffa54e8c673bbf27fe05c18677807ccb0bb7bb0dcd0cbdfe4b1f3ef24e6f2f2c5c7cdfe29d67cfd3725d1518927e5a5e75512118155515b75af501f37482450a96a9324c7781586cff16f469f36f8119ef668194ff374f9db3a0e9bf0cb3a07777bea792aa0bd45cbd4a6beb8dc772565555affaf2e57ce9ee9a668e5bdf8f5bad6b6a2cde25cb32712e7833053ebbab376bae09ecf47485c271930978b687db178fd9fbe3d8dcb7ff7cf89cc0ab0cd34d10e5b3bbbb27e8e95ccf7af77219e77a7ab7e67d515181ed8ba269ce67776377a3a6bdbf13dbeef4559fa23469fdb8fde5244025980aea2c010e611f219cff07daaef34c7bc26119a613eab699710363fa3cf5366fb7d734718e2c07b2df975bf72db2a99dee76aa6b4fdf82803e68666be6fb40d0ec3cf53ec2edef2bf80bde1cb4b2c15b10c797e6bd8d01fa726ccd677c1b23fbbf8d758d45ed9e0e4ae57c999699d972fb4ba54099b7172abbcd58ac2bd1bd943d5ff4fe7a509fb5ebca3ef565ffdf611f3e2fe672be6efd548584eca25ceb5f8c777f3c5ecb30dd1ef4ff26d663bbcee7f6d926db5e65982eb7a1deccb8013363b12a73cbe66e8eebf3caf04a14eaa76c8232f037d44b03d268ff601afdef427b766c833a2afb79f372bd86cc02739efafc9f2daf5a609dae33d0cbff0502b51e78f43d7df64efbbbbb9af569a6f7ae727cf2fed1b4f6cbf74d79fceecef57936890daa73b9161b4af9324c2716257664c5899de3760937f3c5bb77b3626605b5a295b19f7f5dbb6da00994ab5c9612dc13265e50725a5f38ad9c141c97aee6adb9f0d9eb7d2500c35a55676cfb49f003bbfdbc645ec6fcf69bb29d6ffb33fad2b76dd58f5b2d7ebb70e79393539f594e7dbff759ddecb391bb554e60578c97efc9f365eccbb8a7fbb257ff0235bf802e5af0e63bbc5a6f0271e69a2fb94c9dd08cfad2e96e0d6caac26ccfd362f1fcfcebcc43fb72eb0a845756f2acbe14daa0b03e55ddb50354776675a7fbbfed14386bf0f6fac55b776bbd48e5725667ed12ee670acc717b8118ac8acc72656c813a32ab239203842db05bf4ee1cdabf70971b7eceeb4b316e73b627f346d02fafb808c8fee222d0fa8fa009778bc0769784c9f917665b4bae30345f72be4b799897fb03fb8569bdee0a6baad267eb9e456bb63be5f174153965ae72564577aba2550547507f511944258f508c87fb179535bb9453e9e0ffcb7b7b39b2aaaaa65dca7729e749545455955bdfdd6710907d19a683c02bdf0d41d3ffefd229837e4a9d9f82668a17dd94a9b7bb73d34eb1fd779c5e91e22727052dd72f97725686e94c2be54aae771ceca7f5ddf3c416787737589f9c6cb74aea93ed5649552f87fa508d771577aa62a03eed26ddcb5bba97b1795ebcc4dce20f0cff01abffbffb1e79c056398e8216e5ecbfc4517eff258e32f555b8ab516c5000056f17142868fe6fef06858cec9a158a5729bc8101fa7f3039ff25f7b12f189a0723fb2f4d30295f3e013bc2e6897fbc8a6f5f387c95506edd6daa85f549836161c7658d4d9cfbfa6aca75b2fbf5e6b641fba4cea3793294f2e4c951bfb75725ec39d557a999eb36b775b73be539a0553a99b77b0dca537a99fd974efcde5e35aff522f3b2fa2fefeeddbc6c5f3a91a37b53359da0f17273f22bcd9b93225d7ef4597bfa945583fabcbbaeb22eab7dbb3db9fc3ce92c18179b7f2e312e1ca8b0a7be6d6b933aa5d3d678ccfeee8e6360e92b6f131aad7715ee2aae49b089d79716d8c43cb5d6a97f0d00faf9f0af6add1b9063e6cb1b18e6db805603470ce4394f2c06c5009aff52c71920fb1f77a3570c50d9bbefdd0c6ce529c3745b687e8becbbbd662eb7e5e40917e3e926dc67cf25dc67cfdebdbb273c4fab3534b57465bf3cdd372d1ca51314e7f6c6a4ce7fc9ed8dc999ee38263ade71aa9934e16e4bea9826dfaaa579979c2d91f28fabd9d6a0ce60b556dc92ffcf5af3ff5952b6ce12da13e5d8bc29c94289d997e6ddd5ad753f6fd02af12a755c49d497c2f3bc61e5c135636da55f61c51a9a58521eabe909d6559dff3b667db82b34a7e5b7ab1f5f7215f540536b1ff781e3c25de1c84a1dc769718b4f1c8eff1278af79b3f26325a7b42a736acad6caebcf0de501f3367902a5de8ef9ee5a25e15eab0f9bc2f3b4f74c77aeeab45ca355555b482cbff83cad89b19454016fdf82828477a32c10f565986e81a35b559db35e6e67abc8fe3bceb84a8ba7fa4cd174f3784e73a669abea99ee5cbf3cc9a0d3e6f29461bacb93acf9ff241b775f1229b98cb5952453b72435feed8e63f3dc5090a84122a529a7b5f7ae0f49d39754aad48cbb1de1e148c6be7d8115ab96376b1ed77132cb75448b6a10151a5b75af54625ff28afba2a2aae2e16efb57e5b65251812191d2bdbc150588113423666fe4971b33a2c5efd8cd88cd3796bb4d4991bbbe7d81be8ca756d85591e9ab1cb73a3b3575cd1cb753b6ff227efe7f1d078ba07deec7ebb6c85911b2ff225a45703cef4644ce3f9a1b91e13f119d0d128922b2f5903e43bcf07b1ba21b3225840a216765980e7d2138dfbdbb67de9eea9c896def4a80edbebe8c795b2fb9a6060631fb28417ebe7ab7f51164070152e7bfe498e36e4086af812491f2f316c8713df2e348bffb4a4971f9f2442bc7d5eeabbb6a291581d451b5fb3e5d7cd1a7a812a29a44e1f85278774fc27367bbeeaa168f855579a252a59650729c9aea863afbff1218bc198aecff6f5051a06c1d9bdbf23836edbef6564e51967da9d3dd4aabb272db79e5f65792b71f6bea8fb212ec87ee47fde7f6f704482ca73f5ecd16eba9ceedc94b59cd7a796a9f9aa4287a4d05b25080849b025aff2594addcc7cdbaeaf0fd75a7ae8cb9743a33ebab7b79936f6b2c059a6cd0eeabc051d9bffedfc9df1258f325c7c1ad2b2e01b2af5b0938f9e1fba2c25d159e67dac33f9e66bd4b9dd0fe4bee54f6e3f6fcba39716c9fdc9afcfc9737a87f17a87913da7f579359995633dba60ebc40ddf4c3479effb26779e515bd57ecfe4c7bf381562af151e6b328afbaebe6c3abd465cca5e3aa25968f032c5af5e3757b95355692b7381699e5a2a202ab02124409cf16e5395fc6c0349b59ef320656559959ef32066edd79b6c77b777b45e1bdbbd12a2041d29e2f6f5f2f24a8931c99051ea0f507d4b307a01e6d7af4f0babb47f5652c06e8dfcc7a97d35cd06ef3d771f066005acebc7bdfde35733703ccfedf00f4cb309d015a390370e4331dcb371e7e3206de78acf9ffcb2d8fb2ac773f1e56fffbe674e67194dbf73c356f879fc7623bd06e3bca72fdf21dba2fc374c2dd8ea91d369bf5ae02fac73fdeada2d9e0697376df0ac2e7508b5aae7b37d815ee196baf2776df1fb79d57fd3a7a950873429ef5ddb38a4311cbe90f0b8a2f631345535e554566b9ea93dd5919e7aa78378a89737cdfaec76ed76362d93e11cb7657993702d6e85fb0f67415ee081812603500a037f10073fecddc06d0cad8c78fd707a803fcbf0072fe376eba09704600afffaf02e0f8ff92e39b0e3fff655815b16c37952a6155a854a9b89b8e35ffafc77480f99b8e056e39fcfc97e6c6bf2ecc9a77f9c6f7d7cd6cab92adca7de05d35f12e071a34d53bac0aa75225c7f0bfe372e852bd99dc721c559b6eb481bf05b02680b22f034003982a79df5db3f67a192ff9ff227fc331e84b1c794af3eb86c3cb98e6dd704489dd701cdd40c3b11dbbe7bddd18be1ebbddd09537ea693baf1aea06c0a02f85e70d00343700c8feefef064054ce765737978d3e637adf6ca0fdbaeeb251f65ff22c5a33464d13efaa0dadffb751ffedfddd6c58a636159875ed3a3399fd97e8bf65d22a99eabe1c0abf67bac92c30b72f8afb1dc3bead7b35e4e4f45603cd580db21a5a5fa38af1b018a0ff7ccfd3fe783934cdf69e3c395f86e96e34d0fcd318feffa939c7260daf5f50777e77349a681cfdede627a7b75b9b2fc374284f79eefaccd4caadcca277e7ee18b6c15fd763b97dcddb6dea85bcdcbed972371b1429caaf18de1d9bd9f2ae98b5409e23b340de8dc2bdb899710326be32331613cbf17047af1837f1cecca97e223c4f0b263c4fdb6d4d5f2ad932bb6e33f2fc97ba03b1e6c2dbc08cb3bbadeebacd189655ae5835eb93194d33fecfd362c94073f9305fae7fbc60c5c990f2bfa3e26444ed9071f4ffb71868284ef5941865cfeff6e98d567c8b21e56f319a621cfddf96f694f59ebe8cc17837ca6da9ecb4b7a59fbd68e7b7252b311eee39e1528d33d7ed45ef5652b2a5bb92972f9d72da54d1b42ae9febfc4dd942a9479efeedd92fcdc92d092cafeff9604e5cbd3f2cc4c76cd9c54910afdbdbb77438a73431a964ec094df7d4342fa2f3bb767d69a57cdb16e473fdc8e2ef8d2a9a9fbc8153d7155554733ceb3eb6c735d555d483ac74d2ebe198101dbe2da6a9253f204a795cbc27a02c5c957d6131bbc192d6024c0736c51e1ee02f597aeea5e75badaef57690a2102c5bc647849f0e65bd1adc8ace7c4dca2a2aa125aafca2d5068bda8a8c090dc8abc1e772baa7a0b2dc74537a23a3722b32f6f44dcc78d68eaff561bd4d3f6c7bbc094f35bad4e69de5bed6cd7d09ad798c6bad56ccfcbf5dec83af6469addc8df973732aacca98ffba858a42d63405f86e96e639d4781e9ee36a2c9dd462fbcd4ccf836eafe361631b74c6cd19c7973daafcf4c773cc713f2aaccadfa840488ed89754f9e10cb121902448b8a0ae5e2f0bfccb8a7bf6ea2d535abae80bf8938bee26e3f4877fee4ff6ffcedd17ca9a3a2ba5f5c5bc24ed6408e4cccdcdaf77a9938b7ef457159fce6d2f2fc97419dd3ccd2d2b40e0ddaf6f2436d0ea1bb435a86068199a73684f6a52143ba2f0d15c282eb423114d2e97cdeaf5a0acffa749e97db60bd857684f14318644ee5a9ed596f76528661f5651834bebcc08e9dea53130fde0cc69ab26f6c429d270e8281c1c360545c090d7a42673c42bfff7f425183fafc97c2337873e578909aff41130c4ae08b3ce505f2acb16f6bbcd11abcf98bb3f2fc42caffff17b5ffd2c9977193576d62f3220a2fcc4a2f745e4c3d09deec458c9c796a414bbc203582221084e3bf74129e287af1b9ad3d4f1ceca24f176dba2083eaea22807ff30a4f0930cf9d5a73a1e6bf4c33ee59f336d9cd5c48792e627c29663b060b5427d0065feaeed63c5dc63e9d2e9057a002bedc02d097e616685ba4d5abde5fdf620856955354149122437a4e78dfd6ab3ee1eed6583d5f20a03aff2520b3ff7fa006843e20ad125b1450fd2f779dff2fff0c4fcded1faf3f362dea6861f65a5c314fad058e5297ef2fa8dbd797f5598359002ad1b2b0e0b45d67a1f559e0f82f7f3c8c451d2cd060a1fbc7a2e987bbe2079418b73d6bdc15e8ff5f31f5bf35ef0a1bce0a39a7d65ea61565e5b667cab342ebbfecf9660c04e2cab199adde56d882b78a365fc5f0ee2ab44a5c15f5717eb0f8d4e7a78c1fad3b7673fd753f47d6296361138e0ab41f59672a86af53938afadff1b667eabbbbeecbb9bd95fb3246517bee3ba6ab0ef63b96356f0a3fff53c829cd7cabee5394899de955ede9dac0dba6987ad33eb14901c897b11467256a93c2cbccb7deada5688a62d09751a0e9ae28ce44e1657927bb193745d1f4ff358aff87e2acf3a0208322eaff77bcfa04a027e4fcffd727ce9ed04fe0e0f8d779faebd5a95f6153ed3adfd37e3951e7df8921aef7b4dc3aa1d5afb08f9f2f2ff7d1c7ecd4daabf254df6cabd9e7f7bffb4ce9dce7dfc7078ddbf8e878363e584d00fa92877dfab4959bb90934656e027de1c61cccd6848eff9cee2660ed7a0c0bbb69f529b675d0dc9a779f985b62dc828971dbefd6bc7c7f4173eb8989735d8f619409ab6702c7e7740f20bb47ceff9e3d43297f5a9edbd374d32b7bf4f429c3747adaa4b9321daab7a9672ad72fd77324ece1aef3127e9690f35aa34b9c9561badce5f6c7db29ba44055f86e9fab6684ff505e29e13daf33eb93cdc75ce5d5eb663a6adcaa1c074973b6df0e6bbaf999ee78977fb7ae5c4ce7467ea7c735963dfdd7d9f969ba7e6397eda6be2549fe7e5199bf69e5bf3729d6fdc33b145cd7c3bbe12e396eb6e8dc57798874fa145b1b2c6396edee0cd79a6ca3cb64fc2cfff97499c7da9db5a57817a5b5b1252fe93684242b8aba7c521e1c5e9b4a6896b4242ca97483421b1c39307cde321d3553c4dfe1f4f8f3b794af30a7755a7abbaf7bb71cfb7f28e77c6dd4173e787ef58e95f5077e7e8083fa579041a501f718496115a1861e6cbb8eb2ab73f0cbc298752ad111c1b11f5ff570c9f770c9f76aad076def1d84eb99d333b28971d3b75df5e67d0d7a9f3ff5fa7ecff4bccd39cdb9aebe87ed4d915d1a7de5dbf9c1791411144e8f4e1641618bcbd9bf58fde79f98facf3be26ceb5cce7ce66287466f89ab518cfeeced36209b7cd779777bacb8179995b54546026a6635586e9e8d42fc374440c7a22f21081e6892023c28b88a6bbe70cfadc1c39ff73e60cbf0cd3cdf19ad334e7e883f6d787c833049aff21c8c6f06973e8bd624378fde78688faf152dd87502ac37439bb3b5996dd9dec56d527243cb22c9e3130c7f154ca4f0bc4bc6be62b81debd1cc7a7de0185fc026dd6ba199f792bdfd3dca2a25a72778ae6eed641a0297b57cc02332e082f6f0bc2ebcb27e1690621444e9a1c395fdad4877740cbb119bc79a7a81c1daa36a834efeb26b220051942ccc0c80000000000a3120020302c1a10c98452b932cdd60414000666aa5c9a509f0893244b6114448256190233000000000000001000cfac9db35cf110d768d4a827dd93fb8019f68198fcd9a9304fecb53cd5288bf79d70be24febac10a2a7525e7fa1e19c7f7b3a2b29827e0041309795b7a3599b9c2616049fce02bf6333962c6f907e4e5b8bc567c57d30ac943eaf83e4fc8079108e1ba612fdf642639ed3eacf49c122b03584857abc04fb613f28b6bfe9daa0b0202c142f91d003b545252ae4ed94fbe9f1269767a1ea9da2a83527783b5587aedd3ccc34fe456c37691901f6b32d904a926de6760c35c3c03a29663fe8f5190e89928ceaed7f35ab953210ad871874fb03a47fa2e951a49f4be7d67f505c03742eedac0e4db1fa76944a83bd1549640b26cd620f65fdb33cc862d214b6e9e2cd48e8b42ec7f06113e41d7c2fad7ef1267155aca815dc23b374b09f3cf25af62cfec597665fc71be4ac7430cc129c2899ffc2c35fc29f835dc7a6b6c7134dd0c28653db05d6ee2646d84744e46bcc6de34d6c4081eed1ce2284788d56758975954cc216ded58266fbb6f92bf14f0d39a0382ab61e480f5ce6035a4897466b2df9e883432e358f402dcbcff50036d14c770cd91abae82675f1b3a2a6c266d3e20c4d587074e704f48b864e28f2003ff7f65d9d1b3e2c6f20b113356633060fb088d726a6579f27e1c51c3fb1f04d60d6985ebcfe54e4ed1b2113092c629bcc687d0d36f7bb71198c2fabb354a935f6a37863fb895099edcf01462ba93e038984aaeefc69b69150a8266b9d01ecbeca4fdbf4153118f7ddf01477010fa251ebec6d6ea3b0ab5c8e60a1dcc945d78e1f1c5c2ac66736215d74e7690f77d51d30a20d4040e5ad0d4b7f8aa60b4c93f9e98fd6967ff1d3769f558e1c971caee9d163d8b305a174218ad9d205bffd4a98c0c8eb76d6d91e1fd12dab055aa82c6a62c87c40ca4448cfbb61d271651b4b9cf30880b64357c5998194c790d3ff97ba7780b1a65105b197888f58327d45fed7f4d29fbccf48f7669cff5348691100239d71b8578d0cbf6bc39982043bd0d6b7241d0fbf1ce3d67011ba04af231215f86c404adea166d45b68ffbc00deb2ac6aea9f4bd087561c3dff050ae0e86dc2e9ee88fc1b3c984b5601ee35dfa81734c2bef8cd66bf1eae7e672bc1fe0b427888a17843a39979df7871776d829c64cba8ec9680c06ba0829a8988b82484c7144dd270084d2a083cf4282de9988a6a7cb01e281fdc223a9e8ef013d86b32d4568d357d050f534b4c074c8ba9ffe8a4d334f1b90a66729d133100e02b012f4c1adb9839908baf8b07876d1378debecfbc8b896d41e51a2c0b1093e02a1cf805dcc8bd02a3e242d63b02d2b38227ddc172b0ae94d9ec2e05ff89ae6db3c9163e60e7baad85ea25a9eba6a9e9feba6de0cad24b65d7a7a95dedb3033c1a37322f25918564cc4a273d6de47160152814824f0e1e1d414e2da69d99e5ec34d40da7cc46df5466982acbfd1e098f311437ef81b5b113b99f7fa58d3b98276eda6c90ef5510379ffd73d18611cabe01e28dfa7d08f2173f3a9cf098c2cc5a838d4dedff4ccf3d47601793cfcccb38aaa49d89543800b447df549a343c14d89f4fd43d7d3302f4bd8a49f3d7bdfb8d85a801f964814038fcb6d035ee0ff416a6e81c6aca0fad5b7dd6b2465f1701ed892cfcdd031bbd7ca4891fc138b61aa61f3600aa728c83aa04e0c835595e5f2ec2040f054f14e121373556023a75a860d4c1959834b89e8f55fc2f508ec48161f4b3fbeadd18d5ac4a47ce1aaf3e62a18897cead919467daca0992723e2da496fb982ace2336f76112af4d485fd63ddbcea698c728668a282ecb588d08d7fc7210947818046ee51b042e9fae6b5d152ac6f52756fb7624cbd2bc31706b06153245670bd35fb1a1fb9a620b87a014d93bb34d00bebd46812ebf8235f815b5c8fa2b50b659d101ec8f6fe43424935388e70c7866315f173bbbb176ee1259b84470819ea27e06ed43852dae4fc8933496dc316bcb1628e8866796491d413e7446f8feef214847b3327f693b302796ac08dabc8633f1082c18abb1c31ed2fd5b3309681dcc141b8926a5bb06f5f65436c0c9b53507296fc8fec8c2067ce018a48200c7474944d3fd3f496a9f8338c977ef6ba5cacc24e84839db8c36c7c04a75f7ab4e5544451f873b48752f46a685a60c97428129e51ce960fcdffddf0c459b87b1e028c1ec878b1839ab86fa4465385156b4395c38d9f1d423420dd640d574ec074f0b07c782736b3e333a3698797ccca6c61206411929eec8bfd55557519d7fe2de317ff5aafd0cded62a94b2205856acaf64da0b6fc9e60b0d475531453ec392b3898b3419085797c0cc65dd8ae8091bb2ddefdd8f25f13dda0091e76e79541977fd3928059a83981b4c096b1a01620cac4753520d0008358fe44d5a1fa10e830fd9388e03a64c2edb2b6c2c02cd166e28166f94acb0aabf4edac637f7968e1ea6437e27341e38295e98bf80d4a8fda79a8226799f655aa641041eac47014fe70a9b48314fa9068453ecfabe614e02270fa1b9b414c965d40781c15a4c54f11ef7f0d4f6c5cacf8af4b5b41be972df7358a5710546dbbd246ebf4404d8a956ef9b69448b10a5392229e5b8469222133f9762dec76b955fcee7a552cb26ced1cefc249a19d90cf1a60dd797a0c3a521954aad534dbb5ffd68177bb9cd9e1cfbe1da6192424522b6719a689d95a5814b4530d54abada12280e1bdf54d2d15b81d36f0523ee66d82b03052e6f3b59b8546530d61418329b22124a57d51eb17b12eabdcc3e1fcc2291e27228d04558855e6f3efc14b83cb86446940222f6d8503f03fe58e2c74706eb7c55c31b1b8573365fa812bd7eb3ace5d3b6263034b68d154bef6c46bb22b4e639dd7457cd48e9cb6408340d82b6a3032739603aaa0bb5d142d936e9b1741d2661ec4c4c55a60bb8bb3d8936692285cd3f88832cb9175e13b19400d1e298e1f9644413fd09e89735eae1e756c3f2623edf5bc4a6dffecf05a23bb8049ce96148759b347a142264e070e2eae4a5aaf1b849c3d5324274e6acaca1dee0ad2cdc934edb08505d2e30525ab345c2289f256237b430a01f79835061d83ebf0de5b9830a1a21072f59b2494ca3730c704334d39ae072e4cc869febd179ffeb752c898149d352d348203bb2f128d9440103af18a169e2c2ce7d1bc90c2c977367fbd6df1b0fe0277cde4359c4e3813275369455f9817615ade6d8fdd0de59a4034c0415b8c96f74c6043dea13be58c4c7d6918ee44830f85752a9b135209462bfdffc7a3158631d8d750688452d3da544bafa45a691e99ca1f0a6090466aad4a3da78095c9d20e20a04273f10ffbd28b9a473ece3832461f7b89cfcecb7d1a2b6d721f7f897af75e8feb974c61e604c024da1cc909f8123859a6bb50ad0d8d68c320353030911bde39a39d29b8db6e4d7f04006912729c6956f3a5c4d06cfed1af0e2a78e3104ea39f08ee6ba2e60114a2adba156a8baf8eb69a385a73e2817199276cc1071168db80397204a471f71f9c31e60b62e10329be9ce9ba251d223eb353941b61116d83c3c52afd83e30135bf8bc9e14d1c336ec832f5bc7e07452bf731d48b54b55310fcc2f41d525da03074ce4fedc5eec037e7f0c408ed781da28d594f2f2044e8a80433328527cea3151be2670370605639b338fa506079a5214907c73c203688c6bc29fdcadbb4c402b061e8da93abad8dc194b24b65f7680d9d818b73d8cdf6986ab89b9e31e98157ea5b99e58e06acb0511d38c6865f48d2089d5aae48ea2562182f8a3f871800d96d42d44862f260905c11e9aa31ebc7f5d65df3b797cbdca17ad79d1e719c538861ddea4160975d23d5031244864e2f996264c44b5543a2fbd4f47a63a1f15c18dc0167a2d9a6b66d1b2b955aafee854c2e83da8ea5e0db0f0338dee5343b1bd53c208844c8b062668ff6b4663abdd3179c8dce9e07d2437874843fd6405ca6acd25a73f4214aa6531a661365dae75fb0c64f43505e387b22d49adf01b47a8fcf711ac0edfb250b602d2b00e5f3f2ddea6c89cea5785fcb19056bd744c3d236d86529278a5926c8bd54ec8b885e472b054fae9d205922fe2515ba9e9b605d3ba18552e141e91c1493d3f68750b0b6d6b9adde16fbed3b096861ac97e2041b1a6ebfe295176f378cb0ccec963d1918cfba2ea83a7a38364736a2f00816ca31ab0654c44e9839e9859fb731c1448dae7f80215f07215d29fd75b27bb5f49d1385868099cfb4fb2ffbe3277e367d63909c0032fb5570439023c9490e234a418233f6498076f911f8c32a85de9acb6ca3e7cc12161455d6db514dc23aa0bee7ff829db4d50cf89ae701c8c028eb3deab2b832d520c61406eb14b890b68584cd2512cb92f988b3ae45334b9c198aab6ba0f77c41013ad2adc7dacd582ae9e039439beb75254780f2745674667bccdb286fa5c5ddd1dbc0e22ba7e695c9e1f7312d7dbeed2555a6b7e054a5470aef9c99509c0df1c4c141b82196d53b31ca6e6823b02dd405e56ef9372b204daaff2b2b182be04a07bf76175605aa0e6197043194b5fece29b37739f54a95427e49ba5f089612543a05ce0d5d17bd372ea08a352f2d98b713e37d5bbd73a50d9dea52fea1aaf96ddaf9431c21bb0290846c66acd1928e18a5dce583260d84b8ef361970d8c2bc1b7881d2bb9e575fd0737fe60302a9680eaecc2740f3e415484a63533a4c6fb1fa54b4f001976859ee0ab4eb08bb6914c5cd4c7eb2a26efab3d8e1b9cf6df2522c9da340c6b8b513272d821bdc390e79edbcdb59da8445ea14bd879b6fc08f6004969a99e025b31b177df3689391135e034eae42d7d22f823faaa94b7d88446a467e7ba169999445b81af13945ba718fe641d756247eccc43672714f60db1c635c22e8d5b39ea0b211b21da33b0ccf198ac400e644917d9f30680732a22af3f126fe93f5e3b77de5b84878c06c0ec42d98aa2cf725e2fa7fa363f32896ac5222d92d1e577d6bf9ee71c82c2a662cd918fb621e3770c198f54080cb335779b933eda12330da77a11321fb3d1fd3e31c8c782be1e8b376af57a90087cc05e070984f08b8ffc6004c153804ced557566f1e96a77f9e8e7772f9f94e6d5fe033d30d057b1cc2a0f366d85d5ed5de792f71cd50382a844497575e2338278b2f9c523a9a95f67e2ca598ad569d25107952c4807d9398fa87981f5eb1b8112a569483ddefa39c4a3b3b43169443eb0e8d324869e96ab8b5e466f0caaeb0d2fca020768c9d130f040facf1026024870dceeee4098d1b1272e1a39356d831d6d337a42f0bf5b1cbb7ace29c5f2ee459b41ffdd538133cdbb51441336938fb2b6e0845ac4af89e5f1ee8d5da75c4d4945b23d48608610bf2b88417815f856c69ee81d89ee276c0ebfc41f6afc97e4c2eaca73015d6ae850dae4cfa6c44804372e66edb7f0eb3f28bbe8fd1c9de506e586c84f902dc1a660adb564a9fee70ffb3d083d666819e2a5d58504dc86982fde0abca1a6eb59d24d8e84c5245b8d9b512616d354117170b9a0deb908364c106ae8ba0a9181979b4e2ca61928163ebe776fed984dbeb8ce4c3b3b496abc974d3e9f89149619f51182a8c65d2b81a8ed267dc44a143c1ae52209a252653a736a4b0f21ccb89d7b0a717b7571845967bd9cfcc0edf54699b11b0a7e49f52580c3448c98132f370e8f370a8e6e5bb852cce4418c9e5da493456f6064618bff7fb27cb188a19f0d661386f966da50202bc0eb904866d4284c499337c0ce4f707ffe9aa225cba8722862e2ade09ddfaf3ba12b0192c1541f809dc5de0eb4751935f6d39c26ccc2478662318cd6bc706c1dd39b3e2ea97382920c35cfba049a3f21fb33ded5e402d150b3ee8800c61995d57e59cc173ede63acc354d135c99dc420372101a306d5932f6573250f956439a6241bb0181ef0077d6916d11f2b1a2c6461b1a0da652fb0947d9a2df2e4bfeb1a19076c01fc1d4c97a29828c313bb84c7d74bdba2dbb45457351a94371e7aa8739151d5b7d6dac3c4906932e4fe71c5a3e5336fed5eeb3ead5961538574225f443a1ddc6f28479b30ad7c22dc627debfdaeb87c13806153872f763a5c4906a5a4746d08f82dfa1fff34b11bbd86fbe2df44453f7a2f1e681cbca52acd1032f1d6b095f2c7bce03605bef9c8d61261936d313f6ac475d905867b69c72315479a850d136c7ab483e42ce954d5c855f14f30801bd7857539bb1714e34c6c214bac0b7375979728af1018f21b9c9228b784178b44b5a0e56478867be946cf20fb66ed35a9e4c0529c722128a43974b970fac9f39c67a23a63f61cb1e40901cc88fad1ca7926782244d8fcf48f40da4a66add6ddc829ec65484e149429b9982cadbf1527405d4599db0963f11665dda8773b9ee4f2d75139f7f5bdfeb78b6403bb27fff9a5e66812050c7074d6987cef3d743f8f6322be8724af9fe085caad360e4183860d6172ff7479775c8335c60167bc10cec506f11b8a701a690ccf6d2d75d83d71d60c41781e7058c0d792b2af6480dc2e77a2e1f3e477f72efc45d2d884bd762eca3af40b22267270c4e86185ae2d58a344f51d99bbd4113fd6ceba1b6f551a6e0d8e508a2bffbd2184513f7c4c09a3e67d1d60b5eebc91677630f2c959336b26376f26ce0c2dd774f11c2b8b76ba83550499e650f8e084b7e78efc87bd1205bc62cfec082b6dc2b58e3c3afd0e0a663be0b736516c00b8f677b67061eaf2fc7cff3007af25a9261326d27aa9f3d4b66459e9298031b83bde25791d41311886312f8155bc93deafcaea6e7ba7442db57ec04ab629fb60bc847188298f70550ce417c56f1e4687c1312f30766559d436a12093f4013c8f9133d8ae1305920b223cc95649813d62a05f3a22190276a96ede8e7320344dd66f20c4b2318830a62000eebfd7ea74d1c0a3357c9c987363822aaa07ffb03e771c494c3eacc6cde2c88981985a395af0f374266f4afbe5fb6d14e73dcba77cda208431a0ab0cda4e831ce2d2d9ba4feb7f5576a71542c90168fd379e091e22bb05671a2144c7b0eb7fa03621705a25b9e90f4576a8fe9801d53af17bccf405a853515285787abcd7da33a3d0a64d14419c80fbe9a3fc92bde8724268122c220fc17f05534c36602e15c36b454bfd020b531ff8651f3d3b0d91c2ff1e88690ed0befc0b0dcbc74a39d06810aaff8ab3df8e74144f923fde7981e99d1568ab145d890c088d9bfc38ddf50bcfb69bf270728757868a7b63587e96682519a0ca9bfd379f9bcb780e68f88657230d2248d93ef09f52695a71c376396da4bfca7cda8a01d2397decde907c56cf1f53602f3264f99e79386fde5c5d533eaa2b44f5bcdb66b2b9d1c6c5758fd3807e97329eff95fab54d6e6ca24d66d1d2c98af25cf1b651e7d7e19b5dcc827d1a3d5e5a4e84a6a3c4da3843703c56b5c25d0b80d619885b71e5261269fae1374f0f141c83b63e06c7c9c88bfdb606b66d68b458168d45792c90c42115f15db5f7bc594b60497af90db55f7960f172c19a9a64ead2786895f9d5acca87a5297b66e26745180669705b27ca0b99f3f9aefe35952e86cab1f75f163cdd10927866d6c95730ce67b852b9339749f19314a644fd3e682797c826649457ad8e2fe9f3382984a4673ef4714be891357bb3de0637ffba9d07743c0c56e58acbf01d2618a1c7c7176d0b8a1283a14d59e77cea2df59b28e029f765367cea17d9d5077c4271693e2741305ed39ccaf7deefb360cd3ea9e41db9a0c0256fb6502943b89575093aa4003421428ebafbca2a56be8592f755d4b14d7d34400d081e6f5c02308e5f8a3f9950633c390fbec944fd8820fc3aefbcc8ab58aa9773433466c80425941ede7b068679fa324bc96af7bae0bb555eb92dd6b1d2ce9d348ec152e703d20b386741f8f7b443870d84a4c0c43fc04957f6a91bc8c89e45093b158ed38912cd9b503b3c3aa4e1617e6f59e3b25848201e38c33d053f7e92c87750966ae5d62d2c8f95ed00334b2e584de9bf453d38a45daee6caac4664dee6f8545775d3fe92c2c456453fbd8b7455be24f1dbfbdbdabad328e705afcc4adc2c518cca7ab11b225a02d873ef35013675e93db46737ed009387c2c10e2c7e250d4ab1a878db601bfdc934a1d23acbf10ef9c4654d367b2f22be88ec45ea8c59553389b45359503c0a9f758215712d537761e138dad61bf7d8f7d3a8278e682a7f34be50b4f84019c8b2475867f9285683ac65b586cbe93b12f65f61c8550266c614910d71a16777e082bbe9b48bd4f482232eb90542fb03e5a407471c4b1ee6d2f3497f09e992054b7c48f747c97468cd582b04b8e76867c4e3b4f5465b887c6c897ce71bb1e616e89a20486e6d9b9a0a5d407ad0cc63808a40024b0a20adbc3836b24fcf59e3363da0eb16fab47d0aba95f629bcfb754bb0cb513dcad73990a87226d46a04b4d4d7ec377e016ed6137eea1b22679ed8ab4053f5cb2aaac3678802f98c366e80c41f4592435da288ed5b50db5bd5a3a36d421b7dce56da15651e422beab7d9a30f01e859836ac8b21dd8f6e53a6bb86386ef622f37a3620a2452875e8ef14823f1b78d46f69bac4a4ca0838ba53064807f6802ff28a2eaecad02c91446eabf427a6c2bca19a2d006ed59e481aae610a26f58b0a6b8b06e4d305f5b29029cde2015ad572c668e964c504e43c4028bf428ddcc76e6a97c659536e587f6c8664b2c9da03738c9a16e6da2db860c8c7559908fbe8030feedff6d2a58985bd53c4c8bc8fe49b80ca969d4c74f0c26ac362da34ca5b81262664e6b3865940e9bde7f740988816c6a7b9b989ecb80c27fce7729cb8cc0081a3cfe44320bba2e4a4827870212f4b4872563fe8afb25a3e451d473abb8f4253c2a361ead3ca40c7dea43df3a659c521476f96153b110d3eb2bef94f57c4c5e8c8397af30c70435dfa193664ba70c3cc020904fb9f3d74249dcfd637d5ae1e5526f25f0995ee6fdd1bd9a43e9a251058b6917a44926b3215ac18ed21d822ac09089367116de31919fe044bd7e85ed69f140b2a3900adb508cb98b1286ebecf42ee0436d6964e0af1b5869c307855e6927f5fbd5fae492c5a37cc76d15af8542f685d08839f501bcd32b771c7e14c0cfe73c843afa92b6dcd34576a1dfa1b89b7bffb3a14c206a112a186f21f7bf5b3d878d69b0183cc73ac646f6bce47db9d8ccd3a107f7821bdddf8061adf08a0e9c1fe086a406d81502e81a933b42aeb7cb1d26cb8511da5ec65ce75d7a2aa7f385b7be46f9576c653effc9a9c6182de6d52a98a332ba198cf83ab2bf735e3e0278b720a8411868647f6485da6bd4b8e3d999f4620fb616048250ab2e17394063b0e032b61ba69f8fbf5350528d7293260a0ea8b24d30150026d49c95d62c323b1a0953cbfab846bde9ca088885c8c6024eb2eee9d9fa7ecbb1a1b028cc9f03f478221121cda3858c992ddb7c6507f7e9e419f6bfc13454316ad833d2be16d284975d411e359860403e5c935589661f969fb26021eb8c3db68ddd54f1e767b3ceb5bf2a8db73bde0baf58ce5629f45e33bec22521e3b3f416255d69b3e80c9b3967719e25156d2626e4590c7c0063494c1391f3a1ff31e03a241553a33d1c5f0bc99ed76bb4b943c96665481e5e691cb5177379e168d9958d810ca33a4a7c53fdb698577e7b0befb50814ce62c4d0b6c9f69ec12b3219bde32822d3e2112c17f7302ba03b6af212788608aba176c742eece58a542ce85bf93d3c4a1b63e94c877527426135cce49187cacaae53dd0d053fd677915e0fb97ea9be8145f5976edb39069d02b2dbec49a99299369df5bb776deab539a4195696f116cea198e9c2742be2a6e1050fc8e196d7f7d1bb33109f5e0e082bda21bc0c248469f90c99fecdba7d7c8e2ba6d99a5d33729eb84277258cf3656c2800c531c42e3bc81a5314c441c6b3992f9a499222739e16792d87db7c6f500cd9b33bb2d959cce3c267bb9a791274ae82ad6f0de21bf78f8a7aa42b77d09895eb1a3905e40476cd459a735c187f05597743cb6e69e41c2a0d69af03f2811c704a3db8240f448750cc0640e0450903820d7da40a9cd1a1a8531be86141787f72e26e225155de7fa8374c80c77ce4cfb3a4bbd57ea54adeb7915ad6523b691a2abfc78a0cb7a76820e8a878a3a85a9de559e7e72c4e2413f1b2c433467284dd9be8acaa1ac714d4c6c58b4369df039e0bdb299a3442f93662b0d6d0fa0c0dcf0cbb1a72050c8153b303805f43001e47e442934ba41a5bf6bd47b1645c597593c5b317cee1959759ae33e615415243bb0a2ec6b317c14e9d1fe64fb47034a10e15b9919e45cd0ff1468ad3afb52cef17da993081163a936510a8845e303295caa89d3aeb9e0491b6effeb739dd409649ae42c6fcb330f267dc8c75e099b9df9cf0416c8975294ae661880dd2d72be00769300a2dfc1d4bada5a640f4726cc3c86edcf64eb315c7e6a1eec398440635e31d20c2c5b3a9cd92a8ed118ef79912828b60c02c105d693e060668f6267add4c1b2f879f8a9dfd24a96ad6c10b94514bc7b2b585a46f6ade16bb26f8e09b992d4fa28d8f136a43f3b978f84c014527e0ee4458d9314a29217e853fae4077123a999895622acded9183cc16efb5f3c6e6629d393dc26750baebc951ae9ecd7e95fe5ee658e52c16ba8b545b69d0503b0b0789a4bb64840f0fb1bdf1732c41fd343370d3e20ba689c2e501221a0db56d21d25d7d2c7e514b24cec474f76a05ca13a8da472cc7de673fb002e6fab454977956bce3fe24809f036cc949860fa4d8226ed19272d211c782432c53e072d21632d04e1b4c5fa9ff8cc51bf9d7ad1583311b519025db4108eb98ee0eb52c6d87231bf1f3eec9438df6936df49556f961d60aaa2452f9f832ebd03e4efe25de85adac2d2cc64d2ff4636214fdeb797cef33347b53f805e2e3a8f083006d3ac3640a4712cec909db1014bf34c89d22e07bcb5de42125f3f35aa5249b8b29a019770f3e179b6dd0ea991254515023d80135e4a5e02ca725a34b75d0276fc549aaab091665420a89e491b319c84a52c7108967d17325e8aa7b2c3bbcbfd5cd9003aaf45e141b574fc6f65384667058386847a443cc6a24fc9cd5baeb4b19a9507b78d8dd789caa2f8625d57a99b0fd07778aee33f92561ab1254b681793c87b16f4b707c4e5ad44fe1a783d9087e39bd3510b96ace37d8737fcdc303428b167b1b569ca87c40f3c4ce133ca50d913221f4830360e69ccbab03e9d0ba10b1d5d17e47843538757cd28c657a14a422d22cd5a56b8216dca8ae6635c813eb95b9c519772058e6ceea5a0afb61af68fa3231fe35cf36b6a495049849943a9400087e0678597b084056b8ddd08452e3ee6e3b9696a4ab46c9e9b8263da90466d975b8ceaf11ec9e5024d428fe73b0db420d296ce1d79de74cb8674b6c3e0fedc2f18ea650333f96cfd9968b7c5f5f3f2137164caa7e52232fe6629df450e0850c668cd2d6a6e7049813f4d5724d92f3bb3dd6e65c90273954baec227a7d4cdbb4ce72cb64f73a6a3f957a1c071bda8df8da3868a592dcf94b79d662e3bb028d8b4593423e71cc7d0fbbeef9d1358fcb9b2fb86b81e6847ea0b9630af821f8fb8f5027d922ca94523f4496c9637fd3d140617e930152dc6bd1a901325741c2adc768a80d00f9a53611f5ae5045263339c85dd61e372722f186495b86f6cb8662f16296554ca844b55a172a1896e8ca5e69cf39c71d0d837b455f2ec5100e4f5db88d142b689684b6a0e7dfa0bb90b53c09506f543d98e77cc94d461fb2044363865e354a22ff7538417f9efb35ede941dab54083c98d20c27bae850456bb35bf7ab16cfb1ffae2db0b87ef47393811f60dfaef8316b65d50af0290ae73ecab377a73d7fa154d7709e4d47426d57b04c0828eabc412086ffb83ae7c57e4c9f5c6438e8751d7cc9a69317b6fffe416ff203c4bde267512d90e405a364b811a77b4ab6ec01dcefd5c29e2d8b65d228ad2dfd9ed21bcc4ca4411a9b108fc2794591f5ec9cad80b4b382bbd601e49ee089fa6b8a31217e2c5ea26328a19050fbac11b39c0417fbb7bcacd8b536563dd50382669f230cdcd88dd0278687add815b539521b6f54c4d3b0245d666dc2bdd6e9699b3b133de8cd507a6e058214b2d4f0285160849ef93eef1d56ab439e145b412ff76667377a06f3978e3982fbd635e08fe3c76f6d3350fe2d44b85bc215d57f7f1f6a562b20dacae165a4934a9b5914bde9d23696557843b6df9a7e40cf7205fb5995bdb97b8a61357b5fd5e216bfa99a7ed123e704b055237fb43bf1763ef98e8e54b4be066428f225b4afbb74105a8beeb6d303225c6e2ca572cd47bfc6db1d1a6881aa53439c0da753a785753a0b8f08ce5d627046fa60685cb464a3716168d9a969f70939b83d92474acb4595fd9d89f7636e9a3e00eef2c487afeb5daa2147e71f4281a10955984b1bd53b2ea6df5ba0a5cc4804413fc25c59916aab62383994bcbe90787e7294549e3eb1cb96abffbd7294a157ea51f698350d71f85990b66c74da6a4e3efa03687190e5fe32b3c2f2c711be34ec029a665f3f60243b5d4b40470ef51c41379295e33cf34e200e3feb1dcec6802da5e361ebef29e92edf69790262eccc56604232a062ea61cbff82d789545358e7003f007eea4bf5b06f42d0deccf9d2f25e42c6faae278d3854953fd0563a402e598d8c13390668e838061f06330c492b0bb80d18431d210478a90beb402549cf2e93e768b04d1066a5d2298c361be21500bbd11e5c38677f01a0a9a6a2fbaa2213bad8a91f15d4769cb80980dac6a39fb9ac2e690112a0de87000e5334758adf0ed31fb9857faa419f2bf68e96d165038976dea1ffcf9ff381bea461c598d84be7681d0ae3b7ef6b60ef35ae1201f59326a7878e9d9ed0eaec1c3d64b9eac29493e37fefd1a0145be9b4ac61e76aec34680a1d905514abf9bc428091b7434c52897ca535604662a99495616871353d6906a7c90d976ac2ab6f36b6ef82a5bfc91a52ddc9cdc38a998a49cc68c3147ddbfc742d1d93667487df7e14bef968f3e090286971cfb3118fb8a2a13746a57f609ad5b4cd734109115fa6b5dec5f8111835e55b20251c96195099f71db24c0eea3e2e21438b29d458b88fc8cc22ccb64f5a3f9542183b7d651b6dab93a2f2bac92493686d41467460817588c37485fa799b30e108f44560c07f026be99cdb4c07319d2b5d3ceade68cd94b1ced683525386208f328571647b9d7844b5bb6fb3311a6dded1ecca22d330069eb305d29bc2cc0718efbadde24747fa24392ab3d5b1e63412f50e1924d48a54bd3cde4c26817d3e42bca865e7181078413c74df382ef2be948f1968255438479592e86a6e1740fe64b3dc79fd6b047580e81cb15d46bcca0fb0572cc80a51cb85c6f3a1da76695dbe17e154003481b271d719cb78f4927acb0380ee642777fe6a4b8241f3f909702b21f62c106f95790dc4e93d3a8ce0c614eeeb23f9ce90f5c752c8f96a2800b0fc3111625ab76d5e10dd02c2079c5dbfdbcad8274fe46741781658d175de29ddbed94784eaee410dafd6e59e410bd4113d684063d535c6a0e5be6a78a8a8f6c7737ec714a836a72cde8181314d90700edd52978bbb1ef8a5e76c89555a28b9ade3b65ef845f524ee82c543b0e5f09bc6ead954803ad5270c05f499f5f561757241e9ac630aa9782c48461d45911c1cfbc3cbf67dfc70fc686944d38a7dfeabe206380683a0a4364dc581c38434c4e7f6044d58c631993aa12de50eaff05230916855c2a753f615ddc3647f4c36eee6b3dcb796ee27fe17cbd0b9d2986c7b466c2a1ee15bcaa515a3d2e053bf6f213417359bce9c13f76dfad1cea35ab0fc8fe72e80d15ce9e47200f0f82ed12b86e3937acbc82d57b1bdf6a9ec11a2b6b2539ae571ff7495a8020641d18cac04328a04cddd6f014bac4ceff9aed9232b0167384bb8eb00417524fc1cb2d6a64126b959d0ee5863fe6ccad7c1ecab70ead611eb9d25c46500d40d778074e5c8f3d422bac228e91e8b9017adb5f33314c1e766019a62d73fec290779561fe8c5dcf2a364a28f7a0f1c0ec21e8309a3d928db1cb85164adfcc8d6d77ec4dcb52d168c66744ce14e3a54809d0fb249a6a68cf5221db851e9cf44a84fe9b9387dc3c55fa487a17a86549a6d90b8c2127dc5c26bac58bf617c3e2247faf69b6da9808cdf2251b3fe33732323701aada568da352a1064a1f0de629ee0f6ec34effbab5e6b9e142d47390f461934f370d3a1b42c823916fbad0a418286fa6e0aeb85f8f0f9a6ce7aa13fef92fee7ebbedc1f70c7ff2ada999da959c2959495fe1211f91b8fb872f2ec4c57e99ec34daefe9092f3869b49244a601e82b6a5aab648aa7585da6d93a6dedc5a757a1787d681266093b67de978dd19cb9adad513554c73be100ac0fc1268740e07b7d51ae9be26b52fe63925d22e63ef55f1050b078359562f57c1346b23e33793ad8651b20b423805ae9c2777a1fc49f1df115bd8835929c28377d1205e37698c713ed8b9490e5071a2ec55fa2bee8d9e75ad46fcc3b6d26fa5f443374474ada4f308ad4e4a7f7769a4c9fac0c1b9322f5363c7cff0a48b4d9ca49b6f1a31d8e8d4b1c66b515ea9ddf617538ec2f46d3f11bcc26029c49903e5289abab9d7437d49cfcc4a11f5bcf7232f6b3d413f12ad8f4a53bd0011d22983339ee30244a040a0b2c1f7717f1f21a76e9495cef6f1acc3b13583e3f3461f5c704e4dd5ca0c8d0e0d0a906535f18a9d8042cf9f3cfa39c3ef2e9ec1cfe5c707201c1667c78ac5df1d864d8d5ec39966c296e69c5850d329fad8f10ce39008915927e6ba223910fedfc747427a785b69ff52903a5e8efe997b12980bb8e092e48418ea4319d1f7eafd0b911a4221177728dc103a908afc3cc5eda2e5b2257c20b2ed42d626b0bec67318aa807bf7e83fed6ebff03184497d0ad7df0fe9f0856148d99252c524261dfa3baab54e74df4798f0020c0847e5fc0eb77e77a1a2e4b109412c8e0227833c569e35037dabbd26d5551673484c9c4fc5a1102bad2f5f12fbeb730cccf9fe50c3080c8acdee1f9ec26762c0e0023b0d48dcca8e98b860d39f41f2290ba1b202879f04e66942243d3b890299c023b7a76f315c94d669edc2d442095f648efff6c007792c3fe6ad0a2150fb1d85fd7188ebca6540f78b3bc7218026822c22de1039df01321f24670b0fd6cb50ea6cd68d21bb2a611b78cd6ba8e11806a7512b0b3822c9106bcb291e3b49828809dc873cc8796ec6829a4c51c26c35c33fc97f908960e10ee4eddcefbb5599d4eb2d72de4ca04380bde8e52f91772886b403151c7555e2ea05cd11215800d367e8707e754d612250ae2209b928e7623c21e5e483d660fdeb4452c5027245e6d46ff04a31aa68f4b47145f0bdff5412b4258ab01e45ff3ce276580ed7e79e58f64c9e56203f6e9e9f990d760e010b239772212d445d4c4c6637f943bfc4377dccb167796fb2f85b9de28182f20201d6415d369d240688388e30f27e0cccf2ba03757191e4a9e9c6d6cd40722cddc4185d6cad49e8d96dd79fdfa58ad917ce3e97f919030a19eb58384193bf405e09f916dae7447d573b07970b174069b79a0d8919b5e39c59567b69957f1d4952273ec5a2ed20a741dd279f39d8413444c9a04dd743a0973e38a29be38e06603e2ee4c97ea2323b4a09f393fb450c7ddd38274a7797e2bef23144fea2865723c3ad0a7c5ef844653f6f4d8b961a4a1c5f6541a9ed03f39738c9df0f66aa983cf6ce595f214213ddd63c61b6b57a939dfde4eb5c94e554474238d0569fcb994721f235a971a7bc164826bf288fb1ffc47d5f391fe1406cef2ee6d6a50d9a37040ef8074ba3c6adcd0c160eac2a73b9fd10376b898937695b871828c2584768b944a0c924b9866a57ee88395a478a201e3f3bf9c06261819fa74a096a97348e2be45c961e0be3b0f633aa98bd724551c8fce7f0fde3c667c8880905969929f44e82b4209758ed9bbb354e9e6a7f21d1d49dee5427530d645c07cf0d75fe15ed53dba78f9c88498e5a11338aded6a0cd97d0b7de81245b98a597a0f5745b279b17584c171f3aefb4d764d8b2b54d2779cf61731db9cbf8c6dcb9d858b7634d3afb237f54b7c52e670225f8ff6805f5e8861a93a8da2c8b54e2b4027aeca9f8dfee1697a32a6daffe1606f7b541cf5c82ebc6dd1f6a148d28396389bb2d76b644a76dc18b21ae630b83c37bf17230e6f2685cdaa8865042f3402a3aec73c17a7515a8b263ce04a12c028ac47a20d1e351901d7a8083d14517beb95157db61413c6f2185721caabfe3ca693d226ce797b93b1912c55e0aed2de0695f5d4e98a911d87b6aa29f1c285a4d2a9ba8a25a915a65371e6f55d0adfa89857af1106462bc96f4c1a1c364cd4511a675e77286ba8e5a9dbb5da6f4db9e12fbec6688ac2800d065e53d38fe5035393cca2e8c8b4b4a98a181988968e780d709874821be2b729276d4748850cb073c407e3b726d81904bb295046e624562fa0c829ecf44e5361d8c95701932d7f306c3bc0fe2c5c88f6b39ee2164bf183ba4c3131026040449218a2665d2521845d4d071ae58ee86764afc72038cf7558b82698ee0e32e3b5bfc2be7724e21b77e247564ed951cb52344982fb2d04a2831acad97ad04f6077acc331a79ee4ba6165bc24fc2a278a397e0134600f0cd9fc48fc7273f202a661e5c667b563663d9c1bda61ea7e6ce2d48e0881715a9121e1eeb056240285500af94e2c331fbc2eed83e7a72b6421a5277296bdef6213097ed355d7690b1dea104e86648db76fb27f6236a18636ee19b51b4a3fc595435f08c9784da16ab62ddd3b5cf25647fb2a8a65b6e4c09b1baa22a6d261462fb0f2631eec9f6fafed26226e5adb6c3b0729700e0dc19bc0f102393132321f50f3a637c80bbb86a6eeb07c09adcbb4dfe6000eda92e65d03569111121c5eb207dccdd170af5c93867829d0c1af992015a32f98a2616872a5355f49cf9f1dc318a311d8c3cbe37c85fcb4a232df0040377e522bb473514d86dc417eb7112f14245f8176b3f69524ea9bd1ff82771d111ad791906f32487bd220ff1a80bc1f28d479019e7253dd12cc71d37bf2550e73faf0da4205c6c288aab1524c17a79ac7818289d6bcfe72fbf746e1d92b064be5471cdb951d528701a2d178765922d247a4c1444c02bdf9a38d00e0ba3aeb09ab5463c5a28d461759b609952c1ff1ac15e497949bb1da603b5cca5d1dfc2e9e75e0e65c104dc126dbce4681167b2be9cb4d09a3d7c6d922860b179b0ba4113101f782a5e0524058907b07a2b5119a272285036e517724ad731f49dc83b4467a83c148d1612ad4e8a073e7007691ab8d8f6c6401dedb76303af230ed5c8cb692204623c6e35961febc5470e49317397303a3719ca6b2d6ec95b6297b346a938d52230d234f1e122cbca681a88de6675e7a62d3e3387d905e7a1d01597909e1171f8ee543858791bf01849f4b32be22735c799dbddeac2324336df7c4315aaa0df2a88865c3890f0a16c22bbbacbf4038b226eb903466e1a21b00d18d8485f4c5ff6c83de9948257636f38f8dd2c2ef7cc632f7c5388226c370620eb8427fe07954a15f7cbbe8936ee51620ecb47c106f79e6d06bc5b2a1ef47116deace5e33e55514c464fb584db3079d8f2876e22620ed4352c32aedd0f7ed4641f6cdc0b08c7a60ee95da9b7d48cfd5532012a6dd16c5cefd7d83788d4803931ae40231c51cbe8d9b4361d4e6b4b3f9ca5b6b90318ccbcbb07c8f593c94b67e007292074fa10f4e754f04fb898dbb7fae3a116fdb90b8a0dbc1fc4d02c8446aea376aa76bba5c1c18fefabad7cd9f03edaaf074b333c995a7b22ea3e3ebb475dd3e9c84f709592b8953505e065a712b2d63b05c1f9662e76306dc64e99afc24188bd05a601b7114c36ed29e0f717f121717de6ac35281fd1a6adc79618affed02df54b36af91f78bf72660cd45458cbc079e17004919a4cf83bf3607dd579560606abf5917f40c2e60df4000c5523ab6929447c563b32e853de8ee8e1ec8521d274124010f9cc0a20e25a44901eba954a6f267b7ae45890e7c8414886e39032203c6ca2a0f85b778c0525a78126ddd8c6bb3caf50a8da0c32372966af34c576e7017268d058f0bda3ae32727b17062073ffc65a4b836e252320e7d797a52f392903db0e0a872d6743c9fa3eff917e6f1b1fce37f00f4c1d67fdf4ab46639931f2626d6a2e81d6ac12149192f21c893ade20db44ac964e5f15146686d757fd18c3ccfae8a15f0eee35b5619ec15fc638aa433f3470311f4972dec7b694eb5bbcc45e0b1b08d1d2b5653f7795f898bc39be6a66295b5a9ce9b4e75e0124780e6d392a7b1e0acfd3e309ac371588cc88ff8e26c26d2904236ca45295ba12ed5b870a53521411edb9ff1e6040ca4065b5268674310bf3feb3af2fe8f7b816dd4fceafddc5d51eec3050340e1363b55a641885dcf7d76b3dfa2ec4444354930cb66510a0992d827674c2d4c8337f6c4b885c439d48c8c80c2fc391041dd3394325a03319c9f50567436b05e1413505e85ee77135f950d87b5928b193316e6195a325763f106c079b64ee9cc58833c00c9c5f3294730cc446b192987993f818a83a394b22c5c810288405fbc3080b8b7a58d0d3a3b7b4c76045f94bb709899c43950e4cc97385130ba438b2ff66f299a891dee0dcc10bc6db849453e37b9c317116f90aa83e906b9778af75038da595fe3ad6ba3da20589f78b29cc073c237a21fc13e87a03c8b2e02d9792f778c50bf4397859e0bcfd02f79a0e47a34cefc8c292145a4f3b3e18387257f162c27df13c5a89da83ec7814db28aac179d6c1831e9307b9bcbcab13d1f3575586df0568666b9e75fcad69fad03ee8ba3b5d0e5ff1df79d69b514b6698f638b57c5834630d117a1cbb30a3d2b0ba6645daf77661b570da1e9ef2a125ca1a10d6ec5107c0054ca2156d2eb927f0790bfc11c531ec981d4c5874593313382ca19d463cb42e35e233bd350b135ec872b6b6e9136d710cc033ae07e6752967161fc673e151d1c97638a1668b25a4ad467c4cd378af4a1ea3e1fccd24f0d1b371004659845e550efd64d7e3afd0768d88de0755b8ed536d68a00adf4e0e6109503f99e18d84dbecfd6da081f507d30206a6c5397c3302751d6a5bfbc50c09a5b7c48be6e8dc67bbcffd18833f88e728887d37fdd6ec83e4360d2c31bb6870caf56444e3cd031ba4fe4bdec7408c1b35175d7cf30bcf278873ffc2a6c63ea7867cf243cd3f2fb752e5e8d245c76ba8b6eb15fc31bdcf8ab5deba07658db372bbe61402721f1d8f9984d9bcafe0c8aa7c2ed42fa6c6d36a36b8c7aee31f91484fe322fe37f95e61d819099640c0a7a767853bf1759050ae1038dbc9e2f91145f4040b5534f862010f5f83b128a120709cc7067d541230c52ba5f58239bf5612bc2844250cfd1bdf5b13dfebcdc42934b7e9acf8ef04735e0c7c3ff9507f70d96499fa72a6f3bab165dbbe1936c4ba73393307932787e6a4981a1528cbc27bee0ded51253e8bb4722d97dc70ffc25e0acdb9fcb5cc2f753224d0d0fa6c7d53e6221ed9ca76cba29ad9e6b2506b68f3f92f84681fe872d63a0e3e089bc3432dd22a6fd3a20cad78896ef9779e7dbe8cbfdda1d3549a1f6072008e86029b1595986d9d677e8bedbc34b3607b868241424ebf903f73ab5517fd14e139277e298e8173dc1070cbacc6a618b07a2fbb8c527d8dd83db3485be966b70d0b5f08a721d2fca947d2ecf39eb78ebadb663f7b31251ac68dd76cd9c3c1bdd855c87db9b5712ecac7c3dbb828709d9c6de3f9e454a78e928df8576c0716f73f087636232554eb64958ac2305f10ca07b3e421bcfc8481574297ef38739e81642aef2596ceb2596aeddc6125ce6aab93f36c3f471f9b57af42bf819617de525b592f5aa9add4f3dd9eb4f165dd5685bbe2a63916dba6ca7329104a351ddf5268777661c661249bcb75b07c632bd3bf61edbdf0006f56d310782bdd624ae85d3d3ac3ddc0f2fd99a69116e66cf0e9f6bc79ea8872fc9d6396edb8671a5479b47d131211a56dd054fb80bb74ad20a8fe1f3df95784023356f0a93bb79a0ad772d449923d717e7e6fdc900111cced9226c60b1d95fa5aa9a330651e1182dcd061dc781ab54428545d8c9a85d61d5c59a38ab01e92bd35c115586cc580aa37a2f2aaf0b8d9342eee0296e2dae3f0d40cdedffd0bf5a437733f10d65d2ca6d416d650fbba0c331a4ee3fcf94cc79e4194a7d113195a7781e8e74afa0034a9929d5d9fd4e8e153d150854205053647f8468f7b540fb0ce467031cfe18be5dbd5e68fe27139998bfc0fb7e2daa4a0de048bebd62c916c7068452fe2514f0bf23c5b6edcb100162bb70b18b2c9b9a4fbf4b9cadbc8568b233f73caee542254bc4530e5680f11db844e86d8cc8000f39b7f5e008b2960510559b3afd869cc1ea7793b2506991717a5c04421e0e65132afe76458770e5cdf8eead8eff82c74ff63939784ce23e76db559b788e9ebf76d353fe1f3023c249c815c0d44438dd40e81075f9be1a59f12f6ec5e1006514024070cb83b7b8d024ed3214457d3ed5e3df907a618ea79c5f413e1c1a83fab910a8b3347a4d8cee0c4f1bbfded7742bf5bc68a36791c5111f2420abe3353eae4c7967105a3b180467d1519e68b3c347e85b9476cc4f876277237efc8e8151cccce685619e31c8b6a5907458ea3a48b7930a94bc2631867218f734f56d345d34b3ed3f6d1d55f97be1a164252802f516626fb78f33590f1914515ae96f4059b722a7bf0954d44d37894093ec9d527093f12dc015614843148bca6de59889d582f58579cffb0765fca88b75005744d784116ec5d04e369783b9184926c10fa6fcf8d2236c2e401093ee5f2f3515a511a32d99e46f083ad8be51585e06aa8a8f4db2c9a5799bb457ad3387076b1769a9ac1bb8371861ad0577d9e0954314d176c613d2a94dbaf66e7b21a29d13390347806c6eb8d8e2be293ca36100e317135e9b3598baa484b02bab3bffeda1544b091a1c7746afee81d7d5d35d00450448ed8836489c25dd16d1b11410df100691a9a42630971c168141050108ec2ee17a6e5a33e0e1846dc8076ae91ad1df7a91ce0eb40fc0ad2335eb804cd27523dcaca76a6050bbba8aac8a5510538f81d563a1311a006efc7e0523279cf8096859931d338c19073cb156a97d7ba2aee13d8a61272144e6b59057eacf9720cd6e7d28ad6a7118e6d39ace23aabdfb4243970394f244972fd6d7a1b180b280756e22085bbe2146f2476087737aaf3caac93461d26cd447e5889f029331cecaaa4eb86609c29466f45ea4b37c2ae3ebcdf66d43e8b4242ea71b0df9376fc39c078a3fde4b1069e99929d99dfe34624bca92afb48b00d7e85f33058dce5c65579d6abe13a041d5e00c2f91046692a5a4b5fa5e87560f631a36dce912937585eba7480a81ba91af6c2186abe8cf7b4e13ef86622c208e5653aebccb63130a71b7d7174b926fc74de4a4bcca7c8d48b0daf7d319042ad2a949c55650917596a9417ec28e4d3c90ec0801ec01858e5d13d8ccf3cb1f42e428817d2baa86173e4f9586adf51141bd3d08267813aa4b8d638ab9c111a6e69454ab558cde8f1ae91e0f1e941e849ee7ef53cc6bf1139cc2522ae8d682e1b6c4db888298b90c499f3f79d1628c9fec96c9e13a1fb62280e3464bff531f5d9a0217fb14e7257b512eec1997224175a26655aece977060c1de4564cb6159a433d26dbf2916810a6ad68f9ee7c58cb9028b89b8ff7854c123acb1660a1658367e4bc1cb0022c20e2e3e44673a8d6731ed0a01f6ee9c602470efa0ee4b9b3d8c8057dca32156f5dca987a08ebe13ee503e65b572e86983faedd806c77b23ee499edf47c8d9fa0586a301c553c2e66a74f2d604e0c9657589aeda5659e3016be8d839befa905b7ea6ee790d945bf18b79edc533d6c968eb23beb3cbc000c57e783374ba1772b5d82e115ceec461f581f8133189abf8adc9020625a1b843f2d5004f4ea2ab2adbb6f3701d6d5959ea78576f1d2fbeb792ee4cb8000c53d1168b12abc0e0654f2993716800bf35674702c9869feeef309f99f5829642376385423095e1e116cc690da62c6e343fc601c243669dd5164c6186dffa8c19471b95ecf47ca301eb6290ec3bf210a5a2c2720f3108d181b91d64ecc707a7908f43c7fe2ad28af62854bf7b08b6abb25b868fa0a3407e87e28b14bf87308cfc272b8563a56da825205e946e2a1199e26c1b91e2170fabff9cacc1fc0d36b56d59f5420b33324fe0342afedfdce1d7578706a4dadc90493669df4a9d8854ecabde9ed512ebc43bdbef94cf3aa733adf79d6c70257171666d6d3569bfbdfae0eb8b64afcf1a8f91d61026d913363b5c382a86b04e42af32dbb6f4aa20e54e738ebe1a8e7959309f6320546787a2e27053e1e0963061e1d416f71668259e02036c408c781b4fbf060fcb08558c8342720567a62f3e71fade1facddd1dd41ec33ad4a8a45a2aa0d5429c4c983abdd640da1d3cd4b4847b6b23622e9e8c291d19eccd292e7afc7b021d200027418851c124dc282145f6e06caa427aed0266d5b42d570f327c72ef7463c2d43611dd19700cd94dcd998a4165d0153c700a52d7df4528181b51bbb46d9aba9a2f09cb114119c850102a46bd8ce933ee967e78be73b553ee8f3c4efe701fdc3bf9474c0429227d380141ab2ba9db26be0cd05630b5c69b64547459af74cc7e32e5259d9db70c5e6057fc96dbf6e224dac421290bf64b86c458c14de9262c458f593a820847a972ca04549a51e9cb65a0b3e6962e2279b221902805d7e7ec8fa8ed1e450f5aa64efd293cef930bf494bf627ad9b5559db7500ae09bc4e683cf51b054962b78275a38bd1cd770ea5f3eb5fe6ecbb8d4a97da8e144fa4c1483c8bbf7f075d7eccde2344547bf5eb4e123e32b4e386cd5a33daf30790e75e241c64a422c5bffbdd8f0f7f1b889b6a0c1ce10b9b4c3d82b183ef19fe24f3d0a50e6764b2c471d8ffa0be624aec667bf55836a42453e1ef829206f83fe7f9b82b5fb1d0ed23aa5f0fcf080887ada006d788587a0303a2d01972d67838dbb34c6f4db16fabd6adf768a678be1158ac0f5028d8aa4f9c79c8a96e84850943036797096edc4283fe8de56bf1085c12ab316430919a3a4ee0ecf9a2c03b68e46f61c416e7bfc9fecf8f9a2dc5023b16ef9016728018a708073cf73923a9a92b8c02859f22d580831b9184b35ab83513dd912341a1da805de2b60601af2ddc3278acc150cb048ea90baec3f7d62abc80bae49cfd77c86b14bce26887d8cc5f43ee4a50fccc26308bac3c34e0097ff90255ad25ac586635cf53f11948ffed951abc762b13504ba0ec3e2130e79800328fc1819d6af7cdbf53ce6faa2821b6c80b118606f548146490e3318100250d38fa1d60970e765c36e8735599428109381426e81295e321c5b317cb61cec276010e6eac659f46a0dac4f1697d64e73b59b7d8a90208e7bda43ad698e3d7c842a9cd438fab919c37d19b92eed067de966aaa99b67330a19f6770e66eb74fd56c7ce5974b7d7ce694af149d475b968c3adbdb25801fb0cfe863f7586475e3f7f85946240ebb68ae3d87100aa01fef0b2153c4e97e8538891076fe31dfe7c7820f64f4079306f1ae1e545fe176fd42a1eb79940f3fd29e0ddf471f834c316cecfbbf57c89d87b5c0c6c7b87305821c08193f56c2d7412fff92bf8a1936b76774df04ad09d8cdc4c8c203a59efe638a348bfe19c36db386f037df7491e37b99f1d791f581cb6aee730be0c34c9d4a8ca95932cebda112ef6c6bc1752eaed5a0c7737bc87e9c65513359e2d8e50f9c1dec5e5e52df841fa79903b36017e29c131763632e5ea5d4b9c7a76ce59efd1c25f1420ef682fa8d3349d0a1b9d4adf989cab8c24a52a3c61c9b0ddf8f5f2e914777c39d91e0ee3c059376bcba5bc5e502209145b9522cc3cccc912c9034d1a1d1331201b5b5b821f27ecd74a00d7354ddc345c5525bbf6bb655a0270d55e383439d2c6e723d053da6545d00a4819ccc602ab36a5a991b0488cd8c3851fa5c155bd8ebd0cd25c4138a5e420c426772132535dfedf1e3cee6c5bd828d6d1b67c697a36fa8fd6e654940f464e9fe9fff9761b3c733ec42b97c3d8947b2baeff39bffcb465a6a93fd09323ecc1b4dec9b6d9247816e1d21f91b7bb3591ef24bfdb92df5d5f5ff6857affb13e0690fc5e897cf6bb053d9b8d2f6eebcebc07e6392fafef6c636be67a98bcdfadab7f3aa9bd20321537ed01645d6c639de6f06f7d47874dcf9fc08377014eedce74ec6858fdcdb146f03fe6ad667896844ff9a581e75f267f4a70f010989665fec476f58761055b020701d2a5379cf44ee1fd5f12e020fa5609b17d86fffc9f13feacfeee80068247b6be7c82922a02353ab2819ae6bb492456dcd979b5b13cbe8b14a606107fdfdbfab43dc7d2d353a050db90bd93b06a70f6caaf6cd6f6396dfcb679b577a687db46f043d8f3aa649676ae6f3b5437071f27d4da4b970e236334887f8ffcb3b5ce38e6e185362da12bd1ba655bc178e2bc9c81739498d8ad43cfa14c0d3aa8dc388e8e2db9e8d76af199138cf1eca9eb77480cd12fa1b791992ad1d2a55378724a371792730a9fc567cdd6f6642b99468842a794d8cbb4f4edfcf7da62f0a39137f0ac7f8781a68149d89db4693a58f17c1dd3a18c9d0fd7de2df14a1716649dbd829749c70082eaffb65b9a62d6e8c6c7e7df1f6e09bba8404834a0c955c46a63540b52d5d3429d16de1e1d504e5cd93706a9a756e4ec507a6ee47f4959c2c1d1fe500d368738e57f7f1a4b69575035bcba2f2f64c415be71c246a7b84e504088694d94d550afede42fab9242d4389d696a463d84d53d84cbbe73733a25b060af67a2fd2c04a0ec1a7bbbac6a3da27b28d70e7a5cba5de227ece49601d82f761986267e640c003236335d7c657dc4e758d9c9f93dcf0729bcb1f74eb9d8763651b49da33db4878d51ce45fba5d5e4c54f02c2b5bf01e288ccf143b7693698fa5baeb4fe55818dfc0b0e20de8effd2a032c5fefffb78c8e32f64809c5226f2d89ab5588e756c8de8d87d19b8a227c5b6d1854ba8e628dc0237d7678dc7e4f6e9b6c399b4b94c7bad0a76be55ebf4afcf07ab52108f203f8d86cd5b9e2ecc21a0378f9efb424d649f98c9bf98285935457d5e257cfba04979ad3b573f8ff9420dfa2236f6327daa75dea658e50095701966042b1162da3cee50be17fa9a6a9ef3f47d22cd487a7bfbbe119c6d41dc0ab25eb139169606020a3f45c40e3ddb626e7a5fdaa304b3adbbfca533be368b06263b84705a49d4e35572b6637ee2951146490df5c9309e0f1888dd970857ae8ea6f0829df2b4c5d0461cef026f11a745a30fe853c4d6a6ef044395a5c30e42bf0626acec35ea667a70e97aff074e3ba5f4e6879bae894ae408fc9ade1bdd0073e813dafbda09b0caf54884be0ab241e23ae024800f6aedb073c7cf1f3a2e143179c9f1f387e119513e84c441063d64fc15ed9a3076b86bf0577f577e7bd647581f9b4f2a105e21a769be2176d46fc439266a81402090c47c78efb9d1f678ef36e9ab51d99f0a355b2b37f3cacc1f39c79dd825005e2f8561d9c062b3d5c7427ea3de2648634aa9f51fc77e55fa82feec00bd5dadff349af470d458f5f7b68b6aee87c08a56eb780e54061166fbd9965a95f57b3348298e10f498bc2c1791b86cb7dc80b9fe4a465a65c39a00d3f80c05eef754cd1272edddf9c1c9ef3d2f62c2258b917cac6ea134c8541d96b443fdbadb3eacd03483bc86080de7407a6b2a10baa55da9b73328243f5e9f2ea72a35317dbc80697d32067c736d3c09f8f54761866191f4413e080aedecccb862f275f348947835ee74c37f3e767ea7b481dc8d474ffa9b4901d786b60ac2deae808909db2c9a557aee54ef287fc0a992bcf8eff2e5e5ba28fb0d3d890f7db7cfa1bcaba8eb3cc121a9bea3e8161dadab45cf886b93044a4e24d58dc456b8e44f26bba839aab96efe0c09b278f1f1d6c211f21a8adbce790ce6a82949c2a3bb4f06e20e59174c80da13ac17a33201613b80188720b89d5d6f6de42efa45c3a632eb451883d96e82dae06f289933ff6ba7ae0d2a6adb4c5f488df4f5641e208608e867c0890038eada26c1a091373a41c88152241b38a14eba2ffcc171de81386d4cb5ade563d181ae71b59524bc7adfa7d70c53cab23082d40533428bc062cc19012377fa04de3b85596ce05cf31a399bb4c6b4890aa8773195c3cacdf59f6dd171f64be4538517a58667f2885a65624b228e8354eb6d91e99a8adfbc714ff4d6bcc3bfc8d82a08dc503e3fed5e607b13101326c34c39fc40028e0d939b0e89d949c489d632e0e9389123094c34795a9672bb0ea29b7cc11a4aa5f87f73783fde9ee4749efb2bda978f73ce0e46897044ea1fb5fce1aa3025303d7a9c4e99c78d52047b3fb0f66d22603a0368323723c8a58178d21b07e5b61218fd87cf3690fb6b40aa7444238e40df6f03178c91823bb2885f289a85def11ae17d927544b52c809fc0659c80428becd5bfe60810d253eb6cc2afd35818fe38f4672d0746ee8e861c127162a86555866c347215c639d3d9c43972711aec4b35205b43235ce6bd354d2f7485020516f9fc7b9a4c21ae9eecb6364936f3e78b446890d20ca6c954f073f6a0cd214d02bb7d071107775a1f66e6ce40eb36309dcc7bb8c978aa5f9e1afa9cbad9f62bf813b4ce8f1804f871bd466e0a1297c9517c8580e2a110827c0ddaffabd3068748f0de6f9310650534b3834409cb0e40f09fbe0d735c2e826cc9130fd9d4d2255d184478e0ad4ad15c45c3cbe3bc4c927c99121104aee17d5b4307e70a1003b7e89004672b5701702299b44ea85a6f79161bda9b1419ebe8fdc816fc58afd661b7d84779d866aad97561a9f080c6a5a78a25ac5d4f8fe185d13df36c154098588bfd6448c94a8af2ee058d0eb323cc5082952f18c0c66459f01e2cf94b22d081d698d564bf9e30dadc7e0ccdf160685d1ae9b058c077a3a69af254f24f4a2d1b53722b3864d4ad93e4e6cda41b8d20312152da35fba6822638b7e2c5753396e10824e50a08b56d6239b11f2ff9663326aad07240bc4b3c71205c220046e30baeb900ca1f62befead2ac3ccf48c1536152b09a1a739e079fc0e3eecf0f7667b413496428aea1a64bbf36f4d73b969a15d2d421cfe62f12f6d62711da4258efd2e7788d2453a7959af2d5aa4283bee032c6898f6ff97125be79c3e1e58e5c8a65a8c0b97c65825fecb58e0b12d4b06016e879c4100aa5442c95e6b4e22f06b5ba1c215be630211a9117fa382ed6927f8fa00f299ca8900901dc83f6d15cdc073667ef89d9335a10f601b9851f4e0fa84fe0fa8d09dacdc16c7d30c4de35b3fa4bbcd8422ca931a43de0d6b4c7dfd3c439b68098c386f3c5cb53a3c99fd69bde15e101873d906ca719f9f786d2eec9cb86396caa899ef897e1390361bb4b634f140f389c5320b8cefd7101955ad2ce57c2b9adb5644233cf5fb0c5a4334c6850b46685e637509c555ed5b8f17385123179be235644f58e683f172b5e1a1fb983ea32d2d340cbb7c4eefebe33cca9f31a2ebc7a2c0ed9675158c341c47465f195cb6d603984322d9b624bf19d707eb3258994ae8eb961c02089699e338f5aad69f515c4b69c9a66ba3da86ee83243c3e7400433d70161d247921eca8df4af44653753402b9ac0da33ad613d1c511b32082445caaf5dd9fa55205a904498597903b6c34ff133055099efd694c1bb1cd75d143332444c3c797a9c110da818a4b5a5eaec7955c50db43672f694ec45d4df7f66661d2c2a6b4c3576baee7dd187a70b8945b50e6b71c53281f7d7f5bb2ef3811db89407521d41e4ec2467c75fbd65ed35e8997de081e0f10459c9267dbf7ec6f57ef83dd299ca944748a735f06ce6567227b660c490bb484c791c304ac6ecd3de111b5285371885a19b201d408ea884f75e540b73b32cfd732b3e9aef0a7abc83012b5cf7526ddecf8be70df2b1d735b1029fba36a8ade9f7012fcfd6a57763205bb5c423810632cb83d46fa613de42219a23950fb22e6c4286f8ef5405bfbcd2ad748457f901e80f018b481b1943ad0af8cc0b59ba8fbece0df00f198a902fc582588f80f3b5e71973ef2789692ccd34f55565b47b0dff5d7ad884bb2c5436bd1d1c0c37925792cce169d8a432df560c61392664eba771f829c9b30a69937ad7f527e51d1138176ebff2f6a38d2b0deb60cef44c6392ce292fabdfd43899a94371fa48233066d5655d6b34a94f102f8af5bbb210fe091086e605b9126451052c5c511c63847e5acc8ae3b77a71fc5bb665646c5f99796a7955edf77d04759fd25851f50f9ef06e9968e430124bd0c0df827660e6604df3899018a5ef0a4cfe02c4f84e1ffbdb159e594c161b2ad84cc41c4f692aea26bbe5823375f1f916e2e8e2cca906e3a4a17d936c72907d2e75e50bf18c94ab2b76c89b62f11b72c10b05cfaf1a06f46a9d32ccaf11573f5825af831a82b65c5a5d3b41566cce612604f8c77eb8e910af2d6e86e3d18bbe5f1b249a74d5b70213bd3cc507bb1c22b48a96e49e4af0e364cd7a965477626019de3f5cc234835f238623686cf87f2d1395ce90568b7b4b83bb863e1a92cbce07372a2e2e98303b8a23edc9030c23bf90191a1c08074545e52856eca92e6c885f8f851d7c4cf714a8e09519b38fcc41b71a45a93e592df934d1565f3589cff73c1558c99081cc86d85893b99e38b8f07c2769fc0ecca0d6824b6d630668a673694c4ebeac09773b0251c839bf62a883208cea636079698ea0923a0a65cd00cab9b0ae751f8764cacfc8e7d10f4ac4340a2de874e4bb102f6ef2b5f5c76cf4b83dd7d039f0a57f2d344e12ac36e05d2528493a54bfd6518e89ae547e92967ab1311f7c348742cd9782e47bb6d62791a8c5d3d0e07d750b9e7ba2e95b6045d9b96911d69c4ee6b38c0543ab5580860cb00b23eeaf1ca42de20195f9350d1191dc31d92068b1c1c654abb1f597c29ee9ca70384d58dc1dc7935303be6046d416a080eae95fdbbbc7bc3768844b363901ac24005e7193d2081516e2f65451824dab3c92e4cf271a1129698f69a94d34f9e94f92632c600a0ac56e6e77cfa2f08025af1dca0157867bd52f2ededd5d36dc860404f41c9ad5055e9a42b026ebc06b201bfb704a6ca6de4c25d55c322f381bcb010d29f95a02a3457d88820b61c3f449d21be6a35077f4753d45f85c5144e8bc70f9c37beec2250dcfad7f37d43be5f37897c33a5f90862576f78de3bb74f6fba982ba0138260596926b0ff46e5fe61173ab5e5dee21bb168d806d2ee6baebd11cdaff296f3d735b4635e66b0f72e568c150fd95798584152d1bd41cc53adfa34feab41be01aeef69fa7b88fc2fd461bb59e957fcac1124336751765977ae2d3166f5969be74c101973a090a6bb79bc48cfbbd7a90326ee9036ea9b952b3f6dbae2769ccc7f50e8c305627983a43554747cb6e758d03dc1cd013fa3fd092511877e6c97095713af64696219427614fc23e3ed552daec217f30c4a5df2d9cc143ceb916ea9ac9fedc2009745781bb9d1bff68ff215b9ef961ba29cc897617f2552c18ccfd5f57fa966b1b7b1e4f3352432571826eae9037c190edf02e564142fb8c6106d4908aed02062ebff97667bfe7d2a3fb119fd0a7d541200597b07e3dd174797a9064c98483eff842f9d799a68f0a7e6e5e2ba769381426dd965a05a3482fb76929babcd55c6ae123471aa05658509fc43f0fe2af17ebe499ec3d96bd0b40a3c763e14765560ced0778d3696cedcf866ff528a1d44e68ecdc980b1b806dfbae285da93f53d60d99f7b391ee08e6835cfb3b04bb086e062677f799f55c1a3ca7972e41e94212aa5bc066850a01d55974096fd7fa9772094b1ac2cf132ec3f391adafabde8b37fd9f2577ad3d48fe7d663f33c75f7f8f685e579adfda61513f7ed0e5cd50d36cc6bbac2c0e296f20f2fcdffba2e6ab0f5de5ff6e2c7195ef6bddc5a309d29e465273a11b87f754e93f7ddfd1c9f1fcdf85691a527f4e96a9eb1ff4d314e670d3f3f8b07e2a17772075e603f52e18cbc3b6aeae653fc06cb027939df48e671150835426aef1c0e60e70f2b63bf569d7e02c93fbb2144fbe55472f6ecc358d0efb8f6772c7e3f4c0acc2ff275bc1cbb7fc6dfb3f513ca66d4b49c98637db97d71e0d8cf8b952e3a2ed888ce7a6aa191dbc2acadf2e85a714765d066f6c4a08fccbe9c045b5eaa9935ee6f0ddae900598db48c61e6946956d23bb755ff8f5f1ad59e340e3a7cff680ff01e870a3b3e2d3c17331d2f63a5a37d4ed0554dd3efd88d79df328f853d59055ae8369b44ff192cfe38ef3e8d0fb60b4f0e84b7b742e2216a4c58b3ec598eafd6f25392f839a6749599aeb2477d24589d500d1f0f9fb46d7167d96b3ca918f64920a30c00a0fe4b72a03f9fad18eb751806b5ecd4e6f760246164c12f0a4e8dafaaaed98ba3d7201f8a8e9c01455bce3bda8b9b66606efdac76eb2fe7f17912a8f1d550e8656f1dd9109e5e6e5147b03c285e0c8ef8fdcdfc1e91043e11357d72cd73279f85e947efbb1144de18e7f053b037ad9c87b895d047c5a8b4be06f128594a13a76b3f59e214a52eb58fc544097d2f6e4bf811315adaaf8869897e407c4bf50331d55213fea7dd34c67e2389cd5f510a323fe8e3ff275b6f958ca00b52e492ac7a2a94075f58725458893f528c4bfb756228f10f156fa97d4ccc4bf8dbe256a28f14c3d27eb5184ae4c3c5536a1f15b312fcb6b8a2145c128db9fb75624829c74f87a2fa9a6881752847a8ed189c48faf1577874a9649db0c900533d46bcd2f97730fc3e4ed94ef70c8bd0f3b01c2cfc83c372fae415f96ba576f66c694da7c3b6ae8117cc0a0e70898728e43e3b99781003c241e303e8f5c4f2f49c7c6e44cdb049559aa01c0a4c4242a198be514be22e2aabe4fbc807b1e07d18fa4ef4df06cc3d2a3cb2fbe7042bdc2f470ce2c740d96c1d3fc70f76065da8abaed6b1bf29b27f417fddbde7171c0b50ff62f881fd4174a3e7f37711c2bc0efb7731b74c51f625a0c7c4f9671afa6ce1e38272309f3ade0b85b3a7eeb7fc8714e093dadd60412cfedada741585c7877d5a983fc7da028ea35b5ec6c73f8e442414402899c27fddf7320c3c680abc8787d975a149b64e20ff438ca39a09e8c2fd47e274f341fbe376fc76fb650ab21bebd8a84a83c94cb017d8a26f2c980b7644dbf1981aa2ff2b5dba720658f2708676642e80eb1ca6ff4509d8df1e013c622646bf77283a342f98450a4e9f1363b0a3a7cf7b80d307bc7f904bf2207e63de206fdf225cf393959d397e8e30a1bd063f7d197ec2ff2969fba259817ed9c73e4cd804bc43f69ec4300d9db04269d03b2c7f289a3fbc65cf84dc96087069faa1d27a71825fd2c56c59c531d5dfa231372c2ba4871f3c17dcf7f82e35a4c17326eb696859c0d3e32e8f49a32580d08a037908f88824c338a7ed2dda36079e435e238c2648b282ce971ae9cf3b5ef9e7d11d0ee0f161c726ee3ef547f57226ebde3409d2343ef7bda5de655c26a36cff1c2ebe97ae11b4f09a8ff7f3787be6fa42dd99c20b68509959eba0103fbc3cd0b85fcda59695747660930e71cfd17f52026429be673076b6e906c8137b556aeceb1bdabf7fdc17731fbbb8600dbf2f663ee7a977cdc7ac9d806a7e5115a8cfb22372a5ea66912baa88f2cc816a7801fe481d6509f007a8567953089b131df0b77707fa33682735917cdf7bbbdd15e8a9f9178f9eb0d98f1c5d7253620254103e407edae0d518be79e2542236a1929be3ed1db6e80e8ed27b349e93e816696a49916274233abdc25e583abf54abbcd7fcb2aa5b84bdd4a1b928be84251763fcf57471a851fa933a866d9c717cb49dd79704c8a17aae5f23dad3c03060e1f1a15a9aa8d425cf7ff15c371ae29f7a65c79bb6735645dcb2457405975dc2193a17c361a336672e9ab5852bb8c643e73133d8c541068ceebd3264955c86d82e0cea063be16a27e01fcc0ffeecf0776b1028a601f0d286cc2c7ebb077a284d1a9b858e750024ff51bfab29629cbed7024dc7cbd069486d8e728a2766208028053d9255d1b0919cdd9a9a22115508a8a7a742dcffdb1bcd54f17a53687ba5c06adcb2f422e3daa181c661909c2ff0a0c6a4c8394863e81f959ce80f0462a04f0b1fc589e517faf0b21ff51a55b24c88fd0c70f575b05027e78141f444ee24ca8821e27a3759f047dd60845cb07337c28d97ccbe8f4b878937da77ecb135cd0b975df8e41bdfa6bfafd50d52ab64ba7cf208acfe7e899d5b733726a7f138f3e385151fd80c79b1a8e530b16374e437c8bcaaf4302c35e2e8a08a0f6d56d822a81bd7a375c2fdeeed844f2f08250e2a1e21c28faedb20bd3bef37aa41292166a077e905ea7dc963cb002c8f8f8797405ac117e6a85296c6bd696b712555cb5f6b08753badabf6e6cd8a180d1d7ff4cfc3305847655dba6f86e63a94b0d305fbdca5f76d2e47a9a71a4e5d0543eb84b52f7e5f72d63eb798e3db4142f3b6a813b48ea07ed2650048316a968aab17b3f88de9b1bf31b6cb589014980860312751de6646772a7de7810e7c384fe0cf691ebef9e755280f2ebbe83ee0f91edfb9d606175dd5ba3afff4e1a973a0040da960ea1d6132b2d02e5e15599aaee96345ba18e2a5c2040777f9a6b8e5b5983778ff64a2f429e24fecd70dc17d3b0ccfbcfa1f6906e0241580ed52beae68adb287003b38b6d5a876a72d7fd2115e8bce66224437d05817dd9aa4e4e8b184917fb91127809e2f1f7b0f8305834f7bccda695428170040b0040202909d7e23e3ae28a06f38505a860a6a6d7b329a8f88b48e4eb14121017471484d1380ce43dc2393846846347411741beaed5441cd711e32ec06550722fd7c2e34606a17b37da567757ada31521b130d7d68c3d8c72a3a7923d052900aebdf7092a25880e58c7c0570f5e25499afe3205432500ef9394a4470a05a128304fc094c6ea14765a615c76129065a25bd42a52c70bb2052149035d44dbb27eb849ccd0ec4baa88222ba097fcf3dd06481591e418df18b4615048a3c1f6bd7b731d705f71539dd6bf7844ace455d16ba46bf984c5198fea58ef4e885f35bbe14ad79093a0c2fe031b84156d44dbcf0b9a50125f5342e1923ac038ad3e2c33baed7425d0200e4632e4ab098b855cf27b421d153ca006a5b454760e35b16944c77fa8649fa625ccd7a029772c0db051614f1a2e843132862bd5673a79537c1ae2a5cda1b23498e8d0b4c29d033cdbd7a426c1c44f3219220e3829fa4be0be07fdbe206d5392fda5ec97510be25ce457db8adcf6da9f25c5e8ad5fb6f7038191faa05952b06cb6dc2fb738f2d1998f46d9a425f79c7ba6436891741d1110f26252b37f7c32bdda896d39c8dddf5c69cb332958513ff6cc8844e3ac608770e6b3b0b7f1efecef90fe61a92ff3e932e91046f398a060101ff73deeb5832722a521f6383fda09cc158200eb0a8d1dddb146d16090516af44240a8eabeb36ae9f61094c3725d08e958c91da04ebc23524d0c82c69649194864c860c34b0b61ceba813f849cc0818d8423d3278799d874839da961552928889aea34aea06e63220f1a4f6a4c2bd241115cd25d61a078b401d9228dd6ab12986c8a864f1a574103eda1e730005ea4852d3fc0c353bdea272bba9bba6278097b296e489dca86208664b15da4808d0a11585031017250d885ae94118ab6056622d37fa4089f8a0500c48bee72b5203e12a41db928378a9e7906250cebcc784728004fa88c1e45913d9b11e030e9bf76adb05d12e0ac24dbd4fd694fd74a889ee24333b0236813eb239147f0a92bd1ff4954a4d088ca98f9d9016359229829a4ebc135194bece23756a3cdce90bc0a5055387200a5feb0d2454ec9ddd0dc29d32a897f43e5d4fecd7f116d5db3ddf994e01bc74d4049f24e461bf7e2a9b02eb6c1bd8671b940b364898ca36b857b011a0531641972a2e22afc1be47307af6457352828263e829ce94488e152d7bec4112140be0a5ea2779820f25540679480b82db28a951cf3dd5c9695d556420adf3048a40995c7320e283c9794569488a9c41f1811213e60715c91433c45d4a22a12b235e2cff6ab17ba95d6e4b70e19be266d9d08cd4b1e830668a54710a9222d75cfc983041cca5e4c92501eea41480e782b3d595e071943daa839e1e9c031994e42183c3dca97f187646feb878996386f86d89045c8118a31b123c4899949e4820a8131ab04e05acb74ab154aa1124069e1929f62d026757d08fdd6f7b3b59f81a8db90e4c3ebfc1099554fda31e261d4afe01221e20c9e197da0dedd099e411e162a898ccc0b59b30bc2bc973c98829cc04e8b3328b5949f67901e34b90fe1c50570918be2231764ada9daad4b03c3a7f48a29be45cf649ca8c14e607ac31c4a1e00202d3f12f05d4061ecd0d50b460f2bdad083dac08faafa0bda998bd51e1fd5ac5f07eaa68052ec0923ade6031939f70a27ef371eaffc29bc784302e04369a8eee31319787f42aee136484045d104c066b9e5609d5b44c58dadf4315d4b44cb8a4f784189d13a636cc0f9679fc71f6d2189d8db67f6e7aa962d7e09d091a7aa2c21fad8629fe506da6da4ba5fca1c2ccfb413599e3f7ca3201176205f466da1f2ac9041f576bbc949882e9d4c75cf6631599f9a7ea66ea0f2bcfc42e8d5569c8fcff553073ffac7a26ebe10aecc10affabc24cf596583e6d4cfb673532fbb7aa66e607abcf447f57cb2cbfaf10137d15cb497326fab84a66f879f598fac74a32f947d566ca1fab9da97a4d4575dd160b6ba41953fea362e6faa18acce073f532e5879560e21eade2ce5eae2817c2723268c094fd5dc12f569e69eede7673ec79c51cdeea46163ca1042ce21b1f799a98f1cf8a6472571bdeb4fdac70d736bd9165267b82c4fce223497b26fab9ba4ce8f8e636733f2bd2f90d6d70c9244c70f13dfd1875b9e105259b0485a29b89f6a142f64785ff5a0133fe404577e6f1bd4a19c8ae8de8f3f93b10be04032c7d6212acb7eb2c4acb9be6623bbb149435dccde9cb8af8b8a24ca087d630b266e399a99bff6d4ca524621bb0342557cab2cbc1e4e11bc218134b69bc486ad2552ec46acc2e6903040cc7de78c0f2469cd11e19b83e062398153dce720baf910302280cb921efb40a81510dd705928eb45351548f5fba2c540600f04403a27182b4289d905314cd100706ac3026512a867ea457885456209dbb064d52587c5b094b3c4062c08f7228c32d609116b4a7bacc510ac8f48d00c229c222da216202eb06b6b11a93b30f4579e13874c0be640f9224a0307c17cea80ef4d3ce9228027d8266d66981f9d024c6075d3b84820ab6cc7225f38fc237930a61fe736a35221f4e446d581e9dbb5ae8a732523c07c05d32d3af268c4515843fd7c4495138799ea2e34d286a0411dbf6d7c6ae6cffb8eac76d7cf8b687ee3ec7f687b57e68e7736f3d74eb43f63f57f3435b3e7cef39371fb2fdc3ba3d37c4cd07e711897fa181f1154a387e4d9c148593e789f48c9122170e18de5879a95c7026adb7c5bce8a5d489e80e04ccf9d3445d4860f035b599b8882d27b97c7c53ca2810b1d34168c60a0d581e95ce520ae8940600b302e9ac6b28b1622d41db105cc62fb5140a0600b8948cc0359831ba23912da02f74209d53488b6b83144bbc97bacf510ac8f48d006105e1a0eb6922c3b2af5299a5694404e726802a6e004a881efce312dc0e48d78efa3893f8ba9ec26528ed6959f05aea41c80075085a081918662fee8da92382415109d70862689002d942cad77427a6c663a629db9bfc286e8ca27756f83e59e16ef7612142f4caa42f57ca34f6bfe2faba427bb0c23faa30d3ec6145ef5305ee6f45febc3226dcc3cafc7a554c739f15f9fbaa98d057b151ec1f3ddeba6e86bdafa01e6ea6ecbdc49c1b06ce1eaf1c596ff8ca47aebf4d4d1fa8b29879ef84de7e3d560c7a8669f4f4f25ea93a6d997501db2f6d7016cf7876cc0d2c92e5032b5c33dc886d5b8e574f4f03fdd44b34998f43c91381b79ffa4b92b898208d58981057b2e945ea5fdedf546ce685da1bba8106222ad8813dc8972bf18610db085ea2642a98089a28af7d840ae22b9ec0b99a2d69a4c11cdc76e79ca1dddcaa82a35299f3472beec90cd767531dc851e4e1cafcb02a84104d94a1bb3432944ad7a8cb4919e3a52dad9abbe970005519170de8995d82c5c012f40530df0e40baae7b0448d77fc1fad1d137b24dd7ff5cefaf7359bcd29547623fbae2036c3fba18a8c78b29dac03fa311fae140d6adf68ea36ffbbe3f28e944ad9be8bf2efff6e7252508e07e8fe207fdd00d014355f1604899cd57b077d4f3d98a7632e423c54e0270b6180b379c2ea0d674d37d54e89fc1454b89f779513b521594f5ed369d9baecd5880aeddb6d72eb2d8671eccd9f54e635d5d9479c53e1b4e8d381019fe8ee7ca3a6ac50503e8a68b31eba03324ae36b09516512c452f005d56afda606a9ba45140a0ddd529794b0896b2c45e0c232e7f029ccf042a18fba2561040cb88d201e332d72fcf33a7a7b656bb4d8000740ec792c193711f8f18a2f7c8627cab599636ad4d93fd7e646fb2b96d5fd8ec6adf387d4daf78b9570054c11ca34f8f08e851ef92457d63c83ab6c3af7688369d02310a020a180aa530efbe1a9b8cda6aa6a984fb6f5ba6920ea652900edfa633945913c9cb644913e98a575b083787562b8f8a0a37914c249b8f494c336366ee889ddc34e3fa6f9a919dcda69771c799343d09d3835236cbefce9b0937fbd8426f1fb68f6b67f25a69b3ace2f9ac561e1559291f63fe1a141f59dee5c6f2081f955a1e44cb0793773910e306bfbe49171f92ca3dc2d8c3ee91821e603a8f5a02543ae4d1ea576decda79aded508f2c3e3f2195b6a547fedfe5c08fea61a447576bc11e80b1b6074d7cd5c6703304ad15f1572dcfad2b386316a4e9e431e5cf039507106a79c0030f2b303c5c303c8a941953c64b192cff7397a99579f29701d255f1300fc4f0800a18682d6ed8edd5eaa5a3936751e7796135281d174c47e7950345a664eab6ce2b07b4d60565de86d96aedbd2daba38d81d6bab00e688b406b5d3aaf1c9da6dd59bb23067758e972b154f7cc1369f6525ef70ce6c93b9ebcb3a38fffb7634b67b3b4a36687bc364f1a955287982cebc0420694ec9e49098234bc0dce3a6a5d1d367f1d747ce9427b6774f84007ea5dc7f04759a0b52e32612e844c1164a69009320716731cf1e4d166eb83923a2a5953296c07253b5af7d3dd467b6b79bae6f0f161cd01448e313efbb6087efdc185c801851c51ded15aeebb5abde408f22e075efc2f9c1c8c39407d757ad702d5b6d957964ddc8f386f469eac65cb23e308035aeb9ab96f4f1c56fe7fdf4e1c289950111c64dec1e1e57f111c57de8133a4592482e3c99f47fbc69837bebca1e50d9c379ebc5184e5869723954ed1d6a11b3837726616d7f214c784f9c764f918efdad9187974416bc7dc2c38db69438c9036b2882c1aab0d5c1b32bcc34792d86c330ce78686b09b3c5a9d3c451c36e4ff35c80859a3cbff35b07c0d19ecfb3e9608ae61f3bf4ba2861b5d0ebc754b67c9cdadab1a567e355cb63ad5407569d49196c60bd2b072b3350da134404063cbbb99f564aaf194c99cadce7badcccd507678de84a0e1fdd7ce662d2f951f1a36efce2053833a43cb3b95cde3b462c65694a93a7486f8d3267806ea97b6aaaf4b8c98dc39315d9e6d1583450c93bfc34119695b47b4768abc1baac201141cf4a54d109c3910540ddd808bbd81ec06a7ae6b6ca4adce8b92f427cf1aa6526a98de6036ebe4e02c8f0db41c771bb8fedbc0a6abe2b50d80d4fee851c3720dc65c2b86b40661603cc5fea8c0aa18e5d0da29924da8541a7e77dad86c66319d597b4533c8fc6674f9cd304334439e0692065174aa0fa4b5d747611f85d1600a0d50fff7cd3233504157c5cbc16022a4ae4ba63ed66a45d369c954504e182ac2a06460860c222003da73754776d5cafae6020c21c9810d5a8ca4ce0ea5602c0318b26c0ce5cd067d8d47580cd4f89728c159a2042728065dfe1838200653ba18b00083316070c53b3cf1a5a9bad299ec7aec618a56e672ee2bf6adbd60600506ae570a039b97010625bd6bbd3286ca9852a7ac8cd4ffee6b71be600c212fc0a2aa2f78f27747b7b1acd7056584b8800c171cb9402877735fdc4760e3f008b438f575e73aef1c6932db5a938d465d83b159af15c3ce1253212ec06941b675d6c4d997365d2d90e26f410f984aa3d5ead58222bf60dcd0d1c9c177b4b11a8d7685d1a64b47a6da076a24ce0ecac1a9018acd9525534c4671762de309b60fd4080c0bc0a096e67959908505f43af3360b80fc1d56653c672ba06205525660f36ac5517635599e5f6ddb9da14c61cfe8f3ec4ce2dcbc81730541fe4e055ffe2a8964a7825a0acfdb3115d878d95632c4bc23c30264d4fe6e764886cdffda3d461921637ce0ef64b38364a5aa3ac26c1e033746d01830b40fd4a84647e79543ab143787bed679e5e436d289225339c0b2058db205711be5daa623531f4ba63adb283a393db976a8e3faa60573537c7dacdc461fad41d9a39f1c5947d199cd16ca917594cfb6be7ce9d27df982fa3b5bbb35964d6ed8dec42873045722307f2ab4b9ce9a6b470c2c170387bf29c613318afcfb661864427ac3f8f28bf3868584a105f7308afada8a3b174610304800064ee2d9b773a849ab3425ab05a3c85f2dcd1ffde28b5f36f9a2892f5c9e37654d2e86aae159437d1124e68578a35e5c79c18b9a174fee85fcbd0012623ad4c59877a1e51d3ef2f0cc5e4f7621857011a64b496b33c84515f4ba721d3ba457ecca85f89f0b5757c5e302064cbf9e212f585c263837f35e7957c5f3127bc6d655cb548a97229d48a4b22dd9e404606a345a3b019613d4feeeeb98ec043dddd7b541d807dba2ccb7f8d255f1b6c0b2050bb65a6d61c4046c5cc786e7cb0459fe1e13b86e1f759575ca4c60a3459877f3ab4d8b69d1e5d3c23bd6a2c8d7452528c197125cf9a6ac56361e8594c0f54f1c3a9c2d1b9e5990f9b3f0f267c942cc22482797e96a95cbb4c34933c5fd90000b095ceffa88e2579732ffbb7891fd74b1f209e9c2640465422bcbb6f68c40cbb5b31178ff3f6b424660d37939592dd71d1180e92c0229fe7722104f712260226bae45494c553d9b180b2cb0c0c2ca8fc594ae8a07c3820916458470e1e2854b96ca45e4c2e40a317f4d2e7645972bae5c21c1595fabd5eb0a54c7b2a28cadddacf062c5954b2b3c6ab342fe9da5b90a305d155ade5521ceaa78f22a8a6c11f36e4b976e4bed790b934eda64ad2d0f81172121c0e142f0e4bf21286269d582004c4773750704582a083c1030e972590c6d3210fc0351cc990d3ff0530106d6d552b1e5362ab050e15161f33a4519d81465e8609d90be746a5077821356a94e4a84944ca5642af5b16cb2795f3a194b7c64065aa5305ca5e1a5b33bf6541a564b3195f5f7597aa7d857ac1d66d9ac0dab34a4551ade8f059b3a3aaf9c06c5f19523eb281d102fb3b5034528389bd9d48e14623aef6379b7ae5278f9dfc9cf470a255e6d2b8825850bff63f9ceaed50661b896c728c844918247a1e5761456feae1645501440ec111463baafa1f80205960b45ad83425a324f7891c91a3f61e55d3fe1b2b98f769e00f2738003300e4ce180ec9c18f3ce864e7cf9efc40f4ea0de89b36f1dbdd487bb966de79a136f22ccdf4496f1ab56d604ee4d04e1da58da66d8d54a9b6513a8fffdcd7003659e6d940d84f97f70ca0d6ce9368093ad0d04f5d106a49630efbe6b67b3a9258b162bff3d2db44ab196204c88f9df327acb92092d0769387e4c884c40b98e4e0dcf9a68af0b04670f6bd65703e235f04403456036f7d11264ba2ade125ffe53d0269b606c892cff12de7f7a2d0f33842d015b02c82fe69f372bd1e557024b1d95f09478a2444e563b0372e426cecd9a475bef983bdb283205ce4cc52993e9d86456e85a7a5d3ab8b38d62a384234ac707574b73b3b38d929b1528631b3483656c6b3aaf1c16ae96528c1bcf98ac6d33574b290cf7fb26139c9b5a6e98cdb0893f59e76014766917c3f2ac333831ecb678b3f5036dbd59d80d374a94e05c7ceb4afbbada254a7070660d33c1b981e1b46d82b11a9eb5db226c89121c18ac86670d862b9de3d7174f1ddcd44704d8c76a7a5f1f8535bdf976ae63e7dbb85224be2041440b09171248de799ece2be7de0fecda115f7e84125dae7d746f1fe11d51c4ab469031028cce6504f8ff88f6ac052bbcebc4957e0922dcf8f7186304197f6ce6e953c3f3be401822881148fccf8dc5708c197153012d2a40c53f530022e6ffaeb625bb26b362abb2b5b78667d06a25a3b85714598b46f9daa11f3a1e1f29bb96bf3ab16db66829a64543439fad41b2ab41c9a2a121599471e72924bb6b5f1e286202b45944173174b99279e6daa6c2e5c61d9b31228afc47504e7e52083ea32344163950da8833e39066554893c010036ac81c497cc81c563e648e5a00889870c3899850c2899410e6444aa8e2444a48e2444ab89d48093b9c4809474ea4841f2742021d341c910218f29916f0f8bf809b2410c3f1edc41992ea49d3546a81e68e5cdb602f9086f849420001c1f511e02749e027911a40c59530b76e317145894ac14a65c7b2b832e5b3b2d595205d8fded7f546d49f6d799f69c18e0e2c1304c00663314a8331a60790794988076c91ab6f66f5009fe3dbddd4d0d9a81e40e40134ff650d4ab6cce4800190aefca739090232009392a920a608424b1058644ae2be95cc4d0b225fae70d860db5965e11673d9a71be83f9157b909082e0ff80fc401a9dc3836a630cdf4ebdb23ce9bd1f77d3ba0b5ae0694b9ccd5f9b068144b9c9ab83934455b93950ee54a873a4bc10e7764e71292dd40dd8eace255f1b038e6eec43137ee99aaab953bb21bc825d4d5b2cd8dc445726665903b5204b3c412cf6b29189b19b79d55cf13e7d0cd82cdf3b16a79baaa6dd5f27489f366742d9051b62d7bfb00f6f601bece950e81f336ef5789eced158eb97b28dbd647bb127d7504ad75d56834c8da571e89f2ac85eced05ce3a6b2f8c5ba82b11a6d3f5f5d73f10f1ff3f5009c7dad2f3409b0035eaa4771ec9297b4070f6747594ddd1e2be56d6f748df6cb3abe27db3833c2ab2a6aa785f5391317967aa8ad7e04761d5e6292d8fecaa78b75df685e7fdc1cda118d8b199b291567a3699d89d83ec30bdcd6c57f16c96e258a9112339337263ac52f29b912377884d399b634a712da538e9f5df00377d67fca4205ee9a44718f70516261c14195bdc35fc75138c1bc405e176563659dfe6b8ad71e3e2568574225329e944a6a4d8c9b6353b28db164f0e0447a06c5b5fb6adced4f67f76d351185aa54eb0f0dfd0371df11cdf4e85ad589360b9aa657a331dd1bc502da5e15dad5ee83bf1d0cc5d7be4881cc2d8b6ecacc7668933b635f9c39103201a40078901242b3fa6f8b6ad52a19672547bcaced06ab5e46694370b366eda14430821841042102125ef68251e714b7931c1b9b9d90a0367370d06638273d3b23a61b9da8c63a1cd375b6738e06c7c03cec636e06c1cfe2018ff0f08c0b75badc022e0cc3db381612381ad0a9b14b62c4e2438573225e7ed2e1560828cac423afde2272d80a4800ecbfa487efd4dfc739bf6b5d00bf35082ff21dcc483153c7880072dff4e577beb56b6ad0aa58d7840bdf18b06f19fba8e6b60704dd63997e99d6292d0cabad858cb949624c90a8b39d7649e52944dfa8862534d04a6b945aef0ed54023882a9686bd0c8a08df1cb999542515e5216d1658e065c000d22aca0218122982023ab50d96931f7fa58b93bc1e95304b453c7d907daa093d2f80fbb69d6e52a3c0be2ef7030cd6cffc79b7a079db4597ec6d4b40d607327e513589820a3fa2a7079edcc014aa01125077c93dc30a4d57955954e5583b6dbe10d57ab1b861fdc24bb2659cb5c9752622bca556e2c63df0d4355cccb7fb9a2219e3769f36780e850823d02c562315788e72d96fa6fae3da380ff546e9a5e8ee78df4032901608fb34a69b5fbe8484ba19926093fbe5d1ec318139cce4615fb544d6fc658a4b6230babc96ac7322c5b8b73eda386e1320ca70698edce70c232a6200cd366ec5a599e551c91e61cce5efb8db876489bb726c2300e0c77c7666c5cada88db25ac144a80147e7a665329563b397e775645d47b63bc3498df28cb68444fac2d95b64bfd1e8e56364d4b1c9a36394732d1008ce1e70f6ac5622c0fa83d5fe3e5a835171c244bc5a55fbd910d6b389617956695dadf0929b9b9b9b9b1b9b9b1b98086089121b6ac0b9c9cdba7972727c726033a7639327a76333665f31483c654ef70ccf9a2b89149d29c90e4900d075d1851d0aaa38baae36b4f6de308d7972b57a79b998bc3645d4d130e5d5a0b0b7a3324265e5dd4727ceb6d57d2ddb51a12e4d9199292d7f275fa6d4936aebccb9632038a68248a121cc1d8d689042c395ff261a823c1a8afc1d1231bf0d4713922da73755ca36fb86e4ca9d8d64caf1ac9990e4a65843e648fde85703a6a609293d441837439d4a8756ab57ce8c28e7368b72709607769bb77da046d9d6b038abd1253232a1bcdc5c479809358399505360b0dcd88442f21c5947d1c1cd216c545379640ab43686ca62db60b023ae9cac52b973c47424045bf3accef0e5ef6cb2199b218b0f2fa0966986da5f402dd30c412fa0d60c43ba1750cb82d266b933ab1f2bcf5a795665e8220305de55f12c0c631d26234cb4b947b459e79523c38f18ba749ef7b55793126d46e11083f85f856360f2674b33c500248f1386c9038397ee03290f0c59baafbfc6cd21186a30043119b1c2c83482c20b3330bd80c40bb5ce21e329b45a7d331775b9cee186e357a7ace27954c0599378de449bdb078adb078a675f974d87c92bc786e7cb86679657a6dc669344957957c583d93c4e98c905980b59606d724114a9cd8527ef8c5c08d28298b7d0058c8dd6a7852c7f37d442ed6f61664d2d0471b130a688852eff59c0c2c294ff261698fc9d69051e8c18caccdaeb3232ada04557c533ad70c4bbee19ac7b06ebee994e03b17a060bc70aabe30dc7aac216930a569e4d2ab860fdc15488e1d6dcceb3710a4118a5e0ea810750808202cd3b9b535fdffeaa8d59da8eec1a5bf18ee2d7958613d7d2e6f0762e32c654244be785b75fdeb5d23315c9792d00650240c5df795e4d151da8e8800a6fbf6eddf2427b6712d39a6b51d2b602e00a00109132e0144715fe402b8eaa7bad9c8d658ecd7231225b885821c2e41da6f4ebeb22826b604c43b00cf1fe700893bfcbcd13c8bcf38abc2969df13bc0c994e383aa1d6e5ef04d4a94c8fe9d4a5a3a6d31599aa6fad63d1ff20379dc0ce36ca099b4c5d6c755e936909539037a5d7d97a269334090993034d42a4b84988159310d74d422a0d42c61484cb25085ad114c4ca4d41a69882a46ec521dcb909eb3b632613bebc8a0e295bbb51d141ce9a09564c907f173399605d257cf92f9a4a107320c5d354028f0f4b82a01575640acf1e5ab52e548eaca3d099716c7e5da9e5e1ebaf9a4600f34b2ccf54268e2fd3082ed30827a07013009a00009108799844e0e2bfcd4d2250c024c21393083784a08629040b8420beb362d898d5cddbb44aa7aaabf154a610949880e00048122620e2bb1b9ac2b19982e2494b436a74a90988f4a4cd9e9c5913101308606e02410b08a209041be68f34fd0863869b7e68f9bb9a5a038213257377e63a82f6c8f4a366faf1e4ff8ee9c7ef49d30736307d70e5ef26684d1fecf0dfc7f48189264ccb44a3e5eff0d8437fd3443345665cf398686c0225d090704737650acb8f0432fe130947c060247cb44a3b7bdb8713093e2712a4c575bcd2021c40e1a711f4f8df9d4638815cad56abd30857def569842127a2cd52b4b9c7be6c78be6c1e7700d002d60900405cae2cc00126c8c82a3a4964e2554d7aa452a96895e66e8f3d501fe88dcd5c6fb386bbdbedd68d8196dc60c312b9aa41aeaa782ab9c2b9512231a547df9498d22a55dd3eb2e0ac2d4a70f6a55e9097c159d3c1b161c9cd4d921cb9a21923e9711521c1507220ade5eebc99c66e154f9c432d8f0a6de251562b735f59b5b9b6fd0ced1401c9ae6db6ca54e3d1d616b621c5b9b6e1fe26cfd0e4a1d55ce7804f1f8cf961c8b38de8747503e15eb76ef1e026ae74a8738ea7ab96ceacccd8f674980ec953298e223f95c8e8249777353cbfc95352e293c74a8bb95c8afd0f65ae1d9e4a466e67957587aaa5b9c1f66931f7a2d14bd479b931ac26eb7ce40d43d869860b15a7190cfc05dc41af1f6973eecfb658b4c9739ad911c069868699174e33289c668ad0664ccaafab50914a508024c74fcac14f8a038ed3b9fccf980a61dae4914d6833d69f6dc9d1076dc6a4cd2a4c9bb18c29d8c71107e9cc35b9eac3f53e68fef311033eba9c0ff0367cacb007197b04f1ef91b307cdf5a85d8f13fee3f4e08bbf0741fc373d6062934799d5ca260f2d7f1e3e7904f96f838716fff1c0d9e091fa6a7553864c992d376570ab954d191bce83325cce83fc9f07363b20b30330289b1d60f90e72feeb408c0eb25c072fac832177dc815136770c71478e1d54d8917f3b6c5e871a75f8d401e4a7830b1de0e958818c1a64b490f94e26867f8e39e6f87218ca668e718ed73f07905f0e309723081c399e5c8ee7e08bff09c881d0cbfc717089037c1cf26f430436f860030e366a00c7113741ab151c2b4827b206f5460dfe8696ff6fb8febf71821b61b8a0dcc0b9a1c48d22ab95cd182dffc7dc31afff37e39b316a8cbcd9da46196f03b7e1fdbf69830838b14cb191e547ad56366c786cf8fc6783e6bf1103e6026b40600d1fd6c06b7c6b087dd2640a058253b6460b6a94417151e3891a7f1a5cfe342290462dd7b65cdb506904f97f830608d0d0120134ae87460b8d1d3462f8e50a75861affcf50e2677c674894183450622c204608536d106651626ec4c42086e629d46a457ae327b9f193c6b481032e7060822a70f0040e84f845904e648d5cd5066f166129b942ad5636b279335ead669e9f38362ec5710330c7b7fb58330bab96d671b5fa58b54ca55ca2d6677b7eecac1205b9ae386f46b9d2214c670e3bb3c2ce2c1ffbfa1a43f958d5aa7059458302cca0063320e3f5f58831cbe7a33c451fe5717d9467063d0326b28fc6c224f1519edbacbd707308a4c9293b0652dbcc95d5e5a6dd7cfb56eb4fda51862b1dca33ca53e950479ba9ae95b6708a9846632c71c48d274ff7d118c6f6caa60d436b6714a8f36c25026201c9d977266b0be1e65097eb31b7acf4084d269b299c0367188e46b2ab4175f8a3311b2f66ab95b9580a7bb8fe5a9439b0f19d2296cdbe163c9a46b29358ba7a321e7d70dbe6d0f702aa505c1fe5f9c9b6956d2b8b506e56c8dad74779689447b502a11530f90a30ad2ad062ea526feaf2ddd4e500377529fa0f4404238ab8c9082b371981bbc9881e6e32c2769311df4d461ce026235c371921f4ffc70fe44716432208a14c93220f40c3043ccc18e305680c0c74908132f54008270200706284c889f9ff18b238b9f2ff24115cf1938efe032161f11fdf4e86699844866938c6165aa55986f602759eb23ade1927ad21a11c08108403d08f4f0fcf4e1f7df431e4849349481f414c28a18f99590a703f0ac078876fd72818e197ab2f6cbc06d5c6172daff64bfd32a5937952db9727353c7e8141ae8a868632ae47a2ca022a8ad2b1c93343c5b0428c25fe37ebab7d64afab7d3e17d187c3798dba8e552ac3b1cb75cedb47b65a6b64edebeb6c5bb44aad8f6dd9ea2cb2d55954a1003163e500a62fb6f8c190e2af968ab36b7205068a0223a892d8ace5691fa8116dba70bff0ed6ec0d5aabcd8e2c510bf6cd1cab0cca091ac8f60b6d9b7d50a576b9b2d457eac5c6e2353175f1747ba98f21b865ddcd005935faeaebdb7ab5081dd3084897866ad0cc6e2020b2eb27031045051944a27e832faea4eced5552bc79d9903c13b5a03c80e8f79de298a532241d23cb2c3366b6b72da8c69961d5187d6e8b3160710dcf9fae8336d91c671ae6d503a9cca8d673bb2f3745e391fcbf3e4cc4eb9e3f52893cd58639bf28ae64dcee894d75ed1e6fe28f87d34046bb4d15e098273d6e36d4776366bca4204594c918510590051235152ae8a6415b9a2924455461636ff5fc8811483ef2771215df167109c3d20387b48b0632281fc5ba8c3e9f3630465c7258d76a4cfcf6be7a7e8257f78a490104b8a34fa19da69491c5a44429288e8253b0c82537654464111d7606c7e5030ebc32c2090e86b28b96d32fa9a79fa147d2cd308625446f0caacaf3bcf93b5fb1a678ab3318b8364d7329a6593870e2959229d481e9ac38d44226d4a96dc64df6438623c439ab194b2f1eb8b6dd861c98dcc538ae1c8834dc91269b311235d932a709cd12ab5f526ceb00367c6597a32d8d8dc8436dd8d273b6fd6d7935738715ce95017cb3d3b8c5d5ffde99b9ba1a5347736d9048dc2b1d5616cc559e3514919b1c926888dbc8efaba8efaba300ec7568d675fb78f6c8f87baedc2dd3e5023dc1ceaf091a6e2d877369951d93769b1acc966ee26596c9bec9b4a0d75b936f1682d7331b0afa442072a5e125331c29b4c01e6ff1454bcd2e814b8ff53184de1e3013d3225d1e0012f3e2c9903a71168adab5ada03ceaeb695ad2dbacd225c0ef16af559597f764831e66f29b69042f502c1d983afed866487f465935990a7ab99d9934995bcf13c9927716ca4d1193da2378334366316db6416fce1d9e1a1cddb473eddf8d964f4c62c96f6cb81194f30cf6c41dc219db8feea6c9bb519b78c629acdb2699e3715a6551b9b9b1dd9d5349e9e276d1e6d0e45a3339aea9851ce623ac5d082f26683c4316524bb1a7c6356e2e84cb4336bab14afe57937aa96275339e5c1aaf564a598d600154591531ea9f6abf44ed18a60533bbb2dca19ad994d94ccbd64979b364beb5c3d234f358548cacbb36929f2265354568964e705bd7068fd08c15ead9f211c7e8c602d22d6ab074ad1cba845d4032bfaf16941f1425aaba4c86e36b3aafee6cd72b694a2964b76f866ab4d55a995a9264ee5eec4b78fbe29ebaca580645783c196d74641545f396f1ff5cdd6640acb684d9c9766b398bbb24a0db033345a2aa3e00c65b5477006c6c24993d7ce5e442df932823294cbf48eb2369230c80e09926b23c3754fcb445ac37d6080498944a2c0ff192b763a4623d0f8f611ad639e362cd901475e40a893b6d25824304837a0d293b699bdbec9263459694d66c51f12195d2ef76c623cafec66c392b1abb56149f7750c8f3c7c73477678d656b44aeb9d524a422421742f6310e3dbad561debd88c59c05e5569928e4d1e248a4e03e50832ff6b52b9b6a14c4768f15f665b736ddb62025f7e5215219842488a2302ae99a7cf6af5f2569e9773aadb2e9e2ec2ab954745d61a94c4542696b7aeb08cc71026479b1b6dced379e5a4fa8e5936de7ab39fc434867ba98ac409b6122512d3db39374f6764c488c4734a1c52d9795e6e3c7b26bfee589e478ecc2cebd96d3caaecaab3ad12676faf6a4749abd4f35eb2c332ec5a06c39e797eb24cc71e3c5ca9e7f5f56a640ae5c999eda3d4eddaadbb591053710ee1ce13cb1c288614e329e22379caa8271b8ff98814d9d9489b5344b2cb79369992fe488f4ae3aee27954640dca2e17935deadad4e7c970f6cd581c65d5f6ed504633b69536e967ad3853cda40fce40ac797f68d5de9b8ca8261b87ac7d7d5d6934375d3d5f8f40b6d939f0ce9f4b43040f3f01a510840d3f659c82f84f7702c20112d3d467bbf666935930890a88151a20a60155346003a7060891ca382879d6fa3a9cad0e67056d2ccc1975ab93f88808d4aa23386d9d291f967c01b53860c509f9759eb14ed0e305c802c87c015680382d20c8cc185a42a0009b5f0502cccbabfcf483eb3f1f0948e30d946ba0ceb9d8ddf9fafbba6e76cf5461ae4776337b5bccb6957382e48fc97c38fa92768518b4d6859be1572d4fa56198c7f14d889b61187e3defcf2957f31a60ac13ce02d98a18a4b942790f6e74fcc3b9b669c135dc7afe9bd3ed74846fc7c2210b1ce57c860583afd21c88388d3eaa31f3718c4393f3d720387b3adb166681a014109c154ad366c8eaebaa50be1b5c38980b167a116bccec5c8f4453e62b898145a88718f0ed41b435046d3c509ada4f43fb69663f4dd3503906b8fc4fc20afd453d1506c71d187b499148e44bd2206553b26cc6d6d664df8cf598eabadcbce5c4d1e65216f3c8ee2eb91925a661387be6751e95b9c3194876b2cbddc993c35910a4d9284a6e82ed03c666bed628db166e0ed9db0798a9c9312aa2766fddc24098d651de16716ac8b5ada606859a591aa40df5769ee0ccc9f0cd0a59dc1ca2557b6dabb26e7f976846944722a35b0359fb6a61dbfada04ab191b714e043f1b8619e2797c3138408b1901c85e9f241e23373fc5640a312da68b89233fc512e01345ec49f7d1d813a798bd499c6696f7d169ea8067849439c220387bae840781f3849d59b98d768c8a721bf518f584b35f5fb5b7c9e3c3ca34a4425d976b5bf7e51ccf6d9711237536b6f99b9d8c762e49c3b1e2b031ad3501bbd6b64967aece06a7d10d3bb3721b1519e1e6d0d7369915aa50be3eb2d7b69a56ed9532c3801bba1031c00a277421bd30a5a804526a202505ff6bfb60fb029da430406657632895f575b6ad1dc01125cc4f513ef0ff1425caff9343f5517b8d478a9b8236dbcaca1f8824d796f545e2c3da911d96332b8de4c6466a688ce26a451cda6a655d292ae3aeab49c9d588bb6848092757eaa4202b1d7e9a0f37952b303bb49a7cde8c03c1d93342b10288f77c932797c5f0e7350c05b1dd19f69d61828a93840805bd70ca018c08760d761b268bd9aec53c489b73b82a950a9cc16a936200cfc58900404a2c9c581cf8e1ef1cee4e0eae2024da96a4cf021ce21069aee119245291be6a8b44f61b8d667a7010b2df8849358cf9f3ac2601c1ff02fc0414c4e967023f43c82b9260828cac020395cff4e987e8e443830f7c887c06a0cab31e564fd7b3c2ff138f12279e089c47e87265effdf969a64703a3c14283811d0ddc548b7980f5771b3706678f1704c71dee03c51dbb3355fc77fdf42404bfcd5abef58eb15c69e8e40d9afbfa7b9c9a6cf95fe53f101a1dfeff343e54ea8e0fa7d5082c985cd11cc000ffe9069aff0d830d8102f62150147d08144f3e040ad5874091c2874011c2873c91c7873c31c7873c91c6873cf1820f79028c0f79628a0f7942cb873c51810f79c2011ff28402fe8370326184144068ddba7e90811faa0ea994131d27b206f751549eb5d0aae812e5590b492965d5010112f75158d3be86fdb821841f403ec003054e726890b5c1920d686a40a344ac8892116c6d2d4adc489574e2a4d635edeb224e36a4c41af241c0c009478de3dbe53459a16e6042230092a559a2448dfff7a71b2fa265420365e0da95b44a69b4197bec53b4e24cd07ff0279b2dbf6188a38ad9645d270b435a7b2f6f86f1d8411c32fb852e37665428a1bb434673cf334e1d11c7b9b6ddc81c945fc9cc13627e1790f929eeb7418b3f851d7e1292dc06128ea606d2016870fed708912795cf6f3a9bee4685a3373f8dcd4f93e4a7e97e1ad54f93fa6968f84f4383e475fc76a48630e11f98f03ffc89063d40b065204c71a22101343527e1fc77c04f48a47812718634289a2334339cb44314d29218664c98912f492919b5414ac109257442a13e53e674240a954a95e4d6f4e8f611d18c28ecccc24dedeb63cdfb8367440ddaa20af6e08be7fdc133a28f655ff86b0b1465de9fca9a11cd8866445f0fdde019d1edcfe8f5099c64f061c0b1fc595c8c43b1c32906f03f1e9ff931c329062028793bdb23199be17f6c660b2e66ba98e9828b8e36c6e4a4b54cafa581537a3f423c3b413d3b3f452d287bccf4710309491f1e0ea4e99d640b3a0924d9fecb7e32228f6fd7e4bf1590063bbd9080d79908cc306066088cad586122c986a4e4249b936c42567beca1b19c9dbc758a463f4909e5e40216ff379e5c005da8fd0d7e2c11376dbafe5329210414b880a3820fc81b0d64c08686150029a34200c2c8020051061c133320f1ff2c2c2183f8d38f283ffd70f2d38f1a7efa21c34f3f54f8e9c70828fc229851e52633826e32c3869bcc30729319a69b68a0c77fd309ed03c535f7c16aeefb495cd0e0b033adb9af8482ff34a52f176d3eb12083e329645f27168448604e2c00f1e2a71572eab460ac24c65f0ae384dc91ec2f81f197be18a185eff0930a2810022d1b64f137f8d559933fa59000d7298527a7146c4a5e7839a52076f197b8f84b5efed20948574a5b944c70d2cf0985389e2fad6af1794e087142c106df0eaca941655ce72ee33a5583427538f16ad595d2eacf67ae0831e39d8a303915a1f9acafedda1b482bcd5afca51264f19748d0e52f8d40047f090b2e7fe90a2bfe52155bfe520840f0973e40c55f9ac2037fa90352fca528a0f84b4f70e02f39d1c45fda8096bfc48406fed2124afca50c60e02f5d20cb5f4ac2027f098923fe921115f84b14c0f2978a98c05f226288bf248404fe5204aefc25083ce02f392088bf044403fe1203acfca50528e02ffd9080bf84001ffe520ef7976e477f69cc7f09dfbfd483f8976cfd4b21f8976c3cfc255afb4bb4d95feaef2fc9627f697a7f09b6c35faaa2c35fa27280bf6480297f494a94bf04e5f5978c8afe52015c7f89a8f5978684fe520e0428b182fe120e407fe9c7e72ff5f0fca59d277f69003a7fc949ce5f6ab2fa4b3730f94b0258f29794d8f0976ac0f94b37367f2949f79754a9bf440392bf5483fa4b4766f84b32c4f0976030f2975e907fc985120b2bfc251552f84b2814f94b0120f297869cf0974ea6bf2424c85f32a184bf44c2087f090022944200f29740f8f1973ea0f94b25d25f9a2991fae0e327eda1c74fea411e3f098f323f89073bf8493ab8e327d951c74fa2834c09349460c229ab34a8d4f316fb2a788866040080008000d310603030281a0b86c311915c382cce011480015ca662a2604a960a93204621040d410608180000000100811031dc8cb207b9e67caf7dfd131f251f071a37d4b5b4b159ab6088e53238ada2392b2069fc0810a0e3f1a6d7cc9d3667bcc54034fcca1d7bd321116a8191ab4f7b9a6d08976056b23f4d0acc4f0f00663eb14b52f61215a76a7861adbbdfefe1867a9281ed9c34b70b23c94ea93d0cbeb781ae3f284b3419137cc7364fc52299d0fe8a6230a96ea57236a270d23268aca0fdb4f7b200599feddf15085a16a306738a4974499465a5523b429da9dbf39b6a6e36d21c79e2edd6e5666e96d6780519d561dd7de0fc25b5f819a5ccf04c4cb6cadd47ea020a0237323c0a7664cd109aeb5c99d1db48dc37782dedef81b93703c9c73d52461c9f6972f4f5030af27c5a6c13accfc136bb70de15adb315810109de1527dd5d008e7735f2759a82f6086a6c2e53184852b61c74a98ff146258fe4a645b84c96f61f56a36da2aea073e83972892d5988d39161836abc0333ef9a3047d7cd69e3e0ef6c692a2d746ac9df7f34b5e8aa31eb9cdb9f6c08ca930866125630e3fed917edee7212c0b0d20edd15362887fb74821cbc840ae3d2a1bd2410230a08362d7377ccab5b6558e2a2cda33306411e79ba3e3a09f43e4dd2435a4428ea3917305bd00d04520a9932af11d12768136295a657f0fb313008e73e2d1c8e89fbc461c4effe15486bb62394c18539385547401add1c6644a6fd0cb0d2272491916ff11eb61f9bf8ee1c8d77559c6da812f328f0a1a8daa47b8973e5dc36e37e0ded029ded51594828ea14593b866f54e8bc600bd9821004dac7d6198143cd2e67d4f5726fb083c49610a164fabe92c0361d90dad2bdcc75c7e1cecb8794cdb7e75ddda03d5b0a6d2a06db389f4d6993677c3609cc766007cc615fe3cb72e7993c87fdd8ccf08003a11c0f558d51dfc32779b082e562766da87fc341647b450ba1cbce3ec201560019e033b5c56591bd8d464fc7492f5d7b0f385d5bc37df20d0394b9321a771d01f8e2ba5aa798205e3a0c8d004d9580048b497e24e21ef00909994cbb4f5eaf88f29af30f4f03bf0f6cf18859f8eea2dd427fe8621d5b9100173be5d4d08f5fa32613c2111a73e5a2a5a3c3b4852f0faecbf332991ec0d19206ca6940968802013f97b1209d5df894e3753e7b83c83cc9bdc39bf151589244137074384ad71c8e8ea85ed96f45492ff5c2941851ff47ee31137aa54198c8787a0aabd89cd941cb0efd161cbc9ccd1c12fb2ec8f800acae3d5d087b87153a63c7064300fdffaa967dfc7f247de94b4a69a3b76e7df52c3df40e6e18ea4263cc9707341c84570fe508bd19a15ce70f546d3330c120845f007765cc5ae6cbdc00046ad6a4c1c4a5b56771322333ff7bc8715f3b7f4221f3f4c76d1fb8e8615bdc032d7cf63572961a3159ef3e5773990ad374af8276902d4dcc9f1f6657b2189ac522c925176c86f1eaf903f2c16aa74edf5310224936d89d274de1c9c62e22ee47af804722aae3b4777668348c9517a03219dada489466e05a865fea0b0f35fbb0ec0aee1ca1240454cb9bb5c83c5051fa76e896be03cf02ae728decfdac3adac6b3242ba041bf9cd5aa53c471025df9046c923fd2fc8de1ccc18d8ac5fe3c93be328ebe4efe965620aec12a1ee6d122fe799b7e911e3a6703c76dfbe93244e9d30002514e6caf9d819abf6b6db3dd230daf98a5475450490aad6c68e15b3b57ff3e13412fe10154f0fa7cbdc3bf30bccfcf4d839dc2c6e4f8e7b79d1b5212a11ba5aa190bac3ab5ef264602f429848062be4fb78787c6aa1e308f478d83976f4757451ad79936f70dc0e4e1ad0bc12deb81e48c88bf85b93cf75f3df563dec7f76a634a2e9756ea4aba5176aa5d89057581c7d2077ed9d4275369c132ad593f6a633d1d55af553ad4f2fbb3098f6cdd37356afd2e93053eb6e8592d72eb8c1d48c6fc438681829eb2533bf7c3f3649c406f0feed64a5ed70a7808b7fe1be883b76f774de72e9c79b6ade08a4763539b1275e88146124909dec6270dc736d2c8740a5b1891f9b893290b1e70964b3901cfb87fc1a69eee90af87563318258460fc40bf9e9a514d590c57e1e4d49407ccee3ca3ff72a93fa611feb4633c7931e39b3abb27be1e28de8cf72b3a77e3e59f5cca0bf22bb1b19eb6ede9f9f7d579783d8464cd278a142f3ed175e3efeaec42e8fe75a75745d4dc3b8d120c5e85a60a181dd43e6d874f228f60d113d570766e3d75a64c798b4c0a49730c178befaa7247688fe8c691d5370c9a5a4ea36442e80069ad85e3f5049a84ffe7814689509bb0ffa79f12a8ab2a25d59f78fc03cd234ff7a31d070754a7ecff2a9f1ad333219ab3092ed7d1f5671cdc728b53a29a7f8bd0e816bf992e0e8ed4078d5a2cbeee9fc268d7ab295c31de22abdc68d18f75cb70101c4e8cccfa269cd01f3c066968725d1ca1aa594c1b78b2a0e2b337660aed183b58986abea05fba9137f70c5755a35f43f233f118b8d0c4a4300900c7b342194fec42cd1c35fc61a68b14c4cc4cef18653549443b302e05a17fdd5be7c43aba5cdc8070f1d3fde70f0694ae760040f0cb7129f557bf5683e90bf2a3313f2d888919e0c13d3431084f9fe863b0160c829e74b712eee61ee048cf54309c45670738b0e07daee47358e137f0725b8ff714c632e03d4da7981214737556334cc80c22de5025859368e36c4444cf8090200377846e8bbcc14a8f68a90c766438dcec3265d62777e9b87fd0d941bd64b27bd9baa73a9b329897ea95ef8d5dbf650edf6fbf01c27ddfec49839536ca96705b85c55e64325ef4d637255c050badafd2b835f47899d577080a119ae5fe86f8f4b767d7caedede41c6288f733935efc150104fdb9107475575e7120e3e99d40038fb0986789cd0e39703826660e6d806fa7e66b2f03b76f9dabce89f02bac01657f4de732de46434a63d10c60b763d391c32a27f6df9ffb4b6220166ebde98656054d8db75f90298a5728f589fa8abdbfef075b3bb2659de63b785260d578279f9d21f8ce31f1bbcd256dade08bc51ff2d4e61300f04630d34a4431f36d8e003f1f77d331d836503d7c70aefb2bb445311246da102692d8405c32db5ef165d3051fea421387383a6327f87b1b059bde93ed3ba19ab90afe6d7f645817570428750383db0b7bc134cf19c7851de7a0da80224cd9e7e9d180c3d16e6c2675b2a032dc274be15234130eb134048f21744cd39ed4cac68d7542656fa3453f7edcbcf58dcc63eca4a25593f1f4b89f783f54f1a17d71f58f994b79c8768e1703c7264a2e1f351643ef2e65206fbea342590a9410dd497894396734ed6062e706f78328328f57a8710e68dfc590112a2c1454234c3490a032a28b4e156642265327af9d8fba26e9a6562705e75e88041260844837cd6630df9bef4fb8d149c1caf436f21b181dc0aaaf7a44004fc385129595e7642d74dc28e06ae675430bc0015f00f7142c06de1c34775860c620fc709a8b3beb258fac7a39c4c6260d095ca0c1ceae808b3cd0a1ecc185824287180ea798d8fdd7490930e6383282e084829d4a563c46f993e273aab42ab19ce86ed1b2803fb690c39c1e0ff15f5a738665748b1b720ef453fc6f6027296edf4e3c25c38cfb73c912430bd24f9e1db883fb5d1718e1776527969322a6940b5302553be7ad0d38b65439c62a60c1fce0d624a9bde9201abbe2383921a14badd2a03e6cda9a7b3613ffe1f98c0af80e01c3c2d33700316ec692998aa0257ba0a28e3db2ebee48a9c6b2e8d34bf4fcdf8517e6a4376b5d7991fda88b4e211563b4637cac372627b332a0bca95a509a02b53ff2da5e23c3f9d3819bd8fc901c1f01089cbf353c7bc81478d1ed23820c50873cfd182091c3a90855fdce96f95a037b372cfcee7cb3f3d1b354e8672e1edcb3732e4d2b6781f0fc3b017dbac9058d8f7ae79180b4fa65f7a89d3db38b18c02d79f3039479ee216175ab670440a7a01aa61542a32db3130e1bf5b47212a54070875d79897e1c4c16fbebee3d9c9efaf095a8f74356ff5fca156de3b9cc021c03fe83779cbc2a62035f7cfa821d13ae85783f2b4ce01d258bf391a270b7fdbcebb1bb34ba129ceeafc8f8dbcd887bc8a7f60b213882fdcae42eb2a3721df0c118e0bf7b19d6b933b54afa690dca1a0b397d92921691dc4f8b7ce47835db46843b7c743e6ffcdc50b6656ed36446333343e18bb9a14e3bcfb14ff775a4d29c6f5f3d0b8c1b41e02e3daf83c5926eba57ebbdb3d1c34b1202638ea75c913fde95c21f5eaa35ba82a4a2e19d86fddd48a81a818ca297a583f916569c81fac6c94c9ac6b8defd222dc17ab32f65b00008535534436d6f70e1d8812f646d8e29325f84fb272cbc320372311ae2ee3b1e3d9efd6ff5de51a72ec19f3985fc7c572911f7b4377bc32d81c0da10a1fa9d610a64840da53ce1552138c3b47f02960e699601098bae6efd8806bb10d249a8b9c9aaf1b163622629fb46de6395ca71d669cab3061e5511d94a17592571dd398cc9b4a8a0d16648b9029380af2d76997e01ec476cc526444d462bc2807c4154793450c1a5341e7d4d2a00259549beb4fb8d1059e1e30097d684c72176a9d2b0d30057d87e382392396abae4a434136a2a7736ac29be4b23d3ebc063f5703a7f058f4566e3e43329024dfea141f6f940b7f9929fafce472a89adb84390df134c984a707f5291f382c3f6729845d1af624330b5f27fba2ddffb46f04968f15e1043c5ac6577af6f405f36da4dd2e980632ea35f4a6316cc39fe44a9c2432fa0fa3c014f2d270de664a6b5b8b539dafce632c092bd97a5aa581a13b3c216e704ac057bdf6d0463de8cd2262461019bc8dfaf31fd079f657905e3404ed6746fbda32d37cc5369f7e80ff109a97a6eed9d424e9ba6f94b7f30997ca52d47aeddfe9f338800d69c342b1b4c102e99db4355017bb1bd05cd2b030e79469f5aab1cee53c6d10fe2ca336a51d7551a2d63dff7e4af84b68acaecd6aad85a26ebc9ea37a98574b7347c705e86325f68705a211c452655f3ad1601afb7bf27a934aa69c1e2cac70987a746f60924c4673994d9aa6126e6a9fa63bee0740e5b97bf9003890a92ce13181e8f72a999be6aa68e12f5e9640c590015a404e246356f946624f75f09501e4a8cab7fd43f7d79d4f8d667eaa3743918bb3a3d01e77867505e65d78945398b44c4d3c78b1e0837ab1f0d5656cdebdd8e13ecb02d740ac3cc6ca87ca8c200f44530e0469b8cb9fe7c20a1525b8c6a03ead5d581e1f2841ead2b1568962df0007048d605d1ea08d1ec16bfe579a99d5745b57d335e8e1b03f944be577a0443f882f800ac4df3f0d77c88b473a012fe908d0409db527d4b2322932181f11e7742d2f5cac4fed3fbd304de9480b92ed8ae96230d85b009460df7003c1bec09ac0081f500aba88a483ce6055d8143a0e02d8573a57af923617916e4af3e711e2c46f1fd177ef0592d3e0d7a6888d0337b4d457a626b45ecbf058fa07c9ac09a36141835920709b6a99879ac726842cc213c12784a7477718fe92fbbe2811b47b9c926b19e2076210fa007d66ed13a60e1fff2d4ebbe66a2f32e6b69b4fb09907e5ce0cce4ff24a48235fbb3f67011e7af78762e0df673f99308b2aab27dfafa7ce1742b67bbd46490e130992e06f52948d82e2c28c413bf347e7dbead023acafe6e2c8c059334c88afbf8b853851a3c4ecc8da4ca75249c25d676cbadca178403c37d02b66d94c69a53c23e9b559193414895ab280c344f4e25515993e97c0f3f85bd5fbfc323e5982234b437c91dd358c458c4f3a065043cfa078e0a59b0da688f58e033ecbd3c4674d7c4d5eacf1022d8ee428950c21bc1aa01831f0ea77e12649214ba82e494f6bbccf471a4aae53e03cb991825b1eebe41ec30d28f3b168887f73fb4728d7464c5486eefb14a2910df45893d4887226a1742d41f2208fa1f42d81d22d7f907ee80a974303b49ac71b18e7a4fe3daa5458ce69e8961fe147238160bbae918d28af219fce99a287ffb4013d0baeec4c6295876e8988d1f808e3a7d8a288144200a53e4a85bf38fc6dd0dba2b52c13d53e51e392dd294c9d59856c8fd8d952f4ff763d0d71b083b6f0e4138148ea29b69a7ccd3e7e4be0b5d117f96637a33ddc444b2025cc4e909f7e136884f19f00b681bcb7e542f8b2050fed5eea2d4d3732f6cfe363c5a40c548f72263d03a0493a004caa57f708646f032509c6480407fdbc0a603011817902f7a8aee3a4b1c375ecef2743bbf2e8449068209cc8f1ab5f7ecb2bddd81ba039e4e3c70069a2c1206aa2f02740fa350c917cd83c4c388c32fb1126dfbed7f1c75c72068eec139972af1acaedf3efd2e644b6b23cb6a0aaaa7e7b2b20c2a6f62a5a65951a098f13ad42cecd88e834b6700e24e6c703b4e12cca0a8abe58280fb02868dc2d7e9b805cab1eb9a289177b6d71dbb6543118c7d629005253e0e94b11cc02b269559b18cb2ff7d9ef8182347d4e2283b5281e2534228a15b29b0ab2d24e38701470a8540bdc34f4c35a2c414b5c93b4105129aa6da4e7f7c24a683219dd08da17430d2e604a8bb5ee0e5d965db330d3bbb657dea34c10fdefe86c7387fd97e42eb0450c07e54bb616e1f6f96a4db17a60b5d4bc5665e41f3868e869948f4368cd1d9ea1c8d17ef336644d4219a6e363f3e276ff485a6682c1c8dbe96325bbb943107f6f01fd00bb5e57d95fb7cba6627ff0498cda1eccf301948e3dc9db786028109c916bcac675788e529248abbb98d6b244fa048a380287a498563102ef1a858866047f281186328120650f730ddfd89cbcd63d7e4f6eda72b05cce0abead6b7af57a327d49a156bd3ff31ab2ccd346b43d6102df9d2156dc1601be94caf0ad6f34f850a33f0bfb60759c8ba25cb939bbdfeb8537d0456fd3eaced1e0d4df2b065f2dfe23af89fd2de4b1abdab4368cf23e4541a47f5b2d1a5239949e8d201fed940f84e15bf16d05bead1f6586aa3fd86a4fe0cf6de60236fc7660b76aee58b536e3959bb305f2ec0407ae01ec7cf0ed9f77ea49186ea6d3fff03d9a6fe14a3455dc888b640ea65e96fdb62180ff110c572835875c99fd5e0a10a6a384736850986fa1dddf5537ede38d6fc739a9a4979b301b645993d4c0ecf84e3b105ca5bd6943d9cecdc3af42550e9de0849f16ba4f73d8e5d9cf12bf99d04b95ec89f91724cce7efd83856e3d8c7a607f50f7f984dd3f5a3b19a463566dcfd1629037062333039cdfcb4a7e4a662e75747925c715196face213f47d33c2a6938132c97849c313bb5e8138ddc4f673606f95b50f40e08662d76ac8ccefaef56259b501f74a33382777f6cddb24ee96437ffe0632e000e85e03dd6e9b730427fb78223c6a6211c1c3a47994272aaf9c1d7509b5115d32d06fd2f30d6409d7ab07cc525531b666cb76e06e6e7173321b7c3a65f3de6a1f4cb22747f12630e2ba4675de69335261c7e4f799f409ee9b920eaf2e369a65a67494567bc26bbc66770ad4d26f7636774f0ae2c540620ab1612767e62265d261ed594d69c0b033aef00a2a9cfe1bdf2115dbf80fca1a478ddb279f1bebd152ff6047d403034e825720ccc3254bce6b4436ddcd74b31bf1c73e6deea0da7a7aeb07e97792196018cebe8ea004971999aa1d766788d24d9e63ce62fb0fff6cbe52c7bcf0a92c557bf4e2f5a4475c3cbceebab3c650e91090c456824cfec2ee0edef935f9d823989ef462c52510514ce19839f2f58e7607e73e717eeba758f3cccf0c6400c3bede65fe9fd213a17836828677ec53199ededd8445107dc1b919608da30f88ed7fd0d98ab08f8718be30803fef8aeddd8c1962049d2c8814508c2aadb48d72c4e6c4bca3de784e9239c95919d1833e8a1b785cf9268fb7a9631041b8fb258ccf5a7a6dae6379810ae266283fb74184cfeb6e6ec44288fa2d00327aa45883d81e2b23cbd0815b2ab53f85dd88dd7b937d14e80fc7bb4ec2378d0783830adffbbf7972573c75f10505fe49a6339978b9ff6c67e1dae7e72b118a6b8a8abd6a6f06f288037c835fc4301561548fd6f67ce41eb1d5e6d02265c9c8334920300369f2b847d75ea261191365bd711783c0b637d7ec31a9385b9e208ab90b0ed963bbda70f61a1e5e3db5b3fdc575dde27abf376f5f4eaaa7f70d50f2d4b30eaeb91146d27fd23c18ab934f2350aeb7c331131979fdf7918178037e6065b05de8be0b754a547819f1dc53ffd347475080dd09fb7cda754a87b1c0cc4663dca4a736a2c8d252e9bed8e855add17abbaf128801a4bdaf0e880ca4e73eaab39f8ec0e5b7dcfdb64a82c81c36c81e5b36a7750e885793a3b8dc0d5d528e358438827dd65d51133e744d617daca30228057ff7e970e2018c5b2a64825f6b68796e9ca0e750774c351a1c6d823ae7699bc7be19d977c916e6e4f2af81511fd3453a63d20c2ad3c51fd6313e3ad8fb03aa977345fd4cba79d302f935bb812a83a3fc83d3028760aa75c35fcff765a3b34b9fd779e62c72e338a528bedee867822a16d6f86d4491e72f1e362d9b4088fd3b90bc5643330df50fc51aa2e939d8d46ccc92fb1da4ea83dc0a55fc9c90db95e2bde8379641eeb732fd2778e38906ceebcadb8c73751d14b8cbe8021f212622fb0a7ef0c969cf5522cdce7825eb046931e4cc524c9eda21a7f2aa55873064dc5906efcc11ad2393310125d04d1289d990511a202e23355f88c34e3c06e69103c9502ce08a9a6e0779c448d9357ba1d8cf0035743cdeba89167585c678bbb0a5fb6d2c2d5575f60bf03a2291d29374427dcf44257f870e3b816f61484156037005669b05bdf0a9c99facb4b850bafc79ce30aedfeeefb3db1ed11efeef11f2e6bc905ba8694812b57e29eb80b714b25f945b913fe8b791e0e7ea45fecbefe9a42dc75a86592f955bcff87b383953c03695d9bda845123e679721c44d5425afc8bfa09e43fd9cd4b3b94c8161e283c4d44d15d96eee410df3a3ae2d86240d8e4c6ff4b06ff38932ab729e5b428a7e372b18216dd6f8793cb5be5adf2bdff3ddaf23439d5445ee03941e20e409fc080c32185366086f0512ee232efd1922e463218b45c9e07621dcded874e62ae3b288e2d897230f9318a8f8c1119fc913e0face88776204e63f6bb439a902ea5f19e94e8640fcc78c32274b00fd8b23b8931478ffa9d1cd090a7cff72e4771202e53f30e2397902ecdf19f14e8cc0fc678d36275540fd2b23ddc91088ff9851e66409a07f7104779202ef3f35ba394181ef5f8efc4e42a0fc07463c274f80fd3b1d90db34c5e408707ec6687d6203bb5f35929f1401cd6f18a54f5820f75b46f0932800f34ba3ef130ddcfdd0e8fd24057c7e61547d0201bedf33a29f1c01cecf18ad4f6c60f7ab7082e057e990fca2f9cc68eec40616be7aa43829033adf30ca9ab040eeb78ce0275100e69746df271ab8fba1d1fb490af8fcc2a8fa04027cbf67443f39029c9f315a9fd8c0ee578de4274540f31b583b69006f3433b1025b5f1de94e8a80fc378c32274c20fd5b23dc491400ffa5d1cf89c65da14f730c7721932500ff4523989314f8fea179b307d9c6df8e696206763e6bb435a901ddaf18c94f8640e607b399f4bf7c440f7cafd01741fe1662d385fa3df592b8d01ec7bee3d984da100420aeac319b5b39dc8634cb649be6b2cf9a14809c1a57c017391eeaf3504127367fe3b5df3c0cf37d0834d9b322841a760170fdda60ac4a2dc888ede59c95bb326377cd5ad1a0e727f07d69befa3208e82649af61b959abcc6dad7c1c4e27399a1695bf9b68bc4bd95960df52b70bb3ecba73f6e65eef28d5ddde3ed07fb3f9c7b43075e965576ab770e9ae29accbfce338d9ab11871c41ccfa5f9f5ae738c399a20d4280913c14f6d7df1f4a749e2ba1c838d715d958dc1ae6fbdd615469b60bd11a4344e4631b134c43e5713e0865d8e6a5d80d8257b1924860ef53632d82e03a8685e03542a8ac8d1fc1153b54c89dd9dc24598bda69906e3a459d3e761f4229bbf626d91a675fa1069d1bdaac424da58d3863343e639cd162ac04da6ed56771aa19ca900ca8078cbf0ad43e266cd5b95e3ae1d486c385e8f31fe505876b09e5129570417032d480ed967d8aa27573c3fff37732c0c670bb3f16995d1ab006973d2fb0ac7722fda586856bc5ec91633cd51d8f553303aaca73a8a81749ad049c4fb675bf31557858b7594cf07ab40eeaffba8cd0cb09b6dca8edfc5ef9ac12f743c5c6c1bf2ad5639e2650409982a67d5e64d134a40c9da9c859bbc75e3456191cf2b69e2167a480199117006bd42b758c95ad94f9605041ad7195af5300161998e898dd511d8d32ebe495a15ee7ccc1f402635a58bcb19436bcbd4f49a0ee114e52603cca546437b46bcc7cc3758132d2950211bb2216dbb4079ce6046d185deb932f404f5487dccbd86bfce13506e6b39fbfa49f5782eb99ec20e937fe79181bd76d609fcc3045803583b632ad33e8615b961b6d0564c591b45110b4b6579868cb204b3f16c48de813c54e7674543a9ac4e2e38c0546f90e1c291c26f2f50074127d57455f858c2d6ad883a87232f196396b4e11c98b18bc8bd6c648032c10c0162d3dda99672be8f0c30876769617ef31267e969b64bdd3f27aceabf2fcfaf2c22f852652b4265d7bae63e9df0dfb075f2a4f494bea418e75f8d62e1fc1d0806ec4232d510adffc047f996be360f55b199d07c0b06310b03220958bf324b274457d130fe2d65d5aabc629a471c5f64503d892f8f4da579eac71f32fdfd9902da0be72e5ad151bbb15c96e3d2671bff1e95134d471a62e6ef5b3e4ef16931d86120b88329ba58b1fe023b85351133a6fd15a7f91e250ba9cf2b84810cd9ba892fa57e6370fef33be22b347c2244412c70b9593aab15269354fd59fa1bd1b8d266cca007fc4c72f1e2a2a972c5015f755a8cc397a7e5bf4df8d589dfd0d51dd3e813e92213af6a67bd7f25bc5e3487ecfdbc7b9ec93cc0196cad34ff52128e8d80901ee0c13560a020d7d6a3f06b8a91b3dc32b87892a2e0697c07609c04e9cfb21c188af7232849cc2f64deb4dfa24192a2e1349f9b7679714177505a2fc5a36773aaf7b193dfdcccc99d30fb8893fa3f1db8ddff9a165f3f9382dfd9687499b1f5564b9930b26f96769f872281a104286b5f967a363b71d0fd83f4bac836888933939fabdc3ad5b18cac6326b23138ac5ee6600a7e711d67620b4ef6cd880555ed1d31161ed862aa10bb3d2b4ca865bcc8bd944728e847555493185758917866449740a4842c7e6fdd104ba0f37006470be077d1ed441f61b64bca852c714146ea7ddfa4f29146d3611db42ebc9fa7257efcbecfc8be9f23bfa6fef0bb9f964278da93e7ad4970b65c67f404be4fb5f582de9dd3e8297cbcd8459d1cf37de3c4c582d9dbfe0e210fdb556191445ef33f82cad653ea3f15d30074dc871eb67393428daa39241f2bf7f3398debfe55f2cfea97ba2a11b6900f1a7d5ffd77c5f2616bd2bcaa9893fb1b1c1737e8947d9cad6036b8d16fd71ec3eaa254272f59d1729d7c245243d1adac81bc57aa1da06fc08057ccfb2d303e9861fe470ae9568039b7fe88cd4b84896526949addce5168ed37b77e5482dd9b7093435fbaad26ff523250c0b2a676ea1f931d2199735b6e20fcc7fc59dac74bc689b79d9a4da49808cded710e2c966920cf27e1760c581f2d1b144ff0779c980f815f5f9ac561416574100c2242b2aba18661fee1f7736715724b20da13b46eaab83b618fb69ff7ecf5bd11afa52825e130aceec3ff91838d6beb7644061796fc3ca9655ed06f847a0df6d030cd2afcc83ec23439088891339db30d7e6f6e001906f4a43f0e2620e2d8291ff47733fa9bf8c8927373aab775103d33776fd21d04763334ab32668748ba2ace4e5f50bde05aae6fc49ba74233bf06dc562fd0c89ae626896fe318e4ffa6606bc3b42f73b253af9f7c0192971d24d7381d97d4dc47ae3c9079a6003f6c47fde554cb91e48b709421f1bad7fe33ed4306a33f0a2a1db69751143f690f7cfee360a7ca86a8179bdee868843247b43cd0fa2f75a3b43681febc10b2c0f2219e13414d86c657c77ffbf6bf4c3a6efec013ff035e6c23227e4e99b0fd907de9b58d02fc2e6ae003388720f66353f6efa8449ae7c0ac18359ef7ebf0c9349100c0c862c6ad2064f1e8ed5342ad701e3ac588595a6881f1ffa81e00ef4e9d82e02d20adf7fecb2614be72dc5b1c874b99fdd89af15853977d45e5cecd9c95ac2555b88039afe852f23ab56214555a46d14ef6bdb8f2c4d0d6bb72caafb0c21c17a3563e79938cde2edc8ace2389ba31a846df4c6bab01ae6d850cb1654d774573c71e3c09be5ce5c1f2214aeb2e6c10b343d9801f3627047f0af6c045cf28fb5dd845f68b247c48836eec19d4e4f7acb073cc38919608f1ca760c2352f13b64f8d4f6e1b0f6fb17f72c6c3fc0ced3b9e9a6a3d2cb34c641f895d3e65abf04bc4072da86f9e33d5fe7a3e0a10d6968804943ea20aed45b0d43dc0eefc3adf63e933f334460f158f731bc1915d79e1293f270d36df780107b2764840a6ca6c569fe8f7aec32c36d73de779c7711823e8e2755bf751bf82c25c9fffced0d79a2f4d03a3f6eebafc73bec394b4a4451ad4073f2f3a4c833f742ed1d21c6fbca6d8c2136363479445bf40d6534a0e027c4058084bd056168f86c3c60692672232ea0b33a7142b05e29a182116d48544f5b7a403fb63c82f07ae56b553b393d084c8400b84c3f4f5e3d0d15651c2457b7c80990852ae836bc8c67911d16603802d6e7e543f0d4477ad989174d895011c597fc56924f0fd4ee6ba651ef8ef8fbb8701b7ad374da677ba2beb7c96edf4dbe4e2b3d3df03d779ea0f7475ebaf7f487f5385f5c8547adc1dcf84fa36e1ba8a0af2851ac63a318d772992345434a89d635528167bdbdbc01db820707e698d1f89a137e1411f924e9e842ff7ceb94bed3935494bf98394d1b5eb25546daa0b3831c585a16a352b41468edee81a811a60b3851325ef62110ab0f8490b971ad4d0e8976589a0f6dd108f1e8fa3702260738734e90525cfb22787cba0bcff47e671e89268631e42450283778ca58c899544d6fb6f167dd90608846f4cc7114b19af5c2391228737c5feec1f1d1051e78c98e538ed3aa498708995ce8ec81e71bc9deb61e79c285b1e351a5175b205b238f2e94ad82c0f8b237ef621db9ea70e7a8ea0a2a66ce0cc92ad524edd25ad52905bca70fe75bf50d995b25617d31760b708f7ab9be267c722f37525801f31cade3e362d6b9d77c8dff400167660e49ada6db68d1eb90b2347c5bad0ac44ba6c6b279a9f90c49a1b3930763401b9d8c8db5b3fd407cfb96872b46ec2485178f6de2b9b441316b9c2230be5e4615d3f9328cc41717907516dd0f39a6fa0e1c85b9b931a36d520200787367a615157c4e8ee1248963c84390c1711759f0d59115ba1b838c981193f9f02966191b344a35df15769eb5d12b6eca768340541c253c7f588c621318bc3a15eb927c59b6a93f84d35d1957d9a9ea7c12759220dcee5a5132383f8a3c6729999eefd4ae99ed80d9c865bcbf403585684b383127587968bc39c3e1623eb32da8a61a63ff82e10ad173211c9b39637e79bb620fe6259afca6eafb8775512431d11be270290b11c3bf1c54e4f445925d2506d8554079f09d3d946e76e20fbbe6a36c8f4a64c6f7ed789978652f938ca59674793edceeadd14b317575c6fe5f0be8fa7bb28d3b4e675d6a16e4b37cf37bd1731f8944d249cdc9e492abde319689e61bf8da4e7cdf8bb67fa1f482daf064af9bccf24e983c9754228de3bada21cdac98706f18940384df099564de95d6451b9b5fa329c59643963a821dc8411fad299831755e55113a304072a57c52172d57c653f8eaf42a7be4683fcb3aa0f86a874cd591a423a14861c9375f9dad4995c0912737bfd8b8c14855e1fd6f85917049890f5f6b32489ebc9fbaa544ca73655efb55bb5fb04d92c97b5c1b6fae9d4386687c2a58f86fd0542d6feb1c45339bd70b16916e5a7950993a849450be2e6760d317f6ae91c4ddb480548cbd629404859b9f69cdd4c296bc832733db2a25af81187dd2f013bfb513db2f853f756252cfdb21ef2c7e96230b0817011f2486322e8ffa522bab945dfb2e9ae382d36f350eccbd1a899a14bf1a9202f8a593d3e37f67cd607b24df58fbbf940568ce838098e74f25d0ac870366e0d6ae095a4e0450847b4085246210422d954a5aaf81d6e858f3d4a26271c3977eeca4e34065b0a8b1cd11074de6e4e3cff49382be38e533d620542420a2afbba90b75916f7ae9ae1b97e7365d80d0998f24a4d6942ab7fa498cc24bbff3e093d7efcf703e991dc66ad5f533c7fafccdc005d04f6faa725ae78588abda3f07b3dc4f73ca4e1318b58c681bef3c505eb1237ad39b20223e045de9592a5b99eb565098010603945168ec87a21c04953b68a7eaba706dd0e01f8da811c8c7b27d2632d0810e814396b23a698f839444963d483033dc4af7190a67457eb54dea712806425feab6425fe94c8ca4a3c0c77723904729bacc47f5bb2124fa214997facc4ff19c57eeba25c5a5a1c39ce6e1753dd4629cbe9d7e9c2559142bc8086c9b9c0560dd3226049e32f42abe0759eaa896f39475eff00d5b9f8f44ef1940ecd78dfcaa1f35d702adf8e7bc8c8dfb2fa7d47fbf3ef486f9fad1588f7cb337e92cd363afd04194696e9f9f7e637f5f5296fd8c6e8e809a1d66faeabe8b2d7d0f0e497170366f1a6f1a0558823874f60cb9b799674cba9b27a63e30bc86612d3614d69540b59fbe2953f1b6069d4d886352b139cdd994c68b3517132177db0374a2b0bb832c63990f7832c215a596d2c814c83904111d0720167a709e580279b93f68a19a5b5af86933e074fea1b4b966247fca08d988b2432971d33f30ab7ae7cfc9318234103d40e5f0bb17ef1e09442e336d690b5605aabbd59889add0edb439ece48074e469a5186011fb7677ae93f00fac83497f7d352007effd6ab33e3b3de48db33b3cc6c31f9022446167c2fb06c80b0b2961384ab7085ad6e719503686d6043f629d592a9bfc5b08a992e6dfdbc1ed73cadeffe4c2bf4af6ca46050db82cc23cef1a35d39bd1e563a4e86568fff2e1fee722442a4c2d122ac4628ce9bfd34d612ac0164b4add92ffd56b116b61eb4068ab8d3ac2c3bfa93f48287ca62f8c87620fdc586bb68a354b4180682bfedf86995554ccb7e0eb33c0a765308dd0c63fdb525a27f71d9417dd6db9bd42decbf415ab76ded23a5d7211a3b67173c582be4a9e83a697468be3b7a3e4ba32902b35f056ed90a372ca4c5892c7406728ee781eb2d8606bf36e29eab94976ad501b47c9e1365f6dce9180f3666d45111f514f63503ba243e673d4a398afa8f247ea682ef97eed27ad05d6cc873e236fcb1a19e00d7d4fd8cedd03d6308d5c7b358b0efae522e6a12b499a3b463eaeb1458a21a3a85c210c170b746064f2064821bc2a9a2469e470632feed2df7ffab06c48acd788b9e8a8303b8092c4665156f5224f056ca099b3d49b900835987777884fc3512c9b4cc5aa8429ecba8252059410710a0f5cd501e9ccfadf7c58860388e8757c82864e806959d2f138dd076244a0b54a6329e03297c389934fd0f119b7714b73fe9a51a3f1507be73261d10ac609b91223e878995490c3b49e7601c1bb78f4309d9fb698bd8655e2baf8de94e81cdd1c703801f61b2f3e59894f33fe14127cf0a604ea6ed8766a0a67cac436328d9fc2d346a1797376a003c3148381d8584a0fece8a147532610ee3a41193808aa014583aa003a3ed5de170ed761ff8e9837f043c7915c66351cb4df0a449dc400c63d0b2c199e4553d06645e3f434309b72f70d33a59d419f743b9846f9e3c1e915c786de1ffacb1c44daf0895b143514d01158a7596f3b1673a7179420d9aa2f63d60533634fbc534a17afa08fb35cff925247df032211f63b3327ce39ae1f458b64d65271e00d77433b9d51858fd2ebc1c0d6c203dde0a840043e8e2e5060a711a6431c91361e7c545a14771f327eecca0ee396e761e90269e704980f44c35d7b3db45175298399e890894990766a7f68964bb7fd40de401558204b740166a40aaae728bb7da36f96e454e6a4d347f78205afc4fc3e85f289029942b6318fa0ea4da2038bb0df9db1d1cca0d7df6518ea9221478fee0b7738be0f0d2028e980998fe82530f678c5e555c2a1c2fa1213813aac90a86085840854ead8b69837ef64a53ac271b2e49e6e8aef65d88de96a472d8c52966ffd7e5d85c242ea05f00f2f0d26541ed4adc9478509cac4f33473705fa7b1b199622dd1470951a7e426835f6d4fc5e6e7b51aee57b79be002b3e8e05d0241e4d40a445b11f235b1da8d426590fd6f03610dfaacc080ecc439ecfcab9d314868462611f65015d2143cfc2d618f623a54ca8d46121aa318aa5718b23d985a8043a3a2b3c3f0415b130e37760312c6f9c9cb31e7c1df5dca8e799371c3e141386ab2b499193d4eb0815c9d1da7361b396c6889219d4f158e9d22d6ba5ade2033b13cd9776919baf1690d482712c712d6964b699d047b0ccb1424e8eaf50361c7094fd4a590a7482d5b708fc9c320431a5356ae67182242fd804e6a0c2e6147007d9be07a40c25cb34b9b500d21ee460947176051b8ec8d6639245737a064f4f359032232bc27e04276881576919e12d603dba8841e3948e069f4cb74daaea862652092506e270005448109e1e9918b14a47ef3e04647fafdf608c30d80a4e34e009b6035edcf78ed46e5bd44c1d47bebb0713b0104303ad56bf99a405f1cf06ed2c58143eb5701ea3125d6051bb1249a9d1e6fd46f902404b80ac8e3c34f678c569c30728ba95135181ca76e5fb05a8b941f94cdfe8c5604725c45b549ba52607d9ef9c00538435d0205cf5c4b6fc918229e9b5d723c8aeb3711c1cbe6cdb159d42e2ccefd142e4539ac0e722fc2a9593fa73b35f357db46e34eef1d42ac8a6f539957b5cc53e051de4b429a29a405e4d817416d8a2630a331e2581158bcf62725651910fe2427ba7d266fe1743fcfb21be0d7a49f81b6d9b60d4091a5ec36f9e4731bd8e905e43cf67fad87e049957f49d978f74af8012aefd7ac2ec8d5d784853b83be1602140e7cddd430b0859084fdb60d8c79e245e2dc9876168e0896c07405fa14b24d1f834d4096e4978f6c3624455e8507daaeab823098c8bd7e3a7eff1c78e9d1b98c77ec55fe3c49f6b4bbe78b0db47124bf20932fa954e97ebda863b9bb194818e62a349068f8fad107b04a449d5313a1a5fc8ca240f7a4e137105f84941b780fb8a00c62a7b51e988e83205728f731d8998924022c358f815ca5a2187494e0bc0def6e058b4467879226796005767f91aa4c724a06789b29e1797b2e5c5287c5d392bf648fd9a50a952e3e28a49dc1672491efcc33f275774a064412364058fe565adde7851fe6b320fd47aa733b14b1540bf66f12d1ddcb67e98799481301c51194d5cecae3d3a7592f9d315169e3df92aa88d2a824f1cb6a7329a5a58bf6f02686e3e794d57f1ccf5f9ca56c729df21845ad02b74669800c31d61efc56df8a5cd2a8469ee8b22caefe41da427c5764159d820309495f37d8644e5962ab2709940c968c48132eb6d4edcaad7b6eef8d4d55965744d296396b75552d199484c62f97191952b172010846b5c14635af795c6387d5c7257df70c642ad2b86c8902460a3895e63ab55305b618f5c42780cd00a5a76174aa05c5ae5e3074c4bee34c44b0d92b6c06d406a6eb4785a613fd24a1ca3bbb312544948c4ce9aa2afafa73c9319388f583e5b8afd161cf8c86be86ec52507f6a491185b75cfa2b2b5b0f1d408e8f2ddf139ab31d17444931f55fa30f1cb9fec3989ea3014d9ad3ff9304a2970d6a3b6bcc9b55c8ddc16a62800aa429a9137b0ac42925656c7df38ebc652e579b90f222e238cd6e882b3ba2977b158d4f87715566456f99845f4ba83aa1e34f0e8799d1eb7f9d2d59094ee722896694f4b36c296a1206a3b49a54be05620e9ed4cd87319a044a10414da2cc452660e461113c47576004faa450c9a2639f082ce3ba6b04ed1db43d2d3b306d0800b1f91bdf848798353490ae6fe79563a90ae472533d23f486f84b2ad6fa013e84be0dde890cbbaf69f91373191d5b704c4a43c2a6ae68acf0649e1768520fbe2288e40a540a5b6d276d117f858f7212530b0a57f042f8af4d423a53c14081dec031ad1187ee681fccca0447f364cf39da8d0ff2cd200ec1a8061da00caa65edcc8a48817000b17857a8c2dd2559030442c92c8889e82361c8e1c361b4b02b8250939dc54d0951b2a4256e8ed823c26c6fe00b4e12c5ffbee1a6f21e2febe48c5dd8aa3bd1ee59798e14ba1dff32aa9fa753cd86a39d17511c84782875c07e48ca5f3a8317647bdf20b5d25ffb48d346252a788ecb94e05822fa837540827503c581250a018533b4590dc60a2ea4d1dea98c943c2e0326de581a17ec26dda305de07984532ce00205fdf26fb3f2550f01e1f54a0c4673cf4f7c045f8dbf5b14cfdff6069708face802895bd98284cc18f78d6f9bd7f05d1dfbf889f18b1c040b8a3ac3f5b4a76666046b6bc8e447cff2ccd6be5a0b2f27892dd9085e782399fa1aac20270708144f19b98461762db06330d66619a46e29bba641784936dd5c59549fcd43335c5bb33c3ebc058b74b51a708f9f11def2f952f765b413b3404c4ab6955471aa479176268cf1dda158492ce488795d752ef8885aedea09840264d7985e706aa0575b4206ae5fa809ca675682a1a6f21cdb9f8e15d8ea6f6dd0b1b16fd6a9e25864c7622d7f79bb7e28b5a17da971a2bceeaa4f5238a11ab8ed5c056045656bb7106deae17fc6ec208a9c14074c1b5bb1ef4bffef596246ccddc81676d4ea65a07636a784c6260dc2b63c51a28b50b6d2f5cbb1cff020e1a9c66591413a02a272ab214b5c0a8663b5a682bc8297c01f63456c9eacab48234c20718ad37dba0a071fd39ed8c6568fc12abf7fd46eb54a03e49555df20a0314f71689842d82bfdfea6afd5e7d195ceee0d5c9b5cdecf7d2755a9ce87f8037e025830bab21cdd186db88a7aeac8c994e002e4646ad4cc824a52bdabb2ba954833ca82a4534e4801cd84a601b393160fb13cfe7c352988c14417ca1506849d9338b741d2a70185580f93140d9e5c646c076797abc371b58ac357696fbf47fbc3fa380b7d6fab93b4fe188f70aa48b88eeb891830018218ea684c1eba51148cb63e55ac81a7e1c0fa6cd11e6e7b0a0bd236d0a594944b1e2bc86d3f2415c33d0a2c9c2dbfc1d435bf2d160fd6a12e7c91d578e7ab1692fd5cda6ca7f44c6bebe037d87cc20fd4079475386c6ac52a89cfbef64f4b045b076a84d2425bd27fb72ef6790ffdb6e4cf891ff0d1bb63bfbd5e4019a8ba8bc7a8063af313f7b9d1f9ef8bb180d768218b66cddc80a6f32fd2bdd1b1029f3b6a6b4c5fdf7637213be497c6b93c8fe16e6f654838271f8f7a4353bb387037c61369e759cbeeaab92d75294719a5fa7800cdfd9d841f292b4ec224fae2e3f3db2f4ab44db58272493387708a9e04c6050f3565e2c1c8100b2e849280d6cc4da1e00aec31fd83ac6d2b06aa279436212597ff436199d667f38fff50843744752c061efe31ec9553b4d82f4dd394e5f4323cdc9ac62d0ad3f282f38950b628a99045d6b6d6ee73d27653ebe4b0a8edd4752ca7b1579ed76eeb73040513b9d3cd4b77d9d427bf02eac8a1d6d60a5be95f33a44923deff2dc81ee4754c6dd8700a3c65ef0f5f751cc276489f71322f163e87808e70af7f2f5ef6db63162e6751828151979d256f55f83b4b9a60c30cb0c61fe5cab4b66a410dc7e09d821ad1a55c753b03e5ff05bd95357ae4f1ab93861f8f509b3ca2bba955336aa4d88703baf1d8d2d92a08726a4c07dd8aaa5a562fa98896e35befdef34f4615b763b2c3d8a7310ba957c3a6dd9fdbb4cd50bec8c4243211c2ee41759378130b437c6e2c487300e3cbcee39edab41d4c39cadbfaa0b715d369da944c6a0659aed51cec735455fe222befaec88068a6fdc92ed8ff6b11950d1c386b126afe7f3fda01341bed833dfe8e0e373bab37765f4bc8843f8af526712eef88053a4d828969bd8f4925b08d16cd548c9e41ac9c037f347e6edeca1fd948553460939b6a76a518b877076d9864a8c2a2a51aa30a1d2a9a98075933a4e9c52bd6ad16149a699c6f5d04e95e11a3d93bb22528cd420c2a8ee145b440ec2877a811351c70ceb38030bb38cd72617e158a46275ce5c7baad781a511e4a3e9d0dbab98ed25f9c7b5530614e84defd7e5e3b2b5741c1b135508abc3223cc3654ada375aa1af46da90472268c0bedbec865edd34e655f5bac7017c33ff36b10dec4f8bd9f8af4ef4f6b6ea20008eef05e8e1d06dca8ae946a729a18e9c2c41dc6a7bea2c184f85db18fe2b1a530ec7e466954ef7a3c9cf93c33a9c256760d93a2f9e3a6161c3113f15f657c764f86354db09186cf8109794312dbe2be8e15780b04be9e801fc5268e87560e724b9a3cd05dbc60c5ccdd0670f96ece2fbae03c4fdaebd02f64523424c707132026895d249ce94e9fd61761da0ff34418ac3e40e774f783a82d4b9f9a6195204c229868b5dcf20fbd2fb7a540633f9bc3d25b4f36232191dc49e33252fc4a65d66396d2821acd6fc7d1a70b83ef4276dce08eb832782302f0aeaaf0e976aeb01e8510d0ffc9c867b3bcbb6e6c781952e787072caded1c329884cf0b2a3535a4410e2dec326bf231a9fb17742209a0605088b6b58af63fb11b1f19391be9c7079614e24828dd670b49cc3bc32d81e8d6bc83e5638b584f77b2da17fba9d3dbe32ee0b50365e0774731a3d5956cfa7d80e8506a98a52c3182db63c1426fee19ef8c170b8695afa698350f581031a7c5e235ecd9d80db040d3f423fccef559f6d255bf441b90f64dcc2a841324d056dc0df690920e60611e461c4aa86b388c101ad7b253a70817c4116693922120a8143e699e3caf161c89a1fc1c3d1c7d909b2daace187d2858de915884ab5c74032044a7dca58d23dc9954b2bd894ec2071bdad0f6cd703d9d7887fc131f9ec52652224f5295c1c6c07bb5729e3fd00bec1af321c55fd6f490e8cc9c25dd2cbf37cd006e66ba78e03d200fcaeaca94c40eba6370aef5223b6da7fd0b8354a59098cd9d6e790fb4b9e2c5088030aaef1ee7ffb9538df1b3f4b5040d6cc25c0e66d2207bbcbe0bee3d9070529a63c22e4dcb39105cba0fbaee7c01e1103d14875ce0602eaaf1ade881ab134ae846e836c1a9a75e3763b685b3b46c5ebaafdc59bd17bd46b0c76b337e596c7af4335dd65360efca5d43754fd15ed41ed4b1691a7e7bde5e58d01131565aed3c67c9be1a6965643ef7cbbba594bbf3034b5b0aa006a2443cb392086978d33c8f8525478c9102487cc8d881328c0a0ffaae1b796fc1cb3571b72581e919679128bbadb4a36a2b40765f58a9d5cb21d2fdac16f2feb8ad3d958fab7890e31e904ee72a56b189d978997985d6ccf9c7c71307274b553dc92e54619ddf32a0dab9fe3acd455603541dff2cb4c05d100b9bb6bb7ac64d3569b00b875779ab2588dee98778add304c6be5d78fc4efefdfbbf125e00db97e323799ba95a2b8a8c28c71ef3ab8c5c20ad5adc99f0b4e48a13c814cf9af312acaead76600733a18189bfa6641f5e56d2987575243461df61e8a01b383f293d8a7183e2ccf1695a8e8482268356344f9d01e7c30797475335a84dccad1afd75f65efdcbef7c43a23385066002c3db8d8d8f53128a5b0b310786b12835aee5475ceb18e416a186a021c94fa976229cd97226b8731a0f015689a91b3d3d38316bb9766b83fa294d63f083e68d7dd1bb98fae44c796ad82fb4e11e9f749afa50ef2ae1fa66507d0c6eacdd926ba287557b84bf358a15e37627c97513742b1cadc09078383929c4c03ab4decf4ac5c4c7238b696c5ccd18fa68d67cc5c13b64e559190aaca7abcbe48d698ce3dc65afc617ad07e30b90f3e11a58449e0f97c117e8c67736169b1514504d9d3b426fc74e2e73bdb5b5fbc59fc84103023c7c157db8b1cb8cde69ecf6fedadf11f72efa44001ea569a793e81276c6799290838bc93d4b47c813052d7a6931ae927d821cba357a59c8adb80df248a8a81498bfed5556d7e9a94bfb0180be09c5dae6064c49537cc2cb88fc75c58c27454ff374bc403dba61cac4321857c41f9fe2085662ccdc45054d53e652778ae2578fb0328e63190e6d16b8e6e4c577ed972d86566ba55015aaf9d44d79d526f3e5f7f2f5f7eed7a20062203f791bfccdf3a1b1d8137e15d33383ba7abf08ce343a6e1468145df6af9aef9e073c571820b735aedec4ebd3ab27432ad88e4a5720084c2ad323a233f0008031c2cfc90e37c76115c587ed0ecaf03812d98bca5b537a944ffe5878c9aa39f2cfff0bd41ead0814bd8f609502615e589a35642a4b8edca335fdf42444003f7b04d8e4fa08ba40600ed0be32abe079557117187d2515cf6f57230fb484ff33953266d1f318c2e2b819974999315d2b2c5d2822ec52c14469503a424e1ba27c3a40718b1f23026e48425e348de92bf2a3f1da8dc27a34d9dced1c57f445bce7ef6013e4e5f971958d8431685c8f6c50d5104b1c3160920b9fec11a847b0350cb2b221a0302d6875ff0145ffce627e38c09194de4f1263e4a846223547ce81d68275d21355325f8721d281e4464220c683be69548b5a9dae6d6eaedf94119291e9f3240aa17d5b5b32daa692ebf6e88768602d1d11e9424113b8a95d07e6f1969e5d87853c6aff3220d0e4eb0b3ee9a6038355a298c4ff2e7e7622b2167304a09be4c3409da9523f144ce7960f45e3b0514f6214500e5d83b6d847566842158d4083e18d0913bd9c6aacc612208ea6ddfb864ec74e277c10ed1a5849edda7c47904bb6e106e5cee54b3a2510996952cf895b26f55a55e0b59de26877a22b886fdae6f5aa12aaa3e85ae728aa8b660981dda51cd5610a168a1f33c61678792f28f17896057a4b3511f8dd4e94d5771fbaaad5741b4a80095aa513cd57305ab760afb157caa44d21db8a1153acfdb54a6457dda1f5531403ada611f00d0e52f2de19d6a6e40a52e60a3f6ded329e2c3fdaa8182b7ffb2447e8d7c0c6cb96dda21cc5cde0da0f17d284f851fcd9dbbe877a80660ed06a8e656cfe4e22be56be4e9aea08c0b742b6d1ac2561e21ac8bec7e0e17cf4671c0be35b10513c3ffd283116d9a28e62e33f37df6c47632d73e1c43704f0c2ee117729147deb778f302f7eabd35e75b0ef9a4ea5f7f023daabb7a02c61729f947412c47cecd6c32da6f80d34b054b60a51901cb52a0b9b4e2290467f744dce60c2a3f82d573330925e37c8fb7995fd67aee5566db6c121c34221d12a804985af0a4733fb1ac38e3057e9700a232a77f0a44e70014b3fb7f04fd92d7744d5f1cd3e2ac28b329a78b9a9bc42323bcf357939fce01b88a50d0fe334c2b04106d5a2a951e46e13e02ab09c0845f391fb23448f2ab22aa7f0937b17211cf51c965d6e1ce3a6972bffcd86584a696d7f399370cc1b4a5ce6e4ec2999233ac7b6ab26b6bfc70840905f2b5f8d738d6c5b34dbebae1e5e0500c0f74edac2ca52ce1ef0f68fa85858b3e8a89bb8c09a1b7ff92fb8a5c533ed83abc53e838eb740634329adb2fe012563095e087694959ad342d068085c1fbc22f1ec79adbb55736c99d0a513fc9d0c50334f58d6521d186bb67c8fbe2392ce2e3602b327c8ac5e4be810209b895c4c49a7baf8d6c20b41853d27626cdfe8350c65858b0726033f617eea2a601f0eac9940f9b477548eed38b7ff9b200366bbd6bd9b266747bc09b7686462fa309470ffe5abf72b5a7771b0d7a8de8c8dee6dc6b108c111dfd4cb24464bf69c94f2b97fead27dfff675f1a2efd7c4beebf8eebde3a86b7afd8336673d4e298888b642e98d8a368961c1239d17e6c8bdbee55ed8743d0b9e5cf1c94d2bf835c54abfa9ef36714863671d3d0ecb0447eb9b471072716fa603d375d826439adea7e0bce72e1d9964442617f38086903a087bd4b9ecc49107a35133aff7dfbfc6b97b613166fccc66f8cfed8fa50d70d369aa00ee3e03f75aafd6587eea9741e071fd81cc4e975b8053baf993d825b0eca062146bb61582604d07f44e903da78c206e215020a8c117b067a46e7482e4480b0232e4d5523d8375cf2c89de14db0995a7ddaed210a91bd1891328efa3adb0714223d4d0262abf1cce6d6d5ded15906650ed0b9807066cff8b083e8d24a7f110861e578b68f76efa780544ca10514a1f396ccb7e7531115567d71cf1af2bd2cbf2eb4dc87f9208ef939342be031271189893e085b406646aa31edc918058b4ca08906b1b08704c9c688035703117d7ef90691ce58f67d3e1f3ec6924f4144a6edcac62f56eb4191c62879087b57748af347e8f52304a10996e13564c4af223904d1d0c5833310d79d493b560d7f0c548ab06b2f1510f29f48acff79eb9bacf0c8084c46644faaa1df29d5382289751333106cdb4d610d7fb0db2887ec1b699ef15c7d50c73d31a94e44dfb104889ee8bdf27701d8d3e4c054cb978faf070b23a0fd656c8fa9adacb38233998468fefa0db451c9f771000de1368d21c05834bc4eece0c9565a71a18e9d648c742549c127a6d171859848233a9b75ea0a352c294974ede1e75060360fd42bc11ddd7573b890d3f6df0860510dd355b25e517a83befdbe20a876f0c1482b6efd07406d25d1d7d06c30bdd2babd234fc463d546a33f4282f9f60f73a03ea45d60e5b2406ac56aa8477ec2292a4636c0e14f2562cf1524460147774ea78d8b970538c22a920b86121239d8d486b37c06b012bf647c607c60a116b12f4a32c4efdb3940bec4b66d51443f461ee37833ef524ca4e0f0196ba1a3ca0301162372e3729647016ba9dbce164cfd43311aa1314a4f8fe57e66961b3c919371f2205f0f4f418cf521586fa6151c576ec8b980a05b426f85488f59d42284bd60684fb70701fc7d73625f08cd280402f66bcd06ba7b8729e8f65c2d8d861e83f97cf0198861e2983b5eb0d3024ad81b8027f106c9a1355d3d64d6c62397cf9e80a375ce4948bc933791a56662357a04adf368563f62ee23ca4c4e82ed37fa642273009aea91041934af7f2ccba2b81dd4e9d83ea5ab08186f94cd959accfc03028c88f95a92992f70680be90ac7b26131abbd206b380cb7f74a6255f132852591adbfd56e10fa6f8d8ca14611efc6c5ca27f4168ec42aa2438bc2461f4cec36853b4522d69ae05b973c4cef18587f3352dcc24234e34a374256e5b88c2b1df25a6322d9e1f66f790f32feb25b01bf33c05056685307db937580985e0257c02e2d146f2933df8d46c428a7c0c98a17558d9fa801e38b300fad7871f51e5e26a398aa37306ec05d9a31d913dae81d30205c150a89b875852e79058cfacc0db2e2d52206448bb47d6eed2eda9a8ec12d155958e8d6f79df6448957d7722b652266bd849685c00b9dbf71c2a2451125e2c5bbc6b240970a013b36ad316b87bd18f3072c3a9111255e54e9ac1315f1de6456f94eb05d4fbc7a22592d17743b231167bd0a526970aa3a6c7a250dc4b02a53456aefc8a03d4edbd6741b74fb2a6bec369a6aa0481fe24e861163bd631029a8181aa6dc5d1241a9ba7b4465b91f1e0aaffa15cc12e867f6a243429503f442edc1aa7ac96f544eddaf55a4fe67fd484bd6283c3a8d9b76133cf1bf5459a8c6ee61b44a1e1bb3f2554f8179d48403cc29c0ee031b33d53d469ac2bd09cc853e80f80cccda78d848d3d7b8deba0ace7bb2c37425610a71a501caf3dde72df653710de55ebdfb47e9f3576e5d0e98fd7a3962d990d2453d74859aee6d326c9437bd2c2b2bae966e060d489cd68a227262c245b068633ee4e54f8a57454fe0aee289d18d13b605bc3c8f8b2492c107223e75c11ca9c868737b03ae533e1edaf69b0718ced238916bb1e7487a1c4b841307aacf957cbf867e8d6c0130b7688feb77bb030071b5d603e2f2a04225f57b21fe0b6537664f163ebf47142bcec002d5167ed9fc6d349eece0926b3b68d1e06c7036049f3684b51cc1169a03b6629bd6a9ba50f5dfbbf1df583f3a2128c7b68738e64dbd27aba683bd39db57adf54cf8ee73cb617a664a02f3782592b93dd068a721f303f53f7dcdde36810aed18e8631d81e77b55e34cb3c9f98497d30ece2b4aecde9379e6f439a8082abd31c462f4c8940bb7bba7f8632aea009f2dc5c132c9bcae6caf591fe21c3f4d9936d2d1d24eec28dacda5b59282c6ab75bc3384df1c691804e762b42a39b15ef2dc3b3a76bcfe5fab682b1a94ef4909dc89ff85932ece72a6967187c2b71a2262ef2e90ad85ef3384db0582139a2af3ffd598d2901ba328c9bf21d7523bf764e06a6874e4f3ea944fa129ae12b1134bb15520dcc99adf5304c7e3ca170b467812e9fccc5700be6d73ebc1afc1b7d99870b1c47a8f0dc97d39eca05a6a9522087b9b6d4307b706aa3344783838a6a5ce0ba9bc27481eeb7930b790c9e4bf51f02dcb1a6f7f9355e357a48ebed2a9537fbeeed885ceb5f2b30006fac46ee93de69745f05f3c36ee89312e2ff2ec28b02ad3b2d3482ba1339732be981b3b874b56f12f41acef4aaac02edd0534d502766cb336e9d0a634b62ad4648a01289fb444371f9913a4cc8f14b524e064704391f1b9743e83066ca0e42e13cd7d65784a1bfa3b24bd984a527295570c64a0211bdd43f8709ebb467ae066b49177aa2bb4ec4d94bf9e85951b45393a2bb62e42ec9f1055a39028eb2ee884460009e4525ed5659584a5de54a2e714bb41bec850ab303dbf91b1779a03a5462449b0dda065304e33f9f93b74e8e3d2c917d7ce0e067ecd175184398122b92d5c32348dbb1c3535043d1cc0957fbf687a5858041e3b5ddc42b9c3777f0a9e5605670eb03bc891208c873942d306fb625e09a68ff19fc1746772fc3d6e1a4d92a23f9b49a808ffbde36abf1973da1a94ea0a8ffea73b48c490625790fbe8217f821ea63a36bccb66573288ab193838221fa72ddd65c3067bd1dec6c780d833773820a9b92db0e490b90db6385c2d5207049adcc9160b1926f95ca0f27891e621b093fc760a5d5693fc6510cd3f867e346a0fb14f8ed5fbfa433446bd23e1fd48b942d1f8e0f2373ab24e21741f3371379d47d4e82b95de64822b5289ba7bc12380337ba3a09ea420ca117bb7cffe31c3eb9027ee9df0d5196ed3514940bcd9c5e10094cc6d14a872bd63e2b4353ede38bd1bd2614b31f20c4cca80aa26c2ca64e3aa0a01bd1c289c283ca7ef26a2448e38a19db0d700f4f4b9e14ed7f771647ae7cbbbb44c870c33a42f86f54f284d03324c36ccafa24bc66c46b78a86dda676e532211e72a6334643438d4d899468dd82fe8373f1ece0f52245c7a656fd7c83a48145dd9c20d51b33e3b62e71998a1c170fe99af3aadbc76234c045ecdc93f3ca89578c4c1e9defc960eb0c1e797b156aa168fff72b9b6dcd61c3be1d344c02e8101cebf8624a63a095d9c15ab07931eebd63c29c801568187de7a2bb1c337050c1b2e8d9b6ceb4517d9b4e9ea4939e1ee322a95ede796b3dc1aaed9e17dbacff6423e3300c7c838cd8b1282435b98645dc911ee5d8b70907d8696887558fb506aa696f166e6b34411da804b1cf3f90734dbcd5c0075b108d92ca9974d798083bfb410c51526f176ecf5e2e6d790d8ea610153e80bbdf8207c6124e977cdf048c2591f07280c7b87abe093e7af17186f1a04f79de1bee852df6fecf99caab08df05fb3edac7bcd0b3ca9b6564ed7894fdeb2208831143369daa6553f9510bf105c9bdeb3444ca53e9c5ecc0b682744101c18ce21532a9a77d19917a046c7aa3dc3e78b3f06b5fa01f7ea3218054ed20449a598ed086cf35f34c6a4d4574b4b0122571880b81625e017c467e11d543fb6426f23df81e2efdfd287b4e29e927a270fad359158a07b6177876932bf96ea7aad69c6461a1f68c9262cc53222d955157dac9b7ff42871b731a46643df86a88200d378b9c3177d62a24cba00fdcc630d467ca12c8c00794c560ea830d56e6748410fe5d5864d76b52c8f35819f9e94f9494f7e83c717b6b0d516ba69830c6c4d8da079a631266f1319835ea4ddfba6d65a350ee2385d1bfb9d8f542df3697dfafc573198abd2f7f1dd3d4aa71fa1e9018c96063f89dcd2fb65d6605824a47c7452e60e2ec5562fdc9e718bca98fecae17bbf70ce7352571b5906ba082e20f7db811fdcfd8287faf08def6087d85b79e45e1f7adb0f6c5558e0ed7bdc5d2eb144b78beff556399adb2dff6166280d8042b4ad191d3727be71044d26c1360c64809f383b74456ece1f37c8a752236fc3e96a2250af1c6903578b4c3912ee9918d502bc799fb49dfa65ac7746e449342073e5d8b61639c54b44f6f04995511a6075d0b94748f048ce8694af0ee3a6c02413279b86a51cd6d66887a631f32c8f14c3d6be07ab3361aa6e226c06f402b395ae2ed8c510b7e65755673b8593a60cd8e4e5a9fbb64034c627beeb6fe34775d3f41f17506d287fd5a3b5722cb577ca7b589ab143aec64aeb655a9b3993aa3babb898cfc4e8f6bec0071e9b146880ed4fd096283b1da7d182b3066b0b362107d36fb3e87c1f14a4f33af20391408ecf086981eb59300010c5a3eb018db6fe2dee61896d3eeb4ab6831f09d80aae13ef6beed55c50fb1e934437a614be19a9ad2d1e33c043d28aef6ea50915a8e3ef06d79f803f8af90a3519302c646625b648313d804c3779a481b7a6f80866585b3a20e98c585d5440f5ca9d52a003d62d2269bd4d7d4a1d3e13a40f9b154e460cd3ce8ce3c4ab4f1e13c41fd0a39e8a87198c51cb3d5195fc85bcaaf066ec91c4af792639f56f8f69007004cc6757a824c406499658dd132fc82bc8fa63fc0a0cf7f79a8b083c7d59478c6fa1aaa3db1a0c457d791aea60f940a1e258695a959b65e458b64646ff9bdf27e5e6b7111d8ee7b240fe6d252136049b58c65ca74e6c498f1477e9632d14fb06f4dbbb221f8bc2bbda9cfac428c74b38800a19c1ad34576f7302152f947f643906d43640e8b503ce3bace0475a614190d9d5933eeb056a4f4721a130fdabb279b039df3b2e1f585f8823904bc013f8bbdce7032b67c9f1dc34ec556de2dd4448cb6ce7b79a20b90354a9eec6b909795d1697794ffcbbd2edf349f45e6eeaefd8bf69008366b7dc6c8c2f338fff181c5d0d4f2aee3902c27ff7149b98c463c6b114a25c201126507f14b2ce5957540ee8ddfdf1ef272f5415678f3a179c4b53b0cd683682ff5b1b625cdc7b136be0f860147d4f406862c70eeb01efad356cbcd3ce679fc5e8ae3e2517affbd69b428683b3d9839b6614e2de934c0d9922f80e4bb015534d1702a3c6e77d30334e2074f00c9772cb79123b7bc1bf467b24f1e9811baba8e510a563babf52a6b42d29866516611256bc9eadad9f4fac3310a348f661982a2a05d398d9b4db885d4ba9925cfdecf847786aa01857a3e23ff45120699f981d57632308a12b6b2c071ffac515102771c753010cf1a517023a304a7256b19237962d2a66c2064195ccbd35fb9e1a5b1d0db188388a2185e52e4419ac4fa5f3c56fc30c340ce1e7e954cced8c5dfe883f5940262004f678580eb00103e9cac983a3a533a068cdfe903e1c9bde731aabd825cc2d7903717cf28dcaac4e1c8b0d2672a478434f6be5cfb2c1e4d947173ecefd4a3bcc4e6114acc6008a8469bdadba8a459e4365585dc84f59e0409cc9860b0ca98a7ff5c97adc392b6b4fea0473f6bedddf6467f642c5e1739c0f4323d6c0e6956435f9ae0024a5fc3da7ffda5f92935ac9215c08dda59751dc3fdcd402c174635f83797980b01f9cb89fac450fcfd1e5105b66d50aec0296fd9064cd07be617acef6d85d0ddaeede84648ea6879985af055c5a0e92a8ca13f89b1e6b6c5fa38de020fbf28c3aaf3a112d9eadde9bd7e43256e01f909992f95497a07aa4f06a0c78dd8886c23a60d44acdb316de5a018bacd1d7308a762697a034e22e000b4d23005b3be316404d145562ced18cefab5a11e7aa8e9f5a12dcbee2870cefa009dd6d68b56a0e14297cd6df74cd4dd46ec1b9398ded294e9d43e8215b4bca118fc195ae4da7253fcaf019148f516b59f0650110ae1fedf3875f1259e13715517a80bf3a86c3ca081789db40a15379189810f38df20758f7704b7ea4f13693692ff6ad08eb3fec2565f73d0b1bf85a362d8e842b9db3f03d8255b7e54eb4afe3718818d26d9888c12f91bb4175d5066fab6f1bf151fabe6abc40999917625f89892a4d55204b8118f678bfdb0a0e531b267acb1af36c5ec05bebcc4fd3c41d0b6708c25386781dd4c18fdcb18786006ac1606a9433ae03da5d9baa2f2d80dd4a4fca8b35f350f36a52d7df7866f98ee2cdc9ff708e4b7982edfad5113faa9125bd41e7949b2507b241b104928aa0796e6956734abd2be426969e258072d7a36660086e2ca1b9cd5fd445a44881327de3c73ed65d690fdba9ea66c247148a0fb1edcab9e050b09819b51b3632e1599d57f6bfc4037b9098ce469313e570699ee7f49394061edf54ac39f2d58344bcd70ac8776caf0b38632ba8b638415428bfa2243b9d6405980bde3fa51a0bdfa72c3136f2220c17c408872a0a3892aff3257108909e621c971caff8d01a0ad853f86f4674fc753d1d8262926538c26aff9909bafa2ef5f8df4e693b312c8f4204e43c1b12eacbdb90d312489f6aeb7686cd5fb5e35b099b2b2bedb21a34130d03c2c8b759ac2dac68ae4288d12589f2080f947363ada602bd56da68e13603aabfcd739802b01c8cc97c476df5f0f7ffaccd8267f8a1172a1ffa84af622f7c7d7c1371c9f94edbb91bf737c534104703bcdae712ffd994fcd2cd1cabc44709ca2f3987a89556e761e498e7b0eaf64f358c466e28e0f0b4edbce1dacb4493ed7a9a76ae3321c7bfd53092c3f9821a9d189ef073ce536e4665eede26b297496be2b7f80de37db1819c681624b2444076f3ed6b388ea9069a59d1acdf572f6d62de14ca626c4a0d3e88748ba8830239cc52b6c9709a508076139a53ad64ce138a4f88a3deb0abad520b1b76840d6271ca8b45bfbc9656c02daaa09d5fba8d16f2dcba81136c4cfd6a8c2b58f31e90ce6eb6bdb34eb36550478359db8468b47ded3e09a28df9167da5be262c9126b8d61c5675d57059dbb1b3fdd690f80a5695bb80d51716347747ad0b3ea7dd98fe0922ea355e00320fccd0d6f8be70d2d2ca734c0f226682ef31bf1941003059ad9ec1a0e04fde27537b72bed4eccf819f9faef168325cda67fdc181e7562da7c19c7dfc4c40d08ae58df02a2f763fddf17ae70f1d79d9281bd0b9947205d0bb444216dfff9feaf9c83be12e4333464ed495c518a81ddd6b57c353d77e6ba0beaebd0f970bb7ea3d78d3b4d180e70ba2a91d2fe1e57628bb2a0ee843c482da3810a5a2b8dbb9699778f7f80a3b6c5e9e093f56dc56b1829e10d5e2aa0cc8646a49a5fb476b24ff1cc4b31f4e6c825b51a7d160cd8c6af641c0317faa3fafccfbb358af8cadf87009ef7619cc78f1d327782ac27fcc4530da6f1e9fd2a4c5a794be9ab4d26261a99e6fb8fc923e7261f5e4ea4b7635f39c1369d9d4c615b9ffd463cf24d4a675f99aa95705f9025ec147f3dae578f17ee922b867e5207b695270ed4a3508ed473b5722ad3895b21f496126310670a43d2dd2ead442e939f99c7dc75b501b8e04754bfb8b23714e79cb61e3b684696555fca3f8f5f14c526bc43d64e87a99382b55365fabdb2e849808d7e257b95691e29565e7328dfc61e6c47549c5ff8116b6739fd497323431d698b3f41f15c7b05d53b937e433b115d1bec0d221345b7ff1e9cc5709851c2e598996963253ab28e3372f44a293a3ea58360ecc6328e77c532b1333c1141368b01570cc4804c84140cb97a0141ce951f9c6bd30b55d580407dc40c498b8ac03f06b707e6cb4a6a8cbf109eae9bfffb7e45a8f334a13a94338716bfe812b8def3648fdddc20603b4f9aaf68893f1f8b613a71e1d707038b1eacf8692d6592e5d4094888e8dc4de1692767621cd620427bce6ff16059505c42277c4b972cc0af60b5d0221c400c70dafa6585eadbbf2a92dcb7f6efc499290b939c467b1cfca2254a44ff1c397873f7519b9839fd311682cfe1bc043a541ddab5f940e72e0917c4e896987e55606c1402ea54f5b46a5f14e57ca7397b1e103335033b42d84c2851458bee6d610c9af2410e13fab61fa60fc51aae65d501c55ea11f2ada2ee36936f25b9be0f4744c48af2c454d3eb18519e140fb6b254d30f39f9e35b8d54c49328a346a4051f792ad299c7c5f6d04f5599d90f07dd5a05fed4ebe9006e3421720eb4e469a4de6abaa1def174a1f58c844807bb442962904c00dca4591b37984b4ec851fe4710ef015bae10ab49408c3398968b2fa2e36a6eeb20798b8909f0ab324b5ff59cc42f66c68d4b1f683c1a05039e1358775a36954ef318171fad194169e4c69ac9138c606b8707ffb7af7a89809b66d0ed72ff5b4d0996110a48aaec702bbd5787c9c5d54bd66acece92a9c8b8cd15a48e674b01d3a7c7b410f720688c0c9eea9e69b02f40d327068e39d83eb7d5b1d21a7af264a60524fd491a9dfce4cb127465ec2fee8bf7a30ebcdd59263db85912c5c8d1e432ab0989568f27d4f47d3ce8ce3cd347f4de01295cbb8e8a6dd37e26df42a1e8b557b2de2f11a693fefdada441b1195bb4903fb277727aae88bdbd3c685301bde4d371560497b7932d2bf23a4a7bd02c398fb54c052b71ddc083cdca37234c468b155a08d3e6faa9617bc6431cd5f309d4035802de7ba406450fe2c2f7f9dfb6c80b2fff29c79428953646a074a5da4fc21ff2fbb575aa1e809c2376ffce2f2d2d86cfa7f500cfdca2a02f5a3800110905c2a91df2708d21388cb3792cddb355c8bc7b88ab1e30ee7c8dd2f30bc7249ea43fdef01c61389e6094fde3ea74f9e78aed3005ed6e285a236f0768ec632801f608f9a3210affb25b7d2ee8bbbd56b6ff1f315b0b0471bb1f11270540ab1b7e1dbc9e1a1c57140f76aa1700e00f85ce1e6a330fa8610513d4a3bb957adfcfa2bcc03e3bcc6feadf045195c3012362f2c76dc80ec36da93e01c8236f056ced47fc2fee1cfc02a4fbd054bbddc37e814dad523f24df4d103d6819a578b54a3d74d12ae261eb002ba9a813637d0a0f87441a2681f89bf1383377b1d1581234c54f50c22657459a89354c745409c1a686240e8ee5613b21530cd8464aef7911fb46ada7497c29654edccb14bc1557b92c9d776340716fd2a4660738b2d1dacc7bd60cd89d81d4e48813e49d2214a72acff43ebf57f59f50642a2b475e00bb779f2433967ee81934ba66e5116e1e55a927ffd2f6adc20a70912d3874e08e9706fb67f373cbf23a9ccd3c68c8208fe3ec5e22e44c00dfeae6710c15d67993a205347b9bf6704ab0ce5bc0cfaf13117af78f0496ace9712c88d2a88d12c07eba2cd77041edae5bc4148d08a63f56ca901437991e2f0c38a22fb98cd7578123efaf2f8d9a5b9e1e0e4e60a247393abdf5f19f2e5f9239594a450a605c6fe918c5a11091338e27270964f99c7c1d11d34d181ac3fbdf1cdc07978c82b64734b6ccf3778f875d6f1fc9d4f9fdf907d634f78e7d1a7c075a91469a4ab70b7c80a4c33b5c4dbe78011a374ac110475ac12d9deea420cd8ec750a019037aa0e33c813b69fb01c8dbdd769ea1a29f9351db8b20c1240b465b0a88ff5fede6ebd58c16b091a9e3a14f580cb93da271b83eeb6ead3a66323cfb8302865d309da6a17a969da2416c27f0d99f301e769e9490df4716a915641ab74bebf54d4e85d15219491021ba12cb21993a24a93c7bc61bbfdb06a8d7d4123f83ec84691c23962d65e610162895f59fec9671b810c167b72c147506cf449e704cc0ddde0005f11084ee64595e0c97663f114b81dff3e6778e2ee38a49289cd8ce30eecaa85e420b8e139bca9f8213b488b7d08a8668978b309bdf7ce78c48e2b2af84aa1d383a3e92305533ff55a267d796161c89c5fed7c5752a8cfb1a096660e50c4e2ba8f7de58b63cae39da2cc9623063d425a98f8efa97204cb3a3cd42b52b261ebe06be2f76e136c439fef1f9b8368fcf61a2bb2b5095abde2976f31a9e5b2e147cb7c0707f60961e85d27cb40a11e6b5940b0b0f963d2f949fb415d367f9422c1e46cb08677eb8f57a1e7c5ddbbbac20719b13964d1d9dad47f58f2b45a8fdc0f9597e46310656d258cd9c02cacb7b9eb0c21d38657d989e0363630f9b1f93947d838e67e0018e899db9784709105f587172c131624d7ddb46ad5834ef0267606f2fc4d6d0927676d3c45cd2993706332726e12bd956ec26aa5c9c0460a04ffede4570439444406dc7523e4463664341e666cdc818ca90da03a98c0e86a0f66c39b88aeac94dba67d96de0c5c074f3c0cfb2df5f319ebac09d54dddc61e44e9842045262de53601ac9afba451fddd085b20f380619103c7acbd8c7f32e5bfe2fb5ba21f81c45146338ac2c8d29d45b69aacae8019888ce7c227a299887676c7a329eb74a1b73b209de1b78adca7c7d0a325972ec404908a2c7ec08c0bb91737c0fd3ed340c19c5fa3af3ee75303464ceda11545f762d72c5207a3e2d22c29a1633aa662de31e6f95850301616a1169088443e2991beaade370c556a5c46bd47f2d6dd81c7ffd7341257cfbcee04e40048e4a88a8754b1685fe7d412980c117136a23997ee45de6a4b1e947163f02c3a141462a398ddd4eea1c4d0641cb507a33622f6127cdceaad2e40e43a8567438fd7aac5e2825112de80f08906f05462716c902ef9420267e687acf324ba9265f0600495ea0404731423f9e49fcae67007a543a7c13f2e81a9dd769e82a22b85f9db7a4344706b098f4279bfbc2590c058a3144ba79ef3e5b4fdad93cab0c4e18415735c074f871921d97c29d9eab4b75ed89b90f3ce5bd9d0ae3488d5d9261c889d0b2d41262e538f26647ac313f7d931df00e50b7115163b35c5b04b3edc6df750e655a62f7bfac23194c1e563b0a2e7a100e0dc35e4e1fd591c355b78bd7e19e35a1c57da903e0dfbb28a8b6799010c8ca27f362e6baa809415ec93d65d11ebef6e8749e321de258f02d370300a05c326af0fb8fd8690e15b062b9296f38b3af7d3e693f4a321ae00e640eb93029b651f2ba864ded425bcec92613c384436a2ee64ecb9ddcd132e0a9d66218ff334ec1a03ab8fa66555bab3867b74833364cc04b67846799e800c4a498c310d3cf7db5f3a62cc2f7faa4d622460b43012917a871c5601d9a74a31e2ac09c335e6c03793259db58d872321b4f8bc543a92dfb7e9287d361a8eb0147d073ebf00bce6960d98da768c5fa4c0774412be0b1613710c916dac3349c9469a0dfb9d6012045804d9b6e3d1c02bf45c8078c30021b1e749a99dd4cde3173de04fa6b36a7471f3b12e554450fb9201ed8a670372a2c67525f3e3a6c166f0e94535280bf00fdce22f135427e2a6ff9273c9f78f7dd792484c49a8cefe1443bb3e03b3f2c05d12700a1824a9092dc7b03678b4ee159e372af2441556eab73d68dc46bde1ebaf985c881f846c3d60dce7eab7aec3b9aebd72e1063f2a6014818c61414b07b9abba63aabe59d69cfca3036ca60288ffadfb1e54b101066889f724ee60a9558f0ebc78958f05f299ec2d073af978ec00ff2b7b8efce1a23f1d61c3613238eccd23b21be10d5b02cae011501d61599bfafd135084268b5895cfc5191bb3f12328c246a0beaa512903d79278ede3aa32dc4828ddb16689317cbe626b34bcce88e21b6526377688650741d776b35f765d5a5a86347107b1cce758b2f812901bbd5cccff6ff1c1d133132bfa3970a36f1f88301bdb7d418965685ac5a6194cff5f99daa8cca1e8975e5033e356695489cc022a6405e5330116e90ca5484a18c49fc382738f7db13a7bdfad068b4f5d3c94eab1f411d932efb41e45f6436ec67e9a153eb3ad6d0dd73b761be07338dc4922f0f870870734f28f126e0e1f03b897caefbcbe7e0bf3e0c17488a1415f0101cb59b2eb37aef1f60b96c8efa33baf3a15fe574141424c390b82b0db395d25392d116f7b8b08af7ecedb0f749636396d029468082b7895e15e0be6ce8b8af43b8de9e8874cdee334ce52546caa2b64331cda55a63224a3e5006b8e13770044ee3fb3685b4af733d36ef535d567c32743c2fb560190eb55b1a31c2f0ad4ccd9c5e8749b00599694699e3211a12f8c96d591b10372d01b53d4d6f2bc4f884ea4a97334fad28508a44b9f8b079a6ff1755e58b8788832186d9e99e70d36048efabbfa1dd6f74407eb6e325cc0c1cd17f1853bccd0e8be315cac94a08b092f40f953e43d3126b4f15b69d0ee11cd45d9b1775909c5cc4c0b9774ca32b4e1fff10d56362623a628711b9912392ce0291a804a7679071f96650286d2b6c0d2ac2fd268876a56dc6a87594705563259ec644d9984cc0aa36ada2f8ce67c53fd20efda449228674fd2acb99f2283cdd2d76f93465969621a334b453acd29b2734d380e20516a6ff0a6c0cce30ae51dc364d9db57d59a288f812a13dc11d52a3d9e263e1d14e9d6e0f6f120dd05d47e8a9f8a4e65499fb8bb4947f20badb8c3bd5335d7a32e8dcb18a4bed2bdfbf50c29d7b990afe4ceb857f8f2ac249a4a1374df309861cfdeddc6e0917c82fc2e1d2fbfc75391e4a7c760069bb64565d771868583db7ad75a227171cd62eaab9870f61bb050c60e4b33f716d986d35bc7e0bb0f78b50c5faad1c4aeb6c2430b76ce51b0f544d9c4e290b10339b215de8083af622a7ba1fde39301e7760778d1ba0a8de52661c6d3ec81d4d48afaffca72d36c7dc5b670cc36f5d263ad0cf72c3733594c1a3634255becbe01a91807147b737f53a0b2b9fbb63753e8e7bd91dde8f0c0b7e3de1885b72560f3a439c6a41d6f78c98fdb3bb04b1b469d8e9bf0ca2c86d8eeed02fd77c6696d2626da28b27f4065b5ae83c2bd76a38bbe8e5f59ac10ebecf3633b6a5d1517750785fb1bc14e9c50af6c0a3696bf9982c358e6032e30d7e7553fc4ad1d5de2fa297ec0351e5dfd8591efa6a30e1e631dc07256ff0abfdd8142a7540bae5aeddfc16b5afb2ae56d855ff082d761b86c935b9a4c7a401f949d216d4f9d68be98d1b6724e4e7cc536ba35b830e49e48c067f54a9fec319b2f1e6ed9c992db73f0ee7535c31064b69e31c4cea5c84df49ecb12e869a170880fa0bc1aac2d09be2c8a8d0c9932c00bedd74ef0251a302d3069d8acb946a6bba0557b5fe496d0a08b7f651cedee44d0afb4d9ee66060366561af051f15c40b867f3d2a7036b4772dd6ede44c859eedd482327ce511a3a3cdb1ce7630a4767ef086608e5ae9fd1f59e3a1b98ac85e048d8328b30b171a5cb0e871cbd84d9bc7aef90f744648e4f69af9d4b66d2405eb80a93c519b8bb0df64b3c0a00cdc0075ab6d853b716c5398384bc18346dc6c953d847c6bf3e9bc964bd88fe93d85956bd606517b86b7b329d94b4119503435297588e3fb85bcd9d32dcf4c9424de1160207cbe2b702ccfd562f63303850ab4b3db82bc58130e74434dcd9be2cc03fefbf3ad2d8be60e4d12920f51960b0a89bd6a2ae84d05d518c5e3b7b849ed2dafeb1bbc1bd6d2dc4630ad91bf4a5de86abe065df05259f84392744c32a3706104266fe3769cb3834567374ea7f2a1eae69b7bd0191da6f9dcb6a3d7a5c484170895a08e0ecf9aae702d9de7e1b5be608cd13814035747830c399da985a4891d9352442adaea85a18f9169492a188fbacf4412ebd42983ed15a29f5faf4a064069dc01465bd4f280c4cb3b405c69f9b06ed5d9d9724834693a0edc5b0ca21eeb9159c0fd62df5f059a0ad1a7479e3fafe7e0e7869c433bfd86a1def995424e0ad2ed49d26e2f2d708ce188b37b5e45a061a036916427dbe049f76567a6f8311ade3a24ac22c8cd383bd42063bdd6294cdcb778e1ebd04a76eacbddffc055d99ea7494d9d5f627ec80139ca6e5711fcc6b6e058c75ff0543ddf1b61e67b7605c9380b863f9503617794e62d3113adbb9891ee62677daad8660599ec3515d56311bde359466539800d8b996e973a3016457ac853c321a15b4a6495181c0c3e33d4e821f4e4669895032105e1be850f6421dcb4e1b7ca7252766ab065f3826bf8125f8c33cf4bb98d356d676d8c9175d511104bf530c9694f66884abab8837dc9bf0227c6947228e5382f952949ae740b141729db80e3c4dd295116b4fc3846eba8cb175ed9bb7dd4d3d9b9774ef2506b7c82606355aeb10858064f9c4a14c77521dad4ed859fc6de3f1db39b6bd782abdf1256712409ce725ba100391be253201524b2bd356ad612fa7f2de849cda61a3f1803651532d6d94622e799c75cab6d4ee6d35460b6fe7a3fca8ca093c251920654d56affac8d5accfa088a51b78dc86787c3746dffd5a534696dbf9d8bf54301e96f327abefb64d8e89bd76fedaa79336dbcda32a92cb7f61223f24aa4100d7c6f691ac0413c3918593727853a8ee1889623c8b2a870ec7bb23b96acee13c09759eee5aafce08301b3c3bedd39acba4c9adf9694f28032645f4fcdc77c18a1453fa59434d6ac3e324621f75e887800754c05278c4ddf006d1b016aa41b190d88d27bc81e89826ac27915a3fab1d8150de480a47ce78abda03ce32eeed41df3f6702d38a9c397f7d505a59e080a69fbb64d6e01c7f329f884da990092115b6a0782c7a404df7f714b847e047ff80f3f697e5c461bd8f0703b6d89c6b36e7a67a5155bb089656f0837c0d061b62e20746560260dfe5893ea69100f98721cd7378cc1d29630e241c08fa71435ebd9fe18776f0d0936d5e428ef9b2cc18da55260b83f9080df550e37b9cb2db7d34c6e6ea60bc33e5874074e208b02fac50ad1a138eccd36d1d604bc53e7633c370165d7bea099fcbe31a724ca518e1c89083801e6d8bbd36166a2d69c85726030eb898bd7231fb8e1b231f34b32f427cc4419dd8d2cc41da2fa827601ff34a17927cb25fb3d9cb1433c0c7a6958da843d74272619c91a7369854512502b453c146faa779c6212175cb6e45f196cdfb224e718addc0e2f5f2f9bba62eeb44985b6048114c7e2a8cb5c36f39e34cfbb96bc2fee1cb176fc9d3f12bee04e5351098b256aa217129206154cb73274754ad442a0fb98c497f6986cb0fdbd7822289acb2dc54393158f3c718e866e7d4f59b33ebd6073f1b94dd8ee5413dbdf0353ac35898a66e0deda877474654d9fc7a03291199395f38b84119ebe58ae0ec467b5a3485d34ba54e71a597b2f7f793c5a9df04f36d53ee5fa3c88c912aaa668f383b18dd04ad88e17892831de2e5011bcc4780e320273be92be1231ab53108368e24818671f618e905ac5e6a8af2b5dcd1a7b4d0f9f3c07a7fe6566c61deea03bf970ed385584fae037bf764dfc1cb728596e08aea92c4c4424679f2fe6102ad90f9d947710939c79eb0fb022d5da98018bc6419c5c3477374050b1fe0d07013d3e9cc584ad52712a21f989dcddf42bcf36b2d380cdfbda1acb56f41682391e9ac9e425b430896ea37f62285f0ca5f3785078dd62c37ba082e2c0d9c65a6950552e24f3a22164c4b0691ace5779c9c010faeee44989ff4c240b4c592b3e43742988708c8be22c5acd6db6f17baf8d78fa51053ef02763b6263949addfd9d5c98cd34c044dab81bd6a0216a93edd9819be6e9b23903d657e9675f2af8fb06cd7919c7eae81da7699b93c0e8d061610f5e99196f0b2e0eb0884e337567150ccf2627e5c1b9a11007451c0eea7f181b1de540cb8b0a4f83edc73244131433daf323bcd13e9016571e88ae5691a41b0eb2d9a85827730a61f6bf5b82a9b076a7976224b8492a46c2f15775597c80cf683e868bc444ea2764c8a04f49747be18e1cc0a59a61dcafa9684ae4eba675a7cd05a30b0e082b948020a95c5dca1b8d5bae0c4200307e02868b8a18c78715aed4b9f9f406c7e76de396e00f495d72d7a07cd5215d5f049c63e2c4762f462b62b3902e1319ae1911c3af54591692203b205e1440389a5870360d89513bd2f30e327db37e39724dc58b272ce54a46a25b9416f2756b512a8a8f4bfc88d18bb8910716cb6ad9f31522e73a0e53079760f9bd9b6503baf2f5abe365811c52d2b16646bd445f9f1200c8c84cfa6e532206bcf49c6b9508274e591dfb21684bb938c37b108e75251c7e3643e17b14e363687cc79e071bead8237b6823f29ab9e790770d113e65923340d23e3350ae8566879fe13198e7ccec8df44cd7720520eff7c80288770050e626b62b7beb35a1887ed9342ac91779868e969a2c854623c49bdfed5445472eb5dcafedee0443448cfd4fc06f92b4707cefeea89c3236f0fb34d7e37f0fa9322ee69ecfaf3f2538cc7e9788da400f34b0ae2a49dfd5aac92500565e2047835741d1689b2e455a80dec28da7b392070b4d97ac3627bda37fd8fe9296c391471e4d12b969e4920152db5ab358dd962b990474ee2d07b320ec2fc1c44648ba11fd876d7d211eeee361a679306c0a05ea45a7ae5710380b6b1a03a3c8c4786215cf5e6986c13dfbd16b0f7947a101ac0d420e1434e882b204e03c9d3081e296da60cbeec90a3522db9adc610ff8969a6b8c6381c3d4543bfd88a2f69d6008862ef0a16fcdfdacde40606d0a360bcf0a830a9535c2aa1aa9ac116a6d8d505d65aead11eaaab674bd52e58ab946868e71c1ab8bb59a597393d875f12c9b97851999496f4c15288a761c5fde18a8836344f80f0299574c1b4fcc18ffabac4ee35a3d31653c314afc49c72166f54f9142686a76012d8400caa2f5eac2ed1b79476d824634a0ffea929ae1bc000b33b6e004c142081636aea8e18a17aaac6e1c31ae66715e219b978a0ba699947b4a9295374bbb66a93b691b93b88a0fec8c3685d014194ca1f3df93628b14384f0adc5f5dd73cf5c5b30ca04126c792286cf811459020393c2d382049cec0e2468edf83c100f76070e11e0ce63d18c47b3048b907c309f76060dd8381837b30dcb8b72505f7b678e0de1632f7b658e0de961eee6dd1f27f031d1af8e8400b02ee69d9e269d974879cd32e6e4ebb8071da65cc69172a4ebb2871dae5885359cf69972ea75d6438ed5275da25e7e9f8c80efc23b3f84736f18f64c047d6f08fd4f28fdcffc8da3f12ea1f99f48f54f28f6cfd2383fc237790cfd163c78e0cdafccb608c7f197cf12f8331a76f7efe6550458fcf6be29f37817f9e977fde0eff3c037cde0bff3cdd3f4f85cf9372fa8606aa23e6548789531d089cea0871aa6380539daa531d2aa73aaf539d104e75749cda50c1a98d31a736c09cda98c0a98d1e4e6d7039b5d1c2a90d7d6a633cb581c2a90d28a7368a4e6d0c9dda18726ae3c769ce9bd39c139ce6a439cdc1e234e702a739459ce6ecf0c1073e40be9e9e2c63de938589f76481c07bb208f19e2c2fbc274b95f76489f29e2c48efc9c27a4f161eef798104ef79e18af7bc80c47b5e90e13d2f6479cf0bfa3d2fd4def302d37b5e107acf0b1bbce7851bef71418df7b8c0860aa938826010667c4f18da7bc2c4de13e6c97bc230794f98a0f78421f29e3042de13866ec0c29a7b2c8cb9c7c212a73700717ac30da737b0707a03eef406dae90d51a737309dde70747ac3929e1f3d5444bc876a87f75021e03d5402780fd57e0fd5cd9b6ae2ded4977b5345fc03d2c13f2038fefd38e3df0f11fcfbe1817f3fb4f8f7038a7f3f2af0ef8711ff7ee0f07f3f806c16ee6ddbbd0dbbb79ddcdbadff1904f97830fde351c23f1ef51f8f20ff78e0f8bfa3c17703c73f1e34fef17c3c1df8c7c3c53f1e32ff79fce0797382d337659cbe01017dc3c5e91b32a76faa387d7381d33710387dc380d3375e4edfe870fa8686ff3f3ea92affa49afe4925fd9352f24fcae79f1408ffa47afc93d2f92763816c8dec03ff641cf827a3e29fcc02ff640ff827f3f24f86807f322cff64b97f322bff644eff6449378050376e4edd983975738153373b9cbad972ea2600a76e68a76ea49cba513a754374ea66c8a99b9dd336679cb6f9c0699b31a76da0386d2381d336429cb639c0699b2ca76d6ea76da89cb68172da86e8b4cdd0691b22a76d32386d83c1291b179cb221e3948d17a76cac386593815336113865b300103e1012a4c70e1c6c8edc63b3bac726c83d363ceeb1c1b9674609ee9991e69e1954dc3343897b661c71cf8c02fcdff1c3fbe1e11fee611bee6118ee612cf730790fd7ee612af730d43d6c740f07ddc344eee10dee611ff7706feee150700f57c67f1c3a7afca06c70a76cec291ba953364da76c904ed99470caa6c8299b11c63f97bb77c5b8773970ef4a71ef2a71ef227183b87769b877a9eedd7befcaeedda37b17c9bd2bc27f1e94cb16a75c3070ca6502a75c1ac06587532e0638e592e5944b3ee5624fb9449d72593ae55274ca05c92997d62917114eb9f478c00303fa44ecf409274f0c9d3eb13a7d42c8e9133d4e9d58833a81825327baf8cf63c7f7e4867f4f62f8f784eadf93f1df13a97f4f96fe3d51f2ef4908ff9ef4f8f7e41a7c6570705a06ce2919233825e30b32c29c92b1c42919469c9271c3291953a7644c392563e9948c124ec900e1940c1ca76b5a70ba66cde91a34a76b3470ba868ad3354c9cae81c0e99a1b4ed7ec7cf4f000c80d0e680c2c388d0104a73174711ac314a7316020c84745ca3d2a4df7a8bcee5109ba47c5837b5478dca372e3de1435ee4d49c1bd2923b837058c7b53ba9822e6de142aee4db1c0bd2945dc9bb2c3ff1c1e0f8f1d1a129d8643a72191d310c869f8d399094e67649ccebc389d9d399d39713a3be274e6c3e9ec00a7b3164e67f674f6743a3b3a9d29399dfd9cce38389de53855e105a72ab83955418c5315b8385561cca90a52e4e8e1018407511aff884af08f088c7f4463fe1159f18fc8897f444afc237ac03fa223fe112de01f110eff8868f847b4e51fd1ee1f11f98fe8f68fe8ca3fa2d83fa227ff884af84704f48f88847f4444fe11f9f847f47f4d4ef0af899a7f4d3af0af49997f4dc2fc6bc2c4bf264900b981c18d1f9e0f1c54b6742a333a952539957d702ae3d1600d12f7d6f8706f8d0cf7d660b9b7a6bcb7c6766fcd94ff3d74782880700f057a0f051ff750b8714f4a1aff73e088c2e45e9410ee45d1712f8ace3d2816dc832ac13da8306ea809c13d355cdc5333e69e1a2beea971e29e1a0bdc5313817b6a8eb8a706887b6a74b8a7c600f7d460b9a746df537371f0f8a04ae44e95b872aac4d3a91244a74a203955e2e754890c4e95b071fae58cd32f659c7ee1e2f44b16a75fa838fd6281d32f0f38fd32c4e9171f4ebfd870fa2586d32f594ebf94a75f6aa75fa89c7e713afd72c2e91724a75f5aa75f40f8cfa347c78d2f090eff9218e05f122cff9294ff92dcfe2551e15f12a97f4996fe2539e15f1225ff9214f99724c8bf2418fc4bf27f485ef00fc919ff90b4f987448c7f48bcf887a48c0f1d3d6e7c8174ef0b13ee7d0174ef0b11ee7db1c1bd2f80dcfb22c7bd2f72705028644ea12c710ac5cb299419fed32065cedc2b23c5bd3215b857c6887b656eb857e6bc57a6cabd324d403c0e9812708fc900f798c87b4cb17b4c483cef8022219e2251e51489a853248a4e9140728ac4ea140921d40bdaa91750a75e189d7ac13af522c8a917189ca679739a0605a769c6384dd381d334634ed340719ae602a769bc9ca6c1e1344d0ca76976a76956384d23e5348dd3699aa3d33443a769889ca6d1e034cd8e53342f384563c6291a304ed1803945a3c4299a1d4ed16c3945c3c2299af2148ded14cd945334b05334ae5334ac5334209ca2f94ed1f09c76d182d32eca38ed028c9e0d7af0c880070dc201060702a48726ded34311efe98186f7f4b0df638603ef3103e63d669c788f1925de63c688f79801e23d666c788f9918de6306cb7bccecf798b1bdc7cc95f798797a8f99d77bcc08f1c8e1e4857b4ece7b4eacdc73b274cf89917b4e82dc7382c1bda235ee15b9b95724c6bda233f78aa8b857a4c4bd2207dc2bdae15e11977b4555f78a7651aee876afa876afc8cabd22a87b4500c84177e0f0a19383c8ac872b081213dc8cc10d4d6561020ca840557d79fac1858320ff0f04061d61fcbf11056c80c73d220eee11e9b8d7448d7b4ddcdc6b12827b4dccdc6b32c5bd2615b8d784013dbe238ba7f68ef822e8887704161d2e34d840430d08a0a1062e3570a961861ab8c87080196890610603c8c0458602c8c06506196280610b010620002d59b464d192258b962c5ab20c41c47fcbdda6baa427841505785ed290f7051d17bc58cf4beb7fe865c76b10260883b86289ff671048ec108641b410c4f8b7aaebd7c152420b2b1d16aae4f8e17f796f013f6813dc8d48d5fe3abb5fa7ead7a162ad409cbee2986b574a28b4a48e5043d3b4dbea7459b4424b621e10278040ec00498ca97e30f3c38e555b559a884d2a9be78399833e44c0072e58e70312f601841ed0705533db80ae597a3d30c0f680eba1c9ec41484e120f1de0210a1e2cf03fe75d5b7a1c6d8d879c2d8ec3b6dadba169071cb58b992e3898b8bdafe9758122aa15146bb6daba0401ba66a9031895025d7420428704e850e52aaad5a5c3930e4b6aabea002487315ad549cbcbc106b0958393cb85430e1e0ed7255e9b4c490163407d496c425559273064ad5cae5f3abd52b2aac6ab7abfe58acf159e6acdbb84789f40618a3fe7eed828ad8ecaca09bf0e921d0caaa451858c2a5e54c1429bb9b6742ec95a455ac5ca4f95c9ea8213570bd5158695c449529862b024a524a42a07c1a0aaf1ce53f696a57ded40a960d09a77891ba6607150bc34a8294b53904cd159410a65d014c8b02a89eb08a335af2b859d42134de1033b9675891b4a1d46018b4cc446b52b451f494143ef6e4e8a987f7773456a28325d28e1cd593d2373b8ef8dc434bccb9babb6ac7dae26f1edd2448c33f5d530bdbb50326c77a18822d32bc368ac033b9b20d0cedcfad6485b7772fc3b3b37fe1d9e7f67e7179bfb3b3a97465113a5cc8f9070da2e45d15170a75188fe5328332eedeadd6285ac55b8da1955d0688a5252929178f5befa383d502850228522048a8e9f02a0c87b5891056502a3eefca482acd92af7c485cb5574b535aada56974bd684a84965e54cc1f4e3a04866da92174b4b9c20e57f2d22aad575239700a3286709006f9977d6e4f409185b13d50cab2efa0402d5f524c9130e9ee0f8af73aa1402252c4ec8bb56d7717ea52627484a43f4d998c417d7d200d16002a34930fc55ef6e2edcd1603819d8b1d10516a132d4550692917f4850123d0a013d1a8facfc4f50570aff4ece0eceab6ae7b4dd46f48e36cbd5700ea733ed9ae4994991ccb4a0a1a12354364a64aaba2279c5b5ad9856482b362b342b56ac10b1d2aae2c2710cc101f2e8a04ea0f835256a821265306bf2adef94dedd1975e108e1d4842d6ea38723316c18a12313e39fcd4ce861c28e7f08216e630174c90a269ec26679c5ddcdd18e234509553325657e902ae9a2a4004a9e58ab3ada73aab256604df22509016892f2206bc55add48b2c2c9419148b161a748707f5113194e11392cfcc7d109c169678c76ea1c3249489d1e39811e61d12341fe0fa93114c6ababb6aaab822d9e9c212270046b93c6d1f766cbd25e9ceb38b4ffe469501a3408061ab4020d4a811a496304cc5f5d366ee4f0e0f0f0ec00c9b1a183c3c6ce07e48a7aef0a1ef7c2a8712f8c9a7b61cedc0b53c5bd305fee8501e25e9803dc0b33c3bd3058ee8509c0bd30f75e182bf7c2c8ee8579dd0bc3e45e989f7b61e8bd303dee85c9b967051af7ac50c17f10e80e0e203c56e0dc0383827b60d88051730f0c1a301bb807a68a7b6096b8078601f7c0f0700f0c0d3b9480e0032dffdfe291f3e3c7c17990137844e0c6ec8c9d333d44415a7ea431c509529c5049d141981db4ecd860866a248a2c126881841b1d681981880952a0e1818667c7c7104e2ce9800a172c41916809e40aa8257428e025051228580861a1de9382e75e1429b8174518f7a248732f8a32f7a200732f8a0bdc8bc201f7a210e25e143ffcf7e14531742f8a9e7b51e0dc83c204f7a010c13d28bcb80705997b5060e01e1413b8078510f7a0f0e13fcf0f0df447086b0cca62c0eee658fbd5455938bef2b242e283c6abcb078c8f0daf2e1f117e12a4380929cc4630c1081538961190e808f4af2e11c0f88c8a90c45f5d54842dc209d54545d831dbf706a6ba42c0525d48d515c28eea22b2c55f5d3ea7448a7875edea42aa2e4a8456171d52c638dada90248660f9ab4b85d321f4ca6985c0ff8a04c2163f0561a4200455171a7f7549f15717fd6086bfba3e905517fde0c70c00a71e3cf157970750a742c2f82f864075193915b25f5d54c89299109deaea404c7569da41f89f76d0aa2eca81149a72304375510e44a01b98413758e2afae1c3de80650348819bfcea42befb334aae9a441d305175b706003674eda158d6830010d8ca01a78a966cafc3aab32394c3483235f699109d479eb125f7ba9c2b0d49db4baefad956315bcdabc782cc330ac4c58452a13d3e95ea5d1fed4227555896a89f76c64c22af15ed5465b9b11ed3b1a31525b5b9f661886156cb14abc6b262bd06e34ed8875a70914563297ba5cb33a0c439d899478d7d19edbc45344eadda7b661c55120608c59acf0eb18f1bf76a7aade5d285adf5a55d24622b19378c79ca1a444729f4f22b6d4470c4f02c7538775968d106442c6a6256f4d575b71b533564121579050b565a1abcd4c555b24b6b820a15d83842a78036995aa6a1b8e53596b1c92b7cc61252dded604ca1b488b7797b99a78631163d3da6ad6e368cd3b95443b75cbeaf2cce6930a42a9b6bacf6c6fcdc4154c527ac5762b0c6b51996f262d8f1a6b4b45abba8e3913b93a7bc3394dc4c467992da87d42a030acda47efd0691c6db84ff19565e28ded0ccb30f189eed4e1287da7ecd2ce307d33d2ce30d21e6927f2964fe6937973350c6567d8ceb09d61398da3b2d18e7c5559a73167a82cd3463447643acdf9f19fb5a23858dc31ef71a4385bee72c9284e93ef48fbbfe9f465b85cd9bc54f678da3c03afcb1573b9644584f4427e6d6672ccb97a6fd2fc419588a8b24858bd89c0ff9c3314ed8ced1b2b7386ddf148df314791fa5e53698d24feb20a2bd6d0b2c6d2be3a6b5aa83570fc6aa4a17737a7c605d480801a3ea8a100356250a385ff699ce064b6461b43c16252a09456376315c99ab85c5147f5a712d5b0823730a982d5a9b6405b5adee44e87b746e659987b8a12efed6669376a6bdc04def06e8d9bc2baed98cb96d6b88650c1dabeb52534d40a12aa66ae4122aee49523b535545b4255c2aa972019028576635550d0d090c6539976cd53bcb51a2251526f96b6cf92b5daf7e672e99b350af51d4b9d256d4ddf2c0d48e7c29025548b54591dc89afdd42bab4a4454af08d5223557256ce98b4d735f5dbeb76a37998f6a0815dc8d996aefc8dc22b3de29d1429db6b62aa9865041f26669e6bd65dde725efb665d70c08ebae9e51655b4bbcb8927ae38bdb5b8bb89226264f267d666cdaa9abab1eb1ddfa6669374babb99acd9178ac30128b997c55a84d5e9d88b31426f296519b344fa328f17a273041f2561bae9a344f23f09ab6d450a016c9290c05be6af5a9a48dd5f6dd55bb336c6798ceb6ab81aac8042526dac0228b2cfe0fa958b054f156a2a28a054b65ad3406ef356d5e0982ec461278410233ff7d7c7c7c2a14332b95522e17097e1c149a9ae53d0b9aaa51b319a8c77134710de7125b4cab3993565b275b1671f509c7d11ed970dd91f96a7d8a585f73679d2aa87d70359b544171cc7ab3a0aa5e5570df5c4d9c92aa64921e470b25922493a8f114ae4647e215b185122fd3be37f134027577a465b334cf5cab601856709f7967a170a6da1976a7b0269976166a97a79923add1be537686e52cbbdb36e5dcb4a44d7056b46448e86ce2728941458c251f42e2aa6d8da4caa20e993143427890dbee85c0865f9ba3ade5231e50c30d6198400868b4170b31bf8e165884a1a28a29c24c91c5af8345155468a00a30585c41c515617e1d2bc05441c575a6b828be44f19a27d4aeca0341e88160c91225214edba5b0b6940895bbbdaaa2ad377267c72b025d1dde5055d689b5027336d4274e56c3b10459bb9b5bd596a8cbaa6c96b6f1c6324cbc23cd92523bcf66b39978c59b33ad0e0ad585c53c2f745e24a57103b524492c06625bceea6ea9c7da15eb6e13515a92446b22353b9675499258ac8a775bd0878604de5c9eaa91e7d2aaba340922c6853adbc89dc96ac395b5aa578f56a982e1d091330ccf7b9ab21a86ba66b26e32ac21abea8a2453b8356edf11a8ea5bc3e5ab892d5b56ddd156d53a8d24b665a07de69aabb2111089a564281b892dadb62a588661acb2ecb6a5d5ad6a05f52dab1e2d0b4462aaa494f81af111129961bb96654c59a6c57b61576761b55bc6784600c59278035099e0ac364f7c04191b0820003224194b860a9928649a90719131a1cc01b5d49d62a8c7aab16e0c5dae300cab0d8bb7b6ce5b2373cdda9cadad6bda343e61a4142c238de3a9245a23bbb4336c0747c7e9fff9245e1d96914f24be61f329db4826316abc4b22f912af79c57c94245e3064adb05d61b4d7244f5add1627abe46dba9db4db4993ba36fbf3b333f9f3533352ad21541d366f5975a7ae68af0edb3c8657ee48ab124258b5cd59a70a56d28a599378b5dbd80c733937559095abd91dc2ea4a1d475ba55edcd61657cfbcdba6add16ead3c73b5dc049e345bcd7b25dc55492e575825d716682f0dbc15dced6eb565506cd5ca17aed5965f2436b1b97753f6e22a9e4a12730deb8d5443204f9d2ed7b60f0a15bc269548e28a59b06315efbee315b1cdd2ae59992a78a482151caa2028545de3986b96555b22ce3f3f354ce69dc9acfbf9a9f68ad9ea976dbc31517ceda060249396ba495a244f4c5ea45b3333c9e47494425286e91a2e63514a5177c43814c42bbb48623eba623ec2edf22269fb641c2dd555ca59b623ad5386899bc4f585348e2f00ecc6f1457561baf18ca2ba305a02b104577e701c5fa0cd6c8a92aa34bbad79ab64266575977154b7dcedbd2381742e6dad824735a604c5542f4e06b5332cc3601aa7ed52ce4f50b891fa25dead71d3ce30bbadf9242ac376aed90cf6c4148b4a923273b9608d086015efad9d51e603221003d4393f8800f77f8893172a82201c231a3046191fc7178e123a4814f008fc973acd028731c48f51f44b6624fdcae285b2bb50442c9e313524d8dd9c9d65f1cce2a9c1d8be31bbc91b2bb18c498fe30b4a773753186a8431268ca95f368ef64809d4d7665e28701c6d4d9758465e0ddeb04d97964a57bd54c1506462aae02b6a67589575b2db22256d123b9178675886218919b7af5369a962ba497737d3d6babb8b9a680d54e29cd6b98fe370f1672e40d8c2015bf400ea6c1d479cd3e7bde329e27ba7844021a0da9d225306253300f22c2d959e653102aa012d1a40f28ff019f10b801271c62911233825c203a7449c3925a28a532228704a4411a744e8704a8497179c7a19c1a9170f9c7a3973ea458a532f1638f572c4a9171e4ebde470ea0501a75e6238f5e2c2a997f3d44b79ea0577eae5caa917d9a91728a75e904ebd30f90f44074f0e5077457933edac469eb62b9854d7589e5b5f599933a9c449a8dab211764252415bae4d494ed59ee2d192d6dacc4a1743d99e48ab6fd608691ced110ab68ce923aded68a4afbe6286d99eb4d666568ad2175765d9b6c1f4986df7ee2c94dee4abb44e1ac9f6949574ae969bb4b6e3911eb23dddab445ed3f65495a964a575926272122aad93eda9c9cc4a5a1cf392edc9f66466a56c239974a7d64e4a844aeba45128cd5b9eb12be6a36b4289a494ed49d3ce98de5d28bbeac2b4d646312d32ed76d58599599be79169ef787477968224326d3c9631d1b4226977ecee3ce572ed2c6501460c408aa49fcc58e38ec42b6544e22a0b8624b64edae2aa99b7add526d376e92a1d6d9a1338dca7b60470ea048e2a2bd648316fb15ea726b268228a2628d0c4114dcc605e1f9fdad2425343424c10e03f4895c7f12a854a61d5a32ed4ae21212726a49820a24df03796a0b2440a4bb896008b806aeda187204c701e1b8947aabc13ed8dd264c637dddd4ce479bb46f74cbaa2758a8a32cd7c245e6dc10c0592d88ed7bc66be35ad6d1671359beb1ded6869a7ae761c6f4d639dae2c4d628b3b226f4edbbdaafa9af988ea9219f6626aca48597623314e24a5ce2771cc31d1bc534f1946dab1cc9919855d9ea629e22c25e3bb779ec25064c6376d82498c439c4cc08c09a019022ae7386e2660af4d232f1d96e1e4208128feebd90daf70cdca24a81631112f4e9fa5049afcd7340269d82b424123e0e3ff295657d3542e8d88f7a8c4b212cba82e8c3e803ee00a7d000fa671b4476089b72eb10cd425968125de37df405ccd82f79e77c4b6aa73cb485bdced5541bbad88f31969212be3a86a6b158a4ebac4b2aabb261479cba771c43ba6b433acc4b21c2154882cfeeb1ca1c508141821c6f7358204238218c1a388358ad8e26015af5941d9beb19c225a84907f2700ff71ec9407c7f1dc156088247e15fee3532176fc273a1d2285ffd9bc2cec46bd31adda304e97789778ef9a12f00850ed8ab90674475bd340b5d99873b993ff9c0c907f958867a269cf5bd2f904080b573282100e109c2146e4a911edd4a8e9d4c8756a544f8dbe53a39cd3d71aa72f159cbeda9cbec2387d6971fac2c0e9cb01a72f1e4e5f349cbeb29cbe56387d459dbe9c9cbe844e5fabd35708a7af0e4e5fdee92be7f484344e4f40c1e9096dfe7390818701cf0f647ea0c03f8e670e0f0e1a2dec00f9b1e343a7849d1e383b74feeb4e7df0a28de4acf1e1045b234f5b585d60f430e63aab1d1e1cd06941e74938f1e141e9bf78634eb24501e989292a096a96f4e415f5248bcd644d522fa52424972bbcb61dad567d33edb648e2ed92e4ff06a75d8430a94e391a25827f67878eb36ad501091d82d06187a87bb350494f5020697535d42e973ef36ee3db1d75f7ace23d5be25963d9327825b43d91b7a9ca3a8555ea8e365afdba379b7149e21b6b55b7b6328d91a2c43bd2461c25c3eecd42655802cc68f3ac619a001bfe5bd1dea55898002b234e5f5329012d175198805359d990053865c6f6d5fbc6c09d477d7536f7aaa0366f14ed8c1dd11aa030ed58abbaca3a81bade485c5bb65c771b57c12aa8abb24e15c4e62631996db4538b35acad519849d65813c91ba66d53e716c6af0a6e7daea0cbe0c69508edd444465b366f79e6a0458c0ae569b7efc6dbbca5999568e79dc24f60e2bd4a3a0bdb19964d33e98c42959beeb64862ce4f48aa4c42b923cd4a651bc9248e172b894ce6684acd00fb2fcea0430a899dc03034a92e8ca9da9ef6f944959bf66b67983593c42b5e16704c4a6cdf1814b3a63192383e89175b286b26511898bed8a20126b63460cb10386c11c096dd96710b0a5b983e9b55599d1449bbb91d69936c18eeb205449a5929672fd5cd42852e97ccbcb68b044e91676ed9706ded68f566049ad976ad99645e286d4d70d7aecd469571ba86bb3c4d9a9dcd6e24defa822128de300c71bbbce20ca816d510bc205305c3b0b6c2aa2b6adb35a15c616d9759a9823b90f553659dc255ad0a7fccacb4c9d3485871fa46e2b0da70156f6d553568af842e5758a546ee7425b1b6b47de6aaad2d75056d20ee86cd1c5ea94c663712df5995b0bab413107982acad7567cdc4b5ba33ad3577552dbca6356f76920531f99049d556927647134b7cb350d9c816c9b36a922ac35615dcfa66a1c2da295e09ab68f1de2c14697555b461080289b695455b3e6dfa96a3ca3aef6c0b2b12a1a9bb7d486d714c2253cd8d272d676b5205c32bd64c6a2dc9a092906653a29e6431a6a50a54ad995425ac2466dd29bcaf8455c02ba136335315f382d6bc383363aa8c6b59f3d64be62ada3655d0bc3a33db5caeb0ded2eaaac6ac15c85a997763972b1c4bddbe3ab76415b3b6dedddc2c34f1d5d6bc12da9dcf286195aa7d80c84c9656b7bbbbb185715ea1d4ac4bb32469a956b45dade66af94a1856a93bdafe91c5a49c7e4e1c91ca5a65b2b6c2a070df319b448854f18ea3bde4d6d746b5c2edb4bdf59a3ebbda95b21b69b896c9f28a986a1c31eec81a694dda327623f1ae4989e4cbf69465d6ccb06b66272d5e135b9c56c105154a12ebaa4290c6fa0a1ae59532579ab8b2c41fe701b2fa797c48f8794610e1e70981c8cf33a4fe3c207cf0f37820e4e7e980839f6783203f8f0619fc3c1ffd79bc9e9f07c88f9fc7478f9f87c78e9f4707063f4f0e1e1c396d756fdee4b4dd396d7524be5dda9520212e64b23e774cef764e5bd9983354cddaf0aca69be1c7ff217bc990d0696b1a3bddab24c3fd3f196efc8be105ff6238c1bf18caf8bf636b3cc26ed6e8ea6c8c64c253314cfdf74ee1260d8311ffd091b326a5a8688992264347a4766bc9d964eb7bc3221225e71573ade8db8281717c298d390a1f09490992828bc96a77eae5d540ba2cce40002e3e023c71f1a4d55ae67ae62909f808707fb3a3adca4e2c33150650817f080c0285a6928c9ea264b110e7380cc0d1267869d9dc3a083c0244e2d1bcba9d35d4f80620844b3b1b0291804140b73ccea672a13e2dd0ce0bfe1d17fc3b2d406387cc7ffd4f00271c9b00048747065a76987a7d5a5ab92f8b142c58c1193b59767654f0efa4000537d6f85e787d2efcf0b970001768a83b5aad0cb8e1561e002e391ca1c40fc57f21be1654c044a8023119d2f726de14be16b0fc63a18c8f05313c394384a2fe0b090121f90754e41fd0907f40f41f508e160a747c4536f0afc814ff8a50e05f1122fe15c9e15f912dff8aec7f456cff8aa4f0af88d1bf22ae7f4580fe1521f2af88907f457c14c1f1af888d7f3f6bfcfb7941063c7e56f0ef8704ff7e40f0efc7ccbf9f2cfefd58f1efa702ff7e82f8f763c3bf1f2dff7ec87f3f54fefd2cfdfb71fd0cfdfba9ff7e32f8f783c1bf1f9e7f3fffc742019a7f2c0efc6395f9c79ae21f2b897f2c2fff580af8c792e11f4b003b783c9d1fac0ffeb17cfc63f1fc5b9df16f45827fab31feadc8fc5b81f9b77ae2dfea01ff560bf8b7c2e1df0acbbf55eddf2af66f75f46fe5e4dfca847fab211f4030d840874a082a1b3ee456d6aa227d5329907926de286d8a6638cb3692a9b51bafc647152473254f13ac56675e1978454ce24c8ea3d5e5bdb99906592b91cc4635bc497bc3b7ba3579f511b8ab699f4b9e55fb9455b7b634aebd44d66ceb4b9b8d96cca55405595baf5c24936e67bb2d925229655ed134dafa7412c96cb4b35054b9294bc932299d993f5ffdd23da12be207af54a99fae04f3349d8e6ee46ba7d39d48fb6aaa580e0b2845df1ab6475419c6a46d53ce515a8fd649ef2e14b1eac286ee7846ed2e945d756149bbeac29cf4c54c3b8f319cb64b4655d6e98e25366599463269d19a49dadca4947849d28e7a3ca374dee7ebd6481c1b3a2295654eba2c92d60923555d1dd3178abc4d49e3f83a91866ca614a8524a9b9724cf286dcda45c4daa299674b1bee4ddb6c92957cb636c146fd585edaa0b336d9316b191933ed24866d6175f6d71505bcbb49995cc2b5e53bc349b2d8f391f814062c65609046b6bbca4999b40f1e26ae46947cb5a55f26e5bae54792909bc53e3de98265e91b4a4ad35ef7163d64a34732dd46536a1c20a54cd5c9984a14541b6b56d0a2b5075edabc322d5de7837e65deecc9a79411eb488615e6b719854411a79caaecdeadbba361b935550aa829ab5326f594a5d32e77d330ca7ed92d3ad51e5261bc944667c7396565d514f515149f588e9c95353ac84ff1dfc8b098942bb36c1a816fcd7f91775c61735c60762f1b76e2417024429c0ff0efc8b1202f10680498e1c39726020e2cae4de1893aa7babaecb55b4444926d5e48b124294544c8ac8b42492b8a66f94181525b5afce4d5b9f48e2a5ca2299f474c53548ee93561b72c97c7353d65691aaeb9278acbabc7736aa60de365ccd53eb443c75e61d53056319a9565bcbb392b7ccae9cc66625a97235cfbc13efacb6b27959c03f3f439ea292a854d86b4956a39ed424a32a8b49395590bc65ae15b4d76c8561b5da14b10eabbe365b36aa6138a58661585da8b5a8c86e8b545b2253abd5448771b1d23a11d56be65a6b0bb5d63be252976b990cc3b06e4c9e4b5bfe43f9b764c20ffaf8549788672d6dbbe6f7c402ffab91bd4837128be42dab92f0263326a5a82e4cc434522aeff3256223f153927de7528bd8a8ca3a8134eb441e813a57cb4d55d60914afce62d2d640ad3bc58cc9acc112cbccbbb314f2d6481cbb356b3ed117ef8b6b2d5b5b6258a9ee6e6bcc426232711eed0adb969871cbcc3620d3def1a882ac4bdb59a7552d02aa661150ada058621c6eb156e4152bc85a89a46de920a01c69cdb05e11a91e55703c5f150c5a899856b5cf995ff584da198694613bc3447b977686997767183612ed5d32229f7686fa4e097646a07980e01b22f82ffbe7c3459f4d30f1eacf05c3e792fa4c5823cd678299cf842c40f182bad0bc25064d5c5b6118aba03eda1936b5afd6770a3791e669a43192389e1905d11a65f352212f0bd9a4ca4dd6dc554957eb6c2a8d77297634da236ab4091ef1e03b4287d0181aa3da72dc7c433f5457fde26bbd3004fb75aa3ed6cf378481ce27e46503960b95b57281b5d542ad35e3a8563d9f8f0782d81cd45f50ee0b8205b9c0e37c4692f88c7819c067a4bc8809f01959721c1f7080c8a162e6bf9179b43b8010c0c04742183f6b95cb338d41179c9ace9cfd0139f9d561f36b1db9fbccbba919798a98469e22a6e16a67de5acfeece533a3ab800e22c04e0cabf11c07c240cf9c15a86d5c44c6273e3f08d0055c227c216da04af591ab9463e1170c0bf4e38d3b17fae04d2914036738a47086650994b4013c020201297d766ed35897616000415384ce088398363e623920592234336e37d493cda6cd9b5cf0c6433a7480c6433a394a2a4e0b45d528a923274c49aa6ada43d5513c6a91a2f4ed56ce0544d064ed530a17320366ee48c4085021b56d460c06d54816a0a01500aba40635b09e3bf50102bac81c3ffa12015ecbcfeff04200c9839ddc0d006e8e999354ecfa4e0f40c9bd333684ecf68717a068ad3335f4ecf2ce0f48c0ea7676a383d23c3e999164ecf509d9ed9e03a32f06e9c01727a26e7d48c9b5333223835e3c5a9190e9c9ac1e2d44c15ff3f0ce8182c4ec730713a6602a7638a381dc3c3e998049c8ee1723a46cbe998f1744cec748c93d331249c8ef1713a06e754cc19a762ba381513c5a998244ec500712ac6865331584ec584a762a29c8a799d8af93915434fc5ec38d5c205a75a94e0540b34a75a5871aac513a75a54e0548b244eb538e2548b214eb5f0e1540b049c6ac1e5ff063a2808427a78d044ed00b205035afca84e69e4d8e1861e3e00c4ca17667ade58f11f2978f3a34a890384346cd040054170418cd0c00d93097e5840512d6dd271a49419c0bfe3030ef760c9fe3c08f2a3f109e9428898fa0919e21332c30f0a1141d90d20be0e5610ea293b3db8c09c996d60191f0763000101f1f01fc70e31b18b0e3a69fe9d1c70b892cb9564b33d9146dae2a0c47baf528eb4513e21080685f5de485b7569db6a1f9d23ad59bb39d252e5481b75742371d425332c4b893712ef2c051cb1dde4addac4e6aeadd19236f0e6ddf8aae0b9cbd572ae5923aded786178df29668689f7ee2ce5ebb9e2076976db7265d156586b5c2b88d316f7aa7a67293ab3ef8795ef87079f0f379f0f3076a38f17a0422033acd547ef5a44d49d3a8c64aa5e25498680866ece8e4648a66a11503d3245e67a336c6b0b4532f56451747516267e3b5af86e144fdcd63bd3bc64ce9ab4da6a11d45787b7ad57c21dcdcc9aeae2295d8e17b754c158ad2089ab58f79d42267d3c5a8ea37d3c3822a26fa78c6f478b2ec0c8b497cec4363223817ab4533ad38e2f50bc963c476dc42ccf9bb354f54edd7193f68c52f799af0ecbc8acf50edfac0896ac550d435bbe599a696fd58ed866e6ab6da854f537ca9e746a44040000000000931000303820168bc582d180503c9f503f1400025f8a58b666489c89511843c81863080260000080800080c0100100c0ba7ee276ac3416fafbca5a4b7a2609323aebff5ddcc4b1cb4a0b447f2fd611356135d6350b7b4b176474d9ffa7d3fadb2d8ad06b63bd6573ba9a7f4ebfe3ff65203dfa7f79f240af8ddb5e26ce93d54cd464d09f69a5b5436f4159479d38f4d66d9a38bfd5a89a5880565373e217d1fef7f337319456db26eec86a26d46a6e23706254fccf5e9ccdc8e96f373ae8c9ad1730eb34ffb3ed8e75c30ca0fd9fd32ff97fadde841d5923c67f3b5dfd5f37e93efed53d82fe0fc7674c3b16718896258491d43cc7b68fa890ad1a5f38aec58f261b12462b0aa4f08a69b2c05144c9d5612c3a0af8124a2e5040261b5ab9774e9953e10b7f8d8162b9ed785894178bfa853059a1d54386cb8da4e59ae5fd6353e534416e74cf8386634dc5cbd7930e44428b31621ed814b616921539d45a5276959c4c6cc5ed26476895ddfbcaf2d3fd617b6fea9a1af0ade12fb24d43530e5b878ab9300bf887798125eabdb27bc5e85a66edd2a419f10300e4923786d8933c4effcbd011e7b7ce7d33b4a5e10ca987826a816d55f093a6146b0ec2608ba0afa0a83b0a698fe6b3c9012837e57c98b046f9d71370c7f5b440823c3de6d2cba4d598106ce29d6fca7af72b4a8a44c5f44d1f3ca1ae08679a0e4b9a9c166d270139c83bd41a4165879d1bef2f9e48b3cbc37f86493a34b56248176044738c1c845b455d93c11b251588886574849ec3737579e9f0480898732d9ec4e7eb3d5bc757cdc78c3e11ef9fa535e9feb6303289e4cd4d67d117fb6e175845b5dfa55c8fe113ecc7665e6c30c560118dedbbe884d745a5300a27840e415f886f63dda2a7f37e5a0e840c5d83a9e1c05fc108576165219d51ebf8f9c2d3dc87e2d4c2d334e66527f5071f11fb324464eb55de91b44cee3f35ef7f563fa1b5959a59ba22b54f27b42c2318cfa0cf3cfec9af582f09faddf6cedf82b5648313bd18b37e399f8ed789d358b7169efea8526f3bf7588801239a59206f7de3e4784c567f09c379fbdd21631ca324f21411fd920ffd1c3fa6baed45819babefa05e056e0765e04cf26bbd58cce730ff3e497e287bf535825533e5ad8e1ddd688d67e35e9146a358947e00fa3848f5ac9d2c767ac6cc959e1fbe9f63e2690e1913aa8b41fa5aa1953c9923d0dad3634686a906d82aaa2d3abdc7a11059407109d6fda7128d03633eaac721ea70c74794550510f5b77a05e4a0c76d833b1a065bf1303ac13d8145ee8e30c3c0ceef9f23e0213ebfb672400b4c9215633917555a9c60879ae0fd14119fb0f38ef4911b42c8e74cfa7f85e12bb6f9e14d163e7e14cc47bbe2a6cf748e5b09d1c415d2f38adf7c8d035a7e7d4eeafd0564d8300294e21d75b4afbbaca56719fd36acdf21fda741c62873f46f39dc7e6eb7cc2f3d9c4779909de165787ab677c5a4f34ff36527df3e6ca3952d2f989f9762d0f947a7b2f911ac77cd06a636dfa5f9f7332c4fad0e3174adfc1861fa0b4bbfedcc0e2e551688ed416567dfd7ee6fbdd370b8c9c2c7d9b52bc5cd7fb27f8eb2e701f290099b8abe6f2fc0a1b005675a05f74c55d9ffad13963d5648cbcf92efe121c4cd4b432c2c13fe7e568c6654fc4fad2f0146d65eec262403e26aa81c270b511fd94208824a728020747a3147a43b703f234174c0f9fefb026e596aebd677a247e3aeea85bce64aa2bf95da0f5781d01d42bbca07427c1ffa01aefde87f61d2854f79596a3263e46c8fa431f9af845bb077bab7c3b41b14876be6ffff8c5f31b4f4485360d8b5099bad1a587ebeca3dfb304be40d8cdc3f87521a2f133218ebc2f2959c3b17204387d1f990102db11828f180ebccf6ccdbae54e98a9e11dfd906a20f0a4f953e3013f38053fa3472dde0bde6c43d71a04bee02c8563ecc39cf6fd36c41c4ac23a7fa4cb70ba29f6bcf3aff50c81b06becc78e1949e6ea9bfe1de393fb5aeddc372adc8d6fd6f8731551b70fde9afd52735e88218b78b950370cefa7d297ce5164e3839e695cb67720c00f9e71ede61380c638c206862db90a1ddaf351fbe35e41df198a1cd45e2766a91003fc5a4474e7414c2ffab2e1964103515dcea385a5f42e5fb109e060f5f5beae41548ebcde3381e1b6dc215c4b7bcc0c773677ef69158bd2d207ef15309a0355cd29cf3c39ab89047ea4a2273dd9ebb5986dfa9e637d6fe5a765d1c0cb2ebda506278a9e903b354d1ff4cc3c8857a33c4d8236840e6cd85b335f7a534311f815eca97b35e65d1bfec280e927d9cd3015e6460cfe51e6ac0730da33b58e08adc9675e7167a8065acc68fbbf57b6dc6b11a0b74d6cd9d39bd54306a0ddfda4ac6760c89be9f4fa7c4cdc8381ccd856b062bc28eb1509897289c5fcd17fd0ad1cb8ee5529ce5e250d0cffd747ea02bfb00dcf79eedf1b30e5c7186530b57aa8809bd18fb0b9529a02a9ba73d2b3a55dc0eb111c71c61bc0c14b704bc642d1f86e02371d193303eecbacc223ce449b7b194a321bf4d9fc56c1cf27194dfee95dba956f1fa1843013caba56936f64968a7c8ccfea1a60ed70135ffcf0b04bacc081ee7ebd1b4ff536577d5abdcb2e876872400c513762071316318b8caa7a9ebb0149e0d66c5b9bda2d8d9d6fe8f3e1a2c5d905ff90996e10e2cc27ec35c7a75a6012b0974dea37f40f264531e41126f4ac296ae08b2d07b9b9aa0101a1d5450feaec1f4b680bf19edc5ce3c1421d2ebc1c992e289531f9900ec7d7f0b86a9c0ebc167b718092ec67edc978775c84a192ca19f5c18ea2d2c9497506f7a2581bf9267fed98219c36ce7cae582d0fca4f5b833d7c3aff6a90c889ed2e3f63c10a541139926ac02038db42c787ac25b84c3101456ad2543c4c96b29bc62702fa88b45a14271b136e015ad1a9bf850e94c1474964c7ad3998cc1d18ea1f52d79a6b5aa014fd76b502e232f359056a7580d7022984adb4a82749ea2a036bef12b79ad6f219f74a04bf3d829bc24c1de1ad707aa0ab1d3c06b0c4aefad65e57efa1eb9637b94b5664d77d5eddcc0652c8211c40aa9e18e9d7d3103107d106cd511d34723f27160127d8952ce33705c0ca751ee762229496ec84149ff4dbcf36a9f74bc8f85c7159729b419a215770f595b2bdf74c6f41264242d8b6f884767daa4432dacc0695eaee3ab26b9b5cc75139523f2ad717d2f7cd2c5e5d101a5562b96819639a957c3942c06fe04514fced43a3b59498ea93a12c618bc1c0d888e6244edd963a61b3a93d6a22466e5777a693a1d50af961521eafd9fd935da8fd882adff8d512e5be88106902560217758699212d5fa074f87f6152c9dc0dfacb5b05a4ffd63070bfdb2562009b852afb4a392894536f85e09f465ac7c05a2742c08a4d88c24da8313e644e80b87fc567e7101426409c251cb76592e87e84faaf626218f24bc497d42dd1a00be24a90904eb1268a9c294b89f1aa1a320d46810c0231be805b9844da12d8bad0fc606421905b62f0ef588e45439f7900d566bd73f6bec57679e68e1fbe58f700de2baa028df9b827b829a01e7d96d4f80e42a1023909d5069ca77aa36c574817c01465dac4c342dfa24ca76fbe7867a190b3fadea99287c9968d31ea4c2d12d71bd0f47ce1b4b7c35e9482fcce2898bf178a998b084520c27225a4a14574cefc1825c55fec9e093801d87651e378ae05d13adda8b9faca6e5147ff5f2db69e5a2636be57f3e4dc81895d4ad7203f41672582fb218192936cf4593be6e7097652362a5ea44b2b49b4c0b36479ee61e85a6fa084fd01115a8152525546624510a0f1b017e19380152abac860e4859c7619602dbf2b8b2646a02eb71c3c4913383058e4298177801f58009912b5cecf03c5357869eecedca16abb8da7857d89e866b4e28b2d11415f42231c7e53f53f7caad37dca4745adb639eb53a746ffa36447bbc1ff58d52e2cdb445e85cf1cae9b272b8c8dd9bda1f277e53541ac5fac06be7a9d1ac8687897e91695a813021c9365cb9d48d9226c3cb08b0a5ecaa69dfd3fbe91487cb003c93183155d8336274151507636986c08ec103f2b54c055301723b11268e402ec25c342732e89e37bf8d026d765cb9d2404ef34ee2c06a3684d863e8d8d198fb17dce8ffc9fcf50c6f2637834662644154a1c84ca10170c32d2c7fbefeb881ff34e89aa4e789b6a0be20ecb54ef4cacc8c5df8414a3b69e2551a68ebf6d635b1ff30f9976f6923371407f069f96102ff4515144e9481f9e6288e12b5922224f8c2a472d12ea1635b11638ecd92d726b7f8566436ff1939428aef7732bbce7124647c82b880ba98423f959113fbe680e74ce7f58830ff9698dba9807e2f966578728fca8d756848a79c31b10388d135908a26940a8c753b7af6611c40204b42d5525d876c5b4d31e55a3dad8c5fa9ff9311e73094162c8b1365deef6820edb4db371d08ecc7707d916e3cda9eab3090064ca3cf9b45b2db85e8f4bd3211ac4296370ed102b0311ca92928455c41da4ddd003b03c8321d1cbd50098a744153db4411727260b19fde46e4616eec81bb64fdfb0bbc3969b98148276df1df60be4147802695e6962c1839f6430c9606a5e4c0fa9fe7a05ee9200a3fe595770825e712101788fd544c04f22a1565a3170a291621b0b0657d01f5cb5d54f4e018efb640c52c5dd917867081b165b0e572ae177b18aa6cbd973ce66e8eb841f0084216ef80ff3b5f5aeef5dd39df38f46098bb8375dd5ed2364d97a975ba78c6407f1d8801a9dca7f9fe46d1ada458b1a96be5ca0730b5c78cd43173459581f43c405b550e9c3a234091017153cf640646b9df788fe0112142c5c0b26d94300ab6f8e5da88f71670802f201683d1b2c18a5bbd15acb0710fd541334e7f73c2fc5f2cf5b9a3521fec184ec54468b90fe5fc2c9bc4ae772f9196caf689da9bf60512b5923a9d0975ca9d60c84a14eaf9f9189ef3c44361ae24706c38013253c26fe1c392ec9fba6dfda93de5a2be615b653afe590585da1420fd1684c56f2e18043b0b8af39e5eafe119551701acfb8d311fdb1b0e37c443fb295e00e83fb2474db5b4d12ba1d6c6d5b57b86d0405004e8b036ca7a334ab8f2ec145bddbc573647b963d31f0a4a0f420a11fe707895c510444a1108340b413727bc47635837524f1e4f2f849c1859fd2d7a80d4b0d627db81f516a4c1782739707b61fbba892cc770d9b97b12882dcfb6307a42757ca36e3b60a2f12025327cab55e9702231954a12152f03a89c53998c43d53a39e416a7c6b66b7f53c6cb5c76aac2a67f3c34dfb2e2e702d2c8cdeabdcc4c17015d6676f862e6a2697c675f2fd6b68a2aa5a41a57470c81388b265ee812225d51061095b757428cc4765c3a15095a3147b750f3e21590ab61a0745bc9d0d4094c6ae44eff9515a530c5e032336b8d36a19287951b4a4139dac38520e5efe2049a3b1629890712b0fdc8fdcd3a18f2bdd9851facc1631b9c0af0406007e004d4e0a98a74a2bf7bd03b2e82ed79123323cf5e4af7436bca10d8d5ad2c1fed6e3eee69dc12a5477a57bf2177ddf88f718a3f72a992abc6438657f486a99b920e6d791a3744a32352b540e5962a186be2065c811402b7cacd79ddffd7936251dee0aa0e67b5e1d54d2b679b10648cdf5ec6e90e71485cac941a6b5237f12bdcbefb6fcde03e646e8bbf35f6f9ba6cbc8ba50d1b781bf949ab7c5138bb9bf457ebf86a4f571aa9c460c5598a6c61509a58754bf406ef439f983922794d850720bde099234c00709529f54641a154896bf76ca2c9ecaaa53b943ee95c63e4273b675ff122d3fcaa978088e3549e3881d3b38f973b621d65c9b2a582b2b2327250ea59637c6f79c22950d7ff5b3e7c5d5a93ad63406809d884b6ecd1e44c91fec7935d79d060c498fe78101000ef84cf37e2a53bd387c694b84b166fd3c407b1563bfdb83a1746ec290ad95ae30082c1b7d611bac41260157e34aa2ce4dd4e81a2cac6434ae65811be54094d252e1429eecfe71af003b02931c08176fafc7fda5472c25b358e19c3b23c3129c078ab615e90dfee24c21bf24f81bfcde7d37370bee9d79f1d37b21f4794e7ef26a8cde336ec0c376de86cab2341eb4a726635af8fc1da8ecc7e9e447c04a51557e4d8388679813b4130302a8d6dc49d115ea82232ad8225e4331f16ed08ff1e41f2240e3b0115e8617eff524f2f930832b01f233e22bf2fbd567cec123c210633f076953cb1bb6671f7849c7e5070264654e6c41e74e572897fc2ffe1b4f6f98c41049733c49ee1127ab2735cb1780d6d42bc8f14f1856145044e966ab410f02229c08c88141ed9b8253984b071df0f39de2881969d6f95abc548fb2c8c93871d18930963edc2c1d1118fb4a02ac4a4975372239dfa92d501d81cc8c5d20c9ce6845cec4426e51fa2ff9e9736621a2a23346539f269be6020f985d9deec0a0a91ab8e9813f50b9bfc616e48123c4dce706b73eed4d56ddffc96fc64fc7e5c06752dea7ce886aae4e1c663188c59888b93242a74b7836c8eddad3f0e636183c70a6cc39f3a9680c7dd191473923a94615b9fe64c32fb96528d53f46a4220ab4911b4f8ef8a2883b27855bb4d74e1a6a21013e69a279f45bd9db7b726d2710911d0bbd1b31a3926a527a3329f724c126c7bc036522001921fea957155c77d1c9b9f0f4e74ac09edfe1b351aba850342bd7cec5126354346b68ce951ef03c04f0ce03d5cbca4a61e79a7a033cdfe308de1ac76d40a8ac96e00b28210748ecc965b9036379d734c38748d3ec2358a89603057fc5b81d7b9d7fabec9ef8630b5337ea85023caf0689d5e283ef10409cb9b77155dcae26f1bd2d9984d98eb4c051f35e9bac50449cf4119b060c8c9bbf43e1e66a15c67eb4e833e494a5cd053df725f9086bc44d502423119b980eb858f347aec8f1532277472472d68a0efc6611a0ba3106e3960c32112ad375b007b86193e2f9ebae83d04a7587a5247cff2a47d62766b4026bd821cb81202fbbe5eb042055ed40cf44a2e52295362ce5b9e10cdb65d986cd35af07ccd286742cfacc5cffb948df1077782dab50db3c8fe0d226cae2a995a550ec072e75b5411e186ce4c2062c5e49c619e728d561a62d6e970eacc89888a93674ea0628748282d12ec4290bac16f2978525259c15b2c5ffe0937f404ba345a64e8f132b62d5309a32ad832c8d2f989ccef45bd44c03b7a08cb1ee3baf9c063fc64f8a247bb65a85d30e66be87ac63354b7fdb05492c7a572328d11cf8855a1ea2d370839b059dfa57eed4b99fbeb111891861407bfe8ca94e308ba257addb4cd8ca3d4154fd2c50fb7afa9769673f66db3990b4067c8713ac8232e32e91fbdfaaeca3b2b4f1a621bdc06790ab7925efd7f57a30e3b69fe590970fb310332ae2ca97eb5ca6d9c6eb270a66d48fcb6dd745554594bad2dedc50ca3d98e8b383ba3a9acb2e0393933cb2175ab9ff3d5a455a3e9164a932a392257486e9e2eee365e40e6555b436a0761df379f21adcdc517c52edcb0c818ee3d65209ebca0f37c9a23672e2d3c92c2563da1596cb683bf7abecce0edda866d05aca899d78c27d3a4b2eed0d8a11eb2b655646d7d3d3d83039a1517fae3abd86e22fecf3028affce2dc81314bbc8d2de7dffd496c2ad238d8aefa1712bb0c6a4a951bad41a76bb54a34efdaaa645d50a9ac71bff7c3502e0dcf565311d63ccaeaa51787d59531031315aec746d81179e677ac99f36a2db9f36ff0763cfbeff58e03d7928d8946cd9ca002e3aa220fbf082627922f832d464e7b608e38887416be5b32bd5ada496b6851d163510e2349cbbc02b0bce4352fbe6838019c8105a39cd1c5d2905d85063887d305330833c9abf584c1199068a73bd253aa8bc84f5b89a822816eb6b320b9033958730fc34129c1fbd602b93a723bdac157b804539160a71033e4bdbb21e96b81a1f30eb1f2f06c6c040c7ce26870ebd07413d338b952d245613af2d9d94627954747de5ad5575b8ad2fb18f7eb241c42d8dbd56ff6cd2dd1143d57454d3dd25739196e47731fe9d4f182e8b06b0e4fba01a6544fa23737748b609c6030ad32ae7731c2540d6cfca5e85b52b1f5f0ea4f570df33d59b0707828fabd4cdee442bddb0383971127d7c4b7ab1e7e9f02e0126d74167c7daf57fa9fad30b130599d8e65846a8df9c490cb856a69716e1c2f8506bd48725c769927b4f61f69c5573d2671c4e6ec422ca6173bd184161ec0c0fcbf5fd0fb6c3e45108e8c5615bea101dc317a7cdb7c59b64b449710d8a07c46add6831dbd9bc96edf2c7c1e1d4b8857573dddefeb4d4495156566de223f69c97c16c764a7368f7f0b73770d7334f65db24dd86a29ad29cf4328fe3291a32e43f2116fdbb849e5c2d7226a778ef56079506505fcdf04ce26c25b02c19c906c480972733d596344da114ad031618e944bfdc4770e15e10676f92c63179edd8e1252cbe4a5a144e922a55c44d09728ba841f9c570c9a34d491a06889dc7f492ced4fe2692c664fcfa543ae828c96dbb0f7035faf3f357f6d54feaddebf2338354930ac27ee33bd2cc43addce6cd3a8172155b7313bcaed7a48bcfaeecbe23ca56c7f71ad199d71815ff5083518f799d45bea82dfa93371156c3710577c85f2c271a94b704d60e2cbc9905e63a03be5f981c1c4e22c38065108980634a586c1254bc9404f04017217d0f034688724acedee92cc5f0655a2148f843acf805d1c871994425481914fd0b5040395b86341f81eb75d440cabb5f6c6abcf448393faa521b68be84f28d197be15f2c02b5ce84a85eb5cdcb4875de87e23d7b58b82a73316d72959ce6d893bc6bb3833e4caca75202b750f9ccb8b27b3538f893729248a577bdaab51a54fa41e2569df42ff48ad2890fd0eb0d4fcbb0fc4e74913b370413caf138145b89cd039055474b608038ae3b60f27a540da594768c06e674ff194ba18c59b237b36e02b66dee9b1131732113b0ae319fb3c5a05be202aab3c163c19bc39bdf6bc50a77996fdea3a6a9b85aab0ae5e87cdc2d939948f967b111919e093cd5d571639b825833bd8a6a71d6fce0254c7efc902fcac24e55b1e7cd15905672a25dc9dad3b20ab5d3dab4b74840c6fd445b736e16389cffe657f6a54c8d6fb75f0f5519f9bd868a7fcb4b678e7ac73a65f87b5bb65c71060dce89263dceea38b7e4a88827bddb9baa452111e15a23c3ef62cc48ba612ceb729d7191f565576cdc98c50725fd0ad4749fb437f4f7caefceec513b1f501ae6d41f6fbde90b9bf783b405c2f40c4ba1c871ceb1fe1cd7f2780a43eb0567c6972e9a5d0715f1304c04336bcc1d9da92eb559216206c547a3209bb703be4be1bd757e760e0f0d38da7e64ae5f7060c3c2bc7f5dc19fff73d8d2b8bf374def6d30bedcd1df58896cbf829f3502ec68fda1374a707fc097ca6ede0991a70388cc0d0057a9a4e742bbd13a5cdeab79fab97bcbb48939e2efe77b66d7ee6e43e1658fba1ede85f26fd135aa582baa537871a869f9db83cc50e26fc5daec7f9f93a17ecac199f8fac861975c0e6be12b3f98e51bf66e6c4151deefbba3a16d8c3929aa70d0657d0e6606800400278b84726acef0cbf2107763d1e0472329834445374cf2d3080647f52ee762b24f79e71c918c52d15c614d6011c899322556da3e9e571c80550cbc4f4bdc6a3f5b4bcd92f50ee3f298875d5490bc2637d3a8c2b1bfcc1886dd316a23f207b16a1dca738852738ba2eb97c2cc394f1252da27a47e3c74f50477bf057d091d5d538f70d9591f180ea415aadb722c769939bc20c958b8c3bade1ed4e086cfc160e17bea165c11e1589708fbdb0755af3d1c803e266346255244da44d394946b8fb041fbbf7812983c5437af09907dd8a1c7a89e0fcde347f3c10ff11a0659585ac01a65de55f8ff6f3382edebe45fef66d2efdc89f2e21cc1d734e553d11a87ebb850572a789115b9252b65d490612426d0ec3d83831d5ff746b717a9f524716c3ae774b2154fa74e2501a2fed828d4381172eac75aa19ce077ae2979cf50a2717687107504b62c956f4d2f77ba06c1db511a30f0c853c8a695560d78d9f3ff42c46c7b80a920ea02effa9cbbeff442eb106366393ec901134876cabbd5a38d4c99c0925318e9195fb1a45363e55b91a118738011f9017cf4104db86ca1d6fd3c9c2dcb59d2761a24f081dccd640afc19c0968b8aaa3dd9a9b9f61d527ac8398557aed01e57d7ca6f2a8644379ae8ab287795923bf886c41300dea8ec065a7412f4fddf123ed270a1d3a248a093c3c4d7f4054eb1eb717649dd8bfe77564eabddcdfee00c4eec246d93224bd61753cadfa152e7b5976d96a9348c59f8424a0c8bad76b9924a88fc8cabfd889d638c78184a8ae86dc3420c29d472dc32768bcf610d66768ae623f4fb82e25d4402054315de81a17680f803f940553d2c4c441bae39635d62cc8dba847670fac2c2034301285a15722fb362b7b0a0a8c47913d014e5df4a0081b0ac40c544ef86da84e110047c64f172b66d2705ae693aae79346b5dd03fd9f64e458a759aa32b1f5052528d0d10e112583fa8f19a71a6452e6ab8fc411f825874f3389c9cceb18ca46e4450ddfdf861c69257e40eba16653a543d699f191ada102805b56464b63792c646877d21a7013aae2975228562133a2c91120590a46bf80e564304e43f55e890d0a14c58304b52377edd18322720996d74cad3fc68d4aff745bc9ec2e10ae25ffe9cf466da4b88ffc91d4cd8052f61b31404ed7b9afb9fc4ffe32822524e558d625155fe2cba6a91c134f36b410fd87ef17511935963ed9ba0c5c39d3ec522130da65a8989f8bb7ab3388ff0050634dfc00c6177ef423375c0074fb01c0601f364fb5fb3c39e78559792de486bf5a36f14303e1c83217cf695e13921d43308c2f621033525155dbd3c19cc9bc35cf591994542d4a397c24b2c73796a588e6799ab221060f74dd157f4472b6475588caa1d58633ead44ae365257694c2158132388333deb4b875cb15abb868c226ec7b84a6d0dfb1e2fa07767349712c3c9515744974f7d8261906e5035d10c7189917e7486062a844750cfc059b2be0fc6747a74ab8b0022b4ca3406166b0a2e2f8ca4a185eb4c263012422dc2eab26e250349e37f97bfc893f6d58c5070459ea4c244ba48e6ad7a45196e48ee381a1ee79a2a0f0db29c281184fe9f3d4c3b51bc19e89eac6de247a06c72a3f5053c452adfc318ba867af720a73618e6647c00dc5163778b6c3771b80ceed47ddfbe470cb69b7bd8ed9890e5379ee7414df41a803c7ae5d24aa1b5b50470e52a75a5f1c41402a6d5c1fde5f5715c5d40b7078c8a1ccb657981b913f1aff0d0bca3fe07adaaf49868cc3a7498492e2752cd335ee92f2c1ff9509927d626e72b83e45d3355a22772be39b6e2b222ad80b118ea06f8222909c4da3d5f93bf7f0fcfaeace7112f9ea90eb4279cb687ee4a0254bc84478d689b2ede881f8201d146849f66f4f44343aa84acaa160d9c9f343bfb8e07d166fac6a593f674a9fa5242370502cc7086ba4a5e6039ea2f3552dcd262feb66a317eb41c9baaa95edffc466fd5691013d0e43c1a077e27e2943ade0cb4ca9e008aba857827784073624366ca4e5a41b6385ad186593fdb37c5bd04673b1f0c158490b9788225601ee474cdbba933cae2bdb09b8be3dade9ad8a3146e81d55196c58a77a2e84191aad4a6ba34984bb781af357e3db17c4bf4320f3f2ee08358d199f31cc394371cfd5c8cee12590a3be4dddeb2bf1cf33c03bdaced33d028552801503d48ac7c18b88cef3142595fc5922e648eac146f9baa614a086135107e583dcc5850d7978a873c45c56334c4cb67971847b0ec389f6d13d2c78c90aa25af2dcc47420344d48343ac169d454bb5bf58405c344616308be43b54f3864e65e82e1f434c60d75f1b40e21acce3dfb4b4014dc4691beac355c187b66b7d814d1ad68216bfd0148bce32151cf8a68da468cf4705f7d9cb894a5366e56241baef503f9d0e8434ed1a337784524f2407996d316f1edc2fca533c98f418032e76b0785f77fe515044c5a8a0c5b011b7ebd5f41849b8c0437c9231351bba0770123f0194c32360c060f1021d5421feb47cf75f23856324dc706a70f25d3a36d3ea6e6207813ff4cc31633fad4c20475b252dabd0a49bd6b0032f19ea85f293b5702f58ed321b3c8011ec3c7da9e20dd26e147dbcc65cd5775fe0afcd082565769373ebf8f8effcffec618e62c0c5a9235a8432ad2f0ef1d055ea4e8e67172970ed6ead8018a5fa98850406071809c135ab805987c478932f695387ae9789dcd30e230aeece316dc95ee10ca6bc81741312ac6bc9b773ce2b129a814932457b48d51c6954238a566a70128c1dc136dfbb687a28a041227d6e43d59bed792ccc21ad228a7ae8b3cbcd31fc73808c2628f42c933b771b24c3ae7d139212c93b49c68e9c11c8b986c15454c16029fb9d15b5d488517a550cc564d6525113334572fe09a33f783cebe271ded439818e70e37a6ddbcfc0b84bb0e625e69c9b30531fadc3b5e79a334fe2d20cacc06b7e92aea52101faaad57f2bf84aada33975d68caf272b201bea808b7673540ff9a40717732fe5e14d6d76bce82e5236d7b33fe48dcbde056822273dd06998ec7b08f2fe195446a8353e3f7be069614a67a91f69dd00dbe9c0fb30b0efdaef3d7350f9ac7bafc9dd41a464e818e34ef94b66b9872270ad072d9b0ef904d77fcbe5fff3d3e96947bd97513778db38e3976f8a596ef80d37dd0872d60bf827b85179223da52275024053acc414766f849bc9af7ce057fa1bf883f9269794370fd2cdd72172d96f73fa1235c30c039522ab2fcd411b39e7c4386000e3b3a0c1b90a3a937bf83ac091090da43e7ea514fbbd910d2d28761e702fda8282f3db68147268375d2c0b70c88de297ee109b7ba88caf17031c653d5eba987372462a3c5e1edd1fd4b5863045ac495e52fd69f82901c693562e8b97d93297318d072fe3f55c65dd60c68a10a6a907b8a6c7383c9395b10d5c6a31a11dcde81ad11ca761a9d696feba6674c95ee793aa65c5cce53fcd0b11eb55b4cc85d3a676c5b62c3f0702a4c090b4aba6f64a29f6e8a239d25125c26f02dc767ed7be8f64f55dbdcba70713b9057ee8c5e876230d4541a12d488f5c153131d760491570e2a42b3db185018bdc955c516043d236a01ebdf257c12399c7df999171ebf3bdf19fbbed1432520eb68c7f29adb2c296b5d7102cb9769cbafed941b7c7e19068295e4da863d8ae31f7b9dae7ac09070cf466a7ca32b01618b4d94727487cf2904f66b5ddc814a9979405133f3aa3a235eecb427a84652083e257e42c30e53111b47dd43c5db7a5c0059eef5233b0040bd3551b155f08643a11f1e0cbead68fe093cf4fd16e31cb05b79d40233dc6ff059a2c8016d9c46e526fcc2837ade290e5e8857a6d86981d247a84cca4099e545f1456f4c1a594e362562c78119cea5f7717821a47d72a9116f388a61ac688f304cd4bede155fdc959b39bbcbe1afa5d6d20c0af5fae291f7e7a003e485a4456dc770168c5ff6ec0f70e50886269fcc7c4fb25a0bea33bdfd4070f0644fa25433b455009d8632974d95aea7941164eda22ac119da9ee879d2b8c61eb2c640890f82a26e7b096a687b112a111cef97e1fa8c0143fb3f9f5003f27c6350418ce38626f13ecb73a545845550f6e2c2760c832c3bb8ae0ea06c1bd856748c754b013028d13cc6da4e33b38b67b9846237117f0b6e45761e06f207222196c7082454940b61f10c9dfb21f953807905d41f0a4f4977d93997fbf6e54afed374e158e2e0608bcb75f1a588e42a4db0c7c7fc80a77501d6808281c5ae76762f9e0a1177793174d4871d21fcdd85337617fe6467c44e783f315e9e5a08ca013d023ffa6733db95ebe706c6371eec6d6705e7c84ea853737982a37e8ccef1597649c610169365e6fe44f0359e862d23ab9203d227960a9f0d538857d8bcf988e384bf05d0326e1fdd925e11f8905d5fee6c507f2ecdb7362adb7b7fe707586133c5ed84366bd4918a7e8193e9d182e259353e8862c331a1ae1bd89ee2714b7a576a74e6fe7b783469eb0d825f069415ef76e857ebdaefdc8b417b3c06f6d34531d40fbc936f320aab3e3fa0ce2be377a990591fb405ca07b462fff3c2469c86fafa3dd5387d5cbd8c8d5ac14071b728e1d43000d9c8fe28a1c15226225d4d4bc0db21d364b1053e7dd4a5b919c2fa80ff60a96d726d6eefc868f08aa000847a9ef31c9289f511438992fbf9259423eb95ed0d4e4fc7fa8dc75d24083077086b7c40fb64963eb97c0db0023fd3ce238a63f8bfd97abc5f7d61986313d6a870d5c5024c8ab4647da1e35cfdc8567dd8fb21766b7fcf8037d25043b3d792debf1e176044742b4887ad7a90651fa5b60814b6d875758c35a14c9179c026e9349c437295e8b586cd50b158e58a24ad12b84baaaa82c157630bc2a398a1a3eb1c8e509449689392268b76c0aa26f5e94d8d8aeb09147a71f4374126f1404b29d77d2104b21d22d5b0f3a7bdec3a641e27cc9a81a1e09a430f5e189863ffbf867cd1fd62e47a3db4e3a49ce8b5221e921410c5342051927991777af0a9cdc204329153e355ac76321639e9d23fc320f4900051f3b2177abc6f3dacf4af88c4bebfd986ea00631a70d02e66ed7028f8384ca5ea170a29f7ad3ead4e931d7a2b66a1418159dbd18aab8121bf309af769d016f7796b5c6c978af12de7c128c040f4560800d2db82a1ab68b7115d6a410423f6b970dde798cdcf03b6d986f09254a05b56151454031b0f8cab8e89d4eee2dbe1e6fd942de8a5a75e1a20c6dfb4152c7214b7880084ed0d45a7c5d6febd9ba4f94fb7a76d0c64ad1bfe73d421785d7f4f7aa8159877085d88025b8ca261934ee89a7c89beeb8d5ef94571375ace512b1f8b6c1c4b12db81c52ffdf38083136c74cf4f821d69f105ac6f501606c9acb67d7816aa15c38933a18d1bd8695e9183a3be2a1c0ff9852c1d167d0e375ad9f90607ca0e8036d7b69db030a410c5c779fcb37594c08ae6f81c1c72e2ed8216b6355fa204db022abd33e5d32462d2f4aa32bdd54f4f89bed8e3181037f933b645767595ec797f14356c32320918167bab7328d5ef41da00684ab8b26eadebd934c8e180deffb7cdf5ac449e2d71ebf8b40be9d50344a1451dfaa85ec5c40fcf20d4a8adb50057bb4e4206e2b067be133e0be4a4d84e786ad8b0036428ea6c3bce0916d2941f7555400a4a5f1debee17c53a0718dfb5020ef23f84e69837e251eac1381a86478c0bc562ffc891a3342f0838b1c4ad64c7bab1b6609b656afeed67f70bd51639ba57430a3f0359bb2d19a5ce8e9b05ae9259942ea5bbc7bf0764b3e6b9210ea8f6e9845f0d08c1bb591787ffd05e9eb4cbe5768b9e1eae24fd641ebbc45134b508dec232c6d9f35e31e4d15064bb029915df50c973b08fa9d3284929da512a1f4f85882154e09a27d8adcce8ce0bce2039b0e4ac0151400c01d9c80e870198b0b4ff856b1716d47bca29b32a43835182317201979bb5037b39d3d3200463d594fdf25c691ae08a3f70294151cb33f4c0bfbddb075112ecddde968303314f4b0165b5b011b94c5c9199a2ca0d69674dbe08e69d333b47ef022538c93dbdc16a819b2bae15ab614190e1e4f3b95a7d4cdd3df988b86f24e960abff2f41e7c7845eafa19d063c6dcf84f7a07dbdfe14141e0f4e81ddc843cec5c500a0751b81ef1ba6ecc205fe67d11f3828b8cd756f0b4fe84b5af1ee2c92f8275d53aa20a3ee79be9d36da9b8ca3b75caf8f02845ab4d6f03a7396f772390e0eb485629331e57f789fb99f290b108255660b2d486aa04375ebcee013462109967af73da460706ce9dc3bdd639ed25d70adb165ebb748ebb0b41d27ac1fad20ba7b26495b8136d82bcc20217d78f6fcb5d759d7b93800a76abdaf27290363feaa55fc0dbeab8fe85aa2de336dbe4ca77117e6d50649fa0d6d1e749ad4a74dfb3e05d4d265b9a27b23b0ac31e192559367ad9c0329d0b99051af161c0f9646b6f697fa5cb286288ea6bfab02f8acd7649f867f29fb8ce9e704baaaae56ebb4bdebf77151948677054e4a74bb5c32d5b90f787c5f78d27db9d7bee025756fd895d81dd515efe2783f17b403362241da753d53767dd801fb42d2faf20e052a7b2f8c57a4d4d8211e5bf55dc9a08a562242a94b421ef521994587fc847688a7af27e9aa73739abe352bbdb7ea64afc2d1facbc3e9a0c7ae2dcfd259b17c0e0f19f389d19d289698e470035fc59e3aa8887a8a582d73611757294eb7a2fe25c006f48153b0eb88e08335f009171fdda78e8be3d7ad4af73fb41b8055dc3fa4af11e694d1ddb8dc16b35fe6fc9ff0b25e0e821ab80bab3d467b06bf103420242a4869f03067004e244298b392fde41e315a4314e026f56f5f12d66268925dce92995320ca1696cc8556cc36a68b2651d202751b7bc2c85eb53cb5e6e1e4fb47ce4256a97c93957c2dab93afc2a1ac4472d6c444b9f5012891d1aae4cc1492d18972449ca2bc19b42898dfba299d2924bbf125a34ca9911cda8eb4382f14fc015d5bbc5b24d22cf2c7b9c605f1406c3cb11fc46da4e5dfc8814c8dff810347d07056d9ab0c874944a6bdea61844a6fe8038c69b923141677a509fe78b8a84a92c66c78d44ca0d36e0c978534d40916ad282c285d0209ccbfd40b821651127dfb1f87bd02a7a31fc651a162d5d347314a2c6687ddf6b8c0ef920be0fd49c7a8ce2ae4d7ec867eb235a1486a08335b026a3bbd90809bd663210c874239999b0c5d6a6c2d9c457d5cb5d033a1b0670bdae3e0b8d461cc401f907e63e5a4c1f1d54e0c9d5e12c32de02371e332edb8ad3cb6118db018629a7009ca5d788f3c98112eb5b4754526b9c9f666667282a225e21251d6b8e656c2d5919c6d85bbc75a4199aa71155a0f981a6df5c8f7841acb9b22f40c6b1c223de0902d73b8a162716c70436ae4a6c45587ac0f76aff889d31b4882172e018abc4b1e0510547a8d30d8db218cd981b3e2de0ff59e3645ae6d06c0cecd26ff40a51fc2d5b4a6f993c31e61f0daaef0af4b58ee4857c35bcf28f4c160dedc8c70a81cee36ec0188c3403e4df030ace1edcc26b59fc4cbe709f408bd27d463ca72e26746fdee1dd788afcf7df52da37449b51a9009cf438d41a4dd169cc05bdbb2f4a7138904d413f200dc1337850cbd6a84a8f5ea74e3005e46efb38047bb59e06e44179d0cac97c6387fa16dcdad70758309e4bb0d9ff7c9ddba4c1f27d96f2e231d42b4301dc18b732b10bad46e41b91f27bb4548bc6548dab8a433a50e68e2766a7d2046ab30bb550a6abc53e948556f80d8ad87ef7138f57d9db7504b1eadffb4a62b7bcc17858473cd36b042c9762eb720baf55fc0520a3a2e9c5cefd3106da27bd1b2617b19940879413a3bc9fb2a9e562e3ccb550b59078d04ce71f93df9bf7e568cfa5bcb8d1b8ec30a523b763a65a4058ddc0557dd7942265b3ec3b8fc89bf8740f38c4d9bf8fc742bf41aa4b873c8fdecb166e619ec09f19d6a71cee8b9409c302a79310a3ae3c81918363fe971dc28a1bf2920f35e4ba3b5a24c96ff11b9c830e32355b61dc50ac534a61b91821b88009d07bdbfa1bf3859d38ba3026f8fd8190f60a94d08ea2753921d2a7be13d8dca53a55d619ca2095e890e8a1efd5a74ddf8d5ee14da05e34fed87214439366ad3d3171c069e7e7cc016694e364285d12e0c9391d80940d720aec3530147ae695ac3bbaf2d28099cf1612ed46aa160ff52d0e3d4d2cbf3b1cb003acbd66a9c56b3e5d2b27ee537fefde956da284d4ebbd51624685e131a1bcc6205485ca614f35ac9a5332796bb8a698632f0fa94e7efe4d2cb1a9db40dea10dcd7031c3d4cbde3be6747b76303b0c6d37d635443e276a10bcd65babc42b32738781318a501187803f38cb3ad548b6cee1cb8b2330627027154382df593140c05e31e7390dc7485027bb34c0cea71cb6d8398b04ffa4982330e618b0a4fa61d7e892f07b0b33a66b7f0744872f9933694387275b9910911911d74274428287d684bbd2223968870406e44675c16bc414bba0fc8c2bf563b9627ea178287a4fbeaa20a0e3c828ac137ac048d6edecc01f871abd87cba00ff26a757e6d01a8004282c184e6d2d1bdfdc114e6f4230dc1461b85785f7333c35af4e451da7b629e80b0212e87d7d4078e5525225eb20662e214498cac292f60b94f5cc9eb9e8bcc720046ac72fffd343b21070d6b0f730a20b176d789bee99c3e8aef4de96b8bdc7a727fac6a5fdf5892e0e80bea6bbedcf0b1b14e3074b5c8a39859716b7fc61fa428e329bcea22197fe2ff14d22dc62a7b44818c31c2e4d2b5fce80cdb40fc918b9af88192e07baa47842c8f88af867de24d6ec0bc95d3a40f1814ac7d4be11c4feb80e2a58d9a786e2bc065ea219fdfaf8697825236800fa152bbd0750a19c039d7cba3966814ad3033b73584977cc8a08fffcaeb0d6ccce2bd36c764fc30b0426d3ede6c4996ee9c976d19d3c01a43c6f72abf8dab00d4e5af22e10e04bee3105c67b11f82c8095b380e57fd7cdbf49a0236ed8788d6eb063ac7719197db0bc3262092b542270a7c91cf724480df17e859899a3e964076757c7532334cff6db65ed8596e2d78157e3da1457484f58c7c00c5729117015103b0e2e282c778f4cfebedab8309a509863592234a93e703a8b58e22468abab1841b221a49a53183b06d3a353912489d164c3b2e5a83ed6f3f4e78527cf69223872ade8ce10e308e2308d180ae4e92cce1592e57ad693c8c9ff6ce9ff01a284ad2c238c07b1709ecccf8d4e72df377d1bf70ec7ea95992e846b280c547672c96cb63f2ec3a09f117a2768e5e9ed5f9122cf9adbaca55a2d5338b3b15398e8cde83baf954ad831683f5052125b0f7d3b9749cf0571d40bd0bdc7dce08eace6fd86a106ab00cbde0490a9c0f1e0bc2b660d13bef82e72d48e93cb7a7eba8492c41a52c0501d72724d19a917d640b5690706d51f23e3c005cce10c1253098cb6ccb75c068a4509a2a4fa157572b039a59bccfa944c17854078cde6a857bc22737512d41bf5d204690233492a5b7c973e843eb5cd30685411b8c71f0bcc0d680dd780982a76cb92e9f6afdf232859348351c6a88b24bbb7cc87877c28d1155361017034baeccd056280488540daa3e2a8886993d19ebaa9c48de0b444af7c55aad157eb266144c56b066aee84157b6a0c4fa3da57c48b9600261fc3aa49ebf91846ec45aa90b03da012c32a80c57a3675cda86523a4c56cbe1a088d82e1449bd9cb0d50abc7cd2f2575d6232d482ff6bee8f907100949843d08130954bdcd8758bd1d55aa1268285aa1e6055766dc8164821aa86e9bc6de472597e99d857f5ab20d7d9099680b478c8d100ebeafeb09b909c23aec536b049bf2c04981f7f39da20ea80b942f683e4ad26482f297eee7c833a97846edfe0398828ce568b5c3003fa6e3315102d17c8e8cc17b17c5af2cbcd11a138fe71a3436b321f346e1e34195182a41725e20ce03ec3085211fc1e74260e8429e95c21a3730299c7511dcf76b3e7fd6f332ae769a9b3aaeb3b39f58c3e3b0e5df5931cf0a3d45994f46c7a46cb40c627967a1aa1e16d252d67a11abc2ae99c8f12ec5177c8a008d5536fe215744c5793250d6fcb8b14b061cd937b8c8659781ea58d7103c8263cb4978bb87aa68c045ce78649ebe9f9ca50a5e7e15302ea0b40f7e9cb6f9993aadd70d2918f9ba9512e661f571079464a35e496e70283a7b322362beb5facf4f04fee5e4dec42860ac2bd3046a2d0fb71f4b67ae76b9a737dc38c675ab0642bc822586134139ef570763deb23ed17faba50f15a492c2c5e8429510374e7c0aa245c5dc99978bd22ee765bd26e69090b55fdb785b2a5620d1278d76a6d4f66712582d563c329aa4aa0035f9a636680310da78ee9613b26c6b4879d2b31467c71fcc5cfbeb66a910f3ec906840384e9620b49637e3bcb045247350da9f96c045db6b9e40dde1c5aa3ea7ec5cff453cfb0205ba311fd2b02226c1657a6178ba505a4b25a688fd6d0c7c19eb31ef41e5cce256458392366b9d7d6eb8e3e429589a138309d07c8aba724ac88a036af02d8032319f8a5c6dee9be0b616791caf9d970f19c3b44720fc2411eb11987486b043713947417b0a1245e6904bbef91588dc3ef0ddf2ba905a3ea740ec353cd8d6cac2cf8d57b802314c24bb5ea129c5c1c18c5a7a9945c417af0ad9156ea72a5c03c51e40a19afe257a301331c1045384b4a93e026177696e1258dd9af63f98b728d1145c41fecff569f03c9f5e826ab8b1a2560f8b174a9307779630d4ec3651a594a36a19436d696d6c71d3d83e20d5e10f07e1782f0277fcef15219bad0cebe32200035666a937d0aa9408d75fc1b49a8331995d267befee9602f2c9b58c0b0d780e83d0edff08ac8262e6c167dfa9398f066315a176f3fae13b0fe3027a89649f17779263a0e78b4702223c2b738e9177f686c52e4d5e005485e81f68576833b9d7148cffdf12452f1e932f9bcf52178b8455a45972f80a23e2faaa2a9e5525fe26ab037280919d766debd848dae02f0e77d51747b9c545c5d5f67210fde18188e2434613340e3e3836d1ef672ae38e9535ea79623204e1941eeb5f5994052843cdbcba9393f1c070ccee91abd847d74fec9a2d028e8de102304ec9d0e54f130c42f83e051de0588c1bf9a340c7090c9549e15330e438031bb1dc12ec717795f570f9362f39288fffe5667176c131f3377d88edab7633be6e5c9fd993fc1e4d2b1ab97c5ff0302090ffa59b556c37180ded0dcdf9923017daa9c939b574432ef8310e891a35432235d54de75120f32e3c137959b8a63eae8ad6775163f9f3ac9fccb0f18c1899edd1aea560dab68e87dfba89fdce4b71d66ab420da10644c4c419b2eb1996465dcae0a64b3e9fe4e8ca3f83238f1f7d87f040fb6690ae64feaee2b74c54d5d0027b66280902442357736a01d98173d251c795f80de13ea4c89b2ee31d026bafac9289f41a157df211afd5071af6e156b8c550258c513366454be50f4f628055b458c055c8041403e4347559c68b967121d589275c6e18d22b2b871497e260a4d52b8ded7489190f45ac0c2a894ae3b93817f22da22a62892e1255198c3ba90320936ee607ed8c48f0025d6c5c1a01da38a6ae0b572f3bcac31b5b7ad88898308bb7d0eb36e825d94aeb28e7a39868a7d437e6b789a41eb4638feace5fe4ad7ef8bd6001da2fcdb416a300cbd1cd3da0ded7df9be5167a0bfabc37c49c2d0b27a438cb91189980e8c948674dd0d2fe12974e14a267d625791635ea46364d21a22db86b21c54d22a2377998691f3d3ef8fd80d31aaf52125f62a68d3253e9204aec33b4a2acc41756c8af761942b8d7267703c09cfc5ef20678cad16b6c4985b080f8a0a68c7d58a3de6e0ae8832010bd5591241663f6ad97c9cc363902d0f9c7bd4515ef6e43ec0d6b33d22ee3f0f8c29e7047b67d2aff0624aa03406ab2f16115934aef0f0e77cb11d82adf255fe82cbe6e27c16ab1450795c09439f217f0d14d33ada2df44ef997c983040be3f328aecad76cc57b275454c42387d9d5ed3412904b022074ce10f0c7eaf7fe87eb02eedc314cb762162cb3906cebd1b9ccf2b9311f0442d2a53585865e27f7abe0775099c3fc655e46d1cf76b8038e6fec6a6ac012c8eb31749db5b8b83da7f42d7fa24d22af1bb45c4e19641dfb1bce7a99cf49759e474da1980b72a56ececdaef9b4b924054c66a4583f935e291f84feb55e82fc47fc5cea62642c44d1d6ee19724cdd518e3e7fee8cb031071fe46c45d15a5a1e663cbbec4144a735058e3099fba83f3fde6b0ed4e565a8af7c199f5970e24d73737eab9905b31a2770bf6f1b6ffe1183497002c7a0e6affab3e5ed8db9d8031a80f3fa498510e5e43d7b911faa994a258e22c3a45c36eed30d5e6b9e0ccf8f8a853f615e678ca72e56e79c00314ed01a37f93dd06261979d7eeede3387eb8918c0dc86d890fb90c1b325a398b4e4e37f57d73ca91f269b66cccd8dec5cc35f6868e99b7d51037e3661886e11ac3fe0dcf8149153be0e859264aec5d559c575e02750500d87bcb51d1954fa0806883ada2e290cc291e0975fa47a7a9ba413628e08edc304da45c274199c44dd0f1251a4d8041961cf7dc6180fdb0e85ff4c890745d8bab27c449623999be5b2e050371327604ce919a321634c4894d947b1e3e14d10b9486c0ede9fad956932ec701afd9997739305260c1fdad29678b9b4e4aaf5e47315ce5d0b8190ce05ebba4e74d04cc410e9930aee1e4c2a5c6f47f56185635046edcb84fd496a82c26b831e184b37f628dd7d785a51b73e370a7c7447377545908dae3187172a1c0335f3dd43b99e42abd876bcfcbf69f78e48dcd6e8c3988be5108bbbde8bd830274a8c3acdad908c6c914a0b57004268835da55a768065b1485ae00acb85b605b9333c616312a0241aa67c0dc98282feb13efafee65a64a72aa0654c5f9f2a63eea214a54f4693cbbfd00f4c4d06ed2b54bb70ed87d9717ee1aced97f385441e8a89ec5bc10a2633549a971fad9880e29de1aad02c240ef9129dab6ef693c20e2560c42cd1d1dcfe389580c249bfbe680bf885dc8321b82624b12a03c5a8a919d912bbb03ffdc1dc9c8ff8c2194e9010ff61f6b5d49433a692ef38ca2a74064989af0ccde514034132d2841a821ebb5fb9d1406107d3bccbd641d28874c072da3bd768e00bb300f206a1d06562a4365b2b98404ab25285c27c28f9f7b3dc7034c0873cfab7f7cb3c2decc450af7ae185622583b3b6505e9e4f47e6a7309ad76f5a71a27c4195329363a0cb657b98d807d187abbfafcc16064ea6980cc0f83ea569861bd949a7248317afd7a415fdeee1b22b50f8e850a9afd596114bc27eba1187051984f9c12daa042aacfab9d72c35224c603bdc5b21537781576df2e43e39240876077b0706d41805ffd4873a40e35c5da9c1c8c914eef7ca884fd7b1ac7eeaa3ce70aa43b8335c3b4209263d63c0f58bc948c282b88490135d933320d8d183ed2a464f34420995000a78bb6839ebf1bcaa146a4aad89337f8209c9bf075c82e1fa8db8e6969af3566d35f57411bbf550b6e6fcffc9148428ae5117b6d02bf4a8923b3e1380a07418fed829bd4acbe1e38c55ce26c1d2d334bae9e07a4651a71c484777d87f10d990968f36575f2784ea4f0cd0f8e9246fa42701b0402a69e9d986cfd6edee404f7e98a91ed93aaf293a9f649b6a50af268f81e5b9b6579e70c3d9ce6635fb5fc6aff0eaab5c747cb8f9ed182f314e09e20927c02868d48250513fe2a771804fde932be6d1760249032eaef85a23f3253bf1c548a0e9361b5fe0b2a9028f42c742f333b2e832500edc4c069406494b73833bcf3e40724d20df35b19b6d2b929954ebb4fea068bc27e69ce6caa62e6578d6bbca114847ab79e64ea998c1dd6a9eac558918d543aaa30cc0b4c5de86306fc075a6420a5101c92e1b2a92ebfd3726ffa5e9b6ddfac71e1afbfdb103a5d806ba7dbb790d8f1fef36a69d56fc9e9950b4927cb7217fd8da9a5bc271ec390401e9f91e4eec80c76be2936c49807a3d94ae1bffeb5c87df15ab1bf7693a3618dcaaba7f4604a0ba51afba6552c9a33ab9f13aca27259905f815600efddd4e0030d96ee0bf74b178ce080c94434de40dbb6bf04044048d448345dd05b45f820f7a760b06f73c130fccf25876b6388b15ba247c27d968cdb836adaa98b82f48d812f4d599935beb008c8dc9d404997c1b6f804ca93dbfbfcff0b0cd608ff7746b122fea1da60ad723fea89ebaac3286155e04b9e012eae94b569908588309845f12bca2b9be365fe380d3e98da5307dbb353072eb6945ff655c26cebf26444fd10c00e383546d6d211404c598d2676b523f49053b626f8272e4d068c272864208412ae49aabafe9f56e75fcd547e97c96bd3307fbde5421d12e52d9d6c6d669a49900f4190b690c01f0c2e418088f24643a00d7fb9ddce7ea320805e2201955389edf1ab422518c75dac137c9a4449ec4d23a81a3fd02c79d22601ce2938fe7b8d2f3927f8566dce876b58500f2595231090b54c9e4b3a8410abf173c73068439152072f185ed278bc28ad47887b977d226f92ab8a29911199ccbb65bfd2f0dd9d3581cad63dee5368527c905b34c6434b4b387ba68052cb045f534442b94e49df118959ebc429c16e10040ca9a9e0e669b3adfd3086082df0aaff50337ce00e5711910f79c95ed05e94ab67a5d55965bdb1170f81859039a1054293fd8dd14f02601fae504082d908f9486513afd97afca1eb81b1dcb005cbea767cd119e4cafcc6e74b62bf37a7e9a8370811374fba04b6a912ca29ed3ff63a8b51add822871f0648fb17e4a750c40bfa916c0a548e9dd0223e9cff699b1f9f216fc9e1e9085adceeac80d63ec072dc50c836833dc595114b3b2cc36d3b15f7f7ea1297b3fc852faf2504f21852558f0685c9ae91fa9f4f1625fb9a52249a0bd86f58f8b8ee8cc58f772f9ba691f3bc686d700b3e705744621eabf7bc1c3bc4f2da1884d3e4b37626d773fe87f78009995fed67935ef43f076c2acfab23cf05d810dc5cd066eab7ea156a92e217329834e5a45c9794c5bc13d8388dbf93fc722a2c22b9fddfdae4968be65c95943f3ef779bd131dd5432365e0c1211432af849d7eb42c752caabd0ae5c1f74ec03a84f4916826626116ef27fdc438176e156e29ca9bb48be5cdc3b0616384dd4d18fef79cf3c81b5f16156bce6a264a9c0fa70d6c9aef73e810b62f42f9325b44572e6b821e009119c2812c72cd9bc35dd5eec52384d81b475ab49cbc2417fc29202a834b29d1fecc1e801c00c570fbf22fc76cddb20cb2e15efe2431ac81ce43ed65d485637efde8c3b60831647c41a8f48752b0fa5fcb545fa430e10ece04022a763928c57179ed0f2a372ebc02f87f3d1cf5e7b8f19753897bffdc816718493dfa2dba5576b0633113fbddc676828257367edff49b8d44c87118ef8cc3843a4d70d5d6e5e708e04c1eeeef81b07ffa5d209c6e8250447a70dbc5000f7d8ec2c89540814b747ac9c8f4ea0e7afcd35a5cb47a6cce5e0884b87c6f25ce2b5231f67dcb063d316cb4a0ef3e90bff1603fa8dbab80b8e23da96c59e7e092c8629e0ffb0456d5ea79c942075430cf7761cce6b15df754682b8083722bc13b4fec5343a1f5235b222d000370401c1149ada3ba24c7c202afd77b66da081366d53e6b0138a8666fcb1e71065955589acff3f83b345caa06ade31addc5d851839b23eae1d0ced161ce58bc01ff2417243e9017dbc5bd720b65a791cad5310fb1afec0f4f5ee38874120aae08b53ff6e8e52c006c6cf69a0faea55de3df53e89680f728e05863fc7243914929af05df640da11a37539bd9a4affe8413840ce6e0fbbf73776e0f86aff94231f1cdf82601db51b704df6d76417b8e5dcd1323601a24b822fcbac4f8d00c027bfbecbb01180f429433b8b84694ea7284eb8bb4f890a8c624337dbcdc0f653a0920d050363a1c7d30aa3c1bd61409347d90c190e0b7ffdc6ddf1e7098e38d0b824666ec9469fc069d93e61e2b9cec2e4e74dab30411fc8fdd4fb6d866939ae10b46fceb9b0d6015328b9a2a2b34f7af1a3a0f4174a14e0d6c22aed401787aa2dc24a83dac5519e59fd5bdeadac8ffd83bec3f2fff864b07cadb52b4daf20ebc85de8f0516a7c5e6b75605685347fec7b3a8ec1066b9ed2baee0b5762c10f39eeb4b6e997240bb0f0b40b37a878b11bf4e4738f9040a1ff98997e8f95e5bad3d6669a64a0b82fc2d7b257637867ebc68c2a6efbe06cd46fad94fa2ed187269932c06c493922e0d7a369ea81cf217e884f33ac835d74ca5b774a59b685ac02d2063f9964ca765f0d3c452e71e41f84b4e26a3d8475faac7d5112d2594ef3fb359cd643c3e5dccbe73971839adfc82e21f8985114506e135641ec1b779e05df103cee5b5c3088d41f70813e448c967bbb806f3d6a302b83bd657dc89d259438899b908fa46072459d05ad6e60a926a00328781a63b97ef38e98fb39e352b9a3d177d4a4c118ee1aaa86d47dcf187eb85e362b979aa27eb628e433e912c6a5c34d605bd5f5e3754ebd3a579e9ca2586ae4c1d18c683104bdcaaf1fca925ca2dffa4dc361aa0c54112c650aaf6aa1021267c56c276746644af4371c6cdf559a4697b1f0d0ca110a024046fd4ac3397523067b520ee5967385a9cfdb3d822ee04770e9245702247e0ceaf85eff5cdc9c26420a8b83741d0ec9eec261cf96c2eec62bb86dc75d7d2b56ae613c0eebdae2bca0ffab9de4087c820f31cad314e320e978d2b26404b332b245b41523906213d274c97f482b6f2f6504197d2a2f5346ff8141fa51c734469857d1554802ab1d2c39582890e6fd99ab9451c8c23dc98f2e6b8c230d65675c0382828bbe0ce29e61e912647690c64bb377cb279571275405bca9c7c06d7d912d5f396a741700ba283d3a70521ea4b1c38c7d11ff51042202b3660931263623a23c93fb73c76e21a86a47d055fc5ca2054ca046fdf5be565cb110eb7b07e164e53458a32b3aac3522b4d01d42d4f865440fcd423ec0e068169d34ce5d1e44dc34d62af369c2b103bb3dc2eab3fd94aebd20c42324c6bd52d586d931d791abbbcc5eb97cf450b30d74a5353edabc8993e7c7160b2b8dea6724457eaa0338784bbe96a20e9c10f86147e687266b52f2ceb2536c55bd84794612164515fb77aef3a62d5bc89b527506d966b32554df4097c0857b48b21edf3bc741dc660e5ad7bce06b7b4ff95282d4ecc8495a14feb3432355cb47771f89f4632d119dbe75c889700f7f212ac2d9d92013d4424b8d985969e3c62ad9044786fe4c25cec8adb8cf505083bb498886d55c70db6cdfc949c4a98e911fc78c5de93c787004d4729d9d8ee8ba79121b6eee0b7793d98d9ea512030d011ef5615da01ee7b15897449a7e688c329b6488cb443e5c220bd1b909729501ea2a607d0ae46c76a35940f21f2a9fc0dba74ec5e7bb0400856bb81eaa97a7ed92806086713ba502ffe4f3ca0ba26fe9f4b97dbc06d947f9d3f7190b304ab52f96c0c5f0b6f340fa322dddde99fff595bc920de61de62e85a216d3ad613bb84dc76c7b9102258ed5d180b2b8b6a4ccd4afdf13ac1cb164ba4a7bdc8abc5ce0dda99ab833c433df2ba4ab73af686bdb4cee9d039e6428aec45cee01edb8be7d041045c9fb44185e5eb403f21e84ea877b018d5b554109f3db4a5b387b2e854cc9f38c61ec2d50e386c753b0f79e53ef31c38984c547be810bc5970645a1e3c1fc790dd4fc0905d9e853fe51f25512376c588717cb9a4a39156462fb28f79d9729853e68ce14b3ba5808df5bf6686efd68b79a39f44514584aa516babb952b9ca89360b6576f75ae1c76ff1f9cb76ee6a0b204f1b10f7283b027a00da981ddf48193921f9c9367593f1cd25f44b41d5502edee85087ac6b8e1675108071af5c61fd8fcd7876a5cb6c0eb5a7695f75f0503850a1b217c3331c65bf154dab73028ef382a51698bfd3c53bd89320c0eeba07d9f7f9c41ae2202244e8715910f1c74117bc96901b15bd5bf9c542a83cca65d004ca8492ad1d5c95d747041804c00b0efd9b9603f8c7f69b4221c1708c8bc816b0d9f4ab913f067a0a449437d6ee7da3cc3e7a8252c58b484230b14c5140d2c5e5ee32e4f56b5fdeac760efe08f05e78d803e36ecd6c48ec91489e203682008241ff7dc008818664e40e3eae4c6d9964cfa16be15d501d44b372776c13c63cfb115cec033d9b5c6f7b8044e4adce03110ea1860f859a216e014eb9df27ede8fe97f128c3eee3d6d0778799fdc5eef92efb5b778d85615d8ae5cc0d40f9d8291078b87e486bdfcc364f7b18db7e9b333c5d94a91cd6629f6194597a57d8b892fafece67d57c627e8f0fe6f2af109e8c1b6d473b59b29efea81ec935fd725398e4e3a99d825a80693c8270db4c6fb26f5ed82202bd3fe7dc602c07163a8a55e4028b3b5fa3744a7e0f9c70350989dfea29bafa9aa33fdef3e188e539889216fd8c322868bdaad1264dd1e4e2c0f3a09ab686020b6dad5efeba6fa688971f36b77beb03171b4439d4fc111c67784755ef0d8f9696b4f0b5f6ce921b27928cac0e18727dd7e7cddd4ad0fba7199ab5f14c56e55194800d40fc9d66ac3d800ce91ed171cdc48d7d2a53a6fd7ee7cc0648bd0d61b16c7e8c03eef96b1a228933b1513f4b4c877ca02fb099864fd59f23baba9abc9916cc2da1ea7e54c1f13ee075665946aa5b6781148ff308e2d41d7fd046de664d5e8281b0190b2c1e0f89cf77fe7bc398ffafc7986643bf3c6c84b347a81296f7a234de87d9adbd3be1abe4d5cd73b49681da914cae19d8ffc979739614cfd8ea622a3eff463e2a16de4977ffe59e20cbba6e5ce51918e40c5d195a20560ea15226c8f6006ec92998ca77e3fbc3e54361d39500329cf6c12af8a57926299f79e073ca3b3825c051b1f156d5c6c38a7c3ace905cdd5cd1cea47e09663c6334fbe4fc0a35dd96f3f850f2f38aa7cfbc09f0c996123cd496caf3e8503ecac86dfcce9b44ea017faa85b7b306cb63eac4f18d618a53e50048c1620621f196acf146e89af50ba4fd2d40ac5ccaf7e3f2e6ff1fed21f56400658e4c2a52af3303751793998eefee0f278c59c01bf583aec3a0981bef5305ec3828993ff8b95df2ca5e633481dad69163abf24198bf43751b2c79abe9decf041bf36b8439abe3abb91b104dbe1052db4be6a156c9baba72b60e8e799df01e83a01d8117dc322a3b739d8180e45637f2f977ef75f8250dc207cbfe04fb1de233e6307e3ef09636aef8342da36d14bedc7bd64e1a9317e47d4f4b7e05f17575f52922ddc02593f7c5cb8d2ffe0b143fa76c7b2f77dee547575cc5302792df1ba23da2b42be5a64429479a402c023093bc890b88930786520783b8f32191f856c5552f2993cde3886e8d223d0a41f8937e09858d87178eab8b2ee3b2417dad603b0f1a1a3e969c5d53e2da682a75b5f3244065a0d9a30d55371e7066016c294006fcb433b62795b15ab5eef24c745785f9d6237e7f688cd9778f9283c81fa73a63f1e56d3e7cb3be29f8d536caf1d13977690ecbbfdc7f8b2071a688831619f1d42dc548b4a93dec670aaca055ed78a3ff2786894045545c94815dc667074e992fe6be31b0bf2fa7f998befe7c69531c4a3dc3e751c9a899be83441e01b1504f6afccc054e7daf3e346a3c6d59fe26e91c8216a8cc0cf36bd9bdb3d2601c881a83c6e3a328e59259423ff46bd410ee31deeee240e8d6616fccc9271fbf98c398ccb14eef09ae9230b1cb10c31920be42c268121ca03cec38040ae66699de5e9c222587e3f7d2033c54ce603e13eed7af036cf35adabfe773d052fd7827e6b71828ffd2d0ac7e5429a193ae239f90553f821c7ffef986e6c2dbfacd0f376e54ed42ad39728d93d02a5782c03078b779bbad35e3a7d5f1d710abb309042a6c179593c4f433a80a0bb643e62fbc992f08d86ea3a9e8bc6511d05ea298011ba7bc6d68a6213b066d87682ba5b16ecc22d040370e11b5ddfe2125d530fde53540f6f28e416a60f37849e8cdd8f8bb03175c0ff3bcccd7fd2d7502a5ce74f559c825fb5be93ea1f518ea06152863ce825a25f62fa799dddd9a64207d5184f0dfdce3d651be04cc63cf9e1a012b78a89ddcb93e10accdbe56aba59982313a0e416c5ef83e0ae68c50ff5e01aa9333d31402afa54703532f20ecc7ca1a61b2dfdb7d0e4d12e41b2e1623a9416d9d4352cd26ebe66242512a1c51d1ca49209be0fda4180164198285a620ecc182cdd0dca5ee084ded325c4c73eb13cd62a722d718fbb7d8b66eabb23c37f95e83cc8db68ccd1e52a3fabefc73105691bdca7bbacf7e794a43508399fcf8eb225cf918d1934b42e59dacaf71020a5a76b6fa7a38822d7d4a890434d1081fedb9fc0c397aab28ba420db32106154fa830837f85b4692854e9d440d25643f0a1e051e4f2b8ef8f62860c93ab3520565b96627ac70a83706ce6d9a30222111e16f466103f84cf9d3123ef500da3ef206e9aea22b769913b3801d441a74a84aff77b0ee9ef5efb60841d226fe3a8138caac2ed850a66bfe1c87e3e79fb65586a342484e0c98175b60b6c57f7486474769ff7fa734851792d63fa08ff54bda93270522c5f04afa1dc4ada3f79807986088797bc47d80e5ff01d2a12fd2a779debd7f9fa837655dd3bc779ee5499cd1b33c0dcf2ab34fdf55e0a82bfbdcd5d253efce1b2f6d960dc762ed921e4573730706e0a3091896d16eeb8bdb96e8f65c7c601d46b1dbdcd8087295fbaa01af43a6026835e83a1f4c43a46ecff30ce60dff7c1badc6a8c314f052c0a0c11008000618289846071f2fad5acacf0f01e859e78f6df21d5fcd71d0f1be83d76d2d5dc2cfbf0948c170993a65e62d7a55d41f46ede5087a93f3098ca362dfae04d700e95ce609f91550630212df80bc50e7fa3978f7d42ce53f42c6addbc9c6d077f73075d6ffa88b5553eec6a4ff83093370982001f5ead5615cd573aedc7f9476d747f0873ce76b83caeea5701071ac06f357d2eb900fb7ad14a37726f649c35f73e08afe9335fbb01503c9f0e3d162c5ee35fb58a5b63e331f26f62feabb52da8ece02b8b319f6865d465e9f57efe4e08ada9f02eeb52353cb5fd25343f32115e685ce8d3fbd8daae759f447e334a816bec2bebfb72f8d7b2c33392c207d81c81a9b672d17e32fec5dda4577068ff6367cd5ed1ef59ede7c92b91503855be08643f71183dbd7997ecf97dcce397f95cbc94bfdb6609c7398328aa805a6181529a135877001bc365ca2859234c03291979ee678b9cbbbb295782dbae5789f0d2fe7089a0c5cd8272fec1b7743bcaf68b11ebadcfbdbfdd0b6134bfd14cc3d5dbf71e88ba17756ab6b96fdd1b61e64d4b18bbbe9f0c589f7e0c661b39d1b257b88d17616505998c83d6ca39d1c4696e50bc23f05e98eb449f957258e553de5cf209aed1c11770457e3f19eca077f206e81cdd6907d88fd76231fa5d83c7ddced2012d9865bb3c66f114fedaadd2e31bc95b228008afe157109d3ffacd1cd757cb1f88b99882ee5a0537ee7d352e7ee71b15bfee6e67f197db4d76e52f23816eb0dfe999a6a1f685087900da4f99d3853f4117c730ce745e8e024e25494f6a0238fdc577d61e83763edb09c141d67df27f3648a067ae805fb0ebdf485ee8a885a1885e335531796f01d02753fc3ded3f9fa3762e54ea6bd5fa42cb005bae3d5c0a80a665698682e6c30b4116a1c24ef0c2318504828f93c6299eb19d5c6178d5f57003e448fe3c179452fc7b496af084f32f0084d385b032b08f0eb44d89581f4a5bb497e2773ee455d5f6d3c2b93fd71ffbbfdf00040fd0c99265ef4ceace8d0fbee333c1a51ac62e0e6907747c6cf8eec86a76962a9717536e873c07cf0c2d3d034772fe9389ae9c8920ec407ea6c8f6213a81b1d1081bf66f5c1cb238ebbbf2099810fd204691e96ae1c3dd8997915e91b500969c120136f47124a1ef50124cc95fc9f49e6db4a8b8b4a652046798c1d23959582484dc3bb4c441662fc730f2069f6631de546e83aa6a284bfafe30aa4d188fd3a9bf12af84beb159703f92af9672dcc3508a9ab1059756918f3b8d5a295b823e006857d5ac2a8bd830e4eecaefa31039ea4c4c54b939e895f35619818443d4d4af0b0fa6651d2095d050328454b6ce08957bec3e08397c6aae23b121c0b598e464505a3e0bffb9ce4018d619d5d7592c742268fa913efc12e5dfca3f25b73cb88e86881259244c690e08c288b02384831556c1d30339462e095e51172128634fa2dae00e3f52ab927b8a5bfc1ca3f2df072485045058ff29a95aa42d78021fa9e9f89ec3d2f51c20f0d0c708ef984826209aee8e71dccb87e1162c05700f7bbf1295cf71e97691c5f57c7050ee5d7695e0a68e8ed2062bd9db0652c938dda80ee2c2cfd8de436dc0b5e76c0d8f8f1186a9bb756f2cbe83aa739cbe34868892ebd11cc8513e5d730d39c81502e7e7859fda453c2b2fe6ea1f4518f93bb5ac5b10e2016279c9ce1c660e6c90445c1a54dcac27ebdcba2d670e636cc64e73d50c3bc35dfeb2a5bd8ddd6fd28cb7b84d6b361fd4cca2a0431dc6432c2c997df3e22656086f78ff2fb65a1264c5970cfa7f69e2b3e43589e346579f7525c1442c4525596c98d857c05ae7958b7ffa54e36455a693768f9425d892bb41f1a49e4eb6300725db003dec8f7629a63cdd692f775a50d269321305bf5087786f0524aa0bc12ac2568ca27e5435411a54de2e832f803207d388a6a556ea9007f7b021a92b72b089009820f7d6b3827e9b8b7c5f809f356a5eb780d16153381f24d492d2e8f00b95ff304dbcef4944bdb1a64d0f43c5ad180c37123e893612c4dd61d390e2cf41c4659b38e3846ff4e5d4d7277cf58cae35550e70bf14d855d95f4224cd70e6cbad169cc7fab20a340f504e1427bc609535c802f06349513abd19042b135b31fdabf51802d6dd1c77b7a1fd37de5c00cf5538c38e452b6981500033d690dd187a935632ed168468e2ebd35548188f4182beaecd7b65412cde7a8da723f8868fa691cf701b9ebc094d6b3b76f67756ce8a9fd14b7caf20b689bafc9b8a8e37db8482126c0841c4379ceb923b1cc2415dcc0b13e02e878ce261caed002ae8d14ff771ee8b0d7213f630d240096d9a681a044e22fb7107cbaa6df2de363a28187947cafa440d20140ebad983b748e4b7b7df6bcd12f1f445bd65e6b487329b9050fc82305e100487058ff5917292802c490c76bc5afccef39e36ee6e97403df4aa529fccc497b00a5d40cce9f26eb9850f37bb1654d009974ee7ed8950b4b47f8091f6974fc024a6e174fcff243001eb6b41411d3d96e921eb0b8000404a0b521aebae9815f7f155f6c0540dc00040ae0494191e0e646a0e784bf5126547f0c5950a74afd4802644f2cbb1f1da03ea7efd619c0e51ee1941a308d18aaee81f4dffabafd9ebd8592a487a09ec4c0d2f8c9cbe97ba03fc00c48995f0675c3c1ef53ec7f2548b3ab0c668ebab011207ff7dc6903563cd4cfc435eca454e050987ab3e5dcc8bf6da2bbe33bd50ca630decb8b46f5a04e022c78bf8a0ce2d409d8c5ac77a82b119137fffb1d1383c8027109b9415f42756216d0bcc0e1f302bb96b6aee7c3f946460be2a73ee2784a6b3c86c83689d33722609725c88f0602832da1bcb87d4487c75b107880f13ffd4876fd5dfa0241e016eb74259b721ae097b870bc2b16963f205b544416a3040aa1dfae42dfee86fb5cb342f681024d9d59effecda549f77871fc9fdbc4791ac9236a855f11e795fa65d112c2b306a4af1c8643a954fdb8019a117a02e3405ac0f771aeae3c45126fd89314a1fb74475063b795b6d9687c13430caeffa3c63f5ec164e40b7b07799ae9019445d604802d479f0ef387682d70f5b5c7da91f1eac15dab5a943eb65c6fc33bcf68bbbc6688da6380792d7569680bf434938e2542dd1948ab2639dfeec8fb400d5e58d5e3df035aed3510eb6702a51f65b43fc641771a02150e4b9f4f9740d2c8dcdb50d82c18e5400681418fc04260a19ec2da7909d561be53de21c65605cf79995c1d40afe71364e8bbcd896eaf2a248cb189153572f53e00db2154b7d0a5d34b6df73c5a92a5cb77b70c654a567b67fd7abe07acfe6a39f53dda3891d15caa829405e914a099412f533e1efab7a11a5b1d8dbb932d074f1f761e6aadd5a0379d85ed371d6cbf1be84656567870fe2a822e4185ebac455d82ac032b6b403fafaf2304e274c1b00007e63c018fb79a42c575203591c3aa19144f6b34c40273001e885653cce0900b47c592f1c360c9a884d4626f972115e85ef89657e089b411135c8521a7c3e418dc383969b705b58d6330a907d40f54152c7ebad4828632dd55421ba178ab414b8009dafd8ab92fe5f23938fe415ad63e27349b788fb8364fa5f39b41fa4fa447dd554eaab7d21311a3cee53daf657b4d97850839dc39f6bc45a41a686556e251dd48125f899c1fe7678544f08c2c5f00733631062d70a6a9114afcb801dcfc3995a7e5969c34d2d29fc6d7c0af3565bb7b3106be3d139b3a4e9c6d2679e27f1e9f7cd2f73363c4dff93ac580bd3c2dd50a415a620272420f6772d7c8d3a1f017a4a03ea095df1f1fb09594d43967d36d4a47f78a6f6b2f2366bcd09a02267d65f237b632e29ececef168775c5e07986b94d2776e11777c834f020c3d5f6764f6ff7e7a51e89403819b1fa3a686695d98c7ae5a0cda21068730a7e8e1e21929c97af4cee597b62e9fa648dc6455aa118f88c3e6738db1b43206f1e162d36f68dd092f05500ff8b9bf48230c2e594f589f4562d1a5cb88d59ee31c459cebdcda455066f74fd7be7eaf43f1c709501388b34f5e3a5a17f2a38d6142e8e4abb96b0498044dfc461e88ce418c47b6e92803b67db5fd8617a963b417d7c08a77f431dc4b28475a4d49de25d2861983ee03b3972659eae6a7f9c6008b4cb2f2184ac8960d16b7331fa01a011f7b8a2d44f8c5ddb317be9a03ed86d19ff8b5fa020b5e9b32ac28fafb4daa754039446102a8def0d8e5ab127f8902ec9b3488bc54b7d475968809aa28c145dd1f13ad2be3689d19b24c7550433b5d6c6e6c962e276d216bd8cb17ecb0acb54bf50c92ea7dc0905441ab0ff7bd29deac35eaf0cb896effe3a0563445ab84d963d60e7b0a1441fd7ac1a372c9090c1d608c9668a5581c3c06b14e1316a5f746085e6876f16c29388bf4398b2b92e9fb0c0bdd21a42d705021c4ad2ed10436da83a09e99f8ea8275f96c8f304b9d336064e555ac1c8074992c742aa23d5c0b06e61570364dd8d64d8ba1c21aabf199f87eb7c4c646c86a1447f9627b03947e2c0c67547e201feebd8986b13108744882dd661b24154f765a1312d4a12fe8212455c7b825a665c0fcb6bd306822b8cf2779cf9b3424e72e1efeef7305a0124146e309c0e6cf8d1d9610021b798e50e8860575fdb0afece60349e704f47959dce7b8b061f93e496eac6c1acddd4e9af441b81469d202463083daf14383c7eb2b56e5ceb8a5b44f3482135fa6c7befa2559760cdb584cbc03c630025fa03991121c14e7070b8251c295c5bfc9ceb31810e92ef200f6c2c1c1c570cc881444c5d129abb4bf2eb23166a389e76d60ac51dc8f09aa25b9774e2c59636bd60ae529632b324600f93fee8edbfc199a310f4a016b1372673438a653d8166c1339f3031d4d7fa468841060ad849912d86172b4922d10b00dbafcc422a5e563199277f866439dd6d60c5ee1164bbdab3735ca18ddfad168b3b085a368a83e06ce1470f7ef76a25aa53408c24158fca54f7c383f00052f07cba12247c0718a1fc91436e4359cab87e644f7143c8fb9f51c018c866204b2de629b596d465f0a0a1c9ff9e7dc972d9677a064e87c9bdfabb2f18a48075e42b2b53a2b37a61c21ff01bd1aa3e7b0a1279fc127bb9036c8f3c86114921ba930c245e55359e3280e3e13bdc4b7c885517b07b51125dbd1676fb3436ea74ddc8e37da24b7c8e12f8392f7bd2e3e3a5e163491b491f87d8160654becc32e85744c231040ae35fcad92ea8a972f13871182dd312a5c74ac09bf2a5d9a82f20a003eaa86d52940397c060b9d9d3be6d3df86818aecb03aa73abb04c6b9a99c5a2c489ab0fb49a84321b95759dc6d7406ab0c47b912452f5d3933cfcb69f3b66607408a6a0a0464fa8d87bb11171716a23a5af9b721ccb250cdd490515516bbe698132f3d6b9d16baf29e22d316a25c431564cd8e84a072f2c0b76fd325168b54651fcbb471d270679008ac61eb63d8ffe37e4744f0c25e955dbec1af1c1bc26ca79581ae0afb0e6aaeac6f307121714145aa1b89b88b87df5288bf72d67e3a2b13b49c4dd744ad9443d781b87f4a87bc52a2c5becb14bc2a6c53feb65ffdf9e27105a69154492b39c06a9cd4e591e4399f8dfebe4caf6d6acbc8d58182c489a0516fbc012491a8080418218ede8efcdab3c79c4d206ad878b673ba0d73d8d03b3d50166c2be1ae9d0763cb31c844631856be8cb679b41db91fb8de2df4801884ded10e1d7a717f162fe0e98aa591a05d0b272510cad53212124037092e4863e81321bbfce00b8d634a1c4c405c7f5f7d17b4fbd09af04e0a86629cda631aa4a645626311a450ef863afde4d563456f037c1cbb8976e26244206443612ca22f62737ef3adb35fc431a5038ecbf1178d88e20944bdb8d0a0de69cf7831f17e58fbf83823c613338ef24b7c05c81bf734664d9f14de44b164afc38a8b3abf7496b10659f2e9dd744a2ccac766759e01b79b3b66184b07f49be273493787ae30ec7fe73709928ce07c863131f5da87284d8188d2ae6986b8fd963dfa01ec76d517e486198425954c8235a747b428b24bfdf0e47f7a37dd29a0eebe732bb20d74a501967aec8f36a69d03ae0c9e3a1ebec9531ef6e8f511d12f586dc311febffea3de0e8132f7c8b36bc0ea0a99b6a13917feee9433939d4586b8c80610bb4dff0d9e73fa7077b7d9c0004c6f9267be79cc6682f9467d81f45ffa1c7520f67b8d39053dee40871273e17eafdb20ff5b8ca0ffc612cf7acdff88d2ed9ec3a48d827f69581b56c5b2f04f4266cdca006fee7ff7820b691de6e55397ed36e73bf0b0d9356c10c57f8b0caed09df01bec56af69aa78a5af2d5af85f555b4adcb17d84a44c520b98b48a26f43298931c78764db1d1dc29ce285f9cd5ab88712ab1e837700c28083293d56fca0174f40e7fcca3db32baa3ea37c6ebe48e25e28d6bcc2183124c4dea1a02b80174f629935193d7110c907783fdace87ba5ec4eb5c3cb2741d0622599649a3292eadd20118bccde5a2bc7897e67d99d60bf5ba8d808d3116b5625a258cf1a8226e11ed6c1378c15a349089300d88f9756b04803db0cb6fe03bb45ac8f84b32f14efe51479259d324148ffc22a96f689c1532a5ef7d2525ecff4a871abfed8b1cd9a3282a44aa65b82779161c874eaf9a8cdfb39c08462f669118df365cee8a6159db22568a1e31d954a447ff487f0030ed24c37aa10f06f5317d252baed0aefb41966a6c66302c65675de6561ff22515998412b22653f9aca04d43b96cb7d1f5565c93a415c501f86887ddc3ef047b6a76278068fbdb86ff9a379416917a4e7c060379aa22f9f63b0083c9882c000df2b2abb2928692e2d07ae5dec70d5f159777eacc1b3fe4e55bf88e679f5dabb2c1ca60b0a781c0f58dcd01f18d39198dc931908803a6fb11d0812591c10d56263aaee0686510dda42373acb5be6b5233cad566bf4fb2248e36ca181a319a378e44863c1d1b72de4859679a2883177abd8e0fe23a5b4f02f652e0fb6408d304ef16f106d5d23b8dbb4691841452807ec2db38580bd82da36e8368b4806192ee5505716227574a9bbc9071c1370b292a14ca3c6d9a849c1f302cf677176441da6b0e09608e5e246e2d174fab979662624dea70ff40349d416b59e9a6c276a906c84bedd15bd79e63585916a5246b32ef474923c5de148c5ba51fd679d7cbc4d32e9f35c0fde99eda3aec46532f1394c53ef750dae421ec2102572250dafa936ac9d0d675cfd951b2def55c4e605291b28132577a08fa231c0d39493b08a0c8db96a7d098a5cb1d43562d97ebfa2f2dcc98a2b2369665fc96080d7f90adec7ee33b32562dbde1ddbbe544840b5427444d6e31201e1db12b2a131c8f2996e47b0afdfb09575523c2312cacd488e2d4934723c1c0a5ba6f32cc3d70b71b7d3da6161b09a68614f62af228bc06985efcc2f9d44b7722ded66693c25fcd1cc09b19939e24f8c0658536fef69e864bc7f40a69b826a4263a1e7fb3e41bcdc4d0dcc803cf511341a33a0aa967109accbd1c67e40375d1bde7292d754c7bfa3631aa0aca3f5f7d8986518d095f5879340e10180785af8be7bf8a41da3e733444b725c2d559a766516a0898c28e10f8cdd750a271f72b005c6f68abb9dfc0c50f2f660a04ef67e48f56a376807ed93564d61797d32cd68d2ef751ce4a40b04c4bef608fe6027427d231308de03f886c4cb03dcdc1ebd51b30a22505d13fb1a0017524277325cc3fb260f177136ab229a06b61449607fb78428901c08c91302415869f9e7ce379a4fb42fd8055278acfcd4aff1c470ef53833b615070ba80787bd346ed6c090a1de8e509b57cb7ef6d09e67ff9e2bc9e00ee7de3a728444eb20c6d685199f90114213b1c72bf8ea6451511667110f188c12e2e14f9125c805d161e67531d31e47b10091e225ec581b2a4390ca8142046bb8f087bd627bd690f66e8a9b95713708c0a6c6244477b61b92752e178b4bf9ce1bc044136f108e60496a0738e36e1c08895e043a3f4cebc7a38c5bdb17b2f959ec1d05cc90a208eff54cf0fe0037dc0d907f04c2b78b2cec92517e4a3c6ef3ba08530da7ce5744634962c46181ebd7a9ed10cd140661cdf43c054e114c2cb01d73c969f64ee1fd216f77fed4c162970801ae19b51d781fd4804a8bdd0335d4a644b02d5e2ce1f237e83b8cc9ff684abfab59ab7f3cbbd736f370eb3116433fbdf3c1a95088a15ebebc87e621e1136cb38ccb6fe4953f34b709a0f79f6ddc8a843f3fc4a327aa9dd0d0d833465bfd821aad4cb07deffd24ee98de01364e6f8d83040a094ba1f23a2af5a967d426c73f9c020fdee5a261ac2a1af29b9ca2e51f3c6cf222455135d0f38bb5800e37606c2e450b224a6e81116b4f278feca2691b557758c0822cdeeaaea2070c84fb8bbaf2b2addba66d8bbb95d5510c97f8dc1773ee6e418951e5e31c1ba15407bd161e0a0b6dd789b386559d745c4cc1709b419c0dfb5236906a8ab56336a9accbae0c04af06aeedacc4e26f695b8234b26e07cf5be2952a318c3786652ff664bb58338ceb9051d023173668e7a56dc9cb11c22a574394b59b224f9bc2ccfefd895e4e2fd377681e6a2802c4c7d774a399bba0159079ac4416e3be9337a7dd29ee427e2b21ba1ebdc1f0e7c3d73b198de2f217fa368659b49c27f99440d1e6582300a7b5d7aca57e644bba3988000f1fc02041f29700b933a44703bda51b1dc8ef91fd309d980cf20183353012896bab3ecb7e83b303854c18e105e8f0f844dd680f12e8239b868c7d83cc395d3949bed6f0aec0fac4fe969e4f64ec990a2dc3b73ba54849f9684353dc5b4a2c94e8a04b0592685bb84ea174c736ba108b015d9abd508ae550fdfa9b2deb4c57eb2aec2f51e151c2b145282ea9455716315d2ed583a0daf7eedad32c07e09670d4992957236b953dab6be3a80e84bb1c5b3d73261a778f824cc17e1ca2d1af8c68b3ec1339fc8e1399cfecbf07a38f18dfb08209e9ca0451a2b55799058114dc33f800840562ad2ba95610efe35be0174c18099ea8d09c04ba698ec539a804efd86f781f32fe4a7fda1c73d082bbf4a1aa81cd212004a13c330fc96a4af0715cf7f50d1ac442e8b90efee38e7f9722ff91f7be7c73cdfd87e11362d85f556657d8eaa7578b0cc0988ff9fc9aa13c22dc202d78dbe276a7578d0293fc8de7bed3dbd0ebf39fa38fc19dd16f8043dd07f22fd5bc9f5a6ebce6208c0218b48bc1fcef97f3a6bd4d277d2a36de93468d8a59d7f4890244dc176dad737322f7af211f7dbb7745069db6d416d7919eff7dfa20b7e184c9c188b6f2eba5d30be27d8c5692a7c7df4a539a6cc0979e77efccbf44566e13752401edaf3fceeb883f7fd23e6436ce4b018c1745bd5cb976650e7ec9f6316ed50d0a718dee3ffe27a8e31671c7565c12f98f16d79c1e91a5eef4df38c5fdbb0986173337affcffb013b7fa11a92f7ba77d5ff957a47326a64ac6bafe93d9d9ba87d6d0400cfec6f873b83d7e0cf38ace2cab662b141734ca7825df1fa0977f9d2e3afa10e603e5689de49d8635962d22587aee7f6976c6b501ee2cbe7cf7735c9faf9dc92db6a7e98619af520bf3b0ef3dfc31e872502d32c5beb3d741a98b9145f1dc23c9be37cc34cbb331836d79a816804f897e7d887ea2ffbccf3c8afa5cc07209ec43d85ecd0df6edd55ea5f99f97b994b1a7a9fac6ccaa1f1afa7cb5f667fcc41f1a376f42cfad7c6ead2dfb87501d653de57cbf97e2b3cc679e739c11fe7a4c141d2fb2b8f5740832e5873f925bb9f3cf383ca0937b95b5fcd36df634e8a894b7b5f0f467467827b8be23378a32e7da3be46a9fac76f15eda18d3109064a0339905ae765db253b1a7e50b9bf43ff541fcfb7274dc8a2fb84bd8dbf14cc603d7f62235362e8d6eb020a405fb33c9fc38f5aa81a6ef836bcdf515985af1a19e6fdf9b61a3b29a99fdced9e6670cc7e0bc6afec4fac87813c02f1cae4c502f7ec18b507510f3f9181d8b39bceab62fb836ecf83232bcb796c2459abbb370e4fcb8fa3e0c894d511823c22596e9fe10efb83f548529be75575ce72a2b8d3d977d1c4f7bfb6784ce48ed73ec2b5e3f21428b64c86364932f46949f2dc7bd633beb9c0c5b5b55d71ef3e66cd54d8c8510fe6799f817af3e703fe9f4b0ea5a1ce06470ec7a1673723b03aca59d074a73becd4483b0fd4fe2a12de1fb93d8c648fbf5eb353897b6f832cfe56884bae385e1893281babc95048a7d9909c9ebc5e70a376a8f28f4364bc1a522e46ceae6d8c54751d64793f1e3f03d21924eed8eb31fb86eb16726ebed0fe00c9f9fd1807416e6e8c5863b8f84dc20a0690cc8033669bd20e43fb5e05a948fabbf5f6704c00d5c323ef4e32680ee891f9109947caf421e84d5475aa268f95b67aa1da90da375898f518e6478332ed2759fc801590622705b3d4b3cef261ee6c317365cb990333bd6c9efd66bc0c3e2b6679592313cc5a9940d6cc84b21664fad82cfbc9f8185c56c8728ee96453ec1fe364b0b012968b353021ac25661dec3764ee0cdc26d00493e017e00370a26441923c038bddd441bf25b92cd69aff67d5238c8ae7d67b896f6f4da6c87481f15650a3858b4e2fb63570237cdf2cbee9f9be92fbb61c4f866fff5553065f6ec2c23c3ecab1fc3fcf420037b28ecc36f28a0d53de3cd98b2b6292027e5caa6e6419cdec3a0d4f4239389f6706edb22114b7db5198ca3606b00f4a1527efeef048fed372ba2a1734f07b43020679a6b2ba4e71207112929a5201e6c2af09163209989c98370f1af2acf22f37853f4d971514ad4ba32b68d5d392113ffc38a774560b983763d746daf7bfdd1a34bfc906241fcd27025408a308bcd51a7fcabef6783198128a6ba8ea2ef5425c08b377054794bb0d2edca57220e5820bf18e8afc9db0b61df8df3dbc44796690044afb4f97b39d701ced60c00c925f80c04f53319b5d5c4b84d3272a86b18abf3bbcbf7d976690594dd795f5261fae87f8152e7631f4aac6664777a3c62a3300d44e92e60acf9f4c637928cd7d03415065ae287e8cbb04d4d8319ce6fa4092b74a791a49bff5060e79f2c3e0c617dabe7ad100dc1208cb54d191ef4fe95bc43126f1afcca23c705aab2d97d8fe5f8177534eb7111f4e38c8b18814bd74d259d599d465609b1cba788fa2eb56d641088c067c8c93ef2bcc5c31880f506c3b2539b09847c047631e833d804684b0cb6ec3929dc5e18b44fd5ccd4f2e025c62aa8aa2ea87041b7ba5362e43a4e0149e386568a9e8e6ed613386ef5b4cc97da98f0a0a9d8db75c0e2594ce67423b423f835a8a4f1a167c3b0dde26d0f15c118a3e54b027853d74e281573c1ef6d91424f3716b9fed3f0d9e088e0841bfd285ad9c67d11f8efe28a2dfc0e2bd8f23c54ff4e54cc59f030a6fb9a4043ae2e1f6e8f3b197270a43bfc048e53ec44f8e2cc941574fd1c9e98676bfddbf9f4207c4c4d6aa04cd8e7c7fe774af9f8dfcd4b6e61a641baa9158f237e1e0c9b4c66b82794620443f39d9f723d0730db5843f7be2c7259f88a29ba8ac389cd8cfe67d567b43e5507836676e0d5aaf25e3c8537c82692a280158996a0b6295aa58af92b30094d911ffa2720954b895085ef6a3f6c719cb727ee82b96ebe577919f76086c603dd769e7284f3b76d99b1e00310d0adf3e08a2dae617af2dd971601e6df9f8cbfcb1dbe030aaf0cae083a0b23b806b9d658fcd422152db27548960295cd92cbe71a4e3ae6db55732d7719135fd0bce7a830016bd2bf7f2a96f2c0d43e9b515f900347edc427e5be7486d3278303c4681a000471e463bbd65adc92135304c90046e2605f1104b1030b33807ab991ef0d4c00f55303598eebc5e3f3bc0756c6e169f9af266f0a791adeea5fa2b7d4a4ae4c69889007e74b885b3dee0b10b2525252595b2a88b3d46d0e64783dc0a82304429461462125e0e14785f82764e5ab208b9d06116ac85829c28ec98e05b2d9de22824f915acf88e8209d4c2becc592d2727ecd5821d80e76541a1bc8a7b79305faad3573cb0e0bd9b03dc74706380f76e3878ef6683f76a0eb929c07befbd9b271abca739af39add65a6bad94524a29a594ce39e79c73ce29a594524a29658c31c618638c5042092594504209259450429973ce39e79c33c618638c31c6f7de7befbdf75a6badb5d65a5b6badb5d65a2ba594524a29a573ce39e79c734a29a594524a19638c31c608218410420861cc39e79c73ce19638c31c618e37befbdf7de7badb5d65a6badadb5d65a6bad95524a29a594d239e79c73ce39a594524a29a58c31c618638c30667c6da553462cac530ba50c529ca752caa0c92b6130c92b6180c82b61d0c72b6190c72b6110c72b6190c62b6100c62b6150c52b6180c4051658d0fdaaafb62b49ab5696d7b601bd7743800c6e3078dd055d57b999e025699fede7bd9b0108e0dd04e0bd477353c18d053715bcf7b4ee475709d3d22fd8eebcdfaaced37d925e9956ba6b1fe4392d3aa50a765ea9829a57a2408df75e014a202101b944c115af44417f250aa2bc120514bcd2047fbcd20465bcd2044bbcd20439bcd2045f5e69029c579a80c97bd28819ef49235fbc278d5cf1de13c04af3cde7b4fd705d57696d5d57d901ea522f4e554557f11cec054b7aa95047dbb62a4195b574a7fdd62b6ee3b817a7da266d6aa9a2207996eb7433c18d132b59767e3414501620200da5f90c59c98205d54507cb4b1b69d7c6b97cc2a060a4853855cb1f6d4218c6f2af93d1b64201c34e3ba59b289654f25e134a9a90a07b4ec3c074a82358131ca4adb5c2abf355bef63eaf6d037af99e5407d3e2cac2559c67c17eb4f7596dfd1e1344dee338adeb60af309ed3c27dabb5f14e65258ce7b4b4542c39612c582bb682ab6413421428346f8e2a4a35266c54d76957133ae6782ddd52b1545c89e690374789c6f5de9b62c67b57de6b52c604dedbb242b7d22ffd8fb60e0513f44b7757b7d2af16c678efbd266284f15ea75fdacaa9047dc8d9b90da9ebb496d44b37e9828bf71eae5dd75570d55534202db80605bdd755db16dd75feb93097d8f0defbdbe6392d9fdb82f29c8bda9c1ccf6dfc694043423a3f3da7208de81484b2a2119d7c744e405a10aa056d05d4cec9a7ca90166a090cef510beb5edbaa7baf8914665edb2aa89234baa76411974be73c8eea272d2448f9adabd0c02441e23d6e5aad341215935645a7ca7b2f0e852826291d8a8a5ad86b5b75dd6b5b45a1166692422d0c0affdc16d4e7c2441245dcc203b48507684bd779a32782175c2eedea9e9c301b6118866584510ba3569505121b541bcb88ea2009c0a3e9830a1e5e98475c783023d5eeb9392104abf7562b1b8738af85735ecb1c22745cd6a138ef7a128210742943ed901321de7b3d2787db7e23873862e63962c373c4e7bd9546a94ca8ee63aa8f72753a4449558618a1e259e1609c6f482d9d271f88e3035dbc264338e0bd15c7697c5bad74768478af49104d8028c1043653d4a050a3000ed0cc4103078d1b344f24e2a5e3b2ae3df73240e490d771d9a67a5e60dc87b55e1b06230901223481f46188217d1842872155bcf7562b58cb94e35d492f437230440c678829478a1428869c0c31b558b0d5c64d26df52719d7ec57ccaa48d368e8375beb5ada2fc966a0a950598b8cdf4a37f4cafcd088ac9d4b5fc51149e0821cccb140821847981e2bbaa052b0261862f528a728a8c5a9ba9a539ede2c9a201d147941694244ea3389de2a84e95fd95bfa4090583387922480f4d7e68e2c37b4d7a78af090f4d76a80190381ed1419133656ac82286049890c56bd610e60c211808614c941aaae4b0d0c2a10365d41000123a1884c9106368c04348100fe8e03c40031457645121051702a181c5c70a573c08d8d0700731a187072343838d0796e42446d0c50c721471c64b94207c664002a949171f9c40c10cfc01476918e0881266a0a2258b3fc61149649824005bc8e8207943863628c0c20d3648c0328c71e2c3d11c422490a1052aaaf06cc0432432e0e8204713629aa06268e4a8022f28c13e319461c58f062c40089e1874b029a4c68713361083963914a93947e81183010ad13e18410b2f88214407261d48e9a9418c17d7ca10c2ca8b8901881f8ab0169b189e094ab0610a9720c46050a692ff4316aea43de81b142089c19234c518274a78c0991392b800f850a9a24c4c32211002d4f09a3824dd7450250e2f91d0c436204375a9f082518c0908f4f0c515508a9891153951841e2123263f70e6830bd69804e992530ad49026bc209dc949828d4568e80209025b033268480520a16c84a650d20017129439c20041850c5198473ab000288298e149980aa8e1070c62b419617c30220404677ea884110a42409732280411c65485062d7c2eb90396888d2581688001476060cc71c90f92933460364ce12b7800cb08a6421476f8a1858b0a604fb2f051435701135e8058e0855ca304fc8545cf0d89680089265eb00dc831f412b3c14b0706868f48ce68f0aa80110f8ce032c50edd1d5d04c122098849f7c41f6280f0c68b8e6ea5041a4c38a11b3a1b08a4c3853019e86a7e84e8644055c065408518142141c4823ba275011f8a80c4076e57e0e6899d48ece0a65cc22de1842341604670c91a250e84d8030c1b92f621060f41c038408c322c21a28523305d1e4025ea68b0054c085588a0c6e303031723ddb6042d0211d704a228e0091b5708b972302962854c0f3b2e2d0618a263863c878b0336ceb0e18c971ab641c818910156298ead8b19343038199cb089d94ec268d2802236ad831c128ec884d92e08a408109c318394961e4c3e988104da8f9614640c3982921b6a68815101c88f4a8c926895700502e6146e8856930fbc58e387352c6069000c07d412e470b1c80895cc78802085b0be15585ca04a164558f2832d394b7421ac2ca909618c2464dcd51b149114dc98c48dd503c694a1047e4303ab2f607c61c30116e0b01a810d1a6c0527d4a3476ae07861eb241c5100863e2ca9a1c915473d0cd510e59119474148484002650b3c4a80086aec3045233e301ca2080dd641080a60f882113ae59a7102430d8498aeb4d0a483e19403077588391a02060d545b5439b3c502d51f4240a4ca58b9437585c98f006420c711d5cb900df0c06313a95220e38f2cb2f8e14245811a4662b450c18b14078c74a0040d0e10a59e484013fb122b5752471e03d7929c00a4aa224ea460a0083c52343dd4c1c50912018ce21000021ca10247112323c04880689103f860a42171001721a86087919432662004005676f89150724422303081ff1adb0f1098d1c5245f08184a3008ea86213e971ee21043027258f041a8e30e4986a8e0040f82045080888698f66470e09fc4490ef10de8c9e10248de58c4ffe451c78f50a781df400b581e3b43ec7441d018c11fd602dbb930a2857fc61f5b7a92a60110fc22d6addc9dd7236bb8d12f9052471025e504efc01f5bba5449e1126ee68b18cf124692bb8680c011173aa8c1736a00d20881620e0e0059c54de41029361d2208423162ca612f0102024a40c8b3637b300849228767c58e5f721043c7e3415372a68e117c412dd06ee4ec4819c2cb1d9a8833150d06cc10d35e3a1f32382881442b600d3b44d82a61a32804354c0e2d1c51538406085c72a038c244110f3f59643c8ce0451190145b8070020892a20370808b06c7181f4019c2871f4713a01c417d51004218c9f96204140d4144b1c1174538d415170e49839ce1028a0042d44c8b115cbce0c795a192215c6a78c18a2657c42690411c2fbc003034a5488f3b5e488189151c2c3260f1c20465584d02d1197cb1c3062e380c03c0be94f9594cf9b2451b5f6038e18f2b111884f5855e82a5491f5ab87c7970b836b04297e405037e1820910c805cf012811aae98a1a3870c5eb42c1301394ed0cb0272a020085205161722b1f1728818a6135c50838c0a416d1472840b414cd99940091404e1c2961fc81441a584285c00c1c90c3b5d2ac18168110f6c00b830a509a2319e747065c0a1810807a42b93c00348222c405021020ece64212a00148bb4a1411906b410c82168a8aee0208e16b6d0a13280304368d1428c8a2085249c232dec784944912950d4684100946010bba253bbe471c6036e94a1247489a28e40b00d51cce8b24d4005c9ab62812e597f30e6d5a32e4cb080d1cd2f8c70a10385282258c38b20b82461c9001861e2903fb8740c740a28c0076ce0029f10011904c0f95b4840e68c16c8c839618b0554803d6e1471c916229c28c0890d5c00c716175238218e06fc64b04584382e39a1e6218021475c70f40510800143661882451d3104606068072046f628da008a2116f478a4f405cf21431e4000013f9001a6132a648f0d5a9340e2454802272d4428828d198466a8b205143c389109f5a4800823fb8820944119137c79c38580203e2281ed3cbee0415448f2e5102dbc6409eaa614e0035c66b02008852d82d822045a8b202740445101283f3840754081889f401e070072e26800134469e10d2015081cab8c2d3210edc00114c81c7903e8952a80a38b1a2b162e70861f58a851c5b050c4111c6ca1249c61a1280608066c0cb15820c1051a310030148316113c5142122656b69634fa780201cb44075a7ea88411161aa104a565e80811f418814a0d5a3ed0c60844870a24914511282a4007074ae04216313a88830a0c922865b9818b3b161180061864f1f1018200a7098491a5140514303b8a20e227100f6e18011f3b54fc644102551011c816fc206565dcc1c71b27fc5401e20c168338d17f0290c58b27070927b0e08146140d9c11c30116282c31430099921e2caddd86204348c261c1596c1061c02422c062c3a978f89a089f390e0093c245a6031f240679e1008f74f1c4872332c8206b3c62c587ca1e4fb49890c15a619219b038c244119715dae828100d8285002b8cd11203d17282152b107180080c1c54a2b3020e203cf4a0c105e450a11130562b3e5a28a85046193d1a446006a8820e7a0361f8b0240d1558e8400016a0a12ba142072fd0e0040339439c0821249679e24c77f2228711be00a38c97930c4da4584468ba71e2391aa3911d2f4d9c3060c48d16e698c1e7ca1e12b823920dce245d994204b136fe28a3af705f48700dc08121574ee0511c61c38b14576e70e00112322a1ca0670372d44142e9092f7a9a2800193b5c541df4a43298648e2493203db38ae6dec08203cf25742c91481e32d8f09c99421010782e4086070264841106005a05e04109c1480f4ebac0e18982420bb94c10896890c43f4850081e1f68698c60089504647083e64307c00c72490e359a9016908c216daa6602820429506a88b092486c27a9034c8061258c29356f00a24224566c68648e265838f0002b2b1860903b0261448b95275c1c2016461029ec00d2659022224e783b58a8c132fa39f376c2502e3ae451e6ede8b09174ffb0e1ed5870240205d0f7aadc71461b0818f35e15282019425278af0acb00454071af8439e4bd57a5a60cca94810cf823f0c8816740c77befe96439d890822430bc14d8e8e1a530440a29b4f052c0790c68e4bdf7a885c909c3b00e14bd6792d2012daf033083f79c10f2defbf29ee421815eb3ef9cf741e4f17a2f0f2f795cc9c30416ace5f380cfa5594ff2c8c3c97b7840f2c77baa160c8f131e679ee9091e59bc2213e75f5c733ac5f108a2c8f5de2bc2c30b1e41efbda2229351aba5fd6adbb649bf542dd8f67225713bef35912186d8ea74fa1d493c9ac9297ef5da309af79a88497a2f048e0374c4c2bc3786035dec18f338a22776d8a15d54925e4d909a84e938affa1d0cc8d4552bddad563a39394fead0e352f1c1174f3650890682a0038f2f72d2116d95579eccf114308794879ac38d189cc38aa792318353a670dfa318bd277298795d0439b01c213c91a3e6994e30c164ca292a8a5be0960cc0de7b35374de2e8e1491cf8091c87e89449b3fc4b054717efbdac83ed277070a62e270c0e8b0140b257a74d5260dfd4ab743addb3fcebf4527149f197ae8201d405da28c13375da64c219ec79e49657cbab784b276e7903c78b51756e44a0c9d6a4c5f262545d67013016d862012baf8d36da38e3bdb7dab6dd3d0ad4729b8a73a53abd6a6dad967675da15c4061aef3d0e0513c274ad4dcb095b6ddb5ea30bb7f12a6a54f1440da297c13a934efda811c27befa561c47b5c960ad0b1d27ce35c2aee817a90b7c269df7a2f0915a3f6d47d4cc5c36d2faebfcbbfbadef22b95e7dcb6ad3e052830e53dfde39374d058e1b5ad823c4b25e46160b42b4b4b757446236744714696977df1f2da569d94de521db9e025eba24ce92dd51194a2de521d159d01cd882269d53a79ae5d41da6adbb494e15bde95e5ad563a2dd8e6626d3b9bebf57f541398f29e5f6d409d9c30324668a9585d87e3fc6a03d248419c90d04b55a563f9970fd35b3ea8b5a9c4a8ef89218067ca61b19e84817aafc90b5fde7b28974be7e4e4e4805183add27b2e25b482ad52a7826c951b92909c481a284e240d04279206ca1249036189a481ae44d240562269a02a91341095481a684a240d2425920682124903e588a4817044d240372269201b9134508d481a8846240d3423920692114903c588a481329206c2481ae82269208ba4812a9206a2481a6822692089a4812292068248fa0b0b9e046212f0e205225e54f1b2ee8598ac53f9f80ee5c57c2f43f23f48fea70b46bad0af8b8c0b49de7bef091778bcf7b2f7de08ef0917483ce162bf37c573ab6ddbdc132e16f0325514cf4179f9a02de0786f0b14e484b986b498218b04bc275914e03dc96200ef491613bc2759d438e1364e4ed87b4de87b4d662b0be7c3acb6a08ee3362cdbcff6238ff8e61361b7da362d3aada1f79a506992bd9c9c2bbc7f6d615a4859decb7969939c3093e9b585a9628a96d6e681545ca898e1bd292889d94aa7ec3efad6f6e38358bccb57717e4b90ee3ad7562bbdb3f9206d3edb86e2dd8605a1bc9cb0eea5da39392a9786a1ccf0f1c48cd013331ebcf7f4b6ea90ba56cee6b61ef331bdf2401aabd348497e059d27c4bc67da562edf5b788249c76565d828d3c57b9dcaf4a48c9527652e78e2c49828a8965fa15c2dbf42a1b8ddade48475af960fe3f54bf7265a7842268f27644c54583c8662f1d86bdbb827466809704eee67a49853211c1e201c497f8850453a9aa7df6bbe67ded86ece73eac617ebcf2ce33e4cb53f44a81752d0fef4f7c7483d87f8cf6bffdf50d98701dafd916ae8b5b6f046dc51d07495dcce2c2f8455d2adede9042d478d25ced2cff9e5853d75236ac6a883b383238423e483c3fd161bb90f33b39850e9be3866dae5d7f0de9eba91d3290e635209514209adc63df26b73ffa91bb95787cafea5e2b8741a074a180ad71f2214528e666dbdd14f19fd9fb7fa9bba1125a37db1feac3f44289b3ba4fe626f65d77fda78b32c93f4e368b1a4f65e6969bc96d69b6dcc586156ab4cb3d6ea0fa5de9dca9eb94edd8823d48393bd583fc311f2c141b55477722fd7f4dcc6e90f114adfcc461fc6af5031cd4a4035da56a8150774c239828412a5c011a844c94c53449022c2026408247c1025428122c20892b57114d75d0584208208382184400208dda3bc8a7b91f001cb143df751dcf6d21e24e0654240940378dfa140f0a083d2011403f49646510e48d8a0538550006a0f5042c093d886f4d2000104c8c05669c2e015f3a60b220803c0ff053b800058b0560022caa750af968a73a178a7627960c10815741c50200d30c1c691e0447bce003749fe08014d22ca1b710080ce0326118a8d04a1a6039a88eaa898f7e0b57008173172a0f12cdd62c2458c3234a8e0e94185199d77b300481e0981238d3002820f2ca24822881c624821840c22482080fce1471f7ceca187073a90071e7770c08e3a36a001393210071c1738f3861b1668838d35d448a3024d28d0048d2667bcf7487041ca7b72431befc90d7bbcc004890a9e1e5104a1f37e95d76625a8779d7bdaacac60ac1a598869eeb58f66b57834aba5593c4340489b4f8c276868e33cd1508c6728e814d32d958c51db3b0f8f8c511ba336a6450b8dc9190ba3b2c2c3c3c3c3138bd1989cb1586c2826a78c516be47fbaad2363d46e568686684cce582c151ba231398dfc4fb77586868256302c412b1896211896a1a1a1552a682865a4bad25b1e69f319c2311b71cc466e05c352230b46fea7db3a432aada5779d21ce288cce50504c6369a9b0b45458362c68c382867450ef3abdeb0c0571a9a0552a68280869e338fd73d469d64b5565b532f23fddd6817142492f5595ad0b96710b9705cbb845a7a5b3fdf4c8988cc9988cc9988cd1188dd1188d81d1827c8cda18b53130dad0d0d0500c8c46633d3ddec7fbf4f40c05bd7cfc0f18ada7c7fb789f9e9e97cfcbc7ff80d17878648c5a1a93f3a557ae9518312aa4201e1e1e1e19a356c6a8a531394f3426e7108ed978021a0af22dedf3e29d6fe9955ffd0f4b05d918c30ac0d4cae963634bafde7322c205bea57d30b51be789e4a4564e1b5f7ae50ac23226a78cc9496336d2988d43413886bbde7cb08c5be4c431176b474e6ca3518a77c14629de05dbb875c172622e8b8d5c16dc6ab55aad960eb671c382b08d482ca0de7570d7416201612ce7c9f396e7a1f6a5d25c92beeab5fde870ae7b759de55928ce755d3ff1bc3ce702ea4edf03e1501bc27b4e4070f2c1ab3bb13c8be5594e4c469c66799651f7ae24a1d54a0703ff4adadc734e12f04f5c15ae4a6f692820a48d4b09e9578abff44e1227e4bb95f64f4e10e0da7e9c1c00cbb8e53d271e50ebbd3fc9e9bd3fbde7a40327067828271c38d9e019713a2c8fc549019e130b98088d11c418408c61f4ba9c2293ee9c949c64f01ee79d3cd1e0bde7840019bce704830b6c6e4d095e1d5e8801c5a559b1ae42bde764004e04e05d4942465a48c3326e09406fa98ea800c38fcebb9262407527986042b5fc0a882fcc7cd1c37b5fa4deeb8cbe30418caaf39ce98b0d5e278149deebad9c475363c3a4c966c469cf3b2f4e5e5079efa9ba28828b4ade7bde88d35dbcfce0a29212175eded8820b271654c0b58004003459c451ca220d29ad8d890698a8d18b7acb1799562b9d858f6a8bd7d994d1fddb589b0f5e57d8c0c833d22f23fd4aeaaca8c28a1caca06f654a5a6d96ef3a9dedb95442c5982af478a69c2aa27826dd59c1720aaae2022a287919152e50717aef75df719a6687325390f19e9f628c147494a690e1bd2705258f090f13274c9a5492d990808e6723871404908289993bcc9c31b3849920cc68335a9e190fcc6060e602334e4ca6f79e141b2e2623fdf262545d52aac3940412e44bb5a7506be2b61fa58aaa87423199ecacd5d628e180474a4f1cf25e0d4fdcf0c4abf54495271660a45f167440bcd73921c8ea67394f98c8e2a15ab0ec83aee33a1f46a77a4b2f72a348cd249318e957d1a98eb06509f89678e2bd5722f381572263c82b9101e495c8ecf14a64ec78efd928a1871271e498584a34a1c41825b81242a62b9490f25e29891224d1484e12412471e6bd9c2454495879af171525e1e415959038f31e123d3c1b406cfc40c204244278ef25e0959060f29e491715151d6143e9880a1c61c6883f5ed1df4c454526d37baf8acd214754f0de2beab80c004e1eb5469cd64e6e9cbc26af962a857acf0900de73c2c489cd7ba7f79cd438a101aa92c379ae32d2ac965e45c084085c50c422459c29428ba457a988a32282de7b3108054fe1111a9ab353a90ca136474e188ad3613a4fa3d1e0941ec0c14a9b79ef6daf44c40f0fb552fd297f9bd25bde440411113e44f8bc2831f8d2504c56b09c822c5862cc9931488ce96f0c1421bcbcee575b7fcf6119c350fbe5fcd4aae4540d91c710560c81c410a921a00cf11ce00107ace180d87b6f01423c22040ecfca8f66cae980d803881fa6bcd20f38aff4c306aff44305afe483085ec987425ec9070dbc920f1578251fb878251f9a78251f7a98e082d2f740df03f1168c875a1e3979a83d5d6249f752b1543e429c3782fd6cbefbd0e53d53f7aea4977fa51e60afd4039857ea61f5deab0140f7de4d258a7857921025b17e72c1baff1e68e5b7f679ef060b092691e49f5cdbe673c4b711f496eae89fdebb894404be5b79ed53ae0d12d47b378fbcf76e42f0de8d2316b034c7b3da78c031e53cbe43166f07d77ba61c534b654ada7e1c3ba460cae17c07f3ef3d0e4a3a74d1715957d22187f74c392d980e47251d503a9810c5b4bda0984c2a97ca45430e87bc95dffa2887204c39a6a222d3cb1bd138c901bef712f1ad0dd5a9502d9f7aa1fe86ea2dff26d0002fafe3b2064879ef997a0b07301a41220f468e0041073eb088d1bbf18abcd20f47aff4437fa51ff42bfdf0c22bfde0c22bfdd0057643d10d505e67a93a1d6c30d371190e251b4c78ef3120a7d6d080d7715977930822ef7534ec714869062f7c06134a28c97006ecab610815604a3258792724760c630c5208218308f2de4d2080fce1471fefddf0b1c77b377a78e0ad3caaeb780bf63bbfdafad563fdb4430e491dc8e37b203ceee0802b49c80e7f5307b7719ca6574343433a48ce939c3c9e5a9ea1216a79e4e4190aa2762848ced35010b543a7a15310b54341276a4f2ecd7191f314d358a8e569a9b050cbc3c3c3432db5d4524b2d8f51b775a8e56919a9ba24d7b623274f4c639193a7a5c222270f0f0f0fcf8b03132427cfabf39c969387dbb6158f9c3c2b95df9193c7a8db3a72f270af6df5da82b8552a88da13b775a1f6c465a1f6d45b3ad49e86a83d0d514b2db5d4527b12f3daa1f62466b543ed897b6dabd716c4ad5241729eb8ad8b9c272e8b9ca7ded291f33414c4f240729e8682c2a8acc8795ac1b0c879dab020394fbdebc8797ab5b86bd322e749cc6b47ce9398d58e9c27df432d8ff7a196e7d5432dcfcb875a1eff432d0f188d5a1edf23278ff79193e7d52327cfcb474e1eff23270f184d4e9e21dfd3e37dbc4f4f0fb5a7a1a0970fb527ff43ed490c188ddad390efe9f13edea7a747ced350d0cb47ce93ff91f324068c26e7e9bd9b0d7c0fa4013a780bc6f33d906be3acb06ee648726d3b41be67b552f1206d5c8f5f6dedda382b72bc54ad53926bdb59ad543c481bd7e3c5a882e4c436e2130f0fb527394f4372ca69e350101eb2d1c6a1207ce2e1e97af3a1f6f4de4d06bade7ce43cbd7c90ef09726d9c9538e0c0c0cd055a43efdd9ce1aa88f13fffc455110346fb27aeca7b376f7055bc177af9a0f76edc78f99e8db3e2f27e85f76e2cf0b27818cf11df565562fd14eba7581792935a9ef76eda78ef868d352c71f500c8eaf5d1a5b80f3633a61c4f80adc894b35ac17ebe57c08d1a6990d06ae4216dad28ad2457cca35eaa56f79ec3ba0abc77430134debb39c38cf76eca98c07b37646c30c67b376284f1de0d185fbc7723811b2fba78ef868b2ddebbd1228bf76eb0b8b9c28af76eaaa0e2bd9b29a478efc6cc4d1450bc77f34499f76e9c884013efdd304166af36781d975139a2e3bd3782a32b474c9e29e79b29c1d0c32bc1a02527c7e4f2fee8bd9b256e94706d5c7779bf826be3ac5479ef039d92ca86be71ff4ada2f554b85ea5459aa8a246e9000802347dc181181f76afc7842c434aba56279579250ac9f8278ef0688f76e847ed8b940c9c84a0aa56f474cb35837fcbe22faf25b609262cae956f069409f7a8fa60025afc1bba49f494410de536f8d28fa050f0986175a10e25e58d88774b1abf05cbb3a7fc3bef2de9ba1a4c7684b9e90ae0085e45b45a5a22e1678657c514483aaa4ffa0c878ef3d125029a02c08838a570aa3cc2b8541e695c248e295c230e295c280c02b853186894d0d1f9a4eea85b4713defddf4c043925fe14bd0cd0e3ac07278efa601177857d26bc382fc6a6b1c6eb0e1bd27c45b309ef76e6aa0e1bd7733830c3731bc9ba21a40925eefdd8879b5bc2b4988d35b5e4937b19b30efdd2085b91182bd07820b48bc8ecba8fc95f762548d945c607285a80a221a88561d977a4da9efe94eafbc77c1520b33745c86726dae521720561ec68365e56f841ef7ea5aa739b8e461cae1b61a0ab87c51e2d2c31866b898f08018e195b65412c416301ab0a5b48584d2960d1e20a5a12cc60ca54c524c27e44c31642a0d958698bcf74c49bb07213adee391814c8f4b28f584e833e514156529059d41a51484c483a5200bdee3501dd00780ba784f4a4e2176d0500272f2ea5aaa120b8aa89e152c74794fb73ca75139efddbc3a0e8c6b6bb16e563747efc6bf9bce3d4bffbc77c37323b4df8b75fdd256bc94b22061e2b6bf258b96f7b494b25c4073fa89e3bd67e2b69fd19040a3009a0f2259e48f0dcc81658f0060e9a284658b1296d57bef4b96b9d0e5ac0291442bf9e4f03a2e3bbd920f7c53c09456e8f414114a2b78e9b86c05fa9e29a7e3b4eb63a102185a0fde82f1c4fac9b754abcdc5d29c50ac9ff8cd97573ad1d182fdd2298b77e3c505a29b166e84ba9c70dee9f9d2153bde7b45595117fd4a101bd699f88fc12baef762d094e3fbc65d9b29e9a5e274a9278f528f95520f941a0a6c79ef66a8f3463ad64f49dc7623c4e4c53ae0e9426d02782c78afd35c4c450a58c04dd0142d7503f49e504e4e57c9c9ea34d27b36615881b2b3c87b9deacbce8a8552953698eca0bd52155c64034649e78ff74c39bd05dbbec8c46dff121d234a3a449474841ecbe350d2b1e0bd67ca79713e0ccd512905328a90b6d56721059a820152b0e03d93cbfb235c6280074a0ca8428a2965caa1b9eff9d5d67a9418a0575b4b96f79eeff40680564281cc7ba6d27b4c986042020a26cf914a2764f19eefe9a5134ce036249b134c80e43d530eea921b154eef9930e56d699450c4eb5b0aa512a0bc0e72ceb4609fa6494e12395d7414a57cc87b9c3e2ae51c1e942ef982126ea484bb30e544819253b27b94ec0813d894c624e095c66cf04a633478a53118bcd21801bcd2980a5e698c935225f3de7ba5eaa566826a2a550dde33d22f5a08cde3bdb7caa92921f1de4bf196e6b62987c6ac603905d12befbd2925cae4bd97f4d2a579e6bdf73dc737a3966a22519a363c93d02b4d9c29af15acfb2ad7b6ad4c523a094949a621c7bcf7e4248104693ac1849c928c49914032e71df1cda4afe85a9baa3319b55456b09c824c5cca6405cb29a85ba104ffa0026306a7f457b7b5a6b03a8d04cdbc2925985aad602d54a72a419a039b5091c494632a51f9e3bd57a252e615bd7c9715e5c0a8acdecb2951b9f2a8704085c9cb61f9952f6583bcf74ca52c8dd73b53290be23dcebb322fbc9449796fb582b5b25f9a32659197539ad2c67baf057bef4179a5294594a65cf9a5294e8a4c3a0769e3522fcf95a4c4f15c545e494a11af5b69cec8bf5aaace945392e2e5bd9214292f897bf19294f78abeaac8d4d2ddca37216401170060899b1340f0011a0fa04173468904285f4ca0608f26514a517ca240294581c23d1e7a687835f400a5974618e4a684d208f439d104191eaee870e5c5a9aaa44a9026114c2dbf6af9552d89404798774224903c2d1e1731893143bc2d5a1e034a38666e72b27fa938a4ae3df7de0dbeefddd89b2ac394702a28856049298445a2987272a08420c6d561d84bbfb8dfd2a95c3a9dcaa5572e96cad58180e509216d3b3d0f85d20766bcbf6d9c90299228504c423753de8d94f77efea672e99c9c7864ab74718fa2b104010178e7dbb18e98c71a2034582dae9f53af23fc72eed48d2dbf426d2d548e1585c2f18708c553f383066df7f0ebf967d41df6deda32cfd2dcff214281a9f1c1f648b9ddf6ca3977d59a0708474e2f353dd4892f855bff8c2feefff28061c5f65a78258db046cb7fee70c36c3d957eea9a1d342c3dc6d15658e98457effa438462a14607cd6f5ff79491cbbd7fc739681ede2fa3ddb3537f6fbf5a08d63440ab594b3d39e6f84b3d21adc1418b5beecd7bad94dbdae1a7a79a1bb47afbafb2d30bf1a7d5fa1a1b340e7fcd13d72b6709b439b5cc7b7e1afdaef642a14b34fe7df772cabab1ae9cd7d48d937bb92cd12c9dd1dafa3bdddb6f6e2bd128cfb55edda1acf15a3929d1ece5bacf9fefbfb1f7e9b38c049acdf25a0fe7de3adbdefd249aac5fc66cf3add54b1a75fd214205d148a2f5bf7bef7ddf5e79af1ca7ae16ca32cbbd5c23b8d9529b71ad955e1c618438c689bf9c1d6bbeebef2dd50a3491681bcead71a47cd7f9a917816629ced15eee7be534eaaa85b22ccb8c74a7814483f667aaa39c59e3cfe97f44dbddd2fcfb8f5ccfee6508b4a9b3ff7c4a8effcf1beed48d11e5f2afce3aa2752df58d596ac8a1ac50a76e04e3512f5e71847a70c0689ea5127ab5749665996d44e3d3f65a73cf10f739f7e6b6af6ac170e442c3c89c92ca9b3396325b1bb7ccd956dea186d3f3d48ddc1646af3e0ab55a792b633420d036d550e77ef39f17d699e907341aafb43bf69cb587f66adf21d04e8edbebe5b957a7e2f2221aae7dd3a97d979a772f79d7f92142b56814d126eddf4fb9f99eddf70f5337f6aea796655de73452f7af966ad3d2adbceac787d9382d59d6bb4eec50325a4293489537420ce3c4514e3ca1c4305a7b31a6fee20e6597d622a26d3923855bde1c31ed9f1fa2718affecbed32ff5cd3a622d348668b34b79fd973347ec7fc5a91b8fb87665199465f4727aa579676fa02944ab77df8d33d6f8e28b378491104df64a2ddef852e8e1963d75a3916f19f99f0c81a01944fbfffffefda636d21937acdbb02041b499b1dede5a1dfbec76fed48d4712697355229a40343d7395b356796fb47af7d48d2b186b0af5ac6058b28ce23b6800a1f8e24a6f95f0622cf39d386aad3f845062db67ff32c640f38726bfb47b578be5edb57e9dba5185e2c07432cbb24c4e5896655996619a31347e68536e8e23e714e6ff3dbca91bbb4ee32aadb472c266677bcb1f71bdef915fe9eec370306e631fdaefdec3597f9fb272fb31aae55737a2925c1baf1147a8274b4fc38746fbe717cf08259e375a9ff7d026cf946e1c71e45e6218f5d0aef794e2ac27cdd457f8519d07b43ce1c65572eca3f7f4c2d48d550a4d07343ff9d7b1d2f8fdf4f1efde5221b5605b0b85630e4d1e5aac15d3a8f7e5dcc2dbab514b7594f1d0b8ddb646afabc5b76b08b79f2ce336549661313477687dde2ea7a4df4ebe6dbca91bb1e45e2e146838a0ed6ee1b75ce7ac6b8e96e56b9451051a3bb42c71cf756eda6bf5f9c33ab45cbf873cc6ba319ffa579a0d68da7e5879a593731879d5a91bab06b43ebfce92cbcd39debfcbd48d49fe68ba34164c07863453186bbd7366692b85f0d77fe7a5fd7f4f254fdd58e7d0bcc61073a821d475d2bdfdca0513827268d5f64aef95f2ce59bbcea95b8362c42fd6cf80b621a67f530b35cfb37eada28943933e5329fd8d3bc3d9697cb974d7e95a4b86ed0f11ca88060ead477da5edde6ebab7f777460c68f47798f1e6f5f78ba7fc336ef6029aa4f3db9cbf94be67bef10ace331ac7526f1f65ae996f4c77ea46144acad5ca73fa86a6f7b498e6effbce1afe3bbdd0b8a1fde8e5861bf7ac73e6726759e6391a0b6819c2ec69f411e7daede6346d685f4368379d36dafa39bc6c6874caaabd8c5547e9efd76b685cdafc61af76da7eeb9ed4fe10a1bed0a8a1fde77e43be7985b3d64f9346ecb1ea98bbbe377f1c25124d0534ff33fc96475be1a778cfa12cb314d0b68cbfc6adadd554e33f298e500fce29cbbaa3162cb583ff6b28cbb28c7b7517ff10a16034686875da2d23e7da46be29fe32059a33346bfdf674cadd61ff19f696a766685aca2a3be7d35b2f3b8d2dbf42c95aadd09441efac17629a6bc450565aa9de3a5ee9af9f7356fcbd18550793dccb354433018dfed9bdedbc62c9fdb4347563126d81860cad67fee5ae1deffd2f9cd78ea1d5d9fbb4d34f58b1ccd7b5a172ac34626818528963d4df77b8add7a817d7380c0d43dde3e75eff3af5a57f7b5530349c299cd9f7287de73cef1b4ba0f94283b0dfea2bbc11ee6d6f4edd88ea54324a60cf3d71b6166689bdaeae7c69bcc0534e1ae1ac94da38ebb513c72f23e75c7a7c799dd8a76e5cad34cf9eb7b2b4782cee5c9b104d171a9cd56a0937f4f56e5a398c0bcdd648319616e60b318554b585d66fb41f466d3dfd99efaa856663f63cc38eefa515c7b869b2d0e2d758df5b6fae98ceec6375b15453d3607161ad19cb7cefbdf8e23cabcc73c66d67d65762b967ea466aaf8ba59a57683056adf7fe98efefb1975668ddc20b6b9c744faa23ad3556a1d92defcddfcb1a7f9e10a76e84315b7c59b056151a2a342fbddd9ededb6bf6f06a16ac05ef0f118ad34ca1cd9aabe45fe7ed319619a272a591429b77ffcd67a654c37fbb4edd68a3a431a3c59f6becfadf9829bcdea66eccdd0b73af2e0a2dcbb9bbce70ea4d6bd6385a807070b4f8e0e0f000e14ceee5daa18142bbf7cafced8edbd23c917c6b723e887b05c5d8e2fceba55d977b754f6872661bfbfc53ea1fed9edb6f9db8aaa5b564d9f65b2ad4fd21427d9a321a9458768a2db453636c65eac67e5b3a5996d4d2d3094dde1ee7a4dee78aef86d4fe229a26b47afdfc72769ef5b6facad48da8158c05a309344c6874ffce6d8cb852bc3595a91b25d2e642ad602c0c694c4e2355156c59b056a621a3c16ca18ffcfece7df5ddd6697cb5601bafdcabb3344b683d535de7ad1cf64fe3ab935309cdcb18e1c41372ce716e6d2bcdda5ea82c6b12dae65ceb18a9c4dd773e69ac9f8c5a1a28cbbc514b7359d6b9b6787f88509d0609ad7b2bb3f4b0ff7b6dd7f4447384f637c5537fc96bce7d5f2334db6797d86ffb69f630fa0868bdfefe63c71fda7d67a54568bbc39febbeb64bccf79f3410d07aafba5efaf7bff5db497f885040340fd0e08efa7fad2d94587a4989d078d59f6e6cbffe77f3e9752a8ed13aed50d789ef8573c70e5fdd105aff7bcf4ce5b4fa6ef9f5b6ed2b340ed07297d1775ef3fcf8cb7fa5109ad55ac6dfed8f5c7a1867d56882d02efd9ac748f59539cbdc2910daf7bb5f4a23e4bdf6ade9fc41d3b84e8df5cf3bc3783f943e6899e36eb5a49c4ad83f2af695577d14caca1eb49bf39ed746482bf65df628756878d032bffac6bafbde5c6abd5337a2ba7fa1ba76e5c8009a1d34093dbd596239299f96e3d48d5dbb6646a383e6f98eb6c34dabefd25b9fba51f2d0e4a079aba787fafe1ee5c4a8ae5d32629a0668b3fb4dadbcb25359eb876d944b734898f3af3c6970d0aece564f4ce7ecf37bff53375605d0dca0655bad8c7e5efe79ae1beaa072fd214275a1b141dbd1ffa823df72cabd2d4cddf88a79ab53b2eb5beae55997d3294e836aa852d21b63c4f9624aafac97d2a9abbc5acf5bafb5a91b5b491d8707082753eee55ad1a0511f29bdb16be9338758caa99aa819346be3c5b872ede98ddc5b1b274a06cd4299abc57ee22f2dd4317f85f3489b8fac2fc4a04dfa35a7b346ad259470422f62a485fae75969ff18df9dba11cb0843bd581ff72469de6f9cf9cddbc3cbfbce5846d8f671a084ad5c2cd5aca818a670e67b73c6d45618ada530520d7fc6bafadca7bed4c2502fd6ff41d2a48e94f679e7fdd7e3fbc3689dd6a9abad717f18fddf302dff9a73a551ebcff5dcfaa561fe25a537d3ac7df41da76ea491056bc14edb34ff1fb7b71b4a8ea585f68708d502a7c5dd7fc4dfc2ebeba730a66ee45eb8e39c0eed38a769fe21425130dad57ce37c29acf05368f7092e2dc2acb5dc774a08bd8e3ccbba6a43bdbad6667f8850a88d42082b8cd3da4c6f9db062fc2fff7ddbdf21e4b6d2ddd2748eb9f77e75a43fdedf595ab758d7a871f6d8ce0e61cf4acb3452f8f78c9ed79c3ff459767f8850aa234dce3a29e6747eb9fbee31756377a4bd0bf5f246d9a250a87dc4abfc2142edc0c029ad7bce19abd65d6aafd27efff97a0f25c478ebfc65aae72b75ac11734fefb7960708c7aa8c26ced74e0aa78cb6562c27b453cafa79fc7ee2bfe3bc455fa37c5e1c77add64bda37b76d1d828f3cfe8efdfebef7eca30a9d578d77a770fefdaff43275e3e415df19e9c5b7de6b2d9591e67ca9cebc624fe7a5becbb8c2d6708f537328fd84dbeeab7bdf72c45acbbfd77b79e6766a0e3f4fddd8b79c22ad77efa98f9ed2edbbc4b2f70d66943679b59243cfeff674ce0cf30b9a9eb3fe58e5c6546bdb7deac6958ba542e1fb45e31c6eadbdf478d33af796b2042f1a8d5efeab35c5de43ed63aabbd6054d7a5b37acdcfe6c7ba5bfe5c3f88db571ae28738834ca37e65a53faefd713c3d48dae8deb11b6a079dce1b5724aaca58c72a6b6d7945d349c65ffda7aab6dc5fbf2d48dbeb5ad384ac6fa43848a5cb41979953866aa3dac7873d9a2cd8e23a45f62be6feeb16719aeddb6f587083534a45daeabd67efe3c6bdf3ea66edc5e2d152a468b6bb78534387f941c7a59a3d4f1dbd48dd873db0ea7b76c49a3fd2142dd208d7f1b2d95ddeb782d95337563aa83b950dcf66df4018ab6461c238e37e63aedb475ee6b63cc1d66bd2bf6943342451634b87f9f3de6ba23e5fed6d48da8ad47799134506e418b1623f5d3fe186facfea36ebc388b96afee52ea09afd590f2fce2700a3f1aad36ff2a2786f5629a7dea468fe3c58221b413c72827b699c65aabbd15fa89b5b5ff47aa7ff4c9b22c9b957bb95c3e1a9d315e59e78c3edb2ef30a2815be9c346c31861fdf6ead9dd5c3d48d495db7ad6ab4d6842bac6d43ad3a87424dd0e3c343319f53eecafd9479a62e86e1f000e1c82d9ac627aed866bb6b84b4d7fa627d68459bd0e7d8ebdedfc3df31c7e915862384b32b0c87fe10a1b0ec68dd7a0d2794d6daee61f73d55e0bcb8c61b6994b6563ba395b8c28c03ae8dd3d261f963a348bf5cf7fb2dff2f6f344fa89efc438492c126118de78ceff454fe69fbe63ce9ab5e55e208f5e06459b44144d332e32ab7d6bbfebf3d4eddc86d1f75c435b723e493655db539449bff665829f5782753fdd606d32e540c670707c370847c70b22ccb70b4643121f9868d21daae3cde0db7a653ebd9d178f2617e9232942bcb9278966599f73ca9978acb4a7b2bd026109b42b479eb8fd9f74f7dedda7f42349927d4d25e3ebb8e91fb4134eda3de5272093fc7767741349d299cd17b6b3de774f740b4bf2ded59db7bb584ff764034bfe9dd946bdebfe7f0f33f341dbfe4bc42abbf1f9aa6955acca1a475e76c791f1acd935eef29d65c5aed371fdaf75debf9efedba4a5bf71edabd9eeacb31fc5a0f8d5efa39b4bcefaaefc7da035ad598ea6975a4b55fbf7307b4baf3d45c474db9873fe63c347debf7714fda33def0633c34fbbfd4b47aac73fdfddf3b345c6fc414ce6869d5f05f0e6812e76b6bef7fe36d79b676689b523feb8651564bf1af7568dd53f8f99e98eabe3da71bd0f4af737248fbc793c74b35a07d3af794dcf63821bd95d2a15988f7f753cb2e2fad7ecea1599875ecbb47ece5d0b2bc77ceeca58e10de2c33a0d19973c53c77dced9d390ecde31befe532db08879677df7b4b0b778e105b88eaaa17a30ae28223e483936518d0249691661eb7949ff2ca2fa0e51d27a6dee25833955b9fd1b4ac356aeda9ac3bd32fa9cd1b34567cefdedd5a2cbf7db57c980ac6c60dcd4a1ceff4f4efecb9b6d2029af53bc6fda38d98467bdbd0a0ce705a5b37bdb857b8a90d366c683ed23bfdfdb77b7e67c76b68f5427aa1e4dbfa3aefe6b1ad4a96751fdb36be6a6895d67a7dfef05b49bfa5f5069b34b40aefd4bbd2ce23e7334249834d05345937b5174bc8edbc1f569c830d05b4f8ab84197b5c3df513f6db001b34b44b2fbc34fe09e7febce333344e3bfebc5728bf95f6eaac838d191abff94e1e63c4f3475ef1ebb7cad0ae9ed557f8a9d6bb433c012d477a6bd414cf1fa184930c0d6f4be9ad915f3cffbcb973a95e636853db98b98f565eff63e662685fc6eb3db7b7eebeafcc61685b4f7e6d9638c77ab98c6068dfeefc67ec9b5388a7c55f68957a3e29f5f0cb0dadff12d03ea47b539be78ebec24a8dc278a1dd0dbde4955f3867debd0b2de76833edbc7f5c3b9c9a0bcd57ebabfe13e2192dac770b0d620a778cdb7acabbfc7debb04e0b6d7fae7d945dfabbed853c0baddb9b27dc3e43bdbfbc170b8dde99a5cd76e62bb9bff90a2dc2a969c755578d29ad3de3606385d629d533f71fe7e518c379abd0beb772f7786d94be4a6a93bef754687be7aab78653de996bb09942c3b04efaebbffbc32b65b4311b29b4dfafacba66ffbf19edd20ca9fe55df0fa5cc77eb2d5f3651685f66ee27b776779be3de1523d940a16df83daf39d68ffd9d5c6298cd13d6778a23d479fe5f794fddb8b36c2a6253a6e21fbdee1657cf2fb778eb59967d54ef3acb549a139270d62462e344857dd24e77a451c3bbe259c6dab89f6538423d38f01662d384a6ebc4decf19affdb342cb8497b3deaefbee774b1b329af5d1ce9a3dec525aae6bf461ec13364b687f724ba7ccbbf72971fd522ba1f52ee397117f8e39deb496b149428b94c778318c92ca3ea58c3b5232618384f6f1d53e731ebbc790d35a896c8ed0b4cc1a5a8d75cef9ca5e5337cbb20c461b23e8f4fb479d77ef556ebc23e0ebce30c6fa2dbf5717a165d9ff9f5e629c71b4dca76e5ca978b2cc0a1b08443be787b85acaeb0338ee977b3f39aef6cb2989a03af64d6bf639739c694cdd88d32f0c87a54a7559189c7d613890763663fec53dca5a39a6f6c2582f1896164f65c166086aebcd95e21bafbd93563cb1ff5cdb29edf45dfbc97feac6d54a73dae2912ad83840cb30cbdba5949ff70f7b1542f3f1c67cf3ee3bce9f2fcc32dfb3cc77ce77364168bfc2cffdd431ffe9edfda91b2b0442f316560921861b7e992f4edd58658cf387081564f383b637f6d4d3dcf7ed915ee983866dc7f6f6cbafd45c72a8844d0f9a95b2de7fa39c39cff863eac6d963c383a6b1fd504f8aa9bf777b9fbad166d90f112ac966078d530ea58ef67edbc968a38356f9ee7d4bed6f859ec69d83a6bbaf5e7b4939d71b5f6bc56a360dd02eae78dbeb35a770da1a2f123638681cc31e67ffb4ca69577ac75b41c57c84cd0d5aff7feb083dfe555f8c69ea0eb5b2c8d85b30546b9b31c3606383cc34e339698c53c269219e35f6bf6bacbb6a3a39ed3875a30b856d0934fb21dc7147bf71dd577a301de5913a35976099f1b4124a2a2d8d95c2bbe3ff1fc35c3ffd51df6b890669d4fae6fbbdaefcf6bfbdec26142bd12e9f5c52dfe1ad30d759533776d6c6f150a2496df9c7376338b3e791a76e0cb29265198aab5e2ed56ae575b2ccb754ffeb1c99a8218186b9e6d44f5b3fa5d87698ba38aeb64e5afd2cb3551e4da2c50b61ed9dfabef587b5a66eb443359268b57bcc35bd9b43ade98f403523d0b0d739636ebd9cbdcf8df362708c44c3d87248e3ed7557da59dcd6ca5d6a44a0c1bfaf977bdf9ba1c7fe6e2f0c89e669c55bf68eb3fdf4ef9aba51de68650c46548c30da2a8fe8235aa63b5229b9fc3cc7aa43a0e939ffb5f5daec7995343ba2f98c3f96144a0bb5bed037a2d91a278e31fe4b6785b333a2f93bebe4fef22a6f8699824093917bfa2bd5726bece9fc00bcd8427c27b658caef67cef7c3ed7fa7d8cb45b4bb3fa4b8c66d3dd791da8a15d1fcfe9a5e8b3b4c44abd167a8bfec9df6fe637f400d22dadf515a4af9863547d963999a43b41a7195bbeb0a7df751c67a7f8850a91a43b43d65bc996e3b65d7d26f8ca271404d219a949b4bccbbdc7ffef8752a4b42b49a2bf792db6d6d9f52ded48db893d1ca41e49432e64871b6d4568a7185b0ea5b659fdaf3ad27ccb2ac722f578d209a8656e7af29855f76fe7f205ac797ef1967c71153bf2120dacd7e730db3bf7bfb9cf5c53fd4fca1f5ad3dc77dc73be9a6ba66d94545197f885049357e68135e1f6dfddf7eeff7c67d687ddbc9759ff7e7feb5cfb2286af8d030aff4ee8bb7e494675b6dde43fb916268b3bc93defdedd4439b7477af738ed5436c2df68016b1c59f62bdb9fd7dda888a1dd0e8a6947e2971e516730db32c83111579a762513bf3d068969d7f7fadf41ffbaf390debe17c92f659691b6af0d0769e18c3f9e3c4f2d66a5337a2ac8f4e952c3e3df615f336dea175a9aff49ec628b99d34c6349d202b3b5a96e9ae739f65626a38a0458f69ff557358f9dc17daa1754ffd9fdfee6e7d9db97b8ee208f5b85aa72cab4346b8fb9edaf2882dcbbf542823d59ef10573c51837f061ecf4432be9f4d3c6d48d351a80564a7829ad16df7e75a5316249afd4fdf71a3ab48ae3a5f1c319e1bc54ce9f3d2f0d357368b14618f59cd2f64af3cb1bd188af1c39464d75adfcc74e2de56a32802da4965e3b2f8d554e2c6deef046f873ac77ef9f69eac6984fc99ca4394ec7188746abfc3bfb28a9e5fa730b8796b3cf1f5b28edb7577f8e01edf74e21fc37eb0823ccf6021ac6d8573de3d5f6c6ade5992a33b433cb2a238c58ca9a6de71cd6de6795dbde4bed0a356f68d9de2da7ad5d520a71d76e6897db0f7fe6326a9a23cea92be483d3dd58add45840f3de5a2c65b732426d37c5b60dad6799abecb273eff5d659e6246ad8d0bea79ada4c7b9d58ce9971046ad6d07a8fdad69eed85985f4cb311356a6856eb7ff3bf3dc2dc6fbfa91bb7dfea92b4962ccb328c8a78a6a1d9dc61effdfece33c5d75680de1a33b6994249619ef75abb2d9d57776c6db4d1efd48ddc77937bb96a28a0e1b867fcfd5ef93fa6b8a66e445559838656bf861773afbbe4fdff9bba11c617b775b4e60c8dfe492784335e59f9d732a362113566683d4a2f6d977dcacf39a5a91bad65404d195afd5cfa5c779410eaf92fcaa5593726617ca566029abd9b7bd827bc7cfafb7367935e128a1a32b4a8a3e67dc7c8b7d578cf2c7b71ed62d1206ac6d0f8e59adf1c638e77da49c5d070855e66bd25ac77f2195f3561681cc6bf73ecf15f0a77cf6068f856b8abac556f0963af5f683f4b5e6fe7dcd6fba3a512d0b0af5d5bc9a78cbb423cbdd028f7f2c308bd8ef1dfbeda3e0fce0ecea9d35d683fc7ff278f3fce7f6fe4b25e51c38576adb6fade7f39d79c575feb161af633f62c3b9fdbcaeaa1165a97db42d975ecb17f2c71eac6574b95aab566a1e52e65deb15bfc39b7b9522d6ab0d076bcdc4fea7da499722bafd0ba96585f5931de5fc369277ca2c60a2d565f7b8f7542efbfbfbd56a165ea7f8713dfd83b8e11c328440d159abc18e6aab1ddf3665c79ad5368ff6bfdf9bf747b68b3dda91b51dbaba59adbab75cab20ce2502385062395b57f6833e717ff4ae3161ce94e8d19ad43f921cd19dfae71ac390aad464b3feef9e7fbbdc73b28cb28a55068df72dbb98d54e22badcc2a974ead5dd43ca14d9861a4d576afa5bf93673486c9b2185191c630738b9a32dafcd5c7be71b47377db2d04c2d9c1812ce068f1c1b92b174b65699aa87142bb507bbc39dc52469a2b3e5ac176e6b27ced7d767670ba6f2165c932ee7b20dfb79fec461b494d13dad635566abbcd30fb5d65ce354c6897c21be1dd7bd2f871e7a70ce58275df67153564349fffefd2cb6fb7a4d55e219fb8c4af35c38f2be6b363cfa9514b95d461dc5ead53952ecd9a3546588d121a87be4a5e65dc1bfb89b12b49484b966554e436172653938426e9a49c5b69ebe63c76ba25cb2a8ca878935e728a1a24b43dbbf7f0c73bb58ff36aef4a12cab2a45796c1888a492f895aa2e6087b259e74d66a71cdf6ca3a739f35f68979d732528ca5a8314293be77ab63b5dc63edabd7b22ccbb6e0ece0ac8023e48393652ecdcab22cbb70889a0868b2560d31bc53fac92bb4a91b591bf7bbd7926591462b6a8ad076dfb94f8f35def7c30cf30f118a46871a0868d1764c29bdf8fbba23dc0fd0f89f1ec2dd25f6b0c66e89d078dd306ead2bec98635c5d1b6725cb5c1bd77bcd184d7a8db3adbbebda7bd57c082d7f0af7c713425c71ccdb015ab4145f7ab7a7d5ee8f67eac67ce2fc8b7b5750966118398a268b1a21b4a87be67bf338e9d792ca9a202a85d0de8ca3c576de79b9ce019ecfa8e4b06a969918a4903184104090863400340013130040502c208e06c3f180a20b8af7011400045b8c6a9e42970aa5f1688ee32808828c32c400000801c000048c71a68805eaec43c9e0c6228abdcc306d12e8ef59889c6a2bb9538ea2ac0ec105fdc688a82539fecb957486b6f56afa4ae7ba7925320251b09540c9248128398e5402ee9f752b618a386237ff88c901258826c525180d4442592748bafd99e5a4a1cae09051719983d8b4f088801ee7a23f1493a1efab325126ea8926d6e6f541af6923e7ad38516708f5c85d5360de84a3da15959fe481f308b4cc0e6c4fe44d943b5e11c224a5bff1509936b9de7875e0a59b1769f0fbe7badb259eb556d399739805cfef632fafd509503cd0517254bb4906eb6107c81dbd6ee402fd68ae5281abbbfb052fc25d5c2bf35ec402f3218b8ac51ae6c7f3134ceaad11d886fc95cfb23d6e4f75a41a8de3a03113e3ba0bbed9dccb73eadf7040e7412bde75ef81de9e37e41db7d19b90acd8c5768feef1a089a73a7eb71e80ba193d2e6fbd7945075eb7f57227eff4f1d089271af77e5b0f77f2a48f779d7884c6fd1eedb076e0ee113b7cf316787825dc25821dde8180403b9d583440b4b036630df90a34ab8959b8940f458ba9afb8c669ca2b80142a3ce08081444550bd2c7e72d719875f04358cb3663bc49b8bf565a7d032174e491b6b956a168ff4788e11d17236c018cafff9037e4597455fe6fb002625bcb7e362140cf265d7d247d67b193ece67fc2f505221a85aca0e6fa9b787778f3ada851142640e8e4c90b683226693656e423c681ca8358a8642fcbdf8c0ead9c8af7466d48ad7d152443bb38c7a793814f129efa165070d15649b814a6283693d0a421489fca3f4b29be613cfb73e99b58fb941718e77f8cc3a36fb945093b969a1db043d14f565f97599b5886deda4d1ef7178ff1a49964fa36d27664dc334c7213ab38f557093d572af1dbc21eb183fd6d8bacf54715853094f7979c3ad19b32c92dd4bb1af18a595f921cacd2cbb3a6b569d557d9abca4f49761d22c937a9d23c1979eb19c085539b88d1ffa02d46f77f29c11fe3d12181727643465cbdd9df7d3e138b12e1b67bc76744627deef59ed81cb502b027f771ef6e3f3e57ee21153bd950ed57ed3a3aae4bb2b1df9929aaec509dcf95999979e6a760b0de69c917b3af714a1563e68d6ca06c155feb81c4ee4ccf5a4d59c1507907f34651be54941c1ca5f05e50e0ff59a653310755c051d2adb40ff7d22654bea0b917e1db6cec6de2da9166a0363afd9c4d156791ee9c4af0ddf8073e20ef9ee00dab67dbbfcc6f77a50630064ea4bc25b92038c6db218c52c2d8408e39c6c49278d47b6171ca29e43ed22ef7bf117c5dfb8fc341eb614971c52056d3457d19d9c36b508368a2c01859fddd73dc2d1106485537fca40ea7e4cf9fb741fc11b8b5d32240d1180f855c950dc8e8f1672b0950ef33671be40e4153901572f7d4c172adbe1993894edceac2231be209630246af4ba6575b3769b363dc82c3d408e53232c4454d8e4c993902ea7ff2821d9e8cb3e61ff54d1fb21dfa098afd91e6e3a3aec982eb0767bab9c0dc443e6d81ce2cc7bc43b1d35ae45320759348489f9bc89152cf1a8d905989983f172b0de93a7abb07b88b732493be2b678dc40b65c9303d01fbd9a89c02c5e500d978c824c2f18b83dcb58f16486d21b8f5e1a5f95bad2ac031e0d9b21d509a05cf9d09ad4051e1cc1473e8bd84c403fe7293b06f94543551363f410ae5ed52afaee565ffbb40633922bae1d5459424e6fca79a1351da356a3d1b5e422b9e7afdcd0936b2d39f75e4f18bc333d0853bb359ffd3d83607a6bb2e9f4d0029cfe0f1ad56a27dd23b347b1dd0f1e905dcd9fbbb7e4f223d4023641a3564aa922c4b744e42e110890113cf410f628874fdb2ecd85d3c404e8c7287a2ceb1e06bce7b8954b57fab6e084497e997aae33bd0ed273344aebbceac3721534319cd4e3b5e9e44e2e4d89194162207444723e585300f0861749769790199800d72bcc5b7b9fd71e56afa4fff57f2df3d32100f73b5665c1dfb781e2843cd01192f58df43229f07ed3b436993be710da416cd82fb6fcdd6f0988201d0028c87fe0033986cf229645f133fe39cc9b1d1b722f925c3beaaf765930a54eebdbe770430ac184d1143ea4bf332ec63bd1aaf1ab33557ff202ba4e398db68c00c77851d245135d1a2360808088838dc509a6ecb2297b1c929c2112471be2e26e6e4bd93821aca05e7506a5c6fbe5346a7c667264ab37c7088025e96e79d77d31f281d1b1529b857991f3b4a2ce11b12c0df0412f24659ed21dfe66524684a990d0276962c9a929e634ee100bafdd220291a573fe8c018504bbe0fa5a0600940d0b3b3945af142d36714189f047e36361567adb16afb345f99da96ff8dc38eb4fc35effaeb24a4f12efcbceddce2ee47dde7127c50c78e1eb2f90aad30722e794f30ab6be2da823fcec9ac5c062018e486583047e341c1af52bc79e01b321c0a3d0573434597231f3e0b48cac5d75193ac6a88600722d2af1d60b3af242c8ee583ea847110058825e89eaad02540740f1c7df76d95a8d54d31db256a627aa1ff02823800be0e61caa858da30ce90587f3ccfb5b36c54bff9ac114bea021ac1a10c83cfb600dadfac8ec8ab50250db370d1738ec72dffdb31e68b2d308bf5b87e51030ef448d5f7216d9a47d7aef462cd04e1d0f80f855a496398aa8e41236cf620f24415a81e4dc40df3241887649122ac7fb7e9ea64d7f89019256dcb78611c004bf61cf00a1d0cb602b05bda516b9c3b261a6b950522f4240ec0ab91ba60ca4f5dcda07f3a514628e3d3c32f288c57e9ff6a4e9073e1bbe097955f0420445f1030dfd60a7ecee9ceff6a47147722169461b39ab8fa0315581c0bb48748fb89194f7b47526b1a9cd15f1968d849717a9ce6e515a72f67920645b5d2e16723e948e05baf0ee11163a10573075cd752f4dd982364743b01991b35ef7ed151e3bde7bdaa1444289321f25d81004cb41aadb07ba7e798ed8ba31afdfb5009543e0ae2e3c6109a1279204ba032bf3adaec1fcc0221174f3dc0243e465909514730fd9ae64528713653a5ab205a2f5fdecebf104be9b5930ab463b0a466c14178e0b5f54ed841830d301d12a91e35db70346e41a371eebe750c1a2bdcddc919a9da76a0a02b39625aac2ed410a744e30cafab36c1c64ca4cd8a71f307a1948bfa235284d7c059952b4b8abba362ae884c6e12ab643323b335d9518fb625625d955123fbb3280e73fa642dd802b435bf9ae4a6958cf1f404d23b7a97b8b43217fb0da3f5a7ec6f2fa0accf49b2be5bc8e7353dc105e7352f4943c5698494d0f23a354872a02d49a716e6d35f5c9b706531b2bc13f959607bc7ff63fe0f9f290317a0acb767702b92108bec76e5c15957084eeb4359685ec1fa3332a1dbe56cd55445380cd51681cbd6e51424fa08c5f2f9505c93826adc7ea795b7063307073cede1d7207e38a63338438a544d64fe17e206d16367c89cfcb1f9c8f0755baf981ee4704948e6b4429c9e5cd21c4b407fcb2b49971731707a3f37242c9a8ca6994d96cc09b2b768273bae197470f7b340a9943f1b44024c4f9046468d78df1a1000b0dd0968926e9ffd07fa543ddcdcaf793fabaa646056e0eb4123a6df3e40059327e86777878d31874ec59acacb626169e4214dc35bb5d9d46d407b085e24d1608643b50ddcd2288996e23f167f1174cf2ceb5c341c11c6de6d683312a91f644211f2c3710436d50ff93523de76718ac22d465a73e8b2e0e91b7910581527e8f1d15356d62eb3912fcad2fa03287f1263eeb53e830bbc5f5b5eb99616167eba5c071896b21470be6a21d580fc2c731a7b1efd99e1fefc9fe9f331b4cca06d16c5981d3c5e484291e91c299f83eca075c9d287be36adae5fddd86554625a402f89e40a083fbe9ee6c910bc24ca098338ff6e3eeae49b89a52aeb977283e834047936944210be8560728cbff5570edacfd56afc82465f8da0b35f0b61f09fad8e24026254407baaa24f4a1f5d58a47b13dfdaee917f0bb82af5b17215b360a8ea992647ee29da827d06989616a3be9f429d680198dacd90c248191bba25d25e268a81721eb0d7df9c1affe607a46e6257fe8946f5c080be2023035aed710c1e1edb601dd145c95e82962cd03495732887da8644695ce35e995103f200c6a4ea437318ab603b5f6c874d168842ad1903a80966cc85a2277c0aec0da106d87d2573ec9b4c8ae29a88027874c518d96bc0b6b14540acaa6238c7aa8d300a61316f3449da7cc3b350c04bbda4246dbd323284a3514978a19c4b7c15ec4cd6c7a51a6ce9955f3d70abfb3908281541522d8c00fdf4c53eef5d8cf550562fed4dbe8e45e2669e42ba27242808e83e4e21a0467a3d83675c8c86c870561183b008578b044bfa8c927d40e1d5541bdf503513ecf4cfc92729d215e56ceca5c5f108d1b0452bea8e6473ad5674b975b43ecea5aef29526ea28f1aff126ba7f423698480ffd2c4e31e85b5373c7b7dd9f91bbae3646319a4b837f44994859806dd9f0470c30688763019513df8f68ed75f7a07f955e04891145b30ee7837a7af13a01f38f3da70626b080da476b2b6067b90afef10c65479ea0330e3ee04c2a219bb5cde88feaaabab8a20ce8bba912f6166666b9bd6415e943ffe866e28780d6aaff377019adfe3622fcf8c31f5534a4b81f8aa43371c3acf2fdfd7341985c1ea2302cb9b75cf80fc480fedcccb16970ecad05c3474ec0d606010febe7cb229633b312c0adda17f140233f6684993bbecf79252813185083f523054c971f03d34a816be38a4ce60eb74db4791ba5e85b4b8296ccfd801045dd0ce930455a42b78b058ce4c7aff79c567b755137a3697f8ddef62ff27b70e1d8de61b452698fd44305530fc945e9f1189a2094677fcd34757ff898e6c512e9079d5edca1bc292d2b41c3d91c34d7a0c8c94911ab738e2e41567534796e2904fe8bb0997cdce6c229a3898c060197ca8aaeaf44e1483d0782c03889a370cdcb56468491570eb8c73a9bb246883ccea621834ee92fee968a64362f5ee1642aba86db8d6663a8f31c5d14709e8ba7cc4017cf9e2288c15d462254c02c498fc1eb050eef52e9145aa5d2e9e37fc2e0e72f511253200b5285821018c007474910291ae4730b59f713a27067150564c2d2f9aae58fcf3581c308622a4c17fd0ee57ad4bb0161dfd68c008c3654842cb020d3e50caa937e08fd460bb6e067cd7126240a21e5b3d4f0803f5ade33fca99ad00d405dc98b3cd6a0baa2834a99a60310a50956b428450ef3e3eddeebbb2863e269102c652c21383123d6526b806bad20c6032186a0074a66515e286ba813262c145294f0c630870659b21124f640df1b176a62735bf3f021f4166aff5b5e94dde26140257deb159652bb8398b47a42568401fcc8855703dcc4258b4da945c1f87155311fd75d33f825b634191b5cb05b5dafe8978c5a2fa76314297ca3dc11de7426e30d77102e884ed97d3635a96215469fb1203adf6f11652ed00fa7900550831e2b761cb6eb1372bf117765244e261ae6f4f7e2d6fddc55004c65ef896a844b4c7d08b126db2ea25781792f7b7dd0a98809b0c0b53bf718da56bbc27fc43d64bfcd505f1c8e625c190326c5d29c5b33db01aebc0f1123016d29ec4865b4096d8798a77f7a4d4e4ff10aaa14634553aec2c7a5f4a8fd4184f525aa709709d9221e605ff28506c78e0400081be1b07b122a4a2691600ceea82f0bfe1170ae2f15f93b683529807579aee7a59f6bdd5a65877a526f4ce5b671ddc506cca7cdb0762cdd755e9ffed9123826ab3980acfc10fffe892c2856d03b75cb1f8f600a5f1ed86601af3a1fa57004140d026e0a10137ec42d81c1ef54f95ed4b0932fe44c79138fee3d74e5b30de9526059b580c7b8fa76e2e4a36b62d4a43c4396dfb95bd903ea34c88336cb19ce2aca0125c4dd59018c13ede4cd0908d0fe72382ba05b0fc2d832ecf5ff802171677313b12cbca4650b9ef1cae5bbf714765ffb16eddc19ced01e40f501345530d4f3a9e7faa30108b60a479e3371c6d4a967cd4680e75c933a1598e063b353a80f488bb756980dcb0cd8a8ce9584846be42cc226eb2285c6a470e6a9b818f4641706472a22857e4f770b1749b4431864f3556decc594f6abf922402ed9be87376a242b13bcb821ef2e4614a603d159806403e986e058dbc64d756b7122e90d4990d29233a4a0e7305893b91dd15964f3e3df763d7f3c60f16f52dec7a6b367135538ec922d333304e295dcb2ccd60ecf3584339aa5d95dd66c0064c5845708241992cd12da7b049d4881803659009e60ea2fb3e40e1135e29b0b5711f4a8609f1a886d25bc62fafb74dd7e457be5f9599b21f407101e4d3af80e52234b2e84f66f43a8a1546136340d770f1cf58a4cc2461c50154ba603c3499fc5477575277d5171304d60d04c42fa75eeed8a39c733680824753312a352c1467dd23536eb34f6c990e5c2fc3dbe8c3da7496811fad2ac9495bb4545b6634ca57444eb9a5a08c37f903caac9324cc9499dbe780195c4b7636bfbc980b4041ba72a431c7dfce0ff22de6a80e84a3f505c7bdfa14917c76ca582024b617c5696ccd3a122517e610235375c09a7866efa9ce54a7e506dccd91d29393dd98b01ca6e58e9cc5e5751fdc32419017c0dc6405cbd6a22f94f9fb94417771d485585d70abee80e4522389f0c0b798c30015a9343cdbe8ed531f2e6d07b1abe1827e4685e8798d44b0f88b1f57a30bb2c85e5319e09cd8c84dc16bf7e1022c3292f81bacd333e47b262e0cde489ab307b753f4bf5e66a4fc4dce4dc81e0a5e2b6417e8a57c7a7b5008187cee58c2925ef245f63c075368d845ff15d67cf9b4aece698c388169e79ca95a14062ee8aa9793a3795997f0afbb36f64161845502cab86dd0b49eb79351035357dad878658c9db4efe44e45212dc8f1dc7679bd0c88eee0c0cd67e92e3777a570d95700419be52f552ac4c91a3b96adadf6b2dcae1f392a39156c8aabeda4dbcc66bfd43e4d64a2e35282a259d7c71efb388e6e6f7c647818a79b243e2a971521d9fe27cdfe671d82615685884536951a75c292aa0526837b7241b7289981803971de709c00af886286f79b3828350080967aa16a7b3bf8a3b6702f76386c88784b77517c6c112f7565793a7d7860310199d633d1a51e40cfc16ed4ceba2b76d3209253fcdebaf2a5977ceaa08d68972976a3a75c3fd57481c2ea48667fcb2af301d88e5936d940646171dc627e254b0e4bc5f2543b0bdcc02eab24e717a2b2c2abeb2cde84112186561cbfa9f5d895ee8ffdfbc9180e9347a944ac67e430c393c5fd6304132c34e991c75b092c0595c6e84fd1496dcfe7d880f2bd4ab59a06c8fc7bbd133879ec43b72ec2cf2bbe5ccbe0ebd7a36fc0902768831cfb3d71b4336424581c9ab2b370746c3a49d8c00a76b493a098c3095e9b958a6ec99088a060bc177d9129d8630a61b2bb4fa7a63e27291b4ea796756d3c17023c068046ea9bfb0bd28fa39be36a5a48e9d47f9c27c6133e2b8c609d50134e4dd0784723303ec9c43ec0b667823b21b2d31e05c8e5bc33c7f92b484437492f0e073a26185483c433b1c3ca07297cc8c7c49f97c88071aaa4fab4b698b6856bf08f457185ebc594f1a4a8f6cd6e70029944e0f04990e297ce5868ccf4e31f52e734cfee19d6c5044a2998c7dc2e922e0600c0e2e7bb70e2ab8dba0cd630bd202cae7a66d2c1c2f27a9b3d113cf1ff46cc78479e105ec6faa7440b238ef18d0f101a6d51be381f64cf911043661122892a32c87b2bf99ee1f6e4dee4490d70bc4d3edf94ce0558f896e97f3da89a3df3a058c956b8c6da5774635d618b8fa0cb952393c0790077a1ea3f9371a0b67c2331a83d383a0514d487057a8a5524a23f21f3ea138d90cea8bbfbf6b14df84a85cd3e6309ac8035531bc17c6de6159632928ffcc18879ea88b8eeb2481379429026911c79ec3e72b93226e1991866f259bde1a99c868ca41ec890f9006d93a4c676fe160fa4f388a0121e9caf6257386037a70e77c1f8549802b48ba5db9dce5a1ae02a5a6558f15b5d04d39d0e247c4764fe0bd6ec0eded5239fdc732ce97724ffb3887a67ec8d7ee199ee43b93ee3c97f8495fb46ee7562776b27dc092acfb585545cb474bbfe85d75df79a5f30a301e6f3b68057e8cfebc0ec1953df74c800ebd962a6a0b490417509e2b9e26093d413c5f33a1d62bd096008964b7123f13d8b23e06e96ec27597ecf5867daf647a7de6b6909cea2b010309e9c515095e15b8787d3a8e1410a00af20067697da602f937f52680d1331000ddba44a3b04baa4d01f4dbbd591baead3b840c81e26a8f44f098f305159259d50cd07e023c3184a269c7d58926969577903ecadb967f9164205304d01b07f4f57d8925b3d978be7151d030ca794f3ef58ca8ba11db5b568fbb82c1d6841ddef2a665c206e3d4ae995c37a4023c0f0206dfe759b1d3e09adbfe22c2449849e5787c955c632a30025b7574349462cf4ee9d631373b2a7bf3633e765b6d428f0ab2321e6fe1e0de33b2e9ebb5eb016064c94e47634c7135666caca8fad6a94e7c912170bf98271f1ab1736ab40cc343652705c1d0b8a86dec5b665361c071d84fa5c5840250455b4b7c5610986b274f882f1d037d7c06bb9a872262e349df0b0fe1cbfa50c837a40f8614094342da721ea56c38182017308639522c6da18b88f9626694bd6c545ca48631f887770e5c69e0bf35b6c4552ce89cf7cffe03e2648e40ab7b2ecbead1d237fffd37c4a272872c7107e09e386f3b648327b6d7f1b1f151def164c5d7166bc27e3c34617073e7519f616f30904869c6e398fa16d264e68a66399292330d313972931cbc4a8ca9400652a6a3221492631a5095e2a47e26a53a86e1347b92980996a210d2e344c80990ae10db34ce30efc50263203364e2eed44a6ab5ab6e0259a192189251e50cc3e48a06915ada408daf698a988e175e5503453e220f04571b4ce060b4cdb41e9fa1e6e699db29be158d301850c0b141d774ce049a62cb19aabe368752c4d2325ef22a551e84df70ead366934f807457f11447256c1aa8161c10dbb2a439cbcd48cf15aa134d107834404f1747081f896bf49e44d31667fb346f66468dd2acb4d380bd4257b982463c80c2b11e3214187b3206710f139e78212969509eed91cfe54ada379dcd83b9014a3ba59eb660ca7f5575bf51d946c09e7d7342a15f2990f61b43d31cd798b4838cf1b36a613cdd0f8fdc8d48ef9d1ba2edf29ed9bf0a1fbc17cadb45b99f1331a282d568d555fa2645fb8564caf961cbd6ca964cb2ca83d40f9982eb282aa0ce61c0c8f09ca73451a7992e470224a2e8a36aee9ed08d9b6f26c879f60e34a367c4d47165450ea9affb0069c90179b0e5b0c2c7132b0e96087c8b80902a7ccbaae8a7363b4053c0cd641c4c60883607c63f7252a12e2a0db46dd25695cea1a77c853988b5cc086f24ba165c9fba01770741146f1d0467b37d545ec7cb81af6e978edd2d88c3dbebb2ee9ba642285829c81a110d1fca9f57ad50c397bd835461bec8266c8ca9c9e7936534706313f4ef66304659e91a1097c165e3b1bc1c4f136a473d8882e8d5cd06b0c41029b58c3d5868f805c3f9c45e583e71d8dfb193432f9009357fb9cef5e28e01f7e4d264f770720c5192e383c38a5986bacdd98f19261b56a1a2f9bb3abffecc236c77757eafec2e91822ec0b340889e7f6bb3b8abe2229adbe7d14de6c4faeae0db996e24b1c08ef0f74251780ffc410b53ebd757142a3562a0b5fafe4be062726a658b8560f55caf4ea492cf3de1eecba9822bfe8d9b88277b52580974161feeeefbe85cfc97bb79264fa08268a0afac6f37afaa913c21e8026ba41feb460e36d84f001db34aa9962a622c97ebb844feac2d6a457b46576e20a8b3f2468472e9a36ff05756718af1bf835d5d4bd4d96e25af33febb39df5413cec690255865a26afe44e2dd5746cc531f54673f6fc9f54fa24192ceadac37be45e63e843987b5ff949ed943d3f4b3a328f55b32791565e3dfb3f48fa41501d2cf6f17144a962f871ffb674a1152e67d77e339749ebe4ed3255a4f9082b77fea5ea65676fb4b20cd0ae6862a5c26f74b6afc2d1f87eaee13f16a9ffa416a68c814ae60893abc7db61daa0eddeb602d821ff26d0fb56252c3cbd5cbabf1c192af4460d2eb81a3343259533efef22fc45114c94e4294a8efe8061a1ee7ef1db14d2a4b36cf131ff15f0adbfb413a6b985eb1a5b90323323e42601c13089631f2a6e57b7208e2c43e29985353fd9553a4ad2458d5dd7f9d53e8406f340b94a0373c4e9d2e6ece05c715e88378b564e278a338c4eeef428fc4817630ad99d12fee5332b5a587cbe7ccf9dc8379633fbc4423a5a1c86f2ed88dd66953f42ff87debcfd3b9f7fbecb77ffe3082c2cef66b2b19f19025a561744f77ad663bfcc28e381947a8367099dd8643959d5a4a4052bb28d8fce241d8b42ab99d9c67c7592a9fe7a36f20f88d97dc3e38660f9b8979e5762b432ed735b0d6fe8456b1b5b5f8c8880472aa2bf4681f37221c1927fc1bdcbc0f1d0595ef0c01209602fc8d607a8b6b10e588fecd3c43d95a9119c298af86b7e201b46b5e6742967affca43e5b8b49d3f9357adca9f7fa069941e276dc286038ea99a1c2b9bffa54a50e2a6a6144b28c25139e529bd0754a9955ebe31a4e1fa382fb40ae2b08d664280a3ec96cf3aa81dcd3607aefeaafb454791aee51cb26eacc26d3ad5cd7b82f98cd63fdd86bb9218075e4eb6cc4206ad691b9d3ad39093bd6c880ea056874c430cf8538096fd2310320a18029858de21c0b522b8e687e7abfa138c2fa796b6a92fbcde3776c7b4d40f551932ddf746aaec648d5783bc9bcc81cec2d6d63b1f5ef376365c082cab80a15912c0fdc428e91f6caf170a9473e30002bad12743a58e9bf3a53b41dcb561d22942b451a96ce489a30f7ca30c48ccbce2542fe2b0d0d61a4b159ac320d882ac531126c8b54fa181215ff0815c7c653120bbd06bbcff7f37efd5a814baf13fe6d4778efada627bce194b8a55bd24db7579e687a961eeb3341c4e3935fdda4707b3a72dc54bfbc3061a436d21b0e756feea8407c6f6f18a9be1de75db29294165efe1289dcb0e45f3e8fd4a56a4de4574e9b417ba24b3c856ccce4bc76eac35b65f51c36a980828b117e890527e0e0dc74250a340df77a09548e832bedb6af0c93a2ded8ed850622531c81a842db58c215b4ab286ceea3a6b3c39fd3f0f068417472de2f87ab05e30dbb8c527dfd4cf83ff35050e0fa6765d845710a5b96de0babf3f1f2e13dd84f204c3fb018bedb9532aa41f1b7886c6646f7bf27c5ee62d361208f34986d3ac54be802bf715b95b3af362d97a5dbc3ec217412f754ab3f4aebcce7124bc7ef1170ae85194636956dc77c7479bf33b9502ee7e1914ef1a0ff374574d3568c5d04e7131a24e2a732fd447415ddc9430e0123457438ac036edbaf4ccb98004275bd0ddd7eed3ba900bf855e289db0e952a23acc3f0891d77ac58313ec7bf8e5e0c3152f4ec768b866399406ebffafe88e20d671fd752234ba7ea7e39180b5e73144b081bd7c71e96f8a244718aa1d76a0459acba2e8b140c2497833670907c9e3324b512e01596f669a25c3532f3865c8c6aaf0e1bdfd6107945a1cbcf1b43a50031204164ae46cbe609b6c533a746fe8c5a9bcc128fc07ebfc5ef0bd27cd6416ffbdd7ec0fa742bc21c08e4c1408ab061863b1618fc110ea3291ac60302dc5a8688172d98c39651ad8e804b0dfc234ec48f29580bae36ffac3a61367ee5fdaca68ddf935bc058791138ed1a38b9cbba91624bca77dc7aeb6cdc76963ed6c0ea1f3d4f3f09730eac1f371d318c84c2b7fb6a14859bdad023224ef7716e24892e4553782c099a79d25c9a2564c73c824f34c1051c34cc730afdffd3f7d1d78e05738f0775f17860bc143934e9a557d902afe4378dcf6d8a1f9d9d5c8f7addb2816f3c70ea57fb6738de5d118286f43886af1097c6e555849aa54e32a88d7cf41f449a9e6bc6ce533e09345698edd087262fdd3d3091189d0941be4d66412731e346600fdf052a6f7c4d4e046ee43067d36a54e46b634daed9ef31f7dc3d44d37b74f6210918dd0e8262da41b1d53be8543d0a57dff6c077d160e8f2cbf14d5a735d1f83332b150fc4fca7437876ba1954b1db6bafed838da8ff6f3a33c75d92ed55731767ce19cf4043f4eed16aea86e89f7ed7e7b29aed8afce8fece71fa6f603625057d825ef9d2b4ad52b41ea78cb4b7edbb3a3972ed93a5ae7e0a5056641e82598687bbd5a20a1ae70ae590c6e4291f3bdea3903addf853839403c8faab679819b2a56d1cfe7eb6326794c3786672b957317929e6fbeed803baffa9366899c49742383c7c1f527406657ffc10363f4b3d750e621af86956ab50810031f627dde8876edddf48487ef201ba289fc55a0f474f93b20737ec79d888ef807c9957f5f9d3cb5f9059438b95e72464afb94d1b607239dbff026425f427c1fba0f023c28febd1cfeb8ba023b063f91f3ec2e744428a2258c042e85134549cfb9ed10528feff41a62159c360d63603bb29580ca3e67816fad8bdc8a4daa71f666911b759ce0b07bd01f1bb25552729fe250a62ff439824ba94eaeb39cb3e8ce9e5471d939fb403f03eb6cf011ebd2f84ef180e66b0bec14c1984a8cee85f57101421111e3a253cf27166bd4cec686b0daddebe21df35be601e6d11aeaa6b357f77e27ddc60abd0c5443c39c481f9dfbf49fb1807d78e753ef1402979479745df1a9d9c44e5b8bfc68e22dd9f7c7f66a3fff96a179fed310bba55e56a6a3e9815ca3697c3f560da0b7e6b17dbc4e4fe6080a272019f7f25bacf4d349db7e31614a1573f6b690e55e6d2c959a2ee069b0b4eef2f5be47412a1dec920dd67561da8d762c6895939bb8cd47fbbfb1c1c8f938ec458cdc37b6fad272f4e030677026db3b01be7cd967d970e4e4654ce1048b051b4cf7d4fe84402729f0326a4e80f68395f9ad50ecc3fcea224ecbf5dc6216a3266d1f898af42db0799440171b4ce56d8f255ccabbc1ae7fc463eb0da36df29e1e4b2e08aefe51f10fc96e870275c89c71dc1f561aadb74b6fd10182f2ae0be313d754e99723b1ef3a08f70ba88c0bda8234d3a0a75ce19046ed62fd26c94b4e9125e9ee55ae43eac7a5cc8c4558e4f3e02dea53d9233e30bc9c770ae84577e729f3db9afd0186589509aff2af0b47d7fe2dc06124fe213f3642ff29e9dc5ac6492e3d2e663ac627519e93eca9ef53725d9ebb72a1487e1b3bc54fb5056da1e7140fbf24f243a24b34890527798ed361504f6e653dfbfd40f2af0b6cf194f545dc7530ec16fe49deb9f3d9b2721f23fe43917f6eae28a787ce23079531bb1bafd0fcb9b69f333c15e4c80cb93e53429e8c42cfe7476db57626adc5c0fec5fe875c3be7ed6f420be0d9dfe8a28e76ded15bc5af990298f74b406957c501f38c119ea7a0178fb4e6a34fa7a7a9187e636dc499daaaabb4f24010340568a55a12e22396c54fa0837588c2905bfaac25491d9756d8e31cca9250a56c2b2b7646d8f4b93d53213d32d1caf7d826032b3cc4f90a3dc58ec94a3678f0b8cf4598cfd73206d0376a22055f7d9c0fd13f7b108a6641f9d834362b26aafab27a6ccd13544e478143231b5410ff02c77fa2f9d74d48f1bd882f7d43b77241ce79e7719aca8949d5d7fa5a994db8ad7cb0e9bf4a99bacfe04776a4384d67c5fe57a1b6228bfa9f08ec64e198179159abafef41bc3dcd9b14fda3623a9f6cf5ff7cb0a9b019066c5781e4b51883c279c3bbd1c494f0cf051c3275a518c1dfabbf98f57cb7764b2b79b1413f68598fc27c5f375cf7fb4a2cf0e85adc713b6a9c3b81f0dbc0924019e2e270f094461d827f0cd038276cb63aa8fe8382690a08c0c22ba7fd7e7edc99b78b87b0453165bba1b3e439fcbc3ecc44bd2ac077e4e34357d3409e864e5d1264e3246b4822f74768886236842aa1cf2b3c3a097227f52808ca0cd707e8888f03af591fd11236657c4ef0c65fb19d5be72a01693f894bfb5c083526a00066e35dd340246afb9624c6bd9b052f2b5121d1f33d34977abe2e68ce3814976d9383fe3a5407d43e6a977dc062a09b56b7c8aa3cb2dd399f587b969ec1313a39f2e47067818f663510ac27c0412b44268bd10b22f4e826a1f1a03271ccaf1169472b088d076a7feaaf21d2ffa816b30676f4df835a727d4bc88e342165c324d720dac89893cfa238c342ef5f884c7c21cccbab330a6a47aeae65a88a73ddfbe5c89378e6a76d08511f33fe7826b059728125cc7bcab29242a5132ca23a4a2433f9832f47994b1795917a9713be1f02a183f38588e8dbbdf74d923d5466740b411776c00f9ec08ddb46ff942fd53e70a259c4a5d2e73c233d585d5fdfe29f2d528262661e380ae3e53fba7576dad1ff4dace9366533553434e5b2dac7d73b0e20c69be2f23a8c50ff1015c9e7cd14a43d21174a8182064d25127965228c08cfc5e4d794e243e0ff2c29ca06d64453ecce3e11f6bc2315e7bfd10f82eb97e7d8ed2d1f5e4de2c1f602b896ca5549599ddf9e81671e4a3d4fcaca9864ebb1df8a00ea57893e74f33e4eae5750563059a85b27fc9c6f8fc755dc9e21d550d3754d7c147f72a7531f5055604ce8b682fb8ed0c2db71d89e30897b2e3cfce06eeb9ffa6454a6ee195d2d4f7ea2f2a8496e8acb52665cc50d557d255e49a312a3155056e7be8114f72fc603a47f770502fd7bb24f91fef71644f31f9980e4fc1ddf5058a4faff45ddfb8f536fe33f6a2fbdc54c7f38f558fff17240dd0ffc2edfd6f88ba947ef1f193709977ffee0d4ae060b9989024d7f9550f5600a0ad7cc91465ff83f73fd7e8a804c0ca54640f2f36e1977e683f3b7511d5ad22b66708e980cced267edacfe71f97367cebf089631d86d21b103df18f53f7056efe2d1b4324d9cd77ae1574ce2e0a763bce02e37105942fb1a1e857f02da4a9110eb95a0ee49d6eb3fa0e29b0d9c2cfb5460ab377b2d76ee5eb579c8299919bd1c104cd32096497118546b856c2533bb3084e009839d36624abf34bd5ce5887f24094f7957e8f1dbc7499a98e84b8738e334eed4f608fe481b7a2ac24b40fbe7a7d3e25db097bfe695f16c698defd7e6afa55501bd5ddb635386cfbf9889d8c9915e0c1fc41ef1df9a0294e6e330b85dd991eb41c156d552290b28a4f570378a7d1509c8462a5d29ffa862d7a5a52eae8d6b1a0068a1fc1e2fe6dcb44053dd8a34d1e7e8796c5fd39d45b4112d0cae6628371bc33d4ca7f0094f8b3c6f73770f315b32a835aa70aff7f0c700f834e89ce48ddb1b14c6f6d3e79b67bc65d832d0b0d10b137a5b9d4d1a50a910e9d4f1f01b69b18113e165c4a8d193fca602c9cb154f3f621af9b61783e4b1204c00a7b987b650bdaba4a63ec3570e846634bc639e2789766eb43f971be5179dadc9cd2231418fa747a59fdbb35ad3cc17efe68e0b6237b70c370cd6e33176fa20e08a7cce4f8557e422a308c661b1cef4b466f04972ff66cabc8e69aeb743fa27bc8e2dfb59f71c7a4b0e52039c9ff13325d22dd8f287dc6568ada0dc7ed3e787c97887eefd54da918bbc5cc437d9bcaa0c6efa7590cd180202ab45df7637a3e454b9c54e68df2208b3b5499819d90daec395bfeb96b12a733432fce44062f0d8023bb6c7b6f9d933616ee11066ec2f688fc55896291e77d644c2c3059c9dd3851d5f035c105acefef3a77c5b9cef5233d540b7610e85f7b6b584992102777d59daa7d38b227d616b81ca7a24d3d74827ef05f12794295dc475ab21da74dbe4e7e5684ded70074c37aabcf013b7623b9aced14113bf6d9dfdc7ab8b5f81a63eaeda6633b6d8cd057b912c00cd30e1c27b1b7dadef9665b907d0d7bd01fefae15c52b5999c171536a8ed3846665c8d612116bd32e4e0a1df6b2ff9659069dc8c57d86a647ea377f3b02e4e4b800b75c022742903ced0d958d0de539a8c1a5e566abd833f55c2d8351da1b50bcf779779e73fa1e17634b8e617f08fe4ed35e9bada150026f282ebfa02a59d2a7de9a8e70a5d897b239173dfe75f71c03b910375edfe6a176e7978df9f3f8a1a8deef11cfcd016b8fb71e169b30476274967025ba2d6db493639b2f529df8dcb481bb1f391ef79cb960c01f405f21e6dc9dada4a74d3a9b6096bc872f4975863aa63e7da8b88c9b8479bcc3ce87c10bfe6eec68b1ea1afa2cab3eb85270c390be8805ecce70beb3bde25a4ba05ead57238a3c2c846d593490c92d5b27f2c7d41df49288d8f59abcfcc587ed4be296eb68839f0b4fb9c719ac7926579019db5db5bd00db9784fb0f69cd761d4147e47bfc3df71fa3e93cb2d95b09c18c033dafdfa02410159d3b4673e1346d5befa8bf04bbce7683b4cb492099f2d267e1b5aab5cf24acfc11a2c4fd67bcd8fcb055bc4593dc440b29484fbdf3bb9bb666d56a5413fcd31e9bc37f4e7594969fcaea36079bde429bda16b293ffda6f299515941e2eedccad9fe5d046649a4222402f80a84b254927d392428117c55d60349e17f6a2cbacdfd62fcca55d4828cc60a39179c8f9393e99778eea84463f58ffb302863a9a73267580616dc1e9c6653741953bdc35ef12ded6194416358180bc1da65d90f57b3d5151041265cda5f6af0a53599166f623bf013649e9b87c698491437245d517822b35bb8281f9da3ef6c1a4271020628a171169a1d94640e535fcd0ec7ef1864513a0b3b0b17793ff1a1fc97d205fda55144ecd9476d0c16b9d84d1db57b3d17fbf41d39a58bca3e320bd4f892b23515276068901d29847a29a184ffec71e2586c3cf0a82350e6a01dc907be5e644ff36af919964e519ec2d01c66980ca85f7ed4633e0b3d356f9b5add663602b75bc1f140d2663b7f682e633579fe659ab05f19d63de3703cf12f442bdf74541317df7b532cbcb55f3d01a0f719f504397fef3c315c26d0ecc98f9ab91b2098c72a4f459132ab73650bda0e761ab53276df8f2730209ea4550328f5f0e09906b433e73e391f4cc4ca67265a97ffdd07d5e675f0facf82aec0d1e7899e1fe68b9f1b97ded1b3e20ded75c78d9862e6e96f2637e10b47e886d6f2ff69799dd36f909149ac27633bfa51e50e0dd76c20b886bdcbfc9ec2fe312c3c63ea678bc834df39bf3a37ce273173619a6a6bd0af9231704e069e3b1911d31c61027747e978c2f6f679db1bc7f8496c3108787cd9918853b02aac173d34408f9f29d9b60c764c02e7a7b6bd8e24cfe76fd242448c7cf6b27859c6ad40817f8efb48fe98d11dc2cf4f46f31e8b1e9e0e8fe0cbcdcfbc22c9cb508d1c0876cae06bb3517513a6e0461a06c5be84197fb10eea6c8e39d91759b31843f4dd9af4d324410c44be61907f59ea1044bc6d4ee6d091dcf16008c99e6a7b765fd2852fcb7f7307de9a045e7f4059269092ce28fdff1769f415e05acf8e555a225c427bdef0144395b4c729fbd5627cb082552e2aa10c92b43a7a8b3b077a17b79727124df6bbed0182211cbebce27a3197e8281e8ce2baa8d6b01fc38db17286ed787667c3e7bc66a3f1b6fce301d0b3bd717a997c0ead324d73d5dda64b541f0dfb567186f7a38f977f8d9fd3dc12284b1f7631210add059e147317d5aae469a85888fb07778081af3c1ff5d205cf98e7701c920895fea550341b8a976c297a62b84b2d3b868b92eca089e7175c22231a17a1a88493605be02254607013b4d4e7b51035cec5c3c6a1afa2a619a1668e8664744fb3706a3b662377fc0cd46db5f03c330ac23d15dbc90cf7464fbc6b763990ce694d91b6d7e45045b25749778e7d4e1d24b120104bbe343009bfc74dfb910177e3cc2f2d0e8dd1253a52bf7d8d6e97cb2fa33147ca9fffe4dde27c49feeb310d19c35f5acada711f225f84e37e15f95d06335c83f90f21c5bc8c0a626bab89f9fe1f1f5f28f02fe278af80f131c185c6738499459fb87037cd33ba709d5350a6fd86eb093cf60788cc21e903b647128e0b44222c82b907b293f52e002c1b7b13c670909552a625ea1c33f3a30edabc0dfd9b29974c327d9703cf0f9ef8e791a2c6768235dfaecdc5b15f3d8bb8aed01162653c166abcf374cb897e2afa4ed78f90a38792870b17b25e973d98d1ba95d16258e42c3713465c5e0051d4afeda74ae70b8dacd568f36ab5c0b979924a35ffccfb1fdc94294898b7467db1d2036444cd56795e2c4fec577a4da5726824e157edcf6dbcfe041f0836cc3d2d1a792af959f6083a03d8db60a66c5e87abdc19a12c3f620fc69c88f30eb27f68ff6653f1fb9f8b9a003330891731569c1919b2b58396edb9d84336daa9f27b51d0643ff126de80001dff2a34c8ab21cad3dfa252ef18851e0b611f2deace48675944376d15a0d2704fbe0364baf3e21f2add2a59d60b6dc30196f1127a63b095770467a3a26747179fe6bf8fd32ad090b884b1a634dc8da1ec79e93f55dda78c302e08063a751ef3cc1830ef041d19fd28bfdd6a3629d9fdd9537eb962f77688bf4b9ede54ec77576f707b31d5cb1dcfe120f7c51c6f01fe54518515a81c080f3f147a9bddaa0313bb6875fdc7a701b95edb1200fb3c84c20baa81bebae8d21d5c250b669e95b30dc6962e3a517924d74a18df8b62195773386fd97b5ac4fc33d0333c9341cbe7b189e9d975d4d12007e1fd1e4e972d7822716622514ce6abcc5fd610abc5a397bb17c4b973deda3a6d467b5bd8000e9146849d9ee0d5e8731d9d26523ffd935338964c1e76e6c5ed4a2a063c5a6a630c15f0150f2e51da115849942f9e21b71686a21453cc5ac68e3763c73ef8c11c77dc622c71a57a451da8df1864cf70ed1f9dfbcc965f8d6c5c246a9c3a5032fe164025bbeefe72354c0072ed61acabedfcc23b9ed14dfe3fe189280168a25addc5b6be35d2f920dadedd5c9d608b36d1c72ef98de2324c7d9f60201f43bd0ae603503e4ccd4d2ae4a502590f68c2a7dafa57106ca025cd005354d499ea58e814f5c4e35f3c954df731b2d705ec022270dc1b06585ff2f7158d879cd6bdb80c22667415e4c9743d753f1e0ecf50a341720a8272160636beaab99cc675c0e7e907a7947935e5a6973a9cf939780dddc85ca8cf0854f916c72052a5443c413436b0d8841aa21b41b7685544b4a802be2eb24a01dee95d31625e5785643766b719904411f421140702601ef4d080b4198f84eb8d23fa1bc507d3e00dfd085e1103408f1b5a3c3e17ad9bcddc9f734164d402fd49d42492408826d167909b23e0116c6d471e13fe98fdab8d88943739a383a3dd0dd1b15d1ee06a1e3cb54542c2967087101c9e198bceb1e342a83ff07c4fe415f76edc35574da2ab768a5433567de2c06cdc9b577f917b121f4d659165e6015cee1bdcbdfdd4915b2d5d82ebc70a84ed5df8cb87cabd156dc16b131d2bf428596f83b803563925ed5589447a1db65cbff8eb7bccbee6ddf0716156fa5470d0fe4a3cf0a511453cb88b5befbbd34af1f050da7cc6e6ccd2ca38420d9ae52c91d2bde7e02900ba8e08ff7cd4863cccb80e55dbe0f61522f7b74db8f584e38a8ea8cb49f69ca36f17eac0d7c455817ec8eb3d159c1aeda6085caa473e89e4945ccd477e98cf2cd43fc527c52fc1961ce573c7a7540e0d5ac26c9f6c95d723ececffeb7951bb30d7490d2fa4f3293addba4f3159f018fa169c06a4ed1cbe20f5031481e5da88dd7e150840760779eb30fc1e50d11ff65a5a0ebab630fd8114ddacf2da77dbdad2b48acbd15452a8722eddc52c1fee0c9ac27c89319ead9a3d03d0c5daf9fd0e8e0d1e1c7d85e0676f2d5e5a4d0302973d7c99ba17d20161f0934bd6053e8f50f1471e10128b92952881682272478dddf4cbbb087366a87aa424cf7796744b32bbac89228db5119f0b0eb5e223160291825ab9dfdcc77c662f50d485c429f4f71e9ed472c246b15e5534a253ff61a7ea71bd447e5fbf421b1380db85643d4cef1d7076de2885e2dc9e6cf867009ffb8d51bbeb0730c3b7cc275ca856624e64d197d3a1419c9c729719aeca3e9a0ebf4dcc417cf2e5dbb29339807761d5b621f0834714cfb735cc041a67988dc36433eeacf99899634a6e14681f2f84ebf7c61137f4bcc6cdd6f9dd099c00b3a02c8ab57b3948bc5ed4e73500ac0b8b5e251210f43ff633265b0670814aeacdfe8695fde75775ea0df4cf13713c06cbbb0feebc5c9b9f0a3fd66da650f0855c72de64475a7fd3520027dd6077e33731ff2d5c2e6fd3542290bf2ee4e259bc1b6614e211d5c7c1552ce56924680e12d3673098816ebc68992348677cd45a905f0a12783bbad23ac98f5aa9871acf8d2cd45e9c8449ec4f5fcb270aeb5ee28eec2065fd778e2cce42826f308609eb34258473f61206ae7ea5c7e7aeef3de2e99f635dc7c0febb24dd37b8e80fcf7ccf2a3ac6eb3fc5dc8ec1bd7764fa7750d11fdefc055a958f704bbd8257ef2780d623ce751cc8bd47d27f028afdf08dae6ca2e32ced33ccfd10d07747aefa0413fd6319ef58e28758bd27bcd32198779f48fd0612ffc29addd8850e79bae728e73190ff1651f7052ef4c533dd33098f71fa8f489d0f97b66d29875babdbd2d1564436e8d866790d416b4aaa7d939aaf8b124e7325f913ec0cff60cdef41dc3df2cb7bc0937e4fe6398fa87f8ec5ec17bed90d9ceb733e996758f9ef087e67c9f54ed819ffc333dc83ba7fc691f7882ff785cc7b3e99e61cabf93f18b35b78770ff44dce4a9547ed41441ede39121bfd99e02d1907d8632348976f6c9d536a9ac2b4ebfda59d6eb2f2a52d480b72ecbdd8758a5e74c878e2a1fe03ce2fc0d6e9312bb78bb903fe1da6d5cb681cffe9e85669934c5eb198c6b1a9a3822e1e4aae80a6d72a32f0523d32f760ab0fec04794e7c1c774c3e3df57eee8e48aa0605ee0d5fba84b93c6bcf006c9b6bf644dbb85298e4241a8e57f1229ae8c18784ec309fc9e94ce108bef3555afd4dacb680a75f6bf5fbe3a89b0e32f8046fe8efcb10b619dcc21cbd8d08f8bf309415aaf17e8aaa7818a8572cdc8c4d855a9744e566f2a08e093d68fe3a6c5fd7159155e10c4cd9df51f13e50620db2af39ca7bcac953a63d7cd5fc7fc11f48b4736b429f8969e9e6a324e2092d3c4e4bac38c1d6ee4721455ae4159881fffe49395741ff78c65edeca1d0e80c698c37d95d6c9fa9194946560e7f8d51304386be680a04dc518ad4f86a186e54f3797d561a8ec8e75c3e97a3a3d0a77568b3aa10a03511208ff9f480e69aa21ee33e516ab15006ca13296cc245c95ea94ea89a65b35832e73e9baac586b429ddcab71386a9f250ad158d021ba8224cfe9ac63a518ed6821beee14cd2672591f4c33aab95ac1736d1936a7f5e6d4adfcc2e168785fa5fbf454fe18d15c8bc7602072e640eaf8470a9a7837d2d567e12699ee83e9858c1dc6a44d200d6a1dc7b3af546810d589a45e098d607e2dbfbc5075512e10bd11ce92d621d373f11f0f963ca600e518b3c15d2e107911ca2d6593dd1a73e0e65f8e966119ce9c442cd733ed6cb9ef7a4e1f433cc1d3b38d344c18341df44ca46bc38941deb0d5d42a2136a9538ce5e2de1438e34b077976eca68c954404f76e5d2765ac13562edefb6226c37ed7505206b54be7d7f7f4dbb378881affe771a735bc5154f2bd43400d8e9f487ba2611eb1a4e31683f1014dea227e389304764c879408e65ce67a3004cd12eae06410ef021b86db4ad3c033e93c9eb95201ce55e5153475202a36715c85881cc7e427b7a101719e94631d2ef47f5c05898503fc27887edf1d6c0e05a8fa4e08e5b81851e866f723a425f4267414d6977a1811a4c01bd491b3458c7328c2b9c3bf2e42996ad1951418892eef826d04c0964094e5e55f3b6cb0310380d49b9f911fe7e0291c113970c90587bd764d22ff57249359f363cb6659772d81fd146c4b2f0188d07a6737e7a2e0304e9e4b1a5fed4e4c480f395d20cca1203c79e50c644f40380424cf9bbf3b48e57cea25e7258bd0e42a79a04e618841151feb7ef2cd54929a82d7fc44738ddefa66157d07e570cf1e8e30c78666a08baea2725fada2b5e5721dc1b0e0d6ad8f45b934161bd30029dbf882ab4732e800ca2bf2f8a9469b5125b26608ee371cf4a944e6325b979ea74679195f4eba22c6daeae081075a151ab7129bf2d758a4e436a107d841aa7445e67298245983d19d6da82947d1cf8754851765c2aff167d9648299371fe7cfd5d457d89bb34abce63a4156a29ef0c06ec06ab7dad08ed6380f393d14946fca259c370bda56ade1fdfb425937d594377886c589edf8ac691b76aa5f601f4160ee3735b734f582958e9ea98875794ef890eef7ed1ff6ca8d178dfc3e4fde7b4d37c4f68c5cef11d574e03f1f96204eece4cc295db2359bed5bec49d2f8800f7150f0d0dcabe1655646bed76a0589f5dc1cd215def980912a61855114a07c3b6529516c7caaa0418ced58c3335d1a328168c258531542a244fc79d6d03001b36f42012900f01527c81ee1b69fe665949bceb747d13de22832c3ab4739a9dd60458486bab6d90d37e66f77be4208a597940958a4b56b56330ae69fd69e3a47749a9db66320397d2c68d78e77a5f903dc699b818392d25cab566abb755e3e8e4fe5aeeb76e1de2ad260c3d24371099872cea5dca15c4cdeb0657511abedd57a909064c8052bf23ef8d465830d841530a144f77b29884e8aa423be3d99b0e8bdb66748c4213f901822fabccfd08403dd98bfe3b0740db93b1f84c57eb5f0baa991e8c008e03cc75cde2dda7d591f9c149c5b76a7e27f06d4bc46d3c26d9381599a633c868245152670822c167ca01b381edc286b9660a91f842116f412c4941b30e61f6903b3f79c1b025f751e88d07dd459ad4ca9418c0cc10b7e70839a9862c4e8e396053765883d49ce2fa7958470409e50945534bd6ca2fafe919ba913e68e5acb3c5eb9c2408446f61cc0bc3e02c90a2a588c254d4b240d938ff2f1eb8170c1a31313ba2c44fba5fac29d88d23afc26af34e228f0515d4aa4f4e39830337e37f9cac17f453d364f6972868c442f12d2a0d0ba24b5bd359ab568b816e42b68f216337c2b3f2cd1d483298704b079fd588410a6d82a5dc528d660cbf2fe6ff546284c5f7f8a7adfe542bf78afa20a6106a5dfd3de9e081210e7037baac1d3c8ab641e2428a715ccedac9268296e78e5461ddbdec2ea373a9e243f0af9c777870235750c0d437e88bf0fdf7b6c5aac2682aca3c4532a1247adaff7402da9ae84d7fe639e51eee5a694b7d87c31934ab6b8e53ef4ec53edaff17e3b74a0aeaeb80e47cce8bf9825ac6f5fccb6a5ca5051837f3cfae59ee7389916285bfb371043cdda561721ca0ff3a3b6a89410b86822704ef6b9042dc42d2ec5d281f137de7795f5c1b80596d5a70e34b005c64cffb76c4c9d68c7bff1b57c60f080c780cffd8f8482e8c16f8e15a3fe87a19ba0c8cf21e78a65f4888cc9483bb7fa2399b3985c031338561c2c66f9761c29a7f39b5928f7a96fba7da89ba2dcb4ff28efc49da5ded0c9c6230c89d7e99676c1fbe80fed125054cf6d18926b7a1f33e167433ddf9fb2127f98fce0d8f70e9ff76b386948f38ee2503da19c87217dfdea6afbd0dfc1fae378554d55b425bbccc701f69c91be31c047edee9a37a542dd4d5ba8f77c6073727e7de82d2590f645b994e31b4e475ba13a52336f8b96ea23b55830ae79c751acc3ea0931b6e752e8fd2e6bf1b52a41a8e365f7a8dbfdb47fa047d757f4f4b3a0c2f90128cd7cc49ee8c20e883ffc937b53979ceea530fc57a67b65804838f5cf4ffbffae70d78f6c29e0d5f6dbf987c6cb9523557840964ea9e573e11abd44913135ffd658b6c5862279efb9ee4a0026a23a80b31d61542571e57385439293c62cf3818a8b044f0cefb78657765269e2a03aa20f070683a4dd948cce189bff5a1fee18657e3a11a1d9197006e95c17472b81d0f73625390358228262e71e20764a960c1761251f5f0ad62eb667d31fc796a273ec2c181f7e3b2e75c9268c28199548ff1514d38691e307ee31299795c98182638a8ba38a2f462f51396270c093d77cec18b4ac99edc3dbb6f2fd3b91bc2e47b922e1f3773002cad4e7e200107e365fde93a9b64fcec2a11cbd3a53c1e5c5ec0180c7dc3a88d81469006d5af37439269ad0eca11d54c46d55b7038716f791ec01a8251d00cb65bf73ac09707af1d0088f355fde1aca704d6d29c48a734ea8fc7d7b66c715a182b28d8c8a61f81518ad06c7e1ddf3c702868e92e3749df5c5c63bbe7f62d3889e9ec5bd5a3f21c75f9873deefe0957851d38bfa4452e019cb59f6704212cc3c9d5aac803b98e162f3503a7a19f50f5efc50802c001c0c3c861ede7dc622cdee600d9091b365681b1e0aea0dc3ed685c53d7ff8b7fba02c8de07b95d61ea7cf0270785897de290ab81b5da2f54f05638498a23fd89fcc3f93c8d7fb7e2efe561d2c128e119bd4c9b78e6462a66dc8cfbbaa98b406f59602070fc6351cea29efad12913429d1af1e9b47dfd9c39a0a1835d578d9ce2c66d236ed03122955e1687ed3772079e7fc14ff72e1791a89d8f4dc1b4ed1583412c9afdf69642af255d0a3d5b1184193c3d9d1c7f3d1b8f408d1a24458920baa4221300a8da6e98fb486992013ce0080be5f2f366066aa1428100b1f47f3d299d33f3a146b11f88a54d5c582003a8acafda7e2249b06fea31078791dc6c89c6073cbd17fee0a0178691f3a8bf6fc7072142cfe1097ed8f7b8a11cc7ad1eac2a3f0bdbc32b30b9b223dc6d2873b4e7bdd7ab11372651f6c7a77eff0f797b42fadd48e0cd6ba28e6779a5c50a516a75426da820fa9dda08788b4b3639ce7c03b21d644d8906970eaa1444d638bb10be3cf01b7e48054e04f7f03994305bdbc0e2f85b4e8dfa0a320e288e64fc3635acec94c1966d2aa3e258bf1e3ba7267a1dbad3fd672f28326ecc7994f99bfc33c3dffcbbbddb194e8049a0ab45f977eeb2854764e668f019a2cd055d24e837c261bc30ae2dbe71272e44647681857f82074e0258f411230e79eb3df49290e47a587341633919aac847b193cb9a3aa5b03a911b2318ad8d21730cf5457f8844f53fe887846611f35c30aef86f77e1c3dc5641a0f38d99c736b0ebb1bd0efd8842c6ea3e575d0fc83f59970a6a3b0b82d685c859ae7592e74db3db78b13906df5db8dbf5072cc46d9b73ac4857438f72275a754bc9542564cfdd1bbad45f23c03f6929a90686282d3ff2b22c1630de14c5c4140b63281ba06779b80aacc7837ccaeab72f038663c1365ad85e515c5951cc324c0df5fb94cf8efa816b6a8f50ff6b55821ed2e5dcc355b3b0ca8c6f206d5a33f30e6d51c49a6f48ea067f8d755433d660580fcc7cf69afa8b81afcea8ce56fa1358a0e9a0826ffed89ac0ab01c32e12fbf2f8938e7ed6b7206c8cd7f284faf7bdb224252601cebaf4708cf0caf79d6911e7b7f0699ad0403f629185424d03e37de80a54278810d4859854592c80a8d868c4261e85ee2b332ebb01ce4fe9979d31e41384da129c48a87b664081b759e8b2aac6474ee7840ae04b5a336ce3777720faddc03371a4c7ddc3112c4fee924d8b96002c2f3c51033ae59edd636e28e2eae168d5fe21a19c70d9d755481a21cfa2b45f7a1a2c5b707c676212027a2a70d1414d222b61df192284584f8bd3221f640bf27ce24a48a1996e52153ff1d71eb5a5848dd2fdaa5e811bec2db09dc45c09009d2cba298c768af14194aa1ce6ad22bf07d264055123ecea8f8552e20c207521340c7900f48ba849114b5e9b49bad485df18390c2b4b112f1be2080bc001404a25a50eab7f003773acb60199bda8cbfc1c19f14adf8de57c5d442299a4de5553d4b2a49caf6fc4b386943b12f10bf2654221abc7227a9393a45b72e30f18b9ad29ea68e8475cc3a4e7ae65107266fecd565fb7c62571f86bfd144a8107599130994473c05f718762069a7de8332be43a4bd21a1b7c2d0da562612a198ef7d23deedc69c10f29ebd3e5cc9bd1142f29799ff92e58254f76ceac7d93b1858fc44be0550ab70efeaca05d911b3c8730edce6f5dea8739daadd86d8c7f229405808434e63f92bd7a5e9bd013731ea63a5f5f96257da410c7c9e2f0b5eb4435346b2a5b278020e991cbf074452e048bbcccd6cd37fd20bff9c59d8b37f87028acbf7833675437e6a8f822bdbdd6d55ce78ffab18cddd25a0b6c6bbbda4a565983441eb0226ab1a0436746760b0a39de82a8d945f9cb2d2aa3f9498d859daa439c1e553f269ea7d54eff10971fdff77ddf9034e196214bf15a475db8c318c88bfc4178542cfab259842141242bc5457d3ea06c2f135f66eee45280cccf260ee3a3d942a79d0ed370bf7cf5feb147c69c59e59942e44c21d6decd8a65a120a7e0403d93776f7f141789e104a8a5ddb92052b13aacc4e638b273b7a46a66330c3607279fa9e18ef448f6dce913b9d180432126850362921ecd5ecee1d008591d439e0b327122a9d0446d8f38998da0936a6d5ba442074cf0d2fb551b806ceac5553a94b0db55312a847ca3c35a85192d685faef3f9ee305000b5707c67ccf7bf5316efda9c4338222198dd85beebb13c59f0234b3ca94d73c84bc0eb8aeab5b2ea129d6f05c52c7039489ec75367fb10662490f82e1e0c6af070361312e9cf79e32c91ffe7cf19e686317fd371faaf1e810801bfce726da49f90905feb71d63cc9a4205623e0bc3cd59754c6306ff8eda75032bd69237cbd01287cb9d8530405f0ab68877b9bd9e0aa8ee432267d7af5b9ecc15d9525672f12038425c5d7abde9ce0403518b70ffee4a49df2f5045898012ecf026cb6c0dd9cbd2870becb97820f6e3c1ccef5dee9c841386ece9846ed887a74268866588c22d753822d625e5236eebd23bbbff3ee01a92f1bba22b8a1c70fd17baf1cd4d820ee3c6ba0a52afe0a86e3fef037c42da5e24f3e6f340a24d07276fcfaaf8ea0102dc33b05e8ff21d466054ff7c8430ba7711608fec67517b5eb4ff2165df2bcc2ecece05d17e5969353270a53aed14332d7c4d912a99727276303fb9c3a8baea3dc392cf92b20dd4b97f317a248decc7ae80638e1be9c75296fc8cffc998fa153afcaff3a1307edb209ba18d6c917b25a40b85ef1300ed01c389bbb5b6ec3600e63c78ae3c1eb2b05d24158aa0a56510719fae621adc8f5bfc2e1fd26acff09f46fbc6846bca42509e59045e535d9ac209d9ddbf7daa963035f762c53e5ca5513057d2e6ae2a151c673429d73cb45ce9d58fe5c8eac2c1e48c73180d310fcc9990b5db47b2940c1542099e497b8f6ff87037824abecef984a3df9774b9e4df45b05b5afe47d66c685dbb9ba84224d82f5707b5bf4d6c23007e01588ac3f89cfb65c19ffc5187083b9e08b7b77c060f485cf8c63c3fb892fe93a2a77a67ccbf97fc4cba0fe84b6279784ee999850cb07508bcb31e711da409e61b778c9d0ae2b52cac618e3f5c205264a0cd586507713b56246b756297185dd868fdcd35ece7f769e70096d2ed1e31f9ef3b465df0a4e125d43c2bbfaf0c1779c0870b2f2ab65a0fe95aa742a371f34c4bda98b4359110a739fc9fee704a44f7d6268e01040a07ffbc3059d3fdf8ec39ba96e81fef35dffb7624125d68d14e015561d9699c0a403ff1d10fd500491cb252c2abd15f5c214bf11966b4942c4b5234073f3f7055bdb357df38cddd24eb18cf7969016f9ac489f40c365a8eddda1a6ca3afba9791f411c213ed178ff0dfb83945ed1288aeebd382d064097c61db6c5bb11795cdb7acb8e845bcd8610d7629488a8b4bf062807f8860dd36e9a2271d62b3ed052a31653764a0b4a561d22bd266878f32a56f95908163512fa75b4ffcd8a3b3586b029f2084938e5ff26dbfd27e35d79de0318204a22404d19185ea7ecf6a799127ab5cb5bf8f9c15b459309d1f9e925f40a30b5934947feaffcecff16fc33fc9fd5c8dfe5dfa1fb99f63bfaefc47fc6b99f79fc59f433decfbffddaaf768233507f66fe2ce177f5affdecebe77eb9f3fb4b24015410027e2d45c00c3080b442e5f030c30c33cc30c30c33cc5a4b2585984d994b45ddd62969a7faa4a44c929bb47f9292724bb9a5bcb37fef4b310d7f0c830c6883e52c052f2ebe7010b41aec97b4217ce935b892063bac3f6c0c32833dc7bf2138fcc24a065bdace9d0821e3431983256fe87e8a7ae34f00186c9f918b26cee4fdfc158b173f79fd43e7bf5db15ae51b73d405e10bd28a6de2ea9f898a76c1acd8c3b91e8308aaabae6271d0738fcbc18b82aad822478e2c7ddc0d612a96ba345d79f2622e0a2a76ca8c7299947a61e4143b97175cdc85606b9a622dafff2fcab8a01917a5d83148a49acbd0d322c53e8e6a572a6ef3e346b1895788d417a6a92d8a1da408f2a8e2e7e442b11735fe5ee9e213fbc240b1797a811773813e7c413eb1834df895b8ce943db18998a84aac7c56756287d45d58e5290e8e0b4eeca0299e8b8baabc2864137bc388875ace53a5269648625efbf83fc9c4f2e3c520ead9e53630b18a84d5f5788cb1a94bec11a526ffe3ef828a2576e666580f1f95d8211739be8d12ab9d634a25611994935826f57f911724efcb49628b7a1a97b98b6f9c1189659d72793dd4b21d126b6ecd5c86663f9347ecfc2036274c8889c8116b4ff408392f57ac1bb1797e7198cc45050923b6f5b4ad2ec905b62d62a9ce7e0ca6d352a588f552ceeb82e8dc906606908875af27848c1c95563211b1ae4eca8f29d2c5c55ccc21b692bc4cb9b8be92b921d6b5f988eac50529c4b68fd41e4391e7cb1142ecdf602ae30ade20f694474bab0ce63f7d412cdba844cc513c103b4a6692947f1925b300b1175d55e385179896fc87c5e2f9398e4809b5f8616d946ce6c931a8cadf87f5f24846de17be22271fd6c80fcbf156e5ee2ff6b087881705f9e2fedefa420f4b724c5e90e9f8c595e73c2c1ba2e618945aa4947858b6baa62fada249c3efb0c494f0eace67e0b0db612dd1bbc887f9a315acc3e6d8e0ff24432ecb0d1d166f94921a85840bdfe7b0c57c609efa8c1cb68cba8254feedf5e2280e7b35d4f4df2fec4876c36151bf8712a763baa6f1862d7add3eb058eda23dddb07833d85e90d0d023d486254de40bbb3472a67c362c3ef9c58c2e2c9e49c61ad67df8e18d0bf641eda786e556c531acc8855ed8751ad6460e96ea19549c09a3618b0b61e476baf9ae3bc35e0c2b7c3755b2069a9b61a7641e19a84733985c199670a152f4118ff0359361fd024997dbffc5e53019c3fee0bbc88ba1535f7e8618d66f90ccab7752cfc161d86e4f2a49797675a1050c4b6c7f91ed6d838afe17d6e98226c7851a0db242bcb0173ec686dcb491192e5dd8fa72857990e7c2f6a80bf477d4ab8b8b315b581acaa52f9e5ec745266b610bfee963c1318e956416166f38123ab77271cd8e851d3ac317aa84f5142fe60a7bfe7753548815f63107b152b053c9456b1596e8b0d3730e34a7472aacf538696bb91557196618c01496f853798fa1b7d1cd4818801416cb69ab9137d67746617998d8aa7c71d56383c2a2f1a0d224470da12b3e18c01396fdb3c9f4c53c51224e58bc60b51e1ea4b9f21a973080266c0e961bbf2849ec7c914cd881d95ec6188fa9834bd81e598a1ff6bd12564ba1f4316572f15830097b9117c4798183a59360226107167fdb0d73f3d51f619fe642f5a20c62e432232c16bd2cc74fa660292ac2ce1d8dacc632052d2f88b07a71e99e85f9e28bab0d61f57aec6c2835e34c0b61cbb3c6f45f54191284fde23c1c66751a3c03c29a5f5f14661b584891f2832596d6443959dd6dce07ebc373262f14e7b1abf4608b5d5c703a71fb1a55435cdb69b81d41dec1d62717274b2b6358193a58fa81e3ac982ff8623207cb1779a1845e4bbda6100eb6c745cf4076e2cf46bac1964243f2e2fe0cfd306db09887a5e8c59f5ed5b001d460874ce73e87b8670e1a000d96caf8a781830c2bad170398c13ac10b65e6baa8b71e320019ac5ea4e233bef7c8bce001c460bd78f31bfe8fb9a80b1b000c7646121f12673fe2f3572c9bb75f5c78299d86e35cb1e9e5c2cf2fb8882feabe15ab75e47e74488cf84856ac8e967285e40ffd1ab58a1dbf3066227a4154b143edccf96628531a49c55e4ccd209f1fff3292a0623dd5abafda49e3c5df29f6dec818bd5ce943ba30c5f6382f635c8c5d5cb18f521ccd5cf81cf720c5eab9eb5cfcf01ead3da3d851ec82cb1de1d138a88862d98c183f378d112617a158d782498559799ee400c5ce94bea851379e4859f9c40e9cbff0f2652e99ca3db1855c5cb06afd99eae075622f08d18bba2067772dc29cd82e4f74b4de475fbcd32616871352542f7c1e17179a58cb312e66a8abaf46662676d8051d79caa1369a11134b45d549f514b441865c62fd82d49fba9a961bc4123b173fe302dbf45d0da7123bead45d486b9332fe94d833a40b6abee021d62993d8e2ef5786ce10f5b04b62ffbe493fa1c2e9fc1e89c51aa567c56d4e9c1d12ebc454def4227fe0188fd86942b29e5c5c9be79023b68c34f5822aaf115b060daa5e5e297c51c3882dcdf36a2ea647a369115b9471cac593fa9e4a55c44e29f94e46a19be2c389d8a146955544a724b97044acf1851d8ef6fb436cb90bd5f4a46b432c8e0b7c279a776b532bc4d2c87131c811246e454e88e571a1634c0407fdd718c45edcfce8f29dcff3658258f2e983c6d493d44f09c46a96616699ff173c8d80d8ccbe687d82447d48973fac96a21bbbc8baaa8b563f6cc11e84fb8a72f85ffbb0d8c58306a1d60c3de1c39e528ee1e4973d2c3f114bb6aba40b75d3c3faf3053df3a0ae2995872d3454bee8db89fb0c1e364b29831a3309178fdf61f34effb094b9f0d6473bec79d1a9e13cbe3145ebb07a048bf9e9ccbe2e900efb6f17e3c26e0ef5c77f0e3becc529b12e6cbca3c9612fb114e743eeb4bb12877dbbb860f2d417eca389c061fbd1d25013c9f90dbe61bf2ef2d16cfcfbcb1437ac166cfbf9bef68bba6ac3d64556bf4fe6b1619baaf891d5285a2e88ad615f070e4e5245189fa41af6c2c615cf4feaf428230d6bd9faf77f51367ac4d0b0aa599e83cc20e93dfa0c7b79312ec8d7203ece39cdb0cf68483f92ca2e78bc0cfbde78319e7cccc8c149864d72918aa73e6a8c3a1fc37291feea4f22e4d5258625be48a57ca5a1719f61d81b39ca8314b6cb260486652ff6f5fa448edef6851d832fd38693341ec45ed82bc71b7d312ece49d77561092f08fda8c7336b2c5cd871a9e5edcee8af49cb80c51656f59bd23b0bb3ada711586861fd42c7781cd2171744860b8b2c2c91f6a2c157bce846222d021658d832d623d8d35ddd973a042caeb093dede452f9eb87c5f5861938ce22087c33c875514b0a8c2a2b3d3459615378229a803165458b4d6714efa6a8a2e060448030f584c61892e9cff294779c80317a482159c40052bb8c0165ba08004154001094880675ae8010b296c4dbde314aa32a9588a03213841035c50fe1d801739c0220aeb7df64ff44b1965170a02a41999c0020a6bff34dda4bbac9f140448ba000d448038900215941298168dc0e2094b55491785b05d346212fd010b27ac5e0cee6117983a2ebc10042960099c0d096cb1450a16f080079402ee804513b6f0e27ee0e82b56d22e1681051396906ff4428a57ce05211020d5e040084eb005e1b6b1062c96b0854d87728c0fbb982e1020d1165b9c200422c8c0165b7cbb40052150c1165b6cb1450a1ef0800a6c608b2d1eb0805112d8628b2db6e8101c0750f023e8770f6c715159d8010b25ecf0c5209c6869173dc5408084495852aa2f7caa8b0e2d6420407a149c60d00234108105bc000b24ec941b98a5935cace34080b4821378a0c641608b2d8e80c511f6eb825c58c9f4a24f835b6c91021198c0042030c21e8d1e55729a99f06111361d5f2f3c67f8dcbb614184edee4153fe7631841dd68b812547c962c7888510988d905d4c9936231020a120041e20c20e6011842de5d47b24fbd1dd0c0f78608c126c608b2d9c800510b62af3c28f5809cbbe418069810e78a00558fc60fd4e67b4270e233a0502a48fc0f8607fc6b16929c6c53c9082104c998008fa41f0002c7ab0e41b7ff0402272d13f1e50c17f0049051f81ca01163c58ab23bab252244e93b583bd31c87839177d917ad143073bcd85c385e00cd9d3b040073c100021609183bdd1f76737f3d2c48f2881050ea6495692634f1ff2cb031637e8ecc2579983918480850d567d985ca9ca05b9956c01638086053ae0010088028b1aac5b958ec13967a2e44bf08110a4e06680050d96beedeffc228bf5008b19d09043c3d6bfa13997011d29bdc6d471a48ec12893e40851a41c1ec8f1062c60b017af8374714cffd6f7572c5fd67026b9c9ab92aed8ca2ffd63e8f478bb4010200d290e04d08a1d7e41ec5d79d4d32edc060504c08af51f5ee53da72f2eb27b011a88c0029a51b082ee06a0e05560020ea8a0044f02c2820b0258c51af5552629df9978a18a1d671768989da35095610201a4623b33eba24a3e79c2178c8aa5721788a4a49f10a2758a2d7f51f8ae70eb317d5e100304608a4dbd20725a06292347469562af20fafb0527c161c3a4d8672b4ffea2937cdef851ece074de14721623a442908210b04017a08108a82004290801073ce0812db6f02db678087880100210c59e17eb3f24af20407a0a6c118ab50bbacb67f5bf51761020b5805130e3020200c56a35a98b5208b2155a810029891c20804fac5dbc9a0da236acb25406c69080003cb1a5958db3957e0702e8c43651b1514aead8e9c5451104c0892d65f062385f10e6a00b0ce658177c58fe2ce4a43cfe94af3decd7a85197cc1bedd2c336f2a7937a1397ab3cac1be7406fc7a3fc81872dc3cbdc2f4c8b8b8c3becb87b5eccd1b0c3663efa636b27961975582b4abf792333a4890efb3d58a4f2f5c645d3c51c965c908eacc4e9b9a30b39ece30529a99c3e358c2ee2b038ea828f7412da0fba80c33ae3685d7e710fcfc51b9610fcaa391b1a8673e1864dc2b38bd18b442c632edab05a2e0eed95e6820d6b175e66a420c9cf52d6b023c9055e9061c5492b6ad8919a4e4c75777117250dcb1764101ec7d6e455d0b07a7181431cc79bfa9433acabb1395e1c5d3bbd1976cac511950b3efd992fc3dea0fefe4127c38ee1ae31d584b0e118b690a13bbb30924c4c0cfbac6ca58df59a5c84617310d4b1c1d8d7d560d82464c8cc0afa51f517163ba7f38dee08a1f6c2cee9688274d685e5416ca835f17a245cd862278a3ea7e406d9c2328da37f3bba98632dac158f1f533959d80b8295748eaf6c47b0b06f44fca38c5c614bbddcd554eadf05b1c256c1e1ca64cd7717a40aeb7ee96765948a3d15d62f6a1ce19ca59af21476a4d9db9b4961fd229b1016ff723e1c857d7c22ea7f7158faa1b0daa3f353fe8425c33137d4ea84c542fe08996e42c1bf49fe74a24c584c2aaf4cf0f21475095bfa9f8cbe702c75315409cb17c7351c95a8be2461b3eae2ae348f815490b05f888d61329ecdff087b316e45e538eae2dc083bfcc90d2699852eb8085be77c8e1704d34626115627f18be3bbcd610e61e74287f8a02b646aa41036cb05bab2b6935224087b61f7c817e487095120ac631f16b33288ebfd60a9745f28e51b5ee805fa60c97b3c95cee146853d582c3d6a98e4053212f260cd2eec86a32ab9c8b2836df4bf1c4f84435c079bfa4fe4c6e497f21c6c519df145f17e2f8d83f56672173ffc459e6fb0996d3c8dcf4a486db09617fac503d11bb1066be42e861247527f7834d8c17ec1dc9c56cacfcd60cb789c5f5c600f42730690c18e6ab91b5ed4c5a834400c96a7d08f5176e144680680c1ba22711de5f54dcc5eb1ed34c3925cd445dd85b96289795dd43df9562cf705b7cff5c55cf05db0622f8c088b679579ba8b55ec4536fbfbd8852a36399d47c1cb71e3e222153b6e4ee58f861bd3052a9648d1df7cbe87cfc52916f9a22e7e7e9ac64529532c21b3b6c1fbca51aa14cb17851d47490b9b1729d6c72058a7669fe6358ac5b3617f777c43bb44b11765c3034fed2f86542816c7b8316c17058a352bacf1b3ac741f9fd82c8417173f9ad4e01e9ed8f24e2ebcfdc290894727760c26b9c031a3b36e7062bd09714d93f3cfc5d8c41271299a04f1427b0c4d2c325f5c27eb3c17a64cec5d8c8be70b272389326162b51cc997a39b23d325164d2771da98502b5962f199eda22fe8754652556279864b672a9a235251622f8a2bc9496bf00faa496c8f0bd5223f48ea864a127beca77731fa42b17e2a127b832f2e8af8a220159f82c40e61792f8789e437f5884dbef6ea8b56f2ba9872c4d62836de06a6b58da9462cc98b1fbbe3c288f52478ac1747a6189745eca8219848b84c911645ace760c6529e5eca4549c416c5d19e51b86b5c14446c51170e12b93852ff432ca9ffebb38bc21e7f436cd29712511d3306bf10cb5ce38ae9c21bb39e104b65e862eae807b1448894f9932964e805b14d7a10c7f4221ced81d8bb18c4f8c2887a0e71406c5197bb52708c22f91f76c6696bf9c2cd45ee87ed415e065e3c99c2a5fbb043fb505fcbcba79b0f7b819e6f45bc4ce5e83d2cfa999751a4d0a5133dec93ebe9624cf2b0c3af54c3ebafc7e361c955a972419434e47758f2a45cbd8f3aaada611dcb17254aaec3e28f64b67fcd67643a2ccd13e6c7e339ec60ab82a663fc1162392c59e705292f533ec471d892438613d3bcc153382c32b9a3d249b4fb37ace75dbc1f755749926ed8bc1817e617c6d98635b3a27cd2a30cd364c3965233652e9b942dd7b09dced9fde95e84520dcb04897afae242ab4ca6619547d1a8cd2e2ef2110dcba4d82faa1bcfb0a335e9fe88265fa319564d87106bd40d1f9661fbe29d58ce38a6ec23c35222918bb9482a7fc4c6b037dcca2e5b2f52d9c4b036e66260b9931a432d0c3b467c4f03a9f4a481610b17718eb20fbd18f6851de6d40bea51aa19e6852576c1d4e58889e55817965c142ca475a558ff0517b6eda27c0d65b94822175bd81b494ad5edeea2e48516b6c84dbfe92ec85fd84516965fed10fbb17d5c5c6061fbf00736f7c50596d61596d11aafd2ca7d66596153cf932e8ecb38b6aac25215b1c67fb491174585d58be24878d137372e6a0aab5fdad0f4c2497b9414f6ce9af0652219fe118555a70b5792e5922e7e4061c994e1dc642841d2e3096bff4dbab49420f370c2fa1522b52fe3a21c8f26ecb8e8a36922855d720c26ecc515191717838c8b611c6309ab897ecf9e77317c8ca184e58b2e552e4c93b04aeaa25e9f7534261296994dbf46b1cb23acab2112b374a43f23ecc5a02c3c99f3548ab03cd45eae53a67a414458bb22352e0cbbb279084b7cfc450e72d5e52285b0237b8ce651175f7e3382b04c2e2e1c9f08dfe403612f8a1276af71f1ccfd837d52ca8f8fe362ea83b51c6a32c43dd86189da455a78b043f54c700c698e2c3bd853b6be98411c92570aa083551f75d103afd4f8a21420075b34c31bff825cd14529000e76e8e26250952117aa540a70833df772338c8a8da614c0067b3f99ef78a1a5a67c016ab09e63f8bcca48f9ff02d060e98c5e8f4792667f0166b0c54a5d0cfbafaea15f00196c92a99b62927dc3be0031d8bfe87366be0bfaa32f000cb6d8d0b914d6a13fff8abdb83a72c52e9c9bde5db13a4e8f8be705f9b0b762af89e65b954d937356ec5b3f192b1e4de47c153bbaf14621f145c973552c12767e463245fbc253b14fa420a19afb9b0b47c5922145efca7c2ebcfc14db36452f869592cee1a6d8bcc02c4555a97ebc4bb1c5b95427eb9342dda4d81a8ae46210f7e75d8f62dbac2fb4919bb017228a2d4efdd39e17e5e2a290506cb75eb4162b17a30713502c26f12aa2483eb19405cb076179bc20e2894d57fdd252468dff4e2ce95fe8409cb21cce89ed9c419457ee2ec636b184ab340e91ba19d3c48e8fabe131218dc499d82bcf3dda2f92bd8831b1765ceaf1868d51b9c45e5c34b79522679d5a62c7bf8e233f4c17c42ab1daa86410bc504aec238ecf8b7f328e4327b147a58b48bf24762839e36019617e24f646218394143dbd87c4aa72195c849fd8fb23564d3d2faab423f6e82a078ee139bc68c432ab998d95c11755c98875ca8bea6cf7a39c5cc4f6188f5a38a9882d3d08b9d09bb7cb4fc47a124f322435478f882553c73cca0fb19a9d48906f06b930432c99f514bc53b31e85d80b2f7e8439ac141b24c4e2b95e78e1c50d6269a6d9c74f105bec4afec7b810d10bc4f2450eae52b0758c3b40ec859691d105233ab9b83facf27b978275355ae787f5b471f7e402fb7a5c1ff69595faa2c697533a3e2c19e50f2be57db2d81eb6a998c8c81a9ed8a68755b6cb6953c284a8e561bb5cbc37f90bce3e353c6c127b97c1a40bf3b43becc0bfc22369873d257a3166aa7c0cd661c790a3ac52081e191dd67a1e1bf3f1cac5d81c36c7455db5f9c585cdcb610bf1ba502a9b2ad871d861f6348973979d705872eae136e5e9e2e22edeb0ec89f817e322f3e2dc0deb7f31c685151a3c536dd8be68af31dd552e6a8a0dabfef445ee54ad94352cdecfc520c58d9c1135ac531eff78ce67b634ac7fde90e262894c030d7bda63e450bc7eff336c299ae441c736ee66d842468c24e10c825a863de6d3228744645892a5b01dd218966bea22877c0f9d17c35a3b21c3cf31be6818b6e78911e379219560d8d3ef2a3208e2cdc517b6e9b9491bd7459531e485a5caaba3aba19d33d485fd77b5524946d5457361cbfd613af58d41b285352e989e7a917717440b7b31a68f8b9fe6f14a1656a7702bd54cf9ac8285a551a35c54f65f610b7932194e8d0bd2b7c2f2c8b361785f851d452bd4197d41d49e0a7bf1337a7f71dc86e3a7b02589530e2a8ed67829ec5da69bf3f9e8178fc28e31ae5aba9873b04361e9cef99ac62e304b3f6149fe272a999946d24e582467a5df5907237713b6cbfc90fbb2528e9b09cb558a5d84f0456a214b5827549a901a2f468528616f5cd7bfcd05b13e49c22213d65ba9fc8b7b82842546caf033d25a869323ec2035ace7746184a52a786168faf317468ab0e4da64b8944af34188b054aa78731aba7219c2963e53b1fd28bd2842d82617dcc37d545c9383b0d59e17ca8388d9053210b64a7517215f10f5f807ab39da64384f9671ec831d6de6eb1ca5a3dd834dbd203546f35fa812e5c1d6b35e24217e31235177b0c44e443e2ec6dc40d5c1a6d1204509166b3234073b088f2746fe2b6d1c2cd120a68f575a9f6fb03586d818ecbfb8e82684cdf6b457bdb72e7a1184d5e7bbb80be6d38ba11740d88beb33f4622f23ede207cbed885afc7d34791f2c13b940a5fff16bac1eec8dc90b672d35c9583cd8d3d2452edce78b5bed60cf4d4db310a2d8a374b0d5f74eea62f0fd98cac116ccbb40471e6b263858a546aa8b6bcc627283cdcb36b6928514641b2c29f95452cb2f2a71d46011331bbd14bcd0c391050d16754629e6e4ec42238b19ec50b7823d1717c47e461632d8276cf47e39c885cfc822064ba4eea2bc73a7716701837552ea6248197931d5f48abdfeb22a23e48acdb14ee5d671e342a9154bf94a2ed0bcad5c112b965bb189d89fce0fe52a96ca7067bf12d3f293aad88be269b31c93a9d8312e486fda6a0a7912157bf5e4085f8c5184d8e429969e7819a53cabf5c5a42976dc2f922e9208ea6b29053dddf7b05d1452ac71dd202f3d8a2de5063d1e8d3131516cb9e217e759379df6a1d8e75234e74d54e6e241b17da32f2e90a673e8fc27f6c7208fbac841cacd7b6253cd95ae99af74e9c41eb9e871e117dfa7178513ab64d450958b60f94d2c1975e17f93d6faaf893d521739689e89e5e1425a3da7c605c1c4f2575fdc393fe5eb25963452e245e1617a6789d572e5a5f4c22bb18d2493f494d9bf9c127b7d5185644c65a47c127b43bd2e8a674b628bc619e11b8a6fd791d88b1f2faf36ba68584362d12c89fa66eeaafa117b37c6e363be919b38625bb3a015d3bcfd9146ec9451c5f5c24a5ee40561c4f20597fac6ef523a64116b4e9c8c2edcfde29215b1694ee3860fca21c889d8513f178f365a129111b1d6470ade97e231e4436c294853643418eb820db163080fc149bd301e5c88edb92232bec0f74725c43219a771323f5da883581bbd287cd1c959c8850a622fbc708cb6719a930662f16894418e14105b48874687587923fdc392a3cd201ebe201af5c3feb85e0c25bebb48927dd82383e31ae7a25c5c5cf2619194e634d6d4055ee41ed6dbc694af61177431a98725ee2a4985f3b043b30c998bb14967c4c3b6bf95c6f18bf966bcc396377fccf277e414edb07df1538809621df68e0c73c20b42bc07d2618fd9e72e09fa450dce611579102725b129f1e4b0347cc32ec605d1c5d0c561b59f8cc6e371eb1b1ca8b8387ae5db1b96c8f9f0cf2bde9de6861d1c0507bb204e396bc372e6055f9dd34d9fb161c9307f3562395717b6861da3320bfe118d95a961eb22eb48df05928bd18b342c8eee7ff78153662ed0b0e5e6af4669d0f3459d61b390c7b2e932c3feb09b317e72265565d82a3588b29120da0f322cc9f134682ece88eb18c392a2c5fee78246298718d6b18e8ccb8b43541c61582c1e84cfc1b03cd2959ddcc705e11796cf075d549971f18517f6829110bb384e1a3ca30b8b4fb28b4cef473d17369f3c2ff42e546d7a0b7b431baf86a3e1102dec5c3492d3fc5342cec22231e7b9ac99ee222c2c21835017b151e6afb0e675c446aafbe6adb01754ee483e9146e12aecf1dc0541367da3a3c2a25f909e6bcfab4d614baffd28098e5f486159cb9b8b4ea132a2b086648ce6d8201476e6e2bdb22f069fb0a410662be4641a17834ed8319635652ea8d028a509eb54f0ad2f88f8290b1376a07191d40b4f9a2a4b58ad4257ce473d4645099b67d65a9cbf46964fc26af98bb46133bffb47c2be5fd4a1169b2e247f84254fc898dbe0bf607d236c67f1b3b5635fa47d11f6713a9591d8940b7b22ecdb301d8f66e4a28b0f619d55077a92226fef42d84aaac2191d84655246cd0529f73475202ce228c5e3e3d4d1fc074b2ef82e0b5d5c90f7b80ff6c295bc865cf45cb0750f164b5d5c50c92cff71d13cd839b51e9ca6ce8b263bd80b52ca5d94a30e16af0ce79aa01a19c9c192e4d145788c243f0eb64c3a97a6df60ddee8bcc881160834523bbcb8bf1c18b6104d460592f2e48f277e6dd5004d060897627b3935e347a2260067b913fb29ceaa2a079224006db53374e985edc241110832db4247bbf303f268900182c2ae98d15756572be62edc978277caed81e4e867e769ead58beb8a8e2aedce5da58b1ea55776723157b154bd58833598c6c17a98aa57241fc825cdce97f49c5aa1321997abd988b43c5fe156cc3b2e3f353ecc51dd10bd20b1c5d85a6d8bbb850c4bb2fbfc02fc5d6f0c5c5b82817374f4e8a3d52ca4521fd2474318ab529cacce38c9e5a148b547e849a5c5c14d250ac31fff15fdcdd0140b1f9fd4df63ab078ee0ef0891d983f55d28a6b12bb037882bbcac65ddc7562e9bd88a2a5fd78334eecb89be471514af128dbc45ea09f16a33b6c1fa6892d38705c1869fe5d8c6562398f09f569e605154c2ca316b3c1a49fe69758ce2ecb9f1e25634b6cb9a2c41a7851892d4b561ac2d31e171794d8baf0e2e274e4d7ba98c4664126334ab50b8e0b496c521dfecd57249610baf192889dc50b124b1724ad8cf81d7ed72376188e4f2af43143cb11fb9d9564beb0625e5423567990517cc1a39aca60c40e1c524a7627f10b1e8bd8e7e966e2a188b58283584e4f32de48c492c2449f2e0a9ed20d446c9792f352184bb9c621964793496b2f171736e30cb15688e7b98f724e9eae107b783196fe34ac98d3116247e1d20beb192f6f748358e2c2e9c2cade6d7482d81aa3b8e485bb8d5fd005622f7cde2fcab50eb741078825452b86ac7fac64ee0f5b4e8ca61c12e3e89c1f960a91561123429f737dd8a477a6bf20f67235c7871d4c481ef685a39231b7872d5f3fc3c97e1c8f393d2cd2fd30ce79939fb93cec75969265bce061f3bd70753b65c152eeb0a58a36952bbac62e76d8263688678e312a49a9c3e2b0bf284e88e52faed0612f1a890d2c539d73650eeb5c5fb8a9dcc89497c3d2d12929df715862c8c57fc549cc70581eca8b0b1a9d7faf6fd8babc463ba72a76ef861dd3d6410c099beadbb0a8ddd417a5ca5f0c61c3da58a1cc6c3c42780d3b6c53f22e500d4bd843869291cf6d69d861ca417441cc0e8086a52af433fd7167df7680336ccd10277c418585d6760033380ea1a30fea326c910b2a6a6e438d0b21c372f9e05333a9422763d82cb7329c0cc2324ac4b0fa494488ecc7639230acebc5948fc6ff72c560587291a3c855f2470ffec2fe253e5d217f395cbdb0452f94f9e29eb290d42eec38db455df1c1e322950b3b38589a8478675ee81656ff6a5ce0205c984a6a61fbc26908e11c3f43330b7bc145569c34b1b076e13df8228b0fcee515b654933311252587a515d6aa68c129ce42335985edaf1aba988b412ec6910afb8fd8587afc34294e619df0b848d26ccf8d288525764dd446fb42cb6114362f48cbdb17eb8d0b84c2fe5319e8767ecd7e4fd8cb19a64ffa9cb066a54cbd1165c78b6bc2a2a297c30b92cea430615fdf2fdec899ff4559c22219175da94c2e48bf12b6abe8301fff0ce624ec2859c613a47e7a45c2e2a791f78117e77d47d82a4fe4e282098d42cc8cb05cd7e5cc7b26adac085b69a3f0a994715646846d627fa77d51f2902f86b0c7177fe13554a44d17425824bdc81e74713fac2b086b33b414fe2c202cc99ba7faf41f437eb04803df2f6c2e8c527db0e676e1348aa3073b682599f262f06031498996d70bb342dac19652485157299c7e413a58a3baa00bf21705b53f076b844891488ee160cb089d8db137a58bb11bac9df5d5a0b1c136b531497332b4d4608b27eb952725bf69b07ca13f33e9234bf20c7660abfe28471e2a83ed46825590993335069b17599fc5b01c00066ba394c53d7e4a2fca2bb6711cb1bac8b9f0328a2b16912f46b1648ef2c55bb168aa171777f1e345edacd8f2bbc0474b5fc59ecf545e4cc9a13e57c58e0bd69247e673f1e5a9d86caa1f1733d5dea551b1350ab26662211fd2a7582db2b9482b793adaa6d8c2852f98ae6429bae8526c599532883b0f1a3529969cbb24199517a4a647b183548306e1e28b43228ab52f45919f06950b23a1d82a5f9ee6d328c710502ca141f02f942d6b9e3fb17fe4bfc6912769ce9ed80b2a467cd9d5a4913bb1598595df48699c282796f80571452d5459aa9b58a22c7dc34f532355133b2eca5f705f97be28d44cac8efa8f427ca5648a891de59ef4f115f5492fb1864ff3440abd18a925f60211199f90e38b8bd14a2cb5132e6c8a634792127be15cefd3ce543873126b46a8ca0f1346ba4849ec142ce4bf31cbb832124bb464a71f412b360989e59e74b229698a878fd8ec52ff252fd4f2e2d011cb582ed44d0ddfc80536624db370d785215b9763c44e1d951e4ee7a4728b586a529c90d26a24fd14b1749aa3fcb913bd5b22968df350ab69d01343c42251afd2ecc34ed80eb1635c200e26678658b64b4eb39963bfb0422cf1f08b8bb9f21717a58c10dbe5e79ce4e7c545960d621f1309fd68c66e3241ec8f319d839c95d52f02b146cacf5f9093f1852f00b1395e2f98d470e4c48b3f6ca711eb50cce6bfb8f0c322f25d90511dfca52efab04dc805ce95d71759de85c713b117c5cb45aae23b611d47c4f63da315826f832fc60fb14ff33dfc8af3d3c5105b3ea65cd48d71173d4a21d6be0a3fe220ac6314426c258e17f6bc30c21ec40e7bf67e2d85bd5a108b76518829151e251c88fd0ba5419234aca802622f10b10e0971a1df1f76e6c96169911917e6872d177d17397ef17dd81c052fbc9beee2efe2f9b0eea3065fb8b295a3dfc35d747964377a3daca9a1795a9352359f87bd19956a737d3f88e3618da895e6461d950bbfc39699cff6f1943cc6edb05639fa82bceab0f9e547f9aef9c1d574d841ecba73c81b9b7a0edbe6d433e582c861f599a05e8ccb4184701c56bb248f8d61382c5dd894d629a4bd10bf6191935cf4c5c5a00bff76c3d6e8a18c65e0cca5b66149b12faa095f3d51d9b05f1ad187122d6a17ba86252223279906f5c2d5b066a6c307a18b4bd269d8ea6f92833eea4ed1b053f2d3fdf4e2f22fcfb0a3c38455871e174a33ecb82025b93cf9990bca326c9132cc51322c416239cee7c8938f61b3cc375fb86b1f2162d8e472a54a6118d6467932c82fb0130086ad62f45d59beb0acfc8e4db0f0e37961799ec827654f125d17960ddd8acdf8e282980b4b9687e4ae6033b92dac93b9b92825a33bd3c2b60d9a8bb9fe1a17645958f2e5ed8328b38bb1b0e5252fc6283aa506afb05df89d145369b5b3c276219e4e5b15f6c2cb4f6bf949001536dbd2df188994f9ea044c61ade7825cd4952ba3ae4e8014964621c9c1786505ab131085bd24cc4e9c0714f6a2ae07b95045fa7ec26a72dbe79bcde33b61dda87e588d1c3cb209eb997a9184abfc851f1316ebb2ec5fcf136d09eb69c8c546b5e9a294b0468a9ea79ee8820c2561ff82ce8a355edc057124ac5d5416d1718428f5088ba45e4999fe77bd30c25ed87b212e4f3968a68bb0a4a34692eaeeef89b0d77d17a7d663e4f021ac8f1eac43e6878c0a61b1adeb223bfb4609c2961abd3278e4627815202cb15e10d39ad6af1fac8f0d8f765e540ef7c15e9442a50777691bdd83fdeec9feb1e31ecc83bd276ee5a2cf6a7e078b58d8a6adf407eaeb606bf8d38b9df977c9c126abd3916a1cecc5946c4bd51b2cd717a29ffdc5356db0e32ec81872e9173ab0065b2efe6d86d2c8455dd0e03c95b88f2e270998c15629faf7bed642c3490264b0cc8fe572d445d6c53749400c9614b34130b5a706699200186c7954352ae3b30936d1e2159b794124918907d545132d5cb1a84c17757181e44839215ab462c735bdfbe851499a102d58b15fe4c22f483149c326448b55acabf2e00bf6325708215aa862a7fcb022aac8c409215aa462c9b5a37e314e2925440b542c67ba8ebb1fc99d8468718a6553524682ee48498816a620a5745d14e62bc5f264f18bd7b9b8294548b1837951c5b82e6c4679144b30d92f08592fca4511c55e3a635f1052482f2e42b179e3a8eb4d076a2928968c52f7da17463dc827b6af6cc88567194a2c3db13f7c9c7774d9543ab15326278d39b104effc89e6260679263ea6424d2c21582ee86d3013ab1734bcbed5db5331b1e48213ab242315b44bec615ed0284f47b4b0846b2144439eae128be4c39b0619aa394789552c238a4d7810be4d62b17c4e0d2677338849621b11f9997fc6c5a345620b292776f156ace41881c4f60517d39217a524e30579c41e11fae6b18bd1e52e8823f6ed2e2e4823b61afb62e83f5e92b9208c58d2d2e5e2e2a2738cd7228b58e56aebd64fbdce228a58c6fb1afef6ba602c9288ad31d066e4d7955211446c8de6fe632a9f2b831c6295b8b2465d0d42c82086d85205c7d457e1721ba4104b63fa824a21242ff06210426c2921bb20e32fae5c3091416c17a1275ff445398708622f797266b461669540ec8591416ea385c79507c40e4288d340bdbfe2ff8765227eece5ef87652d4ace873b1f731f166d8cce450fe191c88735f28bd71bbe20ddb6874dcc421f17e4179617ae87fdbb7eef1b595a250fcb8a846824e245c1c3faa8f2547fe964de61894939e951de8a54db61ab905f98111b7d1df62e46a99bfd0247163a6c695b69a7b9b81f3e872d849a91ec42098de5b0938c6ea42ed8b4c461a9a92edb9e5c2f8cc061edba8914f5c164fa0d8bcf7ee15f1c355bddb083c9a45f34a1bcbfe0366c21bc1e52faa2907b36ec59171d484eda8bac61cbaff0f56f8c66356c5e9032547ff5799169d8699f0be21bcdf987864525a3df0c6dfc8d9e61473b2b96b319168f0c27d79e65d8fa29cda49dcd2f9e0c7b5e88f0dcbc53f9183631e7b02fb2e460a218b612eb116b8cefe2300c6b7a7a51e57d8a5c381836fd308996715fd8428a23f90b7dcac4f3c2de29c18b34bb2e6c8e376a22e548fb7361e72fec66ee8228726f61b34b5f50651a6ba185edf3d7fe1bf7ec33d6220b3be482f2825c150bdbf58a7881c5875c985d6193132f982e883f2fcaacb046834c772ad122635558725d2e2c07de18a55c5061992ec80fd1b8d0ae723185254f6ed3f11752d8f285468488bf5cd44514f6bf1cd38ce2bf510a0a5b72ca4541f523d35f4fd8ae29e724fab968524e58766f232b17175d5eab099b35787591ca84bde48b223f3377cc252c1955cbbbf0762c3594b06d4c87470ac9d71949d8747261f78e636d3390b03de5e2c25ef9112fca11960821ec3835ce84901116b3b26d0c2ea35c5211b6ee46fd248dd45244846542cde3d89f8b7e08cb844d9e850c0b61fba2e0e3bf5d9192e1206cf16e7775f7d40b1d06c26297bb1b7731fc83e50b2265722d7e55c33ed8c2178346da395e90f6604d8b7bdf1832595978b0dcd88591b4f6eb951d6ca7dae3e02188648a0eb6ba114db1e659fb73b03583929fb090b53e0e96b52f0a5e94b791bebfc13697511a5372a1a5d8603fc71559971aec207e514aa970b6111a6ce6eba3bf3f1664d762068bc3a3c53f8f2e185d0b19ec64318d42adb13bd722063ba47874f6c574ddb91630582c6454cdb7161be5158b5855aeb85f50f9b72b16afa029d2347f7bb762f982f8911fa359b1c53cf1bcefe242a77a159bffa4a33b8b6469556cb9c71ca923a73a155b68522ff00641c59226a319eb92670839c59edff5950b35c5965fb45d107b32ef17a414cbe5620cd2d197da4f8a25522a6ccc7d4fc828b694e18b5248b310c5dabb3bb930525e47b166118af531b0d3f4ca3f21d62c40b1cac67661484adfb86a169f581ce5de1c3b5dfd54b3f0c48e91a21ef3cf733154b3e8c45e0c224206124e2c4fcd82136b434c8bd3b822526a169b5873bcf0b6c254238f9a8526b6f1a2886cb4683251b3c8c4162d43113111135b76815fda2ef0127b918414323fcf536d89a54ad5b367b6247295d8331ba55e5e89231e259620c90baaca319acc4d62d1cbbbe3cc15cc39496c4f167c3bef9c5222b1d97d716d9c64ee0824765c9495bfa8bb483cb6472c213a859c0ec2546a8e5852322e905ce8dbd15923f6790c152abf7139c6881d7645542c6d275ec4fe05a35e142757c278a1884d2ce7e9769188257651a453294fffe202114b7294db0cdbe9b8b838c4fe85360f328a6a769721b6fd862fbcae0ab15c689230219ea65684589ed71c175f8613b21ac4122bd85e7cc14e642588cd727174f1a4e708191588cdea0b9ebf8b3faf29406c8f2ed4f4c65f5cc61fd6f993b067e945fa0f3fac11b5e72aa8173cc8e8c3d2b8487ea2cc87c5cacf372ec506e9d8c31225176a359e5cf0bb1e76ca95e8b8a00b6299871df255252fe8bf4cf1b0a38eb2f8690a71de61f90b517fabce184576d87203c70df148d3aec3f65c345791a1a333e9b054e3824be5b38db639ecc56472d18c6621871df38fd6c676f8a564167158f3eea3c6e724bfcf2ce0b0d798463faef4433cb378c3e6e85f1cc96924c39e59b861fdd39ddac84c267a66d186f50bc731ac895d5c5c9c67166cd872c7a5fba291e9e23bb358c3b27d0fbee84923edce2cd4b0fe17d49543cde6a4338b342c9966c24e9a5c5c63671668b03a2cf93faacfb08df878e4c274f2a7cdb0efa64c3c17173ff5a40c6ba5e32fec2f6af03c417756b3c1393286bd28f9739153e7399ec5b06663948b520691be600ec3327f125d4ce1b2a10c86b5e28b2b4fd863a4eb17d65811fb91a817b6a95cef6d4a4d49edc26a93be74f7cf8b26e5c2f20f2be4546a9c8f6e614bb35e89730adaa816b6aa8b8961f7458ece2c6c1ea172314834a824b1b049549abce605df5d5e618fbcab2ebb0ab14a2b68e1cf28969155d8f4b9c3bee852da23a9b048acb4906ad47ae414963cd653f6f985dda414f6d9d91b3195cb4b14160d959959abfc3d14367bd4a8f9fbbff07ec20ebbb968e451d5d9e884d51ad74ece17176d049bb067ada4a7a4758e4426ece8297d95f3b1425cc2fe0de269b55f640d54c2fef9c55f187792d3bc24ec61963e6ad671d17848d8e60b35bc487c1c7a7784f5b920a346d11b3fec8cb05386d3e91f5f94a51561dfb554195248e12e23c28e0ba79f42a4786ad910f67a342fa849a9ce0a8750a82393401c0c8582a1402014040241e1acd701b319280c487220c9812cb7d6031380c086e18030100684816030180804838140201008040241008140201008040281205c0c195f03046dfdb8b660f01814820bb1fecc2a87bcdd0d6746229a07f674bd5e000feb36923f4addff2e52bd144dd2218c5d453176dd5ccc89d3c986c1a45db75bc3cab8663d355a532a06bb241d75a8984b52ec74a7879abe81ccda6884c480843a446578141c661b2ac66a975b8f4c9e399c87fc36ccd242903854d684c18fa0e1f0892de15e817086bd9907a6624c52eb89367e9ceacd721108ae8c4ac72ff6fb1a3e659e3e6be660f2b0e9807123c95c877b9cbb6d51297bc6524725e9dde1105f25b141e99f0895e462e01aea0dcb46f791b281afa572b30939f623a5d3011feed7b3a6c494a658a0fbca3382458bc668d1509323a5204648424cae3a4f73b7eaeab7dca41d894c5b588291ce2f1e3ee2e9ce10cb582392d6a0a64a4ee9df0ae94f59eb5133dbab259a9f9bf230c228b5ce3f080e8b3b50b6834db4492a268311c9fc4c63c12e2f3787fbceb7565877923aa7cb7338705932be0ca421a8fc7c63648e0ed32d62031b05f714084394ec6d40244b234aeef7d7f3c640482c8bc48e63e6d3d2a25513d74cfb807d3db19ead91616be49981fde050671f0abbd9246547a1a592cc416c84cf8c4e183739303d37b9694b0173a1ae7c71464d664a1e4f871d933b3e2ef649907d5086f5bcb8396efd27e887b359e7d575b8df0e072c4b66b14b9db326a12b50093b0ac185cab87128501b9a993c373b60d8e4c8ec04d289657e393f8fc76b70ec713abfdc4f904d6665b0cbf9f6badd1f97b9c525573c28e2d9f51aa0b0accbe176b9dd4eb7a3eb72bb0e7786e4ea769cd950b8cc6d2231bda8a9f3cc1a91ad47cf2bf62874d54a34cd5f085512943ad78f0aca9b4b86c6b394484c7e3d1dcc0804ea0b3f0883d280413038ecc4b2e9d0497872995a40eea5e1f8db79793a9d2fb7fbe9767c6ed7d779dcd19f35be661ddecff3f395d53ec813c99a3ddc02afb5b54180a2c3cbf57c879fa03c8eaef9d3fd7e3eb92e07c66b5532d02639dd8fa7d7c8cd11dbff3febb0b901854724d74047e20a6f75abb85501d14145a0139567d841e2500bcedbf5e5be3fddc7c7e977f444ae35fc4f2feee3fe447ed84df6b1edd42e2e154bcb0527898a316c48833c09357d124912e8ca8b1d2d6e39116c70d646a4b01716c2d05538c254fabf63e2d809b2e616f6cbdd9e2e7b1c7e8e1f9d7789f4ebe53af9e84fa8850cbbdedee79303e10202928edb767ab86e4b41998e96063d420a69325202a42d2a6f615c6447d7f3f176b9fbf9530d0a93bd36b0bf302203e66cb0a846c52ae5997bc240b2d60989df8ed7cbed70749deeaed3584b8673986375be3a4ee7eb727f08b9f2854f937a312362387c24737fbbee0f20c3b2616362b3f0b1a85cad70e8eb7d1c1d5debe9b65561446a6f1a44e4256a6d94c0bf44b7b28672ed1995eb775ee789ceeb79fb8c34bcf7297776df0f0ec7d5e93a3a4ea7d3e574381d5da7bbeb7076386797ebe870b81d2eb43687bb5617c3e1f17abe1e2fb7cbe9badc1de7b14b8600824a7e3d68459084981e2da168ed28bffdcd51dd6eeedbf96964f46429d6b219014d9dafe4d90711412dcf8cc131c50863ddf970f06d6647c38714873733f97d58395e4c97362fa1a2055be394412a5ae0d3b32f3bfed695fe01acfdcbdb618f41f131f9fbcd8c4625cf97111f4122a3d0f4db5dce00e986d9617f02dae8fc08b56426da5cf1c1753d3b9db7d301ff1e03eb68c8703dddaeebcb717dbb6ca3418e9280343192545482b2eca871ba3aef83d37575005c32867471fce578b9dcaeaedb81f13ed427e2a0da70885f8ceca8d3823dd4586bebae2cbb3a1e2dd983d60a3ed68d3dddaf8703dc5561e00b6af6fd7a3f9f5c97b3e3383b5c4797e3ec70ba9d6ea7d3e1c49298c25357396280036b255883d9dbb1b054784931acd283d66c8ec46e3886b29d5788d112502349214d8e9040beba0fc787fbf8769f9f8ef7c3856b10798dc22ab7068c8dcb9f2d480477469c8145af33c07d4c31227b5878a42a7e90cee1593477003cec6e6d883003df2f7e805c9d4db1b0194e53fabc973df3ae0ab9cbf8e9eebe9f9eaeebe33a3e915c401da1ddc442a6ad385cde82c9b770e889818e1aa13276015f6f8fae16f75d956c082c1e06023986ca3b002ee24717c68f07c702d01e3bd4d5f97eb9dd4ed7edeaba1c1d0031a440b5acc3fdc18acf5f0f375bde7539590834440ed63e1a3f979b8cd57e8842f07158ba0585c670691326d9c06167267ca12b394b182a69c1c2cfcc0f225ff333111d2f67e1a70c780406a392369d23054a9c528d44e9eee84cfc894ad16ce98ee0014684124477295de249de0eaa342c9d2614134a095aa2986094702578254a09522951422b699ca5ff2746bfc75b09514228812919951025b4529c12558a50ca29412a11a568a59c12aa84508a53424b28a68c52c2b5f485e38e9c9ba424a4c42a4528714a1d482946de74f62e9ad29052b64abdc7058435b2e5a79a97d65701ab6217433cb5d13d95b98ab347b2905322e4455b96201e950d08b6f044a2d1c8a828d25cf4023a54e06f0d5aaa2c44d5f54a884528463d609d792b9322702a090e6e495b32f0f64c41e221c591781248c98c84404221c195843961915048914804099a24b861b5948ae449514a192418e98e0475843c428ed0477147f40802098704894490143aa42c2899042b34240b098a94400a4312232451c038b7b79e123c1212298cb4234521259110a434521c528a8440ca21414994120c128e048f44214122a5248492e62265b1305b247820e191324860243b524385c47b4e47624c25c97eea06223512036981f444b220b99176482fd205d287e42d41d256be711563a420c95482464221219110a468240e298a9440824322912248890e8989033b14e487048f44228591ec485048245204098d8443429120907048482404291a0970483c4757b94219958ac4aacfc2002a67c92ceb3417350ba5419726f68d68a81de916f5ef5f2c016114ad6147047ceaf19a5268f09fa3f027167364580fa88c8934ab023d61ee5c606524725843c0674dc176c3b8ca1aca2ab5c16b1976fa5e32c2e7c259dba4a6290ef3d63c1410a0fc286458ad8b30b9cfb8503aa69eb1a4bdf774c5ec5b3701318a14ef7af7fb7e25d362811d2d5dbfff535d775150a1c4286ff7ed43dc0719064449ad0db7580e8d1910324dc34878777ad7ff00f8c078c6e5b527686543a6b800bbd1a0d3f8838ea98fb741a355a30560be205ca4f49846779ed2e4f389a22cf78e94e4ccb15b3353e43a6fcc7c6379f782a303e791e1b7f51b19ce2e50e26d5ff9dc8e61347b24d375bae048cf9c4891e7ca67543c2d2d98a84871b7c885d96d8eb68645baaf9a3800aaa501d1af971419ab0b75323912e7470e228d5a180fdec35a2f58763a7ab2526ddb8919187ac19b22c7943470611a36c47345c862d55f99dca31263582b42f5ee5cf1d0286c950399a15dabe14ccf2c5ce2d758b1d6ecc8c9287229290671e7c9eb79a977a4aee86d49aa6376afad5b0fed3f5cd4be830cba1f8988ee6c09efed2f201420f773bea9ec42a290651cf947c755bd9609b7aa4a8599e46742b73a89888b5d4cc559a94db46efb421e5fa2413570ce535b277700b5541b25efd06c2eb4486be1998f071cc50cdd544e8a5ed170e140ff41bf81fd713f9be106a03290ccbcadbc9d416fa95469d6e83b0f43a7cbca31a9e70c642312d514da0ceb7222ce0e73d2d238484818492b145e139ba122267d97c596fe383423e4401138224dcc2522f5365327c13abb6712aab1fc42de89d4c18e0db214b8d56cba90ba3d3fdbabb58f526e2a4f5db90794a42a103da5f6c9147638f67bb85e5f0ef91eec50b893e0db02c169b78cc98277cb4040812c70006adcf1b7ec16812068c280d9b3c5bd052cafd753c99eb1da99d5a320b76517cff6a45229d281beed49570a518114ef578a9c24dfabd378509edb0416ea1095345279647a3db0af872121aa20c5d13899c48857b23165560e4241e479a101860f762985b41e593c75faadbbaad38a2634c053584bff64a1ba8f2aaad5d5a322b8d786e339e74a089905a5af4305bdec65ca1f4c620ec0658d2570f25270176d4938055507234de364e688fd59971e578493e62a5003db0100015083b4c4609e5e2fd7d1698a4152879d6a60f184c9dcf7002dc934dec0140fc30c2b0650e555126911589f6285d479cd243eb294072e0444bb9101571f5d4e577cad9e81ddf1cd790fb5f57a377b8579ed7f80c2b3dbdb303250d73329d891315df098eb340ba256b282fe16a9dd881295b654d9d34dcb9b0f41eb1614db137003643633120403153a7533574a9938d183b7fb1e49970d1cb6cd1dde8ae88242a53c1a4a22bff2c220ecb05f0972f92c379a789300f3c80b5183cde5f35cfb6a1a659794ead5732bf7c7412a42d1abe56c35e666f703d98dbc0f1377cf1d6d5382d59b6cde7cb18abe8d752dd994a2933392cc5011f616bb04ec0cd882ec2f6d798056143e8500fe9f135fd85533ef8b32a44461cf639d60d9865466ae1693892626d5bd844d2e1d0b2e2ed6e990593395f25802740faa8fcb6a9e611a635a1197e09faabe6df1e60d18f6f9d0833304515a651fd4808590c2ee8342ee6737a82a41ac4f777ad02a9889b52f5c86e6798b515809780a595c1fd02e9cea9110252bcd70aa5d1b48061aa381abb4d4d19ed14dbd14d0b43562cf67c57c57d0714c43c5f82e1cabc16aa9540a0831b46a24cbe3da0ae27da86ee591486d32035f3c98ab8d0cad7baab3083890018eca415744de45d50b1601604146f1cdab801d071f1a137caf7164fe408665456814fe35a7f97f6876bc54e0c90e89e7fcca17c77cd52a394dd82a980d9cc795ca3484631f428b3992676288810cd44fbb339f07fe5e42281edea5fbbb04f059f1c8057d93bd313db4e9dd487043b6a891083c3ed8004e09c4cbb7eefc26bbe09f198224eb6036c15c3c8be05aaa94029e767c900ca23b917795ca6337e56003462f53c507aec1a09550bd5ab3e1f20843b120f19a0f9e8a3a58b63b816e9cb5486b5b0f5c72df09eddf930260ad1cdc49a1cd14b845ac7cd9d79b027541413863452626e6f941c9bc8537599f96a6451ab6929865aa570412bb375d8719abc4fe7e8822458fa6efaa6f946d8c3a424cd0c1bb938032dd53313727096e772ec80525114e1f28586484a3c20117732282467e3c37c93d361503ca0265d8c0cda9aa16e4a149205b5e47b3b220228894e9b450a0e956401c748c010cc9026e9144e60b3960b26639ff000000000000000080b8c9cc3631d2502538252995fdd10b65505e729229a5945224bb8377c199894f6739111121ace035d30001670b5e0ce60bef683325bc8451e49efcd3f99f4c3c4b982527254ea8f02425555b6cd146c0a212c6b2ac9c3a2499e392a784a9fc248720c4040f739a84a9944e29f9b8a550b148c26ca9927f12eb3959072361f4f89f4a8ba70f1d868449a28de6a41396d5a4e511e63555a5e242270f5a39c22cf93e2413ffa666233dc0a21126f961e4c4fffde4717901168c30bbfd6be9bc4d0c1db15884d1cd4ce7550edf692696032c1461ee92fa41fd5dae3c1e14701e5d7c7cb8179dc30b2e126191088369b7f8d2d17dded357c002118624b92ebbe9e343f5108611d2344c8ff232f5e2d83ac18e2d7af0388016d291821e58002c0c619093ba4ba658759fc875e868004e008b42982fcf88104252275e731c5b6701d801168430c7f06842c8d2777be1e124d09103021fc8c38b2e2a80c5200c6164f98ff09f8f20b2a30b2e72dcd0d1a8879505b01084219d7e5fac14a7238e40f2d43b2060b55cf4e8132016813075f57e0af963eec77c738005208ceea93fddebd78b5f204781f9f8f8383bb64000173d5a031f1f5cf4e813fc008b3f98c32567c7f6df0fa61443b78ddc2b797dea83592b6c2e7d944ad31e3e20a63fd325bf573007173dfa040413167b304792cf36a3a51e4cf1ff4a788a0db17d1ecc79f2541251ca4377050f067349c962e9ff87cf1d8c2d96a523ef5d4ca87630e89323b2ee6b3a9c590743ea0ac1c445ee43ba38b6b8f02dfc86172e8222021d391a60430b08e0e8d10ce03181f6a213a005046c58200211f8b8c1830b2e2060230b1b0db091850d2d6c64c1830b2e3e3e724d021db811003260410773d8ccf31447058ff61c4c91c3423998435475d221a9117f4227ddf01c3cbcc0c5220ee6b151c24a454b42aa8963b58080e7a8c5020e068bd1f5df6ffb26b63798424de4cc730e7b31371854b84e2acdd7c94d6e80451bcce737b26b7222517d36186364594a2adaf9f86b304612a7a6d229b99f763558e259c48b18556db1c517aff558a4c1ac9be7418c76133975349836846c6a842bb72a9dc18cf708d61272580a1516fecf7abb92dae3c6160514e18085198c9dc3c751736254e45019cc2363e4652e25c9d6218361e488988920a3fd3406d3e438a21616ce6a6e31983563728a1b6a3152c260886a5d796ee54c09190c86a8719556de3ba760f9822964abf420fe23d55e2cbc609c90ca7d537b424a2e165d30259371fb49a8b491925870c1f8a62c890e0fdd17c6620ba63aff9a202e24a7190b2d983e2fed7f5b2de59f05f3edda270b62c1a0468be98eedfd90bf8241281d94ca9df3fead60befccd0ba54258a70a8649c193fc3931a2a6824923e52a51217676a760bc113ad827a54494b8140c3766dd134456fe2898fdfd52769ba060b24b4a94999e60ae302d0b4a26a8607282b9c3fbc40e69b1aed404f36d4ddc581b53a9c4048390e4f951a49834a12598dccc7f744cbd9591120cfe1561df92970951124ce5b9de672357fc10120c2ab4b5460ad9f742473084f3aabdd908c64895d45aa67abfa7088634e25abc2f858e8960b64b91904fe78b3b04c3c87ee809316f4121983bb4727d4bbc6075108c1a5ae6dd44df8f180826dd49eea494fec094dec32525f481d9b3ec576d4eec7b605a0f213e5c7508160f0ce7f37ed26e6c266507a649cacae36469cd3a3086d2232fb9c4486d0e4c39957fb8fb9e912d0ecc23c2bebba4eff5dcc0e07b417d642d7db50d0c39c7554d6b95546b608e9cba91e67e749006663ff70e49a258ccc0a417c94fc85d0f7e6221039357becfb5768964621103b3a82c15b163d5ac88050c8c15bb44f8782f41432c5e60aeb1744a56e91c2788850b8c1a229458b5919ebf5618bf66b4322b88f81c2b4cbb9a2b42bfbbe55b85d1ded2c7247da7f854619878e51dd254982cfe4a5bc812f73a5418e58212952ef67b7d0ab39cfcaf3df1142ba63089b85e21772befa5300915f495aa5eebcc48611695a3a7e53df949a330fbc4b75799b4e5118529c95ceda148e7c3e29d5d7f0528cca9426fdebbdf5deaaff88421a4d9f2da39a95efd159e309afe9045c8bb6421f2577482b3f0f1a5644e18672e45c5988f2293df84214cd813a7ab445cc96bc278d24549d1fde422f94c98fe478ad9589786e4316152499c9abd3c5a11f297300813f549c912c6f2dc6982bef472254c695dc432de4789286148f1f3db0413f5e0240ca675396a9a94ad5e12a6f60f1f97bb5f110993e409da3a0e09539023a73f852a95f64798ef3545a4b3b5cfba234c5e1ef7625ff6f3bc11a630ab8bcb39ac4e9c11c69c53a192476599d222cc49a7ba583a8a30ac7b75de8f367127c26c55ae35c2fdea821061ca0942cc9cacfb121dc2f03af24e68e8901c3284415384ec8f0a613e4b214a2348ca39210c1792b8145992ae681006914c27eb20e52c2d08931619e79d130853488ac9f2d67bba0308637bdc47999c3f184ea4ba373d91a1f783f1e4c4f1be4d39f5c1189793cd8ddaafe08369d72ac9c88f12e6f62bf6600aa1712341c4d372fb157a30aa8474e111febfd27e451e4c498a5a07fd1b9e6abf020f06cbf693c3772badf62bee60ce3ac9a2b32d9fcf7e851d4ceea7df7284cf1062bfa20ea6b594546eedfcbeb25f4107738e52ca74abcb48d9af9883297da77a285d2672ec57c8a10fed252ac8380e86d149d2747df6990a1ccc99192fdada41afe50d46d3bbe962b5a554c50d66494ae79419e2c76f833949ce12d1d1e494d87097ceaec16821af4226c5cfb96a30f656b6381aa9526ed360c8e1933f77ee4eb668307d65d35efd19cc492bc98b6ed941c90c06ef90465e2ab9b1cb60528ffc398914720a198cd9fa41d49598693a0663abbbb9ae05df93180c96740ea5274fcc4f180cfabefec14b771c0cc6ba14f2058356cab8c97bc19c63d3d7e2d80583955a2ad70b9572900b26b37d17cf168c92f6c2e7685a5b6bc1a04eeca44bb79b2466c1242feb9665446b8658307e94a43c9676a7fd0ac60a9362276a28d9ad6074b19454aa4962ef2a1882f77e4aeed321850ae652f3c1df2ec9186f0ac66ff71e2d1e84474e0a66999073aa1b517a8a82d953ce90dee92947a1600e722ebde80b23567b82e9db4348312c6858e60443acf8fa53130c4ae809f3b2fcf330c1e859c277ba7c09c68e2d7247ab04b3574753d92e8b102b09869dfc576322c8c948304b786dbd541d371ec1902488d38a353978c48d60941c795cc4a7ce9e22184c63cb2ae553b28960ca397d0e21e88760d0f5a1e4952f04e3deada4fcebbabc07c1a0ebb2726ccfeeb803c130c1845d9a5c8f1fff812986ac7511edf39efbc030bb1652bebc07c6f55159564fa6ef3c30695aa96fe98e39edc01c64c5ce331f3c641d98e5db5bd667239f03b304b3c9965246da120e0c2397b3770e4a57dcc0a02d2458078bc9a693aeb08171429e554f6976e493aea88131bf5ac4af25ef7ad2153430df9795e48a26969d74c50c8cf2a19e92909f2475d2153230c8f3f93bc5c094add6e91d8447c98181e984999ee79314e117984f729820e74de5f60a179862e64edef29845bb1506ab144595b24e396785d963f474a7390d60154693b0653db92d89390d4015a691b816caf3b2a39c06900a83f80ab5fc719e2f4e034085d946267f302de6794903388539744ae9d2d6c5259534005318563d4ef25c97824a49032885f9de27e69bbed15749032085b9538ad7c1df51984d2bf96dddc9feac284c9782d2f28e8f9ed7501882c7299d2a7dce5550988238552109f513c6502a926357cec4d31386eb0f8d14f2cfe6ec8449cae5d071a1546a9313069596b5fa44db4f7213a6533144fc7b8e89a426cc4988d7ca57c23f8d9930c50bcd17a174282d62c26c613bd93d4e902a5ec2fc6d394fca2a524eb4844157c7f54bc81647ac84c1da939ccae8efec51c228f946958a49dfe24dc2dc327adbf722a7de246136f1b17c520c3dbb45c214943ea97d314818cf42259162bb9c8a3dc26cb9e4759aa788d71c614ef3f813ef456dde08933ef3dc18d58e38234c41bdf48953a54598b4ec3e6a959b1e5552847154275372e253d44a8930c4482ad58814220cd9e495178e63ab046e5b740e2f7834053e3ebae002414004314261d0b14ade77b8153b0d14a6511da27e35f285bdb8a18595f909c3a452310f4259126ff18441bcfbfbfec48beb924e98ec442c75937a4e983e8730ff126ad7f9dd8421491f219e7cb5fa6f4d98c4adfdc4e26bea9c0964793c915ef49830cfc534a54b9a45fbf8254c623d61ecf6630993472ea16584e95dcc043bb8701e953085abb0101f1f4a7a9e12a649522788d29663f63e09f3db8e1eb9de75a2744998edd48c52399eeef84f24cc5b39f442e80b0953beb74b651e7278523ec2b4dac992cea24ca986311c6150fb94ec2531e7c26a844982eca42b4f0a238c257fe48d5eebf6d42ec2983d49681991922e971788a1885e9408497d749097449e811ec4488449e343089af6a1e12d224c31b553b474bd8fc9310e61ba9c66a5b3970c578b218cded76bea3f5d340f2d506314a23e08511f83a80f84410c41d44720ea83470c40d447c6f8437d580c3fd447a1418c3ed4c7c6e0437deca13eb80631f4501f79a80f3cd4c71deac30ef55187faa0437dcca13ee4501f3de2501f70a88f37d4871beaa30df5c186fa58437da8a13ed2501f2c831868a88f5d418c33d48719eaa38b8b5186fa5015c420437d8ca13ecc0431c4501f99821861a88f13c4008349e5a38e7eca4e417231be60bebaf06166f17951dfc2bf50004a2086174c2f71365f4504c756b1a200046cc4e88229e4ca25ee92a8d24f9387175dc4e08249f80835ea796c745ac70dc7811a7d7c64b221c616cc61e25c3645e71467c2b15f6cd119d8420c2dd44716eac3041a851858a88f2bd44742218615eac39a10a30aa69896944e6933b75b4220c054c0f453e65d374ce98a0b31a6501fc40731a4608a7097efdf2f0488110543d01cad311f5b9be7e0a10542c13cb6134f58d0e76ff5134c95425e1339751e7fb303319cf0a72b29808b8f8f8f8f1e3988d184444f9425a56409719d550c266cfef7a37264cb02812f22808004780e1e5a94f2e20b2e4ef21c3cbce09540076eb020466a528a6c38b64a046228c19c722ebf5cba5369331c5bfa80184930e4483fff231e3752a0a30b09262d0b313c2795021d7da347023e3e7af0b8a1c51dc190b463c673529edc92838b1b5e54e5888017be4517397868f1f181821c5cdcf0ef06502086110c1ec48938d273509fca05c42882c1b428f923ca83758c318860d68dfb94ad4a8c21184ddf82b5e41c75430c2198654667354f9d263e8b636b6d68b100df2235c08a1a6204c1601fe5dceee28e1e2d0610cc29ead7c7fa42ee5a706c00c210e307861cb44feaabb4b03d6d64617788e103d3c5ce2df3e949fd7c7786183d305bfc531926baa4c4df5d016588c103939c79a55cd14c057f0706a97142258f73b1132f5588a10373d029d3a5428c1c18374c54124f7b3e4a7c420c1c184d490aaf30314b4b929d10e306a6901e26ff2e6703535ae910ba7476dba56b0c316a60fe1339e84e21a9c0108306a6edffd473ad24c287ccc0f86beea5e424f52342323025519ee3f3a6c28b6288110343fe3cb59b1b51171b06a63c219848fd0922b37203005f88f102738eb53be31741ec371c5b27681e098717394e502a10c305067d77d183deed8f4db01480d10ae3555c507b665a5dd2ac30888a2bc1db3c5b296f1586a0aa35c64accb652706ca9c29c823091539d07957bc4b1d5459fa007a6c2382792ae3d4c82ea098ead1b3b52e580810a53f6cca99168659f378ead146cd145175ff0d8f15d6c71036dd1881c0e18a730e70f31adb33cff4444304c614ae92a076f4f716cf198c0c787177e012fbc078c5218cb2a7fced1742c550b8e2d1c5e741737486152425ec5a70869278f46f198748932b91dc8038628d40f299eb2ac71dbe3d8d291e386173abed8c1455f280cefa32532418e63cbce4061ceea9cbe372c4d72f609d3ba58aeeabe0b793fc84d80e10993a754a62a9a5ccaab8e9900a313c64a4bda934e73519733270c397878aceb507977dd8439454ff932eba45f76760b303461be5cd1b2a9ef32166064c23c7a2fd257b2116135c6843953477eaeb45fc234398f8822e243ea060c4b98633bd28fba45e3c006c0a884c15b23b9278b6611d238b67a78b1031953c234d26487cfb14b8820c7b1a595c53509c35bf064f1a246894f12868f0b9ef20461a193aa877791022fd22261721d554a8849c3808429bf47d49d5ae8fec500301e61ec96db154ba336dd7584c1d64ccc5fcc64e5ac11e6e896113b4b25553322ed36f7a72b02631126ad10f3e2c58e1d3c9c8717058622ccd6f15408f1eec9548f638b1546224cf2248e8ee813224cfba3659e11c566a28730e64acc9d94730afb8b1b3dfa86dd086018c25841445c141d17c21cca948c0a49bed75c42182fd575e7fd76f04be1c1c3075102188230f8a98524d4c9458e6f717a3d002310e6da9d1c4dfee9c9d7b403300061d2f2d99412def726c4a37d0b74a501187f30a8fd0721596d3e77bc871f0c39c5be32ef1bbf14ebe0f18517ce03390abcec068c3e18cf447449e17289f8513e9894d4165139c7716cedc1ece97b2e5acaa1549ebaf0e28b1da62180a107c37950212d9f9ef4290cc0c883512dadef968824d7461c5b376ea4761eac783058b8e0af39b61d940227c18d3b982f7268ba6f6707c42389ddca7ab4086e78d1e38b11a426c6861610b0a15ac0a8433a9e7a8eaa0da1530ac756f6f0a287d526187430569e07734d8b306a9d83c9d453b3d2a4c09083f9f2f64c9ecd8ff8350ee6a042742909b26a25513818de6e3c96f8784258d20ea4c5d60360bcc13417f2271d74d2e91a99d201861b4c3d295eda274dadbaed00a30de620d4945027721299a52e3e920830d860f2584f4f29a4d316131b5964a105046c7c7c5cdda84c038c3514bed3978a3123c401186a30e4dc9d2b52781396f438b6b6d8220709d2604ef961753f6c9f8eee80810693120bd984089fcfa7835cc0388339856fbd4ed1feeb2f2c8061068308afbc3ec92feb5828805106834af6d5e66b6bba2a0006198c7dba4aa938722dce3198ff5330f71f99e02602430ca6eb11a1477e483977b7e891660646188c67a77b74f7e41131c46030cbc858ef4aad9d4be90b26cbcb79628885cb4dbd60dc519315a5adfe2c461fc0e882a9a4a72d95e4ea556e12e8f80247160c04185c3088bf86af564e397c10171ec0d882a94b7fd093e42249ac7500430b0619d3501f16a63a4453c78e2db2f8f8701d3bb6405b6c00230ba68be9a2838d0a92afd29103f1d8a10019c0c082d9fa552d8534bb00e30a260fae9a154ca284927e6511926ec80a30aa60cea6957ae269ae67870ac6cdd4d79ccf140cdb6a91c65435051852300517e177d2bb17c0888239a75d4f21a7dce95281020c2898dbb6a34553f539c1a204184f30cee88aeefe499755824780e104f36e57ae10ac2b766c0b46130c3997be907e774ccadd4302370a06134c19fbc9dade37ec8438b692f31d184b306ff955346d261c5bbec5692f5c046701184a30874b3c2dd9bed1c32a00230986998f16f3928663eb46046020c1dcf2aaa25b44f87cd71600e308a69c65d27ac81249e88dc03082399f8a5e71e32910c02882b92fe9a748f9be3dc4e4e12248be856e0183080651f2be64952e9f58e2d8d2b1a34c6033b0430bcd807fac093e3eb00d3086600af1736adf86c91149566180210453467c53512d97051841308d69cd4ff2ec4ecdf6a2bdb880106000c1a4c4e829bd1492942dd9c8020136b480808d8f8faa1b95021ebd455301c60fcc37e2767257c70726d91d0b6fb31a47555e00460fcc9d2aa992d5caae9e25c04616362c70001b5a40c0c6c707b9ba51850f3078604abb102ae96d4fe5a61d1882eb9ebccbb77ee4e8c0f09556e7c7e652cee7c0986aef31e221a9af1407e64f62296a3a7f8a29dec014295e123af8ad47fc6c60b008234e8cd8aa174d0b306a60b80b11a2fde934715483410343ee399d42533d2d7f1c5b5cdcb871b8c7019cc78e7730c09881496e45fe509f231faf0c4c61c12b2de48e88eec1b119801103733465219244fe605a2ac04616df00183038bd52d07d3a42e7882fc8b389ce6781e18272377f44d6d8fc5a41acd4b69025cc3755566c93540af97c1effdf2aceb1964b1f69e384852accf1c5d26252522a4c62cd74fe17f79473091526ed5bd3132946fa7e4e61b40bf708b2da930e1f53986d9448083125cfc7bb14865cf983858acea5ad26853162595514934761149143f549f8937417511846bc7d55ce3314c6ab20c485a474952a1d28cc934c567c4f9bf4697dc2d4a97d77ac373ce53c610a49a627dd5ec642c8c2008b4e987aaf22093949acb6cf09935cfaf8a4b73cb97436619a4941a8a950b127c69a3076c4f0acfa9cb2769709437c1515b473a82cb331010b4c18f2167ec50f9a842167e95421a66bcd3fce22cc9084b9db84d227845698467846244c172e8538952ce714f7fcc10c4898530aad6fb9235578d107331e6112d284163523a7dcb23785198e3028697b39be8ed75fd035c298eda3a9726a3edbc30853a8f1d02d9f4598327259b692774fcf1561da8c2c7a7d2f64ab2d9f302311a6a03fd6c55cad92d60333106194e8aba619f38d1da97031e310661fbd5762e9f8e2c68e442ad310eea8a4d1f094bac48c4218a4e78cba5c6a6df942086328495f9a323ac4fd6e0d330661109fed49728e96200c49cad7281d55c962eb9174780e1e0af8f8a84098c469d125da3dfe2a8461980108736e8d39f972416ac5687f30cfa5fb37d5273f182505154ba524d1c28c3e9847fe8918b12efaacb5c5043e3ef860ccdb9fd475f35da2d4c246167b307548ac0ab2427a304f3cbd7fba65943a551e4cf9940e2365d33da4180fe63415cc3beb291da6bf43da66e48588233b406ac0d9c1e019ba2e4a3b68568aea6070493f23ae96fb419674306731213999acccc1544a52fe24742e89ddcac158b99e2c489a94fae4d1458262461c8c5fba9336b96ea9230901708a197038f8255dbde6696a807791022d52e00ff8f82845021084196f307ddc7793ebf197201664c20c37182cc5b336e1f184e5df06636e559e7a8738e14384196c308add7dde1dd5d94c3884196b30e7dafb75cc450833d4600ed9d129ff08ed9d9d349854b2a0cd3be6e8282133d060f65c9bf9f717433eabc08c3398928adb16f468cf934fac84196630ad8912f9333cff57a58030a30cc671592bad5f63dea3a283196430e438b1dd4ec8158f7d0c06695ffdf129744e982106a3568cae9e981b1f1107668481cf31e2a3c00c3098c33ac57a2e474e23c5b185d5c58c2f9845770ca5e9922224b92836b458408e195e30fb9fae20b7968e1de500808a195d3008952174de9d9b685a916206178c1bdbb5dab136c28c2d9894b89452ea2dd532370e33b460f27ddfee8e21e2789d0583cde7f35423cb7c26e78619583058b22e51b5a71a665cc110d45bdcb4bbca0bb3150c5a2699b6afe5246236b220c38c2a18be739836cf7e79fa11c30c2a98a4f586988bfc36af66a15d983105f38cde3d213c5f9f772c0b33a4601a1dc1b2fc5fa953ff0a33a260b4504224dda96d2626148cfb41a90a298ac813cc5e49c8f93ad5176638c16cb56549af3bf558c40b339a608e2621c73f954c4511dac20c26182b3fa65cc5273391635298b104b3fba7d8f1d7267b6b25985ff55292a97949306905c91b1ae327a78304931031c44e12ee118c6edd6297a47529b51ac19879f1c15e846a7a59049397ad5e8dfc271f1d114c6b7a57ba7287aa980dc124a9f2577ceea49e243876c70dbf32260473ced62a9f354525e883601cd5b555a1f7bb3b0f0493e493edb3efe5419e7e60facbe145e74b32db413e30889952bb4e510f4cdb21e43011f9295d9a0786de8e2af2737607a6cd8a3e13c69ca103931aadfe21dc4ab7bb193930ccafb86c76fe0b75392accc081d962c4229ec88aeed40d0cd9f396876f5b8ec756336c60ac5c49cf227e6dc977b00d2d16906c6801011b6b1585193530bbc7becea63da850fb8d9d410373f8d6f87d8f0586193330a5fdec2148d58b57711918c5ca82e9cc0a32d7130373d4369194e605fde98681b12bedf4e68a9ca8f405e6a0738e73cf25e974f208335c60d049b885d051763bd756e495cdc57556982e545d4ad9b2c77e7e157dbafcac927fdb437a90a10aa3bae7df29b3aa49662a0cc944478e904419a830eda7e494240725459f4ed1e4772b1ddae6b1973bc83085414cee60a13deb876c955218921059d7b2583a395a19a4304b0a677de16f23c81885496984547fff79211685a992888cfef1514b5b7b202314668ba92e17e7b35abb048549a554397e89a05452131c6b03199f30c5659351a191d3e61a90e1096385ea904b88d49d5ebac0c7c7c78716cbe884793d67a57872c3df452901199c40dcaf58deaa646cc298a3df1e748fccf6c6c9d08441de5d10e1a49a9af08e2e8e04323261f01bd10926b3735716c7160e1998306b8adaf0b794ae4de8c50e1e379c1c0a5c02ee457391c38b1ea66e15322ee1b5daa452f91406322c61bc58935298ca38b6920ebfd1a3e830698b2f76e0b8c0c787052010322a610842774a95a745e31b3a76a0163c744ca0402183125fb887eb0fe9355c1c5b5b3790310993cd969e96472b1d9384f9363ce50fef6451822261cef952b8a0d2c4adf62d900189df44c7919182dfc4530e1378161f1f1f1f14b091850d0b5ce0e383a441c6230c6b29b76b2244c70e2b14c8708461cfae549cabf437e9c8f107483a7228e0e343c78e1c67d508b3d7a89311c6182d5ad7ca4ebe8c166136cf1574daaceb9a5c1146d3f1655182291186f110259e697bb31421c2582acc7bfefb7f47ce210c6a4379109ed527588a210cd24d569a4a9642184fa4a8c8a92aa5945b4218624decd2916162231d842945f018e229c5f01b05615e3f3b13e9be4010cc82a7e676af9bba200310e62041e4743b224f49ff602ee9262f86dcde0e9a1fcc27c25fd058f756bf0f8631fde6a53e4c2e6df1c11cc9472f9e56153791e5828c3d244595fa155529eb3d52e024c8d48351e455cc2c934f41b67930bf24d753a92c87a40dc7568f1d5d9c2e41061ecc71c2239c07515ff95325c8b883398590fa17420e2e3ab383d12766ae989ae81664d4c120a9444862dbb4a504e920630e06d52987af12a120c89043a125c7491136eb2ebae8aa2cc888c3dbab16a2d61bc5ca861610b071a32042061c8c3aa97527fcbb784a6fd126d8c1855b40c7046c6451de60d0163d4c5aef4090e106c3458f1f154a8e68b370d13a5a02d806d3e90c593f7223e932d8600c613a6b89d293eb10418e0b141264acc1e8bf3e2742a54c52a5c3820c35a4ef5fba112fcdb51c24fdf4291969302435215aecae141a8ca6d62e5c849f8f79219504196728b85bced8162d494962d95948bd297ee7f7fb4186194c797264f4d9c8102723838c329864f59cc969dab6490643d21754b41c978c31982a437f487eb9f04086188c1f2d4c08bad2a5895018cc755b912d4d8e7320030cc63bf3493f13c4c4422d07c8f88221077125dfa2ce726c45706e90e10563f667b59f9cda414617cc973b39b495def2e8b951850f32b860fcc9b7167c4d37aad020630b46d5109913f2b951a46468c160412f5f9e284ae75930c54e23feacff72853416ccebfe61b2fd87d3ad21800210b0a15fc8b882c9f3842b93e8297e5a36b250948387eb70112c916105b3ad05f91df44dd2552bc00236aa60567939094a843ced08046450c1a0dc2deb29d34bfd2a5740c6140cbedaedf3a95a54956eecf0e2c6d9096448c1d47a63da92f01291ff2818d2c75f79fd7cd9f799a07d8bab2c9207175c10195030555b57129b490afc013a90f104938f3c9567b282f4d48520c309e64e3e9e745e5774237f20a309a6afed9c73b20ac7167e7cf84006130c1f562ca41965d2d5ba808d2c6c687103194b308d6d7c30cb22164baf04c388882ba2a774e7ee49306ce82549a6428e5a424830977fd229a7b6e48cfa08a4d8176f66231bc1f4c9e3af2c8c88a39522184c4668f90b52f2774804d3e5a44bf7971346764330badef7d5474e0886b7754b33ff21262908e6bc16f937f29e2ec88060cad2397fd8a67ebc4ac60f8ceebf3226e739b324327c80da954ad2e5d38392874d90267fa2c8706c7dd1e3c6a91564f0c05449c4defeeebbc8fd0e4cddb115c3752d49fee8c0a064790515b5f2abb8393056d89691d941a71d7160f44dd141c9f02bd7f406c6f0c9e6f162d9c090427e9d1c94aae79ae0d84a27c0e2e15d74d13c34c0326a608ab10bc9a63ae9d82b0d4cb13a975d7d9d779f9e8387165ec89881494bcd46d2878b043a7043870c191842f85849a5e9f95f4a5becb8e1a8b7e8c2796c5140460c48baffdaf2a26f70cb8081212721e284687172f2d8a123c78d09c878415929086927ffc76238b65c860b4c41de43c9901f7aa52b1c315ae18ced47cacf91455aac30a48a64f9afaaf772afc22c4959d49bb3687f2d8ead1e050431546112294a440dede11ba954184ea4a91c41c59510725418e2bd7ace1a92d37d88159ec2d841057dbbfe4fb0234d61ba146a963b524a61d07145e452c58bee9f6290c29cb4cbcfdce754c4138f1d379001314661ca16c17343d493509e284c398924a3b36e96590191e094cddfc5348dbf1024f264b2b4bfe9363de24a29dcfc85916aa976442541f2c44fd39e346e045263278baa2c714628e716849efb9794453c222e7e2792722cab8855653dd492d05322b41321db997bb0191311350ee1492fb5f12769245da50507a286210c93947ea79abcae327ba1c3b928847184a768eb9d3be40b962ed42084ba2efbf164cb4fc741ec2342791a9d200c397b1c9d23a594321fd345f3d0e2e3a38b401ce69ef196715516824c0c8fcbfa582bea256c011b5964410108d8403abe50c0c78702fe500310a6a47fc35c843e6bfcc12c1a6aed94b89c66bb420d3f98fb6a82896462d5e883494e52adccfffc4b990f8614163172689e8e55eec19444ec3ed885adf0413d18eb2c7e8e3f4a092f6fe0e8d13816478f66006e8d3c18f48a681331623c98476489aa24ef3b184f5f104185519eba545737aa9c216ad8c15c17555d2de90e67921a7530e7c82d93d79699281724d4a08341086521091d25d5e9b414a1c61ccc17e22889217272307fc88c0f9311437e521ccc1734925de9ea892f1ea1061ccc714bbf8538fa37182ca78d6041c268dd990835dc60fc49d1bd4d5fda600e7de2d627726f4db9831a6c30eb998420d1e3b80929eaa0c61a0cbeba3fa6d62da40635d4601e49294eaab4d9a1621ad44883b1f76429070208136aa0c1b8337349ce7a96b864a0c6190c1ecae3a28e8c6ca54f2364a8610673cc1915569e4f3be9e4d0416a94c124ae35f1d2fba4c7240235c860caa2833421afefaf631c5be7801a6330877695ec23d223870eb2801a6230e809bd54d9d2d34cbee07124d8610218d4088339ab0495c382521f977950030c86c97ee926049d3474528d2f18f24aca26e9fcade1056359c493cf2273e4bc14d4e8c2c97e458ca9d2a613c4052f7dd291e5295fb585b2ffd3f7fdf288706350430b680b57a276c3b1d5811a5930957a5ab59cff8e1a58602fb85cb6640f439e766451b2c705589d478d2b18e5e254ee8578ab56ac6054fd1ccf6a74749d2018d4a882c954092dd74bb2d4e4e8d8912305ef8e00632b810edc10800b6a50c1d4a7929e9b5c612bf75330c92a5b0ba5c3da7518c7d6165bf41a17392080c38b2e3ca1a08614cc7f567a63740991471f05c309ab9355fa3e4df640c19cfc647df8749bf6f6138ca2acfabf4d77c8bc38c17821e5f0f939e2f2a80906f966a63d04cf08de32c1182992eef9e0b9a2bf0493a7fbb9c939243d4b95601cfd6b4fb997fe92926010936f134a662e5b9090ecc92172d647307ec9bea7d8d2080631a2bc845ab10826b1f3cf7236c96e44229854b7564e441c8251946c2dbfd0bb96178251c692de33ef1cd78360b620d2fede2711230404933ea51745429a8ff50f4c918376ccca5e93a00f4c2bf65b49a5247b52d603b389bcb9d3ff8a2e311e98e26fc476602af535d31c57d7560766d32367eed64152b272606aaf0eae37e2c01c62d609752a27d748ddc0a4ac267f6b570eba0d8c165e2ac9d2efbb423850a30626b32df3a0b4c53c443430efc67edb859c52dcd00ccc7931d499ac4706a64afb71467ed211942706266921ae99de0d037398adb8255ae761bec024a9e5b783297dc96308d470812948d2b7d36a2b0c177cd6bb440825c3c20a53364b13f339ec7d7a15a716152374af5585317eef826faba930fd575e11fb6059374585e14f2fdb74c8d9eb93a73067ed7ad1f9235bb4d314e691973dddca5218bd2d698c1257fb30496134a5dab37be57df171148638a745b4cadd5b0745617a91fc392eff6e9d180a73e8eca63c8c0e191782c220bacff737e255a8ef130695f53f776cbd897b9e307a873be9915a7266d709a3a9ebef3d6141746e9c304e741fcfa176fb9a6dc25c21a7dca1a7ed74669a305608a9ed1666b2edca84c194aaa8176b4c984492e894a2dee2ceba84e12f2e8ab08fdf222b4b982b5f56a7ee8e75b21206d321a976748a21a6849d9b99dae14998bceabc938fb624829230bc8e597e51927b2b120993765e15954ff3272d48a474b4567ab31ea1a5fe20f565a49d588e307ef871cfb16e418d8ea3478e2dce178d30968db2c8722544ce8b0a1a8c3079929fe4870bd5bfac6153d05884e154056dba534e6fd1a408f386673b11e6d0b93bba96d0aa2643844148eef472ff7ca7910d248d431865f55a72d43b131ed228d03044254a7d845b937f7cf0e871f20b1b361460011b557640a310e9f8bdd1f331224f831006a55bcdecfd4547f0706c7d7c98096e7c7cd018845f1a76e3a775d51e5df4483404615267d2fc258d6e773f10e694eaa7a5272ea93901c29cc422ccef7f68fcc1ece9fc2a674d145795861f4c798416a12da90f064f22a9c4d9bca816e48369dccf93ae5126a2321a7b30ed05b74ffd0992043c766800f5c8c1c51d68e8c11c3ee8dece6fe8d8710dd0318122071a79306a95ac4d1ebdb23c0d3c18d3f449defe3c8ead1b3a769435d0b88329dfa8ae8ae3aeb2e19681861dcc2394522162b39524290062a0510793941def2f0d1d344e7cc3e860ca11b6372731475d07051a733068f8f569bb942c894b0e067db9459f9ed8b9fcc732d08883419ec9c848c93eab6b28061a70309f7f349fd12ef377bfc19045b9ce8724ae72f0dd60acb6e8219b4e061a6d30571a1d4d7bacd26954361894279574a83ac340630d860f7f21dce764ea25a606c3ef7b7ceaf52b0de6cb6f531a6a65822ea1c1301f577d7c44f6d47f0663d5969b7b88944c84bdc78e2e7ae4486612e8c00d10d030834959f688a236d22ab6a38b1b5ef48de43aca9a46190ce222567afd21835994a9ec519475e9500f1e39fe0609dcbb20b596011a6330271bb7ca0996188ce71ee247471da540230ce69df3d02a419e34718a000976ec40c081c1e421e438ada2ad2f541b59d87015e4b84053e0e3c3be60eabbcea21d42c30b46115a7ee9d79f343d34ba60dace32a67d1ac1aba4051a5c3088659f0ef7a0c36db405c30497146ccfd22bd0d08249779fbc529beeb365c1f0214a1a0b064b1139faa1152dbf70a07105430caf8921848b7a48c8146858e15f13d5e39663038d2a98ab83485993af22a5ce5fa0410573aaa07d2ce5e7fc92730ac647ae4e792fcd020d2918457efaae94d593ec9846148c27d4a8dd984afffe40c1ecf1f2a2b333b71f7e82714fae5fab444e51b44e30c55c9967bbf49772da04b3779279a9ead2458909a6909126dcac57082a5c82a94beede45d3962cc594601c7fef55cb73128c75a96f29888c047388a5d4bacbc716ff1cc19073bc8b2e1e4d09518d60cef5b0d4696903d028029fda3efc28fdf01f238259276928552a8493dd100cb245b78588721d26b8001a42389f8af1fc0856d2523482b08a88794284fcd6f9f8d014bcfbe9030d209827a78a9eed3fc9288dc60fcc11b48e8aa7e38a901626d0f081d9ce2f6be6fbab8f2e09347a60122af7fb43ca567e120344a02347a9020d1e183d4465d297a59408be389e6e8860c7169c04a0b1034396243eaba78f0e4c93838c8564229d4a3107464f22e85121b5347060c8d9c5f2ed99bf63078f2eecd0b881d124a4f72a4b19020d1b987ef3d684c81dc374707b40a306062d12b2f6dca8a72cd70b3468600ee2bb5adcbb4e84926b0b3466604a95268bb865170b346460ba3c29476d51a92fe5eec58e0c681468c4c06cd1937b9e0b93914230307f768e8a0bc93ebff902836c8f2a8b5a9ef34796860b0c124328152da8b5bb76ff30a315a6cacb5c75f5a4f95956183ce743f477e7fae4ab309c98fa34de9df4fcaa3095904f132a6e9632fda5c220b447d979a58baf1b2a4ca53de7ae2e1fef0f398579c5cdc342f70759d514867df958dd2f77797f290c5b2149081a22a63f524a0ab3ad4748934a386314c6ba17edee1a06618628ccb699ad193967a7c86b284cb28448227ed27e323ea8a0307eb6cea153f67ecad1199f30c8e9a45310beb9fa7bc25c1f3ba9133ae51e25ffc08c4e18acc794e4944538cce084e9a37e2525d27feeb50993ea8710c2cbde473c8bf2608626127a7325f2054bdac7b13d72300e6664c270619d6285c8dc7d8663eb866f21021d397adc483abc47590b6660c29452defba0b7215b3d8e2d0b000d665cc26c71c2d584bd13fbdb0c4b18eff483c51f4fe9e62f05802a6654c2e8ad95d3880a9184f430258cf7a26e65a68edca88450a6226128100782e16010c4406cde4c01e31308001834288dc7a2f1809e27997d1400044a362e44302a162a281a16140a44236130140c85c3a1202010068541c1803018c98a998a6c001ebe7227d4ff4c893a1c064a21168346bd5a80a05e7fa38ca88c544a97dcbdeb3f410c15ad4c0f654f4481054f01525a7aafc6a1a6cc756ce2078c35b26381801428b4a1783f9700161e2a190df0430f5b96a907141cd86e6e49d0f4dc2b40c7bd8198b07905844605ee355a157a0a13506157bc09510879dbe28150eb0b13d6b15556d24bea44dc214d5c5c119c928761b35d0b211f453fb783c4a7868095ec02f22c443f29701609fd2566c2066822445123e254cd230e826c0b65aed9aa8ae3b4e9f3e4221442642ca0b6ad49ae92c5e1dc7cf84529751d0b5b36bd0ba903c0736cdad0e1747d3b86ddd59343269d9b64eefa6fb7e47d9635ed58b06b99c2c31973ec4de60866d9b8ea098769d6106fa543cfa28400e204a9944ccecc1cb41e2785b33b3e281edee7254bad143bf127ec98c8e37b7534485810fac3e2d10a030e1d1ee259f4c0ed454fff1515c15f2104a81d8082c9f74514aaadd1e1c4569f549942a71e21c164b395a092009a96763fa9d4d9b9b4b3946209c38faca2af0ffd709d622c8ab39944bc69720283e981d49b409305343449af35d4566398a1d57ddcabfb8d73b028ef67a2c166732f337821f39558173d877ab24704a1eefb07943c924799015ec6b1357db092fd68fdfc11685a4b2313915b24d63b2cc0a3e12025bc8607a79e7a825face0c33bde3f2bbe0ce8275a0c71c7bc058372f47edffbfb9caec227fa023514c84f9934fc3514af25960409f211c8eb8d43c671ddc616dabed06c3dc6d334e05f527d220ad5dc86d0d81f6c611a76d7b18f13c8570b138a6f120bd61a2fecd298238662124a8cbcf805794fc12d09c4d15f222b9f2ac69d44f112af67c0a6368c54ff3ddcc311c6dfb7a0b721c1b27acd6cc55657d755c9637d826ae2c26d8c2b9f710e6f3e0af2adfb4594077b53d11984c22b330461c57489c4fd280a180f85cc5ec9a608729ec7a67271b2aaf90ec612a9d5119df604f5efc9bd3da94922a8c58cb564747c7ccd10df70faaa424748158c2e07ef51993dae6b4fb963e7c6ee6bbf2facfcec6a4069d6e8db71aea211f43c40dafef579f357895e41d72b0184e1e51a83e3606a19002b13eab7ba2f9e0edc5df12d61f8d87fee5fdb0ebe5f640f6747453bbff5494fc684d6f68a4f5daabe277b404eb290780e221112259922f7ba497742341cc2cbf7fd92ecf37c5830a782bb763f07a46abaacd0d34301df36be03920921b9a82b84ed7d2998a6af50dbb3bcc461ba0001b3908d4458ddf8292f5ece8eb6086b33b5c9c4fbf35ef51e66347defc2eda3b73160c0d4131071e93a26ba3abd3d70f01f717011ef59a2ecc2cf1b79a4551ece6f31f8ef6cf5ddee94a656ce7279ab1b9781be0756fa3159b46bd4330a7c34122ac2e9ac77b1961d83be9f5e0c7844c1215c7781655e53008076727b29bf01971c8fc55bfbd398a450b0e50ddc2a791d042f2ad9550ea33e632def971e001d3922cada547a665286e7f332a15c3f8949deae5daa965693a69a32806af7397548eda04fd25be9b3f44efa34bd853e4d6fa14fd35b684f538e1d2a9b6c74033b9250f9bcc92e86fc0539852e49653369603fda385e8631e7b68dbb8fbc1bfa0b806d39be2d473b1b10a90b5d8256132ac5150a41c1853ad6a481ba2b819abfd0b8df4cf9f37e0605fb44a8b3324f4a31f85465c6fdb3fc78822f428c538a1a3f5078c9d01dc97ebd61c40fa62fb1eae7f221289cc140cfe87a8a269bf2fac8eb02175bf788735b8d74bacce2074a6961b5acc2cf3727a37d2779fddde632d08b608e4523ebde6efc8194f5ff272489abc9a03f49809cd64c1a8207c868fdf4863b8ae2bcdab59d07f0de58cbdfa772ed167329496864daa8a7d93782a803e11af70db5e2dfef20d1662b68d3a46b206023ea33c6721e43102fcfe974e7d8ae0ebad590a94b7d9b01a2e28b8dbc114698b897f0a5424546ceb14a3b67ccb20ef301a39a2656459db12f1e477c1c1610b37fc8d385a40f9d4c9f63d0f30137ae935469a8ed06ba9648bc7c0041be19c00df3858540fc779c9d76983898af01e8b3b256f4e870195e03cec88e8793d954bd6003a782ab8edfd419999d21762cda05e093ff3309af01cb9e7ce00c961bda9d5db55b1c4ebdf579bc1d932ffa3df1a1ea9b1ea467eab0134c157b82a99b73fa478a3932da10fd093d0bd1085883c71b4fc7a00b697cfcd475c38e36d2b90adb004ad09c4c0b2c3ecb3e78c2553bfec9c12023942ff556d9a6703de603e60063cfda70ce2d91aefc699a5cb0734133c33cae8c7ea6b4a6154e6e33bb2523e845b931f7680038b2c59ee74bcaf3d983e112255c4b071f383f317ad23c52eb555a150a3f57480cd37d8c9344a9af82d12aede763b72ce9563196d537710510d4c31e2dc3b81d1f22addb6908e33aa6e46483104728777e0e92f5fadf737acddad86aa56aba7de371ae0dd032c63a1344b82989142281a6274683a8605765f49f1a3291f881f8a8ec3f7c2d1e5a901f9ef410bc3ea15f12162872b0f5063375bba235e47c690188bca7723efb953f2972ca81d821b38c1c66c24f5a1f28ffe012a2e049314746971fe8c882cb6ecc3df93034dcc10e465468ace5250c8c0723f226f0af58ad03e9129e42cd10f4c3cc943d65c91983c0ecc732883662c92b54e52e9e316e12c5cd79a807102bd0d829c82c166b042044e73bb6e22842c0784abd1815933e9f5a09441e07d25ee9a7f72085e60181ae33dea35f7a0cd8a91329f12b86dea3300d8057b28cbadef556a968904d1f3cb4e9ad2212c73ccae654870a442e9ddc61c99f3efb3afa0c586a9176c586781a0b84161a2f4a45c34e095e2884d7c2b470b6308e102a44a0cb5a741e62a5d76c446a677f1404f5c861753d91fc613fc6e9007963a65ddf9ce2b871442d3c42ebd02f0954faf809c4df72eb0bce19705591e8da6c17f2cda563889b95a0b7d0672126ed0e0e18e269a8707cf87f25738afc92583c35658f082b91fa32fdd40b4acdf1dde608005f6e31b9cede6eb5c7171000603d3493bd9a0632f5068a922404facf76faac90ed6982d4b8e2ddab8805365616eef1f65890742ab8948506c434cd6f629ae37268f6b09e7ee3a28371fe50167313cc316497447fa4229e54d8ec7c7ac678bfdff7f8455600ec57f61a5aef0d049ce147b8725349f80d776878fc083a18be147ef46d45d8e8ae819bf9ed501cf0024b8b66489680f0df0284c4b0512550e9625959a5e415af762dde0d8ae9cdb4a94417c14202ebbb5ed65826bdcb6b4cf610e36a3a4fee1ef4bef0ca69b2546546a66ed47c6a2a0e1c42a21f2de434d5f3606ac2e5beeab92bc6be639096960e08f29f9cf3b27784087346a001ef01618a3fe14828d4a6c46adcfb3c2c73ee777a467a4b7aef867e713ef7d713717d2e85b60759364f97a2b1961d13009313bfd2621de3625016d9c0a916508d978d2689f902e7b6771c2da70236e70a4aee45a22f619c09ed63406639925b52d216a060e35150ed630ca240e1a063b7379b3e182ad8b684eea4466a9ba11d62583691458d91022a75d1de257f3e8b8deca30571cc18caf3f84d8c19009e9c17a2b532530154574a2b15a7f2589dd1da3d758f691d0ec045dd1a604fab4085d422f744f9b1740e9329d8981d2c19724ba17cbca91333c2ceb4a0657dc0b6278fd7fe318aef4dfaf05c62a31fc4c91209aa7e1bd5f53861e00d457f01dd94370860f7b4ced54f7dc2785d2f07b461f6f74bb63845d970485211d1321278cf106fa9fb12e1d4539f1dbf2153ef76ed8bcfe4676029716735c21be22c100c6424c022d40f4cd5812b4ee40afebfb6d067388723c09cba56ca16e3c20db67b92320e0b425aefef539cf24bcde020d866fc09da869770f0e59f68d20379986b6141bf53f1d0593e655250e89e4663786f83cbb68c77fe25033283f43532bf183ec2c8ea45f939fd3f20f8205c830203a90bca1d5aa61e6ad40db0e5781478faac4cd14ef9ab305209664fe211e05db04ec34e6114657a54779355405db2f7869f44628a802a60b2d4b70504458a3b271cba314628a866a394c2171988d314e74bc5c29a8247551b712e7986d98336653ad279fbb05f0950afe8cdfe789d15cec79a67c690247c3b686984ba445455044fa776fa4d58bf14ac12882c195f60b2f64e91d468d022cdda3895857fe00d756116190a4dbc90ab314482133c8ee0557690b610213bec0697dc09aff34d112f84dbec42d672f801319543df6227e67c9a2d88f01eef0bc36cb0bd7a610b088d0db05c0d4cdca415c35094276e287343312d57a65033201d4cda7c89c7864d7b10b43c4ec2cefc70b6420fd1fe77ae6d76650b57f8bcdce22818b0c65aab6aaa5a16d1a575729607b8f66ba87be04163a2f080f5651a1bb30a793437a17893d632ec51c7f9f0df18518298c85c15731d27f354b3e49266068b4365800a6f60df392f0f7a12eb0586f23be8d7052c59a1fd41095b69b3a2b9fac4b4518b8aa981555940ebd3f43a29f8004b8d71b2b2a9d63e0f8f8b79f5289c340c072859de132e47d8caad74b6e7c2dd5c9a49c57db5f3c7759f8b761b85d9033fd38e6cbbc7538890cfac798a631e9154302079c29a271cdf87f347a5078fe55801ea2aabd171312149ef7459f4ad27bd10c216e1d478678d25b6bfcf43a8b1f8eb9c5ccbce1b121ce5ea8536ce5f93af5e7cff83d3d2358292e3a847812efbfcd2995a3906c5c140ad70ff037422449c7d2a6b77011597e80458a3f24a68fa1a351c1cc9346b2a92a828142aa9211d9cde5ba6ead09014bb5cf2c0c652010671c36efabd10715061d92e2bc4f99e2229723f5b7cef0ab09a43fcc424e3ce955509ae2da20c8c865122953456a9668b15948447977b5abe75a98e379a0bd31b21aa14e7a07c30fa3072fba029a3e37de88f76363bf0609ac2368cf82b3d4e5f4c62a80fee81073befa72c6b57a06d138b9290f11ba37d2cb36ac47a95c007e5985db8c0f6cd8566ed85bfcd92dae01acb5f476c6d50603b0d6be0cca324fd6a18f0db873c6b9eae044822083d55ea42cc1388557d9c45ece35d008fc48fb28d8cdf27d3a328437afcb8dfa046c633e225b3a47b17898a7309f3ebd84fdf355ffcabdb49c22dbb474f2c1329d999487a1c00b581d771ad87703b42118eacf4e76180f231bf9b2c86bd019094a48d79edc9494e2bad7245109b7b7b59f9008f8d1aa0de33b59acc708472ec59bcceec9baf3c9248b8078f6287a939a297e87751099ff340d8c9ba26df39d3d7b01a531d89eb951ebf9d17af2c1d5e2e885d0244a680112048d2fdaa0da6b99c3b255fe40ab6c021c03864b02c0e7f25243057890f6b16b4120922f8b94c58535d2da119255c99eb23c12dd9b0c1e447da2b8c721dcb54e9b5dbff79a88c3f1ac6b4fa319f157d4c9d230e15b70efab049a76924723d81abd21dec20afa548d8b25578dc6a45db4b95c3403b1533e05ae1c9777eb55fc55d0fb3921f03bd9d15c18fb84950cb05cb2d0790f38861bb338282855c52453f78f3d77dfbc5334a944e93e8a3f46635fb083e2d7574f763f10501a6437fba2217245c47ec9631b447b0703f814f0c4c4c948cb1143b3cb0f843c2336ca0b738d815711ac9c907a8f05a0847a876f1629310370510ae31b29eca1fc4f68f6cc830653e4cf8beb0705cee3da157ddc5a63354b1c31599a943fce2bbc14db0d143460ddb01ff71c7a8af832be6ca2975adaed64281549e18da663aebadec940888aac4e2009d26fe06173a972716ae51647c0ae4094e429ba01d2cf5357c6f95bc292f7bd4f8a2d8ddefd25066ee7a1ce582bff5d0ccdb620e6e74c4bffa5f4521ee00313a08ec09012284d9d2adf4a7e26c3d0b2443e4cac98c63ed078fac70d67c9448e005343c4799ed9e0bc97d859cad16dff72a779839711546f1293da487d181ebbe6ad327498ddf04351be7c5b90219843883ebe6181cd78f590ef4c0f66ed9d0ee237d946643194097067330116ce6ed76f9c54f1ace30f3b66b37161a250d51581a8f0071411666710cce9e3d68136c2dcf7ab0ff177b1e9545273c48ed2f36d101e1ba7a09db9a1a1b2ad2f27332b9287003c7fd9aca197bac44748c127fd0420c7e71990dd2e3123b71c7067286c2695d2879d0a30748a873af90e4dcab6a83b90e04426fd448eef7d343264ecb853178cfa7c4d01cfe9002701caff8addabce47ee4bcb09d37e59c38594eae97ba5c55b44b17936a0f1bee7f625d620d0a6cfabdf2dd0e6a9cd62bad17ee0d40787474025ba132f537886fbae33c05d36f770a4f582f4379149fdadc76b2980afb2e01e5e8f3bb39e2ac4c2d11a5d06e94bfecbd27282013e23eb1ff0eb47f6442412a2e646d645b3bc0f342c7157a3c8d246bc5ad9bdbe34d0191db5a5f588b8d0a13b3fa67202b3958b567f4b5b65362d16353998193d076427b5e56e4e071aa9a9228623e1ec0ed2d395f58c6a57582a32d5aac9453723a48dc01220818ac17bbae3e936012b243c9dbb050520e0d7a5aa02b45dca5eb70b891e7fb2977edb97b13947bee14165255e58944f3e851a9979a99ceca84719db084c80a47d3f60c42aacc87282ee78de8d0bbfe7b88a5ec0c4f0fcadb6cab7b767e6e4a8f70af4f4a273e4252962da29496f1d2cee2a919046f22153eaaaea1d765d25c1f9525a78a11e2190f44630b44411027e11c566a6c4a0cacd4e45ec8e1d25fbbcda08476b90ad68d820056bd90b3573ce436f96c2041fb64adaf284938960c219fd549fb7472ba793eb22c5e5b84751b3d95e29727e046a1aed057ca261bb28cfb365fdb9e5869b6e4f2557c607516dd309b3fec718cb9a2e61fa48411acf3b08433d0f4bd015b10a085e03f04a127e18c774c6f4b13028508a080109d42e0380c13a1c81221d0bba40595bd836e155e3361b714386b1dc23ae8f248680f73e12648e5a495c3443a35d2263bab490e097160179ba408a93cad4878e61d8ed43642dd9c93f68d8048ea9ce03366e14b34994415972594a29d2fc036c24fa3149883a216f19c60dad940ac45f0068179856d91d7c37d58c00280a345ac01d9a1c530e1aab33431310ca7af84d96a57f6c45d27f2219f1477dabe046f95183a34e381fdb14730506b80c48b1b3c8b8cf719f7991f4fc87801fa690bcde01ccbcd5dda0db2cad234615be4a8c403d20511e7f574f06a90067107286af8b5d36f28c176f79d7af0a6551fcb0a281d1c5ba1c4080d86cf670d6df1e605370d6d3145dbaf2c87a07eab1413fe51e041139f887c51557266ab551fd59a256f8e4024116429c1e18d384a6613f53e72a2950c14b014df0e43fc7696684e0deb3302fb98f7a7123037124f8a874b084d1d5e156a4b15ab28f422bf8aa1a9592daa3cf6eceac7a78e3fc6bb1a35eb127acee608ff2591d17a7e1de90103692f7f0026c2869d54412fe296181f429c1768d9e83d77126493311fe5223853a7f10a3d80332fd886c12e02b05c22d8fd31bc343c5350b79e933562c3874df75c7826280edee110d9bac9fb90f9d6d22110dac3dd9cf55c087c3d468d2e84c0342098a79a8ff830b385f4deda0d5508c1400f7b1712c12d716f4d3b2f105a02220a502b581b0516e105237ac11126cef09b5673a32948407ceff73756d9269a12df29b82e623cf8b8c984559770ef92c7d08672ceaf580c3b6a8915680d2e18588f4baa3d2efe8cf293953c74770482c7b19b33df5a9c1921010ded94bd715c7273a82958e436f5d3a4656f3d867bd74b43ec15b3dabce1d90e91c3ea3c60de041f9fc98e6720af6d1b80b7ba8bc206d3c0f0f1a106ebcde046c9253111835fe06dc2f16d6fde93002c0197e73c3cbb2d00e6a71bb160264f879058115f8bb280014e8156db682cb355419c5bf5599fef3b204c3725e18c7da095bd77b878bc3021006ad58ef02bfa78825154b73e77ac2b60228d5b6e2064f3fa023233602d554e0844e386cb6c44de7c9d90f16e3c51a23e56c2937886ae920724cb3d7821017301d8f4c914643b53f40534435eeacb76689845a41721995e442b2df21872a398e5b97ba61dbdb69128226ace5020fc1097a96fc44d8758ef92384cfa1a1e290901deafc804c8baf96d97f54e30bbc3e3a2b1923e3d96463461c4cee7d0ecf090a4ea25480e3c2ee24f16c2e1cc1af5d9590ffb35ebd4f6f7f8624090291f69f81a334bcf719b087447bdab08eeb1e9796956c0af0248253035facb71982638e60bfdd9b24304a84b970611a7befabc8f3b103b244d401c9ae30b239103c41b0ed5a8c05c5ab66cb432dbaeda240b2a3b48263819e0059132b662e7416441a5822a1d941c4daecf3b08e3208e1744ccf35b6e0fca2c17170b22a28e39a3fef20095d92285c032a5a5baeb5f29ffd17e452957ab959a55bb29362ac0e63ae6bce63ccf79a1e37b2e321fff0dbfcd5c08fb70250c66a4c3717cede40fa888c819132904829e84b8b4ffefe30274378da8aca937a09a74976ffeebd0518f071d1b57554ebfd4c6369b494173fe116a6256068310262c80e0502e2ebfdf5e3e3b8ab3b72a42ea7ab86ce11ed5cb5ab09f6527d540245a1cdefc509fc6bce95feb87a17f785cbf203adf537d5347130449358c1dd0ef3f785b0552190fd6e20393ff053572d6d3bbadc2935b9a4182479b04b7c75d67563456c2331b951b3586306d0a92e5b31f95042968f23038b7579b919e72084b8d1f22aaacefa90cca0e7f826f5246f512154cb5d0a58b6a304e77e4837f44aa7d5d674c7bcb1807844ce0cb3c888e942c9feb72ecd4aab7ebf50b432bf2b935c05abd8b7abd607c99a452b6cce424beab4d05ef1e02c61f15d4f730c218664e111b2e449c461544f449c0241a7618683992b108d80dc82c84156ae75bce93460e90b1c6c4351069a1e31292038688c39c00ec02d4273226125150cd6e72d2051661177179f398c4021aec1089cf5cb7103f4d64a0a18d80fef9bea814dd1b5a68b5096fce55e76a9d33909ffb86f761893337fc0f78e1d90924391f88cd305b1e1b09224eed73df5a414030f11d5b6fceeaab72a080055d6b0672f3edb7a012179c750e899ba3d9f1460a4f0139280885e133bb3301012335b37380105524082247d88b8ff82fb34bf3dda0cc90cc6e67dc50043c66272bb0f295bbb55531bbd301bf8fd3757e85d965b2e67344376076bb38c0828d8abcdf3f4b3cefe57653355f76cc629c8570de65b7d998176374df5c76cec9e990fa2dbb75ea7f89d7b25b073cfb6467d96d07ede6f463d9991303987865671141b3615c5e5f935bd991f90573f3abeccc4cebdd98ca2e6d91cd2f338f6697d44fd9cd79f9495fcace1d9acfd447d9adf3c379f2a1ecd699ef94ee27bbebf4f124d1c9ce320289b90e50c0dfdf64b77c1ef08f67b25bde0cf8e7bc64b7acfbeb97bf033154b22b7de0698f6027d9bd1a3453db85c72c921d78a98b7e63a7bfc483f6bb4e444cdc1f280ca57703f48eec5a0e6df67f3823bbfe8d78ca5564f72f30c11f3185c86e769e5d7d6763c86e7755a4f8bbd90b63e8f9c4176cb1f4cd55760c0c1d8f0a041f58e2dc2da0200170d476f9aa73a063463531cceb7a95c1cc7509046e21285e0d3f7207559e5bc10e1b572f28b2e0d30b5cc2262780ce45469be3208e50dacb9f3d80dd3c05727a95b74eb35045e98eb69306ac7a88c29d75b3efe217730b961f360a73877c8557534f56c25dd5618abb857027f4386ba6ab737067b968d9f23e6d1a05b7b26881c139ac2d838bd5b12bb5a0ca5a242f8e310cf14cd69194858b6bbb3e6e7ddb8495852a2cfde327153bc21052850de3d5de4ab76ae1592d9b0b4f3791c434c9cbc735d2ceaca3b2bfd3fcb1af9428cb30d4f41a78052149b06255b68f11d9c82f0f71988a2845b56e10103560a29b2e6861a77c999c3f21c81d37771d4b244a9cbe6cab26e71d03c3158c3be2a9bc07a2289c15a8b30ccff1cfad9c91dda966af3b65114a95c3d160b102dd5d039fa6ac0adac0696239e15807d3815795e289591fb2993b2fbae6134d5ed2783ac3f898ce94327345aab123bedb068d747667912c532e38bb326f3ec300c4fec6496e9dcc562d4927d4829efa0203b083969734e30a9e7ea7893936a36d5908a4b07cf2311539f54d0fa69758493f57004b5ec96d98eb26657d945a8c44a1d6941ba506017054ffa6d5cd347c68a81250c57e90c5de569ff21ac73f8ebed491dd56de7b09538e5f82b95fe4aa1530ff39c51b7b12f7e93963af257e17bd1d5a8931f9e2583408b9912ee98561c8944849eaf4a36ebff4ece8f0c296151a0b0912e0b28a184c3d6ec421ceada6e7dcc1fee569aba411a67621fcd3f0e562b346b4072c44f318bc2fa7f5114939c661835127ad878a1807179f6b2781c1221561263d799e825da171f1ab7c6b09eae5ec4d664bf7d5a733ef7acc313899fadf4d4e80018b5a5302de7a1aef011124cf267602583b3533c4a84e1b69200b09efe6154c8cf6c00aa20ec3e3425c2b73ec5c8be5a7a82b265f195826a15f2ea7f25491e75cc5865382cb05681ded728fbe0db0d3508de8090e20dcf42c6329472413bcc34f19527e6838431a05aabcc40a17633a9b2267970a2aaf00c4d82f137354559538252d74f5942cccabbf42ebd9395ebb421f08f617c3ba8ae3c9630fa44abdbf1b7257ff66a1dd5cc8ef93f4f58749229f387d61ec83ef9f292c462a7843e80f6188af54c69a1626b9e38d66aca57225b30344142e4508fe20652f89a250d29abef6c52728485a2cded1e96710ac267665ef90fbeca7dd3e8c9597b789e34038d4c2103844f700aebd4fff1d6e5845c6dcbbdd84a5736f0ce2f24388d8ad03c89489f4aa5848a44e3e8ee7d502cf9ba2249ac1b8105ba956ca0be62522cc91983eb042ba4801a859bb17d227813055949d4b037f6fa96a870da0e360f9fb6e5a5994980019ae268b40397930edb870406811117b6b8ce35ba5bb61361a6a9220079e4b880a60595331340fe8301566a460f81904f231ce0a86e4581decda9a815e013b145b160d1c3d93ea1718589bbbd5d2a657df35c0b8e863d6b03190b7f93a277e9141390840be0f072aa5690de3e92ba55c3041ce7485dcc8fe47c2b5f946deed47380fe8060311bd456a4f1cdf7d2062c5e4bb19ad7f1b326665fe6dee892c5f76a8db8fd7540f390b2e2c32080772f6ac659503534ebe9e6feddef4c84a9367c5535754490ac41bbead31ffb6cbdb2cfb0cb786c08b504dfda9b0333fac951cfbeabcd2c1a4188ca7bf26f36586f529fa5d18bc0cf43620d0714f566692e3d70bc110de1570982e8b59a5c04e9bc0900cf686af0330b90ec1db55c93e68910cf4d4a512653a12b0eb8c169a9724a8fe9368785cf507b41c7b25dba35d8e4f8a8435f07fa64a91ca52bfb34e58e1756fea21fdb11634335d47a1200c30ef0e13390b90b797baf21e13456c88a7367ba3e0db9143d43770842c2b049f33c0ccbc1a4b727c279f259a22b8b5c6db8b327215db84a1506772088a0253b54ff9d265c0062b0d99510d00633fede1cf1c9ef92f0dc200a18e8b5266327a7564d050417dc08d42b70c7f2910f77d6ad672b600ff91803f533b2e2e97563f4bcb11e6e384da6765da425c3dcbe4f9e629ba767f5bccce9d4b5d7893e655f06941f1cb4e90e8f16b0963c2e5686d0821133b16627540325b398d0149e3b622fd7024f778c150aab533df1d65dcf13456121cb4c42bbab739eebf2f17b938cdfd541d59e4975120392f5df15447ad758c64984ad25b3421337a8a88b27d0a0d9a83fb552ceb7151c5e1d5fa258dca4dcc387413c08c8984a46d63ca7d9eac1c63d6f26ad47f34407cf3cebbc9c4e3883a5ccea3236608511de3da112b8838ec0881d19090229244999efd644aed2cd97f313ed102ca2daf074e65795ba79377b3015352a9d6ae7de0f92fc1d5f0ba993c45dd8c7e16add8f61094856ae5c1d96630825f44f285e0259b025e4bf0ca32e176b85ffe54fc94f0319f01b38c8b1578822f301fec67b22423edeef5a5827493e94b7d108b2209c27a9bada187d8ca74699a288afb20474c4b3f3080c30b6d9887a0988e59b112155f88d967307e512bb00a099458aea6f83e4f15af888db31de122a0569f68e849eebafe9d29ac440dc5d0f9a4c2e2333aad0bdd21f62f2a803582420dec0100abda0aad36649e33a5646e6518ce7d95dca975293526c27803fec6ea8bbbd886401b0d8fc6b7ba83082d908e4cf6d27ae405dc80b1d863f55a7fddfba48d016be7a2cf947b8ac842dbcb9950e6833500ac88042296034994041d217e1922f457536ef19e4274cbab05f378d0bc4a36fb34bad78dd150763b5dad2823cd8a000162524961d964f83e656c144562c28e2b28d9abf0e4510dbc62593ace27d0267732447568953019e8cacd0061fac494c71ce0359bba502975ad60d1be957ee9622c5e2f2486528fb993f8baa4aa43edfa6cac4afdcc16444ae862f8a99da179f7cc2ba60b54054953e00fc0bf594049496440fed02a316e1b0e0a5d7d8461fa1675420c389fe6d48c77044c72e5c0a30e2399fcb4e9c4c805cc66040677e5e22ec0df8757f141d7442ca07bdd8d5523b8621253a9b2bc04796c8b50f7844aa53e9a1604f39f03e8b989d3e2b536c0208d3658ddf76db120f08470805951a85ae267c1198d3b33d6b75389a7e9f72e41a425e87b7e9318dc01713ffd381b400c8e7a73685aa56f5fc344d6a5eb5f4a443994d0b4984571419daf0f2cec6030841c6a23df58bf07c048cd0c98f3e99dafeee9dc760ae812d09bc526467d5f0ffad7c364a919563db3309c16ab8d5677c31dce6bd87c69b3556d66bb297bd7da8223a0e74f2649ffb00d8fc71e1183ee8c36d9fdf84534440062b37e14170844542c58a59f88c8da9821056cd4400d2201d14904a460fae0950ef8bcac8fd8a30b2905a1c78aa73b4d67e528a6c831b0adaab3c93d1e09701a661016baac54670e7f67432655950d0baef2d1f908205ad461195c0d975fc91ae53efd5f599f3c9d54445a64c6a71e4edc4eccbeb895b83d11d9597c00661be914453ce9b8c10fc8c1ba5806d1cc63e690099a4deffb20393564fc8e26b3fc959d8c1e6e7bd548a4c62e354eaf46892e0c212c2c2ee35063757264c871cbeb4376cbb64be25444d906c7312d413a2e401614d309687697222b7d9049b0bd33148f7ed370dc8ccbe02dd48fc7cd1f9fa79afcfb257637c318fbb91663180e5e1cece4a098c8013cc85bf2e08262bcd54175f88b03c16bcd0c3011b93eb67b1ec72568bae23da446e593431a64826aba043d62b55e550f29402e247a8df8afd4c8d236877df8a84aa9886ef90d88e6129a5ccdbdd76ba385220f28203cce0c9c7eda4125d5a9f82501abf4d46ca94e5452fbdf1392bad81d5fad1fbfbf225ed45c264082ab151b20c4c5bb788725f56b15cc92cc9142a87481ed337b944789242a4c9b158434c088fbac1edf50aa867aa2002cbc296cce78142d66d64bcaa4c26c3b138c626fa8d309e91d55996152af61c803fff6eb75cc55cdb52903d7e83b180f64534c21694c00c1e23042fdac24c682ff0099a742d1747bf816cc49581de395714c11fc97a2cf38938c76723fcf49a34224a66ab986def170b230e2c09201054316bc2e560681d935ac544e30dff9b226a8b0db088c814aa3c22efa44410803d1f67df897a7b188095a0c6bb4106f8bc5d8142b412dcd2cbd2c440a7495a69f8395262f4c68e44ddb3384e6beb5bc6da6d47c303e589777f0f3750ac35e75a60e2a940e2a1772dad861049c01e3e95683fbd3a163fdbb05c5507f86b8ee8bf237dad1d928f19542d29fba2715bf1f5ee649ca7dc576e643591814f4d185258859a08d2d6a8e8b22f28ffa39afbee01c1c8e0861b52c9baa8c82b9472f54b41fc9ed6f05eb7bd00d84d74c3577310aed229edb650eeaf4d0b0bf516aa4d752af9a5a5f4d2d8a1a28e3daf31ae7b5a635d0d4ef2ba65a3c4ca9f29508316c07b98763462ccbb125781f3c089fe487b6eaa84c1bd63c579ca022acc15d1fd7f2a67323dd93dbf08e7e6f6e4f1c7dabfcf4234fed9b42180a7298afdfd4680a6351afa407f12b1cd225c524547ee68a31c52b73f0f61837c50570d8a8f00771031f9a485de9055d2520e8f56d798abf44de8eb8b45a7c660ce30c3e0eaf5ba1593608965161717e9b68ace84e9686e8c7ea603a8767a67376a76088b44a5bd0519a4565c66ce4306a08faa7a6617812329b42e9676a942cf20708acec86b8668ee20bf4c6a09981d744e9d7f86a667b469eecb88f7d721605d1fc0dd1e02c6364c552a566749e70d8820f422cc44c0591a82add2e06fe69964ee631669c479b313c6ec6f3a819cba3d1611f20dcfcd7d13db10b1141f303bb685d94482f38de9e579e5312dbe17ffdf5dbe25bcc525ce8ce312ef1f9f15754a500d63e13680a903925dd3037e7568cd0706b08fd5994575ef9f5ab4489d6269d771c7b849fe042bc7a9e734bec3e78503eb91d5e642a9e6925add03415233f51817e55f4b5e0d101b3df8c0ccec1b3d3529cce52e1c81af3d266b6bb7d289e63f5a6bd316f775c6b1d47a7266c68504b34fce862c55ea66000e50f612c9881f372b6ce82cae02ad2f6a66fb3e0205bd1a6082a1237100ff2c88e2e8675ae98a1f362b66e46ef1fa77fd9dc9137f38f05fa70aa477c70eecf3bfe66be536fc1dded8eb997f7f95b7c97de09376ace8ccd62017478086eb3760ce24462894b0e2153682985b5f25ce2eefa1fc6de4842ac40028e1784740a3a60ee24850300c3300cc3300cc3300cc3304215c2bcbc9fb4919415f27b81941aa16fec9b64a5ac484a86e799995ed1a2456d04efe08def585702930a310a620a3fe8d0c3238fff6ac9ac6eb1ce3c3ce8d821598fcc8a9b3c820e3c3c48e675b182a6f4934a083aeef03072548cdc526f8f7f871d1ebc4fee887bed1d9a89410603c610830c065c1d1e4c54f50ff67131573c0130860e3a3cccb018e67e432c871bc9d031870715ef2ca4d6486ddf7388b1812f74c8e1a188bc59de8958a1230e8f538e73dbc9f46df30b8707d9fc4357df5f868e373cce1ed93ebde2c4dbc5d0e1860739314ad654a591901b43471b1e7588c9c8b8561200430c312c501d6c7828e5a997e25fe89d1c47569e2a45c71a1ecbff559cf710520183bf68141c27235fd1a186c7ab73613fe5bdeb2a716441a0ac230d8f6ccd25e5944861dee2c852144c800b2eb8e0a20c08d8b861230c31be20c3737c41c60d1b373060e3868d1cef12a84018627c11860648d1818687a93a7bd0af8ad49f9f81081363868771239e36c7e7c79d65781cea7924427f54d508191ed79b5af6f18992f58fe1718cbf715d2c5d22753110f1292ca54f17324d617890b59579cd2a44bd0e181e8e84dcf169ec2f74a77e1ed3ec8507fa1fddaba39a8985bbb0d768c8229e11512b4119db453ea2830b0fcf47f384b877f12b5b78106de5b311a5161e9fbb25c90e294e0a3b175c601c3ab2f038a365c5254f3e3e161e456529fffbed7cb9ebb8c283ebd06f3ddd4b5b96047458e18197c6fe5499eb29540ee8a8c283e49363aa525decfc53e1f1bba510fa9b9ec2e35e0f9fe5c647235e293cde0db142da48b66057141e46d8105c52e8f28a5307141ee43cf92f2b4974c99b273c8e312293a5e69379d2098fce2da599ca0fbf8d7534e17148e76dc59852e8983a9860ea7665c4ba4ad66dc7124e7e96727604bf8f122a7b8b5975b1fd5a7561e3464712fa5d8df1b2103d1216f9f81159a5eac2c60d00dca0e3088f3b27fc5bccd77fd5a9247418e1d18f946876e8cb17241d45782ca94763b2905162f40a1d44781023565fc55b4977a563088f24f7377a88b618c4c2057708e1c15f75c7e74ee1f28438b2aa051d417850399975d88f28d0018487fdfa673fed6261c21f3cde09dd297af826d0e18307252de671a43ab63512e8e8c1a3ca19777737f642bf83070f3d2d5dd27995760bc191e55f9091c30b62dbb103b7d7fa2e667571647159870e1ea876085912e5adda2b52e8c8c1c3fe3297f911957c1b133a70f028742fe844ceb19385050c1d3778d831359727b16c6bc12e74d8e0d17952cb5eb9769bfb116c183b812d74d4e061ee9bda2c99b4eab283064585cb888fc9193c08999092c1638f386fb7e7f5665d0c1eacfbade6f94b88ca74c0e071fcf93029dc5532df5ef1b0455f43f77ee8a8c5158fe257cb6a87c90061462b1efa578ce1ef35e59fbe8319ac78705e65952e138841c69bc2aac08c553c0ed1b416ca72ce783b43156f7f087aa1928a87662d21ce3e3de7f6ad2061062a1ecf75ecfb687a3923c4051739caf8028c728a87a67935a74675cfb84cf1c0c3afe4942e6639e4cbf8a257e0a578dcb369e982c5ae28cd7be185a90dcc208512c363f5878f3346f13047e87f4de51b57641c595839caf84202898119a278d017ec443c4e7f481f4756190446b00b2895a38c2fc0b819a17810f7222126f63c856906281ec5a814747a369f7894d2eb623ab1bcf992e78b1b4498e189ba639bd8c72ccdfd7622d9b8963e94f44dcc982e6cdcc055cce0441a62c60d75135fbc797fcb932b21ac09d27a8a9c93945733c9c4217fbbef77289fbdb40b1b376c6417366ea029666042dd8939dcfb42ec5ca2f7def9aab47461e3c6716286251efd85bf2d8baba32ea9c4a3ed334d6aa5f9719202b428f13844d215f3ca21fbc71190a1001c39bee080f9c08c493c9c10cb39e92366cd1c10cc90c4c38f9c7b4f35d2d57722f1a8c2da84af0af519d2907818ff5e3a57cf331ef120b6f4a41c6477b336331cf168bb2c8fc86f64cfde8c463ccc99753396b9fcc59ac188c7792ac53f776d9d75110f53b62dc46c4b31353a43118ff6afc4dafe2e763c23110fc37cc893215c66b1f455620622b649113bd2dc357988376c3b7e9428d16288ae2de8a706bbb071c35c624621169bdf4fdba71bd213c2cecffc5dd9320d7d1006ff8898835ed2d65c1058468fe1f9c9724e20d064d65a3157ec00a21423c36a5eda93ff60f2c88ba96b8be9c27e6822d785bd7d504c7b64c667c307264befc44e4556f65078e631750d5b153d147396ecd9701e08b5b1a623f87f59f040659f8494cd9c90ebc2c60d2289197778545d39427acfe2c812a3ec0033ecf0386544cc5135b4ad5933eaf0f8f7dbb38cf53c9841878756493e868e891d312606059630630edbe94f5ad098871266c8e1a154874e29a6d34faea861461c929be4111787c32a3f53dda53af37943b925c67c54fbf6b8c1081fcd7b2fa5dcd76d20eba4bcf8b0a133cd1bcdac25de3538f1a9be3d713aa4ab86b24b6494f6681a8ed8aaf2fa94314b45c39f29ebc77a99889ee1f1dc93e19366e46c9aa1dad1a0f12d31e85bca50ee0ae99c2b7b0e153214d52a69bef91c231cc3521997b24c252b550c64109bfd5e49f7e085a1ed3c6e31d8a575606037afcb7c2a46c817ea8d0c9297bc62e685e2220433baf04cee34712293ffe4022b955267fda49513d2858d1bd688195b789c27639428b6c1673734c30c2d24a173e6bf593a643f0b97264b4b79d368261f0b6a7ec85765ca6cc7af807b97cbb9c690dd0a5e92dca6f3d3c143af427d5ee3361ff3867ba8b0a5b4b17d3b5350245a0ed1fb96c2371ff95d628c3747418999a93541c29cbb50f02cacc6dca8cd84fb84adf37f50ab5c95b675c27177e6729cdcc9724c13cea59bda3f355ac304f5d267713353dfd52cc13d4b271696c12b659480df650e13a349787fbea348e8d4337d18ed949bcf23187a625ad6e5ecd20855fc60962cd3ab7a8a80ed4a44c44cb3a126823e159dc56abfe32d43a8435aec7aa5d4280ac16f919390b2ffc44d10d67031cba43c9625048279717272e97e50ca5069c38416d907d759540acb197298480fc877d19c32ac539e076eccc8914290307d07c7afdd9027abdda6037a63aeafc2e7883939c8df3465e9e5690ee3a0d2ec94def6ee14ac1b78692feb1d1b9c935845af8de6af21ebc2c68d1a3cca92e041925b4cc81e2266d0e0a165abacf9236ef41443881933786cd3514276ab44c95f060fd7a6d356da0d0662460c1e5af7fbad598e52d3f3f83003068faedc43bb3d5486de4ce06a0f58bce2816c66ae8ae9b3738aef0e58b8e2719a889fa79249738667072c5af150735bce88e94c3d8373c082150fc4a3b8cf46a69eecafe2f1658b10a385575cf3081cb050c583d2741feb82fb062c52f1a0baf635667b6cb0970d58a0e2b145dc98f1a143a88eaa018b533cdc6951b7378f98961b637cd185093c0704340d5898e261c7cfa4e98efb182ce862095894e261cfc51862a327f91e1b376c7421011ba478904ddfc36bc76b148f64a3e54a296914c5c3b829bac66bb8b471b33160118a075d319e7b4a8dee75de00c5a3c908d375d1935ecc9618b0f8c4a3905a9a2b7647fbcec28085271ea5dbc82929513060d189c759a45e439ea89ce694130fbdb3790c531b39215ad5052c36f128e999dde8775cd76419b0d0c4839e9ce64c37757c88dbb861c3461712b0619589079963f84cd5ea7dd1928505261e66f7dfa44126ea44d5049ee3120f5e356e9e987aa9f252a68085251e44b4496b9d74bd6a458118262050c0a212f6fd8594901aeca644132b7346d32cd7153f0162e4c02205d0f0c343d98c713c84ae2f3d716491aa0168f4e191897d45fbc4866b9e0f565bfc1839de84ed3640630f8f3f55fcd54d71649503d0d0c3e3fc0d9a93fd85a4f3f3507e4c89f7a08187479a3ce52634fa3bd23b3c1219d16b4d115659000d3b3c48df949d3a7ada6a5c87872e925acd5724346598c0735c793a80061d1e06ad9014343b07066f17550e066f0e441a7378a43b927664afe3f87278f8fbe9ddb642e4cbe3f02088f4a756cd8e331c1ee5f4e17eec634e297ec3c3bd091f155285fcad1b1e59fe965acb8b9f9b363c38b9bad594142f25d9f0207f84bbdb8e395259c3a33c31dc2edefc7e6a7828fa396368f86978d0baf9f1248f8647e7693f6ae28f78cef068e492c7dce6fae99ae181e5464b6b113f53a60c8f3a53a8f4471ebd90e18188bfbca6f339918ce18165efaa968de19589e1c186fc193b1e27d5158687f9deb2212607c3c34ad539d3eae70b8fb3e728b94e9ad1f2e38507fdeaf1ebd635687cbaf0a0fa323f49f01d1f0f171e4d8c7bb62969c50c9e2d3cfe18529859f116fd8e161e56873c99da67e181c690739b85d9301a2c3cca2f7e531eeac22e5778f09d3b56ce826e8c5678fcd12edf7d8cd179151edb6ebca8a13dc60e156acf197332957a0a0fef2b2afb67293c08294f91fef3dc3f47e161c4e74fe529756767289091222fdae64f787c6297da63d4a9c74e78b8e9976db29fd6266ec283ae5c73f7b92e2acf8487ad6f91f37af4fd2ce1e1ce679fac92376f253c72999c2fbe9e2d9f243cec9bdf4e39f7afa68b844732d6f1e5b7eaeb1fe1d15c0831c6758cf030588e8f266b111e5f5eda4a1aad9a62223cb4181ec283b4dbae697762e78811c2638d9acb10663c356582f020fc424e5d0f101e7b96a42e32f7d13a3f785c97d163561f3ce89433742ced554f0f1efe8755affc10a990070f53455e8bde9052b61d3c4a9962c8cbe4996e1d3cea18fb0d1d2add5a9a8347a6da95248613078f73375f55556ef030ab26bb1ca653ca5ddae061c40dea9ff215f6a9c1e3ce61af7b2b57fba6c183ddcb34497d3e84aacce061ba328b11641a32786cc1b3a79a2faff0d288c123499d74e7b593e9d280c1e3aa7d8fd6561915f38ac79dc7f5dec5ac6e75c5e318ce275c8cd88a07e9d16656bdb2060f59f138489ec85ab15ab1c3553cfc1cf59c337b324f50150fb4c2794fbf988a07a335b9d23379828f8a0771a534678424993ea7781c3ecebae7892ee936c5231ff5898f5f134b97e2c1f4591299cfbd9225c5c33013633d6b46f130ae7f94ac9c95f3a238bd76ca259123a17894bc632a624240f1a09268a7d2f3aeccf9c4e391f1892e292f1d4f3cd60b9b663d072f773bf120064b3d1fab764c4e3cd2746b13227cc895d9c4437135a938c91fc29a78a479ade13da2474d33f1e0f3561e4ba121ddc4c4033b8d9ce2915de2519630af728f251e6bccf3fc714a3ed395786c1183bcbaec589a29f1307d8adfe176a2f5ad493cf0891b11aa5aa1b192c4c3cd1936eb128987993b9e3e6f45db85c483948f88d2ee231edacccc64b214b61b473cd27fb770b535e2419cc9521a221c59632c192a60c4a320b3ae1adfdbe62f05c862118fa3a5deb45f17453cb091bcb55990c33a0c1434e03a0c14fc11208b443cf29c226f9649658613110f2b5b48c5ac31a25339c4e359cd58bb4aa9c863168678541763f32926b2bb9745211e6a6ce9945b16d95917162c19642c9a200b421417278b41e05395dc439ace95c59145822c04b149e8ff330f37f517609471830b2e8e7f3186189d02c700175ca4c0c9483b641188e2228c2c00f170466a2b5a30b1cc0b4756292255c8e20f0f2fee237d2264e107d7bf3c04b95b8f6f70c1c5152eb810838c2f5210c683a8c8c8314600ae90451f68b7b5245af6eff3e1ac6de926e48eeeefc1bb946ce6743ef27b3d7439d7c4f11c542ff679304657cc5c6e5cb31e0fdbfe67895927ff7fbf0316f247eb1ca2773bfc16c62d4de27520b28f77f4cd11a60396738cb7da392b278b391cb243eecd3de3c9420eb4c44d1bf43e77e260de8544cf1d5672e0f0707ddf44434964849c2cde704fdefa6629d7dd709ce5e0773eb9e236a82fdb99626c77d9f04fbe188f9d1395ae2191ad49c9f4c14335e8d2a94218b9300d9bfb4638c91ecb3f3418c5f725c5f49d3b831dac2443244f489b819d30715a970149ed10b12603ed79f6791e83c17f72dcffb41a1683393cc7491a7437881c062bd467d19ed280e1cb0931ed9025f9c29664d22ff6c2afa721b36d2de22e6c5e16f31683e6b9706c8b36eab1d1ccb385a7bb6564a526a2d40231d9547c8daf4b168efc9f4b97381670f5749247422e0f5ee18ba031544abba93f2b98a5691e92c507bf0a5e956a324fcdd0664105cc37763cf369dc4c218b97979c31eb113752407724a9955d691e852dc5cf2c92dc365940a11027b2fb39c24fc8f38659c6b1bcab13980ff12e53d38463645bb2654f1a261073954fcb651acd128e5f6f51b93dfa4ae0735f489d847248edbfaab8f9374830a4adb238022d5fb6dad14423d031a5ca5a3a3144488b60a5cbd9397c309d08c4c921b6fc4d9c87c0de85a01f6724bc2b04643d7a2e8f25c10c029b2fe74c13202ca1296bd6385fa9fc81127aa2922f69ef0373df87b09bb3f33d3854c8265ae101d1eb5177c9620767ee09297da84f962c7460e7983d4cce295c88258b1ce8f3b152fa14e255b2c081b26add19952c6e80546ca02789bef01324bdaf019bae63d2febf21a601569925e4bb929c99192873163366bce8a5c8409b68562b662b6216317814268b743efbf908412fc64081172510430c30f202366ed890808d2e24604302260559c0e07184ddd48f69e7e9ef031daff032fb2a64637b5cb1c614ab424ab373ad78e2a4d0d375151d3c56201ab919f74a27b78ab6d62b63e4adea5451c7accd7a1a5d26ba5498e144a5720ce1e74350514448aafc3b9725a7c05ee42224a6c414a79aeaf54a41cc0cc99db5430829f21d114913320a2b45dd91601715c591455d4cf2506853c1ef75a7a2078a7e628add88465ffa89f24cd6e85091c9e3892468b8e53a511649363927f90827be3c3a312b17996d82787f977591dcd74441b46d627d0e7726bcecd7112dac524cac194252d81999dcea129c64c5649725dc2475d6a9accccf4abc394ebcfe53a488727450a24b99acfa39777a80961f31c23806744ce2d14bd478d29872afa1ea90c4c30a59da268287e43f7544e2a159c82178c5ab6a4b8b094407241e9684eeb21bb9e3110f5272aa7811950e473cf6f2d08e1352deb50b8eac33137434e2c1ef5dca84dc8c641b471661c483d4741e951f438c1c5e789599083a16f1e8fdafd357864c481a2c7428e2b16a77d84a711b516c6c4347221ece797ecc2ff97245357420e2819476748fa71f73d9211ee68c89a59fa555300df1589256f4eb8414e3856ce828c4c397bc92e284b1ae9609f120a3a5e8ec2893337b4b39740ce2c1bac551af0f71d2c65c1a3a04f1288987470cd265201ebbe778dfc1825c0889aca103108f75a3e5b35c0939a60c0d1d7f78e061e5b13f713f3caeb4497a377e6bc4d7faf02863baccdcc986c856f2e171e646c9cf9a2f584cb5d0b187c2c5ce31ec4ecce1d535d6f020bd4f0c492978867925a8a18607d9b3dea5c91e928687e5992bc538c1a25eb0808c1ca42c60e3469132b66a0435d0f038a4627ff2f839c383943cfbb2ce33123f6678a4318b56f60897e1c1a6e0ba9aced57337323c328bf6b1e2848f21158eac1378fb060851630c0f45826a1eebdcc92917c3630b221bebde0a438c2f72f4175c704155230c8f32f5b484a878eddfc191e5fe5e9c30d60bd245053450812e24c0821d03f750030c8f7f7bd5c274c595387194b1640da8f18587ba219468eeb9d85e768c0c58a186171ec6fc2f6f8d39a4f5338c1d230335baf0b0724c162e458e993bb864b816036a70e1a10749f9291b3bfba2c6161e861852d346aa753a8b23b58616c888cb9a66c41a597854d942f3e64e1250030b757d6dc4fd8c308b71b4c6151e8e8d55c7adb22973bd600118638cb1556094a108a86185071542929dc62b4d31af82fef792f2788f6454781c2dfb47fbdc994295a3c8fe2585471a25bc2f557cea7c47618b8b6de1e53739283cb294a36dfacbbc93e6277c21e50d333ae141e9ab77a5d9b0cc2c8eac7230d80c359a600a41df7eae35baafc184c71f21dfe793c81cef97f0583d86b460d351c283add07821d72d2aa693f0e82c245795be487878a613f673245d65f7088f6235eae7dc18233cea90fe5a9ae53e8564111e55e414ecea6aa2934478143cc4dd0afee13a5286f0c8def732e50ad9367642789c37a4f8dc0c8998214178d0f71a3675e3e3250d080f239dc690d773dd42e8070f6328dd0d29c929d9c6070f5c42a5d73c5e0f0e9d1c0f1e5eca1693d2a6a72ca11d3cd8b393f01be3a45f5a078fd7bef56cfccec1a396f388f1edf0e0591c3c4cafc982c44c77d13537781c65394395b8c8a4c6060f364e52640db5068fb3d36c5b8c21d53a4983c76229672dcf6db579a9318347eba923f3f62334a5d490c103898bce3c61cdc72b3562f0283654ef46354bdeb0060c1e9c4dff27f36c1779f28a47a9de7e17dc3e4d4e5cf150a3cfad4d58c6a7d68a4723714290e41a473563c543b352094164d2ba59abf846bac6b64254f128a5aa31bf743259552a1e67cfbfa4de7183c6a878f46672efd5122f644ff1d0734376c68eb0a085291ea5a97d90494bb039ae148f53d984d7e81469354f8a079e22a66b4c9656223e8ac7bab935e52cbdac9a8be2c14df6ea58bfb2a93ba1785061f773d81cb34957503cb8a87aa65bea271ee4d28c9b11db1183ea89873da9227db2bc896776e271dc48fbefb9f3641a39f160d24ad2ce0a6ee2814b6d9c1c93929d68e261e8ba09a2c1d6dcba4c3caae914e2591da26d4c3c4c933dba5fbd9aad5de271aaf1fd8cd029e55ae2a168f29660f613430855418b4a38a17464524a3c0e3937a77c5b6af9f649e8977636ac54522f035a48e241cabdc9ed3da77496d1326811898763969b337e782af340e251f09814721cf3110fcd4fc274aaeaa9f51cc14c76bfd9f8b1463cac8eb639d667c4a3a81f53d21833e9a68b7890d33d5b2c715d0b29453c96a0ba796d3d57a813f160d6ef2ba3afca5639caf86205ee4592410b443ccadc9761527ea51c1fe2616a8bac61f37cbf6788c7fa13ac2b75f7aa95857860ffe529e4f4b447b420c4c309f12d7c4a3183789016dbf27c6a1dad50108fdfff7c226c9c285719617cb139c21023108f63264da25da2597103e261b88f25bf3a21edf61f1e5bf458a14adfd6d6f6c3032f2937edebacb16d1f1e5b8707b78a2b1f1e4aebc667db46e97f0f0f464f3ed8dd590a991e1e7baeb798a32964a5ccc38309d54e951483794cc1c3a3a42312fb8216777838391f25e7cfdbe1c19ef94fa7754c15bf0e0f365ebc4899633ec49c0e8f247d1ec916a1b2273d87473a15aaafe36c889fe5f0e062a2d6c3e2367d1b878762f37392b6b1276de0405ad088217656dff03853ce951eed342126ddf0a8729e997fb9df0d651b1e6e8e17d9b345f05441363c8812e2f6aec429d16f0d8ffa442fb2cbc9cc7c6a78a8729d346987a4e1d1cf45cc4bb1d2c224687834e9f2662b3b99cfb1333cd68b8e9e7333333cb0704972bef766b60c0fcf72d8df9e3091e922230739c02260e3868dea8216643883c41847836ec6075a8ce1ec31e6f38755b2ec8be1c14c447f75abc79cfb309cccc6cd652a471e0c7d6cea9d59fbb1d1bf60f85eb4fbfa14722f3c8c542a65299125634e0e2dba60b28eb13cb9b06cde33c94acd1654ab0c3dff30a1a385a3b996c5578bbd942c2813a3e4fd0e318505bbdf3a487d053e4e1491143373ace0aeff269f97baabd0a4b8853c16b2612a342166696b908d780a67ab884d1652d35230c5e76dad3c694adc281496aee4266a730b855e62accfd89c7ef384ee4ee762639c8058d2a86162f04d4f134a7db91065c2ed49b2c67e092549b2d9cb2f85799540659094fb344afe259350d87427fe91f30609e7bcfbfed9536639026916c57e3c68088d6054aa4b1bd3a55c11d69c1ff2ba9162227496fc2c9c4f30878004ebea1021bcad7551daa24b160432255be54a8f1e534048deab3f4b8c3c92da183b810c941a634de08583c12810e3509121468e353dd0e2078f7c23b73aeab775922c202387b2808c2eb4f0c1e38b92e37d3e867b09bcf026438c2746ac045af4e0519254613e850b7d1e32728c41e5393687186414d482078f76227ec24a2d5bba706469392fab163b7814529e548d2595e344cb60417b01c61826f862085ae8e081879e8be53c070fece2eb5e30a9baf771f0d82e33789cfb377874ae96fe72d84f7d6f83c77b514da3262d87ef35786c12ca273b731a3c8eb89d381943bb3267060fa2443b05bbc99b5296c1a3d3a98c5bc9dea39b183cccf9369bfbff4675d502060fbabb2edd85941aa2f28a0759ee6316a3a4da1c573c0a3ee9cd52a615bce8c6ccee1269b0e261cc4962d0ecc92a1ea76da58a993f1793a58a0769eedbb388da5d94804023150fbcd2c273a89074410315042fc918424812d31c2232b9c63576db8c67ba40e3140f323c9db7c4541a833d041aa6783c61d5723445234b29041aa578a051faff7e32a61be2c8f2010d523c347fbf4af9525f4a0e5681c6281e8678a468971337668b498186281ee6106df2f5b7c5df0dc5e3bcaa31d4e755c7f443409d4003140fd3939574d0a02329cd051748a0f189471129e77d0841dc53ec868d1bca021a9e78903745daf2ce77e2c167f5968a9d2d23dd9c7828af9a3cb359460a7f130fdf439eab48cbd8af261eed844dcb336e261e576a184df127c3a60d261ebea7e9bcfff3613f778987af69dd2a916289c795ca3288640a4975aac4634d9edf2a588a167ba4c483ef9bd42974b0a8de26f1f05ddb225a4845d610493cd4cb38fbf29525b55264a01189876295ba43309110a5a20189c71ffa43b3e86c8efc88c623cef24f494d9a3bc54fa0e1885ec2698eabed9353028d4694b913236abc7f4f1824093418714aa75229d34716b017de616c0ace52191a8b78ecf5a19fe5f22ea0a18847b569255c6fd5be480c8d443c4a31dd84709fdceb530b6820e2f1c5774e8d1b755483340ef128794be89c99c691758386211ee5d4999a8046211eba7e7c47b85c021a8478f096534273a4b5a3b36280516a023406f1a85bbc7370f368e9bf32561f7086011a827898d64effec32543275e4755b12100f67d737ed348b8c677024293f6250e094c61f1ee50819444543de18172f02b5822f4ce005a3a08c540a7cc08b0108e00a8f6a42afda586d5c20002b3cc8cc93719e591e97992a3ccc9f7be352b8f0759f1300151eed4eca9039178e2c3e5e94b1546528e0050298c2a3f05952c9df367db92b1080141ed9c48c143df37b351a850741bea24cfb8223cb049e2a1000141eda448b1663b7a698aa1408e0098f242fcc73b5044fa97940032260e3868d07942100273c8cab9fb12db6da84dd46170ef02fc8e8c2040268c2a3cea89d2b6bccbff630e191cc7828cfceafcf97f030efb63be73fd7e4b0121e4baf7c06b50a493127e151c514c6bcd38b94ca487874e1fe42a47ff0caf2088fef2547ffe46329a534c2a38fa88aec5829c28354f5cc09fe1f7c73447850e5b943f768c8b4d5101eec55ec9c58b80889d4180108e1e14bba507e6666fe2519625cb1808c1c613ccc58004178b492df727a47889b231c1000101e966ce49c617fb743ce0f1ea6906b26d43a3e787cd371224c925fba740f1e6dd87f9faff8394794070f73aaa346cc1009dd0e1e8e060b615e738ca8a50e1ef84c8e93ed36bb37078f2adfa907f19a95240ebec8ab9b2a44e5060f3742dcdfe56b83471b82f6efc6a4060fa35dfb6850d10b01d0e0719cd857297743ffc6bbb071c386066cdcb0b1011b1690800d01cce0d18758f2539dc66dc32800193c12ed10728821774e591e631d870a2006e7cc4d5b39bf213e8e2c4f01c0e061774caac4da84e8498eff0247195e14bbb1c52b1ec449ac2467a29fe5dac2150ff343f0dc6a936ab61386185f8c6196802d5af178736e86201b2c3a2f4ab04e065f6ec18a87e5933da35b75395bc58318967663e5ed90e855f1a0b27c5ae76f52f140dc3536e6fc34768e8ac79b32ff844ce79b18728a479e5a62a4dfd11ce3c7140f4f636c66bae6dcdc94e2d1865dc406bdbe1015291eeffac61b0b7b140f6532ac44deaef7a011c5a3d9991419164fd7e7503c981c528ea58e2189c740f1d02e05b314b19dd2c99f78747739e67256bb4bb2271e6b907877af77e291f686fc7ceb71e2619098151f24cba4cf6ee251d214daff1ee1e27f9a78b8fab9b5daefbae5cdc4a398fe36e3745a980531f128672ced38329342b397781c6642fc48225ae25164afedeabf275b4d251e7f554b878447b3d22941f57b8e270d9a493cca185fe262efd4ff2d89c7d31d63c53d9dee1c8dc463cf0b49ab315d6dc540e2b16e1eb91ccb2143a68f78d435d3d12e76a6c790231ee5d092412ba44a4dd988079f3b93cb7bf3a618c288c7f391fb3ce33a868f8b78ec31f7654dddacb34d118fe273fab6a4ec1a1626e2f1fe49fb58be20e2512e7fef5a6d8d6adf211e7ca5e4f23a89f421c5100fd576b2e84e085129528807fdf9653ce689100fec63674aa6cf17cf201e4699b493fbbf201e790c2144497112ba56201ef9ce58bc102a3a670910c77ffd0ae993feb08798ad8ee0185bf8c1025bf4e151acc8b9584c8da8992df8f0d853f0c8de5351161678047094b10fb8b1000670c1051f2f4a9191630c3d6cb187472185b02fdb32495414984015906580318609bec01c6ca107db220f8fcb66a27fa2c74f63f0f020d6e650b976d25f54eff060926b8c22bd66a1163b3c920cfdaf9d4dd9e432076c5187c757d696a33765e14b3a3c4cfd9beeb5315888a92de6f028c947e8cea13757a1346c2187076e79623649840bb52de2f0306f8e8e7db96a35f37078f0d96dda327d7eb97fc3a39035a68796d20d8f3dc7edb42bf79c42de868797638e9d4dccfb420e1b1eda87dc888a0b113b6b78a84127c4ca65353cee1819ff9f99625a4ec3038f6f1a8247170d0f73fe5e093e6f31857b86475a29845e4bd90c8f536848ca9f6a5b925a860729d792b2e620297e92e14155ff9c75be8ce1d169cea2f9c22286c7292f43eaa670223e86e1510afa59c2a7c1f0c8f54e2584e654dfe0171e6806ff8ef1d2db15bdf078b2e28a56ddc899d88587db2127a6e7a68eefb8f048937db88d6de161a947a93cad103d745a78542b36faa6bd297eb2f060e52e6a8a040b0f7a42c7fecadb151e5a9209d1a294abc6cc0a8f3dc86af418f76ef6aac28398e22464c45478381276937f50575f6b0a0f3e8595dfd6a99f18293c8ed673a92d5178ac5796f2e97a5eabd001e30b14f05519366eb0800c47c1056cdcb0628193e116301f6c0185471e427e75480e056380608b273cec38ad9c62494a2ad9090fcdaf3253f0490e32c428233fb045131e86c48aadf1ec7aaab205131e7d9ebdf6d465b1e3c0164bf0ae4c3ca6a79c2d94f030c9b889dc5b340db9126c918487f729abd5d7e5ff2a121e45ba0e79374cc73a7984072a134e2fc7602ba9106c6184c71a43d6caf6d1d4cf17e15178bcf590a613e1514852164bb3d5a9c587f0b83453d449fb9762e74278e49d83daee67d3cc74101ec508e934e2da407898a2a1dfea2a46f1fce0c149ee7e1b4be9a7e3834717f2cb9265ffeec63d781cd39f273d479b2c310f1ee728ffbc95275b2c77070f6bce2f534b88715246070f5205f74ae5239595e6e0a15f456f89b2117fe3e04148a5b079f10d1e4e9db865b79866316df0783f96c6b68fd6e0f196ded8844bd2e0a1a5563891d2dca4cfe071e518925945788af8163278d83f59691a3e5ec8952d62f0b0aa3d6255784bd8ca163078fce9cf3cf2a4cf7795573cb60f6721226cbdf7e78a479691c16252af158fe6e43f72f818734cc28ac777125f27bca4c3b6553cfeac3147fcd254f12873261b8f10f3bc4fc583df9c2645fa0f2a1eacad4baa9da778545351efc7a258de4cf148426b64c643f4986a94e2a15aae9cbdd38668779382abce21a4728cdd811aa3781cd267cd669ce87ab2281e5f5baba74d9b503ce8fdce18836b40f12866c6e87fe40b26ea271e5e7edc7f0da1271e4c68eacb9ead3fd9d789075b6e92396bfca4f238f150fb654b26bc4d3cbcd06a6de13a3a6b34f1a8337d63ccb56d8648261ee9bd4678a57c4e18138fa35ad64cc94ec2667689871ea4ab63588aca33d5b0c443b1b2330f2157cbe62bf140a565327d4a1716f3947878e17379e6fd241e65975afebbd12c3997c4e39c9b5255346791bf23f1c0dc35fe45cf1b32dd90789453e96f0e1ff1282385f34a8b9bcb6a473c9e1842bbeac5aeec99463cb81fb7b0ea9e5df2ca8807b731789ead105624b98832fba6edac7851c4a37049b2bde49288c7b3f2b923bef96ea820e2417a6c64e4c74d551fe261ecfe5dc6c98a8a1ae2b19af56c1e8fe31dc1423c7ab5cb303157a68a90108f73baf3cdec591fe91bc4c378b143e74bb9f35c228807e121d567f758201e67304f39d64ea8d801c443abe87f8fadfef02068fa092926c90135fcf030468b5d9539deb35f53a8d187071af3ac7ba659dd20b100146af0e14156edacdbc1827688efe141680a6b0d3d3cce31ab42db7d8ef2538d3c3c88f943c8b621d53c849c50030f8f623a89ed9f5d8d3b3cb68fb8ab9cac6cd36c87c7efb2493d8494d56c6ad4e1415b8e51e6ce73cadc38b2920e0f5cb3d4e87d68c78b13781956aa801a73785c97f2a5ef9ad2725f6bc881d5c8b0e09735e7e0c8f21bfe5b46181ae0820b30c0f02e05861a71781034b7f63a334be3476ed480c3a369dde8c86921d623661ea8f18607e1c64a42b8a6ab7db9e0a2861b1efeea5acb57acaf7ce1820b23d468c3634b9dda6288b92a32044716199e2387b31739bc2046d8f030ad56f8cf2a3d8d8a9123038ae1a8a42c8962c250240e0884a1804838121c9d2e00131508002030200dc52191200f75517e148003482e1e323c2c142018100c0e0e0e200e04c2403040541213476140181c0685c20151293c83e3038e4769a01afe0dffa9967712820a93d1d22c3bcbf4e230f8cbdaa7cb1e84201435064c9bff13b64e4cf41bbb6e949c408c461dcce080fd3a3859a5c919c827ad7be0b6c1da0768929dcd03559c4a08f9bc7e30dc75c0fc6460245e2d0b8d399ef48d8f8a01351644fb4d743d22c1e5cdb225ed301f9cde41d5711e4ca558268ab2d003a966978983d4da2794d6c4c63c62198fecaf0cb797127d458be588e51b695a641d4224a669f1fc164bef313b83da95df584ba97860a44af233cc549023105d3fbb10ef5bb563e61441ef67a9474001044544419635212cf68e3590e7f85c5a30fd6be7e1b6dcb8f43f7b79f2e868da9075b93965e070459795114e47aeef92c237f33057027e98381118a4f51663f08ed1e619fb8ff6af1b1586c63aa7e5889e3d844d6a46a0e7593db94463356be43654b75690dec952d889eec34c4f2fb4932cf7cbab9de11e2a125c5fb4b63fe0d8442b6d8b94ed315f3d0423e608ceaa2a7c0fa53111409683834e4084b71adfda402e6f827378ad879aceca9c933a14ba82b61ac628507d0b824e2a06df09050b351897039e55524434b4f81653c7ae043c2051d85907616724009c654120273fffa4b1c1059d972af81eba7f914a34b8843af7f30f4878033ea86af56f14206abda2d652eee758aa3c2580e7354e85445ade4e5a2dedb36197c59bb4fdcf1a7f7b7168e760377e73e7ff4596ae803461d0333a8bdf63e700cccedef0206ef93f5f92be0cde7a1c0c55808b4b7f538638d1d5b9f7499012e0471cc0d640a308c5ee8bbd20a53c7e0f03ccfbcedddf332aced894538ee53ccd74fb272ac5f45fc5a036b4959ca5ffe2c2b32273a9bb974173d18acf4f81556c15dd83400e8a06dec8fef6963a2ac4d30e2df0744d85dfae172b124699480fd784f4476a9f9e7a25fa654f7f89c4ac6e537d2efd2afbbdc27f82428b5fd252dfdfea9f98e93b74a1beabd5cf193b6a1e50fd207d78a15fa11a0a6446d4fd13c78a58ddab5f2def7725a381d626bf87bebd3e96be02eae7f4ffce6400c0ff77df1bf1576846724165d5cf09dc592f55f493fa525b3f678071f3efe3efb25f6efc152318f7849cf85788d5efbc4bfa1da232e3eac0d7111326e9c30280e7b4b7a53281c035f3769789526f5eeac6737a7dd0990c1936b8900f730cb3ce1426e0f895f5560c5edb35e06d50ec75012dc1d17d9898d0669f41ac14cdc3c6175a451125bcd10794d25c6e9efdc986ba2843ef9b7c9c297a524fb8907c69d24e64745b239d90fdc93369644762029e493cab49e72f05666a30e64434bac7073a1ab7deef5f178d6e8db0463cb0d19e7c29059c7da429e90989d068c7e8c228cb68a42374449a6bb65bbfa022f512a35d845215ccbfa315fe8015d67ec42649eae8ada8a2e8bb116a1dadd886683a5e8c0a1af9c9680e5d53ef52e8284a9176606aa9856134c7f82bfb9a498291b47bff88ea9279f2858788aa58e060ea2cdcfdd0d6818ca6e2b8b46cd2b5da01b93106b05619c3292912b07b761209f289b126811fde053701f167c6303fe3545c6a2828c8ea90a52bfc3186bb57a5d29b1411685d4b00e2a81b0c56d5ea6d7a086d5890cec428d72964d976be56c2efbd9d0f4ba933aa7d75ccbde4975148cab7ffeb26c728e05eea365c5e0062c1ad21224a193119f00cafb623a49c7cbc975ca753a9769777f06f19067eb833864d87424854a9a0468998655c54287e3b6774331483a06a01b6910013e90c00bfab36a47948bdfadaf35dac1c4808fbacb038759223586cf8d04a6db9d2e14d308cb0d1bf086d1ffb21e0fc5fad9e0c6dcbef2b6d99632a48847ecbab392991f1008d34812fadaa32c3b97cab39d532fb2c1bc4961265c9a629fccd776b666f60e351884ede5defd1ad3da06d286fa24f81450b7a43929691337ade5ba013fd7f00f7c6dca5b3499002a4958feb029c73b05ddf68da245cbc3ae0ed2b7cdf88b0b5e7219f8d89bf68becb0e95b93fa53bbcf08c4e5cce26e18a137a736b830b69f07d619cc923cf019bb6a4a7230a8d2655c39a2da755c790c8b3ee15299a8c906203b3f8cf332841e0e38bf0721b1ab0c3d9bb2358134332cae15696ec85e5aeb3641e09145cd8aece114c29877a50c5685ad3e78f0cfb717b732a6fe6000606a80fdb9a53608d18bbb3c3440778857e2f525e41f0180cb374abfb1a448fc1e88c6b9681f9e5d7a0a3930bc2d554b91951a24049863a457aefa33d2c1e425c13f6279bdb5c648fb0cad2622e19ffd95f48a862046d13ff21c552c1fecce76cf3086dac88dd972b4e57e3da1fbeca9520458377da6b0e0f4e2d0d09f1648be90042122ef595a00d78cb1d5820c7f67585724ebfc7d1614f863039845237a89a80612fefe3c9202e5d165ccea9b913230cf1a0400ab2971b7c2f6e3c2fd719e498946958d663bc45c7f8f8e5b1be3235b113e1ccdfbad09d828e30d8319a3c96c12ca6d9c3a3e29760005beaf982614c66feecc3c97c5458e7adcb0f0ab272863d4d1661ea54482869f8266dd1d061cc1c3dfd4475c9e123a20ae3dbc9355e625aeca7342179a47bd2159597260e7bc54460b7075543e7d53096894237e838db1b361a8019a2d8aee15363e52bd9292212c502a1c2acde28bef5b275d7b83949174ad7652b07c4fc6874b1d2badc22077b5837974f2f38302517222efb5d8ebc60e7d87a785a109523db5e5e54332cc3e297176fded07fcc5b0cf77d758a636bfef49a9fe3d0b9cc825c2ab9e342caa5caa59b5e0ed0faae57a32e015cde5aaa5b6c2d865ab45c0c2ea75dc6ba5c7999d554ea2aeb802179092f46ddc1bc6a2f867e813d49592d5aecc73fd818b128be40ab3e830aca11947c285694982ee55400d06fafa168a2245192244a7e47956707de296f158d53d654c6a68ca1c2228acb1f320b0948583fd486168c06263cde459250b98ba00fae9d47036f3264e4a9cf92f742118f03798685b4a91384c331fcc468ae60f531bd46b78c76240f335cc88dc6c55585105d257522653e6a65d22eb96e5519b786d4cf6812341b28d57c6ea96ca461f684a4abd81e9bb7ff4a11697f818a275cf8e2a9519bec0a11ec0e0f494f20c9785e793279f49447b0c4c98cead1f3e98fc70786e7f5786c7daabcd18ec1c26e1b539e0311633dd218da88bec9972e4e194e189c058e349cc138e7e3a4902519ebe13831380670dc70b271a816c7c2521067dfc009c2c1163865d96ca5bd20ce4c3c341f399a04f5f919d08f553dc0477576a634d2d36695639d1aac7799aa5399dc4539f46506918ea9395186dd82580896d115d1824da7a9c1b83cf0aafac7cdd3364af192710ed6eb0020ec40c984ced61759cfdb4cac75c4a7efc202c0566882c18c87b024d1137c3f11b020a551242293550a9eb942ece1cd2e12c3bb26efc9e6b2018b44cf397c78d266d4312a4c11d5713f782ff3da117577ead0f75c8e222c86fa621a26a038a6bf84b37a491fe8e9c2937142ba4a98a5a8660f267356725d7ec346db4baac47dafbac8cd44b53d42c00433a381920d745826bdcd8d5a4feba8e9c0549aa90f3de0b3ed32efe811369531ec085a07a4d15345b09752ec550a58b4c32d3b124649a9965d1b7a6b5507a57ac3199c0519693749c2f570971ad3349d4eb83b876e225b00e3f1e1aa8192f3eb1f5c5a4e9abb748b2593068f0e7ccd3ccbdc3d95ec55d3288c3ef5f52172a6ceed277c76405d551c8fc8c6adbe346f34ca0e734d36c50949edad15c9d8eff9ed4751b22f51314d95e4771a0dd176b5db9f2e4d07150136e5c12122a7ad8dee8f799d58611190c4f03e24dc2086f9457d8763cb9d1ff4a09ec27f8041d6ffcbb4b92228d267df17c0f8cff540f85540ff513fa0be3abf8d1e607fd5057009cda503a1022eb2b0f993626ca23ec1468908df37fa970678a53eea64ccf07f2274166c106d8da1102e4983a5118c82a676dd65a0a8869097d41a20f833ebba30fc476c5e280307d1e0e3811056c15196c44c95fb4cd8969a6836bed8c5499ef672400f07c03775e4432d5bbcc58c25e3cc2d7f9153c333d142bec9337ce46e1f7b0839a1f0c1505961600886a25423fa74ae7ba9554cba346889dd968fefe226767b720250ca4266a9f1b3fa23952c87d9310c935dcb9cf6fa3943d2513ae99404fcbf1474f4d1dfeb11689f54be4a7ea4ea874ef567c1543f030786547f3fd14b8ba0711045267e2dcf32322f6640e4a149e70e9dde57b9a6bccc882b44b58f661469b42942c77d10b283ee91ef116d2c60cb3048a3c970c5ddd30243ce0889c1c7e8cd1933a50f819486581253109e211c0878f13f47a03be2b913e4ad48d560ec384e70f58e842df914f2e458edf279d56201a3e80e08b11d8dd96b34f8083c057217c18185658be252a4128eeda5688931e9800a54822f61b893b1f1a9695883578cd06f41f67aa09b2bf7b70e356393a01740b6cee49a8c7d120f6ec6b13c7980564f9b9dd5bf560204e20c451a6719c12043947c6736cecb4207f97414f57e550d1fd3081c641ec9238ab12b38c7e0b5930ef7488066edccb80b0a34d0a1e069b3eaaa20b291183bab2d0c5b2df3fe42dc10fe41796d9c09d76901d0d0b8ee180dab2c976254f7f4f8384321b30904d309a273d8dd30fc9f2a104d4fbe2252a5e63cbe19b3a0566012826130c23332b0a46841868fa8a30584c31d7e9622474f270e4397eb8ed1730cf5956a39704bc857efa0adea004ca4a61b0189a0ce7023dfb5b4342ddfa1909762ab50647163d2feb3e46b8b6f40809f46c69c1e4b7085c3f88031486d0b0883af867ec28c0d7528b103d46845e8f61c8f339ab4c10e0108de13c963a5c23ea437fe6374c79e8f892b731a0b823ca5e228042aa4654b7561cadffd05cad75c8c1e3a47c9191ccda1bebf57c4460a901e4abc7f04cf8f063417d5f4282d78c592fcb703f79a7358942fbf044a060db8c3b8c97064c2a83e8ffcc341454c4b6b7ac1599041fccccce55391d106d5362edb827d59807f8d7129ec66e65ef737080939a1e1cade191e1b50ab52fb2c447a1196612ac6ae88228308afc5160bf8a89ad6315f4dd8fd59517cbc218a7dd43048c3928980baeace52bb640e12ef298b82be899c19d9595221cda3605484ff878f42ae9c2a08297f803a845dd021f59b69d105fcf7d111c28cd8cfce3809246d6b9a057a5f15d900274b7b8658d44c6879754ac1768c1efae5983ae15360ba1131838c04faa94e508a2c11be8e9dae00f31521d6fa527febe697b466d672a6319386f886572d82c9297b53b43541c84d706f5e8066bd2b1d41b55c7aea7f21c958cb962e33e51f647d99ac6ce546198493809d8870f679bba861d0bd97eb4f36ee0749aa16ec8b3d745593ed726943fb54ec30267ae800891adec1030f8773422b95b01de11f5b3e73d88ccb85d5feb6c55fb8a07615f0b0dcb40493d371759ada13dfc82b9ca7ba4d9fc5357947284f6f924cae2a79721c931f2f541bb35b9a815d78ea36415133df848cd91d05075d5ee62581e7c03672a0aac2b59e3c133a86ad0cff228bcc0f9c8136453ab664510dd997c0a470bbf9c6cbf491c56cf88e5189f822def017eea9be0cc3a3916f6b7cb816401cc816b653e0df386c18df9ef37e28ee06abe1bd8863ab076a09c543a6ede238818f42c77759d8a049a615ef27d35461b3aa1c42681a01d43094d1272a47fadee80236ef1918b2f9f3b8bb8bd6db90c68b2a473cb24731b08c12ba8c4b9724dd0f415889027b3426809227d61028f56535dc120897ef012a88ccbc27370f1cf650b3ca83ae400c24cc5bed79fc8920953f158ace21550ed4b51c29af27738c62187a549b130c6624a982e4bc145c332eca0f7537225356df9c887b414ab4128bcf008ef61b40296616824ea26bffbe882ce827768d3d048f19448922baf55417d1ef5e8a2ff50b55be622836e0d7f8cd73f724f8e3599d5621b2214753e3be2eadc0e7fb5e0ef3975058bc974d2b755673397ae77311a97a36630442f79d9ad06719728702d283baec4552bf86512ab938246cb2c696f4fe4423cae8d7f9f891097bfc98a13df7f01c4fab9d219afd132af230eb3b2bbd3df879e684b554a65e29d7de964935a126830800be20737dc94c8f216cd401304990ea265a46ef42a39dc4cc424a23c8c9b7e686685331e366befaa60d66016e81bff409abc74c52a656651c81ba0100cbb3e58695babb6d971368e99953b97be6795f4e65bddd5732e1c10a17df62d9d4e94267e6da8b26b6c25f97eef3c73e1d84ca2471d7b2f0fb2673083a756eb79af0ca0765b58927efe711c5b8a4eb9977946d294d055c72dfab13952b82a6e434b37ba1c267936023accee3396c2529eeda78371e0a08aa18133eea23cccf0c426594a82c046098721e8da3668d5f3697858c73dd62c27d11650f6d3a8f4f57814441aa82595775e30b0282b5b306a9f5afcec8205d564cf40ce52aafe28ce4a9938d370145fda2d44faaf14c84e03750886919ca0949fda78262e4075e1e0cd6f604921730ae538bd7ef14132720e4541be4b421a67e07e7e6723cf5f382f864f48f064d5049df526959fad8b91c8886069165f6388186e2387d206f8a6b65a93fee51c4a88d2da8226f09092564f793b564e42ae0b10c4a3510e05fb5885909ff6b97accf5ca7fa4784957f3c78f534ee44b26ea762d2b133d826ca2a637c93869b972aa4d5c46304985fbe9f5e9969a2aa71ff64c6b8c0b840c22fe294bd5ef4ab991d7828df42086cbea04be6f09852e34a8adb77e781801cdd41b29995719707e078139f19ac86326f04ac7688f951393dc2ac913994e164920905d8a30250faacc25357c7d91e57caf451f7426cc8b678cc134b7b23908b0f96d2ce6f1b522998060f9330a5ccdde67996b30e95d3250b3ca2020d0a409d5915509cabeac64470d02ec9db21549538e0d779d230157e1ffd7a941d0a079607789534c443b9e1237c89a8e2d300a3c08df995e2022196765b4898350b08e23052f9cb196a0bb0c67506bd338fb8d39a640438db5909f1636d6755c6dd4d250b450290874ab194780266f69d3dc0a949dfa33f3ce933fd6eddc13d49d1100dd880a07456421681412f3a9aea74b350200e745792ceb173670b823b01a344f0474de0105b1cbcaea10942ded972be5c964a59b8e035c26702d3326003e2be4f6cbcc4a83028f62e15be21c80177c4cf38e460521e2a3770437d8a5cf7e4e560ed8919c0579721b77fadd6a3ad703a088e7ce4b26711b5abbcedf83480bb97b3be11d7d2c19608af57367d4fc9be5049ea44556d524b97fba79648c927ce375edf4c2cee6330902a65c3bfb79cc9be0e0a11da203d0cef6d37bcd18be7cc0ab0a348324e6d3f3667fc59a28e635a5cccdb2e3b96eed8d13b52f2640d5f6b73f6013c9b0594d7fd4a17938894ea22696a39b9a4816f5d59875c968f1da65e13a05e421e53289bb8a7847c6bd7d16d209dbae4ae4f9d029a716ad5c77e6dfad07840110cde2bec99dcca209b886d4a879f5af7b15702b4f44f252a3502439bb0f680b08ad3de779d183228c4aa47279412116f09ba4b6ddc11ddd5e05170d7a102b81ed07b81ae6190214cbb06adf91f57d485aac22e57e842d4afc3b94a90e720910df863ee311964a4425d02cea8be5c7145bfd6e2ba4b892a8444fa4910b5afee11479aff6bdba44cb4b5d437c50e7f647414f88cb283e44fb6c2f07352d6bf02cb62b01a3e5121e8a8bcf6351956d96091dfa0193b4d39de98a742ae4c023732224714a9ab84fa2345096b1e31b819825b6f8aeab476a850e4fabfdf17933ab8e559bc8e51e5cd45a9a760fe83c58667fdb684e40134fadbc6c64cbeee2ca939a12df45576fd138dda6b942833e02421c32fed37c1df3e7a79a58dad6af93ab486324baf0b2b2d4a15c3fc41c9e0bf1da7c9fab0c84de3305fbb0e16f4d60f42146343aa042baccee71f576636458d2e2e6768330f1c6489467ec4fb8daef4cda59d742ef116d724bcd4411b2d6c66cfe0bafe4a2ce92bf4e634aa19c69622da797cabf1ac484d6e11aaa443288da49cb1a42da234de86346a473e42c56bdef1eb209f35907682473620f82d3aca40f0c8a42e3ca5f083d04713914cf0d8d2129fe76414f88128612f23d0ff7483b033b3409d84bda585b9ce9f6ccf1d4708b2831af2e7479db28933de45e8d6f99a0bb0891ce97a0872498ddaa9f298a53b38d8e06d4a3394e8f56a1dfe99271f5dfaee646d73dd87af0ed4b8a026a3ed24f89f82007ca4a8939fb016814087865893a746c50101858296bdb163366bfc4bab1f9dffc62502a569fd3aa98c199279f5226a6a51229956fb9a4c5c0a838646435defd516ed22d4da9d892ff022230488bca0ddd87210b35cc3b09cf8f235eaf62d9dac210b052afd42a50270439f45232cff76ef35c32cd141035903d0023e1f6cb4b6c0382acda16a7dd2e7851113e5d3aae6d2c63dd5584f4b365e4bcee6b98b5d54ab9c5f771bb50889a10091d06f71cbc780b7ec42552db79251539bc241da419b413ccde35a1b702707c620e4071206653c5aa4f30880e7c75f6219bd8b3ce281989dfe942a0bb165a758a585521a22256f1fe3ac0a3a9ed0a7a3073f30f53b470ff6e006c6ae47b552fc6dc0b91c367fe15e3364075fec632e5e063944efeb21ee6c9d0352b71a8736fe9c93f3e322ee92cad65dec6cfe721c48dc74e92f14d990111c146951b1abcd7c3e50822eeb41d79a17a35ded495be518cba0b08d577457230c69a97132314a9f75e5c6bfdbc057b58cca4083efc28cf1bc439f60feba8d65cbd06083ab200c031b76759bbd6c1ce7dc5fe2544f1821d004bf5ac6eb72cf63280bc7273b5420b2ace606fca1ae5fe272a98cd604080f6b39ece5f9625726cc97c32e11efd9653f05bedc44fbfabf687825e3de3f70701e4a65bc963cd0818c5fbca32975b44df5ab5324930a0ab71f06f07b3059d79c0c02297345ed48515ae07b4d4232bca937fcd4a15065ca8ebb77e224f7cc360d1c87fb2d9da923a582cc880ce2fc66840493412c7001ef848a84130011482cc30094ba6d3bcad50f19179258a9c3898da66acb41ac36aa8758732f21136325ae431986faa839f0c8e6b971ff3dbfcb73133c5b0276619f3f753db3c9c049b5e95212647efbbcf9f6f3d0373f639cf12293bfd5d28a2ea7809bd54a9e8c8abd454fdfb7e7b6003616cb6961c2addf9b73b417e89636da4766bbb9d58a92f92e899b7a4615a78270ed664a5cda38344c25c87a010459c2ec2d61ab2d5497f9440c3ab7308d3b3085e2c76298d066d96096dce4168ddbd47280209d588906caa14f5c4433f2679ed8a6c9ae649249e80d5d522b19a0159339b288a962bcd1c7235bcc58a01e1b40740a7b4f8e4fc61a3ab10751d9504894620cdda5379d81cdbf12f02d05062b03fd93b932fca9f4d61db84598277b39bf97d39e28a6cc75848366b03d9350b2accd2bdc5259cb5c146564ebd027191a490da3223bf10e966c769ebf65c490d1094646d1b2f5dea1cba0491c99a9ced59af1974d55860c8be8971d8ee439b117327bea221364e7ccc4f9961523459f801619e06a3d9eb65646467f6977ccc59d64453f90194ed3ab8b5f884bac94a26764e202d8671c819344c0beb92119fb2a00612cda638105febcf2f43eb518a496b3945aa26169fd498c6b6e89557a0b42ed2d9ac2b90b655bcaba350e8995c84178eb2e9ecc5f11d15a87961635225a82906f290ebeb5ea9bbd0306b7b530f416b6d85b9aa57f5af94a3a42cbd21678584c2e8cc6c3f7f256cc55bf75604de8cce4694dc3ac0b73f95c88f3696951cad6fbb9751dc7d4ae2f315ec6caabda6339716b5cb9b4e12373a995530b4508b8fcb2864bf961dec13d5bfb5ded9a5d7bd74c60dffa1af6cc3ac14e1b46e0fa4a472e27b808aa072942cb4094b8bec3613929530cc6b63bad6964475de435e5e647824f38bd208a03880d3a954f3aa6e859cb9deac45972c92f0f7baed77e47593ba5d394e8fa9895c3b4562a56452b1594b1323a5df78a79301df9fa7af6f643faf6bab59ea3507e12f7ea4cfcb11ff12f898a70c9f98d25ee4d342e67d8658ecd547e607f30927b5dbd16252964d72371475352d06fd538c90421dceb0890e22f7f460dcb10668acc36e02aa0a6419128568b8497a47b191a5b768ca286124eaa0619cb4848ad4ce84b2aa86f89a2ecd0fc6be26ce6438a3689458a538df5ce22f956f4293eb78807d6785c3dda132fc03b46b28079cf4b511eb8402a84209ba32cfec9a8ccd3e98c235e57a5cb91c3ea7541640d6172e50b243792fba7d3c240546319b7d4650eaf2207d71d170824c10a01a521b72ab1cd85ad845bf6181d9b803a9b9cc8f4e78610aca12dc68102379bebf90c933c2a5c9bee4df85b764509ade03970ddf0a25faf9a9f37be84eb8f6da83f1425b555678aa6f6f405b5afc10064c2a6e221d04880ef30e97a26f8819acf7681a03e368009ef97775503959bf8e8bffa69ff416b0179f0623af6fe15a404d879c07f16febfbcc989951d0c2ee07908155831a5a971d9dc65e80502bc68b0d44a1694f570880596f295fcdf12341c20e9a5d7abecddea0ad2256a2a0a9792664a5f2f2508ed39170d74ae6a1a3997e8e271e6ab93f5e1752ecfee7680294e3076adb57898dc41e41cb0b4edb2bd46392ebeb694763781c134ff624a7468eccebc12e16920a7440fb9dc0c6801ac4c022a9fa7953870b46439000c30c000030c30c0000aab1a21b811b21004cb2493643c048c520ee424534a32a5d283c60566236defbde26242e36242e366816a09590959091c9568420afae45cfe9854f264c141894e476ff1a472fddf619e44a3ed129266de14a2c7382461591447241acf1ff4354ebffc277040a2d1d8d4a2ac8271585c400105c3c0f18856623c93fdd31029598ee85552669c9ce279521a8e463472648a5fa1da839828231af9cad68e6cfa44451c8be8621c19b9ad21cd02872290e092acd2a28e8827a2f1b821e8c99cbd9bb41c88a8f445fbc4d36f1617380e5188d08d1115ee4986307608a6648c1442a710770a9a63dc891222195cc73288d8fe0641ccead9d25bc213042aa9b37af0d4f81b5ac848008c2b7004c294749e609ae395d6868c2d00d1879857fb839c1d997b1238fed0aa26a53c89a032f77ece0d1c7ee8d22f2c68e9eb9cc7af3303471fba9cdb4c9ce914adbb74030e3e3439b4e53211731b70eca1d530f1525e9ff8bf68061c7a68947710224a64454e122670e4a18f7f9252054d4999c660718107608187f65224a56e0ba72185efd06f384939e998f2c585d902069af1db1c7668a49b86142dab52dc601e80a30ea8eb9bb68f8c76060d2d68388c1bfe213834e870fced4fd9b95113c8489773208acc9ba9bcc41639919c42ccc943c4bfb838c10d1822f8e7626570c8a1758b21a68ea03ac10ca312e08843db2f929338cb16b777cc00071cda2841926749d3aa919211e07843275b754646486ad0980102196ee8d763e88e19090866d0d0a25080a30d8d2a0df26364d7899204c1df9821830dbd9b1c9d3bc7e9d0096380630d5d52396a4879a51a7ac9222a85dc0b2ae4892602018e34743106ab68967a314243a35237291144b3893e1f460d1a67e8327696921c3d31d66eccf81934b830c1e30338ccd0e4d3a89943c84992d2d9a28b1965e8945cb6679c454f91c7587b1b350c17d6000e323439834eca67742a6037865e74d663566418ad20317432568a0f2da7c98481f6e838c2d09ec7114a7b88736ed6781b35cc04ce1edd0038c0d05a92177c2c68ee5ee60b6d88dd612ff4d1c5e7845eaf387e179a6c41827ba60c3963940b9d10123c25d511f444b7d0c860ba2f68bd145555390187165ad17e39beb5cbce2665a10f26b2177653881039161ae9bf253be7ac9ffd2b34d2cc6473c499909db1427f21c3fb63cf55e84dcc658cc54c852ec36b8e6ece513cb553e8573dd553fc989ca952e872cea02c4513854e27c50891647a9b9840a1ddd0a9ddb1b267f5ee09cdc43c219f5ba7c8d39cd07cf8b5ca48ba73fc4b139ad81994caa8694ab687096d3ed9fc1f82b8843ec72063d852324fc8120e25742a61e77485f992933a1b1c49682cfee74345d6a6c08184464542ce179f7829c61ecde01c701ca1099ea7345f4e8b18366a84ce52582815c225aa78388ad0488f601d43c7b35ba43888d06904d19798e121b4c18268e457b39c933884d09c48e2ee23930ea5bb089c86163060c011842e520ef98f70d2fbfa0107101a656131377682ca5a25e801c70fde0d258498891cf21070f8a09170dac386c58be3a51e34faf1257a924131d6ac04346ad4a061001b000804070f7a7d0fba123e63acee3b4065cb12d43449077de690d173f5cc77f6e4a00b918338f9f231635770d0c76b99121db49690b9415ba54d5f78502231486cd087aec89dc28935683362e413ab508faf62ac914004450fc14183e66334c9124d8510cda0d11284d24153535432c9a02deba89224664ba67b0cda5c8dba123c6970d5c0a0d1682673ac631049885fd0b578d008325e447beb823e94104a87f310f49aae05fd7c4a22f2a6a9942515638d042220960107e405200f1c2c683d27c95d1f51d2c3b48ac645784715ed456d1121553c119f49456b3abca8cecfa868a466eab78cef295addb61049589bd83c4dd1c61429968c6f293f24a5683efe777cd14a8b2a29da14117367b07014cde984a4954ce396eeac10459f64675c6a0bd3f75128da9c115227271d654f0714ad7a0cb91a3a28f58cf94467ed1bd593ee8936ec5a50dda0aa132d9d68c545a487923a49c518279aa49592f0d52432f3bf894665b81c4d341f9f66f9a654e89689f692a524c27f905a1563a215d9d1f92ade251a153f436fd25aa20d4a6b8720b92c620702f430f2685851895ec52a4c96ac94a39228d1fb5e6fbc8aa051339d44af71a6cf2a79a9fc1149f49f72d896d3cb23738c44fb494ac8f9b207894e5b10c9628cef1fe3f6882e848aedfe3d39a2cf293fbe062531660835a2b94c4224a1954afac519d128956343f474c630ea22dae8793e7bd65311a46c22767df444b4192f0595f923d6621dc2744b87e8327fce962a84d3967943f46551530c52544a15a342b4496c6e2d69794b258810ad4cec389d527c109dce882f419b9644d705d167670fb324ff96924e20da6c1ded275aade73f8068c634bb99f7085d21e60f7de99ccbca338e069ffdd02495734bb5c67d68938cfc30192fe7a7143e347ab2dd920c770f8de5bc2a9aea6e92523db4d55d12d6f7cc431b747347101153b23d3cf4a3e3de715d4cc77f87fe7d377a4a9d891a353bf411359b289134430608509721c18a3a7441c6cfa5bf4295dc5f2d594187e6720ef9f9934fe450c558834103150f5831874675bcf49f9d4b5dd36b01430bf3376ca461710105dc30c1df9841e30006e07b2be4d084fd7c399ba61c5bac41e3060cf437fc53328f68cc80610219c91002269091300340032be280b5e54c97ed508995bd4a92c8ee41fd432c25a002589cc10a38b449fecebb9ec9ffa0b1e20d7dd632f1212b276cf4dcd077524973de50dbd0459324c28636726b254d158b0b28e002af85086a3c04c81abace485a36bbf5c7902a56a8a1cf19f45b6a3c13327e3540400ad0c5081e01fe19b0fb2e46f008863f09780256a4a10fd3669a7d84fe1f049c012bd0d065e52f71fa4747eb7f865ef7934f503126cb7183012bccd0c8f0f5f9df0f05ac2843a32b68d9785da9838c8d18356080c01c340854000210a8abb1c516d8012bc8d09b882bb233cb25ed91186bbee50c03e84d2023015964b1012c0e8005040e8085050af09f00f4371e0435cc05aa13568ca14f7db9e5a3c7c5c7e7095688a189f39573e7896941e75684a189339a7412228ab1b6451733b6d882cd8616326e74916d0518dab930a95246fb857eb485b9587d9e2daab2c20beda99c09fa45b39aa614208b2cd0ace84213ddc4f47985095670a159b11073f5bfddf734012558b1857eb3c6b87afc24b2838f60901ae667c878c0db905182f7973181b427418d2e3c91155ae8921e33f9b1421615f21b589185de32b4a5b2d2cf11190bfd289debe6a23a97dd2bb4962b5cb4202c0691294133b0c20a6dbb898d395c468dc154854e695fcc1c926b0515da3de93d72723d5a9931368894d9eba37b72d2698c35849ec60d1830166dac8716fa5895af9b92e84515b3d0e9fdca13f984852e556ae73d612169115da13db1b14779b63cfb934282327858a1d7cda82124097f5a94f6021e5568dbb3f3446fa98753522c2ea000a5e1418526cb494f62dffa1ba6068c9d429fd43a8685d2661d742974215ed433ad643ac3ab1e51e8c296570822a87b078d081e50e884f0d36c3f5526e6c4fa038f2734f26e6dbe659e43aac5071e4ee8c44bc53525d1167ae4d184364faa929f52c683099de8ae0ee92997e4ef96d028a5928811424e097de81826692f21469b26058f24a4f457c6102f4f48682f630e1557953a22f3048f2374414cce133a6123f42ea7f13f3a3e4e5863accd30af857b14a1f970f1f13294b48a3c11faf21494d27d5af26132844ec424b3dcd5cb439584d09984cb709eca921e61101a19fef4b46b0a10da0d5ae112b7ff411772d2a4c26a9097f0c12f78f8a08fa765c372f4760c1e3de853c7e49a7bd64a57481f3c78d0289d62e7cc27c566320f1e3be8b3c6a786d9dca2831b630dc60c1a660548826a1e3a68becb924f5096eb82470e3a9d47c798ddac972e7761c37c8d3078e0a039d914af3b990aaa278f1b74b1c4e81864e3eab5ea61833ee69ce3915554323979d4a00b22ecb6e4ece1848e7bd0a0fd20d973b57708f9931e3368c492e88919463367e92183e6b3fc86882a412778c4a009dfa52ce409315906069d381d637c92bbf94b2f683d792679b8a08f964c82ba682d7d8f470b7ab310b3a4101f45a4d683057dba04ed4dd19672a7aca273cb2f6571365a925f053a54d147cca295d1628555988abecacf7f53306cc840452fe2f1b37cd06f162da768e4c591d911ca6252a10e53b4f9334fa70c5974ec544729ba5cedc1b364592da5ec20c5219b34d11d96e941c7288e1034788a112ef1157488a28f1e22c3c94b964c06f1a023147d9410bcc57c730a8b81a2ef205a63f6ff87ac1dfc447bfa7297e5e6f8b60a7aa2cb9a72660bd7e9eb75a2b390b2964ae9612ef89ce8e29b5857e4ca3904994db41a2da998cc4a4d34729174dc2cda924e5d36a12313a86969cd969376a003139d086ae1e2c55277c5fc16326ef08c8e4bf4293762d2abe13cc89c7658a2cb95b031db9374f7ab4547251acba3df84d01f25da1c4bf3179142522c91cb49349e4b83b84471b5900c184a820e493413628e399294a8a3f48b443b594749b31832f2e490e8f7c57ab457a58ea27c44aff2514bdf62cc1b2a00c2d0e1885ee77b3f85ebaad0d188c6e25e5261043800230089e86044274f4d434cde22cefa9e348cecc8c7f0bc438722301115b6e2c65d043468c480a105927107878e4474d25c2f7fe978e1598cb1968868346913f9629578ea39c69a46a1e3109dc8b83039850788714386066c68a14501b0380016581c008b0360b1c5dfb0718226654f021937baf037c1a721bace22f3a7c629eb9c4d4347219af914b407919b446ffc868d270121daf6e49d2429f7b0231d44bb397f2b8ef6249f1935b643108dea9452b42a0b51e426c61a0c1aa84e061d8168dd3bf9c66ca96234d0a9a00310a7de98925fab28fda19d753d93914b5683410399a90d4e41871f3a33613168e8b10f6d87c9cf9a63397c8cf2a1132293568e17ca849bd7b187fe3ae560a997da0f3af4d0c41893284997d4d4958e3cb459e69b630a311ed4d7de924ea1e30eada9ee185e339ad2ddd50eadece4554b16ad3df275e8f552980e5d56ffb63ce723facc8e39b41e2d8a8c513a72685e43c45f25cd79c78a4327d1bd634ad598061d7068940825314653dc91cb073aded0c851a5c47969acce508c3537b4a9aa175af35ae94adbd0b58b550c9528133574b0a1cf19fd677472ca1b5b9ee0c6cb701a6b68adf22f8ecebca587d5d0a6d0ed73912f77ee943474a55f7310214e34f4a9f409d94acd199ad8167eb263383d9d64867ee4a71c64d439a9f1538636c4b0f0712b676c0ac9d09b3edd2b2e49452aa17b42c7189a943f89650c91634287183a193ca979765311b2290c5d588f909952a7c88e83a1bf681a22bec75ff8e417baf82673ca932f71c1f7422722bfdcf22775a149e19d47a4c8855654bb8296a43841e231168b0b28e0012ee386b9618121746ca1cd9892d8cc5d314ae8d04227c45a65091dfe52e78bd09185c654fe76c530aa314749103ab0d0785c70398bad1b93520142c7159ad30b527cf4260fc9a2830e2bb49645cec9dfb3602157855e46c9f90f11bd4b9b3aa8d0abc7cbae3927a75c66c72ee359362934a6a489dc96936c33dd123aa2d0bf9e46ad1ca63decce810e2834274c8e5c9c8c3cdf763ca10d7349986c1815c4a738a18d5b39654837d178cd0c13c361a48d8e26f4a371f4ae965e994eee0b3a98d0a50cd3d99916be42dbb1843e87a4c81d3aae828e6a91603c09481d3a94d05be59479a5827e5015f2858e2474aaa5aa2d45093ab7c60c0a1d48e8cc737c0c0de5eb39e8088d67ce8e5f29dca36b4450c36cf1358cd0eb64193d9ebaca424711da52ddef1e3f11ba7c22a8324d95732a4ede860d835de8184297657b23f68aca2cc252860e21749144cabd2ebaa3044f4710dab914647cb51408cd65edd3d1ea3132257fd04e1829639e233e68a355ec0d1139da3ef6a0136722b435887606ad83078d4e3e17155274935359a063074dea242227e5338c0eb1c340870e9a134b176de28e1c744147eff78ed172651263ad58070e3aa922e5830565a542528cb5b31acf85161f030608ee1ed071832e2cf2a5f027345ed63774d8a035614af9e924b64b8b6ad0ea466df30fa7693aa141a334b257d4ee2c1d3383f6df3fe3dc930a292c83def2c9f2f9242c870bc62029c2c46845d4500b1d3068535ee7c841c8f75513ade3054d4c9ac3e8d39e0968d4e0c205cd47fc97ef907e612f2748ffa7a3055c74b00019636adc30416371002c0e008363155d8a9ff5f85e21b58b54d1850f162e267fa79813182eb63881994016599cc0705152d128d794234a45082ada8a49f5cfb475f4e8778acc3a3e6328e59ba299e09fa524b7fcc54d29faf45242e50933293a9fbf7c6d6a2aa7d151b42b792be46a98583045d1aa9838cf2d85a2cf563abb4599d0e021a06825869645ca9dbd165c7471012c26f0002c94c0f189dd2aa92415661eba61056491c5095e0462e0f0441fa7d282ce3b2f42765de0e844734a9b98092329c7bc5f143838d1a7e86a3a893c6542e85cc8b8b18936a78fc8c93363e0d044a74db73b59aac0c051b8a89db7735a3ae3b990800d2e64dcb0020726ba70e22aa6099d06eac2c625daaa1617d5a54a6ce8dc4896e874a8eacba3b3c2e4b059c9d445a109de1174de310da331147a8f39e760f99127b421678f4b41e51f0d2a4e68f362b9846839420853131a117d3c84dc5b1abd6542efd1f285cb5af293e72ca1cfae962839688a7352421be35a8ea163925b21e2a28b1b7b45127aad18d961d62b90d06c6ab618ae42769ee5088d0e31dba329d772548dd0697f132fb92fc7b5b8086da6a472e14d25429b731c93972188cb6c1942a32a755cd0a74c44890aa1ed55b31824c4d0bf051050822b82d07f705f09410f84f67be385251da7c4647fd0bcacc8f124aa926a890fbabe92593288143572a4078da43efd29767ef03379d0786508b2c327615eda416f9974d4f2cbe9a04b49bc68674df2939f83e6ca25e50b51ada406bbc041977a2f868f15b1acbf41bb1d936b9ccc67b16283ce52d2961c4abce7500dda54218504b19c4b756890aae4d88d13f119b4b1b9fa344ccc11b22883366b4ef0ecf1c7a0dd885f325ae3258eee0a1834b92da64fdc0d534bb9e2058d283915cd4c77850b5a5f794b315808f5d05ed1823e53d42a17cb5dc18246c68fc998a4584ec155b4a3352f972ca9a24f5611635f2e13715452d16e771891256aa868e49555c98a9d53f44967cd905699293aa1bd335c58c512ad97a24bde23ae42e79159448a46c8aaa88e6553e22da3e8f36263538594204b51f4fba362b8d8149355151b7c84a20b95347ee62c07f340d1e7de10a2941cd78f538cb5117c7ea2c932fae26faa19b28ab16723780b940f4fb4225e3226af76a2edd60bc9c3cd186b053f38d1a758c695950e1b4f63c3c6bb17800b0301de445fe14d49700f4d214d7415c388edeb1c39aec9fdc84423b64c46bb6a4eb2472098f15a10fdc044eb3f736e32455a6eca8c12d0982182195d7c5c624fcfa05966296a894a98e08312bd78859015cb7e4ca217f5ee9ce09d64583a81077c4862c929525c3dd9caf944a288a9264765d31143e24e2a89a4539b6810298fb852929c294b85ab8e30c34bd61ca2d63fb246206736a5550ce61523bcaedc91492a7efe5ca9f1376410181f8bb80f45dc4722ee0311f77188fb30c47d14e23e08711f83b80f41dc4720ee0310f7f187fbf0c37df4e13ef8701f7bb80f3ddc471eee030ff77187fbb0c37dd4e13ee8701f73b80f39dc471cee030ef7f186fb70c37db4e13ed8701f6bb80f35dc471aee030df77186cba2041f66685be63fa624f331d6b630376cb0053eca6087cc157398a7a9c807199aec1f2108551173b8fc3106b466650d22c74a1e2747fe430cc879d0d6951e5cdec04718c8bf1d64f0d279e3474f031f60f8e4578cf2b3959b143ebe701f5eb88f2edc0717ee630bb7840f2df451c34e1825de4716cc9e99d8197f60a1bf1c94906a651d4fba1f57e8c5ac622cd3a1fbb0827f54a14df9b954fc8a61fdaf2d3ea8d0688b7e7dc9658c35cd220bbcc3c714dad29e73d031e5a5d09ef2500f9f8d421b474f0c722ab8c7f5a1d0893f0f4a460ca5c48c9ed09cc506255d2734325a991f596f42f3169bc7727e98d0885ae887c75ab5c74be863fd84882107b350294ae8b3bf85c9122b75bd4d426b255276ab8e897814098d329d9877e3e6dc348fd0b985d8782d22e7196284f6943caf08cd27992928ad989eb5fa2042bf22b44789592e7fd2f9e16308ed99588b39eb5032ce0f2134f1d4cb62444d4bb8cedaf01184be4b52aba76992604a448c00076008e00c1f4068c464122973c69ef614184df8f84113e592cc5a458b493133277cf8a0c9154fa49431d8835e644af95b6724264feee183075d3c93d76831674a922478f8d8411f42666ab37c2fddd4870e2c8b8f1cf479b488cb4a2afe2ae40e1f38e8d37a25e50e62e4fb738346c644fd245ae134646ef8b0411fe365d233dd416ba6b4e1a3067ddcec9d30b162347cd0a08f599272c51413010ec090f13183ae735e7ad23339c3870c1a2156112e3e62d0a9aef89035061184b720f880416bc282aeeca8a01f83e4101f2fe8245e261327161750400d00fce1c305ed66f62ea5e2aba63a2d68ff63492c53caaf2405a3bc16e72b70a0f86041a3bd4bc83719efd09b55b49d31853ff5a82adadc34edd0bf165e2706821a0570800db3803bb3aaf1316c187b84472afad425234b631eb3725d860d730e15fd6ac754d1d3539c8729ba0e538b7022c70c4bd1882a2132a8927912181b6818f02045db5956e53fc8b7dc1b8c9f21638bb582c728fabc243e650eddab5cea420b1a366094c069c0d0420b1922581345ef1a840779d9c558b3b1048f507426a2bf1fa213648ac4585363820728daf56bddd38c49f464c3c4e0028661c1e3139d0e1e3d844d3d0de1e189468f45d3dd9311b3165d834727da8e97ac99548a060f4eb4e174628519b19ddfd944bbdf23e3e7bca3a4f79ae84c4e25df38d5e09189d67304d1b9ac212b7c30d18886ad205153ca25ba9c4c2396e82d864a71326a9a73f7824725da10f334e6cd9bad735ea14463c12c665149164b2f57f098449b713575827996784d0c0f4934f13b97b8d41d5167f788445722774b9cc5f4b27c7ec003126df20d9e3f36e6a062326f1814c8d0c294f3784497332289e4ff150f47b4fd293d45e2ecd188368c4eaa535c1791cff460441bb2cf72484c3993f211862ea24fba255425f11fb6afcb387828a2913ddb9783ff9612d15528cfd42d250c32070f4474b2b3963e99d9b443f8106d7e1ecf187574274d6a8387213a9d703dc14256a70cf10d1e85e852ab96ab574ed3202644b31a31454648e2721a1d44fbf9d33a964a21e6948268accd45fba8b062d193048f40b4f172ec93632283525a247800a2173d39df5953c63ffd432734757258b6580b1e7ee8ff44c83041eb04d5c93e3429ef088f3039e466950fe8e7d021bf6fc7058f3db46faa5a4b08a9f922d743f31b3c5f2bc62c78e4a135ffca272b67b764663cf0d0c970c1e4a83037e071873645538cd6f9ab91b33478d8a1f318c6f2b2eccf65609ca0cea30efd7b52ee22c22fb227508b81071d3acd122e625baf794ff60c1e73e874c6bcd27a26cba1112694dc0bfa3544ecc4a1d7244b4732f90c1d11c0030e9d7ba67685860897fc3734fa738af5f5fc9e8f71431b4c997eebd8b4a1cfe4be33f3153359c386b6c4f8248b96a39f45d7d0c885d8c8eb49659ca81afad829263557d3d0898c7ef2aaf3440f130d9daa201a46b7e40c1e6668bdbd4c534ec28312923234da2ce90d29e4e01f2183e5b17f6a96ba31f467a92b7f0a323134e6175f238919cf95f208436fbafa829216d7830718da141d553b973c2572ebf185de524609334de2b1f284050f1bf7ff348f2e34d922c738a7123b44c6830bbd27139d6554df7bb2850e58b0a06b0ba7db7592f4cee62ada5142bd3fc6fc99b02aba503a5b262525a9683e6a668c264245232687508fa64fa589a7e8c7c375b40edd98f3a6e8e256851e4b292c91a273f6ad8e149df8044b263f368ade228a9e8eb124f3a2ff1a346ed8b80070e18528c8e133e50999473450aae045283a656e41544aef0c1573a0682624311a624c86c98f0434608060868cc287179fe84c5ea7a07c339aaad213ade8e0fea792531297ea44179e936e4ffc1045cfbb87179c6844969f8f29a7a6f092179b68c474e42da04b78a1892e430ef39e696161549968b68299b675b0147c9479788189de24965b3cf1fc20df4b34f2cd52caa0377e2a19c1c30b4b34a2e38a0eadee5129568946a610fff44c4c923bb2c30b4af41652f582efe6eaf062128dc9a434e4de143a278d245a33f92d124d48326685522acbc3874497412d7e45490b9f9847743aa88a93b2481cd1c7043dbf419ae8f0a211ad0709594ccfc9458f19d185092252de2b2d9eea227ad571cba656baa46e780e2f14d1b787e4a9734f0a32c513d1a6c6ace4a02f882843fef110edfaef95885c2968f80cd128cf8ef2d9a27ac89a22871785e883689efdd3ffe77d21446b1a8472d3b9e4e9e7717831882e85b4a8be162b59a80cd827bc104497298b46cea5fdd4c381e8f3c9bc41c86f901c1f40347944c82571312fc6fed08e56cd661a7265220787177ee8e224cfea79cf73bcdbe2451f9a5f8917de6385561086d5bde043a7215f8fd29ba24d78b1871b2ff4d04539693a67075fe4a113c94c5e2a599d459e78e894d21264a70999afb73b14d4b243e42b931d7af1989e538a715355b40e9db766bd1c83f9861774e8fa54d2f9f26fad3bcfa19fb029f29c8e1047a5e4d0e596ed8f123ce48f571cda8e1613a225fda427028726551041e53391347bf48676b3e2659f0e1e2f4ac40d2fdcd0558a624967e4f833216d6894ca1651952fa2278d0d48e3c51a1a114df93c3db6c32c3574f95722a760691ada889353e9cf19ef41090ded6c6cee28992d3ce46d787186beb5aad54c28d15e98a1eb947abc53c98e0d2fcad0e6d6c831785f8e53990c9d32311d534f09770d1a435f22655a78363d152362684bb806553a05f119a32fc2d0848d22fca2e6c0d0752c2d5abe2735bcf8425bd9d92c92d6a4624c67340e5e78a1f79339c1b2c4a9fca62e7499e1f91d4e5710a343800b2e34eb723a29e1766ae1c516d8fdd44e16fe4bf783175a68945222714588d065e65916ba94d344aaa99ffe3c81617682788185beb4babb87ef67b56901581c000b051c0001072857e8c5f4a8d4abcc72252b3417735e113ae7203aa60aada9a6e8d4aaca9541546892697bd01c255246d114da0c22ee9ae7cd2d2129f4d9ca2526a535554d1e8526954aaa94f956148f43a1d132395589d84d113e4f6844081531730c4128df38a1532a8a9ece163c59c634a131b198632b9c52cac44ce84446082ffa71da92ca121a992da3938e1625345283c49d2841e55169129a91f90d493444421f256ac6182df3e208cd46c99a63d0f80b2237421fda5206a51b165d3459647145e8e322767569d341df4284fe3f99d4cf9a53b0aa1660835f0ca1ed8f3fe19f545a28a9103a15164967f1fefd3883d09865f86cd022101ad9d3783298dea41ef3e207ed58c58567ec1074a967e3850ffa682aa5a9ce98d3f0a2075d88f2a7c5adba24a5141e741123c89704a17496cceea0117aaa59935faafecf0c22bcd0419f24c868a19363237762ac95e0674cc072042f72d0a712a782be6af6cb9704e1050e9a6831334f4ab820d94520bcb841ea49cc660ea224bcb0411b735a8cd3105283d6625f461d0bd1a04bfa438366b8062f66d0cf66af9808c601b0b800125ec8a0724b357913f7bc884117f42de7cdfb23f75a187432948c5d8d15d33f9583172fe86298129e392b2639a446dbf0c10b17b4af17f4629e7e581f5bd09a28ed2a79f39c67be83172cd862f04f7e29b6abe853e51083b28ea9a2f718929b8a66e2c83c5a434b3b86a0a2d7532a7a8e213e45234e5e8ec77769519aa289a263e625a6d6a9548a4e46cb3e29f6a4e872fae4d310a551349732bf8fe92051f441455792ce88cbed0945df2ee2b3e2f787181750b41d9373c790df6210eb27baf8b3aba761f544172a08511d2984cc32e944ab21c4f0304fa2cf829ce8446b86902fbe894e84f829638eca72a226dad321598488e9868c195d6400055764a2f38ed91eb73b272813269ad46be2e46588534176893e567e082a714bb4964a5336ef55895573d23c2f0f314c09f73ca8d09337a47e127cc5371d3d8ac6a091443b6f1ec4547948b822127dcea455767488d26cb3c822d52041aa410264cbbc1a36b6085740a26df1de7c5793abaef0e08a4734333262b0181f255a7785239aa47be73cff46741dbf3fe9dcca231ac4885e52c9474fba63a45862ac694183c6511a5cb1882ec35a758aa01d4bc815d18c6491ffab62221abd6d16323488685288658ff177936ecf21ba8a79325ece72b2626388365d4efb256bc9dd0bd1e759d5f890e3e7728910fd68a5cf6abea8eaf120dadcf92b5490b120da8e8f2b297edd276803d149cf3f2a5f8e00a2df3e4da592c53f742975c6affc9f1f3ab3743d65ae33e7f93e34b219234f2ec929cfe34327744d6759937c39337be8f304bd9f57d183295a439687564353afe9666f034616593c2ac1157868535885dcb3a97468718b2beed08f2aff97fdc915a322e30a3b18576525659c822bead076c7d417ac64869e243a34d1ad93d4581637cb3e8756b3b724d929cd774d3974e2e486889f3bbc879038b4f135a3766ef10a38b4eb4155562e778cf7ae78439b734de5690ddf94d52bdcd08a8a6a9d3afbc957b4a193a031546e101bfa60163646be3bac4aec5cb186be2559b05c625383f1437c3f8f9a86360591bb6f794d7690a0a179d5f8b97aea325b3a43ff25ceda4b5e0ad19d193a134ae9c850a532b4e96241f74e86f6354e089a7268ef44c7d07b07718aa18d19cd4334193a8f8784a12ba1fe6a2a7bd8c1d06e47798d1df50b5d9ae9cd4dbe5fe1853692de8eabf0232585bbd05ff635139bfbaf94b8d0c989a95210e116da497e2d26628c20bed14263a2ba4277b99c1e4b167a8d3dcd11540c169a105d2f8f482e1f22ec812baed0b66c676afdadd024212965f870159ae82a32c6d7911397a3429b339ff0f98ea7d0eec9f8db65b262aa9242133537c4f6bc068cb9a874d1e561612c0e87c371180741088a8c0fc3130000000c1a15c7e2b078308c3369fb1400035132285034281822221a1e188c05a3a038100602434140300c068301c160602446743c8a871f071cee47b916901b6c442f1b767e7c4eef0639c903e47bf8f12e077263fa68da0f27e406775d71c091d91f37ff4ddae645f5e3466e53486121a49a1b303cbb2b0fce3446178ec1b96b8fdb5b09d43ad8b3c1918bf86c2093dc62f69d1ab1175a1ff7fb086c5c9eb6a4aca8d8d5356872a97bb582bdb008a5dced554494bdb4154d320fb4e8023107c8d1666efbef91c4ec69a0c51469496341775bf081f2e1034342e63ae991b2826b5498908a2d9e196215d63c3affad86d4818d957802c70095c89f3470a777d86fc58435aec0bbc041db0d39849349ec48c79d0690270251e68eaed547ce16b90ab22e65d84491e0909b177109f7bbd3f6152552905249ba9b047666536f1337eac42891fcb4630c42b8fd263283a066ee2d160fa481d75e2834d3b8e230b04b091d72a9f60ecb8c274431502b9f320175d202a2fe230afe14ae2228824e083f261a76171c004c827ab89b150dda0b377c03c2f10e20ee99459a03f150e52dff5b6c274527753f3f7d47957248e9447ca65deb56a76fcf09e90a55061892e5f523a5e69e1b1b850a3d5c648c86c9ea653ca62d9cd9f40e9b0dde4f9bbcc30921d67da5adde17092b75934abe033c976fbaf7672d53734c3f96444e54c0fbbe37ebd28d1d5d7d8134e6a60eb2b32dc613cf6119648b9faee935c1f29d5a1581c7c720b0c9cdd1aac897c4f4c630b03f687fc8d1932b9bb56e5903b7d7c095c223c1525241b2fd80718e0aa5dafbe55cd6717e14f8f2c29d43936720a8c7d7ce963c2c8449b9f9092b675980423602c64cee3003bfc3c93f9730f43345edd2492ec301fd0ee5437ef6ea88888bff74fde39557ed788e19cb7720dc6eb4236c4daf57fc97b7a06dc427fc4459961534ab0143bbac8862f3a6dc939d682de27c6ef4e5b33f595861ebea16a5522bf8f25ac51bafb3d8c1b1f4c5ac298d2990710f8f42490112148a5c6cc64de41d549c0236156c1fad8b0342612cb236e247b9dc838e9e9b1b537924a09ce6a56aefb444050eaffe51608c2e9c7a1d351e5594ff7686da548144585472bc09e28a3056a6d45f9ba22a5ebcdf89aa489a3841a0866401577c23d39003902b8a27803454bdcec69c0ee4e78196b0b07245410a51f30ac15d6efc0e1abb44397026d4743069a771459dccdb4e1552cc35c491b252d5c3fcc967e44087c1dc8f7b72c913262f355071add30efaf7215f53a0d8c68b4e560994dd2b4c3801e502ccf79a51fb711495c8043b3e7f465b0f7a5e1328a8c208923747b412a5055c616c4a6414179144492bb1083dc48982106f23d6cbc57ada2935d79ee17c0054d84f12542d08bda3ab16166e4830279985f54f0cc1a93030849241883be5b5bf4caedcbef6cd59966aed0e8aa6dd6776847c5d2e0ad14d62e3234803fd88f4b0e06d7e2926c12a9073362195c4f708ccc7ca12b7b924d48ae1f117c20d39a5c827a66bbc608d4985250adfc84c440470d81c849ae96ed07e716ac6450b31f8df39af206a4e71e9c27db381a608a78f05f11975fdae56158298e7b88e26c18c698294f8ad92f9986015f6dfe69d55d2e09ec90f2418f115460d289733c2ef7f39826aaa384bb0b4cff083816928189676f536b37172a1b0778cb3c990c2b36175b0f9b058581fb0b10a7784dea6026bc1651a430e12633f34d219401b1ef7716fff5c1864f3b6aad7428ff8edc001310aff13779af7a94f191cfdcd0042c9ababe8d2c55085e62130792654902262701c248778070b27324c65a995740d3b2d5089f55061e59297334100a6245c33ced22769c7f5b8b8888c5842d132fe19ac98b193f64a7f2260ec750ad8bcc992454d58b29d74c3c8ff09b21a9fb3ff5b5e6ef98de4ae5c56a5a5248e83e32344564434abb2254a9facbc884064b628e7729de8809a40fc3ca6678add62e9f090fba0240fd139e1d78c9878903e5433928eaed234fc294975258d762d6ba70ab1908433b90bf35412bd4c626af936c7c2d233209f9b951bbaf28cb70c49807276798a03cc58f773343b1f4071e5c4a8ce367ba695f02884c85c516dac4021597beb0c18d4e3c4902d488a9e76d5d92842104923552e50a0bb423cc078767651b7af77ea989393a67f2130dfd97e38f73f7506ce27d57677e3c4b688d5c8d37f3b7df48227871c81e278771fa4e120180d2980f1c127843e11fec1454bd26be345214fe35a71af51cd3ac7891655d569a41bfc590b6ae6617ffe1a99da18680923ec57e12f75e63b9285fc5d4672c032aada718cca4aee8c830a67a0e0f175a1c17bf689580ff9588a1c6709048380312e0842e0fed37bc0b846805562655327b76acefa2bbd383b4d7b0e72044882caf4806cea211c393fe4625fb42ce504e86035b3d258cf0f4b1a89b9618bb06d599f90755858fc3cf775d41c6fe164ca69f7466435e819171686d4cb1f66c2a736c0ea3e7172e783cd71de109bba952aacbe16e148b361e5974a86ee6e4258176be7183588f9ff4ccc6f5e9b1a989b8b8ffb189e203b9d4694b606c055eaa3e4ece2074a7c963cc77e0625a806c8af3092a15789821a79979d3fcf6b7ccd8e00f375c130790e1ab7bb5a829c385b82c71bef9b8b00a042633d38bddb56281f68a2a7dbd909313db7ae4a42fb11a8b0908a2bff089605e6bacc79722cc84a5fcc34e5e75a7ac963162456b6e2f9b1dc6b8ce8a5b942ef55faea5ebdab665b7a3fe92b944f9775864fbfe84951a79ca9189aa57f7e387f6e31084db2ff51f2cc030ebb9d2bf14db84292d3c9740b079b0d47de2c06ac52ee9309a3fda4c08635aa722a81c5ab630189167c71efc0e355a7146e6150ee629d9c0142be4c13f8f0090d4685f2cd1f6f87ef30e9ca4601ace9d5cd4500994d9f30604e2cfc29a532d8311319e3c4f820bc0689048bf797f7d8307611acbe8d9e08eaf133e321628fc57e9e6d9284ca1a1b1404d0a81d8c09178fe84c79c0d21ee297894a39ed71ff5ca22236bcd038239a36f51a9f0b0ff39c3532b820820dc212d57364553f429747bc2c332777f7d3dee5a8cc940ddcd77c50e666326bde837e80ce87a680e6cacc3503c355c52fc48759499803ab0bc2b52dbc2391dde2b7c4c306ec6f668e5b937ceeb29e2d2955b56413c8a34588c0ee32b70ce99a60570497bd275a0b74a491bc967d93b9e354886c360c4bb694b5a229fc89b2c2f684c5293de12f2fc355481d23d9dc584e664e1f20ddac651c5dce99e1383d70ca0ccaad3645d8a0e5c95051bfa0cfc70168daa78150e60bb659e8865ea852aeb31008d09ddc1c4672cc83de0ab15f7e4e306cd213b4088f0a1bb9cf83bed02bcec16fe7d08ca3955d3e8f1ce84990626e2732a9d0e6d6a0324f6aeaf16362b655c0690e939fca1ff9db9c18ad3d2564c26b5bd5c843c6227a25951d84ef1bb349731c5a542df2d05f4a7ee5011d93b4ad00cf4a8f7c44af2da89e183caf1a6d669e5007a92294bcc85794ce8d6ad98b66364629e4c25c2a896f3e8bccbc96ababf43a1c127572ac98ed826a63a54161b834bf1f7636465e993193d03c29678e668584ee3bb407ba06e1e49164bc51ed3fb4f1602b16d43b1249cfd78560a51364a7867741a04f86d308389ec3e70fc92abcbba1b7782f9d1a07aee5efde24ae6203d4840113eea090e8007aab94117d536e781adda30c2c8867800ed540ff7067aa8ca6bb3503cdcbe8f46cf78f5457ce267e75319011ce70ddef9953f366def49affc6e5acdc9a55b94b5e3c4de21ac71d903d834467fba526299a93d053430cb2abbff0a7a759d942b8256fa327f52c061fedd76d8b4a0b6944cd6de1239c96ba1421e0390296037cf1dafd4910102def3682210fe2f20950b8d774cdaad99a65fae1eaeb5a46a57c3d059b60c375f166b77ca53265c0eabaa6595116c8051b400deb7bed66d942659e81e54824eacfbad11a4b354c913063804608441d3b8ceeb53375035f7e29c83f0c735469c2bd21c8dc7374664084b7008ee85fa1ffc2f69c07a372e634a896eccdd06f7611e80bec33d053a103ede0e30fcf9d514cf9c02bd8063d4afb8cfc5837611dbb4593b1d44a0dfc689a20e34756ee8ad0ed2e24970990c90ea5b4fef4250b1a77974ffc3fce234dc0f2e899eebd0fc931a45390f940c639cc11710f1d1d31527b153aeef038883352d836f518330aaf6cb9f749e3ec084b87eacc430e37e6ce9b2d5942000ba41485d980683048d9f7fcb9362613a3514925823b6656f43b75f30fc7524af7a1e7745d837cd0ab5593dd31b17013bd8eb44239ef2e1b070f11b39d0ace00e93b2136cec66ef4407cf7cfbaed81ffeb37a8ed46854b0ef04fe69f5ff05a2e6fa2dca86636fd5edc1386179a2f0d83b2f8c64971afea9e6ee32b0166654a6f2ec4126121aa4da0a3d2870caa97ee5ff5547da89e6abddaa68e0c417faa26ab6668a37ba9b00c7bd769fe1bac78e8d98f8a30da19064d7547b7857ebfbae4b12bdefdefdce50ac85f40d2c201d4d65f86f7733a51f961ef7faa7fef0a232a9d661e24537147b6a1db5fce7fcb2e11dd6fd702337d01b155a2a62681261be20a0cb8487a18cc86d58a174c24cbd31b6456970bd2dbf932c07fc1a9d580a11e31c348774f523aa0c5914339724730f7add2fbc8bee88a800c4078fb6f85fc0e4855c99a6491fcb13dd082f4f0cde891460e9514ed8d00d45c780c2d83f4fb24c37e4e6b28e5a9fc1513441cc02c9718c32eac769e77f86d6eff9efc87e5a09c9d075526b1a490de7262be29fd5532e82d4a715130db0cffbeccdc5ef25f88705d4f36d1b81d2186a4f602267358f5467d899404faee01a2436cba0ea5b5200e137bea5d16fd6a056a0a75f1148b1c310ab014835344af441861a23b68001c1878786678996466761b6f4a1a24a03229723337b697742681c693bd8750848011735321439080645e4a0dadd02c7d58a4d4c42315400c149ba4718941bda07cc0f3b31a85520003de2d93e2c0d8ecfb4a24d819290738a3209e5f4ae471b030b9e1125989051d5249c1b8c179b1765e286e177868ba0e8e14a9525ae89f9f7c877b056d444d9bdb55cb450b50e3a2c1c09fed11fdd11f07c81937077c4333902c529898b3ec93d5136a30f7099a582a229eb5984c584d1b3657aa5da3597cc69d5f6801beb51578807ecddf7bb82abb4cba2ae742ae5689aceeaa1172965c81c13f21f5fd0ab7c4ad1c9a827d72e2e5ed29cffa768871eddfdbd995f835c5ab4311a56635c768a1f2b6d7595bd138a409d2cfa4362885998711f1230d78c45ec339578dbc99f8e3791f3f02a46f6157781954081f6f154992b775cb5e306891e0a580d07a500949a6d17e05abc886c498a693bd24220dfcd71d47e2aae65ba4d6dab19fbd26a48d42cb4989bb580c84e436446b1ac2093185a3d64ea59b98e9889a499b6ccd5a73553079ca36d2fd5e7ead74a753356165c1de07b7828dd64ed5d8c8b5a50177f8a46e8d9f5b96388c6116dde1c11d8b8f464b92893e4faa3aa2d30b0b79479758c1f6d410909b61c4db943cb37b06c94809dd4bee2c4c0b3f58100145572aace4bbebf29d9d784ee692adcddab02a8277701cec5b784a5029ff9fb9ccbcbb7000bdc73020bd16ad90ebbc0f73df2e359f1a35e7f55371b944baec8b4f260d15fe12a4907bfece9db9f2c20c9cec1f626aa56478c5e3a04c3a2da4850bca4758a254465f01b7a025bd3310981ce538dc535d4d8b65a2b683ce6fc0be909cf33eb599a1c3c243a9fbe24de262df15842588a3c70e05aa6171a32791e03240635e654395a51a82519047fbd921b0c954ba239a42751f2d586645576af35c1f1f81d4f71801e6cf14504fae01c97349521e52be37523596e09db19e4c895566c7d9b5cf1eb6e25c52a4ee44a42df0d7d182664da05b0b22d2207ddb0b06cf0f86e6812b2ccc7f1a031d749589887d6ee3d7dc19331bef157ad6a7ef68088243a3e79c6b2e12d2f290490b679fe7c5363cd58c94f3feeb39515d0d5c1e68001759d0714f3c52d084d061195386fd8730685633a000c0c6f3d6628d8d8b7bf17975960eea8f7b284ccd18e82443319f59cc0758db59008907cb23b562ba99a509034542f6aa9dd12de6f0f03785bc36cdd65e3c83b48c5bc91649ef1ac3188295df4e4a14e9f02ae046cc9384258c257ae4e46ee08a469cd70ac20b6a7d7c57708a41ead3b52835be7ae45e989ce0e1c7301b511bfe337180a4765c67fe19a32a624b1f4735a1ad6ed173d3665b6bc5e847930b49092f7a1f5751d67249dc5a0a5c6eac347b51399b750011b671b202a95614b00a08f308851cb551dad75ce69054061b25e2c8f489821f8fd64a43410443c8fe8af0efb8b448762655e660660a9eb1c171e8b36710bbf6e9cfd028b591b22714f0c4140290120e55e8db2bcc5360e581c25d1792852bb5ee9e3407e2bcbabac4e41202a7d639449eb07d70bb31f430c9f0b7550e1ae3d0230cb5815aa54fd86e4df4316ab1eda7357ff2472664f6ad28d046a7878124151ac5c750c8514d6c8e54450eaf25872b29cbb0917dbd71fdc6c70b15245de33113ad82f2ca9c8bd63b8863fd85694966332fbace8901abae817672a3728a133342df4d79507f457e731b014e34f5c5e5ea7a1527372a8956692f3e85a1d2ea30f14b22969b16cde60fb6772a4854d7c8da644f85c1e4a0b594ec78c074f06cd6425b5b389f9c7070f166105ae5d0755e67e136888788060697136b8c77a340cb94f71a8c31ddf1e22578ecd1b4baa0e460e48fc927f909158086395bc26bc0b8632e7e67685912d0860a3cb36f5c57655bba9e972d017e70b8c08a9fae904edf169890efce46250f08f8f1fda1a5bea875cd8a7419a1e08d4e6e098a488ec1cf67ab9366e5cd8f44d7c16eb872cd88a828dd0f32ff29514c56d9fc8d2e4dcdef625cc24dbf5f60fb8d408bb28a4989928c9bf8d8109b0ab5036f902c41de42bfb304dc219472116b05637d1e55bdc74d6077956170ea15a3857587b96981d4ccfed41963c1782239df90712533014231fe530b4a7f445d71373221da0bdf917e2b54b72a58025b5c95eb6124f01d8a88ee5e953b37c22909f290e8a0ac2e68450b2284cba2dbd018184c84a95429af6df0e9e8164d56a18da5e3c5472ab3ae930264b4d8d8147bc4ebf02dde82dd43c1bb49b0c6db2983cf9011a859c4f5eb2bce115c62f1fc80031e0d2e3a41db004be37a73014b288481bc81abb57de00ae3d0d894e39ed90ca61103a3d40248b2fc2c04089c86feb71c34634c9a1fb9feeaf80da562cac2d573ff67bd1a29d74df43f7cd40cd8d5c0c6fff904d4b749bbb85d5bfa4c4874ac4ac5e4a4220b7aee030c82253e5137a55c5ca8ec31d194b1fece46b3c2b61d96202d1a42aac60a66bdba5cb7d221b099ac7cbbb5d1a5d8ae6997a6e97431777a13753fe710810482baf8706c6f2a064016f275997b1abe6418533e218d76786e2e3273605652ff9ac4825a23b562ed2609340a847ab00fd7fe0682c69ffef059fb4a433fff469dee5b2c3da6c9c57c52a7534be9aebe39dfde4e0eae3b293c28649ffe4060a5f0685bee2745b61e99c383de35062da7a963f66f489111821b2b76482768bb0bd697d1c9aec16db9c41d886c7e10b0c1fd6afaef549fa287fa8202ac04127d77dc05e88307adfb1b745a8ccbb330b42501858fcc08be2ecc75f4be3df8b5ae7e833a12cb1bec8e91726332d9a406ce87d5b3f176c031857706e4db62768db81f13bc7017f95b825f5eb6b9bd0d2713297a80a3414999e7af5a1e2ca25c912d212084f6624a3d522ad169ccfaa66ec2e5e09635c40111f7abf54e639db33cb5017d73fdd88dce0cb0830ce14c42cc4245c1703bd55e17350c551a6dc9beb2a95ae8e862967a59036c7b77d4e94ed9dccc3ea549f4590eeebe42c27774a4cbc74a300e00c93f61f6e3be14eaffef2b304186e5d968a1c425c977702f3f402dd904e2c38ab1feac5b1889b27c49ee5bc07af81afe3e862cdbad00bd35d76035f4cc4582e1ef7b461ea13c0d3a35862ff36ae4e26ca8e1d36a83fe53ae59217e735f538ebdfad4f5cc773bea66f37580c906adde9377dde27f180060e093a3b247c20f2324e07ff34b4c5dfdcc887d28069cb040bb92c461afd509e246f325b9d998d440ffd9113f6b6bfed0abfeeb94c58549994dcf5f182d4613e9c94843f98b3b60d318ea3b5e029f4c8481a4529dc01741152fe5f3ab63c16620036441636bd8878d3a1e06700c85ebc75a205d98ca2c4b55622b9127d53c8089bc26d45acbe505cd7902d43c6a8e1534477548b4a2b24e2ddc17ca5144abb49c4f9dd783fe8c748d6a2060ddc5419f8dde0e5416f8994a120c39b82f762f86539f44142b405efb619ed020a84e4e4d44073a1c8555b00d012e7a8b07745b33bec16c7738158501f0a80a14119643de433036ff5841238c7a53f628267c7c62eed8c1821d89c42555352b8ec0159c9125bad3b86fc81a96e755933d2ebe201f586b7edfe014ca72e2eabddab12aca9de48a0d22603158b667ac2ebcc77c6ea027069e3edaa04da743e5048da501a056450d19c1e082e398416f21c91bb184bce99d149a70e127c68ac782de6630fb563c4eb0c6909a683d9525704244a690ac6c88a29cf6fc06b04576e7a980fcac3dac2e4ea24222416a49f06e2c97571cb8cadd1f384ccad60fcfb0f9d44748d9ce9ce8a23095adfb42f9b2f874f048632d1e68865b5269930d138f15cf13fb28273c52b7d58d197705251224a74618b93107eae95eb477a63c530c28f84ac098093b88cbd70b422a174c7e9d820abdbd13b4dd9c01108e22d51099969be4c065ea347b2340cf9976798c6adec79426ce7ec329d470a440cdc2c0157b96f81a58e9f1b631c151fc8e00abe439f47495d9a6070aab81542f86909549e495d37e01f037dd51a73cf1950b65c661ca329fa48104e2069800a645ad4fdb1c9de1a515e0ef2edb097893810dd85d2343b398bec78a119b042cc3726db3e8846dcec217f42d8440c599c0f6c0d0e85b5a31a6e3061bfdb710bff444ae03259ee612527244cf84523c7fb84fbabcb138e04a0508c2c66264c4ecf552a6361c87dc440fa4bd44fea5a8b30fcea0bdff62d2bb462163c94a88db6e928e3d8c333e32ebd36f652bae471a40fc26f4c7ec16ad09164e43df4a8b9f7e767198e640494fbc767c3a818c4637aad77c0b6a0a1187c0bbbb2e4608876203971a5c3bc536ae92d875bf74ba7ffcad4501a9dcff882ba903cefd1eceba256b5045823dfeabf46fbadbaaaa236440494bbbb118209d964df7e2016b826a821803492c0ae215be389c1f098916597fe15d6784c016c328d58906b8637b9ae9156869ed7fc5992ff5a1db63f15132d3755c2cbf871883bf0d3867d8f03e66764b785f9e43086c2121390673ba3f3f9508164a979a0fc2160c3abf317d5267721f4d9845eaf49d81ce29f3a591d8db9fa06cb8a19e4e2e534e103a7fb7a3203d12e33167a7f6c4b716f6e70dfdb3c8fc657349f92c416a7bd6f285756a0e91fd1bb3bf843fcacc055101bd9b2d5786ec84f8071a6dd653519a872fffa356e316967a94cd3e1412fbe9fc43023cb1f41b0b92ba42d9d7fd27667bcb36521161f35c855eb9468c1ea203a78d45d6f17e163a3f6930a8f3b2abb92d991ca45851c37518c32a84b6497e9d8948d97060bb2bd98d8e361f9eb8827cd43c3e81d207aa013c61b173b87caa4d8ef3f231a50f20d38195e31ab8b78de38151b4483a70e80f45a1a994f88c871203555fd9488dbb405602db3393408932be20094f84f65d9f44651d9fa8e008cb10fc3358169e12a6f3da22ad318d6ca477fa181be6d2a849a30ed43882b250e74372d4f38d92850d815e4bfb086aa643aaebeaf492ffb79055088df9c6bb9c85d5bed326632f34344defd5790d066e3ab1470117fd7ce313bc70abbb80b70143a35b81f4ed9b5c7201405959dac77449b2fe0621547408037069dce7341547b9a5e0b5db70f42b78f4db574407486ad470d4e2838bbba540c4040e6c7aae4fdddabc3956cede0ca8db3c886d4e48e2b856681b98b69edef67040d5dd21933b5935e59bc974d6d0359a1b7d30bf076602b35862a3d4417c44ec24b48d1156010e9a75cac77e73c77888563f31b0f1544e51856a0784b533d673558ed2f123a5f83cfc5ac412bbe832e90696d81d0b6e1394d4dd05fb611e44847fd951af6265d02a189b99f54410a275bdb5b008408dcfd54197760ce0071570539b6277d0db9591e99f2f215bf96e28145fb307c2e4151f44414085ad09e103b5aaf3a26d0c1d97d15ff44da25548f7801f00171189f68116c14caa0982ead57053fb69bd036efb8efd00ac298d0621a865d949a10c71be8cecb8a5e661d362c57f274d4b7456e9db9710b61f636c5fc3a6216c8cbe17b5710ea82f58a2ee6173d4b0b7b129d5583389b1ba6c5368ee25a22cdcdd062a0c23c75aada556c44fce4273f3fbd9b284b6e85ad9f7d17b35e0a9e681fd6ba53fb2010612fbe37fadf605d8bb27bc60d83030be4e58d70fc8be452e06a6f4f601b76b48d502b438b26376904a6058f5abb4113dab73e3f84c9f2ca2e2db0285375cb8e01ae25012e864c84b3e78dbac7e15da61d4488e4ca0df721ed406ce033b1e8245156a50820220b4f095212be626fb61d85afb153feecd0fddb1209b10a195830ef0cdbaffb73179446cc0087a5d5d008ef807fab3fb4b62ebbc2c259e211271803c834c943ddfb07e9d9630237b52c52ea7157d4e9157a030dea13a759f1394f247e5d460f0f002b36c1824144367243bcac6106a4294ef5c54b7b404ed821a1bc23d0f3649097e13f7aa595f8be10f1a0b0db0872c39dc02b9f4d9d3e755f9d0c3781f8bd2107d10979b064899b54f3098b4b64ba626807fd584b406f356af5d966d3ee846c72f69e1a7f883484f43a20245a353ec52a72b8b844cf2ba74956ad102891ad304948e6d51aca7dc6e624eea30f53fad9cfafe6c112d4177fa2c86e0157955198c28354be96abef237463960cf8fa8a5e7ccaefc93e641301ab3df0d01111bd487920413f4429ffebe65f97b1f28c25c9bc69038eb4731521c1c327ee227fc16b5ccb916cc237077f4efc242440b3aaeb2c616dca76c0fc9e486b0898177391d113a036153a76af1f0337fb26524aa3945c8eec31f846bcf95a01f28fb3ae9d244c54c432f0fd721426dec5be34b96f7ea5803a25527018396e1f71fe3d9e172d627249ae1a461d2c6de28e3ecfd1f72d0f22da7b3423c97054cf12646bef05a2459c1623682f0150591ec6278ea0d11c22e7aac2f2c77fc1254ad4ce14c11331d50165ac5bb823517e34d4022ea145b86f08e904417d110911dae8d4c34cbf19e06bed14abcf4018c0c0aa6594680d9adedaaacc968d2e4c404ea279b0ba3f55c0dc2131d916aa0066350d905f0bcfc0c3798500631d07e141c86d66cef60d7a4d3dcb5363301921ee9714eb1e96b640545556466870fb9a1a8bee7a3be69a258b346f40c37d9983ec15343c3011afe9d5f017fd4146ddd0a599a66b08d52508c4a068618d1c032a91caf83955ee7bde09b3174d85819b310b928b284c1d41cee93c321668b0bce26ab2da5f85b47d4172dafdef1e0cab94fd42023256f7137ca0d0bb7d4bb9474c74af5b384b45612fbd4e17d88242a892589522583c42a457310dc2922ad323af6ade89a4fabf0a03f9e63c4e31d787489c77af53c544a9b82462d11a5e42895dd91402d31b0cb2d34aa061cbf6341a9e8f27d3d5f18b67f11ec3be53550b97f90b7b67d82f27a9521db28573949655bb26ca7cc7dd7c4018610e53e3f925b31b5a0ad942df57648bb7b610e192fad1d7585c5f4a7579d155a2fd46df1186b91fd107e8cd13574a675d5cdd9e74c1882cbd5bdd752fe47ba3d9432aa66a6479d78dbd6d495a39821aaa3375662e5f6a4e415118b879c4891a09b2adcba09b0319931d263d6ee5ec24846cdfa2ea356a94f68edc150da00d88dbf6df036da6d81fe2d40d3c259d585614bf1afcf8f5b783d0bebb4602c2d78d78273050b43d240bc6a582c70775b18820ecfeb08c702e526160651778f9e61b290eb2ed81b064f9385918c01f271e1510f9d6e78c9b494287e0898d5e2c00fb1eccb1e06f529b2940af840a526af12208607ee4cc77222ad3bfabde5ccf27457f0a159aa5b6c3b113f03aba7969540137adf52d8a10b6976851728db6b93362cee979d9515d6f2a2080f159e45a3dd16b5303b51f1c8d3be35adb33e3ea305e01f91ac136cad5eabd3e47e5203b9bd7763d7f803ad65d59cf61a13b2893cf7b94570b7438cb37486fc38734a231963c32cfa2e28672a5827bafa7c6c73619d84d78978b531cf5bc2f9d512f9b3d2b9fad4288a98f8c6ba3cf6e58716c0920b00ee8a88a1326a43cb0312bc58f7951c0e129e523366abe28e27482f40fc5e4ec8046b05c0c300b261bbab275659d226522162fef396c46abc936c968c6f462b1034906eb8aed479dea56269c8c5d07633c0ab94a12833b4261066cc229c750646270f08ddcad971482ffec50a6610c0839d1dc91e0c813909b6027f683bf4e66f0580d904bdcf2d6de75c4574591789c346b64264e7a82c01e5ed11a7f22b4685ac0b69690f892347e26e19cb7454c69a15d928a095609332bbadcfc325f7b7a6162e86a7ef4f9ffaa5ffcafd0f13f24c44713f3da7bc45dacb41d9e1432faf479c919e063767f3369ba797bb34dfaf75f3f956d9830df3c90cd3b6043a45885cbd28295e1db6edaabe7911e455fa093d104c651bc4896fb0b184ac61b10e9f09f2ae1960e303e9fce56dffd7477de28a199fb6193eb2a57b4b22560a5cbb2293e67c08847a96e4f9fe17449ddc6102de5704240b3540b2a4d001ffffffffffffe725605a4231e151dbdab7b665da9749ca042f819230cac780dc29a59464d2761984d00b797b606f3b170d0be20b8e0ae5d5dc69445576c156122fc79272ce5c932ef8ad15a5475b5ae53c179cb6c91ba12b03c10597241b99c474b27ff505720bb64f27d5d70f265f9f6cc157e8aca72cedf67b4e0e20b56073a67e8ef9745af0aa9fbc63297d16dc89ce9d3e5aa632af65c1e73599b457d468d12e482c782ba539082cb89cf25e4e6ddbcfbf80bc82b516a5fd9a46617c140b3ec2f8a8157c84f1512af808e3a352f011c647a1e0a30529f8f803882bb89c429b98762738d65ac189ee3d963b765a27a2006105d7dde79ec4f3261564156c65d714936c62aae05a94249a5cd2c64e8f6105482a38fda6bb1d3d985892840a1054702546cf59526c8b51d4c929404ec19a66c7d8aea6162d17828f303e4080a3470eb661630763e4a0038829f8de35dbdccdd163b2147cde92f26ddcd027296159523042ba655dfab6a3e0a49e9c95c4749b63cc8982d14e82509663c994942643c149d131e69b89e6319a7241c1e611162ad52d557e7f3fc166d1f1a2768d3cc1e874dbb13dbe5ef0773bc1595e4be2793527597f4e7025694c9252696329b153d700d9049f8489f0a423b73c694034c176fcac62a9c4682618b7710f91fa266d00c10477426693f5b22ba5d0eb2558d331785e3aa12578d1c93bc9995e2538bb3bbff89d46e752b10184129c5d29a5e209f62412215c754c89ab69009104af962d4bcabf414d7455072091e04da9986d522a398ac88040823babb392e5a2443cedca03e411fc68ad182de69484eab6078f1c298081a92e401cc149a783da746a4cea24db08aefe93e4b163954811d10b208ce0cd57db4417f3ba00b208ee7bfcafc2a3208ae0b206cfb96a4ac58a3989e02fd735fd8877a7a6bb061044f09bfafea97b3729b1170d208760fb422bb433f977ae1882cd9f56195aa285e0f7d5a4ec9d54030821b81195337352cd20f88d22dd2459638b2e590a824d629097aa25760324107c8e6562eb68f9778ae70c4000c1798ee117db524a59a782fc81934cfad1c95cb54e80f8810ded92bedccd4afa65c306481f58db54bf9db32d08c147181f36ec864102840fac97cae972922b7f9b1c1b0906903db01574929359255d1d73103d706b2a9e9247e540f2c0a91c648c31293f8f29080f9ca0cc946d8bc91db8d396b4efb7036f920e11ea4135c9f9ab031b2c57050d1a3a306ada842ea5b5a4cfe41cf87ead13cc547bb0183970b9738df0342edaafc581d3984ca80c2d6db31a0efd9b50d76ab26b500d9037f0ab666fa9ca9298454cd20071031b33a6f1d4180469039fa1df2431e6b8d14b0e840dbc455defcdfc26c87341d6c0bf9f6c79b2e9133ac6d5c09f983da8eb9225774e4a039b3e284fa75e43c9f240d0c09752cba74c93d7691fe40c8cc97a52e9f2a4a3b6098819f8a4d42d77a53d49561148195853933746731d840cc56cb93c8aab47c6259031f0414fbceb202d1c8b3d40c4c09d947495bcd6fc39c343870e1c0777808481354f25a9a4c57c93dcc1b1d6e37e0002063ea3d567d56831ff461b3640d6e0ab34e36d8a96f305f64f3c413c087981b3d17f3177cc2706cf11438c1cbee35b60c3860d1b5d60355a32e982dab8c07bdc4ba9ea6b4927495a00d902ef19e3c68d39ea5892ca028816389934fa26abf30c2059604d5092acbc191940d4e02479a45baaaaec1a333380a4c1c61c54491d6c2cf0d9e4df0c6ea1712b650c2057e05adb4d7d2f465f0c767c0b92322bf049cc1fcf5cc221981480a0c166b490d67b4a3800a90227494acc793ff518809cc17daeacf64c55167fa3021fe47ace7b7ef9db537e0099027faa6e17444747d4480a8c923fb61583997c521d05ae73a9c92469ef126e9580070814b85056ea426b12ef35fe046ed57627f0d92a57eeb65139dddd043e9ee09a6c3c95a73d6102fb25fb86ae98eff30497c09df6249a976f206630727f94124f87c9a73ca33c0051025bbd5e824a4aa8933ca9a6ec04204960bd3c6ef9899d6d4090c0252926df937cdba40906a3f7ed4907617d2560302ad473e95c927ec1499fa4b01795e40b468a89215357922dd8df0b4eceedce4bc2d4b57e5ef063d2e66e5728a99bdf059f4d7b4428d1d7059b044fa96ec4366efab9e03f7bde642989d5ea3d2ef8cb74212d98860e22740b4e3e75179465d82539c8167c775f096a1d42ba8e6ac1eb6ed0bab9a7a6b28816ecfd9d2e2d59fb5ba25970f9d64add567a2ecf910527ccdd324cae68bf4f2cd8bc24e94f426aad7a07168c52751adf6d7f0597eee3db49f2a6979c76051bf294a4e437a97d37dd0a36ace3be2839c8a4df66059f35a698f43a7a3adaabe0cc445eee131545575a156cd709cab3eb4effc4a48255939ab265e55d491a54701d93bfdd9d49424d730a6e545dc614fc5afc3f8b9747d5a8149c90e7153dd826294c1252b037d2c4e09e3d074d26a360bb7429cf15531b2f1105df3ac2c3ff3ce8a6a1e0a287a9e4698282ab4f2725e1efad39b69f60e399ec1e4dce4d926a3dc17f8d929a1def0417df34495317cbefe4049fc23e6fa69c6e824bf2ebdbeaa69ae03599f6b4d9368d6e32c199cc9b360725263821ed5653a9e4251813cd43c99782d0a94a4bf06152544c335809469d74e209b5a95f724809be464b2ebd1d4e82539ae3e532f91dc42309defb577473ec507d72916094bcd020cf0309362db7a5dc3e82132253a889a96b4a7704fb694c67aaa42d69b4115c29dd122a9e6a9930823d95be5e3da4473517c14751e992e65814c1ad5bee4b6227117c4eb5d1d641042326a8698a7988822c7943f0976bad742eb142b0a57a53f0a8158e1d23c78d31cad881d64308af4608ce829262dee5242da7d120f88ec13e9b58e9a02712046b425b97f294dac43a0582abab20a2d54fa5c73420f8bc41fd3fa7fae441e50f6cf2be4dd3d9f526ef07fee4c874b208e58e2e630737c628638799c9c1471f785141e824dfad8a0ce203a3a349052fa57f4d4eee813bfda8fa56a94d0926217c8f327c70e313bbf1a1073e55274f4f42e53df13cf0de252aa8123ae73fc1213c0a8c18fdf78107be7544ff3593c6cdb531e3e30e9c8c294bba9c59bd0104e3c30e8c85d29cc74ae8c50b2a01cef8a8033f324fecf465b94c7cd081bd0b95479b1cdfc5c71cd8912958dde516ad9ac3b1b6bbbbabaaaaaaaa9a9999999989888888887877777777574a29a594528a999999999964350b07c08a0f39f07e6367164b5dda9de2c0694f25b70495f26c5470e04b89bc3e1def923df506ce3e27733f9197b1533730e275c2fcf2e6bf4ddbc0a99cfd723c648ad9e4d9c049f18c5d4a303154ed6be0fb46273749f37592f26a38c2471a18d3ffd3a759b2a6894103e741a6186e7255ca113a0327639ddc9636fac5136306f684df9ad6dca6af82cac008a5b4931ad1e6163764602d3ca791a6ba3130a6e45fec919618b8f5689e4374af73bfa30c32c2c0a64ad9db6a95c4be8620041d3bc0c0af8e965cf7a4f29be81a6c5fe7f6f312adcc24bfc055dae07e6d274b8edd1a1f5e602fd4a41ff56c173861f2d79574a3f3c454173eb8c0f86b4aaa4c94acda295be03d5b2ce8935e2b7c6881cd965bdcb2ece3a51d8d8f2c70a5bb4e0c95972a4a8fc2871a7cf2e09d4525213d49591a8ceea9cecdd99764530ac30716f8affa53a6e92f7c5c811d0df14cd1ad0d3aabc18715d8dcaf110b3ed0602f556e50a1c1f2fa8d632dd9c1471518992633c54ee5d95a7b220c410752227c9cc18e5c4d529eb858ce6211c20715b8cc24c6a4848812b305081f53e0dac744fec93129991b5fc68e73fac6187daaf4f890027e4481b74fabd95194e058d331c68d64c707141875c2e434d154da0ba1311e08bfe309fc2969ed26474fb89663f429627c38c1d7cb78f0d1043e9364d14d3aaf4f821213580d5dd295da30b1949c25f09b7c2b2c84c70c2e83ce266b893985e794c0291953a894629d04eee2b8063791b1118529299950274770a53c4da3498255db084ef01de569bd79ca6304a74908d1dab1b407cb22f8d8f99a4f6e8a604c3a95d39d08d6c6cd4e7f4c8f314304af26093e2a2bd8670ec1be989c9d83bed3ac2138b5ff96ecab52082e6ad44d295508c1979c97828ee7f5aaca20d83049923628a961a22408ce2cc934495220d8649ee9725797142640b09e4187bd8998a8f93f7025dd82f6fee8207c3fb02929490c154c6f507d1fd8a0c40d1af407f3e4e103ab4974ae5f329d92670f7c6df4136fd773785c0f8cfa8d1dc2cf032373ec4b39dfef36c703b74965eae62427a9dd8113bc440fa26a3bd415423de554d78131511baa6f3a7bc7d0814ba1ab2edc4a905133074ed347ef241a5395123930ba9671f39fc481512754ccd368cf4f02076e5bfd4f1cf55f3379031fc4925daa0d6d82d60de532b104d120e62256c9401b3831953d6d5b08215c36304ac7d0a393fa9d6ad7c09b949418c284263948d5c0c91cd32b9b9c3b3b9a06c6dab6d46707915945036392cefc25bac78fea19f84ae57e3a6e8977a71938b54a9681ad136f4d78ddf8956460838e9ff6a397343dda1818d7de24831aa1b44613035ffe1fb395d2c2c05d4c8b5f52478ad21918386149f6a4643e0ff2b3353825bd8eecb2374b39fb02972425c54b6db5778b7981ef52b2e5cd5b6ac3625d60ff54f433b5bf0d997181b3f49f2cfdc413add91638db55d7a444899ebc16f828b237ec6ecf04a12c70bfc1b6f383d4e0466f6dfa0e936ea1343825738e7d2c31a6c9c102d7c94a52d946c852fb1518d754c9ae4ace546a2b701fa23788495194d56830a6efd35def0733992a30fa95ab769aaedf33381dffb1d568d9dc840adc095121afea4c5f9229f4157c54a7929402278d6ed3a4b3e525330a9c6827d6df8750e052bbf692a6b35bef097c1251aef9f62a2715277072847c6dbd348171ebedbe8fbed533811b531963be04ae3f6713649514ec36834f72f4f3efc61f5509bcdd574c7ad7a104d5c4e86341069210810c20e1432418151001068f217c0f2e20f20b5ff0f00104447ad100115ef028a347f7e0e100915d4c4044170a10c945d2a1630719b85880c82d7ca0820388d80244a4162a428b1ecfe306106671230719206080882c2420120b58bc020122ae18438703445a6100115694c82a74a43172dc10438c3e6288d161a8a20222a94045182a720a536840a4142222a4b891830c10584064143b104528de0122a010438c3e0810f90404443c3101914ee42003042200c105443891229bf810d144024432818908885ca28c05885802032295e81e3acaf8c10d1e39c8008104442831890f1149808087183a74b4000322911011814422f20894e3468fe7f1001147f0f81c141069c48d1c6480e002228ce0f121b2881b5fc697e1821deca063c0011145f0488405441011019143dc90808821202052080988104205081019c402440491009140fc0e1d6114400410ec7d98f795d0233365ffc0e9947e3f68eec919227ee0a3658b08a125c5e8561fd83f5dd9adb137227ce0360615913df0eaa5d9269e943356498f317294f1832288e881f39329f697637c900736f7455113558212db8520820736df5996f45b9fa6ad3bf01dc73d5ac64cae3bb2032f1a4da9ecf697ce4d53072e9a9b6dda5237f949e8c0464fe3d164a97360d449428fb6682207eebdf7373fe5c4813f4975666e2f4fd7e1c0a5cb6257bd63edb97b03772157fddc32afaf6ee05ddb749235fb5912b6814df2c6a4154d59595547840d9c9fc8f5b513269a9488ac814f6f7b256c64226ae053733c793905edf9fe34b031b424e15779347099b34c274de29624a25e94fc129ab62666e0a4dd389e7312dc3dba65e0730e199efc36cda4950c8c4c313e062ed58534312f29064ea62cfaac378563cd129130d8d94b1ebdfa70ec8e1e641c0e11309cc81a27f28513f1c28974e144b870225b38112d9c48164e448d1349e344b070225738112b9c081a2752851339e344a87022533811299c48144e040a27f2841371c28934e1449870224b3811334e44092792841341c28504e342807121bfb8105f5c482f2e84171784905d84e8821ba9292378c1472e2e041717728b0bb1c585d4e2426881aa76878e3278d8b0f13bb061035d191f3ef81e26f8f052468f166304366c8cf13d7ab418e94c006e089905bfe2d549bae5f4d6231c9b9c2c2e24166c58a80c3a3fad2e69d10421b0e07e2bf4d76d50a258fe158c5e5eaa98973f9914ba825361a9c1c43531985f21ade0f5537bbc4a924a49920a61052709426f67fa0b268719b20a56a4f7ff855a3d72f0d041068f11249c085145319df75e5039ba584252c1c6f39354994e631f4250c19655d0491aa13a057b1bcc847865dc4c5138849882adbcd9dc2d0695a4da524829b8caff39f34449c19b8a5d9972294949291dc5d7fef77b66ddf68dffa4a2606df74db99fb926c19050b01f4fce56f289c14108284c1b1acf94e8c69c10f2094e067939ef682c4198a9ea094e9dbc9b84997854370b00d008e904db55d953f692c4746f12c209c69298596b9997092d64139c2a49cc270956a74a4e12a209de4c923b6b9398184232c19f9856a695e26a6a0e26d8fd3429fe65c956d9bd041b2c5dcc55cb12fc282ba59b4cb212fcc8ee134ac99c4daa9c126cc6f320ac44336412ac49cb2e0d3275094a5c12bc5bec32a159d53c7e91e03d9ea867c7acf28c438213d36add6a53fdbe097904275bcd4c49552945660e218ee04d122bacdc5f4ff4ee843482eb5842ffd2bbf5d91fc20846ea9569cca371e36771ac9923842c820dfa2fbd59b725136370acddd081ca144214c1a935dd295e8919774489e0346875775bc711c1d78957794d9b86d2f010ac4919b39f9ca43caa1c64b4213849895fd2d5514821f8dd347a295d73de87105c8c99453f73335732e158bb91838c360685904130bab269dbe711c7da0d1d2899102208365e98672e490c96475f061981e06c747fce111db5268400828d96d3c92e2a5208f903274992c9d7d10d1d7ee04b9b6ae7df89712f8663ed4ccd08e903eb5aa206938289d4bd7420326430060b30008f08e1037f55414fa816cf98a13df095d924f9a4248a474fd2037b2a79aeb86af2c0c692625e7db2a8f6080f6cd29cf9c4f3db92ee1db89c47975a6ccda35662073698a01a749964b0600739d218e785903a30f651735252496ff2d37708a103dba77647f68f88a82ff81d8cd138e81032877a44a7a4922466840891036b6f9a9fcce399a5fcde101207d62eaf29f9fc7f4f5edb100207b64ad05e7ea2e528b164c3c6bd81f1dc49924db2f50c216ee0a257dc94a29a98a56e481b18ad9f6b93878c39a26303671f4a54cb63513b946cd858036fe671ed848ca1cbe4d5c0494a8389d1fc4da5a03278f0c89128084983a99210fa9952ca0841033b2a8ee8568af9ae3c38d678ec3803bf9e73974edb256ad0af195851f1b2c754cab2a737870ea5414819387df30f96f2fb572e082103e7fea1fc244992a29ba00d1903a7a4876de8d339e78f3b769471121b8488817d2d29552d42e830c2c0abc9d4372656e9272b080103b756257889b1d2743338d64ac81a5c9f1c26069d6bff198463ed06215fe084ce5b62d9f63ac8af8cad41881718d330bd671ec5b176b20bec690699639ed2e2a13174f88d21ece8813208e102771b7bb3c7923a7f34e1581be3c9d071e3fd868e1e377aa0e34c0c42b6c0678e5def296830313cc4d0a1838cb5b5102d70edb14b869527070db21092053e9a98384a85924184a8c1bbc9bc33fda1d46e3e0d3e6bd5dadd43e751278008c102e7f1a4b54e31c90db343c815f82cca24d1ee55b229b51a42acc0a9abc8e83faaead4db5f84a0c1991c356fe878928b902ab0e39765aa3a8a240839c3d14970cd6baa84721042053e65cd6a952799ce497e45052153e054c537192bfd52602f45ebd726e9fc93941c42a260da1a4d197fefcd43844081d1279812fb5fe3c7bcae608d90277092e41e846f27f93b495ac147181f25208347951027b05d9be99eb34afdd9e57c10d204b68465ce499b4e62fc0e131859522fc91fd525b077fb9a2e7bdc1c6a33d833215b2c3c9f9862651711a2047693b7792e49661dddf808e3c3043d4e19680c13fc8e32788cc12624097cccf9b4e8a68d17df1482044effc4ab60fba627090583b1118fed9da9272d0718acb97b523f2a9eee925f707135f75234e30b46880a4229d1682f38a1f2657526495e70b3e05347884942895184e5b2e0939ad0d962792cd84a494ea73b2c080b4edc36bd825351df354925573026896b2a5bac35df0adea4ca9235e8a6d03e2bd8af987bc45d057b49126d73c492b4bc2ab81c69e3fd76ada25470a2ae7a922f4305a3842ed962da4fc1066582905fd929a98f29d8be36296a4c6939e69482efdf72f75cf2847948c1da9f24a764957bcb330ab6aeee7e647f76eea260b4a411e223bbf4d3a1e0ecda84890d0a4eac14969be927359f6043473fc51c6476497b820f259554c2723d844c2758bf68399b1c53f8ca0976d5549f96923f98c92638595a543da535c18f169944c63513ac9648bdec2607d1292658d392f5f45c4fcef4126c757e49c13627edd312ac29d14ebeb236796725f84abfca19ec547749097e4d6db2ae72126cbd4979f27fa54992042374a9e59f1cd31a09ce3289a6d7249ef221c169ae7e06111fc1a5edc926858ee0b582ae92a3c757af6ec4e9639adc752746f097a4c96d8269116c062b258dce310fbd2238395e6bd0a0edb3f58960f386490d11c1280b1d4a7c1d611674084e379994173a86603b75d36350217837cd27bf643b39c609c16a8be8e07b3997d020384ba164a66c19b22308563dc74c09cb9c258160e45ea709bf6492ac01c19e982429eaa14693fc8153914155a9891fb8b57f31d5fbc0fde853826995e0f7f281133dc7cc9f599398ec81f35d4dcf5eb93a7ae02f44a69990264acb3c70ba3a5ff7a74e5dc2035f415f129de48b6a7207f63cadf607d10edc09d9a17fc33af0c1d275d2dc39797b7460f3dba99dcacd81f5749564bff616ebe4c0c9f9b3a74cd3577e1c3877dd649b299d8f0a1cf8cdd831097a79031be4d9075522ee5b7103ebd76979f465a86d6d60fcfda41b99b18135c9439a9c042bd954660dec995c52033f26c95cc99306b662a5b2bc20e3ed686073d29dc4edef5efc33b061a797a4ada462c60c5cebf589769fbf1b2a03eb1a77ef4acccd9c0c9c5a5b6aad4b828919031b3f6b786609aa248f18780b3aeafba59274260c9c14b324cbed5937eb606063e78aa1c4eb0b32bd06bbdb673b965465e90b7c4e615a974fe9aebdc0094f95b4eb6777922eb031e4e86cfa5316950b7cea943665f5122b66b6c0ad85951cf45ab034369085b2013518edf9df7aa469b0fe79a3dae53325a358604f4e69d208992b704a95daf793a38a9e56e0529749df6a69949768f0ae632969933a5606abc0584a16acc32c28153c83f3d49e4c4a36dafd2554e0bcdb6b3feff59494640a6c8ec9c44605954f6d891438afdab713e2af39954481fb31b5312fae694d2550e03aa66092909a314f2a7902233f28bb98ad36582a7102a7475a3acb6902a74d4a928612967286095c7f6f12ea256ebe04eeabf4e54ecab6ca64067fc23309d5cad1bb12f85079a2728e08ad49022f329ad8614ad34f3680042e9a26b1fde482c17596a815e927880c30d8939a31e5f8a55fd12f1293a399a43fc7176c86f0a05f737ac169302928995517eae1051b2b6f4966b235c877c1a9d790594c5b4ae2ae0b46de7d2a957a2eb820af83ac125775745c704ab2982ea99099d4be05279644f7f4b72db8e47d524cb22fbac8d4826fd3aa5049acd0132d389117dca4f42cf80a3ae496892cb8984eca9d25a93a29492c5813aab67a3c58709b157437449bf8fa0abe242958746f4db193ae604377765d2c5bc1c54a3a9fd011f33cb28293630819f349a1dfe32a380d2a6626dd90297daae0d3862e6d4df3de5c2ab82ab9af26ffe9c8145430969a3da9ef148c0cbe31a594a4f698820faf247dec0a2a67a5149c7bf4cbd977f3049182d5dc189644efa05d1b05ab1f541c253a3f96a428b898e4b42685148582cd62328d8e83824d252d5bdc7d73f5139c1415152a544d096b3dc1fbdd66f3a0f4853c75e2db143dc33ccf094e0a158410d2df041bbd937e2ea9c1ced7049b6eb2a651efb14a28139c5bbd8aae933c5b1026384d292a468d95b2722ec1d8afa94e1b7a92752cc109a2eba2f4c8cf9957823bb5eedebd166dd494e0d2995d1433599ed393e0face4dae2c42e9182309f6eed269d226891b6322c156fedd58396e7a3e8104df764265f29247f0a6e498f43984769e38824b52b0a0d72bff539246b059ede946a95af22c2318353166567117c1a75cb931d99b6a5e15c166b7ba8b4ea2e3c9447029c7944dc955755d2282b7bb3515423c771a0fc15d0637f5dd9a4b0e0dc15e59a6fbe4a3f78285e0823eb1d4765d55f608c16551528c7f2a83e084d06fda84b66db40882cb933ea7ad52322c16084e965c92346a1a475a0a086e54d079d22cfd03975d3a772f46bdacd40f7c745535419918c592fac009ffb41d13f1814b4ad05f65aaea949c3df01635a5796eea981c3db02988f41332074da13cb01dfaa46793e424573c70fe224f948ed237de81bf54d2f7c44bd15cdb812d497d7dae94dca4ba0e8c6cd76fcd2769532774e0376e52c96c3407d63ba59cf2bbad9d560e7c5493fcf53a4853d938f0f1934a42af8bbfb670e0620ca53d5b2c31eafa0646af7f96249709c20781105a0543e85146050db8812d3b4fa21a63d6a4b681d31f4c836d4ecd2436b06b4a7a8d4c3ac67a0d8c0559494932a8063ecc3da9e0b934302629b1c404ad277d870646ecab3f6de50c5cf25c497e332994ccc09beeb49d4c37ed6f65602d5cab527c2d6fc9e0083b95d225c7c0470b2fc5c06dc9ec4ea71406deff32b774090c6c9f6027d7e8daacafc19a6bd226bf674fb2ff02b76a164dafe3057efd46499b67171821479ee74b311f11173859adef3ce88565ce16b8ac24499289eace25470b9c524b0f154a28ad9d2c30a2fb3928715783935dd3823a937485d2e05392b3e5acd6621a2cf0a7e3be9ddf57e0af46847e92f2a7b1adc07db0523ad768301eef63ae13e429a1a9029bb13ac52b515539c9196cd08d9594b6a766091558d5939902175764954aab6b72540a7c9f6a6bf6683e4919854cd5a6b8ee50e0b485d2eb1f747f4a3e81112543e9e0e21ef3884ee02e9d2ef13cf9773ba6095c287d9efa64ce792670596d45d34b492a69096c97eec6f0fe769119acdb8927c6246a56764ae093e4b5b9b449a59624304a8e3165d2184d4e150d20810f3a6df4495b303825698eeef5a994944260f099b39a6ad3f7d1fe829157f94bbc245ff05a3ad5e4f4824db74f952b48b79a179ca443dad788329d5d70ea84d21f425badf8bae08452352a688ea227940bae73b865961c5cf02645db6bebb7e064d478766da649a76dc1588ea75a70f13e98a756bfb40d2d38695d5f54a94c919959f0a77cfcf7960567a2376eac12e29624169c0965556ba19d1d587041287194f59fa0f17d059772941c3c6dacded4158cbec92789ba15fca5f8ad67252b3815352d4de83c9a5e05f74198f613458979e2bf830ca882cb596a5667dec1c354b0d1e47c53415430da46ef8252aff1524ec1c9dd247ce376a6e0ebeb4f32c9cf748c5d29d890596b74b7755776a4605bc55b7454302556370afed447bb0921445475a230c968d27e05a550f0b92d2b94decd577950f0a93f448d6aceb7a34f3096516ccfd553edc813ace5ab513a054f721075224bc97438c19aae98259fee7936c15fd4ea50194d3255135c554c1a54496d93f24c3026a5ea31192abb8d09c63a757916fd16847d093e5436653ad2e4785b825396d5ecd394e69b54825dd3cab4515182cf496b29299a042764776ebd25c128ebfd1a158d0417937c27a64b4830aa942428e149d0dfe323d898c4046960a3a55a292906a55a32468d0ea08153ba753736f61fea0de363c7bf20251ddb860e9c812f79ca24abeb4aea5f0e3330264564f29893a0ee6afd8801093a5006ce64055fdfb3cc1a94628851462aa66174800cec491d470925946eba14111d180397a74c2a9984122afa17031b73f6d589d067232f85e84018d8182d93a8563a4fbaa3078f1be8c9e8c323b11dcfe33cd00130b09fa35ad2a0496bb049e9a6c917477bb3e90b6cc6b42707e17b81913a76e2199a4dfcbac0daf656561471812de1ae963556c88ffd1638b1d5c4b175911638295a5443eb270b7edc9223aa1abc2851cd1b94e82978270d4e09eababdf15dd4c8b1c07b7a3ed97a474f3eb9021f5356c50c2fe51bb5026bb57e992d2d07ada0c149c173e6a06478ec5481f5ff3c194c0caa2deb33f8922342e6c91bd13154e02d594ac2627afb8b53e0539a32cf5816427952e0e4f4ce7f9208556b3151e074084f29a524739f2428f049e4a9c5759fc04951923a3dfa76c49238813dab9c0499208c1d7ce840137853b32f7dd695f46602ebda16b5da257072edf22953ea4ee8bfd88e3d74c00c33a5104de9424ae064ba9ca2e88c7b95d50e24814d3ea221345499386a0790c0a6cd4bf9319ac160fd4776141d30b85172f626215e9205fd829167f7a1349a9649d3176ce51c3af999b6ec9d5eb049a63a2965ed9a9c435e703a7ac8a4547e3779df0563c193e89719e48af274c125d5d49c718427d15472c1ad97fc16939be77d71c128d51dd4f2abaf5fec16acc5cb8b992ed8c9235b70a94dadc6df324929550b6ec5ea3de98aa753cca1059f974bfc93f6528a419f051ff452d03456ad9ed3b260f772ed4951e9e4d8492c182578ecbf689af6dc830523a39fd4b2b0bc828d9a3975499224baab36e20a5ec3f5437b641ed9b1b246186905573a5a0ef14cb382d54a1bf521ff63bacec82ab83139894e62e9bc2638a20a4ed031e6b62463a9e05b3559b6145554f0316f163dea4b497f3a051f73d49e1cfac953923505b7db49ad5f2a75425d0a4e92fbf45a5a4c52754e0a5e8310a272f4935170aa69e4888d44c1e6d89eda3c7f062b43c1a9f0204b9b6eaa7317148cbb9baebc1884cefc3ec16693ca4d10d2a386553cc1650a269394b6914e704a75ad7a12954db46c84135c3e937641fec7cbde4636c107a5bc82ed6ffecf8dc78826381d3ba67cab3927294b99e047ab255152b08c6082bbead11a533baa85914bb0716b545f2769a9a764c4127c27b17cf376d509eb2ac15beda93b59a341a8a4123cd2b1021b366cd8f81c2394602c45959cc40e117298d9e7d8d1c38c4c024724812391c01148e0c82370c41138d2081c61048e2c024714812389c01144e0c82170c4103852081c21048e0c024704812381c01140e0c81f70c40f38d2071ce1038eec0147f4802379c0113ce0c81d70c40e3852071ca1038ecc0147e4802371c01138e0c81b70c40d5cee9c64526d4238d66030d206ded389f28a99c2b136c2061c59038ea80147d2802368c0308c9c0147ccc027b128fa72929132304a8f12e3a606a955eb8b60840c6c995c32fde87a2f6d3f303206f6738b92513bc7de2431f0b12e2d2935377f531818cb9eebb3256bef1218f8adabce5e7abbb65f8391164f326db29dd4d11738b595b2427a3cad212ff0695c43553615f7425d60d386dc785d57d174b8c0be49499ddeb7c09bbceab1e4581b2c5a607f4b4e1f8df93775b2c0fd67d2e655a1e48e1aece756be94771a7cd0abfade3416b812a5769631ad273157e0456e56e0ea548eac548206a75f3d96e454810fa117dae4c954626770a249295bafa502db4999c6249f0227fd6d6d6e1e999a4a815f8bd7f6251905d642c7465a100a7ce952b267d01358ffec5a32e69cc0dae9f18b254d6053b0d8c9466ef7e598c08fd0e65951a4ffa72c816dcd7984fe9646cce0b63208e5a34bbc636944097c456f4f7e39491daf3492043634e6946a3ad5e42a8d208191b1463cc96425792818dcfbb78bed959f0a02065f4a37b7f342a9e8f905272dc8bc0d6edacde30b56fb828d364f2fd8536ba6d3e3df5a0e2ff8bebcfa6d5de1baef824b4abcfc9ec7357fae0b46bd5f8afcca9ff9ce05bf396ab40cdf24268d0bce3df66f4c52ad49fb16ac8923f4968e6f1bb3b6e06e5b949d6e6bc14517a5520c6dc17a5a7052898cd6254de4c92c18cf3726cb4a5970720a91a744180bc637f3983a1f167c5d0ad3fbb5f134f8af60f44e37c520f43683ef0ade734e5ba973b274cbb7825f513fe92959cc933d2bca2a75b3fceb57c14992204ab359c9d9d7ab827b139390395e17b429155ca74ca9e7234d7909159cdc270921ccd6a3964ec17a8ce934c9f132eb6f0a3eda077571e37f28f952f029e71a115a52b02628ff1661f904ef47c15886afe96a8a51170527646d4cca3af5d450b0aa59bfe28f8e8d08148c65ca693de59c5dfc046f253c0725a924878a275813efe486ce71dd4e27b892d57ad717723f9ce04f6e4d7ba6fd5eb309c62fea5f9e8abe37a57ec4800432f888410a3e78f4ef38c6101cd0449bf2e4a0a567821b913d9643c704bff93af52729e9757e093e2dab583e398af56d093ec42b67dd5e0976ed2e8e5ad87889127cb6ff4cd35f95e266125ce9f7586961279846125cbe53ee69349160f4a2b5c8924b734f20c15bc870db24e51cafe411fc7a9a523dad23f8a45a3e4288f43b6d23d8183bd5626a19c197588c17da728668115c294f6a66412c88aa0856b3966ccb25821364df9a922522b89464ffd8bd9ffbca4330269f0a512565999586e0c3cd32f4a7106cd6ec13bf3ec68a1282ebce2c7d5b724a171c041747687752959bbe20b8be1894b07820785d134d610282bf132147dba4a0e4ee0fece69c7e6355a1b6f3037f7a6a4afa4b1f58ed124dc91363975d50aa9e5e7490963df0963a5baeb09ce9eb81310dea9d3f79e0be468b8a9644f36d78e0e424b62539966c3ac6d01df86f53926ef7f18b1ab2039fb29f87e678c94c4375e0e27f88e8c02979aa2da39b4a953407fe2fa8a43beb63902539b01b376d2629dc4cff71e04e8c2338b0161e4c14bbcc96436f604fcebd126b64b9e9b881cf1a63bfeb06a9a6d3062ee653b2f7e8aa0e3a6ce0be369dc8faac815d7fef3f0d266c3b6ae063d42cfaa4f230514f0363e28f52258892a2316860e4c9e4267fec16d59c81f1924cccc0ab7ba9775353e16d1938254b4d0646254b621231c7c0a5ea52295de7a0741403a793d0fdf73c428f18063e37fd08edfc7e213070265df4247a6b25736bb099d762922cc912d3fb026331d967dd5b2cb13a5e6037c58e7fed79a2d5e902ef6d7b2796121ae45ce093b89b9c92aa2448b7c0985cbb9559435f3469818f5d61a562fa4c5bca02179316cd6d492e31e5d5e0d5ce2ea85f7768280dfe3b85bc134a33c60f1638f1d624edcaafc02659cca275fa49635b810f9eebbfc54683d78bd994a79827afabc0d5589f597bfdfb67309a5799a53996b4a102a79d6d41054bf79a29b026a63f9db99da2440a8c8ea2b6cabb545f130546c998f14daf759a060afc874e1fc77254d2cc13d85c52ec587ee2044e4b90953364de92264d604c9a6bbd9fdc6e2f13f8f1a0626d6a97c0df8895d60d93c15433b8cfa1258a3a6195a24ae0fcbf2ef50559dae64012f89c243dbe96bbe40d0790c0c8ac37599294547c83c165517bda1b164a99c0e0f25e9f300b3a6b98bf604fab294178aba7205fb0278f4e4ad6b1177c1293731e9399d7455ef06997e3bbb95db09e5572fed26f93e474c1c724b5a41013deefe582dbd0984345798cf9820b2e67ae4927536ec19e998ca7dd3e6e6f0b467885d46892dc36b15ab099740821ff44e7ce68c1a6730da13be5f3788ba2a804cd854204a25828108943e240000c8a6f0b00531508301848280cc4811c86d24411761480024a1e2036282216241e10102c140e120c8541613028100603026140200c0685c2c140496bcad604ca512105ba8c75b2cb4ba7aa9113c3e5a4ac2e278514a93ee58e7344760988dca5cc6894f2abc16d32d22889de86b08a6d2aa8796f1b72e6383163c3ada86ab5a25dbba25e71bf7c174d31193a2b6048166d5fbcb393055e7cc766d316fe881992a85bf3de4ccff0f7c2655b0a7d47fed1de1b79e4c8a8b20673928180a52f67ef284a277b269972dd7b99d1ab72c79cb0e46c3609fc7a1bb3e35b0aed60c0307e291ca5963fa4d6b0a12463b0b34235505204add079a04a3f6b52ec5a91bbcdb84c1deb9421e6b1186a509401d9126dfe4ef1cdbb8f47bcdca5a887d4eefa789daf62c8a6a689d6afab4dd5599a8c57c62a5c14125419d69e2a6d90320a151869cbe9d0fbc8482ccb0988602af4593cb6cbe2f752bedd1e03a2233e8f259a96796980d505248cc1bb8cb8c3cad8d14d2c25232acd14722af6d1b7acc42719486c70b9816626987acf5d2d372fa695ee3e5d856fe1e3ee5d55ec9c27302b40e335901b859aa78aca8829db8ceaaaa9937a293daf0289624f8dabe5a5b7a98c990e9d6451cc33762766885d7e19e18a00054e3c46b0c62b104637584a10e303d14b42ba4638d052e1bf1f4598648c838a7581f41745dbdd0fafdcc7bcc866d4b1439121969976d9e5e1d5288cb9be600acb709dda641d97310f18e0a03ab893d86aa122bf0c41cb193b6fa4832ca3b12564357532246323df18978d4d8e3da0e0a19c970ac48204c53bd89998c29733b25800dae29d0f5469252cad51dba20825d33a1445a7857b1fe5547563868280d3650bdcef38802ce40b8c54d05e611d1e8fbef3f416d8709de12a225661da8ff6d082d064fcefa37ceb5fbbfacfb2172caa6c24594b3d6c2bc09bb86255c6a306c0e2055c04c8780df11a09c8e3074bc0ed80e5efea4255b36adbd52e9fce5d21de86d4893b0bc6c6427bc9da1edfddb3293cf7d56aa52e280eeb48177e262e502c9bd9acfdbc50f66e69e04359c2e4662b92a16279d7729664901cce025338813e3ea5e781a53b3ada8126c451a895417e83aa7774d241f734d30ee2b1b8cf8baa211382accdf1b066276af9390c00bfa0efc6367b1bdde8a2c3d04bf2a97668cff167f007beca651ee6e8539f02c2448c41fbed0a19d122e8468b04b47e55d5debd6e7dd22101b188f8667c1500a8f1d9dea75e0357963d52aeee02939d38b8a2aaa900d9c415a603be20c5af1eb0aaf02d9d2701b150fe7287972be7cac34b3336f3138bd13d75d0cba5272182219aa1ab1d377e031ae840df88f383f13bcc825d67ee57768a36c1d5753508c7eb7770a7c526e05554ac5935552334480dec9968486d0bebaedbfa6bf7713962cf3fee3e820177bc8307eef88189f08a0def94b6bf45b9155c1a791f90f21a8b45309a86731f262e84d475b641fdd4d1b2ff446a254c3d5faaafa4226227d60686c297111f2e23086d7d2329c8d1595e99b6778ef7d6c453ed2e1c3bafe5bce0f9d9ebda6a83e625b9bc3a2f8c7db48de77cfc55e2e0a2a16ee8938533aea8abeb8ff3272a568be5e6d7d0d5a353da90ace7d1d88443d6ef4d405e025c5901e49547b2435f0d455e0f28dcf34bef52a2f0c8b60c9f2e12dc3b6ab30d4638051006e6ef944502d2f64731aebe35905dd214d907006d26b1f7d0854e02771e35c9104f6a03cd36ddda8e37ad72a724d5a2566eb601bd76c47df2dc7c0f071e9b32ddaeabdafd1590c6fa6755a74693974e2f71ed4837ccf39036b94387daf1e565dad9650b76b97c52097cf1bb1e7e972be8cb4ad7ce61c43fbe71ce731ae936e33cd03e4545f5a787d04b60541f4ddbb8830c776ec39fed66fef7a7f96c5b28e9d8f012d0fd5e4d6e5597dad6fc6eecbdf124b6f9a5399ce181d9932fe03d8232a5f7474576593e6c9f0874ca9c4f1bf1983018f9a4e1fc430a8d223c9e8be02bc8813555b483b872688c34aea39defbaf3bd44f9bd0bc3bbd9ebc7b704176f20ae8806ee6dd27ebf7a4d2a54ffdb68416ff4807b09d89d36188fe0f00706fc0a358e8a53d02720a76d1a25166c15ddc42f88599d0fd9ea30e8a8d6c4a7cdd4ea14fc945d197b9aed877b0721803dd8fd63f6ddc01d3fb0117e451b79759ec8413c54dfc4f90133e64d1f0ed6f0627805cc817615c027c091278ddc8ff21211fbacde753a1b7f62e73ffdb7e669b374c97c723be0261843a1d5520972434fe82520b547aa03c40db9db5fc0c53330c38d4ff0e17b9db19beb7c73af2f0957205342b8f2a0af83b35426e9424515f9c3ec77fe80919921bd96ea5ec6a75f6a97026faf751f67d957bf9aea577e2850d92949cbfaa981b541886884cf7b470ef620e0c1edbc58bb0201e8c4b87e74bb2252166b3fc84b032626d8ee88596f519cd7e6573e8ec6db469cbfd8f531d9133bc22b7b5721225e3fbdc16ce8ce75bd38bf6fdb0cd588ae0d7e873393cc9c46bbddf26e3408f43bd3c31e37f7a70c36ebffa00784ab40ff2cf6a84b74af530ae2dadcdb1baec8334bb4efeaed9efb628ca1efbbd0474b74d08c66b4ac7bbd75e0ee25394b4ee31b6f423fc29e14be7f1ad7f3965bbe1f5d3440bfa0975e1ee435d74847b1bb376ff2ec86606b762b2a970b6dafbab90675c5a08e38fbc94e77d8f6c9911cc5a92b3a3fd7b926c68a804531b090b81bd208ca8acb6816b67cb49d55acdc8656148f91c8c28f8a8ea84c7f4d7ed3738f2d66183c3b0a7b45204d81f4d6a7026cef70d6eaf3525226d73b5faf1f04fce1556ec6219deef10a339e63369f2e69abd2f394601372be461c5c55967e6d73f5f6abeb29bb533ae9bd6aa536aded1fef7c980261af1c7135fc698f2862b5af959720311f00cd0dd45593eafcdb13b49f1c0909b48edbb07cb386e882d47ecd4be5f74e0966677f0213dfc6b732663a1bf14099f92a48235caf913b290e96119640a62e3e6c748db90218ccc259119fe0005f8eee27713e60ca3529269348dc155de2eeb42bed0ec5abb8e9af36345734a4e2ee2baf7af09cc8dbb832ce7fb2b3e9a7bb427876d42a05b4e150a16efa4f775a056c7cfaf42f21addd08dd793e1275d234d71d1dd511da09029d3ce39bebb0e6ba729e44be082ee738cc26851b38c0780663dfc6dd47bbab7d076ceabaaa46e36f71d157c8ec6ada2b5eb94abbf708fb9d68673bc2b78885cffed9a4e58ab1f6876da09764667af69d82c2153786572f3897756ef3aaa2402f4ba74bac3c69612f8e02a3818d6e6cf31ddb750797f3cebba5c427b26ebd42f3143481bd74e1f3080e3bd187fe202f511cb7fce0966ab54fe45995181ccbb4eda496fadb49431bcc5ee2c3a3f27360db16562f6c412b6a6f865458829c62b55581caa0aadad667c3bdfcfa26a2559d92ef5687c66d60d3ddcaf7f77b059f36392f7c97068bf33b034c00d6ff2e223e25cac309c1d3f5bcae355b3502c0dd8057749e9910c47dda0dd46d4a64bfb970675aefaaf9fd8607debb2a07843b0043e13957937276062773a4f33d95dd9d04214e76e86f10078dec06c22bcac446e82d2e36d4f5d3f373a437db3fc2569648e0afe2aa2e3ad21dcadf200f870eaefd6d42f8ec4fc2e3db076f2815033d754477799b4101c7c8e74241b02439f1f9247625a0636e8aaf8e582e8c494f0c5b145639d61556c95ce71ae93aa2af4971f6f6e2f33529e75c7fc201e27093fe51fe9c8cd23875213e4f381d485e0f737295a9a0930be6d62f87c2f36649fee5592553c0ccf7b6ca08cdb30bf8137f629b616db1c25ad97baa0bf809d008cf56534ee32a623d57b907694ec52867ca2bf2d04475a6d6ce838ee8e3b9a664c444a4663a312ccd576949027ed6f46f6f91c247837a011f8d0262a6439cd1ef6616650eeeaf690a90a1840122a90cfe57f52e116bf9452823caa5c8aa4c4c09de1151f7b11768f9942c0706c783036994e191bb0445098ff4fee4ec25bcf909e5a794808c0859609120a98f21206703ed85643c2ebeaf6085295f600abe38c0c5cad2b83383e373677455039e94fe3f7dbf7286cf898f01ef8d7db02024b50b796255db69fb74ac2f1021270edf54c2875c68a3c9b7ce31466d6591c1e267c4650dbebb79c1be4b4102109725f77c1e21e45880b8c566e428018d9c727d84001cd563d1bffbfd26e36fed33014fa8547609566fc5e0d3f640542af9de85938019442f8e4c7c5d15b9b4a4736f2d79f6c7325acaa5ea937d7d80d51a8f2c1693c9c1fb2702e2f06c1956228468f0301611f8fde92d5c049b4d4679af78f9bf1de0f2a42f8e0140fc9b1b347d2afe0cbb482c70cbfc166d21f6d7b6094c251fdbb13f87765ca0651d80497f0df0a6f6e734c1c17e1651cffe9c14c464007c1410c019f0632138a0de32b9e435f20f4fb6f4e26fdbe52ab1ecc8ce389d673f93cafcd10573a72b06dd85e1ce572022501a01767e01607c43d108c50d8a282c8ea451dcbe149f2659f2431942b1c178c3911b7a72a8b6db28cbb4a3c45e7ba356e9315875d12426160c901de98f85bedf4bf1f90b783cec994c17a82cc90d9bc55e8d95e75fcd5c238d88ca26d40abd4c444a747684609a04fd6f038374ea4bb54795601a32db0753ea22bfa9b703923b12098866809200f45cbeafba81cbbeab094b0dd4fd752d6c9fc6b30f2d8593890bcacd869ebde5c58dadd45729fbf5b53b8f63f25d0c2d8a8244e02eb49a7ff60ad76a3c4f5bcbcf1f2519eb2aea4ee4fd57f2eb4cff5813ee37fe5090c84a28cb9594b4eef86785bffdfe6fde2f22409b5a7b6ec3cae677177a493e5cdc6dfdb28a7912f7c4f5f43747485d42ee80e404fa98757a2c31d77bfc252289b0e6cabbd5b00f193669b5b30017393702dcc5c005c493c81a2639824b4a5521b88b610d9209c6c664428186343dde7f585a4211d139405e66f2faec93f2d7387724c886801f547e3a0f831943f2189d062d46458938b391ff99fd52a63ca3dbf59f9838c10b0beafe1af8e3ef2fca631ae52e2c39731ae5d45ec8ae47742d00fd3c06b7e02faa975513e1b48c275fe80c0cdb32bd66e2d40a5938ccf276bc8b7ecf2e4b6d53e740858e94478091922f6e72a5c686b2caaa4c44ee505d43833a3f192f6e8e56e53f735e07fa6cfffc9b92db2b67819446b5a143ba1d435b021fea660336f9bbf06063ce4402e180823f8231de31c17a5936b529d3ed8424ded588aa6781e03aa2993e346f344036429ca5a34bae17b60a599e3d68004e63d18fb118ae17af7558fd4cb66caf73f6d3d53ee93c383846c2c27924a2fd1352560782b9f551b292a86196eb2cb869997fe3c38bd7662a89e44c02ef054d35d51e1a8fa7d8aaac0dc53963ebd6f2efbdcff43734615007821cf6da1dc79c6d7b7bdda9c038a49e9c80a445915e0731c14a853300995d9253750415c751abaa97afbf278a76c89ab2fe6b6ac2160e52e473316e98928a375696d5a5be39a35bbd123152921fc18647fe3c8f295992b887280f955b024884417077e534627fe6e1e231c90dc8bdcf2912325bf5360c23bb07418de1a24e82b2e3aa202cc449aa25a5b28eaedc4a2611e8a610493d53968b5ba9b4432732ec03943f01d043c59ad695396e102953634aac7587b2ff9081a26d1557e9fd069ab2068de9d81bde909ea4f8606217d9e619a2b1371742acfa08fad8dc15880ac38b5c71b4ca917011550ece387341aba053e8d1329e8e0bc8902b7b2e54390652cdce321738de2f560df921b72ef77bb4db7a4f5a089e2e4e945e2bf226be8629120807fbda012ba1ce46190af9e14e7f389848d749d64000d651efa0981d6232ea41036db5d5932e8c1698d6c60876e79cfe8fbfa07104e5ab0f504d02505fc46e704a6bd195a5e24cdbcc87e23b48e0dae3b7048a7eda48b7835fb6ae32d1e2922483ee83d5cb8805d91f2ae7cad77b0849b4430efc45a4e2103e46c21db726893c67c80f100d9c59a4a23adab2d451fc07f52a07e5369821c1e0f9112e50025346565140442bf964b828c73706d8c4c269136c222f736f59270e0587f2d2ea4248c3e4bef423c5f49fef9b4b6461d72bec2ff8461557958fb646f5e1a862573b57b4f1a66d3835fa01820135d01f0ec54cfe86864208509a601dff72a7a7d4096ca09a282b45a1b6ec3e64ffc636ea563c4252481382b352b50c574ed836820212714776191263418515124d91e9bd1a3a06651d5da70586fac369f355c442bc66ed585046a1f2455f7c32060e8adec92dc57f0a913e3756d4aa40940aa994dd8dd8d3d3bf108477053e0b8f5385c85c6a69b68531a6e24b09eb4f8e03851debb5e500958300182d00a3b184e02b5b5047c37111a4c343bbfbbd961293273ce91b233f1c98e263be540bfca945ddc8d90e5d163d0c0532c6bab95da84b2c902260c66c7a1a837e0186b5648e27b4abe0812f8eac31ee475f54da9c7d25bd374139f76219a51ea96ba9c4249e134f049234d9c3cbbf4e7ab23118a9032893a19e9e8abde640f9478faca9dad8743e52791ce1fb0e1b7330cef2305df6c20d9979b72d921b03880ca222c6b07f6b4e7feac675e36d2b3bde81329b047c7f762332bcd5f79a031c6431480492bcc278d21eb7dc9d4c4e2183943b670eaa68010444fc72f73be68a5dc7323ba70324e5314cf430825bc979a5c97faf538193a6c412626ec887db1a2cfb6deb826989a7e9ba79c9198d2844a0a4336f64d5c6bbbd8151ee96c49b4f4737beeda03891c293638c0eb1fc4010665ac41e904160f96acc2e0428e296da019c0611b76321b14082278725984ba8c44678f415d25bd78284aab2744cbef08835470e450f610176a09b64414194010c2d504394eef178079b55d95dc38007d2bf2652b872f09fe95492663227908fbe3cc30ab434ed9605eba7f3287686b443815d8a97e47d90407a0653fcdf2cf1ba3ac2ac124532dbfe2ee1ad8509c306d30f704856ab98176872146478d2d12bb14d3bf700d2076c11c60ee5c75e06f0a36b8019609c263a60f5e4ee431c367845302238eaa5ca4ebbae939e69c8f8977cf3c33235838fc0b0b6e76c4ee06392fc92a37e017cfe0e82c3ad75fc017a00a133fd498cc6f438cd9fe709702005db89fa86be2843596a73c9c34ed7a3a4c109d285dfb3c55fd9dfea2e3217259696c132e0edc38faca30a1c9c96a11ef98d7db8ecf544a195b576c1b458d36a562c1b89825e4db9d7724414f9dcee5a95e93e0e04b6642954fc828ac70f0f12d03ba0098945d157126392b500a30e8664b7c246064ccaf980244d32249b225424a536abc8613b4c59a1ff4c2a2218333a698f2305a28ca4c6d8e282484edad0324da100c8893ba5ea3f651d6e34d26acb4d04360f46e33aa5a33cbf1ee344410eea90e8311e4d5a55b46c41395118b8129e8ab50f67e95b6fb20c3f6b6a9830062b6018e9fa568690825853545c6ed55c0c7b4b711f0935626b6a56f0ed7d6da2503bc48f48ae9cdea96b0bf2ea4dfc1156d12a6748e6d70a9b80bc08c2a964c8837c7ee273aead1e2dc6c944e8c8a26a4e2fa5f66b40c20bdaa284a3698719e48883c2ca9dcd8011f562b18d868fd0542560385013d4602fd35ee9fd034d4c6d7e50864bbeabe6077ca6faca6cf12280dac99857d4e643aa9acd583ef409b1e62c8c7514d8f6d1d6607f972940abf7f240e23be2194c1b1377e293cbccf36031385df8b89c2542494cf5eee004aae8a269d91f39a1f82b5513715bf58a71d78fb88ae04f687dbf5136f06497f9fd5179617fca550188ea863219ad36f501e9a65640b5881b586381631c83df6c516de14351c8e0680fa446105c780f509bc4075d7d419543072c9808cd20052f5c3acfceb9900f16e3f13632e7f3a592820f1d6422be988e6676bad998bfc8f2542587ef2532172f654e8001a96b950c12ab1b8f2c8095829dcc4ba3f59ed6e93d4b6535106225736e1610b85dda3492e6848eb5f9b5c012894be5fb02db47b8442e8174571588f8c481ce8425a5d50c18038595dd6731adeae5c46149db43af3d906b2858a735e2d23d72e7498e23f4e8b4f0578aa4ac38cb85c6f608818c107e5d9f3184c9077a839f260b5f8b7870e237a3621b507e00677f1158e45810a1ae4cb7e0e7c5c2513e9b83bd1ad9bb7f809a3f73e263ba3cc1ebf3cd357319485e2b5972512c9cafb111aa00d5c7e35ea9b535d0da5695b05e80ca0c80a035624e6c20d66ec9c410a8df77af3610405713115895d816d7940828d80604b4cc3c30f5a631ae3a47233873a304b4fe74b5710826806ad72ee514cac81aa881e96266a3c85b92d9c07c35a91f9bad4451e535e2ee1366d8cd2995760e8edfe1d53da7ef60d0b23e73716bc9eaea4134d55319b6a838345503c1237a5099c887051e1b43484bd0e1452bfd724feca8b5d07b16fa02648b19608260396fd6ac965578b6b8f10695346cba9187dd547ef4520925564fe14afd1620d9014482018b9c2c6cd18aff8bc563181da669ad245f14f150d63688c408388b4c1f87c5eb2b6d8404df7779197d41e6d62ea16acc7d810adac7127248042c461416ec8045af2133605afa6d0657735a723e59252a5ad712d38c208b52bc29e67905af246877ce0a98915f7392b5a146ab0cce7a032436e2a6ef8a4eee04e4ec473eb0a03b97cccf18b1ada6fc6c773d43131e807a76a9209721021c955ae9cde1620a2f2ad3aa91308e3417d0be02984c327dcce6b973654b0f2e1c452fa8a35395a1f99f4937463e5f2585e7a2919626d2d806f95e6e13ae05d2cb045919583f01983e4b4164883461f7d4c60c40b982fcf7787918c489fe6482f9308a90b3f288e200e98ea02b893639238ac4bc133366340ba6fdd976d220e52edb7060a51d46fd2c97ddb0b9da9becae3f39a325def4917651129095c88dcba0b6c43e4109e6cb1507ed1330bdcb5a24ae0262e189543629c42648bd91110fbe067995f298111ea6a8c054b1534397eba81a29f6a35ae66c5f250c875d3efe2015dc281b7adfdede88668b5a701c0b8cb44f122e5034fcd6db7c60c5f958d40a033b4d6e30551538db4c413998d395cf99dc28c26fbde8d15b17ffac113b0a295624f5af10098f08cff92d994bb36fc25f392ecd9608895d48d3e4deeeeb0fcf4cf832af6ab59bc45765631966c22a31036ba603af9cf1b46f90517109e85c778c4d4f7091b8ac1236be9c3496fd64fa01e33e77bee1def9a37e5a477b1bd5970a8b19077b11a4c234b51e90e91803abcd8881c98729aceed628950ebaaadd9dc45d5869125bed0d782a0ecb18962aa6a5f99d8a8e4b5834d436e09762f9ca0cfc0d10c27fbc230bbead8936b11031bd7cebad500ec150aca6a669d064cd24f62822c30a49dc9eec20c89c0d7a046e0eed4065eadc856ad89d0099701a4a705d52178968c11ea338a0e6f7792c7da3ab2566520737150f018a220ab610a0611df677638f9232b42154eb6851584a5eaf322b4f6264a57365790c8c4460f2c0c30265c2424985c18a6a37088a1be043f621221d68d5ea867c751e51dca7d433c1b7090d9630f9d2fe4dad6c197b1fbecb793166bfe182aab77082266d209b6e8761f118d245b8caf8e6a0f67d0d2a6d909c395ba4357ce72dee45f916ad5643f42f0e61045cbc2110fa8940712514d0fdd5c9511931df676aa43c633c28134f4fd0561774b91a38d4c1dee028c82abe302fb2135b14ae6f81658ba6e99c805b845134612333fed210573038efea36ff8960853130731f13327e105eb78d8e5c17c6cb0d8755c5e1d448de795d0d7b71e70527d2f6192b76fca2aee41ef09d47f3a1cc7a679efe0f38aa1a37cef561570e025fc415f34b16965dcfb92c36b5d7bed5f5b8315c373f6561f902a610736682d9c530f534043fbeaffcd560fc00a62b736ec239d9677123f1c7dd70c3ee8c5d6e0cf1f97370a7217c4abca93883cac75ff8efc7e60e6e2e0781db9e990783fa1430347666797396c30b132c268b462083846d03d7b79dc73cb22e18d9f5b4372337a3d8cfdaf3b001ef10d904d4dfc44e137562163d7007f78755ca10ce77e606f3177756769a183f09e85a543849ba1d0e1cd8c17f06b6e56acecf3dfb36d8723e3f5b4a193501d836c55cbe3952d9a76be75facbc8f4c12d313ac10c10d8b26554b8fd535ccb00f77a78a322cae3e59b178753a2b98870b44ed3e39457ba742a0ab01cf80c1bf692251d911e3166d3dd8ca70ac29f5519e8230464c34c446071ac16acdf4fd0c63e394c4b647e3105955bede09d996af911fcc17b1692bf0b7933dfc284e119ab6b41d25cffbb83621e7f197e1d29a38431174d6a16e7aa77782bae5bba03f61470a237030b5ffea6e411b8c0b549e9fb292ae157505c04dbbc6b1417459ae1b080e3e55a42eb046fd1973fc23d3b2000f915e656eeb68ba2cc22ab1d30c7b38911c7b3809ec32d1bdc74c65071cf2ba4abbd3b929590953ccaee9ec704a26466192d9e3c92ddb67c599551254cc947a88e03c263b41678967b7f6da4a2099942eb51225c4b844701c458d5e215614f1636cf080f22e8a3c2dd9d9e8f1fe4e05bb17232f33d683bb6bf553e4917e7eb4cba24bca45bc2856680b8bece81c50c9c0b5a00461c79e3e61cc8a46d74851b1eac6c9e2604b3e4a1c87a4e2cf8e3e42fc5149db0170362c72be959dbb40494501772de94f23e430f5410fc3022f69145a4caf567564e917e2dc782d0bec47edea99ce2bf44cbf2458bda0ab87e4a3acc269d4e6ab2f7a597194c1b260d3636ebb9540fb1ef1dc255948dc51aad418b0736529d53853ff32158a82ba200e6d975e6449477b5005249fdfd99940e405439a21f9e6561f01840e0649a19e313474a051409b904c5e77b8cc12a14987662ddb0b8e95b2e7b2747d2e76cc707a6ba11398388ccd30d5117053226db95c212c279d120c2ac650840b631abe4ead437c85dfe6045a6f692d377bca5385b2ba6434461e681451050702d3fc912c626fbd8dc5578d146ed438a1e08ba5538aabda5af70345f237951dd4f7c4dcdde4f7024e03766f7dd7a9bcce017ece8119f7b4a9f8dbed2d60a5d4e5181ddde0c56739bc5ccca3d78f1a4fee09f5b87a33a100dedc66dbe922795e39bd07e8da8762be11b0313e507f43988b3c5ffb8cf16da7f57ad955eb11f080b4ff31f2169f25d1efcdd67e02a91b1508c95e7127a36f245ab1d887e6194a10b2f967e587c874ce8e2fbe6e20bc86bed816e1b9b93bcdc8d7708b92641e8a3b8378c6521fd8fffd58c3cfa551dab73ffc7f04b9b9eb0cb77e5ff4e366de9317f7badcf82d1a7c56021e4244760a2e70b4940e000c30c000030c30c0000aa0a92e526ecccfd2fbb974b673535252921717c34ad6064ad6064ad6066c5d800aa40a610aac4a0c338fea3934c20b361443bc67cc69c57d3f5e434993448c98ce6a1e8e5a78a186425a8739244a565f75d2500c0d1c758ec778818652b769de104a3e74c42fce500671268e60d40b3394f1847bcc31e97c7450172fca50f230bb7ce8a92a7d4186b266d314c7d1b78fc5118c1a4321a6a379e70f53e08518ca042fc2504c123f596140042920dbc00b3014671e670c9f2d3156ff42d941c8cf79ef593eb517ca12a366d37be77c24bb50b84ed2fde94d2e14676bf671e6bef01bb750b2580bed0cd70b2d946ae76e32788e6953ce86175928bcc7d459a25ccc67140b65d049a56f6396861757286cd650e6dec8d3853d8005d4175e58a16c9a7f1983b4de8216380bba1330000c44e05e54a114d22519a5042b871b2a14fc2b436ac9ef148a217ad8cfa9c3536d2a8542838f517782a9e48a0cf0220ac5980e246734c88c3a14cae03a53cda5bc86fe84e2bbe3e0158fe1feed84c2c3f8d518378b66bb09450f53cd21cf6c43870985e020f5a3968701ce820a108000e58216b80848d0c30d6fe1c5120a293f5eccaf4a2863f079a2db41af9a4928e9a39f90d4adbb4a241427ee366a91bbbfee08e59fb1d0fb6c1f9a7a2314ce245a2eae2f42714343bc329678f810a164ed9b46d7338432d01c93533ade501e21942a22e2746d7dfd2608859cea7e9c5b525e0b8442da8dd1e04b434bc60f0a21e45c6515faa0e4936a734cdd23e37a5096c92a19943b9a889c07c5569f4ce3f01d689f41d74171a25bc3681119b426078524ae5932da17382837460f46a3245b7b8bc2e66710d3366c51b448aad3a1518b6206abd08f11af25b4288f770ca1d9fecabd5914662c2e3c87b4bfcba264bef9fe9eea5814e43392a6861a1685ea8f10cb61f0fcf62b4a579a2dd6c4537eed8a32dee8749e752bcaa1fa1c58e6ace9ddc38ab274d6556c74693fce2a4a51361993d551456163fac77c87f3189d8ab2de4a7f5e9667d6a8286c7a208fb3738a6206591b771ab9871853145743bccf38aa36d294a298fa5dd2fb542233a4288d6b5c472d9b5194f1cf67f8dabb8959238a1b230f07bdd15014345bc4cecc874f27280a21744d985744ede4270a31a273637cb5fca027ca2d8fb34bc34e141d7bce1cb363c6f8e344f1e3e3f8e0253cd79b28382aa9cba89eed68a2ae897127ae994c1442988c23958d899264e6497edfac3a5fa2f858ce1e74480d11b544e1e3c36815d61f9a56a21c2aad37f3665d9b9428987b87c5047518c449943c56ddcc71d00ca124ca923bf4c71c924fe422512e4dbf8fdcf7923d86441966776b94e7967df1238a6b71faf851ec88b243cfbf67961f33d38892dabcc4b4d2b1981951f0e85a8b075944394634dd28dd23f52aa2ec73a999e3bf8928874c7b8ded8eaf3582887208b13454fa872866101d86d590f69b1ba234c9d6a1a46cf7cb0b51ccd9d7632dd24b3f4b88c284f107b136a6d4780751869d7f8f23bb6a475610e5d2183fb5330251d6924dc910feed1c802877c8909bb234479e7f283c88d61856d717e2faa1341dc663e3db9890db3e14e29b64f42b9adfdef2a110e34d063656fb75ed1eca1173ece8da75d4b71ecae9d8ed1b8f86433b0fc5bb5bd973f81b8d838792b545a9e7983b946cebcef57625488c1dca69bcf3ad6ac41f4d1d0a41420a4fb96ac7613a147284df878ce7505ad1902cd2cfc46ce55086e96388a9524fafc6a11c312484d0713bae83436926f23b6a655d6b6f2848aedb2751871b4ad78e1a6d28ba7b83ecdfeda0aac186f2a7672cd12e33c3d0584329cd357dbe5089110d35947262ab3a7c2c82270da59ef4e06d5d4bf28c8672d8847ecd3843216446abf5e9f9cd50ee0fe39e717d878dcb509ed4b539a4cf9d2e2143f9adfd524b227ec68ea1547ae9ee1a561ba7622854844c1362668cf285a18ce5e34d77acfa1f0ca5741cc6c5b22f94543cbaab87d40b856c98ef53c52e943573b27e3b49f65c286cc5e7b488caaf780bc5fe20d18f5395b6430be50f2b131dd93aca9985724e1515314a668d392c14a35ab9e757cc392aaf50b8aacde91659a3a4ad50dc4f9d2a14a2fa4f67d84dd3182a94263767f4c5a96b3c8542f88346ebf35712ed097800042c208014fe89deb02fe328943673e286774c99170ae508cde01388909b69726a4e288d94865bf96e861736a1e4b85d3388d5cddc4c28ee9a4da3fe2ca1609aa993c6ac84c24673bd168fc11d2409e57f0c6ac3a4ce3b09128aa983b89dba47283f8e105232f617758d50ce0d1f634db9185d8b50f0fc20d339c3f3341e110ad1ad1e42218e85c95d5e7bbe855072d59ddb48104a9b6972c3395a3d0f100a111311923e8de7fd41c1f3fbc3cd6dc7d907c57998fb61983d288470190fca208e44fad46db877606c6fac521e1d145435e5afb41c143623e676840038287f6b6dc38ee9f6718b82d56e8dfff778670b8247fbf4ae7d2d8a9e22a7fed0d3a228936bb2cfe166edcca2f0f2199b7363183a238b32caf6380d9ada1a2416458da13d68e8f0d2202c4a2d91673d48f58a82838b1c37b62bcab81ce41063482b4ab1de9367ccbef3654531b5beefd345e89c5d4539fef36da7aa28b45da5ba4b7a87a6a28c3a22f7a7cde1930315c5f1dc33f3dc298a41d6f5ef334539d455ecd7d5a74c4b518e97d7f13669e41492a238394dc5476e1465fcf051c986e7bf8844c145280a3f1d9ff1e4b8c5d8a028c388ccb097af4ee3270a95d67d1bd6b13ee878a2b491961ecd2b5f67ee44b9f3d6fa63ec0bc7124e144dcb3d73bacc50b3bb8932ae8ed16198a73d493551c8eb967df4a1c6379928399ceba89b93ee6689897272fc59249b67dd8897288606f50e29ff111e678992494c8c22da05b8a84461dcd51b48d887879a0e5c50a20ce557353fda4ccfbf6ce06212a5b919cd1959756c3e06b08033702189c27ecc79e41f7b0a1240000280a0bec04524ca70d37c4b1c1d12e5f4793447b5e611e5920c69ff2482bb795c38a2dcb35fa1e16123caa82398c62c1b3acd6652e0821185981426d2afdd9a365c2ca218ad6f2a72a7ff7e89042e1451aecf3187ab89110217892883fbc76f9b3bb3f8c705220a1a26353b682879b93844d171b68d6e0da23d14706188c6c374be4da610859ce023212847d5f02eb62b5670318852c464bb7fd654f3c81b702188d2bb453d825149032e02518e321925a5c68e310e40941b47c823f1697bfef943217beb448ffc688e3d3f143bba3d6db22672e90208741718b03e9423ad9c7af8501bb8e043e9537f63d7d4501dee3dd00bb8d04311a0b8c8431987c91f21c6b48e63100fa5fa8679f2dae8838c7e81bf600577288efed9e666c8e083b4062eec507ed5b4c731731cc0451d0a39ac9eac6b6eccf800c172810b3a943d5568fc087f6d4773318792afe7b811f6ff315d2ee450465911f3845cc7a164a32351fec0cf4d8343313c083fb73e9b55e3084675918252010946d08241052ede50bccb3811b2de5d3ddc0d658b6ef71c6248c62fb96843e1ccbda7d6674349634c194387b4b7915f43a91a5ecedffab67ec5822e0840801170a186428cef161e1eeea25dd04517167880bba08b09d435176970354ee370bbb1118cc221708186c2b4d6b55a6896c0c519ca188787d7769ed2d3a6cc40f2060ec4c3b17bada416f7b4ecbfc90eb8284321328a48499f1bc12823437144ddb3764aa7c0c5184aef5ab129e3c68518ca115b3f46785c84a190e35ceca3f934da0c14b80043b135466ecfdc1862fa09109ec3db1499b124ce2a43f93c3a4f12c973310919ca62edb9ce35749a5a6b0ce5edcae811a266652831943c7c830fb1d2ec7f2319a83014f3f5276dff4e3de3058642dd07ef381e624aca2f14a3a5c32357a4b7e7bc509cba95903b2589631d0bd5859248d0fbed4e75aee6148a0b859ad7d5ffd89d7bbc2d9472f75553dc63cf505a286de34a471f54228b67c9505928b4656c1022255828e5e9edb4d548cca9b9c230b75bb48b07cd50562863243b0dcfc155a0c5e23c2b8336c6505428b4a598c4f0f2386b15829a42e1d37c908ca30715d1a4507089397f26f25d74d1c3865051288a5a4dd4ab5f78207011b00a40a002d64141a12caaabf95aca118040052878811939a827946eecf1abcc3882515783724269247dd8e884b2504d286f6cfed169cdf3f25231a10c25a4e6cd187e8e9dada82594a3440b1d7ffdf021798116b8c05b40fa504a2867b7eb7dce2bd391f0a19250de146b7a159d6bf5e5a19050725c951e9b2e02108000297014b880ea088510ef2488d46f84626b4429098e2f42c9b457e42ef2638e3e114aba9da2d3e664fdf02114c2c418c4bfb7546f2194e43ac39ddef58b70104a3732a71f6364690408259bec1f83ad75e6f50705919192f7cd1b77b90f4a2f1a3e4ac6c1d322ef41197acc888cfffa3aa7795018d5a4d1c3eb6ede7a07054d1fb41b9547794707e50821ad9da60da69bca4161c436571fe867bf8583628e9fb24635ae8653a90d0d357a326d517cbce99141f0d4a21032fd310c261b1e1e5af0fa481c3ff0ce2c0aff7e0d3a63676c7464518c1ff7f389481ef34d2cca0d24633fce8ff658038bc277c49a1c6d19f333af286ffc9879fcec8ac27da3dc541611dae55694b4771a7bab45c3342bca923119c9db6415e510ca51a8e6aef218a28a4284da13d51c21824c5251c626629399464541939af5f9b66ffa9ca2b4de1982c6c6ed549aa28c716d4866897a3e96a26cfd9b57d26d16ad9614c5fe48679ae3c4098fa2e8fd1a2ab3ae114529c3858c833c14ce3db4ea9c4f415128bdaa8f777fa25ca2c14cff633c51d66b7598ad31a813ad384e53b38772a20cd35afbacb54313751305990ccff71b84c6966aa2f8e9f756d2401d4c3213c588cc20657d42a7333151d4e87ecf71bf44a9e636eec3db63842d51bcf3f8f5dbc87a8c4a945c2344e4544a1442cea21a4ad7ad229c44197bc6f6e3adb31b3949949369466ddc7b24cae3126673aa7ec7db41a20c345477e6d4b2a57b4441d20707993323b59b23ca1ee62972c333f2a91a5106a31d2b636866071951d60eff58ebd9228aa9e2376d624a11e5f9098e1ac62b1145b7da9ad4d04b631051f8e0abf3308738475335fd185a431422c33f483f294439e3501e23633b712c21ca3063187db60fd237681085d4fdd07fcfa8f52182288609339a32e7b8b9ca4094336e4bccccd9b54a030834bcaa9fa83e78017004fa43c9d4ffefe3a6fd508e09dbd9d7b6c367541fcae91939f8f8784ed7890f85d7d89189fb28d127b40763e364470fe5f4b923ff66dc212db334501e0ad3d9faa1b85e68203c94d57bb3c5ec640a7487e23dda709b8c61875287bb03b19f5c1af37528ac9f48472acd8f99d2a18ccbfd2d250741d00212a81c680ee592dc7c8f8dc2cf6f3914ef636375541c87d2fbe3bce6fd99325d381447b3677674ac213a4f6f2898c4941ad5d8e433864581012c6000160038901b0a99730e0f25d4415ea40da5d78e4725f33f81d85068541aa3ed685a4349547b3734378a0e39524369446334f76e4b6928ddaeeabcba030d6d69c6a78bf75da03394545b73e80c5d7fe23833144de3d27d23392eb5ca508890e1a7aa3e32147b3bd5573634c75018977dab4eff13cf144351ad7c0a43a9573afc7a85aa468ec05096f38d9c1dc8a45195be508edc7caaaef5c126455e283bcaa492dd66d2aa9300d0037521b5fee499eea384a41f880be58cd239cde7acc794b65018c79af399e65a2026c94059284bd664e9e835745772021664e0055d9ce0052a78010b0e61a13466122e6d3a57283eb238d3d28d3e3a9315ca9a43c8f5f7c8ba3a465528b766b598c98a9d58890ac524398720a69f2994d3aac4db1b6d58202914328e28b1ba53e3bc178542ea77c99929de3c3ba050d6756de99cb3359116e809859cdc4462e8f618237642b1763eb765d8a809c5554d7912f24f4c285d454edecc1c5a42a9ab6b630cb255f791120a6b2719bff63667a3049484e2ff4966785ced0904ed5df4c28090500e51730c5d1b9137a477043a4261c2d98a36babcc9202318e52e20010b6270648472f0b2cecee8988a506a1c16ea1be2d9cd6403c080030840802e4e6001200211814cab3e35e571d44bd0100a1d4d36b4e3e6d44c2d1d4808854a2fe9f48f4b248f0305a1e4206fd41a11dd40402847cd20754c7b46ba660df483820789bd90cbb1f4181f1442dedaf48ee06e32f6a0743a19a795473b9a7c1e942764a3b4ce4a3b285fb6466b44e867dd740ba483428bb727918d152807c546b10d6d25a40a84839247de891c0d36a6e5b728d586a49f714caae1852d0adef59b19c4768617b528d8e53e9e36870dd6a645795af32a3b648bcc661685f33035714ccc17b228379aee7fd5ecb425c7a2f867b9513da4f873191605cd69d79fa3323b83af28c70c4c43ec9c889831ae28c64d7a88f96e2bca259bc4a52342a6ceb3a2ec307bc831b1414ffe5514d63f5deee74915e59026d4da8e79862fa6a23c16e72182f858c9898a92e41eb9f5746edef15314aabe7432c619e3a4bf29caf97a1926ca2d45316a4b47d39c56636d4851c822b93ffaec5194f7543534678cfc42154569f5afce35eb50944532160f6eab2ee30145318686928eb2ee736a9f28a9f45b6f48de4e19f444793c8dd587cf3bb1f5c78c992a269c2889640b95c90efd19dc44e9f647d7e5a6b3c71042bcd044d1266f6dde706a5e1ec944315c63f5634f1952c74469626c67f0eccce5fd258a39397c52a9d790e19628a5e35e930e82e14525caafb976b26d676afaf90525ca1f579fb19a2cf2e4002f26414e5b2e2f6115075e48a2145a9521f52d7aea17e145240a11abe53363d03dc183443123e48930a1ef613a20e8a21f51cc5bd399418a8f9b7146302acd1185d9897022190d21bc68444145ccd34fdcbc12230a0dfb2664f1ac35082f1651ec89197c33e99d5f070217780bee85228ab17e32e2a81b034f010866c002179017892864af59d9af57052f10513a93867946c23f47ea2660141ca2f8e0e454e34ff3e3d5107ec89ea531730bd8052da07a5188c244ceac6772d79bfc110c10a4a00b3a2738c10b1a4081148c13c01c5e10a29c1fd8a84ac665fd5de4e0c5204af7ee7a3b0b5470d018f14210455ff706f1675bc516b8c045c002c3a3102f0251ec8bd90cbaef6536ec2ee802062010410ab206f1021065e815a99127267aba6278f187c2fcbf4d4fd506f97904a34e7002128ce024faa16cd38de174fa58bf0fc5e9f0d1c0ec737b6752400210b4b7a00b15c8c041d002120ce40349ef4bc10bd0f0620fc58e0e33738ce68f62167895195ee8a150e7d1e53c234dfd9ce4a1a82149fc67b6da68911778c0e168d2f21ce35baf3dbcb843217ae8c9cb7a8c1a511228a05ed8a1188d1f787e66000b1859785187324e1d4a42e494dfd3d3a10c83f7a4081faae0055db0c0018a851773286ef293c712429ac60fabf0420ee5d510eab3f6e41bb424504039094e172dc029bc8843b976cf651b7ffe6a8c177028a665969df0e20d250dd395d2c97de186427c4d0f22ddcf84176d28b901c97a662878585987fe39fe665c19ca9be7ff22d4afde7c4786426d7630fa1ed9f13c79b83114a3c73209194d871343d9c7835e4c978766abd470612875dc786feb98972c83a16cd79911abbf2f10e306b38e5451e1bc50c8929376a134b7a3f3e9bb45c26709c78572cc132eb7693742354409b785c2792747bd3217e1b4504623adabe3792e628408978562b4b94bae463a91df65e1b05090d7cdb998d0d5783f2bdc15cad03e7786ed70d42bb14251d73364667daa50b4ffecc957f437832c168e0a6554598f77a64d66fc29943dde3be3374f154e0ae5903f64cfb83b4e5cf1031785f2e46cc402078532cc1f9edc4ebb34765d9ce0740a18046bf584324e9169c9ce13590524700108f204e78462928cf6a3b34bde15af09a50d9fdc3fd5c584d247f53d9e901d51da5c4229235fa467980e5001a3e098704ab04b82e2b8b21ba48c0c42558ac69cd363c708461d9541914111410a5ce02820c321a1f8d52d9d71aa3f52734728e7d7709ca275ee41d98433c2931b11538482d5c6d4fb716a2a7722143d5f62780ca68efc1c4259f28c5a4ff2ea54b710ca6873b54e6ff4e42e0885bb8936e2c97340283b0edb0eb3c7a4eb713f28d76f9610971a3531e67c5030f98df461623d2823c9beee911bc73ce14131223b1edb849cccb78362cc9e3ce728d16d3d1d94eaa3373e3df58c8d870d2e07e596cf8895608d3ec68783926475fd4998dca29419ab6959551b36daa230d399336391ec1faf453194398a983ac7fe67b4288b7b08f97149461fdd599443cebf4d723013796551aa083b9941c8f8b7da5894b323eb37f00cb2da8145c161f6eb7d365e519a1af3885122daf97145c9a1fc67e8ce0899d256143725ad449993158588e93c4a88731585716f7c9e3386a9a214a79d7b3be120c6cd5251944cada9a37fece0932e34e02ee80206a85a3054f4a77af3290aea9b24fe5b638aa24eae4bed5413a71fa528a6641c294a6dba6fdd1223368a2d1f7976690755c0022f30511462caa22667869bd3a560a128c3fc1f57eab5cdce1ba03093443651d55816c13e51520feba96352d648e389a2fca48a8656796712eb44a933482bf2ed9fda27271827ca799b1f6434e13a566d9b7046f3872b1b7308a689f23ceaf041cb26ef16402258268afef770f2f78cdcac98287ba8569d3af30c13bc4469c3dbc6edc71d3d78962894a4ba960d1b42d24c258a91f1e863e703ff2452a2389dafb7c1674f0d429328e41fcf7ca95a12a4b7cd9cdcf046a2b07133bd84a83d462b244a99a57f19f67b44a183ca78580587558082f28139a2a0b136a32678360bdf08d688726e448a777f95f820398231a29c1d47b72d890dd5d13fb045fc714223a688b2fba7dcd4597736994494b39b9ff73446bd1d4244411dc3140f3a8a7eff87285362c8a419e40d510e1d6b93761ca3fdbd1065e8377e1267be5b6f4294ac3f22ddfcb38e3d88d2e6860899de9f1d13445162c3583deea43399401422fec76b5db28b0b8842e408d2b82763ccb77f28544984ce5aed3946c30fa59d4c1f3a515599ec43e9936d6ef0b2110f1fca20f8c7381bcb3d14675e3cfb43a8876224b9ec96fef25048bf992a32c69ea2c14331c7d08fcea541dbb3933c880e77a62a3b94fb4745ea3b9f669aea50940913dff7313a9f9d0ea5729c9976de3efce97328845489af2167ccd97239146f42c3e8fbe350b417f5ec267926730d87d2ff7dfa910ffbdef51b0aab17998efdc273dcb8a1fc11cf51c3505999316d283b90d89d3e969e64980d654f11b9d3a7c69f425e43d91cbd745e4ed450080d2ff110f3e67ad35008aea6bd352d1aca11bf1dcc83c6194a99375fc8e498a124293d9b1197a1d8f6991d9222e74d92a11cd656227bd431143a7fd68bac413194cc91886128558c438d6af41b210706454cc673e8f1be504e8f23b5e8a87498ce0b051d6feb7cafd1dcb62e94b351457bc7b850f618c5fdc3e3c698b42d945de34f9c456437cfb450fce88854978c21ed958572c4b74e9225168adfb39d513acedbb0ae508e69d2d664067956638582bcdd494c176dc9a842a1b67d454365a77d5428967ae59d87f4c92a6a814da19c2b9b2649b87e5caa144ad7593242de4408f12814f67dab5d34acc894502887f312797c5e7a353ea19881a65489bd63d0c5020840801874c1021698130a9e8d24e67b79865635a190d17ace5b8d1d67b78d0985baa8c79f69b225141e841cba23f6287325146cec53f49644ca4f05337001088a019684f2a7fbb0d954f2f822286801c760140bba404342fa1a9212e34823187552f0823708942a25010a5ac03138801da11053d59de36fcaf73742a9df265f422709fef92294d1f9758612791e8e4f8442446d586ada8750d6e00f3cc766c28a2e84720eaf0dd79419f7f220942f3e3d7e8703a16c33b2b51a9398487e50fc906e22b9b235783e28474aab7cbc0785488e3287986a1e9495311942c5c77650721c8e63d3a456951cd3413933bdf3867fc4d58de5a010f12d936674f84cc6705090aa7f511f8de71edfa220ff6f6ef1dba22c599ef9333bff36b528dbe398cf7f71572f2dca29eb699d3a830ee52c4a2d9261fc8f9b0dcba28ce14a48ff911ed99158944ed363774cd1ea3a2c8ad5d958e75a7f32fa1525cf29b267ca7cd0705d51ce7e7d749e2bbcee56141e6ec3f27cbde93a831585c75f71b67f6536925514e54e521a9f740379a8a2e020c6244fc7dde0938ab29707eb9e9c32414645f1fba77388e4df68e8294ade386548f89829df14a5fbdc19464ebd14252f4df160ef8e3f9ea4287afe9c3e5755e31093a328fae69a984d8de7648aa2a40f7ad65376b6103314e9da653efd24f1944281c2499fb6633cca4f14567f3f75c6a0278a699fedfd7ef2cfc54e941e4e5d476dc88962b8cc217a7d7538083751a8099f2497b929fb69a214dbb8761c573cfa2e13a59c98d140e481c6779828898cb6cce897283f90101bf74eff6a89628c6d4c0e53d96d5d8962f8ce1fc73c644d124a94547ea443f4b3b66b64bdd14cf3fa4b42bb6d90b73723184558e02d381e54244a1f3ac3f4a0d3a97b6c2151483989be31a71e51948ff89235c611250dde1a1fbdf77c48230aeda9abb3f16864924090a502968021a01851b4c68d2ff4a1df956711c5d278e4e531f2b3271551108d0df66f3c8938acaec4d0a1358588426488d11f7abb4afa5870012a401da21c3b84eb8e8c1b6dc7fea00cc126113d7f87a107aa10459b4d9b53ae7e593a21cac93d84a309b91a4459bafb24496604518e8e4d6f2435fb6ea302510c1ad3e0248608e3284101a2fe50042044f941b5d7368914a1fc1fc12844f5a1e0991affac5dc000f6050db0c000caa8507c28b56a26f990764bd31ec1b0000108c002af62810b54b084da43219d6876f44666ec73e9a1643b495f33e679a8a3f2700a0f25d1640de3f4376cf72004ea0e05cfccf83a84fb6d98ed5098f4fcbccd161d99aa0e6dd0f3c6314a0e1d0add22c9daa36fe2ad3994c3973dde37b3707825224a0e85b0be61443a2544c5a124aa930644c1a17c0f92c4f47f0ead372b887a43396574d2254f086cb9a1e43987dc6033a7fac1016843b5a12cb2f52ea29d3eb2e7856243c993489e183cb6d9cf38875a4321fd9ddf59830fab1ac2a1d4508ef9ba2e26fde7b0511aca92414c584d1f341437d8a5e69ef0a9eacaa1ce50ccbf9a7cbbbf194a05e59118fd57ed34575f4461d224b78f28a2a47ed6a3a92336499f8872248f8dd214229ede102a3db37e88923836eb184e374469fc31ccc9d1c7a4a30b5170b03d16b62f2ee14388d237a8963cc9338862b4dbf840d7cf6386200a61ac2e36f678ed650251ce50dfdfaa0c204aa692c4cde17ea8fc0fe54dd620d7c70f658c4642e3eedafb461f0a6beba92e1df3817ae459e24488f75076cf9de23ac65587e8a1a03f8e7c6a33884e1e0a418344a90edf1925c143593b9987ce17dfeddca19873865d11dd61886b87a279bcc77bd4504ddc3a94dbf33398d20c3a94f3fe9fc6ea750e8560efb15355f36843e5509c7d705d27f925a5c6a174a5fffb333ed6208543d9739ced1cccd6519c6f28fb741049b2e21de274431998a69ba026fe20876d28787fb668128f0d85fa8db05ef5403dbf86a2976eb2b18b1093a38632fc883a1ac9221e676928cd7bd67e779d8c3a6828bd548e830c1e8fb185853c031db777c5af73cc5048752bd511730aff983294f6638e983f21ba1e93a1b8b5e9f56a5121c7508abf7ec9729fab8c1143316f4b9b499e5c8d69180aa90f1e5fb449c6196028fbc6c939e9c48d12bc2f14bc25ae697e4e6a784d21bd509cae8f0dfeef42d96b7ab3a977c8f673a1981bf74444bf88b7b750c6ee6da731a38eff68a11831049b103d27799c2c943c06db6ad160a17c8e3f59249fa82db94221e69c1eed86dc0a75963fdcb057a15c92d327879a0a85b8f629e2fa14ca2211e235d8f7ceaa148ad7f29bdc247bd8d551287c5de847be2f5ba9a1508e99653d116c25429e500ce1ac2eafe184f20791b7c7b3fe8e6b4251a33eb637769850727bad4d8d9d2514b36dd44648cf17be51427137ba6e9e8ef6fc9a24943a3f4c7f888cc6f148287c06d349f5365727f908070fbe9b71974628c6ec0ff765fd3e06b90885e497d937e7904722141c456798bb1f426132d3a4873a1142415b93e67bfed78748108ae932c2d7c38150c8f16db1ee0d83cb3f288e468624af0fca18fc4e671c96ba196142f6a078da12d27f1eff843c28679c365eaadadc413965dafb9f6cd6d49a3a28a47410f1ffd1747e68e6a0e4d932f321638c849a38286c8cb2b11a8e4b2abd4521a9a567cffe19c4326d51889343fbadcbfe64590b1a66a7476e079016459fbacaf2f029217f4cc05994be4cd33dc44c571ecaa21c6552e33caf51372616659bdc77ac22672ac3a2d0d55d11caf5323d5e51f2fd98328bcdc3769c2b8a29d32592d6521a79ad284c7c6c1f3aca698c8e1585f0d00fd27df3f1b38a92c324792aed1373d85451887b1a624a183d4b2d15a5949dcb9adc382a202a4af9206470e73eef393b45d1273508129133e8da14e5ac3df14e34578756a52824dbbba86ac7f2a82245c93787915b4b3ff7979cd26ff8c1e324a0280a353a1342464251f635899edf715a7f415196cf48e7f04fdc1293951d424fe899deb3677c270a3ba99f421fcf89231ea97f364fe56f4299903f26499ec7d7441abc6dc3cf4411352479eee03d267cf55c7b9b21db7e894332eec76ba1d21fb7c4b7fab357d31ef4e395204fe68bc88de2e3943063d5089d499467f626355792b8c61e630cd3636a0c8f045123a663209e3a24d4e0a621e88f28b3c3abe8dc11e6c818ed7abba98da0635a2fcb911156e8ccbf74fce4b80863dac818e458ee372ae2f8cd7fe3f844f0a2da312188c073533d3ffa10ed9b98637095ded036c4283feffae464b20bc164fb6bcd988d4d08d3a33efe60e320e890d7d63787a31a0541de48677520f8aeeaeafd20208831feb3f563bafce01fc8731aacc14465fcc0e7f468d6718879327d2859dc74c4dfcc21321f460ee61a670f7c4c0e3ebf2da91e3d94a333fc344e461ecc9307325ebd7da877f0c0bec3d01f6fe2bc7387d54524a675d4603b589e93a70f4daec3f51372c8b76a31a183fa1923c6d509923998f1ec8617e5c04a46caf509b161e2708ba3fb2beb190d1c0c11b78e1ce989e60d9d8e398e279132e306bd432489ca07396d184bd9ee6d0e3e1b76141b526ecc1acce8769d276a38d94e7c90349434a7ab8a3b190d6e47447744758ff10ce6476b9b3736838d537c1855d96c1997219ba08da23f474f900c4ee62c19a3af04c770d2becd301ecd542206e26548cbcf7be848128632ba83e99220187695c81fa33d44f2053f35ec852b3dc68c60171e6b8fd2987dad29825c306609a33d11dcc252adc937f7c2a75ed4c2601e8c4f748fce62164c963949cc2216be725309f70a9564b3c858a1c6e2308f5b054be6c1cf630c935420577b1f079f700a86c6e50f3dc93aca560a667f701b8f289012ab8166a5640714cebe1d39a3b5738c2778719e71326685c30906c996db878d26901d235fc7e5526f0d260cac5b42e27fbb5157259453c6f0e34926b37134094ee3c99a7d1e9b22618c6fb2f6e147e8b45c1f369698636e041d6a4c9f93755d84dd7d421e6b5d8408668fcfad791c4236492194f4321a679c7e2863820083c0d5ce3bf21208e69aa98911e951fec0601d63fc883e38976a6418b378927b3006f171cd7fc851521e280f3b84ec9e873bd8b1a3741843d4c151a3870d21e6c0fdf22fcfaa8f75c4c139aacf1db7c8ce7348f758df0c5b18bb29bda73a32b4163eaeaa8e272d0cf2e2c85910aecb3344b70967ca028d4bcd0f7aba8b457a211ae4ebb175b0b836d6346d78dbafe06dbddbec7147d8aed8af7388b5e2ca9cbdd2cc0f63c59941e3b3c9b9a11eb60a2464a4d4b80c2166982a481f2277a794685a2a0ae793a6ff34425d68a858ce81a4868c553b85fb7152fa759a182a330519269b4d568ad23546bd435b9990c2983339e8778e8ee2d6cdc024925ff556a258429ab43eeb1bab501c66ea683573961f149dc7f08bce274c21d9d3c31306cb4a07bbb154ea84198ea19877ab038913a50db9c96c42d6dd8c364187fcfba842c2224d904925c7333c8799a8cbb1c6c4ea7730319858ee6cc2918e6cf412c59c322eb3465c3df52d513607d15357dc45dc5d09bf5646e5a64421f875248f31823ea8275198f19798d73276742c89f277d23812a568f598abfb4df348489455d6f3f2e43b69d61e5170902c46be518e20737aab31b86eb311450775dafd38a9d5458c287b35bcccaffa22dcd81d43349ca41e45148249c32a8fd1d7433811a548c9d974e64744d1c1962795f01d42dfb64d91f71a821082b8ae6803ed520b51cc7882cb3edce4283384289d4d249f143912a33b886378784671b0200e9b1b63bc5b2610254f99fc5b73d6db1f10c64eb549b488bc88feb0d569dc0f7b7b8ef41db31da60f9846dda4b268209ee143b94194bf7749f7f0957f7e877a40334c9a4a466b827928858ef687479383d489873623dfd015dea1fcc026c57aec40a8533755d98cd7ea3a0c247d8ec48f666ada70742859e4cc993d5ceea65ab839d4b5e3eebd1a299543592a35af2a73bb2a601480a03d0eb7e7b8f37dcbc98043b935ad8ae75c3753fb0d441137c795b9a1f019c854d78652cee757df7061a73e1bcab13c23a45d323ddc1a0a12970f937a497d9428200106e0706a28a6e6c7703388f7c0e53414424ce2c3eaf6d05096082da96375063932ee0c8553bd92adfded028b9ca864cd86e2016930160b0502a128248892ad1300c31408000030260e060291284d025dd80114800260221636241c16181c181414101612148501612030280e07c240302810080483e9921c2302eb07902535aa93488b48b18fd372c66cf09013f19c79b16b1eefa70cad94adc77f0f3ef378e7cc379f02fee106c2af1f4bca1ae8f6bf8ff30d59b243d815b508796c424eacac8e035b3efed0efc7d6237c4c03a15984fb235c486920d67e9ce42e622e718b8f3f248468aa7c7bece0f1f520e6a1c423750f64fab879115694dd1fec843003a1f8433e90d3dc3ed1a74c07a89a58b7540b460bb45a8c1612b5fb64f5f4e365705a0a2a2a382cf28242c48e8bde9a85293a920519b41e91fb44cf8942265046a20712b04d849e881b0990331f806d600488c7dc69c4270a1063597a4c400445d724d7f4138f24f020a28890be123dd3b7dd693bc1ca09d0a8047042f3088a343950106308e310a522d049040fa14d980fb53549b81504cc5f80bcb925c9e5277a4898c6a42b21ea38a227c37711ff9b98fb09901cbb7a082a099c0dff3bc7f7634c80e8920b0f420f261e547bb07c90059123443a23844a873c235dda2ff385eeac13ce5f2aa48b4004f413344cb0244241940fe1ea086d96257021ae0f849e1c10affb5e003927d4bfd142f8ad083d896441f480103129219d6a816f9ebee9b6d0737b98c0f1a5a609b2960009074b0d6d05e86dd13099e0e80d614b7c3cfa9f5832d54b6651398860cf4389cec560d3a25e07f3bcfbd1b2cd0e267af51e23b0e1568389348b2e9f3634ca942e7a6d79dfbbecd4836e31b88d4dcc0d6ada2d70b61a15ebd0ce7bb151951b89540823fb618244f668480332941c1da9c97aeb2c71ea8b2f827b62d3f02c15e6c1d21232d6857276a1489fde5bd761ff6f73202f625b0647a03cbb0343e90361394b1fba358a6399e26a23d3237f48b15fd9db98dbc01a318e63d675bf55c66f2c77a83feafe2aee86905622132392ee47359f7dde4e87e074633121bbede40f84dcaf52a830356b7417fd35d73390c7e3f50820b3980bbd06874b4cb8ec62f3ae6c3a023e16dcf2a77f3092bb9bb7fbda32740976c9907ab552d212c987bb1e99ed886ed60e002151002828570b6078b2e9f51aaad13a42ef4c1f59d92eb762035d7f85ca5823cd1ed1d4f97be2dd1e0abd4e4d4d596e04fdf16253b1fc2d63558d58508f440fb6bb93e37bbaae20b372af40ed6dfbb8bfb465d7c82c7ad8e00b3c9299ddee9a3d4c5605667b39409b865181b3b5645423d490f63c7044788b109450d84e7fef6aa679cf5523f13040683f7197dcf6bfaab5dd23605eefda2d08aae984d2fabfc7133c84cc808dad6a64628214454eabcd5a26f6cba1e506d197d55b4f994de153aee3352b7fafacd772e6ae1b696fe2bc474784caf6eaf111fcfc55dd6bbfd1fe92ff9ce93ba6ad98fda37bbe40bd069db1dd800ca239d754af1fea1a817f8f9fbb8640a63309fb626930b4d9280d206811e3eff989bf3dbd8339f5d3ae235d71eab249dd681d4d5c9fdae3b52b9be5af0b32bbcab2e4948183aeb9d6eda393a397100cae96b477688c1c775d51ddefe496cd3e84c8a93fc4f06e3d5bd925a04a0d22b5e151b00c2d87d1bac6a4858b7aa8fdd8d8f170e1966496b5a7e14f50b9f75716d2035103fc9b8c6e69f2a7b77c549cf57a0d4f92fbca6cef7759f41c0cb1eeb83a7cf29a76d9f7031cca5ee791049f29337a0926bd4f8bbd970f4fa2b0fd6882d9e977713b99f1dd68e8c44deaf754295210b678cdf561cf1360019fc73d9ce5b59bae177bdc10db86ea8afb1b42a275ca387da0a3df0c765a8e2fa07703bb5fb0a5ce98d96dd0b07168878ba5e4aa0dc1abab455487166d6bf439a0df52d7c8ffe1781284182e30503a56f7e640af039fc5487644d7e541ae79b09ba421bc5fb7067a2f2a69cf9b62420d6a993635c3e7b35c0c0a8f61c3b00e862a317a04623f43f71dcd7583a39df89ae970516fae4391acb347e8a0aeb78682dcdc6e0219f772a663b4a8894dff88960157a686955e06147111b92c63c004479da799cdd1d7631c121146224f64bfd2ce6641d3a722f28aa456ecc8b2342fe62d6bc917c2977cf08b3c37d1cbc162efd2022096b9fcc63f51256e108b68088a91741c710d12cf41a4f4d5a55ec7214208a3b001f588776d0fd3f2efa68b4a7b7d8af1721449e139e29d41fc43e033889c767c5b7ff79fd2197421e9d9d894a0f0861acf8e790c143448bad097448174d2e388485178bbe805c2a445b69911be3e282153ca69851561bf560e94eb981e0a80409183641059e707d82579322d3ab0926944b4f6f6b5d8f2ce3d980ef933dcdec36e00175244c904066bf53046f7b4aac248cd4d55e3c670bbd177f723273d8e1686ef9a760daf690a70360dbe02eb739cfcde14f71bcb9ba8f462faec6bb328442676b4e9321756e8daa020f2d9706ada787ffc232b3d094e0472d24ac2db9746fab34869e688eb3c5a65727d8ba8ab245093400ead67729c3478f9dc333704cd1fd95f27d562c98e009939817d367399cec46f9a8617c07f77ecac196a43fc71fd3372308b7de6e465bad53e688246b7669eca42412f11c87b19ed68ff97ad4b0e1b6e6494224aa0043de17940140cfe927d595602088ff2162952b3c76ec5a1db96cf880fb050fd400bc183f649140d98ad780c568ed68e86855badd4e965c789b5e54e3ebce8d260bb83ae44598c06c95631be5d8ca26a2c9858fb278f3d2ca8bd80289ed3b58973e3664dd41f66b81b52bc07acea25b957d2f866999ff7888e3dd1ac0598078d87bd560c7ba274344a7b3221cb5cb3ab708e8997ed2b6ee91d43b5f7a63971a503ab9429473a3b1d05a8a39c88ed9d2577aded54bd29811f6a7aac9e92e30b0b458344a6cb804ffdab60492aefa51a71242dfae7e43499b2945407ea98d4b41d760805d95669747022c0811b90e971624a1c8fe0bcb528670d5867904cf05e6cb2f6ec9be5045d2c1944095f5049dc390d74231ee79641864adb466d98eebd05e16ddff59b572cb4d6b2cc1619431005a105b5affe3c497ccd483c842691a7d3ebbbb6fd04c7c27ec0aaa42ceab060523773f4bf87931b42a6198b6299dcf73c7516b0b583effd575b321698e15fe8281ea346258009b91555ae2d1b98192ef769091de6e94691127c18c06bf5fbead769da2e9c499eae9d955aebc7f42e175fdbeab2e0dcbe2736845370072416350f38aa8a24e3cbedc27f3f48fa4964f198ef452651356e064217b5eede21084211dc21ce713de8f44980d5b8c63cbf9e2496137d047e7b102db30daec62c0c25192d9f8c4b8b9a60b3394162581f1b940610619e10609bbeeb4d8db525cb9a59cf20c899608300b2341cf7d70c2f8fbe4ab23dd30ad5353faf94da4ad46123eb058a1083ef58c50a73b241d66ff24d9f5c779e61e3cb0e80e862de6d8001706849497ae5005863c10314bad8b6c2aed9fbfa398a7467532703d1f747a105e4a41003efc02922636e0b48a9c17ed54a6dc4364bd48e8504dabf0c8afb9b17210a21fc8ed601ca970fd05122a384c089b72f137bd3d061b78f6ce45542d1d2fc8c83a1ac348f921d46f17eae6aec4a6be71b7e7f609c48f6130064653b08b66340cc94840f2fa48f52226c2429574ae43a00c6d025bc8860bfd5540b4b2dcf932428947cce0b433583e488d0d913ed58dfa3c667a915c83c52490ba567561060fe741ed64c1a31195504f85b4196d096e5734696894c82c2215cb5eb492a96c0432e5b0b6af3372647a2a86d4f30de931a7e9a7b7c87e0b7d9c2f20b2feaa92307cffb86bf360deefb344cf662c90a3eeb180c88c6259804d04c91792842b2d78059ea2a549d507469af4f2d1bc53144aa42eac5d7743549460d2ab56150ea17c2501bcf3e8161d79fab55c497553d67f7cfb125f792576db40c489b100c135201ef48eeb3c8990e9e95d3605462489f8bfce1b87cbe1edc0380bdc5ee5e68617ce55b6c90226ab0fb1d07418fc9f705560f0ba50ac777ca450ba1e5e0eeb6218c2da5fbd2c2a90e765ede45bf96e9dd2b3fa00dc114d5eafa0c4ca192d8f4a15c1f0b206d90c713ff2f73941013184a2110ed24d58a7467f8ff42d824894cf8bf31294f82881bf3d9c705a74447414d4eca55797440f8e9854848eb028f42d2127a1e8ea10e71c4c1859bc26a424f81b5e09e87775d1086437098c445de7078fc59a884fc636dd6c2bb430e8629ef2ce3c4fbb68168804431f48a3ce0257d158e216f4c2e22be32bccb48fb134490000826d06b280b972e0138843b0229376cbbebc001b684d7053c85dc3944e9c7af513924c239545214a6c01e914f95309968b76668ef575cee74f979d921381a8e4b439e2c454aa29b94db55f8eac33cfc72e9921bafbd5de2b20fe1eda4c1e22c19f841704bc4a9e237f42967c598519e92f644e501ae7105cb6d6637e4a3b513a9a356644ed211925f2d00f60650919ccfb5dcfe0101122fce324c420c0acb74ac8e80f64182045d322514e9ddf47f214794d830d48f0f5e09c3e561ca2cbc8629eb7c4d74372e68109c03e30c2fdd3eefdfd97e2f4f8b7d06fd6d2ae769a35a9fcb51150d6ff41fc048a2c684eb19223aa6c68777f033d5e34f0689254624cc1fd505a7cb73cff60d4b26e85ca80c533e004a41d0a14dbe7c3b39921ed3534aa990bf2ed7569258f66bbba3c63087b77c254f9d7687f0ae82c14a13e11bcea2c39a190f1547a33e517c1820532e4b2c0667321be289193b44266d99c4c6dcc41e89d645bb8af4a732307aaaff61c133513ca15b527f2d3608ce0c71a9e6cc0e19d7e2192ce30017efc48d7d889834adfe34dd6e8e08430d17556982dae5ef52fd390269f5085ec4cdf32fd7540088a4f3726385cea2aec8fb12358cfa7b75643c56d829c2031409d85e06d92e5f75d19dd0826908a23f3eea4f81b8fbc921b826f5b7e65ac874f2b01f31d22c7a6f89a1cbf999efd6b2be5e8ad680644f56cd4cac719d11cee0dc5ff9c28d149978a5f0493a728b1be19e791e5a89cf1427661415872fde6ccd09a1d2730cf24ca10b9cacf0910a5e6895ca6adf886159800658af1b07766810dc198996aab8e39478c93fba4b44e2ef338f74553da392c4f35cbb0387cc44226827d7751093d67ad4a74ddf34b0036e966a63b0365648aae41ca9feac0841c918e97cb56dbf3428b9218f39b5edbd972d3861caf7f982d89396c47672a234d4e3eea9d86e70affc349f5cf9bf8bb7490f1fbdde80a949fd413a0a45724394ea45e1be82013991507d35dbb21bb4165ceccae5700ee3f323ba4362a45648dee7e09495893f3006090f57039fe2eb830f4aa96483b08ef8d166e5a76acde04bc1eb08518deb60e863c664525e8447bcee96d73b2a42614f1e10ced287de3f1f305ff99c07c9d0eef053028075a7cc4be0fb303f6e080eeb04ad49f23fcba582ec4d84f225fa0795e2119f8c47633a987cc2e4376797f805dd6e2a1beb4126624ec5e2310862c7c269d0eab25fabb30cf57ea9491571eed860a6da3241c2c3136b3e5b4a975026583f9fe74a8147a80d0200a1aeb2f94f846a011e34d13a9e1ead199130d4bb2fa30e319b42e1e319834ea2f86db9287ebb25fb3062d29655be3b7b381f4948b575466a36a3a1b378ff13a04212725603d897a1fe203569ad1f8000cc0c615762bbb915e1596525ceea6532499cbb9127bca209157d7af72a959d73e621bf728d4cff3088acbd5313a52514485c1d15f3f03d43669933cbaa73824656d2ddcd832e12336134a3d2c43874f417e59221c94cae5be1ab9e9a3dc017e9fab123aaf40b7f418eeb50dfa82a0974d079b58d05ca2e2740079e01475557535587cc0b2a9fd028a4655abde482f1760259de43998a4850846034d3ca73305c6f2d7634f6b82c7bc224fe9a4fc9aa2fdeeef9bca7bdbbbac0ebf5b243d8c9bbd2d0e97d6ad4d28041bf3c480467435681c8bdaf3a3c675e242acc7cffb82cb4a33d2d3ef3a90d492098046d5d173cbe6a0d41f6b9e33c6be4b71113b487dbc3e8ce605b8990cd683de0ea58c9771638c7ef21eb3c7bf46deb9187533672a2ac07a9c5070b50a1dc09c22fe9f2d6594431e9238570cec4753e423eb6ac50bdcbcdb204189ee102b85ed7f8825731dd24042f27f50a884231e86e050920957c40c4af754d253cd10eeb9a23b0e83660235570a64d3e4a91189c71ad4725a4aa0dd442c1abf410d18338b190c46af29a880ac2754f91569542082525fd793a49d13c05d62420b5691a566c1a1814adb582212774e2055074f8032dd9619c14ec5b810c26f545f79093c09ef8982f5d3d8ceba3a5b4fad61842d9b18a70f7c111689ca92a93ba4a0385d42cd920b32bfaafa11dba3d248444fa728554103dd54f04484bf4860855965512a1449f20405c2cae79c5244659a17a31d0a2eb80da9adf51bafa2e32c4e9d5722b40a395722d9b23c6ed95e0cb20aad3eedbc5dc3d9f40d9520b0b8653f6c96a93f9a948e0096b38982bacb4d97a92a61ac00418ff500016629d79470f3f102b4bbaf4d56616d1e9397f873b4a146394b3685db4e3409fea1e5681ab793b6ee16aea4db306daad837ebad4283ff1844bc59e586f4e166b31497a32d350b03152a8a3385431eb06b20360d99d3a3ebeabafd0276bf99f078dc0bccb7cc713201ea404874921bd3425285a7128ddfc2723cd5a2a01df04eb65273fa0dea85159e0e487f7d649627a6637888f882b5e19005824ae991c82c210cdcc1f37b0b18fc5d62e665e83109fc164cfa20a25e538be8afc7af03d6e8d33dbd18be45234cd54e16a14323c0588f1f1b47119e4e9a8ae027374690132b0e440dee6754cc2a03ba6c7ce4c76da2318bf0c5c053e960b853102baa3cf9ea544f8e0102c9ac195e611d787dc6425e1abf2d91a3f7e60107ff07e82215879c45f8998284922146a174ae92c25af3c33c03e7657bf49be00ac716edf4ad2191b5b107f17037887551db8022398ac0c6b188ad96f8580bfe91723140e6fc7e935a7fa6c7810d28074a861f144116d551f0ee857df0d6a814647cf8b361d28bf1f7bbc5364ff397b39bae6f2c814d8196dc8b72bf7def1d46c45c825f0a21b3301889ee1dba286c2eb37cb6ec67d73cf62cd80d25ba18119470f83c24b52a09cecb3dbe45e6287774f8e127f1cc0685508a32e827f0609ff58c313622f0ad23260c3206c33931864359dfd0a56cc5fe5c7c56b6dbd4fe75689e56378aabc39743bb2c2838547760845a2da46a11d8a183694103f89695387cf183af652bd31b98a2ce94c10d9a05486e3ef815cb3859b50bc0ef8cb4fa26065346bed4b9faba950c5a6372fec1b71201569025f944c389e935b61f391f5688785f109e7647e7a834e28b327ff5435321b845060c3480aa0addf7553f9707c19ac7598f2a0a3aa79d970409c34184e6cd40f9feb5c4e4fb93f1300abe0710554631682c62c3d4aaae15de12f17ec29df802dec46f301c50567100d6e8f2bf03c3d3ef406fb19bff67804b43ad670bedd2f370cea5b795750da23bb889e964e7a8080886dd41cc1e8341296cfbb82f743ce0af3627ff5d7907c0e4d4d624480a7ab049302b019de38f821776831614a53933a174c266278ca6943afd511179257c59eedb09d9c00ad8682a000288472af188f236845ca3aa578630ba1fde06f4d4c638f19442f1de512e046c0d7270875ba1eb4b7f114cf98dd540f30bf8905554e7bb5395ed464d90246ffcae63202ff1bbc28af17547517957b43d912d179ddd5c034f97380998542f4c094aab48fd17d744ea337d74665406510118d528ed28fd25cbc28e07069e9e2ad4fd1bbe61f1e5d2e09aefd36b7240e4ef7f69f40af5157d842cb2963dd3a3e7e8c78a7a25dfbb725543d1a217cea9ff38194edda9bdc0072942accc63da0bfc4640074ac0bcbe3ed1b1f52add540bddda71e4485491a2f773954da750e2a8d6e230281ade4fc378748708790124310b681a6ac05cc2a03491a5c1f5c97d3e15979a2bf1e3b5ba16898ab83823b1e41f0f4d2e2a1184f2fac71d7b510ef9a56c00eb9acc8f818dbc376d0ec06cbbb392afd1d0716bb37ec82cd6ee8ab01cf30d9b1b28bd12edd7653b8bd2bfc53f3a7665ea73454c96ef43ee374c4b18be4764315ed17aa033b7676467656dedd740d3ec261b61bb50d013661b29398ddd4c41efc50bad762b2559ef7b58c87c71213b878d77b43dc163e5ceccf65072998a75f5c0be6250e0af7ae5ba070915abdf9e34b25232e38f9be40c69499c1fceae6a0fb11db45db8609f20a6703ed7280ce6d0f4dcc6ba577a0b7d92170e89183781387ace030d0e75dd01f96ad947611d77518410fab19687df9d8eac620da7a2c2fc815f8cde386b0262000542f1f99e3fe9c41d485417fa6c20d08ba6bd311146ca83839c7b20cb02179176c59a2eae4091f3b3b02624f0e9c6a39842f34f70a97c0c6f93af7e51cf06c56d5bba5a814fbbd3cb80cbce32e4e11e09b1a262b8661a862d2a2879d60ad3c5a822c5c129dcda28010601a078e74190ca97295e86764b2f7db5dff2f18b8980a09b8cf9c7b87c668f85952b7d24e69301cac92c74a62354d3774a026e727137ca371a2c222ee05380b1764a3bcc8e0da4eb71d1cbffcbb3aa2d71204d31a3d6b18100fafa9973251218789c8fc03f127d7e3c03da20721e8856b4a301ad820c9a99a7008e7af92925998e7244325e9a0d4df62110384b4fd8aaf7d19162701e89db33d99f10db76f6f92b17b2af01d60e52c5edec255a69f4375e6c814f50e1d59593ddddd246fc63c76029cdf428869e77ad8e6c0a40ba9f7ad1ad241e2102ffc6baef1f2d3da4f514d7d0d41e25ddb190fafaf41c5c5416b9eff75342b46934421c252824b1b5e41b4039be91fefcb6a9d9ac6036c8a057064c11a559a161ce33973900b8580abbf365070c2285f3c3e56a4303afe5652b7ee4b8ade32e7540ce9ce69fae0f905e2a99f48152c0fac715f544c90021013b4b72a5f0fe5c02d4208c190cbb38479ba5544cd564ba121ee6cbf9e37c938752e6584868221f5ee09aa9cd2de2ca130aced9534c10dc63340d2702608726d9653b47b25bc09fe57bbc63b81343c0dbf8665505fb78a32e5a94080330b591b30c99f3c58e8c82bf3844fe4f760d087fce77ee0b508e0cf88901267624477efcd95536e7302c66d3465dbfdcd28c5bfdf1b44197bacd8ac0020342efb8b50b1c804034886f549193badc7779e6c4856c40f277d457a76c4c0e3a8104206299272d19741803d63c37bc6d71d26d88a3982587e97523b2d890deb86ba81f8d03ad5ef1d203e2b7ba56ef127b771c08bedc788c04249d3d5f923733bb949b3dfe2eb4ea625057eeff8489b8a250cb0d21ca0477bce5abe38a006ad63f4ae57778f2ab4d9ea0c6f5ea450dc6f4daf65e4ffa7564812f7c0db8959bbd36c04d9273b063cfb4d2e9811c7b60832fc64b9164e742b955e2afba00a4c900521ffa8ca7f95f0f370b548ee01c13f951667168ccbf967c07e4f82e534be103ffd3ebf12dd12b6b49f5f855957108ef5983a32d3ebeb6f76faba7b358668588c436170d5225c92e750e064a64a1bca42b5347422586ccd435e5d428eb8be21d5ebf6296dc062d2776c6042d9f6fdfb0110b35e55b9ed2bf52c6d387dea2bbeff1d1a06a2489c367c20a41458eb52876c2d87f5b2ef002ddadc2db8d5849903f1d338e3a3ce29ef3969740fee5b9f31ea128eb3cfa96bee96455e40ac64d0e66251612ba45ddadf4d39929a6f38db1c53b09e07d27556bdebbc866c6f47f971097e45444a14581ed9e8943faf9eed86ee188c190b4b1b9c1121951ec3620f32b5a04c7fa5fb588a6c2e509ee3639e3dc81dec1e35a25e6d94984ab2fd3a97ed7540007d467aa8c6d79369001a9f3d59719beeb734e21dfe1a289e8d9bbc23fee7375ef2176652cb013bb2a10a39dccb9acf31db4609cd6e7c30d94a3004646fe4e2a0e7b65a6caf7257936da76ad58da1ca65f5a03c3daa1aaeb2986affb6678028da20917f686d327119f2dda9fa9903c91579b170389d2a76e8cd87eb9e22539d7567be0a4c6d487979d7f36a32f7d88982d89c12acdddae2cc0911c13d5f4bcb57c0bd6b1a5c8d9ed74a77ad633587b2e2167f45491025bca49bed386fdf45c9cebe7d248a4a2776abfe23423a30ad30c6079701e41f83c1416bfe407cd8072b799c8235b16ab0bf497c83cfd61bbf35ea07edeebf58f6229d80bf99d52a8d8f8395d0d96358ff2c45ec5f59de42b883102ea5280d2ac6e688c9ba4e6bf52edcc10aac39e3c22f039e3a629aa63d7394583a7ab1ec85fbba6d7a40501dfb429cd0df76849ed90d4aeeb8cbe51ee8f289817c5ee7a4ed79f0558484a259ffabcb6e63f35cfc2d2776d0e8e2ccb9fb0e8a2db8bb6353d0eae5ccfeb4a04373c0fc606225527360e639223ceac81629bdba6f0c4efde84f2aa8e07f06e56fb197be31ff98ae230d4df686833350c451be996cf088ed07de9e508fe3d87e6b25b70ce2be37ced032c8bc1d965cef86b7d9c473226f0c27e30449914ed814ad87346257280aeb40647d738f819d84599cfa4e21a10f6b807ba4755796596a8b376278b76a726e46d6b21773420ffdbaae2e926db10cdb9029a3a93de02a355aa10d19b0ead3738376573c272401b632d27ac0724dd14a9b07b22f1011f86064c30c945bb4d4cdfd50eb93241c374a7aa46a459a437e4d3c260580c440f22323804122dbbb68a6c6c34fc5776a2e6a49bf92a034b05c89d0d57e24674b76c0d04effd7299e3994a390250ccc6675b046c224366bb0b5e227d84afccd67fe5dabbf0b6fe2d480e22469add649444429af48ed0118bfccbdf500f8a4486e8cc76dc108e4f8e61b055077b54b4f01cc6fb1e73716400f3d35902c6c70ad3713b5613e296c46a7ce6fc110b64a9c9a96531fc1acdeeca135321c452c7b804b8da3b2a5200b8b96b98ba03f4be62119a00bb7e018a0e6f9509425274938136f4e6ef0ecc020afaf5c58d87d2c65fe67d966515507439ceac8382ebc99391a66a09131c2aaca6a189b9877cb3210e9d26fa609016697f37525592d092d37e0bbfed4ad1d1cb21d25b610f220d136f3e964182061d9e469259390ecc2f3c838ba72b1246cbff034fb7ef98d369be118900aae502a16f90d9ac91ace0ec3517cedc80c65ac43f66039c6daba6a74a6005e364e82f4862ed488c6939770cc1f5d5ae14313d8b61d40c1382c62a5633be62c1680597690b6ef637ce47ea23b0024628d07b332ca752d0c0e5d15c0041b023ef72e3b4bf531dccb32c33721784458e0d966b39d527328879d12c0c325cb601faa41995a0b256e2968234d289269863239f9f865891dd66f0180b8c2921d317d9c03e3a23b9c5429bf51a78e5ca5391e46c739d3aaa07623f6cac2e31da04c4eca805b385bb607ecb9c5a215525e2af0b25d468d88ad5f183c6458f70b5876f50d78f31a5b938f0c381bb70ca801c01cc44d9c9771aa3f573759912311db57f1198676b5ba6a7bc63d67d13445c43a8749e74261b15f5d0a3b5cfb9ffdd0433a77d18e9026b43507920e916dde60543bddab472b6078f39685d9c8947400e4c080f38e5182a174afef586433db2cfe702ced6511d2f5ddb5f6f541dbb5aba75cab1eb14e7d3b83837e3cc364dfc9afdb00eebf02a6dad255716542199fa5889add195888506a2e00f10e49e69dd0ec290d9bc3c662d4e239faa874af12fd6a17adb2e6e25e7c5bf91efc91411eca8ea31c00256eede6fef03b43d9c7ac00a23cc5011a17af7b3380b4940ef030c30c33cc30c30c33cc703cfa185be766f66e29e9fa6efdf70414eacccccc4c959f842ab6cb398aed728ee2bd2080078607b007b68eeb86090de9119a7793cdad8ea246201fea56348e4f111a3debad1c424389e07ac8bf7014161d42fb917b83abc89603154233612cc390e1c4d8d6e24083d0ea7bce8db4bd524e1e10da1c9eb2fa5b83ca9034417f70c3d4283639d6a40fea57f9cc8f65db82d58333de149284d99d9f07648f54d0ecd9330c7770f44eccfc7440780c2d87bf4ebec941fee1256276e5e0260e4871374ee706c6ff4bea501b78559a35e32cb935d8ab2bafa65c93140deec665a5d90c5eb3ec4e1519dca1e1623762e0488a79260e832db53a5ff805078d97b363882c31e602ce6148c13f6235de02bfd253aa3594056ab67bbeca4d1aad8206335137a3e43caa704b5eb30771298d5a2a8a9093e1fc848d252af2e4622df213373d05492ba3534cc1496b79060e4c764164295a29ffe4152f5392a2cbfa188864448b943346d1b4066b201ef137c69ea268bd32fcac9453e8095a86a287137422a418287adf580d93296af98936377524e253f34c7b81f444279f1d912b4988a712086427fa7ebf8a5ede99abe1e4449f739cd88b8ca347ca6da2cda90cfbb2e3ab01a989fee7f561f5a570b92d44c880cc44e31de7418392a81f31582815564162a2ff70e0793d1b29c84bf4b83cbea7b2d8628b0f5cb1455114a425fa4d198438651d3364453830ca06598936c730fed0e322659094e8f72d2a68c84e02a385e16212fdab04cbc8302c944c80314849743af91cbec6982c3c127d4f639821c7190ba52bb6280783848422163d61a1248247f4d539435f6278d4f860a1e4881e7f8ac9df75f4410835a299cca854f36a6898bc67c1c516a55c908ce8e27290a4af295e615a44737d1d2547b662fcec7321820f5cb145a116a4227a198929cb5a050ba5c1824c442fe68f634a8e919024254122a2934a0f21a3470b2986469087e8ba4d5c11a421dac8ab51d47a46534661a1948577318c4e9085a8421c27b3f02eb6e0e28a0e3c074230e8074908c5f3630f7b21e57d10aa64781d7ba9d515411c354f6609e1f10dc429a2fbb6c789116203103fc8d413e633ccc03f701d2ae6ccecb6de0fc33c8ef39494c4fa6023ff5c9261a9e513483ef41539e71bc8bc667df7d0acceca6988bc97411584d4439bb356f4ccfde4a18b5d0b31e2af3a0e173c741e312e9546ec481eb9437b9d9b525af767bc6e873e364aaed89eb674781d9a89e8d0b7472f630ca7439f2bff6f889779d5c3736883c4c739a776a98cc2726862cf03192d390ecd8518cd4146c9c8c784439781b4b5e7c9b8a5e01bfaa01fe263495cf36a6ee87306b142ccd2a71db7a139f5e9f8e32042c68a0d5d58d18c4a215d8db3862645372a93bc714a1e6a68824c8a98f23376494e1a3acf3219af7eeebc77d0d049a5907b3e328f85ce19da779851f4d598a10d930e97ee9862ca656875f2ac6f747cc972860cbd85fefebc9e3286b652c8d6ccae88a17d5f0f968137aef87d187a20d1cc3fe6ec65efc1d05883a89357276570fc17da14b7a722c60bcd6fa4a9eeb6ffc55de8a1793e7d57cf6a12e1422729877f7114c57ce25be8e5d33d7386aa165acb3866b38c7316dabfd8dfcd10c30475b1d06589d67929642dc9c02b746272da40b395c9e4acd05a6b74929691cdef55a14d65d629399e0a926375f22e898db33c05fc7d42d0d5580a4d34af28daeed9e25751e8524e512e5ae570ea1850e8b3642031e7cc79429fa94bc4a2729cd094e498fd2445c6e634a1abcc8dc5e1e49c1f84099d3606d61badc38796d0c4c81327e40c253421192e6c044d12faa41a7f7d7d247c7a5943f2303942db9ba42aaf5ffe2e8dd064f5f468c828456835a4fccf6411a1d7cf101b633577985186d06695cbbf6e92561a21f4322926292d85142b1f843e9b5b4a712e40e84c4a47bc75923fe8777d3f7ffca01131491f68217bd067fdb79862d6a873111e34794fbb43d6cc93213b683a84e54bfdb90e1af71ccda2c5fff4c873d0affb6ec36f71d096363c7fffd8de39dfa0cb9225dba0074142ce2838ca78f11ab49da3242eec4b83f6f2c60ed39993e5da19b4216622a6b132e8675ffa41ea652c7a0c7a3cf916e163cad0458541175eadb2483e066bbea08bc9075d69bebe9e0b9a5f89cde71d3a7f942de8b3520a611d849a9f2c68de3b6f65e8afa2c756eab12ae5d70a51155d74ff584fcdc83a928a4e76f53f7e4ede63a8e837e7ec8ca54ed16488775fc7b0921b678a296029dae8d952d1c2e64f8691a27fd06a1555328aa6a3616444149dbecec5d8217e6a3514cd673cbc0ee399cb03451ba941cc78937e468dfa44ef1b32e4b58c277aa029ddea51ea449f5264941d3de244631151aa1e71a6379b682234471320c04cf430be32c68fc7449be462e398b14bf97e895e1f551e4ff2b0449f37cbb4836819c5c855a2ad68295ca63b94683ce33dc50dedb91533891e8489cceddc2946cf48a2cf9f6732cacb47a2cfdb5931d1757f4787449fbbc93c384a7d808f68a2e774cd196a1cd1359c8d145c66f353a6114d6cc9fe58c3c61b328c684f52763ccaa9673c6411edc72c75cd37cb214914d1bc7b8a29e4f2522c49227ad4206a399c0dc7a123a26bd4112b21c30fd1f47e88a4fe5321a96b887e236eaece99c9dd6921da248fcf33ca48521221fac77e9a4134d1aa3153ac25882ea4a4c81854148836cf6554b966cf8aa30708886845aebc610bd1ea6b8e670e3a65c4a5f5000c5c0100312c213a79fc2827c7de17a6c742298bc6e243e0058880031cb0c5be8368e3c6ec1c42b2d3f423887ec6612a0d39849468d406a2cf313f535bde00a28752d19aa9671abeff8776434364c8f80e5abe1ffa6c711e7654c7b143bc0fbd5ec8cd9f71429090e5438fc1c4ce5ae2b181b57b701bcc35cc11a37ae851f030615db37e8a651e7aebd0fdca0ff1d03cfefcb09cae6ee90420000108a00bf301138420157b875a3cb7435156b753747c1dba8c2d1d7443b36c2c1dda933cd2fe32a1913c73e87b5cf4e1c5946275470e4d6e0bb7f889435fb2d7a5b932960287ae4284984b33f386de628a0b3133e386d61a9b05dd1425a6a70d7d1ecb293776776c316ce83724cb1afab4a8f01a33f249a786369c3f96e49d456296865e245387cbdb327a1534349729c3fc41e50ccd49696e104374acc89ba1472a3f9a1ba40ccd86d9a83129379e4b867662335f55b2f5cd3134313148388a1fc1622f863e67f93821668a94611f86ce4d2284d4d1d44e01431352a1249c5fbe10f2855e7c2ccd624b63247aa18be5601cc5f5adf8205d68f42383489ec3fe380817da102de4388de573f65b684d262f6bea60c9f15ae83a83780a9ecd1d8464a16bd01143554a4c51c74227f2f132846ed838bf421353ea4a66ebc870b5420f2bda3fc3c6ab50abd0f43a92ed4b51a1fdc60fd53242d8957c0a5da9a534a90c9742bf193986a69ea37a4e14ba780cb6b2f750e8734ed962fcc725984f682663cc25392d6143764293d52534344c13ba384d1e27ea4c58f2c60cb3b6bb844e7a52caede82aa1af9443c4713cfac8dc24f440b3312ed7c849bf45427ff132b7c884fcc7f6085df60ddd6f7d698e37c229454b51232f426352791a66f554192642a399d124c591572687d06b7c99f0b0bc783121f4d13d69109a0d9728ab9004429b3b6588fd9d25c6983f681ccfc6394ee12fe5d107adac767bce9688e9630ffaa8a739eb45669424e441e720a772bce1b0d5dd4197f242c839cea364e8e9a0c9e2d515ddbc1cf473a171e96c8c59e2e1a0f714d3291a5648f2b9410f62ad572fc46cd049e5835d89eba1afd5a097f814d9b69e089fd120bdd6cc0c33c366d07e48652933b61cd1c8a0cbffd43e2de911bb1874f1f0b14c66771409066d686d8d559197da512f682ec550211f65c2b82ee8adb4a346df8236bff2a2e77459d0860cd22a9a1df90a613aa6078f54d134ea06396652d1744c21bab21ba7c3a0a2c91599749c728a1eec4f50cf19f5cf628a26c476a728393eb1528ae674cc55b5428a36678c58a9ae22b11f45bb219fbb639992e48aa275581921b5d3c3aaa1e8438ef7e44023e5f540d1851cf1ea9361bc0cd3847ea2df141b49a3b821758827da3c295584c610bd93a7135de497e46be6e1449bc24437771f37f9984d349a9377e71c299ae871eaf2cbd2d02ddf67a2e90c7452e898684352ccae14b237f2fc126d46444f39a7c8f91fb6440f2c738c5598781cc34a34579a9ab91a4889be577b2d85a879d9b949f46be69e44bdf2c6d324d124cbd41f5235852857249acfd0632b79e3090a89ce32726bf8483aed3fa2df98b08c2b398ee82c3e3ed8761bd15c6af5c76c4e88b9c38826658d90d8a067b92fa269601663c89e62d9338a683347cb9bdfd42ffb44f4e13d5ea3f382882e669c3a441b52720c642ea7cc540cd1446f0c363d87fa64be105d6a5e4abd97bc632284e83524ea87cc90924507d163982de6f4cd071741f4ef289be48e8b0aa107a2fdf8fe6fd1980c6f296feecbf80f4dd489b13bf979f67cfdd04e83cd1959a27de8bcad3c344e99d562ca87267f9cc8a830f7d0c5c827f2399c4fee510f4dc830a58fc779e8233cc5fcf0bea82d1eda9910711eddb773eed0679fe7b18cb79165a01d3a494fc1f2b754af6b7568cc24e77f90b742fa45872e25ed78d9bc41ca399a43f30e5b324e3a9e140e95439f35070b3baf39a2e3716845e5724e9a2c387421ceaeb6a9e5a8ced037749a1b7483ae340f0fea863337254ed6909611822d2850027740000cb0012d3810822d2880086d439bf72fc75e790bca8646dfc4bcb3816b681cc6a808bae629734a0dbdc791eac78fc382a6a10d1aef2fd1bbf3fba1054543bb122bc27de26594e780073890051141175a182a1ee8195aa9f83a295958a43063a1c4853fe032cdd0662599f0e4f1106cb145e509b40cea396c94246c8e8512d2391c38c0a503940c45fc96ca1be7628b2e88671b0790c023808517d031f4c0552aa25cc6699112439f92a5c7e70c2965c5236818da509e356afe38a69a342328181af34eff8c43ca345783a05fe8637cd7608e4d20a8175af9d4292ba7b8f475bbd038b688d81d16e5429f92446fa5fcf1f398ba854ee3eb86884f6aa1d3ded89f7128c973250bbd86a9b06fc12486075241b1d0480899517abf47b77c852663240eb2486e6e67b5c61b4306321db956612429fea9546835497c5b74e5cbb08c023081049040a7d07f5a7c4e51baa1396a0095c2b03bb7a58abde98087a06859011a855e4230738d9f1d140a4d0c973fe4b49c537bff84be91e48c330a8f92a939077542d716a3351489696fdc16470b0e145d1ab409ed5b4fa75884abc699093d8e793e2417cb129ab308e141e795d0871c914f5dad2434f1730e991dae4868639c3dbdc87b8e49abd7423b6a51e996ada2e193853e64e8bd98aff7644b2c3473d9a93fbe41c86657e8aa7b2de9b6398897add0470fa249a2a5aad09f4903c7bf59536e4f855e9256454e9e53a5e353e81a464df3888751f99242e793e32c74c2e3a378147a14216b64ac17cd370785664a2364d43182a9a53ca14b07f91519a38e1db913da8d5149cf523927cf4de87d2a2a658609cf39cb841ea6e5f595f89699e34b687ad242af645f68cf28a18de7e31b9264d1d05512bab0c161ea939842702412bad8d9f03115e6651a4730f535f75e088f119a78ed1b1a631c0d5614a1c97231a67db6835b6e05117e18229464983a8426b8a53b9e103c523f426866572e56b40e6dd1c2042b82d0588621493f5254510d089d58bec821a4c6592afb83a633af44947c6ee4283e683a69b8f5ac6783e97bd04c237714db330899731e349259e2216b6307ed6f6a27cdde29b7bc3a68a7a593bf7496837627f2c741d795c2e50cd28357e437e891698810515382796b83be32ecb890315207e7d6a02bcf3c113ee5a0b143837ed6b278debcfe56cb0cc699b14c88138f0c7a6b9c9d338a3f593d128346e3ef76ecc0a09393deb08e626458cf0bda963c397a667ea59a2ee8e4cd73722349cd496b41971975074fba5ac1824ed45cba777b4aa366155d54704d0d5215c93d55b4991a544b7fc5fc1a4e459bcf81866688414527c9336c46469da24dd1d0a7296c9ca8de149d7e690e3b9f97a271d354d7d5b7d80693a2cb41f6245c068da2cd1d3a8986d645d1ca657a860b5f28dad91eb1681986395741d185145f590dff446b12474332d23dd16588f110b24b48cdf94e748ec27cd2c69ee31ac389c622fdb389dee1c7b5a0f9635a8a9a68a36bd6d8df21aaa77026da5cbdd9eb184e8695c74457f192ba8777556cf0126d65d093ac33e73cd259a2ad301273a3101353e354a2f309f91673c70e5298127dced5172e7c9d0419752811e97948a2cf08f958125112521489b62a870f3bae797a1990e8e34ab4f4cafc887e73f484508d3c23d138a2d78e949833921f89e14674115ad167ba43c6d818d1764c21787556cd1a6216d17f06da25119672e328a2c9da5e9a42ba1cc42d116dc630e60e175ffad747442bc1e31f446d18ff720ed1ef3e8ad2fc98e79a32441b3298fc62d992e5140bd1e6f1a029bca5235f94106db258b13b5cd296141f44134cf3e6ec76d790344134711be7b9aecacaee02d1477f0c4d7cac634b05883e855884d849b20dd63f742297b1e7dd14f5a3f243d39bffe181c6ca3166fbd0c78c3c94794a54ba7ce8da61ae2c51c2e449630f5dae60c932de49aae6eaa1df3c195e56e8c53c9f3cb415dbbcb23a428639830733f44b21760cfb1ddadc0f9264e7c6153e3e03dba107d12a6bd278cb93b23a74164cd4652fc57c9860a14487a6917ccc19eb5bce5c4370b4e039f46072a8a8e13fe5eb170196c3302bbc7806218c85920c380e7dfe5e44e89421f2c658285db145a96238b49e2b3497fa37a8aa7207fc862e96c6cc30ce7ea89063a1c4859b41db45088e1654037643175af625c7a60821f65a189c40175a6ca1dc0672faab6272885d54d980d9d0e5f41ec9c9185768b185073cb0c527751182a3c51a7a2f4996653d54e4cfe98016ce8546a008ac8636fe573ead0cdc820b0d701a5a6df76baf52cf700ecb00a3a1c7b9de21fc5cc73e0c164a21d8a25cc16768ba3c78a49c99a149f165523cc728cafc6568f263ce304b0c5177dbdd0293a1698cdb93583a6a89ce185a4719597a8789c5d0a70cb6322b7018baf00fde4d53e3c8040ced75a33cdf38525075f017ba101db5c38e29724a8f17ec6e24e340017860045964d1852e825845ea4971a151d7c89134e7d492744c048c08b2700a6c03780bede7fce09aab167a20f32023ef4a98f4b7700067a1dfb83c625a39c6425329e3b3eaf8a4f9295fa1179f7c106d22f99e652b349525e6f087ade6c9147015ba103d95732c1553ea71d3802cb2100102f81e80812b2ec0546853081227e20745c0536836de1fffb86809029642bff157d59671a4d4ae071c70c6516867934954cc48681c6528d821844a278712262e3c404f200138a18b169d0cbb32a3a7b609ad56b45cbd9e1dbe419409fd37aa38ef07f1123aff907365ccbd127a181d34e3cbc9a1cb93844e563af33be325c46524f46fb2418345ee088d24cf17536c673c602334667db21f3bcaa43a06042e421b1ee3d69c5346f9fb418426263f98945b31aec50ca16dd8f959c6fb1eb0105a9590f366c722e3afed8083d083ac6f29721aee6f06e78081d044c3f78c9d9072c607014cc0c5047ed08f47b1ca1462100f215a5cb14508cc0ac03e68629286bb52f91e74d15622e13c6e9610a9ec22045c6cf1811218dd651eb41f0d92bb4ece5758b150eac2036ef45a880001835801bc833e9eb4a5e48a6e197944c0012d5407c83940c601f20d906d805c03641a20cf005906c831408601f20b905d80dc026416e0ae025715b8a9c04505ee29704d815b0a5c52e08e025714b8a1c00505ee27703d81db095c4ee06e025713b899c0c504ee25702d814b82ad44d7b8c167af18165a82a200630e584ae04e025712b891c08504ee23701dd1c48896fbc5a1a7e7cb36a2b90ecd979edf33f0ea0ecb081defe6ace8b08b68665cbe3b38b24e899f1a56116d9658191b36116d903c12dfa5afdd9503c322a2f7aa48cd19349e96710fd187206e39a599bd9269600dd1b503f15c210e5b704001f96211adc7e538c9a02ba21119f7a89beb5de948441f979a42ffeca587f205221ad9528d97518e082f0ed148ee0ba65ebdefe1e70f5e18a2711d2b8ded55d2a1f4c18b423421bc6545f587869513a217cf943f266f8a1acd178368561d9f578c9a49a2e485201ad916898fc920a2795e04a20fc162fecb92636a905f00a28fc1323b7bceb061eec51f1af354eb3cdf50fe653f74396591148ef184177de882c7dc30135ef0a1d99018f443671c25272ff6d007cfed0ca7177ae8bab33f735b8c3fe7a1cb913bf94744dd08150fed7c481e17f244b7d0b9709279875e63638d1ffac7b44397b16b889032ca088c651d1a1f178b8f963c89ba7841872e380ed96196c91cfad98d166f8fb229ae21bc904399c462b0169785f0220e7dbe0ac93a744ae1e51770682a2da39347f686a623a5d25307130b921bdae91472b9686ef3cbb5a14d3d311fecbbc63d0d1bfaeae83e3de717d23f145eaca1699425be2963ac2e991adac8fc33fdceb8029bf0220ded6445fe0ca572c9e744e0051a5e9ca1897c4fed31d30db816ee0115bc30439b428750d70d3bd296a193c6678e3f27c72064e8e16e980c25a76e772c164a6368277f77f4bf440cfdf8ba5978702d2107c3f0220cad47c716df9b8fcb75f4c20b30b49f2957d9b28f4ad2fc42d78d2ba5529e249d42e984175ee87276658c61d9852e788b05d9506d71a1d1c8b3f929e545cd21442bbcd8425f9addbcaa73aa96b4d0e51073bce80d7734bb2ce0bfd12f2ca4f2020b6d89e4f7a9142972dd8b2b342731690c7f214ab9f7c20a3df090961f7ff04515ba3ced6495e1e705159accd91647d11edbcb1753e81ca71c2cc5b8d497ea0b29a057e6d8db27b77258f7b1cc7828342e532905cde48b27f4295bd0974e8f13daa83ba5e2f0a1879db3095d0abd3efb196cdeacbe604297e23846c6d12a1b525e2ca1b9a0b329a6725e28a1871f219fc5ddb610c18b243471e3c7678a21468a267881842633789815938fd09f5f8e13618d827a8b8552b912bc304213d5de71627b5184b662c6134dfbc242a90bc7a25e10a191d20aed88f9118217436835c39883f8e96a0ebe09c80b21f48f3be98f861d89218685121a75c10d7811847e3a2654ca51669613bc00421b2fe6d4f9602db6e040175c98a305bcf8419bc1c6601a2d3784b9f8a0d15cd1111b553d68f29f452f78d05839d2cb783af56a1278b1835edf2f4c574236c7b00e9a1c2d34f0cf991c3429bb4e8e2a91da41060e3a8f4dbee6d538870345cb5fdca0c9d4626ad52a2d13b3012d1c8ba70ac0041230015200b8e0850d0a998adb9b15828552084c174ba6167851832ebfaf59643b481edf185ed0a0ebb3289d537f8ac7194afb000c5c31801733681a997be3ec34d3a4074c08146002e7820b0210a068614250827e43812cb2700f48208b2cdc035d98145ec8a06dcbe21953e4472539066d8a6ea96223b333bc80410fc232cc7052d8afd4d90c2f5ed05c54cf78982c2e687af3ee664f9a2192dc82f6e18f85056bfdc84930bc60418f67c39865b0aca28b89f942de0c6721e52f58a18a7e43a7fcbcda21ec7752d106b330493de5711013158db8c5a82d9de3717e9ca2b58cea2035acfc9e95291a537f29714d6b608db2a2144d86911c68de9415a4e84379be07ff09991128005e60c528fab01b728aea5839fc58218adef7fd42f6f0fb578d5034515234c568884c6a48b002145df52691871af327fa682fad0c4721969927da994671e3ff9de83483e4eb6152526b86159ce8f392680e3ddb17f5b209ab80159ae81cc967d58ce304fd7733d16c9e2499325c44b00213cd8bc766bcd166eee7257ae08ef4620cefbe214bda8115966892b59a876b3f4af18295e852d6141a2d2aba25394a1c2b26d1f7c430d92b24d15b87cc25eac05a3c6b45249a89915dd12cd515a358286d5144a0002b20d1e6ba63c7e07d260b042b1ed14a688897715bf2383ba2cf1796395ecec042891bd1b77a5891486d871fc142c96e600523ba902f326ba59ca88b682b3e8a1247178ae83f2e6f2a0fa9b3859f884e52069de1a59c320af922a289a417f2b487e85752d228cb65d9c08abf62811585e8743ecb356b02ff0021fad2a4317688c1a252258b2c4c175798400464106dacb09bb28f859209c8151f10c1165c6ca04a106d96c5c50a1e2c9488506045207acd323b71e24bcce15a88e08a2d8a01a2ef4bd267b239446349f5872be46148a9edc06f91c559e1871ea8c4a8f3f8c17ed587ceb254360bb3f8d087ea0ebd1bad6106b5e08007f6d0fecba306973a7ae8e1eae65cb9e1e398a5811579e83fe434654ad92db8b8c20495c5165c201eda8d1911737f3fff576c513604268bbd431b36fc638c3fe9bc1dae8e950d164a4732b0a20eed5f849a3ec89291a9155841872ebc854c27f17f3c592c943cc001b70f3809bab8e239e0812d42e04431b0620e5d48922286d119d788b230af855b11ac9043ab95dd23e6e72167e3d04a047f73af2831f55798116cc1450fac8043937b1a26cd78b2b954c8032bded09a658e1eaee9c015563ab0c20d3d968b611fa5ca14dbc442498b2bbae080156de8bfd563634b99728a4ecec00a36b46b91a939639c657f62c51afa2a87922d4d25aa3a56a8a18d8c2221c88bc76f981569e8a5f39264f8c40a34f42df30d45d2ad627c7060c519fa8f965e95dd71f0fc304333c95546b2d1042bcad0b403118f8ccea0274786d67b52d6892a213ac61943931a78a85bcc9ab44f31301fab7218da904a4dc3e56332a360e8bc3ae6d4255ddaf72fb46e3197acfd9386102ff46a31d7bddc524c96bad04494f43f497983cc850bfd56b6368bd8a94367b61088faa8a48e8522c37024188cc30171308a615aef01a3140010002068681c8a44921846334dd81b1480024f2a1c463024161c202810160e0e85036140180c0e0383c140100c0603028170182c160f44e40f32343bb919004fb7340d7ec15f88ede742830afa986e3d94d0af7a8c0ba825a42db4210eb9871ed9f85cc3f27acc7e0a245fa2113bca081a8446a7f2a42de98b0fd8250da9c5ef5f669e9cf7ebf6ee06043556f3edcce2173e3ae7f75e1bef50a25200c128a1463b3d894752fb9bd3669799ceab14640a976973de3ab8bdc9f07cfe7ea3735b2bfb92fdfb0d825bacdc08f757373e375bf9813d34dd9cb8444731ac72894ade758d8e5424539c19e16f47a3f0697521baa55f58ce087aad96a942706939d62e71518d74d3d7ef0295243d64077ec09aa22b491a6552a6462bd3e7c2da256a4383541393802d8ba12f183e40ed1d1244c69ae0bb17f1c37f6679a61cfabe97739a66a9170651688dfa3a4ae8ee60d80be8c82328d926a508edd1c89ac52a7bad3cc6f69ca4ca04cf35199287021a0a5614ad8cfad1ec3020431bebbc95302529b176df0db7e01bbea43d620017419ee76cfa16f80ec56a15a32b6dfe5eea8eb6aa557165be31aab4b168b56208d2701a8c50e4af609686040bf4b39369b1a22836a49e4aa10adef69192c7402eb9350a1a24f101b8a821dadf0a07ed52567e36778d54cc530c77358ba203b4c9ca7d796912c7568c7d1ce220282fddf06be03b8fb7d60baa7c69265ad0f3d7a2b3a270fd2c6b80ca3c2408ed916cf492fd589bc93728e7ad8626b68c85aa5fca2605b45a9b94065c6c3ee9feb119ea9240a67fedd399798298acaba9743bab1ef979c3f064e123675fecb982b291750f2afda16b60389eef56688fe13040a53d347687def84ee81e685726249efe896dca3735db51b96362f393a6b1108c4750fba79e116b2daae92fbd65454a5ae78ca6d156c89a6628414b8ddf2907a12a272620ddbdb81c4541a4821194a08694a18bca1dbc0d99475815ca3e4a6eb15b29d627c1030a421467950419629e02c4ed6e20fdade6a6b9e31a9dc6e9fb8f6616305dda8d0c8653057ceb0ec548a603ec792d123b36a599e4ade19535e201516bcc5328b59d1efd3f81d0fb02a87db13126823ee26a4bad180245d007aff4819548745ddf4b805348cc79fb8dc5c87efc183d17a9904da6820a702297324343b354863da2caeb289b742a0b3942b33a8db0c64552d526b0f7acada464a63972558b99042ca001c32861e736346b5827bc346fd6cdbaa8ff2a4b88f9e525151cc90ebb226dd6266dca6dcd263a92b0f00fc36e61145691eba83cced5ceed73c511f750f4e1f71194eb8865a946289f646443ed0f1e3bdff0b27b0b0bd204669370b1ce39c55e7c2cf3b48ed94878397386c5c72a64136e3644de9a2cdc65a4bb22e9d4e3e971ca283bc2729bfe1784a62f13c592d9c364e26b07542110484a70c8445aa21da758ca7f0fa0ade93002b8e143da32a97957e5f7ce72c127e781068d8f4676b8ea0612c20092c79428d27aa8db074ec6b01a6b59298ca99140d114b16d1e5637970ccd60a8dd30f14dbe2e0fec65106f9f25f417926153acb1b77dcca9046881adee2485afcd9054af2e22e2eebefe94411783a67be8597c4f080f105b65df2fbb9b4477ff98f60cab971063b6a6533ace85607ae1d427718b4cc5f706cf2747c6b32ba99056161900a0ac5c60e39436d408bf2b494e1f8d93c516e310741473a67df1b6e74e51384dcf90c4e387f947c38ac8f832415eca5e10ee1c72042d26cc06e8854d42c90072220347b92ba69df8aa02fa0774ed6bd6689149d20c006456301fab337035dd42221899f8c68ccd671227375ab3c5a7a065bd82fb5b690269789934cddcd525703268f6122ca2f8f531a36128547d69a6888f8d3fc59e92e9d7447825eda9f1215ba193817c8dbd87eab9d53b9698165046c9e0df9e9c9582f2241954e238a794a92c4f0610809aab6c4a2475fcea805c2cc4e2bd0d672278547c4c43edf8d8c0eb3b357a1b1ce9af4412f31969c0e8ee10443a4332574641b16946d9463beb13bd21c4d541999646b90507bc4a3c57bd8bd23df9368b5812e93aa745094f7d923716251220f9240954c7c8f9819108c50b7831aa88408d51b4f29174b2be930e5dbfccd479368d76146426e024553ed9199a8ed1775d7fbc41b6e9f33e4194d68c02b31f6f057f3309f578593800e61855cc71dd7915cd5ea4d70c084662f208181b63b7257843f8a3ccfc041ab6f7c1d9041431ce833be95c2a2a666a52c6c80e726083c3e990840a984e7b7b113bd759e1538894f4df1c540381a3202a057295b50761d3c221df1c69c36763629e4bf5197537852f7a0393e23923835350c4129fdc5423800677750904376e1fe7cd8e94ba56654a39b3ac906bd65b0e6021b6e97b46c3de3a6259c5060088368fd1e31ea6d7aca7dfa820e32504dd950f12dc2bed41e01d14d84427060d68d559e5fa4cf503430e86960163c8bc0d6716094ea2755daade07207eea1307ad3aec888933d243a5606a8f5af8f22c1929bef4bd5d67f0a149a66346ebb8172bf5f173c136c428897ee8c6c08eedb798a30df89083b9d5b4811a39c1a14a59a5a1bc3fc0eb5a1b7faf32efd1007799d7564a3e380dbcbe3d9751516a8d2423d0d5452d30d4f8680730d5bdcdc53c860f449da8072d77064a25a14901521972752e97a150b83aaeabc637b714a07a218023f2a772ac87d6aa55e50bcc73e7ab312345d8e427421b4c6b936800a688f5624fc15363ccbcdb908d7f37dbc664a1991eea25a99018f4263b081cca242517f7be5005d6e6ba055a49149831412f46b6c0c5073aa3691cd53e7e2a3d40a00fc64b34c8673aa95c502609d6a3f3514f87881e4ee01dc4d7f8d481fe67281969ac4d102450aa3da19d8843bfa23ad209e91cd6aa832f1d746f7d8ec8e2e0f9443c2489ca7d5fe2f1339b76e5aa82c23b600b7027a97a361c48e0fbd2e02fca4d1951e20589db1ba3dec5105e14a7ddd2776b640446e74bb222a89eafd3248e92db03c77677de3e060cc224b01ce9ba322092125d719631ca8d4c4c44e6d6513dd0b7f83adea0052a6d6a4d0318208bcb21eb2978c7c9c5637583b6a386f013e72b2fbff5bd5fb8416b810139ac375ba48cbd525107acf47059cb7e01b503118163dd7e0f5b7812f220139b54528cb0cd2e7e600339bc7b4d38942f8af1ec1a74bbaccdf0bee8d3b695726d86a312902d027ca2be351b54c0a5aa37b719a1b841c5116af47f46fed5dcc85c728e61b1217d23e2f8b21d5a9d33c135d8cb8fb1d0e18c92a0e5b152a304ec5fb7eb021a654968d48955e0fd5d53e67b697e652173344a9c2f1e89b2fa1b5e748789ec26d89d44bbc7f4ef249cc5230934b0fa9e9e44401db81a3e4e5239d08119a91e62c256a0d572574315b6e9cbaa3b7ff8b732ad64b972b0b65679abb17735bc43ec56a9587dac7c2b8995eeb71a9a86da07766b35b2c2ac2e564a5633ab88d564a56625b41a596d568a5622abb1d57084eba41bae86211d3b4882a4697d76890cd490c42320dd381f9d4c30cc29760bc72a032818e4f5383977ca3b8a6ab3e7854883a3a250ada8745447ac0ab4546d1fa2a820ad1282d85e2044a4eaa34eea350df2f5c2622a3b550e556f95c24a095560854745a2a70a65aa7f62cfa078ae5514d58e2a642aa1a705ee7b4e05a986a8e24625f43e8b62ac2a30594f8761a8e2a20a041654c51b2a575542bf267ff6e9aa8480b252b1ad0a0cbc9fa993ca302aa184425547cc5540f4eb093989eaa7eaf5aaeedeb417681a19ad5780f1c350aa3e559a4a41854d3550394125147af022d0ad02128afcf9b4a908545a896a3d1663a38d4a05a2725059a85e54e5584d543e2a27d517d547a5a4d252ed5115a9522a199520d596aa61a5a5f2a71a53e556091d50b60744520993db181e2531934d5bca5ad16c3c4932b2c8bf5b537ec670cc98663e87d5d96f633290e08b275eb1b0118d30e9467ce18776590af9fc3b38def79eb08c684208ff66dfa56bcff329667cff410ff651948c4aaa4e7cb875ac1687e6ccf0295ab49c96fd8158573e13840121847e28665ede97132cde3e6fbf1a084f549bb297c034b46c4e24ea5c256ccaec239595419ffc3dcd500ba9757219a6636924a6a2da3a0e1b3aa7cd069b29e90cece2b39be3d5163edaac9b476ed4a53e89762e2da5b732e662815bd122b4422aefbcd9543cb4e547efcc0398919b5c6cfe9fb01eae88d2c126abd4ce9d2b4c29d798f995f6dfd8653c4b7865e3f6d001e251ac46b993951346b41b9334aed07f69a7d7c4adb4a581335d7c0efb9f56450623477e3b278d6863daa7268f6004607b5b6a217f365d291e7e64cbacbb6a7c8d4da8eb353f05061c70a6516c079e67b50cd6e49ab568b4b76f607c1fb7c96ee73205d9fee5815f949687ca3ef135cee6694b0d864f55c11652ea88279b8c89e0ea11b5fc6268e76821bb733d42dc10159035ef1fe8e123a32f7299a90df55949247d6bd736a1aaa5ba5e53a655c71cc81085aa53bce0a936e96ab3cb50e1b60993722740fecccd0a7e7df3af77ca406cac51ff7389cc244b1101fed0d3655cdbc26c5b1174415802f2b10d466e9c76294abcdcb0447ca4ec17ff215029e0e02b5a641f99657805f2d005a0107216d93de996529553f7f729517fb99769ab965063c20b809b36a1d8155ca96c48ea53f0fcdd7ad78ca1d1a55bf674aade6515fbd710bc58a3790184648617a3a97149989ef1238100aa0211c99105bc709b8800694f17614798fc02c49c738fc194d42eead80d072b9433632e849afb0f5559c2ef8cc8cc01a5b90595d45d9570f91f45e82dec0b203c59515e41e03cc400b4874af757c461edcae2b3390c8626f2f3d3b289da18d8ced257e41fc74176f293f7bbb1c2e810c4225a3a205810b20c09270101772806c955ed3104e0a12bed718c568b33fd3956a6eb5e9a3b0eb8e15b0584a4b44503121ffb3190936a91c8869350745f5d364f80a0c41bf1861f504d51ed79b310e2401aae3fc0b97118e209801c20aea529307ef38fb19002cbe65bb8f9879c95e5ac08a655c4f2a8f271904bb8a988343d7caabfad0da5f8cf65838001b44aebf16b56b770e82cdeec8019de64cf3efabe4b800c08003379bb887ff7d35507d9d31613752f43d48024b7c73db63810a5e6ae4f06abe205700c4401e6707dfd5c048eeeb704ff074efe870bc99a5fb0beb63e317f7ebfbdbe4f7d7c7f18f7ca7ee1fadafac4fdf9fc16fbfef5b17d2c28165e03b5f6b78a7b75bbeeb47e6b951230c7075129c46c1351db08d14a567c17ba3e42a88a492bd340941e0b94609bc508dd4262407240cf9d800efcac5c20a341d874ec6be1c0e1e22b029e9a8b47c27a478fb3550b143a2510a6348ef54ba80eb01bea7e11027300891988b43cf8d6a76991e19362f26b617030b001d244b5dd21a2402d23e68349d5dacc1f4e81b83bb457ec098bdcf9a27441e2b38075e0d64cd6d9383da5d8486d02201b89ac610886afee6aeffc58c08713f68b2b2f9450bb086d2b62b2fa8cba86304dd023c2f15f3d61d13c0714a5d7fc7a5a0becc66508911b2cf5977eb303cd29dcfd290dc5cb22d1816d1251216024c52a7bf81238321430b484c2113df3024849afabf848300eca0c1950788a2d3a8a4179d2753ef3df31146c32b6179b8ffdc6f603bb00288e1f62c5c67d6c0209224b2f149b208aa9d0b46f5583d0e649f7b2b85d08bca154e608889d0d262dbaf22eb73e3055d0ee9d790dba26d1eef926d095c48f77bf6f7d8765181165bbd94ed5a8be7776bbbd1dd6bb1cc67055e95963dbae77706f84f7a2bae756684bf7852e85ec5640518cee99f73eed2df33a7471dc1de8f5d8ebe3fdd47def2aed55d3bb716fc5de6cafb05e85f79e97a5ec712c6fa4bbe7de9c7e72febbd2f666ebb5b97548bd68de07efd62bc04f18756fbd699c67bdecad9fb57a47c7dbbabde88c15db35dd86eeb56ea2dde1bccbdb292412aef756e80db2778edeba4375c75351175b73375459466fb7eb1aba1e5db9ee8ebb01de21bbd97a8ec68ed735b6cbd6de6cf3e8b71f4c5740379eddd726d1d156f2bb957a4ff70ebcde774ddf5bcffdbbc3387eeb47ff3803ca75eb12a65b40f3d5e226dd58ed9e436421ad317b0bd29b0db0379f71ec85de2b73bdbd6056d96f75bd127bb1bdc77a4dbeb71e02e6f1622cc117fcaacb920986bb943a2e622945bf2e7b3211174914d669305991146c49d4fccbca9f24e42cf9043c9ca76142c2267190f8bb249f66316a573cc941a221b13f892a816a77d6c43b4cf45796e73f966cc82964721f53b47adc9cb0d12f0664f2470644f507ac414e5e1f0860f9e38f7a175fd85eb98c0b88e361e5a1eb6324484e64e0c7c9ffa6c8cf1fef8673ade841b98fa567650788e981491f4be2765793e3210a3dfe0881ff26dd215b41f422120f93c7c0238fc7c95487da34d88d524df842675fa3d4501826d2070a30c3657ccdc10f6e4c8ba613187bbc4cc29fb260ff71128a118534a8b48cb6a88752146e9779af872dae76c3e20743bb3297a190c96063efc4630b64831e9b59c0be8a9dc98d2de475c2600175a53601632d6a6e34220b14ee6f50ba0da3295214fd4d69b44d29f702caf176602d74f081884722dde8a0c89e4ad81bea5f6b9acb52f5c03de799005d29b92d4ab2fe280a8d41ecc34abab949be8bc725213bb80fd5f32fa49e1ac4a693fa901101a928da7d828f72d23e0245122c2e4ec131a70d205451829900758d40dea7e57b3bb9c9334be8dbf98bb52e0127c8526d6b91e8bd8d81dbe94354af3c9a973957c4521db33405cb243027342abc02f45d0002d5b72e2ae1ad10e0b89a793285f318dd7067093c543df3cd2a98893725d6230777715384cc5b946ab73f4972bb03e7326008042627be6ed2ccb9a4c5770e5c46a362f460d71ac206d0a1198437ed750b2897d7f8906fc23f215f5df73c0aeb6e0636037182baabb711f75737759ac5c0fbcc2675e69286e7c3097362f5c9cdd6840d6cf97d812090e9042372fda4256c60a3c9be6273d16f88ccd9c8e5ca4bdb15a9f64c92b2d4c4cef9bbe54513ac67d4fa1ece46d5b875813dbfbad74c2654d3e5754e00309c5db3319f52be30004c6ed5263a95cd79dff9a2ba1e4fa0f785288998e3f094129a1b9d321577c494388a38194c2a1f1dd96db80b67aff10f4cd10a51da130db680d5274f21041a4099338349abaf908c2d5d1350f9d247932b192116422532002388513280514b5c4ef3395628d904afa3acfe112555d334b8e37626e7a6206e3b29a65aa4f8a478db0b899f39c3767e624a5b107a3730e45ccaea97db56c686b705a2f92ce7d886e40c7e9800c75b3d1d18643ae192e97baa9ab2c371ea5b4407d6b116251c40b1e7af48b2d88743e4cfe978e1e6cf93ed0f529a52d6b3b2278d769cbd6e1a1c111d403f759563bcc86f1ec39c3d81c208a838dae2a663ce5a6c42dd44719bb00a9a11bdeaae4f3516bcb8ea5e6da2d41b6fd53decd171ddb09f4f70bfba9529f60e05b8b29dd0b65a4bedb71e2e8d8db6352b68765d5fceeae30cdcf678b544ad2a1473b15508b69eaa2e15aeba1a3147a3be0e83366c751b527b352554f37dda7a232bbada9b6bc14e6606a441151aa1beba4d96f7595f35f854ea4a9fdddd7cb466385edd622efcf4155b71b939f586fdf4abee09bc37b9df7a910baabae5b8c5aed58fabb57c9f94744dabd916c1eafe6cb00ae3ab554a33556136986ad59542ce2c16d9455cc155f732980eefaeff19ef494429842c3c6dbe4cd85a09d45352ce00ffd04ee5ea8033b81ab48093e1c55ef7a94a282aef955888a7f19bd8344852423318efbef423b103b82592fa5b061f026374abd2a852e92de00cecbe25af66a82d021a3f678db71897b3cd3900273bf32544c8c32003201d3e59e557f0c6111688fcbb418858da3c2d41021b4c090434ce22ad6b7b50c571e36de8984a79095fdabf05a8492f1cf18386fbc3a62164f35ea65d158410f5199bf206c3cf5e41fadccf1720e6941d6d19e0e46788c6e47c3d9dff58ab18f5f4e07d27aa37a9dcc4cef45f7c17a0ab0e438287d165b2d62b0b2c734a8064e35674bced13bf88a4cb4d31067299b3d210ec92886698e8f5541295c7db56964ca951964485c2ea86fcb69e53c02340a77c361d0aa2a70ebb74bee60f17cef07d7618fde9d65dc42f403e4214bc2eba4153d93dd2eac6eb211f261c402f65dc5f7fc0a6a5f66b71d209bd630570a2fee27f7dd0281a7384d0d84b7d0b37005bbf42790a2cc00b9820ea3946e151fc8429797d3214e1b04dcda4e217549f52faed6b9ae5d9bc785690b37a72e62af53a3bc05608c1b279e6a7b5b8fa7d8f909bdc2a3495b3da724e07683c2257f7027d7ac8294bdd24fa6cea72ccb0f445e050fa08316dffa537de61dc58016ba3c1c700642030f0188c0c1606aa64b0422df36dd2655032f0196c3e0842f83af070a30ef4980e359202d23603a4015307cb5c24f7cd23c145003e061b585ce60affc118fa2d61a9de2069c01a7cfcc1184879a657222186b06910dbc1c688a265511b4c1e0eb4721031780ddc0682065b83329882aa4f2d27ccc894d39301c1a0c12638b6661aa537206a899f3c06636e375df292077d091110a45cd8ec220a7a96b0219cc5c4c2834decfdab2807083361cf86894012ac1a6153118dc8d406630839e4160aa1bf83374284838dabe47297541236398e60b12800160cf32e2b123a8189cdca371fda033621cc642d9d37cf208c18cc00c739ae08063a9881034c5f3196bf751dd89730032a4054096160e28315543b98c6110fb208f30ef22644105c18284dd8eca574882608d10791266c43d858e5f60b5f1136900e8cd00444ed6467a446b892acbe0898069b1dd6e489a511c61013fd0a8812162480206c35d898e9aac367206c4e18cdf0110f66b4173807bc07921036e3035749d6c389ad114eb37586ca68411e8246099d481ce214b3047910360ba1902937d5271ad19b989cb072a3d2c91d489e1ecf08800adc2ef0625b51b734018904324bad981b3164932c27550cd0958f1c401e4005e002f00178029c75c095d1a8285b116004301560d9014c361d337dc0b3b8000c648dea82550026f25c4cc305c0c88b734045773e4d998c6302fada8b9f3760b26639ff000000000000000000d06c9488b545d2ac4c524a7a00d4ffb5b7847199524a29a5086f67e6f845daf01769c35fa40daf0017f209df09db095fe89ecb3a866653f68ea57fa2c48b8de81043df5a9e5754d27d420551111d61e84b6fd45cf259595445447480a16dd1d910e2bfe7ef05d5d8c206203abed0040d9ea3670da1e9fbf9a1c30bede41c72d2d4911d3944878e2e74252b4374cd5dbda1830b7dd4f86432c66c72962d5be8e3a9088daf17ad4765bfd0a185d64709956d2926647c6a7ce070191170e1e2f5c4d09185929f590a2ab6040b9d9ce68fd316ad6a3a11a4dd076c2006083a503eb2fd3b53c7a4438715fa4f596df2e4b4868e2aa466f1a9a54217ce9308ca849079a1630a5b4593215fbe5439438714fa597113312c7f98ff3ba2d04bfc0e666262082977a0d08e54dd94e13bfc86d4137abddc9758aae767322774328b6ffc88294de842bc7516f1c9740a29139af8221b29bf7ffe4a5a4217a2c7102a5376a64a5142b3e23932e8670c66f924b4917d2f574e4c27ab48e82b7c663921938ed0f94c1c8f9b9465850e23349aff12d32d450dfd8bd0264d1d7cf3a825157922f46649e3e9a09a344b3ec18d1c1c838e21345af6e3279e39e81042d79a23040f31c7b3781a8fcc061d4168c29e070b1bef22e4a269e800421f4544ac0e4256124149cdd0f1837ef285fa79eaf8a0c9a23b9e7278040da51eb417533c79b93cc7083268e8e041a3fbeea14573954a7607bd99969339a42725552d43870e9a98b1c594cc6e6eaacb41a79d37929e2ff9bab1e342070e1a95de718257899c74665be8b841a3a2645b2496aad061834e0521d7b2a4f835c9e8a841731d52f613334288cf1d34e864765121860ed67f31399e0227b8210211dc193a66d0e90d17492fcf85b28e0cba9e68a69392e25d9977c4a0cfd9989208fba993671e1d30e87592124929378dd8a617b41ba2ac93c8e147fd0e17f4d766593b45eef25bd1ee4ac89d8487e7d141ace873ca3a2a44cd2aba0ca122c908aba27d2def3c69562ada705d3a6ed8d4264cfb0215bdc7e61817b77a718ae694ea051153d222b3f8c2148df897dfbeb2e8192d04bc284597545f89182584b79948d15fb41ce67aba43c4e028faf8cce14936ce688889a28be1e5a49c27a52fa75e84a20bab31582e9d63ccf881e2f82107a5338c6c0d2f3ed155c6342536b525dfdf138d85bf944ef4a63e6a218893137d509a7f7664c6579368135e6ca2f9b3b0d010665fb2af89768466f278b135fdc299e872b27c8b17bc83086962a231313ad6d9f4a8d86f2fd195b9b9852c1327e5b2441b7fa3c8d85163cc49a8129dc5d0413788e4f3174389fea299a775f6e75e3589d6ac941e65f152b6f042126da824a2c731952776b79168dc4aeb98a750dd2f42a2ab48497e441363ce75119d5468695a78e18846581895542e2eae5923fad6f3897df2948b9030231a9dbd7b62deeadebf72aff062119d0c394fe6e63d113be82f14d1566586cb25fc64634c22dae45adad73b49ab5344344ae4d7e829bd3d7a24032f0ed18ceeece6c8f92b82ce105d55852449edbe28441f271e9f520e11a275d19493397b83e8228e76fc98351b395e08a217f1e241639893264181e83735dc649809f9df054417640a952a8c56c6568ecf2206aae1693578f1874e3bf6235fe5fdd056860bf24c57e9f8f4a10da2e389c81a26b4797c68db4dc614e25228e1eb1edad29e2d25c7fca99cd443232fec66718bbde0451e9a247c26575b8f87366a1ecf417347f014748746a950e9b94526b3ec5ed8a1931954a37acc9663aa179081c313c0a6858be06a94c0c60d230387cb280fd8400c05bca8432752c6d4a02f49c696d2e10da6beabebef1783458c101c3734687872e142060e97e10fd8400c15bc98432742580ba3279a63951b36520c1403c7231b356c0b08b87021038727c0858b2d6c9cc01bf0336e54a0010d88c40b39f43ee243a9c9b013448e43f3a5730a5984160efdc75610da92ce99be6f683d7fcc562c31265977439fc47b68cd8c6943977bc12afe677cff081bfa3f99bb53c6ea08a5ada15372545ece39ab863e469a8513a331c5cda5a11fb1ff1b3ec468e8f377de9809797186ae33ab93c9907962432fccd0a9844d539e47c59caa0c5df814eb2394e79482870c5d0e5d9a523c750cadf7c7c8cc7545984dc696a31a9f85c7d0628b1afe340e92e085189a9c333ec47c4abeb446c6d6711a5a9030b422c55742b61864cf0f86362b7cbac5ce3108dd578cdac38b2f74a97164f0aef645e00fb88a517178e185c6729e90940ee29b49ec422bbf41fc25cdbce0425b394e9ccae4961bc9175be83ce77c5da91b2967f985169a4bd9243d250b841759e87392c9538c481a9309110b5dd0a3e44ed24129bcb842ff19bb1245e95f58a13fa1df416232cf1af2a20a6d4c3a678386242ab49e2db9c2c7bcf62f6f0aedea64df3c22c8c93e5f48a1d15c5a9a77de175168c7cab4b2e9ff05145a8de69262ec64fa84a7bc7842ab93cf5284a841e78ee5a8f1316c20b6f1c20966998cc724cfd295813278d1844653a6d6121797b1f58209bd8cd2643163d22576c7e14fe3c68b25749d2644f68f2f132f94d0ae7fca9f3dcde32d4f423b523b3e82845f20a19373ed1b3582acb49c1747689245d1d556d1089d92e9f9822a11218b854a785184f644c81946dc641c3711a1f74eaf98f78464d3d922bc184257e18216e13145841742e8b34547c8be9b972a18843e851825f5e55249730e088d7ff0ee513aa6281afe4117629e903935f2c207cd9a7e28b9bcf4a0cf94983187aaa98ae10b1ef49254e6b088e30e9a718ba67a2ee71036a783ce33765f3cd5acea15165ee4a0c995e35b49aeba92100eba10fec428a557e1c50dda0ea2a16426bcb041a324c98bf96729d97ce0450d1a5d61f7d4fbccf3e768a06e8e61f51733e84c6f9e4839ff5250293268942cd9b9e43ae2e72c062f62d0e6d3484127e60fe7261834b12726b95f41eba5988c2db42f5ed0eca8e0b194bb05b3e0850b5a19ff145d7e3ec7b4b4a21d8da07dd5b40413a109bec6ae6000ac6853964e79724e332bb48aae634cd2b9f247ce9c32b66accc8e20da26000aa68546c9811b11f7312948ac6aa5c27753866282ad8324fd594f2f24f821b5b14e0146d0aeb5e39e9df232ea66882c605d79e5329395b8a4e874794a8db2105314292714a878a0c06308a5edf2d47247f4e217944d156f7bf56f61000bc6000a1e8534ab2bf5c5ce6c4078a4e5b30e939b62ac948ed2906f089565b724a912f9e683cb3b4777bf834e9b9a20057a04e3451840a913ce7b530004eb47a1143b69238e3bc0136d1b84634efb5501a79441e0c4013eda8f40aa152939726135dd00d396f0c1f5512c10da7e131723c8ea28a89765436edae14cabac432b66c90600770897ebe52aa0e570dc012cdbe2979d9216274f22bd125a52987ce12449e6c204a34ba395ffe1fc78d1a58b870712470e1026f046012039844a3e4b46776cc4f8d3936b488e1350049f4e1b784552c1d1b59d4b0110387933a010d1a5e01172e68d0b01101172eaa140388442ff1752ea8e59068c35bc6155d16172e1ed17be71c2cc46e896f4bc6d6b2231a4f21ba5ac997e89247402df0a0439f7f25bfc8f01cdab418b3b2020f393449c71c09db6d1cfaab24734ccd6b5e56c2a10972a54389cd9071c52836f07843d71e2466891ae6ac7337f41d94d04cfae794c428c6c0a30d7d862453d079368a3eb1a1b590ad8862164c95716af80d537545051090802b2ad0802b5cb87081c71a3a9d3395ce8c512166e7918d023cb2f18042ea85871ada59b98ea47d79c3e8a4a1ff8d1d2adac3686863679207622d9e77f86c3e8d2d900d0758dd5033b429797ee8d84a61e6df8840d5dfd0e274860870780912e051865e626fd808228666abb00719fa605a2a3389cd1f1ae52d32e031066490b29e8d009a193cc440058f307422770651cd188f8d1c35667880a1cbfea73766cd3cbed088a9c7301ee48526ac853ca2e4a80b8d5cc97153f2adacec70e18a225f467cca6ca10959e5a2853eaa788a163564cc9eb3d099cb06b1d0a808095ee599f4a56825c393b4609d151a8f7ea247a9089563aad0a518e583c459d111f4a0422796a6346572c8566c0a6ddcdcc91a5382574faa3e8b1bef804c067848a1cb902a7a18d146a117a1836815cfdcf2c1f2e10185ae325eb8cec8794233726283ce937142972fce760a4a57f0246f429373a5707f1113fa52b9c143fca567cd2ea1533173f7e2e6e07ea512fa68a23a0f8f24b4a62f7fccd79e622b8f844ec91c322725848ed09bcc2172f08d5ed61b23b4e55e1a52debd085d26b9507123ee795489d0e8fb964c16372486108f217079399a84d0e498bb64848f07a1fd8d15a38809089dfaf687e749cfe4f10f1acf31674dfac90eb17cd0e5ce962b4cb0cedcf42015b379bd7d1ef4712e3b682e891052baac83368b50c9ccdb1cf4f9d52d1a39e65614079daf871493c774837e2cdbaf847b52e5251b744984a8faa3d6a01317e3a65ef7890e0d1a25af73615d3a85549a41a3f96437fe8b0abf0cfaa48268eeec1aad120343a9a8264b250f1834af218e0515e3530479bca08de6ff1daf372621e3e18246cff2b54b4a2bfaec1f42b5b3ac68836f292d22fe2adad312ce53e768e7ef55d1e87ec668ba6265b64f4573328486123254344afc2f6a129554f0146de54db242acf20d61533431c710628691cf1f45a5e853089641729e148d27a167fe1f459f6f2a7372b1fc151245bfad1ffa4125252e27149d301147071d3da06883cc5fd9609e4f7411c62ca43093bd499ee8334e3776e53bd168a5707965e6449f5404555a4cb389de62e6f45331a3893e42debce5b26365ca442bc1cf345cfe117284894e46d684fea7f6d2b9442f93b4570cad25ba982426aca994a46c95e8d743eaa43ca88c6c94687486c7bb5f3e89365769a7e49d44f4944ba237b7fc31298f449f326439b52463a98144fff1624c92631d9e2d8fe8fc7fc4a2af8c6fae38a25f8d22721e2ddd18521ad1a74c4935b8468b3931a213dedd39fa223acf49dee7153526ad22da34515264c6cfe92b27a28de7abc9628e11d1262f8b125d8452a2e243345aa5b3414f10261e43b4265ddf63ee5b884e5e0abdab41d7525f42b4a6c372727707d1b887c9ae96748a4e5710bd868e9c458aa8c57203d17bc6338d99e24906107d16213b87604985e60f5d56e5f89c41f9a6203f74627386c5389d8288fab087cf3122e243a7847cb170619348da43bb27563d73f4d08bb0b6b69ce7a1ddf73f931f7c63bc78e87368a41483f20eb85f5c6a87deb2623ebdb40e8d5e5cfe2a21ade744874e774bea84b79852670ecde48f984dc4c98f1c39143a88f8ca8a671cba14af278b8c9eae6ac2a10b17999c437e3d35f30d5d9e4a34a5945e6b31ddd077ca792ed694e968d986f4728b06917136349f92f0ac391e47e76b685c4ec8ea1771dac46ae8e274f87f9cb294b469e857af4ff753c771130d9d85e097428767e853ded914636cd378a119dad59331998f65e892af56084f2a23629c0ccd9f4bd2a816b53fbb31749ab26d9934b3c4901343235fc233bca4e9905c187a1119cf2829694a4a60e8bfcb3b84b23c71de2fb4ea99474f4ec6a44b2fb496829253965a24965d6893d2137a41e87e09b980f89082b685be2a2b55d8913bd2332db426dfff4fe8ff5f6559e86556ce449ccc9f891d469590a69695748526c94b119eb96304a1b242677d22245dd913d5a92a749143124957b5cc888b0a5de9b19c2f9e45f1c84ea1cb59dfdef4a4d08bfc48a6438ce9c8a2d07948612175b98e070a5db6e05bd1c24cb9f584aed7d7e28a8a2773524ee8733395e6b013476f42133387146216fd1326263422f56ecc66f153f84be8c5a25a8eefef23374ae864886131041393aa4d421797bbc2e9915d7a22a1cd51848afc1a47778ed0757a4411ada7326246e8dcb23d76500f935345e847e81e21b3a1244608111a1d29ef885a1022bf6808adfb06f949669f2ecb11425f594a0699351e84c674a2b8a977f614c44068a29e8ae19a1ff4a734aa7756c9929bfaa00fbfb9b287912d27c61ef4a242e4066519e3a2e3416b9927fc08d15cb858cd030176d0c8d950c23da92020800eca99e13163413572b5b9c9888a98335e16c7590d1b7b830039684b4fe6d41b8d91e3b360cfe106b0321c7451532d52ee37e8f45998dc682a4ed2bf8c1886451c40001bf43e1b2acc9388399554835edde7434e4e0e973d4f82520720000d9a9f194ff197baf72db4a83123868ce33972f8568e2d20f037227080095ca018800033685474b2cc959f548e2d205043010798c00538dd20c1d1f810dcb861a3868c8383104006ad0791cfcdfc174080187421650b979c434fd2210d1a5e801c100006ad779b101ea344649cbca0fd90945fbe06190f0f015cd0bc966c915fbd4c49d2d18a4e268d494eea181f62a6b0a25149e90a1932dc27269555347a728a9e891f46872afa34b3eab89b343368d0f05463061140472ada903a4b789b52aedbdeb8d1a8e84da7be57bc98e4995754000126785443012e5c98e0518d19363a4ed1670a89a693f498a24bf9c8b9964d58316acc58430a58414729da5cb2831295829f56ec7490a24d62a4ac89753b46d19725ed2639652a914d87281aa5e4cc798ee73f2a0f4552c5f374944e46a00157c8c0e13210147b89fdc9dfb071281081065c71fb095b4f68d1d109ede084766c423b34a11d99d00e4c68c725b4c312da5109eda084764c423b24a11d91d00e4868c723b4c311dad108ed6084762c423b14a11d89d00e4468c721b4c310da5108ed2084760c423b04a11d81d00e4068c71fb4c30fdad107ede08376ec413bf4a01d79503c1036a874cd9202141a1d77d00e3b68471db4830eda31076d42871cb6230e5d9b3e117d3f885a8a81439b5dd14c9ee8cedb56d140c71bda28af117c6345e674dcd08e76aa48d9781b9af0bd23c492880f0d1b9afc7231835956ce5b76aca14d210591932fa4430dad5a48e26355b4230dad5a94d8ad1fea40435fde3e22a2c7ccee2aca71039595a0e30c8eee7a0e2175ca5fc6568e2d6cc4d0c24b80a3941a0f3accd06eca16393b6545d1518646aa08cd2243450fea62a2830c7d2679ecbe0a8dee129d3d0511157a593d0d13c653fe670a8dac98cdf289527a72293492cc3d4327959c338f425f163e04551114fa7cd3414aceca13ba182bedd2ab38a1998f39a90889263ec44de8c74a5c8a103e37b48891c50c10fc8daa1360c18426c83edfb90a2a95c84b68763c9c582e33cfdf2aa1d1174f85cfd426a1fff989296c14a1e3a8486837485395359c47e8734839c597cbb7683242574a7910a73b45e8e369f790a93fde5390084d7c5f932c161c42bbe164728eea906448088d898e98abbf0b426f72f2968a7740682489cba9cc13255bf007bd0711ff5b413ee8d245356911117e44d68366c4080f7e211e3422c9139944d2f5bcdb0e5a11a62eeee62984a9833e6326b1246339682fe9f53c524b45dd8483562e88f1b0233f69ccdca053f1548c9737b1acba10b0b0413be67fa5bdff3cfd5483565f4d648fe14383fee3646ef86592a3971934ff3172531c15d2dc94411b45768ee7a03ccb081f470cfa38b3b926c39752ba04832e67e80df365a1b4ff823e9cca95498b850bbaecb1e1b22b728cd5b7a2dff90b23a6a383a4d221bec344abe844a4e70a561e55f4953c5eb8d6b049bb26156dc990bf59555434a74909cf4e266465e6145d7e694939996ccc1e53f46726f47f672f4597d7c2a4e86747e4c96e2122297d148da7b867fe9b534c998ba20b1953f35e5209328911f2b28c05650245a7595cc3bcf4894ec643484af982d6139d9ed857d92c9db82a65bd1027a416c1e0446f4ac460eda34db47a41290931ac4fd0d144a7836e32d16ccfc65587d029c998783ec42a5530f5129da8a425c994534b746aa11bd994a720645a892ef799899827be3d4f89ce3cc4ebcfee243a95922473cd31e84d4aa2f964212e960e23d166be885e79906842f8a856aa5749f98fe84412c2428a7fe1f2695b68e188460449fa256b8e085b23fac93f1763b94597486244f3f9bfe19abc54d2fd221ad349799e0cf38ab3221c61d2376a485122da10ca37a5f68b8866652e3526390f8fef21da1ca2769e88a5219a9cdab452cc24af2b2c44db62318cf2ff08d19f26f95842c975b0dc204cbae33b4134572d9643ce646c6c81e873320d994ddccc0488ae24ffcee456093aff03dbbf222d7b2c3ff4aae20f60f4a1f3d63719926a52992d4a80c1877e7265ca4eda82beff7b68cd84875c12b4c4a7bc1e7ad316c4ba584f1ecdc94317f405393956994a3e78e84f56c8514e63eed045cbb95bbde69982ecd0588c9c51a552874e9f7c105a937ac558a143b3416559aec96502060024c09843674a9fcc79c4649098954327b206d5574be3d0492d5d8b793b76d2261cdaa45df9435693cf317c439bc5753689085a7eb53c020c37982284ce51d386de3d4dd6b36cd033b3c1d8d9b4a9a66f96a43534db39ef2411496a70440aa97b2b696873dec949a3c5ef57111a9a519122df744578f19ce192b950a995954433b41fab1da4c419f34e656c154b0146199a70c9f44429914d7c4486b6ddbd2c04d3c8dfea189a51d75429272531b4b982ca97356ac2d025799ac154ccd9b2e360e86447b50e2a5b9cf6f60bcdc8d821b887d12532f4422732584c1583ffc6c68800a30b5dcc16d1eb495ce8926ae6f776b352aab385de3ca9e63da921c610d7429bd94d3de4c611d25421c0c842eb1a4e2f88fd9c421661a1393141b2c4c85ea19f0f3a889c5174ca1eb542179f34760ca76e4a885568e7726508e5a1422336c7d331bb20c0984227948918848cafea1262020c2974ae95ca32c958dd258a42a7f36526c99d745670a1d067868a1c92928e18b127f422b7bd7312296fcc14010fd0c24550039700c3098db236f37491a7b5b24de8845ce7fc3d42474ef1b7a0e19600184ce8e49312e91673d0bd95bb323096d027317e9eb39e49114f095d34a1c2e34bae8e658e1b3628b0001849e8925a8c944108f7d421a1f95ef7f00f31870ed923b431b3568e52d3154f82008611da9c4ba15a1942a25a842ebe49f94ed199ac7488d0682a21e227eba6c872085df6a032415a8e99825cc6560c2dfe861604053084d088659223f44e6004a1f9aad822727a20947373c8259466f00d09307ed0cfcba657cf6669366ea48201183e5063ca8a45f08af9d92b2a80001c8603ebb800a307ed24655512e37f4990e3283ce8520c9eb73d437c01183b683bc9b2a4ba93ccfbc91835fc18f1010c1df4da91b2b5e42a630b460eba686262d27f6900060ef0c939d4c347c6de1660dca0f72cdb2be1f349d97d08306cd0448fefdf8e2119316adcd8c2140ac0a8411767b4668d947d96372b011834e8b39724d964116228d10360cce07ce2294616d5cc9b8c2d19b4a3fad37d2b45d6fca01abe1d80110374fe8e912b7f6add701a5b64f1375605306090ce31ca0a305ed0e40931082dd1aae2335a9fc3736ce100e5000c171863d21a734e13f1b1d40a3b5ad0dcbeaea800022ae0c205a26143860b17e6050f56fcbf6dc2f324cbc4a86123860508bfc063157dac2c79cc4c4fe58b39723c0e7580872a7a4d49c6ac9c3f2ef04845271a94f4dc98e15a20033c50d109d56c65217249d8a4960e3c4ed1899d513a33759e04346c307b98a249519358d3314604fe377250e0c63f0d3fe6048f52f45f497af5555f06cd21451b3f264cf018457329e7b4a092e8218afef727c6bc49e74c8aa185088e080a70021a3520f0593c8d192498712302347c8b11f449c123149d88e8ac7a9648eed00314ad58ea89ce8f7ca2bf503a467f984c316f50f0f04457fd39ccea24bdf1abba4a8f4e14adaf533e5c9ee0c189f683889bd07b19cbb42f786ce2903911a937c6081e9a683fb5868f79750b63ca442f4a55d64e4158bce081893eb7e885a78a0e15962e785c02a56267f4ea09494b3441c5e0c15f3b454a522548e1d9a1a6ee924d9bb7bb4ccae7cad89a5186e04189f674d46fff9c4da215aff8dc299e391e070ec3bb838724baca2a133dbaf84c9023d1a727cda2bd3476f8ed40a29da423a41474fe83be8fe83d8593d9ff63381322817a38a2cd31ca72ce8d68535b44e78d2160f06044173274cdd75369c8d06311cd8f06f778e29f1d3445118dc8dfb1540e9a2a8908091e8968c42b24f687909e646ab8c131032d0676071e8868e3c6e09254fe1e992c7a88ce679499f2105350164c3966cc70190570e1c2858b1b7818a2ef3739ea1d495e9010227814a2d370a1740cfb272ff484e83472e86b5834a91f92836884924173468bf35c3a14441b215b92b9b19b7f4942f008446bf293dccd7c098207205a1fcfcf0ae9a2a6321c40f0f8431ba48739f9b1447ee0e1873ee694b993e5d1a1c4028f3eb41dd761b24905a1846367301f1a959a23c42088816cd8c8820b0c1e7b68a3658ffd13523362e070196727989166dcf80b6051060f3d7439747432b90a934d270fed5f0e2622e7a6fe140f9d57d498f09563fcebfe0656033ceed02837a53a9688af496ac62b50029f405909fc46013cecd06fce299ba8e845d6be0e9d6cd5eb8ec193b1e5c2c56771e303288502c4a0cf215aa7ce7ff2bc210cdabc231f23e6f4822608136142c9930a0570411b42b2b00e2ae86ff2b4a28b9d6f1e4d934ea6d6072b7addaa1251b1318818f4b18a36654c5aff2a2b9babaa68f34d478e5031c43e52d1578cdf1f2c76f6f0818a367a8ce9a32c7938df0ef1f0718a2ea43cebda49a62ce1c3145d5b7211627293057d39387c94a2514259c489a32b0ae0860f5274a9a595b26511fde3368ae637833e75dddc5a42a2e8f38ede5c2a55e80fb38d8f50b4b137a8f788e76ad3aa290c3e40d105f91daab447e7a0da8f4fb4e2ebbe1b36278f1fac31633f3cd19f8a7daa7b926250ba8cadcf8f4eb42faa99339208f8e0442b31bce61c3926492d62c83835b6701af7b1895edf3f248ec887263addb97b72dc929efbc844e73b2293bc995c93adc61637f803136dce2046a498dcb3cbe6e312c5c9fd7296d353638b1b96480761429af454a2393d29af7e29a9247f8d2d6ee407255acd219a5f588a374991b11543068e2db420e53928c075de048f1f936857236636f9493e4b1ed928c087243a8f39c78999a387f812fff011892e4bc630d9848cf07fba3b7c40a21d1926a8169da735f747f4a3f47455b85c51800938a2915e2a3dc78812ba3d96c34723baf8d4a632e227ca930a30357c30a2d19c44662cfdcc2616172e709002c3c7223a0daf490509313d998c221ad1d2145db724a2af8a987352954564084144e3b121a65e583d1d9543b449b72a5c62e7301fb980219a0fdee1b45e5e88be67c4aca7cc3f08d1969ef89fc475a694f431884e368f783599f3218852498f61844e32217c04a2f71769a6c4fae66906107d9b84d429083ffed0c6d0a8f329af8e72cd871ffacfa2c368d28d9754d6873ec7982de6f00a1f3a913fd9bdf48450f95ae1630fed09e9b1d7527ad2a0d543eb1ab3af073f350f6dca0bf7030ffd088b9f2596e497e4c0b1058a91458d1934500d971183cdc71d568f21e5040f7a8c0f3b34eba137cc544c1dc9c0471d7a0956e2249e9717f8a0431f7459bec81124f855e6a0c411fd9099e2c00f39b4fa417a4fca39316426638b3c0afe6f24172e74f011874655c59e6849a53862fa8043ff723af4066352d9db4145836a6dd0b00cc1871b5aadae2c156d8f943a3668c440550d30001ce1a30d4d5029b48807cb209b0f36b41526c89c93f4fc319f1f6b6875848e95fb454b7a2b636b86091e003ff85043237272f9628510346b62d8471a3ab1eef0399f27c263a5071f6868dc457f838a27bf9145e619fa1c8fd721a6c8df485636f83043a33b66cc25441e6f2b95a157c9a93f482c19e2e3e1113ec8d086a41da35f15e39f6b46f81843673a98588f1eae5a530cc28718ba70af702129b6694d02c247187a331946ffa834a915048666fef4fe6b8ed9184babf0f105a35b6ff98494a352f8f0421ff2989c8b099ac53b5d68e406f538990f1666e242a357deca255f5649930a1f5b6864083185a5ca21576a01179554ca0eb9925968b37598f8b1f38105ce640acf5d7a841ef8b8421ba364e59194bb337c2cf061853683279d573d5a840caa42bb6f6139c6b9780a95cfe1336ee4702dfe46a9297c50a1d5a0357b538597e825195b27468ef320f81bfa318536895c9663c36c6491c9d8d202c71638f0430a4df4a4da31641585b645851483b6c8d83a5ba01a33a07058091633a8f647646ccdb89103c77d3ca111597fe3b5332387161f021cb7c58713da18214e3cd56416339ad0e79ca363c7d31771e6c2f1c184c6adbc7d434cc614be89413e96d0c789bd561a9459b647c6968d1c7fe843095686654a51ffe7440fa0c0143e92c095e79bca7bee14bba200573ce08a0a34e00a327c206113e29226ed65617d1ca14f2a4b86f07bc26488e4f82c580c1f46e8f3723b68b24c32a445e8b4f2e4645329d1324484bea3a8e610bfe428f50ca1535a3c64543c73e794b11523c76781001a4e8246394cf0349c04efc2c50d2d4cd065f810423fa663d8789e92b657540001577c0e1b17f01c362a70450168d0f0c28f20f49dc4456bcb5920f49d29269d739025137cfca01f21af73649d2816363ee8bf828e619258fe659c2d6ce488610371093e7ad06a875d89b9c43ce824e714afadf7456326821d3c973c6c5212541df431257daa62221f39e83fc45e854b41e7fc390e9a1c13ad4f856ebfe9e3067d8e16475b7c8a0ddacde56b399624cf720d9a6ca13f4a248906ed99e8b2a8a7a2e4a8ad113e66d056122df937e2a4b6a88cad187cc8a0cb35953c890da5eba218b46172335bfc1e0606a55c3f9fa82863ebe3058d88e8a752cce95ffc917db8a00d6b59d994d269452752ca691e4a94b15582af5129c08215968c86f896b28a7b83e5a91c010b55b415e4c54d3148f524b154f49164e2e790723a99858a76a4e506a14d6e7c845811b038459b92d66c0b296c8a4ef49448cc56eb183d45042c4ad1fe29f99c298b85148dcbc6d19bd292897b3ec062145dfa840b211145fb3986090fcd62118a66e454688810c302149da694a3846def138d7f892092beec89c63f47084a05a514b0e8449f42fb9e5217ed93474eb49d84596cc96da2917bda5ce2569ae8e34bf4c77494897e946fe78b22a388ce60a2add2c899bc4b346742e8789a432ca12596684c75d49311479568c3e3ca259aa7c6f828d125179d5b35a41299a249b4979f64574464d06e4aa2ed58d2244ece45a2cd933c95cc49a3a71c21d16b5a9fa99cd743888f68849e982bf526a1f5774497722b3c65ca35a213339dcde4fc8ce8daf45fe90d9b45983cc2acc6b8a7884ec8104fe28a08915192883eb7c455ea0822a2d9f1d3b9c5bb43b49f96313aeacec4d80dd19c52a23b94980bd1486fcb9074f68f372121902539294f4b924134f14f4a54913141f4bb4926ff594d206c4b32c424d15140e42135c6648ece1fda0b13473e4e16ad94f8a191f54c416c88a45242fad0e8dd14a1b5433ef4e1329b848dff9221db43e71f72123991b3a0bb1e3a3d952de278bbe98fe6a18d713ee58e88f1d05abc77d8900f2adea19332922dc431f9b1a61dced21a9a3a5ca6238e859852e8d05a76cdcd3c55ada69c437b41743d4e7f6993961cfa9953aa2ffe34c5f6e2d08e0899ac42cea5c94b38b4e241874dba226f683744fc121f4c88142f6dc0c20d8d8491292ae6601bba20d152fe78180b36b42b41a51446a578cd1d166b6846e51c3534a7540cf1a6644a05b048432f29c5bd1039248c7249fe010b34b495fa42656ec534f11a018b3334224a8a097f2263f7880e5898a14f25e73dca4339605186466c5c89fbe4dc9eddbb376041862ee812a6654d35478ea8018b3174b27af1424a3219266357062cc4d0a5bcaf12e44d46f4fcb88045181a212d09b99944e9e68a8693c0c60d2db4d0021660682eb69a5e8566a7148b2f64aa7fbd8cad1931b0943a00f8000b2ff449d7e297dc32a541d9854ee65691215670d323c2853ea54aa963e66c01165be8b4af65732d9551252d34a6494bfd4bb5e54d163a9966c2e48ad2a4592c74499867859d28b97285be839a98acb000e0042cacd0e4788d9994bb018c93a8e4af45628134128a44227124c33048f01e01b3130800183c2e8f0622a1609e06822a7e140004572e22443a2414201e1e18168ac30261201006030381302814088441c14040200ea3c441221ff369839f24c1e7efeefb444b946a14d67fa5555a94aa8ef54fee8ae5244d40f693a8bc2fa09c28a9eb48e8c7d3538278e7bd1fa1b35870cc244da6665292844094c941223d641d5656ffb8fe06a909038c0f371588b76e81fa0d8e312c7dc984464efa20a726aa747e0bead82dc9e8424fee1819d9645184e80a86bce26a73a18aaab4bbd4342dc0b6339234885a7ba0a5a489a768bf7944809108f01674b3f466890a601c9531e920c4a32d27f68fca9b975cf96e8a3f614975b8fdfc170abf168442256686cac8f12f0df1456fba5ea06d508bd11a56473c24947ad36c5eedbe2fbe60c51c10363f93b334077054fa402c1a7282d94f55fff9c139b4e9ec2a33b73b2407f54bab81665b685069d2364fc598235e00622353aa9e8f292154d2a5d86af40ff90d91830b930ee2ca01d8cfbb1ff5a49821d9973f9f358e6aa627496d97a776bb351d56342f23de87f7ff2b3d95fe66a45d05b1ca1aa94daa1e903059646e831d08c5ba1eebc60f085ce334db123c78337a0a315d164a10c6e2421f6d3606039b9e9def95ffaaa9257b9ccf828411f518ab8fabf7a80b4f96c696546e625071219e152554014acad5095b7924fbac526f46eccaa9392da13d4b7870b28319c4195c14a12cb177d1786fc6a038da84f73ad7acb015a4d8d21b5527cf136a77512c4934ebcfb5965eda3c090b437e2d6aaa4b2e25901984d0450e124e82c4edd8a07e1f7f1ce6ba34a67f8eb7c8edb7968bd9da3de782ad9c77c18d5aaca7abbed1716973b2b63c49cee060aabf4c66fe5a7a19ff6d29bf7d9ff7a23316786b22e4f464f84720dddfa7d0212beb49ebcacfbdba59f7d9a9a1314426037eeef624ce6db040840c6ae0195488ee28275277e3a4a56e5cadaa490ec81854922839adc025780520e74fcf97a78f45a2536e630e2d77091d2ec428b7f13b05f1d1137733f0271eaf059f4b06e64f8149a5a82ed993808a92ed117ac237726b0aee9b062bbe0585b0997c60e70022c780fd74431709e844bb96875bdc6c189e26cb886057664f02dc492c6076f1bacab773d05d5e11682421dce410bbd0a2b05861b15316c950632de2ee708dcbefd05f6cc58a9fa1e2c23ee669bfe93b72d1681865c963e759c9e228547f079f935dcf47bd42f4e70d7d2caf6411a4a1dce2b43079722bee7e3511bbe3b539de68bb2cbe1fc5b7b0e577872357bc768384dcd842494a39c2922693abd871a930eee22ef78e43d2a633b710c7ed29fda8e3181ae365912a47a5f0083605442d493bf3ed2289671429f9c00c3049436c8e60d58220d255ad7e4b3b05eea16d54aca57e97009bbdf14c04e81d37cbadc256605090c3ba5f71301c4e43865f3f9bcea6f3efd432216d7306b14f381ef594b6a727a578ae13e5471e49cd1010bf64c85e73ef134964639c0ccc9dc6535f600d165ef1f720fcbd276993ff062940da2b10e2d43f026a4e021da8a77114e351a3808effee38802981a95d3eb3f41b146f90d1caa5eb79376390c013f369b99636af1265b39c13c97280c00c254113a986f7d28d4a332075426e70f9a32bd5b7218d29b832519329333d4eeb4c6eed781b583448e33bc68cea3e204c941b48945df79a00246eb82c3d852edeabc50d61dbfe013045e13a5d15b8ada09154dd60093df0bd0d550c40fd5884c1e16ae9389e309a08d832109e25f65369a1ddd8366c05bc5ba54d54781f1ce2c8640557323bd06c47f46f20d23153e5a40b5917a5f0374c8f5bd05ed2de537d2652652da22ed2a449b4e8b4a46901b15cba71d753dfe8040ca1df21e3f9ec2e584539bd410799d3a17979e94fabde588edfbba4c65dc4d702d56090c6f3116356b6321d11b2eb694ed223a587f05f1cc551d0507b13e2c8c5105fb8ccc969787db5b638d7077dd533145ceae6cf5a7da4651a803ef73867828b9d0a642137e71307740cc932db6e638426973910d574bce6903878c5f58dbb0a3d7b3b57f15ac9d477d9408720f961deddc8c100fb4597f22a7bdf393b969a0ca0540526244a20eac3f2a6ceb896ae2cb10878b3a45a1ecd0a241eb82c29efba700db49728d5d65867f0defaf11bb441df21bad3616b398a08892600d5b7fd8ceaa1d951f9608b444142640d015345a3aba583b8c0dd64e598fd8074c04abc272d06bb24aae0d3675c74993d2f6917645a55aacbde0aa92b369d486002a9c94779797b122e310c9404206a3aa4bdcd07270857132bb1a049e1186452e983a09981c1451b6ff83cbcac6754abe995f343979a94423c20bc1e4027cfbc286f9b053d7a9c720e36c6e94fa9b5ec01464f7d2cf5b377b39353e96d6e055415de183f9fe7e17770cef191643bc792e32156fadaba5df56d258f67f87733c980f00b95eac026360f813de39670113ef18bb4a993f01ee4acc4b995e9eccd722e3c443b32e30eea9eb91bef75c21b54883c1a1670b94899cea5c2055cd8e16dd2c7e283b47e5e11894d08fe10d294102dd51f1df52a40c700d004136a8c0565686133759ca517aec9310560b5421409d16d9450604847645766abd301445549013d1854c2f960c96a0eb0cca647a680f9cd39771a01060373c80316a4a71ae6efe030ce6ef603f9dcae73c38b7dea07e15e609296bac9612c7b77035b1b8b4051c130788c958ace1f110fe413a413e6a1684d8776bbcb88143ab92e7c14c4a1ebccc4c5600c184cbc8e17128ac1ec7f607681aa636b61e9eddbe368c10628277cdf28a5ca259314c9fc4c391104b1080962d91e40e640dc3e0223581a69ca8af7cf1ffc09a993c5cdb49d274fcc2d1e7832fc63797af3d7c9cd34824d440b0e7d8749df87d50aca4c5ce3c94aab124f9a92535cecfe00377f4e251a97910f76b974405cc6d868f413ca5c89d8dc34a389b84e0657e279a7f2f5b8ca32ae8753aacb6cc755960b002ee4c2f5100f79a0277365d4b59eaf24f43212fa27fa5681cbb84b39254ddf656cadecd3b9a12bf129a8b542c7758e5dc6dd10911851b88c70e3855e9871199dd4b576b8dcb6542a202dc287cba86239c64ad35c460c08debf8c2ee3dcb8b1303797113556da0fb68b092ab99e44e1b2cf85505d0fb1cd9db8ebb914736d715d782e2613dd76d44ab86a00cbdb65a445f11af61cdfaa7c5dd2b30b3c31d45c965c23703de47a472ee357560a6d692e230576c22b6b0b9481a2a872264c7982a57245fb3f99ebb41f20f9a03e264c0c10a498ae7ade1f2460f7a8444d3b13123230af364b42423e86bbbd12223a60f03c94b1423527a1fa579a27443466f9b1843a0601fd9b3edc0774e61e82612a2ff174e8f907b53ed47fcd9fded84c493b7eee22ec32b7882c0b962fd7f30243951aa4c22123ce735f800028258c9aff470b6db6c96392a49e566f61ed0ca95d645f4c97b9d218e792fc7f1146715fc8478d108f860ae8d75e6348b30c393575fb3ede95629b920f209453e9db56af47201b2776ed94c8053c9cb2565ac279afb7f3bd86a340c9e43d5e960f69471d3c52bf8e37b399c764b03f693793629f8b0a1db80ac28c9a701c7f693cb6c6caad89bced2dbb5465b9ba3b72032bd1a766e99ec970cd9a1e894575885ea1168eca48cea1ace5a157b7222517206ff880c065bcb4a75ce6ee722b4407c1b1b591a8c14041c51052e8160b30f913ce9f0085089bfba0f01bc48ccb8cc875832046d69a17ae11eb805a456e068331b82915aac90f1c98708370620c36483f5fea18113637d31435bc8319d993cee09041a718bc4aebcf5ccf8af22952da2bf10971db511ab058ccaf960886b416d190018f1bcca07faf8ecba03d06332323583e9f0f1c366166e84b0ee180e08a0d66262629873b3eb012c2c6b0be80479b83199f7e8bafc3a08f1bcc48e9d8a041048662b08c8dd1f04a4658fec1fd11361170f9ca63af300d3b3d2334f041d5d0366fb0f133a44a65bbe75d698ad681573481d0410068016a00203692697c04008b00e69fc0a92c20c00601981419d5600f7070db7b22c5025a601ae81009c06d00845d6fb28b8f4090029e8300e67fc430193a802be9b4b3b23d3f1d60024201e614f0054e74bda8b62bd092145fe88004eaeb01c60907029b0d00a21780f0487031ce2e2504aec9b1d3b8e67dc09d032d23b6b550241887bb6dc05c010c925c11391e00847363b4b3b1006018808b065ad086663cd6068c21804170821a5809bf76b5055742dd168611a05d609d9c5a1da7c02c00de03a016c044922690ed11a0051d3939ac00688d015a3061f8fd5e00ed0dd002bae28024001d02706565240e9c6c050f4b01740110a500b500262055dc8d4500862e5f7af1f47e4946d4b37a44370f2c13625be56db85f886a085010381ea2e744840e728928970990e9b5bffb2301829010be40cf2463ecb0954bd90f03db90d69af3ff7377f26f17820929939386f361b10ba7a608ed807a76e67388da10908000b1af973f5b22883520de4aa8d91484d29b7e9ae1f53a0a9854581ab2a4f585942a6180c55c931270bae11ac0679c80b04091f990938084e66c170d5231f8412a02262b554e02b60343e107bb4917f08839d271776c22f705712976c8eff58a27171bdaf44670840a1da463eed673de191db5776d5061cdaaf193315e01b4429502d0153a7a28e837e9e201639516821aec30b8d2601309c147199779960019af66913a825e8253a04063cd2ef92e0f34b02c0655627443e527a59c418c9a681dfa9c4d7aa2ab60fc148374c5046fc4e44931e7e84e6e0853ff64407e7edc074f457e4c3504776282fd473fdc6e679a57ab53f054764c2216dfe3f9cc9409255ef2299b3737dc36ec39947e49ce8075744d0b5d14cd0cd6fca3e3cf92c4da00a6a254ff612d8f0908a3ce04d683627f751af37bd1cc930ecfaab2d7aa7b8e48de5f9fabb7ccd7d05b9fc35eccc0c34453b96c7b45332eebdfd4999d725f3b4ed47ede4ee969664dc553fda63b03de8e1e7b9230de6836634a903b5e12f80c6258ede98db4d790fceffa273cc6fd52c29bb00ce808140dce2aaaa618444222857332c625acabbb0d6cda1c2dde85392214aa8c0d29f9b7877cfc7273f394e1868051dca598a3a3bc089e3f317063f5b5c43f4cb264429450ea4e76e330b821666753a079296e907290b6f186c431114301f46a2cef1b3eb0f975a505752a579b5b8e6b7c15545183e2be3c84a2e79e3995f7f04066795ee3d34da1bbe1c0cd9cf22d2c792c4bb740e75d06e3c454656cf36f8d150e3138045fb50acce2b02f4e889539068aba398c00b34890ad4f2044352fc11205e453731e198df9c114077378725b4e67bf1d2ab8aead0c4ec4e2e105ce39937cca4a2c7b4fc9ab3f20d2aae16b33263a3a5b51bc81e03e380e2807cd43de3aded0585d40e610f2658f1bc7250c72f1d400d8f7871c420daf66e2e07fd0415464499335cbec27ec0e7bc78c1facfb8b05627409a5552f81001fee642598fdd0edd501d6394c1c954eb15c5800d4dc4ea44f891aceaca1c8e13f05e588ae8bc53f36398e79d50c6334d2fa5460450f394c42489d4be2ee3f0ce8066ce69eabee84a365ce302dc9c136c2ef0ec451a2bb1baf7c4dc8ea5ee865243b5639de62dc40a91df684dc4b7e5231b00b1dca81dbf4c81d2751d7ebfee5be42eba38c11f8a621e9048167b261fb3d0a942d4ec973191b93eaa392bbc83e1554071e85fc0ce2421840026151832e885f0d7bd2c6dd1aee42ba54492ce6693f8b8548c9a91c9b448970c34b9681f0150f0937bbd77a279a17c2d0a7c3d2b61919001d00debbb0ae934e7405c953cb310bf1714135537f8d01f90ed5f362f32a87c66a615684062ca9e3c5adc9e631da4b098a28463293f5e26323edd6dd93c9f9be48eae36937ff606457fa538088d85e0afe0bed40bf5a65826b047c350e91b80d61d07e801017e421e198568d9abe6a0c0278ccb8312e35723f019f38a36dc6e8b360b677bd9d75e3b15a93cf8db26d062e9eb76c9704451f467c47626f6ec9e647b87991cce3c43e9c98b56d06e79c5bc8f6b065e3335b28323b44f43d01b9d54c207715f30a5f461a37238f80d7c5a12e2f46cc3ae3f9976e353e6fe32721e98aad571646d70f0b9eb75766f3c50a7f465178cba7559bdbc165c6be41d199aea7631207a753c87cd4088e1f5c0456ac2d09e6031020b3ae7a81bcd7084d0410785c80119ce1e496bcf15c798cf50473554b0a8d095b635fbeb58776bb39a27988c6ede5c314fcde1d81e523e32239c7df6cfb6ff141f909dd618581bd6879ad1449cc0cc8fe2463162f627dde107c0162b0e7badafa37365979b2b78d69210a1cb730ebde9bfe04de2a5881572e1d2e281ceddb22a7d22debf84016625054121cb2e0c285a946c5ac6e68d3291f9b2c47cd1da2efc948f0390fef0593dfa4dd60a3321b8834a0d2c44a23650f4f872757c779647dc453df99ad4df447f34d6edec7ad938047aaabb06b7f9f3a76208c196f3320167252040e2343b152425dd08616b2015d2da140d305e423e38105133c1224c0bc9cdf49317158d745330c16122293082fb9e56a764c5d3310dc83fb5e3937c5f224653bb8ae40a2c7e622c71ce78314292a7fb6416684dc225a3bdb431e5eb576a9668594ed52b1fad2f84fcf15511729d6563132211745aeb0c883d05ab95d34887fe8daaa15d5e61bfa107cfeb3ddab84ab6d24c4d300531ec9efb65af476b79834aa17084a3b90b19aaf225d903d93d356543c4542a4b47f605c37cb9ac130995550a0cfaf4ec68df8f73b15e3aa52fd7c0d4dbb4d2aee42d69d737e352615318f001b86c1acc01325c14420cf1b42aab000f0b080a5f0ae1a6e2b1800ec12b49c3cf31106c75327023229edd71214622a18b8b3b97a7c7b48ca5b6b74d235f037806526f84d6bbf2b9c9ac7db088f4dff478e8a3df727bc8ff5c5cfd324d47eba6e860ac0b79b549071a847dcf6feae7b04f0105fbd1b11114b846feb809ded9261acec9364b688df4e2d4f8ff508189fd498fddb557450e922a02ebda8805504a1b048d4ec01b3d0a87e9ac0179bebfef9adbe5de6cef3a0477e5988c4a30642650748d1ad69c5f133b249b7080945dfabe819f18e25f9211910309f4784077b6e86fac2111718b45ffb3b68c090cfefde4ae8eb31fbb99a0b31734188b85800587f5934f63e970a47e8d16c06fd333321a92309a80824da2d8ba35364e23f01c1d06865e6af4fffd534d485801dbf4b12577a4abeca449b12130a5faae5231a83192bb85db5350eab26197b8613bad2acccffe8347a771038e33fb0b2e8ea525a476addbdec3700fd4025d8e40c2d439be4ab987c89c47b5e630e39386e97e3c3ccb9a409f6bdca0a01b1734ff51cc6bd45359aae1e58e870079e8aa9113d5d495f3cb712c77cf8ba842ad4b7c39e2baac30e4dec6eab4af5bd38be937851a45fd84bceeab00aab05a00d21e18fceb5c27a542b80bd941399e2701ba86158d9dab1e200a09fca0030a8b4f9ec746f1eb1dccdb295c9c06d70759a99e5b647686982bc52429912833bec275ae950f6c0255fe3af15b4d4796c6fac59112e4d9b53362945e617f28a11664601160fe51ccac22f8f5e97cee4c43951c6b596d4a0837a5d02157d67a152c41078025f58d6069ae7cea58088cc204fdc6b65a8371f6fc028dd9edac7a9cc2b90999cce0a247c94be999c5619685869470629932c9bbb5a2ab388b44cd9503cf1922ff002274fb1c7dacb5d2f7649877dc15273f35c2bf1ac71beb3e8333077165d9259b0eca2e12339247042fe7a1f82557d1c5f0b34dfd04bbff8fc9a6013f3075bb9796fb7c0a0014c01438933d422ea1a521729cf3c6a3e2f805a395e4a1180c481bf19aa22af0088d74a1012323bd6767d65bea07325e252064bb805b95c94aa4f832784b9ced3ac65c45b9705b3c2d925c74186c1f5f115dfc4a3126e7bae8dc3dc4dda167e51b490dc8aea69859228ac1bd90d60e2596e461fe24b7c8bd3c85becb6f6db1ba41de89e047bacfee7d5c5ac1d45c5c138664a7f4fbb0cc28ed5903a044f32003f48b4ca29eb287db35feaa4302d7a5bcbed056981b6a0571235911753cae040a4852add8a54178a98730f17d035d2743f735da3b042ed2ad005a443479d342cfa1ceffffa24b10a9b3cca80dd3e09d520ed015f066e7c5df8906a68f76e7f3ab174189f2d689bca1fb1c9f66b3299f55977ab0960e2605cafdbb33da146216c82c5684bcbf148ee12f9b4207cb1fb33bd31f0e22ee74983553b59a2a2b2524300fe2575a0dd09d18ad100394ef6d940ca47a2e5d459f1cefe237ec095c2ed033ad77148269fe7082490b686ebeb56e01bd4e9b2b7d87fa8d6d1b5fbd6053673905b07c7586659af7c98fe0dbf609931100cf209c6222c5136d4275db1c4d873d2d6e4920a38b693db23324cc42b7006eea62b96135fc4a08af501ec223dfe694e10c56e02f05bac9fee3118aeb8bfe99f8e8fe33a8d54fd8dd86dd11cb442c44e5f5e1641c13d7cbeaf4990d07c2987db265f58df38c7a42ac7efbd5ccefb950e8a77088ce13fe98423171ad89449f9a94479b9ff7f82ea9dfb56368927404e5b46867a47ce7cc4aa76f03b9f22b1a7894901085e5a0d3bd36db806aee41f4083407e9babba785ae34daf13c028e46ba121e4857197d01a0f14f7b741f229fa6f18591de6c06f8fc63ad2f20e60a3b8e03dae25ead2025ce03daebcac1bb2cb02a2194ce44c2745693cdb89f020a60ff15ad5be3903abaca4be08e2a787d9cfa1a7b54449094062a0018e05267172b63aa8a3e51c84d6c2571308674760b10b2b3151296d97b91b8c5813187c51dd146bf7606238f5081be6b5c99bab85d271096d8646995a00521a181e40df97e98f09010ef3f4088c1c50ea8bb7001a93e796172c8f4dde5d9ebcbca2bc7bf506e6b9e585cb639677972727af30ef5edeb07a1750026632cabccf94975996792773589c0eefdd1aae65e5f23b0f72500a7bc5f033d5ba81ebdb2593ce4e643daa2d3104921064209c40201e92d18c3388d2376df841c98d57af172a17c64b220010ad2c6a1be579315372b535b9d255be4356ddd728a64ea50c16e6b4608fac17134f0c1c2aed00b9215484afbb8c67faaaff1d5cd65adf0db1e4b3a4e0c98b073076e474eb030f1284bc23f327df913da692dcfbdb3fadc676d18b4dc9bc893107f045875bc1130b388a38d2e20a82dac2c4315bd3d326e09fd15e63e2fe237b86d46a3f2cb301983818327febf0adf19a4ef7ba6ebfd19d1be1e0e848565c523bf71ef8f57d3064638967277ef3286470670f4e73fe11a6c8d5581f4fab048c756bc4d18763fbc8d08068420c03310cdd0ca5a64a46b63034b04222eff31c5a4383a72a9a2f35b852d729cffcc82ba5173b4475f0833e186d7cd9c00f27d71304d0665edcb4a892b6813cadd8b2213d5af878addf733b35674fc7bb18b24b7c34746842f33a69032c63f9ec9cda876aa7cd4670e7cf5b1c2e49e993b6f9b21e6b2a2c161ceceda2043a079edb1ea3dc778aa3043e56a46c6fabe58c30c7db1634270727667e9c6ae53b5671e69386c2de59ecb2d5d0fe0cf6b243b786b0658fc3302f69c8e6f4e245698e6c81fc661292a05cb944890f4da2396c4090b91d382fde4229dbb0e141cc97d7414f2a7aab08ba7e754399020fc22c2468a44b749e123bd74cae68e1c59b3dc3d761a196e54abfb7a9e8cfb6c4dec42691cecc75e91c8b83e3793a6d02e40595b49029592308812a1c00d0786e134fdcbb0252634d01f09781a3d5719e45c9bb8dd12c339f83d41e50a6a01c96a0e7291cb5f34723255c5b98088c9eeef8c0f8098b803632c10039c802f048c2e4c33bca46ae120d986f3c6d2c8382bad9b5f84cd52d1f46a2c5e5e90b75f4b027d7b82eebf77a6bd0e1e0dd6879caa6475094cd53095f233238a080d94ed97caeb1770cd4c700a5ace27c13634b3e86ad9e50a3b9d1a5810021622e44726ab15b578b61eb7da43fc7de23b870051a15c2f445ea034656c0c58fae0745f549fca786f27d06390244da7676e66c246623b15eda6ff487ebf6a1a5bc3aadb359a920615de9cf8a0e2a611f302d932fdca80b5297d048f0b911e4e0fe576b798800296dd7fa49f3cb1dd0e6cea12f9489028326f130781bd296d1e862c7e580656d75071621a3f2b347796b547320543dd13aa1569745cf0c8245a80c204c51c7923b83954dcdd7689a392136a39e0502d917f62b7078cc08c7ab2f346e69130724e14cbe4ae2581c07a7642a47792fc8b156aa02461329a8d88794a2dd87f795ffce3640bafe3eac186d80c4117780b869ad5ce080fae8541739c649911214cb03f2f2b01fc38adad316da05d892ca72604e150d9a6fc58a5b96600ecc610505f194cc790c96e830a9a2b5fd4848be4e2b384c19f74d99f24a0624d20c3379a68e4b8682f318ede3f885ed6a0051a344c70e58563ea789f4faafc0f4181e1701ba12a4a64e9df1e9c8a4c780ed5a6601c32200cf02bbead455b064407e7f16dc88f7d9b78c65c0aad2b6ea032b4efd7068389c00032034685e3e26b630e4163be3c1b897251bcaba9dfada82bfb5dd778524617374182a06d5356198042bb9593b957ccc5a17ea9373af378f6d66b06f6f7fb015269f04296618d83158788f59673de0133c574488685e6cc282e74cf92f2744ff1b402d4f4581f60c1b60b61d3c61062e3756fc8340e864c739e60ca998576209d5308e7efb63077580df46814c377ba5c15d56855eb66176e70ea1fbdba1e810a29977405eef6657c108ce0a27588782612ee1ff604c0bd7ee9820e9c91ade07f50aba145e82c8a268c974b8a64bcae3e7681980200344042effeea62b908197dea244b2fcdf02dcfb0fc16defa7bdc31ec1f5a367514d688e6e58f88cd614aa76899e9a5ae4ce1e4dc32504a807baca33b345e75fba356dba7857693baa93e6d369a13b18d13d0b18676e86482e1c311b7c2b94ee46c75a9a885bc529e5ffdb0f3ef0f705a60ae8c66ba6bbef205da40cc59e1d41140ce6700c76a6423e48a57129d4bba1b874a0c2239c8d14c0a6c09686ce818d06afafcd251f68d125f2df1c87a533ca53f3f5c0d541203f8ea6fcf348aa8119540bd20d1751edf1df0ce67528ee6b599337d28eff1e1f6031852b9d911b901d73a2b59adab8d1c826d039b3f2b1a7a5c5d48c0579b144a2e57c558309a0d25a55cce096bd6f377656a514e8c5c2b0793224e91b3180bbe26893f5b0d6f182810711b2da65501bd29c7cba3c8d2fcd3da1f6927fc031e9992c408cc9e0978f0c4bee966c240185c00a454c43bac74279ed4825b6dd09f96c66670e1dd94a67e6f076e334daaa76f3ff8c4fae9b46198ba4c459294fb63eaa356e36faf144057685bc905ee7798f812a6fdf479d02792e3d1258fcda807290caa38929a74688934a1d2c0684c5037145d8abdb9772736140d9f102fcb62fe1e4f3ac185914ff794337cc417abdd967f2447d133b6d7c96852f531f67bbec58c339148a65e456f0d3b7d7d9cd6ed8398a0a00c541b5290aa4e3ef023099a24311071c890a275144d75db3b34d31517d5ae05ff876ef58ae3c8bea6aa7976336464a952b40109af891348bafdf167b049d49c4741954595b5f9c711ab4e46ff0b45e7235bb80b7649462c2995966ea72b725a385ace1cf287277ec104cc389c92d15a40dfa5ca99fc3a7346bd0145355f7add45ceb710c614f1b861c57728aaed8525a20a73b8d6a46b42328bde34a5cf7161dc4602b69ec5d92f9e172e691bf4c46641a72e9d147e4b97431cd456ea80f38f53e7f9ca612c299a4635f0f6290d8b99745aaad3507789686d72585d6a8377231862334d3eedaf73bd52d46a4afd7cd5c6d3ea0f651ea35fa0cf83cf89d14c30ea4fb2a2af28709b73f8add163745bcb369fd00ad074d0dfb93aa2b5de6d31c6137a0a59123166864acb5e3986fb31f1846cbeed556a081efbcf8f8d38d1a44c0e525c8cc9b1fc3b450dbcb0eed8ce53f89be1643d6e05726e6db01ac6179fd6c43a56b7191804705ca52b822f873cbe386c5aae3b60a26da6da196a60f590ea1302e56186c4dcd2651881d0401528a2c8507b41828070b8e1164947093abab807ae7e97bc8c03a0aa584863b32694761dc0d9a4c402a30997f270b666ee80c94b40da6431f552b81f1c10006d9ee1d5be7dac983660a4a6457af1e0af158a81685a4ea3c07ba8310b5ad014d00f4908a7a98461d2502f07bf4fc8f7d220ba6f31b9a48b27f1d321912050a7dd5eae51e1b7a10cba9482df759f2ec4385694608e92e773ba07221115cac03e2996dc5dcb62f6196baf9c2bbc19392ce0bafa2ea7bfee70b8ec26296b5c8ea01ac3bac87e3840a1ca154ff6dd9884870dc0100a85215d6d4829340522fe1136ebe98d000f1a5fd3fa0d887fed0043ff7a365e4e0ec2f1a006c6f3e1806f9deb89835e9f28bbda958964ef2f193962a16d5d940ea92fe2b9a054c64eae9f6bf5c661e27318bbdb5045122c45d5cc510c500c9b893101289c9b5114d92651eca4e19c32a10e907512b50156d42b68f9fc0fdc95503c59df0780f3080acd931088e56e9b95f3f73815d440b2c1441b8b71e8e4babeb4e20cd72a3c5fda7a02bf8d2e9ab9d00b4242b115c92a752649513fb82fc3d2c803ddff3152d0f0addeb0580539a92d4e22276b0d43475f63ac472e50cf5fc9d3c23574cb916ca9dd36b3816b3833137d8016abe1bb08661786d38c655969a2ce5426044dead04d4ce6b85010d8ef08517499db718edb7ce91ba30faf0f2f621a0c5adf6bf6d19f77870947e02fdcd3adddd7588b1bff5c08e4b1280ad5d4efeaf0199e42fe6cc3034d8d25b50209ef45109e15dab3d4d46aa4a12b5f8e6ba0dcf3b502de73f33e3d3c86c6f407f2e803d0628fef394c5a79621f8f76e8de35e048028eebe7b083e160b1ccd6e73dd55d905037aa967d5685ce1958db178025845125d79d2f45d0f008e702cf9807289c191bdb6715d3e8e36804d62afa48db301e4a5027ea204c20b3960eea4900300c3300cc3300cc3300cc330bb138808941251da69cbb352ea0cb3ff7f39001491b22222c949a78d4fa78d4f67263e9d997ae101d70bb50b540bbb76a5862e5984740fab82ba9986e6e37ce13235e242a3a1ffeeb4d2947c36c54d409fa1c917fe62926ba9728f199a241eefa7a75439de7ce16594a15d4dd51cdab2a6c77e802643d7b3e1247b3b2c7cf60b30c8d0caa2c7a0775af4cc5d92a0c5d0bb4b9caf9819864e663c5e7a6e4f664130f49ee5152bb78510365fe8ff93e765965ee8bc3d8cce3e292a067417baea94d9fca58398adc385365b476698182a2ff75be835789290e3cd16fe51b4d07fd4e928fbc7e543390b6de5048f3af8147a3cc642a3d391254bafca1e2357e8c356f659c8f1978b678536451d8f332b4fe7eeaad0b547cb2994c4a8d05b6cddad1c8798fa9f4213737b4cc922d252e84c2b63737c8fa0c1f7425550c6176584d1c76c1e1d056d28683f41db09da4dd06682f612b495a09d046d24681f41db08da45d02682f610b485a01d046d2068ff40db07da3dd0e681f60eb475a09d036d1c68df40db06da35d0a681f60cb465a01d036d182816af502c5ca158b4425180052bfa8fd1d27321c777543b461924c06215fd454aaed4b1fb1df45ee886092230020c4021b05045bba1b5647318bc7b542fb40670012d360660670224fb0416a9d019a810038b532816a6502c4aa15890429f80c5289cf89073e6b631801245cdf80216a1482060018aab2eb0f8c479000b4ff411f92af33fc365988004659860020fc0a213cd44c6d6cae1ba7e30b1e04427f2126773101f4b5e36d1e558d3c7a73d28f10a0b4d346ded93e7f9cf446ffa2f99e46230d19807bead1d532ed174746cec207754d29196e8f279943775d29ceb9325605189564314ed8f98541084f10527000b4ab4ba973ba552a4103e08de046174d1450a7c04fc000b5ca56331893e4e87df1e7c24d15f897c67c6fc13e21a89464e7afc2b9390683259f488ddcfc93aba2e60f1083c3d2365b484799524123487598c374fb9d002168ee8c3bf4abee4a8ab6f4417624f6875f738520a237a8de13bb6f85b797c2ca2971c85fc105d7fb2a388b6b53bcc39c8ced83f119da8b9ac45e6f8b105117db8ec6e8f1353ca7a88c6c39cbffcdd3144d3f19b98e78568567fa7c7a3b52797107d071a938354b578d80fa2ed56f935cf95c717441ba2dc5c321f882e63c6d071783180e853e60f0f9a29572de60f9d65a9f4907311216cfcd058859863f86d9998983e34315bfef5160d1f5a4b21850c8993f972660f7d183fce81768728ab193db4f15af3e25fd2ca92c9436f1e4bf8f832828647c143a795e6d93966128d2977687384fe8f2e3b967bb143dfc17f2ed509993d973a34a255c94f7d37362c7468e2ae9a58468be1b1cfa1d7ab580fc47a938c2e87b6ade348e52d2205cde3d0b4cc761c0f391c5a89e8629ae34bf1a36f683fdd3fc41ca7b44b37f4b9e1e34f1231dd10b7a18fe36d1ecee7f8d0b0a1f9942d9a490e394ab8862ee4104cb3bf3c73b66a3812938c7b1eac6968bedbe3636334f4321de3ae6e8c2965cfd0bec5a09f2c7cf323d50cfdce76f8f0d0a1bca765e862f349749c38cd3819da0e3d9430a12f445fc7d06ce8fc211e490e37440c7d1c8f650acf5c18baec28c6c3ff4ca97209863e7cd4c9346cf9852e6696a40e5264d629bde0ee788762216517dacba251e6efef91830b6db7a64ca56d1d69670bedac448f25ac23cf6aa1cda1e3c0225a4e47260b4d8ee7c50c162cb49d793e9049c9155a378fa23c9c88159a1ccbe7dcef883948b00a4d478c9e1f8e4885a62584c8915994c7219c425b31c584f45890f3a5d0588af93fa70e5192128576c23f46d0984daf02853e935afe38f8af7ef813dacaecbe9e21f72dec845eb5e366fe28865dad096de870dd931813daccd7718fce4c49dd12f420b455f37328a18f536576528e247415e43fdb73fe421c09bd761c72f8916c47e8cb3afc7c7c9b4a6746e85fe743273f8ad07a0e34763ef09c7727425f1dfbdba2a7b7db1ac2a51f3f390e4d2134394959b0ee144ac6203439f0a49fa27bcf4b05842674901ff4e76e1ef7075d4e91e22d7bf0f618f9a00d952cefe566529da807adc74172a4973bce1ea73c682e4492ee38e64a12e60eda54edd061bd92eec6e8a00f3ff4bf728ea3ce9fe4a00df3b0e13a52434faa30c00207fdf95a108b1bf4137228ed000b1bf4f93c42f64c69011635e82b3cd8f1ebce39087eae000b1adc3933e6206f620ab09881f3a1a5390e13942e180b19f4b22157c794606d211a835ebcb37afc59cb1a60018336e7cf95731a13b2c55774def9a45373eae9ddc2408118ae6836dd242ab27f1bad2064fa0792c18ad63b42f6c77157cc29f2426b15fd6fcab4a7c7df8ebf14f4862abaa0bdd9f2a772fcdf918ae6376a9cd81d8e8ae64bdd67b4443cbc72e31407f78bd149fda2eeb4810d537411dba5623a3c8c8d5214b934a64c5aca7e83146d2a09ff5132e2666f14edb7e97e3c8b09c810c5a11e690945abaf9e2ac7c96df9bc774146176801156c80a24c50818d4f3426317718225bb673b4e189cec26fea2859ac94471b9da8c3888e3bfee33638d1aa87d972f286364010460540104605c8dc8b0df762c3bd303ec6171b9b68e65c67b543ede41b5a3c6c68a28d1759316697d86123137dcad12fe614899c2a471a3630d1248b79e37708bf631ebe44177290b25561c3126d2a9554a61f669ccb57a28f2152bcce943fc4a794682bb253f2771c92868d49347d9dd4f23a8e573667860d49f41f8739d2714891e8673e48c8c48f0a5a42a2cf52d758513ba7d8091a361ed1c771a01e6c59f42cab3aa2cfb264ba2d61239ad99db228cb5962b80c1b8c68c437e27a8c1d5fce2ca22f37eb38b55e868c0e29a2f590634ef8dcb17bdad948441fb59f751cd63d7724756003119d8975e4b2aa396374f1c40ed1bea78adf8d9862270d195fa40e360cd1ce25afd6bc51314e4072b0518826c6920bb764395e33c9f8c26cb04188a667afc1c620fa40b542b2e50b195f706e08a2d37ecf98b545420cce98414601e0061b8168644e4326496fe92da5b001882e4795a34cc7418e317fc0b0f187e3284274143c0cfba1fff2cfa972de0da5550406b0b1d1873e9377e4dcfed1c1253e3c63613c4a31f651d8d8431fa1cc22f23c4488d238b0a187be35458fe7cdc233e571d8c843173959ce7bd581872eeb48fecef5971876bb431f6bb6bc317eb543b32a5b2e5e5193ee8c898d3a34923f4f78cca8c694c3111b74684b82948454e4462cc100430c0a0c60830cdfc0416ccca11f4b1d884e47fde7a148860d39b471c38697f03025bff6b0118746c235fa4737934c297068264353e56e8ee4a2586ed87843ef512c0f35462f4f5a1e0c1388e1051926c0256cb8a1e9a9544d91ae0e1b6d68f62b5e4e1de51cc6c9916bd8604323e7b12385d48e9dc81936d6d0b776188f951c952594890d35342e21c60e27dd3b9d4f431b347ec6dc1972c48dd1d047fd71d13c7c5348ee0ccd69383fcde172e6206486a6c377e4165ede284393f37d35a5949b31a36c830ccdc797d4ede06d8ca19309298f7914e425fa5e68bd9f31b80c1390200c2e880336c4d066c9de9ce0df91d74281296c84a10f43d860316fffc6e4f1860d30b41e74fc96db63d7ed950d1b5f68a2e6f7aaa58e171a99fe54e99d25c548e942e39929e538f5cb85ce72e2cae7508247118571898d2de0d3d571a19348c70140061b5ae827532d8bc44a1e5b70230b6dd69c253aefafbb7c1b5868db5bb4ff2b49f8b8dcb842a39db36abde586159a0eafe392f5286e4e6ca30a8d685b0a1e32e707ef0615fa604d3707df39b3996f4ca1ed20f7a25548b9c3906c48a1091111f2e5284f4751dc8842f381e6206f0ec1cbe3bc0185c6e2bac418e7ea51e8369ed05cfe6e497e12a5fcb3e184664e25979ab6fa668f8d26b4dd3926712598c7ebc1847e4255febc5d2da1b3dc7fd51eb3708b12da8d9103f7603a4ec349683fb64ceaae4868bb530c5515e2c6609e239431232b777aec6d56000370d83042a31d65277a87949b2c45e8e32847e9c713a193941d73144f1b42b39e79c32b17429fe3d8e820f407daa706a14d8fbe397990044217e72fe3c48cfca0130feee18c5808a6f141df61f47ccb1cf6a06f0ff257ea8f07bd85e74c612ea587d8d84193e15274d04a6754fc38cc6de4a0d7f550a13dae9041f40d1cf4f2ff21df42cac60dfa6ad70cd736774fa110366cd086cf2edf221b2c8fa5064d07e223e6d55164c378850d1ab41ee60c1f2ca7520deb08024f886626a74e593e3439cd209a9f8fa1a3e74a109da4ea70443e4ba25781e837fbe4486240b472d1fd520e13151e7f68a364e64891b2511d7e68f3e5306a6c4e1ffab2d6e8fd973fd29e0f6ab84eac30993d741db59458b2dc92a3e8a1f99c3984ceee165acf433f12afc43fc74357319a84b21032ffdea1d7f35d71bf0cc92479a145021f030558002decf0a7086144f282c6b7072deaa04a46e4a9480f1de8d41cc4b8acc9c390cf812ca117e283858b1c8c987289ba71305cf3e7e7943c5f0b8742cebb1ba299e4f50d84855b0c96a51e7383632215b72bc7671b709fb0a1c857e6a2ad014db596a8153653433299429c69783ffea0634db2828586dc7552fac87568f50c6674c9142268863cbe62ca51195a94a1d81c9f67b6eec9c960871d7ac7f11b821663f03cea147f69218672abe68e343fe69f6811063dd6cc0819f12ab400c396a3915a564f225f38881ea847b91d3185165e28477437768e444e68d185cb622275f8e17c092db8a09a94856ce11c3d94999c2be6994e125a6881f61859c62a746016f61217f5d852dc082db050f0deaf18c4b305115a5cc1982c22351a841656484235a6d44d425e225c43bbf6c75a1681d0a20a5d0ed537240499efc950a12ff198c9251933eabc012da6d0468e244954caa3462f855ed4bce3092151b0da5d5258446487a499e76027babbab840a141acbd9d4b184888f931201191e017e42ff1e04f7de749dec7138a1dfd48a297fbf4de8247e3bccb3d482094d7cf01e9c996c77cc92e107022b042d96d04f44a890d2cb39318712faff8afeb82147f4f8c83041195e4612fae8384e22fb931d11720186a3e084712ae00024b4d15775a37f4e0fb4c343d0e2084d78cbd8b1223bd0781aa1c916d92dc63ca9a08cda8116456836e7cb79a3a5cc98418446ff33f57c1ce7feec41062d86d0a9f6bc6c588a8ee51042bff9dae25f122d82d085593e8ff9bf7ccdc90fb400425bbea3a2b1311868f1833ed888ed78ba73143fd3c2076d8c1f232e4abf3102139c318e1765b418177032deb40a8e731e306386163de83a9e690f3aa4ccd3e9620c4e3248a9e038a7f0400b1e74317cfc41b5524716f41db4911ba13bd0685963a7835e3f8cc7f143f2f0c972d0a5504962c829a84e0b0207230ba2050eba1c9db2e3c07431c8f053012d6ed054877420ee795367ca63fc30c4cee03f8a31c6185d06195f4060c68c32c8f8020c2d6ad0c7a9cc75354483b6f7a5030f966a31832676888a297f6402410b1934d51e3de5e41e133bc7075ac4a0d91cf762b01ce247086b0183cea35c31ca49d2b278456796357b94424c88fe7045e3bdeb9eb2b15624251fc9cbbac223e5598d56a6b3a2490fd23a948ea44116ab682c696c1dc91e7e3e4b16aa6854f3757aac7bac3bff171b3ac82215fe67e7c57c90052afa0f524549d9e152982010b23845a7b137e4f071a4085998a20f73b57b01734e505994a24b31d9c955cf82147dac6c112cbce6bc3082208c030618ee8521358a765a4384ad6065918528da6819e3e7d2903de4a5a80e9045283ab738fe9147969a73dfb53a458c31cab00067185f8031c619414a80035d6c16a0e8af6389973b66440c922c3ed1c58ec31cb917242b6a0ac8c2135d889de358df25bf8766169d68fc3dc5239ec50bfd8204dec529c3bb380970a08b195970a2cd8f77d5346369ca9a008c83d0c86213cd6ef438c4b7f8a852e9851608c400e3b2d044e791aac8ee0721e6202a06042090452608d51e2123e9f22d551edf96d949523ed30e08402006044820860466cc00811860dc186590200b4cf4ba71937e283dcb41040990c5259ad6b1e496272e464af142eb28638c129041bc28c3478023285f808112e0401706c8c212639c32c830c1185d7421802c2ad1c6ecf3207794e8e2f3587453a96c4da219f13c97949f0c1d49b4297e8e0e35ad23f44874f261b00e793ab8ce42a24921c6c47eec11fdfa460db95287238eabcccb50d2d1882669ec38984d32be3a235af148d1a9938be843644e3cbda388ae83dc6731663e115d8c68e6974924ff4744a79bfa39ce07c9f410bd5c7e950f4214918c217acbd2a1b8c40e2c530ad164092944b7bea54609d195c44ac9ed39deec0da28dbd493d837acab21941b496bb2445bcc8dc712510fdc4d329f32846f0d101d14ad6bd982fb387acf01f9aaf30c142594cd983fdd0c40f37da24db3e7461a62ba3aae54363c9f2afbf6884c7ea1e9a90c3585ceb540fed4e84e02a1a1d79360fad640ff3f1a8aabc8987662e7208d731c4c75cdea1cd1452e3a2e5ca41d20efd4f9f69de0fab439339da726f071d5af19461524ece733973e827d552336b08227139f423e13834fbf1c857cee0d0eef5c7afc6ff67c81b7ab1ecb194b1b059a11bba1cc487afc44dfe13b6a10d935839760e1b9acff31ca29507d13f6be8446545e387d5d04fcc11392db588721aceaf4e296644d0d0b7799877f8c917ef0c7dcc3da61e83e62854678666adb379c66a65e834b6598c114286fe3d5b7210f38f879d8da16fcdd671a46f96e8c5d075055dc91f5361206a86e78e3160e833e44e53cba925972ff479de839cbf63fad3f2429b430fd22cc53a5b47179af6ca593cb34ae51c2e743147364c27e9a083b7d0640bae5bd1d4422f39d210f1255968de32cfc5d6200b2c3441734678b01e3e3657e882c42011e79ba442acd0465ab2d01da44f8ead175a650e092c3063c60db2a84213e6fae2314c947e850a4d5cc4eb28a93205067001080c000c1fc118624880026564318526e51cea29cc7518f948a197949009ab1a33ee47a1f999f4f289cc6715287441dc2466d5cd13ba9842d6095d8abbe961d0b1d46c6942337111aaef1fa75e0b131a0deb28e4b778098da77acef31f7f0a314ae82df7724f4d421fbc65f114292573b948e853dcda72fc087d301fe683185523b4ab9573243959843e34cdf1a97a566b8710a1cb51cbd2517363cee0101a8bb5907b4914426f1ea40e7d32333f82d06528914915734068abca2307a9723f683ef4ad18963e16397cd0e6789523ec7becdff7a00d9f8ed192a578d074acef29e1eea0cff88c4fbe7d66125a1d346dae3a5539ccc2c822074d8af3ce33abf4c8c14133b9d7fa913ae2ed0dfae431a416978e99efb0412ba631b6a3f02956fc6bd07cec39768c070ddaef9061cb2f3e832e44881c2f83c7ead465d0761c98b556c8316826ac058f96439e89d92c60d08ca5ae5c9af38a3e788f1fe669879faaae68772a4e0e93d44b246c459ff3643b684d7db3a2e9ddc81142e458451ff9c146b467fc2c1e55b495afb43cc24f4513437fcafc91ea8e0315ad8768f747ba39459f7c7673d04d3145ef1dc98338192f4513728c994be33b6ccfa468a662cac88c3b8abed473d8281dc50f1ea2e8cf355392e079729b1a8a36e67f9c3151c2f70b8a36739092e01a3bf6f844e79a2bbd34c97590f24427bb1151fbddc39fae134d8a14bf39289389184e742e972e255171724eba892e7b4e8dd28146139d4579cd269a9a59c5ce442721cc3fc27260a251918e83f4b29cfbff25daf0fd71e49a3477d6b7445f31ffc30f292fe4c857a2718fb3ca871743897eced73c28adf4d0d949f4417a641e9a5d2eb22989267a904d327eb8b61f89be323f6e8f3106893ece96d97114e61ec7d406f1403fa2ebe0513e8dec396c4ddb119da6e4cbe2714c21bfd2882e076de9d4bb1a51103423faeec84d9153e94afe5844f31a3e8893afa3883edc5f13d1464bf9348ec6fcc51f11fdb4c51cea21e4cccb215ad5205163653f79a518a2ed950e336f6abc58964274b12e3973c79e105de7114bd69a152c5506d19f967c302d2136538c20faf84b2d457b64a9631e8836b76ab9071603a20d793bab439217e9ec1f9afc4e1a311a24735b3fb4931d1b2eae82e5a0ed435fa1da6e3975b8e1a17ce873ce71f0132b8bb447f7d0584e3172e8937375563df49129669895c790ffcc43339e039d8cc871dc7ee2a1df24f2add3ff71167287463bc7e5be133bf4e7c1974a5cc910535c8736529ae70dfdb5b2081dfae8e1454b1e3ae5708373e8673b6b0ee35289c6510e7c2c16ffb3321787b62d55e538c64aecede0d085a87b91e330875ce61b9a0f4c3dec9c310f25e686be3df2555da3f524d6862e775cab47b779ac6143ab91ff5a2985df4dd61ada543a69e4d0e988a231cb1f63b5e643d169f08e714d2284147f5074b13c55c4289a33fe4f349d32c48ec7e2893e8e39987bec8c28c14ef431b63a4869860b4e34135f43ae23df44279e2ff4994eecbcb226ba1831e6c78fe33e0f93894e62deddf0788d2663a217c94162b997683efce72059e6f0bfb5447f9963e690d24a2f5989be3c3c2f6fd54a91524a9c235cd2ffad4ca2f7cc1eccc75512bd77788a493107216324ba30723197b18444e33eabee697944ef1e6f98605e61724a1cd1bbcc8aea488ba8461ad16fb67c15438611ad7c8c5ff1a23dfc45f4f103b5e823a322da3c1d4c8ca9e312d164a568e5b16988683da49ce2e7cbec26b143f4d7e5313ad6cc10bd47e465d8be9c27558568c2c79ee548c5657310a22bdd0e24fd22677a06d16abc8ee161760f4398b81044d37156fd37735cc22310bd8ce9479dc87d591d80e8fac552c5f4cf1f9ad0d1f26eaedc9bf1e387a633557f5364769ea70f6d4839921ca43cf6e83e1ffad5b10cfdd9e3c81d7b6872495fcaf1d143e725dded61c796439f8736858839c8990a21afc143dbf126cda3a7b943132e44e548430e56663b3431c741fe706ea94393538c56913bc7ab60a143ffe9518cb81dcfa15dd50926397e0ed921873e54066d11cf78b91387e6badbe24b98b6b0c0a18f9813da417d436b1173768aa3bb81102533760c1f6e439792d927847c990fc36c68fb336bf4c8c7392c770d4de5850ac1aa55432b9f3b52225906ed330d6dfcf839eb2741437f56392ea5e8b93a44ced06c4c96dde3383b08399aa17391f86172f0389a2f43d7dd6e1d7e4c227b214397277ff0a99214751e436f39f8581edbd7579e189a9d907711cf79bbb530f4df31c764ed12a53ac0d06977d4ac1cbc5c7ca10f3a0e959e1a7c6285b8f0429b3a7a9544d3f18f232ebad0f745c80ef2422e34a5297dbadfc37afc16dac99572f8778ec2b7e2420b4d0ccb323fee9172fee0220b9dc59c63c9593116da20d7b36715bbc212dc2422b6c4a48b55b96b79f8dd1459a1d3088b931d4ec7dda30acd6b7c0e7fe2a142db261973a6f8d296680a7da821a7641e75889e890b29b41d44c81c0716acfae5283431e7c07205d7183c8a5068f3c7ece9a0544206ff09ed7a08123adee9483c8a042e9cd0bacc54b77967fb894de872d64849b3a5eea05b03174c683f73868c768921f2161863022ee06209edec4888a9628e650771a184ae735bcc26abbc1e950d2e92d064a69e484745d0900be38b08cc9881062e90f07b869564efca36461924e0e2085c18a11377d3eb28fa2c66cc282e8a60443009125b56d32df898c926cba1e538174468527e881ce3e370318456d6fa4a3bf2c997a3846048b4c7b7ba77474811526668900dd3d8513008cd5896d198290c84254f8790422cfb8326c418a5d7c1c86492f8a039cf1851d9f093638f8b1ef463e65125794955708bc0050f9a78fa9df42f5b56292b0b5ceca0b510fd63032e74d06952f9ec9a23447f3f074986d81a27a3848362b632635e23a8acb7c418c5722e339fdc3f1737e82ac59d2fc9221b8378c240c104980b1bf45bda7a9583b8ec129713b8a841bfdee3711c9368840ef7820b1a7461279a570c7e6a96d345190fb89841a7313eaa14547c5b7a2e64d07958d1617967871d87b888417329535c4bd2d18517b88041e3611de3fccce38bf12bba50fdd0436732bbc9ae68c72d5386f8d48ab55c4244258247f83cbd1f937285ac683df677301d3b3de5dc8c19336690010207e3205f90c04dd08513b658451729ce9fc7b971f24b55b41324069db82a1e4a886d918ad637bb589689faae1ea86855323e0eeb2986278f53b41ec68e8ff90abd92638a26c412f96d8dce1df2a5e82a2c24a66c1e11534f8a3677c8fe0c9ef3e78a1945fb5229b24fd688a24f4d16225fa8f09933a1683b3f23cc5ac741e41450f41e247aec749c67ae7fa20df11292c3989e68226ae5b6076e1653ae139dc7241f8f858c137d9c14772eb2ade5a336d1fc07a3bf95d5b1624d74154372fce41e4c4712175b64a2f970619571c1e3a4cf5b60a2b594535293d05ea28bdc1e7ba85d96f1c508be804011b6b044931fc7af973acc1861b821c3aa025b54a277d71c558ea550a25d8b1ede33ab63f0a8056c31893effc6ea47c88f808c2f0e165b48a2cb943c94675ccdc145cd4941cf98b14524ba4826bd993437f59684852d20d1f44771f6b367b56e8e2fcae82d1e516564c99512633213a92e939365ab88394cd90f6ce1883696e7efe4479ba5ef8516292cb66844d7ff95fe51698e929e046cc1885e73e5609d5e79e3c759446bee1def9b47119d68862ad99ed9709e44f41a39c8f164b6e4bc31886822e26b8ece3944e7ff563142c50dd17cde10c345f74234111d84cc1b6ae15198107df410b16ecd6761f1201a5f8b20bd513d52cf0aa20dcf9123e71c88de8394b12c47471e4a40b4e153f01069f5c8b2fd431bc137a65645b585a41ffaefc8ca8b11d287d6a3071f9a6899a3f8e71ffc7eeca197b594838d7061e2e1167a38232c5a82cbac4584ec1ab352f37394f7bb451eba52935c71a73dccb9c143d71f9e4a2a7b873ef72b876e9e07ddd40e877df36024e46c8b3a3493f7fc37594607363e7eb79843a7dedd617cfd0e9dd52de440ac8e70e565b26532413cb4a065f94253e535b688439fe251a69d434747d11670685742ccf994ff0d6dec9d4e5e39e786c6a3858bd937d5852ddad074c624536b990f1eb9051bdacd3826bab93ff5838cb0c51aba548d50a92ffff9e78c600b35f4392ea6fc8da96d918646432fe696cc57d0a0a1edec61a54ee919dacb3a162a74984b4e33f4c15cf4d59094a1f5143d3d98c9d0c67ff195eed2b8dd18da12cfe8ed6187181a09df610ea984a131f349ef1cc6670e0443ef2aa9439969d209cf17baae0e9ea5d2f142d79271ca3ae8380e7e179a385a923de6423b2e7a955956762b5be8aca3f77fdeb4d0c5109e7b739985366f4cfdc974c4a4c4422391c9523fe4afd046ca731a916243eade0a8d07151d87aa7d15fae01f967d7e36f443852e6af40ccfbd9025660a5db6bacc6624ebd4a5d0c4fca15fcc1185e623f6e3e81ff8e40a05552c254fe872f690425be3f3049dd04e48c53f89f6e86113fa1caa634217436e768be17bbf324b68bec2c3aec7a184d6df75e3bca624a1f78ceb91249c24910b127a491e85d35096237496e6ab7f39844ead18a14d613263468addcc4a11bab4cc3166549c601d44e83c72d18991433e9787d0e4d1e411bf91e56421b421d1d783de8e2da94168a39f4c274dd7a44920b46e69d1f5ff4193b96246d6d7e82bfaa08f674d5ddfa273df83d6e3c30ba93992871d0ffa203ab28759f31db41956b93deed001d98347e6ab9d1c349121235b3538e8243d484f19bf4153b9355cfc7c7f8d6dd055de309d0bae31d51a349165e4429f3468fc93ea89ec6a5e67d085e7ffb8cce5838fc8a08f0e36c69847ff25e2181862f428f5b9050c3af9582be4149e4288bfa26bf9690bef9d63905dd16908562986755bb1ee25e9a05d2d2bdaed8eddda320459cf2aba9cd4c3582146e5aaa8a233ef0d1762aca96883ba48f2fc593a0c2a2a7aede061081f876ce1e929da0e3ecc7dbd4953b49393f1f2648b8fdb2c455ffd319676c790725092a28f190fe37488acba194593ca5a62a6228a3e304f5db1ccbbc33c145d4e7e1e7c9ca942b4a068cddfa307dd9692a39fe8a2a323c98957412de2893e4c12c233c7924e349ddb51251f9c771ce5478fef17249be84c53900f5dd1447f6126cc64ce44df1ec648f4ab9c4c31d1c797e3f15bf2124da58cde418e11398c58a22b8b29eae7f78f8855a2cdd4965fcc23c9c194e83cc55bc7f6a958164ec2cce894fade91c41da5b3753a26126d0a6b5176344874de2ee2e24164dee8239af81e269739e7284b4758512ab9ff7cd788e6326818d17ef2689f0c5ff1f24574b13c96b5bc39165545f459c7c7b4744b447f19bf22f64888685db7e7ba43c8ec9c1da28fc3c91d628a9bf93c0cd19c84503e63b911390ad1476221459cd0a85d9cb04dd40c09d4d044bb121fd4a233fce45623134dcc5491c1428889fe62e64dc22b87fc9d4b505111d63d24d2e53492789ca7af9a9a2b4bb496752b475ccce341a322ad44b39d247e0e3b23460c5551a28dd39f4366d49844f31e1629f2516388312fb45270bc18a38624da701e85ff7924a767196474c13522d1a78e544127119c4382ab306a40a22f150dda5a9e23da015c400b3f1538e60b302c3063c6fb19c38b1a8f68e473cab58e880423f862c60c31be9831230c31c8084117c403351cd14ccced8fc9fd734c914634391583fff6c5b3ec1e324e6b30a26b8f42920afb9695c75c44ef92f139be188386f55e689522721177ed88ee08a6153b07965fad2562944186094ca2a04622fa58637f8e8ea310c6224434932d4bf3c76124c0812e3a50e310fde720227d3da61c3ef203350cd1679887612768f430627c6156a31035a38b1a84283288ce427514fb22c1a22441b4212edde3df51cd4c0944dfb2b9b22da91e203ad9cf1cab8669f587262a84d8044e1813f0431fc6ec71181de7d63ef4c944f2f54721e5fc9e5386392448c109030335f8d06b85a62496e13d5c650f5de7e461476d215cd4d043172722776e88a229df3cf439b1ca83abb8f8a8bd400d3cf49ae3368f5a35e5e36bdca1af0cf97d3a9e7668f3a655b67c130c375f8ce10da851872e848ab2da15ae4187a6e273a4882ec95f2c736852aa30e91e1916f372e8f2bc8558fe6b7c1cc7a19d8bb7b48810aaaf630c31bab8e2426b8cb312a801874e3497a708dada1bfaf1ca1bb365e8863e3d4ad69be12ae88f5f1c647cb16de843d5e9fcfdea38581c12a8e00227a8c186b6d5dfb727768c71ae54b02a18a30c32be00c11963b1a8b1862e728cdc815bfa78ca7b0d3574113acc62c307a7a1394bc991db927277fb020d7d1ceb257dc9e9ce397f71863664cf8ed62329f53a33b46b123ce7585a3ee71cb30c7d8e7c18faea29c4ebc8d04cfec8857ea6f4d70b4550630c7dd47164de117693ae19821a62e8e727cf4352f2107d30c410a310306a84a149091f997e1a9bf3370118670c12e8d6004393323df2735170c2c87a408d2f743929f84ac830f1438f17653805d08b329c04a882320c6b7821e9f8d4e8f430bd28c32930638617653809ac46179a92eeb0fc389ea9dce142d37158de32294948c71c831a5b683d6ed54b79f92f1d5f95811a5a204785747a8749ec0e1d3b88bdfb9d118c2146162318438c43c728830435b2d0cfc9acb85b120f9d030b9de59cd692345f08e9d5b842fbe167cc4791eda08615dad02107ab942c556822277ad095e32ed3920ff2955353682fe530c6ea9895821d25662e2b12663f78183db6f0fed588423fe7796e394228f4df7ffa71e0639d73fc099d58d27cfdf93aa14939ec5e74ca3f51bc1a4de8e7a427abafc845e960427b1d37d7e3093d95923596d059ec652bad2c73b9d750427be63e394a981ecba91a4968a2e61c7f90e3188db94442eba1c7b52d68dccc498d23b4a512c334e7e04f623542932de4c0377a90e203ad4611fac0cce320870813d7825da84184a6b53f0e1e650d9183b2c610da301eae64ea901a42e0cb4b364d3626e462d4a4ad7724be5e23087dacbe21a2e7a15103087d4758a69c72c4dc8bd4f841177be5a76a1e749c1417d4f0416f31e7f0711c873ad12b1aa8d18326524a29fb8a575427f8e279d0b59888598839f40b911d3479193d8e3b879831fea8801a3ae8acb5babca3779cb7fe88c01c2f4c1da0460efa97ce103a87189329eec20a013570d0c5987bdba7e3f042ebc518411727f8e235896100498d1bf49e33e4e88670123d27b6c58c196470a0860d5897c932cdacb67c2d6ed651f270dc628c8302312050a3064f5eb42aabd04a0d1a7469d5fbdaf1bee50e6bcca07dcb59ae12353564d067c6a6103289bc6e480d6ac4a0f5958af929c67828af9231860936c83865a8e00141a80183fe554cfd7472102e04f9159869e49462ae1474572021598ac9b424b398f378637fb8fae1d26945cdb00fd06005e617e3356ff6e862154df010931b2e55342d9d931fe4f1ca3e53d17a386b49b2ffa86867b5e28e75d0ca9a9ea20d1db327da79fafa32451fa5b89cca41a4aa2096a28d91eeacf33f0d52f41ef5f587f230ee5f6414edce699c102cacb542a2e873a4e38e7a726028fa30a49c7312cd609283a20dd61ac2c7fa31c7fe137d309b67f27253537e3dd165f99c28c13c59a0d1897e623ca71034ed82137d98a398a2c904ed1c4e3671989f7eb91a249a20a453acace32542965cd1f17bd2426fcae1c633d1e6f8653be69166cc5081930013ad46650fd233e6f5642ed1c5f550b3bf45cf0e9a25fa0dd1bb9a2d6235b7342ad1efc967cb7192b52dbe30d0a04413f9b543aa87b7dc6904480c3426d17998e3419eff3424d14694c76747ba2922a511095b4248e99911d11919e1fcaf54727621d164979cfb51d64b924fe31148c311cde97e141eaf97bb4e341ad1c7f987acec940623faf7bc39548b571d4cc80b2dd23416d15fdc19d5f79d046474f1619cbd2d6828a29ff0881e62be89e8f26e45680ef3a494e28868a2a4d0ea703356b0ce00b2a8c0000ed18a6699a4e13d06cbe186e8d5d5df633d4e44d86814a20f7bd64388463e54f0ce6a10c746ac96f530590db30a8f3e9f7353105dab455089cb1e926e8168336e795b860b99e9bc8006205a4fd93d74d4f148a56e0334fed05c4aedbdb8d471c6a04006fc709ce30939a6e6c873822fca300ee8432f9e5f5d3774f8d087b5aacab1bc44f5e0c3f6d0a6b02c9e83d0d1431f66ff353c59fc60df3cb4279692d139c5cf2978b023424a6db1d2ac70edb2a811aae330436ff40e7d75ec1dbb849a7b920634ecd076c8d376491119abb716d0a843fbc1e9e479ac1e5a6cca021a7468b6e378bc7942630ebdec57a5ae86201e87d390435339b74e87e415621987befd224c0e2347030ecde8cc871c8efe78ec69bca1ebcfeb38639a9ebd83861b7aff9c13abf420c5cccaf82205dd86debca31ccb8f65bea794061bfac941c4f030923f25b9862ee79f3889b21e58af862672acdebc93a7a19dca3ea142a40e3ccf6820c442cce2552ba52245348751a3433fcc9fa18f4f63e67ca41ffe3ad20c4d5a79676e4497790f2fb454e0609c2708a051862e75bea499c3fd9d49bd503e2718c3041b840134c8d0cc4731a7526bc8ebe163e8d5a4474c3f500c8d793cdd153b6278ca85a19f958ca81e8480a14b219faf855416ca6234bed0b55694cc1a294b8aaf1a8186171aab94ff41a33bb38721814617b610c272b8d0a6981ca7ce9763e728660b4aa5b49696ba8be7d496e85042c866a98523648f1fa4948359e8e3883fe529b246961c0bedec5e0ed9b7fa3ce8aea069d04d71d541acd087be9377c2a7860aa92ab41dad8314298f87217b2af419f2e57b5290f880c6143ae9ca294fcb850fd52c1a5220bc749046147a55f954c13333776cd18042ef139729abe70b136b25c0812e4a40e309cde84f188f7288d93fae40c3094d88978c31b62be374b20a349ad078d81caa4a2b6088210605864083094de9f768b05066c1b41933c848028d25b4bbad1fc45eff281da884e3534ea4324224729849a3e473fb49e8bb227c7aee0e21a10bf359653acc8fbedb113a9f95ffb3d41aa18f994943a308fdcf44f74df2d7595f22b43e7eb953e9440af9131a43e86310f176b11ca42184d63b3ecdb09b6373402308bdf8678a399d41559260d0004219e54247d5ae9b0e68fca08fa37b7b902da3684a9e40c3078dc4ed30787c12df3212e0401763d0e8415b39de439c077371f1328e0596060ffa31d11c8ebbb883e63d65fc7520131a3a68639ea89f43a3b9a5470efa9839211f390e3293904ddad224c485c5a9ae786051835845e3068d8e88648787d0b041737e151f3f7f6c1768d4a0cf2db9d271c4e2a9478306fd6ed23897b3874d39a331837ec6a247d8d8ce3c7d18dec509c304639040047e4880c6050d192c1f59450f271a1a313847e6e16701346080879db35264c82b1afd0fbce2e58aed7e990017aee8237fdef2ce5ffff1080317ad68a72f75c8d639aabac0052bda1c4faa77f0e72a72e9904b17d772d592aa88adde41b7aae8a3f2f8e7c3f1308e5952d1947b76d49927756872810adea4ba5266a2c746d66c8f7390a1e2074143f414edc59dff08ebf8ddf31be0c2145df418eb96a38e530d29459363f88b152e9262b7886032d96522d77f23ea6ae5b3f8289a8f538a9fca038cb9a834ee6422a3e15030168705e360140347b707e31308002844240b4502815018869228fc140003642c1c2e383014201c181416188b04c240100c06040301e1200c068442817040182c8dc3b41e0d78bd0b74d210351b537ed4ef738f22d158fe569b435324415db28bca1caf088f9b9e24c61accc9474d01047755d27ff9fecc3daa277354eb7d174e7f6078319f6ceffeb4da352abf7c0abb3104701b7414f3dd049f55230c55c28a22f445bb7f4689ca9cf65adc0f96399a72920f5d42f754044f5f2c3e0590ab9baa5d166e9469d335049a08e35ddb5f042b88660efe72aadb87907e72958749a5f42f22be4b019135f7894b9dba40c0c00134650488a2858d13a04527b3925caac3e3877d0a3c3e85c61c8fecbdce8fd605fae56a70247242e6c441503a98a33e295d45afc6cc0b918c06a633980ee00d7c9f6ad1af100f82d47687d83b5407e3daa6b6ad85c321a7de10e0487aa9b2acca73092f2765b7ba4d13c40d3e36b874dd07a1c771e3c0a4c880734c06bcebce4d8f2a6358fe0537d57c1b0bca051b68a1a10d467f1684e7524e169fbd8210cd81ca5e83049dc41b5b5214dd2dfef16b223a8fade5c54ccafc48847526a7886fafac7f08ad9cbf4f0c4794e934bda01dbe39abe8a455fee381993be0b62cc0900b02758e7e75bc25e56609d45d848e4a24f963b814d96a93d5ff4ad1eec24d455a5f160a71922b5a4017210e809868c4da3473d780f37ebc847cb569fa659ce862bd88df41f29f8acced19c5607ed08cc5a7da259b36176a24afcf8461221c906d25bf62a7f7cc38476b56456db2009aafc5c353a17fbf7119aab3aae73ffd6cec4c7790e1da154aa840dc42bdfaad4224253ac422fb6b0adeae11403bea7cb69905444ce5f6865902f8f4d17d689d5e6d425417bc8f065109d933791b2db186fcc435cd452898abd1cfab06fc5b952e7377b735da569750787c20a06a956563c0f8d9be36ab97841866f278011cdb18b440f280f0e4a7352b32a369e5949d468676e1874a41362d6329f2417c21278b7de68231ebd93606b3decbd1f1f415ae48bd6e67dd177f6b4aaef37d4d111d44bac9bff8a07ace510d82401c218951e5db7de5d58316202809a3bb594ddd9d9081b79ec6848b7638cdf3a96e2989e39d58eb997129eebbd3f4956a90e099504f1ebc8208c7ea2c1139ec5a6fa90490e6d995686b60f25f7b4d1c3d4ae3f9a3998dd98ec36187eb7dd91ed3560039f91241e5aa7f4bba784cda6971a608c54cb79e92c560fde10b1621aac423057c38d49b5557da235e4569d3a88c56802012b2ed923295f800dc9692f114f6ca68aba51316a4fb022283fe3ef3ff628bdc7db9b45754039c971728dedc7c912a2fe9846f61a030e7b157f08884f53fbc2614695006d69295d58732d6e184cb76588016eb5f6320b32645356419a1052730395db6481f5a9f33456a6104ffaf029821bf0ae61591dea04d161d1b46c3f33424816e5de12a0cc8bd498bc84c835b749f1dabe2626007e6285825c3130c9a4a53176fba6691cd95b5d56c9262e7c162af37b40304c00106a0710617f25db78c2ba080d8ca1d23dd7ac1aecf735e76e6b925b7c806f9be8b5aa5d94871331964741c82d730f750722a9a29b264b4d9fa8ff1945aa9874087d6086ae5d7127a8b59824be5a771c5255fb4840d4bafa0883bd854f58f2b1dfc9ee282aab8a0328b1852e5a72027a1231df1b5f84c6bffa2867497cced4fd14967a68da3075bc792acd624a1e2912a5c1bedbd3e1971c37adac889737c4183f9854d09b9c6a2c93ef9dfa7c3428953a25c4e96b35dc1c1ec7f750bd5db36d66dc259e4093848dc6a864fb6d58df6edcc19ff6374981a8b0fbe924fcea1483c9049c335045522c4d8930727a7fae95eae0e09e5057ef99f3614949ac28d1ec8250178f8adcaf38990439c7d95456b70bc44dde93817fc37081c851a5029140daa0929f208b489e944d72d806c3ec09df8b43a7ec5f49a4ce6cc86f746ab8c017fe6d750a59702a0cfda04275b8d98a18ae56c27ed7bcdbd8604d966775e048fae4c95b27c4be12a7cb79292f6549c1bda79c699e97a5eca33848b3fe74d5072c2d20fe0c4418b8fde536d39ba528fec4ac48c6cba61c9c9d2d11e47147ac6b16f968b8f7233033d5ee535dbac927a71fbf13619a7e61f8d3d59e703699e3568e64f67696cd2da06392e7539cb439b0e672bf4ce9c0f85e5de6fb091abe36cd33cf2e6c201d8ba39ac34c3cb618e4abc56b9d76200f67f2c8fa39c3133a77d47e5e8d0e60f0949f68b54aab5dbb52a909c0658001e69275bdbd2a95bcb689d3e639bc0320c9d41cc855d45f8014fd28e64a7a4c2190ef928be7ccceb3344a090fbc30039fc648078d9a582385c9aa21d3be03ecf7fc70530215c7c91b615e0bc384a1486ecf51c136debfd61679a2142e77bc21ec8bac5279a9de178812532bff8ee0118a530a853f907a64ac383e4b822926c982505a6559a31fb4364e8d501b5c713b9a4879b455677231018a4217475f15934f251555298badf3814d6e6e1866f72abadc50db23c717497193a31c80102bd3be4195433557eaf476a87f12ab4daba30411940da53bc1833f53d5f43bcdd77dd0bbef57d4fafdb72d63d65120c2c0fcb1b2cafde8318b0d7171584cb96c9bd5547cac87f705c47c8c672b03cf03a47c9a524b5325c192074a49c99f9fe8746812d6e87452e55faec08213693326edfd70673d55659d2257c1cde397ec49847dde1c74825020054008fdd535cc679fc64cd08b86c868d71320356d09d01bf5a671bd589334782671f2701f7b46c7418a714e5ebe7981d508fb66c1d49c7fa6f6a374a9c1b6854111bffc64b5177357a6eb6d5aa1794c5534345d8fd99eb9124cf362db1cc48ebd86647933289f31cd57f3e26437d32e0dfb3704940a21bd1bd5d181d44fbb676a10281983c2fd345fcd36ad56066152992c42d084fca752927d7f0888f140535382b161d0e1702ed6337457d6c9057611ca022e9a112edfdddee9c48a897739f1bc83af19007a69104595cbb9e1950f6bc5cc31cc057e23ae6b0753d5ef6ec19f3d581bc3c412e68289e338c3b28c88ec65a1eeae85655517dcb5239b2a29d44c4a3add644cac87626e9ad46270f6191bccf48549108b70aa62b92644854a52cc1e707660ecffb1eb635dbe46a9d20d9538257b7a7d38719dbfef551fb70769b1a97fd094d3bccc7a54f051ae0d9ad1853a0f42f68544a66a8219f3bc6343ba42784013da430776bda2b151c697fcd13536350226d874aaff1889e813a973604f455ea890fc3c12abfcda72812d582e3255f27f8d8a3cbd1f1d358c3703bf1921cb21eb5254a19f2f683dbdce0d7a789e163513d94fce3c7fea3588f1bdde306a3dd94c6fd6208766fcc64e44aa21da9d06f4327d8c0bd14191484357a8b46476a2ef8364f0ceb650afd48239f86f2b1f3a5878452ae0446023c117a57c1393828ce39c103ff008b74b34791bf557662d4d5a22947897ce7a0521e354c3479c805ae334b006ee49e75995f70a10812c0048e71c02c3498575948bec41be5a01deeaa7865a749f141151bdde24b63c56b83e5650eacf8124059e99c6b3707e74401c1e425bf02330070bf19b10b6b25079cebd1a640ff0b705b84a154f23e2c5344672136e856e9a13cd6025f21691bd9e679baa987d0db1836f3ac32b3c72347d73b70830c1d598f8f283b0cf38b78ccb62b539d06b1332b7919eaff07b1b38fe682c6a8e7dfad4c270c298443eddf1f3ba1ff8c7c904f5355b24452c186523dd2e6fa88cb522842a12da56eecc459a9a88a4cd959eb75b7ca729c0c59afe0957e41b1a18aaea9d1a401b1bfc4c05e4b03a109c0db2a65369cec2d66e6b47a99f6e615b38065171e8308f13b1c626f130c8254b4d233b167cf94af23fe169c718c4bc8cadd7691af2fca4367d93330b40021a7bd63a4aed16d4da8c0dd55ab9d6ca7f07a11e433245544e649e9c6c81bebe6c6e92537bc206b1e62538dfab68d217224e95fda90f48fcd663d54b2e43bb72d97566f0f13a666d4ccb094ec586cc616cd62bb5680e857accdb425ce46c0a5c0efdc583698be7227e6de8cd3b643b70396e867a1437775eba0c93e23388873b8a6632bf0eefb6fabcd8d34c241d92c75c49921237ed3d7b206085383584182296695d7aa9023480c74160a92114cb5200734b1024ee56f51023358ec806d33be203fe666f6cb36318d00e5050377471dc432bbe1f6215d93878425ad522b6e58a5560846bf33603abf227378cbaa4454826811f3ff2cb823e5dcf5c1d6b82fe2f29643f6b6e929aaf2a92371b92958e999956b0bbb4a9aa7a1d2f2948d2b52f17f4bbfa598bc0489900fdd81ec25412ef6eedf6f9d6d49ebd614c8140375bc770e8161b31cc1ae0cb19421a1f4f6956bd9b66af2ecd322e64cdbd44e9beab804b772e6941232db695b5bd28e48350a327cc02293c412716189a6a103f20787197d17fad4e6e7764711db16de544e71324f92fc2b9971f6e044f3e9ee8259c8e09b3143c723b8ce06e753af8b18473ad65bf02d263564e1be4ce81293027b8456e7990dc75de2ac279250504facd3b63823850462f0609e0dd164cc098ed36fc8b5892dc61160051acb98fde56440303d9036f28fde99f37757286672cf0a32e6b62867178ce2fbde8f3ed1ad57c6eda0d35746a39d2aed6476ecd8912775ee92331636ec2eb93166c32c4c57819cce35cc041d36f3f094682641d9054063b1e3d50cd52092d74a8bc95bdf91453aa54cdccff625281e15e8624edc8bcdf46f6ca4b38ff90876f46d137b09f5c9431fee71c28eaf595adcfca7e3847cb077f7a89cf7a37d28095a11f6b03d105756b7d26c54ae6ffa7b8175405893b4b4da60cb5c3349fcd58d9e8ac8984cd33ddbc488976d232da6b8ee443758e0118a4f6dffa7af9465e42a3aa15f14b35b5d23534e7986fb6073e16fa693661d696cfaafc2281b833e3e5c929cd95c7e22a66b173e10fdd045494f1a3a92dd2ca29f601c8a1f53dbd1bc86d058c17d35d23a24615612128f137ff7572cd2b33c87bc244034264036372ce419f3f50588a363fcc104ab353be2676cb7604e6cb2f93018490b9e1309a1ce0b408aa46ad48b0abe5f68b5cc8d8c66e738d4ae684dabcc5fec4d76a3c2c9cfda840c060b7b1134ef3d13ed78781fad634a627777c9084c5f49422d40a79321a178f6607b21700bcd560ab654ab30d3029f8dd349b2913cb3c6df5801d14faf32e09238a3dc1ded03ef8d2e7fc5212fd1e7f4119d996f9b7ce64d14464275a46ea36ba8dfd89efa54c33c67fa335ed2928aba007e28c223f8ccdfa003c22e963b64838ac894388c3fb04aa000d17d1f4214c7c7605ec72f7323e5e676343d673d6077a7d2556e9e1047e670b4111ab27e30e6cd6b5f593dc1d50b205ef5d8eb515264166cc41b778cf07efda114fc0ecf61e26a40a981a906f9b37510c75803f109f0245ca9a68a1e0768770e2e7bdb9506b6ecad958db5e6d4cea5e2f58dc05cd352b0652beb48f9b9edcc97634d2aa7bdde6cb94971c7769b5224351760734fdb72c3d61562774a5891815f00d5e129d7844b2fca9a0633e476f670a4ecc728344e26500359f07fead39ece8b41d9c15f58e2c101baf8fa21ae5c253dcd98e885b194243a79b33d7f108024aadec27f8c49fa379de36b05186b81fbb929f7c1b86cf4a918e276cf352b443dfde664e891a27eff4a687087fcea3b23654dda029991dc2650f860e02cc0561118b08faebdd24d5755ce96edc3ed98645eb7d9a07ebcef683c022287ed94aa97f2b19624119cbf3d0dea52d1392c193a80f350eeda8cb3a8e52c2f3b0ae22f0a2733f3f586877e0787b6a292363704726886cc8609b4cc7e02bf73c32eeb56debf1552579d75f8392f45159b67d39e9083b11d98ae31574a91b5c5a086e6b154d1e1fba479550609a8a91ec0a89966527baecb406d9a2de6a9c2ee90a769834c58c424a9db7eef88584376f97cbc490d77b27b9166df0d410ac43b3d7cca304ac3a443b915ca2b474833254304cb5a4564f5d50742b23063eace4463bb3acc16b8cda01122dfaf36e20a64bef2b9a6f7e2e17bee945e361a80d440d7399d769c0bac231c6086760e5ce66bbf7602cc74b237fe4eab12d642084f179302708fa9b20a0a8345c1f7795cbb5e3a7d638c7e1aa4aa03064665e32bddaaca5684065692be6c379f3392836c4ae63dca74cbe38f39e7230ce9b2ab3b31e5017a0cfe9be5045ed16d9ac9225e23b5fadb01ec5260783444c2722e0b253a845e61b26fe2390cad437a381cf4452c9844e2af0eadd7312b1ee6cde1db0d8249a727d53a7dd4831833145672d9a998a1eaf3093252d1f2b8bc28fd27a15cd8ab167a30b81b869e9c266846bfa04136d72fcb03d8e93004092fef78223d088777684d5816b7f4649fac8813728340fcf8e009c65182905cdbd28de4551dae7d1ab403d82cfb21596cf18b467ff7f428f43e24bfc3e4ff0da15b1c923923e3b947d86c35f0a2e75f80d0b4d59466bd3bbb0e69cbf11cf0c7468bb26b092a068cef99378a9b62542b8ba9dca24c2416822a2d86ff3f8203055b64c6dd24ced5cc515c7e4c73e8b0da26176ef1bdf0cd2529d5b15fa012869fa5d39338ad3988a33005f8382e1e990e06d9007993f8f45174a60535311f195704060b5d934e4157734bac7c858d575625f1bb2619449dacd095961e035c141cb28fbd26391ba5bfe2728c41ff07768023160cf5306164aed18a6a10b293783ed31772177935e1e03e8597ab219feb0a5d59838f255cda5acfa538015ada9d4cad23d059504297c0ebf3695c87b4620e4318b486cf50094524dd23e24422e1f0bf2b7f10d62163b78d69d978ce35e5ad022c71a57d03746e3f20ab8257ee1348b4087b7c93e347361030f967f8fd51a6974c34624a470037e2c8be8ea5625b122354856e507cff009d304bffa55282cc1cc6e74a8bacf27bc52a50843a0f74263fbe9976a3cac068a68a4b5bbdabf3cc7ef84e677e4bf7ef616ccd3e21b48987c90a853cc5e0b1d34a6f9221c602dd7ded3d99956a4a3395fe0b1dbfc86395a6a9d5767200a9545bf1b35b8bb2d94136e7db4c6912e04bd9d4d81b4148a03dcc4de20b5594845b25e0cbb4c4d4db6728c2911b2ef94c729f87c0833a5cb8e482048a78243955cdd1cd466ef077925288c5783c00a800331338c3498176f5e5ab93062174b7ac5bbb4054eaa934d9152b734158395a260514caf8860c29ea75eef9487fb00b724e0e6387b9b370e710591a854eb25b2bf1bd726b545260c253416365ce2e58a8ea7032ed1113adfd88d2f9dda8a71a2d091a2a4bc11d65ca748ec4119ca59e38ddda1524488a43db78d64efa718b16132fc2da28d3da7ffd62566ef2b4f0b92cde304c2e40fd01671c3c497f2eeb04ce3ab0558da3686728131c9a0499994023376414635d53a014a7798bc6b5434c523d269929f6c08dd80c1de115d57242429945cfb7689c8b7a70167e0c454c11c368c6dc2dc0663ee4349d13052f30454ca0350a9d19951a93163665a1ee242283872cd119d5fccdc5a0259db16fd598534138185c9f821c83855c07485d7ab33a9cae10abc2f0c5ecf3c46f6f90ee2149f4c8a16a0b60e6e336354b3f54ae6dea1e8d33078b0f9a543ae4426e06c465ab828dc620ef590a604e32b5deb39cafa5cc7dd9754bd6292597a455fbc0bc3e02af487cb0e984012c2b58e0a07e348858006c039080a9f5fee35ad3d4ecae8da7ad96deef58356f49605d0aab7bc3be318851990d03c7595f9b3d1370fedd47e80580be449175c47e8989eeb75c39fccdb159245dd25425737d54653421e16891900ad7a773214f8bd21a031155457667a9dc9de421f397b7cf2f072143fd20c9a2bc8ef3bb449011b088d868d826475a96581539f624d2ce8bb351050cce6452695f3abb225428cff6905bc2856ebe288ba93b86c6c5bdafd016765b6566172345f0ce9647beb7eb864b80179594e8e2dd7598b34af6897e79c09b57ab6915cb15b3535339ba708142d28d43e1ab48086974c297f30a9577f5f4231b0435d80b186301fe1bb7de382cfcc89f1e990e40f15bb27ed9d38964120584a15115b621dfcb66bae261af5efdc6db091865f8064affe5360b2011cb74bbbfbcf82bf135f930464dfcf3fa323840c768c31719617cd7c42b43dfa19032acba251871c402a6078dacb5267316b9005238f7bf6f731834ea731e3be98d6f8cf178345df2f9f0b436f4c9a27d5df001f251abfbd881d059cf9f1a10bc87de8c3cb800467581fa551912c57642c3ca093cbdc8c77958260d62d18d8868a1b4c24eb5cdb31abacae295e1ab1f6dc84965e0118e7bfbd10a1fed1b9bbe53fd5e1998bb4644b93258e1b5ad8291be1959cbad804ad555a7683fac475fefae9fd497e8157a049d7c3aefcad09928921aa21541544c4a3c6a31a6b0da4b3d754fdbb6fea9c7a42bbe32f4922cffa0d413adfb86f66dcd6fdded9581c271c8c4c665fdd7d7138a27d5db59cda933d1f1a615a54d98ba115649552b842d8d3919564fad9eef8587a4f78ab7aa6b28c3ea460a410bea193fa5f96554b14d075665cc6615fb69a539ef01c2cfbdda66eaddf4c475de3a4e55062e959ad2a93286e1a00bb8fe9581770cb15d696ef3e3c7c1d0e4dbea3c36e251b62e486683ca62129e4baad5176b5e8776b85d3e1aa63417d978493b4c5716e36b01941c4d5d7928c15e3743207475d5156a18d659ab8ba5207d00c27168ecd65b241d4fa69435457bd8f4660048d33e97b6a17fc7560e672489f778939ab4b161a58ecb83118354f6674874979b7961889ebe414cd3c8d4f332f16dfa69f694079863aba7963902017708c3405cd6e0f96d3d2586389d1ef0b00016b36cb5ccb59a3096a7bb03d04dcba2fbcbf707a6176ecdf4ef687a50deaacf64881ac51cf4c239b6d31cdb169983d7ae022bbf31ff570f939484cecc99dd7c1b99e1442d571b97476913c51d702c5a27760f890af3b2e32f417686fad72d53d761044a647451d1ab1f16ab305dd4d07175c2a121daa4c8a00954fc80a6108c3d0be39054074ac824abb36d007d916068961f34bd14884f93018a195626b8bd25cc42d442000e8c111b5a8e21a61f0660817a907d9ee6f361882c4c282104b3bcd565fcfb54ce4e28e05eea6a6205b09fe3c42b1f7a2b08ff0d307c78957991d3e4ebb59eaa102601b56613a25d82bfc1b5166bca2ae479aad30d4e7ba36414298d038ba4a9ba7725a3541faa65b0021cdc599769743ed6276d222169ff7bb36a8ae260c59b191474ab54a09bb97d52a600e6bd334b6cfcbd191de7e836ababcdb0b93044026c46b429d286696933eeef895a1bb319c5a6e836eadab86a239d8d1d3636b3d1d94659b6999b4786750261d3a4cd7c3697d8ec869b6926049472646da47d7317ce6d363bb8d912cedc763356a36875ca72232de2ccc09cbb23f9401e89a08910a60d0d6e175a84e0a4ea710ed0b9d1d2095e8103b6bcd044cc62d15e883b28a2ad1b567a69abda372e9ebacd89fc43c783ecb6d8305332b8c900ca99fd7b15ee648b58a023bbff1d7a8be6ccfa07336d57a97d5a8d484b204645ee9e90bfd8210de14b7028680330ab1058b886c59e5ed37a0f205ae94c3037e61184df3ad38aad6cd51a7eef86cd9de0ba4e4d5dc70a244d2ca1c1d7d837e4505904f2037e0a8c32e0a8fbc8db9bc01fbfc284670f66f56f56f833d76727b63fcda3ef9dfb3dfaf2bd091f6da7b9fbd983ef9be66f7cccbdcf7e597026fc36ddf38f775fb63fcda3edfa3414d0574485e8b10ae57340b40fa1cbdc230d135871373603d6ef3d79e08cb7d144e56204ac0a562fb41a5dabf83ec6176f7cdb7e56db0b84224a90170275db7a1f4adf8f5cc52c76892ef222b586e2cc6b656f846d57c8ad903cce21ab2a0908e7dadf37e62deaca42925749e7a792fdf7a1cd3dd5c194599c919b39ef8ea8e3f94f6d236118bb711594ae132cd4305655218cfbc2028134127771ceb1690b7b971f82066371269e454643a3725fa4c5d4f5104541b6074ac7511c606c6c1a9f8c81edf212789865493bce959164a29cea9ce02eb1ff131230d11ed15e050d6c14edeb7f835eb6fefccec08676686be7b55f72ff3d001cf470548aadf1673e074622a7f3959fab0560552b26d71a75a81ab7fd4d5d1bc9d96b8e3145d0d2d028fd3518506df4c7da59f3a510718638c4a9ac08920d01ee59283a924244350b233834710c6c7348b0a27ee7d769d87cfb5a4ea2e160ec853905a107872a7d6ee8fc173f15a10dad96edc9fb74c426225f91fa5ea9c8d1c91b1c9a6dc21e331787b6da16f81047a5b3daa1a97e38382cbec5cc7276d6a3e9c14dceacc7a4f528b8dec31d0c97de63ba581969e2d33d218df41a79c17c95711991863447534ca8843254aac327cad89e351e4cd585dc0c8e5f812f7f57c203c2c9843381074dc7eacf8f7d130ea6be209e84b8c097bdeb150f1300cd9e06831312090a9eaf5e086f326fdbbc1997ce5e80220f8cf7defbed11f6eebc2f9e1b2f3d8fa837d51bb3ef3327999a70e6033d7409f4fd191a5a8072ff0e3e24a727f4f63e67561002b787ae40751e01df44c3bde144042ed43ac8d0e981ddf719beb089d0edf57833d09cd3fe940d6380388cb11d1e7a70abe9fef0103bc08ee1ecfc1658a5f984d9c3b6df080895b213dd0be47b2ebc3d3c379c1aee11ce1e7041ee0d8bc25d509def00e03ce225e9700151741c5812261c70817f52f9d0f3f05cef3171ecd20a866d40487d13188de9eacc423910e76f37e08156debd235e2537ee728da39eec8c3f38a460133f7457ad98424b8c38e461c9b5500306f414a5e5468215cf5a2fcc572a462eea569ece3fc0208d2466c674c0bdb866f64ef54dcbf23bb8ee1275709c703605e0a22ffedfb31825cc7ec6cd518621aa0c2636cb0ea3322f03c03f55a895b05c709399ec8b35b19853eadb284db57aa0b8cc1063a803830d0aac13808577cae5002506c205d7083121d342826645a91dd2d54e6048fc7d912c497ea042592fb7e41ed3f04114a3b3308bcfb5d0de7ded44ac786fd885581a0eb1c9589b5038105ccecbd9f31b187333487e2d8341905fc1ff1e8b2ce5332d796a22b4528a001c9e33c43640004cdee1032837be475508592520b190de6b46c53e13029924488285cc1a745bc80c836310f2ed802592792117c540b1ae3608719816999d59ae0c55ea13fc6e0515c3a47d4c245fbab76499e366ef181c31e8ea58a899d19f6ed346770013c97484ffb4cbf0069b613bf1f9078af7078b63bbe9d747c6167dfc7c7b6ba8b9eba3c80887673e1e7c5236ea3e61944d2a5e5b2d6989cdd810ac074387b0a7e91984effd6c9564ba791256ff01c5a8ec9ee75dc55a97c9c3b9191af36ce73c66039c11726c789a78defda2ad8ed75f6b08f6b3b7de49cd7f2f7c823ce15027a34f721523c2b6806a1751bef48b96c0f3519a99c1dfdd262815055f261603915b2392769cc0195672f809a3d7269ab7ab7048011556aa6b2da5120725ac90f407ec89b716deeb8685dcadb4fb13bedbfad0a4036509bf42fbbe9a298fb5d0126aa15943d891450305b1b9dfcf8f6ccec1560c8cdf520a5227bf3bc0cc8dbb1207e851e32bbde46d0e7cf138524f589493229cb2a31e2969bb281d80f7b79e27585200f4de33ceeb43ba1a60a24d5974fa7d9df5186850d509364de24d3269b5910444a8d0c86f4b844cf9143c9c6bc228a3c62fd864cffcb145b23ae3d21d7a30fe83130021b7a0cf62010bc3f5558b0720847ef91158766dc329da63a882c5e4767249cc4735b452af44a6263a28f66fabc813e74709f0be1aeeb5ad04ecf329fa65ae2ba75b6c682483e390addb6040501ee8f6453d06c0e7651c11321ac89db8964b0783431deec718026f91994ff067c12a12a712893dc9e1182262a94d7ec461bf472cac1f4132ea31a5cce04afcb0e0e98228d49ba6dc50d17854f09376ca0d201397179874e4ac76ab8dc40bb6536cbac72f08fdcfe52d716215e84ba1fcdd646e9c24536d5930f37e366f23769f8109bfb141323269608bcc1ada038776fb57a2e7791d64903ddfbaf2f91044c2874dc8250575ebb969ad1d78a2c45b1925464fe8ab163f149acd98583d22c199210b9f57297d9bdcd084048e0695534b9277692d314dc23b1d14acac7c8e002a7d506c994bf04cfce23c4a47a2fdb58adf15c2b655ffbb1c2e29f9a0b607635082c5346b86335314440eca9e73bb88a64707836d045a97be7c2ea59d36b5e219a0eed9c3f828036d4fcf39685f1cc9a68aff5a11ef6517d19056b2d6f3e1f24af8f09e5080dc9994393824e87ec993d2a692330c342b4353ccd8358de05a8b592b8ff92bc5c294431fe5b08f8366601d40a6edb594124f58b8bf6ca8fd83afc84a3c4621c8e7aa620afde143ccfdb21a40d21d7a95495a544eafba27c88a2ebfa961d0dfc4d3027b01850083b83c5153dbe893a33ad1d41cc495e40c744d5b5279aa3e000c30cadce9ccae16ce7b5edcf49c411713cd86b99c225254f4c70ac66bc23b3e6f257a157d9ec21ac73ba4dccff63b2b43a4b98602f22183746651ba977115954d422b9ce6e6402b603f486b22f21cc84e71d6ffb58264f7f0e0d49c92e129b655313cb5ad20bcc9c6fd4c5f08b5b436205555ea2203d9edff42522f0efac8571215321527b1307ba0b4a01d963548040bae9a3ebc092d89b73cc08a0874b7baf5b4d4e654a3d8cba81839ecc1083038241f01796decac2412c570229d8f17b2c2b00d4a36f1000eb073e8d5c244cae1eb040bb061edd3990926d871a0711187589d29c51a8e157bb7ba51e9a9a0a959dd6bf25eac98834e2aaa7075bf72996815978f71a70d1eb7a5fbda9b06fd480980866946978c46fdadf33cf645b2f70cc8ee6313a6fb81c0e9799a9ee3792b4198718632fe0046726c7be89687affbc9b1eda59a5ebeee33c7969758ead98ee03e4a4d4ece75657e938ccd90fd8531d005a7cdebc67c720f2f396d5e57f3d17b7ac969f13a9aefdfd30b4e8bd7d17c7dcf5e72dabccee5d37b3dc839e01d97f43ff01d4e80378faa3daad7905d2cebd3d4238a1b7a3742d4cfd6152b5b3652ea0b5ef96c8d44faa87a8f5e5b8b6e1ba28e5e436f149531809c2e2367569e5f6aa74a46096377402d1fb00134b416705323d6f93454a11eda891c3faad0f53728a5d1eb394c09d16a1cbda89dee8d1ac65c1b9aad3ccf31626df442e7014c04ca98eb4f57aa30ae46287af4765170818d7e462fe6cf11687268f4f2232a9663af5715c2965befcbbfa71d692730289a7b87ca73a3b515514600e7ed62637315175f3c4014160f7364d49f81f76d8b250a7496d3527c945af3c7f42b03072dad8d6f1396acb8ff60da5224eae76c1947ced1a36478cc95bddb7fb0bcc7c1036432850bd8aa04bd8a6c53f134f499224025d4c732d10c0fa81302f49f025eb0c4f70b3970b0160a073ccff33ccff33ccff33ccff3bc0fbdb1fccd22d62cedbd48bb827e7b9807db467f999999999337ce05c9da40c95af4244772acce350c6a0b150cdd57caa979c5f5502534e6e9765f3482aceea39e7b3c961841d2df7cabebe50a5e2c82d8b1294aeb5bbd4fb318bc5004b1eb87dfe3a94b3e89321241defcfea164b6f1c1aa8708e2fb78fbf34bb8c74533787108c2a6ece31f7e6de69c694390fd3f8c9968f2452148962e5d7cd9eb7b7a268082178420e4670f6b2ed78b4110a6366732ce65ed8f7e21089265ca3016b2e28a596ed4702c4e0772e078bbb20e04395cd6b6dbe669198be90520c85f7ef2d1a3c7e0118e7cf107d27877ed77d009bf4ba61fc8fde9efe2a4886ba6601b5ef4819c52d8f4de715b0101ac105c8e1a33b2d081f5820fe4e197f8ef6c4a96079b177b20f565cd3de53af7fad103a13659128fe5e9aeda3c90b2ff73e6f17c361fe75fe081187c7896dbcf6394dd5edc81983d648e96c67b6107f284875952ff96f8cc0b5ed4815479d4b3119fc9d3ae17742055928d9b4a7a1a5b364e088e8d195b38162d81177320868cd3dcf374a003386cc8815896a242681eccfda0fe8015075ec4813cb8187c1c9ac5871f331d7020a5931fc694e9e8c364be811c4fcfd26492a93cb633f0c20dc4fb78e71d2c47391f6d2047ed5968aa6dd7bc94b1811fe69ca2ef176bc836eb26d336c3f2420de43ce831f7b8571d2e9305161018810274e870185554512fd240d0bdeff1020de4918f3f57fa0eeda134586720ab6f4626efd218b23303315b6f282d8fd9e2981b35666c95817c71e2326ce69fb88f0ca43c91bef41d4fe777a0860e9bc08b31106c73eee608b7d1d469311052dfa4871e378f56db301062e3db6b2a87b564d1d89aa103cfbc0003e9fe3b3c7cfc71fb7d686c7d81147dd97c50e1a256bcf002b12dacccb833b0ba401acf838a1b6592161d1a5b5c2059a6dc39e3e7d3b31a3976e016c803eb73dd3cf83cb830cab061a38604aaa8e2851602f0220bdc5797d8895dd765658d8e6d8a31f630477760f197801758205e4afd162d58e81588d3eae3a06ba93f554e8ec7b602c13bdd0f344663a57415489b27b6ae46a4b1c516784105521ebfcaedf9fea40fa5b15553209d8f2dc612adce7051871448e9fdc39cf2836aabfc468198c25d66374df31750206c6bfeb8cb72fd04f2e06437e64b591a6b305e3881d0c3c80bba737e6f311a5ba8dbe798744326105318fde4c334696cb1d58c2d708860c712f48186549d860e5602d1b3ad868f43e7035ecaf9401288e5e31e850e3eecc19a8604528b77fdc8824f638b8ac6be78710472ee185231bec56713d308e4610e2e8d2dfe1d5accd871a30884f26c39437e2f2fae1b4420ded647c59dba947b1a3376dca891238b2e3a6a608143206679fb686a663d9dc377e8d8bae28510c8e351567accdec31e58a62308a4eee10ff3d87766f27d1a5b3b70e0000271ccc7a3dfe09fb2477681173f2069e768f1ef17f798e203f2a0544ddb3d46b3e7ecd8e2dce008bce801717ad83db25befc80b1e1055c7b22dffc7af31dd411e3b56ce66aec00b1d94f2d352e0450e48b963144bed9a87df378dad1c7e6c9474c00b1c10427fbbf43bdba103078d193772e0a831230b1d2f6e40caa39b1f67eb6cbf98870d4839f6984ccfb5e6376b400cefa16f4c9a8cc5d80b1a10ae6ac63e5c9cff790881173320fcb87d30ffd2a3d8835ec8e0ba68933b4b8bf4f59431dea38f7ea32f6240f091c6bab0c091a3014e78010392fdc87ca015a51aff581068400370ecb801013ec57fc6c1a2c68e1b5ae408c28b1790452fe6f94d9ab33bc705d97d746dc5acaaba466c1eb7d799e5f66ef0d102e2c6be1f966a8c41ebf2820504efef2c9d6ece64aa172b205ae4fa65c4788e3ee8850a2813375b91682db1d3aa36f5cff6cfec6b2a0cd79c3964d8be860a42b5c6bc2cf34f51c9b76497986a6a0cfb298fe3e5d39c365390f3c0628890c94b6ab9280531de89a6bcf843062e48412c13118db9e5be51d92888da1f1aad800b51105c2f58694f950fa30a0529e74fe96555d9d3bc800b509052f9ccc9864ea93b85c616b316ece213840b971eae7b68e8e5e109426b4aeef13efec19b8f4e903acddef6e0c772177338617886d46969d96af6acc6b736418e2173d6e0e96357e04213843a8b1e79ccc448889920f47854638294ec2b66fa70f1f08197206edcd35c377d5576e1d4a18309e0c212c494a92af6766cc8a88a2a66f80c4e1d3a04d0002b2a411eaca59ffdcca10431761ea54b1fd749903d74897679dcca3d4c1244eb36fff5bbf0cb722430af6cd112c9c852ed109d6a4f3985cafe40827836de9f9ffe2f7c780d1c16502c5c3c82546a31a654d33cfacc43042e1c41caa3b8ad569a3d7b4553e0a211e4cd3862199f516902178c208baf6944e58ab1f2f8459062d7a2520eeda97f14459075da63cfeba5a4652782ce2599acc7631161cc080b9b7a181e82fc035db9176003178620a7f2ce9643962e0a414e5d4f79ecfd1282ecc31cbdb2c6c53bcb41907bf812d6e1ecdaf3b855a37fcec3e4c3391084decfeca69e0604318fa5329e87f80f042f9773af1ee40772ffb5470f838d03c7075cf48194827ad4885d3c0b177c200f35a7b2b2181e672c5b9c07545185d9e2d070b10762fc5ceae1a7b59a3fac079248a578553ebc8a2a4e0e73f240bef3d1f7069d9e8f79177820b47cb44fb6a98b3b902ff4a37df49843da8300177620cd655dfd8f2905cdde0e1c36645451850b5cd4819cb66134e4c696d88d0ec453cb18f629f479f0612ee6e006b909b7cd41c4800b396452f22632d2911da9d6d9d33b177120f765f5804353296a9be221e736ad1efb46b63c5c6f20f4b8c2cf6694f361c88ae0c20dc4cb1627ef25bba6a605828b36907c3cab610f5cb08174712a64f8564c39ff6b20be54daf794e3758aab06c2a7aa90d16f4d4d22a781946ab5715a616326b840034935f9aac6384d97f73310b5cf47e1b0611c878d1178163b823f87cd404e2d1f6a3c3a3f2d5306d247e91c3d484806f2c847fb921bc363208f72e7613ebf1e0fed478a81b0417f1c63a50a9d7b6c18c8b99af436fbd3f8c80703e93de55196a6b6d0ca17c869cc3f6c5f7fa063b9f002f35653b59da1229699faf72395f2e802492ba3cbfb3458ded02838b2202d70c105525696be30ff5d6c81e0799ca12edeaf2ddaab05626b1ec88d7b6d34709105820f2e7567fec83cea7f01e7e10ac8810b2c9022cd24338f7ce6a2efe20a84b38dfb61d3ef312e2b10ea3d561e8ff2783765ad0ac40f4df971550ab9f107150832f9694bf2534a3e0552d0cbd3d81c1d67ad14c8efa76939c618035c448158b95ed3741e050ae470df39f3603521b87802b922bd7c76ed2eddebc209a49b4d974eed7e828b26903c54ce39edd1376ab80d1823c8e1e6068e726444c10513c8b93a9b8fe2edd6f635821c8e458d4e828b2590dc639a6478cce33fd50d5c28819c1afa87b95575910442e56c793c0e1963e7e58104d249c5fbb0bd1f81b4af612ae6d11f46d98c40caf22c997197a2c44711c8b7fe791cd6651744206ba5d7e0e3417446bd0c8194dfc3f5b87c09811c73253fced4c6cac94510c8de593fae8d69e6ef5d0081e867b753e53d96d3dc0ff2aef0ba99adeaae10b56831f577d43e20591e3f1f498f56d2b32e7ad044779695a7d56689986d887d4ac61f74ca5df080ac41f62ef36d1e0fe7471659f89905c1c50e88b9f5fa43980fcbfd9d3182c78c11d8c8024f032e7440f2f4d13b73f8b20dfb18d06c756c3cb4c0611a6b022e72408c1e6f26ed1e6a8f3647632b0b2cca51a08a2ab2c0a258514515361c07e4c98c9e6feaceeb2b808b1b907de039c3e42635cc4d632b8b1a3976e8b0a13b6ed4a840076a286077dca8a145076a3cf6002e6c4098c8aaf6afeba01af7105cd480dc553ae631e6183d4a260d173420e65a4c7756da95a37ccc80947fb4f53fdaf758a979b89001597e247f96ed621103f2c8fb87f1935a01f4810b1810c75fdf629c8d298fe2f403172f20851ff576ff207501f947f95536e2b4afba16906a4dc3f64573c1027254db53938e1aaf7eac801c7ee5cbda7b537fb00b15102fff28984c6ca920a9ffb6bf8d2b0154904d7e3c216dfa831fa64e51cb6d684d596549c7766fd846f43005a1cac763e9cb152b76c44390402948793ff4094ba71b99d2d812018e2c24400aa2ee7be73cfcb5951e2b300a52d6eec62051a1b1b5c6a2208f7b5445154290402888b9fe545724ce41860a0173b6a8d100b64202a02058fee06ee3afe7a0df7d82f0d74983795ff8981a097882189235f97da9f3309b9d208fe3e54a15733a49b89c2025552fab2099e55291c02688921e62aa4566a253aa93802688a6b147ea5379202e6a2688577933b5ebed277c4b4c907e6aea5c5e6ef3b297b00e351e58e028564a0442691e96f557da14f78c60470d32184320ba5476ca194463cb683084405839cfc9e3887fa5288c20903f4ff7f833ff40200fd7caaf62fe07a4143756ccd6479196e2837cc3fd30a40f46183d20f7286dbedeccf3801cc39975cc59b397ea0e48fdf9a153c685cee7ae004307a4dcaceda37c2e9eec470e082d2bdbf39a52f8bf7140ee4cb56e0f328c1b10543f0fa7c7e965e5291836208ce7dedc8eb5f0f9ae01a9334ac5d2f2a274480352fa705b65fb0c48f17353e6f42a03306440cef9bc7a63bed03dce8901d9f3a6f3c8bf4731e6c13020e58fc3c7e3d0616e1bc27841d1aa66259535532eefe93dcadee563b7340c1790ac47e936c2b2a6bc057fd6fd2c289886b1e83fcc0a483edcf1c10f74db323054401cd7bd8b414df57c9c2ce6d04de2312a485ad1b355365bba4f4178ddf3d8694d41bcca6a2988f2da29ea8ea42005f7cd951dc2c28aa3200ff273688db7ffcd8982143a5c85b5f0f1c55c2848ad7779ec1f7b509007ff9b53666ed6b8fe13c4dcbc19cfacf704a9e5a3aeb6bcaafa4e9063f64b113d1e8c670d2748b17ff071276d3dae6c82e0223e8e8add5ba26b82acb69b926682b0f1e647dbe35c7e3526c8e3e499b91b279dbc04315575fb47d23e634b103a6594ef6ad14e5682f8bf4942b3596e8f12a4d4f519a7512fd94e82e8ee1d965259415449107dd4a5219df3862512a418e2cfda77c36a483c8ef478ad559e479063aa79e9d11c419c12f5143ee9db5b8d20769ed4609bba3d8c11c4df507539329e2e3a8b20a6eed8921e8867e72882d43fb2177c43fb4c04e12da694bec7b9f3a0072288d9bf624c313f0429eee5fd8fb28620650a7d132d72b6d1429052c3fbeaad84205f770e6a69defde32088a649f366854610c4ee6871a5a2c7fa9f0904f1fdc3378f7776d3338020e6fa7894d2e3ff40f07079d0439759bb1c3f903b050b57deeac1377d20e7819c755af48f93860f64774f1f665cf640b63cb21abf7d3deaa107527d6558edd9a6aff340b094953125998a1ae3819c63877e8db550e00e8ed7d7eba56a8747f1f260f4dc2c75c0872a1663b6aed081783b7df9c1c377eecc81a0e77ab59fe31b3b7220e5d1acdaf9f083ac7120edfd9e9e0907a28aa5aa98699d836f208bb5af9f27d928193790423e446eaeb4817017fc3ef46003613dab3d8aa7dfdd6b208f274ac407b71ac89d3a8ba4a84ea62f0d64eb610fbd7b98e37da1819432675ed2628cb51e67206ccc70e1abc79a633dcc40da9c92ffdff72803e96d5be4e577c7260339a63ec6ca34cd78c640fa57eb61ef450ca473fd6c5e973090357dfaa8723ff061050c248dd6a3f44ea173fef802f9877bf5a30e7a3f8e7b81e023b9e0030b35de7517087be52f7d3e16d1b9401efa78e8b1d4c2ef5b20d6e68e1f44a5edc65a2085d8d7adbcca038db340fcccfaf723170be4b9dc9b51c9727305d286688bd6512b9047e153ae46af02b9ea3e5534df0d1fe654208ff3e86f3ea77c0ae41fc7be39fb3ccc17722990f2dfa65bda6fb5c9a340f2ebd03b2266559143813c08f3aa97b71c32ff04a269f4a8adfc03738f13c8c3e8d41dba6902492bc5fdf1783cec916a9840d8cf35fa8353f7bd2c8114b299dc4ee6422a4a205d85f830db7ff7872781d4ef51ade28e04724bc69c97a292962390a793a875c708a48fab8a400c3965713311c8973ceb84541ee59187404cbe1b5f535208ccfd47e5a06710881d539a4cd9f9664e2090fc7f98ab876251dcfb0131e78b952653fce1a77c4048f951e5a8e9012973b6b7bd2c5f15350fc81a956d31fe0e4abd4dd5251e1d10fff2407aea1c90e237f77dccd1c7c9070ec81d2b742a7cdd47b901e952ea2daf3c181feb3620f7555dbc3bcb9fae01e135a654ce360d4895dba3fbecce80b4799c3bb60fd347561990f43e45efc480f0659aae25530006848c3fdbf0812f200f2d252b5dc8bcf85c40b67af952c94dd16e01c1d234fb6d8a1a336301c1ddd7c3dcefc69c159034e7d8de797ad942011590fac73dce988395b4950ae2f679b6b3885141e8f83ecc7339a720a67423729b82b4f1539ccbb4f953530af249d467eccffb91a46873dc655de9310a92f95c4adbc3454194ff787fb7878298e47397b8a53f1f0b0af2bb7b671e78d4abf11344954d2e99e17a8214126749f22bec7fdb09e2e6643bb6163b83b69c2066fdf84716b2dd04d9b634a5ba7d8d5bab09d269b6efcdab0f93b59920c65ea5b6668f87175a4c902dcf85d81c569dff4b90342d5be476c8f4794b90c6b7837ff0902a9d4a90ece2c476faa004b9538e8f6e7d9041f24990265a5abf435de7b1922097a60ae66139a71fab9120fec887ae966f7f2baa902059daf0f0317d04e1576a738f25bf7a903a823ce521dfb3d91a93368298f9e7a2d5725afb19412e8d5145bd2a6e8fb308b2648a41f687510459930f33e7fd9f6a8920bdc7980e9123829c21e43cf7e843902ceb77dc0bd1830a1b82f4b61a5d935c0892df0f37ff72be7c4210d22ff478b8ef204841cb66cdb6c35d2b08426d1e180872aac748a5dbf8090141e834e93132fdded91f4855c177bb528aa1991f4857196f534adc7efa401e7d8a123dec74ffc1074255080fad77ee819407fb6143a7ece15ba9876d3ef34eb6ca3c905c53cc4ad7e51af37820c7fc72cda97b323b7720ac5896f7f1610742f7f033cac7b3123dea40fc8cead9f34e0752f0f8b131ff38fec6e740f461be1f492b07d27eceedcb3c9c303d0e24db3c4a292ba6a01f3890f3a7a45be397f1f51b08579df6c3b698ce47ba817cf1623caed60672f4cc9ba62a64033178cc831f134de283700da45039e506efd540cceff1873f8cb0d44e1aee9c7fa0811445e3a5cecca2f13310f42f63c7c26c6e3310f378fc793cd4efcac0568efbf6579381a4e953748f22c35f1e03f1a7f348cd52df922a06f248e60f3425d662320ce4d018638fc36b23423090326baa62fe601d635f20c6ffd0c53efaa8cef2027950b59bb345f8c6e9ba40900a12b9ef617a3b5c20548c6f114f9e47b30562d5ef4af4285a20a5bc7c1608312b21fd55afd9030bc4a5e8710552ae39e9f0fc61eeb815083ebaaabc6e3fb48c57815ce13e26938fe976a702a9c7527b72d59bf33b0562fce99fcfa81408329fdfc3f42fc6350a84a87861b62b7ef4130a44ad187b02f1cd3325d1ca2932e8049269a55df8a0c73f621388156702d9e2e6dc1aac3de84b20b5c7cce39eade0c15302614c4337eb2410b5b3eaf7483224902a4867dff84720ddeb66cc4ad7501e231063949ececaff63db1481ac9fb42e53f4b89b07114859bd7954793c8640fc61ca703f9a08f9f11002f172cbbe473986cc2308c4caabab503a10085aebae3969ee71d27f40caf0410f57537692dc0704fb916a6cdc0382c6e9717e1f8f2fa69807c4903ecea39b7f8d3e760744cb571e43f6c5ceb77440fedcb5d43ef1756fe58094d2c7ef7ed0251b2a1c90da2e5750e906a44d96d5925d485e6f03529c7a8a3b1f2dc7d4809cbe53e9cb4f03d20597cb7ecf807c5ff6d3e59e33333220fc304b79fbb8ba8e01396965d5e89185980506c41fe9d866fd1e48f902b2766acb03ab5fc9dc05a490ec94b356dde6dd02429ce7e6b0ccf29f05041f65141fa9ab6f8e5740a82c9e59de09a8806c63e6a39e2e1f263715841f255b1f8af728cc8a0af2e85389df6499c57a0a625ef3e84e36ee999a829cb633af7827b19096821463a488d6490ae2ece9be668a317d14a44c1e2b4a7e35ce270af2f53055ec27f3e8eca1f64b7d855f040a72361fefc719f7b185f1c5274852eec34bf53944e75b83179e20ef68cc8ce9033b41981e8bd48e7b5e7082143e97c47de83219e7179b2887dcd015ed2bc60db042137e54fdd496a2e78b4cd40b4c10e7b56ea6e27123266ff93373ecf1787109427dcaa7cc6cee6fedd60b4b9047179be44c53b86df2452508d33f97ab9339361ebe83179420fd28797812e4f1b8d7dfe353baca2989b32a426a6364666ec3dc7bdc5aaac36591c0eee33e66ccbe4d5e6624734fee3284179020cb074d29371f8f207a9c6fec183dae97e9085ea37b56f3b1a588889108040d17597ae1431d0259f5a3c4928a9aa73c84409430db1e75abf7b043d420104385bbb0be1e3e27191508a4f439550fab872df71aea0f48f36a1f11e5d1ea39541f90b2fdf04367364faa41ed01e97d7c6b7b28eee001f96f347dc384ba0362ccd891fee9805cb69be1375cb0de77e0c8814ab0220764fdc16d9ee9718a9a611a5b5ae080f05ef1cc4143c70d083bf131e711d3c9060d1d3620e5cf47ff7e6c8b1a905289d6e4fd6d5acfd1d8ca8163865d0d24584103e24e6b25dfcf197d7cf119907fe8a6ffe3ad0e977d1910b52533e5b1fec8fcc3589c1c3120ce8fc7991b77233dbc686c69010332e7d24a086a98197635ac7801b162ae5a64f4b9fcb70b487f21a75152a22afb16106387ca2cf5300b0837f23dcabfdbd73ffe46c902471633ec6a58b102424f8568d0fd915a4ca1b145821d6586dd25c10a1510cb73d6d01c36d80f561b65865d2a88697c18a47b725410d655c3c96492ce8d4e4194e9389d4baa6d9b8270f71adeaa21fa07652988f661eee1ad91823cea5d97cf16fc51103ca5435ae6c14f794441cebad187394d0f7cf45090d2c36bf4a75bfc70760014a4e8b63c58ebfcb1f10992ba7778cb6fef09d26bdc5cd8ce3dbff23b41cee9a25e397e3841ca8e3ddac1e2e8d784ba09b27abee8b43ae9f49f26c8e1b76e36fd7854f1c299200f7f903f1e55e7696c69810962aef2fe1fdaa89720c7b5f9b1ff7898ae2f6b09e2051ffdbc94cbaa7ad44a103a4a56b592b5e5c18e4a09f2de85c6ec96f2c19320f4ec76ce2b4ff959469504212b4487cca1c35de50e4482dc9b2e6dc798ffd3b91d80042954cad55e59c9bef238361e415ae96d5b8f39f546fdd87004b1c7e16fc5e73659851d680439457cbc1d6225346e3ac00862f6348bcff251ab5a2c82243eb79a7cff4766db0e4534213fea91f193c6d6b99108728fc756b443a794b7d3d84204f9bb77a73dd9749404203833ec6a1c829cf1ffe350e6b1727d438b3704c14b7b287e2eeb63ae8e1a33fee42804212d340f2eff478b1b33fee42004f9b2761ebd64c8ece50f826896492acce5d9fce80b8298f179d0923e0c6a20487776d9a3253c7fd60e1004b74c3a2b1176e00f04bfb31ec57468a5cdfd40f8b4337f99abd8edfa405acb5cc952cadeb4ce0752a778799ce367a7e4e3ec213d1bed1e584a696ca91e48a9367ace15dbc30f298d2dce03c15e3e5c10956d9bf6f1405a89eef1a83ec5182dfb3b907d90d9bed38f47793f07d50e44ff1ff6b0534a9f7dd0dbd5a803c937e6d955b5a0034976e72f9cd6767320c665bb9c93520ee40a1dbae288e696fe11075268adf48f473f363d0b8d2d2de04036cdfb797db73710b3475979709bc28f7f34b6b4700379f5aec7444f237dac561b88361953ab746a6a5ab081d8c31f3583d740b4948bf0cbddc3143faf0652c658981fd525e9d340f218a23a558ee7619250d14034eb1e789ebc686a393476865d8d33103c3e0f7e28efa6b1960e339073a51897f14a65428c3210a57d70d1c3183f1e56ce0e321073a7689bb35af0cc1a1d63205bcca136774a7d315a311053ba3cccf9573df5614e1623d8c14e88110672cc7cfa71dab498af0103b1aa2ba3ca94c37c81ac978729aa079552dcce8c5c420c2f902b8d95e78169c61e7d686c7581a06af2e31ef7603636ab6685185c20b80f56c63d69ecfc285b20868bcb1b753f218616c8e3faead2e328cf1e5920b964bf778c9e7a2d87163b4e0e43420c2c103c9e79fb864a887105929955b8985bcff1b002597ef0e9f32876686ce5785481ace2af49ddf3471f73e350819c76511a73741fd50f3b392e0931a640bc1ffdc033a3f630e5181a3ba44058a98fca1fba871e8db2c34b14c8e3bef9e1a27a48479063471321061408273d1e95995cd3916d9c279037858ab18717cfcbafc14388e10462f68cff94471b1c3608004688d104f28a7d5cad8d174dd7a38e108309a4aaf09b2ed6e798d3e83b6ae8a81182ad2c28a023c7995145155554d184184b20c486f994f3d334b6b4dcd0a20155e586166f31944076fd0bddbf9ca2344fb800182e04d0002b04c0871849e03da3233ddc2cc6c6ca3a742f7bb0151e43a71d030956dbde450bbfc63802c13ab3be77d2603dee11c30804cff2ce4c21d71a218d1b6e03c6313826c0c7e0b88117a308e4b3e0b1c783174b892e061110cd72ab945a95f1e86c0864cbdc21a611d9882104526aa864d3d2ff83eff13568e8681d59e09841318290b5685bab98966de74adb95c70002795c513bfe38ed183f209484a79c4f1b6ea782183e20f43886eaacbbf9f159dc88d1036258facf3f48f9c4e001297b8c25a3f79936e5a1c36d507920c60ec851295526d5f7fdf3d125860ec871963ae7d5ca831e69686c81e058391600001562e4805ca5b9c7e6dd1eee09810e1c9087f1c7316f473862dc80e0e3ae9cf36df9da7b9723860d8829061ff444c66cd56d8e19b523460d483fd49c99b6cb19dcc331812aaaa88a4103e2874f62f16aab62258dad2d703c667ca0b88d47eb043430630031664078cd238d527567e8a8d11743060fdf7c3ccc94d5628b1103bde6bc25bd32432a5a3b6dcea9ba62c080a4a3ab55525bae9f478c179025fa624c0fdd3d06b306315c40f08a9febf2f37820f723460b8c1d2e49a6ec3d9a190331589075f7a694f4d15630c60aba142b0d2f759b62a880746e663f8a58af94b7070374a482d8e3b07831f7072a9a4c3be97431bbaef8b8c8cca9e2c71c44a7720a724e5ee39752baa5784d4112d198ee9e9349fa08a314a44edd8e14648bdbca4e1f390a82a68fe4f328d3304441fa1f6d180a529acafd1ceb4051cd67aa856e58c98df37f82d47960b1f2d0bf2bb805303c410a95ebbea870163a6600c00a303a41de6872c12c2567d80260708228b29f4e43563641cc983d7b5d3255f7a909724a1dfba2a7df5f8bc904b6d56a339559675a6ddd5ac10441dcd2be44e529c4f95bf0acb104d6e6e596a6fdc3ccea8f4bf94a94079ba632a2cb433028d145a8dc46c985bcbc5d3026419acdc31ee5c94e69312b09c2e90597c696568a004624cc3fdcd0d9d5cc29c08004416462d7df37a3758f2ac07804a143345ddeac91854b01862388f3fb29f54d55f6cb3782b03d1e071941aaf4b6f5b1c7b946dc4510ad424ae5c91586228862d923377612411ec65c1f5adc983f6d07118495ca1f0f63901991f610e68b858599d31004bfb8ed29d6ab5daa0a41b2f71f5799a567c0200439eec3da7c5af4dad00c600c8294f53eb28a2a5e00431044bd58215fe1d30a84b11afb31f7bb32fadc38585800062008659ff19f57a36fa5fc81e883bfc83a09fd40b20b97f7e55ff4d6ea03e12627d7a3fba0e32d7c20f68f773c895b9968ce1ec831ce69ee8177f440fe71e56c3af13fd84ec903d97d3c968b217d74a17ee0811c36c5d50765de72e93b10ef87c136478fed40ca513d8bab57f154ad03b9e2feb25ef80c3d1b1d4899ba5c35edc5a22b7320a486bdf06371e5402e8b293de69d712088c677dc1ffc8003f9d3a69cf77bbf81f6166d3991ebb6b834cd948f10dff83977037143e945c47eca95622980d106d24afe7fb04d11cb7936102d43e930d6409e6ffb6198f96a2077cc637f6d0d6a79cb3490d2cab603030d04b96bc9ff3c691f9530ce40ec3cd150a9c55dd3ef000c33dc2e2fed5e6135ab526b251162f5172bd93085510662f0168b397e31c5709a1d3a6664a183c0200331050fa9f941a56f77186320fdfe78fca3435ef8702a83210652aa675d1ff930f9307e8481e8517f7023e9c30003c9b2c6690b9f551ac0f802b1236f7e643f16478ea3812b607881e0797ddc692a93f66b72ec9061851630ba40ec0ee61e7ef82a1b25185ce05b6543aeddfa567da417b70ac0d802f97a64b197697e7ddce6205554e1390e0c2d10aa73c877f5f7183df2c6f9008e2b8e0430b240ba710d753dd5492c7402185820a74baf96acdb93ddaf406897f19186940ec30a4493cb23b3e868ed9a8325805105525ee51f689cb81ff68902185498023953bdb7fc732dce72ecc8a26148816049d4addd07f6f9bbc60dc0880279e03ee2431f0f28b839fced65981e4f28256554a43d355cea56f378906a220c2718b4a2f98f5c930a04184d209d5e5fffc0f330ac33603081a416efd38fe5b66d74c05802f94767f13ab8de896a0516670704aaa8a29540fc894d36a1b1b9077725819096ac879e9fcc731ab100030944f3ce58b3eef1b9657f01c6118879da62eafa0d11e0b8f1811b153002c1c24796da3a945dce6701461188ae1fb33a774e8ffa37025b1cfe2ba840cec1ddbe7cb0e3edea8d1a7cc514082beeb1c53ceb9776d80057488164bf21ce6ababa2d8710b8220ac4649dc3b257a6cc520c0a04a9e9945d3fb168f3ae7802417664248349955a2ced8a2b9c40f4d1e7b18faf6ff6b4a1853b0e1bbd80ab43a378c9095cd10482fc956bdc914a31eec518573021af5802d952f2ffd23c8a3e0cbf120865c92f5ef7baa5529240ceaa5962e5712aff0309a4778f3fcea93f0221cce23a7d78d9b1071b8118165af58731780cf91681d0a1358525bdfc9a2b1148a9753a6768ce94c7da154320a46b1eed85f78540d4fb1875f335a6953e089fef66c8b10081ac99c2d8c8c63cb6bf7f404ae11ab3edff285f5a1f10e3c25cf733ed0139fc54680acd95d7421e90562eab5e34f5683cb703627031b18a771e3ef07440f441f75d882c07a45cb1d36e4564c43820a6e5d26cd9d91537208f2e46f447379703aeb081611b77f1a19df15eae19db24376dfc60bb085c5103e2c59c7207f5e0153420fc38d773f6281bcdf10c08ff25fd5de99401217f3c28159f399d0f5e1103f2c7758c1ee64d3d735d0103f2e0df344e799e7d1e9f37ae78012ed5e73ebcdbb2c0c23e70850b4839622feace23827383b73270450b08763e4eb9ae63c470050bf48df7dda1b4a7edc1152b20c755a8f5c7596f56b70e57a8809c3e141f6cf841c7f52815c4bcf7d9037155fff14a0719a820f7f674a79ca4ac837a0a72ee4d99a65c5310c37fd039532905617da4613fbdd6874ae51c6490823cb69d96642a6f771a0559ed27e63597a220cf8fc236e865a120d68ff3f8c75579509067531efbd8e3860e1f8f4f90efff82f770b366f9da13c4f01b73cca30f3b41dc3c393941ce7934591f237fa3379b50ad4307e5204313e4d167aeebf8f1b374c904b95a62d67e1061823c7ab1ef680f12135b1c645c42bf8a4a5e59526d371cc8b0c4e67bbb5f6d3f4ec971da7e20a312841f754a890c31cf792025886df92e7f593e09b27c98da70ea1e4f6f49105735e7fceadd96a3c7e020231286a91f58dfff288dc63490010972104ddf9ffaed1fdb1b643ca2d5cf0d4bdbd60c643882b41a2b57c7bd37df6fc45639a76df05139bce8a861dc208311a4a8997f6ce17c2c82942cfd38f838df958fc7a3db204311d9de67f168cb1aaa1bc848047173d7e8f45e7ef09fd9200311e44dbdfbf431a50a1f7c088286c6451f554e88680882c56c2722972966632148bddde3a1a74e08c28d76caf4953208e254fa81485d8bf7701504f1ee534d45ef8d5f331004b3b01faa8c8ffd471d2008ff3976e1bf3f10e3c45a540cea23d1c30fe4eb8d3d4a76296b7a5c1f48a672e3a5394ec533f940f4f187961ed67cd64bfe1e4811ef19bc3fe75fe9f540facc9d6b2d9e3ecc03b1e279fc6e9bcbb71e1d7820250bab3affe37187a6b507deb103a937c7af1e9b8fc254e63bdcd481541bead95e957da9a443c9e285ca58132a6a6b31878795362307726cdcc830adc58154f17dfc69d6b963291cee74513d56c24752cd18410ebf51e36103196f20261395d0cb9e4d67bb811895b176e907fbe361d80662b0d41c2fe579a0eb292c74f805d840fcdca6a59e5573cadf6290b106524af6d96fa9a981a41fdccc32753757260db4766d5bbad1b0688e8c6531e6944723649cc11c43fbc6f09e226498a11f3fbf98d6ba73b86b20a30ce4f6a10f7e301732e41d7d18ab39cdbb061963307b324b75a81a6488811cc3a896a5d66120d8c63cb21e7d861fe6748081649fc799f3fffc02a1aed5c424ca3ceee205a2786789daf46e6f17c883f5d18e69a8ab858dc61617c8d63df0f1cc0f274f369906195b20a8b94a5fb6984d63ad059226f70b6eadfde3414c63b340121fe67ae9dfbc544663b1e08a8ff3624e63ab03391c8b83c5154841e7da6b73fa85bf5881ec5917839d0fe762f254816031e673f6999af61ca2410615085ed7b665979b0231a618e9de69bc33c89002b9e2e332f7b06266901185bcb2bb85ccc4f78002b95ca387b14e1be7e136ca03329e40aa245626bdf9e3510f7602d1fe3fe5df3cb86434816439fafea3fff178e681430613889aeec71e936dede674059241c6121e75dc5a05329470c8570b162c6dca468e1d65461638b2e014c848c223938e3a773d8ee90c194860c25be46333463ac6d849635d8ab6ce1574ddca02194720f886bd5e4b61f3038d11c8679fd793989bbb8ec5cb2802c156e7a25bcaff3e74b88e1917061944200f732e887a66ccd9c26dac5d41c61048ffb12cdbab0f194220c65f1fadfdf7c6ce1d194120f59a8f52580df25b1d8dad0fe8702c76d47800811c32f347d1fe4163eb0105193f206ddaa459f9d3b5865c860f489ab647b3c7348dad1d386ef480181f2e47dc64d4a82b2a41060f4897738ad97920e5c3cafd0e88f239666bd9dc4eebd7c1a3c173fa5cdbc901c982897ecaf97f467c1c103bc6acabf763798bfc0604d9d0a145f33aaf859b20c30604f1f138ceab8f875279928004354420a306249f1f9fbce7716840dab1303e96f219103a4c8ff74abd62ec7132204ef778fd1890b35767d7640806040b391fb551346db8d816a82f20a7e63ce841cd0fe673eb029266afa5524f8d2e1d1a5bb8855d0bc89f53a55c95630cd3380b085675d939a794b4dde22db46ac858013163c5b04e313774d0a8204305e41c5ff33045b310f3d98ee239766c7152416e8f61f231fcde67f55f0b1a3a66686dc1a8208f3ee7dbca7ea091d15310b22d5545a5c614c4fa36f9a9cab1d4fe5290efac0729887e66c187fa9d537d8d82684946a3aad4e2f228a8a220c897e641268b5b9bb20b05597be0dd31c6a8050ab27cec8c172a1f1bb7db98c19f20d665398dfe69deb1f60421327d6af270e438249861d709e28fc7913f4e1fe7edb86b718264e134b5e7eafa407d1a5b3bdc46163a666c82a47d73217ca89941bc2d5813c4d0de175f17caf34867ab106482942afd9b5898e7ce1a4c90f5d3bfe6f128a6b1d5011a658b2cb0288c052b2e4168ffb4d5bf5a82e8795c27173d2a022c72548260bfc92cfbc46cae8b12c40eb6d1620c3bb1719f04c95fc3479137a34a82f879b4a3adf9fda7deae462408d5835cd7ad6821e30512c4db14165ac47e04b952d0ecb5eecc69ab1d355c04334a0d2c70ec702b58e108f230d7edc71bdcaced87158d206ace94d57fd03715744610cc828e8f35848b206d47e51efc6d0e1b3716c7c6510431074b31b33f7a2a661241ce2e3e3ff6df3d6a0459e028882076f9c6dfdc108d3edfa87188df33466b4f591a82ec96d96131ba9aa35208b28f73b8d33c4e1382a89ec7e1a5651a043959f5c79c7627a2335608823c8eb2bda9a8d6f840907a28b1fffd4936d5aff18020e6ec26cfece3d772ff40f09863fc9f5b7e7b9b63865d8dac82157e2067ddfca144c6f24d250dd4ef032957b40e9d53cf077285f8f1a788f0b1e6bb07f27e0ed50f9f1e889f49235ecfcb033166ccf651ae643186f4c71014acc00351bc572bf8741e4d5adc815429c8747c8fec40f2816f0cbd3144f6a70ec4f9f6f1d891e384e0c64dc10a3a107a9c6276cee7f1a58c9533977fb8b4cecb813cef771bd2d3f9d91407f2e61f870fccc335cc0407f2a0ddb4071e2dde40cef1d9876f96d2963a504d0a56b881a0f2631f4d19e52f6b0339adc37b3f36a86c207eacf4169129aa8f5b03695fe37da8bd2c0a56a88194c721fab66ce637d41a33b2f01c22986157230d04d73fd9b3aea0a9353410eef2e8aafd7d67d4672056ce527964d32b1f356620e54c41e3ff682f03e9da5384c5ecc940eae1c4ede67c8e8118d7e388c5f0f162b88881e4e3689d529014350c449351df1ece060cc4a42afe66797f327bd42f10539c4e773dda1e7dac50bd401ef9e8e58165b8fb8650bb4030cbbd32a930f5f17081e43eb6b0dcb551b740f0617009f7c94790050e2bb440caa94e6fbb2d3c0be489d29c83df47dbd4c0020b448f4acd61b6de9fe51548f94527da4db57b3cfa958a9767ae0a04b96c9e7d18673cd5a402796cf367ba53d1bbc329903d588abf292ead7cf8e4702ba440de3c59af79187dc762686c4581fc31def93de7e0b0f133ec1e0ae436dbe8e6932edbd7384f2025d9ef71fe1fbcd81d38379c40aa4aeb97c7d6c367d87d13481fabca079d2f2690744abbdda7445d02d12a6de56da8eaed914a20a4c530b9513435e59f0472c6d69cb91c2a12c8b1a24755cd8dfc4e413d0259d376ca9d4aeff118d508e4f19fb6d9599ab1ec178168068c65a854cca66342f24830148bc4e2602808d12d4f00b31308000034348f0563a12cce0441ee1d148003754e2c3a361c1a161687c4216140200603026030200c0400c06040201000034221872cc3e3038252f398164567e3239f9a8407e101e0223967904d257e6c18d827133c4a92df7303ecc3738f10b58124fa438a20a7c79b3f7b4904eed9c60bb04a328895b5743f6f4f7f1177500bccc5fb0775e916d8f6ce03163531d88b2a1eff3eaa3b0f5f5f0236ff0cac80836ca7006ed53d7390bd08d77daf1145a745f799787363dcdd740897fb8b4be2b98f3963823bbf6741c968202728b86b458fee6c4902e895d68fa3139fa3547293041182f2295460d925d53579c84ca935d407da904d82473e9a7c458a03048f6d3ce0e00316c221f6904c23f084dfe367da60da4bb26c6f5ba9b630f26baa0300c62c8cb03f15663f56689ac077a20288f2fc6242165e9d330c97c32158ae0ccdd96773b0706a01181214b2054315da202fc56db598491a3fd940127d97f36c20551b3a44be9d46f08057615af26ba6b001a269074f8b428158b43dce2403b7b348c6a0876071ab382dac07e7f5333e8242178e5763bf02728841edbfc534838b70e4818ff8280cd0edc8aa9cd17395d9c039049b20413d173139ed8dff83f3e8398569bfe83c677a817a62de426481d1731cb6434843f43c3ca93821df64b3a827b20d0c0a0aad88da930a2c464f83aa5366413d213948b98d2863745c2921482b835b16d71ccb798d71357ac6c2612c276681217fab2297c5909e245e1e04c5a24c216a5e07319cf0f5e18a49791052eca4c2f5b93006f5675c72ff90abbb07409f9a36f4bc2733534620564dd725329dad9aabc5c6fce5e40ca06b99897b34b877e473bfe54d160e95062f3b23c2fcf058b293823c2afdc3740feeeca52985c54e2859d52a50649b24e4e07b1ad1f22e145571ba4c0420f2a742bebda418e5858300ccb9719a2da574335fe20dce992c27899b23a88ed903ef690b410cd368c46668e22215e5812b8b65b95c84c4c4dd18a4900b8c5db552c8e1ea392c53777aec8a3740847cf57ca9c846db1a217581942a2242c2bf48a99211f2d24a621dddcb26f1f555138df4802aa194615744c7d399e67ea8e38fe3a13e50c72539503e411d91b9dcb605d4f1ba06664026656a2f61f4b01947d22703339b982411341fa08cf6387e979b4722a7a22af96907dbf797206617244f935cc9db068641895f247e898ca3cdbca50e2a679fbb035fec37b6ec6aea37635108992c0036d707ab20e8487553d16e23ea3191e7c6115171a3d16ace562a54a39c2ae4f07a3343117e61589b2454eb2a82ef308ae2d247253e1db9f1255092ed82e0ede66810090100a423ad91ebbdcccc9a59d59da97bbbb885ccb9f4f9bcdd0fae189f223a141aa7284b21df73b1a66aec2b999008da544d544b986989857637ae528cf6554b0f7712d9839e68351bbc62cc9c7eadec959b8e296f4269a8dcb6c94f452283cfc4e678385ba76b14c9aff576b913e9c47e39af892481cb9f14722726f7bb8b65a5aea032c7188c79eb67625799376c4bbc86874c627b92a8c98159d217d5ecdc883f458961c00b5cae5ca549a22925dad2c828997fd5b14ef9afc8b839c78803232372af14da939049a743288d8aabcc66cc8ca8b876b5e2f7a8a9eefa3289e77e42e7c1f62935085f86daa381904806e13059d14ff9f7b72ac9bd686788519ca204becc3ded46447c1dd59bee1204c98a73e68ed5b754b0666655d9a2d829a0c22ab40d59aa7cae839a1146a8b4acf8113a366758f9e4a4f607ddcdf7521572b29170cd1b4d669336eda75d994928df0b3584b8210ea60b2f6a59c846e445404970212ec924ca15e00f62cf97c0f5d0c17dc927a6daa06c30712af2216efcb7e01914f3b28740c28c2507d7005161559566038781a1f916a6f8f7a26f9589011ae03066ce62db1c6f1270cbce3cf148ad4669a42cfe29953307dc0fb59317aaf5194e280a3c0ed2d2a37b5d8fc04b537e59d33d82c49a1ed21e096c999efabab3cf1609c2f0562d8bdac549c5198a97d85798da685a3f55236f7a26f1421332e5e2d6280f3f15514bacd9344d970742e49f952c68480d6682e6ed0a7461e5280ff033ba6fd4e8642243ed65143dc8469613943cf0d02a2287c6dc0501867032c89132bc13765e9221e0b9a8d609f81c11385f17849f3a2bac2daadd4841873feee50a2aa75f8468d23726bdd0e462b1511f104e84aa0cd8b2ebae632e7c15e08438cb64178782f0be8aaf227628efea8eb404b95f7e432aa10150fc0a0540cbafb05dc129c0c497f3153181e6b04c141e78ba37535608de0e33e80780c30eff616f9c9f55ac59f6688e4e6d9d6d07f0c7d223825c642f1b855b15fe0f7600f67d130b82936869f2c716660ed862d582a903b64a71f79dd42d2c8e488bf5aa50a2aba2ce3a84554ec2c69436400bedc64b5b34c38f6f5e9ca40140467c1a4b02e488e00baf768dc0e5a9845d2ec7d53114256cbc43832bb660ce2ff5e0131e50b6351708bc0cdba8bda10a44786a950b24b70202074a104a2c97166afb984561c42cbbd605697fc33443dcb34a4bae4d548095c79e05df04fbaec5b2840853b11343ab3c155ef76f4b87b30c608505e4b0d085f5d95ec115a988db645f334458aad4e5636c9f6bfc23346832500be0341537cb0cea650a538c8c1a339300dd38430179a045e01642ef53042706b17968017dce144e6113aacb3084bd5204d42765de0408a49106d4a53f0b958b95ef264efe0a3e415ca83617bd213e1831395a5078b0fa7bc1aaf5afe3ee7d4e3bb7295895d6c5d527cd4b5cd60b0871df72f870d723c5af7618c000954d42eb4961bb886b84876f9d20216c03609210dc33310a23c8a4f7f891e8ecadbd5dbc93c8f1bbc017a90402b02716ed02c778aef091b0601b816d06d98756614fa7c0842f2d42bf617f87842d6705ad9a47480c1116f1f1c636ccbbda102ca2c0e87f309855ebb7119878e24f07057698bdcc32ca0be2c908d08f1f20f0629b0186ae7621dd3dca6567e556182a5e5716855c1db03f63af4dc100fcc5253b4a614d5e9823ff3524563d4007f2aec2f727cb0b12973e62976f3f0b081faebd4bd900896b47cdd9c65e2a8a56daa103047e85348ceae61e2390e635db1d48a8701030a9809f1fd30a611a31256486f88198234cf7bb8bd4e547584424cdd8b05d4ec54d51108f1f0b18f17d66f080208153bdc00f62ced4240633e3a980b83015760250401e4a0540f931d708d3746e618616f811b005a711ee5e4bc5a35e0077b85f0c480573f23c1e634812769430c1fe8c547408d3dcfc12c30b61fa50b759aa89f02d2425b8d36e0f210d0ee33ec4f7941affb00f8149456e34a29cb08869a05b4b1b4d69090245b5ca68d65d4dbd25fc51d2b14d99d244c44168cf8ccd5c24c2f44e9f7ba84d89d0718d00d242e18636c6f91414171217a87e0f2cc7bf021b760955414189e3481033cdd41b080f140a1c47a9001083028613b73a4472fdec8b327d0ab497a05e175dfd299cf10f955a419de30ae482a7801a0e0588e1bc001b69ba90b8a813837ea64412a64420dee7711387c10a387323ef0569cb84b1bc38c53e04ed12b672c8be9a810a42d1bd3bd1cc1031ec1f1d441fbbed4086558e30114809b46b32f33902c9d893dd8df4c8847e4b103a87fa211322a19b883384aa0c9454017398ab9b59a50196840309a696261303c244c49c3c738b30f93d51387d21cb8b02828949368183413fb39e40d83327d114448dd89eee9a7afe30443acb19778e10044290514cc74c05f5cf351ba2e4a8d63be119098fc291bfc2ca29d267d43781fd0952efc4913f559e0262e7612ca2a4a333c46d32e228cb85ed7aa185f0536e6535118a03226f677463268573d12b400a8750c07a85f78f38f9f46109e49c225fc175ace1d6b2832485e7399edc15ca405d0172e8555078e23bdfa69c0a1d069582c2039c40004487e0490c828808421ac610085d8212e2341fe6c4d8e2b43a165071162e088e06962142b311255353b120b427ef203d256f0998a1a0f166ca0ae1d45a55da9e20fe5a5ca97b554c9dd20419a1fc54042c6daa5d0494ce50d0deecbf80929c64e5e274be5017021d34a91301936316d5e6224471d368d6c4849e5a4478dc1319012bdc474129c90a7ca5f5f3ea02545124170cc9f9ccb902a180bc9444842cf68e1821e16b624190167d0594b899dad34108b5c3664cc6b8243a903c3d56116d5aaf9e3c32a622cec9a0c27e57011594166a3b08a890bfd61daa824641c956281d1a81c32be80fefb17a450a3f512646207e219a39440ed5672f57ab6d7e2d54b227b026c117014be4980504e8bda40da1627850383d47e8565e84382b7abd480979fb7485cda3e97735d734ee2636200f8844d1b89802d57ab0ef46b20fba09927a0a2b28c3153750445a1a3d06c125a59fb7b0e4365610d85b273fb1138292f5b94fb86ee75213213d076b054325b7a06874536c54c7839b8760219346e2bb4c89d93adb6044d7cfdfa3385253c4b504249d6974935a51ed53f483fe3acce5bf13dd0952777093f20261b0470b84321004c9a18cfc030661045b2a439c812106662a4a646d92d631f679990824335da0610cc2471577f8240ee8dcd12355375d4393084028aca660e0d4d94c3dc28d7208d0a05affa7996f69a41d04f481cf5c81d2c327b1550153ad0dfcfa99a52d56ffc72d897ee2351009b43b73023ae81f57b481aa77538c9156d7a70291b472e0bc29c1f12cb4414e020047b05b1cdd90807102579c60d16eb4d864fc1a024489b64979743f5a3cbf1dcf9d1cf819d384fb100b55faf24723f32b51f3d23ea67c673259d7e040c3d04d1a80d0eda1f10437ccd3e1e5379abe01802a0fe096e774089bb35a8dc21953619ff336082a9526f359369388ee920fbf7acbbf85e694cb3d84ad7b1049856d7a4c8d9b1df007af4e8283a81464d590ebea639cf035efa029a2c0b4e4039916dc1374a80ec9e2cc3c91ee1dc128aefda8e4169f77eb75513f8584605d0e9023d78a45102640ac9dc7cd75a785c54cbaccbe02c8002ee3edfbf26fe58db8de4faa63ff4d07e76f71397ec445b7e4529bc2829b4ba190a967085d94160443f9f75118f78d4440b986e5a1857e8b017acf16b042e202ae62aa0580c3d688fcbb7689972c1599c67b64014284308cffc7cc0395d00ee6889d904e95bcc6cd029eaec25dd956665abf623cb368482b83ccb8483e9e1b83672b68b0d6234db88f88dc7e79baef3b0bff111b189075f1befdb3ba008fecd0495f3e5e706674ba36c705cffcf945dc8e9027f5bcc4b1394e1b40c4d2ee0cade63774d48644d774ac75e49205d11677fbd87295f5051d529f1cb99d2c21c77d2ab0cb20502919e8d1c58a7a846eb6c31eeeb39e5652ea69183d3ac27b0dc48b6b4ed24bf9c3e51d700898d0948957e39ef8417e98716fc22768824350782632bd031f85407c20ac15df5e340ce43d121d8790e9650318dab38921f0d2b64d48e316a3df63cddc7e48ba9b1a81191da597b13c8e9f0cefbec84632a72ce5d2188c3a892b57112613c6e7aa02bc7f8d3b19b854b32fcebf823051045331e6ff7c8f29754fdb6d044d573c668d863e39b840ecd5ba1c6b53bb57c09338593747280893cd2f52b36db46b9003c2d973d98517d842420462a36bd253410dacb57b07e595fbdb7340d4e7007307608f14fc01c850f45436cd507f23d972b8d58442a595554f211d3b44627f5586cc88a13b2e8b5abbbd8357f0da6d835d038a6f49c634edb2561fded2fa17b0234ec81cd4b6cb8a2a30c32be660f2e68293dca631ab943e8931fbe047f83551caaf83b776bb08714598b601dffc51931a8e2ef881ca32c7af54cccc64f4e05ddbda8d76d074caaefc50d96cceca54ae29169fc9cab753f82c94fa01832cde0d8f02356c5f76f385838cf806a99ea698f814361392293f59e4f7819e6167f71600093b2f7d2d6de04875a4136dda8e5cce2df8636029ff550370755a54e230f708d51603abf49bae940aad68b7f55313e191685e42af77cae01081b838cf498a523d2c7e24c633ecaa1801270456dba946a0e0b2f08ab9b19751ac41c623f752cc160d0d57ea91901b4b8560bb5501e8ee7e50640cd21895a1e6a9cc84164ae82ab63c08add142033b33db8bf60a75d2487f69f632a3885285b38ee394cf70b25078e03e2cc0889103dc2a8bac4545a2985900a518d71428e3912e150d1c590062bab303cd29fb67d4292d1c77e1c4eed47849525dfa00db388d6be4484b748414898b8d41083a3629602533cf917a9f61d9ba6b66ef8bec5f7ee0d472186b571dda669a2d2980dd43827a9148aab8dce7e1703e985e87b9d3e2c58e35f0d0530c4ab8518c33b65b98a428565352570aee6f726754e8b359231fc4ed598d3d50e398d35cfeca2332cbca14179c9aa3988f66b776b40e700e572a8759a7cae03abe46029d587a7119f0214f399b37356583b4a687b86d4d8a863740ee61bdd3b5090b656fa1601eaeeae8f9c4899b14974ff78c831975bdf775e226ad3f524a4671e6afbe256abd512f7b3814ab4e108541694585cf49354d8d3b7d443e0cfb767671445d82f97b2b422a18bd8dc8cd7be80ca39d56074ed39d4fd4e30387a87d6bd881487949062cb082d33519978c9220440c35d678b42a728593b11d98cb4968278dc9ac6edccbb5d66a9b6c26553d798c04a026d4a5faaf889ec70a08dde5dd65040c49896914324f59bf1e3ef5dce6722bbec0232e82796d7742665e18fd905180388b38e280d7ae4ce0186d6e191ad08742c1258b22bee7fe8f1069aa3fc8dc1de12ba5ce9c112827d56c8ab6312af27207b67a0f3ff1e9ae60f89ec0d2c278bb77d84a75301564b6403a9628ef8808562db483f8584475aae92ed8414aa31ebcdd72a8e37a04a309890dc0b9c8d046637d1ac6d723556261e6c84830616ae4d221141d988d8b05162313e14e3e89ca0a8b67317789fe5210e6990a57fcde408506c7d85090dc725eaa5d4c0d36507f90554e99842d0586cfd2913bec164d19326a35e4e94678d7ea229fa5e9776109f97254f34a0bdf414fc34a9802f6974ad96f12c63df8cc6e6f1e22b3049e2312fc56504217c7a4addc543072a2dcc1b6791228aba2609c48691dd122fe695683a512766992aafb292f99d29a7c3cff864153a9dff6bb4584e256713c8337aef7457acfb8733d589c7903de7a2fb5d1f6271303af5c28ed609da283b5b6d5b7c9183876140225f196de5500437981eeac4f0ae7b733fa57e210107f7a21cee129a86be5b6a15f6b56e4a0a40541ba90ce8d73001c5a7ac58d4c56c55e5ef60e662a7a7505ff2b998765e6463d59108df57e2d9c450a77a2a359761f0d10009c50fc0e0c16e72c9774a66c32d32148522b68f6ef82a5ca422b95365200a9b0c904e56dbbcfff2f0291572389d65ed9b27b086648c60c772a7d145007795300591c1bd0f47cb18f6aff899777496eec3dc6222ec1495b17d9b0ccd8342567eaeaf12e3886074a976c4236ff9133ffd890dc6bcbe05b1ebe98ed1a2239154dfb10713dd113e89fa8a1ffaeb1375c5543ed4bfeda537a4b8985122d1294702f5dafbd16e93eb8bb7eac6b58a705d28fc6d02cae8fa82272694ff47dbf27b78f49148aa4be12b7f3529529cc56a86581310d7eba91294e0c5a877debe35902a343a08cdc567b0bb13e5558cc0a2aca473de5766528196c91cb7b576b10dc7333b371797b2be706df37bb4c1f256cca5f9ca9a0b04cb3535498df9e2f3641a9c6c5cccaf376d7ddfb8bc006927c96eac3ba45d492c8f65a9e005619e18bdddd2d32b3730e22a8c4d41a89db898cfa688b16abac6fe2cf2c3c8562b1ce9a7bbbc577e717c11b620768edd75139a3adde6a54181d1524a1b0339fb40845f4d45a9935d614d2a7bbe0b90f27641733c333e6801cbe1729cef9ca9fb00648a1537dc6459ff2447b19cca0996142c909651ab37d79df3e032afd3410106691174e025ff0fb5e534e269a1b4fa5c2944101048362c7b31e4947d07e66ae76093219484e49f4a487f12e85d9c77082ae61f3fe590bb277acdd4705f4cc8c5911a7e824e6738436ac05a53cc0abf1a2346c350ca44ee99fc056f4a541904c85aad217712cc88edc01fe9915069c91fd67fd31183a423499f529844a80662eb12d9207eb45a46d027fa81804a432a08090cf2c02051f88d2ef4e72118a66ef6d81090d236da72817d29cddb5d6746bd4c9fa69f43fdb77f9656eeb11873052a74cf5e9548bb0e51852360b4ac89df52228e12da978962c42abc95541fe80f3cce2ee0e562245d9b0dc7e479c29dd3a5413f422e7afd10125b750240b7f0f42f8fd1b96411fec1d27db81a55143ec23153515651e57b2bc48e853f969bc276fe925725b0fcbd8291206482a8e50882ada5a84e3851da333a8da557966f97ee271027600a09c0cf7f04e5e5a0d6be5bec1f447f8023eac40a8806d048de32fbefbfd61bd8b36b67e1808a2f6e4694d7919c4633c2a6ecf717ab0e803e95d535d9fb01b77ff7758e73f47667d46ed17c466445f818af7c89df65a3b1333e43c9cb9cb6fff892261a2b0625a19b459848d532a234a811afa2608aa8353965f3eaa979da14f00c7df284839640ac958403b22e73b7c9befda25f2fb00dddde780ca46e6d7fb644a47e34fbe0291d129872c69342ecfbc8e439a369570e6e7d16a12313d1cf53ddf44249b748e89408eb134573e25584cbe1c83d84e6210efb56eb074104fab18593cd6d2a5965f41551e68f58028e3e894bf2e1f7d446060ffe05e1b0f9b533eebdcdb990ba017c195600eaf5a8fed6e5b9c7224eeca6bb1709e5384d5888e3062474e250a313620aebae3ea994a573545438c654e02fe2f10e45a882d9e102843f3bccb874af2232c4392064c3d7c04f4247f261e46e02a5d06e1d0718032dc66d9731f64be92048ee8036cef2fccc791e74ba5f5f7d947639dac1542ca285a132bfea42703d1443484a29ffc95588b2d5a9d69e06b41c18da14f30a41a3d54b62e721af55d66b8165642118e8a6f3940cfb824d704d780169ef180f09e4e41f2f4ce047e3e43dc5c0ca188a19dd15d8df3cb961257c7cf1ffd0e2e02f1dc900e6be2bb7aa00df383466f6e88aabbe754fe36c6fba0c1d8269638c8ef9d35b3420a4f1c21dea9ead37bd4cabb7047514daa79a8236bcb6a72b5f5eb53f7f3bfbbae2802d9ce42b400218977e5a131143647a98df92d55e2f1e525d2e3f69032e8a8ea5b6b5f10d828cdd714b71cde5dc9d28e057601c6d28e25b8b419dddb0a700f4b0084124e8ddeb5c817d870af94463e3ab1812eba0e9cec28338cb3a9c96656584dba68acfba5491634805a4115d8de0e78209dd030763e79f2e53eb62e015569d4f8ab502481bd1af76710063a393f304efca882523b5aa34320dca0089b4311a71b7f41c6329ab96b43260007c4e039409b98ac0a0cfaa231c40437e8e1eec202bd04a637c980e447e5cbde0aa0560da52bfff0e40e35a7e63267648eb51b46c51ce03e42190b8a7760fd40a9fa87acb89f96c346b3c01897871adee1be6c551213611c97536cd080cbd0290b2449eb0a928488af55671f476217e324ed15e0052c605dcdc2bcd8cbb5606d85e9123cf683a806c26675e8b7dbeceb6b9cf3f6e5d65467ffaacdc5c41cfb26e7194ddc895ab02c444da282de3fcc2111b0980649a141e1592f12004f43df29baaae0da25bdd80d127dc451d4b20fa829095b12980736c2abc356dd5188b514dbe7e6c0bdde52b220eeda023702cc8887d181a5543f2766358aef5f12845ba7cd644ef6c5410c111efbadfd0593fa4c6ec8116600aca7dae239a6518c64695cbc85e9333ceb65943aa10d4fa7d13a2594d19c5e7557ef68198b16774534e4fe4bf9411ba69db71c45d7139a4459dafce10a9a70acb72d97920e6fec00d8307afd91aa372ad53031bc157298505675d39ad33d4bfb6091cf97577b758db261bab3c24c01fc267117afe92c291dd36fb9318cd7b4627578866e446731885bba1714ac3c634f5c4c33d18dc33dbd9d0289767d514c9cc13b06ba59bd5c71bfc3ff825edb519e1c7250749298d876dca8b4811872ae595c32516147259a4e41767a3ab56f456027a523810e1fe2b23027d60efaef1bc2834a11e8b67dc380078506f0fb2559c017f92d05ff3af6b1cdcc6e71b2babf92a9706ebc6c533783aeba39e5067ec9a63b0e977e844749e4ac2042289ba65148ef3676c209735e61f43f98a334d655c45fc0bab60a1d306ce30210dfd530c67bac1684ce4533ea78e009411e5d59889a0dd0b0f000c5c3743ae84a6931ee0c9f3e70420a3fb92247b289815fc72e80b61b85441df801fae105ac0351dfeea1b354a0b0ae11eb8ce0e984fceeca565ea49b1182662436518d470bad36c58c8d4dcccc8983c71b004aa4ca2c60d79a3900ebc0e4e045fe297ae351068c1c6928a86005cbf7fbbacd6c13c28cf83e0fd92470770ab97a8e969bee41213f3ef58ec1af940bb89c747d160d630877ab4eaba281f763767ad41e7984d2c0cd70262f207f38d06a59d94efa14adbbb064acb0a0ef31215c2b48784cc8b14ff56a189353f8b531675399b0fac2bf20cd0116ab39a622c50bfe523d2b7ed9235786859a64b61eccc6ae64b29d3f417482898bf20dd3034a5830fe5b1890d0d3e3e36408aeaf07e3ea8b4d9e3b457f0c8cb02baaf427e052184e56800b0925fd353e85f580214b3c34f7245ab02ad0254d3c5d4419601585059b63ee4ad415a5a67bcd4fa9e359a50cd8684d9a88f7cc8f4e8fb47808cb844c795c30adf47c92e9b673783fece29d786d9463cdeed576540455bbb0273f9d5187d874a967e29f806dc4eafaadb0083f7c953b25fb604111ce09c52ec0b3086c41d2f7869fac45a11c64ab85b793cc6d40ebc2bb1560b1811bd391452b71007b302f51fb91927dce579d5d2b2be9d5a8d48867b2a97383ff1f5497560b69a4c412c4e82a4f41d1c889bb4071253a6e7af7299ad802eae73e13e7c0f07092cc1b5a02e25d87c08be4cde913d29b915e23a2b8b392320fbb3f037a6c1f5ad8f4221e19a558828232d12b64da44a2e9144a04ac101a6b56bc0fbe45ce03019d67ac06b1313042abc41c505c19213ade6399036079f75935443e6679cf48aa014c37bc58e3c20d3124efbbb07e278ff1dda74e394755577d2692acc9cbbc546094a29f2d975576cd5e9878cf66f18b3893e1d0d4e308370155c176849f61648c38cdb138fe85088793350a461ec4159414329b90a730ed2937ffd665135f7a88a293f25435f2f16a2190d2a2b05b5e4f8ae44a0025be18d4c694058fda9c1e9dca458819bc83616bf7fa43f84ab6133a56cfdca3e0016efe09533ed71ec263cfcc639a1340a24f40c2a024148f55eac9b67a6716d0307ee8fbd677f8cba43ca0d6e27d38456f148241bff58eff0d800a56afc128ac5366c8fbc12809413ac43e5953549657a1e8b7d104e692f64c2b63230e55ff21bc2f59294d137792911383710d113bd6a33b211a8fd26485a85a1d49d34442f57ea9228afe1dc6ff1aae3e64f1c791039549ceee4817fce47550dab99924b170145ff92be7539c83fa382f68a4ae08c0143f6f2d1aaf35d989a99b58b83d439c78ae8a486e2d85c3b0af38aca55fc5742a67ecc1d3138e7cf8c7b3507e4b4d91dfce24d21d40e7f52555e889d88659e4b39019eeaf770d19b6a0f690f19da7143f45360269008c05b73c83c1fa8fcf4ef17814e02f31d919a59a0f6d781e9d195bd8f6d41ca3848143989c39b4b512a67cbf1cffbed0c068837a8797f3b86dc00c95c2c8f75df490d1ad7e280685b9e05231445a2e06f2858a51a591644ca1206795de0f341b9ae470ff0be1376434a6d4a6243baedc649a848d86cef6c434471df7c044e3b16318e6bfa757fe5238231e92fe76c2f2fb0596cc477a93e1c948d81c59cb36b4e938aed67c8d0838d030151fe47aa142f1ed1f9036a71346bb5c81865fa5285d4fc02078f8c9aa55ab1cbf55222357e99e207edd4e3cfc948387f834108ce6c994b4bcf60e3fa4ded128651b9029a23c02cd7cadefecade2ab7634611ed54dad3fe37a1c73e505b58cf22a5081939e2bf89dce51095538cb868a83b5261388b4f2c25f561ead4b830489d0974e652b6fab41b1d9626bae23a8b54a9fa75f6765a3668eb2064c987a3f8622f4321b9c32e9b2ba3a779c53e1288cccbd8387f7e99bf35ddd18de7e3bc39a08ada7535c9bcb398acc2afd4772acd768ed65af86362bfc22920f4d1a0b6554587794a4b8c0db639c20ba825f2b64ee3f295cc01a260a3cc7c0b33027c57af104cc28a3347cbd9d88f64f8652eb58cbe313bb47691b36f44b89d949a7dfba146d588866f996ea16839b42fe36540682d296f11860b3fdbfc65968eaa0050f1de2e3643101367ebc81d041981734d8107b4d21fa079e5eab3ff75779fbe79a72ff683a836d67e71178b0e950328e0461190f01d630fdb910a94242b7136e5cac4153a20595dd81dd81536a1c5a3d057ec28c6fea56b1735fe4da6c21afcf6c03dade23d876bacec84cfba59c93d0c1919e265d2fdca42cb859732b2d6ecad94905b122874aef15fcadd7f2533ac9977e8533595c420201255cb48f12401df32fc23eed272091fdc238e13f11e63ef40cb6eafd274ac0e4fafb58334b11a513384f55f319a4da2b72f2357ef4231d32672ca7db26a1779f41058e7b560f395cd3b08e03af44e52420a5bd7e50bb42465b2ca61fba2be8fc41ea9f850615b8334039ba0d9943111b9c8ffc8b0757487ddeba82621fd822e744814b1d284af522d07bc4ecc1b6fc2a81f5b6186faee6b7b26614efa8d50d9abf4b0826870a6c0a0dccd04250ebe4894d0885dd016a14e3813640b224c301ffffffffffffff7ffa34a135f25b6bfd97342b9394c9eb1042c80351899a524a29c9b411deb60b38ed33dae7731e736503f007fd07f0073976e09898250cd6e45f3595942827469283cb2a61fe4b2ed2b47d96cc8f950f4a185427cd30f1499330eea9bf96bb25616ed23b7964d99349dff148183d4d58ca5b964ab18584f1ab3e6985a7cfa3d44718b4fce80e5b31cd74e808f3c81d2765115ad2524a234c4af4ca7f35298c30cd68e905cf13aad76411e67c5f9d1292c621434704629820026de34b383031117c28c24c7eb2dc7ab5854a279e088393443e29ba8fe7d78d0893268ede878ae95fba3c8439da6527c5f925bb101ac254426c096542ff2d90c247218c9f4cdcc7b4788d46c107218cff7b42dc3e5f5ac9fe63100665aa4db75269b9e42447181f823093427f6c2793321b25af0331f01108f305e9e4adf8031046d9ccbf12f19e432c33148b041f7f309ced28277b503a3f97810f3f98f72f8c85061f7d303a29933c57b056f1bd3c3c0a1fcca322162c3da5f7f0f76078d28926adc6fda187908f3c98f32fa9924fef1727938f5aef64ddeb2875d8f81a607c0b70803c3cd0a392de01868747dbf8929651253a7084e1e30ee67c275b7a8e5ef1a5cc31020f0f1d253770d420d1c2871d8cb5277e4159ba0ee67ea2f93d39cfe9d3930ee6f89979512a3707e3c5bf28b38f4d12138d1b386a74498c02830f3998635fefd88b6e1d8b1e1b3b401007a39b4a169fa0a3e8e71e0ee6cfd1267f3a99e49ee26f30c5b59ed72cb55297fb70835d99f064c287bc39b19b14ff7a545cd30cad4929d181e3a30da67a0be99ee7375f84d86052f5d6afc13cbab23399d8aa1acc49e876f4b84eb6cbb934983d47d869db4ccb958206933221fcd52c65f45f1f6730f80571177ba26433d4147c98c160954e567573721c4dce97c1b44df8caf972109b63213298ddb5b27fd410baf79d8483c918cc61a7de3194924f1ee4430c66a27a4e719486b0977747180cca42ff4ec55e8f4d4bda06c602ab52313ec06054ad9d13174f85b2ff0be62a21b7a255929594dc0b469395b23349ba8678b25d30777062856cb298ee8b5c30a7a5b2ecf2799e4c740ba6584aa830fbea430b8653a70976c1c7496eda2c18ce53ce973269fbc082d12d09afb0fdceeb64031f57e0c94d26132dc54aaf604a849ba913e3f549193eac60d2e4fbb48e9fffebe68f2a98ce4f890b0d9f0ac6ce57d9779c6c6117e2008de0630ae6ecd044277dd89c8c15811821c8418344c70e9cf1210533b9744e27e7f87978b48e46f6110573caaa8a159bb06aaaeb07148c5a27579553934e6fabfc7882297f4851719db0b93f7282b1fe936882ee4d3067929893448acc04f3a528d3a53655cdcd8f259882d0ed41acc9d54be58712cce139bdc8137e1b2460d83059818f2498e3b467f2769e90904853e61fc1a4b3274b2ada82b21c8d600a22cfde4b3db4ae2b82f13a077b920aff213b2382d94d5367ffb35b5296cee06308a6a0b29e941d132d27b711c687100c722c7c3a416882e8cf098271646ae51c9df3eb1608a62725eb18c2cc1f183e3c65898fbdcdd43e7c6054ef131572dac337a95e98edd265529e52b1ef9ac4e0854e122d9692aa27382c89b18bcaabdd82663a51ced2d53aa6cfc72b8b67fe6e0d62e8c2d41d1bd2ab64a5d928170653a1f9243d2d9e931c17a6601746e7954f1556be852956968593ce49a7494a5b98b329e5977d2ba5fd945a1874a7e81d7ef6094f9a16e69c4a3bc94961c5988559465a13439309ca529a922c4cf23d747c79e795a5c4c29cf284a66558b0303929ac56b87ad4515f61d8d27092324bc9e10aa3cac7f5ad145779f956983ee4f43f4169e2936fc40ac3a754dd72175f85513d7aeace255561ac389fa272e852617691a24dc7d250610a51ba263244f9a9e8290ce395495f42d5988eab29cc49779ccb3ab914e6b097b3e777fac7635298fb64bf7638f95198c3cb5a26c8b34e37b6288cdb3d4aa87c5ed77b098551fffa3241f5579cac4061aa72e257bc6fddd7ed136692e67f78edbc12be27cc3984260951f5e9c42427558f8e5c9013a6d839c59c8c534d765236516d5e3269c2b4a63f0895e307f95f264ce12c2d634bac56121366529eda269c6e5dd0b984e1469acfa994b584399db23c263c5dc6ab84d15fffe456987b113e250cca9de09e2bd23de74cc2202fc9dbdd4bd1bcaa8d430c4998ab35bdb37365b3120993f6d5760aae215a48984a998fb0a0ba7ea1f208d33de1dc54bc5787e51c61d2509d63c51a617673ad32df50e1c933234c5ba6e67413bd43a89563116627cceff75beed1a6e71b6228c2e8245941c8d22c11a6278c3f296d68275d767220c29cd642d3629d7cc70f61fc4c4ee641dfd907991ba227939ba0bb2146210ce7c426eaa526b667524908f33751c4bee5493aab671026cbd957b71db21c6208c2f4dd39fad91408935dec3365593ccd27e52106204cb5174d54bef6076393af3fcfa9ae4a262f691d326c1431fc60ca7227950c7542cbbf1c36488a2662f4c1e864f213efdfe4d786187c301347769e0acf244d56cf1e4ce617ab2b88a6b68f33b44a5c0f267922439cff563fd1646b889107b37fa8b05349c66788810733b9b2ea771364094bcf1dcce4317731dd29fc4f66886107833e99a4b4882e5d4e6c92861875306efda8345fe252430c3a187493723e39e756c937e98d18733085712ff79e73521f430e8d5f104d4edb61f6371ec488c3e7d7e4ac71bdee2def20061c0aaaf19ea6ae29f7be63a71cc4788371ff9da4fd6458f253224133aa5e10c30da64b5d499eb4e6478c36986bcfc9cb28c60693bacba4cc75cba40bf78d636307088e060b62acc16c9915d6d6538b1c251a396c740c35989af0f1b5279a287fe93418f5743671f19eea25666704d34953b9dd30af2c7a110ce263fe6e857e709313c1f024a593ee9c6af599fc10cc163461dbec444da542308ff4f8826090e5c4135294f67b2605046385fc5d6b27a9f041e907e654f9ed397b93101f98b45dd2a71e1fe572d40b7326fb5589ec6a52fac50b73b0d2a374126b17c67d824a4d1ed3a75312d285f973a5eef3cb240bca85e1e47eef52789727888307c185a976d6defedfb546790b9395d88da56d491142105bf461c3a2c6c70f482d0c62f103420b734aeb848b1aba924e3190591c94ed8599034416c626ff5a760cdbef0e6b2ccc7e16efc9233ae9a8720b6c80c0c26449a91c26df9a589dbdc2a42af5b409d9e4d24e7c869682b8c2a4fdcd3a3fe93497439f020f0f6d85b9f4b9ecec788bc8158415a6daf69b4b3a3b9920016415e6d8a59e684fd6f40a621a376ea840478e0d80a8c2a0d2badffdf44959eb5d01482a4cbe9f9e4c36f984bb2768415061ded2a4ca377f829cc27c227734b1b45a4ae2648aadf72b8f1069e1498d088080051198cc002985599f2c76b1c6c25b6e02420ae36f3859e4e41e85e962dce2c9a4abe0e4a0280c6a9bacf5e4bb84c2a84e1c195dbb1f942636430bc70d192537781b1e1e3c0410501846cc7e4e6521ff1b7b78207fc2dc643f158f1d8f279d38ee880088274c25c4fea710af53d1f7f02001e9c4272a37c2f15f021c374a3ee0e1a1230c07010b223051104e58b13ca77db21f860e1c358c874701d984c1da4767cb24d50c2dbc0088260c4a6bdbb47c0e62d6b5004826cc66f304995d39af0a08260cf2429bca4ece7965f497307c924dada4479630df6582e8d0619e83852a618aebbb998fa5a64e4d0983a786b7febb1345d59330a8f8ecca9d2309537abc2fedd93ca71147c2dc1e6fad73362f1e8584296e8926a9c71357531f614abac9a2ab9d3ac29445aa77cc51f755c946982fe4e2c77f927b52414698eec5c63a8a6e1106952fe81e6da1e9a75284d9e48b4a8f66224cd799d664729576f2208830ab9690f31ad3e4d49970090e1c3cc821cac310ee8e9027c693c92415c294a3e2c513abbf840a2284f962c9b020db33394c833067dd2c131d178449a9b439fd5cb14b3d81a8b28687656b6b93da2d3c3649d5439303020853ca97e1a92d6f932dfe07e39f4e5f1f762e57a709c40f06916ee9828edd07637bdd3551d5e7d3a7207c305a780abde7953d1856f53cda27e9c11ccbd45bf2501ecce46c4dfcbe54513e8e07538a7ca2853ea57348ef60ceba3ea376513ba47d46a57ff6b30ec651e7c43eb399ed9ca48349a7b727d149ee8e8573309fd41c3fcb5962343939184eadbbd3a655d5938a8379a4c685cf1dda46650207532525d79aa103f206738a93b5e4b4d9e5f080b8c14c30ddce7a1f7384655904a40d46d7d0b9beb5e2746e206c305dee797e07f5416d63878c1bdc2801c30a640de670e298699c1a0f440d6652b2d06995d60cad054983b145c87a94dd7c3747190b40d06050314b7a52bdd5a49765e8f81c7c06a3573699eb9719cc9f9df4f29f2f85d2ac0ce6ac5d2d42d52d6430dd298be1a44c0a640cbb134bd74a868e8d1d690222069377888925b5d42031903078af63eb991cc62a0a020653b75baad1dbd6a472240d4eebc8812a00f98249ef6f96fcca965e421b3b40809e0689870718205e30c9d0e426294dd66cad2c8e3ec1a31b1e501c5d633500d20573d22675cc2f2596f9ff8edf41a36d00c20583da8792a23b09a900b28504d18229ed56747a502a77873702902c18943931a47d3a2d730f160c42eacdd78b9630a15fc1204e8d52f7575bc12094bddb557b161173150c9af3c4dc6e725430585acc986765b3b0a66026fb6982b6f448c198ae63714393e2e7730212056345d7ae5239f788930908144c9aec8453d70bc8138c17aafd53d2f63b764f0e88130c5a26d29f9c63a709f197a009c6d972cbd3a74295d85e238c16848030c12446dcb8934d678909812cc1e42f6ef7e4787d273e102518cc4a75b839f33c228224c1e075a1d9bf96dc90a1e3c128751e004182e93d64788abd6ee7e11a39486ac83882418fd2237253540cc40836a9b46856865b65408a60b8f3daab4c6a7fb53c11cc494598fe709d2198ee4923dab34ad54d2118bfb3c3ed5e360866827ccdce410504c3e628391a1ea37226fa0383f44cf8ed9f1df57081f8c074dbe9dec43aa1c0053274f0d10b636cefe9fa25cf91f3c2f0c4ed8fb5ce7d36271b25af034b74e0f8d885c9458ac8588cb85dec4317e654179a19c2c711868e5c98f4652d4f2afaba8b7e86a60a3e7061f2b83619376e996c3921f0f0d0b2c2c72d4c7aeb532eed6d6126bd79fa9c47b530c9316d13f16499770f2d0cd764b3d1667d7e41b330d9d8a5265cce75d26a599893c5aad1f85c2c8c9e1f7294586161f49c3e7fd05e61509f838ab993c3a8982350c3872b8c77b1f494ecf4339f451c3bd07f000dc70ef4084bf0d10a83ad8a13ee73c40a83265f8c4a8bcf49e56bf2b10a83e78efa87c71faa307a48ef981db4497da4c2d8aa21dd7a0e7ca0c24c6ef7b8d697b68ede514306968f5318540e63af152ba63007f9f04f12e59051eca314a63bf124ad9d7639763929a43089d2d36d7175b59ad40cadfa188561feaab65be4661fa230acbbcba894217c5426a13079320b77efe9fb0085c9e2c9b373d77f7cc2fcaa9bee1e3cae92b7616304ef09d3e6e5d19379720925cfd042a897c6ef00c1617d74c26ce294b251ff99e08313a79c77150b3e3661fea4266fa24cfe5b651f9a30cfd6a69ee8642a238e1a3b68fc8e64343e32610c4bf2ce3349e7bca5820993f0949aa2779d60c9cec1dbb81b1f97303769abad3d8a74d2c74b5cc68cfd574e6a3c98b3cdcf88cfa9b9e5b983c954de10aa74697ce77630e93e49494f6983d13a8a0422753069f687fca09efb21a283e9897df37db949ad962c7330ab7cb6243f32ed3f9c72308ff9a730f349170753f6add2e4a0ab2fb3fc1c56703096dc557f2713576523f206d37c689dabbd28e286422cc9b8e75fa40d66a2bbc8afd68a0d0675a9db1b525e83416c9d3c49094f5795974488a8c1b8374ae92c31a72e935384481a4ca59bd8263e56d3bd8406833c29cc4942fb322b7b06834ea9c309e2213398a3bcdd24988b102983d9499e83125533a3c3981e1e8c10218329e685a9269354434b37920d226330d5fa5c133c9b4a58f02568101183c12c8552d154670d4d4cc60d1d32ca4044c2604e6a9f7a7410a6f35b748440040c77f01cd474ab61d010f9822594477372525e5b8978c14c6e53fa592ab63bc55d303ef93cff89b295f425225c308d7fa66578ab9e225b30eb6593a3c92928952d2f02112da4c694f4363d18225930c9b3f3e464b3b7dcde0c2d76810816cc992c5bb9b3a71e9457c042dc2b68134ed3924effc40e6e298e03075f03112b18ada4bec85c9c3e99f0a46a05225530e71125f737945ca96fa31f471831f80422543097b692729a9c9ca1952122533057e567d9273d29139182d99314274527890b3ac777e4909183c4ec718411635231108982b1669d78fda4344fda9645a06054311daaac45cd5e7a6603912718b47a4d7ece5a4c9d818813b4eb64a13b2803a1c67a1dada3051eb8928148134ceb5677ea3c452d8b9860cc6bddcede97603e7da57ea7b3124c41781e9b1162e5c43709261564797aa51ee5e92221f5ea4d70ffff08262da3c995a6f2a4c58d6038bd9b714a4487b754a40866d3fd673ace4304639db470a2323d77dc43306978c976f8931f5b158251d48868a2a717cb490d82d1f275888e2d104c39754eb272c2c64e3f30a94cd2ef3eb788f8c0749a4cd47de2a6da1364bdd894dd67bc30a918e2099f9da4ecff5d18ae820c6922d685c9e4133febad492e8a15b4cb49299b5536374b2542362dd8675d500ac1854144fc93f2a6760bc35d9021dfd90ab185a972ad9afdb5c81cbd16a6164fe1c9ad4f6861fefc1af9d1ad2e932e2d2984ccc2acffa549a2d53d7f9e4a646190a39e09e2723362613c5195b7af950d6061aaa0a6beab5a1b4de315e6ce9b1521cf5cc6b3ef0a73c86b93491d74425a610a0bcfa77295924e9e4358610eb5b467972b8bd8d32a4cf9940edf164b1506add0991c3abe62fa940a93a5080ff3fa0415066d5ad5c132f944a82760d82041fd3426760a3329e9beb0dd49a6602cc558f0b21406534efcf8c4d1fdea9d355298cf4c97127d9e4e2b360ab38e9e4e2a3a9ba34433b44ac911234414061d4c3f9e2a8fd3d29384a23c484061b64cfcd427ccf2d9ff467f46831c5782104f98d73b67a56c36338341e232b23a511e3b423861babb70a3e499df9c3b5010b20983273fcba7a255dab866688926cca42795ccfbcb65c2ef195aa53e4232610a4adbd56552a55a10820953268fe954f1b493c9a5d391a38424a95dc298963ddb2747674b7a53418825fccc7d929a1475a98449737b4d98e84fab9e12a6a0a79aec415c26934627641255e5b5dcaece089184e9635dac736c9343cb21910881048e904714ac64d53c768e48b52a7c9441c082084c6a0c218d40e40963c943d4c21b8430e2547a7a4a3f8e1661d0049fb7b0344a5dabe34388224cb1b477322df1ca75fb21241106a1a35a7e8acad9f9094184c9ce5fdf4a8e420e610ae65afe1ae214628884a7ca6af9e9420a610e69b12bcb95bc2446a5648410c22064986c5265d86e3b091984f9e48a4e79eb2308f3a85ce72935614f350f0984399ef6f9967c324908350410a6278dd68b172a64ff19f207936a7229d395e3ac4927217e289aa76c09e98399244649ef772f870e92103e98d3e9dabc89ef3bf10cd98329a91e214c78bbc77b3c3c42f460b20aadb69ce241b7290fe6273fd9ef2b45557830c8d123f66694d8adf30ec6bdfdb0735247ce9cec60eeff36b91e3d4b74ae0e2627d88c3da993f264692b74302721bf532a4bf99994399853d4f5706a9d98a344fa613a0991834943c9cba4a0d2839038144bf96a9d9389d5e443e090897a8913adad9a4c7815599b1bf5b043de600abfabcf6462763e294e83738346073c3c3c3cdc604ead22e4ff7eb8073fa40d66ed1136571d4ecfea216c30e7d80a95897aa6c4440c598341f698a79927e5a4846a84a8c1957d9f374b3ec70762012142d2600cdb7472ce41ba25b55486a0c1f033a245763a41fea83c3c72849cc1e864723839f89384c793ddfa1a5d02021a37acca0931034fbcb98f4f587f86868494e1784929d91d0a2183ca20640c9d922eaa9cd497c37a319854d4fe7a0eb92c310a83f93b6927ad9ad244d91c0c46370bca7cb352e669bf903759649b2cc23a5eb0642e4527d5a814f477d8893d83902e98730e15dcbd54d87a950b26e57fda54c772cb6a6ec174f2a7db9ff469c128a3ed4be4933b55c9b26078396d728aa3bb52a72158303a999c646e3ffc68db67683d0d121c356e9c0cb98271bef275ce79d2e5396e608558c1a4f45d7253136af1d32155308710cf349dba4593be12428520844cc13866e9ab3c93acf70e91c26e95dd2d13bde472a5b206215130a8b027a726c9d11bc20405739e7975cb333ec16c96a2dde673955525c40946279fdbfc8dcf69f216d2048313fdcbea5326a7723d9960b61fd59567434b30878fc65e3d41436dad04c3a8edb26de2eb133c179204638acc77b75af4ee0c0946d73c274527e98e603c27cc686aca68bd01132845812a0a149b1804f864293fab0420f080a323c78e120200200ca7007a05002047c99f1de846090e04642007098e564000bef00500bef8e28b007c0100057cf1c517097874c30605f6d10d1b0c58407e9123877b0c2000ada391070100d03a1add28f130c017027000024a5e868c057c0180061820a11b351201464a81801152988490f91ff4d5da3dd119ba563bac6a7c890c1b902019e8734042a3b974d82029a33098af25f53a950d1251241c748d4480915018540e9af5261eb2dd241d0e1a14a6cf162bdd767c865a3e619cad78f2fdcf2a5a269e30ba095b4b272e7aca271c742770d035d2004638811a252d279d4f6e86166ec2aca1c64b64132c13e41bd1442670d4389838c0c825920d921a8900239630cd9bd2a4cec1d29ce499a16583a446ba4ae8f81c9430e58faab74e26fa67f208dd403726611a4df65dd166abe51e124918f43a3e49558a87e52092489854d2f8ec71a4070933d1aac9379e620b32f208a30915d5a498d7763b99a165e311c90d64dc28f91c4c44e008638a92abbefa1f94c88d30882d7d32c13f8898a530c2a48267cbd3f9215984d92e93634b3c0729f22bc2284faca4a9602411a64cb2fcdd5e174f71977183c6a41061f4a042a8caa3c28a10676891cc3884398dfa5229cd42ce89867d60071ac2d41eb4c8568e92bc60a410664b425818d7905e4f0e0921cc4dd8ceafa5332ac9c0b041622e181984b954e99eac934593443348c0b841a36a041e1e3a6c9078785cee1819110402460261123b9a9eb37b76d490216369eca8512e30020853503b2154ab49c98c1c34fe6036b9365a65331a3372b40c198c3a6c90143f18455cf2fd269c3ef74e1f4c41bdd6ff99c90793dce668a9783905698eeca100237a307fe9f0bc2fe3a9f135b2c6d72838920774a3461ac0081e1030720773db79bc1c251c748d841b18b183739f732c53ba43376ad4c15ce969cac73359ad3399a1554874d88004ed9021836d4082769c0e1b242503237430098ff3149a183ac4e86668a11b35d2d570121a374347d7b81c36487494d41cde06376ad4f81a061891830d921a6900237170d43649b457d96c83113818f4ea625466da36e91a7f829137183e4ef7895935216438e206731cabe87ae9c996f536184b545bf2f01cb74b618329965fa7bbe0e14d6e32b206f38dae8fb4f4642765bc8211351ce3adf172619e944d83498ace7e2eea1e4183f1ee5326c5ec949133981976a40ce51183113218bce52c6793f289b87c640ce8d0e3229fd4253118f7f53df6e73e0cc696afeff8a9835efe80c1a4355ec109f317cc29c57ac2e587c74dbd60723231dd2b75ceb145ee85912e98f742c713b1917ea9e582419ed2955e196ec19c4fc8ce7527abf7b560d80bd2b342280be6399977ea4713f5f5c382e949d2ae2c6c648a7a57301376bbc4097fb1824954eb3bb1c5c9a3d62a18f7b4f63b399cd73da9112a98b44254905bd92ecb3a3285bdab32a99ce0c4ca66b315f3c9f132e1b45446a460bc7c167e844e14cca1cf6edecad2f775281866b4826523187982a977b54e992537261546890e1b660b47d72838bac68d38c11c4b295596ea6b4bcc4d305ef026675cceed24d5986018d9613ef4258b638e2cc19ce6e7254e332f9b4909067992e94ab9e7932a79128c659f4f3d8e96b45123c1244327ed1e3b93438716e373a49482193a4842ac0b234730b6fe887b8225a52c094b0a2346305ee7b1ef687af17cb5b2e38c14c16841bbd3b509d6e1151154d919a5452d139089134686604a67224d295d91f52a1839c0681dc7871121988957b34dd250212f7e8e04c44810cc4d329de4c6c977102340307a9eda5d751959f9532a88911f9853f4543fb969971c8df8c0bce324dd8a39533a36484a0046c7c824d20b83d22769d2558cbdcc92082f4cb2a4857661f414f37d415fb4ecd3e308238642414417a6b2b8a3acb39334e1d2f904915c98ca429d7cb77bd1c964bf440922b830e65afc97270951297d1d256210b985b9af4aed8465824eb54ea220620b93fa9cdbfbc535412dcce5c1c3892f61211f4f4c841606e59df3442d798d11733c185a61a01b1d0081d5a31be77294bcc82c8cb36d692544eb74d095708044071844646192aed5974e26c75167aa1a374a4090a34462617e82369920df09c2c230a3969f53dedbb77a85f9fabc4baed4a56be80a8326986c15a1e7259fd20ae3c53949c9ef977e78c20ad33a39f8ab3013dbd4d3924915a62608f56517ba54184f05ebfaad0b2acca1d23dbd07f5290ce741d46735495d0e2553983d5774d6c9d1eb33e1195a341eb105444a61f63461eeb1094f343549610ed50a4d7a273d0a739890f92cbbf5bb9ca701860d921c55a23098ef8a683b1df29960284c957fc3d7ff4afa45416110f65953bdcbb2fdfb09933e4fa55eb39f7f164f9834e1c2ef2d77891dbf13a6d12feddc173dc5573961164bcbedf92d62e1a32bb209530711a22c899d1910d184d1bcf7e2c856acdf990963c8a72bd1be79fb1c4c18befff209b54d27aa7d0983699c18a589a7537c690973506fb17d7426a8582b6156cf6fd761dd9ed41d2526a53e1591494c0c0bb2152e57a5f0a45c166e84874806114998ce32d9b4570a8a8461cd46a53521523d2c2290c874e377cf8310451e61f0cb12f92907a9d9d90d8838c2ec77aaa72f9fe104954823cca4dcf1dc246933627182d0f3cb96e261f409b84e49974598d355b827134d13114518c3e4ff8456279208731899baa283cea9ef66b4e0901c41041126d1912fa2a487cf27e7100627da0919c2703a9ef9a517c2206493fe74f4480883b4f439228330874e8bd541dd8dfaac88204cb25354a892539db32d120893b68aef977544fe692280309a14d7dbacf8d7a72b1c10f98369d5538e1674f89349253f18f4c927d70793b03315e59eb6f393f860ce5fd154fe51eec1f0417dcaf478e3646f570f06137621339753ba7e8802913c9889237454b701892fa8146e66c3026130168a04027118c4b0f4f200c3120000000c28134762d17838a467ba1c1f140004774e2e4c302c28220a04029148200885c280301818060302a1500042622408d2a575921f0cb07cb6f03f3f3b27a1afc3f4563941e87c201edc1fb8a20bb45b484349d10bca47c02bd14638252abbe83b3103e6a61cb3746ed0fe92ed943df2c83fe6e5e1f337b1c3eb24964a0a72641ddfa0c444ec52c2d314462e6e2005df7094567bf830c43a00f65263e46c0c5e8062c41c6b883e7c9d84283ec8aa227badb7a40630fa47f489c26e8a2961dcc1c4c6049b00b6bcb894569cad2be8714f449a6098c916373bc6e66c628bfc95370aad701ca613803d43a0ce55be1aacd1b5026c3dbc6bd12a9a689da5be71b15098afac20e84af5f560ad1b66e42c3402ef9304906710a319c8beae7f57c0495a1ea1265c1714939c5b8b32329bf0213cbcaf1834d808c082742effc46a491436439764c1a44d92bb85728aa8942f359c12bcfee33c99ce6eba22752642efc8b56fdcb5020841af12147b68e832c97418bf050ebe89536853ad2d4430025187c3a6f4883da28409151f0100fa8608b8da348419744c2aeec8d5cf1ced0b02a01304c1916f40491e2df2382253b7cf943026cfa99667bdd595523f6e12a1d4832232b9ee2ba82786817ffec4f50a0f935880d4cf890330882e33423fdec52ee4b27a550a7883ed1f5af8172d814f19fb16f2e3afb299b88d9a540ff7293d535270c0a19fe2cb2f910700a1d08f79a5ea3136f1734e1772ca8eff8353d64d46204eb96c688c12a8a79399200f1c82384891aa198eabcd5124a87f1ab517fd83d40c33785225973f16806dfa1b7e9810b260ee2050a3f4cef7efe56d987080d561d106f983465901b731138e27cd6e884564249069984819a2bd4639158c30ef4914994d13e5885e2c84d63585b072d86188e109c20ba65033b25e7cc444825561c5e0e68a72cb19a66f9c8b7fac188fec98ab54890c9403d80a7e5a3abff993fdd98283e9388b5b71dcdebcea6478b8e675d248632da408c6d7e14a6a409db9bb361d3239809c8490ecf4485413e70c174e17004b26f2b94f97b511fc07a74fd2b2a5e4a7a437d52872d0c4714e1ca6b66ecd452dd2b8e680d03b19ed60e370aa48141c3653dbead71265c14b77653163c8328659ff262a9f22aa67e6df4f643d717db979c72be2d3256d477d3259dc53118b3802caae92d892f4a11195f82f15c562cfe4f738246cd86165fdd230a0d78e8b36160d94d762cc7ace334381a63bccda31ace879c9104ea538a930b8fb3b43d48b720665e3501939d6b87ac608ae6d30ecae89c762b31687b3a60319c3b002508c31a8c87047a2171147bbc818c02e84b76ba1ce428a5e6eae10e26aeb1c25f0239ebd8c29874c4c5961d61f2006658f8e7fcad9ebcb316f466a09c609f8eaecfd945866245f26ee68bc75c7d305bdd003e0445f5e2b5fc11ec57198a9f0e643cd704ec415b0c16a02d7aa5e68b299b3eb5c076a5a735751329a9c4df71e63cb40cc59ce9b4e2d171c51fd14c6e255d1b240be08cfef9df8198a6449fe73424cd7a4f1ac1e4af1e8761ce7ad23863efa3674fd084d76b47341969dab1e9e4c7d76b5da64c1ecbfa78c7df9a128341c595aba8d0248dda3ae7562c9f0e46c879076026b64ad5c1b038df1942ee122e6fcc352249e60a04cbe5678328d47ab0222f191b2e09b88234f44bba90f249ed769c7738a227596bf51e59b0e5c22c47b606f1541af5d806f2851a454911aa548920a9e28b688e8f46123dddad6420f82ac6189ec517c299cb837f120477818589f208718f698680721c2afceadc351ca568d7757b87082da49440c274fd4bc3f9c5ce906b201ccc1f119468918a5b72686d853c16760d088737d66f17044bc9e26b45174a968884eb17933d25738cae97b57732eba6fd1930ef6ea0d9d1d406409e0d53a0037a05abb6db869e5ef066f9f52871a9f82ca1c4a08587424613be02b9a8962d0a29ad9a4181f0dad25471993ba6fb5fe1e510a65d468099984abca98ab79cdb052062d24b88af1e75e8d3d7546ef7338997ad40f1138857101c79f21e16a46d1344487ba12873b8bf59c7439f71d38c7fa958a677f581137f0f3853c96ca2f4bd884878f084c7dd1aebeac1379ed8b72dde2b272180e58d55cc6def9dd31c0dea93e13f2365e3eb28229171f1a27a4ebb8943a62415356020b0e8572323127c4e32404e92a49db1a448eaa60d55ea984129611a6739e2f293e21bc6ffaf247aa44ad5d190f4aaf4442f532e25e5a5f3edd47ea3ebdb1e66e3ce41f18a87f8d13c53873573f2a84ef2754605b28d47b665e6c16b663e46a7c270dd1ced9865a8f7c2330083b3de24618f45be6ec00eacab0432163620a6100d83e884931ababd89b527401ea2ab6901b3b89132ca5ac428cdacd3d2d0e07a35a36d39874f89d886231eaac1dc3878002a7a16a969ce089ea89a442efded310f2c72ef8704cc9ab5b5b2f4a46c33a64a4667594a25b931c04c1b145d64029afde488620435823e7a59cb10fb1715a2db6326170fab86e6ac0317e50f5c4410635bc628f4105a550d7345b1a6611a24d8dd660dc60ac270c17b864a66f12379d3b2bd3809bef624f108b2db6b208ae551daa19a64776a18ac9fc5d06f852f7566acbe406caa8cb1a1872781fb097c91307dfd514b46788f085d1a02bc8ed7edda06a195a716495653825a5d878af88526330c6ed2bf21d6e0c3dca3810139c5174bb6d8f6450218928ec102fa6cc52eb2698e49e8445b7b18ed4115f7dd9b88baee7c4565bd1ea3f314fc40a6379e3ae6eaf7849237f49b5187d88048e6741bc237cfa624a76fb521b1f7be409dc962826ba69697cb4bbb16efba367f6b8508076231c0b1a86328fd6912fc62df2c4bf330851d3e1efb8184df3c328d1551023154d805e0887e256cf8663bc841ab9f2117cff5ffd62dcb79b8025329c4dda94b3a6f589fcad295f12919e9a9ee8426315f2dd94b420ed17a58568e3704d9fc7ed73c0b96cf67d872b98796056e4a47475b000f54f11cd1d46fdf977f0ecd9df0052cb335b16d20526c6df7d104951e2507817d6b1ab10cbf99a0381b77bb023a04f648c03fcae26db6413ea6529a7536792b368e659a13d613c5547d4f3e624e53aee097206e62af4df158c1750507a26b5b99c9469f7157c6f4e52625e0dfa1a03e6efc3a0818352f0be7f31f707760df018333fe3a685aa38922182d39dc0d502a521ceb87e8ce633f73dbd75a69203459554f418190de036dd16e81b7fb0e603b8f90861262a1e96fe806328fd3ced328c0a80ece8da701b3815e7409b0ce4d76075b3fa856cf1bf94b21bab9cc0f984348d2f64dddfdc87319f03faa4909ca4415248cc1762ae59761c766235bd01a0c9e42063a804cdffc26f6c41cc62709fde2aeb630b7ce16cf6f685de7e6d182457f03ef8a48a0a5f5e854fc5b8b9c2c9d5acbf9211b08382658c4cd903f5b50bb5338602f43c809bb4c2f9324aa8ae4695bec0c8a6fc4231c795475735835ae747a83873442d6197c339f5d44907bbfed136d8755e8c87e31e9eec1c04c6e3e75389e7ca66dbcb57823e89804294cf0540d34c60eb380b67a13cbd85129722e446081b21319c2d8b8a7768227610b5a534f5fb2f2f2bc9c5cab7809e3a1800f67397cf7cf30a7667fae14d64006dbaa8f116238e60b62cd98aeacf85c2966d3cc9d967f55d3be512b61186d6abf6920474b2b77d4418c18ffe18e247e65c008366e9849d683d193fb99d27a19e15b88e27a2db44289ac9d6cfb5a5ea84a12278cbd9fe55556cb7d88bb2c6ccf5e334cd94e286e464f38c4585a52a5b4cfee914a193b2b97b1a916e625847756af47227a9fc55f2a90bc3c7a4eb07ecd9175034e2047d0a1309e7da7063ae3a9c28a252f0265c4bdaa59786d42abeb616dd4cacfd062cb9813c969c42988a93f33992438ba5d18c3ac7db00707d876be44744cc88a478e2a29222fcceacbc91ea5058de8772b0736783f3afb61670e30206e106ad12d312928dab56d385613295828786bbac0998109e28b8639517fccdc9b485cf701dcc683ec9b1c41646d62b15ea850aede50ad6ab2840e62885bdf5e1176cb564dba5f54c601fa8c22efacb843b47f896430394c74ca9013e04da7c5bac95f95cfff3c6145347961903835741d93f9aa5c147acc419bd416abc0be3a0f2fecd3ab57032ed567dc891d755d3c9e6e8ec25d2af1ce74a60167ddf0e1bea5bfd841d6b32d05483852061da4cff4b9b692f5b69b4d5944146c8e54f4a8f54e27ea87c6e1e02e2ca4294b996442570cb6a9ebe5f619ab223c417f23b34347a04acae1e071680976500cf3f401476e7d4baab01dc0abb5caedd13a8b59bbbdf287917b5e5a92356afa4a67211c378d36ffbe5e4f33dd077d1d1a925ec8441fa760b4247ea417786abd336b17c6659b2a9380c9ba7ab14d81df4410a9327091e52fac67664ddf50dda06da467e53d8dda209f68ad4ca2d8dc177659552430c420af809c90a5a76518b970361ad26f27dad8aa6bb340df1c92b384fcc5a2e5187f2920328528915b68e13dbe2d5e0858bb077847105ace93e405d367e7425c4d2e8ffcdc2738eff2dec288dcf86c1f527351c55e58dc774ea1e3e8452012572965e9428896b17270c6c1608e92f9b4edee7e793bc992a36923caba3c8a35e411bfad89d2a973636a71be7511f2895d3a518658da922d9810663920c1c7a5ccc6d529202a17f88b7740712b87ffdab9151f374fa8018e7e01e9af07b797780b329c3765aad3ed02f1963ef90aaab150286095c6fd31838aa6bbabcce54e89c66dc1d8e97012108a70d73be7dd6a80c27eb2c6daa1b1a780c0943ace62c60661a77de932068306fe5ee2005fc6af3f012812112815705492e61813079398b9944014780bd0d600b145483b166c81047e9b702338e541e3c16b8770594ac5f8d6bfa530c647a84a6caf288b280a72980ba91cc941d360083445a552ab5d25f7edbe004b10e85c66b4bea3733d7258c46d549cd66ba206b806fe421953bc5267af1538dfe3f124643fcde43b726634b04b34500487557870d36a4408d025e5b4abcb22abfdcbe5f86af40a22992ac320f9c23ac18617058cce6e29ecf1cd65c95c56f70eb21511ca6ef4500c2462799ec0e0c9c720b29209495ddb344c47c9476b7924cc4882bbce637050805d690bd2ec0fb7db0c6f58c2c800f92069f955c7b9923f567c00052afa0dce8cbf90f4e39bbc1220c817c33e22791821710511ec300308382e6951d3e33671235a46db735d71e68b592e8f79870e41da2dd0d87b751d5cb17c027a58458eabb68d98d4ff24d64cb99f5f63d36a559a7e81968155eb852c6bda8515b13d4f534ebc00c1158470ecde7358cb5b0b9db262a3f3223c8c32e9dc82c721a489263fd48b1c1894879f5005313681d0e65a41105ef05df94e107fa9dbad576b52f6e28eb32125378371722f0eef7b1dc5c28b9dd757fbc3ba34e294db8117bdf736c4b8864ab8421f334488871d248190e0f6e47681efdf7c066b454b83cd2a2dc2a974d24dcc477e417b54b48a6f3b407409c4098dbb898460db9e6128837a26b68127156952182ca763a8514cb60320756edbe281c7026d1d0e72be68a5a35b3acb72f25f74e03e06fd0f838f40c97aef57eea8e86986d7d04e00470a279c15f89d74bbd485e6af8b4a62013e91323e35df2898b49138850f84e384887775f048d5a03410a66298442514360ed06ad1d26104ecfd85bdc0ac868802f2c08aa5e945c9394607493657e499a8a2e716fed9a1cd800943078385392c8e6949a30a218e03ef7b3d8a1603a6b75dc201b81bbe9d003c48971a38414e65b389f5f6acd76ea938c10a56a2b2cdc2c9b2cddc4b2261c221d32072ad389407eafc43c8e0343874cdb84daa8a8911c4072782fabc6b8001ada9debdd44dc1934a7dd157bff8bb21d85a4112960f482872aba7bbeefcf898d8ae2ba12159e3b298c9ac6d5e3698053f8969701db4b29ee08c2fc4dc0076977d6ce49e48f9fcdaa0e470b8a249af43d1d2f5e61d8bd8d7fb5929c493f18a537e462d9f93f34bea72bea549c751c0884d31080a972c0ffd0c57610ba740194730e0a36a5b715d1ad4765e235128c57cc4a0c04cb43070c346bca829bb151d1e3a6dd70c7b5ac103231d54b23ac1f0d973aeabf23190744f350b62a97224d26b1e9f951edc592a63949b02053a51ed897503dd04b10c7ec8cf2528bbcf80acb2ca2f5f006e5ca0166bb7ae5717b6a7d33c3d15b078bc88b2f7e6fa294410ff516ea6a728340d1b683289a40e82cc2dbdaf329dac31901744d1494604ee9695dadb73d86352fc48c8ae2ef444084824f4e2e68b1091fc052230128528eadb1a9c3bb0a9be92eaf13f0ff10ac43642fdb17bb3ddffa6ff632d9378382a026ac0dc74cda2970536112d6515be2778c081658d61080e3cd6b84f3696c903e6dc32285a7fe3c7c559fb145584d6c403b77c8902f64ded87427281804a14fcf60920e852131107d1a6d05794718d22cea83f0b91ff49d880e6af1966b479785e2c7e4dc2702a75778e01990208d97df62e6e5c5ba8221660698cf6aca9121219ed3a68e97801ad37e44f64c30b080a264a2fe7be5576c689e54a13e18129257de081b1e1885030bf450fb1b11105c3ab860c38672b88376f18abf03440c61bd1e3d83c363c706d761b966ae40845879384b447ab2f5a317fbaa64f14e608027bc6a1786dc784aa58a9f5c59fc9da3463ed45ac6ddcacdbf1f999ed09924fa60bd16dc447f6a73a9b58c6105ba59bef8aa74c90a38b8961ee8c7b55b262b1b841f36e3ec9b95d3d395853a815af2b22c436c676bc3147766bbaa4dbb487cbce8dd348e263bdbafaa86eb6007c23e1c921d9f3ba14c09907bff9f15c24ed4bbbee7f077bc01c1811f067f54905e9cd4787ab4fc92046a15c92c69891dc228ca2e017fe89bdc8db39df19bb3ac73b907b622a31c35676d6cc936559771252cb3f0d866d05271018d7dd8872842699ebfedc39d73685c132847cdc1a1f0298a2d1aa7336d6047e78c72f7699b17ee970988e3699b73640949bd6d739466b6db827137fc6b6a1a1124606cb939c3bfdf1aabba3e61c5dd8fe0af6b695bcf26afafabdc8849f565015908255ae018a28b9830340e8fb5c6261caf8a966785a816c00beac345fa45106dcbde934a9eff6921a5baac46aeb4e789d8b8df27e690e699ea21e89b3ec5c2bad694907a63850628484b4ffeacc7bcb8e49abdf57d8669075370a533b2c9528698ebc5b8809c17313181daa3f9476160a0923dd89e961f44b1eca37e1960b89151d72c5c27ad27e40395438e06d3142969da9885e2db82969044a4fcaf36eb511ad67e769e9efaef4c2f1e73524dfc4f40ca69d45215feaabd3e146f1b1b9490bb82054f45c59d5559a3d5f355a737274ab859e4bd9705daefea69f16aba5b8ff6b784a35248d147a9a73aa6b2d596412f4281e33ea4cfbcb0e1756f8aba2ac0d4e38ef4054ffb2987b4af6c049006d6c56c832f0df83230a40e361e2823831d9bb62afc30fe83da048fabbbcb098d0877e7f7cee9a4e6c58fba7d0ec1207b38247fe32ec405128900790d4b21bd1324b51000fd6ba5b10f3f74977c8d41810aba367ca67126080e9a6ff57d0424694d8d15d31b5d52e071d3b9e7fe13588b68d470d9e41d4eb9e8ca102b2ae04d6713028dcca268575b9dce1a1b5a82b758b5f7b242a6c183ff95889ad3a70729ccd205527d8d6e7dc15a78ba3ffadf328805873b600982de66863fea2c818afee38eb93dc196ba858c722f05f16ee4d5a9f2c3a82c3ade4e0d90f55256c6886a8d4469b39465b290480c9dff84308d33b73462732e1a26a820c3ce4da2174d83390057cbb564bb484a7b3915f083e6228ce0bd68ac002fab150fd537c208cb6c19fc6c8b6655491f189b089d0f384f141c2489fcfd135de47f8f3a22d470b521bb41a224c49646af7be3119e1599528fe218b4c2e8aa2532269338c4ccd2c13b2c5183722169f7ff042aa391cc19469ddc1426673a4fbe0d5fb4085601209094c3590d35220327733ccc7679b98df09595669dd96baae15e76a1829086d0f4d626a8d21ffa1e4e66f9dd5457a9a8acb11c22863957185b725a7c0a0638ab4c8996f4e61d8b8138ea655f44820958845a7181325d58f920e91adfd4c496cc890e4e79a882438824d441218e863014044f4398ca0884eeb430989354cbed44d47cfeba57428440e8ee7187e767e20cd45006599a74034a60fbb7f9bb914382c88621c32de689811b06319402bc6ed910b8553f2b82e0c19e176c0b889cc0be02abe1580021c7cc8f5e06d97d67e19afd27ce9dafc5974108e6823519d477e9e40eb6fe04b1155336b4c58acf385bccae1a3b4bb9316794ead079d9921e409f6a0f03be0fd7556a324d4b5bf32ac3e36ed098c2189dc0c336e4e75b16b9cd24f1ac15e3ac189222c4f33c98929270e8f3a726a5cc90f7a441256dd8144c7cf84e404decd7b34f930bd6f1c75548cc8bc05d70c315c4d7c3010137bbcc5cb575223a5614a53106339a8eaebb3da5af3def7c8650aa1b0733adaac5908953800a177e0d1484f0ac190489f6d18dcaf0b309418f424e5946c99c038d25327b4ee55e9d102fd891759e7b47ee3139692ef744ab47e9311ef7a0173cd3cdf5647d5b9f64f74c37987f9c7bcac4734394784c6ef943357c27931bc3ffb108a2029aa8fa84cd4ead333bcf80000bce644940beccedb1e0790f9a2c9659106e9d0caecd218d85c1dae492c14d5c75f35d86a0e232b8490d5592ee55df3f06f0af4cccdc2646f7c7540e4d93e8b17eca2c9b26e78cfa3a4b353960f5713c8e591665d3e42a97eacc6e4dce9c722987b90ab4d624f7e077ba990314124c1cdc5828b8c32f222350dc2e0e5220424ad1b8df4bfda86996e6895da75e8f72a9b522a2dc78344ecae2086616931b1ba5b69b29b78ba5ec8bdee9deb3592daaf0c93073d0b55e4a8f8e4f0e474bb9d14d6c63bc148f8e048205c67b7330427ebc8729262c6056fea993a3d21e016827e5c48fc7009ef2e8cc18885cb36ba1681aa9f9185d27671f25d6ef67e06a823fa361087c188a8dcf79da164f6ca72d727de49a99dd8162bb5e67de40131e8cd04b8303daf281f2c4868a351e9292ee37c8d39b8ca9973f7393f8973702266a3a454068d1e4ed33fb3e436f7f1aa4463010011882a04c472a33129b5c40b26d81b0cc44cd3dbf771854eb561857c8020ea0fe980e3a08f4265d83305381718c36e51d89dc2471744097f8caaf9ba482f2037b9cd1fc3d0002e1c1e30158c63d010ae3b0e9867b2b519c7df88485199be942ae446ac1ab66e4a198e58f0a35314f3906d392f00296f1bdd37a29bef422b40098e3286cd224c091048960096de275ddfe585714c1d14dc83c58be1fabef1569396e04384c9d22452be49e42f6ddb593b4c7605cb2ac50271054c5ca3bb7bb49e0f85b93efc8c5e182239cf8abbdab9928e7c665eef7e2a04ca593b62039f39310c45ca2669b37a747e3f8d39e1958030010f2080377ae7e01b3b9cc540183d16256d5cd9719f73808bb6a53fc3e4b074df6cdda45d62417760382e1adcd1ce6a8249e6e75ad4687c0246257375201c78cf5b40424677126755caffb5dac0e284f85db010a380ce9334dd0f54b4eb7803029fa1cf087de7f8c67abaaf91d846cc5834bcdc82d2c797e0964", "0x3a65787472696e7369635f696e646578": "0x00000000", - "0x3a6772616e6470615f617574686f726974696573": "0x010888dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0ee0100000000000000d17c2d7823ebf260fd138f2d7e27d114c0145d968b5ff5006125f2414fadae690100000000000000", - "0x3db7a24cfdc9de785974746c14a99df94e7b9012096b41c4eb3aaf947f6ea429": "0x0300", + "0x3db7a24cfdc9de785974746c14a99df94e7b9012096b41c4eb3aaf947f6ea429": "0x0400", "0x3f1467a096bcd71a5b6a0c8155e20810308ce9615de0775a82f8a94dc3d285a1": "0x01", "0x3f1467a096bcd71a5b6a0c8155e208103f2edf3bdf381debe331ab7446addfdc": "0x000064a7b3b6e00d0000000000000000", "0x3f1467a096bcd71a5b6a0c8155e208104e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x426e15054d267946093858132eb537f105fe52c2045750c3c492ccdcf62e2b9c": "0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d", - "0x426e15054d267946093858132eb537f14e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x426e15054d267946093858132eb537f195999521c6c89cd80b677e53ce20f98c": "0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d", + "0x426e15054d267946093858132eb537f14e7b9012096b41c4eb3aaf947f6ea429": "0x0200", "0x426e15054d267946093858132eb537f1a47a9ff5cd5bf4d848a80a0b1a947dc3": "0x00000000000000000000000000000000", - "0x426e15054d267946093858132eb537f1ba7fb8745735dc3be2a2c61a72c39e78": "0x181cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc208eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a4890b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27de659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e", - "0x426e15054d267946093858132eb537f1d0b4a3f7631f0c0e761898fe198211de": "0xe7030000", - "0x4342193e496fab7ec59d615ed0dc55304e7b9012096b41c4eb3aaf947f6ea429": "0x0900", + "0x4342193e496fab7ec59d615ed0dc55304e7b9012096b41c4eb3aaf947f6ea429": "0x0f00", "0x4a83351006488ef6369cb758091f878c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x4ff3897794d496d78686afcfe760a1144e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x4db06ba1ca6f18b1edb06ff082d244094e7b9012096b41c4eb3aaf947f6ea429": "0x0100", + "0x4dcb50595177a3177648411a42aca0f54e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x4ff3897794d496d78686afcfe760a1144e7b9012096b41c4eb3aaf947f6ea429": "0x0100", + "0x587e3b7cc2ee9dc4ab69e46c4d4c073d4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x5c0d1176a568c1f92944340dbfed9e9c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x5c0d1176a568c1f92944340dbfed9e9c530ebca703c85910e7164cb7d1c9e47b": "0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d", - "0x5e8a19e3cd1b7c148b33880c479c02814e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x5e8a19e3cd1b7c148b33880c479c02814e7b9012096b41c4eb3aaf947f6ea429": "0x0100", "0x5f27b51b5ec208ee9cb25b55d8728243308ce9615de0775a82f8a94dc3d285a1": "0x01", "0x5f27b51b5ec208ee9cb25b55d87282434e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x5f3e4907f716ac89b6347d15ececedca0b6a45321efae92aea15e0740ec7afe7": "0x00000000", "0x5f3e4907f716ac89b6347d15ececedca138e71612491192d68deab7e6f563fe1": "0x02000000", "0x5f3e4907f716ac89b6347d15ececedca28dccb559b95c40168a1b2696581b5a7": "0x00000000000000000000000000000000", - "0x5f3e4907f716ac89b6347d15ececedca308ce9615de0775a82f8a94dc3d285a1": "0x06", - "0x5f3e4907f716ac89b6347d15ececedca3ed14b45ed20d054f05e37e2542cfe700e5be00fbc2e15b5fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0x8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48", - "0x5f3e4907f716ac89b6347d15ececedca3ed14b45ed20d054f05e37e2542cfe70e535263148daaf49be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d", - "0x5f3e4907f716ac89b6347d15ececedca422adb579f1dbf4f3886c5cfa3bb8cc44f9aea1afa791265fae359272badc1cf8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48": "0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e13000064a7b3b6e00d13000064a7b3b6e00d0000", - "0x5f3e4907f716ac89b6347d15ececedca422adb579f1dbf4f3886c5cfa3bb8cc4de1e86a9a8c739864cf3cc5ec2bea59fd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d": "0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f13000064a7b3b6e00d13000064a7b3b6e00d0000", - "0x5f3e4907f716ac89b6347d15ececedca42982b9d6c7acc99faa9094c912372c2b4def25cfda6ef3a000000000e5be00fbc2e15b5fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0x13d4fe63a7b3b6e00d13d4fe63a7b3b6e00d00", - "0x5f3e4907f716ac89b6347d15ececedca42982b9d6c7acc99faa9094c912372c2b4def25cfda6ef3a00000000e535263148daaf49be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0x13d4fe63a7b3b6e00d13d4fe63a7b3b6e00d00", + "0x5f3e4907f716ac89b6347d15ececedca3ed14b45ed20d054f05e37e2542cfe700e5be00fbc2e15b5fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e", + "0x5f3e4907f716ac89b6347d15ececedca3ed14b45ed20d054f05e37e2542cfe70e535263148daaf49be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f", + "0x5f3e4907f716ac89b6347d15ececedca422adb579f1dbf4f3886c5cfa3bb8cc432a5935f6edc617ae178fef9eb1e211fbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f13000064a7b3b6e00d13000064a7b3b6e00d0000", + "0x5f3e4907f716ac89b6347d15ececedca422adb579f1dbf4f3886c5cfa3bb8cc46f2e33376834a63c86a195bcf685aebbfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e13000064a7b3b6e00d13000064a7b3b6e00d0000", "0x5f3e4907f716ac89b6347d15ececedca487df464e44a534ba6b0cbb32407b587": "0x0000000000", - "0x5f3e4907f716ac89b6347d15ececedca4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x5f3e4907f716ac89b6347d15ececedca4e7b9012096b41c4eb3aaf947f6ea429": "0x0e00", "0x5f3e4907f716ac89b6347d15ececedca5579297f4dfb9609e7e4c2ebab9ce40a": "0x00", "0x5f3e4907f716ac89b6347d15ececedca666fdcbb473985b3ac933d13f4acff8d": "0x00000000000000000000000000000000", "0x5f3e4907f716ac89b6347d15ececedca682db92dde20a10d96d00ff0e9e221c0b4def25cfda6ef3a000000000e5be00fbc2e15b5fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0x0000", "0x5f3e4907f716ac89b6347d15ececedca682db92dde20a10d96d00ff0e9e221c0b4def25cfda6ef3a00000000e535263148daaf49be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0x0000", "0x5f3e4907f716ac89b6347d15ececedca6ddc7809c6da9bb6093ee22e0fda4ba8": "0x02000000", + "0x5f3e4907f716ac89b6347d15ececedca7493ea190d0af47acc70e25428f8b1a3b4def25cfda6ef3a000000000e5be00fbc2e15b5fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0x1336fe63a7b3b6e00d1336fe63a7b3b6e00d0000000000000000", + "0x5f3e4907f716ac89b6347d15ececedca7493ea190d0af47acc70e25428f8b1a3b4def25cfda6ef3a00000000e535263148daaf49be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0x1336fe63a7b3b6e00d1336fe63a7b3b6e00d0000000000000000", "0x5f3e4907f716ac89b6347d15ececedca88dcde934c658227ee1dfafcd6e169030e5be00fbc2e15b5fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0x0000", "0x5f3e4907f716ac89b6347d15ececedca88dcde934c658227ee1dfafcd6e16903e535263148daaf49be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0x0000", - "0x5f3e4907f716ac89b6347d15ececedca8bde0a0ea8864605e3b68ed9cb2da01bb4def25cfda6ef3a000000000e5be00fbc2e15b5fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0x13d4fe63a7b3b6e00d13d4fe63a7b3b6e00d00", - "0x5f3e4907f716ac89b6347d15ececedca8bde0a0ea8864605e3b68ed9cb2da01bb4def25cfda6ef3a00000000e535263148daaf49be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0x13d4fe63a7b3b6e00d13d4fe63a7b3b6e00d00", "0x5f3e4907f716ac89b6347d15ececedca9220e172bed316605f73f1ff7b4ade980e5be00fbc2e15b5fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0x00", "0x5f3e4907f716ac89b6347d15ececedca9220e172bed316605f73f1ff7b4ade98e535263148daaf49be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0x00", - "0x5f3e4907f716ac89b6347d15ececedcaa141c4fe67c2d11f4a10c6aca7a79a04b4def25cfda6ef3a00000000": "0xa8fdc74e676dc11b0000000000000000", + "0x5f3e4907f716ac89b6347d15ececedcaa141c4fe67c2d11f4a10c6aca7a79a04b4def25cfda6ef3a00000000": "0x6cfcc74e676dc11b0000000000000000", "0x5f3e4907f716ac89b6347d15ececedcaad811cd65a470ddc5f1d628ff0550982b4def25cfda6ef3a00000000": "0x00000000", "0x5f3e4907f716ac89b6347d15ececedcab49a2738eeb30896aacb8b3fb46471bd": "0x02000000", "0x5f3e4907f716ac89b6347d15ececedcac0d39ff577af2cc6b67ac3641fa9c4e7": "0x01000000", @@ -114,25 +119,26 @@ "0x5f3e4907f716ac89b6347d15ececedcaea07de2b8f010516dca3f7ef52f7ac5a": "0x040000000000000000", "0x5f3e4907f716ac89b6347d15ececedcaed441ceb81326c56263efbb60c95c2e4": "0x00000000000000000000000000000000", "0x5f3e4907f716ac89b6347d15ececedcaf7dad0317324aecae8744b87fc95f2f3": "0x00", - "0x5f9cc45b7a00c5899361e1c6099678dc4e7b9012096b41c4eb3aaf947f6ea429": "0x0400", + "0x5f3e4907f716ac89b6347d15ececedcafab86d26e629e39b4903db94786fac74": "0xffffffffffffffff0000000000000000", + "0x5f9cc45b7a00c5899361e1c6099678dc4e7b9012096b41c4eb3aaf947f6ea429": "0x0500", + "0x5f9cc45b7a00c5899361e1c6099678dc5e0621c4869aa60c02be9adcc98a0d1d": "0x0888dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0ee0100000000000000d17c2d7823ebf260fd138f2d7e27d114c0145d968b5ff5006125f2414fadae690100000000000000", "0x5f9cc45b7a00c5899361e1c6099678dc8a2d09463effcc78a22d75b9cb87dffc": "0x0000000000000000", "0x5f9cc45b7a00c5899361e1c6099678dcd47cb8f5328af743ddfb361e7180e7fcbb1bdbcacd6ac9340000000000000000": "0x00000000", "0x6441fb391296410bd2f14381bb7494334e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x6786c4cec8d628b6598d7a70ace7acd44e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x682a59d51ab9e48a8c8cc418ff9708d24e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x6c63e84bfc5a0d62149aaab70897685c4ba24bcd9ac206424105f255ae95a355": "0xb104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x6c63e84bfc5a0d62149aaab70897685c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x682a59d51ab9e48a8c8cc418ff9708d24e7b9012096b41c4eb3aaf947f6ea429": "0x0100", + "0x682a59d51ab9e48a8c8cc418ff9708d2d34371a193a751eea5883e9553457b2ef71f22775221b1945fe6cfa3c6550c7c09000000": "0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d0000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000100000000000000000000000000", "0x7474449cca95dc5d0c00e71735a6d17d4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", "0x74dd702da46f77d7acf77f5a48d4af7d4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x74dd702da46f77d7acf77f5a48d4af7d62556a85fcb7c61b2c6c750924846b150e5be00fbc2e15b5fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e01be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f00b304f91831830500622780fd38770500", - "0x74dd702da46f77d7acf77f5a48d4af7d62556a85fcb7c61b2c6c750924846b15e535263148daaf49be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f0001fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860eb304f91831830500622780fd38770500", + "0x74dd702da46f77d7acf77f5a48d4af7d62556a85fcb7c61b2c6c750924846b150e5be00fbc2e15b5fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e01be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f00a5b42a473a9e060035c953d5088e0600", + "0x74dd702da46f77d7acf77f5a48d4af7d62556a85fcb7c61b2c6c750924846b15e535263148daaf49be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f0001fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860ea5b42a473a9e060035c953d5088e0600", "0x74dd702da46f77d7acf77f5a48d4af7d7a6dc62e324093ba1331bf49fdb2f24a": "0x02000000", - "0x74dd702da46f77d7acf77f5a48d4af7de5c03730c8f59f00941607850b6633d81fad1867486365c5b304f91831830500": "0x01be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f01fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e", + "0x74dd702da46f77d7acf77f5a48d4af7de5c03730c8f59f00941607850b6633d8440de572cbc49d04a5b42a473a9e0600": "0x01be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f01fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e", "0x7a6d38deaa01cb6e76ee69889f1696272be9a4e88368a2188d2b9100a9f3cd43": "0x00407a10f35a00000000000000000000", "0x7a6d38deaa01cb6e76ee69889f16962730256ea2c545a3e5e3744665ffb2ed28": "0x00020000", "0x7a6d38deaa01cb6e76ee69889f1696273f0d64e1907361c689834a9c1cb0fbe0": "0x20000000", "0x7a6d38deaa01cb6e76ee69889f16962749d67997de33812a1cc37310f765b82e": "0x0080c6a47e8d03000000000000000000", - "0x7a6d38deaa01cb6e76ee69889f1696274e7b9012096b41c4eb3aaf947f6ea429": "0x0300", + "0x7a6d38deaa01cb6e76ee69889f1696274e7b9012096b41c4eb3aaf947f6ea429": "0x0800", "0x7a6d38deaa01cb6e76ee69889f169627ba93302f3b868c50785e6ade45c6a1d8": "0x10000000", "0x7cda3cfa86b349fdafce4979b197118f4e7b9012096b41c4eb3aaf947f6ea429": "0x0400", "0x7cda3cfa86b349fdafce4979b197118f71cd3068e6118bfb392b798317f63a8910c174c55fd2c633e659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e": "0x04e659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e000064a7b3b6e00d000000000000000000000000000000000000000000000000", @@ -142,40 +148,63 @@ "0x7cda3cfa86b349fdafce4979b197118f71cd3068e6118bfb392b798317f63a89a647e755c30521d38eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48": "0x048eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48000064a7b3b6e00d000000000000000000000000000000000000000000000000", "0x7cda3cfa86b349fdafce4979b197118f71cd3068e6118bfb392b798317f63a89dd4e3f25f5378a6d90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22": "0x0490b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22000064a7b3b6e00d000000000000000000000000000000000000000000000000", "0x7cda3cfa86b349fdafce4979b197118fba7fb8745735dc3be2a2c61a72c39e78": "0x181cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c000064a7b3b6e00d000000000000000000000000000000000000000000000000306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20000064a7b3b6e00d0000000000000000000000000000000000000000000000008eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48000064a7b3b6e00d00000000000000000000000000000000000000000000000090b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22000064a7b3b6e00d000000000000000000000000000000000000000000000000d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d000064a7b3b6e00d000000000000000000000000000000000000000000000000e659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e000064a7b3b6e00d000000000000000000000000000000000000000000000000", + "0x837adc8a2ac1180ee049d9a9f6a5a6c74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x8671567f6bbc0021f6f23105f33002a84e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x89d139e01a5eb2256f222e5fc5dbe6b34e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x913b40454eb582a66ab74c86f6137db94e7b9012096b41c4eb3aaf947f6ea429": "0x0400", + "0x928fa8b8d92aa31f47ed74f188a43f704e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0xa0eb495036d368196a2b6c51d9d788814e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xa2250336d7088646c66de755c066e1294e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0xa2ce73642c549ae79c14f0a671cf45f94e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xa37f719efab16103103a0c8c2c784ce14e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xa42f90c8b47838c3a5332d85ee9aa5c34e7b9012096b41c4eb3aaf947f6ea429": "0x0100", + "0xa37f719efab16103103a0c8c2c784ce14e7b9012096b41c4eb3aaf947f6ea429": "0x0400", + "0xa42f90c8b47838c3a5332d85ee9aa5c34e7b9012096b41c4eb3aaf947f6ea429": "0x0200", "0xa8c65209d47ee80f56b0011e8fd91f504e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xac42112d5338b6d943fa7c0ea6729c5b4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xac42112d5338b6d943fa7c0ea6729c5b5281a136c39eafd1d9a43e904579daed00000000": "0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d", + "0xac42112d5338b6d943fa7c0ea6729c5b5281a136c39eafd1d9a43e904579daed01000000": "0x8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48", "0xaebd463ed9925c488c112434d61debc04e7b9012096b41c4eb3aaf947f6ea429": "0x0400", - "0xaebd463ed9925c488c112434d61debc0ba7fb8745735dc3be2a2c61a72c39e78": "0x18d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a4890b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20e659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e1cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c", + "0xaebd463ed9925c488c112434d61debc0ba7fb8745735dc3be2a2c61a72c39e78": "0x181cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc208eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a4890b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27de659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e", + "0xb52606da80d02ab374428369a5f246f14e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xb8753e9383841da95f7b8871e5de32694e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0xbd2a529379475088d3e29a918cd478724e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0xc2261276cc9d1f8598ea4b6a74b15c2f218f26c73add634897550b4003b26bc632a5935f6edc617ae178fef9eb1e211fbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0x047374616b696e6720000064a7b3b6e00d000000000000000002", "0xc2261276cc9d1f8598ea4b6a74b15c2f218f26c73add634897550b4003b26bc66f2e33376834a63c86a195bcf685aebbfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0x047374616b696e6720000064a7b3b6e00d000000000000000002", - "0xc2261276cc9d1f8598ea4b6a74b15c2f308ce9615de0775a82f8a94dc3d285a1": "0x01", - "0xc2261276cc9d1f8598ea4b6a74b15c2f4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x0040fa7f398074858a02000000000000", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb30e5be00fbc2e15b5fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0xd17c2d7823ebf260fd138f2d7e27d114c0145d968b5ff5006125f2414fadae698eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3e535263148daaf49be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0x88dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0eed43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d", + "0xc2261276cc9d1f8598ea4b6a74b15c2f4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", + "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x024082111592a2351e02000000000000", + "0xc2eac8c3d5c3234dc0a1a2cbcf2683444e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xc2eac8c3d5c3234dc0a1a2cbcf26834495875cb80ebaf9f918457db6a86ac6ad": "0x0000000000000000", + "0xc2eac8c3d5c3234dc0a1a2cbcf268344a60b3b950949d0170fe164cd975925c0": "0x00000000", + "0xc2eac8c3d5c3234dc0a1a2cbcf268344c946330e6fb55244ecf7951cd7f85c4c": "0x0000000000000000", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb30e5be00fbc2e15b5fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0xd17c2d7823ebf260fd138f2d7e27d114c0145d968b5ff5006125f2414fadae698eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a480390084fdbf27d2b79d26a4f13f0ccd982cb755a661969143c37cbc49ef5b91f27", + "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3e535263148daaf49be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0x88dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0eed43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d020a1091341fe5664bfa1782d5e04779689068c916b04cb365ec3153755684d9a1", "0xcec5070d609dd3497f72bde07fc96ba04e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19500b42ace3b5fab73c6265656684020a1091341fe5664bfa1782d5e04779689068c916b04cb365ec3153755684d9a1": "0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19500e3a507571a62417696d6f6e808eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48": "0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19500f0350b468be487e6d69786e80d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d": "0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195049379ceb4b3a90d86d69786e808eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48": "0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19505905fe216cc5924c6772616e80d17c2d7823ebf260fd138f2d7e27d114c0145d968b5ff5006125f2414fadae69": "0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195066b8d48da86b869b6261626580d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d": "0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509d4a4cfe1c2ef0b961756469808eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48": "0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e", + "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950c7e637254b9ea61962656566840390084fdbf27d2b79d26a4f13f0ccd982cb755a661969143c37cbc49ef5b91f27": "0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950c9b0c13125732d276175646980d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d": "0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950d62c40514b41f31962616265808eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48": "0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950ed43a85541921049696d6f6e80d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d": "0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f", "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950f5537bdb2a1f626b6772616e8088dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0ee": "0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f", "0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903": "0x08be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25ffe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e", - "0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x08be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f88dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0eed43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860ed17c2d7823ebf260fd138f2d7e27d114c0145d968b5ff5006125f2414fadae698eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48", + "0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x08be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f88dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0eed43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d020a1091341fe5664bfa1782d5e04779689068c916b04cb365ec3153755684d9a1fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860ed17c2d7823ebf260fd138f2d7e27d114c0145d968b5ff5006125f2414fadae698eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a480390084fdbf27d2b79d26a4f13f0ccd982cb755a661969143c37cbc49ef5b91f27", "0xd57bce545fb382c34570e5dfbf338f5e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xd5c41b52a371aa36c9254ce34324f2a54e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xd5c41b52a371aa36c9254ce34324f2a54e7b9012096b41c4eb3aaf947f6ea429": "0x0100", "0xd5e1a2fa16732ce6906189438c0a82c64e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xd77451b0cdabc3fb7fe20813c2e9ad4a4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0xd8f314b7f4e6b095f0f8ee4656a448254e7b9012096b41c4eb3aaf947f6ea429": "0x0100", + "0xda7d4185f8093e80caceb64da45219e30c98535b82c72faf3c64974094af4643": "0x0100000000000000020000009394784c9135e2e98a0c095ce594f572650285069b0464ce74c83befcbc17b71", + "0xda7d4185f8093e80caceb64da45219e34e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xda7d4185f8093e80caceb64da45219e3c52aa943bf0908860a3eea0fad707cdc": "0x0000000000000000020000009394784c9135e2e98a0c095ce594f572650285069b0464ce74c83befcbc17b71", + "0xe601a78caffde57e00752be8864bc48e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xe6ff095c8bf38992ef748b1037a308af4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0xe8d49389c2e23e152fdd6364daadd2cc4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", "0xed25f63942de25ac5253ba64b5eb64d14e7b9012096b41c4eb3aaf947f6ea429": "0x0400", - "0xed25f63942de25ac5253ba64b5eb64d1ba7fb8745735dc3be2a2c61a72c39e78": "0x18d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a4890b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20e659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e1cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c", + "0xed25f63942de25ac5253ba64b5eb64d1ba7fb8745735dc3be2a2c61a72c39e78": "0x181cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc208eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a4890b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27de659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e", "0xede8e4fdc3c8b556f0ce2f77fc2575e34e7b9012096b41c4eb3aaf947f6ea429": "0x0100", "0xedfb05b766f199ce00df85317e33050e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0xf0c365c3cf59d671eb72da0e7a4113c44e7b9012096b41c4eb3aaf947f6ea429": "0x0000", @@ -183,6 +212,7 @@ "0xf2794c22e353e9a839f12faab03a911b7f17cdfbfa73331856cca0acddd7842e": "0x00000000", "0xf2794c22e353e9a839f12faab03a911bbdcb0c5143a8617ed38ae3810dd45bc6": "0x00000000", "0xf2794c22e353e9a839f12faab03a911be2f6cb0456905c189bcb0458f9440f13": "0x00000000", + "0xf35b44951b86069d9273a961f1e3fbeb4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0xf5a4963e4efb097983d7a693b0c1ee454e7b9012096b41c4eb3aaf947f6ea429": "0x0100", "0xfbc9f53700f75f681f234e70fb7241eb4e7b9012096b41c4eb3aaf947f6ea429": "0x0000" }, diff --git a/substrate/zombienet/0001-basic-warp-sync/generate-warp-sync-database.toml b/substrate/zombienet/0001-basic-warp-sync/generate-warp-sync-database.toml index ca78ee290c4..39f3b0fb3bd 100644 --- a/substrate/zombienet/0001-basic-warp-sync/generate-warp-sync-database.toml +++ b/substrate/zombienet/0001-basic-warp-sync/generate-warp-sync-database.toml @@ -1,16 +1,19 @@ # this file is not intended to be executed in CI stage [relaychain] -default_image = "docker.io/parity/substrate:latest" +default_image = "docker.io/paritypr/substrate:latest" default_command = "substrate" # refer to ./README.md for more details on how to create snapshot and spec -chain = "gen-db" +chain = "local" chain_spec_path = "chain-spec.json" [[relaychain.nodes]] name = "alice" validator = true + # TODO: Workaround for https://github.com/paritytech/polkadot-sdk/issues/2568 + # After the issue is fixed, we can remove this. + args = ["--state-pruning archive --blocks-pruning archive"] [[relaychain.nodes]] name = "bob" diff --git a/substrate/zombienet/0001-basic-warp-sync/test-warp-sync.toml b/substrate/zombienet/0001-basic-warp-sync/test-warp-sync.toml index 773f5020bc3..f4586ba69d0 100644 --- a/substrate/zombienet/0001-basic-warp-sync/test-warp-sync.toml +++ b/substrate/zombienet/0001-basic-warp-sync/test-warp-sync.toml @@ -5,24 +5,24 @@ enable_tracing = false default_image = "{{ZOMBIENET_INTEGRATION_TEST_IMAGE}}" default_command = "substrate" -chain = "gen-db" +chain = "local" chain_spec_path = "chain-spec.json" [[relaychain.nodes]] name = "alice" validator = false - db_snapshot="https://storage.googleapis.com/zombienet-db-snaps/substrate/0001-basic-warp-sync/chains-a233bbacff650aac6bcb56b4e4ef7db7dc143cfb.tgz" + db_snapshot="{{DB_SNAPSHOT}}" [[relaychain.nodes]] name = "bob" validator = false - db_snapshot="https://storage.googleapis.com/zombienet-db-snaps/substrate/0001-basic-warp-sync/chains-a233bbacff650aac6bcb56b4e4ef7db7dc143cfb.tgz" + db_snapshot="{{DB_SNAPSHOT}}" #we need at least 3 nodes for warp sync [[relaychain.nodes]] name = "charlie" validator = false - db_snapshot="https://storage.googleapis.com/zombienet-db-snaps/substrate/0001-basic-warp-sync/chains-a233bbacff650aac6bcb56b4e4ef7db7dc143cfb.tgz" + db_snapshot="{{DB_SNAPSHOT}}" [[relaychain.nodes]] name = "dave" diff --git a/substrate/zombienet/0001-basic-warp-sync/test-warp-sync.zndsl b/substrate/zombienet/0001-basic-warp-sync/test-warp-sync.zndsl index dc84804b70b..bafdb7d72bb 100644 --- a/substrate/zombienet/0001-basic-warp-sync/test-warp-sync.zndsl +++ b/substrate/zombienet/0001-basic-warp-sync/test-warp-sync.zndsl @@ -13,18 +13,16 @@ charlie: reports peers count is at least 3 within 60 seconds dave: reports peers count is at least 3 within 60 seconds -# db snapshot has 12133 blocks -dave: reports block height is at least 1 within 60 seconds -dave: reports block height is at least 12132 within 60 seconds -dave: reports block height is at least 12133 within 60 seconds +# db snapshot has {{DB_BLOCK_HEIGHT}} blocks +alice: reports block height is at least {{DB_BLOCK_HEIGHT}} within 60 seconds +bob: reports block height is at least {{DB_BLOCK_HEIGHT}} within 60 seconds +charlie: reports block height is at least {{DB_BLOCK_HEIGHT}} within 60 seconds -alice: reports block height is at least 12133 within 60 seconds -bob: reports block height is at least 12133 within 60 seconds -charlie: reports block height is at least 12133 within 60 seconds +dave: reports block height is at least 1 within 60 seconds +dave: reports block height is at least {{DB_BLOCK_HEIGHT}} within 60 seconds dave: log line matches "Warp sync is complete" within 60 seconds -# workaround for: https://github.com/paritytech/zombienet/issues/580 -dave: count of log lines containing "Block history download is complete" is 1 within 10 seconds +dave: log line matches "Block history download is complete" within 10 seconds dave: count of log lines containing "error" is 0 within 10 seconds dave: count of log lines containing "verification failed" is 0 within 10 seconds diff --git a/substrate/zombienet/0002-validators-warp-sync/chain-spec.json b/substrate/zombienet/0002-validators-warp-sync/chain-spec.json deleted file mode 100644 index 8c09e7c7b03..00000000000 --- a/substrate/zombienet/0002-validators-warp-sync/chain-spec.json +++ /dev/null @@ -1,192 +0,0 @@ -{ - "name": "Local Testnet", - "id": "local_testnet", - "chainType": "Local", - "bootNodes": [ - "/ip4/127.0.0.1/tcp/30333/p2p/12D3KooWFvMbTsNZ8peGS8dbnRvNDBspstupzwYC9NVwbzGCLtDt" - ], - "telemetryEndpoints": null, - "protocolId": null, - "properties": null, - "forkBlocks": null, - "badBlocks": null, - "lightSyncState": null, - "codeSubstitutes": {}, - "genesis": { - "raw": { - "top": { - "0x074b65e262fcd5bd9c785caf7f42e00a4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x0e7b504e5df47062be129a8958a7a1271689c014e0a5b9a8ca8aafdff753c41c": "0xe8030000000000000000000000000000", - "0x0e7b504e5df47062be129a8958a7a1274e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x0e7b504e5df47062be129a8958a7a127ecf0c2087a354172a7b5a9a7735fe2ff": "0xc0890100", - "0x0e7b504e5df47062be129a8958a7a127fb88d072992a4a52ce055d9181748f1f": "0x0a000000000000000000000000000000", - "0x0f6738a0ee80c8e74cd2c7417c1e25564e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x1809d78346727a0ef58c0fa03bafa3234e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x1a736d37504c2e3fb73dad160c55b2914e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x1cb6f36e027abb2091cfb5110ab5087f4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x1cb6f36e027abb2091cfb5110ab5087f5e0621c4869aa60c02be9adcc98a0d1d": "0x08d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d01000000000000008eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a480100000000000000", - "0x1cb6f36e027abb2091cfb5110ab5087f66e8f035c8adbe7f1547b43c51e6f8a4": "0x00000000", - "0x1cb6f36e027abb2091cfb5110ab5087faacf00b9b41fda7a9268821c2a2b3e4c": "0x08d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d01000000000000008eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a480100000000000000", - "0x1cb6f36e027abb2091cfb5110ab5087fdc6b171b77304263c292cc3ea5ed31ef": "0x0100000000000000040000000000000001", - "0x2099d7f109d6e535fb000bba623fd4404c014e6bf8b8c2c011e7290b85696bb3": "0x08d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48", - "0x2099d7f109d6e535fb000bba623fd4404e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x2099d7f109d6e535fb000bba623fd4409f99a2ce711f3a31b2fc05604c93f179": "0x08d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48", - "0x267ada16405529c2f7ef2727d71edbde4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef734abf5cb34d6244378cddbf18e849d96": "0x00000000071c0d84db3a00", - "0x26aa394eea5630e07c48ae0c9558cef74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9007cbc1270b5b091758f9c42f5915b3e8ac59e11963af19174d0b94d5d78041c233f55d2e19324665bafdfb62925af2d": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da923a05cabf6d3bde7ca3ef0d11596b5611cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da932a5935f6edc617ae178fef9eb1e211fbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0x000000000300000001000000000000000000a0dec5adc935360000000000000000000000000000000000000000000000000064a7b3b6e00d0000000000000000000064a7b3b6e00d0000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da94f9aea1afa791265fae359272badc1cf8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95ecffd7b6c0f78751baa9d281e0bfa3a6d6f646c70792f74727372790000000000000000000000000000000000000000": "0x0000000000000000010000000000000000407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96f2e33376834a63c86a195bcf685aebbfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0x000000000300000001000000000000000000a0dec5adc935360000000000000000000000000000000000000000000000000064a7b3b6e00d0000000000000000000064a7b3b6e00d0000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da98578796c363c105114787203e4d93ca6101191192fc877c24d725b337120fa3edc63d227bbc92705db1e2cb65f56981a": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b0edae20838083f2cde1c4080db8cf8090b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b321d16960ce1d9190b61e2421cc60131e07379407fecc4b89eb7dbd287c2c781cfb1907a96947a3eb18e4f8e7198625": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9de1e86a9a8c739864cf3cc5ec2bea59fd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9e5e802737cce3a54b0bc9e3d3e6be26e306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9edeaa42c2163f68084a988529a0e2ec5e659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f3f619a1c2956443880db9cc9a13d058e860f1b1c7227f7c22602f53f15af80747814dffd839719731ee3bba6edc126c": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x3104106e6f6465", - "0x2aeddc77fe58c98d50bd37f1b90840f94e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x2b06af9719ac64d755623cda8ddd9b944e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x2b06af9719ac64d755623cda8ddd9b949f99a2ce711f3a31b2fc05604c93f179": "0x08d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48", - "0x2c5de123c468aef7f3ac2ab3a76f87ce4e7b9012096b41c4eb3aaf947f6ea429": "0x0400", - "0x2f85f1e1378cb2d7b83adbaf0b5869c24e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0x2f85f1e1378cb2d7b83adbaf0b5869c298ef7dc060436e4ed803af07632b89b65153cb1f00942ff401000000": "0x601de9615313b00e8cea3ef84e79e50b2fb70e2c8a47cff478b9fe8b3fa8f2db02000000", - "0x2f85f1e1378cb2d7b83adbaf0b5869c298ef7dc060436e4ed803af07632b89b6b4def25cfda6ef3a00000000": "0x601de9615313b00e8cea3ef84e79e50b2fb70e2c8a47cff478b9fe8b3fa8f2db02000000", - "0x2f85f1e1378cb2d7b83adbaf0b5869c2ff3ae12770bea2e48d9bde7385e7a25f": "0x0000000002000000", - "0x3a2d6c9353500637d8f8e3e0fa0bb1c54e7b9012096b41c4eb3aaf947f6ea429": "0x0400", - "0x3a2d6c9353500637d8f8e3e0fa0bb1c5ba7fb8745735dc3be2a2c61a72c39e78": "0x00", - "0x3a636f6465": "0x52bc537646db8e0528b52ffd0058dc2705bea5c66d15541040ac6c3ae971bcf5f1040221a8d1f8b7c17e61bf21cce87411480b10bd8daa5e3c2b65f8c4aa364e5a8ddf27c0313827d06a2d6334e074db9ca7d876ac8d052862b9984530f4d340bda4edddd6e4de5ba624536717e1139e14df2d875c7f7086dc3fa3d398b64f50fffc58fbf4fb73ffb0d39cc2b86761cfe6d3073b9c1fcee7fe611b7f4875f9a7d8cfe208fdf493f4d3b07d9a73ad05c8cf39e5c4dde679c3c8391b9ceec4fd78c824d218e4cfb79cb8be9cb301eace3b7f8a274c182edb72e2e83349855e7e4a2a795d7e27998b94f46d92b42eb543afcbcf5f5c9e5bf2d52dfd9b2f93dc33262710e3fc79b943e09fe2d00f8dd7edc4350b92a692a2facb7adddffddd3d89e9babb7b8e0b9d61050b2b4ddf3efdfdb3f629e9edfe9c18c4f8715bebf42d6f6e3ff74be1b9c0c8b9187cb89c83618e5bce6ebf90cb3918729745244063391ee9710cdb87bfbbbffc6047f275725e904518e7f53cec48efa788c4bd67d104a4eb81534cd2bd67cbeebb075b4c32deee59a43da30fd2d0c979410f3db2fb2972cfcad89d0f822c7ab644bade3b59d6eeddc9925eef8f34e8645980eb0fb2f8d9b2cafddec99273d7bf234bee5995292c3051e1fa97dcb31285eb5f76255cff23de917c3f72c8afaeaeac6ef74e96462e7d70864ed2ef48be2c9ef05d8f1cfa6e67cb79dd0ecdabababab5b225d7f4a72cfa6a53d9bcf739903246f521840fe916b813c65e41c0c50b7b60fe76078bafc61ff4c1bbfac7d3887b3bafc37979f73580490ef389f9f5920c8edc3f3cee7075fdc3e4cdba79f1f9c200db97df896f532c31e008355cff83a7dff7e1791b4e5097b400cb89ef19def24533b4524b567fe2c96c02292fe233d5900f2edfed96d8f34d29c2680f3270934e67054b7a4b7bfceaf95fd879b568e777e395e3aa7139fded3ff484f77779fef3ebbbfdeb6364afae9f74c32bf6dd9ef3de714c839e5df7e908f8c208b30f2fbb388847f8a2354c1e170305cb6dcb3b2de7eb0436e9ff9edc33deb3fd24ed29ef50f602cc7dbfda0ac7df8f683331cdba73fd63efefdb2f699b79f45244e492a38b708a9def9f54e6ba3643efdf9d41acdeb964524d396f3ce3fd247fa2f7380e4736a01f2e59c72bcfd606d9fb266c81ce3fc32bc0d3a198071be3f3f8b27cc0f725b7bc6cf3d2be99da45f916a7e3f38c349d21b7211a2597587be4b05e6ceef17b908d1c4dd21112e95f0ceef777111a289bb43225c2ade9ddfffe2224413778744b8f3fb594c4271b83bff48831d3217995ffa73cff86bfb94f3faf3834ed69ef11719fdf9592481f68cdf6ded19ff91063b9c64df908b10cddca5e2ddf9fd2217219ab83b24c29ddf3fc51346dc9d1fb60fdf7e16934cdc9d7fa48ff4913ed24c72cff839a76dd0789903a49e5d06c80dcee7f629f9a7e59ef1f323cd2903720ee774f91b22454f610414ad21610c79c190160c991a32c6102286c0604808865831440c2057860431c469881042da10f28221370c9961881742e6186245881c426630248b1035848421248e214d42de18b224644a081b42bc08a11212032164081943081842d6102203212e102286902e84782184cb902d845821a44ac8154248304520a449080d3d36e8a9ea99a3478e9e387ad4e8f1d233464f0c7a723d5b7aace849414f153d24e839a247aa678b1e287a9ee889ea71a207891e237a44d053821ea89e247a94e81941cf0a7a5ad0c3821d11f448d1d3448f163c3af070a046c68e1a3b69eca0b173c68e193b65ecc060478c9d17ec84b103c64e979d2f76bcd8e982878947069e251e259e241e2b3c31f0c0c083dbb9dab963c78e9d3776e0d891c1ce971d2e3b2ed8e162678b9da99d1becd86087063b74ecccb133831d3976e2d8a963c76aa7063c1be0b9b293c50e163b2cd859c18e0a76a476aed8b162a78a9da89d12ec3cb143821d26768cd82962c769e7879d1b767cd80162c7033b42ec7460070440ec0072c70e13901b00b9da69dab101481640ba00f102880b807001b20490278094000813407e000204902cb51acc20a61390a51a0d80c850fb52bba376558ba3660710a5da1c409280e06a5635388058a9cda026478d8e9a1bb5aada1b35366a30a86d51aba236454d899a096a4c0059a386a546430d57b3528361e76987089d2f74dcd0a9d25943270d1d2a1d18e88ca123860e1b3a73e880a123874e0c74e0d02943270c9d3674ccd0214387063a32d0a9814e171d2b9d3774d0d0a143470d9d17e8cc40270e1d2f3a67e808a143848e077478d0c9a263834e0d3a34e8e0a0d3019da61f6afc80e3c71a3fc2f8d1821f5dfcd8e207173fbc981ef8f1c40f277e90e047133f98f8b1c4ab04f34b8f0c604288573fbebca26a54d0c8f083aa2af9f0c2c71735197e88a1d3c33787ec8e9009f6434d1b36573a869a0bbc2f3a778473d49e422ec2168453e11630203c1bfce0522347784527869a17542d68984219603d7442c086a8f902e34167294cea425023469df26e50e3a5878c70a926d5259b1d6267c8bebc5eb0d303cc03a1d2384307467490a583a70e74a851eaa0033d8e10bfc070a8568c3db8be78687c74f408e2c545b481cb4a8f14e06c51657851856d8c3bc8bc78c5c047d40f2d6476c83421bb416581cb062f2f2f34646ed42d7c24e164f1ec78a9e15223e6c54b63d4e2c38a48c78c1d95a9068d5a11f54aad04b51d5c68b86010adc61a6ad4a0597aa541a39463031033726aa08901c9445e21ade05841c6602307a9f423f827300d1b19f4d4f1657000825718382da827e8b0886ef4808123021c23708ae809030704384ce02c81c3054709215d709cf8f1c1f900ce062a10383e8852b468d0b2c26962c686991a7048b09303ce08704a504bc306861a326ad8b0d9400d0c6ac0c8990187861a3a74385063464fe12ce1c4e003063ec6f831831e40f4f0c04b8c1f67782ce8d104a8460fa79d257afcd003043fcc905981103764a2e8a1030803d005433e007ab179b201818d10f406a01dd48ece868e0956431743dd42bff4e8402743074387ebac74576a0a2a15758aae06b1aadbc07f60c68c971daf2f558a1e5a3aa577aae9a24bea66a077b8946a9868c8a0a1010d1d3435a061636606345e66e2a091c18c1c346bd0a83143c7cc1c3469ec0411ce40860b4d0b605a68585093aa69a131a25ba2c982e605b52d343e8c1bb0c901f6011808604f3c88784551b9c8ae646dc072f820fe88991bbcc0e88ae888e88c70c9d03dc18aa8319851a3f683c8c60c1a325f646e206303992b19ab191a66b0c850f1a282460c9c20707ac00142e60a192b6049302b3255c8a4e03df03f00d181831d4419d4c6b0517a55895334493b30b41534565c4b2e1ccca99682300d980e5e0d6057604cf306e31a3655231b3e62f08241f5e245c66b0c0eb48c408c3f8c1eb08943868b07e2d5454d1aaf2b5e5b6cdc78a9604c0387089c271928402e5e55d86001af6aba8871d4d0a0070f3634d4d8d1c3071b2b21ce268b8d0d3367d4bc01bba1c68d1f2ea859e387979a18c09a6c7880d95073364b3565d0ab9a19d4b2b091e175831a2b180d3859d4d421b6f17ae2d5c4cb891f37a89101784718c3cb0697198e858f261717ae12b846e02ac2b585eb042e295c53b8927081c015e59a72b5c07584ab0617169716ae14b8b270f5e0f2800b0bd710ae255c4eb884706d7129e17ac2b5838b07d70f2e1b5c50b8a270657171c065848b05ae15b8987055e1bac275832b07d7932b042e205c1f7005e15241cf54cd183364b862a8b99a2943ac439cc3e606110e9106e21be21d40bec0711273220a8068b169c3956433c3aca3c6c4b303073cbccee891c30e0e385c841b7899a1e30510aa1a143555b5276a4e4c2d707ee080033b576021d88961a7069c295810af357464086100bfe0203141600387cc13322600bbc0f100e8458f25c02dc030769a00c1787d51b1709d51b3807140acc1cb8b9a06ce11343000c204a40c58075e65d868a9b1012ba9fe00dba1034137448ba047053369bc6cf0838d1e3df464515bd0566ab8ecf0a0d34563f1d9507bc0116205162a544da22e5195a81e783272a2462a9e8b189731052e3b64553eb8689911bee18901048d57171d2d3836e0d48033838e0e325f006143c68b8f06b5a57a458c8b2ae5aa636c72a5d1e303a21db58a1a11b5281f31e058a92800a2850f18ea0a5e50d4cc21dea0a606231a43b8801101f321b4e25b8833a82a10e5a849c2d10296c533e3470c6a5c5073064e08bc1fbc19bc2b5e0c3d33e8b1a367e81a7a072057b4161b1d76b4b8c2a01903e452bb41cf17206a0021a3cb0244059d53a743d7d4d1d075a0d3d2fdd005d1c305080f3d5d741ce87ce87ae878e880e0d1d2edd079a0cba1fb40874377031016e00c61f3464d0daf0d9d1c7ab010b700d7d0b9a1870d73861b367676e0e14167079e2606e060c101838621e3820ea39de8259a896ea29fe82e1dd55f34091a0a97aa5cfc106fc423417304cd123448e41891e38408845884e834163192603402e4400d23c6464c8e980c649e64909029a207971e60f4e822a7889c12e488409c41e4808885468a460b1a15c4ba88c120e60558450503b442d64566860c8c19ab993b66eae8b1460f1af460237644ac043124782cf168e22143ab8adaa56545cb8bda45eb8b2fe245f042f838818f2d3e50f02178103c11b12b625bc4a44627c629c6a81814b12d3113f810c207123e86a8d9e0b9e1d1e1bd018301ac0cd8182316a31763163eacf0d1021f57c8acd00981ec8a0f86efca1783a884480271095087ea0270872a06a8e585e5b5c38b86d612b5205a4c842c08c908b1a835d42cd586fa058d153eb4f808c2070fad21ea0b5a21086f107e69bd117620ecc1d3a2268697453746774617032058d870c026861aaa9a1bd8d450e3854d520d1c364d3638d4dc5113860dae260e1ba69a2f80cca16307101bec28d145f42cd136340d4056d0589aa973681e3acb9ca3710d03902ee6d5acc1b4c184a3c76a5acdaa49032052736ab66066b164a260b2604e31a5983f4ca989c584629e60e6a609261573cbfcc05cc1b46246318998219843cca46965c6309f260c1357c50215983e3c994d4ea8b820a505a1261098400424f08006a49000144e40c001941820090953082300100091282c38c07979c648c16a072a6a528125539a00b1b0640938fd4914a0254b5abf8127529c003dc1f92b5c548401202551a440292a025a00f94c1cbc0c34bf24d4c40914222946455058f0e0956c3e89895a68e1f556b8a80848a8c7c7c0310f03b7700099c7f1e05c090935712224d48400349c3bb848084a1323a0274b80802cf0018e1d2cc50251a02cc10011900b434ba04cb94651805ac04013141ee70b03ad7003067a22c5c992274da4084d71c1060c64d4048a519426464551a0c870ea6021a1264e8c9c3421328a228500301c2b067212454a94254d9c44918200a3282e4871e2e4f6c0a9019429170345500a80814be2d020041c3a7270e660189c19b01ccc82132953806c70e26022175680628128529c2c8132e50255a0894d06a78a8b9e1035b90010d19215a24079120568ca1228536e91901429284481d2821404581c38780a14168a8880a25c40ca120c00057d80f3063f018ab20294a2282e18357122850a14178680961811499902444404c70d7e026589115011910b4e6870dae0222028465088a4b060e44293252b2c8132e53699f2244a1322127ce0c8802f0065ca25020a2292e28013481c361808c80520171290c213a015566892c20f9c35b828c809100b4ebc7091511420222016a240791c35a240b1800d4e1aec044a5114284446558096604068ca94264b88809e084171c116e4448a90ed06070d6e614913a3264f9a18011d0086734606a00835816204250a14191c3338c88914a10a2c013272c109501520189c3298480a01429e404215686214c5050b2c3172024404e54914284b96d0e880367c2083918403c3ca97cb4820e770b83b919cc66355b1aae694f951efc6c6fb273d1bcff3bc27c99b1b8ffc1beadfc75f7f5d6b77adb39bf963effa7d5d2be576e68ffb03e9f4fad1a6def7791fd013fe987a7b5f777fb4995b74ff9add99b2338b226566ffd8fbbe9deea87760f7d755efcfbbfb1b476ef70aced44a99ba7762f56e96d8ac3a99bac74ce64a65cd72cf9d3f0fdbe9d7ec2f661bfe987ecceca4dde9e73895dbbb72f5cf690794fac7edb4d93f76fa71d3ef73f7bc8fb6536766ca9429534ad9fb28f5f6ef83317b53a64c993fca4e653e66a7cced9476bb575ae5cafef19021428430c8eed4e5a20e7a575abbdd0586cc937a5ead1f738fcc9f3b6598bb5377efd1dd2be0eeb0eab5d6dae3d8b4dbdde79c3e67d3f6f6a6d4bbbf6edaecd46beaf5fc2af5c09d3af5599dddbf70c645db43f7daa42ba5ee2ff6f656bb7fee1574265d57ef4a7b093b8d31b37fd3dd41b052a069482b0dc31aef1a760fc309788712a8719ed3bf5ab97b727fdc13e4eb09e21e0176770a1386ddd3b9bb99fba3f9421aeace94db2140a97baeaf7eeef4f3a8473d66af52eade5fb7fb473fef8ffbc6fb3effe6fc981bf600dab4ddbb2937b37fdd1f7bceee7d2008a34054a820303bbfda1dc0cc3e3bef98b9fb989bb9eb66c7ac6eba772c67ee58ecccdd64ef581d77ce9a5dd771d7755d73d779c71db3983b666618666f6731c73033b35831cc95997aadeedd9f7b8e7b7737a51ed0ee80f6cbddbfe6699e6e8fba7703ba76f7a49501ed7937ad1fe5e9cddd1f7f5fc7d49dba376d4f61d20528c0030e9d7f780218051ad6f41ac7a969202774cb7cddb06eeafd79b57e8e0098ce016a351d6f1a86ec734e9eacf6febeef874c7ba594c62adb7ccc95a73bedd0dd457710e6e476b06d427666a6dd4ca33edd41f77228655a29ad94b6f70ca5b45217a5d4044a5db429f5da5e2b58bfaf6777fb6cfe3e9c0efae3e993d99550e7ea6cc3ce6266af71f7cf6b6776f630c63e67c8ede2768ecd364077e8edce727767d51866f7ca732661febc69f3474343536b7dbd5e73ce5adbbd84f6f6aa57efd09d046feaeefe7277eef9f5d7947e1f87cedeee4dab778314ac2085e9eee6ea9f37280382ec3ed929ad15a4947e1ff7d7d49d7d4e0ec3574e873e42483d44e2341e76bb7bddcdeeeeecfc7ddc55669e9f659cf979e8ec79dd4eabd7dab47af5efebaed56937add4a35e53da3da7cf39270c4c7be73c3bca6af72e403b28d33dfba360d7fc79d8dd9336a594b67f4e00dbc7edec3d99bbdd3fff3e76e6767667766f6766a6a0e73ebdbda977f7f4cf999d5266fed89ddb9d32333365fe98bfef6b76ff989d7a5f6f7766767777fed8bddbbbbf23dff7cd6aedafcee97d3319113c99effbbcef930d4000edc950af7e9fabbdfdfbbeefebfebe98f77dfc7d9ff3f77decf4fb78ec9a366d9036edcfdbddbd73ea7ded1fcf39448a2153380f6e0c10496901a805cf8805a448219a0242009e0011013d2192b2c427841e20284446207c0043d323a5a60b72d2a402424252402852d3c3470f1a1e464550aa00dd742d48e981620120a22996031b98284053a634b9f10b00450122ea0e5a806214c50522cb81058c5ce8c14115201696184581423465899322282ddc0cf1e95145ca058c7c3461a1c8475013274e80827c42e8e1c14188f40459d20314d444a8024b5688028585a2262cbc102128413c00f8800807690244e4032868895115a0283a3e3e807922048505274b8c845c686201a027b4ce88a88951d1073d1cfcac00a5888c7190220c00052d710245a8022e4c99111575d0e29ea22220a2292d4871b28408888a142740444b9a143d7102b42448904f083d539c0015fdb0587062d4a4024b58288212058a05661f60c002508880a870608980a200adb00400414208a1e709d0122946533040e4a4039610101520a125559ab480035b418ad09215a240596105294234b3051f0c446401275284849adcc054017a12054acc94169a181501b500c5e87b449102c5c84993a2284d888c96184169a1022e14d1584f80808a96b420e5499426443606c8a88951d1922022291730028a92032bf2596116821150d19227519a2c01226a32a5052943c62640424e9600add084488a51d112a1264ea4088140250a90b338c8922852a014110151594224c5a8c91328424da82c2982b2240a94262c38b18005a42c31aa02c401952840fe03aba3f986d44cf805a466c28dc462c247472c9009b7c20e09e9e8e8ab48ee47484820528b09231d1dbd8e8e68bb33399a4847474794c9d13cbacddb64f2c27c611e1d1d1d1d3192787474243261a48f8f908e909c9190e6d1d16482348f909ac96dde6ecde485f9c20bcd848f90909cc9d13c3a6a2647f36832e1a3a3a323a48e1e1d21cda3598f26d264723499091f1d39133e426a267c74c448481f13a47974e4313942ea98204d24a46682349991281346426a268c8484e44c9026d264c248938905bc342633cf168a9a70ff6aba2dbecb9bc2179ba6703ceccdfb193b61ec6d8ad3fa61f6369d5af6e654377762d95b3bc9d8a6622aae72ea625e8cbd219102ec61fec6fa1bd3105beb6f48a4d0bd3775fb6f48a450bfeb5c0ec6de580fb373b4b709e5b4fe97bd4d97bd7993686fdd14da9ec24d2876c109ea68a220cbde9296425bcbde904881f5f46f93eaf6330db1517b63d949e5b47efa9ebdcd29a7f577f6d6d5766e7a36a8a2065a90800530cca9a9c58c21d4f882082b9f3dea2b9a5002872dbef460a37656517915a572a2534d533447713977a250de975e0555e5509eedb450755fba13d5955367bb266fa25ff6d477757507185faca087266a3ba6cecd37bc08c30c20a4c2b0b1cdbf6cdced8f8b1dbc7842862cdcb0b1cd6d87735a7f39ab6eff1cc138bfec70b7bba9cb1c1c59a4d933361c31c711671c31c611611cc165882e59dc0c8c9c1b4288db0f5ece0d41c5104fcc1a30bbb3b395796543826b58f0c86e3ffffc59fbcc3075fb6f74daa76fffecd86d16fe36cee5c961ce39d9c66a98c3873984d395f5cc2d371260cf8668c26947f0b30d091c10081bb60640bafc2fc840c4b644c4d6cf362bf3cad61609b64773ea809492486310fd0f6e89d41d5dfa25eb006cc6ed2c11b57b26eb7724253b57a2ca562d8eb568a25fb228f9c105278b10f8e01e4da4ae9b0b281f40e625e61c9ad77fde00f293f00738346f3f0f5e6ef8dd3759346f7f8b25f065d9a0f9ac269a5cebdea8de21bebae0b73842f8ad16d87db348ce817ed8e586cf7a10ecc26e3dab45253409ebc33fd2247c0ffe24c16791e1bba8a4fe9c96b936cbb6936bf3590f9265b3a8d43be477e08c269237db8dc9f47f5c3a9f7970bade7f28a8b003166eabf159fbd878dde7cc98b0204667f3d1a38ddbe9b44fe9fd8c3baeef25842a30699f8ea54c689f79bbe7d1c274bb1fd2519edb3117299f9a5bf219b7ab3fe57edffc46deed07694efb74443d45254beef7f5fbe6cf32ebb00559a2094852782dcffb727edf64b51fe99125d2f5823c31c967bfff6cf98267cb79bb497f70762bf16f25d3b34ae677f737e00e425c8fec260cb7accfb9197c18c158fb78df3d1549a85fbe709564c270eb83dcb8fbbd47d68f2cbde73fe21e0c777e7b55f502d6fe793dffd83ee2f3c7daa7f5cc7ff339ed539f7fd63ede23dd16297e25914010fc231d9236f559396cb9f4451dbc07b95cfa1e07ceb8f441fa208834c367b1c00727f8437ec1076b908d92ef3bfab93e259feb03bf3ec86a3d5f56cb8e509ff5ac1db25cfaaddf21e9d2a0eebf0fbf92f3b25c1ca1d56ab56c50f725fd22a4138a906ef841de9f40ffb3a5f7a165f165d52e6431b4e5ed86ef912fd27b89394839935ebfc41cc4fb693be2210976a147fabf48b6555209cb06894f5f7c16910c896314df3df03d5b8a0f5a1bf0bfef94d017ad0d6895d4f7be821ed9fa2fa8d64f49fd6a12fa2c5b7a0f3e089265f836ace70bbe47dab0ec08dd830f5abe1c98e3d2071fecd06b3d68cb794befc3073d6c91e197f386df8d002601c1f767d9a179c57a7ffaa02d5b1f92e0bc1e396f8be43b2ff3ed8618b9fcec359c0168182ebf8b87c8d1446a7568039884410f5924c16d39a75802fbcf13fafd595f562e52bf6479e86439aff760fbe5760ffb32c8a1279e40df6d59af7bef950e7e210d3bd10095eccb22e7edbc9fff89273458c5138edcd6b3c8790d8024c56d3dd80a5926208d10e50e1dd52421cefdaa880024a7db7ab04396480292d31d62725b0fd6b0251a00c986db7a100c5962121eae1259a20948b7f5a02b641da0cbd7fdb8997976aef2a8e97a0f86218b65cbda2e5779e474bd6f91cc3a65ebe787e209fd2d5b4e164356927ecfbacaa39b4588ebfdbc959c17ac618b49e8fb4f71c86f903802d2ed3eebd9f91e34df46498981dbcf17a94e2f892c583c0a0ee4c09405072f138710ecefb7e99e67f7ec9136ddcffbfd07a3ffc1f5ffbec9ee677bedb5c7df5ee59eecfd11f7c8ee821dd90fce59c3d83f3b0f3b1a765dbff7839d38028be17d3357f3dcc976ecd907d791bee95b803c3b3082b387b193b89cf3418ddb405cce7540eace2ee778b04a6264a5ea96485178b774e1062b2eff6bf6303a1597731f58e2ce2d977340bc71752ee780e0c01449686541758798dcaa1feed091eb9646658c2103e296464f408065dcd2688632ba5b168141821f504cddb2286aea561c8eaf2effe56f1dc0a179e98394ecbeebbeb8f300fe6dcb5c08dab8f4e9cfef49da28e9beb8f4bb2f6e598474e977cf7788afaeae1ae9f6776ddc79c4964b5ef2821d3689733bb2fbe24e9184a72233ad512b7927c1eeea5a9b24f3fd4998efd608e4dc105eae51dfce96fd54e6f547bae47592bc6d045e7ea46ef69739ee7cd9eb3ffbf9fd5d3401490adae4fca60d23e76e38e3d6ffde6b7d25cbd607b1be7ef7dffb834d860fba481bd7f32d91aeeb3fb2ecb643af4bc5a8afebc31769e3fa79c70769d80f36699384e270177c7afd82df645f16934c5c8b24b8fe458eff91ae6fd2c317492f48c38f643aee8bf40b76e147f20dee8bec0bd29edc7dd41b3ffc8f643bee8bbbd9d425be5f317c316e48f68fe4eb8ff88bec38e8fbfa6e029214f5b9d63fd260f308f3bf2926f9beda24f11bbedfd0964851e070b749f0c129ce1a46f05d24f8305cb04317093ee86f5c90cac1735cb00b5d64d177a9f45d81685ef0a98864d230820f52710416e3820f7247bb72e0027f0b2e86eb22792ed8627d83e233d75aa0f8618b2cfdb23e64852dd6832451288afd21eb5b248b26b00e8b9fe707ebecd8336aed752beb996b7e5ec029c3482fe76e78c19461ec2ee76e880173ad83eff3bceffb496ae0fbbe2f0d9049708add5cebbabbab5ceb7e921ae8ba67711124fddd73e5225420097c5f0f32333373cf6772dec9af906baf6f3203a3ebc50f1ffc0c8cad677dfdef33307afe7af5bf5edfaf31c05792efbf1659de777d677d7dcfbd7a2cf0abef2495796bfd6f72bbcbfdddfead36a8fef72c1ea0b26c8974599375abee5eff880fdd6ed76675edda3ff9491bfff9fe4ddaf83b59c291cbac537effbd937cbfff2a9151788744b873caadcf621226b77eb5cc3a247c64593fc8ff7bb092966888ab70b86b04735bef6e14ded6d767f1842997f547ba92444322dce69abf91776b5f7f164954dfc8bbad6751c992cb7a9c2111eee41aeb2bcb32ebb83842f7b592f3bf725efe8e2cfbe733b5b5674e8e757e5880ecc1bc7bb0f307a7c86d03bfb625d2ed79fb9899ffe33bc9a1dbfd6693437e5fd33259d25a2793ee43dfd5d5d5975b9b1cf25bed9077cfde7f64f93d95f10a511c0cb7ec1ffabec07075a9d4921544bf3edb72bcfc4d86fd54beb27f8888ca778b90eeb42c2261efdba86febbd6fd9a1f9e5521669d497beb5493273d7bf4524fe1ec9e57cef9da4d29ef7b61cba5dfa5d8974bff9555bde6efd26677777fd598434e423f0f77b437e29b5414aa892f96e83f89b59b3e2d03327768055c6166f787a2663152e32bf6fee52f1441f1f7cf1a5ede37df8fccc7359dc7a2e3243f2b9c673f9bd24f5c93abf4e92ef145b606b04d66b5e904524fcc1c69eb59ef5e04f11c9b425d29d2cb2458295a4326f392feb2749655e16eb2bc99782ae6987fcda8ce077feb4cf35fe792bc9b241f5c1a7e250bdde8321f862fd14e7d2e86f59967f82952cebb35ab644baad89a405daf276c19f248bf49eac33bf340092149759673eeb8ff8d0ed7a3fcb5be490b3fc59e4541afdc726f97e64ed7a6425c119ceff489b6987e6f52c6fc1e1ee8feb8900f426a431a8fb0f6ed9d989a5677c3937830fe0c4d23e7ce9037111229e4b043f12a7f1f399ad6793966a36ef99626c58da2776e9d70c29632c85eec4d233fa3c68a090e4fdfc23fdc2584e2c977ec9685cfa37fed16974f8e004104e4051e17036efa96d92382a821a4010431027b0252dd56cf399626cfc494b6dfb9e6900b6f91ec93400db0d8914e6df50701afd3975e97b7f432285ef3d7b3be234fa9fbd219182f7d3dede69f43dcbc3b9dcfc92a7980632a8800837c230820c2efed21f1283916d483a6071821f7e98a2cb1233b0b18dbfe4b9f4594ce17138dbc4d23e1f5cfa9c436dd06ceaa63f80cc454a1ea457d93e2dfa1da547d73b332eb55de97df43f1bc5b3a5f742ae44d5edacf7a5dbf276a92b612d6cb89e25a2765f1e5d21241fae17450049b9db7d496d59e57a14d6a2e9765f66e052cf46e1336e67a79e50b0f30515f4062df7e672aee9cb053bec48226efc47afabab2b1f6c2c227033632861650d1cfd39e4575797085c0f1a86c8e244d48153125238a3297cc62502b7f30515382a0248ca55c1b1164d36fe3203b77be60030ef949cb3a1896b342f1131f0193696c5f11936b637fea3283f7c000c18bee070b66a7149389c8dbfbcbddb720a48c34af253d2bfc506ec7c31c5958d9fc506c0c81823047758b9bab2f1c7aeb77702d02925bba7f3ab5df7fe951cbbce6b345cece2b8b29e754fc979410fe97b1d9d9776c3c0bf72112f65d77f7a7d67bd7befdefbb3bcaf9ebf7befdfbbfb77e4bca047f2ed90b41bf48f74bff7d37b1bfaf3f6b5a17078df7d5e47ce4b495ab9c6ed06c8dd532ee23d7fe791437ad6bd1997a767ddb3e865ad52df7f5adffdcc7fc0effea67d68cfea774f848b3cd7ea770f9263d3eab7c8dab4caa3fa8fac69f5bb97b50febbbe72db71c72bbe7c145ea3b55e891fcc1eafb43dd9b9ed5ef9f3fc5fa36dffbed6bf37dcfb91ad4b89cab018d2beb597d6f885e96e59ed58e6bfc2c528f9cf7a891ba7625406e9fcf9ffe47cedb91f45924a17be6da08fef4711082c503f8d3af4f6d592ffd7e8a4355926280017787ca0bdcc08eabeb7d11d2f56cd1674bfadd91423529061868951695545b56015924a1a34fc511bc67ae95dd47ceeb911d126a6d92f8d3f7a736a89fdaa1db2dfdf677b353007e0f4e1109f8e1775f49f1998bb8de7bd0458e8074cbf0c1677184ea0aaacf1f9265fdf9e014d9835dced520c6edb8e6b53842f78b64fd16392f08b278807e16eb4592f52d92e7b3888465cb79d996ac6716d90ffe9106990c1f24f9822c92c0367cb043909c9745125a97b956f283e00cc1f08f34872059490c8ce183dfba654d526f688358df2059b27e2ae967cd568be4cb22f956be5e475292f68cc3e95a409e32d22f65b77b9eaee3b9dd773fa47b5913b7fb9bfe695b67e4763ab7fbb17dfabbaeeb9e733a1bc4b923907932cf27207fb0b0673114daa77c1adab8b92573b9f4bbff6af7f7f3bee42ef77b229f4f594b689f7264a17dbe37d23e35f77b15da87733534ddef25d03fd4e6dc85b7dcefb97d6c6e19bb2591fb757fa46fc0263f21a608eef760874df6952171bf07b927bb6b685e5dfe3ed63ef4bfefbfe79ccf0671953fcdda074baee797b21bf6e176ec3e092ebba1fea37fec9200f20e19230d586eff386120bbc029c3487b369f67fc29e92414d0b9b87bcdedfff096e3cd097b46a3009e230826bad0800439dc20031bc760d4b288643e1db17ce9b17d64b73fac3c6d783987a58d4badac67937336009968ec1ab6cf1c3b00b91c1b745dcd30c70d888445871b9e7000a34b1177d85804e7734ec943ce7bc1497b36699f4049f06cf9d7fbca1f8cf6cc96467e5b2f6b1ff0fd6fdae7033f16cb96ac6f3deb0b7b36b6cfc77a7ff023e7055924873f451278dcd096e1b7fe23f986a4915fd683b379baeb23f98224df168be49e95b23bbffacf95b771d3986be5cd9db6f4409fd323f98a30bf9246dd9d21d86195eb3d93652d2b7fb0c9624ecffcbfff9e7d4c52b29cd7238dfcf24f72ec19dbced69ef578bffa0fc5e170389ccd7fc645fc7acee569cdce03eee493b1d6366e7f289bc187db7ff3649ccff34ee110c96bc42b6d5cce5d11e3967ffb0a16f7fd47a769fd8d047c79df5988b40fe7ae7cb9fd46a67882ff7c1681c672d63d11cecdc074fb75fa67dafa8ddcdcb44f3f933c3d6b9d9ef57b47922cce581c615e9d9e4d71d6b37e0a8c47b7b60fe774371d0790c9381ff48e9832e2703818669f30bb7da4670e23e736c0e57e709d72112e1a3977258acb972fd885948bf4e5d2bffbf9a00bb26b24bbfd4e96936888af6ebfd177e9839ea8e4d52473adf4af9cc4fbee5924c1ff3bd24ef2ad64d97d39afff47da28f1bebf6d50f7def3a5245f4f54f2c1f52c73cd9f8a48ba196576fb67dae6d31695700da2cc6e5b3bb9d6efe209b3eb96b9d6967b3691be498d00b9dd7f2673bb2d274e54f2baf49da4422fb5cccecc5ce3205dbc7a7693bd05387f82977332bc60a6d132ccc0bbcb3919eaa0fea0fbd0bc9acf62166f06f1724e863ba693f37e97734c42b02ee7984470653d6363d620037617b9d621d7fa99ccc0c839a62dd72fe7985070cbcadf2f32c9d4c495f1e775d535763b80dc0ee89e1af9ad1d69e437c9c4e170b83b9f92464eef7c4ae7146386ee0f3a39599c7fa4bbeefd5d44e23d73f2eb9fe2fc16bde7a40138b18cf3d9320d387f9224f0052739831657d6b2cbb9a52fae2c1eb688645eced55075653d6b71885ee61a7f8b4886e6d5a5e15a7f8b24cc4b9f4916f927392f9343f3eace771109b5b19ef54f52c6b57e273530724e862362345c846fff28e322ad20fac10e1685174e923d58d833ee597973e7bb2ee764c8e2ca7a361f64ea3db973790e20370876cf3dab5df7471a04596c40bf2d912efd239b3b8b2af8b7bd21d96ef4dbe64ede906cf48f746d9fcafed35f1af95561e4cb29cc777b3bb22d213124c2f57eda3a92da72deee3db2f4db7d93fe47bc6d2ca6e0b6f9479a927c9b641bf74fb521f9517733813c34726ea98ddb5dce2d65b90c63918479fd8fb423cda9c4a70246160d807429b521d29c0570b204e49e913091f8a74842503fdf20b64347977fb200b202e81d2ff8a29d9b8074fbdb863df3f7a79d4742bfff91e6f6b119a1dfdfbd9f4f6bfbb82dbb0ff2a7ef791fb64f5f6fbc2a00590123f8a2bf84e5f2fc72de69c39ed1a70fbe4c18fdfb878e2e1d9a97da0a80dc20b74f7bc824c8394a6d8497a77d4a23df3ee5cc48fbd0f7d7699feffa8fedc3392531ae7fac7fdae639d79fdb27259834ff120097ec88e099bf976002e096d4a1fca71301d3fc69ade328fbffe0961fb478025371fb6b869431f214976f49adae9b20e91af5a5cff405705954d25d6abb6e7e51204319f90b14e42eecf21727e052afecd2f940a0187279faf7a5ce65066282f173da87763f85726eb524bd030a19dcf9a3fffcf4ec87acc6ed9e26d9badbd95228e73e1b23dbe6b482883b3830f586153a9c61732ba048e3baec7e4ed3e603891abdcb3928a86ef9777aed5e80dc3eedd94a96f5d6ffb8c8e77111afe3229d73116f2ed2938b4cae79cfdeb441defb7b5e93b567f57bef67b565add7fbeff3bcaea3d4bdb9487def6792ef76d523eb7b5d3f3bf4dda07e4a96fe4548b7bf497b98028bcbb929a2e829a06e0bd13ede50fcd3494cebff61a6958d85e5c33c2b3bcbed2f6197610f8021978342ea1af5f5279a4d65be006e8b27787742b14e7f0f31f2852a29974b446fc95d54e8d9a463246f433581ce3c9b30da339d9e75397358ac6736582e7d1bcf8ed0d77bf642055f6ef7448c4471fb5930ea1fcff517a07d38f74413b779b84c223ee3ed248ac3a27f9240272438f7441bfd1ef9002b73900fc045910fc045d133be3ced53d621edc329788015b639447c76ec9b9e35ec0131e47ac677bcdec30fce56f25c2682f4c412414081613583191c61632a2ef3cf8ef40fb5f1330466940f4fe0da89266eb71351dc6e9e198ce53febfb6e0ab2489e32185bcfb7f5f3bfd6f741f4e9839d888465025292efa72d83be9f22fd8f0cf23e4a270f6bfa1b15ac19e286d3283c37c83fec197ffdf69e7e29c473ebb31eac64ed591be3f77c9b45d6cbfe536dfdb59e4065de69a98dc2733d1b44bfb32358aeb3677077f7f9eeb3c7985eb610caa17d93dc44c5718650cef422c4236344172210e2f9beeffbbeeffb84be28dce5234beec25d7478867011f0f96ffa67e6f530cf1f8e3d00a6b7c9c4629e5b16461221f331b171e61b1623ebd9477bf67d0c19ebd9f733e437edfb1639eb190cc917f6ef3f32b0960c599bf63d8c1c7bf6fd48f2f4ecfb1739a467dfbbc802f4ec7b912ca167df87a4093dfb1e2451e0daf7ec3f449af67d3f7f8a23f46d59eed95763ba0b0128da92874b17c6e2b22dc51785786e149e1b147eabe4b9b30c6dc973c3cf893dffb70fecf9cbd88d79181869a467fd317248d3622cf8230cf94e9bffca9189e28ffe03f3e3f7c3902c22196d19fe57fe15df4596e3156d19de72e48bc20dfabe1e39d2d8b487cf96b3fb31598e2e11c808c67f1739739aebbb63f7fbf0b97fc2a67dff3d7873bf77912212d1d69e7d7fc443922c6577da3246b2ec67bb882ee3f89e9d43e61879cb9d638cf5997462ccb83c1632def295467e8634adfbafd67194c9fe673c3debc68f2c6796ebd9982582c575e6be7624c039bbdd29ed989cff8948645f8c6cbd18d97a3306237fe7e22a76e8206d752c2fac3d63ffce3fa8b3b567ccb3d6cbcc9fabac72e9e5cbb34507a50e7ed37b1aae75f4e69486d487be77e1e4e2fb96eeee20839f0472b808e55cfade046bc8e4bbe82efd4f4442ffa667fc32aef14f19c930a21d2dbfeffba8571a399805e46286dc1b605b9670895cfa538c71be1091cbcc52e8bc80bad3d9656a4ba4282e7df79f618cf35d88b75c3acb18e74f2e287da702049fa76e39a48cf5112ea202d7c42fdff5e5ec87884effcc9ce6e1f74cbb7eb5338db11c5b3cac073b474906ba30a28ba62bc4c3c5849eb946a74d7186e4bc2209640463498488ffbcdeffc88b046718b2fc27d6347fff58f86a8c446e8b88ff2421517fe96daff72f40fb94d5a7be7f09edd3ad677d68cb1b6f81ef42442eeb5d547253010e42405d21ee7259f4b2c8b23d7b7d2491c953617b4ed417e7943377bbef723b59ff94e0b4ee8938ad7b7e06b2c548ffd6b30ec8d408648ab19c5aa696f6e96f6b342f121fdae7733aa27d3e4b0454fb44b58f4d4f2cb77bbedfe8b4eebbf17295a55c05640463f725a8c045d0184ba6badd3379d23ef5bb670137a56fed530acdeefcfeeeab98506dc95c5c44e259233a9be05af71d4219fb482023602d3dcf184baeba5df7538c4a2255e6531212f497de2644fb94d3a97de8779f0f8b48be5aad106f51a28121b8f042758598ea4e7a3d925e4a7208f363fdc3b66aebcaf176b652e7fa7733f7d9c0df97eeeeddc75dd7f1cc72bcefefc85276f9fbb2eb3aaed1779f1e59c62e7764195eae43b8c66347070d27173d3db2b6c6e8d9dab376a6773ecffe32bc73ea08d7d8081109e480219433847f96c3c577f937936a72573bebc541bbae637ecafcb2aeeb28384da0725ba270fd2759f2dc39e79ce5ec9ad0b37e27857898cbed233deb9fbc85889139bb5c29223d6b4a96425198ea064d8b44a73fa1d333de22813b9fff36c5a8bcb94239977bec596cda92c89ddffd4ce7bdf7294444c65bbce9348020c8df24ebdce6b94de476f9df7739b7ab48c25a8fb450cee5a79c33e43291cbb2d28bf5cc93fdf5a6673b7276bbfca6946b311691944244eefcb6b3fbc299bffbd2f3f83dfe208fe716fc938b7e3ab718e7cf1890e075dd7bd77d10a5f426d67d4929ed485b32b9dd53727631cea746dded3a4b72d9755de74f20b70fbd6077777b7bcb00f697eeee3d6bbfccf432fbf897dd3788a8af5f5d3107807ee9de414e49a2795b095f5d5d6effb2bb8d5a890817c9a76701e98325330d625ba70b2a7391c945f896f4b9b6c6382f7dfa5e7b367ffec806f885970dd0e6394b505582d9ed449313b8ef8201726fc0eaf60c07708740ee12702901167480f38f984c7c694288af7d027039c744976be4d7bfc8fdb84873cd595150b18aeec585f791f1b1bcd4d7e55c1371b0445ccb69006b53a8456c05e1a247bc6050239d02165601d3da2226468232623130323cf50a3855408239aedf2e0196db3fc4c80765c84528002e915bde9044fe4454c6cb3ff4978a5fce5d4af6b8200d295943ca2ee88594e471c12fa4e4cc056b48c9980bb2424ac25cb0155232c805c190923c170c434a861714434ab62ee80a29c9bae02ba4a477c131a46477415848497a419890927ec19890927dc1180c2c2626e3b24446e3ddc9ddd0b580f30aa8286e49a19a8082f280169d86c262ced9ed05ea0caa840f4a24415929d1841249283184a7441b6228a1c496fa8d97734ac8515d31b0bca6568b0360750ac1277189dc12276831e10ae7d42b146364282e505bc46496f012c25c2616de662249092c4b58dd3126b3c41bb5c28493891a6238c74416d8f8728921d8625518170c16e04cc1571954d3edc94dc059c41836146e323373126d24e18593f8726524c87c11d39fad4a9ebaced39673887333b72a798ada72e6b69c35151628d87f3f8e0ffbbcf88f0c4dd9552fc8946d35f323e3f15134b6b574ee3fd9287694d31aca69dd4f4e6ba75c12b95bce2a9eba652f4199ec74923dccccc7bccccfe75156198c2dff636c29b3e5e8d45aaa6664ac66aa50cdcce0bccc30cd3055cd34cd3459c954dd923249d9d1025bcdccd4cc8cac8b4cf6fd4de53f3c686c6c2ccf6a6a2c0d0d0d0f4b79f008656f4566ca66acf7f3a7d37492eae9659c54cf1ff3b3cbf3ebd9a614fb39f52fb2e78e71dad74f29191a1e5353aacb949215999fb132a599b7223369ec0b323b3363a79722a4db39ae75c76c59636c39c2d85206b3e56cb4e5f7bfc8ceb195950b9ef84007d0880304b6594b2db551830db87165fb5c8ba8343c80abc3043656d73147087032e08ab0816c2859e9d2050c4e6063a7b95e7ca79af1c2644714554d6ea585e25ea04e2fd0a714c0616b24a66e4999a46ee75cb3d9d8b2a54c566df9f7b3b9dced9fe5b4388d9d3c5bd6a7ce962394d3f8525bca8e2411e534be6ecbbf50311dd303c83925cddd999f89e241130545c38366522d4eebe741e79cb28ac9c46233333433333c66666a64646256c94aec9564373ff333df3236375f4dcddbd467ffe161797c0d8bc682cf36997d61c6be20f3ad076913283e65125f4f712fd8bbd5b7555b5575eef3a8ea50ac677fe2a9b5bdb853d15792b1de45e6adc4629e6d4a32d6a73e86a45ae69496a9db1ff3e59c1a81d32d1b57c563d556fed34f4eebafa3ac9f6e3f68ad1ad731b69f26ae9fc62a1be7d47c9a5652d3d64f9d1a14fff55552b7ab6e4ff194ffc8c4bac81e05a74d2a1e305e669e9d36be8cccb3d35c6fc563cf4e0bbf63969d063e28533ff6e28c65a7b15ee65f3c2c3badf5330fbbc92ccff7532dfec3c3a2e0b4f93330b6e42e773ecc965566b42553ddf92f5b8e31cb4e73d992bddcf9a22d65a12db9eace07a996dbcfe33f2d5b56962dc7caf3f178b6ac9dadf3eb6521c1348c1c20e780ec3face707adaaa68d454e1b4fd127a7e12ad3d8c44f71fee3ef24d3323631ddae2375f72e5053fec3b62e54d40b7d826a2aae7226ff513a8ab1d5af4fadf0c9296c396979a55ba8a5c97f94beb7e255eb4c4eebffac37b93375d465bafddec5f2fbf7f4bd9fdfb2b63fdb9e65a7cda6a6f2a2e5f6971d75fbbbc97fc62a1bddbbc828eef697dfdf915063e950936d2fa34fd73673d38b97cfab9a39a8692515859bca35531729a7b537a99a3edda64ffed3475831061a1da86105b67e0ae53fae830dbe1061441054d8fa6994ffcca519c0b8b2baf2c2d64f73fe13e40a1ecab85ada62eba752fe339da82307263a70c0d95a4bffd4e23fb76903bf5bdfacff89f21feffba784fd55fc07b42538adb79838ff695914fa2793ffb0ac0afdb3a95a262f789605a7f537f52e5cebf72eb7dfddbd9f8971d2aa0f89f6584515ff61b0b2be9c5a2e2f4d1beb5fb077f173abf52087e2873ffeebcbc974f92b09b333cacb6827d4d2b4bd443b9f467e1496a60df6adfa254b7dc939f04b2297c32f792effcc7f6e283c3f8c9c52e48b9c5d5ce4a422a717d6f3d72a4ef347c169e2f38f22682753cbcea6b6a5cc4e2d4e9bb6fc3bbf9c52f367b30abe3f4f0debfb13a995b258ef5f82ff80e0cf9c361fb4ffd992a5eefcf23d5b724ec6b263674b22d569d4963c7776cd8a01e49cb273255b3dfd92a7a82dd996b3cbb664abeb930463399d9e6ec9565655fed3a50b1595172fe594f29fdb1fc5d8fca793ffdcc4f7befbc207bf64a9af6b3deb4bce755ffdef4b22b79c4e2e7b7b41f4eccc697d7bc1fb723a85f641a95ccbca589c8baa76fc884079b6b2d34a9e6e2175d31480a327fb76da7ddebb9effc3faac16188ab19779feeaaed7088b81791ba6698bc9ccf0a8f9a4a56aa37999272df1d86c6c0d0d199391313c666448598ca4e120f363c8fab15a1c040c6b6c6e38480f1f381cc425be46184ccd746fba8db445df738deb9e7ef8370773b85ce35e56bcfef737f7a77f0bedadab9ce650537846960b1c5b7ff3b1a79ce6b73975e3d9e404c29acaebec6d56fd847a7d2e741c2bd7385c2ee46155415541b1fe6b2a707cb6815fb693d89a4ea3eb4b1e5ff65db64e89a1958176ec26961dab954d1dc5d83e5b9dd6cf36cfb28dfa0b69762b0b9073ca59553faf7bfef71ffafc1ed991569c9256fc236f325fc91b8f3f8ab1252d8936eafdd2b4794d947e47ff567f69daeadfba168bbb5f9ab6ce5b323154ad5f9ab6968cbd252d89b62426116c32bf346d37245288bdccdf78d8db8c5d9a3619ff987f8cbd4d2aa7f9c3d8a5696bf9c3ec14a7f9b3ec8d89d3fc47bb346d9dffcbfecd6597a6addadbe8347fd14ea71b3bcd3fb44bd3e6f9837636396daa7aef8d9dd3ccd129ef998ae7e3aad69793aa658f626cddb3ec518c8d3edbbeafcfb6fae584aae4477a6447ca9c369f92efb4396348b3bfafea8ef44b59f9b79cf5dc31127dcbf5ce62bd7d4104bf5b2dd0bec00a9f3efb4f685f68bd7e3efb8f52d873c73834ef2765530affc624c4f6b22f802efb42f879569e95ff88564914ad67e534ffd02a85e1f753eab3e583560904676eda52d6b24aadb7525fa96539ca69fed47a562cabc47a2bd5be409f6d4a2ccb4eeb9f504efb703d778c44def7cf2546ce2181eb27a927ce2181bb9e37359f9efce766c58f626cb5f5dfaa3259fdd638de723edd9884d858764cd9acf80bec3411aa6c4f3d778c7fdb9673887ecf1de308ccb5b256f6979fd44c629c498ce5e7e459959f5397f9d4b7fca43e29ff994f4ef3af751c65b25b7e52d79ffdffe23ea74fea73e2336ee94d7956de54cf2d3d9cf7e4e13aa82e1d54ec9694aa63a26add9236d128dad4ddd2735e5c8be7bacab5485955b513aea59eaed55339ad7826ee4beec253d6eb7389712a31cedb5fcea7afea32074715a9eb97179066c766c5a9288e15ff52d361ec26e78be9b159695cffd2fc6cfeb2390f9be3d8fc039bdb9bf74c426c9dc454b359712bdc92676ba6b675cbd630b6aeb1b5b53508b6b6b7ee9984786c24c9ca6763e2b1f52fb9cd3b9b8b3697b1790f9b7760737bf36712d24ebbb637fa4731b6ef6bcf7b2b2eeb3acf8e6e6f4c426cfe4c426cb718b7ecb4f94731362621366fd21cf8fec334b6d34f5a7a99edfba4a5d1e63df8fcd57f929886d89262bf44c4d6faa5d096b4f436d6d7e797f94f12d34d28be5c3ffe528e0d7cfe318969664b5a2262837dd2128f2de6976636985f92d9c64f5ae2b179335bc741e6272dbd8d7290f9cc21cce78f215d1c643e0c297290f930f2c541e68fe4c821cc7f91321c64be8b8c7190f92239c341e687240f0e321f24652c647e8bfc38c87c16197290f995ac1c020799ef91351c647e47de7090f994ecc141e63be98383cc6f128783cc3f8a99ad05e8d15f8a6123494c3c36ff256a6ba71d7dfeafb25addf3879dadaed70883f1e78fb111262ac34698c21936c214e3c146986e646c842987868d30e9d8daca9c6684a9deb011a6b1071b6192f960234c6febe7c761234c331b1ba1964536e276ac61236ddf69f3f98fe86c2a9073ca6e0a89b1ec9e3a29f1add05c14ebadb00b4e500714d3101bfd9b9527ffb137b732886013eded86f3eccd7b1944b0b1ec0de9082a64e8ec0d034a503029b18226ae6c371944b0517b3b52c38730b43c75c9c1e6f4bb4f5a0a6d5e8faf55b79f296663799de7e35bd489aae3f134f63c62ddcb4ce13ccc146da2f65dfc1b1229906fff063ef9379b07e9e76ecbbe86e2fe657fc3ddfe9c8b1c7ccecccddf904821e667fed6317ffbfec614b3f98714eab6573914cdbbfe0675fbab6ee7d89bf81cd8b7f63692f6760404dfc6de68aec6dea8ccdefcade778d81bc7622f636f74caa7702c6d82c9be656fd487a5b4875dd2b1d5677d39e658f5a6e66d605ee4f1dd7a98538beaf657279967395131958dbd895f639938ad7fc6de50705a7f8cbdf138adffb3b7251ddbf7a1bd5128af72a886a2b15df53cc5e3c9441e33cf637c2fe6f523d46d575d280e21c40b47257abe100422480d636ff0b0421925c6f9bee3f44b77770edddddd8180618e12351a86620e3a345dfc10c3d02592e0e038b95d25d205e1be42100b1a1d43590c66b090470c1fc0843de0f020268c3131cee79c58c8030b0732618b0576266cbd80e411be154f65a10f2a7068c287818f9a3096450f9b7044c10dbd0963399b1ea10f236a7c846710118387cb0c8be72d3223e390a9537322dca0508e713e75777797c1096169c4ea87231731950c7d60016343191630ca41f82d8d342714a35e1d842010aeea410802217e10be72086761cb0990d2c2708c560521fcae60fd087d00e1e9842d233a2021521312e37ce7aacb5f1391f07750e37c7777770a24a470305bba13864174e5093d2e6690b053639ceffccc3b406a3a3f40a0cd3ef0a0831c0e2cf9383e7adcd8d4d0c878ccc8c46260785c43f3eada24e1b93eaedbd202b608af5e3dfc3aea125fcf2292f18f34c82212d81f6998ef594412c3748c7d0ecf902305402105264fa618e1926653cf3a4bab95e32d5a9ae6985a9a6696f6d1021391cc2ae66c82b7cc288edc1614de64ea59e3dc0027132ea97d7c1ce793771daa00469c3052654a1b56538caabceaf0c1881025108922c2021339bc3079c2822b8e26225a4c1832c5101550f0d20585145410d7984943b0a0c043029e128ed0c152470a5042488615cfc4a5a053021d223c7610e11942045ca30d9d39549849319bbd0c669f336bd54135f322811c26847264630d1e7cb0caea773f4b4452ddb84e2f483a2994735b767eeb33c1c82dd2a8bbad56cbd69b198ce574fad6b784e8a72212f08477f0c90d15df4d8cf5e54d7973c1564bd602bf7ecb96e07f7fc46364949b5b3ef944245f3512c7752b747363be18cb822c0aef5ba4904c268bc53e161945764b16ae7ffdde1391781f8fecc278304484622808bf450ac5ca5819bb2d4a416e9fd67b6194d82d85aeff4796fede772292d0bd1cb742b10b0b613a53c613bce8077e39dedc502af47e0fb6c872bce00bfcd7d3fea14d03fff5e10c403877c07f3d8fafffc872ca108f4f45242f6b44ef28bbe3f82f925ea3f009d7b748a1f00365b2da7a6f916578c177b20caf0b7cd7d719803a77c0773d8b43e1f56c697443f09d74bd8b485ce183e477757555c70dad5078c50767e822e975d156f97018f9bdfb1669e4d73ba8919d9c2c67cb967f5bb29b1bd9188b8de16d7d19b640f0f35bff48b3482a2db2acb7f54e96357c7f3a03c073a7a4b7f5fe21c93d6bfd1107ed90b7ba67916595a1d92292eeb31e299e403b6a67cce4a00890bf2231f2cf0180ff334aa9fd2029891f1b500308aa314b07738cafcb393594408063ac76ccde185d7074808291950608368ca3173433466f8a668391750508698c2214514fb33ad200c20318a4418307b934965890460c52e377830fc8183d393ec861a46f7840c358d360638c0ed0183b30406862ac5b7800c4c892ea800553d0e2780206682cd102348ca08931d6343ad862a4657460c6c802c3832c63ddc28df15b0108478c314e80f0c4c81ac1075d8c303efcf8800e5acec0b2c6194a5db8d8f2410f638d0c3c9861ac29f062fca2e8e089b1b5841523ab08da0c660c7141b0327e977366fc70671c3043cb9d9fc3050f6a9871cbe761dd3c7f09fe439f7f8afff8b3cdf3cf9cffccd6f31f61c17f68cf38cff6f5fc44fcc7d5e3397cfe09e53f391ffb98e757c17f609e3d781e9f5ff6fc28f88f8fe7afe23f33cfa408822deb05e19bb499fd07dfc177e48d55aaf99bf748cbc1dbffff481cabe475f0b3af24cd2a75f7b407c91cab94f3cfc18b648ffeeeebc3480fac07effd072f439256c9929ff33c481f568926f3f56948259b57f2f15978b9207c4cc7d6c3c7dffc8b54f261affcb02989efe36bbe5563afb86c386f639568fef537f68a8c4de9fb9a97d97cec5b1f432ad9c4fee65d37effa98bde236251eff7a16a97463afd46c4ab0bf717deb29a9e4b25704605302df47cb5eb9b129b5bee66dec95984dc9e6e9c3904a32d55ea1b129d5aff9b657aa4dc9e6fb9d66af4c9b52ec6f5ec65ef16c4aaef7f19dbd02635392f9d7cf904a337bc5c6a6d4bdcd07f64a8e4d49f6aff7e04352c9037ba5655382f1ec95974d297c1fdf81bd42c4a6e47dcd8fa4921525245b8ebdf2814dc9e6fddf5ea1d99466fec5fa7ff227a9c481bdd236a5f16fde8a1292cdda2b03b029bdde87556259a5f19560af04f34ab18ff92bd3e6e3497be5c7a6c4fa1aab54f357a6edadd27ca57e257fa5eee9e3904a3656e9cab4d9bc0fabe4bdd2f74aac9fdf83548af91bab646395645e69e69578bc12cdcbfecab4d55825f095c257125fe9f5ae3fe2209047b94b43b2d3f865e4cc69fc3c48149cc63f4356711abf0c399d9cc61f23abd3f863481ea7f1c3902a380de734fe919c4f4e637e1749c469fc22c9c469fc2139999cc60f9213ca69fc2d52e6347e1679c469fc9564c1694d4ee3f7c819e534fe8e7ca7f153b204a7f13b39c569fc4d4e2d4ecb398d1f691ed1ba12017283fcdc73c738c284e25abf0a5cebf6c058765303317ee397b381184ba6fa619cb7ac138a8b14f10f054dfe8f6a4e8f6a2fcfa45d62087e3b8d51dd62d5afbbbb9b54e02245303f14f47abe4530b6a9b856ebe787d97236bebe9c512b98ba8d858bbcec7f2d8e9a358ddf6539b4207b5354546b4671b5519f8dba1dc5b5fe26b6d591868061b3aa4175db73652dc752e6e4d04bfc21309cf3f54114ea5f41f4881b97f841f44926065121626010751abd20ea43cffa893a5b06512d3deb328836f5accb8f36d1b3fe209aa567fded14fbf7be7bfafe9ef39f98a5514eeb87b1ecb40e46479bcbe572b95cee874659772fb7dd8b7b712d5ab468712d2d56fdaa5aacfa55454949494949b5935454545454543b39393939d1262ba7282b2b2b2bab693535353535f534f5f4f4f4f4549f260e377113377113a70277e12edc85bbf0f0f0f0f0f0f0781dad4d342a2a2a2aaafb69136da24d54ae2ef234e322e00fb59c862068cbefd97ca2962d6f7a36653d9bb19ecdb167734eff30ca25866054944b0cc1a828aa16ab7e54542d56fda8a85aacfa514545b9c4108c8a72d9b28ab61cc3a81b2515e54d2d56edffbca9d56255fb7969b1aa179d5c2e97cbb596afcb75aa5a4719ada202499d5b555555552555252525252535a5a6d3749a4efdd3a98a95959595150a3cc5533c35f33a3a6bafe7d3ea55fa51a6fe80538db2060093d314b79c5d3ab2ec926b531c8173458a3c5abba9fba0f97c51e0daa4f1cf6c62f1cfecd234c50880203272a4b9eeb41276fdc18ea47736f98f6cfc88fa0ecddb3f9b6617ff91c9c6b1cbfdbc26a70d5cf3aad9e7d1ef1ec67276995daeff6c721f6532dad44e1e0c40ce017bee1887986b1f0a5c842f5bb23d307a141929b841e1d77cbf47d13e6590f83639d7df6c797d0fa9f17d60017b9c29987f2e314f7ebf77699f92af626fbfdfc5689f3248e639285dcbd7e780742c3debb7a433f5ac9f243da967fd4f3aae67fd3864fb20dbaa67fd3dc8be21bbaa67fd3664d790eda56773d24cd9e43167a60ce9627817e7e2538e854bf916cf79141ee53476b716b0c5aadddddd44aa8f54d6a19792bdcc5cb3e03fb58ea34ce6e57e2587442691d9fd50277573924d5cebff6c39f3d23ebdb47be9597727f5ace7979ef59ca367fd234c25d336960e8ce5f40282b1e78e916f0a5c643ecf8b4596cb392c926ed95e5860753d4bfbf8f45cd3ed7ce1fc5318e2f926b2a9b8083b55d3d7677debc1ef20c6a27ef7a74ced1334ad479111059628ec68ca65d9a245ca072c9ca684e0f2d43e41dee58a1ed13e412ec6d5d597ebdf3e8c657b89baccb5efcb49e54d5eaebf37799337f984729affa4f3b3448ce564bafe93a9a96758faa7b364e99ff6c187fe692184e89f3ea29be8997f3b8d2591eb445eb6ace0d8126d2963fdadb63af27091cf76d4f765375151f97ca69d37a93a8a8b7cefad6e7a96fd6acbff9494df1677529df15f4ad99ca367d496e3d06ca367fe2328999dd481712289930505a5df7bffd510fcd68b1fbee892c17ebc8979988f199a5f24f3b197b132b11818d8f8728921d862d5cfeb6833d163bbab5dec76a7dd77d8c25f6a3d75dbf676e4bdf72fffa6dd1fdd34adfe47acef64fd47ded3efabff512b46bfffa8be077ef7fd51ebfd975a369817addf7fd4bd0763fdf74720cc78043ee85a6ad9446b0567fcdb52cbe6b256705a7fc40261fe1efda3eefb996a6cafbf3deb8fc0ff7ea9651bad151c97bdb1beeffa47fef4996a6c626841cb2dd6d3ee8fbeaf7f3beabe6b59fab72396ad7f3bf2af7ff43dad479f773beae891b7fd0e01363f2840ea03b8d93c538dcded8dfe6dc9b3f90fe11c7d5bd8dcde965c367fa6191b1d9ab4b3f2ba62aab1f9dface02cb53a6aade0dc8ec49f792baf1a5b4d0c667481b0f075139b81195d60cc0b269b81898d2e500616139b898d30957a3132638f99188ceb8fc21f6f40d6d7fd91f74e440f1b9a97752f93592b38b7a3dab2a1b156706e472d5ad9064db69b9a9918cc08fe51f8aebf2db56c36d60a0e8dccde986a6c3ceceda8f5333198d105b2beee8fc2f7bf1dd59f89c18c2e90e57f14fef7b723fa33b1bf1dc93cccdf8e627efcdb11ec5d7f3b7a3df8b723f1bf3f0a9f35637364ec18b31f636330f6066665a395bdec8dcbc6449bf347a17dd08e2dcb2c1b56fbd9da21f4df8e3c1b760821f41f515b3b84f96e6987d0cf7f6433595220fb73fdaf7cb074bdf83cfeeb19e661cfb18f29737a46c690dfb37e1812468ea4cc458a64488e2d16890433671b20b74f10578d4145b8bae38eeb4135280c1a836241b2a09ba0b7422204e5f8d5d51dd7e71060cf1d2351918f21fe21d60fd51ffa7ec8fba1ee87e80f157d53b7bf0809d16422b6e5b39e8865cb9bfa44d596b2ef893e5bc6bc27f26c39764fd4d932ec1913515b52a9b9fe44fddedc6da9ccdc69735873c600e4f629f2bca2aefba12216ab55148645afd758040313f345ee324533333c8a643f34bf48f643343688686868841186e60fc57ec87f08f643ae1fa20fbe92fa4afa8766dbf2f6a4b1a56cdaf279d872e62626634b8fd952068bb1250ccc9631d768cb97cb9623f8546a405b862d5bb2a8d45cfa546a6e2da9d4dccf96df16d7f3efec10ced5d5d5a5b6a45273dd96df16d7bf34f2ae5b2a33b7ad6cd227c09b1eb3c8b44c33f3f26a6c280f598d89c9843d9b45da8e21172132a2b7fba1d7a532c3e2224446dea53f24c2a512bb5d1122a3befe437ea9c844eff95d9e8db5b80895f07645a8d0db15a102738b506951e94bed4dcf66112ae3eda7e2ba5e848a77dde6f46c1669eb47804c9fc8e87b7eda7d5eebf96b6db15ccf1f82a14b7cfe1136fe2bf6fc31d78589bd917763de68e60ebd2e8fe7978557e689a8d0cbe38de89d79a3d81d12e1da1019c15cd91319b52ecd1351f1aecd1bf5ad792222a3f1fa7822a37a7bfccd1bc9ee905f1c2223d725a2d217c736d7e61b7977be0fd2b936bf0749b936ff86ecb836df8664716d7e0d59b9369f86fcb8365f467a5c9bcf830cb9367f8604b9365f866c716d7e8c7c716dd66a23d7605c83e1da0cd764b816e35a0cd768b826e31a0faedd70cd866b355cabd56af3917c4cb7ea26a9154859b1245585941452725f4460031ee478aafae28a10b0ae48828731368e35a717d4000c28a83881162fae08afc8218771e6724eaa885b8eef6b744edd690f358c327777291bae63b1b9ffbbbbf70da3eb724e0a861b5ece5d41c7ed2ee7aea8aa01581241dd1e21c18f449090107fdb2877fe5123cd1e01acedd34dd6f993e79c64cfb9022e5cb8542e5c64df5812b9a38f7fe3e0e978f6bb9c9e7161755688e77a9ee7d93f03acb4769de75531c6f5aa80010c150b1876f0210926a82742d0c515705cd1e50a29afbb2e2d83c7e58aa4eb793ef4522b1db9e08d29b810e38c2fbcb03117ae250fe74ca29e2d5e688163ea06343eb0851561b0ac30e3035dd7759d155bb07458baa2b5250b261e991552d430bb12b028a55356f4205af154831532b8acd0e1735070cbe7f18cc86d69aa62cb16301a872e72d862820f6879838c2b1b6dc1a53fc271691572e8d04ab1cbb92d465cf0726e0b102ab83296fd749bca7f3c2fb3ca9b534ef3ec0b1eae8b6745c5349ba6962a4f4c3cfef37d7f49a47b1b25df69de5447da34807ef79d7da13eb5b10d9ce1870485044c9bf77d47ffb347ded3ee864403e61b245801ce569ffeedc8fbefab3df2fe85a3cfe25c0c1964c1d9e8d3eefb65fe4343701cd94f651f71e73fd934a07befbb299b06d0f79ebe376d1d3992b643eafe3cc0e33f6de3075f4f77faeb5d4fa442eb59df302caa70ab475a01e20b302f3a6883bd5b2414a6c2bcdcf994eaceffaa5ce6e9cc53d807f3627d507c5004ad4d3fab71534e9b0fd3c5a6adee7c5733b55337b5963bbf2389ba17c1fa300f635f807d7db689301ff331f685ef619e6de0b745d2b18f817dec5954e1fb986f62baf3452d777e8cb4f11ec9167bb02389fa55783debfd895468bdebfd871a70033ffcd737e026fef8ad07a7a802eceb4f5185ef611e85a4fa30e1d787b136f4679eaa386d3e8cc4d9d0e974e7cb58a8182975e7c790365e54eeceef4652e634a2a27987868814a0801f2252c1a601ad7f7dab9f48059b06bc5e10fff56c83f9b648baa70ffbef41d8b3a882f81f0c09236dfa916cf5412a2a806d49ad7f3500fcd6b7a882f8af175508bff52caa30da97b5f1774d89644856929dd6226ddca2c01d42974ada34928d9d763422755d5d0072775227c5643763cc47d9181bc7366698819513d440b5851646884ed45063e3e51c1549b0018eded9efd97432a767b418dc510618531da0428a2c7ea82148a25688e7765dd7f97377871b556429430d2f6164810596ee061afe676b7ccefbcfe83f9ffdb276dd8fb8ebdd6ee9765d47ed1af53f27bc9ca30204b77c9e6e066f94c5a8e8c0951e65e5786354d8304367a9b8b2e44d41b798428c18a618c30a8fcbb929d0b8f4726e0a32b8413abf2fc3eb799e57dff33ccff3bc8fa43da39ef7a3ccfb59fb08f15c5a1b07907368bf0da57d3bb8f38914a07f2ad5cc9dc0eacea992e7ce1c0a7077feecce2a140c714b2377caeeb4bad4fb3ec08ad50c99c21e1083975bdbc7610f88c1a9677cc1c9ddaeb6338e31e672ee04572e4f39317af7a5ce0562022f2935c11b9732d9e8c7fa87da28a5b3ac945213b07129a5fea3db8e83cb39135c71c5cb39134071cbf1697b1726f0c10447c891e3e58cf096cb43faa7daf87352545dd8e59c144997c5fe233ddd18633fffa69c1d19eb99900c9c88c1972b1a8050818d5e71e98fb92a2efd9bfee11c0e8793c1463fa77fd8466de95688675c63e45b8eb7dae6fc26c79813a3783907051cb77eb9e5f828005fcc3e77a6902f403a521b92aee58ea45c73bf8d9c7ba2897291eefb3b2e22c7954d27e9144e97a7e8aaae3f38d4fd34724e055d9e6ec9530eb502dca5560ed573c7d8cf391574f1efa4fce7880aa09ac65153b92e5254d75530d534be65e7e5fa774efe43a7a895ffb49414e788102969f5c68e366e8a8bb42dfa7ea8e8b3fec435ff69c535fff9d4a58318dbce2f5c73ce498971cbee72fd5b88b1ac01e01f87fa1ff6e11f0fa54da8c4a9150cb4899a041d536a06680441400353156030482c168e08048a26d7f80114801098b2545a9fcaf42888814a19430821841802000020002030334c0002449b3da1f71f290cec0d6a2eda91cd9c18032ff0dca5a25b87109f947ed71b47ba08981d9bf2eb8274611b9bb453e3e7ac8da1b052cda092de2ca54eb20d304da0082804cda4a1f3c20b1db431f06a0187aaa837b4efb965f92729070114f4bcea59b995635e6ab964472cf4a36ab4b19709c2ca9de559662a421ffc529d1a7b238b3f2aedbd15738daf14666fd4f24795bdb76256f795d26a6f84fde51b60d7db9446a2d08e90226a9d8d122b1a6cb88ea4185e8ab8e828c0b547bbd13679d2e8eb62008f3df7c003341b2a56a1313c5bee8c133f55ef2b6be3a8f64de1d95bb8527d6f859fb221f71f6bcd8b6c8a9d7e5ae19cbd1d83b6ef5dca812c912fb71f29ccf63e3881fc2ddb5d2cbf8e2013a84318cfc5ea0ddb63bb22e7865cad61f213d625e0059b3965d0d0ba019f1b9c8f463543f237858748ee5ea3cc8ce2e9169db250f69c42c4957ef25f05bf927d337805e7a9c127a68ab304437b4fdf1cec75c4976720c5cf675cbc7c9600104ec31deab1daa6da90ea2e68b2d3fb183b47fada1739a348859ad424dfcd9b5a51a636050bdaa24005bb3e09d32a06af898c3ed46bd7ac2df71250bb69135da4b3230e9a600952a3cc8dcc1ef833daf8af458999fb360a2a0b55ccab6b747098d712665194cb54527b1c476b4e091333379dbd6d06867ef58142c14f115b2b940d25b4d25e5dc424683aff6af940c398b7e6d19b796ea7247d57f6f1b29f5a3042643962d66c46aea38ee900a581e4719715dac6a44d115c8616ed20a5c64ae32713d2162995829cb618dba14a67e654b9a7aa0ad972cd3565b969a3ac543a5ca6a717047923c352c8baaad3acab74ac18f070c0da4cd214b5d89b3bab2805208b9e7870c36ad252ece6816850c9a571009a29569705ebaac0e73f4d13750b574673759a8e009465223fd72f4de9a84d861936f12ed4982c4395d1424c35e51c48136a3bb71e1d79b70b521edddfdd699a24380f1faa9b9e956b7b3d41859a768f66a9d89e720e4ef1c4423e57ef896749b13efdcf6ce9e1356c06ce10e06fa93e1305e565f67da0669b831e088c05fa2f19bc2ebf67657f7d691c9ce87d1f5761c8bbe256fe5cb3f027af104fab7322ded5187c0c5e42ee42ce8a270b5b252e3f050235054a7b7bf28ab5bea6c6b4f4964b56e2cb65ff8d2cea2a8a4b3f71ed05c0442127b2aa9aa3d5949d533991365698308826d8568c9a443f916060611e49de48596136deddaaca8651c4e1c762906a01a1b40da9f7888ada2ba960e322b592daa3de0455ba1582813a54d77f8d896cf131506088a9bba9f2e218a5a46f5ec66a4faf1697b1753c30fa2d759189369d38b8d6059246990ab474780e435d3f1772b935304f056102dd56386b9372ef6b781125778254d44995bab3eda025a1b15072bad43cc1afd5682b16ce25195ebae8309c013ed5bbfaa9c7820349259df8681249971dfd2c01ddc3db884b424f3a0126be38a999dec88aa3d05b904b4bd83d2ee6043c1d394cfae52f77a340521e074963371f336152fe576a72774a16cc67fe0188393e5257b75f154c9409184dc7882e8e76c44c617f8bbe191a9eafe4d9243cae15e21df29d5863ca452ef3245a288ba66b90922243c5425aba5c8c845af81354dfb276445e7638df27521ac547dbc3cba9a395ba982649ee347c062f49167dbeb91b7d93f4daeadffcdf3b893749e28ea96747a2251dd12dcddf32d81258ac5e1626fd71cad511914d5d789326ef8c6c39e122d373d120c1974946253fc4bfb63eed5e467fba65f46440959dd836ea6d27bc4a21e599bf34788ad8bd92bc90f8902deffc3049c8b70c9de0629f23c561da895c73531c7471978f3e349ec1402aaeb5a6420bfec49334613ba38eb3267466eb8ce8d59adf4b3e7fa89e2274c0b2c1d5e34047f6fa091d695fe9d1064ba530cecb62fcef245c4b8f43d09f1cfb284d2456bb7aacc819ca1888b7dbe2ca0ff83c8994bef1da1806f9c27a7ebb01f4066e489df2076af97793f05fc779fded8cc8857e1fa2017d627eeefda020eaf90d931dea0bf2ef799e2b75c10b0f8c339059b86124a8db6a81dc435fb43b9890082202d636438c8a86aba073f75df8e3cb00f25ec6f0720a6cd342f71ee185cf3ecc02d4534e7487cf64be6feb6ec18d340400426452f811407ee619e2f0a440bf0d20f1252a42c6506345663530c1585405f964c212073a6ff8b86b0d61a2ae9c0511f5e57ec7bb433e6514688a56697d15b4c70ba4dff9ab8ba44f7a83dc758e4cf30c54e781d89513d83d6c9915014b882ac53f346c1c4b54bdb424b3db0688c95498cb9cd1f3912197cad54afadd7992b8f40e38baf374eb32a5e899740e46de3a43a8f39bfe7c9f77fb734e886a2212d4c175032075d54e4f44663a096901c81b5d71042a0f83841fc18dcfbda063064b2b09936097c6d75db9116b120847d2f7e01baca50e9ee5276548f69e0b460954143ed52ace21ac28e0c83f9e3d68202df581b25a558ab3dea6f7903571f32706ea6f46e7d1e53f6d15283d8ec329093f492b9eb51e5911020f4c6275593de84cc4fa54886d513dfec010bf4ac8111316299d70238b13cb64835f4849c7656d2e0a85cbaf474a1b9ef97cc84dbcad93e7bdf19c407ddfbbdfcb660f84cb303a705bea1c8ca65fb7955df5a2799b464b5499d4ffb010399475a9bf24a1a5aa03ef2c7dd2742b2336842a1b2c0ad87730a7c4ca3f80e15e3855f446d650449477629f313c4f6fb4a4217a4a3923e2f24408ec1d306fe55d3ce2f2f74536516422b51e0064cdd56b59be5baedd1e0d3f181055d0133f7cc1fe93eaa5410f74a11b148f70902a9f4e2676a6b4ac09fe8adc5f2a4f92aa5b8eda56735b937214772fda15e585d2c2a28777e3e755039e14322c5e88726dd471b446e35431e4a16d93141a72c3cc5fc1e0ce7731033d8ed114ad8b28fb8134a6a282c1fc20b6c5bd8caf1dc90d42bb6a4b01633d71b7b117faef2ff0a21c6a04c3e80736d1bbe6e843733cfd43091f91d2457f54f5355960682c21079aa9029fd89d215e307f6a4302057a57c42e62e034e52adf29c32f54f2d3d99d80053b9635ef497c564f733fd658c2b2819f189c57e9ab1ca23f1f2edf474eabbaa0371d966c29c6a30ec7cf09e866b7f88dddf0491ded82d9750976336d482c070633bb3b74b3fb1bd64564faff999dc059947cee8bc9d7815955e5e7a395c65a9988e184cfa2aba11d7a67263257d80c86466de8f6608bbe5ce27fe78cec69c143a2f2fa3064b76765d5c5d29e4f467b4d60793bfa8711d61bcd37bd612e548d115f7e3601fb39192e1fc068ec54b4eb8c9bfbc03f0d32c346d587193b8ea03f89d7c3b0388800ce66685019b0302d438b54cda15e038f79fc73f15bba5e4eefa3854b37d6ed5b9871a4c68d574525fd6e5007eac2a7ab425f0f09b43d6b8bb407bdd007d57dfec15cc52977cc66dbd6aad4cf6ebb25c7c66c7477729dbd1e4102b4911dfc436e9c29b3aad343aa41ef334246749f382e62d8d479cac350015db653088a4e93b24be39fa1beb8e1add7776c9826d28c4e8a96d554e4e62560277dd21e413f73e700c1b10e90a442a210b5c402d206d083c21b9b9a166ce94ac1f82a51040b1f3125afd009698a7b3faa49f4758298e68b352fbaf599bcece122f88bb819e604cc23088b88bd725c06333d184a2fe4285c4adb755ee942c78e0dffe0ca705cd465f6cf41406053e51ba9f5d14894bc014deaee964462db16cd2b60296041e8c4028d9db38eb6acb9a1451d6f72e963f8a96bb4ca7913b7e16a174162118e1d94dcb0593f660ee859b9736261b26643ce67ff9f7cb76152f0f222db9042a421a9d4b642938423414faca9aafca9ac52a4e42fefe1fcb3a9769c4daabe989c05ddc21873df5c3296475701c66f8e8e05e3e4626b0bb90c5c81913b61afcfa5bed9f78b5d667473e9752ece61a6b78bbdc0c0f572d765d9e2566c5112dffe7a7967743bb8568337ee2c091e2cd153c350a1ef642ca8e59a70b18be35a73b227334de8796aa5a5f908ce82566553f0758566843c57684a09a19e832946a089080e73ec42c0e15dffa5d3fc3a22ed6eee702894ef04c694441d3882bab5e3b19b77bb39b9134f94c88af0dacdf39e785c32ce9e98219758ee795b329c4a3283c89609c765679600e120e0da74e43590531452a8370f7acdc890af227ef833ed3f89dd90c8c4212c55c15753ebe2d2d9f8d70034966d14f77a869443d5e7dd4f25387ce285d9fe78cffb02122ba74e6ec3d7316672bde6f746497f635c08deb205c8fba9babffdf05937e10c0ce4b7c43971ab6ccd20005665d40581912a831504cc53d99e2078a2609b21aa271506b5435301ef04c6d6457862dfae833c81651b0f1ba9dcc52a791f2aff85393f5d68a7855ab398698775e08463158fb97bbf52eb4ee24fac01c1a5354f3d257ff4745dd952081fbdd08ea83dcd92f6ae1863a07dd78ba04d4290fed64b1c6014814cd81c90ec593fd8fc8c9e66b6c4284518ca65711cdf049454e5a59a16f34e93c1fd23c2445da0b891957c66f9b7466cbc1fc32b0a382351bc5b631b89834eddb2a8d35d2c4f2261733aaadb940cfacc87c0403e7d8ba238d3f1314c24f4941115f54a5041b2fc58816ae3864ec399039a91f8502577fc5e9918a5c0e752ab49da983b4b752de08a80bf1d76cba9f556393aa8ee96a2d9d76f3a8fec390782b9205334370d4f25d0f29510e2f471c6684044fa496ac299c91e9cf4dad132aba8437a109d4b188b6381dccd4af3d725174dbbca4ba552a85440ef9cd9a2a2ce1b0658827443de4eb17e69e3ebd75c3eacec4710b3ee4c188d391abb468db4fce44553bfd415f77672ba125a64755f54e99547dc8ca391131c80eb8b647d9f2b18d07b17d015be5927b2a40a66bbdc312e16731e49afc6efadd90b887593c8f0b8ab7c48a8837d2918e7b9b2ce4b12cc5211481b78b474713c641762d99a8aa0aa5fb258a62a393fb6320e78f168251db5e5b57aeb0d02ea9adcc80d00245fc80b9b1000f99ebffebcd30bdfd3fe403aa53a590a57f94ebb7d4511a1e9e0442465b695f028e6eba26cab08cce4bd653d01a2494db4487a3dcdc294f84dc59c341ce6f57c976863b57e1c376cd23fea5c09ae5ede3444c64404597f3f3700f12dc40fdbfcc89cb974adddc12545701f469326f207c133d0e620693202b01a031c8f102835953a465db484773104294f553ce22e39a560466b228950fe8594d689cadaff46a6b27f4e6e6b26313ac6365b1a27268a86e41bdb58d392abd83920819849a02631c279e96adda9889d39e3be786535a4ead7082aa2641d98820623ef3a77bcccebe6adc609d7d2eafda7efdb410b95844a8542b575d27ccda880f4c430f8c40f9ca179b09fff92163c85214f868e9a91fe9dcea6fdc336d507b73aaedbf3275509a8ddea008f3a04e5847b6ae6b006c7b4655231cc72021e81cb57cae946139c848cf14f3eac4f842b16b066d8e2354def71ae1498e3b6dac3375d7f1653a41de6187acfef508754220543135350ca52ba889eabb99aed267c66d7a7627acbe02a279711a81bbebaf5eae1c9133973f49e66f9c6835bea8ee90033c0dcb5a3dea5ba9d7c3a65c454448d6eda84c84ecd37120b0d8e18f3bf1491ae04dc9fb8a980d92486aaa7ff1795f166f6ce68079ac865491a2b63250b5eb7728acfc0968cf9f753ed242c871a6a4d98c43393c93d281ecf57fe38bfbe7df0bbf3f5cdd764dc7cffb471273a2c76a9810446a1c374f97bc526978649b85703a35e6a6e02429332ac0d99f08a41bbea26920312ce7a72d4ad4bcfb2682e1d1de0174d36aa0d34abd484d402463d7916b493b31c135971183a4214ae08f2ef4c8d5b16e2ff523225e1d5e2c263d71fa0b1e0e2b9739fbc53e46261cd3e6f7430c2baceab7dacfa6e80f3c78406efc56e47a642c4de674c8b5d7cd35161e98669cd281daea8be38ce44a3a790012e4e78f2da5c1c0ac58c0340db48d6e7a1e13255ead70dd2e4a27c4d3af4bb7a517290d679628884204515a079c8ae88ecb4681903a942059fb88880ddcb8d47415132e20251249bd05aa612adaabd5cc0832e680c9faef141a7ee4abcf6c5613159737bc49cd19fe629a5f1be80b35cf8c79d78d591a96cb121569ae5c61df116e892e4090bded4b1b15628c1f85e2831f5414c8d0aadd23e8950c7d3694885a57ace181a0bd4b93dd6742033b4b982c5cce4c66586c3f3b1f682a9ef939a64b197e260b6c5edfc670847719916f30c7127d7b410344119fa2c0af3f72066cae9a77af860fb5ebbce040579efc9174301ef5ced5da526b5f20689a7905da5c733fcb7f638ffe874cc977a9d16eabcfd6f82734be5bac2249c28ebcc59e54a2bad5c69e546c0080ed310755e92eaa5a74d9537f8921efbc44ac80fa2a7775c46ac323495bf245eec0a02e64b99e2e6f0acc6f7a2625bb6d81124e2f7c857d09d08c9f065f0d70d78e3aabf2c8fe93268e87915e7121768a0c5dae4a80b502002d86d462394dfb084145326330cf6ed07196d69bd5ce3dfbbfbc629e78ff792c4071317a6dd87cd79fab4f436a6ec909a98233ddb29e058b802a16b4c66d537bac5c8aad17412ae3d0c3f3a4f663dabb21d51b393a96c23e41cf7acb5d10044a7e8146bd97e9f43dba6bfb67fefc076d7826dbf2fc01672e0762c4708c5cb2088307d946e52d7cb124cf662a0cb003702adaf04c0345175b811ec78bcd83989788f4e1b4389789fe4dda5ee4d74da8d54fbde74852312ea0c790ec4ce2a98a419d4b735def0dc3f20e6c0177c1f676532c82487b1d5648541255404d0cab3c6bbb9483628e098e6e823a18406276b89152fddabe3ab79a3fb063e06277a710a31197a50d815da9ba850d8633da651e85bf2945d10f58d559a9eb2790fdfb65c841e04bd5afc866cfe55bce1dd1738d1d2526e04e7fd7e59e1a35302c3511cf560c8fbfd080e1da8b05137ebb0e1ee3afc97bf49fc18031abc78bb60536b59514be897565860f2b22db46d52daedf17e0476a962ca623042a2a79ef79b8f2815258014be8610c01b17c89c7a5111ec4bbde5e67255f7ff18b4ef6a23a5e2be22186c1256b5b985809773e3ed2de021e8354add2140e28e298e31c7b19feb0c3fe768aa8c33f9ff2c6895f2fc12c01713c7147e1ed5238b6f429e70f6dd475e5f2f26645005e23ca1bc15f2872c9f985331550a198863031a98da57103656a596bbec59350157ea33a60d0428a78d711bd6a807d49371cc728c1abfb8a6aae18c34d0b2b36fc0533f4c929d6d01572763904996ed490ff3f41c37a44fa6eb8993050330e71b5463223bd8b53788cf6f648d7d2db560290c1051e6450723fb978a0c213f0bd1af931561c271da4881e8397c02f79b1a75b67db28d6f6f20051bdda420fd7c4612b20a3cbf9778f96301c4a70981940a072d2f16feae28627b44a64981e84bd589c105d1406eacd04b583fc2d78b2162e5c2b6b32026ca2794d38464d52211b47f2101ec587dc58e470e0b8bcedc70e31f5e02e2ae12d31f99fbe766657e943ccabf125d627343edde9df62e9de6a5b5838121e3f9fcb21d66a893986b295dbb78e95dca72a153110bcbd2efca9f860203b717b06e1b2a2640dbd133a3c80d3b7f474f176898ceb2b2772e0dab1f460367f61d11795fa715b91d3f17e507b47031d7a432bc7861d1f45db58651491bd0fd197a30a51ffff9fa2ccf40e934aeb4dcfbef2fb76d4e74c7233840be7bb858202832b39cc70328959c10045cbb234e06a2c1281acac44e7a2f84c7f7fa30f4308bbd045612a72f1377d55dae2ba29ef36bc95c195437c1a2cc4313c5528f6790c9120f38157128e41cbf10406a72b85e0507b7e1228a3f2a80e6b85d29554fb1872046ed90deb2d0e170023928856dc52f3671e60d928cf63edf42886fd2d4bcb17359f59a07ce5048edf58f6fd55965d770220ce1fafa445a0c11ddc30c271540d3f8135d170bdba4ded555d8ad4b3534296f2b0a762da4bea83d60d89373d5c742bb07c4cfb76c0b823edb23ecf1871ed27300461a3d38e360ee80d2e338fca6ad682b06481e8e83888d758f9c4f37764f83d8ac023944ead7e0a5664559e8bab6451b120d42088dce7ada71cf4a1c3bed6fcb48193d39482b288abba24643bcec7442d5759e9b3094c52dd1a1390a166713d6a0a37b3c7350481b187e25d71cbfc1feafcda1eb22b5d8730dedcf9be91adb6ecb16144a25631a496c5c66ebcee41d00b4640003eb9b1d394f5f8ee79736e2929ce3791b1cc3df155e6dd80b2bc7f91ad13c1997874e15ac12488acc3f4b56d50582f0423087562b03c5e14cab16d17910cd795ed4c93e496aec1c8e42b259af81988b6fa1b51a5e488049e14d63290d30463343ae3cf120486af08f1c0f37fdceaa01ae14858b4a7b33a1b33c1a12588bd226edc4b4b9e1950f63c6c1b91ed74cdcf08498cac054231dfda990740021df3369b6b917e083f70bd4650c5f4debbf50c304c2c02920f1ff289abb20c24c23f22a7fd0d09b3913960cfa389173cb50b1f33181fd6abcfb34618c82a073353a14dae776fe127aa44a747296904b4dc0cbb7d2462e042552d0f9a7770e103a780df978a841f8cd6e4d18a91eba4e27d15e4e2bbb5fd1ce94b332fc4737a572399f759f2d2de70d92bbdbf391252b54d4f9d2a85d6aa832c5ac0f259bb6e013ba2f6d387fdefbe287834c341e91eaa162ea5470ea969e6aeacab5edc457b0bfcf526f0be7d998d3acb54876ee31fe93b885ca08e03fd1101a9f6283b664cd8b66f7ae81af8c330f168269a3a00a2c0835be103c2365db06607e1b80df50733be2f24002d1af85080efdf2891ce24b98475708d11c44a9ada84e8ec23e5b6540f76a277df5beb0078ff182e145082c0b48e70b745ad2651bbb70bc8e4a44da8bfd261341f8b1b9f0eff3f5bf8f4cecb0fe8637b6414d0fe7dede56801b0c153b3bc732fe6905419785c47e72f5c74dca782f222d82c987d84d46c3f83849577f2f1312d9f7c43231455d231806b26dfb51d8ba02fa1be8a6899e3eccb2f5296a1ce3657f20cd4173ab6d5c6642f29621cbff6f5f3ffef84151fb5da5bee1f5de807e861ef139f4b5d0c8eb07ada9136931878d4dbab9de4a8a783a8672f17e87d089e3d744b63154270cfa78a78fe1cfa704129f5fa478885f56fe8e6cd20e377c600fdf148f36798aa837e0bc17ac305960771d14666f739edab5822869e9f5131173b050a24d269c7bc12eef2af6cfe83165b10677ec60f740aa0e14e8edfa28e6412999eac68e15de1d1fff9b82492156030b289ba7836893213fde4d4ca4d6489c2133a8332edc8f8e483452c05ab127846b65fc5930b858c4f6fd0adc85e18fc675aeafc65d9b9ced088ef36a8602b422833128d4263be2cf94612d8b6809da3fc68f4611417b55ea332ec007171df88497c2d16f589402e30bb79ed859d31d9d83f6904bff7f2431e7120b7517bd94dc57fe1ccc3965094d4c8e8be8a2e5481b575cc5ec4f76122c0318b34f5ea50322def9c366a9a9956b9089d7326c330655b82edbad92b26b29f2fd87ab40b833cdcc711dfc62f9cd7bf9eb0738d4cbeeeec7ddd4b6015639ebc1f7d1c01f716642d54edbb40c3a5c5aa960a7dbe6a063966885fa62d49b28ea00681281ccdce548ebfcbf26e751f1b299a8dc3c21023195d54d3347bd3ce61a69da8605f89c6d161737efe6b5e527544cdf3827f3e62ebf33a7d7520031b79f3b8967ff40822c9467bda6d2bf3c06b0e5b42791c3b04db66ba7aa48f10424ed7cb763ab0cffab6af5e679af3183869c74b4e2f63d2ee48f26712972c2d4e1e4849dc4c75f7a3100f5a165f5e15697dc70a5a3ce1f9d3998e8ee3e110c87ef83a5fbc2a20f64abcebe87293ac719fe5b20ac2afcfa7dd558e9be395d0d972a074512b12391d7a856e1eab046b1542cf803f928923f0350a1d76efe4800c91d65eb9659b051104f7163bedae3d2157fade540eccb48e49522780ed91c88b4882f1e6d5a9e4e956859ef320223ea68a57c7bb565981bb56086007e70335f42c08ff6d1ce6a24850a91251ccf43e9b9617100fee0f149ba9b3bbc944eb403286996ff9774228e77b6f9fcec469e0a3704fee9f7077cbef9c3e93117f8cbd5d915b3c53ad34a76cc7decdc8fce33cb69fd1a3db3d11f9963ec58c302e7288290b5a3614a0be453e048ac50974dcbcf9dbae46a11a2d01ba9d9493d386007defb4108f7504d77601c4925a6daad1c5363942e014ef97b2e7dc4a6bde641f4abcd86c5c178ccae69e39aed0f09980653a7d598a67d87587c06110e005a754854af55ef79fdf2034e5efba7bcfff842e16cb8ad4f524331a30ed6ca4b7d121bc637b804f90307a5c9175644db5e0917add4308549dbd5e51a4b45a208df16be7b50dd54e58545da5ec79bb82174614fea40bba4e5433357ff87c143611e007b7ed55347838820b5364dfd7de952e6fd5bfb344420f8ecf3370f611f1b8ca86c9f1dfc5151f5c3b3de30d55ec60359d2292e926c6a7595f5dbc7300730539f47274c2ffe43306cf8ee6bb2b18693b1dc4095bda26f3360a7d247ec03d03693849c8e3f91a802bad6cc4a9a4620f93c0d3e1a4c744c6cccc1d7a9e955431c43649497d61f3d162d53379f79cee4cbe6bcdc2d61751f09612519cae44ba28c9d9c481806c777a2070465aa43dc7b50ad106e6dadf39cd189d95d647b22a8ca6d931d7cd4da0bf9fe28cc59e705ee3a7e3368e5df8e746a0540ea25c8e769f6dbe1d9b5ece225b7c796066500bf6ebc057520700e429d65a4bf05bd72cead9948242ae7131f21941a627a08c6ee5635749207777ec455eefce4c13a8e956b4509c4a88bb6d7190c73399899730719b5c97974cb960cb578e885a1e3d1e1099dd25a1565d2e3cbce28987d10a8a7d9125c41f0163c50d7bb3bc7eb4a9bec9cc4facbcc08e202dd50f820bd081f446fe007d35b7c60d01b1fa136a46e92cf79aefff226dc939b539589da8912f1a6b4481dfdccad4b23ee88ac7312ca70d9b3f2073aa1a579d8fe7573bc7fa2bef54c696c6fdf7e78d4519e4c70c0c24eb83497faf40dad191c6e70faa3e93ef1d4c0b9eb43ec8716fdaa9ffe9f2dd04c99625a72e36f9ac234b0b681f406702964653482d682f1f31fef22bf1fbfcc0abb32da30bc7887cd6e1080f2d610fdc3c070a05da2ff98797c02832842b37a31486af908247de748b1b685700e2429d718f46ca2b34d19be94d8182562464ef17dbbf66dc9a516a2ef0715879561d631f86bad67db5a330f5d3143db4864349b4e5e439e6a145353bfca7928f2feace6eb5e4f935d923728bcfb8b800028ef0487a83fbe1b680b9a91fbc49d1847f4b0bc6d1d810bd1501affba3eb024258d5b681c5257f7bcf598307101af3bb497916507da43ced9205c51360fdcfa0ec6f9c3d6907a49c3944942ed6b1403321c3f47189122d85e842c1bfea28ac0f786ea654cfca4badd50bc7521af9093e0bb0ce3af8d27af12451912a7e03f9ba0884a04a6f63c436d3e690703b53f8016f8b6c884824a342b9d4bd811eaa40f474e30e1c54b7ce52f91e860f07616aac89882820a69da2f20aa2f5a7e48b6ae869c82ad837cac55af7c9e5a685474730c7618be629379d8a54b4bf5d6354c2dde2d975fc749a699de5bcf32dfe13e06054df534d6608db699e91390cb95e39778d8f185a045c9a6ded78cbb8bebb23c9a1657a9b4865c78a40a224b6ca1b7e087d0ad7113b3ea9dcbf4e5c377949d01abf2c32bba86950ca4d43aa3e271cbfa86608830fed8589fd5f57021ecbd1e54da6438a2454ef04a642a9fd42f4fab6590527517b7dd68956e86bbe299359914199efaf4397ae386da63f6c14e4a36c81f054218576a384b5108b23cbe4cac271234053799dacbd91adcd74df345dce2345c3a9707059cba4dca3537d37ee0ea4cec7a8fe6a79446e06814c687a9c68818f439d39aaeaebcd3e2cfe75774397f32430b66bd3877911495c0b90ec1f01cb2451211e8fac316c1084aca550cac2d1cf43f788f935a21c0a17b13f88290c543e6931996c1e25e5f1cfd818d68f1d718a14012873a7568e4a9c3ace3871dc91a530c3f8b3c08a115bbc421eedf719a144536195e12bdd800777f408e6e9aaf1d3b1b0bb87ffc3c94e084a0819bd9d3abf590030552b44ce0fafb924615dfb78247e8c7fee88ab90e7e2fb0f2f3d0369979b5e7fa727d6eb82cbceccbe6c2cfd363a489149a724e02405120bf626e544ca0fc97abcdba3054a11e20cee642794a24f5032853cbea21072372b64424a011e0df224280a169000737dc72ca147dfb1449e13e8e677e24480e70a695a9813dcdc5b1e3b94335331815de9e233d6bb925f0d7d308a3643d99d31fb370823cab57677ea5ad136b1b45c389b3894ae5f5d2f3b31d2ebb1e1d08906819b867c13fbe7975824bee474b0ed6c4081ae26e36685abb04e98ba00838ccb34b2f802a02014695e898ded7a225c4104411f9f92120a301c48795bcf49412e8bdce70dbf5198df4dc5113a9d52dc7ba1289e4b06191ae36940f6b13dfc92f6f18f669e92e0c3d5136c18859daa4a2557298b148187e29d8705f06809d260a3e5f676e2316ab31df76b55d641610ff61c97b823ed61e45fb25b89ad18d96d9168c1be55674a901cd7174e0498f1a1959721c12bf32c59a6d1b0b7acc96e006f714aaf451669379fb9637e82057cb1e8ba710c43ed117efddc17d4b67ecbec195561f8d195d0b51a654142b29848324853cc777a8fc1a561382e3e232004670bb3cd56762ae8341344618d4d47208f9ae5cc52718b08f889da9a97e06a80f700af8dcf73618428cb7379e7c5b5052b59918b751a4f32224c61a66047a9d609ef5cf7252744b2127b7b0dcd7f4d8d13419201b06df235b024967dc87a922b4aac44fd1ef94ca98805203aced89ba43710323d67c2ffd03dc483c224fe43dbadfcce5aea24ad2bcede482b31e9ab7a13b324162d56635f5aebac9329954e1d1636841199d58b8b0842b667111739611d939f35196b8329c0015252758e78be56e19c3f1d6e7b73d4973a07edee1c8f31d9f1d20c23403b2a69d1afbc501a68c5d04a537f5b6f7f7d8170edf8dfa4ea72f16891514b5d8cbb41345bf16564761d5c89ee29274db5a9a08350f6a2952bd1a9f8631b85a59ce5d056e32625c6c658d19dbc973c83bf165489269f42f7c502bd3c52ebad09cd44b8ab5e1762a868c442724e615c2e6aabeaa3e46c1ab7e6104a9f8312b55e914184f51eface583add07f9da6228d3b514c31ddbaaca1e2c5399ea3000df3342ae2ce01dfebf17217421e038494c4b3f8a52cb91b36c77299fa336043a349a2a5f5d4896a244afe4726e94f2f1cd02e89a8cc400eca22979c08e8fbee7aa0ead455ad470eec33fc85211e56fca0e18f50dbb16823a543c0268c73bdc87d7a13ad4465e7599845368875b45e64e77f9ac29910108941c4df04224bee7e0af26808da05b6f30a0d558ff366302d5b9441918617386790e390d43dd8972b5025c6c003aea8906482493b7eb6987e1c89e66b4cf8d66a6432f225636563d47896aa06320b538703bd7233d2d1529cbe7c7ee2dd4423412b1455299adba9e05be87f440f5e14012d7e44c0a70f243ea516758995fb4641dad229c4b2df55f4ed2569830fb84e55ddc040e7687690240734c5bc05981b9d3ac122aa490e35b08dcf2cb5ca0f9c3affeeca04cbdbedc41302e1f76e456709531f609d1747f497efa36735819d20bb73efffac7e9eff52b0b59e4d3378f92827dfd5044f3097f927bcc27172a13e535873bc7ee971f36e2991b3e5285ca6d09c9b166b6b2383a7107018ab6b541699593207c7925a0c5050de446612391dac6b634082cad3711cadd66844153421af90ca6ec7a352020316d835c08861f77717622817ab926a6137490c2df60c003e46831b23ed3539f988fd966b029475e30ccfdedaa30e92e76fdaf4b1ae25e58bc6623d7b0929aaeac3d7481d9575a46aeda762796905a64186caeb0bd257d996e9fe03c602b168926d04f5b3968ef45f001c25311619ac1114e23fd8b1f382abdc0b49754ab15076aff23f4159bd0fe8d8546f24b812f542c1fab63a0b775563536c8fab6282a5450a59ba64521d033718dbbd107e388c2a55fd0e4711900eb7ffb18f10f7f17ec0bc10d484c1f998edbfa3218494f575857949868393238dd66bb50341c84409381a5c5858a3090a9a5e3b58533aaaedaec495607d3fc465dbb027d826ee187dc2d706a0e058902d099e6bc132daee3c5c5e197d20835cc6942e849f9fd7a20cb3c51f707a9caf9af5c11c19bb3a83385cc47d78e1191d231f8ab3d1d9e783c7a17147e14f2e8cafd98a4cf8f1f9ffe7b1de3e8fd2385fe6e16743bd53565ba155d8b4f40320b9581ece0b38edf24bdebc6ba75c1fcf395c07a846cdd367357e89fe81b277ba6c89bf63ea5ca94e4784b72e43615990f0c0d770aad51c735ee622927c9ac3672eb2a61cb3aceea79f601296b9ee528c6354265d92cf2e03311e97acfc850799408287c1e6ea83720320c2a0e42edff504fcd6828da11b30e5fcaa543794f068cbf16518f78073053f5056c69896d91d70b7f471f180938f2178d0d091153276065fb61fe168fec0a4768f2e52ec14dc5c6281026d6bca4897d4a04f074a38b2710160171b4d2dd41e0245ef7da941f11e1c2d79d6ca006d018b395bfc52b92cb4473910a29ce103749da71e5f1feb322497717a0000ecda2e68e412d0ee340f70aab402bc7fabf24c05ecfed15496fd39a6b658b6f098bce75a34662085a725f364e6fc72b38368ca87693e2ee25a06cab2f13c10633ad73b4610a0edb78bab3efc06f38b29d3540aa3f72bc90efa1e3bf52e0bcd928af40844e9cc78b7df1e7d01f822e608089c4007f1578090ec3b3c1e9b25b89c2b07d48d6c7c7fdb0dc4b3899a32c7456fd13a8082b44dd67413911bf6bc98e8502520b8b90edadeca68de6641375b4cb4535fa9283490fc18de9d4df6e03e9b66b13103cc9ba7d5f3536e4e8814b5d70c2f01c7fb69161128cd4aff928ec7a4ab49e6bab1c7fe7927dc7adda2a08f0d1c37391d73346781c2aefa346499ea2e5d2ede2108fc44a03a8c38166dd0c4a95162db39cd9b834c7d804c4d3ab9eb3635502deab599d5bfb95d72b59c90614a5b0d74eaf9cdfd00982b5aeaeba9ccee837140dac541f5d0f80381e1a6a9730c4f8f7e8b592c539f96e73b7516b998db9b6940b65d5a0f0221eda939af58f93e7d77a24b06c49ff53589f8342ac16f6fc94ff29dfb4a585afee9ea933122e8981223bf3efd4af410088ffca42ee334992d706f527a8d8f9989af067e5a9a2cb1dcf0bea18232260654431dd51726d2483c29add94c217d05bb8f8df072f3290689d49212f3cea2fbc337c2c0a9812ee72cfb1d7acb55f9c35d61e5443e6aff8c447252f4aa7a1c1a61c06ecdca76b8edf64881827726e0601e59b5fb844b99f7ada63a13627730e93ec90310a41ee5c744b0c1870a1844a91155f0f08c4e160f9e8ba0a0decef6d6ced168987d707bfbb50e03073924d44e4238f11b1b9002bcf11b746dce92af119f877e66bce32ede73a19bab999413994040d76bc561c893cec7801149659b8ef301d6256931b573ebcb4b5ce0df690b72f8c242a9586967dfecfd553b34ac214c3dae889f4ff465a916d8849cb108a4dc1bb46d2e4753dc85642762e9d4283287ba83db9657a2e62004f4b0d620a89cb1a8784b54e34aad099ebc1ad7da627aba9597158639a5bfc526e68674a278d7b0587598890192478083dc5015f28582c8c423d6b7df57e2c03e92f99a19231ca14db9243bf11a8bab0a0e52b3bd1d4669e67461f34c00dfd0c48617bd01416c725384c3ab741c7f9c3b6da7fd521d4298563ef8353d0496a901838de4541b4559cbd589b083a13a5fb626ea4c8c042f89535ce839ab143ec88a50e3db04b581c7278f551a8a0c88f2dcc588482abcca00ab84d498b8fe29b401bbbbfa42a4cc226c1723dd88090ae5b22ba8917b5a060f2238fb5182ee2d41fd51783b1ce5e08f16626f5150a104e8d63eb005c41916c3b78ff58b8c4eba0dbf7ccec9aa6d2ccc3187a3a3c3e57243b0440e80824362fcfce297ae40bf0dffc84b19e9a44a14ae41cb024b9744ab18ede9e9e2cac6836fdb89bfc895a99275fac83c1baa87f0efc48166f755a68405144199f467d9e57b559937a996ae5a5f18f8295ee7db7a98a459850aeed35e90a245a0c6575de32d8eb0a2a7de98741e77e219d80119beefd82086712390ec8a2a37e78aa88704aa86a250c2f91d85cfafa9debbb80f82eb54509b6bbbe00e6225374e4a47fb5554c833ca88ba7eec656e9a5a403f7c0843687d500d2e66659f5ac6e26a922e047d0d0c9e25d47b4e48879a0caef173b279536eeea391eaacc1c095d2bce4f5e1a700839dd29cff2c1a158d13d28883594972f14f4bc943dbf18c1486a472445615dbf93f665fd7422e5b5382f6b9d148d0608df5f9209313c53139c979a50c6ad89841cf08101b2c6a84b18fab12f08fbfc2ca794c2c51817d67f36a01b56cb36ad8911d2fe033cc1359926ab888be8b04e6456ecd63805422364c752783210f6ea0dbfbf1607c35e9d40945be8d54d4d7fc90e7571e20cc7f8bda3b6547dd170a3e917606cea48db513251ec0129194d1342637a7ba2387ed867bfe195e002436a2f8f93fd2e79ed9eec513d79d2a185daa39101982a301e09c7c1c225ac2a62d9a3fb42db993f9a3f774e321c6843008dd08f367d3ee56f0543be85e04438800b0a64513803b6ab4a312663f544386e738e6f443e3fc04d0a4f81269f1ce79121e9f9466cad5c5eb475f26834f72cf718638528c3e086107f32ae58b8e29b3c9b8583796e9c240c0faf9435b770d89b007d2397b2746a1d9851f1b9c9b59efeb06afb1620d64dd67687b5745721b673c94adad2a4404c602bddbb2d23658d969318f449527b0f128cac9931845bfc300420011f792e93535fd3ea2126caf2c6b864cbb6bab4d30214e246464078127706dea43bd1db23d6563ced164200c029ecdd9e3330ef7d76092a4c2806c348170dcfdc08625bcb20cdcc4ad32ad2d289bf6af7d119037f605b5afbf130a6092e072dce1beb864023a9f79c5a3a5f98dab3a65515609b404d5ced7bc1375aa94ca605f68846ac4ac88bb194d6f6da7aef92c63733af3c43c30810409578e3d8e22d31d0b06283d6924c9bb4901042a939610c44bd3feb72862b816866ad20a54de52c01758813ca8b6ac36be0c97708225c799a837cb3cccc967080bfaed5163cf3d8382d0a7c5f482bfbcdf0a4ea2513670bc39a5e00fdf19370dc6542f5c3226d04b4d2c0c8a65bae7c481bc49ac926aed78aac0af2cb110aece11b8f2b6fb6cad716f50441029f1ffddefdce253c4708d22604a82b2f5016a63271cd02e506c7ee1c80cb4ced4e47f6383fa6eee82aa0472af9552e176672d5592362440923fda58a8509a950cad878e023c075f585dc3552eaa4af92367ec4659bf5cfd8e6afd04c17df69629aaf19d1855479b5f1d7c722602babecbaa9186e8895c4115b8238bfab23413046e63be7970c971d902fb5ca2ff4dec4a236343bea3abf1845c1b469d73a1582d164635cfcf2a04ec1e215e89b940fca1cbafddc50fca43805600a8e086e85195800ed609459d79690f4a0514c53c0f32c1c1b08222a1950c04972abeed430e0f17eeff06544212756bf8d66c5dac489283fc60846329da5412f28a0a83d30ce860d16f201887c0af84de974d009e0018964aff08d4a9fb14785d023bc804899568df516bfa449263b931b92fb3cd3a4f2708fdd851783d1362ca45ff38a0cded50a959292da82accb2164b0ba6e0d6ae606d2109b53f666359995afa62923bb4c3254b0bef114505603218e9a56528fef28461b3483249d1e9be49f2445b7a3b878eb4cfb1036ffc01f57ad9908c34da333896b780d4f748046462c192b269501842175b0e67d9d29481ba563f82c6b56f3421c637bce9bb65f7017c4cbba2ee7d9616657655095c1319e295d1e00c640eb26f2f431e1ae4587a4343a79b870d4528c8e0f69595a624599e938458ba643a20681980ab6970b017ac0d7efb1b5e83f1b1d1b063926abd58deca36d3565288acc2d4088b8e13896da1e46350c39c5e761abfc4703271e668c1059894bdff08f0614aa4772d9f72e40ca6e04fc34193503ef1c082e75c79095e9839c18185ff4a1551f946cd70456766db1d0a4f39e59c52f62cdbce32ed8a8d3dcc41fbdf155471ab636e474c6eed245703acd50824f44e0d6295915c1412371d0dd2536287265c93a71b58b937d47b6a8671bc106c95d7aab570c244ccba305e40c4d55127dbd9c5a9ba9447fb46c313266191a701c076b04f76ec98206554d22c4669aa6c85c0c762d20bbe3f6a9f1ca611594438f7895240610c58f75aad70cd75470f9a007a30d8b5a66b6cd5bcf836809b187d1ae86248f569bc749900106cc2baf43949fc306c496b9a6a34ec5baddea773dcb7be6e2f04e0e8839f302abd884c807aa696edf973eeaf905e67d6d1ec80e4026696ed140ae4713a22c64b59ea37cbbfe1b35c3ca0e35f07a2990236b360f30ad7e84b23b55ba60505cfdf008b59d44305570b0a6c4b61ed2fb085c6be5482d0a77ff94280fec16f228d04adeeffec810cebc7be2a3943f40c67fd14b0b35c4a3764e1b639249720dd7827cdb22a04e235c9299802b7cfea5b7e9b07a554046400639ac884ba9f7ca5c0315daeae4ad29a4a780f5bd9929780f771215b229624002975ab68241f120a3611a03619244c0cf5d911a6e70449cb23930c93c99c03bb04c229418c1d2547720e3b3f5f11a0e84f0f51fba5af4768708271f0d432dcd8c1f808bb517fca85b7eb18b4ed187e5fe7dfb29277cdf1e9b9278c766e79590745e3c9648a4a94b9f5111b59ff4aad2266bd4dcbb7515195fab0ba485c4b62bd46873652e4fe998bc4fe4ac1a50d4b0eed44010b2540927b78d2ef5310655f3234c947811482fd9c0c6cf8d57d82494189b66697dc8798404ea234f787ffd54f04af4e555e138802ff0328b4c181612b4d80208dbfe6fd60659c42b0cf8af21dfba0e02b4ae205ceb8d55ba19c43d801e50abce08d4456940b0b515ad01552167dd7149183d6d7fcc918d5c22d5a993660a5d87f30da0149d4d0b147d6e525d843a242acd3368170c7568ac5c4dc2c83b5623bc4197daa2e0a13c07552705d4dc3717ea70adad8004b6c51d8766d22d61599fb693ace46d0d7edaf0a79f426834864b8fc06c7faf4e63cff3dfc316a740bde3001f18212b212881d40245ce78e0ec4fbc0ff945338c6d62800ae1449d7404da370037535090fb2dc3507c93e817a9f9b5dc5ba646915052059b0130c385531acd4a53d6ef234cad7165e4983c14920a6b1dd439844c3e49a52035ee80c3f81caf89952fc057db6bc1bff7c84b99672ba5292ae0930bb2ffacb8c8c6eaacceb0de43af7b79575dc5e36931cf83f68165942fb9de822b40f64fb78069f6d9c4665b39d6c5a356dea6c7f23c5f638119327621b2f5921f5a38475344a68af2ac4c0f4c06f1dac3127766da05c31da5ccbcf18b6cf3ecd417178c808cce370407c25219795f8fd540c9cc89977073c9fc4d8638d7f1b18a056b42ba00da1a4ec79674148924d98e4d9dfd73e5260f663507af88dbd72c9b713ed17a919c655c4fca9b71693899e4d54dd0d7fda5dee217f563d1dcec94593801d3a5284a4968d5cda17684dd1ef507c10caf1ca437aceb7d0af69e89afc4bab4a19d5a3cb79d2061cea20e49495ff6ff4f5b6da38298de4dbcf9188b581a927935ae7da7395a63d717c8ac5eb18f1f5915e6dcfb781c4092d23fa99817d889bedeb5190597d71c448f9b70346d64334d17cae44d9fd1cd6abd6a1d1d331ac63e837550d40ae851ee34b314dca48f9de4d3d458cd0c7b422494006ca41798f11c6fefca4879067a76c39bcf38af2791c92ea1e810d041f517ea35690b4c32cccfa2ab67cad629c718014d15d0e79764f1e06fbbee7388d92db5c918955692f2e4e6ce4802bbc02cbc6016b35dabd0b3d7c5e6c50973edb775a83f9f51cc05e6674d572f0bdab7dc19438ace4fcda2c8787ed7cc0094b21c5127c6ed177f6364cdd5e92076b7d9b7f9a4859ac965fd2e454bdb77ab009e205a2b8cf0ec12c3cc6800e2745c3cd5d021e34bfb6cced466231f4446b3b0843de787a01c1c04d7b7380246d95a9d82bd2cae6d967b9edd23a9f8e6a2a61f96d5e277650b2057ad66aa25138cc5e91266e3be80733d781805527e225d91b044f2b3a1cecfabb3ae8e095f8b1eafb2ad148b8c6d410701f6c4dffecb8f431a49e70f337d1dd584b9a6095069ea7d87e14402c5483ccb79c815860349a6fc9eeb639cfd52fe2fcd5808d066a66c6300322d74e199fa8c014c78b5424abc5949dcb81c7e5cae3d6dd813a45c4582bd5bfb8450b03ae76ee5ea2ff5a1a3db944a2d5c638414ed72eec1656b46e2167f77dc9761e4243021bc45f7990b953ad35eda2538395ed7870f350cef1ba503aba18f172dde2d46de2343e22de42d3ea1c2ce175a73bd67f36c108ad619e7fb06bd27262e320e95d21774dc1b8cb65355f3db34c36bbd2f596b1e4334be8265e6d27e6667a8e163336ffaacfec3473d3bbedfd5b8b964210594fd36304cd97cb09daf43e20eaeebe79f08829e0700e685a3f98078c98e302a0f5fdb7d8d3a1ab30521ad8f42dfd27c7f9974f55f2978efe8f1124b194eda34f5fc79a825b8868e3796bf411bfbea58b0afdb042941457f3f321dc53128a36b89dbb2dd85bb9f96faa21961a3448033f29b2ee181443999cc30fea01d5e24ccfd0c5463eb8f51e9a1a8983a30093ba61393e1e8aa5287c92009f1a7058b09acdddee731e7a6c4861afc55c7091f2aa5c8ef698fa39eb79e0af6ba2eabbc5df753a0b36cbdfe42d955a3143cd93271cb8f012652c43e54775a31cc3e3c9b60fe8e495c395937bdfb8422a340a3071b8245a12c4f2480edc87ea8fc93101fed600f825a4314fa0482adf0eacdb07a029c1f2f07de4c4fd3a5c0107a6631078867a3a812c272cd2b97addd7c3b4c0c7c19e13396721783c4f9272ea714669dee5c51d246dee723fecfff678deb7c37756c4538a2b1945250e67c6c117e75d0a619163be94891e7f13ea29b7fad1edb8988bb19ca2af144ac13acdabff82d07dd1a6d72f527d0c1c988f3ed1bf0fa1cdde0bdec42b838035e659a8b2c53e1231ceb843235bfb1d7eb52dac6a6af0dd4feda255bdfbe90a80d5b24ab259f358e4f1fdd42ce99778784529ce1088e9ddb178ac67345e4c80bcce2120715a1ab4e17c0790abaa4b395439b5153ec5ad3fa4018bca598f242c5200df5c3d4ca72f72f4236e70b797355843533b291a40c63ad423ed5c16838c586142cefeaf2f4073fd06fd1198db10d4e327a9454a04fdb0afbd25dbde2d15179920e06664e6986a9551e6d0e750231c91f81065aa5cc56f313373c110c7f022e05a39b2b021b6f59d28733088dc715c31a410483dc68f022e9286016b05ca4a306182b829f5fa3140aaadf5160359b14eae2daaf5d9e0e55d52a97313d46c0ab641de352f092cbacdd880d85e0ee3be096076fa84c23cf3280fe1d4406da0bf9f233e1ea908944b8bd1964c5f8f0f765ac4c0fe9a9e0dbbbe42a6f8fb8b4b9e423fbf56393256669012a4dc005c89325a5ee52f14f98402e22b5bb2ff04692007853f3f3a376c7cf9c23c987b5e443c2d488a05c8295d0f0f84c6ca7360d3f22f3632f0c30377167e8d75b10c515fc21ad07824e0ef2b53971f73edaf1653c5ccca861cc44cae8354b3e92b4d99bbf7e590ab7a982dbfe883b872b2bf4c72841209f0ca3895360cdc5e7e484738d7e4b6886e227c1e2e2f1526d583117d7c654a75688b0c0f1310b6cf6f2c7dd49dc3a84d0010f2b83839852265f1fff3c307404f18b5926493b6de12288b1e703cc5f7f5ea06ef1dd2011202c80ffcea302c6758de23336d03c5d25f3df577790a4de49efd09472ba626a60573fd3320afc9893dbb35cbeb08014003cc61bdff6bb1d5c46590164c2c7a0b82f1707b8f42789a6e9b96640fff53f71c62840ddc5eb34aa4d3f3ffd8b9cc782a993dc2fff8b636b75ee60087bfec016c72cba50c76d30f9da80d8638f029d4db221e00d40a908fb7ca99f32c671387cd3448972d84a69459dd1a17f1b40e5512b04e46cc28b5c8156ad54c13720b0faeb614a97e08bb4a78039ea027bfccff6db0637cdd6e0ec832423ca170ad3deb57ffe3343c34f069a5349fd8eb8de975a56587044472f49b370550fff00b16e9fe39ce7e0afb4b8c0e43e234a4db043c88d04284e5228cca274ff92236ffe0f68ee67be398a65dc407da34fd518f807840732e79b881a06fda39874e17964b0f4742c2714e3e70d92055827725bbc7942d9dc4828d3227c7735267230ed24fbad8e9883907a1e336963125a2366390709741dc89e9448fdd2145be4e6d34a4d1d91470dac20b4eb76b970ca456f8572fc4633fc2598247b792687b1c7b331a3b4461f0012e4e9c9ee9b04dc587dc8371141a655998648ff89e91ea9264bba62c8e825489d9c7b6913443b8b2141bea76f451f489d05cd8241023b948b112a703a173fd65c849ff96ad41837bd93a18a59dd35fee4e6f87a9e5aaf775041f5da2d8112a138c0cb8594454a45ca083886b4e310d0137d663668d80b30a9ecaadb345d561049d459bddf0ae98bcd165f3d1ec3fda3e856e095d7d0800feb329b39f95c9fe291876825792a3203f4cdc3addca09a724f687018a24e104c3dce0bf414d27c0bb2d14bfc1f5860f3bb1d1b84869e0c8949b867e390207d96b9506fdbd486deefac20a0b1fc459983bc0e0b98aee13da113a36ad2fdc654a2f9fd8128409c00ca213bd405f60f97c85f4332738288791db25ca328b4e7b3adb7c0fef638f5cb4b1b31e94e47b9ab1e2e9a13753e1ac41f849edc5777d3e79e911225d79a952d93ac11bc52b67451cd6b87cd75c58e5ec3d2c1790d1637276914bda8b547057b6f09f9056cff04dfd118043bae7b50b13af90a8cf86475d6391ca5b22b0a23d769a35ade080c36174db8df670d0b7555619623dba5f03abe959f440ef0fe46f5c3b243c71d9f7e8a50aea522d08a3a89548150983254d893e3c26c8258f62008eac8e3187c0db5942ae141e62412aec3771cd63e1fa224b42a59847c6e7484ed31b26a1fd8381cc0ac1b86e6873ad8ddff7a50b08836baee156592c2e418a7c6b3294d246683b645f046163430e170d4d989fae7861782e9e85a4a8d677f8bbe23ffc486cbe8efe00a4832bda64d452a3000311df6aaa591268dd750376ae9ae734810613de6931414f2c3d202c82bec35f761dbf0588b62177647db07a0e9f9643862cc51e6403f02914657a27f457d717f19afa00bf6084b6b34731f5b9964ea7cea07d5fc5a85c12a00210272f19b38803a94e9a412f7de54621888be887f213fc7d9c336a07c5cb0bdc4dd73508109047147332fdf6ac19d17d0afb263dea52bf6a651a5a55ca912ffb69c71e36c05dc2484dc2aac4d0f848e18ee5718edeb123600c02b8df0614883dd215e67070e83b980571522882f83a1e9ce8e828ab2bfe34f42558e6a9817745974927ae5333d244821f67d9df9c95495ea16745e861e5f70b72027b74e25f0d125871b44f3463eb9a068bcef7cc2e5516bb9f3328e897121b563e302d606248b579f57b2deaa605316584c1ee99e24c5a257a590124cbde59c00253c501317b40c2afce813c59075b831ad1e47fd01ce1b9ea012264450f8d083cb43541c6b772bb254f0ea63ece3168b9a27ae823339c97bf53bcc40755ef1ad035c9046fc2f43d0730498fc4f82c511b831d1f6f671ffbd0f60aed8d1eda8b0a6c318dd5006684b14fe4a9b0d4289fb208146c66bcfa93837cbdc17268465e11b3bc4ec000eba5b06edffda7bb5b530b8f076b6de88621c368be445efc6934f7da18263e4945fff49415072fdc2432368dc42cd6fde6a9dbc6999eb59bea5f2bc2c1a311322b57dbbc7d66815760a6245b0a8801501fc46d4c86204072ea71310dc2170ece85a1a4e93fdb5f3279ba9ef0d8b214e89733782b3073cd170ba670e47d832f8d44d8cc452cbaaeda04e4bc0c8a5243f98713b02cac0047c88d02d7be6a9e661c47367b2d984668ed2631e89d848a37ff8f8b7466fca64fc614be9c9da3cbc16fce7138d531ba6d1cbc5f82cc7fb4988c4693f6fad48d115a621fa5a1386c3a158c28c25a8ef9dc7afe78faa7a3563650455c591a0d943da8b1854a3284fb24f48f8520da6e6ce0a50ee7b2deced0701ec88adfcbced1801c4f10b605819f80522e20b15084141fbfca155e9687368b7bac253f77f83bbea5c3a0a03ac22aca32e7dfaa5bc33b3ddd928ab92af639675012a1f14c7ac8e4370cde2f184e1ede5465f7e7e567f3ba9313ea13e3b371c0ab55900b58463fa2b623f2c2080b8bd6f0f040552f2a3177953cf405d8d64f1cd6f260cd10bbb1601cf91239eef86da322d064eaba184c4ff115858062197f40b1b91bddc8db374aadd3248036e6107e12d416d5b45e4e0a87f5e7366446c84d16451d93f985e9dc5dbc64394b513bf93b560abd74eb79bac566cdfd7fb0fefe8da81f9fcb266991ede82bcc349e8bf7302175f6abc5a2416043252e160e04c232deba30f24f5b9cec79f61801c199db899468416c198e9adcb709034392d70076c5eaf585cfc1f102ca014081a18ae0a5e32bc6acca708a6c160c57acc3aa20169e2bf91ea91c10aa8a2a58b2d498c69fb5ee647cba92832fa4473bdb495e17f6bf2cdc42a82b2e2bc0f7aa8884b16f147021f23b06554a56a21f9b0d9f235bffb1a1a9edb2e3b012cc3777409541acf5b275561741ece824ac7d026f0c39ff21e284ecaadafa04c34bc72ec88c8082cc287295d9c217ef957de0e1bd90401db8dc3b7361777cd144deb06d680236367a2b055381d645d6330af6005ce078240fe72b7ca0c303286c50f68ac2a419106b6d863a9b97f5cd88fc70aad3b8cb8cad39af5f736e88bd98415ebd8574e562f1c614eacf50215e1c82a930f3e2e82df5a21da4bd7120bd320b8f2eb6cc6d542e995e34d900988f5a94954c33bbca43fb6ade09cc973c836d9230ee66a2c0b4831ad630f49691ee0a1cb1465ec1ae046407f225fa016553e46bfdc4ccf459105440ee49e7da5db84014e2ca337069a8998de3b3cc25aba6db94dac1530fd577f6846e09e4e1f5c9914d6b0c78bf7ff28e9881437cc0e00ac98277405a7e8066963a29156f6a41d2d6a9630c903da922c9d720ff8fba2adf52e117f595cc200ae9ef0e7b51966af7e78c5ca656c549b6d617b8ed4aa9127f7ae7d80630f5536ac75ad2b56300dc9e1bf14a71d6b7850c312c702bfae60d0a6d50f76e07a9e3f6347506f636b13d271468b01ac1605de2217f5f0beb2f2e85c26ab56e6a91a108275b0bf844c958b0af0222ae7ecac2b96ea4f56f9ae0aee3b7845a7dd181ee81575fc1f440eebe579d10078131b2379103566478b904b5f28680a5fc9f3684f84bd7eb99967a9f2278595f330bbc41d10f7088c540d0d19a93b65aabbee34b26f2d6002aa1dd673837adbca65866675b2a125a352fb68384298c38e825f986f052db5bfbd1216aa11855509527d20411442b376f6424aa518d081a9371b6cd032718b22a6f0cc6e9667db39525e5a671575a706e6e5e644bf8b3b158ce06bdd9593f11a0f1d641109c25c9c0ab03b9349633aa57318914c4702a53223eef1923db68cb1c5020d905c01d0dcd38433006ad5255116a3dc5aa7e084d8ab10d1f270d1c786724d6c8760784d109314249181fdeef836d59c79ae748aeb2fadf41ae298d92d0ddba53f1f1f1ff30ea125361a23578ad4b937caa11a384fafa1c4978c19b71ff2f3b609810971bc6be60c0fb31acc3ef21cde2b85fd21aff4958e738b981883b7f30dc7ce85aff73e4ba80d4759108954456b8601d3c93c4010b24ece63159ea22bb69f02b60db70af792a2fa220b1035cc745c6018a5e967edc1bcf2e9a2ead4ce3077810b6f5c2847b43b85511e3ef8dc4dcd31a6158fa8ab3ec035d8bd4f134eeab0bbe1fd52c5c141e06577af66599783ab038af045885f2aa6da28f48408f667f8ea5b59587b5c475a1b1e55262b217157993e50549d4927766119e674a733cbe8caba446bda7cef55a0364a41e1aaa69f965c139b829dc7427e62d36873d7e19081ee1ca699422c92bdf8288e340b8ca33a9a35c58a92263d3b5070c62ba0b6313ba837040f4639a22d34982149ed38fa1204117cc7af4c959e0650dbb161f97ec704463b16a1589a08c096da40464431affdb0d6c0ab84e554db7aea6cbc316ac951f79a8c9459daadaff17f543c9c4859d36334b7518c52e9e06dee6723a41f96840d2386d329eeb316709c1d95caddf882b8cfebf27ee199854b124e1adfcd81b3c1e5f4ccbfe23430cbf72b49bb05c7879ed1aeb2acb1bc7325b900938318c7104d8dd2057eb604426907a637ed7e19c6d7336d83d112b83f3aa5fc6ff0984ad06cc6b576f6ec62c38f37f7b5080ece2c62d3025205eec7ef77c2f5c618669f1e5bf20d792365e6c44d3983f83128179a89c7cce1f7f9add93c736c36eefabbd2f501d1d423199663227edc8b90efa5256ad8c8206dae862489644544aae2b5342f9a2f4b325477667b2fef471db6c1144b15fb04e1f41a87a43f14ba69515b4cab35d5ba326fe8ee6917f867b9bd4e50a8f2230b06c8bba75dfac5785815c846c533e0983e997aac1dc83ff73577f4740df9ca1fcc3bed13b611da3ed055b25b12780f32cbe708a56a79952bc6e3d23c99312246b90d38d3e3c6c2e3c55ff2f04ea1303ae45b3617988af9ecfa86c6808f1b6bdba20c4cfda71e6430c58fb6c0e9c82cc0d0a9a2e63bf8e93eece12a943eb702e748081e9b4d2e37fb920ccbfa6dde536d9f6dee7f7abf2c6c13b0effcd1dd4990a52cc3cc6687ca703675dd1cc074b308e7fa60d57076e56383d5e5f02e1bfe29592fa6ae0e8c90ffbd94e8757f89cbdb196d1502cc598368cba4989beb574a8ac3022354c30a9fcd6a560c9e53c4975fd7757d74334459df724a84d6706975a56094de3e9d39090389951b903fc16fe19e6f8c80716f7b9137f6911e40b5540f57c27a47c68f40475000231e8c613fbde599d0a08d9276c2f58fcb1df2f111428af03f2e9d7d1c942c4fa58c67eae69bd5e51400b097d544b6be51e8c28c66048315e3d5cdf79aebebdca54118d5f32f5e024144027a63c6f162cf51527d130c5a068c8a213318b7f40776de479df22dba62d764b5b57b88c7b864a62d088466307de16f7e2d36751ebc1e2c4d046d2d1b6fb46f14c592589eb6fc5ed105b73692674121b979988efaa673f93b32dfb4641ad085da16e1e3a2cd9a9abf9678d3c6db4ac74c51132a0bb1d858bd9f247c016bf870a2dcb824231408875fda4ef8fa2c52114c7ee586e213834540e622014d6acb682ffcc2cccbfd13571f1266051578669dbd9622319359d66d27f14042feec254952d3549d8b027bad35780315b0657360aa18ef18c10917a0a9937d276cee2e8a4495b1c2d7c6c3ac8a06a69f31324b026b0295fdb3474d5b3c1b606eb62d851a1e2d84fc3576f99a300016aa356b11baba1e0dfec87eb544743ba15c92ed5c3565706ca8b521e5ba8631070dc1d1d63b5307fd2e871acc1268f0da20719202ff0f99f7f0f53aff74b773676415e9b1455e749d291e126bd032798675fd4725a2cb877d0e83d9840c74cc6e93d4c0011ca01a4100e396ad83ad8ba3bf80d3e3a93b4048edd829678d3bf9060af91c49c06c5c92d5d4827b310cc21d75817f02cd8bf4515155f90812d30ee24f69743314677574515b5c0463fd3a49aadec3d61be3067e41755a76cfa96e44d4dce5990ec80cb998ace89e5c8c728af14cbbcad72ef6559e0d65100e879db9934b71c4856f53a49b490509c2984f8612793afe9f285d17338e80a47ce8392239a1c451025f70ff2390538b89a5c1fade36f54e28cb17391294919f780f945fd047b639787c588ff4e9913e77348fd09e8ffcdad96fc16f52f72967b50d2de81ef3037455bec94e6e6f36809804b7306776c639daea9a85fe120c60eb6019526d3493490f65d5c9f4d7260b6dff838b311e1240f849c44e40a8a082a86843461a033df32f2c5f10c13c642b22563f15e83696f71c875294cf5706c5fb10fc7feb9ac57a4bb033ae537d35b204c4a9b0e6569c85a1e4ddc8d48371519ad438a7623eaa621a57934518f2d867b65d6b2582daee8f78be9db3a1076d945cef90d7edc816074cd461f4a71171da3536e38517aa1a7c1bd18433e0d86f82da4eddd6defbdb79452ca5d0c400d950d3e6f5e740975cdbaf8fce0bafc74d1527e6a3d2009cdaad4805cec0431010a42e2484bebc5dc1bc82648c8c802f16f563d929511f2372dbabab4173f59e082b69c28d2dfb188b60555c1e566f563f5fb665d50fe7513f250516bee2322fa4d73376bb0ad185a31b482546188288bad5f42d1b7055b39ad9e18824b4b1f134254c2ef9ba5e2eb0df3d7c777909f766f3368eb9b762b2202cdca2ab38ab0ef25dc8bbffda6159d3d7c0ef45db384be2dc821118538dc02c2f466e122310516687ed3bcb7857a1f74a48505373f852a0e4cb418af5bb8f3ead14bcae8a814abffdc9b8a37472e4a513497545cc446bb40eaa97d282da791bedc219544bafa8f0a8b045ee1ca9aab9b46b33547ab2e54735724faebb5e63edf483aebdece68ebfb66fd75f24559ab8cfa0287c3e170385c08e6d09c035f0c94ecdae541b7d977c6212d0c43f4b34f038be70ebd04bdfcfc9d57443b507e46f78d0f511bdfb9bffd4380fb7dcf0cf913c1d26c212cf594481e99ad79953a532289efe7932c711903e641871ec2768ef7e03fb7ffa15faf52889a427a82c8311ebd3faf8e1f077f9fefc68f553cce589724974cebe1943c3ac4d9cf67b73b1e64d92b566a679633b618b63dc0284f3993415ba7953c3f7aca5717d1a77c89117f4acf522b83ac64a0d287082a673c08959a4a9e59115f10bd3ccd267b96a083e7be9f7d67ff9cc4e78be0f7dfb9af8a526646b495fa871565d00e43258d4b262ac310f2ad34a31495e411162579a445191b221a95f52af9ae9edd82f0b687ceeef80fbed6a3b21c23ba28431c2c5219b4c3952f26309e9030cca68a3fbbfd218005ff7bfc96f715c328b3123746592211934ad04ba6a0fcb47485f1028743ab63c4dde6aa458b8040de6bc3e826eef4bda86851c8b68635ac210882a07f3db0f2c4ad5fdcb4174317efed3b73e842cf81d0bfed1fa29846d31aac9ed1a334dabf3ec6f904b77b6f89b1115a6febad22997b6f0c245555adb5d65a6badb5561c36e24ad1d55e115b9ceb91bd169b35f2077ee1a7f1ecda9b74034caa3c2d74a9e88dfbefdaafe62f15fd7a908ab808a3903f10346b842888e2f88de398c7118fe3388e771ced388e63ddb99eb3d974d10f346b5cf3828bf3675e604bb3863541f333cd6c9a26bed634cdaac5518faf6bab6e6a7ad9d7eb553fd8ce318eaf175996668d7bab47d54d1396c1f0af63fd9a69dacb34807db234611606abb9b437566dbaea982607f60d017009dea233186d26c6625acbec27e1e0dc9a8c6adcb7d5235a53adc6fd593daaae5303415f746b2d3565b058f176496c9408ae180d92967034eecd4ffaa29a878746c3341a8d766d85c1768effd120968afefa6d7f8988e218414ae36a194e998473c63b7767c7eed411b64d2093e1e0e4e4cc664d3bb527043f112747cfececeaecd096684b3c97c77eb3593dd2d1d9d9e1e1b9d1683d3d311f1f5c9251ad4040f8da71c7a67b2abe9687a67b74896bad866bb55bb322cd6c227bcc1a3eb4ffb13f15f7f8d89f5bc340b9abc6fd1bf5a866f0d57b86e53d77c5caa01e55c7251989e8a8e26523cb7bae3022cb219308768b156916b2f29ebbac718d8c4a23f2351a1989a191ad3cb0d247cf4a5befcf4f2da82654ddab9baf4ef6ce1345672a542ccd48aad5665b3134444434a335dd6645452c74ac458b16b0162d5ab468f1657c5bd8da53339b6640b4594dac41b66c02f2201bbed1846c4dee33dab56fab3f43f1b5280ac27e0800fefdedc15f5488f4d3ac71ffdcfaaa5061eb07733f4fb309b5e605e58a3a7487ecd0a7c2244036c25d5bb1b862e887be2811d1ed5654c4a285db6824d228864848e08794f145b24848485506db3986cc26a2dbad286909572b8b92058b580bb3a9fc8c32bed6a88ab08de38988cc1a96bc990618c1772002dcad88450b23b3c6fd5a8f8ef0b5b51e552f329bc4ebf8a2b5bf7bf6778bb6d66a3d8b9f495cadb579cfc0d246ddba3316b4598dd455377f6b43f445599806b06f74a76817481e64fd30d1d769607bdab03a5ba4ea464797cce72e3fdf33a3d8baa88da02fba4b24dc8b180cb3a9c6b03144d8cef147f90343717c91a5098b69d9114ece4c678787d6e3f353030a12f21355615b3144742b62d1c2081f5d5b9182fea21b036f510838216bade5d72a02b25eb2d65a6beda006fe6c91acd7f879eb625d72496bd6c05fe33e07f64350ddf2e8d23d3615b0f315bd17a05ffebefce12f5f20d82ec1570ffa8a6e0c7c05edad6086596b6f40777e8ccb2aabf7265a74e7382f0dda7a07f9b768e27b4b6c7a366bd8372ff89c03fbe641149b4d1fca817d83f3f6e0e782dff96d8da4afb37b13af12ce68ae471fd8af393bd5bd4935b951301e3111b8d136b6641b94c1d1204bc4e0deec6bc6bd595ec525e5d86eb3269d7bab269947c7e78869dc11631c866088437c86a82649fbb9ce5967b9c4d556b0fcc8b004cdcf926399bd963d332c3d2f1d7fc57268268c06334d8f5d530d6e8b5b6f9af6edbe6f1bb797682ce1a01b67f418c750186aa2dfb967dc974ece399b5245659ef50a559e505010134035dfb8194035b4de22dd0d70aa8914ecace68c2ddc52122ee9b7d5cd48b28b8a9d1516b4d45bc344cd05f57a3d23c8a0a939a0ded501add15253a6f6e3fb9644d67ed07a8b2aaff2ec54af17c512d490277dd658121b9cd1cde877e525f9b03caa06c201d56a49fc18fdd45ba4857323029cb3ca8cb8fc86baed77e51971d9d8711a971c4bd1dc719db3feecac9ff3af276b8db465362f7839462f4fdb12aa9209355743894aa1d26bcd95636c24fdf3986fd14400e9a2d3b8d78afd604755c2f51642cdfda061b53acb542bd2ce327d20c7c37842af3527f3d07f646809f5196791b26b748bff64c2d09e2570389e1de7c3e39b66b348d849ecc383d65b647b18e7dcb5d7413e77199e3bf6dbeaac91cffe9df5a6b55366038c6edbe3711cc7711cc7711cc7711cc7711cc7711cc7711cc7711cc7711cc7711cb168e3e91609635ca3618c6bbfadce26264b831f1feffdfcf47a3e3ebd5e8f8bdeb6b7ad4e4bcd56199e1a0d9ce3a9b7c842ddf8aeba6050b3d2b470f4ad67b519361f1eda8f4ea3b550f125e70a638c4b1f2743d78e4d04947ebb91a10ce63c8ebd5a267be537b7dd7078ceb07e20c7c3ec558865e8be619045caf64ac7501ae65ddd5bc6bab7fbc4bb4f50ecd57dba4f3d3eeba9b7483c79f6ca066d2909c7d333e3e1e9e909122228485ba49186e65b346ef1a9b43133bad974199ccbb7a8ac5d6e64afd1b0d49beba191e4575a74973f3aad6ca1a2462dcabec31f259863cfa9b91ec75e2f2ecbb284f59c5697b33c5c9443d27765122b52e915e631c7a6024ab7569bc7ea62386e9964ae694c342c920df4deb255118d2d967bcb8e516ba54f5c6fd86967588bb065aaf8cace0fe44000d66e9178384723866627419a571a6aafb2e72b9cb33d5c943d6334db5e6d076d755769e39cf22e9fae5216af52f8f5b3e346cf5e9ef8142dd2e83430e8e1299e1de4dfb8f2756e1be563073fd06cfa5ce7b43f3bede79cf6abc539edcb4efbfab41fb36fda27edfb540bf47df4733c2e3a46cff1ac16892c1d9f1bc7934e0b63be5b6c15347e94b4efd88f5e6b8ec777ce8fa66fd88f5e5626dbb348d9471f3d8fe8b661f4a1eb30bbcf4e8719a5dd9b0ee7689edd2d137ef3e685bec763354773acb3e3aa84e3d8c39af3713c3a769f33ac45a3e39cb8de46979db51ef59ca387423f3a6d44f78def47c72602467474b4bcb78cbe3e6bbd6df2b1f39cb516edd863a791ddf62c935891b067a2c71e137aecb0d76374db3035ec34cf7db397e716c1dfc01f3a79ee325b2411c561fe7c7739d7fa3882acb67d9f1ef41ad9e2ac35fad14551747b6ea3174791c6c5dd72a45be748ab93d7e2961e74129be6a9c12d02fd737b7ebef556f7d662b3e9739cf4721ad79ed8bf93036c36c57cebaf9bf675fbd77dfb5ac5ebb1f3e7f398cf5c9f3f5976fe64f4670132375d03999b9edd4471c090510db4eba0384cd78e63e632cf91c2ce9f05c47ce63f1faa41cc673f1ac0dc74989b8e73fe7caee339d29cf3e7437f1690e338ae418ee3f8e738280e183e54031cd74171fc7cae7111e839521cc7f1f3a11d68a0e33bce809af2107111e833df4171e0d8f11d5407cd91e6788ed4ace9ec9673d614e7aca9ecaca93e6b1a3b73a4b033475a9e9bf6a0db8bde001d708623e8514435b8b70c666d34f69b331de499e8006e1148e3de40bf4ff4e719e4815e6d20ca81fb145ef108f1c918a9b3f7fa6ffd585b5d35650fd83155af32b82e8a9ad694b484f6f377edda2da0166107a32bc229cdf9bb5e6133837a84773cdd5bfd8dabbab75aedc5b0ab9b45a1abf7aca0abdf1834f62aa6f8695c5e0884d669eb4d28f5d04081ed495276eaa744516b1acd337abbb70e7a3d124dd7dfc09fef0d076c8dd52ef500e7a3862a1e47a8c0c3619db0814956ea81a52188375569b53136f8d6ad1367c04ca5624ef0822e253f304c9a22bc948c9d3ab4d15b8cb5d16f64527052d8eaa51e845ae59945ef4c3eb1a384def982fb6280fce0a578aac8d653ad328e2c09612bbde77dd29638ea1345cce8520f88f45b5bc29523572919dbc9b23fa4802295064037e429256f894f2bc5c30b4e2989afad382b398344554ac684c6e82dead03e2488524826ce2abdb310114ec24e113d85de59d64368081cb687901ca4521c1ec89670aaf1a4d27a29d8b7b7be6342ac4b6f114848ad0b171d78b5fc02480fbc948c65367a67120a718a29466ff127434d255195de1d9c46d8a564d797035010bd45924de53255a54befe39cb64c38ee94142698e8520f5e5fa052187e0c50cbbcf55ae62dd2972bba948c8950f4ce2fc6a0ed25a9ce48e19091e155e68c68268af04c96b18c11b90b9b714144e3842ce36334234378e6074e991e6740087110c93019cb44e19cf9209b717a911973660d4c099c32278468869067ce9489612433251cc28c4e2c53430e9a15341925f98c0d26192e386782d065b68466bc8848f81c09c9408166ce8867ae40abd10c980f4d8f98192be11929ca7811cd2891cfac5006cc2884c606bc4a395bf9e94ed5dedd81533d98dd39ded226c8d381bd114fe55de5e5a97a759fb62c2feb70efbbcabc7b05ea763c7c957b1f0fdcd9a99e6eeadb029f2ecf5e7d4fe0957dc2b96f07c3d75a6b73c618631fc771b4d6da529cfdadfd35fab3c7da9f81bc00202f0dfa96f8626c36651367f382ecd96cca68fdf087718da4c7582b3f59afb5166374976fad78f517e77bd1259eac38e75c7ece18573dce5586f59cdda2376c6dd7f51cd7f9b9680633c7f12eebf312b7c02f5f9f9d77ea52603de7bc5597878bacec94f9f8723287312dd3315849be463104a770ce56657dbc9d9f6497b481ac7b09976b0f43de7a046e4e5bc0ba8d9bab3ceb343078eb349d75c739a61d64e0e95062862dbad4faed955aaf5d5f4d5bbb1e0ce993c4a555a0db03afc2ed49a25eaf52be81ff7a154dd0d77116579cf5ac16c9bd5ea50c8a3324fafaa967444367bdb9c8af67507c95344f415f17aa79d1adde2c0279bd4a2dfc7a06c55709d3b3bf6e33a2d2d7836e462d5814d59bc572f47a958efc7a06c55709d33833da5fc72dbda0afd792968e8c5ab0a8378ba5f6f17a9590fc7a06c55709d338b31d9a8dda5f9f310021fafa0f8d0120b938326a516f164b3d7be1d73328be4a98c699edd07c6a37bebf8e410647f4f59e0364f00287e4e2c8a8de2c967a46e3f17a9562f8f50c8aaf12a671663b349f5a905fd7200241f4759a03221003c60b1c928ba37ab358ea19ad76865eaf12057e3d83e2ab84699cd90ecda716e4a8edf6d737d080127d7dc7021aa02029068c17382417f566b1d4335acdef39cbb93832526a41018ba4a2183718442f86702b906c36ee0ddfb837ace3811b39250a9262c0788143aa378ba59ed16a6ebb275801928ba325a35c0b2516141425dd6210c1187ab10267f37b5d04ba26fa7a8e57b3060e5d054b39250a9262c07881ab378ba59ed16a6ebbc9bc5e2526bf9e41f155c234ce6c87e6530b72d436746361e40297c4c3470cfa3a8e930f2619152ce59428488a01e345bd592cf58c5673dbcde89e00f0eb19145f254ce3cc76683eb520476d433716462e703092969ea060d0d7f5102800cc609251c1524e8982a41830eacd62a967b49adb6e4638b3bc27cceb55b2c0af67507c95308d33dba1f9d4821cb50ddd5818b9c0c148525a9a119544067d3db64b6241000030834946054b39250a9262d49bc552cf6835b7dd8c7049f77cbf9e41f155c234ce6c87e6530b72d436746361e4020723496949c68c1ba0d4d40afabad964ea6958100000cc609251c1524e8982a418305ee0905c1c19b5605174231a5a6143cb7b0ac0af67cb94e4d741cb14c3af8b9609865f7f59a6d4af9796e9855f8759a6f7ebda32e1fc3a8e65a2e1d7679609c9afef58260bfc3acd32b9f0eb3e9629007ebd66998efc7a906502805f77cb64e4d751cb34c3afdb2c530bbf3e649998fcfacd32b1f0eb2c2c930cbf6e64998afcba0bcb54815fc759a69b5f87619996fc7a926522f2eb4a9629e7d7972cd3905f97619994fcfa0ccbb4c2af07c03251e0d76958269ba5baa74f94be356c156aa708e04cc1bffeafbf4e03f6d72dc0f9eb01d8f9eb00f0f9eb3382fe3a13fad7650cfdf50a58fcf525177f3d07e3af2b29fd750ace6a91b68cbf9e74568b743dc6792dd2751867b648d75f9ca245ba8e3b4b8b741de9d416e9ba8b736691ae1f9d348b74dde8ac59a4eb2d4eb748d7599c368b74bde8bc59a4ebb7d3c8225d273a7116e9fad0996491aeaf38972cd275db39c3225d2a1aebecc53832988af346feebe8e9a7d01974029db5f3e7dc3376c5b2abd563a761e7397715f3d8774e9d7357358f7d76eecaf5d873308fc72e3bb7f5f1d8f5193bb78d7aecb073db248fdd3ccb735baab753bef268380c361001cee5d44ae15c4ef56b44f752e589e8ae57352bc420baadcee943b785da6574db295bf5d8df1a599135337ad3bee646b8ab847f30fa559ea59a5279336e8052533396664425594a5a7a824ac2253df62f3b68847bec9fd1cd480dd7cd76eb69d9dc860d4b0c58fb40daacbc38dba83df64f033411dcf0c00c475bb23113c10d6db33133f280164149bb91fd46b9717cf938679ff349578b847d8be5cdd5d42784708a2d25903085ae8717352510117eb50732388ce912c4051282209115e69081d72386ac333a22241ce1252c011128d4c0c584294af092664bf8840b574ee083102e1f2768e120d38da03ba1491256824033259c80133444818035c58820cecc109aa0cd1340bcf940c90d55cc3819ba0a13840a6d94d47082324c3c18a306092134b4095302191680382289102098b9210d162354e0208a287e2051831211ae1491c2f77ddff77df58a13595db6a420458931bd20e80b1282d8f0f402991344208284f033cd0891a5a3049e8e26d23cc4e7127a7cceeeb7abf47ddf057a14896255e487ad11c6bcc981e9f7c1bef2802893132409149128165a5882462b3bd1c2536865245a4bb4866811d1ca45b4f0105a369c3f3014c717599a3272776f37c9bd5d276153f776a9eeedfacd57e92a5da57a95ae52bd4a96eae62c8f3745eae6ecd454b5bb5d92a79bb34f4f96c7cd599dcefaf8ea22b8390fd8b8b90d947a5c5f7d833bf35a97d06abe337af59b118f57c7252dd1bcfa8cab642ac1bcfa007abc3a0607c8c0c7ab6be080085ca5254e9efe78f59f2278158bb556349b6c93aca91b60b8cbb29b013211f3b4f419b9929461c0dac2e117ae7a46d76cca41ed550afa478bdef6ca8a59e2e469cd73fcbac5ba01a85da59cab94e3d76b39388d2ec5253f3f3229f4ec5ce2e3398d0f49c6a2746d498fe7343d262642dbfcdeee121acd34c99c451b2de1e11983e824dcbddd253bbe63863df48ca57bbb4b7496febace87b7f400ee9299e734da62dd227b756fd7730b1a837bbb9e465b191220b09e82af3c20a29e8cfd344086c3c608596276a9cc6b7aa5eece5c404d655ecd05dc5486ea0ba2a065cc4e8b18aa1f231ef49002892198f86063450c1018728200c2abf22901f1c2e585228c40e31466cdd83543ce194957948f1a6648a28627217ed8906f789203c8981c80a0d2040f3acc0026081f6fc2207e8040e583820f614029524723a465e9ab5dad6e8f5bda00575a57ddaa3b874e14d19d6347e3310284fe43b13f4675d809692bc63bfb5773ae18638c6eec1f8a2d768b51119bf12763d65a6badd5daeada005b895759342ec637dc92dbbb4bb1975729fba4a0eb571a37973f2760ce19dd9f874e7edf9773fef2f77d9f8bf9dc95778a637df988e67bab34b1ee172abae39cddd1b2aa156d49e3ae886efdb2ec2097204714f1206a7bb6cc55027368367d4c501122cd6fcbcb4df9bfd3fe0b225c31e2b7dde51d50570682d9e7339b3218fa7590891e65d0fcb6f7011f9cd83f27b3d9f4e126bbf572aa392ecb91c95ce6158699e7380e1c9fe5a01e5c29a63ce1a03a1cc741af0e17d92e5c64f5059900b184807db061041f9cf8d064874f903c7ee5f9f0f47921ab6d83bcb7d5b1e8bef2aef06aef2b0f87153e3f551956ab1e5906dcf442e1a211f4ce4f6015ce7d5074ed74dabfa92a9c9351648b148f87733952eb9fd5778573301d7cd8f2a44bad7f5938b7012ecaca3d9c6bf1c313434ce952eb590be7725479f3e6cd1b2bbef207e22cabd1fdf5defa063897b770917574572dd4b4254aa2dfeeedd3db4f2a4fe5aa9ef54feb09e7729a58c2422fb59ea1b670ce3a815579f76d655e9109469e9cde7e4f34fb41bdfd2eba7317a8ed2786ac968903fb1d84808310fc1af56b3db24cf5abd71564b56dbc55ad16abef8d096d7d6b7bf1ed8729460b153d543867c99f0e4e4e6f26f9c01cb41330ac584211872c16e49088664988e37805a7e3647c895680bebcc8320baef270608ad14205f8611ef766734296592cd83433486966090096f16f997bebf162c24e007cf51ff79910b0d80c724b4c972bfca631415928da105a2643eb9d37329c0a8094c0c9917a5a3d9a4de5cc723c23cc7494b6e8ec7ca1e025c40ecf0f49578e858796f318ee413c5aed19abff70095584e0e7617a024f5a7fdd678773396a7803b5440a13da30712487df3e5c9ae8fd20c148942474e9f6c1f2dba792397383086f8cd031e44dba7d70f8ed63a5c46f9f2b1f2c2d3e44b444fddd3eaf2b9fd795cfabd7f3eaf9bc7a3e3d3c9cb33991850c0f4c7c6872c495df3d25b061099b10ac38a10211e9eeb1f2bba7891d9a10f245ca153247d2ddc3fbdda375e677cf16d70b494f941792297f774fd54baaa7c94baa87ea55d5b3fbdb23f5d7693d9cab5746b6ac382199e2cd90b4ca6f9ad65f29765052f5419a3457e9a6ddf09be6e2062468b2a42cb1cb92ee1e2abf7b9c9e86fcf5dd03d513b5040dcc123431fe9b96d545ebd245c37a39d1aa5e4e34decbc9eaafd3743857a580e255094105104a3062ca6f9a5391d490ac1c74d0ea6242ba694f527ed3a0aad090c58b0b6894880122dd341b7ed3a4fefaa64dfdfd4d1bc1f08c607878d4f070fddd3c5dbdde5f1eadbfceb3c3b96a35441026a0f8e0893354d228bf79a4feeea4b2d2a4f0c31133e9e699aafacd531535044b08266868d811916e9e1a7ef3585d61fdf5cd93c5236664c243e49944fddd3c50533c3ea67886f0ba783c3a1ea7bfbec3c3b9edc48ea9a822524cb540c3ef9d094031460910281cdc2c49f7ce0cbf77ca1c4105c994a91a76a090ee1daadf3b5a7f7def6ced70b5d989d266cadfbd5335ea769a8cba1daaf169076a7cdad98d3b527f5da787732ba24822a48d14179b23a0fcd691009728322d0041c20e27a45b4786df3a5d1948212545083abce1724af7ce93df3b4e7f7def3ced0cd1a203468b98bf5b27eb4aa7cb950e564fa7aaa7c3d3b1faeb3a3a9c2362d3c49724d448c98a4aa77eeb0899a201092c4f5c31a12add3a4e7eeb4021400d1537663e6063048574ebc4f05b47eaaf6f9d291d2a91481b91889bbf7bd625eed4883baea959d6546f4aebafcf76385787f0f1440813c61899c22385e1f74c2acbc9c9852d4e4ca124ddb326bf670228a2862a40a208614c0ee99ebdf07b66f5d7f7ec6a86956646244dd4df3d0bb766e1d64cd4e588ba99a89be5d0c0820845ac10a5072e5f5cf89df332b264ca1a2e19485022dd394c7ee7f040a50405ae3146207993ee1ca9df395a7f7de76ce57069c989a225674a4e931caa9edf39555739505739bb1c29adae9c9d43fb9d133ec1099fe0e0e0d07ee3845538210e1627281ca9bfbe71a672af74e3508541da8441dca8e1e2f92deb0aa1645921542f84d29221ca191f3e64d8c1ab926ed992dfb22aabbfbe6557322c7009191170095994cc876cc8ce6f19545757974cd7e56495a5b7d65c5674142b53feea2ad04a37b1a2cad250597a9725f5d7633d9cab65821882ca961dba9a3ca5b685df312d28944cd165b1c1865dba634a7ec77688b082113b62d0b9a9926e9de4b776faeb5b3f6910490c44128bc5b0fec6b2c0581518e38131abbf1ed3e1dc986508104ce0a16b8824290bbf634e3574545cbe484121871ee98e9de077ac2e2143171790eca6d44049770cc9ef98d45fdfb1a918d5126d9670f317d6f575c1d47c5d5ca0130c7482814e30d80ee7162085cb0f2976f84164f71b56c14441452607246d8c18936ed80abf613ca826ac4ee044854c0ee9861df90ddb3018961518112b517f619f15ecb3827d59e69705fbb260260fe7727c70240c12416cd9c1c41babc26f33688a561b116490a2254cba4d1bf5dbbcfab1e48413aeb658e121dda635f2dbdca6c985c48c8264ca5fb3c95f73eaaf592565424999bb6d4afdf5b287739509146890f232246a2b4d5ae477a95501178e58f9a1042740504977b9f596c8efb28b053655a474ecca2c916e13eab7e9f4d7b7f9640ef97494603e1da598b24b89f5b7ccfa9ccaaacfa9e4edd2eaaf973a9c3b40126b9ca0e1618db92185dfa5539625b4788152c24b0c26a4bb44e17749d543af0c9621b8146193eef284dfa5d45fdfe554ceef92ca0bd9c68b9bbf6457ce22d5e42c2e2d324baba7a5f5d7c91dcee500f2e508167638e10986ad21bfc91ac4944eca0a503790c025dda409bfc9aa024001b36608992b4c82a49b14f29bb4faeb9bbc22b19e90449e9051a40f72c85f12aaaaab8ad46d9287733c49daa059e2e4c7961382fc7e591d200c1145b4803ca52993eed7d5d3ef57d60d26f8b801ca171d2944a5fbd5d3faebfbb5f5e2ca415e517290d794579317d5df57557e41e5d72ebf7a38577b505d4a1429e28d115da92de1f7a895801d2660713a8344d491748f5b16c8ef71851b98b4b015458519a8a4fbf5e3f7cbe9afefd7d36b081ec1e0514cf97bccc263173c62e1b10a8f3c3c5afdf551877320b841480c63c490b01322f5f17b749a8185146a006303971ee91e9f9e84df23d411dd0c312c41262b041de91e7723fc1ea5fefa1ea7462a6c456c83ad886e443522d75fb1cb4accb2ea59ed706e5cd2c4901e42662823432ac26f512a07942f49a69440e5871ebea45b9c72fa2d3ae143161eae7a38d1a149ba45de87f05bb4faeb5bbc12b1701091080e2246bd7e8b50184af4210ec1525d584ad461291ece6de089335474d0d1c2134a52107e873b4c6d21c14b218a3031a43bbcfa1ebfc3ac0d58e04161450b0f880ee90e7b3c7e875a7f7d875b215711619422c229e3efb04a2b6ca215527585505de12e94faeb600fe7ea159e0e2d4360d5d0c312e98edfa09690962c3fd610c9024256bac1ad0f7e835d7fa5da8809a31b42058974873a1dbf43a7bfbec3a7bfe1102d20182d62c474835db0fe825957e0942b100be85402160d52449460f2258874834f7f75bf412850eaaf6f702a074b37487589b4b944dcfcfdbaee4ecddd714d7d5953bd292da9bf417a28618286aa89287a48f737f56f7e7f559fd55fdfdf15ceef0f2bcd47244dd4df0f6aebf3f1776bc85fcf5d9fee86a9526303902e42ac4e904ef13b5bfded42a5851f94b8e92125ddf94a8adf994b0a2c418ad4b0860990746737bfb3d65fdf794bfc9db9bce4285ea6fcddb949aecacabb9da57232fc7802ca8e24ba256914bfb156d5902436403142e40459e9c650fcc65d5d57968082c85615978f74e736bfb3d3d390bfbe3354f83b473dc1609e88d9b88badc245559867b10ee7aa559b34407a3abef850a4eb3776c25039e81842ca933527004937de3df11b4bfdf5df98eaaf8e3656879bbf4eb8488d13d743e1a2acbbc3b95a86479612c82c59410a98d489df57aaea5a31b9bf2fd6022e91ea25eaefbe500ef0f1376bc83bfdf59c0670975205f5667ddb285fc194bf396618a2ebc70a3c64f8b2246de2b7b55a00102427f43802831b2ce9b63daeff6db9feda24346e91f56da3fefa03aad2586fd62ffe3d8af96b9b84e9b643ec1313bfad53056c8c10420424b844e892b27927217e408982cc942d4b6cd9f284e50b1a273a1de9016e4e57b4c7922f639e44118509e9c5b9ba0686105ad0a1c908315c49ef9aaf00981e11212c99024c557a95f8eb38f0affb127acb9ce82dd3e9abb76e6ba2b7eebd75f3047aebdd5b3791e8ada7deba6ea2776cebadeb17f4d6bab74e1ad13b76f5d663af58158faaf382de31a7b7aee382de315b0c7ac3786fdd0683deb0abb76e96a037ece9ad9b3ff48675d1dbecbdf59e2d7a9b5b597a9b5ff436796f9dcca2b7f9f4d66961f42e7b6f9d2684dee5d65bdf71a37739f5d677a0d0bbe4bd7520357a97bab70e8484dee5d35bcf50e84d3ad19b9c7aebb318f426796f9d4704bd49dd5be771d29b7c7aeb2f2bbd5f576ffd9545ef57efadbfb2f47e49bdf557958be8abeaad874588553fbcb8e2458f994da2f3f41ebbdeba57d1fbe5f4d6c75e888ebdb7be0208cee5d4ba4cea2ad5add00a0a940f6d1f3acc6c0a5d08bdc7a9b7ee60f41e796f7db645ef51f7d6675af41e9fdebab6416ff1eaadeb287a8bbdb73ea3a2b7389ba2b7b844efb005bd45dd5b171241eff0eaad8342e81d5ab10e6ee90d5abd75708dde60d65b9711a13728f5d6750f7a7f5d6f5df3a037e8f4d683b4e8fd59bdf5202bbdbfac87f2200882a283601623511ff27ce8a6d9149679d14bb34924cd269066a57768934aef9cf5d64d287a67adb74e12d13b57bd75b288de19eaadc79eacc780e88dbbdefa8bca7ac983de7807bd7110ebe293deb7ebadf7e460bd078bde77eaad0745e96db7de7a5011bdafee15c03583171d4800697325cd497cbe62e4c7679f65bfe1ec349d4ea77b4ab3111fb6f8d05f665398035daca3d9048a6653b6593827d3c9743624f496e9defa96eddeba6c274b72a5080f9539c9745f14fd5f0ef779fd7e979f7fcf3e7b95faecf92ac5f88c6585309fb1ec867c76d06ccab52a7d0f66b3e92ba5d0af2dfd5aa34b157419a5ad1859e13176db8d56b352a489ff3c5f2516ff55a50a840b9fadd98471ff15a1bf5ed1ee65bc1144e9a4e82d9e59e449e1b42a9538691e4b5f29320196b2b09489e505c58ac345d8afc61883a8888b70d5bde1f034deb6eab1ae1be7a2a979accbdcaab13cb5bcca9205b2e441014b59cac298a5e804acdc71428c953b49e81268069aac9465d1db5e5d5d5d5d5d5de1943b5b39a598c4ac14d55ce9944e75b553024599c18856caa674f5945a47f629655bc49f12a8aa572b3f1ab4804a5993a0527fd02554025df172674ded2c3f1d325a962da8284536b652e45a51c246182a452432515926b9955f1ad16e5c510964456f7b7525b228c5234a71a66b34bfb528714cd6f78b5c6599ac0d6f947345dc339e342a7b6a4eac4538173a765c95f1557f5199b2579ede9465caa82da22255e15c88da2b32323c268fca9b9a6faf663a92aed2b6568f1dbb6851ab12682eca0f8af592442a3f5114af704e0cfa7c75f86660448ab637e79c69554697067ffb571df40e1f7c38572cd2ea598de09716c1ec9f69dc100cbf0fbdf13d08826808becf68c6e126a4675c7e58c962d046ed267e9e453dea10c5a9a0ad6f1c4ec4b966d3222449ad5e95212b0d0dbaeb99d6355ba6cf33ba6fe01b2d63dabde1330404b83a5b8fb2676c367dd93400f9e6cd6f1c3add67b483d16f885f91b2571c21b83f82f8419403fc23fadf35b5b4f52dea19cdde1bf8b3df376f42803d3f652c6af03fd75ba4812e82a7067d8b354a54d3b2e72ca2f8f6998681116d7d572b119b4d1f885ad3003a2e00e1c20f016e463b80d3ad21abb5b5625a5355aa32aad7db757d6f5729a7deae5f1ae700ead1f59c8c36d5db1dc0bdbdbea216fca0d19bf6167ccd6d94d72da8325e7fbd8a4f1863a85b84c590062ec24966b5f681f6dcb6123bbe50160a63df007f7e4f31f41c8ae199dfa2153c71a8d634dadeb8c7f5fac65d259427de0f8d756b64abaa76aa4a5dd036a1592a5e2d4700639d2a5230377d8ba55b290fe01c0c45f57d6dcf8ecfd0471bb6a610b551e69fe5b4786934f75bb652958751297b355e9007d1f6642cbbce4fe801dc9cbeb8a58d2b1f04cffab9ad36fb8c73b6fd2dd7a2ecb5cf5b97b6c74ed06c7dfd1aab36cf15004e9ec67cebbc132e8df9e629ddab87d64df00b40ccab93d6afd9047a788a2f7a782e8179ec7412d3d1699c03b8b7ebaf13832ae6e9e7cde8c49d49df396346ebd23fe2579ef884f6df3acb0d51e0d31880d72bf2662ad2b595b69fff88fee342fe23a2190079cd831cfb2549bb23f393e8a4488aa4e8a26f27495288f42092249d244992244992244992c4c9f199a9cb4c9224e943923d64a9494d239dd42167a4e79038a4cb48922449922449922449922435192361a4499664261de8ac9782ecb553c445d97f4e1b2996f072cd45d77f81fe73ddc783fce7a219d4fcc7813c3bf6d1c5fcf432dd6a6151d4bae2a0f3ea70d1cb814edb858b5eaf97bf5e4ee3be5e2ff7e979bd5eafd7ebf57ac972665eea382cc6f3bd5eaf57cfeb4543b7c8836ebdf3d241b7d5fd6bf6ca7939ce4bf6728d6e0bf5afd7ebf57abd5eafd7ebf57abd5e31747f4e30747f4f26fa2a5f24ba3fddbf72d7bfbc76d64bc1e73fa7888b3ef739352efabcda5e2807409ebe2110a4f56ab356c7c32d6ab1b5d8626bb17f19049d043ff0033ff0fbec67cfcff3c901fe2e309f568faef730a9ba53ae9276faeaf9c4dddb122eba8e4bbab71b8446df2a7cabee5548020f540f3ae8a15fbbc4741a97667b9eaaf4005586ace71c6b9175515753ac47d663e7cf75d26d0a3b7fae979ed30bf07360dffc580527bebe66b1a184c7eddb8f6118e210dda367979db11376bedc9a178c2e827ecfcfc76b36ddd0ab79033f017aba9ca17af0a2366e0fba350dd0d3e50c9407d1254e9e9a68d22db2e29b674dabf9a138f14737554afe2ee14e1af5c8fad882f6df22f9354b95247fd1adafeeadbe58af5e170c81b426a8faec3f4cf4b6bb7dadfe7abd17ad36eee9817babb5d6ef73d2def2dbb9da8b737514f475a1223014185bae9ca1d8fc7dd94eb1903f300cc12fc3903f300ca33e10fcb21afb81e0976308c2e6efcb762a7f6018825f7efa2167305ac6e49c79743927f18484fc8161087e590b981cacad923f10fcb2182e536e905a22e74ce6ea03c12f73d1d223e74c43fec03004bf1c953f300cc12f47e50f0c43f0cb4168f8c1bafd40f0cb27a86073b64ba6c879899c57e821e76c06e37b31d8f5808688b77e1b418a2b34a001b3c3e38a4081bcf8e6308761ce91befda56bae1cbdba5895aa522ed14aa215fbdf1d7ef5af32cdb048d7ab93e1f9d5b1de3e7386e863eafce775dfdf33c07afb5e21787cebedcbe07f2478ec7914abcfc6797df55bb357276b48d3222a81c704705b2d8665d4deffdc667cc1effb2c0c58ad479fe31ce22d8390a4bd49f2ae3c2da8bf713f06f2050c9cc2ccfa47adf94a5951b5028be8cb9010222e2229a2158874ecb819290a43a464851344552c3e2822f2e4c663280a16405a90c04209d18e1622ecc06237a445f401113a2f5c3d845022081e0c584154f0a10513ed8344914ec3c614d9a071b89c408b3810e1a0c32945635644515a714249eca981826c9321493497c49001c68b3cdbc2e9c8806481b25c581b9423738891d8f3a5c52c0c0b7287a24c2be2b68308686b684665137980a8105f3ba0e26bcce9563c07e1201494673d00e92a353bbbf2d3c4070cc393412674b20ccd2c6bac9c1cc4038e48e341766b7c195f70ef05f7332fb8f55e6dda10dbc132b93373ec84b22a7dd96dce8ef3bd5d8b5ed4de7b2f112f116a24a9883d59c22024a0f87ae10381b0f98dd0d6efcd366808f26b42c3a277feac944ffa5665dc6a9dc80e38b06ffefa0df1b3571bf9bda0770622a37307e1df10ffe702ac538fac59c3fc8a8af588a719503fbf0ec8e987e2f020e7f0cd14babfe8ce135a3c33ce395f8b03db1efc7dbf5d5cc415875f79686cb8d7f2b2a665dc17ed5ec67b7b86042f5b9248abdb31da46f13194e0a1c3951f8e20a24c5a2b88820b550e3bd82401c142f1d66553aa8cfc96039f4f5da56fcf40073cf67beedb5f7c4fd4c6edb17f32a90f95ed6449eecd7acf11bd653b190f99d355cabd951129222223521455e4a368c8df5d0425dbdd64bb22d9aee8c6c3b91a4c52d0b1c044162042dafcbe59d00684221f38a10b018874dfba7edf96d270e95a808147096fd27d7be2f74debafefdbd64db7b9e936b7db8deaef6ddfa0feeefeea9bd45f27eae15c8e11ca08e11df18147922652277e1369fddd41260a0626929cc9926ea2267e137101e20305365c88981242ba6f5cbf6f4e7f7ddf9e6e43b41081d122e6ef26cad257445df4151196ee1155e91e114ff788acfe3a910ee7aa9a214852c0c1c81a18aa30f19bc8490a0612945c45e124dd444fcfe6371114971f393061e20b5710e926da1149fdf54d3445fe26a2d244da68226efeee21bd1bd2bb213d35a4a786f4d4d0d00ee7f609bcbc312187373a6459e2f7d00b3a2755218871626647ba87b67e0f518006303a6489a2030d27a47b68cdef21abbfbe87ae62bf87b0d20c1149331405e3f710d4d6908fd8d690bfbea24beb86747ac8e9afafe0e15c03c20061c6092423bc014289df2bac9ae84a82ca981c88689921dd2bae92f8bd220b4b6bab0d4f47e449ba57a8f9bd62af58c1a56545142d2ba6ac68b282eaef5e51155b115b115b21f5d76d3d9cc340cc112c167ab0c10d9a1489df362d105c684184351fc80025ddb6237edb7a1f6831028a1e5a745049f70add0aa7bfbe573cc17eaf18127b6203137b621363eb62c3fabb6d595536dedf6db3faeb361dcee588caa18525588c14699225cd6f1b9a188ee872e689d319a874dbb47edbb0b4c023ca09549e5449b70dcd6f9bd414d55fdfb62adb94980e156d623adcfcdd2aba624e2ad43871fd85c2453128adbfae628773357448783494800505efcc6f1552434dfc80626a0a4c1050d2ad62cacc6f1555171082e68a8b10639a48926e15bc32bf555805f15bc595fead020b96460511581a15512a7ca818f277ab80826da16e605b2a78fc75948773475a469280b0638a2921647ea35a47a889828d151d2a40916ef4ca88df6856932294e8a1890f51a8a41bed15f11bd5bafa8d6ea51be5824541a3c0a2a0538e7ea355301eda8447054361280c95faeb670fe76a9b1d08563d429042e607dbfb7d563160a80851040952b89192eed312f1fbb422021b2082d8d1852724dde810bf51a7bfbed12774084c84130c4c04317ff7097b3a614f276c77c276276c779e3b40f1c16e2a4a93273ec6fc3e3da0c5083233f08010c142ba4f31bfcf18d63cb952c1071a76a090ee73f7617e9f527f7d9f53e6ef930a4c1b306efe6eefeaa9e9716d79d6566f4bebaffb0ee754b8e131f1810213bb35a910bf7d04a7204ea08a820c9523e97630bfbd4a032b5ba8a0b0830c4d9049b767fd76abbfbefdcab198381126517fdda1cc29f7313584d7c5731dcfe9af0bf1702ec71122d0a4e08305166ab0f2e5b7908c1dce7039c1c525cc07e9160ae2b75056069c78a932844d1125b449b71010bf85b690902982902982909010d5df2d54650a4199423b5348eaaf07f5700e035d636e6842c9921f74c0fa1d54a138320213676ec04ac2857407fdf03b288745489a10aa70c16221dd423efc1672faeb5be849680898203060c4fcdd4159bda02ebd20acada0aaad20de0eb2faeb413a9c8bc0162740b0a10ae10b0ea997df414e2190828411509cb070440de90ebafa1d046505c5ca4aea863160d21dd4c3ef20a9bfbe83a682a84a266d4a266efe6ea0ae2935535c3ca02c5e8fa7f5d781763817aa41c24409251f9c8025e5e13790140792f0c035029b2e1ba64837d00ebf81a480a1ca13504988d8ca4a375097df401b0808ab0d109136517f37105409e4a3041a52d6ba4a205d09e4f4d76b3c9c7b00970f7690f24215ac255c7ed774a60c3145550a2a84a14a776dcbef5a16053c1c4cb08107066b8a74d7b4fcae69fdf55ddbaa7191b528646d4aad09d5df5dabead5a07ab55d4f4aeba7abe6f4d777ede96f6d08c9e4070cc944ccdf1f72ea879cfa21793f24ef87e4fdfce8702ec79414ab16744873830b4c58fdfe410ae2861b868042450712e9fec9f2fba7eaf0640bcb0a63acae9449f78f0ebf7fa4fefafe99027fff50b569d3c6cddfedd345ea7cd4903a1f2ef2c9278b7cf2e99101a022a814091a0f7349a714325323c00040002317003028180c8a06a328c9b144f90114000e63b65260521e0824f220857110648c210a004000008000008001a588ca00984ddc1a451fbaf9cfb961c8ff7b3289e65cadbdd42222f66c6dd6ab7c1bdf1cf354aef12ef285df769b694d6dc1a333d0b5a3f8c7961c74a0d18c4e3dd24813a7e9f27ff25e9a1dd91c9326343a600a343ef5146b088a2bb11db8e2bd1fc26e9e0acd637d1d476173dfddbcad8b587b7267872f7993e8e7dacf52614b1bdeaafcd3e9be3aa9665dfd2e71d8f38ead7514b0b51baa7d7eab015f23ca901cc98c0413bace4278363584745700bc2f7ca205439e90da644d1af0b2c967765d8da3d3df290edd2f9cf2f48b3bdca118d5d6219b6ae8b4c33159f190f0ad12d23661796dbf0d3d46d64c6096ca0565c41bc82e53925b09e0195e730346a1c0642ac0762c782667a657bd58983e3a8369db82fc14df4c805591c5fbe8a63c420b9f468bce76a6f6e011d37547d5725005fadc4e0fd345637e8e0cb18c4ae6dd1061371328c52b1243f80e949c444a63ba5761a8afe2977ec36594747496e8fef731c433c3eeb1d0d4fcc9fdf6b11859b24e1a25930c61d914d4faba54e98d5ed4fa360a3d63e77d8aa7829e273a89c921b8aed9487bb9631e24bb547289d42e9521f2525d787d157d6f87f49345f26d501e97472c6e0d1eab884ca5d0a58fd4dbf8f3918233d097deff66b59aafda223d13c89e77d3a2ef63da73678d9de076508298328aa1c0f6c8bbaeae0dcca05c424cec1a375b4140a5c3e1a600280a39219be2449bdc19889004b31d38a7abb8d11953520f59b045ae700a7da6a498aed89686f7e93aead269de6e7c31b9abd054b762f40cb42cda90661a5b4a99290828a69def47260d649b6b29dd69b987a21275aada3f4c3616e554ad56832442805a962a68854d48274f4a9379ea14136e4c3e8b34d6377e003f991b3b73e4954f2920b0a5cbaf78b2852ccc7d6f7bc11981e052475c585592380b8d49ed07aad0b6b4f3aee88367545be5f15a2636cf5a225089fc7fc859ff7d41bfda5379385a2293bc6a1e9bc464b9b2a059484323829b897417ddd929969b47ad0a1ddf0339df0f15388d7c1e88a801cce4e69b09988e7b99428bbb2bc51bb64ddf4f022d57f4feb932ef720745e33c403818245b4f786ec3445ff9b020a71299336c04ddadb0b968f1081b6981a7b05a70276f8a3e2475ec520972156ecb28d02b08c266e1ea436434c9b06eb243fd122bf46219028429b3c013b9b6746ab970370f957df6fd2f64f4edc25d7a53f220339b5337a1c145c448f46f9d2f638b9a1288abfe40a3ca171740f87c1da80fc6349a5cb97f64094a383086c0dcae24701e8b0e17ccc5c07accae4233dad06aa3f31c706e046b7e50e7e9012e270c941886884026fa8dd0cb94b8dfd96a9bb854b39853bb78b30b30d209e810e5f256e703a6a041dee10f28cc625cc31ed8dc3520c2f8593c4632196fd7a2a8d9a0739414c4692c11b771f94e059c92aab39bd05bd24ec8189dccbd68b43e246ae26b2169b03bf141a60d200e280b6e6826703a008e9eddaebb7c5c3e5aa63cd390c8884e9e5f203755dec2f9bcaf695e54d5990806af7b6795acc3450fbb5534e322068ed64018e2f83ed9ef25705b193f2eb28fc91190b3c4685e17053dbe12eaaad9e4b683e9e35b32dfa544f1e87e301a1c4a6a5519be059303174506af9813a142da9596c9f9be4025a77ffb80d9de20e5db07286065345dd331684fa9dc4c352704695315322e616356d685f5aa05b043aefcd8882a949190870984a2a0ac1711d1f32bbe380a5169c09fdb553805cb7839203d0e961b5c3b6712d736b0178dc0c8fdc3604458418ef59a1495ec17edbdb0fd93e482a505b98e645884c80cfccaa2ebcc151a4a59593d76476620572e0288eda5954c755846875d40ac7c68114296488107a4231b80358a59fa70b383f0d36f684a5119885bea4c36415da8f7e8e4b551d995b449472234e3e14f58c2e75bbb060e558b7014abdce08fc5bc86dd8d83d18df260375ab882fcb42866eaec9ad651cf204ef9790048beef049781281b24a0b6aa0af03f183259e16a4ae993d60d471ad0220cf65220df03161ea5d63150ac17e5828c4130603d662d2b7bca17cfeb7cb85913df739cc507e3edafa0525d79d0c432ee0611f908d7bbc0a4774701c159ccad6177486e090f8e1c26c2432b74dd77c9109bf448dc2b1a4d2594d3f90b5260b1f31bda13e67ff72b008d1c7b5813333008eabc0ab8e65b7943d79827b130f38fa6b3560131e08352224285d60ad88cf75986348845da5b733b53b4f6b2a722259df684eb8a197029e92f568a2328bff318b4f6bac434abf55c42b357f0955d4e879607e48cb80849dc3cee84f722fe6daedbfd4cc20cbaa08904212285acc9f76b2f9955511db465e06dd0a82d9052fdd53da7c962ca46052153222a0d7e8f7a82fd0cba40458bd8105b97c4fd3bd2728d0b0797559fcbe18279dab5b9a541ae2423f23e971d0fe1d60ef654a3b512932aa0ea8e369d8240358f3d177e410c37ec8b918b4a7e97a243b382ba64e96924e571117f7458b358242b6795f0afb0fa388445fe239e16cf02d1be3e6df042448478e1bc457769af7e9705c560038c239c0132892f0e270e30408e3f8ff30388a864794d9f1d8511e9940a802a88ad15716c87d127116145711ef66089106924c820dc365d58b73e8832248a65ade3ea71a224bf922885053a7b8371eee4c3988b55d516e545bc6e16468f800f27808423fd5291b48db1ea191a76afe23448a6af1277c06994c93b41354182680169c2843ab568f9ce0718fe09d05f3aa1f9b51aeb41cfa0c61be9935ed6841a1da7d44b15439934f91c5c412857b17b4fa0c89dd026c15ae385ea91c9a906505e3acc355dda2e9ea456de8a793d5f3299d80a9230f0ce2c4874d849c8041603445b9e26aed63592e7b51d4bdd4c88c9c39a7cdf40ac46fd4b48daba5523e440b8a4a44147ebe6666fb573dbf1b2359bcc94fbb656bdd1871efcf0d343a5a1cb3f4c545905919fb0e9da13a75a97a7cbe996b30fe5562190c095150871da3088bdfb3b235daf2378c3f1a6df731d7fc8875257a1b79fda8859abab929b323932b3e8059187c810170466ec1a012018f5c16fff5837e1e203cb1a110f85a23d09b23acc203f0818b7cb9b082fa1bd61446f68b5e03d58a54e2bd96a32437b3e817b459c661966891ada83fc2aac6da067c268ad1b58a88c1fa290553f059d3c30638956901de9d54485f5269b10befd432eec6d1a1ab0cc8a15b2453f2562c781526acde7801927b34893f06373533b7d45e6b48c4ba67d09900efee3e23162e238ac260bae8ef40a22b255264c0c3f21ede8b771d884692692e93f0ef41656946de9c9c48df1125a902fedfe302622fdfd23eed8633a1ab3c00a2b65b20fc67d2b913327b3a62b8912564d3781ccfc83713331dd27e782955322330f1ffb9859f8806e76ddde7021ad993051d9d6bd4eec18a7b4644e566a86d4d83864c2c426920dcd9c8895879b326902b2a14d5362e25053a64c2083ffb9b8d56f80b492721ce0ca09e3b13a3efedb415726ac3181ccff810dd5bb28d7e79890af32c6245a2eb3e2976034bd4e6f084d2f5aa0fd257493ff6cedd36c84b4087cd42bdbc44ba029a51dca82990a4767203b454a90ebefba85dbba68e356900edff736e47094354ea2855b898c9edc0ecc225bbb48fd7ee7896122cca36eb0bf3d850d82dae5665cfa9314c8b435b858f38556080139d75cf5da329d6345f4f12ae567c09dfa7213c130a08a4e90d4aa3b149384fed197e3e9477129567cc28f4a3847701d85cefb443f7718209ef39de54064c203cc2e07a9e31d01a934a57080af926fee6e5d37fe1ea521f6c674e5c8b44ed060246968eec115a0bb88e0098dd38be8e0d2a7832ba10eae4b325cf893e13232ffb06dae919aa1bae8d0d1f0b221c40a6ee862a2cb5e4d0714bcfb4a90fa3f3be27e64e92fdd64562c1caf3a87e0e96db1888000949f57014c69543bc7f05861d99cfe52db502d7b1af734c23b289c6182b2422d007b8195c932001c6c3fef3b1b3864f2067bf37cf8579a0c28466851c129e684437b6a7ef03cf06843c5d3cd0fe73ce5b215f54e373ffcb424e03654e12654f6e8fc1f49d92fa264323626bcfaae27342a64a33d4f09e32ed5a62cc85f0aa4c846381b297093222f4d1220fb4f64465e0ca7dcac093f3eaed7c36a7d09d4cc832dc5c15084cae1b96644ed951f18fb6d95930056e34cf3a2ca5b6ed0f6809c9da8b29517da5f008e020bb6ccd9799773b5999cd49eb715def6ec2eac642b4adc5eb185e9adf196977edbbd1331e867a8ce6dcc46cbd39d08edf85e80a3a967fb6a701457642b3b6f5be1855987f1396e9991d913a99868f6a55c23cb36fa9191101754a98a8e72a9f9e4a4cab429fd3a2771ec26d668590e339a39c94d7c687f245174db142e813901572587117075de0f83632315b37d0bf7dd455e649e9be53cf49c7cbecd459dc72821124a79601cc008aab5fec97a88375dfb7681a5aa4fb89d8bc40096e803c76a7ed9b7662c06a3f1327fd75d9dbf0a4f79729b0362ceca7466814a4fe0a9484d16b1b6acfa8cb5ace96f5aaa7f7cca31322ead83cfec42ce1205249bb845c14f9e1b7208f9c389a323aa820a8fe11c95a6a7d5bb5d4e35a7b190a4893578512ea3bed8484ba220a610d20c59aa5dd4c2b01dc5933a08e4bd6993e19922d8c509293b355736992042b58528d3280039fc0c3069eca6881234248338b9553a350df75c7f3956501c5cc0dca0c3f662ca6d9e0cce59f58b491c1aa71572702580c50698b7895da5a3e135e2d7a423024aaf7ca9fa1490b24cddc0e507b86167f263e5cf811e1b086eee70a1da8813507b5a0842b5e38a8fce326bd784108ed6a15f8eb5454850ee1d5a255d5cefb00b5e7a72234919859216dcbf7764b37cf55a32db7f6a6231a9b4c02b7d9478d263aa4ddbec17be80ae16f8bebf5f897e9658d4d7debff96542c658de7725754c5823eb134829f9c0da5cbb9d2c2f7d5f80e06ea244ccb5a3bb789963589fa5bc947dea01e293b509473be1dfe3cd60277f28ed50a59ba77c0c297a28d9e84629d64c80e9b7cd8dac03b02ac31f44477532884c09b00be7de1b71ac0d2c33c2461bcfa848d4983c833663d383393c590b80e9c8d9a95853ab5783c55c9c8c4afafba0347a7d192498e7b38829ddf3b8af967fee0023afbed51f7a5c73008cb8185dd3351a53b62bbd62fc74b02948005829938a905225c98302e795aefd0c2160bd7d113181824a3b8bb4ca79a17108c11faf4be4bcc4963b6b280f107787126fe5ce523a487019daceda0ac19d0a6a982247e0668f07955033fd80f668381a07443e6d854dc63156722aa9d71c9a90824dad985af379e78812b7e0451f161351403e74ad4bf00067c7cb433478e438e06779f3d7a1e4a8d69c1c63c0590bf4ca3e18b9841e8ae086ba00822f9478139895d6ed92e9e2a905b7d2daad989f46def36eeb5a37e2eec5899755eed980d75a2fbf5a1ec6e20b64fffe8681d999cda81e790dd0650bbaebe074bb9e78dd9ed1d4f7ed8e078e4ea2cf3f5cb501ee9b49cce98601063ceab24b4883d670fd72f301ba80ed73332f0edfd2390ff702226192f95a702cd767276ff17a11b87a79bfc81bfca5d02bfbb893eac560d4150bd82989659a32737d06256323d8e61020adc76a3a741101b506a1d501416d1a4abc7b9108bafc12b004f93da056573d9993f7a2822cefcd1034608d60f3be8d22a0a6311121eea938d6e8eda267294070b23e8f64994aafb95edd4708936005ebf2ba4282e2060176d1be11558a6664ac90e4eb923ebd25aee87d0cc9f3a83ff73d935c7e72bb8e794e6025fd5bb33fbcb32b8934164120c8fcb28307face6c2afbdf80ac6a06f640a816ca84a31380a3b138f96debb920689701f19327ae48be359c9b27963eb0f45687fa95f7d888beb4836607bf022c9a71b9d649079a271dd7226be9762643c9730b0cbd1b6d041baa65a447f231f84432ae121000326a32e488a01ce3d051f2d4e8b23e53eb0b4d5cb81712760de61828c35058b8c9ae89eaa85f8293eed0b70104e3e9f0997e4e879232bd392902816b792bf96264f442cf5825da4a24d6cce9a453c8e5188fbf0d508c5d468874c374f7050d8e58726810c81f1ed0062d303d0bc289b5ae7986409d6c586e9331021e874e0afb0e915ab0c8403b0c9e022dd6e974b7b61a60933e2b0c859df4bd48e0839288408cd1e1276550810871c30bd053b50153ff758d83967fd7c1779b9bf0b829c30c98d5c71df838891845b1f4256bc45c2268a33e40408df62df428d7800e4dd0bb0ebe1bdb84c7471986c0549cc2c0e7580fa422decd6a2ff549fb350766b16e063da049a96209dec7134ac46add0c501a430358fbcc7ba82496ad61553a5c3639bc3560d734fb13f0eba8a6f1159dad44f5ecbc6e0501422e8c18c223d80514bdf5e29b1734313cbff05a0820bf9bd124602d479094885b834e18772341028abb2d6616a820739c1305d59fc53323b73b7b3887b2da9def9060bde6570e7f40564ff7e598516f3cd75557c0736d25924e958430a0519a643a183d598fa7c50ae46fa34989ea6fc4fd0b0e5e022ea0b7a585b93f871fe91f0181aa7b8dfdf48a7e78dad35508581b5f75b7bf79898aef7b8724b53680afdbcfa692b72daeb800667fdf778c3232151a33c7dceba9e904e33642b15026e027593b26de1663fd3134c53efd07a705a2a277b6d65845bc8df1b1b0c754631ecc3dc1f622c1f19608e17727da8ed45c7ad38259694776dd713bef6ae7fb8296455859cbd49fe76b64e62ecb46dc35b2015882b80bf432c04c5e97ec9183d0e94053ec7ec53a24c887bbf63b4a30f3ac740cca4f0c4edccf83663764d3dde5118177fdccb8fa922b500b99e0dde9e98efb900cf727b1b715094475dd1506f070f3ccbd5330c7839d0bc2b1355c6351ed1a4b80b8b4fd662f1abe4677a0d39a82504afd79087554074b98613db55a5161c4825d19e5a173b9486a4fe9722201f8ac91b2deb558a83d1560740d10cb71fe45cbb125f1536f657daab26c995ac93ecd5623d0c49c6c29417475c8b7d7da8a49de1ef82e5c50aa85e92e9fa25bd3b59490ec1f182f90220e6c9d3dda03e676f26ef384c027078964f11b3acb9edf188734ab8cdc889bf71abc4041a7fc64e733951f06b49b551777b7f481df974784aced2540054d8bc14ddd38b8a593657a1390701e14b6178848346e0d2431e3b9f0b83b51e02d49bb82aa8d0907e71362838655a8d1c0b798a4fd0858ed8623f4cc7847f758be0bd1a894b489a54176f34af19786657be77fde0a0f66e970f0ab6c323ed33b9a2bd58d8768f535aa686c97b5bd12db1acc955066e47cdbb8b0ee0ffc4b78cf4e1104824ce3ededa5e168f6f0275c41120fe2aa41c4d56795225e82e18437c9f2464bafda3a7acf8825ee5eaf8346b494ff932c0dbfa1873afcaaf0be3f2d304ae5ac84ac7fda4baf5d3cdd94c9fcec4ea83d1ad99600b89ba928719117223081699196c1f058f0e2f458a9bdc172edcc8d6d833ebc5cf929a0ed3937dab80888a2e19ad5d2c6dfac4d842a8fb5515d4e7e278ea572729b1d75d2b8cbe65bd5d20ca72c5e70116d4a919b0c42458a8d1c5c0db95c7147343cd1ce75ae1cf0ddda17484995281ef575a06558fcbcd8f8955b78cedf8f3ad053482da3ca8a8c4268c6388b257d160cad4bb8634a3be743f3403e6b797014b9327ccc02d405f9a2472dc05830a1471a264ea008c968296e2da4bc80fc303462614614dcfcbcd71ac0a1af1cfc79bc233a4ae3c15691501abdc18440c409000d811e89caaf57c4734b1cda101535ae6a08390cc2aa778a44403e75b276fba8b20949531fa481ff8a7176f0e4a8b527acebd2ebc2af8a935aeab85e3b27cbb2643d4aa8d5cf052add460e5d0d50248abd0a309f0bdf883f843ef7e7219a968e64f9d6f7b8cf3334acd044c63a5316e1d0ea89e1ea13c6c0faaefe7c03c4853750c8bf591e6448a6a3dd0734e7ea2652b0b321d516cc98fe5a042bf754a5d6ed54e28ef1de1e6588cc280b1760dfa4b92d322d025f4c6c0f7a1800b8c9a31a8dbf9dc732d59a5caedf273963ca7f5b83ed9bbc38fff45702159e04ad5a41d9980b3d6cfa40f4e6e73096b17843d47887dfdfa867cc0899b16f57b5dc173d407072095ba490be9601d19560e025affd6c3fd7c72b888ae28a0ec089ea787cf622e4038bfc30c9e3b14430b77d3f9e2e9955c9fc53bec34e6b2a7fd9b6ec69a7437cbd112e3a8c52e5115aa5dfe206b53b0407521bc8c62b86fca04e4960f144d7f2f24972c019d6a001e8f5f0884b4f3ea124aab54cbdc12d6d0e7fbe953293a6c1359f3d2593f794c3a2898ed250cacea02ec41ecf08312b999794fafba93070a0883a7b1524cc59fba3bb85a02942bd2e0d4160f1686b98815f8b96ffccd2b406f581661b70e921a0a2ac80c15ff39c9f133aa0204cec49142024cb765397103bf1f92989af2d67116e133ea8a8e86bd323b5c256584661fe1f366d40e3aa20be536254ce39ae4e65f812459779a91ea84a1dc9f0d58533d205820462ad75f484d43151de8b765bb8fb060fd183739f834c8aa4387e483075a3c89f4d8fce0e7a163d0f7bcc9b276611b57122ade7f5a03916a861be49a04068093a094e11deeb2fa00b21795218eb897cf0e59b555f738c92299d7146995ea78b274a69353f632d5c31c39e4cdbdf79a91761bdf08305938617d5efc49f755aa0e6b5c6bf3223c9f9058b33fdf2a88479e96428419e484bfd46a8a741f31cfc7d4d521c11a9a1c680b1bff22b306173095c6d3224274dd22db0e4fd467f9990fff220b758e21b4f406f9acb6eac1c993250de2d35cda3156d71ebb25ef04476e3e0cbea9882590744c3be8cca0ba5146fbe7f3dcef9d7a74ecb14884158704ed2aeff71871939e9874a5c6606af1f80cf558c1857dc4855de7460d4511126c922215c3e742340b31d1b5c3b75c848a71d71e6f411274e3b1e0bbc306801ccafa0c24e30aeeff05bbf99de67a47cb6f9dd2a471819902dbbe4e13f2b700ec818e7d5cfdfb759c0909b0ffb1105e3475cc00d382ed67a2a9321e5eda935e9960ccbc2da161f65fcc009e8efd76dda3fb759ce9ca624b9a51bc1d25470eaec57cd68bdc9e40406221871d87eefc7e074c5b064de1f97a7f874603671b74156e2e9e2b8416234bfabb8b9b1498df26dda1995549ecaa2d6b47e406daf69f5c8824bd11d2bb6581f3f7012b74ee68ea0624c3ef044597e1bbc7bfd047c087376b1bb49a575e6b4ed52531f1ef9d8671e77c8c6f500a0365ddf2ec8f8e58d0177d8d8a52832298678e6f27781d35a3c4fd4c87eb124863e8f644a01a630ffcd5c45a137d57a14fe3a1e2f87d2f10cec055a5753c351b3355520821ae8e90144e65b3d4410b5046da3d54800aed416770de131bea0df5d0e6fa1abac86944d5bcef9a9061f5dc82757e998fdefb399ec5584834dfc4ba4f47db06991bd1c7ea8452443fbd12c9c65979f66093a5ccbe708e1a5498a1722619a93cca0004c355b70edb15d1f5b3a601aa6b8d647cdb147a034da108e24448ff708a5d34b979327258edeeadead7b2edc619199863ed14db7b5b4a7a54adb74f45a1988762a2e1098d81277134d7bae71e526b5473ed7a8729ddb5d0ea3d3a20a57b13c4825aa64ca96e0909c2384d7b0f30fb3de700afb1887675accb6e401711fba90632520fb680e5f28c518b2784dda01017dc01475a245e3560d324047758ea20dadcbe1fa590b641d3051697069985b00ac1cf8a5c1ff7ac920093ab8606e52264cbf63d7e8c034e32699455cf8d1a2ba5a7f80f77c3795940d8de31759c66af7c333103b7fce6182eabd3fe7f051c0a515c513bc87a5ab8b292a6d7b350eabaae8b4584e6d1dc67d85f9bc0c6e912f69209ecf93291272b659e2069d0354c36d4b744bf9d744e05aa98d94d40ef903cf4a33e4751b66cc238a9fba76e1bf2b136819a3be28e6fc16d8293d73b75ddc691a393f7793154d550d2ef70c8c99cf9de43c1fb58b1770835e819d8c590f9c34995e818d4734319dee4a18cbc9a4372002663e275d4283733c6ad80f69361f768fbd9cd1805e454074d487ebd9e398116f14f22810f94f826c01b903e9b463ae9d050e2a6cc801c4ef9e3d7afa8d174f172e44914d8208699d85f0fd77efdf3d7b849e922f52f24d5238bfa59e9be8e411b3cd0ed770f34fa8ee9d7e318632d1761fc03287710e6f86415989ed8e6857b82f81597b2917434d1a72f0423ce20afd758085b152d02e07aba0998e7c9a75993e3701319e70ba52ee49d07e65bb3491c9eb96cd1247779441ad1284a30be8b7a162188d97628898a318ad09485f419f44a2119d7aa6bb5c63b4885cfc65dc284474847c8954964f07f8db960545d6ed93fe8aa96dec8cdbb208c8963dce210dffa58f45a63923feef227c4f48659b27a2452ca04573f369efc7cfaa39e90f7bbc926617be5839d9aec0b85b0765f527ffa39deb652860e5a4a53ab64d6cee1dfd345a0cf0f7f7a54a120d6e3278d78ee1145c456ec76d58f454525baea32bcf14952008939d338160179510ef2ed0324525a2470f499733857cbb5132c3bede02842e5b5347186e8f5b13c3aee74af83818643eb4c23e7f10ee10696b90a07df12444af27d75765c52dfe9211869af2c1dbf0ad9bd768a31c9c3fcdbcc3c39d54a0b24408969c8ba15bc31398af27180bfdd0e47009e8a1a553623bf67d2f281a428e1ee9a70fbb98cbf234b4a0814be188d57bdf432380d3a6a6b1a800cda084184ef999d3843bd8fe96f4ccd7042670597696c382cdffff90137bd36d7bf6cef744ac335c5dd75ccc5250a954a1b600200a758f655bcfca7ca6a2448c340b242dddfbcc5b02ac6c7b62280067d49712319607c255c78b4466610e790eea16ebaf9765fa21c5a198e64260112c05ba9382fcb9573bf730504a0b59cc16f914fb8c640d9009bc94dd1128b260184970ad6d20af4476c883a557250abef836ea1a5820ff10456a84b29c24ca66aecb31dabc89b2d98c4dd50cc571101795fbe9677c2eadbe349b1fd22ad5ba6e6490e96934886376c79567291ccc13c10020c25811ea15691655a0417566a5c163dc6c60336e6cb08ca53e903ee50bf82edd7d5508169b2cc2fb2d9e9e79504455bce4ffa821b3bfa8c1f31faba1f9dfc81875f7b2f2f97fee01ef3f56f6e85c3cb428310494dea4454f03a1f182da2387a597878ae59f070b0b640f124be61e2d7b6459dac9288f438ab90b7f22cd750f74209e10d773bc2495909d36a13d4d4b6a3d5f96f83d9096a87b722d757b542efdf670a1aacfbc40b7f724b207ed9b0edaece34e7d1c4d651552af72881d9803e3f30b266654b461d6259f36125db2a50da697d4b561f8259f3652a5b6db06d3efbd6d24452f97b4ff27e13243ef683da48c43c1cc9b64b5a176d97da9fb86f02816b329924411489c501812d3a8ad606d0146113ecb42bc8b919cbaddae0c66948909a629a246d0683b65dda31d4605f79413619c505c757c809ac4c98c7780d25b9b032f0e313789efa0a4d4e017b329524018d15b9be4dedc4edbd35e8e6568bd34cb99bd4dcbcabd3f9699bd302e137b732c37f56a2c7ff6722c43eea558ceecede84e60ef233ae2c732a8f6c9f92658b9894c8f9099a9b60eeeb0c336dc80f19d7d5f01ff46d5f07393d53373b7ab2b717fa933e5865227e6ce566fcaad56ffc4cdaa0e999ba49e39775b5d99fb4b9d393794c7666ece708a19db4b663659197d7765ccb0571031c520420edda58622d7dec7e859ee4324e8dd874dd0741f3a41cb3edc04cdfb3009baefc32668dd8749d07a1f2641eb3ecc04adfb30095aedc32468dd8771da6509320ea2b50a79f4e6ce337e5499f81713949d4e2aa5969b2ed1e457350cb309e37bf76a8b26acd7e08d4250436914111a5a5020d44082e252c352148e1a84a2286888124553031214c41aaea258d4e08242b0861214911a5aa240d440f2e4510d5ae2ee01b89ff6b6d23e1967470a5b710389bd8a5da7bd22d105c84b6852c3703faab5d09075c08e60a65707108e6cf751226990044e47cae72df795af1f7e3ea1c14bb32978fb2d28a18b0c6a47d24407e86db92a3f3655e1bd88594e436c355481d09f19fba94f2da6039ececa6a2ba1db369304359350a72516ec7cecded51b1f4064ba791aa75bffc0da11fee13708c8b8fe9057483cee7b22cba86e228915ebb46bd2143a590672c82bf340cb89463f793628d9af50fcb3ccf3a6f0b8bada356f807fbe0afeba3c173428774d5b014a5a52d0ba091adaf7b38b308133229f6ab544fb40af14949c3dba11da660d92e10782c84df32ecab758743b1629114645abbf4998a1d0126ffcc3a1d0a04dc094fc10e31d7d7de0fc53c855d810ac644a513cfedad39bb61fa8218009f4549a1f1920122cb3b891ded681030a6e5060c54291c8a20af0068ff9f402097710e4155177efdb30b243496212cd5878d58650fef871238488f6cbdd69070db7f4f8a6dfe1baeea6ecd48060088d15101c0f9d5c2b175389f6f2d540243d884f0d4c47e0373273a72034ec36ae693fb5837a6a3bc959b85c6f026966187a10da300f610d99c0c3e17fb340959320be4a683ed3b530f8496ba55a0a18c527dbd8f347bb0e23647156a450f3431d6b8d4bde9ad9c55d0004012cc62418eb10e39509e6f77f6afa0c86d96fa2c3c27523d82fc5c040b2cf6a34bc06d9c26513a23dd1771a42dacab4a0c038d99f61c00b575eaa0ec8dbe42a773942d82a923816423a58af41b65d0d9528b05dd75c7540561e1611825c33ea0179594483e07d108218e109a7d31460277728bfb887a89155ea5ab6e5ba8f8a83c5a70a6d376ef4bb60dbe55bd971c4df31b61d48189dfdcb5870631e3257e67b5248517ace70b1e4b42253518224f0a8558b7719c4c91b9f837b10637c4cae21c6f8807fee5fb803fa7bfffed9aff4fb7dfddd5fe8f75efcbfdff41f066e8a505cb01b44e6242e3fd2aa67ce67fb8262fc0fd4ca1be1a153cc366ad50a9a5bf58296ab5ed0ecaaf7bfbdeaf5632ad5c303e73572c07558b9880016a73859ad0daa24dc943d1d3b0730078a86e85d311e69d769b1a321ed96873ac9775ba1240f040c27744670d94e8209d3049053f4c9a2850a4137916854b56a84aca506bca0d115e44185048d4dfb3b3d445ff8ba469a36cdbea834cb51a259105e39b72c1132aa7dcc519557243af3b5427e3df49070421cc0fb86d0a65a0059a4a4bfb360f8f49aea084dd5ca39254d8d255aa69a030bf3321dc609fb0966247802d67e10b5461567ff8980bfc97c831d6aad5181183f71c0ed3381b7e2d0b461b383b07dba7e8d2bc92670f843ef8d20f3bd74163e3aebd215d8c890036988238459bfc3263b6c3b889aac2a461f0b643f3cdbb402773be3f5a879120d2393a1c06c8b5a8ff8884d14206f8bb414c7f7bb5b3cf29f8472ec94409bb3e3083f64efc0f9e6d220114a6a02770391b31b86f320afa6d3d819bc6660a35281fc9d170d061a10796ad6000a8c8963684011c2a4395464856a656eef0193c3b662709eeed769bd3e60741b0ec67a837b4feb9f8017f097510e63f42b76fb0a96e306affe1b5299b0e38f9683ff51bd6f4144f551c2889b1838dc22db9a3b1a742e75ee1500231fd565b5adb1efc7afc6600cabdf84713377be876af28f2ccdf3cc6ef971b3ad034709c6ff8b30f1ff76bfc6b81541088d6f53d1f24d25a98f339704038d51be8c4e0ec2745057192a9c444530b38ba8d57ce150d15774a8c0654cf19debe0aaa829a6a8427bbea12b4f1a25b2c63a94b5fe5c9429ec51a617e22b3c2305c05f5104ad034746582c42dccdd1ac5d6ce523a2b383d4e98a83ec19aecd590f1c6097064cf7f0a8bf08d1f78e55b0fa5250c99ea43407d706431cb42248e4122686fc1f674860fd0765139f1526f451b415653c9dc1d2cd5f9fabb4bf2a0d44aea6bf4efd13f89726d653f60e3bfde2c92a1b871196f7f997e85a93fe8ec948d494be0597f2c6a873f780c8ef3c8238380acb747b462003e6463410a1fca9ca27503af986504a7365ea451c3588a5f7fa23c4199a0b1e6661587d821320eb323998176026156a3a0dd04495acf90425724b9c67f441b9413a1b02d145921929d5054711fe604cca4fa26084ead2912aecc4c16a261fabad8747859d19451036ae8d8be5fa1f479d40051d1144f6be80826c7846648a34df0af6f61674cb0d56adce67d8eff71f9ffa18e951bbdf9dfe66d671a0aec902c08e8fe2297c8edf6b823ef1010f7f71a44f2318612539b58ac033df658c0fc3b2747cac106a417305a37baff069cafe733c1a19067707713a6d543abadbed259b5f74247702e053801dca07add35e77ed4f4491c5624ad0abdc05c4d8641e84ef293327c875ab65653d8c81443a571f8e5f74e5a2f240996c441eb6567d64349392e7bfd5e513453d76eee12ea57dda92c2bb35c99f8f44a18ffe04e5aa8be4fa10d8558738bfb1ad28bc5c357cedb7e067861f186dbbb3a245960965927901f5c23f9004a2e27005ecb7c3b9352d4cb0c0b4d2d630d8e32371a64377dbd2af7900d45ecc30950e2643c76ccdb546daec8e6223e2bc9bf8b5425b0a2d24ad75e055472234cb101a81e7180dead1278b1e09abf3c7355aa4d5c0d16e97e81a711646c6975c6c3efbe6e8687a5a20304037f3e9cebda2d2978bd3028f7bcaa1d09e3889a49472e7655bd50428c67731fd43fc2443e0fe4063a48b880b9b75015dc58455fbeb2f81ba2923730cea811425dbd4dff6cb20e76c33e8e4f528506721fffde6ba9dad16a32d3949b4ef1930f8bedc94df49b7c002e4285cc5c8124656ef9021ebe6b9018aa1a7481daef874c19e7d710e52d1640a4809b3490562c75feba6ead42d17c6d2e1fef5aaff8b7d012ca1aa424838d4280e5052d2ff93cc1a20b2394cc889305e324ce2b5c643a06051cc679cbfd0811e503197350f38ded07eadd56cbcc0f9d222a21f14be5741b8ec479bd388ccc517c4d42908d3c398cf37b2ac243a6c78ade57ea7730c51b30273e2e5e637363ec74567635c6056609a3c6b59eecbede479deecd0b2a7a4655f73e3569f2ed324eba9e1ff1520a2b4905af6c0af514daab6ac69232e5637be5091385079cdc2248c063ca1b985149239f1433b06081381f11b81b3a968d90775d6f3e55442a4b8f3f3184fd181e4e6762f0afde111dd22080814703b1e8886fffda8de78dbd5eeba706bb1ed45803c233e05121f04a613dcac7ba7ee2b34ac59a2ca9f439ff06f7fd158f84f8d508a3d4aaca7505c7bd07b54ecaee5bc708619bfaa0ed09709df31c6c4f21310f11bdb3f2bb89df2ba91ee7f7d425116290b19ef5cc3cdf56404b46951c0c8874c678b38986c88b2fb6b2973c13a57269323f5ec79f876612d4b58fb91c44586ac06cedbf7ae14b67fb009cdb3c5318fb90adfbd6c6c48765b0b774cb05656b1ec65762fb6d728b2aad69ad00bc8a0f692348357eb87530467343bffeb1284262a3fb3dff9a8b075fada0b76e05065b0307f14a765f79af62ea7ddb916e23d76c7dee007dca04eb8d8187516c2ffe7f505d3f5abefb8b68c124288937dadb9930f77d395be797c2a4a7e60ab9aced9cc3d4976c77f1682e847b27571f284d8f3a514482b3f37b000b07950c45955f900f31d95c937b99bab8ca47d1e7c83b0bc459f11a19f74fe2c695e72bc8ea395cedac4b38abd2ff977eaf906c0c43eeae22a93032a7870d01e19bfafae85ffa9a0f3e069bc0374bbbe968176173b38e4c5383a35d80e4e863500e21905f53875dd4d78a0a5167e30fe1b87d34b058bcc55e4e22c83fe4f84cac685c81efa79ecae4a310b5946793fd85ad07c983daf78b0522b20105b88e251a85dc8a7348328f4ee44775e3e901eba5928c2e4a900c02be691f12fc17f014a3020f68370e63c242f120f822210281406693e1e897e47446785755bc4c3899b5f5220fb96a21742b45ff1c207c99369b21494b365a757307b070a11cbf3123ecb1bbb242996e907319e05e397b96caa6efbb7658ba41e4135c5f9962f7e0422be3ebe65e6d6cf69234bc15fa008f0780137fab22d3b01f08091f96e154e218c8c7c25fecf1851bcaa7a87a93572ee23fd5c07eb0bee3eb4243ec8d5d3fcfa0ac38931664682b7506be24d5f7927abb13d5220ada0198536889fa4369e97f1b60dea267dc127b17238b89b29de63cf74d19bdeab661fc9728796dd58b981f0f37a98124019be0afeea881ce2a58da5780f662531b30dd0e44035eff384e77c3c53d7204712b82224b5cd96cd69c6e05b61f8a8421f006741af436c36b573e0c32d62067db26a0edbd89616698bd4a2d7a8626f15dc670aaf110701e6f24d03d90aac01b7ee0ce42f957f7fc73b9c40d290d5dc885a1e1b911b9211398e8be81a3454f1994a26a89ea276f884bba7e8290b0bdf5ceff1eb39e70b749210340053aed762ececa2763938c8e3e1624aa79e9a388a5078631b4bf7b1d71b7ff492b03879d24f7d4efe48aced9423421656f270c5dc9b4587fce4a1197487ab5b92b7eb079cdbde043c6b60ce5c3480b4168ea0b335c2e32aebd5c4adfa95ccdb8796f854e097f0abeb4cd2a85d0be6ce5463bb14de77c2eb2d30cc17ea507d6a066e8727d2133c62a286376bbfeb5be8f6d4fe8adc44371685ebf9d843edde3cadb992ad9eae20272ec18fff90f44a602c13a64218756e0affc3ec8919d70f11b86eecadd3e481b5334de453a4ed9ba318a7df66a3366e18e16ffc6386452e0f1cfbe6f61e41b5b6423fb1cd40ae5a884dd68c2e396fc5041cc957f4827e8b796268b7c97c25f80ba7c6f8eb8906c240a52162402c6669a62f6953c77525d241e13a0cfc42e8e9107cddd492b08a452e9845a16eaaa942df3428150915e8e62a0dca2a6af6b7cb3cf2fee2a267cb831de31f1357f1ca9263a3cd0c05c87264e20f192dd59412abdff08bd5bfe8dad4ab0674a81cb631a1a202309ffcee12bd58ed3ab9c01585c3b20eb9aed7ebebae70c6326ed8eb19c1b05d48de221504784f30282bfb3a52e7d0c0ca25601abf79eabe090855f26880bc8b7f1d77c6514ac1f09ab2d29321de96c570d726f6467cde180f895ec3c2fbeae36680c66c08d053d7816d484578de03d64c22457b53b8cfbfa40fab9ad1cfd93a8343d7db99529b5cece2e0853bc7f0c20f348797e8f3bb208f2949e64bd788c9626880e8de2e21d092e906cf31e2bf756d33f27d8cbbf2a0a06916ccac5118b3cf9a15dc265f61f874637a17b3f026abb91651d02e2f74be731cc86d4d32e174bf2bbd84c31a6ae5d3f7e9a129d24422e2b61611f852a505706abe7f21893fd5bfb0c0f606260a06871796246bff54b9b1fb4bf57cfc8cd6d72ff3bf9b31471c84c1a51be4774e5c0a17911e8c35a3f4d281a061e94bb5a75df2b9e1f0f21b6bcb0b38a37a3ef32e549b74181e32230c950bb842061fcd8f6ece4b4178ff27b8b8c17da1eb987ac6c1ac84bb41afa445190652c6d8e21457b8677813399d59d40c9d5e4038edd0eb97992cfd3607ec75d1b5b2ff97ae76d93a041a598b9b42ae5e2a840a72058ab80e854af4e2ecdda6387520473db9c345ba22eaa93d33d6991ffbfc996ee939d17cde47d2d4b73b4d10ad6dc0762b0b626a8a411358f362e89a942c7a8b466cc21770b5061bcf26faa3811df30592b8194850377900d4da4dba5196c6eccab2cb091bf4551eca27df5afccb0a955b5f43ae71df731ec3b02c93ab27a000c7304cb3011bdf2db43bf375f1910d58b6c44e270423b5e480160b8301e05b28c0e2404d403636e0114aef7181ca5dbf17a0e274f34609e59fb6b023a50b969862209d4a0e0d1021305ecb60a13fbb58ce2f81306dd7ab2181409975458129d875694ae7a13c1a35495fc76647f80b310acbb78c4ede3c2812947472f011606919b6ba04dec376b3e734a07b506804377c7ea4f6120c7d851690fbd561c01ae76b8b79e1935c122910b263ec61be06c75bc2c7f611ec1508971615c22641ef0e0e3ae003ddd25a4ccfed87b82815fae19da3573c813479c6997212fe2b215be94be2921a73dec66bb97f25b92510bffa04c25a85bae883704c91cbc82ab3fccda12732d94a36b29823ca4746affa834bc7be26afc809abeb9269b5493fa9e9fd27794d1711a85adc3a93871591dac2ce4cc39a8332dab7290bd7423cbb63678dcf2dd2ecc72f243ec9489834080d2c2ee06f4ea5c20d69b9afee922fe2ef3e4c99e80fa54785d4d32990bee9051f460fe02dda20af7b70bfca7a1e3c1b5c42d2e509961a102745eacb08e8b3019e79dcc019444bd2042d4cef10f1bbc665ee2164051a4adf0d4a278b97dc50d69d387b4fe0a015a2d8d3b95492bbf54b10400af950c9cc5b7910ebaad51e09a0129f5183660db0f579242e6ab4d0e70e98d0590b427ba1969f05e949c2d28061351bf832e63c134bd2945dadf3e36823faa5f19bcce6b8ddb8af81b643b892594f0a4c35ed9b77383083ee8e06ad155ff61359a939f6dc39ad6af842b56b4304c562089a1e5f2b32d21a8a6cbe96cab661da67ce0baed4719fec895af4179814f0741b893bfdc21d275a4ed8a4d0af98d641ff746396e0d669c92fa6ec5094db8a3b10ac697fe3ab8aac1d4318cfa36a0f56e91f6de0579aee033f77e9a757d7284368ce5e8b374a08540c8bfa08d55ca6fa036d8c30ff3d6d8dda98c2b4e9742c68f1ef89c5935b0b930791aa39bc756cb2139b6114d856d9ac9cfa940abbd0abf6d959b56c169cd211c2b1cc72a89f43fb52b0e728ccb64d4b6b4f42e9d600dc0f8542ec300258f2275afd6c32860ea73f82f1d77504183906a9801372d70f56fc6700295b99a83e4cbfa524045a33896df7015237377d9748a0341e5a5faecbdd0d9f902f429913836eddcbeb276ebebbb1d2223beba63e69fe30298f387d87e1f04755200ac8cbc93529bef2bd80962a25ae865e4bafa033bf29b0924957812c228984c2738812d203f65af8ce20c281e940e9c9f0c6b99c4906ff397173ea1f815790e3a55088e78d3fd82f3f7638e30cde40384373c1e02477d9579bd6de1993560dae29e0b12e0624d3639217ed873c6926b3460688d428fad0aeb687db9fcc3b36af336f75806f920060b7c3c01ed9e76b43a67d31330f578187e684b9a7cb0773178070528f9e1be1f3c36a96f3812050cf491a1e414efda1f46dd1c4da13b7dc1614a627d27366d30dfc5e01a52f3212eb208398396a4818d774364bb814be91fd7e27f36f2ed61cbb6f81bae58dfe61a7b19a29978c79f9f1fa23c3da26a9124c81bd8a6e7ee09a5e1f4e6056c1ff6bb2a9131d0e2e5edf6034a59d4dc23beb14d673b55ce77618ad1e91b88a8ce0955291f773ee8be47fca68f44c64612a62db627296d50f74445b47222151142e0235701d166872d863298bad5d9a9bba068a030bedc470fb834cedff4dcca543f36e84515722dd1cdaec754a591e2b2ffe70c334d0c4e12e10f0fe9fbae674b9e743ed0f59d674a45b17c44de1149d4a0078062924580ef266394d70d4f5d436248bd5c5c9156342b9fdf0496988349aea451d356ecc639f8f2322aa0c354933e1aace38c4602b6419d424e27e873cd401f4d74bce890a33e6b831260c899a1be34f709f43f68d58796b80e3fc8d3970d8a29ea3d70353f550561faa2a76315adf09ee7f9414669e1ac9f87261dfdaa4b5ceaef76f9d34f9264711033aaec27ac1e5998e95ba38da9be1f83736f0b9057d0f6477ffff38ab0b9daee2b907688bf35681ab33372cd4431464f335ffd6039d1582957816b91348c0a66623b9422795d797eb7a087edce1b35e0debaa8ab2d53665c8e43880bf0fdeb1a0b38273e5bdfb6c16d52ebcf28db601d146b4bbee54857bec63d10fc2bcb486e7694eeacca8d91307cfbec3935d2d762316c5616d02c1f91553520266aa56949ce2487dd2617ac020d83e9b47f5d677cd0a455a24caaa1244126eee3d6c6ab6d94608dc5d0675658c3861348aac0f46deed4d0e19d1981ecea73f28e2854c62f5f7f5078869f3e18f7e77b2be0843935d50be495e9b5635978c77aade571ee4aac066895332300435e00e79418362cd2cb03f4164a8c1a348b80deec28c1553435e97aeea1a4cd3c0662108b32aeeec32ff109f58914e20c1b742c715e1b50b8b47aee944b64b11a691454887dd9a2316e7f7cdf38d195a2e91aaf97a46fbc29efb5dcbc63c89ffb5143ab8d4b243470a158b07850bf1084295148b422e024817830aa615c8874c208a8537a24385054725d462bfddedb83ccb227cf4b34287970257f545f3d34148e8e6c26fff538458b91ecbfd59229f178a2b395d68da5cf4a30ce4452698f0135306e7d7fcc0348ccaad10b25df686bdc8d131c46309012e115894744663756279538b17891640d460680f95cb89a5ad0434e13905bcf9da7a6fafe672301afef0c3b72d67aedb8ed8f147e68a164c60c4b65906765e564714f0b0d534ee1f1f91da6dfbe05f3109670b76be344f044cc2690898f25de1183e8340e5bd5c2a27a4b585e32b428d90a675a67cf610fe5761228b8e6c029961b36b64a840960ea1c3e9529cb1d6ade5cae23f6bbd671546d28304979c51f7aaac25528ddac359a11f8cd632758f401bfc44fcc19e76ba8832bb11ac80458cd8a6433b88821cbc80374b057dbcf4607d0072504c14434cf61de7feb2515dd597999f9270227dd9d7c9c242e9d5d8436a46d2195accd86d90c28ec236f44864c1363b734f6570ad865fd5edf34f4ffd3e6493b50b84509bff453382097ccf9ada958380befe2966463f86ce83dec5886e8fed484b62352fe2754bb457f411da78891766bcd7832f9eaeac14e4dd693b8c92b34ad0d821e81573b7bbff2205901092429cb9e2d8c841b730abe05b9d32a3f4081928fdab4395960d8a26e70b81d73030ef2a1399f708cc4663780716cc78ab8e56414b0f1139611735caaf157a9f7829f4595c4bcf35fcc61d67507d08f0aca0028e4f508b4b052737bdbf46a0f70a2d9e43d2b24b07dcc6f3052a2470da80d2c50d72204dca81f9246d4034838aeaa262608096de97dfdf00d491f0e8be274f02ca624a3fa3f5fb46af1ea3aa57e5f70ac1d478a4ab7e0f84460013ea1ba3d42517f185f1c7c854681c4218ca810ce011c30d5d205054c58812d1ac946d38671a00b3ff3ed8ad2be3f4f981f8c59712f14b8dcdef20d26d8082b7f139935e9cde131c350ef97b1f3c29f459ac456f6b543bb94b1407cb50d0ae19f0ee428f79935c73999730e15164627a23e8b7fbbc123ecc78bd505090e9a20c2f485f0cb8e074e16edebb753b9c41b74366539b9617f1a0753581eeb44402e93c5cb01ee8215da3f4eabcafc2c639ba18e55f192b29a24f8011a54716beb885ab10a79caa3bb75a690bedad7b9f832fdd5f112d579296fef347fb487e506d2d835fe05988130b3c7ab8058f735360287bee1775848e5400b473d8dee5e5e49e088065727d72673f788ad2d63905209c9c90d5d7970b96494a2733abe136454a48722ed19f392a6caefbe082c109a568ec110cf146020410e6ae3584444cb4d59754ae8b4d22d52c3bf7f2ec907dcda65e4ada081231df4562a7032f2c4d964d10b8a3287c615e89151649e08b97008e464a0867e15286277cb9492b71abf136ff0497ce8808a8c8cbf1e52f8a856dab61e56c1755937951ec7c70dea12eeb5ae848384457212c317d46c942f377f0463b30043b41f0a0f67bb12f4c0807f0c304ea2005dffad0057602fa7c633656d18bf681bda8ae2f7ae73b336c2d034719f0692398353aff7d16ca0671c61d7f5adbc448a1cca51f4de6d571c4751706094f1be1602be5664f6eaa6372071c8ccea8de6a2f06ab83c2273be27727082661878944d76228ea601c1531a01807d7c2f9298f0fa4eb8a4a2f0fa78b91ca7e0a9210dcce16249532a4630746383c072e303df59aa34a019e25af6f2dac4809a77d6f90a29ccfb9f94ca4e3d39473035e61594a49bc296d3ae5b1a804a7323a972a1552b56aa68f12684519f02be794d06c5e9849dd3f5150beac987d80d2572ba1103230c1030ce349618d8519ca772d9921d12a89f2c83103af0fc8b5d189dd90841df9c911ab72d28319cad9b544edabe35886309e107ccc09e96e3284e0c87948b598caa90b022fef9b03726c59b7f23e02bd34ebcc9a185d623f599527957a4846003dda1bbdaba360687323df9d5e9f0a10c911d45c4fb8bdf0e8557fdfb45323174f49bb33036a7046e8deb57e602cf8b890657da8ae5c1cf97c763bfcebb5e62307de5ec47f0a7c307c61702dff064907854ca69a55493da7273bb08222b17eaaee7fda7c0a18644d84505de606da2be649464765d77d111159e96a8c44d66b4d59bf162a1aaecaa8c464fea76cbb117b55a71c378cbdb38edd1e8ca58e00d3c8c97bdd8f12dbf147c13c01a4c9000e26788631d62d3b736036882f57a397a5ee2ebb0a9946b6aaaed0f56182d795941216a947afe632b3848765c00cb0cab8aa3f7797978d3bb54b088a4058bbfbb660377da40625952210c0e8083d1623402060ebdf8dc697ef93118f15190f36c911d9088a78ddb18ef7b6a353d16bfb28952f3df6a520abaf632a00a5115ac909586741495e172c1862cb9af65bd2472be1ad2c5a96093ad05be1d113c4ee6ab50e50d766d3a1021a790b9d20a1b40210d2c9875b8ba95b5b8e1ec3e2bc85d7c5e11ed456d4303b49408a6ed7d5844ddfc2185ed7bba8a265c63e47992ca6fb0e597721f44e1eecc1100b11e6f0b96ea0e4d7a8c35d79e865a32de001606555fe5c25aab513fe434779afb16190168038c20cc496e114c7987343d8adc9976bfb2e689e1e3da4af10f6b6c7f726a9b9abc9339e988169831dbdb1a52af73cf6cc7a83b2f18f6306bcafacb21fa1934c92eeb94f26e9b06b128ceee241f294056a7160f6273c071ad600cf1ad829f164590cd507011264bb0741676e4008d28fece5e0a8f59448e4b35a8b735c1ea2880333f07033d8815bf022e2285b0ca525ce3acac512b4dd1353e1cd97140886b1d48d03a6ca31c2d0b83bf98008c8ddbbd66a6bb192ec0689ed92c93b35f246f69e8e946e6af5e81ce52af6a9c2590a2790e46f6ccf38456a017aca453e93560f09b9981c2e422e2c834864f3545b026987fa5a01d729ba98fe84c0316946fcc4371653dd99f2e560ae0b4bc60162412b0bf3975987ba294b59e2877ece0b71b6c448dc2d99e1f856e1cb4b84699ec1311cea4d29a2e3824bb703480da5c08efee30408bfd6b9272481a39caed7c82402eb3988a6893a3f5f8576a84946a8e2f3600f31f7f2c9fc27aa4a70b6bba8f6609764bb2ae05e43411b34f4ae1e665084258e4c0904698c2d6b9da455f2b3a68c876c6ac722e7cfb22d658f26fe74a9b438d48f51f4529e02b8178f6457c832f4e8ecd3a7c762037552a5ee8b7fca1dee72be675431a99a289668201f6dcd4b37bbce033a3c59e5e115ca00f7702a86df9b5b27915122a7357b4a16bae0ccc855103271dc4dcce6112965d42de6ada72f51909a08351900146c317ee13b27d8bcadc42a860b1b0472ddb272afcdb71e89485044019a3ec47b3ca960463d651eac263959f01380f8f919e2437872c0759b8e5c09264e0dac8e027e662c2abf75c1b1940c21e84e87a754d703713872cf1699547109aec7dcfc3238ff05873f96c1554eaefd0bbe377a29e80de5b85d83700e540b3b9d3ce0b024e41104ba6537aa5820da19a703cdaa62056cecf1c67c309c701df078e6b31026ed56e5e75da84c77bcc89632450232d54fd155fb03b19508b05002a310906a7321517d409d21fef5df3695bbdf86bd0ea43c5562c30411d9ddb6dc52a694640a3f0a930a7a0a49baab77559830c7a7c6777777ff23dbc3af9478632d47f7ec6c867d0c2141fd7d521f305e89359e34a89f2251047586342258a1c41caa2e939821478d31ce58718253da345236ad60819af6464ec125205c6567da9a6823679ae60f3346ee1760de63188691e6d2442a1f46397f985e029991b46dc70b368d944dea038aa0a0f5b943c690109eb08365825dc7d102a232658b9cf1de8a5c2959ca28658c314a12c827121dc3c14475d62d7fb617836c624448d8633f4c4c462c462931a90452d65fdab4171489667452d77b3e856ac618e35c4f6e552aa191f387b9bdb0756d240ff5fbcee380f5e2a3e20ba5336872386b2576d1054432c618a39452f20aba075ac728a594524a19638c2d85849146d05926d823c5467bea07817888c5253e020285fd3c94f1100f4d3efab9d19e192c7105f6386b0510c208218430ce28230ce6466512ccd2a13a91214bb22c215a32549d159fb92f0956fd21843470f5603761a8773295793217c166009b4c5af4d87fb0496d9e73a7a8a87987818ea8e4ba39bc3337ea10c3a28c58ef6059e0cb5f722ea58cceeeebec316e841c9296d25f3e74a34590c51e93f882b9517e652a7882c5abbe22131cfabb7b978461779e654a39290a4b02859a1b151a827232544a29e5bb9498942e4991247f3d967a786c1913844390ec52c2b9514a29254c179bf5c984978c31c618a5941247062ed7faccd15bc818638c314a29a5143782a1b880a3ec22482388e2db8821cd1831677c4c76362f6463e3332c903354df81a33acee6f3bff9f25ff3d001eae8201e1c1d280cf62f5926dd3413a9bd1c1bd4cdac0659616b6bfa4b2468ed30b922b2ca8e48890414230a7a7102f44550955c34fc7e6805917b9c3366934d36516cdc666e34c610b988d18f986a8c928a18e3a909378521a5134fc5fffa6408598b17f8dc286b21e4594c76648c31c618a39452da3cf119a44c22e7d87d85aacb44af46e832665294bde8eeee32b6df444d34708da62db0eedb24accf199dd0969312ca871042093b1a21a53db06c73229b2fe3cbc766b7af611b0efed14b3db0c6a45319d316a94829638cac448c3e027667c87d53e3016a1c4069b7fdba1a3f2e25bfe66103d4d11f9da06c803ca00ed4d16f32c1bc984c5b47eae6954a7ac9f97af17968d55c9ad86f823a7352ba03777a073939f84a7ad13a6e6be277a4eebb40f587ebc507c2258645efe0cf0b9c4570f9a432533024647a073b14935366922435b94919a3141a236f949a4cff9e874205712224b4519b1d2fc28c9874f7f7624449ac0b82094921a1fe190fe551b0852b7f4eefedbf444a229f40a1a6a99238b842f59c2b01d86555ea0cb03451013568d30038f842264d28312c4a8ce314f772b06a7bf79f476c9acc49229988b4eccbcb71c4c663cf0676d99e4b3f622a94d6afb66e07a6e92b70bf34de90e9930336afc9d2073dd18b5adc622946295b40a564e7cd64faf73c14cac66688cfd090f7cc209baf7dc47ebd38434926ca038d5ee4a6324bffa2c52998905e5ed3344eaee2ca575a6f1ad72bcd378de39526378d83ab12b7c90702137fbec3ffe88e27d013101823f1e917bb13adf33f4a2af590118b353edd9afead293881788d2fe9de2ce504b411f85eb77e303e0ebb11f8f1bd3bfdf01adf6b746e7f7dcec738b6dca394524a19638ccd33371aa57494ff6cdfba787ea64419aa47f6cabc828357ef41e95af966d81dd5d97bd97254a7a4ffb68a55ffb83c8440df1bec4a75a70175f7652132a6fb4c4b4d2fa58deb53f6481829e388b0d715eb866c4d7f944d723dc0b9d12b252a425d5ca930702ab141d5dfcbf1cdb81f99a90c650fd8f57a977ac8ff7e6d548fc9b41923b2281bb03303180fadda3ac84af5286dc1da6ca4b4b1e12a090358e9c7d7ecb509975fb46eb78644ca7ac46e8b564bedef8c3126b8628c53ba122637794e789e6f3fa1ad9452c640e73b16b7927c79c1482e47e05b943039355226a794513a9531658c5101793029860e5ec293d2cedddd1fb58355a5f7df4e229fd88169fabf4d9decda1f720e2184117b77c5103b222cbab92f0ec9b51e3b4f2261ba74e9327d90b24a9cb3e3dc4a1fa594b2b4a132cc83d08a3d4a4391509913892e6397b14fe10546fb48caa67ccd378d944d140ff451933b0c7e8f1d9d7f2b976cc881b521e421a2d8cc629c9352938905514a8f95480aa29991668c2065267f9b1f9bf5e933444248299f638c12462965472b40992d605d8c31ff79f43f948cff6c62fcb7ae17d306a580ac173f3edc940ff67a8b2af693ba806e32b8189cc906c8a634b05e1361afb499b48e2483b4aa08114efda0814d01b15e0c5797263e0ce771585420fa8bb4cae6074eed7ad35597083930a8feb04a8e0e1a86e3686afc35000ed51f66dd733562a0fac327f273a35b946d8112030e688cfdc055a4ca773f62aaf29deb266c131554ca29698fd89d9c78ebd35d069a0d8aa46da5196440d9d94da67fcf43a16c6c823c212434434ccbca1333ec68d0abf092242d470fa594d216accf1c359e307a410e9fc2f424e39c93e161d773251e3960a2417c3860abfa0f3940395472a654ef207cc97d471cd6df1a7fe89877cba457c067009aeaa68f729bad1527439aa6df145fba52f7cd2d8618ea4765cdba1f4a23a0f0872cad7187dc7b805576356e7016e1ff91e3d7bec6183fcacb3c59857decbe24ae0435354dbf0c0c5ad008bd015dba74f1ea7567fa68638c1c638cec0426d9a3a0497fe8b0d46362f2bd63a23552168954f9f1715a8b5becbcd483df25d63986b1173b9451c739bfb93941e5c7ee9b1f8397eff0096d71288c8a1f464e760b7fc71328c40176499a9b35967c6c855d2c01d92e409274a90628857579e7d1dda33bc767c618638cf993891bb1ece1aaa8fb84a911a67e94865865e76d4d3f8ce7ad4f19042c71450a32ae1d48265a3254d9c71fa7997bae431f18507f9f506afc2fa6ca0e026d4d3ff30028723dc0fa41a0f5097da40ecf0ff461a21fccd803a13fbbbb7bc78fc31c343b0a9b7e26ff221d7c715075af82ba0fc117047a85754dca01dd57fd7888833a0542106272508fcf60ae63a5ffe8f69f09e6bf5fd5cb7fa41ae767a82428c744fb207860b158ac157d0d869bf1f2428d01a840898ba51a6718a9fe839638b934f1b7971a3fe37cc02a89c657fd7f60553ef683d6ecbd044456d921d92e95d4c5ad8932ebbe10d408975f66e75b13bf582310d57f13105d8947d4e48882d7dce28c524a29638c11670a97bbe646d751805109ab9450a894914b3da27b1258e543f9fcb2f301d6d83918fbc26646f2a098935293e91f6709972b4ae95e7d0521a270c8f88c1118b61ee61553e2476670007d0105e7c0cc10ca8b012966537a703e918f5ef56e08f67ceef28744312487d60acc103cd0c2d74a4f5d00e4386c22e4cffcfb1153f57fef09f5ee6f6f9aa691cf2528930aa69ff14c0330c2144698a65a8475cc3e3e6dd5f6f2f1513b30ac09c576ac176d24875a6f879217ee4b9ea3368e6a26129771cb039511930f8fd8d4f8b00424c6132c5430eb9622076cea129923d9a3f8c8aa7964734286bd76f7ef086f9539ce87a51f70044ba4f8630f5f3efcc861ddbe7663c713a8ffd6f8b3d423da90533d7ae7f3c86684298c30c556034e38c5ad1ddae75da2d8d08bbdf9e582cdcb00d42a197e6d3a195ec0829efa6d3e6775eaee44011e2fc30b51c0db744aa4f42be0bb13c2e36578193a253c3e679504b5f99bf72c45bdcf407b23f7a6eb3e5759157c35cdfec48212e1e324d4fdadb1053627a526d3bfe7a1b00d9680406c8bc79d84c8f0de7b9d12254bf68a26785652fe952ce11f7811b492c2bd005e86cf59cd1550f8de2f8edf6f56b73875fafdd661d5007ebf9b70eac6ef374fab08f0fbddc3291bbfdf4f5895e3f73b0aa74cbfdf3fadaaf9fd06e2548ddf6f2aac2ac0efb7154ed1f8fd0e6a958edf6f214ecdf8fdc6c22ad4afccaf017ebf8b3825e3f77b0bab0ef0fb6dd447ad42c0ef3bcb99b06ac7efbb4e02dc09ab52bfef4fdca755aadf6c67347d402406ea986e0600ddcc4c07b560b07f7a00852e48423dd0228469c70748e899010097030b88cb8145657b80edd4fde778e213f6f69fe366466362c8909941a386c9c60deebbefbaeff41cf75cf7e178fe9cbaa51edfc11e1edc76c3650ae06c38f8ea8fa1fb260cdd0bdd67dac7c191ae905ceced9f38d21047d2c2debe0d8ef4626fdfc491b8705a8bbd7d1a9cd684bdfd199cd623c36932380d88d3acb0b71fc36942eced534ecba215692a4e3b6a9afd14a76d619afd04701a51d3ecefe0342c4cb38f004e0b3a00a751619a7d03701a8ad39e30cdbe0e4ee3699afd02709a0ed3ecd7701aab69f673702423a6d92700472a6a9afd0170a42c4cb34fc391849a66dfe3485698663ff35998ee9b1fddbaefb5eef32aaaf29fb2f98c85531ff6535786bd53d6d1c035a3b2cf2e4edd1862222818d57d2ee22dac62b21169e9a98b62b1154e6d152864a9fb1cd4aa5eed6793b11f4e7d994fdddfcf7c3875823e300a36855318104685539c82ba8fb9302b9c6214d49db20f547f92a01f746547381d006e5718f7f1ab6eadba1f3920ae52f705c02951b2243be2b59272f25f82802a442b2927effc55dd88bde5a95f7624031700ee60506644bf7e99bfeac2eea34b85bdec0802b1b70fbdd89badfb31f0d00fbab69fba0058522327009ce3096d673e7ed57e1e9df992874b5402e52752e12f078027d49344f835c2a036bca5f6f3164ec9f77e6d967a402b4a38cdbac9200832cc1da5a139c51fa462a5967acc1fefce9c29d3027d1b7461a67bf6fa73b0e7ede09784c22a29f377df35274171dbbd79a1eeef600fc21d2c58425e0ef6a012edb727318944ca489dc7218128f6e092c642b4da5ee3966c53ecacb4b721087bf07db0870327f8c649e9d73829d873a9c7ecb6090a3f86236c0802b3391db0454ff5ca838f205bece860c362b9a1ab0366acf37bb6f468d85ee7b373fbb0a9a424519bdc5753e7673fb98fa6cecebe01d4993177c4a662d84f200da8185714a7b01d2cc51ffe7c2deab7afec6b08d1ec49af91b89f29ba52dbf38250448aa854f83bb08ab3879f638d2a3c41fd76d41802d51a0889c33ee3fa39853d01aad82a5330aa6c434424a808a7becdc203a7aa4c014b859f837dec00dbab70cb10e8967ef0e4fab774034fee6bc66d1529bc2a97cd39272966393e9b1a2712d8e5c70ac108203a706a76275a6588a644a938326e071e046da907a8cb8328b450616976a61a50d30ae8e755f8455ab52b081fe38a703bc0af82ae1076762842048876972e15b2480c5305160c62270a3b2b25374c3464b418982f75da155eaed546822e2082cf8af44b78044106aed5e97356383e6705c3e7acfe7356dde7ac6cd4982123062d2979f9527712927de94b9d92d2679fb37ae17356317cce8afb9c55ce6abfe376098e33695028fc18388ffb2f5ee07070a82ef4e3d7eb05d71084ad96d1d18b3d7eb1e746157b21817e04b437b0f2bb0df6463e7f16a2ca4fd8e3fe99e63ed4dc7a6ea6769f2938849c88b23daed791f6f34511f5eb27cd8a3db429ec71048a3fcf13a56391cb81e2eb753464145f928b5e6c0dbf47f7865cb61dac2b5c5b7e98f04e8b75459525ead74fbae30fa7bee8457dd5299c621d13d425aef038d9b6137792008e3f3d8e0e081c7ffa3867fc79acd4235e9103290e903838de86e823e827c6ae0738030714d61ebc7eb185838b91cbbc686f606cb57e34aefc71a855710a512ce510c491177bd35de3ab5571e85539c630047d810138e24fabbce8856e9b669be6f923117b1363b0354540559401a4e1ffbf71e3e78badeee2cfd630571b54e8e745ce434d4ae06abbcf5463cb8615f4e3d76b6f56d59449bffad5a4b2084e1d10a71702ae4ea7ee147f57a7e7f71e5a63c842e3891b628397ba5700fdd41d88e080dee06c70afa5062763050adff4847ef107a855fcc5d2f03387e1aa3c82ca1f9b88ca40ec12e257a603fa404c7810d47120f843839bc1411e2450f832fc32f8618802ece1600c0e965894870d0aabc2180eba60100f7de1e050d3f0938ce0a645e8064e7ca2f84cf9f9b9a1c42d6cd2a567e54da0f09d09744b3574750224799df0b2220bc756dc012ae271c25ed429a27eb149e579e23d3d0ed4aaf8b38329b6ecac3c0bede2a7f26b6fe4de7021d2c21e3fd1162f2aa2c21ebbab7320f6f86100837eb1058de20bbef6a62bbfd6d21b4211da424bebb057a942d4abf8d2db8be051855cd8732bb1ee1536d0c2a499e5452d9d56b39af0ce4ee52dd5f0428d3f4ba05ffca9b0f4a3eb27822abfc4ed4aeb0d08fc5ec8ced5bb6fc9ae366ea32085240cad346e57923302dfdf091d25a854e9c9520f50d7950517d47e6d0d7f3cc5893dbf38152b3f1b716a5d5c742a3f1f754f4761d5328188b9706aab58b1c3af2fbaa2d87eb814a17e3d31e9409cfa62cbc5a9af5f419cfa9c4788535ffca95438c52d22eae7565af5f32b7588fae1a89951fca92cb457e800063552910cd4048d2d4e9dd8c55666165cb17b5d81414cd08f836ef07eed4dec4e34c81a3f762cb435fc469c622c5916faf5e3d756f78a185851bf6671166e827e3cc429ef4e4060779b0d481c13715116e8a6020ae58d1c8c5346da6e24712721a49c95c69d84684a66d3f86b9fb3da2d66d98bdd89867571a1739240af4e12e0df7eeb44407afe5dc1f7d7be243c597e7c589add0f9b1a5535beaac6c7691cc66123d9c7245cb3eef4237ee7035723f2d7c5854e95aa2ab97515fd548ddb1589db55e4785055f83be39299075a16148abf8683e3005665f2d7abf3f73f9b39290d92714998a6794801dd69c2284545285e90b781df6462ef701887530b21dc66d80961af83b0d75c15d42bbf0338f590fd0b66be2144bd3237f110324326eaee76ef6e6feff676ffa1113a8311c3d6ece7d4ad5b82e1051ca71b364c3568cc9091112386c2bc94368d944d4c466f2ef5e330dd6e7709cc61662d1af42c28bfc6dceefe12bb6ef729e95e62a0eda6f87d57d5fcb0dbdd87bb8421057cd7fbb77b994de0b367edc7aa91e6947feeee1b77abdd95800855a0dfd736cd78393835e4dffe93bdc781df886fecf57774c83db3ee7cf8717a924ed215be0b216ef799e0cf55650f29cc370db71d5f76303eec9c3d538c5d0f5e8f982a7c29c828a57c9798c4a4d7d825e10adfa9e0eef0c6468feefe53da9003ab57ffe07fcc70c297330ba1186394d284ea41a1e6464d419a97c327cfdea29412c3b028636904d24b3df8796e14a3a2273e0c2207b1d6374a29a59432c618db05ebf38aefdec88f9a8a42a171dc7a4bda6c6757d9fdd6c4e84fe4dd87d8b418639c73d2dea22d6fee5bd45bd1dca84de5b701428c5146982e3c89b076be3531e70a4e93f4113e3d57e201f17be80453ba54434ef59fd8b70f5cb1d7e6d6a51fde0cfb65ce0e4957ac93bda51b62e745c02eda421e0da1e47c602863e46f1fb8eb41c687ab23fe46eeea48baca6e3958614bc84c76aa9c1897b1883c077bf23df6e4a3d893b5853a28e3fa0af659d7575a8853d8cbff30ef6d4e5658eaf14215146ba12afda769a4730b63b0873fadea16c6e5c022b928afe47bd1ded474517d8b2a3f3641950febe90822dfb4e662d5b00de36690251ab0da8f7158d5b00dfbaef2fb8a8c51e5f79133d991df58a4785265073db3a4b0523fcf1b6b71ea93d9e1d487c3d4c33a9ce256932ad949953cf5c381956ee00f6c6a7bf91ed814cccb1712c406f940ac0afe348d7cf9436a7c3c173c13a623a809aafc60104172bda85236e99d22ec658dfa75508d26823c7a0ad4217f4aee2754f9f0a755dc6a9ad27f35de53f9301bc72d2c3d05f2682c56877ce923a8e93ecfa8fe162d1f05c2d6c82aaaecda4efab1871c0631d8b0bbe6614f76cb3aecc91df65ea874d0d6cc981c82f069177bf25fba06624f9686a0f2fb49fbc497dfadeca589ca2b4c2325ed1a4ba95bf6b6eeeb2c59117bab7133b0275fcb36c8e1d0c05867f30215f49ba9f2bf47710a56f95e0e4ec927717d853d99752dc49efcd975107bf284f51556f50f8bc5626225bf8338b5a9ead3c57a5bbf1a5a6896a5d95a7db02ccdf6c04ed54bd9631c576d7138e36417f49bdf030a7d28ad5fd1ee84fdae5887694ed8c38a75dc624f7e2605fd2ab520bf0eaaf26515f49b55be7c29492cc384b633d88a9df268ad2eedbaf3273d73c23d8a5b76ca9a7f383585819808bef0c354b054c873a542d65261f6ed9287531fb37a38f5b98ff4e1d4d747d2c9d17ef2898c52e1cf1406ba822ea74eeb59b765ddc47100a74a0fd9461e65599665fd5fd72c6866d9c3ecb3eca83a15fea1428ae591b1a00e9f2fc78c8f8d3ce29e8c057970142d9bd977f771fdf88759d079380ae4e14fa08eae87ab951fcc873d1e7e88e91cc9a3c95d0f70739e5651da499ea6c93a2ddb6612f4c37c6a14f6a0ff34cd13c8c3a5581df0a14f2ab606fec7f5f327153e73e73eb16e95574ffde4d12ce2d409e661253dfc8cfbdc0763b52a16613e58cf9be6cb2dc097612c0fd904eae0c2a923188eca14b54af2b46c0279482b5007fc37519e58d4a4d2d9c9a31eb3339966117b5b785a25839a069aa8d4acfbb028f06510d67d33ebac3319f452e567cfcccc2c5bf667533b6bc9035f5a813ca411d4c163a5c2ee301ff68eb6868b34823c6418ab630b5b035f4aa30a7f4615d4ffcb58af0a3356c6246bcd17a78c38d5c3fc24b36a0f7f1e712afb197984b57290fe93473d24a195df3bcf9342f2cad6609143328b0cc2ea80cf9c1cc2d640199471415f062d2adb81611b58689a0679eb66e6c85c12f443d5c9d0e173fd6085023b254b564b20f30d7c23d710429844728c2ee690c400a94020f67aa83affb7aa16ba8999b3ebc8f5bc5a2d14b95b684b0f35d1164e9dd61b4b6751a27ead056ed0d52ad872d5102bb4b235fe730594e10b06cd49a9c9e4cd23e88732d5ee866c8d7f0bb52a87a5f1f77642757f8d3179c56f5467c2aa77412c9cda2a5e04d50f6af988a840e425561550503fc8059311eef070cabf5d9c3aed7812f5834eaa0f55c7e16f62820e6995d734fede3494aae7a2f07fa65f9b09b49dd1b64077c3381a8333f22396ce561172e2a8a8bd198891a8f061aaf93b46977ac4d0b46d7ef940302b2c6931629adbd8830e85edb319323eb26464c9c822bda67dd6efdda576271f5bfd6bd8eadd8e2ffce7e7541c7e79e75e301b0f6774321d5c1a9c263dd6652f349094d841939d1da8e0ca125cb0cdd9bd5b317607444f44396a96cb0a52b297eb78f38f886d1a473f868342e349dd897f57349e76277e58e56fede7a0a02f5d13753dd459d8831f040dae7598a69535a15b321b77f2df1a3f5691385ec8c274c594202afbe7f0bc2a8a2a77a82aa8869580f0b0002654bad30f9727e8a9fe393db43139b05eec6dd53458f267ce077892c00b2780a2490f6b45e3a1d4f8053071558e46b784c6d378cd937005b20026aedabf0026aeda1d9425343a29fd52fc736870529a8b559bdb0cecd9b007677085aaf5e00ea70afd96b469dc565802224fd082dacf251c505cb06a7748d0fdaf5b9bc5e4c072c11765cfa120027af9b0a1499090201042f86a5513f58b6a41e1179b65b0772835a1f8053db65a2d085403048240104b8b080241a01a5d340d7914424643746832b443dfd0465be58ba37ac4a953bf026a8cc161f8f810b9b6e8d76b6f4e2ff4809a2a4c85df437bc3117161556fb12a08e44d2a7426b5bfa85f85232a08b151e6ddea8ceec0f8f30e4c0627c43a974fec7cfae19bbe7e5261d7722d68276169e067f5eb2157510f6d0d7c1c9e4103fa75ab5bada2f1f0db8855d5781853bf6ef5f7cede34511b310d7c58a36b2d760c7ddd1afaba15d3aeee83810f879e40bf6e56d011a8c0840aeb0c20aac1284ee2c62eb81971a9d1680b976ef08d4b409c61bf7c4aaad635769f076af3cbd51f0cfc276cc43615a029157e4701721e226a17bfac20d42e3ea27edde48b55f1503fec9d21232afc9e25885c0bfaf5d0107c085953a0c154bbe3d7d6c077223aeb56b9024f6d22f6e07f5ce3b724015fd590a93dd4aa1a73526a32fd7b5eb76874ddea1935a05a7f01f4858f0637025441ab58a155bd76516bab8071d45b6a0c81c2d20ddc8d6d5d02d23380e82cf558538cbf476e87726009a5f6b3528fd6e1428d5c8c0a4b3ff6bfb81bf483a31ab95861e986fdd8ed7a5e7b873dd82df6206b68ab7c81a5c25ac261bf3b243570edffe1b597d4f68d39fa16fd50d1e18fde2ff8e2d409b6a08e0a9af00e4c41d8f3b335f0fbd43dc4a958e1779626f2963761157ce26a2d9cda2a5db02afc36fa9ce53a15cae8dddae1d4077f2a7c58e448ebc06e52e1cf2c40e8f0676fbabfbb1fb6063e57f8700aa79430810f59ec4116e4610ffe0b3ef48bac0a3fb25a059df4ace0c756dc8952a114ab2f36893d3398013f803e82ec8dac39a0cd5718c0a0ce0c83f6861f3ebcc2a97df804d81af87c621f9cea0adf06f8413875a3c2ff01326115f41112c2a9adc245940ab554b85c2ae48fde28f8397038f511000671ea94e2d60c15ae950ab9637803e7e0d4c9042b8ebd81b50a196d3f75dfb4022a43ab0200b323e8fcd951c685c422f990a6b0caa687c464a82ea949dd8fd4438a5217be738a531ff422b238f57193d3dcdcc888fa3997ba91c984dd476ad5a5375841492d4ef1d4ec8853cc5c482c66c9bc8cd88347ecedcbb05d3c3172ad92a0ff302441bdb731711fac375ef317cddffcab5537bf34de0de7b9ab69b8de781cb6e118688f6cd8f8ccc6bb8d8fcf47a7c7f1f088536e63834279debfc9c4dd112cd530bfbbcf6117b926f4c3a2d47dd3e9e38fbfbef9d1cff4fde7d9645bd85ba34affc37e6a76d4d5a031a3fb4c2fd37defc9e83e0f15a3cb7c62bacf86494033a0de65af0c003a14fe9715d57d2c0aa7e00d6e2b89fb3ca8eed313f7ad95e73e3efad68a0d1a6607b940f11e87e1ab55cc3c5e0c4ad02f3b621ee8a2d014bbece8e326fbabf116006e573e30c110786ab4a005364db30f03125ef72686ffe6c2f01fdd176c1efbf5d77a93813b09f1f6a80a32385a799fb3dad21d11b023051d1e2c75ffe38fb7442f728483ea26e9ee7878310fc31d51b8c2cc5354c4a9d3101d38d126caf8691f3633146193cdc6c0c23b2f226e93a90f6fcae8db05fd3628898fe5d2926a320618b36930193d749bbbbb79316e3eca6b150f41a8cfce07c6f14a060a283f377bd9cb975363f8e285080aff232a0ac2362818803ad355e66e69fc913932fb47766f006b414a2e5b08b9bb7f6fe1eededdc61d68ee1ee72faf296851281b5e158a72499886872a502f6d51108c319cc561140ac53242deeef80298232d998f6188a828089c1886cd396d5c41a8aeeca93999c79cdd3d7fd99bf3677f4fd39c1deca67ceadd67a23d9f605be4a62ab05ed32c033090753f96a6bf3faebe593706d45ffeb7434578f801b2b6ca16a6d4fe21adca59f5ac3a4ca8d72fc9f3421e2fac4a92ac853c26abee7329763fe277334da8425b06d21a5fcec7e128a1b47e356798a6df25778a0feb16e1d82113185a0f4966c57ee1ea805ca3f7472cc6f81873d862bb3bb1b918ff7cf66214babfdf8500eababa7083ba6dc951d7d545a7d22c51c618e30fa2b020fe0c630140a2928ac05cdc0750d7d58527d497baae30ac34c32e30c182164840794161042618c8034b851e72aad0b245123b34d882cb166ae081ed2183c15a931ee7cb462aedd30d81173e3a7861d1d30323aaf0000d586083214461052bf0a4000c29fead28d2c41456149e8085a585a7987eae94d27fd0050c301da7262a432915b02c91456271052be850da052ba84c951c0c5552dd2a2e29ea47a1cc00084940c2105d24618515fcacf81f85c222830758698214a0d0a0084f5c8941fd4c0c797a6044142bb4c0e4f50fc42a28383822092944a1042ef8c7f46f031858e0678b1457086309415491c50b725084235eb005125842f8008b140844c10509b478a9c0083ac8224a9421a8c064052c7801152014094e4c38a009275842093818421255a860c21646208494524a29603efe1447909ad0993e9b18429e40081a26a8e28a294498011458780a200d8b2634a1e352d4efb5d0821cb55d5a5842d69a257091832368e1043d2862d5388c9deabac2e84295755d611ccd1bf8a854b0042030907022075380d2802d88a2f841124f68190285ca228a1ca86c3982082bb610644416cf62b148f099989ffedb000a24559ad0320250115c6042164f88f84901128ae0420411522c9607fc60092ac842062e2eac7041e5a75f8427b60a472062a2488a249a5471e2e708294d3401b40510b0f4e4e04089297494782541c78a19c4ced4b680051e37f104284d749c3cf1411195d5ee20082c28a83882111257acf8b7c4a88ae5ab2b8c292ada335b80bb40a89f8c8e23258e6a503d0c1254f8cd50fd7795850549e86942ca162656fe9453eca4faa338e5bf83532fd5dfc60141f6065688048450b52be99cca51631735da38827ef4a12b0b46a834aa3f34716ab759c56f9dad12418c1bc4bf83b14e8a11f8fdb25392b392bfa520b23bed6a36cd0ef933d511e4c386203f4026426c56cb16ed6bb978a71835838d0e14ff0eeeee6462e61d6c89ddc19c3333c78da61a5136ecb54692dc45d86bced1348d0477b0581a89599cfab6cb163169e7540ff293cc9ab5e64ac6afb79261b392f15f8d19646c1a89967e3f07ccc7bc36a4fecec29d1dffbc36fd98d2cb520fda49622d7d978080a04b972e433576473ccac1ca9da53217a4f4d2750f51c372f6c6bd1669950d4cd3df3ed8b381038fc4b3714170d89afe1b56c79459263bc8ca02876a7f7f6bdf0f593e3f7b8d29cbc77ce85a9adfac5a0972562188f19a73d833a77d89db3824b08b977a68a46f9246fa56890008192f045cc950c9e84e41627c8c4e095c8940c6c7f89c553faa39c80daba37f72386c8db63725ac8b9c0d5bd36d037b1d3b0f870e6850ef7c49b8fa3369776ee0514046272546b7a52031bad3aefabbd44352c8da9ae6536cd2ae2bfdd0497774f611c48686acbdd9da5880426d1c4c38d8eb2cec7cb0c7ff896098860b34fa3bb393a47d64f833c31e435485306633750c8704da4882d6a8ebc2821335d62d4152851c3fbc02856010e5e01574296dda7b85091a407168b66da651ce14d331313486b6c9b4850d7605dcc10a0ae2d407afa87c8581f415f0676e948353ba586db8a810540254c9ec4d12f686fefef73764fc500c380489d81a7e22b008085ba43eaaddb75da01c0cda1a6ef8a7de2c5b8b534df8a196161f5566ee85bc44508761e987d7207ecac54a847f074e1580e115508769b8053b4839ae366e403f1311e80787b4186159960cfbd47cc6985583f636ad8af1a55f2bf205e6b71352408506a87088a6428f63e8da80705543fbfcdbb4fba829497ce1bef764fc6743e6bf18d58cffb25a7ab82a1a5f2a3d8d199c0c27835b4e3ee44affc221698097b8e592b07fc376137bd0bd189d088088f142c0558c183f572d444a975363e4ac62fc6c1ab601fdca8d031aa3c7c6178ed5102b7bf7ecb9e7413813c01ac3e210167b081288e8e0f13b76dddd9d65bf599665998c09676bfcb353961539e2cf03a7369e04fc246152dd1d8baec7c14cd46fdb1b2ed62bdca0faebc0a902547fcd27b0375185f21d5be35e6de480fa0f69d59c1b58ff22fb45f50dc3d4aa97edfd5d1301102faf9562d7dc02125053240075863f1b185c5591a629e2382de793beaf3375b351b798ba65757bb8aa18bf6d1f83dba5217d0c4782e14893f4cd6d5fe2e6f7c675fc2dcde79ecf73766d92b942bfc8114fd235fea08453f3b90577f885dba669f662077f484c89b4dfd83372423a65339048ef836866a872a551f9718208e941e5d78155db05178bc51ac1ba8c822a3f2acb814525f56d91f30a2a2f1121b74d235292341287636b60eb57da2fabb49fbf714a3edc39c334d98e2f28c923751e7b9c7133f3833a7eb9124e4132d2d3b9fbd8cc3aec5b7345923135daccd5fc96cd2afba1f6cb55863d4e3787c4541b07ac7a00a63a56bb33e2b4e58300f34e02dda50bf74bec1b5bb9ecdc5aa0824c38bc1c54a0eb7a15d5cff41aaadf34e1f0729c82ccdf2a84592bed69abb2e79f1a6ccdd57c12c744089bd5fcd65c69118ad691709a94713cd4f8b9bbbb8c08a85b02b253a8db4139f92b59d70a04f34190a5dc9bfffdbb20d97b17815d651d4b8e34d0b65535bad082b5da1b1ac4a11f6a6dd29a33e2b4d4cfdce9477c7eee3ed819e13f75e7fd3935a7f6e9c7e7d4e6706023fdd388bf372cf1b78c43ee02ef6abbcb3c789779975b08389f5f6bcd5586ed66dd94dcf743ed561a49c2d565d4947b330fde8575ee4299b3dba6e95d02ed82aecb8ba2fa4d2f788884306b158d78d1f28275f28f8fbde44eded1b08a5dcb8651edf9afe263bf2dd32a621f39b92dba8a0f4b3460753b1ffacbea72adb98abf252002a8db4101417c1cf6eed285b74b975594400356b1dba659f6b6b9abdc605b9bbc49595e02b72ea6c60ed4fe41a31663cf6de376353921ae7570131081f0ea2708947efb21a56efb21fb3bb650247b94fd16d59c55ce8a3d761fd43826da538ec9f6dc0e3028923daa497ad70092869cdabb8ace958020a062afc94deb6f58fda7c64969d9dddd5e7ac93a1fb8627362327af747d78eb6ad9282fd6e15e209705f2190c562b1e0d27856fd03952727c5dddd7d484b0a129b6a2449d7f95ecd59fde84702bb544e7ec631c95e0829486c6a9236407ce64a35e464dcaebc6309888c2a716858fbb18c93e20363dd3de3cbec7c607f8c1d092bda72ca35081debe07a1108efef770e562d629c0f2cb1f7d681d6bdb1c7ee8ddda8f2b1caed33f6e9c7c23af906d8a57a27a10efeb81a81ff4988c9ae86af2cf706f26824904beddaa51fdeddd6f0c76f23b1ab61ab07b1da7a80eed009ac5446d25db854f88ca4bb7479e903c3ae078c75c0eef3973fbccf5f7e977050e2f18708620948a56fa8442c98ca9a5432442410000000026315000020140a068482f1804cd223dd0714000c7eac486a4a170985610e04318a216388210400001000011019a26d003f377ab5bb613e6773c7b7ad172515035068d34b4714ff6b36f4da4ef25b18a866ebec8c5ed5ae3710351334a1fa1a35d8d8b174c1cb07a3cddcf370caa0a4f18ca71e5e99be454e27a5bbd3b4d9de8b10fe01d9231f0e709c8260969bde5826edd42652b55b6554c5c67c4d7150b093502931c43656081818b8e4e561203835855b6ba3580ab49429c045171e75af299afe39e2b17855625631fe2efcfd492ec320efbd472ac454ac0d48a413ca6d17ac683863bc003292ece4136a8965134b23c12d9811a31c2595432145f489df68ed5a99f95d0190fd1c40642dfdc45792c4d0df4a89242691056950718080448f40d6cd63c0ea76833a10ac5466b185d102a1a4e7355839cb5ebea1d23bd392a94185e4cefe1e6720f9f29400cd831ec228dea517aaa5eaa7fd2751af49dde8252993126f0f9581b70a8d136fe121d0b971d95314e17ec59010fac9bb7099e2554d4da0ea396844a78753a088b156a13c35b0eccd07f5e52c5748f32479dc65943ed57b9e024b7540fa8ab3b360f07ad38f0b4be0d40889f2839aa56db96b347e05a1a45117722763bb0b7ee74d12c4ae40f590b045b8f6bde26caaf3b7f07379cd3891ed63cd382985e53184e3302c1af07ae6302ccb3d0162060a79104d50032e374709d3b2352aa940126a124d79d880190b85fad77cbe4de686e74b00e1da5deb53274074d1fa9f4eff58fe56dfe05ed1b5a4a9dc50998fa3b8bc46dca3da9ac6d4d5e4878a5ce0b424aedccf5ed6175071495bab00615c6cdcc45b2bc936a77e46aec17f6a6741608de59c18565aaddf8f9a98592c3e6b9420226b4510ed8b4a4a44a2c55822d87c10f7293f21a2a941620984b42b51d2a423d1325f18d98a3fb7ecfd3cf49b48e4b259d678e7efbc6f2b21d87ba3151f0b7b8d3b16a8fb5bd8a3de6f575b6f462d367ddb2d0d6d04dfa37731b791b020fce10a45e8bb872140ff05f1fe61eda5fdf7a7cab18fe24cfcadb5fd4971c8d79274cd9c019e3c3c79af8af682a2ea5bc6855f9267ffff6699908005ebd5250ce40f72aa81d73cf979c417a32fa676b7e582309174706aa7ba44be174219de7c7521a5fa8e07609ddd62350b69e245fcb8f7506f9c9f803b330f2be207b12576284b970715b935c7925b216a1fc0e73f6124472a400b158805e52178a5c404a1d65c916f563415684f90bf0fa7309fe49d7c9eba8e64cb5b9784778059d16543dd218e5fd94730d675b81bfe103fef107f1bf9ae58375e39248ecf4625eca9d31ecbc31dff20b894cbdf73e49911aebcb04e34fa05dd270cf385476397d9e7c91acb81c6fc04bfac104d93f05f0f053c667b47348c0523852215fd47c6913073ddc5efb8378a65e143b861c687e438d9cccb30a89f7072af4b2aa5199301ff23dba48c45f6ba662b9a912fbd49533e14de2da404e36389f052a431bf84983ee5c586e2c73345554642e1ca39a4d0220162bd7e23a0b0e6cf0b1f051b8b9c8c9c11da9a91742d3b660994fc5a78fc09fdf2354dc9570ca1f3a798d40b861bc03d4916845d32063d460b76ec4e5674535bb53b1631522eb46873e13419d20412c24cd02ea3b0be9780bb0dd7ad4a4146a9cf9bea45012b4c3d643de2613dab88ed250903698938a8acc6c28cd685da380aef9d36c0f5a0c1815936a268d3e41957e15804be307f9ab066f5d8ef7701c57a22b946c337bfc63cabd55d7e2f1fab31951d9d8aefaa2cc918f74e3519dfba80947184987f5f22e05321df6a8ba96ba6edbaed4521888cb65a410f893c97482b2ed783d89a103583856d1e6108849072e3036ef39f6e76fe4d3a4b6111fa7badec21f45caf9efc9fb8331219df48783a862be17c2466eba2d3679f8e1fa728e84812dcdeb1c4e0d023e7f32e1f0768fbabe1fc896184363d9f314006a945ff67042a23813cc6b53ffaaafeb0f26480e5458c774b0a493fc8f8ead0774708975ca0d9a4069fb21354fc8037cb3c8849c2fa42c7157b89286b2da1f412556e66475199af4e450d6169a8cd68e07a65ffdd4c2857be10f02df592be35e5275857609e02980a7cf32b77ef9dfee5e6ebc6e5c675d3edc675d3f5e6f5e675c3fdc6cd6eb8ff19b99fbff927c4c5f109072ff7473bdd16df1df5eb8de6a5ac0df4edb08ca5579d79dda5ffe12a1d1018cf8bbe172168e0a7bbed5e2abc6d54fe26a8529266ba3c2477e67a6045d4e2ab5ef98173209562a4e71023df1a619548448218499e589ed90975f1c6d5aa394337c2e32f214e547d71aeeef764a028aae6798cce850b3f839ccee4ec37a4be16eb11e22033e67587b863675e130318f1d1602a414f824075f8357b151b85f110723038cb02bd8b462c65d0621e7993f4635267c8ebc5068d3df1cbb41e9b848967f232ed17db6dec092ff3151bc2658e3dfad7841f8a1e56c5e60c4d19dc88b4054a00ece8b87ac0793ebc1000eec281cf8b27615aa01f25e3afd0b8f7ce03c7ef8dd00898ad28e62dcdb11b408e27de71f3321341d9a8deb9f2f2db0471ca006148ec19054ee8302e35d9378e072dfcfd44e840dc61fa2550b52af66a96937c8a8cc5fe737f43c1a2f6591404c2729e645b9487e70efa7ebd05be6287de044badf7666c4ed4feb51193f42bb9613f79e293a96b204aa383eb9f941bed3347eef13eb25af4434358111b3096092ed31eeb06334504a4edf4dbe4ba59e782fc56495355beb7c5d6d9440b7a6e9489855ecce444c882fbbde221ce00c275921c6f93d8ef43ae1d47815c49201edf2aa880b29edd166c1748b11354ac7b365c6a14749454893af162fa8b78e3ab25bbca0ad69dcf3c3ab34d3a48ae6b4bf76e97a6a982c4b8449ac10c405c6cf077dd54940365253560b7ee4c4b4475403c65d28c2c759c53d7097235521fe5f5a8e9429965a43a6f548f83ca70427f05c3a35bed4bf1b4a95da7265b2513beee10942f2ca95c8daa5c073e6030fcbb60f5cff4cb003d2df06405e2d2655def0b0a1a7243423c409eeeb5d22a0f4cd2714d87459b6095b510db21feb7b7b4715c9b615d43bfa65f89bf941b27c80b1f41b48611daa2b11bda36c5bf3224ed2a4ceb1a377d3129b3af4a492815c298e734fd96cd5c056a1ccdb93527c65e4d47f11ac058d550140ca90eb39517638fddaace56822f30768faae5237e1f55c3d08f3a6321bcb90f8a599caf72c97404484e985f8f28e3c813507c10d42ba427ab83cdb76e86856260ed86b23e5a13cfe74041450f6013d516cb0aea6afa82aae6d1ecd1cfaad36d8a85acf24419c50e63da3ec8ee934cc4dd000e177a4df31d369901ab7670dfbd494b27a16dc6c8e8d77f585cfbf0c45bc9c8dc86a4584bbc24c1385289310d0e0cad3efd8a1a862d8b06074838b6a9b52dab0827a2cb60646f16cb4323da13615342c9cbfc866646e513f53a5b4101d92eb63cc811e198a2b76b99d21454e32f02d8a06c56446e4f90783f0d72ad3ca1f7eeb8e6ccfc8361495f79a53e1077d316e7dd8758c5d582199002e666a8a5e5c64aec2e37384615abe9c52a8eb4e915455144c7949fa9b7a7e69d81b275aef28d32a69e4cd4bc11e196cbeec649eb0838cad87536708627419d5799538c0924276af4e10eb867dd6448fcece16ec464d78856b2b40a8b2cb5745685d2544bad13666b4230d19cb5ab9ce9bfabd2a3e7f6df82b02e744bd312434e1c26c68a79f5a8d9c56eeac28360985291f9b020d4a4f30fe1c1da0668eee333f91d4208996271b57e39e7ac239b24d92f61561ee335007e08b3ffb5be396983ea0ed3dfc4f24cf8d3cf8a8f4a662870e057ce0924d031c1ba98bdbbca5dbdb0478352e6478089d96adfb243cd5adb2af412ffa8e85a7cc60d3bf0ed0fed6ebb638efa405bb183551b35f27da1abf6d5864845270eb8c284e1510f8cd8a8212aa13780eca6db6a02a406ccb9c8b7322c2779828efa72238792930b88594e3f7b14bde0bb007708869dc115327065423b7671e35380a8476a70b0c4ac28dc9ae62469a98a29aa88658c1f1fb472ea88de83eee85c72b295165d8922a560e249541274f441cea02cb6b885664052e1022fe209759114609260e06bbe326c2e73e725dc281136b5cf0417abfb3451ae9d83dd52657041ad6e7f70efc4b97ca602623581181f991d06e3e3fa25803a78d12acef6caaf1607127900b7225dc81e81cbf566ab1d005735278e026e041f3d10613981aef008fc75bc277bf243cb94f7af030530431d817a0bf7132e252fb3b6c64c6b5ad53b29290a38096823f22a23961fa0289add9851277f335edb08e90ce950575c2178dff053d927456ddb8c2ef58e68148685b7c4a07a1e429f28a71df96ab8b68d294411dd33ff1137600ab2399b1a2b9a9901fbccaa97fe886263dd8b4ddc7115220416d52dae0c3c04f9388ecca5e76ad5c84d09f60cade4ef45443733f0bcc55e1cf9609b4ac71636e7afcd59e03c36a9e2fe72e2de3108d2f1b75e8556ccf2218a9739721968add49eade57e3ebc15328cd1332c0f0c0e3de997b853c3a6b134da6865fdc8867a7186017dd812a1cb9026f321e49c27f409b26906afb980c5d95ad2042394bb1db3a7a094b4ff2eab417998f6eb7ebbe7bae9369b7521b6c87cd9a666c302ba0e4deea8a6904a0fb8a9b8f920420871230a3a4eb5e4a9282855b3b15f7543117832439fc1e7aaa3166c2bc45db3877a3b80569c606268bf6327093146a0e035134298f03c8edd736412c2ddfea52cb484618163e0b47848662586d1f4e19a6d17da0a561a68af1cf04c62c8760cce06f41f09ea0496fc186c4512cb54d265344864f81c47d58c043438485835d31b1526da80b46a3bda075df8616580db1c5eb11d701de4f37e86a8f11eb472ce4ccedb8884f038e617ccc486b6b4b34d7f39670a0ec2a013ec0b99aee1c2d473e2b1922d5b8deeb2cb9b359ab4ffd1293e64702c53a927288d6ccf579387a48622df94ad0e4540b3c0a4b5007de1ddb3d64caa4bc2bd52c75c9f901a973a0a41850961e52616f6aa27e4cf08c205b20704fa84588c891be84226479e1ac6411715d6dac3c00855e37e8633963f0fc291608a95132c856caa8b9b5a6ec7d62a15ac6fb4fea54299475597523ae48917c093ca6ed24d70138c4e89a67e8df9bcc7b7998fcf8f6c32a4f1d5baeeb2ac984c382b70d3d1c0a154c5dc28d60c2adbc70a01881e7d67c980f2e336c783399058070b2209bd4afd09e929226780fd5baa2ef7ff464031b05824a8ac42e889e85d9e6212732f4c3f30d3d8701ab37ad231a655a1ae023728a303557d5e6e98b68bd7da95b7b15e9ffb6b4de2daade39c9abcbc619885ece1414cb595c3bb9132b41e142c87403adfa706f0daef98af834507c9c0628962ab657a01d6e07e5aa1365d2e248eb7cf47b0a5cb42cc2b3c32f91000102ed721b51bf1602e7cd3d5a4f6606c96b6f3aa1745aa0b1a8ec0285e46f0a01d91c846d82b83100475fa9ed12250e13641b51128e5a69e7e123fea07aeeadb0d1627483797071053b81628c8bb42d0f5bc20cba0c0df9e844854704a116c3714381c7478f64e1daf2838d8fe7fcbb629cbeb2c21c3e060d1d39baf60068327c9284575ec96a8401c4791cc48ca3df2c1a1b421645ace5c1f66139222dce0adad47cea0174ecc3a374aa3d1f2b5e3e8b48748d85e3a940d7352a805bd7c9591e549b6a6330f31d851531a3f2780ea1729b0bb145e920610369e00446da2a428912e1b8509118fb39029bde68cf02093b047533bdf8d114c2ccb956ea7a1b90b6d63684be84d37273b9f06e65553e8ef6db3d2bcdb4e2bfc126edbb54aba3015dbc3e4227b96648af98671ed6d286f375d6dce40cccd60d6b2c34f910ba84dd22aae682a23a4676b7e34f3f9e0f347301ff35be4b1808765246aee8d0193030570510c2d16471e8620985b52f82282c0422a2d603a3d387599e1c247324cd74b6ddc7ca1b1ecb890a1c857454728a2b0474d72a7bb5163fa5bce701076dda943d32e8bea413af0e13253de6aa3fe9ec13016f30b828bf3be7fbcffdf3b36ef11b2a2bf4c8f95fa36aec40f96d5ee2085578b8008530dc2dfe6fa573f21702dcb2686a64fef40160e8738c1810b2ad7c298d37eb0a3953985f0af10e08d9ae67041d50d800c38028a0e38c7b9aad57b24752a67db9f771b5a959570e2efc39c8f900a6290d66f26cab4d3bb540d069ddb31bbb7e96d10cadf7dfd9337b95f65e006f0dbc8f732293c510cb8530fcd93e15e81564ea390a80ac2876b75f24e3ffbc217dd7d05d35bdaa11bc619e7734082034c7c485d2d4041b9610eb221aed05182242cde059461c3c0b818d4a0c03c83bbf864ddfd745f9a937ed2936394287350b4ccac57c6601b65ecfdf0a81c70e6e285dbfa38b2c47654621f002f12c1b33a5d4e23b45da467eeb6578f86f6840cda781b221c3f18b97ee9a2dcfef2a9c7fe16ede06004d067436990090c2585ececc6ee86964e02dec5de68eb3c64cbd016e25746bc18c491188c1d2c7fa4115bb05d1c8285ca51bf7090fe68ac50090f3a140ae70d88afd2d085b8649d146923f1facaa537badbed807b80d662ba08b0b728dd9f2e1193419b1a45bc6bcbd2418c07ae1b037c0b225487c7db855d19d05c4dcbd3537765cba5410df7b2fd08e030a4ac17b207bbd4cb9dfd6baf0e3d31db8918784055bbc3bf077316ea1dbabf74c831e5f7518556550d3e372ac08b28d3082ac26f5b145face5a8253143239e8c214cee939005d1eaf77063aa72b7e1bb6f656eefa5ab54d451f953ed61f788461d8cd50279074d341d1691668feb7ca4858e9d6c907e4e2401c4dc29077416014ac9f1345935b8b59beea17ea7d924471b9efd8c03971ae0d9bd40c663029954e9068f3974208b688caac6b1e90db97312e01d8d8cb97073cce05fcf85ac5fcbe831613a58299f07d9869d42bb3c84f0f448a1d9ea9850a457d590353d8244d423ea95e07fb494530d5ffd538fa03b85484d939dc0d59238cbc4726f7139d3ab699bd6a0aa99ba728aa1226a4235e6c09f038e7d3d3d28ca16ce021a2fbfd85c90e66281bcd2124808e92d5f1f9d46baa3577d93e58ebda38671baa9a212651f8bfc72b61bfc85b80da9f4d6aed850fbe6512c3b1740236bac56463a497df357cace294ae31493ccf5915e9d6313048da035c809e8285a23b711052196a82eca830585de3fc564e83cc0a965dc1b25cc0432e1db47f6d89c0969505151d5bfdfaf4cf02382dec9ea91e409b6411a26b5940a1bafc3da0c14b974a5ae1ba534a5afd108e6341f8f4f86bbabd07300007223fefeef8543fbc207342018e957b88802d6ea17b398ac4cb5a05133f6eab839537f6b0c89133f3a114aecab88bb776e409612419f09dea656c16b5f4125a3cca32a2c0938707e3663d6b8b2c0a982598d9b4c8b30ac2fcf5a71f858c0f121e871a09f8b2b259ddb6219cee464432e93b2143d405bbb5f30dabfb20260b2bad0be4cd45edd8979dc1905b57f50652ccb16ebf50ce68ccacd66f35816138e06406d5a45cfd67d1ff2251c29fb378f11410dcfa5d39886f3d6d2e13838bbbec5936ad912c562945812d4a02926e50fe89ccc29001572fdd5a0bc87c1213e829ac54a8bd5e39294e71e696941c1678698f5c9eb4bbd0c5b3dd834b54bd629eba7d45808c983b1f6556570f3d2ddde0860306105f3ef18b52632fce3f7d8511cd4d129180758890113d29c1f46e3910a1b7fffc8478a7e15a0c8a86510861614af5a86c66240533f6e2f5e79a997bbc05bb70fe5c69bc5c0dbb1242b2018f684a596e6928496b605db8962f91ad2748132247db5855f27989e869b4781c37df347cef335cd61ce99393e9c78dbde19e55099cd48251574931e615d6af68fb1830e742b6141c7347d0fe89f03866d4665cec8e188333df6a8168510f52a929de4180b4dbe97d2302d4dc733d3d057a0d44200eaa8562a464d429005cb804e00d4154df4a7e7572cd8c56c6f35b860416d80f4b164945f3551ee171b0e922ee3dd3746e77432c27457e49c9baf2c463c4eaa5fc1b2e55e84142773acf6cceb70becd25377050d1901fe5dc4f82777651ca2671a0994457372a88617f47e896365fb7d0d2630ef70d250fd8ad269a1d1b8d615d45b0e7947953867fbb8f82093ecc07501ae06f0699fd383e57d23427fda748868d46831683a375a0f2d522b6bb988dd8e5693d693882cad11b7fe74397496c79b7cfacce01232020fa2b13ff0b4017aebb24b37d2cae2ba2c8680ad70684ccc01923369eb6c08b2ccf3050a85baee3b5c7657c13bcbe4df0720766037f093ea6f3a745f7031b3367d24ac6f694e34c533c47838623335f49ad5a5f7b85e1980283841adb9be0a4b930354214391e796c051b3523d11987dbf4ddcc3aab83bc818191c76278c5e9468d01a3e9c3e3d08526d9c53b39e550b80abe04bc2193989f124ca73b3e4d373c7672e2df8d45a78c85608d61c02f81bfde5afab9fb845ddfb173d0e7c7719f65b89e3864524ed14e54887da35e192aa967a49e8712947449ccd465497a1e3f8e5aa4a56122385703260e781dc0e123be0688fcd2b4f655523941ab242aad40c461dc386c160a8ccf39ecc017c52d19ed38d1772b5c70d74e2a53232b020d75c6a0bdcec0d2a7e97114ff66f49aa358b8ab63a4eb451d5230351e20ebcfe4c6470b9825caff1e82b2d7fed3771902c1fbeb6dc2840f31e93b7bb44c18ad3244d152521210510b6e3d507eabfcc8f1169b1c503631c8d29d95fcff95221dc492a06a5d8f55decefef653e219e8d2d9c655507fe0de978befb3b694ecd660db1927c5460fcfea93eab27cbcbee0521ccf339dacac74f9323b149e9e50eba2bbd4e6d6f21c54e2fb489236e3266a0b0db1f27171b70148cf8404324384b17013f43c45f32690e92d3f36d24a32aadf180d936ce5e22a2f52ee46923b44be6ef6fa2e25bc257dc63d0b5ea5d6b7f54ca1e233f12d5a6c3dfac15e865f0aaa33e5d4b3cd44b62b3621c592e312da4c3884468c861b7e9ef5cf32d613a888320b8d506ebd336f404b7532da2bf93ecef13402278d1ab0c3cc38e2faf85a00508c675fc1dda1d407af9c9c9f0cbd45db155167fddc2a4fc702f7dc45e1205759e50691d2bb31c9c6ee900b63ae15f43c32c99c3d7843606f724374933b22405aa81700fabec8d034a6453f305f68eecb3883a579d90febc625194b9a84034fb72a95386aaa662e6b2b1e6353d5e3416ce3ca67e7463845179c43f633199ac4404ccef2ad050cfc2b1c575b368e14d928a0759f34664f3d078e56b17a027f3a62e19cfca5bdc81e5eb0cd7f73aca6a40adc8c45fd6d3ccbdf78362ca2f9e8e2f07e39b571dadfe9b08a959def576d7d7036b8421d45ddf888e6a0cc384bc57126488d1ec6779d9469f4494e60d4467c2e12223a7108ec564e2925b9e8f5c91119c4715a42035b4291474eed855cb294d69f232029db6b03b1a1751d34b038dbf934eb81d46c078fcb474516e9e04e72c4979478a2fb8697715fb18114e0e0320c3bc5e79835ebee5fb3468706b1d93d96fa2a3373ac7e5e28182740483bf5918405222e13641475310e63ac60295206a11fa141d1014101a4fbd0565e8845760fe424294b458a66670dc144aceae853a3009b12770926346606fa01cfd1422cd536bd7a34849d6d331d7370dd0adc365ad720063013bbf393dbc3abab4986280821944fd81837a65850e83eeae9c9e52c5fe403eafebc83775203a14a3d0d351cd0f0b40f6a9bc8340168dec8e6aa8b588885f687a1758a2a894ee7f7e5125d522cbb5f0389764815f3da7467e0e88f3c03ec8d2e15bb01ff53e5fbc22fb4211fc0dbc0472aaa8cee97bafc190b33b3cd1ed1bb281cf6c19c94617c5f496752448656e1abf3e37c3946a25845c2efdc8efe6df563c24334103132586c1aa7627fd95707308f33a693e7849698804bc99b6b0874b5e8ef94414c3320406021455faed68f05376b6290dd288fd50227966070afad681cfbe241ac50155ba00279adfe2a6d842f14c6fe54115efdcd503a264cccfc7dc9095ae909fdbbff6bfb881679b9e3080c4aecffbfcc043d7c2d731a652f60737a209361500c02e0099f2e9befd39d5eabba98626baa854beca1d51cdde819368b67195d12a0c3e7f0bb7df218d6ec85ef0757e764b87d00674148dda870d6e5cbc4d1476b30890f74687b7f64378da481c37183347c4143b0daa1aa4c6cbe35a98d9d61175204c73603e6814dc6cd00953b0f10ce6a5b3cbbba2e703c9fa0879297458793d95ca1575e03ff265f9a9b569383dc5e94df14ba7204f34aa86e51c00df341bc3a8eb57df6b135f16b01bac7da6ca265af0e8ef8e53d2f69dd9cc1b84d0a1337a8cf0901768be4d5a23a82deff1a7f68866d9280d7df16417bfca2f30ce5b117c81c7a2b2cf789ef2372465e31a9524fa965c0b0a2da0c325d0f69720d25bd49038ab1cee418a6e2d4b8a129f9dae8d07e64adaf9cea2485f477f03d72609bb99b0ec600af2a1e0a11946d18910f495872d1fbe0e3090271c03a9e74095da90234ba249616044c3d1038eaa3183a8aa9a8c84d3b673c7d840476830e244d1b19e6fdbd6c05bcf336eafa2128072b3d97dd345061b144c4bbcdafb0b16db59a2bfab1b847ea40d183c1bd7730787bc1f91db15e7b758a966992baa6837608eed4519ba45a1b611564788fce29e0f88d5c11a26746c6ee0a3e3327efd8a31774adafed080d4a49f3b0164903009f97ab9e532770ad0cef7beffcb607216eea8026fb497d6a48e4c0d8706282abeacd1a58bd876d39e5ad8b54e78a5f28881af27653c3539fd06f6d0d66463bd557441440469332b0272793e782eff237c73575fab3a030bfa284526d95d89c1b9c041ff0b68113ba713e191e2a40aaed97bfe44420a1b0954480d8fd5db81aa31e003afc0c292984250ed599b2df105124eb7afef43045f617c544424b07f241d151509992b6f19c09479a5c92185165bc595bc5a2e02b72bdec2eaa386667911b5a54d2c1f9e75886ecda5cc1a5af1ff3203c863f98a20f342da55da62b01ebdc48c93d3cc5b72171df8fcb62b4bcdd533d90d493b07ad2428261984a075387f702adea3ff1446183ca1bd706d870f82d6fdb22c8ef905a7cf0d34ff57570eb262cfa2e6255c331b4028c215f1eef3de545e069eca52d5a3725b57091296aae4b1ffc87987b28b2e591d4717015e6319c4182193e4269ec515993a83aba7c21b935190e56dcbe33aec6d6b501384c590fd7524464c370043c2becd636f574dc18d26ae1c27909b428be71190859d94ba77d6d64151825280178286b0fefe7f6a5cd8af505d0ba29c05bea2556acb0fde62878136fbd99d26e290816ca8afa03477d6be4b0eb4112c5bb7dfdcf962828bee15ebce9ad9bd001771241604289db16074947eaa6201a308eeacb2bbb75360e4ce80c32a2d0de4028c00d3a9ac8af175a42bf564b87579c1cb37f065751b9e53e067a70683c34e02bb34b95736acf6b31605654b86810ee64512a751d395159f52bf1905d156b3ab709f68b94b976cdc737eb6d96d47b816e91230cc51ac78f7de223c70364cc2214a043d4fb9349d26e94309540078b1f1472bbae0e84893f523c31440cda29c352a067983868b1cc4935c0981a7674a89c48fd3daf4524b300b9956e54e9359ca7016a9f6c29b1fedbc99ede995b41617240a0c9ab53a72b7996533f3584d3e2c6a0011346173ec65ec01b23578c0c358c0fc7af9173b081689c5930ee4b510967c602eaa2fbc28f56e66a41854363cad7b2ae0984cfec4fbeb4e96e5d559956ffa7fb02cc8991dc870b08bb8606ad9455950e9406c6b592f9d210950fe58fdb8ac101cff9f60f0b60fdcdebbb473122ef8730552e1479f462dad68a993a7dd1981b21634bbcbe9294d41493c87ffe26c1344572f38ff84900666250402bbe0fc1e86ef30d48521463e973a42085da45dd18ed0c3d59a56446cfe06fb8d63941d79a62f20715800baacf3fb40c769d0a7f0c290dff1764538a7e37f65a996939fba1d841ba9b90abfcc65e757b9488d38f884421da665881021f1c4365f1291e56ef5ec76eeab0d204c54835f82642a13fde36fbb80ebecfe4c8eebb56b13906ed4dd22829b48a0f530b6824a262be77b9171bd08d8c7154f5c0e90fa4691d8fa696a7835020c1841c5d549679d3473b4f07d3774390e8fca31f8c8f30c524a5eff708ec4e0f53b3ac9da378119046f14693918ff3499cbea0e0ffa0d6dcc21857c905c558d5039e1d0505fc174d2faeed90a3d1a24a80c6b50919e7f5af72841c03bd895ea3ec4c84fe85075c307e239f915c38262b98d49612ac3aa4ed0f464480ad3789251b2131012e1bea8efce99b60d8bae984ecd3f6696a61a0541d275d643390998aca62a9789c04de27e5644fe52182ca337614e3961df5ede92c65cbf8a5c6c0cf4045c229310dbfe9ef8a3a42fa34abc7a606e7e69466f8486615ef139d4e257caf13eaf634f6188bd04c037736ea6a7bf783463a23f40802f43bde08c80528aa6422f4b869541100a3ad677c41d28185c86cc4c3b509dc01dd1581a1f09635c547ff7b3bf792cefe3d3104040fea7302438492345dde3ec9cb916a01891323a9c34f5b38ceabe47c1919752dc444711de5670f702142570227e161541c4d1a900e32fc6b09b4e1cf4082e676647ecf0404c70c575bb90384078b340a4f4ae76c5c1ba1088bd518c4fc14d8c32e0cbc65c0a2cee3fc6edd5ccf2228f93a93cd622082c2cd4ee614776d45c67021e28ee6ec77e8c437f85d923ec6375a8d3d1500eaa5d465d08b9eee0ce59b9191dee77e77c37695a57a546d13b9ccf42bc8fc5bbcd2f70952921c20694411858e0225ea94d7d86d48e046833cd401b72ce94a4415233dba5b983e06a662b69f21624abc613d80398ac2177667f56489b48fb45e93c95636dc8c465aab680f040ab0c773e10e05cb129703c1000b5fc0dfc4f32ba4be3d9c738a9d6a4086c0706ffc4d1ec08bb5f9fa7df24a84a3924857410f2cd3e9186b42a0010fc0545b644de56e9ba2f209d9b6f95b8eacddebc8e2dafc10acec466e455d186e27443134b6e27f591f096de8bf365756a7eb12743c33ef03531a8e950b450dbd170524385d6d2ac9469357be0fce6a3401f647c3dbe8e8343f13000f3b624ed16f704855cf53804dc2af0fe7210abd5319f1f6558d5ff40a4323601c95ad2661046d2ec327f660e6b69aedff825b90b6ab01f5354e03d653ebea6270688e20095c6492fb5ebb6268851e95f27e167b77b19797ddaca6518d7283ad3e5eaab8ca880cedc37f667688085d4a29c1d791e002d983b3c31a87ef5229d3083ded95ead402b78f716989e315619b641f11203eb49b1a451b00701383e382e080c84d2c675be7eaf48452879f88d7516ca04baf1d5fa54d610f9798cc7928de56bfaf705389d6ce4438a16b7848ebb9f6ab418369c51f72f5bc16e926628666dc63148df66686deaa9d45aa2f36e54f14538ce105ab35ac04c44567be15387643ff0fdb6cae0ce9c3a85ec15cbe485e0b4e96cb12de946be7319c3527b8cecc58fc1a92e687ca66005e87e91fa5622e978abf8f508316a6ca220445901048167d8e7bedf98347600101d1c120506002028eb1750ab4c2be3473d6e4d0aae7c2cef6f8577a200bb1e6554b26de6e965c2594d76ed3167b341c0c49b48946902a4d808b82e1a36af0594909891cec57a4486581e37c04c89daa2181de7104f1c8308604ddd1e029b747f9b7af0f228b8690cfc0c9b68c5a34fa7c4d078dd5577bdd7bf443d9cca7823fc1635b5c0fae65b621276768c030c35d9d073613591d5a7916ecf5af7cdc0897fb68432d9e93f25ed5318b86a6a0da8e4126a42a011be885f0bf5df2071412bfecef2b8cbdfa90bb7e2ae8702e85bfff1e732bf541dd2cde0f5e39f498b65be3b83933cd624465b722a4e52e3038d4efe310be15d4735ed0570be421de546880fff9d502ea49ddb98dec4eafee9c93fb1bfc77461fdc35fb034092401cf74a125015b6f09e52eed0138c4ecd49ee64380515da49957512dad8ee044eef060b7b1debc48358e596e49f3f82fb38179e4d3fb25cd99af884caab2f6764613ef18030df31784ceab1bb40e9382f4aa696f334f908a370ddc14b70d316e9ae93f82b81b2e66a5742bca027acc94c7f1290aaea9130b9ee841123dcfcf6abbe94fc70621c8af7e09ad8b3cd3258f3621e1622fbd99c661a8431754dd49f7dd1bcc8a40c81628f2c0df6e23fb897841dbc7b82c2ab877739ad4e43f7466a987c20c4a4bf0e286fd1a34c02194c46280ef30eace9cbc62dbb1c21be78599d20979a5d8a4ecb31b5e8125031da50d8b3e645fa062639bd1ba340b2e22fcf06ba4bb2c58424ded7fd7c35068966bc859fe48fbf1c2e770cb89de049fc393e913a487a0c228c6c66f564f60d4c248247a51912a1b023ee9e92d43b3900ace1e1ae30201bdc4f59a8bbe512220a65cab16b6e952e0f98c7750bec33a11b96bb3eab5b03b4e03f338748eb3482e665a6648a6349291d068c522be61da3689a75749551c5c9e82aca10e62b8f05bc3e2882d4a30edb55d8f1b3ffa6f2d10d26f52b9a38e590aaa0115e0992e3406e09270f03a3093b26d5a9feada1e7aabeeccf8fb128be603fd7313c5e9754fd074a6e533d6033b62625ab2cbe7f47642cc719654b3b96f7aef73402b1241399e6f87b63dd6fdad57aa28caa1fc35dc11d0f6abf552a2a6a12b9739d226eb8029cf4a6b57114104a492ad170fa75e807f24c175ecd20a31a3205e51248fbbf7907e1887f013634fc21fb051d6036cf8f6dc220ed39e8d3056beed5f593fa00357b9c17327d14c480683390b57888e0aef319fa56805642d9c58965676340629f1729becedb473059650264b1bf2d6e595e7eda059f595a7edef8792c9e5210ab5322f509ecc5037e759e8242496f119a56d6d7a6b28985d7c10e23dbbbf127227460fc439cd8e9c30874c80c2a1951c1a15259f12644173088300c6b80d8b840cf6bee1f2e0f98414674ee7f323538b29a5f10736aa39743978479579f40c5ef5832fa211e315415578162ec1cfcfc0ae524fbe754e3c15c56adcd7e1d1dcd0cef8b9b7f1278f56762068242138372c5edd1f883f9ec903a12333966a5c71f6293623f7a63648e5e3d7924569765104b58374ad2c2654158b1e94c3ee075fe40b20c52c3da7450fa7a3bbd2830652121f56299af10a5739b87328886e26d810334f30481695bdfdd04650eb668628b8a487a6f045d423a90ad6fbd112059bc812c9791f9c4cdc9d68cbb791b19af03cdb7756b30e9a0d7041b58e091507df2eb039052d947011eab0a72046e9c55bc1a45f708633ce5b5cac508e2018c9a512fd48891f21888094e6ad3ab2bc8cb4ae8c804e0ce9ffcd5004872d3045cce3680e2f676912562a57f6260778ff8100ed544454f6b672e27f5aa0505ba5a648c61c13eb16579c76fa986fd82e6cd63cdfa1606b17d2004f643ae1b0fe0b13f3eac65dfe906376bb02b7e11c17438ca458b01733af6915ee5b8690fcaff7c0af759dd167b599dfc6cf9aabbca6cdcace2a94deebbdfca5c11e917e64cf961cc8c29168c410eca9f3f24fe23cacf51cf6c8317f69c2601b90ca761b92f3e2c063f5df41f9390af587acb014f8a19714c8de40dc0b234c71b2c5a5b8382c0cd9cdd1fc6e1690d48cfbbd17d60e0f325ae3feab4f9b7ac016bad58e96687a308263be84c924c03d663617ef8b2f88ce62381935dbf9a5b275a3ccebc298080083cff471d819e23713fe105c30c203e9ff99ae052fdac47aa6ec924e5a53831a5fdce3251ee85824284e0b1f45676e5cca603a45405eb98fc64f4bf8003d736e869ccd99c66fb4f4b4ef1387e0a145d81eeb6acd91d7ef274b60470a04a32d43fe53f98c2475149ebb0a425a3e87d8a16d664e5073abd6ba43d7748f54757d592b8c4f857b51f9d692a5a1b4620da0d95a48ee1b2626b75cacdb17a34264f91aecdaf6ea5e1a2a381a92af3546c204fac86a40a2f01f606264f4067a902c4261e1af98007c2c46e3148784b0bcd7ec6176197d64b76e104d7236eb577cb88ff4a3f6530b4bd8583a5d100cd02db88c64b6f5a2a456284cd022cfcd2981e8c889eb54464ef1650c1b0ea803974e05d727bc01723ec65d5dbd2c64195bc2f02acfb62165ef97ebcca9295ff6a31bfb96ed8b9c43e70b0e29d3925d43d6d07c1d058398c570da909dd23be25bb2c02c1b9a7f1885a5d0f7bb13317c76a772e698369948411a38a4a8161d0dd8be8eefdb6314702ff4ca8ef02da3500cf1b399dd291d086f008708614a1a5dde41ed364206e13f15fb00e54e5e4fdd7580e5bb09b507c542b09e2f46a82d558e6c640df3164e51d9aac1864cc9b982d6c8057ae2d6fcc31ff22533ccbb95a2df33566e071a306158dc01efd77ca1ff1a7b661af5d15330f2ed55efb73d8008efe6dbea3c03743cf21e8f5a6b0828900370badcd8df6e51610c725378646c5fc300e886b22104343ea1de191b41a05796c850e3b59c32983dd6feabbff874253292c6e464e00442ee1586b0b9452002650b7e147c55ea8aa6ca6129ef227f7b6d7c13442e7b01f48d98c47870328d9f961d9bf49911861d935cb18ce5246b04e0f3058d33e46a9f28d6e156dd62b5c633440c8221d71a5c12bf5b6104acea94e69955e2119ddf65b9fc2ad3d5a0524ec4fd765ec97cb9003135ce31d674d239b0a16a59b8021dd91aa215589618ed0b2e3fe62c57f42d1ed600707b5b764abf009daf8ed9d54d458a4b7d91f51a8961229a4ac01d6cecc9d9c1e0125eec0f2ccd9bc400e3a6640a1683e8596760ae73bcd9469bcef912c2109f0675eca2438a8313e7d4c06e087d1f8a07d8f50fdb963142c75e43d59801921701004f08b3ebee574a90c92066232a037b9fdd097e325f300b6f1d6793961180ca73dc58d9d5654cee84d62027f215736c2462d8e8694ac8039633419c563e7e0eddff8c591c5bec7f5e34d809d010301a55c65272a1d50418c7ed0edd1886e49b62e8e0363bbc8fecbc987fd5bbe31d1805251d88514cdfbf7d1a113504bf64133bbd776d5af1fc3e7785ba58d4334fa0033e20b4ac56974ea8b35bb11b8de12a3f2af067742f0774b2cc99645e6e3ff048887514dae88af3aac78f2257a5c627134c40a14aa10f42c8183d01075a6e60ab94012e58a7164ef0d714ad96b27d0395a7d9df22af6c02461e475fb1c03aca0e515831ce2164b70877ea4f359036289e1c257963aa827eeafd8f1a184f3dbec109f7728a9f03fba01846a9d7121c5bf6957a00a3c95e2e3effc5cc96c214450a383cc00eebde608a37f6e52c53802b6820b1208622bb870204332df8cb425c0230bd3faa6792f514462c0554c96b39301f7bc884c07d0b2b0ded407a6dc6829202e89904385e4a6c2d0bf3550ddf5007e5d4a18311882362ac5792cbf12b0ebc6aa7a358f5b18a72cf9821d7f804ca206bc804a0ae734bc86573c67e1df8b8e5f119274766ce6e6ef295af6706876065bf6b7535256444c58445f70e80901587d9b333a6f9dbf1440173af9e1632565ad9bea741eff3896e64f17d73427b24bcdecc50b80fe31ba345c84fbc7b3d82722a46070faec51879c1e5fd0b854eea3e09e2c0bdb009a06b7d5188c9aa1f904185bb3bf1fe192b7eef5ef7791c7c081d986b0304e3f9d3fd173af2d3bc06736aa03f50ba787f0d497509a0cd7a16629853dc84a8c852cb0c9b1cd72112120e5ac57f339af7448fdfd003dd04ecbefb19fddf55778b869d191581182c84da051f55169196193cd91a6dfa028b2e6411c7309141222c2d61947e5c5230cd69df1391f3312bac67045c1adfa0caa9022f5cab051d5302e36541083110d2abd78e7e1abb6222e1d488dd89a20e75a1112c001c4fc9f8747afa88516463aa48bfbe606a219dc30cef0af2f8d90fbed0344806558cba64997210f779e9e45f2b080c3499416fbb3eac1a978318ed9f4fd34c6fc764a689177105047697acf52d93e8472a3190c6798901b36dadae0864eed48165ce57765d61272031a229d6605be903e38b3ab044730ca7f0bf28c182cb4d892ecfeba20ee72dd13d7bcefcf92a053ca91ffaf301a486ad92fb396cbdebfb3920864116a41a1d9dd27f5ebb53e4dc6a6fb4d656a6f4678b7197132046141040add4b2a135c027da490c22ce2ef5fef5d569ab94275f00b9be8a1055fd0055a19870788f1f37e61e9bc24c8b4f1852ec1a2c3e622a73ac3aa7fe57c0d2ae1bf372047d1dde0b6e46069d71113e34824b9bfd6d7206d706b0df6b389a17441954b45665bad78ec6e24a5d222daa406158ee49db4f3d964f8d7d908a132a805b65b5439f62f2a679c764b7260c2eaecec3a35019a0ad9fa4b35be9dd113fbd9e3858ea8f243c038bf283856a14642f6cba12abd3b9c7df3843e148522d2a5906b93e035ffadf996bdf6c648c45c84aafbada85302d3053b4c9ad653a57490ae578358f6bbea9901146417586e9a11e57cf050a4d574fe8087db4b98035aa6e4c84c416f19832c0737f5578829dfc64c38ce32768adb9c81cc655ac1d12e19d0d696da098f8cc2d10c66a7fb8b7004e71f91376f2f35230988784b8e911eba83ee469078ba79d1cd8097e472ecc0d5f233bb558e6dcb17509010f71c225cab060d5991004bad2014e0ff4eacae4337dc325acb80e63e9c5963b7ad6e52012ef07748b21b7b5be9eb79dc97fd8820c848c8ded194317ba556b9b58e364ef82b6986629f56d4ff65aae25e90e94271f0825996302c5cf2833cb825895c97431e5f417a483b8e7f3a61c3fabec64f8b0688be30a1588d2a337a16eca94e4228e6c5e608586cf6dd13345b408b2650a62073ea6e3038a6e0aece2bf6800513041f4073de9d53888969ae66142d5dfb7e2f0ad8a99607f2deb46db4a1dce01b311608e7562587d1adb9a1e9fcb326025410c629e0aa2148a5863d6a9c76b353c67c43ecb158ff0efaf596570614edba03f98e9f55c31daf8a7f4d8200defa06055e14337a8db6af16049fdd257aba5f76c54556489ad91466f800751c79af635c37aefd3e665d57c830805428f0ecf2fdb2caaaf55e2d8ccb7f96219c2fd5306d931771d8e206a761300e50a937782372767f7edff86c5adea81bb92b8128cd17c23313bca0dc00db8bae083496e215a0de67582f6f20ceb75dac2bb4afd98f2a6cf9dd780eebcd6fcb66203bacfc293944cf93aa72441c23df722f07c07161bebe940464f8a8fbe6f9e3cea2cc834b7c30236d3bd6db17479b14bf63b8442aba68ac1e2573b79536e6155aedfb17b82417273558261b97f9bbaa2a80ea96273f1e8df597d91df824ace3452377c5b96a48bc8b434e838d2d95ec218a35799e81833c067de69ac2836a0f57cb37dc07396ae0bebd0abbb1072bd0fb0a2c30b2d9155b304754b175cd6d94cb4b44758ebaa38dc8aaa5957a9dd012aabf7620fc425d05a30979ef357253b1227b89569b685eac691d45aea740f30701b341b51869572430f1a1c70df06150df65eacc14a1df08d446bd51ba730056b143b086031a500a2a0129211b4f45fc11b311d37b0d9e273fb6b3dbd0f0cea5d13b3a67e5856a51af7835de2fa32904366fad847229dd4af2a72d3ec12cef9e301d8ea34b18c6531867e4127fcacfe419240b427c662b6fbbf0a7b969abd2fe6484fd6da591b8e03cbe21dfae0809d6de5b0418966ea510503b8f3f3599050b6dd7e11924f429dc69b2d1f82d9305a7401e716fbfd53f8d51b0b7fd5f3ec53eb0fe8b76062ed9260a740626f8ccd3cbeb38d646dee589075d039ef7208f83e3373bcec38b05820c05fff0b681ef98a384bfb1b933198f2df981e8445729247cfe186dfc7c756683914e5df31296b162623309c2f86db977e1acb8904f8ef9e3f3665826c1c2ddb5c3411f8424d040afc982042b8845f734d2a7c0bebf0f0da25684e54bcaf4062271a080c3a9b81f601378c9ab74a3a22d8b902256efa8c48c3ad3dfdb295c5fbecf286eab755cb8be7f5205ec61f17bebf8464f817713224da978b44f8dcb9a7cf720626b2a47aa3360b91d712477ed3c61220e6029802a904ef16cba696206f455781a71bb73f0127bbd002670c9ccf1f132ce0a32be28fec58d7418c1f3c5b4b0681c3b73fca26077a88939f4960ee07721f1859e33f9b8b2191022883e724494588741e2fb858c1c823b34c20c2b1b96c609cb396d4ef7891870ac572c5d5c60e60f6709bd613e3809764109305f01adae46105e533602452572f8690f09e8ae449ceaa82386c90d62c22c5236a31aa3589c6ac38f864238ab0bee3a86dfd674db6281557a9e034975d3da35976d6a3a42cd87494821d9dd5ca0cec2753d1a45f6f2dbae438fd077500bd3268389c57793af96d834854b5f02124dca720def1c66d285c63d316ac4bd482bc492147c60720ca0de0c1f5bc4608679e1226a1150a717a45c66468b04714ef17f88ad968169a43c80d6c7cfb8f50dde222eb957e7ddfe5ab517e8d17bc5aa3426097ab67ad2b6cb2d5a56e70494673a465868277ba7d2d3f5654d180fbb6cf727fdadb85260e3383e183ab0db365dd8b661a2189df0a9f93c0fba98640f5699859212933ede180d2056bf8fde789aa1317020d220b5236fb351112c838d25f3bbc054a197e76e4addd2b0edaaa3ba1eae32a39aab52c1a40d04f85e281a69e5f24502deabc3862b004d6ef22c6ef0e97bc0b7d3abccec9f40517bcc06cce9e5e83ca14229120ba21b1e4672f6a60b53543adb6013fd60c89de7bf59622350b5e054260ba5eaf461269d222dbcdbb3b3b1ed46269929396bae63a0ed98db64a35791f5a307c308b242182d1f881335e7470f24145446a9d71065a02759047d439e714783dba45693f8f9de0e490b834bf861c68d9fea284f4cb9c523efe3f9393591e25ec9cfec12f8f37bc8e42dc3664678941ad2768c73927711dea2f42af9256617bd527f339c68c3f95bef715b442c3eef239e07525cc8e68d2590e6d4386b111b42ac60507b9c4048633a390c89ddd42feb4995b8bcc71d27acd4d4452d071d5f1a7327f51b86b8b0a747f1b46faf80789b81f4c323f67256603040095a34d6477f47a17098d4661829be1be804e3d69e95fd3a0a3fdc4457c76de7908b73dfcbd24cb5cf69041be019449a573b5d6a972b1dfaf351e4c20224e70323cde8986d509413cec84b017c7f3de1349a6b78da62b5389060f37d5aa4165bd11c7f6238de1c0c08deb6c760e108897a9e5a53f281e8863d1c4758dc0a15f3e3e927cafb6f5bdcafa920bb86924c119c44e1a482208278e222140bac402068280953cef01e60838b1da8898112ff941a4969c496309ccb300fcdc7ed72457a131f67886587344b15e2c0b8753faf395b432ac1bc82af3a2e0967c250532f0858fb4f6bba4479952b1795a2164a78fa9e3aec4203aa5131281faec613b4489109bfb9d1a6ae516af4f11953d65f3b1bc15f2d66a46ed473caa07e321e697b06483957a0f1aad5dee791b005fc57580cb4b4c0872f597d7d7b5ebe53b9c34983eacd97a18f83cfc5697f8f9d01fc280f2af023efbb1a795135a1fac6d66ae10285bfe7efa17d4911fa650b088dc6e393340ec6cbf9879649c27f59733638e4c1d260fdf808ec9762254e6cb8b66e2694933db23a8052f11526c75083f212ce0b63831f5ffd93acb91f9716d042706c4d6ce06350b72b341cfe54fb30721a97e5a2e203edbeaddc482a634efade976873fe04b93679877fa4e17e1ea812930c4a755365466517cd649e53f9c7dc99406f9687c1620636971419c85cc37539c80823c9c4472e50a7c5e95ec1bd725c02bc768d31154bd70da3b2e7447ae8b438c6387d772904551fb9ec94b8b4ff52c3d9403a6421f946e10197a016be6e401c531497ad9ac3317465d6dc5f676bdecf28a67b05380d5205f05dfcf1ea6bd031f704d3819bb332e8a57cf1d74d66c82470db235f66f96483ee3b6f80b4e6ec1709f26c59aebb28d54b757a3b5e7d4b4ac6f53f596c6d9f0deb1f2ef343311bbeaed4320f22837114d58880d05b250203abbda419731584f001d30e633aa6f8395c04e1597162a0c3ea572e58c5b423eac970b180fa25b770b9380c120bb37e7968ad5da8fb6a58bbe1ec88f368a628a8cee426274f5a20134d933d785697cb3b58859573addaaf3e0adbfe6d182c2aa56d8e52d0270c2b44813560bf3739ee468ebe74e1e8d910885dcc48504a661506fd7744fc0091f8f26d08893dc85b0fc8917e273f129350bc268ac897f1792c2752112c64d3f2c18b4e3fb38782c3354aa0b81689dd087d742895d23c98aa26727e61125f764f4b78d78a6a82c543ed5423d88e395c2ae7e279794d67a6159c0faa5017b0c4bc03d231d53cdfc3abe089dee5c4209fdcb93acd3c802bcda62170d47156adce77cdaec5b6801e07adfe56153b80325d3a37df6fef3bc623423daa63640d08dd15a8b7a2a4f4650951702fcb5307980ef1fa87d53d874931b0d4e7198907b9c0cd1fdf87a79111376184e88554b08143c091235197971cdce96407d2749fc271d286c752fa1981c2871cc049990f6eec5c51a657fcf4ee7862f578562df757d674f80edfa86a826d080405b1ee0246e60e978241a6db45ed6f59a90b82843820294e269e2ea0e6066345992c4a607641c1fb48eabf528b2cd2ed3897fe3be18992734cdf1a1b6a0497443bb6a7688f70e0b3220c5d0c73569e889976c70e0cfdd9111ab1829919d9b8a840e6435dcd7274238cb8689abdba6a0b6abde895655020f6f4d28f7edded0ceedb8d77c64b098026a210ab6a5261ee66b6d73a4369f8001ffcc67b25c6760fbd5a8bb3c4ad8f3f50b00a85ff61a8ec6e96ed2ca5aa537f9b115af98f82f46c15780f44a57409c69884bf8ddc48625c4376874eecaf928426e751d125a4db14af2737e227c98ba713f69909b2b46ff00cdd9c58e647d9b9e1762da520607e8b39baf9b707584ee277c55e51b8ea0e9cb039f2badc3b1acb230d6da22f8525f3054418711c66c69fcae312bc3808f098c17ed489c9861702ecbc2f9b9f4e48bea2914c8c158d1804b30df29af34522307832faf004ec720a0abcb5199a18ecb816e6fc5a14f5090a541d264cf9dfa83c31ead138ca5615b8b72d94b321feedefa56e8c9b4baa64c358a974f9af29134fd304b798243ceb3477b032f2c638f73260c9685623c57ac0b33c450821c78b6be2f9917ef5779b137c3a4e06c28f287d7645cce97c8891825c1d442cfc38af9b9b6e452c90a71f27b55388ff34a4f56b5c5c1cd69fbf19e7947e1aace7b60378e375ee65ddd702f986d9c24c19d1ad712026fe021b3e98b7254c64634364626b2ec625082138c9517441677e0568326eba12b939c04e473641e49c49eb2ecd72bc0cbfbe8aa3a11d91e2c32db1ab2d90dd16b001f8b4d9711d3f684124c6d9bc2a9dd885536613d295d11bc51ac7b2005a4d299a6952a903c06235b2f97dd6c4cb364d41e43bc3b445b4a2afd81b86b222729418a62806ee42af7b877b67f9a1b17ce61f9bc907f2be311b7d74f70f300b4ad76f08480d3b6aca0b48ca68a57a3930f54f438fd046ea82fbda6c6cc76a87ae52a03f006b2b75b0b6f4a832e53d496455c3a42dfa667a8d380a72e8a451812f4964b21b1a67afc228554a8488757a01523d59048a5e4a8b1ee4ef13a45aa4c98dc39ed77642bf094d45c41e83919ef5b28eb06e99e8cf76066173d4b6cf7fe5662d18a8afe4c1c26dea11e79857135d25878abc0a02ec408a62eda2d7a6f861226c9a99b3daaefb4fa3cd07b9199609fb27c0d1af0810bb335c28dda91425542db993dffb7e127725c5002cd793f33197fb82800a076178913b54359a44cf5328e149cde8c1576b83544eaabf341deb45f394da6230e0862a1c7c6c10bdc66358771b5a144dd2db223b595f8cc32bc79225034fc05dbaec1302904c7291091ea791793e7adb41ee4b22564198445745750b274751cfa052e18f550c0b4a60645c6cc6eb748a4836e3e75153787496ff230f6b5fc9abcca6a19ca4288c1185fd1f27988a21f8d1784b0766304d2da89be3781df4b8807fd735387a4299674a0c2e6e005fb953b5ff8b1f6715fe9c71404a246f1cb0f06e96c8897f271a17556c7ba0896568590e2aa41638317bedd969febc50112bfdff8744e43475d6974bdc6118a322f69fdd07493254c9fcb47dc2cf87d89a7cbb65e2d2399dab7667174d7fb21e427b39614e2963155f18b22ebd8ae875c2dcbd8e864b903c13a8d7d9e1fbe7b46df27820759b844fd5bf47cc3a5fe53d3d48a2cb344217916ece7e6c00cb847ed9918a887c5373da3ca224341025ebc9437b903de8bd84d977493f3125774bb0fc9f6fc94e7a4af7397f97d60356babb2939032bef769694d79c291356d658ce5441a67ea118ccafba69a4c8e100d730389aacf46a6a49023bcdd9aef4aecf81a3a0b9144cbe9cf3cedf8d8b4040c3f6dae8e44a38c7acf6e0582b709f90fe38186b3d82ff56b800867b1fc4102bce2ad5ffb856725b82f08a7974f2ac14e52f75422834f1c589c6177166ac552fea5623afd8587d512973a993551454aee3e0ca01b7d9a2ddf44b0a6b563ae335946e1c485a2f149787a4c6e410586f57b1952f53c75be5d87123a0a733d3ae465651a508f172ed5a1768c1cdf1470cd7f1b61fc76c67daff94c3dd33a5de821f08b6d128fc6e72ce24821ea945366e05f0cef469c064ae33bf48912f1b03ff9ea20a5e7d0f2adfdd48d5de69812a8a921ac48f7ff90b832819e2c472c82aa584360633c32185fe92257eed0161b2f8ac8d836c7153f6a51957760b35a1d6d665b58e35a1006dcb37450e0a6bc425ddd4cdb281d5254f991c0a193ae1c1824191b8fc29133cf0f180cc62b2bfee3718f875f909792f7c51c2a228945b5413e15d5515e721576889f942c97657382c29e6bf201584929f4fbd60cb1dedebdc87952e8b516c069a701a15e0bbfed1af9517de5e85ddce3281d07dc20f2a0a65411ca6d54412d5763e3f8443e889a7aa49a831bbfc9c0e84fb1f04feec07c50031c2fe91e2fb02ce28261508e48fcd42027aa03d27da747b3de5f95f95ec1439262726c9fb27a676d70e0ecdb2472570b1e70a40f853569be95cc57bab0d7e57d7a6904c749dd7955cb55d35113aa481be3b98effc3d662f7a595dcbe57cc00cd7abb613a31829756462e2a971b99e8283556ad0469a981590da86f1e14e0c7fef61ea00ddaad8441bcd631e9f68c3ad1e420d59d24d184a3c5e0d1bc3f230a4d24fd4430a2907aebcf28322a0cd9cb368e53a3420f121362dfc4843b190fa026f56f9f006978e6913fe3afa1ee2641ecfd52cb0f1f5f1fa68517d9a4567e0958255c28787f6eb294cc01dde4a82c7c3ddd2934ebde822a2cb0c1d0343a7e4cdbc638a9345a78f9380a96af9ac1131c6d3544e4e734cd33d4e08fe77fbc32638b88b7a61359c79462b131b4a53dc3be738de25aef21dce548b2b462125d6e6e167c409bcfadb1dd3e8fd937017be40b0e2bd58312b13438d9aa92e10148bb1b496aa41d818446d48a688b4fb65947977f6fcb0d6a113a053bbb363a85da5dc6f5f91d54db2892d977f8c2c2e404ed0d403c8d607a6035e915164a5b5ef8bd462a04f24073f528649bab27510f61af5669bd98ac7a15b3d706e751f217e4f4582f9cac9e42a310c3688226076f761f5fbf102f2c9dbe30b573340401dc9edcdd2b3a9459a00021959d441cd1f59b53b2ee7bd62e8382351bbe8b5e3f95e9e282bebe9c48f34a24fe377ca46f559c754e46746ae5a2ec32367eaacf56ea9360b92b31a647542b99da86c3c8a6065c24e5f9d1cac23d41b8810bd2a2ec55f4a52ac3cbe8de1d94916d392497c31c0767828883f938c090f18db508274a4e80d206f0aba97f07f6aaa59b062bfb7c7f5f0f9d381ceb4b9e54103be29ffb4efcd43d6a076e91e7ae3bb79e2b1bc512ae0e54648327e0e3f47d347f5113aec681dfc71800d151773c3aed31c03e45d7f9a7917f144531fb726acec0fa583849fa8d7c36a39a7deb0c8c150884985f402e50b7b384555610150b7afbdda9d5a46c19e6e79ec9e14c835e9685bca997141c73f701cce9d94f4bccd5cfa7e1f25a0411ac7311b08a6e10ab633782e8fc2799debb0454b5adc5dd77ad97aabd3eff8cb373ccf8032ba461549508d74f7062aad45ac7e2012a07bc91ce41a253bfe2463de0e5ea2ef32186121aa3c65fea6c667c55304f776c621c0d99189ab5bd761deaaa021c011a6681084af1e61ffa6420b2a3ba73675505e7428138d47706aaa4b630e1fcde009daea0a84895a12bc1123826f9d69d0f3670778a0320039bc1ba93a43658d41139fd7f296b863e6a6ddf6f5ab75bfe707f1d97eea9fae733268e17e8f703400169994590c6f2da7d55b7a446c4a59e50c62dfac0670f261a87374b894b405cb3623370e0530aaae36982f31f57abf2c2f5de9f0fe8c5d2a226aba51ff0d13108b4f8c9d421ba9030d66aec6d88b0226974e219ccdf3617568483af6fb37485170b6e3977841048aa70bf493fd4a17eab2a20c7d41f4960e91a5af8d09ca7da9a34b62bf95fccb07353915d15cdbb238f53d6dc1b61b6c0ac853ce216c172183d971ebd9e90f19c7ed23efd3e642e95f8488bb55c8d4ec472bff9a8fa8accb8cc5a586990efb70f0b3445113479dd6fd517aa15e36de2204ff7c181ac898bd7129c17017d91cd8f8c57d01cb4ae8995f7043474a9e4fc1062d7f4e8d0d95cadc1a2f4f44999c02d962e8357981ced71fe64968fe72486563b6e1d070aa5f523abca9f9f99ac43fcafaa452c72684492e40ba4e8a2cb3abc21013b23508c34565318e4aada1cf6a645ae0906edf030b6b4936460942c603f5da29ca358473e7d08d0d53c1b5f059559cfae579bc3ada96ccf0fd56cb7a0b921e408d3afdecdd7cf36ea83ab805ede9c4cb1bd30ada118e2828899050829e0fa9afd306d53f0b6b42edb20014e80183d73f9f7d06c69950d436f8cb1be43a12a95a7b1abb94090d790875e92232cb213b516b36f3d9d4a7cbe67d55568fd095c70db0a52b2e0e18dff623b24735d002dad91ad0368e0f6f1b3d4fa3b2384056301a34e6406359f9d408e308c5b70a75db5f395b479ca2b001a2a5104a5f89c922cd4d4482539ddf20d589023bb0f07c70bd3405521b4a86b12036283a768defc7ec32b08a7e63c09cf4316cb6c9e242c56a207c422f4c97cbe0edbc2d3be4c7d3951567afad7bce6a7b8b1f85468f97d63e6fa833944dd5d8d31fd0c5ffe6af822ac9245432b75deeb6296058345f3a8ee36fe42aaef01edd48c541099e3182e76d1f19df1003f14eb997708dc25a42f46fa300ae10edbf73b45f748f002400f93de9fef9fe92c03b48e9e8bb41e92c868328c78eeb53e92908dd85596f04da1383a7b3e6194763d55187e3220780a7a20fd501b31e5cd32052925640135cde8219955aff51ea08c5973acba08816c681569be9120c785e0ed54b9659a071a036ea6b21ef874512193d0141863673402613c2b0ea3c6161312f0007c08161607bd97bc404ddc522b42abdc1a8af10abce2eaa93465d1ca1adaeaeb3535e269beec6977ae59c76d0dd5d5668c92444c02b1f48dc356ae6ac0c9891f597710e8940217ddda28f1d8c815af094c48194d96dec3f397a460e1358919defcbe6b6011f7e04670e96e5928a9e08d2aa04a8852c9ee8faf5dfa748b9b063d7013ed7c8c911b3d8f8da1f3a62a87b4dcb4da545ef17931d8beea0bfc86dcc99160aa56ecd047b54248b2f00ad85d38d7f693afee7fbfa2128d018f99937dce7094db93f6bf0eaafb4d736bb8cbf5b7fb84efb93150127f16a30b353a6a9c3d9273ed790d90ca5cbbea36d80555c025cfa488e25eba5ae7d5c566d8540dcad41c80be280a3def80daccb8be3958f4e144d8a52290017864e4d2fbbeadb30200f88fda044e0c7438d8fde36cc56dab54264ce91140c7cb7ca2835e28748aebdabff0f0c4ff606b69fec88aa00b5dfdc10be5c37db87e3ffe8c858207429d37d1650772c9e7acb15bdc46af3353219b0919c792334a74a3ad9fbfa646340a8961037ab4f5ad1879aedf735e6d092c6b778021529a342acf125a44047eb094a8066fc2803844994b947123c1d4548a7804a9a642a1b99636574b67531884f4068d3f3e84d795368fb21399462c01f79ed4c89f24c58755c8423fd8b821a96257874ce559d8bf92e8f00309587029872e9a0ab108f846a386c245dcd1892b5c3dfd9a86ff085478f350d12b4f9f11b0bcca23d26af3c53ffafc6120f653cc441d675ca61e6384a09a7b75b347b24409633e3bce09011330ca3e3e0a04728a926910a36e0ea91c9b7340c50e2347270ddc2a8da6b816507f0657d532678004a8fc4b13abb08d28a85596f293346d9d8a42a5a70f662fc9cb07a6703bdb242fa139c2d861a9575a8f6207a10f8eee1d6a0d832fcb39f65461e7e734be83f1795bad95d21646a99a9fc5f0bb32d672780c27fdd0bcdd9404d343a7526291ce4238dd835790efd1429da4bf874964572044e403430fa9161dba21f70f703e2f635fe0c77c846b517fd2203039cdcbbf8ad13c6f3af43af3a8c92fc144ad1b4f8bf6a71c1ce9a238d256277e93aac5a4c0521a150bbb01a873c8907479f28d820a51639650d9c6cec2d0885d7724955b670a346725a04e2fb3b33082e55c3191ed6f823abfe671ee28921d919c6a1eb5b11aa0ce8346d739ff81fdf452ae2d74dedecc6bd93c5d0b45f94d5cd1eb40b15ea3a2524197f3ebd198520ab466c97b0231fe8629a8c273399e17e7a23a7bf9b76c281555653a07f986c72bfde7636d4616592a953a79afd01f01286a30f83049e489b395903b0fec128f9f3a074d986f9a4764350f0bcd0e54c6a3cf8b29778b775fa95b50f0af0034e1ca4ed93c4d3206e7541a01c134c62291125625a940b12a8e308e2fab3962764a80735cfc823d0d08aab4728565565d1fc6a205fcdd42228492f1c3a6f17cb0f6b5f9ca0674a8c592f11fc6a98a249a52c1e8f548cc28fbb73bb6324c895f862b2565a60b31ca61cd461f52b523193e27c598477e46d043e87012314e7234649958b8d3ea9fae87ec089af840f1304e061b65736c7d8809075585dad0d3699a7904aa1a3a8cc510ef7d5331ab1aba16bbd2d94d080887f8ce7d5d42f4816d70ed637486f5d00e654ffe14d52c3081021a8cfedc416ba75d7d6b2bc7111729e2409f4a03602f510ad65b33ebea2e98a54988e063a851ae3f3c0ff43b8136206132793b4a3ae32ad5b60358ea4fd3fe03e4746a945183085c6127e3c0b7ae06fc6c0b4bda553f12c9538a0f9f0fb86925a00000393c60b2c3b410cd4532ec09b069c89a819f95ae60af26ec66cb619c502b69188ff2c7ac883445008b909a77b81f97c20e5027487020e1100223817a1ffc7ce380412c0151956c1884e72bf1dba0202a6b25e2f2ee1c876f2f0296bf6a8f790fda128c9ce581e5401caecb39b0605606d6680cb2c05b33e8069569f9150d0ec2f9defae1fd30af0dd01e4ca75f829c81d6a29080cc9667985b76bfbc799a2fb65ce1a43382a9a512bc0c4185d562977ded362468a8be1e9a3fcefaa1f6f33374fecf3ea3e4150b0dc108e5335ad6e317f426e4055dee4b0414ba9e6df0f73f270e3701fbe2031cdf2927723840115c8a08aa8f7072f303bd4bc6554edbb2cedbc12036ce2866200434117ae83a45e59526342d1ead13981147d1b91dea622ef50c8d1f378b005fc06d5ee210b61f92c6267e9cf46efc41b55d37b800f2a619c2c2bc255052399650e2a5a8b1f2818fef77d1ade04b052d45295a6b561d92455efc1981e3260cc568f25a496a164013bf83ab9ba1b17df021668be876f9b61a194cdb92a731269fff309ee834e8563d5ebcde36b8f801bc300c2c1140cbdc12fc28e978889f12dc25299acbd37b8fca11effa843e0b72cf0b0cd474e678844ac4a41aa39b4d6a0d4f43a0bc05c4034134e14ac7444bbd301677a2b10837d4e24cd467058d47aa21cfec762bdb72794a0a2bc0143b90596fb4a0ef9e67afccb35bec6c54f25aaf8d4edf6d2d1e73f3cc18eddc61cfc89ba29bcd1f5aaaaae0952e79f042a58ad68628d515d2a6ed0e9b10e5a42736b3172dad43e4659fcdffe275750c9be96506a066e6d1d839c255446991457248e3597dda864b4f00176959fc0f3a7c6f1bcc672f2b0ccd4a5ccd46ecdb3b9a63a05a85beff49e8f88e98d3890349f92207d338e1337b34472e09a0b098cb43c9c9a034882dd34d893a364f65131a07a2f5da74f592834db75a9b3066030ec30f5f28ce8bf08af571ff4c47e8af12c6196c85b0975f88a3f089143e835b7a1879ec3443460d62b2b60915b88ba0791c6475388f47c398d026d3ab1ee8dce226203e9fb13820fec0fcb9b34f82e16e60a8efc192e0c381a1417306bce978eb8d05e958931c9aa533e8d0116f32e0cbe982b0e6fff77e19ed904fd2ecede624924e8bff0545de88763d4decadb6b07dd6115e9d402b999da3ce19a66317c02215914d15bd016d5cc13e674c27a7d0e2221cbbbccb0092031b42d52749212c297ecf6c4ee983f48ec0756a318aa168b934838d3c3324a0d2498ba3206a7cf8fe2dd13a9a5c29cff5c905caa9469760c80739a75f67f28cd02299e57f46b8623484cb00cbf6859a4298e5117f1cc41a61d1943199dbdeeeef45040870d5d3aa48763433f2370b0cd2a52c4bcf9440c55f3492e2e65f3914b0b380a655cdcd48d49608c64d981a47de3933385535bff5952d9376b4287d3ead35b307663c79d71bb4c007e68fa298c080ae047064b2f636c189278a4bb97784de29675ad1d8042baa85a23f810b601dab69161cf493108bcf7f6a1f67c397db571cdd169caec777dcdda34abfabf6ea70beacb82593c7f680a58f8a09e988f845616d2a7ea2a15bb166d04c1d32ded1ddc3be2562f6c252a7e49de157a2482a4ae92715ea1461a3a0159a990fcb344c37ff81bb0998100252ed801d8b98b067d53d11801145e7a6300e104ebe01405445f37ffe7856b66ce4ca3ef3838e0d6439df1a4e86fe767fd16fdceaa0d20c74fe91f3bcbfe7078fb3cbc7a67e61b6ebc8044cbe1a72fe2f7015aa71bc464cc078b630038a555d985dd73c2ad80e4ca6bd372829564690c857f14f3671d7f4737d7ff5367ec68198a1569f563859f5c60b7443980cc1eca7e4a0419a6ac875bfc598fb890cedf31f430ceb416d344b7eb007ce3eb9c8483faa824c7313b84269850ce88471b05838889064ca57c31ac480678f38f3d94c14718995aed836bbb72986dad40dfe4a65a24f2da03fc25042a6157a95a30d815271df1a9248c74b1cddde5f6e2a8e6ba65edffe82edb4892c5790a2d1d4de854167a7c90fa12714c2f6e57e904a07904ec884081213bc56c66429fcb8f0660d4baf7a451d822a6ced5476bdbdbb61142c82664ef2df70e5c0acb0a680aa44ffa19defe76eeb3fb7cd3cc96d0e74806897e589f475bd55a0e5b49cdfda846f490ca54327d6693e964f2ccd8fc99407307fcdc79d6a51e587b2f0af583e092252c968c138aa9a43de5db8ef2713f7db7441a556b62cd1699b3c3c3e289f9c9c0cf8f063210f343b2dcb5d7dc6f246b4ddb4d1876bf1dc65dfb4c4bebbad6b49efd997ebfd2533ab47387d96e4f43ae3b636283b4414afaf6c990be5dfbec35d35fdc4d18a6530fb3e75ef1ebbe8461a4dfbfb4f697d52c69c3dcc8eb42a6c8403991647cf6299ff6d3c71de5db6efabc97beeea34f74d2177a0cc5560aa9a5b4565219625c99819f1f0dc4fc34bd01249555faa6efe354865da67b718a9e647fffb2bfa7bfda4918b65d3b8cbbb5daed8772ed3bddf4dd8f3e12d54894462f5c6bb3c3eeed33fcd27ec23052ab6297e95dabb3528652ae7b9209d7d488ec4b58dbba90e53c91e88b2dda212d405ba347b38436cbd60c3404a1826290cc913b4a3eee337cde515fe8299fe9324a285f8a9e4895862fb65264a0f0f8087991a0eb22080a1a81b5f7a2503f088a404890b5f7a2503f08364a173af71a138a0a78b225148e3bd1c87daca9924028b3e2ca7cc7a23964b1240e6d3343160d59b8b39ee4b8d039cf74ef332d1b02b283cc7d1b727517322513e9d3208c865d349443287353dcce618ca57470efbec3fbe931e442691f289b18f787931a55ca956a94777fa1bc8b13e58d5f29efde694ff94ccbce16946b32a77be7beee9c0e1947f94bc651304cc71ed65d068ed3e217ca5330eca461da9dfbabe3ba9317fa4ab8a686f49ad125cd0dce4e689433495f6c09098a693d1283a7eba2eb64b4b16449cc85424ae1b6a3bed3657cde51bed2492926ce76295f6c914cae26ae26381abfcc0cfcfc6820b6b5f7a2502c6bea80f47bbbf79a93c52e53d7e1549f8ba6eddd5fdbbbf73b0cd3e14aef7e3acc2bbdf3be9d708aceacab190f8943dba474a4fcf457ca4f18a6d387999ef23a1d05c34a3fe118327dde4b5fca9aeea55ea5772fa5ec7778377d47f7d2a7c384e3f44a385aef761f8de109f974fd1095b1d8be96acb985bc6ca150e157dc0cdfe9a8cfbb8c0fe5a42fe5a510377a7767f8620bf5c5968c2fb648251cb345e6ecc470cc98a99a583af9f991959be2ce4cc167e0e74703ac19ca40cccf9c2d76ce392de5b6a3fcf49a947bdc86537d199f69e9b8489f993bbdfbebd47da615aeae1637660ec498e832f37c8fe862f366a79d38b4f1a7a35e8ee8d29fa7400c65202dba0615dcd3bd7337dd3ee52a1db61da58461a5a7749d0cda60eb64f8e55d0686a5600fc350f009cbe86497b1291ddcb7bf381c67865fa6973009d7d4dcd7885ee39d7bcde8db4bd36efbbad0c813dd98fb0394f568c86b8484db970fa515794e94cf3fe5d38ef2653f7ddb475fe9a42f65ea2ef26228555b285f6c9dbed81a7db165127db1d5c5cc16a984c7496318895df49d8c19dcf0ae061257240e3102c547d9f203b78a2bb3f10f6cc59597178016ae7c877e48d5f3105ba45b207ddaa7407888ad9a1aeddb6bb297de3855b18bf498ede767ccb46444bf9f8f3ab4dbbf2c86e9347e6537615809cb88601b96d191317dbbf6995608e6a923633ae9abd922c2291da56f4ff545b7f6a2dbcf6f2f7dbbd9e7bbd297ea974ebae84be9289df454e35709c716e9a2df7b114e354eed4891020f4ee06447e9262ca3f312bd84613a2f7bd161dab7ef109d034a20e1890b68685a220ccb6e2c7d243cfa745ca2675f4ad3b62f25c23535a1d774afd9aebdc67b0df71afbecb1b5512153356f3fee9345640ecd4d6cd9d8ca7e4cd5fca4204933b33922ba947cb8a23126ad953597559248b0649784e879a29914095aafb821cbdec8228d43959c9a9996906575958078c3ccf017a03daedce0862c1edd129b7559837af2451799c562b1589946a94a5c913ff97451e5345d4e1f0e47e8014fab93dee9935538a20a39ad6e7a13264f70c3049ed6e91fac04318b214a5a76dac027a8a5332f714a0753e9a6cf64d267f2fd4c1e7d268b3e93439fc9de6772f799cc7d266f9fc9f63359fb4cce3e93eb676025c88410d43abd0434c2a0a48582f279b1c13b1285bc8edbec923caf61f19dbea6b1a2a06058095a51a54b5d81e8ec0c51d5f79ec3b3c4a851176eec398305573ec7c7160c4fcc22c9933c9fa387667122cf4320bac4aca5663847573c4fb36f2f8e9117aeec9f79d3459530fee40cdbd0d4e8a4224a33d1a45f77c9bd7bd7494f7bd7c54945b4a3d402cf3ad194807dbdf172afe86691cda2edf6bbdb760f257a2612fde2f08a3ec2212a775ff82cbf98c3d71cb877b7a11ba125fab65f9fbd5a955dc3ae2de85a8c03bf3498612737ac91b3d7a89fcc3294837db5e1fd667827d477950f9c1bee8752da2c6fb3c84c4a8baff59e33cfc69ca2077308e62035d71f2f097349ccfdb03f06c495c9720016b0c1d9ad7883767b613030080c0b813568823c4f6337bc12e8e6d44bbbbdc5b058869686532e6d66a69544fbe254e510cab2932909d3030d59b68087c7933c234b18b178354b2a521b53ce796f63db51074dc3b012b4aad0c5709e74b13b635629cd689665d9a946c4cd88c0a17999aa3ee5d9999167a785fc08d260cd3020ec3c519329f6a6c5d120fd15375ce5db60f78c46c5aee675b16b25907a5601c306701557faddb11a675927c4aca43102945393b29364c9901b213e3f82c0accacab31764d5b07142d59a932787489aec5dcfc62c91d56ca12d1db4b59a2a6a69dcd16c6896987b88c151e4c5460e14ea07c1d5aa8bce15f3c1751dd73dc41479b19143ce6957d765a74a4619623e9a25b4425e2e986649913435437a88e9e1e57ac1bc62ae18ce1671b55a1d86c68ae58ae1e1a3c60b1874151b66a3507395a3596068ac58ae181e3e6abc445a83c62a7a34583456ab154d0b2abda71936d21ce3ca6b344b7871a81c7c71bd7ab061754f36a8fcde19570554a974028971a3125dfaa5db565cd7719dc3c5b259d1a811dba28cb83d344b687bd878c111f323082c87cb7a396c34d8e2613b4fd6060e1b2f3796090f2bba34901cf25324c80f2137384790c07a2889e1e1831557807e04f9010403e2e142175552dd16635d276d78c4f49034f2864804830fa0dcffd16d9ccc71bd9aa55fc0d249906149eece85b4d08dfad260a31a943e70ef1e72f7ded13a49f5fdd436a359c2f853eb411aed57346a744bf40250184836aec6f0a033e28a6cd06bf0d9edd7e125bc73ef66e806d71cf57c34d87fbd77ed5ea4d5d60d5f1be98ec6c566511207896788376cd886384f6933959ecbf203bd3c4d9d81d7f2b8c71c230bf7d07eebece779d693527ad6fbe6799e77ee0b676c0dddf02c8b7cb8bdf33e9abbedd3b66bdb69839a77db2cdbfb1e0e376c716c508b59d34e3ba44376972be64d8cdb03c73498fd93c2ed87f127025523ba1fe2533bc46bef3c731ce5c4167ba459ea61eaadbd17853aaa491399a4c12a711aacb7b3451e69547d9548ecb5a87b14f81588caac1ca27245e57aed8b1905ae583c3eb9c678882d98a9aa625ca9a4c1fa0ccb9d06eb27852ba7ac4d38ddc88356e220f105e20df3d3621c110a793ee4f2f4a1691c71a50c37bcf9d6e89621ded2eebdf7765d4a323379a770c3e8130407bda49138b4bc41d2c8badddd6dfae28692c607874facf206f99b53cd4906f2071d0653b001142d450a72761a5996652846e415dc20d3537a148b434343938216b5414f2fcd810e4c34410c5d48c10bc400a345a3c8947699524a293d856e509397b36cc615395469400e6da091c525648f61b42267437c51051429a8428f0a8030040539fb8a358427677f3122673d446021672f856e64b11e1c81232160082264fa1bba416f2290f4a8c8e189460e67e44c256736e42c873472868224c09cdda2a0276747d9e4ec6f96cca6670814e4ec2356a6032a9a082253c0135114ba9145a146a60f152144cf8c9cdd339249968e4e11c418999e531142103b310959258a205240809cdd460186abc5584d105a90f5d414c139ab91b32ccbb2b39aa53ebac45c4f2917997edacc467616bdb3e50718b2e8c1177e983831452b83226755d080660753f8020c9d24b4b22539ab020956e4ec349a45cb599665d96807379663de71b133bc78b4f79e5033ac56356dc990aa0448f361013da19e68925920b23062064dd505828b18f445391114041a9bae77b64414bc40664dd3b4d3207c11842733d35059eb398112596341ab5efba34bcc5a56c49156c53c8125485a1573682f0a8922f754837278df1141bd44aa3dab59560f20834bca91878b2105f0220603d0c2f572e4e12227c9ed72e4e12249017eae8c1c79b8904245836b73e4e1a209aa2cae28471e2ea4001ee16639f270d185ca095c7ca1251f01345531d397f6420a99e6d873040ec5e962086eec0102498e3d401891b721c71e1300753c59a2c0f86329cd33356dfd992ad9627dfac90a77d0a499a40b00f1939f34283f693a30834c1f76900ea52a903a48faf8045dc004364b08a50f95ed65593f6995fcfc3a2805d75adad59fd962ab882af92b9c3801284b2a04fdcc96d8720214647de28a9ca1226d00c1556356835658a10609e5809a856679ee8ba0661965f90ea743d22df2c80f67827086d70a2f69b4a60f92d84e93243f4e0421cb276450b384bd24cb870d463d92e5659d42969776489697960a4b45db6021b5f0e9427ee15333443eb1ca611fe138eb0364e346e39721cd626f6c911b7b636fec8dbdb145ec8dcdb13b56490ee993e5b9d08dc638ea14341acda6fefc6ca11b5d8f344bcda93b35a7e6d49c9cd9125b3b4a787c6aac8769433726860123ba00e0e7a626cf7469b2836c6caa1a871588c70d9ed9626353257fdb07757d5041d9e736e1b13e1ccd7dae3f3eb21e4e9ef8110426a483105d3c10ad903d309338c2c429ba45a6817e92a6c11a9a2136f2ed4474f1403d9039c693ec236e91a9cf159ee4e863852d72687d7cb6f8c9d6a759a2cf15ac681612901b7d8c009467c8910a3168b20c51a04f9329f6000dede08189533be489c31c62f6c147dc22630fc42d1a89db3c3434b9af10db014dde22d74f1291370dde1829522409ce9128c0901b89f5c9c9d9d949d248942cf16162254f83f230e878bea027490c1189e14e2a633c2af5f80331e4e9cdeed460ac8127db49170d368bc4a913d56205c6624e6c036e0f4d1557b493a8ea8709c832f718bd85c9823c51d060c8bd0a23f7971869b01f672a82368c1134ca7d181905d0184e40d9438382ecc51772a53396819a259c4672374b7711841c71c88a0fc137d8a780912e3418b97b8cdcd12587987f40c5157a525c918fb345c3332da94d19144a1c197b8a6e1cc24dbdb6db6f384efba55ef6da2dd6709099e7e35313ebe85686230eedad8844c99e55d65a7b061157625a637615bb553a5bc64e947a79adec342f917934935996c52aaa2a204a7e5bc7d1d99ce4a2260a81c82f9c91e3b3500e5e68c38d2cdbb8f285b44a9c5c6bf5116333c680c46b73688e0be53033e56e846883f15d77e3dab822bfd0bb9103cd368a3a11271289449b4824125991481365a24a4553d42229baa1b6654207e4071d6e9e77d103c921e6781e628b5ef2f85e1f8c18b7c7c3f80324440b1720413daae2251039595681849decb595fdf0ad842c71b89a715483a89924c6a03b73fc0cdda89a0dba33b4430fc9d95f6237118c394630d59d7b97b7cf005914c5851bc626303dccb709721afc4f13458a18094216326d5ae9875570c3991cbb71634ce9aa473a6822884c7118794ec793a2c65092572231dce77005529ce77972b4aa51524ca49208273b59d2c7fd7a5493dddaa4cf5e633f7ae314c52e92f6793fd39ad9b5bf320dc3742e86d98f0edb9e5d510e8943db68cfaea3bde257f6118689bceedc76ab3d7b66394fdbba5006d469419f3c49e10923908c138acd913ba3fbd347bafd52dda62fd5da97ea6c33b99ab89ac8202020a01e69f1ea2d5a8cdb0f59150810d00fb3abcdbad61ad2b9571d2ac35dfb0764ee7b9cd231bafd0eeeda65745edab9cbd88f2ea3f3e2aee154cb8c6e71aa239008e20f21d16566ae08398434811c01a55ca6d2f6d7e8dbeb372ed53cc4d6a8d5de0f201a6e0cd6de8b42fd2048234392439b5d9f382f456688916232625e4cdadc948e3a9df4a13ce513ddfb42efbe7bee1b75cacb6c9145705c1966ad563a622cc678d0e18a2b73ce3963766b310f40329c6aaef4d36b4c4739c5a9c62e6edbba14ae54ea300ce5a6c34e2f95bafba5fa5d37a58d597d712a7b37c2a90c7bdfb68bbe947d77d1435f4a4777d15316efe82e4aedf01ebaf7d04cce707fb40c10a098a67c3af528dd63cb7b6c99be542d7da98a5d35f735a353981e427e4423576c47644457935db6b86e12ebdee91bef26f49d6cdf7491c6e99c50ece726d6a46f6c6868fa2674d15fba6f668ba88814e130fe28d13e9acf4b17d1377dd32de822fa265e30ff00a4def8a1e254db7881f911a45b9a8633591c25695347afe17eba992dd2364e1ee10d631a2c5bd97723d8ef5354f58c1b0dbbb6bee924ba88d73c681cb412d987fb4b7bf387c3b099968c4d9574d2431a049aaf466822cd32b3226da459ea90fbc596bc29822377244f8e92fbc956119c9c1d253cd927fbaa0d5da4735a49fb344eef74ac6fa66aaebc99ac4b4328994699151de5d34a1fe9a65166b78cc7498c931f4052020102fac1b4b5e8f735da4975db4aa34fd1b7bf441bd660573412e1687d709234362938397207f5d99f3eed29a3934a753b95eeddecb9d7681fdd6ddb4efabc3d75ff6a3761d8e81a9631c9a4bc64b5cba0dc3ebc2b199d17eaf73232ce7df4c9a07e9ff2c1745e28144ee9189d7baabffdde6ff81e86721998fb08cbe8bc4cdf2e83f2d139946f9fe9a3efd6c3d88f0ea37dbbbd8ed1ada69d3e9dfa6ef4d2b7d2a8f4eda4a75edb49df768c4678c7f6d14730edf7b1451a7da5ed2361ea1a5121d2a6484e698676e7822eaa507ab984d2f7982d324e23bd07572cd4c75dc6d73de543f9fd4cb75faa6ea72f551f4a652f7d4b94528a83524a51534529a594d24829a5946625d26b45a174ef122551fa55a9547abfd47587a19ca3b4eb3eee4b357e7ffb4c4bd3629a45667a1e37d248b7a4f8a08f4fa296b58bde94cefd553a87613a5dc2a97afcb2ef308c746b755cf7289f8c8ecc09a7babbe99321754f55d2b9a75ea47327e1780ea72ae621b62eaee941efd18be8b72e34a254f260a193fd05bd7c119a3c67509e4ea69db13c451867f4893e7724d752c293a74f9e9e2c325b66d054cdd9c4499e4524cedca1b8831a6806379c3bdbbc22a88a08d4134e27363c441e160fe6cedc993d789e3ca078eecc9daec1bd84b7c84ee835dc453b9ab5386c9a5463978753edfdb5ddc31b27c21268aa66ccf327679b2d5e1325b365eecc6edaed93adb933adbd77a7795a49fb28992df701dbc3f6699eed8bad0edd706defe6ce74622a993ff38a3c67153dd349c7162d21ea20a01db225c2b09956037dd3e666e27411ee9c4c9a25ec2e0228dfe91b9df4d7e824f0de843f55364e95bc992d323af332a48f2e53fabd7d0da574903efa8bf4d1c4afd22fbe53652f7bfec754d1897f78915e3a0fb1d50316838148b8f4b9a68a9ef48d7e1fc6d8c453c695b8321fa76af4f5177a5c0e1b4702149863e4d0b756a29d3ec66791a9768d6aef6f9f0f2dea6f13e1d40ea2cbe720c2b1c14dbe747fa16f5fe8338481b293af8b741291652ad14a9c14913c3eb14ce9c4892bf41d96390dd27358e2b492cdbbb36b1a4c20bbbbbbbbbbbbbbbbbb5b7677db8bea6f49109bab17128936d971b6a6e6f6a5e67cd7ddc3b0d0bbc33ce9356d7920b0d57bf7852ee2ecf62d13e14f76dc66cb4099306bad5ad4773f0d6e91ab3671e85e8e07d4a9cce0662fd246fa488ce6c5f5b1cae10766c255eede5de6ccda7de2d05ed4bb87e04d7409e52ac5edbcc3f4a13bfbf61cb2778dc3794e6a9f30dfbcac974344962e2282f5b58b7c98d9625bf5ffc47d1357ea43f76e441209e170fbdcae3d9cf7f09d1f6afbdceec3fca9c13aab7d2825f76aad943951552f71c87da806ebbb5a67d7dd13964570779106ebb57ac366a23613b9be999038f4ebb970c32ec2a2d22c757ece39a7176b6863c53ef44e280a1ac11f4184fc90427e48ef2fed7a892ef337c796ee947b188f9029f707704b8cce7d36b6157af7d508c16a856e635ba38732485ba0f7d116987d555f57347c61dc9adac18633d9e2983f32dcdac9195b52d1129ee8a1bf44384e5508a7ec438fadd7a74afb08a76ce83b460f61191d9911aeb161b5ba0b615bdc778444b8665e08dbea1e5b1e76bd7c39aae85b3542dc568c090863121610862203c25845a6bfb305e647e2e6a1b75fa4d69334190aee0bee15fd35bae8f222d14f18069b91f2a5d24f1806bb33a4df4b895ff7270c83cdd819aead10dd4dd3f8c1c34402cd1a1bdc340dd2110eae8ca3340b77da9d5e2a992d293ccdc2a45942a740d1a5e485c8f2d2a01514658a61d1448b08441095f2c596e94727c5ad398c403274e3be93e2663f82d450c4ed3cc369787dd83499c62f9a88c211b01006115f006ad1d3f0499b4f0060dc27cd92d96878862f5632dc50dad8d4e98cd3194e25ce8c2fa5fda92fa5e11f5ea9cf380fb13503c32e4e3db66678f8149ef1451a3ec3e50c34c8af741a3e199fe1433d86487fe9b8a21df5c9f8a44dabe869fb1c9146a8cffd2493d0279334d8207d0acae8933c9fb459c2f45367c212d0b27c04a81722486f634ec99ccc268925d08659ab06c15879f566d4dd4d273fa7cc892bf311cb9d06230f8e1fd927cbf679992371f0e28a892d8748225922f9b6772a49dcbef797e80244e6eef3f9cbd9261a8d46229168f4eddaa7e592c9f4fb1da5d26fe932285f4afef4d8227d2989533a4847f98efb139639fd1e05cbe8bc4ef85e86f4d8eab24fcbda2512890359d3aaf921448ca08efcf8ec072b7d2fae982fb644210dcb1c9b371ddc0a06d7b605940830b8f9b1a146534a299594de076aada596524a297e5981ac06a72b8c44c861244296407f3ed62c210ba6074ae99663cf12262cb511e7ce6740e858a64db46850cb6d93a495f4cee5473b3f3932269bcc16dba26f9be8a265fa1e22b2c03448b7e89698a9a27247f2cc16ee07faa2696a32c5400fc9b49443885e8a6bf397d2d1ede84ec23542bca5935d473bf7fbd40eeef7dc2fae21fdbef4e9a476e8db374ee9307bc2589283344e499be812caf47208a594def9d5a01bf64e2b992da553d3e99ba777327d67fa52db675aa52fb5e11f5ea59bce436c99300cc433ad9055c23a1d82a6aff4d100c38d2daed59deb1b7a243649a64b32bdc1992dd6de4b7f3fd27782d11830cdd243440cf490fb23b5904d1aa4177d92678786505bb48a9e760dcd939f2f32a5b28b4cfbd3b2b599f4c556e672b0b971dbc4151ddc8a5d158cdb8f65ddc5baa8427ff821c8cdf24066196872109bb3937e1fca941ea477c1348823bad8d3eb105950f4acc8928a200522c7a0adfb81c082e0e689551ae4bed1bd4f14fa40d64f4d5cee5c7d78999abfd3fb8bbbf7790fc374267e79bf1816a7273bcf4fcb327423a523f4d15f211ca76a845f9faaec33845753458f23aed07bdfa78abefb5834a54304b79eabe1a6f1a776bdc110c4f0931590e310ba004556a7bc46e965f6507ec391f6a53c8739eece7338dc3ecbc50064798e468a71acb8707978f4f07129b970c3f81379785cba1379e4b51c7ba0c8228777053702653f6861cd29d2826cf1405bf52f1d2324bac8cf8b20f6704d5304371408892b93155d4279561c2382084ed7d67329ae5fccb985161db1d08105686a9db3d67a591bcc76b3a19da15b35cb74e9af441c62bc2114b78883a4efc6e100b27c78036a0000c061cdf2214aeeb8d26f2d6e189b8820e24043ded0ef5f20b6b060a20b6509c30b510b395221776c61916608bfdc8f724e29e7074a1c06106f90af3400904359664ef89899899cac3bf372f6f8653bcc07913ae8e2bbb3ac3d309bc956cd128a38ac5bc5f2f7e44597ea925db6962d146e189b6020ba3421cbb3a6aa87980b441c5e30d1a5de47f2842c1044e6791f335319ca81c6184331c31ffdece7810dc6b366cbed97c4a1c61be2258f96e3c3d8042666d0c5568d7c8c57e9d67b6096090b2cbfb3de5213216ffb96e60909db431ac9939ab860e931a3138a438778c3fcc42c23b05e592fb86174d2835a7befa39356d95a71443de8bad8639ece5833ed2079c64fd3deefb2ac434a2badd92773d5c1cbd9bbfe428d6adaa95671d75f988591ce9a793674233e76ee7e16c3997bebf8b067e7b066cba4b392529a6913d3ec21a594ee44eb7516636a06a81c1f67a593d619638b26a594dad43cdb2c61bc8c93ce39e7ec8e0b5aa0546a418a49062d68215a21597e5a1a032dcc89238ef25352e9a493bdd560c5799b25c6497134d88f361a6c1afd15adda0fae0d2058b38cc2e0aa3cd3ea0ceaa4d32c3dddebd9d922a3aa3e461a7d5e5ec6b85e965846907a1bb789626b53cc0210714111d900446e28c71e17d428e17239f6204186fc9ba172d68344177296654560308a9ba98aa018ee28c71e247e4023dc9b630f1231247cae82044e0ebfaa2790544a2ae795d3e6d974d22a86541837a4d9569b9d5a39a2b2fa7431c618230ebf1c278d94ce397bce49bb637777ce6194360a3244dd21ae7cc7d67ec0dcb4717ee243b905503f8632a8e7082472d8345dd3437213c91da3a1a109a29b8432890872b408430c2ab0410f6243c8a1f4d9410e654c62d1319913ebe8a40540c8a28e4f72d7cc9c808830960862084bc08101931cca224608914389238fe48eabd9e24310648083253b4fb65085560b213721db196b42104f8c410b1e317e5a3d45ee5f9cece54682152a4600c1003f99126122532264c8f43674838239461c0c90b96ba11b5c4619b182fce5ed59e8c6c6534365468352e786a8972b9ab42afeb42a66ea04045a5d11c4a26955cc4ab069d56c41a1622d6092eded9b25a4ff28fd8cdb90e2db9843546e154185ac69a7a59f9c653c4520e9236ed8b19f1690868606081e1a1a3b5bfae7e7a68b4c234f27a42e58790576e1ca10e544e264c9495114f6ca1863dd682127e0450d4ce0042a827002103d4e94411453f8a6894c4f8375a2072567286591e98d0d5880844c8f0adda07726891b90a10c487821451450340f144540913296b08230327d4a8480154f38a2022504f2618cc1586b2d8ceb158b7fb960228d1a8df1f33dc4263e31c618e3a682ac09b3091fa8481423dcb630ae9cc748f923251631461a638cf81469157725c4adb13d7b26d1c959653fac92892b1fb1684a29a594524a69a59452dab19e2554fc4049cc162bd151634716d4fd4e344b89c32c561da02eaaa88c9260439e3f9805716b27133058b58cb3e7258e9f0ae8c5157a0a647f5149bce8327f85ae4f01f0b933f245e9e0cab7066ed7168951d4663c7d7170e5e365164839f6576badb931ea92727833496679f9cc8594e76d6c91a48c73e5a3ca6c25745165e200274f7ff28bbbcad6de3b43301603820f9cb83b477cea1463c874708489c9cf33450bace8eea69466b5577727c623d6c3478cbe6009cd6685c4b559ce9d314615f4102aa707c6cda1bd3f3589631aeca15dbb0f7d1e0dcec693ca39e59453ce4b1cf6889973db68f3e83135ec9a314d9afcc4f468c2c34793263051a820df0cd44595f06e3d37dec881916e8903144f1cb9993f11078e1c4bf29c3c730a2249b6b879d6501a2bf21444bac8da125411f2c431ada5d1e012f6abd962f1276d7b848a1f1b6a4829aba4524ada5236c1d3b35b543ac618e3a3c4df887059f3190d54661744e4f4e2662339311be4a9a494524a29b5d6524b29a594ca15488f70795e6ce0c841a9b53725c79e2558b841ac0875b670349e4e94c3a756d5c7305cfad076f40341672b23cfa3c41b503d327dd5e8274a5c49a963a044707e86700399be5a8066fb6dc3a7b8321fa2783ee4792e8227587e11661553d639e794724e29a7aca11b92ce1ccdd2b3e79c731291854b26aba856c898f4913e32267d60af4019963e71a51e003cb8dbedb577f64bedc09c2af53a890a52b841196a603ae11236b265bfa38629705a4038a086a755821aa6c069592c839aaa6aa7aad630058e9d42078253e5801a9e96c51f0d2f50997d5631a2a422d8cf6c1ad44595b0d264da302b1aa48ff93448e792e812338d5d6be9ec209a0eea201a1e164b071949b89904b61dce9b36d3264ecec4f521d833dbac26b38c7e4183324c812850a6ef9d69edbdf3872aa1c8d4c79b3eddf4e927dd12c21d9b35dd90da759ef499dc073355f4351c71a1d8bcf8dae17ed238b62a9c357348a6dd1de4136b42df1d343b1ac213e7389c4428928963278e3671b28933a5c8f491dad4bad32db932ff40e9251d22aae88bc834894b95c8f41587a84c73ba90e589a94d5ca19f5c1177d263267786120a9c4c3f71664b131155f447e4c4c0064ada2674a3876472c68c8a26964bdac6da7b51a89634422a8de905b4b9276eaf4212e85ca3cf3d71b5980b26ba94327d0f99e6ba7c0d5fdc17fbe1c81eb7e87dc3dd8e6e7b5703127706ad794c00bd10b6c686d5daf01755f442d8d60d2b35e4edadc4a79095b8c6d6c5c5f71e0d43bd6733e4a641b06d6e6ca88fe842730fd17ac81c92da214b452a71673645245132809be8c283835c95c835895cdb87c329b9e18dc3323aafd0b9cb78dfbe830b9df3bc875216bf369cb2dfb8879e7a710f9debcec9fa1a90b832f4e1a896082f727df7b54d6f32c8620964a3c4460229b119722381b61c1b4cd5b7cd270c44a14cf631f10a64693736077da4bb69cfee96565861450e591a62d20994859f5a4317eeaa4392c644972fd3f7882e2497d9b6e3fadb2605e9690d5f5c170ee2dae7a05fb1bacf292ffa4ccb1b8930ec7e34d36a199dd7fde832a48b2e733fa29d6374993f19882afa3801c0832b3ae9323342291da48bbee37ea44374d277884ec2309d1dd20a3be0e2062fa0a16991f09daa968e9c4662cb0be11da593b08c8e8ce8252c33ba5f6c75a21cd1a553de67b28747df2a4774e94c65e69eb85a5c999d3d9c23aed05beef3eea98b9b61f0ab22973ff50b72460e929d9c06737696d41c6a9454a0c9a1a4024dd67a882e33d3675996512a8f9044642a83c840f33386259206692c94e1304621d37758823c710f394d7bd29eb427fd86855bf151e04fd735721a046bf491adfa4e466a73844597104e7419407499b9be91ecc0a20bcd0258c2cd00b073654ed114c52eeedeeb87705fe37c9d33557513e3f60d8e146e289db48d932adae64b7243e9244ea18323b9737de7c4313861840b4b2801c517805a7d443a914e52605c0d770e1ec2adb48b066be3cc961cefa1eff01ec232ddb94e86bb875316df06e736c5d5b004c2d24983f5b80877c2d480c455d5fa6ef694dd54442986c595fa9211892ab5b6760521503124f4840655e8a20a08be0630dc50f2f0742f3ca28b448991690c43a6d18b4c1faf90e9398d4a9ed992b2b4ebcedd5afce2be61d8760ea7ec630bc6bdc3298b6d8b6e53dc8aa5120de322dc50eeb4f66672b51c2fb9d76aaa68c6e4d21c99dc28a5ec2ad2308fb8428f852b314824d2189dc2912194083231b129c1e0081f538e3d4b96a084114422a571efbdac958bd2d31a4b9ac8deb54a744055634224887e712bada75bf670db28addfb66b1bddb62daae86128add46a543bd55e1aa477f9c034cb8b521bcd224fa190020d6f96415759d1a55b624b8cac0b4417fa18558dbae25611df80d8e29aaa992cfbae596bad36f6d859638d353eca1669f871657ef20702ab42f0f9810abaa88223bacc56b7b8af1475b839f440a6b2d5511129ae4452a68d6f5cb93adc4c7f587b5936bae5029dbcaa32ca31267b8e115d648e4d5c54c84c0306c61583b9f75e18d72be67ac1b85e30ac55ccd535ba67ffd8c8227ee479d8c82e71ccd7a3c196f23c7ac4f9f81ecd127177ecd851bb7da77d3d627834d83c9a45daf77b584dc6f0e8d119c681590df6bf9706adb0c28a1cdd3de2974c91c3db3fb8a1cd194d271f35d20580501271ac001d820c60a045567d2ceadd034518446826788191eeeeeeeea63dbb9b3261c2c4a7079f263e384a39f62c319243544f7592592a8c484204303ca9f72ddd979d861abac171b53ed380c9cebd725cf6ec3e7030cdc2d5d75aeb39bc7d309febd560cd7e3badeb05f39cadb8706bbc6aed898248ceea911bdaf823457df7f282ef6db63be77d355a555970fbe14aae7498fdfe61766d2c2348bfaa24c8fd4af30441e719a748fb4bd355c7d16870fb3e55f516b5c44b532f6eb8ca3514325373ca6ccaf53d82748ba8de064eaebd53a35922cf929c5cebcf92277218bb90118b5c3fe9aa59263dcdec8c08223c8944c8f133a24bccf2973474a3b69438e8434dd3341ccda2e16e1c0dea109365966326571b3824061b6c9ea661a359ba098d1e2880624ddc7e54e95ad34515ce4991b8420fd420ed2f32d56692a964ee34487170399ce812caa3df67f473e77ead440060dc89a495a4e44b13091039464ae2cb934a1876b19d2aedb0119e69350e9be7c6fb911d7d8461a393704ccd9e58f2ccb42c0ebdfd3b676862dbc9eef9d9fbd15ff7a36b3a0a86dd9b1ae5a37b6bdff7afd1efe8250c5b8d7034dda27c2f5dfa8bf41289849a2aad278cf4128e5355fae88dbae0fb46dbb8e38a761957343b5517a859681660ec9b21779374644b2b99aaedfd2e64e38624301f7ae82fed63d5d1c073650ed10fc19138589c9e1e239de6cd39499ff6d117e7d612ef207d8465644aa35f1c5bb195ea1da4df7b1930dbefb8279d84654cf8e2b7ec6db9433bb774424316985802354849a49209e5f6d36442e9e429e5744af9c5d7963eba45f9bd2d7df457e9238cf28b47275de6a67c32a593a8a4ac1775414c95a2190120002000c314002020100c870362f18040226b931f14000d83aa4e6e4c1ac9d32888614e216308318400000001181111d2b40920ba942a8cbde81c14c3fdea0a82824b6abf724bd5fff5abba7e36cd081f42841a3e8d589954911c46deff43d4a417d352a5d0bf67278edc51fbabef31ae69679b2f1dd7c53718eb4ee3afb8976666a8e4a974971f14e7bfdf38fbde0ca8c6dc55ec5d42fa48ad8d2ecca73c5f6996e2f723d936103f66e275c9145969712f4612c0b4531b223d07758f54d2fe9d5b254d19c99c68c975561f8a97eb15c2e93bec2a5bbd2d9fac9874f4cbf027ae16f95b9dc32c4f565a0d2dde3ea347a88ea53a6e693af227ab8074de3b2db55046dc750c71d88229e79b6ba4ccb7bf918896d0459cd1e659e21344a9c2c948c1f580b88168fd34359736516b624f824f43d4cbceaa5157c429c9d4203232548654acd9f60cf4d5077d4f4e1249fd985da0b1dca5d7b1915f5fb94fc274ae5616a5b25e6d5170303271e1b05d68bf326a82f8d260bbf471cbaf7a35e9025707ca0043f5fb7ab67a840b8b3263ecc7a7ddcd4ca2c30387d8b46b73f237b8df39c7a7e7683cff2cbcbb2193eee4b46756a84d1c2b465119c01182ea14d3cd3412a64fa67c286e7f82c3ef05221cea799a616fb80a57c5270400df974dea340696b8046bfadbb678cce68e7c8d00faa8552057e02b5fb713560ae861610cf83d2e4e6bf81943810214c7fd0402c44a772326ea421f35d8bb1800341d473566097ecf7143f5b041522aba2f3f8bca1d41f35ad19a653f799877d78ea3a01b13047cb28f6a8a34ecaed45ef33d6bf160c45298e1c6ce52a533d086fe5afa71844882ac39f71a41367c99d302a77f10f59b4bd36df93aa7b2d1552dbc1232add751559116803536225b4b0a121dba218946e5136d0e835a344bf0ba5a7ce6e16d03068bdb3a852a69785b99a7949d32f24b00937601115dbf53e1e5f7a7287eae0f4532a0d76323d926d91bfc7010afc08de1a571209d26f999481337e3352418b104402042636689f359abcf1d93235f48d5872853dc3f7f3ad2bd331c7cdc15c9d26996c706b6d20785c8e81f1f91cf58df09529a6e46d78a0955eed735b51fd8ddbb65e6aae25de354b86647473697135a38ab943b7235353d654ecb64608e63cb11a83e88a9c62b920735e21b7831b5c2f39f289cfded3b3d641d8e781679335c8a9079e768c77461e814e3e0021cc9f25738c7225091cf68dcb2006da4adb010fc4f8c0546d0e76c93b1b3224ecc30c4ff942c4781139cc82ff2293312b3bf47f2aefc7eae52618ec3c09fc1d3df7203bc0c850d1039b68cbddcea7fb8c622d6b9d9c07aab8a1e94e21dbda163626c5317278f0f06ca4ba80220e22ca74839e36d422158da641399e40921df24305e7e82ed435c376bb999e24e1260d285b6a889a0d7228a209187a20001d53b9d38256b37eb7b20a24fc8d251f69ccb4dcf071ea9432bf5f31467bf588e446c442d0a3fcac9456c150de2f062ac465c443a4b26f569e763cc131502652ff50963634a3b7297ed7edca438a27f163d318a37d428c664bf4e2f501236ec7c18c1d4c97aae59be2c689146c1d4d0d90e5552f8216bc9e2b6de2c813ad9c1b7fc487a7c1bc86c4d279e2870207f616f06022e5fd97eca0a0f0c05f5271b51f3d21e15cfb147bb692a72ed7acd5988deeda8b571b821aa63329dc7676b69b753e1e288a4263bd9221bbd1271b345f8a62c23ca5c946d31b0ac65ee7c057af86d8e3ae749202f030baa6ca2cb060cebcdb88593f0733d995bed518ad7b36225a57ae709c23847026329eceed3d0a0b680e29db470a3ac7ce5b80c0d368bc1a3993d949e9a83e1a4319b740b02e58ad6a0820ab7a017adb3d06d00c8ba74dc4ea33e52ebd244af9152de63303c1e2b38e0b66d317bf611b9fb039518c189f8db5f6a5502e2c9210746fba55065f4631a725041fed2511b0da29ec8373c15a5efa4bb7eba86802f5d5a1dc854bae79daf08254c837fc2b36db3ebe78d09d7950dfbe9a5405010ea4de4aa0807a1340e88284e10cb8d90a2f13935479c3f43df595b3440f2889b7f35d87b3356e3b162afe6b4927ec0ebe42392ec9fb999b4fcc2588912d430e4558d174f54bb361c4ff8ef4b163ec0e790f9dff1ed7c29cf8bc9e64f572ff7dd22eca03f609bab34fe18a4762c25593cd178674ea7b502874384956254f085b83fb3e2d7f7e318f08a01cf8b8c49f495ee913b6101418c659b00c640104ede37e2a3a4024733529d721d4003b5e5b786c29a7388450b3a641ac258ad9091b9bb5cff234c89b72c886b043c21cbddb5c6102d24264426ba7fbe73faf96e1dd2e69c50fcb430792c64a0e3ff061b0439e4c8a88794aaf6d299ee70f8fb3a79c779936d6fafa153a11be724991b0069a8fa52ecf46709a6c4435665917ec884383125606c7775c21a035430de4293ac57cbbda062ccfc23f546c2be6049383bd3f83964a411475d24fbd8c9e43a6712183b120f5009fb080eba7d0b0aa3ac2149a8229f3091a94a820c14219ed5f5914b32bf934fb7ac5f128218b94c128b2b691350239d536e907b74ac039f3f2e69dc721927668118607c1b68fc0ab47f85e79026b2ce30f14c29834ec3f14ce5fbe05d0f1e4e60c1d9a1ee42a79c41d659f2f24b0e1f82edfd56bbe680cacf94694a1760c3144333d55bc7f4d9529d5f8489e2350ef480b787f865293c5152fd9ef71c432a358a0829676949b0fbacc62b9b36f623f03ddffb1e3e91531ec8c128d54407a1e2b82880c465afa49d2fbf0fdf099a8b6807bb2f881ee22caa658f6ac1f1616f133d5ca35d2193abb8d4baac97bd1c4cfc3128866f8eafb35ca1ee82f2b005b8575bea9f27ec427885d50214f1fe6277d71b09b07130556a2cabf00ed30c9c20d0dd9fac0dd6696baf139e6c07ca531e1c8c6e1a3084b0e6e0d50ae7275a2e14140c8696734ef8fc243ed3bb27ec253e2366b99804ce1f90b094e00a5826500b1ec278068d9c5bc017c71c307331f2b332ecbea224bdaa14fa6357ab8b300d2dc81d97144029a9c1f87efd592fe367c51b3836c8ebc51fe6b8b85c123e6f92a9fd7f0dd62bcefe2b0f00a51c75250851df3e74ba4e678e5c49d88dacea588556380fce909cff8039b82d811e0585eeffc727834bd8b8dc6601573e8fbbfba51489b97f8a12d8fe4849761f6578df5ffb8cc4a5ec3a3cde9060385227f28411e8b282fb124558a600deed95789138c922928e4de8c03a82eff7fd4d05dc0501e400388efbd2b91920156622d7f214b60721ff5e1fd3f75e121ad75f76fef59fe249d860b505865d44e486c6114580aa86ab911ce832c155ddd186b5ba2279c00a40c89261e14c926b4490364d17d1559fdb6f79d73482d6b400d73fb05aa973a3fa096317964ade506c46db2aa910f91ae70267c83d62a701817aac49d2d8db3bab47cc7b6198bc75a327cfff3695f557dabd673448d45115a151138d2d23dc5a31788916aaf88f3ca1bfcfb1240e0c32ad0eb13dc1f5b6342a3090695c1a87c735bab6f26a0af94b57b5480d4c9b4e91935899a82c662457cf91a7616ff42d541ba3ea0d46724a4729dbe6f5a063af1fcd6708ca048152fdab2efc64e85f9c2f93054524e7a21a743ea9824712d23921a4a1302109b4783609a22ef39407ad727ce30a02ef619ce69d4886502ea8703104510f52d1d961f642d0212b0bc87d6833b8e34fb6f4cdd55aae01a63fa305fe141d7a6b20541e3054642392c0dea3984fb6f7b3a8deb36c1111eba7dfcddbee491bf7dcf1fb590aeab2716cd9993af260eabdf21e3323295a34bf5f9583f6ad63030ccc6e32a2025c429ae047640390374f01822fa23c72ce5a9dfbe386498e706069f4895cc518b49f9069d39b2587875200bdbc830372e4003d57ac6448bab4402224bce39b1d2268de6cfa0e1bef3232dcc66810fa447280227ba8c81694e1b55a060295b66735bec3b69929d90e8d51db54bfaf4008ea06e5f7eec487dcadd53cb657495bff8dbe03d74bad404af68385497799faba6eb2207b6a943a63b3f03c68c80f3275bc1a0bd332ad79416df200bbce6ec7c8551de0ba6939d0f932a171ce482f1de0fb926b94ef5685febe1610cc3edb4aff83805153de8ea2e9f9e5e332a9967feddbc29c5a00e17b75b7d59b2a6d53c249730a749b6540c870f18388f102b085e44bdb44889c2d956a70360395465bd0e34b40ab5c009f2896278258f705fd28c2f2596a79c10de9d6657336b44f658b390e4e4149bb3682dddd2b2fb48dab1750726bbe1a059bc60c0831589ac33f750ad1beca08f5cfcf0a407dd8c09b28fdd3d9ec31fbd5ab1fc54978bcf9e6a857bd794c7bdbb3a4e9298d07ec1c855ad8030b0520d42df0ab770317a3235f78d1281622604401195becbee5143bada08130deea7f2301e3b6172d7a8715e223bcf31645b27e0e558e5e5ebe610ec4a8b73ee667fba15728dd0e2234009a7ff9e6b96579a3d04fc84dbb5a277181fb379315dd0dd7d820afeb4cc69668a8690d493f3a54604f06fcb73e0dafa07befe56198d76bc7e67d47da62698b0f3b1047386e110e2b5d84da07ce4930f25bcd6ec27fb98c2c7e52f5a4e3922fcd05587c3fcf4649449b8fea7cd947df28f9da4f6506fafd229008bdcb101ff1ad4e0493eff08cf720dceb6852e5d40827881130e003c2ad9e54f15794eabae60b5a7d29075d40c7e9c264d7c5c426b00719a1ac3369c1fa29f1c89d192e1304542709ebfd8a15e724912936aa3cbb48ade181c70ae8b4635c3d604a9686e8432bfe909f6365c1ba7ca85fd3c424f9ccd91556dac0a137022b57cbd5615a189f8c4ac403204bbd61ddc4fe568aa1b24eee6676d8e1a50c4e4d3aed42f21d0b0aa73a806cfd3561657979d4c335be15f0579ef847107b0562dc126b454e39443267a441722ac106583e7e06dfbf9704290b659e9e11ec901f31b00dfaf26e5edec1341ee2bb3260a1872ae7b471307bb97c112be0bafc848de2b7e7860d62e517b6f7516b2c5f26493d6f7cc9f2de67c93e44214cb72c04d46277184c4fa5a31bce681153484768618cd68e147553953517ba55c0ea5867a4088e2d480d31ae67c9b6a3c6d6bc9e21a32c85d89a9d4733ec97e5390942daec9e6d357b2609a6c58f20a76b7e0040ca48d0bc2fcea5132e9ece05fbe4669e275c5cdc02de7398513c79190f3ea0d16410e7bec85e7b055beeec354deb090617b64c72f4075e5ce16e590b599ad61cd043b603f9085be0d6af7d586e7359016dfcf26e5e18abfc99b32e4915346d9b76309d25ee98f7da743adce963b25b7eabf7f976cbd9d1af9f2f46a287c8cb79ec0ea37861a60838c00d2ec566bccd4e812f0842d4db134ed77359df06959eceac428239e854052fdd86d14941c71bb9adc208551f39e3329769104e0c8eb24742735b828c2e2247d8d6453ebb881ae45ca8887521833b545886039302b9ac39ebae366307a4d9d9d3f4f40276d073282e3c51e5f510da1cfdeb6ceb0f45bdb38a64320810a8efd61e0527d6290adceecbd775d47ea2b8f51cf6d06b68516b2dc305f11b656f6c3b6d8da64d4c7741a2a6c056cb64713abf8bdccb655be03cf8292f271ec0e8a468391b4dbf66d975a8005c418b8a56bca370a448b59aa1b37294616ca10c59fc130d7187520dc90a6b6864d2b7432d4ac0e3a7c87853c8dacb90c9630d7c2272fa499214ba803da96f7aba412410cca108698f74e0b2513748833427eca73a3e79ca3c54c6451611367efabcdd872406d8d3b28abbd91ab70c0ce1542f4464e957a59993dbeb2518961ee07201170b1049a010c407c01d9643bc42948e676f14b6271a416e05cb140832cd7601a2906a16876605ddbf5228a00b78efaab6662889966d902bfa16467ca55db9c9dcbbf43fcf4ed74d7bad523288f494f1c3dab4e2422c0ac4fbfc7e7d8cfaed6f97981546c5171023e460c447414c1bb1fe1807374da41f78d4240c54885655ce55fd4429484da394f1f7949b0239512fd02c2ba92398bc4d7eefdd94fdcd14532eec727be4e5c7bad11381c7c2544a7d9b67a5826f11b1e4776aae6eb636c2d0bf32ea995bdfb803ffd8a7a565e23587cd66c3986ae179f6b129399f286aad7e4ce26efce8532c01e85850ad58f609eb6370a7dce18b8018c85824f37e545b95df1b7e04638c11546c006ba5c904212833b48c0caac3a21e367370cc100df488d20e221d1c071e06c16c28682b7a877475b6e123dba7c4420809d3747b653928c2fbb55a8614be89a5aec4e20b36b0430939971975ba923d92c54a8fe760f14b5d9e78f6141234b6507fa84b06c87f47c7939de2dfcbe6f910c3d056fa4977b51eee5781c4c536ab4af17fd623b417e3be4c567f18c29353d42534ab4a460b55be0bb5eb85295b16697499d165de1d5f3e402d51563c83a3e25503ecc45343253ef75d71f358bdae4fc65dbd7397c8937530371b34c803d3ce74b464840b595b84ca08671a610281fe8c1b3db9ff89387926d21acaea6967ca3174cadae1dd6585dfb606ab396b2827e0a57195524ff9a1326d427964a27fa8d3dbfbff44e550fac481ee644e1d89552af309c9efe2cf841d2126fee500d5802f22b60411c899e14b0ff836ccb85429ca8a2050d4d623e691184941ee4afa9e29ef8b865110d6861c4e2f305d9a8351979f4ebbbe759ee0cc9bb1637a78285897fd321ecb937ef08cac77666e5caaab72e2355b11416ae100b304799f5d416e59066edc0b833c01a3410c1b9f04959a1b62e320316a9268d7f1774a215ff21b62ef2896b8353335a32903abd275760197aaba2c6d8918d24424eb0f492315abf235c01b1a29a8b713d121f9f32e0d48a952c2882191fd836e085cceac673cad2f847ff40292e3c12f2764d29c4b2931f2c2b489abacd2b32aff72b1b0c58d242fff95c88cc99bd122d147f6d6a270403c0d8569dfe492478fb051fdfd5564286104b78c1c9155c048000d26276925961efdd6b8feae919f1a5de380f474007b4f9149ebe8bb5e229e4fea7ca54e11efda06d5ae5b930406e0d8a94c16bed42ce73e6d217c6bb5fda479247be06b8fabec7b99954952feab89ca34eccc4a3039c527955fd78f12c85f3069a7758287c57c27a9651e4304e07e4acafc3f6b56152fb7f5d0484656d3c378f5ab38346e70735de0461db6ed4d491f9af1699a0cf3dcf6aafbc3b7a77a053433abc351a6af39d59fcba3aea431b19d7571ea22dfb11c71321ace3b8c37fe23c874766ff44a4320a75d54130d80ec7621df0219b8a8d3e116f5e1d0e85a38f0a84c15dd40af3ed4796a5291dcdf7b012b89c528a348a06b5f9db31b4e18d345f36ded3be82a879744cce0847b0e13fba15c013ae892f0ee8c7c6840c1a5ac7318de809d9c2ea43f2e3a5136e8858f82bafc7b14ad066120226191be7ea480658ed5103c85d3224b110359236e647d5163f2e2f9603a6851bd367e395c84b4898196faabf63eebf1e4314493bd14f09eee37c4f42b4b86de4afae186f5b5d75fa5941dcb0ed5afd66c7f4070ab0b4585632d3c0e8de767d1865ea03bf397cd50e4fe0d7e0203a00b656f2003d3f6f591ec2ea1c6ac7542a567e39c366ef52ae892915081e360014adf7a594227c8f4bb03c4371343f4e24ec34bc23ec80cf1e7db1534186dbada216d7b9cce945e87614222eca43e0e33304c05939e44f5754e7ede6ad2f6268fc142619351163e7b34778a5c7807ead0695d07113e7a11c176a94021c3ed9d0cef3e4b274ae293aed5d9d3e9cfc45e35f5dd2d4b4ae761229b05f8c81db99330c207131b319a13d527980cbc82cb0704fc465ea75f02c4cf9bcb9c320a9721e27a4e9c333133737412cf8af2b3692334d3c4a0fa6b0d6eec86f69c1f88582c6d7645c9cbec53a8a47658ec3e1de06c9cf5fa67e4031e6db6895b6ae9315f67339fa290511850ffdf64f1dd5ed66c08cfd53fecfda9b66c7b49d9fa242a835a9da124ac62891871c1fa5be35e0ad9eb2b27ce3cd42e767ed91e4486bba2ce72df8c112bdd0b79b3562ee5f531d0f01a97f64238ea8b28f054fe4f37b6ae859f56d17acea721d3b7eac6f3d7a85f2e8930bf1856b8ac75cde72eadbed59d53f717cb8cb54c56589f60c995801e94391fc4724e35f0551e3b301f17e40584ee415819b3b7fc12d92f3429c3b54079acc852647a023279c2d036a6e29d480618a9df651e150166a137efcc2e309c3f72b8bb590cad436477909f0b8b0d94b9e6c7e1d682d248d67403c55ce1ca82ce8207b626e4ba6d737a16c7612a61e93984dd6c28a46f281fb34122bcb7c248ae39207674ae287a1f79387df61395cb6679443e482493926bf10290ff5666ae014d6b82b6bf139ddd89a9e34460640b3caf0b70485f4d37ab6ab6362429ad0c8658b76b900602ae8ccad4bfa3582bc323ae946d1b75e44d88ca86d0e5f637a6150882ae0f6aae405ea12d6df77ac663e28ab6e63ac9d3b8082c951d2f83df4550f2e645d4892498c52a3dc023f4bbc5500a3dd810a382966ea97d0697cb4fbb338a4f0b078f367ba4938059f5ed83a54f39788bb8404c35309bb49943d730237444bcd1467f268d8c83c6356bd751820ee3c9c576d3e538d5a87d63e0fa4d35ec0ecc6c08976f9c768e593d7229d4f3e4670f7063698fd873ed5712c0bbc2fcb87a08c432d3523798cf0119d51270496dd5e2fe3e56132962dee12d2c2f3c8f41f8fb29fc13975fe24ac35d696fc52bde035f4134584a005936c80a4102fb56d517fbca6b689da0b0cbe0652848599c0737597fbae03741fb0bd756fd40ae849d8c15ebbdb1adcfce40091323cd7f0a2d06f0fcba69a35c0db345b3170d6d03b7cccaec060b39402f8ee244c649b2523db53c25b6b4ce6512e08d2dec88ec22b203a2901ce5f433f6748b6aff81085733a1174ec4a3c55219f0962c00d8dca47fb4953f768e0a7b45f2147cbb8fd0871a2f180d82af43d00b3cb0b88fd63ec21e89e1e2221d69c7bf8a01cac477750127a4d4e99ad4c9bb999ef51e493b8c8e39c305fa0b86284dcf6c1e714c40330316d555eddba7674a83d2bbc8762a22f69d4ae2ff64381a2fe68a6a2e07871d4f27a9df04aff1ee0ba714262ccd301c7c3e4f18ec3e05a0f9d49c0bf6bb287fc7611aaacda61533305e7b488d4e03701f8d26632847e523797198d2ee4c8c8865cf1876e9b2bcfc1cdfbe6271a231922616a2aaf372894f6f30d28b065e3274f89faf3e02a24b0a541f3d5995d509511d0eba57da48e857f40882b2a65683b1a48d59bcd823f34094b754365c2db67dee8857b277a206a21f42de6ed2c55fd11ffd8d665114c780d8b7de7e685dc7f6fb36b05db99afb5fb745d74984524677c6babd41bc08b1228a2288dbc19af134abd271d76de955e0c5f4aee350a12487ed1013310a72ae9bc44af61a650d1a8b3f006044ae90930423b0b45a9d669502b90bdb098f9b4ecc5c8622e7429a0dbcef72b0cf84c865a8e938138af67523985787f0ab9b97da16f9cc888beafe8823e0a02b8b200756d81ee15adeabfc0eab9e6a3180a6f7c7bb1dacc65de75bd082d13b1b5fd055c487c6f1bc423ece879ee7f87348cecb87b6a8513032635bd29017deb751c9e08582117b880f6c355db47ad76de14a141da2bb894063cadd5c70520ba0015b286f61eabed0d88ded949251b40a1a23b151a1877329e86cdbdb1310936f05cb4550e069192a93af62573c4b708ab221d94210b874e5825bd6b2c52e78e8644773420f3759c654ba1e5d258ade0963191b5a1dd2a1ddaca4669666deb77496021ed3a14f0ac93b0c7babdc59789ae8a7280149a8d38d1ff581fa38b94c16ee8654ca1b6507a9a2b8b0bbb06b58d49e109e2d9019766926667e3fb0c2c2a41e783f7e9eff953e86750555e0d24aec890e9951583924fe18987eb161cdb84b13161c8d41caadf7e0bd6f64ee815053ccc00bc967c84584fcdbe49890a747cb647d014d48deeaa024afde198581960957923c48d94b32e93af7f9eecf7c635c68c2742cec1c880f20207dde5f8ad586e55d6f0987ee5b2519fe8cef1379f8dce8b39a42e38889f7e1e4c6aa3066b780d7ef584c3fba1b54cb268ac10ea5db8aaf13f1ee2136dd87325541233fbee10f25b3d1515bfbf8ce2e3c66bb0867ff1ae219f8805caad54b0a3191ed46f7e61d18020c3c9d8f475d077e188218459fd796c46b7598899898b03a0464140a2154bb93cea55f60d6d6742781cb0494b0954483360abf280d7460b52d3fe84d95b60ac9ed9b977cd6b65cc9cfbe7b08dbfe3af58c2e8d8b847271e0bc4542c1989982a0a22f5453e0852eb76d6eb362ffe82e709133431e846acb9184fb4f44918fe97389528384c01f81eefc1a1fb7157b3b864a2007111d5fb554a6d0ff87097af4ccca2db136b7e23f79d6aaad245ff998800442ab84a424ba24ff38599655418db7c07da9376e5a474a9c7d81668f8acdbe6e17c3f49035e01954d57538a98ad3667d2b332916cedefb47e5202d76441e6acdef3c748ad0fcc267698327f32b8331bf3234590be98077ff14537119c4f2dcc7f64c25f2f76bb187dbcba8e5a227b4f41d43a56b6449279adeca752e449362c7d0818fd99a4baa620e7e057426b15b43daf1832c4219959dbc6534b6667d13312c8ab12d38f7f5ea7f8b69498eb8abaf8a716db958eb8706451414f956e505758890ccc4bcdb44e3ae04d1d2a21603c53367a9e6eb009d4171bba4779cba21816fe0ce2c371dbb09f018c59ca15813e0a04119475bab3c1f0d3ca79884a1ba3d8f264367db973ca699a26bba920aeffb8c98d4acd309a8eafc04f52a4f5d4ce1adda7e0dc7d89e759e2ff479463e34a5676f56f796f6ad4e5ee454660dd642cfb5a874d4886a402ce029744bcefe5f81bedb06b1dd5b1f63d6da35bf22636efe884ae42582bf46baf6e0592385a31c853d564e89ab538bc12ed56fceb7dfb3e037b93d70ae7c315edab48a9c561ccd9dc91955660d371eef1548c88cdb8acb9fbe5ddc4cf7e4f461c335e0f8a3e8f2bfa8e3ce1227b17cbb943fec9e811eb3be16b4bb442d3cacf352dc9feb05c0ee0b3f044dca5477f3994cd25088209bf36fdd82424d8d695d0c5a722aee9ecf28c352958b2882a901e93c4c10ca49e7973e17f96fd56b99efa37dc15a2f45ced1cd63b972b18c1f1d7a7fb6dbe4e483b91a6d842d8e141f3bba1277310b41acee62472f184d24aa2e6423a3943c05e408a20231099174373c763e690950b0ea6e31075d414818c4536aca58f98f5ebebe3488b4a1ffd1e023ea9df786666643d2a4b729f0060eb53886182a9f03435cd75f318c2549a79366761dddd71ddc21d5ff01aec0c9a33d4fb649f99759a393764df9c3db4119e8d73b53dac303a8ffa3f92936ca1f4abf8d0629837090a863d85775d3d4e26e99dcf03cca4c9cf32c9d98154e391b6c5ce72f28e912181ee7fda8046181f69caa360506644df207ee55e8a17223bcdb3719518dcbee8796a0a5ca43003a757a841e88563cd4b72eec2c62f2b081a60213e25b810ea0fcea7dad26861dd7ed56c98767fb7b5a5a6aee612b843a9930bfe15bbf25b6c2aecb170361c67faf22a5066ac01b1c4c9f416b13f4a1081604bd2054f9e46363b67866577d0c621046f7188ce6397ac60844e8d8a818ef1fa09e851958bb252381b84afc7f382fbfb9d7c857fcd79fc8acfaa2f78f88ce3899e0cf7146b5011880d1a1946103572b4eb3092ecc77c4d744d03229a4be0599007439da4ef36fc69c5f59b229a46e13c616064829997155caf03bb0fc07dcefba8477adce1d668edabd14a708fa5a496950148901429609dbafafe7d6ee9432376415a9d4ccdeb11446da6a17bfc3015c6c449a0c9a371fbcb7b24c9d75757ffdfca3f0c043d91124c776ec3b5083ff0cf93448ac917acd9ebb2bf44aa4f5d78b138c50cea407ea53887ba4c162dee9ad00aa1e7ae861a8219aedcade0f05b14374f8d12cc7562a4058c2620308902948dfe6099b0d6ab962ca116d6d97668413fe562fd1a6308ac0f25e8034d8366781757775c88417709273b14e5775f4aaae8d7592b848a2eea62cfbfba52884742dff83cb50b1ce52b31c2896077430c9b3e633e9784b6876e32d065276df0451a1d32c0cc6fbd87e75b93049d37e6caa0fc6ca82250742229863dc0c0dd58ea17249bd06bf7856b3e28d0f5959e9dfd0de7552a892821c1e9cebd1b54aae2bd5adcc79d6937997a086f2ac7e8d1491a27ecfa0e6bddf443b797689d04d576469934cd21fc9f80e65b1c8100fbf423a0a1ddf908dd24ff14bf8f05b9fc8506e4b8a90be677da9560c2afc83de491cc4b97f94403abac0f0a194fe64be626019bf8426dca240383b6b8b7f8ee2d330d5efad6939ccd898bd0d0d8e0142389737439d98512164a7c1a6882194e72292abb10cb6590c0ca258fc4eb274ea4e3c342bf379927aa4477b962f150394ea6832831c8fccf69a5d8a0b32128e18a4344f1551cb06d2950222ba23b1c8c89655dddab670f4846308349cb9c0232deec73a8f44e26fe46f03eb45e5818b704bc967528a9e3620ab508089ca2b9588d23a9b664742892c6927e758dc1223fd388b65fae4fb55b416935de3d050b654918b8e9f78d91b49b994a69c179e1a2d80789b4e1a70843111a8d3bb7350fcba57d154838bbc1dea4f9159001b5bdc71f35a629f69448d2650fa0032919423aa1ca27b606a6fb4256346dbd0a60e3384f5bc9e1f177a4205e8be892ca8f6919246029471131f4efa04f69f26a3d23a3ca07a57a993acda25b63457e1254400a61d9e4e5cdfc13199bc835bd22a848d6fe05801ae7b8fa8a10b30bb7d9c8e4cb583e8aa5ae4830c9f14b933354dee709f909c1df1c744e6124d06a7708e5b1dee475f0a2c06719bdddbc88e4e43b50733fb956e4033bddba17c3c2b66047f32f304e54f56db386d4a0d10e52f93b8440a164719928625ef4a683e9666a56b0320717c0f9f14fb5edf9fce986b23cff84a2aee5271ce5f9798bafa4fe6f6c7e7812711692e83363c017b946c0f91d6f8be40eacf2fb827bae3d54d6d4f9387b8e92f3f82a1392b25f22f64174a19e14149a533725048908b6292200567ed9fe2010c1a7ea3347727ee569d472d03e260065991e26af101c251ba23a7d7480643295fb203d5b7a3b3e6e25af36a9c47ad7b9c38498e771dcfcf31574b8390c9191075abab3f89d01bd559effae6fd0c75e488cfc6379b8bb0dd3be1f5374c87758c011ab5b0313a0b34a32375b190eaea9760f336c664952e07beabfc838b9b8a81a5c420bc1d2856a83b67e6ec93c1b6258aaeca26b04145cf218cefd7b613aa83e3b9cdeee9fb3f1f228bbd6ae65f874212705c407752a0b1d740caae552627de4ea66e87360a180e31827b7c9fb0835d9c7ab168706ff865dfc7e1deb6e85d1a544baf53944d11fa0f6cf35c6355e202dbcecc76c52f3d188a43db6cc9dd73a4f8469a824b196f62124d32370f5a85ea45c14abfd037b752383cb7c5ce4725f42251b4ddcef8b6ad07e5449de1e58cb0fe500f6251ca865ad36c08340110ece19144bab4cece6964cfe2cc3bd1d29d1f193260ce92e734034630f2a35dc34103de3a7dd0e8b8c03d6edd8dd277ab4a7785710528ba32afe6a9225ae4c188bc5ebd50634fba8cc59ea7aaf3c7d0d052325daa473d2871e2f3161fccc44876a1c79595f6a46366296ed1b0c1cc49bd5cab8e05f59855139b602dbb0e1825889b2315de3594e6883d720db5558ab61b58efb142ae4c35b26a14972fd034ce7a9c831207f2a17aafe4de3d0bd1dce621babaed2fc8e1f561660b9626a7902a80d0ea0867508c9c0236c2900dd38d595b3d1c5e5d787b3dd92a23edec5716aa1e56d28f1987b215ce02664fa6b212ac3c842ebb7c579b3881c61ebebced8a06acdacb30ccdaaeda6ea8dcf57cbeff0eaa54252f18709be6c46358d9656054aebb848c7cd1b53223f36e94a5262215b004176f6963f05102b736dde71a69ffc688758c0961515525228552c4f630ec468399d151891721bb00a3a1ab5a92fd29ba2f3f465784c904adae0b00190ca8b0ff5cf003e63c258a2dde978f139c25b7f591c064e854521d02336fa3ed5953f9e6b66795c1a3c58affa386f8e752d4d57b8b57a88a4bbd31a297bc82da93217c67f803278cc3b8c6618154445edadf6e512e79dddfd81383ccebeadbe3ecf42e7ad28a18880963254c9e661bff80a7c84f7d7c53aa7fe71afb3c5004ce2e37ce595e88c642599718affcbf64c904780f035931b5c98985693ff9c6403a2b10be6750e6eebc11867ea182f0134ab5bb5c79a5fb7f527750958cb0e08229b4377591d30f91d1a534ff23e87f5c2054c11a57ba12fa3c2b976c00c1346185f5ce14de8ae218266e45ddddf98344364f4f214178f6954bcee6855bd3296b610e0fb69c8bd219aad27987fa31879e4743006e5e0f92d6bd15cf2f4b95fa0d8b7218ab21647b0bb1c0b83fd16ef26d9148d389bb09c5963cf9c9d4f6f539d827fa269cbe81c815c4f0752eb32d86352ba3e3e0427b78244d1e360c5504f830394b40948ccc8686a6578759b6991a4df92984876467262e6636642cd55877420344bc6569715e12071e692a7cb22711d90feb500f83d3df3f1c32f2183ef4fae32de6e8afdcef1facf6bbd531703d0a2a8838a503aabeb506bbf9fb87e2836082e1c9c55b0e5c082c0005b62a7778580858ac9d4d82171888b2c605d24b137281cc4556faf70d786dcbd9ecb11836b15e5fd7ea078399ddbeea4c4394fce1c704fde18a3588ba080cec67ea2bc3312cacb2a500d60b8e54ef07e95b3ef689ededb284e8c9c30b587443c77a1628cb3340ca7796768fafdd32442bc2b182d8c30fa54967c312894179aeb37e6002bf92f76af8adf5c12a0a43a7b419a178ca582d4e7190fa735411f01b8246ddc10d866916bee3dc55b59e58facc2713350bdeec614c937012efd402a99c5ca83b1c801d879c456ec4ae621d58c01d65680e52329ad87700789000a5c802ec7734bd7048b6b03fa009bc98e4a7eb2c34d3bd5b811042424680f5bc6c257cc32726f24995f53cd1ff4c746631f090e60892fa7b9e7d1f0d683121e2fa89b09d8594974064b33d11a9ea517200b2d570355eeb9a39f8cae722f970053879cba5ffb90c551e72adaebbdd15fefdfa0f3cf4e04ef9b67f9fab96bfb5d72d6cbf196fa98f1ee1e878ffa145c9bc4aa3e411954494aff8b80bdd7049fb3c814ec70dbdb414c34db693d6f5787592a0f1ebf7c1b89bfcb3fff936d7d7cc07326a52a57206c33ab8571101a11ce9245a6196e1e5f922edd50a3ad03b8e36fcc21667453c4399b0f4ee39f15550985c911cce8d26cf7ab1b815e7216a8e96b8a812462207f8a51e9a54923138a0ac220bd00bb11ef91e1e79f53ac8a70783e7a6998680e36000d002d53ba97fd51a09774f18d9a4220ce50c39fe527ae1024f2f285848ae29af638a1f5eb056305609f5e15cabd7b90f15442765684a010cfe570db9ba66de5ada9bdcc9456a3957bfb48d7f8051ab2234dcce2b8b01ae557c182a8e9500d4867951925f01016cd52046d8325f45add9128200fcd952cbc13230d6ef0563b0bdaafc71ae3c4f3f6e68d5b873f164fa1b479ae98428bb1e3cc034dc658b8ea4980e0fdf7adf91d61992d50a36597734fece06d591028ac47ccc25d7d988101e6b5cb656c34e362af5094e92c20e0d1f3c36dbe2f8cfa0a84372210ba20357e76f18e47e3e4006f1cfa400d087a61fcd2f101b11befeaafdb2994576a78f75839b6a69174175af485abc0e0a6dd81e12377ef180101d3f6d21c36eb58ba64c26f12a1d97c086ca5846a36eb3462bf35697fffc9bc1b97d0266f85c8118dc6594cf4ca82fb8405433583610c50642728ab66df25b1bb94c5efba828b7df6eeaec9530cc9ea33106e18a71790e0e4e531247379efde8299d39980e50a9176e18ce6aa82ff11b5c7f1694ea16294f737bcff2a0d9b4b26bd39db9d4961a32210e5321c667a95be90acac699a906accaf29ef36762e878789970f13fe6160db446ad1d868fc6857e68ee66d6d085b863ed18846e55e501a8aed72dcf5f08bb7ff70b48e50a144e7a037d214043015c69b0f18f16fdb7f9166dfb55a68480567cadb4fb21fe84559bf57e35285b43e3aeb1e5ac4feee183e701a834a55b0cd4b2f61eb9f37ca8a9e1efdc97921304be01b18e1d8a2d50f2c7978d090590f5c8ad4ace6b78b551e65cea365c8e352c5b4d6ae57c5a32e6eb632426b6e6cfb290198222b29705b4219c632e95124ea3d35f2925e45358733ba4ad75a7490ee8e77f8c623bdd3ba5a7c054e922fb8269e684ae154ecc668738bafe1a0188dd3beda462d254bccbb8187a9cc0af38f7b86ba2750b4a83b7a69da5a8316aec1db8a4f1fae550f37deea4ae9d47ece3f63fcb8abd655a94e4a13c3dcea1c662ff564e18662602ee74df9841be146c1c537454c28c53f4ccdac8c632c4991e8eacc8671782fec92f9b7d2495692f01880d715eeb4be0389c94533b93703818e330155076f9aa9be168007635b1f526d1ae5c92df354b5595c8f6bed3cde41ad916a3ee440ba1b65a93bae9994c4f8e601e079493963ee67061874ed5da40cdc0dad7247f68596979ab7105188584309ab480e699430b5a433b3c3013fbd4a1103ee8b570ddae0e9bc2f4567a94da0d98b2f182c944f3b919caf8c009fb15b91057713ee370272adcd8199de644ded7c908803c28b47eea19f486e21cf39d0576605ad7018612958263f1e672d044026f20eb1998ce3a4eb5704353e56b9b34b852dc948dc9bdbf1e8ea0a92a11c0e69c1ddfe16f39449f730681897cab56c9ac9b7d010005b1a93201adcdeb8a75390c6ff54b5bde37028332de40ec70694ce8fecd780f66c031cbfd4aa7c7d4383e5db1d2451baec921a76bbfceeaaee1530d7bec19525713c63f37a1b18df145dcbed6e981d600a6e1ec26b540e92601e841eb7114379313738f413fbade80b2f501f9bea60d12a43a045780cb4b373aa6d610e206ca386b99ec7fa1ab6681a9320bb86402d6456a8866ef352efd816affa080c327aeb164b11c3a51c467a5c78ee303787b0ac4ff528feec12ca3914f778d57b31d8a7eb2b8763d95fc40662d230d0b38b0e5054c775ff232cca8182b3896e6c8d1a2deb67ef93701b60768ab267073c7c89a070257ab1c771f9859c63414cb4f7b00371efde5d423028016cd0110c06e83069ccc4b26762deb14628080bf62b3700526069166038d95e9b1b1124775efc20bab823a52505ba008f3be66d99009d7730983766a9101f6ec5da1c69405036fe5de161db26d6ea785083ac9114148221fb14858b5f911a561296961b2fb232b0adc013b6802a2df0a766aa0524007f932a585782a54be574ef37a4db1095cce6be681302874a9fb8b1f992e2e0fe8ddbb4e84898cc168153e21d70f2bb2c8b9492782e169a753d9cb525e8d49a2500d34eb0a2e938ed7307563d48b321749501595da7af439ccf5861677e3b90632669029110ba5d59e2bb4b6f832425830e954a04d994421dc8a739c9878282fcdc5a928e20cfb8498b4687f921469938265809e04fd7ad21a0773a96e034b02f066edc0fd0afbd445f88487a72973d333ca5037a2d9f90c5eb0619616dc4c575d80569d9827e26a277d841586f9eef6394a325b5a9da5816b0690c558aa29a1331c55c38ec713216efbfb9322ff24cdc82e4d4034b3d65ea8c84efefbd3e5b116471a9920b77088a9d898fcb49cf8c4db764fbebb39b39d7b7b25b121d7ef7958930de12ab652153b0e893673c23b12b60c96f8a7c28d0ba6b5fccfa50594cfa6890e32988cf4ac0cd60480a57a84e4e25f21ac2eed7c9ed841fad933e2777f7f09a13bcf80988dae86dbe877d4e2e6d57c49d22625db425d9c44611310c5f46514c1a2c0f6b61ff1620410c05dcba6e427b9650d3baa8ab87e031f5a8cab39c1fde0be43302f8404f5571e5af37901145875c1d3fce05d7f777e1ef2f012850594b004888133fac7d0e4dff2b04711364bc49509c2f7e629b3a4f991497d542efa31b4eab2e0625f9d3272247e1c4030f9a19416fb5935622bcace9f200fbd6b7704e655e223135a99f78ff664764b0174a824c4ee3b0192c2768094d7c30fc2ed5f70cc6ab68fa1b493902d21cad675f0934c31e77b79fd45011bd0e6c6fa386f39f942d62ba5adfe773eb958318a52ba4c81e075e1411f7538ae17ad9d89d7f6875940226f6d00f823a9c58ef23480e25949414a5f090ccea2542db643f22c2560e906ce76684a618e231164ebace175f8b31e3bfed98153775b3a2004dc9314832d5ae47daf51ee6a813b073832949408cf1ad7cfcfc7f51cd2bd4bdd969751863183fe118995b7a268f35ce53443b6e12cfa4bc34c084e6d3e9215b6b51e477cf5248998da802478bb3192781efc22bfd2b2f85fb536a2e55e0295c094f92ae205a15bbf77e709b5a6b8157832c2d3e67669fb054c1f37c535fccfa7e409f4cd81fe8fabcf52ea3991ccc37016b661ff5bdd1d362ecb0d547a4351d567e1a839ca9e3c5bf27a9769528d86762e0358b7cb1b5a51115ea31c2afa086c93865c2410096e29f320b21f1c0887f25bcc50b320934fc9daf1d6589cfd66bc267f77d1128003c18b5c9ac345e883ac5ee11c5c41f543df29718dcda23807b1736fcaf2613003844b709a76c35d89173668af77459416981f036830aeef0eaeb1ca09d711bea22350f2a49db81dfe1b5a97886d6a15cb98190dbcbb877a3fdf629c30f16a6dbc2d674285f746fb1c2e4dc81f42b52f064ffb8a32da578d4ce9b76abef5a91947760496d1281804ab6f5bc079e19f02fc1ac63f76402f7a01beda48a08230a9dee6de6b8c8998cece6a4b3d3a37e880dedabe170153c9abc9541140cd00b9be5a0678cfbb72f268f145f265eaa781c34e8572b96327a64fe48d57827d492fa52f48907c0726062fd737640661d835221668cbcfd44c18b8debdf7c4efc016d4def3660e89921e037c27c7cb8c350741ccf2ac9b16c7ec14acc7e4b10d25ebd205d7728224187ea93867da359a8a6ad25d56a6e55c9b56c7b5ee3abe763d6b672725238c8c6037e8435fbcad8120f61617690bb2c454aed5e3c3a96f7d9c09342a3170040ba6e8d29021c70326cb3b8187e14c9aa1465b010a933724962ee485d4a46e1aa9d2d34d485827f3cfe37039050029d6d9625888806cdd36c0e1735c0ef6da4e709518ac074949a3c299b54168abce3198140d1de4d1bd92e48d59daa82abf6efe19c71cbc62f58b4efe1290d3e53381f0fe6915aa39492fad9e830408fabd9f25f0aceff1d41e9f51670e3cde28d1f89dcca8c1205df05b2e6c49ce41a81a9bd1907fb8fd2827f41952e5cb779f1401f3893b6a09bd0aebaab5b136590235e02f74f98fd49390757d8e55df118b7accaebeff5e707b4c2dc06e0cdf03d6444b63ddf3f2b7642e585774130b8433a322f989b485f6947a1e9f961a9dfe9fc3ef02228fa1586503d389ccf054d5c5c75c3bd96e065180487783ece3d78f79fd925ddda2c371ffa5fcce34c1e1462d54090d56ad53fc0090617983fc9778893d016ffdd7d809d440149b3447c6567ab62e4b43a90c784f4d42c777dff2554775e325d1c3100bfaa1bb997aaeae09f5c8ec8418345aed6d18de9855388c3fc992e3dc70ddebbf76cceb7fe39883301da39e36de59900d16d9db725f864746823bb16eb2820f1f6e4f39a3026e90d14a0f773fe6ff0ee3cfc8ba0884e0fed0e24c5a4f97c6d0e5ed7e07606e06aa4d5171cb43105dde426b9f227e69800a77f0797874bc401cf356cbfc83f8ff46cf1a38163d58199403ff40ab0177d994b63771332b0a7adf6674aa05b720dfe350fe87907ce62cfbe711c34b75a3e6eef46582058425ceb36c6e28e091e262054059cac5b54050ce32e8c3174db761ab30fc66972d95cd0d64961633405807e0d007556f5102dc2a49007832771b84cc8253c71bd62b07fea9e4772a7ec7aab58b23316faa9baac9a6f32395c986bd4398077f13cf5d2c0ddf0e6ebc469f46eeaf22f1e21714ecb417406a1b90192da3f1d4495c24cf6ffd5d101283b4649796ce7d5a802891d59ece54cebee724ea25adbb4f35512ba0d03570b1990b77c0578cd3364b7e51def8863d4268d1d6f3ec90d2bab2f557233d0d94e1a364474485c72e07cc9f90dd393aa587200c7680cb7e0011238712be6eddae7d5658a5f87a60432fcf767210978716a2283cb0220e5f9724a85107dbe64019e2763722dc8c6319909ccd96161512e216b137d044536ff5eca2434182c31c0662e620cc56752162d5b3fc894812f3b6eb862b4d7b8da5921f73e5d03dc8599526509cdbda1d6e8d80198018a5a91665a9d9fa7b3e841b769834d97d49932971db5659070201c4116ff76a0ee14eac2ca39ebd5baf84eebbf3cf8c2e3af8bad70d973f1067d12744c4b652ce27c2c1b80112115cdca62fff9e27de482a5ea08c6a63b633c514c73b3b52aaa47b1d79a65ede2f58f5b8cf5caea9070050d4159c71c0b9a4d6b552531ecedfec19e61b69ce0591ff82c6197f73478eb6b8fa7e62743169c92b5dbddd52c185029dfe5b558c7af6c7a919dd947c7492798112fd9772a62303014c62702ef28846a4279d129118662791a8ad1c157b9095dc022165cae6f190824e5841cab8c67a9ccbb432a5f18b8d2d3c89c57251bd22d4b62e4865c1d230c32b4b81b825fb074665699c8507af4c97bf4582ee10a1829b3994710b27e19cc96a1d4a8b8385e9b3b95b13694750eea4820d7917b322e6817dd048ef06d7bb21069cb5e5faae526cc71d9823d58635d49cc3221eb57db3aa779b5d38d94c87261048282fabe0afb000f5c53a3ffdd98b3eee06d37c8536e50fbb6b54f197a94bf8ea7ee7036feb187fbe2dfe1cd57637a54acb74ba3bf009e1bbe308a2041c61584b1644fa562000ee0320f33f50d34ed1900cecb47f91eb82a2ccfce0c8707651e422e913aea2ccee913e8ec318dd4aadfd9f687c8d27e61d30695ca6599c07f7b0a8c03d2f0f4859cb69d082462aac6634c59928942cbed1a5a18e439f5e9a3e8dda433d092d38f4a1e2dac01f36cb7cf9e0ef41b21cd4e9898557d15c1318a884a3090364245b86af30149a19866506f0d5e80d8f946142bd4930761b994c6fee386a891704809442f8b43fa770185123c9dddb3918e6c9ebfae5adfe866f66c0627553982f7cff6112636462ab2aba37c4f6ce5cc77e3570354785c2436e49d1d774ca2b9b8299805896a4a88390ad8d821e0c96f8efe651e4f7da2bab403a1c7fb3c74529390ad51ada3c59fa0b02bd22198a3ea84e291957a0554f22948ae7262f74fc312b1dbfe4363a32c04f7d126561e88d0806e2658c38e83d88ce9ce88bffefba70cad88c090f9ad9c9f5c7f933e80b69862dbf43bfc3f0c726eac154eb71e6a8db358a60670b5a310b6541c22c2d81dd250fea72f899a641570219215d52145c703d39008b6e5d31775ca33c57db4818a6909f69ec5ab55a5a6c680775d281c593cb21efc3dffd4a1b78519a893d259d525ee0a9c8e980c9d339c348dd0315746f14b1d2276e5b34c83c60be9ee5bc173c5a7ef69a5fc66a93482a6cbb45690d0ee970e577ca1998c614abb5f35711e00bcb9f90fc50e84b8e47cabad62526873921bf58b5f8bce088c99cc48a377114c0699796897242ffb2d7e2ff4e334cbc1330d3ae17b92e004a56c937c58a6a44b386bda191846ba8d140d2a09bf46f374987d330d8789607a353f5b84bf979db1fcf591174074e6fa06141bc046725d481b39c60ecd7d1a5cd9246f3485719911c2e8a8cc71ee9b7897ab385dc5836d28aa8de7da5b44a6b16545267a718db680765bde65630bb513be1fd796097da98d13ff347daf38a8e535035682b3c530fca9438f7596c07b04ca338132899c851a09b0f0b9cd22807fd9ad4188c16b68bf28ef36a1b1942d474886d7d87518e2bb7b8fa8cabf6ff95038f39e724b979a600f73526f0bcbc59155c609ab86f5e13a009ef1c201616d9f3dfd08816988631464ea60baa276b8f114a8b25d11aa70871de5928f7c6924e22bfd23f8a9330e5144f429573b65d72c21697a070924a2ba0c96fb84b83bc369809b41dea790ec0ce2205e695cdf5e74f53a268ca6d222b21b134638ff7bc1752482f8c47c3bc972d15be545b56601eaf81b55f0d0d3c1eb7aa26dcaf3831ed471bf02cd247df61dd4a6919688ff15bf80b1f16f4d017a30d7121fccbd875372f28d585797202fbbd9cf499ab0082c1dc4cb12303689fbfa89f73765943e4e9c8615c9ecfbcdcc0554a06fb192ae3bd403e834b1adfb0fbf1e06e4f8e921afe7fe707fd0ec9aa0150249c80dbeadd8c3b00e409f83501c10450830edcb9c578e443ed9a81130731c15e41cc04bb00d0c19e06d28f873915cee7b67fd4bf4f1e56fa0f53a127d00337bef1b0daad2867259ead6dc3926d096c053bbec653f99cfd89e433ef5332b0eab9cf96ec78f7e4b9284330729fc23464064200f9e6a9d1da6b487db3c210763d0b6d3bb3070ea95b5d2604946214aecab35051e2f8bf9262be2bb49125ba70a599fbc0377f029a79f32460dfb0df9ee305211a2b4d190a82130b26a0fdad7270e88a5b455d73dc8bce88e1c9f4f6e02a2d9a558a1631406d2db441b32c513dd7b2c3739be0d2d5ea4b5b4a460d3d90af5f9ec20337c7c2c784cb9fd796b1b4e2ad9615a258bd11ac8e92652188896e7799e57f7f249ec23233294b88c8151b5995739219ef0fa17eea76493ee56ddd7c5cd47ff779c361a83f2d1407c584a4c9b64193f61d14bae8bfdd45d151484fcbd61566cae7b8f1eb51e8c958e398fab2bfa08c2c8f8611bdc7466b23230bc2469be14d2c9aa20de768e4368a6ed3848867296d88a165b009de62a00a4f512c93ff57a70dde11ab1078a74b5115be11e43c39517a5ca141346654353c9094d0d4bf35ceb90f383776c47d57420a0721040966b6c1d62e0e997f7c2d3bab51e0be7549c17982bf84e6950901acbb71a44458ef48191c6a7bc6965f61624b48fcfe41ea4c1d54327cb34f7ac221d063b2e0b25520fb4db3523d39be5f20c85ee5a5d88c7da538110dd9fda0d0a62e2391945220732a02885e7b98d0a58009d00a3a723ffb9e5470aaf7e0ef1eb2012ad42522930da389e2b7b8bf6dd8dd44687c5a40585df8dced13e219fc298c74662d9714039092aa6c3e1642880c6f8d4d5243dd87be90fdcf3fbdd9bf5813124fcd7bf3dbcab63201e88d252c876ac5194b4f6d086296d5935ffcfc5cb99cb54b966906a39cc28695a1851906484b392c27b7d195917dabc9f5b3958969dc0cecb925d8f55639722da479ff0d2c232c87d3981ef17a9ab12cc8a61b04ae12edca7f2a48f363c9d18d6d5819b19ee19003bd2e87455418272156ad11ebe17492f9dfb1d3e128689c15a16844f473e628f61fabd0b88fadbdf124eea6dad220042b32e11d87c6a1d5787dc6761127566bdab8357ed1b4768f90d6611483161d22b4a8389186d6996f643496734388306ce548ec410c36c00198ff25ac2f229b9ed53a29581cc744e2e7d8d92490dd28360c14c93598baac073f86fa123f80c531a66e8affc021df8e749432c82839a3bd28122108a8442bebac3434c8a16512ab55955018555f867b7642b9db597894a75ab0000c81f2d1ba821a1a87a1b3ec952e4d2cb8286934537700c6a8603d545bd127f6cfd3e51b35422d0b2e2f007e9a55c284005ddc70d85b2f8df037d3c75406614e0e6a1c077ed9d8d5632779eb870c6ffea54f21ce636b58c94e3a5c437c7d6976d98b3cfa85bde04e2de1553ab7a214abf4ef299652a954418e423bb0da3b49a2d341cbd563cf535779fd9630e88c4de16c02a17d7c36ffe88c10f29c1558e764ba7925ef6c544493b7cdaa8c64c604378ba3a02986fd92a4acdd341a8c0c7bb3f1f7d9d9b7ee58154979b526944e9f7751faa3274230904d4011379cf228be33625d4cec99b9baef68f972fa9f3211a9576535938589bed476b56a5729cb1d9707d4cf43fd6ed0b4905db78439c4318620aec3353342d9203c745d171e85652ada68c2171b556c98ef3f8b0b54a9d2cc0e83c6e5c83ff7c4a6ff5ba22e18d42cddedce718e217d9a21d08d61bebd244b612990112b9fe9cdec3872d4be6d386a73ebb4db0ba5d9f7e21476f6e9ff929a608f52fc711a40d68bb7fae3b06a76718dc9836f5b2cf5a0eb86b529d33183692b028de22db2127c7201a1522de8f22716d09b6cbf1c49b72fb7bd212cc57280db71fc19b9d210a6aa08410440ef76b5f40f73fdf1b7abb41b532e84a03d65dc1c8fe63badb0f5227ab847eb58772ce7dc80bac4287e1e1f5677e908d91a035e5808e9c907eef7876ccde5de7987da71a8f81ae3402dbce411f4515d24fd23bf26d7005d4794ccb965ba56dd83c7cbdfee0cbda9ff7005a1c6ad912a44754dae1a1da6ac49bf288bb8f89c8e7df2d49d98e0c92a304bed8974b46f3b0846296b6dcdc1910f82adfe392decbeb5711772e9f89cd384dcb39c44a1ee077eac184bcb95133c273b7654fbc32ca2a19d783555687aa08388391ab83687ba635e7c8117a620d2658e203fdd06f835623bdc0a9d1f67ea1899e5ec8ffe6224d1db6b3fab67e1252a5ec256ce229ffd39d41259bad1d69a46ce425a005628427d395c0971d0711cc7443e23f3e34b53066a47ce124d8a70c7fd9bf5d61716309d63bfd3aff346054cd1ea73bf0eefa90a1b8cc407069946ddc5b35f7affb6a2bdaddd9792c056c9aba563027e1dccb3119e25f723815bc87de3cbcc770ccbc8ace611f10e47dbe7bad85a2a77b17249c3cafcdd1ddac81f09bb8f70aaf17cb8ca28a5c3a4ea836ed7153f86773a160bf24457ba03809a6469a292ae03a58981a8b1fd87c42431a23ca944501a3c8be85c339c32aae8344a51882a537362f392112efd0a0f62e1b89ce5abe7b08e50a1a3788f8f5dc9e27d7acefde45394b27f77cd22ffbcb26002665e29161b6a908a2801615842cff2491dc1c32a4319dcf622f9a438eee9a029eb80f8bf9e3507a5b7ea938d7cd82169964b6e7d08118982b1328c5316951d699ce2b967607a94df334ec8db489cde8f03f85c1953dae353bc7580d248af29958f941655da334a4135a24539e0e9b88bd898e944d0005640dfd4fe42691ac8b002d08bb1f63c602bf4fed452c190a7b00d93e16cbbe4d24eef721a64d3c84063a32a86539dde55e826264557fce17c04e130918369ab05f5efa631156d2c60f7469b5ccd7ac47dad4714a4524af2a9586f3908d7b2b8a6803f3d6fb58d5a25a412963ac1417ae9edbe25ae17a05e2debc7b470bbaa96e75c3a5966d9daecef89f8b201277a91b8f1467691344bb74a9292822fb6a2fb56be348509e9fc25c1cdd7a0397fd918aa89d6cdc1d51ce9ea0f12ea90cf71682ee34c3362e86d4438df91269162ec7afe9c55b9446a957c4c54a3ff475145d9a6b6888117db4e5eaef1386c221a36cef00c16a2f045b9975e15386033a40ef364c3a1e6c33b74e531ed4592de4a34a84388d2c3aa5a23ded91e4095e5c759960fcfd6f92aaa77372c47715a99b2c48d256de89b11c09c7b5fe2fa78ff22af4e45b99d2c964e4b11c5a37764aed5b30d611ca8c24441e99f960107b4dd07932c5a866d51a0e0cc1ea511541673c44bb94063254860f2679491490640f8c9fb0eb357dbc7ff6c4c2c0778f245018f4da9eb1ebd01ded5c649568e9c6711d811727595ccd4fe4aa0d30647f6796dca042f24746ee7bbe4b5d8d97893cf04944666375771f159ece94482db13f4715a4cf55369689a23c53e170e0bb06bdfd2ee15f9a89d5fc132ade3713db680b7fc368d4bc6b39f6e1f68e7aabd8882deea7461df0211c5426e8cf441e863fdb02e051f5f2f3a15ba7555ebe67b8fea237905bff2e1c2722a412b7c860c3317b6b882db62da647dcaf31a8838088e0c3c0bf4dc411d807e81401e72bf114dea5c1c6436a1a298f332be146f2fec813f1bb54c5707f06be8707c016c9c5a31013e10581bba3c5858750e91514464413e7e88f71a89c92b29b5ad9859b920d7921c85643e18b4f28a75b7060a7218eca89946b62daab95ec39468e071c3861bd773c5cc8b3b639fea3fa278d65a75b9693f2dc0aae433aa4758816d5be7c52e8f64facaa5e78a359e4e39da8ba28991ecf200a3eef2564310bd5b2cd0bea1978c5a89b1a8f5898c637afb718dded1d2f173809134cf29ee3875e5bfae417608fc2bd3dff223a854b9702f9aedc06302d0681c199142edf24eddd33505133192ea41115d8d5242f14791067755ccd10ec98b1b8c4090d4dc5d1ed2bf804ae8eccba4a2d6b4a1b017080e105656f642bf99a80f71d98b7612a1c337048da3d10769c12373ab3c3866560abe4dddd8a01ebc0f00bf670b36e232e160ed07f6a4794d1f717cc2e2daec2e579baf1eaab862be879a8c33f7b9aeced65941ebf2bfa66d2662585caa87724d639dc1a87662439131371e71259f6307ba194d70fab5f59190a0f057b301220076dcbd02320d558602f7698781f5a609ffc291d339618cdd6f1a69e4fb7eccfae65c7507d1b361d880b2982075b676f64d5f3cc909cf50f833a2ce390eadfaa0d41d7996848ebcfff4333d9cd080eb120ecb0df74f92347bbdddcfae579dc14eb05ec23fe354b5d0f09fe94beb6d672706319ef985e5693703c818356242601effec71d2f204746608c53a1ae490d4a2dcfde8ee032c99d7057d6f635b260e811fd882eb490cbc510f7e6ace0c08a1f8e38406963829bd55db708381155a81a52c2b2b4f67796144d965b2c8d38908aa8f0372c3d91e0559aa37365a669c661380d49c107eb60a4c81440c33ab19a71234d167f8a89dfbed148ec217ed97447ace156b4537e0d460728b5c280385c65d313be39baa27ce3f44a532fcd56577947b2edb9bb24c95b5932778e2a6647b2e9bb4df2267eb0ae8329ef9ff284191aef781769b9575becff7d51c5d028974b4c3981c4f4c7b0fc47614d2a99791868f6331046603f3a2588194fdbbfdd998f8049a565bedaf51df07d6892174d19b4876a3f5b1c4f7c5e414373a2ad9874351fdd092dbf8f6fca5c3c645942809a341e7c16c2ad354c759dd39a81faafd4cefa27aa40a914d3c4a5c0419d12e10e039e1166564e1dfd0d1c11991b2f7075c212b69e1b2b1287a387a133a7945213e6d503ce976a5aaa58ea3cc4b0445b24a2c145bfea82778d1ccd086baae94c9518df7e185e404fdeda70e3b0f2dc53b1928b977cd4d9dfb526cf374b9e4b34e740e4bc975f1ead44b2632e1875773861a996388d9566c8037d19943067691b9d7a429418d5387314e69454c91ae403f99d717c92eb0f78fba6228e61ae2e7d01caed2c9fe645013b56b9926db39f0c4fd6d067c8b3b9c9d0bf72e040195ff6b7d6b8bcb5b78b302017869b8690e2ca1a728c1e17d9d154ae12031f01129fd4e955090f31098d3a1655ba9b87b307a9c2c78af427e7196470eb453410ff9870e70669b60651a221166ba6299bb95571825247aaf92e028c1bb5ebd9915c5215c462c8f4b1dab28a95dde7cf2bd1f5f76a7447dc3fb6521dddb6e7b1bedfd76c53d2eb43eab18b23a4bf06d4503e84054e87e666ae0339f87d1fca555bcfe01459818e053bc99aaafef4d5df2810e8db206e31068459c31538142c9311042036c65e98090f331ed60b0bd4b77f30000ed4636610e83a2a664f2e3592c7144fa89ef3e78fecf4fd4072168168a2c5620a5c60119e48cd8393fded6962b22d5f9091f83626ab1a0d1e47aaf37cc3c647590ca6450844d460c4bd8bcad09294af2f527bf63d9c9457826755ffe4d1494839a39b7aadf80198fd179f99d2260bd213770a450a58b7f4ffabeecb6c0cdf066210570ea29d05b2905aa47413d512980a404195bc1ebcdcb6620b62b120142ba720cdd4c36ebb705bf42098a0afa6b4287782b38f514d22b5829ef4ecd30240311c795e886988048f34acc6009a2dd95a82aafed03326905af4abbd258a09f834a312e5366b35b7eeb502ae405a21b5f8b2e68c3a9e71a28e7c2699908de08a9385ed73ef65351af80faf37f78d8a2473742f6df73d2f508cc790c8c0d23539d37f74bfa2a0254fda72ffa2b3acfe4d2fb99ae727738066ddd0b6eeab8907d00fe444a38ac1e8bf63c67f93a9de4944a54deebc49952878bcccab035b0e4871cbc220a5d7dbdd2aff185a6bd5a118a345a29c6c9111bfd96833283b6839664153dc43646c2deca06755095c82098e30213c985dbc15dd1bb967370078c65577a50302ddea93917f2060be444967424c96f6bf3b2dfcd1002138439e400fe3d66dd0d38969df0f61cfea2fa041ac8aa7cf89b02bb63053c040cd416af653ba2e8b7b9271f0f56f0438a491614917de7208e63e4c926cf514fc97a7884602c348dc20d02d14cd5aac8ec0ce7fba996e2ac4a2dca2a347876f88a3706f6274e21a91ff43596fb4f088360d314b7054c25c127840c00a7338f00ea50f952ca8b5cc6c3619aff0278317a7700498a3053c764c0c85331585d36466ac76e78b7dfa88e42ba633ddd3f1491f84a0c2cc1a6d56f78dbf4bcd48c53b9e6234e32d29acce12f06f793634c236afe1f360c294c78feb8d548dacd6cb5f861ff590b7d8041037cf918c25c5687e0c2b69f30bfeebabd6b76024f11fd04855e36b2f5666de151b8b681cdf2d97088a20388f0aba54c08123bf6982b2ee4a300ffc1bf292f25a5007df8b73a5dc5dea2a3226fb400f91deee720601ab4c63df6dc4ecc54661b9a18c93fcdb0199bc410ee40192b9608f1000b3a986ace01e7823ba0027cc1544ab4a003650d12af1227d66db74c78934d7216f378a3d20711f15723fa7b4bee9a880a1fe5060282738b75afb5661f95cb7cb635f42386dd299b28b9706f6c08b0a10cacf71fe250bd90b246b430972b6cfd8a5727b62119ca3afa9918aa36424121fa1ea0638cd4e4c0200585c1023d5127e93cf585a05dc7d485fbbdef7b68d6911d0ed0f4ab6be285a842ddd051c4958d8d9d89d403560b3e78a2d7cc37d08aac26783f31e607dd375f4c552ac477809712073838d30f4e57b24e729d580b781294d763b25c7d3f55e34fb5ec46922d948d2d364951129ba75bbcdc8592a67fe1355a5a4b42707d14b938467a9d43c5fea7a2ae564c0467281a6e3ce255ab60f0b7eff7f7f24dc7b057f2f02fb5479dd954f90f15063d1b4db248429d627e8f234dc2df15d639592e550b3915c7d8ad4e9e7fdcd4d43480930c450dc942630f3238c2e7b176e912e10d7ba2c590be9da0367e4ce7ca02c63a23dc3e2aec3f6e437fcb0753447260a556f8409e24486b2fa72ded0c624b14b0c53313c40244942de5f76e89cc44f1cd62124f48d18c1a0da12d775e9c40beafc8a36770863c9a58952e03ed141240ba04e0dd4cf88b11507b9bf58bf4746bee50cf3792d1af80db365290f25837da91f429a3d064a195876158a32c6ede883a0e245951777c163106de1822c82f093abda3ce1b5fcf61a77972af3de3f7e2892ef55dd25d25f6ae7df6b01927187925ec17feeca6a64f00c64f1646e4d3b52cf75706bda87454d01115b5f67202741c19b5ea04a3c9ae94a999346ad0e90c74d519c4aa4acc6a4a58affa368c5b66afbde5a6b0f7c4fd1bfb24dbce0df84693c0260f22366cb1b2d2aa24036ac494717f296bd1f4b6ce8e75a0451910c3c3fa2a5e48ebf0e25cebfe2738a50b44f313e9486e6ae1e50cac3f20229fe1934a7005665dabffbc725140d13788984a5c12b0c8095a648699946bc37ad362d2ab79a84cf8d4bc0346227a52b40b2ef6e7f1047bd98022b88e71767e8eb8f61f70c81436bbe0a17abad222d0010c26f5b0f26d4b28a3feb1eb2a34af3ec491d63ff6a7da0aae0fd8ead6977fc02b61961cdecf001a6984e41fe7bc0b9a8ad24dc6f3789b8d3eeddd443de6bd3a12abf34ebc2ee7152cc298369f2720e10371929b3b5c38e9a6d7ea91aa4e14c00115beb87b0aa0464eee762d5eb474e77a11bc9a8fe1462cd018dc18060dc3bc8f0703178b3177ea984321610afab35cdba70e7539a8120460383d11889645987b070c481a35e713a2db71acca2e9d06046a41dc2fff6d4d9c916443b5b83b7d99fda4a3b0998c292787b65e8219da5edc0a63488a1c04c37e1ad4469a2821bb38dc9467f05b70ca3f26e640c9b14675042f5125c54b060c70b3f1264c61d0fd0479034796340290a7230060b9be7969c07dd2fd7c01dd33f8542c67665266e51f59946be712209e1e8bed1847982c4788a20839aeab4cf35ffea55e9eeeae1eed2fe8566c81063f3fc8179dfd25004a41e41e347012c2dfe66809d1d659bc6ed1e4a0977a229ad8ecf356105dc845c1211758837d55fbd9ccbf6f7de4cf0fa6e9423e2ee376b303dd4dca73b490eec3ec7fc1253f4fc898802d593edf976c9b38c5d1f9d37d0f7e6d5cdbac952664913596750ef5805413101401176be1fffa292bce4dfaa2261300a0041254eb1ff38a75645bd4c1ffd0446a281ff6f5b1bfe820ed69d32dd47f8cb6f81843801e0f2ff3b52c103dd60abbff87388133e294c9411fb777bbc9818e26e5b80eedc054c40282b280fca915e313c911aa5a0d8f0348ed7072d0147c898f2317b2490e16c0cdf0f3065c035724a19245de8926f3647db59850f32e8e29fed16aa27df418ae91f5c93911aa0205a29e9c70aea54db6c261a569a8864f1002e89db5bd07ddf76ab8c00c767d1218f40f3db05d211f027cdf7debaa0e731a95df72381ef094df45cb9ca0ad7a81ae600c2df4977fb722de929c7f0922f41298f1cf79d0ae17a3e46a6e16cedff9490356a5d211cf8dde32f949b649f493065afa31f1f34c325c425132d0b9baaa196b8302354527579ef2b759eade6745eacbbc11dc4219cd6f1a01b9f05f82952f8233485c9f57079107a80aeb11def45b06c5b0c46a3c7040677bc09de93c9c3b21be4877e02f90f01e77492f25260e3ee9764df120b830c48376c86d206b5c0b2a4b4311b845fe757b7522f500e92aa636b539c14c01fc2c20fc956ceff9b74fd087c3314dcf81ff8e24c06adf0ffc669634bac29c1cbc0d142588bc3f52de2881b6290ea00750ecb9b2a9e204d45102405fa58af25c02166482632df5cc525c751ac1873aeaf9cbe6893f494c999b4bc2c68837bafa865949bbdc3c445290f6ddfce018de6d9bc19ec01931b1c1bb918f34755fbbd61f4bbb089c60cf9b14b169ff0a077754b47a9c4945a12ba50830f3fae3d6fa0e199f5a77211a942351979eb19cd1b9d97ad5bd340873fc5c19e7a83028fefc6f571883490dfbf1bcc41e89c0b7a404ae77b6b2318c17813d9f0ff29b1b147d49cc7553646feac11a47bd2a20c59eaab4b730085f06c0e6d19fb26922f1ee1f05328d76c7e11f0aa90aad0f7aff603d92d3d5eb7b99ba39ccfad6ee3abc1f400c2d770b0af645bc652dc6666bb4f24b8c93400179e52862beb6a1254c97ce6e9de196adab02b623ddde97d3cc766173290cded705e1a8e81519cc19836b77bda6478edb5ea9fa41ef2ed53561d6a4bef3e62ef84f0ed339b1eb4c9a5677644b12824557b609541f6690976ec64d7456dc1d712ec6fe573990a63537742e586d07b7a6d5d6b7a4f2ce3db2328905014762c809bf622ccbe50ccda3742ad30c9c4c19895b5681e6f338b92895fdc217f2bc408dd02502f9027723ca9b8640abd22b39a4332240a7634d9048838e0c3f5c18acbd36f6f87e8cb9ecc7abbb8089366a7d5eb6c3d01a7842c4af95fd11fb3c48a793e2956b3042e8fe14bba5aebd16b71cce0d5d892645ab16ab19da271bf8b755d4938cdacac96e64da98c20e29cc4acfdf1b4f56851e2d80e1dd277e1fd57c86d05340b602fd52c8059e3e3d7e90b6ca7bb78087c0d1fefd90b1a17a4db4cf817b33eb1d507a83929f9099c169f67c27eb6d83b85f48da368c4ab28db4a76de41bd9967f55e0fba0a4c55aca8222a3b79b53a7cd58a462f6234c2d210c60a7adb9d69370a20993a7fd0e60f22c9a0c84f3c4b8404f8c09a47f412e9456f8babe3c636f2500f28d49dbd3abe8678d4dc2535af179d4d2dce797e0f26881cf05b0ed804922dcabef989484114dad59acd856edb10b41400c10dd2dae21503072d95f2615451580a6f8e3222dfb890d5dbe27e41b46ae2720546ce8947d2e6c8866e7467366def50ac1f37fad5169d263cff7773dbb35f8b563290a2229df50a8df80b2841ed830a81e21ffa07f2435b0652bb8c51a279e60816aed7bbfe5ea35ccc2450eb2b3fb5728bcfdd1e5357ceb26b597bf2b71872231a136e67c36845990d8a959035456032a63d67a5a30145ea503994e4191ec1e2aaa874b6a029bdd3c29cfe5f63c1694a45895bb0f30e2c0a823ea2fd6918ebd058120d24bf33f000cbd49fc7ab310afae7e6b5ab39dd9481695cc0a48eca57e98a0f6edf52dd99b6cb9a59429a51475077307a907d099497bfe9e821dec58885b34dc62a1199ec80765f70df91ece8dd6a03c839ce9b1ecb949cd63268ee59e7a64b0d670344ff31a0d3fe4c73e9e6080cffc5c19cb9e460334199c3a78bc1b2e2e48ba5946506f7a9e8b870e560de892cbb5e41a8ad262c245c9e55a720d452162b96a66686a6866a6ccb2168b8b926bc9e5e2e2ea2f5a0708a00ac46a535b6538fee632c3bda79cbb56eadad59ecfb44be9071757abd56ab55aadafbdfc9801c9e572b95c2e170de887f250ae191a578d2b860ba929caf52ecfb514d3329454f8ec0411bcd4f9f3b3e7e745aa5a8cf7776d32f33edd62209583542c757bc80191595c4e539d5b696e37a05c6568af3f08e7466b50f24d1c0886542ce34080d948e0b404850a25966035a1f90915d0da63da63271858d37e25d39540e6655e93e156503c009fbf04503c003f7b7982811f76363054e881cf3a205eb5af407bdc8f36f39b0e9ff619ae37ae57edf9db88423346d51b29f413126fc00ea73d98b781049d9376a8da62d29e3b92f6dc6d7ca19ee448edf9c6c4855a67be7f659329eb3efe2dcbba8f5ffbd3fbb8c6cd6721b1cec73205fc6ab5f2b195bb130cdb84e924242714a93dc76213047579c1d23bbcf26f2425cf5c9eda9a755f67a9ce318ca53a9defa9786ae79380fe01d37d3ca7ee536d1d4472ee6c0cd18f4e28b95df21d99b70983c6aea886a391e11ac991609ac6096d6ad9fe9d5aa0f72eef4e2dddddbddd0db7683c4c544a9807de2e2a3f90de591f13892641c15ee63faf2148a1f2cecc333fceea6cafbd6927c6f3f3f44ecd0e7d7ede1dcc621cdcee803755724de8d3224f758aa974915cd3a6c970fbe3dc3e5127e7dc1ed128e2e48473ab0326f3098d829af227a1981cd023e8e6dc52716e7150316ebec62fb3859e34de3c2d736e6ad9e6cc6cce6d13319e38b746158339f598266c621b746e8b284e14fac1189b7308f0817e53c6e6dc01686824cdd89c3300adc9e21c8faaf1807ed0b91d4ce6131a0545c5b3a27ad60a9585733d558bfbf313655e724d64ba7ec935a1dd760bdf66b3395700cac5cdc6a43b0b0f1695158fca4f41457902c40a6a1555b138bef8520c2eae2d6973903c65e5886873aee01d9cc4e2e8ef25f848edaf41829eb039b7332305cee9987840bf89c2e65c0b262c9cd3f14d709b7304a89333bd0c87c3ff40f1d7b83dc7b429e0f838c939f61a0aa71ed88d630ebbcdb91cb4051ff4e05df483ceb1508344bf89b339a7faa2699173386a70a0c2e6dc00ba702ea79ab81b4d687c6cbed0af860ad114ed6d4ce8dc0d19977302d887ada453fdcde449eda7e198885b2e88f66085cdb9154e3882b7611ce4362fb5f151eb508ca3f105dd0eded89cf3b024657171692fdd45fb80e68bc780e8077336e70240e96989016ccea98063730e00345a10aacd391c9a1816b0b03997c26f3feb51284a592cae88cce3f03f321d94cdd2a9fe66a22f9a2af58959fbfef321fc98d75638f598a9ceb5f445b562226e716cce97428dc7ada76ab8754a04b3be3d3ba8e5d89ceb564504d89ce3e83c42bfa96373ee6990b02465e1d8c5b192a7963cc553d47e966271d07cf1543f0be80423d06fb6b0615c13da563ad59f718c85e324cec22e14b8078ba3df3914aae909fda04d127636e74e989ee27678886c90406980f563a2130f28d6cdf6b4026cced9548c6b32f3936322a6d21e4fe954bf9c827eb06773ae46c5b826f425c7454c45a66322203467a3ba609a01415a0cef88d5c60bfa4158dd7fba37f48636e0d3de81f06f1847671f7be4c36fde617af89a16398f5c57ad6bafff97d307a8fd156e8e7f370f7ac375e56aeab9f188df577fe7c19bb3a71ed039ef2ab150e89c066dbc58c85b64b2621dbaf70ea0f70e189b9b717c9a9c01e5f7b8bed19b3bc640d3ba09cabfeecec528bb5bba43e85cba4008210c1146e8485d60eb7c44e0af167d1b07be38ba75f7d2254e8de30df30e3861cba97295ef70159beaeee391e1a43d825150e835bdc39b5466a1ca2716aa3470fd3889fd0ae5c5e124e88fb168dee1244ef5735d15eb6c7b9c456d156c75f38e95d1575e4c4a6b5037988c527a49baf0d07d0df04244514a5a355a609dc510c2a8292cbc1861e2c50701e4404f758bbcbc4005197891818cba455cbc1c89777777bd07e70fb5226887eae88bde689df87d80d8d92cff77361d4df1674ee8abb808b63f5175d152151c8a8a54b9010de20e2fb943fc886508b14b0e3b4001862b2a7191c312e10ae6840653d7284912499e4cd102830371050cf08570922cf0935c1159052076eece76842f00156adf50a576078ed73c6ac307e23562988cd371f8bf19a7c296b638951fd6f0135446a11d028f69b9bbbb3b33bbbb4b8feece746803407c77976e7436c18068d105b010e5e66616742bd5b12240bdf26cdbb62c7b53f7e33de53f99fb28636f7a1bf9304fe427eb6cf8f4dadb48e0f4da9f3a1b6c03b5fff43612e663303d8ca9c3ba184e359cba205ac79265475459fea8fd9a8f8f7f5201aa9a71369889b3c13a096c6f83fde989fc642f01eddf068b61c3be86adc3ba186a78223fa66f55e5eefb51650744556568cf67f061ee6ce4f3dbc8ce05acce24b074581d56c27afefdeeee1856dff9cbe6388ab23226d67fb9fbb19c0cfb31b4e72bc38f0fceda407bfbab045b315a051fcc48a23c3e1ac6cfc3a30b4cc6d051162e35c6960ef55bd7567494850918b78a8b1a8150e3df88b2fb9b257e7eac5facd84709b335a2f163e499b2e3a992072e9892648b4d0c7376447ef6b7bb522ca6ae51932c6a7758f74dfac3a2dff415c4000911484a29a5921d322600e580a48909905026a07062d54f7c71021efebf091640a8b6402285d0a2c3115478d1610b0d3a0a2962600458e504592069a2a5dea8a1355ed7a889154e68cbcdcf809d9dfd3d39806de03e22bdf1a9477cc901cd1ff9918ba1573ff297fb4a50bf10c0daaab1f3ee2b410cf4477ef16d1460aab103414c855d13f9eb83aa7a9fe655c542f3d7c10d5f885054b78aba39f0c2a546098f66bc25a32641ac24f9e32f6164057dcc43edb701fa98090f7a4a6d278cb8a27af7b1d26c2c5c8dab803210cebbbbb8b104b19cc548ed25b5d7df37f04e06b86dd89e2dbb535d3c3d3d3972701c8dd861a0f3d99ce6d14259e9a7b99d6ccf3a8abfb8cff6b030b03dbbcdaecd699f9882148a39c675c03b1bf9fe1fdbc82e067ee8e37c54bd93b67648506f43825f4b010a9d2aa03f54a420b60895795136ecaad50a0a0a0ae2968cb0b165a32756b539cb4b9be29f29a8fcdf168157d4abdc3577a94c4434b9b5571ea0a500853a11acb3ed467887e7119aa4f22f2fa9fcaec3f6cce7ef2ebb3337c56f43e5c9df4a73528a4211050505316fcfd3c43fb66e3db55aadf679797fff019bb31f143429ea9b835ac789608f9f6750f959e096f3cfc9cc44ad266a2566a1ee100d910f4d6da373569f1dd42dedbf0ee22a9c72c94e36e5bf4d6c133d3d3972701c0d1adc921dec5848e3b8a5853ad1f6c0f7f7d76a402613b210b77a4a7bfe454de479d0c32dd53f460ff467d51e507b9d05ef2cb7d1f696a2edc1de86af504ba046d002550595c269c81e7b4d4a295fc3ae547e2bb2d002938f715c8922514f691da5a5a6e2de49d5db4b94b0e5cf4cdc280653aaf313db93bdbf133551018a7c9f4062b985663df889ad90fbb88adc42f9e57452a3d5b18daa176d4e134a5390424d2b45e58f2888c8777835dd79c5add841c0f49ac641272a47e4478b5c07606783d9605d0cfd3df810f0518d1c1f55c86dedf721ac6794a0f5c3ca5159541657d2c6e88162bb9caf529042b3ba3d337b7eb66103857228fb5dd230bb4e82e529e69ae81f5a89a0cd518259add36a9d1d6a1d9bfd45d23a41adc384db7699d59e867a42f7d4a36356ebb8bb43d6a232e44056b7d005f2d4f2f2b28fcde1ef1e720be5b81fe887aaad04a891b4cebac01cd81cf6b13dfbb13027a528d47a1116ead7409cc43f27a528d4ffe7f1764db439fc0ee4abf6d8573bfbc395c50de4acd9a720e452ed3a84973a80ba46432c51b5de94e6dc02d63e3a3a6a94114d62a72c22e65ba8a7a8f9654e2527aa44bd71059402142772c5852e872e560a4850fa7209efc415f32fb3b4616510db637afafd72b53dbcf207a982da520719c4e62ce15467dd278be20bb0ee934ac0ee93466cf749225ce82a579bd38f6384d20eb573ebd591efb0ab8196bfa0bec609fde2172d58c787faf4302fabf00ebd82b282816416b55f3e219dec4e5c49a3f8257e9142dbe39b66caa0cb7768bea78ccb559d88a6531a6a1da905c3749fdcc2c8897c2752147b353a510d117465d8546f922bf90e7520fa8fa2be4936d4fe5e6d8f33d2f6ecf397dacc456dee52794b6daea2f6c7952bb9922b05c09536a73fc6b81e520eb2c0d2f289dc1c00218b2bf90b2d9dd48e4ad854b752f003900ae04a87da3648a12446628e5fe2176050a9fd722585a2f40ec792455a678dbe78523b4a24416040513fd94232022308f5934f3e0954fb393252af1118536a7f2cb283fa451e221224107018aed43a6b34840a6abf7b699d156abf73f207949f4f326c4ad0fd4d09caef10908fc3fc99f99898a72fa3c37a0d7b882814a548744e4a55aaae407b5df3343f239fd854bf14b5bf0aa5ba45c21c6a7f0dcd8c944ea4112a0959446dd9fa47a1565f6aff4a0acd2003735e6391f65a0ac52f9bd32fc345256c0bfd948b602c01fa63b818c6b2d06f02a211287e59b9746a2e8af6d2aa58eb6ceda56269b55ad9f0b3c44a11205793fa39abb6890913f57325fda5f6c36521b0d47e9c661254fb864c5d1a59e5d40a75bb1c75bb9e8a6aa2ee6b6e05eb70506bef4af0ce6ca24af52bb5df93f01f76875b9bea4715f1b55210b5df83b647e968624747be33f30dd37d936edd87cae487a25dccd73e6aafffeba30fd68f839edf63a5d78e5ac7ad60cfb1b052db7fe8209f93d25652f220131065a1ae4382a600857eada4a4a198a07bea74a05f077590efa8828e1ec0eea9566d0f7caeada4a41463ec3eba425dba297e5e4e6dce7e9f3a4606da5229a59473e54af98e75b283b07b50d5d6d322c671c58afa8227155279c1120c6050210cb8a85015a5385185922258441942f203ad547845cb912184b8c1d5c5163f108a20c85042b7f20ed3096416355601000b02c1aaf04a0ca290e669fc385ef7d57736528ffec5213254fb97e3f83c1e0742fee6f7719fbee1a9452aea1cf8e112c40227f343082184703e67a6ccb565779ab529ffd9858bea4d5c2bd81d6eb50baad3d4af5932a8fefca4394a7d9e2cd45e2b5b84d94eebce6404ad47726c38438d147600be90b84e57cd1f0ed315e55ff72c4d68821236b129236cc2c464844d684213fc1d09249cedd1da4d0e3388b33dd3835128f4364e1cc6f1f90d1e38aca3539df26a04b039fdb1f3ce9398c4a2d79ee76d4e1838dbb34daca71235e8c8448db1c6e78931c6185315fed60005157ecf18638cd1852a460405810809546cf9899da5c62d6ac46a8c31c61b75594a961c434028e68c188649214241d7a0803c157d67a5e840870844d19212450f11e081d2cb2e2855ab8abad862071981a32f9dda5547e009a04e6d8da927ba50c20a5350d30d01d0820715b878f1c30bbc60b202165e144151188dba454b10a2c2d6124dca0ff55bf85ceccac085123ec16e0e413b104695dcd9f8d8caffc256eeba0f7e0888549f765a5b6653fd348ab8d40c28e8477d053ce79b9ea1474c4e547b0a80d5d4c1d9bc5009e324f562bd39243ec7249ac6eb0ce34f7f08b963b7504b11df414a29e50f5030821720615151855505952baee400042b60384141144140c8a658416b872794ae8851b4608a1e5e43614bc056498e3046080097141900200846528600c011c5ea1a4979c1f4a72ea5f420a548fdbef20c623a5ef50e54edeea851942f5555d7e88820542d46b9c3585aca855a90ca1f3dc98e91e00ffdd86584c414779ec244acb6a2c2671eaaa8f07dc0e7221d42d4f4df9cd23aa687dd42609d3f613f44a9eaee6024f6e13bbcfa767807d3c9ae7321d67e46e21dfdc3e2800f77d48f5d7cc5d57d2aef3b0c728783f763020ee3070af69f10af3aa0a08b650f5f83f1e32e60ba0ff57468534b5424431847da9e609cfba60386f43875db1eb7752bc4abf6262e6e409b5ad60cdad4d68a446b53bbfbbd9bb3b51765377f92be2852fb073e77c1406e6a3f3f7f6b7d6ac23dde0d55054880f3dd78ab03df91000bec7cedfaf2582bf575f8e985e8b54ebf00ab8f28b4b89ec9b471bc9e694d23a830fbc180f6fa3ddf89a153bc43015e60e8f6cec7e6f43fa13efc7df80560e22f41f14585eac1962da4173d4829a554819722546104282e20c2059d2404138694219a8a2a264802bc92859222f1e33671c5bc1206108e6843b8c088c88a14459cc00737cc2956469a8afabd0f2d1e27bc07f55b24a4badf2a1da1a56e171f688110aa68b9c1122d48e2c7b11c61a5ba472104510a8660a2080b58f0e3af4ae1080d848c8c8c5870c38fff0cfe85d6353a62ca1147645a767b365effad3d7f17bcef5437e7f48257f7d30b587517e00bd9e905b9dc524a97129a60fc7d7a6e4e3fbf8908b46b3f991e802350adaed11142d81b1d11449552055a943c95f24265ea1a1dc13a0248059de8eda671bcdef13ac5af52f114151d1d2121c9d87da1df561f7513655c0f821d4542f977773b082184104208216466ee7677a1bb37ef36ec61629cefee32fce973be4318338fd9c4a07c87d9c4645c8a02e5668f2d73df56b185fb37dac389c9fec9e35aa4221ecf3d1dde411f150f8ff612f0791b17949188d062988d8cc0a1327ba89bcd41fd6eaaff5052752f0249f522aaa83b447ebab97768da3069a8e7ac1046201f9610621d01a38a255354f80fb1183101054208e1a90796a37e5b0e8690d0208a2a290a5bd48c410aa0b8e0cb1660e030742503362842020a1f562084112994cc304b99c54e477bce037a315a70a37e5bc56680a562180d84a818851edc2a5b2c11e40589269696fc402427a298004e3a37fac333685529df291d5aad563b1ce105cca473a3d93eb1031dac503f1d15f2582a589c7051e14348045185464418c9c0880c7cf004880a9fc7e7891315be0f1fd6088aab2655da3a271acc099d60590192a7763a1182110864594ae221b1850d50758b8e0045b5d28c8c60c1beb0d59f856ce4b141961bb22fa43d66e6863437ff727333fbe021419613b2b44186c8204286ac8fca0b32a48656dadd20429a0767dbc9757f743e8a509cda36b406d55e3f1fd12bc4c7d6bf0fb70b226408f6dfee90d6599e9352f6b129fe211c7bc41844c8108fa73d5e0a524377b7c733a4756a689d8f37d03142d426e1ec7791cfb055d7263ed728e37d5a4b323284ba2e33011b5a49467e508178980c34b763f4fc966f0f4de5e5d5af9432cbb239b1971c08b03a1f62523a0c1c06ac7c9a0f8ba8d4dddd2625e0869658fd9c60e0971d10afdf7cc871434bac6a9f1c306374b2f380a972c7455a45d0cf592c2424f41d47696f635ed39eb34d487bcb4166e64c2205e140b043b86e0b5c5ea406b3ede90598ff1689b7188eab0d29d4a789ee2e96f6564224ed2d0cea20ab3d56dd77972bb5a40775bdbbefac2f4b4c7e7ddaa769e6b7ab756a7ebf5bbec3937ea8cfe3a11b43083f20f3634e3d32245de602e78145aa1d8043754f351d92b38b9fa6fbe6ce74dfa4b4fb509eb3f6b2fb78ea56f82d1598d36bbf9d7a9c3ade3856c241ededdb9801fd980933691d5eb5b73f817c27884dffd6227d80dd656dcf4cdd7724eec3ee746b53fbbb9f759f2ba9fb2dc4ee386bdfa609f473d6909f1833289d018d988052f92643710f399cbfe1792b6954fb655996bd7c9f6ea19d936ec6dad4b6507b926b26ed2dfca73931804895add6e12a65c74aecda82ee774ba875be5e62d24f5a67c906beb7eaf2903c3ecc25a04832c00717ea4a5ae7e101647436fcfb23e3f77765644e640c3fdadb476a269dda8f5cb7322c5a75f96568cf480333b4b7fbdc7dde02121894df1ec6098912c3a694d23d761edda5ecba854bdaff407dc6d8b967d3e1cbce3d7670c2d8cdb781e653e343b8df8120aafafd00a26a61b98f85baec39eac28f4788ac0e39fad9cc1a5ba8df6e0fef3e8f70dbcb511bbee6de428d1f2b6cd96d1c39288c4125a0220c5457f8f0a8fbd204384cd01d361b6a7cb871c2232a61c224e878f1e85015c173e2068e14aba3bd8552aada833096a0db9768eb1be37f83aaa11bb682083b1d081dee8e7686ee0edd89488e476032bb2123460dcd8c0c8d81396d5a669a37ac563c28254d89c51831d61833bd4f9b30e639e7d6850959c4706664680ccc69d33008fc40a2800c491998c105a4cb15083119a974dca360e3841b9b1a34503364c4a8a139c26225090a5ad26a11212464c4d0901244444d141555393aba828464455252162e97164a4a4e3049e70ca537287884224c663c37363568a066c888514333234363606e58ad8c00011d61b19204052d69b5881012326268688a92942c624f63604e9b86fdf8142dc0c711047e20558007ea42289b586366d6186a52ca8e060d4229a536a1d4349865d9369526f59245ccaba19991a13130a74dc34c33d6d025284609b1a247c1c60937363568a066c888514373c36a650408e8088b9524286849ab458490901143434a101135515454e5e8e80a12921549494a2e083119f9f52f145e365e27bc6e5e36af1a2f1a2fd46bc64bc62bc6abe645f39a79c9bce82be605f33abdb697f632bde62bbea494d2a7943e6334b9c7d8d160828ec5d88ef1438fb086eacf32c687f26394cf9551e093164c663730a74dcb4c533260ca528cd221364d28fcc7e3ff3b00f7df1675ff6d134b2576dca360e3841b9b1a34503364c4a8a19991a13130a7adcad1d11524242b9292b27069a1a464d2dca4b9c91402697a8dddf421e82ae794262d738f99d330db7bcbe0e61daf87612eb3cfa64f475fe218260a26b3f87abd5eafd7ebf57abd5eaf215f6e58ad8c00011d61b19204052d69b59e2879c164c623be6cbc4e78ddbc6c5e355e345ea8d78c978c578c57cd8be635f39279d157cc0be6757a6d2fed458490901143434a101135515464456935a4a3060dd40c19316a686664680ccc69bb61b53202047484c54a1214b4a4d57a22243444833324209df01f8f8dff7a78d838e1c6a6060dd40c19316a686664680ccc11162b4950d092568b0821212386869420226aa2a8c8cad1d109ac19f9de29927d111ca8093c8c307ea0c4c741f50365fe37e99ae69ca1f406857a08461631c905f3bc1c2a158f2e72c5ba2123460dcd8c0c8d81396d1a669a37ac563c0001c5e0998586c9ec690ccc69d332d3941590c115c3d80d3730a74dc34c3332c0c789a50e8a68fca7aaf15f0e9bff74dcfca7c373635383066a868c18353433323406e6b4699c24286849ab458490901143435388888a6cd85484c92cbe5eafd7ebf57abd5eafd7ebf5ca5eaf9764254a4b344c66386b9a7386d21a2854f7bf82e7e550a97a78787e7c8a16e0e308023f902820435206667001d90076b4c264e6c557cd8be635f39279d157cc0be6757a6d2fed95bd4caff992af1a86ac260ab89545ecf41f0ae6bf1a31ffddd0ff6cc8fcf733ff7534ffe1d4fca7428cff3c19ffad30e3bf1ba8ff06a0925c503364c4a8a199e17a78787e7c8a16e0e308023f90282043520666d8b86f034a34045912c1901b562b360204c44798c54a386806674f3099c535cd3943690d14aafbbfa11487344cce68ffd56cffc940c5d7f6d25e3550a8ee7f054f7239542f13cbe70c9a583e67d004a18931c69e1707d65d319618f6d8f27c3c11091aefc8fe9bf03f53fc6f9bffc198fea3d80e5ed39c3394d640a13ac6c138fa2197c734886910c3b48c7971ccdff9b0e7cc76fe3a176fc02e4a68b3757625774787f0e50eddddddddddddddddb0218410368410c2861042c6b1ce45dbd581d07b4743b82b3dba943a107a775dbbbbfb61175386685d232f5a35092b758dbc4842d535f2a2c8b99bf93eeddc56ee36fe1a6817f3dcd1ae06a89d1e06a6b379000dcdcccb3c09683a09c8689d4cb73f9048e537c51334c524787200063f21b0deb4d7031802a5375a68ec4e0dab68b375761f528f54833176b32b4177b300f573a5947008ab1c080dad8290c3135aae349150828014456b28b5f2c5529ce24a500a6a50b4260917248104126134667d2eb62fe1c77d47653bf3bda34e3d078d7f5de030ea6eceeee6f4360cd31b1cd00f35e1eac7dd77329e1f3304414914b7ae11e1f620b07824f49b3b284f39ca860a14109e6ef6807e1e8fd6b9d13ab1759689708344bb0685e3a9183e0a158361ae61355840b1179a4e87e93e140c46f331cc3c8d4cf779357b98ee9b35bca7b29fe9b8209a51ad63de61defdb5a3fa09e98a3dccc7701f911af37dea11f31a9f5c680e7b98a732446a0b8995761d04c6015333339853f7cdb9751fd53a1397753b6fd4ee38f6625454b2551886614934d635222af2bf0423300a2459832d7870a4a3f84f5d28e8f71ec70382b40653f4c0d81596cb1a1cedf02fc591cad403742e3249f7a6e7993ac36e4c4079e3c137aaea0bc0fe7e00c87e46f9180facced5d3a90767ee9ccd1b5e53e1110015e47cacc33887cec59845397fce2e4ad3ab4c3894670df40ab7530fd6d89db9adcced796d08bdb339a2692b6b6b304a6c9adaa3c466a6c9530fafcd4159db9db92f46754ed5ad71a76e9d4f067f3042df1cc6d8157e9dc39999b48dfb6454e7beaefa6b9a6fdb729f7fc3f63e186fdea142a8c44cda688296d10c0000044100f3150000300c0a870342a1509646cab03e14800b739e42745a329ac6b21c4761180419ea8001c010430040000666a4d100d0df795064311ead65739644e40f58d6d7d089910dde5a6450c003bd139a4667ee089c9e430be73a8ea1522c421564652a7fe88484262d4c7de3442e4ef095221ccd1477b1c01742d59e3aa3c6e52e799b1cff4561f37e28ac7fa8340ae0d1068d3c4e120163cf1eea548dfe0bf4beb6593d54af47777ca04379f0fec2dd2023f1904834a15428953881b2ac036fbb044643a4427c471ec9e520e7ad5707e81ea4bb5ba0c62270eea9deb49f2f50599a0e9c6d610d24017d80d3a1af5301defb70de48e57814baa059841ad02f0f1d09b6542fb7009c8d5a04bc01bc8bd6674c5c8a265273a75554ffbfb4fd99a50221497fb1c0cf988a351ed7adecce5f0d696c3c5a6d394f4f1b5f0caab64af889fab749fd56ad7bd06a8b72d83b1130f942ea13c1a34ecbf1812577ca9ce88a0df98353b6bf924231a30d45ba4a4154174554da53a0e06540ddd5bbd80bda6c712eacb2d393e50256644ca044672ac681d5721d57a3d2b36f5405d131f362d02d360f7086530543bdd056e6eddf7109841946237ad1030cc04927252ec439263842eedde300f25ce859e460148ee615029f20850064bd01235ede6813610c8e1b4cabc0b2d70d78539d0182fa1f40e5e7ef2d82ae070ca3b048407507d8f2e7f7f9068c31a46d093d8b956fc0840cd5ae720f788626094a750bd69c9ab65e7b8035c270dd85ce8e1f1576e0f025819324b9ac586f30663ee34bd12d18f376b7cdf40cb4ed162c0d75acb7411c4bb89fd10db699bd050b32b46edfb6b6070ce27a5c241fb61d386cf492097ccc059af8a3d4e4151d119235a768d469e6e1d565b567de6a635441691c91e989be5333902c92ec5e6cd308b17a601a8b6fbcec7c83d96cbb208671c05380771a8d0b0c3fb01ce3f1dc746f70d426ba00501d3f5dec5202669d090c68718fd50413988a3736373ec778e79210a88896951cd1e514514a581fab28c82f151e4da366e94782f3f1cc0644c571be3c65830a381fa0364adf7ce615553fbc65f8f26a72f4d6fb6c8802e65f61435ca39db3f85d08bb1f76ba6c8c3e0712a57d29c52e27e3dfb34edbc418de55a8696282919a75d60a099e5817c4d81b227c19f827ac932a455832c5bf4be1bba015ab1742b8b3290a2e9b9c2a7537624ee69173af4e34ab5c49b99b3acdf78586521b7d628addddc1a36859b8f79b8217b781c8f9a4b6b5827b9a1411aa811218fdc68b5c1c0678ca25b5081c0e3152db45eadd4e8cbd613bbdc991b758dd7a5e765a9b0cd76ba891f5c209e04be9196809ff53ff3f22632d9b47cabef33078b50740ed0f2a020bc8e1eeafe34422364d82264cc67994897afd3465dfe7944a7bc6e2a997e58ef464802fcdee263af90836a2f6456aba9cc6bfcb329d99f17daf7ff2a909b494ce5df9bf31ce92bbc7ccb9e732906ad4ee29a87541ee6d76349eccf5c9d7c0814262d4badc4123a4c6456da52462decc5c576d7df7858901dc2d0dc4e88c8712637cea1d1c82ade48f21dfc7ebb2e7e574b54cc80eba0634f80db44d8dbad324502308500c92e8eef143c24328020d45474dc3a0cc2bd01ea2880f1be68222e47278a9c6fc9382b08621dc09b4729b04c0f0e63d240dad460d77ff87d4595350c42eb728852205a312d2d76990c9f1c8589fe4f5b130e2194834cdcb54bb388c7f977d7a138e3d9ff8d5caeeb69268aa4b9fc0d43bef0c71c3dbcd5f1624ca8388d0b2805287b3f16fd9a66136baef238a7c3280add275d7ef67c499c4f69a30e7bc7f668c2bed1f33779ddbd78c0dc26615d33e7df328ae240e8c8fcf4ce12012810aef8ff1cde2e74124317de6ca06c6e5bbb7a182ad3c47c65067bf7135b1ce697ff70979407b833d413c20ef708f8007b0371c9e8db0f939ecfe9e184a5acd59e91c9d118338d091aa496bc48dd9d280ae2e67272dac33c635f0a1ba7dbaec6ca50c351344113856a3a59b731fa4667cc076c0158307c29479f835bb30b24c4523cb12808b0eedc8e31e260a18082814243048c902d9502516e584269c4fc8e50a923dec5ff2998a842f9ebc68a435962aad1b0ea76b7e793a917275110c2741018cb14be13ce6526387427d424f1e13ba53b4add431c9349f50b3c61f3d8145d6be94aa1b38a8e89213b584e434a1d253546f1617772f5e838c071b9127e40ace55ff197b06f35d83245b85ea3de48088a4bd2c4597f3b16fb3a7c36cec6d56d7b1ae3ad5bdee3ad791f54533837cf5a69a32628daf4f4729ef062f0a7dba733b7c8eb1d214936c081c953662ef163e7f0ef3ac14ee73bd0ef6c2049e1b0bacc8f69514a06b623842675d886316682a7fec877e8fdb7e0ed0eac30edfc049b69a97f05533d1fc3b387705fc2492301889e45595ae072f3c8c7eb33e420846a20a5c82b23668940c50cb45c23d467fb1ea415cba14f47f037a70ee9f8735bc0da0003facb729d6a0d0c8ec68413ee73e37905d0bc6de20c572880da62e3251ffb982d41c8f2e90906532fbc2d2a7d25c6747b0511a9653a66f7ac49be061bed33989e6f61b6c90dc4be5bdc3be29e1aeb4c1a9ef16a63e094e6390511fc83e453f3ea7c9c69d8e1b4b8eb7185e9db238b3ebe78810e2eeb7ad202bcff13112d149f469f42474bea1ab1b469fb67a6fa51577e5b8ba236d484af528b1c59fab24742877332ee36c2b08022aba9cc045685f7e274b3ab3c7df070bf839f6f3aa7f978549c77b6daa1de3baf7c5921f4386ef2ff34066265667e2c45376700089aebde43b96749b8e7fcb4a5ac0119fc22ad2d841b284f0f63f353c88fd675a0f69aedfa8c5f655b6caa866868907981936b27d7f19619686d503d90c97178534ae06ac93a59520ba355be79ccd1cedd67e15497a3c997c443ec9658b23f1b5f79164d52132b29a612c6723d1eb5ac9b8fa9f21e760f1d2c142b937cf45b41e068fac75015587e3e36fb249677e54df3fe83c318075450f819cf4f4b843a55914ca0da4ea296f3f1ff1a510220a5d8ec022b45f7c97acc9a07e477da97c98ae1abe554431dd3ce5725b9888549e545ba8ab119cc04468b444d5f11ddfca9cad6e7c4eb6f3b9105d5d57e996b4191d0e3407e46d068b36518a1d6ea0a3b52f7d87251df3a36fb24a03f7c5db8c5c6302b94aa5206179293f052dc9b3eb7aabc04b4cbb80848953ed738a210d7ccda514ba9cc1476f3ee61d96f4ddad8ad5514f76c840e205457dee2ed0a9479217e90e66bcd8c31079dfd0bd32111d8208e3091f20bf4f6f4332f128b596086ad7af5e09de29efb4e7c07e657f098fbcd34112aabe7b9fe07accc09279f643e3b8541f16f5ba4f32019bcd54c1eb531607796c2d789e33ec72c23216461ffa8ceaf9fa3d866307c0a8f6e8ad6c5a0b1de239f2ed0d923623fbbcb1dd3dc3ab19e1a610974a85f73b73ea315834fa5a42b2f7f88eaca71d4ba180ad2ad6c5c77d213cfc5d4a8cb2c3e633c4f38b0f9052ec8ec2fa0ec23087d612a77d41a8ae25706f71d8146c30a9276ff05138c6b008cc40ba9bf70f9cd2bc6ec67090291a34232045387e6d696d03b96703894d074ec635d0c15fc9cb736850c7ff4f6b98685ccc06e4eff2dd1026323aeaebfaae06e2b6633b998790b4bbadca9fd68700d9338de539cc53839f6a9a8b721d880bd8d9fa196dde968eef8e37297c57dbda24f3c4def97686c7350027db4760ee218dbad664b4c05b1735c77cbc73b876000e0dab04e5c7a3b34a60dddbb1a60214d874e29bba9155e5cd1475faec963ad9889d4abcac18a2bda43ad971332e3cd0f961263b155b63b19f6689acc082ec27d2b72a38bb609078dc85bd576045873172549ad4c600bc0e1706b5bf3426dc6ca74812025330451d81d8dc643a16817af9e13385942e3c6c0de4302501a43bb027fe3d18b6e156e19aebfe6b0bf6e3bcfd181cda0ed654b92a432ba0ffee05f613fc4bea680446ad040f6d0a2ca458b65c050769f94b1fd0ff492b6a0b6fb50ef3bd9063238646f96ae75a893ae15709aad73aacc2b8a7b8fe44d356fdf879ec319ef9985ad49e17cec4538b4e00bfb2c3d8495d1480fd1f1752767a18ee8459454fce06c8b02450d6dcf50dac32e951453b0c98e1fe7e2e3de61566cd3079f4bac8fe404acf07237d0406210e2f7f800dc2534ee689f48eab0fe0af6fc8e60a821759fa76383dad01a00b11f260b7cbad6079e05eabd455f88e608c3615ae191cd60727e7de3b08ee483d60689edf9bb43f765e7e0c47ffd1047d13dac247f1268d2c8e17a765d6ff48fc1fed4b3bb443605a5ee55b42d54464497785436a0f74fa4669dea8b3921012c73af3327dc75f82126a68fa36b0e8b059e0de4009fd6a20d715fda45227b9c1d82e37007702c52cf5cd929535a777269869596a7766301d9a734b98e9a8c8701e3e1711199a014feba06b91cba96b9234a97e3fca33b91d122db83a8d142202854ab2a3232761483f03f31df63de5cc63b58cd8b61252b9507ef8bddb540dc9d8b776b8b3174dfb65a9d626ab4219b01b1018d9146f59ce21a0e7e386986366c79d2552b165518b868187328943d20724055a8b1cded27b78c287b9494110f2e8abfc61794176ce0f999953ec14992ccd6cf66c85b5ffd798751f23458e4c177ae9fb3c30bad18d0ec743b40924b4a1f2b6e89250695e6d01935e3c0dc9ce3f2c61b062e739390cf475be0eccdab1655502b070949a5f499d59b9ac08c19cdf28c1850e5d2d072bd0eb64c442f1810fea0762972bdc05e69f2dca7de0a19b63f62c1f8bad0b49ea1be7c963d85f51195ce9f1bd0aa38a80b89c22216d3e88e7012934b65db8af45671f79eff83301efe623453172d0ba0cd103319619761f18fc4e34707d1358c32015e5b58d2e1774988b84db402d051572d3f9497e57ba965e3e3cad30a43a1f25ca25b43901580108d3e6170ce01806ae1a09ebd08a04b3e1169dbab9c1aff4cc3f15fc8e5e0eb16fc9ca8d0cf9fe54a5da107fa6daa580e007636c7146ebfdc2ae45a23059b58d90f203b48680743b458c6fa916e3a368d1720cdf07855e13bd1f53e9b0853754827d16f96e2d2809ab3cf1bef14fc37c0d36679f5a0ffbeae887b99a3959b64faeddd853285608e2fa0c9bd35febed6fec065e0d983cbd8c187924757664a8a1a52b2b8239682a5f8d825fc5d821967a86390d3f67f8587cc2a46a274bc406449f1052635c7680e4e9e36f918cf459759ebe40f5cdb278094c7a3fa635c163f922471f31902eed7d9e3cde038abad625f7da1ff2405cfb3bfe5813747a1607bc223ff872c27663e9c8113ac4b81c569b8adb78072b471bf497600deaece3631666a400f9d1d4993bd3ba4a98d7598443f529d7b2949584e26a8740af14e66aeb2974dfb2908a269e07a87a3b6d1910f956deffaada1417e463f4834feb0eba9bc4e7a58344bafa5de615bab8fbebd6c604a6c28f82923c423f7b18ddbb6c0d221a0839a40a9884d694588150112893a8a72f7c1b4984fcc1f0b666d4868b0b6f46490710d47defe952a20bbe4d46929a59086fd39989c6ff4e01f33775112dd31f0a1c6b9dcdd8b1e40c4aa7e3578ba4d29742bc796cc7fff3dbea996345ff02b705e253a16c7400479fa29d257c9024a38eeff5a36f386354167a59e86e7d04bd74238bc3fc1c020d8ef2eed09bf0c5ab03ebc5dac26c2670a53b3545997577faa1e952be4843c1d474001a87bb15bb92d4b919809bdcaaf77a2427b0113d4248e67253782de84f09487167295a3aa038e9091ea44ebc09b7b2e963b73bfb07312b55255e0777fb601fbf2ad561399947d7b55b36cadfe8c39eb7f07a606a4c348d4dfb7a7fa07c989f72739c42e096be1e0d3c35525f4799d89fd26273a32b7e1f2a7e01a83b7e4029e125218276b6e5568d97e7d5f78c449bfad2b66c991452890e2ec07bd555f5c99dd50e59212de51211af6cb6827cc6f9b17381056e433a18e4f3c132a4c6fa4708fcf3078143f80a1559a6d8b9d10a0689f4fc61425db27380b00e6cca6a2b6047de0ad42af6b6b7dd3adff083c0360a6214cd9e984c8f0a48f8bab19ea50a2b93d04bd972a3a04c05abcaa20e346732c91b58a5944c1505ca36ebcfae15ad9c5c0ec3f3cb6acc271be14d2927f4afa1282d5fc7673887d6c08a279152ec4292fa2a7e6a99bf32885ef541c4fb45c9d15b181c8511ed5c9d4e44d8b656374146cad1bd6c602b892a816efe15f4234266ea2f44d45a8abd90b06e54939d05055bec508c5b76017b815c893115f164dc0b9432d6417efbd137f214c8b4370813d997f26f2f0e8c44ab8ea402d6defb8d32c1879aad03afdc204fa3b03a8ad00baa06f5196b4e0cf582ba8e2c110856ff46edd4e524583796744266489d9423e3782aa9b25c515402456613775356028df4b348b77d9fab9612c22285022b40352346627a1388015821ea8a747d8ded86809e215402a9017250fd61b106f216d465a4c6e822f930ae7f723dd1c57a98dd91bd0bc3a94b7d01560477c0846323eba415220177449bde08ed83a2c3504e52958936ca2639b5d8e6a71ca5669686015f1c645e520dafad39addb64f3cdbc510127c4e495b55201d0afc324cdd87093bd90b6f83d0e0404a25d82dc0ec66a1bf7b601f80f65bb70edbd5edfeba657cb077f4969d7c5e323f5719a7bfb8662ac24996a8f4ff1a8762f057fc9211fd0cae983efc840ec734e605f5e6509629b18e64620206d58253bb22bb03f480e42ab31a796e0f5c1ef57625322cfd184843e6bcc2a34c1f58df7222a7c3790433b7b6cbfd47646155e420cdf42dfc1a27c366d1293ad92df4a7d01a81cfbfbcc98a3de66d935c8afe64335bf1480a8af8d443af41b0bfe830b940a718fa880fc74a83a85b7952e907385eef739858601124a21e0f9a4c898b21e04eeaab7c59315e9f40da080a04b94bd2403714ee0caf44d35319f9ca87e1a6bbb5f7810a100f957f95485e85713654d9fed3233fca2ae425c10475ce586bfbd55db18562ce13e57a293b11411363781cb950e8e70e38012d6c02e4f06251476c14a2a30e21f8d950860e20028f8bab834f1efae6c6e81c0ec8f4c834273398f06eac1a065717b58410a03c109633270851a1f7636684415fa4cc530efff811b7e2571760fb11ce09e797d0e599012013e376f2e04c6c68d47cf077ad701153f3ea2fa478348e50fcb2e05a1218e862bdf9616d603a8fdfd2adff361b9fef6f8b19edfcf2c1dfee1fc8e86ee47573d83ac16d7c871877bce5751bf1fb09948bf858d43d70f96347b052bf2054008810e84037daf658b41a34c7fc8678abb1b11eb37b2de8f8389e05bcf1fdc816cc736219bae92a531fdcd671b2ea485b6e56463d81ffceeaf34ba5062eb537249b136b9564b2a83373bc8e934bfed3d8c66ad83f0e5d851d6cb23c18832a22f4ef93e2641ddf13c8791f06cb2eb2017ae72138f89fe1c85f2e57f2438348e6999c0ddd0cdf5438622640b6ee30796a4b4d4fb517e425b1aa9de428eb56285414240aa00a418661b5724124e29d1f08af8f6dbc8e834f574e6c085950342ca7209794a794e14fd583f4c807860e87029112a7c58db8915d116499f0af0a1cde3867eba69ca6fec51a16c8bdc9e750c35181d4f7b54624dc6692a9e083ad55f69109ba79b2e5a7c8706b0eef5df4ed13f955833c4d9949e2e0d44894694540fff8cf50e253a26f4c094f4a176a162a8ba2be16d894b1c4dcc572d01e04e8d3fa6c19e007a0886600ed5e5228041dea74138ce05528cba891a70b935ba81b208001a75e29d2736b124a85a6ab50e440b147dcaec352575167876bb07fba9e06f3390bf2e46039aea0188f8653456b810805cd2dfea5fb7bc626194c123e97da879e63bb3be3b830c86661dbc29d29651e32fd9ef156c95128652ab3a47c6b5fad20fe61d18d1220bdbf6ee0dedbcfb5f549e765ee92eaa151908ef72b29baed959920547f96ecf38fded3dcb668c9c703d66f37efaabc092fdb4594b46b673589c67e4df6a2dde5c9525290f9272ccc963edc4cc47133888733c4bcfae643754f248e984f476e63653a7623808c32001a191fc4ede45b04afa77da9e2524d9b7e62f44bdcf8820c421022116874f40f2338146e3137be335016a8271ba53dcbae0485fa7a147dc45253e19c2995fb68b0385cfa8ee0e7b51b0075bd75d651fe7d3ddcd948edd303d9dd149c607b32d0a90174e7fc22f4828b0403040a1d602dc520ec239a1f6ddf523322c9fcbc2ea02585f92dab2683442d7fc519df92e6f0b0a4925c5224814128538ab53962f56acfb068e00628c54edf44a2c23014629036ac7211e07919f61ca1ec7bdd6d8cdc431e8a17b15f65268d5c5b46b84bc09706b708f62613b480bef02adc1b69a6d5bf041afedfb1015a439e3fd36516eae779024b7e607e1162b1ff69c5cfbcc25210fbe20257827019ebd97ca25b9d8c639c913c715a18636bffd41acac736f050da63012a53f6c1bc918b21b064008b7c952b505e20fdf3e6ee9b3487d92442d100326ea15da1162c12039e7aeb3698754ee526c182ac4b327596514a2dd126671513eb609fe787f0c98e03b048881f613a66cb636ef4b84e0d4066f1608439be18e23e60e42ddc1d423ef57f7094587c682ef243319eb1523482389fcaf2eda2e0e9a635ab67b0b161d8c4612ae2a8f7a465881762b3bdb04203e209d4c3a5a1d307d42af73016e1c4a47140d305e5d3d32df9b6780e7f32a5b7b7532ed50614b8316ca9187ff652744db4e18faf3658f9dac1000d88cf283a3fd0e5d6ca229599e6aaf4f8ead73048d5c0803e47a5516e8e80defba2929ced244a30f268398d2e6aca80367861d605b2b6f7881fbc4bb86d0b6c03bb4704782251d3935d398863df66aaf9531ab00649afa44bc478bde633e739abc7aaecee9387af290898538521e1e1160f9429f50769daf79506e85f3d8187c20d89555cbb5c398c502e376a80b5a5d8f853ae59648e99eeba0672e121da01c3f72783de68543eb9f24feb5d9dced675119f758ef2efe309099d5c33536eea5fa0c5960b9ac90694b498f4eea9ce02ea426d14a9b1bcb9bcfe8f743c69175a6d5f83aefd3b8a60d932c24bd6bb1945dc905949138db8b41f2da228efe3e7ddc80a689e77d80398d4b50f1a414ab513a3f9abc133a91623d6d20b8ebfd2d65d872291099a3fb4c807b087aa0c1902bee1e3501cf16b2ca68898a045e3c70974da81b4a0771e81bd8e54cba3ab409e92923b0a21a569701e95f800d2f061c752c3abb3d8debf906bcad8b952344817d84a486d4828201d84bacde7a8aa2948dd5488446ed65d34c3747b3631ad3e9f16735ffc227092f697a856f366b8014bc69557d6a7062139dfcbafc5c7b1c36662ce66ff97d3778d183693ecab98cfbe941602d6e3c60bf6a9388147a45896e29d4925fc7e12c72d32a25b5b256206640e8fbd7224202e584188f52ac593e13fdc7d4a5e81337af345796bbd65894e0b5e86c19d9c8bba0663dc6bf4a4663b167bc14592577c803916b0d4e2467c1a2d12ac1463744b18af81d28cbe8f822dd51c1201c4275d6b79e3acd08b00f475003057088abf5fdaa30571ff0e62e419c8d086994cb5163abb796e86943142a8e622a6efa5ecfab5041db15e26d1ffa69136f7ae3bb9eed26407385b72a02e81f3a2daaa6e094e5208c38a84624c64f80fc81d7d9caad4b0aca4953b0eee10529b4a4272f97ef05b49630273dde627f6121e39afce8e575917826fcc131cf113fbeba77f2a265f3eb38611c8a5418bfdbd916cfaa06f4b95fcc0ca5d1c6e5bc48cc1e5d221e3664f098c008ab98cbc929299bc6dfb89ad30580cb2d69830d9a885934218be71570c08f8aac52d4e32de961368063aa7f72a913d98ffa0e09c9d377ac42652ecfd29241ee6369a7b3f4b167f4d7799ac227378aac77aa1c431796c6cc27a422919556157f6f7e7aa17aef1d26239afbaa735b7f0d4941546e6e0bc27bbd4b848c2b55e3f7b7bd639fbc31ffce601225043bc09205b307f020fbf96e734a7f9fb4919dc3c30f82b8b63a35c88b6e007f6f82ba89c30d72238288599711e000fdfd84d8d05ccce8b02f63a5ef4af63764936f48a9b443fc621cb15e439b6043e98eb58d7d2ba85d0ca354025c35524c05393588c75d4ca621ed4f66197e893b5c4e5b04b9496ea94334d32c446d995da7c8d59335a42c5a0d4ae1cda57b3c3b5b6d2c68cc873e056726b059a22e7435eac8a5889bdd2d456c6bedfe386bf519ac9dcac4740f7724eadde37cf22de3a243b3ed97a4fb834107019bc8b97092036d60095ef0eea350d29cf0be4f1e6dde1691453de32a5469d2e675f91846284cd5ea828a85746cd7346f2f8426a1c19df7cb0815d9e9d35290772034f21c756f88d5006de821cae6851125a5da3dbb48b8725fd3a31a25c3195c2e8ba295521c62e856e66d7b68c3d232e2dfd4170939f514605c2a22f3766d52b5005b92c11cc0bf8acce29789eb33ac008f303651b3ff7c645650391f46d4cb1a87a743c524c5842490101eca0a0b56eb74421541bd9f0ac39683603c50c99efc3704c9bea057ecc451baa944b0822355e3f59108a67da51103337deff97dca62378c1d07f17393775e3800100e73e5ff1c24bfcada77d9fe10226546939a9d4b58d995fe679981f0533832bb11a9dd3eb602c7f65e3d35cb15bed3a6e1d8b11e1aa40177b45ed3199edd77e0a2efd584996c46a8913c6fc8589617fdef789253f9279e76c161cbe4d3a8f439c28cd963cb8163fab40b9a0cd8de13abf7c826040a5241fa1a8fd1324eb40906f1f40f9188944362e983d39ab89b87d622df8b32b19c1dbc4d97c4fb9b4cc287ff50de6ec9487bfc6767b2f1b781c853c9f139e1dcebe1c1d7927514b68eaf2b0abeae8c442c775a20598b91456910c819132d19b30fdce330aae2ef32a90db888ef5e09fd5d747c5e54dbf130af6c29677c120ea94e61812530b76b1e60c6dfa31a3a4230c36a90fbfc8846bf932620e3e28c4e863b7992012014668cca1e7346d593a8ac436de93830077cf915f948917d0c21ec2511d831b32ecb99c77fa3c8bbf8542b01ca252d179aed4c24109a2bba3fce9bce75b80f13a3ddf96af9094e3157edf29411e677afe1127188f442ae59a6a5d2ed26c9cd0ba8d9ae3560790e40cbc829b4950585e97bdad5b3908e9a4e108f6a3274fc7915677b74a16091904c21b546bb01beb7c3fee40c8b41ffd07bca9a1187d1eb35cd2cce60b1cef23d58618b255a12ac6a5f0badb9af5abf40bf5d0f201b91b4b9cafe4b0d66c60f7146a6ee25ef7f750a81d6f935027d00ef70e9f48b75d800b0d305db87b8d9e39a1d152fbd1abe6e6dfe0340c70fd2887af99a04a36f173d5ee7210aaca7db26727a5e5e261dceacd56ffcf3fc2038d07ef4a93c12699dae49de9079616e9b38dadbe6bd1c3bedc967f150ef4f02783de16eb8b74121287049024fef877ebd8de1682faacb7962a8fecacd5370bacee8c2302191b0fdef9a79d4a18cbe5ca5ef3bad66fe55fefd8d9dc35e08e8bb11ddbcb9bfbe9b122a6b76b8dc66d99a064f26faf3096a4de5465ae8dacfdbb4840f9334475b8357d42140802c104bbbfa2fffe827859ed650ccbcf5c7dee37b288b34158a355889067261faf5af94d6d2e2cec9caca7edc1662e68a74fb41d9d5ce39fc9fb38539b89e1ad71a7fe2d658385463eff43d63f106f2171c92c559885af31c0ab7ae85a8e031208e899844278eea1d3da9aa5e4a94e8d9b73549ead2085088f13bdd567e1e2e23923072ab76220881d015e3fb390687449bc8ad829ab6286823d18bb8440dbec107c72d15f281e316e4c0548aad0fd8e9d7e7706a427ae31db9c2732d4cfdd671cb99d5c7ad6555f9f583a60930ec2da44dc5423637f9a3b655c284b8269e9a0fd9e446096468056e7a6d598190398341421726f366ee0261c6d0ad1203198378f1881d9ffe0061319105af7f2f9fe91357cb5033999c0c0f32496a4cf22878368556c146eb1ba76433e3921bfb36dc09e1fa738ef170a634a64ad9c2c93d485a7dd7d38a0895d936e29284af993f425c224c3c22c4916790c311bd120eb970b43307cb9273c98501ead19ca024ddca20ed8a78b797d4b164b3223f8a33790f94f1daaedfcdf523808207e8383cdfc5fa2913507d176d1630a08b2f8a090081c41ad355ea28606ca789cc2aacbe421e13bfffc564ea6e245acb8f7514f6f94da50b60fa95a3d256697aec17c633e1ab278fb4c4ba3acda78ffdd628cc1277f9432d2c681419a8973500ab4ded261d4b42b3edb16f4198e89302822bf11727fe79a5143b43d40dfcb1ef38a6ad491a788c4bda413bde92ef99e44604db7fde66a0ef8a3c4c3a30498e5ec09b2a65abbd1c10e906853cf88a05119aa502b8f8fd03e9647c81e1887ef754ae16fbaf6e387db28643b8b66a4e9e7faf31d087f5e1350257bc5c802a07998bf666a33fc3f60b28d9835dcebf8c5809e622378670814c30b9dd457159fb26b53e1c95e168660809b882ddc1c3d4549288db429866d34c76220154ddd4ab9e5596c13f60e13cf96bf5f831737c841c40aafa8e905cd01d7ab146bfd12aad52c7a685d8515377ebc87b2a9b1c3e6a93e0ac6a54d68a86260ddf635adaf7b09598a7d21c060a04e0c9273540f449264330a1d8d3f2a33cd214b7d4b76489a8eb05246f31457281204fd66872eb4057ed6284e4ad0f8095c26b3f54a17ebbbc427c68b12586e5104ff44053f4ac1f17aa6a8a59a4567d7e30b5394b69ac5dda4b22ba27d1c0251d2e60f627cf05e2c984cf15f84e0a9842896dc232d1347dd9a1fb0cbf58c2c039258059c52731179d1fcb8913b1c1a158858a408172d333c2f894e7877824f0b1507daa2733aaba1cfcbeaf786dfac0cf36624f6146a8173df41f0daaceb7d50e5dc2472c079d5adc8361313e20d8f575c031ede05dddbb7865d982f272dce26837d7fb61c6990e77379061ae6ce5b9fc9f3355bd4ff9a7db73f940fdfe0eb48a1152e89c4928723e9edc14bce90b22779c1b72f36bf24856720cb33f6a809bc9d2ad421fed5227bce558898c88f3f23114a453e7af0b0a760f9483396b571a37a4f255037ea0b2986f9a1f398bc80869d5d7d1de832cc72a10645984cd021c490e97306ef075a842a3791b2ca4816f3d23733ca16e917342c1203d8c846b1ab1be32eafe49924c8e1b81489d892215e90c59026138d530d1577b2f8010057e218bf92446dd05de7d6b9678420e0ffe060cb9412de06edc13e639d5a655b08ac6e3523aadd118ee1b108b5902e9f0cd94f59f9b21b25abadd84112b91a60ef254c0f394da418e64431e6eded88c865a976ae8b6332b92e02c324ce0238aeeeb94f1776b98401f04da5fb7e167fe892753678f7bffbfc1829c2ad70529723034e1bd36b9ca33716114aa3b90bd8c13b4fcdb9fc8a0235715a1463a91d7ef8814842283b1258808f4ad671c0e7611d7ff28f98300b79b63e266b7d0443ff9c99f7ca59936cfb22543b319f4ae0f8612416d7ee803b04c63c275d721f6fad0b60dc7a053fb11c72e33a78424addca64160ec17c71c5f0094cd63d2df90d565873ce629ff1f0bec2412a5253932cb1f931b36f566f757061fee36a8b4c4548793ff9e71cf318743f4a1c9488be3994f7b7e86c6e1281db3e77804bf2c7622474d9d9c4ca648988fed0e6d84bca4aac8479dcd701568470bd61f0c0b2888a1f23a35b559c0b816acfd6c1e53b892f17b9ecdb8650498a2eb11c812c800ff12a02b563beb2ef9efdcaaab337fa9572e92eba5aea0bad4877fce4843427637b7fd88535a30829795afff493e9998b5aaae17cbb6cb83b561a84061beb8619da0ca7a2e5142f10096d9890c65502ac423a1b164c23afa34de779d0ff0ef6d883f44c9628dab15b6d5dd7ce05118633e841f563d65ebd0b2614094a2e1b0de1f9c3f230f167c8dd67e2a20fe7f90ddff7b06f55b7462db05987eac44bfe9432bff0133585b7494c9a4c93b76edaff2e6d22a0e93e1e9e1985c9f8dda50822ae7747a8ab46ba238f438985335129a133fba59fcb64e969414be2ed36efd293956e3c89c5ebf846283b6a2d78cd2a5e3858e18c51cfa4255a0121b4af12ec4a3295fe949668d6907f7b5f0b9f9640b239d6d6367073680ab93f2cb1851ed0aacb307fe3145bdf49df5fbd414e3c225d645aa86c26f5896f1d7aaf13cc0a00cc2dedd5d3453bbba6830d804ad401b8fab7f6510dba3a21d65d5468e1107a7ddd63c06645ce6c7f89e82fb95439384811ad02a1ef00f16bca32421490c87f6d3d140d1ba6234ff9a3b74e66e774aec2807fe18700587a5090a6aa5f0f00e868f459d93831af24186695eb3c33d68cf6df43d2d3d1bd6f6420f1d7ef572d8e5d1d60d9f5071ffaab15d02417b4d6c94ace7a8246fb6bb4c2d45f04ec2f44400dac6fdc84798834340191dc18b137a836fd394798eed4ebfc39be3850e33893de7f928deb834d8cfa9342e2eb1250506f0d555007098d0a21cc8e4e3a636eff171ce4160a842f925ff50c3b1d257d699723b3b0d47225b092139d06c9043b87c0bd370d17064c7fa9b35ecfa6c0acd3aa3ad8170850d3c9a5d2bcf14221d77378e28dce1070af311c3c5a72247d9a43eeae38c0fbede23f500cb8a372df5b2c6a1437725dbb82f94dacfe713b8854c1607ef473d8b437bcc5866cb10a8bf9f7d056e6501d2e89ee8b52546ac2c1153f00b7a765eb435eba65bac805fe592142aeafeb5019d6d0f15a6730ce85837e2a08478c2dbef608b0c7912667f3576817d187ac4a22836bca24addffac70c15cce5604b0d7749d856cf75f7875c50b747ede9a43d3878708283283bf908efb14d4544ac28e96a7ef042a54ed91599496c40bf9fbfeea1a49c7760449c5d4f7008d7224d4b3829aac6b55a3f2295966d31821e20de126a7bc34a17d65f1db753ad4868a847c95a79b6d1b037ca9403f12639c5d94eac2e8087b0d302f914fb068290f77be34a0ead151b5e673273b54c0a986c85101d3616387644d3d535905e9baa83618092c54841479a06043804e081821364af4a5bd7151e77606ae4756e415a6debc80fc31e0f40665cb4521ad0eb25f09c307687630652570d83defe779d94d8bda202dd68b64b7f64c39edea7b911f58b975bfbc2de1c1ccd55bbd5c5d98b3e3a6a44899d4733dd5e73f5091ae98d83cce87a252d710a63b68b6b4d738e78b24b4413463850def2ac43fa0a87b9fae3d84a53df24655d86dd6a367f92eec4f52a2dfe029bf0d39fdf1562f38419a95fa3f1a9cb44d35b944c02b499304de70db1430a535522898b77eb812a54d0a8bdc3eb5c07f12e5c215def461a268a01fc77e2f3d43ae5daaf1092ad043548adba9db475f903985cf2075e1dfe217d44105466f6f107349c0290aa4f7e2f5d3a1dc1c8fde1ca8c79332014b6cc839bc05faa9e5405948cb91955c07e00dadeda8f0dea0a8e6cc6a6d93d20b769821f5aa4db2c0998f274583e6e5a648eee828a996341e1497c63118aab06c06c7195b80aacb62d6be6e8a10fc50ca56b9b94ab03a3c338e3a16be7aaa6b3d385bbea89c81b5b907a0c8c2fed07770ad3b1c8390f4c1215313e6981235160fda3bf0f46421b834856c83c6c42a575cbcd255cf4e9419f56565647bc1406f4aeceaa601732585496c4d0fa05b221b55179c211b90934b756c7c00afe15894635538d2267924c6c244a01bb536e08dcd1b35887db3d746dd7bc14923b54a3497da8637dda356beccdc18696cf58e69ab762792d874aa1e44c5a8dd577974d1c667f1e8a0aa72814bca3f937786b74a13198b9355606f8b11fb174a8b8b2d9c81bbafe90bebec204a3a93050328eaa3285f2f056199597bcc353e14b308bb5c3e22d91edd401124e03727bad236899b8fc26d0b51dcacc2b0da9414aa7683c3af2393cb106ca6223d4bcb37b77706a31bff303252e2c015dd0cd91a28fe85a9c28391e988ce70827c1db78ced988d71963e3e6de4b0588101375f33b79cb8d57c09a1c3637663da52523aab19532c031b883922e4ef836f34b515b3dee861f7907fa04c0cd4e083d68225d86851cb9f671c81672804714a9020acd0ca0be4f9c33eafd9286b844fab9c2a8580b5f79c7ed7992bb34c19eb5ee1aa38ebd620c999b91ffec0902d5fa933c47667c0628272ff3e9d58e623049ae0c3caa0f7223a48bd647a58ce1e95a62ba21b7505121cbd13411982ddf338793177c821ef7e2454dd2180c7e968f24cf53efbf7e962f769ded72c00c7312ea2dbd47ca95ca1eff0aeec8a8f331bd7405b44840cb0ba3b0cfded40a208730fe62e537c99561714de7d4f3c81e0824d7a045db8da8f9c88e1114a9a0c97e1fccb7f0126a95d942350ac132157eed442117c22cd69487a004c08d03eff97569e18adf23d2b54dbc924433b6efe4e20f42311ccdd66943bd5e31db7d4b1052446626486800a178347c5475274751719c7ff66073d2120652cdc9f1affc2a350583ede431cc85ec00dc441a6b529592a8aeea99047d257a05744f281982f8178c9a1364e21c9dd63fdae573e2b47f87b138a4b3597377a507e898492dfa61bb255c40fafc8bd9349896abe0a08b191cf1adb21432660a663656c53bae3b8f7db657878b2bb2d93e62ea399aeb6f5757e775b8e7fb3696da882d24d6f9465f1566edc0d2d6c08d2cd1a5dc56f30f9c47f78fedbd58d09ddac40b279026d513b7f9c1ab721dd1f8a6835218b0c62d8e03c6af48d530d6ba7c74ed3f11b51ac0b9a8f319ced2cd2846b6ed308a1551551dd598fd2f406e8731af3a8da3dc6fbbed744e4b22b3d73d5331bbb7245082ac9df6d72fd59db877d9b8bd442d0f671ef0eb2b872439c1eeb6b92368c52b662536b1e85645705511119f00949d5f2890652d1a71d5457674eb761b9d02657498f9b9f7bd8a2cf1cd6b1d5b45d64c00c7f2be2e546ab6e74d491898addc3e762c4476cddd4e5711f5a4ab6153e333204faa185c56c2a81628ddbf4004ccf4ce649c120d20fa33219d0196dcc0c7bafe2e34eaf327171a72a52c93528559ccc5961e1d502b158a7a701114c47f35cfedff455c23a67f5de66887b46bcda187dcb46f00c16e2225e88fc9fcbe5667a0676bbd527d371bd08eb4abec65801c226e021da0e0526dd1882755901482e8070572a43366ac23da5a14bc96330afb604b5367f64ac9fea96321efb0ddad7c329b3feee015b6a668e4473aa520c94ec95d4e367b50fbcdfcfd81e173052526cb65a34aa748476112c0c25dd60eb7a532d90f541bb948dc26018f4443bc714c6e67c0a18dacd5c6141b2ba8cca6bc820658d6de9523a8a42066fb0b3b56eed8f9ddf2d3735f87fc49ed82542fc2f8c4b1b71b1ae93c62ea07f1cc052c9dfbfa52f2f180943ca05feb7d5dfb04f57d4de9136542f9facb60af908e6c4a047496bf382a1658ec47d3a27be7027ec8555222f9f16dff7029983ba3bf0e99a913ee6f98ae03bf295f86469f935e0c0e89658d116a697009a0ab5a99a7434d55c25a770d4b57a741a55dcd7ae33ee33e819bad15413789fa3f1a6f116bd45c9cfcd8f0de0fe6c71814939633b8cc3bbab36ba416e0fc45a5ede806620506a6e5e222f0eae213c7e3a3a359fa4354a6d9e04dab5ced04bd140a0ed447f9ca458a9899933495f0337ae057093e52ad9aab05c6e4e161a540cc70e4f24bc7140ba401b836897e8651eccabf4fc3a1c0c829668dbbfc3448dd5cb20575753e7b1fb97a098386a10c9fc551021eb23eb681dca3c440b98b9bdc80723afdf5f22bbe5989755e2129648133ac04c1975118af613dfe9883d2982cfae922a19b44a875ca75ed3f5b92f704a2a0c8ac787e9f090f1b0c6f66223985544b68a5696f2afffd15601443e29d2afc6d9ffdb4f32b67e4e8720fb29102cdf4383e58ccbbafb106264e5a2fe47ff0f0e573c2e98b849a9f1b3129686a071e9b57540cbad68dd72e553dca204ee40ed99e0367ca45e42ca058f9c14da69349c183d8fc49d8236a0e81c9daed7082366627e9c95f72f67acacb320ed35c915d1abb8e49340e41bd3c04cc591a115e1664a9b6d8397097d9a6622a7c60e7869194589be5c0c7d6f0854dcb9f535625af328875c6266c3c0ff3df818ade7283bc1aaedee4b29e90666ccfe4e2b0d451f0972105ad695abde4cb846bd99573060701d477496c20f5c8a611cda86e46e6194b8b2974cad6b5fed3af15df6447fedb1922d54f71e325e7f27a8303fa42f60c14c6caab36ec22053599b1091540235472e37e774eaf461a4a64c54b9a482629495326b53b08c825e0d19a725f14d12fa7e2efac47bb2cbdc598af68f24e7f338c5d55950b2d47e09b6037e30247083a29038785da56134b57863725531cd427c13af0298dce83e68f17d13a85c2e28fe7d34a05250583b1a4732ca0090be652819091c161205f7edba145eb9f65351a85ebbce227e9aced84dc34de4cab1af36f52a01f287f1b8d58f35a17306270a19c057809e24ff4b78082df40a77de032f987d7827299f616be6249f4e5a3e190cc6aeb85ef605e27b80001a4ec66357ef621ad06649953c201770cdf8ab794ba2d74500a65aad04b9c8d793237185e79aca34c5b8d3399be558c70e4e907e9e70d798d62cb1888b1b0d6aeea4ab6c90c9a2b045221ec0a1df232b6bec70ebd5accf45927311c96e3a463d03039a27c137caff88b36ad06388da213ec1fc0c75c6c646faa14da7fc748dc01be9e6b62236053d79a50181fffe0700fd7d78815c3b99445ae88140febede19210e7dbb3db72b4c55b63cfd78aaefd598595faa58f9e72d00bd9b102bedc15fd31f33fd3a840c19987a91b1142b1f26df9635230eacc243f27b4fce3b1ef62cbcee2b30f3ac216218376d40db08bc35ad5f4a6f5ac0008a9032ed17e78798de71ba21709c63fddc113f14f320799c29e7ba89871e9225ac953bc3457e45470ede7b9fcd70714abc8dc19a4802bd06ab1acd59d69816778d55e7c9f10ed257d28e9c6e9ae0e3d53485a20ef6c2a46d6355a64ccadb040450dfa5f12c3f535c296e08e1183a685b57ada0ff8960a6a0d895e09c511fc79aacbcd03026b47eeb3ab4eb57beac82492303e129c3e168028c112518bb7ebb9fa4269617cb2ab61484914993a79a3f117434dc928047f2f549bc7fd0a3c4e593c7a554d046a94e549cf505fadc3537301f3be458add522bdcf5fdbc9942dcb34c158cb713e2df0ef0db5c7ef5500bff6bb2822c71a88b2c094d1ffc7e130a53552b4b3fab54e8372be661614df20cb7396a788eb565e30979e3c2b318a51257323b0f99ae03d179247f888ab731227111791f95134c2efd1dd44ab7857440fab93bbe07e6ca3e9b0d5468aa1c478ebc60606f5716b6a1bb53c366fe23fcdd205369178acd5dd230abbb0734270ed92436b5e73d0bfab9e956be48f2c31ad986acd2dbc06dea2763ce85e55ca73fb13e3d12fb5e8267cb7450057e4f4a0d1a7e3436ab139ec637c0cfd8d5bf14cc6e43cc61665973524a86121c07ae6611e43a5adbebe35549b42a4488fa0914243d47d13368da811e38483b67ebe5a4ea2f09a23b70dad0dd3693ba771899dce8da192f9b9536b801d3e0391968da8416b762aac180e30add2c730c85e400c27b419a2af339e481522297e3283566d296aa7691c15a87bd8c3a831ef477e13e9ac3d44e62731757b1838ae3b88ea3a5db9eb9c7b38bf16aa75cbe2ae9faede2366a17f9a208b3da4af81b2af3a7ca7b6a8c874d5f0d59e20a26143e911d4ba99925a47c5cf23c72d788bcb756a75653bd55cb0c13cb93e930b2e4ab236318e85d441b52af6793996abeac4e692961f7d335baf155068a2e99625def90b8434b80357e484381a791ed7ebf981d7dd5c202a15bd2536845660dff3a9a1ca6e9b7a2f904d1920cd7954918812ba863411a026440fbae3dcb3459d8a2c44695d23eb3abb56e2dc1935632787b33989b9876c6c3b03e50021740d3ba464d536e85a486004812ad1544ed10c4751ae13344102c44e50695a569ffe6d4083d5b26c2f46d7c5840c27856f45938bb13bd91e193c4f61c1f5ec2ce8e3a322a3b535a992633c3c82b62e5a3b81eee21d620fab80af635b1f85da35d204b07e5b6455d3db7e352f9f2968edce3a0c34fb0ac425da027b98d509d0862ad351763d7c4c9a4432b2cf741e2385bb26e7acb333b093aed231bc695330b188f140dcb89d752b9f9cf11716a076bf19690e8196f0ac4483e775625500edbb88e78a3befb70cbac0634ae3b998aa0b34db39f0c088f2196550552015a405c20cb171bccd981445b21176c24ebbbc32b2931c15a0f84fdeb8a9650f6af563f60b374da42601a6f7c9e1ac6ecb854712ccd5a9e811cdbe2229d8d517ff7e809e758bf7c03a88884bd33f7f1cff3c4e317d612e57c42af0da0deca619ec7a16f49131aaa68d42c4119565da3af3aab8804cf3e81b9c4cd389bf1c95c229a049b696d2f20b348b68d1c41441158a1a866446164e9fb4367dd861f287bd543eb164f57b1e80985bfbb0a75be18ada1ab4079301502bc7fbc086d2691082f4fd94c90c9429c99a703d724ea4287b70d58759a75ea71106b0e9745fbac0ac1d4b8d6b6c06b885413e3165f0fbea378507ff3c470a9acf63d241777f486386cbc66755d170e8a5a80fdc88d26b018aa35739993e7e8992ccb2ccd4edcba28e6cfb6241efe1689dd2f1aae17a4c1f765e5136a2288db67da39672195e702596a0b70b47299741f4e83390e3f342c046f2545766807f7b5d7ec0d867ba5e086ca36067a3e9c48ae593e101c9b517df65a4d2aaa16d3c996a1fcbe7fceb97a1f5bba29715407900f03f4e072335c34be830a347f75b74431496e01bea0f6767c3e7094be5669b514526fe0e55e808ed29f649542d2b641308cbd9b5f899d3fa8557891cc925bce017ebb6ad0c2fea702cc88dbcee394038c6f0b340db763e5fe15587df7d396da30abb4e3261a3fd41a36b17646fedc3ab94e585e989dab3ab2ccf4601e272bd1340e99ea9ed62eeedc719733b3077aecc88a1a77635003e81c1192d817f52afe089fd96df5f61f2c0f4bcd6490acbb9ee362247b8553860b5192d32b9592343c52f51897b45e3184c2986c2281572bc18a50463a2047c234fe0e7182c4f80600dd2c282209d207027be10db7e706e71f17e9c2ea51fec610fe718a5bca17387fed873dd0ecd822921d280487ffce790df1cf8e538c3d2864ca7532db8208f4bddd4a0fa9fd8b38b87c921d762cbb10b490af8262ecc0eb162b9d4218721a71c19618ec7e0392b9cc9ee104ed99474ae02a21b9af976b7b126696d075bc0c253106ad98fb7112844a6f5c91d2dc74cbb81d0225b2ca6baccdb8a21d08b3c500449aff7cf3bc704827acf1ed25ab076a0756d4f435b96c7b3f78793c311739242dff63a0ea974782d6135d49222f2d66f3a801a9f87eddbbef3d4f8bb9d14697587ef19a190562f768ee29b79563f4a7c3b9f906cf54cd1badba02d2ed7fbd5748988759103732fb186d2d1f2107ee1e8a706dc5e82149d7ed370d425a67c3f61686c652616e5eb6d782798ffff47b0a697a02a767655534c1bc1ecb71534b1798dda5c59adcf3a606a08c470d630c48c04ac34f6fca0baee01628d8b52d35257db44e995f3902ed32a84115168399107f2e4ce29733e5e9885f890cf53bab977906c42053d92b91831f42ac0f9562495c29dabe1162d57b2afc61d53cc893522818ac13cb266406b6659c2b8256401656e6cf45e43faa3b08a05dfd0307e6abd2365db2c7b13cce1b62c296d1b839899fcb4ddd31d17929822870756b93efd48f65ce56c0456ed0d376d7ac275282beacdba789253affafc7c162cb205178b92814a447c0a58563eb212e2c57693c25a42d820dbd5bd9df82c38e2e0cfb37823dbb5eb9924a848c83f5e87d53b324855499615300e8bdfc06beeb90bb2357e729f1f5c9c1ed405708ef046d602192ed4c3314b2e882ca19a175bf3a2cf2fb579ca16a4a008147684d7d10cc978abc1a15df0999d00950b92c34fec9340a25bf95e3b82f74b046c20be1ee9cea051055961e997e5c2e314141177a745c328aba7fafd05149b4430135836eca3cf076cbed9c34c3f7a93b6a8e8231266b24368a8b85c694bf7a30a046b74e25955f3615d404585759d215c38ced97abc0eec14251fd0f3541a6124ebe4b0309aad20459f750910cf1fbaaa49b7ab023a7244815e1ae4f5a299123548226d512bf52995aaf7112bc5470142587bad7258cad0ffbd9e5cd720dddfb467a61cac7cdbf0ba8be4be4d5690cc6bf9c2cc7ba65e8ba0ac2bda65aeb969502aa4a1c78e079b1cab3dcac5fad3618953660b40eb0d3487153decebee55dd0fe8f3da986268e7f980ef85395d02b277eae1a079b0ffe9df8b7a3dc7fa208125193c597c5cffb5f6337d58374fc5fe08c0c11bc6d7d114acff3898afe8a8eb47c8855983dbf2c57e0742f3e909cca9221ca770001bea85283cae48429e1466ca9669a4823e5b2842c89a462f6bad5c9b257e8ba1d1adb45382c5ac695d92683f06fe1838ee8da71a35741d3e208e664abccac8f311e8eaae2702f75199eb32efa0ba3d986638fa160096ff52c6aa2eccb10994de7ca31d1b41e75e765d546f0d29ca1596c66e0a59117b2fffa8965517c79dcc1dca80245f37960f606b468de54d8c53a481070ec5a136a228e38daae7fade7a9901044410a0622afd92bd0f75e4186316e3848d975077b9cd2f9445cdd53f8b12d9e9b84a1253f28e335bb5e6b7ca142fc70ebfb9d1a0160d6b740c7f920cb6156ace9a7ddb1eda66d2526151335eb012482b2559b3dca10980349a6a79919a7f0a27b29ac634589715ec9960c9368a5d1e5ad6a54b502b99f81a72483e6db177ab9e6a388a6350b3c9d4dc1a9568f6ab37f0ca9fdff3cebcd75ed1a9d65ac211bb086247334fbbe72d1f2a1ec892446ff72e425f1bf535a9e352d6237dba279d24f2c4cfcc15f18a38073955ad568e208d5c2fbf44f6991d6bebc2314ef3114de5d33c5825c412fe9b8e1ecfdf5e6895522a11fd82c8520579b6699f756cacb3ad361d18f726f57607606f009de77c45a37eac0a5ef501ad875632f44b65696370613cee04283529bc539ff8ab8dc71609c730c682f997548c6b0f878fa5c3a915d4a414fa995b038582c18ac14cbc38eab69a0cd06cc3829fd1955736bea523608fa040ca5f25a1c3b078bd821a093775a22e45f03aa4e3f578d18e9653a78ee96968390f999a04d4d8dfa929f14585c3c59118acbac5731584424fb8b054105c18503ba616bd91acd517c11902cca023e9b339c2745b1441bf5902189d035786038ef7468d2102e1803ee2d0823380214cdb80aefe2d9542231a63182d1a4d1e8cb9aa95c7dfbec0e45fd99e01260ccc7f6a8797f842dc1b1c4fd00adf9c01213731d793ed1ef15cead98ef8ad8600a4b6c22c0b4a6ed630fc3fa6edab6ff1cdb93da7fdb01482529b0927e00dfd849da00a5f0a3af79ca756dc81bf38b55dd992a5c4b195fbad7879170eb6583ed6e6da9567f48b6c29165e094ac78c9314885ca81dce5e83d20ad5abe1748a85a8d77797f425d0c212ecb2d9c4340080c304ee4ec611bc1b4c746c2028b213cfda833a8ab031bbdc86f1573794918cdba8b9b12446de3ab41f432c06b0473964832934b056df907d4d0886174e93207012ba0510a2a720fbc123df3d7973994a2d37d17bbde65a9052c32ea4a9eeca6376f6892efaccb15f2d2f3147e6323012227e06df99c3290224fffdbefddfc0419b35c43f3ff605622c3f1f637d705c6f85735332539ddf944f08899e9f10db362360f1fd81887d9ff1b19883e160d33e8c43303543637dc2ef471838e675033d6422e75718011fad2d2aa95b88ede49e63515e01b4a67dfdfc10a7bdea9fc44c367b32b5bf1373c93f7408590214f8917fafdac853e0ac06caf29c02ddf46e3e9fe6dd42cbdba99f3443b32c03844d7317c46b3736ff1790c121d27f58d02e031464a79d14cb8fa87a0f36cac25e161ae0c86a579ba9dddc25c9f22a894988eb3f082a4db6364d4124b163c427433707bd65f8749a2fe9e48dbb95ec522ee1532647ef4c3d3914245934d1956b65e62c480e138ea381c008cc36ebe541931164619c0423ad3f1b006b7180a670f8ec42a1c5d23adb34f94e8923b6cbdab6e9bc461c1d4e760aa02c9a58ee57060bdd61e69e418db70caaf5d627c8c28b279b0616573d1156edd31aa896783d6b9d8476c399596f6212b2118d9c4252fe9582c1d7eabfa64b63eda4f02831d2c26877654ba5bff1f7221ac21e1978691d5f0ad133cbae796a41c4cfcee54742b8c32b3b3ebf665920ff9c5064256242f9b3123960dfcd6b8b565b05e6fa4c242869cd191ecea62ea130c4022cc75d73722e90214529268a1116da3c388f7a8444f2e38fdf232d6d937a6f927ff639e46822a590bc08334165ed541fe4df286b04e692b3dab68fccca13f343cf2b7194d964600e40c7e01bd482923517bb537f3dca989c551a8677e92a8dffe401a379e020e8cfc5a50f208cb28d2277a3f0b757346c8c5949910935816cff07c5907aa121737b5ec576ba6eb598ca38df1bf9f9ce58e7bba9a326f1f79c371601885cbf5f869ef7ab61de86aab68cb84ac34d8b00719f0b9d79202e34709ccd22c865f825a4592229932b87c68c24e499a99b9be071737a506e80644bda5c286e0eb35d7619a4a482c4f07da3b2775941a499b0b3f5fbd3a203fa0d071d210b358c4f40f33f26ab5ab24db6090e90ce194403aeaecd0c710dd65795a035a4ffd32be81f52b095c2eab2cc1c50ace483e6767ff07df49f26d32563d8694edff2c0dbe650cc0e0d8a78f71854d8b0dc1758155cfdce898d62e813727465086f016468572999e70c8f7599d3a1354c71f3e8daf43b02ade7568ebf03cb076ca99107f81f04cd8748062fa4fe710ad3539493982f23e810a3cd7cb9e0fafb22b939132219f65f8402a77a4dcdf086e2f299026bd5731088b97434779c3a91f063cc9067807b9929ba5c956722dc00482329780a6bc4934025743e02e0ac2b844c3acf44352203a5947804369db5ca4da286d75d68d6f2422be879c3877257725ca3a84f81a73e5a81878164c130a1b53ab3e07a3aa990fa30144de232cb800f910443088a9cf5087ec0425b0832b30765179ff971f412c48acc27764aa2970c71ea67c2ac841c0264e80213a495c07cd7b548cff5f87453f314772d0b64523a4ac346e9a7638a9778531cbd0ecb60ebf7c801ca4a42628954b6bbfb9fe749bf421efef45f71b970627fd0832f00159414c0fa210346f2d3845a5bc917325360827db8e375bae6c56f410c79ab3a7fd70f1a0fba61c1a621bd058c16c7118420a037f5ba8d7260f0c897b19b656565d633d350859f5648c8160c63f2ff1b56819d5bc90febcf4eda5c0e7a2ef10149d7a5baa45afa7f7d423f54220f4342625a48a5878718f04888ba5c4826dbdcd4555e8075537bc473dff94aefec723d89d81838f646611219e01df5ea5515f5530b358e16783424811bcca5e5316dfb61a8f67d84106c745b0b170bbb7d42d0197e39d1a6d12114ef37488a0715d063e84e98fad7e342e2d5b3b0843cc1f456b10a9a2644297791076801cad64081674c08925bb49b324eabfe08f75c12f46308e710d3219f6941204b87322f0d3164ed50d01c8238460597a83a713ddfa14a8bb5daa0e983775317d21c24c17cc8da373c96620ff27c31f57978213bc7edaf03112cfb1fb3997129eb31d5708c2a6b605a7d4b109540c96803eb938dba7cea21c5edb5ca7255aa480ff3ae4d1d188366b91b984cde973022509fd9d301368dadd383439e5dc7eea2bb0e9cbb660c7bfc0224403fff18a8daaba7fed38c06919eea938ed5adc281643325d1de87365f00aff9d50c68036a020b8313f0a67a971cbb6350e14f0a8c06aef9954c8efb6b4be2fb4a13d688109098852e02fc55bbcc01baf052648cae44a93cca4fca29168dfea1d06b9c9344b8a374f7c1058344a47001c9ffc08ed3d0156652d9f2882615ae76d8d1377224a84dfb298c83f2cfb6c3cef1f849519c9ecf5e7e52e62ce9c66f85a9400c63fbd02b3d37e13f2c89809e12741be003afc88f995ba60b5477650f63df60bd30ad03921bb65b4c84582d912426a153b537c7d824cec8e1dfbb33b2cf30ccb31ffd013232d3d53c691cc262cc171a3ae9da97cf5fe677433728acdc3294ea79dd250cea4d9aaf2bd51a0010b586dce393017e292cc0459a835fc652d7cd66abb0500d95e3f04eb309f3ca90dfec8c1119c691fff1a04a384ddcfceb74e3162940920b76e64c80cf4ce4a5b3cd449c839b19c2e0068dd8c46fc506e9a905a4a16c3d21665a0916014aca5468390f8ebcbb375601afe0544b194eb97283aaa499733fed3944241086a1d82001691b75fc051a011e1c98651318b48b8d109d821cef3663627986bc49ddb55b93d60fd720a8759f315ef947b541981c32c403ad430e5b9cc87be358fe514d4d9b6ed211c77e72c71c136412728fb037faddf07e84a03a91bb28feb3c44a96604d781e3b8d100b51b651e029d19fb6b5261307ebcf27bdadeeee7c8fc6658785cc1323aa2a7f5d12d639ad71e91332f80ceb3111d8e701a815ef294ce7e2d247052c99e9b64413e61c87e1b7e96198f8a6244b94b124e7b2228ef653dc35b48e15a148664a360d21278907392cec5b37ab60d703ccc71f2016f33eaab3fac531ff92d840230d2a038b5e15c3e482c42b2465ee1e0542fa0dda7d5f5241cf8536fe98c4de80910eaa0bffae1397a1967e7b00f2afcddcea6023357028ec884ed5e5dc38da4d704f6259f3058d4bc2614739cc6230c9f1467c35c8bb4b6421680020c365f619a407f45cc5bc0197069e6991aac28e3f1589bb59fc99ca1b5aca2284b08e441eb576f2b708b64d414b2223e46f6fb55225005395bb1c8ef94079a7df2d26437051e149f6544bd10a66585604ef294c9bf9a783b17117ffc3a05ddd7073b629bda6a582270f3ed12e3ca40a9a83cd1d8148aef840e8fde04a4f2942b5900b7c79dd941f72be5dddea884c8421293cf08e6527400099672e1288e1ab957df1ba3090fe9aebeda5b48ef6bac2a39fbca30b5baa3691d4ec7661bcd2bdf5ec4f2d7cc3018e9e7da8f9571aa2501f9d3d5678091ae413e81bc9368f1193fa95ee437cd27447d944094cbd034a04639f5a304cca9a0e7589ed157bf66477b1ff7608fca9fdfbff9b9b3b641b094267b4eaa879bbbe76e5fe3b015a3336b8f3383f78bf2ab4a968fc14f467b68e18009de8475ceb0a13775033867d5ac9e00a1c4d5a6f5ad2f69652ca9452b009ff09ad095eb8a6db7857f58d46d363fa463fc134fa3b11e9f6771a6f2818488a1dd0eba24361a01fecb7e7fa36c95879d371110431afe5b190ebf9bf96d76a7d656fd916b7ba6a3df72a22e7f8661fc8cb2f2f8bcc402dca7903099ea45a6bad319c9925d11b7ab228d140b9602559a94af294a5861dda3ca1823d7102aa82c902ca87294fbaf8e1066773434f1625fa54cd98ca2689c6d0a40b13830c459e89145190512203021688f0c2e48a270f6aa9dadac31319ea931b5ab0b8169a685f3248d3b2da7452da462ebdd1dff1a79452002061e5652d38a4db6f474f0bee86647a59b8e61d679836600c2ef3f08e993bd2f87570154d0a799e770156f23cb6e23a6b711d851f5b85978b599ed8595428782a5c7724fe3c65b26432b71b8070250ed368f7cc73698f10e4ada265209c0cc442f66c09f6e59d1439ce10eded5aed97ec58a3e1c4d2c8c1810e1a3b3d3e1198d4c795cf0a885151974f5e3c88b9590766f6251ffbb0eddd521c6ebf7d7d1222190c84c4ca6019d3ca72c752daa42802f57dfdaa61336d4e2a72370b4f3e661bdddf5a2b8714b8f2fb8bb96c96534a798f6af795efa4cd6d9fbf688773fab794d2369b062510490c2d24619e2419a1460b12aa27ac16992254f8d61a37355902b01801451528a84070c50a2c2c9cd43047c0b086504a29e5374f6e562062840e55508e65864ea1c2e3bc10224bee8e5fab51fc54a5544b96268cf820c92029cb113b6a94c8c2e58ef6a7c097f7dff368fdabf55feb83c8f79ee9eb61cfe3fb9818c4f5dfc3c4204e41c07f3ddb2ae879dffa59f74734f9336bb63694a306866c035fa2c758d36511efc8fb22f0bda7542c7a7deb0556af138b5a2f4523ffd61bc9f73e5777420326282dedc1d7acfb23db8e5927ee402261040d9ad896e779b226c2082f9cec2281af50be8b6afa2443fbce18305f7ed17c5934df138d48903ff4a7c8f2a74a833276bef4dc9334917a35d83673cfeb231b0f31484bb4df75eb7974deb7bee547363adf45084708e97be883e52a11e80a5fff0f03cd9e6be5fb17c97759c522f99e68f47246e5f3f0ef5c9cd978487146c51dadf73a845d96423590d65961e54f4a933ff3bdb09b73d22ecda17817ec8c490342ad9cc639a409dd751fb61ec4c2c73ef20776598706652cdb8c9c8a5c2edfe57bdf2c72bd271a59978b46523462514eeb123d7fb67963ed4efaae679b0ce57bcfc3df25067105b1cd04ccdf0104a9087786ad188bdf54d11c1c047105f9bec500efe543c0e554e412adfce9209ea844993eaf7eeb8beab7bebfd5bd271a79dfbd518bbd8732eb56e87d51cbf3de251abd510ed9f6a1d8514693b2497fd2bcccd77dcff53e88fff7dcef7a1ec2513fc793f0c3856c5071509f6bad5855378765cd1df9ea7aaba3b48a85ead67fa13bb251f9f38be4cff9522c7a19c97f8947362a8e3fe6a5dffd9ce6b4a6893e4eab5fff93e0d0044ad8d1e7d66ffde873d9fffb22ff4ff4c4a27e17787dfa369da2e0512ace18505f3e8fee5d0ce2dfbd14833815f9771f447efdbc56fdee6794b65cf5bb96ab25a97cb16e6fc640954f9fc7fc2a0611833815d59fe2cc16a47b29ce5adcf179dd34f9131e712ff4c1f6f31d6934ff0efdc9c73e9efc99fd4736125adc815482064e6cce69b2d6dc8124dfd6ddb5c4bec964322677cf75e00456260c8ac359ece6f67f356883fb61b1e0e5af6003d806eb6b89c81f0f2ad8facfbb76d878745be0c7be88be053bf96c03c3991465b656947d2c55ee68afec6ab70377c04422f5c1270212fd9275fd170bd9666d38d47d0d3656e7777e26ffa8fb991477207993fce9de99e48fd2d0ed5e03275609e7bb9cefbe8ff8d304dfb1ad7b9a31a03ef822d087e9fc4e0c49e902490a7db0f2f90279cd5eafef81746fd47ddf3ca8bbdd779307517121184fdd3752f7d475dd94dbf591dbfdeb7beadea978902b7dafee9d18a8fb9d1088fce95ea7fb5619eb504eebfe25fa93d3baeec5275676bf430ae588b3ef63247890fcee7548211c71f6893c40fab00f521f7c1eb08f7d4c0c421ff66ceb5e042964bfebbc8060c915c0652f3454dd0e08fbbdcf3748f4896f47be828560d81a796ebf7c2f949d2bcd1725564daa246c7e58ec8e9c5f65ea459b78cdc91d193765b2891d6560083e4ef31acfe52e3f20dd1935d9c48e3469e5abff4db6e1dd4343b50e5e5696071848135684115a6ca39fc19dfb00fea93fd20ec0dba2080c543f47093b7653d61bb621654c6c0b5944807471eb7718b6c1ced46a6e8de25632b70e89b9d5b3b2da4d4b4c52a889d6818586ba69484b3714c4d8ba4ddf3def251ab9bef546df473ba1c8f5df090d609b953ff54d6800dbbc6f00dbe67fa291914cfed43fb2c91f69b24619cbb6d6b36dfee8cdfc8f6cdd14ce5cdc81d438f953bfa15a8326d6f5f903a9ef79d666ddfa1a38b1557efd7e924250d599a450ebeb7b9314aa9f58df25d67770075238df15ca5752656a75538c27ab81be5e3ff4c176cf77eca66eaadfb5833b54af56ef755d68821df7a1b973d87ec3c73edf87c5c23e2c96079c31e08b604871662b3afa22850f30d8ba975fd4bd148bea7bfd23db2d72d96ab0b1ddd7df81d489550d0e25d95116fa60e9f31d87d8fc00a5852cacb842c35ebab9964fbe9295d16e4bffef0322979ce6f5482e8d4777be6d59f3ac1c7b35b28698a24b1a234b7a58c346bc61b2a68d99124c29520596272d1e2693c89552ca1987bbc1063254a4c8a0851a2c2c34998207a90c0e862c5ba496f0ab2b5c58f71cde04eba362ce39e79c73ce2b5cb430320409a41470b0cd3477ce39e79c5fceda862e1560acc8a003939929407089818a2b4c7460340095a58817485071e5031a299d264652b850a384eba1c817567ee5ca085a4c388922aa34fd80431a2f8e988200586438024a0b16397421c50f3e504a29a594524aa1585862045a72534c0461a3515c4a29a594524a7718c87fecb9fe3d6c835d72210127a2f0d084e588ac2dce5c5121a74991264fcc60254a114c707028de804e1c0cab01a3d3c4b160198105154cbcc062c604ac2d9e3c59a214849b27babc98f8110f63de2031c40b356099f29c95282a5ff28d99c27577e22c2bd084952d597c81c4cb5499194baec0f04407295c38391182167bd381e86047cb36baeb36b7c99e76dda54c227b5a7727ca3a83da878f4c27c1cc2cce21b3bae7dfb1879ed37cd049a778c2bc3e68d72d95c99852ea31f3147fd0eb2fbd88adcf5eadf2877af2a7abacb2ca8e79dacbf3798a9465e8e38e3b578eb992622945963ffd1e333f03b5ccaeb1fce3ebdaf80a37bc44ffb8c1652019069779f8877f8a2f83feb43b0ce442dc7d0acbfc1ecdc65a5ecbcbf2644e29a7b5ded7f758a8eb2c9e353c6be49c9d0b3feae59fdf2985dd009e73ce89355a2cdb3fca50b2fd9ed378ced7654aeb0b92a964fa94a7052b2995799776b13801dff33bdf231a39ed8845e1fb88463d1fbe518c17ffc866413863c0051fe3828f312bb2e07bde82ef7919e18cbecf1fd93efc97f145ff329ebe0c19ef231acde81fd964bcd18c8a2714f93c06df00b621c5780c4423230c1e03d1473cb27dcfb3ade747598fc8b618e205e1d10c7370feebd705e1914d0cd916866cfb906d3242b659101ed9186cbd53fda8b7257ad50a9647f430a33f4979d0d4070b9de67f3aaf0e5d5716b2edeb20e779fe6370e771be43fb3ce128de1d91e773489c30271c7d884e8b85f07d7ff0bd8f219e7fe1c8253b8ff339e17874731e0724caa1f43de0707c9e709c97e777c2b1efced3b0861536d49138bf131e5d1d71004d03e76738d6b8389f43e684e0e384ae8785e38c1b7b1b8eaf1b13619f43c2c2fa603895427f721a94d3e4c34022973897785fbdf9e5ca3975a5c089ebc18e8ee39c8e30899daf249bf9a79b6f87732e71c7c578f92ee5423df4e53b94074d318718e29c923f522a9c54f207e7342a6a74772d58bee3c44d9c377138a93495a6d2954e257f80b03f451c8e891b1af2260a12e5e0c08d4dc0e4dcac6f119594586105218c501652104e80bb630dcb1ee9788c283cb4765ecbf5bd4058cce2f4effc8e38e67c8bb30f76bebfc551e777de493af9f3849e6f30e7efe88438a1b58285af304aabdfebafcd3e13c76791efabeeeeeef4ba4f2969f2a7264a29a54bd9b49aacd297a27bd3d04567f70ef61da197ced9ad3a67ab9bd22a25129a90e70c0116e28030420abcbe0cdc7e497fb69c68269a2128173e5f57cb342af2ec98465ff67c815becff4cc1f6bc4c26853eb0e67ac19e6d36146301b874000bb832a7c509dcaf7330609b81a890d9c47b4911dc623f5a69cdf39a44cb3a5969ad34031fecce652d50b840ebc1e6bc01c01bdb61411bc27a6aac99322e18f9e23f1c8687913101a83273c41d2d2dcb0cee8e5ffbe1e3037c9cc3ce7f2a9b0a4ead31235bccdcb6dd563a2a4f539a62f676bbfda84f4d5198a0c0708e48dd8003e788940d51a02cb5129813c58b121f43bdd44a9dd4482f9daa23a0a8d1498dd437201f8f14313bd478a48891d2b7ac36fc3e5c14d8d086871914d8d026046daeac466859e5c614793e63a8f8757850ed3c2a291cd5c74b121c6ef776766f3b291c5dcd832a0d8018294bf89005408c143143b5193e9300307c9962070402c0f0458a199271b47bdbc94f4eca62a488d9e1766f67f7b6eb6a53ef19a45e776f6d37e7f5f0a86b9da68f7db22e8da56d9b27853c2b73a197e7341b7f87b2bbbbbbbb650f0ab6866c9320d10efa9ff77ab9d0ab461bdb59f7b9b13c293d2576ac5df953865eada291101b156fd5c9f45c36bda1e9796fbd9a1372a6dbed96c456eb53857aa2893b565c95fa1feb541d13e5e54d1e99e18e526949ce8f7249e74719e5098a0cd51d254e4aedfc28a7787e9461aebfcc492ba43b4a2cd966821f6516053f4e24a52527aedc7132cd28b21f67138c1f2795eb3f71e39c7222eb8e936a86a9e0c75935fb719eb9fe136b66e59ac0b92345ba1ee329136d9272474aa95cff9142dd1fa9d4f5a754b4eaca1d698e9eb9fea61e79a2883b56a5bae4ba6749284d5f64957c73640a8f73ccb4a24bd40aa557d76d236d731dcc94ebd31d0c133ef5a58601c3d379bcc40d2b9705d21554a67021e608054d535c3db504973b36d51d3bccf5aeea31d7cf4061024a0c848dbe347a13099cd8b9a353b9ee6ee5ba4b5d7f1e9dcaddcb1d3de767ae3f7390bdff3240a2ef8f80673968e4d1555421c2e72ff831079f0b442136a71e3ec4fff7219d942871bbe27ff8168044e1874cc59521e3638044322cf81e90c882d78db17363fc8cf19e991be36d0eeac628c3c28df133902886ec08a5dbf31580443db323eeec618044b30a5e06125500c3092617c6530012c190c97e029048e67329c85d0a9e0724a26082097e07249ac0f29009c1e5791d908867c7b6f33920d18ecef398aaabf33820918e276fce5b9028872685867098c04102078704575c1c0c2e0ece5b2717a704555c9c31572ecec740229c21da0fe530c25a31d61ac0e2b8638d6b9f77b8b600d7dab74c9cb9f66555415cfb9fe4daa73581c4b55f23810dd73e0c24b243ae1b7b10248ac196007361ff02896042e07f2011f8aabae3ce7d8577ecb92fa0fb7abdfd725f4b44b92f3134dcd7bb40a2d77fef72595d97eb3d90c8555b60baadef40a2d6f5c254b99e19cf76168009e256f96092eebcb9dba25b90c30fd5a65ad65e4d8937b6bead696ee5b9b5d65a2bce6b47833bf630a18416258a48820a1f3276f4e6eb460d246a88a105092c544b77fed3a8c0dcf9b5249ceefc184834876aad3a2e14e941892a374954f02d7aa0c0823164a6ee38e34b0e253022052398b418f1e68826ee7c1848346bad74bbdd54a0c2050c324dbc6a2c819bcabaf3655ec4dcf94f4408ee7c5a8d0821eefca122a898829a536d9ca25089c2218b93275c8b2c3cd82f83a924b7be8bca13b0560008d0c5aa4b955bdf135d40a2c9480d527ed022eb4a198f893beef4383144d4ad5f65530529983441040b524800e5a6cb08902845820b9b5b7f7a7fc4a44d15140d48a84052c536b3e8d283102f0baeb0a34cc6369ccb9958106768b398d99c71a700ee9c5235dc2995c59d5c906cc982021d3c18920b5f0a3930890bae214a2fa6262da4a7ef07275e0a2e235ee850a86a458d515289e0bca8354be810ac6ecb902693470a750b0c2f48f6a6c7a30813e52d4d30f01882dba225061e448e6c19f38407529519a8cfc1a2659dd75a31e8d245959f2bb82ea6a46c8ccbb82e8ec840073bbb8ceb220d00907851e40d086a489aea1839cfb16f31096e7b9e4be9628fcbbcad3c07d5583efd503220acec89359a459250e188cd68e785b89b9bcd29f66ddb098500e0c8cde624e5b374cfe8c8858923900b7b0fc7791ba55190204284e0ae7f8e7b61a10907f8e28bac5166dd9ccff910bc98788209fdc585b12d278cbd5b715ae3a0947a1022013cc536e86d98d75f6e5aa8609edc51d4223814b19c7f82ddd35cd88fbe060ad49b9cd0b1c00e625c173dc74057566718c8a75873fb5d7a3206732c35b718cc83c2cd46b080d3ac744bddfe5c4bf9f270d655fe04d368878281fa5b0ffb58ce83d03f9c56c28f9d43a32302c9f27ba38f348d2bb6e1a9e11bb06ffeeee839b631bbfd7e866dc8b7dfef51f08dd8f7fb146c23e763b19b63a517f6d591b173476e57e574ce2879100bf510b7bebaa2e2b97ed3d2c9f11c15da9de1343f83c51dfdeaf663d52072793be8cb9de3a07339e618dbb9b66a346c038b6db4d886ebfb3b8b6d7cdfdf6fd8c6ebfbfde6485af08d9ed234fa463f358dcef9b1dddcfec6826fe4bcce8fdd05dfd0f96ef2254953b8b86cd886f7bf5ad7437965d867ae988172574daca3601a7cf93be92a754e071ba3ba7df908a5db37a96f3495297da3ab9a46f78d1ed3b2a6536e3ff912032931902f5172fb1d89c770fb1d06a6d1af139e00fb1c49a56f3813a6d1ef4e6e3f0e95db6fc39ea2a3601afdb0b0d5308d7e306c2ca75d856dc540cd40fdadb0730cd41f463dd891b360583916a8aec8dd907076ec1bece948d2153bf6111eaa27dc0eadd44b5cb0632bc16e4f550cc19406ca12942476ec250a8ce45098d24c1de5891d9bc93e15914295a62939d8b19b5e4c8ec3228527a6272a4eecd84fb72e5c18e9e2e607282b33d8b1a126c09acaa2089b348d6ba99c1c1555509921d253fd85891d7baa02aa21724cc034558769c18e4da581522e4d19aa9c9baa3141d8b1ab5e4f5db6c0ea92c552e7fa8c153b76ce454595a686a099424a6275f5821ddbeaaabb4db539c3e436e50688a936423456b779b26363d1dc1553b92bca7456bf01811d3b6b3e2d2d21c40dc9c98e7ecb80ea48921f89620a8c4b1451a2b8442186cb992ca52558ece84a4f309eb8c0d0c40506325c9450e1b2e4c51214253bfa12ceed892c24a6284aece84c2da521d24861d5e44e831d5d09b7c50d6bb29ea8f8d304538986a7efc6a40a282b382911d8d1713bb928235f0c29e253fe658a1d7d6a4c054a5262c24889b9024b4a892b29313938958711c28e4e0584a3f2059557f918afaa54b919d8e0925879cecf006147cf71172afa06046ee5576e055261ad5003c814b502ceb1bc0d0f7674ac3617e4864073c5d4c2a73484153c0c8126cab3fc4d0d76f4ac2532aa2e5a246175e982885c973650ba643d7143a2624779a34f4833507961c591a4263bca233838a9b42489ebb66407a5255176944a4762514837798b2262064b0b17555143965882e2831de5d21230b70549d29314a62d48ae6c51ca3145b9c18e92a975cb59110595155c344d81623f6ff965eaf64b2a0f9ae0f6cb2c59180f629c1a9c3c63e5a3c4926fa6740975fb5b090aa766c9f5ef97563c68e6a27c725a3fcf95f2692a197971b5aa8c81fc9bb3f5c29b5b94239ae4a465a85879b57a6d6a509222a5345de1aca865802f4a3cd95ae2914d4a59ef63205bc50ebe1448d0643372bd908ea266cae624ffc8f6b54257c82091d7d55951eb67452d57382b3ab2e590267487d41582ecb68701d9ed6f2155b7fb1a8edd74ab27a56ced2ef4414122da6275797786de6dc9cec12e1fb3003e9642d236a5b777f05506f244727a908b3d7ec82bc48fdc35f0f5f821af8b33297ee0cf01797bf077df78a2f365f28786423a2b21b52648a86c4eb3fea3dbe2cc028d1442e34d53968d7d838f4e1ab29a2b2c4b36dad5f7c49b90fad5c8a9fbfa4642e8cfefaa2864be73d9a0ff6397019070b619b2ed897ddedddd3d0f62a64dc76eda83d28e763de83b9deeeed5ddeb8feeeeb5dbdddd6b37adb46b57698fdad5aed2b047f557ed78ba5e7ab35dca1e3de99c41d26ff4ed1eece8dde9cd3b6ba55cc1c06030180c06832989599c9c17ceeb735e39e0386f4c84812f58ef4cd17df7bb9444b97f9dda703d832074627f77fb9c507ff495df0ce57fde4f7faff6140c21f43c1cf57eca64d68e5eec5d9c9e373de8aff733304862bbefd75b80840bb08dee2995219359ae79907d9ca73fe441f43f1bbe9c063e4e689d063e831f607071c4e934f073b8f5faee2c4fe81b0b4fe80b0bc7d605c597d3acd36efdc4f979a2e7c9efeebb47cb1934a5777b3f767777777beeb3d66e6f47a1e594b8fbf1abc3d677e151ec82633803c17bdcd6bbf75edf0aa86cdf762f1cbd1edefb4f30047f31508ebed19752cfeb72f878c4583b4b782fb95852e537db70792f5d9fc33de48077fd7d4e087ff4edff5e14a42cf4f2a752faccccf45be2d8ba14e7524f1c615cda458a2fb782cb5da4e0e17eee7d47df7bf672ec6875debf14caf90a03ff25be2803ebf7f55ba0582ba0a28e1d2dd11347d98591b3d369948ab30edcbfe6bece6377fed49f320dc77eefe70c9a72fa8d13fab2e7795ef764af2b90c1f673b7cbe512e56d47a1a707fb150463f9c71d7da36f6dbd8be3bc1ce8eb89b30fe4175fb03b56cb6d12174873ce39e79c5ab6d8c2ca953f63c8c7837a9aaefcd7e8197dec3352a52b9fbfbf7850470025b6fb640d17727d5f1084f92ed1fb1ed6a0025ce2d823a3ff8130c348f90a7388bd2bf6333441c8ed76f6d2fa1efc75fd9c52a34b9cb99e8a2f97e89910bbde832fa9c658c936b7a4a5284f56a6c2e4ae661645f22047727ac9a90a8220deefbdbe1fb712ff97962ddadcd77f200852ca693ba29c0af9b6402b85fdc04ff080afeb3d68bf2d90081499698cdffbbf9e411082dcefa7260882df4f94524ee340dfeebdb0ef1667ae7f072a20769981bc10e4944c8281644b34a1e594d32437a5b0f9359461c620774e5152814ad851e2a86efb3355f29c2633b3bff4319fd2e94d3e376faeebe75f5da0cb5adc58b99fbf725caed073c8913c612e51feb844ef1369e174212427ef918abceb8bd06c4eafa7dff77db1b0ef9c733a61c71ebedf2be4eb66ca35c0652d592c5ddc652f97b56425dd9d1e0f8dedfe73c2ca6f70becbe572b93e27ece77a97cbe5daf120970873c55c2e97cbe582c580b03d4ef3d6cb157af7f57a851cf0ae0b043f19c85fac000c247362b1e9e5844e385370fea3af1fb621f6e070c99eb0d8b740d87f1ee8c1843d831dc4fe85a3033bf060de97f862a059072fa7bdc41eb18379633171c86931256ceb7b7a767660b158ec5fb1900023b0b1afd669fd31716708471c3d02046169072fd08a218c7d77c2eef6dc0edc715ae3709a1c62200240d94f1c77ae164f974b70594b9698fbb95e5ec89f1376945d097ecb55410d33f687bc2e79bf594c3c0184f9c1f7531c5dff89de77f70b47ef8b8923901b73b99e9dc6379675edc73e87bb4ce8ae15c7be31317489a06520091359bccc409d43ce5bb6f1bd74fd50d390eff964ff999f681968fe50dfc0611af3a5ce7d39cd479f11e7ce2b5f3db7e70fdba8f7831f06ea8fb90e13669ecccccc93999927f374f38db5878164723e9db3328737586571e48e3b35c6da8ed3e7015f134c9897190887813c7e859681b2eed853c1072c6bc1c2ea71d846d8d7f320b681e463af49e1103dae1d43b519bad25fe08338682fb3d5602199ac7910ecfbb99b89ed86751048170693fd912de719023c3fc11751f032d1c8a973c471e882df6211cf4f70646b71ac5d1004c57e863a73c10745761a4ccce1b19c3f22b23018ec3de070fc11c679753e271cfbe63c2c0473421c9d30f63938e2009a46ecc170ac71639f43dae9b41a56d8873d188e5c55e3824d60e875e883abaeace5b1abbe17569f41b33b12c7bd2b7dc4e290695d66c22acc6526aca42e1017bccc84150cb73bf0b1cf38b9fb56add5937df7934da92696bdebce0f5609c3ef41f6c5b2d0c3f88ffc0e3f9c170e48543f4cad46cee34c1c1c1c9c9fa109325e5447fe13159ec1a23f99d00e25f54bec3895c239c36e9eb7d3dab73c9fc33bb43f799e41229ecfe155f729c0c1365cc8a9e48f95424426f87f22305e06052f3e910a3e94fd054f64f616e4b8209cd1bfe0637c18ce76c470b623ce18207ecf1789013a5970d04982c5883539580069795d03a1b33618207ce5e5ba216e799db367bd4e66ab4e0224104d53c63ccd97d5837c24b7bc4ec7649a2c6786b1afee641b55555521034d1a65ecdc9de241f25fb46f592daf6ba6dab7acac2c20f2a78d1dffceffff7faf8a40fbaffaaaafd2d18940fbaaaffaaa87c23e791015176a1f206118ef2f9e959595e5b4fe2e060f1f5fe0052b6ca6d8e4961cf12d2ee042ae25edeb738d08a49c4fbb70a4728a3d66276957b1c7a44dbb6743f1e4e30bb880c4e6089b26595417545703de352176fb93bc7c7c811a97a358f8d242d3e5a8a42fb788cb5149b7fb3eb42f36ad6efda82bb26e157ff8dd80ec8e406eb7dbfd21bbfd6065a6cdaf5efd49c51ed7ebc6fa7356b1077d797bd4dfd9a9228e2345a46d486773d2c0bcfd7ec3dd6eee21d9d1ab4924a8e4ecd9fde524e9a0ed124bf0dff153af43fee8e4ecd84c5f241353333593753925ede7fcdc71e24d5a86d61c34b5eb81a5843cffe9762967cff939efe998f9d19ef7d211823733f1d43d5826f7a1c5c4403558a6afa1953f4dd5a3c4ec266e1eda9f81b837171b05a621bf134b903fb2c5212530501776ec269ab73463a96fcc97efd1a858fbda6b799d7b1e9691b1ba894f5337e91b93a984eeaef94f0fe508c5a6d15f4397459cb9ea2a69951ba16fd06a7fb214ea3c76b968dcf2baae25d6e48f7ccf7a9d4ca4c91f1d9c1dbba99b9a264e0998cee96a9da41c1e4c24aefc190e154046bb4193d17288d8916941e3ebe6c0b96c2c175a2707cf6b87d2491e340a09b18d66a0a6c91c363de5ec9e3b4ca64fcf0e5fdd4973da1c3a0077a131d0147f6402b8d2935db1e3506d2866c3c7e3bcfde1153bf298dbcccece8cc3c809cb357a54b02c8e3db7ad1447a32b9f8f26f3d16c1ad51ca5c29b2815982e6d1ba54c9f7ed75adbf5dc6ac960f00f7d119cd632cc62e97fb114ecd838cfb356267b991403d13fe3340f8d8dd1c48eb599fc7ae79dc9e725a2d8e2f212516471c7ce758e568a8bb1a455633e076c2376e988c325ca1888fe055d58cf72e541b866c25fd84cf887829d856d34e8f4c2e152974b1c5b864b41d90a3d90a8d5b53a113665297d0ba0b0f5ebe5a823315c7939eac8d2a5f5e7bf6a388d3e1dc01256c7e5c0698dd5420363ce29ddddc5277777779fb25f3bd7ffebe934af041edb609e724e1c9df8441bca5db5acd166481bee58c39d597ef9d8a756ab31820f1c595f86a8aafacd15bed16a9886cc72c75a96cb625fc1a8902de6d0c6835cf4b1e2683ef619fdd603a8358dda320b856dbd477f874cfe8823b05feb86be7f3d0fd7776290ee5dff1283381575ef1267fe3571e6570c54bffa19db594eab5f3f0463a5486b2c97c8a28cdb1d964315bd5a9349211db52a73d4fc26abbecadf1c634ba0973e093e74882085be2394f21f61f9c187bdeb3f4f6cbd80c81fea33f931ab99c46ab562e24bd4d1a2af1cf2879e2063a06efdeb257d5848935d38434ffecc8ac07f3d28b2fc697f7deb5f624b647feec0ed102b4b9039a4d0f7f475009142afa7fc632dacc91ffa3487d653f6a4508d7f78aa255af9c37e3b246ef669320b8ad8d90e24efbbc7b97d5da3cc2fff8de5cbcabef043990cf6fbd7fbcf9d1d2cdfef5fe26cc7f7b306b0ed13dbf6fa198fb6bdbe6d2ff1e58f8c81eac7b6589907dfb7dee8b50309c9f52fa4d67fe26cfec7b8d93462f9e3fad6cf6fb5fe138d5aa251ad32185aacf572d487affe67a590b4d51ffd368d2a59c643cfb2ca0069eb442b9fb0f4bfdb1bcd910d699e68b24203153a8c913514b1446e49c9932f5524c9a4a8335777e7725411365a2e3ffd915d0be36e0ffee9ce74ce661c53dc01986760fe5cccdc62af19a873af9479824c93eedea07706c6175632b851410635b43332e490666882f1c577b2d25aa3ae9248b232bb237380124c0188ba228204575277b4566677c4cb512c48b16f03922dc858d855065b2c5826032d1654a2089b7339aa0a2e071184a91285829cac65b437510c9171396a851ab620411249282811c3840b2637de9021b5d65a398082439aabdb11596b240d4542c026290d45e342eb7294162c53522debbcd25a690650589ccb5157b8d09454f941b2f672d4151c9eb8f2441645a4086965aa0c915a6bad33cc550d449e5a628604c1c290145ddc91712c1525451452e48cd4bce63f4e4fac60c4c2de6470439b0c6ef6438341d513187861e9e5a8dc981f2ad6bb1c950bf3349b0c5551556e789f28235f5c7a390a8ad51dbfd62447dfa33e6ad77a33dcf16b90e18e4338b424943b32d55208eec863ae3c73c44b142fa4a2aa9031442d3de9d45c5145d2940a498419e248ca1b23382c490551440b36f93aa4900796a678818d1a1e8c28d964eeda1ddae5282757dc9ccb514e7277b44f83068c90220d0f52acf04413f904eadbc242adb5562b48da90a0852e7e6823612002ea85c90313921e28a53074435c86247838628635e4b9bc4f9496a66b2f476959bae3d73a2f7ecc60f065c99f389a21c907334850b88105304b6868152d545beb981699289076d6b82e471589e2c2b81c55e48b10b59ad76ad349e9a44961e5e5a8225eee68a558bf1c55a4cb944e8660353de09c308249912f2cc8265145b87407966680c10b93149535b65a8d2a92e58e5fab8146abd59418695fab81a10245052a0c946432c40a0a2570814c0a6b9a904b34704314370481c20878b805e15794c8d8e18b2263b07893c3937f2899e48eb21741d21434ec60868724ff503cd29ccd1a2b68b24082839632b51a184fa3064a22e112e4b0830b6c567022428bff20388cfb5b28773327542a31c0a188353621ae289bd3f48cdc0808bcb06213a2010b36a749a9bf6ad83c30b9a264933571c6a37e97664c931b6c426057b6fa9d68d44e048182954d488e0bb62ad27c83fe23db375f7456548d3c230aacac10c2260414c25637e8d0680055aa18926513e2512bc860abf906fd95f61824b26461a37da553d4154bf787bc19cc78d059d39f4f43ebdede3e1b0528eedeee2e9f711fdb867090f083032a574a29a594b286d736f76e8b3ed3e50d1ffbcc781835154fb6fa4e10e89ebe37c666f48db159f913847d79b98b104977ac5d2995dc18f4c18eb22b7f2e40bb1c756b73a36e672e47ddc2005d8ebae1703f64a11ad45208bac45045893636f90d82d04d10c672d44d863bdfdd8bf8e4532674b87df2d541635df1847e138e6ef747dfe64aafb790759b1d69b1eb1f631b5dc17510013c639c2fbf7f8ade112ebfdab5d2ee64d470afd49bb8e8b47d8bcfbf63a07ec97dfb7b6ebf8e22179281a5c50b2b35866ef317e93c76fdafdee9d806ffcdc969934f5934b998b2d8c273045600545d5c58b20605ef65e50e76b4ddc213160d48724aacc87a7ab09e10b164c8fb2cb1e3d36684c08eb44ea6596a951953ab21c58eb5dbbca209d7550b433898ec3834a9a8b49082d3224b0e0e60b023e3a67094bc48c17991e28497262b2f529ae84840163bf2540c8b6a4892253b8a6cb0235329cd2b8e7c57ec204204b6d891ab3e2c2cb0a4a061040b70ce958b62418a112324f880b2235b794ab92ad250596151c28f2a7664ac1615152b50210390a114a884ccf695412c95b2810000001000a315002020100a87842291480ee4d1b87c14800b759852785295caa34912e428884106194000218400008c31c42034662400841b56c86f71fa51417e37e4a71efd4006fa43a135d3dd9925766406335d98e1f3e42b414e52679ac03f9b8fadb2dee55c91f30e1778182846c5412f0ffa798402a4f097292e3f54c25f9bf50c5a21bfbc262d9f838ccf13512bf4298100996c1df0280bc341994c870ab3476634a005339c3ac35044545f0142aaafcb7d202390cf0e4619ad6342aee4896ff35f326500502460c97e021613232e30b7204cbe25e8d5798ee4187c6478ed99443a591507d17ee3f4044db28af9c22619afd3a4239f17ec93c277f28adcd5b12617c01685ea8c298b4fa3d65432d88bc90533c25157b51de23d6e2949123f0c450d880224a9cbfed72488d92710e8b226ed4321e6827097a4e04bc62e2e0a1d64c3da301fbb474a3afd9bc9cdbfe5fe9b20f199d9f0a907e4e9c9b7781d3914c58569fa7036dea1014008d1ca956e1b0e3c39d5e9635d5bedb8c92cc67d04a3ffd72f4696a91e01014c7d70bb6622a11365cd44828e603513073a02a899d4b7a23e85e5a2bda008ca259ce31112c100d47009363ef61b191bc7c2f60784631d254fd276a92219cdcb8de3125580c78bf433350ff14ba7523a0f1c12370fb631cd1d121e115a9be519f7dd5c922f02fa60dc1de55cb7e4790180facc5afa2332de183dce8bee354b21b45c62d69236ef2117f24b4405fee26f65e12f22c25bca9ece60c8e7d7dee37f2c11ec111aec2cd05792923b459d8e705ea15603cdf780e8559bc0a233c572a11c44f6df3d4f933733e9aca49e091339e428d9152f693fdc3274887c1ed38afac03b8162d70c32bcd8c4cd123276b829764c4c55610929aa9823c6b90c8ce21238edeb5e85faea737c4667331cfe8021ce1b669c6a789678861770b2a3962896746e7d7c7e501f18f50377e6323d27fadba284e56d9c46440ddd99b80e0fb7f5790c79193e6991c8db54f059fb01842936962dba14f3a73b0b4f62b1ec615d9d9c4d6d16f8b58f5f86305e517f4a1e0f6f61257baaffdd9b5ce6c01a6f85ea0dc58fa0ea13706ffa74c43727a1352e52f47229761169b983a3e23a562d7721af8002cbb03f866f0426f1e1801f62f99bb2933ba87670e11faf1e3b5903e40da79c3c87b1f4f819f9e01842de0b853f88576255d8a9ed0af895fd66348f2a07b3a5088497b9551c71de3680ae0322c1aa22931084f63b6492df2705fa031976583f01e568ece8af6c4d79ce5f5c59859e18135340d925f33139bc3a3731fb57177ebc4469508db24e289f37635f6008889323ab619f542c1f4b14be1d67b08fba2b576748c32e764558742cc1c40d583fd07b256ce20f28c3484c020155d8c8e2adb1110e8c9e3a4df7c2b33e58a9a7e91b64ea71afa9de5c7a1477e44288d3969f0dc465e5303d132924e1a10225790e101df415554b9efb7343201ce30b3b7ce9b45930a0b5ea74e296274da48b24628f4c94f004e06a5c089d88ff510c7d32d020ce5749f9dd54b6144708df323539aca15de33859670536ada3ee520a7b26f779c21fd5ae9b08c9298dc99eaebf440c4ff7e789ae30a8d221a2818c72bc07627527953e2e6e5037b9e2df569de38a95a5297d9c4db126b4c17b7054d2185549476bc3a402612353abe2e2d53945376a5cbd34cea40eb305f028f655648a4db4fefda2b4b67bf9d85739d13963ec899175688d8a2d0c33cc15831e10040f02fd3d316878e79a528b78a0c6435da6c25ce340d11c9fbc71456e2794791c94c214d9052118ed20add31cade11088cf3a407de4bbe8102d7d28132a9bec53c4881bd99f47398332c0cd517ecf456fcc1179316f452c7e6c3249c4a0165eba2ba422eae611a5465b3e8a3faf6b35cc5c1a216b649e4bdb8afd3077940ac2635f7eb166dc10edb075d5e1735021fdffd40b51fd28ac28cd742b756b4db53133ec632cb56f5942347191cd7e6302f14fcaa6645482478598055d683c69c1a592c3f6ca1666aeba3d043e40afd031d11c79084d629c932679ad7f8e465826f199954919508baa410c204cca2a60446307875713040b242b6a223352e6452fc5b9374f90ddc0684fc98add717c36c9fa0111575e43c2514e535fab39d6392017714691276deab6621e547308212a62ac848a8d78dae616383eeb0f4326fc1ef4b460d6060eea79b96318c8ea79513259e56c95160e62cec5ac56e93331a81a1639eb4b8a6a687f4c1db40cd5850b11a45db9b946fbfd284085c10500c37e26354723ce43e00d335e227acacae44a6b3539f363cd35fcc772d8726ba3f44ba304f0c2f9722b894eecc9c2da2496672c8770a2ca56c63764ca5738923b8b37d5c42a0251e6b66d6c7d9abe487c1e7231dabedab3215adff85e1fc7f6513aed6eb14bcb70c19aaf24ad82d413e364b531ea42f54cc7858d969f07116be9bb2e0300c32915da84f61a6b1298c5472abd8e95228a1c660a62563268545b54ecd57ae16fc10aeb2c9eb4855e941ec079276aeb134b1c76d03d8f5245b8379f22e82b500939b4bc17639f547948145660c96af5ce8a391dc34fcd46d3fa2b3ea23c6745f799f3c4d42e8952de67a925d8f1189692d24d0f8049f239026bda8b68ce7d62a5c0ccf09ca400f349a7631529ee4e26e7332fc4ca9f623c486b32b20edd172fccb7354c6d032b3b9ecf5a5cb960c5cfc7c12ec65bbbed92983280356d989cbb4ebecd6569020aea7e20352b3bb2fb69aee8a6a51df0d067ce3790361571e73820820437ea77f28791374a8904907a70ad84b30595491009b21887301019d8cde5688095ca3b56317d39894ddf196e1128c5629707ee3949ccd528ef7c4e7a0754c231dbac62e0577390cbd9311f60ec3cb8e96c3d4f60a1b4019771bdde4bd4a7e4b780071829878b16304288c69aebc0d34444f6ad1a07dc9f2a3083f214f54b53511246c4134be6b180219d9fda0be16a1c4d1ca6671df8f1d72fc22fa607704f52c9c810cbce163c7e8bc8843a770b96c958ae5387cb6df7f36b210fbb3459225f06b83e6c7bc8756f9403ba56ccc47c59043d04d3b750a516e60f56928e3860504956004554f6b7a0affb84a0b536980414e880133edd9fbea08010fd5c0918a1ead00e6810c51030e0d6e17c14d3ef862857e0dd2c503b7db37c234497773a5483ec6d7d9fb7beb43b7cf25b7ac86ef370a2c42ce03b60848e6f18930b6f9fe19961a6450ac39d9a55de5cb6943fe226ca981a68d77a989aa17ab483c4dd957bd2ca80f6e5f9f61c0f5a5f5967b02d7f6161d0e58a7a2176bc64f8bbb0ff17797b7a1796d40b092b78d907b9970055e4537e2a6e3713772e07a58a7a326cd600c2add81aba8dc9f1466474ee7e126fe0e021300c97162ca537083d4c88bae6313e61c46bd7ea07e456504707cd1165880b636213703c068645cf205d855307ced1c81043a691c2351e6e571d93375ecebf127be3a3cb2c2094cb8a66d47dfdf26071603385f8661f65d099ddd7c22648f6c5e861de69184ae19ca63ee7a1d68607f56aceb9e369b12e7b1ed37261d9dc1361910e633806d77a8ea7a067d6cc101f39a2503ef46247f505726e242c3d2103140f401986032a030bfdb7ce5a6b1591dbf6381ea31e88dc47b03634fb1be460c0d9d7d91d7965e67c9e70a5c833de5d52cf12f64e94ce265efcac479f97809ff9ba13cdb4d7094635a1a63fa04eba1b1b1d3b71b3f2c2b2716cb92b0aa7922872de90d4be1bcf06ea21cda6653e7f2df5f3aa0b33ebead26ab7618e26cea3040d8b83406460f79390839cf83dcb63d26280333194036c26b5716aa10542667907dbfe5d3f1197b4aa0c4e85596d297f8527defa46280de22946203a49a2b48b363850ff260061072a49e42a7aec7b10d5b4e672716cfee4ad125bfc9741eaeffb3380c34cf02faf2be702901256a5ed80e4f684b87ffd87d962c46bcf7bc11b667d728da01e4f5f17adafc0e7e61baf43e3636b695266a2433559bcf5d7698fc913c59b518aeb4b6c66e8e8c37d30ef931212733329cdbfea178dd2804411f2b6591fffd5144a787f4b3cdb8cfd083257d81bdc4edac8fe5c2844f8228b6cc45da57d72b8fb0f62f30e42bda5dd50fa2e834090f509caf7e35bc5a4d43ba829916776256218d8d43d1094fc580796356c45ef880bdd476bbe9e933150892ef8a81b897fa46de126617d52c23c9d9d0aad823cee0e4f2bbbc0758b2ab0ce0d4d343a89d4779083544521a3b80480319c6f7d9587e08064381416a74e492478bcb0830a90598b90a2e3c115ded0db6fb04a438da79ca254c54bd77558ce2612800a7db2cfe7917076b8df4cfa1cf1faf20a668dde5d128fdca12374ec36fcbb1f77f7f1c9ee2bf12a744b6b53137edcaa9b776ea94f34c1e4cbcdf2bf02092e0a691e2883f16c852b119eb012640e7cb697426b133703df66e6615fc8753cecf57e28ac8ae88a6bf800b5da25343b89b6f868393bf0c79ce2719fb825b9568569be30bc3d5806aaab6a19f2d056857d275d563211d0c11d40d06f65d7a260cfcbafea4a6bcfd422c60ec284abb50a98465537bb4a7c83322aa591b6429b3a6698913153b799a0bf09cbefc7714b60b7ac6d3e20f984bec3620f53ae44153540daa67034fc85b09aff1f29cc015478da5559651122ba8501a67ea0ec02db71dd865bb49b381374fb84a23e44644badb7f17a6c4f606f6befe6b6f89a0510a10677bbb4d7e9e165010e3646b67beb85eb102a628ba121075705e536eaa2d6fe55bf0fbcc4250cf007ea711cfe59e5b6720850484d2890d591e5d12de986e75afceb10620b96f6ac0e27c8ca34fe4ca17b1a0852b392455912f45817f39cf02a968331031c823ed8e022c0d06789c61eda6832e9c192ce590b5ddc885d74fb570828880086f5ba29124dc73c9e1f18f8cb83a1eecc8d51ffbb0bbfbf4e671ea104004c4a97b1aaa346a87e02fe9373371ee006d5a4d4012c166c0e3f40a72c77a96bdde65caa49d3f084aed6f65c532abf408ae08cf3b513491a7e09140d7355c89410f16444cd855626314a3bdd0af929772252f17672207cc8239ddc75418d3aeb0e598d4263cd3eb0c4122b866b042d4fdd6cd32b200b0ab1e8fe08f5ca4dbc302807c2cdd494b91dea769564b1aa9d4d83529d1d786f471db47f9dbf812c3843e433611dcd4b07391db4d6e4db7ecff3cfc0c1ade2f451be34cf7d00d86a482614d1b015dc99437ab043756346f361466ffe977d8c6a4bedf4a37414cf7f8814a98a06a4d11ef139081432eb85e856f033ec62addfa2f91c683f52f6bc17108662b6cf4a899fcbc4e840b858fe3127d9912e4ba84352f88c8d34b4338473dc94c206deef759957c90157d712a0e534a485a8ea755d2acd8ff22b5ec754c21487e5d96551e275b10e20338bb0fc243cdf6511a04d66dbcd9a0c59b1657c9a924c78be832b1242a65c02f041293079ab2c598aeb600211b909fbe694ceb1a91faac3f8037dc370d8af630e4637d8644b517309f9074aba1c8edbbfb857cc617e972f10c672ecac8da1ccbc7c680d4d8e38dc6f83865446736e90b4b6540e1145a7e7d4f201833df2c22317721320a43f922a629b197460b21bac26470e3012cdbc5d384c5bef5209805648a41a4c5126e3c7129dbd1d48718bb316f71012f504fe1687cbffa8358f0667e528e578a0463ab8839ba62bfd36e8216d8d9fdf301723527c20f87cfa612652e6f657fc92d57f98359e733d481e8f1cb9ad14cdf7f725920572c678782d9271c8733aa1629a9c9dea4012e5b0e8117f1bfd81c74324a28d92661c9376196bb0ee04e3883889fd99a18a4131d189d9a0ca03e73d0d6c167d53c7f58db13aca35a323c572473bd03de31c1d69aa4337b8a794cf5ea962fd49c035137dc600bdeb23f5fbb080f30e7bdb3c5de8a24954aa534d0ea27fc20270eede74fc4d270781c39119a859af32ccd19c9ef0875032448bc93808db1c4304694485f53b4dc507b52879a027adf3476269a8434272bd12220505682fbe978702073925255462b3a5cb14d90742cc29592266dcbbf28dd6c3571358bc6428fa28993e333189c60b9821cc89f813ca58b0c6a3da74fcf0387f888f1943a1e3306ee4854577b25500dd28a84ac5fd1026f76933435ece7f38bccb0ef16c744284abf84f3a24b9f03d81a3c09449f6e2e7f684ae73749e08bf4992cfc9d7e4e95f3045ee15746c3aae5ff62b10cd9fb705b9eabaad56ebf5e1d2a4f975dc27965097c833016d59eda716530ad9e29e58e2f2ba171399cc3303e5ae3907584bf5346e6b119f0b0a9fb2f5a617bdefade95f4a36e2861a4ccc047b3a3f655b4ff9f65ed139f7c1308f32a22c6f5b56c0d38054d024fb26ad4b7c6220ffd7912ccfab37b59590f1a3490c53afa5870b8463d7e6251a9448d575e4327039a2416bb65d25cfd6ee136d595e6bf28e96b60a58590a805f166d4d0c8ea09eb431a81be04dcb6a5475dea07f0593afbc7dd138a9ff99aac9778bf440d3e8473fe34a663d0c018faeb09bdd5c1d283ac464cefbebc942b49ee6f4bccf3c2e59248cd7bd3c5c0d93c9b68e34c70403a73e2d839b36ad4b424adcd7eca3a4b34b2e4aa294c847bf977559c58eee92299ace0fabd21d7439c6659d7c74ddc78e9d0710354e45f45f6fe396a247be17fb7067eeb344b000787dca4e003d133fd045d75c97e176320d3264fa91324411d3d6080cb99eb2332a26f204cee4d7ce2d8d399618481dca8d8bb577a183f1ecf971c9b94ee228dce1384ee7c76a9715861055cb09a933ab602b2920d41091eb5c14ff15809430c901aaffcd70ecc051e87fa6d62f9a97e48e4a60347f96d0bce2e8dec8ec3ecafd291b9a2dfdcb1219650d1bcd0b4685a4b6302c3351a5f030a799172a6464d3032889fbe1777d41f42a5959442551cff5242c8247a03750457c416f0662b6041352d1435855348f81566769593b1c8eca46e86ae44ffa4eb90a2af3789d3ab3c893b54778742271342e390c1c686d59a22586fb3ac42439011697dfa5127a83f1412d36e3dcc7697087d07b6fa472b9abfa79535fde6adc820c5f0e65d1cdaec158fcb0fceee5641ba6ea5623b95410ae1367bd55a265c78805db58af2fc062916dff637a9ccd0afce96c349867ae41c7a1686d68f056219aacc81a8c291930f9f4602a9e861aa0af51710e05c594434d56445f23cdee64b8c5d43eafe2e6904e97a8fe59b36c8ad1e7e8574ba29ee1478a180d0bbffe8e5db0eac4b47f9f78d91285fa3414aa7293409848037188c0750cd2a349948b7c32795d0e48b4566f7255249f48d56fb2d1785ec3e4934a3365cb35af90b02ec768685ba199072041c4b3d6fc7f099495ae99da95255adabc5fc6b3ea26ee056a445950003afdc03891bd0964ae84e6f6361b98999515378da4037c2b2dba5d5f91da039afa378fc7a382be0079792ae9fcbb5e2920e4514c155eb025bd08bd142b5bc67fc3772fa6feb355d02c50f969b281e43804804b5b01703c9fc386888d4f3bc808c61412de13a3b70e66518e56ec8de304b2901d789effa31cdc8d12331663a1a9c61f62c0584c99f5ddd782158e3df32f5509d191e06bf97defdf704688d80fb48b68b42b0e009005d8361b758ad1fbcbf655c4b2a965449a359738c91ea7f13a528a83880022c893f51020941815c8f6996c36fdf537c9ae3e11272e9334a57a911f8a563c47089a4f33c6b05bc95c002db0e040089ba31503222b6b54525837bdc6966df58548e790a38941b7b28df87bc6c7c9c66860a15913999769cc125ef58f83203833625062ec5675aafb700b489366786c14d621ca9edb5297f590ca43f71a2c93211cd7e7338dc1dd8ebb1015c5d12424470c46a0dd7a8f2862171319cb482092da1a9866e56b5f20afc1cdfa0247d783368164409d05f95807e1f7fdc143ead9269e916c125dac91d2cc0b267fcb641e4c08a28067b4508b77d106fd4849642696f820982df7344ed9910a2004ccd8704c2cbf10917ad74c242e5808f9e39122299a3ff4dc66f3ef957666564a3225cbec265086bd05351c3ecbff9c41219ab8cf3ef1ac58501442b083c09a8d43b26b8d1aa886ccb046d04e152f471b77432816139a18ff6f20edbde91351ce7c4f4be25a6109812ca62dd66eb558ad28fd6decc03263fc7ce143f60af7575d2048213b5011b78ca3e2c78c64dd6e38291b46b34ae6abc1f188057d17296bbbecd5b08c0395120211f3e9e2d588d34975f8c6cdaa3929ef58fd1f393b085bfb0deb11b433c449961c48195ff4011a493492fba7d4e54e94a3c38d1521280116ba5ff19b627d858898c403b4dcb0d1c80e39fb9acdb1b836d6a7605e93281cb1f64746e6913a8910e27abc301b4ddf69a77038cacf1f36a4ca51706aadebe9e0313585adf901482c0de6b14154724ff40308a4076d024ade8b088441d7fe1d17b15bc8bed23921b6101b05f9436b382ebea409e6be863b340cfb103608a87da97775e8cd056c688353112942790ed56ab9da46322977ba0c426af2046bf4025cfa04ad8809dd04d9321f7087b135cadbaf5126dc5c1182421496f8b50d230f5d9a103f0fa1a2d42b4407f876a92b416be125ac60f0c9c10ead93145134cd1cd8b968768bd42af51da46073c0a19dbb405cc30976c1f3874324bbd425e846303b8c8c01542d6863233a122c1144910a8b2396ad987306a4a2dc8273a40d741b60625150922d0167738bac7e4f6b6ca52ab1cd0ada5e55d5d5752d9019f707206290d49b31c3018af200419258098cd159141c34d1fd803ad74a382a4fd32c57d11a932a0c6d9561fe176513e0cdbb61cee338fb54769c20084255b3ded5093fe0783796b18b85d5d93e650f5e39c53e317bc0e881a75c542a36653e517bc0525f5370c68487183b6e3c4f7e9e9ef258a0d67e09474c70c475e761cbd19bc62cb9714c79e9cc13e1d884e4c226f133e181068456373ae0cdae6b2d141dc72b477b0d864a57f5b5d3f32b6bec7e8d262d8a694a030ea07071418da035f40d4bed45df3c18aaefb09817a51e667e81e97d077849033beb4ecf4be80b504de9baba66bca16141bc89bdeab8bd66af424b266e6fb79d09ce85775615d43a99ddef8ad2f6813a7b0f8603ab8f6e6ff9b3064fef8b1843c8915d4616921e58c93593760469b8dad6017e6b289acf31b8b2ca59570ae8bbb622a1538cf7bcd7e41bf59101d56634d39064217d21d63ec8cce3a1b746ef54fcd124607fb34893792122e5cde06d875e2a7330c20383d2af3b07dc37a3389d1ec6197ad2e0586a46d700cd656a339bdc00792a796e3a07131a01a9f47d872938a326074abd889f81f8fad0f2634c1b8c6eac8af67ff9fc9ad0c1a862748e04fad1c8454e6cee6fe83804a0f16f68a6b4737aed674b5caf706e8ac8ef421e6e7f434e799bdfe8426c359764492900d6a7f1742e3a32a0277731c82430cb7bf2c4fde836c50632ee7cffdec82c03e336a1042d3307239ced5b886bc13a23e0a7bfef22c1721d97214e8c50fceb2b4189a583610eda9ad21a0a60866a165a799184b520baace846a7e79a6ac1dc74cbc53c67f30ebfb622a9586a3714e9592da159a5debe8ef376708fd5dec1b17e83d5ebbdb41814935a69ac4c5194d13927bf7fc501a5f5fbd929251f9ec33800c5632a1236f844a75b49106adad7254e06e48a1b13ae4cc0f09463d6ff283e68cd7a01c52720e0c22c9140447295798afb48c93c242df820ff06d70928fc6959be3a16cac9854b572de7f7006af27ec864b576f3b4222d91ed2aab11e66ae912c1040e0a1cf1cdefec6eaa263bbb85ae81c724145f093520014597200a9710d9127f0b3e6601928453910e17a85f1700038486bd8c132556b894455130a96cab26441c0bc9510a2977e87ff002991331f5aa8d4700632fb2f11ddaef0203ad8c14e2cc2cd7dc0163e03582a78a78074d103cc4790f0325056dc2f044b37a80ea8397ebb9581c5d22123415506f9a081e9424dd3413000460cb144a8f093f619971faf6d98a3bded5c8150e7413166232ed59b2a4f099696c62f47a84c39930d26ba981b41aa55d0469519d6a4acb8269aa5471e45c94652ef611a88460bb31c7bb2596fcf65929e2ca36297de3ff4e6027e4d503135649d8fdd91669d324ed39a1061a3439a53a5a60a326dfeb45eec36f832018b5b444f0bf1524b45cdbcf6133bd96a4dafa1c9efca189f8e1260cb2246d8f02c4842406161ad13ed4a55a87b294eb4789fd175437eed5b028727ffe7439b1c3b4962407c30ae26991404edc855c4a01c5b54010584e81680ce4808f1ba314b00ccfba5f19c02ca4a4e14357bfc41f98a3377238f98de8844d1c3ca022591707774f4352b2a1c5d3e856ac9f5660bcb587e8c3580d6c76fe9c396e06ac5e8040ccaa46037549f8d900d9c29c40f96a1863c86aeb7c375f5d3c484fb534902702304fef264025ab229fe65e509871800b224b20ccea288fe7a38787a3b7442f300101b79ce690583384cadcb2546d468d34318fb3280a853cb6d60bd4f33d2143dfd03c062772ca6c9ba4317a3b61dc658da3e35c91a2fc6e2b1552579c52359a109e27667e7294cffddd04a0937808253b7f84dd977f9a1e00b88a219ea7dc50d329fdf0d9d0ca0c23882d1aad09353bb1ff4a53f3250949c67d1da8d420556b4d399de51a0c1dc77b64dfd5c669e6d84efc158fec2313fe629cacd1733c4a5f8c71a77218f2a56950376c64d7302c4b56c31fd3d44959d6afad7bdd39dbdb4d514855c480f23d106dd50844209b0a546723a4c4c82b2f1d71dc3460338f8d59c139c842d5b22de4709c1317182084200a338990fd59f7ce54cd90991d2128454a0823be45aa93e14446f90d808f06ce74c76f3ed2ed03b0dbf5cb80fce8936eee86dd636dba53a6c66c51b567c1262da575c4e3f6bae55ed01830892898fa9578f4596ef081fc05ad20c6c58fdd0dcf9f316b42eff73de75ae1737f10f5f9aa6898b7c8838197a4cffce9ddb44465c92bb6e77a1f79a172ded3a893f17beec8431da52cf0ecc0f78ae3d6ecd3da29eedf8769669d3e9bc7e6e0e59a160110e4e82af2894800721638c65f60fbe3e80b6d89fc99b52cbfb50292f3c7f513bb221f42234d64197a56260bad1f06df318236cea18bb5700149cb01473e335d7cd6ec47d4ae8c902077106287d67db85809837bb821064c9ae0ff9552405a68929e054cb5af4d845b6d342184b55aa25e7efd55e379ceaa9f8672817762842a1958162306ff629d0bd6d6c7e991d61c00343e2b400244c5f483a163a9a76ef38b8e8750e0b07d4be5716ec971e0eb409db861747134338c8989bd4325f3d7b5c999cf7ff595f841959225f04d5d170522941e4242a972e12f5abc280ccb6738669007b59871ce7597f9596b003b41c233b50f35c950793c3a625898fdada168fd0d18c81db19f51313161545845d8db20b339eb7acc5cfe4119b746d671b1e80c3fcb29a0c86b22088fa77ac035a07eec5bbbd364c0d7c4258c3591cc102844fa863353590206604838b78558ecb075a4cb6738bd2e4c203ef9a6990b8077c627f472d0bee8c2140ef111468d8afa022d9d76117ca87b7f562bd0892f16b574a924ddbee141166977844943c09b3e65004a5bf0c34ccc6c60b70d774f6758b860de80cd08d5dae3d0951c5bda3eb9f3ead78e19b26e2b16cd280641c4a320c051ce540433997b337f5f2110be182a954eee183ef8a93ac4d9f250531e5a921c79e78bbde82d4995da489170a73f9e4db0df0c203655f0e52f41305e35365908131867fabcbe1a54d0198c1d001d11af417a6e0a7e75a7fceb8645563e33fe0ea2aaa4c4d84c7b03c7f05ec37e2bb1e011bca3f17df3076dc4ad2d2d242c42ca857cdaed821a0a95438cb5018b43e305a8d188b890adb3504180c7536a90daa81ec34130865db10c82f9501b67a8f50a0c02fa63b8a8ada4967fcd9d7096f7dce32d854e0e25339b217382d835c555f6d0d840f72d0b1a8f8078f55d7afa537ebccdc6a75981a74f60f7f11b600408a7e417ed66b889f940fdd779c7bd194af212853687378f56a0b70fc89b47aebc32dfaff70e392f74382fd14a06f4e43a74479bd371bbf86a09ecbb77bd6acd63e2673d392f61330dedc85c4531316016c08a1c3ebe72060b7a0df1615da352da4b849123a5f0390e3536b2b020899d99ad0c2ef0d9f963e0d203764cdd806f92e8485ad4537bac7756ed400946897d756a569b00687daf7f519e73b75161f0cddcf79cd4ab672e45a6d8e97637a3b2ed1e520a983782752ec266d22ab3b75479ef5a9ef74f5c2ffefa4523dea50a3ff507dadbdf1bcede271233116c70a9493fb8943b903b84b2b340b63109b327c12914cf9f200eb131b0e0df5f7982482c37bf784881c7d8c294221c8b989cf0dfbd0367f07202207ce08d0590e9507db901a2def4478df167fc7801bebeb7633ccbbe3aea84377b533d6d00c90cf9ffa7e20d8809bcdad167cf47ad4ea2790177825eeea966c020f83dccf087dcc27cd05c1bfe448419ca557c94d7513dd0228139b7ea58561c1ba303064f3b5b90580feab4ac661677cb373f9d52d8044c40e120b5b4459c9f795aac1ed50be1c1d18a72703a42ab317bf108bd2c701a955618b240e2fc14c22221085061c28cbcc83c491780115367c83057491b516cb15c1fefb132bdf617eb942fea8cc97526fc2ba21cd3266d82412876b9a0f83578e7faa3e631c16f8749329eaa03d7cd9718b44d2c8429539cfa8eed9ef2d634692c048645e5f2c641539c83563e8514f758bfd2850d7bfe15024421875917ae698cdc1108304ecd83539766e0b22e820edd45121b336072e67acebcb2e1a9beadb84f06248e4f72b0a00288ba59f67ccca91cd94b56cc6c1e8ea77b385bf2c7ce0aaf026c12fd2d7428a5e482a0fdb2362ec17be85fe971759ffd054919a45cdffa348ab0e5e812030159cc03b19d78b2d57be5c076a2d09f54a91f91a49ba38deefc794483c836ea63ed4252b1312f2617c9948a867d6d7c9f95ab61fd6af15f95d66c265bf9a98fbd75c3e73aa30e0af0f8b1e035b13a9d0bb613e8de0556ae00be92606bc95a90ab20462a7cd6b5b9b5fb252926704257f87f4e3887eccb60620efbe4d17cb84c9424c342f989162ecf423588cf36aad32cc19b0b0eb1b1ace3a87092bd070b0464216d203aab6ddef2b2758374d2f10094b4152c7ba5da4995e89bd4765a7adbaa87d5762846d79d52e6621c10e203ba175e7edf5ede13e761c2cfaa5cc17e5cb64618f69853c091ef9fbbabd8b57c9e2d72a14e23d3ebbb67010d8f472c9805423df1e68dcd526e21891d5b0f235e7a59aab86e75f882fcfd28fe8e2aebdd6d2b19d8b9b19a2807349686eb1606dea25cf97b2e587d203232137924fca1db45dd2be7de55b6a760dbb01e5b2661b3381994eb61a24ccbda60bd322646a7ac4114ab145a1c3473ea36a6628a5fed87a616fc3ea760ca41579e138b62731e66143167f791c88a67820b56292353c9f9f318db9a142be455127972a298055e93315f9e548c6518e1cae6fa1406b6ac8f136f4b0a217d2de576672ea170824b1dcea9dd37431707a0bf6a12d411f163bb30d90b5d972394d7b6c32e87b7b5b7b88f6c88e265c2324565f92fcb17008f6c5f9e99323271165a0aa6a81494490d7b935981dc43c5296da0ad648d16551654ee2b7a98bbe0f8d0a5841d2aaad430aa8cda85a2ddab1be7d2049f241c3e5baf1ec8d341b36f8eb49c1ee56083c6d28f71cd6f4653cbd98507081e795a066e226c0fb4d2c6e1fd7fb7e177bb0d390319b4e0948c720ba8b1ae58c6280247b777a7324eb1d57c9fe7330ae227f9e4a49350e44726936775937367fb46b624b6f69ce3a06bf0e7f9480d29061d72c495e0d7b4c9d66289d944857fc37925368e3c34d03429e1e5273bc27918535a15e7336c140ac8124e9c2e9b561880179812cd08e33ce09ea7ac52197b34c9da3aad9435be0d6aa53357fa1303870de46ddb4358694ca249e4632b25d56f4b458f9b0dcf5c91764bf8a94524c589c3756bc0b0af4f2badd46e6ee0ac4e6156723f6f6746312a50495dfe4d5a1f1fc85412b61363b5b1bf5f6d29e1e2c6946868852701d5bb057df911b71f550481dc191d8901a445c12b698ade5583ae67a0f226d1247d3fa6dce4a78a0cfe98d9b4b0581b47b88f36c34abb8e7737964df85e012e77640ca78265a13f4d3428329c1e53f6e152cf4715f8b129145142156d8dfff644233ff2d175d79f87bd37e1948fae2f574b1d274b0ec13bde05ef8db54f1982cc795a40119ee01099662614e7201635d490e7243caae301d912c0b703d8dbba7a78d299d1fa70293202bf7cd10a7f8bbb3bd231bc8a97b0b0060817e13e747687db9876febade1be570d631772395cb676fab1fce95322ec350d9672423da22ea02b930f3bfa90bda31dfd614047feed67c1e4cf11c4ca91fc2f6b74f5383521e5c1cec9e3d81a8e5d948b5400c87f9a0fac49508eff3e1f95911d5dd13f3f1df388466a3af4b1c397446e11f2630b55b061d9b76f2ff7b71885a8ad424ad8f4da9f5b901f5707b438c2246983018866826cf7eade1b921ec3251f5a6283d37699964998d56472bd1a08fe463da4a91ed118af90bf3a7ff0d49fc554f5aa79e38836f6b19ba777cf37f8241aa725dee6d7fc0f1dbd3e059c6b69b75dc280217426f1f3a251dda3fe726e24a0bd10bda449bd55df63cb9bc0ce77f0a32aef85c78d69978e9de58392a631dd21c0dea658065d1a5c2597763c846ac512e0cd160e9448d1d7cda8a5198cd8a825434d4a0170cc266aaef5a78c7d030ae80f136dc41692473b059d04b1e972943d86086ea019511d615e21272599c051e54e458b5873eb3450437a251dd7fcaa5f6b549f1cd2dd1c82dcb680be32a1af7f38f20067e7a249edaf75ff4699cf5d25b52ccf8c35945cedb620f0b9236b267e804141012da3b543abe6bcde1f1e363621ae94da82f61cda86eeb1b2c0e4523035499201ed5ec1933f73104ebaf827eb8bd1fbaa09f829a7206e8369619a47be9ef37f6563e31271c9cb44bd580747ec37cb50f32629a6233c07239cd8ca0b091cb24cce0bebaba8362701d7570b8d13a960d6ba7316ccb9d12737436617e8cac9921a7e15604cb692da81213980b4742882c2cf0d38cfe221b8deae1d01bb26e4ec56486e02cda2b172a7944cc79857a8744533ecb0e5d8d59a67be46712c48ba5d2fa34fac8fc8b3b12f3bcf5a06844ae2c44462761d752a8de2cb38b0018e868581ebacd22690392810704661b5b3536c8281fcb7e1ca7f216892a1b09abe4260a96cff14138920f514a3e86139bcd09875be55d9b45e8a674980170c2731f53f221f7937c9474a400d35900bc75a41ff4d50beef98cd403e4e7b30a89041d6a107bb376dccbb081368e5d5e64828a2e302ba0b5123c048249c60751ae5c747716ec4bbaecfc1c687ee3c34bae01e5ca8c22e1d791f12a72be28d16c4e6efb85c162741b27f2c9d5c7cf704734892da45aa0cf00062c390c5275fb52c7a2f900c1029afdcedd88cdde606925011a85c42d6f3c70af95c399ca9a7322b5cc23e58543fec4ee52a87532d33106f8a4d0167e9b7db2f16e016a0c86ba70fe6c03a712897083ead0d3b31175c331db5963c30408370c08b11e7f457ea44954a54a6f1c15ed771eb2a0fb1335a42967fd05809a1f6c3c3376a6fc80657a9842eda066c91f9fd9043b889f822f83c11fb28e83fcaf2864e5785d0ddbbf60da73b86539feaada1b551eccde7df9deb238a963666179416234587ffa89eb4e19b2a992ae6d68a07e18a672a958df1c69c1f872a9e2c9b2cea80b223aa626b3b23d81ce4a598d2d7c374cc978fff163eac42c84a6c0cf88ca6c279579ded7d6f621ab72e180f5b0279c7b72dbadf5e04ac30d0764834e83d5f15b1e50a9046a94c6fb653af7ef215a08428809b8a58032e78dad5ab058cafe3124c000144920d85333c62dac934dd83c7060d7dacd811dc81ad13275a020e202f8f9b8632577249dc1a8a2dc25ffb727fdcfdb7f9af9ac6ec8a6f096260f7af709b689a22dd2f187ebb73df5e439d2f9361a14b98c48f9eca0c5259abd3722dbb3bbf98b83ca4f440b6552b1837d7aef7c607aee0a78e18a0ff430591b78f62cd99fa314bf7396733b2e7d946b5ebc34d0d86158bc6175d5cdc99560970f34e1aeff5650cf47e4237cca0b53a981862d0e8931b0ef3d8500496e04dbebbbf15ccae0da299dc0fddc597027e4eaafef71bee2d6d74829fe1dbf3d2d7836115a80cc5aace84838ab19e5714dfb010b8c79b0008c6f8d350d3c8687dcb2e48ec269d8ccfaa9d773e7207e1dd28a3857144a4d52057cfaac8bfd41a34321509e9b52c16358b068917d5832c6654647c4e2d305072df04c35b2178bd08b8c29e91a417128ae5ebb95df1a24a06d1f1b1eab3b5b1ddf1818d613909ce3234242c2aa8cc5e163009bd4403e03732846ceadcc36fa935d62209bad635a69c4e13a71f4bed4f81a9d514aecc664cbfc638763add6f8b99ec84a280cf5e9683e07b20b11f1cb0fede3eb5ea69af42e40ec973ab65fe40f5bf283aeb72556df84c4808cb28231132532d2dca7f78a99c857e7c67ef2b1357b28b994988d90a8640d8ed9083d315e71d5162c7ce8d08d4660ba990109ab991ac399b951ce4c46b3fe7873a39021e7e12b04e653a305ba793a54003c46769dee3197f2ad465a298cbc42f3d7a1f480efe98d0253cd95342c4cd22049cbf0b0c267a104c8b33f961e2af95026fbda6d204736b18b49700f8e87a21d096acb73dc1a7ff29f49032c5c2e7a45594740fd4800a368f7e08758f2450a803a717f5ec012549c04bac9163b8a99ab94cd5941671781c0f8fcfafde5279e14be8e5360e18d26e85740bd89085e1df9bc3189fdd34c6e9538f47d061a2c1fdf2529f4b2494a5f0f6de1e40b3156dff9b59f4299844a507cbb36f7bfda9c35454f47b3690986958f46c80710edd2d116c5e0e4faf7c5a68682439bb925a164969048d9e86f2474aba183af13f6dbee1e839e9c36e0a6aa342c86722b6e171280e1ed4e58531ac8129cc0beaa041af085c63c777a5a66e21c2b58b18379948c3f5e5fb3051517b889348deadb315425536fe5dde70fecbfe37a5e3660efe3c87e8ece9576674bb93db3d0b47f3a771cbd8e7fff13887b7bac15735d7c6d9c6ac15dd22a400f3deccc24949ae9219c9ca1e8fc88fd798cfe5ecc8d259a84fd442be39514c7d0b7fd08ef112fb70df9f231362776ed9a766409b8b809b043c681159bcfb72331de75cdd6bebd4c453fd704bf7dd295499067191511415a4536897bb943a6f5f5397ed9a8ab85ed1cff8782a3e889769e5306737b81249517ee2a105479b54f45be9d580f83d85c8039d9b34ad6312d86c6bc48c30a3dc1c3297d855d49ced13e2f353f9e41f252b6a83e72b6afd2a5e7cf54068ee99f2191935166c7d7135db821b3fb4b5b598bb0413b1a30d8bb731e19f57b969083ee6bf340b5547dc0fc121de1d079ac11336e0cc865d22986d3b95826fa6de54a45e9d09f63f2154a6da26dc785d33b36e6004414424fd95dca6682601fc1d61417713aa6a2e0ad11c03e6cdebe24ef83ac1191f5c77f43135db0e3f7fe515b185873d6f6ceebaf125fef4500e4754569303240d40e6d5c7308cb1d27efe375c5a6d613abbd2b196cb04becd63fd8e1612bdb291848e6089a5258991254c0f4c6f4737f27c3e6fe218f59b7e3fdb5423066cd2eed6fa539b4d0018ae4ad65ef9034d7b1592556e7d5aa8051bbfb112236bc6869385e19ced1e2fc2c4db4625d439cca0a309146071687ec3f7cfc94e3aa282c84f080aaab2e4462f841537eaa96378bb74e2c2c7e24f38a3f720aa5f37b4b34bc5d1b2e38ae1fc869fc8b558a35cb6e509670a24a4fd9d024ff6b2d2ce730e0f0359495fcd98a2199ca42b35613db27865dafbcc75c719767c48708733e65b53d052ea0922b1546b33d76cd9b1b0b11bb1b79aed07a20e8c4a99f0a37132c6b86903f556db9130b354698e3303e50c73aabeaa670a6aa297c1ac7e9c66f708fc5bdbf397474a34274f448d7935d8b040285192b6600cd66042fd41400815fa9e2f838c315c1a02fb820c1dfb36d5fcbedca77aad73ce9420e7e52a757edef19e21909bcbac302c7b1075db767ff16e8c933ab79b7ba4b8938f1ee2e759cbd383aeb18bdc883d21b8d03d0a312cb2c307d754889022acca3169054122d191dec1546eeb6b12b8bc940307c36fdb9105d512b5d631ac344dafd65096e51dab35d1c33fb1c1bdc6f535f8467dc5b54b888c6e58e2894fea19fc684dcc35e22e1126a7520d75d736a8ce3e91655dc1e8f46a99cd05c5411d72b6e1ad6b34e5bcedb860ed62310e96a431fbfcebfa14a444bb134a73251c3c1a33f75c11f66d97c813fadfcf0af55f00efd498ab1bb1ca18dda349098c881046e7989b162888d63841172a5bcf65b42af81887b60e9aee9f27b6eb1a1957e6b1fcc8f807642e568621dbbabae3abaa7d03ec80b915f155d01e6aa08f2f6d3e24bbb4c881a49dbce2de1d45f7f999c8336304838de2d3a57db7f23d8fb29026021268cd3200bd7d8937fdd2052eddeb68d8510bf3562438ea0eb21f5eb5611f4f8e6e0871716e786e552e4b480c5026bcc85b7103d65c7059dd30239ea05a4cc337b658020b061174d5c00e5a19ac7c3bc42c2b9310dc491fd37d50451a67aad59a6f12ea4b65a5077e7ea387589955108d7d838457d82c90bbdf0d2ff79627ff9b604de9d2cb55e10329daae942a4c5eec8c53525c53367b1f3e971b63f4a05e36faa7065ac35eb21ae0dd8dac51b045d4fa68babfece59979cb36c54cef4e4363d86377d0d667bf30263d4d70c9f95d620d1a9b1c584bc3f08a940dbd6db17528dcd1ffe1e68d28b54be1347ce0c91e3abb56dda5ba9b32ed448cfde6368f41910160b19b908f3b5609cd833827c990579298fdbc527868f01aa563851f094847dca8644eeb300d19dd419da702f8bd79b2b77a2d210d5f849bf6f771533a9e9a5593baeae695252629a61fb341478dd8151571873031793548503f53791692d5318d39d93abd6cc5e77f5683bea336673382b647829101cc83b2c49405d10a8a50a5b4ac733cdfd8f55d4a2cc36d2144ac51c95a6878a041fe2c79302e7d69b11112d4214a3cc2d6d54ad40b9b08953842f1ae0352bd98938bb615ce3b9197a8b39e25fc62dfc7ef784695315aceb4724bcf8d3c7a4c0105fdcbd8d8508adeec78aca5d536d34840f2d0d4d33019e7fcb75df9becc703243141d5cf935f9d42f6b36e3f67655845ab79add0f050c0ce40e7e28179673bf54c52950469aafb65303d0e27bae68c18b741ba8f7c1fe8f9633066d49c47b523c6f09d7e441895fe50a71dcfac15e0fcb13f5082d2fc94a5df8965b5e11ddc4d11d36f69cae7e93694e214a0996a0705ea35139b3f6b9177343ab967c6d848a43367be183948083883f4765312b5094103b66e8c8d35cadfe3c776154649a9385a8442c86a391b23bba19ebbbf1d0201471337522399b781b5376b9c3ded4db9a00f271904655ac4ae42474a2cc0b1d0f3528f72c57e5e62f800a2c6c8d19413e51c42f6081bcca51ef3d87f16e16db9597beff6801a76c3adf2793a939d296f302a351902a3a9dffbd185ddc24f9eba8d57dc001be14c69b5749c6f6c6a7eb6163b1e1571c6f107abb3b9a1be3f3fc0f888e69d07bf07c24be2e01913f7df895511c74ed0197681ae1f86559ecb64a09f869c50412a9d8ea3759f356aad509da3617f739cb1b95da1e19b5140e8c0ceca139274d2ad7d41247b275ead5039d27667547520f7755f9e2c5c2c6836e5f4027b0160801bfd3240e73a65d1a97f3bb48e431c241028e49eb846939baec30c42c717f4cae9f89a62d2fc51ad6dae1cccd268f606eca0c96dcdaae574fd31152524bc787c244c69b31543bd1c488b29f7101f8e425eef3c6abd2bc0c55b308b305b30d1e7387462087522117596cf1dfd14a079430e312f137220959a27864c8f7b4a2a1fdecfdf7bce75508ee81679731f32d1f7f3198e3f535bfdfa09170ff6cc0a95719916083a0e8ad9d3e47120c9e98ffc7e9398dff0d74fcb3361b51b4f24d293c722cb7a5ad8954b114192833d3b1953ebc1e8d12fbab74116e56d0e07519ad354ab86056234cef3704aa91c1262b4d3db4fcc12c7a554a10051f52800a0dc718c519effe3fd329057226eee2121d848fe075fc439955a509a5c1ff8506c68d54e6bf338995b6750f9433dbebc89bbc3be0b8c650f2352925dd5b22dfb43834f15aed82f3f70c32a948cfb11b4867088fe0569c2f5ba14c012f23df7076eba3b55e2cc70527d42ab4e57191f8a25ceb41b9d4d01dc64a8efc67fada379ff5d48c33a0e1c3521387fb0952918d8427b695e8862f40c222f20d30a13c7c6cc8a679fc2cb8e469018c977c31168ad502dd28428530d1b630e95ca75d90543b64da9470b0a08ba9b1d45b956360cd7a61e4d9fd5f339de6c508b4831b55a222159f573d55de262c44e3efea22dccd0063826ae5882ffa001f78930142330c4d652c067431fb9a574fd40fc436b4b04d3e9cce778c02569f12dc180e092e8629fc7c38a70867360dc6da0d5e37c9c14733816595ec3e418887e9b9119fe8100374c6823bf5d06d5d1d1469354971be8640850805827dfa6f0475dc530737d8e552701cb47a35498dc2e01285f910aa51583e810d622bd16b450a78089c1dd5731e1cc5bb4fbfb2911b3c8aea094426c16985f27b085e89ed84baf28f85eb3cec2d31c65116978a44a575087b72150ddc6460babe6a332962faeb90c4002887d174dd01bd4194e04488afcfe402d54b05fd70f9d19daddfa35e9427eac7f4ea0c4cd24bbb1fa04e7543df268f32cf221b57b1fe9156c034c4aab5576d7e91820be44060874136b4bcbcc6b4f27681575d3ac2c0f396b3fc9e8913c225bf35b8cbbd3e4825412f53c6b4ce56305961ae0abf8ee5412eae33462bc489b6c28a3821e2f89afcdbc34fac7fd573699e46f2b381daedc84b34f91718ecb7de5268734f547f15d21089c88b5bb1bb1b5df6ff1ba655212acacb9a1d7afc9927abd09fb7493fe49bd010d73e0c6f5597c7babcc094c915c4a1414583e6239f0b75537d975540e73f3e8bc0d1b28c073072a1b0596bb36a69696c514dbe9bed38ca8b624962632461e4a784c64dc0f258d2c383d0fdbca7a08c39224e0dfa6e13d99d70cb5290cec2d725181c86ac2e4dc3fcb2a5e630ac60ac4085d76b162abf6c90a3969274ed348ff8c2493ab00b7251da422eacf82247cb2f0b0f4f31bcd82ce43c6a8160ceab52db4d5aaede3f71f878cd109e6795a01b7ecb23365511cf890ce9a45609fe555ee41680d902141d3cb45b46400cb08e53b688df527b14ec84264d0ca6ed9b3615f55e4f4384d0c6d4489cd75ead20a2db945632752c965d06a402f9ce0b0adae1caf70a77ca665e2b3642cbf93557356ba98b4a46dbea590f6fbcdfe359717f1c465a2b7aefa88894f329c22f04e1e3199189a71955e727edb4638f849d133ea0e747b1f3043400d4a2b8d881794cd24cd299bce6cce65ee63603c56d076a4a427b7b86fc48be1f436ac3cb21d969014c803f0ab5dcf72a72e8293db0c4f0d8b4751349e144df9aaaefdfd875a98cbbf9858aab07326e3e44d91c51813cdb84861117bde4e5dc7a84f9bca8e960801c35d29e3b592543f5bf197982646e510b6d53c697bd3518e462d7788b04d66626952dfc99e652064cf68eb6993eea16ea02c30361a1e69c413590f44cae96e8d6a9e1931a45379a742c246bdb78a11497d6622eb2e0aceb201781a1a22b6c1425319aaaa10a9dad236d99eb1019b884ff186d6759e18948b8fdd46d6cf83f5efbc390a14e97f8781fffb40811dfd57bc684fece0db13aa6a1c214493f19cb0707d9cf72d9602293ca31bbe5b8d3834094a8d0e92feb4aeafad66853ae8c3b6dd410abc5c1a5e94137b325200fcb0545d6121a790afc49a8c8cec757f68f5991b0c00fa1086d54040d1452a819a5c1aef4f3738a6db25505a7b703b11659fd0897b62c36f951a4e0abcf1aa3e10e0c9e0e44fea6c1a95cb7c5a36d9933f9445fd45752fe1f1f680af3e92172c55fc159d0f911f9ed2116a323ffdd64faa074e649017f7cedf28515ce3d46cc6d01611617fae87d82df6df30546c589e9817b9694e4db98c63b0b9ec204eed41186b62e4dc60e69dd9fb5e3db4264293b1111aa1be2bf9bd982f2635445f53c1688e52143233a10d374e01895d072ab317b6e878de15a65f991f93d367e634a8019b4166927c9a24b98ac0725278a7dc9afc616e381782d503be9e49422b45377d34ac9bfc0089b037bdfbb0fc7eddc00dcfcaa597d181e39b7ad17586fa8cdea62d8dd906f56333cc6a831b9d03cc5b90c37339b6227489ea9900dd5e1d5908c28020694d9a3cf024cbee07ac85add847c1aaf2b0b62b303e2d512b7c08fe72e17c603a9b7c581a7b3fda3c522c3e30f080921431e3a4596ffcc941612685df714c506e0b216eac8cc7d9691ade7cde74edc2fe418da8b3fde3224eb882444a4392807d44d161e5d6c51dd3b771dd6a4bb30b91a20eb64766b8540336473dd097dfc3490e8de885f345995c8142fcfc62747bea4983f02bb69e1d567a7c0784e456d326a41e697ca8a8f342c28203df70ea7534e6df76201d93acc2f9951ea250261215ac58348ef6f32e1e7fb5e7e69d9dc8107d9a253b4ce4efbd5c6a8075b23434b293fab8042e9ab62161373a9679132b775394c8c6013489ad462c86a24431ed68abbda932058ddd126a4b088e3b4575752404072d48cef7d4a83e6ba7034ef779bd527ff4906b6a62e15d4869f51bd30047a7b60c9e29522d6b02cbe992283552200559a76552a5cf4d684686376d2b69572d58ef12c2bb560c54a9e17295c8727e5ed5b601eebb2ed7bc9d4f52001b12d5ab85123dd70db77b346b12eba8aa653bdcc49ed987dcd9b6fa9e8073c71a311a06c31442e39f7d6954f05400284403af0c880a71f3a096289f9c97f8756a485baca2066f230e0abc16cc07ca8119caf43d44ed5ccdea9af525b3fa5e9c363121d15e6e898215d6a9dae0764599d66bc88bc037f291c879f31b05e9be4467522ee6d36fb1ce9603202d0f6cbb30532a962f3881e604af270b9d639d622457985216e1657d25bcdcc0df17bd023a5729c4f151162514e1874e3d970be14dd08704172488098370c27a90f74e15b0a5a1612d29feeef192c412454da4040ddcd0722963c254b874dfb158253845fbf7b6015b0833ca2cd024c9200096cc9df8a4a41ca0881011b1392401da68cec795093af2e2e7f83916089733fd4ec303dd9457e17a2e44eca9615f62ccfa3870ce672f2f34a0e92bf60072799442adf708c17c163c0d97b483fce83f12893abad2b3c66c1b1ed0e2484170799a561b5a6c9d6c3fcced52b61e14cab90698d4dc9093b6e09aeb491e278eee4c6f257fe4fbdf77f79a672cd5515c78e49e9dc3e81b0d51db9f4d970bceaa75e531383c16420759d972e8f7a7362410f0a2aeb0014fa0fa76b4546b42c8e15cd4f7c0b5228240e4f0c6ef6007debb09c1b4c8e63e21798d5554c21044bcc2a6e7a2136a6757bd456ea7217bd0e88aa3226d65611c205431747d132602d7f7409cd74c167471f8a7041f60b4d41ee292d551377078a5fb9361961513278cacef52356f1064a44ae356380b8bcb6739254beb5a3a6cc5feae7c4f99dbe81073fa38fd3905bc159d13b4e896bd023bba3f076e276444d87360b3811eeede71b96cee3682a27d35282fd6f44989e73f4138c4a29eaacb47cc28f2c5f2f2933218476c497737ed4501ce3e624598b6ef0efe7de6a37d25a051264094fb366622ad6f1be5ad5c3dd49655f0977c802a55e6e570622135047dd0ac1984ad7c6b0ef865ab2e64d15ba658edf0a89595c2a96470eb134283976accf90a919931e1247f39f15296f667b09700e990ca37ce8a85b9fa32cbecb6238a493a416201f6b24beb3e45371c973744430ae02d85237d510c2a5ba7106eb4106cabf774d04ad3a08c66e84675739dad7b11268a21bf2f7e51baf213f4dbfde2ce71fed0c043d37ab246a288d96ef4131124c9f6aa4eafba1d2355ed51a15711e2b827329ab1415cf7c61cc6d2ff614a2c9d05500b310efc37d8bc05f853d6da21d0eac7e9a91ca31841402d249db15a370a44f75ed3991ca3c7a51a9b84e5d765d316402c11ddb9df587908e08054961f9052c1aa5327002f1e2f8bbc3bb594fff81d8236558cf5548a40c4b1b03721e3275c561aa58b28f1fec346091afc844435828685e71cf35814d50886a0012f3fd0857e3303d15f11b2a0a2b6df2d71a9fac43b0084e11063cb411400f4fb08cf6e9021a498f018f66bab530b20e58f0fcea73f64c6d71906adf320cff8f1556eb4c9bd4570d362d1b7db57e8115a8bfde565a4a2430ff5bee598cd0e01ffea8b3fbeba0db07286a4fa5d61aea62608f6ca5376ca18bca8f3a60585fd47d8cb7ae18b2969adea0748bed7ec7442d0f88f5cae067d899c0b9023a76c6388e22cc050eb0b55801c1634a971b4ddbc2d3ad671a57928a13f321d9e335e56ad02fa724fcae024189cca7587d498df9fb9c978a2eeee7ce73c892459f0452ac026b20f1f08dd4d3daa48b8a508a5ca9aeaa8f67bda8fd57c837877d5924a4caff0f185688c4336beeb1034b700f52ea05eca02e38a3fe60e813522e082ef724cab829511e0fbaca9a8eade836e33d3356e41bf2e1f156984b189f56a464fd8cea525b448225407c1a41c845ff5e3fc49c0fe37ee766f0c0caa2efdeae03bba2c0d1a28b28a1d14abef0274162e109a54fd0279f86e9650d038bd6e5648611f1dbc141d110eea7ae35468598dff70a8a31da0516c45f40b5dd835c419fb1844fc593d343d78a2a68d05794fa08d5630fae41036431b8bb5393e139eba0eba01ea0876ed7f6a93ded9cc30733f55d9e67cedc7e741a20f5ebac0ad89fa43b8cc78aa42c886032cef1c11293cf21d23ea0873c0ef7e5be5179918b97d783cce1c1bb965c4dc30b6244e16bbc3d56deac22f5cd50625a95d3f6e4272609e3c0d85dcf23d66bbc3197e73a096ea919a88b1f0c62eb4eafc28162623cb1e96e523f6f08a1fee78a64f6949d1b4cde3361ea87455776582f7df350a30768c5550bd648d6f4234a66cfcf3696cd337357153e2a1fa3f57a6fad70b369b6766b46d9326ab4ddc3183f9e603c9ac3409017acb59636ad0b1e7a9c65743aceed41ddc86b0f08caf5e4e980dd5f326eabc28e1ce681f62307a2f4b7e2c031765f8931c449e8178688fccfbddebf6456f475de2791e12f8e62c434cdafb0a84cf00b5490a36b4548e59bd7a9a40c4417cad2567e8ab2725dd0bb6e1f31072dbe354b78e4695ab14c41824da053256cf8a8c08e118f0d335bef1d324ab554dc01e4b00962f272e9c092fe1134f4153f7f41f4362306088e5e936642260e35bb9a8a7de6f7833a0ccc26ee9ee69d5c5c48909f1bc01028fe64a0fa55bafe8b02302f0f8c2182c254a9fd584ced26ae066c3c56fa68281489fe8cf0dfcf08cf6a93fa9a83d7186145fb5034485b99724f8a3603b54fca0ba520d87a2151b20f75931dffb2dd128b8d79fa20a8da46ea6b97e8d4c4f2ec12bb07b6ba8d781d3712af3ca4d0b1a9f37c57ccb2bbc4c53fc3324feba1c7745f59ea2c010932994243bd40268841bc44eec3e40bbf5ab275a02b1abe007bd399e0b8ce14b12a28ba0c77864c89e05cb5a78ac626ba25e9bb487c5956c8eb16f42b8423536878352dac51a1c92b25b5f583f3bbd52c50a235958cf45b0497cada21a28ca88424c69bf6a8f5e270e27599802c69fdbc0af25e8f70b6e5d66360f95499904e5516c39e7e3b1486bd57a55ba24e002028c164d3614aecb67d141a5bca59172acfa2819f860aded79af98e2107d4da7fea951f16803630644afff40b27e8911a23916f958d579f7780775556001a64a80c10b3547119c29823c8e6f6221ea62f2cb7e7a16bae65baf063169db7b4451bb545da46b5f77f1ac5df1ff72ef38898164d53b23bebcdcdb71d7d45e3fa3266cca0027f87c8e8eb6bfcd5213c01407ee2810ca8a1ac73a63fc5e345be45174753380949448e786161e1de2863e4c76f32fecbf5443b07c1e31c7c579d4fc94632797586f8f363baa792849914a98484f91255aec102e65ff4a92d5602ffef95c437179a5d2c483b724c403d0a1b84ca08f7fd3ec0a78abdbb7b05e1bf110308fdff06e141927fcbc11f340c27e9bc82fb043e1db113239202307473cf339cb291014307da46022786cfbe62bce9f8877ebfb67134312a92345d24a88082d63e0cdd4b7870203e874255b458fe5f3804f3ed0ec25670af750b50f60fb8acff97d707741ccf770928634dbf63d6dfc3925ff9efe8f32ed70ff71f2dc5907aba4cf35a661875ae222693057ddeb481c668c00656b714d9e0391bc1c8c9983f2c308b2f4e69c1620a6dc6c3cae2e3e1873ea13e31d1fa29cc15806580e534e1a48c319f6f28f00e3c817ccd451c82cc28bb95623f4d8adacb54eb9ad0fe7e0b52385281a4930c28c2a33d1b2b2a141aa219dd6adee1c59b172159e466d0071b092368d658315f9e65c6f6ae63c376adf3309f05ca3411848e14af0347c2e446915951dcb91f2ce9918e09d1cc1201cd1da2e7ebf6c3bca0fd8c40985e2519c892915de2ffee9b50d76e54051d7d21353230092ff24e0dbfbadaacf9f85d56c9873974b4382f424ce4007b93d01a37490155e716103de87055724886d57c68468f440c5ab75317b0c101260d3d3f70b790b4e8a10a3fdd846b40ad1731a868d48bd5dc0ffcaa7c3fd6c0a4ce9e085386670175d056a53161b7b35caf514e93f4e51cd54e6906356c390b8c93dffb07c7b0ca69ffdd83bb7e0d309ed6c788bcd3e3d42584af4e49e103614dba2b78cc23b35b2e8228d81d849c7ff133bab5c8adf8264479f86126e1090b897df48f9b3778171049ff92b44010f1cf03f02e32e196a14fa09717cbc829c7cd619bf03ef832d995f2848d0a265abce8bbc8fa2a2d0e430071e8feb302bccc320a05d15aa8a99e88e414f2212bb81466179e51194d1c5a01d9e274d85782d49cddbc46cacf3a14ca1072be7e9bd1799621c41e050e4f423078e025acca7e2d6603f63ef4d61a3e79518036f0e1b0c4521b6dfb4fedc938308baaa7f8833282e24cc0037ce1b27ccb0a411c3bc735a0907045a6665f80e92ad1a844fd47eb4004ee922f5c7a586c46524242603aec740fe292eaf876d47699158faec3c784d0267142d2b9a4dab63acd4ae53ff7caf051615eaaa09d4293b0233e3498667e97a475e6472d8e9cf44fdb26729a570994d223d1e3a424ed686accf7f895d9459b1d5a95d79fbebf67057248922c6751163a1dcf8471b41c49470c29f1f922a2f4d77eb6d00da4135cb688e9960eb28eac5ac380a376e04b86b623b7b4a2cb1a051f5851ef0489afce94bb94b7a8c3682c00b4882051e8b9aa6aa6bd60eb0fc43410255b19749c08d4091fb20dd8e11bcf3f810ab03e7ccc98341747201268c649bee58110048d3d2aeadf623ef2a1fd0c77c30bd7224a93562dbf6377fad34b0dcc60445373e1ec6b2c591b0a450ea32f78623bba2cdf0ae3b1fb4661d4e68a865e6e4869d9727b371a78e87d7439b3bcf7125c169d47ec8d13da26820b215ca0cafac680bde1e66288d7cd7b5585dcd062272350ef5ab500a3644d368e5aac7379843a174ddfdf46150f926dc60d0fd5eb3b3bd399012c1ba36ad0d9d5d77e88c601cf410e56f83cb43896929e6745a0f8e4a43a30e5501205119577328783ffba93e6ece4b52cdaebea94e26dc7c228703ad2cbcfdedd949bb20ca040b786c441791a45a7c986ca4bca556d2b9a42c273008aa13bcd3309db652f608582348187809e4adfeb4a24d5abd7aa26da0791be3b799c1f3c83586ece4d63a83149309296f959fba783ac627cc009ad18f050c88a30be908eac13d503fbed0f6d981f16de606ff194cd97ee6c43407c894bb5c2ba7ff3102533fe649df333b924c2d5d28bc0149723578881229239fd802a8fdf6a56f1bb53c09a91a913c499649601248acda2845d015c14af42f0c9971346139de39630c20c5a60f651f02f6926b29632b641790516582f9f0a3e42e626228feb4ed6abcdad4a614e3cd57da7fddea64ce6303e4e2e6f26bbe629549943f6d6081ddd6997b9008f0dd4e78b761249f84f5632e4800c4fb05921191a6ca173fd1f17c4af8f2171c00509a48c4f8d960906cb86e3aab7b0e79fef798ef5938c8d822dfec981f2dd3bc31375fdd17635204acfac307a3487d0451171c12ee1a209f103cb2b7c45fe2d358e9c5d2b2dd9d300271d3735bb2514ad3adf67699c2b3ef3f802d0d1a08aebd49361c0f9c5b134d1f214768bc6e1cc588fb0fa3aec1221bbc1bb3757378d82807861fef9c634f13d9e9b9c3891039de80cfae1fb7c30d78212860da6046beb7317bc7e760c7777eaaa046cc4f02ba68314657309c19a50367919a9f3e8ff1b54898cbec5cee96c4aea4aa90266193660efbae272cac2e61f18c5c3202f108aba1620d8c2f020182801ec0f2100a6d1b363a90ae07c5bead6fe25784bcefacfb1bd97b4b29654a32a5145804040483043fc46088142a539e9052c462600b059835f57a71bd18d1a8dee2eba3d6d0f057b6592fdfb24adb238558bf2d8ff555b64232f7d547ad61f92adbac6c7b96678568f9172c991048ac96ab86c52ae960cdd130002a180e31f0dfe20d228a6079ec8b68f9173a2d4ac074b27ccbf7fbf2a88d96502c58e6434bf622d34637e410d866399b65fd0a673839d69095ddc8b1feff2dab94838363e87a1c1c39164ece6549232d9fe2d135faedfa95ccc655ba715d2ba3d168a5aa5aaa2a23addc609a6be5b7ea476f55a51b3682aaef01c7cacacaca252556246f304d2565766394d9b8c134bb7384a3aaaa1cd670dc108bc5fa4d8b2c8bf4625996949794524a79c9eaa5bca4252d69b9110dabaaa48d1ba7972775295ed8cfc52e33d8a5c205529230062e84fc4197f7eeb7efef377f98b53710deedededf0fd2d58227537d6edb0fb750bf166e2ab4143448c023aa19c1f73a113899452d3fea6d550a0c92367f93479ec98fc6e79dcf26c0f931d22c49789155a86425608733770ce71b303c2fda658cb9895df65cbec76cae9fb47d59178c75c6cab8028cbbddb238898a6a94a7a86e43712c800349a517ed49ad1cb6ce3afdee22ac6cc850443c68f5a0343662fe58bc7fe07cbb73c101931dbb8c25eb0582b2596910e2396571942acbcb3947e20a9c0e8c6e829a03256328de44cbfa24026eb480e816de68335ecdaf877db87d90e1cd678d7adfb2ded60cdc9dfc132a2b1d241964fb125df6df22f292fab64bd351ad1b0ac2b46964cd9147fd3118db8325ebfc5b7de8aa5527c7959d688c675c9aa5ac96854d9c51ae3304dccb6fd6aab321c9d384cb32f7fa755551fe3ea5428d4cd0cf86e9b19925e2084f0dab0c931cad2cf4a961a4208e146194ab028f22aa6e10c3de841163d903b4d3451d44415192eb420d4d811420861b8ac86f35ad6b2afe557cb57825143fe84ee1d3e7efb30779e915873dfcc211cbdaedc5d811e1743767e6420a4040c51e2c3f70f5e315648603fa900c217865c1a7b982afe00bc80d980ff227c09af8fa51e3ee1e8537c1919653060f6acbdf752098c0a28ba98efdd0fb01212cc7df5a92bdb80cceb65bc7e4735e05bee610f9faefaf70c2be8a073f3491852c6a7c409cf7c34ccf782fc5021ca3f29ea7192c4542ee693113e148a69f4c97c0f3303017dd2139db0d4d2eb033be3abacebbdeff8de7b3038ab015fbe7ced17b9c03097caba2eab8a80cef71edfc1a8117fbed23eaed8e224307f17d2c77e349c0e3a6174432402b044f38a111d57b3190c2430fc7d78cf26b0ffde87150249673ee8c31762ffbd10485ce603ccd409f1b21b9480adab29a989df14f9f92f2ad8f614d08782a53fb820899423528278ca114454a4f474a11342f8e0eb52ab6624c69d2396c2583e225c1fbb034405888a8bf921fe7a1b403afc36808080522faa1c71717952a031dc3b1f2b78e74365dc0b1f6c53206c8642d127eae40a05fa1915d113344b539518d1641a819f627fcf7746c7369719e1791930eb5ea559c2850648b8ac80861c4c71f1a1a10916eff251a2e779bc873023b06d77b41d229e69b4c741c13a6a138f1c6942e707a55924148a1645222c45c0b6f5f16142476de24f1678f972478029400108a00cb880c6708f4365acc0b41808d335f879453a3a7a042d113bb6e7b5f7105589cd8c065093d4d882699d796665db02d17126f73196743e46f72265541bee1f6804531b87a94d4735997879f898bc58131857035b31777ffee4cb2934c4e0d758c75cd7b80373bd45357e8d8198ebef618ac5ecbbe7c5fa1151889aba00379ddd9d1dc2989b1467bd8d85f7ebf7e083dd3b58b18bb0eeeef6e8839dbf113c9722780dbf9d045a8c7d02191a3b48c2ee4b62b06661caebf7fc79630f0667c5139a05afdff3e73d22c21a28ee04a902617b15c8e0a4bdfbf573944382f9bbfb7bbe648808ca69c60b9b9e417b601a7ffd1b3ee0e4d880d6a80c853c652663587337acdd50044c8b790ce1ab1e84aff2e7f253ec19ac640c6b314eb6d40a42c055c95635974073c7f7b2205e670fbe4cb3de7d8cd556104d8bc1c931a34c4e4142cffb47cac50a6cd3283b7ac44822318dba3410ac7de6c90aa32fafc4101114b70c3720bcea7ae5724f340b53dc498c6bf1c518939c463b38275d181244db97f272a2a3b3fbf3c7cccccc9c392f6d3de0e4871042f8aff478b004999cc1e601c6ccccddbd8ebbd7b97b9db9db77e3c608a360294c3fd74419afdf830f767cbe6193f302d6dd1a83bf479cac32fb1abf63d5de0826bfebeece56659663ec67448c4d42475595a5094c1fbedd1ed696486683b525d2dddd4b647b4a3b647bf4692cec59225de5e4d8d7d26e8411427f858e3fc5d2aa5e96aa4a36aaea5996f5a41cc9fe37aae17fbd0d55eb2d592ac9973f83b5eef15e4544395e5766433f6e31b391a584307d9dfafd02a834aaaa663e58eb1dac45e9d922f05b1deccc331d2d59609b0add70291bdabdddfcbd0203e75cf78e94eeee0f2ecb88c693b0d71f6cd75d42b573ce41e8205ce71e3a084fb09d73fd9e7b19cafd7b7ed1f1ce38e33d84ce41f7dcbdbb25bd406cbe2ef55477f7dff6e7de95600183b96285a5ab990ac1367ac04197c33937849c910ec59a0ed3c4f8d6c1cf6199a3c3555b7e4508e1cbec848270468c314a1d7e8d68b8846e79749f21a584988eb6fab78ebe33f60c2847343cba8dd6d1513df7482fefbd6ee8ba1b967e3ad70dddebe79c73eea4c8589285c9b41ad8defd1cce98d5d10e1c64deb0c97d8a515530ff4d0b01434063b46bf7209c4b30d9f735d7fe5e5dd3b217d6629c2efd8aec4c54877aef596f35c26a4403be3895b9e4dceebe760f3b704d20fad7c8f5298e9594efd9893594945e954634aaca23af389837aad16f392a7ef5562c954e712687bb4bc8f022f5a8068a6922cc50a7c928ae20c3767087df33379bdcbf0c87693ce30c4786d305ecc47f61158f9460694c40ddb8682edac60005d85545bf7e0f3ed81da7a0a0dd06bafbf337c39d80e955554546de17b5e13190610996830b62da0a4642069827fd6bdae904a439130e4370bd03054cf5af61ac397f2a92cc28606e27059c4ea7d3e974caa1323910718299519bbe809a0a1db41196bc7ecf9f7764d40d4980de7bfe9ca4fa5aa3833953ec42843a383848a4229c85333f6e899d9d203b5660c1ee6ed3d06c9a768108c484859a8914371c61db62f8b6f4a66abd9560baccb25bf55e611a46627cf32746830ee183cfc130835876e102b6ad0fff4cf113a39d4e33393a6e8e080d3d39d24414a7d3e9743a9d7252806dec73f26102867f9e3869a593ca9c26f39ed486e7d545c0bc446facbdfbf5731ef1c032e1c764b28ac482e8803b53d5f8da69820f112245889060dbf69c7a86c0a498462f1f2208050535219a1b6a6e1a4ad3b4d7b409401930c371261b54806d0c04c4049e5c0d94d12ce4031b4a2d2d9d6117c768afdff32122283c7e18e9e1f9fa3d7fdefe8a520522fd5cc96cb896ab840035f15725abf480d6d4c4eeb4794096d80373bd6532c63dd107c5348e089122fde4891327575cd1a40993b9699aa6695a0e36b9cfc1010b28a6713e37f8c1ebf79c6558ae3bc4aef184212228afda2f16403cf5b5289e7714495acadc5c5cf80626d8b63f3fcc404344507c5a7b01c9a016211b50bbeb2bcbf16a27227cae3b7b374cf32858ea520936cb5db0b43909a67ff3e0e6e387250622e59584c89c7a55e2ccca162e3b65f08135a1671a850de123826f3be57818ae19bd62a3920e9d3662a808c771fc3d0e0ee78793e1e028451cac392f6055c90de1c877590faca11c6ac6cce30724574604d30a2d85bff7f62d33ef430821fcb74bc4ddfbb9f773efb7ebfebabd776494214bb1845dae08330df7ab7dc7be355a262f06afee41f74f4387f00d114159c93670c7e8842a314b3848151ee22176e278dc107ea2b1141e622a6ec70999ee9f778cc638d818c9a4e289a955d66750356d8c646e3ce42cf0214e986e7bd1b8a8b95002dbbc4811a6790232136ac33e38e889d188f0a1280a17334cd35595654130c5a9d48c869026bed48c979af152d97b103e1acf66a466c05497092ea6d1d601cbdc1f690c6c87e395b9414c8e23d5f6d703936377cb6bf481c9afdad563f2bbaede7d4c75314d1341f99906a51a8cd6905093c78fb9af3a73df470560a647f6c8ea3e715a263f1bb442eba465587b9d2c1729988cf5611f159c6620e9b5d3ebeab6ac6c3b36838197ebe2466dfcc6010e40296a4335401900821e2a93c3110c6fd4c67b0a3e2722448a14e190cc806ddbd333e4f4989999b50984da04055058292ee22286c251e8e400036c632226e22729286e681540b8430522e810bea1202127344e34cd3d01db5648a8899290a48bbb7b555553f66b20e9d40080ad061b38e0520310bbab23c6a7043a84ef46131a7aa2314dccced41dfc41414242397c3a9d4e454551a250494d1e3973377b895d0574081f7c7e5d2e2e2f2f303537dc198a351bae88d1b58fcfe3e0189203a55272a8ecce0a41ddbc6abc82890bd3fd86000dc374bf2da0a43516180d816d27d4699f3323703398579baaa66da3a0408a2387ce0e95713cd4e478a2b041a6734d9ac09c50674e601bbb2017238675cf885b8e20c2c47d69bd04846387b183bebf0efaee3e04feaea43073615363320bd853e1832bccedc47cc4d21f9410d242480b283f509cdbe0101fbb0b86e3cb8be68af5dc624fe7fe456fe791ff65f3b930f02b1f5896aab2bad730ccddbcce9fdd7719863575cead7bfbbc9d332bb373ccbcda0e33332bb36bc15a67d700d8c63666deb25619552765dde3f3d8afbb338deedac58e0d9f7784cfabe817d67bafa5e9570783edebcd5a6520f4ded8cfb5eb6fa7704af9fb98cbac9bb461af99661f3412218470480adae7d160058e073310f99122b60842c2c303173f4158010f5b502942944491dcc1922e9a54d1c5130c3006aca74ed10591c9075d3cd186740125092225446a300322b438a245920dc8dce732401865f7b231b8549300d574360603d4c4598c262f99cca2433cd28177e7f2af940256aa02ebe74b4d2f231c56a24861e90f48489912450b213f54621005c67b0d3a8194a94127e862eacb6a6c357ddae8500485a5038c11f74cddfe0fcb296408172ec32a4c09218410c22020844f4addc27237fb9dafbbba2eb391f79c70c2df69d7775f73777f1d3358da74bc533f3fa90cbfe7ce637c8d84b5c8708d85e53a87cab876ce0531e9288e080b735e776b672eb2d6ceb96f6e02e327aa6ae0fbdf85fff103e27929e60a6cfbf8de1be2ac192f01ebdfddcdfcbb5b477392d7ef515fa639b42efc8659103d3d6329b8a7d52c805c6825444586869c14a181326099b0c412459ae05004b6ad90d0154588526af386869ca4b630379da2331dd217b06d8584ae48a9cd9b4452284263ad3252c2779aec1f137a0b163688bbc2ce921aba055878a719f705f7f71c421dc23f7952852a40010a4c60021290d080b9690dd0344dd3340568cd05d4a4b50d3b9a8f108478788444c1644811137b647f36898e0ecd622a16a652406b58244ba653844da11bd514217c9d18e1f2c408e52e0f0fcff22c4f559d2047336c11e5d3622c2dc6d262acaad262dc568eab7e107655599f62ab6a29a5bcaeb6b690a51baf2606520ca5d186aaaad0ec1b737fc75f2e8b18049ea1a5a8c1080a8542a152286772989017f02e84259e6ced0e0d64fab315a55ef2922069a84b357eec355447d5b875db31f78a7db590114c6af3def3e7fd1bea0028140a8532c0d2686035f7a80ca8cc4a91496db897f939e66d752b9b951cd0c95b6b8f394d406de09394308592b4484280d668cee4da5d8c1849d329801c61f2db080a0a7a95d912065e7a6ce0c6f0a236ec2f4a524db57d8ff1e5a53be3f1638bb83406662f31103f5615b73f8f511b864668fbb2022f6ada1ca4c9e3c7644c4dcbeb8ef0d81d82110f0d63bf0dc86c87fb63eef36a0c765e6776eb56de4329af070584fe5a922c55cdfa8dd1923700f568c4157b0a96b8e0744ab91a949af8af203e3ee48e838367480e873dc43804db3468eaa032ff026cd321140e1dd446a5081eeae66d2378dda81bd40deac6279883a8b48d9b0731ab118004100053160000180c060483e180703c502451f914800f638a3e745234140844418e03298ae228c618420030041963084146a1a14107e32dc3d1252b309dd7fa2bc0260079069572cfdd25f0912778bff438acfd9fc4976d00892659e065144eb16a5cc5703f884abc36ec39236ac9c68d22f6e8dfa9c3a2e0689183a8b9b2e418026f1413a23a74a79d2f4fc72542a96905712f3deb2e4531df19e7c0e10e287f6d526f88756e52b727ec51c9fede104e2c3f650d0d090a14c493773849f2a8d8e49a7722596df977ff473ddd6bf929325352d82d02c772d2f10a1ba7c21bc6f6669c807882078fcaa7754a09af00aca0de2b5c291d08c12261090a0f716772ee185e9a3f5fd7820abd449c3d71a03acfbabca4a9aa8ead156be86d6c98de91fbfda227167382dec6ba64cac7a1273009f2c48c16793ba387921bf88293cc582e19e2e058fbd918441e4d030758968975a6bc2a24ca886e9161b84f4f619fe4cba73e775f2985728c8d7cb80f84baef87cc221d1fdffdc0e8b36261c39ef596fb889522843127c9f02c5bf723e22d9c77103d53a8b3b467cbcd70d441bd9043c416a5b9894e80a28c580a7aad37a643bc85460e67af37ace7611ce4517666e2d1737b287fefbf53b37ddab7920e087a6ada1b2dc7a9222179c8fb465cd2c27124757e6476fb7317b7b070896f2b2a5725683da7ebd52634c1d0d732d25de98b488423cb0a07be5e440b8c3f7173c48ab255a8d4f08920620a0b0262ae3858d66f92bfc215a462f4ab9ec066a74c32c4411c77cbf2f2af5bd97ca2a0b8a4f34ace709d8862ad4f5c15a5f074acb7bc720397ea0e50f9b45f845b7fca5925fe750af5e3c4e039c9be96becf7affca4afd7315cb64d276a998bf5f7aefb6d64f70c4e0497604780aefba6bb9580ed4470635a02ce349bf79a2c87fbf87fb17def7793ec92667a06c322b5a46ccf986e89e52c221293b95c33d2dcf5cc8f9fea810e38a4c257d615f359989c57ed79212a9e20f04fd1e045dcb9619677c2353b809c48787f9c1f4c119a01b0aad3a8006a23623b173de268a308dd1f286643599a366c277fafcc6b304e80fd667c9474b61fd6c82a1d998cf082bb8c6dcf29da4957f3286bcb93f6e6d497669a4a4084e54222410d0d1c543030fd0e326c4c6903bbe3d7731db407a623a41a3d7f5b6943a2bb6fe63d2621e6eafc9cbd408e214fada0c4f7c6b7003b9e22c9ac29d851bda1be502af396da6567eef582742cbf80bdc1756e1974d332d2a90507934be2ddb9916c97c88fae15befd0b1acaa06cf0ae97b65ec5104b13e2b729a5e9c117c6503c78c55cdf8e2fb3bc1ae62becfed8a0aa76989c8e6e84e9bd4a66d308826a604d0a170d1dc5d37e88f9a1937630bed3ffd4ca3899990f005511c1d3999bf833e5ad7136548c3977e96c1f9fa6a22fb7f72e12fbbf9534f8bf7960de7e0b86081a2dc883200ef0046000d7b5424c4bdc443b374118dda2a3008007b99b625e52eda4b3d2180355a9591ca6dae395db38bd5e66ee8ed179ce12c97a46bbb4aff9a361f481487b12943c8e7bb34c577a180145288b34353dc659e999fe6142f6002ea0437a472dcc4d053ade531d56f2303a59c22a6ac0f213e5cc2bdfe40bda80bb0f41c4d73525fb8451d0c2506db1cc6a1c0948b986c243423d52ad65169166cafb029e770de7a25c6100aa75cbd122a5a29d5d2b23f92104ab1bc0d8569282a7dcbffeb66251c490c005c6f1c40ffcf6771f2230b80abf8468a92bcd8da023a0fc26269c3d574e66c9943d7c28614119e4e0a7b71b54a4a2b486bbfa9b8e6c996fb8cec6248db170f020a560765ae9df90214c5b1623cb33588f87c01effd151e26bf3b45650d0e2b18b0b1cd23b04842df3e687fa28de7aaca8436702c7a6e166569adf90da6e9aa1c0fd0c65f0b64812a2d1dc6a63924f3d3e2d13d648d97380ea56509c53526b002511e933543b46cb09463ad4bc5c3e4b121bf622f015742bf76835417224e5ebfc63bceb42200f80579eec1fe471a30905bdcad33ec7e36a33b3436a2617246af64f9543a422f53369a5a6e75eacf6b57307d8410b81e239cb9c130d45d143500ece27e0253baaf3f1095eb97acda7891c5755725c9452e5eaaec3e5fc740e707854b62185f74d26b756a599c8d82bb8126b28f0f4943d59a1c5d415d5597bc2cc0f643055500b84a455a768da16ee34a57696cfed198c89b6c509e0e2635c585229404e76f7147c5b6cc73d03a083a78e2c7ee96fff9aba14e925e458618540e171d3c929a094f3c396483ff9632e1c5ad8bfbb611097a85ea23fdfc13214ef0ee3dd06b67d805306a588029dd59873a9a84882ad100b799bbff483b44a54cf4af18961fe9422b20d9a2bfb20955115995842279365c97d77b145dc2d39b4431b753ab06bd573bad8a76b55d65a779238ae2c748150473a9bf3ce516a3283b03092d42f17d0af4109d54cbb324fe109a8998e40bc4341bb7fb2724ed875bfc04aa78cdf12fad6e0d73bb8370f3cd5dea055906a1472cf2df66e9f801ca39d174db1de9da875f416b7b1951d55a7d0a4681efbd7843f769ca8a55a7535f6dcb1df52df8ad8e82773acf407d7228d28b92851c60e2df939a7e5143b1a3eb0e8048ae7cc8a415bc276c6996d73f790f9f08ff254c4b7403481d0902e40acb349ec5f48407b05d5768d9fbfa0e5cbb88be68dbdc59740bf05ceb10d6785981635a8a871956b99dd85d25bbd2e8f5e5b3c44a83e1edc5b9efbfcb9cf902dac53f413e8a43b0942f521e2d6ab2ba237705f6bbd5d8d797e3f788b6d03d87360c5abaa967e74ab22d93fd226f5ca5b9a19875511abc0d883fdb7f060e520ede22391ba4e86ee181bcc5a1347a63ba29968ffcd16cd8c972382dcec61cc72083962a8ce45efad0611d940195a9b97e0b8a162d6e601507107a40efd12b09f455ff7953a34a57137a9cb7e7d95b8dac2068197c3786d8a8a11ba05213fe306bc99c070670be8a0926ef2a4dcebe3d09ac76ac206317c7c4acf6547dd51313e7f979092027c7951daaf7b24298a116736cfc1a2bcf90a91682571c325595548ae8fda47a62d8eea2670e7dd1a5d91c7abb4b299436ef807641cf19572ecc6fa4662979e1bd145efec0c26e39678c4d6984f45e143130c0071ae448a36758acbcf521560913c2600012135c879bb8dfd75afe6f568c571899c22744fdff38d2fcf8d72b90a691be4dcd0dc71d32953a37d0ae133ec1607304c42cc103e2092858d5301cdc7bdcc2c3d4090109071fa09e20142cd062af13d09f1da11e77a0711b97d0df886c21df7d4f0f23f5faf5021eeaf942bbb853d487048766646b481242ebc5e74d5ed648985208dc9c6a61943e7962a625c2d705fabbf840893302d6346f729c087c7f9d34ff97cb9ae3db3b49a215be9951a728558fcc2564dba3cece45a34799c181b5e2c6f7b03f98984262853fcc2269c93857a68ddd8a01c8a065737585202aa172cbaedd78228cd8f54d2fbcd24774d906e64fd8530170dbff84127f5ffec779c7e2a6a57dac009c357b00c9d63a8cc0c30ea20b6dd2b8916eae0f07db64199a8eecf0cdaa0113a8412866cb1336877f0c3d8a8800487888e03e0b0190ab936dae58cbbf610e0ab9e835963fc570b902d867781327c76d5d876268ff6642042c59415be738c04c48f1d46aeafcb171b9a898ea95bb7d2a142e4816ecfb96e5e67eae12f7965312111560fecd486b761bcb42054664986ac5a6781ce7f85070a611eea49fcda12684238fc73f90dc2d9c46ab11fddd48fd7e86d3d8f119ac2936bf1ceeb6b1424bbba8f0ebb8d1dcd02442fb92aaafd9eb9c028526a29d5fd1d34b5ed9c150cf915b81de6034343ff5e5ec45f1cb8cb82e2a0085772a728112c88b88f98caca38228e0479d8d2c4431a44dd7a4b43f513b037ed8a1167124230bb62434bf47786cad4b5ca2809ffd7af6a6c700b042d3c1d74e0590193f4197f65fb37885d86ff8a710cbc451f3cefb04bb7e13a538db8cf9cea37423d8ac44e016d8cf84c44b9f63f01b170b0a8abd869d824a399c46240043293b24c567b36b5a1df40a3119d4d17b5b2f21c70fbae7aa256159a113e1813f0cd272c8fa1edc833da0ab3910523c2577b1dfaff6cc93c5ac8f5ac33ef680c14786c6fd600f2dc180b9e96f63c896e35e43e13a60b05224f8cf11fed8d85b859e75d0341235f73e60b8d385efe0db1ca614babf3fdd073b7ac3eb03e5e8cf34db305188031b1899e9f30148f444074691256d7fdfcde7e7251e08697175d25b1a2cfc6a69e63eaa08a3bd3e925513b10c766c502eb616e5e2a34545682e7f4b12caf7d6a41c81197553d3185bf0fdaf187ca54fe7cc1af5c6463a41ca786c4d60e76a2cf71294fb0ecdb9da3e2765f679e3157bc48c7b684116d5e76a13a0474db2bae834e93e1408944a3377a0ee3e48e066e1a4b6d164a1f0dad493a8bcda73c8832d256375f7c8bbc3beecc3523ab3ff53c4b59bd5d7aa76a2d617df64d87743d5601cf306f1edcf67a742b2462e652fdecd1fadd5ff5a188847c090cedbe91b07f11be7a0c5ead55724fde695667b2748da1dd4b4ccc16f3ac9d1d12e238451e02a6e568299bbc482a695d7907131f1ff76e69876570e9fbc590547d0a578af61018046788c64f6a36c1c683f55c665e5c597f3f3c04149894547d691cd93a6fd3ead19c602d385a55ae653847f812c071ca623b58cb4aeef98861a58432e499e991c33d61004b102443283018bb8ff7420a1e0a0bfd955e79fdaf57c438b6687a7c382a93a16f78147fb2087a20066d0cc3645e4a6c0a7b6fc3428af50826441e7bccbb84c92567935caca940479dbd78b569d9dae0d693d0c83ae597223bfe23024292c36d1e3bd9d755fb4d7d59db78e75d9ab5c06af0de5582791b223606790bbaa6169cf38fa2caa82a1e46d549938987a9ec3de7df22b693c620f3b885c37d2a604e78dc26796016ef5b81a3274cddff09cdf898d84f9e1e990026ffce732c37cb35fcbf8f8272c3613b9a2b7312caa9b7556e16bd7e8ca811c85d8d59d3e358c1b6f44fa9449687a01a8da8878ccd2b73697f225667ecbbfcd166958d2185041ce9b03b0908070f44e9827440c7aa87653f354fbdd4589ff4ddcb27cffe4a0755aa4b1fd51602dfb3c842dc1c0ab78b748c7afd08d1d5418d874921bd0da8b447839aee22371fa4c2ca4a182ad249704d86db449ed91422fda4311018c7da08645f46d7ed8eb207349a1cedf2e4bed7449c5cf5615c16b887f186aa44e69e0b52cace5e8948b190b19ddab7a7fa22a7778589d3e7e1964ad2fbc142063e0adde6750c238a40d39bd93e3c8087822c869c4cd8e12c6d075ed958fc7e06a0172d99bc4328fcc952c60069e14c70427a91c43d8bd5c650cc874836224f6157563aa8af9ab1e1536d1e6967a2d8409959ff1e03b6ec44f46ae70b6d48d1ce93c1b3d38e1466300a3ec8980e9551ecfc90299124b957dd5062cdf648786c70d8c6596e8b57d287eaa87aaa1116e406df1708a2a03396be27ef79338e1498a8e82c747b099b2a791827cf97bb4b70ee24d612db8f6862a8bdc9553d831114be17ba9a1223d6f919e952174802a755753337a7a7ad63e7a2d9e3a5d723a2d530bb703838b20567f34101fd1c40ba07e60ed212f1bb6b0c89f963bb1133d59dfac88f2eab5c7fc146f51d321f830de09760ed9d8afa6c4e50bc02bc560f6d2f026065cc14107471d3b40b4ca80b76a9697266e6a58b239236ee06ecc25cb4bc5e353bee892da74527310810cc6eb7ac3f1f40c3ed7cba8ddf8e270ed0c53966b98797d06c6e75d7b55014c315617ae4560af12e639aebf60232b7f852ec9d479010b3f328affea318075f5731d1f68f4066060977428b1cc935a8a9681b4b144c394f8719e80db9d01f23a18952387d513181ad082e87264ed2f6ed18a4dc1533d0a35997712718bedb972b873eee40a2a2df8de6739aa9e322bdbc4fb71601e03a5a5c05da08f179dd5c2a1eb3076383d052ba2790b19d992f1001eaa70f61f17adf456b6bccdf0aae90dabb80cb0bf303e5fc1ee1fd129f74198490dd877e7eebf9a2df0e6032432bd0699f0229803debc0da4e58ada9f4979551a51f5a9cac181db016d4dcf17090910000abfb5d7c89f35f803f2af27259ea6f8c3e8c2849e2332697a89d5020f46ef07cd770bf1540fea48ab0fd336905e9c347d3379fe41f248a388bc004a050d072f381513f64f7843802f865ff3fd9805a10e93685d59403122f68d2bd8871d5157867e9b7635842690f6532d70b4cbb22b930548640b9cdccbd0ff1e6928f70d2305472d6a13cd4513f6b46745ff86f54318eef2eb8a023ae06211e0f6923df53f7c36574664c1987ed1df5c5adc085e3e110ce91cb791d1fcfd9903b38d3d6615d3e90e75ef81b27de481e9b454dbc9b4994da8b4ce704616499645e019c21d90d0a3daa60760832019816978fda118ba67f67ea0f930fda00e275eef1c1b17d7973726cecd9b75308f9631508f0ec34f606cb92a5d1ec3dc747e44b22fa88827059ae67f32d7beb422ed85948e4bcfa0b9ae1b7ed355a3792101e67619c9f2cba9c440d7f1c51adf1c21acbd7c46982c09467c4463fad0175f16ad4b1130b9ab20671d412274338313d0cba4caf1202674d2144a9501991d4585c8ac48d00cbc0828bfb15149c7311e1210949f74beb65e81a49403401d6a669621b52ce362a8911f04a60ec415980b78fcfebff641e093465091403aa4206bdfc7767b97cc0c8e6da82e97226ffd6fd40644aefec499a666268996d2ee7f27f50c066d97d2118d118b5f754c83632a791765e500002121ba23234c49e17310ad04be4592f31221ea5faf4ccb80af8c14befea77e4d3e1f1e056111a19ba29bbf688736fcfd4a1f04cecbb170dcf51c542ff6a3df4610e173c2d79d0708f976a75f7e1e6d8476294a62af717c92afe490d6221f5d1cdff520681516f47161480fe89c043257c60ac8635a3c57db15fba1d3cd8d71b5af4b121fa3c30e27fd2562d953e22343c816317e90fcb18784bebf259a8a3705fb249c4a74f0e178190bbe24cd352775911b53f09467fbdb3de80c9424a1f73b15e82895886920ee8147b3d1498a4a123d3191e680cc0aaf7a3295bbc64eda3f32fc3aa08764c2492ec5d59ebf4a002b2f2f1d42a6308a00fda7fef23b5c892317b24b00abd135a58ce5701c5d868642238cf32969f264e28803ac71f5483212c94b66bb0b58a719a181025d17f1cc381b9cd7c3c877d236ab68be2e5ca94cb8a3847b7da3a55af18b0dd460742730c790bc19130f33f6ea11019865b1ec1937ebb98378a26a4085c04b00b21d1a62b6b8e116242c5c303bd0e5971eece4e54230ba9ca99cee962b2e89319da81566eaf50dde148327073f93e9a275a665e938342bfa3843675048d0ef8183ab4bc015775e11722490a02c399a29ba427133a25b618f164b496807784f5d8a5f6ac49349d467320e740c9eb6ea08604874f07b906293e8a71a855298917b7060a845e40401ab40ed74082a31a97080605ae7626e256d4e8ea3bf68987c2f0a7b5c653e6431261a0b3266307673cc330c8fc84441abca6d1a95707d621a2aaaee762b0e01cfc89bbad795fc71b5bfef138ed619cffef71b9d05e2c8d394954c5c21a07be021318035bd3f2dd890eedcdff3d024740c9441a4c228651ee48144a1610886d52f07d52f80046620d17dbf58830fa30d1e086cbdde0e8798379629693a9b107643fd51430f5c20e85f5f16084b0a5f5971dcdabe0696c0fe41e1de64eab245d2a2ccb4811b2b2a5de54b57357a9a80a6bca9a79e1193dd1a9a6098ecf8162ea7b2c26a21484f08d32daa41b3b1a1d9826e575bafb7eb5d74b28dd46ab98f57d2d3712fb55a5bd55b955b518b0fc68ac7b9878e61a3c69c629916a6e6aa084e4fc17d47f48e3f843c7e8010eb6c8a88d184400f1bc4198322c1aaf55863fddb0021d3b3c0cf4fee7b2c685617f49e64884b3014e836c0e02a6c59516affa8446bb119c87ffff6b2aaa2fe3cde9a54204eacc1e38d49f3dfd656dda91b5cafe586f5655de7e4658625b600c1dac54176c7b10e81a2dd75f2a25c9743ec394c8347e10a225c2e0e5c0c26a6015e6aef8bb078fa888329d40b450766d639c041d3fddc1048f99e847b0031f09ff9acd3d97455760c55cee5709ad1a40339f879af2509cd68290c6809d3d0182c4cbbd8f611a40eb62ec1c72557edefdcecdda00e3134b5b8e41fec0a003dd2c3506b4bb2dbcf588398ee49040bab7460f1bf2af4cd0d061dc7126e54988505e64f596be25fc828a0c9f1b62cb4f1c5973f0cf9ed439a4dbe68414db052caeefe64008b2ea722b080ff3d0fad241241999f9468ac3bacc28c2776644250268b7c3a4b3906b4b3350a8d141023797459f6c02ede1b74b98db06bf44e30822aca84daebd80d82c32291cce91ac304a80b4869dfebb7151493169da0c419e2d0edab5813aa2febddd1dcdde643e97ebc2ae881074762fceb1dd4ccf9a57a03ac831397509fb913f02663d6ed03c2e03a41aa387fbbc62ef16d214744bf9d96df55f78392a4d25ccc34c0aaa7ca7c4cf3dd47f508391df3e839db57f7b93838c3dddeb73e8e75cdb8898178c868e325028a86eeb271394e8ca2e9b12fb2f172405d6322ab678a404b091aa52cd18978cd32230fa2e4e6f04ebc34faf5bab8f35e4d11d6ebb2640094da629fae19de32868d75ed825f8864108873194c39ebdf25417c4020d0f721ecc4ef525f3d36e4dd63d62a0b878a91a1662315b440f3b1c0d04140012744991c2f3585dd68bf73bfdc804e394ce17c9801074e8b270c616d0160dfb2e0e6435d3020f45de64f1fd55e1b93dd17ba2e6e4a2592351b44598d732114a764c45c895546af728cc919bc4013ec5dc48094aebc1b477d396c4356aa4cd233dc3dcd322e69295e6e246af8bdbf50b410d86136e0e38c5d2ca1b887f07a99d610e5f6b8c4ce27793c1358ab34ddcf63f2b64b65c6ed06207810576fb591543600107e80e49ca619c14936c4c029fa50a4cc2034bc398da83ab6968452f451c833f45b3558207004dc060e77e437e06a17f2c93d4405316ec26c3066b6c828abeeb80ca85c52c88b8ceeb1012513dd2e298c5625a4edabbd1e8b2b495337085df65eb7f05d12e1d03e1234721541f85546141d233326dafdb85a93ab615864e96c46042f700e6b4e43bc65d454b7798df39359e2681b8b6fcdb223d2723449626f106fb9187e043e9aaea82be91247708ef1111f31a46db2788234ffe29800553e2d3a7e73ec9fdf41e6e95ed35c97a4e28513baadb0ddd952cddfa0b91002c46a7a82d802dc73f66522ad3639f886d7aa52f32bac2f1564b819049fd87d7960cba44dcbaa5453c9144df9d684a708056a596309922cae60b8c123b88fd951b0859816791cc1f7232d01ae4fd5d3ab3bc7e15dab9224dc799c934e89e06d231f5bc475a685d4053a9f3991434416fc83b103490cf4e1d882e64fccb6d4aa3d4d19cee4f91a11002ef25288c2c0085cf053b4e7a81fbd1df14ae177f66382c271f78c0f605635d6b53569ffe09b339fa90e3ba63c08a25eafa97f5c554f65373ad254c359e79ae98404b5570793d20f9a92a323aed1aab908769de5c0dfeb13a808b4a58b832f4c6e2e9d0c890e8aad48e063c1b82e04c83e67e34f67bbe963404148bdd8cf6cc0797ae998c84068f3bb3dfbc592af6268bb39cda9b9bc55513933ef62ea18d2b69b4bb5f9ae515f718a77fed7363393fa1097a126847bbc556df26932a3797968dfd63bc928f7c73575c72fcfcf38e70a93e80f9823096bf7b920c2e2cf69be33486e7c90f78c01a75a0770ff0ea613452340755cd0c83696f19beefa7988f5a0772eca56b3db6b450d829854867462465d88a5b278bdc5b75a2dab07cf2a47b4bfff10bce98576ba64bc72cdc12fbd7cf0e675ff41d002582fdcc5ff80d4bc476130ac8fab9729e746a2c9a23782bb57ee515d01f4036042df31593935ede2305d54eb2bfa4cb64aa752a952f60aca5fc8d4fac98175cd697206c7e0961674fcb1031c28b2c9ae9b2ba8a8e861a009cac598eca6a72c26541f219f2a074cc6b88040008d5234f704bb44fa1a28f8b1a4e0aba961da23eb93ec452e8b1ce6d450c01de456eacbedf8845c0ef1ec507aa684d572a6c6d510fa3569066482f40cbccb6d0046227e45264a74139d3a31106d13764b6562f82fe0673351facb4ffffbdfcfc85a30b99b3f2ceb38a6858a7d5006283ce8d2f9526f7eb942a8c886736df899e7c8c6388c0600b4479ff9751013380d0c640ef9445c2e8a9c8d86e75f4ab0a045b12cdaf1fd0d81171dc4396f2b88149f1d6a714e58857f04b954be2d48cd198cf244150c8431abfa02a551d16db246199ac36327142dfb42e57dd990aead33bf41764b8161274801148d3fd506baed5aa18a3c39ca078d08f8b1823c1e0ebf83af0c5a5697407857d580e32573f717dc8a0325c46a8782e7f10af319c230c422a5c6d4f23bcc18e016b09fe90e1a0ee05072fa07e799abc40b7ee9ebc2ce6d5d835b05c7e17db5c1c813d05ef2d3b9aca1d3388293edc512f0624b95a8ca8a15012abf54b67348462b4efa5ddfb56491804236ead4d9d2ec0c1dfbe85ba3a47ed59b12c675e19308b515132b2601bd62b2a10fdba37550f9451e2bf5c01bcf6e45fb66439bd2239f2773c38739eb5c119d26c9a38d6c7475726dc8f6db7acb1bb48d5cd055a7bbf87b22d3bbaab0937d306a408b289155f748d63683d464341118270e86b631c2cc6448e34abf3904d6b27104f80e8762c398e39db084559ae88c3309a52a999bc40be1c09b8ed0c9bc027fd753935ed3cfe4875ec0a2354aee2fab065e1dc10b9f428621cec5c23e4b9058701c4efcb1d81fa68f5a6cf5b87415cd1fea63d5e8b74bcbbc94593373e9aa8552754554da69cce451d28770459d622b7eaa0e057f5a5b2174ce039c40fde8eedee81339981f5116e4b27de56d4d42d1235897cce28375aa95508b14cccaad574859e1084d0b9d581a637c14aa8b132a66c03d1eadac01a2fae834b083c7f606d911c5fd496059bcab9ff82c12da259eaa2d115f395c2a91f91ed154e22e4aa1a8e05e4527c4a19943cfd1c42accd41525586a01fff8e66fa06c876b2e80be2c22f1aa9c2a57860e18f78704999a83257e5686b197feb97f9ebe47494586c34ff91b587b68ce05700b9b72b94f28f1522f0f08cd2a1be22a83fc826daaa20552baf3c9a9abfa88d7313d5c99767482814d9146cc431edaf7849c12ac1a6f7828737acded992383d8622847980e30d116b00e70eec3043c839259601e7378fab8cd9ccda075ba245fb6a1f0b62cbfa3a69b8c1ae753c677f517c8e52aa5e8f861e54264a2c43e524a8e36d2fbbb8b949adcc2ced9dcfd09e3d82f3fd703acc4077cb8292f5ab61cd830c6d43be9855461ab7e2da48f233d53df31c37a058045c76ea4c7a2046f572f54873bcd2db17e78bd488e4af2002949bd5f3969f7de5f7053dc844a28702de30b8b104411c2f8d6bd527ab3321efe83947ef3318732bcfcc6a74e43800240fb0f028e53de04540b80b7ec1bf15605707140b0c57eafc8efaff8182bffefa5627551462394cd8ff91c3f3e1e87fcedd3cb504cc49a93cded15f9e2eb0f0c27732a2cf846c6cc77da5b3383d3c2a50d9d87b4ed94472ea7b55ba2f2ec0fac5b98fba936aab4bea63e791b40bb270775d8497c078d046d3069d28dbda02aa3e6ae0663e83bd102dceb4464e80d0b8d4bd19f33568075f3d508c1bf060ef9bb8a4caa0d15aa6ea98a120a1b6a6ebf599ab1b74d526edf7c9e00851465f26843bac5df8a0a3f604aa6cca8b088ff5859141a66dc6c506be24347086309fb9f161cc2b035475a3424c0ef3eb0f70bce43c280698aeb960f58fc608e662f4cc046af85219b88f460786c5b78f97aa0fc8f3e34537ebf86a2c0b4f5618d042b5c99c428068c3e79a9c7997d35fbd35c0f93439e48f022875a432755d5cec569a6904097a1a99fc1348413bba428fd672553a40c595da1e721838e0a547b6ab1a1f1a08e8d4265f2f9273258f60379ac15bd15077b8656239310758b422ac3667d1b14f4c91c88f6075e742a98b5ce08d1ce57e2643333ce97e42a76083f8f2cbdc484a152ddf43f9b26368cea0cc58987dbc690527a80ea8cce61cd8db7774a6563a3cc92983ad3564bb0e83be9b52bdbd32aef41193da50cf1e1a4d755997a5ede7288e4d48f43876080bedd047309cf83d2f651054a42719f599343978dd444bc6d0f3ec99f30ea4c0cd2de5e2f642784efe7aa4d595e3d6e3c528d2c3cb1f184132500605e51c9e2642a5db48e116f650905e49ed81373d1e2ed86726604938149e5f33a7293a013e9bd0d43d29f594ca0536166e33987dc61db4e0917329cc93c2833391f398e6a4c0383fe4a1fa1f709d9176bdb92536ab646d751e59dd02db2d7a9e0108409e7170277d5f858dac385bd40bce6e0886a7b4b33bf4924bc1f2423e3cc5698ef272edaa02bca8cb9000e4120fe35b43e7e9c801c0cc5da4a93013dcfb665d05f5a954266e20a9705b8799582f8f8cbf0291e681740caadb6cbcdae5eddd814e49c080bce664cab1d8ba040713f0d3849e898d7e36ac411919fb56018b80d403dfe62d603ad6745769b60d0b6046e9d1b4a9c896ece6ce644c2f6b922273abf60e825b639a8034238450f93f822f4d96630af25b68db1b8be58a8316f2313c5f09c6ac8ececbfff4081a9a938da4e1efe57ab3cfe69115911afa49897f0eff48f450c962168644b1ce7796058c260570ba229b8df9f7e85286cf1d38d5ce78b4a9f82d4b448a0124b1dec0f47e0473a5d8d07d9c13f42734ffcd29c450538c8f6c640d56919fc7f230fdbc387130c9fc8eaf02ed16cb74cf7a4eb3816371ab3192f6d82ce8472e42653d22a5fae0ab296d935e647c5a1c5d9909ec6528cf83cf7a4d00b0f74b0e4355900ed127e64baf6836cb8c18985a0bb48b28e2cddd0c83c05ecf088f45fdc814fd915e9207075dd8303281660411f70733f50a661d57d2dfd5a2a296313ba43c7571ee5c46e464826ccbe1a6d8726b67d0a4e56fc2ee76bf0b85c36dff559c1ecf33d4a32b97f81ac0fb3a1ef5fc8db98723f4cc5d2aff315ce2e0a4010112fb97e9b527f41bd67b2a66d43dd3586207f1d654948151cd44ca321e756c5cba9d44b9e8f724344c4e94814d82314394c28733b4877013d1e6cc237e4d74101c84f49ba9a7d00dcdb668b3c3b507e900887d9115aa991fc797609217b6a3de8f7bcb078659a668ec21166c538fe894eb143b3df42cafec0b8a583182ba2c8ae314afcdff3b215ccc60a21dc18b730d59d0d47ec0245c60a65e5440acc76c0dafc93ae373f8b6f56274e079d995ea79ab561fb4c15a5c307b19a617510b3c20c215e3da04ae61b9036685c3b105026d02ab1278da66627f11990970f347d22e47170894f02c2769f5aa0d5f6db46cf3ee996c68ede1dea816bf49158eb9a3a68ea6f613d4c4edd46a9b295637a4c6b2c8c3fe690d61090ad3aa6ea10321e6b559d6a453f716bf19860ca76fe01e8d8e794643beaf0bf322a0771494a2645a95016531daaf5c7a21b4db01c558749e3e159d952b02652d5f81a59fccaf8ae3f280e727c965e1d3fe67ee427e1fe64f1aab09032d7a09f5aaee06c2d4a34a897c1134d9a220e8e0c9b7fb935ca4401aeb6942732c99b8401ff2aca2398249c590f0cfa0d5639e22ecf1aacee33491a5a4e2d78882659dc06d3f0186b09ff8f4bbec1b6e161d164c9a8e3cafa1ed2278a2c8b283a85988884acd6484b618395181c9ba38abe4f7c57aef001fff311fb36504a8b11e9ae46272f810111dcbb5a62478691b84eb9ecdbb514a69646b4ed801f3e8b78e913b89de9cd902244d9cddf12244db728227795977a1814d065e8752d885edf1b4d65d427ac0550bba5417281eb56c05753720dc997c56a08c44a1332f4b46569e13c0568187d8cd7ac97a158c5720167da760119e015bdf1db7d893e0e4a5e40bf0254db2ec91155413d9cfd912a0242e6d27bb974a01444d99436296944c4dee492cbc1a086f250db52ccd47cf478b501332138f086fd367ba991573affd6bc0382975ff0bd10eeba529c6d9dfc12d987ebc49b7954053fecd8d1725f77d75704fcb258c836faf56b7d1a04702903b5a0a7c4c217feaa9b2dcdda821d7eada0da9766cb4996ebeff3fcb283897ae568417b4bda3e3c4dc729a39ec3e4274184316e842adf06e6a528231d82d3c2ddbf9fefbd06f749602089161601e4093f67c4cfd1e8aca4167104346836752cce382ba0868226f0d9428dfce013ed1da11469c158678cd9c8fbed77cde8287702e8bcb3a5f0b12caeb141701747caf5a6d9e694dbb6c24295241a1aed81a7d7e49e22fc0e4a22756e4548e1a222f3da9d318a387db1ab0d8e54a62bc9d2d48a50e98d7db21c18322e3032dfa2d5df302015bcb687910ac3a23708fb32b3128b03f653dae55d9b7370de05305bf6d5e54ee9488f2e426ce857a5fa9b33c3863b5810a1dd8664aac0b703439ca0d038c18b2c63fa24ce3575b5c4f42430088b140e7fbbf1420712f8bf92043c01bc522774d50a33da91a2f22e476bc05dc5d8a308a9829357e1b15477e171c960dec328cd521dcc3c8330ccdf52910b11223069e672ef024fe761a618befd11814951b2015da51ed54193c22d1d6836a6d706f4a42af4ab275ddb9f6ded2339722c9f3fd029b5304c30b07b0fbc0dd092a386b502f802aafd202f554242caa1059f85c7e41fc1d1b866b4349facaba4255b0f849b225b10a513d496c6ce70ba6cbdf166992fb329cf1f5ceed998770d56174de6f724881cdac946eb34d1c506f8ba86cc69b97d90c8b2a0e4400b54debe16e69c6654d2b9f1d36b34f80272169cbcfeed61c5a22f146da42a9b3b9411cd790b2a8b569c7554557e55e555d10b0d0474d75ce281cd59fa3701545170407dc76070bc03e81f6367175d54da3f9dc3d10534fd8869fea87afb0c7f4c527066fb025c2ebed3f5d8bbae1082a2cb5acb1b7bc659ec2ce0f95ff10d8ba2cb1a3ffe56fcd2e4eac18b5216cad870c9b81f4c29acdf211990dff82d7ad422d52e7f8d8b097358a596dd3f19dad9315fb5c51f1f9ed9a0095a396d7ee36c07d1320aaaa3df05d120362dd8490ce469a55b89b0b1bed5fe317edfa1c0e19106046396ab0934af72be7be909835f651a153c2bf208269ee4270067ee0c6dc0e66a52c7340c6d86da2e5dda9dd30d8f7a34e931b7625a30efb196ea2b8b1a1fac2d3250791c79f3ac92a92684107218119ef83d5374e4d78538b497f7ccc8425ea5cd1b7512f0ee1ba2bd1c5981b9f7741164743808341b91cafa456038417a15c049f2169a44e87cc50fb549a62cdaf0cbe85a4bba4af70adb5d479dca07fc654ad1105120b877c4d66f979e6149a7ceb655888f4b51d4d4f5e6b3a82e00bd423b23d334856ed1997562cca85921dfcc512cd01bffa23b5b88053c7d279720057a0933029fdbc049f8ceef897411a919a624198bea23c89b3211c6c84fd77712c9de5b38cf2cd73423ed15de063ead87a817cb85bbbd8e58ac46a202ce112babb60f648eab22a3e9a71e702d8a5e01192136bc1ef4a619d4d0310ac9c14e8d0e80ff9dcaf887dce2795a48416f4e64ae0188a67cb9d1abc3f1e85157bf3aeb6dbd3f6ae40257f95ec3005d530def59031e6360f6468c30a4cd34514240e08a8cc08961bdbaab75590a5692043c17b8cc3d6780d955c4f1792b781a93f45612b932e221210f17429b00b4b35008145482f218abab9870c30e191d0871727ae944c6ed1571978477328fd986509f1276fa6adad31fc978fc5e96db5b7404db0e7086d5b373be097a1390c8a92e617be7848e0856f5a5e53d4376f12c3967fddfe04ff868cd428131ef2444b573d0e7e7899b2a5a869a2ed19da1b2b70453b883e74394feb55f53ccb510e5e0965e2828492022a8a7f88c6f31c5bc6d72f41dca8744a54c562b22401a5dc368d5ae15980f0da0554a0ec133d8bcc023abb40646344e6d17f486dde77ebb0fe3e49ce0acb6afb6e11cf70d874de6c7c2b484e57efde757ac154c4d53ac149bc8b77f414808b2a8b71a3091a81c3710e2a9d36de5747066a9b54cca337b10ea947944079de1791066e959b3192d15ea7959bc1bb39663dd9cef5dbd1f36f20d6fe7b0949c37b7ae135ef57e70de21042b54266ebe7a743089a783920aa537d88f09208d8b392a4fe77d24793fd3484bf6de780b65b2b3fcdcecaffc48000d252076a2d44fde6c283ac595e0f99f8f389780271ec6852f3f63608b47183942aa757f07421b718522199772b50f07580b7e4e98b848e6d5f6d1d784e7b8b8994d0f2b66bd1ea465724f6ab50fc4157215ed830be3e792b0c908a61ae01875698cef994dcf63b8447532893ef274cc25b7a8230840d1d442bc30f3eccce9485472ab1b3ae7a20a7d40089e7d7287048de485c6ade633549feb12cfec21f13e9b93877f32302dc77ebf0bd6f20325c6590236c9c0eaf156777b282724361d3099eb116948601a6f41f5abf30834ed32338f169e4002b3d026231a48a70bef6d6b72cf3df05dfba0b03e4a357ca678b885f3f542c8fc195b52b4ae1e34df456fc42d28021c8ee01c3cc9ec2b6612d17044c5ad99431c9dd7c65155c85b8e0e8760b300f60e4e41e141743820c73b011acbfeb514662c53121e0e8d5e752eb1e8c639dae88638e4ef0334e50374d508e8b31a74acd35801724e8be6f70cd5f0b3c67854283912626aa3d8f2d861a2813752bb55059354e09025da3184235f983808bc11dd8371668c39d49360a4e81ce740d03cf7a4926726b908468029eb280c08f6ab1f32fde9b9beab2ad2fd2217c8c0946e928e49d8e6f901478ab904994568bd4bcca65a92ea0ac847efaf359dcce8517cca9e42c62506ccd0e8732256e1b0250603d41223da7346b75962b6129b46665962307d9563b9813049b0c4d099ee2b31e19544cd33a34392f9a1db0ccd83c7c7ed9598f484247a2d591f0851bd728d13607891ad099345082e1592e7de18e938315063c05cb5cfda080aa52b2ef8e12134c8015dd4287f456aec4b3a842b858e4e7fe6ac348cb0c17360cc32910022ce688921394672bfa1017c757c0cbb871bd85206f64d3c4530c1c6eee1435f61b0356813951920a5626a4a1ba512eb232940c80ba154db09a4782075e87c5cd399bdf80f8a09358b22c0dc5a65f3af50db313913b5bfc6b70d93104f4ea4707ec5c6413e96a849bb9ce589060b725689d5b4ebba4b5306c0d795eb505495ff90675b2dbbf023381e3271c5631ce9be67ef2d838684d3178625ed2d5be716e72fc965c690602f36295f64baaa5507984d45e3250971d9c0f97211b6e67e44a431bf3e7c09566de3f59fd7289ca0dbe7dcaccc49b6e68d8ea5fe81d2b9f793848c2b35196ee684d15d026e802013ca54a2798ada5b29e4d5fba9398ebcd5ab3db9baad6ac6b702375e8d3dffbf6ed5ec7794ec8b28b88b5a5edf578858ec65deb1b6c4c2ee4bde05c8325f9d3ff17a72db12083265590da06ab3f875b0735971ebe7a0048d4767e330647796454572423045047011cfc903a82dde9bbd4338319785fd38c34e19014a2bd6a920f6480c39aa17de8790334c562cfb61494a90dc14a50a95f01a2a82185e63d9190f0caa75a3daeb79f8025848e472da38c13036ce84eb48a79d0b0d1267a7c5ad0733d0bb050603142edeb4a06044d17427b781b27039abe21b17024b3f273903c4a7401957c90709df19a4451e404221ab48f05ac0914e0556086e15447f7e90309edd83a96a7f9ec3bdd37c87e8970f10043441363f3f769bdc48e299662b229b781c53f7d00a7d39bd8eb771662932fddc90d40a2becfec6c0206fff2a6a8ba62f933111591fefb4367cbab6bcc840d8bdd7e052925a878bc1d1369f88629f75c4729e2c7036f652dea484396fd48124f4187d144429aa57e9106d214e7dc212db4365ac8f4e0b3d24134113d1250b3afd606ad1bf7a141affefcd99530f6640e9dde85108b04474ebd1ab8bd673b51ce328dd4e3cdb314f0c8f962e3106b68589df552e11e7903f87527778c3fef9f4fcef42f7822c7ba86ec3e69ab27316a8f96ee6b9ccca6ac3ab346815144563d07b9be14af51fc21cce51dca2aec0910a5d29a8703331df63198139f9004459a0d90638ef7534c9028ed620e2faca92fcecd3aa57cbaadecbc7a0a9159fefd2ee89f793007820d3418991d907e61baa1fc668ee4f8ddff5c77cf488059b9a9b0f5a277b28842588e75270c1e77fe0d9263e940809a7bf95224078a6804448f2c4ea20521cc7b2171de2603585228bbc91a398df4dd927f690972a8ad928167649d34b116bdb020574c04370ed6da5e7f928bfdf263cf1591a4fb63ec147d880d0555e40c022092959e0e7e9f86014334f7afc874940e1f9d15d61db7c8d45ad7698db4b495d238494df84f7074352761afc8f4dc48da95174cd84f9fc02c0f3da4d53e685159ebab0c2a6e2a7af29fb8cd5b555f091e9d20ac014d8e7a32e34b3a030ff6937ca54596ffa865199e49c4e5257b6a5a843ae49bb2c8a58789c4639fd6e769b086f174d0b1f96a187a41b0f5656b8b80237aa8066169d12eb690944835ef2f9160212ec62378a09d43153c9ef9fef570953dabec02a51439575079e680d23b5a8bfe370020ff32a5909aa828f3b5bdb6fcc8af6d75b9f8ae112eefe561f51602a97225b3580264d105ec6fba8dc052d6f9e2000be6ee3c077f6020aee3d52ab39069c4015d8d9355386e7566dbf237d00b0f9326de98cae0fe1c44c4bcf047ccde6a4baf9a7f8b8d533bab5f2dcbea68193da8289a5d068c162002e93047de2d35e4f07cc52b6a65cbf66f8b536b1aba664e41fa7f67e7823b70894dd5937649a7c0a199526f9928bdf722e8aa444c01c8e31e8882a80d5d7ecedffde4637795161d06d9be4960d40ee103a3ca9aba9ae5e4d9beaa8c18b415d7e790c966213f8dd29d4b54ee55cd580d06b99427ead75fed4d1b1ce42a4ba29a9f41039f542d130eb2a331c41ca853941393e9bd1f7596d963e66506c4e06371334b65b79cfb677d61b6bfce635894c06f9ae1d6b5e9144d0c10622a57a934cbca5f6df39240ddba8073ce6fdc8454b74e43fb229e9f7b5450aa98ba4b85c0b14415cdd4433a0ac0ce309c52d7ad733d845952cc7246bdb406ac822d95096e90d814baa71821cb4e39ec432163f6f305c4fb76c6561cb2923dde27c17e5339145b47fb9bfe450c052d893b99e4f7302364433932e4a5e26b0184387bdb403c6e26e646dcf3ea58269f083ee1911b759e9af8d141c0a6cd24a1473194c228bf562426ae37667ea055cd4fd8b7f6c91b77040e239189a79607acbfa7f1038e3187ac3f9f4eec9bf1ce4f04b67a4aeafff2ed629e6ee031d7679774afa270bbb784175cb0a7644fffacbf40438177bb03ee10ee53346403c1a284430bfdd0de66af05430fe8413a26d6bd791c7bf4ebd1acf637098711efa7eae8a6e73aff547a421587cbf508c9b5271e8a5057d136dff739a1fc05f45ef44d553e2b95ff1eccce39b7c5a8447ae1b78a4a6bdb4a09505a7d8f25280ce2a7cde2f6268062a07c8c3985a0136001bbdb602d5713543e8389debcac84df0f156f61dcf2c3e3e462e49b39d3f16c009f8cecfeab0ee65b2a5ef168a9f21ae25e4061a1c2df63a409ab85a4506a2eee736139612ff79044f62bab0a4750e56dde97248eaf9d745346f5a4d6173849ccc8d5f02c2bd55886162c8a795332c2673c7c857f5d689fd37cba093c0ee588926a1f7f5a071ea3452340d41597682663f39de020bcc3b60b0f2c2a3890a4c893d41f26c7097e679a1bc798c3d4bae849079048866861b2305b8f7e9a4a111607c9ba33fa594b7922cbb620de516aa172e6b0d41c033f890110644963578e61e6eaca32cd2e57caf1825fb93bc6f09705f06dbb88160168ac5fa76296042e17b5cccd9c3720032882ff476ff7000ed4dad02d3186dc25bf0b41b02fc53f5a292fe25a4fac97afe7965a377a9fd09779d3e5eed756bc10b6b61bcdd2d354b43ae5cbdc75a2bdeb3a18b6736ffb671d5d1ba2fd8ed4430fca2edd450aad22c253f88805e2bfb44dc8d4a617f37f49bfeadc8b8a97b69f40ed43003ca5166785b30ce424a07026d0563d3624b9e585045b675d6f88af2f2650b0a863ac375b916ef185a765479f0392e82b1fc2c59c513b167383d6704629dbda1392dda331023d02c5379d0573c7b3edcb730b3f3cff125217befbde59652ca246584074d07580746320713d115f6efcb79c4d8398c0a696811fb8f161b4ac638dc9672bb94c7de85d409ebb17320a5443207fb66451e29d163b74618e76c8d1efb8ff65890635e038243192e13aa3d09276358e289e88a8b89ea10c456bfd76b074de4f9b5d62ded9980c3d13770f4e72e98bdf41c30fbbef454a8e1a763b7d66f10cb8473497966a6492e0b6369e462ff0eea3dadad991765cfdf2457f233f7d6124e32dbe06da5c2c9189688a5114ac3d4c5ac13cf3a33c59dd1692fbdd3da7c9a8a9b96b3fd1de89cc9134f3ba7a5d576fe80ca2b355666f369aa8ca394a336b7a320bdd5e6ebc9c9e916576e9bb3d3c0dc3d719cbc76823033a5a1c8aa524ad90e020eed6e5b314867edeead0739daa7e368bd4a5a6d7733ac6d574a99d17a86a33da59436b576d4a7b596a3b46a1d05b1ecada3603d2339ed4caeb5d64a67d6d7959d2caed5522f5c4a29a574aa524a596badb5562ff294b56a980911194ac9504a260d194ac9504aa64c1a329492212aa30d7112c76a3808f57e64d8478fa60c671680016b43397f3e85644efb0b9e0b2db6c7b4cdb6e0b3b47155051438ceebd19cf34e68c9c26915f734d055630d6431a95c6834b4032171b43f7d0b21731ac914125a80c7a389ebaac469d13d9f4353680aa986c8546b8d6a427c35e31acf4f8b9e4bc920e9124fcf52fca4ac1c4824f1a33c82f59c488c9933e69c530236c4d0303ddd508689d6a444492899dfc4738e538ad1112c871fe7d2e4b2f9386363a6ecf264c9044a82708202d49a94499432b36676b3835c2e170fd31b520288899a49b09fde4b930b2945e68cd9657ece897482a04963ce3969d83c0d973f3c0da741430a134fc367783d34da490d92124dbec6b3d75393b3a7bc9e9c8a42c6a71ce5f5a45028f7bc1e54f6a204f15ee79cd7d3d56c79ce2513cff9e6f5709b4fc9b3d56836afa95ef3aa6945535e4b0204afcde035c75e8ff601d2d0e31b24b47cf655e1ba520550bebcc5625c3aa0043de5e95cf434262a86a1dc7b7dd8c205cd099cd0e204d6bad488bf4d90f99bfa7befbd4fb0ecf82d96780bf298fd090e7ffde27ba99080bbf7de7b594eae08c20cab595e13a323db164e5d132c48b426ae89971c300b6584b6262c38920135925ec91f71ee02043008426a1206d0cbc94f08582043e4c48720169a849c9400a8014c8c9c2001c4c216474e9e48c2020c8c6aceb09ab55a926d5e221991428430b088b20598dcbd443232832422224cf9090a80999c7a89f433f4c50f124ffc40e12c2a9c8ca1095119436528a1b12e7d0447d4aade9609218b3c4e8b2717dbc4e4d3bf2ef26c59b98133d6a2f530296b3e8ba40b94c773eb228bf254b756ecaaff2856cefa9defbdd8859e0be93e50d5a2f5e0c81224436d2d097eccf116477ceb2d5abff19166aef8c287232e578b3a8fc67d5db65b89a399ba09123298ca70e5600229685c689ac660da62362c571966dba25a9dcee974ceef7a67860d25b78f5c0d25198bdc9e5d467ad0d57458ab614f81984d6dbd6066a90e101062b94b5d91658b1d7e39fefbc27de1beb8900497f558fa419f66901018114c245dcff51ed02dcd39bb55c9e35ca22658bf49a1ca505b94d8dbfba99f30cef99b42736922993ba6d2c4d14adf48be5b1cee7a08390dd1272257d1cb08cc8fd4c83775b5d84a734787d163cc2a6aa3986c435a5a4899e8ca4b6e400daf81ef837c4f81c8344fe5ac431910276338c2c818466328b9b8202aa2a34498248941248653bf60cc9827a630929e8ee88f112e308ac0782ae3e933901f080864a466a5d3cf34c9a7e9edb125a963a3c2f17a86a8b5d62aa7d3d945e8104dd3d4dedf5376eaa686758cba6a0f5121fab2e16d1acda514a3445a795b25a34396070934d44343f410ee21cad44df488aeda312c2f1db986a8100da2afef1b1a1a72ad00c263a74cfd31313149a61a86b0d323fa7d97c7d3a1efa3b6bab223629eb9d6229e007044ca5b8b268f19a988230178eb9bd763712de18857099400838594297489985a6bbd7992479694357ec479eb7289b75e7126810adefab7e4ad7bef48a4129c1173344009a4a126ae2d4b6468112788626b0e2290c04494f1d5b3a326967873f563f7b58aaf4844dc60f4d56db64ddd0f752888afd8fab0be1889b1394ba7c77810be7eb92ba3648a122c3708c5944c716448496c042a00b1a4a40b20158496104999ae8c5e896d1a2a6fede4412a8900f6d6dbf5226491062644b691921d0905c5c893525a6b6d254a7d299ca199acd43b0d6b476186f9f5254df333f46b91390d93396d43961842501ef1df681c74fb0cfde3acf9d622736a97e9332db616c9a342af7a8c18305eacf826244c4628500dbb89f369516cba847de0640c4a9c80f102230999ba1565fbd2b7a2dc33295545b65e613926501f75524f1b4ed89c3c351967f2d48425f41c75b6a24c7f86da0364be01648e0d9fa3ab38796daba595565aab05a9137db24ecf3c51273379a430aa449774cc64eb29bf6ec1ceb90c95023d3f9239d4fdb90b6af2a88aa437a1fa388fde8b9f312fd87c7a2798900a1b70bdf819e382f1c7a3fa68a4443cf50e1ca90d638b9982872dc4f450bb9ae480c482a7def1a74e943a5198cca14e614e79a44ed4a99337757aea488410947b86dbde0d7db2734939e8ca488b64e486f5518bd4c71c96671ed1d65affb99ea7516647cd534debd6b954388b64ce9469349350c2f3ba0c0c4d7120ab03459c1651a107bfb528c5a8c529472ddaec5b53ae97bb20933cc11b2d5acf204eaf2c0b9438accf10640e94b7d979b48e0cb717e4c92473cd79e1640c565e62573aa350f2f376ceafe79cf34eebd65a2c28161c754ed6306b9a38a4903a66986d51253b76c5624bb228e72862619c33a543928aa2fbf7e55cf47d2e242a8cf260b7b021dade03ba859faed3d3cde92967b41919519eed888a1f679435c13823a7ad4ace9ae60eae0989630ba9837b42e650a7463267883c72464f7d33a23c0d83e5cf45f1c7cd6886238bba165444e22029112bc5eb2079b420ba72cd1d163671507769413e04c128b5520cd156bdce84a44a4891ba85cd1dd9d3c4419dba164479e813623cb530091be229bd22f494a67ecc96640ef5322dd2cc296b6a91d2316b921486f3e74d14e98970ab2bf2a6183386081afaaa62a4e90a11a22b36c03a06548a10ba62435191e6f055ede029f68b4e9eda524b8d24f258b52c5b142f8f88cb4a749f9883be0d67f3957105ebbf3aaf87528ea31dfe6810875112e9a56be0248f386585ebb42ee348c963ad49c04bf77e988180a41ab13c561a366080687fb8bbbf5fbd33b106ddc7820d3a8c73630fcce4117fddcbe604b9060f073b747043c2d286854a67c991f2583de8a42aab168ff0d966e70be797f5e086d27ce5072c9d7f0902019e6c96f2511e2b88036673251cc019d939620949494a4a5c66d69522a961ad1f783dd5034a716a98002080a7dc45041b2fdd032f64e3d54baf60371ba857edaa7cbb1a68b028c256de13364410800e00bc748e881bf39512411e7108f57573268fb547cf11bf9e50109b624c4fe711ab7d7a3ddc00c258c794478c03e7fc7deea2c89a2fdc83bff4400679c40408ea845445373627050802238fd58397ce8dd065d747c0f325c4f79da1fea42474b5836e5eeee0965db493457d960e0fba9a35a6aa481e717e52a73c6ea3ca54990dcdbd837fcb22675511271c47bbc3584addde7b25186bedbcf25e6b6dadaa5aa59492524a697777eb349d61ed30febeee9e362fa90447a9e5e5ea65d5ba9f86e30cdf614d15f93e8d410c2c92dfe418c460bc6169cf51fc35fb5a29a55d6fd42c7bea17dbea9cd7d3dd466bf52c08e69c93ca7b9db22e9d5d6bad1a94c9e0386fe0b0c2a6b47691a758bbc8bc5dd5a2740dcae4e9b8c5fc72529ab95a25adf5de7b6ba594d6ec95b9f6da5a6bd55cdab95d8b6515d265aaefd3b67a2de6bc32da56b39a6badf55acc755e190f4b9e35f33a6bd5b86dd3327bc95cbfb6d6cc6b9d30d8b56450489cc471ae69ad813797a20b558a9a735a87bb70a4e135d5f7691d963ac2b983a250e36bea8e976da28f4f18176a21e6b84d7bade332ceb3365ece53e2a01fe86eab92af732994ddb814d8e3b3010cb28794a7739b95a2a65d97a207e6a62d4d58a5ce759dd763dd9b3b54ee58e917d549a9a3276c09d6e459dab33a795af0c70a7a2ef584101c1753923c28805053acf84c8eb179db658c278ce0a919a454f514c7a9e32a9e7aa6fe35d1c55377249e22393186d1d3536f297982de6e915f473c15a47ed8a1b3e20955840f1c97208f092642b07561eab0e8a0f9a880897be12d4bdbd22babb8cb8bae2413311f7c52006302063f3419b97af0b1c2c8a8071e7cae10322a010f3e312123293bf87081195d09f2d9f2649368c0c5899c7a896483183a10c94174caf825121120a62042048e75f9d571c660a8a4d7e1f74d27b80a562f05196cd76e3f417e8741ec6fa0abcfcbf4585a2f05d902cf1b94cf49aeadd7c33927bf10c1010636e09f1d7e248fcf3df2f8fe2087782d244a86915d24151f19327f21b9a03c124c2ff50e75ecf61ed12e7287b467465be6b1cb1ef398cb637bc563dfbae49a9caab42937e7061b80372d7c426e1ed0adeb1cf806fe8542a60e2598e2490e5a1414b49e68524b94d74f4bc890ee86d613940fc95460a5f544f331075d217b89969c280f8bae700aa6d43b35eea36db2461f1ead11c67e9fc84c3d63dbaae48cebaa64ef477f295bd5ebf1b9a17e9d83b0c6e80a7b06de50df20ac4c4d7485bd82c92f649fe82d7a7c891edfa1c7d7f5f8be1edfa0c76e63168be4c9fce6b1db29bd73d43b358edd26491ded1f76492d938d8faa1fad91063e5a2a1ebb7d519e2cb446f87fb42fb03ac99c6a46aeb06357961ac6e3ba4457d89f62c9a37db5973cd6a5c7d8ab1592875597a48e49231c3f3259cc58bd7c3351235532b74774855d7a12b86e8de80a3b8fa64979a444449cd68d9eda22d3f0b19f28914d980ac74c54c3f1c35b953c5aa3948fd5db3b98e11b0df0468bd81bbc115bc42e9f01a9b0fac6254fecfd243eb5881bcd63dfb6e4544d78420eab13c83d57ad95c730db84d43c1af2680f92c85928e4490b995f0f85c8319e285af282c9d5ca42ecae9634616e3fbd94134d049916b5883d1552a21631f64b947d70f619e00cf37f481d9b63f7a13ccd4457d8714e61e750a0fc0d94df4cd825b6fdf4f98de6b9d449af3095d22bdc44e66007e50e7a84c48167cf6d4bb6b676addfdced582cd11a69e196ecdf1b68034d9489e9e808069bb1212712a71165fa8d62fc7dce8302a13fcee7b6701cc2f43ee61005b14f30887dab5129bd6ac72115cafe45dbd712722c91bb27f2f4ab9467488d90c917d47ec8d2c49205f038ba99d685deb1dffe02d0b7cf97440193058c7c177d3b0cbd93999424795b6951ef8cd40895d23bd4c9b77737bd14ea1b6997af42fef68e873c9d47d3a3ad67fcc0c918b87079bd5e499cecbd768bead5722057f0c909f2250cf2acc19bad1952f08547af107f5459a194822d4a90b6cc0029055470607008b01553fcde9b44149a8e3a73ac00fa5a3b89134014e32c35e1a46f7e578a7c2c588a319d398382f602054f38bc709072c3d367003f9014b5010542568ee0f2d2ca112fa0f19b19194315463f473724f919ea19d8ae497ec65b6fa30204215d41f2d665116f2d75ba02e5c72e7aebba42c58f3de5ad9d6d9bacf0f58ebdd6553b640fca4f90c67333e90529c8a0797b7611dedfc673d36341f3ee6aafbcdced5a0be19194a6e0f670d8e099107c830078db610f9b947d04e9951dc149cebc1b49061a7d967111d2a29d209216a36fb083f71d72032579eb1f2c6951e2c7b9f401985cbd4738416925e8a5b74292d46225cb4b6f85ab85b20048567cca793427bd9e9437889de835b0bb3661fc04717ce6e998c9de09f4a3b802835f7e823bcf496e6eb2ceaa859f731bd24f5083e7384e7a0270411e7da83e9b1883a3086b7ae9e998495af2d33914cc043f4104fcf474ccc078a8f1bd42167a6d3d2d4b969fa0cd679e0928ef10b7e63ce8cd747933e705718338bc3d7f6bae037163253f41033cc7693ec1d9d1e95d97cf35d6b4c7a1750c66ae81a38f769486a588c14f90009f8155e6d010843eaa03471f5fd8655d9662ca4fb0009f819dccf911a47e56c1f80902e039e9ad90b578a73441f319de4cef97f3a078f47143eb13ec6e28b5b002cac151a565cb4f90f519a881a30534d087eafb06eaa8052f85ccfd2f289194927c8633e585207e82e14b6f85cc259682c84ff07b892d853d75bfa0449a22f617df5c9748515cffe0550f84f31b02998f0a479b4779d722762e93b351362080f01287a30fd5639fe1383c77935ef0d24b013b0daf711e3dbb098af017f452b8a10ccea3db6380e633ac1ecab9eb61efc0f92660e7c0f91c9e586250b68892dfddb44ba4242b2f91b018f113bce990019acb1645781b3fbdae459473d43be1b62009a416bc94621291b493a246218f8465e92798e3bb934851bc7e821fbcf452981b9a414db24703a2b1209ffed2d7c4f7216617cc300df0a6ebba5c3b1478a36929f046736d626d0678c339e79b731c5803e2c61c28df03b78e4e303ec1b994042848f593531e9b60687cf1aa1db2e73304c14249e6f56991bc0d225a1332c7e1a87aec5cf7dc8979b4e4d1b863b11853ac29e6147bdad1f2e29238a80d1b8f026de85c81478c375c446346b1a3182cb684029d9317dc41e6e040cd97ab45eb63b55e8af0e2c48b142f53bc24e96879519239f2b9bbfae9ad1e05ae1ed7a6a6a332f248e56533fcd16203c55c73fe0cd1bc0ba2a7855c665353513657d03c3b613e9a3e4a41f389a4458d869f6e83fc741cf167467dd84c14d8403a5e720fd11f5d6c8ca39e29682ea4458dca167dd864e7d10d94f35cd609c9951cc244b9e833922bed0a2800f05acef3681498f318942a787a097b89d465cb5ff1fa0f5e227591f29cd669e06c0a9bba145104d1b4ce659d06cea7a32b623bb449d64dd488af8e99acb92c0a421fb502ca37405f86d94def84ce35ce51e31606a13f9d73ebf54c07e14a96e102d3fd65389d66538b5665258f3e6cc2116716678fa45fb12c5bd4326e03c7efb7e975285be6e8e94cf753bb94d0b491dea12678eb5369168591517e7d7a5a389f269a89e425c99c4eca8c9b4b8f85e94e7a678e38484b5497d50ba2c29135def0e969e1db67e6bd834275a89a02c709e4538836f1b4931b37a68b3635925e59b7363d28cff7a1c2cc7edf2f160a3d2a6c003fca2d131bb7804af5d35b6cd15a950d68a4c84cd37a32db87b72ee50863f3f0d6fb8824c13a0ec71f8fa7d69a57c3006a3a923a2e3d821e71c32ecd91d4a185fdd2e9925d0852c1ce688777ce39a7ca6f03e970c9b8f2a0181cc37b7de2b468e7b401279a5e596fcda7b7de320686d2f374cb7a27e91eb3e9ad6b7367be756d86b66d87dd3d7dc020dd42d5622e7030c08035d1c2d0a2b52fc0d0a2d5c01c39509895434bbece594785e3073e47f3cf557ee3c60be78652bede8937faa5853e3e8e428b3a54e47b820a3e2dda51e543fccce96d816a5909bda3eda0dcde70b4c05f9f5c4d2da0455b82064e47813e7eb468bd877c9518294f01f58e9d28b7fea3772447bd9e6906956ac187ea512ffc0cc7394e478152f3f1f3c17a1cba4079a63c62593bc1348f8d4fb7311bf035f6ab815ab41bfc04259252166f2d90ccb17e25bf28400515578a145d314274a548100541ca6597edb89c2ca1c6a57fde0898e1d2bb1a0464976e933397dfdc9185aaf98df91167ee58491c7646e8a1386d0d88e92a4bbab2b2f581972cadcfa2deb961c01c737c367f1cef4b691e969559e6371bb54ddbfcef78b9ab6930f40ee79b11a9a3bab5ae0f2ffcca34c47963b264075b953c30d0150c94a731ced7fbfbfa0556c03b08a88786fdea320fe319b628c5021c8a88690103072db67001c5481364c8c08829a264b1c1c9ac4c492c0bc5124058e9258ba6af8edd71b22c82b8588a135e9d91c5ebeb972f6fad95ec3858108de0d3996441c4054b5d50b9610cfa848932342c8ce044d1b26035ab0373c60757181c7c180a134410511813bcc244e941284cd21108588185b102041038620af365070854390ab3050f548ec28c910304a8307d354b61352bca8f1850641a2f917ed26071430f4d727d897403098c18d1e58627696e90f2c31d01ca4285e3acfc7047b63280b250e1b828595c2e233680968881c2868d0fc9880d20d7123150d8b00145cc754ea65259a5d539314c9a74680919c215910255a69794e9ced6789d3dafabf1e6161d949ca0256488a6248a2459e4eebcc65acf7377eebc1a8bf20e47cf6f4620ed27b40ca3e75c8327c8cf35ed1c38c2f039e49c07f57cc2c42c91f97bcdfcbdb79f832a79ec180338bf01e3faf5eb9cedbae92fd3df8ec9ce42f2d0eb5507c943c306d3abebb5c7f8f0372cf3d7c72ac46da1d650c8e4c23485a92564c846054a4b0317326446085ad587cc2f925a4f524ebd86d6061b803588aeae6b0056a126e13a05ebab48f63ce5637dd5787b69bf28cf34fcfb824638662eb0163f4ed88b0bc7d48c70acae26e1067dcd8bf2b417b9ba391c5bcc5fe75ef5f51de34290abd39ee1f811c9f56738ba9099b40488574bc8900d8a0fad27d387cc145cd17a9272ffa8e4b1632160c1b9b763134657d72f1ef353afc92e6174c6955e082687b94e5dbde3f9756aa4773abfde31a963fbeb0d46eab87fc3f1eb2ffee6e6e2efd85ab080f29b145232749e72947b9ed2209c4abdea6eead407369816af7b6037b578bd03fbcced588bb7c77419b09d5abcd733a516efd2bd1e02963aa4c2827389b1c1b9c46c6564e1b632b2282063b744327669e7c4d22b9808902035408310960e175abcb5928ab7d60f80c3ddd039af013318c4aa5a5ce13a0e715ab4dfa7815fd6b44e2a2053df52b9e67a0d28e50afc361c9c3983d8e7401c15c7398fc6a07dae3b2e03f33b9f5e0fc63d1e8a0b551d289f66dbd488641a9e401dd72fa13bb9a32345b9430089a50e96ccb1ae52b1b20b6bae098ec894295b1954a8e08cd475b5495bd21fab4d8b99579f4b9e04a84fd8e80e4a1ded46fc0cfd33f45b2d896cadcd42ae660244965afc2f43418380b250e1a86099b2f9b724872046bea68750648ae937edf480861afc1cbda0a14dca921d9c704438224b2ce162441811652b632b830922b62a990a9d9146738a06e40fa9c3c65b0f2275c8ef495e328738e21979b528640119968c028f164340ca4b4b34bcd1ac07c92fa985eb47ac85ebabedb14e85c821189169add685fe9ac81ab6529cf81a560a2583415ab4aedc2f5d79cb001089c37a0d7fc81ceb1c9c208ffe35ab2e843e43e41fd631ce4ed65a4b438bd67f380d3fc21fd4696302280b150e0cb7440c1436c2d8b8a19ebd06fbdc504f79f69b94d7f80cf73e2a2160e11a8950074dc941720688025d59af01adb5b65abfd5390faad6bab5d67a2a64512c99456dcedfe7f54bf6f10305f6a02b6b9d26e5ead662c0ba0fa9a3bf71fe7c9664787f41ef258ebd55b060fbe284c8921e63230c14ce35440c60c6bc9a7208ba612c81a523de709c4f6593f9d8f5681fcdc3d2116f388e6c1a6dbae9e9e441f274109d403c6da78e01c993e94aeae09eba0fa9a37ef3279341bd83b2b0837c64ce03e48a3a8bae288bf53d2da8d32b8aa3e4116f3fe69f8eb73272ff985fdab6211199f66811ca8f1e48799447d80c182eef4aac0d883c666fcf9e045269d2a449d3aa2d64978b490d6d5a3b22fbc8829247dcdd587032862f498a94c6a83f5e8620f535ef3a07727da401871ba8f116a494524a432099b7822c3d0c643e760e879e0aa31602b93ee2e93ed7418c7f8621902c6442bf7012a79b2a2ddc5c7aee398f6ea9bc0b8b741de6b6ceafd7aef39f1a5a5df893726f0b81648e352628cfc0142acca173da85120cdbb9e7cdeadd9c5e89d0ac67f7a4938657c88bb195d01b88b73072b0bc9e59adb5f3a66a5eb34c63d54bfdc3517553de58a73818cf6ffab8f1d3592de668517a074359ceb00653a6dead754dd7a0647052aee44803f5ea3fd64720c058c38fd22509928451c88fb2a6907f86e38f9febd47f6ca5610e5feb877aed1bfe50ff09c71f6f4306d4fc0ca524806cd51426fee9429e4caf610ea96d812438e2f086d9e29c7399b3b9901a5a5bbb0c41ea03c97cd47c03f4997460f3bb85456a70b58a081992a64a165d80310619695a9bffd4d0dac29fceb9300492b9740b32d9864cd7d150d0cb08111b5a45649ad6ab466b0b73d8fc670b2f38fe781b6e60e4f0b57e36e79c8639e0d60fa62be943648c888c1f2e63ba94f1a4f5f3a47d0ba9cb1b1287d21e8e887ecc4743eea4fd907d74169625260fec4157ed1d8893701044a6432d8a7d5d903af0b7bf30a50ecebb8af1dc4490a7cdb6853917b528851aa1c92315a2453b45429489cc69bf61ca54c85f680474deee0215ea9d9132f9f6a644dfde4e2813a9c33bf0463b42f57dde8114a8574d5f1f6c91c7a654322dea1d3a4a399dfab0348221db4969b13da66971a38ad3b7d6a12cd6b7731ca5aea72727a7a69cf4a8348d1656410b99220800000100c314000028100c08c5429148200fe464df0314000b85903a72549bcb836910a3200a32c0184208008000000800801087aaa60800c804c07847778a62af42045c3eefb1395633e29e034b5cdf2546325fbc9c514f576782761573019d19b546730653acc2cc978365d94273680b7ab0d6ba402a841a45626b2a7826cc0148433ad8c14b87bdb74671d85c2fc8e1cd5df4eff07fc2f3af20fe69ede617637829b6f1ac2acea81d7b731e23d615868225d8d30e4a2fd73a9ee00fdb3bb0379f2c623787d6ff0e60bde4e2429651c41054f1b8e5eb177d93487f1a85c27fffeb02c5ee47001de08d4d4e3da1a43b78d0cd36823dfcfd63ab1559e12971e51e16ad1d9aac40d1b8a1d5c36535fd152cdc1dd743a6d1e713dd022c657f81aa1b1ddbb6ffcae518ad2be036bceaf2921aa2705002f800c7774a43b0ce527d08b6496bed3e58b2761805597beb0c54416617d55f1b56af38d66223fbd0a748bfc1abad4d37eb1cb6c53d2572046012dbc8ad1bb71d254c3a3cb7c2e3dafb5f5a980f5c0bcf895fafada1b01c51473e5f878fa12557bf4d03819c452e6f12e2930139c8d49e428e443fa2428e924dc486bc24fa881878a5eb7e4cac4db4c33e138c559a01664d15c9de976c24c17b5706157cccb889fe8b74a68fdc3dc5d1e105186a265886585229a734336ddc1636a4af7ccaaca6ddc215b168432cb21f5cc0beff97ed10668377117741ea4e0f3bd6094655b7986652629084ecb289add5684280d798e06fe7c76f2dd87b0b80c6d881dede7223cf0df9aabd8beb883623568337f4eabd45978e1e8874268ec27d758f2532d17ba33b412f940e2c3aa0f4ddacc85d4d89299fdb772c99897e86f4d6737bd32d3df748eec647ee3edc273419315e634e5a6c633eb08a285b4d240cd05aab26cd03c1faa733e8e2ddf046250cc643a48e2f4b14500262a0095c55191d8b7e95851ca50daefed250b591c12e1f27cea70f3844a68eaa475d344ce97aef58357f5a422136c8d1fe0da71686bef4fecd995dd063a9faef2bda19214a5b53976c43765fec464fd51921955d1cb6be50b676617246b8478ca199345ed4fe1a90006ac71abdd7e67b3b1780ddfa7087d73d18fc125f72379742ea53aa3087501ed05505f77d03e141d17fdca58a194ae6d0c3040397839e50c2346a68db07d05c2dfa9d7f84c1cf3973f67a0f7a382238e01e438756988ad898382dec85da89415f9d93bad46179f09ec8ef6e037a8ac7145f753d6528ebfe58bb482feed01572e5f6413e4f7eb147d9e7570bc205523acbbe61a3cb0387a5b206768dc06055259084c297f7d579bb1dc111afb5defbbf1d15ee906a5e81033acca506cb4a6e9468ed0563273e2d88d221c33e56bdb1c7160e48a876ce33926373eaf2aa82588be50b23e6366c5704446ae843ca862cdfec095680aab539b47e3f445bdf47b92032a3487f5b76d1e2202c3282bc794d2f216d7b16bf4593d654868899018f277eae3f8faba52e7c31aeaae28fdd02f09d4032d3c3b7b30e9411460b3cab5d78d182d63484b6cb23b69315305a9d9a496b9899c4defdcca32ab49c06efa833c6e110e30e0e8acc1ba2ea4561595cef8a4bb8bc6a5520ef01a4ff440c6bfd79a6d175045316452ce210924922315e8d66b83a70966a8f2962788b7730a48439c0c57b50a3163d96adcaf00e8c58928bf5e783eee9f7b9533683224120d8c6fbce093b5cf4e17bd49cd8ec0dc92480420e5ea6fa84c455798b19cccaf848dce911cba782654134648acd0024ba76416ea60957934c9b2586926a42e08bcc6a3915093a968ed2eaf9561160d5b5a798c41377d03a62ebd9ea92c56e65eaa1e918bb67ad93c4d8c0b7e91209736a37da56e81c540a097037024cb036586efa74a4262ca2d657bba891bea062f9026b07ffcb72aaee241b57c1d563027cdfcda26064625d9adcb55825ca7cd8ab0de4595c62f72e236d5595f588094b439dd8b73177fafc8b8518787ffe52df8a56d030a1819e651fcdea99b504db92a225d1202c6c09f9a13c11231a443ff9b99efa069efd92979f4f702dc291b11f316fdc25965832d7605c31193a2947ff72dc8dd500b70802f66daea38bda1eb816f1d2eb0a28fc2411f77a7d5445cd181120e65663e9ec3d12b9b088f9a365f215c0ced12e609c478f0f8bd0fa58d2f5dfecff35d7e121921b90809b93198aa87ba951c80be1f90036629d5b15c67cebf3d496f120e9df73c60bb3b831906e7825194d91319d9ba2b65720eec3e7e3292168157621f2796903e8cb0cd5ad2b5f85f5a1fdcaa42772ee681b7c3a0209ed17218475fa3928b0401e2bad58841677bc944569126e3f1d148abec182d675042ec67a6f1be04dc4716bf184b398c903621717c280132166226e5f549901c16d963e80b4d295543bcb52fbd3e57f548ddfa59c460ddc5a1efce7908f3af2647087f57258507ea2661a66c937bb28509516795888da0695c34e116d433e305ec12cf9d6912e881c2f8a76b1e2e4ecf4742f3118656312552ce3da13a8f37b4e846503f51520ce9d76b10f2419ee8d88b5e4715bad2ddaf1ad1ae58436353cf49b1a719577186b4bd0c48403564039398b9bd6054b8bf13732349794951afcc2adc2265cc215a8e7c17a2516c9a325940469611fc5ea0aed01c03d8d035ddf7fde924dd6b32b8866256f35fca8886f5a4153c445366f61c0bb452a2ff470b0c4f1ed6dd9bd229998be2910743241261156fbb9feda06160c6201a02782ca826232e4f799922bec0f2794a16588fa930952dc4b3cde1ac6a174df06ff9eaf4e46c7caa56040a429ce1a79f15828970cf01a5c806fd636ead0e9df1953890bde4c8fa4639c05db3e0fc9bc0078c67e52683aba9d5528ec84864fbf4e42879d1ac22c28f0977d2c5cc565455db7c7a7fb5160ce50a67a58ad1e6ef4eae88de23df15a9043b9b5297179c238abd060b40798bca8731db0557b35b51c8304a9d7fb63017622a05e2b0ef967f29d1dda46d5b740d2b9f72b4b4f3ec7829eef860d9217b54045dce60b23d4bc8921e5f33caf44bbbe4c05b55fd24d3c00a7f2fff1bfc02e6c2ccd077a2cd8fffbdf1d54245da179e3a1269fee5b49c77123fea85bba483f55a507b8d50f512c4566c2787a59514b02af6c508fcb0082fed5dd2a26b356ba7ef692c9dd18b6e59500b7524c2cb0722b25d082593da662e301b0d6c39769bfaea7f3ab1244e95c9fce51f95c75b11e383cc210e55194832dc2c4b5bc9a977ff0e205beccea0a7bb4ebd82d1bc3a9fd819da5cd48f959ce2c7298ca44bfa02023e4de912c2ba61389de414c837c8ce7bd587017ae64da958b875084bb77c306b8a0c8520dfddce7e072cc0eed5e62364336c02a841efe26f0bfbc79ca321c8eb8ac8935678c599cc85c898673ca03fa93d052917a94364561bd32d3cefd43de8c5656b538d2e151e9bf018f170ebf7f2a8b5a31a79bf049a3fbc9b00e45dce6d81b8d9b4f45e4053b6c741a8a3e1bb364ec15b7718d488fc3c59449992aaf97a1e24d108166cc200a653607ba74325e1b8f0ec9cb25a87c15b4188aa8fd4673e0d68c56067ed2ea874065176af3ed165484b2fc8b0d2f78c80d7aba42ef9d66e3619d3da9d10bb6562604d5adc509b5dad6be2c0205cc915c8f099118c4d0b0bdec8dfda7d266da81ae89f8a6eb30c3e515b8bd846d985c463fad024185eef147a81aaa23b4b761955b027711d49655df8854ec2ccb62206a45f8763634ff0374b5e02737791f02bb47edfb037296d897de719e91d50b92b27ec7d44debbb2776cef3d762408c1466ccdd991d906cb0586f0947fab9987aba1ed5b7beb899f20401f53a79c084d4abeacd3777a60c137220248aeec16e8db96666627e3c4f1b8a5edaaac1535925a8b17ab9595336c800c368f078dd7c497526858b2f330c953a18d1f199550d5b13b709f66255c42c90748c4d884dd8934a82d7c832674990e2c530523a1d9b70f7dad0da3190be9e8486735baab7af0c6a39cbf1f98f67fecfd9fcd81dc4d9d396b7d5862fb0effae3052bb49f27c3c06e46b2bb92977d4be43a32d513c89ef0644447d1697a3ead73d57eaba307b29d884289744de4937cb65864650997a207f7ac5d11c3553e3ca3005e683cb74e79be7b787c31d6bc2bc6fe1025d57cb72623819ae8eca69232971d645c381841b72de279ee4e7bb7f543841c264b85501bc492424bf1ab2184b7d2f4fe1d48450bac1e91512e1e6e117069f66298d3debb42b8999a261bc135446fa74d27219a5fbe8f45696577c87f6f7096c059546712b1fe7156b03d4428cb242d2b56290caccd8927aa18ab3f7db81bd0a6efc765266b76b4090cb6420f68aab7c5db9a54d8c326602dc6a0c27aa7689e159a148f494829b82bd2ae450757536e95c89b6b4da68e897fa20d4e737aa559493b19ad5675a451d27c785f034d5f3151cba0305840c72ea9cf0c6c3369a9abc998f035696f40605549c942c8c26df2591d8eeaf429fffe619f4f9afb78a10e57cf8e12b4298b459565b6f2ab3f7d5c13cb07ca53ebecf431881471fd49b0a6e0371c7266f4bd1529b546855c5406713d2373ae3a294c82ec1034012c956c95889f36afe71b77ff65bb7c0b05071e5f398d55c13537015f0b2f2f4d3c72bdb337addd708a41eaed5b626d09b49ce479e5be7676bd72ecbaf154a11d448ce1571091657c91cf73dd66c58160b61510851c17d90a9ccd9ffc435888c1f364dba51b11f65404ec8bbcdc945cf7b3d3ca1e758a130681879002bd0332d1149fd31bc9d1f2611754cc59d788b2b4bb40215abd0ca033e579292ea907f6b0f30dcc8540fd0ac55475698fe9fc28286208ab0d0fa1bbf09493889ee0ab19d4f7902815334182359be35cce0ba28918a8dba75202a470349f3cf4a8d00b9b765ec78bbca9679179bc57008ad28b77119b8ae8f0889d582318fa6ac6df0924af10399ca8f6c8047a88b651e3892d22d76e0166603796fd69522a3cb88c59ce36312830d16a88e35a43aae866d58d4c78b4c6f116de4fde286a8d9f2d8eef7d70cf9b28633e3760f046d331d15cb4aaaa766d4ee566fd6e0b1c15b29a870f6c335b3de247e267cd5020fb3c365dab1309af01107d8d4d69ef6824ef12d4b3bc5aac83bef9c636a27113e5bd09531089f5e514c09cbe9d80f8544dcf7bb2fa0f4f65548c2a827812dd36c1f49f2a85ba0337b1e278c26358b274335a3f9e632a2f75accb2bff78f45d8f3c142d34746abde7fb592668e568db0224aa35522c4fe6291670f0e0c7ec1b4e829bda17edc6cca97df589ff45b0aea3e9a6f70bd088d6c0959741423f87f3ec210c7fb93f79e393337d8e59f68ac40b652ef684322aeaea11affcc733676310be2860d8aa0183562eb00b198ec628ecca18edc841e533fa1a31b7a98dae68d094a3396b319997e289ef389d09c251f23296332eb3750fbe3c0bc9ca3b30c10aac1af8a89140feb4560004e758844d71fc26693e5020a5d35da4648213283be0862223c3bacca945e27a0dbb90939ce7d91d5e2ce1e6d2097a28c9a3237d32580e3183187961661ff6771d74aecd538be3c0891d26f0bbd9693dabdb1ce18135f2d7db42833d7a390166c48968397abf9c058ce251b279ee9ffc4c7709ccb077c0d21d4c915ad87c9143300c3c36b277eac6c2929d903beb9d1ca6251aeee830fed76d63844d7b73805b8846ddc7be2d377dd8883064528f0d05219905a70b370113a01227cc8fd4463360be2c62f5093bd1f7881d51fa7b71c69fb1bb1f6ebf00504dd41594d168ee702d81b9c6441d31f97d587ed7abc3b70c382eda4e9d3f64e86010196b8613090d3ea64e7036fb9ab876d5390daada4c74c0dc4fe89e2ec0735d3cedc3754d7b922a6d40410e51a47022c6477f036564555ba430978216ea1681fcc3ea06efa7d32ce98ab73f4823771e2c9f022cc84143aa1bc3913f9b1867c4fd3a27c6eb1d9290cfd457907655d44addcd3ad2726dd351e98a0c2bc831745e3ddff79b9d228ad638ce92273290bdaf47eb54b2d457c6df2226981c5b41cddb291e14d48058de736720fa7151ea79a6bbdb90f3779159bbd577b011680c7a1fe3db4fb5bbcb2ca2b7008ea0d1c22970fd6bae591564070006488eb5cd0bdd12f3a477125293a1fc7515329b1c1be54f53999e874f522b4633c6276e5d27e02bcad0b75c2f4bca4529a44b8ad2231b608b280bb7d9d1771d1baffedc9dcd906edaa43dbf43bac2652cc1c78586e520da1574b3161e043e755680380a511748d8d6c7078d2cc0bb699d6b2ed7e2e4d6a2508536462894188f06f570c60f182a92882b643350c22b85eae96ec9cf1300cf7acb00e1aa2e29a3872975be0ad3f104a126e5d37e640e53bfe7aaae15e74393cbd9984c99b293e9ea4636423e811dcbc585e6a6be97db4f9e187887568ebe04ba8e47375044fe5fac39b7446dbb1b0b196530896fc00c0b012fdbe40d13e5f2172b2dc3af6cfbdd62acd0b13174e13cc126ca5b44c341cc43d9ffda0d0cafd4b8a54ca125724f653e4864d51a797b63037f48c261745311bf8d27c410b60228c13afb6c184965469f25ce033550bbb03ce70d5cf28a2f219f7a30ad2cd72ac3ee52dc9b56a0fb3e5d2bcd8120c1260649621968891b1f1de6a626e14d7bb2f8389faa8a9e97838cc2a67c23bdeb028f6862f1fde349915ac1e69d419e5740f5971f559a4be3a2da91338831fa8dda71568e160f06021dd75dcc772b6802c70aaa5588087ff01d5795baedace066395bf32e13dc7477559200d799c4c717f28a21b82945a1a4c4a077e89a149b94d891d2a377a66d6eeb3aa92dc1ecb576ed1241a96814a46da8ccafbcb081b5736d4e90a666c3368ba6792bef17b6e02e5840dafbbaef7df9df9d84fd950d4f0ab930e0d735d93dbc923f4f19341e447b2ce22fb27ceaeccc67dd6faba4550c78b61925cd7d2fd789e7e41fe6bdc7e451032a442f547a4e64ff4dcea090dfbe5eb2ed04f5427df0d8808ae5bb2e9fa79626f4e2c2a6ec2485e54f251424747308560e11a24343e02eff07ec4961221f799614b8713908596d8a400bf91e5d741db91bf1890c3856a7bba7876e1f6d3501850eaf899c0eb76b50fa51b65876989b8634215a663cc54439d5d27a4999d4fe8270a00a2b30046aec809dddd8368885324c129f3a3ecb8cec18db0f046de988643a34a533b52b5dd140b9df3897c8c0aea401f30ff0892df608b26c5e7eb3b17913026dbfe757a3e7fd88bef645700ce3947c6868e369e8e60eeaf4e746c6e3f409cd6fbb0beb404188aaa6f4c5eae5e8ff89312f6a7d8063c3e008fc34cd74f97e52431d42857dc5f7bf86e214f78389e2464658786b5889d33c91ab278d2add0122ec450ce51ec529e307fb46aa7f96e98f925119ef3bc7d836346338d18bf4859e9d67f907748675be65321a46f3312877a34ffeb3ae7500429de8bc423ea758a55279402155d106a446566f0d684d50b77cc97b4034ecfd11a059e4e91e5cd40a7a78276330ead47a3a32c7886b4e3ab94d2978ca64adde5453ebd46df2f766582a6ae39377da521439479d4e70f03bb70b101a21f8eaa988843762525236d4212d1d31785f3b7f16911f897a0b0d6c4acb63fe03feffdfbe821c0d908bdb83813558b9db6253abec82205adcfe71e401e0897f30f3fd192e534f26736359ab24a959baaee44c446eca96a1729e4b900624533c710c1a95314fb106f15729dd62b74b7345dc242ac46ad0114bff663fc011cc2c16dd093413758ad1246c435c796d434123d5798baff894a6c60626b60750c505840776e32000f44d18748ec3b38dc2a4ef87e1ee4f130e2768b38d45eee75eee9d7faa68889bf22295914c9b43eb80ca335ef4a09e841cb00b2ac34573b342d4722eaf837091d6b4220e1263290f006c2500534ca478a29504aecda8bc7e1090fd63d81a9815af311f338f49bffae5f206385e2bd2ab9d6ccea77fb1b1263ecb428dda194dd756b5fb13ce1ae19532d41669cca28711eb44c86718bfae91a382a1e8ca4e1e502e8686533c04aa4734cc189df5c12594c96eee18d21706858c350a3129a873f7c936755e8ab373a35d90b2ef271673359fba688050318a9644a66737e2b66603097e4005e783656d71eab1b5c79c7dd21453cecaf9e417534333e3c4953dec02c44da472495a0086e29a017e0c5fbdfaee1948d5e4ead29c78c52eaf14fafdf09ec09c7a53a6a8773cae0be90d2b75c3be34dc3c36b6df59dc148c0163f3480746fa027a32c953d04996d1c8beaa2fed6c835c9a56675d1f2a24e731d8cdfc809f20744cc0c56fb7e0139769bd057ae106d0487954bbe51579cc42b303df1f07e42ca58a41714cac5d669e43457c7c387d3fc83975088198b395fd3b4965c42c7b0d20e2d5b231d03ac30961d6b9fa1d12e73b7078799f8412ca3021b4045e3a6b34c976b281e327155f67e5d76489d4243eba0150d3fc9af300926debb7d394b6b121adcbc2a2351465ad06b497059430d46f970d0475cf3c8d605c16094316cdb2c6f7f6a6141f4d5ae01ea3f476502bb9fa2bc04fef37625d89614c480a3732cb6643b984549bf623d33b5ba9fd50a77e8f86edbbc83316810b0ce86f4cd2170aeb9d611ec3d8c718a83c7a20b79dde15dadb7530ded64d4b5dcf38fce242582329f9d6b2d70e7f78add99abfe700b3c0741d6ccd0cb5a8a5e913724fc3a89ba16547d2b3ee0c48e36c1a5dda14e740b8955e03debb344bfccb25c1888524de63c6804b546c419fecb95ea41ae7324275ace92a99695afd356abf5c32d432ae104654a61ceae1cb409c5ec0c6e13a513ea6e67de8101046365b749c25d29e4fb1e193c224dc03ec48d9aad7d9687478395062766f1964e7f75243c98db05269174f145149f816113382d8bf337d028b2ed03b98449e48f1c28f3dd3669d9c17a8a27fcd18d28abdbd3a5057f054a8746ee9fa172a9467a1e7941aefa9f38790b2878f2b85c4ac240b06d9019761ce37d8782db30fc6a6ed3094223a3b96efd290ccd85702a4ecb8dfe069aeee384281f705c1a1710fe9060439b05df3c3f7673f38b24fbb9cccb87ad2e5dc84a75dc77f2bb03a4bb700ffa82a017d09b48e6e1373015469c09357e0894aa22d3a0eb5ecfb078acb222d004e8e1b3f46652b419bedf149815b8cd143402f70220a76046c1c3cdfc8b28ed911a6ce754c718c20fed989007d07389648f2e4f85aad282f0ec26cfd5afdd8478320cdea21884a44e618d514eded2d18e5f51b7c7cbbbeac558751ea844d937d7f1c7664dd10408aa2b23bf87dc57f8f4cb64f04bb2108e6899ef2f7b2e449f3e429669dbd69c5ff705ec8d616781a512a602469f1880c6ac596237d602ce35fdc4d9021269a97fb8074c890fd117dbc587d5ac360906cc07f799d3f17abdd6496cc8a9ebaf5b8c2231097ceef6409e63f2a25cbe306f79b00ea9bab38bfaa9bae97b2a14f6a50fb2156c9331c6dfd2950524d1c0108dcf44aba1002ea6a1ea530eab216c731131b482f52ea75415fe8eabf4f11ada7036dd8081523a17b6010b5ea8ef0795bddeac1e7f42d710371f00d881eecc0d7e8e0900f02927764ca33070ebd12a841d6d3495b380a2fbc346423cc4b11a2fa1021bf567c3a8e3e9ac87f02cc16098bea6ede1074c527dadc29a80ed57ce3eb684659039462ceef603a9ec1dfcbc26832f5e3a27c3b7b8e02b297e8881d9a528a02d01fed9b3c1f8792a5f0570c8e261a5a29713bda9bc0fa4c9b5af332d0bc0988a883f9f1dd4b1e0238b7aa34aaee15f23a90849e7be6af8919888128abd00afa80e839852b88bfa0298f878e0a62a39af6140ea1cda4d37c8baabaf07498239a04deeeb59b8b7f8e43fac96c7e3e11ac7d6fb613d26643189e8c068cba9ac075ffbfd3ffefa4c8f26eb34bc914384b07aba06eb957a21a02402ec0b4ca122d3d00de6c16bd64b04d98ada1ca2c71bf3fda34c0cb603558337619a531f4e786224777da08fe0e54e083ea0f6a48c019fcce2edc4732b16aa203c2dc77eb7ff6b7047b524dd9bdb88b01fab841b4c3cad0ce22e7c8870d31bce93967f09583e635de14fbb8a10fe95aa6101dbc5c4c3b1a7a2722cee3b0e94bdf39ee8dd9608e6e22e92c6e2262907f72f0a5a2b7af8908ea9aa924e41d13cbba7cf1ed1841aec16051a2faed66cf96713f9b05e502dcc5722485ac11dbc3889a08112c5f6b8e72dd57905ecf8891d98ff4fa615b4fca0fe93f56a21e7831d0a3eb363d5ea20b2120942b434bf4c3586b3924d375442c59411d8f91790a16ba8f2bf8322b8631628b3cb201b08dc02eb2f54fc6721cb2beb47ff5f62d01ad019177dcf94bde373d58991cad74b0b37db45e97f03765eb7f06e8641305519801e46dd422aff8c65dd78ce8dc2ae80552e658876613ae24e1e082943fc6ec1f53ebf60bf8acde3e5f9ccba39f2e443c190286bb4b526e5fc38c69be2abd470f15e3505e9f9446dab80712ef019abbfdc16a3d5b818225313471c0b45314fd9706126bc85c3bae0b9f7aecfc80c7ab898fb4456797e9a748e94dd08ceff58f18441e8bd41df47a7022239ffacad6a79325f9421d08f4c81c621fdee3bd9185c78f1768aae42f9d6e74c5d4b33fe454a754ccbd5feae7efb687004e569d79af6cc538eda04341dcdc4c140e22ac17b5270cd37b712b6195f3c0c6c299984e78aaf3be5d8dbd785e18b0b58de4ec46038d545227615983a5ba217ab7a0d400b1624d9fa254b7d8e092f06646c9ea557de72b8dcecda8267603759dc58a7ee097566048cfa4580f790b0e9c2a8de1fc05b48ffaa20600a10388a77d44b4829569202fbe10e6e54dc0d4c39642b6b0f3253ef7dc764c896d897a0ac5ce077d7f2aecb22416ec44e3fcae0cf99f77ecf9e3aa85eb7a50a1bc5a279c40a45cd0732a99fa967fc870cde5cd9865a89362bd5af786349e737b70fe5c54f52bfdf90f829a78072007880b2df682906e611ddbab939104299c0bb78c182642f8909a93e58d3d56002a9242259e0a06a674af7854203f2ff8c55b8f3c911a140630ba6832e7ced3799fa6e2e4f7cb6b2efc26327e028aeb52865b8328bf2745145bd868b7b5fe7bb1c03bda037be8b13faaa9c9da5db6fcf055e7f0fd59ddf66006a1e2b33a815bfc0d1ee7df62545f359ae0a07e001ac56b59a019674b2e0edaf2567a35abb0b40c612f65c21af620c1a8783a09cda88c01c908f688c893cc0e90f70bafdb3a80c7dbfcc574e0a0eefa05637be9d9cfc8856527a829b0207d17ad486c881e0c8074e8e807734523d403e0c4e7dc0a0bb3eb84aaf01df34d2c00069a8d3646224a7f4bce96804ca74d02069812c538bc4772b01b63d1895fb7e7a0771ca22e6efa73d2516251da333310f095608b9b9c9a0f8d8b808268e3d710218289a1293df318ba543521561fb57ccd98eef73e7565c362319d07b57a5c67df699719a4ab70e51235c18d59dcc014df08b1d75653369dc16b7102f4cb534fa828efaef19eec0df9f10389cbb233c06631ff5eb4e25547b21bc5d25e09aefc978e98a5af91dd5a748431d774b0a1d38423d271da3a9e1731f858cfbb6286c152241a667b723024f135d2a9436a035c5633b420f38175f6ecffe8ad869a56c14c78f89712fd35c5357f71bfbdac3104642b5a62f134e7fc8e9f047dd925b4d0e9a709172ca6cd3c344dccf0b5d17f7f882e2b5c81c570bf855cda92d1d97bfe2f103ee264332660fa57807a58f9ab6530c7b6b984bbc3a7daacce621642513e85f37dbcd421e6adf5ae764b9b64c2fdc47187192c68f16f615ca7edf987d117739dc7920de9d2b7f917034b37444f488161133bcb609a6b586cb32d41817cb502f42c96ef625ef6ba7045cb4c8d1c10f8cee86805e63056848534e04b01889d5e7614c1c1d87f9194044906db2bbbcc96d88cbcac930bb02a56de121a107b51eb67c86d66db7b59879ed79faf887449a34573f4bd38525acd4a355852e0e6328aeff41343a7bd285a9515cccf7d27636e3a0f0e755eee1bf5d4c8a716e9212a7d36bd7250d6255d7868f75ceb2510d8a36a14d2abf7abc0bcf2e33585cc2bff3784b890f78fea584dbd84d886ceb93d8a1cf6829147f22daa19d85d5a006e01753f484a99461619a567f1729f286b51e8d3d4205be768d22ca07375905853e5cb8c5a4b3532625f0bb4a1563df02ad233fe0f1e3e88a791ec4e0c07e1d621a9f052c963aa6dde02df6722649340088c26c83ebeb53c49473d0822443767526aa422afce8852fac6080dd90ed81b0290d3f1d8b8e141ac258c26dc469736855636f63e0f251fa4184678bb039ce0aaf5247a5aec47d93d17344b0d701a1168df0926e7551c847111ea00f37ec79d0ab674b5c01a2762198df803b0998561ff956a8114ddeac273b53c808c5774c632e26a1344608e71cd720d901db9334eb6e36e4c27773d9cd0a40de072cf3bd71afef9b1bff0d01737a8dab3ef9dc8cfc89956dd50e5eea663b7e266ff042b22ce2add235ea5628469ad7b50eb988cf020d80fddf977df93f1031f74994cdb4d88c3310197406d0fc1379e3b91421596465040bd500e275b5ef1f77b4bb105afc2c4684e0c6d6abf6227f48e8057c184bf7313933141581e95489902f6f0ea86c643d9ba018febc98694093300f851d8ff52817f69c805c1fe3535bd9ddbbfc400e3c217543950a5c3bc99838e114fd55ea9200b228bac4e9d20d87c15564f00d143d1e00a45954053da15242bfdef7ca2cd69ff60fea8896ff9a4616d6ae84d9408ab8733a87a5e3d642e6bc92e16ef57243a359e83c51d5adf6cf5f51636c9fa8ecac699b2ce78669db8ebe04f43f38bb53adfece5ef666251bd4795bd689716086815ef76c0d8d228343c097efdd4632555de08c69e98e2f91738776ef88d203adf3552b503fd4381385f9f7e7340bc8381da712fb952709199bf570b45069903c77dcb608526e8882724dd1a459affae4d999a1267be00a1f2042ddd899a028be5331860f9b39d001ff509e243d9e636346ad4189c4fd9351d06d4ba128c1c4e91df7f96fd71859cd07c8d378927d0d1040a31184a141722cf8e96d72cadbec660c178944a7106cc3a1b97c824c741f33d137503c1e55575d538db5032717969c7fdcf89d5faa692fe9016f1c7b7477185a06ec6ed03a660b36ec115825628b22f8621fe895c04e36d6f97fb523295d70a2eb1ec2a1c5f8ec2fe9dcad70094b63b890b05bcd173407f092dc8373f25c1420ccde3bc5084c70d5eaf2b2b1995745e4cfec75fa6b882fd09c31e5d36e2a57056efa4d475bc18f007891f83337fd5a9cf262daefb57e56d830562622265b29067fcc42e64867fc71501cfad996841e60f10244b41ee01622fbdbc5615050b9be2b08b4fd7e4f6c06227f720a8d02c410595ffe8cc4aed707f022ecf917284a8d3e871c50cef30328f69c5c526138b14298070215994634fef1cc2213713e90bcda24767b84172513f066652b9074f34a0499a6cd0365769c1a3ff5fa10b3380c970adead64306c51cbfc2d4c44c8c6f2776028b49f11718466c3861e40cfc49a1860067629f36d52fcf1cb222958c8c65269a947067662bf24082adf5d0f3fd9d34938be4e22e1ecb8453df2dfdd0f81c3c52ef28270c1b08feada6f9ec6ddc177b2f24b515021dd74df595bcc35a7aa154bf6e770161d2969a54bee6c3dca42d7cc444372da1542581e840c4c729259e51fb6e753fea441b6c4197cc6d4d57d3b491d68e8e4ad2a8f4d10f99b930a28695aa80c109982d1540289cca45f7267699ac0ccdf594598d370b185a117ac3afa9764d9525b550d12dc6f2143d41137b21f1ed0b31fc430d934ea2a938fdd60ee85c742645f24c6770e3448b59e7344b6a561afc7a76fc1a2efa8da16fd3601b9a6843fc83990156f6746e81836fda5fadef4c52eb54da10792a8e6048592d0b5f7cabe31963ef48b4f0c68b0c4b6a729de7030fc0596904f1b0e25419a225f407768e8253a989fd4306fd71001408f80beb6d3e7bc30755cf9ed10f0a515cb8dac5d4a0939ae50fd5e7fbf71e0fff878bc88e040a46f7c47439f9dc6e9e8430572da2d4efebdbcb59a7df4473e9c6015a84b742c519a8b5b9933a58135dab4d0feea5f0efa413d57737b3dba0de981dfdf23aa51e08db8aa24a7d68ad2caa1283134045f444ce97473271c76572c90aff2b4f10d006149818047cf2a900ef0ef34a6406e1bb9f5e438040a6c27e2ec197c2357c8cec32e231abb48b20407994403688940c4b8d6a0f8470ad695d24aa00c083992857a00d5889d73265894a0307bbc546ba01bf17feb60e2dcf4123a721da5d59f5a47e0d08d949d19d20c5ac7d694b6417916501c89fb0518b0c5ab0be8b3d8f60f15eaadb2a65511273255853cce06e7616db6dc48e79c06e63492d5243690d52ec79a66a0f1ac65d5ea2737b324c0a8a1c72a12768e406d54f8fb5419387a270c6627bab9f3f1cb00774e639333d696ebf6666699a574a283270d17d05d68c8e2eca900eb5e72a7d0e6dbb5a7b23d4c2e99ed7808131b5b04cfa281fc0d38cc5677e55fa3eac13ba2b325f887698d59029138dd3afcec9f950c6578e573973e04e6302a33c7a0a0d10544ea43d5f7eb5b5badbeaf63d4fc2d636e19aecc54ec6a12048226a878b66ff7e35c114c438c0423982df94ada9f80506e3aafa4f90eee5220030d15b746d0ab45b37ed63bda7c0e7241a84a46d79a6c5bbffac788e9119845b83364aabd5e2c1fbb8909f23ffa56001db509ffa3ca57da35c7ccb14d1ad21f89c1735a016407d60518c5b6bbce4e79dadd126ae0f883d80723f9e2e8ccd75990b80529c04ff568059b527b5c82cbb2c14851e7b252464cde9531eddd886ba096c8a904b516ea01f06f80e682234a1071722cffcff7dfafefaa73b2431b31e88271bb7cb93a596e48470ef32d4bfa7486d904fdd7babd89e1756b850ba6318c68f05ef45c6b92ceb47833f2f81950a19ff39c0f1042be5a442ba6fdb738580713b0058618b4685e081a32c8208eed57d50fd0bf271d721eb5a0bec1e753066be82714a0b93aecbb729d0df8ea368741ebec11781c067a6d48821822b370186b2e1e6c20e7b2c4b0e55e7d6e1211a3fd6fa81adfd3a7fd114cee79fd75c7aea2dd2e2aa87632840b2c75d13a4631a87d73c7fed14ebc9f4f604d22c1408ff7d27504fe68e4d0e8860daff1b9cfcecb29a425a63e004b454deceaf5f6e94b49fc775400f1ae021c6b582774c18d280c7cf6732e455798c1f719a3c42e6adf011716a38deb6ca293a57a1d4a51f9412851db92d054f22edb91dfd62e6b52be3a64f92521238d6393565a46cf0fac72f38a3cdc2b60a6ebb3eff89b1b5db544941b46cf64d68ff555c8653cb86ba6753b3e3e87bfcf62aa140be722bc452cec56fc8647d8b01edc7071ba5a04aeb598a2eb5067dc4c375cc81f553a11d586f9bed470db9916d6431708ef4f3f162549b0d8192f36159f20235cad552e822d6f27fb9ca14b1bab94dee7cf81be67aaf913eff0e512b7904afe179466adf109bd74bc0c105251b91557f050b13ed4185b69292a9131b03298da5dfeffdd8be5dda7f65f838d0b6fec298c8c445dfe6421afffc3ab88207974af4deac3c9805243cbe41a85cecba93f8ab6d2ee0a7cf30b091fc739fb7850d190a7289a0c297207f87b159a0561d55400fc6de42bc18db19b0673d45d1fde93d6ad557011883186c0c99f01439e51a213fea6958e784b5d7a89b74a64910c758a38425b9b9e6891c32665313b825909ce7c5cc3498b061edb562b8da00b0d94e3112051023c63848087e41cb9e9d5ef30e6dc1c772c730e92c36a00fb5a76f3184113b3aa680459b4e4ecb6575644e27144f46c93e9c2bb359428dd05fac819963db353defac9ba605f6506ebdadf953895a60f23cf55c2ada02c20c16f4887385383602b23aa16a6b75940d19b404bbd5a2058905cc34b70dadc14519a119bbcabd533f47de6f4756944966a96aac379460aa55231692cbbbba35606d037561a4769f19962d01dd2de5ff4b17dfbc4a04cb20ec7e3ebcb0d8326e0d77e9bfb3ec0b17dec52dc2de60b47c1ec360e0162ddfc82018b50962a7a7efb97cc038347646b2ef453c6af4a9d3b7c9e0df8a5d9018dafeafae65d8b6022d0400ea512bb80f3a3dff9dbddd909c792d289fffd196ffcc3fdc3ed4597e182b1cacc9eeb6de434545066cbdb5fcfdf0b28205170da8032a104199b5451e6a65ea15c6898e681531dd096741dc3546f6fcac4cce11c429574065544d085c2bbc02807993f386b6060ee0b56caafba312fed026f524ceadfc55490d8f41160fb4ed3d702359b320c0ca62944a833e344a8d24079ade725b853b3ac979023504cda981810cfcd6b230540da59783ee0cd4cdd773c16b1aa68f52bccf825fc6bf701c73b73522efe067ae4762dfbaf4b6823c6cd7d522a9b84b597283cfe5ba748c42c1cf9227d8a28d37be1843c54e91e2a7fc5cbce2f689a1b79a4d88898f8afd619ee6883752eee43233b12570db76eb9fb8791bee3ff20c7b5e77fde9c64bd8e8c3146850cf0bb81d74f72ac26303a866811da35388113158a891cc2ed6746a5581aa163ba9c736031e37b54bfb6ff00b424e50102554109567aa16b814cb4ee905800c820287c1512bb241da79cb4f5eb276579a83746181a071f6215b3bcdc90cd057e17fb06e43e19d92ed01df4101d43306b60b4aabaf073e4d10a7844c0d47ccaa06b30fd437488921521de8d354da6d2af9ff5873e4ab190cdc9445e4d629b5bd56d866a7d292256d51804be07f35c336a2a53910aeb12ee3ca68221e00d3909a87a0cf76a55d4140d9c5701eaeb7d05c2475610268207ad0d674f56db3eb62d8e89d800655150174b8a4cf6c747124dc15c9798e5ba0dd62a04e8e67b82f7c950dbf8af6aa9197382704a911aff2e458ab934fd7fda4a5620dc02185e972c93cb2b8a8a8317fdef0a9e7ee03f1babaca7760a941114f43c96ea71bc00f532a6dd63fb497aa8a4421c63eac8ca722f636a27cbbf94ac3a81f000ceb3b97864acd43c2f07fcd2b55c30507b2ef1481f6387c33b5902175de5b8baca2be6f900af631c26ae1c93ad9404691d337188555b4aaf9a70820e53ee9caf1b2f284f62908287bc1abdb7d55357006326a6177890a79642b0a270e94cd629d65e0a1eed0e8d340e901c3d720bdc3a28f01a1876e26db30e0d0323111c7f8b0bfdda65e88a6da16b9af2938582a1a16e9f8eb054a01a50ecf05b2dc5a7619aa6249d865974dfa1f2c69c5524029eb3a05ff382b2573c30077485397975a9e6bfa649a4a8072b7ec42349991b30328d330c6e111aac471c664210ca01ca57db6ceb3b01d9c3196140459b42f70df7bd24d1bac7a753c014e3a407df854e157e11b833c19e613ab7e7da017e16c1ac9bb1df67236ab56c013f48504c3b2dd19931384cc055fddbe83351d074af7da1119538b4332be2ba8406ac94c7cbb2c7e98cb68f08265d17f94244c0dd88c957bc58cecd1313bc1e0f1e3b2361381f1b58920d6618890860db7a321c8724c41d826facc5c56f9705b41d3efda5fbe0f7ca3bdb93099250e495136d2f8211b88202684749f86f3d26820c6c7b0c367a1ca3dbfb31f80986b1c3389b4872593d31a84e6a25b131091974764e01452fb5270637e41bfcc5aaba6632e164e68a2811ec5d17f6b94cd79128a9512b3f2f7dff1f18132dc540b36f1f2ce798daff58ef873e1209e6e2ff9821f26101241e8f47ba58c52875d6ca85dcbd1b72238b540bc0a9c4c41ff33868aa0822c70a8870b08cb5d80914ef160a3378da4c388d1a7335363806bbaf1b0e9cd689327dddfdb327b894b091457748d3dc30e605d63abb2ab27606473b94801791e3d9d0692782546ec582337c490fe09943d3e99e46371c1f788810f32b94acdda5936304a585b3d8ebe64092d1b8f6249989785cf13c6ea70bbd94eba8f281e38bd796c424dbda62fd2f9801690e16b6ccd9b3ff9ae9897b245294ccb71f25effbe4f0256d3f514e532794e792e0fcd5b017a4a02e68b86b0d22a169a1d42b7e20da054ba4f8c4d65fb330f729231de9a258a44895c2f926e4b9b4d16befbb2ff1ae9147cafebbe32523788f504bdc1f95b9f0a5e87423867d9e2e3ee6a44211021d46db7cececa656ddf6338ea0c77719217f192881d7cec3f3a26eef04cf2b1937900bb38f79f45bc95777bbc11636232d8e198a9330be3ec4b4677afd2342b98a22d6285279b49b2f6372f259f84fc38536f3900a4d63351744894b4ae9825da6ef650e1dbde149230482f64abc1250aa1c51c4c304db7323de36c3e6a78de0a5fa496246ecefb657edd048221be03d15baec12e72e34a1727947a66acd961c35368361717ecf9177ea0f15bf4eeb7c60aa1a5baf6e1b4a2445842cc3f8b2078b62df2424e59ac2773075a749661cf085119f8a0d997c8ba1efd3b84aa090b4aeddc42c730500d295c1462e993c7c63b338402843a307e16b2409a6b4bab98505dcd4e53ce1b339ae071f938aacf44853dd9b66c17d5a85e81baead308543ee1e8a1b64badc316b1a0b250d36b5a8c992c45379fda70f3dac5382b687f470b91640b2aebc55cd681f9f24df4b9da3303a61fdb1fbfb1efb93f38193c6d08b48d0946a2a7190202d08b7f65eb7fdd1567da5541540bec7314a250e10a1b2d4b476cccb05764acd82858c857392f532b8eb1de95a82c9df013709342ece1a1371c210791ac5b45b70e0c3f0cd0ba6048e413dc458b593450e32c63edce10ac9ef21ad1b4dc825c1510c4aa3278bea3e8bf7b9893dc9fcdeb4a510b65679f608db85940bad7071b7f83bfcb61d08b211e05b255e8b022ee90812189a69873934cf8e94f469cfc7a7488d51132ab8ae55d90bff0d5f9370ea6dd847c4f2d4d54c8fb6825004dbc32d869a056e9cf3cf3d1e0967579520e3eac734eb2621576dd5ab1ceb9fbaedcb225468fd3df2b473abc7578dcc33786773c1da1ebfe2d2108018ae2f93d957f72016bd2fa30eb64c9b3b9df3046edb284a9e86523040beca619afbfa1fe873c786c0f4d1afbc71928f58fbd1bd3ee2f1ee929a5181c64fc24a351d58b5567b4cfbf0228ec373f0a15834f66191bb7ec622ba406f58ae6ce5637e79d7bc83c632350845dcb8fa14241ea1988f0c41ac20ed17d3ab20e5b721737417532e98891c164717f0ffa66b1f8473f8bb8a6d5d2933cf26b46420f794acdd8e904e22fa4cdb530d8c43be850c85ec143b21c3a6faa21bd41078a8e509e9fa09fc48d5747f37652790bc6f29b60adc9f0faebe7ccc21a69670c58023355c4da98852a2f9ed027db7ca2012bc6021ca6b6fea003423405a3c3330803e7f0debfdd0e7a568ea4e9ae51e930dda296f42ff213df04fd1a5420e567125d4f27dbe5adfc67f4e8544f78a1fc3c78507e5292bb970d1be158484d394607000656bcb5f27a830ff7cc4fdce386ab7ad67147cbc66fd57d56a909c3e850a4adbe8192bd1567310673579364780f5d7da7a17dd2ad247b35580961ee44d288d14f72c84167204f455490aa47a39f955b56be55068365f87bf1307b3fab238801fb59ca41283ad2c16f85ced17dec48590f925ee84396ce2ad70ac400381ca959ff1f4129840a932daab92112788bff75cbcf97abe50844bc4166fbe97b7922617b5dd81a91b9c0a8f46823cb168a75b5eb9aaac37e6260fc40fa3afaefaa5bce19e43d1575e4a0f9d332a29f123aab1a590182d7dc1c5624de05d4508acee1bf9ee36d6a33f3385f347f4a885be7b31e0d4a6bc8249a1641eb43f1c1e6994a2ea3b16eebdec04acde26a27d6aa9d7d0339968e7c8721729d85537e38118519fae8a41c965b23c0b7f5c65a38ef79dbef49cd8f975dc7f87759560ecbcc4026540d90a142e953e571f25927fffde1891b22e3c07c1861cf1f37759230586b499a8f4fe2fa31f5645eedf1841ba6527a492c42d6484b25b7e0c2dc4bea2a70e13459c34274e33def0535ff417a851539ee782ac5db3621073d814cb7acaadf1834c73bb36801f802b4b96acbfa4c5004fe59d2bd32a24576cda0f33b41fdce3ab5eeac4c47c8419b501e22c94532c1899f50743a4adb682ceced311479af705b43f718e08946112c486232f6de6ec16569d1da3ed57174bf973035b52fd4d780b3262a732c1001c35faedf21a1d691354bc3662ee43d9453e5d393070d32b7c62b9f14e0ffb845a6d0e1eb2618d2e1b91d20c36d601620d4c64fff067b9c54891e30824e5f77c1944e8eee66d624d69e5465d667c326a9a8ba9a2a3919ca3bcf9afa0d70300337a9a109c3b77e52e07420b161cb735f8a55dc7c695ac5cb8a2bcea0365560c74f8160b10e879693db13a131f9cb6094a16b4076ba397c4bdcbc011189a6dd73dc7e9483a42ddea5ac11a7b3c0aa9655150eba55a3ba56aba086b51585b9037283c6b65955417cc8a6b514fbce1da452ed2aa0a83fc019c85ce05de6900191589ed772623ad73283a92fbb9b07299c89dca21d452b6537a695a55b286fdfa2e37eb4dda913c7cdc96d8042659533c9707a72ddf0bdd652722739402817887bb96cd8ea77fedf9da12e51aeb58e837b41002d4b7f563ae1f07f355dca70179e36cc41e55f0fde64a823708ae088a69694d4cb5db5f756a26f21b99cd56fa04ed050dde746f06162869244a8605d766074d590e3b5d350f06b68d731be29532bd24979080d78aac31c207fe53614a9e74cb36e5f8b2e5a41bbfbe0783004c77a0a649e1ccdab450f1544688da6ddb016d10a819c2793158997924ecef636c34c36427c29f0648423a59aa0ba9860594c1629f69a5039731c898fda902e17f5ce62e541b56a84c6917cacf72cc67a137ff34927c58ff84b6c8584c68141b6d3fd3a7ab403ecbdd08dc1ca63d9ddb8c2de8e7a9fb6f625140dd123707110a326227ccbc7842bfd5aa9ed027fc155a2ef8da030a6386b3312270f548eefc6c88eb20f5c46663795dd9631dbfe45575d5fa9035af6546b47d679b02036cc01881feaaf032c5b23241b675b41801d8b37be5a8961849b9f56c79e0bda89d700f529926fa3eab15f7351ab8d67a5fae2f6a71630667ced0ad0f9d5a754ef5ec8045c8dc438aefe8c0795557b2db4a93ae0b410281acd793a37b0d66697e15c1ad2f244d537a554bf36d53e160aa8ee9a77eb2053a3ea6ef5d435bcaa77ea8c29e9a373862d17038b3f41b7e342cee7b9e180ce21ee0dbd5838e7e989153353138d77d4903631410ffb91777db7f5b9bebd5d66aec6594aae2ef16fbadf63cd0ed9af01dc57b02ed7f489ab03d5e2eba8caf5d04d511840dce48355be0da1c8c5f65caeb8149a6acb1b59b50a4d8903868729d148e8d4274d7e91cb16b59e82ab10c8c3d714f4f54926c3ac55eb97b72d4ba78b72815187fcebef017dbeeed57b062df85b7df8f28348760806fea24f8c1600b6e5c9ad7e17e32cff29d42cfcaec2457f856ab7f30cd1ae01d321914ab0733a8921566407954b9fba629c0448a6ccf3187fa62750b70c07d89db7702be336f1001b33360acc7a05f2cc374a4f70ad15ff34c52ded921bb5599e5b86ebbb1e41b3117c465946caabcd25666fd1d7edf75c0706e2ab513775f8c8a238c49eb3b0e9c6ae3aba42f60094b7c7cc8ec07834d272dd997f7f44183bab7f6f5178e20479b7216729750a18ebf5677e9a1319e0b0a1c22d9fe55adc259ffaaba8f34f3b131e006b8ffbf47e82d244a6804293a9139147953c8171e7b0be689c35ff633e54ac95e6719ea7ea5cfeaad03f31c63a8dfbe06578c1abc8569ce1f9a00d1ef61d165e0d3e3b347a0ce03d44f4335074d86ad6e6a40f692d9415a01dc76a88ebc9030d41118f33be2ac3146de9345858c0d06ae288f2a7b7ac75eef79d35c84d1a3fd42b5cb7faf16a2a9eab9dcb33059ab867ac513bca348e091af38ee6ed54de90dcac28c86168038b5f599e713240bda2c40402984ace1410fd9c8d4e8fc31570865c574290a98f5768761ed68258807aae184709bfa986db86fa690129e9305a74e884df6c5cd5b45bfdbcca3aa3dea13b9b8e982e1805d21044a969a370889cced618bb32ca38ee18efeab32246355104e21a51ade50290b3206c8cb419c844ea497bff09863dc0adb8f5c3a025dec5e51ea3eec5f3ab824a5955cf590db9a875f9dbb52e735b634d8cfe5f28615474c354f346a0bbc22ab5dae87da94742ea3e7bd28a3aa8f7b0cb9cba91401092aa77b608d3518b2b04a7f1e93e065be6ae931a0e7a6eceb93ea78e57788bfb59d3b2b45ddb286a513fd0a48103ce416d08dd331f771526473435079441ca0a060e40f393b4b3fe77e16b8d6bc1c94b0800756e852bc0ddffa73e8c897dfd3c332ba21c507aed811da3d0be39ff6597a0fe50135a74eddcb7c4f68c863cb1837e4a208af34d561e0d84a7a45fe854b961d0fb1492db9862ac80f5ee5eccac19583283524049dc578b0b8284daec6181e1d4b308b1500584e5ec0504563a1de8fc00ef25a685101547a2aff6ab62886ab5811f4fb00e2005dffd74a21dfbb8debd16188c701514c472d12ca0a93d5e1f575d02cbb6520077f997465f797a2527d4c6dd28f1d1e98419c45d76b78f2af5df5ed4ba5de31127e4f1056f075a72f716d77e2a8d3201b1dacb59d22a61ece1ffd3e3d8e1b87e08fc7890b850fadf1334853acd03b1feb2f824fbc771c050494fee381c7542730b597b5eca41af19d4f9b43c22cee22cb27ed6ae5e0606f772ff849918b7de30b08a57bf21a1b89dcaf66c999507d032610e45d5094d913e842a98144744ccfaca195bcf61b96f9a5b751ca651d0a4af77e835c3e09e0efaf6665efda482573842bfe235b0ea00437d914d93277f0d76c0c97a5fed00b014560b27cbaf94e8e2b343d8869d771c9baaa7963a4f769ec11ae617228b5fedf936d75b7fb9cfda1fd0228a066cddcfde670fef4749f7f3b5ca0133893db5839bb2f69c9cc42d0d9854259c05e179f466ca8f15d9ac52a0401c5d4dbfd1606268457b7af377bdef8524079ed339e267ae1a65478999821828a6fa57108ca3a780a382a55b0558c3136e3bd3fe451731eed7e855d713aab78e9ebec43e6310ea79c7a10ccd187c86d35e9deb96c5adb4826783d21840e3c36048b3f2f96ccef819d125ab0ea24d9807d0535f1c855753cfa7def4a2863a8be3d3d40cac6055abf27b738bdfdba734f729ddb8f894429c05ee3efe25bd1d030a8d5a8e78e0edabb5d667b9d2c5331727cf167c6d5058747388a59844f0157ca85c4730251dfe464324010691bf767e287b21337a01133f1230cfbbac12d43bb40967f3775306b13e6e4fd7097b8694287d46f1a8671fa20cf33d51665f89de15cd6b8d4362574c690ba57187839447c95f69f5120e51e4d95efb0760bfd2c4c8991e1a4a8c0b79d1d614ca444c928a56675ecdaa31aa90931451a4ea464984691d322041bd05ebc8635900f4447809e503a112068034374f2dd364e16a95b85ce610786446efa473d9a0e350be60208cce974a09bb991a6406227c92711c01c1106ceec16c7ef1b218d0285bfb34af34d7b8253083eecc5360a820daa4237e441f071fc464fefd4b27edb0f480ef192ae587fa99a805045574ad5a0dc5149808549b6bb7d73852040dce7cbf0ed5f0721bbdc5824f56bf3875bd756c258d104e1f36f94b1364aa26a2e49ce0a11c1fb9d5e8dcb886abe4f0f9d1f27c0716ed71b1342b3348a599e422f56858ed5a87093683a82fe03022a95e4aad209fcd48eb1059091fa0744853cd044e69ba6c29f460e9f4d8af0a10b7fafb4f5c9c70aaae6f688925618bbc27d09cad29bbd93c37dcf6a3c9ceb309efdd0dd21e25a83645fbbfb2b87a7e93407e31264f89f6af4ed3e4022f4640961cf9d098b56fcb129cf4971dc3b9b8fc70eccca2ef332252979afac760e20af6cf26c6d09b54b42290f17ff4a9eec01dab5aa5d463b5c55573b9c7290ee33b953cc781fe99c81154fbe121e5e66f1750d326827c263ea3a9681e5dc0256d2a52975d400fece0314c8335a32e59980537ba80cf416b433dd6b9df0314bebb17446d0646c629235c5c6393d1b0d157094a1cee84bb1aa393074dbe4f16852fbae8a09db910af7a3bd2adccfeaf013d98587c51c78e96653539b62d4c636398491758c1746ff273716d7e0d78e63aea748bf9a48237a589d9baffe2fb64244480a4014e341c969d8fe6077cff35c998149cea5bd1706c6cfc2de6531ad1aa84ecddc68ae1c37360b95ce355293b8295b9c804f72c761f3b57ef2471fc2e183e90d14afdc70c9ef4e98e0b46643596e995263606c3867f45daee83114e74e50c3149d69fc933c0ed990789aa0b71f54b1c5a01a8afca063e29f4152054595a21e101d395a491ee8c6d9bf1d91eae4913a09d90910ac0513b10b0fc6513e17f96584c7d9cfa6bc86ab1ed366df18e1b4abc30d0efe08f1d3680096bf9b376ff81c43d04dd4cc802601329b3b26b435d2ec04c12fe278c66d20979941b91ab1ac55ace047b55014c0ede4ee29d0d99086c2821556f4a91179d56cd5ec1feaf0054a9fc0ce0af4ec6c917f156a639d91629985b13542d569483751a3cc134e22d614e84dd2049aab3ec31297a79acfdd5b2e77fc3b287baccee5157fcdaa1a2cdd6614f9db583b6abd06e90d50885a23489e7a9857472fefc7a5c475352a3aa08ad5d2d18845d8f0cb2f8859f2d758f0f67af6116888b3c5ade1e2ee78ced3e5f0bfe25940940b99e7bf1e45fb87f843462f3fbb7dfd8eda26c8af81b4b4ac7160a2e7f887edaef3a81912b5cd859c81e11946c72f6ffd0168437131f03a5340e714066e67f66b2ab2f55ed676e84fb27ba9428905ced0a5f7a119ace3a840a9c9af0d903e399ca912505c12cc4f3e6cdaba7e11bbb3135b4b7e36677fd6859830084d8c4b0e74ccd02d03157c021dfd255ff3537e405e3f1d0fe836c2f1cb4deebb392cc02e6d4c05c2dd910d0ffd18e42f674647bf1440f5166266f5d52be6fd9539fc52d487b82459e73b5e0ca251216d76c69e0fb4c4019e9b4a501ccb53158a967955c81eeece059a5b0207fc28eda87de2470627f8af7185a818b9893a24c81f3920a25e196d668589492cc434bde85ba8926c5fcb23c57f3d301937d59731a0a3d2008c28a5324098b2bbd263c0f9a1074fdabe4a85121b72a74d0b1314385c757be1a86b50537998f3efb14999ab9c69afd4fad3badc61eed9499025a69283ac0bb55bdea481d09ad2569bde73c6f6927e76035ee3a7f80c49cde86b0cff1bdd4cd575391b271755e2eb54e6191c58bfec1961029f178aa74497bfdb42aa6e59bc16d58c95073ac95842b62b46fdcbc309d9ee4b424dcaa48bb17c5dc6240e5b6a2ef2c3dba724a79f4ef1490a8797fad94073897f428eb08cc76b86a6bfd465a694e3d7c33fd9efd540e9c72d2ca80743774e246d1c8d47e55be6853f5ae0029283a522f46f93fdac991513ff38b7471c802023738a479ebd9d38e638da04d557dfa8cd4573f8a3b2a13c19e6baf482e8d9bd0885a58cfbe4dc53c107ac456ecd7a087b3bea4276d52a1479441a00505c66377d6fe693682738494b3af989a84b6252287b2d78fccb585b410c90d849cfe568103712239c1704148bbda4b342fe07a46d7b0cec8046a04fa23ff468c009ca41c4565a93b432fe50b46ac56cfc0f4e1840c4894bd3357726ca7c36ac2625d48104b707e126dbac7bd7b49f8958d6af26797c3037fa6c6cc0346872f0c4ee63a8c76faf67cc06f3dc6800e99bd53c3bd80ab522e700c78b0b1e052220427042ab99e8d5920d0ba4a0789afab4ff41b19c0d004ede52fd750e36730b063c54713c06f4eefc3c7a3c396b6910303b55651867664b102a26208e9c012ec964a317dce1fb2c3685af643016533fbd608ac93ef43cd92bd09917b4b99524a018508f708df0842b10b283f09d80a7026ca1f6dd7c69db8c65251523dd29d47d943e3f628b548130a0df5cead0d2e413be2a33efa78247feaf4d5d928234d182baf073e507e2ab859430d7270a60d30747f770d48adeed3292b7b2c958783e3717b685c822653efb304b304b46ecfc9ee45001ea15f7a3cf855de4a51a5b75bca745945c0e3f13649f070910081b74942ebdcd3517785c242d5b059ceb033d592b5e373a64d15b43f643dff7cff1d9fa3faf8fd9ccaebaaeac358551feb78a3c171c1eb5ab8c9056b7596719c4179d75f1d44acf1679051bebfa68b4625dbcfa06d9a8cf125ef96338ceabe6bc7866dba76f917bb5ddd7c0119be7f9bbe84a9fd1d83c12a5f408698c43bcaca2085294354c608856d9763d1b58ed569669943c1e3510f87358ba2acedb185862e1e8623619eb03d98ba6a079d9373b04b3d974a3df34c116997b7b0b33b3fb118f34ef348275baf7cd8fc77cd196936b2f97d2e6a215ca8aed9a51b165073dd125ae01170707890e3f77fb6c7bcf1011097c054780447e22fdf3175d571aa70659bc756783539292635cfd6b8eb8a2fbd6e5df1d928321fc95a167fd398411d2ca9e5c0f11894443c90e190ede01c600237bcdf17ff8d07848448112335ad5a0384f11013edece710a09d1b1e37b5028e54dfd1ce06a3da72ac05b46b57b833f0c6e37df1db78abfdca95c7a0f6d5782ceacfab292f060d77e640abd6f6c531891e69da9176a41db5f66d47234790340fcfded2d89c9ae5ff3411ef91cfdf4d3be397489123acfa987635d4eab837f9cb27106b37d55022c94f2bf2973b41c39648d59be7a979f871b035a1fdcdbd65993bc0cbeadf1851485299b9b977c025008c9ab8b32c97eff29392bf5ddccccc1f9ddbdca4ca42757021703b46f624c68b538cc98a12121528474c1475868c19d4986804b7bbbbbbbbbbbb628290e0b3b31d37f1c8e9b0c8fa1387002f16e06aea6e29a39400309c6c3163e8b5acf164c46dddc8ed07caa072c3531151173750bac1e886a4309cfaece8b19391b9eba279970b2e0422caef33b2affb141b63d4589aa67dfbde55dfe2b66d31fa5744f66ee8d2dd37c61853bdec3451882863163251926127d34f9ca5b9dcd98948501c1276b056aecb65f4d9f136668ccdae038e893613edba4f868cc2704c945f3291f74800d8907af94154bf3d173fa005536c50f9db0f69514aed555f90f6b5e2fbf8cb83e4d78adf0882c8d7be2097bf3c09b87d12d027f555e9d00534e587bf9ab08419d22e873242640bf59fc925987224c3ca4e8c3136e9581500329a54f9a908c61893d0004510485f286d6962058c47c42f0c1369ac18c71655fe54c30555fe46b184991a0863c450e5cbb83748428818638cd10331c610c3a5c6d805e7504950e26a982c66d5c8a096a48005944c8c998c0d1d8ec814dd1023f38215349119a2c80260c82cc124ca0c2616706a22c3e5862f51646650a444068c1b88c898b1c102543c8911030e16f87284130401c058c2e40585872c4ba0b858da07644e4d929a8c692f64311b906c20c306a2346cf0c42436864912d4f2482d6a1e5f933146c9bc05b7756577a4fa737b715d712291cc51b8fd40184e2b706202bba1090c3064326a46d54c8ddf0bdb997aa46b0b488e7aa3c62f4c81f6c9ad9bf632ba103f5617e2e344fab1564434aca9fd610df46de07098a1494abb3f5a23bd758de1f60363c42c812d61d2637ca006514a9c94c8606d300e1cd0fd30d6b8ad4292daea1a6afc3589732fa979ae72724137c62825ff7e2dff50a0a9fd6d6533a4fc5ce88f31da3e8a7493730e628c51070be87ed27d77e516a594a1ac45bad8b030ae0eebf8816effec662835d3b959fb26d77df9752791dc5a382b92b342a3b78203da68a38d36826ccce58713638c5e39d2a7f281c7f766f6707804fed87275687751ca9e1da3267bf8a0b6ab1177706298b56be3152e80baa9fe3c9a67f7a34ea8bbbb7bb84cd9ddd7290046d058c3ae76cbfc3a64386e1fb79f31ca9f3f5b93114afafaf3c7285beef4246ec2f776c13f8747e09f3bf6c5dfa4b5bb7ffb87ee66f160f6ff68bbda8b3c61a41b54ddbbe3ae9432eeee8e4be3393f8489839cda6fcf693cc250ff9652fe87c03b48000c60445c84616262064668a0c90e34389343163b98e2454049f913ef24452bd0e287a41df84003154f8a4fc2d6eeee6167ecd27425873262ae8851014622ea01c64c51c516269808a20897c1961a30c1c1f184aaa0faf7f6e8da3121ae80820c8c95b07240f96ba5c0fe49aa2bb50bb4c0a28595ca7f02901061988490c2534480a2fddaf342c5ff218292b0bf886b5f0b3d2415db2e4998a95df73739b93a21fef869178ba084b6526817be166bc7c7441ab573e4b7eb5d3cdac5eb84a5490dd74989863e4d34b9be38e38aeedeb5cb9d992977c739a7cfe9cfc349a1daefcae572bc82c0bfc06da852deceeaf84f6efa967aeee9b19e3f8efbfdb39eb5e38fb48b3ea1fee1ec7cf8330bdc49c5384e0a0dbbba404fb3a62fbcd4dd528699caaabba50c3195ab91ff020afcdafb884976482843631bd53bc6ed07bc80925153a25423538dae3dafa426b58f5a8c5fa87d2e685c94518b316ada27bf7dc12b7f8575b1e3eaede12cd5df54fe4d6a1abf4ca5bcd5e9dac57146d6b6692b5e1dde38068573c518638c316ad23deeaed4b64ddb18ddbdbbbbb5f8b1bbffa8abd32cd69ccc3fdab5b4bb37d6c6d327b46b3f046ef7a04b4d4ac571aa94a66d8cabc9d9dc944a95da1c57f456673fceb66d4bb172ea4a7777df388c7126d95dc6a86952326fdba64929b79a252dae5edd7ca6acb15dedda326874cf9152935195d32eafc6e75d1fdecdae9bbda5e3563c68341937d50a38c6892915192783855e09796215d7b9bb0fe936329b18db2aa678a4562c16a5fe43687cb058354dc494a879bc86de44d58daaae8a53a53457a9542ae7544e44cf709b23e78ef628b56d5b75504043625c6e95d3a57efce5e3a3c2ea476a05e4bda254bb9a48232202f235eeab7e56af38a75d3f9b8771dac5dbca472af08fa69641798fea5543ed045381add68243bed6146e41d94588004155debc6264a4d2a2a6b9e611082866fdf191ca63236e83c2b33585e91e0f92a4b49556ea587be94d6b2828a82abfc734cf92a9f2f90c17b54bee88d1fed83ba8e03687cb21a3b3ca3258122c06c5240595bafdf6feb1d991aa9b31b5f1a91bd05aa183a13585e6190c62908bf852bb9b53e551cee11f23cb1145c366637b18ccbe787ba8b13c1d667b3aca5f1c420c34aace9fac0fbb29ab27ef612ff6c54fa64ce577352aff93f70ccabfb065bebd87937aefaf7e1a4ff5b1886b7afe2e5bf273dcf5d3190ab5b35379d67ef29eee992b6366820fd00f7ff1bc12e3591028a076f17fd0792cf3177f121495839bbb6b9aa6757c0f716aaf2ae020c7fd148750a2822d757e3fb51857c845705445fac5ef1fab7f44188a05f70a4490534a54881a6e540b322068b850a9c631228b585d1dd4c5e26949cb512c06ab61d80a29507e2d5f30ae82b4a6b0c0f717abc0055b53b45f9065441935dc99bb76a4e7e3af2b43b5178885ba92c52e3b10b4cb818a29a104ae288b448a18d515eb68294a110c3c298a13356428bb9483931a466e77a10122f01ef91de0bf998081e1ac6bc4909e86b1a268f547c2b0a2a51f70a8fe4466ad2f701b2ea31449f9236fc87e78cff4214d3274c5d03fb8e9a57e67474b7d3796d0709b90782472d73aaa8ad66906a2eee9fad5bfaa256e8041c3598dcc663bdb59ca7be6f7e41eeeb7c7c63daad4eaf403790ff7a9f8d5dffcd2bef0c6497ee107b53fb6b7363882c4c89c4dadbdccd45c3a6132543ba85ffd48bc8784f66242ec9e552d41bbf697e3c47b4eb0affe18a692271c90ac0e0fe12f88a328d155f79777797957d3de59ba74e9d2fd71982e6cc27c0cd61ad6aee62149049dc5269a18d2344dd38e905490180263831a59a4903dc1a4c687a218c8a198e44a524a29a5c6b47d318368484a29935c79028b35a6502286882e9c698a303da8be94012545b524a7abcbb483ac0cd72df93442b04147101d0307b34359ff392e1e06604206008b1504c8328500aaa05add25a62e71dd054b4ef0a07ddd25a62975abbbc474e44d96fa0a099ce1e405982b76f8618cff2b5b0f9a51d1126954839438bb03254ee567668900a4d0ad2e130f3708a3868d8728d5290ed30e666aaa2e130f5cd490fe5cc2b7d490f500335fa0aefcb0035292ebf0af7445ffd36c41f77763661cd89318f3182d95dd573e689e7bd54b6edd66bdd77d230e272326ef3d52aa714a793bb1976d979d9aa7bf9bff7d766a9efd7ed058a27fd050da11f6b9a95decd42eae5c436eaa1c26a9dbd51ecafbd347351f3d1b7e72eeb86df536de115f7d8d27a45d71e58366cacdf7cac7ea93acec0d47357925e811627737efcb18a5bbdc26f6d23c2958d38b81daba1f3fb1d2c7499c5457c5ad8c454e9abcb84daae3525d978ace3aeac14ac7a58a624d4c36f1db091bf911151db02751b5417e2e95e4b1cacf58f8dba9297e69721813466a29ed62362ac2b1030d39eae663682855ee1b8fc911af4ffc73fbc2f9313f0d214284610cf5ad80aabe85e6514d6905b9f1fbb552d829ad203537bf5f6b63128eea9e7801f2976cc98ebbc48393ea41e51e1ba39913a3213889872d356c2a957bd7c9b35476a2863c2602aea3024ab43d36080530dcfc0d0d409ce7e728efc1f982664802a200e7614801ced3c020ce1704821fc09b1b5f1008a2802b213734006f40d615fafc9579da5c000605fb2a0e28d4c5507352eecf63a80f7ca0fba9d4f37a5b395ef5735c149ff11a66039d1f721217e73782197dcad971a620c314685a6afbfdf678ac34cf7e0c2526da5c00f6648408d582862b2352a47b3e0097a3b8547e3ed3b05dda010a6e871f87057787a356879f9f78f093cbd5319bce4983f382168c17322881422c45d1f442b4040a0c1a018b2d305088c13c394206c65640abb7d0c0cc0cecd14314483118c845efe834b16558230b224e76ee05ad0da03043060a390d4ead15be209e728319a240a1550d33d03f4619b460e6040aad5e8004fac72f8865e0a48918284473c611e8df6eabb112276494c0f616148adc38f4182bc0785a2e509834711919506902395f42c31846a0d026a31b460a18249093ee04ca4a1328d49d39e268dab08596797483153230888198c129060af90e47a076460a1033b06938228a285003a306982890eb68342d6b1c29f10ed6698b2632e712f58453ff10454313c8f96ed114451228d400323d84891a0c6a98411328b4d383981844275c684004725ad79e27110326723003b9ad6b2f686540d4c00914ea34aa84818019c0cc402e654506284ea0d00e94334dc09c56407b4108c0818c245068aba0828015283102b9ae6b0f0135d8900472abaebd03b4414311c8d174ed711618cc10052e93922e512047bbf6dc8719c8000672365d7b41ae0519658a40a1950e4f14dd74ed79d10f349881dc8daebd20f985071a66a0d03a1501469caebd78650b2d92400e47d79e63a146124720373dd0d13550e982040a31bb1358cc38710472dcb5d76a982992815b85194dc840cebbf63887299e20818cc31145c8c0a03ea3062398b604092b92402166bec107eb7bfa98dc75cf751dcd8faf7e3e7b21d8597561f5f397b43871dead9ea5303333f3b6d1d4d43c57b3d56c5b951f4b69573f8dec35e856b93528576e0d2a2b173bd51a5a975aa1a0aadbef340f8b45a993eb3ff0e19b67fbfa1989f2cf9cb88455ad41b515ffae363ea2195237b903a49582fc14f091ea4377e276f2399dbc67c1e94a1ee522384143f752bbdfbdc8afb5fd5657bf54f28e6d338d9e3ef8f0114be1595dfdacabd5b3e72b2f7e77146bd84523e0da0a838645e2d6004abfbf95be161fb5cb632967d0bf12553525ba8572636957c76a33c5ca1ed7560ae189324ddf708184adc7713268e0fa4bbed7efde1159b1a0618b69a7586d294c5868377d1dfbacd0fdb063304683e3a464667ed9d139c4bfb065a21605f8b55f41fe7e30eccbd73e18aa04d967180cf2f96b2cabe3bffef2e7dcb3820ec94f0890cd0d686a5ffeae239c5e66476a0e7ad05251430e780085b62cd0007fb4a630ac700128b45d010350bef605ad164d4e4a80429b1210a0fcb61510f2a8fc49407f7fad207f7ba92465c497d60a9f267ffbb4179a33dc40e70e166d0591d383f6092e567801063cec2fe5e73c1454fbd9cd5782d5c310ef7922eeda1e5e0b44b6ede5a1fd7aa14fd55ee09e9db5d0fc0d51a29188d742bbfaa714dba30544fbf8da47262a667599a880aa05a8cb4485953a9b87a97e5da62f522a173b5f49b949606b94c0566d86b2b216b5fed82cab06a46b7f093c1026a9fd496a7f3f0da4df05ed350f4800aafcb65d75733c32e198be38a9367599bec0bedd1853af799b53a5b7af79aa8f5e00ea265dc6df3eae50e89f807cd9d5cda95acec6af43a22e4c76256e66228d33c47df3040d5766831ab342458a07b6c7cff668ee9f2d1e83a7d82f8f45fc34ff682e445aca5ad6b226d24da4894c2dd409112832994cf603886a319b1cbac848e7b0cd3245462277195f70cf0356cbf67cfbe2af41ab600b1d587186146210000a0454f61e95dd0b5e4f29a985763191fe3eb023f87f42768c2d4d2e040d295454932225d174515c03494a9467686790ea0f6dc30119cda4ddcc8e934f4c16ee0c8b152ad508926d9a91718f4b4c14ef88f11943c61828471e738fcd8cf88b998d301bd16464239a9c363a90329ba5543355145c1a45508c60b1b2b9fcc53db7d6a28be23aee3eea280dc4aa8b7240c39d4d1ab9e7169ba3a0b151236ca53a9bcd664a9369622370699f1e4858b8a3847009fc710c438cb00c5a40b9913468d8b00ebba836a9bc89bc67f51edf699a703cde11ba8eedf3dee6711e9fe20d2e768cf8f8f8e4482aa28b895ec0eb4eaed1ced9a60eb149678a494a95834f556a23cee1a870dd8d0edd0a071a32d18a0627079a9a9b266ae80d26166a08b5c942e30e269b9b3528efcd0d336ee044a191c331e273860f0e19d0f8fc383aefe5222226f282fafbac8f07396e80918395c5647573a3abe33f844be0cf6647b8f1c54cc756417dce9821c30a13319940820924101111f9fcf08f65e5d0f16388dbe112f8a70008b0d9016b87fba6053d77543bce83c71b5de2dc51ed481c208af8949a130d37c6f270a763b2e3a345dec0a0e12209194af59f1d1f7f2d2e0e1d380e070dcabbbbdddd3631a0fc5a7c5985f24edffdb40f8165357edddd0d44eceeeed8dd317677f4c254f566efd8da1641f9e3abee8dbadb366b65709b13c68e9ddca6cdeac4df1882d4be6c44b0994046d9695b472937d9cd8a6f33048d326a51eedd44d149bbfa7520456ece2dceda1efc5df9bb591d790304d555fbea7d495509ba3d761dcbdf5d6af365949299e76b9d9c40ac470da58ddae51f1849d13185c6a32e4654b99aee612727560b8d1144598c9115437efae019c939c9830f5929c7c7c8454382e2508d2f24d620699ed6c718a353c4e98f1f7fb6d8a02def9b7e1869887ff0852c1d5f485939be90e5c117521c319c2f9c4621f59b161b34ec66ee365f386521ad29f21dde3a79cb521f51f50ffac610aec99afb2c5839ff0eff863e55b00d4766662766e06ea2061f93962dae2899a8419558a65489455665134330f183ecc9a104462e4dfeb38625a6b8e2a5ba6a36c1344e57643a7fce7905cb15236a76708ff8f30aac4625246afcd6ca47a4341011e58b0e9e58d0448728b248d1344dfb20f5a44445893035be8e958f488bf83259719f60cae149e205498c5102a96a4890a9dae758f9d05c55601113638cd183950f197657e454eda3f6338caa3d3d628caa3dcb4a1355fb474287236ea8dae358f9d05c581c01e6468c31e270d951441a463451841155fb1b2b1f1aa54bc49002eae8090dba28e150182104b793ce8ede6c971a76496324c5a0c6b759f9883963681874e5438b677471b50668da965043126a6842d59629842a59aab021832664f005112d20a28baafd5639aadad3346591a166a90a518df157ed84937c4dd3344d8bb17972545966aea6254a142f4a4a645c3465c9c2c251e4da1e4ee5892acc1237a8a416638c93a67eb99c06d490c7135a96ac3040d57ed218aaf62ced9f49d5de25c41455fb9d1554ed7d8670aadaffb0a06a4b31b8220b6e4372a2c6d7b4170c41668d1fd6b8f2e505dec5883238b9f221674e036a5c42ea414c8d1fe94e943151d4700415596600e35c9460c0006003d452e3c777aa695786543896a65099223c99da26b7edc809903094acec6003a8288c80c8949682f8c208880d8a5831a4a52c456c6abc92e84ddda52c2f4882eea8bb9445869913b3073821bb517709872527742883f67b6fef2e37af7cf65ee8caa05dc39f6550aee1772d5710e83a3dafda1534741de99e4e721e924907d89ebef9f83bdbc3e6e9872b5b2f56b387f86b6adae86071f7ae0ebf8dd749de53a45ff1e36b5ff1a39918d3a871e38259286a7cd5174bc5b88076aa317e38239176bd14347424588def48716e7c1f6a16941a9dd438654c20f0c154606b05185ab45d314aeaaa3102404643972b27d2744a8b18a4356541d6ae363eefbbfcb5fc85eb64820f945251513c8a694d4949fc1c0d1b51c16691e324ef6125fca4f247a548c44944f10b3916e78cb18bab18e5aa536ddf7393316a1a5be917d7481cda3d8d6ba7fb58feab5fb0fb9045e4323281e8a7f37ef82b16c41be22f21575443463256412d05015b828192f61a0c90ea9a517749ca957f0a43bd1899c0af02f7778c8cdcc87dce55d1eaf0774882f00f274569cc7bf84914218ae0278e19ad0e3bed60b1b4546a4e6e7ee4542b1fa9e7150af3b7d7e616a3f69af69aa63113738e07e1bef3f9e13e97efa83e745556815540a010fe9091d888a1b831565081db17d16c38aa53b62f88c1d60adbcf9f1f0cf3b7af06d97efe377bfe825b7703e12f2e0b9847c130e03d2278012606b6806cbb0aa27dad0952d54fef705610ede517d49ab2e3affe7eed7b97bf3af60fa02b50fef953d4a10b19454c45f3e733c1b468991d390c894a0f35eca893665d44651cac0b0065a2f88b37f2392a95f21ae6af281c2ccfaefc56b24df4042b4b37015086527e9ab2d509829fae18b183862573445136b6879f6417557ed8f116dbc3515c832adb68abf69325a1629d7cf7f7afe352352b1fbefdc79523f1fc6ececa3554cb5a42495977547f61cf729e15030d218a2e5964e02165e84aaee44a4a3e49d876bee7a4dd51fb926f6482f4915be891595bfd496a557dd8505256fe9c50ac1c28c74aded34ff6253f4a1155be92944e6db43a12ca09a71ad20a15c4a0ea7f3809003464074d367e8c9fe302628107e530ed35951f877754aef1fd9f66a73efc9bac3e2028eddf811ea9d1a4055328b78ceeee21cc7c0758aabbbbcbb8d345530c607bf47b7f5d506e57bb583a50ce3bd512b4e917a309f1f311e10a6522a8b7093f3eed62614157c77b806145b1c58747102933dcb66a620201fafddc0e2fa85d60031318b8c30b0a126223643cc4c02af377bc083aa040b8974254ee93d4766a9e30cda3e359bff9c66a0f7ad6b0380fa85d1bf7add607df4c1e4ebb5aad0f85ae2dae6edf5468533bb598ed7b4cf77094eddb8a53dd24b87deb03ee08168668336a9eb0a554212a109ff1c2c40994ad35bb99460d0ef7d1766d34eaf01a69fbe875d20e19286c7b96c74349dbb3d3f639be90a56a1c8ff385cfbaf185ac8d05866e543620a5e6a1f9ed1b4bf3a8d0db37d3f6d07e93cf79e1576ec8eaa777f3d10b8b2c540739d2757e3fde4fa14fbd01e16d3cd5afbcd67caef341f05a292198d8526b1a69076b7b6e87b75d10310403819a67fe4685053210a680f03b3ca0e6f9eeb7e7be1049e57e7a21923a9fdd0be777c441f85af31764a15fdb775f6b7eacf313c2c445cd99f3fb8f80fcd5d378ad14668802a85d714f65e5f168d79684d4aeed456883ce57a179e647a45ddbeff0b81ccc62e0ae2ab06df377dab5bd099e4fbbb64fe5405fc906757e612bd52d6ca4bafdb46b73b6cf0587511568dd1fb076a054287f1bbfbd233ea5fb58e8178f61a24e89d95e917d4261bfdfbd10ec537561bf91585f682b050f859eb457a576f77bce20ede2ef3d3e94ca3ba5fbcd2bb24fb55d8b71a7985591e45af4199130fd19699e0d970cba83052fa85ffcdb218942fb1b22a45d5f147de2518195449178096a62183f50f3c8a3caaf42f3b0a050fe1fdc2d7911537b3581fd0e6218128e88902726e2e13a21baacccccac04c6520c5566662ade4cad1d12b444f146f9f8ec33d7354a7032071774ab5c41802b03d16a2b85cf058d9bdb24abbf0a5400474b5ebc8ce1a63db369cbd462ed3021a6ba6e897a73fc58bb1878ea2e49115565f4a8e6e100fd10a10dca83846ddad9d99e6caf71e1769ca191080b438eb4a66d5d1847f45059fb8aac530a5d18473cf199554e56c2bf9d26e8d6d8cf0e25bc20edeaa75cc352146264f4d6d7d6b25e987d90419a877f9be1e989334a0051c39e2d085150ee57cfadbc86f217b39ed0d404bb75da50298772198c363bcc7bbaafe53df39eedb74a46cbbff9dd07c30743151852afe27ece397ffe0043270aaa1224154ed91eb67d42f361f8d4b79cea22f53d09c181ea43156c1f02559db27d3020f1d747c45faa2e54dffa2bf53191bf70c044f3abe2dfbdea4356179d8fbf1884293445f35bcdb7622b7e53bad80c8a6ac84620704137075dc6a00106c230bf05443ff54940fa0555f1dfbe06a95d9cdac2cbb1652876aa4d5e08183014ab468a30602856a7c020b4c9c0d46f9fda425b260216da5fd84f7593810ba63ed82603b7afc5338ef217d450c38e70f217ffa6c9dfbe4e1ad3444c5a16726da6767592bfa648bad2a4863d6b275dc4db5a9750ba87953419542a379da91cbdc3e6d6b61766a6957ffb884af3eccf28109cbf12b4d5bfe0a6b630abfab0f40416232c2d20db02c2ad9fa2fa84546095fe24759ff793d424b50544abfdb552bfadedabac1b695af27342bf260155e3ee744ee8cece67478436e886446d6666d5582bc149521db3fc6c36cf458c9663a9e90cb7d8ab7f10edd931455f869cd849141f691d817e0489c2e15504ba87edd1411b336307513c81421cc59725c02afda0062435811f4ea369fd3fedfdf0819ef00389f70075511cd43024ebf403c9eab88deae7871bd5b56b7bdea889a30534649db0f2a1fdaea226a36c7d0ed777252809ed72c7a9db05091e6ac84426f8d4241dabbae05a40fd49407e76fe1610f3b7fe62b0fb19ec8fbef6fe24e0802e9fa04203b58be3d57e394ee809f6e5ef2f85913e3e8a3a8a95c1450551fb439b96c02a02ea360d9d51696da212e539417168a1336e67bc8b1815e18ef0c38ebf711ff990d632b1d2f7d43d4def8186ac1424a9306385cb11182454c3c3141780f4855a32a411036b825a01fe351e9256803390d404e47327c5867f0b5989abef121458aa4735cc4bf56f22265090a9feeda47b968b24180c16c32e4d61a63ae8cf6d6c85612dd7e2af6a8e1d1224341c551aa2ddb3d2d675bef2d1d1acc47450fcb44350f304bdabc29dca4afcd3dda7f23ba11060a15382ae334cb56a354143b6c25492c4a86ea00cc54fedf2ff9ad0a54fabe36fa3023a47c0f5e90857b9339f676ca679564b104c75fe74549a4154fde9a0e6d96fa2213fc57797a2fab399edb1b5bb9f6284220a29b5bf9c6f9783536cb49fb6f16a94bcd4137eac50212cc4232ebfbbe3f7d7fa515598693c01390e5de718e2a3d0709f7866c84c5c8e01161242991583630c50804eeddf1edb7136b553b59fb74788105f7d47646aeaa8f36dea4cd5f9d3c6f358db0b0ee0df55737bf7053c046739fd82a05c4f5804833e3319e23d3f29eb818474169403dcc37dfc211bd81ea98ff353de065627fe72805ff1e38c7b465c356a8c435627c6c8c31237cca0e14ecafa77ad53051888029302abd31598abc57eb1646a8e9ae372fa6643b5046d9edd1e110c6003fbf20f67eaeb6f00db83045c9989b9690af1971764684531c6d2594c7fe9981ce3588f0bac0e06f8e5afa37e21463885e4b0802ec736a6e5c0a996a04cc6b22064a1a87c44d096dde430146e98392965b11c025b7dceee2c88b4d0aed412f42b83f277165886b828d13c6100b8abe9ed129959939b9c526eb29b638c31ae4777d75ec02a6f5d3235b70c547fee8eac52b1b721d3344d8bd107ae6776a8a3ae4df476775f01e1182a4ebf2825c3a293d9bb70817243ebcfb5e3f3365f3379720ddbf0cd17b2ea46433a3f74edf8a4bc3db9bddbb67c21847803a75ffbad1415f46342d070ce36a2e669178f76c9ee62f7a87e555e0bed496de7495bfe9fde96507e2d885b80431950606090d08241620656892f5423464b1358a5bf0532644370a2a88b47f7a89e559a27ff0b1d0214a479b69701a6a8a8a42ef64435756646000000008314000020100a860462b1482c1a1236691e14000c7b9a427c56990a84519203310a21630c01000000000008608066c4120025949beb342a08da99c14bd40aed6e5ae059c18bece3e31c32031202481e301737c55a5b07996a4ef450ab8c2c9344c846b0b4ed9c39f2e3e8455d22c6257bcaade8167c40387c9bf12f38617fdf5e8a2ea2c7bab614bd54564dd3a17670f89de9fe9a112a22d00169d178fb531749f72dd5877d220f48ff91ab95c5b8268c8f25c178a7404d68694635be7478476851009fafed2039e96ab767e9e83ac46814d3d4ca2b497301e6338da96dea5e2729b3d48a6dc9a6d87dbc21cfb8d6f41ed4a8735b32a40039082e76c6040c40bc1a446ba2c5f59ca560a3c5451c72bd6bfb325a370f2c9d559ff0d6f893ab4fd1f12021e520069a0b14516b6e0305a22945032da57ff829965ede15325b2ab9320edd598e99f7b3e45d98eb05bf6f44c1bec7a7860ed09932b335007cc3d6f09de42cb657c656d9edf2369de1cd2eb564b865d9fe0321ce12d8312c8509375c4f2a62f0cdeeadbcbcc761d82f2f5b80e6ca90018b2a9e704d2c94fcd6a170ad44d4ffa4faf775322fa1579b46436aa18636555991c2c3a06467aa2d27554715e24a3d38b2aa1d61f45d7398236e5d57b35a4d3011bd71c6ca5d175f0d215d1be0ea7eb60eabdea5ebdff72ed14081ac7342bb16eb2a84f3643b2707906d419451504e2ab2460bd8267ba6abe7e26782a7d0550e3d1b826450ce28e53d3d325785889bb5f17648aaa8e011338940c4c03c2be6fa9427e5ada20d6ada7118b4f507f07d0990ce6c835a1d9ae8d8ad303a4cc1a7975b6ce2a9b378a1cab18bef6e11bd7db76dbecc43830b5d3737dee3e5f06013567dcda06c34d1438de4423fe6f985ea5ba9bcea516c58a060cd26846d2b9abe4bc1c98b08d69255f68221b9a75c9018be647c0e5de9f24a5ba6844ed731fba7e47ac6fdb12cd543dedbe1c3b10ff92d4219b935d7485d0b8bfc446c94d299a4f87b9af0a838b0978f3481cab9933c6cc36f4cb86d52f3c61d63d307c9b28680d1f364b9b1c8dab150383a7222ac62492a5c686a9835a0d513a08dda2463c144a490ed1dcd06dc77f16e3c9d0b94dcde994b0f13d5069433403a4834ae2c03f76ac35318415d3f208e3748e1ee9ff10a859fab119769aa2a63ba9a7823d9c72f4b1ef903730a7a46d9d2cdbd77ff8367e2e871594a6e75dd028f7b9086bad736b6247c859011fa399f401c43b8a742cd9ae6cdcac91ac54a1c9e7cd241bea75782ae3bc9e53f9b7ca7c8f0ad8edc40a297681b2d32f574b0ddd1eae80e0eedbdd61d69e3390e359ea48a393985c96d8397d570f74d7e6e9ed7872bdd8f299815a6d5721d05c17845597d8bf9e64c8ebc5d33126c9c35b5d7011ee389bb5e19b8808cfe9055e606eed1795297ca82966dc8ba3532dba779e7f91f14c0f25e8460c9a4ee4f238247a07f5d624d25548d8f0d15d6dfaa3bf4afced947f0ddad0d1d9ac8b9254dc21f769e44db7bba0f96354d7b45a7e0d89523a666da797c33b17572127faf0ff3ac99d0088b7e966765ee61590731521e813f07311b2251a5959c858f9601aa44d11f53fa49a8e62fa06a5efff21a07a2647b5bd85e31a465ec3b2be336f94ed4db158173fe8719450e01f99cdb3486540eb93edb6036baa5853fc5f8d312491a6cad9896d0271892f12dfa7b8f0388017beb01c3faaadfd32a4b189b72ab2daed67499490dd426de2a40d1f7ec5d56271ae571b680d48d341c3269ee8a96442280579123815fd02e97bddeabd35bb7257ea4ec1af879df3f74ae0c01c6f56c7076fe3ef7e05bf0d552ccd2c733c7a0cbe9546053c312a870ee00db5f3ee538a969fca0ce58e672824025a679ce5216e6eeacf3f505820175ed3be7a5bcba5460dbf1ebd60ef02d610f3c3f90cba9e7648b4187455f724c5f9c9f7aec75da96555116ecf3f3fdc218649260d406174def4f2e2fd267e81cfc8d7881d1c92dbf9ea3f5f154e81832cc46cf1cb0344b7962e31fbd5471f728928e93e69d692670a3c84259f220c66045f1cf5b75baaa7cb0e7ecd804c5afcdb5bfc7c4f8c8ed88d8eed88eda0a6629be786b8048da6d3a2a29f2aa7d965a1550cac60aa52bbbd72c665f54ca6a5d5b2a96f02790f000dea89a31fdf32a9091c6cff0c4eb1f6fc6781d349876f8e1ac2b23bdd70d43348a09c35e3b22bba9ac6486b4de48388afd0203ed374b0346ef63650a0c0dc33fbcd6e3d1f550526c252c313beee7f8815c809c0a0aa431bf552228eabf8864a558b2c1139bec6d35a49e2b7d9d3289cb40cb3832960e6ae2a903bbface4bb5a99fd5b1a8bb24e897e62cdaa3518a0424df95d2146611e29742899449e0927ee966cd051005f36cf42e0bbaf5ffab32b0e7b5e892a665351b2023232ae6f5e8a59da1ce9b54d67b4c6ff3b1810cae5b9a154514266a98cf040645efb3dfb63aa5270217648623142fec434f1bc7e85c4dff0c03f4375fc9cec82941e533bd73a889b932f829ce7b343e6be751fa1fc5b7e5f5bb99af0842199218465909134e78404490113e247b12328fd15b10e40b4a9e70ba961ca33ab1a8098923d29288f1ad6ae190497d2538c52748d3ca7c63276961871ed89e44d2d781b8272a8b89eb47f24007038b2fdac94fb49cd859854ac757cd192a8c4346a01c6f3f0e55f0bfaa33cc79463166a2e2d1fe7b623b52ef03e2560e813f1ee2f13c9f125a1f49f259abf95b4add92ed9b2ad2ec303c41789bb1cfb3c9cff949653f6f967f462b7175d4919e65f021189b2c40db4cb6012c6db9462b70690208ef7dd6070191f7d000dbb022c630093cd3257f81b2d2c2e9d2bac7194ea88f4228766636ca966cd997ec13b20c7fa672291090e7a370e3b5dbe826dbb9f546e4fbca1d20597c57c7ba254d4a3b5c6f625ec79561012156c77d581878412c89f76401ecf2e684804aaab91525138b7d42255a4069cdb5d2c4e54234282ea76b05d96b6772ce236068cef19c5b0438ac8c37895c8352cc0fda0bc3add46852950dc1164546f8b853f1099b9fa9ddd38cd922481aa35c12ea5e1bdca18b577f1567d391fc64b7d5d04361bfdaa5c6536772f6e5db87efc213fdca1b38f20bf81d2a7918c74a5e0c6d3fdd4dee3c6db28791d667823316ac4e01b4e407aaac34edc907d790cc1353c67accaa7380c9a937fb58ef3630662d90e7b39b38c0101b606183eb5d5da9267fcd6801bc20d79528a571e3cce59b3b2e8da18fdf55806a3cb16fea53e3728b07eebc2979e108f8d2d9b532423d231e506c0546b2a7793284d9a07aaea5d03ecd9446d6a27f8b551dc233b1d869e85f654fe929477169c237d13542ad3810ef416c39e0e4dec26d093682873d6d909dd8cee81c07f72add41da08950eb414712285b63d1fa6a0a99b1d2a80bcf4dcbd8f407f3492cb86b4901141ade321c9b7147c20ec43306cf6d8d72b2fb3c962a2e1b547d18e239f4b9c43d65fb58a181e09a0e43ecef88bf95cc7858a6ddc8c0e8c8a8d3b3fb407e37d2a17cc05832d064a4779f1d3f346b74ff69f0a5e88cc5b7a56d6113aa55ac246f96bae29a6cbd62131b56973b7bae3bf81fa0ccafbde42e1996212a081d6d47b6807ed3a5d9186d4afe6d31535b3a71dd6fc41cb83f1906ef84eb21afbc487d95f16dcbf9301f03dc10cd19ab81ad9be7bd9a68b4a4e5d70d8d7d77789302ac51db2bf43f53ca3647b4bf3064c51ec0f5f5dcd40dfdd28bc2d94d132cc829d13349c9e6a0571e3848b2b0228222491c2ac0d7b31e56c942f5ed68bea2724deac0271b0c2dd8677f707d4b0636408e0eb619c5e89def5ccec3304378e622ca32ea91fbbdeb97849da203b157a8951e1ea4bda398ff50195f042fa29a464c76126be7191fe2365e7bef6f5adc696f30c5ab448edc05019b47533efd2d1a8e9a98fe2d2f4f71da215cb33d6b5527132174d202ce7f46eed2682782c472200bc296330a43d6164f4a4c0e8841e907f3bae7b61a9f00deeda2385a7ee777a3bf1f67c65f55c81ccbec3e582f22f2897432d2dbd6e071d5bd68678bb4562d645c79950edd76dc7ce9a26712c3b788875f6b7daf8dee73f79737f314c2623a24acbdbb193958ffe8c3f834c659dad64901b437b736e823824d066221f9f296c4b07c961e8431238518c86e4a20ad19a8e14bd1b772234e0568b6c690bd31935380b6cc9f50b5ef9eed3af09fb477359a3f226e6087793d5e49ba0343cc5e6b8e41534c1a6015eeda31e3871306aa5075471542bd9b324417e10f09789e663bae8f6464847544fb56fde9f8810ece2aa1af6df348888352d3d2dcfc0c19efe4445b65721baa97730f665fe1e3dfdd9cae5c7281e553868b48c43cc863540a8eec6422cb36620147aa6a07e8df4865b62bf0336f71d99058aa51aa302fb2e3f26aa795233cce1adc34ea64029ba611fb03070bf8f5c3a619cf28f282efe9deed6ef22142bd61d9e15c360e4df2b90b3e25e590b9ba564e2944a4966e7e334c64c71ec10163ed9c9e45ebe08a3940066b96bb75cab2c3020cade315faa88964168ae278fe6ffece6898f92a4e4820a84fc04da65026092b58d522dda43c703d746f61f198300635f47dd5640f3d07c15de9c05c05bf87e463e11867141e6949cc905cd84de3175e64b8918fb9a60297b654e8828a4e5dc978c3208b52a14f34a234086da23ae5427fb012be53d3d5a260e45755659458c9624ad84813ef999b24c3c05a4f1ac88e0580b437f4f001f7df7c344cc226f07dd43cb0e8832b6a330c0d5b89160d968c8795b246065516f958c9faad7f64532ef0c20c72d393ca7a0a63afd936835c53836e3c4949708cca9bd452f24d2df384ad2fba0636872482b2c72ca73a8272d5dca3081bb49022b312925c717be76cd4b20ba54d6fde0ba3a34ec9f520e42634a59f83ece07341c16e490bd7cb0ee488705fce61b00ba28282f14fe49dada049e96d3ea7c5ee08bb984c8896d16a83aee3aeb7255296f21b01bc43a2dd4eb06ba5e208fc5c2b343b691b96aba210c06ce91439f09ad60ecdbb596d885999b6758b9ecdbf8f96e966fc3af177a1efd6fd9197f55050c0a93ae7f5a4a1c38e855b462930a7282f7008aeb9d694f6e4134dc359085fda9ca36c205db9fd3aebe8bbbd5bec90cdb3b005c809d8af3aa4c1024a2afaf5bddab8f94a50ae23b4b5bd00fb9edb99bcf1fb0f3deeb6cf16ee2cb310f4b679d9470be66b7b4fa11a845eb2acde4687d1e0b19128fdc2d8815c222041cf6282cc4f7e2dfeb3a3aa13890fe4c19e223788914aa52082578214a027dcd12ac9558d59bce8bb718ba3592a6df05eabe9e83256bcfe2a00c114f513ffa81d1064684b0c9f8d488f913d518c08a9634f09e6a0c8776bd68e7868808832a1300ed1db4ab2719cdc4c6e4f8e2bc55702d411c351c29d2643738ee67ed12ce5da1d099d57590eabf96ecea7ed375516973bc9234af21d3c0c197d0b45a662133912d18caafcb44a09a5a3cfff99748e07dd590c5fce43d50631be3ab47936ee1c4e43f171f2b865fab372a60d956cc4025d6c93bb8afc259439ed9cf38f7a7c95fa2d7f7e3afb63e43b904d6f2cd12090ba11dd3ab90d08eee8d49b8fee235238d8d3275a8ff44962c4d00eb1cd41d2dc54ab0a41d7d86d60c93152cfbef5c0ca3f803831d0f1c14100c64a9a260ed6fe43e2dd41788795cab5e373e1ade5f354f858ec509d2b6e59736cb4d25f37749703ce7f6664f47ba82c21f2386b55aa9b427218d1195ca79f8072e7f0dee8d09f0cf7b868d14061a2cfaeea8d67791bb916f7e8d2a87b05c112730a4b0a9c064ab8134c6cafebabf20156ca9840a38e7e53975f061c76e8335c021ef521f7554e8eadb7bc726ff20a4c4297221642e3a7c4923b854f6888a9985fe6e3f1ca48296385683c5b9372c609068569459c9d9ece3d452826ef245008c09814804fc097aa40a7e0db1dca621041bd08207ca708c3c03537af66d52f4608fbf49c0a56e5d87c734e39a451c7c975a07d5a65aaf63005548b6b82b9645db2d6e4133b46cec7067eb8bac33f2dcee9e22479ed878b866b68fc75e51439457c42aec219b0401884a6f8db72bcd0a662f4e275c520f663565a10610135f5f4924e9d54a0a03d2ffde49039c684b95741e0f7b35c173c8f915aff228137912fba39a768cd4575b788bff724102b929155b91d74001393cbe84af7d46552fb7a9c52b92d86500fd41e4d4cf7465372c8bad7d15db2043fc9b7ca2df98cbaa90d1df75b504a7b82a3705423a17d22acc5c8de3444edef7c41e47995091bbf47fa343924752e6e3b51e210f1248a5960a79c3590933410efcd04a52001a73ea87c9a461d9fb476859a4d64a28c651056b2c93ce99e7f422751d21738ad857212e2baea08158efd8f47ce8b74460d6c928136aba46bc3674d853601026ad5fdfb2d485780be8da5b0d82c98714b6cde9d72a2a747fe6eb29389c40fa75c127812ad3afd5a15622fb55022f8dd0bf5fdfb79adbf08ae2de79131d476b7216818d133fecb35f3bb4c5eab12efed4e125daf8f0ac0a48e6cec99c4225ae4d913c5730186a081236616611d094d3b7fea045756a779eeade5c2c38cf99e5555de212e3506614343492f7f178072b698d77c124eb990fa12f80143ea745a46ed73e8b667d6a9e072e3d5c99a821918b3615c7932c85874236e8590a7814a3b9d8f6fb2c018c5ed045f9c37885b5beab2e5b8cbb05c4af5965bbd6e21ffd0ee71dde62559804070273904a0699d07634d6f373743836c68a5c0d27fb5c9e87ee55f6408aac5ea7aecf5dd543218acee9ca3183041a7993b42da88179c1a657f3a43bb3ff16241b519e8aeee937e80d4b00f892ea09bdeb76f908cb0d81e3984e42e8dcc0df59bde0448e5e5bba48437c1cca8aa4cd69bfc138a9ae8ff0b3c352ed1a489dd720555deb55f05ad0bc8a62a5cde8a82746aca9da02342d18aafaa63fde1c98e7ac68a3f832adaa9ebc594f70aeafaac5157d6d9584ce11b5b130cc2dd872dbfff93d0977f91bebfab4ed7f92c13c8ea7b2bb6425a6e7a501c819b76864eb305b27e004786d71a2e9b0b85a64b2a2326c55e60a586adefaeb15aa6d9357b542755b45cb27431f53206ce52c11f46ee6f22641001d83e28b801e4bad813e7e83c6bbe1a6ab456384f19723c140319846d7353b6e4ca01ffb7e5aa88ce57bfb4af38781b2d388b03864df8bef400bff1517482428067bd2f285bf43ac8593f54788b404370c757647705a15ba1e5d940cdae74c7623905d6b5d3cb356ac38badeff3e899a34deb7dce17f9cfc173613dcc9b62b1cdb0672d64a954dd90370d22c6d65e89c77c72b462014370f9bd57b49938dd17e6c4464aea2d0e63124ab89c6ffe10468ce7b23c828bc51a3ba7cc28d1457fd50bddec21b738340b0b5e6b9c8ab8416d01f89e36b76a667160d9a0039dfd885d35ad84264c9525aa531ae66dcef1822f703e3e909141e29f26325a0830c7b4972be562788ac5e50af9dfb99749cb544e0b21c3ae1cb1cfb44254cb8b162973bc17279c94215d5f4479d86f94f8910b633d6797d8a16adeeff1b126d6707c99d073ce089ddf3c475fc2a328917169d7c614d649c541a659155f523e44858fac6a804a31bd1252950804e844a430f64e0a203890bab444fd84425209496c5fa43d5f5452064482029c6c6c018f069d30577d018ba006fb44e4a0635422efbca3586892c0e01d0b35bed3abf1d02d9e32d02c907e9e4f9dbed8e5bf60a28c955dbd51dafad029bbfb829da53a655c8c3673ded35b7901c98c56a904b8bc557acbc264f38771909f90b2a20f79d8f24e37e41fa898068686235cae85ba9fc32e243e234fc3995bfa3d27ff8520bb491c0f356193557716b353a0f65e5b46acbf4e4a14b7f341b9dcd6122f9aba0e6aea55d3db4def82787882021ed08665181b35084f519f86b4e720e159d04c9c9915281e135c3f2ac4a1a790a67f591b01779214bf9b7e6f9f2c0b6ed88c1c907eda0e9cf552c6448692ed9829c2dafa593b32e2f7f20f94c41ca6c8098ab43537adcb9637d4d2e3afbd12931e875882aabe67a1c034211b575c5725fbbe98e4ae1aaec5aa44f1a9bcdbae868366c43968525459198fe89d368482d8d6154c0314849580abc34bfed219f171d08173991342b2b9dd3ce1e298e3dd5c87f634ea72ac6ac5253062cc4418b5c03af73adf7319068415775135d19ca4dfaafcc4a1c5c81382f689458b144d2d5c857a4fe9a012ce69b6398cbb8979b4c177f6f4478bb92e09f033f032c1b817d99e0968ef9f95b8a3b600ff4850c4830c8f226cdb4ac9b8192a138a12d32453786e4be7eb4abe343063e6a6a64454aea7632ec613dc872b3858fa4b2d29b1de3b111d8c1f1121540970999c73821623ba927afb9abd090c65daf437e1760de8977cda703e043f7016a128c2b17c2fb5ae246408ab280827dbf5525565507bc02ca56089384d007cb9dc4e649c9a4f4870137dea2611fe7dc54f09e2d0e2e83b67ec873c64dfd44f7bd25bceb52d08662389cedba8f174db93c24b7a6721170eb804d6953da084a6454c61780a8c4cc9a0ec816d26c19f0cfd5edf20086e037fb3905d490114c107aa59a08a3e09642f8f8197b7a5f121a6c61a3f3d1a3aa7e1fb7dc2974485f021eb0064da66515b41b77e0b4503d6c6351629f55f7be94859f4620c6aef4d34e2730255574883f33b4de348e09fd3089be315e1e775506b75455c5acd7517256aceb4a9650d1a6990f713b44512526d3cfdb064df0b0ce8788ddb2a433a265c67a6bf5a5fac5a5ee633008cc4271d044ca40e994420cb1412dff0b2c65b479dd20679a6ea5268e8a0d33b48530ad1b822111b4f312a4322ae2e4b7b00c2b8c4f1094fa7dc55798f01141d6eed89f88089cdb288315db50f1477f64b48c6fa1819c38e03e52e5eb563ad94a729dcdb8916a4794fb78dfa9c28d182a0ea12e5a560bfd34be1c3c413f13c52106e604b814f23f18ad3826a0109fb14c1adce0345831d39700d6f4f9ef22e8ceb46855c3609b0cc5c34a5fc546a97b74c5f3bd84ebede1e798de74ad54d963625cc00fb45e7652481dceacbd7280c30786067bd7b7228a0cd0c3427087aad96ab11684e8b59865373102a628605471a476023c9e79ca1096d1ef01f9fbc1519c55e19286e4909ec13dc20318f434c047a6ed0887a1a973835ff0ac7b757ccadbf24febc63a53cf5add643da960a5ad78b12623637959940ca7185a5b314e5ca1a9e7d777cd5002f682e05d3fc21e1624774086d5451b9420ad8b3d042e38b90079d78565be5185a68c4b113da0abdf7a758c35cc636ee7dddd53e078d77b8cc54701536b979491600bab02832332def1bcd73b34a441b525ae77aae318aa2786532684dc5ee13f7fc52a0cade15b086cb861edbf21f0907b2e73f50fdd3509799bb117522d3a5cc643cff9d5b07ae50f188441bee420d8a2efc3bb013f582b22439a5d0464919944fd8816edd694d827541a5c8eaa3aa7bbadc27391b82d8f442b5487f7100a186818d67031ea3103db375899b1eba23b3c0f6d41fee2eb18cc795a8c2723a26145beb918792112cdc5f5dcb93e11f748f18cc525a3459f474c7744bd5ea5b1a251ca33f199bbc87ccef9c0a3a43e2b82dedd3102ab17f0dec9d281fe0969c5f175eb90dbeaf92e061b667cf5c3819e1e3d5a91eef7b6a4d5466fdf2091eed321ceb78bea8e395573066d8df8b650215771b9d3f2e4fcc354a4fda1bf4d7fe5901903be8bc7696fe436a72e2e8cdc1205e754af016edf187a8f2cd2a2da3b335ddb47bd83949000d9743dc04ad0621d42471455f2322331e744ce7246dcca279a5f9f30bfc72d4e7de8a02d24930240280457b0cf212f465b7ae951c7d7ba1a54bbd28aa579375d3f3161a89c3df9f1740356e578b1b364aba992121962e36f2b96d4178dc1142d1d4cc5174e9b11030f6fef82541da218bdc49b6b115f967ed929fb019f2df5f51ea9c0a59fc6beb7ea99c30d08093d31f49ea9856bdb17eb1a73fb953ce362203eb7d3cde1b8d1a55f81233dff4a54ca3f60bb856793a855571004363099abf71a092bf3ea3fbf7f5b7241379a3b1347c603b0489995f60fd279c973f6b9f9d8cace18f2b7991591bef90fdf5283c21e65ad024fabac0de9a61af0fb69f268e8d69b5b5e0ae4001907a8715eb5c7f5c2d8d95830bc02ac5bbf059791c0fd28d1d2e2f6ceae94de1767058dc86d82e7bad218af6ba59fb1dd951974c274a43de9236d7f5c60a4394104c85b024e99140ec6a5baaede28bfaa256336b4274ab905c6e8bee5e92c55e8dc917c966015c6315f07c1d8c822d5dd036180a5dd2db3f6508ed8ee32a6a0efb0a4d1b8c59f26981f70b811ed26818c7004fe0ccf44e758c8c28ef019448be469422514de3fe4603f0cbb8dcd405029c7a63ae74a886e4ed392f374f742d4cdaab4d326160d47d559b8ec21f725d1cb9827bbec15599ab7191ffd09b514b246b7b50404b68ae576ccf2fb6198ff0ea591a7f15355e43a11af4c61625ea302a805b39d7fd8fcd97ca915b53c989655b2ca666bce5d2fc384096bc3a55d4e0d9d79607e829a708e888f7960bd6ee06c2e4e11948c2d35afc04b88cd50ce4c06ebbd07bf54999018bf9b2fa092d1e9436b4c1f0947123b27e5137858ab55b1a9f8913f3667d1c588d362065cdeb656cb0dfc1b1fea4b7e2eefa2e38ef09126c9a39926a40db466bedf2df53dd0201e00c914bb4cefe797353039141de0269ab7719d9d477b184ff63bb7634274af6fc5169f78fc65d1aba9b8216107bbb67bdaa3bcda654722add7f2b32582e798f8d074c838ae7b8c34017e30c87f5764d82bd020bd72d544a4fb2170061c19ce40d10fe8d11d5892a4db3331f055a757e6b3a42ea973efdf1e1ea6436755027ee967a0499b762cba390a1923da2978706703f28e3fb01456f3d5352c18644f16ec55e38a3907a13f2f63ca41b75383a855119e5d22fd60bdf1809d7e30f4b62beb9cad5d2717d97d700fa14480cbb8d6053ed86b2b618c5b3f680a00518dfc4ad6236c9a4128c8187c71bfab5c0c7568b51b2aac54d62b9fd604dba152c7c2b27606c3f8091367de8d04b703d3c3a2800cbb8b3b1b0cc50561fe09059ab97233a827577a435192fe00e8f1917008723551ac688068fe5c75081e33c62a23786cfed5a5c10b1e9b763cf4b7f384e8a9f382882aaef4263e8d4ca32106eddab2f7c87f7f15ef114577e0f1e0e3d5aea118158415f930e6b0f3135a77016c65f3dc810d64d161a9bef1611b7308fa516d96747743f8bf9a60decb6dd4e9f7ad9df420c25084dad62257f963e49288ee0dd309c854f73cc34d4a53edf54d654c49047b23a59c6f13f65cedb3902a226b61bff68b3b6e64a6f8c5330da8e636e0b819c0e76fd426132dbb12436a4cd280afedaed90e772f3c5c46c76cdb6fe6e7b770a521270dd6eb1510e59713fedbaf874434bd78f297bdcc42cb4c2f4da9fa018003cbcdddfab79b432e77cb8972a130a8b4c689d23017dd1753f7dad7c48de8d85e3933f5c9d718897119891c38d4a3a93e7454abb7808c8e4fc4fa230ef4925d0339e92d1ada7b5cc5a482df4a054fd1603548234a7443bc9a2d7b664967c3b5b84b6d9825e27f0fe8f3626ac41985f54807237a95cb2a9af87b01a7462cf43556b902a33b335cd17153b08780528d56871402c5a3107b1f40f1d62548b38b53346b7434ac301d5218b2a5b1a02078a1dfd4d75a27499398d1584dae3a7627d2e53de5c3b6bbb8222ad23a904863d68982a4646b027e21f6a8d5574398bd6f30a6c913027faee3b880a4f5c038a0eb7d3af133f96273c64c408a4001870a93384474678001a88789795ef91a3f214823ddfe8b833f64f61344e9ef3c8923fa1d2ea35927e1030b0a70921842374fe8cfbe1379c0d23c06024954fd4b4b77c98c8ef93beb96c6b165aa1669d32a0897eb705a9031f9636fc9ed8e98610a24ea878b8349198945285005435485833e707b3a91bf6907506f119aa4da0503c5dc7baee6e855ba98c7cc33abae0e23dae57cb8654e1e90fcbaa1ca35697a25061d225ba2b626699b4802515fdf271f324a3af9dac3fceeab0339bfbbf00934912ab1c05f80cfbfae102cd39c978437c61b17d391788a0b0613b86b51d8f5079a32f8498224025e835077f57ff1f055af2846245427d4cb4fd97e6c526a9d7c417c0f6e051b2e1d3520a45b6865bf53b05dfacaddc4a39ab1ac06657ae2fa80ffd19003e2448de43cef866a44d59b0e211264338bca0bc480308fee2ff9950660a2813029a85836ebc758abecd548fc96c020eefd2ae1ef93435cd692b26b72e3ec803eefaa7b8a908bcfa74e939ba82f50a49a1c4e45ef0b6b610f37911f8d28d01f455cf17588d9db97c47780cefd4d32be7c9a4309d31fa2710d4d0bb3c847e8b43cbae682a2974c01ad8fc5563954ec75094bf3f4e55e28728bc425160f4e9621a3a41486dc4c641c08ba3bf170b715d486e355d5059277007297c7a8dda904aab666a411a92a8a88e7314819cda8089653c38ac789fa7e1dfa0bcae9a9aa3eacf03368ca0f59a47e94af0b09a564602734b3e768e48e6b05eaf7be03586a5fa03c73121085295397903994b3c0238fad942ffa17bca3a774abdddc278de187079b60e00a4c775409e3b61dbf5a59b02df8b77ed1fb2ed8041dbf88f9028e36c78b20037a5d2bf60b1d8f58638e3c743289260a5bfcae7946951cd640be6cb80612796f746cdd76977522c4126101d3f0bb0b1f94bcbc9728cab904397719205ed21ee1ac9409052ed54e3e46cf391009956f1884a89c7f0c2b4dce98a5419cb78067dd7a1822b46777dd07945d68d4d7d34698a1a3f7ca2c4998835212e4ad403fdae85a02c45e226b8318abcff5b791182b64c1c90b118d9c29d91dc147d5818b3681154d32d3b33ff8e56ac2192d4052527cf7e8566b489135c78286ae6ac87a295df5d6561a9eeb3038836b58f8a563643afa1680440925d5398883f10508741be320ac6c58d230f8eeaf63140d6c60ac900d24f5c6b5b60f6d813edb94c991f5676157320f3db6fd33e2a8ab87e92f7f7c7718fb507399a85adafe3942f8267216486910f6787ad1b455993c05fb075a0fb6f048d01a502d8b9da96b3752356a944339ceded31007ea022e0d4796471fe2661040587232758e46d6714f81fa53883bcf0ea5590a9ec9e7c4b94a6ec399aad3b81f60e8a2a07f924efc52701ac53eb8e25718c301e16a373b10cd997f7a2ecce6f270ec04dd4c27a2c5636b6b20889e4e6911108764a8e48c2739d83a4e8e66f95a9121899625efaba6cd348aba1fe5b60ec1d6bd2803cb5eac75efab6472a9bddfb6453bc98dadc6c246a1152484c31352cd7785baa371a8785cf59f64fb0e840acc2dd9de1a64d17903e5cc707fc986271dbdba632caf479829eeaa6708945d4003ced1017b4769ff7038f83f32d21b67a3ee778fa1a5d2ebd33776dd796da8466ee68d07f35ee4107b61f00bed982f94d8069451b9b042e78e5ac365fc4816c2c9923ed63c483c7d639aa16e7ad4fbcb8354f748bc3bb67a5bafe70cb48ac175ddd9f9c6d86d58e0911e9bb5f7e9d598012f3135733a0c8a9106358d429ad64603bbf6c57c5d0a3a391c591dda9168bd1feae8de23640a41f1d7d9cee48798e21d0fb4a8d7cd8d7652d991a246b6d57d338d7f965d7e4683f0ae48eccecf0a475245f9f33bad5ec4c688943553a0f94b496de195b5eea86adad1adc0afc65dda9f70e43d853a184df9eed774a322a97d8d1b82304263067b17a5d50928baa384fae2bc007929c22c05bb74e3c7435330aec68df4a40e9622462881a9fa160a6e9493aaf00fc665c2baf1eca494086ee05b59cc74e4cfd91dd0818fcea0f53dbb50b75965b402dbd1e82664a592af2089980799ac343ec0b70c36754b9f7c82d237008b46994e8be4c6a00b545bd1186e370dad3e398e61abf20f980dd4eedf53003f9d3307b30ea7105590a29d2fe55e02388339be7d0cb8a243fd572bb4197e5fc5f5b912a69f09b6a5294848bdd19a652da4fd5c638d9d7879c04bdd441cca7a25a80da135373b5febeaec2f36b2fa4a33d143679e4eac89f15e2cf2ef34550c590c40426a854a627bd9c5ffa2c85cd2e43423ae40c1764a6b07acfe6be5040cc3477250b9fa725f4382e57e0ee2babe440e36434ab19b0ec2f001cbcf821788c2a02e8b2a23b525a7a7f01cfced901640d87c3a48bac72169d92d2c178fbc4881c1d8e2a9f1f411bbb578950b6c5b34af6013cc16af496938044b983981a97ef8031371ae8f028eef7d649f4a0560e70153ff6ccbb72c807b1f39e473de24b6d27d7b6808376b7553223fdc63ed22eaaa595c26e9f3ecb30fc6c9e1586a14773bdeaf2da5c6003e783ec65dfc25bcf354afb64368e9c538d3708e5dc635e2b62ba7a9f62344331510b7652f60e04fa399fe5723935d44d6cb78be7ebe96b57e7dd384d61e2b3cbfcd739dd13ee46959a537091d60b373acef04a3889286789287b060ed76d189fee6708c5f8f1af9119ca241f6b934f0b9a78d487f72912d943ee74fdf7267f2670e6ecc8bee4c2ace3dc3d6f61e3de2e92d993450d10cd5e29ac7e91c0f47c4e6b142258e075356271a64b122348e072762ada3f11899d5b71c8c0680a6b61aa142de67025b57640e35c577d937953d1791e1d34ec1529e7ec01535b875f87417cf4194e36843f664d5c7f72aa31765900be30d760fdad5245d4696d35a6cc05ea853173e50fac202a4e2d903b3d876b34f6ba09ce6eda810b6e5e0d47a664072d09967c18f71f37917aeb9e47cd1c5d02f5da2c0618aeba171719a03ceac7f94aeac2f10363f09a5cb8a3240703d1b6afe0d3ea0d00a72bee9acff19cbac28be12012a37d55b79fba3705763b75d16aac8209bd164771411b3ec96c0e7bfaaf604074e71336e1b60d8bb53801ae258c2d9659d9780514b9319fb8eef09bae972ceed2bfe91f7ce41c861b3c186be4119306f94d9b0a183ab0e0a0c20dd5e217cdecac65113f8a7c320e177544e6eee8b3ff4eb76ca1196eec3b722bd0a16ebefe705ef777ff4e86ed751c6a7f80562f1419b9e7dd01f7f9c0f7b919407316d824964ee2c14663b3c3b0602565dae13059336dd9afcfd9042c4af74abf25b5ad9e4bd49795ef3e01371a5e84084494823b8f93191d14a1c2b9d059be8169866222ab532b233f7a0aaf1613517cada50f71057d6880e118bdca0d8f6265ba1f8582faf97b1d04d8d85e26b1b22f3a501ab930aca7129a05aa7e8f4ab2d68110d0f9684cdac3af5332c753213deaa98a7f079eefce267cb69f7c67634c74eada140b30b3ed83a0d2f8ccf65e73d3259942d1c3dd5de409608612869a198e21c51598cb5b07d674daceb0df4a58640716e2e139fcfedf43da2de3a64a4ce6e7a8f672f3590a1a2cda3c2c4edcb1a885b09343439a15c62b11b26b44f4ad05935722fb4c98cdae873c9be541c207437ffbe2b7a80227b064572552f878e39f838734fde73ba21d8466f8d62c83321d354a10c3a6dbc81ae53c57bf03dee816b7de38c4144b98983e71d9d05fec4c08c53622a70f80c9b268928b659aa6cfd95fe6fa451d021789a9630a71f7c2b1d20e73624d3e7892591d9cae0654052e5caa40aa689c66b111f6e70ef4d98382a0e3123192eedaeb23de64a2f22e68081e533cb840c42db55de4a3e5646c9e0d7b3fb842f7a640dca6fee3abcbedb40f6ab311494961ee2e823189bf6d8aa91f46c333d9f384d3cd43ffbabfadefdf7a7e9a6f7baebf73a483ce68c775af34e846ae009318e83646edb920a31ecd4ff3bb0eaa9badfe6a1d26c66b86ee69e23c67abe4eef8638a6abac625605dda1229853cfc2c31fcc562179a6078db6a82a38e22c3cab143ecf1866d9fc41d5ce8cfbf1cef0eb67d989dc40836246e5e88331b479959983f4ec91d24061c0c88cb7f03c78a1b76e4f9303a2690f0308542bef979959e06f78a4152eca5f9899424b086320ad320025b893310c4c36aa0be34532d9f025a88b5e11e2b4b986b90c4e0511aa0e2c65d06de49d85bd1d7823cc819504f80b6327913e2b8b5aaa491829ec66d9b75ba5ddf5a6bb6ababc950d1046004fb04ffca53a79d8673d695468bb6cee9eed83d101e0cabce36add74ba5730ed7f04876e862fd07a2998c14a0bfe2c9d6d25bc8bb8873707e97197eaf78390a080744790bd61d5dece8360f156da94a3a61d225f68c92e2b0da4a59817bf7f81ddcd16f3a20d649f82cbd38e18637da7306f8968aca7de2c16072626fed7cfff047607001a7bdafcdb52cda29897aea74c59402564d11e9ea0edae44872ee60a8011867cc53fa38401594a3d38a32e060d84c0329b53e1d9a8190a9358f4863544efc945a1d737cd77f5c6e598605956b7c9211e4d8f880b2d8053511601d6289cef348e1f9727598a21a57f99e830d030a2db74ca7e0d1cfc621fc81a05087dedc0b7a3f4a302b63e5799e50d3d9de36534afd1d5e209d6756923916010f94fa44f079fd8f6e6f27645bb0abecf1eec911e1204f529db990528d435293524904cc5362a533d278ca267085ddd44ffcc2a0a023425dd41764b719cbe5b5c8989b40def1417caf775738ae660db10b4982064272a70aadeb92dc7720ca6dddf8625ab312058ced1922592bacd722d17566d4d8ef5212210a86c8c5910aaa06b43de1ea53aa011450c12e84bc58a1acf17b2a014a92eee2b8505288b880fcf8ddbfe7da413467a0a29635d3a6e4a9141bffafa63cdfb21d124df06b2aa82585ee1f178722d4de0931e88aeb9b0823ef4a4ad0bc04c97d02358404c8075ccb9bb71364352ac4a9223a55e009f548037d98f8c6f0d53715938b3fc607983a7990531605ff47322a511a7b7507eecf4889acbe8f2957dd5a2a53137b4ef3e920a2769834e23931f45f70321dc7a425b6b131a229a8c4d7c1087699c1814d751c7c806eb22fa120e07a3f7a59fdbf51c00494d1d9cc947b14ef3103aacfd51a0268469c76a628182e6b170dd8ce36f52b329f89543d85cf0d0c5b87ea24384f2242bcc35317d53e0a91c15d1c921657c05e1098611d2fda349760ac815b7c61d2da030e67aacd20358f54c255add543f22e5afee28bbeb969a661934590ecc1c3d8cd66633ed6207c7d8605a2c9d72bbf8fd6cb6652f37b51120e634c0a438938dfd68ddc941519e8545fea41fbcb2e65e77158f7bbce6c561a951b4ee6bbab3cdbb36ff2ff8e1048422aad5099f9617438ede1979361032887ff2ce2c2f28aa01f692116994dc05450f572ab435778731277000f48ae60288cb01609ca1ca60dbb48e35c1a85824934c9a7b8eede5408e3714b88fead02c511c162502bc4d0c8f33da4166c16acc1884336e123675460d171c33f20955c894bf05737a68e3081b5882f7441a2625daeef79ec96b244423a4f992628be30db48815a9dae2eecdab262f1f9c54df3603a419ed5fd8dd7e0353181c3035dfda84a06270e3db5c4e2a3ee695b2bf5391bb2008094dc4bf417547e0785c17ea56c1e7abbf5cafb40f9c428f8cb35370ab5092b38bd2b33cc88dbe85f7cfaff06771e4fe664cd89bda8f8a9e4695f4fbaa5b0bf148c6373dc77cebc0d8009c05031722303e7ff6e4f49660202ec20d6d6924d8b716364cc8ff60c837ad1086f484fcf64cf71f747bd0a72ab48b7c8ff61fc403adde3253fe6b6f8a726b20c9ab2b8efe03e6a22dcfe30f004b2cf5219f79fb881931be2dd5a5236b3bb3413e02548b28ad729b6e263c444c41d42d4162cf4e3c83e1c6985e84939a8c4c9f5995613fb353ea5f49acb808fb872f2f5d2382f451541b6b0eaa46057fae52c9d7ad15b2d2034ca8f82444098cd644d68c4d5003622b41cff80eaba989a54f1d9ee1be8515cd41caa27c85bd30875ef752e2e27d934f9f74d2d4eb94637968ef5a420a63676c83c942fe03f1dbd1b2aa608faa1a1093d9fde94e3e835ae1c40e29251a85e4ed40c2f5b7a2fcf62768650af7634c8153203024dd6d63c3d085c0a8ab720b66f022d1b9674dfc98e0ea5fdd854d48270b796c935102cc32ed0a389e79cb3fe3261537e741cfcb5209c5d4725161d2f4cb199737debea6b7497d5883567c00c967fa432b1fd511822a907ab5019e2d0289ce79d25561c95064a3e73bd54470bae829825cf1278dee01931314fb3ab93e573807ed7df3f655050ad51597e4d494aa55c08775be61c6c62ac7336454bad1bc8b9dcef3f6b8a88107f8c87dd0ac3c0d5372513f5887335905743d39cd66f20abde60bc0b96623dfec7c1d6c1962fa06495d9723946b1318609cbb7c87c1e952fe8f61beb352ab1f0b4b6cb14e970f48a730b69ff7be4afd9000572c6a83bf45168cb9948bebece7098e2b02e89b0e00141ca8e9e7517c3804c3f1d2233509100b5fb01138f8e50cde1414cb5d33fdaff786acd6f64854ff0d635bacff49aee8a62db2afdd05736e4ccd26ead9b99086bb046250c0de2a53b12a29e81b8f8241c33f737b506823c7259e9eb37ce7c50783ec24d858cf5503b8b044c962af1be529c79f2e1de78d64a728d02ec4e9360d7d69d5bbdd9a13e2a865e9cb6f9bf2c09a5bf98e7345747df37c335dea394143d2fec9091d3d3d237fdabbb4d21429ac60a0b83fa9db382dda7f0d444ecd5ac1009aec380b5a7b6264b9c4ad50b67575dac4a28e96686004f2371267be1cac849ac5b900cc51370d5d6aa11aab3d73dc102d91f329a5e94a60cca5740a9e02531d35e7231558b28fc6455d11b6b3e88dd9b8a59160dd646746125cdae8f19ccb41a47d33083e93073e67ab23d4a04f5c2f76d4b02340183720f52439083195a2964f8b661b7fd05146c1c6f783896e3b5cbf64a24aca407f3791dcf76103bf47343720029dbe239d897bb2d66d766a8ab1710ce4a1ca111d11e17ab3f29168f315d41338845bbe3ed30f5c75a0406c1d3755155a9860511bb05e8b5410dbd6836f0429687d10ae29b2171d0c2b8be71c06322ddee6cad1b6b6b3593a77a724184499a59a00198b83e1ea944ae574f00753d64191bb00d69db13db487946f03d97a9aee4b3ec6e105a0c771062349ee4d32acb30cadac76d5c68b00b26e956528f2d474a188a03489aa88744fd630f0c889b512bc993046919a97480e96ba2dd6525bfd567f95c5588e14d5c2c540393d7e11c9438e07e00141700610229138e94f92980321ba75df15de13b17d10e4d5947122e217d488590ba802142d1069ba847f060bfd6de1bcf10cce23a22515b86c6ca7f037aae88cecb0e252c5d76c113b07eb5a463ca95028861a0890bc3bd228cb77efd30b68fc8b134492b42b5a16b0b292a3ba2247d457844ba775fcefb05bdd7771fb79f40bb60f48de308a953c093a5b3986c06e0f0ca3785e0060295a59529e69007c7a688d815deb50230adfc90c3ed1df4a9f65e27c05a7272ba58f5a9165cfdf07119fcc228e0f5a32eda758fc690ef6a65b7b887b584bfbf54e7fb559202c7a6fc628c82cba006ea866cf288c7d4990c4ad44b8242bbf80f3d13658f4f1f8397349b61ae4dd616dc24d0fb3fd0df0e267c2409806439d14807a0ac4ebfb84803c3cd0d92b0ba2495fa4f8489ce8057625be66fd40cc99539c98f7849193aab82767fd2b4badcdf70d57dd86b0f670d89c24a97da7eaf510b6a73a95592b287824eb7cf21563f0f8630f767e80c3b04c202ee36580fee19fa80abc78dd28017a134093722db8b5aa122173ed4d1eb0765605bda2e82347487c78e065a20c52862cab7d059dff69c5f01ee140330163df3fbc36f989f9dfb39868fa608cd0dcf17b9e3bbe44b4bb31b790bfdee40d8f62d1c6a9e8674ab6d0bf11c151d4dc4808ced08fc03094f0edf5f73123f877967921b0529148db8f49180049836fed2ff509ab28b58de46010ecd1603680f0a687626ff97a5ffc01f63081d6063f69385b5c8b40c0c68c1efd500410a4292106afc743ae5b054936ccab21c7946f899678d57c8ea324d84228c2ca0b24b7fbf3354bc8d5697571ce0c47744492a2e906aaefa9bd2ac2084e205dd58e25d5427ae63f65c905c2b7c3c6abe82e8380334204dbdb66c32722f645b8d0e054d27abcd5773280234feeb8c7fd907c568dedd247c2bed67d547dd6fc58faa6486f50f4da612bbd9cd68c4d0b24ce2df10a2eecd4183753131eb191859768ecef0c32a5f9e26c8e85b068c9a922bfa9e216304d37c2c49984d16450e0d2584440f91edaa6ae7e6e7abb661f436758f067a9f0f43ca9b82c4edb5583aef9da02a6d0f520c3655db6916cfd8a3d8de73cb6618ae56ffdc2e16de5e4b3c86881d48934b73db6b47f144e2d42659034479b1b398fa2ad90ecf6bdf22c923de9e304070793b4d32ba7f4f05535aeb3a0af4fe3c90442323b331a5416dcbea2edc590ea359fbaa8982e73e28485e86401edc51b72560afee7c4d79f87d7e6e1703d360707fc01f17f8a23bc24e98d19d9f37fe1d19ddc2754123e878ba26547402e9367359d40ef916bc289f36a5b63bdf336a63f4e23f211a3cd0afa6763ce09237066874ccc77ddcdde214e406275aec9eecc7c85ecd666d54ff08a508af33c958cb1086f0b63ad85815eab4617d34a71f486d835602504ab82ba172b559755e6a200fe09e25d55b12d49ab4db4f4f5d134688b22e755a7f75d6316f4edcd88f87dcb8a6bcc9eaddd31d9508289271d64c956743aff3f6666f80b7774d44f5d6b35f10c31f47f6a420450c0ba0f235c80f6b5078dc5ea1abce0cb0144cf60f5634e6c24cdea5f4140b581448b6c70950995fbb5d96499dec3c12dd1260f26c81e98ce7a6dcc40398b9d1efc62c46908768c6ce60b04be82c2510f5411ac9898bcc04f469e842ab79b2abfc0aa369e9d993f37457a2adaedfcd84f52a127b854b038b174e6fabd668ec33cd8540aff6c73381732d54b5bcb6ceb2ef10336390e0747247032da9db6b275f196bf65f80d0d1eb6d06713bbab48bcef4cf78011abaca99c0df1f237ddf34a5e09a75fe1563e09425e2e4291d50bfcf6b85dd25fdd9d0174f9e654440e991296c8c395ac6bdf03d54827a437cdf8e61b7995adb6f1d5cacfe2faeaa368be7d37036b4d40fd91900ad7ea668fc0e614417bb16e62111cf5be8ccfd95a17d877a6c900fae797fa3b6162824adedf38dd59cfa949e797cf8b8bc5369bd3ab017d2cbb95fd6637117c08582a0cbc17ffefb5307a512ac322d9888ba36bf4d8928241cf69e0f866146accac95aa59a7e06115f5db1c732e7198d5ee86186709000915a5c78030966bd95c6e53e079ebff20f65f7bdadae2348880900c1229433ec0c5ce1f22c7302a32cbe860549dbb89890f917ac4141fdcb2900eb0f840f1bc1d8e083e5d9dbd3b38a12338345581e53068a07be6a1bc605617b87986124952ced9c7d199b4eaccb366dd4338b70248db90936bada8a417ae357cf54bd41e70fdce12f05eb40b47bb8bb066a3e7b3bafe7aa82e1c32f14ec3876d9f5e0b54e66fc603929bafeaa0799547265e800859f28a0671ab0c8588b015dfc2a4149d09dc8ed197e74a58fbd597ce28b43d56d8a126e508db508dc28b8da17a6880368dd884c0d1276cb9fdfaa549ba4096d30b58c41ad1338387b3479b791627ffcd9c542a65ba49232d7f94ef54d18c3fc60c29d0187e228387598f15337b64bef3f3133e8bc367a01df3e65efd14c8373c245195380ac2cb2b8760b8278470c4b1bfb75fcd9e523f5a69d9d962b4695b5f659afe6d24dbb26a0b67b857083f7f0f718a0110eb879fff0c79a80e5f72c13b64e8e206a4b36259d14fa31cf01a80617e5deb4ef092503ee1a01ad90e7115ef89ba7a92c55196d0509b6c6c15918d738fc1326da169974f6b0da7b77da8ca462181b27d75157b757490457220a7c7e93d31862e1230c578f8f11538a54148ac72338db3c11c6e494345f7bbd3ba0a486f151bb72402f641e321251c08b82a2bccfbd4d8d93204752583dddc8fb36dea1a80fda6693d38b3489ac43440f55b8337d5b3d8412ea35480cab494dd2cc3a8bfd913492750a35ea78a25bae3221590a8d5a8e054e53c9e926120c63daed779ca354b86dbdd5d09ed5fcabdfce30c9a53329e8517715ffb89d3a89a331d37ce70673158cc04e5b75f43be68d78ddf9e63b8b35435bc3812844648c36b4a836601cbad9bd754cc0f875158a627e48f6f316538fb309532b7fbc1a3051b2bc7c9bad1889397415ebdf556be1c587513ad8b04aa66e5dccfb36bc57e03853f52e73bf1b4aeedafadf7756fe07ce66fcc8a14cd8af03069a0e5e6135045f0f8830b3cd3e2e5f23b91378af1b2a22c5b4340fac8db4456a1b165d76975caf3d4c263abeff92b6ee9dd9cc379e8321258ce4322bee5b7bee0ec05357568db17dbf4df684a239ad0b678c40147e73faf5ddf2440e92142682ba82b54297ff48f1a8839dc62cd524a62e932e39d0eb2cc7db4254f210a70f80640df0aabcea7beedc496baa5f87d2a3be20124f456a1262990e93d1e850e0568ed0354f4128424504d600334278146ffc052846424e6ebb233bdb1c561709b182ec7a67e371eaefc4a09c650d7785c588455d3e5c6f2f0cf70799278a685419eda16fa0adc03883ecb9d71f53d3a353038b29fb48fd6c4c804b09e8be4de9f0749e18fc80065694ec1662cf44de97f2fe4fa9fd0cc32b04279c3b1a3bbb18924c98b524a55a7c5f4053bb65713d07dbcf74182e8fa8a7cb1291209a58deb47997b5fb5f281f6028515af21904215cab456e90c004aceac3e2a1757b8a8963d9a271a80e1856533c3844253679cc8f495dda6addbc98d8d8f0b1903b797e6f8d6736902e535e5d7084de8b98a98a265d60f091a0ff8f0415c654877ded29c9eeb95b9aa26abb6c7a21076ac8db903f358e94ce38b0adbe7f61714fa8c028340bcf92b80126181f30a082d88ac0a07c42fa4435ee0dee6fc6917dc0a0ad0db573c024d1ab868d72e876b0e428624964c952ef79fef55f85355821db4fe1e1136dacd26825abeef7971ec42509da3370ea5ff31971d5590e03de35096ccad299602a55047c8ab3485d41563196c5b4d3880ab605c73eb5eb8165ff5ee5473820e93e46d42cc71f700982a32ecf64ff1a565e58ae1a4649dfab17096718e6ff5df6dc059e9c65c4538072336a6ee1ab29d9138d017da1971335e8a71a433f6d13781bea4c80279d2656c0fae2b011198cfa13b0989e228fe2a8c29061d85155d69b51814235b03427276ee228c79a9ff8a3005e3260a942392a9b62ac89181456c40e9665a906e6ea42ea99d4a632c67f6c7958b10662b01541fa53b2e865f3641515d2a685d408db977496d8a610f8977abfbdd27d941c2add24edb67d0d86a7304cdb9637b75f1a054d228c600ff5466a4df03cf5a2b53c367050e8e7179be9e76e8946b9c3917d146c43a78af0756011af07245aa3d74c84752f9b0d08024c532b077221ee8e695d66e572a66042e65d47a505dca98578c8adb02f7d1c2a94c83f459d58f5ed936a9274805dc4ec5d29788edb8b6818d3108f0b73f733a623b08c15e176e8a40cc179e8371f04a55418fc081e5a9e9d2dec90b69cfb0ede5be668284e337c7a6cbc3209698fa366c5c413e3bc0b199c31409c729abef337ee7073b9b1e529d3ae0418054371e9da6979973be3c56b36e12c85374fe238865cfcb55e5f30ba80ef00d2bfc2c79022c8fcc31cb137c6a878f9969921d604ae98899e9d519c75d95171073f12adf00a2ae17d0940407ba4cc0cee2bc82ef564a87d5b0701df35e417cb9a113ced67f0af049aa5953c3aaa3bd40a5a8d56c8280c0b12d4f0a3ffaafae3503637c889eda78e7faebe83bb2b7c353ac04ad8f36c3d4e587c5ec1e0d63c2484b0aab8b297ccddaa1987d96be1209facf100166d11a7d17203d6950cf1cb3bef2ef2d4039120464f7f828f3f7bb99bf82d170ffc320f5f5bda400fc6a7f300e446033bc5f7ebbd4217d853f379fe1b197a3e1b3e02166f4d54394fd3a014b1ef6f3eeaed1cf8a538051b192df38f161a1afda14768b792c609e0b612c2826995414413f65cd5c6f827e922e8b8d5cdf5016dc62db320a212aac3d02a4c3cbd86b6a4381d27be74b4b718502e89886aa485784f20d6eb07a878886e2ced02a9f34d42016b8114d55eb0ce2efe413d6f0336ad4294fa6683acfcdb79520688fd7a2db9fcb9f3e430a24b3ef359467b858b3ac4aae79ec836c62184c2d666d2b1dc3ccc21db6dfcf566689f87e5872e7938524312c563545c8c7c187124f3dd1d4bbcccb0cb654d32efe785d4afa96f5a6ff9879ad1f93bea579049e46edab020ab9e30a9e8e9be68f76e2bc02c51b24328eb2a6d0a3bcce9e4625b0a9bab52b203b50fceeb063d898cf3184f400447443eda016f1874631edd5311134d726608a4523e091b7b8b7eedb22d9826274cf4700aef3f177196bfc1f92e1042be2439c77b4bbc1dee8e5ca28a69448a9014a1a9fd2d5d14b3103bd7cee397fa9d4e34f097f3491a49d50a5fe66e00e92942740839994ff9a88db1c00b8e28102f61d2e0a37e228424a33e8cb64024d34a8de220cfd2c51ba0091c2a227dc84714a60f0f9e4a0fc04cc852542216c5a756e33c914e18e3a297556ac19ad2d796e633de97daa53ed0d66ebb8153f8cd2fd01b197f9c8f3bf89805c694edf192fd134eb942f37820971df1bf096eddbe609563e7637891ef1ffd8c1f557afbaadc7de1cf4545647ce41e51444591b072431c4ec6cf094c2716c365ed2498a81a44f4f10314b15927dfea8c012dc089549f11800b76680a4dd946003ade35ac309a4c420a7517cb1399d5f8cfd91ce8e8d92dcd680b66e6dde5902a4f86df016007d489413689c72c2d4088f5535aadd953295be45b2edf2282593b14f9e77cdd4af04c2d7473b1d3b02ddf76169695ba6320271a1e0d33a00f50c024622c7f6010ece88e03e0e238af667af9d72582dd973e84bc5477593c5611cde8d79285b41c7096313bdb1431520acdae2c1368a2fa5fc7e2012f1d23d355c2bbd319471b77a22844af1566f668bd54b52b4500bd8887a037a843b747bd46dc97689bb32b00fdc518add482328b30461954db7edd1b158a3a2d97caa11059a1bf397ff81b971bd24e8ad96067edffbfa3093d7e9f34639eb5551f3d6e9bc1743d8d6f98a66c9311a14a86f761171f931200ce45d62c34341ff4f677a24b563309b3441b799c2d66b755ed84c571ac1a1747a8e2d460ae239814c142b6ef7d0f1328e11b620b956b5c5996372b9305d001ff4bbf6197fbe40f62d19396234191ad09cd27dcfa0a1410ece3a7355b4e59a6ec71da467360f0a80b9a47fb212dda2a3b2823822511289a69f3a48f6b913207d55a2735a07333f283287b4177c55d1a309be5287b23b94b4f30597ae7a843797dfc04d9d32f3826138f772116631bcdc1f0f252214c0be07a269d9f92e09071221d12e2f4df8e846d6265f78dcf95a07a6a66b2e054cb1f401ad7abdf81bc410532741465850b06d00a282c81561daac2a7945894d2e9ddb80ec7e84dab9c9444ec9a48aeb0bee07eecfb87b305762aefe45e613a62b2e1b5cd2125b945bf346aedb4f1dcb01ff20a70b9d55d445464330a0365ca78ef64c280c25e0f2dfd1f90e9b3dfb8255db412b2793cf91a914d66ee574d8c5481275f2ffc0bd20907ed232e40cf572f650f3b9b20df3c1da05cc511eb1cafc01f3460520d59540608d83bee506c9d49c5dae91f91cd4bf6af4e7ba7ca1913e0e3d22f3fed6f9fba77096a4bfcd09b47f26f1ff64785634666c682e0a2113af42955a70d68095e9567d8d65a7af37ef9d705ad91428222b88276c01a82e425c044cceb2e4d950d3109d1d1f0497bfa5308782de55e93648329c06aa7c4d0216142a4371d0ca5e10e08afc4eda47d343c37b63dd056e5202e3d397c0d212e66a5f1d50406d8c0eb047a8727d7aa0a6f5c24f27e3be894a262862960318f1e3b8ba8a44433f13932945e0108d3ff43439f5743501b415c76d031acc351ca63299f8987ed37e74d7b5365d9057d7fc72a5f8baaaf0b107b854887b09cf2a1c25a684211017a66506fdcacdf4067505129a0c93cdf33143f0cc6615644217bf6c9e21138174877b948dfba3fbef1ab9e99d5a1fdd4493b98040f186aedfef02e1be02e6ee091b958ce8cb0165eaf629331622a5c9705475faced7e17483e220dfa71cf2ae6b04bcf9ba76ad7f2fd8a07d23a8dac6a99ba8bfc929b403f86c64991af57d8c68d8c820645189038691069634454286100704555d647db9828d0007fe4409c9c35e1cb0fa283519dbd3bed45025b60a8e83c487025fca91d8e3e3d828d9a182ff331ebf1bf5a7244fe1edbbe172ea0af4ffa4445a91d168896e42b9f108de91866970c31b6d4d496e00d6f321c933781981aab303bddd364c6ee14978f6dfb448cb4882843516417bbcb6abb0d800d812d2bbdea9d3863af8d9e6af982d0f4e95a1d53ea25534bf23080f6077ca0a2579a5a810dd8615d6ed065d0981a13d10e0215410049c4f949dfc343736edaad8a42d443d0b0ef5b0a342564da2959dcae5d02014c8de1b16f15c0c4db6129e6bc1c1ae74efc756d3d74aa2eadf1236ba95ac256450dcbd78111bc9e38c0aa0c989f6c0d11169ce76ad9f1603eda75de1a7994705748b07e2fe33f707576c80983a3ab82d9235e63dcee29eace753bd8d2e766cb8966be84d9350bc082cb4f71db2e50c1912acf8766193de087a5cb51ae7897a423429b350e314fb57d0fdf3b7419d72c257df3587c919b6dec98ef14278a6c0eecdaebf830875e591f4aa98d9b15c99aff07071b1a98938496a230159b9bcb091b064d44276ac168268246ec19bd67d56453181b12e453ce92666d5ec0b18008d0f925f8188354108fa508834cfec3f84fb836fd40b3b6ca1d7915beb26c88ea44fc9c7de840d8d65cb149ac6bc1655923cb48c449a36e94c256ab6baad13070991588e4e61aba968630df9cf5783a7a0991a8593f0fc7f9fa01769feebb28e8dcdcc77b10a795b0650b956a94597120825018daaab3023cf6091bf7a9cb98ac96078f008731512a3caacf61e5f764d8a57acf0ee61661527361ead048be13be85ad95733129ab05e4d521a1da81f08107e2bfe8bd92533c9d8a756ecdf5b6b9619430b0fb5e4684d0260048bba35ef5daf623938731956b3eacf37ddcd8e268e3bc5351aa6b85367d7da0c0cf37fef0cac309182b6571fdb08775d887e75489865b6380c599551204a0a21e51e7cec8299a31180f4158b573c5cb6d3a8a3bd61f668c36f7337443d231cc60778b249ed011f3c5ac38142cb3e46fc604d40d33084180a7e4b128d0b5c89e25c439179318c088359b3777d2c4443159057c6c5043471bdde99710b04c10999538670a290935cbabc7a2129441b426c046d33421a35e9168b8d4b1b1c6ced3adaecf038539611e5a92bb4657cb937e775325d2e0b5953b448e7b9cbe586af04d7c1aa4442e8813ee399c5fa3a9f58ba7fdc6865bd27df63692294d041a158343aa41f4686de6c3e92630fd906b4c3b16cceb174e2ea7e58ebd7447d3a3d11dc5cff66820d6a0c7364092aa0be5bf0f8d6923bab94fe830956799e47c1c430c9bb6b6dfc9a649ec90baa78b2b359b288af9334259a3bd8c3437ed7c884fb94a0e5eb7ac86471d57f865326cb15618681198e001ac8822833ea83b2095fea41c8af99be51ad2c97308e88facd973845286a98a592e86f5b93f2a6bbcb72ccbe03c7c21009ed392c86cb1f97b056bad56aede49fe6489ad9dff61d489f59571c88fb64a6d7c2019ae3e980265cb43a44e8da2111a8258140c31e93c5d14503913a705a1c1e81edfa348e06d9c28b4dda02d98185868145cc43d72187082c388ace7e19ee9e2b30f4f18f25c9545830235b46ed5838ed0b2b8193b8058cc0bf5abe9b3733a735e2e61ad6a11e435ea32f77530455aa65c06be6d1c74b9e9d385d4be1e41856f62df0cff507ef5f99717c8c98ee151f72a828472a17e73b66c303054cab0965aca620beb0a43996cd91427081d585376c4f04f58e5f74387aca95daaeb2130dbc08acb4d9b81a4f98eeeed61c050bbc0e59d0a18f9927bc5170e403da59663b295e98a1797e5434df7d8cc39f785b7492fb31a65b4ef8b791f26acc252111837b448fef81b9bf0e6d24b9fd718abc11dc1bbb103a5643d45d504b467364907c7186df40c585352abf72519e8c73abc055a8e44e4d0681cd89dcad907254e84ce83b718a1b643a6b564004b9eb36b7340e834a08ad0caecb1f2576c400be6034647b248d2bd3f8a7c6b037034edf8fbeff6c3bd04f3e952fa3d0bd93673bc332b1abaa31b2ac2792fb742fbfc6d477c02204423ea1dd55eb3a0e9acedbed6f182dc80747f488a4d9cccd280f6355226e6e0473f3805489e77c3ac8b832401011f97b6283996d347e97f98d8d639e1142626365a3f186eca5da5a39712ac1ff366e63f74e8f5c4e13f40915f3e1fee2add369bb880ea668564c2d1748035a13c14f42f65c88732a26859a8fcae53f0d84c593fc8d9754df6639d539cb612b90e9ebcb9b0909caf258aa70fccddcefdfb7e12bbe4d9662936922e31bb927817be35362efaafff252f493f97580725810213b3af048ed0b1089729f1705dc2c1572a9060e1314454b57bad6f3505cbbea99fd98490fb88dbaa56ff2221f6faee10835f6e4584e8152668d1715677ec9c70bac658c2dbae6a9a8f01e6ba59b85df1cc63c0c893e04faf53af156a76bf77c707478cc177b71e5f90f9cb422f1428467b6a7c812ac44e81a38c9cdf192c85cb74c727bb016f9e40385c5114e99bc48d5cc0fa09cd763a9d80b5647ba643b0d85d1e288954c35328f1647bae4a7915db438f2f8e3f6d2aa88718ffcaa62af6cad51d435dff35f2d98c61ed1ee68399e8afdbb60aec14c7baa63ef8c38b03110d8fb44b1c5e9b293cd10f5bb0c7c3973f7ca907fdbd72ff83ff35011d0d1029a63110d1702f9d7e61827adddc5b1068d4a3879c252e494d88c7c0e1a77a7df12934e405e00f4e2145990404c44e284bed917c65a083982e55463d73ee058051ed2b5260c501812236ed8137268cfddf25e5ec40b74cacb8c2684c0df7a19fdd7df1346813994b61fb52800d5cdc878571b448da9320894a8269813e96b19fd3ae5a76a4990fa817caff7b9521724243f889eaac25cc377d6df64c9e501d8d44b30f71aba685f85b1ae9857a23d133cb47196b807d4ebb8766936c28bd58d5acad1ceb31cdb59a6826f25cf866d430c3b34af96d174df7a6dfc252cbb0dcf5fc15946a3b3253380be242e3e40079cd26d11c9e730ed48043047f81bca6523027f88a364ecd66b2c083a3dc3139907225dc66263da3513e49bef5ae844c9e4ba4abd3a2ef82f0c31bbbdff516f9d879bba8a8ce59133464d5043e1b1101a552c9f29661e6cc3031b478bd4e1bf7fac6b79e6c09125ce59988a7d1c1b7c278ac13b79f275fe53c8675a7509e6bd4ab87674206cedde3e9af682da4c76bc8b33292013c4ec41e5cf0e71b5becfb528190b58832fdcdee718987cb6ab679bff3d31809e48628a7269abf99e4ec376cdba18aadb642c990f12d3a017e0d26c617db836d2d0296a36cd4fc189050713c7bd7963750bf1059b73b1614aafae80bd0c6e2552abbfb352a34f2639499d226177b22adfa30429c14dd992354800c4b451a374f55490bd6d02d03663f3f0da91fb52c671634ceafb7b7f3e7499c3699c130f75afedc1ddee42e5940f73ce5463f96b857f0073f31476dcc42929adeeacf672f9325ba53c189fe2ebc162efc1a8478fdcd805796455cedf8ed31e87b932b751b006a33246cb2beb94ebe44a9257a5983fd1a9d9f317d3dd10bda11438323283335bc746ed4bb74f4e3bb98d559d000d490ec843cfbdd7587557d462f09ed0620f52c5c6fff7c54e4d593c3341f68405791c1e9b01ca233f029263ce65ea386b180f1e7a9cc5eee69154479bd017484f03269e4cd7f60226e2801227012f713d6abea192cfa6089383c856b4ccbc3c3e3845a507a5051dd9be7c885138d7a1dee1dd6afda4d84aec3b7fbc31c6232af11234b3a0c95c4e4a4e5cad9b56b8b325d69c257a037f38d293feb77a59c1102504f5040612f6a96cd6bc5ea000a626249aa85d0b0fd854c68217e9db8b6e0b1fe833d13f5fbbd6b0788e64961dca7c6a9a362aaa58d508313cc5fb368dbb57f48d9921633a92256bf49a13e4c00369f7dc4566a66f46732945a49baa75198abc50e170373ce3a381cb3bad4b040285654572e6c8213e2d2b8b4407160d4c17695a5d5d9d653b16a12e39ba490ef49ca9c075f2e01c701f725a5198095803ef4601ec5432026c8ed9d33dc38ba021458c24323bfc2345e006b5b029b0434f28e04280ed1443058f53228aaa314cfd1918c2abe80c4aae3f5582bef8576e4ca7a78912fdf9be2ac9d690852cd504e07e59c8faf35bca2a785417339674292cb5a19659a8a98ce9641c48c35dc831bf61d24b09c78c2b67abfade50ef405c288b036d6e4cac9c1271411af959235f602dc3e4e7e882406110f4e47555b44d04e788956e33439d81f33e5c318e1c156e148c10e003d6008641c26d0593cee1282e5acf7dcc4eccee4ed4b36b48ab3ed1b274046a83a5f102f808aa17062dec3324a1e1e6d415ee1e2257f3f93400cb5a6efc1bcfc517024fef04e0a95b3da94d40aab810f24943854a10dfb89b9cf9d0d10fb68a61085800ba14581100af53c3c326fb103c3c9ff012d91db2d44c31579f29f522175a470c89e8adc62bc1a57113839711395c94188003edf748e477550387d636b3f04debf1d65c1974b39c75202235b2ce9e5c5743148224632df292b88bae45c77ccde542c9ca16864ebfae169e04da5a365b1714c72460d4d4203e9385ac86be04c99b090bd2a071e28570b2f71a360324c0357adbd7fcebc8d65c1693c74956ea85bf6e7d823c0268c84ce6a57c7b48e23205e15bd2a68f43606ef4e8d3fc2a1fce594df950c95717af73c00c845b10e3e2fd1d168bedd362759654d113902de61c25859292b152529cfa200dfdaf6161dd96585be5a6dd9ec6e5decfcbbc5f78b99b18b9481fc8db9327b1a384991109d01a804f38756aba10baa0324c6487e339fe2b0db6acdc1096c1051cb303af0c8278869ad1439702bca63293634ddac1856f0147b082fe6332ecad08829f34a72cbcf969c5a24cb1dca073bde74e0cfd183631dbdb1870c0ffaa61d82f80de0c6c4d616a3117574a82809c06a4883ca63e0314342550efc395355540dd8bb8e49c844818784274bfd86465350a8987586625e41bcff984f6edbb440f1ceb42edf8c759aa184f3ee9fd0f06fa6769f98062978f7438d36e72e55d9ab190ef09b27037e477193157ae7b8cf9e808c3bfab668ec1acaf224cf21a41ae7068a34c2bc22a518129f7794f966369dbaf0984c3b4f88d070ca32d4b988c3a18d7bef087233d6ec03cf20d768d41c5e1eca012e434aa1412d08026a5de46c24cc370f8d387030657ef46d4e6744f342070c77771be046210bda3e075d27a4626f16e6a87afb45c95c524aa536f00ae2782aa0915cf5e3bb038159038a58ba5d1824cb04a237d7a94a842d3bd075a37770c7edf0dd11b20a17fb12c05a8223278d57788109a721b8052b0d3cbed9eac8c48e4ffc83e97bff6a9b184118e2c09169e79e16881127df462fbb4f581099a6031e7d8380b9f5499640dbb1f1a445d02d3e9450f96f9c8a5b43eb4e3205527da9fbc799eb5597bd8c761808add79c2e59d0a2161e02f60bcb96d2013f78d97a519f5be94a7827ddae8f6af915671ae50716b64098a2d9b0e309d7158b269248dafcf3666c47cb08d52854803e6e20ad4173e1d7a683d63b9b487204bce22a2f18a2ab87f0a44fc846a3e4c728c2691caa226263b1fcd6a821e279269d0e38ffd30d852947008a180bd1ab7e431a8fc83585c8d8968ee6fb2d6daa3f695837eb558064ce81d3e4f23362c7a30b8def0e1cad6b527ada0df038ed347461d956e7fcd60a7c98bd36b3021513a403c8148f181c03d8fc3f04cdd2b8f8e4124121c408f9f8cc945ef9169c0c8bf072c6826823242e077f2325d6dd0f5de852dd2af1fcfe123cefd014de7237839ef4ae393752bfc43bc6ef06a2339046561c81a5026660293186a703631fe24a76b13323b1509dcd7be0ae1cf6c6922f8013756e8d71108f02ac42473f21f80d70e710e3953f5f1690e22bbb3b8594837409e3eb7519699ede13d5ca6b0aa33765c198d4c0180b2cfbd743afc36777a346276e9fd27c0fc58e10dbdadf3cd45540204d718cd52f8d87313d44fe9b6e9993e519127981878a32203437695f21a5d421d01a8a5c68de7c23042494758ef5d344ca8c3d063d4cb9a570e736ec3e824f575e5d59093de70b271359c5491b5997d2825a5af0112b89a96897d93dccb15ecfeb0488b83d0f731cda2e920e388728daea48b29a32b1adf517079f3345fb296e47365df70aa9598a735e317e060f8a9eeb5c2bdaa2372c3bf5bb2fec4059703a62a0185f0cfa94cf734cd26ed49c06f7a2149d0e7eaa628f588e5d5afc74815b24c04d3e0d306e0ee0a4954f2290d94e7163d5722252b18561f1f5c1476d6b1d75d000c0cf8de0aef25ba24d976d7a7d128d4e2f9b1b41e6d54d5d5bf9397ceef6c311ae8b3a08fad0dcb013a1424a22a65bf7de311aa487bbdd42e7d12797fb46016fd41de6effc87ea790049b86cd186e31c56c448b8554c416482c96d423bf7e449250ff8f1f35d52e07b3188ea7379df6ec42bf30129fdbe06e08eee3481d8888e43ee481bca4363aa6800f53f4877e2ead080625b3e0bd0c71f16640996830d79e5340e91ca80a94e565d94bf4c8134504c581b878cf64f3e87f979ebf9c6a8858786e028568580422ba525584c8b24ea4711b217034fbbe97b3aa73824ddb74df7baaea1fb54b7cc6659acd7c2df81ee5b88c1e7e6b93c82fb04af84b5d583e3e4cb2ebb9a32191397f13b648140cb165fd0803256269bfe1d4020e0c01cdab84f30c5d2b11d43a57c7c3ef5747814508607ec20ca4645a1a0a3e2445d96ef6dc5f7ec5c7c73a9caf42252370b34617b92974017f9924b66764b4e4ecd2fb5814afb2dd413a8a9b12183ec19fed07b5d3839a2643229051139805de8821b962e301161321b1823398e7c3ad40cf155bbbe254af605d610aa6b9f2635b5c065c443d515fd49594053ac6d54ef8875631679637d65f12cbd9542812b57722090da030df62683e30095887a65d7f4e28219f3ed27bfefdab21a31b1665fe59101154698ba9327ee232453eabc5cf943d7e14e33ef703e4b00f891b0e62579567ea8df6063588001fc8edadb34c76cc8f49fbbdaf152e5f60e11285d13358869156283211fb0dd002962200707290494e6a6d07fd22cf3888e40b44d7f8222df9eef51ad11a94117a706c241cbf573f44f6fd502fc345b68cd12ed202b8b89d1072dcd76855a410c889923400d1f68ab640c0ce55e27d8f1e5dee76480523b45abf216863e158ace23579ac4fdbf069fab8476a3afc580859d170050d2d39086df7be33bda9d9881e7a788de0dcf7bea40905a6bca36bc2d04dc81d692a5e11a7cc3a6a7777731c40651a2b5da7acbcd00680c5d476a74321c9fff4ff3085b7eb36103cb0bff1e9b38d0e398e1f9d67c22288c1257ceb910d0f5942b26aa0e31b08bff4c1aad1cf151a952ad91ac6889b2a79e076ac00df04183578208305475e7453d6abf66c03ede7bd3a9bcbe386ec8b3e56e5b3643d97164a06a4e1e04ea7c6b945071fd73c4e12275384f4fbee39271612add7343edcd19048e3dbc72cf78b90bb2927d989274122064d39691326317055439506bf101c5c763070f87fc5cd8233b1c229fdd02a64bbf2792b86d864eccddd7c21a133846ad737deacbba40342702d3ffc1e8b83dd2c273e0cd7bd2cc7691dd290118a64c3965e1615df8bda12fb1218f3b5a0c9f0f79153f4e4590436f6311a08ee66044bd8b8a534c674385771d0d513fcef14b43098489126497774c0ff59ddd5de28df632ccb1a353b40ffa1709a40a073b303ddb557532422aa850e31949a768b4e7603cde96d075c87e492d291418bed49b96cf69e3c651f33247a5e9400c698bfb665b3d5a4addecee71c0057c84847a65a4b0af2f42660d02ce4a8a8c907484038ac40e43092aa4d050bddcb00afbbd70b253bac8233b753990da2223c17f2f03354f4778c8fd6d8d8b1f43c2b7c02e809c0ad65822e5b1688c1f70f0685d0c31742c2886793bb122ab3cc047594d387930b10adfb88ce10d84703ddb75f393dfaa24bc903643b889611c7b03d9b88faf7060b5c43ff8464a42514c8237f1d8fb11bc6c44ddc952f56954350945a02a4fd537c9caad27f120bc8e3278f91bf2b68b998991b1955f374dfadf87a978aacf0fa253743b735678f36bf52b1ff1783f92589e1394568e5c7ea924048eb632facbb07aff3456fa96ce301c4904173ec82c728007a2e7b9402e3ae81b1fe51e980cd41b5b83e079181389507cff283a610c1d4b0aa06641344933bcadf5f6248acdba454bb054066aa3aac8f40a4701a20ad8594a6fdd14a6db03b961347f407058cce7c18cdb50661b842a081ccd7fdc0de7a0f4428b37fb09ff1da08e912d083ab20f3e53fbaad162aed0f8bbff263bcfd34978d2a78e08efca093ac15d8011337bd7617c001d4b5c45253fd83edf9151f59b9b280dd531b3a560b21d2aa37c77c9d25b83a343b993740bc5e568e49f22546a8599d622874e276aae802166b2583a5b5503cef5ae8f1af4c6e5e1314be8ffdaa512705cf7008f849a45cb4c473585e6f892c06f620954f76a077b3c92cc62ca368f2de1847a8b96d7eee47ec584bd8514a43f8ffab21bc07b41104daeb82995c30ccba9a0e251d2a102168e36481dce2c0d163f09bf18284e080c6488505424ba5c256ad2ca04381c9334548b60574387598b96fd7f1d76954156f4dfc445d8b88ed585ffc2104c7858e5cabde0b8da691496b7bb735b9a594322519d9095c094609453b64fad3484b9e93274b261268594af776caad6e49f5bc77ded7bfec7c4dcb4442510f0da81f5e8061ca0b9313198511605831005330a165cc172699116392e4f900f0e1872ac44801922d26808225082856386fd4336008c0194c9c0126d7c7e027063450810214966e505a413a0d71c39c73ce1e6f68ae7274ace8c24486972a5670c40a9acab0a18c33c4389921e50c1472fd1ede50ad2408a28647ec124446d1d413793e8f8e183c5480058a29a35c7f07930a78c091eb5f20450aa6b0c01baa1b971c1480494111b97eec36f9114956cc39e704bda109801e39cc914222d725505084822272fd1d6fa8ea3821b50206b9be0e6fa85a219ca0c97133986fc7c832c60a79be8e37346f5217343806500031a41003863c1fbf5e4c4a00c316585280c20a098510355b2b7e07bb5b8c10d4e4f99f373473c894084396411846e4fa9f4385eea28ee45adf460d91ebdff0866a17f50421b07202a65cdf863754b7271d308ec895e96b784375b3628a1f2576f80835608a57a2162f9074783145982861b6f862875cbf07e88b2e72fd1f4082e4784375bb225a10ee00a36403cc152610c204b55c1fe60d551d1474395dd472858a92ebbfc010e5fa34b0121266b821072eb40c219f20620515ce1417f8708145174170a143aeffa242b48af7755dafa09ba6e2eb17242e50f8c224d7b7f186aa1135d4787122cf7719d9e450e143835ca3960aab61b8d428c68a14acb0a28b5cffbeac3023d7ff2b9ac8f5412c72c8f57bb01893eb03d5b8e4fa3fb21022d707b294450a725dd2e2895c1f842d74c8f52d90812d98727d225e6878bd6aad482899894133edcaf34a9729baa45053830e1722b0105197b8c872ad5aaae821572c5e86115dbcfbbaae976b56c18214797ef73a620bee36518124cf5f7d3184956b9b9e92c8138bce9309b9d65a6badb5d65a6badb566b92087ae297c9862cb0979fedd52459e4f5f3f905133a3531679ce295158b5d65aeb4e9e45042db1f7058ba2498597164734a2c832bbe1128563b7486293b76d73bdb098820595d78d422a494d97292b6437d784992b8b231b1750a0a9c2a866861566b67072452992a935d14c79e1621135c3840b2d2e453258acc0d262ea66f922ca66191343b785118b89122e8b266f04ab2b689d9621544f9c653a62b718ad66d32ef1586cf2c4633187f7554bb2802a9cc25861015a142d69197364015434a9b0002b8ea4a02149920287a2055cf1248514240be082f4399a4c6dfdb295564aab8e272e8d1c9762b872e472392ec5c0c50a3184912403d113198a7ab85549d365d174b020430e3218b1e446278ea0e59d2519a05892a1cb7dffc273bd9c80b224d39f5132998c05195680a48b4ed470845ad0c2ad39c18223eeab091597660af874594a607155392e359122ff52932b4ca83a4930189d48622ad31c645cbb45cce8da1c979a7851c495c971a9c91832382162e2ae725c7292828e14eecc71c9c9121b392ecd30460fa782eef60ebcd0c20d2fc8eeeeeeee186eb6736d312846cfb12f6b73fe25c494835105827e3ac3c9184252b6a726b8ddb382843d665cebb13e2342dd07ab5f2b16c27a0e17693deb8b70dfbd11211ae74cfeb45e7ebc2dfce2aecc7bcf61ef693ecad8ccdf6dd24209667e437ab2bf63a97463c60d6d035ac8fb8ef5716db749eb240eb7928c612bb7f3be48eb65dec345baafc1600d4c9c47642d066daf3c49c8128757929125966164f9f3732207392ca5c615d785a5918cc999bf1f8258cc602040637ce0032d5c448a90d6771f65ec65f007baaeebbec320f88005eeb7f0c5edf4dd87f1098b16b64464cc7bcff3dec320f80057996e7fe8442d2ca50616f7bd0fbb080bcfc718dc772c25077fc95509799f0ad75f853530a5d3978bc3885b6bb88e8d3c87e0affaf9e1dce0aade5ff5dc6c99a3acfdc8300ee563c70e9dad8ba1edec6b2a064510f42efa916c21f9124a3a5296b827cfa2e8d2684a1c76b307190b5142f16f0ba7466beed3126ace6613ffc148618ca498299b4573891f492319258732cad1e752554297e240f553314b563df7f50bc17f72d063f2064b407dfa1c547f0e749e2a2712e33e2a1c420d679e218ce0b92ec0e248bf10fc371a427d7ffbd14b802a048b00bc7909880e4aa9fac54c9b62507de95f8b3c3f93c8634bc41f9985962b57644d8350d67cec78bd646454d39f1479d8978831f95934451ee9a59f6a2a2b8e43764327f269244a9e1ff3c4b52831b2d6535ee38c58ff1870f800e4a5c28d1ebee1fe7020b2d25aa794524a29a594725229250754f5616cfaad1be2c2ac94db263729e595745220b449bc575c07e2df06af136ef430941b46a60dbaa393d2de6c383d95f3757c839e5a5cfb405cdaeda3106c73f78a9baacb7be50c0264851b9970dd95ef6d822c4109b61792bace1b6a2d0e7abb3bf548bd9dce0c8c9cb41c4d1a35256530dbb918db5dab238f1affc3c01e5f7212931d6a7af48064d2069bff74cddbe994d14a14145d249ddd1435e53eb2a1c254713159bef5861c07894eb20271b3d70f241079e4ab96b81209cba317686e28f9e3a2f93c8aca55ad7c48f58ae72742a41f1a41c24074caa111a41cc2fce6def5c1fc6dde8810cd07f3a22330999f79966c72c1904fb27cf9c47d4287923469e4a054d17db9c47dbc972f84e65d2ff33580e65db2fcf120dfb12bf9fd9c8a741a6e3515717dcdfb27858585b8de0617b179d7d77c456a9ee6af1897bebf74288fa202459372b0dae028635d83a3941bcd93311eb974d93d329c51a8bfd0a964f93964dc501ee121aa57492877a92807a5fb181c675cff469247625c9d12ae7f9d5df9b11eb9f263457271686404528aecb8a37040b961877941b9f2b54c18910c4b40e71fc8c854ca96c1acb8321ca1e6f72f00cdcb775acf644c65853e31e2b8012021414145351d4509239dc8a14b1d4d41426a922f9f38b9d374b8f2639634ea94ce9671b21286caac84f2c88a54b7d42487b28b4c924c5dee510cdab23c8a729fbcf84f902c2e618162924eb24ba52d619dd454a46b4992f2a89564902ea16a209157dca71fe93aa883918ecff151e76b212ec77795acbd5729c7176b2c71e5bbcf741a89ce21c7e74daee40298b4d3f94c68a1300ecea8e9f704b7a1ba269b24b9928d25f746de799d0f811e082e4ebcc0c504a83184e6cbaf6b2e80f939e6ebf86291ceefe0225284e4f81cb888fc4d8a101daff345e4e7f8fb51fee8e022fe3a709431d6b33ec71765ecfe90b1f96ef3fae834609f63ff7e278536bce12b13c1f11dfed5f7aaff1b4f3f4aafc6b79e88fc71190e1cda0f87afc7e1dfc021986de01a3804ca3fe48f7b7197cdcfc1a187c9f36138b434f00b872e26cfbfc1e1cb06879228cfafc1e1bb300d0ec1192c83c39efc6ae110c89540599d5f2beee1121163f3ab402d912796dc4991677e9ddee4e0fc39abf48e945575be28e4440e4eaf1263f39700b1e449c5865d8989eb8e83882b8dde5949465d6ef8b1ff2a03c04028f7a7179e73832f8932461bc1eebb1122d87d47c4ebb82279f52dc580b2524e282eea6c51c6de5e4e1d392bddbe5b750772b95b712b1528bd0d883ba3cbfd2d3d9244942a35262644a13f29729f965522134d2abb90ea48460a555fc6c9eede906398fc2f7706024b0e5545d51bf24ee6606fde90e3d8e28676ca4e5931d6be5ecf7943931e1539d81d11d20d3b5957f41a81aabeaf2bea64f4ad980fcaf673fb8ec83b99fb548fe2b1d9b9937545ee13ab4a36e52086bae12dba45ee538418395415d12197dbff70ba750d1c2e4d8e5bb68c206ba0fd48ca7268a537646be470433f72cae176d4e3847b73e5aafeb574433b7593c4a54734949472d8c972ffd1a447b9df33923f5b918cf51fe5de68b93ff490727b49b99f4611eb4b0e3d2bb228748b84b8e1565494fbb7221bb7a2dc5fa162cc63ac50381c52a1324c7e14f2280e937f24e6fe94e4e1bae34e8a314a96c450b6ed3b6a2a777f03a6d086ed94dc8eecd496d4b84706e972016b2f2d6ba5a824d418e6452fd418d64d2e112b640a3586f513b95063291c44107463c08893a21cc470e1c315412c49117534a3a2d4b049c0095210484b556c01430b162b284e0006892701133932753ed0b8187f36b757c6a8c521fd4ae9eb65ed638b438c514afa93cef8515c8cd14b8eef4a3551b76337998a5a26b65de692f27cf9752698fd5eb38836ec47fa21e0d0beea6df521752d8675509f6e1d1ac9f439efbc0ebed0089df282b813417ff9e188608f18f3ffc99e43c38716f24608f3733831ac83cff53fd74975b044e83179e27f9593ab56d56e5ceb762c4f86c635f3381fbd211a35df3eab5d754e62065ef4688841d5d5e3a36bdd97f9f845dc87f5f17be623cdc7ef27add44c34c2d6f28adf556206eda57bd87cd84b3ff149e0c2cf0cc949f48f42d481e8df474070086c890ae81efea01733d8d13dfc77d830176af310503b281a384d5e5e37b89b6c70e85e831baa9110e0b9c6042e9a9e4599cd198f95813e12f552e6b6820c6179386c31de6db647013d3dcd75d4d7611c7429f7b73874a2ecbfe1b0c5647f2f76646fa8c8e30ffb0eaa280639ecbbbb63b7fc09c31d06aa4a4375e1331c9791eaf999423019ea8e0f2304514970a92d2185822c4d542c2b54289c4890274427011347d4b6265078188e7208eee8f172648261492da1d229636cc5e860fc5983129b5015a24253889b1dad1bcb0acc4686f5aacd93a492c478fc8ebaf225c7ee22c76f2f3108a78d9cdae829c6be32a5ca94a51cbf9562108d8f4528e49824472639badebf9fc87cd84744eda489688841351f9f7af6145bd64443c808139f480ceafe87178f31c6da1621518aece4b129c420c7171283bcf701a44190dc9175a2df9cebcaaf0ee7a3dfece2099c4fe626314a5d3c71c3062c49eaca97dcef44b98bdc8f63e3833dec6dfc8d1b30182ceac6d719e7eb6c03ca0b8d8f7ef3937949889c1a9fd3942a35a4a7a51a9f8dcdc33ee7b9ce1bcab1b1b1b992f375a6f175863129d1f862c6e9dc45ce247751e4a9f968cd376b3e995b0437af2f03dd4e723f95dc35af4fe665dee66f6e6464648e6ebece355f679b36ea2691a7ff8bd945a7ccb532c098a1f9641f74d110329a06d5b35a19341f8bc5adbca119160bcfc88821e27d747a9fcc718ad6931721518adc2fd55bb2773f554b019dbd272191a7df931ff50264a7ded413000d72a62a4f0146b2ca474f4b47d6513f2ff7fb8edcefad93376fa8d6ce5de4e98f3987e8f63bd9e818153b2bad95ee94e0cae4c8d40253d1f572646a61881c2a6801e97e0b32b8a0baafeb7a41c9335a700188abca91a98523605a20daa1dd9a239392339894444d2f48321633a53b3f5c1a53e8d002450e9fcab53932295122ef38a14409dc40491253922472f83d3d4877f98fcb63fd4aaab9b13c57c751a970707ab23eefeb56d64655b3727134b6bb92eb64951b9098251ec113d063c68c19d31eebb65a57a6a37165a51c9d3ca95743bd9a1ad652afa6c6b40102410bf6006d30326e38694c98bcd1572f8f4e2b99ed7dfda42c20dc6c09c620dfe13e1debc8838100727f3880ec1d1b87e6ffc69cb37538295dca28a594aa18a5a4966e73d6bad139638c314629e5cab9961de99cb3fb557fce3a65f458364c5c8cf12565534a698cf1467635b8bc26add1c53bf2dc2e8a09e46084d9703d3796db6fc3ed0cb3e1469b29433a5d730c4ae30ced628c118740e594b1975295ce6c49c97594524aa99452ca158beb28a59452cab1ba19b59aad6e46a9ec94895bcf50cab9bae8451c4ae0ca6ec76f88ce53eaea62e49194524a29a594524a6d7c8cbe2ddc7ef9b4bb439d1c256aa5b5ba1cc442d4248fe058667904efa93c82e777106f5b0e558ed5089ee387f5e72aabb6ca7539e2d75a6bac35c6aeb6fa7632b5d63a536ba5b17155cea69b33da5a9fbb795557df7412a0945219a3d71fa2e30dcdc773ce9b5965f64c719a4637a51ae6e4258fe0596a86f4e5770f05e7e33c75725e37382e53029d9bc5e95577f7a455ca2e5772b9b252dc45b3abb8928a2b7174b0b3a1a1abf1c2d0b470984564ae6cda9a6290dd2d251829c1483926090d5232f13061e84c1266d231b015b88a3b779e71b13dc33a885fe414814ead9bc579e5f8bde2b8ef5b71ddcb7d54acf8ed31c8fecafb4ef515c144ba2d534d42e4f1b7dd4d718f74d11204c82c71cfa43062510f37ad9b5e03a4d00a379216aeb3e96a3c8fe5b2400d04164d6bc6a99b76901ef03a9879cadc1cbf08526e26d6cacdd0b4726a60d5d874d14b6edc9187bacd0d2701073f887315243ae174919b9a9a542a2f9c4b94d3ac553d7d57c96d82e5745064efa6d844ec2cd97d065a4e8dce02c10a883c37861a366cdc90403d3d3df267c571dfcabfb8f118470caa407afac7693247cca0a3ba87bf183b56756b50345f254d164af4a7adc53baa33e825620f7f2f5d8c7237214613f7e1d078dde0ccc701135bc1cba8f20512313098925049929464ca28989220fd1b4d773a414b122c2fe2a27325994cb66405160a52b49294548832836486d73243c76ab574726b47abd5f25a1f8fc8ad9f2d26246372eb6f95dc6afdaf00456e3d8824b7be87052772eb8156c8ad99536e254912a3cf67cff33c4f0531d93be2c4a4c2112ecb9373652e27733f392e8527994ba18bcc7939ca036042a10935b273fb28c656837664ea23533a001aaf6090c3a8a50bcd804ad126f2c9611fc9b49768403f66c994bebd24a420d37f2165fa1f0231327db0042032fd9e12aec8f481984a1893e903214acaf48310a520d3ff000428993299e045a69f01fa44729089c08ba21e32653ae14ba64c011f975799f33af9a9b2cd5cab93df96b9dbc9af669ab9998e867375359d8d8b66a6e686151ac9b00e6e3a37f68091d92ea6a38e7bccb9e1c69f2a748c1d63eceed8dd91c6ee27dca42f99f8f4affc22209bd33d467713b8f84831469d3927954e1d989c2955b6fb72e5538a6d94f5ba125b1d816a256537b74fd2f9d58f66d5eab33182f4adfcb939f5bd5a6abf036bdf1b52596c75b0364c4509d9c4001de3733b5f1402bf22345000e3884c68e7b92e020267e14b91d0055f040400e0e2284a28f616c8b80fd991675ec6bf70479699f91fee9fcccc476f68c6a6c647cf068d4fc7fff0170a3766fcd6b5dd0be686b2c88fcc8e5a375afff26f73ffa68efc6cae09c1fdf79ca9c30d5f5eebe2e0d3d40d250ddf7cbbbe717c7b43aee75c2e3a66cc182c3947a5aea5399af33b1ff70dfe0e88fb776cb8709f06ced30f07e77f382725c5e108343ffd6cd89367ce174aa770484f479de04a263188fecb071d72c5a1acc1667b4614f9c4084bda279b3868cdb8345ff3f6551f4a1a77b3a972a85e7a43aa8ae36b8e987138def960f279fccecf0f0653bdfc0dfc602adc001ebff330893de081779ee7c1876dd8039e079f0783df12fcac8c71bf5357cfad6256e178ca89f023cf77bdcb254254ca12873ff2c421b85ec7ff70ff5cafc3e70f77bc4d11b6ed13c100746772b223e24ad294f6297d42975c7243b90ffdde41c096a964b1581deb6547955a0afcb61b9c100115b42652fe944e93d2734fda6c311996fb6553948a8a4c4952b925131130e4502a5dc9dd3fa52b2146892b5f02259a6c9c4d173d0e74bcebfd73fd8effe1396f9f03df88d0dc79f085ec3c08f3e78932362516b20373ac0121e0f3e0223fb003a2101019eb0fb283ed86a5c03e0af1f0ce87bcf20f5fcd6ff5f60b3fabb0857d21d4bff987b45f97f375dfe3e3b103fbf09837d46117eb69bca1d5bbbca1ee5d1feb7574cf7a6ef5dd2865afcd9a94a2ae92d39383c0fe90f31ba1f3dc70e0f78f7b9a83c3435e19c7db1c3d1cffc3c31c78484fc6f1f83f2917e7693c87f3859db717a5b1610cf4641d1adfde100dd8f7309d8fded01724e7619653b9761e076f3938b4301cde1756816190fcfaf971a0f3f7fd0f7f7da10e6e3d8daff307e5869396fb713c1ed293bf9f1dfe6cfe3e188eef93dfde3f27bbefc3f1850d73dc0135caf4bf8f59ca9c9e6a505153535150b5272737f223a424a5a626a524243f8a9a729917f98ce6349f4d452935393dd5a0a06a4f4e4d4a3d6b5a1bf511525212521fb551d37a166b112a2a6c595117b56c2aaa07282af5e0f1f100b953e6fe87b7de88833c3c7a7c3c3e1e108bb0e5b033067a3287c320f987e3577d18d85e7a43f8fffb42780cebc0cbfe5ef6778c819e4c7108ad973df95b2663fd4684769e87061c108544e0de0151087c1eb8481110708fdf791e1fde1e9fe411b66ce7a3d08e0f63144f186b418840bc835fd25a7eadf7aff53c1f2cc88e8771d8015168078e3226b4f3300f5a68e75b6807f74cc65a166b29b5fec6e79f94eb5fc36dd4a851a3468d1a356a7c9d6dd8f8ba461b19b9769ea3f9c2ceafb7f9866e705e62b007e855bf3dad6559a353df5ce539387cc1f04603d315b698c3385f3842cd37ef72798d95351f63cd4b0cf6b83e04ba71bd7f353fbff0e6dd1baab979aebb1b8c3d8cc76a5c51f2d1915f71b05fe67ede34d4c29ee47ddde746df852b4b9afc89427d5434739fb02ff87c890ba0df82afa75c00fdb12fba00e4e7448d50f392dcdfb289b4b966881b4db511c881bff33e80b2a4d5ecef3407dbc886eb4d6a9fdcf9bc04c42758c88edd6886f2481a6530cb270787b8b20a491483a2fc96e1953e2e254dd27c892bb32ca72021d9194c49c6fa618e3bc98ac4342d4edd4a2d3b9a328a6a1a54cf6a71aae73df6c41028dc3ae8595681d093e50f395718033d5985c320d27654023c3066cc18a7bce1213de0ce178566974b8b415dee974631a8c34cf9f7909e3ca427cfef28077b4ae9facff61026ee2929cfe17243497bb2f3f40bb0b3f30dfefc064123f7a118e66fb37fcfef89a11c543d216950547ac8b2cbeca79def0989bdd41cd4a1a5fcc7c378acbfa71c3bd40ac9fd9e42eb3092d6500ef63794910e9f8018545219e5766f6dec6926e647fc3b3c947712dd34504a95a69cd035ed0195e74feb2428e28c07a294522a71f28422cf773a060633c6488113279c7084a48288a93a43539e566a92ea4b511493932f96cc4878400b3424478c9824c961f60025494c3308a1e40149a03a147a3607bfdc558e4b4a4e782d2d51a2134ea5ec7ee3c5f599776f68e667e48cfc5519575a4e46e6391919ee7ee190b7ffc3657dcb71975e7ae9a5dc8febe387b688f8e3c231c65898091a6c25bbccf159cfd18ef51ce775ed7160bf22c929e57c6eca29e5949999796e662674654a714711417a1c788e52463e6c2e711f9783bd4d23ff79e43e51fce72c923f52d692fcc9bbc830eee332647feb0d61e9bc8aab57e6b8c8bd27399555197766d673fe0aba00c8d2822c71228e3f4e8b5f0c8ab97b80a4bfc45362a6a46c6aca5a6855c6ad1a90b28fa48f309e6864f23a80cd23da7d2865f3894c5a7bedfde849a4c8e3f208c71137743146fe75e6412ae54a2499342391ac375d262af5d1d7aa54ef17be72eb0b6d9e42ba1269db5e25b1f538f0fc23f2f8d323f789b2b5979e3295dda5cb29739f302acd22f70925929c9262e4530e27d13c92fdeb064c4d9eb237921e20b047de97b419fcc0b2a7c9ad1543a14940ac9227f6e13d34df061e73202986a43aef9da424e33a50dc6071c3e8247ffec445a450db42f2e9c4b097833b40f901f184b8501123424032d61d6b4e515f28c150c5dd9d521a630c928daf74f9caf366712b0e87b8f0063fb3e31fab14eee7f0a504be72f74b8544189d6adb10d50417471814700722bb39a7063a87ffeee3ca9f41087bfe3669ca91a949d2528e4c3248e56792c14bae3f9da4bcf1722703e2529ef89b4febcfa7923b32790cd8de4a0fa828e01404073fd672e22b7b7f54124d94a69c90bd8833b2632b59e847dbf445fbff8cecafe39fe3378cdb0f5edfc8c8b4bf2ed78d6e5b75291b241f5e3c76d92af5188a5290fd75bc658c42e215c52aa1d65aeb96335a485070220c192238b2811ba0c6a0a054c2962db63cbde045f17483122c6242d081394185e7cc781d95540ebfc722795b69ad7495040d546011a3c313a229b6b43013c5161c9a98f7755df7c6315a48b1f0c2d30c4e2c4df1658b628a3050ee65e264c3840b2624a0b92e262652324e8e4c4c96e43075d2ba59d58aeb58565e4111003916c522abba325f6c2266895c7e8b1cff00d18bfebb86a5e3a4322a6b9b71cd0a04fe903f351f7ffb2800426dc8c416a0ab4d8c4c36400ad16022644c7d2ec47577bfeebc8e2e57adcb39e9e0ae643890b96d0ab7a7cc8c4a2929a986a456cb1b627dcbe3c0b3ea672c919679e71ff88f17452872fc05b8064282282006a9b647723b9b4569b55adf2d3cbd157655dd6a48b547b2b328dbaccea2047902c2cd7433ded0f6331e079eebd7d86c1988535ea441d105397eacd66a5ddbac962405f84f276d76f65ed4b575c6acb596da95da14990fa88773b95c3536b55be5b420cad9500f4c1b1b9b9bd7ecc95ed4b5eee17f5f2f3abda8e633236a2de946fecc7cf8caf672f78b4232ab4c693fab85284ebfcc95f9eca521f18412391a2d9623b1fc6bb1d6760a0009285cbe2c51b3a20769c50f38d81e2b434c996925994c76245ec9f406a554504a63971fa464fa3f4801b104105053aabc10c409327d20415ec8f43f10022aceef07223b65afed0be48354cd0d510aa4207e90c2f85025d79ff186aa0f5b7c209190e75f6f68ced083095a35381080872ab2f42025d767d9d04981c20309b9bee70dd59a274c5290d0a8c9218a19b9d6e7bca16a8520aa5959e014254b14151130b02c8f284620c5084ac8f3b74b850b5b6badb56576108369075a9e4fef9c53096fce39e7bcb88acfa18f5cc15cebd10db91e89c9f51f9c814987292865e40a14047777a0687941060c0bbe9ed490d84cc9987df2850a355a9c6c9e4c417125d560c181862317682470410897a32892ccb658418896a3308a8e987020e30425990bd6056e8b5703926ddbb62a68b40aa3cbc311551551dc2b872232a5db539ae569cb52dbb2406d59a2b62c531edbc026b668a7bd82a6ea525d2f2b64326673f86205da258a902e53b61cca6032a5a02205d385b26426048b1294274a8438d5a008a144c8144d509a8e087932fa9e90b4525a2d78e1d21c979a5ce1056dc9c9931811b7cb71c9490f3b29383102cc618b135c1a26a42d3a90f0e1dae4b8e4c48a0b922c39215a7232c61126883c168fd825b7c9eb89c72213513c167308c68e80628cb991e3120d496a947d4efeb42f3fa39634c924c6ecab24cdeca2ea644e30fb8b946c5f1eb98c1283aa945f3b7ded25f2d8a75fd71cac12833afbdbb73548a61dd94a22b2f5215b1db27d570e97ba8e6e2869921655ef82726592fb6c336f5f1a49c9e1502a65fb5151dcaa5379181e1585fa03e2ceef1cca999cd99ff6673e6924690edadfbedc9837498b3cf6372eaea3107d5648a28f6a87f6993cb40fd744f4a150449feeedbb0939b81231a8b3fd767ab7eff5972cf1a7919a3a83bed26664db28c8b6bfc816894bb6d6beffd05092c49f0cb808da3e12d97eec22b2d521cfc0c47ef55c4f6e3f573d06d477e170ade522875deba4b559becc7be00f0b222303f3e02dcd5f07ed47a1d7a5c130efa310cd47a10bf360e6657e06c33c0ca5e6a390eb6530ac6228331f856476d4a18a4130dbaff97a64ccbeeb039231fb349f53b5efbd878138686393ccf7818cd9bfd5daaf6f0107ed4365fb8d74a53390b3ee61df43ba32abb556ce3bdac9aea37226674d29fdd6b4b3283db3cf51caf2b2773e27d79a3d25f79cf4eaacd6fca6b56fbf8f74068dd43da2676d876d1711b4bffa7a8b085a29eb1ef66d7b1163f64390eddb318c5a397497451e6b27b6ff61b92b4b439a6f71c8765af943b61c9e13e987a7dd502737533fe9eeee4e8105df9698d88beb3fbb890d377a584a13f7799913dc59420e6bf2fceb8a41dbcfe96097a6fe58002e72ecc902a4e2b1bc96c8516210e33fd83f7d45c7fc6b5051397ed857f48f3ba970c8c3e250878d1cf65383919d8bee6de4d067339f55e069979b504ca7f9e43ee184623a4d2db3cb84c2a7c824242f90b4f09991cf7cd61598451e7f3148536492ac85f19f98524c420b2d4d579cb2cba7ecd24b76da4e336fba22bbf8ac27a7450e25174dd28718f39759f4500162f9255e55b23b11f24be4e95a3fe1d87a67350e7f83fe69619914f2c861010ac0fa2ede4b4b77e3150ed491436fca8e7978412412f672c3396b2d1e94a0d2c4b484d64158ac8779e081f71b863540f5dcdb8779c0c1a4c530676158c51e744f571836b1072a98c450ba0dc31c43517d14da3ebef7592b1de3eb25f8515122bb0612c8c106fa2181787ceaea73082eea7034a600f7f11d3948ac9229b5d4e577c45de51824a3d71e02bc2c710da4d537fd0f885bbf33dd24f716e3d55bfc41883807e3aa704ffe0fe346196b9a8392ca98162eead4af8fe867420bb551c4c07f03e346198b42dcd32e6da3c8e3bf857139b74fffe949e23e52616b44b123893cfed1480a8beb53fe3886dbd88bdb180a7dbd7c4274dd1f470b37eca7a7277f9232e9754a8c31c87c70c782e848efc84d73374d36b1ed3845e48686eb665cffb069e0911b85a2500824611207110a6b8ac8589b715be68ec3042476c05e2491d2332497888346dce80de1143a02f57b9c6d447051e795dc28e3d634e36f3fed4f4e2623e2e07cee05c38d1edee186718a88aa7fc619e777b9b218b42306adf2acfba99247befba28cad6cb2dcf856c61f1b0011f20108ee038bf88bdb0f10199b1f8292a88b7e7090fac89c54c62ed9670e88423f646cc65509d1845b69fd721c9c8d03c98d320b064ce2da1c999e3ce5f056c182e40913201597e6c8f424891a25d01daed3ea3ae5d65deb477fabdfbd75779d34470259b9d19c6a5f39decf6ce395e3edd0696d9ea55c51fadaaebd76a3af1c6f874e6b524bbb4b819b52caa77f03f7e8f89c73ce493ff6f4a89aa136ede89cb3937246c5182395b56ba594527a2da5946e1b1254c61869ddac8a524a6b8c91d6788c2f393b2be5fcea54553a372e0a183060c0cc31130c183060c08099748699632818304761cee0a24ed8b5235b172d99cd365b8ba88848a9e46aca71f2f1a4211670d07f840c38e81fb59a12e03e90dd1054d77943abef9e257b8040ff97f781fe4a5468f2a7993ce6b6afb41114775292060e42791deba35252126773582a57917163ed86317078c891c9e315a6274732b54adc1085c6ebd4c2930d275ca61b54d0a5eaac40083a850d4972e4fa53e74a0d5276e4fa968a5ceb2da2883bbf062436d01ca851134b84bcd06484059329a3291784b880549bd87ccc923282b833487408716768b8e0890f31302e54d9e1b6725c72018a1d2ff7e6b8e4c21535725c9aa184292a318733c69c79811873ea2f7d6e34b640e44972fb093339790f3d8b41396250cc114714b3f944b325f46d8c71c39ecd9ad6b2af8b965c99d0d3f7f1f229a5b321b87e1a36b636b926bb66b24cbe99db3af9b532cbcb5de6b84e06a5d8a8248df745392ad19400000001004315000028100c088402814828cd835db10f14800c7292427c5c369708b324c661144286180288018400038801305354e3007682e79eee7040c7e23542471cab3e8a5010746afc592d0001442be9be613fda755f3bff06fc67ae8bc9ca997de96f1d991bfee11f78851670b5b4b95668efef23aa28d84cff32f9e73389ff847f590a00db04c296af65c491abe3239626006d70d79e1b50b2a8e531e915c542949b08c52a423b61c2fda524c05831051a9755895e1a838004331485d7366eea40ea1053646b76a6b3398ffa7bdf548259fbb75d0a2641fe4b53720ccb00a8e2a12e7265874ac9fe1c9598a0014341e72b10ad74c411e5592742c7d0d6560d6e2bbf532d6e3b93e5cf47dc076b5e091e66f6ebc986754743fd6af4aef6ee3a306529b3e65cb17656e46bdba337a7172f212c7dc14a71782b98036879eeceedf35b87e932858369f19ae72d42f10e70a33e4b73084ebd9d2541774ed8808b5d2434c37bda30b660efdfadf39df20e4b9134759d5195464f7fb9e90642fa50bcfeadd576406b94d4941d98490e3b8a18b89e601e2ed493990b7f6bffedf0b768360bc28de26d84ef4c2c1b9172118272f62bf53f842898cdd30bf1538cacebbc17da9c752b2af19a22e18b48ae093c0f38d82df097090c7ee2c06ebb421126d1c4266c9b584e3c7f902d10fe7e96eaa9665ede7e0556184ef9038e40695d5a9bee647059f5c304ffb41a0a73d6cc0dab4cf8e8360a629cfb0b172ee198e0fd13b5ec739f7986cba0f06980554f3cc2a3e4ce8d29a624ccef6d7e09c0c5ebbbe055339800b6ce564edabd1fe63ccffb6a773d2d6812470681e7aa4a32e34cbc41a0e63582ace32718f8bf1771e47685e7db024b98c5a8beaf54ac4ac370b5782cf42ce8c0c190ae653f34ad15f5188a6168b383498461a09652f82a8a1aa1f530afbd18776ff8850cc83b11315bd5bb196e62e3475875ea6f3047d5822bc946de632dd8cd6fca0e287071e47bd136ad41b10b8496a6ae3876c5d8e381bd6dbb1a94ced56d323cf21353bf045b32e525b0e326964b11344d8aeaf6cd8ef23836171e31b7f7181a9ba0ec6525215513c42d561f3f0827d887c190d0652c7d110d751f2ed6c67f011590d1e39c94531a937ed345eba0b992ce21a48d4ebb9d0de364478d859e0dbda75473f819729f61af4905bd86cabb1f27206f3be97e06d9d1a73187a168b7bd811eadd8953b27b00c5eaee05d885db156a8ef6c4a801525026cbac229c472aef2aaafce5ff7a8e79abd1b6ac827e7e458f481e0b791cdb5c7f5f950f5398db7a4ac5ee6ecd3bf9a2e4992188fc8ba142ef93b5a0a7c7e357dea81219fc92fad06e6605d5d4d80d86ad2b506e218a887b4fa9197525f82253494a9a1008b27403dd97f83a2a960c9c57308bcec5825f0250c6b865ee6cc2648aa84018432a72efcd72da302166301ea4f56e9f2fc80f0006b6507f724242c13f630a8cb1277843665c572e9161bda2a4a65e24c5e3a7ad532b5a171a3e3d87cbe23531d81d99a4173d6b28ff6c42bf6eac3fb72bb9e3f0af4d2a42c1e84a9a0d1d271a7a0a2820c7211ea675bb18b356681e60a28be3fcb0dd198b81c2c7e2e1a9237deb891f2eedf971cade6de3593c824b140b528b206f9efcba4738f2be492128ee5401d147f2401103782899c198323182f9deffd9181ebed7962c5bd5e3f9f34fbf6646fcde6b006d3cb342c8618f122078e02c77d27119ff066b4918c31fd57e2130e7400fee29e9010d144ddb296c9d0665c9e3de67ccd0f513362b26ab5abbdcfc31ce12a2a91e98b3314671fc95f9df63b3690ea1759b18b9beb2b84fac899206d6a80ff66d73863c79ea7f39021fc9c8496fc360d121079a2fedbe07955b2751aa6e1516b55bd982b283d37eb7f959c43c9ce3d7b94f494eec30ab16d60d0efbc2cffa157921afe127cfe10a146fa8484968cfa0eefe665107151aad7b6bff957f9f0ec3779c898698d4fca929b73074ea4faf5c8a6a7171bd3263cf97a169e1908adeac7b3d95cfe1802fa74270a3034694de89423dc548ff858e8f22388b915badc1b04d8457c32b64b9051960a5d4ad684b31c2d8543afa5672e85b633537b399a97485d4468f74985ad28b5b624dbe2c011bc1599cb1b98061bd21eec7b63b66924c3254f187d00232fafeee16f3ca502a79ae6c4fbb6e25592463f7ee7eb145dbaa4d7d32ebe4b4548db2520e3682c79a7ee34470ecbdfb4b6755443935f664bb4907bf10c5275e485cd70559b01953e147c477f91bd24db739898e47a03d6e9afa1cd9355437f3a3d2b083c3a44addb3f8613544a052804c2e75674fdbcf836c4d3755fcedc7f2488e7a9e99fe1cc82de48ad6ac17a0a9a2ad38b03d2c57bceb38484b1678aa278d574415bd3e6d355d12f02dca12677f77775506d0f844e3b3a0f4c3cce3ad081b09c3e394db22955bbe392310cc33bc5e76903c2c46541748969f6655e1986febd04cf474b1ea758dec9030fcecc1dc1a3e4d967545d7a00ef220e1a127b326d585dba2f30da5da00b4181abc7c1e3f67a9a30b085434fcca8d848267ba21a7b1a5b7634663975ce777d0892c1cd96672a6b1a646c7ab01d863c832c9b47fc7478a0b3f07bd39e11d8da08cbb2787c4e2e6f903d2721e5ef59a2811fa7065e19d64e69e1f9a1440147a8ee0650083dc729a4b0d3609e47f7f829fa1a9b59b9b06fb672f996d43780981c3e3e300d247841f76494956d40f9529c791dfac074537bf78efd8e017a8e05b986019ea70b521a24024e68b525b16986d6d2f8379c909608178633e390fea3617618e8ce5b833088c111f6d03156e9f1f4d3059f58598669a8eb0aa278eb07425e9348a17472bbe5c27f5a8051a853dc0ccfd5c3f685f13ccd4c7efd7c0d1bd3f30cfcd2c234fc5f4a29d24b5f0de189f6d67d5a7f0a77c48e1b9ca785d1c02c3ac557cd2538f11ac84f54fdc5c9644c2dd0dcec2dd598292c602d2549c45282c581096f4b4a00d08cdf503b70b33e37b54fbdaf4b987b72da3501da27b5656979f7f0420c11b354d47d34f86cb3aebf5aa992819b0fae6e8298e599d5534b776bb1fb69b56639ddd2f2aefee859ef4c5b631a772e7e416d168dd080816f4fd409a194df7faed7765a51b58218501608f5029f9714501e090a281889343c139186a783736bc48c699aa58307a278acbb86e5b1f66a05c6510922d111a0f480a0693a2251a2d0b98b75edf55113c98962c939d21cd9dd11df61ad460643519705930224aa3114acfee91f2d9232e9c8889f12ac2aee97fe262a7299b7c18236e7650740e0ae8889418646be6239c3650c8de14c6d503763dfffb5a45c0222af22c67151eb9627e2686df42edb06e6ed1ccd30c81ab17f10b428b7dc6eb066b5548744dbc33f10c037b9857b166eee6ed0cd9098c744cbb8398241b38253d37584776b7a5f479db366551e4b586f720b7d00ead598bb921c4548f49d9368273500ad01c914a8456dd005a4346cdb2057ce80cec123fbe5bb3d48520c69b367b8e6d864ab81193fa1555ccc08780686a0370be40cf22acc428360e24f018b180e2a27e9598631272b0bff68a6b02531fb6da3a61530c5aa804575c7573c8709557022f7456c2b33629a26c076c98a98a8452242558c13416ad78b4adb2bd2b972a4d3358abf44f088dbf9111c7ec6fc9212c729bc88767724d99ccae0891bde99eae80c2589ee2b3a033d301d63b22c5e209172ea6b02edfd11af599309227ee974f38d9b77ce70a4bd642ef160ffd76e853d9c1fc7a27858ccacb653af36aa478d9a6f9cbf904d437de6771b70b761da17701c138f5f1a1d2dd0930c9e5c7a4e0356f1bd0e429b2144dcc345511955bb471514771f22a53bb5ca1a178b9229cec2760c5cfe549c60fc54b0ddb8f484553cf035eafe0c508b0837671ee314c11f1dbef267fe402024b97b32b40b954080a3e7323f2eb8e58cb71652bab0c1b246bb912190ee56422e3831b6f3a6698d4051b311192485e565aa53f2eb292848669909823d1852be4142869a19752359346daf96e7e49f85f2e152cadd4259339af1658d6e457bf0fd7cced16c8e686434a2fc5c0f89c62d589da28a96b452660a78d87aa8711faae79d2732592b2bd0b3a560cad54c9a9b086b9046972729f17d53d04f9d32a9fbe5d9d0d908c1782bba71f3f0f9749abda0edb1edce33b191de79aeeeb9ab4f6b7c7dbbf1932d9ccca879c11ede04d96dfcc4994ac73d4d8f5e5701ed1038133feef02f4c01a2c8d3d5b4e767a9b512c33c16dd7dd359f04802fa2e9903f2486ce933a53a9b84348997508e10fa63c50dc57d0accadc6004dd37791cffe308d2ec05ce42c60dc60b4484ece62c7a24c495346cc8ddd71984877f02bf4c338d4ef0a2d4ce2746bfc5a212aea38545c1937008cd03e20b4e81887a20b2d0a6a8a96870bdef54f5e943587d33c9eeca1511962ec300aabdd9167a2c59048797045a4b002a626c624e4da50a2635de6b619b2af32e3e0351635b254d4870607f183290cecd3271a8835433d7d10d129b194928d6a5c06bd2e94e589e4ca8ae13c03d9183a63394e3cb220787b8289aad9c6236d35b496023a27e85ed60a14c75328b3ddb69c7cd0ee4c4def6f1b7289089795a029bafe62f7ce585bd3cd1814cfd090cb0c560f7d370d91184594cd06fbea69afccbf1f1c20c31e15c1783c4b3c144da257695487eb793d0041d88b8f60186bfc9b607f2a2446999673216bd2cc7060ac49b079ca05bbe83f83a41dce6fce9afc7b24af4d55481f59de189fff0535159aad329a44a05626ebdbf1d94d18b2657037dec74412c9c000fa5ade20e3e01f49376b6fda09b8b5de67fdf22bc3e040e1efca4a25ebf80f3d8e03da89ea107709c74a49082e39f7944784c2a29479a83c742be426d4c95779174ed814c5b3a66b151ae1a52ddb3355aa2a22cdbff22ae7695c30090c2ffb9b46e33a0b1bd500d69169831b46cb5b9673d57c01c481fef575d16dd22ff5b558de252620cd732e68421f18fbd2c2e9a3624a981e56fb684f0e296392b0ef94ef77a13cc5b4a2eac92d805d51f3011019024b492496b40ea0a2a8b318473fb9a6221970200b4311c39cdffe6832770f85569c58da0be34673e2388156f074aa42edd75f3e468273306993682db5767d3711a0d14ba75655a4c64b9061bb831b6e5c2d0c58872fdab87baed90ef512c184250ebafeae305c60f020fb802c6a169db66651ab9d677a2c971c9b71531809c1c1d0bb6b59a74c33f30e2b32200b2328513dba98e30a73f4d20c3c18193dc02cb46e52684d3f209ae0d801de4b70167bc98f5ddf0885aa2e28ab142cfbc01c99be142caf3b3bd8e8b5c202df8b1ed4fe24aeaefd6b0420ce74816c33135f48233dc4a011ab8dc4cc13fdf762bbedf24257875e2e2d15818a38cb6617283417a8aa6c6a6c36642298cc7f1a17b65ce4902eb64bf247cf84abe02942ec4cbeed68e0b9cdecb995a32ec72683c4029fe4b2d82e946d458721ffa229c887196ddddcce7e20f42f24fb7f012c40c24526581348d93aa66c09d96d1e908df8643270af9e9fd8fd613e256b8b7ff340eef5bdc6597eeaf034621d3137ce4684aeb817bc76a051dcebf2691a296732082ccb6120336e69948ee703f4c50062ec8392a5adb464c004ec477fb56f457a5ae661068608d04ecbb556b577da687a7e67c73627c4c47aae74210fea689cbca5da2f031b5e06d625c1430ac87df6533504dc9f0c5370b383172d82d93511b9d759c7bf935d5230c213962a52a49bcf748044e59be91433e2ee556ff6685ab8fe3b938be2d57db7285684e1e0eae17fb4a2d6ad272da5b729a7c2517ab1e0f550c977ae955c16cb20bbbbbc5a26a2798f5e302ead4183265370dfbeb229a4ecf2398fcdac89e9634f4c60978681e5712a064bb8e2b07a43ccacf7ee08b4af294d8f986bcb304ff82a3204a0a487b72a8f45bd8aba3f8a2333137420ecc71c2d1692e24dee4c63ffef09b67e1dfbcb222422bebb4e1009cb8e2d1463a353529bcdd97bcebd6da2f11c86089e3f20c4a63341ce245ce4ab3de841b081865ded615e8354b45a77bbd8704905a06d50c1c17bf0bb072fa79fa07617bdb52f5d68ae777e033d8ae8be6829de3a20183ee72485f73b921cd56b5a6a3ba036a1e1c4c89355856c4d4b69133ada1997ee7915b0e6e73677a1b48bbefb015595566054de1ea727e2d6513f74c7d52107fd901691a4019422bf1809938bfcf6ec19ab951431acb030ab3dc52a071498643d027a1d41adfdb31dec49acefd200401d66f30435fd0a757f15e7340f89aeee55f573e065bbffc9b3d275ee4ed7862f610d47edc0997caa88ef533a590fc52f082a472957c27cdc09651811966a5ae676a1250a11f912080ede317449c7c84ddfe6659d5d5933c22814764fce43e42cae02fdf3340f4d0a601843d8cae7219a9acf4314d4a5cb93c2eddba4f9bbc9bbcc7effb373a88f34a5bf444435f11eb76f3934a4f404add9282378e3dc15b06c008f766fed68d1e15bcb27a976bd9fa54ea0201d986bb5317f40c31cade6f4b4c203aa967d2871214ee5765e88c8b4b6401faba2b4b2302c0e529385d90b4430c657b15531b57f4c8e3373b01c225065c016998af985014e5c5e8fe99893b300b96ed219b6b5468e4ef9a1f0b960456e299e138695be55514f1e6ae3bc8ef5f525b9884aed0674da427341e50163e1da6e72a2a2674d8678cd01634473defc80520b38ba14dca438d0617ae9642afba9ad3834305f7fd74cacc9ebafac2f4c74d3bd68ee6e827179f52d9725e6599d2f0d79b5668c53cc76a502e1223c729f20893b2cbc85ed5c02ace565c9c6e2d7161e9c96a6eb1ecdb01c9f549f260cd4884599906444059193ea5b27495be531a64c60a375d1caf782b9c6e87deee7a2be5754434dfe11dd10ad41374608285e23ed834a44e2442f4e804e885b556e7a41a3684600e6bd80bc9a21aba2f51024dd1f6491dde1fa6f198ccd8f5ce8fc56d8af9c6fc798adcb52e96572e90a051e1bf94dd36e4bf40d851920eb87be3ed26ac19d32effd0d51947f1956cbfeb13b0fea0e74630915d1f79bb786363b3637f9f3709f894cc5513391db01cce56e827f34738c26fbb06043b3cfc08152ba04e20bc4bafcb94bcc791e7560f054820f3226c58715957015472b5aeaa6bd0fe0a0be6b328e14e95a1ec28928d1d3dea3d85b07d9f2a685333acfd0f4e4f9800a911d2b83accca03ee80bade8909cafa71bc4a738b05d56839f7681b365070707c19a06900a71851ab10e5454f3ca17c793b41cb38e1a70bd96a2c38d9d84c3172032436bf3e81030d26d35c2b1de54350d7f18f24fc4c70898a8ffebb14d378a256defdfec1fbfba3e5bc54472d344fc1ef7b392fda337fb208aa4acba81da0b9e03f9d71871cc1142e40f09f57a2afe442b077d05dd98921afa5289630a4f699afb81ac776a99dcdbb919728241c8b28701b5eddb2aef8e245b88407bea83b0ea893442c61370021a03e5048ea818f2e90f81ed46c7cd0e25827071b00f4a01223fa40171e1642ac94c184e212486ce299b2988515b187ca3ad1c9f45d85bea3fd4705443952de219720fac7e540a77ca02d466980e21dd140d2927d38979029180f10de1c8fed5d368ccc6f401978475de5e12091c62d0149f64c615150fd58f30407cc2bb3923d8da06da6a8b5f52d1529eb9929b32843ea11c5c8baeec819c8afc5848763657f84f6dfa63fbf050b3fd82485e49c30e29d917c29f5946fff9e6b80897fce88e0688ca7e2b878ca1e44fb4b4905502d0458041ce4cd42f948099266302ece1ed26d686d49881806021ce9e148021c6b21d0293424136d047df2ab35930927f1f41c73f42e9bea61765b54af114dde4b3e26234ebf42bd1108696765729a8927443bb53311537c043102fa466c854a4a4955ae5800c7d479abab134b365e59e9c72e83c8c8ab35a728248464794c4858ad14339ce8d4cc57b142dda3497775dca2c1ba3412840d623bf28f6448b4c2ea5d1f283948cb54924b2d423df8761c4f5782c3b12487582925c3a10153ea7bd91708e9196f57115ee4bb4f19708bd23d391a472b981285e486766209210e2c518ca341884bc22cc84267e004cdfe15cac0d7a1062ced52d1d44e1117ca4230a6fb57bc33300f36e9906b476c724b6c13c72ffaa5528c0b5b45764c747b46715688ca847a7153213de367f2b0c7eba016e299455b69d31e82bade1a677fbc3b702fae29a5689e2c90351cd1ce808b12257a0a81e02d7aa7e65f88953bf44ab5bdb6dff66251830ca3f25bf540dbac8dc7b78cdd7e29378071b040de96448ca954ebfe545842dc40a712887f35eb0cd32fdb6489e6cfe715c0e903e8b212b7ef048abd9d66053fe02d60f5ae16d1233a2cd5519050a92992ce98aefb72c163e35ba664a259f6c17ff66fe19891cfcf0254ce9853a8f6884c068031b553d9eb990ec723dc06ceb9419689a14aef187d74ef71675614fb9d753af8feec9d97c89abab3ef8f450f55e13ac0e480edd2f0fc0e53e256809d011cf6b854a84eed9c432a33f348725593419df15eb381a2e730121a881abf7b29e600d6419a008340565bd7c866e6e10a1ccb6a9049ee9a94d1fa35c5c19720b6e25f54c61821879078a03ceeaedc6362bcd0898557b693f587a70971581fd0518dd6a83d2bf9cf1f05f2b30a5f0ba290f83849587a3b795c2d1e350b25e273b5953d8ae5c8858743b5a09d0a2e9d5f772ec8f1226703dd47ef160622d3fd2b5787f17963393184a243ee6fe0861e8d48cd1f97505d6701512ef41da07bb277bf79bb973027fefc9c8a34ce27aa50a99e207e54bb40970cf63c88c8104068a675d515910d24b777619dac0b09b022b7f8e6caf8ef2c2d7c91f476f89de58c90d4c611143a7f772ca2955eb543ff0d7ef5bec1d40cd2b6d4ef97926ae1b98d709ae9a819389e26445727323fc7664bdb1c8f5bad2ef90f1dc82ce6a4682b7a9effaf169adbcc3db015b357fbfa8f9e773061c9d42eb22cd795192f4da985833de501e775f14cd58af70cd2a2c1e71849602cf265dc8a5c654411f73d1dce6997c1c6a02633edfb26da42c6a7006728ab1068f80141fa8d5f9630084026b2524186b34ccf9e3fea705dde4606a797e1c3435a1fbfe8764e4e5ee211e55cd368926eca0437fe0040fe3bf12861dc21bc736891b23112631099456512cba94706e56f50e175c1153d36ed93c85ce8ba194161efb5f9269bdf86ffa35e626f65655e0e1bbd9becbf1853d6bed5685f3fe1b2a08c3be820f2853b5c9e83c66f28530d135641343e3b06498fde7e68de70837ca49b801d8a91e9c8164e23f964979e99766431b86ab2fb4785dac439876afc34491ae029c7548401ee818d7bdda9e00a795c303b679c9ff49ea7d00f5587c8faa59e6744926d643ad35d84e2f8a67ade9c476dcc8c19d56ad6ed1456ae4f0284815427c49f2277f59fb1faa29c6500f1baeefe9cd0df345e1a66bacd6adfec55cf2a2d2383816b48b6efa53ba673f121e915511ebf3ce246deea71578581a904a5ebe1692a8b71ea8fd9635ac82084625148c9fe6698191dd9556b745f8214b257c41a3962df35058ee57b6dac70ad887e76b6dbb35515cdb62c320d3b8f284cf94ba2e53c8f8a6cb4ce4a49b607125112ae54105d918f8b80670e8ac050a41562c3c73436c8a928bba6694c99dd5d1bad666879203eaadd31cb33292999a40d16d26befc6fdb6bc931622ea8fa0333843a397118a10892309441a83b82f84ae0fca6987d56972dd553229fe2ae1e48a80b6370d030bb131fbdfdc1f63437bca62fd35c4790ed5ddf0f1b3079231a9926c135072c58740cefedf2ad536922e3012d7482fc2ed5ae6a401c11aebcb0dd28a0149095ca1f27a8c13722c782698351ae6f7819686799733555a5b22029891d732a365be636474ae59cd31dad8c2972e42c6ab1a04b0a43a9bdcf1e6f1edc8420f10b7c2b189e148c60f05ca77d8ab184e0ae977fc8ebca2c4ccd8d7d03e8f46a4f7797ade07877c1459732a0898f62f1dc0476fbbe4421c6e7dafd02c2b577a4753979b583072ac9739b79ee952aaa965e31bc34a7ce2441f7605457739c0ecf54e8cb11c9604679b01faa0191869a98bd942d11ab993285655dbe54e2e920ed5038c202d18cb7a9baba3dbe66e2dd025ec5685e2738e3c10001ee0f0f548a71e4b47890280b675a028de6f66a8082cdf4a539cbdcf2959c1a2dc148efd55218fce24d410d401b64e5a43a2bb4bb8876c75828931a1b86da756dc2ecae9c4c4d22396129a76274c92f0df2e88753bef5b4ab8fa9a8ced53e2352c16b9b005ee3b5dc14855520f2f59fe210e0b82351c0517c1d8d16927c681b2c7bd1d42a6962093373ae9294fb7cf176cc3eefca7eb2ada239f4609bbae5bbab837ef2156d40c830203efcd2f0e289aab0a138ff68540dc0712551149b4586f631ba07d6f85004ea84b28c1cda635af7c3b231733798faee680fb909cf1c6f9322da48d17072fe433b64c60b256950312dd51b932087bea40ff0ae20ea468cad25d79fc0ed37b3b9305f7864b111ba58cc4ff7d23fbab72170baa458590fde830231d98caf2be60abacfa9150243bb86c0db1504281c9fb9679f33eb505ed5204a9fb7e5c8b56b3dd3788d328e2a9d15b445f9ff60a133f4c6c319fc1dbf886d6c98a2097041870447cdd7738b7c81424106fa275153a68206ee7f21d92da4153cd83c944f827cb786538db0334224640a096050075a01044200eb135ea712472cf3fbf96a67d9180f6ef247f0f89939e90b159fe1f3786adfdd6aeca0e092c224b8006b17751584ee068b5f5695e2966b684aef5b11aeb8a8fd2044275161210d9acfc8998ee926e7ca16cf38eee05303f39a2bca2f8e081954032bb78bcc3ab956a5b2060648fff8b5177eabbb704f1b5555b5de8b80ab10947cf52c1909c7784b8239e60d25455f35de3fd4ad6f6614d6fad5e596c59cf48c98787491785c7725a7fae719da7e6bcf43499db4b14a3120bb794bd99f31404a139f93b8e9ffe6e401b7e200b3e4c9f6d32310473021aeb814e8916c3ada7a5e82ce39246b052eb9219e1ff4d5a00e37140b96dd9d18fde32874334ae6ce2a22db0e31318acf98f351ab5b0e4637282483576f3906ac7c90a40d2a7fac82d52e208be812eb4e05fbc939496122560a7be667e82763b7d60d6150c7f09e10c14ac9c62cf551c45ce322e62fade950371aef2f37cebcb8e1ff09d302d90e9b85ea974e892d929f383ade43a8d7738129fb5388e388ce8a429783d6602f1c1c6cdb7128cb14afaac30283d87f5745aae4a74e5a72feb93da962033d6f4f49400fbe0ecd5bb40adce3f8fe41abec029d5eedae924d0da2df33912e07e09f40d9f998872bb06deca410f84f025f99f02af712e86d3e5e800f7a80da30889e99d62f5887d0410931c807f70ae12790ff941721df1fc85f92a6917c4653c41dc00c7af993400209ecc4d0e8e3c3d743aa198220e45935903411f05e4a033024f88724ea8178fba0eda71999c2c00f2bf73c888875bf17f96c824604cc1688c602e13361145d9ddf11cd5f1edb9e71f5ee2def31510c1578593b75c86c6585b6ae3f2e89d822507a1f7af736133c8d1ff6c9f89d3a09cd2e1ad8dd53a91b9970430699a8da912a6efc3c19d82fa8091e28d703c37d8d2293a3d6baea2445212e8cb1dde0ca857e13257ea888071729b78a170b6b6a805335edc1fe09946f59fd029ef046003dcdf9b02b2272d82721cbecd40d0a8ac8ae0b4e9f4c71c63076a3faa191aafbf096b33ea760bc74d5d78f0826b7b03657aab5b67d9f2636ccfcfcea5d9fe9b312e155a8d0971a78288f78b6a0bbd1384f40366383733f59657cd3151592a4d7a6132cd704c3f025224170cb3172fd66f49efce417cac2ea4f2882d651d3824f9a0320b493df7b410a38ad2722032a9921d06c655cc0c2b5bc8a6476b27e132c237d22d5880275f6a48444be5584281c0d76afacbd2820a766209cdadbb523838535cc5f7f69be0f34e59ebc9bb6ef9327a24e79b60b0105382b5b7ba673ffe1251c2995cbef1ee3d6efe8251ca5e5deafb2c9df5904a401033dbd0f3fb4d09a24b9d5f28b29ae396b4fd7100b6eb4d50e62d1af29f018930e0f5809082b0abd17f1eb8baaa0211f2bbf6cf1e2a51528b71bcac670d6df28e3618c8419dc63d4d5bda899e4bd4c004f13e7bc6f6b88e287de654a32417a8e273a90c588404653687716d675302d3f58513fb6b293e9a9d0c6c868a99a129e3627bcf25cb531d7a79d5aab4413871c8a9ea543d5bd16dd3b811b6886772a65c3bebc39d4e59378f1d63a2f67d48c6dea1f6cfa455dd8fbc38e939e2406d4e7130095f732b307d98aa190a4a32a92510592198e817211b43bf640b8b795b262a9a6274227d840f7605b33181316faf3b49fab71ea06b846f07f4a95baa2ea6e24a28c514dfa730b88da2c698641005672ee338672213a88f17441710a9858c9c64d6c7755689596291866eaf2d7c09c76433cadc46400fc522429928a004ad3f748042adfd9513c207c0208048295808ce7992216693e00b57b8c4bd24614389fb2c86feeb60dff532bfdedb74da93f268e4dbffbe3c0db41aa8ac39399b7d3b0b60d8879bebff4edf4cbc52e84ff592521a3dfc3b01e98d42e1cb57d1fd6de43e9f77534d6b2922a8ca937a0a6bcfa4c70be0000da13c8dabd6777bcdc073e0e08b95f3a3efec6cef025145dd1fa7493930c8561e121457a653ff46c225f1a56edc767b0e61e236c3529f19beba65e2362ccd2715117aab698829e1af7ca222bc91bc101aa9b0a5012ad6c9d4a35dbb130eeadaab51978c5cd5b04f0a4494fc432b1e485fe3c4b8c0d42060d5018f79b3642e4bb017fa604a00a25016e62f72ad335a8ca08516f516201b7d116571092a6413bfd03e3b1714d83eb6f2aceff06eea44745634c4d44826fbef2f7f372da0ee6bbc34cea1033ff82d7fa2a831f0067ed02f0f1a0d79cb26b4d0521da7259f234b25b8b5532c12659de38f719861703dc9b4cd3083324e0478259e42483a61d6a44e84fc3285bfbeb65c2c8e4960dd0feb02655f7418d81ccc99288abf0486318c8fa04c0d82cdb46adc20600e841e4168baa44f5bdfe615c66395e141f76d45e31599ccd9189afb234564a1a787c5e1395ec8cdf4a3a863cd134f55e49409e6f4446d3c18058fafd1295b2e19d0666b4fa2a7268932d307ef6a9cc86e1ad21da32942b1593c2c3462f9d1ffb36b2d88683ba6d7bc918b34cd5f1d412cddcc2f8228b34e1d96933c6c39bea970472655c53f977348e1412f7d0e124b478cecbd58f4a5063ce2059e9536ea47b0e43172c2a7c76a8e7bfb3d84327cd7ca671c957cb5c8b8d14530791061faa95277e8410eb3bcbc6f38daf0d97399e6467bddaa5c55dbd309a32e6fce3ad2e8940f2360dfc8f77b194d2381e55a9a4823a2ea3238041a4238e8bba966123f548a933c8501b10bc6d8639be1053a756c20e46310cbd5bb056ac50edf1ec389f8ec1c041074590c964a2122ade63a3c7857efae06971a23a26a0b18a4cd9c2e94cb146434a928b73a7aa6f71001ae4f61d0884ab43299117bb1626ba9b503f81a302380eb1c9275de3002749e05f112d29f5d476e25b9f97b905787cb7c70ea14f39909099a739c17f7b532216e5dda5a7156e2d907722b66c54ab23a69e0506039a33a18a3abaf859e19e1609d7b3115a4a4bcb6e690e459150b416a587202d30bb5395677059bfda741626babedf072474110c7b8a843a17a216ac57a9925142b179f89e537d0cd57f3739f9ffd50a6f4c02ac5d8443fddc2aaf53bd9f0fdb018c53db11a97405ea87b44b59c85014fdf0a398caf91c670cdb0805bcdf1e741ec4d36ab77e48531bd6afffbb96e6218f79d358a84e313c7bf4805660c38f76e0aeb106fee5197976f2f9cb0e6dc90e1c35fd09f9c68e5f8e3f45d8115ec6f8fff05f772c8dbb5c0d44f4d90ce03336d579bd68d22101ef72a9805e9c7b152bfaac0ea15c8f3ac21b1420c820d9dd580163fdd743b0ebe9a26bd0d6d2197296225e7b18f3e55d8d26538c5728edc98dd85567797aef9298e00f13c8e9bb80a2d956c944b42de90731553906f8f41be77af8ad36e7cc4a58f165b262e9b30466e1f817175d3a1d9dfc36ff68a0da3121ebb820ef72888c0331d0f06b1326d76979d477ad0438ee97710cc1c86a03a21ec778c4bb7b18fa9e7c854df32ed9658c0734da9507b8e628f4f3aed61101d928b65bdcc84cd9c70ed896190f58bfb1be0d489a4b52dc003987a0b4689642758041032aa394fa7b8e04b3011a01c11d020944b2cdab16776f0de19e3fe91e0df5af3b067f760e97245383f4d217e44a815cac4131dc5fedd83e89302d9d38c2997ed03f868d997f3a0083ba568c8ec8cd91082f34175f74c9c9b37df2627262079eed831048b345613f15c2ba1b20bbe40549874805d1635716205574248f2001195a9bd87dde611de01cccf96932a3f51475930903145ed5a5c481416fce8ae0eeda25e966034254c8624db7a5376772e735476cbb0ae36264e044f4ff53f3870f21a7199cd1764918a0c628b054e915e41fdf34d9aec399197827917b2bba39c0471ee85ad4c56d1aad9f2aabf35eecf0240817f197d0ca5844acee815619c6afc4df5c393e8c306f5f26aad7528f80321577e391950e62d8679be6e43120e186df31a8091719dd077c32d82a2f7a90a2ee14eeacd131aa6dec47637b1ea59f52ec76e63a9cc1200f666325d107dcb41239f72f0ced12982d2b6cea4f16bb6f4fbd6aed01f661c877a80610ee1007f5e1cbc83c9507725a9068bd3f8136bfaef15da0f27966aa17cf9afe610771f678c5f70f79d0bb5bfb4b693b9ffd0928c0297ed92f60f06563a4fe924757622554f32d673493135cf3a9ca668e7ec46e23ab4b01735857d18a6bf06981958d7ce7829fe0c12c34c646732fa1ce96141a65e5b99ec6ac4b8c131eb053b459b91ab9b09cd1a223bd789ae6ed3e1cf17e0b2c76b90d34f1cbcd5a002d8354ef18c01cc9dec8dce67e989119841dc514f427ec2d505453fe1d4a932f46bb1f8e7d9a65cb9fecc307362a5d7eafc3e4605e7b2364673ba95043a78cce173ac38c710b2620e06c5370120c15869299bc88b48eefe98278a83d35c46168fbdea497c34c613b31d4e9cdedd4628c4639bf2526fe1121a1277b03dff90605746b735eaeaef73fe08ef8e7e333bdc8e9c00c245840db48aa3beadf5538b3ae43f098870d05125cea03bd43f6cd4c055eb8547bc74ca32d6378bd0af58a846ac0965870a49fc74a7ca9f4369cfad9c21870220d76c42fd4eab9ac029dd336c0b6afec4f3a48c58551d04c6d15b9bf18fb9c2c2890ada1f046b88fec1391e17c60ff0bb9bedc271d6fac69610f17e8ea37fe74a176c82702f4cbb1c1ed44071421a6e296a1945363ceff1ebdb3943e72452c35ccf7765f378c4103cca698204c23884cb6048f4576c7cfd9de75667441d29740018de41d9e68004915b9a715dcb142480469f44b298bcad5d7f50a110472c98efa412de53ca818e04066d57415b8ca81013cdb59a006c157ea511efbdfcdc58d86cd3b2d4b96b209a53591cc17e3cb00762d5f62255618be056110092945a09310fe890d789b2c106b8b6c8abd6b54066246732f7e5575628795bf7d4e503358f93505bf1c30f136a43740e99322ce49bf9fd6ab4181a0f1fbb2755d8d993d3827107d6d6f8cdfd7691de9d8ee7f96212cc5df2af3bf437a2663719d788c39bb36a1d9a59a7b5d7ed4428581c248863bc71c33f3f8a9064a504f41af47904373c583e04b971b4996907e236289a21265b375a329fd217223815c2182639a4c54c03f038f01f2cf302b8c1df57710c4e41e58a8dbc444ee2cdc05aa4c168ff056099f7d1a9626c762e9992b459eb28c3f7db9ef9d4b63160422801b711f0413e0bb555a08336aaccb2aeedd111bb913ca118319b0061ca2bde5d6bb509adcceeaf11d2ed69fc6874cf7fd4021d8d7c8d7da0c3db868499997379cb22c41b8a7a408e7e5c1c5450835fa9e10d3cfd2fc9740245f260d4a0d2bd85cf0292cc27e7fe4858cddebd82137957308175dc04811a349e7f85f2c1ca58dfb9e04cc843b66042e0b40443f01f505360e79d0c0d0d7493ce4b4e7c2e00192cfd717b0b39e5ac2e940012072d8772106cfa90d9bc180a1c6dbb3ee876a19952000e51dc6450c02caa5ca0a11a12014e4239947749683af4f55352056abb144395d9df4d8bf67d4526925451039bdda0d1c744da5e4575145989108407320efdfe34a1165aa3c4608c0bd1a333bc68ea071363b64f8e228a9734727b43eb87df8410c0c1b05ea3eaddbcd7f53bd179817454c7ad158667143be6f7c025410386475aa646816fe4d30e6510abe49c585a5e9fc61e6262a17ce2b153c192ed05ac637a34db89f52a7180f9e0022be561ff29bd901111b5f22a98fd0ffb698270bdc19718833fa847c615f253be815c2570c5c9f87fb061cc63cc50741a52160eb2f6154dd41a74658a480420a1ddcd214acfa5f54f2dc0f108c4753a11d7a9b8641e7c9fe3744ed3d183a6b888fda6417d1f27c53cac96ec2cbf62c6268b240234e4283f07323b1a7617f726151f2e16c668a78cfc22507b1a164f81e2b0746cdce2d0db3c63f04f82456189b9469d6768dd409c370526c6d3fbcaf1af7d8dc7675b6bd63e05444eea6d5e41628db2035349dc171e3af02be77f81a6822d85c29bd5dea00b6d9e45f2afcd18f0622fd179c0f05209da3435174bb789ccebe4a627f11a95692eda3d858310b7a036d4a0eef435c74a5c9fa344a9cb37983b97343b4d2f50a5a42bb88854055d14828fd99e672694f309aa168d63b7a1e5b8441d5f799ae4fafb4c7945d8cca24d40999fd8981889073c7dc3bbca9b060a0ca2ed5c130920b3b0c03893bb8fbd3b5b9a79d92bd31cff9a8fe53deca91d0f3f5c3f7deb1221d58a894e0ff93eeabe670a146b2f18ac119a02b2c74edce75900eb87b2573e091034eb1c8daf9c7a131de8429320e6d3e9116e789e4a53fc619cea1e670b48305bcfb27d8dc05452e1f851c3978d076bcee70dfb8620318b1fe7c9fe3ac3305d737f7f51a738a500a392e7c8e0f2fd2dd7930e5392daaae1ff131cdc3800f1bbd40978907523751d460f1df51c0e8c8b51d9a0dab61b7f580489eeeac852ff6e8ffc6f468e8f9d780a6a650e9ebc3abe5d797e021a0f7597f2c6346252b7e8861070c1159adf9955993bd1eeb7d0ac155864f4094f9ac658dc85f2f32cd9eea110fb58512ceb393c8ae90aa9e31012d08ece5927312938ad0669c0a1230408bf6bafc395ff6d965c0aa9b0687a66639093cba3c5e8251e5f1fce2502da951447c43d5d1acf9985260f7a092b7a5b3e929375e635bd6a8829a1a1ceb4768a912f6249f6ec062a0ba9c0334b4b0017de97017fd2a7c2de60ae95f3be46460010ee4bce35e1f7ef15fbc0ba6970f8dc202fc1c3937fa6771c8185e65fa062b7e1b7f9a2ba3e7cb829abe5f5c3a527f60fecd62d271dddf1b7ea1c4ff19dc0dce809f26476b9f37b55b8f74012f2352683abb408053415a89e912a48b399f0b7df5a15cfb7436c94ccbe6d7ea3c94e2464e51a7e438a5ddba6f93ad9369884be0034d000a401ecd5b43a68ae644e7761f535b081cc420ec76b50165d94ae85a8e6da6892538117e41ed23cd75272cd98b6ac35925b03a17492c23875231abfc0f16f7b90c3b58f4f92d8b361d31696d704bf459abd1cbbc3aea66baab105f7b49b8bc79e7193aa07e696442f3a327c5d097f0bfb2f6cec225cd137807a8f87cba1b9fedcc816e1a0bdd6e2948f07e2b6fb0b71e3cb8886f37e0bea940119a8208ebb4d06106338d04081291cdd753b1eecdaa2270c16b2093c71d53aeff1494867d0c4bd4606785e24b7ac400301901f4209c54a911466b494b4fb183f347178c0747ff1dc6432d6b1093dbb36e292cae9e35fdae32ca9486c3c0b15441ccc27a90c062c03766fd07d77ae2ba283ea85f829e46c0231099d836da229458d5c700d3aa092d510b2b4ceba1ec11650b985ba1709604ca8804c3d3c18a4811fc433980e7d99df65515c5790f10410b8052080ef208b145ab7ea40214168461ea56d93d45a8426c30cc2699e812ec620d71cddbf31eb3974c35025e7acde5dc0ef5ac054a6e30841c805986cc1a42d1a501c0abb8e6934e1b56a40d70d0499de386a66287de65e84962c86645ecad5379ea2882449035d512649a6f6c88a91085de595f4c3b2ebab803d7323aa00c0a7358a47d83f2bb9094955494fe6853495c4e52133840988ab8a72b948578afcb2b209c126a344d56cfe56b2ae33b5b89f96c7d6aa35b788bd06ef573fb71a06075868e4744af71a4aa0b665a4fe79576219e41f2ddb8c77c498ad2167f11aca8c9376a0a199cffa877ba059bf4f461a1373a93c450293c3300103d08642af2b8c1c1ccfbe3fe4442194786d3ce3ca22015bc59259a5ff83908dcbaf623efd2c0a908191fff58aa355d48b44b1a82dce31b36a3abf6837882daf5047d4f5d546677f894b956242799e3a525b7ec3e825f4e003055567cbcee91b265e040d82581a7c19f7952547b41f157e5752f88bf60c5fe62ba56d0de6f45d130007c4de68ffc66af75ea5e89235a5f4b90a00647e79a3acbc9a0e33691e4cb1f18d0a7810442b49bfba1eb77450bc27fca89d6c3f2e631e3c2d040cca1f5579891fe1752f493555ccfb29e675fb7d5ada7e02c6d026d049a3534b342196b075e135ddc6078dcfdf4422e62400d5830233ab6b24105ab164512913578343620f3713d31a6f014b4850811dbeaf506122feb2041250a77720f52e746a6002ff074c9ee00829ad2ddcfcb8abe4b1d6d9832f9427673e9b8bc63de25ceab83be3aae9778918a1b82d6549683187c900bbe43571c4dc3673c480a3de7c9a8fff20bb320c84f2d20ae2bd98dc9cbd220330e27a78bcb1ba279b35e39ee18806cdfe7d7f6e3af5bb03401362a78d994227fd90ae65a5d63996280d857a8999b02e215da8d623fa12f3444ac98a94831d38b07e90f2cef0ec21ef7edb0e575a855ebb0a5aa777093bcf435601b82bca2b22949166a751e5ff79b046b76d730b000dcc8d75f56e7380e810bee5775d244a05f5b8c9568504f39dedff95b53ce24e68fa1e98af8cb77e5631e6dbff8f3deb62620b04ae1561aec71c8df9ce27bb7b7d64bc0b8de3c2d8525778fcfa4252e51ee6f1f366889365494a0853aac874dcde127c9941911b8606f46a9cd6a85dc027b7bc9cda337d5bfb04fa7bc193d2da402cb1e9c3f3d053b6301360a3806692be13812076fb9bb56f519ce815cca7aad43300992772fbabc34a7c2a30dcb375080de4403dc5a109d0ecc2f8de6f19c8b263398b839708952cd354ce68dcf2c6561110235908d65ef5eb404f77f97fb948b8c82108e41d4337ca53dfbe15f31db3ad487386435507d773e59f90a5e5a1a3651cd45b02773d8f71e4f8064efa3a902e815e1a0fd98446a1491f84d8df6c8e384115fa6d1ffa3265a184d3b98ccb21e885831ecddd4ec90663367c0620ab7810a0dcb19f101baeec58e171e4713603e69ef69c946a041c7cc1ecf088ea2956b55c8a9ff8b619d52cd08da70aed2f47a20fdafcb5d4f8912fdb914b328670ad64da9b0d335190d3399de7d611b9c6256b3bb128914c3ce18b34abefb09db252f2107fcd82efc9bc30190853c512156166a03f52a45922e9892f7c017e58bb3e8a7f1f538840317ab8bd931dd20cf69c64b4ab6af0cc35c56e786ead61cc8ccc8bb3c3c6bca3a0808ac03b8822f4747141704e0a783b94aaf7b16327a9787226d4f90786a832c5f2ef2e6b64111d9015073f4c8d67687a45db95651307ee1df2974ca5ace5481e1f1ea2bd6e4e41cd4036b4097fc8ca3467e030e785833f87654bb53570c28f61d52ec5aa93e37dc9f72ad8a2a30058319f8abeee5846d454267c231c982bd9a760a09dfb7824dd7ffec872384b01efb78653f9d84baa3e492c22a741d1b90fce50e79a877a28b80eb23061ef2c3b623cfcc0cb8a13c819cfe049b0b0d376bd0ddc1b8d2df6f249735a5754b6d16b42607981549d74e0538d751a716192777bd23357bf88fc3141d404bae76ddf7fbea845d6c0ab2472301c1a6d12274f3d662d91f3cb94222f8cc10e161063d204f11cc2152ae5a6116fc294cf47811e202a8296874577f8aa65c7d838c4cd9169052fe26a6382fa9f4ce52e92a659d41b6312bd1b50d2860b1c7dee8375c43ec40900223d9e35bdae127c9b459ed75dbe4f9caba443d2926514b6440a11362a04ee0cf73e407280e6d607f3e5c0646148228296f92815124cfd761bf584c90ee09ba17ae0d0cb94f414a65808a15360559c408fd0cc8bbfce46765eaaed9a4e726de66914211222d901d6fe45ce9b8162f1f60d9a90b31dd0d49972673afb202fed1ef043630776898c49ef67adab577e509a0a1a6f28f7e3d12288332ed022898c6716206176d8c9a61024a9e442adc7adb34ec8046447b1d0af89e0853c9491e871012940af7d30558190e150fba91bafea662a298bc726de678e109046cdf7ca2beaa64534234650af2c3b3f5e39580f8c8288adc95090e0a7bcfb26a7f1d3cc0c815e96e2a1c24bb699ab000e8a08753cbb53d45367116130238a4daea5d766deab0cf1b75376b3e3790f21a524a274bd517334da91689bf73e3cdda52854175b0e0d9058bc99101266105f0a24f29c8ac91420af246a264fb2ba2e0ca20e361414424f9a4529d1b34ddb9ce7af76f6c977df90edf25fe1517815c1e021de8c90025f64a97a0722d9afad4ab8766758d2f4461bfd50c9a91f8ceb27952a466a7f01bf4aebb3ee739ec2fd7e2d0f1eab3336d22b5a8dbdbe802362b14496f6a6c747ac0ae1dd13c1d084eb33d7fc1acfb77623477a5acb3db14f36572abe60141fbd4b56ac608bd45462f44d28fbf432647e2bb105443529eeacc5fec45b665f5009d400c76dd6d24a99a7a4ff2fff533bf9e931085aa92fc5c9ed7875032bb3d523bf8851b154cd57fcedfe464e908c1e984fafeff246af3f8082094a92b8d10302f001af04abaea3892e90d9085a04ce7c686dc64c9bae933ebadf1c556abf84f6d6b9fbeed692fa12c6e906264ffce27a9be730150c76ac24735756313f79fd5693f399bf50c823d5fdd8d7230d389afa31f829183f079f5e68822f1d0e891fc03b0bc384550475718205b5f5b1ca2d4b5c15acb571dd3d99de1e346147958693b1945054ede4800f78c357974c4168ce71a78703d63ec9996fdd4e911cc6cf43a941c14e66f2fbd3c0433497b45546e9e244fe17ba133022791eac05f9ae3d27fbbac14e401ef94321f6e0129fd0b936f4f125978873d5d6931e6fb576a4cba0c7834c7a451d8baaa5eb7149cf7d86c43fd55e3a9d311ea3b297f54193d741dfa7b5d024499735d23e4ed0a810018b7437735935ab0d0162850f01b1be88f6f6124892448377a29ce8e4149cace7186409e9cf99d90090b3d007d3a83ff4b652280772fb9f3f4eb0ac5888c06fe1d7745769d312fdb9ed0186a13b03b13d2e241a1e91ff2371de143e982ca0b4d99b74296e47b9671e3b7d90bf9858be611a5f1d433e0fbb5be5000c03405ca82d8034ad2afe97b6ab6421cb6877e2a8000308f393007a7bf13403087068176e16a16ad61a4b5cd0546a601961a263f922adfda6950131b301632e0ea696c1921c32e654b658285a2c267501907930620641a2a028dac050e0d103627a2a6a154304de401721c3443c231988cecf63b6b853ab5ad4c32b4a1086b4c8b1e013ba52f26c96c8254ac201f85eb73d53a56eda2e4b2caf05ca4c90a9ba417e111b6d17c84082370b7e0a0951594cdc1e211d33c11eefd09653f4028ce32b8697b8837bd56e216e73d71669328718c2499b453ee458745c462c386b8f3f129382e3a4c54217bb2156cdc131286d9b68bcc7af32731a8f03d4bf602a4fbf9e14869f0aac5dbd281de986bcd23c2e00a91599f302ff39f6947aab6a329011f584191a58637c7a44f105d6b39b41947686418dd33a36df60e621c91e2ea9e0558073f7a20385eb359ee016a9c697a17ecb78ca760da0b1330a7de30694c6518311058a8502e3862e507779d14149c4409ae8b10be32d70ba038201102ba80e295da21db101ad32a508796f5e0597a49c03c04f33f9c108268c861275bbb0e12a9d57425832dc42b682d64e3c9af3e157aa4408cc48d4f16a59a7f4860950172077d2b4693275be446499064f113846ef55aa755b06cac23d2179e3a951b528866f2872a4b5b599367e0c9625babf1919b3891836321e74c30a7701b2cc68608ba2ffbd986139883a47e937ab0972719d0813605bde34bd62e2106baafa345c03d6a07b8c8181ec883bdea7d6e5aac78414ae6402e608477a9f3d5d2f190f817d8be1a80f78d2a304e01ec631400b92f577d585967ac41f03511ffc78bb54a33cfc21317011a46c1b076f84cc4f06b42fae1fcfaa409ad5b93e5f6be0f0a60b02ea5024162856e3c263758b91287a95b1ff7d6ef443b6df104560a3fcd454f76fa30a5bbf6aec7afed8950e5e899ceb586b5f7e4f112f5abb49705059d4f2339a709d226c4e8ecf57e300d060b4e753e7571a0a71d7262c974dbd14d16f4995241fa9b9f8abc9305b81022f8747fd0ebfd7d49c6700535909afa36bcdee8cf1f8f5e757f4fe51c4d37b2d23a58abe1027bf70c445d4fe540143f0dac1bdd65477e96679efb045119353e2d8bbb87ebef4ccba05460030dec2f105e4ec8cbdb6237badf6c66c009d4d9c048aad6cf8274b5789c809dc8bf4c5b48141010977d55ed8a5c1c6b1cef254fe8837b1d0617638e48474d70cf38724d6d5e7442e4cb0185415aa02b463002d052bd4ee3f92b7641c1a33e609262611486e3caa3a7671e275e84e803b408c408f922470b1129c58a563941e8d4eb1784a614805c5a56e547b2637062a1cda4e737ccc41f1487874e0309c8c081dabffb52347eef0de26a73abb341f976f82ea82297612051a4f8240150ea5fa0b07c6521572b4cb827e4657c57e9e8e08362e68612514b75efc86b805af9cff34cf78d74f7f808d471506be09d0488297c168917044de93c68c2776e578ca6b1108d79429a8ff8c721a520192bfd560ceca52390b16d06c8b649aca0bd9e9f3cce24d2bf1fc6353aca13f95b1a555740685bf7fd9400615e76b6f64221419a31d5f762466068051630aa8fb144f2f15024c36d239a2efba2522a7d8ab84d563805cb19ddcd91c716b476c0f1538cbd034ad0fa73f29ea898652f712d060cbc2717a50dee8a4f2fbb86a350796e8676ae1da0737a83736090944627c91775baffeeed78a33f8478fa68e3cb496e129e41da07bd6fb2c41f17c7c24f803372c542a0ad7e46a7e0d0c753d95e60e8913ce694113eec95d280ad4b55488db6b71350fc6de4d477aee70885b8a22964602ac0351fd7aaae7c3a0f414239d150aecb50c07754bdb8c7e566470a58f38ae4f6b4eab52ea4ee2b6cdf970e2ee609179338d5ff506d46a52621fd44f5cb1550d507443dd1044e7f22bfade45b97690906d19f6788ce2a4383b64a791dbf395d0b1cf9076b1cda679908ee4a7ddc45a14b725101b386b17e493b0ccfdf647a01f5f115273c2eb9eb9aff8e20c7c2708091262211eddc41434516ff09dbc28c36fc11b19c6e44181070af03b30f8bf4fe41e69b27bc186871d360d27b5775f93b7fe8721b28ac5d814875eade81f8b656c69e00ed7eb1819534d1248ab61d52f84f1e004a72caf5c8df0846beaa4e8e599823d78eb383bdaf47f70ff92ba6b4fe16b352a57b370777ddc87ae43f2b9f7b3a8f5c39a96f3ef7bc82ba51620f89561aeeb936e806e0f3b426a4ef0626813dcc52aaafa76fc47a5c2b943ae8594d04366b1672b3486073d7e298e802078e9464a56fe77548afa6d78f996245e623568888b98e57b1a016f3f15d1cb17a2bef10cc2089fbe5a2203f6c505886104be9b8c6c5e7b3c3b18404d5ee37d254851d495a77ab348f0ff4755e0a38081f1fb738cb5864735903ab0523cfe065236f1e6a206dd86effeb3c58565744e24d26f813aad283c6dca20283303724143ef81dbd25b625c47fb7cb478cbdbf53d6391e4a6d6df4cea26900b91062025a850b70b0feb918ff7d43dcd06e9ac72b0e7bcb43f5db7e8be0200c2df9156ef91f7aae0f97fb8463080cadce9d4507be5cad2ab54adc68bc22e64fb3e3ae2ba58f99e8639fad36371b889e7f899d214da0418dbc3c4470b87552d8508a14b7f7201090f522b13a64b765e2c42ba472b5e0395681c8fa2b272207738c4439377e2832a87bb14b6fbe7d90342e9dc69a3d8051c6fdd602dd5d1f197f862a4023426643e8f0b3361c5ec2fb76cf0e47838fed41ff25114f917fe9d96bcbee1dcb3ec976a9e2e55e8ab01abb7afb39eba50a9506845e5ae168b13b2f55f0d9347482ed87540484d3856f17b81f7bf0f1edbc3eef5b7723b06311d84617dd769000aff6c2305767740a4a44260d4408d5ee0fe6d867ac9080b378cf41c80f1cd3aaf18fe8fcd5b15f203da2df112c103d3c4083f9f184b6ad1f22425b1f188cdccc215f8e0311a8fa202ecef048fa9f97471db630271fa81ced5d8f4788d350c0f1d85832c9e7611a63ba30e31db103e2140cc352ee720e4d6201c01a96173a37e3478a59d6a046d5afa24b3473f368af8bf0dac0ed40cc1f7ce3c1647ae998804bb353ac7f65881feb846f681650c856ae1a2c6cbe71190bbe14c0a948ae24765407b168ed6f25d85c22b7f10051d8aead42d4d915b70599c57662a8d5fba727034a91af6d705d432a5c688a0389ff69164787251c00f9217ef9fa4cf00c2536ceb1c039db86ca2ba39f1b63921b941e1d42c7e98f0e290db381b42d7ada32fb6f4b07127ddcc992e2f178a610d5acc487934e0578d07d1b0a5d9bffb75972851df09b982e8340f18705f0af40143c3db451d0821600952638b05900c965a2ad665938d625123f9ac3673cdedc791d7704c3f318a08aed37e99f7eb27bafc2bc49f93446b28ebf749c27dd644f8fe245a0d21ad06b16b3f185ccabd017d1bfee04c4ca16d92a3c2f8fefe16819161cbdbbbde145c0dfd72491f31d25c6b9fc661a5904589eb84a1c48aff52a360ddb3ce0dcc9cf64740d1ea822a08b2145aae2a0119063906e4ecc3706571d595ebb63ea13034012f21fddadc68769823642b863f9d33bc241523b221ad37dd29893b8c5161422e46ffdbf0e78800eadb9da845c5d5321bf1534213fd2430dee2aaa31910b88427e2c9a42eba7ebc52dab082a09142ae109f9f5bc392a22e4574a880323c0132228988b0dcd98faf8eb8698bb6160aaf3c5322c010bf6e1688bca65d5f791f5236bc930cf7abe3dd00096f3efbcbf8ffab1f34b365ec1dabd2b1f859c7c9f062b49ed5ec2009bf90f50ea4db1f983d5fec538dc358a2ce630a96d0040a8af12bbc73b971fafe33d98a6985f5def9b6c8c9cff80b847f6e144d0ccc5f0073f57bec3432e0bc4d7de3c05290edbdec0777bd31e7a83466405a3dec93b3ca3f9a7ced23c5961574568d370293ffe64c7bf559302ea6bd0fc16c7f59d372fca6ef20e24d26a65efbf96721e4889cb4e610520543158643f43b18598499627fa4acc8632bf9e5317994a99918f8c654d4bec62411b76f68680ade5500215d49acb8331cf63018d51fee0f665d01bc3cec895d05bb6cf8f0603014c2a1eca7afa0a2e282b7fdc63b094f293a1b6ca80026526290d98197b521e2b5175ad6723ec71cece2e6f650dbeac74610154c7c1fce1f0dcc713a6a426afe73692097042f0c1b9b7bc4c4e61bbefe2818a979ceb0404fe60a730e8b8df770815465b5d7ec234ef8aeec66d14ad2f25102170c8efacccff3a93946f7350143368afa0bc65de027db0db117978c073317d4838c9a5b140abfd68d9f1b136937a1edd86604f095f1cb094709e6b6ff66212ff29c0ac106d161bccb4aa66f383263bc66c924793909b3ec7e6fca29f9fcbbb7ebedd1cd0d5102f4146359f1cc362905d0faf32a863bcfc016927c1f6486b31193dd5ca7f3de37561ed4e18f14f39343c148c978b5be431c4349b511fd220e726eee022de4cdddff171d956914f188382e5c83b2317ca21266bc761aae7648b2d7a3243c29d96e3df7bcfcee559dea2f52f31654561fbfccab1390e4c2c6a436a66f9a453f8c2af2e647b577788ee386ae6984d68ebb3227edc559781751ea0320e1626b75aff587289ce04a6a1fe04acd230ac85f9ab58b9994a8732bc22c2e25434e69f88b34f68cd3e09a383c228647930c903f88fa2ca6b8fc7f5ae2cf46b99da9e6efd7c3855406ecd3ab83abdf8edcfda9283ccd95d17b4e500ede81967fcd7798c2dc9759894ed46ae3ac9c1dbf228ad8f15742c2b2efbfdb287e574822c51140eae7983d9958e40ca8f689de5361685c20eff44f0cf0923d8f5b6de6d28c2e0239e15dc55ecd392dc68f1063679df00b8178502d7943780674dcf5dcfcabbcbb2853615c4130b5706aec20b074d2a6058565c0b7a12cd0e6880fcc221f9d6c184ad336ae21d71f187bb0014d600f2f7ae93a764722d60ed8c96e12105a8acc09ca0daa53269ab0da10827c5d8ba322b2943953bad198cbd714bd93c06f0e017104a2c08a56cf5121755040e68aafc11ca5d2e8308d62a4d761ff257a5119a63a485624ca89162a01abf7f0227d8ca07dac6e54fc06b236e672345f07a03828daf27705a77964ba15db181912376b9765ddf9a2a0f62ec03df15083d9931fed94972de4bbaf6ca45018aaeb49502ae6ab41461c6b50e512be7bb36d590068a55045c1753e0c41d92d11e096329a5642b273ea91f7042794928ba2d92398d9365aca43b40c99ce0b2868983fdbb5e3e4091bc516848fb6fa85f6f2700a287d93874069b8600d101529681fa52890e537f331a79ac32b1930a41f18503666875a87be7b3ffb93266f78c182cebde965b2b114b67b21ee8bfdc3486d1cf380d17c52788ddb06dce4c298834dd14a032f791edf2b096f83022fc0d5420b69ebb9d739239f424090556cc8139082419ac90fc030f91dcfef2df8cefae62c01c9631f1a7706681e1139c7d25a2e6541cad2507ceb3c088487e8de6a0d60124f07f32d518c14e9f35c322793b89c74d60b6ac7988061044eff19ab982d0070f5134d2e1d5176be0e189470c26bb94e465eaa37f5564fdd6f2b75fa8449b964adbf95efda31a0786ddbb54e6337fe6a6a0a8cd8b5ad81cdc83b9e42899eda552da5c0fbe43b7bd40430ca4db196904acd59fc9dd6d2d9a1fcd896416c28677ba6b741f49e36cce89abb946c8b658402d3e71673f0deda41bc7fb6b6487bf446e944f04d7cdd1fe35d8c11f1136e2238274e338fdb982477072d596b83f0a4c56bc1a294ab6c403d4e2c93beb83bb2afa51d50f603704486579fca1a56c6823972cf7886c78bd09b99251d1dfe0684bbc1415c309ff09a348ea73477cd24f1fd2a87a78f2cb1003fde4e3b9786600eb4976e066c3f6418e25dc6ee42f9e587de0d233524e872570d07162edfa3770a0049c1c792098b8807e3f23b04569b2e5383648e10fb93b0c8d790e1a0b5bd85a7ac29d15fc5d77ed867f1310cc37fe6e37ca687a518c88dd5535345fb8b4719f20719615a0db182cb74f9576b3b8f1f8a439c04172a293f0c4eb34759cf7cb302e6ad0ad0527e05891b90c3b5122cf06957b37846e12038225f01bf6dfbe94e31b675c36c9b0c65c9db294c0154cad324a36b72413ee68af50c5e8f7076af3628b2230fd72bf44a721bf4cf9cddf65c027d642a18db7dddc0dbf1212ee4327657149c8b0189933b3a83a5da495d9fd6cb0a1c2f4520419ba8a26d79528d715f10335a0d4101d4f6da509a3c2e3cd32c0efef852114644575a7ed150c66813c0b7511e9463182517aa608fbdcab48d152bb9ddcb0494171f5253c86f8ff85cb1c905e4780910708422172cacc0962edd2f9d7b08e56756ef9d0965228d5d7c128c278b456c403c5756467cf3764a5987e0fd0693cf5cc8e75bca9ad130782410cab4d51691bf04f3b4130cb514f4de8b4e1acfb85ef18c3e689b2bbc07cbdd64ccb88fab44ba4cb9d7d7312ae0d4ebf8015fa4f9842c83268f2444bac6cb057717048eda2907d68174555cfc1c5bdd6069ec460da69962490f44e20041f43c23ac04964388e08d1c2db030734c10e6e84b17ad86bda100f678967dc6a9c8523469f1f362c7c1def807f5914d1397b254a21ca9d98dab989fadad6fb853412dfc3f63168e9e253ba61b39b2e3ce0165c5fe2de1730d6028030b144c3b3db810f773ce4f98dcb3ee5084a62ad2d076a12515d790197eee0cb0dadcd55cad4614d7d13468234b78b4d29625faab6768dc806c139011752dd36d096c57a4d9e4086915bb9d019673286ae37b02506283f13f2e272a31dad8dfb9eec4e2b48541ab683441fd5854d498757c5e0b0d2b3e31dd9b58a129671243444a72bb75e92fe7f32779320b042e8e1a908fea768a3c292e09320b415865054d17da8168015f0721de685faae1564ee66900744c59ed23d2a839c6cbf582341f8eb41120661b5363188a5ee9431a8bc29caac697344b6abe260a5d304be621a9a00cf171446d6d1de576bbb97864c7792b05161c7c34f455397eba9c509cac949bf71399bdb9ea97fb38277204bd22964ed90a0c0612060c56f7106af32da9f387ffe107d9d099771e509554c1fde9c36a4b4ecd4358bcebae2e29ed99f953e910b5891b7269cc9067f2c06a842afd18d157f86eac1be24a29c9c436ded017fa41a3a4adf75d5bb1cd61b35b2545070086dfb96b246bee7424b3323f379e3e398a527611ea627fa2423ee559034f58e01c67c1573971e42675fb637bbd0f9490d8d8b0a05275651c73d0f6ef35656b58fcfc8a09ba244e2a820769e1316ef82788093076d1e342e595f2b663217e4d2f3260cc6b1c74d844440bba0e4feb2798c03a0a0d045af4a16f65038739c54ee840df2fb9561d32cc8ff709213191d6631e313b95fff0de876c058e23f9d1eba5ffc141640f445c520680c96e8bf7431062921c5a5eb5f402efa7db7efb7998497e7c0caabbc6bfa51e7311ef277185fec4d8e91e0c8d8438e9c651be58019da1fdcbe97d1a046b9c0114488dd928618f71202672c33234fce51cb15f4a6b2733eedc8590044a72aa83fe8a3f79eb1e1bbbdbeb00bab7b2282e801957a693a4f4f0e5954cf88326ca59fb19c002656c12b5dd22e710cc14e72a947050735a09f168582d782d459c5424944948151263cf65b3ae5271bf377e11f235e82966524b1e9aeed22dc3ae3544ae660aae370792182f07d7767b4cc861193b79adf7c8716ae767b1760f958be5290b6fd1b48b0a12bc79be3a6e2330038bf7268d478f83cfefa3baef16f279a6717e616d586e693846fc49462ee5936632e0aa65b05834ea6fa78e6d4a9384bb905a1fe1b5d4fb6788a109113d9be875cdb7e33350e15d038d44b485c55f637f4cf50b8b6ac9769e400d78ff8f8a3ae6c7eba2a4be0763fc70e6350c6a1a2a64a18fb9c64cdfbd52428255502e0858de1a04ee3297136e9c5e588b50cda1cdac118452315f3282082e86b0c4be17073913718bb8346dd8756a47e59845d9901718d53a7b58ded58f442d2a6f1fb1d35b07fdb0cc2cddc5f0e64eebfa18b0b5e6ce5fe687cf1f030bf7c5146dd74c83b1ab7e104cf47ec0bf01947660ca532a778c02772a1cf4d23827d2b9dd3c79e0b9409d0d91cadfaca5056eca7204ef42ed44eb1b1e9443d81d17aee5f0fcc95723961d6d5f6389e86a1ca0b1ee7a30f463e39954207a5049280d2beffa264e30192325a59caeb9573eae34741cc635bdd2322b11cf113ad00461732dfa3458d5bf81200a66f9f79779c844e20845b8a8b7b67a0e64edafa20858c3567d3fe433a7954287fee03240d983a7cb93b46c5fc80ea253a622866a994c01d4bdfc3e235e551392b064b4a434e40d45950006c38b448ab40ae852f9b52c45604235dec6145f6a66bcd709c71396c903a196258591d6cd9bcb7b7bf70b0240106b47b5949f02490c1450002bbf9e312d0fcda6ce5b27e8a6a82192700054155ccf1a118a0d84c91603ba9075492bc4d380275e43651228582481a1a7ea22c35f20be435a52b664b1bbfaa8bbc86861e077f48c84fc8df7b8eee2f522c5b0e756df61474d3e13a95c6fc96e92aaf5da158307abecace3ca29e5b7066b2db049290491380a641f3bf5a87f12ac448a27990676571ffc4a4d4d1446a7bc8f25f5c5bd609ddd79ac0120dfd0520f4f3382e28dfeab834166f4bb27af544399c117df06450565394917c364a517a7a10c310d18f3bf7ebec3605b704ca42242be2532b00166d6a3534d74dbf16085d493c6852eff9a4b002f6098923ea8707857e1f08087b0e69cab39090569ab59df8e5f1035e4e4d21673831592b446a05eba947988535ba06b3ba45bccd54845d26d36a4a8acf5b6782e12a55d90e55fede0fe5f443b57e811114263c668e91806da972a6f6d3b8e2c66237699a1c5a1ca4396a91b1531d458adee2592247d21fa938709647b1b428d7ec9e783b807ae1f835a8327aefc9f4b359364f9d6fcbcb1c4870c0034c53b7dbd09452e449bd224f1854843f7d54000a7d288613225a6c66381050261fa72a2f9d7912240201ac735ebf77e5210e5befb703ca4a6300d7c0424639ed8d09e06c41ea3a21a87b3950392a2f783faac210726220b492b38f90b45b46e671223379a6e606cbe98bf66488c5223c665151290838b8850524ef971ab8d918c70948a62be09aadea955b105ae642224c6762c520cfc44a86db2908536e7ac4782fd7d2f4c4a151aee54982a1b4485cf6b84f88ccc5ad420dba073aa574da294dcc89232b951f5cbcd89abb9eee2a80c5a3ed2114c21e24537f47c7e52b0555d7db24b300e5acb4375ed269673149d42a5e1e64bd778792ebe96445ed33c946f00b0b1182dfe1aa888605d893c398d48892d0fe6016fa3de9665a7422503d10995676f1b4991112141d832422f23ce245c08198b451c7bf9d64b9989e4b5575dc3f70d5b95746a1b8fb26c7ca9490670908d724c3708996af3b9d664b044f7e4950210a2896d13e54a8c1f7d0e6e72c37b53195b11f30d1a620462c02c65470738455bddff7ffb1cd289338ee9cf3bffd169a7650f9ee481544605c7ce19063a87777f180eb77f908f230738a822bfc675d2a4ec8efe0d24fe7fb14a0ea168af7e41bdc822cd1cb72f73e212f3f3d8cffa62197a2795d2857d0aad8af5771079c68935f2727d1930466652cce0dd947aac90e430b2a3bfcce0326298cd480b9a03f2f721eeb4506f5df67403669ae6c7688576cb9dc4aaa0f7f05a11db6c48af522f74a69b506f740c4ff115f2cea0c5d2a93d8d591175445daab3c24e17e0da5b6dda585683494afb3c7423874a235a89de6ea4dacc0a3c48d6e06d83687faff2fcea016a2822cc25d578c75ac9f9b68ebb531307f8ba97f3645361c921369f25656f9b38e547bae0685105b34d0d0e8cd3879973c2ee6f1d99e63a669534d9fa7baadbc97ff89fa9f161ae23dab1cf8e388d355433c816fd73404dcc6901c10c6cef13b9b5bd7fbd03dfab0c3100e6e3dd88187d78b3922eaa803e0ecbe3e6c374cb85dac51f0233f075337912e82e1f884e4018ae22005352d4d3d159d81bd40a5ae914f07f26926a2af720f373be19c36239f2e9b50cbda9dfc7533208a04eae2cc68431bfa0418a0b976d3a204f71c2820c4ce2db4dfa5f66d2e966114c59d143841bc7e82ce9a2347ba002a6d5777fa5f8588185503bd70362e15a845d103230c240cddcb4d0edada2be960d095aff43f20d68f34271cc69cb4d40260c368066823d03b837e0f44c57a602ca1b70703dfdc05bf56f0ef9acd46bad10b58aaae821f91b114da682e1ad3556f4c28875c2e5a3bee0378c12624825c4cc305d20b162ccf76502e3450747f0795210099606813a90863cea75133814bae7767698a76c016faa3ab21b61c5498633d55466f2d990760c00fe48e7d64417e3a431358598fc88f0b78fa200165b40e5ebd40e35decaee6fc696ba546c929c72813384f43923a4138742a443c24c5dbaaf6184b6badb6dd32450eb05ae99032bc5b1fd2204ee4f1d149f836b084573b97cfbba9bdf45b42f81f25223bd427fa528e3718e6baca056bc083b6f89994c838f910eb9b2ef60e2c3f59f9f05b1c6442df0844cb906aa7aff0291659954c1dd510d9dc99bcb9576e21e297124d771adeab31478adee2e34f27e5352d8a43e8499e2f3b07c51babeb5ae7491b4183a66bd84a1b6b4d124e87456ea612a4da147ad49b5fde21ac34ce49c8ac1e364fccf0bb099a75af914e1f60166008fdef134e3999488461f9bb227825df4ad75ca08ec27ed200cd0419131ba6335bbeb9bd623b4d9ee96dcb4126f427e8a458567b7d36f13487dc140bb2587fca48162adc67cd0769bcc09d309aa6d09b23650adcfe97652e00d1e24f1d8d2105e0523ce3deba68e3eab113c5aa633637cf7b1ee413dc288de57f0588ed27cf8ba0732e5a90bcfef8419f1acf73f6318f7610ab07902dddbd5bf84a4068f5249e6d5f6fb9fce44c661759ea3ccc76c031e814453d05cb71461b84aeb028b6143ea3e0dd4231e614650d452a423b5a601db29685d05370e369f4939aaef07c8c1f73f17a51b5e82296cd0299904a098a7c97025eee55d14b29519e75f12f5dc09f4baf55bb8e58c4e061c80dcee40b8cbdcb662a596e9daea7bb60c8ac2a08053ea37f2584c6a1ef5e2e02133d8abe25848e94e61af5381192c627f54a121934a703ca941684582056b24a07f26597e77e2fbd1946fd6760593e9d316307dd13c1cc5cd5030680fd9fbbe537813459e0f28c39d16d1f823a43ee45b6a9ce15d5c0480fb04a5f9178aeb1adec2563e0008b56d2882464efbdb7945bca94640a5b08c60743081ce4f6734b7e06e248c2862e84f373dbd21591dbec59f971fca3e6421e61422e452bdd18390e23bba217535a0907ee2d6e8112ba4e646253fc3b3ed9a64c791225174c1d9138454e59698ea223ae742e713764a6302ea9b9f1a8874b32b211cb9187e32db9f52475d1e32ff6f1e12e1ab1cb3f1d2c6b05298505a41591c202ca5e7e2133b9118c9175771e7e88a6cb11e7684493021bc62746401af40634583445baccf58f5a6a8818298b28ee91cb754cce90c4cbb821af31847361c368148d5ac8cb183e2c09643e3afed286a28ff69b0d3c1ae25127c05ffb0858edab6133faed63a282cff63dfda33de649d93e123009f2d15e7a524640030e358c407b157c827cb4eff12d763ea48c407b29db47821afa4be0c3dd8ff6d1107dbc411c7f09619deab2b1cdd67991b91c5efbacd142b14bc7a13a2939be3d1c1e7bebf4598eff7bc45f375eba14563e51617fc3a38149f439c206907fe3dba321faf41f21295d59fdfca8e58b928ba568f4c5a42f1e6151f2d45ccd7c03b13457ab29af944fa43c41698d2bbfe5af66e6929116a52ba59371e5473594ba7858572f041bc6a335a6b02c1fc6a75fcaaf76257db61928bffa9939e77cb2f20060836d8761793a9ebb16747c7b355ef4d1e1235e2935afc36379dad778ec53738477a6cc873a2e657b2b106ff968ec816032cf1e83fdcc175aec6bea65bc50478c97144384f1629037642615f6a9172f05ca97f259be7c50e25c2925273f8787c36b216fa1bc76d2445de3f5136fc9674d91bf153971e5ef68b234f453895d20d05f03096e3c0ed1e7c627a58c5db279e5c735983a87bbf27b4a3bd12f0008f5122d574a19a5a419364390cef1252197622e3197984bac8bcc6426a5c8921ca9df94321da386e79814cbe15c5bf7896126a0946294821527d6ba5a514a674b4ab9c8cc94524add23bf5ff756c3a5cce73c654f2ffce60c1bf39f93e38db367bd724e2b95e0eeee320773777777c7648c4ba639991963c6d8c3306c323327ed650c0929e7a44fe56cda22e5e7be45d62cab5ce4dc82512e1bc7338b8f25e900c93927bb2acd2a9d53c75f2f74ab29c0376d01be2264bac7cde71727e63b1a0431df3cbbaa7508114782b5f94a31ba84ad52003fd8d465242cb818c3dacb485850017e81050d70c02209ab821dfac1b7018b28f216635800d104c3304c054b2ea840cb009ec06207af08e78a0757b2ca6abff21855bca06b34acd8c1698d1b97a051458aada2835395266b650bee06537448582cc9ace4dcb0e6aa9e7170552a555293ab4ada82b7204aa56a6eea6d6eea53a92b7eb8a92bb0dcd40d82e801a8e57e0123515f918070516fad407151cf483c705284aa904191aae474485600a1564a6b2e0dc0a5b40a1f5c6a45511534e01e84418333785812f2c1aa38d21281d0c419480c61791c39515153ac649538f2e5eae80834260c1555ee2cc09d54a471670db09ce69c734e71842b6bffc089271ac663871459dcf9727e8d72e7dbd51457eefc0771a494524a1b3421a59472dae008cf0656a42062fe9cd3872f9cd8d003305a70848b31e79c938389020c1c512461f5824d8b5a6b553d11860f9688a2972788d0030a0a96d4134d442726cb830f9d1051504634e1a29c9218628342d4219d407b22c479e1244b41940d0a317aa84318695014e107fa6429b341070c668582a21ac50e3c4c178448a25140c941c2ac86bcc5350a24807061082d5140e1c4851428457185095c2062298a1cb8f0c4c82ba2310304cfb03097ab141145006a14e1c40e4554013a29420758952280e0a40726b4748b992a135dacd0ca8526869e0041145104af6856b1b10d10b12b82cd0013e19db8a2497d31c41bc6a42c66d56312bb20c03e31bfc5206ef99be0faf340c4bf566bc31587ffba212f6d552c0c6dc41bbb1e3f319f51c1b9acdb4b09e2e8a834f6d3b3bfb8b69f2aa5a1bef03b893e33fd98e4d2db3310fcae54e6d3a25beeed1ef81e84f8e27acc47c45b3ee3840d75e8e09d7ea2973e19b1c5dfee1a18c6d3088ecb1db8ae354ad17ee35a6b0ff6b1ead724d8ad0df382284563217e7dea15c9324ae9ccbe30d2c7aa473f529b6ed9e37b5c62536c395060b19f397eb0fcac060cc0a0728512582831f9c497b10138f2ebc962fd5b7d5f911217507ef09dd8b7d773a77f8fdb2db8ee188350843aa5ff832ffdb02f94f383b0aaed60bfb9234e82d54b3df6d9e2a89b882f1a88a3f3d957d4a9e3e637bfe370b4f9126befda59c72cd6e834de19b99b2f1fabe37f968b3407da4d2ccc6524a3265a2db0db6524a3237880646485910e6a58ae09891a24a108260840440d8a3080218bb5d16a52032d60036ab0342f23f5604526c5d32a0c16e2ad9dc9c308e01300b0e38fc9bef10a41ba57b4303100f35e6830e29c80009efbb12b7edff82c9b8bbf79949977ce9106e30bcd205906c18285b1f4910e8e4dc3505046df12843484b0d20eb604218d20323a16383b7078ecc03140eb1aa051a8020b50d244af95ab594dd178de110eb361aad1b204be846c327a1a42b00ca94228c01d19315b380de756ab93d0a3b16d31cae8b1b52933efda36d4dddd1b7377d7399239b20747c75fd8ecee7677f7d8e5deb1bbb7d34c0d5863c0c72efe2ea6408169107b49b1ae07f65e986d15fb9ec6b288bd0cd2458be130c7d2c9132a08bbf87980dc18262d8679956a84cc74b78de3ce89329f64661bba7f5766cccc9699ebe4103ca1583ff5a6645469c1a114aa4255e8052e7e55a494b40dda066dc3c6c7e8d3261b9f37ea853acc1fdfa56b524a29a594d99c2fa59452babb3b7f3dd2203fe52ed863d8d4a2820df2cca47429a5942ea59492c1adde60e3b39452b2942e8fe0a72da69c5272ec32659729bbc8c984c904c90425cc39e53bc628bb4da13ad8f82e6990a997ecc8c86808a329514d4d72367199b2a949ce262e534e2967939499724a2e7236bd787c9fcc2e19e717b99c3c2544e614fb28eb9cdfe3d393b3004e6cbc731ac166e34dfbacca4c6699967dd56483dbf7f4f6d17e9edf13fc8d7a717e766adadcb6d7e6c7e9fde0bb3df5f8c6d82c03468d0d573d9be296ffc74e0c7bbb1f7fe727d303ebcf752bf2965d8fbdf97d27869d9f7db6413965fd2f321fa6d3b25ff96fb3004e3c09bddac70273d3cdb0d9036773c28a0f4337895fcb567e58c18dac0323a594527ea1119c989898ee7e791a2ffcf9617eb5aa55af52a9bed008cecf4f4c4c0ceb5931ac2fe6865dad98c8bc3c8dca0b8de0e0dca059794c66647e62626038bbe2602a0eb7aa41b5adf2d26112192691292dd5b5bf2249e4f5b76ebdf0486b1d0a853a9d78e774ea3adee93a7669cff18ee4b4df78476e9ba6f18ea66519bbb4fad2abecd29ef2cee9b59fbcc33ba9d75ef24ecef61ec63c18df68df9ff23076f59f3cca3c926ffab5774fb24b7be94d76699f3ac9937fca637679cbe7387bfacedf7e117f2939a97a4ec5a99ef30fc9e993d244f5aa6fe6552a99998ff9f92b7fc1fcacdf9e6b2108baf6b9af5e9124f2da47755f68bf7e6ec69389f12c8cb73a72398ee338958ae35e5eec498a8d6deab680edd95b42a53e0eef43c5e3e4ec943f9fb9c8a30c9b7d6cba217d4d03927d614552e443fa49d9a40cbdcff695808a7c2acdaa57de8af960ed7d8006dd47639b5f04491874432925a0529fcab645ee7ab40ffaee7fd2b447c27d32d05cfb1aa7d99e6e6603c8741880dbf27b1c8dc3636e75fbf3553d9fbea755a7af764e11ecb3eeadfdf6c278bbdf5e3e36ddd46f1b6fcdc9ab39e7f9957d65fd4217279f7947fbd3b7abbf507b1b54a47941454d57e39a93af79bd3d12fae10cb79381e6729f7aee1e502f12fa2128a27df745b4efad3f24f44329f39bfc90d0f65cd62bf3fdf621e13e294d645ee6e96f350e78ee7e707c4fcb78d55b13c717840da07a99afab42ca7ccdcfaffeaac121f3f337d5b7b7a341557fdfa00ae6653c1c3532ab97f998d43ccd3391f91baa9f7926aabff1d65f333fbfc6b3dc52fdca5f377ebe8ca7fa1e87f1c2005cd557a47bbea87ff14223ac74431074bbdf842eb32bf585ddd7bf3d5feb6dcfbae1d1784c561f0dda0a8c98811041508183283e3cf3d9adfe0d1e68d8fadb56fd45c3126ea3c947e66f883e43d48749908fcca67dbff4b46f85fafd80faf2bd5b81ded63efec9930dbe62bee3623cebad292718563e8b85af97952ee60019e2cd3ed60af5d23742af0c7eabd2152e98ecfcdeb6ea890436f617951824109b7cba3de6965797df0af5fac73e415d82d82d3ce5d842561ffbfa19e6dc7caed7bbc9427dac3275006d6a6aea72b125d46fc1a873642b5df9d987f5a994a1f7d1be12b4920f957eacf3d15fdb9b9f451d77730ef3fafb01fd45b0fa2d18e9b863a0e2df6c1d4485c7d073e707f57cf71c9fe3f6e750419eece9f69f7430337318743d36ddeed9f568f693b3fcf9b2b080db31b05658c0ed5f0037dd3032bbead1c468cda6c635d87111d6294fb27315e8b8f543a2e3d69f3eec4512996e8d4b1c79e29491a79550ac6ea1fc0ef2e137ec5898efdc39a0629f8fed6bc7c2fc2abd96e26e5e91ecf96a5e91ec63617ddd0b5d855b3f242adc1a65bb3c85a0af0cd87d8a7d2cd82eb6f86c5314b1b4165d6a72f02407368842ce03d2164b785ec7288f36c6529c174497df89cbafbafc85245801d9380496b1ec807451dc391e6ebf6d918b6ddcf95d3ba7b2e06d08ddb0044aee6cbadb77b92f8caf6ddf378c9fbd772c047953d3edf19edee16a1e17a1cfb77a45e8a3629016fb045b3fdbcc96ed2dd333bd6a55c3744cdb4ef54bc746f5a9bba6f9d67a6bae6bd3c63a76bcf1fd95c586a561fec81ff957917f26c67ce10ae60b2dbfea88e872eab35fb862b141842516a13e2e62ed86c74ad1ebc7589c915fc6d58ddc754f0bd51f6859776466e62fbef65d2337333773a41f63a4941e493243e7546c6a571ac4d260fc8c1081e185af71aea051609b99397baf34f8168b62ccb237d2491dbb3b7667f1e5b6fdb66ddb16330f89c77844e784418f02db4410613771fd91ba09de6116e294ed88066583ee99d751fa8829ae431147252d0baef30be79c7372546c3f7fa1ac517af4b420ba31f7eb12b26460e33b958d19bb825d91f259baf7732fb179bb7bccbbbbe3f01a77f71befac777799777787797777777777777777f71fe2eeeeee38eeeed57d453383a326d3b04a3794e54e5d4a05f3728325a3847583663523a324060c18d58b92ee74ea524a2cead4714a68ad7453a26595e6f84e89ccd1a111d939e4155b70f4cc112d34976a15ba3e31724c3774a62e10601fd7c23e397450d9857dcbef3a439d4bdd85bbfb7b8f9618f6ad79365b11b91ec52676e4e3dec2cf7077af2291d8f86347b99b73dd845fb6871bb95c356a3e8c6b5cd6cfcbc894f8f2acfad4c7eae476dc5ba6d6128bbe88568b78426dcfcf21022e53c746452ef126bef64cde8a356b27f1e6f9c75f9e14562391c7cd8845456e9dc8976826262277125b49a9a8b97051f21797c8d35ac49bf85a70616a2791a7978837d1ad75a2d84eb468a9f9c215eb0bbfc64931ed84da3acebea852b3fb81dd1b344966acbea4994fe67333623a1b7c4b1a75094530315b542fee728975a225525cc7c4c4e44e2ceaa4c4a553e294b86c182dd2a2a8480bed732dcec4a5c1a8466f914b6e8cbec68d436057fcb05d0bbba2141cdfd960f943d7d2ccccccfdee9fbb96226c8cfc6125aae9192628fe4a713aa7c38814bbfe1b31c8db3caefcdd3d41b1f4b18fcffda6715bf65aad5ddb3bebd495479388669986f5b66958779fcd8dfbc2eefbe91cbed147c3beb0d2d45b54ca9e1e75d2ba8ab179f577e93289bd4831c62aabd58a777a48b768582b76d9558d0d965ab1974fc32f03649ad6f508b2e21dd495cf383f1f9006654c0f36642c38b458f98eb1a0c4963ddbb24cc5230a214123a5947ed635f6fe713e730dd2efe94a64bdf31174315a44f7a675cbe03124b1ec924f3d1aafa65bf235cfa65bf2376fff56ec929b7b2cff90afd86028aba1c807fdc21a8a2ef5519ffea84f7fe3066b8cb49212b726c1aefab1eafb576badf463cb4ddb5b6bc79ae6f0dad12d6eb5f8c64fa0975ff4f945bf1dddf2c7be70bb61bdf38b4166a928bd1d382028b9e8fdfd2bedea9d8d4de6784dc5309a2465e87d28f6a5d0a04c815d724a4c0576c95700dfc8df648f14748c6cc8615c39a473c2958e01704de45100dfe4e01d156e5060f0a5c32ef9f3637c92d1afaf7d3603a25f310cab7269cae0d421a961c69578d4f9e062d1d6f9d8ae4f28ba3f82f5892311b5eb9e4f1fa134189f28b1db0c341c894e78a76ff7f18412b2dda35efb6c72bc63bbbc46c0adce7e339c86387d7dfab1566befe9749ac15f40521f0ca8cf4883324a2cf758f730af7ad99dbeb3dffd0cfe02bdd57d4d755b87717d7aa95e4e24e097eaebbe1b724e9f0eb77b1450b7bae77ff18274ab63c1ef0a7cd371dc6f282f88f5f8caedfef49da058ec27e8af15b8d53d19b7ebba0f756ef7ec5de7eabea79fd8fef89143eef6e985ffe40569b0fb976e736ee66562663e2b1353ebdfeebbfb5902d3bdeafbf156f7b103d260f72727acfcd87d4c2452fda97b98d3cbab4e1f0bc54259d4dbd3a34ef6843afdca5bdd9f76b0a7eec3d5ed7e86ced1713becbbeed9a6fb8ac4a2d9a726b82d08cb0daa61c615ad8b51b4eb9f7591c84776fd6b17857cd4eb12099273b7813962a3bf69596c162bef64cca33d6fd66b40b7e847af278506290fbb280a7c43a906d84561f016cd00dfd06ae90b7449763d2aa5f4638c315a22fea2f1894486b0f6535f14fa58402fac98b7cf3e2f1fe423559f7ad5c7024ad1c09280ea6154413ed9cbcbfc4b4d7d2f1f7b2b4e919bac1cc795b7e8c378ff42e7d00869907e7b400d6adf4f8354c6041de01d19ec0698c79f3e911778277bfa30748ea66d377adacb08d9909788f00eeae96780794e4f5f039cd33dfd0e700ef7f48b70cef6f441c02f1d6fd19fd1e1ccaefa272ff24dfdce7306eb731e65b0fee66d0cd6d7f1178a932e7df6fada47fbeb117dbff42fdfd0fae9b08bfe098adddc7ba1418abaf523c22e4a9ffd6fb59f7ad587e32dfa2f40f653f56365f5b38f95696fa495b4ac6a35ab0f7a8bfe69079b42e760b9d90734a5c1faf1eb740e4d143af97067add507ea9e7cb0b171b0f10ec7925f5cb71ca65b1e39de9827e31b7faec1d6b2d8adb9ca2ed724d75ff4954817684a833cc5c636dd200873a3f6608b5f37cb7ad8254176a11a1004e3c0cee96f4757ae87777a08107f116100ef58805d3c14e01bf9d2524ecb62b51b72d6f9f00360b1f236734efdf60360b1f5fde7e9bbed39a0d367bb49e9c7a2d91bd9329a51a6239dd3577e922c56de21424e4416fb285bf7eb9efbd67efbee7b0e48fbad3f963b7d23ade44ddb9b8f72ecc43a23421ab1c929de6ae951640fb51091d785c9859c49cb1253176ff563515af2566b51aa4a995151d2512735166ff5917614c588e3a4d745de92d2eb28a827442dd44344714888a94b149ae1486bf196901f18881c252d49e9e9e000e9a95bcc13194e7a9168860501f601bde5ffdef228e4adf68e784b7a44bc253d21de92de4f0d273d203838e9f5e4e0a4a7a383931e8eb72427bdff38e9adbc253d6bc349af7a4b7a2c80959dc14a8f0501f6a9de72d90918f216c8498f05243f18bcd51fe4b371ebb4590103e946302e237df1837cc55c19666e7c18dee98f30ec8a32d4db57cb627d75e58d4fead7803d7d09843dfd3e1616560d45379c6fa495e6d785d2f53fed6081a68438389d1373c4079106fd67f7d3e0ec6910c7877f83cd4bb6f0c6652d872318bff0bbf1f9dbbfb0ef3718afea200aa101668c31c6c8aef81e5bf16f7c8c4a4a428ef4e0064764ecd84c8012853ef56cda61981c815235246717135309619c77c5894f66b0f20810b656cac4c474e4c81115143664a623a4e61df9354b42a6c1e460436682b2bd98c15c8cf47041709d92ee74c56e27948a092818daaa6cb02133f15175e94920423a8bd44b1362528aeb1893224f04d231e945b506962337f222214474705216757a51ca89b261d5ae62d738fdc2f9be756c5ec13d874d32738c07f0c2c2740eb78a1dc6b0c63f295629b4610392152cb0e189248c80c40dabd665a4329eb8a7cb483cc8610d185bd1e83064b208c21658ace08c2cbef0342a30450926306083871900c194c4134af8b0050d2c43284388223ce1c5510f16a5140013765eb69203130428b2f5b2951c90a04866108159c961e86e97ad3461a3d7702d6104932266a0841437306a1fb41449741835a805549a8cb6a8428910d478c2a70a2a866842858c13302142900c94a0820aa32fcc6062061a407409c3084e4c21c4141d7079820344d0c0062e6010c590920fc188043734f1448726286109679cc14df082cb900cb890b16404dfe25a18074c8c8104222ba46c9101ced72c965042b542c4e4486594016385480757bb6c85080b256af31bb513467d74e5092b188a201714c1a8054760b1c610429e250442f0392aa3890a9a60804614a38612436432a4022f24242424b4c589932daf4587036891afc396e82de4d19b9c6c1c5fd873830d13bfc8c3374c126f94427fbb51250ebd0f76e304966f84e996cb1b3e08aff2eb7e649c445edf912de994dd4a3d61e3cf2fda25fcf894131b8db055ece5639827035d210addfeab55e6d56fbb014e56b5c7b4ac22f19034d03863256cf62b599379d4c3784828babbbdddbbbbe79c18f6cec4564694324eb0c619647421c50bc808828c1b968ca0ba8cb434c6cc65a4a5a4251a2c4959ea610c36c640c21867c85c461ae34ad218518cf182315430c6500e4968a265088b09c4c8811855c49881182e10e30731726023e632d20fb460f9c11596062eb8302c38228816fc608805b76b821117264b142c2bc0a2888b824205b7a302e5724610714f3f5c19228b10f7e53252184a9edc4e8d2b29c88282ab9d11c44d8101c44565f1c3f51b5cf1214b0f17ab82e8a68a78b8f40527b8d5881d6e0784934b2f23f960071dae652387db3135b95996a1bb8561828bf10087bbe180c99d575c5992e5869b4971c5862c4aee160329743b175c69cad2c69546b071ab1057d6c8d2846b2f23f5a0c915266459c2dddab8d2258b126e97c695247041421635ee16c6e730c3fa11ae5f4602030c30ae706a051ea51777f2004540480bbe04549f521a238db45aa01f20ef6d9a4cc005e6f1e71d5a7fae1a9c5f6570b0212bfdb4108109580003fcd2a94a3ab5cef97702fdb06b2ae18029ac341f5c71346b28c5408ad534987d2c1ae96fb4522c64d51f33d6844666c4e6a45fa433624f2316e7b4737e2c6c3ef6b1300c9b139bd954025cd5ac583435362be660cc38b2e2332a3a02408d0d8b66b5a259ad6c914dcdaf56384c4c61f31d0489c5528079f855bf21f4931f0e24f586b4101d6cb8ba14c0b1d915c22effd313db92597eac39b1297f4a39a5bf5c213e46619198babbab7588191860977c29dc775ab86f488331604f7f089117302f89bd1660579d31e98b47f128c3c17182e3afa885192bf94f6ad147b153e2508348d90c6c4c3aba72a59d81893c1790e11d0cb08b89020cde0879626bad4cb1c8a4e9c0daa0209ffea98951b3ac9ed0f276340fb0f22bc3aa579dc60acb3ef533d495f5ce2484628c1c86b591235e926e1561977c0ff08d740ebc61977c29db73de06ee68d088c300faeb87d6c73a1fddfd61970c13ab02bf56de927f02efcc977fc32f06230ff6f209b023f2642fbf00bc739379ae1df6d26f1579b0afc53749270800c3b00108615c6a0a51877fe8b44efc8142ff40c17da0905d9f73fa9c523be9d0d9d9c8ee0737d8fdf8f958f7c39b92310c8b18d6da09094a763f5cca1fddfdf0ee47164baf96c56675326d6cc3c1649bc7d91b564d567bad734194514a83505c4249c02ef923881995523fab948619581d1d22f3669d8feee228b294526efab1d7e3587772c262f3d3316fd8d42b6a566b96d55a9bb677cd6ad0715cd771b33d1edbaf6aa66d9f0e8ef6e9e0b827b3a4db9e28875d591b1362dbb8b94d8fe0abc5add9fecdbf524952cfa32e62b14b3e0ddf14619eac12bb5babf5c3191b1c21754bbe94ec352fab300d629c7bf18838c58b4b744b7e0b8cc06a8c825df2e3137ce351a278378c464652fb19fcc57df1894fbe51f7b410e9c355dcd0fa0d1e6558aee2b27bad350bc08d4bd5ca0b53f10bfb6cb8cda673e263fcc2dea625a57c7e9e99e117b317bf5bf2d3b055e9a773429d2b5f2fa49342e7c897cf2e798212df0ba5d58a5d2ef4db2b1f8877fcca1701bf70b8255fca9608e057c8d3b15f401d060dbf70bcc53b4da441f92f6ec97fe1c89ffad4bb55e7006159527ab9e1eaa66eb7425fec5babdd0a7db5f7a858edb3a206811a940f34a48508b04bbe8f1f2a4a1e15cb376a58b20d468679b19734d2ce86108d146157e5f100dfd49ae5f0e82e07a7c1fa59e61969100625360ee1a0842c8f06eb6799bcfd5e03d8557f93c9c1cae01749bdfda83fbd4f57bff690c2699dd6f568b2213788a37b97a74e2bc2afd3179d74ab7efd803882f635e1d6df28277383fd10e7662feeebc7a1531c7a20feb2df0a25843d7ddfea22a95d8f9f25a8afbb38d460fd9313566bc2adfa462c0961939e685eb5ded250d93357351dd8556313bea99cb7e4861208f970acec51570af771675f1c8252638dde12ee71781feea3a269bf753d32da0509ba5aac7555ad91f9b1b28f393ef9e2a2938e43cd796c0486ce89482292be8dfad3671f89bacf501fe8adfaa78cfb2efb581a4bd37ed3b22dd3b2f756cdbefa30b06ecdadb1e885093892b20f549f94b08dc958794cff64171bdb586b51d7b24beee8168f6ea598a7a5e29d137ce686f64acb3b280cfb0dbba134bf08f65549c106a5ddd1a0b49db303a6b31b3b20a306ab538e51c29678c7256c138505ddd3a3b03f7d2c20fb27d59f9e7dec07f954d4a7b0477d2c20d4a73ef5d150c30bea837ca27d98b7dfc37c8ca1de3eca4e89ac18a3576f4d4c27059dce99f1e8d3c6e8a96e276f47b7e6470f64d7041d4ba1c1d9e3adf9123b256193db61d32d8f6fe6a901dd9acf7f9a73887d0cf08e0cf602cce33f5fc810dea13fbb1e18a555767d213abcd3fd7c149887fbf93cac02338073b297101d1b73dee63983d86b1e6510fbccdb18c45e88bf5013fbfeaa576de67c9fdf29609f0ebba6ce9d18b6f2d6c4308c6215a3d869074b3f7c1bfa014d9961a60e8abc314ab13232d94894813b40558a6f60bac6dadbcf2cff7eb4f6406fe1780b356def4aaded1c2d126141bc96659a963d517dd243dc72a795ba67350832ab35cbaa740fc889069f68f5b34dab9fd1da5d295b966173238e1b639aa6a27ca06e7fab2817a7ad88b26939750bbaa7362ccca79efd25e3431f27a394f60edaa53c3ab90da6e63198ba55ced2e7b1e3045a6586629847867a67784786d5b5abae5d8f0dcbbebb8a79dbad35dda230dd52a5f8867efd2cbbe8cbd86035201de407e41dfbf45bcc7302e7dc20e0456774548b3a751c10c60246ad2bede8f73418843a901d0e82dd0ad86b0ff3aa1798afaa52ffb2bd9156da364e92b9f483d0d73c5ee2a688b2aac926d53e97a27dd65e0c49e4bffc9e35bc722fa2b6a8546d58743de910d100000020004315000020100c884302a1503420c8b2de1b14000e7398486654170aa491280762140541c6186000200018628c31c814155501adb64ad121e68267de05dc66414b0192b2c99904d78b62811c63441cefdd086fa45d23c4ea2dfddcce1af0e3e2b9ddea3d2e65bba93f07f1c59389cdc74e88304acf3892d9bd7ed743c5fea13601808dedfdb5ee3a724f371604e9c3c41cdd767795a0debb90827bb90a030e1cc1dfd6227666abe0f2476168b85d92c8105e546b2f625141bc561002aaaf419ad79bce52906ea36db067f465719d7696e225044a49a1944f2cdfe99b65d335ff143e31df13fd157505f6c8d55161dfe7a963941dcf6f1784367056b8ac3af7f5e79d56a67d2f31b99adab1b456bcbb4c903d55af6a1b08d975cc1839f970c4cb19b8540775c70c497c8614df17d3c1c6d92d3c4d6a393e768969844f72dd9378672fe1767d6bacf8ad3187b109d62936792a4714f90f447c46d1e2d714ab200cd582025ecea6c41c44b72991bca4827d5eec13d91c86d14333279be7f2495e5cfe611bd1395a911d89829d4138382b157cd759061644b49a4e62f79a67d563ed009d4439372611ab04b89027da8ae8fc1ff9e26894452a0dbbe52e816fa154a9015b680808e3231f1967445fa0b6cade0e21f5af7a2a63c6f04da34723774ec0661b00eae40fa42b09e00adc0c738033ff5aa9da41b66d1628c3473c368cb861967c284e6ed6536b5c83e56f0afa8ef4f7cddc1a78472bb7cafdc0cd1ea4be39889d426dfec678ad6e36fe4714fb0764e72713109a3682a42799ba8702b186ad25858f05f5a92721cae4265b49c34890713baeea52c19ed0afc09751e5e6ef9a776299d9a453d27c28b6d2355b92920b120a556c08a7573e95b04b50e1768a299818d10d1b0c6c9094a98d6413960a1f7d66434bbaebd38f3365d2a4e280a540453a1f4223920964ead75e64f80f9c31489363b51bec9705cc492215a5821e42ff28aa40794a95ec20868a655ee4de7e1ef6aa196f3308396955d43125fe9c24ee23ccea8dc5fb48a9b02aa67ae73fc284c2609569dd126f259e793a6f130c229054df76fe23a5da284618ad2a2dff2317080f55553d41afaeaa8f31e88530de31d809fa84afaa4060733b7d1bbf0812ed7d9a4f721a0b43615996bf1a0bcc6c2c9be85ea43187100ad1db7a5cd23cf6d3b7237ea15d8920f8b6e0e4e44545daeab9aaa6a6ed7c4376879ae63d2a103dd7c5635ee02e00a1ba53d33c3261721a8cbb66166c7dabed3e7250b2a2a6ef6d24b56610f6ce4092ec34e08ea0665aa101b9c74981c65fd001986baac1f9dbe5571fee8f6c82a53d14e384038a60c7307d62d8b99de4e9fd119b6f92533eb4f10b70844a04b294dccdb7e86271bc4248c5c9bdc46104c2ad0a53bc49089f8ed65274b951adbe23bca97a17d3c55b2a3bfe96cea8ff886e2bdee6f48d59ac02cb337148f8447e94a314117c400081ef43b57446fd8ef046e1073101741cf7fbaa0f1a426cf4d4f6d3ce32478e9123d9a85d65b97488fb2b10ff4fb208463a19fef524dc6d95a7f517e1247a350b3c63ca17cc9225685af1777215bb009538521557088e156155fde15749a2fb1fda51ca913828e380c705dd90b1e1dfc973a3131b1fb72a9273e09dd2385222a2e495d4d3a53572a27eaa1238cd2ff51cac5ffcc2c02dee07d88becb4ad30ba7c4c04939deefa2503d75407a767ec217e38393a0d2ecf49581f5c84d31163c62fd866c581093f60b2fae4815d615ccc74ee1cab7492e25400f5556ac244f267636c9c4c5a21172f42a8d6d8eec256c4133059d5c53e682798c6086212a1c7d55774db521a0de1cbf3f0492386efe7d1829b3be6d50b1989f68af2264c77d78fb6a38d6a9c27006900141c17f7879b60a74e64ee56fdce02cd8d5c25722d2792c9aa1029170c2cc372bced2357f48696905c5b53955c7a659029067ae3531fc7d7743cfc82d23c48c4f99892ea7d184ebd733a70c2ddc33752b2931059f67e41a0075b4a3d17bd2ff0d11279a121c0060dfc30b1a449f612e33d5811f7c63a03f81b633dad03f9c8c43144ba623cf0f60698c9ffc860781e4b6f04f7cdb33ef6831aa06f4f6824798609e339957358a4ed42f6d777928c205fa88959fe9dec7f8532db336203713f4f21d6f6122f9eb016717b46bb9d8860ae03f2d212f52006a300f31944876959f48a5ee16d91baab620d705407c31ceb3a6b42f00c255d2f3e828625d3895b49675f695e8b66fb98b5d05afd4ad7ffb9888231160f42447bf7eff30819e938f6a52fb9c04363bf97f4c5414a13b208bacdc17ead0456093b7fb2369a244f849654e9cfc340c471993d1e3ab3f4915eb311a22d0cece2fa919be8a2597a4427954bb9076a0ae69b0469c6f4ba1c2e318db7fe076d243429592c90a360e2dc889d999d7816b9a63b122e48508aa84dddbc4d8426aeeca2bee81e187d8e2ec0b9b82e9a2c9180968426a6bfdc06cee6d17abac1dde03a9d6af0e0874d72e753e993263b2599500d08d944ab5564051a10a0e536a7a935297c985d2d09317920b5ea574b1c6c8bec7e6d7fdb98a68581de0e38630036c1409bae8df108a9707885b5cf0841d69cd09abf9996b5e475633d494e1796c700dcbd74d64ce9220c66c32b3318a4b1d38094d572a390f65320c24d4888c4645a8f34dc7b6a50fee352779e8d90e9d5cdac20e0515835cb03a819cd61724debd0383ec328abe6512ca6ca1d684b5b019cce4d17ce46e18a5a67051498bf3c42745579427c8cbd19fca8535393bf3c0c30d98f04bb8a1c99dc07da1bd04d135b11285200767ed4373f87768a660c91e51fdb1a3351b43537b613c1fb9897b4daf87bf6fa10f414709dd2eb20176c1b52428f071c987b563edd726f7db9bee413acee6ab92da64de4e204dcc74dee9719701c95c6e4a7dcfd5af771184a209a9e80673226882b136a71e609ded70c7293ad46c8ff9c02da7c12cb3a4bc537060ac28867731a823c30cb62de804a186026e937c80e8d8880ba0be97ba24805564deccf2c3189b4708e543a4c873322aff11800904e9f33992cb4e7d1ab04dd12cd9fdbedcad5d25ba2a1880fd567ea77c9c6fb1f2bd2f8e183f6e3661f61095d5e898811624806b71b7404e5dc74b1721e353576697b85e24374b78019f0682b25c779f32b527ad3ab93c88f129b3e91629438eb288db08a33af8d489679378eec838c52b407733003a8d84b998d7aefb39b1c8ff18a370f083f6387460aa09c7450bc0f9ccffad59784491efb640622727de772c5c53b83bfeee59482dfd0fe0fbd8df278a45fe95bbd3494825c2edcab25571d2ff195b756811c65ebd0ee80dd600de274489d0478a5be74fd39a8710e7f8883209e926300270effe1fec05672780d41612633cb6420debb15c6145af01e1cf8c6086f233dff5925dc97cd2a89d2737e74b0da8c0486db67243089c587de1bee42ec1977d1d457f9b75e6d988f6918108c7903495e191c21938a52ca0c9a9206bc47c4eba798be72f9126bea561470f21dcf76cae091812455de57f9ae30636ed4780e78c80b3a0b51ac20e4ff375b4ccc4461e33a8f9757b5442becc0ae8e6b5b44f0baa99036063b7a01449fc12f37561d1b4abffaf89c7c334fdb47ec4c8583da031303907e0c0ebf2822dd5a76606d278a1290fb30e62c38198f6223336d8d446d4a84f0bbd96ea93fc0d692e291744ef4a5abe72ecf1c701ae35ea15f7ce98282df4617edc6792a00342b698b3cdc68cc68811bb8c9834dbe9e0e80d0cd163845b9deb2f766c63b035027ca22d3f1f1dcfadadb8f41baf53035988f851911e8388cdf2e14ecd1836bc77cb2d42ec19e2fb8b618f8c753a78ba803d726d770eaed0d2abec200ae69c04841c15acf60477b213035f72181ab0df77b1950886d7508753c4fdb715f84de16f81a75e871e4c8eef68aa3afcbca306f854f66fea2058670914c556f22e4a605436e3c7711a6f46d5689f0857025c46f40d7dcb1690d86eb0ed6ef3fbe5e0f2e675455277bfe33b09faea9cdbd144a8ecc79184ae29cf48108699f0b4546079e4ae536a8ba24518ebd7590fff3d5acab0ee3fd99e4785c854bbc5fe7da3f5e51385d2e4cc359dc6c2b5c6007cfbf530e4f6badedda96bac0a8dc5e65acc9060fcd1e884af99d102840b2889fc592780161a9fc48c9ec92d1135bebaeab1e128bb0e2f5a2754031f01f99813b925df2c51916e2e5916f54534ad849b34878346003e9e8ccf0862e789ad4622e0f787d25ddaa0d32b567dccc81cebf28d4d01ceb64e80ff753e06a17c926f695e315c8eeb067b0aac0b1c17e279a274126463c1405028fd83ae65490e83d07acb41b2bba5c77791d0e30cac1fce9593115b6c3ab017f630febcbdeb4ab1c8f6d07a11303b00a2588377ca35d5e3249d05b7df5b3a7f4e9480bca93a37c5f3fedb1c13033cc30977e65451a3fe467460782ea48f33c064d1c205bea5ffa8c8062a29a2e099410c688dfa9a8bc4f5a2351bf3bef231a131067799eb8701bc28dc269b4d1ed39974520347759ec502f5f64da015297d3d44a061e3980b1382529b252f07a8a5250cea15aa665fb39567afdb3d572caf7f4dcaf12c9544ae24cfd6e58c1665ac9e7e1c2ad8d443dbc5bb11c29cccaeee8ac42ead27cad770c705b238b0194f77d1224f4ff98a3f5be76679f43e25fa36fac564ba76f7031e90c2e784569c8108926ff075cb8cf2724ae60015922a80725d5ca5e1643a09baad146efb7067e9775a7280d3018a3669f97a2df154d33d91e2ff7915a4a843e9101efc20aaa1a6aea475f8218eb02e890ad1c1cb35d3128ec83d9fc7bd90fe5a986c6357f2f5c8ca05a42dbfa326ab7abd56140040ee4b61880aeb680b262f26d892d77bb8201cb17fd3ea5f8856001f3fbc730d37871d2ce69bb586c81023668967136e0855989f92d9fe7e00fc4115af2a153ff6fc50dda5ef69cb5ca4449242229cdd65bea42e6b98b1fe19b5fd97e2cca219806b17e256a29dd21abf2c5a85aceca816ff5a0c047b9a61ac37eafb0745fed28bddf11e121364a1cb3bbbc25dbde661380e0e1b560fe8ac69bab1dfe152fd34065008520c9b786783b260a71f5cc0c2e2ea9181258ac2ed1a304f87482e43e6bbe10be1f62f503d9bbd6555b413880ac444e5950c55824043303e24b9a14e88e01f039367aa38829dc22721d41e9087c55132be348e63d79760ed90aea7594db9092374ff8bdffc17dfe3f900f918b50be49a3baeca61c67aa5ee82a44e4a4b03eaa10d417c9352f79377dc556e52fdab60fb7b7f6633243665d9cbc2a5241b08105b2cb54003d221bae9b613dc03494c0766d500442ded0e59de875a6c587ee0a74f2aa900d62133981d7054a017527e1f0f2a06c24b0d09d98d9974d8d5509d26f0d3c5afae09ac6de5252536db18b420ccc31649a76401ba124e338af97d71bed34ac4c443d3a945ce163c4a5626061cdccea9b9bc5257d612abdf0c8eee23157458c013cb859286cad6913651d62ac3d81248287f84b32b7467f315b964d1334658a30c4f14179e5026ec2c30e555529436899953c9042b8a196a30443e8928434c31bb0efa6f29c2f8be7108532c9c2b2b46c512afe309045c5c359a7787ef4fdc5a47e10f4a8b7cb995cef769a4287ea4bcc0cbf885d16451964d9a120287346f660b332662cc7b009228c2e8ea9f60038f4fe8609930924b6b08bd84ec56ef9cfc564d605c0cc00e265e7cfe14cae009cb6834f16d93eccdeacdac6e7badadff84e6c80581f20f8e006e0920d64bed46d7fae47a365d89ad71888580282957c19cc55afc347edefecd2522ea26e9562f84e8a0efec7f898c7f05b82743f8330556be75c0a83a32f0a3606e18b3ff9f21b94ee15ae92f9909564b4a664fa72d8ae413223ee34f5d5b3235e659f265839a27af614ffa38a62d4b7908e526cd4e302122709f68f32f74c44a55ba2c2801b66cb199a2515823dcc7436d4ffd033d5e1fa0cf433b2288df9a147dc9467920a29652fcdb29c7d717dc576943ea90ae9b5a393d6b8586d1fc1477b670ff67fd09b5be4022b7abac859474bd8f8f3d572cabb9051ca547247b43489d339d63655bc6d135e4da61ebabc149f9e78da150e02c0babf5038f0984c13ac07120f20ee09c6ddd03f0793a6e622558c994e7350bb00e8c2b5289e6e87320ffcfb3a3651291984486dca9ec8c2026bfbcb4d17507c28e255828ff01373c36d96c97cedecc0f218558981e52cc73e11745d12c98d7911f1c725cce10339321080c68a01c3e2e169e025ac61e52c0dd4e40ed7c9ebe735ef9c229d8ea7602e75bb6746c2147b735a8f6dab5a5cce634f36a737250853531be9023fd4d6412b2ea58c16d055735928677d97ef181c51d170a405c87bdbd0303e102542a9d9cc2bcf71b7ad1510d99a6e46652c3b8814a911bd16ed4a7d54e68bf20e3139ada9727a4e9a9c38266f73f25e37616b53baa7d3700fa4b8be61852ea87ac2866267e524a5f6ee3bb7850cf10c827bafc0e323f1eb2172333df3fac7db189cf11534610db4d6878f9488975c1f807ca7f89490b55688ee625de50dd8f723baa37d137d2cb7308955aef02a312aab1c241566c843bf93971b4a0c204b0368881ca0f66b5b9315e03b1c21b1b9099cc267dbae4c880810c1b6b327dcf250596c7ee5b245b8f5413cc7ec90a515690fb5ed3d481a4ae6f921227349940c5eab5055d3ee976c2df0f28f139d11f79e009ac4356c279cf2cea91f97cb5259350bf1d01e415490060ea217f56038b5eb9720beac1f0a1580333275cc8321a48f3f56cf51a4cde698c6ee246ea9720e33741ce4896eea7e1064be8e5f1af395463b9f5f6c897e46a50beffc65d9de65f9a2089e92ab7563fe32447a76dfdc327447f73c7768904d29ea15a8fb875b887ea37cd48faedccec84b239330201baba091952963db90c6b647284ff145022c78827f368bcfa805afcbd21dad9bb5038dd18a525d890d66dadc241f6f5f9db575cb72d7aadf9226ab13f21ebb5db2531b4ecd5c5128f533a23b6a0f316bcb43b1c1c9cc7f9942b4ca940591cb9e30593dba7c433808c4f8be55c8ae40d9d65665e5e62aad402a16067347e61199a6ea79cc66469f814d222d5ff2bb7c9b8c57abe74cfc6b28ec2ff16e5f25f651950b8030be98a3471a2526937a7861824678cf2ce12598826f90418662e0bc08f16b98634d494152d84ac034164541dbe4fb9cadbe4fee6b7cc78068379dc47ea9c254c405103b6043ec3fead90926710f3308ff84f1136f67c325046fb54929860fef5f78814810def2b736ecf4905408dfa1edd3b5de549bf3f1a4386ed588914572373e39f97624c928c7d70ce2163b877e832e42e37d95662462f1a151f92456c6b1376575d94a073e27e88926e56164c9e080932201e22870aec4f0c82d17db623ebae21e5737c31a6b9d2e8f7100f88439071749e7fe15ae9019e9ae42a0f1fde6566a86c70c401fa9ff88bc6c56ce0d1291dd59ca6af157694989109ab1135f55a0bf4a48848a84f530fd807566601257b5c69e65a6a604c1629fd592047719a9ad3a62a03329ed2cc44008eded2255f5788fe8b5aaee082198d2b9a1adeabb68c2653b8f97e223ff0504209cfcc68b282f391956f3119447462097f8f0ba3f829baa8a2e753b3998e04b19eb69768d834492eb6ab304eebc55f81fbbcb106dc30f6c73a519118cc5c727402f623799cddace960f82405c571733987fd652151a3e2dc672a6c82c8cf00fb5b90d120ea5bc07bf90052ded24bc664dc2ab48b011b8342029f269b27c25ad618cacd1bedbb6b08d15389380628fcca383855077c9f05240b84a5fe97bb1953970691b0e8d2390119a1fb73ea4e2a7ee2fc69a47de3be80ed10cd7bfdbdb14595a4812c1b73cb5d5a5ba1c22541ff01ddcc21637b4c16039b5ded8fc5898f0fb2a61f8d2f8d4e7997da2c1a87d294411c4841c895063d1b18d2bc9b0dc7622c8eb38e4b6eaf2ef320c2212517cb0355b225730078d29efd51fa19501929e8404d46243906e2e2130820ee00bd1d849608dbca4c3a9e8af6c44e94aa48cf5654545e9ad7dec1694481feb72680fdbdbf95c7b5ada979c17bafb3627669d6b9fd619aabf60454228a10a99049276403b5ef266d8eb8c6d72d4ec508fa46480706267d42db00390a997cb11ce81dbfc0f933c6269fce244e40d07b56c8f0044ec12f8a0b04f841f5bd44e0d78ca9ee0f15fbfe1f46c4afc03960b83c37d2f39cb0d72e32b1f8f4bf484e0860a68f0d8b3c41ddf909ac4d5b3d7c4efc8b43203dcf66091b18d51d5571c1cc96ad2d143b0af68bfab3e5d4ee37684807983a730fc53308f6defe48bb53c323e088b6577647305e24fef966301e90a8069f6baaa0b8f8dfc62ca6e549205fa498f73f5a072a63fb44b9a65c2c9671d4e2449d69e6152e8a55413f93f1d45fbe3807240fa2aeb6f1dd3b012952a8cdea136be7f017723423763dd2e089475f1cc07836e2257cfe8d6d87ecb14bd347803ad37dc04bd4b2373e530869e3987d28e0b90da2b6e8d11e6cd13e2624a0435dc5918eed3963801269036d9865a6fcf642e7879d00c41e3acd8c1eb2aec691f6f09175953d90e4ea56c95e12cf98f2223f98da000b884322cb57388bde3d7d37f2fbdb1546cc2a629a8fb19cba1c6e8096f901986ef2c866c542a7d55a36a6bc989714cebf4e431d9d4e22ff30446d7fbc0309b5031b1c02f9d325d223f547373c4ca349e14e85d4a1b3088d1c495b2f512eb8cd15c2b4ea598736625782d600b2ae7656bd9342e3daa030e11f6b920538960f0433605e6d4c429c58e5b5ed7bfb49d1eeeb626c5adb2a3bd190add64b6f9dc3ae55e2967fb870b36e23b7c15a9ef35868843a7040a0d0fe2c8c274b532400074cd3e7589ca6efe4e1090bb5e41edef21799337a627531afbcdf552abeac42877bbb8dc9d4676f5168d0bfaad782f8cfd708ac2ead7ad138cb686279f1fdf58c2adee4230e4922ff48ab7bc062f5c6918f6a5c6de614613e9845d2f0077fa24f9d1216161a06adcaff4a07ec9fe0bf3a2c5fedf35b591b95d4d828f73c0e7f59cb747b99dd3433e5e7ae32e0ade2052abe4e2f48e1b05c76d2499cfcef01427b00d67698b8c733dc2d75cd9d3409a95111c306b748692c9fc74350d6799be551adaa09f1ad6dcda31f5e460f67e06d768e40982e7c212b64c78ce98542022fd9d591bd1baf2af3a3509b3535fe31ec1534b6aed8d163f98515298ab2701dc47f1f8e09304514bca92271f6bc8602f2344424b6b410bb69a5d25195bb6d069b038e72e7dffe79f1a0291759d5af51869fbba2e0cb6557f1cfae22d5c38aed8f33da45e3d6bcd4fcd23789dd5f9f932c35b64723ef8a8190638c965735fcb400bbad5954a73a8c234c889bb84260ab13d138fc0263bedbbc479fc2d424ead3a735ec5b0801198ddb80f317dfbe84185ef5f797d5d72b4f71128e641cab789ee105cfb0926a4e1a3f9baaf81ef7204ac1ab00b46fbc9842e6bdd997b8a37df849ed4f629028c36dab6c4a0e27780273135f619abf468d8ea3a25814a8018c095d7dfc0a0172efb7c644cbbb14db5f8333d0a7bbd70a52ad448f0384cd77a3f94c31ec258a0ce37115eeaa6b62fed5c8123453809a1c9fc806db38a1541d04aecbd593c6b1e741868764c5a2be5aa9cced303dc9beeb68e7fc96a24806f4d2f280266d6441fc0224b8013194bd13672fc08ace2cb7e9d8980e600b48298cd5a82536396eeb9763cedf26a5ed9196bd43d8256c3b3137ce8115dc16aac3b3da26bc2ab9bda444d3e8dca5723d26fe0cfff259dfce3ed4e52f89d622c00da53bec616d0ebab2a57679a4a8b308dbaa51107220787df9fc594871e687d0bb91b84a09f0f852e130c5298ceeab1d2296b741008acc500d2860ce0915269fd47af8f2426765090f88f0aa002935b708a26a24d69c34cd679875cf46442ae65fb0b6b7e0c85f7784c7bb4f5a60ab94e4a36b8ec67b913e3d663357bc76370accd64011443fa9075a9ca02e057292f0212b3ca46c4623f62b16dae1310cca836227de1f3f0ba40ebb4eb0a4ab6602343222920b151e9c4011810a15a07891df8552bf72e6f46af2dfd45d79c959d1c436dc6b9462fb146636125915027582c380ebf73ff2b8b15c4b21f5b99c20f88ddb81a26f132129d80aa81fc55bf1f29a6f0e4e5c65bf4a1d4a0fa451f7ef43b950a357809a10c1ed1501fb92e447ab44f63d4280ad6a45825d233d36c5c670900d0800ae3e0a84454517d6bc1f0b675e01689ffc156ec75ddfda8eb165d41ec411210803abe492e5762f10b9a44d2105d304dbab22281535e5ff570c6d6c398506803328abbc52fbf5767e510813d60c0bd1d8880f6a88b0fe38c8435d6314374378d2ea937b345e32dec1a0cfb0c64638ff8ec2e832bc99eadfc949ec1a97b43bb51da987e301e73ffda8b2ecfb60ff0470255263069a9afefd7c75e269c8d53f0dd46d6ccbb46069ba65888e6badaac8978a31f6724276962195df087fc6bc8469a4ae1790419e2309b486b830f7fe6c287e366db1c398976a79c60c23b7c94ed66e92f54bb61a1a0ebf6a041d011c6cab0994fd80df84d6118e080f072715ee03402bdc9398f078c494144629728edfbc61e26d6c7beea2568c0fccba7712839197799683e359db3710b91ed5f2cbc9e562fc4e1a2d9bf82e69c065b3b29ac139f03ad191fabdb544755e606c59807b6ce4ad4051decf223d840e4f63b7d0a1a32a79de8f01280c02a9217855d88b7bfdcb0f8416432b3539da890547adf85fc5cd367d9db1189e6c79a1bddb73b701b47c89d971c8749d7ddfc708959b6991af53cf421c9d88a5ff1a8c041cc7e94b926f561a859dd417c8d7ce169ccd495447322793499b97668088d899696344ad964cd94c471f80f97ea5642249afbae784d8003a07ee8f588253271f1eed3bd520722eb4fa2eea55059ea65e34572c60fa52489a4e31c029a0f034a1d449eb87d3284abd77858bf7910ea8d0cc0b7827a976b3908cda0a84d632c7ee4a5397c9856ee019f8f93fc0dbf3f374b2434789796b181d99859d3e78045f0898bbabeac292c9a545a931df70e40d3cc108ae2ea732bde581ec67f91cd860cf94218ed63941b1bbbdc4fd443a5b62dee7ebbf1f00a35d1737488a096ca649d118a1b4d3b9498adf1a3d0a72afaa62821639eb7643eccb5934e8354cde6328608204703abd6c8d5c2d26e460381bfacfdea6ca2abd188b4f1a98a5e8431f228e4e82658cb6f2909c49ae72832e8ebd09c1c2a0a588bf490349614ba270fdb94388ce49c8ccca1e2b500804140f54409267342c105bea3c6c787eead27322e8ca09703b7413cdcf6296ffb438c6ae1a6c4620cefe2dd0b16dd6d017ddce8457134e2f89d58c06608bbe299be9dd91f77c028813b6cd53f6debf885c5d45685a42d035744bf77cb128c4b0fb85749000dd0ca4671b26a9648fd3c8fbfafc1bfab8be9ebaee200227bc4810dd6aacd9fb6609ca331e54b5303b58838f39784477c80e04aeb1a1fd63e7fa6568a434d675854cfc190e922ff5583d0e4cf56d8a50700a5b1f67300b8f8fef2acf72005a950f12153f194cbaaea80d5385e9236b0fc53260aa582e69b4c3f9f5b0e6a47e28e780b556eb6774b1f75697f0c45228a60bd608a3285395b9f5c9770e8a5c11c8afbf79196a854a92a0f3e007ca8bf14964495ec65eebdfe97c592c509f57fab9624a345ee8168e76a430992fc7925a4275aac61493bf12f7ced7cd3a14aa7c8dc29266086ad7aa7ab69713dd9fa418fd0e5a43525fb1f68ee103df4f52a6d29277d51feeeea86fa830366bf0b8c6fa5571d881a7e82d4b7f487a654152f6d6029d504dcd60514232d84fc790a245899364d944207c8cfad8b9481c41508e11432bbb4052abc4912e8c4fa20d487d1964bec0be49224d60508e5afc2ac903e6389431276c6cf4656be7cd5b53049747e5bfa2b47d50cf5b4756c87dc9af30459dab09fa931fc9c6362339ad3c729ae13189ad538c8097f53267fa52eea1cd7e6b8dc4427c36849da699955b4abd18d3b10ec3623922d495487fd38e540871a69719a77935618f66795442194fede38075d3600e6df797f38ff491e753bd31af6c0f3cacea884c0b62d2e308534f9baa53cf4f3e5230a1dc6ab00acf66bdc6a44760ee75fee62a1767184c852534d5f02e11faca1429800d2da226c42b82e5fac89218067bee9365942ca8f9693285aaa98290a7ccd55451b4b16d0fc17a9f6376cacda42282939115732d20dfdb177005c20e7852a4b161d6e606ae2f88288556c41dd19c2656b546a0e1af15f5368f63290e3f7530684c80f0a0d5cca8c20d0c64a6723f8375283355aecd0230444f6f2a3a5b156c0707b2635d948ffe2859410fcb05738007aa0e41cd060ff20c26e70688999e52c7b1dba716ccce36dea3d70b3e32e43a5cf047de3b057cdc1870e24f15294408c659de16cbd937e9fd7e20de08df9f7b9efa7f44dd9472a8b6a1fb9a3ad6e63eb28fa6d7a82af61245a5d9cc21d594eb670bc70a733c7edf70a37de7d861b0943417285ad6b0f7c87899235a892bcf25a37fbc12012fe0d24d2c019271832ab12589d0d0de81914ef9d89d32619862bd7cbc405bd0881e34267976cb18c62d7f6fe6a72609ee8c08d197f801e1b472b1b870ca0515125e4bc0247be43bb959925b41055db1eaa204d6529dcb4368c5d004ccf7a58a350d93a81a91b4f866489865e0e490cef54ffbecafd5e6ed8d3bcacc32a2c7d08c9bc9f98ce0ebc6b93518c87e66046b0290723c5047bc773cd7751259e35ece5c880b04f85d4ce873736e648efe11bc1b823a07a0ff8c6cbf15387b4dfa0fd0cd4568450cf468d17d01dd01b417d705b3ceb5d86f4809e7e944382e532d99288ebe023480bdc17ba8673146075ff3031ec93ee9516c2a5800de32ec7604bd311ff959320b7dd88de83bc20d850d3425eda31286533a02cd628228c8e90348bf749ec40b5d1716c7e6d63e3a0be77621d86bc3b3a3d3ac1620065ef4e25130215a49ea8312c4681a2c548d8d9bd093366d3c923ceb86320b56ef84d29fb1691ea673a311a883e16bab6cbc5d5005e5311fff76d61b68bb4a32bddd3f9fba7c509e04fba8aee29d02ba40ffbd2c4266443877cba9dc18c1a6324baca6a6b54cc41b42d11647d8917a260fdb911d5872dab819f72ae6f3576c00e3169ba0b7a2dd06765bb67df0ada8a1eb412527444d27d3f13f384249ed547b85a70d8e6f00196d3e19b44dce1f5b152463de577952cb1238023a973ea392ed895683a8ff364ca5ac37c06fe436ec91c7e91363dc4b0fa194012ccf166557804f9c12774e1dcb6907d2f262a4b0dbacb21e3d984bb725b3e48298103c97ead4dc958e5925bef578d69df4cc37b97869977947d3f49ba071cacc65159dc11837e50daf12e5969b9a52ea613769a65137ab11bc0d15eccc7d7eb98c71173f5cd548f06eb0e8507ae04d7993b34407d389b0a046f24e192c012306b9ab5b4c9497985185430ba511aada683db869352a37e93948b2a7d75a2bc72588d54f13ec7b886a558258208e4005e7a0317a721a57fd6d2c4ac6bae4f1ecb93fd1dfd72debb8f7da4b986d26aa055d2d9e9a1b15c89c62097166f2cca5b3a133abcdd152d69d1f13ca0b4708c264c5d7a298aa5cce299e281ec9c95755b33a1c3d7a046d78c7eaa14df33458b642a6636cdfc0f925561f68c1cc7e868d2d31b1e5d318e419e28d73ec1a206cd694ce0cd4637956caeb778630bee52691252958def97a88f4c3aad9b29133b3502c73de0622b8cfd9e6539decdb3f356040796bd8c9de8ce0360969877b531636694a48b063b8f350a503e60104c598f2d42d2b6ffefed4f83e4086a7fa7690b095f867784e99130efc98a39f8cd322714603e072f41cc2b49570722375e631a8691cb32fac31c84d7a81b490326246e5f6ee53ff2cd0cc62ccee594191a781e3d5336d7e62414c70fdce8119c04507bc741436c56eed8131be3bf04142815e29f05287bf5d88dd0c1ff041428adf0500f7145225d5811a6a8be261118c32af7549e53f4b10727da65702dc41aef0918cbc8d75e20ce7e46c2fd7e7145e2efba17a3fd5e865964119a2785102c1a4fba30e0cb8ba128ef9c7a3c105fac94e51d1a8c47c90c093a298eec3b4afea3144832ea58b6392476b2121a8ffa50ca8d8bb0670db8b8bf39f59d71c67b6c1908f997201f05d1dd5320ef3fa889c07809a87005eacd497a6beb9e40754d45411cece865cba7ce6cab1d0f5c2bcc6dd14e7cc8d0fbcda8f446893948924e8e4ada01d87f81fe586edeab3fc61c06a3fe889ed179c01d18d5d18d2ca2ebf4de4266f1487235dcbec04c382e67b7b96ef263cbcd0f5b8f5eee165a5e307294f35ca0b6a470ecb238880379efcd3e57479b64b06c7436450b6dd38353709ed7addc9e61dca4a69349350ec90158c7056d52fdcf2165e2cd8ea06c8159dc20fb1aab5358f186f8496864aa2fb7f005b0e68e5ea7d58ad596be96ddb6ffa8d03e968b2c599ff49bff40ffe4a100dab2e0a9af88c8853470c0b0be4eb3e44d03decaf0c2b3e77f3586658099743074546596ddaa0f76fda9c4576f061cfcaba691d20d34551d89838c9f287169bdf7a4bf6bab4d845f295b1759ddf06cb72e0349af25df4e61f83407bf273295f84e712fdcfad67d4700ee6cfba8da7c724e0280c0e8b0bd5e9d94ea5ebe3e17a537ba9c0e50d67bb3fb4e4c16f50ea8b649a343cbe72b77dbd59ec588bf915790250202dd10f3b3f5a50972bfce46145a844fce93e7fc3a39bb8f5f264b404e0ce551ca7db9000ac3d471939e1d78d29affeb6fccac41e45d7d96559b1735cae8cf7c7e32787ac64f1ee0e073c0db24b015ab3b2a040c13fb4192420401a03bd87f85ab8ccbf80c0f825328c1db39c105b8d2c7ddbefa6b69cd34d5e75f828f543c76043dab30ea62387e6e257fb20e6dcc2e0c8590fd3bc6422653a582abae4dd1377c1cd6bf4a2fbf9833b99e91e1780bda61e32a47450ddf17b06d347aff92d1002e27f177b97751520827491b639036dbb483a0260741e109786e48b8c1938126b895de91ee94f073103aac2a3a58a092880cb739c1c63990bbb160442a3ea3c62822c92e1bbcf5ca26b114a958abc8eb6545beb3e93e13811d69f52c6a3098a336a024881eda852369d6f069c73edb6142c63e1d67607007b6d37ba494603064488c2daea01d2b542de8252cc39514caad8a98241538c42d959de569c1d2043992ca71ed59de90b91da4276a68a9517336254b041d202d4f04a74d3667d95d91e101d0cacdd3355fe86abbe8f112a05b31216225b114f63ebc9204d051d2d54657c80e661124a008d546542d2876804db8da86114099b19ad230811972a196bbc76e1bff4075832ac084ce91367c1114663bdd207c10dcd7173d7a546cb41df09517639272d6252f3816b5df0fca75b5c4f20c91f11d27b70b9d6685b97b46dea073b67f373cef11aee84a07dfcfa75c162efce3b33b576f50e490717440fc336493572651ed9e11b947e382ba64f94f246d31b51f82b02feaa8bc90c19b6e19edf9263c972dca1a4cce2958cc9eb47ac4e5b1d3955b8509952b50c7206e1c58b711a3b1b681f110d3e6d5afe66c8b57ec6d4bdb581cb1e2d6a07081b6d004bc7562e5ae4ebd8b034407c6818a6f6dccf49d99c77e7b2e19908c76bcf3ec12b3376af1385165842115ca7d4162644fc0db3354e80124b5c291206763fa8c50a3a19a0ff051e0d46afdc5e8ce608ab25032d760a1582320769b439a3f958fa294c79177a4f57c85992e6f3436e23cb9017e935732528fa7661829afa83372d51a7c63e1e946cf4c9e62260743436ea102941ae82cba04a9ea739b550998cc385506db268a9455c911e0a1099f755b167af95ca0b468a8913e7f6bd90809aa429c7d68c7104577883f1c22743ef09ec7395f5b533a8095be91b7c9ab6884769131081dfbf48ef8bbc4076e824f3ec51b460b1911a8cf3eb1dbf14b696738203d5ce2bba17f45fe1b4f14d02061486500a292c46becc7a688168df040c9ab1ee8fc6d4030c3e6f06e851cc54c881c14a82fea782b1315b22c7e3f0a1da2e5db0942dd642a7c7c9940b4f47485651d9a6fbc6cb86ed4f5f1d8d99ff922828c2ea50270ee3ea4c864cecdda00a894bdebdcce2c3901ed0dc601830aa276ea90198204146accfa749a74ac40d5b82a7b648d8c36d9abfa31146cdb284a60288bfcaababadf938f67b1bb223a1bfa81f0fbcbebd24daf4ba41751fdb6e4265c5a50b07ce69c4f2f3d96c35863d4445e188acf83e5cf76bc841596f86ae16f47e8f8cb1f57579c38b976e7a7386e8e6850cf778585e553a3945e61e54050923ad7eea7639ef52f26ce0d6766887c1f62202a1b850ca3c3b44a77cb04563b30ba57dbaf2e29ff450ebf5d60f83379c5af0e7e4ac01de828db26c4c2f5c11d7591706c756f2b6d1098b852de236e555494090d706fc11a3f4f9a2d115702c72bf211b3cbd8f052044e28f4f2f71c27711916715ad96cf035d1ed588efd2d17b20b02ced01a87272c05cfc99b9fdae190b3b92357cd5e4051d5b2bec459428e4cb0ede41e848a0a31aa809208bb531e032aa797e4824596da07f99972ff6d6c1b72c911655b01530221bb10c2b953e7a1c9bc808e751fafb34db23cb349ca12bb9f2833ab1ab5b1a51c2da99cf600917e6264060e10d2db35099904f932622ed48360ac334c7788c3528e668b152e9262d802cacf413df119443727ec3effea4468662fa6c6994d02159159f0220b73496906732ec3c4ca4c9bac873dc90c479ace8f52b71ccb7e549494666658251ccf8556c7adfcfdb9655ee704514a262c1076cd70929dce25c836573b069cc26986c3c855824339d761e4357d482f5640c956a733fe214b6c0357bc247fd8e9246eb9a256a20d5a10bf7b0deab4b241a92618c793f688a1f36b0c2160ea2b2d41f66678881af4dd91058ef52f662ad0a49d75da4073814c7c601c230ea59d524fb8f911e0a6546af7d6c7288c3da58aeac4e1abfb894811e212a2f9f541864d249c4332429e0c0667e463279474f277789105b5ba03273f0f319c7185205b18b4f073144a1ed081c9162ef18d71c652f74befe7313d130941952cf4312338f095163075c91785af6c8229f2c609c6909e6bbf117892f9794b67514f2c8254fdfa5786d5bf042b9922ce2ede45dfb6bcc6e440e2aeed12788c349eaadbd22cefc184c663b1b99ede3681cc52ae0d81cb51eaa92636f966ccca8c7177fb0a21faf331ec03e29eb4c3edcdd5bc2e7db0f29f2972668872cddeb0ddc7983c7f851cb6636bc52acf62d283689e1e66284e079ee6d3604f18f8125ff92b0dad007677a43ae102dc6c21b4cc31599e26d03c5b9ca1f1596a631cc2d92c13d014259da4ad2e027bdd2cf25b72dd0dab9e41995cef1085c2e8e1846f3154a4943ce33f92ba6d1a07ce238606c1c4d415fa78a046d7e0df504df6fd099d112f6c0c1f19b231d8c628f450668f1e31a7f2c61646b6c63c3fdc39cd49cd21853a22d40c66a6e5378e82de2ab0b477d1bf8d50f0081e4bf415caf82e04b895aa342b9e4c0cdec3ebefca5da545faa162628888333b7e32c0bdde0c1343f62ec2f9a2fc23a456eea48de8cb3a9a2a4085821f2c7f749c27d2144afc426878d64829245fc75edaefaa2dd0ffb94809272fcb776b2568c433069df6a5c64d440f06516539e2630cd50282cfbd9151695da13950349541d22b29fbf936778ca390a27727165319701ea0b8b8418f0b4184b4725cd3eedafeaea12984cca61a44b77dde4195dfc8a2b3a9ab1133bc251204e8e5a24da39f82f2c64ec3ba41a7e5ec7bf828440be64073bfd17448438419f0b6399282f2a2d4f335f9ed7d9f748b379c2faf344abcbd42e3a08c648a4205fdb037ea9dc48708675685c539e9c2b48b9dbd38ddb1d9033fc41311c35b9ade22a86dfb93415cada5646b6c67c3aa017ab5942c744be4a33edc089d7bc163c224b0452f3b7dd495a10eb1d480b7428d6dbdca88a504d368f6125ac15350d6440b60f3a0a10450858ca80f93b44da4c27a10973cd323ef86199932585250a6a3e3ab408c035814190e76cf93da062b5f087c8bfc22fb91edddf66ead5450e2ef9130068d78f485c86be9802553e8e34a70ad2545eca03885633881b85507c65bca2ab747b2992bd03624b6a5933bde7fab0482b16282171c76f6fd013b2c3daa3e7d5174bf8726d2c3f402cae5f240f5be729d8b024a95fb49ae6245f6f02dd49fa511b5de45ea6b4f0d8ff5d402193912b3f96999b4a7fcbed572147e0b02f1d3a78f1cfdd6300f93b9c4b18a64efc1b649cdc0cf873692ab249306c87e27d39c136c828b94163fbed501f392989ddd99c817503616ba9c453b3b8e4326516407572dece4e4c04dbcfe9bd76face522671f1318415ad5cd38fc7c1b1972199ab7e90fdd6bab8d63d3613af408f6acc76b054415c06050726e684ada91064409aa081d145761ec27d891df81e195b0e08e8640b68e126acc23247508b79e7e9cadc730a3f451abd483f01cb6e938758216c0f6b1d6e7b67d8a99acd8c1ef1dab92d2d14c977ecec03b872a74f7632a5e1e318749d923b9f8ddf0c0ecee5b9f0b1774b7b81e91b5fb1d59fcc13c0f16993cdb78a2457e657edd9541476670d447538be79fefe945f0fedfaf24b79b030ebb1a16536bd66b87b23a3f4d763b8291db1cdbe4ba366ccaeeb324d91b78a2f533bed512a63ce35b5b9320b643214a6f2c69c45535c7fd1a3bd0b3495a59e1ae8b2f85bf3a39f3efac8e3503fe01ace8c5fd565ff5cf207620c2a1899148d9ed0816bcdbb2ab8574fd54c84d97cd4442c0ee14e3dffa83e65df4b17607ef01dddcbcac52c88363913dcc2efa57b03a6637ec44a8c1e252214e728d915c0a7184b632a3e4f1a92b520c34488a45b57a27c2e98c991743e0fd8f916ca874364abaee5744c61f4024966ccc69482af7d817c4cdd00369285a7debf869fe646fd0903753b1440995a3bab952f91393f1401d6392fc643e213146ba6cc79940cdbdb35310d4d85382a2c1205e528bb24263e850170540fc1d071c4223b441f1eb8d783220681329d1c25b35480311bfad007d8e9b85425956c67b19e2bb4e62b0f6ec495595b37a96aa053d0b7dc54a2ae2223e1227e8fc3a16229e4f9a904103e2376898c56a6f7a032fb17cce48c298faaf103b433e7edb7f4222a671a47800d25d0fe2f39f7db4aa0119b7166a9cbcf1abe35869c52f801b803a759266018ae3c349ca05756310a64203f48905146a81f8a3d9cd0091a8fa7cf378525e350aef1ee3876289b166c10187b9126d8af1ce95b482fc95d47b29b11bf70efaebc56ae3378d2f9b3160907c76f80ed08d5ae32628efbe6f216cab582a0f693e8bbed4236c06aea5d886c3d4f7195033546dfc22d731aa95b038fdcedc79f827b4567e0de2d7f86c79e4fd0d491165bef6b031f83e2078847b52d21fa6fa6975f37cd0e50f3e25e893f704b6f06cba4e4846580f8e70590cc30660c596bd291935361fa23f00803277514e5f585709a71b88be0d5a2b051cc41a5135402416e307d5081959e85af76050b453227611f6d9ddd028dad8805a3c286405eb92f010a8654a7c03183c1bee9173a43bafc2b0cd34f7018360fbec1d0bd46f215fff365159de3047f461830b66b6527eea31baa317a4b27b24ab6013d434467cef156bd3416aea227b5386c11a18768f51f45ef9fb511cfb92dc127a24336c6045d3788951c6fb2c2ea14a73206b7c69d03a2991f563a9eec1fae7d42f793b61295862a7028bafee1b9d5546ff60d8350e56ba071b7bec964b30f4e0008ec1849bd088e1cb28b17366a110a6b39796408140386ffb8d4603830dd32cb4117f70da94ddce89ff8cc0fe4ae0b3355fb90b1c620fa6d85c3b8416e8cad051825ba064cf27979bed061b0132ada91b9f19259f83e5f419918b2f05695e690b64343c382988ebc69bffae31fa57d1b713111465030aacea73174d4f0873094cbc96817ef66cd4eb81c1eae442ebe8792b388a68062c039d16071cf244c4f191a07aeb5a30019c2c8d6d40facb5538438d0c749e5dbfe78487138767b40b47f499790075b8a5dff57c70bd67f03dc5f73a18871de36aecfd292bcb0a89b6c0e33ddbe35e6a541904c0b8eea67145f9cdb4fa0a79d7a0ce50d812bf579259679360cff1398fce1dc06c4599a00332959a472a319a46141cd07805c010c58555e054c56ea14b6087e11af74c0f6b99c82e26cf88199b95e03e0cfb2cbb193dd27233fff25e5bbfe64f9863c1118beb13239fdbe3500f77e4e02606e9c7d3191b6cfef270462df39dedf9430cd093d0f85ed3d0f22b457186870c036cdf239b5d177d05d79dd4a761af2ea46b3a50409e56da306422f4b0162347a7e79e9468c192c3ef773fe6412629dd9b6b0ebb48335deeaccf31a17bbc45df14f123bbb6deb3dbf854a3fb0037f6c88f7c3482bf8b4da1b802ff1b8322f64cf455f2d0b10f9ed120f1c93dac20d0838de107eb9bd1318a61f2dfd8936104efbac5f6ffb673562329227240b2ad50f65441ee15ec930dc74b087552f254753f9ecebe2d63bd77ce6ba9a6cababa926796bdfd5652976455dc1da7ad0ff873349ef3dd10a1a5e0b92b3a6014df06d80dfa692cc8407d163b5c0c9a8ace50d1bcf164636ba49b92b7d49931405be577114347cf1c4d85c2609126025ce2080783f01737879249de7aeaad6f33e091d54feb4c45d2830f88efa01fb32f0fcf67dc66ba98b2060acf504d0ea5df09eecc5a501ca7ec9901871d044145cceec8277a8728ea34483fc480f6cca223019c9c7261427a4b418e1d0ac40dfa170603193598cea1359b3291ce8085318a7cb67548aa1f1243db75719da8f17135064b984b9e5fa96ff056f638837e169bc103dc360a284c06d3e68e79a91ee5dc14ca97ba4242d3b7e09ce531fef4582ef2383131ff5803a36ba05e260984eab61be17d5607d49ce5f6db11c50e90df29def9b44e9e48227c5a6c8a1dd37b5cd59da7f40644fbfe795e5712064042e259063b3b834aa169f3cecdbc2c2fe16ed9d588942a664f6d17a9869f6532680f3b09fb420a875c225fff1fa2e26754b84fb4cc1ae54e4101457dce3d4b2c9177c78f5caba7b5498756bd6345b18f2d3b9a9a7e56289a368f4893b362ea98799b4a76a89cf3261cc1909ba5470d3e078872f1b7287a36c986d2113a29a50964d5c80bf87f3ca481cd6748a91c31e94e8ee8cfda615ab9249eff787bc615e014a11e75cae53f9f9573e8604bff5b880ef8499703463db5a71b093adf60981bfbfd00fbaa8c6690d0fc27b2aa75d58570bf3c1fd77912aba09dbff32274e73c575865d5bc73f9f1cdce8066f925ccd31049c777be01dad7452349408566f4c2810c13b95805792513d0236b4ba7e142e5c8c7dc26e0a628396c45861b614c5f8d627587adb6574d276e68b0f25bf0e7f10e439e80db2c8370813b4d2b4a03c6a5817767d5b328d1092ce45033748f570d0ca32b19d25fb6ac12c6f8b484a8e2ea509f4a11b7996c9e6d3abfe2f1d89ce3a2705f2a1adfeef2ec141f1f894bd5d5fb9b605bec011c4753b25c4f2d4c5d35cecd409ca6d290eaa52e416cb0d601918098a9a9dfea46cbe6e4ef61e67094b313f04448a5e0706d49ecccaf23d083dc8f4c8eaaffb8451746ce85851894960e7df687bd24babc959bb71084e93a0b575db7897628675b9139ab6a9c31bddd58c014a860a64103053ed333214a4e8f928459e521ba4bc1f1936e7e2c0ad3a4f35f5545288345ed1072a302aaa4bb422d041ae5518deaf10d869d939ae43d6bde03b25085483e13311288a27ab6e211079d9141ef89664ce6289cb2dc18097b444a5268fc230a81bbf4e01aedd925ce2d1e73a809f5c1bc6a33e91b28059632d1c7feac77df453a38b5357cdffa0d234d2a86ed0fc34d019e7ded9d87cd6dbd537b474d448af3cb74aa45ec1c6bd7c59a7078820f11e8bd9e8e8edeacb24372e4dde9451ae6649bf4abd605cd6730703437a2f36916deb13b8e8d183bb4d7c32da9720e9f1c23850663bda3d8c268471de84d892fbc28e8ee22e3369c196fbda6124cfab2c54e15440c4e27e4429bce9c4297287f8ebe939dea95324eeb981a14897bece61e35701393eb3ab659a3159ecb19e6d09dc0d2a630a58bdbbac1e0c536f2b6e604eea740054e425bf34f8895719a7be3a4117580571087f49088652af6450ec20fd209020693e31fe58b18eacda49b3b245dfb0ae0aeb0d1c0f036de53c8096582b813db096f3df7aa38da5803fe591c14166bee99118e227b2c81149322489a56a696ae3e550e23f88224c8db8ca0f048d246c9507ce33f901b859235a225e26bd0f35a74a6a7d85d95745ff6d45ea5aae51ba42f5fafea5d64f7201f905155e743d561cab3f0dc8d03398852b8e24a1e27558266a7a868de044c72d3d1d064775bc9de806a8eb7d2d735d70e37f34c33e4c1a08828f333130106f69c60f5648d4f4419bd6cccd57188417521dbd1ea4f0ae2257032749fe196667ffecbb3497ed10ad35873c44db037ff18123195fe916afebf28a5fb90d91c91c702b4c4f23e4e9fc6badbf1b678fe76ebc11333a6db4340e9da126dc84c2ca815ebeda2f7ecb7654df3d1958a7778ee2678bf64578ccb93cca228d770494f0d59ec89f1b2800756690429060430e77c0b88fd7c2214c559d44474b39fe269ae6fee2ef6a35d70b219cea7f04bcd11706e2cd1f56fa8ba8d399c0cce55b18a3e995882733ff0c63c5cf184f3a38a91a902b433dd3c2d3a0dc4c50e30d5f3f9bfd7f60519ffeea0ac96d4ab84c8b8f329161f4622656f01f7252006f24ca1f23d8ce243c4d070a30183f5e4f1779703a65a48da90553b6e410738c84db270eb129c82a62c26f812d9628a15f45a8427f6f0c14100e398c488633d2ac86151388697db61992fc4948da136040ecbc0eb76aa7aa07908b72cb2bcb719a54414c3755229bed338306bd4b5491fa29ee3a16525db5c1007033db451d5cf0da302052fbb766de86f3569af6e46ff0945858f9dd52f2a72b2966d7c54ca7131aeab8b67266b94d3871c513d52e3b532b00feac4bc93fc6399237d0ee6d69665b3af154bfa646a3a578b9f98f7d858893507adf1221b073f2e4c50b274ab280e1b26a169886e2bcd4893c15548f11c7cd830505306779061add04b1e5734bc67df84980acd74574cc205543f991f118d7284ccb4c4d9f54d1871a00c6268a48f9b59dd4ddd4bf8f861a3cbbcb5748660a8182c6cb3e1d6bdecb54f56c6933817ba12afd74b8e8ff631203fa294aa2091f40e4914355da6c1f0bac085388d17345766808ae5abfa59218950dd369c6e256870bfb5789f5e1d4a97340f9a962e4937aeeb0defd980e20598bdd68425518b018d37067d1c365bbc247730db31695240b2e2883c58a8edf1d9e37108b7c5f576fa2ac269b26883f541a7dffb25146bbae4fe3900301fcadcb8bc0a00b0fa316ff8a04a6c55209fb127da406f9674009c2e20db614114fc5743383c2122c52f27daa70ead2d5e00ed2a50de4b67d8542b08675fb39539adaee2338e8fe19846d9a18e6d9682122c8a0a622a5b835db000d3d8318a87a76d769d872a8ccf01072f5f71058770d1b1dd5cfc5a5af457e62cd01da88297319668c5a8645c102158c5e7dfad2932711789a44979ad7e7337a69b7dcc29c8b1279b4704172adcadf81ae682647fc684351ae5da0ecf6ee9d900cf8d7d29e7ceda7385b98b2c05f069991061bfb00b1c7dc668886954bffb0ec5a198982e4ec77869fc79da7d95b92cd901d8c36f6771a64ed81afc8fd0c0d8d5f79d4f919ecb4506badedaf8fda5e3a9de7f8dea577def88c1e0f1b0e14e08a47ff85c2a928f95663d6e2f5d1e9dcff9f001c1306db2243ab0c34ceb26432c877597602bb2e8bf463d1f9afa8e39de67b3b43f54e80bae59896dfc7569b043319cb53e379215b0c8c8b8a7c67f2e6698d72a343f303e715db24d77ad2acfe83d3fa1a65d1f94d719c8d4516b021ae0a488cbc52b862b54cc3b2a858be86a9437856a978eeecc851c8b0c0845cb597ce6b093dcebe0c05b375a5c823aa03e0449c9772e35bcc145c1bd7e095afdec8396017017895285b31782509314209e3c79ad3a9d80b0f7f54390d54ba0699d23e53fc0eb266fa7d777fa244a7dd9dfd7d9313f8cd3980076e5ab1e62c6aefd049aecb887ddf2323fe90df38b2bf76a36f305ee2b430ceb0b2879c63800ca9dca94a5b0dd6ff768d516224ee7d9fbe04d42ae16f8967182d55155f0125526c8cbb1f651ff2867c8f301621f65dc3334fe96b5ef49f9d913c71420533ac86d769173c2e9401ab74c243696de8db47068b7e0de56b63be10cab5a6f09f7740021fb9be99a60307a90676a65c5578f9963a4cc256829811fb2b45cd13085e33c2390f21f9cce78ace23cf2788527024e1041bdc1a430f6cdc57f36b617c1a45267990addfc14380ddb3fff321b0eb61bae24af2ad33de982b0901cf760ec0bdc59cf2a1859e9f0e4269c3e82c06c354ac7552230d26f955da5df27b1957e9570eb687b724da2ea8a377bd068ab26ca9cad6d50abd1d87be51c5d15186b4e0c898c7db513b0bdaf74df89b18fc88770e32e0263df00adfa8afab90f160e7f96c33e89d3533fbe0dfbf6e1d1e0799638472e75e01a2dadec7ff6d3dabd5fa79f3d5d3d74f1ae2ed72793031290757dbbc7136a782db59ff8c85370b2c08025dfb768a8d487797c1fb3b0568af71ac2cf2ce91822fcbebae6b7b154747d6cc2855262fc201294547a187f5db21858930fc157c57f9721204018aeef0bd79ec5d93271325891eb61f06fb70e6d4618abc0efceae62c20310a9063371e5cac44185c78c67254f531638d9c61ee5fa2a4f02dd8b8327c40b271ecc475f411375ed945f2bce50803d41f84bba76bb3e48fa814d610b83136a0589682a57d852f601a757fc627000fbc4d2e2e9035492d7aef38f07aa0b2ab0e8d444d6ca9f2c5b1f92253de07ffb0a17c7990a05665d1cd97f57c089001d3e627598132e8b9e963589234398950076b0876b316eec96c8148b8a2ff3fabccc76c488cdd72a928f6a53ed3a95296833ab8fec8b77be7f10bb1c14ee36c17ebf3108468039b7fdb468bf2f0c6982bfa45e09d88356659a47e95f2fb4952ad29dbc046ad40ea9aed96027fd6243fa4b0d4e2927b06ef2cb77bbf1ca0d66055146aadf8c967858499ee6c85ec3cddf1155c4970cdad5eaedf0afd1c9e7425871e5a1f0d03aed0f042a96b81bb19772dff69f012dbe5d5ef90d2c5052b493fd9c2d0f032d9ebfbc648d5c887cf90b1fd5c93647b4628a8da8d0bfabfc0cb568faf2926d741670a2bb384b7884da13df42a20b91ba8da822951014bda239c58d4e16a4e7d046c7082e741a1510b98c376c596d71227b03550f4cc767bf3c414bc2219c7e2a1cf049bd21cab406de78576d9be0c7aa08b2c24dbc34c752a6466671dd05bb9d0ee2a35b3d5b5828f3e0ce7b48de3f4021657c997e98db2004a823b5e7f98e5fa7d010d6422a023d7850f982512a0248837c6eff2322fb7b77b6862b712b3d094eb835559d72a14689b014ad943bcd3d978942bd1c5059ead3f763339184e10a9303b6b117e2de1eb3003d7064ebabfe52136cb6c999065ecee0380588c7743c848580967695f6c8e67a51a1286565e2a01fb69b104d74be196c30e4270505ef4491e8c8d0103116093c84414cd8697484bb6357465350c180a4eefc6a8399ef384bb39ab2e52f8ac410f13741d8c52f0d467a5462e4852c208ec49f65635abc2251f3a9d7975774e076aaf7971790b78aa394f1587b377075ef14d6ef3acd7c03a7b805f3151bb09847b4045c0a2921ce4e448fc1e0dc2c7833bc5cd4b76de9187654f65e78de35e0c3db36a464fff70f295b04c0fa2c4b03f660a5e875f1acafe4333cc07706290abc7fbae88ae1fa8cd454ee1150b6833e437fc7cf59c28dcf99d07123860aebf1e36f1d25f5c7f4dc3fc578f615dc25340ec59fc27b0c0a5d2b229a3bc7446e313534d9156ccf28a2dd7366ce439da125c124aa8cce12f62f49b57b190c0efedee7d9f49ec8f91013f863474e2df0cd8782d978db791f84b9027bc804916bea310002f7ec933a7f00d10af21d1176aef1a78249ff41ca4603b67ded5bb46ecb6c3e084b465e733cba989d90a92c839bedf72b51108d7bba586494b95c5d41906474ca12e87a9f88e102f0ec7d9ccb23027534bd71218b224a5fa1f21b21679bbaae9094339aa79ca68e9ce5e4cfe626d7cc98484f35db7ba5bc1409044b5e3f6888dce2e8709efd2283327ea95f037c4cfb2082e526e713fb8ebda8417eeab48e9d8c78fbfe74e0bc08129ddc3895533a2926798009eb2f19c884e2256983882467d876d1f6ac0bbf5027e24ef0dacc9967895c09a803e858799a4ad6e5a458b7cc3f73d68527f36ef3f2659d96c945ab4137241ae4280559092d502d739c30917b3263e7321b53bc2e15fe5fa9065ddc2b81d2bc11822fff8ff012c384fdbef667b7a3e8aa276126810f2237fa9a7b1c96c32b20937963729eb527ea326982b5017234ce330a12ebd1c93d05fc06decd5abc694d046e0a517950fe005ef86dc66238610be6716b67e54d9f427c845c9965a3146553794fc236b2b050d7aecc440a00c3d46c8a5149dbd902256a1b4b8073bf68521e6bc186c392b6864311d21bbbd72684415e21f0428891655e96eeae276a1958c8fa7ee031e2bba2d75ab525ae2d3100a20741823747d892c46835803c1dd38ef419474d9d0573d303239b10fd6c104891cb98554459d2ba41382241d86db4049638b1e9eef17edc3332e9038f51b15123f95134c575d2ac7e8921a48d38f7e5a9ad6d25c0793498c25347c80cc92f6de08be9c5092506dbc9a1c9a1e1646cbf7d21f9bba110741ecf26d9ede1aba247b7fb02fb8e80f773c6af5dd4807de848e57fa0fef3595cdf71010152e67c0b4988a28d431faf8a0ba01dd423e3e3d1030f29643fe17bb72f29a1dd80324a5f92ae414d907655e1d97f688b0140738afa5d1ea610b5a8d7348a508cfaeaf2bb8924e462b6516cf15a5f882b1df813803c4cbc0f1b821ff974364e3e312ee21c2a6d3fd0854d8e2e086979292a2dbf43d3ae08a016cfc384680f66cb64c97e8fef67917d2d3e34228ee539f47ce0595825361a264187504b2920c1182013784d06d418b89dafc1469d6f4fab5d8386e940ef11e46fe685cce87337929155f15006687de0d1b1bfd9f9487c4e77d623bbcb9c96da745ffe477dd362e7f6bbb7f37690c388529cab9ccbc577ef96cd0d32ec9981730cf47b2753fcc26407e27aa5b32a229ca3613c02806859097b75cc96c46655fbfa208aa902232821c2402e780cf933608b98f0f3c52f79b15ec196283f481d006bd43fce075e5618be101a717c810b2e073914c711549fe22c39bcf25f1d0b4c636ef92c2fc97651011b59f99c6a05157c7f7aab0fa1645cba9e7395dff61e13e6552bfbb2ef415f46d5ae71f0f7cfe65f3c5b39b5d34db04c5f166702b2fdce5f04c487ed3028accbf3da510c05cf104bcf5633ab4a44ea32df7814acbd72fefaa3f1da9fff62974d833c0b732ba563634168a75cbabd4b4785c762393ca75efeff7bf5150478509df5f8709fd330df110ca2198b5e4ce92fc5c613e4d41c21e79029de18c01ba130972557153d76b21c04b50d6e1a013158f5c47e8a1c77b0aa5ed18ecedc4a523a5d6b0aee7ea0a75572a0b54ad2cf96489577c86edf4e906b1913dea529cd7e9dda1310019c6dc51b4641a038ffd7924b80b9af6a12dc7f8ab09770612152004efca8a65395dd248c96aa4845452b884ae48ac74d7eca51b40e9bbca282e14a265938706d6b101dd7f5337d4b725c61e1a79e46a29303b78d512adfefeb0b1e7540df32f7e513b51def3dc7ce29176722ebd991ab5acf9d7617403c6985cef3601ee5496c7582ae4ec98593a5b746586fde02aac4a2065be599adbe20edb135e9d8ab13ac00add4fa50eb592d5630bfc4c2d325598bb97ee38956233d1eda5602601bdeeaaa8d2904764322021c3a64a144cdc2e8b76ca3b9825144e9ef8a5b9cb2ad281db08caad09dc51d19670b975128d5832d4a44ecab2dd4e392396eadfd322f9479c637e4fc10b55b2afc66e6de7ea30ddfb56bfed8d3e05e0a4d2751f49310c4419262269bc9a2ebf4f8bba0bb94d452fc60a2ed6bb0e578e4916ebbe0ff95ce265a115d4be44b6bf650b5a4eb94fa77341969b3c0ebcb07bb0c7821bc0709a93b4f2478454b741087a35cd07a13a685675ccc2eabc25d8ad3c7f5af234e7241f623b133afa9489f8453227b0a7a259d43721100714d2857f9615cb846ba363ef789bdee76bd438c40c7fea960a8bd55513033348699b7961cad63f6f42d66cc431e660e48bfc1adf43aa0dccd01e4b1ef20decfb4d5cd47021fdceea9e16328a0de9e33187ba04011bf12683b2ff85e8602730da0eeb96e5e1f2ce64112bcf9258ca1ec60093077f690daf1f0b4e95233a4d87c092d8bb758a856be895afdedce82e5148085f7e1aa71e279b8609cc1f89c8f2dfe7201868e754b57eca92a074b05ec878cd5db88ef975ce4906255b3199ffd16caf0fdd4c9cab70ae3872cd807b8bf4a364babb7acd6a989c89eeec35172fc47e398a85490a272b8feb983e69ba725f66a4d10556db21599d82805f6b186bec99ae06d8c068dcca64cd4d34b339b5e9076ab1a4fbd8d93d0a378cece535fb0b6fa581f66561d14b99b374f18c63063e1e7b7d1bb02ce395772621fda74625592a1509bfb7476f1089809039b7c2a26c2d64c320a5252f91e4414ba9061109f2860c2df52966398af4e4c210b6b269869702a909a19ba3482e066d50f8860673122de6304c1e9f974482078faffbbd3a24d040a2498cde2b5b943e20e430a95b7f307517543042edd7efaf93c99abbf5337fa85bcb7c53361c8bcf45bd1df499767c06e6b73ca5a7d4e06d6ccd0628eb48813e87d6a4cf519c1022b4dc4c5bb33bd6f5ca7d45509dffd2e6e76fcc88325810881ff9d11147fbc6a2a1b97fcfb9b5426003eae371b2992d95c0190ebc3bd6ef09e792f93e061a6ea994b32d401febadd90de2a5a6af4658c78c6298fb31bdcce8148b972d98b7cf0d3731e6d91f840062b4afac78bfb64b56e65b2de22231bbb313dfa49704fbf7cb077598514e25e43409fbc3b4e65db3b0c0ce5b835402e66bb09dd55a86ea57be1e582366d67ea58d365943c4cca29101ce70af911d6cc3cc204eb2fbcd07079a098c6fb99d632db6ed099b602002ae7000c4231c70832c87bf8b916facb0016104069e0297a228e4f24b1ffc9e37e8e604403ce491e4469cd0592bce9a5fcd2c1a960d2a96176952e6e6c7c53c950e2cc3efe17f4f8c0215f7f4c9d81c615e7c112cf37234325a9c6a041abee4f2e1483525ed7ec6f864c25985ac92e2b098f6ae42ee429a451305383627096bcf95018cb22cd9a1140ec78319de29c8b5211874042a1a2b6b2005f714d3c5688ad364ebf96c59216c32d325bd66b4149e8acf9817483c9f7264dee0ee6c17252fab5f1afb4e41f5d513ba4cd18c818c557174f6142668932111ae8886235d28355e8ffca886470becade505fa99472c03cdb64e9c76d20e2fcf77d002c69b653060cc13920b703afa67b36190193abfae2edea2b75ba65a8a94f147cb10c388915d2e620c813591476b40526bb0487d18e28d882d588be8c1b6c01b8c92b4423a80279b31e14408086d27f1795adaaee62273c4a2c09674948107482445230d40c2d51200613e4a7801e2d09158503d1c63e1913580a22056a8523239fd8b5eb7ad4d6688b65dd946c63c5e0343e9e207b744fe28390bebe69ab19bce1671db644f5c4d706294bfcf23b1045c0dae24a1b548f832d704c1171d668e046a29055765f64cd122c83349280207f713ec6d7e3362320df75136a5305a49103ba72b27f5820cc524a0783fcc92540a636b56512542300ffde127ca48755ca33eaeb4a3fcad21b18b0a6c2379d0b877c96e7020070fc623abe006cc2c593f76252b6698f12d8255385b3bfd9974e5664117d49c8de9b6cb9a59429c914a5072608a0075147ff084d17cc60fd434a95744317dfa1ba4da541305656914d0db60632d8fed8b42a74adb921786955adb4caab6ed3afb7386cf5c686d996964d76f5943d656b3626b253d844a20f1a8cb25bf64b6db5fa6d255772255752ca8f88a505d7552ec431eea87bee91b6ef65b41db17e7ba46e7941a26cc8532ecf3661d3d8909f7eeb51b2e1dfe84d0d4697c2cac299764c0505b9504389c5a729a62b2f08cce0cb7f8a89415f6a3042b9fd852745cd08fb5d7563172737642a9f6bacff1642080db28ff94db5213e710038c4184fa85f0485a4bb7aeaf54fda0c6020d611c6ebd3f3b95556bd12b3f14fe85437723e47b1bbbbbbbbd65a8f1c8b952ae254413535e54d0daa9973e7fa57ab34cd397343ae9a33e6c63f8a4b110a0b8ff598d8138cd8eb62c0b08e68e958869283e5862e0575e39c7136cd836f9443e7862e0525e78d508cc5f735cdc3d930778cd1ca78dd3b07c1e7cf8f0760c6cacfe353f3a8f5b6b1215715b1d61381244b57d8ec271b3b35c8c15b8a032d754d70f76fd67529068acfba633da64de9857c879f7a46664f0492d0a9725d2a2e71749a6efca3168a11ca56e5912d2dc50bf0e0cebe6106ee3c2a21def9448e14462b979fbb1d57b08f69d085441063fc1a638c532ed56044622b2c53c9e8a166fcb1f62012740130c813b99c6c1524a61b72951179b9cf6c56242bc29572d42ff71e0d36acd9d31d2bb0f46764ee699023a458f71d21c5584158314887f41212e359ffa21f9f6ebf75de11ffa3d677cff25e42fc488c7b7aa4f5befa55fcd949a0e76dacdcd3a220dd778414eb7ea394fb20acef28c6aac32207e97edba851358af1acefa8f531e867b46d528f04fc59efe560c31a3bef48f7f6e30a859e6fcdcf0bdfc5747ef835fb59c429cdb49f45fcd2af48ac5f18b38c9f64025a5e52cf97a5df7e475adfbd7722b4be9751f7bd84b0de9f553b8ff5ac2772cab1e91971cecac609e89eebd35823042e223e25d80b7024d4d0831bbff5b343aa1cbd19bdd67b566c5867b6630536fbf8f463adcd7dfb4e57146375a4cbfacc7b01b14fff957df721d2cd4ca81fae3e3ef55e402a53ddd667b1fbb1fafac9ee595ef79af44224ae5ab95c3dd0faa61835b0c165282aae5031755b9f3da07b1a56f6da15458f487f186fd6fd583deb930dfa0784fb2cf3340ef403fceb7b25b02dd66bdd1722c9d80de95fc9d0e76637a3f4b3c9f28a6419fd2c760ff0cb755e9178b9af886f5fe85e96d198d4d967c46fbf5c791ce8d73e1328fd5e3fb2ef05a4be7f28bb1fdc60483fd2be6d3912f4110cc443ce1e0dcaafe39c2cb93010f7fb833d5b4ae9359b93cae539e753c96c3ca8536c910a7318b558f0d6a128050a150af9cd11055888d983f8c523ba5ce9e5f613c1e011285879310822bedcfe1f18944188b90d24defa452706923f2c61bd58a575c569ea7664ea9aaa24314c5a2614eedc6e40ebfa73d26d8fdedefe8d0245d29a52b1796cee98bd6d904e4a4106ca420a6d308f301eea98655946a3dc3e6e7960b0ee7e10e0fa34ccdd12b1be8492a684ceb9a3259973ceb92599f354c164712749994e09d5a6821455ca93357162369973cec9056dd2e4882964d07ab0a658a1e7888642082396cc07ffe75da87ea54049ec3084154ed04045455e6102059dc354032b3141f650dcb007d4144e6ec84f5041526fc258a3a429a19452eaa50a2a6a157652a8e20e8d32e79c93ce4922abd0228a0a3ee78a2e0d0b090834349440872aaeb0e2c9ffbc79f39455b14605695dd6c75a3071bca0f64d1a1c59bd0cf5a6cc0dedcb293e9b72ce3748ace077ce39c12ede68916f787012f98d0d4b2cc8374a5254ddd0be1072e4c869aefad81aaed8a4e887941bebf0c840459fc6a0c76e16f16def039d75d7009f1d9dd545fc4a59f4fa31affc79e52743eeba0fa25e451ded2c078a28a5947215853806350f8dbff0bbfc610ed7c7618ccb40714d0458a8c793c043f139c64e36f3478e1cb24ce33ea7fb941d7cffaa6a610ed787c1ed8ed1234ecd28986fb33a76374f9613d162aea05b30a160cc2c2920e924e0d0691ea2d0c18e17477899410c1776a40e52bc10a5704297b0cc610799e509a5945236db9299a539e79c5bb42496ce6001536689cc218a3c38bab80e021531a490c50b7660708a414561270a298c608edededebc00792363e08a715737ba96ed0410f884c8df3c98b71a3dc6e81ee8910ad12a1f4941fbd51fadbe97907aa4fdeab35d100d29cb8b525b836050a305954be3b21a2d92ee2ae9fa1663e762a0d690b02110b96e8df8ae27567e3abc8ce66fd33b92c27cfa47d9d3ef25847efdfa1dc93efb65e1587741e6571d5614841dd6e06dfe6929a557ab11af3134e2d78b8df1ce90b261e50924ebd95aedd71e840e8df8cdbe703aa5596c31db7caef40b91aee6bd7bfdd4cbe873d461f4fba83639cce46fad785d57fb8d3fb0d9d3cf3edba4c746b0f68528d4a75e18847ff5fcbd7ec4d79efbedbbedbd82dbb7f7fc85aeeab18725dc50fe10d7d5e86fabee39efc8eb47f6abd5e7dacb8c662f1becbc7e5f7df4b28f9da669da735e1d12224529dfdcec7fd0cf68a5af7df54ca0affd466b5d7daf9708fedd1bf5733f02c7942cf15fd2cf7decf50be97f202265b4289b6a98628c5c966dcd5572488332f3a10648a2c776231e1b729c127c931cc75b59997dd7de40a615bc3be7ee3e65dcb05e4966862eab276a758f05451837c6b8c48a4be365f3e07169bcab2ba2e1fa0bba22d7054b66b817bc055dd10516fc8caec88219cf65ee8cf7e98a66f8bc8caec8a70032a264e0b83264bc1d7365442941726524a9f2fc262a05237ccca9f3863560d77d6d73bb28244144252d0d453279b258cde76a3f57d3c0b8e26a618401834c0e28305c30c01765044085c31ad7816ef8737de8ba7781e7ba175dae7fd142175baeef7822e9e9d28832521084d405cf972f7440a2a44649621142c4192584b83367694af6f0f1adab8b2b61b8cda52fe9db00ac10b9aa252e7d59b9b8e1d26f592323ae9ca9a109942e26903c68b182e32ba59492c55dea83c10d6ba4d962882a2855415cfaac05144f292d028719435c5ca5d1428d16488ae48f1a353c74c31a2b9872a91aa815dc61228b2f97feaa2ba23f7628163c0061a1e6d2d7ba22ea0202aa8b3ca410183c58e0e1e14a2d5f5ab42b9a63ae78e2ca9f49288f2b942e6582cea5575cb9d44529a55d0d3b6899e109a8289cc81d82684329a551892b5fca6a0410ad035cd9a4c7d2a89366050bc2dc71d59942698618a70bead059c167aaca823a5eac20038cd30c3b4e96629471f2b1d342cf1a19766e7062a798a69a62d82c515a524f3d45b0c022f364c57462a85a76d840e1ca24b1ecc459dac254e9ecdc5995e1ec78a18599daa044a960a856539c645254da0d4fe8d454f58185d9942121472853459960c14798da32a558a14700c324a1acc013471853e577902cb198a5762d599f79394a69e986f63fa62a9d3063c4065466c2c0943063260c336f02800233564099c90206eec1ff018518d3303ec3e6cd0842d0f17721fb50679e38d9accbfab8a82e33c1b441155b5f0077b03d337050c6763ec048605746dc60b2aea81e2c8dcb5067daa839a3050726b0f632141a261c0461e56528343074b0049a18b8a0a90216292555283478aebc1cc504889a467ec040524af9335e4687c085667cd149c6e7b4f919b9c5c9bfa393537b216850dadb5e062cd8beaf7e19fff28ff148b157ff8c7ff97794c5fd339a71e413a570623346082f8208f326d6de14368c4edcd5b2854bf3882f1166bc8c1732e37bcd8f21e435bf2016bccf736c8637c5f09a5ef367fc8bbecf7c19ffa2f463cc789fef288606868d5ba2d30caf4e4f460c3b592d5bc442710aa7f0001cc56418cd16da5aadebbb19a760a16efa81857aca9d78a8e7ed6f5fc86fb80d0b0d198e3ac00da35310cc73f226060aa3d395641836e5423e45471b100d19eb4d55ea80815efdc2a7e14dd2c730907ce9f235505ae2d132a9f565c78ac54ce632475d3e40fd3008e65da6c15a7da21030900bc52c0c237ac3fa421d6d40344f66fb42171f400b0a75c0408f7e215755d9f8452c0cd4ffa6898d71a83450a2ba336b20e221edca0fe10703a434c240f2a50c6a50d24062c3a0fb2fc45588104519a5121a141465f5a15f0d5783f25d4f49e23031c5263c24b770b95a8c04312221c85410128884800d150fc9205808749893161ee2d897332e3251472465494957f8d2cf3e99cd7eea713569529b94b4c4431dbf081ceefcfe0a033592fe72fb6392152b6e686fff2775a1a2a27092ee002e434901c3dd5afc2359eeeeeeee524af9bc926337aebb197d38fd6ea8a8a44b68b0692029212669a064e9ef7822e9f6c73b3db8ef8f639a47f7fd318a7d90109f044025e9c647bafd118a87b4efef383da85a055f6e57cf9eabb56ea1e5cbf52f32d1225abb4da5795471a1d677670083657deb8dcc4b89da87442974f3c85483a51f910f095bff82276c1899989a877c252c12b21ecd636e3884c7c8cee306394f3210fdc85402fd76b99828c779803ffd6a784149f0af3f6bade4b1f2c75c60bb3c86f5bdfc39e641c3fae5d743d362ff06d1e686b1ca8e226c18745b4f36fed956726cebb21cdf1144801e02906c226080201ed22efd1e3c945d4a298d94ee6890067957580b368fb075e9d3a78fa379bc44982fdf68befc5e6e24ffe534c8ebe16058f0fb06a9f7848dcf2d1ef2a74fdfe5424eb15d8bd78fecf267998f23ff1b82af20b1cb135c945f12ebb098041737ecf1ce64c3ef6e23b6b8758d06df07b38e0b6e5cc1b11cfbf0501d29b788237f4c6a9fd78fbeb7430f5caf21bb600561c35aabec8af43512af4767f9137511bffef93050af56b4bfc6cbe95397b3bbb3ec9d66efd9f7aaaf5a332dabd98a66b4468334fb5c0c445d48946905875da8d6af66f139ca961d65ec2867d3bebe84c423d947a4d8ecd7be5f46dad14b483752cc575fbfc8c45ffdfce339992753c97d822596b0239528a5948af912a6c91c33658b3995d426d9145a9d25b78261c527fa7cf4c1ee75d655cd42326c3ef5a6cf902bbbd3b4164d8a1224a14a73ce3971e0acc89aa024c86850a299d214154c4f64c8d8d089939da1d366632e5aa89374450c5f5889f23fadcb5074cad0792242894f09cbb97a5c574baa25852403fbf23753f431bf768add020ff9d7276020f95576fe0555ac43d9f935d34ba766f26abd9db8a71c2669d59572cb93ed0fa55383528bbbbbbb3bcd6a56b39a65533a15f13c72cb4c63a58cc997f225a5d3952fe593749a5912175bcfc8ec2ebf38c34b66f6cf04feea00bcd8500ea08b0debe54827ba942edb3f966ea4bb7b411a74b11c638f066316fbf10586e5675d6139cbc62a39dde8aa11b5029b1b81e460f969ac60f9392e2c3f8d26cbcf6961f95759587ece0acbbfb962b0fff1fb698d952fbf23f225443b32ebcbef6524e94bffa691cf77ed031d16654357c631d72ae9e9c95aaa6ecf9e3cd2aae8c3bf6ea25df050fc3a06a9c36dd9e4591303655318d6df2c75f0ac04d3091bcaa62a4a45a9eacd92a20fff4ec2427d03c3fc5b0505ddb8a18106afd70d69950c1937a455d90978c83f1b32a7e8237e5d259eccb2afc618a43583e5a0fb65d7bf12c2c84005eb3f4370ffa0c12f96a5571692672453ca9c65f2e7c7ccccccb17f91735e13e6471dfe8573ce497d4e77671f43bf3f32f3836c57aeeceb17cea79ff48d29fff44c4aeab37e6c3e98b579d0d9834ab13dc3fa4dfef931d07c39db063bb3e7ccb3f7ccdd9d4ee7a4b75fa553122e9862fde51070052a3fd9a046e99c93524a69651b73596599ad2bfbfa8594d2f7d64aa394e9277f8d95ae7243db1c1c1b3fb4769b2fa5d632217b7bf9f20db3eff5c35efa56725b99e1b2496da756b3596687317fdfd1b9fb0423d90581afc6401c65fdd8ddac3e0b8a3f4ebf6d153ffa8842d661433e30069b7d17f13c79eefc000085ed9e7b18a5dfd4697baf9e3b23f1fec8600525a8103e2019aca084822bb39a7943828e6ef6e4759ed39698c47dafd5b31e2976f45a716fd4fd5196d567c4fd113bac23f24ceb07540e04095a7536a66672c505b9da576ff34222770baa755bfde6199137669ccc3167556b500fb0d6ef2a653a72b7a05b3b22dfbc217eb72d7ba2ae73ca5b2f145d8146e1c6f899c07a9e3c4c3d3f645580e3b2428aa156d13452cb45a105153e3b1df87abe0adc215fec351b27a06a14a87d6b833de4a7860fb6bdea853528e0dae28324c5dee1c6d42b77a2a0246c2a777efce2d2276a10dc3afdab3744bbd37f2efd420adc213f57360f198ba2b4dca960cbe001f0fc2e1a6c28a5dc7e0078ff1978367078ee0ee53ad3f5a5eb9ffca8e5d29f1edc3bd32bc2527e7d27a7ef1efd1e4abf5b2cfa1db73dffdd322e7695b6d25418a8df29d392cfa5c914e91a4ad5604f6c2a3ce4b7eb58b9dc2da0bbf30e03f5bf1abae6f627e08654eaf6bf7ec40fe79ddb318e8cef5a2d8871e89ae843aa79b00b517bc5e9125df2f61933aef4e61b0094b131261719a582944be372940a4e57724f13cac6383ca4cddbf3126183e7e085800febe46f4a80beefe037f080707836dec3f130cffb0e827cde14d1ffcf87fce4c6c67fff46dfff3ced5efe7d363ea39feffb8838ac8170bcc77770bcf737bc0e1ec8037a22df9aa311c777248b3f8ef77e03ef7bd0bbf1409e8defc0fbe7c0037a98d7c17bde919f07df3da39fcf3e0eef083b6c83204a6c7c47b218d978d81fa9ff1db1f1c19ea877b8c1f13fdfbfc38d8dff0fedcbdfc8c6e378a3ff9fcfba977f22e0781b6f64e38d7ebeff1d58d8ef6f3c070ffbf083e6f7e1f81b9ff73bb0b040dfc16ff0e0051f4409d077f03fde911bfff33872bc87c3fb1c38be1b379e633f39fe7ba31bfff3396e7c471e8eef891c47920601781168e0e1d0e003f044fd9a36bca58ed9f8f794304140ccc62f75ec7f7a416cbcf446e0988d774f88c7fe6f784772fc8d07f28eb218e9f80ebe23254c121003faa518ebe0757c2fff7f8e1d2dc518d0bfdc3b92c528c7f7f2cff11cbbf1475efebd44d0f138de28c7df781ddf5116a3ff1cdf5107ff7f04f4369e63389ec8813c8ebd67c36387edc0638b7018d703485787d7081cc3f147fc1413c18d17018ee7588c85910948098eefc637af743061de5cf22607de065e00bc977c8efd7cf18af7925facf27dec30cfe398e6c5022eaf25468cbf315c3786651692317e2e7dffe4c243f6dbc7e743ebf3af2f74f97cf8e0f599532e7480eaae9fe2823a6e28a76e5be0c509b91bd2a513a40c2fdc71c3b914ce23b8c1cc7e1e3050f6d26b58f63b82b2677d2178b3ef6453b67d2bd9247d4269b02753f6cd2522ac9cefcde33d8e6d36bc23b6a28a229262287448a05012cb223f86b2c98697c1bf07802506eaa5a8a464632ff150d75ab2f1ff05a87e8a4f36bc230e63878ba6180a1d12306462598808804ad27d01f1f94929cdc3bf5794ba52f70ca5734d1c7fd31fa9629517e3c8407a75065a9c4e4ae716d65e8e6a52e786d6095ba700f3d849b54113343770b074095818bb41c1e21811c3096ec860b5cb514d7668e2060ea6d8ec7254132a514d5450a1d1ac71185882a8264b3026b65e8e6a920456452d2dddb0c5883d3fa0952c00781d830e9391d3b48ca39ccb67b2b495c7ae39f8f3355c96ebef18db0220ba6ece07ce4fad2e17e8deeede2e996bdb6e29a59452cae972d5eadeeedeedeeee1e4677daddddddddddddddddddddcc1e6b5633dbdd168c891cbf7ee2cb96d3a7f469a5f4e8eeee3eddbdcacccd63dbb81827c7e1abde9e3be7b43d5c10e7838dcfb1e9996105671f9d9eb4eecc2d2959b29bdc26b4d2404f4ae9eeeeb23a33334797524aca75c58172cb28375db2b816e703c7c6f7766666890597c5c697cccc2c8362581968dce5486d4a275a9b34b35c6b955a46679eace59e676a92524a3549bfd612cb0d4a2d8fbb9c4efb0b7c95ae71ee56f6d0430f31e41472dce568529335a3938ed46a46670f313030e2c96378d0608f1e2c7b7a68cca0b2517a936696de217aa259cbcdb362b78a110c8a42b109cf2acb326e3e07a475b32b5b4a6c7ca2bea2803b1bb7e23a6d55a90780411804ae7b0ccee7ba1ff2d20910b9b856d6b2140ef89e8bc613cfa6553775537f37b5f74c4bd497c8870ab7327cba46833e3e5dd17c9f0e8478b7ef91351109e103063491e8e3b2eb2a8081180f118765868c18b56948d597b2baaafd2a41f974b716c72f906881a10446125c1e2a3d75f2741191b461a590c38c242e2851a25e71dac2c275289f0f5d6acc8d5467dec42dc6a51b5f32c9a6282638dc5056915602bf3557b533ae1aff036a727eae5ae7ac9e03f31712b9fcee69316ace9e11d97dabf5acdf9cc7cf5baf46c36495a42b5c4cda925445ca690b978e49639a4774aae1b6969854030f456b5f0cd419e5be90b3cd43d3be6d83fe5af36885ace7063b20ddb79e763f58dffac2ee877faf1fff99c07d7d13581ff7b1731edfcd0bebbdb776f6e372fd5416c45663cb6f296b6b5ab665f57385f2fac88fb7b0fd527619374565839d7d3472552e06a795317e1f2748ea10db25730d1777f4b136f2701e91fb6958fbc795a53733478dc50c245faae988d4d1842de4fa823556b0ab973cf4bacc1139ac351937cdbb526a14b8f5d3a17b2217b2600e192f49b1fe10788abb27c81bdaebc3403e633608d1076d14f2164720982fe70bf22708f65a2f7b0c9ad81882526280c5ceefad2b821297ec09f2b6d2f471811c59f6072d4eb23069c70d665d7da275355ab027c8195d51f3990f78a559502de058210a777b9f79675cfeee4090cf711fe76d2bad66744abf1bc771ab8de32c6bd3a17ba1eeb3b55ad75f30eb16602f064d408860ac50b9fe12c808ee7c39878c97a41b9f8ee04a2963dd04bf61816a4900b458d762fde517065961c0c4fafbac33ae3ee7e0baea75f66f48d06dd939a0748d6ec6bba29ef7aec8468dfb0171ece8211bbcdb13750cbff5930de82be3eb0848323821c1020625b2a071136386ad7ef3647c2b2f94778be1c5cd0b8feecb7ecfc70ddacf6708775b9f0d3595c16deb3ce95b08384f3e6fab2f3cbad525b38e63441a6563fa723e9dd3887b992165432458fce49c1f90ee8847bb62e3e253c5f6f21b48bf34322f064454adc72552c788878a14173684b1248822b0a041bac10b2a52f0c49aa617a03883a51ef1a5890b4b5bd4489971e20e9427636a70a18a34f38212197c50228a175e52e044132c984c0933450a253985a5bb301126490e5cac5461d102945c420e1a178620c10ada784953c606364ddacc3047094c1d32588a50f183152956cc14d1650c92152469b2f06108252b5188711c783042c30209dc2041c39a3261d88b28787e386229890c45c43c0a9326f06899414e5211601070c50a2a2559e84c8142aa480f767218020571b248e14b12121f78c0f24445c78d12333411461b20f0a8417243145216195878d374c4164c501af00186285190c0f3660a05484c48be809344c40b4c5978d12189282827a0a0c9d243122e28beb800c60b4b9078e1e9d5449326a29ea2c890844422ce1b26a0f2cc80e4c9982e3d749b33499871a24c0a787e807204961f5334c8f004551518d0482e0ee7688a9492921b92ec70c5882fb248c1c1ce114f9c48228bb02c3081a50c1e20bcd040440d5257527053039425e4c82db379b0001c12acd0c59c1380791a824a082849ba8c31c2890c42fccc2084933a2e8019834706b1c110456c21e70b0c4b3c915a6201e29c3b1828488cfd183dba7497d2047fcbf9b894f2db06e0c532736c61e39fed7fdbd1e08423e55a96a282caf5e8cd0a8faef605c99ecfb4af861b1b1a91d7ff33af2bb259966599b31cab7d4fd8ec897ca57d6683953fe78330f61101d6317b0cdd98414d82c3e6134008cb178479ab77b780ecb320acfab357f6b5c197f6f433ff97f63103655fa5fac2cc5282534018b22ccb3249b92b9f5969a35936e79c349392f9d9a564965688bc0cfb6ab55a497777e9e2ea5dc732b3e5724193f53959f21429a59430068a43eee04f8d70ce39259d35f32624b394cccc524a29a5945232b313ac2ab6c15d00fed81579db62a27f5a16fb63fdceb2efe88f8ef891621c97fa6d2cfb5ef30ba284484c7298fc1c6e2cc7b4cf92e52542f6ab37ca7e95511965af7d47447e81a7ec439ee25864a21aeadb58babeb1bde56ba706e57b66ac7f3f295929656520fe4660398a853b37690496a35a48ba1a0f55285151b4cc1fb0a85158f82259e79c73ce6f86a72c2988422a4e9dd804e2ce29ef9c73ce282876aeac320aedb3d5afe25ca0bbbb2b9a9991797d6a9a94ac56967d8b2f708d4c6f0f071b5dabff5c1f1176f55eb4aa736a9aa6d1baad3c49572bc642c677df3801514c4e709e3ace5add7cf7b1ddd9fc699817ff6a6dfe8b962459b65e45f5301c193b4607a37750501838e4f72ef97e411359d34829074d3a77528e41ae17eefc1a3be6fc1a656c92940bc5e8c7675895b65d9f552297d218437214644727e8e4b084ba5952479ea15382254f986e08e2887af2e4facf1326782403eaeac78316cab6678ea8041ea25f2debf983feae42ba27ee7cae85826a341577c670fd2368d3f0100b2399f0e1fa00b4a13b9fd9cb9d5db24b3f01309003a8940278c0f5e79e3ba9f3263b20ad1f0a6c2baa553a23730deb276aae824be0a1eab12bd2ec4ac4bc91835d71e1c1f6e02786e2a9356ce2dc59410855f47294933437fca02dcc45d5103e709102869730f2045b7871030c29b0810c1236fc8025c825c50a2edc2c718309a27832473acd3373a20cf15b94133237e427285e739dd9506597a39c28f1840b0c6a2995a9e4b201e76e6c86c0c00e65bab860064e17282658f26632b1444e0d486aa05343d2172820020b1f9e9023656e804a933356a058b303179985c9d28a09262d38993f9f6813a529b436dbea7294132e576cccee85ae382465fff42bd2baac8fb54feca65d8e7202844cc1c7449b945ad5b41ab34863f4e862ea8dee4aaec7a406659426868ac2f247270957be7b174cb1fc52724bf68e6eb60c54b0fc910121307f80d4b1973cc39841068a3f35a4e5cf66d44bb03def60201b622cf3d768707a4b2943ee5a8e6777fc9658304ba794ba9c9e0e4456b2c75ab2f27988cf8df23959e98c69985d0ce4534379e7bd7bd8f8e7b3cc595096654fc199516a5d73d6ca94259d328b9369fc9a3d675ea0eda8044e974435e9d0d4000000404000e314000020100a07042281301c1ed2e55dee14000d7992466e5c9ccc635190c32808216388210410000801060898a9a1210e00686d76025bc4ea29c66fddb6a2625ef32650a17d51929d62e56f757534b5b9e7b69a46ae0504606dd7041902b0ed88c9166c7edae2f917205454e88abc5ac38df461653ceac3153de72f6d48708df4bdc8f5494b6e6f0e589b8d05e1a32f599c0eb4703af805f5e7ba19063c3213553b890b1e3413f8104878e29d927f86f3302866c12b308e9971a5f0e562c1f5372fe18aaf8e2e40d0dbf772add0bb868d736f6fa555237dfae0d3b0d09a62de1bf91eb8496d23c5ea087cc370f1123ee8c4dd3f680660bf4b8ff0ee53012625341a6c7d3a262ef00e23d8b42b83ae8125ec0359d869361d26e8998536ce15c471e4ef808d8917825f6f8af2787bd0dea78a4cc528c7fa1ccb668f297dba1a2587c1d45e900e0e1a3020ba5062eee10cb5761b9ebed3d6a6d0672b8cf10a10ad077cb63340cf968c0f51a2c04565806f62d25b8e8db508a6099e4a810b9d053c74d86a66cec8875fddde71ff2ec76a5123d2803790b430886eec3d83b57e1dd3db0386ad98029a74eef4ad1fd92abbf0e77a4fb6aa8ac22bc1126c21b4315717640458ab3492e4d0679644ed8d371a52efccc24715b1d5a908ab0ba4bd7c94ae6032833ea11ccf7efa2c004ba4fe30ee2a1138e6c6868bb86721ae3d088a38a0e8c49e63b24a275a614fa83877dba3a46d7bc2abe565ac528244b10bee5e192a90248b978777b897ca8af3bc37313b80edf8696418bf91832ddad7aa5055822c6eacdf814f3f9f9f701fc49ee5b94b70642832cb9b883f994f2a0050fd767cb1d6a7618dd35b7f49a74726bc5303fdda29631a435b091c33f32810c0cdf439f1d1c71e520e206f798ef2713ae4502fd133463345999c6d44b54c9753a4b943d2c1c56e8cd6e248e01d70bb887a2bb224da2517a133f668b32dddd59f4438ffe030bc036072a3eba9ab97fe5a621d31ff371be3ff8f3cda7b6446c797ae9ff1a3c0dd77c0202b91eb36f6048e8b42033d1e9ec14d211a7d430a44e1c9956731f50156ea6d7b70d1140bd850de7c9e4e5409e4519fcfad5aa90cf606e1bd68e2c8f49a2db2e94a3cd7ed0a1e52790bca95181efaab69a04bc593b91ce64548bd3343ebb108e882c57cf4be98d06fcdce6aba45422417e8d4c8a8cd9fd09dc95ac0e273bbf35c6a92830b3daf1e96bd7448a6a9691c5377bf6d35ab30331450c9926b19468c9792ef4b554f52349020eb109f6ea8c8540457cf80334706f511ab5419a891c01b27f28bac0e8878f851d49142885f64ffbe325bffc7080865f3c8d1ae5391de18526bce8b43d3422a994182d73656537c21ed39cf4a578c435568bd8dcd4d1d0d4b8aa0c8cab19efc2c352b5157125c28f771c5eb7b36f7ac89eb8ae6fd25f3b9b8feb4ce8c9861a7ca6a4a6121de7eb91ffc4aceb45df6e58e185c55316ff4898059a018caed30ba1dff6e5e5d2bc7489a09d323a2cee41a363990e621e5ae9236bf1e9d04c747c1cf713ba3a6c59d23ccee2e929b1fcefdb7445e8f12382c344a3bc2bb8fd904dc6bf3d66c6924d4c746884e0300298393c069081b51d59ed0efa673ae13ac788742757d91846fffe312d22b0b064a9269be70c4f592c0c6c0de52d8ced45ef73c43a5beb5b2ea119b026b36a1effb37f5a12692677ca2c5541421b230b03791102770890cdc7c70a662f1e82aaadd35591c2b36d7013a371e49e4de7d03423f2dae50a3b90e9179cef4ccac2c355af7b1e8bda115ff7f73a32137f52a4f59eb8c6910e1a1193ef2084d82c9d356319c934e1fdc96888d0be44f164cb03cc48e12cf2cb060b0a25a9e54b91e06353967ab779355891c3dc4d5630fd838d8540f72d9e2e0a637784e68821893b91e26c441476473e3c5608e067d75ecc04043e73b800a7dec75044d97c73f0e933ce1b83430b4a851104e11e1a6b2069e4a1c1a262103ca332bca7b0e252e9c66c4dfdf2ae04954229363bea1f88c183b70ecc34a2b2302d3ba0bb9a111c06ec5a2dca278802217fb0855a3ec8070b1176240771efdec29d0b4880d4371392a170cdf200faa9804599f96c90c7dc90260072255633517ff0fb5095a771c7c1dc51dc867956f830a24485d39f37050231e5fcb01e0449c1a2c49b1e4c41481a94a700c177649de02bde910e27fa12161399dfc84bcac462f9142f5b20ac5b29a50cfa442a04ba756843f75e50becbe095baebe4b075a1e2dedb473f07352a268f32e322013f4ac1caec9e9796843fbf014747798d3180c661dd459b583abc0c72ffa2403f583034288187c83ee4262581cfb45a1e6eff1c18333dc76a1b123518cfc9219879c90dc6413baf3b142cd965ecc06d11508dbb941cdb956c18dc67141a85ae572d5e9e7e78289497fb28733aa74b38115f72453178729f537c645adc677481290f448b568a5e7734bc7e30ed2fdb19473908e08ef89f0e4f7324e7f1c9dbb86166edac1bf0225e2ce3801a1ff61ed21c025793a38f267ec88b38328e908ff60cdcb51542c8d424ef440efdbd7eab13d3dd9c8ee930882250051dc5fdeeb70b2ac9eb2ef950bd21cbd697f544aa562c5bdc5e1dba3a89c20da006ab3577c6090257b5ab837564a2eb0faf6063c6d3c8dc238054fabd9e346ee26029deb5232d786cbcb997eb9f237288aab003a534f990912bad043603937329654630adb6c17aa52727e42b9e776e716128f077f3333990953b6d51d344adff581943dceb93a3455d0b577294bc41bec01d431489a681f505c165eef26738811023a4f2a564dd7112fdff8d491e168d15e8f3501af80b5d1e19542ba325cbacb755d2b8af9717eca17680e11b6e5bbbc04bd11a8ab82dda34442adbcf5f4268d1d0adccebda03c2d016e87eb329efce80ba8b5c80addcc018a646550acf33944ce4a8c0a3a99038ccccaa050f73980bb598976e5920d47792da8ba2a7cd5e94a0c0a583de184e8f67ebe25b5d8c4c9c1daa61cc4dd4a2529296f5dcf99226e21b98ab904fe9253dc4fe610150284f374145d57f6d9334f104b7a92c2783915f6d230b1f5a9a1bed31536ed668cea09d414b6979e37ad5864ea0e712b725889622f2d616fe61611e03ea358e44e46af0981ccf3b25a462220d52f354dedcecd5d3f03a2169f892820944e343bb2c9455ae24665a05401e39b6f7867f7a178a544c27a1c51888c447f7710021309b1bfd87fcac3a9ce0babc7d84fde08063f1a8fec58de1666fe375287476adf88e8d03a83309f524de2674618c0ed83842607ac8ddd1bdc5326ee942db97e00be6c4d95042884d9363ab6d3128274de8e879d587779b72e62bb96127844eaa1f1eabfd65292cdf32cd2ab58d76b040ed1b39d738a4f154fdd0ff34a2dc6a1cc05a078814b075386993addf53cb2284628838aead645c15605ada73443d9b002004d930980570187ca6d7f22dcdac215541e626cb6888e985c4e0487d8e2286a221a3dba8987177bbb57b52163203ce118a1ba0a546844fa000b36aace6391cc654bbc9427b45ab9a484d59b48a9a16ceb9f3a1f81479393486371a2e6703064575dce91a832a90fdd323954a60820eca2fa9b24497b94651915cdc36438809cec30630136b7514f7169a381f181c4f93c2dd854806273e69b96b74da636c1af04d7539f3d9206487aba6d63eb9d8ae9f70d8499cba1750f5d4e032e3b8593eb412a36e382715c64f066c874f6970150148bf9182abd3ad5ae846b1ed687ccda5cd9b96800ab09087052ed6927c1c444a5fbf287ace9521cf27cd561892629188c58425f26258a2ef57351e5cb1955a56500e640e0e2c6df48a5dcd24d071482bef17d1899fd9f5630b3c036568aec8d0f6169bab3b695ee320130083f9f82d6ef2201de83da92fff4a66424813cdb2031f3da18ae33a7dae28d83102a9a3f3ee06c46f1d44f83b7824e2201297183c742391ef22a5b2de7472c4a7d4c6f47b809f68723112eea94036ea46fa763d8dcde494fc82f2e0606f80e583749591a2012c1d5a04f4b26d545a89ef91098c5cc8c3ca2dc80be25d28405725a46c9d1aca405028b1073ef6d2f94ce8a7368451c9490afecad731e617e682989c002f0d1d848f63340ee072ceb5767fb370596f4c182cf6a836d63757370a8320ee74cddd8ad0cc46927e8f9e64fa6c1c4587df416f96d9798aae74089c3ec5f0d5075c18c3763dd516627cfbc9b2e8df870996cc7a99d3e5631b9c90b64589ed12f1cae303f8d52ca09da7c26865a5a6f66fff17bd45245a315f5df46e7aea209535e5e30643bbf9388dd477456aa2a00ad4951520f4d115801f0be5e62670a9ae6fbece34b9f6cf672ee60ee0ead44152a26a3fae43e9f4588daa9010d97c7e7b0bf3c0551b55029443d6c9c00135f0d7830a266522780fa1cb1b79ae7ea0e8b14f0b3592de045824b857558e5cff771bfc9ed31ffa6b159fdee0964a6b7a534b6b0b159793b1d0c9a9c9c24bce3e66eb8cfc4bce036ecec3fa88b40706299a6698f4bcda375b51ad53854a0fa537ef266b37e9f2a718818cb075aa6d7703b5cbd5458bb027c58d54ef05f187c1799177ba2f7ad38c5de65bb4ab96a161f6e46dba55fa8d2908fdecb5a622ec76821400a23fd771735cee9dbae0df327f24846f426b84857d027f7b4ce3b6d9994f29466127cf1f4eb852f1509791d416975cc5576f68b2eb0813cc6cf025f77fca11b365f6688aee19c7e856055fa5202cd01dd05447bd22088f42d0d06e808588bd35394526e023e74e1eaea32b282610c7bf4fa4fde324a374b4cde461b7709ce3560abd8592aee09afd0d3fb4efb25bd9ed5a9e2a1fbf9fdba4bef0af6d5f74db0c0dad119684f9471bb57e5bc0df284472af5bffdb98623d08c45fb29d7b905ec28e353409cd8fbfc3c5e4fede3a8f2af098c073ffe6156539dd7c65fcf1e12c3410a7b69a5a24bb20af60b6c707b49b1d4bbb89c50eaa91c077ebf3c5b5db1ddfeb78d4e993807f1a34f62e6d9a8f2e9a5307703304f2787700504a8f61b467cafe2e9c80e10e9e351242c40da681931aa1736100cb7196ee7802ed58efcdb7dd41c76a54f01c2d94b38880324dd9686a0e087aa8efc647adfb53b21cbe24ea0a625ee140d4762277ba9f4affdadb938622f6a288f3206ed7b1c76ca34e9a1bd000a2dd53a424b96558974dd1eb75991e051dcccbfa83e81a22bc40a3bbd472c7f623d0d60b2bac20c48e9aa52720def41c406505c0cd064784d4ad74339ecb926ae4736ac33d5bb5c0b0bf833f0eb4feed4409b5793b879ac4f9da3938101215fc84739c4a78e81adb26dcd612959e08f19fa68928b55d36a715156f08e084733ce8c686fef5281e8d9f97fd146aa81a5a45aee9a72c426c479f4820db4dfb9a3122447dd75a4c7f69679991247902e80793237fb42853bad956f94c7ae5f2edb4638fd7b510c6b962026e3567eb26543b35f9789aaa5002ae5f311cb1a5798d42ce1f1e9d7a4d77da7705bcced0fb37af384891a470d2a63b2886cafd7d0930148e77e1200c207264232e931cc4935afe50e61bc5f8d38c09d1d85ef1994803de4517fd0601e40dfbf91030bc49e8fb818036d03ea29bd0135d20b90ca8d39077286dc7f90851a79b598cd5d5dc711f95496864ba1418173c3f0eb74a8cc7e130896e7b99b03f705f4ff8b4fdeb26c31f59806cdcc4f09d3084044554d1b052c0691e9ba0c6c1b4bfef820ce8d3f4e81411cf9d89e47575a8247302fde9bd864c628585df5918f07b270d202a938c58d1c4f70591d6887ed0c4b07916c66c71019e86dfd08831d08593892a41db5499d17345dde2f39aacf439213882ae02dbef297dc7fbb94ccda52a80ad4d5ddccf2dc73997545b6c39b1f29a105e5e10cccc06d5ff79954632ac034cc395db74b5271e0f1184209474cb4155c88a8d409082df84124cb5ce45af10656ef70b8cd49a67c5ce923ad14983ac3ab530a710638c66434738e03299f25be424011d4e2dfa94a71b63270f9bc0db460325e402953f1517ab84eb0ab628451eb0a474d4bd8d755298d670e14699611b4ae1454a0485728536c6ee46aae4bdc678e7c2f59e23fed3a6c86f87874045d571135e438fc35bbe4a12504ac96ed4309d64ddc2d021b80eca9b2c676bf9de37164d61ed2ff9ba205fb23d285d59ad5d0632b8e0c45942c17430e20559ffa7d8d69a9a5a46ab4506d0ac0147fb1e53431788e8dbbb44e9df60394c6e47c624a28ed0c1da21f97549357b16d4c998457170f0e82628b4f1733696143322f196f7d3f978825f3a0b14478e1c94de9cd0d961e82478223a705421a3a5d47ed49a0e8a57025e6c765bbd8d2cb193acd09492e6042cde10aaa1b6024e226123908891b69ac0f24205934c1bcac72d011103744640462dac81c4ab7404de9170d629d1edd2a95801a962c4d7934f10c127abcd8c21c91217ecf666a99f4f8b9bc421d4a8832618a7a1b503557f67add8e4edb6f8155d174ae0848c8800d4e411d847ab6b084f4b49daffeb5f9c7af769a887245ea40b55bb2e3be2c643771686fc5f6ca27f4a5af6b7a091f7890d36c0ac8761e8bc047864dd09cc59abf21c638f29ee78088d75de7979b759d3800363d57fd7a01a939974a912d71d2834f8c9ca82b942d0fca5d849fa3e9cf23c12611a355fa22ff3397a44a9e86b1ca6d5281d6a67f4a7bd706a7939c17cfa753910e99b730ea713ae976c5701ecabcf3323d01c0a6fc1e85e60fc82fcd4d9b4779eb4464e9f33914289d3dc5521d1f331025d7f3d1ab5f88c2ee2ec72b274583d01fa3dadbf73d4fcbd3beb3e38fa7b962748761c07d104a4a62ac9fb2442fb691d83ada38153f65164de908146378ac870ed904ab8aa0f6f6608293dea14f68a10288766f70accaaa3d66ad4ec19ff266b4427a240bca7d17b27e74f9bbd272930f9ac40aa9ddf0ad088fe16fc3f41196c10d4563c53991a27453b4aea9d1eeb37d52fe06ac2328e6382daf5c60610638b0032159d5caec79adf47e861cb439d60c8231cf0ea05edc48382dc62a836c49c24b34a285cc5783613501101f630d5b545d679918955cec7aa40cafccf208044306029cbf03bbeb2c9b7dfe2aa3102a9dde11859c45a5daea4f2c6cfc506b9e63319cb90c4c90c58de303071196b7d363f9bc82e6c4c5882bc661b472fce6c836c3cb6952192a3fe74aa3f0e516aa24655c579e052b9b45dc74da903df117e411ce32b2c94cfcfb11249990ba9e4312fd84f8e114ba6c184ac91ea88b692d09c01401802ced0c6b2718d83c95ca4f38fd4f00c08f8b8e30f019c2799df2b953995fd32a314d6ae03395ddbc732c60c7d66f428297e5d802dec21a26d4e9881016d34ab9b28ed0012e3302c10a9902f2d70d0e6b4ff4ff8beaace306931d093f5cad0cd0a1657a5331484e71fda0bf5d5287b0424f25187a7b0514ecdf6699ec5f85147475e4993eadf79ffb8016c9e1ef16362041c063dd373590d14caf8fb191410e62c23bc4b6cb04f3105d4c70858b2a41cfa0128b3c5899822cb79d047b1687834dd053a242d1687d2854f8e9273f8ced39e82d10d9c0d10399ff4d7aaa75d8f08a38c108a80731d31b792108ac21e09396d5dcf1f9606bff035113687fcbc695ba3d19110d3e9fe9307600126e0e0000e166ce053633df90058e0337d882c84ce184cfc8b9b1c6385556258e1de4031c653609f20949136ec5d639b1da4d100bb5c48d4f42b17be11bd3559aa1146c16cd2e160d42354eb84c150c1839708c646b064e06e04d085e3261e23c9fd105ac363000bc60441416a299970701609e3b541b6e5045b107b3619c4f496a725b6112e0cd5c4d6ea1fd55f9585981df823acf7939d974c98097d9608abefff5d29fe1c88519b20c652780b632683313624f1f36ef5575cdf6dab54cf6afa1b1301d5c0f8c0bc2196142b04c115748494c20d2c702d84c80d51c4560d0aa5f7b1bb10deba8833a06540f547582209eb3643c356a914661d811667cf2aef048b29ddb45a09a8eb2e6e12968b9bcf40d8bae67d89df437d41a0d063d912dafd639fb7c393fbb0bbcaf1720c09821c9316f36a36d0f0a663bb546dd98e51dd4ed65cbf240064737662d252742b994fcef1bac11060e9b1c290b8570915c623ffd5506cbf02b1e8671323ee0d7b0764d906442a240c7e6bbc147dde0c391e2147dc9cc9a916006d545daa04109458fd3e39803a85ef6ecb8b98982f7d3cd52cb34b0aafea94c562ce26e04b53006a7ad2f0c1937eb7d065eef0fcad34ff6ae80dce7c0e72cf471d69565fe5eebe158a1e95d8d6160abc4782328e5e9ca8438aaf43843dd70690b44f02e5bc894cecdcf8c4dcaffd72dc6287285aba75e03adccd9ccfea2782c302f64be619a09af731410f72614b85407f9bc9f1ac5728f8a38c8fa30bc1f33bc05476c1d4355e235f9b198760f0174120c32e400ea5a9bae1044194e79f42bc9dc6282d2e8e503f4afff1d222d027d2e80386c9521a4737d9f19d5857926cd8f45f99b84e3d5ac10883664f674bfd5d3bed864f302e2e503f3b038ae0974c2707c42fef15a8ac56aaef21b2cbcfa5658b2aef3ba27c27df53e9742cefbc741f42f3c644318201bae7540184792af7e95e87f6b27a94631543330ffb8cc2a062a366a7ade77c166490ae2e0206073933d7ec2a9dbf4e15be9e5a5a9ccab5d2c6cccfdc984f89970ed49577a9669247fde50920b31aaea972d25a7849b893cf16a0ef41b7c8977a2aa18e7588bb5242327db9008d12f5a2a593e14616c0a634fe6731741c04ace10c3754acdc06faa11d3a61381fcfdca365e41eaa37f516550589e91fb1fa34a7f591fc42270d1f85d3e69f297d5a76795436ecf6e9a8968ec686b575e703e3ea8fe10164f7bf587dc96c6f50a4a71efc3c9e070b0e98ef6a8c512edc3071ebe8d16fd89781ae45e010cf24eee2958dc61fa5c30699af775235f552f849676978bfbee5c752242596185527380f1cd40e18c5bef5e599aa335ee04d6c77ddaec1fdc1217c5c127374b3b69c139fa19b83c7998edb182dda062e757e5be1a2b6cb6d36b44968cf1dca232a3658fd299216342724067762365cff57e14bc4d6470e5cc75ec7a09fbaa49be4dd76f3f9626dd92b3755a2d11eae9089a8733630ab481a9e3d461943bbf1bcb5dc750292c1b5ec0f6113bfc9baa8d258a6c03bd29536f62691fa4a200ca6e24767e9dd9b1ad5aca15a251c57f7d615d0ebc2a8943d256095a28835d16ad3d6e60f26411beadd4ce208558abdd529f4c7ef29ac36f8e0726e5050ab329d6b041ee84db56cd83b9b95191aeaeb2a3592edf681721d5c45f001295e8a89e9446e78ddbe23f5f15bfbfdf1df1bf63dbeeb431c906279563457126b2a7481c6b7ba0fb4f8d8e30ebeb88e82f2b350d47f1bd243cb4bbe416b786ef6d193922cd16c5548f5b3b2d5acb3245019201f383d3047974cbc8f3160fa7e107f0cd0177ea67a79ffffd0e25e42138a03e0924702976104cca260c79f78c17a53800b2ca0c6603f2841649a411ceb6adabd228ea97622a2c3ad195cf9e8c029d218e3f3731bd741c018807db42b59a44885b40772b0488cfb0f3712803bec5f1afee58f6237aa9904c4abfdd09d24c22889d924754512b6e435b4ec22753ac1fbcbc8692001bbf386268436ba12afc57710584f4420e4dbc04a2716c5adf49a14a1dbe201107b737c88a07b91b0ceabdcdd53676d5104c3203a71eb93ba402e26a8764bb4bf069d957c795c62751614a91dd2003fc8f5b0af86174049e2867867c0ac114f1e40ade705abcdfc8e4e1458719d1e199c2f184527313cb0da23ec01afa53a2006f37ccaa3d50acfd8e8416aa705d49e058b2b82da0d7bcb3e0420c824d8136306e6b0301e501f00987c21c1b9173ab946e931638c9d56a794cc0b3351da7a604ef8d4b9bc3e8c2a1b004cbd60f58f72b0163e43b16a9b00e6eef7b3c3fd2b886ace554ee41ed11e31fb3816d1ab1a07165855057baaf5aa13f38d629f88b5d0901eca002e4d80357814a437357e0468924dae70ac5293bc734790a18c7910041f99a8efd39f673198574bed10744bfbc0ea5471f8c1efffb4556db3fb618d91d041eeb057f1d436456205315eb75469365dcfe1fdc22009c15d8515306c4fa61db008c9ffd70aebe56504c6c38c8414f00ff9a0084ae8f928824609b259beda0bad48d33b408adc1a10a51175919fbcbbe057ce4041c7be2c0bcaf9d772ae05b48523a962cb06070210d94a0b2822f3fb030e21a08226702a2870a9cc637f8c2b26660cb699dec04f55ae4b8814a27825f01dd3e8134d082f07371799664842184afea0442f00927eb038ad4018e760c4f0b746e19d21ef70a8400d8fc89230e151207de4e0c7d5b32fee2f775c3063238dc205b52c208a860d296bbcc2d67d03eab7e588b25f271c87e37a6bea86e05026acee08d694655c62f6c043209a868c632602271383ea3e6952b08c0ce28ec010f2d62ea4de050004451e460cd4c4121cc09caf28ecffb41d74ff0bd3ee48ea25d71748504112df0bc35a1d6e9d9382c069e63c60d88289e837638596f57fa22da3e7ce906fb85202efef24356e0ad964f6b0be5b2452678af4e6fea45d28b4f8e138c77d1f4321ede96b3bd0f21223a1520d7b74b1ac60c4d1cdde05d054e47f8e01d2e44d0e8ce86ae1bcc030af4d554eafca9cb325fb2af676aa3d125db7b4c5571daf742bc7f80be3b8ca1474324332a4db35cbf6ccc7bfef3a1a7c51a38bd02f494230ff4baf7a6693f9aedb5bd1ea6f80d9ce8a17b35f51b079bff1e76291297ac81bd95aa39a708940fd4ec86f2afbb97b4dcb4baecb008dfeabf9ca52f1b4dda758fe388ac68f6589f2b6dad34554db2b74860ec5526bed67b95dbdf3e8ff87a953c324a24efa7870cf3d73025020270207bf7c4be9bc8a09e3130473def0563ea4353304c5d4c3383458a0100fddca114f74e378fa06145f5faec7c772e9fb9c1e78cef7cfff22e844b02ae7457b07691fa49cd106e03b1b42956ffb91929e3d0f00f2e2dd6ed5db63974e18ae3cd459d9268d4e20bc9edfa95124920783bb1d06c5d35c8191e6d455ff0a3a90d309c7c25c9af449d5ba745fa10609621a9817393973bf4b4ea75958faa39eb0715c35a2a3de6d6976a82a841ef45afdc1f24b06a6003e0b3a7da9e5c1b87f054aa09efbad578037dbdfdd7d2133abe925be59f9e7fd683be7362ca46e37923f00bc8768110ad85c387c76ecebd8875e97ec47421e6093631d09ba734fecceb8af3614fe20eb778d06cf6bf4ec1bc1f02dd391ce80fa96cd7877c0f501bdccfe8487ebc87788acc1445bd3204323f871f3fe0a28f130fdce254200b3f1a36d71a1b6147143f4a430517688f82f7f4e40fbe7bd29f864964b3017ffed1bf2f69766afc7aa372dea1c021aacb624dc06b12227e0cf1600802573ffa4e113e27fc16569bce7616da9da64681e4acf896d45eab051c55cb3de88c2cb8e9d6282e5dee3fd25c88caf75eaaed1ffe75a7682d4b3558aad1a1520d7dea7ec1c1b879e099c0e5a185628abdc28035ff34867a855011efba09fe7ec1e080aa2ffd5d9f194a16552e7c57a9605076d50b79975130283755b4f25df301368536e93dd48669b2aa2e80a990952cf42a7ac1366c946a5bdd02671a495eda21a8dd1bd54c67042028a4ffdd5ec2e3a2d943d0cc8cf2cda0d608090898c939a828457a5ca01774cb12a1963c265f8777caa62b39042c8176de6d63ca2903c0b6982f45375a44f85fd942077aaa7564584259b29ace640b53609d67e0306e757699d01b30ddc2cbb6323427db79cd07c9dd2fa0ec56820e00d1012a2953ebaa1e751ddd44e378c2ce97cc6281162e64a8be58d6c59ff8bb73e862a6be3165103c5c1a845825b93f1921ab432ab021d3e095307f8b836ae77ad62e8d090134a48f2b3edb08f891c2c8ac3ce18492006d6e84cb725f1164b5827fd6caace9b0150f1462d25939f0e075439df17b71f53bb5036e0ff77547a3ac59f3da65ebfb673b8662e88a2722511fbcca8e191896f5804562b1b7e383952858b71ade6407b42ff952f9d7cc09411e84b1f2ab9a3c634cfd258366146ef8a883208307b6091aa6de65c7f5607b780093bb429429694e34ee6fb8bf64b1ab45274a1bd1b5a11615b20a4b3c175cdec3a376f4c04bdd7213b9ebfd14192fa8cdcbd7a3ea0d67c706d650558684fbc0284ad0d5566a75b2b315ade236f36c82709b561e59ffa63f6808137d157fa0ae4754ad479947fd47510a4972bbc5523b73c47b8f505d24eb84e77856cade1702aef08b9d115b99f1246d271f1a2abcfc6c0af38b51a7779c500d74353352c98e825e3c710b8c5ec26940e8ed90de734da7abe28fd5b132874c107198c9decee9626a57083a30d822218f9b781c3395761b903be931b19132748c4372b1ccdc487d56629fd775baa481a7aed10005d5b1f63a023854295e80dbeee46a99df02216fb6a22142622d363292953843f5c5eaca138205bd5a4654c37bac8865ba2584b4b79ecbcf456b6132120425d71650c2324532b982a988e5361c95e114dbf0a8897a312296fbdbd10762e466e0c8f45623356ee903c45420ba12d390ab8780f76c14b08c64839bdf1f9caea41756170bc82022834ffff51cb1fda1e00942a8dce1ecabfb7bfb4785795e5c05f4f1d1a9a144e404683d85653b758200b984a151aa9339324d48b5c3dd1588bab30e335e9cc0bddc6f27f226ec17aa8e9b92cf9ce5999b46ed016f40124f8ae8aef2b85f93ba8cccefb7b1e7742967abc134e5774fff2477b997b570d74571037b490ccdd4d1110ff28401731b2ffb680d28f80a0606ad8aee68c7d3c60ae79a015d5a1aae5df92c74f45211a1fc8070411e78df07ed0e9c27f4e98f9833df9d906d7f2f150391639cef8a3994f0e968096395d9f00e1a2f4f358bbe7ed22d657ea8fd9da9c5edf21440480b606840ded9be0b0d5a4db98dd9d650381c2f1147fffda3d51e13c124e4dae72d5b59c9f4456148e026157f4516f95dc1261488878fabfe755a65c644f11b78018bbbc429fe1a79d861051fe5aa38fd7fec7e653e1728cf6ce847b8643c770853f19741fca90de277315a9a23ea1843d6c44aba2b46d67de4fa5ec1b037fe37d59586305b1835ec0414f4f1c867778154831f8311806b2b0d29923e96a77d19284fbf5518976084b19f54ffde40508fc8a4ea41f27d6817defe93125e9d3035ad687f8f460b5b9dd0616885a4eb540f02792f93b2cf547646315633c8427b9b80401b807da220a671fe0aa22da59bac88d90a7e8a513c9f809e80c84338faeb66b52ea111be9daea01168c49af7fd67691055f1ab15c384d0104715430f32ba7ce080f5bfa05509a95d0328738b1dfd9dc6771515c19a3f4db04f9a24911081e722198753a510133a3c05ce5e30ba983ea7585905940c8202938bc0c6835127306b394f6fcf1e5836b1d9d6eba112badd6f08db63c7a706932098e312f4f200695bad3751011e8b5dfe0053fae8ff2d5c354f62ddae0bfe2158813dfbd4029c2f5fceb959824e2c7ab18f513e7f293a023c162119761e2cc1520075b2f7be552faaa70c1bd6318f3bd6cb6fa64224671ed6acdcb2e996661373b44f065350d0a2e56fea12bc6cfe326ccc1b64513f117fa47e0ca8c583eb25bac76dd47801cafa753f195dd99408ea4dc582564b228fc505ad6cadb22bd22fb5ad412163039aaafebbf07b00c8798034aa81159635892c737653b082b9d2a723dcd4b5260f0d43c41df65bef89c507b2fc3764eaae98e0bf6000cb36f503c8a584d84b7d8c42eff3d05d8331a3126846b390f198d249139448f86f07e50dba15ca7ea3a86622f4408d191cf0dc4f854fd1b52c50c5128c41ee071e37f714eddd1450a64ff8fc6988dbc3b848c4a8684d02b12d87e0d0d3185344e053c89f974a4694c47d54d76cc352d74f86502ff871974f3bbfc27cfc3aa303161ee9a84880953b275a7a759cb7ec9155ede82be28c3f182dd9cdbdf315969d52b6eeefa3a27336c255951e4ebf8556a04b4322eb431a3afc0ccd49508551c24d43a7e1f3895aa0d8e9d72c15da0f8103dfa1f9fb1bedf88d1bc1d7d3f34bcda9f41e26d44b864cc0c2895525f362cd7257d11aae8680d33f56cc98adc548b47bba82430f7d01bd0a50ad9bc9d586eee2ef3620f95f3f37d7e8cac4ccdc17f7e91486dd5018ad3f2257dc475594eb5e8dce5c5408195d052b4d92fae966fafd851e458143ba19bc4e5d9cd3ccd3fc89894b62d96e0de96b8000b760de82d7733c8bfa25f4f5ae0373cf9f8eb2fea7903be204931727066744d0f933e2b24a5e48c262367379d49000b65c968560233a851a4208bf2f89a2d7e11a37478f588c26a1072a446c2d7f46e6700aed9cb9a358505b60d88963dced832ef99dd989eb43cb4a5a69b00b49e02e00a618c63349140041a62acdea08c18c214f9dce10243d69850e5eacefeeca4e4f87396b6aac652b748d72064faa23c275d668c018a685b44e12637cc7f90c2ad8f3236c70ade26fc4310d4435d7514bc708e1e54757325d7d8aca953c0b6a7b2eac1e91152480bd3d3943dd95f636483302483fa22c4e691279907af25fcc833e1688731da7a85a8bcf2c7090a236b755cbb7085f446214e6b36c02d1b9a228769ec69b85f69f8a525e90a7f9b94aeb73d7834b2cf0f84fcc801078361d228138ac043d59e54c240c269d16584950f60a08ff46ccbb1b128cce20305d8a334d2a4a65b3e6d6e646a90c0d4c4abd7f5516f0c0f5fbd7caf1435063799d972904554fff0f5c7aa9ea8127fae8be4b3c112bd8a34ffb2547310d00466f706e10f1cc4b050260d320d1bda3f8124149a0a96243261a6cf78196aab0f7b08b536c16eb65ae7c7f97ada7c938aedd41a0d52b06224b348f505606e53179a1dd9bc540fecff4032f7d7102ec0fe345bcd7229611654587ed28f09bbb5dc032aa1526347af6eae3d9aeac9835213132ea3e3e71b86100aab66b817c7cf7b921560b354514aab3ebed138d8180fc004557a97be9015ac00ed49c3437f9019daef2e95cdc99133519b845ddaec5a02cc0d6e994ad5b33d50d393f0fe505808140852e8a6af9ebfd1db2d8f074ad29180305f87083f9e3fb77ededa663ae9531ce44074bea3e3bdf23d635a0102a5df6415caf4e1d780e3f2f2c0c1ff3494a1102458aa9c58979b554c3a71471f4d0d80c408468633d02c7f645716aa5d1959f1aaa51fbd377584f0daa34f2c6415bae4c2ed42a748b78f5ebc08a905a8a6ea5d1d7d791f236dd456cf52c8d30bd136435afa94df4689094ba1663622d6f737c1ac5202b315143175a7b26ba1dcdbb276246d10659255848206d10a3d87664fb557821a1515b368efe5b2263500d8895464677d7864e4d51b0d3a26821d214f94fb027aad69b1b35159600de727f7846f7a2ff3993d9386b56fa38a8cda76d909d45686216d8535e544bb8d3e6e9597d12ea42db5481b8b925e322359f1717dd83a2d6cebe47a94ad52e3ad9d322c69487e8b444020eb8f3a96e1daddef17b5ae478711141b3120c994371518ac72f9dd302e1395c5ee75b641eb05ec81b84e74d0829c202616050fe320d6f31d53b0fc9969912cc9c205a17fbb0c502e1245f91bfa91d0b0a1b0b042a2049240c6f0356f88fdf56efd83f4b32155d66943f92a8f5d1383a159f3ee1482232f1da96e83c77deec7e7947fa771f9596029c118dde3f9f76b3fe12ff52c5adca917cd59a9b95577e3e132750644803baa609ed0cc25122a20c14531d5cae26ff8c9c0b2a0772401563d5218725924e8b27a081814dc80bbc88a414d2546cd768fc937e857224e3b7d00fb22d82c788bd8998b8f79877c225ee130bcd6fd231fe95bdb48c883332a4284ae83483b2f83299de1780da1abcf41c8884d21667371b046eb4e98109b23eaf2715fbc2d206ff444fa664609340c28131627d622484d4f2824d9eb0534f63706043f1f03f66969121c524c269ee5c3f1970a86f61cec1e69d561c6add3182a252d333924c06ed692e22988e9adc9253e19f8ccc2ac2416c1f0fc947435083d20bb44f3572388405a1335403245a03249bf73b5419100278f563b92674a81462ee0251e942f60671bcf733733064733606070cd9b69ce6f35b785c480c341841251c33e2379a75c6e4fda1d91964c53fb1a1b68bddccee1f266e2c5394385d9c4baf082a281d304863410c3ef16cdcd45f20a6479df3f1bac6024e42a10316e1e58f14fdf56c274fb99fc20f0c1129d9a8670534cb271cadfc0fef4a7ee4eb1fe46e50ff4730050d689249336a46572156d09922a23b5fc30d2f1469d9dd9d33080455665b330d9a9f71bc7a7eb21bb191aa3f3eefd0537754dcde2d0ec4a33fdc75cbefedac2190d502db251bdcdc9b73dcbf9e76a54fe4cbfb707691c92bb2681fd5ef0c22899335eff3d41b0c0463f25dbd0faadfc31258de222b7d70570bc73bf828aee036cb2ac783ad29076daeabfe694ae8812aaa522db506ce3da6debb5b78ddcf357cb72ac488b47b517edb7acc80f8cce616d4c4c25b125e6a21ee741d2ade25fe7837e475a32669b30400c560c3f0cc412a78052f5f82d1d1eb1bdf5eda234ab55f26c7ec586f93c95154039e4eb248f0d8e3b72e1cf5ba208d01a4305c929d8b6b420a9a64542a39442cbb2990856e9e8b61669bf196eb528f9cb8ceb1a7d17021dd34eb15b9541e290609c44e436b99faa512b6cf606f6225e6ffab94db941818f03106f200d426ded1512a1d6b8d814337e8c636ed341e813e5507de6fb8e7508c9e2f8290de405734b3af784298853d9b07cbf098f32f153c70db2a14464c4854aadc45641c744f322d0a4d02bf608d7469fc88e0585acd1b3691f2887cc02840f8217016e9cc87bc205c113a689cbc641b8ce797c32153de0ec7ad75a0e89f251fbd415fcebf7e88a39166ed834e141c34dc861e06c3447484f8f51fbe67cf46a80a6e73a4301504aa7872ab32139d9536a9c1f8e0c584121b2e200f30ea6739813f008904035976f26bbad8af4e090258cdc7aefdf712b207ad71de30c07d127bdc8dd9cf713ef009834628a1c57d510209122f0e2f41199e01a6543e58d6416e8c49f768ffe8223ec834de81bfab71db97c01922025bcb7e1cd3fea60e752d25b4879cbbbe5a6dfa00e32adbc043da5c62a6c1e810f7072d7b42877a81e354b6b4bf13e65ecc804e507b41eacfce632feab55774216b9bdd40445eaf151c457a924e5449daa02640dcff2699c13bf9a96901c0c84c82e1224976475619999179a253f823a06ca6b8fe11f9445d4c995a7e82bede49db3422cbe2bf9c7e81154f07767b193a41908f079432d409f8ccfc964a49d9fda188de07244aa9627807332a6b99bce9e95f700553fbabb053a09f11ab3c1d073c6ae4f4b2da197e6a1754d0381bd9a5d4d4fe45b3d555d4012089aeb442fcf05b978c65f8aeddc6d82a879cc2cd24a7d5aa45742f635be976874fcfb62aa4ede08b7a27b75a3b1768bca69e8fcb1683fb083e069a48e369840199025b737408d365c45645e40f6bf8a3f39d09c758743ba5dc4916431758d7b468d451686402d9a81a6a602c18911732069ab8b2f22d0988bf0ba9a33f728cf3112abff76aea06e2ec4b744bed12d1e50b099583c89aa5941c38c4203a54ff10903cec4f18aa84884402f82cdb473283f91bc5e60f7bd319db11ffc74c4bd3e31b6149be4d12309420e967814f4fb3f5daab019a58ecf89244bbdc20b131c2468e7dfa2a33f7436eff65a8ca751bd3dad736ff04ad0e9fd8ca6dcce3d46c9ac185d7cf8cfb397c4888f043f2cc48260a190bf1e5a6d75ecf5b3f5a31e5b67a34fde1297a8ea7a3a9644d79b98ba856e2d9a9f3e9f62a1f144b022f995242a243cea676e0c1e20553c7af32bc847d0a4376811d688a8effd19f15deef6473dad972884460fab3a1454f4bc82305e80261fb92752baf4971dd19b49de6082e32602183902ad2975d63885a2a40010114a8c999fcc934724e7ec68117872c18c60e60d9e3a15911537a47b5520ea6a1915d0f2b73583ec805bbff55a38422c85d2c1f70951cb793b76412a8390f1478c98e24ee1861bbe9a48907143972a0a85f48e6ce0bb729f4647429869ff33003f649638e700988613419a95e5f48f4e553e8b811e79001c0bbc73c2d291beef22c48a3ba271c604d55a5874fc1b98ebc42f029c04f3d6b6a7223bd2a50bcbb470c6c7541f50c69de850413ba77a7fcd6cf539371277d38b4ef6374aac44e46658e3aca566394ff7e2733e6b6656cb025b71bd694d236a0516e7b3dc12dcde00696df3eca092fbbe3123b9747c93eb179d925bf536ae37c009f6e021281fb2303a168d2115686ee366004201ed70e2405af6d00ee2b0c1065118684297e24119130ae6df79671a71e5e101264114c407e157f3a7e30bfe2a89b4ae619ca3e10de20c843316111df289d508400d1d550fcaf2501da33bb43adce25c7154c4a843c582c29b0dbb9a863c35a94651acb822edd59b1f8bd09ed5778880374cf56999150e204ad46f7f4ee903d6f548dbe00177afbaacb8255664bfcf4c9d12148bbe14fd65070bfde24b1f1434facc9fae1593faccf316e5d3f75693fe51620a249db1f6e191ef0eef924980e94fecbc6a32f9f66f3cf510d66d8b0e531876799eda5d40eca97e9858e2637d258805de1e43b69f0ada8d46a29eccf0da07e517624705d085cc35da3a92d6d489d04af97e2d748793a19fead36dc40124763b8469520b36e9c6d8fd9186d24e6acc52bb791c25e8be971989ba84408437b0a2f0577fd27ecfdb38af4e67f9144e27e6f9aff7f9e282f0b5188014976934a655a1e2307b2edc3d81e74a8fcfe617279e6bb0a3e8526856270efbf2a781b0dd96e3a1d471bc4519c60109e5d216250dbf9905e7537eaf9acf8f71afa86535e08e511179f3ba0024e2305921d855d9295dd3df55ea384f678a55da3779a00d31d262434f2f4b682a33d0c319472dbf56e9abebfedcffb06233e689f9d0f014f0e885bb767a2b8536fb5d85a92b924e01c2cfca852212bd0bddb1ae3528b3c4175a02c590e484bbc8467e500cf6051a0bcbb315f0902cca3f4942a33e2a026a522234fbe3ca064d539d617da5ff1f1a59f15ea18a386159ea1d4668c93d58f45a4185b57ac191adea4ccd4f4378516276c84ecc59395461e0b740e6fb4325384a04a50f48fcd15dd1f69e0244851dba66db4120e14a3b3089281b13433f57abe60137e0c9fc6c52043f9bd76b90086aeb4dbe7b850b750b6bb53ba8e1e71a052b7f08da5b816b91d9122a9abbf2da561d5f3e6209f26915f60c1190af367478b2fe33735775bace397878f302c3742ace2dcee927901cb09d1123cb7372f419ba7970809ea25c6979607d37d402e64485843c47cbf5c952185f33be943d0701a9d7a0a1b3a665bf9570d3d4c7d372f5bc9443714dec33ecc847a1da94dd54bfb9ca4be2c1f195122d0cc042de68739e9fcfe2d045770800829006da2e1041b09f8fb11f577f10297a6bf55584f48dc777ce34a415d1d01f0e264499a0880634f5b1aee639208017038c4765b6a0da523c217d4a6b3bc59fb99818dc5d73f576583fe6fd6300af76371115c07fe007808732198eab5e66190cfcebb22340e64d1bcb555bb2ad0305a2e6f97535d1b7bc2149895044d2332714a09289a698849876ef651b181bd3a42b7b20c7a4c72fb65a8b933458822c85b141234d1f591489a4a7ab9e3c0b4312257ac29eec498ced58894ed8b4e11fabfd5339dfd9e952de5e7de42234654438f3a2830ae8a3029db266f50420b654a228e1c4bbf38fe863bc6d98402760eda3f949441387086947b15b05aecd7a24c33bf2d24e57e5db58bf89c1820ba54cd73919c28fa28246ce977178f818903f31c585e8490f09c483fcb962dd9c4c7203472f7664b1e6892e3b12b7ee06cc9bb18e0b53ad2ece96bbb9eab356cb3dfcf8ac35aed3b0dad5ade14a34c80c53218ccffb769bae236dd8d1199c7ec7511a493615f3e6b4d68f9aea112b5f97e437714dc555f03b084070c744a9b8316e3f2c1d5615de61a7f219559cc7fe17d58206ed80ea9b57340be35960c2c50b25d6ac1c35f579fb2b506c91a8acf130b7db23626b4c2a3ef959e7d691d5c9eba7de5ba65bf4f0cac19165365ea57e921e6ac30fb1fa381667f2d526a38667cdc94155b1f994fdc6662b2a4f3e11b1a4a4e256e819e3afa069824df70a003e161ea426e868b7f49fff155ef02531b13d39907bc000dbc72806374a8ee4e6838baeb39f4aeab34645e838cbef0189c5f97c6f68305b59f2dc7f4e126141ee36b9eee6da581df7a7f840b92b9c171c6e11747f8f2ec31799debd884c75856865c5ef7f75cfd9eb31ec7af0df66a1857eaea47f80973c025c4e456a0845bb004e87370bd76dc530b8de7dd85c862bccd7e730aa94ee87f5c825e93faf2b1d9a4e1dda35079a6b6a763748735cfa19057d94b664c46438d3c5899520d9c6d3e17734840724376ec7809e4270fe686803ea53b143789f9f21fe6aada26aaa3e136c23167a7027a04a9daafc6e7b62a1b07d2bc08d12781e5f83f6cda491f5aa31c23dba13f6273a97b6f780955dcc43d8dc6d23279c337d3562bd250d61b168969b1ecd1f2f90add949a96345c541bcdf1ed967a3b381dcbdfbc336d8dd35f14aed206300f5eb50e65be2a77c1c38b791e6e0839452ba0805231b5df19166df0b99e2e5f8ed5857429e433864ddb549f1725e9110ab1e0737a62ab476d153bf3174d3d2505f1567d2b5b0ea20dfa332893dec5881655ebe236b199de5ab4f412f92d192b0e352a4c211b0f23c2a17a8300c947fb2404fd65db5fd68173b43c99077bfe45bed7c7736b3943017a314369fe560322ec9210c1ee710fb3f8bc597b6819a64858b49f503174eb37065ee96a684ab58dcb7ce4562c80d2c20c78ec256431fa245c30981911ffeb78d659312172e73d17f4397c0a83167f1ee526cd5d12d2d48ffde9d94803956597a386eac8d66c4389797f7f93c53f5d9f4c7c71dc2693aba15d5b95d0ad4816e4304f1c6439b59cadca720fa365ca897bd73a4e133653d93332a110ca1d68b58dc98d26561b362c11dbcec605de270e6889f95b4efa159b8b1edf8982c2661eb11c77a2d1a0380a85fe761d053c8a894028374fe60094cd18a869d87f9903b81824596ef0f920871bb9e1a60c7ee860beb741a1d36b189dadc644bd0a0f95cde7c45e51023580f81e4245cbfc28b23968da0937696ba007e8cf7e404173e6882d027af461ce72092301dc90e71123dc5c70d24299de0cf7b26d3b38a36c6adf0a165f0653bea90f8ceb27e02a43cd541ca43371cf6308bc1b9d8bcc0b2f7889aabeaf138a610a6833a8245fdffdd656418d0327f5c322a3425b6a5c2e1fe1a8189e90e3f02ebf9a77f348b03a6235eef5443e8942df8d3f63ea33afc37d2784167613abea4fb1465e8aaab51f71c51d35cd726a5d5117784c314695aebccf967bd185747154ce9557b457969f490deca1a805117365c47f75a3e4cab87bd1b00064ce7c2d975f9768a545bf77691152c4aa4bb6bfee0eddd98e790d7ba913738e99726cf2f09b8495e3531cded6d96d5119f5da971579f4dda5102c27e563d174d0f12a098139f7c469a135f4b790f350c4036fb67e6224cdcccfb2e9ff1a41f939cc68dc4c0b24070c92a7b8c42a2ab216107c94e621a2c74d3059e3409403ca2c737acbb0d29fefc69c9ff99e06a12ad9888928e4a2a353855d4e171f0b3816973812edbc6f7cceb6ec2a63628dcb2409d5fc385c40e9e01dd1ba6b10935222e416665957baa754260ded401f2c0e11b69cd174799a2c5090358413fdc14ddc0bac60219001fa97322f5b1bbad5a7e1caa8220fec2b222bcf1aefd143e52ed8b353152322891fd153c8d8b6bc8d7e45e49dc89f0df7de23110fcd8b99b28f4edd1497b5d679c769f0fa8bd3b8cb92a035d6788d1dc8ff7f72454812fa6219192a4818b7420e2361e0caf4493aa2bc1b751847d818a08e3f59b29940cbba99a4e6fce60252c70bed88724dee30da6ebd9c4795076d17fc94e8f61a62d300867ef4a76cfe433c1087e66a4a1bbb81d1ad209b579c442db285c11a1e89c66604012f0f6e7e142b5942a5b40909b38805d1b3c762327012a89444cfd78000201753625c86f108f5d180218827ccc1e6bdd402fa96e80a32bfb2b720b85ddb168384d38b36bdb31044fc9119dda0482bf2a575878d8989e3f4a1dc93b693c754cc5b27e065bdca5deb7c254f83b21fcbe680f0e817bd9a800c7c150603f59acbf7aa5c76a3c7f0053cc7889868dc4aa5d54fa216067671fefc11fa04511ab513d65f2db00605248b974250806022f163d1e3bf385a80ed5d2c60a8f2814662a1300adf85ca39dfbba1771ab2b3e534fee7e51129b90cf92fce697219cb7e20a06371a09d1f64e21f54c2537a3c5a0f3ed5398429db3d1591f8c7a66a4a2502bf4d0702a24db41e9df2deeda38fc0101d5eb3654f75c474afab54e8296b60087598967c1bb8a0db4056163b4403ce6dfb68e721f6db933e606d9effba251e7d056513117031906aa79307857c029ccd87c719b32a80afe7c8e2ecf5e2f60a729f28e230cd75a377a641bacbc2221f397c9fb62b9632806e7e33db7a5e5e3ef7d96ba2b3980dca335ff4a50cf36b51c8c90ab8208ae8359d18a71e7bb190ea7fb40594252ffc1c2b1d6b86840725eeaef5da16ec0cc337888ec628e9bf8f1f5c5b381bf2a267c11bf6c634f1be8115b8d6be52ca1618e5906942fbb6a682e4171d849af3c973d414a26ea3d87c23999bb80619bed6c4d5a2906b80fbe8a41af1127b2034ca403e109b7453c73ab467fc7e472f2f6aed293c96f3f1b32fd713b298e060781d8b564541be9c5c79d1475835006174b448490bd65fd0fb1ae60d0ae4633d5cd17a4d0d44d5492394478b9bc9c9650cf4698cf795f64fd40f035d1b72d30762f245c1c8be85f76981758001a1b160a56a812d5df257a297b7e12d084440a8f111bdfbd081a1e320a2e3f0a9f099d032304f77f58d13991b8c6b8ff822977b20c66910606412b7c5d5e8978b2d5b75f7295524db7679b4331c5827f0f81692cb710e20c7f3e20e754b34118defe53fbea9c3a0a65134387bf3cc9810a6ac7b3b3b15f1c8e88e1d068cbcba076324d732c9f6ecfdedf19214f41f85a78039f63da2447e1a9e35a0d8cbd2819cb6ac6b46ad11fe87aeb2641e9814386dde74ee5667180c26371843b569c1103c13b119397a269318f1502761a5ae0c3fc89299a914d3faae9fc95c38e1a5b7ce9083a4fa5bffb963b2770b900e90d587096a9d33981b179291c9af15036b1f9d385c6c85980cf9580c7b898534d88c16ecf5ea245ca0587959c2fc791376a38abb575a8b9b05cc155ce4572d474d35e323942ed289403210f45396309878a57b54065877f3aaa59758924373b47ee929b0830ab75c6fd1fd855e3a4321afbce4b84d15e2f71f01ec0c1610b53b7b3460988a6d9534da8c385188d57c88973db4d5eb8e2007b00f53ca35ecf0ad19cf7bdad3b2aa68cd03fe58737a6cfd2c8b370a70e9d4b433953ad1040def61a9caf1367f02698c694b840df28e078a0a4f581886121f860fbef28995036edc9e4b9cb8ea3f83811f9c8ec5a28252cb80d7e3cced9c82389e410c36002ecf25842cc523a58f7d046c2092c63006d8205537e3aeda22ecf2f4c479226cadd47aadd4985ebcc11e1129845d53fa3023800b358ce38257275ab3c8095ad61f6aefd20ce441560804247c8a7d73591cb1412b22952a29bd18485a0058b9742f6feccfb86de074f1d19f498a16b65ed6cba8210787ca0b3a9201cf8de5541bd599a62d519a33c32c0f7fbf329578322c6ecbde3b92d1be8241e2146d691d29e970832189746f968ac3bd79ce43a5c5558b3a42a743f3127a329c90389fcfc22d60777210f3ab6be73ef8cdfc5ee4b8a90f026b4d2b462446ab5dcf9aa05e37f1e24b47aecb77b63541228f78115283a615d40c8ac4a9d51dcfb567945cb12bd9ce47d1a0e05781d9d351ce863065d12f7096ba11d5133a0f119f930d5f15ed14fbc152a24f5e9b10ec10a1165e3b747c7ff5de5c21603d24676c3f9ffed4048ebd002e5f5427f5e40912f5799587348ca28512a2e4ab012dc66d7ab9221a55a8aa12c977ede77e96f7c0a01aa21c0c9c937e13d8e4466adccc35b4525ff01ac17669a98e31cecf9df6bc825b68b86a27c922104f28c0cbf1a6fd312577ba7f27aa1e1ed80621cfae46ec385706a295bde402cdcb8c0c6247b6f81b1d4cf222908218cf8fa275b4ce29dce03e956052bd1b3a4ae1061095015079d2fbb5c8cbc3be96041e4b60a5a019c8d71a2402301e86d0f5c67190bbd013ea90d94dc4e297211be06015864ba75001be8cfbe78bdc2f73a12279798fd56f9ee918e2f3e65b8cf84208160cd3c113446f2a6894c5136dc033353e9a87b38fd160392cf724a5b591ce8818824415d6bc50b40643d2f61541ecdff9e62e46085683614d9849c3aa6b02ead05f8b7c001b409d1da3ca7954f1acb8281bf3f53f62e7e2ea324247941a97063a2588578ede81f46ce3f59e7e44ce42ee6dad846c8216d000ba5c0a711828bad9fd60ed399fd703c8e9f2f1cf7380807fa462187080b71658cd17c653b152c22cc1bda870e98d68996194894d0867fc7f57a9abcd496cd36b19fe0dd1c54300a55d5451d5b67ea969735de4fd6fc3f06ad07a307ece0074b0d80bcbfafb30a8656a9965ab4c2d8f911430b11472ee5ef1b3a2c053e48db3e82f1d4139aff10d56d5a8d46de6f3e960a806d7202375a272ee99114935c15bbf286a875a28eff62b3f3bec83b765d03e5c8d01eaf1853a380226b842dd18c453ee0720c9a70b1b53a681200b232bea0d2d4db5a1ffe3c65ab15200c8d6bd963422bca72f4541397575b8d61c291b2e4ea95c3784e75c663ecbc073720efd1e8556112c3a9ab2871c408d1df32ed653cd58411034800b897666ab7dc16846defaa9026eae1811785025a33f9d3b33b6b0181335194a82b99a6bc4dfbe0fa3bc6788df9cf8e9c7d1f8098d14c5f365ce355561bb4e0820aa3cd2d786cc44688d226a715456ddbf4e483a555b1683af231b32662d7a1061ad6ef1bd4a8e9024522d9534eb88ae5863afc33461eb6f0696a74762e4b8fb742536ea0a1e01d1ebdf94165c2547d8342d67bd8ca87191f7f071ea412153557fbf0580a723b420121e101b24cedfe97b6d897b9be8de8779c482538a8f4cb047b5fcca13aff715880e1211e7119d2457d3484440eaf0830b6f845363f5e63fe4abd50b301bd0bf746eec90ea03a36ae540b6cc5c125732c9b7daa7878a72ffb84113aa157cae408c9e9928600db33d91108e465e146488c95636715048b86a9155a5dc4328a990c6cadd4d01bd30427de3b4deaf3ae5f659689b5240209b61523210d0576b4362804a554ba98c9f31b39bdc19e56e8cf1611006df99f7edc9ca8e94c54c40e235710a42bc200249d377c3b183f596c60fc03ddbdae6bb4af1480eae36c59c0d11b3d6e5a8e5ae7506ccbb7f884eb6b1e72d84f9695e96d5b481a5d9a4991ea5976db9a926527121e96ad9afd23210350286a5b32cecb68870ff1b9d56a2acf6d8a71c610234ffae297d84125b182a4809f7c6ca9b00821d46ec0a2d6a59a1a805b9aaf57b72544f40d54cfaf36ab7d55d295bef11044015d675abcb831a4046d00d29e109405c01527528f0f5bc821b0722875e8664976d7deaee2ba2b58d6b70f8320895593a5673944e3fbd7e4040b5811df184e069928ff23e309d149381e5b25440902429a8ce5ea394eec643549fc0512a8477ba48df6d564af9ada1fea8155507ce1e45d30be966853cc2b0806c5a76ec92d7e710ba1c0b9f855a59cc094699788e2a747a0971d2ed9a321fc63a22ff5dd6c29bbe21901344665628c55001f998806dab99d9efa692bdd340de9e19c814f4577ae7745bf441344d92320a4dcf8494061470d25e1e26612336677018e4e439c870022214ab11d9e71a9b1491ac1d0b376f0e30218c7e48d497af6c62cf4e7722e56030c11d26b1ca51434e4fe8003cba95407ce1c6438a6b2c99cd33bfde34b2682b3d4c2f8e60dd11e6881b8414182ec2bc9bbd06e579158f0ffcafef3610ecf0d59d4ada78161b2d5fc99548d3a236436b2e38d47f21fe34dd9d240ac85a9ec54d1c4890ced77124d27ae3555cf47cd5dfb1f0a4b83984cfe51d53a56f2a6210620ac6f9c9923950f70bc4c5738d2e4e9767a37a91714d969ad66b7bcf52c9012f15dc602ca95798c59159cba69cd29b6a4232cabeafc8c87be24dd1f02842204cc1332b8afa3f9e09e6cd160704e1ca7d1332b890a2151a94387b675564c52bf662bd6119952be8150c8c4a245ccb22e6db18a05fa121b2b577a94c71b08d7d021a5e64d54438cefc5d2ac4867c10868d68d6d0a4cb48a43084a06f19fdcde7472a84d23abe8bcdd37980eeba6b9ec6a356949159187d4b2b9d8a874312b3b9983514787b102add531e6a640e8b8fd240484b80f3d1ccc95b649b6c2750f4a6397d33c59367685e5cd2530310aa9bbec18ecab748f7545c5ed8c746b34b0102780954347e5650c6c1bfc23e66d7d9f438c32d4903e8326b927d26088b1317c2e3c1aa6db9f1673bab5fd7fbc9d45425b9e413f24b886105edbd1d23ae511b45384614a5ee7710e7b784205456d861425a6382390a0f73fe10770c4f3cf23f8206b410e9639784e632d79fe439db98e46193784ff8ba338d434ced3382bbd790a85ea122dbb1dfc9d474a566b455f2be3fd6d2f9bc6d3d6432eb437accbb4db6dd83271f07828e0857b9fdc64eb88cdf2faccb7dc00be0a17353eb1b0bb6c0d7695e6037abdfca41b88004fd3ad06f7f07ee9c8a1b602c7d306d4e9cb8f75fbbc24c9da340f406ef9b1647524a88c356a14e78072535bcabca2006086b852c903032639bc6a285982625f0b36d3440798101c8d4c531be35db8e9311c43509c378999a52c6415d666c69ca58f6ad912ccf5d91a80a9dbd3c92988222965ae047f8982a412fa9f5aab07407419dd5d0d4fe961da0b013b9fd9f08eea991e4fca2edcca85d4f43bbdf6c3fdbd478cdc2e7f9f9f177569d536f94b7f36dcae2b9a7e59164259bb533f59cc22f97604e83cc41da5c4ec16e15cc6940177352f08fb5345e4da6ac2e2f695bbe694587aed814e117d3737154e07f59bbae3080afc2ff6beac6988862d3700b57b5bce295d8d46816cda8808c4855c1da25c99a205d0a9cc344b69165b1fa50c2d32803cffb399f0b0e94806dedc32864bf1b10178c014815f553a6be84a2953e57de36fbdd9989fec704ec9c0895c4472f90b501d35e95092af866019481205e60e4cddfb82880e5448b9afe51e9d2dd4099be398fb7fda61ddae8610542c683fb0d3750e97e37c055e629b47e4d4e1f268a5700f133d81aec8acd014280bada48a6371d198b3a5920a1b5b2b88ebdb9d4e0f1b972045c21d34e1b542a1923c0a2102d3321ecafee4494e0960c4d798602ae3af5ed1c681fb8e85d4a26fb8119acf774214e61517eabc537fbec3ddf5613264e5ea3f8413ba8d24f8482b94c0109c662e50f42da86da41a2ac34e38bb7991bd6b0038180802e4f9b709feab5b9c444d09473d458e5ac30a6f9bb0cc4b00c24d32f79910ab8e9b36826b73102aa83a331f7d1c0ca8433602ebf935c217dfd29aca8f8e9ef1e3e9f5acf9bc7fa003cb1fe4548b54ace0a4b619b2c3f207c7428ab1803ca56613098d859c885a93dbb01d7a222607e27e71a15a34a7d1d1efe0655b818f044ddd4ec4c91ab49ab18d58a7970021f0c92e99c3a95705a797a99a8b536baa6f6d31d2a74c4c3db08217a00bf8026555a6f869285d79d8a7f8db9a67db608dc994a3d21e07bb7b333c2f423a5b31471a39506bc823b6310441d9f6448c9c7c8aae1bc391fff94419da3e5a6b4c5edd87df9c3fa25b8d4a7da86c44c2406099bbe6e80789c942450d325a5c147f1961ca74b7e688be7ff322616cf4706a9149c9fa114dc80d704df620c8a9b4ce483085fdf63d3154c533b645729c3783c6f4a95537a230c492068e61091298b3cc70e90431e26b516ac8ae634910e1c17f9ee734165f88f366a0552890a246f7abefbbe6438d93b8896be71db18e964ae0f49e9adfbc1e1b987f212148ee5e2ea746909d8f857a17580237b41957ddb2c0036b0db4741cebe30e42b5983f4ffb452ffa9797b00d55fd33f52b3100a274c909c30c60c0907a2ae864b145ca41031eed91fe779141baf7d871b6bf351d82c415f00c7c848f937b98eef20768782670cc962bc4f51bea2c23e3539c6377464acd12eeb6ebbc623713a3b4a22cdaf4c312dc9b3c90d4c1603d54f738e6f889b445d8001709ab1db64c24f057a4350e9de7772d559638ce3456a3852f8bd5f94d6cef422c1f2c40c6892cddff12edbd983d4475fa59bae4dc9b9b1ab9d6b6c3fed4046559700c194b81bd7ddfbb16e7ca2b620a2541c1a7e946a6b6c86036862804e4596db4e4fa6619def02764163512278680fbf40bd6f44485f771cac100d379773d58d2a4d2f21f2eafbd306f26ad52ef2a8abc0ba39fbb9b985f4d9415ce937181466a0a24070956e562bb9d00549fff52aeaa4f4c6cab434d017588775cd0737b551d7b7979ee32c12361a7512a60083907a5e6b97f061a2920a210a89b35750fcbe355fd58d7211e986633101849b9ebf53912cab3d50a61069fd3f58aa08d9f9c5ed69e3ba31563316d25d7ee6c62b7b629cd0fcac976e9bb0dcef4f69eda5992f81ecc1d90af0b5189bb99072377c2239560b8a9df3ac9f9b36f86fd2dc9e7c7b2f2ba82b671d29f11f15777b30544fadb41b1620f2787975a02f0e64d208d2bd3f9e54a00dcff19ba6fd77963227c654c7e358042a7ab72c24c1db6842ab300091f3cd7b37611b94d732b2bca6703fa096d23540b5b1a80f80cf3a2af3b8530e85e388093464a98c3e30fccd48a5fec468d683dea74504f645446f0ce029575e879d855acc68cba782af074fd4ea41169c71cc488d861d31ff20918374900346222eb083da3251ba1ae7cac6d26ca1fdb3d0ad3595f4acb0679855f6535f8d0d954e898eaed73f65b62367857daa729c5d315f223cc7502bc90fd1ef70f73df55cdc04875b5f8e387f2c1efa73f090e4320f31d8fb62833c5a052b2405ae5886314b98d6330309c621862634a6879816a73d67302b6a1a57f10c2f3e627b5f1790dc3f8b9f4025aeb03fdc30744dfdc8c979985b3a6096abd32cde191087125e03b9878f431e0be8e353a1804bbeebaa6723c9832fd53ae5ae10cecf0356a1c8d0ab70e720a280e69bbdfae01b3c7cea347ae04cafbac9e9b3cd707c8c099db3526c06803063b427eb46e4116df13d33c5e5b7df524dd1cc5bba20036f02bae5968a1d00223444030a4c06795c308c4a4e07ebde33e77b6cb6e745b30d681b967e9329debee0e531201ed67bba102646712e7e606ab87e4441a758046cea5487196e5741601cfe3abe995ee48e7f0323a400aabed1d0da27f5fa5fe013c84b437bef2de5de524a99648107790758079c16a78b2a85b0f3c8e5cf38ca2f7f06da5b083b77dbb87da305b88dcbc8a8ac0a5917f7e5df3e201db41657dbebffbe22a128d15db509dd44af71dfe2083df76a5b6de30664e7f56bedb5cd3dfe4dd4e2aa4389a8d7dfbdd6bf3312d14f645656b9fdff1117f7ab1cb0a4b24e54517295d359c1c5aa11f7b54bfdc27dad155685dcc57d0ed8c9ca70dffda4a437e6ef5125395ddf5330ff97c7215403221ceead444037f7f641b8f17762a9f735da9bce155815a2cfbd0c532028a80c51c392132f5078808b65220e15158cac0eb54aeb1b870c93710a0e51462459776b3dccca00be6bb50fde71eeaa268a289568ca2043e9044c7630aa72c3ab7a400a6a0b0bb3872311966a40410a3166ec127084c8709ac4c0e9616b72ffde264b708a6e1370cf599631683a24db15b20fa626094e042e2099b1d6daad5a6badb5731583765d7d5a6badfbd0a696035f83b6f427cec974f1fbad368b4319e816ad2fede27764cb0798810e43ab83e723c4ee2da7d4bed16f92506a69a594d25aeba6744b736da873debb8f6cee63d4086142d209a6086302154bdb96ac80e3c25695d4eee33d6729a4a0046f06b950a7547fc8fa4cb3b9c0dee5d68bb6e2eec6070469427f34a7fc6e361d757e90afd91e382be34a0a5338144ba8084848418924610ab25d6a319ef7939294d2df58bb8f783badd537a5d4d234de0c0ab95615f10cb5487e145a47657150b9f8a8ac2898fc69d3a10a0524f404184e609182e504242758151698105984329e0866a0c061db4184378345c90e3fc867cfd995dad67bceaed076f9addbe4cd2077771daba78d49c5785f46e57cb9daa8ffc97914ea518f42bda638b647a13e9c17d8478d2c3aa0bbf2c7fb9cf113cb0af6b8f77239f851a811bf833be8bfcec9f970dac8c911eb8362f7d543594a5a1232c7b536c77dfe8d02ad9cb9f74422211cc0078feda3e7a1bca172d2bcd74151169871460fbcf780fbcd1bcb567671bb973a3cfe39cf23aa763e14e83df765ab14c29c88f23c07776c5fb6bccf62d9da1985aae1799e8ee7fdac42a9f7428a73c0ef537af4b1cccfe5926c096d9abbce3fbbe7ef44cf9efd3f686d6fed2ebb73b873efbed6aecb9ca69e145df7572cf5f61e7ff77df5ca233beba0ddb443ecee9ede21768805a1fe160b945f1ed9de885fecaed3e9c65201a58f7d7f47cc93e59f12bd8ca78dd6f6cfdb7bd4c7b2b5bbf7442c96be87f6edf0f85d52dcf7eaec1bdebf5fe78bed63a980dd3d1ecb17bb0c3bdf41b737e269c3bfe5e9d04a74d93a7bceb064b1f9f1db2be2cf6287e9d74477ffc1d0eebec478d30f81288e0f8676ee511ed95dfe8ea81b4bdf2b6f042102dc1fd9734f8ae37ee7fd043b2f7fedf2571022b0d2c037f7aded818fdfc6dbe650acc59b41d7ea11989a78282929d19413b4ee50a95695c4de9d1aee96f2b2713470b809e71d1472973aa1f376da789f0a4a8de15ad55dea91ecd35a6bad8558d1a5cea1b5d69a47cd51a291e8d1aed11aad512154d786425dd34f18292d618b794c25944e3da1b98d1b794c24362567d2e1b123839214159817dcafafb5d6dcf64c2237ea0a88d8b4b6422f09b1bf94a209d5e05dc0021e67d3771e4f56a1eef36fba89498f2e94e8efc1e71e7feec6559d5f470ede1357f37356b31b577304d2fd4804cc1c8178d77bfcf9c16f9c235e79231ea70e71c5adca32a2f46ef14e4812d3d528436b0d7df1f07ff93fd1878e203527a774070999a6e1121065f99626d910c9a3d5c444294d559175a94ee5a42555268fd28406793c86643e688e011d7f4c0bea73a38e334c581d4ce872d264474d827ca1d168349a75ef8046a3d160f8da2062f48deb94db6a8e011d7fbc0478db797344db82bfd0b8cd5ad5082dcaf2a12f5e130a4aa275afa3e6ea893e74705059ee44e3acdd39a20c1502a29ee45bba7c411ae2369ad39ce65b10ee3dc80c528530a69c2b15d3e5c442640d12547a6cca7854a19a0f893e5e95cea882873a1fb0d3940db496506daacb4d95b99baacac6a9d1e5d090fa55001d0cd19a001c03cbd1cd2fde412229cbbfa85abaf9cd2938960e0d6dcc6d37af5cf0b056edd85a6bb5b539ebcf596da57a1363551fa86a65532b1b7777fbc6f278a0aa950ab55aadbb6d7776956c7a7baaa93d675962b14dc986440f499cc95e9c6c4f9b52957befbd4b565051955c41432ec10d97b3e72ccb122c66294e94ba74c512ccea50abb4ae5966594698a5304496a5166dbd211363062b495274dd73666506194cac1c69d174cf99953056b47c332b55665644d8df9eb32a5434616940228592cb4847820c461449153ac45c46e69922a6334ad018d1118aaa78b9280e3218417379db5745fa324a62e48a4384acc8e5e1af8a5e53f2a6e69a66a0bc70e49aa1612a7279de57c5a12e5d602eeffb2a1123b336c399970bcc2a83fbfef78f6c22463e22a4bc5c608c7c415489b9c05491087d45b1c2e4226284f322cb4d60ae490990f355b1e55290400a25971114938ba404407d55f41f8c2863e49a52e0f08393cbd349d1265f684c2e3752692da2d29f9545691554da747111f13756b481e332429b2081ebfaa82ce79264cb152e231e1043dbd048e4c2c0260531b88818018f704d4a00235b9926ae23faf572557105a4522a684f4cae3af2c0d92908168ea8d72cad793ffc0961387fb8ede2546a47ab5cf5f1f418d90955433c61cf900ff5f1ab52a97878787a7a7a7c7cc8300c7f7e7e58b0f0e6d461dcddddbda7c72728fcf9f1f171afeed5abbb7f2b5fcdfaf3e3eeeed5ddddab7b75afeeeeeeeeee5eddbdba7b75777777afeed5bdba577777afeed5bdba57f7ea5edd3f16fad361dc5bad5640aa162e5c00bd78f17a6f8aa238864463059ffbd00d5518a4220ad23060c4881123045285402a55a8dd9d060d1a34aead9486cf1f202090a885aa45a802c2d385d3161f510b17ef22c8d2f0c58b202272877beeeeeea5915dc7175f75afeed5ff5f14c571ac00dce1a001e80763c6a0313cc6ada0023003bb71108c1ad467850123460c13741d65c890419224eb63b166cca001127d90bf0d90c823d23a8cc78821838824594d44feac1b435313a9767cee2e43860c70877b24a88106f60542f0489205ee98f139050dc07aaf5e4a396c67ad7a33543342151d67801af82e8f78343e1d46d7a861e3d361b407000058f059e0b5565b1ed1416b7c356cd898b5d6fadd7bef68810ab444d7b1fc2cb0a0d50a400004f0b93b6500166f660e7fafa7503771b890677f8229b29543984f341fde5459f47ba2f0d74b6cc0e7a0748608c1ba298bfe8092f43bf0b40e4a27b5a3fa3014150f17180c96278b3a9329e44dee4293afd0e42838acc98f9a7a1e1084e6c3000e9aa8177ede6b308339f3260e03e283a99bacdc8180f766479f362e3562594c1e3e9f0f48843f04ba3836ae088802a9a031ac49112c870687866cfe0949f029d96afd7879ebfce416b4d431720702721890e7e2d36174e9b04d5f7c1fc5e10e03896aeac54e8a851a6db1c65edb1eea032a17a4d8710383f765091e304ca0dc69fbb73d136cefadf758079dc55830fbc2011833177c8863a685daaeb5ed3997466b6f81661b102bc10f3398d1326506850d67542d8011807d6dad6a5b6badfdbcf4b0b7b75b0b5af63685fdba98f12245972b33b60d2a427f1097372c8badb5d642e00a9b1fc8a0a04413319765b32d0d4cb605b7b5d65a1e2ab6657078c2d21d2c1026b3ade58264db143e0a13ac5b4f5b1888bb1ca7a5cc931f2d4c2b2d67aa84492cb4b489f93cfdac80e449cf9657b80294253c1a2835f9ac80258a2a4bad6705189cec24f18c8192d2f2a4224267470450b42a5401565973b6c2d3955814a31e578e909e662724151183cdb68c800ac7719c15d9374978928d9a8c683a0a941e28247179d223cbd1079cf4b0525466498f2ab42094f44821294d093db6182561420f2cb4190b5158e9b102d3cc032454e9a1a5287c41abc228ed527f8c1b748bb6ae93302a5d62c0f4cf9e332a60643ce99e3d6754ccb06054d4e87f2209a8c3708a538f2935fbafa9b899f23df941a414a51e5298286b4609fa1b018906f79cc59eecf2ff63574cc83ad4aab047512c07bde365c60934169344e33232aed0dc120d11f477264691d64acc2881b652b068d076cf59ec0d0d2ab11390446164333054d4b0e2031812642976d0b7948ef5edb5e38a7a083cfa57a4b4eead1ce9d7bab2550b92962d974b7ed15a90c8bea5f6eface307dfdefeaa7c071bceecb2b563fe1ded9ca356fd4e52b2cb9615cb1a45cf2abc2c6b183da8bf71c97fb9e0af2217d8afa8fbaa66289a7ab922dbbe46cbf1533ceaa840dba8af0dda69fb07e5f83a6b503a526ecf1e7c28da75fc1e47d125de5bbc567d774cb75b3b3e25e78341344d8ee20ff4898b34321ab52719ada98b15b4bb01dccb297b3bd60d1b59a35aa62a55d9b441ff0160740794a4a2149a8cae5f6270532af49e6002aecb7e1551dbc50aba3ed2a6235cd7e746d7b1ac62362d67354252b3983a2255a34b0be26a9a5fface1914a4edbbd47b622d82d1f769e6fe0eb97b08e5fe7e1db978701f73f17e13571b16b9747fc5cde954d11757746cdda0acfa198abea3f883067b80e01e95687f6a995021216be7914db4da7e22816117fefc9c08c32e0e7f16930cb9b8bbda461fdccf0d44bb70b9fd2a836e6fa305501b8b738a46b4bf6f969d214b0b33a8acb2cd3daed3fb184a5c6d5a4727f53535a6bec8ac20155d525965794f521cde7bdeac792c3fe86077bf4d173dd8368f8ea56ff781c49f925ee78d1d45a1b4fe3a16015344f54f3425b7c75f71fd0d2afd6a77c6983e904a47226030ad78abb58ea8ed270af5aa71857fe7552b20faf10864e755757b4fa5bf52fa459efa984c4ab45e478b7efd22740c2264d2666d7374e5fddc65def26800bab3d7a2c4609bfbec5b6d0aea8d1ae0711b29121f4850afc1efc421746fafc5557efdd3851257795cfda88ffa0df4d3478df48ba86812c87d8e48912829345ddcf66da8df60e77f679c95f58d1ba08ae8df54e26ad33c4f44f528a1e9caafebeac77dd42fc03ecfeba0358f3c63113dae7ed457fd4a35aeb6a7f4f5d3d7aa5f6d23eaf5afc447893b44c00051bd1e8910019380e94252040c109ed73e5f84877bfde1ab463faa2cee9fe7555ffa9112e1e845af373ea31efd6f8c3b5f448f2efbd28d94e019551c87f281a24828c93d4adc3eab258a46a2421388990a6b36f7f3a94c61082ecf8ccaecb27ed9dc6fff65af29c198ae3421e18c36f72ba751927beead134fec922e39b14b8a4604b235bba46b36d7c42e699bcd716d7e3a5192e3e85115a2322aa301ac292481356ad4a041b3b4942307498ae2cf8f8e4ecebb3651b2be57b10826b7a8b188116ac4930bcc7d9e31b210f5f55fe7f5a833fea847b2b2eadb2094bcf2c54214bc2ad3022bd22b94b4f6099daf104ab5a314d54a631b17c58a2e6952514c6f493c288eaac63e07f382fcf6194071786f3ffb0a98187c6fed27828077fe3eca1431d91215eab9625fe9cbb67eb4ad97d93607fc666390b66d6d4b8bbc310a25adee9cf407d3c6486563280ed302fb58a462a60dfb3489929ead688f8d3ea6d1db584e37442440c59a2362bf0405169c5ca8c713d079fb7a5ec0bd5d0179d44864b5414fd24b8f458cd027925ea8df19573bf8f572a5c6490980f5d7d4eb4f8d9f7ad4a7c62761db79c5b6938a6d8b448f4d1bd60a5dd2188d6d238dd531a6472221bc5e2e8d1a894840e9ebebe5d2634fd2ebf5727914ec803783c017a818b9ea1f71856f74fd20eb33463086852663a490418c511263f6449ec9e10972891c9a72600aeb9a5aaf67d4bd2426c98e729abb2426c9ae6e1a773767eec720d22fbe24263bbf2426c9eeba777edd2f8949aeb31f750ca85be0bac6fdf246d0b3f6c67dfe1af7c6102b070d1af7ea7b6fd4a8d1ba31c4dafe9406ae5af537b4bb6edbb75ddfdbdc1bf723508c8d7b8da449920b8a111463cb01b7a018338ef03c4a291d29c514079d94529fb5d66ae9acb5d64a29a553b4d6d25a6bad94529aad78d85acedacd5a6b6dadd6564c71688a81b51587b556bfd65a7b496b2dbec1db2e75ce568a73cf58abae14d56590a8d2c7b456d4fb9cf306aa06fd26a5d6526b29ad1445524aa9a6d4da9be7eb18dce1b8c3718763afbd1b9c6b3738ee70e824b79fdbfb06b67de72ab7d56b647b1b277beddde05cbbc1b1d7ed7577270be78b3783ca5a349d668a2f77b76ddb360e5f8e26f99005ee84dcc959f4e79eef50388efa255d12b2d0a95dbad3c59f76af7b3e750caee52cb89f1d03ee7a1b77fa28491fc438dbcf74733a42a716751aa24eee64371da12c74faeea7efbb7dcffc29fbbee918383939dd29a84a958b76d80ce99625f56b991b1a74dcd480044de726072414103ee47ce3061876fe9c6f78da59cc6c671c9eec8c030876fe560e5e86f4dc81e382366739ae862336670396cdd9a0c4e666376ca9810a8ebc51f30cf7c3be4928ec7b3f6c61df59d2153430792fc4c84c21d3b219b57e20cdae3448997de0f5b29d3d53c133d46070c0aa66681234c311a784b540481c60010509e90ad212dbb2b132c8b6d5019b5073c0a187292430d44ba749939cbfaf634cc0129a5031acf03169ca89e18b134f098cc106269d2a6452f4cd4ac830981743104b7009455d0c4d4eb825b21c83131dd8f2f8c304d92c8627273f9c182529e18712a6274b7e3429aa5204f362c20f136a33193eb0e4078c89862f84474d1586155186d8fa67519678c2e950ab42a638af598d8928706a90d2c40629566238d1a83d67525c8891468a0d240b5278505531d3ba33cfb7879a73ce7b875c107cd3af7f64eba074ee0952588ba3dbddb62be309adb3e70c863755681f353386d03c3ccc4881fe6ea061a4c13036c070820a309040bed1e0130d3ae584084767bc1cf900e648461e25bda0b4cb6f591454c7b9f33e300744695027b5a38259dae313feb05801b570e1e2c58b6305412f60c49041b266d0a86103002ffcf9eb59a4d37c727ad51cf6e44a5e3accab05ad00086000376edc20000ea19616d779a13e2f7f1d06bd5287404f7a2890e8e6b80e41206d732caaea8fe2708da4718a32a13f4a5677b7d65a6badb5d65a6bb3b515d7ca430577ef56ebc5b5561e2ab4bfb5d6da5ab3b5d65a8bc9b7d65e5aa9b5d65a7b456badb5d65a6b3d6bedb7b364684fafcb5e9775a8ebfa4368fffb41d0aef5a2eabdf782f7de7befe675f7d68c3bee5e226cadde7be79c2048543f08c869bdb7de5a6bad76c35d9e5d9e9823efbd97db26b74d8a290e71daa8b372b7dedfeebd3af587ca9c73cea04aaf7fd0aedb7b76ab7bb31f04590fdf6badddbe8fdb3008125dfbd9fba6cd41699dd40eea9b14476a47c5d393da51599e7b6f8f4f55f1f4f46c9e9d3d3fb5afcfadd5faf60189eefb7cb527fc6ab5f75a8b83c577efd517e8de163e55bc66399cbb0704614363f2e14ad5d6cefb7418c0c109b0b64934101f600eaa2a1929c551ca41699d8fc90829d0493d06a6902b391425264a2328cd5a5532528aa394da5165150f16cab55aad2664b2e867803a95f089762578c6d9743472a7692384c27b7cd8b051a9787eec1552850c096148085a488e1a9bb0874d0f143d60abd5f3c3a27ab9f3bacc429c17bc601ab88ac87fd808a9d56a405688650394f2daaa039ebbbb7b0577d8bb836ece49575d5544f6c694bd70baaefcd448b5f6de6de3a6e83ababbb5eeeeeeeebe7118679c73477d568cf3e79e73eebacef3be1a443be89c9808ccc9b19bee54965277cff33ecfc999f6fb9ca26a543b83b46a72dbe501411d46a374ddf56da523ce41a1505a6b9d21a21c3b7cdf0853a9d40e49546307dd2110dd2a1e90082889ae63a9bdd65a6badb5d65a6badb5d65a6bad7574f7fc5d1e8968c085abd6eed5bdbabb57f7eaaea3a3934aa5767676542a1511518f4f1895554e1e4a1d746010310407b90811471fde7f4e854dfa449f6a94299bc640a21ac3a2c1112f81c928c42177538de85315aa5b6a14c7a0569916d047a2f5cba68fc2941acb5386e90b3124697dfea49422a184e6508ae4068922d66ceab02f94525a4413344529a54eec1d4a2b0e4478e0043e74608511580e6cfaaaaeebba9f212165776fbbaeeb2a120f605ea0bd5cf9f1e440a2bce9edc3ed081cf6f6b38aed618448a20ad9cb8531fe376208a618bbac6184525396a61a0864455071c66e7f99d43cc984465f950f46cc0050c43d7387b8730aa625fbbebd976969df2150d8778811ec4b44d2bedf3af364df1fd27106cdbecf030d07f645d3b46f1a12f64dd3b46f115e5eba0a5da6cb2484d3ae2f5ebabc340dc6defd68632c44d3bb80440a2e4079c900b36d70e802b6865440a4400041800922ceb68fdbdcb80104961940f0b06d8e7d69afd76bcacd21892b650389364bc6daa06d6bb0586d34e55463ade5b66ff9d93f6ccb83990e98e101cbb64ff200c5b6df1a62b2edeb506261dbe721dbf67d70a01467db0fd203d3b6df8107b69df960c5b61fc20f4c2f2db0a23073b634c3b63320901cddb9b570a40993315a509064042c2cd828a4783c4ba66bdb33d8be3b3051e605ca832e75ebc60e4580a006aa103ec6586bad7fcc9a272d2c86e2e9c598374d80546113b226949a6072118e8953b452d3444d143557d46c69f1b22725b050856e62405816bbf23302a3950ce94aa8e689858ca9c86789a61f198d4acf12b05076022a3c163bb1e4041a27d4f8844e4e5025e1d44326cbbdf75e36489435c59459fac1060d0f48c491648e8a52aa906644eb423ba2acb9552119d9131dda0e19214cd03fa0e89222a326ca1346984ccd494e125d34193831d06210348180a6759862429b241d567852c44b87189ca461d241c624044cf88726b8a933a20967c491114959ebd044d1e606ebf006ca9dd8e2354a3fd630717a87244eac2a8c628a1f51584159739758ef1025ca089c76e80213c10e47454d453bc8a614a114bef036806025a9e0c3942f58b4dd7336850c8c351aef399b3233010833539a76a99f86294db08af4ef399b52c5192a55c2300446e0cffc16e4a19c4b3ff3d72f73e89f96b2c0df11756c624bac6298432bea5c50ce337bea7c39d3f89773884e447d8ef8bd8b3954ec6ce888e564431ff42270a744d47ba2fe1cd17b1d31e7679b0d72306d80ef2dd9d068a858ce1e76a9cb09c410bbd47ba6d99a875c3b3aa2426a9ee7c9947833a8cc479b7b8ffb12dc9c36f7a56a03c1dd9a6cee37cf0a4a72db6b73af83b2d8a5dd774baa4275ac5b52cd3f9f6e4dd306f7155ca14b2e4efe42716cb5fbdc7369e615b93493c5855c9c79c1b46eaa0836c7856073f768ab2579e8ddc7cf81fd5c57f46f5265713f5dd8c73d72e12d147719b11125b91f63dac77293825ff7a80ae1e7c27ba4b967818db82ed8c7d78fce09bd7db9955b93d1e67eab71b5cd4dee5dd034978f9ce2ce6883ef91b5770a4121d0f2a042add6745971ba3c178f0e9a73ce39e755b5bf01f9f4ed58040c10f2e9577b7f0392fc4b7e9109ae7ed8afbf01f9f48afef68fb8aab8ca9ff30884becd39e7d7599c5b67189651127c2ae2a2ca0261c4788d9594d0df971c6c73471c8c039f2ba238ba073f3f75af0d76b00d96dd1a8a83e7c1cf4e1487eac1cf6d288e9d073fd7288ed4839fc1cf4854686baa2c30a8829e9f3497d96036aa4239ccb1581592f1e0734719e87111e61e7c0c23638ce573628ee12d542897a12cf08fd0a08131967329682c679959a682b1cc91e3c68d5d724fe44ff0c7aae7ef1f71ad7a80d4bf2311303d4f64044289904fff882bc7385865818fc7b1c45a1c4b1dfe58862fc6f2398e5659e0932ec6926c31963fae46163fe1586a9fb1958f36f89e7f3c222e8395f01266c26828093ef9d365c5551e2fe043c6a7385815c2f8e9712dc44e1ad3b00c912345fcaa2cf0afc81d7134b0e48eb8a3a31cd59554361a734c2cf118d3250e017e55a1eda8b2c0bf9ffa9e3127bf6e4ca1679b0cb41da58e8e36f8d3458ad3c523e63594045f2566274a82bf23e636b94649f075c43c0525c1e76855686be26038d35e18a68b3608eb621b7cd8069f3baa421989b2c0cf6a9ad0fc52584667311b3cda60ce98c71fd4254397d1dc13f75431e69e9e36f89efd5a059817cc0d3e90fcd2d9bfecdeeb44164c3ae7c11e3963d206df836ec494fcde52f27b1dd43352ceb10450d71d73acb2c0ef9cd0b3ccb1a6a6a6a60d7eab0a3960b2c007a3d8e0e7b8a0e94ec494ec5e8b9692dda3c41c31487e308319043b2316748506fc493e08165901195b3f8b606e95df77fe551ea7cbe6d873a2714adbe8a82c1087f7f33d2cd6dfc0f74c4524603cbfe713ecc6361c5416f818fc2c967a83ba07fd3d8ce679b40dbe3375e07b97fc20cd20cd20cd60fef2c17798831a0cc1f73e1104c1ff3eaf29e1cda0922bbaad2ae4faf7a2269f2d5ed0dd779e534ed90f77d1a78f7a1df451e07ba223117d54163864dbdfe8304a823f4170aa9ad0df7bcfbd40eeb5c1df68756eb40dfe26ab186fb20dbe0b9a2e72a3ca025d1ca1ed57071feb2ab43df8215985eea3c632c49b2be262568d7eeb256cfa7acd765a43700cfc0625c329f404260620e00d42d8c107f3821bf49dd20c5c844d472edbdb0ea60dbf42039feca8c48c9a6962e9d08c00004010002316002020100a87c442911c87f24c14dd0314800d65823e665c401f88435192c34008628c21c4004280310418620c62caaa0ce82a27d81a1ac6c4d01061b5d9edcef91f453135597b57896b298b5c3fed1607cb8201197f8f5f0b436057a8d99f0bf9df4b0982c9d8a91fb0b66e869a4f43fa1ddd75ec69db3caf7c264881990dc6a65fcde8b6eb2fd58728b77d373a70d78b6ab8db30c1258e45eaa8e9bf1378e20dd0f39bce6dc57d9ee720f1fd0bf4ec72b18683abeb89f8ecbbde6857bfd033626cd43430c9911a89c73558d1ade1cc59ecade19f68984a28de704b00c86e1033c924462667a000997ad9e6656fff6e3aa9e4c3221c21951df47598f989bfb3a747f91fdfadc6fb8a6910d74f90fdc7cb2040a317413834047e19b9d105e45e54c75b7a7c8de76a4a3cb8b2b970206acbcca66c79930d6e481c8615bfce2dec4810865abf6c19f6a0c1c2a98c2f23c3bacbca2dcf7f44cf630c6ec94b5026011c8f8f599dfcac8e5c73b2d5dd7c505ab97fb19c9ee6409494fa22491750fde0fd9467f535c948f53a394e0a3fb5a51439a474a43ffe0da2f0fb6225beeae4d2bf425289b3d7d24d1411cd89049d38e1905cb5c1f58c5a7282a2aebb4b01a7f3cfcf1e91334257e1c78ba5ef2af4f6591ce6e3da3c315dd24bef1d6226f74ba6169fd7c5f7107c2e78bd0bcdf326af270dc269fa5692034440a399b139884ea4386b2e6f1818c921af102f9a4d4776d6e1dacb78121feb114e2da06156ece0b1294d364a6f9a945644790f06d10b189394897602912627164d109876a7d104b94a02d963b04c98adfe403829338635d40289c7bf7ec49b1885578e65310819420c4340b0223899f025f244a068b79d492266c9fcff60100068c9cf3b66322c9a0e59f6c641e7810e1f95b821c769ddc56ee1acf5984945cb94453feeafde9aceda418d5068c6ddd8431a9b2431330886538fb0b5f29e2cfb904739c92981f50ba5a8a09900e1cbf7ce45b53a3412d2199c79f3d73279ce7bf8c76555c28536b3115e28e1cf42d426884fdfa5657aa83f4506f8f2c20a335085c96c98e8c841e481cdc5f8e789bce4f5fed95e47bb40a8f0d98c2bb2805ee504f04ea7f02d6119965c5fda975c2f4f89a25a6b61b4201ea3aaa0a9a9f0ebb8dcf3e12b9c10b0b18ed82b3cbd7e99bd98d85ffcc22551f2a8ddb51e579d1c2839cee2b99994c7ff68af798c5550d55ebe53f2fd9c7cd7fafe95ef8b372883c2fd75f738a45ae9d2835979ec2e8472f86e2e9dc91b3027eb487aaf74b275c9bb45fd7fb93b914fc20c0163e2556e6820d3e87f737c6b4167f9950cd460687eaeefb159345275223f0d26ebc0348d4feccdb3c955e74251d4956a1198835f2549e842e1725db120c2984255cb18ae10a0ab8cacc0ecdedfc96e82e6954497942952d6861f9b4d9927fbbd06b62bae756af2d71b39b2891f5676abde8076e883d075b9e6df8bcb3856d6e558bfae510b77bbe76aba13ebbe1c8ea3c63af59f36c84d316917d238164dedec159226a108c8ba947c9c62a0c03014eb9c8d509ffa5bc05e41607c6c1dd535b1a1aefd55f6db9f96d7a3b4266d2eb39f69bc491c6705170635417c76f54703283816e6819c50faf07ce909da0355d728e3cee04d1a8a8918516c52d4e508ab22291c139e499378066fa2098da96ecea3b20d632bee696da3f856c7114bc00c7c795d6c50aea4a5f77c8e8668e51dd5269c2ef02b1c48dd6419f6cbbce964b8875173e27282c87f2e351353154d91a39bf7f803d6d3d51d912d98309669d2010b52e5839308a2069b02be7d3627223b48889c6cb50d6cfe56f7bba647e6faeee75aa747dae0c3b80d82a1b20897a22569a1aee7de6dec850fe285470d4650fd7ed5bff265cf56e3e0b7aa584af25fbca77bc576d8f8e320a50a595325a07b4a7cc9fe66bbf2e1dfc3683c6a8f769f2645cf49f1961276f04f5a9bc0cb9380747d1075107a28e7a5b6d071242cab1cb1e0ea9e3f70a6e4bbeba8fce40b75d97b52356f987ab24fa187d438aa92fc23803271ffe4d658dd7f9d4b4fdc4ccb8e39ef21b13ac9f116ea22bf08059a1029821fbea8ce91694f634fe3e20670d28b1805ac5bad5c52de942e18e92dd1950384b594cf9ee9db5fda8399a017dc3204bd8ca37c8f9393edebcd9fd887d35a00d06b25c7481116d85c65c45232f6495ad569fb53fd2efa112bea7534b0cb2d399b4caee03b8d601c6618d213f97632f991829a2d23a0e988a01184ada7b7d6a20ab748f24b75b7acc32c90d74eae950073858dab1ae2a47d95f83d02dd2e42ba19c89c073e8394857ff25a567ae5be5d255ebee0367125100a3d1895a5c4794c0679555eaf33c0f7fc85480836be9d8a913631f4c1fcd008e5d0d9df2ebc2d77959d0417b9eb31165b5bea1430194084028e88c6f2955dc9b9bf641c3a6a718d1c0ae442a5378d747440564a055d57a5e6b40dbd02471728212291f7bcaf2a6ccce8b9c4c47b03330427cdf29f9263bdc8cf8021c8cce00b28bdbf0af40bd2d25e6b0476e5eb662ee0ef846570cfd469589934a62d5cb8eb8ead95dd475c37147410608873b81452f58247c2bf07c80f241789faf967072df51961e9fc4b31927fa71ce272e5c8be516e761f8754f05d74b9bc8074ff31ac4eaf56e8985bdbd9640b994fef6feba9e81defd161185527321d3ea19f3cf19275ea7135a42da5955200b2a990c4d2e6625f8cb513ba220f1d67fd3fe90b28eda00bdba9fa161133374b3d69d9663794b9d60e423bb4f92222e3c011f1367d71055c4f9e49f007cd48ef0c6b59517c8d34f9cc2895bae29adca51953b4d75035c7e7b437a5619d2e369b310823f197b2411afae924ac4111d40eeab670594b05482e41417a181c89128e3595a6d09c0db69a6f9d5693a3fa789ae4c1265e64768fb4ba30d5f41b7e896c5857a57722bb24c2dc61bd42f36f78b5d972703c07644f72c2b0486cdbf9042177938bd4194fc2564851ce6342ad4d864df71fcc4d3c6755480c9a1ae1eff08b461d3404ab9a28d109975dd48eb47b23a73dc73228d20e0d6981777c23b0be501a1084d4f5cca8b54773e8c85fd612003940f499e88862c0e7e0b4bcf235a960fc5e925701b59e568474ba462a9ba301524dfe5bfea76bf83959878a77611885cb2265578cefea64cc9a2456ff9436bb136ffc38633df479f5325a5bd0587342436c0a3ac35da5f019d2f536810e36076dc04219cfb3ba8fd1fb3987d7c4782e7440bdb1b8eff106a67e52948bba04147c8cf4191cee1aec8d2df88cefc3ff8cbf5b353e4566453b35be6d199fbe7d073f90b35a7833bebb682133595a7c04631904f560f184f8b8240c30dd5a0e449e2db9cb5127c5a7ac0f1a70f57da79237af81cd81088e977d097e61138949481a1137b4de92edf28df8bb787c9102ce7befce19e382e5b761ad2d03d3b71b0887c05029fc4f7497ee6aef1cfb1ec7172feb4fa09eff82041ef92c32ec5de519defc68c2736e9c3edeee16bd2f794eebb42bf65dea99b110037f29017aafdcd7d91d036569bf32e00d8b7da8925ad6fe4eb49316fed23372c42983cae806b82a4f7cc58597a8f01fa84db9aefd1e48f975b892764ad8b1c3a7a9fcc9a27aece21e5883c40bbe52821d8c02b40981d6b65fefd7922ab78966632ebbfa852d3d724b27093a6b47824b0a6b0d88d2fadff1f5901abc0959139faf3fe39d1873be45e5fcb7ed134990172dedcad8e998158b2bbb5327e5a404d95953e1f51ecac2561767e18e45e2d0aae56a8c471d7aa7140f8086112591d9cce551e38f0ebd2fcee6ca0cf604986e4d1e98527302a132d103a27077a31d525c88986c67cf4a82ebf0bec430cc8f1ffe8f92a88c69672cc364ea2b5ae017ba9d74188f0c75acf22dea894fc5a1cdbcfd916491f296fa19c755201e98a3a190cc5ea987afaf44006da82152eac9ca23e503729f814944a78a604891d0a8d0729dcfafb6d58e98603c8bc8eed584fe24c37ad1b7c09658f982fb7cc585f4f8e7e637b3be7c20dc89702920252588efbbbb8bc3537f892a44958ce2719a15f1a5ee67e5b42068d8efbc16bebe6dc98000aeeb5cc297310fb464df60bbd49aa5265cc59c4134a009487c1c97aa94f53c318170df2f91110acbc96d6a289bf75376ea0ec600c3e52c5cab8c0743e878335034ec53ea79c790e617ed5ca5c6066885f1ec090f3255dee96b256f02e8f7d36fb9c1a476cdbfc23e3d68d2a31ab99fd207e6c60e5a74b6cadfcee3072e9a551c4118f3e28faf0be5bdebae8015ca5a829732ad95e599a9348ed881a992c356381a5b5f0df5aab843e029e0f24ef7e5b5861a0291b8d5a124feabd0d0c8591c19ccf10578d813cd4809e55b18f625f879221052f514ea5629ae02e7e80ff21f9e0f680cfd0aff1d1b821be69b73d9a34fc08cf43260813c0ff7a646541136e4394c5c584ee40feb07ec8f1def6592c9b624f73e47dd7542ead4b43b22b47c40ec1b8243ce508114229a823c2d9a8c8679a0c7133a05be73b83765153decb64c12d25895ede4ff315904d593edac9a0bfe41d5d958ca9c999c775e619e2af9d6acb34d2c7f521e11ebef4dcae296c28e304d14410664e6cc9ae8edd0bc5eb6d2c68114745428a0c29a69a5f0546b2d3d2caff559c304e074f7e5c6727ec59edd35216adbd139e32bb199d5837ed303550a2b5cb739ba2f977aeb92a304c20481c9b834e5a2bfc25bb7d9e547f640821ba1a82c5526abb8014898b0b5d051d9cb5f28a445e19b3a2dd950c01204f1c7669ae2131694420c44ed42cbfae04978fa5c57548acc773861715ab9c7f047d72420fa8adde633d1156d5497a5329dd6da7c2b340897cc030917c67c974e145fe28b04d0fa082f6270fcd7443a1dc948c9c297f66b40da218fa736c8e30d469189d5fc6675bfc5f9b5aeb027c3dfbe5df94c11f74226ba670c628ede39fc2e76321503e2a61a02915b098f6ed2584d053360e58a7a6a9c24cf8b7704ed642d943cbc97d07a992a1f5ecaebc20401e7a0203729716ba6b31ce7ebe75c618f998644fd9a890b581586d596240c7626a19eaf11c116e401875c37f5c7d880b10f92237f941e269710c77c07a5acc91de1e4728c5c4d89f07a235634e62f219f18efb3616102006a12c9f03cfadba5514d5a52ee8ef3e3bbde7c2c413a2146ce87e934659d4504f71b763f423ae176e6af2a606a6170f834f82346d632448cda60f28f874541cce70ef4136548a07498c113394e64a250902b398edb23d3a2aa588830149328f483ac398405be16f72fa02b0c214c2d2564c4f7338899174d7277ab2e2e81cb2aabb7624ba23bcdccb7adf73836718044eb753229d835c634dd9e04f1ed9c1623006d9359f2159fcffe3e4f5acbfe2e0f4a815a080ad0735a752a6b2d7b378c6ebbb439450d7d475eaba29ee3a90314475edc8248f814f88aa0701cfda12108a323942e5ffc5446ab97457776a384d1e7073b85d9e8717a91b9ddc1298f4221817d378a7f2f0ab05d3dfafdcacf15462448839c82a2020495d44204bc49a8fbff7f19000d8393c670b92f5e28f051a6fd336f00651d094e25b23325c330a803c32d013db104b79129954d725bc94b807d5cac913c61b84696ce5574615d9d5f6b5ee87ef037c3ae921a7477cfffb77e9e76986055f79479bf16e1c572bc58ae94842233149a8845a279ba6c67a8e6fd357c1cc47baa6257fbf55bea7c025873bdc1ab3374a3ec4df449837d3e841ce9a90055f78f5c05e9f5217e1437c09c05135d35e3da575ea1c2ff3f90c11cd0816a01ef9790c159b19dad415457589181ae8b42bc4c9235981e0d61ef29e3ddd9747826c5f97aecb0063e132857176e11030b302c1d3ffde49776f3082c3d30f3ebb62ffa322861e5a88b238c78d965621ce69d1dbfb1a5462893067f99452f2cebb646401be4550fca1e268fac4efdc31b1f9876d55bb6f6dbfdeefa8428cd0bf3a71e3ec12ca2d341395aff4e314650fe31dae67184ed130bf2417a7a1cd577cd71b3c796e75a0fd6ce479565d2f24cc1ce97aa276b2b9381644c5bbba4168c7f81147e60d5f0874ad8409424d7db856373147d036c6b2eba5c3a042d146cfacb30ec4663701fd2a437f2f8d155f3b8cac7947f0b226d3e25891cc7a5f2f7815e9ee68245c23ab9ad76683f27532dfef21efeb63b4288e29d8365011a4335e2385aebb80d558e598400ab5be7e43cd49d1be351aff492523477b50c6fcfedc8092456d50e2aa89245a932feef1c48415f849ec4259165bcb2e7e2b3ad2782b9998ad1a8f4eb0e1f2a959a2634d643e5ab4b0bf48136b810d205173c7799a3ce7b4319821926feb0c756d78f8486ffc99c46ee5756e4fdbbf15c894814c98a1d5346e95875166b22bfc010c74936f74dee4a177b3fe1402f60540d13c36700a8b44f7fab7e4106601b1f9e70a03c7b262ad83a9f9516a01e7c7f9b4ea9b7871970f8c35e35f08387770dc88e32bd6ec2ba924b91af8830fd36a33d0837be85db1113766167f79bbe241969656f848299f88218757d2509141648a25db98bab04bfe79e5543ffaa492f823fdf4adff6369b37bb93f6a607d73e534dea327536dbd957edbf298da5d7d9afedd156f54f96fe52eea7e407536053cf7129c1e982b8eab2538206b3e0ee40f81582cd970efd5644fad9cf72a46be60c6f537f10a6f688ff4a152227c333d81bda8244522ed828692b3362e1e1489da72b95e14c402478922307856c981ce5cca51772a8712f661d441d5126f9d7cc9b5d821395c7cccc1774633c06a7874c1227bbe284b8a0695582c685817749f7219364335e07068e9264512fb0ea7156be482e076aab1ff85b059a16a99732343d0c3f01b56b381724dbde96093f716025f098329b9dd7449f02d00a1cbaf7582f49e89a2c6347477834cc210947bc3bf93adf364c0e52b95a1c2fad7d8d46345a87b2d83e0b0c2ac7e6817bf6befb6f4552c4356f3ce9bab94e91c835c372da1abdb896fd86e1587567f86506b25ff1cc8137402724630d1a6e6795f0b0b5fd4c94b9a31a81a40913a5d5251b0a82f77c0dbf6f4375eed7e34d7499c9d65fc75fcdd5f839678c6918b015882cb57c4c74d030fd5e06c60661c23b3cb3e30aaee8bb3c66948f776a705da9db7dc6c89728a0716a7058c7ae127dee1c63d95b75324ab28f68ade867531222cbfbbbc7426fa6b245e29c0ce08c05cac466e8d6067f216604e72bc4d0319c93c69282a8325ee3973d5a56ff521dc0a62e33379ed36108e069c38247f2b42b3a1edae6fc9bb45f2648a3557e4280ff6b9209ab9c60821233e81312b5f372fe9de589d205a773c8043d33c16f8ef38462ed9c434624c213aacda13eaf674c20d75d712b4e992fbb2b3188ec9776a319147de8dae1b8140c1f7dad7d16869105dad409a0dd0ca53244bcccb90a397302fd208d6fc4decf8a9c147a7fa33800f5de467238164ea008916557b9a8f8a19c00bddf4aea3cb139f5f0743a83641b764917b8fa07d047d83609ebcbcc9ccdd4f3a4677b7e7acc37467afab81def59a09b8960694d199d0b62debb85613acab89ee5859b41e6f6eb891fce67b290289c0b33419841a70978da9e711a023a9da6941d5122660c84844ebb2b087c8eef95eb0e0ce5a8a1b9494f16e57d05c1e3a0fe13730f9c9fd6e026d1e4e5b68870ad0f832f5b8d42a691bc36db8f459f36c84bcbade7d19d89fecda504c6e64ca2ab9c710456130918899ea439ffdfd4728e2593fc80354cac56a517c6d0010ac764dd6818380ced161d6a89fee0ed9afe545dd749b6006ca89220c69f8f39daf7bde019eac750a129e1612de1c5b8b6da9e438898d667645789e12cfffb0dc5a1759c98fc5b02b387f833aa559310f062db5adc550a04de4ad05e7ebe46c7544d822dafdfb8782273c8a95c0a707babe9438f76fe5ab46335979328f0bf3cae9b4757b7f3ae364efcfd06a83122f0e81bd71a0cc22ed62e9614124125af12cefaef02cd343550b8860c38fb8ad0cd2d5f7029c1180c00007cec855a43d54abddb4ca207660846fcbf12cc9834c97b2318e2706fbb8e75c9efd4a124f2608bce7b5172e7dee2b8dd24d9cf1717a505051eb659b7ac3b0ec6990e77e3411ec89a86d7c106b21373d4f5ec6aa034e24f29f9b40a1575932636256fe1c2007a5a95db515d54f2351db807713e3ab3e81f29a723348b6e0a1cbd158d36a676f3c5da9f85ba3094f7bd70dbc2f824f4640bf6f4b210923f64c061ff99447daa9fab2d10cc8eac73d8cb2a398670bda1eee8234f747aa1650d2657da29ff8ddbb3ab44ca2bf9097bcfa1138391a68482f49b86cf19f345f81916a819ca3b504ecf853840ae4d56599edd4cfe61095c9bd03b69c75921c6f4009d04da38357c226212467928af5885c8aae60b3ee956e7f96046165fcc7196b2667d276980c4f8c51c143685fac6243829f00e7c90e63a59fd993261a1ded0b202e58c4c076be600272a364d229c1c9139b3426271fa5d889eb6522142d589a0420323c1e53559b27e161d9fe67d28ca80855b3debc04c6c906072584ff6c051f6c4e997c74838fb9d157e725d55ef61ab258aac8a18d1042a5cce74833b4e1151d3ecb39d9aa6db8a0dea13bda5854d8196b41c2b61cb0ab2c1d673d280615e84e2311557d97e542a09b359beabbfc494d45b810e82761c3c049487cfc648b7a9bc27c42e68fe89f2e23f3e28e4958e3083356b54fc04d1e5d70fbf034e0db313192aa688bf60defaa81a0889793e68daad33179b924af7ede6fb6f97d6a51b018e3af64dd9aff4879816b728e800f3acd2f2ef99feb4fa6f9860be97b95e9b9efed7ca5d0d3594ff73ae50f64bff6036a92be0c1097e08c24d1525bb1f1047e60946366840bc0c559c0c47716a2c79dfd095fbb35f54a57d0f2822777bc5a6e6783981ce89a55999814a31b83a05ef1f54f99910a78fdb2202088a369fecf5209531f46acb16648c03232b24b9e0245266e3d9d08268a59c394f58acc75b5a47fb5088b5f8b3d5a9602b4d6040a999a29864a860a4cdf84b6c3d26499c6ed6e2f71a74d1a7370a1057a65d25fa7bd34120cce69e954d4f7ed3b510d6c3f6e99fd4d24509bc9ab57929b742609acf035507574b0f619a431dba47ab9b9a61cb8b09f79c694c392ea1bc3271042e2c835aaf211dc2798c58ebbe15fc4b66be58859b631949c78cb0c22b42aba140d28a50dc5c55a8fa56705028dc1c044576a9546c45ecae16666dd4a4c8d28937d66d89d54a5fe386d07c18e924ddf712dd59f4563434b14bc406def999c7e9358ffdba647b9420f4e3191ca553327665ee7f68b0f6525774899f1fc840a49f5de96a5775990a1f9c7caca4e6c55e4af053c36b95a597f5c6a262c44ba364a551f21dc6d275ec05cf7a7b95d24ee44a02627283ed6e3e28202bb5c70d86bc83a7d8f32e2d15be65d53926eb1ac2031b0ff2c860f0ed23dce8ef2dbdcc3d588fade57de8514b067c257800fd300fd1e51f3ad58691b4d0bcbb549600970cdddda5acbbecdcc277e8f01bdf693869a4234b9a6cd216812172d705c8b69a73dc97c31ba0635f8d0811ba7b118b9aa855dc0584a02d2e5941ec1b749750255b3a9bd418ac5117c0c2f4e3b52f4092dc915ecf99af53d2aaddb94ba2d41b3bacf405d47bf7886fd3b5b0c5cc0582700453fb0a906e214cd35247840a12f344939f78e7ca5adc366d90088c01223f66be5110460cbe00f1e84a9128436c299f045500ecfee680d69fe14b27cd3418b273001b43cb65b4daac709bd4b4aea000e3ca8aaf95e8f60fae327734d716aa8d80930aec558bcc424bd2030cbfbd3707de433ba43c6122c014d63e052c08d0118f14980b576591afbc204ba19b80dc5d047fa7f7a3ff92e8df5da75460d85d2282bc0840f9b9f78f043fffcd317206558920c8f5295d520d88779f75436c0171eab692af86fa0ddc7744fe435522cca42fbfd081fea78fd7f6b984222219da97851bcec481d7845ce2f55f1c33bf6ed7517d949e698221c74a21d3728b3748a1f7ef0a3bb1cc917e656b37b2f55bf3061983a21d25889e4ec34a8784f6af12ae3d909eec0d58f730c2ce008d5d5f72eb9427eebd4423c0c8b61a725bc0f9a121b5b3a73c551f71bc72fa0cc90d2a21713052277e2eba3b5c253a8eda809aa671964a7426afdcad8e76005b37d918ab051f27dd13faf625cc0686923c385d7fc1408aec4fb0edd4a9db18c3d1b1023c818597fe145a0be2fc2d1e77be16de7bdd51e1ec88d2b0d859f3a9a1b85d51cbeb90c3961dfdba70952ba444ffaec9c233604976c382678fdadae4a0bae5b971fd85f5c6c6f38a1d56db282ebe3ef698c7e44b47212b48159a00c102e4165aca1e4ba0f781068753f56835cf8eeb97c578a92d0c020c2df5d9d29c532814b7e66c02d5d5ed9201c07843c4d8df519ccebcf0fa05b091b7b60a1884bebc103bae7a71251632517c153f982862cd855b904f70108efc6951b7cac2855c2bdf3a0658552a3f4336f473ca5bd12088fa3becbc8f05c1189d01012faafe0471c262f1af7382ed398134c41ea6a16958a786677efeddc8b77240862b30d07af6ade53dad1adb8d01fac102ae29db97e1d6357926311ee8a712f5b7f23d4353790a988357e13dcc119c5d9eae3d6696cf81ae24748401fa270dc3d6c5280c4403eec3d35125e8a8d3154f84a04d6751e00788a62af714ce12244a61ae16e8779fb231a014c71005fb58df9fb37cd0a916f49fae00ba77641461967b2b493babbf9a9d544d66dea97c3015f2cf04cc93c8dc239557d8503a3824878c788da8f7196781894b402fd8e2d89d30dee8a13eea62bc8bc843193e519dd70627b56a10a09372ca7a609d589c31e755900b0e11033a624200deacd23d58d5a261dcd289b5fec7714cc15907b986fffc9f48ffdc041b6707fe507a3b91d9cd15d74176e6963e2caaf777e0555c0f22c0747b275eadcc03560548278bb0d6ffdf9ed91624299f8f070246267dfc85eb161c05f6cbd9445c2fe0e17e2bf3425050ef35ba3cc0d74a55fe8d73b52feac3fe2106c18b0a8bbf02b207170cc541b61b829e8b958897ec7caab7dc79a17a886b5c2d0b27f69c29f458c6c64e24fc87ed1eeddee1b0ad699ae2fb6f79c664fbd7fa7bc9fe62077c1b5a20289650fb9fb9427790cb786720234980d00a435a097d1b7709e40f0e33b6180f2c56fd3eee3c7ab131772f57afc39e9d735edef9b9ee0d1ab9519fff1e7f6b24f685f8ed0ac01f199585590588babfcf077a6dd39c7b37ed85da08c9a4d42ec6112877cd25e793a398b763075bd44cd6aeb8a6d040612a5c7197da9221a1fad69d837c84b8d08fffecd18799f13383375fad267803dccdc461f53c2f255b9bfa28227f182224abdb06c128548006d3ccb0442d88ee898f13fa88fff7edbced3f26c8ccd568afdb6e481c9af5b21e4e11f79abe4da39c4ccb8961891f5492e5fbf0fb81f8df23f9fb3709714e4fe55b218cd035e6cd0371a5344e4ceba07f3404e20f6a0dfcfd232202345a7bc185cda2331b4e6f38f18db2b1ee94514234d9a4a412911a383a3149400793b7d64e4d511ceec5899d5b7d483185f47ffab1f1ccc61f70165c0f68e842e60eef4014fcb0bcaf6870bb9258804b4a2179b8f372818e90ea2cc5dd208031583ae89fe3e012c818ccc361b26e7a6a67643d47d7a06788f04383c665a7d71e424d22f206a7ddbe0e06169dd0e9c900ac2edb6fd67da36ace681ad3dedaa02b6f7306816e22891715ef946ca29b12a6a2f6a43b1684697740a0ca56261073dc15941cf8cefcd7760ed44d676eb9f6590d52a7a6ee80814fc43593a492d39cc9e6e80e9f85fba34751ab426703d33dc85ec262c751ca69326e6d4104192fd9280a1982f32af1bc0f43201a773374788be3f39d12ec031e11b7008733521a20f15f38e87b0be1ce2394f568bac2b3aef576a8b641267ac81f41506af7bdadb5a75ff18dd1c801b84128f733284e4ab2b7db5601eeb191b98ce5a23107cd0c7a01500f194df7c2627fc52a2b73fc2d955d66e14e6560e88447587054b8ba6dcea50fd3ecfd184388f7c6a960569cd2a4da0be53568e41a72a6e7645e1e6c435ff92804e925857e9f06622170510743db2afde1a329dd0953f27f5344afcde33181b6f010adc49c8710961b92dfa7cd2f55f2b0781808638e209c4c5cf5aaf94166fb1824bdb3c956444aa32379b79743b438972941aa811a527378863190c31bad24304fa9e4059e8afc284b980587683a8f14628b0711709aba9cc5af570870e22e45d3e84beddbcfc382d864324d9eb0409558bd437ca2219ade60228ba6b4b4ad13bc4de71568e492f8ee78f4b8ed1e2228bfb20e17920d8924446efa5e1a4f5c343ea31e9c0db8870fad37e4a1dc86f1618aac9a91a103d4f17bf8baf70a1ee61672b3faca04535b49093a155e38361cf78521dac54b70575ea75915667da5acf9e7ed2a453b015125aad9a8679137e696c4c947beaef0e6e84fab616ef04d8b0549e835aac8ebd9c76dd01dcf1024f2fe320a171f318be32efbda1c7582048bff3ec7196799b5b76d8f97df001e7cf9ab8bd33bd45bcfb73e6ec840bff3abb3979e4d2012ee291e3bca107030f2ad2043f0601ab1ff1be9c7654bca225b14730f6792d315542c73aead0c78bbe4433758363a00dbb3418007195bc1707b0bbb00861909a70cf1d5f3e51ae57bd428e793b071c1bb1240a7e3999ca9e9f57eec805de1c6d99dccf0a345e8c1e26780f32be0f849a3390619a89222be8219617044219a5e20f6c99c2024ace24db1f5b1c10a597fe6583de0d2657ad9024e0c14a2757f0ccda2329a077313a60aa4707da658e6abaed10fe94b078c625cac3c0e75b1be553179c424866f6e8a86e924f6c365abb22f4bd80d0b52d774ad757c231fe5e461f46312f310a37534873ba75162f6febf89aeb0ee1304bcd2f63284d9ed04417df1f9b5785b39b317c565096a7318abb0da0e264e77f2a28b41093569cea1a7b6001e557a9f540a3f26b094a110d0b94687924fd1dda3ab59a3c0138beb014a2ce2a39e3a88d69d98ac567cf394e31205bbfd3a7b406a928adcc6a604f19a30c1b06dc464d514f68029c2c7296a10ad178e9caa7e3202f2b58e3488a643e67b505017df4d11b81647b126653963c701e645cc112bf9015789b4ad71e6eb450e30a957ca0bc1cc935682503a6d51c79a933fc8c11ba37a1ee0941236093081394ad414e3bac384846cb7a72cf9b92e4e102b6fcaa288de03ca052c1aba40282f219f41b43b95d643d2cf0c2c5cfdb704b3208408f3fa3b50332e06d16ef4444bda02edb258ccf0cb8577824c6537389b8c4d0db14aec3299b84ba2165ff4bc4a6b98efe2ea6a38bc84b31f6b3194816b6bf93fa543a2711504cfc41b1c165641e77a718f310967289107bc231444d3c921540aee9b7ac8e3e9aca9b72ec18c266812a69834141bb9c70b4c99d911961e7ad05e7f28085839026f4f780f808fa168b9e236638584209aaecdb0eda555debbf4253825fb0bc3cc63502dc854cbf4341b9fcde7f2faf67070ea4b4b017ff10a8f45052e50d416b58a5303fc6c74556936682952093f31f119ae24bc07e7ddf3a6c2d591a85d96a0fee331cf5ab0ee6e9a30abbd45814d9790cca5fda88f586fa09568205a7ce078d04c46356dc96865a1a15c3cc279794593521988d615582e0c3940a9dc9f37927f0fcdd1aaae0960d36df722dfcfb02ee7ae0485231ae9af86801ce4a7e35f3d3c6b668218668eea9419d2581f1e52a3bab9aa42680e4b8ce2f06a98d7cd92b42ab46410e58d2443064c60e81200b38016aac53148acfc9ba6a9272c8fec5d3e852d0af0eacd018582a007be737edf271901d1ae642f903e319af0ac8eaab754e55de24a56b338ef2fea6a20af7e808ada3c78eff9ab3193f11a4a138078c66531b0053b691b7c939357bf3bd7373e9bb316934e6f00d13a0e488ff57a4a3f68da70e302ac956ab45028908d716a3b98bde9e9444f4a13241afdc42a457cfaf7e4f00be92e45b5864d6785102881d525fcef67c7d7348eb8a0da8e415f6f22cfa9e398cff8780d12af751a08ea5ffb8dfe8e747f2d6b883347f8fc3c7a29b2d9b66a59f3d3a8cb3649456bc206d5e301c822b7be430de4ae6a7ff214d937cef4718477e252fe6bab45aac5d1872ba20a0aa53f171158852e3e1959f2ad3bc7ba5b63cb3622a8f996dc66b5b71cac32dff3c363e1c8ec309d586e5e6e8144894325ea63836d56882ba1553a1c13e153ada13b49d0adc49accecaa10370d5bb43357c8bfb8045d6c4d105b339f76746d297d07ad8f177dad9f23596a6ec75b74f6fd692bc95a29fb3139bb200c550b553a8e371f7cd1b06b33f5e308729eee3f417dd08d3129c9bfab52d32af84e57d117aac2d839422a813d7f68471cd87d322d69c729aeab06aa3f56512d8e11d093bb84ac765670b94740e85e656168a3a6717d3aa9d2d818bcab86abc2f3869f0c563b12b048054d8369f16a08ead9d75ca920c769cc6a7315bbb4094ec817622497ff1865c86224f04f6646f899a13e8da9717133ee6c6bf830c3ab4fa90f328f55d8faf5f445620a9ec07261c74b05d34e11b4ba631f5cc14d5b1d5def056d978ac35a7500be44962c22d25fb878d333f6c13c3c9c5c811c220b83fe976fb2deaa8d980535cbdb565aadcc907ace4f6121fd6075cacbe7ced5bcac5c7cdf1b6f1230ad67771ff749bb994dd91c1f19eec37d33355ecf6ca51b49ca0baa9906de2c4f2dab6704f74d9e1965f9aac5ac4659a5792b1cf6ca60e818e8d23de1a43e95e88c41a995c90ecc0ec22a676548ca6ee6230a153217bda9dabc71c1ccdf6aa967b62d7a8753cb0dc78c835b3df663ce7d700be6d90b55f4037eee03ea2a1a910f2e511c1da3342727af92d5fd7ad83b86fb6d5119d2eb6c9358ac765528273b18d831c370f8c3e626966a13679469b41d4ae427b930049649565a17186a368ea679e37c0fd74c5f55eac3641ca1f2a0c125c37cdd22f12dd3639b7674cca3d0edcef440ee648690a69e96c9018d3c41f19ee6e6ef68dd1fa71c7fa7fd6a99cd04e8e66172e282bcf9245f4a6a8c0d5840b26c57bb6e243b95e9395c79be7bbb75c47571bb83f8fec0de3e0b37c33db2188838ab67a4d388893d58b061aba9f0721ec167f248cb02873e77d59752682733eb3436343aff1a76ae51487accb15b2c6220a157b3538bf8048c8b1834e9ed50a6415ef771dfeca20241815efb838331e59f63fbd2efc3dcf618755b0e8b6d4d0d6441c5dbfd969bc3adf3e1b8bfbf5fd4e212fefb093474ae278e7e9e46eee3231394815e0e962ddc696417a9503d8399310c459f1b1eda2485717544a50418b3174954d5b3c0c30284bd8ec86055be15949821fa22fdf7bf1db0f24ab324ff74b4c9e92b623f8f7ccf1759a534ed63a88a8595530909456e571d3bd3d7c6505b28203ed41b341a5ac67fc4fd82c184ad88bf903cc33adc8d0339008c1f2b8121d908195d2569e4a81f601a0d123f1b215905a717c9d23cb568716b0b7761acb2603fc95d4eb45543e14b4c295836cb48ec97b15f2411d5e1e285dd057e3636def3bc225ad757c23362aeceae3f7e819172297f8073457bf8c4996e52790c0ae5e361b6d563b74efb22c153de1cf75cc075856c86c40ce71bdc9a3211d19654fb457f06c64bd34d5e0cf30ce0b224a22328d74505ef2590199fa8e894d3b285f81384428932b30a644411ee61626db9ca111369c172c6fb3cfd09372b6c884a8e8cdf6c3c8b6c80800a9c42cfd4600bc0817079b61f72312d5cb32ab465a5dd8df1e6f13e8455eea31992ea86041188507e92cc6e7ac90383a25c88741d19fee86760804340439e724b4736e90879cc26e3117b1b96bc78a91e9ee562a0c48012c6f38f0950f8f2797ae61acd7cadbfbda4dd651b4fcf2ba87fab9b751353ad772027847e67d033c4aaaccc05daf4f8a736776bd890c8e123ef3905d055d072426127a717829ea04fd0b62204f25e12d48c57b13a8e7463309c83cc3c6d620413e95dae059ce24692a98291891b102fe314f1352e0fd91499aa48f2e8b444edcdaf736277db2d09f80c98adae794d534de325101097ba05d739bd7cd2899583b67977487a7a6f3e0f13e25682760dfba50295dd0fc82ad3095a76292056a66a8c6cfc802019a73819e0407164aa60b27603e3653a45c93407c691a982c9da0d40902a3d0f683523fa6cffe235e56b3f2f92d4c7f77860437d64e30a09f490a5d7c70f39db4b23c8c5a7f37ad5935b9913e2e755e8dc18477a03ffdb931bea03535e136922b1e514bb0bc97bcc948a79c063e274a61cdd7cf4dc9bc1431de207f08d7cf75c938148886c47e9e988c100232ada72d6928c3530ffd85eb6eb0aeadf4a9d7be23039a88d5eb8aa6707c88b0f5a9067ce15cc62905875cf42859b1ba74c2ddb36dad5c8622c229ddd1e4174f239031037e9a7a4e0a3947d359292c092387804039cad6321936c9a8cdc17d993634817d95c1a5e4bea3bb728e60da7da5ad46f1f1f5986542c84eb55328971250cbd649408bfe9896314693c84d021bc7da0666b257ca0b1cfa811478e5948dfd1703746c30cf117f848b40f01682bbf7f3fc7b5c5c16919a57aeea9e124a45418e148ed721ba7c582ca6d14d560a9c7c71ef32f8e4f9c9b7bc9fb99d9174c45bb238a879c75bbc79fc76704ceba7258af664177211ebfd66e11c8dfd2953b87e01181a17658ed3576d572ae5b42b7df366755637108d4b431dafba62aacddb46efa2bf82d4c48559c9347305823cd5b8324c56c923b13bca18b6e1ba1ad6347ae221035b9a83a5f27b9bc1ba2c65b8aca4d36d644d22381c4baaa8d0c462439652df63e96449b96923e70c15e43254aa89baa549e784beaab4e9061671b648d24efe7b3b5ea49d21ef40eb5e5059612b820e0b89730db20ac5825057eefb25b86cd2792eb3275ccce960f8b10b0bec0020dcc93610bcba5a0acb5e135c67f3978570fdd739a0fa6343b5a43a14d26e4ebbae0ad93553dc7a6695cade9f034fa3b15ebc838b587f78217897327d8124da372bad0143fc0f063d3a02f4548343df13c5240ad4f0e0a6ccf2875f2b7a18a4c90c333aade36b3596af339b287e90f6ec749941718019b0b6dc4ae7ac0b968741d6783ecafec30b8a87e042a6ea9f53630606a1a3c4d6a9bee5aaf1d4a979f41f68c40efb236b0fcb172ba10fde5289ddff7ed50b763c35e5075ecf6449414a15bd606d616024ddbab3454f940a64b958acd85684b40cda3b6c5245b38422d7a3a54a08083271120e65fcacf4b782415c2d21ff034011a120db5783589acc177dc67694864bed5713e4516db58264657a600d2bea9fecce391912439e7b2fc3c3161094e8639b46214edfac6aa178b49550007611456b0a17bee73c1b55cdb1ef155fb7b5d9ed605964c543d286719ca4438f2071480450bc0c1cd44bad920313ecd3f70f6f8d78f2a1c5b7bf2c4b23bffcc05828a5489ea0a4b66e8190eec9120e7381d824cefdf9792495bf7fe1a6ebeef23c6af070b56b5e54cde44b7e507115a8e4f8d1d4197fd2ab7b8795bf701831f1bf0df21b3beddd2f470765a529a23aa8c4a755cb3d898d39031065f6e2bdc9c60894f12d1b79e4f13d23e79502775abfd15d54a42c59c48306ef79fec4ba76b191f4f43733fca00514d6267367a057c42e5578bffff741ffcd0c79201cbc0ce3045baa9f4241fd14809d5f32bc178bc709b6c7949394efce4b93448408059bd4204ed5cd48608d7287e692e5e8488765302fa504ccd65269f541c01086142f4a715b6a1f2fb1bbac3366d91a6900b3750e681f015256201e1173a2e6dce48bb83c114cef2bfff8c564b3836dbb0b59148274c24a041edbbfc4ce336e9eb51391ab30afa1e62d47dc11db58aca8e872fa126d13eba3729681e5cbc4b10e5faf32a7e84b8362d155a7a16f27af5750e5d223e4a004870409f02d4255973875c533f4a78b0795e813334319a7a3a4f36880a86d46f99b76b1814803f3279343814d8f980e5513038ea0f0461d9ad718afa5dfe8554e34711a00621ea67414797fc1898a3979297a8bf04e502e119fcc73353deacb4c6e910ef8ae2826767fdac30b9f4fb26fe93cc1512a0c1c0f055335f1d1026ab425e80edbe137c42759755ccde3a703fa7f8fcffe0eb0f9219bb9d2d571f9219b23711231eb48d6421e3e6cd57e0b1fb99473c415df767618026d58a73cf1f90054c681c31988ba9d4a013e1a1cf8eb9015a32c62d117db16f3e3c7424b52d8f75bd54b99d9ffe024772c10125658e814bd67e8db2075b7f663cbeca7b8b96573eec67ecc241c2c5c7f3c1e837c2685b5e733cb21201712ed0d9be67702c5f56371444fb792f10d8df6cf3b28b55b950f98123055f97c039883102a48760b25efe6c70c94ec7a020b252fe3ef5e5ceed9877973f1d7d17ae1e301dcd44822c72128ebcf149f57163901081c0e5a47a23556d88ebf51fec757f38b87fe6f68cc34bd29bb36fdc77c19e01feb061c8437bba8ff1c1c9cb8fe77d6b0bf9dd933064f2804c4635e6c7f36afa1aad138523e0e8c15d5bdeabcd68ece9fe4c06a4c98df6918dfd657e030838eca2e080443832b0703d44e454e09d0acf0d0df27e43e3f9df0a003f05d7b49102d63849de00803d2527b285d1f4f9f87d2000647663846af838b513824ab2576ec9d8e7100f1745eb3ed4fb4796142245105818d008429ce040c2376fada931a490f225c7297c58f0076a00f88a2f8c422eab67fa75cbfc4ca40be363d91df1f92d49b7bef20114aab86d3fb4c91852e833d73e64c489e44fd2bbe810f1d534e20bd7cf9fb276d0a896f5f3ae506a84d5f2831ed0c9de277079d310440f9cc564430e97a541df9188fe49b9abd8a203561e77022b6dd1ff96ed6aa883aee6f3ee00e132fdbc8c4c4ed23b5e7a1f052a803b2f052106d87bcd8940e7e687cbef6e19a72005b30762d84e37c17fe121a8846dd9325ee8df5e60bd5f30c0d3225306ff6227f06d84218debe3ee16fee70f24a9d0097a4913ac309f619832ded87858522f90ae60a84e01f592455ca38ae13ffcedcf3f14b3868fed29e7c405264d143e6704477c6824aeb2cee72d7cb8a22f56c9922b4552777833fe331cd917635534929f51768dd055ba8ab053eaff83c8265dcae994cf52b99478b471e97ebafad6f13ee52f677925e28c1742cd36baf0e61d85658e080cf5c26b86363a5002a4d535da0407a29ac5b5f8b4d730632f76e0c8bdaaa4873602bf275606813f53a82552aa44eac4bfd1a17d4639dfd3b8189643f464803781640a224b54bb3f0cecc8acca6c7196be52cd47bba012201af5a42e40d19e6f014617aa3f6306d8673ffcf12ecfc3146676103c33d41775b420e199f9a5ccd9e69f56532ad56d2f09da9dea36f59206d65e1277618b9f978836342374875ff278439766893276c298271612655093bf8df19fa8f5bea42e94337b39792813be84f84f6d91a7c22f52a86eb9605871f3d1a975ea41f42895826568bc51c4233e059792c3e9daabd2439c0e343543bef3afec0dada24458e63e369c6e42d14784b4d3d0f1a801d9c1f4d8d9d0f1ef112d1e96f5a188f9be74c55f00b8cc31466bbc07405d72e5f0907bf6f05a29c7c60e0f497f7ab2342f9d14dd82bfd0a7ac63767b27d7cada2f29aa7c7afd3e4a0745bc14863c4e973e39679bb1d016d8fabe7fcc47665810663c078ba646cd126b2824b5f2448f194d765f22bf6116073980a984ee51966eca29ddebdeb045b9d09198af0f4b427180960e4429870cbff7054e9ac0118d663e7d352393243698f55b613d8e00965438fafb4e9f2756e80caf90243a48d2b064ad4d9c443c77e05024cf84a68bbbf69ef0241d7f04fa566cb719ec6c99005a9ee89032eaa23d93f105b0c1f4ef96d83d85998efe6918bec970e158f387015843fcbe7d9fea1e748ed5ca08c06868f6649363d86100074b6865f508af811c94247fd87462fca1b5c35763e21410c705c4b1e07cb081d632943e7c1e3d4f2edc22d698e85ac112592740e03c469a7fa8875be4d92dfdd008549ff60408f9866ec4c6e9128ba031c18285686c5ef6fe31f3ae5dba8b746b7d0ad7b2f7c629fa0312155759620ef37f4bc6c349c6b46087f91fa31a4fe51583f1138c7908a344b937d0c900f058aac9b2dcc12c4e90c093b5630f462fd1a8ba4cd5251a9d91f5982a24bb3f9e8b42a6f1d01401625535d7afd9938fd84ad2701a86c81ad463c49b869012f2c9655a7a22d8a786a2c1748dd295fc289ca0ab2fc0f80e16956048c51de8d5e1720a6b4c2ed0a824b55c7f1bdae0cf278d490f0abdb350c848b88992a9e456793c853bec5d0b3623d693f65e9d12d0af4fc2519e90b5e978d3c9ef0a28649c16f6609169ddcc044bc877e50e9102a04c0570080bc99533890e0c2fee72fc7bd9f1d2ab90d079dec7fb12b43a4a0579c7cd26be8cc968659dec653c3132d026391bd139d9f9efb71baeda2200c77539cacafd6dbc9d3ff142a6940b87212ed03900e936498010f77580b62b52e6e22a2b74dbdf09535fc7e1b2c33d454b61f7fbbe9254b46b58924427e0e36464f0985de1b153adb9ecaf06b007a8dc6c5ab86e7d76c266a428b10ca65faaa1127bfbbb8566f29a697fc3178a3a9938d202ae7480f78dc79fd8eea2d261a56c17d609baf4fd5195443db72a9902abd4f488354b660eb722ceee9cd58ad881485ede5314cf48955a82d44392d8b511dcd5d7a6726b4bcae7825808c704e8a880c892f607543711c43a360c747b486899a22a731940e582c34c6746e476873e5d6ff2463a1ad7a4d266b7bc4a63843701e25d4ba789ec91073fc655f2e08ecbb91f32aeb746a37e1eefa5347ec160912223fcedeee3175728a220d08b2c314cf54569da8cf3f39032f5eb6b275c849b066f0e0ca120c41da2907fdaef2ef627e0d12834cd2756422aff55bd4bb116f5f0dca276489db87550b1e38ed98bdafecd72869bfab0eaf7d114eef5e337bd7c10b9f2c69d6d764bc7906e421edb6ed9c9ff06f58e34bc004901784489a71e00ec1d90b72819d3b55f47922a8ccd7d4c9d4f7f36fa2a196cae1998c99a9d123743b57110d0e3fb0c744bf894287a627230b00a5cce0c0db8add0b690d1862101b07e219f1e4ea5eaf4ce0cc89f65f88f078c974926819cd36804291b8cf62b69056c365ddf717f0864b46f3c7ed7e614af9f295c9fc7fe0eb3e2101412cd38fd9ebf95a7750c7ad60683a26f876e69e33a03ee7887e4e2e6e54dd5d048244aba73607e410c7ec899cd2b7b50d51f75672e90c143c63f575e644b1d6913df6930e21529778b35ec01743d95c099c76f14ed0ee6ba80b127a25697f5fc885cf6f260d299884730fdbe5e7f4b51c270b9699b5dc5f4f8eedbc5fc85d33cd343d455c3daf0300a6dced162ca522b157b3d90c82354a9778ba9445d89ded62704278e52beef9f95e7ddd25aba3afc7e47f3ee878de91ee837acab605771f4f5b72c1afa40b76bb8635310d56a2bb07a99820bf686a34e5c8ccc230c8b4a9b91e46a096dd85e16ecc40e97e19f0959846e621a4b72e5dd38104012da037c10d8c2993a94960c2d60b3bc8d8a09de0ea1e7d2b40b26c2f1446e7bfe41aaaa1878e1da14fee86d9fe51b35c719e1de5215d78868229575f5fa3b849c6fea86a2a04f9acfe106ef670e0459d044fb510424b82d3fa3ed586a052cba5356949103e945cb4da21c0ccb16b6542c2c382ef5a2935a1e9fda1451ad5907f10486f4060afca2aa4aa0aff201a49b403454d7cb4d29802884986baa3ab96280878763b51e197ca4c659d704327dd8a966c10e969ce02af81411f5968e58490de59e730ef83dab89a3a123fec9cfc8af360e27a961345dbcba8f78e322cee41079ea15628b1c382e9f765e17aade169694353d0956d87b0387bf9494f6c3881d58ca9b9558f0bbb18082d4539b747675368823213d496807fcce060c3efaa8b5b5f6abd204ff9edff6c6a1c0584908cf483165a98865e785fd0a96556c27d708bda67b057929d6d4d6913e9d64e90838b92a86addd526a9fc0135d4c162f216c22c0779bf7b0e0086e014258185b8c2ca2ddbc29af6c7bb2f3f39fc5e77680c6e0604467256477245307b8367ea480bec0c23b86a35c937717f30d3dee87a46283e75f5f3f78c74071ea2764f53f66b893f123412be41b12f8efcbfab0f48dbbbdfbba5f899d0a27ba656ab3d4f16532372806f5197b9ee60dc89b69711f88997c8c745e08fc4d9eccef93a7cc31576ea9cd0670e2e017ac84a8b2aff23b3b240e54e27046cd469a25cd2128838e8bb54a218ab7a09e0aa409576d8de1d68c30228151b86ae33a215674cd059defcde2abd498c71fb1a9a2a1319776391cbe97163fa15232e47d7c6508756b25eb81563c12b17a3477eed186bba073571c1e766e54bc79ec58a23b7a7f8d611ff75b081659b59a4486ff4518f571a8123c6545d17b200b75618a7948a703b46f375837b33f3c810b53758ccb5a76b2859709bc23da25cac032c4153fe1f3e1643018b41e733f285adfd6c392ae62d444f98100b6d22b8c3240d21ace2d1f71870eaad62cc139208548d7739920055a703de7bb49818faac984b8874c9dad3e61bd2414f95ea476e43a4f2236a65511b430345e4eefca155816af2bc16229f41cef905677a5e786d64a790bd1b2ed61698b4f92a040fcd5a896a2de9349739d5b6ad2595e028ab0ea570b21ca1c754ce95a6dab084b4a70bf18f2c1953d698770708b1c42def9becdcca4c06f3357205460bfcd901a1a0979c4dab3bebed5bdf4bfb2b7dbc968adfa08879f3cbfc96a285521c4d8fc553eb31dd84afdf382b4f5a86dcb40db0adf644affa4387b996601d657647be5d384801ef5d841da65c3fc065cec94b333d5ad8a03b89db3ec1c4c21232bfa899cc079ff59df4fd78d7216386b88e462fa40c8ba7b4a30e61f0f0fc8cc4b73cca3fa4eda9a84de6444ec58e6e338ec1747fb15ec40afe8643d325e3fd6073017f0855ab0d994ff728fe242112aff087133da467a437f29c96d0f5a9c7d5f3e158a7c9384d10f4900f015dfb1096500586da61f10183b49188971c27e24aa620a564c2128c828653981fc5e9f034e52d9cfe6c6e222d50c0cde28d2206d19f723a42f88524e7b98b9832c45bc4194ee070df3d9081639f5b91a6811e9cd52025d2d259720de8c4529f311111d911e2c0a6bf4d5294e2841b819e5d11b043d4b0844f5d6d4708901197b5804f4756917588b02d97a18616f43e1f88658cfd8a863a01ec49bc3c8c833290876039da4b4f7d48d68bfa6140a6e4c22f6503d5b15a03bde980d07cf2cf6a4c6cff391abbd24d494e7201feac8c3c4668fcf9565a18622682be0884ad162589b06f95c288ed290569cc527e5425e31d2a5bec58b53cd7ef507840a4162e3be4184a3f496f75049f55a3491cf8b1a1ca017699fa910125cf93eeba2bddde17604152f9d368bd8cc334130f94bbc70f88b8ef9178332b48f8a4c38f60c21778c08efaafc4850e0b819e68b84106e6b1fb2c99cecf181dad6aadc3db7ee7a84efe5d0c9d42dfcd1696a2b7d0eab3ebb258768ed961395576d5e84c958ca2112623875b7d998185b5844901b6a1609297410753f91e9a94361cb1617ed19b9f8e272710a1ed0981102a04540872ce7765c9db290be76af87d0efb2b0aa928e85a54be50626b6181b9ba7526a7d45e4ae8aa828d91dd917ad32c319e5a0850abff1c4c8f2d690a0fa46d98c299e91131279ad55fefd96a6031b728589c8df4c3e097568eddf76c40a6cad256d3447942e4b0218958d2363b3c38ce5b6020df4ccfa1ce2fae3892b343aa84251d1ac480f4d218dc481b3d23c49036408269c428eb5c399b8696bc079662b0c143bc562840b41829860738d3ecaa3092aa46b772cbebcf497101da277be91c042174423a6a7538368083044c27453a7469c5b2ca7c35001de8b6ad60d2abc0b3015a1a2aea46b71af2f0509e61201830f9aad4919e75c0e9aebefbf58ebb7605e942c6b210cf9129b434b999f4074a66249975cab3c23e9dfb30db820d7e629bd8d14adfb0c32bb144d2d2fa066ba613c699c469b90ace8e6d38040815ea69e575b1bc4de766023fe3b2b842a1a7f77532539d992f880725cf03767168c21ce1f4698e0cf5888c255a297731c9756795c5cdea96f97e6f28a741e310dd0e841eeef5debeabc71081ae5cc119b4484b5ac841bf61cb3da27b553f1db4968ef64379c46149ae56159243910f9c30b14c9cd1e7196a4d5bf18950333e8c7622a82d9293bb4e615aed431b40d7cb30132fcc8b4fbc68b361599fdadd228fd701ca3f44a8538487150b9a543190867d0c3b91bceedfb0156f4b020500a02125aa8a7766662a41a32fcdd3bb21a58d94fb69470f37f7e43585b0bb5450c0c9da0b88e40df21e3a12e1b11f17e223ef98829854290c5eb9fe265f860c3ec79ebf78a6921dd743daebbaf151922babb4d43fb80164937be03651dad2692c996fb81bd8ef6cc7b697d9dc47b3282a07dccc95014ebd3749bc4fbdeef468de8a5e9653a27464b4fdade2cf8daa1acf0df840266549205902376a65f295018b5aab2637a5362076aff10cedfd0d788b503bd09413b83b476e06510b422d825c62c3870dfa33aa514e4e791f3b64e293f3451900e98c5807c9f844cd57607d89eebbe71a70b85197b206ee6c68f243809488281bd00ee03758334d8d1736c74e7de7c46c1227f22c4273ab16a1f4423211550f8e96b7265af7359478ac550937c86cd2ef4f3cc2cd6618451f9c5e8c01a879223118ff7e499711cdd1f0731b70fdd7b5739cd9897498f716738b038863a50b25f5c6150c27c5536615ebf828578a29d23adcf516f836e14772f93ee6bc694f69a845f91b3bd81333c97c907c8c885822518e06fd035ac09e05a7a3706d62aad3466c923578a5746c79041029f45f99f04d4fbd003bb6805de9a8576002867b3d4d4a6af0197734baadd2ea3e903aa492167acc9259f227f84116e45d529279031316f794cd529db374cb3e59917da750ead0f3b8e9b68de0436595ec1a214ff3d37dafcf1789c65998c049722c5a4d95db7065f97b69a7e5dd57ad1e6ab7f8af21d4d5f5dc042aee323187c7e4f1d82ce11472fbdb1e2f978027dbd16940dbdff59a1eca22147fc79cf57a163a8e877d8723423e27e6c6eb13fd7f68a5ecd9902e38d0b9e6866cb01c3bf9ab89bf3160ad2dff4e9bace58f929a8676e509a2bdaf6ff9fc27a8b78971447af602f70e669ac636e62d715b541017ae194964ae5c2dd7157a8572f2417c9b89af50bb9370e87986bdf96b52e2ad0469dd3db86bea32df576404da3f3c1f5a085f7be512b24e0045e11393be74f98d2660cd5c94589360f152af1cd8a46e4320d1e885204200994515879d601eaaac3fe8c518bbad5b893b481fa43261a3cf89e14b9e3b8a928055b8b53ceb6b5e86bbb20c76ae3d9cdd002078952ecd4b89acfc3465320d6c75a7cf815dde49c3cab279fe8624f8253f98cee7519998059f6d514bac27adba9fa7b99ea998a6ee41b3631b906c532d7be0fac9f2ed29c31c99e9f30edd132f8df2650e7aaa162d21e2c1e4e2e9ea81c6c085394f7b9d706adbf5d3f99a0147e9ac7e4070624bc6add5b9f21eea422ecc48ae550b27ff94322d174b4e4ece165ba3c02b75775a746ebd046b870be555d1b636acf23b9ba4a5d7fcc7c297fb6c17356de085ba43c28208d1aef0af1488cbf65337715646a7f23381f54024f8bb9bfe387c422362ce92af0e2e2de5ac1a84f75137cd7c66ea4052981ce51a173afa843b8e7dae610622f50c51756e567645d189fdf3a5fe0fafe1d2c56b11d531d62679f10c61df024814dfd95524789ccb24469ce1280760a9bd26fc0754a477b498fee0a81c53ff1cb26ecb5f33ddc867d0fd12a41c787a5c5919e0f25cbf221d67be6a12a4b05adf4dd869befa1ea453723a4dde1e3796f2aeb3418d33208b9e8923bbd6a925ae94504a98c48b7d6127a84cc4141a5161136bc54d0dc5069af5416d383a8d12783016990d706720707f85e8b4aa178a726328e9d5b003468caf3b8cce020dae4c7196cea937cd1170f3a4049db8906257e6808ea8e0cf16051474aa6d5db0df643121c991cbfa7c0291f5591b572f3e8fe36df0a72cb4b6d9e69db7f32a1b5fa21f30a99e7742c2ccb4a1c850e19cea7e11c394c178d5055d15c0b490cd15980b97082a1026438dfdf962f14b49edc5654f3ab2a972dbbd0125e324691b711cc37b9de1445ae644f02e4a618a70248b3232afbb332b58508b7068734f523b6cf7a49211e2be59f1cf3bb2ca8b77f891d76fd3fdd820ff9193a7a5bf067e39d55814119920b19a3a8fdf5434fcd901b8565257e60e404ee02617f3d3565bfcd90f0f16a3538d20c002a7ca78580f645b75514ea4bb5076de34a1a8e05657a89830f40db422bf921d38aa287489a3250d922ec8e620ab0414d48cafa09e28f54a24ba82ba30d37174ef53ab0249f3759cf608797cc14c1ff88be8ab0580b8639eb8fccbe8d4eb298cdd5c6bb4d6473024af389685110280d6b3a39d3395132b120482b223f1040bef91ba9a51f9fa287a49ba5a13fd591f6bd88d3743d68a7b9300a984e0790aba471a66ffec552c23ca2fa118d6a5b987910706cbdd69a486b7bef9da44c291e06fc063b06313186d8f7c3c418d42cc5c499c730f39eb731a9598a7df8b11e91490d8d09bc813071e63dec391613675ecff33c94f0610fbbd94c883d6ce6f5d82eb4338fc77e3e3fdf6d5e4e9d836a937312a15ce0d7796b42a75befe89cec797cd338f43c7e3d3c1ff2bc4b64eaacef1199d42cf57c90c8d43dbdc5d455624f55cf5550f3fc27edecdbce46a82f7fe622942acefc9bc6d7ff0c0afd7e2ace5c54caf23df84da38b09161969e8c811f5f36a967c9e3ea55f7f897ecd51a7599b4f4599a37f934e3427f4d3c9c70728eba7be8f8f9028b77ca65396a8a5c71f91871db25ece66f5f4fc4d6e053d8f413e7f9b4eb29757b336e98ea74e198c424bf5652293ecd52c057d159964a20cba62da216ae95148ac0a9fc7f06fb24d28cebc6f1a6515cff3c823ce3c51290b4379393983d223fd1ee9f37cd0579149cd6c845a79ceaf6d96ea07894c136ad6dae480ac07e5e5666dbe8fe5599b50558c21776380bd3883127bd8c744263533a5fa24f0584528de5698383ef85085c33139c9317c2cf561e26c89be12cfc77efe9134421ee7135c94d8628b34c418b05411479f8a33a5faf4617f9b57777a5ea278ac17b35ed4accdf7aceefc9b0775a78735e57856334bd2e64472f3363c6b722a7cc970b3a6356b73fe043cdea69607d4e452480bca44dff305439995eefa7759647fdf161b0c7b4e203ae1ad714ddabf67ffd30fdcb3b945ee98bbb9bbe7c82f94f6b21074a3adf0e94d2ef2e9799ed771e9ba07ddbdfb29eeaed5f99c1eceb1621bd778e6bc5c18267415f8caddf89c2012286bfce0d75b1d7716ecba06251465a2972ebf2392329162cfe3b96e0c24047ad51b912bff25b6d0f7babeeff55d650c14bfd7ab07cc049e87895866507a847d8f30d1a98e3cefe46316d86b01c76623dfc76c8f12b6e4238fa885069e11f672f45eeffa91d9c8f779ef1788e27e1df0142d6575326d3623231aedffc5535cd77b52dcaf0396a222287a9ec8ffe01b0aca2370ceb682f2211441d99c70b6d4bd7f27fe84e2d177bd7bcfe36ce9fbee3fb1136750bed777e26ca96302bffb9ec7506acddad6ace1a6d3cc9a35cb238fa0e5f1850b5fce3557de239226614888898a614191b34979141027e02c9146e825411b13fe98f902ce0e428408792e4fc1c9f2469d2ac8d00a3206196974e9fe66f7c7f31596a5e5237b240a595a0d4ac1acae7a66387966e5b1362734ab2bf975df045dcaf3bcc5988d62939a6058c3d8e7dff74d30ac611873a344886be8c8a51131024274a402b18542624262f2f2e87a8c6c7f934878a40271a344488c687e3c5fa50dbdfcbe3b12abc2fa0eecb67d31900868439a529425b3d6555859ddf7816f5b625465456330269ecb23ea9ec2604cbaeffbe6ac9d6d09cdf57d0814ab955e61dda615c6e4fbe073a254ad8dbec21ac6c21a86b1ef0b6b18c65c9fb4739c9ddd765fbbbb7bceecce53745dd775b3737767263289a6cfe95ee7eeecd2dd6b6766767707634176a89c6efb6e1d13cda75fdfc9cc36afbbdfbbe77ddff7cd2c14fa73b9ac9cd057adeefef96466ee84be3dcf33a27d9e47f43d337722d3917ddeed664fe8e3c3fc7d9e6ce3fbf9ece705d5cfab554be8d03c2be4791e1da5363e77f7aeebdc3bae1a92a9999e85c215d84c347b78320fbdea6ee544ea935851bcd9f9fc1f9d4fcff33c22666666cff33c8fdff3c0392de3d073cff33c9b91e7defff03acf3dac28d2ea63a2d9c373cf9bdecf6fafba572d71b7799eb7867d8ee7795ef53c4fc9ddf0bcce465d22129d7be7eedea921474ee75e97eb72eee5d49023a7f39c1a72e47877c7ebbcceddddbdf3ee4cfa72a7b6ad7aec2a3933cac509b5867b97f32ea7061b723af7ba5c97732fa7061b723acfa9c1861cefeef8634de66e29bdf33ed0f5a2151663201893ee8576b88e3aa52831295a563c55575655c5b2b4d0482c8915e4f323036b4ce94a46c124546df3925268e41ab906284868c7acc7078ba1c059ce63636267cd28a50965a5d34be2244e268331f15e36c4c34b7229f06f422e3f90ee8582e72098211e5d7dd14a5f3c916a1f4d79db73b7aa575de5790ece32b14e43d2e4c7608d85c5a4f301c164566214b22614d4cccd35726b4b6e493bb8de9a503cb69f62ed641b06eba86e2385a6d7f41a1e3c66104827336a424da85966464da8324ab3165454b7fcc5a5eda6bae53797f65475cb5e5cda54d52d63e0d2aea2bae52e2eedaaea96ad2e6d2baa5be6e2d2bea2bae52d2e6d2caa5bd6e2d2cea2bae52c2e6d2daa5bc6e2d2dea2bae52b2e6d2eacb8b4adaa5baebab4bba86eb98a4b1b03d52d535dda5e54b73c7569bfa96ed9cda5fd4575cb545cda6054b77c814b3b8cea96a7b8b4afaa5b96bab4c5a86e33b8b4c7a86e31b8b4c9a86e2fb8b4e154b74a2eed32aadb2497b619d56dd2a57d46756bc1a58d55ddda2eed0c54b74897361ad5edd1a5ad81ea16c9a59d46757be4d2de40755bc1a5cd81ea96824b5b8dead6c8a59d55ddc62eed35aa5bd8a5cd46c7e90ed4366ad835f937effa34d28fa113dbd857fe38f2a3714d5862608241022f5c89800b10b0f28016aa5071000b2ba830e5968294063060010a4800020e8082010a70020106608200a204000a00964a20610425114200e183271e74e08483264c36d060bc4b32c0e0022549922cb0211d2139520105468cbabbbbf316a28798b28d36ba8d968ab9bfd79d06f6647ef77d84950662281379defcbee979a02cc2b48e91684bb848ca2ff2dde9b74adfb93fb826ff06263523c9bc2542cf13c3252c9b4598d6305b9df0f6dd298e725ab594cdb2a54b9fddec9cbae1b9d7759f473f57d7d53bdfc117ece592b4a63d5c84f2e7cd8a48dd6354bee47c5a292c84d5a758aca7613c62b33b9f863c3ddf13fa589f9e1ff1c7072802a09f20a2202021219a50d08e1db51d42329904b21d43434386643c7810e131349b15cd78f4e831418f990f1f457cf480000223087cfcf861e40704ff14fc0f6b2bb02f8a47441b410448221089888e88220002040908519020b620408408b14048101a2d8926a4564b52a349208112096a43865c304402cfc31e17ea2194ef44ba6ebe5b90c890a20c8a883c4d2075e70445628a4c51640228a30b1815f912ca77235d47c59d6f04340a75a0c0df29303255010554472aa802c991aa232456201d5d6143c2c2025b164916689124690b2549b8b8408915061774910106185892811777c99bf17ea1c108c6061a84c16483ab264cc4e0a0c9184e3820a30327703ce8a08c271e98f1c1933340f8002b041032204208682889a0811194d22061840d94400207964a5003004b595000b04600a0b0112500710410458e0902e8c0004c6883000370e304026815e084370c5000385030c09c03a0400701078823010890430109f0c00214b0c58005ccd10006d491d2003a529062e796c207a6dcea50610adf5941051c0b2bc8e0001666a0e2001aaa50c9d242951a1ed082162b0fd802012b4e2e40c08608b870c395087079e14a1709bce0050609e0c004430e31306189e1cb9d4f9bb0e8806bda41061c981964e0818619c264a1414c0d59a0b4d4d0c3162d639cb690b1c1a9cc0d36f8c0e506335db8fce0a54b140e5e80c80187209e7210e2cbd3103a7c39b3830e4480d9010d0f6072617828424c1823a0c41cd103549a313da82133660265c820e1439935667c48e207331488faa1024044b1090208258408c2024308b1c49921da107186093444349143e34411b9278c28028a238c88224de50976e823604de6953db8b0af144770cb59344111232314547004c91192cd82a4244a2ec020832577d46003264d3870d281074f3e00210411944620a18425004009401401983000029c500003a07000042440010b604003a4a4709ba2c20a2c38804a95161e6005022e44e0ca0b12808129062c4d8d6b197a86a6a1b3740dada5b7b453dbd0373497eed25e1a87cea19ffa4bebd03b3498e6a1c3b49886ea1e7a4c93e932ed439be91f3aaa81e8205a881ea2cf34118da6735d441bd147749a58db400748e5f3db7e5df03ba5ff7bf01381aed755a8dc29ddbbc0fefe16865ba1fc39e9eb6fe1ed34d7fbee4b6cc1656f54ae07de1c67b3d96c369b4d4a29a59457fe7dd3a960a482d17c158c5430f2e20ca83be4f294196c5ccae35364bfdedfacb838658a3f089dc856faca96b31bec9fe24dca7ee3ae053333b333b3333333773a5871d74d766766eebae7ae73f7ced9d9b99b13092396396d8eff9c57d8b123478e159e2a030e381f04255127250fa919d58f35c5c645b174834428aba494a449299e73cea9a933da14c599a2443690352997b8a8c2284a92f644d82f9334d9a0d1cb967064514654196ba8c018e2f6b84cf585d4a53c332597f7f425fffb66dfd366cd639a3f452699d734be8d041ea9c87493f9df6cddc86307fe1229edecfb28b3e67dd3e8b2b34f6c81041e95442627de38e37f5d89b3251c55c3429b20fff54bf3ebf357f92f91a9aac55907dff77f4fc599d2eb674bae7fbdabc78631f95cbf444a291ceed266ee1903c5f073d92bb3e671d67cba220c2eb25c0f4a1e71185b9491483d4e0e430b2fcd9def69bdfc4a61dfd4afc6c5a57e98c8c4d474a52a8a94ad2b27597c05fb259e87f53ccf7be21253d087df34de786be61f7b1ea59db9381b413eeca1f407f7d6746e3fe801d9858aa83454fcd0c595623b95e924ae1cc2ef6f2bb6e02e1839a693cc4ef2b054124d029f3c37d9fd6e61d79bb027733a7d2394ba231df71ae7b3ace5f4cefbc029394059baba653d20112e92df31618532d1cda9cbf61dea896aa8eb346957234e727d4f100c4399ec1f8b6fe7248df62f9365792e97cb45eb64e2ca2a9db0b0b0b01a8b7e7d02c13094b9aa8bbe948934f4f2a97c1e6b2f264549ffc65b208c8a4d66ee36f5584fd3794a79c8befc59a59bef6f9c45c5f924aba4d4d02f99435686269c35d9535de22cf62c4536e2a409e34002512130e8a78707f6469c247b17dd41bbbf4929100c4399ec9f8a4de49589b3cdcb29ec2c4993bf43149508c127e992469c249b8986aae20a893723d7f5af9732834420d187b3c450bcc9c498787b176751795d4fad1117b9c4998b612eb1c9bc3723f7c65946f6d64d5cf9df7472dd1b67dd8c48ad6bc4d7ec90426d384141444e6611071c4f23953858a08ed448679d39b8913a9809e046da51255181a7917a5a4f1880a30b2a46262c3ed6185922c122d4441d4ae046ea22838e0dcc31d217951719a81a29f522aa0aa79156aa3590801a29ac8a306f9c461a0be3ccd59b3284c88d3484b2c269a43d555a5983971bda8cd4a74a2b6f0033d566a43f55daf6a2c50a6aa440555a2639068e54165b231316a6630c183a46352278995822c1c27696787a625433457653278bab910a0505350b0d6141868badb1a9b1b49c5274de2a7ffe94190265a2e99dc8d414b03343d588e5cb1a418944ca0b8437f082b3366b73fe1499769041c3184ea38bb44e62ea08ac91ce9601ea8ca7715a1e5b76179f349ff2146fde688db4e1ecf0343a9189026a6434b49863cdc85ea8c1658db4ab9de53034f084d548bdda5926b6620b17592396971458d3ca664b1dcf160b6c8d1dd8d9231ba6781afdfb0ec8a00b041f9c48af07c16f4e127611f9a078035d6e6f4d13c6840a757710743d88f4025dfcb2409dc4254e9d51c575f166b3048d3450c1e1264c8479b1dcef13dfd288e6cb3a21e850d0f1191599e01675443ca1cb433e095c354a8309e1711ba4c72d901fb7444111ec1087ecec7dfcf80181f511410f2033213c6a6e8786b89515b9dd51c4ad9091ea3688e5d1e74a96cc9a5ba0fb592512897c7aa4bafd71eb73ddf6b80def74cb93d434a9b36c01172555b754092f91ed16bc605a2592e6d6ddce25d52de0a20d24136fe2512d0e40f75707b5031813ff396b375b22bcd96c4be4b741a844d6a407b127e107defd810f08402108892053e2e1a30704ffc3462012050122a4469380c890a22213185160a40224478e6c481624495282c10519dc25e3061a30e1a089130f3a7802c207212889304209242c410140000410c504020ce0040314a08b1214aaad8b94038049c182ae262500cc6d0164a634a08c0af24b8187156a2b619ab48069720aacc9df166d6156a86efb884b59a86edb884b1d50dd76119752a96e3b776995eab6d15cda4275db445cfa80eab6cf5c6aa5baed212e854075db425cea4275db415c1a81eab681b8f44a75db5197be50ddf60f974aa0ba6d3397c250ddb60f973255b75de6d218aadb26732996eab6c75cda54dd760f9736aeba6da84b5b86eab6c55cda3354b71de6d2a6a1ba6d1e2eed2cd56d83b9b46ba86e7b874b5b4b75db3a5cda5baadbfe72693b55b7fd7469db50dd760e97f60dd56de3706973a96edbcba5dda5baed2e97b697eab6b95cda3854b77dc3a59d4375db365cda4fd56d3b5dda5faadbde7269eb50ddb6964b7b87eab66bb8b4c154b79de5d2e6a1ba6d1a2eed30d56dcf70698ba96e5b864b1baaba6ddca5dd4375cb772eed31d52dd7716993a96ef903977699ea96ed5cda3e54b74cc7a56da6bae53a97f60fd52dcf71694755b7bc75690351ddb2072eed20aa5b96e3d216a2bae5382eed21aa5ba673699fa96e79cea54d4475cb705cda68aa5b7ee3d2ce55b7ac75691751ddb21b97b611d52db771691f51dd72072eed34d52dcbb9b4d554b71ce7d29e4075cb6c5cda4854b7bcc6a5bda6bae5ac4b3b89ea96d5b8b42950dd32072eed0a54b7bc814b9b4d75cb695cda4a54b7ac814bdb02d52da371692f51dd72062eed36d52d635dda4c54b77cc6a5dd4475cb665cda4e54b75cc6a5fd4475cb702e6d28aa5b26e3d28ea2bae5312e6d29aa5b16e3d296aa6ef9ead29ea2bae5302eed0b54b70cc6a51d51964a18810a19618a4c0385301207ccc1085c94c025acac586a49c90acb8c0fe8a787ddfaf77137fbfddc7d7252c7493ccfef7152ecf93f4e82d5245a39097c7e588c87cebff99ddd9dde9ddf9dae3befbcd13b937c7ebe9c9c14fefc0ae3a4eee7f78909bfefc702f9d820a11db2211eb31e3e20f8c145f6878be48716c8060971917c98ddc145f2ab95d9211e5c24df6567b6870f2e82808b7e70513847e8a325046f70ef7c6e3e746df5d33365403f3d56640f40a1191158055cffd9e38621c82008be3b7844d63e6ce3e9b072b281067707ef6024215c936f346b42180909c968225da6f20682408420d8b91e04c5255cc27ea3b9c112ab1c6067c8807e7abeef6fb0ef6f3c975fc9f79c844e9077f0e922f2db0235e9a16fc810280c7f5ad18822b04cb907082491be9f3d74a875228f1c4ff4ef867bcfa7dff7cdceeb3a6f4eb71fd0f7c942300462d9114a248df6830c30743a5dd7d3764f2783a083a1ac7560083e4f36e19ca1ec3c91e6855606e8b5e7303dd91e967a267c61044366c92c999925b364e6efe9f1f1f9f9010262212166e6f7616666c92c9965b62b0b7213e4e60aefce095f96b649abc08856011f3d61da74226936224fe4d195bec2e16433f7a4311294ae4d6f9c6d2d1c15a564b9137410fcc0cfddfd7ae715d40ae378c3f7e5ba9e573d8f525707e5d2939dfce4d7e5acec48a4be0265cf798393389136f4ec2b27b0cec2ae14abb4b4aa566b85a083134b6ba2f181adf9665e4d2bf06fd3ca65acca772b086a69b95c1de875567ee12227a943c3d045dac0a38cc2418eb9f3a5d60eac500d23358e6bf3d34469219bbaa184e2ee88229c5ef0d1f7f367183c31506792c1488d9bb54e72a58b4c99a881099b6df9ba6ed7755d57ab7ce224d95ab62f5b29054b279836ff4a27e9ac2e327f5291c4c69dbce5e562d157f24a369cc6126d17e1f7b7bee24ec6401cce09c411e1fe65681cae03c12f8cf5f490c964412ebfd86f8f6060da1ce2a32b9236e9874a12063e4ac2b4f936499b4fc5bebaca5aea22f33bf1939fccc9237927903b5f5ec934241288c5664a4581bbb2ea4e09e7ce29dddcf99fd7754f9ba58c755d8fd2446aad247cd44eb491b469158b6959595ddd97e5d13949def93fd2ba6e8f9ab07b29a5c4698562ccb0e6b66d20b8288876828fca740f4c9bdf4e5dc79d6dc4937438a14c82651a4e5ac349f226739cd473e7576935919eb8487e895ae2f670e7d49a35d87d59394eaab0b55aab2b623271678e8be6b3010317c544ea37e600e74f2d31c29bcce5e60cf3ebb84eebce032ef4c8c3febeaf6777cb29a79c5e85334ff7e979288fe6f7ed5726692e0508ca99c691c031c8e5a90e7820ce9bb0839801e68d335371d87ce1431d5f48b065482e6808301b000347ca0d38fe812b26cd89ef14bc9812238e1c3b5e9cb1f3459d26a82b78b89ac30cac2b92703a6850307903079c115b561c78c2ebd47e38a18a34e83c3103163f40f91cb20f813a1abaaeebba2ba400e38501e99b31a8cc5c5dd7652a33767290800b194d703953070b0d0c31856f8121c7240386902cd8042142881c5f1c088c1a0f12c82185a03d5138b2b429734689ab37ee8120564c2068524b1a566feea06163ab8c91d11b2a36535084e0652a3650c83ca1cb546cd0b02923ed0ce94172d18137f241f9619b3754312e6f5c5bc891f2b6bc19837e3d2e538959e2d2cb5462d208d1c1853b45a46933831923d6c861f485c75185c5962f6e8ce12285865167bbec4ebb42cb04be2d5f842133a9c4784165460dd7130d5da6d222cc7d5da6d202897b7ba32e0ca3967d6c847e792a8e5518278b2f0edbcae16a035dd6b0628d71d28983c5957d5371a6be08c3e9727dd3f5bee9d20f7ceec1e3846f078931263227c021ecdb5dec56e13bb7fb5825e2c19e4c97074d2d806fe5bb9ee73df1264d37d9c47bffe941d3ad12abdd7f6114c19dc738893b30dbdd93bedb2332a4e63fad4c3e99dfc4e7ac83babcce05ba3b0cfcacf5afeb5ca0f884ef5cff2a3ca5bb4feb60cba9efbf8f69a44d63bf27ce963cef9bc6177fb5209bf0065e998f2542975113e1105c1c2da5a858d162bab245e3d0927ac24a85b3a54fc9c927ce48e0d1d634468d4c3d766ed6feb6992e428544514d59dd7e6e28cf93603a2bd75abdb50667e6de9a4e63cdb937994576612c293d89bcac89227a0a2594952c2325a3726fa454d59a36b989c4e3d8df663a89ac52a68bf4f3982ed233694796813374fb659544aa61f5d41c3797cdcdb1e6c471a9141d32edb3c7749996c2658143ceed3702967ca8040c1d28a95388460000002011400083160000200c0a070422911c04e248177d0714000f65783a64523215082391381848510c84530c432110c22086102619320ca2191b5000fe119b2f79ec20e98583a718e11691fa39be5f84663d1e7d5568c5c2e90c46c61fc91f537bfc407132d6e8571cb37ea078d81a85a8fe08d532b182b5998d69013d9c71789771c5122b9c17527f21b526f5b4e6b465ac4ddf395a537c3198b9296b86b57126b6c05b3df56f9fd74c84817f9900714e928259802658f5a4ff6f9541ad2b84f154e13037523a695e9f2754a5deec90a13f335a901a3be75bd0f54a724f810c69536d4d04212658b9171312f131e35024d4432e96ee8ad01704a843c4b94703ab55e0588fa1e8a38756627c2b9605bb7c5a310961b7cc6c6e78494891b7c06226f1df093469c07ccec0b16e634ce30f42f44c659e1ddcde70e4e3946f8b495d6ca37752f85236b222e838da1db0239b2390acde82ba8f431446d84acb558c7d2889d50fa64209075818a604537fd45d2ebd4fb748845fe54049309847ada679d79a6003ddfe933419ef93dae1aa41667381343252e3fb92ce76e1491e6b7bacc8b7393f999f6259c70412ffe03d4f3515225a586a51d6feedcf6c36189bee722c5839181998b5a1102b6e411e603f7f0e7af2cdada2827c62e90268448bf44887012665473272323d353ad65e207044bff3b76984da6a5584a625ec990dad613f477212189e01be8c37d06c80662b6d2ae4e82c990bd296c850da2f6ebd3ee6b3229660410843389ce78222091d201fcbce0ae0a4e77d2e330c15cbf9babef1e4c62485c2818e097c08ae0b90b40c5a02d552c262f557b55b37ad1f6289b77dcc81ec3d8c4dabfe0870de6b9757b0a7cf1ad492d8001ea9ce71494afe960758a8ec0a4d180334b21db9e049b1be4dac63e01bac7ad1c96e2154ca89d4d63d0775dad7ea88266ddd9921ff03235860c870cf35dc2553f666e9f5a1a359c544021f178fb55e4fb2af9a357fb5049bfd32d771df33cf334f0fed50f2e765404037058271620e6312754c01d375a736cb9e2d193ea3fb8e1776a82a5f2f9bc248828593022cb73661060810d2b1ed123fe001af3340a59303ba729ce3c9ca6ae97c74964e9d87fbcdeedaf805999ba5a38d6a3507d9a0d81f747e7a67b1cb4309e6bd7709f4b39176940d24ef7bb9c43cc8c240fcab1be31190c652caecbd84b3ef5f8c071c7f4338422e878481383f05dc987019d0232ac0856628df9a39c756dfa50b696367b4da19a9c14636c2d64af06ef86828383b3810c10601af19e6e9e9a52e632edd6502a897339fe73e4ff7f794598e517d9a8980d3bbf67959b26054563f2c0a90fd2e6caba6eeac97811db36c4df002c306c30c50868753b90adf445a62d87c71b5df90056e6506f3fa22b9642237c7920c04f2ad66a1dd70e87efc0e440b2b37748938e61686ebcf81f62ec716c6a449420785d09109fcab8211d1932523a47fb19207ff60e606f1f0ab329a71b13a23da45c5472f9a860dc1320e71daa154cae3e1ed0c26f0cb99c080e91e746fa3f99c4781d35c713a4b8270a16b712e3424e1e4ac969caf2951c96bac26d3189f5db3db9b95d41d4b0d9c465954e5a5a369035256e239b3153a57238a030dd19885b3501f60d45fa02b4cf21e2c4079808dbb9515fd47f4894987c633d1ad70c06862f42decc13071533f2c63a1c685854cfd38493f6bc9e5349b871eedb7e815f5e1520a3f31f6edce2280bc18f5922a8a170b152a5624664c55f1bd2a8c718590d154b03d03371f2f34837e1a926e954fb68cdeddc55ad52aea3d67062c13655f44d7978a1483347967030a30163b86a010ec9a4da939b3b4cf66d5ccd293de65caf3be3f1e2343a37fe7fdf05125815cac8b55ce2a431633010d481c5df059d2be3de0718ec276d215b6321612428f87c7c4617cf6b56222519974dfbee97734e52b1a3890401833e45f2f9fe06046cf8b81ddf2be892545fb65119d7887e95a257dc4ea2640d781c59ffa767c1e10be6fe4da8f33798c84612ffcfe3548d501d4bf576bbdefdbf43fe1f77dd4c718c8f755b895c6365ed1dbad8381a20db3ce8325f4787dae2bd8298b08eeeb50c4b25ad4e44e2d97f771f81680b6ff3c468f26eb627d0fba81bf34dff129a0facfccf1b71d8bf35acc5a75775c4a98692999208fb8f27e6ac4337016a171b90f9466e4f8e9ff72e6f9e3907eb2f29c5b817f8c01a5e11bfd238ffda9aaf282e86f70e87f6e79fb036d285b5403785e019e3e9f019ece2a6c0e59f8bb2016025be3ee1e29940560bead25b3b381d3919cdd91103a32f03a6a3546e8bcd9115f960cbfe89ac14a099df3f3e7f5f3a005f4808a3d26d2c1cdb5f0fe3a6122687a55a1293b2d72b80ba563dd0b9bbd481d32572cff070b09c5adb6e4aa242db23c49688e19cf0c895b090a37c160276410ed5723ad5afa835b9f3d1eb8a3df8691871fe4795b9968dbbb4decd698d8726e398ddb84634e415354c3b88d2d3459d23bf03de538685e1807535aaf341b2fb70919a90adfd36d82e1a88a089da0996d824e814511a080054bb6b2d4ac78215e90654433bbb1b1fe4ee9c2064ade943968e0d4cb630296560a2c4fca83eab3560828230277eac1d61224ac55eee676f298149e6772b53266bf0d6b47359bd004df6a2c534fccafec66bb18a65988d6ac84f566e2a40121162c11310c0cdfdd645f69d3c7701947a82116e12a8a94ffb363bf0e9b30fef63c3acdd4615e567fc8c6939fd8e3950f0fcb341080306317c8d97d6a716da352a5de4ff3794eaac4a0343a42fd5db26c349bcd80bd0124260d57952ddad545980fea828cc28f0265267960d8f89ae3bcde8151e1812e8c5510a2c4fd21aecd6e6dd6234482f83a5c1c0cd7ba0f6d7a506b8a4ce3a609b4628c9e8a2383943995df99fef146ce42a104db1061e4677dcda006328ee7bc2771d29ece5f8971c56300fdf1d3242868c845974b551ff2151a8cb280f0cc2075b8dc2d8a5806c370d115a20a9c546f3e9d998b7c90fe3306f558c6454d207ae51b0a514e579f05553c259a83217f068c3997434c6a307195a4ec17f5dcf04f137ce10297df7114f4bfbea3baf0b8f25042b84670a94d90bce6dafec1318c481d7d25e4b155181af2aab2b8ffb1f4551544d5fa5e16c8141d30cb5fb5a9dd00fab5f9bb37bc658009b62bdc7b0bfaf34b4a4e8fe239ead0968fab92a73050ab64d521b0e0a4656ec944bb35138a1a3e33f369f70980feb26c69a124c407824ebc035965d114ef6258d81175d3ba17756db5d69e5a0b427f039c7640f8541b8e12123d012837a8ad7e6955bc2bc56bc5826a4538bdbeb66114e104cdb134b3e0e15d7f58978b85f5c5d556515b54b7f52c67b338e3ae502e93c3257c0babe0b1ddd8e2bf86fe995403c4d8de3a876b92a8821afe47f812138cf3252ec9be34b3e0a6e07f48f6d1b881316c97b81dab215dacac75b80e40552c586dd1f2ef997adccf62932415d645de4ae27ee25beddad8a34e707de5948c2d559fd4b974a0644da4b64b54da45f6288aac52d9704c38cd364e5a46a25252cba012a1c8c4fae605165e241df31d11be60f7f0d71e3c981f2298dde1ae60495fb5b2165a7580d8f3b32f35a587e4034709081a38ce88be45f34b31dd85232b2b3059b10b22f9c2c50468882d0ae025615cc473d4a14a61076380000701b35e8285fa602dea80850502bef6ae6535645d258bae7d3e269941d8126a813bd24bac76d018d041a6b7258413a49f6b8a6c3611da3c7547a575a2825942539373cf188d96a5e0852e9db4acf01b52c2c29ced8f9f71bd360416c4fdfa9d4b3c152d0fb220e2b12f1bc376a197a4093fd558d2adc3e839fd6050f637276a83d7758df9a3b784cf2492ed6b2eea56d769ecf287db1c2e9a0f453c65c746985501fd6ce3498275c2bd57d2aa3ed12517af954593c6169b794c812c29515866aa7465b4569bdf04a80da439d6e9f6ba7a21edaf63a7130b0474ad4a822d850f8d1553549038f049aec7ad9245b456e8abf8c9eed2c716794a016348594e0fd48f3bbfcfe84bf82f65e1503cecb947d8cc1654278ffa7237b67d4aa97853d04bc9a736629e693d794f6e43711d02220c05c2dcd5fafa8640181540f2f49453ce9419b8dee6cfa512466834ee9e7bb937d3102a504ea62803561aa2084f4ce4ce52010c1a6ccca3b54f5015773f530ea1537f5060370584242c1d845e41a20c709e905e87bde3b6935e3b32c46a951ae533ec7a01a1e2873ab8550d5801471ed35795dced4aaa8c1c312a83251d4a84f276d6a94b9aae182e0b7ea72b184eddd286488663154d12e1697b806e8b8a90ea150c392164183e32afc05733ed8292420c87173ce394774ecd0b032405bdb7abe30529106f868e3a146836661cf7615241912fd2b9f5bfa5c1852cb3aaee8b87023f1555d2832d6db526a460982282923be9d598603f25cf6acb03a71b0d9387f1d655a223b3c47261a677d1808fff37cfb8ff39e7734d73ac7a073a90060cf4447920822c10f4e11f196de8277df9d4e20e761508747cf8d63e62461a431135d9fc4f2770f54674b64a7b003c8bab13812d367173c5d96d8395aab241f10efa96109f9d3cf674dc3474556c461dac57f00cdce6678bc99d842ceea7fb5dc89a35e9a0570ff5d9c91d7b64213f6dc672c1656100a7b3223516add60839287c3e6946b40535ae799aaf0df1a5d88dd611a8e4f5684458be52b6e15917d98e8cd1eccc47ba0cba9f1972d348dfb07c5fe0646e88685b68868bfbf3dc36b261c560ff497e5ddc71ba757a1d060dd0d3e9d8b3c9bbfbf354c460cb8c33d1571b47f97c1de8a959e53f3410a8836d7de7b6d3ddc6aee4d57c1df53fac4ba00de3bbd88ebdd9909f36636db9ec74b7f90abb9935e7296dc51834185b663a0cedf69ad03d0540a951c639bff9f224b25f876a4cb6a7964acab129a6853a2b54eb72897925b5844f589a897fafa40238d3708ab591f467fa2b952bc0e56f31b07efa71851e80e2b47ba2ad49a63265faf344b014756878b8f5fc3c91c0a09954687a2d7896c4eef4bd18951a43253d6cd1dc3ddc8a0c764afa8b65a00087fe415b70926a3a995b113ade89b8a59aaa42fbab28302538926a648caaafff58e306434092d04c233c7ebe0e789a0f1d6d9eae46dd8a6325f383d36e48ef4a6131a4fa204ccefaab8b87d7bb1c91ea08ae86229f364a39b68a58729e0ff2d352393412a547b192f4a14cb6668ae8f380e12d19325182a15add83bab2099e09f3e2dd5275f26c8bda0baa5a28b81721463728ef7cf2c90101d540b12c276948413f0474905d5e7206a8215c8d8e559865a082bbadf0d2bb8500fcba31f8d5139548bff03045de92c42236892de493e813caccb82980b031dfde3ae48ef6bc49c5c6332468f4b2105689c55132e645c9c88ea186d809a54b5742d11c32ae7fc6a0d3038ed887ab7be650817ca585c100af89aa50e25fdd3b7765e7cdde70ff32ed3c32330504e7cf6f983f369018d24fe3f7013cef17c845e5d8dacfa9ba812a72b5d9a0fbe3d9a5d47bcbf67b43d2065587e33508108bd4c53a00046b63ba709e6ecaa32afe5b6c87e03aec259f716a45406bfe56adc8f5e329f1a4b80701c4e9f6ac2a881d6dc126891634a0b77ddc18f214b347d6c692916b5dfbc8414e7c64399628e65162618b1e88169e013c8815d6ba21f9790854513cbe568f00ae14ec9bfa2442ceca8c6ad5c8824ace7f569bdcf5f2abe63745ab65149bc3fbe6c0b5785c116ef208ef017d02f5aff1636cecaa05e09e5bb522e0dbe0d1ed924dcbd121262bc9ad2a6a8748165ba15c542cbea0d5fe81d826c4d536879d1f5fe8584108012736c235bdf7927a704d5bb62d9d947a81058701ae58433890a51cf8e217fc312e5b169ded94efe6b6481aae83cd820cba68c406d27f90f8891cf5c13594748a56c67e26d5fde3d11f37910e98890daa9d4306f84d6c0e983429a0a2f5819c677b2e65b0c472a7778341b25f7f42443d38e0736f00be78c809c5e7c8ef3de915ad25268be88e178ae67bb5da915005260b9c24daaa28b84b517ca3a55d0cba7e0b3c546451c25141474f0aecfc3d10c0b37087c20f050ef77ea44268241aefcbbed82ed3d95871d01df3ac4ac58122415b720ca3115305c31c708ee8df707fa8422a20e721eb102814b232586ed9b606b307e9beb259e7f1aee62038e737fe2b99697c188aa42a7620bbe2fb6c04501a51b233698b5e5f515f191774ec0e9c028ccf5562ee5c4a4fa0f64fa85c186e9867beadd179e8124f63f7b85212459b236622de6454180ac475b59109057721a0826b8d51adaf8866fc028aff5616480418e4ed45694462b7eb5e963666ca921b3e5418354a3bd6ea488282b83b5826c9bdd8e2848176d789afd4f7e62b9fd17e2375203e3fd26366b70fca43bacac9b7d0560c57d5fb5fa7314162be7fb4ec70386974d8e037d22f7fa70e2a7df0b885d1e9a9233508e3012c0d230dae0d2baceaa3be857f4576969d40e57daf6240f54d9f37bdbab66bed2300e6574b711c8b703c6856961c039da44a855cddd5c8e8a7bffc5deddf1c7523400ecca6bfb749aa214f524530011cc91e4422f1e8584c75967d9ef5b8f416ef16af03942ada14299c3d4d70a59bcb40b460a92ad0b239513e7d48f4ebd974a4e5479d1eeb4178d41ee417c1d011242c4e17eacd8249955a4aa9f7540bc5b8e430fa8d8974bd850cd48171e1f5024996bebff4f338f0a024d13262ab3fe56807bfa9d4d5979a5f0b42ab3b04d4f19c474e80cf1fb2e8d9e612723babb57e66d6a326a0db6a6e18b48351d6fa394a71ca174aab190c94ae5d589f04c8f2d9a12b18f53150f2899e89ccb27ff91ddce3345afded292707144e392b581e4849ed43bfc051babf6463d175bc994434edaf9c6789fb9850028b8d74f431a033c8e6763268b4027f1c9108f6f218414ae1e1b1b762841fb748891b8adb421803f11c2bdb12c6a0d42e5d5de84396f6cf6d407092c3bf5c406b1bc1cecd31dd990da0f075eca171d3f0ada99d16145efc1e7da565301de1ed10a915d77e2ac5efe45430a240046b0145f58b75ccb4d98960109ad9263cfbdb598f08694c1011ac47e0fe1290b203faef9bab3fe1f9f82f6461ae1304f4bdaf6e6f949130f250fa0123b910dee0e62d0d3e0dc91a2cbae33d0efcf4c053d16d1233bc2091764ca7b85f29e8e14d2747d8564829f99310d28009c8836e39e3af0ce757ce1bf85c7238f822f29137dbcc37d3f0342207516ba79c607eb919e97a013257772e171eb84da9212a364dd1bf54d7d4e106c0c0be94eed395d5aa682a1f8b8b3421c6b59bfbf11b8bc8536d05bd80da44fd002548db3d605608e0bd664241cf19744d676dc5125effb00810ef332c47d0cb9484fd46715e40f9eb6817686a3084a3a40070ef204b109a11b326294815931e4c86c9ffaf6d0a314788d92c93b3bfca1a1e1733270a194cd274a336678e8833e0bc51b77e792cf4c0e9dc5cf643f2f5d03a93b9dc4025ef80f9443763b77f8ca09c5c5d2380f3f05d29c8c0df2d5a6e49ca33613865edc8527eaed125f0af8cd92d5c0556385ee6ee189796afb64d8190dc57d4f4b8b5f93dfe4d7c07231967daf15e21827c85cac6a977058356ecce0d1cd92f60b0700bac30df9b560702215826dd6d86f07270bdccfd475a912f6e0ec02a5935dfefb1138efd8a745008b223b1886fc8015d5718d48b860db05955b1074d92bafe5823d51344650853d86f4ff773c46aab645fae90714743de5361d050e21d11f9c4a5509ef60eabb162a204d1fb1243bfabd86b7ea3a1da566e56ae370b83acbed768aed29b3b18a45d1a87e23fcf0c550dbd663f581f34b0fd8c8c6e296c0ead83186c62840143cfb76bf7d3f2a70b7cf35b61311760ca9bd6311befacd0281ea17d8a0a6aedccf4d9255c4f529685987d37918fb2e5504d174c4ab5ed72a75d7e4a2d60677214b58f653f960525addcd7a4eb9603793e4305f5cbf7bf91e8b57e498a70834cfde331112142f6e9e51101fae817b11ae2584a8f8aa06213fb39b55027257e7c801c87fee64ba66701d1cef47e7840ece7d085265252be04958ecefe3dce6e3c29c0147d778536f985b43f85f163575d5e2b783386b5e0aea373ad7d5e83c5202e9562ef0a4de9107aa50f164eacba26e784292ea16198d270a14ed60506af0566f77b3cbb48a4f75689ec8861823376d0f7873af70016988a536dec84c6533fa55ef49e277c01b5982332113856c41fb8cba8b2817ea879a3d2f34aafcf73255dcac858771cd324fe60458d3e60f29dccdac5c9a0753a2f7a60238f6bd422853cb438690c929191a91a85529bf1992bf750c630517988ef7400ab85d6d35119be8259496369008aaa0a8af84db509b1c38abdc6d813bfba97c3f62237dc27d85030c719cce17a9fe97eea3e0a3824c159450c19dab45b7a648ebafc68328c6ac55149e703da4d0bad530f4ba28ce731296b5182553000642a9bac31709a7e39f3580e94fecafee734d05d04e2982173771a08f99ddd85506839e176ab380135759333bd4fdbb9ecccfcb4a15d5aca3ded4ee24cc6d3362e39ff3a6d688796644ebb9238a3e0b48dcbceb04d1bda2d2366d3964d99b4f4e4ed42e0554a73bb584008c9ec0a8610080903287e10718edbe0c30e7e045be3af47a372784dfba8f18ac8f5ab2491b254386530108451d5902513953d47bdc9bbed179cc8e0f0b93fef2a6ff01183a8691e15096efba1fd99295c12ef159145b4420cad3f90943d4b5aa76a425496a63f05041667c8d9a59e89d50b24ccd53d85d4c6fbc03fe4575584f00aef5b9ca2362312ef0a3858e5a32d9d23bc5971596cdf3864e1c5fcd43d2fdff24eb2b3b63fe861cc75f2240de001c5ca56e1321ca4e467f3c2197100ab2592dcdb213e71cb2a0d177842ff98c70ad309d398573abf47994866c8007b79d2fbc1dd24da88b7d24ce411dc6a516bf169c8103d6429ebe638fd4cd24905bae87a8c3d743dc87d753ec43e5d1e635f1d1f739faec7b04ff783b85fc763eca1e321f7aafb31f6e9f210fb75fb98fb743d847dba1fe2de3a1e631f1d8fb9a7ae8fb14797c7d8afeb63eea1e321ecd1f918f7eab21f232b13018c0ff4d0eb1bd5488fd614f64951d4babec83d3f222295dd63765f9518d14ec01105716d40ace3659687e27f6b6aea84a772aac0727bec47100faecf492ea65d926ed5d5d34ed6a6db3c7d1035a16591f08f09cedf0abad4fcaf5086b546781f4dbd3278d4fcde8f531596b3b992efc5a7113a7369a14bdb26a8f1080b1e13a7e803776389eb96edb7a8d40177bc3be0f28bf2a64bb690ae190fba85b10021f482bfbb1c7d1e955c6cd6ee17caeb2e8b397c6e45c76cf8528db8f74cbde4d551cb164c9c1eba3d480f7058fc597998bdcc36f5b5f1f04a179d2a70f1edae5dcf3dd3bea8c0868f66d3e7be57de0ac46f77715ef7cd07d4c5a3c988b398862534689d06408389a270b6369a66a5378745b9f2aa86fcb9c6db3b3eed580dc6552f875da3ed11740af332fffbe3fe7098a4f219cb45c93561d1fea806100b8dcc67ba65413e3b905b9899ffa7e3eb495d46ce782831787da586aa8c3b5cc5bf58b77ddff7d039818060df2198e9858cd961199b31124b978dcf4f11589bf4a3888301a14e342ca4bbd5e6b89611b5c353753fc7ae0c413d416477c31805bc64138fb9247c8502644c0224b99c80fdea37828e1253b892658b9591fe010fed1f42e8a28b7ac14301b45b7d7e246cf046cd92c6084827360b411402a22547a78ea63a80962b2fc60c69c3391d7c0b2429b534e48206b9f2581d805544da231ba2a4d9f702a23627c70210f08e0af8dc9214ae9063c5afa96249cd14f94fcbe6325049f256da42e24c9220fb7be600219ee5c06c7ee57f59463b657e9bd50cb1cfdab457ce9eb3cc12995a887d5980bc65c1ac51f99810909ce80ae88e04da59d6476b8a644bab221aa502734575203b12c05e791f6d33322dac0ac1140b981b5581ec8800fbe5f5e00dc869655544575a682e7405304702ed2deb83352045ab7513ad7201b9d04ba01d0b69b7bc8ed600292dd795e80a85e48056817e50a8bdf23a9a2624b6b86a82291422075a07da4321f6cacac19a23b3e5ba88a6a490dc2835d0e3802d6459650171444955fa3a7d1615d18eac89c0f4447185740ade65d4e17a8c4c2ff015ca101846e8a6819660be959e65af6038f59e7f1b01ac2ce956fdd8ea06471127a6a88b80edcdda7bbef0027f71ebb0925024c4dbaad36cba3b58df4f1dcb06cb06c2b15063d00a0e8403cb450380767aebe024c6ab4735241ed1e28059b191ef07077961cc4c64c9f79389b8103023b0e6fbcb212b08981735f3fd71909503990bac5c7e58c49623662246fe7f7964a50033b131f71f0e9942cca8a895eb0f87bc34664860c8f5cb455c123122b273fde5212b88988bdaf97e701095838c05a67cfe78648b11732256fe9f3cb2420823b135f71f839452c8acd8caf78781b830642432e4f5cf445e0a1811b373fde79095440c8b9af97e18888aa3cc45562ebf49b42937212762e4ff9747560a30131b73ffe19029c48c8a5ab9fe70c84b638604865cbf5cc4251123223bd75f1eb28288f9132767dd46b245882d72780e6efd77aad265eedb4b84e8dda55723b69d2280c62ef2fab0e90942f5fa2557039b7e24a8c62d71f158ec2d0274dcd2ab8f854e2040eb2ebc7258e83501b5de920b876d6f13a2e12cb89e58761221747ec9cbc34e4f11aae9975c2c58f42b813ab384abc566bf08d131165e5c2c7a81107a73e9d560a1af09a8774bae1c167b35b1349fe414cff74d81cc5ed8c9b94cd2f00a3a4efecc826e73f4b7dcd74007c30dc37521bb78fc429fa85e2f633221b82062d220578d080a74e9963b505627145cd330a94ac03ae50f81a5bb055c3cc7f0b5c399ad7d31c3518ea81363acd0ed1e6b43403afc3caae17c382a1f4ea7127f8c7c2a6de48e7f54e9e96341feebf8a60ea3573054867aa4f0838be382b17bbaa49258a856e19b386677426b161529f0c858dd04997d417a6d471caf11dc094e0e72d8f18dc4f5e67a3449ecfbf89cc04939b7397ae1565534992f018fa675bacaa3d3d2102954e6eeee8a6f6b21f9a4738aee0c796ce9bf98727e73ffc772758621db8d34bc8db42bbda0567ace869a44dc142b048c7ee9a8bb6834880fc80796165d6822176e2acc124224701275b491160458d4917ba6ff1137ef0cab2a2bc6d013b84e7e1e29c3163c961da8921edd5784d84a0f9efa0432db155379f1266fbadb50cb7e0e083f878aed2f9b14cc17c782585087ad4d33457711e1729f6084f1887d42fd4644d6a7ec756a363654d63c8ecd94676ce0e4bd1067169fa6fab643d27d224cdef44a908f2715c3ebbe35adc470a532f021433382ccf21f2968b384f46825ef81aaa80c2d3339b5efbf6b44ccb07a596eb14670e09adfe230569e9b5a8d16b1b8357d966c8ca6dfdf7baaab977e4397553c99d4c5650c0c6f1ba113e1723ec0853073d33113d9e97cae7e9b6e11d093bf854f3f6391702bb13ed261bd4bb968eb0a9b736cfc69b186dd11f2d60d349226e25112ec0d278f5bdcebfedc39492420eb69c221d67ae5c5bc2ec8de209df94549534b745f9531d56441e1926e3709cf2e87dd61356f6a6027539e119df563d19f63a28ba7af9e9ec79e3ecda97d00bb694adaa66a9f55ec31705632f84ca7c7d07dc6075e7754df867dafb4e8b095372e3c6db295cab859bda9df10201f79f6120107b8adc98be26969ffeb21611dfd7e7794a884ba5c9fc7fa3c75734a6104cfb910fe75c748e1fb1e59569a5267d9e96f054bb3cbab20b38882825bde1df1f4f62d6f61710444c18716487014c517a058f70fefe79e0be48034f5524de6989b7d50b7b65457bde92ff58026f60c18a9cd8c3a11390f64eaca5db8f721d5e137403cd7adb664bf5833941d4e73023ec694802400d29c5603c065d92ba5176ec2eceeca28c5c4265f84007eac27c14eb80a1d4acf4bca5e6cb240b16510cec5a468e64b4f7b7cbca46b7656195eb83658d7b25f7f179e6122c3fcf88ded36270086c9e67c47caf7c66c96e84799d51f25747716da79bb600eef7539d6c8fc9bcf4ea7c8d40c7a06b40d20390144f8f8f54b65f1306b07341e2b935b88592092318267b14509eebb573b5bb439a0cff63a25feae606a0096c4761b67a0cc28dc5d77043b944e5aa279045c217a39c17f93e0b6eb2481ca89c2e5c2b9794690fe9a8e821ed412200eb7684de10e8fc44de51706fdfd8a75b326ba1b32c53e083709700719baf45b5f30a653bfb002002cf8b21310db1773bc429442bee053a8a2dcf438768002021315fe01d43c7b50f26d4ada50a2e5d066ba12e27712f076df2f15685955586f194189b8c005c5a22e0eaf5a114677c1052c12b9c9d752666d3b99418d5ed2972214a32eb4991308974b6e11085db7873389a8598a6bb5d72bd447fee13dceeaa09a8a96a51326abb4d9e9c608217e9e9b8e2c6915c2445f4df18f6b43452faa6b3d77596e34caa3cf92ae04fbfc0227c91e9c087611612e5541b93943b1d3cac13819d66aa9b0130b8a7c55b2bced8f63134cb6076c2443a918f5dbd52f16b1958410250f56b4a0639b2e7ff484ebbf8f41d76058c20f76d70a1469d3165c51da10067bcf77c485ced737cb06d4f94d8eac408d2235c2ad2cdd3f4526fb7cf44d6a0090ed7bfca0319af4b2144ba13806a764a4e1fe907bb8193a4b4e1cfb13e0c5b85013683ddc08bac6748345c19d04a1d515e11d55e39d4b6f0b79e6077f73823bd2a506e076b73a60728409d622d6b775db016fbfb6fbe56ea58e550a825323d8b552dce3e70657add147d15b1fd00159a2967242fefa37d8022d17a0112e373a3201fc1dd32cca4edd3dd9dd8eb20037d12545596dc1818bbf09b676abcc273ca9b8a08d7761a8515add6582f9c7249f8a3145a461ec83d8ea4aec5adbb7035d8e66e8e619e20b379d7ae071d4838234b7362f981f389dc18afb8299f4ccd6b4c5f308149f2fcd89e888f64d6bd44adad62f3c7a5eac3ace4a7521248976edcb06a44083741105aff0f7c2a6fa71f3dea9287372a81f17e29991e3bfde777668a19ec16648c4fb21c21853aca3c045f3ede91acf102aaabcfff8c6a8ad62c1e612f9e741c102f8ebf1c02ad66fc5af60902877f279094e312954adc70c1ef7d12b855c2333d14c68732ab73a8c93e00c94565b1e755ccf4113c88e8d47c432f6006c326d8359a3093b6ebeb9512414233e72f400a1934174c2d82b1cbb4df7cc3315e84a12b50de71b60605ba6ff780859cd2fe063eb05afcb6e383537566752976787a58db6be0eb88d1884912e51950740c1bdc948cdc01bc7da5a585398132b9dbccc96ecad097c85656481f4042b28b8cbb2013d07064bc1199c3f74968034c15a14781f8086f0df43389122ab3ece51ae1b83874d59c99802d05b34d4fd06e9ad58cbf487a4e78d23d6ed0b4427e1ff0f47c2247cb90eca4688ccc5629b10dc830dc255a72dd65c0f40a508b24deb0e5008183dc1061ca6d06408b30208cc00e0bb5978aa5ef7adb862434e8f2d5fe71aa0a57063f4333408ec128244d7c05d253c78de38249c12bec676f1ed2aa71e350178565646338fbe1e155fe52679d282a68e05be44483e463701174012fcce3af8e56e49b4697ffa7df43feb06ee718a7d6e1615169634f3b109599fd70fe49dc9d55215585d637297b086ca92faebf359e77dea47703bbecb70a607f44332795f64e5c267f33db1e44420ec4703d661692d9b6e88d0e4f4ab55d9c0631885b1f44f36a2be002ffc01c89524ce544486aa82e15ac9884a7ef6ce2e5640d3bd334eac12905426b2b771418a99d924c55859504643e828a40d69de91d013a2d62c61fd5a958ee518aba792ffe79813305fab11fe67f9cd2250efaeddd98264b3064ab3db1873b13a0d124fb6a171b504f9b624cac3c6082ade878d6632a4f07950cd4ba95366c1bd42bf96ffd2d1b56b5483c140c0187a37edb84df314d538f61d0b4433a04b174b8390f5b641b25aa159e81835f8832ab19d3e679fc4914938ab897158bc2e2b309112ce6f69a542c36bf861df3c06ebdc296a5189fc2dc2eb5748110a7e749a4622e8018020d22aeac517a42912d56471d784d669a7c4386cf52d072fe5113700806d77b59cb2089786d9439212740acc868e6f7a02fe30c8f6ebe06bf52fa5328503819945d970a0f970e4355dbd9464a31f90a689e7cb3c7c3435ab31656d667077cc1060f53a6aae3a6d2a767cd050bd367b101b0041ad2fe2bb23f76944051e6df5a0c49a329167b4728f7ac7ab2f0386e825b3381c4ac68048d0410f03c65b004cd2b8395cc66472fd3513a05913f8e3ad944c8d45fc5ab1d12fc6b94c6ee8234cb56ea083fd6e7142793418a253a032874bc0a2efbd0753e6345a4b53d95403c4d40a9ac3c034d539e661ed2ff06688789e6ac1b8e76a4a3af3b940cde3c5fcc5f41526002e6975a8123c3647b0e1475a5390bbfa7c6899056bccb9ea0695e38366003dc56a62c658b1b4d990cd95554f7b33c472aed4437dc505eda3487b4e57dc61f3d7e9dfac66715275fbb41a68f965a002f3c221442f3864d53cf10a1bf5318344b1decb3999b39e1c06a8738a439429f5d83f966573582f050754ca212366ddb19e5784ab41ce278c187a92bb2a24b2bef50dfd582f2624fa81ec1206bc7fa2cebe5f5b1b66b1a3c424dc7228d77ed211341f90d6a7932a5c5f0b1330eec3d2f1ebdc1d78e9f3f69c31f0b268bc545794a4a76b19df37ef42d987c74a19752915a78aa64fc5c016a683ae0ca14d1a4e6582ba079f862e9df0d5635283e04e7c839350b4c1c60978050ae78f13b08fdf37e155b36fc2cf5c7e5d72eaecf2c7573e56ada22f4fa491fcf05ec4f820ceb571cb817193dbc07ca75871439caf688fc846a10be9cc03620a1525b233e2282f2598dc616370626d4b537b7e9d43de831acecff895768e953f037fe2432ac3b1bfdfd55d2d476ee491ec11d6b6c7b8e9e5276b0cc7df4758636ec743d2abeeb797a8b46682a7a4c9a1d8e9393c1185e84ed1686f9e385ce4c0ed0ff7cb518917906229432f61dd48563cf3e3b94cad4487eb08b1758e3660e914b6f351479e57199c33b1bfe4b56248e89240455c245eaae2554a54de941bb958890d4af51c8986951950fcd12254d4ba78b5ee41c400327ec2eb37701c591987d91333942a980f327a70055954f220f4b826cc79c099550309816de8e3c814557d16a1a73f0f8e8139a2135f69f187f25cd5bdc971a912ed28d0af229bd207792310f7bc3a9732f70c187d0cc55ce5545ca726d53fc00a9f3aec619bfba0ec4b4852776d589cd315b43e07c13311258379308c11b975a438e38cc50a814edb18ecec3f8f33119ec7c0bcce20074ea60cc3750b05683cea2f486ee98eb26d17515525c3ed37cbb10a12411dd1566cf6eb8f3681a0e351b388dd8303ac60f8931fb3ca71f561e695113b976156e7e9dc11311c9c118734e5b92341199d10957bf496ad371c10fa947cb48fe2d6436828a5581dca2c7668a4afe42c3c1bb23fcb258ae3ec47ebb44ef07a73a6f4f24cb9289648162ea6b51bd85329006461e921428c310cde6125d914906222753416601d453c686078cc6a5237b78736811659927c43a2b245e5374f0a0788eb5d63541644471a390e4e62b27812b3e2b84f2f05b049b358b0546aa1c30d68854227a2343ee3293d8deaa9019047d9f5d50b172545d6e8000cbc29a6d1cde162c1f4b91429e394314a4a3f54fd87744ee82304bcdd1d55e0310c830602c74fc92e094a8b27fdea2b286b8b09ddd78a89012d66c01c6a84545727629ebd5cd96c950c8548ed4fa73981c7039064185e4f28f72fb60e115b93835df6938d8040194dc447dd971a76f5d1a85ccbfb05b2d60a38a8fb47f22d95821d1b53d82c79402b872db5984a55352a181ab3a5e38e45e8091fb015db034184637304b5eac0b1e9c0386be3cad265ca6c67d25209915c6bb0dddc0893cdddad9027c4178527ba705b8abe9a95a4138a84a7487e95651db272e7b8dc344966e58530362580f8061088174a6ebafb67646227f9a89ad0f82ab479fd8afcf063536e726451460561b635465adc3835a05cf612ea1e97e9f91fbf8be34d6b264de119ea7d1dafa4b3a76062c1643e22ec7ea17bb374a24a893d0018b73c1a0d42aa9721b42912532ec8fca885b59014935543f0149716dc72f86014e2bb74badceaa228d5537bf72b538a27e52bed4351a8a06ea638797869c25b065924344010b811eec5cd9f60455e81943189e473542b34d9cb2ffb05c5097dc2cca887be639ed42a2f8634f496d784d2020eca218bf249298b9a82f3e69355ca54a44b0ad3f4cae5eab74e4900ff7c8261c38be5d2d3e7a44b79512daf3acd599e7779522c0087711be71959aaa4ef741648cf059c60800bdb9b96001bca50c8d385a9b02cd46485c3958f5bc850d3491d61927b524424114be8660ee055559ee32c4a6e488c37272409b062c52059cfec17f6356ecdc22eed08112cd85772c0e469c1683b673d84eff8c8a82db8c3faec2e5c6b62726044c6a8deb90dae917dde4d0b93311a13ee12bd904f179c601b49e826b0070dde35039fbfce2d4976b4018a876641e1f348c50ced53db4216c4895dbc05ffbbb54cc74222b11514a533676ed04b2b50315eb5fb75c139c84e5301a0aa9f21666ced5b425a0008fbfe21a3b60957fb1779e379e8d00ee2a85a8dbc45422ab71def9b92a992bc638932ee17a85f0f425f3ffdebeb9fd607501f3d35233f9e40f1c6fea8c56491babf5a2a0f8c08d2f54a98eaeff37dd8fc574a9a60212bb74ee8c4650a9e8b7e14d2040becdddf171b23c5ba7189aebb14ea0d7bdc5496e316b2c74a9dbc235d0706bd92a2e0ea0bdf48c5e33ea053a9e283e4c67f94722cc757b392ae2123124f03c88a52a8dab26b38cbac4347e1f70a5ff08e892f397159e57cbdd15d86cdb918dae75630d32c6724bf9c2af8563dae3b8325dd138534984194867173e7d9e8b906ac9e97667cefea387ae4a997dda43f1afb857c220128fdd3f12bbaaeb7fe0d1bad7ceb4b532f1456ccd5d7af3b8d66a74706cfebe986c183f3ee77fc7e3730f487a51cd8770d4ce115ef8ab2156baa07912d3ea1822d6ba0c5be7777bbff161ec792de29f2940e10ca0ca162708978450a12f97c1c5f5a631841d3e05991e4dedb4eec91a8aa641ced9f0d01ca8c4f991b117541c19fb4e8c141d9c30f37c0378f03f10a26adb849eeb21a16e2c6576954490c41ab7a6363461e7396a5439d208e1b099c1f9850383a402f010eb8a8fa566df863af97f8301e8359466eafb6df57c36a0e3ff90f9b214b6d4ff2879eda8058e7b6b3ed7c88c636c7e588b0a72948fe10a84f23923d37f1c172e21f138f3d23e34391fe85bf90bd22742bcb86a7d20767d161acc8db632593d707745b7e38be07e745ddcd3ebcc1563b587f208930f5bfa0e641ca8939052eb71e6fd74be343818e68a311b680a058c6bc4af003fe3a21d5082b94a5b6bf4edcd6eef6de7ca35cdbc4bd7f88da7bd1efcac9c223e6ebaf08d17d883cff270c85c95b6060c6e66cc99f99e2f92ae58f5a9e798a8e6f3eeafb0c6a06f9f86c7c009d53c6585e1e8e9de8edcd4efd4128a7f046077e353afe90489ff612808368f4e0200f6334b8f38309d2a4df7541515a9d65e727e8acbfb85b02942e15c2578bfbccf676820298cb6901b4b7e03b8322fc15ab49a73f19d7361d84ae9a9947637aea0dd511ad61c1040d2297b8b0a9ea71c7803adecd828267e2ea43451b878d47578444b3faf416521de3205af9788d1bf64bc580e0b9c16c165608bc544e9b16e6a13225b4d8ea58f2425772497ccb8f8a8871de6d405fd746fc0b15af0dd4bf8042b8b07bc8c5e1a656456bd1646676fe0c560a6e067c5413a9459a88919765fd2dd0f58b50a48e958381130d881243bb127fceabea4fa5a112aa0fc5ed6bbfd638da931efb6a48e439191f010489cd32b0b31e6b4553b5a41471a85a90ed1355afa5b41c2dbd525bf1ff945dbfc3b205467a2b602fb65ebf4c09d254b2eb2ea694e2f3b5b239550db193ea969d62659e1a015f258e648189217544a0af6422b02f0e5db2a1af4aaef5c0287f9cca3ae03ddb46d3f402c52f36a4ad3675affcfa6bfff69b7689f181aca4acbb683e19facc9fee7ceb50e32536e9db29495a41c93e668ad33101dbf7cca098506f49db7c2e4f928212cef2ac534c7bf489166ba002ba738997489e770c76dc963667b8e5524e33039abb17a6bb6980a6948faa82fd97bf5cb25cd1004f3525ccefd5cb046f2396e3557c24e83e7e1c664042d3762bbfc3fb39778568fc67363696be9c8a01b580b35cb6be6b46ab4ac055f09de5ceaad881403b310c8d3d7104356d3cb109e1e141c1f75de703225d15801fa85784251b785996ca76f9884c5d5602ecb3568499fa1ce9b54dc7ec49f8482d41755fc20d89175a1b06d362265af4b2c3d07ea82c5657c6da0b660b37a66ebe6536dcd66297cc53f8d3fa6bff62fdadcbb21be3c3e63654eaa9a0e2b8977b80bdbcfe23cdf57ab952d2cb61635e5e445ebe31c9efbd1b6ae534ce7ed0e5043b13d9b6d1a09e8e81080624ba036aa12e8657205816a703f9819b4295991c26757055b82fe96e34a8125773129a97aae8feecfc88f8292ae25cdefbe214013b2845fc8cebfcfdeea32ed63c334d3907afbb01306e789d8d7d99b24cbe15ff2bbfeddd6d6fb9a54c29c922086e0865082017ca6ae58c133178d272c44b5dedfbda311848f6b6b9e8125d97df43cf35227288f41bf8da1645475da04ffddbd8e28c81c7d54298955b468e2e548531dcee55c49121da6ac86cf9a967385538ddf13744fac97bfe86742f3f9def71ba0325b889def3a61722f15e14f6d7bd28947e9aad71b26eab3e1d3827f4f20bc2395f28fa49863cd024647660284412ea54daea36385220eaba3d65a06f9bb5a512eb8e0c2473d49caee99205c9648e92393eb329cf992e3f7533500ef3d93fc99d2e3a1dd4665ab7ac0134c61d1b48ca88707bf410c5ff52a97dac3505e99c6dcbc2ca58266d247f75570d1b48025d1cdf8080569427e59658e0b4180d9b3c67cf6666e7d9546b588b81c3375ad82fa6f1d7f193180c44a5c59101004c654db7f5b7b8591c1e1ef73baa9b099259fd97959033a328ac0fec77646f2628b9dc023e71109c059e71e743105272cf6d5828ec868db01899359b713f577ef2d04f959f9c59fc04abafc819ff8ebb7f60c7ee59875325671c0b3b36ecfaab9fbfe3286baab46f335a0c3ef9cb8eb25a8d9e4dae61ad86ac51000e173e15a6f1279bb66d75ab9ad69a0264cd08a4e8353e388a59de023ef97b9be13280f5ccdc09ee197425e48cff085c49cfef1cff10d8391d14f65ce7409390d073cf21098544fce47f822acb09f17777fbc08259cc624d5517c0bf87a0ea1a1ffd4f9a7d66c82c1f66b399aac539552db6142ca9e73d3df349a93837666656a3a767f5faeb703269d1574eae4f958e97f5c6d2413d9be9c857b779dce3038f0f9d5729c4853aaf65daa9e3083c422b5ba7aaaa565df3829c4e2693d99a52266b56e17d1e15b57893999987300a08d6b13f1208f6c9019fbc99d5203fe1f2fdf82e87cc52c352a7325953256d4ed77fae1ce5393e5bf7f975706135cdfd4315d871aaa6ca513d5389c4b0e3545def3b551368aaa66aaaa6aa67ce6da31bb349811030856f0b4b58774ee6fa6fe0f51bd747d77face17a3f7b8ab9953842278f23ece839d5bac123f449b0e9d0e8f4ecc63147b58f4f0c34f5079a5af4dda110d193422426ed4dfd2ea24762d24c1d9a82c43ce987c0c03c2914220a212ea19531df27c91975ab5b2d92625e5efbef9afadaf3e81aefb570f469d15bda57d1ad1730941ee2f8c94d3a2f6fd2417b17d29b86700ee9d954811717d2cbfc8d1f42fad18f42215ec2286a68caa17ef8fda4d01444e66fc8fc0dd390d29bbef4a6973931a149fb984f920313923ee685903e26441285f7484cdb9be8c39042d37c93f6a497425e3ee6634224a62d3c22c4e5edeb2073621ee687c43c4c28441442460ff342d810498fd7109851a803f3129a667844079963d2483fc4e54921920f63432c29dc2149ce2881483ff6c851bf7f7c1c2f735ec2284c397491ae2b187a1238fa17b0e56340978701edf367d291791d648ecc0fd1f1a5979f497b2dd4b9f144748451f49b1e3469323a748451d452e961625e8852e803cccbbc8ea7610c1da9949f489fe36352314ffa0ac07c8ed0a443223de7bcbc3ce7bc3c4ecb8032c7049ab4cff149726e80262d34e9c8bce97384486ebc298c22f4329f244706bc11de78ebf242dc08b9c7becc9b9e86314ca1f493cce871b8fce82b601f47f89cd3d2f29cd3f2387d03e49c12c8399a4f8b3e5068ab35764a04b64fa7564f7c7c644099d34f80a200d150ca74b956ab2d86543d9897ce051c81cfa305b4626f5d3d11d82993cbf694b15351ba46037275cd4be698f875790a50bf1cc6b039e9cb6f6e73e3d015767e3868e12849a861b87f90a7d9da7713460b6b9bfbed473b3f7485cd71a917b344429d16a77dd5f4cf470d400a3712a5e327be3182056d237cc32d1d1fdc299bc0ac27ecc3eaf7a4117e59f97cc8a7d35ba485f245ca481716d3cc9f22c847c822a4b803d37012f2347f9271e78f3d1ee0ce25eeec959c9993888ef7ccea03e4e0ceaa317d7af9f3a1b3d385d2756ee897433f9d6c61097bea17bdefee169658ed76ef3d0c98384211d6c8d9e9de7b9c762f7485e52b67a3be97ec83c7117647e97f5c61fb8e7f04071df7fb0d748267cbf9befff3c01e72fee6be7121ffe6fcdb3770bbf2f3b0449234fd149469112cc2f38aebea4427794c665b62666ecf9ba51668a9856935d6261565a0a1659a69bb49e9943c7b761bc8540bafe4824ffe2bbed144e7825132f0c99fae98891517ec6ae6e94dea69301918f5834f387ef2e7e71f16c73217923022d2a6df9f0212c55b704e7cbfc3944bc4515f58e78f8460bf173dbb80ac0bc552fae431d72808b67e5faddf8878bbd435dbc4a1022bafbf1372060792c69f03d9899c59b1941d587eb1ab45b0087694414138ea4706f19c6c92a1243a57ddfec0b130af3b719557349860a7044836ed47190433b9baf910c1ecc82eaf0bbb4edc6a8f90a6813a57ce0401ca1901c10601393b87a378b99968326bd7684f1f8a7f09641037461c91156ce415ec46a97ad4b585dd4b0bb6c4795de53927c79e0ca2f785447d4690489035da1741daf0bfdc201cf585bcf213dfd090a3ac3e1b561ca579c5e148a3c8c031af021c05ff6eca633013a4e8cf51f846879de0c5758e12057649200e9233fe0b0082c32e094479355d937aa6eb32744d498afe23e82251a23cf977d334a78b5f1cb4c353a4b08cb3308ccbb8feb39999081fcfeb28a5f46f13e19b10c81f8c92fce272fd475748189d1f84a36cc84d644b18fa7f3fd7bfaf8bdfe56217bbd8c5ae3943eda3075a3061c5cc54f479feb651f6fd4bd226f4fe37a4cdf6fe38a44d871a8938d8e1f99c96fa2210880d087be97b20101d18430f3f75600c9a46e4b26844e48d9bdaf61cd76d60e8a927fe10c029009e486f0b08d3b6c5dace748a42e16f5b0edb739b6df916b0879f5a207ecd012116fc8af9916bc2d5d1adbe725fad56950833f4959cf1245656fae48f659b59ec0e55729d2e99939d15faaa45f00b3b83e6939e554c2833ca9472a9346ba5ea993b9fa584e5ba159d1d3b76ece0e131c82f06bfcbb5a5a48445c2bebcab40def0c034cea335e5206f8b47e70bd8c20bec894b811debeb4ea9b0ae196b8a47977074165c7f1b8ead44e32ee4c95f148ec2d191f08523b331ba8baf3c9fc1556a25c562b158ab98d02530c0207a278fc11a8bd5181bb24530df43dc2b4080c2ef7243d85a46d78c9a6ac7f5ea4a0339e33f5facd335db0e5d511fcaa230a02ea067d02b940daaa24be40c738b4271d8dce9e9a427939e4b945cd8b65381da448df18d16ce17d3f8aa36c1286f62f60c8b15292f17eb89931d9e949c093a03c69b985de79bc9869c50b88217d765333bd2d89c6958b4202d0b4c8bf1c8ae6b53d0903447980212aebf26a5fb32b42854a05c9fd2555c2368506c21699e7869ab96e6735de3b9ae29b9fed40945ec481b2b8d6a257d2a83ca681579d343481a9736fc4e1c713d4b2fc1727dd450705f9e3f1fa2679791fd3c1a8b89c0c6f202f6cc0ae87ac26a273c2939e33d5de32a12f4895f66c1b2934509ffe84abc65ee0d83bdfa497743e928a95e754ff3901e86926667812618e562f009039589baf2267cc531ee420c867115f6829df00a8fa031a9318e8ba9982891418679475f854db0a34f1e7fcf022ba36bb66f959f8266cfa56ec50b7b498b211556b6d84b666490e1f341bf82a14bc123950b6d95ebc2b179683e1f737acc614e65fa18de041a8e9cc5570e7398c31cf672a2b19ea8a2ac9c256de83777c48b515e78043bb24f87a3c68489b4610e7d481cb7558d4ea64e288b52262d1ee0009f8fc91d61433ffa6ade2e015e48861df9d53b3cf3b7679f57cd91fa24e02c65748ac935808d4dad5cb7558e7d6e6cb0e1f3d1cf60e83678849f04dba55ac8307eb53845cef85356829ca1f1974a47da009133fea1efbbafe1aef13e0583c1d8a04f5a6451271e48574c542d32fbb89c30100d704f550d527ca3853a4c235f2e2951666c763161976f6695e9c574c2f5b7a3d077b2fbae3f1fdef77cbde62be8e52beaba14e8d21e47558daa6e89f278c979781a7e871c666147a157ddc27aa5c4dd2d5fc7fda4c6449e0ffbb0cf086c292dbaa2c819568b4e562219aba6344aa74ffc332c32cd8a56c67509a3726da0311a1b698c871dd887ad982f15d3b0158caa66f049759965be1f5f35c363aa9894ec302fac1599a73ca3adaf1665420f43c684529ea6640f71abb9ea15afa68cb957afd7063a00368103e0ed517d98c6a7aebc89ce039eccf181d1993741653e7c43af5032a81a3b88d1181176ac31719e214ffe57aecbe810b329a3311aa3311ae338cef27a7158633e6ef8814303aa1a5418d000a64ce88aaae6773978dc11b6bf7b80c7da75bec2af51aa0deb5fd018743fa9938f862b592e8d491b1ac81b5781f32b083fe0178d4925211b96569127ff3358577c281badeb7fe3a331baa24ca84aced02554e52df77196af441d27ac5ee97c10f87c841e02524640488e1ca51b5336653077984781bbc9f5ff42dcf6a4d23a6b5795c7311a9bb18eb1b792334e5a6445e91a1f2c77a4b11834a0eb515cca48633cd2980d3406d3112224021190c01026d2a9dee12cda0426c051e056c023810e9b389ccae7c3615b583956f61013581ad53c74e77a96399b5168e3fa0d6341d2f8944dd99465e954ef4cd994f5aa9d28d19e684e3426da121aa3313a2de09140a7d2a73e8d5ec6f5d74020b64b4326c8197f0f43d290402718748247cc810981d880b0b75f03df8f8fa76400039f8fee31f0ddb0018ffd4a8df5180e8b8df575bdc586e52b55aa8c5f2e98273dcfd7ab6b48307436d3d9dc5635caa0e4b6aad10d6c60871d38e03d619a1a30aa82c1277fd235382f83f5761ff018e4eb32391306182f47f912a220850f460002860e63c18e1bcff5a70cf3ce2fef48205865ac52ae7fcdb8ed5c4f8244d529d2865bd5e77edafbe58f866167bd4348328fd33e4c41609ef442609e04c3313f6d57c381a53b20cf40e9a798977921312f43fa98f015f348603e26e4d776dd95c819ff900d4b5fe6c0901e66474ad79048a153d0838298af098b79524cccf277463ce92812cc8f3a607e748143be9937240260ba2ff423bfbecfebfb422b612a1cc4b3dee1d8e78542a1d00dc58032679e2167a0c034565a9cf5c412d4a27720df18b0731a7422e649608967cb89d1d1d35f82b5e854a695299b58ee94855d8c5336d615533932cb9036f35b546034467ec2f577987b8cbbce578b77d553e627ff6db3b6549a29e01ac92214182599f674cd9436678c1a112b285122ac15661ad7a76cca2efdd219b6ca3629d3989cf1a755349e23ddad29e9896d9bb53446631cce57d7cc0f78fd810f7c3ebaff0008b63bd61583b5ae384bd7b077936a4cfab6d2a8988ff99898d077b2602983ca94981f3b8acc8f0de5c7aea2144a5f72653cc6619ef4386dfa422a2c87ac228135e6ef1cbf58d5ea9ab1c6ba46dac4aa8c8eded47aae2fb9ae299133313b8a77a43123357684e51fc7cf47f70cf62df2dd50c4ab31695345a2b88b578d711581c7af66d2356c480e43b6206da412d71b09cdab73951d6458fa9d5281b45102f341ec63054b96eb3b17e554a6a07ca5a451358a85c25ec51226d743273cb4f892332e73c6ba3a5dfe422a2c83da75f7771813541aa5b1ac8cdaeafa87bae60b8d05b70b79a3a940d2bca4cdca511e863cf97b95cdcfb0ee57aeaf1c267ac1fac52f7ef14b5ba2f5809a1239c32f7eb1e6d335a394dd2a5efe74898c56719d3eb94e9d30b91e8edb168ed6964ae1f8e27c98077bf849bcb1f58cbaaf28a3933ca476e58b573edf78299924470ea1bf0d39f1c8b2a7743e4ee3a07dd3d9abee884d5dfed20a6c897e0ed96db914a56346b340234643166854817aa92ca44003caf4b59ef4e7d26f4f874f87d0735fa2ff8e12620b815be8eb735ad564619c115bc28b007a72cf7a8d6ec198c67f0d46f50b5a72bb7e5ec0285e83595bc88d615a14e1ba37aed4a28858aa0a3da0d73369d3fd836eadd1335e836f7a0bd93ef056b7357dfe7068118ce7dc601c8644f54f0bd6b29dc8db31c5f2fd5ad2a1fcc896b562abd5f37d3bb2f48c3e9d1d20477d2f7afe0ffcbee58788de8abee5452fc4e8bf9739dd8e2c9665bfc586a6feef47a3377528e4fb914988e85d5ef42eef1f1250f67d53421381f502dbf2f6e76b2d282dba11972ca4729065f4489b225ad883f66ec4ebb612d2a6732cb7815aa444b032685821a2d05e88ef5de67743cb14e47b9717f2bd4b28fa51c8834c14dbe2359d2eda5e04f6cc82b3949cf1300d5b05599386b4b902ab5544af5a37c802a87bbaa7c56ab15a2c16abd25ab5aa51510bfd91f7e295a4b063b77ab688b69e9033cc05df74e7a0597d65d69f8f1fb88dbba3063c76ec96dc9e55351cdefc6ef88122081895180cc6400ea4c308931968c643b8fe332698cf476b74bb188fc1d1ed969cf1d98807505c219bceeb7ab7ba55c33d55cd62188bc1e2a1e26ddbea562577b3b85b0d04ee1e69b3d5c7e91fee14ec15109ab48089eb9d7cb990009231c38e3d6b713ff6ec093264d81b6652ecd82d192b36f41df5b6ba79ceef1f04fa869e65ac60719ac17ab7cab354dd52a92d354b5134ecd8d3f3b41edbefd0c28e3debe16184e597a965a5164b5857de915d2ef04fcb823bb0520b1400ddb17be413aa80a15185185c91c62c0cfd58ed8edde380f9a67e4a04cb2e25ac2bfc1ce0e0c777013812a8d25ab5aad11d3cbc17c460144bc127e7b055cd7a0106183e1f4e7c36f5fdbd9bda0146f5ef868f8bf09c3de72401bd4070923b9fc386d2270ffdd8be5ad8add08f1d9f79ce2a8a9e288aa11fcbac198fc18f492ff9e9663e853fa1fd58d3ed5b9aa2ea9e16bbc759b552cd6d9b556301847e66251dd81e703c27ed66f0669861003bccf218740bc851a29fc29ff0264e5d57a4fdd0431f6286c4aa67c794596805c85d9a6f6bd1bb87fc6c8b53c219084083c720b37eece4ae8659dda2fe85507ce11276ec1fc80e82acf1810c2e1612d53d7e6af10dab68705d1ae1fa11d28b9022b73c099574150d96b8feceac59f7a8ba877e17a56f6e5bd54416acc106cf0862b00bd6b317fc4967712cdee34e3c359b990bc04a7413492345b7a07b4a4cd8b17b1a4b8fae449485f60fcf6aba35a78d0d37ddd35724d713fab17ec7eeb99f0fde69d19f49cfd89028265d17bd121689eb3e32024b9b204775cb51cd6275688a95e1c28eacba11b116728a79b6b023a7e61dbbe7867eec773f1aae4c19836312d5e5b05946a4ecb64f11be100a1b2eb1b31f79f2174217b36ecdba35eb59cf7a26fa3c26020b3ac943898f3bc2f695339bc82bde829f90db4adab470b7d9b6711777fb99e26e1c645bdc9e4118d16b71631e39b33dc8861d79b56d630d77abd94a77fbcd13a174cdc8473090a3a436f211d2a6eff63ad28657726607470591286e224fdb6fa328fe7669a8847b98270b368a104a88f9de6f510899efbd10f4bfefb1bdd8b1778fd4d46db0de6e52272d6e4fc1f9dd90e476340c7b2ba8a5aefcb8c7e96a5ff44346159ca9db51cf3f5310d1b7bc10d1b788420f85881ec9e845db57b053d7c74fdb083485defbd07f4f2916ebdf813ca5c50dc84f9beb075310fadf5760bef740d8a62267b66ddbde51dfaac4f2d3c6ab16472e0bc4767ff8812ffdf938ed59c9630b8b74ac4ba2abf527581fecbb759ad77d921c1387eefe48bad1e6749bc71d6119a4b7d3bc0ddcee9cb7e3a8e6b579e336916cb1d6e77a61a0b0f46768da3c3485deb4bdbff726eefd33857ed382ccef7e0385ccef42d3f6dd8f9e0385f87ba12948f7a3376da1902eecbcff5ef4a370fb91fd9d963762cbe9de9a3621ecbf84435c46ef12f6f0537d99d37d3ff0252267ea87be203307c74ff5394e081cc562fb6b0f03dcfadf016e7d2f01b77e07ce204ff5bb8fd19033f537905e6945ced4dfea16f2acc7ad0f7e613bc525994db36cb381b828a52efaaa556693728a5344e80c01c2375ae801a619c2a81e7a60141bc127244b64194b649650a74d168d603c70fe188e3c2ecc8f31301004b8b29329996acd41b59eb5ced704a3ebac569133dd61bd22692a19ddcdfa457d7d95bd9a70f7578b3ea5c50a83e88458adfca38913153ed58c1a0b408d5533d86755cd60546da2731f39d344cef8aa09f729a4374ffdd1573d66a852a4c8eaac56a932bea957244d25430d2e083003d50463be6898af09868a7d26188c622b9a99d90ae62a92b9260a3ca078e01b2ddc767adbe19bfe5965dbb92f03f0d03656f8f020a170fdbb1b7e3118b4c6180c465533eacb06ea041a03e3c5d5a736a9aceb7c53a7a837a0c20b16cdae691e3ab52f477ea1c346702af472f118a42f35764375428dd526eaca058f5f3870119caa818a01f38bf9622bd8278619fa01105080d73140cbc1ab2b087835562adda82bd3fc15f00df73b3ca61ce8f37328ef568382aecc342cece8ab1b8fe3475f1d69aab3b3c353430e0ce9635ee6774a6fc4d672e5e72af015308defdcb1797aa7ee58122467585602f92567f097e12401466e8294338c3c46e9d3a173605ee60b327360428ee1c0696cbea84aa632d5ef4c5e0eda646575683ab0cf310e9236f20acb292642cef8f3b4c3fce46d04c16032495f3eda89e89dee22a88d2b4197675c85c388d9b1c48ef5a519616b65b1c871b26d8992a674a76738b1a88650ad27a7d888909f18c128ae019f425a830a86a4f1e7d3c8fb42cc4f5aa34104fde08cb0e394c9ac2cc112648481b094167de4d55abf90370a7d558a0bdef49955cc2753c9ec993c2e782eb80045cef877313b5b09247a882a9a54859a8a6735a4c08ebe72e2acda64861cca7c144a94ebaf49b9fe74caf59f54ae3f3fe153fc78f3256dba90289ec267be7cec8ab26c8b673eee4dc63aab41be92994f9f41981f6f9002cd8af9005680966fced9f2cd1781324703e54d329bdc80697ef46a0d3b726c7a9f17e220bb90354d24123128354dd3b417cfda29f31fc9b1561704cbdd915bab21f00d18d5293fadf8462c2dc17a5184920fec0e3855468b31366c6ae58a327250e81322fa165260b9cf851f3b3207f14de8fd17206d385104248ab330031802b286539eead405e2a798eb0bb30089b95cb1de36b07b408514bd7bb87fd08276c92460b1ead70e4f6a95e2d20784526d631ad157fac28c574cd3346db52af57da1a93c69979306ea29edd350ba74c36b1c8dc3d3869033fefefd4835c159f886959044a4ba2e08b6cec08e9d1a6bf87e882834f177434c1ceae488582b53bfe84dfcdef726ee5ec8f748a2e0f09174ff0185dcead5f51a1a8003878ef21c85833cf9ab80ac56da6ab5ea55af7ab581dceda4b6da9ac80a3aefade94f10887ae5bb12dfaa26411a825b928d598cae6bee2b5be48ceceeb691524ae914083ca4db946529a73085124be1eeeed259d0f168517a73523a5dca3927d542295896c297668b7336a1352de81514d4461b1bc7416183823627f51707390703776f7ab3062efca6014cf3af1467111dd53b6c481aef56725bbc020705695b6d1804050505f115244a6706a5256c12b7bb881a9d3a8ac2fae63d68b70abe9fa2605f73e3e88b9d080a92335e586e5f6d35c00112ae48238b531a965e99451a4069b45cceec20290976f4eef5cbec2c6ab123971718528c4ce9060e530e1d4e9d3a75da820b0f863b78bc000018c453000410c38c0c343d661800010840001a0a50538029e058a0aee1ff12cbd2a88ae5a17d3eaae631ee75faf4a6f7c3b4ed98eba5522db164395e776e9bd329f55992a5f652e9fea88a9d2df29c1e02b960f657540186cb3ba70004ab8424765cb67405c8c25cb1c11ded43a1c42500645141b1f5ca2cae2821801558d29559ccb2fcc006f998cd9e30843bafcc62b6e2e1413453b18d84f4765c39df0339e5a720fc14b33cc5101205c44fd2467bd92c2e1cbb899c2133909f805c40409bc370470682e18ed2757b8a3b843c39c75c3e72c683662d863c48693ea8da7cbe99a10d4c23830d4b48a147e6d3cd559b3229ccf09946c65260d40fed7b34ad292067e6ff8fc7a1b3bfc5b0a39c89dc125b2fdc125b2d51e41b8e314d174186c859bca6c05e8e6225e4c9bfc9f5af1a9dda8e97956bedda2c999bf358c6329ea99c30162bcdd34c38884e4da353abb5d6aac1180ce697f6fe42b6d0c21f39e392335d7bda5639308084f00d6f2199e594e6275866999fa858af07d6c42f734cdc3304ebfe1c964a1206b20556dc1948eee11bae82892ae48c5bd2466b438a5790a2f3c05d84ecc1c24d8265adbac00e445af487f5c81997c9aa4c26639946a7cffb5081b35ccc1823fdedfa04d1f0c0eda79e3592e3f617a1e198e3f673620c321cfb678edb438e5b84fb51738c392e573b346cff37c71c957eec815b84fe46bb508f8ee98eb6695be5667353db26a5734ef6baca6bfc748e5230bff3b6e91d0d694d84bc9fa0474790e4b24ff6c071bb73765c881d8aba6d200e9cba53dbd8351f5b05c769396e2b21ca7130fd83eb01e616e1e877dd2247e9e4be4e2e1c616e11e66ab8bd12db3f964a258fe3429a86c4a6bd168e20c96d0e9caef1164a19c3fc19a2da6fcf6d1bf5aa51285da8fbdf363727d7bdfde0c3f5bed2ed470edf9b55b0fdf6e78fde9bda08641bb7e547ee47a1f6ddc0859e0da9e8bb341cf9ebe7c3d6c295e511f9beef3322de5ac11ec4aebdee46b1866a35f1f620de16517d7912fdf72ddf712e2010f5ba70b3d62de4e2f238ce85b4d9e32a47f2c7df1ada14d87e17d3a86954f3b4f9385dc11be4cb4b696302222fcc0f09b8f56b38822417e6c7fa9b3743a12d7c6f9cb743a18f646248a4972191b649c281e36ffca8fd86e36571bcf613c717d1b690391ce1d6a27ded06285bb45f02678bf66540af45fb31a06dd13e098469d13e0c7843c660ff05c42167ecbb8039a468df04be3cd93b0a4b72c6fe078ee2b5e13712b945be1789be2e044405e5d4b45a1fc7ab374bfd31999365287466cdb7ca3c9d8990962307ad959b93a3b4bb2bad5b87638e4b7bc871399ee198e3ceafcf6d2d8eea9e8e39c2ea8190b675b4f98bd4ef2ced7e4ab939394a9fd66deba17427b7fde55c58027d4f9b97f26079b845ea87359cda15d80bb9c06e4f9dfbfe0a8a5db3859b87251c7fed37edfdb5d7e86b4184ec7f2ccb6d93deee4e6bad557bd7b4f75a04a2c2890bc356e3d1a8d0f7e9c51e4fe4008a99b1c68a7ed7021a36d40ae3fa8f1d3709a280ca7db9520b1410e176ecd51848d44b1bd2a54eff8926977ee743c8438bf4c31e5827240ac74fb46b76685e42d67440320c24cad61f590797527f7b433c7440d6701252a4cf3cb4fbcd93903552d2e71ea72cc5fab47eedf1a894751e929b03aaecd60f8542a15028140a8542a1901129bb45ea6f1f0ad5e7ed4bb11a7a9ee7799ef71d0e1ad0b045425fc48894dd51f4f53d6feb72e87efb31f4a328d4ea9cd5d6fa3538aabf3e10593726ecb6ddf0fd180a4729bba1914d41ec8f7e88fd91e887b4bc281c43ef3d8e87a311ed3d2058bedbcb9003badf3c50fb7e6cf543a1ef2ae87de759db6243ef51d0dfe285a31129bb5d38562e046ecff9d85aae7492c7e851b8270301511a82bdeaaeba542cb93917171c857211046b11fa11f56496140c73314dbfc0056b6182143016b77beaca0b1825d987909d0617c172cf546a5404172957a5b56a55a3dcd4298bc1cac10c542e18524f868911330315b74bd9e1e8c92ad30c54936a52a47a443c29508af5973255b03258ac8c1a56260d2bb386959fcb75f1662335048f8c10ecd8ad1d50b07c7e72c0aa3c907881b504005708828b284be041446bc62d2fe9a0c2cadbf24f856d9d524604c1375aad35a238a8540dd65639eb140d0800000008a3140000200c088703e2e18040a20782a83b14800b7c8c407462381608932887619451c6186310218400010118819991ea00be231d829503017ee523f858000fe934e6bd14408e7c2f48bddc293628b7668cfbd82a34b80ff58d0de48ee977fe6222a58955f1a59754c38eebc5b7c60c4662a7a14ad62fdf93d6308ca6c658645293f2e1525337a4beddceaa9adb35a60284b6dc3cd149aea25d23877de2a0634845399c9e97f975dc4b0745e765e4350209449ec12970fff12ca61edf472a8dec65c563683a5663114f67f615ea3374324360f9b59f8b8f8e925bc3c78bb47c48c70514cb1321624a297052b30ab69e8bf9920771daf3e3d61741ddc2d6721ec3530dd113343ddcdc17c4418420bbc44d145f2d1019cdca430c21da2ec409670f01d9bc8f5e1862ff62a1efcde85604ccf36a60e41eefb1c51bd54c743670b1d093a14bab127131ae1be6bfe2fbe49c2faeb40d62dc18686b29292347407b046573618310d36dbf6379cc9a889a3e08101d814272c68e62035168fbea7086647677a35f461cc0120f0aaa2516b38a08a94216a1af50e83a53f990341392ac1eeb63824c8f11cb85e3a110dd3b03e72638ff878994f9a18c49c83dbd9980321eb172f4b02603f81b42c38679fd8607d6870fe780c11b9d4f18fc5b767d9abc51d2150cb39f0e3c8242a02517254c14a400a37b0614c03a2fb04499aff770a17c9e0235fc2a6df0f0525d6e2803c56774c8da1946e0a8bfe47899b04b441d37e92841480725543b64421e69531b6530a15ff2762652e0cb33294d41af9495978a48187c25bdc248fb47135de44f3435d4c227b7496bfb3b49f8b91b530f7f94fa60080fa9f42be88c1634fda7345939f0c5e0d08937a205b297654355e34881e49438c8c72b0fed9ab6c76bbb98742a8f925367419bd2a3db73d43cf59b8e80988191b498d19aa73082fbe54b07f2f9e0e32917a77b9631facc2bb9a24b39108ec8df7f477e994587acb973b682fa487aecc635b9b891811f41140f41867221a81c41df8aa24bb1c86e2ba8055bfdcc9293845829ffba1d3fecc63b2256d91b01e1abb6f6483807e418ec476c25f1b2571906044e2e19d8f54dba583a52724682627cb320d59133c676da2aa6b3a56eb81983768bdcb47e34a4f07f9fc972a2cf1906dd924583587851246d84704f0e746604fb1ad19ea2f9db8a4bf2dd6689d9b0ad1320be5b037fe0e4bbc09d7a659b83cdf2c05c770c60ffe2f8509e77cdef3e6564aad574f657199f75f8f4d06bb80f0f7d322f778591aff05e6fa7cae2503f6b22a3a0e979cd644c86443a9e245a7946d7f13731c82a53c04771922436f8a7fb7e591329f7d456afe2dc3d73b92412e8c614fbde13a0a3ad0a82a6b2733b21132876a7effe14027633bb54b183c822787f1eff91a9628b3c1faf5ab44a14c909145a0ed886ea90d8e2d7e89577a32bd6c2b3dcd543749d839a898fc15cd9b29f1c933a0a48f5b354977e01ff0d5d021e76991e152b354721490af95754fba1039494ce715b34f82e2bf47ca3fafbf11f202f481d7dd457547616e1d373975cdc5a018ba09234bc86dc91d1da138f0752cdc0e5bf83d1397266496b774657556d41b2362e86ead366b7783911866bb7c7f441133891c063be15ca86d977bf421fdb963426a2d7bc8179ce6a77eaa924c3ccef1ca2dce60a6d93915a0ed72ef1efddd737d6e1ff3527a644940c341db1af6fa9ab93676ec97a9f2038332ab555336888815155d9dba9a1b8e03f3dc4e68fa81003aea8afb2fdb9608e48f8454736078d0debbc0be16a9e7101c7e6559e1e2f6b9793794426c564a0ac2612d2842ab453974678475b2391e0b8d9aaa26e1cd46f96de73e3a94bc92ae5d0f17d7e18528db4d444f2837f33d93a3f75e2e7796ed4b8031ee25d3c8f84bdc11a8298c821630fec94e76e46821cb1f975c3351414a4f9c48379ae87d2088ebe8b9116f9bc358cf770e9d8b61a4248a16d2909acad65c2b08a6c0dc60d53d09c59e838c4f0f1c716aab44e1dfd114f2294f033cb843edc6006664473d262991c1be3f261817066fab854d64570e23cdb817da47be1f9dac4394f8aa231d200dfacfd960e0f5cdcf96ae9efb0b07f703ca50b2d3b8b3d3cc0cdf194e84c676f3eca501150378d63684fcf4613bb32837a106310c9ef63e227e5c33872ca6ac421cb9e7c7d864352192a90a146e0314e5bd9f84ef527678a609848592d523c7d2c612ed23509920303599cd4a0ed794b0a5064d734c39e33bcebf80baa1be98636d1787e1b678d532253523036f182587722876f240745b41c385634f575ba32efc70fc162a1ef248ae23f403f5aa0a443145a76b9bdeaea3f92279f9c57af7c0d39d169f7a40b7159b1f0fb7108cee3fde500e851f6e57f394bcf7520c3da842c7755b8fa9b7d9b31eb787d7a2f5867d0b87433608c164c8ae5edf1c00de6db67c984ee2c6ff6c1a894f2230f96bc71ff709924c2d2ad0fd001e2c9ccdc735697168cb56063b188b193380ff0411ec4b4d77385895e7253b2371e3e4bb17667bdc9f226647bf9d0a59b1ea296860d9fe57fd70f696998460a8220749f2b08d28599825099efc44266468207b8df5eb5591dd4a00ec167e27ae536ae8e337931542554fac246b6f5120e0fc359051c998840edc109fdd81e56ce4ebbf9eacdfab1947f453bc034b3d2c27dc0928bd417a07cf5c79e225639a2f792a028de6885f75fccf8f71f70cc0b46c5f1d539a30d5e812f34afd09510aaff8fa4dddc0822549cab8e74126dea9a89aaeefb4f0307a083617586a0e2c508ddcd706162e22daf2ab62b13ce3d99d1fcd678e058821f5ac770d208c5078fefed67aabb894323331d3fbeb9b07ecba64aeea4e47918f6afd2256903897277bb1dc319c9cbc8e2ff6b700a2f99a7a9e10e4664525d6a821b690f3b41afca6d4b504aef3129a3e020a499760829b0086651e0fc8262e80ad8d7e8bd501481a2599666bc9a91f7e84f5184216793e54f10c1ac7e7214092632e603a6fa6c75c77fca21451731fcea82a5eacf26a0e2a06731e8f74cbdb7a77ba73a716ccdbd220cee1d266657f9aa96d9d1b9ab6b9a63ca7e56faacd8a19900d2edaec3fd32bab0fdc2280a4613f46d66ee7fe8523be24189fc9a1569d4d3db08e9d673e4eec35e862586773f2126ed00cfa240926df00a4e6471533fce91396e116474c3c0106f85291e72f4dc2f28163a115bac0c8f82dac4d72b96ef6141bc6c84a0271cc8ff009c38bb6affb12ae4df714c8d16bd880ff41bdb235e4f4f3679ed375198ca3c417d03bca9d68a9dcc8721a004479092519428c9942a80cf2d1fea4bf1359a0abcce9bc687105667e614333327cdc79f46d82a75f2b106c65700bc7c2fe13e1b3db829f677692fe3bb93ec59d188c96b38ab8cb27be0098ae03ba17e35966e73ff587cb7872717d8423254ed537054f98497aec21238c0916e15568d0a4bb2d348f4bebff37cd0254a121ba9dc099f059d1e26e829567f7ba94892b2e6bec56ed354a7c435f4dda696e12322fe789508ff8d59abae962ddfdc1f6d07a0a792b6c2498e492f0fc2a9c0e071981da593743964466e5aa8519997f355ff202c5b53f53c0df38af0b94cbf1f5f1c0a490c4e1e82d56c69188a612045c218c8ffbaa50dec70d26672b44ffe742e19a7f6fdd2663c58256965e953d367e1b1feec4362c335c1f6f5be3f2e2678df5accab67144e5f1d8c7316aa5637ef939915997b923018a2dafbf67e4c00f1ee5b0052d57454b90c204eea5b349de4f8658b1529760d362f51cbbac81f275aa24258a1f6119395a41b059d16923bb865a86be5d9b31bab77e9b0319eed1e88ee80cad6f9eccec4e0450aab8881e3b932d2cec9bab0c695fb0ddba3a238df61978543e1bd7e8555dbc85163f63d42f58e2762dcf7d05fc1e48984130eb09c6df7aa6f8547901942b079802dd79efc0763aa40d4a1290a9061effaa39b6b0db3d38ba62b4ed2e24677e4b5995d588bdaa417a52dba137a069e954c0bf9d893e5887a87478da10a3e5b2d238343c8975932ef3149c139ce0e52d704ed288279dd4108868e0c5fd4d408541643466f25bc4307535ed3bd21224e36b2f0a9c44563e81765c487668acf99733ca5eeafbd6ec2f03f4a4ab0da67e70c0404928832843367f7dd8dfa3e798cc300f067e646e4cb039be3f0b9ee84e2253a2689b4b233434dc537e5285d1385b58062363ae6ec809231eff1f258cf4839f6488b753c6b796ba50da9ee60ea084c936764dca09493d382871997036073667513e39f7cf84daa19e440b18cec99959a85441435bfd08fdf62e51b895b0c17d91247681ca79ede288f1590a41a93f991ad39882360c5ae27cdba6aaf167260429c5793cd5ccd9b1adef5016e64d981bbc6e58f84290e594de303dd5c45f7fe94c4ec6308e1ebc34decc3c5bc0fb7047d05e465b311ead1066bef6f532394d299dbb8d7171522e1b5cb450bfc9b4f0b8cf4afe402cf115c2c3d56f9f7dcb4428341ef1760e68a058af0e807bf42a18adef36a6c8dd3f63957416e08f4fba4f40351eaf5a009c1f3d50d7f9ed3e95fbae627b30ee21495855a4e512850cd9360bdd803bdf8449ddb9ec73db4f2c283f2ca602cb662438f6a1e227c3c135bcda7d698db6360d4bce879e81e189dcbdbd124c04d95ca03d5dc274f0f5011c68a5791f7a6c817d95d2bef506274f3b788c44a69464f2cb0000f3d7139b9ade9ef87659cf299f977d66c2ff1009b7178054ca3fa7db27ab62178c73cb38639ad5ac4b4f9c90c09897a5626750823fa3cc05a2537fd78f294db47a1f3a4a3f0df45231440ddcda4061a57807b421ec3c018ed87cd8fe48770cffb8825350f0ad8861e7a64cfcad27a32ea9370d26e0182db8f2db2c6582717a315adb60f48c00d2a966becb3e52383ca89c8012698d30286eae20cc8eea74f4011bb78e021da309366e49d047d1418eb580ae9b41bf260f1017d2f3f22b04061a0890d9da9683f7cf16a23336ad5010d61563857c890b1e267f11647ab93899b5f62151757564adcbc5202809efb6230cd1d19947b9fe6c38af442929805a357f3c9a3603cfbb996721101a13c5b2617512b416e7dec41999db32e8088502681933ed74ca29c75fe1f1352b4b94ff99731e1e4e79938ecda428228f29f160430a8aafdd90692c71b0bb976d944d1653f3c5dc8e567154bd8b756253e0e7580c0e6fed26b12003a7a8a13ac5ad76f45f67413fa26671ed93c0385c6df61b39bd6faaa109a0829e07143604f4801e5720458188e52959a5d7d6baca94f853d4c7065bb0bc0a789b60892ef01a8d6a6651be0a5803cbb28b5f3c3891b107ee99424b8d6069313d2ebbbc35e62c5805f0c60992c5e090ba1c32fd17e4d684ba47b851809d60113180c84adafaa24b7ec3bf08299051f3980117945db3ce2fd775d91574b1e4b3cb607a488eadcb387fc028e347cedd67e5163b6a34ab912383e3726ee01b85dd017e3ff17a06040f0357e474958ff9aa76a7c45c289b5ff245589b4f06287be8aaec2ca4b1c9c8f18a68c1954cb195a915f8b4cd8edde3fec5a9ec30fbb5496450144f8e2479b68e1e1ddc156405f45e28d0581eb1779d25c272096a1e856c190bc399c0e0c0d4d1bab1388b8fcc69e1997b1397ee0080afac909e7c045b2b181e6c6591e4ad92ca8fb6ca2e1602ba3d5881090048e7cf52791a5acf6ef22e49d18cca55ed2041ce1844555aeedc6334ab92b724d2f8962b5c264750a3c11f111af0fa4befeca44aa2c441726bdd51de875962ee9d673d212577e0494b893dc9f1f2076ea2b3af4555c2499f13d27d358884d030984c59edb302313af9b802246fc50a9664702315ed2c0bed99864461bae88b3e40d254a131a20a7e6ec4cb8081b6282a7be3a6e64c3ad1a0134be3d5dbed2c6932403b629b448fb656fc6562b68bd51bb069e162e09cd03dab434501b48d40481cdfcb9daabd62da73ce2a8a3bf20fc615f166713a7fc8be1ff082195134ae95c96247a4ba918f19fac2c26c4d5523ac3691aa5a5c132a133ad894579c03b3da7628cb296ffbc0f1c02b26d2fc7944e67915601c2d5184b79ab07f6119d595eea475d0968bb2046fa9fd0275a0c9cea1a1ca459abd0e309f723f2d4fcda9fcbf35c0287cd846c27b58bfb2df41090a7cdda70a508c473e33e733ede6fe8faaf627228bffe8085ed2f40a6936244ab85aef85c5bca5d02e0240350d4b564f65d6f27d3b9097fdd8260179d0eb1fbf33905a9dd9b693abe278436450cd299399907fe14032b97261eeffdbb20785798ad16774c7499abc7565588beeab1d9b62c6090d89c31a437633e82b1c861d126619c0d2537069f7f30edc2a2b3f89c9c0ef202035d7fda3d44ed9e65cb9b50b349766205ea63e24fc764c26ee49702dc836b427413b6eab33a95f77e0eba02375da3544ec7ec50997d46808267f42baa67ab44ed7d28aed67c781f8849c86f18abe4ef4c52612525d225ad2aa9335e7a7b6da33585bf1d6f4b592e853ea40d67ac1eb14af71ddc3b482026049b7146318c5b95051158bdcbe53a46329280273f235588625a9e726ff33c793ee859d082bd3151694f0f89028945fed400869570905306138e668650bff26a7f1b02a89654f0db86780258bce146720f3a14a80fc0cc503cfd3265ed272291cba4651cbdc0e4c3d54233b67a994ec94071e17b10fc9ad959c6863de13a3509103ece71197154f810b28aac71b810b982c5f69555cb0561bb3ea3b50ab5ddde324b7c4c19d2fb1972fa2a3b74e4a10354df1de5d49e35a79a8291ebf9b2fee7f6c67fa79058ee19ce729c060131d2af4fd861b510db865088016e153b3050a407f3d8754ac56616cd460a130f98c50babc8e9d575658cbed9d1d221d8b00651cc208058afa0b8310e85cc80a7ddb6eefaffc2e24f7a9bb7d886f1ab89ea8cd108b770f5b4ae139cacdff4a5753a2cb2a986ecd8d1a5672ae03184621fe4e08e210fdd2d3253ed57408c8d9f8a1727bf22ff4810deba87d44c8ebb40a3d7b1bb00640567909b401aeef254306c34412933e4a83fa0f614c494617c85cbd19061f9e8f1cc778453a8f749ef7c45c2ed2a362a8a9333c781fde05dcffc47a7280b957c8e75dec96b78878f9f2eafd40486538f0dc8a9e39944c785d1369c52172e5804b865177c45ed0e44dccb5bf2f1a5a6ab004e73e5fea79926bd0cea3a79e3a93618e933c9c954fa3a37395753930b1fafda91895b12c721f475c1efdab64105c874c130a5755b2daa8d82f4e39a095d9fa488902783718ef9ad1bb24e65ad1c63d9567cce61e87f6b5065a3e2929eb8d70e20aafa251934ecdde984a68e2f1955c91ea19b4e72a7d97c4eb0f85d5cf6bedbd8b12760395cc5b1f55fd90b9dc34f130ea2afad88ab917a9e66a61aaeffbb2946c79c6b23b161440637c1e1b19d7a79d489f52d347dad34711c3dcbc2a220054907b8b7999ef97cd1fc1b298a2a2864974c11208252cfa11882f9bb40d678d9d05956cf293512ee9c19b81fd6469576f48e8d1ef735fa2adda5059227711937d7cd7fd1b4f82fbc2b83b198759043ed751758359cd6da4fe4951974b66fa6156f5200164607de9b8bfb0fcbb561625f65e683200c49793afb5cd2f7ae0a9d5b3e1aea03873e66b1d68336534a935e6574c593d589b44017bd5c1442d51c1377a1cf7a020e84c220038eb037822945d2066bf8bf94383348cafd4ec43f15f965eba005dfa38c5f94d79dd0173418361c2652c4ca4014c6d0cda75a790a6c3b6c77e75d0c172c28e944d97def7b9bf023278373652ac0cd40851f94470874ec892d80e4205840504dd402b76863e2303983f840333d48bfc470146927868b43caa0f9fbe56af036f96627567684cf90fb8bc94437a27313e898aaf71de55d93720a664894be15e04e6b0692eaf21fa7ed279f8ecee91c9fd8f467f3010c54e58b8c3ee3cf83588622120379851b4cd506724796c55f7c137466dd480ac5c23d954a913415362dc572455ae454a2fa6092439b9c6a5632d84ad71aa96dc8574cd10d4143870757fda0eaa43bb958222f8d4f7e664e680ee7214a31420da84cb1fb486fae544dce469705c01619d9c14777395b892979c8276f4e656f3ff1923bf5f7da8e5dc75a76dd63ed1027b3b2512661992528744afbcb8384dc81d9c1addc6d13ca3b4ac70f33e04fb5c09c61d7fd5514c3109453fba7f7376747d22356e95a6c70e4c2d30e43d4f8e52825e83f163451592793fb1c708164ec42cd069b40ef372faab79aeb5d08e02aba14c8f89772c5c113ad6d4c635d718db58157d815a4a540b357f6686b29886a4aea35b1704d1423e1ea514af9eff46b03f7e40c146befa2e4a082743a62e493c56a59388c72c3b78637e7bbff6969afd01bf16b2fd8b8e0759dd5281b2d690b5445a2600ba3bb5515997af3c8d70a40faa3c1b6087b63274a8b953c88c22225637f931d6317e1d340abfe51dce3c8dd119ce2ef6c68a957288fa3e424ecdeaf16857b9189727cf047ea352b7e922e6735381b1a3e739024cfd994f4354e97e3df4227f08e61f1badbf04485f10658a42871c8f3df3f360f35c3990876a23d97f40af8fcad37b82ed38419ad85d44b05b3792b69bbf0a538118210d56c9d4333fa67820e086f4e56ad466e606c84f4cc9462702153efcefb9738e769f499ead904a0a266ec8e39eae699386d3d1a7e69c01345e61371e855938d850fdc6fedb294ae41bac012c82413f3f2f3488bda9195b8929b8c64d9e603e042d3824816f551d775c02bd3e042014622d81ea1455d3d8680b9020ef09b143345d436b4465d050acaa6bdd20dce09b342c0965c976d7e9c25811478f4935897280789c09e052abb292513246b7292ef97b1517837dbf7584d7826355e0c4c82ef4bd88cbedad2485170a98539c7c72774d0b2540bc64188c89bd4c05e44be5e66bfae8ca6d1844ac0aa6cfafcdb2c7ea527bb247fb12b663922516994b220407241a8c15df45c6b444b39f42ed0caa334e947ecea01e0e01b4999fc8495211cd2f03f5342e3dfdb1f314381cdca1b12f74ff7cb04bc79ed7b1a33347745c388eb07c760114d84ca408d1c2c6eeeb920ddd7f4b89be9c9c319e6a46769846ad9ba88646391849671d1224732c42b43c5fb2675a15156caf76d5d332685408b87f92245e70db3c999e57f8ee08e4cb6b836568e291631cb5a634c018363113cd8b3cfb6bdb6e542bc74b74e574cbcda6fea681b1b81da88f32a6412873c804b49388c3e136da31179c529214288ebf626180cbb29ada0c0e92697a3809ee35d5750a928a5a01ea0ac8e4f3cb615b002bca4909acedda0f333409b6a8ed4e3245f99bef2a4fc43a73bef2fb7e0e3d0e7347db10beec567b7f6d1a0d95bd9ca1bec8a6c67c091fb30685e80d6f9df290de3f41b8bbb3a4fec9566cea4745b2db16939930ce3bd515f85d5b054d88475c0bda4162217b89aeb02acd805495fae0b5827ca969cdcf76bd89480d51970bf68df2eea4a53d0febb1f76761c0d640586cc66e62c8f85144b571096a6c834dd44bbf2ecbc343ceee97e0570b77cbd8194313241a8d6f814684919f26ca4f9db682b84a6d591f1627ef86871d79e8a3d83d84f62c0c77325bb241a1b45e6580df458b80d45efcf3ea95b322aa279a250de6927100e51c66d354e259170e4afd76033d9977cdc7e34b2846d1e69aa3ba28c12c3b476e67b7b868fa73353a5cb2b228ed5ef9e33f85869e1186e487e5fe96b16a9b5a272eeee82fbc525cd913baa6052c51345e9e75a87570bb2189594c749b3f56d395d3c95392e2f4efd9452f95615b5ba1cb1786d18f655fb0ce96ea9525d003f817b37329f8c345bf4eddef37d1cf1bd719028622cfc2b325821db19f7ba70ca00ae07fb9e6ff0df889c884134f86796a680473bc76ad9a9b8b79ee7ce6b782d652615554de6fed04bc06d4c5f3bce8afa8171c83943ccd4938b296410aa9cd437b9fe052d0d9d2c078716da054ad7b430e9c20ed62cc48f3b0b12857949afb94e68e2d7779447ce82038a4fa8b21276704162160b5ae71a9a9836070e28496a2df502a8c404f5a13b6880185794ac46de8f1e1450c069cef43213e6d7d067b47545ed0a2bfaff20f11d798c13cb7c0ea1a29814602aca5d6a7d1116f97fb6bb8928afe32fc443b7e03448dcf4874939d2fb9dc54ec2be43f11509cc9bfc49e80cf4552cee392d321a1e4529a54b904ac7a88097663d64d949d90f9df9482f866cd027d9394816b029639427f392b781a70971c310ae20e3591e59c76dec0c768c1d3184d78891321861333118b865d15b14f08487316573211b30fe70bd8cf11715acd5278cf10a3bea32221d5269fefbda5878ebf5e45ddf2f580b1e0a1f19e3bceae34a3ca7159d3fbb125fee3b28405df5d8e0ae8d9c9cb25ea15711ee33faed09b2d18771b047053ee9db5f54c8451d475a20e5a17b14d88d1c8301264099a13358d0639bf96f600c542a812424348cb027f0497f9fe7b13e5732f99a389429bc1f11394787aa361f293dab8b93b52a80a819256b34183c7a99e35c1017c6de0eeb1da011d07809e703394b3ec37148ca8fea80e8692c19ee376cb7c6ed665c16753b526e43c32ef1f1bd40ace941cb2aaa1e66452427fea2ba8a75fab091612876a1e38d134474b6dc3ad6b9fd9b3f94809387112a9dd0ef897e794285fb66e4ac3eb393087579e873d8b645ca62407f0ab9d8095e7d9cbf75008d63c3906ddd2f69b194ad87279b308c445cc5a508f8a2c0227180d483053a945664be07935c3d10bb00bf16f8b34444fb3566a0bf04d0df57bae4bdaedb39497190f3556c51d19fd7353f41971cd0b7ecf145af628b364c841c6d99ded3d8eeaf3d12bedc1288585c112809dad72c3a1141ef622ca7cdcec4ad074305f961212c497d5e3da196ea4fa4b87e00ba79012d0914e225461a172ebf1c89cb49baccb27c31383893d463c2ebecbc5d4e4a2c3b54d0e38ac21b90c5e8a7dfd820d074d70f2dbc5bb1c3cf01c3d8153fcfe8e7768d801dc8904f5f2a77d0b8c91dea52209aec560413126372ae7adc81f0b6ae0d884be4298a59524ff80cadf0ed8b13804f9ee9a5376cc241d093b5d04bb43d01633c1c95082b975a7bd22f27878793d7bb7ab12a665cfc727bb4b30bceff3740683a3d17ab1a07db3e5aafece1ade5cbd1c6506e4cadcbf36a82c44c8714899b699bf1a88637b66f2c9a529b2c3875bf03b4d20e451bb4411dabaca8a03dc5cf031028da62da85bc971de37975f9f4d787cf24de9f236f7fa543f59c33b8da97a6c43227be219de69717263d78605fd8a262ef3bd56c1264c03834d1dff8cfd00fa49b9a18e46bb76633bb89227e609978cd67678572dcfab9405093fc8f92fa9fe8ea643ea110080bd1bb65c107c6d1516b5d8ec820abfb7948d8a91bccedd2219c6f6cb123ae369adf1cdaf44512d425acb64e3229acd232da5259af0681efec2a944ffefeb1cf80774e41f96e488f2f4e3d9e5252364cbefc358e8a3603e4eab29bb9362d37c3a0d0da615934e2d83c51fcd725a16454ca4389ea59efefb34277ab9ec678acd1c8bb2bd39db618a5816098fa94d3fd1207fd74b547ba1db55ae113048074599f588083968a4b4b85c0c84248c2454c3560c5910b455b2a3c58afd21f71767247e475082ab953b7e45f5524e9582465da05eebfbd6997e4f992b2f4f5a4db881c06c0a4d7d67bc1f89ea57781af84669ae280a0b005cb07592305274b13c07cd274cf89909791e90d7ba5677cbc703b3ac5b6a2bbc0458d9430b0f4e52040706b70b28e0a3d51edd8c334f4659e53ce3ea64c5818b52cf7a23b852634ae66282fed75974027c7a2fde03d72f33a0405017752da647fcc6586db16759d20ccd138705eb10887dc2b1bb9f8dde688f2e05b4cb06bf1f171dbcbd80c00711a3b064f5078878e0587d35072b00350cc416c71bffc577ba38cfe9e967af0126ee13f70d83e033a285c5d09334bca6c27ba71d4e8e328cd8a3824c3210daa9f7d9a57878468ee0bca12ef01190798b1a3ffc4228f214d449333111590d5e9085957caec71d2b76522de183abce98e283929bb0c3c32741a628e284cf4c42337dd292702d28e9a063b65193aa756b9b1eda37e107a249721fa66e0f566e236b042477cc24498bb8e115ecfca982a118f28991640a8502217a6d9af9a44964c5451f78eacb86ed401f0986db768170609ef253a239de19d036e78063c364888868eb4f10c2f1111fc102250502d7c51fe605aa6002b85e909bc48b02bcf7759d2e4d8c4208ae03b9c850bfd5234c496ca985aaeb6efd7a03c2916e8861f80379887ace64a8e5f198dbcc28c6d44d9c4ce7e529bc0ca89ee8dd376702f2b4a8b5c505884c3894d7888b7a620bd351be945398c0a85df348a5c5e1e617938bd8799b804ffcfcfb56b9466af445b4c140b745c255f69a6c79349a4c32a1cfd44aca486ff290fa160413f9fd7e16088e5304ff2428d209c36ddd3b0f651d636f423e24e3320371b8b03a12f390054ccade002aae2422e84fda2f007b3e7f929ceb911de67daabeded28e3995939401ab1ccfed6cb211e1fb8e9c187518c63524fef89127360f20a76c851bd7c98df9980922f9671015a120dd825ce4a4e670314d0d5923d733f64cbb2ae0954e47e2e5c9cdcb05f3f7a0d2b91111e5c1d641c654b3f12f543fbef36f58b32b80270d27e48eeb3d44c9987368972cd5938890eee583a4528daa243cb9d2ade01318176a1ec83400551d746c05257377d79dafe0e0d5e1dd9e0445983c947223a40ab65dcef9f373b469a651da47e74725e73d077ec8e6965439cee220736b156d504384abb47256734552ea69b7e3c8c6aefdfd39f684beedfd5addfe6a32c8563234d1c9b611a3e59682de7efc3f9cc9523a56e9d1beae5aacf5140103989c2fc295ad7a234caef29f09fb5e6c8108683702b27debefec2078b7bd8f30d63b3dbbe5a09ecc83aeafad2f8a7bca3eb97811049ac0b7062fe9bcfa42ee160a889461a9d8480ec0e816c7beda7fd032f960be7adeab3b9c8caec1322938b0c99fb87ac18e95726d3589a2bd914ee15614c8e2878ced75a91ccc2b267971f6206033d6c40842659c1870f6f464d0c4966ca4eafb8389cc5c979f83f208c3a8d5ea6a5ecf2902a3fdbdbe7d55b5e16bcd1e2d120c58a4eed2ff44c5a23af32a21eafe5274ae675bd202b1781b7b977bc458f31341cfd3a5fcdcfe4d16fcb1bbc71d36bb536bc0b41860ddba15cd57ac95a4ee5a80c2ac4628206b616561048263bf22c5ff297ba0589ea6596df46e90b8098d1606bbc0d8cb5c1374f38568380e479d9d93ec01835b218b3ed3b6017d4f146672bb16272407914d98677cbb03d85075738d915435a98ee133ada2bb344c77f03229762d1a06247fe9559683c493fbb80a63901fd4f30c9ced26ef9665f39a0cb7827a2303ac124d2cab1ad8efc8815588641a00990e4063113cc3ce6e48e056335808fff5bb61c61091b26e2409cc591941127f89df7548fd6e0a8fdbe87e72265b03bff47b848ce41d279cb386505bcb86e1512a82682e08f039accaaa3f1d821f8b8ea833e666c2bedb0bb1f41ce8b1f41b25704321c5dc7982e73cbee39979d9c8b07a7c1ad72f2455de5e6079621ff4397c95624d4c4e44f563a56fb85ce99d6693187bfcdbc7ef206e312f597f6ff9b4fd2ff8f234c3c873d66afc7ed2093f3fa336ca02f5d93830634cf50cec09e5dd3433f6de986aeab6a67dc425b6d72fd445846b305e31347b76ec7c9e7d26b0228e50bc1cadbb018cc32c211f40973cdf5a195e6c31f891c26d75cca0749b4b01b4d02309819702979098e58cca06f06ab16a7ed5b09ad5a57cb942e6bcc010428c38bce727881b00cfeeee52de91335e62b9b31c3c7e1ecf528d05502ba54c4e92d902da8bf41db79a83351565998c25dbedd2dd05c068fb2d08325c480095ba9da00320370fe0cdbbd9672169adeb1c5c013deb0c6f7824e796a75f927ba961c7da8c82de7a2a60552eb63cc2e7273ae33caa3e8c15def0aa967dab2c1235d47204ef60e8ac14ec39c36dc66272a09d368693d64e1a7d8548b501b9d64436f578cc0a91d7fa1ebcc0711a8a396a00f098dfc105b8fc4450ffc77fc1bcbfba6881b0130f04f78fa6199ca3e2ade1e464b2d54c3d9d36f3eb5f6c814e08db0ccc8a76b8fe0aeb85e22cc28c6b76c48ebc9e4c936c8cbfde80d50067932a70488eda1cc5418fdf0c1161aaa3389b47e3568e02efc6a8476a7a1c95edaf4cebc1693e46c57d739fe01def2e988f36c9a2d86089a8205a8f66a017ecd373c5fcf5c9a7677e5bb2564ef4187fd61ef230d5bedb92d1f3376296d6a1f738f8037c5425e256e2d54a054a277593a3698de56f2b439364c9a8ff736e74e993a741df893fd7fe589cb2097de9d4892cd0fcc27df14b77d7d6e2a4e32781d442a1e5c3ff5a487038e8bfe5c3aa06a8b44c53c4e3fea58e58c9d6d59e43f9c455e633b397bf3547d611b6e0fe3263b90fd73e503155d8135139d6ea9bceb09dfcbee6b68d518ef4833102308f05bdd9bf5e872d11da13a5cea7090c6215cac0eab1a07306d73731c952939fe242c1b2898b4ddc289d37ffe24a95ae4157389dc9d49c8b8f6244b2b55150a2b45e149a04005988b148c8820015d5117284e9fb3b9a927bfdbf90611f5345564eac866f1a22c833b2af3582bdbd6aaab9d683f4e45240ff7aa142329b53ecbe889501b987441c07c799f30585fe236fa0e10660b4c4bb9bc5daef4d047f0d4b9e69de3d5198d97343f303090520fd3832df14cf52cb583e3a6ae78a3e313981ecd011150c5f52546ab710b1d5064abd2d6e1a250b1e325e8dfd948e9b4635af7f821fb0f95e8ae8cdfdedee00b85f71430b41905ce800b2fd544a4f19afa98c9ba5019845343640308146e5ba8ddbe8db12775e516ccfaeef95d2ca8eb6b4b7c1fac90cb34a6f0fe87649fc06acc9d45139c4b2d0f4447a9589fca8468efd3465d36e01ae6c6a556df1417ce4da61366f3b4359e082c43f7832b46c64f52da8cd249d3c30163eb948199532daba5c35013f8ff5c0f246adba9cf79a03f0ef80038feb71211ee59bab93d725d11efff58b77a708bca225c6b40eb87bd468051d9028d183025c67c6b9b8e7c1907b8ed204326cc6ec953a385a8b13b532a145d74d78808b17360117c68bef7be55f3d8f9f1910d46be16b86c3f8d810235cee45e0945e111541407b8f3898c8ba21d73806765582bb4928b726323381f05acceeb205f0f65fe50fc70b016cdee488d459c4f6215b24f8e0f5e5dd2c0bab0a1b2adadddafbf6e10a9ff2ecb0478da5d73ee4691874bbf53af8dad139cfb2a97cc9f3b5be8edaf5602ae0f6b76fb911353420ad352d76693d5b827e4604f7d6ccc57556f35a9dd8a62b4676f062a3f9e7f764ca50b4bf98e15c5fed57208ec61e6aa52410365a32a65e31a3e93dede1b81ac0b921612618fcaf5137f0316924cb2ba91afbc3f088b3412f0ee0ea5c0f05c771a6c00f637c2ff4dae3abb303c073a4860960403e720c204e7f1fad39709caa27d337b3d8f572b435cdfee518661a1fab8e64c7aac1586b56135d92d04ee9f4d63bd516c0b8373841cfbc5d25c7e808eab1e4561e0a7a93ef7c731dabbdf6405a5f8b1bdd92a736942ca38c1eb349ee051910a27e10fa7b91ca5c36b8823aabef1560e81e719523f575bd954e8e7339e6bf5a9e8898e34a5044c255519bda83282a5114250c62d9ee4ddffa2f527888c3ac010c8901da01f4464842662a07192298eb8ceac5f06aacd9ec8c095d83b6fc4750ef763061710191f7f4c928bf0213922e17cfd6536e7b33fff955b81169749f1a24fb6bf3cfdf9b97156092585e526e78c3784ac03e78a6972122ec1f555c61ad2cff36ba604390421589e045a8d8b84c40507adf6880059aa38f437afa672929e0c3aab215180009ec6aac1beee8a69193f681eba3c8191780fbf1e20b8c2f1f62a7a115b98eb1e41499b8844d362555183c6e3eb8d203c692595ddf8712006d00f7be4fdc6b42c90b9d761a1a391f2804a517fbd31befa9c2c66238b965d8aaa705457bf331492926aa7fa412072f2a55d43b667c3572a716943480992cfbab67cba785ec4599643d24691e11e90ef8a5fe71226254ed1578e01342370d100a0b908d55a319bd39f03b5e4f8ef37e08f08132b861af9d7cfa2472173224eb4b1c38bccc3248538457c8053a530a8ae51adb598f00526cbfccc4c04a98af0306c82a11749d0aabbd1b6b792271985770eca1f4997a4ab0c6d8d5338515f50a40d8c8459d845a8b275a4ef9042e753d4f5db404563f4b071639572520742d9187634997d189dbfa0de42ef91b8763fbbb5b317d6ae28543b9d112125506f9e16be829ca297f0c1b3df5090a63763051609219350dfcf5fa94678abcd5be8ca8339671a17cd1c03ff374ae99f51bd1603a2fd9322b3e8e4cec10fa41f4cc756bc46f3a1ec5d0f301ed8ec67339f317579e66fb081581c28588ae07f415013c91c18fba3b17708d838dd92f789e061d1356d24ac02c0dd0d8d3ba44f89d5c8068e967ceb94889e3e9e87064450dbffd478324cf4270e13f38285755964f537853fc403042b298e68b8368f58259cd3b0ce9bb468b55bbcde7aa59f90b3b4629364c128dd11106a82541c474d47441defa9a7f9938c439b8a2997211d64c9642a607c27432e8c6ad1ddf089a30ec1f4509bc0c26b922cb9fd16c68cfa4cb6db18fe540352eaead0413a5469fbe9a65cda02c7ee85ee788a1fce28727b3a4e2eb0d320e1b568b040b8c4bb85aec536a096d12d0c2ad7adb391190e3a986aad53d1cc8640f6f42e1375e6a17673b6af547e90ec9d18f0c7e447f8109d111f3446b3c72ffbd4e54d4e95daf9d7b1e57a0a8dd50c5395789b2d50e58a0598d51e682997d6239a6235c1e3c1d0415cd0226df024a5d5a4c27010ab4488784b62d83eb2d66ff073183d34b028a101ff8c223eac5731199bdbb907c02cb845d3abd65008a26b44b5ac8195b12931140e5271483179949ecdbc3599abef333c0305bd4f7005d9bf6366428191c05f3399ce9027f82b5f5812e71a14ed8a77c4d0cd7a8b9084e4b95c997e3b4041a64a454ff9410ceba45f069ec5ac8f434dc2172e147c05c3c255a094cd68609be864c7187b95aa7c5ea772e295581975fdc8624c10bbb847b41986a1a18f6385930a229bda2ed9acf82e043662dbfb357c6bdc288f4f2f1dd9f77ca03ff6f0466b223fdd86e13ab702b56faa9a1d2124363f76b2e59dd73d62910cf27ca79b55bcd0c179e0a1eaaee09b3109ccfa525ba8aeb28c5c329b5aa16eb2b00aed95bf1f3d53ea74f7af1c0e152137d7690c7e59a8a7442e6505a20e556a8c6d0361215711ab69d2ecf02ca479a40cf4479b4d47c8e082d13e4a78a1fb250f3a00e2a7b03470a6e790f266847048d73c388ebbe0576a69a21867b50a56d3240b84eeb1050ce30f51df03facf240fc2737b75f20f8c1f0bfc00d985ab818a44c9c3b43c214af8684d774b88823520d9986bdc0030b48be3261e90744ad06447b62123fca6aea5c073ab635d7de7d15104668d5471c72af988a05676de3d14e2ff8b2dc947626ce4987912034bb469ec6d324f24d2e0ee99d784db08fe7cecf5b1a85aa0558531a752b115c0f2902828ced5ae075662a5715beb97eccaeccc5e2204c011cfcd0ff0a73b3f79512a78d65da5f2c448e41ef030c2b793a33b53233d8ca4caaed376b14f1439904c84c6a534eae9459c69948654fbe1094bcd09848c0bacbcc65289c9ad8b5acb7253c9e63d59047c13374ef98a28495f3dda9c917b0174726125df9f9242e258eb46ea183b467b38bd29773a06ae66edc46e5d3ebb7c30b5c5ba2d6980648505cb5769e37af64ecffc9c9fba4c3e1236ca722b7740ceb09f8f65017f45029694eb6ee9366a50715d36e507b1462eee151948956beb9ab25824611e58059e24bb288efb57bc0ae052fc7184c732962b75c3f599088e0b2145dee4b46cd260e50296eb3c4334b7da4757d30da6ee8a3dc04250ca2ec6158c4b39c02e002a30545b021a93569152362e60a4fce5e2b0adc835fb1fbc91e79c5d32e3bc4491944abefef218349fefe0615bb64ec6086ed398ab56074b98787878650a5d84ad8688c1a4815f5be54c546513d381a6e744de59086391621abc8062f4523f4a3ffe4e9355cbc8ba6455ca6044d64691c215b44bef2ef281d8a2074969fc411ce749b3f8de30346694764432f467d152053262610252f89f67f47204e3152dffa2b00d39b122377c1906cc63ad40f38e4bc1dc49a3606060517cb5453d0434545ea8e02870b859d2797991933fa02d40022fb9f4ec487b812a6b2c551656b6162d6ab1759e212cf2d42872a43e0e3ec372d24f37d0f7a0e6daf41a95c80bbff0e0bebe6488af7971bdee534414e3251f37d3ac799860e7f5fd4b5a093b152940a8b4bfd6a2994eeefb0eba935904531738fa657f40969208c7f7f2994a5ea02f7a8ec9d0dbc9c4cc21d7bdef28a753fb66440fd19f869495b0254b3fb5a76310280719d06aa424d6c656db36ca44013692b63648166333396415c843628f94abe19067717ddea9b9b8f4ec0f5173844da8ddb29f5b633229295c741d50b64d846a6919f798061e383158e3dcb2dc83e171a1a0db89c16000c92fb1e903789fbd75ee15ffdf1e465c35fff4364afbfaf0d82d4a5c1b64c31369c2a72b2f484b7b5c773234f066760f09a3b486519ec1804b14f5ff005528f40c6c140be2b27d7a87ad1cefee41d59701c540c5fe38cb3f408a28ae60fb1f489c352821e5f3eec3b983c7e84f070902cf36a5f0329dea20ce823e7d52cdd341faf293e4d3fca3b6b4f59a01d18d4fb3f0c8ecfbf3645782d48937c02f98d68dc1790220554f573186f890bc1748a4597574a351d09bbe7cbbb13eea38a36032b7520b900d31dfa05b628ef1c880c30eede5673e8ef87be4c7e1eb3e55b866e0a79dadd40aabd51e921593fb3eabad598bcd788bf04b2c9ab31c7e75d4e10c224a11e9cd4ba65f08e3cc21b01dc220f0f6f5ed04294f40b74bd946c45b5dcd841042204f87a0c9717aed7ab3d2a7e0cebbb3119690915dc9aca0012a7ef3130b7536e2e6ee58f192d5b0ac29fc0b596748b9540714395b971c789a720136ea2fa8be33155595b6d6d6772a90b580180f8ce6841253249b30222e85683a470d91e0ab8f4b70bc75d09e98134fd31aea8ec283a8f09de0a7ee68f366764003e7f76ae6ad0b9d7cd06599c9ef408b1dc97c52c82833c5317b09a78b3d65a375e56e4778f4b56e9b52f5b88efcba089e1a16d9a76bde1d1a2b4cbd5482a26a1aad7a7c7943776cf268f8881cfb7c09d80e120685fea9d962354b9b78278d0108992b8e7119a2e11882358e84b6a0ca60e7f372ea5a4288b6d51fb7484338e9e5e9c055cb4eb64f71eb6fa4a97ac46df0ef065bfd2fbc7191135d0314496d5d6f6d0d4ea9d15c51499160462b4659f6f67cb5066df22d47c1472e245c4bd146381a3aa6a735dc80d6eb96ee6631cd488ef3e049664085221c92cc74329a41edc4081a040d95204220ac4b61e7d42aa30e2a0e28860eaada6da05f6e0679e86e822c548782637334fabbe432b30e7dc3e7d8b0a66d3f8fb007fb6a188bf7533a02dd17b61429582066fa45ea122d13a8f2f60397ee7b184d750926b9fc28f8c4a6d27e452aa3b6a52f239f446ba9eb5507c1f3ab679afd9efd684f1845eed7a9da8cfdbba0bb96f3a2cac22efcad9e5dbf43cd628cc9c14b5ca529d572770bdd9507b3de01fc7ce78bd3b4d4fb9ca8ef177eb6d58ddd0812329467668e28bf966fb571cf5643c7faea3059afbc912ced37bbf97b964c2784b009f2928709a1825dcaf8ec062162887248ccd996342aec5b84102d5a6808ab3063cc6f35572a62e1d60575b5670401b140f2f797353a151969c240abcb8a20228c53ecca4065eb49f49c471e4955b3b000f70e0a4be99a45fd90938b70e66deacf1b407386deaf54dc40afcda5a6fc1ef220c125caa2b68bf22ebd66b1a2b164d048e9b91f043cd90b1eed4d2ef84b7a24dd553fc67acccf4008e53f6b294901957b12f5931b6ac2b113317a808dd0198c10ac51bce247a1bc793b8d6e96222823580bcf9d5e2f028cf6116b88784fa1477a281d1478ca9f35bcc636c3f7c5a281d85d147496f99f93eb35db15e8cc61b4d7efc7d2b79128fb569443dc1a64dc61fff640d6f6c766e0d12215657bfc6f62c4750b4505f78ac4e10a64a32fe686b7615b69c5c0ae92c0a22700f846c218276444d40cbb17ee03299ae07c477e25768117b896aad7714be3377a34a3d45c14dcb5d9f716d6a977369d902cbfce970841ffc4f5af51501f3884f3e731b1a35867322e79ccf47e886d3b51a4a280833144b7a5474a04d89b0964cd6901b48ca40eb973c2bf394752dc574425f982846bd873182f02d91024493f710e6c14c9b46c4a1c08594c76df400da0f2e01a8857bfb5a898582d00ae02214b6e6ef2c3454378e5c21489225b05db4ca9352e449d2f2eee4e5bdda8cc85296e8ac50286eae97a543630f61db0d222c49d757cc95473c494f063da26680a3b9513ee5830a644aad338cc6feaa84f8582bed672ae3304b0598e44f3afd3aeafce0814fcebc18e38b4355e87072329138114b99cbc3556467c8619dc2c96843a39cf5423fe3c5f823b705ca74b8e12b46a32ad5bb82ab18456b044bd7f221badef67c1bfa5b8b8486a96f32ee7604e8136b2d3b1463569c224fd5081938db3842338759a1e62d8975b51cb035efb896ecd57b988c9f98db4b8094598883b5774d6e1dee0ee66a529f4138a8b523d5f4f2ba775c60f15d6eae4df50db6d3903c251f32f6e456bfd982dc5d33e1a89a497b79b9dd5ab2b5bd0f546a63e5fd02c775124834fc825ca88a773ed052fb968884c1f2d86d71db0831c29fb86fc8f1f562babc4a55819fdc726bb5025497ff15f070fa2081c07cc1041d733fc712687c483b40499f62515e8b23b4cd6136430e1f8114dcf68937942d3cd88069bf34d093fd49edb71ae438b505b0db13f7fa85fc3c3f90a70a73c1eca04b893d396d5ce548a608b56aac3f461f3e1883c6b6145afade6c7d47486aff547ffa1e309464cd51cc8abe60b32dee670bf29f10c5d6c2f7b35403ccd563006149c698f491129f04805ab7acbd67fab2c9f2bbfe74ad21faa31db21bd92974f4ce58600d52c957c734a6dcfc42d1043c1063cac03d47808d022b21bcae03ecc905fab4299a5ea87db60ca89c75f3d0d2d6df536c884a9d4de24943b1010180183ff4cdecfdd7ff9241fd9a3f61ec02c3eec0649c7ef1927276019a35cc76d40bbae92d2ad134498f5c8291206df0f47f7da3b3add1c53e52f71b8b45a48358c0baf7b80207945d21a5a14b029f29c6c70cd2d0a7bdd7701ae00ec42ed4f9ca8876dbd0f5a4a714e3329225f7429d8bef3b3c99d5804b695a2a18d2241c265321802d0ca5994d49fd05fbc192997f3035d7f355d2f03040518916a39b8fff20832233f1f635301b10479b9428b107196bd671ad3c79b062bfbda63a66242763aea0c90d8f195331cf40e55788661425ecec129d767ab7dc62db50a9c6a84f3822163ddd55f8aaa6f9070b4fe71b9257f7fe4279840e06a57414ff1fd6f14506cb6ae73d3e82b04d2cf3a883b16f3c95d1a56046b6b242048c0990072ed398f2284a98ede53d156c3e4e8476ff4f68ec85cde5dca377c65af6f9b4c88d5821179841d8db743c4295d300d020c28541c4b5389179e5c20b3989843763fcc75f9d857f5e82e163c75dfe661eb532b4e5578532764f12ea9714994ca643d5d1029edc9baaf7000df0d511dac74852796846c1140f720ba2c0b81615470467bc1fbf81af2b421fa74f0a7b3097fa2f612a1c85999e5e965986774b936cebb08a1615d8f89af748212b572a633b99807a0de10d7eed93b476685f9203cf8e17dee0cb5b3badecc917645e8fe4fa6bfb31a59689760ed39378155441df9f182902d7939b78b6dc8a6cd193829dd2599a328ae56e931a69485f2420d909b73d9da4d84d927462421efa566b53b5228a0107d2fced97c73bee3e59fa9b712dd61f4a8197531e9224f95e5559bad5b270a3965b34fdf71ee4cb7b007dddc6e84e02a8610ddba6924b7a9ea6912e07d494c8523827b1894ba6bdb50e17f14c40cf92aa43dbd6a21fd9b01eb48157b87166b72d1c59ca7d6eb591d4bdb5a9bf96433a7e90c7bd05156dbb39fe5f73f3cea106fa4e084904765faae98450b1e28076b2fe166cc501fc13e348389cc00953170fb69d8d17ba463bd930a6b2fac7a720f214b0c0800f6303326f030a2d08d7d76b8d8702a916a057510362d2b2dd0484e9762b938f4b76836b77c4f7883706d9d1414ecff5c94e9cb8cf875985b3e26fa47e7ca633fcd83da2d6d97df527ce3ebc575aa9aef2890aa645f1ee506b4524da4930761a56a4536f3090473a97474df0f1ad17b5b879d385ba251ac5f9a5c64b7d929518719896832d579e0052db554ab831fff57550b9c2cbb03ab063933e05b1c0293f43044f9dbb623825ac23e12b1fc4e674f0098f1acfab472b1594b522515a416917106e990b8ce03c3c34091291c4e8a813ae3685f0ef1a98500f94308a1d756dae7cb2a5f6e658950c04e4c85a4be542a479914dc310bf9975cf4f322f5b52379eb11037ed306ebfa3655f630ce5fcc01e9f9c98166db4f5fe5e623db08419def7fa089d080841320d70aefef0bf2a4509736d4381f81925b79554291f956d85ec7962c30373e2240361958d5fedfd12f05eff5a5d06742e4678de72102b8c0549b00b2d21fe392bad65083ecc6012a327240bbb1ea6a11677274c30acb7e1e5af74a3b836b195388c735e1b1f97a0a6962a55d1d9f5c813896a7c0b1d1625af4bad9f9cd41c8c43d778dd373bf0f9e755d83c2a86a444a63c997ad0447c40f54632fd0670905deb60dba56a574d4649c51f7a314de94b19759f6c873753408ae49f71aa7b714329dc36bc202a6e976d140ff3529492b5c87246bd7fdf145c56e8408bde28f1f9d5e9feda39d0c5b952a073dff8627b7ea805f9d57b96121966ae616751879a27bc0cd9e7671d894aeb0148c3f6c6b94d53e09bc35b44753a9e4d775fb5eec89dd14b66cce6f65938355d55c0c5a3ed5d2d6ba02bf1defc8d29f330871c5200e9ff49c4ab5f0ff17159cc96ecfbca8520672cf8c917a4b5f3c632e862609f695b774ef219ff7bda407a08f15b0f75b81247dba1dc1dec5cb247d8dfebc17f17520556ada65aa06d490ad59fb8e6c49a7d9f7736fa4af0afe222686b141fa0158aea41ad1e8706f3fc1692bc32e2157c2a4e200350c06651d176e9f0fa304d0cc72a4931a550b6587f31c7c54ed61ce0e010efa047a58c50b2a57fe8b70e481b387e37da9976ac9850bf24c901ffce85072cf5865dac2a908f8b882047795b8bb78919c2607f8dc3c5a718887f70d08520dec343fb623efcb9f448c1550f07c1ba075b910c8f916b65450faaec150dc6c2d3cfa2b56776082c831e885cdcb5b69235d4497e65fab67bf4ff8839ed58004fdae901f09aa887e147bdfbf5d65c65b1999084ba0f27058139ea1e60c0d37cd68948194b7c0e8be9f585c64bc6c5100ce9b7a840c1b06714eb6f7f4e2cacf54326a33a49d6480b3742d5e3554f47ff171e187c51eb6aa0976ed496cdd87ed71aa3598c8c8691360e181bb2247e3dc863f5cad877b7a5eb97135b53dd7176d7dd3006d41744b58b861f889eb4468750ee73278ef2b21ca1d5950073c1e926da58250b7aa7d6478c4c784f0bed51d158f0ebe6fe26330b56c7d07eb6809de72265587175e8cb17e3ce22a05ba4500e543f3fce8e5685017928857d4793454fc5166c922f2cc327b8faa5825437b6d4addab460aee7116537f3cc418d47155f41b21132578edc403ea7f62d4e58567f007ff4c61ab1cb90d0cfaa09a8277a97e45a8b6e78b162a717221af6fb13d515431aaa4a5f1ae85296165a6ac3363d61740b3ab36e1edc34e8e73a022d724bdcd3a980ffab6e1de5e3e8e1ffa931f263d5af061e1e56a83d503791bfaf1c2711d1ee8280d94c371afa5baff85b174653d6c875dc2a9e609f4484b3cb16bf99bf630eea650ee31b31e9bac271579a3eca32efc7bf5eb044ea4589c080ec20ee8aadb75cb7bceb7cc6890a3647ab4a28236f08a7d7fd1d82f40b82a5c231143f6261e17307c6095423d57bbca23bcbc7c95d3a72d2c35b76f67af91ebff4e8dba568c277e13978078944ba48ed8b8e1758a17236f7c5dc809936a37e564f8c8d9d732019dc49802a5ac3cc039dc8c795acf1523141dce6eb6e9aa19fb4f72852806595ad795a88ecb557e5e7d3ec0b85d692981b1d577d4c1668b822efd5c3fadd2f4e82fa47e701e65100a11d776c292f27656edecd981e89245be302bfa8e5e81f18bdd1cba40a5ec19656b02e502fc18be709cc1699f1afc16ca9353829eadd98066242e4f88382bb879148e9da0dbe338fb7d083b6fbe66f3c816a3b20ff266889bec9a43932dc638867f85e655f1384c923de503f4c1af2afc68a0a1fbc2297da0d7ea3587929a9d2838c8e09a535aa4b76d6a054e267e3d9132bbcc60447606306dd0ced5c386721e0403edb3d8dc2b64d09f9a239d512b04e0d6b3814196502292a118021364eced07821573f4cf3da7d6ba94ac75a1087c6e7a78dcfe2f8b87741cf156de9d449a58e552df95b6cef5716428b37354f98f62023887376ab4824a55d27b8852181028d24bb517f0fcf60695aa465575b7d16adc11954f650496f52d24cdc67593ac11ca4291676f48fd23a342dd4b685da3332ab5f4991be8a6c6e89c9df6ca31467d49139b90cce8c4d4c06ea3b35ce854f143f1c03bb7596f7462b25f9c8262d49ad7dec663ab49a4ae0fb0991d0a35b6dccb1f2e7dd5be6ab4a33f302331fc2b2798cdde9b71596d2319478362bf842471b7ff025bed5e28ee6c509cf363e15bc4a846241b62a212c39e895aa38478592d1516ee7b5b95c1be73ec1f5a1285a9a09879cfb76eada1f960f23f59eafc89555a69a21babf1e5978eec61b5c6a626d0c22865e14d30c6b72ccfb049de909c0e5893bad84ba0b090495ebb2e3f0ab28a5ca4d2ca62b40030a16c9dffa9136916adea9c9d1ceae7038e2ad8d831a2734b87f0d7b2f6f4358785e9723027b308fb39385b8e4763e6e67fc9b5c8ab22928039684407cc98a5e7d37803e6f4c1acfed4bb1c37e5cc1963d3bf4c743c06633c68fc7dec89c9e05e61073b5a5d4e9398ddc8c7e0bddd5f35923c931b3d44372de55da5b9506a1ce657a24645f93b58010077e1688aa9cd85404b7c4c61971ca5ed1277364535c2de422f01e082a74240677c8e6289f66e51350561b86de8f2aa2441913567d00c7aefb18b124e53ebf057edda8d7f188b653e06ca313c8ad9d723b8fb32f1a27bedf5cbfb6e1186c367a54d0fd303d7bf0f4898164f49652ac71e0b38f0052b202d93218592a76a96372ce426b1b60e2959267c59fb08dacb26e24d24627e63b7bcf632f6d3d75a08efa32707fb9a2bced37b22e81c2d9d97434ce3a6a7b0ba434fcfd6017949e25e117db16365681a49d5cc4fd7363f520380e6a37518eed6759fa062b811c833dda6528674c0ab7c2be5159a62e8c2abede6270149c965c03a01456f581803ae4773547491a52c8b295504bf3492ffe5bb220a43e1cb6001fbc75948f49ce875b3e055c1fa2d496914d7f49e98e7a1678b2351aba528ff14a2252a6c753bffb0a044f76e813b84b0538fa1060144887e98976c9eebc5f89bd03a3b4e04b68088230889623d728f9096b1b29f97066974153456f15f5fe6aa040ad4df7ea73fe6d737acb29cd20e0b87b158d053836670a23b31c6fb27fc13df39f906dc7a7289fba17c1e3b5d0de847b97058c6799d409d78a93f441be76eb8d0719639cbe3bedabba07ed830c55704aa1054e6c08b7b26be44bf6345fd8bac2094d383bb1863e625c538050df18cdc375352f06e6665313d6789299d5692393fd1d468ffa8889a866fe5a6f9aab8288b89f68889896e146a7427c5037697a0eda944a3f4cdd0d98c308fa41d397ca52fbc7d653a02f5b2ea7f08e00831546719dd025a379c9fb87fa5f1eada8d64c1c3c8e43ff861a331588160a9cbf19027d095e9d4d98f8aa358f23ddd8b598aa89ae982d8431b853aaeb7ef0d859cc9d62c7e864e4f771efb18144d34e1df75abc740e2f84820a387f1042f21e3985d25cf354388f0b6632d949cb9caac901631b9318d1e92e7f5caa3842bb485ad398d724f584b910b4b985c743128953147c49ed9329acf4cecbc7ce2673590d9263be40a25f640c19d3df2d27d04cf07aa2b37eeb8a6cc08ca470b6385b85ba5be7a19702608ea502acddcd01486ffbfdfcd5de33045c3656954c9ba1be85f4f2060fc9faf57042bebbb7633e167f2eb34e47e293714a51a3341ad46252a6f6cd9ef476d3de991030cee72ddffcbc953b68367e287373fcdd7cbf2ac1b5a22d8847abe6ff29a7577d09f8bb8c0becb6fbb2220726fdf21c3deafb67ff65fe7ce1f4e3867c8a6a818eadc00965592df155e94bac654d4c3acc5cc779abc3dfac21c553dab8f72515a061bfde0dc546817b04189831efcb38affc2f17725eb6c234247ef9672a1e89c83791321e0852e196ae8094afa8fa1f5152949fa0f8bf1f9f465ca3a994d33f7b8c825872c8dd086d3b38f8d1f7874ed0166668a903049ff5ae76fd66343d5d093fbeea8e8036d7688ea6cac5bef200826943caed7f0811df30412c11fbca212782af7d19c8e913e45b6b7b46888e1997ba42e8592dc03d6e03f03078b42aedffd213bfcb1f592e4dc31725c33e68b7bf48057fea93548e7bc4f65debc9936efbbdd883e40e025bf7441c6e357b4669b008202f61ded44344c7d0c8b5e9c9068beb6537a4c2b2c3a7b49ecaed3414fc8d9a9609b38f623b0d14f1533e27264ffacff7aeea69e0339abde8a9b82e4564bcb9d90a9251a35217dce79afea1f3f4a311340915afa33a7d4a5bcf6d2feb0c2437cfe7d4a5f0d938dc078240d38a3d9b7fed5124ccac30d29f4b09ee7c0ce7ca317a3e1cc91623755f112d9fb510669083a3f20341fa0ea2ba4857485f7ebc7069755aa734ca69c14360906d9164d84c5fa62029db6416cf029f0e7862ad9d025cfb6d1f3f11bdda828310ce5ac863dadcb615b3b931a364b0d34d101d9134bababbbb8273b3e7f2b9d411f2702aa5b6208df89b9317e2d9541c42e2ee339f4988a49fd10310c3b3562775608f19145b66cb5c34046054878edecde7831cf2d8ba59f37467a525620f6c728434484dbbb32cca6cca8fafcda45078c2d3f2b3f27bba120fecf4dc575610d4229a0acc7f9498cca52a28105ceb7817f358f7db4582d9aaccddd98f5638ec5b1e45cbc7a86ba177178e9ac0d22d536df35e5d983e29fd24e654a1e196ccb60ea7c46efc720b94b39d0f86a0fe526a68b8cfb085d8c81f5f8dca0aa9efadc06858e3460e8e18cfd92f6dd29037017899a9b7cbe2a88f623383910d92d5c36579180ebdc884f95ca153a81e0e27eebfdb6315bf4bd2e9fe78202ef21cd02d1de1283fa8b8f07b76dd4012f09cf85d141978e4c8b0ca5c1ed57f5097f1e580b71a9ebd63bc907d847a4f233f60ec5aebfb7d059840d6d6ce2ecda2975ae2459ad4765098b69d0040c23db036a54ec11ff7cd04a06d50dfa6fe90dba93b3a37e47d1dc3feaa34047122dc329d769ecd06878ae8c1e912f0b9773e1fd2138ae19c70d3dcae23265eb67005e042d415aac143326cdb63c3e510632e5ad72a23fc46b8806810b02c1ae90c6054cd09b4521e61b7a606ce456d8ecea77d1064835b88ae6eeba25c81c943a21b365d98dcf830b070d590f74d5c20098ad43b984220bba0196bdfb4bc9beeaa1088ba4d307ce6675b8f1f3b96d9b940b82cab9f7f592673bcd4b6b4291ad1269c710d9b8b0abc45ec7ac7a85a2560a8f3494432a8bcec00a73fd92046ec9f35b22df7c065b2843bd1a0c3284c47b7c1d47437a70136e0f2040bfcb761f6f148eca114cc925b37fac8ec002a44d804f0c470fa8498ade2733158ab1b913c037c87cfb4b92292f790281b4609bdadee8b8c8fc23ebc390870bc157e6cf8e17303148b2a60591679d76f096378cba85a15f07bf357a085b825fae9737804adf64e537426242861c1eafc08e3eac8380ea3898d9d0a553f53374270a4be45a7fdc088d3f8923ff4f1779cdd4c2ee98926b855985b13d1fbcbfa42eacbfefcbdefcc464e88f56aefafd74314526e408b3b23a434c741706dbd60926e0db4f99b7d8b4b8b5e2e2e2757c9bef8567be60500096dd4ddd53b0be674f347f5d224f569a8cfeccaf9e80dc5125931b737873682cfc43a62704b91964ed8096c527255283c3fd0a6b8f6bcb963380a91e2b085e8dacb81e6577e54288f8be899b6b1f0c2a21672ff176dd1574d6bdc98ecc1848b122994e7a6edfc8d29d62d160c796fd3e5fe91772476be0d676724f5a27007862e0764ef792c8e8598a79ff4157d57e80756e57e29a5cd64ddc68ebd43255e6f8c3cdf60f548f9f98c719bd7d8cace6fb37df13903322e538eb19a8ce3e30a37e7341e7e8c511a27ef302814aff8ff40aa7f1e8d96f10cb4991815fa9ab3bcf7cfda0c03adb5e878ecd99f3f40d31812b34e8034a5bdb6dddee350734a9f6ca88648f63aea30722ba410a8cac1f7a58ba319b1c3b04887e23a85c2ac01397ccab62f1102c705ee10bb878d86b66198d5550233ff8f2ed7f3e22d48bd800cbb600a97fd1bc4adc162050330f7b1942b6f0b499d8e423d03e8faba442407dd8ee0872cdcbfc15e2733dbdbcfcf033160c6c9f6384915ddbc2284d5aa34f025ec1658b221e9efb94240b3ab170e633ad0eae39ee9ea6cc1898fc0ddc662319c322ef2d0cd714b8131420ea6c8cbb1c94a49cc877d88913a9a084567aec4fdc0138b601a8a7db0d8190964b867da451ad845da51ff99fa41493aa927000cd5132b0ab93bad88a3e68cb42430c0e3d5ec93bd91f43b260f983936f65cd1a9b4fb1a87ec8ba3b1ca85166cb9e1a4ed2a5d15690d94e798e1ed24f433dcae76d72e5537f6563046e38ce709ee8b2f600e89583feb492df6f42aa17bc3cebb99cf97832c72602813a5067296e434506ae063fd5fb0b731de2e367a8d130615c9ae86f884fc60e89ec8c8191740f861cbe56dcdf5c21256106951f651ecf6f1f34b57ff1171b763c1ad4ce936068752926c5a4845f048c35a9ed64adce76fb7a34ecb35d5a12c05987cb24718576a6f9b78268f6090c4e1a85c954b504bef34f75227f67b8b06801201887692945936b93851fae203fd54d1e11f7c24334c5c50e5f79cbc3d0dfe7a8be447031e4d00526ee6903409191faaf0e4cabe006547bb64060fb846a21a120d926fe4744941e8034d318e46087b91129173cd765d36917878797c0d15837fbda0fe2206d8ec71b265ddbe4bce9bbbe9387475ec2f2ef1302f060c48db264394fa80ef270c2c09da2d995d8a00a4a500051ecfd06d6ee59f16cf4c4308562021ba1091b63506e4d2496cb0f8274e49b96b4d120e815bd508efe975fc988638e3717a514a238e8b95ec5d6ccf0abeaaac310015763c49e49f7b1886b81f46e1534fbc28ca796b233e820b4fc0e6724bd8614055de6ec312dcd1760164ba2690ff3b61785755c603f7e8b15ccc2d7a5585124895786f69755437f6aa29c3eac0666c1699376c0b467a1e1ebf175c07b3ba2a2cd3f78910b9bb6a564d84c1e2782c73a5422c980b68d1e6dc016f0ef1156bcb41782453e4ca77b2ad3bc2bcc1596fd3ed4b0d6f16243c14186b4ca764df572edf2c3115afb12f730666ca0071549d07a2ca3ad2c20a1fbcccfdd1a6641edb2d294d819b292a5e40404a11af20b65ef638eefe150b9bf5bcc73317a6d60e410417724113a629a94f231d15aff1caf940f023b08456a3b4e3f780d08d93bdc58144dd3a3afc3df3f96adaa68d6a4a0005c1ccdf1163fceed06346eb3e622bf2d62388561442d825d597af6ae31726c156a8121ac9dd171d390e74603481852042909bf596f7187b76cf6666da36c899ba466965e802722751f6997754bc2f372a032a09985ad2428bbaaf6d81ee99c9bef3019c6582974926721629d4321dd289fa89383fca693a5d4bdc60555225f11566392ee259c6546bef9ac1e26b8241ad9846efcda391e160b99160b5157407f2e396e97bd163c9baf30a45c887cd6a4e1735a675374dcfd364c1ad5eb078d511a9bf493f7d54089d36915d74a6bbeda99c742e9f034b5e5340b4f5e791b6c987368b5ca6c019733258df6f9f3159d2a298a5c1f76e51f152558c1e5da90deaa4de403f20ee8f1ca479ad61394fc810817d97f9cf52eff06c2e037e3cf147f783ca5a20399350d48e50ed349958706f4bebe6b9db4175efa1016997b88b4b7f7628c6a42c62377d4ebe88c84f9401474afd9b490b760096ecd5d7fe9038a3eaebe08913395cad829669cfe05120df11339d3ffa978aed2e7ef211f05e2d26e420b6ca07f01322c7052a441b5aa24f1223c9a8def535b541e61b3f160ad3494afcd2f092de90a929eb9bab47a078009c9a53da0a2bd6527e73d000cc5431020f15bdd85ad5f5d2129ced3eb02d40804faa7fe885720d8dda80369d5edb5b5d45d553aaab4b34857914e13829bf64654c9261966fd63dbb691494363e6017c3f98d1b15e5edeece10d8040b4c6778c09a43c6e7e1fa7aaf3628aceed347072e5ff219fbbdb6eb9a59432a514520879087c087eea9ce0a6a445c1f6adb646981096deed8f665b8584a6f16f42d5c27611b2c216bab86d04f903a6f17fa24a61a908314125b1e812854419e1524b1eeca0422f5819fe42dc702e41d29420694f6cc892c6b54ad2685325699226699246a9a449daf4991e52b22e30d8d662adb6baaaab6d1549b5aeeacae3f16c9e0d06f33cdf30b7f1ab43678b1677f7f73c1b0cb66d2fe29a2f01a102583a37ae7a3e9dd753708dff9848645c86f4b819bddcb8eaf974de83de4396fd96224c11c66d2d13c6a50dd63a302947f877115edf3dabd94aa705defbafc0fb929c9070c9f361618844d28dccdec85a4bc39ab061c3fca3542ad7612b58d36030180834ea713344448406079124e9d30e188c460d56b163e4c8dd1d6bbfdad5adae358abcdbad180a75b1eb6a5723778cddeeeddddeddd55ae337e21a04704d02c09273e7849db9e1c80bda3a49b86646847b708c3f68731eaef3628c317a3778191ff24e172758c162dc7edfaaac51322b4c74efdf5418879947f7856cc5ed77cf732d2e75ad2e4d66e0df4bbe3086cbc46d3c149740385c86351249b09d4885091eb3f6cecfc8097b03267e2d73900ad3f803a15e71e71a7f990c060624ea71e3a00f0789d0502409d79c741c1cc956359e2063c7c8919bdb4837ec155dd1155d5b6f5bdc6273fb8e91232a2837d880ea27351d39778cd0aeebbaaeebba91c7e3f178b66ddb647c61258dab854bdbfb47572475ef1f5f481cece872c51797e8f58f57b024e152bf0cf3d35cb3b9a060d9c4262cae7b32f8ddbe245ce31f4534ae112e11e13ddce0bad7180cd40ea9ee1fe216a554a107a771b1ca42e5613c798d0ab1f5459683f20b232b028169fca7a822ba8ca476767676768cec189131992756d7bf8b1c63c766ee1be6888a27af79cd6bb4298d3436b7cf9b799363e40608f8602f1836e98d83a20c6d05d7f8b37f77715d8beb322e39b3d74d298d1ea5f1f361c2865e9bdfb2ce433d2c8049fe8ab02b768aeb2fb6c277380be622ca261e06cc654e664544b93e856bfc5532559b1ec60e5f1897d81f423737b55a4be9cd4d942b1959a462c7c8919b6541aaa591d28d6e3146598c41e246dbb62348dc464712f7bfa1530da54f5bfd12e0b569c252080a2023043861fb23c035fe096892049ac63f2626f46cdbb66dfd59c28a98b01bd3606ef464700ae4806b74b0b0bdd1205ce347e2916d6b7074c453b64ac739d8bde5e06f44b02d16f58a25c44a2592a12896bd8f8a0de5f57fc5183932f39c71048140111465deea6696f10517da8936ce628db19014f6891a0fae472aaec71d5c7fa70293dce5059760de7594f418a62937de755037a61b0f836ab2f12124ec0daedb8087507c018b715d72b1509c146b4770c913ad78ace2510947177089bebf6bd13b3c0b2ecd8f43c47c1881b81e6770ddb770ddade05db8ac068daf26f385f5da982fb432be6abfb0ba565416492d93c9643299cc23eaaed55c2a95ab93459290982c268bc9e88b40a2be5d8ba423227655aaa642f5e3944512334f8f3fd0c1ee641de8eab8fe11159b38a97a17772e1e995cef40d1e7274e0ff42010687aa0771b50bc71e32b358dff87f6c37ae383e223c2f5f7a468015ce3ae831376def0e6d33961411fde88e6ed3e9f8e54804471072deb9aace6aa2e14eabaeafdb82e8b3c445a27eae1b2b26871e102e3bafb8c2d01d11ea66c4597c4e80ed7fdc3d053d09c5630cdcca24e2eba2f9c604c19d7b84c76c5f0316ebb7a4b1458b82d8bb55a3b57aa4872ad56b550c85a97aa5659fc0212c51d8822155ce36f43f4825445528c4552e401d3f8fbcb5452ace213abf88395cb7cc7bd10f90b2e85eb1f12312b20f4285c7f1b9ec5f597ae488a3d341598c61f89d00d6c105f1012030b4078e0b0b0f2146b2e03c92c16f1e43b91343defef5dfc0ac699a0f7772bb8e4bdbf37a171b870a973a7fde876f7bc9bb255e34857f3983299ecce952c9298a5cb5ee9f23dd0099826922ec034fdcc85aac4f60c9a50b5e84700d3e8d802f37e25ca0f3d97305f38616044de4724eb47048e6630c10e07db656e13c618ae749ec700f7f1c3217ec4c1f3ce3870384cc1c1f3f1dbc46e33677ab673eff992f873df4cbf2989e7e337d3df8d0ea6d932a1feacc5c19f7b8f28b6e787c4f73cfdbcfe84e8bc203ee7118db866bec80b2b67cd01ba27830eb74e2bec0cf1bbc7803ff73fba796edbf462bf0621edcdccd03df743bae7be2453b64f12bffbb66f48f749fcbbfeda0bae9913fc4449b0f2c38f1f2b9d5e417e118b11c6cccc393723b0935fd8f62f5ac618ed17b20893524ae78c94ce58a3284e4ae383925239279d944e49279d91718a413f4797e3e278afdeff289fd2b05e19075d7a3f64cbfa23ca3869d41fffe3231cf4c3f81f3f5aa07f04618eebf30bdf47a5df0d78e76de639a2dfccfce49df7521d599df6ec4bb7377d79530e02731888d1859629877e620b2b35d394fe20b46ea279bcac38d8d14fc77d3892405ef711b5c79670a471fc8340f3f8b07c68cbba4262e66a24a46be63595758544fdbad63ce23b124dea4d6e5bddaa9452d64e344d94f2bb691e1df7e99eb0db13f673fd76338a10c491f02f1d9d73e33e54e4ad22b8a6ce561e0e085f5a1f99f191c6e9562f41eb86c25a1de9a6c56677773a2708052466abd5aa6e72dbea5665e5a4a7fb745252295b5cd33070358e5361239ae8ee09dbdd2f36ec58fdd04f9d0bf11c36b0f2b7207caba856d8a6545ee148ec0bf300c24a2965f7f1401f2ae26e75a249bd45d3cc20d038fd650b246efcb8ea2f34004dac5fd07b272f3fb8c2085b708107ea09d1017da148131f86289c564ed8b0b31076166ef4d30d0f3c73c2e9e674bae9d837ce830eeab43ac9205c43e794f5930506b0894dde924dfc1fef47e5368e9bdcdc56ab6debb62ae20b12b1e9745af9670389dce48992f4922378809972682780f083cbe4bd114d0a1203a05bb17d4d206f2b92dc89477151e1aaa8135127073f2cb6d5dddd5d02a6f130da861162300e8ee6e18fa3c7781fdedf112c4edb5fc138f1f4a526340ec7a5fa56d5ee9faead8a8d53a479f8cf4e32ff22dea73fedf1ccd37d8ee3681c1dccc37b1cf7f3f7e339734d7b4baea91f19e3c74353b85d889c71ce3a6b8c31566baddbb6515a2bf56a6dea0109bdc0355d802fd4c5ce90f7fe5c158d22c9fb66601a7fcf62b409a92159d56ab55a0d0912d0ac999bc66ddbe846bbd25ab7ba511a29cb91ec1163947d7a60437f5db7c1e23630b7992f63acb53d5c953b2cf921e435aeb919f5b8d9116385abc562514ae98e118ee3385624b1228d1cc755aed46bdc7024bf27d890778cd8e047dc66bee7312e51fdb07212259627386d8a5415ab2b602f07a5d36f918dcb5e047c87209114a35061d5eae08dcc11b13833839b629e394cc0e502b00da54c30e81fe2b83ce399bf654cb04d2bc1b4e536cd9af14516ad3355eb9c73ce39e79cb3d2a9044bb94b348dcf280cfafb84c2ce26521e45b3454534b138a8258c1dfdd01a2362138d11b949cbf5a781f58471e6a6985f718ca84d51c4b7e3e68d11b1a9ebbacf526b4c5f4f65c399e2b2d5ba6d33156933254f0e42e192d499a82e369c29192a6eb7613bd89952c2b2f763a6666a862849dc828242cd9443ecc1cb04c31022e86d94810fa8dbac3a6d0dd1ad6198a908fa60449115599755ad0dd56835b06e54b061b35256dcc609931a9592af48aaf1345054505166111316036b2ad11525b27c60c39992f9195fe39b9941e667fc4c7f43647ec6cc901a1ffa1a1f7adaece74b13c988362eac77e04c7f8dee97097d8d2f898d0f7d1200fc8cd7c144433403fa175e07538c6806d4d9108db62b581a2ff322206c979a9981c6c73c0664bec6338e1a49313ff318a8f1386afcccd7781c684c1c1f80c7c0cc0be0c3c1c6cf7c003e1ca60cb1f1338f03001e47674394d3e30a36e66bfcccf63a98a82bd208d1a1b0176d459a0304615de69dc6e733f38ee3dd0380884d315f030038be991a2aba7d3313a8bfbd0e37462aa22219dfa21bfccaf8220d9a074c970bf3531416b9309f13ad28aa60bef8648698bff14362fe068d2fe6852f89ccc739d113cd10b1292462538c884d34ba4fc83fb1a794dbd0bcc45a9c39e82e51110cae710114d7b7309b8856e825b8cf0d67ab8b619022184cd3c91b9b0a60cc142db2680e7adcf9c2ced4e748e31aff2e78c76bf1e435afc51d445664c52cd189e8839899a2551c74eaa22d185e60e387d479e0128dc6cac2c1808511f31d644b58a99adb8491b5a2d1bca4669309e54b644d9f59668a6be60ff38a0c08312ab028b10897933ba33839588b446898a9ae61a68a843cf3d08ce7be980f41b7f14d554ccb66b4ac4616685441e6eb2d66cc142d66be68b3fbccd46471892fbde16c4d29b11559363eb40c7470816052a4451a6f9cc8126388248e60d03fb23c92a612ce510c26aebfcf17d7b87baa65911669916524922218318c9d1d76967891365373ced93595a231900ed663f0325fccddd2255b9265ebd6db16b7d8deea768264b15eac178b158233078d98e233b789dff216d7fa28e30b1bca4e4996cb6da4152e6ddf754ad45056556ca122595226a7b82eafc89914b11536942c09939fef1e1472ff96b0de9a7ddff711c99688e5921549202859208b6e3af849bb9ab41acb8a8291d4bd7f1a003bb0d3e2d545f4642092011aa41467c9c0dac2b66ab74593ec275b9dcf7c06f35d0085b2e059afc2071cc00de34b1ee086f1d53188e8729b3006115bad2a31462b3706c125d6d7856507a713969382d6ba6ddbb67d88648049f1ca4bf67ac5dc30be5876854932ca8bf5928105856be2a64567b9fe339e39a145b9e2379e20595c23a3482b5255a0a638edc82bb8c6d5b1497f506cc8b4193edf3d0628066ca481c27e8e965198c65f52b92e81705d5eb9ee4956a758ed4a75aa53f3c5f9278339e7fc7c3e1f4ae9a4f3f3f97c4694d239e7ece1a4fe7c54bbd13c1ff77d2fc4396984b1c562b0d7bffe35e7dce6165f91f4953a6ccb84f29a5aaecf2ad79fce6df3bef9482a116167fdaad5da5048b6c00b03171b53602b08cbde6784f55fd5d5b6dabef0b7554c4d1516b799b05904977670295eff199bb348ea3e04044ba5ce28dcdc895ed8ed89839b152cf7d2003eb0fe7c398a2e5c6edb4c96db843175533eb5d84272d30da7943bc60d638b4b7de327aa41c77d463f380f88df6d9b1f3d2022bf51e55dc04d311505dbf160d914bf7faedc26fecbd5625d8f22d912c9c086b235a16cb096dbc46f7be2a02792810db727dbebfa6f5ad8fe30a656a9a852a55253958ae08d2c95c72a5315695cc776cb411f4f1c74c6e2e9e964aa3a6f015c5322029ddee7864bf1e30f31753363aa4a3855b2255b32bb4d617bf27d7860a76a968a3207a74a0a9646beb6205d30933298491acca4103369c42c0bd7bfb1c0a54d62c134fe52b8fef10bab85eb63cc18bcfcfb0726c9163321f55442515a45b43ad58598daa61853750256019b80d4af2879c0530906e36a3261c4759eaf364210aea726cc55515485a52fd9ba79d5dc6e5dffbe3245ac8a9815b1d754bda66aaaa6aad61d23071dec566db1cd0710a5b3810c0b103b302b56acc41839b2a7eb4fcf6284c42e0a892410308dff16d73fecb8e6b8c8c58e8989d93eb5562bf7484ecdea2aad9344d55250fe95db6a48786b8ee3aac771713aa83f346a95c2073a34a4c43123140242103233ac9db36eb14306084a2b5be48832bc1ff17bda281f3737a36ddb1a4581202f24923acfbbbf17b93d90cc2259d56a35e7768c7adcf8e01a121b4ab89b993bb2562a5b69531a69ec6ddbb656b54a35a9bb8d0eb791e2a43afb32bdcc39e7a451b66d71dba20cafb25d6bed6d1b218049120c491bdd91478475976b676727ba7622084a54241941a15ed2a6132e3d719b3058d2e4f6a11f782e993b4c9611ff18bf21dc9784fbeee3fe685c03055b7feb264dd6228df770e9c541ff3837340f5f010b1a87abbf936af73e2f22918424d2344e4ef390bdbc20c9f97c5efdf9ee4f0dc9e713424237d16914922f36d08a741922631ef5c8018670442dbad3f5e8d445b1d026940965512b5445a15c7f19455068c1429fd0551435a1729b761b896a169394db44978c0f36152342511445538d436920002736a42852acd5da900f360036a0a9bafa01846f7f32e5a05314d7f8e7bdbfd1c38b75d74db90dcb1bb24c004278661e4fcd43f3ec7864d7ff46b760352600950d23ab968a39d8b558cc16c164c5c513a594527631bbdd2dd7bbbb259df3935d8ff1c186a35b639ea73dd03be84b9283a9c240a02f097d2501fde73b8f6846f4cdf4c3b4e787783c0ff32561df9e7b1d4c3a7414f5c2151b6759708d47591436ac308a1a82dbc022699afc6bcc6d7a78b15dbb2145f96f35b7691a4579fd627ab0ed9a32a47bef4bd2d5ee874d53c21ed7e455589483ce84a6fa0b47280d8091c635f091c68d60c31fc51b273676fdab169817fb1702312708174ba5891bd22154081136e458ade2fa6701a3281445511445515477b2f1454a29fd7a924b112ee1b8fe466c9032923a402bc235fe9f13a4eccd49acc52d77cdbc702b553ce65dfcc51b07c1d2206ce855dc4626817a13ccfc2458c42e65e35227650ae34423e020ecd410d7047d4dd0b7e33c34f85e60e9875e60528ed320e0728ebf935a44a790d0a42291c697e8aecfbd39952291e44b348d37e1f3854e8450fd4287c29bb88d045fa2b71697a870a9fa1242446887a2bd096fb9b7ea87a2703b91edf5b75a9ed06f7b68ba66eb7113631e16e8c8c7a787a5dc9467e592dba8597fbe7ce504c4650f24b3fe39ce0c84d58a15e3220506e5b5a56585ae56d5bd7635eec9c27237fcee6bad5f3f97bc15144d226244af1a87da20d48496218108a126ec12fe7586374d7bd5ae48530433c7107694ebcf79b7f2e0fa3f5769d9f951fa021bb26c031cd000976ef00126f5e949f3f0f76853f801130c869a4707e1c67558f33084ebb18fad0ed6533fa127da4f6606b80083880cb65aad56abd5a8c7ca52e166a64c9bfb65737222a94a493b0f1555aef9175a96d69430c963c34858d029cf97e3a371b88f86e6e1fffcf2726898afd7e49253abf461060cfad3d0384780602b705919610818d7662c2b66f3dde3e68185a5b55a6ddbba3098f993827262f22122ab44b8f35c91b922658e48294084694d7a1b69dc00d37dc05988d0b972743dcb105ea24966334f3794b957ec8d1bb24cd6cfe7f3f9eae0e73381e8f92244081b322dbc61de22fd34f847e446caf20d43a0474185d828fecc32c4ebe9d787610a1b72145f50b9a22996fbeebbb9f9978076846bfc6d11d6238a5ef480f483b040c041e7bbcd7c60e10d13029e28fc206ed3d94c520cb20797e4fb1549001def36954b5bc771de8fcd0697526069304e7f29a856864b9e77cf15eb5d7bdd779fcfc7fbe1f916c944e172f6084bbb1f1a8d46a31df1bc1d0e8e1cece1e08d833e722010c4c16e193e88a1dc85a5091396955635143a1a7532274f9cf8cb10979c8e4236c0208dfafb236bbdf4a768042d9271ce398af3e5acdf10a7e98cb07ec31010d6e6c086f6ba7c8fef38fe7cc51084d840dfbdb0262463e380c1216c689c3e1de1022f5a57282143316d368aa25028140ab56d3b463d3a06338399ebe82736d4d0a76ec234fe12a3f333ccbbfba5773d3cb0a31b3f9e15e1d9ac8894348cb98a2d66d7218bb1d825bea2966d4606ef3ed7f87ff7c726f3b76ddbb61a5aafadc6c5a5261ac7f3fd963eccc370c586b1359f348ee7065c62e2243fbd22c953339aacc99d4892f1fe13758a246fd249999c359ba44bb6e42aca28cc87f2142a854aa15cb3fae578626722107ffe8caf03150eb5d08a40709a4e49711b260e63058b5a82e212f3c7631173f6d5da50282e81b9f10718d10cb771116f5785f58f556e186bddb6214245d87645527479a660ebfdcfe1a4c8c4458c1397300c5c8a33f8dcf0bdcb7db515bae185b0d8b88469fc7fa84e228a6bfc0a1bc6566c6d1f7a1f4ed38f058b6bf12d22601c04308f7e5983112e4d0528a0fbc25a3d5f6cc556addba8c7cd5cd950d2ac6256ad184abf9eb4165655a9ba9b9b1bbad55a6b7d52f7616dff4251b061e84a5291a8c4f5ef2118076c33df85e052ff4da4691ccf97a479f88d77439e7d5f6e92d4f79bfa85355f6e68641e709266c25f51dc2074872269014ce37fa35255954aa552a938ae0a19e260ff27369bcd763ce54fbc7054173f7913dae46a4339399184a4f6e068462c51a06c9f56713991e43f1a816008d6b39e71e9b3a104dbb7ebba6e3ebd61ab26f390e17ddfcfcb077d731e902888839e811d52a20474615b3509543525e9314cec31f48f4056a6e9ff421b2af7db047a04bd6d40e87b6c60d8ddb8efeeba0f924e61b1b5630efabb604abf0ecc2b895d389950e0f6e57432a14226985702533b9d4e261d1d2502a05513cc2b71c02c6482791d253cc6eb64820168827918dc98604c30cfbd6c900f0b9d05d3cc9eb0ef1a62d6a63b3d836189ddbe9909f408e6f7ac023341d0c2ed1cffe00e6f5a8f59382a41dfee5974d9f006c4041bf6cc51b3d96c369b51ea33cf65b67065d65167a08f500eeaddb6b1043b9271123b5713e7873bc21cd7a9cff67ecc2f6caddb3665a432da3ccd79d2d15698344b67d55552934fa78e0c82b147a3ffda5f47c4dddddd3d09e80bd8ca94c388c90f5ca629fd21c36230fcc0facf990830974b9fb95cea3a7dca9175ea0607a9128be408f5e00006232ceda0b0f23671d053ad1c2acb7c3a9d4ea73ef58952a7755268ec34b7711dfec5dfbdb8bbec642097fc9238ee03eb573b8f16d6efec9e5e3708d391449fa6c37d7d5a2455ee0b400dac90d98d1e5e2ccfaea36ed846c0208495c16934da9c3b68758c8e99274f99acc7b03559173f317a778a42987843d75b75606a24b5153bd7df690d6cd8ad4869b2586beb38a9487f09781e611fa0f72f82821b9c04fa680d0025712793ebfcc53b2b1e366458ea156b1efe138b834da4b0adfa9ed8119020ec1d9c808df81371555c9062080c3ad83c8a500029322292a06a8566383ed40aa5a4a452527630d26ad156abd5ad6e756bdb463d5a33a4b85caf1d2f586656645ec0b65497ab7dfb500f48e7e1b863c3762921c68a3cd142609c2456669f54deccfbf629926efa497ca2a2a208dd4a4214ed84b80385b5723da9f2ba5cd5e572b95c9c886fbb869cbc2e4e2754cb0a1396ceaa4aeac9e90482b20623c95a2e798de35dfffac562c1e5367d1b50b047e889f66f4fe9f6fdfddbf71ba91ff24e7df0648db06d65db28a5b6e3a55e05180a77fb3ed5ea606f2fbd1f5b1525c1bd0d6ea4af9123f2044b7d4ed70dc0a300bc8502c0c6a9410938416aa05d6c100c02c1a07f0d8d83a479f8105d584a382276da69d970c4c869e774629d4ea7d3e964b1405f1cc7c5da49b264151df9454a296badb5e6c076dfc1a049978508dafdcc5924e6863cabaf5a3b092781b5849429490e323b28d3e773e8b8b032791f6b50dc660726758d4b325c9a21272c7f58721d06256c18dbd5318fc13f0dfaa6312fd61cac5dc023c39b6133d948e30f33051b46d749a2b8a71c05b2dd30db33dff3f15c1679a28f8863acd185edbeb0b7442ef10a26512298c67fca941ef4e086edb272c376f911b1567bc2054ec80df4d6e73e569cc6fbebedaf5d4caccb89d30d252ad6ac58ff6e2bc27d72885061b91bf2dca813d7db65a579b812d207066740ad4820e42a0a39c42bd624ab5dd48adfd4502b4822a96b55d45c35b9721bae166bb1166b1e0fc735421c1c4284be6c00c1ccb4b1d056df4412dfb0870a0b739d524aa9bb870a6b61c842686665b15a739cac5c00b3b826a6c541eeebd4ed20ae7f6c988f9c9b90671fe010b007901841e33414be02140ac54385a5fc04834180328486122b024bc6daa4d06655615d094d11aa227473c38ab1582cd6b6c154890921726242c310a6e9f08cbd906ebd05724c08970470fd89c0000a283d19a6582a73847dfba9967e433ad50d79f6b2b6880d2152b013f0dcfe402e794c888cc562b198903977787c60e6a992826a321b89b551eff40cc1728c49705f9f37fa7f798aafe2adc899354a7b38cde69b1662778cb17687c57a37ac4dba35c6186387c5c65e71e9bbee8574b0729b9614a61ff6eae670e5d50e3329a3bf6f6d6795811d503db0d36bf0067430dbbd6ff5e7ffe5571539ab55575fb93c7592a97f90684929e58e9119dcc43dc3803e1eee330203f27ca4b0ec604ebfbe70f46166f678a011e89b3ba31d5be5975365fde837bf1d233b3827288b52564bd6a54aac61cda55d946bb53614fad128ca6ab5f61f0447a366f58b4b7c7d764faf1fc6a5fe1fa6b84634a10b76b3a351a86d121c3721063d58c294433c220c93e7bf54ca32d7d8c993274f8ff60cfdbef4abe7a39f1107dddfeebcad4bd8203b18b1b65a6b592c101073ceba4dea24c65837fff13f291d758a76c157b0204290e80ca100eff0175917589066120d1a39187683cfc042b854e3bae806e192288bdb42827cda415110075d6efd520bcc11fc4990ab7ad2c38b95715e95759356791031ec7c820dc1eba22dd81094f2fb85041171b121087acb240c0683c182ccb9c3888e8fd8100e7f99c383cc9e93ba8e3adbe9597be9d8a45cf274308d3febe8f1ea973c5dff26820d2e729a5ffdc9d51722ac97cb59a8e8b2e58637314358ce4205961bde64a982c9cd424595cb598ef0e2e2f6eb543f1e1ffad55bc4729dbda4384bac4a9f9acb7c65893de186bdf369653942ec86ed456e348c56a415aef7f0aa3199ae80df5aad0d85fe417074634508eb1e1020ec20783ae108c5d3cb4ece628425d8bc765eafd7ebf5dab6978582e338e68e7c24e9288119638c2e9c4c32af2383fb9890679f1f8c2304300ed83cdc13b14946c4261939ce711cc7fd370e17f27e8608f41f519bac884d9c2889cfc788941c9111c910292972fa3cd853dc225cffb000d73f2236f5dd3e326e9a216a1367454a723899bcef603ec7258ce805bb9e08072433433eefbdf7f97038d271a2d6e260f7f2e19182c5e16a975feed362a5b07cbd9f7201192118a3c56f00e8fd6788580121cef5070bc0a53700f3601b4a039530e8df34d063b8eeee340ee42ddce71f49344ce38f802b15641a0eee73d41d5686877624e420d708f1b8c5c2e3f1b0876745aac7e3f1783ea311087ebe1a699cd890675abc97306157b9eede00506fb9a410278512383f9847949b273a52ba05e5ca78fb31f67432b90c5ba4eb72201084020e1ab1e1c80d48224d7f441ee794d45ab972ed20b88542455253a9b5d6eac9c0846b9c874a7bd23a6e93059372228d8eeb6134185c0069d9c0862db3f12f12699630e908e7c3c3033bcaf3f5ab50a47893277de7dcaa7c00036193152690538324f4175360d05fcdc3fb0a4c03c5f5530db8d0b296a3aab85a2d6ba18e5454ff509d340a2593c96432d9a8879021a998d5687453c4061f3db8cb4b0b6d853a236c7f884bdea871280fd73fe4031b8eee0cb9949147233a1a8d46a3d1b66db5be55881c63c766668e0fc3e50771649a077fbfa00a1760a61c1820c41096609acf1f120117f1174435780cccd26336123bc03cfcdd3fac2132820d6faed74abf9b1b29c1ea25c618afb07d638c3146902cd65a6bad52f610620e7d90213970dcf80c001036e4fd33925e003f2f2b43d7fd8642a15088527a84945246dbfaadeb6eb08a31c65879d63ff817e19201a4c93ecc69f3d8a8a24b72e474bad1830ad606f0869f3f810e97fb7e90c83ad8fd9d534f06f91fbbddf2f35d07deeed37d1495a0c7f8bce78a9d119f8b9df48000e10bfaf682f0057d33de8f803ee8bdaf0718a0a75f1f06e663be1a693ceed99bc17ecc10fb319ff7cd44a0043dc609e483bee71aef0b6d002fa7c3fd70a28f8c7ad9ebb82f6c6c62fd7360439ef12039e06bf57ca1e8f6733f2bc27156c435d25899108ee71a219e837630a71466446415a6d66a63ce39a70e9348245598da9da304db452f3a78716fcf8b2ad61491b8754422e97dbc17aee99085ebefa8482272d2c18103a777a8748db805356534020000000033150000200c0a860322e17848260a728d0f14800c70884082583e1a48b32088611ca4903106210300060404400433ac14053a62ebe1d49c3cda53fe7eae98e3e643a94226bf60417b85a91e3e638bffe5089ea7e763537b32c3cd1b038c3ed906023efb9e63f336e064a8a5567cffe1dbc0c094a9331d30f3b69c1fa8766c68dcdec5dbf79c271ee0c74b7ffa91677432bea0e7760a7cc1827b9935fc8bf91b5072e98c86924426c89c405bcd9ec76dbe2abf8b798d697cbdc896c50bd10f35b60d3eeee2e3a9e6833d8c3fdc9099ab586de87e245e3dd53f5a77d96d350a46ee4a20ec638faca8d75b58722f4c9d5bf121a79728d4dbff51812d25abf793941e0c2a3e16ace0527081eb1399986398e835311a9d843c292e10d193638c719ef7cfd7f6db872fb15176b6af55a7c41259774b743e7789008dcd33fdb5aeee4c0821d8133f78bf84d086cce763fd2975d25249e98900256f18c87ec3ec65ba3796c66396f3d40cb3e4c9235fbd9c386e20e511a6494adf8484fec0ac303cc9fd5ce9de955f3b8c3d890d84fc9f49851918390692050b930aa0579e9ad95d4f67abac99a2156e8e93dccbeff8726d19dbe1f738d5e6ed7c81f89e00e560d99582d3511fd4eae2c29a878ccd80c50717ab9af4827868365075a7a67f4f981646cae036e7d550443e5b091d11a8dbb68935740a15ed5daab9b4b9c564bedf47b8c41e2b26eb9f4fab1ebcac8d42f858421a2789cb6abeafa8603cd6dc3ae1df90ee6c4ac2ee834dd2688f12d65da7c2fb57c0b5720d571f17e5b89b64333557a8403c519ee0153a81296d23cb115ec9cc8faeced45f44fabdbb023c37503c1bda0f244dd058a0871e98bbd4e82b4b63b49ad2739856ea36ca901473eb0b125b68361cadce9e8fb4c36654b25830f9d53498c9060d377291e29da82124d2f2f2b081a8f4863e004b0616448ec2caf20752c8ec48e23aab98bd5aa73d6e853ece07c8aa7c44562ff00118bb279768075bf267ac182846526963eace6824eb4f159bc13b95b78e24f09182615f1f6c8da9cedecf86c906d856644d1778143198c830b1d57beb955188d86a275864d4f5fa80a4c72e30164540087cc42ff9727c32262ea5fc500adfbdc04c1a29e92a9f226a78adad762c357c9c06f4635c001d00ce22e486d8041ce8b8063ddf6937531de8bfaac2e6631107123727a9dd72003ae25618b18b7d7895e442553a98a6bd0b626aaf43ebaf5713efdde821caccb1fc37d15039cdd5081133f990cdbd4572ba8199fae0fd85cb60836e247223e06cd98b1a2fa39f743322774f5ba60978abce004c9f467bb2bcd1b1d1f16bc0c0b1bfe4380594a60e8c292610bca3f87e4b333474b25b02f8c15541743895ff0d42318117dd915595f6cdc4236582b62383e04de142221d853474510a33e68c682aba033e40b58ebc76bbc6290c30773b02cf76fcd1178b3a2ee7f8e8f0fc7390ab6e209eaf8cda14e00a8d0df50fb9901c367b8d55d2671cb402de4f72c2e7e2287ffdb07044884a22902a1b17269804e76d75db1de3187ae9943411682352fa2fa673fb0b818702808f2048681c5785b1afda62f312e6b7b34085bd8e3327cd5a3516ea969af67a2efb5fa660a86b841d56073fecdc848b0ab4820cf1ba6a0518546fddc3aa69f5022edec05965ae0c3dc47e8a6e85fc73ac1b4e09da48ed3d53a56bc3688a032d9ee5c8a52c55e44998a3c187ff1d5957efcbe0dd644cfb9adfe76930432b7015d19ac16f64b416e9a0b4d35431c27fa157c4d6546b94469717208a9ef5e444089ea933e9cc3c016aa0d2d87cbb90bd340d5d291e694d283f019bfc4f428959d736f5b64ec3e26bd24ca3c5f47394d134b17a824e181534f7c4c7016c5975e862d77f7c17203f98155dc4bc3dde2706189ca8a0f30cdb6ff0b7ac52c187aacf776aca195613a013c29d387817a57895e7df921f24384c56e9bc980f61534848c2bf683912224128644ca8599eb24a5afe099b80a72846470d30e9667628615161a4e182ca3ecc012a5f463a792f424412cb371d5289c610963613d2c89bf147ab590b596ad168d09f959ef77dcd554a927e8557c038723f857f9a6fdf08cc80a557b738a86981da9b15998db868ef528d12ae19edf7e79192f43b0030a00dd35ae6422ac970c657fc6f05d16c62d285b56ae153ba5ebf61882126f6416070e6d6caafc044f1410cafcbec35560083280eb41ae14101b312a1f906d0803adeca8d56e3b55c8b7d59082f6f0967ca9c3013ee94d68236909f3592ba01c801f3066d9e8f53db3ee9917d641c7afabdcef143a35918ff1e0b3ee042966632845372cb10a3d3d7165f0781b38fc300e1a6855ff14a54d9e0b85da30c8e917554f58acb08ce62b3b4d0f0cc431fe514351b0dcfa6ee4a38048fa8e95ccc4ac6a6bf7187a708329cbbfb45a20400f766dc5fbe3f8bd6c01c11363d1d5403eb63a2e564ca500c7c5ab9e57b63b842a4ca541f88c27623994bd1223e82a53e4ffd467bf353255ec48c98d1304d65a0bc0bdafa55e8ddf9fa060cf497c2745543ad5855612761105814e8c8dfe28965282f1121502ac17f9e23fd242b5509870abb0cfc3cea02d28700aae84c53c47ee4bf9f48611b8c30af99f36881d16a91b2626e9fa5b2fe34126128a51b518ff14868931744b9cefdf7d89295be661474a494f2305e25a17568dc11611278160b9ea49ac7aa0c4f9d1ae59aebd032ee838a6fe11299727b97cb6f0f3891bbd69cb48535d2f68b8e28d7a7e27b8cf0b8d8e20ffa142478c06d8a0bc22ac0d7ba8b3afc491980c809b0eceec3fd899fc402108979470025ebe8a8a222f98194fb3e9316e16ef9effd147df3da0eba96289ae5ca9e362b9fedc74695958a965df4dad6b72fff8d05d4a4be04e5dcb923077c745526bae38d9d6774e4e7e63afd4922fb947b0572807c84f889a32f90fb771a682a9bdf5155a31e0986d469b0e69181d19624d0ae384985681c49ffcb2e141ea8440f30b0d206d9815d7ce97d04067f1001a7f9aa4cea198e2bc91f6310bbd35cb4658d06a1e560182dce36c20e3ce539d4aae733fbc4a2edb6a1cbf13e18d3c52332047fd2f87bb177025aaecd21a3d78b3f859ad953338f7d710c9944a348921805137c51cee1ebf3b7abd2bd2eff48bc6c2f9f3bdd0b32de2ab613313936e325cbe3749ffa7a6377a01532bf8303a282701f102eb21647f7cd7fe6703cf7f5a0f1fbb0a0ecce432b02d948eb1bb99f850eca8db8a04a2a42df4ae6d8640c26f51a6926fbbd67a5c6f408c0d2229665949e909f22b189f71e1b69207e6e162b7c085dc9b1f84c419878845a611d6c7e1500a61d132064056bb5329615241cd71aa62ee67df9700cf1ef5725fad2508f59f41c94cb7ab6362247b7d9b9914c94602e602c81e1e69b2746dfbcfa05eecd43af1277f83745bf2a2bcc8105fbea6e82656bc44a25427fafd91311c34049fbd38599b17536390b654c662572d6180f070a5e1a5eefbaee7b186f2a51d0f94eb86423f7049c09867a6ba0e8e831c963a0895b087d0a72382505fd857e22f100695c6b2db6d500b563e0d93810de15bc602be8ef3e3e953f6f5071a3cca42145469abf001a1d644e6470733ab6f9153268eb85fcedc950150ede8e01fb480db574c85a9a2f49e5df326c5bedc8ad6e28ef29d8fcf5f0188892809f680888a9dc93c51f3f66d98713b45e19ce33b05c4f11d7bb1fb015bdaf0629ffc8633b1a0fa3aa3800fa003a7f72e4a60588ec8743207b6f21cf9f96b0fe20cb33d3e5361989f0cfa05ee8ac497760cb21e4e253876ea6c690fc812946908b79e8a354dd2665f3415cfa23420fee8b62d1743447aab966c99df93050992cda4ba6125f713a111191a8220b177f575b71426f3c25aea18ea52b6e24be13f90de47ccec53fc53d328697ffa8601d6f804022c3cb68e97f047cc83abf819d3218d36ec4d9951ade708a04561c7eba07edc995ed404c7c1b7f174246a2509c5aaf325d3ab9e467377de354d7d1802a79804da159f2fbe2af88adc376df0046f15a7c6bd109475608da1dabd3043aaa2d9fd190f62e131fabe00eb1487c39431aff841da124546423ce668fe09ee5500fd5abaacf527d06e5dcc128e77c0f530ccaed2e9c9d4b0461c8cf5af3bbefff458dc6aa2eefefc4f69e522bff8463d0343815021966c9f5aee60e025d943f37baeca3e0421500081742a80c14d9ee95d07f88d88e62e88640803219da46a860f1d8aa905b12356aa842f2d8e4bd536e625d3488720018d8663186c8cad165e9f3e44f6b6ca5da5329850b9332056d0ecc5c1cc7eb691c14d2aa9344cae648988be775ed2a5a3767493f9ceebfb7e54268d5c133addbd8c83e93504f758d452df4d7387168061150bf8d1c2e562078c4ceb31eb453672d4e18c45a5c7d50b3d76f27351715f300aa0507b2293d88489abbce4edea2a30b1295927f983f4e9fce7b547a49b1f2dfa38a0bb207e1a3a12d89eac800d15deb523fcc44cedc16afbc04e160e26662b2da8f05d238d6b81fb8abbc5c40e5c7ab175242d54e20fa0f839d54b32ec3ba87ef63e407746998e6536fa169dfd074af8a30a42996c6bc6f155698dfcc3ae14b76c556f0c2e790ac3ed65101d3f746a62e45d12556afc0841c038a7f9226ac88bff4c9e13eaa2ced3719a7a6cdf72771d3d1420cf79af1945e6299988d9630305f06c1643bc4a42d090e97a460602988dd09d55a0f3338ddb4f6898290dc1bb69701dd35b1457e1a0170b56380b06e82a7e86aa2ad2dae523308089e49c7b499da12a5826b44556984b4ce04b44412848a638881b2275c58d00ccce7200eeb5771b9895f0ed4d841fda00b28ca8cfc8f9a3249ecdfc74398fcabc720b8d458b3557ed9fc641f213abf5a7856f49394d2cb8b1a3196f55fba01a9691fe8d5c96701cb0d89f20245c76fc4ca49b6467f2a233142aad5ea75b0b4599ee4a86bf48f546db9f59396f73a836c176ea6544b4a640d6c5cb5135c29dc7ca942ef01f1e9c93e1520c961a1333f1625e04057ffdd71386530417f1a5d7a7b6c91ca2c870f23eb8cce3d44f66492c44a8f353f836afba51fc3d64c372c2e8b473a721254bcf0bfceff3867966954f999a814c4a5d0b0b154b6a3aa5f83770e14de14c8e9c390d8410ff361d5f0838dfe306959254f62e48adc6112ae26527bb0062c12ba5efc99a6fa8fd341bca9730ca51a730e8086ddc4bfda344f91bda9685e9867f16964af46d2da38c4fa40aa814aa99d13749bf4ee6d155d113be71763d80333ccbe9ad85090b228552db7b5bc3851cca82e80705b740df45251a2b3321d7c5ddb0fc8e064c802ad6907067bfb6d3ea8bef3726c87bdbef9f5cca7f30d644a1f5919df5ca9f58d02dc53007b2c001b05008efd46bff4948e11197283f84526e333ea5949f592a79c9a487ee2deaf5aa02d976a25db0710717faf8b196f6df9939ea8f409defac02ec7e97fad3500286567a1fb4178d785b85619f23ef685ce551434af46516459e00fb1c5a1b88c1ed57300fec042a57f70f91aed1093ecc1f4af0d1e34f494adc503a0a40739769cc95808f2f1e88520ae5b3f5940995ba243a12576a917d1beee263657207e7ad94cd2b06b3068c011c60fb1ff9dfd2c07386d0aa3c7f461d382f9ebb705aa3db04f03b651ff004c518e63f7c65baeb517b0845d83523f57feb52cd31a0dc803ebcc521b34e3c58081033b77650efa62e9187d2291b314604b21df488e64f4990c8990a6f36a9367bc838d6719d2ac2d1a2d7d667b56511b37271a94e6ca3caac8e3a1d013a16037807ebcdfe18bfb9e0f6521cb87e4fe087283a3875e9e60b550a0ddaf9eb2b672bc3d3a708b915eb573e4eb36cd2b7774b21f8a3504794586673342f0e8b13d13e46855f2aae9493fb020bdb826bdef0cb42a5aba683fbe60c48146a1a77da9187a73b833550c8bb91060d970ac3d2ec5757b6353eac66c81f4a8e488fe6eb69e88086ca3633b5b3655a07c8dd2ce7cbbb26589b4b8f21d43d723f80f0c7cd8535217eae639934e30caa982bfab4a6c3b38fdf4e163110414168ae9a527a6605160885dc7199f8cc3d9afdf7a369f26742ea7df8486badc6bd765a2fccd717800d46c36962271b06b00dbcfe576984c58b5e7deebc5b0d24608a87799298632ef373118d225bed47cd647e298643587c0a430b01ca837c52e0788df4030c6b52b278bf8b5847f8498a9496aac1b54815cfb50c33e5f0581ddda77c7d95c38ef4d9ff0268aecdd02d7b164bdd7267b66e91f0cb5533ba3cd65840ae0303838d390668185f0f8b6235ce490134eaa7e76ee062c82999e666f30ad251cde26fa4aa5746ea2acbbc55ea1dd785d357099c6b0ee1686d9d4942aa96081d29bab3545acbbd2430500971ed86b1f0b2482530ed2ebf14f7bd4ad3ff94eca7831fb70062ce6731ed80454ba3bdf7475c4b919f13c491ccdf5669416d170e0c5793df76518e18c3772e91b5ef1c6095fd9d4bfe0d973b3666042df85b6e02f1973eceead3aa3502498508f7c082d764a1926122900a2c20f4366592563d1b55f972488987214d63853a6036339fc387248f9da2ef7214e7991c23a16b04431468d795e3c7b2da99257f678d231d8b89cc96a26a68c4b8d82a451fd8ad2c79546402bfa365c58f8bc31137fafdd03be7cef9c594a4b7f1ab17fbe233a665c1f071e5a3073c1cfea76b9b1252409bfb16ace86d006880d08f0a035f26e689f27a77e7430d41b77785b56d31c307d2c0b4b1a33d8ad0dcb042a2330947513140aae52d98ca629b717ece28ebc04fcd85c549ec66f63ed8dd952f1aeffc971f5469330250336e774f057afb15b224c07716bc2b2b33d1c490a67ac82f84147c54181cccd0fa76f5d3cac128c8dd781158ffb581ad87c8e0abda6771283d6995cc2e27a78bc28f9dcb6ab478a95f01047a55321a3ba8b0eda1db2d9e8eeef611a0e0501a83cd3b17567dd1888a1f0aa7b72c48fcdde05c13e5c909eed65b6fdaf0ffe305445d988476f4d518566aa03dde53ea7c45cd1d63cc700457b20e7999b1b04eec640c4e03c0250477b4c24b34513fbd7a58eae9ca9daa3edc905d52069886e01351a9d344404b52337532253dc27b3685bd71cc26f8626e9b1b1f8f0d51fcc83cabc8592099d3241cb7af063e03d71f688938becf2efc9160494a2ac78d5074e928382d6412719339a6e7b07234699d5147c1b8a985495bed6f49926844b2300a0c9f7aab8445de6796253f54205e446f2cd0113a8c3ebb7d3e57361f03cd71a21c2319efa7da6c0f3c417ae916fbacef331ca8196f8d104e594b55be7f9a9a11cea92feb65579f2faeb5d2d2895044ca2979969e3b65d790a0d0765aeeaf254e1370465677b6a2366602d1328664f23693de008ff39441030f1150733fadfeb6c38cff28519b02a145a4c6364d05a756b1e78670fbddedc947e13b6ae175fefd15a10564252275495f6b34c996bcfbb743644cbf89a69b252966f9f4047f5f21011a90f85bab824dd2974a5125f8bc6ad6b4a80090105e6f8342649fcd4da0d86ecd4984e72783f6d1e657e3da8b9cb43194c59fc429709e4e5023e8bb5c50e864d27a11a6d3742b5acadc4f23ae21456b9020ee694b7de5663a7a86670f34d5217f72564eae30bc40f510c2c60b081230adc5c2aacafd1e66f9568b5703f6446c504756ee69733fad92e9aa689823d0a23b97d46b99612182c95bafc9819ff1067cb41922db2dbd3ad5bfe33b48767a688aa33f393abf4933263989a7a564345d7c83d0548487b0e09649f112201c3ed470109dec0296820e1505b76575d44d4befff5dfd01c1fc49b010593470761108bde3a441c7c4fdaafb190b564170de9ab9df051e7bb0adcd9908e391dbad9f0ebf0477675ecdf311799e69b02ee8318bbd2a025c3c0edaac4a3592b79f62a4837314c11201a84f31e9e6d958e57866040a5f2bb06982cce859b06162e7a040a5b33f2be5623200756880a328c9a19ae924fb7c896f5496a60340abc3125eec47590fb92dd03ca44299e8716bea1d047d06acc421483b6e41fc46a4a745e158aca19797068758b833d51a5179d53d42138f6381735cbbb0c2b54426754a62afaa6fa98d0cb4625e0b03ca0a3d371cd2e6dd1ad6da6d2bdb297f5f13f597d5b7077ad97108d0e98ef8ad3321cb4370e8bf374dc67e3e00030171ee1601d2f95086414f8c70209dc1716a50219e35992df51d221d1fdc9a18a45e8b29ac81e5ca93d30d428216c45440b8cd926add5519b0054bb86a61b307c22323015401c2eb728da840ef047d4c2abf2996a60944aae607e0e052139c6d12df55f4e28505a16c0e7ac134af49afc298e4f7493270bfa502282bf2bd621c1aa9383e0a92d5858523b198cc46a14067c1e00d8de0b32ed1c531761786b9e130d373eb9fccc6eeb2eda5d8f75785b906bc1c05906e0097234487c6f9c1bce308eafa1615256edc6b6b87a2e70d81c86576634bba14ef1b2daf37a283a5f4cb18ae78e59b20362d53afe4710bcf560be1b0bd378dc7d95accdcd00d0c880634eeca564b4796895b914c7c506238ae3c395a68137a2195e000451995588909204a746379ac80f54b7755f9c430f7dac534b39ad28c28b99e8015638307e72450b8cb6d56c68b791582e86757a7cb90d014c783178b14b8bfe53fb1abf2a9111591961bd0131261c82275d1628a06024cd36e44e0e4fd5204894b6e17086a8c8ba36d0aeab3737556bc35642082d351adfa2270bc1faf0ba09d661ab6cf443caca1997093d787a97413cae68482221254ca6ad099580274db1646fc195b4b105cfed9fba2d3ccabff992b2e05a6aebb5d6ebc7ae40ddde56c86763007485ae72adbc1375be6925b889e3e02259bf24b1aa12b76f9ad65306490fd405938953c69b71f50d702e82e4c451a537200e3cc349f342daf3a4c3c7ccb0f15e616383124ba5de8ac5d60764c040ff56c415220aea6222300c018f7ca2ea3dc57d508c677b779fdfb326d77d64b7cc573d08f2d8d48e79cecd62f080f04b96580534a807432fe4e4f0433472e7030652a9a146b463f83bc36b46c41ffb48b1325c11a3538a845639d98c970e1445658a013a8d9a72ba36aedb034b621b89d757e460e32d771eb95782d6fc4a726c9accb93774b04d23430bc9e39b9c2181878fe1ceb632adbbf2df4fb39fc55a73fe78cf0a50a40791b2f94d84e756b7c29e6f7f8f0f4c44a87775423b21980066231bd3cb306d03a86ebfc70a38aeecec325b7f9e8c4ac1494ee261f2a283ad8a2970450d2cd5254dbefa371d98ba1b27bfa0284bfb1e4d069735b724225ad6d93912466c1a74f07cd9843d4c411fc05540c4777283635a8ba7322b10910fba436c84809e0c1cb773f53860351cace24da7f26f1aa05ae4c0a1a1cfca141c8d28c05a16ac2cb83404860d2702cccb54f37aa462a600e70546cd3e426f7ced4f257c8a47f406b1a0696ba3af516dd6e02e3d55df110ee1ad2539d3d21f7fdda85ead65d32d69791e0ab6b3be2b2a3f158a38b2d8a25ca8ceae350e29a573a3e1c28310a92bfd4cccaa5ca4602788c2936196e7b694c31001029e7e9131abc4e57be60c8d60d90dcb73f084ff7735d9b6b40e357f528f934cc700c8d873c4018b91b15293e280528bc1abbc95f361e5aa23a6df9f4c3ff3a5c6be857892e384b0889b5c844f5f0c63a698c04bff8571655ba39c0d6d98bb355d39b4eb75e43715665d93f7d840aac0539d367298834087915c53105f9282082bf20629b93072355d70ab1772d0069349560a1901db72e359a81848280cbeaaa41a6255212fc3c9d2c035f185fb6c3f0a95daac8bbc6b7baeb449199ca6e671f1116ff046fc4d2fe77d654cba12b157f2f217f4c9d24de8e021b95fc4bfea89bda26b27e2dff3956947cd72fe88c34e647c24f80a64f157eb3537a44f4560089e81ce39f4814c7c921a1fa0c5e85666555bdb78b272bde309a023bb70ec66ca3005144d6de55edea7ec7394d1b2eed9087eff331eb5bc5f92efde73c5b1449dfb5f8d822094a12624a6de71d2efba4699d16baf0571eeab785a885669f7a64c1b5cd34d43a2e27d12e5a726b993525c633796837224003c7b3602469c8e509304f21905f743b88340ed228bb1ec4ad54bbeb07e8216d08e31b295c69dc52ef205e8ebf038bed90be5f70c60bcda7782207f3db2650d2154d7d774ee622bc31ae36232a1563d1067b4eb0e46aac2fb174a39c0b066de4ad7ff88b6625f7d7db6823b3c919769223f5971942dd7d3c9ccfa912f38f6096ada99838387799883324dbd265f55e9f8b5d34c3cdc699464517ac47a02a9939a82aa997f3a37696f4fbd9555e4189f787f9f71d3d290864aac4a1cb046a33875f5b32e9096f6969c4948b49ef670d0c8add2dd394568bd98985bc772598d18c3eed9327befa440387134671d89c27a04348f8210988b37304870ae817268ea4b03bdab17d757423f12a239eab66631fbc9b8ab917fb0d2dc0b89ea17114f80e01006014f1608233a4fb1f11c9d1b76e4ec072518d98848fb2373b034060fe6b635dd7af23d1188d3873b11a5eefbc847ab0c8308b41eee2d3bcc5fb3cfffef4a800eeb7a48b65d6991fb630aa53788d49e3abe8faa94d78b2c4f9bbb2769d9501e8c5303be66cb20046b5d82acbe1496501670b2e05439b70e57ac25fb3f018d4d37cb45bf7c42f62aa5e1e221c6b9b28407e6e79f9cf6d1b358d8461b9ffa992b0d40fbb18c5de6aab2aa76e3808fac00e780342c661ad75270afe59adf06d299d15461ef5e081cd4e32aff98ba8f7e200124bb361f1b0116e66e6595819e6eafba9af907db765da91d61dda9a00156948626da81e037589f371aab04fdbe959b4f1fe0d267b311dc59689b8ced5e175a1906f194b21712770f3b31c4ef87a826ae9515df000e88dac119c99004266fc18303621595fb33b04b0b8f6306103924ff5d26540b087aa20df6d04adbb9c265cfb6d23e1de3c43204f48533b6d6a5e7df1827e8f8152c75f7bad60c0c4d3deb6b3de5392798ba377cf6824017190849b04e2e14d774ad42480797d80817db91e36a5f26841809fc418d6695c867d0464db2d4390f4260b4f1bbdde97802cae777bb192f8b093b3ebba2a865458d262b1a1ee4d826bed829bfb52369e4a13307990bffc22269b41963c938b646935bf28b90ab1cb32fb8f5ea03229c8ec4610733b4b09eb5997aecad42b68e119bff37536d9c6fc0e240892d488c8f4e26757f640d94d07fd7a4b49c7042f7aef009a8495af1b9aabaa32b69bfb611c4bb6f53958ee3812cf95c091b0f55220cd3c6d8539e3682de051b36c348243bb6f5636ccb51d3bb4ffdf525e36ca342d7c45c5e112ac40b02af57da520e2ff87c06fd575aa8bd9a2128b9902fe131d9c39a9c7fbf496b50aed58cea85b516ecd60996ff961d073b42bb01ea4b14b6b8608ed3901a7f29302bd825fb74f5054bd1660ecc654e76eaffa4cd88fa28caf6256ec32ceb2c60bc50c1544c0fad34d0a51effc2ed614630e777d126164013d729701fffa0cebd3f6ae55644dc6a0798e2a068fae33840a03f6468b5b22b60db75c6faf8c97e0f069fcbf8fdb60c9cc5879357f0188b68376da4d6a0cdeca36e729a63e0ce5f59de37e3017deb575791c57e9620fb2de96a7d8f21be0a7301939ec61819b8ae52abc17fac40ad022fb06304f71a40d20d7784408a4cfb10636de17817ff6fd862d7ac0bb7c2b640b5751078c4885f4fc28b803ce31b20267443e1251f6f248e0607299a9d912e73a18dda523911c36f840c7fd7064a245478505d30994d090c2291627f44552ce0bbc8a37008de2a018a38a4c55ec085301b5dd89d51ef0981523d72f9697d8158d3d030a48ca9aae08ac397545e443675925f75cf51cda139d3cf07e73397fb8dc520884214c292b43d343258314c471f4068682a463877f12c8581681ae56116198752e6735176004d5934c99e2f84f9072ee8d9d153a340fe80906c95d55a8c9cecc6d502255823e95d971ded6d2d6a1cea2f0496c37e609195b0d0e500bc15228be89f59c4d5599a4c5bc19e816d4f6067aff643c5edafa203832bb50cb18980704e560ad70f57546496b34f2d535c779a2a51596e8c7855c05c0e7cd9a8b916782abc2430131ffc773837f1e26bb650ebb846377daa39324f298956c08ff5cf0fbdf2a3307ce0213b375696e2be34ded5835a6a2d73825f79c92e74add5ab94393066d3821526a7c720e83f80a44abf231a3222f0dc7a4538d2f9141f7d5ca2be517827943108279dbb22385046c5ee71ddf7ea41e16b077016028f0a18f000f821cd83ed20afb1638be0296efb9865c816e6292d4416e165d8f4974c87aa9a1f9a49620494694ffb742a5ebe486c5777243355ccc4d942ee5aa512d80452427b384eb5f8dbfb2a53814d19ac1bb310b8e47e243e615d68d9bb18f33b6c59e6ea4cc0bc61a2a24672f23d9b1430d8953f7be0dba7805714cd2984c13f8a7f55932ecfb1ba008738515170f305854a408f2f25b2780a915575309959024221d8d7d3501a3538b604d2472a73282228eb7ab5f1f23ace15cd85aa28581173b847650731cad92b488f04a9cf1bddb329051e1c411aaca34467f5d1c6105c5cfc059d78f33ea865c8f3787b531c0603bb1c6374ef72adc8106690f86de4806481b7a199ffff55106eadf8e6a2349d3025e9c4d6bacad5b6c569f519f2e85771d601c0014c28c570c17659b9ea605010700789703e086fa669d91ca726bab52998ec221c9bc9bdb144304adff22d3738dd7328b4c19f76c16be3f76833fab29afaa5b0c0b15135d7c3a80421a150c48fa4f65792d9ecd9e14e7cbf07530f0122f58a1159e1bebabdc375861850d77449bbeb5ecdcad20f2b6b6619bb9e57520d187f8eee371a0f01c784d1491746686ce3415520922ff10b49cc4aeabb185a9f41c449129b99c51658acd5ee7418027c7feb40ba420ebbfa2e759895257576d9adae4119ca5949d7ca113a18a1e7aaa4a0f5574b0128fda51ac7f91453424e4550ec0b7f3643fc4f7ac1900803085384deb4e016f21bccc1007cebd66d52ecd217adfcc785d857f162877d41016f197b4e2f916689bc7d4b205625c4d348165d917dbb981816180bc59afeca4184c842973693b6568f36e477a801a8b4e6d6c81710167cffd5929afb761c2101acbf754f7a08583f33dde4978af1af3510046f0db6756684ebe3e1401d81c00e20f3185a863e216efba675453b202d28c62e3491d6eb63c7d37aa10035c85a7517795a330b154c7cb2f6083c136e9fbb25c36e6fb192d8fd5d55c7d99f40dcc6518a419cbe4e4bc143aa301705733a263402ace984fb039ceae69907c022f7219788edf9c91d30281ea6026149c39e2c208d6337e76289c62d7febb1dd5101338d03c489b6adc2a94708a556c6b3558e49ac548eb29cb428c0b584cdbb554f3473f478d86a071e67cb2857ac6331c1a99c89537623d4ade22a5b8bb3f58c066cdd5a78245b54d1b46c5508e9aa5ca480d6c0197c30ef4ec078d86c7c72b9b43f53201f6bcd62b5ab8d7b67b01078e005fb58ddf52c091c11fc63a04db4d4f5ba97598ba81cf668ca917e6bf1b021779ac9acc81b2ff42fb06b2cefd491adb7d616bac7d314212a8966e5c79f95bedf02304968fbb040c76d423533b96402fe7407535ae831ae5cc893342eaa58a7052658c43ccdf677c5b9a0a729ce66716d1e0e7138fd5713c02d3d3aaeaaf2430543c12610caceb5e667c3eefb43e9c4dde55220ecaf3df2d3e55fc660fdfd6d8f4a399394c1fad386e3a30945c406ddb95cce3faa541aa011b4fceddf4f4fa5eb8491ad0598cb7f35dab27f8f5d0179ee5c3ff96d970c92dbd67826be8b92a1012207fd80ccf0df4f7663abe11e21717fb20a130a4b7cc3f2a4ad0909836f3255c844d43e9eec2e91a5683962f89c0b8c5c7818e376b0dad205bdcce83f18f207c2e7fc4ea3f106ce02ae803ceefd8611c8b708b335f8c2fd637200cb678123037135e0f237e6f9f18b04e30947bc0f0ca60895407b3e65dbb7720ab08f8fa46332dfd0e26a4dece89b67229f4a44ce1228e404b179442133e9a6cf90af982dc87c8495ed2f55e69c3641533bb5c644f8dcb161f8373a87f8d90984853151252daf616c94e0576a0df0d7d8c8ac2c6df90eb70af87ba0ce497d35a1b0b9941beaa5f6f17d3866a3bf3eba92347c56e7195483a6b66dc4d504da7b010674f4197340b44bb4cdd871c20502fd1caea9b820fcd47c828afa01021027e538b49239b9a990ef86730c82a4a9372e956c04a92b2ad355c1b423d487c3cbc112a990e72f755b721057880a4690a8d1f92099757ba174d7d887f1d9db36756d051ededd04c9b5b5020f15eeda6e02d5bea38696fc277177cca7dafadfb0184ed207ad0f840e0d27bfa626e48ade790a78f6f0cd5a127e283a93ada77af832706bc1a66d87f73f7f70b26859093f05ca7baa3432cafd5a42981ace66c4bcec1404856bef94b15c0af397bada8e30fed61f41681050cf98c9bafc5f6b94d8e9adc8551a31608eb43ff9754dc6d389eb6c7eec194c6234735aaeb5ed3740c5712e0a2c4d550bbbd3820d8353c12a80089856d01d1f559bb8c3d85d141e571c7351aa84001f802004f06e06e0ee4f9418253194a80cae1f68f3ea80186a35893eac6c32be4dfe0731b4322014d8b666a58081ba67c209afea223cf0750746672e268094cb4b1464c4b47a6b3c00476b645250105717a8ed7b42809e35ba86b264e7fac5d704493bde4bcbea7f7852649929b2eb3f1633f1f9fbf8d7a208dbc9b3ab3dfb9b2449c00afcd03ba03660811f9b6bda0d92003dcef87b32e1856e5d1cabe9568beb8ca647d0d32f9e2b040f0c30ae8ba71c02914658d6b47e31d620e7e85d4c6e32acaa125dce72acaf3c3af1770bf1ec9a2c88cf20ab6be60c9a44b0a092432f54e4d31abd701d5515cad6f30f9a62f20a5b983f39fbc3aa7997b9e60fae514f7ca3a18312f396ea699b7362b25e2132c34c1657adbeed960afbb0aac991742f204aaccd7f80432ad058ac4062b68d5d16e8ff8953dc32adc059dc572baa1b7495a0cab58ea3eb14e0103ad282a56b91ed5d43d6e0f18f175c98e02eda980b864ce32368c60381a9912a4494a376d874de059734e878e1fe264c61451161c4d303c98339c530d2a5329245ee2f081964883cfe76601fecbd0e9cb22033e74cadb3dc5857a37c64b5e01c1d6f809f810563b38d000c7557613475297eafb8e2587192fb9cb048869ac64a48737d4971363c80a054806df784cc5ef30e083e9ac6eb8c1701b08495a832340270a4b604a9f2deedeadbf50a16f12aa03dfb2d8009028f3e9baf68732fc24a95b65feb3fd0c25e7b52b021a50c85c02830f7dd0729bfcb440fa7a471cd5ed864487bd068a0a766b5e15305934d2ab6caa449ebee6c51869a064dcdd418306763257289ca32e0a7be9a93e866f388cbd85fadb7d68f55e346b6f7fd5837b3a71ac6e245b39c1f1bf48b0937dcc0045d32a2c8f9ce0f4a29deccffb65d35af6994a24b743137efda26c028afc0482ca9034ef0005a8ba5ec7c450f486b84c65deab89d00acbcaffd3191026b01017b56bad2969c35f79fab7d7e6e555015ea9872557a551cf7636fa579cbaa67e1867991c93db45ec52ed559819a3701d6daf9c104dff2647451dcbdd51ce1f837a86dce8a7e6708abce62b85fd8d8130c8834c7446c571139b3df6a375b97a55556f7199c74787303703de9ceafc1880179a61a075f80761836b98ae5502c1dc9d860a244328d1a33229c3fd7b61fea92b8bac334cd36b971071f38aa87670dd178417e4ef29bab34e4a22685f57e1cb12c899605bef84494cb058b1458fd683b86517dfc6e142c603e48c6cdfe3813a65b8c8fec9fe86a0a80a20deeca116178e5ae71cbf4226aadb7098aa9a87265437d62583528de7ffb1d26c887e855de6befacfa6ad6ba55b26dd1dd27c238589144a2080d8a1dfb3979aa1c8e0e1691ad3911ba66b1ff705856e0d451f8720d2b05964fc6a11509ca76b3060107cadcb45fa3785c418348321caf7470dd5e52f756d89ef4642e241e06cc8626af2d0db5da0d76ba074c59a0f8496f45a1d55b61dc9abe52e250a34f6ec79cf353998e712c62e9e7782c24b68676813113269263bd5a36801f88c39dde6f7dfef6ea4c3972c4958fb0fe63b268dff39f7b3df2481ea4acf1bb5db76fba5c4981b7eab77db2c23de2b11e2ead7db601cd1b6f5e86b5e6c37418763555bc8458eff7e802b18335c72ce12fff68ee581e3e230af6a56bc0c9dc99921ebcbd1674bee1b902237f9ab70edb6b655e82cd7cba88b8e2849e2f15dd206721ad142984f65ef13f3f143e5d95c25e37c4672f3efd4393c0f26b5280dc330e74a704fd6421505f65a923a4b21c40668102f7b15dcd0f82938fad13c4747c591a3ee84725634186877219dbdebbbcb83b98118a4640fe93305b571e7e912112e63e1aab96867e438c612ff5b32b828b09dddc147db76cffe1dc8b6542d388948222c1956118a203456e37ba6178300fbf711de38c758531b004a227f1fdab53a826adf3e6329dbc6cc72f3ae57e566c502fce9aaaf7d8bd42dcbbcded253e6478429bf846db7c0185e590d391a1da5eadfcadfec21aabbbe9c8e97706c6eced6f8b1960f41e6086baa9c2f4385195b124df5825dab2e57afce2ce59628ef6df2f5c644de08071db5a1ffb3d061c3ba083c4c874bd9d040c87dce6d7039550afd7ba98da24f7fd96a07f44040639452d1e8407272a137c28233a650706cd554d37c5f44466dde0777c801ca7af1b3e29d38e2b32321cdf8f26d269a8c1dac3f5e95f0393d2fd0c1911bfcce84da0112d556df7b06748c14c66b1b2910840991a75184b669b0a83bbd65a4267d8cd65400e4adc7ec4c706a478ed4d5a7923e8bf68941a6f397b914aa2137daaf543c73f8415329a5277aa90f6a632d1bb41ba4a9da1bf741b9e640dea902c906f510af80843fb59f17dc8dee8f27c4b255c0338ae75918311eab7100518f536fc3f1927bb56e3b186a9526748c61f7cd768fa1ad1e4376c6dd8ae91391a8a7671ec8b446b47d8d92a27ae5aca8d20368870a731aa411a2ae493fd133ddfb2a2ddcee5a8b6ac3665a6fee0c64124f07339b24d4ae9ddcf0f46ec28c636ac7fa209fa4c8cfac5c4c0171df05e4d8c69b8516816b0df2b05862471f65a7612da344c479270a78cbbb54d6f496a2333024b818b0d21910658e6aad69ab2c816a8d9af76b2576b1447f613039a5757d131b2bfc37351642e3ae6a2b8b262d4160225f937190bc7bd8b774edd8eb2d12108597a1e5cb05213fdb0cf0e1458f16c74c71105ad80a14ed1680dad776e6213c2f7a65cfdca20cb7517802c7d30d25ced7df83a0dbce5212f427989db4edad7622bd731d9d74b62a318858e0586547395d772f5f7d0ab376bd6839b9c15be9c111181d0d5c3cd460a0d1273bbb818d07bb0ed2a9dba9cb59b0e839bc040bed2809aca1b069a83dfe6da1b1b800bce62747dd66a3d270991335d0a80f1fc555a6c52b458369db029071183296ed98990f888ae7240bf8ba8609111b01f64dd4c7f9df805b81a58abb8ef49be421820093b54efa715f42dafa6e71a205c7252caf80b72d2ae51c0c017d40218932150304b2bd548e4bb009aa5a968d182f9d4702f4141208695d230ae6f4c8f7cc28698d3b0672acf0df2c36e57500429b460cc89eec2846e14ccbb2c2d569121dbd8fac0f8f291c02e152e0f51889b02e88b8469ef16e37354f3f63fd038696aeb8ae5574334845ee23ab2ec48cd066aabfee7ba85ce307242abf794d2128608510bc60a4774da2c9074ca44623460ed6da1c958aa10a88deba50b1df4d783618d2a30186845edb4d44a24cf3aee719f0db34cba41ad30430db935c2f30d276f11e35b47b6315e82534d07f8b1696cfba72581e5fa3cba2e7befa8c8350d68315c7f758d87da0ca0bae484b910babc2f0153255da145dee6546d8431fe487998facc1e8a18b4b2017c0f8a993b08a4f853d645cfdd7f12294f6e65057717656971d2bdaf8846350e6a7b4db5565bb91a6f13eb8421f1bcdaba61f5da99fef77b9b8b6ab5dfdb0a1fcbd2624146e6c54efe99002a7d1ccef3a6a049aa79b3ac7a082c9a9f6702df0e8f1fd1c3e0907d13ca2d5c9943be4b5465b0a5922f69f1514bea4cee8368afdb09264d20a92b4b0d54a917b8554efaf87062f2e7c1441b8a6a44eea9fb61fa5d28b2dd1fd20e88281f1ff52d248786693efa499ebd7464b3738aced1f499222af7caebdc4e21c5893461621afffc7edb52f2f928747875a10593dc114836349b219122553d8acb0eccbb105349265538ff196a8cfe7293dfa81ba58ca7b7979ee3300d90c5393ac4a82c6276c57f930346deb7721b993b1bae09e47cd6272867e5b236920ac3efb9b9d6b41e29ec033a586071e5e53cb11e1a8293e1b49673624225597c49a63755c2f53f95e7c5d0857afb31ad163362c4f8535e2b2df837d64c0b6adaf017851baa167877f63733b6715993e3105d6b1a8f6202388fd5d6ce021ed6bd30f7c2145977e786dbbe968e032ee5929e65bb5f1f17ecbba8a587c29d69fe430780d30434db3f205e13022675a75dbb582c0ec8bbf00b37e157934cd16864af98080ce4789b24c40dde2d45692e51726f42e5f5c406deaf27b33c2e268dc7ae03f8d466f5a6043b814fe0a23cc85b7f6e69b6750e3b9352b34e78471f628ddee680be61a2cb8b371d324451181e54b00468eb1edd149feb6bd8b65621b6908b9d90dd1d76da5d212bb6afd6094a2398b2c54f41650082aa65511cbc89f8dd6b8ba81a187e288d75f120fc6581583d6502bb0b22bfa99cd1ee45bf31a3b9039587081cf28a91496152901d9fc965c954cc71dba5c4dafee67f7c0b2b62a1d7616999b27bcea58bcbbd55d7956ba41793854e4d2c59b51d6a9114142edcbe9a6e95cd0a1733b4c2ef80dfbe56c5e92d516edc68646f89ef271cd3667e0c3278c8f968e8020bbe7f51b65fe82cba0ba3104c48716d03d3975ff1046e6644b528c89f10624c1f99b4cc2936f268cb7defa05d49f15d5a82946c98a634d9004a315d50364ad980915a758b35ce3e91962e96199ede91d2cddd212f2f3b1efa465e0ed0626a5fea7652b4fd2aaec1183db649ee9504d5cc415a0f92aeac9a4afc1288341d8cf74a711984beb31a82fb605cbe77599fac0c08ab17929c6367ac54c9c547385518ce3a20ac03f700d97b38167f15e8011d92526a9d6391a57e297222d6a00a9be584d59ee91449bea91c52a80087942c66ef1ac5bbe7f38a3060b444552cc58a6b92fe4dc679542f84061ab27264ede6aafbfcbfc1d506da2b43970db032dafc7056419c003e7614b154482077ca1ddc54a0a446a8116a70f0c6c241ce2b43567bd8416fd29471544ae581740ce95a52983ec0963aa073755b73f0e5c12d796b05c6a7542d9e4e4d092fb8ee0dc89a8f5465a43e0a92c927bb32d16bd6055d2e2abe860eb4bbd652ef090dfbc52ec9fb3e86a069ea63fe3390ffba165177cb3768e7bc5e45d0b86b0aac27d6660426af993da77b80794d1532c1e20d8c52e89fdc370f8f1b087ab689df216285ad668f1a39985fdb8dae8e226e54ad723ac96f8fc4a731e0c4116c93fb97c2857ee985a8f60bfadbd82bf2b1d97387c0cfaba64beac91e72d525beff87935115581ab9afd1812f1e61b46d99ab2e9016caa2b6b11a6959d1212e80aadc5c1210bfca8c00d8ed767012d4cf8101a2b4654e10cac7342fee7fd869e8fc83ab7ae0caf55189511f266375b4aa66227e9f3b1f0fd37cf9ec2cd64d27e4c4eab78490d0cbd03ff96237872959b6b64e2893c80512470794b1855e63b1077d40bf835c93b11675d24ad6396a5327321c19543d11bec71cbb802aabfc55b9d09c7d83fca03ee3af414fda88a4eeaccbb3f4717e9aa7d07a0d19f38bfb3ef445c3f6a5d0c1d9d89a2caf7812fc36d1b1e10bc5a3a5435af6e2087c34e770c1d73fabc8f0fa908aa4e487a8d2f11887952008622ab8b8d9db8d981829c54e1a5de3eb3766d0f5955ab74aa2486067cc75f11b74d400329c23c07210bb1bbc39204f83c445de9875f9dcf94e0415271b5925eb32813035122555500f78f0c4a108d7e0a1b119c278920e1f3ba344c1fe250e56a577710377b4d08dbd7dc3491f4c3414bb9fc995fcbd34d7b408f36f3b10d8af513d3a85a62428f949586babd70c15b0630afe1db956d05ec8fd7ee4d4250df08ddf254e1c27ca192accafad9bf4c9301b62b7fab614d0667351334c92a6bf8d2db855b9d2031d371059e1569b4e3df408b4e5613642a6ed26e65c7aec3c2a86cb2533e29e80c08a3d03d0e653c927032393602a02797119d62c678870a7a13b6420bda1889804c73e930f65179fe8023f3fb1661e64d9e5479e247f7c123e9666c19e89b634c322d4d1b3fcc45c61c4b4574822967601096a83d870ac9ef98e82cec79c008de2e0b9c7afc95e86b226dfa81932ba175268f0d7e390951e40af0b057beeeb756f7983496ddf18228bef4b3a8549f943e88946ba49381da02aa1bd67d0d737194cf1dfbb93e36b5ed54887dbf908a353b65092afdda2d4021b575f5ea1d4f9cdd6e968a96ac3dd6a442343d90b1a28ba19d955bcfe338f40f59e53812f5be502e2a082e501c3a356200b47e7f0575bea4bdae77a9e385ea9c2b71817fb942971cd659b2c3b0f80b0342c7c3bba06adc8d75caa5d44209a8bfc55000053d43868041d71065ca61939017c00d16f9398704c052eba7e4869d72369334f29fc432587c5608ddb47bf5e6c08c3ce58bb1257b12973a89b3640110accf4f26a7fd0ae57ac5db02b7709a27f811117bb33669f1139e2043ac9d1286f288cae9696a75522e8f4177ff0b7456f6170892c7865a92ad49af6a85d11ad4bf6cee3d3e80c7388eb3666ebf4997812fe14e795f7515979f5f1ba3de1592c79288408862985bfe5c33a360dc963397a809ebdb21c20d9b681dec0590f8d98ed8d959ef9fc95de6adf19ba01d9049128f3f9f0e087f4c68d201c36b8aea07a3c7577aab068f79f64cd709551beb2165a277d2a2dbf89e653e512f0f4d905c6a5ec25242e220cf838f5382262481b6b298e32438221effd31cf0a49688e574e65e8c081fbf6a680fef754cd9135a16a4f932d23b9524dcb4831b9fc01e52c454a451759a82e776faea3a6f81cfb8373859bef442ed3dea358bafea3501b6b72a0b2886ab83a210b5378bd9563a7908d4d33622dc3e026d79e58f16a22bb7d46adc2a982cede2fcf5ce5ce7c5ab567c4b60d646a762345473296141bf0833e797eefe35713af32669b1cf9617f75c785300e2a092645bb62f23887c13089796a40954bae6426e1898b3c683bf623cc6ccc138445c5c52d1166cec802b0b6b51d52163e6d0c55989cda9f8d68270f9924a52e197cd38c0bba515d2a69a2002162dafbb5258a61581e9cda65163040cf55f7aff0117d6c2587ff5b3fa9660d53cd50b8880ee0ed3153ae91c591e6cc5d16243c1e06d45e827b377e988ad5d617af7f3f2686acf249ec0e5790615d0079dec7f9339106d3fc44463cac394108fc86c83fba3b85fa4c78aadf5b4d9ac8eb78d0c7291239e65a784091e77eaae8ba450a0a17daebee902daf1d1e460c992f8e5624583c8c651a130c14c188c585cdde36c00442dc29f50e5d3e0e88f6729336366920956986592ffc25e42d4fdd76fa9ef2b8475ec56471226869ee8be0e6bb0624db6c7808647cc9bd88740bfa19d9cd43c061ba4139afb3e22d814d546f9e82d338119bb9875a19294c034e881ab51a072e2888fe8f7a911a0f5dcd830bf4d6edec76b0ae66524519092b7ebda85eb38b432247f3874bfc0023f6c0876dd1476d29ea17c71804a813e80544fd0a3755dc2e37e8d951c8cf95d65192fc80bd21441814bfc249bc4d8802e361d36b86184da2697f3856c3dc4f0b86f1fcb8a33ba285d0a3acef6a23b7074aed1ed15a967d94339086ecdf896a7318f7fb32b864631b18d5761e2fdb6c79a1fb5c043d70de28d5f0e69dd533afac3b3d2d9cfbcdebb309b46388d649d0ed32d30d3dfc918eda088fa39f84c5694b88b6655ece8980b654ec3d47c0a0ec7b7797c0614011f7cf57f9c46cd8d2e90d9125404f92b9dbb36bd3d9f6a3abe9edd2a62e0e595a2fee7a2f67a344090120056b3023ae6a6991d7d20ffb0f38d673498f4cc5cf022c7565a716845f054fbf1573a6a733f54c324376112fc507c329feb837c31f671bd5ef970c28519b66b9fe09e83a5110bc14c031cdfbd4e39ff38a552342f369220e9cdd623f4143b3a4caa2b2a87c499f3fee9744d5d2cc85171825d988dc5bac0b26d8e7f43c25378d8827053bd88b5f06efa3854b530963439d108d92d87088a853e0a63b9743b495fa2d4ef797dd9f2cc3e6c1641d40f112b2d020c13da59676a122afbf6b6d50355ba901ed3384d743202178c557deca94dd20aa16223155b93e7a59eaa0416b6dc4ac8cacb3d39d1c28bb6b73638628266a42753149e3c30ab7f33b01daecd2bbf566f8aaf5a35892c3c9de83f20b90284115ad4f46b9913d9985f1e76757abd9e9c288cf1e45364a6d2623c0a04d031ed2017393f9f34923d5e79a5714ad7cb7404e3fa0a90ac881ee08f39967e6a5da7866d6b2075c293eebe7f4fcfc80c22599d12bc15f574955d7f49e75234d2dfc0536849a19d6f419eafd336789679cb96fb57ac9a6698539694b197593403daae72c162baad2a1988df8343b146402ae6e2a5f30e544cf5511fcf075ae834741acf68cd298ab3a07e7d8b53f040c677542af1221e261de84cd62d6c0956db0d92ef7830ccdc7928124ed20488644300a99f7f0cbf41513a84178b710afd5b47102ca794a3b267a01623308ae01d60f124d88c8af3695bbe8637250fe46f53ebf359ab6e501aaea643d3d597babc437b243ad1bed7c096d2b6e2f0308708c0dead206f7d6092974f0c23d10966b4dc501a03dfe0e842dd0d2418d35dfa0b7237ec43698110e8329a6b2777711535eb53dc2677383c901724df564a01939bdd9456b93aca7c0eb6117341533a9335a10e2d587c11d9916d7c4890c1537a439fbee851b0824b1f523bbff93b580126677f6ce02a9a5034fc9341b8fdc790f9ca2a24820ecffdd7f6036e4cb06bc0301a0f264d46e84621649ad65c7f24917f6dfead5d9385362a829d54c14829e16d559547f288d5a59081f4c9c6f511af5e94804f10d1fa4690ace573b82f10726297953db7c7d38523658c9d4546548acea36cc8d11238a88d8501462131b9d0010cbe488048b0f83d203107bad3d777c587608b6173c8c1d58dc88dcd2069ecd981f87cd9498196c40940ddb85601c467ddda3cd0ff014c7f779cdea0f039f28d37821ce4db6669195cf5f28741341cfdd84718b4d573dc633c42030ff1e7b8d11837ef70b52fa62d2b3c6a8df64e0cbddd91e5ca87173c32a531eb6a6215f9ac61d48bfda398750ff039ce903561f62ee75e1410b8c884f889bfd4ead3621b1dca902637cf3b4d54800eb58155c8869b7a5e1ac823c3ac40a191c894253979d0a7140ecde4f6c412ae707fdf858ca6c6de95db80205d1946460242d8887b9219c6eb1d67d94589dae015e2cf4f4709b5c0317b9513044a389110d22f70840aca7c8c6fbc81846e2a486b27304e1504033e9805bc41194f1b04a56cddaac691f9d612a6c95ab3d2b7dc4f25df31f5aa9349fae70ce2226f121556872a1c1c6333ce81a47de02dc5adf68e2973399991810d14dbdc2fbc6c022921383df5c03ad371fbd00b9bbb7e1ca6c63bb9205aef492813f654c2fe128c1e98c3c2843400218efcd34adce90f64614e752556d77eca1c9232ed2d7cadb928e330c1ed0f88ed9834ad62de3bd00eadc32e5b79aae44e1331b15ac08356eedf0e8e6132e820b28990b837246cb03f54e073feeda6a8ec4f9ecdbdae07921c6f0b06edb399f77895b33c843d434a86d538e0e8e37700c88110fd54dc2fc82c686866cd1c29ed427050751b2966acb056818da3e79b84c4e37b1779da3a101f812af231f792285c789f087941431225bfaa2512af3f4121791b987a83c5c46d2cea321ae16813056e4ffb6c9c6c346d79f5e9b9a7fa70368af5a7ce4f6b3feafa57d1e61684634e07221012e4a03787c7f8f3da6d3107bcf03eeaa47fa8d6b09b2e7549644bad5974b374dcc1da11221f81c22f9343cd58e43f229a3b188163606d4a0fe1826f6eb66d1b6d8a3ecb8e3c434d419af53681c842521ef7f29a3660489543b66d80a1370600e2ad5316f7d3278d376ed39d377a076e01b9e95d65da55c2cadd3a2b6a3ff7d40a3cb14545d08550b967e48da7a903fa632b90b5667ce5048ecf42957ab53b8b712f0dd68004351e2c5d89bbfc2261bbf76795d1388b034514ad4a335a4dfbc17b9f736232a470d5d6b9957d9f7abafc020523c74bdafa9b82f2d48554d56db16a04d0b26938d2d3d13e34cc3a1dcd9a0f138f7471973e050bbe26f6813ae1fed03ef91daea1cab3490a37d432f1af4dfa4304d1131ff4f30cacf53153142f348f7b51a2fc83e58279f0e8603393321d86b97ffa7cf21c8a1d198bb9a8ee3b51c65e4a4e0ab69b62f084410f38d9039920556751fe3391bf6560e2acb3151700311331b02fa54e44bfd4ba103afe621cf8fd1fa83d8c30184a15f6ad48fa9c29059867fbd5caf143a40282e1d819bf3c371bf31f62df1d80d9fbbc5cfb4a18db255c51b6d55a912bb0465a175c291ab13f838789ba549214caca259192ea38bffe43c84a87e4cd5d6498ae94ee3a0f99656d3a825b7172e9bb28150ccedecb77aca715c441b45772fe2ce4e7635ee4c8258274f3eaa94c482d097232a66b7611c8efbd80e5fa315218ab857ff5ae03ff33976c4ff92f1c4cebe43e993f7a5a9b8b2a132e1fda7dec957b3b9e98d36911829909a284ed6ef1240e02171b323e922212c78cf84ccd2453b092e928c9a04c22f7825300f5345c3dce8e5967856b084b851921a6257a68d933b101b9cd135fb12a159c190dd0a212960e72c8a0fe64bbe958025dd845d296a509a760702692575aad8f0bcdcd9eeb7c83c5557b134d999cf01ad47c7c1cd1ac7406af0a44d5fbdb9eda198aef9c41e77061506445e4813239e41dee6cadccaa221fc66f6ad87cb421821fbc9172d04793c0c2e044ec1be5d81e006e2016ce7339022b7d52b37b36e1e648a02f4400902e9d8ca229565d9d3ac04c1dd6a8d4368f302b789915aef24b76d1859947b9a551be34ef9b4386ecd5cba2712d3f4a9afb50bd2f2575a8d98e75b065c8e29328d89a1fc74f2aa6174ddb527eeed80e5fe83475d9a78fa525901e582a05e88f8ffb558438e32d68a341de6e95e6944d10ff97abf89cc5c4d4abb6a55898b09a9c46810b54548556ba7296aa31a80e5c4e2cec5dc58b0c8edfef3e41541b79bb844ca925901533c7c0ab303f9ca371879cb68ed6fb9b900476dfc175be1803f14848ebd88d6af69bfe28be8d0da3896e07d8b8d89f40f348b5ebf010698e92d44d4c2976962d9b576fe6f9bff1ba382a4a3da6a85c7f087df812800e3939c26b4c44de3a2bb4d0d5e5e6c5c09d76524318c2116037afd338985499b26049e7eab7853d6a773c3ebea01f73d010159351c9a303e11c1d5bb9970f18c4ff54d4b690a7107664d73770cf628b8606d13ebd6e4fe80549fd336e5c6808033a8e60d693f5dd3a339fb38a39654188a539d984cbee76662ed9d5d28a5f1a9a28120487f888d825f7c3541851a6220a2eb06c7380cb6733978ea5e41f0ce2abed93029a376c66fa7eeefa056d6f2fa00f025be678e5b4a25ecbbbef826495f01101205991592a7fb231f5e0726c00a4b618206d9a14843f4c30473b4e091d92f41f05ecc1269559fe17fa2bd7b881791513551312b058be92b229f7454c153776162f92579b10ca2b35ef37dc95e504b6d92a235462325f312a95953174a3c4bf8a9599ed4f44f49dafb0fbc49a3b2330b5db7588a792ec00d68677addcebf77680831cc74302c40f2b0268144b5f1970ab4839cf8d466ab3ab00547a45e1eb272519ce0a613866863b69f3e5d9f7b79eb9313dc04a09462c354c2845fad52e5406cc412b77a32c071caac2c8032840a4dac3fd01a6b4133c16e438ecf28812432b51ba02a939892bc84c087b54be99705e77a344021f2b70964c2dd445120323c85b4a2a16334c682fcb0869ac0503cced5b51fbc5abba6b528ab0bf139685f9b09f313c0e9db38cb3955d49eb5d72885d694d8ddd9e42531c6f11297e1f15ee92be370a967092a09eac04759681d0eae33e5043cdf7d2d4129f9c9fbb227270c4ad69db3b3e119002a3726783f273bc1abbcd469278ada4c7ff8acbc5a839aa52a33a8223b3a03bc80eda648a6584a220e504d435a9c014f2ec135faf78cbc7f488b532a868baa0f4536bd4323e7e27c1951e72c65d2b8563c311b676f7c2f7c6eeefa176085a6f08b62e03a23c131739e87bb9dac05c0448093a22dcb491b8389fe4c6c962ff8843ad0e76baa23a6ad6aaf29048e3174d3f71b5e1109852cce9b92a8c0b34a065d5b761f9baa13b335e95e8927483c95c7ae2baf97f59dd50d397c6714e0a5f1e3cfe4544057ede6ee94bd4e21b483ea50917d1aee469701008d0baade1b55e707eab23e929cce9f730ec14831c9be24dc7e071839714ea095568881caa5dadd42a370032a289fc0094731ba4946d479788ecfaaee55b4cd3466a5b4b2446b04a30d5a5503e8523d958afbd1ed1fc70f487a579d11d0816073daeaeddcf85cdb54b54f177e1bf3ddec7075ca8ef32f9735cf82658a145586bcda4a06ae26d61b84a59a0baec5ac897dc5663c81b3b54976e73c92d07f26fc98c78c733eabafb9559e843598ad76cbea68336c70786cdd7e7e0d680e7d9e73caaabc8b4f8d35dc60a19dff7373017d59b4106c569a2839c7b7b274308711c58e658dfc9ca9756cdff2c1716010df4eca49e2d1c2c7fa17ea110a979d7d046788ff86f57ee164fa2491787dd64a5e13a745eb60638c20017e013e04f3572fcd247b0d71abbea295dc36134b4c238b963a08b00e1a690a8374bb12be81ab11026a27aaeb533d117223a35d4ae0467a7dbbd0d5830d6917290a5870e6dc46f9d9398b5173b4dfecaef3bf7ec096ac4253961925d592ed75d9579b574a129bd1025492c08aa835ae96cbb461271215ad48cf5b208816e7cd0c847473feecf1d419cb6bba5d77fa4225a20288f5274846ae94f5987bdced38d756bd8c396fb245a9e2b4c1326cce16a120d8c30d3b086a2e8e6245a358ffdee715c32baff63fa01a32659414a0e24f2db0e2afaec89365f7c45e22b662f31240e7969723e008876479cada45ae650743cb4411d80eb74ade9202275304e624eb0fb12fa93f1586f671633907e4b713d4c05b5f2b1e70454916e45d71ac2cd380764527240489901ee3a00cea6088faa2c5c9a799ba93adc666e41ca3ab4839a53321a33195854748128a1596b4982f223b41f48d514b6a484eb9bfa92d5af769bed16671f625442b5b0f289d39e8449cbd8bf01226429c5f4407af4a07e75618135067374d6e9a2b37e064ed786e6c7dc20cd45bb73b95b794250689e8a557168277439e4bba35c842c1ede78a1f7944d74f4ff9ae151b6051612891b53a3d9f224672f8744d6d09f81d5308fb7ff59654588084f44158214eca054eedab94d6930b15f1452c727c5868f14e02c9d9945ac048439c393af89ab61a422ba67e4d8c07326c463a2c5712ed5caf34420296a3749ebc694fbff47f69753195e2489d98261da76dab7831f5e660aa1e21961104954140165593b5b0b6ec9525a337ac3d0722d0252cb0b1c9b958a0edff3471ef0d509ecb6ad68d5e602a17b00ea99fc3057236d18676cbb8bc5b6988a8d213d1d31634f94a952510fb1ee1b66ea3117cf65463fa42b44b96d303829acfb26b791b30780b87c1c7cbca3afcb97f18adf3176b79f003933d671d5cd48d57f049d8759b5475a5805373d53b003bd004790bb1a6403ac35a6fde7e9aa250ac2dcbb0f9872181ca2f6f1c11070a53a37cb88e2c4ceef08b0dcead10ed26f90dc3594b7d2b1089c4caad77fb6c505c9a141dabac72e3ca17234e5567c08f86138fd871a104dcc34b0bbae329470851487f16acba4b6da1f4f19e239a6d68dd7c7819706a2aa67e77a778db72d911a77801c443b404e6e7a1e91664bbfce3ea8562cc8ffce7700244308983df19e007043dd66d86cebf257cba8227f0993ae355c4c6a1e0dbd5552350495524e5bf594fa653073ca5a38b4ad6e20d5e1f4a4b44d54b95582d74da101c06625259ffc2020662b1738dde95a6c67301f8d887c32793101f74408a92a83c199492de55223dfca478067406586faf309c2ac2a15c450fb60265b27fb83df96ced792663d61f8eebfbf827e939bd0031499083c8e5274b13e6ace4991cf85dbd35621fe46219477bc996b6dd7163c85cd84c8f05ae9c7604e19a8b2cda641afe1a20db79a5b2d2c937c9f31686694670805cbd7f4251f99568fc1b9afbc6ca0fa401221a5e3bab4365240d75b84f64be0195a44da6d2e0ffb1cfa8416ddd994e15307f86225c777d8257ae54bde5e6c5ff8b89ef5e225f4b6c7f4c3bb50851cda62154d0081d34b91344ac33d72b0faeb2605e8bcb69a9135cafade1a1c540ac9e10193e95de6d58591a202918c7044bbf0bc59186736553289cb3397189df8a1b09dcab9378de24dd0434d46b2261e76f2173112026dde1483186ef7268294e8b91e649b36e83f3c92570b334e662233c272b9284a6c9a0da34bb670ab02f519863a3b50f874eb95648b740397870bcdce75b0d66e7d9ab763b04ef06cf5434c1b02c54c51e83a41d7cb7a9d1d3c516cff1fd371737211128e46a2a865fe1ed3aac76d689d9cf22711e879b8d76f1b889f61aa1df3b03dae0c35d49ce3027182ed32ff993444c8f63e4f4a8065c91ab8b0944e24e74cd1f1a244a05068b5a43b1497df6ebcc3a59956cd10b903fa5620b949dae2a184dd589154ac609f1aa9ef3fd0c3e687556e6c943a1975df244d8786240c59a2e490d50aa785bb0eb33545ad00aef11fc1db7b1a674874b5f89dda6e307a6eaac1cbe471c6dc279745dba6e8a982ad94f5e26ee00542ac96cded164bbc9b3539e4343606f84d19a41f76a3ad681a343eb32f7a67978a496b15f4914625ae662a173d536ee6f8a7ba9347d1131d7b96a3caa44533f5038ea67e9993a874bae31966bfbc794a1f35b9efc249a6076e639bee04c1ae6234f66cc53342b9c5983ec68e165797054adb636ae71c6ab6973b63997012747b504ee426a46230710528245f271b0b4b120e46e731cb9f978abf4be721391d0915c46a302ddf7b61c23fe34e0b7988840c8b06b22ae586443a2623be6a79cc08940bf004ef733a5b7a559fc8128986c71170c5e461334b812d87dc9ef3c46bc0bd667a144bc0dd7c26522db94ff204d942a10408f3107b8d3478f51018d0d7afad1116121361260f785beb5185b3a4a91fccd66e982ca89b438865f0d60913eeeb9df77b36e3e79738ea1517c888b6dd26d8fdecd1153dc527187c9a98d984552102752e695bc2c5ae18fe5ce73dc0f050e0d2db7c69fcc8c30b878821a3d9df2a4214869075ad75c1f6e5e0ba980e07f91e53ce10a5e8c18fba754a722f28a369765561456974c0dca108bb1f420f833acf526301b018564d33e1aede0335b000757192324e7df4f80e4c11e5b8d806e2040425b926c26f9be6b1e0ef5dfc70bd993339bd39033abca0237dbe6b2073d7327f314883b052f3831052c2626ed92561d50b1be74c5c423ea7df697540c6ed4e6f2737870ad91d6c80554a17ad37ab9727dbdb821662bfd23a2f8c3e8687e299c8a7125a75db559d9b4518a2b1003186fcd9838303260186ab2b0e44b35de5c8354a68ea69d174b7c33c10f3879709c5fee8c1dc22f6b0c07527011b0cbf6c4352b391f162e8c7424be55e855b27d3ff613db56e85525af830dd0233d1312a63e52be6f8946afc365f9e6903b23bee323535c3321f4124a404496318f6a1f94230d8452456d53ed43f322d04928d02ac565e5d5481699de8b7efa0ff5d9718a89e64d14f05716e3819b67ff4bc5548cd8d8ea9a94c313cd733c803f15c1bd8ae962af3a4d5c491f590f2b3b0ba26c925e48b1b9bcf8e7ca281091b0f5d9ad2f45b655a2e5ae9739edb51658c7a7cc788fda2c833646811f9fcb2792b89de42156a3c34c07a808879bf0abbd9b08343b8e08adee2a3795d5f24196e719dee7b220dca49eac557a741b2bf9512b46e665ae7061f0c9f4421f8ef5d9ffd215ccbd837fa15ac05195b6ee4699740a5d835912aa1d8ca58246b465e9462ba9de0f9fd555288f8e61863697560a366fb0d694f1a03c78ec79130a2bed12f4deb851f40d4eb27fd5c69b885484e8243138a5279c4547084ca1d9f1c6b56ca0d4e4e3c0b616485bd8fe6e5b8c237f8676ece24102ae885238456e04d8cf72437ec20acc47b707dd0d1c8338ddccce6a67f1e135eacb57e4515deac7cb2705b1352a16bbc9de10c2a059f1ac7a2156ae841cb41f6f0ed1af73cd166daba0c5d5fa8382a8fc877b746478b2564aae4ce2a998b097bc527b44b00ee4bbfa0a14c7b807adb4d31f070594c494fe1404537c644290abf3174fae852800e6502c6c04a0d00cdecb84e291c225fa40ddffd53f28bbf2bde3015acc0a03b4e6636ade4f4ed88909ec9f51b2c1028dc74fe40664a989f69b774ed56388b6cf2d7a3f5b657dc816b08766bc3c21724284400931a7a1d8fce0fb947cb0935985338ae90ba30e407b2bd5f5e85751f6be259a01b3fe64bfac0f2f96e92898496c51af5580638e45890a8b17957278a474adaf90835c9bbca65c39d6a5677425eebcbbf7d32c5eecc1c495440f1abaf550ab0347431c9b24ddf0f50ce24a2af3d964039cf782a7bb6ab822b85d6587576596251728953d92f6843d14c207528386942df47109f9d0a405a392e427f1f34b93d83490048db38bb81766e35cdccf2fb903cef71e4c9228559dd1aac0de7fd7658409169c468d382eeb512f87d7bd8e50015f74f207b1044e89644b87db3e0097a7ce2436cf90de5f043157bc942683d0f66c535623ff162b3ce598af3943f27d1114f9e67a466c5a08bea0d97c2cda582aee94e3f8a7f7c4802b7df4fa798b0da5b8378b03cb1927acd376467d1e78b860096683a713e7d3cd8416fda734ece30b6dd376644f1ce3f4dc0f77eba11b913ffcd52335d61891c368ce76e63454937007b63a96ac57e330687ddd2ae8a9fcaa6014849e70e9c0f981447e28d08eebac4c3b5838af4a321a535911f6c539b109705c06b051edcf5c4203a3c628891e741ec7285163099f07f471b47588adf898aba0b7189b80f525841d9f3e1093824b4372fbe738316a43342829b7b1e7374978610bba6d961b3ba4a74d5a504284693bc9d1ebb69854370d0b3a8771bc71dc02077982b8bb03338f600a3d2ebd98a57bf3d46ee7225c618f7ca9071c6a958740202610ea0282252df5d2c62a6651640c83fa8e37691165b359a786ec6858480678b62b8ab6f3431fe743cb023d9b1b8223acd86b169a164e2a62e3626b780cefe4a4088432df4a244be431ae422f1d586faa7bd221433e88866ce7aa7b42a71cb263301a120691d4b5ffcdfb6b8e3209762b3edff6286823aebc5451670792aaff5247b313378042c427aa37816efa2a06a0424f27254ac85ce13a04cc641403b8da44ae5ffabd82e7dcc195fc8ca23cb085482957119db777e14c787d28f82d83b243518e0dbe28ffa5eef745405e37b4973bb43c563124854b494ef58af000c2c182fd76f58a8743bd360478432d4b0ee97ce1c581aa660ff111e65f390cdee20420d8fa4d8d692076167e6b2ef772695fde4c3fd420b94ec04761bb129598ee707397da0518c054ce178a646ce0e9db289fc301f2b432acf1e1cc9ef5eb56448f598c72586fbf008c08e07fb047bb70de34e85f5dfa9706bdace478a0be5a82420becef94a4f1d94263de507bd21dac40648c4a681dbf628f8707d2d2c6dd401904ee01680ebe823304928cb0239193076fcb5efca1cdeb12fb1e109e8491e5207322adf4a044037f4a02818fe52abd813bb931c2509640afb1aa2cbbf218b08f98472092cf7fe0842444e10df19061e34523bfb51038ef29cf29ed18fac3f290d2f211e228a219e0ac384d3ee01cb628b6e210a684ec13b15ee16ff5c9e7c51e1d83657f30d74951381a2cf0f8e4bc458290ba4b340d7e659294937c05ab75c5ae3aa4a38f4a4a0fe0dd2497877a83702c83724a24de7152d459239ef472afe5ea9ef091b66012237412cca772d7b391d89aa8512c21ae54d3dd91f2bcb46691dd9d955ab171df60d861860137a5a5dfdd6fb4780b2ded6017d0b663bd29a4010cab8fd38eec114a37d01aff11406605486fb8ebd155f275015e2e3d893ad5220178f97addcfe06dad81826225888604530d0a16571cceb45635fb0c69f60ede6ff091074722a3d749cc99eaf08c522433b2a75c12532437de9053666968d66dbbfa4d54683e1635404e12b975997243d9012bf523ae51be174232da9065ed45c4886165434e87a136943bd4ccfb9c5e62aa2bb41ec270296fb4a2eb76f1091f79a2af8729b675caea7774babeef5a5b1dcbd7b88c31d83847edadc280a4e02942a1419c4f8511fff75e4ea13d3d40737ed88ba62cde622fab19725a98e018b5d51281eae636a7b547ea4941c26a8b7b5916fb648e274040c6ae13c35fdddd2f49874ddacda922a0ea56eaccaf1a2170c18847246c8feece050b4a1511da13d151f30e331880db300d0d58cef821c90d02df1e817e68b9bad148242f4e016169eedcf00ed03054e24275de95f013ff591ceafbc27a9beadda8c0f1adc4106a00e37b9f8c1d2334f097b9ef6602cfcb10f8c1347717a563c92f2ccc44654df86a0a25d84d364da7ec0d2008f677fdce7e454211244da0baedf597cd5a641a82bab1e959d71eee131a0b05682917d427db195b42fe63b504cd1fa98b8011218f17891852788d1763abc05c7980a2d88f1102a42db1d38804c9d72d7bf4f909c1ff1dd4cb3d2aa543927385e0c89624aaa6c6399ac10f597c568b01612dcc3a981d10989c4042141611b5fa3c7fa67b70b2e8e8016c41abe720ab3eef1ce57c2723de3a48133ab87f047f894f2cec8b5e4c5ad1d0dca54a8315f4e82f1f2d0d7c0c5f60f5c51ebd70bc013ff448b596848de3c2bbe96a42941b86466d643978dfc82667b19df25b491ac04907d66cb73498242f88c54871da6d1c592eb8b9d6d7b3f83276cc4df65ea541ce82d7b84cf2bd3e6a62a8631e3c9c48488183639399ff3e7a980ca4a0fa9f41b6ab69923725f33603a0d8bde144a4a5cd10b8ac21344be6d7045e58b680fa5fe684f3199361f5dec7ac2a331327f4fca6615ec591818d8a8af43a8c92436c72d8a884f11b9e414298e191192cfb6641ba2cf6f1a5f494e5207e14137e16e6d1f78a2c38e6d1cb44e36a214e0587323816448068b04e22538c1f68e712c42311904426712dc5c50e89908ca93707a60126b6e79cc09ece4992cab2288e226656ee3c83530971ea6196aab06bf41e4ba08ab1423559e22b009c4238335a44f64e6f68281d98762c296c8f5c0813904243140db2a3db11d191432cefd034dfd335ece71dde2303a9446d9339ac36e59e4a31af53722e19a8ea36dc0c34dee2912a276f1658ad823e42aab286e1273a11d804aaaa3c4be2dc36e8e5fc2378c64d1edd9f26d245bb1c0f7d9e3413eabdd20e0b171275eb208c94307a5320a9604b32af250a38ed1c1c7d103ab0051d1c0e781888440b77d1af5d99c32ae8ff3418677b3dc7ce24327f9a934f8c02843181090123229bf2c463f75bfba55dbad63689cba2df98a203017c8a03da1e8a6e5920da15a903d9abd27f458ea7769d7c31cc9d5666cf13012eb38c2e4c5d4817d6c9680af1660be02e4427ed4b600ce01cd600702076e890f040c95d081e7d3bf0c3b271a7f28ca15b4b4222a8027941dc6def2df79652a69402d206c606e40623d80c9ff1a2a4c1f519df2f6962824dedc334da87b3ff89c940c791b8153e3e05916bc120a89953cbb7a09e6680a26779fb32c0202da8a7960641508752097452ac766fa01f10380871b9efa47077e53d6fcd65480a19af7d3cf849c67becf96466762dd44df0c5869e665c0e5c79ef3ab9a28cf244ca64109d4376219bc005394a981692149200512e71fd59240d98013d246cf4b22ed64a47739f59f8f33ea3588b5d064856404f829dadc9f290460c262b7c6245d7d171978e8e8e8eebb8cee7222a78d286bbf58a80cd521bb2da9881804bfb47a24e6e57e089629ea8999aadc93387cc23e66a2a993ab3c8f567c9cc2559ab944f230a2b6a2f47d0abdbf990f1392f36a26f7911588410a719dff2334432b04922e1924abed8885a5ef4a3a9e049c97ae6e34d230adbaf434a6004bdba3db4a6bd4c617d786eeb5e0629e78712b0f839c958dd9ea823660be965c6b7bc10a7fa5dc04f31bc88f46223fad18fc09cd18b5e889337832451a4171b979ff12ea0444998ef67bccb8f482f3632fce8650047e0cbf72ee0cb07eee0a7183e0650aa402dbeaf3526634cac48592c2f56fba25d79d65c8245a14260ec86fe7850b7012d131b70bf1f31d109a0d440766a29419354e28f188f9458f16f0bed6f037de8d5953ab012a808c5668809569ca86e990c2543c9503294f6a22b64133551ddd665c4609c73b240f30769fae91af3266886283373ce39c70bf8a987840192127203c60f128689cd2143eee0c8144c4345e7a84cb3bd8c0178200b143b234d4088f18425cc9546bba7e3eaf63d5bf50dc8f340b16dd53d9de366b58a75cf0dc8f34031ae9331f2c701f246de0887e7755cdd34dab205700956b67a70fdb9d3a4681c5ce7182acc47f86ebbb7043e5066451ec23210827f304d739288fbd2f4da4cb60a010f9c59955158bf75369bcd4a386a6c6a7b3ee0669e3c7bc6672882952fbeb681de337366d4629dacaaaaca65bcc2ea936aa44875d59eca9acdcc524ad7bb58ba4206b7608204ec94f36385253b7dffa3a508d7a90ba7e0aa629a15d3f068095724565c7f1a46ac58955c7f8fe723c2ca97cbc31e3f1a94b0defb007def49972b7485ae303564479d02099575fd4d9508c35415c7f8fb083d28641a661a174161e57bccdc1dc182eefc5e76083de879f0fefbd16b94a88d22286c836255d2a2bf4d3925d80357afd65ac11e82a017879b99b99b6a929341d0db83f6cdddddac854421c0fecaea09b2bb3b6ba129d65b591eb6a42bc4a7461df1fe03736a4769d2885362eb0adc99a982179a68e11a4f7ceac0235e71a4492e61187f9974a9aaaabe5c66565555555555555555516aa393cd5062eceeeeeeeed6f89b58e107a8536c14628930c1211858d0dbcf612134b9623ce5fc5881bdd7e81c7c7f4e3188abf56f93f492c3143bf6583640840cecce2311f1ea71fa00baa28b2802907f38a658973bc198115eb8fee5e072ebd7e47ae86dec5b30476af1841e273be37802fdcafb57635f23d9db24d6a20848ee46e26b493d4a18d44702033b03c2bb01283361cc4c99b97182157bdcb6d0460947e720293839729c1c512c2547ac82a8e48e4c713299176b99ccca703c742c2cd3f8f4004e8f3aa43be372de6b37a42947ee69a0426a82650f6d3cacf2c2c94cb0672f9cf721ef43a00fd07f209f38506c1f4e0621c994370ab115e4389415e528479709e226ef1df40a446f973f0938b39d1ed6670f3be5212705ecc2b287b54acb98a60ad370d30939cae44892a3cf26784029bc4e89b1e29b92a6940c076d6a9694dfbd1ca24dede27ed324101c348c1ca261bc03454985acc17599c4f5e7da88ebae2a71a049204cb3bd8c42d6402661c428a1f0d6624c09639b9aa6699a8d871330409bb86bdc03304cb3b111b817390b1a5101e3c8710d23a76a46cf8a56b5f95a47032b8eae7f7f5add3628e69cf5980e12616549ca4d1bd5c0e66c369b513aa56bdba9b5568ed5e7176ddc7e1a2014d45bc11078c8347c2587ce128707d3c80bfad58e0ef49fa67d0fea3ad07fdd7b3c80fe034b2e60f0f1bdb7f2a1d7b4eaf2848f2336a15f791f1ece4bf7f7d2200f3cac84409046c312b603bd9f76d48034baf1e7750ffa1c30c7035d442f6cdb01345260020e6ffa060bbc600710217ba53886022c2b712dc9706432994c86c3712b51586245a68a8c47c8d76b072baca7dfe1322f9d16e395e08b7cbef385f8a10b560c7b8734596b297592cbf526055d602d8bc5816dd1c76d5bc48ae10da5290786f187b2e347cef9e3bd58dddddddddd1a7b5d8963dc9320b650ec77c55207c57a572c953a87a39690da154ba551693492a65269541a953a28d6eb4ab26989c545370fdac443c2748eaac48b0a2f287891058d2456641f70fc72a84f3f1de697c3b6b5ab3492168a5de176668b039bf5846b48eba458012feb3ad0c7f7476c3e90c197e9e3653e9f3a1a9858ffce8ea4cdc20633f3a862c16ed788d1bf09863bd6a5f88ffb78e83eac924fc9673e33b39dfea261fcfb5be7755ee7e7013257ecd8f6bd063e17ae30852f2440ab44f791b9a2ab1e7045dfe19058d9627948c308cb2c27e22a1f1f1f1f1f1ff7711f4a6d4891125aef689675234ddc7332c90bdd3a311cfaded8a0092638874ddff0da840a7ce246e65070a64acfbc9182cc27e8262716ab321addc4b46dfb949873f2e439e79c737a366a74873d86f4a9128bb2a3720c6c62e53fc7bc5eafd78e275c2e53b581654c8561fc64fa77b519b6b05f415ec781c03ae76c1b7c474cc704c3f7d0e50b567ee7c0ea70b95c2e970e4aeb1394520aaba1d2b44d6a018ef1f7c14d1501579ab6efda4198ca6d928d4d0678e81bfe1b49233961abc84710d989059886effb0e1ce3308e03d65ca06fd8d0bef1b0524d2bdda0d6ca951bd6b18e553b44126fc4f51ddf683d0449221c7e2ccb1c33478d7eece29a63099f1d2178bda28462b59b03e9a43ca5e372d2446b088b476584fbf9f9690ee4714c41946a744a3baf683d10685d292edab4c30b870215ae37ca9398be8567e1499c0aeb38a85e83ebaf5d61454fc16029580af6ad48b1e00fc8c30e8aedeed63fb27fec0f140bbaa2ad3d52a0fee43df7d607568914de37cc0391c026e714c7b1384f718caf9048adb8221e4ed95cf4aa6157a86c20e7ac54ba87e826ae607d0304a5e01c70e863150ce33f04ac75450f58a9fe7151e9d98fa760ab15acbbbb57a9558a4ba552a91df8467f123ce5291c351c637323831593b55ab162517660465e4f5a3c158562d91512984a07ba4e225defe2fa92eb9d27a58c59e9ee4ce34b347163b8ac8512ad4b3f20fa5623ddd717a7914bf295af6444f9bada532b5c7f2986bb46a3781595693a762cbc07bee21831d8e453ace46bc54dae285f2bf95ac9d7eab5922ff95ac917378bccd554ada68a065484693628388764b24295a039c6ef064a9ed56baa54413c0832e64260182f5e1edb9cc0e4ab5153c5327649596513922402c748270ee3bc85273df5b56af1fe0b710faa3e05c738e854348c7fa0e85c5c7f0f149b0572c370a0e85b340c2849c334283a0fdab7a002e63275c534dd73a01b218b24207f5fc95713962fa6e1a0742191c079b5d65a3f0f9c71988ee11bfd376a709027c31352c662b5645294c47660515cee84a65229562ae52c16d3905a002f4bbf45f9e4fab33c6c79d87ec475e2933e85c19a34119dd5800684218924830c2c2e1343abc2ca9f48b0288be52c96a649901315a534caf86476840f95580c0683c118c635d2d4fd5fea1fd9339773f68c695cab2995c23006a3c104eb75a100ae07be50d0f75ee841341861c546813c1fdc7befa37bd088abb31aefb9f701faee6342b0f48680e831ee4b9022bce7be08d0772fc4f51c071cc3c2728e7020112f35dd5f804f1df8e5d0af69df0d25d0c097991a5e72a0e2cbe6328515676ca0c252c043972aacc8aff9e9606f835270df2869b2a222b1a8158c4a4d0b6d947c73fb82f6b17b44b1941cb10aa2da49496696b254b2121c8114c0915c9f0234763e722b608f122c7dad6218e92cf447a91ab97188d82ad625aed1d5ae518ee338fae823a5212d1c368e23eb937294b526b19386173616a341c48aeca2410496b5d6da0edc073dfa4ec3a0513b49ac5fb1562c7058859dcee1afd1b7f01d18a094b8cb437f6f314d7771794a8c0a1c240a2bfe0522040926c6518bc562b1586cdb3e2ade88840ee69c7394b2f267a9d65a6b85511a6cdbc61bd76aed68c4b6246bb576349261e871746adbb66ddbf64d60bd84c3a07e7ad997b5f6e572d2398cd008b8b3c72f9670fd6b04b1628ffd55607b50cc61db8090638cb1c9a003db9f433f10728c31a64b5932bd2c2c10d26bb05d1c9345dff0b79e85f5cb333995ed970b4c59970b4c76066b2da53c76e0ece0d14ce03009ad262499210a2bfdc331eebed2beab2e97cbe572b96a0d39c6c56264345d78508494ac9e73cab64cf30dd1a6b053a206334918c169bf7de55eba7b0725a4d324edfad73f728cff04c230cc800d06d75f93c1047bfc306261457e694e58314442b550c21da3fc5ae7f49e98218e391acdf9df7279083db0e28ae17c71e4ee4d50a9ab80cbaf99948a85bd21f4c51c51ea9a0b344dd364386de29ee7f34fa93d3f0b81c9cbe7f423e485cf890bfb86bf0c0654775a9a0d8648c2ad9f6ea00d35e4b421e461406986366861e89a0c67db4036d05ad358638fc5ae7c2c76f43e3e432c7b48a5f4402bf60b5970a5863e10e775dad4b8bad53ac339f7858e8eead553c4e52d77e22bdf9931f7c9e33293089b5a8700d7df554ce357c63b274df64587d1a0c28aae13facb2eaacb50a699b22575244a0a6153cb078d04c380c050b6c9681e92249d837bef76fffcb5a3d572994f6b47abf59ab5c637411554bf1aad1608342b28b45102b9cb16bc6913d464f496d3371c023e30d23afdf07666a7ae93d137ea26b51a7434806fbce66888c6d1c98139559b54677c05418d3a3339335f135e33a3191d978e8e8e8e8e4e8dcc93f2ffebd7afd555841498b0a95500609af6de821558e50425d07859b15dcde3aa6258da4bbade76e530720414a0508da7feee9fbd916c38a6c64350b4a06c5718566cd503c18aed5251c0c3510f8ef177cd5c3eee72b98b028d637bed29f8737e3e33357da8cc586c4ad122d31fa4053327d1a3eaa9e5f9991f80aa27d18bdc1589fa7b5e791d4e830afb329faf769a3e3486478931c72933442d2d2f12b55811c9cef8185e943f35325e87c7a0b049fec8dbf2f2478c1faf63a377f99834b98c4a2ea492e85b5e9425ede98f07913f31d0ad21c00d3d2af46a446143ef695cb062c76231f9c3f2f67fa68c22653226757cfa0649362161a18fa7482c6154521cc6bf3562ad5432406fa9b10473c728188bc5c299b2ce82c5c62ed7eba78a131f1e1915d893e972b19cbd8df64cd65a0150afb02f3bf8a9e7edd7130b4a62e9e778ffe4e9974b1cf5cbc562695f353027477bef2b98537fe33ee783e11f0eccd940ff32419b8fbe8fe7fec5c67b1f9587dcbe971db4dfde4603e76bcf270ada54f0067c9960cd69eeb4abd52c579425ede258bb38d62e8eb58b631c6b17c75c1c3332d359348c7f17302e9a6ce18a6d00ca288cd194d18d6bb2d060cea94d6dd643f6e8a17953aea1693dfc9b2013baa78734795f396f7605fb89c350c07b7c13ecd8f53138c6ff658c9bf3a20f35c6e8e798264c2ae8f9cb53430d38703ccf66cfdc0d4f9a617e369bcdb6ad34da18a8b657cfd66a6d206f03792330ece5d3886f9de252ba09d7bf91f413b197741324987a4818d8900b6040032c532a75c9927a48538d8419d239980e81d5004b804bd3488ee6aa860a27c45aadd3adadd699d010b899678ca5bcb8675afbb57e53fa4cf3b9e8c0b287b7bf1b660d13895aad9da174d5755dd76a750e6460f7ce816a6534912c79691ed8ad195d8189bb89d40b266559135a2a9f222b554b65237beac669df01fe0007543d5a35fba902a98fc044e0d0f6105d9715d184b1a5ea3a15f75dabd59ab1999921f96db53c2fb451c251637313c4689b9b3948376b5ead6fc009c3d22bfe126c0f4bb84c831081dc9e2bcfea8bec73e3a107403058917d4413338f1e48600296916f5d70fdf3e1d90d0d7a3ac56efe36ee15146be07a6afd826cdbb681402216bb12fa40228fa5b3dc4a0d7d54d3346ddbb66d037d9625b4c20256cbad84be0ee46d9bd771356439c161ccb0d878c4939e9f202d6b2923d1ed92d87abb24768eba2476e4a387fe4305c463c58685ba4ad7c934130e5552878763b8ea412a18561c09c089ed7fd1a18ddcee1b49c10a366c94a6aebed8bc67bab9f4a582363f9a1246aca3c1081721d896151b562a51d8f852c31246f6c460ad82e5400a969955b0a947bb8ab83d706db3cd25af381a81110557e708a5a9abe09a15a18511d63ec2465bedd980c49088f580cd601b0c06b37198a60283e1a8117501d3509a864ab57886b08e5829d1d15028ed09b11a56a56106564a6dc60cd804d130c47ad81c48c52e20d4a4848dda3698f7844c715c5754adda0c2ce781225c6f2de8a80247e17ec181a4d62899ca63e9152b2af460b3fe8b1ce143e4ec2ae75447b35c34daf6038b6528160ac51282041344505c2c168bc5623729ce2d9526a289182580c39134351305d0a1936f7eaac05f7d05418d3a23e76c1a680bd8cb07f0e33e5ec563b399599624ab540a435913aad4101c1e33b8420aa8d38f298428a7232f3a740fae33abd5dad1c86b50bba669db65e7256150723d8c22bae8557cbabb3f3d42830e9bf564fb555f355eff9476b7bf49e7eb8ad7742758b00e7b85a26f996911bd7cc5341bd3d02b7a57182d87c2f22e5e1c9fba24f67b1dee45bcfe1436318df73c3b5e8d5c77306c42dff22ca496b724d13749868ccf01fd8c0fbd88b4f220d207e67c2ffa1cd0b71cb111bd8cf7d102ce781f22d0876d7087d0b7fc4de85bc09c2336325ef4392c3f03bc59791198635f460b89e54524fb73b290f83449dd8b3caea8bd0fa3db4998d10d1de83f1c159702865771186fc2add611fd0ae23e6da45ff7670ac3f8bbcecfebe7355ffef297bf5e2f4a619dbb38d15ad358e3e6315f5b2101d1b70438b4461a898063fc7de0186718ff2a5be0c1857dd19e6f09da6df01d2e235fbb3c62d7885d231d34287169db569dd8b68d37d6d1d9b0e083c372c79126eebad23182c5e101019a3044804d38339d23878930298e157c28ce26936dda56ab27f3dcc7758a389594942e9b996bb52ad5ab54b2566bb5eb54ba4a9afce42ad548baaa8e8690a1320abfbeccff022e13c40557ecd4a80512d515bb894de4281ca5e7f3930d1031ab0047b9f3c9ede7516b10ef4917061e848007490bd5e3aeb7bbcc640b516eb77f9352cd063318e18b91e3d8fac6711cc78dd2b46975d3ea07e27134053b63c269391648b6eeebcc04b94edb368eab756686eb487cbbd5753536375cf0388ee338862c47ecfc9186a156ad473dd28bd78139317401060f4e393fbe24a723f47ff40f923875dfbdf47b1ffa482ffd20b05bd50097ca94202b021359ebf3beeb041d232684cc9692d075d09282f3465b5f0c2bc060b7baeb5958b1a90ed977a3608f1d845220429060626cb55aad568be588bd92e79c94523ac1be9225537a75b80f0971ccd1684ed115ec775166bb5361a43f2158ff2aa511b3d9b8da09a2d2318262aac39fd020866d596c8918aa7e384cb1f28a55d37a36c36d7626ae5b212e45d899f67db9569487de1c116c8361d858adf2ab42c7cc35a3b3d96c369b699a3785d6fec31a0fd8a8e1ea2971bfe64282b1251afe5326d8fffbb55afbbf6d4e34959479aa092925ca9c5276777f1886f839e5fc98a1c4ec14fa1f9c173af6a52c0c36f528933e4c334720a314639453aeff94b210cf9c734e1114566c253bdf0e7d0abd46aa170c825ed10442dceebdf73ee47954649f293b1db8a78f4347677f3754903ddc260f13366945c85432954c25234919c704e118bf230f1ddcb1752453c9502e336532994ccaa48c521baa101566e6f97acd58c591a639271039ba48008462a76d28dc0588331ab94cd7754d0242ad10002c7c0d52781d417bdaae57932d3a47659acd077c75bb374fdfa82feff55ce7813ccff32a28b4d1d203d555c0652db450e57a2b9452daff9765e877f7d73c48e2ce27acbf46a2b4524d2b694a24a574d229c7719423cb15e5a85d51b21cb1e28f9e102bf68b254b96a2ab821b720c33b934338a5b02bfe24b77d0093b8ee3467f0325d0af51272f0d3e3703db301211ecf793d2eec8d6db4637ca1a1de0824eeeb4bb9bfea6c3f348d20abbc35d94d00ed4d11be86803450f78a0f73c1f40d77b1d1e690711ebbdc82e1bc01d38a858fade83409482a8b7c47a339ebd1e0741c3191b58fa6209071c331dd75f6d14b62389f5fa50e36a4fa5699e4a330c050c0683c16a361b25263caec1cd5c7b7e9cf8548945a9d5ebea0652a954dae488a86cf7ebadf5946cd2d4e329b1f28acf63b52bfef5ba4f88edeaa655971efbc2bd1097a3a105db2abe53f5e2513529b26a7d31b0948617581f47fa7d74efbd8f9707da8040ae46ecd82caa28d2b19b580f7f504f471949f97e19f1d281deca75001af66262d943ee786c93b4ef6feb1cfcc8a5dfa3722c2d4a6538ac97794a29a5da87615d00b022c452f0653e0b71bbd520cf65b48edb36baa2a0495ff30f87bebda2a4ed7a3f60130e2887f7aec97432dcff0c21081d8676fbab8f53a7a0a26f386b27d55af56a4541d106e0a35960c20bb60409cfc85a511e826046ca04a081384cacd8abd65e003f92c1b2700e467abb4e8ef19c458939e7a4829d1e7ee1c4b6cdd9715b2761484ab05c00f017b06d9536cbb65adb9b42a552ad60fec4c8ab88ab87a544a51a8d46230e65a92459a552188e46fc725273c3329834f95879d0b6f9b0ef3912b7c2bef73cac3c2805969910197299896aa70897993c3185eb29573292a61a2961ae699ad63f05abc4271a66e02a8e718d44a43ead907a95d349f002aa75fa315b4a749195ab52aaed4557a9422f690a7244abbff2dbb63dfd2ca001b9f31bec41fbf99ed7a058128d443fdfba4cd7812f3bd8173d0f2bcf028a56de87e86d079244dc8f6ef7deacd665e66b2ba4976949deaf3c0fa067017dd807fd0ae8c3c7ca7bcf27fe74a0afad9034ed7b04a3db81228fcb813e8c6ec3be9df4388ccb4d6e727b52c3c3fb95d0adedf3335bad34a67195f3381157f5ca55bd72550d35e0c06163a55ab9cb086aa55aa95e2a954ae594da50712e0315b8d979641e7329fef21ead824fac8fcbd09722f4a28c22633b5ab7c33457700ea984964e4bc75b5d41d933f668d1df0183892540d6006d8709f4df7b9236f5f03a4792040ad71fe481a27331db62e65968ee45928a846936ff828b2d3c0b6fe9788b894ec78a2988709cb7bcd571a18d128e9f6f8ac7de0aa594524a295da976f480d087422f0ac0d42d8771d7102e9f28a5945a92e85948f657487d0a919eb8fe4e5c06f837164d84437f569f4224543d8942274bb2608e039c70c13aadbc10276f85c4e30709b342e2615f447a11813f802ffd166c70073f853e04f62861502e43b94c119c63fa4801430ade5728740ea6f95e7419cf2079ac7c917d388ee338707379a8846392f40d241cd3e2987602dff07f3510f8868bdd9a7139c61b089b7634bfa783d7921a74d139ba7796b72f826edf986003692101a2eba8648eb87456b2110100000001131500001808060583e190583c2e9c27d51e14000c61804084643c1a09a4410cc350c820638c610600620000000c0c91a8005bc4b75540a5a7c72b1deac50145f8dc4928dd364c074088a269ee6dfe486a1253dfae4a91eb83683c7be2abe30ad51f973c7c268c732e8ff712c14d2b6159b51439e66fbb7210af987b982a00826bcbf7e28eb27efa429df022e047c4271939921063dd42feddf0f2719645a76fc4a962a073a7af70baa8efb54d55a27d93719c641f8c33029f90d5e58d35719c62d7755351f582d2e269d3d628a6a751ed31a34f8240329c070e9648c5802a045db863d9cf40445b0c278df7d0fdf26edd62eb90caf0a8a0a1d69d84882dfb62ffad8faa54d3307de15dd3a4cade71fc11a4c9fe03c21e02fac399b2997cc8a7581f30db8a441934184df0eba87bfd4c734b0a3500e2cabe6d7e2587073cea4c712c021a900e439abe8a36df876321bd5e1dd189f53fdb99d07b13dd5be66c12e3107a6e1fb13d2e9aaaa80a707b64848797408927c17d4278565c732853861a9b5652083c50acb269abb8d77f5325231858e3bc3604e0cc020993c41205628091b626e07eb718fa43c37cb4e2d484f935d82269a29d0c2698a6213032ec325c24380ceeee5160a8f8307a02a297966fc2f63df573a80452eec54da143bfcdeeaee51ec6f06c1c04c9b27c675ce3ce96b1300961209fab8aae6c6968d96a2ef24ed067633fb5349caf52c366b82f5361003c7d5dc4f209b46aec54ceae2bc361ea71d77f6779559c9b30548c205520b84d0c6c00b953d273ccface5a88ff49f5320dc4cf82f7e966b2d97d82ea59e90de3eb2284f69e12fd4aa8b8f3b63a290a242f139a2bb71e7fdaa2dde223820750fbce770f88ce7ffa4963bbdccd1923811cb1a3310872841489428b57cd37e8bca7095840ec583dc08bcfe2a9259390a06bf59c1972f6db1ef75c123888d24db519f82c9223ec9311750ca9039825b68a01cd4888bd54a844d70eb0c32e7366dc4dc32fa794fe4ffcb78259a2e16d2c1397a38ba90c9bf56a2f4060c24048bfb2304d1612f8b233594f77fc494f62a29c14623721828a1e4b5264090272e3efb2145450631bba11192cc5da390cab66c8041590d50a9bb19390378271977000321aa13ec11b9c6b5ef849f56990610c2891094cc57ed207da0b58ff2630cd3030a2343b72fbaf7863d5c02ef0fcce269c574fb398d5f37922212a71037e680942eaeabafaca5f8d22e00672ccf690b3efb177ede1c8e0241ea5f6cce84181921802f9e88ac7db43133771e6ffe87c5078b9880fab08ef7f586d6c305f763c9753bdc537bc200d22a1b3552a06463d1c1ecbc7b1418fef7470020eca9b44e47dd34f56179f4d3979cfc99ae87c3d50a586b4e45b9f38162737f84268c7f031aeef6deac37571ab87ffec269b6622c4b8ebe1bd9bcca9ecfc587f01d74ae4205fa715b832ff7a18ccd52caa79ffe0bf8ba31fa94da79c386099d32273c4b492d095d0dfad08c5dda8ec265996925e12f3dc56165fde30179e24c75ebb34ad4d869ea5e7d04d122e6278686dd34d01192f098e5f11178f25da24ebc534943b0c54da911116a0225c41a7bc2b1ddc80969369c512d042a0983f92fc084a8ba29eeb386d4fb08afa396330a5009b14ab80775aea993744276dcfe0824b6c90a3c105ed2385304f95525c3c7316f5e508b3e4d48265a737cc2b2427e2d809572cf6190871215ddb9b526e68599f27ca8c7e9acf43f30f9180aee798c64a33295cd17b24a643b62ea6ae59d78f71369b67de7a77c0fe88eeba008439a19e32ef7b88b2095c2187ed8a5bba01de81222a89bf6167a78184d1e358988615b41bf88485c56ab78871c2f25a76443eb9efef0bcbaf66041011f07b8b71797d5d82c0d326c4edb90a633f4dae21cfe522bce3b749ae2a19ea31fe08ea8cce9ca9d4c17157ee00b22931e61f68d277b4ef9a623f4cd7ec43c2958fa53a43b50fd4a3fc47bfe7a05a39e5be281b6f58110248ac2606f7c1e7848cb2b5a0e3ed9875d048c9e8e69af173ea71ff6910b7d4dcf9fadbf1661c5db3115cb9cb1aed85079706255abdc40c69d0d2810a2a1ab821f4dc5d2a141f3c4a74ffb7dc1fa3337a8e53db2777235f1bd902d7165f482f30ef08313bc4d8e827f8abf1df92fb57482ad4f85ccb67ff6254990853988f8e34c1ff7c7c2cc1a8553ceb6f714dced694df8c12b789fc51c671a3d56e358cc4ed05c3c08be80b4322d7fbb964c450acd41f24390420649b61876ca9e84b4dae0b44ec88662bcbd6627f1f9cb43fb4406e7a4231e6686635002426c5c5cbdc10157e2e0d03896c2b2a85d91c7ea3a2388270c6de417c82f0296b6ee7ad0a33c5175fe4bcf5c0488d85c42924c9f66caaa4b7cb5c3c486ce6c1e4f736f27c42c10810ea7e52b86ca09826317c1f4e791ffa7f970d753bde5b1d8890e2110aae3e960ae47bb62b05c7dce68304d4478e444d0b0021a16dc5c09e560d108b55f9a83fe4ca4263c25bfd1ba7a8cac88314099149e8b8a3302525ad21e6e171c4857023c0d22425e956613687fb84caf0e1085f04a5dcebd05aa14149bc9000f40ae7d0a979eac196b3ea77cc1e900472d196d9dc10322a43a4b63824b1a73cfcef9544ad41a9f541500cdd601ccdcb55239616fe2cf20805af10064c9a2c103eab785fb5afcaa0288287402fb8881a11ce68d4acd689fc170f0dd4df4605deb214bf82b78db0c5dab8a95077a0c43e074b61820de2d5b9a3d319331124705fb27d4dcb192e0403cc241667f512595d84bd36f1fffa60f0455f9ac022e3402552c38da214794ab8f1f925952569403a2769c7dcc4290de6d76a71702b2d5b8c26662793abadf79337f21efd7293cb1d57f27c43e1643278f7014493a6eadebec9eadca9c8c8337e69fa88b81601253b10fad222b24f717d93155181b51cca11ba3a945fb686b5e81fd95feb5aae1d18036c9d58c781f997df3afd81d4c32b8fd02498cbaaf172d0ee81b76bd4d4e8d6f2edfdabf747de81b5f0a0ee42841b7f50dd2e6ca5f682e69211372f3bd5ed3101ad0c3415cf89f4fa0b43f7049528721df18c30e6bee31e41b7dbd12ab574ed3128f7bf85a1e0603cc1611690fa946e93cd34c0464626e8f1875a506b2264317cb3a1d54fbadbd5b0b2117bb166dacf872c6f910da40765a58474ec680cd3a095990db68c06cce2be4490b31c7c2e5c63a1a61a95f9a026ffed3669fd2ff1cd5b14cd2c97b97c05d12208576bbb3aaab596342dd5653ba3892f73943305d99ed76676ab49765defd56c6444a20d36059d73a3467917a7462baaf8c7f5864bcc84a436553d58061691eb013920b0ff338f4af469f67cd8fc77dc77b15a3cc7abf038185113104ba82059b8b47076ee02b7c3a8a02af80e0917107c765d0a9a602cb280d28b8a1f1e37e678b1d6d1dffd1347b2433322eb500ac5c669a3f595cefd6e21c7fb2cec274ae8e60854636543912d940011857b03cb3c9e40071656d41a7ffa2b2c27ba5e45e73e406acb1722fd0611a45d56117ab5793c0b41d7b8e0cf58a768ba160db3ae9670ad342aac065a4e48b12a8648c3b2b0c52498e3aeff2091cb30f630f9f360f533113f92ddc8d77f4c7184a3950b9960661865dc046af7fd502e451a2c1ef5d02ee69f95a2810789004dd525e386936d41afd48aefc038aad78adb8fd03b3b28580a296c543deb10f79af3a1cb06670df1cd083434d9e1baaa7105aa1b1d3c737064b21ba962fbdea89fbb4af8d4d1ca8045700b6411cda7b616d1b7a5269eea20001de27a1d306c87eeef553e34df3cd071d078ea81ef12f9b34ada1905a9bef9e589e60554abb265bb1315d20c238760207929536f6e2ba2769cba4c786d75f9f3475e1b14ea60bb0ff131d7599c205b8dbfd92acb7325ccc4b069d0563f30ab50c54812c66f0a7b0eb7555c3105677d10c2d6fa795b06c9a2b6e73c23be86dbb3ba01fa702162eaeb905cba71a18041a138899b7efff68b82245aa071c00a3f2af2cf5a4f01fafb2a3b6ae0202394cf177e37d1c739a6998d2d3ec9e60706782ff3ff22d4de1f2133e0b22c6c04eb6085217a07002426f234f7207ca3bb5afcb0cfd66c61c8770aa7ccc0608c53c43e753cb300cbe0d3a1c2319b96fb9c510afea4040e9285c320bab877d9d0af1580c3498e6a16fb58566dbe542cd0fa7d945d8194518520194d2f26278ba18b76b31a4a74088c9c3c35060c85d9007a4707b6ee0bed053c580d2efcf5911213e2300b0b510058f2d040c9ddc2ce13f8e26063b40f862245ad3920a320fa5012ae625435b878fe65e367265e5e35bee89b3f612ba3fa1465a463c141c99e6da0250c96a9c2ff6ea8871bcdb4ae49448a0f033d9ed696bf24981cf9efe568edfda34912c0e3ffa3df8fffda3b699910c4d5c183d98d05bd8129e1f3d1e0fe7fc0d5c813375dcd1b51e0f4f8ef2ce5234a35051cc4c0c93ee922e7645c121ac28e2c7728129633860f383211aeb1c8311f3b9633dc0e506ec87ab243dc6acc4f05ed9f2da9423f54791deb92ee12e698f3857b4b0f7afb5e33307655cee87cf1c5757db9c25cce8c40aa0a45331790844606dc4d40a696465c4bf79c7d10dcab3f7b8425cf62826480cf5e108686b6f85d1f626e12a8107026d1d48d56b2407b22b34d4807efe83e83782bc1468dd24ca44f1aaa2856140929b19a24885d06161de4802df2f01c2f932fe726068cbf3dad0baf78b193bd59c0923acc2590b53ae4f915fc0a22d3657d085139dd3d52c45feb687c9a03392cf530bf92095889bc942763396398baf7a754b0e2539a16db4cc63adcf983900d2f5cf077192ea85ce7c3f94b202f32648055b102a69b500501ba4cf025ba411714cfe7fda756d812543b31f7920efd20968bc0911faa7c23a24ad8ee628eeee220337093e246d31362a87d746bdadba15ea2625f769d93753775056fa3cbdd5bc36b1d4198e8984b67a31d8727720d3f1351916ec303c58efe0a0e0bf235296b3c8fda15d69f8270263d26de3ce55556cb61a3c2829c4241695c6874c0e6700334c567df1a25fd379579364e3d563ce9375ea227f13f027e6332152580f80a6dcdce6bc34e17331ad311e9d76f43a1dd64e1bf8402b6066e5f9bc2ff61cc4e27e1469e01f9c3cba70112ee9a4fbaf73a47445e9913963d3c6846c16d3307af07dfb56d9d416324d3e933bc4644b67a61d4a1e4e9dc3d66a002207672bc3b66b8cdcb0e09af3d3b97ca754019f934b61541cbe73d7c109f3f9535cb97a5f75d5c086fc2b4ea0cbcea4bd2284b609d4a5718201e069000ddcec080ca97f8f7fee1dbd005cc8527250d8a4bc1179ac1d74aac425093c162aff0f22605059b7994783f3232f4dd96c5bb1fb3fd522d2da87bc2a28d94e5ae2ddb2a6c6004f2a51dd7c0c3e79640de48147ef7a0f70c3272916d86e3939c8d83e88328bd11127d56b487089a977093b4e2b676cad27f44dc3f4d28139a4d6d81f5a91342974a1ae1b8634396d64c634708e28e48d39df050ec23d228cdb2d45ba753eae3f81b3282838d9c1ebea26a5d07deaf56f2fdef6d014b4d7621d7c2797c1532378df8d1815ef922536e52b1305979a9a64bd3544a486f45c39afe07a8d4201407dc16d2407cc31b247babe960952c56986ee75c5c1ba142facd46615372e9e88a360f0165fbe01e8ea572300c86cbf3e8fd1499d999163cd8f620e21433a520b80fd80e1557214b7a644f09f897091a362adaba63c5071896bebd27e1c9268f425239540699e6807a2c23136c082aafc4c29502628f4bfdf396e852a62522538c0780d812d3fcff8991528c5ecc10800607df981879205463d8e9e2bcd776c3db3ea0bbfae2b431f324fa3d1636b51e554f219273ece699f8f8088bd9757390e4dcf481fd97414486aecc9ced42c6db6c2d68303366e8d51194e7c443f5a8d62783c4b7b21db259b9b52b777db591cca8e2bab424ef7abea063244517d78ac424b1466e8cabacdae2d665388a6f811e69abd342e1e9c55516ffb7cc5924670db1c26c9932a7316a88a4b515fd8e2ffbc378d2465811f892c80d743e5c6206b1c0c5b6cc23f0bc020d695d64582781fec69c308f352e89d3fc132cf19f0951766d7875d656172dfded480a15532c3c5c741836c39f99ab258fc55774a35042a3dc04b5c1d89fda1f0da289f1296ed453795248dd9542bb27281048bcd6aa8f192f41bb39c9ed3fcfcb65a3c28b4f09ea79940efb07de19203573248c986c7746c95a1574a9eec60078c0f6dbe5a4b7611390671d38d5f3181facbe02a09e7a3f2bf1c276aa60be6d1fba3124c272ca8c67701db7168dfe3f3f5f7faca407b43cfdca7d442b390eb595404e51726c8733da3fe70154f7a671bfa23d03c286b8aba37efb31977c4d3a4d6405463e2b504a896cfd76ba0f754f3e801bfe5a18633422fd50ba93c24302eda7f820584210c54ee037d37db88b24cc733511d1711e5530b02101f3fe70cc297d1f2977103e3cc33f7f50c7b830bfd2e485d5645ef17fa1e98d5dd430a7c3fcab0f546238c6c6003c2c48af161ceab17973e96f58e256782d8deee55172021c039455d71af78f6f4a9b93e73d8e665b94e993710bb710854c20aebdd021e6964d1909a875df30fc3755fa9b61e29443157998c09c1fa8546cf1202d8c01520d3e9a63a1c538de76203d87ad2f673fe4d0ad34d90d04fe7d4ccb14759e339d1e886cbe9c59c05f73c478dc5d6d05d822fd26e9b137b42a97756507811d77b89daebf9b18e7c6bcf0e0f08e1c4152bbe7860af7515db364fc86436f315ec87215318ad64aa9751d0ed9286bb5a9f1ba25b42cfdc8d62a58655d82f200e27269f6a43c8eed9a7483e24ab1c62b45ca509e9cb0b0f84819cd8c7556ed2b8ec83faaac3949d56c3a2a197c9f53970f2c6c37af0272c8839b2017316b4d38ace2151e9f3f47893dee1c6d61c31d24449c1bbe9a5d667f0f70ac9159b9171bf2e221524b470c24ea40bc16341e0fc172b6d3172488ff911e9b5875a0b2626029b8419d76aca1031f60e323054b5eb0e0c350642731f88030ad1faf64a6a4076f1f40e9ced772881da70437f16168fa5c3fe4c36cb3245a04e56b0d195c6b8760308052cf8931f62fe34ff28210bb876abad9210731bcb1e40f6e126a82ef504461f14788de7870662695b53b2b0f75b58e7c20f6ffdc1fe66e78fcbf6390f5c76d10b89b7fff00d43cc1e0ca9167c82522cb7a5e1c3b0b052235d5e96fc6c87f58310fd0873bd2e551b8a5e198cb2a27600f5057b94a474fda69a6dd8f10837b6ba578f561e94f135aa25d0b508a58bf7afd30cfdbdfa5544192f6c7adc0055db1bbc95499e227fd40b1ce63c443fa438ea2b72d7ba454c6f6120de5f48a79049f4a4426c5253981a4e0d382a4a965d3d0fb769ef5a5d6d3d6bdd28577a3499ae518c3f3dcfafb4ae3b2011dfda41d042bdc10b643f1b231d11659e6d8cc8ac395bcd948932e81da32772c416ad932f0db8c4ee1aec87cb988c880a31167c56777e7851648a451d7690089a01ae253995c2511792f4adf9ed67b40e60bc179c7b8f2bd51afc0c80f7631628cd6a126fa6c5d1c66d568db8d32f7f6e39da066f5c62b9c49389d1c9ce6a70c6a41293dafeb7d726cf24bf0d9240b0231d628690802d50238fb5d01a1958150c601a9821fcce1c9aa2593fc3f5ec53ec007c1cf1c7bf2fee13bf71a34e04a4ded34dee000cdcc9f7b51166e4a9a640c97ebd2d4b287525fc226a5e1959851825639227f7948b6e1cf3cdbea9398373f86c8cae16429426c462331cbbef3a338a57375479af28b6078e1aea62909b4dc30fc2bbc50843dec6f7f28942283bce03c0ea1e7992ee34982e713d0c6b11ffd5e5ca23296f27e97ad7714c8fa414dd3bae9c205fab2d077e6349da1e40f620ac725f145565b231df862fc9405c58b2d507a2b699935287b860ec7da0150b3bb93092925c232729ccc1251a0737b6a272b82a21a65cdee1f15974490e8eb826a6a9b57f0940895824659a0fd44fe73be6101b7ca86aa235dd3984a65b72cdb6d801499f1f4e14fbeb22827f4eaaa5327e2af6d472faf5ebd9c9d672d221c251d89fe619951cded6cec9788680e5ea9b617f5e667670adc80ebc230f4bb9b1aa1e26a73fa787c3699b244dffc88053cae09c51622d0954d96ca725a7f1f196d7e7c5af4da93afb134c6336dc4d471fe287701d580986d5e2f9e7ab6413380dba9aaa6b469e4f86bc82affec94353ef1344244873851ef8ff96aa537a6cda05c3f9dc0faadd387c0dfe1c07fc775a0f32dde5c4bdbec0c6e454a172de29f596ca138aa27f77549b24a193707289be392fb54524394f158abfccbf0920ae379963689ef1a3819932ece9c585de74d697bf0b5757cce238c27f5aa7c015500fc27b751339eac4655158f8029a87ee2dd524fb7cf48371d437d7507a664e835ea064c0183bf90ed0d504f11952aeb149d4405f6bb08594b491c4b891adc52251c800a6631b2f458bd3e2fffb06ad5b7ab5739deeaf65f9ca59d8fe8a1d5ce5c62a378036d148ccea23351231951cbb37e52f153997274782f33a1bff0120698706e508348484cd6ade31e378ee644040cf4b1e94a062cd992696a782938ac494395e597356e521cdee2aefe7b2915e2168411d38dd3ac38c72f4aec8651b5faa50c5d0ea5417b75fc5a042a38c5b3306c7ca817f50fadf12602d0cc1b904e747fe73ee15ca4f31d0ab20911ee0fbd66c972844050aadb1ed586fb23b6beeaeb80353f31dbe00c9f654189568ab15beb542b692d4c60d17a8c01b1a4df9440e41abcd118d3c27b627b78192eb976effc09f3f911fd4d55c4e0296fdd250d4dde80ded3991d61704414efc5de9a403852b6c4c42c6f015c8e75a6fdf09bc45070e70d189d42eda5b20aa431a3dd036e894e60523c20091c0696aa367fde0fe6e8011381c49b84a0a050c3c200f997b00248f1ee8dbb7c26d7c0a0928128f3aa103d40d548bb5bddd4b873a1a799e942d4e4d4fe9080804574149f75ec757915984aa798b75522da221fff0e37269123ced35d12b78ca6782db74e630458df7f4942fa7b910ebacb38ab4f45b572cb43322d9305d409c737b6929d0cd6fc84469134c3f432dc1f420e092a2b1e613a948f502a5165f781d7cb447d97c82a9ef0a94e57d827e051ead65655265a167b8eb4ba198fa2372913af11f12b88db454dee48893c4be33b40347ad01a57e2b2345dd483e1871a34e6c57d36af4b4dd15651891bfb71450902334c1fcf33e97c749e07cde87cd8adfe233f02b5ca7cf9746660fce1b5c0f09653979fec34b3bdbb86e56df7663cceb82c65b75bc31233df99d32ab520f4ac9154a587ea42f7fadc824479061fc095476e384c73722962c88c394968af26b1189abf3724bc4bfa296f4245741f68ecb71ec5325171fcaf44cb1fff56ba063234ad465741a2a11e6e5ea1818898bdb7d37517f6f16da61623641a4e26bd1d5588ab6a9c6129d5ca3a4259b943d295427dfa0b9baf551f6a42618c906118511675b49378daedf12abd77de1975a091e6a8ce98a170a3205b749710175d879859b457ec988bd89f2100eed0a9c02e95a0ce7bea68d5a18dc223b08d0fcbdc4eea3438e9cb310f72464992be3f5fd45ec6b3cbcc3a282cb0455f91d6e350169ea9045aae6e0b8c5dc190511845507f105caecd0092e6430c512dcdad69d622a6af8373511dc027a65af7e8f3d3f52f6ed97416f8717938837aad82dc000b797f739bdbfefc1e0c740a49b2e53df5339af86aba1bf116d34094ee24db37a0cb16eb06f6edbd451c7a5122d1688702a56c18352d5ea017838d9e8df9f33d8e51e9c80e7cd84253991de7f31b5990e44c210199b5066ec89b61d12af912333a253f76615b7eb899b29c8df7b591740f7c9162b20038a6342796fe99a66ec397519e602f352dad809548bb3a70403101c069c3cce76b40a202af446ef9145de16e0d33c646e9e36258f9a4ffdde85c3155603e59c6a07296a3b93e0003e552f96a6734f6e42742cf55cc1d425ca2de539ec2c4c9c7e123a77e40791534e0697e3d4482716dbb5963a051ee7e6e381d443ef62e132092387350e3cff79c22e028cd4dbd70b150cceaa2cf7449caa20c679576d15135eb22bed8a36f893c6c1848d96b89fada8850c29640b639fe6368975bfcf863c5d27b59422b181ab0ac18e04c57a1bdb2a98a9653d16f6e651853137c7a1b546088cf06530e1f0e17c0fa75bcb8f2f4ab6c29fc3dd81e5dea0a4492573e6c0a29f8c090ee7cb10eee41c28c7f79dfac954d95b8e7ba9302d7fa57f2698b0a6c496c77b483767e423778200c2fbb5615ea53b751e20daaf9964bd37bc787f61374cc20dd36482840401de24097d9610e2cebc2273eb99c866134a25ad804b24152d751a8596914c2c01c5dd76bd388121d2171205614445f8166625ff79ed11b425bb4f50de399f3fbc3011c78da96439c0a85db5ead0dbc568fad5763c127c3be6b2a8c2f0ca463acb8969fe8480f289acac064b8ce5c024abe6abe476391f258a051486d35ca14ed4988a94ad0285dfb60772d62a2611a811fd30002cc86a296752d1dbb7bb4c6a88cdd9a5c90e99d02d6cbfc97c64dbcba749028e38fa7fc33030f7f6e21ae7e680600cf4b2a765fcc4b740ab6229776e1561eaf196adb281bedc3f8d10efd1df336468af4f04438d94987b88993cbdf7f143143dc6636a7efdcc838e65213a1dd11adaaa4fe2810ea161a1d2cc154c3c5c28d8898a7b8b70344edcb82ba762bc9c8b35cde31d785c59a2122860b117b3078339018d3c176b6f07c8a5b2b41fbda86c63a48f74cafc3d0d99819debd46a724e17656abfb21d20355cd0572a5f85612ec6f2b58486c5ba80811a90b9c69ccc90cd754844a53e49a3f507ccd51bd2d8952de78ca474df3543913422312024012c670e880450cb97a18033a464d5356d57d2f51f2bfcda01e5368d8db7c89916c773d4341f75c51a447d420089b5e6d23bd5eff3f439e7471418c0d8b68deedaded2d4ba2dda0d0c995856196d7766ac0a1473f5cfd9ef411ae7ddffe3fb2e76633c5d17d9eef36a420a236e6ab7159dc573b5156b91d4ac6687978703fe02861ab9b808f7aac5c5bbdb137e334e4a046f370c4ff51088ace0bac5c232a250bdd29ac26e8d7db9fa65f93a12203996726986cd1c0a1458aa42b16e43ac1321a4a31a3964e5e0486aace2bdf936f2bda43402b080b083eb1200b0894a64820c37b312138815e59abd319d121456276f22973290f406c61c489fa920d75dc084cfd5c1aaf7660f238f0329f8132369431b5e48eb67c612a3e336cec069afd52994048045ac69c7065c410d6278171e99e096a04e2bd23213532b970656c5a06b75906b73b52f51c277d5d63e70c7a2e8ecaf58c89ddaeaad68e40855ddf76e04d3f1edbc88e4093d84b3cd0fe67e88b983fe444bbcd88ccef64c2930e1b7aaa5be2cc90122816d0cbf48f0fae630ff71d621fda69d62042e006ad96a3bbd0588a19e65d1c8712ac8b587909209bbf5f009fbcd2e0935628a4e999635aa1deac96b4abf7272905cca58102d8aa9a8f80943d735ac52faf6b816aa35e868306b9d1fa2b56249fd644a23f49c73f10cd6f089bffaa859ebd3a1694b8b21cb5b0ae9f9adc17c23db222d00e04afeb2b980db309fa90700bea810a590d23f809b03eff7d30962bda5fc942057595f79e2879df7eba0df55ca77453e84a7115b1dc9427e9c6dcf20c99dec66e6cc34962dfb81a60498a40b84aa7b3cc04b973cd63b323ed1a16121d826c572db5bf4e7cd8a8dc5748741eda69685280d8c3c416cc87a983181a29a292b201e32f40ac3aa6d035c82543e2955ba01d0f1cd355b3035a18b72bcaa9a3ef6544de4a3729542ab11aa9590ff1d2f1895159cd3d46c008c608b0c940abc6f6492ae342c7e8c19072e896e93516d749b646de09cc355385753472a71310e4e5627d4bcd9455855c3ce353cc0efeefc5f318af3f731d0d26f7dfa9f308f0fa942c003c2fa7217dde59b746926d44e33031d1ecff9574d0b9e7f2e13537b0d167e903fd5dbe050e1da40618e7382a709666bff057b39b5373a96c1d6aff5a10546234cf6eb08289cbe8606cf75eb41eeca09184bbbbe27c334ee08f0401505812346546cb03b08fb6affb5378624228be5211f1904987d4c6376b8191e58634fe8294ae97ac9091dbc67018bbe695492668c02dfc01819d98a25e3b26be8c11891250211e19d80764f69c64d241c49a7f5b5700efb0e0218dbeae2ab0d41c6959ec1f7eddafb5c19221e0e57944a892b6580b8de6eda32c49fae0e944e8d7adf8bd841afa058aa9c69b1a44988ca0aa1f2e2a4804334c581c96274917e99f3098ec0cc8ec29ab4709aac9ea68a7e9a5cace3f1725010ff310979cb3cbfd06e3de92119c9f3831fae082e3879909c50c02c71dfb2e83233e1b6f43c0cadb38f62cee202963846ceaf67fb202cb1e9674b19abb2ee12a57e757bd8707f150350b4a52988de0ff06ecbd83561cac68454511ee69cad9b752aaa851cd63787db35e6ea54122436a4c3564c2058640dafdb67a0202c522dc68d26233e1f0702e8150cf955c7fc1557cc1e90fe3bc52a5750d85ca24f9f83a0576994a75a300aec370eb29877b107c8e656df2e7b990534b0c1292b3c4f5037f08d9a7e265fabb8c0296534b59b1b364f8e6203173d67ac9805d1011661750192f3907cd633db59a5673125d4f7c323590187c9b0e0f043a307e83fb9b22722334912263c16177a9bb3dcdedfed2bcdf53c5d4c32c8522d75f76d74208fac5f80259d1300bb2730c86b93a029db926ea0f0ce83f45347923ba25ff2727ae66971c9c2941ad5dc4025428db6afc1e7b72d7befcc6db16976584a2c66ae1ad676f6245334bf4712074155800dc048cd340c0dfdce0585128d1d53e0fae1d68229c6d70542413b1f4e5a4b9815be942c537ebf901d98158dc970a00ef63e77de541172f7da53678bda02c0aecf2c121a40bb9a91bde2e84442177e397264971689c0240adbdeb4e83aa18eb0b9cf6b3986c8a39865e6949231710c6e720cd05a5d7dcba28e2ed5f934069ee0b70bbdde8c7fce7d2ea26825bd40b5b3a04d3b62c8708898637e613a22e4e351377c95e0851ea25d85b9276850852e80b2c69ace512cd2463493a0eb80b91f2532cbfd3f910c1b2357a468dba2e7dac6414ce295f36b5bce993ea757d450f78950c1040ae921e1838a881fa99ddb27b8de1647364cb323cc77febac0c4d9d400313027c21d205b02820e85a0942e9e4047d65b9597dc26e14b95e3ea1586740e113e218772e28c21cb8042bb68fad17caa1536f8c7f54d816a02ece6e7b0bd09d1c487f32e55d7c200e0d036b473f45ace576a1de4007b639f3fe2d7e8d09e63e6c04a0bb682cb80ca0918b71ff16ae4e94bd4b2aa600975ba444477c55798d321a177506d5861c9617458a73d153b67857c541f84aafe698cced7e09c6600205f03ee14646461c63527d70843c690844eb7178b591122f849cf1a5fec5bc0f07275d5d102a440e5912f2f75b8ac5c11e65328970e9fd410e55cbf4ee0850daa696581b943869be35e431a472951d7c145b5d6df832c61e5f1fb95428764f2f1f1b13582570f19f7f16b1c275a33a04b370ff5e202e7755483fa0db6bc41b142a431a7ce87cd09d41154022c7e36581e3cdcfb81cc9c20aa2f6a6e362c766f4aead5719f2c3fa95ef972bd1fe7a500acce6c360455cc1535692a8d34f030aabd67b52ce855d67e3457b2089e8d12f3468c05403f414f580b41a0e302c1b8894a695b939564858c5c7b7b7425e1f8eab981acd58be6d2094cc98668ceba21168e6b6bc94ff870de594f041490ac3cc09e5fc80c818c95563361e5fc42656ec689cf182e15e4ce3fd8dee70c89afde7c072f5dce544652145e04c2c9f1e31c02299390224b68c4b44c3a1bb5342cb491900d0983b70594c132176b9dcaa69271799715a01ccfd72b9e058d9c991578fa81aa50f541a55db386a327fa6af400548ce9c2fbf495b9ba520b5df6b4fcb5369862a0d4f43464379c3fad7a6802f75782c5bcc9863c5354536f0a4c090951511415cb22d7d20e8152576efd513260582c2a1d8754d61515fd25b0d4e9ed72380b9e2683e62a3a92c5efe570b8995fcc9d620c46f2c1578f3c7bb5ca4805b3fb7984e87ebd06062b5b5a68fa3ab60a0dae27c1b5851e337d0f9e01a1f2d2eee0d74e092ab282bd7ebfe2bdbf0d419a8e61c615fb8a819ec759d4c0d114f17306584c9ef46b16f7761a1f0ad8973714897e3ff8632595af32aa4839d6d7901e103a5f1ea6a5153602d2d416128e927fd978eec93a40d438e5bf6bfd535dd8a13673f5b880a9f5ca5734526a4118b2b53fe96f8779ee452b36d3b98b08cddc18e2ff0fa1366003ea20ad894b4bfc2d6d3c73f7d4ecf32850085c4b6a0d97e17ec7e2fbe12269bb3de3d8c8d0d135de8e9f97a5ba007f91399e1b30457beb9e1ed01d2c9dd9903ca645f022d28b1c29c4c80bf65b404c16531f3ef30cf5297c8cc81e1907bbf29c463fbd4b997fce4a5c21aea9c78e732ec67c3f551734bcd1388ddf7a5a7bb1c10878359805e605fb4fa3bb28aac12ebf267927fa7e776656d325f74ba29da5c2bf3e97413234efabcdb51d309c362bae4cb685612ba04ee50e7e9fac94df9445490117765325d9d9cc2536f9576f79e0b607495e3e5a75285a0adee504b1a78e65edca0862f2852d1fafa4888d098df513802120c26800c93d2d729a0722ac8b1d43bbdc9c61b8b0d61551c6b3ba6d9c76844f1da1399d459cad53f660a5b08f37bd7b5c60f60a85597d7f9bca4a7928ffe83e1faed5b40776eb974403f42477c91c664ab12a5b8625cd0605719f1cc82b9d18a2f100b279901ab9f66eca211f23d9c51155bb0d67bf434fb9a5e52bdb13c148a4b4f5068124bbb1fe18d3efb69612cc1b021d7e7859da69f8af25084406f289bee11e19bce8fcda2beaa94e02b552dc890cbd8068f04d6d759d916c1048bdef77a5fc3f3c1df687a8592b0246f0b476c820d7a01546fe5a2f0fe1d450eb551a492b65eba8840174351856bc4b4b1af8062263f8685cb81ecfcf3adc661ca2f34dc6089d3d173092c634266b9df1a8650e8912545984129363f4db3caebdc130a758209dc38777ad5e759d4039ac2e68a3149b1fedf082deb1b436284a6c557a6ea1b0a3ac7a10206e4d477efeccbfc3004ae888dc3eaff9ee62b8248c68e66b66701c0da40151b2c41fb02b3a19dd0c40b30199bb13db63e566fd6af3e3812f469ed23341e3c0972cc6e1ac0868ce0043cee79f89922b14d4b9d40a7b4c5ce184f5850d4a91de0e6b0497598062604245d60b27a37a27eb37faf6e801a04e89b12b080f74925705cc9107f29085bae3a8c5d368ac4e1a76bffd6169eb1f314100acfc4923303f72a1425e9643ffba82c3da63b90ed822eb405711f21ae1915f8816051ea837bd335bc10c6a3aee24e0fa4c1323cbfee3062e1b00516f60e50ea2758f725fef3a27ad16fbf95d7958cdc20b5e81a44aec8935f4d17116ab8f59a24c74a55746075848b991017651d3d1a6b9e6185e591c0bc206856988f2f522d132cf7428c2b45b678aaa38ca5d2e99a80303b95381b8d51450ee7d40c4f18cf6428a07aebaf22533ff86f8c43c192df3e659320c71826e4060e945c449d008113db777a856e9c89050adc8a96765a74fb13ff8853936d1d60d98d764d2d07c0dab6f795719c8283d048424295effe0711e12214489a970351b55644541beffaefc7da8c1a86fdde7deb735ca5fe3123ee03034be9bccd4ff3df460a9e8f31be0dfb49116a5c3dde10d9c955479994d3fbbdf7051aa94da6ab5c7391dcfd2903cdb350e40a2bde5710bf582eeef32128e3dbedd2b20204bccfdf0b57754169b31d72825dcfe0493f17206e6b06103c3091bcf693e0868183eb34f80f00763e06f04e2e60abf92f5f8103e288ab431266ec594e0d80c68dba450c6ecbdf7a0a84d4dcbb9bc5b21866364e0cbb6426993cfe5dc03a5e61a6d62805d8c2d8cc44f04b4e07fe2b97f0f608bf43d47b1678e0ba9f5095e5340d492a795a0d9de9c398a79a9caf105763ad6f0c56d492989fa088729fc1d62b2a31070f3a3e7c7926761884194ef95076370ec4ed8bb2abe0fffd4d1e8fdc7bbff8a912e552d42e44e91bc82fdf8878098f5eaf1bdd0d8e3f4684e13a778d0c5fc33ed7f048ca2f9a82e9460767949f6c0ee7fef146590ecc664b28e28c21e309a0b004974d44447fd1ff477ed9403e08f27864e4d354aafe3bd8152a89610276fb71342a507220493e94da9266d2e0ee186e0a492695111dd17793594b90709daecf592826fa480300293785fab87ad630c430163dd2871eeb1ca218d6d84d52d58e8ddd4a6d510444b90db32b562d4a5e76a84c281630cd80a3c41468757100ddde4d28bbcf1282038984171203c268c697741218ba0bcabdcd5f82fd377a1eac1e09f9524ff0d72a8d43e5265767cb79ee7b25946abde2ce090bd38f907ab823cbb3ae3255e9c1bd27c8f4173cfcd6ce1136e908828d1199cd6553dcbaa45cdbbddfae2ae13270a5e15b11dcfd28c9f040b76e1d189879138b807a116b00abbd1850f56db94a9b5cdfa1c294ac24811992e510c463a31d8dba010494d8b77700b186677e94fae402bb9f69ce396320c1412f65641314b73280580872468d9671b0c546ddb8b585ff76210e0e028a98132a098d1127b4bfd7b3488a129bf3111144fe1ad63e085f9e63c6b6022b35a557a34cbe8f8d82c58d6f015ad29d46d4eb607fcb4bc102e3cc726d153d3c0657d4171dfc39f3ad31962629769fb432aa010e43a5c30b4e71c0d8ba124355c5b2a111280037569a63eac424322c432758f7a007f0962720ecf5915ccfe1c01eaeaa75969ec2fe588e808da49ce8135f7d4c51d58ccf37a9b8538576afe6218bc020731ffbbbfd76160d546f570d58bb2a9131090dd2c31967d66a471c1ff64f939e38dc7b4df8150bf4be18b58721ad96a177f577c3b5eae7a398e30dc8297b476aca74ca8234b076a5afdf339381200b8279e92e98bdb4cf4c0aa48af634ed738210497e6d000eb99cbf1ae704071a6c431c9abc8997c23749070d53fe4fd53838acb06aaaa79aa46af9c564305718235a758add978bc65d315bc0d01e5a2511b4bb03c3715973a4666b9cea3cd9b783e86ac224443eb948c2baec8c99d18300410cc1713b92202ca86f88a2f877128a81abd3b08057c7c25ea57f2a1f8d9bb974ac05c7ab0aa100df66600ffbd3330ce099be1dcc11f846ba69ec08b0c96b6649ad5fd96e11634260ddfccbffc49665abc458943444d0b339c4c445e16e114a3b6ac5c498107ffca4cf541b30c684729c16adaa0dc2460b8aea248bf7e19843503b9fec3bf7f1c6284944f6fc63016e6890f07fe630427eb0cb471f191e238a43f194941738a0d19930e8da9a553d3c681673a832e013911cf85407f0c8dea55c91b47c01179f94cafa55f19480ca240c7b5b1f372b6e405bae9495d32e36b698dc2ecc60353d114f89ccf724414c2d28fe8cc36308a5e6d4116da7f59aed50d38ba103fad4bbdd6f183ebef044732439fe0963305ea5485022c199eb4241ebc6f89dfce44bcae8f927d67ee80467dd20e4ce5955bd51f62dddcb617d399c43ce46621f6e5dd0a94c8c1ad655b532a43bd8cfbfb783eeba32618e662ab00c0b80952688a45423558401a1bf07c8f67ccba199db609c3c1d31db6879fb919e477ed6e940020665062a84ccada77f96af76587e404ef4bf562ffeafc45a14dc8b18a4129dbdde07655c940c27cdbfac313d04e80b032574a434c66bf19f9017e715220ee28f478f748c72190e61638fd5e763b5fef74318115a0d85c9264f6708e002a50fb158144a4cfc23658848771d8fcebc522942405345dfe00f9b6e8c19f387b13470d6ee6907606300300008382d4686ef3de62517c93837f2f60fa9347d211f5b166fe4d7e531c05c57210b88b29e56c1405cd6c9b153e3f1bb5c5703329037b2b254be23223e68746dab50bc1f25ea87020f2d95c818f21b63f386f41c0fb0dd8254155b81dee18cad39426ca90e4a535cb9e76a27a089b2c3ae6cf104e69ab3a99e937f4ae18940efae603b8817676e4d600c46d4e427dccbfc714dd5589f65b645eb9ff71c70f9c0374304ab21d76e386d628081d98f0b3ba608ede102340af0e9b9ef8226a8a72730635b0921a25b3a0578a813cd9db37dfae130e929edbd48b44d6453c29f2bea4c53dc358e8ec9a1fab04808ac103f8cb8fd59aa9992f8c241449b5efd1852f7bf1c9eaa003074815f9bba43fbef249973c30fcd29e5d0de69a4f6b6ec6cc12950ebc85d7ace1d0ce29d7095a3ca01db64cf02123814f82fc5bcd5dec1eb06582886a34249bfca144872ce269aaf50ea4b7e71ece906d7ebafa2a2bf81646f4b66a203e1c8b44f7dc48f2b90f5e7f728b3ae5fb89b6b4bfe90c0d3fac21ce81545abfc3f0d7bbe37e209b71310c9f53bbf4236ca4acc586a8a70341397f12344cc97bcd25f6c3ceee685eb9a35c0fad93837ca52af8ea92d03221df9eed6ef563b23941f87a4fcdca2dbba87a8c2b9cbd05a106cbbca20e16f93d3c26415e84d970bc54ffe830c866ab4549a12c23ff84645817219f91fdc101048256ece05958c0ef86eb38eca2b55a28e397904a0f8e0b9f94d39d49c689367610fed215e50d17a051fc26f14b07743aba98a218a1434f2ef82cbc168d72bd658550cb8c2acd8f3fb02ef70a9367ab085d91a51e8e5c4f2424ab56f0f25382d4c11903956da35da763f89e4da7bf91a9cdfc7a54ba3cda529b7c04ad2bd23410288075ef88b13a9cc07e5c8ff4cdd79d476666c049753515aea4c54fbd2bbf28020b6935e6b3b93a106d310cf407818ef8aa6b31df4d6d190dc20094924513cf488e1610899310ae60cf9946737833a074822250cde9288cbacaba54b3e124c00da42ec163955197ddb58e9375c0907220c93d4113ee729e8d98f6a34ef8c6713609972666b4f84e10c7f575742e1f6f8d641d99524446eba86e9b3e9ccc180ff0ec3cb40c8f2d8ef8e520e180c289d3c4ef298d6f86e257cfecadd1e4638fd72f611339af20bcc7b98b2d71b55a6c2c468412487946907f476278c10500512a6bd8386e0ef261d9b9d3f4010487bc45823b1f36ea63f71a06bb1a772f14a09d9b8c40d250b6b8ebe87d0c7292b8890da226011b96addfd8a75a04621a851d368a0a1879e22436408d11e66e984338db2662e48130ed18ab9670d824c80b189bbb74fe25b90258a03ac816cd00a59566ed2e7149ddd341bed866deb076fa4d0ddc32c0952815a633eada34deda23925d3949eefd2c296d2b2b801d502933445214d79399fc2df95b7d6a311add180500d0eb98a965cdad919edcfb2b456c832560370607c0ea605330a6a25c63a700760279cc1f650df6bc8b7f85776dc6ecdce55b4bc62eeca940663ec638412300d0fea94ca33064cb8f4e022a5fc8ff9b1a71f15227ebfd770a511be21f2aed815b9d27814f88f35cd51a197ee29273714c2ac5ad8f75a898bb44cd8571aab8f69cb2af4db6676db7b2f530e362b1c3bd0fb67caa48cf5df5607e56f78083e7137aa97bd7da13e3824bd3c5e292c81d26f7d1078a29935e05f7503659aa56271c5262391d6c8e2a08fff86c22f6bab3f3c1efebbfe42cebd00433f555e517ed822fdbd34de4240b79b5c2dff9aac290c3857463180f21591ac197e218244125fde54dfe404420bae25f8d781e28c9ea74a8c2f746d428ceb70243577eb03f8321ff9abd41e8e6e7a8ba6b4a3bdee9168d2ccfa499303d53df271a15245f58e0ba28b94377ad046138e287479d9ff58721587043af7c89b03210cc1e8249f3dc5f45cec07861b08d7f8ae5bc094b0a52c2dff86cb1bcce9644477114ee9b257e4446ec63de1b488b155a8bd9955425f6be3699c5d2be7ee10a4ad426d2a693d7e0ffc0e38d2623cab55f28f05c5557c1da59896b38c07f89f141a4336c304cee5c289e9a05581b0ef813fa1cab7026978b74413d261b75f6114aa1d5124e8cea8cc4dacf091128675bad07d6f2b6b55ba182d57cb5eaecec5a39c6479873e0e37587fccb6d07bb0544437e2aa8f2e89a548e87d3329626438df0f8f8becba8e0c41f45a1e4fb5a5444eadab86d8156b6319654cd1feebb1289a09664828afeb4adf9a5839d01c85a238ee5be9a24569d7146f5c5a9678908c3c4941c72b6666e42a3e6f4db434198645b9686ecafe52a100316169ef4fed55e036ccdc099afcf298d73bea505df608abc60225504566aae2b83d2a221de7657579748efccb0a7c70ba4a6d0837cab4d58e46f9a48a07756b53a1a5ea0f7635516b907bb64881c5731e8fff60097fe4335b275e56df9d80d97a7739606a23efe4fa7fb2dcde63ea992acb3491851c1f94bcb67a42ef5f7844d293388b315223cf205409cb9680103af2b223dcded5b2fadbd0d339c75bf63b19042aa77869f1ce4d54932f4e9b7a864a1ad8fe889077cc0c885ab105d6b4ea87eadc70793f21aea5e5418915951d3e7f59783e9a48007b1dd3ef033c6140a6b41ec4c64f715c6343507d05b88110e024350867ce3f6ed080e90e6d7f9a480556a5a70c5d17ae4ffef9011f769c763cb0941087965d3ce4b4cecfa81dc37f6359e4dd370bbebdb1cc895dd53a3b36fec10320f4b16bb39f2204210ab0ed1d5fc01cd489023914de7aca27c8891dd700cf07bd28c9278511f3fc2b9da833aef11cfc46f4b3cfa147b2977b99930c98f359eab14c71b750b8efeef8265c868c0d15d5175e1f77dd22ec47efb08c44930ce860d12497ea7b9ee5b6354be91e6d0cd85ac4110cf0d84e60855c5cf5c3a60bf42c1034209c8508d516a49e360014f62be407adb5165fe7e6d215f9a21ca0f1957a92d3bf40bc6687b37e8b90347d3e854fc3d06146acc42bc6e512bbcc7b90fa3fb627d5e5a70a3048dad8ac721f5f3e11112cbdcee5c1afd6d1a31d0a81c91ac1d6a50eeefb966737e3ba4728275dd0a300573c37a22470f859ff5db3a31ba6fdf2e5522b143ed2283e5e8d29ae429c6b6b81b843118e67509bdb87739b1527c63491df3cd2916c69c5f7e09c7a7e6cca493eea08c77144706ab7e5f3e1aa8525d3cbcf2ee1111ceef895f16818b06901c588cb4f71680c411c0a6e7a811ee6e71b0f5096304e6b2469cb131c4ab174fbfdb82d0d9755612428bdb0f78f85fb7dc4565580a61ab107fd4cc0b9ac381a859a8dac21d182c00efc11d842834289f2c3f487b761447d55fc6732427612a66dcfc6af7321812de5277a3c681f7200016c0574a107f1c133dd68d1ce966ca0a5d99fe1ea1a77e61b0aecccfa1273a46036a1563639926abd89d323eac27de61ce714c9b840849937535767dbc79925dece58c574bf4244707e91aa2fb9f26c01bad21602bdc064682a30e3f5e5a48c978d2c0faccef90cb904fd1e7ff7b13b67adcd221e6fa6ba7aa63d05190598dcc8e0a1b60cf58ba335aeda1d983b6ebedf045d4e77d11c2270ebb158c2655ef7fce3cc45f39c0a83f3d0e4104d0c88b71cc45dc235aabfcc9cfa71c115a9161fa08a8f946c2d205c023740cf063e0041d98a91684f080c5fdb00cf4defd83cf92a813f93ea01e1e91e33d8fc60769c8274b254dca39fbc8c2f2aaea89d0225eecad34d1886bde1d9066959e853474a71ac6fbb44714026c3b5af802c9b977aeb83338d5479c9d7ec01c86bd357d04c80e4eeed0564ede4b2444a99d9121b8a823934c270906b48ba2d1b35e0057ec2608338c70db90b3c77e5548a002d88fca8b68d07136a647de9d2b94a0dd8f2323c60ff2185237ba07efd8d49b4bd809bcd0b22a864ab8a279cef7cbdb22e0ecacd8cddeb6fc8fe24d94f2788d91eae144874a53abca9e1c019351654663f5ecf40e1b256d13a3012fff19af4c119a5d0a3d256c87e05dff323f3d89af38b8b6975abc69d3a5cfd70a78bda5488d353a97bb20805262c3884eec00c098c9472a9c17661c273e05d409c1d7dd569a25d0f8e85859751609e6805a8079169517dbb8cf82671034c8ccdaf73f8107d191a524d23bf0853acc1ebc400305425371bddbc230e35675770b0c5c27e0d59e294db4032b0fac21c83bb971c4a57242b40c14d088f9b0b3f6fd422a951da18b66a38752273df0419a74579e1d18a82bb8d21628ae1dfc1744deef83163062281099fba4840177acb4f68e4bc97c249f4a98c1e778eb63309528785e6ab1bbf9f48f1f155b0fa44a76e764e2b678c4e3282e9d386ee6d5e844981fc0d068ce827e092c66d7016f28260cae6966b6f343a2721489a3113fc9cb5a7b18044a2b3c883c4a076c01cdc6853036d4eec04ad9737bd327a350df1fbda99a86da8c321057903c15f54c82eb040daf29d310666013fc8c473b3242f8643d1fea179e1a3539d4bbbeec7579da5f2d0b4a0057639d682b1cfb7fca089c02b9ff52a68242802b71292926a7c2206572a1903acb4f705704de9f6be532ceac4a4b30014691d0a94c12096d7d4659a86061fb91228c073ea4b0ac2364351573000dd3ae49964dbbd915341d3c548430916af268b05883b15a0cc851bb7e755a0325a0b12fbe7b2c725484e50ee3087ff80c2ab5730b91b5e5e2bea2d2823a40a68745e75d0810cc1a5e9bb5b35c1c13af83ed9a1dd43984659e4acb80bac93f55b2efd6721635a0b3713048288f2a61c5082af585a61c621046c37133df6877d84e79f9d1fac2490de14c798440701c6d41a00ea2996e1288467cf08a7825e88ae82358fe05293ae71f91ab4ec498c3a157c01910a31cc017e27af57f926f1b4a11273342924f7a0d08a48b707560adb1ce9ae81fe0cbca97900b771bb5619a88b133157fb585ebcf264f26e0246a29126c18cb7692456abdfb48c1a102aa54ebfd5ba3ad107faac1bbe07c8ac8c4fd217e29bf142ae7d386cb0ab4e560a9db9bbc25effbcbfb8f35df51ab5e76fb81790176a6b84331800015895b09e8d8caaf5a2fcdfc518a2bf8a31ab50ca30fd6a28ab11f96ffd8a1be471c34613e29ec673cbe802e17373373d5b069f4d8a8531066ce2687f0c32e0056c1c5fdebdf3d163b32da327c74d45f97d1cb31e73596d0f18a3a0622914df5d2716788b3831cdc3bc4459bb9943150ef090bfdd1742ac89b472388cf746ce7c6e6115e31964d4d22849c1e50edc4c42fe91cc4d7f2ef3f0f66898183514e2b07b72b73ef9a63313466878209f0b51901ed12442924d60512bd10562b500965b18e8487c73564df6a393e1ee64099c13b880d3004e31cd1d3bf0043a9d2bc52f6875d7bb22efb00e01bd10256817ee8c7d02935cdfb4925868c2e556ff0a0252c6f80b41e3ae221a845b2e0d07188a6b1f22f533a02f2f13bf2fb06b317577764c40f057808b3138e21f7b430cb79f800f16f899372296268643d6c8aa884beef196ac118b2355181c687341856628a9fbda1222b327c99420912bf62b838599195d1763c1f7be40aec21581be1a12b2d7e267811a8dc4e0cc3242973a15308c24732306a05da8320926255fec276050ae29782f8eb2aa510f1d55d30682edef929e6ccb5d0342f4411187407021b5b11b61a4922ef93e94ad1abda2fe548c4a81b79c3ff4dca1db0984345ee5a064d070d09c51b7a89a423e97e198c75d99d0363112df24cc35c051bd577e3e6f1c4dd0b8d66a5ced9ab0648c8dc6ee700d445c3c3e5f0368168ffcb0a13e21202bfd678a94891c7be25fbc7f8b9645fe645c8e2de4060a0e496f2e1627673064fcef19ce19e313c1fb3384740fe77dd6155804e46fac78b905d906ea28b7771ddfe2cfaba204eb48d65c1c33e2c93830940ae44e5abf50e0c50e67c7b6500dc981f7831cc7d421a9cad4119787c1bee501df5b3e419006a21ab5cfaec44c6b28bf082ac31865784d732ad407974a6b9cb3fc788702400bb233c8250dd636e4cfa559e73dfdff531f7d151aba75b13c93d007702759d4a0d5c7053d3c1f84a46dfeab5f1782e766fcf738eaeb2bce8edee1a08431aa0a2c5743ed412a0d68208398d503d0104080c86bc3cb4901448a1224f9d4a57e49cc5b06a2357ca97f13fc3067a72dbb559af7f347983854a28597e0640619c0faefe4e306aca40c6c836b92aa3935154a7d2387994c9eb371374eaa0f64c651ca76eed4d2683286ec2a6c648e9e4b1f69aa91fac2c083824a1381c583f369b8069c1df44e799f0ea0af8fafadcc2c0804db33a7fcb5e324d55f4271a63d70ba7ad9ddbc59e440316f1ea85ec74e62d1d5a9200d965145f1480d93791ab88bdc71cffb508d587e6636dbd7c447f5416f087196abf41e65823eb988cb9341a9c84549ce4856d4d35545fb1936c8003f2a637751f408daef9dca9bc63121197e57c1133520e770a5c19795d9019c9668a1546f7a318b4ce74a0c49e0f6363ea597e60c77db1c54e20c758c58ca1e30c27a22e4304be0207c5d18d246253521d122c008222248bdae69217f5bed647a6b6df7b43ed3740c8f2cb7d8239e0b0f2fd82253956b92ef29f123b034040c8c841b013f1cd23f3bb0b2e595d5862b560d52fc24342b656393e7fd5ec1220d0b97ace46011d61c31b2cbdc87626858552362dead4bb43feef46d346d8133c72f9f09786356bef5354ae1d1720be9e0e382cccb9215f514d52783d63749d5bcaf56d9287cd287230339627380ea20a0850b5cdc3c4cb413dbfb493f34c827670404e281f5d34b80e1cc129f2e0c99c6f3bcd475a38c10e261d22460f6c68e59c50c328ebc3e069d1bc1860c69d3bc3f7682eae08874ce7f8a7022e130158eb8488c5af85590e35a53dd5fdf54d716e3e7713a331151b25386de025b0eba5362f4b8297d66ad5e6f152e9808c7e921145ec445cc0712379bc324936161c6f5cc4cd0c353c12683aa6a424a502f3d78c42cad6a5f4b7db57d0c364e32b3e8d8cad4d01c6472a33f002257cfd7585af45a41084f932c2dfe8acb5b8822b79861729ee055ba89b96fb025d7a6de8bd9e6297dd89fd206e4fcc209c29ea187d8e496333d2789a8a6dc5e20ad045363805188fd2d43aaaf9aa99d066429916e81e1227977e065a6ae7f3b85ca5069a59dba92d96ab00fd17203a110f5b9892251fa731b8a8494c2818734315e364e8366f66f69170672ed93283a445207fc617244e11ce338ebd22d5d7bbc5b4138e2b9075055f91b5a28741a71c22d857e07865504197f63c5c58d9b4556aa6b742fd0109fef09250c4c4cbd037a2cf9a96dd8f731ac821c863a5130bf5e0f86f498f5d22554bf1552200f753ec72111150b412f80e2f55aacb764a9234525c2410545c445efff46ce2f2fba6d58c3fec874e694563b8350820d4af9fbbe6ba6d14c983b3b6716b8f26cf73457fc576ed54206e8eba3ba6b25b9cecf347d9a06edd2a3dae8ce97035fc246050206568ec815dede61d503cff6e9b7753604cc70bcf80404082eaed037f629d3fbbec371e7a5a077ca0d9b50c9d38ba11bb4ae6f28032af931d3e183e4421c39c91acf01a99d6236755b914b8655d29fb86c0e543569ffa995eefe52d2342bd951147cb1a4bcb4cd4d69d9d080aa7bd07b57e15a0e0ffd8f96dddb49381bd0ed88defc964af041207569e67777a449d6934dbbd359bbc45a4b8d218a8e9e6729fcb26169f74204145ab9e2e67f9ac7569aa9e70471d0c367925e9932c564828a2ea5c91f7aab2415285edd2d224671d34e54961a5b1200a25754824a3fb596b699cf108b538040bf2f00d43e8e158f36ce6a77079cf78978d94735332300a5c663e441ca07c7415f7582d52cc565fe08186c0939a0a53e596b62a424cc454683919280a218f8e21d8fca2e0a0b609bb035413167006be16a1cb9eae2f76893444efe8fa26e0bde54e54cf682a6f91a0d2faf7c4f31d9567972467452d2524982c6706b242d35989285902e7503c14fabe5aa442fef51a200eb495490e6a397dbfc4d594ab7fae388774a3a775a3da383e650521fb5936b40b0beb12c1b87bc088328785b80981f3510da3114697643df3d280fb6608b84ef69a7a5904d489334ef150a74ceae6ee6d704ee2e9baa7f4281fcb16f4bf315774f49ebca369678186912d871e9cd21f8dcf28eed11284eec6be42140e551dd3ec59e9344758468dde9e9ad00caef1f03e4827aec27e46586a51de2d26fc2e17c470ea67463130669f0c6d34224acc32458e2747edb44ed167f33fc2984ae8d0e75019673cce3130e6d4f549055ae941a0c6c464519221f73c728bf376bf0ee4e680da75e910f0f618b0a3c599f425f67acf2c31f6fdb95b38206ff8eab309ef755f3c2c31965131f290fa771851352125e7a795c08159c6dce4894d046aa1b6a2af7c19d8e8431c5ebf29997fcc22b7841d2039e5ea8c01195103574b2800ea16fd15388780eb1bfb2bb052062be6adf61884f043f871f9179681b40f2edfb9ae04d4f09fc1df56daf2a5c651f6c1655666822177b1f6c27b3a2bc5d5bb46476eac65e2be24e6095e162c138b6d46112c54c97c18cddd5069b836aadd18c1112eafc6ba8a044e07fec0b57f67cdcdd9cfa478890ddf61ac7b04c5abb47bb8525cdac4776185a100e74d6e95b92c1e8872adb07a329c9a7442f5ce4895dd1cfede15d6898a54b063d8d87274fe88b3149274b56f75f5f6bf5a6ca9999611bfb2e114742f96c52600b11a4a4491b09f046f5dd3a3e546f39d177f561aa35d884e49af9c0e2edf900849213edba22e252d5767ce0404f8bcc4f6c8d974214efd982463a94e769bc95ca00bdc88a5f62f5257e62f2f5f9f5d2faf8af85073b11a176cadae0c413e57cfdd23803405502679c8ce929c3fa88cdc3e0db896d470480b1cb1b4b47be284049fb79e04ed2d7396e927fd383716a55d6a9a1443fad25ae320a87ae51c06ff44a683636ef354d841ce451b79e8b5e896684c22ac6e54bbe6f73a01c8613cc80d52437bace8c0ff8b7576550ad2043223bf59fa7a000983d56c3a9eaa428b73e498832606a1cb8f3f7fc3825548527004fa224cd934c06a8d82ab3809418f8adaa2892395419acd0338386b6d1f99754625ce03630924dc74575cb37ea3b4151951fa9b6c1d3ae4bf689489fed48e86078b3827d37421ae1d146c4e9569bb0274419b72661c39b43376b9814ca79f2fa7b28ed9e04a3d498529413af3b51373c16d0ce9450d6b74137e12043045b530713d5106fabc45b8767b30c11ec4c51aa224aa6baaebd9950afe32c82ea597765fc020b567f681c7247275e748ef440dcc1c3463105d35b2ff94c83e1a73d2ce7d1fa0246bd20bbe58a97835d2830278bb9406767c80d8db5d849a0fa73d95e06636009b583e7a712e7627a64cfe5866efe2176890413af4637fa870f6340b501b0393a8c5e4a71c4e71f22a594f6eff9c74f26393e865cde5313fcb432bc99f000f1c1bc69b32aaa99c3fe0f1113f83ecd5a65915bc41db9799eb6b1b03d0fad3c6be77919ab232e9b6947d02ca6e3350f57b46f4d0068c0e319de44b7823b5cafc24385408f55a95057109fe411d2d77421af97c490198168677da6e59d8c469ec699bf93040b851a50d8f57923a2b36b25c5024b84f7225fd6a9c4c76f389dca07c64fc1987d8ced0694e106d58ebe39a001e471f1552b831b5f050da9dc19fb44171265e8f0e1696166579104b09bbd4ae41efde8ce8cf49f4f0a987f9120962c6123d25008387c6383b252b2d89435dc002017675f5efc51b486213c6608dc104da9ba66fb31cc044229fe9ac5b3db9efd0de219e511893b408d3798bb57215137641565d5ffd5095841b7a3ba6c4502fcea53910159284c2ff910612f2fdd2802d1441b242a0fab9d74a3fce6137ba649677933de48ab67d9ac2ccd62a31844db8db2016fe6753f2708e37237d8a9beb85c71e2d981327c33823a8d4207df0b0121a4c38badcc72f8f650ad8a3f1c964d61410a553c7fd5350e43063a438adfff5fc929b5e6e1d0215fb11cda94fd962a69645bfb0397f2dfd9c1a2267a56cf6c14234184b7365e5b880c9ee6fbd5f5e300502344afef7ff8add0203ca4c7e021f0901f5b79f2c99745496a16dffaf962d4bfe02aa3b4fbde7af311ada018384652168fea2579738ba3daec9a2a614fc1bc6bf633c5e4b5e9c4c29437885f927690cc55887aff87bfb58dfbe18f087a0d0789d4a454be9c37e733f6a39b1a14ddf0acc8c2d4c1db96b3a42511a01b3ab80dc2c50265493cbeab9534c8fd878902b7846b72cfb4434a63b67bc3ceba0ff42bb8c552572a560c04e9c8b76cbda952e23031faa0c39db5b158833d958451a9a6e320729f0b40c69dac259afac3ecfc852d05dc22c71425d543951a6f592337fa9c4d51b0306ecda6d23c7a6086fb5d96564dc0f717cac82b7679fda27bedb4d79c118f66cf64873e374023a55e29389186a0e1b8f64e5baa7f0894646129fe468ea9e0b39ca15be2343988e5a85344edd1fab58be7d8add79eb726a5d0544c836029d6374dbc85f93636cdd0fe783485e42d708c13344d208a9eb57a0a2bf368f9f1978efb3fd57501e5818debc2d3281d176a029379b0ef90b29adeeda8249654530ab16f489d43a6f8b04fca74d48d42d44752e2206c64e5185b3f8ef31667ab347b0f4908c8e963fe49d5cb246904ec6bdd574d016e0034701acc1c75c86c1c0435b9306473cf8a413794fb46840fa559adf12dcd7c3e09f86b7b17c912afeb705c395eddf457d125bc23d745674d3b7be5ba4ce3b9464b93095ca11bdc6a65e3e3470f2c834caf76ebb588c3fc654af43cfde26a0e0ff79626de3cd93f5f8f3ba5fc462c6a9928914ab0f2ba7ccd50d14d4e567e2e9b4e1e50f60c8151d11f962ec175609bab069b70f93b158618d416064138b4eae630bade7ca82bbbff0f54180b654ccde3528a950eb43bcd0cd30d5bc488fd5123ddb8b5dec0f395d73e67ea618a501f0a3d9a31d04332b92e9af355373c1913dd5a98013cf8f2637beff06462c9c5ccbec42e3237bdd7347374d9b3b16940be20ff8ca6119368087edb207bdcd6b00cd245d9447f9e92e19548e9fcf72ea2a8a6e1ecfce44af6864a9758b5eccae389e33e742f235ca10007ac79942f4cfd1e200320af1c6c6938516268d3823bb20f53b8a0282c6ef2d9a5dc3f0c9926685c3ec93d6a488a6de61b2b57271f7b05a997c20a87b080fdd8c8980c4e600c37845a4db55de43b023e646074816fb68e431660bdb72db70c661cee0888a9db65fe98b8a1d574b7950b5e9e51b24146007a2afb9a1a7c8352a10edd1fed170c93753848c0f70e708c21b552fbd9255ce646b2ea69e1fed9110a015633d987ca8fb6b99fec50402a5dc40d8a349a4800272867b9ae501fe9a94fcec2e7e86a209210d9bc2aab338720f9e28612ba1ecddd5cefb91c7dd5902f24937365028a879e11c17a227b2b38cbc6d2f79794ad52eab5d1a98ef13aaa3e22eab5db0c753e1ed856349e3a07ce6389722be9fb40077ecae38bc3b619617e61450d276646e5879c70c1d9ee90206960e470fe5da9fe925e8adb5672f3a7526665807f031d960c749d6cbc73a0ee040252e87ffaf36703e1bd29e1d540a824631f2418e7ffc8f7dd35c9327d0fe1373d08755ba1f290771fb65ea28bfa1d1ce24551743ea2f5f9e4f2aae934d870afae0dd1273bef0c2d6e85de10d9b59b601d7e3d0b1933de33ae204da73b335c366dc9b5188eeb059f7a5c6eb2228d41903c0859b0ead3d901868274fa4068e3c813d00033741ea73c915dc548822d584e368c0afb9c8fff7d4650ae2c2051dc60ee3eacb4e37afa2d870529cadb159d725835f05dcd2e56e16c2a14855a8ab285d8cc94af527e35605952cb29ed045ce53ce96d3012d2b87cb5dc9c5940688b2ca999417e43f13d350ccf33f13a8c24599a177032b13fb0a9828bef842959b645bb4be9843ce7bacfd24360f686807e329afd84902dcc15c93da620e0216276e80ad7e32891c526510d878fb53da51ef66f25e457e971c56158744e306d30ded17ba8cc9703f94bc2c663ca5456c99988df30cba8a9cee778d8051fa62589b34b0a5bfed80a7ac5e9f8b8067c0676581436a7046a87e95aa70532b8a9e64899a4a1d79d4598b914dad5df0276cbf5a0c0e6bf643dd2fb9ef53ea8e356417cbe71d05b1b81a51ae3ddb78995c1490f492ead7046b19c5fa0ce2c89175d9010c59bf2695a926bcf96ae79d347fbbb8319e9c2adb28752a6b9c1fcadad91d8d95b286b34326808aa6903dbd806fe6e7f1c1e899571b0bb4e22296cfd7412783b127b1c84d762e11ce0ff1d7a75752e198641454cba8d94192cda93586a6988c8ef74d97f6d083ff746376eaeb14ec5a1d6dda6ef4f261a08acc46032a2bf9b970e7aa8f6a6c4d7857d1fd2290477ee669400ed6f746a3e5572b849367d029632653ab6106db9fd2e639531b9e1098218a4f53473e2bb3d165b365b04f09cfcff0ca8b42ad7dbc66e93900b90020d984e76b5260a7658d0826120c8087850a135f7fe5fd8a30b2ae7b8c3d9fbcff4558b267097dc8eba576a2270ce990030638b75b7d462729830b5b57fa46638c6c00d6dcab8381c768a80131ec9b059b39beb66a77973a406c9339b06c4f376df92b49ef6904e741bbd04417a93b388909ab029f1c5db8a19525995b328138b99748ea71456e7a413241b33241d030ac8dd5d5c4014163707b1cd0e9bc5f1b25d7fbb7c3b7ccc80b57226f47da9cd3aa090ce9aed9b97c99f4b96b177130434f5f044b6c3c5a68bca0835bcf0b8df831fbb12c7e6b41f4dc96f61b6636cd2d67b4a5f804ff482464b9b244922654a29bf05cb05c2056384cf83cb4f3f94103246cb4b5d903f84b0582e44878a344992244992d5e52095e2a2bc4ea7d3898ad39f2845013eddcb896047740d85c169fcd3f79c565229a8405788ce7890f1adf0991b0aa3846bf6fa243ae6f35be130df666a2714bf82f37a2b5e892b89a6b1bfe4a7782856f0a753105bc4901fac7be61d03d608a5ba1d90130cc33014eade7befbda11008a6bcde542873280cc3300cebb1d1aaa27d62fed80fe5f90976a821b06359bcf7db7e58adddba17bb376443947da7c5d5c2d9b4f628ccab04d134bbd429ddb44dbb30f6bc1cba3f346ddab4bb5bebeead9b366ddaddadddebcffa4157b0caa7e3b615acf2e938ae082c8a6cbeb24c4921c6b53056f988e83be8de2c5f9cdb40a390f320366299ea609867bfee7eddb59b356a35ab59cd6a5ab679b125d42efd9ae6477d352d13d9bc5cd1ddb4e9fdffd13b2a84ebbaaed369752ff5bc9c413014baaeebba7c34cdd7ce78c576180dc57ea2e9780ff1835df5a0c0758566d14f7ea233a09675cd3753500582601af4e4613860f04070030e5f5ae6b305b5744c0aafe0eb743a9dacfd0f183a6763a6f9add6b71690795afe7c26d3667295b7bee5262c302569134d9224fdd60a0fa6be050c3de33770d3fb81ca0b5306372440cbf400402652355e04920973349fb80933796e3299a6699ae6bd366e4c9527582854ea89142567cf2a8a8a8b8a429521efba2e123c9dd05ff6b9f8d59b0f9a977edbe72821b0d85c847f9120830d5b506e830a19a03df4aa4fa1de7c93d237e99b660875a25028140a55832bad8ef58c45e061be011df33561cbd0ee017bae39d3ec206ce489f59145318e23a9ec1142ea9c929488d47154a94a6e855dacb550f073b57a900b374de747b221af72d2b1dddc60bfe1bad15123d040086b0e1e3a22d034ae23819e711e1ae673d7f9a85a6185518676e27ed241142fc2ebb9ab1fe4018badd27185d7573f198ce3388ee3385e570d1528a59229c584086aa754723a7215e148bc896badf59215c287b8f9f1136ec4061a7a16fb8b8ed263033e680002dbaf827e72afdb0e158197c475a7c6832ac0a107ff93826b16c130003d2a5da552a9542a595b23f4b182529369753b462514ef755d2c2ca15333b78897e4f2b067b25c696a0b1fa92762a75eb2104ff53cb8036aea181e5c3f2f91c254c634454d2693a99e40d44a92e5ebb85bb783cb5ade9ecea853601d554ca1d28131de386d0a3c23145b955facc0627ec9c2c6831d8e500a8ba1971a60f1caf0b2048b311c80d6af069a3d50433b096faeb986fb7da09d84f55bc15361d1eb3e22f067838733c24c099c4307f4491e29a295003f797af0d64b02f2b390b72b14c81b9ddc2852a6e83c89e61ee7799224499224795d35700f1126241126b2bbb3ceb22ccbb24c0a07ba6bc2e17b9b841d8e8cd20f94153e9ee79ea184a29b5ab2acd600411908d10297f375bde0fe8944958a2442d14d36b250c846e0ea50c500080eb836290cdb68e0b1ca5bfe1da41b6e735296d910bd6063ae80715374a4d48ea4b247888e3dd924b66489849fa91d59cdda56f762ec7939836028f494d2cb0bd15014fdf0421e0b13d833cbcb711f98a8cc510e904d896ad4ef420e908da734e2c9329090115594463c58f644e3687f9891bd241adb22ec108b72c933f2f7a8568764c707ed4841375c21e602cae1d9b1b292735cf2ca97b3925b720e4b9651bd3acda1147ace096b761790e6dcf6e9724e0ecf0e973ce3cb99915d3e1a38f728c725d3c026954fcce1f4c901d57da20dc78386f64da0472ea01ecd9872b30cd4061ad6cf0606b8645f0be8078519594dd33444f40c2dcb233a0b7a648950a435605d526849672e130df3f9f244d1636b60c78eb9453aa67e57eb6299acd0eebc35d99114beafd81213987e383f6c18586cf3e6871d473a8ee368473b86f5a654bec5c465cce639cebe8481c57e02e4ad00e28811977dd019f046017bc6403cb8669b5da39a96fd014a53f46819759a8d701f298fb68f86e71e61370f9af77bd22cc0f75e1f3548911162f5125493f07307de65027f7ed087b756268c18b65ae5ce977b2f4bafe15c86e3388ee39274ccbb736e39950e24e2bcc6008d002e947580451f3fa1180a49ce43d770dce751b4cce71b8ea4c1ef3e97a26368a87d5e96b4c440f9ef5d89810b748d972e43c3e5cf16f09a2d7fa6a169b416ab9de01a2e53eab8da0758995d1e1db76929cfeeffae95e3f8abf1d3e273d9e6bb5ce3931d3bfed4f87c3a6ed340b563ee83dc83e30a40d45a315b310b002af08cfdec9b409b66c8b699e301d05371aeab063686b5f6b2172e71e05e620232c4b2e7a74df3ee8e5d1d0e232b39fe23f41bc21a7a156ab889562d485ce9f02af40097452c671983720b9feeea64c0fc13b90e33500ee1e59f58f3f6ddf061be40349c7b98cf5912d8e66be19b45d1a783a11fccb24face177307c7819592982455178896c3c0c58233472411882e3382ee7cf4745c64ade01c8387ac99d5d724bd6998157be729917508f3619a097fc0179cba7e3e35df8cc92678058be1ef28887cbbef21a11b4cc679719f9472f2b36bfad805eb20c900a885f5436caadf4c8c572d957befa924701957000298c4acee7c301c85683114f96731875c7ccf8d1c67d7806b843140f057a84734b969157f2966f68596d2e777b6e9101bab7e5e215efa2c16081d24858ad3c2e832151ce9d8d037444e066078fea590574298c73ff29dd2772b350bc95c9dff01f7a8696a4a6e9c65155852af543dc756ef62cd2abddb19a200ca267e8fbd03768e5618817f40dc2a6f1ec45150d856ed131d46c9a6adaf19a9ac4445b49764c74a6a292784d6de2325d9324e19fa087a84dde888ac52f51533fd22fefada82615559b5cd7a97bc61d46afd174681ace344410f4d4343f6ed1338fe4838ca7919ec60424000441a01452f8f154d69e9aaaa8d1666c4ad3383d62ecf3c7d17fc450972601a24b744c915a83f0082a3c8d271dc6204174580149891105a110405c25741883a800054200319ec6244e2f40d2848d0ba66a661cb78e11bd70aaa083b516afb0788deb0842a967169ec01f09bc0061d82a40c2046038c2e03ab88ceb8c54e772d2785d1876eb652d86a9986853ead4bbbbbb3f4702ee8cfbc3cf0a8f7cd499d6ca82ec89946cb56a619c1287cef4c595d65aff71b390c2a2af2ed18d274ca9b121464bd42d9e26e76a85d918f4f0d0d3c3c3e8299c9e6ef5e0ac56ab9567c3f3562b4ddbc14385094f7cd05a6b075e7c20c1627e5a6b39841449962b2749cc23aa26282524e9799ee7d119aab3e309c93478244a0025144956b4472b27d414249df1d6553eab758d17293c57d4ac2a3ad3de2354499e4ca5195a928eab91349246d2485a95ab7255ae4ad34fd2248f409e48484574828c438a189d8c41c62145ac56abd5494de7399a3facc6d509c6d8349d3a72498ebc7704d8cb28f8ca66a8cea7d0353448cbd0d01d466ff452892c91259205631ae487d2905211a5911c499324c91a42a10c8436e083070d3d42a150284492a927caeb254ae45484f49ef968d7f38f86f9ac7d62163e97826635ab594dd334da1d734ba552e95dc1cab2fbddeef77341462095600123e89a175c4648d35c3d3c55ae3b991052a74898f530cc285f28c153e04678145fc251a46b4631cd9b8186f92c468f934422e517722691346d070f179c4a77777777f7aede1ca5949abc887690144c24f426ed0799fbf943b52ccbb22caf4b8b5ad6b2a2ce28b5274935ab939aaa4c52a9542a954aa572ee546aa351c4094a52a32fe2c4893412c1100b5f60b1969563a10a7cb5b004ae496a595b50026399c6f5ff6421dcd6a2ad90b5907a98cf57fb52a48ff42454288a42b196f553dfe2add042287eaafc944d7d2af5292f371312944ca3ebab9ed37c7d34bad68f8528b85d86e690f3c341f4aba74e0b267c7d622d3b500e38a168f30d34cc58ca06a7b0c32e7767013c8ee3986b78d5fa7d8afb5ec9c37cd674c01555cb0759080277e832b496652dcbb2ac652d65144192e5ca4912f388aa094a094692368796e18ed13e5c75d0198c1f80379017587452c454872ac791cb95640c2d43438004e1cffca030ef425ce603ed76bb9f9bf513310c046088816878ae76c7e7a6af78d4ef668a1b5409b502149193c934dda04c138599a6699aa679af8d1b53860e7ad5cda3c70668e8a6d775b917b829752170a61fcd1887563ce86ab55aad78d47aba529038d01ff61867173dd0a104477eb0d65a104c65daf54e5afeb30603b30985301b1d5c8a7a201f6d1c8805284001c228078866c5c84d9e032a48ce491afe7d3e2f290c0cf7f9690c8c41e1ccf12948be388d72806c4c588dfa5d28401023ee5df80ce47918c268bb3ee0365d7cb5b68f9447da47c39a2c86ad5adb9349a8ce94a73bdb7d9bdfb66ddbb6bcdda6792c14efed981c83f79d7b3d3f315a5a71ba7165813fbb3cc1a2ef34cd969f07fc7da287bfe5a7b67d94480fa639e557f48d2cfa86155e6891c2c165ada67d626bd9d5b0ec6adfaf5ce673876a012d4183bfa24318117eeba4a413cfb2e8e797bfdabe5c6ddfafb45c7e6bcbb9d5e556abdad0228b89f9b39853df2a0974bed9b42ca3f289f77e3e11e3eee33e31b75a1c07d6e898908d9b8ed9c1e3069cfaf9171f4c96144b88c565064b904abd7492f4141c71c4e98b68bef32e84e5092c9fd862884159348bfd84e513fb0cc72c7379cb2fb0e4cf083080ca27e3dcd2322d9fd8397896ccf26d94a394858585858525b3b8cc7099f1c98d9f252443c60aa8c683a18eb121dac183860771721e7427722ae2a907959832be33a2d66aabbd31cd9badffa7c09e6f9ae69fc98366c7d4d4fc0c5a86e6b57833090ad5738305169dc6cdd987606b6cd3b80adc0c30962fe87234b016b4125e1f17e13379f0632c0ec2cfbf45cba85208038b7ebeea513553b106d488f5390163d96607c9086db6f92b963021e2a6693eabd7da0e862bd3c00f7e06b984b7090f839d5074d62545665d4e9e60dfd9d1988096b33c03368388c27c773842e7953dcfbccec3bc83713ae974d2e9a4d349a7934e279d7daef499fdc8e4fb890f8f74b9bb63185823e482c4464130c46303363616134ada41d0dddd6ff0d07bf0114f8e0ffdeb4f131004c15a59250a957a2245c9d9b38aa2e2426b8cbff4b07bf66299a6699af61d0e2c7f56bbcc65b15bee99cacd8cf33a508f34500db31e7da77d8ecaa080b32f14ca26ca35bfd84d09bb37a29f348d4816ba41a15028146adb68183b1b60ac29d87996251d3a9aa63b555452809df4b913bf441be91bb507e572a6046dd206ba59f4f30ec1dd24539c43601d55879f5ace3e1a375aa641811e693466c83ce20c00b0e234d241013aa91110da8339caf2075a4223d9870348619ef6608eb6ac65d1f3c126fac66e6c422ba1c15f3dc10b25241fc10ea7ea4b4c4cd5a952a2a4c7799ed8799ee779de7b73aed06064b15aa723534c52be54e4c717c2627dba4fd77517cbaac0a2b35827d64a7edc7d3eb9eb3e9f87f38ae7173d29fd0cf9e17c92c56ab1582d91889e8e3a4f2ae564b59a8613f2319a46628d45cf9375b2ce2d735974161774c5e4c1a74d5c8687929e22ab7f1485d1314d2a53ca4404f53bf74fceea4c2c16cbc462b1582cd655a38edbaf149165fe2b58e5d371db0a56f9749c870516a909cb70b295560aadeeee6b93650765d9b5f9db319fafc96432994c9a76a2678f55e7b8accd19e833c34d7df4394ef843d163a1891e9f50f44e9c448e1a7ae17b87492c7a5ae81e9d494015de0cbc2d3cd149abf644777787e82a1402c19cdbfd5d6afb1158f4540a0473f6ae86e323cd5d9645279908d08d1e0b23984b8c48b14003dc581c0109967b7a1eb4f91b7d39b67d46ba8fcb9a566d1c908d38fbbcc44ce025f0767531d40bac7181dfc5d00fd21c4225a1b761437ed5cf895d951281205523b50245adb56bfb05fab073dc0812518c2320da1045463c9e37202ea8afcb36713a91669323aa22292eca9e7b3a7912272fc36ac7dd8ed3a8f0b8ae0b39bf3714047a825fd0a61c271dfcf9860ff866b7375eb361b96e9f13d1beee98eb52b400bb0ccb1758ee220446084ae8c6bca75396ed18adb5d65a8b596b2db6c1808a2a701676a1e88516eb70703178775805d8731294babf2021438c9aa6691a160aa5f22766cffb7080bb58a5a0ca543e1df7659fdb5d16168c3d2f6710bcda6adb6a846c885eb0710087459bedde2d9ceeacd2dddd38c0526ec011515102a8e85bd7759f8822c5eade7bfb2f765d1fe63baff3c511a81110059cb45062b4b9d0e2240fd2329f7750e94174538ecbbc7773c4eedbb13bf7ee6022d1cd329ed389349b1c5115497151f69c4e2b1b9b3055390cc36c9aa63ba92801b2d1d3eb7ef423d2ab4c0394427802cbf7c222a27f813c9d5ab4568e0a6b4dd3344dd334e94c2804821e78c19013312851a31c200ad0190269c4e3194808053838473c5a1645d67e8f553162cff1bd9c7212e6eeee5cb6a00fb492d0039eb9bc7508702f412215f61224ca5026ec25488ce193e4c665ff9c84611223b9ce45b6c8d8ba2772022c3ee9650042dba3cb2d1fa8613cbb69e24fc5cd2fecbedc315e2a7925f16710be8b5baed7855d6e5a1b1bebeeeeee9fb5d7755dd7957178c92e19072fcfc88fe401a4977170c92f198719d9cba4fd8e86e7195eb24b9ec1cb335e5cf2f5edf0f20cda61cfe4cd57758c0a26f6e5931be80554432b096dcf0f7cb8c16867809e04b9cc7814280c7bc44bf2c12dba00038a49924f3ec992f1019062b3eeee16ffaabb6d60791865fd70d68f1387fe1d8e6a2ba537887af402ce0f51005a851911dd116a02d0ea23882602167fa2a1070fd66a87b53f4c2c168bc5fa11b2f1e1a1564abfd5067cd46bafa555cb5b7655bb691976dd5aedadf6baf7da22863ce6ee8e5dcc8235b831fcffde7b5d49ca2ccbb2b274f7a157d7d5ba4a4f728328fa0676c3d6ec701922f80f2e0dbab0fb6291893c51c64cc6fa86a57d03cb9e9b66a84a7778749e0daf2357b0539e1efef59fcb4d5c64714583249779d702085307a1cfb235e2943c4cd96a95996e19966559869ab68347c912c4da16ceea455d6932f03ea30116166d1b823ddb8cd3575f7d5191c5b0ac0a1004310631884bd6087a4813d137b24c81f01f7c6479211c08acc9215d7f307a66253fdda125238b0f454616df0832726733686615460d819587fc900a9272313e2b327056c99fccb29245af594dcea8edf0b18a505dcb5a11f075752c2cdb2643fb8cc8f872808cbabc8525217564393b060c7c84f0b38a11c2cf1f28210dd2cfa23b40216475cc93a592e82caf94eabe3f39f102d327e7833db0582c168b755d66ad6fadbd027fbc2458ec966a478808870b85df753c5b48bbce092c86b4f0e66f5c81b3f01ec1622806ec490cfebd3871d3c239b55aad560b27f582eeae5d5b2ab5f4a2f4ba905094124a92a5cd46391b6b6da8c03603010720ec254a9284b69b408f74ae6cb3d8ad1728e0ed72047001fe2e5aa1a396ece0e43d95dba8a0ff1f23def702fc9f93f02181c56ed510a769bc898ea9a23405141d128ca309383bea055224a2244992f43728176bca759ef8576e93fa5c8434112962e3505e08bd2e6e09ced12a702a7c65d246d3b4ce33d6c960f34b16d8412fa105d56e0277dd6bad09ca186a6e7930ec0e077e50088c57f0bc9bb13cc3fdb04c02338e89c88ba05bad6e75abd53af2048f154eeb3ccfd3da8eb91e93acadd553700267d75ed9fd687099bf9db59496e06cb55aad160e86854129a553f0f6ff5448ad6507b81a241403096fadfd2ec77605c6e1f770db82f3dcaec09e4bdcc39bf252447e9ee779f6b8ae2c0aa6b5d65a6badb5ed3838f7629c7316e1d0999c5bb9955bb9955bb975b3ad954195123aa71c209c12e48887cb40424490608d78b454a9d4342dd664537466465e59242bdb4412d65e3bd6644ba59bada6597b5df6ba2856b14aaf6bdbecc57da41691eb889ea12814132a1e1b2459b52c8acedc286090c242c5c406255bea9824d7674976b4452c59b2da05f9fdecc97e3ee29456ddaa944e415114652d2a8bac9106515e439f582788405116c5836dc1684b2b9bea9826e7ca96e8ca96ac2dd9922dd9922dd91286995e13ce28986952cfaf188f42dd7b31db11d1fd4cf4f32c014785f0ff47f03c8ce1192108660e1411423734b4dc619685e84cf9284eb4ccbce9cb0b9ffda8042e3b5ce9900000000001c31500001808088442a17048342295b7b23b14000d537442825e3e1b4a849124c9d114a30c328621028801408000c150892c2ddcd8ab999bd4543d9452a28be475855e6441efdf869a9c7eed04c8b24feead4d784bb5e98b0eb34645472f2c0aa6a5cb1e45c9525fbb94b0cb7f78143c9c394150da8d0fb07dd83214b014cbdbc732b77ac29132d9d931009fcd1a086ecfd58179be1a213dc83a3c45775a5bed482df17138484987626691f016730dcdd1047c6aaf9a6b54421a328c5e79562cbae5dd98150d7d18fea05a2d2282bd9da99e3b53515262afbb684310daadc2e33b5bc08160d9c1027a6e280a71d70e120f70c43c48f97d58de2761878cdd226f85980c9a9e93cd6f7ac287d8fa75c023f002e713c5b76ffd48b5ffd85062a200daaaf1e0711042b3a8126bc2c5640cf13778af074eaa29f81fd4e241a49165a50e9f539d751e5c906d684d935cf592db0d35020ed627c712ad834431c04ac64a13f7a72aebb6809974d250527c7c41f7f427597b5cab489f7c2631f34e88cf3ae4f42baf87af76ece5576c5bf0b49233e4484a6fcbc4d814942b2a9c99f313cd00d97a5482901a68aba5dcd569425b9da6c8512bda8a04f531448d64143806f621a0b7ea653ebb21fd1296bf63551cb58412662de6bc64232558eab703222b9166339d28217a538498d8c55f451fd8d1af76ed151e5d86b2ff932ffe56c4c59b4e0610aa12840804debdf5af4577aec948eb8fa239b7f47fc6f92f4f9f5753b41d7a0a1d653f6c4625c01e609eb15af69727ed58b9a14b2cf2b0ef42e4cfc1312b79cc6a86359867f18b96bee4cca441a7ba31888c4c3ca6784cd22a999a54e6700f6238f43715d7c03c7c9345e2eda3e80047325f9ecb2c8e083dc48427a206966e39142e75cc1cc5a3263331e9ca51639ae5996b82cc04e58f19ea44f3245cccf0ed4bf25b31ba3103ad980316cb264fe8bcc08934ceac860f64eefba4d5969aa5c18c1d7948e8424d9199def6ab0d9a1152cc7d11fc038e70364293e7f79e80d20d7d2f823710d1549f325459250e8157debd11b931e82c9662e4fd850176a1b6be3b6c7d3bdd29ac108fd47ef07dbf639aa9fb076792061d28b6dd82aa88d417f2c7bfd63498e3a1a9818731ccbb2b967def42f8bdac8fdd6c19703c113ab6ce9e2e2236205166a3a77f4f01d4239b635650920adc89154b0d635a23c631fe10436de96ce08af2ca3065bfa1789a704e79d6c8cde9cd1a1923d65fa01e373bf629356c1448bb36329877ad885d023c5b4dcac57a10659764699d3e2f7c2c3b128553b6913ac4f039d903de3a342227c0212916db8893c904313ff3b5a92336f6b21242afb37af5c72bfe908db124646186a3fb597694b6930f12dff4a139fbeebd09a57638f42aa3d5c33258f8565a29fa0915866561aa8e2da28c3761ad2884407cef8e13bbf490ecd17d5fb1be6bb9366b8fcf79418540bb930dae190e431c90dc9d81a97ff9f5328331a95eef4b243f6efc1e13c8af4d453ac47c1cad32f35a98afbdb4f5303d54434b73a45991f9ea0be154d7fe48a9634fc5f5104fba3e8209aa723ade8f9ca96ca9c2bb4515f1128312160e910cb9249ee7b93b105d91834d27c25afd9ec80ca7d056b381a4309e6d30d258f92cf6059eefefa98d76324424840a08b839113193246ca59d296b6819e6765a3480dd053fa0bfa54a876a85bb1bbe512c7c105c9499d51b7c7bffb46680060d06dfc18a9dd4b735a6366b41a07c84124ea9415ba8dbfc6fd31553f857b0423e67d215f3b52a113bf8348f4c407199978f5ceb1a625dfbbd65e570d5485b6eaf5a58597b2103a2b9092ac094289327835c09a18acdb282964aad6e6e65be42ab39e767c9349b9fc89f96a4599b857c6ccb6f70d3b8f260017f8b9bc50ffaaaf705bec76082e2d52cf42ce46832193772ed946c0d51f87d935ec9517a2a1dd450760926bd0cf24167426b79cab2e456a44583a3a89de85bada3cb5f48f567504b26db24e66c26e00e01529e90cb19c29375688e776d1f7397e4739dbe1ca563ad4db46de9be29db682dc5068e5d8b1f1c944094d5fbfc52d08e9886a38b2983efb848a4ba6dd9e4ab1a3c6b5bbb713cc4bb07a21f13f378c9546447b40b9d5c3764295d85368a96637e3cab8bdab6fbe0f8bec7eda54bc205bc2d75953d535cf8a21d3b812a47eb8c76f51bfea362c45f6c87640d79d2bdbe392530fd0d22233d802a058b8040a129f1b7f229457e0ed2aee6a385afdf7cb0fe457e1d320bb0a90068c6b9f39cddd8cb0c7740ce68d61e094cd3358ed99fd5293a661d13250147381caf90ac58f5bb87ef6cbb67aab2e7156537593eab8f1db81a2d33f5d87d3d1046075ac7858f336c9e4f54b03065585d57298ea3d6a206b5db8de10eaf2ea6159684182c1bd447c407aa4024149f67dc69612c511fe0413d63cafbe347419a88e88922a901567780a0174a07ed577dd760886414ad95eab06d2f1b01adc55728ba22793c45c155e69bd6a40fdec8068107cb9e9e97518ffaec2545a5c3074c384f3bf7e14c80a691c69f272ff146ad861432a21a8cda43a420e1f26bd1357e29e1bd50630cda39d6c6d58ae035c4ad6120430a39c3d2d08b882463e094073fab43fb2905a94cf4a50e6eca31c4b0493857b59174a84afff3f07af2e9371857c2c53c523a93d180eb59cfc3e1b56f35a5ae0e377840be332dcf11f26041cd29ca979a20e84c27b2ed612a9d4bc3f00f5c4fdd6e8fd801bfa3c0ebf2f7e28c4f406a5f472558a880c2568dc266fe86f51c9b9e22e62df55e1b0ed003f5ab3533641e6f0d7842bd1b0776a6cdd7d63b21185e4f96ef84ccff8611ee89aca01daff09e941101c89de345514507acf9635494e88e928b08ee93bd14951b00416b84d0eb61b10c1d2f73087724c45d8cdb374b85bb35c2dc3fecd85a230860b1093419bfd64dbf293284571adfb27bf951c70ac945e9a5f6b54e7917e025f16b1204595ea3fedae44f196ee001af608028511be53e9f613e9c844dda4741ef94333cdbef91f0f16ba810baa132ae82c70597166c28dcfe3f0d9f3bc01f78f62ea20a0d6358d00e15e32783a88277903fd06f672cfbd3acecf5d7f29bab88ea85b3498e12827d984e489f360583fbdaaecfa6a6714aa7d21c8f23334f281ba678af6733400fe9d11e5e25d0d1ad1497716a3587a749076624f81178015bf47cf0106e6818b828ba65a2a287ab12398b605e17f4e97576db31c709d88e8a5585b6a1bb512e628e73731fa8d754677cf6ccd9e9950874337f880ad364826df075a46ee444ec74cea06b678132e273041644d8966a8f6368390a121b8528966239f2ec58e798a9fa2b0a8b5e04d9488fce37bce285e27b803237a5c45d382ffafbb3a0be967a2b126917e219cb090a06de48a5adfd84f623b681742e860197dabc1f004109972f51651c495bb32c0c4a9b93eb99a331cfe8cfdcd4df2eb753ba9c34715886ea2f07814b2a7e633e0bf1fd49e6585e0e07e68dfd1051ac0d928acc8a21dfc91331f8472792227d6d9102c800f8f1fa35dacf9cf3a57122b5ccfb86489c049f2c6d27908adbdc1d3aaa36f1d4157d311ff0003f7c2baa78e4f4864161eef5ca101c97eee9caebae37532cbc6b034f320ee1780e3c626cab2df674bc978ddeb801cf5232133ff18bd52044ccd9ff0912177a1cb610924c1ba15a2d31a35b428223c89d55a2227e2dbcc2afe5c4f835d8e658dd92403a8730d87b9f851d70f8a6668efb1aa091b3ae5b9cb75b99173432730ce5e2e6ed66c972bd3085200b8bcfc257aa77cc964f483df88c311b89b2d19606fa6dc3b7953ecfdca90afcb81924870dfba42edeabda6b7898530583e060c6f27164cb67b094a2e3f60838c84afd8e95a5af628822719b919b1f0eca7a68046ae16bc17940aba218da2401ef4ae03d0ccd018e2808d15a6b5a0718b24e6d4014e303f3826ced880eff2f206ebfbaabfaf8588c3c2e623f2f51bf1cea41e7e4c7a13974921a5f42b346b01759346773c6e704e313999fc3e198dabd2bfc8935e5307991f1253156dc2a2c9c516f3b0d8e8871bac88740b3f477356c2160cdfa29863121b5d6dcb917415dd70bf50691224a16809f09b104b0ffaa0e0652c28484274c198be2d0e36a948f873f36c03133caf074bab48916619934d17319b20367ace9ced6e2505ceee5aacaba9241ac2fa4d5a228ce9a7192fa2b7b2de3581f858b11ee84746dc640b9d31403ccbc34194c1d59d2360cd937da21bf0e4267503cdb2e8872c9554f209116b6c60c7d0b15f0e2c2f854088734cf646a874709f241d82ca9c0e6c1ec9d90be5d7cfba4761d64520719a94ead7fed8f17e085c0dd17115862d334067be0b9b8e4242daf953f16b8c9cf1108a940b2788d7138ce0e281b20a4353b231744df56a1cb8c97af32eece387a3340096528af1d160b6bc4d2a1354adc74e520ccf3cac1841c0662c122b12ae26ace04351ca9657dffd66dbc59bc0434e5e4ea63b1a0a49fc7bc3034b8c780fe46a50c7f8c90dd1794df8c3233b61750f470c31005a899268ac887146ad8c11e16df532592c70cab5459eb768ac26a80808ad4d0e3711c2acfdb21a80982b5ee83354b2846450aa51cf16c798327094c5ffa98a28266571992ee3929c06432fe51fa14ef291452e77c8c32e18de83a195d1cedcb151281454849890fb730ab7642ea139bcd3c9a329a11fc002aef36f923ecb0c664112d8a557dfda6eb513d98fb5b6e2254d1364a788197055c422ca8fc1fc917d038c170dd88d7a7bd2d9a1909e1dff0695f854635fc37cf9f03a066a6f8674b48ec80253b1b33eee4cdbc32e8cf5c7663b06942f0103495ef4181f79c00b83240b5d7fb635d31a19db5ad1533d78ad5eb7f5031e779ffbfd13b46aa49088b8004b6d7ae3a15b8644931ba55e535998fc83cc252b1d1ae62eb713e6f94c492a2d9fd6103a2b9d77e78fa7588ca6c6b4c91b26a3ec974954fcdbd4d362ec644b2bd68a7bd4ac95343f73d898f26ee3c1c358fa5bc574b24ba47094304be79cb4da72e345b8f33678a04129f6652e3971ff22047e77706ed21b38e44113a1f8a347582dbc64bc4dcdab25067118a38c438ed952a323a9f83a3c375d5c5d75544f0432c7d416fa6d0919403ca69756272566d0fe9052e013dbc2b5287add033ac768518eeeadcb7faf3ec4b9abeb7538e2b836f5530a2fe436a1314ba486c41bbebebc2fe6ac95e0f6d7e9ad1065c1793100f255eafbc923186230c96ba9f2afe0f8555935a54a542bc54c457755002bd6c969ae0006003a0f2b73782b98681d45941b3c5d1f512126f253e1a1a03f249e0a9b59d8c169ba8ce5caf66cb16c74fec5e74c46097c3baf86302acaf298b6434926e9d337b30e5247364e981e2250fc4d6f2a4e5af3a59ebc51bd6382e86f35831ad7ca7ba4b6a95c1cfe746325ab5569f2561fe53156622ebf91d08a3c377fb6425bd6b710613937c0436c4ec796cc1c23c032cb9fd4d8ceaf6122abc18169e34e098331872e81a7caddb273a6af965b56efa1bed756313a8f8ee8647f24909599c4a2196542a0f96685b840e6daf1848b4b1fd9393409d76229d402340a325f6b1ce00297cc4680b79fbdad7c8bbd341cae7c95b92c1024ec2eb6f4976f669099f0a4177828589554a1e6dc8d9f47b9164aff79661a1e11fdd1e310d2933b224bb08ff5a86250b04c7f6653a0ab6ac9b1e93b9fea3ed7b3ac9c76112fc240ca3b78319fc140efdf24770d3f4306d6a33b1a49bba76db61c478be52fa4cf948fc51a6a587b9a27288a5ce44d857c3f047db005c13235bb79019d1fc894db43914083c9c90a2cbe950491fc22a5fee2805ca40da169e83fc1e6b82f5e459abb1dd35e1d6600c3b4d00f973c77325b9405b270ff2f55ebf047aacd26df7c2139698ec5bebb31c9037c183f299d70e35e8340072f4256dfa56d93a14b9c851f40e9b94b89790533a4a808beae3c3b83d08d105656073183c34f863b8f48768bebe057e55cb5be67a04f0e2d7ea5a99725de18ccb1477a74fc87ccba2915a16a593d49cc52687254b5ada3b15f61f9cb721bf1cf4bad678c2cc2b343893f9f0cdfb6566b0a14623f601185b809f957855b7a6f7a6a6544aa9456d3e85da043b47521f0b60e7505b0c335a73b5fe20d9301c668a083dcc442d65dedcd77386ef481be2c844d4ae8cda706627c9598a6854c3c77a6e04647e320dd7e887a1b8466f188c363fc31f9fc94170fe55b210d6b80741c1fc746c954dd99d836399066470e0fd938428a7e1780e1f4be40426d1f529d7626584d6934be930bb74393fe6801716ea34919cd327c5849e2da71ee143b1b134cfbf12ba1cb60ad5a49a9d80e72c4de474537bb21d27e0612532e872e90de18a426b08ead20b64bb0086325754a02e74b95cb9a45dba963f10b630d5a15a6e4c09581100aa30b33093c4098fa8214362fb676e06ea4cff1310b4d694b05b760519e5570fb1e522ff088cd2aa1cb3731797f6df1503a4bc0a7857f9086747f6de797278dc203b5f463c6b8133217dde9d1fa50e6cb98ae2b6902e727512fa332c0735b6dcefb3e6144c3756e2c69835c79b29fc05a15140271d86d973cbbd5005eaee72d9724048ca0b05bf6839488fa1e5002d715a943d2820a65f1a58e2352b55fb99f9b5f4e492a12e4c3b0ba06648350b0f240e0ac455abecb750644ec9064f7ce55073192d2ece691d217c3507705d6c7c61524719e9ca3222f1b8475912e4ee159ceb3b798abe032330945a539458135c6ab713e67c7184f0260702683d2a8e4c0b13ec223d61b9bd01823603a25724e2d174eb60681b8bde11de521de241c8dff470f782bf55abf5128ee0d3902cb002c74c5cae10e76271d6d81fd0475ecf48e551628ac9485143393589e85878c1374c6f24e2247285330b599a56670381222b54e57d3c1f38eb00e8dbe5e7046f808477978bf0ada4a7bb7be62b1c9aae02bb7934731c3be8c964805f3287b46a2ee216e66d914b916b130d063616a6eb1fa44d004bdabbe70860859c9675f89fd5978a6a7d601a8a0c6c1fae93419903aa3839e24ed43ecd44a80df420364e7ebe333a295f95328ae6f9a3fcd908345ad595069bd72be9058b281f33e45bf519c5f1714fd39b82e473a66ae4098982c6b7cbbfb7b30d949e94624affc426e449b924d16cb8827a640bc76e18b170fa8cb6548eba488d5fcd4de90ebf8437427ecb2906e65b061d303a29e66dc3fb44902e69ab1836a86207e35841309926d3dcf3a3e6b5908c1f1521f4fb9c34bcdc203d796a8b0be8a385b92addd0a36b247beeb210c0eb8ebc2f48770fd299055864fcc5fed0f37d0b0c8992b6c29d2c3af021779503ed1aa89ed2c3095c43e2860e50491439c463b290a7138035f51df94be4576dfed226544362c6aba12f8b37837952208bb260300e83525abbcba683344af6f7c164c19a472ebe85f68c54264fa30114a9f12395e88ef9966dd6f0ab5d1d3bfea1e8f8e36196769a885f841a27980dd7f47c0ccadf58434f82ca748728cb91a525f466290c34993462d9a71e7a47f0e5bc3b2303be19588d96e1b89b8ce24a114da4334ece8466647034c093855ac8539f141cfd72e89a0de523cd72f2cc65bc1ce9997dcb7291c4424ac7c4e6c2e1a5982d36c6279fc3cf437dd149b5971db863aa414fcd673c84b159828a1e9fc66412c90a70036c181425d6697b84515b11df40700f9d857f1026f711c71ee06e94e86c476ce1cc6cd1b81cb8c69ff05a416933e06d6d3cd18761cee8060dac5cbdde9d9f067b4d622f39e8d3f4c221f343f8c1ecaf2c6d5b9287ce4dd85e43a99148aadbcba7ad20fcbca2908c27a0742b821aa2fa84ba5df63795b17ab7a7598b87fb9b728bac19576f6d9a940b44b964924d82e765fa33ad33924e0db10393f5c19985a36f3c0faa42717072f9e2d9a34e048004167c9dd0ed4f679cc12158d91466e08be8b694994c934acd82e7d452a9cc2b4408b084341a74443863cb6713d2d378627414eeac776fbb3cd793d76ab71abfefdfca86eda324276ce779afd6bb02eb8a6a8f232c0452273f73bad5729877460ebdf9a663ccc4f27e7f559375d252d37a0519b1fff036b77863480d83f0a2b529506d045422c94951b18b221a269be1d92846dc607d0da70589fcbe88f9785c6e60c62f37a940f889d7875266054b07a596cab30915957ea5f201e44ac5595279d2cc7e1565572481f395b24b2bb880e722e3d738a166a4f213a06ba7dd128e1580a5893eab2614b3fbf6d6db963071358cd20bb2547aadf04537d228fc6d1a72baaf4ec38c905c04a770f0b236433df01584455731321862ca75d60ee4b5fd7f5ac9ed4380ac7d113bfda8f65de0d5918109bcf810a3b401340879b4f4e9571b2f5c1c9fb1a71fec99ee75747f6b6efe9a9460c001ecdd2a5ea819ac85a6e5dd8886937de53d55d81ee982bb5d682b3c0e921d8ddc94d7122499950407d112d03d8c9310e6cb3f58e7d31a90e47a6d7a729fbc425871ab26da749446f36b70c8838088a34c3dbf02748996daf5b45adcf85e57a88049c85b9e71f2147ca5dc3a8d2e6a1f84b68bea956fa149ecbd97b822d50913f41f6902d4c58823d9e3ffd03a911d04ea493690bd0d4065028fddd9c3088edd487b5887f8588cbf8b70d88a160cb90aa62536b6334c5dc5001b3e4485dfd4b8de407b1537299bcf6c36492d7b03762e3122d59d2fa0a610e8d4067a0bcb816417b52b34ef41807b65fbe7545ad51f11a82b4a395f498bd87b90915b19d7e1ecba217de937d3f68f85b0e23ca03438a623811b25505499286c3d6bce49b3bb4fc701d5f45d9cbe229b17ec6b901214eea6c5bc2b28e8695a111e9c8e25360b9dd536b29193ee9683ec8101c3d02276b85d7bedc25022a0ee8a5feebe209e568e868b66ab75febe44352b82e8b6155517c89c4442f265a25c38466a0fcba093ca29c4779b4a8886083a39ce39c6d6c836476ca3d497a43c7fc9621e5eee377f5b295b9aa40c0592f460388ba129eb18683a861b447f8085f42df80a4e58f068ed7df32af9078671d953e839581a456cca4d034aa923db9bd42b0723c46198a237c0d18cd6a6481e08edab6fa438b4743cb2474486e4b8035ad6fcc4530c03068da1c04d62c472b823f2f11d7a5e6007c84b2a93c9699e6696c29ae5d0a4937b17d0f4344053f481183087c2bab8fdc5b87fa62873cd53811d911e598ef194408376707b8946030aaf60689f790ee014b8de67dee1ddccfd149e469a9644a4a996b2f8a7a8d8ac4437209bc8df37ecf054c9fdcf2eb5c7cf87d2e477a9a540286e6d821e898f2ff22d5bf63bdf879db340f9dab9ddcf984a0d53f1bdae520ce76cbd19d5efcdf1ed36dfc1259aa6c202494bc4e02f60db1e8cac542162ad04efc1b77b4db45a73604514e3519e65224ac4ca4fcc4156680bc0a7804ba455c8f673070a4c3fe00b02d5ebf47598a635a18099c18da48e3c5fea6421b6711e9d211b437ac2ad60ada11d3968a7e729f6850e60a06c13cf2db1d17cbb4ffe5905a41f877bf454a24909238447cb2ff6f60497aec953c884b35fa82c4496896c765fecfce8a2e94f8d4fa7160d356a1538a0d87e80538f9f0185c38342c8e0b5a7553432ef4185b06dbde434887f6b2f9dee6d0e8bc59a458d226ed979d86a342b2b331133b72d4e89dcc152da2a6952ca3f67ca0b678d34b77dfca91654d5b45e3177b9f2888c8760ad99e99bf2a21a05dec8a82e574b1cb8aec136f8d9c58e1d921cbed385fd5ca04cd98b20440415916e30f2d38c211a2d4bb96e82191f7085c495f65fc599f30628ed0426078bb8fc2a81eb485213d6b9b8e3ef5ebe8d3dd2d2575a11597e50e26f7d32a4c50a9fc762a95f55d07b189f4039af12e4f3afb5d1bf642568007b70d96e9e93433b306dbf826f8340fe257444366729197fca98c1422e64943d46fa4f36db1e819c3096b59e9b24ac4e0e4940943f6599fabeefebdc6d14eb9165edb05f330ac5b6c0e27d17fa953c96a2fe53908b8d88c4cf76a18a8fac1641b9172768f611a7d3c904c7d0dd0a0f7f732dcf78983d1f7debefca4b0695f1c3955a3ea6bd61561a01286eaa89249ce4329ddcdb6bc11835d5b09b4072d14d2b1f75addb4a908b39fc3ba179c6c23d89688d4a374e8fc4a44bd846400cd0e57fe0ac52c3da024e82b94c3cdb084685e028256418cd8d57430617c9c14884bf877dd871c74ae9498bcbfb9173d38722f84602a18575e2f4185f5bdf44c44ae305019471ea44061d52c08564f9259d3d73d328a636ebe6132ccb7e8d6b6841c1aa00c93f177c4a270b52e3579bacb8c37d4badaaabfaa7758afdc594a2d09cdc02f66d89f03c780e3a001b8847aaa2831d97c6cffdefaff8eecde42659dce336870af544a12a0b1d58af12e5886ea048a275e4a25cc01c98d8b66f2fa2b5c774aa18528259788466897d323c54ad109d97f05763c8e2e1c2ccb7bf7fc0ce200cf596c6b8e28ba55666e0eab2e3fdfb6d5ad00dbd1ea6773fc56cea76d806a02ee0d8cdb632039137e56347d69e18b46715a5f4809f6200ebeeb8dff6f6838acfeb260657f58ecc0e0c5e6a6884bba4126c68485ba31f37343ac04e89e863c893f129f3e92a14acb844976f6175c01472b24c56d270116c7a72306c070b99b18822656006d40253b1a7428fc5b990b717c568bd05cc7b11f1c13b9c2907ce224bd32ec89aa9c891999dd2526d9addf0734c78465186b42accea6778b5f06dbc507b27886c515172a13e991a915e7c7f95d181b30d20a864f7b7c3d8614c6dda8e1475be097025355c8a49d671d9b46723200eb0a9658b803676ffd2d575841afd2336ebfc1f53ef211d4043bcb34fe88c06aa0c446706b8b3b2283671eb71f9568e39e1215ff4372088d534564fd3322fd25554710dc387b47f44bc4fab8e1b6c707e9980d9ff268ea72f0e2afb2f0bb70090cd1b0c94b3d61031d64e7d23110b6a846b26cec0b5560eba1d02c03e54320f19aecf6aac4aac952585b8601800acb40271a67fe84c7c317b3214d8ab36dc2728a8135a780278e48de7475467bb39e9b7343ec8f8d08ae9532e8800400c6089778d57e0a12a7cacd0a7dc5b5f880e7854073ff2109118c9dc04445ac2f0e7ff78b4a559008c6ee1b841a88c8d906b00ee5acf97466ec723495241af1ecaa9fe5b87a7427bb9356bf05137f80345092d3fc339b623a826e6d2f28213c83dd1b95032fe22bc7f2687b2c88380ac3ec67ef491b7dc6013b1ed877371b72028ab0a506ee4d36250438335c1f7f3cef52435f7f7ec7495431a1644f5863e4d1a4250d60aa2b5536cfaf7de04c51abd4de05ab98d7869d64df4242174ccda7d22ac7322379e4d19305697244e5124495030241406573cd425cc4ee9bd4d57c033f277ffaae35fa1096f3d96e4eaf36dd302bbcb80f64ea5c4a7978dcb8de06b1824c9cef5a7c72d741f6609c0c572b2a65953f24f71cd42bfc7d29a019767b7b5885e1485bc31a8ae30148020032cf944c79cfd3b100d76ff7c99ad6641b161f3432ca1d70c5db91064f52f86f977e71b5b5f489167e5ec635081fe9584180a5dd21855e35b95e53ad4f8d6b372ab4a9a39a6abfa482a2d19256d5f63b837c4f3188bad3785f4514d00a699850f37fcf53708d2a0c06915286d87adf1f5bf8d355063c7d605860e73e537f15f4806dc6bc08d1093b77a6025beb459624ed64e539ed31e95e8ca5ca440c5c5193455a43012b7885cad713249cb47ce2846c0283a0c490e6880c57beaeecdd5103e99851790f4011afa5f325e235877a5a0bfa96d38f535810f688019782d41a36f358e4265466a0468721eecd40f8193352c4f6aa20432475984255634430b6663022534997844970e1ef01bc69f4f63f2814369d2f745cd6dbb6089657f6eec3d081850cd36827b73b8fc911951ad2b761d81dad57462aedb1102365ad864f5b7559b924e0c086b05d425cf2bf8d36d99cb56add289899f8a7153e27c6a266128fbb88abbb8ee24c4f8f455645177cb1c9fafb5a549f95cfe69970c3f9771e732adce75ec10b16acb8b716e0f22481889b92b846525942a72ba408a11c751b59aa81c7504123e09a4162c554dfc0911ba01c62e4434b542c78fbc35f576520ec9d2115e4e4d5a7369eb72326276a29a5856c96ce2a86635025b70f0ae0d84f92d5a8442bd4d8c797b71d9f2df80ec33f2f8f36823d38a39bf37b77ad434e09704aab409291dfda2a8c01775820ab32aa38020b453c68d7bf2b9dca0401d51182d56bae2b78bfb411ec771ef526ed0323de1777690c47c9a20566f74d9e86f03b33a4613e80c45f1e0c341fa127e0e68d36d3a2846c5b4e944a2da195f784658acea1e9134be42dbea2206f4555bf142020aa876930b272764283095da7fe21ff07c27489516d9dd280c12ab7184c3c55df743977c669580e6703b0f98bf269730b4036ffd27bb32df59e6c8f996f539c046f880a99f85b2602917da7059fe718875de643ffce75a9400f7363574b9cbd3223d7d718cb7d2ec3f3e9fd3582dc4180ea186ede1831c07fe295a4c5288239fbae18ed1d11deab78d40c1217e6bb663fb742dbfd620eb36950a025045a1296f1c8cc58d69f6e99aa882101be12048017edc87860a4a9e53dfab05ab783ae6ea58b237d364f0e1e9c5871484c94ec394d6cbf4da1d54ddf72c08ddfb9f4f0ff393c5ad830534777bb1d4f4cde55f3659a8837f459e5d729ae3184105352b3e69d8fe44131ce64e0cec3808685f7ac4fcd40684646025b97caefd5464f295e8f4e682a74202773e3b15dc9c2cd7eee918a94fc7c454ec9b789291769d0d32ead9070df8284ecf81f0cf91b56f2e79871bb100839c550e1cae97a346dd6c62afdf4edd7e810bd910e48f717c159f6765a5bd2f3d601cf63427009544f0fa6abed4c316d45f10e50afdd501d33afa9e105a6e4a01e5d6c9dcdf274e015b7f9f008a259974f18b9e4d54aab50c16ad33831590e00c96f9d6af6e3c016f14a652b44a327787dbe7d3ac986e84da957cb4aff994b940a922e81ba2eac0b8f4be962e3ba8d554dff58e8b897ec40d0c8f4a680cb11a228bf3105e32617b096bf67b319b64cac1d4c2f74445371329a21c6d403f65529de61419a800c9b0247fcd3cd8f96dbbdcafd730657e651519359cc2bb5b08d98f819158ca983629e2239cc82d13e46631162cfbe46262b1c7dada16f2c36d9b0c520ba9059e92a496226f9736c94c39d266c98530f51b2ae9cc0f3a633011e2d730a6a22563b272306dc398d5e52ac580310883bb690595d3957542b4ed3a711dd780585f5982df60fa42d3aece90db5fadd375f12e988d65ee80b90083614da7298a8bc39ff1d9d918a65f16ddfe890ee74db420f8964ac240c120e59d942b0eff6f9271b56b23cba943efd4d439fc41da041294b8f263f3ecfc14298cce3b6b22fc6365067143721287443c2b33ecc42ac551b30a3f5f00a75410a94698a6f9a87829e8de2d9c6b2564e118ada4c223d8f44b0cbf3f934942d02a4d4d0511a99c530618cf69b5c9359f826644addd9270d0675e06fc5d1ec8bc2e480762caf181a47ab0dc13a95462d5cfb93c3150bce59c9231b7ed5034e647ef9d4b21b960d0d6a898bc528551ce0fc3a027ffbc48bb6de3167f2a0a4e9b34498774b8f03c032f46591f1e5b8e8900d1bc41b404b1b756afce3c3136dfda82d4cc1a5cd7b319a2b314c33790d4b9ac47c22083743da1428b803910891909bc200536fc5ce2b45df325e0facb0864356634716975bbaa784408a06219900948d87d54e7208ae128e29792e4ea8fd560097330308a7e8ef08225629fd84ca6f0a92e96c2178e5184aba21dcf7669ea49a2722e93145ea34e90816ca4306fbc759641a882854e50d0a4173a06cb1d40bbb4af82e278933a5030d220bbb944100b3824a05507ad6dae71861c8d38cd42d68c62c7ec37be50611861950bf32661865fba32df5c787b951a86f8d775ca81cf594534503a4d36b76e495251a8855801b0d734579b0f8bf4725a16508503bd16f46afbbfd8a31fad25ee017ce43b32651569f5b26d3bd9e4db1354910b8cf51e40040709681115b9a05d8c582ada63aa48b8ad53f186f716852eddd94ca08a40aaceefb10a4515d9930277a5f10a19cadad1eb3e9f5930cbcb2879ce29c67a6e08fffc77968e454646ceac21dfa2704590027552259af8edfbf5c4bba74853c5abea7f7b512872d2c338a0bed9bd85de5a6b982f51d10903e204afdd090ac23e4391db273bfa630750ce748308c5428873b92858a481e771b90ace55c5de1c6ecd36def60e73e43491c9f4c787889a619d90a82298e3b0969a88a03ac0cedc5344acbfae1d3d1b2313084a2da8f87ba1d6f82dc2de50c66cb43c0291c5c8cc0e7ec135534e3e26ed040915622d22c39f7dcc0a26f137b6daf65acb96aa95ff2b50a6c7ffe7f2ab0954ed6e923f1809f872857f44e54c264ed7732d28376d9d4a1a055007fa10fb923b28d259eafc47a89e9756ed4357708067e0f6de7c969dd6200818def3bf5c421dab786992512a3939f467494737d48d0c0d9c79a78b7af3c2252418475ee41573d6fc47c9a1801ec50ca36862b1fe984b313fc083b0d0f9be92476e760416115bbd4bd87da197e1cd83874cda87c0797136c5e0a578e55d7e71d8aab97ffaf2286a834db791270e217c0d9fd5f706db36e8f24d481e821f17ef33dd99797e3674fa560b28a1f38af89d1312020f17f146a36c1d23dad75c23992c613a9124d3e5545cfbd3051b91e55db54b1b40bd43a3f8fd9493dd1e3d5f6e48ed5a29bf429a614671f9bdf410479363bf5e4a7ffeb86d3e013628fcf8baba271c94e1bf6e1f16da3d772b39d75304b746201a950052c08f9e7d04828e86847d186aa1335601ad0204e836bd51adb0345e22508484b6cd3cdc9c0950916e318c33b0e74e7f0de57678c8e712b1c49ba01e7238a15686ecc70963a38636c5631ec7df0b59b85d593f2817ecd8a432bf6cc6caf9a9729d7ec93af35ea781b68ae94b550133c35b7da0c8e0f8f4b0b2ea4eea7dba7d39568f2acbf999916ef77f3d9de4ed73c38969bd3675a10c04c9c8902210671f88711973785f216f81b6be9043ca3144faa6767232edb5f6bfa7963ca3d1c9f3d5d81b28ae4d5cef5e22275433f5b4ad917a7f211bd0cb08b0ca7663a2153329423139edd4443597871300b00019ab45225fcc210cff1104660cf48339124969758af975e8a5e7cda4d37e4603270c6985d5facb53334a215b520a61802926db529552da0df2c0a1d2463628b36857e1e1d94813e212d98c984013b66246fff8bb094a59fe4bab6ae159bdc900ad4268d2cc7465d74fa49cbe73cf8261180d1c5b71f0ed938ae74eeba71cdc19a4a5dc0028ec16553fba0bedba34897f73a25aac2a8b7c79fe2a7e287395812d434c3bdbab6b0a81441d6495ff76dfbb55319af7c93cb4b6e9257b095d2c008844dacb0825f6022fde172b29b9cafb5e2b7e622c789d22eb73eb78461043a173e2b933e28fa50ab224578da1dbd6fba8d219dcb0fc7d15a2c1acefdc32a07dae30f0177b15265ec84bf153da268cc814640642cf9224341849e9cdae095a95328ca43743242924f9c1c61e924c9b38e117ad34c2d78e90c5fef223119947ffae2460a98ffda68add68482ef2a462689a320894dc1ca21505b993ede407aa849cda1d073298c966dcbfd935170382c4d38eb7a72f533645919c6a71a48628a91a831da57ec9c9b76225a00a47dd99ff7b93046e2f6240cddbba497e997091b103c0e144aa447641422b238adde70758c94311ed098c55ea92b407569cb365a8563e40474d7fa959dab10cf06a34392bab28821b43e00614fed85356c3a1aaa55bcf61260f3bb43e93d97394845a885e55a0be27988c2c48ae0737fd175fb38598c3463c62018ea43c5272098b73249ef7c4befe1448e86384c893accd48514f76da6e391d2a91e7cf669eeed8971b22cf808d0e20213299cff0f6f5860071ef14a431ca3c91dcbd96acf168933efaceee2b411c3a05215e3f23725e70a63ca02945f908726579ca97a85d468d75945e883d9106a53dd93265564431b5747abe0e48d0cf96782189dd99e06ae73e4fd26982f595c6ecb4dbf3507304c1a5511a345be9049f10fe5390c22dd52d2aacef0235a87d1c5cd7a8da2825b12d2e9bc54b91b6dd1857f9c7963d8b58f6c18e05c073a3224ca1d117885691f9458d3f292e54dc6fbe542aa982b9746f1788e8e0a318e7b0e24c458a7d2389646df1fa468e8a4f0c275e5949e5535237c57a8ba7699316ceb1d407f199ac0893679398916ef827ee280f3b6e8c027bc8029ae130d35de8f4ea640802cbb44baf51c8c9ad262720902dd02424ff5abf0ae738b83fc0df9eb46d4e17ea60b3b887a273aab899a30a0827ca0f79e0b8bc65829edfe9119cc504a7c2a691d102e74efc41000a039c7ffd13d6267262f82b4c85cd8986f274dee642e56e0009e97e887ca37137e0213be7c5c6d16f771ecd40f15f69e95ecfa5234cfee5a426aae4cacba826f1fd7bff17633cd826251768fb6b06f0dd44f50c599497a60015dee1f1ba9c3c16d5e3b7cdbed23ad6d7bac65004cf4f9613977563f6aca206135003781de7617aa53590432a14a841c10fa17d3b7009dd31b0150058d569b0d735430ca428c4a00e98d7fcda98d9afad85c07966b9d0374b0c38453bbc5c36c331a3337a0bbf23730783a31f860fd166eeec27db2eb80834f5b84625e345207427fc3d84633141c661b4489054fe0969d61408c6162f6f513c8160516b1aea89ed26516407d5605e6ecf9d77044c1da1e63ba72d49aa19b49f1e4844c70e0e212ff9467ea48b4a5d0760521d03af1081b83fb61ff05c664034c70e4a230ef8236b00ae89c80e62a7051c911d088c2abd88ec8033522a68fb87db47dbb1d03ea16cf1c1c9273d99ee14c80ed27da91d1d341b0c78d00e1e36723b956a09d4ee7f2eaf586707aa9b7e44ba615d7763ddc85fb3dea804fda11ffe45b0703aae2efd40b27e5fd01f7096f3dd9575d2325397c3e0e09bfc5308ac41b21ed448b10a32823f2614ec147dd003f97857224a761bfd7c87fc01271dbefd6b8b63831746132883b6c432b878881d462f8c64b907fe23e234ae8611747aac8dbed0dad83849d648f99cd6b6ea21ce5483bfa8c6a4504021b72de308264694001579647cb42e6a66a07277a56b8ee3a4c50e6cd4a65961d14a67a7b84fe0c7313e5fa2c4c43d738380d8ae5e23938b361a3eeb4d770fe657e9a198e0c4a623c17e337d63e9961024365682ca5634ae910e8e0d2d495300ef162c670b78368f3027a87398e2d36f36948c8313008f4e062b85f7bdc560c9a66e1c91ca9de004f7b1cb38ac571f9a81c587204b47bda16e60b7d644c7fee79f66f2eab53edcd93b3bcfeae6db6dbbb63c21704fb048c8723129d2c40539d862e6f37db337df49d1412695eaf3ed515111b2a4aa0fec3dd429d127b449eb60a25a9100f1466ddf30d9c76611a89e3672b56fffc605839890635541cfa5362da2ea532a34eba9b10c9629fa14ef1bc0be4dada92d00906f811ae3028297e1fd156f84fe4f0303bc77217be53897629b1142cd96c9601f57e6725472c0b3716c2110e1b20824cdce5ec02640fe2bedafaad274dad4bf6aa8d662b45ac47cacd2d74ba53d8bfcf92957966010e825a1826df349107d95feec3cff04a335d96639134e7dba1606dde82c2ae0dd9b81d1651c37ff369601587a6c53fd5cc8c38adadfa2ba43c934c129e653658372f6ddb0df3e33544caf26268642839cec97119ea1bf82efad609ffc42b8dd46d474136a7986eae95973f7acc1acb8195a70d0b3596d931c24857839abe40c452e390bcf33e975a4e4255d487f5f173e56bc05db85fb98a7c8069d4bae97a950ad51fa6cdd788a20e4d2afa788191c2303977955ba1939e5c8594670690a369f956d10cd266b1409f0ef1b30592a01fa2a6b777e25149d24de86446102c11584e61e26f9d37b09f735eeaf68607831bbb16075211d896c5d27cdba5f99482edd822f44042ae570fa249e19f50563e056e41cb4f019935c04ce1f478ad260569b721afe497856c61af92923c2edf16028cf65477fce56724b13ffc3d30991e89b29f101831d715e00ef4a304bcfa1a5277a94de16cddf5eae3c5fd9ff562312777e04f4ed4ea5243179fe5f44fa3e64f26df2d1df59d4f73bf14b82f2cde5bb9c5109faf9eef0893137224a2066a6f9aea3358f664f383d1b8b8cf3856f80334d3958283f2d7bd74902b28f1c888b74948448ca1be95efef9a2ad0a18c57fc9759c6fb907c41c89d2672f12fc26b90b376562288e5549e95aa1ca447a245d842f19fcd5197fc771bef00cdb6c4a56854b006f6448cddc84be01382325e85930ceb74c852ffe206421747bc45ec856dee7e67c952a78c255b9e6a0f2bf3248e97935a65cabbeda869884bc533a94c7dfad72406aa24c37c80c23419fee28364b0837c7d2156c3a50b051e2d1d49cef66b9d7152509b126bbc7d7801b27c515311175deaa8384a0ec2e3e715aaaac39ed95d7de7ad128ff1273bee0d7cb3fcee70f3819dbdaa1339b41e995efaeeb5a6a65e7015e6ba1becf7bdff67973b606b5c936b6245d26d0af47fc746b53a9b4fb3b30ee36fe48970febe382db3d734ece3f7d43d0c59299686871cec6cf7e09401317d21087284f384c9d9ce30092db0c5fff2bed078e0343c35b3011fd138de43dd35567822f7a422476a558a381c231bed794f72028b43eafe664ae5394d4db411e5203c5da6a32658a444b4fc0ef4f3c6f661e73f1cb09048b1557c8fe6fd5885c8b7122b8ab494329495597b1e504df7e399e50ab21de2ff8e0f6b6c60d792816273432c029b431e8b17a111a7a3c1e759903671cb8e1ab0d924d294be502495e23b5efc941ca720e1e0bbf2f56352ef8262f0a62f6ed87d4629e4fe09893b676221de295afca56bc3247eef64e262c9377cceafec2ca688dd873c4be3db2abdc246a28c7cba2de78675d7361d76c840a651eecc0a2db9ab4e2244c53ed942c3e2a3ac6910a710b39cddca4ea2e5c52b2bc660c2568a3c7583060b5a38bf4c7f3ea190ba8dbfd33db917b13c1bb45217b54019f53085be7e1de821d500a90c64173c43782a49adf5f5181c80dbb7f41c1f9c9e13468140635d8cad9f0486bd0a10b1ff21bbdae377caa8d3e764b8b2439b38708578e672382de17b17a20b7a7fbae90e62080a143073a48098fe0e26727a84741ecfc5bb473b59c71fdb84f3caf7b6d1ccd13c68f599f8fe40efe26871f641fd3c2ebda29736131809387d833420d65c2360541096242876668f6344351d469ddd307640f6d2f58d48586c90cfc69340d7758d3ce9a0d9f2775e0835a6781b6806871a5ab7151f2190168919d21b95ef3ae8bdfb28251d50d6650cb079bc6e248c427e34a7366e71cf048584a90a9f7d185180076d3325f4f2c30c1be23a48385e12c2b3af8196e47a183e085eb1f02237317a52f875576d062d2f0e9b0603350312819bb6bf690ceb789319728b7c045ceac783437796f38b75bda27b9a3d581a34c3c5d6f41b982b017a991b3147c019656e02af822f1b05843ba721b4ab531ac04c383c3385c0a76160c84901a579db7bf4604a20da31ba8ef88886a123fdcf95048fc3a184234c59a17da25ede799bfaf9fa3b7e6687dcd87048d5e92ff39a229655c0d55aac3bcc07fa3684e2a357854d0e4bb529d7af08128fab5def92e858b01e2dfe27552b3cfd03c25cff80c77490782cb0d657141537ce0da170c5315a42671bad21b472d2c6ecebf0deca0596b2af5111695b398143c4c717b1bebb7ecdffdb65c62a81d5af918cf6f0d58cbd655da5c82effdb54960ff63364658aace409f922f2671e66358953347a58481570d3c0edd9a9e0a52174873424555dc29ddf8b9a5594e1751004d016ca8570be745feb7ec6b0a47cb2cc79e63af02d06865af1ffe14576f562e536f7437cb70010b23ffe718649584d0507b4f63714be9047529e808aafb75de0441980c5035a980530c3e38886fe823c110e0b10f54a8cccbae674f1126abe51666a91d97814a6970a32d39ad5f76d83a3319d1865bd14fa2fae908edff19564b2f6d5632d9de0e7c0cd10471a0196629a5d61e99b09c4664f07a8320faba24164460e1fb4e263a4d2c8cc356f51a08189f95e2589db59ce086e884e30f5dd3e3902ef04d632fc530cc4479f8f166a3b8d6634c17c6684b2b1ee3a6c5b7eea07082fa4c2199d5279de8567161f48145f7de3af54e94f47ebf4c066ad4a57abcac1730896e23cad79aa8b5f8b57e4aca258fe438d6495649024f0e308b376744b5c662a6d1ee95c2bfdfff2197d486988608a2aba9efd1733342e704ec0c42c80ca78f4b6a4572106ead8947bcc8c01735d465d4c4b77ed1974cff9f3e28a04137b0144b52a7efbcd81192855b8c5f3b9ad29f195de871c4926d4a1aea5c176ebb4abc54bcbaf0563bdcc26bba15a58f9adf699d4e5d53c500d6f55aaff687dc70b78e0e3f762e240385cdd1521f13bf5c2d2ebcce37baf8b5118e905d15180be43f3d831c7c91ba7674ead6eaef5a18be999e09bd51f94156683f40afe48e87b1d1a77b02247268374ceef84bd1cbb8313c75d3819655e66fc6f8d522b94a518cf068e4c9f76d72ecd5910c8354f7d71bb194007723d16be13bf81c37961c4f67cfe9b853ca7d350806a6f1c758c47573fac9da52d46d6675e361f698d66588260358a4d918f59edc01488f30e8ac6ed7b5af8951aaa062771fd4dea41deca000c2eade0a404df79f19a2427905b1cde9fc72b0ada361dd9147a168e2fa1aa46304affa74a4e6cb3a68d3b9db3d248189a350a6735677869ca4783bd1ac7663545ce792b1dca963bca87db8578b52405837412154a84929027719f8f84c62a2933f452f0ea85131a970369b24df26211f74cbcf37f263ac32a22e128d80981151c435e4a24bda86b105873e3d8e660a8cc23e1698e8a146a5005f2054e9db911faa763fcbbc0205c86ddd23e47e91a76895bdf3f63192ce712ecf12c6d714cba02ad6b7c3810066ceac7da83c1ca30b34386e61e18797161fc774163e909b6252152b557bf6bc036f319dd7537f88b4358a241754aade0d866bf689c6749151dd9ebef34216107da9ae61a0ddeca5d3eba7ae18e4c9653d14865a645973e5546bb530b430039486bf4b420373355953677a5f0500acc856c816a874d831f3ed858e9c1e7d3e2a00f06b475f363a053e6b846945b6b53e8f0de71eb37a10d49252acf174a529d4298db602619e057e041044331ad64caadc7b737898a93849bcd1ddd96e9f81bc6d207dca8e6f1f187a0437101c8d9175d6ad37057a3fe6a7346500126370d06b8c1ec92aa651ea3b7cd17ec37912f542132d448c3024f53e8d6d47ea321e98914b0a7c394be700125276e155e7256f3c532c0fd5d1a10ac14401137a776be45ab08127d4b805f9c83506636f4bd64732f9875ff0bf5a69e0fd42935c062cbbb816107e9ec3ec6bd5688e4a9b414ce28fb04b31f0be7b5fc48b80d194ed333673a6b9a938a8260dbda2567726e1664fdf581fa5c24a0ac561909f5f2f03d204133b2a38548f56e1d750368dbd4dc1cf3dbe246384de6122e22e2e022202fc7b060ab5494bdd6a67f48383b21941f18d376fb4099998f7139dd6aa271573919b47466c16d0cad8580d00cbfbe55fcbe13a0efef82ecf1bec2592070cd366d9f721db3d9b48315ec9205aa262e35f2868c4e33b21a0f1dd016ca436160d6690116086294f17ac4c9e3f402dc04c940d509be40d54e10893d8e96a77eccd6ffe7a6b268d4a1a22a34d1d939fd67f525cb21b8d4c60a09a22470112fedfcaf8deed7e963597e885c8b099843db0a8bcb386dda43c9f9961da5e68b1582d985830e6bb5fc285a07c92c27c4a4c537983cf5d6e10c1dec23d657b5d612ef17650efa05711ef6c6f124bf152e856edd78b2a0f1f0a43c88f71e1f15f40102d9bde3a49a798fc85eb214e8a0f72cbd3b256d3b5180a832cd500359f97edc354cdb90466611ac6418ecc6e40c4f40df5eb56f5052e000346f7505e3fce4d5d18ee27e30114a96b17d02b1dac569fb06f4cb33b85f8352438b93d9d4116ac376a3d92d93ea66c69c5440945f74a43ee38cbc3a5c2dc35f2632d6ec78ef6479916d47f768b0fdf3715e402be01bb07b85e62bb1d8b466868a89e6a83a8f1bfaa8a2775453530e4122c9f16df2ef24f77b7a986ec2975ddda3678406e06d0ba7c525d6610e773c83d623979fe9cd23b00d67f9ce87f1cf2dabe327792bd225d9b3ee225fe9de7427f6c3651910958ffd13cde55eb05d90af8af11211745872a595e0ad787b6837055ff53b5881ffba8833a332ae57b13721815a47540549e03a9d38b6b89aa6a0071439a390c3414399cc49d0a27e33259696df06ad09fecf329718eae36f58219823d8f816a0764efde7542999aed9ece46319b876ec8219c4bc8a79750b6e87d02623e293a63b038c50656abf90098de7d1667f0569a36a5cb19f7f2baa481ea8f53570bb0d744bf5ec6716f07c0a00ee32d835a428ef30e3071c9b278fc19c4089c1fd1abda374c939dab7ef38083315b8ad9676fc40765a22c727640fb24635b86da0e5b9ee8faeaa1811c5152154195d1808354ad9da2a5ef80348786b0c482c7aa44d81f39781ac2e9e87616504ab229033de9bbd63ae5ae105b9f282ac1e82a3251e03b2955191efed4060db9455710c618f92f4f57f512e5eb8aed02d74d71bcb11c0ec2e9c4e299a8ca72c600954829c32ea7f67f7bd1e1e1f9a9844d9614cd8f5b78da4bc455638707a299050ccdab95ad4d2a91bd9f81288f09225871a358af4ae09ddee54edb7801bd51ee01350924555abd312590b106755314e86b4c6e4daf14fef4d4cc60e7f21827bb45d5612456206a2bc5059010ab52ba3ab568fe9a8e1ff303c4ad6a6ab38de4887af7107b9cd2408d83e154295cf57da5500f0beea88d89854d180389837902504e11ecb1f53270de9d5811ac4224c074463702917194b2c822b8149a4293c1f02c82a688b49a1eb55594927b0d051c06893720d4749e07a417403918c18c2becad3010a9badc01605b18c1e5e37b22c4f508af01ab719701eabc0a7489c5bdd0ad4e9e55a01bdfd295ad85128f288092325df61963020247e7816491842902553f9e4b05668a367639fc7cef98cc6afd0164891bdea9c9c25d386c084dfd13651c7ea16022db893f873e5072e599b55d627f513aa95bd8b1bea372c32893199219199753993a484ef18e8af7930c893b91c5206f254dbd28514a14ff14064365eb1449bfd23165e47cc87593a6a84134292963c87a0bbc8f3e0c12a3ea649bf499b87ec60845c44adea44009bdb273fc21d236ab7e01e0ddc267def96c6474096a8afe1a49f55a2da00a0f30a3fee65047db0d4da64ab1153a01b7c9f7943c0b8e30df564b149b7685a617388d5e2fe1564ab3733c899ab642e91da185d424122d84bf410f2e9e79064e70497869ef50fb9b9d8f463114c403296c93cdcef97415ce4c0a0c5a635d388547f47043c623f3abff46f9c14ab9b5f1c3357198c456d2019a69f448e52f532d8ed2dc474a96522ca1656f0a770f6626abb5384c437ee3857b212b3b88aad59e6b565d8d47b6b79543ad7e0716d3cab2907f512b9069d5c7de3785e068ce7b312d1cdab4765348d658fa6f539a5d8a7306517c8d37113868461bdad4b1f32a7919ad25eec686b1f8f84cea836856a94a07456a51ab56fc96a91be026c15dc5d9c07521a50582f99244e8750f9b6d575e83373dfc4e2605ab5812c920b9a643133ebb282cea0334f71e5437d98da1eddc0f50f36ee7cc78966c6aed662be312c8b1ea311f8ecbd349051c66e0229b54b499a77402f6a3a3f4149e629eb977c58ef0c0ff87f14c8a904ba219f297141efddad5617102021c61a5053ebae4d9c9e40123ca730744ca68a357114b0661da17092f2491aae12c8b9c8aa72d3327723554fa5f75c7a5be608e7a5674ff534e9e82607355abfed7b234eda1a6d6ab9ad3c35814553acb070dc85d0ceb806dcb0f69f71ceb8ce3878d708cc6b848e8319275b90b83a1a72790c117f7ccca65503c5ca178121a89eb47cbf575a7b7388b6143e8d551cf57c085590ad40f9ef56f84945457140875b882166d4a9d22e92a5779fc880595cdb47265f5ed1241bed76eeda69e00eb5d61b272bf792ca393bf73cf5b3a51646851fd5af9f3937981de9abfc75a7aee959e9e2eaebabb5dcd0316e0a7b13ec0a24e67e94cac4375acfccc01cc7496e80738c5d8f5fdc40381d05b8bda1e770541f9630ba1907cce783756c9803efd43f977c8903f59cddec74cd972bea9de860aa5c18db6e4b47e591b265d91ec7d476950bb3fdfd64c8022746c7366a060b451c0b502c9a9e3df5d74035bccfc9d16058f2ef1ec2f5c15c3f966850826cd7aef05814aa51a7918285702938a996dd0c643647b384d4f9bbfb85f70209d4bc1cb9a7b4100c31d220203b88d597acc1d6060e7b986c1b111f9d22a211640b5b8c0e4bb40482e09242ad3c80d6435d2445decffc44d03d8053028147f33ceab88dcab9b78592cf697893df46af231629a8c8b6436090e95ef88b66167b75c7b6fe7ee52edfe56fe2c97e78aaf11c57d9dde7d9c52627399313d27427df2885488164dbbd231b56761df171e81648c14f158de379333e83f9b7e1501e67ae5bdc9330f4d46fe320cb49d2b055d2a18ebbc4dcb008b9e41f1a72d54027cba7687e4419b658e4049b5726eb240e060cf599b58bc06966d5941c8ba904ff337ae8fbfe85fa838065b99e0a049a0b38d3bc5086095ee0d5a298d364eeddb1cd93fc380ae6764d2e8503201393b6284ad90ab557367dae61bd08b604d2bcf81979fd4a643b68764d4c387022799fc7be21083eedc7134f643312578f9fb2d2e6fb1598eca608ff3cf9a49ffd41ed1e525077a9b4f889692d4310515a4cf2c3b2379fd533fb12cd74ed248703ebd74bd544da6b8bfb83f97f39236b916760f5df44423479df36bc6c53c5d4f03c054ac0a85d9076444e85026ef7c4888c483b2c46c010350563f5381bc58b5af76f2698b0f52702a805f1a3cb9a7c5e423186f93532c686d54d9f39c0122c357dc5b01cf2b88b2eb8bc7e18576a30d46308c46075267bf043ad3aa4606f8ecdb15f860c69d4133c03e42c1775ee5ce4c748640e859a20502e97df08009733f5f1e93a8a8a959bacf20cd4b46ce47768cfb268248e00873d8e7e0ec1380948c087419910717c2a385fbe93b5e206d8106729c2b7e6e74896a472c953f9a2f80c82f2f285d1725c272ea735aa949244fc9f7005d2a43d23faac8e788dbe840436f21df1a5c0e11e16159ffeeeb6ecd8850d21ea0187c41cf27aec5783b2c379a04cb65a6c209337ecfcc5433d6df6ee600156b2043b2536eaf00aceb28ccd3a6b86ac0f73e8c9f407950221f1f77768339590766c967c617fc651e0ba92e2dd006d0818e1cd3df05a29d5cb5a5e5da07c69a3617f4bd035874718f4e7b437e20ed2904258405d2d3b1addd8f0c3e92507970281cff5b1618db7ad3a6405a868fa739c2969ea9864d8f1081d203b6628d50f6ceb2c26422fd5920974cb92dc8153227eb4e482bf12802fc626fba616b9cb30cf3f087ebec37f8033ab4bce2cd1e0c5e5886cbdf6fbff038784f9179ac2800608f0175a8ff5745361ba60d3835273e0d1eee2d1437e2f7f8fff57be2baf823d78bf19be36b1a485b84031c8075097e19a71e8ae80882dd92b507b67152011f2d3c737bda76db5d1d316f01efaf9e0ed0fa11738f5e8808e08adeca6ef235aad17838e0bd7cbf4b15c53ec793286025f6fff9fe46ec95637e1e095e5dbb8f8a115ca14baa15e373c5816d386c00acc88dd1a3e472e4692b1960d082ad5e8a062a953ae6d220529e4ca67f17df9bc69cc2903db8e41ee9d7ae41d63d56bc0dfe076790456f18bb160b7fce44df852d73d6067791eae69d6e9b06c0d8739433d988f0fc769f31e2c298b9ad0db0dfc0aff0a22f6b3c008d09c906b081c7131a886c5941c2d9e79c7db5303ec6e504c7b7e3cf24d28bfec4aa12247af47f3d5171d5d9dac0fec0387de709201f235138832da48a3432ed961ea72a140420a48a820c8676a9449b62e2cad85f63f64e779ae341898cb722d6b5242a1cbc49b43c43022c895d864a772881ac87423db7a94fff7df2d763957156e1b0dc2431f6545b9603ae4ab2838e0a5d7e42780ed6121e4548ff02959e8ac6581eb102060fc1bf5738c7321d4e5477cc73ca51388e1603e00fd6580b4064561c004a4796ce7c0f0d561e416a1a48ba26a5542456b4f46a38490c4cc5dc4f826fef82c8eeab2aee892b78dc7de1363c86b019d5d4817f067eb7a8722575ded07e5397b727081a1c00e90388dc9ba09c21fd16b23ff72a1fdaddb012e174579ea4290d4709511fe0572de5df6f1beba6054d3e8dddd03342e817ca82384b9c487db5ca88a4e1b73fdf500dcde5d47a419419212a025ed51b6e64cb18310994d6c36a95b7b8e1cdcfa4a27d917ac8f10247e40a03f56497894bc86cb3345863c7ff0dacc3f602c0275e46e4c58d126a59e171544622cdf587776645ce89df8007a086d9f1b786b7c50040e4bceab847c2d9fac05bea40a6848f6ffebee3fd053e30aa6803d0e9136b22639d1bca08785ae8fda927a81959ea3b13c84b7081afe73e1215c97bfee0458580d59453c853ccdab3447149d260a9f93f960aca9e5949f7a2ca6f7aeec4c8769a2f4738d79c632bcc2ea737ef4482cffd457f0658d4ca8874a7140ff6e76d9dc05616ca4ce82bd05b7402c3e18103f7e21b1db179a121a823043777d7ac698a8fda28be778df475629d4e64572b4ca5061656040ba3ba79cc3299c14aabe35baa2b457232c12d150a4e9e0d3b7a4fefea3e3815fe300a090e6c6be04e8fa511f7d9a65112d3a48e35fb97a03077500ca39f10dc249dfaa7ce67edd05501135aaf30cd2935eb06de6f204149e60d41099dc619a236b7d20634209c318138f3216a69a1c9770e4c3bc0999b33f23c2be1ac6cc98e1f48b4da194ca9106f257c8449dcbbdc525b7023261ba145fc4e616b1f0094559b7942176c7824f3969be8c09eba3fe4310ff76dd5ef39b018990db75217b3ed7577815e1b96ec5c271f1bb8d6ff53d859ea0c980335217e24324d4ac1fd5581b6483f199990c6dff014f0a6c7b46ffd0fdc1d035ab33d595930dad53607e5c8dc585e72aa45b8863fd60f0e78af06e43efed81b58131b6b27d4b4fbc55899a3031d56ec65d89c91a1060a27c1604690d718705a8e83f9457e7f9e6c1d0803e0fe7bf2e049fe9f8fd2464b9b249152ca94646205860574053e45755a29469c4cbd47d662f9567a29a59ebd3806eb9ab8f7d251278aab64431b924e4c8200b14aac6889946559966559965f7ef9e5975f3ecd975f7ef9e5975fbe17923165d08636b440acf811c9164869436bc3907c7d98ef67aa4aaee4743a9d4e65792a4fe5a93c95211b96655896362c4b1af35f9665f9e597effd7f59e2adafa0c39e96b021b640ca29eee28fe1644bb2a17b5d156c68c37074981a86a10d6d68c397ab34030c2349154e766fce7064dba8497cfed7a84d4eca904206bb94fdc514a394d20bf3b277af4ab9d9a3fb18dbae05c7fcf0eb303fdcd590922dfe8b81b2cf2ac8bf0b5444d3ba4e52fb730139ae6c67cf9bab0a5384385d40eb77398b4c8395bc3ce62ddc2bf71572104eee63c67ac4324692363732aca6871e3ae9c4c483003129119d084729c7711cb771383f080cfcd1673961ba143e7fd6e74a702cda86ff681adc4731c5077a0ffc89b6d1393c98a61a8073f5351318cd976841b37eb40d9f4247ac29dfe3f09e3db9f3e03931beb66aa7b40d1ad2144c01838ebc851df3cefd4ee5b40d6fa552ad9c0b7b8bd56a1b1ca6651bf66d4a350d7fae33a59c06d399985eb7ba065ef87c4c42071eb23c4aa93dd8ac1437e23ab57d380ab930f470348249c3075238bda0280f3dec74b84dcbb0e63167f4f0416524b9234a29a594524a299d18e7fcf9fc87a80ae35528346766df20d8a30898a04b8f7895af4d05640a2a910f2158562511f742784c2d51e76f673b140d8ad22d681628ea0485eae137fcf862b22ccb2e1a97c025a2a64b494b391d3a0c8d6a5d0b0fdadfd741cb287d8c7eefc0ec077af8eb073ebdd8fe3862c6d829a0e60a35572857425128cce650da36f8b9cea6c53eadb97ef02b07ca3f1c4551144551144551144551d4bda19110c2d0462770220bd4a3380c3a800043eebf66cb081530c678bb19085317f1da22d9f5393add17395618c3b21a343964e4755dd73499ae1d95da1db9acd4e693bfbd817df695ce15ad533401840483115a26922a884832917600294b20330048e43967dc073d938934994c26934966fb81c1efee340a72fab6ab967620d6e1f9f953dad54c8d408de3691545892a0999836a728de3d829cf7d918c580a96923d675b1ea198353899550c804963219988ef68d2c4a2f965d883e1513c67005a64fa9d8f233e4670a6625471f538f2e0466c15c2e73bda862b691ade4614610a57620425aa2528811c57230e57e24a708cd738625ca372857d52366181a1cab1a9944629f574321319ec548c4aff1472a5c9b142ad344dd33c1d4f87b1bdae9661d85e375585154d581bb76d1cdeb86de3f0c66d1b87b7546adb36ef25b4790c1bd0cb5ace89dc14881e33f84fc76b0ba2584a3d218212726a624a8245b1568cf1171983583948a886babc94fcda637d755d0dc5ba0ed234b80e420a1264073a08d28320a828c49448ae3872ce5967d5461a83c5b410af61ced42fb848824344c6a1f8ca552a8ce17f956a6555f831ecf157ac93a12efecd64013e84593d0a93cf875059b6e322759d7380ab542a95b52fab8d8806843585aa6e0200838cdd8729ba6e7713864c43eee59c73d79b5a2f16dcebe14904217e3deddbddb79b826677d3a7d76317c83eb6f4de7befe6850c7eea67738cfd3f14b04891bd2f640a81ac83c5f5ae8b8b32e79cd66698bd40c8321b17727d50a60273e5f3b7995d4c61b6ecf0813cec1235c3de5a6b6d6685ec9915727337441081ee8af495d1227fdb9b9a1f993e58e307ac0f9c2b1afcf3214992bcf7254496aebeae797154a4722453cdf615b95ab739b8901ebc5f6b9cf93db6eceb532f5d7fbb52069adb83738b1c201ea20e39508b38ec8b21438e5c6ee370d4dc9426ea9b3d67164eaaf03172a2078d691199fbcbe15199938cfa9426fea02e8c658a1013dc6863e17ae374fc9024cbb4d30fee614964ee734b877bfe3fb8e7bf83a344d091e70fc2f3f9c10683e32ce0f9dcd22a2a313a1ff957de07d7e5ce07d739c863f437b017f58ac6ac742ddac7985ad72201ee57de022a1fa30bc2a3d279ae9ba20e688a3ca029ea96c3b4683fc4a7817f611886611a913a52977aea247d726fac25ed63b8df3aedb5ecbb3522d5544b602d655ced50cb6853ac9a6a69eb8a700fd6d2a804aa715243b4711c4712d7d295611a892d79d552b6d512564b9ab6615ab66d9bb665dbb665188661d80f2e9381190c06ff055367b2a9c5bc625ad1812ec568b46dde8bbbd490c18126071ca81986d4596bd79e329ece26e3b99bcdba2b32fdb985429a0efed3fbb7d66b1c845a6bad1d155e593aacdd42097b10dc6a6152eb6412932426afebbaae2773c64a53355902164d7247c3224f56aba80da60daec89ce93cd7f512260d876927d3f3f7c6a2499324258720ddbb45b65ae410414c1b4d360de736ad5bd98f16d96a915ce7d2c1c241692b8c1285c17a7466bcd036b6566bed5cabd4225b64a9d52a795a2d4f89eb783cad96c78343c7699082b5d68a22c639ff6b1fcd8de7a8a190e7e5bef7da720b916ba9c1307cc21fc6e00cb75dc015007cce8217e459679d2dfdf88710cdcf067bfc36d8e3164c9ba29aadc51275c1c0206a218af7be84481d23cc39efbc5bb4966d91e99555f22c45d0319e0c2928c20b9fff006cd04ff17ded9b86c5b6cec7111f5b37b51d884ba6a0b4b71c8ef97518688b4ceb4f6e87ecc33bf4e31bb82ba239e77d5eeeb82ead7c42a7d3e9e42cc34a0c337c5e064b0c510534452b20950c6a510cdd8f23d8b3fc87a5e333c8685106b98805f42023842812e3697c72376a10f9597e05d4b2a2f247f011ed8710cd009aa24f86719b8e180ed01a484706c845193445db16e33d5088ca5017acab9d9597e163f818cf926198eb1ccc029a2dd218191eb33c986374169dc7d1438dcd8d0f397ed001844aee782787ec743a9dd99d4ea7d3c99f19c3097905bf4a1325a81edab74c974c6d24c98925460c31805838cee3a1c901877b3dd4d8b877d33fe800c2bdc65ea094524a29a594d29e349c93e5edd7183f6bf8a60058e0a35a648a669195b7b1a295ce8710a2958f010ab1688a3416509f20758396c89770210c51a4f9114c9c208a348a8223986089b47a04a9092d91664f80d30529d2ee14486a8012691793205c4125d230145054220d2b021454a148cb84ec201469dac602ea2751842b91b66d2ca036c2881ba4441ab7b180ba0826544889b44eee84c0f3d5074d26478c1889b4012cc94f54bee24c1bfea4690871184c9c3397e7b36a25cb790b3b4f2912d3e355b5c49c73deaeb6e68c2fe68c279f4a075622a52ac4fd49dba8389346eec0ca8433e173fb2bee7d6c2892413b6ab9401a4259d1987ca3380c062fcb8e62bc2562ce99edc5061a3a7634b16ca29e8ec807da519de29eab3a1d8b4bf2d90e94d9280d69d8aa3046476d10af87e1741ad2b08661188634b4f6e596d955be18eff5ec23ce0ec018a6d9bdb53692318f5266cccffe721ce013350b8f34d4c54e549da84a1b06398274a152428ebb5add253587aa0b25b0c6d5683bc085942f56f77a09d5f03c29c158ad30cef93fc7531ca190e7652e2efe8f13f185141c0018e48f98c15ead1ca673accd716f6e3169f48a0aab1386e9c8844194e3c175e05f57dd884bbe21efb460ce894321defa8155b9bac77814dfb0cd5952664c06006cafac7316f690738693e9e2bff2e273af24968f72fe7c7c544953e54bc8988b9e9488d9b91467b9776d6dc14d0dc3bf303d475123a68bbf14244aa22a70161593b88f95847125a9703e82290916c5b6d65a6e7bae7beae2e07f18ee66c2b611ad1e6dc3a604d75eab65afaa3db40e773219c6183f6e1b3a7a4c7c84c76ed6a6a6ea7a11258aa2288aa11a353659d45ae76ceca2fa824c5f730fab9cd18b0cce32026ee4ebef20d41b5399c1df8ee3388ee3bda1910bafebbae6e4ba0f253f9e4fae992e2e8009865c43155ef3e347f6d8ffd87ad42175116f6ac81a92478fa68bff689251c85f230ab98507017cfdb4fb40ff7f5dcb0eff5d8fb300041924d1852d82a08552047687795c2928a145175f37a7838c530627596373e303d7d1e2aa21a37531e7acb356ecf3c7d35a7b85464411a191a99a53b5aa610d925347505a1508ebaa54dddd1da2636fdb5328582ba20926910f219a481729d191d9796780e763541ea4513e5a2ad1122d8d4a9a66b79e344e04db69d756b56dabda76752ad59c69fab967ebfcf643883815ee8710691d100da94b8b4dfecee78e862d990a25659fb3ced3d11235512a326847d9db133dd9d169644fa3d3a87b85655bd6cd3963b37fb9fb58afb88d82f4823aaaac7553d5c861ee4a4557aa95ea5af14156a9ee6d194f5cd7cde5836a03d7755d97733756e4f999f63df86fa0ff5cef85643006d1e4e01e8e1e40a522c66661f39bd5d92ecf59af8b5bde139ff4095bdec4a1987ecac950fc496a625fd2232715e0d3beb62dd01b8dba4755f491f8d51a02716f840251263455494dc345da8d843811235ae7237519cd1944883ef2d168f4987a4569d6a2c874a6711e001dd3316811fc64568b22bb1645ee0ffc7c9f6cfbcc19ef743a38e2e7b3849a2a52f173823cb96e063d3a4b02eb01d7389c0e2bc8af850cce164e0cdac59190728044132d22c960e8a3223645418aa2288a62ad9d1f4c1ba0c8f33b5a9669dfb1d66e3ee6143e602214f9b85e080f293a72fb7998f6825a76b83f5da5bad7407ee0c7ba2258868b4075f48218d4757e1d9b0ef795abe97c77b8ac6e71f30495fdd168341addfb121a6952e8a9892909a694528a67eba3df4adc05479c2871a2c497cf3452d20ca5826b65328daa9c24a4911494131393c9f484c94d3e254ac95af156cbd432511c984c485a2d8bb24b9a4c319551587346e5e20a5df8dc3e685354455d4ca696a9656ab54c36c8df72fdfcaed4d5c42f158d59b99e78a916148fe9b28a19e3a4542a954a792e219fd4674fd4c55b4e52d99469cea04adc85e2c0549a4a53d932b5544b98584c399b4ca4c96432994cd70a0c20b40199265babaad86d0cc3b02539866f080df15f7f6d13a9a1e44dc6f2f939038446413748327d709236ee79dfc74fe96dadc66168cc0f3537b4cb51ae7a24ee28cbb2eceeeed6b29a39a736b5d63410f7f5c7075bde344dd3b4a7716d730fc7d542d74a69571965c6d7b5d61e31abfdda3d8d5f208caf8b3a6a9cac3975ec1089f0002214d262e9506121d77b6f8dc145fe0ffcd0f4efc075bf7ecdbd5173df723740e045188d829e73ceee401503584b336248dc7b2fbeeebdf7d2eb567bafb5b8de8de534978c4c4a46ec88030799d2c8ac7d77c39165a426c284c9e19ef5c04c5d92df3bfa7e942cfe74b807f381e9f9f370ef0324989e5b92ed20006814a0a8708232423a31b15fe9052253831ee10371f83a1a2c0f6f71407f1ef26bd9c1437efd1ef2ebaebf1607f4d7b2c34f2490beeeecf7a41225914824128944ba3744ea187177afdd3d8634a626c9c964c4f675f12b810411a2dd6ab28cb465abbf6f4eeedf98e47104e2030022b93ef83a34c78300be3a031872f6f87176cf823a3e903e109faf3e8d8fa036b9974b2cd94734943503b5d4faf9d86cdf22feb40de4b5d85246c6fbe914db2abb2bc5ad467bb04b353fb00efbabcbba161bfc6204feebd1bd5a06711797d265d865d865d865d865f8a2a2827d9354f6aac3322ccbb22c4b6b5fca184ca04e27146b0a9395125594d493d309632ce5ca329f33442efc099281c4b4f8449c928373c8669c7d76b91b7d5a32636a6af83e594c27a793a8042b419d5a6082214af04dd2de93b34e18630cabb141dd40ca1778d049e183dab60ddbb0ee31fe1504e6fe911a615b66b047d5da17952f68d6da69a7c51d1b5bd3384204492484d664145d3f2f900f7e4377b70f5b6be0e694c1900acc21b7f75e5c20bd7365ec7018eb27db699526398d27c8f56ac2ca8a528a1208655fc103d58884095648018491342a41c2c1109c71f45e42b4c385765d2fb9862d642b10d7556bbd735a4f167d5517c624d684d32a8a1255123207d5e48ea3aa474a2bbd51a96846158db9c944594959b8062bf2a42e2fc83a8fba786800a50cf6489be8aa010e64e0a655f6e80a3d5aad3b8ee3385e17e785cbc0b6dee762528fc6e76f593e9a61b08690b135c3bec4f45cc084a906a37164afeb3611482881d3a3ab464db9412142134f89d290bbd3a0b134e744067b341aed20f7e0e19edf7882f60ba533d4d3c57638c820a6251d6cdbb6b57a6cdbb66d1dcffbcf4a6470b63e70b2b2fd56aba58282eadce4a03a76c86053065b01711c4d0e387aa8b1b9f121c70f9ece6a73ec8566ad9d765ed8cf8bf1cda670041654221f42d0a0c24a1465ef43081a56c84288487b2166167250240aa2ad6fb801c4e1f3cfe14f83835540a72b420efd10419d3316490f69daadea97698c942fb81ba150180a3b0c851348c04d08019309d38a9950088970088e1234eebd84b073a75a6f46a50b46f7de1fe4fc00ca144d9053349102711f3781918c93e8fa16283214597c6837eeeea57a363e3428a24b850fc0f8c0a9f201111d50aedbc950971c2e0d122a3e70b27a3055d5da9266e4de712ccb1d9f4ff9293f234ea271eebdf7ca9052d3552c91b14506272902df8164361473890c2394423bc4aa6d35ddddf1a9187bf083e149624badb5f45a0ce49f18a3753cdcc5ffab3b505fcdb99da3c0052600030d683b546050426b5c8d754790107c11da71af2b546305061a8b00df9c12c5dd2f56b7680c0de70c28c6d7a45a0330258bd9635bafebba2e989c6f5c1de8e3bb78f8879f86ee91420a84843b0a7d5c3a4ce91e48451cdbcf4e87fbad0b627b6e7bae1b421404f79d0c743e3f7d95ce67117e5af2803a201ca2f6da6f8f3d2b88edb5b7400bee2ca0fdd65151744ca7d0162d411a8496301948e4e11fedeffa9a6538e6873b1ede3474984ab32830bfe811cd4a352bc5eae80f2125d13d275e16de161e0ed6c562b1582c16c65e8e62db5a6a69cb58eb323273a63ffc7692572783657e166152978f0a191742768cfd6554f6de1a342a5582d184c5643585848275a94bd376bd2297ba346738b144c74fcba7a2fd8794431f7dca074d29b207f1cdaec8a539d3ff83bbb80fee6203039386ff8c06e60c77ee060ff7ae07bb74030cec9b9c0e334aa67d373bae86325513bb8175ad2a92c12ea14aa55229c707f740aa9b39c33327d5cea6811f43a1b2ac860c0e3452604c92d9c74c4336b96d5c6419b68d66ce601f27e348c6e29250f03fee36f206c69d4291ddc6fd9cdd3daebfd129cd094992645ed180a13a94a8c5c0d62776d0597d630c04cfd71d0e3232d78533a4858316929648e2e93c264a85802924896173860c0ea4e6311821b5bb975d204e51d92d2832385b94bed8da897da23f421f6d3320cd39ebac5a5649b4da11574b29a55893b06fd29ce990c6ef0fac94c126913e0f88b130580eb30a50c06c8a0893c6942839547cce240559cbb08d524924128944b2f6a563857befbc531445ea7934a48d628be258924183eca1b73c9bf8b1ff74596eac2124113853b7033ff5ebae676022b78c26641f0d046708a70cb7484b5ad2520cdd7075a077832dcb39430cb2add124947a61e2a16c5032039939ef17e2de776df45b88d77879b1c1061a3eb16c510740684d42b69f13294d454585eb171d667ef4c39cc8ff953cc0f96cb0fff8b3b7d1402dfdddca402dddd574495dfc4b20ccdba1bbea5e0b71af4527f93ff1092a7ca08fa6286f5996652903671cc7d32a8a1255123207d5641ce99c18ff77163295a9e99691e971cefcf56559d6cf910cf6785d374a669fcaa8840e7a64c968040008405000831500001800068442a16040302094cdc37a14000d577a3e805e401c48644916c46008a2903186190288018000019299425500c62fcfd202af25a3cede476926b63f2a54c0fc9206d818fc040159cf0a4f6aefc8f07baa91e60ed749d43d2b2075d1742bcd3bb80fa7945c6b03d62f00a582e2d7e383ff660afdfb19659cc6015385c8a50af437bcd7837524f7e494b6b04eac50e64b6d2bfa44c81c8133c6b6b6e73ced05c1a6c24ed55d67c4e793a6a61b9a093193f59769678b8a9688a82c81b1de893b294755e589a146de29e630e9526c64172833fec060d2124d7fa25cf39990a45895a744f0967917d7c338afacc4d92b9f99e2f1427963fb6d07bbcace34e5bdacc0d7fa2d28aa0865e6ecdeb93f5f49cd395c52ea42f19c6a8e88b23f8427b54f294d5953230599815eff254d31dc54b89aec8180f0f077c75465fd946cec4cf1462a94c23935156412b78c13bc3b0c5dceab9ada90ac8ab60db5aefa194ea07c7797fe8537843952fd2c2fcfa626275d37e31da9e4ccf61327d44dabe18340429de298001def786b431a7ce3484191777928e9314ced8158c3ea8e836b83a3ac51886c4e8d470523b04b12c0e8dc2eeecde12a9cc60f7b6ebff74d1b80f0527e7c2677df060728f3455f7a41ec225d68c8fd8579603fa9d283b0b1c37a7e5568a19c1b3586e2830b848d02e99c4dddaca53fc844f1a25075c611859fc4e19206d7511e6e3c024201e88d02ca61076ff5210056b04017c2c22a71ee401e494bd4f7f985fefd0eaa0e459f1b64a5c723c562ea632c58793adabfded5ef5542a57da5716045e64bec5801589356b54dd105eae52abd44ac0d454f65a70cfcdc7553f8844295d833232334965459bcb2bb59dc359b221cc1e6541b33ba8bdd2994ec0e1b34f1aef368c5baf83d472599f6467bc44adc24ae290a6d0b8a8ac76bf3d42a0fc9f668b18bc958f481124b044e07f00618073b1925e58c15c162a9b830bd28f0e61c41b2629abac63472c652f087b0676e3b2d85f830ffd62ac5e22d87846f368b9a357c2249ce95e10fb9080af3a98176a217ff4d3d00a6e4bbc6cb81877c78e0356ccfb560260c3eac23fa2d9664fd88a11e08fdedd7cb6ec92ccd8b522a1d41008cc3c232bb64545679de519890597285d53b2671ffdbcb0dea41897c74d49caf1341b38640217cdb816821984cd168191389176c94cfeb9e17e068949687149e541f57a3f69ca67466f159c142a3af050b1549b8978345f8029501125fd07cc395a18741557f54496a191439f69def98e4ebd420bd64219404b58f3c91af362336cffa5c9eb0e42640bec22829b772c9eede40fd4903d2869df7778f7ecedd5774f4b100e746776a2fdde95ca10a3feb74a75ed01bccbd4516c332926999679fa8951155178a92b9c692a0ff1e3bb012689f538ffd11e70539114f90a13b0da116f6e3c87c8860ea453c91c4518a98921d5c6162d4972b74900ae45fcd8753cc61c5370c9d9e11ded5ad755fe3d0732817759f78221afb637ec7c57e3993e30fd67becbf4ae2db726811d0ddede8ec02734a435f2b192e4c8217c0ec681c956644890b25453d4b6bb720b1302676c43213334d24ad2b627409b327d1bec1ee3f06fcf0cf2811089ca9eb4326473277dc27d2523161c5617e954bca0df6c2a9654d1c3c4ac6719087917a382dc680231256c87b822c5a9e22c8c20d0035e542af3649632d6a533983ce8842a5e13b6482689a6641792c004890c1f19842737664dcdc43b4dc79fe6452dad542b3c48a7ddbf4fd26ec1b3b4be258c89f982de888620b28d7aefb09c469da0dda58e9282b58092d48f7e06fb59753701b436c87777b513159b43ce6aa785751a5b7a13fda5703f485c159a418ef0c1cb98b569e23eb32ad5bd151c5a4f75409c3e966de62d24c66c405825a5caf780d4868827bbb2efe6ef83e3543fada09ee8acd91b92a9b0a426799ed9a2b40bab7a9abc3c5db38cf3fe312c2424237a6ed5cd106d07b71e64f297a4626c30f4afbe78e2325258c0087b639dc9683ef76edc4dde00a1a83b73fcea0e18651830b82d60940785535eb302f5506faa736f3df332b86579a9a462e8880934aefc18270b8aa317628cbd245e60eadf848b366b064eceb7d199d023bf3f16100a7b4247af47512ca48b29a84359047501d7014628363ab2d0c0942d7f851b8cfc5375d3a63dad817a3b8aea4733952284530a9b16fab7827aa40cb3a437d74f5925b64dc5c9ea6ebba9a5c47bc79474b1cbaac42e3d8e96c8eac84225f706d16e113eed66a1b265f84ee753c6521a063f4b09ca749bb03cf7caa3a76c7f69e8b1f1fcfb99dcedbb67f5d3ad68d2390b39759ea25be59ba325308a46b3023a49c08630957c34f3ae33cb446b0b5c9b5e9526978bf55862dcc9afef56b072f2ead393efa23f8971793aca9c6213419acf51fad0cb2b6c17993ac0a27d94827d9e38e3a8725b527595ca7014cc4496c734fe964eddba4eec1b5bc25595712997d68405793ecb08b2cbaaf88c396dc02201d1baad3daa4ceaf59775714fa3cbd06802c95878d0f3431633bf964fe213e9cf56e1cbea79aff2313b56781c3b8dbf7e13aaa0849bfba71b82643208a9f129918a03d868e86987b589aa90fcfec0b7c3c4e4bb58691cb1b64593e2d5d923d4ad3175c5cc0f5173beb928e59f8bb6840abb9f8eafc30ed483b8fdd9d245afff0c2ae7cefa90b6d35de87e1e1ee29d862cd3885499143fb27d970e85722c5c52cbb3ebf78ad6d0e58a9cc5f238cb86d06ddc69ee718b9286c15cb7108c70aba2b3e70a0a23568e62a0943c745060c106e314443933b9a5e18adcfb1ad909891b11eb136071dc8c5507267982866d613a0ad7388ab6c2bc329d5ed826cfc012a76f19c9a3988218e8294067e7c5dbed236ceeb30619a490a95906d44546fb7fd59222729df91a7a510eebbdd71ac0972b124012f970c39b4159582f8f0850e028d6fb234f1244a00d7d4bc171e21ce81ca925d2e2afbd23d4a56eb6a5023d7193fb1546da43da033abc5fb0f2f2bc3f54290fa6d20c8bf6047381407fad8c58c7a92af6d5b0514ae1e97e74670e750a1d0d976830681fcc6e292f87305515ba69d0a87b0f01dd8436d5a65b0d7dddd1c1a4353ac00f33e38446398d9f5744f1deaeeb4e2e164462740eb0d351137a8b3e5d63c9362a538e21928fed3076071d05c96d070ceac4705076eed0a1f266c64a22826c8cd4769cee50b3a53303fc4a5bbd4e210c0d2645487d0fcbd224d63d8a5eb6be5ea590c1893c18a1f5a3c2c68d287343f743bd6d904ea00c0804893ecf34395237e5372b59889ba0c9d1fa2e302d13c2e94a021aa63df3faa3e80bf1eba8f27120e25845ae8358c62998a84a232c5b43d11a4f275bf5aea2ec8c1bab9842ea2614ec2ee030530a52ba9101eab409698f939c7e1206d1aa3199288e860906bf12451fb6a486c9a6c6bbf9bd75fc25246bb6136bbcf4719ebd4212226e7b97ec531c84c31f66904e631171ed4d55c2d0380c682eb5f7b8a837f3b0ccc8dca8ee36381b7f5cc9267ddc4051203afcde2315f9d4f4612538025cee70a924a19ca6620035decde70fbf2ccede068b1ddb27b9edb09e66d03ed5aece4938ac49a8edee848260b224bfd6e7962d97ee60f805d230c8d1dd279911c49c01ba0f7a87b04075784ed76de05730e121c45a9043a483b9a235152f0964b3a2878527cb45ebce69eac7dbb2ad2021d8d3e9178189e9f73a0b671b28a2384421a7aaad69ed778b30e8e077e63a7173e756f25240fbe40ad1e69156ef56843d75efa0742a11efea63ae4d076295fbe6fa481a0417f63b7b1e5eed1b5628f40e3c78686b2a31587c1be4a591bfa28626150f583d0bde714e8ab8c753552a4f6ab55f77010a542cba9d000980deb78a603befa003f74ba29b677d53a72da7eff92310c0428693d5ee7fbe99b32f5d4b6fe01c78a5563afef4336d82e1e2214e2db9389226a958270abe5b7264cf60315f5925058e87bef5637502b2313265f7a7d268c1bb5ada9008fd6c01da67c69980ee4761022d52020a4e2eea3a905fc41783f12068291f85803b834847ab62adc49313ed6f52c87ae37eb8f5204fdb9699cbcd6887dba04511866690ac16199ab8cc8c7b0827dd10608367e664cd177b3758d2d1d3a2bb8e7ae8e62175da57d71b007a244438b459b49ebd2aa139882d373b52acb6852b1bf4fe480a6e351d3a6847ecc255e889ab30701322702ac1f31cbfaa16fdf60526665a88cd1ba9414600720906d97969b2ec9cc8dbea16bb005cdd17ffaa4b2eca181e279fabd82e3734013b7c862760ce382162675d95269bc90612924f1fab6e883ac02697a89a58d4e89f567a4373ebd3bd0bbd279d5d20bde63ff24dc10cb2fe235f7a5c3735f09c3529571ca80b6c9dd9b078fa726bf31555992765c38c5c6480a32da180196656575e9bc1044b9758bce811411fcf7d2f79b2632ba4bb46e4f9c1a949e19f07684770459bc3546a743fc4daed6874e254238b7ec78120514ad4e40858343c960ac18ba84ba168b793da5daa2748615689ed5e1f8d6b3a669b61bb2c0755e472892b60e97f16e0e08557544c43e12ebeff854cdf4a867343e8c32c570b8549879b5f3e323d5efce881b44d5298a23f8d1ad7e026c2df0c58fdbad2a1d1f57286163fd8faf0414fbd9f38be581b686316684b50c2a5fa6a54e2b41462f21a7d503f3aac04aac67c142060662c32aa1273d0dc0f8fb4499947ea15c2d629b125694007e3aabaaad95c1c475def01edc2243c1529e16f86c6bee1cbbcb233b38414f8f800c2ed772f81ea9a89a67405e8db86dce67ac1e266818a31a1dae67ae4f0053697d01f3190302d1de03d40a878cd722ffaaa693647f36581f2b4427c7070a17948e194be98e3eee1b62663f5c03944cd88462c01711e99d943610a93f2351147d0e02f2633a9074efd3295c7f0fb9b3c6c1994c911950e2c2e8170e98f0c85656dcbf80bcda19af36be7951e1d634b7c154a5861e3df779586ad4ac54c34c42e00323b66e1c3f6ce7ae6688a4b7aea13d433bbc017a036ec43ceb13e264e04141a93ddb719f9b3c41cce03eccdadfb9e8ba4ab95dfbd3712054ee8c846cab5f936aab94c202c0a2949f90c9bbb9937ddca230fbdfb10a35fd5b6082487f18eadaa173926a8324017ccf81574eaad92f8ddc70d4585b75e34e82c643d70dae5a300e26ab120bebb5a83c12917324849b9b8f1c5bdf154af4ac99435cb445eb02128417149b91c116081bda59aaf18140ef2bc55207ae028835fa038ca06210bbfb11ac43c50a7657c687a24508b74ed3a693f1a174261006d245692616a5fa3618ef21138a308bc0b946efdd1d8fda64d15e9256b637ad0ef58f0bd7e7a0982f7ef138555a04b57c695924fbc242f4c9acb15afa8416d5284f21424517312199d119dde35c73bd8625e7a54d7d266eeedbadf38b837c9fee88fda35690429069b43fea9282e84d47117a465160878ac87ac67df5bbfa8345a3f86fee172bfff0c0a2184e9914a09b02dc3d5e5f9aca70c70c4db170e68cfa030975008de8a28e2e9b124792d0606fcce338d5e11dc1121afcb516011f4167a9f56430654665c78ce470fa902e53ae49807a477eb9e6fb4e03beea5c03eaa5423744e0ac17d1abc548ce8989854726e764ac4b1c109c490064d77c6ab5d3f9302370a9143a13824f53e13288f9d5b1da91cef3031d3074afd2dbb3cf4a6d7e9c13bae16a0e108297d07e69e248354e6d527f76d9a617475cb14085ac564085c80276dc57d4b6a41031a3feab429dc45e61b3d19abc7582622174e7f81d6337aa97ca672a64d5562679c80d9dccfcb8abb6397cd7f8527c7fbeb5af40ae8e64b4a278b23dfcd0bbb6030ae95940ed9d30f21281fb21abed9ee79ef14c78dceda006d7b6100514d9da46ca952809d4d42f8ae722c9dcbec8f9365eaf22820ac3b907dd7ccff00b164bb74fc3fb8e26ce70e49d8fbd5289cbc4e3198515d2e80ec75eb1f728a6cee7a557ac117f0cd8f189c55134ffe12cd95da9976b9dc750c1b48cbb805f6e6a0e8e928d4cb407eb2da462aa9deb1c0ea86a0a5fbdf9528b5af05241d8519c745ebf80d00271df256a2969e7c6a0be9c8ee8b8bba52ae4f9b12b2c1f7e1f6c6cce1241beec981d945d15d3557a61078c11cf3f229e81f670ab09f7aad3bbc055fb5d2d3d16912d8ab7013d1db96cfcea00e5d10f5c5201aea9dd38d4823f563839eb0e60c862e46d7f228f75acde2270c01685e8994854fe83ee3fbfe42350f4bec63245bdddc83de2640a841670c1e67965d181850347ce1118bc8e69f630e7036f374b6f382e7a6f5d065098bc505d3bf725c4128a4ef7e2a06facb1878d8d2db970ba5d807040a4a4e7d5ebfaf993092dc170719ebfe63cea2f025a64dba471b110192343732696ddef6f38e5fa7e8eac7115758fb971745998cf4e0736073a719a537b3e16d89e999ee0f0f244052adff6fdf2cb6a84b37b71ced93c9915bcaa99f23b01f674cea1600da4f57ed62664d4f120e8da4a1843612b108688b5938086ef15b7e460a15bbc0978e60c7a087725c212cdbb0a062b5d93e5d12792641c4f3bbcc128c8e6ed5ccc0851778ba5861aa36a35bc8fbc4caf891a2fbba244a7d76994c7e7fd1f2cf449613c71b72f16ba0029fb0191e93b45261e64a74832ae3c1ffd1982e5ecb7157024bafd75c1e5812ddc30591b09fd2e72e95fcf45b060c5a2ce914234cb65d1acf974629f98f274ed0903602a73a6391f4f6bf702b8cbd9a18a4ac92b075260403941e4fd136500848f702375294b3b47ef6e78e0499b33e4deb9cb658714d2219cbb93f422d78fa87f17553eba3224871548bf275b646056b6514009fb8a6032fc0e9409750f177df7f303987bdd75cccbab3789b56c794ec7f85e6fb232c4de00a4cd6e03d8ea308b25dc3dee58fa5762708185c82bf88278b96d8e305c9453c5b830103dcee14fd87d1f76da413cb7a8cd30f2e878fa02eae90bac34967f7120a7379d0e0f528db0382a694bfeec64f772e546346ff0170137718ec7d2a33bb4acf155a03f18eac426612784d1ef466f4a258081482589ad54204e5997f3e92c2c1b08190ac78fd80aff472a37ba9731cf50f6c9f56afe1109ad1af84d10bf5ce63ff9c609860912d3b6c06ee193d855de9ef3b41049b757f5ab942cdc0df858e16139267780795e100e04503cf320a1fe06e3a451719a441e40cb9d0e78dad4095f62094a27b7b437232895bc338f5ba0b4938f4cdc406942722940c851e5cfdfc4b93691bd718fd4eaddb71d050fb1c37cce18dc3617782509c7175bd3625fd4b0d9e89606eb7fb2b00a0ed54839804260142eb72a4477fa1c331734e13798affb63729d209edbf4a50c4ca900a98bb4a0f358291ab785632966ba14b57b92ad73e04fcb49e963d07fa266dd8a050cb1d6a95eaa7c18a8c225502e5cf8d4bcccf453f5998aa177e5a5a53130ebfce7c7d7e76ee4c6668412a52a044d6fc987dcc133df96880185254081c738184688e7dfa69fade9376b03d5929143d3e480eb9d3d79c42865384e3f24eca2294d5a8dd6947442cd3ee8c2400cf18127261846273c3362956c65b11a2ad147e658006d611c68fd564d557e73e988ed819ad84c9b5454455adb63458d31bb7d121ecbde3e5e98476d89485bf05aea48ac27112c4c6e1dc68435c69467617ef027f76b7f65ea0cbb34b5c44ca0d8096aeae18832b541f515cb59bb64f6a08f7d8b69314824368fd2f081db48c7ef890c3b7799afa9d2c18201ab1b2202f2e42dc8f672e13f0c9a2be755776c3772181490b98ebe09baaca3d6f4b3a64e93c74803dd2084e34369709fb7f5949c739727af81c1707ff4cdb8dadfc8c00814ae121090c48a9af2bc882e73eb046c1e26b042c46dc3143ad20a78110a0704374546e3884b8640a5b06b57ae60e9600b574d4838281571522703b89a54526930c68a26c3c23f53946535c1d93cb7dc2e21bc772fdb4ab067aa14da4b2719be6416b92c707a27622c55e204b34085a743f77148d6a88972d6c7c3d7b4ba2600a1f59f2b959927ced9917331e3b8e5cf5fb76bf1b2cb3108bee4ff0d0a7d01a882d87e30140c61af2d3212c971f7ce678084e8eef547e0bc65ca54431a0534cff6a4826982847f2b6a8662669b9e48064c6a7e7ae0cc52ae6655518ba5765a7d2c57f4a7c3850dbdb2e5b8f657820f72dc215e34dd75d49c42454afa42b118ba87e195d562e56c346d57d4c2da3f5b094fd492da6b96b41737a2e632500f8d0f67f53414132b3bbf1f17b861de0dbad2b0f1299f402e538ac08b200b901d054222e08f4828b6e9062094cb11f3578de02b4a15db227bd9a111416762043725c2d7a533a518608a0a00ed3608a1cef5b5b0cada9dd7f4474236a6561362710bf3350565a1d7dcef49c17775e161c3a720fdadeb4f45696ab530aad3fd4e190227d0cab95f0ef8553b98f6875b514696f119c0a18c7083336aa63912d980b351313ecc3f66c27a4e61462ee23a0a7303be455d81a6b5140fafcc1a71acb192b30a80b3dbb29d737b67a2238e9c7d8fe553028ebc9726f6391c81a88f33a83dc9e372dae6cfd756ac34336d1cec50485f887843086f90d11b187d6fe9e68062a59a86e14f646e01156911e652cf54cce7ec15d98bcb68b0402c29ef3f8b2ae24669698192896d29aea2beaed1fff9c63aab186ebd93b4557db92ba813bdc8edddcbec07112583da2333f62e6bb075bc12c88f7c87366230b7ee84a3351ffe7952f8c03a0affd90a56745a28dd8f3cabd53a33b7d0e5029fc6af0a8f8168b1fd4364b1c5e2ab7fc0a94a2b4bcc7904e3bb3f58d139c2dc8c5e92a334222ec27a10a1cee06c18a2bdefbde33645c916d10ecef3e38994ec8a8494c2aabe934a70cda2b8f31e1649082252aebc457394d42cbfd0983ff21625ae9a7004aea66aa6c3b6b70817d1bffa9e810ea5599461276c1afc51694fb9357da37fd556fd96de313731a7e92ae2446715380694f9f8f3a652b8f5cda16db33442f575c54c7f42ef0da60bbc456c8a5323a8c410d10b8a134a49954a0c1a6d7cbebe91463756f0a526aa7b369438a8a6f9c8110a68433f6c35097176ffa01fb59786f85ef4b2694518afa5813668c5222faffad826b97ec92c8b0739989096e970b366a2b2fefde632f3e199cf492833be9a54411d9d78c536022ce502ac1deeabbd86a49682275b51ba0e797c18fe92708457230ce35cac66d4701dd7ffcdeb316fe4522f27a3e099653808749ad7d87c7518fa02fee83c10e1067057961f5a4725127e11a210ff99d0f9065629632f4fc0e82ca94107886a2f40a37731c45cf22c160962f3d59129142d642263f280a9571fd1127679786cfc51b9ff4b9f25f0d3da7b2294c84f3024376cc0932069de82f3141823447403e555fa6e04d6511272cf0d2228c98a2749be9ccd2c0292d060e4f2012278271f012e2c32b652360bf6e4701fe2b84adce4a3078dcafc8cb8474215346293afe42439bf02cc3d0da7d92979283d6c8f1370c68f286441858c61fb266776eac6f8dcf2c36755a16f7801bdbc9bac2d4492e6ebf76efe88df38f0d3b87e8c4a3999236902fe525b2db33e36e666635380697508fb3aea391b8978c6aa6585a3b3201beed8a582167e97a90ac9dbc75a6513902f9cc9c80216ab400eaf1e7433c306129641faec246b2826fb711a2b0f5a0d7da4bf0a249e5c8ebdec98ba026563e0b81ee30ba846e42d01be1374026089fa1e58a7f3900c1d04e11d15307900b4c784a3fda73cc3bd8ea1eb81bb8b232613c6fe6344627336b5431e11041e9b5dcfca3955c858101333642a04fb71b99172035d8070b5315a918c639043305f214c083388abd9900203e62c52c9c8c3382c276492b971746b4427865414beca5f1e2610ed5a27e9aa4b453083c5652ef161cc04f1d49c3b6ff5f40444af49ebc71e15de033589e68c5b982e1beab107b85793864a084eb38182c94d0ca268cb4d59c54d93be162f6fa4025baf51eca72dade4d00684ccb84fdee4d5d6ee3e7c85cdf13bc1ec699dfa0018a6e3bced9868757a34e860bb38475586ccb3177fda5b6fdc859b5600580b531706db503f2bf55a7416289fed1c5e877baa0f37871be7c09c0d0ef7b7ceb1301920bd49902f834f0ffabaa2611f08230fb4d2e7fe6e075c0a1765e753b899b6bb6a5c5a779754369f7e4ed93ba8bb5bd4cf7194b9580d8ddb60ce85da4e0bfb63faccb5d4778750f2eedb84bf80c3616f1f8542bea8fdbc22eb978e4a030819d8d705c0c4aaf12ba3f1abe4ea7316bb8a3f94d0e694fce11cf6c935530474e099db288d3fe924b72e99f64aefc04314e637a57454e930b43060d314e992b58148d3fea48cf94663b07f71ab7f1255924d261158c472bf0dcc1630a642afbd931ab7d19d340c9344aa8f4daa86be9bb031a1ba52f730573028c50dd95fe8e7447d39832e3cc2d5aa740196573a802b4b9b70313b173f0d503bad24f0fbd689e06a401fb7771ef79d80d88dc4bd36bd243a4dc198646261176094746ad89fa779a74dbfd518c23d95335cc6b5299e0d6467788452cd09106a3bf62e537faca88892f228851266b1c6343248853388634e9a733005a145c6d46ce45f1921a120864c79a9e5c4ff0a26603e681341c3bb25bbc16fcce7fd242a904b81271a8b07c4c75da1fc39925d9baaaa8575286035fe5d24571ae28c0af6abb6c96171e6bfd9c4ab18527bb2d018c6efac2764855d70044cc800b9ede4b6b7ec38ef28738a21933bcaa25d105dedc687e8b8189650eec4f5d1db1dd32ff0ecaaabcd16caf445bf47d88261c2f869394c525e10a758e30999ea6eae752dc4917c6d1deec71265482f4626aff6845f47be3527caceb76c1153b235776be5e6d2a4a4ae63c21000d750c548477260fe0891eb1b9e9f1bff3bd9de9ad952f1b4fc3cb47d12d2dd4da2e585fa095755e56e2c9b6aa40573bfbbc6f1a0a34871e358454c5c9faa2908d4b50bb10f403f1e381b35c9ebb39d00aaf58374b4917498563dd488e341b7c0aea43de8f160de4cb5c2a2883998f6668a48e9e21d96d04f8f07311f34efa84c37040e92591d9feb84c23f32a7d7ec04f35872b51a8438a9753ce82171e73e0000f2d7beb6f236f2ccac0f548b1b06b4a254df3508dbf3e37aad35604118eb601c0f4a2296ed132268a9b805be5a5851cb76970ee3385bcffde98f07bd7a968552abe772ed5dcbd45946dcc5f6cd302ed6b8570a31f7d356e323f12f77e24141f7fe9c76d60dbaac3683013e17af1318282172ea45f93eda84fb338432f4cc5d488ccfaac24c6eb676c8be18f9a2ddad0c7c02bd7f118d7d49c669fad6fae566fca49f9d9adb279d4b1e6333ff0610e1e253d632e83437d359ecec21d3de502f2fe217923327761663d93a7c80ca6c2ce5993b71088ad7652650605e8d982beb012c9159c317839d61d64a9be669f10e85d98d582c2c36af66b5bdcadf66ea4de334682d559be1555348dfe01e8ca584793797476d32eba446061bc900a050bbd3676c3974934f974a10d3dafe8630fec658cb812e00bf7b81586474b0e25f3309bb501781506e676da8086f2924888cbb7ffbbbb9df2333ae069acbc92f069e56e916ba901b6e9d82067a262d6700f085dc5a802dbe0e99697723cccc2e77526c26f15b34efd455aa20374acc9b6114c6a64e36809af56de7f30e72e3c1b27f92f1ffa46ab97bd003f0ea39ee3e75263c072aa9b567572814d68a0671fe698c82ec6003f6dee5943232214b76d49e39151f3069e13c8a378baf3b4d1d08e0fcd63e09b8c333703669bb65250270f60642dcc63b0eb78bec38955cac4db336834fdda5a419e9352c371372cec4f59928b60ee5fa87080c7458df60f82162acd52c531970f0e3a8394d1fd6ad860397afc96c67c400ca3f73f869f892af4b1a046ee5ab321e1f65b650a76e2ab4ef6ad459b23600150b76b800d6d88d3b36ef11dbb710024165580b33fbc125f073b4e6462a4d2b1a58f4ac0315a3b5709f7624e63a3dd1ba468739dc167c3887b3a9ddbc456e12853aaf91cfc9e2a2259cacf0c5794b6ed9f3962840f5418c6b772cf0724b6d6e3c3da2ac764d404d5e308313cd56ee1f455c5f79738b885cd5da77ad4a3e8e2b33995aef7c456d0a7f5792f19c840e0fd9b67810e2f52d7f503870003c3cf4d7508d50e2b6c55e5b93849ec62b24bc929aa822e139c9b57a6df12b4818a15622cf075f32e9eb4952e6bb9510c109e4608ff6931025cd02bd96d534175587fc4d3e281ec845f68dc2aa060e94465c30bac79c2f8bab7cd2b096e3b2ba66c8f9b18ea34813e2e172bd55d47ef937194cef571262da86eb9ab5b32d1a317e196499a093181a8ffea317296b928df806c3f6b39d64ad6fb8fc8a78b16b1da3275f280f95b13021ea4740c91bc8dad97ad2fbb7b6b2787745aa5a46106c7edae4f062cf1254e8435b535f477dc9f150e5488c20d88f0473199146c83405bc8b5507814d8811dd049c4430bdffba1dc7727fd5a25d5cc547b4b36d52a4b4cb2354dce4100ccad5b59eeb53617671a9c6bedb62c6ebd901743dd9061a73286ca38b830deffa0166562a5b61fccbba29db1056722ee328bc16b77912e85b3d807c41b0d4956d295c6698e070645823240216abce102d212b3ce13a24ba87c5ddd6ccbcf6238743943edcecfd462828d7c2ebd3be4af91e738c60686a334beae5266079160d4aaea3cf278132342a6909cec0090eac12b2eb41bace7b602b7f4e23a7eef8ced7ce0996b3b9891bb51ad6f799985d6850c0225452228c159eec8056261ef2ad00d85bd12ae2b9c5e2642bb2606f092c714ee3c9cf04ae1e4af59d0e0213975ff9c2de2281884701a08c2806e3e876851db50256794bbe278afce23a36d95b7474a3dc80a0f7b6f64ba8d3e82f15fe2ed04432f147e9180561ee837ffec21a1a13bf5e304d39bfbcc6b0c4aaa71b315a4a0f7cd437b090cc280ec7d860fc7e6ee35315ebb906138ec05457f98b36530933e1d391c424943dec3701995ac57221b8a2fcc90063d8a8d12402561abfe833083b300c6bef70d9d53d1b79eef8ad7a91b95e7f1d810071fc6dc24d44f18e345bd4882f30d4d186a09aa3cc945293c33cdd60448b93432aaf85651dade7d436ba4f0e77a8bd038eddbabe862f7818be49d9816b3316eb08e47aaa6ad756fcda54138663c37475ef6184ac38125863b4066babe67e3759b7523fd551df3073cdaa10e6aac83c075303947d746e0bbe7c0d73ff5844b7d15a45e834601395651ff71c1fc2da244af3131809795685e3d11297b38f7b5ccb9b5663cc2aeea5664959d8d65bf9daddb1b2ddcdd87b2895b241a80e22b326d3563c80e56a769087346bbb94a9fd96c989f158fbe28377ea9f6b55684b4fbabbd525399ee01a086e08ff5483f33ecd062dc32b54220315d99098901ca28b3403e0f89a07a893d67278a02bd865366f915f1dda5a7b2c71227c5314a1bc59e8dfb2aafcf87e07433d25c54e9b95a526067e95fc40b6a6fe4bdfeb78f4606c5ac4ce2d1becc716dc2c987fb919d7cdc25d395f2b73d54c4cb6fae1351b928086be2694bbb87e244bfbfe15362386db0016d7ab02864a3ca2aacce0e98015cbefeb3a773e7ffeacc296df5c579b3d0f07052a1b9f48aee5f12ebda73f79b95031bd48f223c4b638f8d4eee87fb1ff9cfb295f2977cf8f269f9f93109573ff27ce7e99b8bb31d79d9ed602181829515d135df8744601e8179f043a86fd6cc057b06fef9af34ba30168e46e553c5b3e0fcdf9921db8a1a419f6c7babd0edad46408b9b270e863a32cf896b3a1ac7f25992fdde4579bf7e95ee1cb161aeaff8af849c32ef86009005829537f0a521ca54ca16886c3fba55476b23068d7a24bff95c6660dacea458e1006fcc4197d6b8bbd20b77f6b14bdfa37c5c495a6c5b0374f8bab7622b56039fdab072030eda1ce03d6a1330e0d33e0046d4a70667c273a5c61af4f0b193b896c5fb99a68b26f0a7b442001ab48c9e5fc04464eeb386d3947db3e14a2c38c7a25186e75330c5a816c210b3c65b43a6001f358bc0c6d8406832c32ad5a3002fc53b65f49ba405240e31b314f5aa1fa4dc9ee366fa7e0c4b4c5680672a4b709da37d2c9448ac1b8a317428590dc47429ae841e25d718682497dadc2044cdc57540a0c67e6c0f96033ad7ed71b48bc524a129c0a4e0735a397cf0e51e5765f56279c2a72d0dd1d59247f8abc64ca5d0519a691b710c8d5516f27b1cc6930e99243c1971c65d27414a9c34579269eb13b7ebc4e999ee7cdc39dcd3ba037af9eda42ddbcd9d882d2e816f85b6e7bea388e452b75b7841dd859f25219d08f479dde74cec802e86c81624cc7229137d0979b3ee3342fb7f949b9ae9fe467489b7b756bed08764e7221da1abec729c513bd42693470f36f84c8205b9e793515d70b8618bd0398b6ec7599ecd8c4995e481770d848d81b6a1d1384646521155f28833fba10cef0e603ab91a2ee3e0e0116b3a7685f474d41122cc947b33199d6262ad28b06047715a68ef2c94b329b38ce8d9e428e894c0197cc66e05ef783eaece0221a2437bf60084749f82e3fccf9e779e129c49f8ec1624134fae6852f8bebb967691ab790385e6c3aa4a35b88b9fb1c6d167b26a43e6d10c3ead4a79a5eaf8fb68903bfc5165311637b894a16a9c34eb438170f69ca781d6885d6a09bbf8bf0dab88a38a34f75d0f427d33b3d2a796156bc3929b30efbc1c1e06e226cebf61795a52104f5f95d470534bd0bc28bd19457a79a6649c7625820554d2ab695f80ca0c708f0cfd0e7d59515b81bfd9b0758fbd2b9d7bc1b59e764466416c7ac1cfa87320eafb891d73ac579d984a3a6d41d82e671ffff9221b7c57edcf2187bb0b2db16e0e445722a1dca40c78154dbcf7536cb2527d87f4d3b56604b63640b6b3978bd10af4ce70d0608c4c66c8d6260c8c802e26c4df85291528d6a0c5097424aa31a680df5ec9a41070144f342d30c5d8a4148283cfe5fd74a4a5be354baba5e725078d7d563fb4939b36681cba48a2ff5ba201ae93347547f696b5820b66e436c0c2731d895458878eda0d6d6e440d60ae1dd3a5d34e824b9cfa96dcd69e8329237df73cc6d8be2becee34b5d7edc53c9503a44138031a9be24f935b8e3defe95a8abb6540499a91385d55545dee69321fc1272d08e8ff0b8fe0a17e653f0254aa1f7fa368c6d4d5de4f29dfa8ff4eb976df7b8f554a571b34aa371be258ac0bd21078f044ab5154c9aa10ed56668627ce492905a42feedbcf234443820730740fb1ca9993869643364dbf4b4c6ff4d92bee72e44fcbeccb7f731f85d23195fe8015f0b5816b8290fb37505751b8868c5365152005b97705289c65e7315b5b69f76193c4f6dbb69fec77be5f305bf426917c0249982589d14a620c0685b22191c4a6365d17b8f92b7d3ca72c35f42ce9af50f627b0029ade625b103523a367a696014f20ded1862fe0e33ccb19092868b48ebb4ad43969951db46390c6940d8c8e80d74367915a7780044ac04df259b3db4c7dbeba6e6f56dc61edc215b69b283639aa5981de21d14b8a62599a0e59538442442b2235b090a1c5989d4687fcc93b9eb0c22ce8207fb6a0389ba0870738319a125d6326332756fe54bfd33f9973c0c35e91490469c317536ad3d848c878711dc1e52952ee89b32f939596fadcbd27145407313520dbb32e13c5229e35f9b857cd3d4604a8bbe63cd4cfe9838774a5d3a72063812d1b66e9fbf1591ea449964d4fd451e92f5daa1a5fd6e6e48a21a4814247ee3ed4e763511169e06f9c197fe00ab271b234f27f993c0c8011d1401b3c3db4754ce7a3ec6be141f91efc5a2de8ddbba7804f99987ac9cc8da33607dc479de58405843f2ae6ebc8533efd97282c32de3de3e835afa38d634d1aa87d76a9ebb0801e421959959cc34efa54b3cca73927fcf653b56de764a20564f4feea9a7a7c2603fb351a5934b33c0a278a49cf94a7822a52b35c4d70899e6d1a0e7b384553f4416387808b62bf3766ce0eedf077fa364347b031024044b52034989abc811bf4126830bd443ef833e5d92f47b1ba082a6232e46cd3ed6dde994c71ab76827e18550cee24921d0f157683a711cd58ef8afd3b27bca1f97afdec1eeb2ee009d895ea9dcbbc99c3657c7328ddb9258c1a347edf58200739425ab30d9c1ae1ff84bf291e616f5b16198da5f74ef9c1aaf881ab447b549e7ab1486cbefe1ca097e79ef0b868d7a501c64c178a7756f7547286aa0dedad17b2bf1c4d8608588dea2b765f6074d57e54dc95030e1a8601650ac749c9395b254de1a79833ee153339322bf006b01e7a43a4b15441857e808593d775c7a85587b56937194434a089469f741a236258cb04a3d5dfea4079e9fcb2711a1dfe68c3bc22d150fb499aaf431056d65079029454728b086999864e2e7fd1f968f72d37ce77601a727dd182715de56e0b79fbc661e66c289b0ad74037a5e536958fc95eaf2c36ea6504917550966164b5ebe2e668ce265135ac4b5c949f9fccaddee62f3d9e5905a91abf536bcc029b51dbd38f8e01cdd3c414975086a2124e23ccbb19818680b2d896a750999a9b34b826e45b95977c74981cd0fa9a64bda3fcd5ca96042f914493b8c8172f4e6558594275025dbc90509b84c5580809d22cbc017b9f923bd1c71b845a928bd91ebe31a50af6e3a9f38d24086e0f3d00688c88cf8b4ad315b6202ee7cb25674e5823ee5f269c7c281bcb207ac90438a56ec79a5cdbce21861819b798c98d326da3c06644a4870ed890150fa72fc24067cc40d02d856ce689b315b63d1c92a1619fbd9022bee6a94e88c25209fe68446a40b229005f70a4e45b509bc78fcabf4b0995ccd9e46d9058ee6e0acf26349a9dc36324903bfc6001880736541f402c5d40350d0e331b822d84ecf43295e28bc7ccebd75d1542a6b137bee79bf053816251ce6ce89883b1918e6f879f1a51324801c53b3edfeb759a41730f928ce53d70eb3a01608931723075b9030503eb38297d38f3b20a444952e7c4054a0971ba4cf911ccc8f3abfa0dff23fd170e0cf0ddab25f5ce308178be9678a6f7aaee4b1ff45bbffd4e1fd85d9fe92cbebb576bf28851cff3924e5ebff27c1fd184c37d64fe767f71f492abaaf7fc96ac23cb479ad16c5bdb4019f4c84fdf17fd2ef546278f4c27f937a7c1bf053772a53be0e7886572a930ba9a9cc55be9190a61a23b51486c4e6c901dc17a6eb4e7626fa93a7051e22163f8d34ff8cb2f151fe5879fc8ec3f09fffd50510b52cdad8cad8f5d317614a36048f3391ce800c49bd09bb91e90f47091f96fd59c1a5a7dbf47ef884e14bcc756f59815555016fa8cc0dc3fdf9de32af5f64ee14ff57aee0a26cefd51abfea360c8984add837d82b450da5cb2cea355f7fe47b63fb196b8bfec78be2756ce9eec2cae5802662eca7f98303388efdb864fd1640f6273d59cf1f32e1d81fcdfeb30e66b9cd800f5a33eb1f75849a41fe574d2c5f0d4e0cfbbbd35186c238f2a7f064367c10594038be2e51cc942037a7c5f2b1a6866239920277ba1a65e7a60c4a23912883c430c41a09d8e62aa53795cea2cfb61624c836fb879a9574ac9ef68bb7fd00b5f3ca7f94766e9c9a7e225502fab91b99e0b8ed631c1ceb84ddb012b8e93836fbf77fbd56001b1f8b18b61a43872df64e6a94bb90c13e32541878b96ffcad4a8ea41924ef319c0a65e6e068b7317be246a2d1744682bed142da46dfcf04fc1656829a733f092bec40124f0027eea838a5409fb4e1fc1b8e1fc245973fa6c53fb9a9661b0c0f9e1ff7536a92488d09ffa3c1b5a1f0a4cc7fe88ab0960d04b17b4d8f79bde38f0b2b24f1ddf30a3fd75b853651b4e73da1c840a1f0fee536fbabb213292ae7b1ed40dad312024338167b60528609f15457ae7b6941e8ab01302c72f6db288ce77f7161eb35dcf89bc84d70d36ee6cdd0ebf1c6ed077bf5caba58ea497aff1d9b3bc4cc9802a7b4ccf2f125482d6e0d1c6c4cd9b43fcae01f82c0562a8fc3be3fc2e534e939fcf2aeaf4aff5b0cb7aaea70a5c1480de76e00c2b35b3a205851ff1265490d126f0df0614250de7dd3bee49b0b39e673f2e4a62cbd0dea0e1f0421cc345f63afc80dbc51d1901135342f71aa1d2d5862118c869d050726d2ee09fef3e1384078a916accdbdc7fac1bc9e4042fa26fb9fd80551a75c67bc8b28c6db6072d070f54dbbfcf7bc826fd172fb42ca356cb4c4a9761107e0214e95cc482d756a342d66b4b6618d976349b25b263d2ec79b53c7d439cb1bbf8a68d0bb0ad484246f111a908c2be6adf43360fc50e093c311deeaec42e0c5818aafccc6c815d3244d88999daa4257510c34b43eeebb2a608b674e2b3bc4c38ccf2659fd923c0ebda89cb2d767b7eb9dc727a4899a605b7f5722bb8882b280ae252dfe0a925dd002ea5db098bdc349b2d9a57d21210eb44c4f9961c7f89d136fb095f9e0cf685788fed0e2202cf27780eeac7aedecbd2568d63627683ace9f5b6c69d8391a6a2b61d18c967a9c050ebc93950dbff161e59cd6f843de895d14f302161659c0018c49e36cb7bd39bb81a8eeabbc06540c5933db06a557a904a3f9c56d9d0786e4118e1b4b53eca846ae0212f930d863b8738af580067a3ee5b6c6ef1a64c1c27215324817ae8ae9edd62d0af33f031de707c06431e6e2de6f00edd47958444e5e7e7de3da0349f4670a6aa1f38ed2300ac7aa606d111080b2695042cc0f434870bd3bf710cb5255fb557f71ac6957f04684ad49ac63ae19987e04fd0981f4930dfafa236c39610edfc18040e8fbd7afe72dfe70a04597c197fb41d998c8449dfef34e650562586b6d09a1cf9610559311b157de674834e0b051f0faa74b196d14074e5d78b5ac6fb2286efa45a9a1d1189ed4573fec3323dd514af5d0f5de4e4affc147d2af527a69fce7b5376a90a4d86678ca62e56f5cb250fe3796fe02ae90c4865677b9874c40ace6bc288daf987dea8c841964cc37dabac6b5885e52234433dd6b00525f3dfea2beebc068bff9f6fba915231bc603b87d7a227dece951b89e2c2057babef5c57559efa59b2f7677e183d53e718e978ca1df9137daf4359a884937b40596392364a48fa217255d2180817fea2d3eee3352533e66b8c561aac40a0fb33c0044280c7059dc11cd783222a481a0cc3cd85d985b13ac204b790a357a845fd1502e9ff07ad4c1b51885e1a2a374748c00af687576219f57b49e8521f7e46055b6d1ca53111570d217560686c50c58615b78c04c1e217d69cf5d5966d6a6fc20a0b5ad2d5c541750704a9a072628af962b36de467b563026438d740341e4d359759609402c1935ad60eaf6f99d06b02f8781af16b0cd381e06f58745309c882490170d5f546aa9221348173440a0a8f755f335ddfb2680a1b6975d95fee57ae0990c4714abcf53f2bf79bd03e8a8e8b09489dc474a958b10e62c9992caa0a5e96853d7f2c490eff718273224720119c453ae3cf13bb8b151dae622a1406ec6d2b00913c26423f6d3ad5f16ea1f1940363aaae7c989742b8530d7ebfc07c6cbee8dfb1d7911c91f1b18e570dec5182dde7846af6ffd200231b46629dc0b791cc674c0568c9e4ea6b8f86fe1ec81ef7ce5dfd505b78d36764fbd5d17cc2e357f95e38e885c71d3c954f17dd6209ca7d83975b9fbeed37dfc13966708922ff9e13ceed8baf7881c543790cb87f5d2f80643703c35c84351cec52905dffe9d645f08bede8eac7b3377119700dcbecfe8850b0d07b1a710a90190b66965916bace8ed1d34855886ae2e0b0ec88e0f50f61730a87d8a062fcd810156c26a3611373454756110286255659fe2515023ac282c454b70f80fe0629c2a5353b1802d35e33e619e4e4c06ff81420ba10bb08d31ba1ba20e252ee90ae239cbeed027d4af5f06cb7482ccf30bc254b19ebcacad8b580c44206ed0ececa6682e8f7ad65e77a43c663103b3dc23cfdcda54e48de000473fe9d6cecec9bf20dcd05e7b32b3ac8b71d522029809e537f61b796e185dc8d63e700f03c07e997dda89672a6e4f6eaf9058f0fb884ad6a6d3b8bef13f6fb76da64c2c90233b4455769bb06b6f3b7a91dfd753c986ff6157f6a7e653d96fd135e32b39aadab067499268eb8650fec8dc0261412928500763aaab80224dd009827262106a2c900a6273845a42bd3d07c5cf9f21138a82eb3b7b2be3b7c264ce752edaa35d423eb374da021dc2b617f189aaec1a368202bf297fbb6011ff5c0157e65cda8750b7e3adf2536720b8cb94419bca4a4ac02de87fc9cc95c1f64df8f02ea3a05e8fc19f85d63cfda3c9257231064f9979553bf202ed6582d1dcf75d8ab168ecaa3860cbc08f1f188a72fc24754cbd51fb5fac4f5bda78107b25d034480fa370074ce14c2f98e31a6340372b6a85b2dd7d1c10b65872871a8c89bb5b6d6291f1ee8c83118fcf4c6876d2cf246139e3c829f00c64132065c272dd26f5ac72cece4568586c93564d70375fc7d510ddb0e60f86a1f0adf11ff636dc17f622a87faa8226278d1085022421aaee77122a234588227dc00dbbe8c6066c38cee9bda5a9e93c8593b917ca05a114fc24e03e5775ec6095f9036aadd1e386bb00e4272617657d12658342e3426bed1b2278c556ded8d22ac052084371a8558bc01933caa1188ad95843ae00892f1479aca1f8e0c1f94654fe6a8e966fb04ad38c19ae7398c83f0b65d8d28d656215ab5ec576a3b6082e9125ca956472edcd6a12502db97b0bba51b225cbfc2e490961f3f3fed7880fa08b59aa3175cb616083a360c89279efbf5166a5c151d8d7993aa16adc259eaaef8c919bb1881ac1a2c0896bcaa74d5b72bb06706a6ecabaf198a65b58b72209d2378b9bea7a78b779289c2ec7254d75c3544a945e6d79cb32f42bb8a4f0b00434151163a3a4d593cbbc6426d369380a067151dc55c3c44113fe7b1e8da9612806087161ec3c75d206ea41feefa987d925e7de71b401fa6bbade669e311a6bbcef828393d468030486ad9d006611fa4aabdbb8abe9ba4aaeb9847216303cda8076fbd851cb33055574b202204a0c3c2c487b8dcd06b37c294674a88fc99b45c6469ab17d8585d2d106407b08eda019babdd79f360aab765d93f407d2f46c367854779e40c571bb6e430fe9930201960b2bfc186d20616637db5bc8be8be444fb7c952140884398ca66b1e00319a88c4f6b36451b2c899e79d3f4a8c5d5eafd4156c28b2ea970200342957ad083f86c10fb690b3b74464bbdfee0b301fbe685ddd420971c29401349a7a5e61a7472f3e2e6d676ef9ebbe86ee1cb50fde19a33ea892cc59b4222cad73022a4a917b128a7bd6b60622979bb85b2556ad77a382574afbcf15e4265c35577811ee9148a5989c3870370ef610b364f21914145a5122ddeb6f87950dd87e3c3ab69dc869e68481ae43b4fd0b36868e06a391770e823e6ba442b8b8453d80d2c7088bd6aa039971a91da348582c4e51fa7eaaa558a09d72d0cb232b291826038f626a44e4d0463751c787c021f6f0ad2dae04ca9cd1aa4d2466026c8622499ef7346d7fccbe7490f2d9df3442051dac959c7d784330b081fd3736317d2cb69ccfaa5f43e554e348a07c7a095eb4101278aae78b6991289f71e3a2357e21c2fc2e0e793a206011848c528fb79c64f53f219d9a6c5b81a1650908ffaa9dc7e9d7ac07c647aa10b15a8fd9c31be18ce4aca22f00499341521cf195c24a79cd18a2afb1a332650ab7802d8d1fe5baf5f42471019d50091b5ff0592954c789db462c19ac469a16ee40393b308b58e6f35104913ac56f5bf340e7a4d0dbae945c56cb7e0e1d9566febe127029447e204513d76f5fdc4a470be7917d9e972f0e2afd2430052b0a9f4a2dd4669f739f8edf1917bcea9c4ed0079fc420fc25f83879e54cfe90781411004cc33676ef018a598ccd600acbe051a3e1093ea39ee4d1fef0718bf9540164a5be16a1d48fb887b09f902676f91636cc4d9ee83a4ce38032c88dfa74628a7b1251732d4ccee2cd4ccb1ccdd36111bcee342406ea787c79ce397508e5fb2503af2b040a824356724e30a502179bb8c6a336c3371d4fc658935d4181f5c1a793c8f89eb10cf53ba5385894efc739781f1cc15a12f910dd0cb5fe0430a9ad4ad9e4569ac71aef71079484e34082b2df19e760f2a821145f0f7048d6f4146aa939984803a547d77255fac21e1c2ac6665f153400335f81a60630f396225f3e2c7465cfd14e6760b20e9d6edaf1bc6705f4cc8cf575e2c511dcfb48c8297d7e946c67bdbdffa73a0207c97c0ab0e262cb5a7c0b733a4bd8f326439cd44a81de72989a25a3d10853f3fbfdd1650b725039e2c57eac1650f9b10cc4473dc3a04ae8f4c4dfbb087ea1c1308b2e0fd02625aa1b514395d709b3aecae19c0c31c5d4c0283126e959efa474bac198aec8a1a6c53052b04857520e8bdbce80c7f34beab607e660bca8bb97ff423e8d1dc7537b1ffb2fe2a115d15c5bdd556cb94fe4475856c94c9e296ec990a240a0d331fd0536d0722cebe172aac5afaf47f25e366b9718e26bf79987f9202a9c829c20745c35d6c2e852c984ab202a6d556dcbc04de62c74ea6ab2212241bafdce3345136362a721c1c5c2019b6718b0a7e736e5acc00333d014d7ad6a56d040afde47d361f19c93947b37c97e24d47655da3327a9f594e46c9f43c58991718232130a546c03cc0c81ac3b12e2361222ec87ae6b40b951a126ee409e849cf57c5d66555399ebe38e0b95e8b2020b79363c5fbdf73e0ddf2d0f86165ed56acad1c83ffb6a1192ce5941e28d3270113c5100fa50a1ce683430c4301531c6e7b1de339a102f4b0e6b6db4f23b16b3fae68f4426b151783312d294e22f330dcedba593582e6af622e1fa298f97de5d2f9be1593b7786e33ecdc2a6ea96b036d7e882fd37e39681fef2b7c0ca90f464bff5e2a1933be6d8547859e972b94957afd0d0695ed206fe0b75fab9f04cc21ec242fb26c8c09024949feba9f5daf4012e25b6deeb4f25ef105f223b0c7d71fbfca6d43f5663f25c5ccf86c15670b0434c33bd77cf31563bbc19106981a6557d2e29088d67c468b07edd397aa99b1a6424687092c6ae79045722b4215280d7ac5f07cb1180fa0c91404b1ffd0c0dfcf0b41d1dfbdb1dc6e2575ad61f401f1f71827f541f9cac859a20b6e699450c1813eea20903b01bb8c29c003e2a4fee05091ca637f9e1fad0ed0227512a2a36bd7e63aa3f66b388bb52611d2e246c9cb591142f0373b06edf2c9fd78b7978f6783a1a7f090bf18bc5fad13bccfdc237bbf7cf2512431cc7c5430f313f0fd7d4884598b9cb2f8632099dfa4836a4a99296f0b8a347754e78c3e08ca9216a0423366b4e3067e76da5298f5aca1827f1d4bad6f03fa2db26c1c2349f32c0ba210bbcf835823c8c420880a0c8ab1b4824158d21b1cccb65b6167bd85c21dda6e3e50bdbccd0888b10144041e8674e3036d6a178b31d18ec327ee9a943954383479c93fc21a8fb543065b21654a118c13cc0f2c34c7889a633f4904931d5ae0d2405b973605be9cd9fadd91536d990f5974d7970239065addd0db7ac20f966b58c0cdc9f814d94e6ad31580f27424b7189e1d3b7976e03d52238ff767396e1c4f92966747657b04611fd9d63fe2e0811485ce948c095fa66ae95417786cb8a647c6074dde996e4f96d5200fa995f495de60bbd321bfd2ae379cda28fc82506666f15e7672fcf57298bd7c4b90f62d4ff8c2c8ba5ff6d285714264c6a6821324f29d794f9c40a74abb0bad2045c327a35cac25c12a6f60f64e035be2b0b92fa2ba60f9e53e183229f99d0b399168174bee85f673526349e43440e568724b72eb475515c35feecc644627f181723da4c27aea1a9d9eac2474b71bd45675dc744506bfab468cf8a0dca0b2b01c517c37ccef474b744b3baf5cc8658444a1c87c849f550b08a2612abaacbfee646a1bfb6a41759b1a0b44c0de52b38311ac897d613c277d5efcd100404515274294d4e93d9c1da388c9def1ba4b5fb66c18451f11eff5a5e4b25f62257a84f12aca9a08de493aadde18408532f7646c6bc75071a17773b2963e8863a8ad04f10f1cbb87670858c9773ef6195aadc4062e7f996f310e0f8a4d4aec1a157e4fba89a2646b5ecd292a75c1106a549dd58f3835089d5b00e074a822f49b00a10753b5bfff2b12d574d4e31daa9faf8a9c348e65b610a61d3f22769962ab6d4a853f17c532a59a29e36f93ad5c9db2ecae4ecb64e59a838b57e599d04719246a41ccf12cd3995bc7766229488946189c972b15ce6cc5924798dd989f05db20731dd2d2cd1f20a94c1063bb75b9e4832d7e84d6a1a4de7573e5673f217bab3320e470ad88db461ef4a5d85e6f00d782b8db003be0c420cccb532a782b8608a898f451c96fb7b92f3129d7a458547f8a928e373db2134f70a36f491a42164b162ccf162496645d1d8d9c4158ff59da588825aede81c172a59ac534ddf4a873793b168c1aecc059d8b5dabe17a2b865b1d32d0dd6ff646195ce9e5f07f684ff2394ce5f6e7f449b19574bf66df92abb02ace7520c1a4444789ee12abb63d8116024c62c7abb87e640e79ef8f18d96462fb8dd631a940e300c2ca9ade500ba0aae6152183d96bb6403537878613454272ed7867e19cf02678358373aecf4b66571b0f83f850b5a7c652e674ec8269e56348e02be54ccb12db18cd69b23767e7269993eeb8d8c5279645ca11ccccd3d2fd1da18d5afcb718d96750f6bc590184d1854c8ed27ae2798207ab7c2a3ae29907e1eff4235f7ebe8040cb990a7051891757bbc9593d08699c76d50ea016a7aaad68870448f34eefd45660204fa03d463e1c6409860edebcc3a27cb4b508ae45cf2d2acfec0d91f51c4fbee0c1bfa261c1c47d152ea3a7aff3a8f065a3e6b192892faf85a03efc5b5d6336941fdf590607ef8acec096c22f39fba11a00f6672fb08ddd888788025d740039f11758817a72c055ec1889daaadd3e73baf9df1625a0891e750604b302069619fc0036ed6c53ee25bacf4ca31e1fadd68c77ae542f70dab8826b00ed10106a541f99b5f54a5fbabebd0d991ffaa927fa78d560add28fe08fbd66145349c2e2591ee4aeb1dc256fd4ab7352f44310240b89fd3bfdb9d289fc9d437379c36058bf256ac3a63483b4e20bef9252c8484766c03d68ae5acc436ba65662a80b8ccb08de04fdb449cae5ce49c4319e60f5ce8fb4972ab858ad2e602af963f92054348b38249379e1ffabb2df5b9c220cb702f92a7062177efe5bcab725c5e53943dfba69f310f71d429d497d96ce300ff1bb5f551f305fb3492fca17de04273f2bac0194baeb838bb000d2556aebe7d40c31255ac6536af19b34a8a3a040718dc58f167d3d16551c87a017f87647a27562ef4830a5c0430b673508dd90c55260248731939ebc4bdd7abbfe6e5e081fe0009e79371a580ddf7e0717cb251225f42b267a87b675ddad92aaa3753463bfd230b8ca0421a22e61f57bc33b0d0fa1a2524643ea262cf51251f016a331f29ddb3d8749606f57fb6584b77cf6b90f742b7c7b4bd0c0161db3b173bc0ba93a8f554e5f09caef6ac7e5139112a92528ea04e0be8099047c3e640f55db57bd8969c0b7b5a99feefff4d60fb8fad07eb142c21c519129a669825994fcd0acec5602c9d0bd3b59470f8b43d8c0b730eb4b5dfdef619b2c01729bf2d596bc9125db0774e08a742d1a6cbc53f436bc485b1ba429198ba7cb428f9bb216e6efd17b20676218157afef3f81ed0734e471f72d90250c17a8dd75614ed910756f64d01f59be57060ab23c484d8f196327c48346d1929ad0cea5c8ef4e918a2584c625ad33ceff46f8952f4d7607562ffeeeee633de6d7a2fa421ef27a980da427cff4d45f5962c1a70d6b89b8ad58852aab47af230092d01cd60c98321b4aeddf0027da7273549306515d914fbc4ce5cd25c43ccb5ed24379381801557f19e1d7d2e14ee0e256d89ab0a422915727d16cde6dd128d9d03d11b51d5c69d7135534ca6aeed8e5b05881fadbeadafa458af811c91757f29e1cff2a0c5e12ee76c5f5ad9e80c4d7798fea8bee7b8a3dca2e66e4ae3980c203378dcd52172416d9855a0d0038099755298a1ae0f0b86acc3392c5eaf17c71bde76a3e32f3963e470ae263c00438661afe371977a22442d9b837b99251b354b08784bfbc3e21cfc5134a2c68a94bfc1b8027819581db89aa3763b775864d27c978fdc8746b1ea82581d063026a2ca293561a8b1c0decf1076a18aa4fcbe73837f959b7ca8216874b03103fe1a43ec22340878ea697d5d770bb87ecabf7d56bace48c11aff6a9b08309cb341b7539e3c707fde42f72c2166a044824360e24638c31065ad1b82692c0521a8871ed51ac032dcce313f6510e0a4160ce97a3deaa8e68eb900d87b7c2726ef86962376a7e36186fb9175607a6aacd97b7c406c367e85bf8f9a6355da3e167b538bec7bd541f191b1d2a0176dc2c4832138bd293b54c93dededf8410af2f72e0e37c4e033f3f8980617a9e2f4341798a5ab15a798d1660d4028dee75adee4d0af74649470a228571e9d94b594981a70a84916add37da6026c110e9bfda93072314f35a18f956a49698bb5fd8d12cb481e51ae5dbef7b5e53222c570be1f9955b4fc03d825b4061e195b5ffb07b9eeb3a750f40e848b817fdf24694282d0e17fd0fb860811cbc7565c19fb4592545b8fd971aaaa25aa548479b6a5babdaab57ac836201179f129a1333f085388eb3986fefd370dc56b88265e303ed6c0c0c53fdf443d9502d28835768ec33cb110f7d9dd9ad3f01c39d6585f8cf0b5d2aafd279c421edad415dc82ca599c8ac29caf5d6435e8cc7f9a52ed4cf5ec25372c543812469789f28fd8d8d96072da1262fc9b892ca149acd93dc58f18fdcfdf45728238554a64821c356a1ec56461efa9926f4a5e509b7715c341f4eb15237c60eb4c7e2b41340a0450b4d1c0173e7dec2bf4c0a7248206192cc37916e860be965b151587766cdd785fa005d0b20b2357bf7717ef8e240c619e8aa01c627b16de979b3d56cb8191983cdddac1893911d6b4dddee1591f6a01126d65a492b11b074415e2c07590dc3f015c1182b92323d2ef456a1abe24fdcbc12cc4f17b7734be358be389844cb19537b0527a42cc7a685c4bef8e4fa2991f0bebb45d38ba4f3f44cb51b3cead60c764fb02760c51dee1e32a3bb671f67585322e23e86173630c0413383e7335d77df0a96d0ad6a6161aa14a4d4815a3d7f6cb74c4337da781761fa92a77e06934966e735eee1f9340410151d5de5f0247908ac95e60d67ecd78b9e0794afda2c47ccf319ba1389eddd974eb73c23cc763b884de374cefb9060dfa5ffd031ecee0b1119600ce1d2d069986bb1f099c0b036b1962c54a5ab693fe44675bd83850079da9fab5f3a073af9cbc2154779793ab22e7225a272f7dc599386f61ea1a2c148142d37150ace6786b2ce67caf2fb90ff46b99a616fe544088d99d43549b818211980f5e374d0aadc7b38ba7162aea7e785548cbda4ae85fffdbf7afbbba4384c634bdf9f97d2f1f5bd540689501364980a0e47b9e9985154f91ff9407dc2437901b9ae648fa30021fc638ec2af60846bf3123027f2bd07e508da449c3a90701a4536e0781313defe21cb11482933251afbc50b9164c01b75f9327e7ba850d458f7c5c27632f825c9c4585885ba9f735b8ba78c2b56740d6abd9460069c5d02aa71814c5e4010424e079c48509fbd9d87254ec77dc26891177202d14e2a3955c91b46bf28b6354fcc4f99f5ea70983f81cd73b51d11e662407fa4dede007b5248697cfc3e000c01690dfe98597fe37b1b3714289b67ac7dc86f7b77db724b99929429b704f104a80477766dec707148a66463078f7b677776efbd3317a14c9d973017b219ac07180960383c2d2ae2869033e9d3592ae188e082f2c4154c18d8d431ddba278a3c9564aa2ae6d9e83bf2672af98ee9c7dab1c88b8a6e2fbae8e26c36b3b163cb8cc717fa640bed2189fab0042d82c160303aa444049986408623f758866c48b52dd2e7ad20b1e5615e248aa2488b6614082ba5052a5a24d222f145175d74d1451769a92864a2289b55516294a468ca501351f48fc5542a95ab602caed2297acc251689f090cc61be63c23277e46c478e335a98f9656eb1b9154571c8771e3063642fcb2de2d0c762624c8c4df1b38781cdd0bfc83136c4846886bea585c5863445c533994c9c899fcca0cc4cac391363be3391c4c498288aa29128c3c58484a702134a2975efee9eb5d65a6b952d1a5488ff7f57ffcc1f49a3aa2bc4fa081b0c8e87367c17a539b42d2f586bdbb61582a769e34c6c7928d03b27744ff70a3f9a2a5dc75f69cbdaa75572b6eb68784ab8ee5adf29ae11030c8c90439c40ee20ab136c249bcc1df9d32f2cb37665eb8f9b95c8de9de04116a315118ac9623c82c631a8729c4c867f51fc9ab5be93a5a4f87f7f1434e0ac22ee50074ef0f6f696e0cd04df91220a5246ad76fb82c2ad0341e4d7a13e35a48c897bba19a48f7529a791283d294ad143a186784513bc6bed6b04293d51fcc21c9b0a10701cc7b54c06050f1ebe834307997ee5e13bd68e76a45f47aa82ab64085f69c4b2d609a5b4d24a7311f1f0f0601ef9f1d42aab9492561a004a29a53cdd0326b96bd624ed56332cb72ddf0e494e8e0b735a9f0b3826332546b20ad1134e26eb3b6b36c8646fefd4913b3566f774cd09b87ae2ca2cfdaae47e7e5923fa407804d594a83c0de2314390134ab2224231598c870cea710cca525a60c4590b8ad6de60b797b5d676b693373b4d34786a08811ea0943efd1e57e62a3105d2fd218b92d2ffff27219aa064d908c857a8f29ee5d7e56971dc45e9b04baa586d569bcd66b3d96c369a1a96bc49cfa3fc87abc96469562b666a561af8f1bcf6214d9d37ddf6530d431d3434185ce9a8c1290f955aa1c306a3b00dcb632b3e8cc23658e8c3365f0aa750df89357540d64b524cc3bd3c13cde42c57ebdb8fde99424cb57dffcb9891dbade5184b7932cb32c7fc566b6db5542adab79a41a81431f43385101942fce1808f98ec47ce600508db8f47a94f4a653fa5f724b11050f020f4336f3a1f23ab905c1784c8f94ad22709e9c3e15aa4c6aa8ff69161a45cda409eb8d29ab5dd51a5846f79625aa4a2294dd38fb5f7ce94e40d759bb7a1a10a0299705da247f754fc61be4bcb98d84bc798a69fd7bcbd8cb1623725a48c892b8845ca903f73e63b3f676f4428d631a69096f144f20ce336d80de6dc57a5acfa7f251ffa2e3ea890ffdbed769bb79c6ab3b1c1c3906e45c62f5fab1175cd03305d92268d0680182e872b8f2d1fc4b1a4945f721314aad631a495ae8d58c669abd97258695d6925b55cb45aad56abd57a28c116a19f0c988e1065fe020c068b113d293214246b2294e46130a2144e5c180e3da59340c81e2409ba2f1216ac1949605316a1425c6bffe9ffd75abf4787bd300c433725d9bbeab24dee2a56fd731c676bc51c0854bbd51213ee31752c36b1660fdf913f9d65e1e8b85c978d2f9c0dcae1ce22011934f0be1328e528e59842a5505c9696c6a5a571694ca152282e4b634d0a75023f8f86e6d6d0d0ccb05e1ac8174b9c425dd673014f2770e9f34ee0d2d2d228e5f875266b39eec32fb3349868e84629471a6818979696c6a551ca51ca71695c1a53a8148acbd2d29842a5505c96c6142a85e2b234a650291497a531854aa1b82c8d5746fb2914ed5228da9530b3657574e9c7142a855a1a1dd3cc9f203dddfde481cd719eed4cde079e64ee0c4d0dea53a9e04085940d7e1256b9111752a9542a582c52ccdb54e23a2bab54e645dc572b10a8c32b160b9b3b02949cb9f3e2967164b1484d2c361b0b162c6e5aa06646d3e8c511a9765373a52865b1c614681fc78202064ee81e19cc005be31cede346264c1daf7b4c4832d913a427376496127b0002cdac58b0bebf333317df197c71cd6a0e8140175c32651f8805fc64bc930dfc6c349b5846486ee44648b22732d993f9a4a8a8850b9a24e24c9e96a32f5e80408fa977b893f867d8b13a09674448e845786791196bd10204aad8c50743465e94aa03b9924996ed6028896c68064dd88b172fc2ee9e53b646463264b676db368b5c33cc0dc607e01750e9839c6fcb38e6c4f87c25b1cc70da6208c08454abc9c4298aa128abd0aa003819df0c10acab6b309e369231dec4681f37cae91e0efb282b5a2289aa11677d947d93f1998cb229b359abd59a0102673b292e91424c868666cc980142081505a51e4ab2888c8100020821d0a0b63361894b450821844063004ff3311c36680cc05fc9279938138b339c414e3880afbb71efeaecec804016ef002db15baea44fdfd626423718ebe880401dd6010f309be7abe1c9dd417e98e3cc3b753adcb58f8fb64da69b4df6954c9c297d1ec98bff0f7b0ef8f89db4f371a0e2effc8162ffda7bed94d96030189030317c12872d2e32cc185923e50e294676982c5b0ac9a59a8d1c6292a584c1602afc4813c84c79132365bf66912ca51c132583f8a70e8f0e08b3ece15e62c29a3a17e46e8988dc81e92a625ef85a9029b661bc84f1c0b54982041b488211207b2d7bdb9eb20ccaae8a8d62d692373f4431029bfcf8bd10f48061c10d6eb8410c90c01811213f9e3539263ffea993b22c14a16acdd60c144262160a304240226c322aacf049999d5a8879451481320c31898e636d20d2d13c2676ca6ce2346de2f494dac4e9fcba2a13b0400465488d881f375800a302e48614252b416644b622455b84dc18628c727362c80d22642a03c06e298068cd56b843162a4a64b1f242873b933b4a96248cc8d2c48b24ae4cd08b1bdc0bc307395c9a1b865c9413183029306e23123e8c4938398c4e44318a995d530b3831dc0fc90c1fb8dd8a830b19ee69042c48fac105946b734749a221d55e80b99f3b4a12521049361843dc2f7794a42c2ec4242fb0580e6aeac8562a779425885a4bb557acc8d1e10f733f2b28ae3ff247822b747c0a8e2dfe562958560a8f6b4dc04b695ae155c5dc63ffa16354faf3f3d8621d8f2d4b87e31af3a79f748c8a6b4caeca99d18aca95b439dd87f45e36b7784c3127574aa10a787dc34287fb0aadb53fdc0659426e63990f4ecab55163864bdc76f7fb7d79369e9826a960f1be6e60b8af36aae1ee3e6407dbf4e1f50d0b22aec4ed3f6e83aca1dbb8c674406a8c104c62c07de34d164bc96d2ca7c441e99dd6ce1e8e54a526b9a2f55818cf6a59ed58c2ccb087013e4bdca3d216441b524a2965ad392d5aa7848b2eca66559424299a32d464766777766777164700c8159f26122560820387d8d0223ffeec0e47bcd793c58911a70991217f8b204fe495ad159f6007140c65b9c188177e2af5916badb5d65aeb10b533042830a29fbfa3180c29c84e72e068f2eb60554858d48f2d41669828aaf9e1e57a31a2f92166888c6d26489153134a170621b00922991b867cb4930e413c116c126412bf22221d0e2f364f052d58946ac871da8816645758883511c3d145e9080814457028156d40c85864051c369821c1d104ed28880788e0606244e11544a31caad150b8d9b25feb2c094c98e4aa88b1706d6cb872051e82d89e1283a231bb700205930683c18e44d1a202203da50363a6307eb860ee285aa49440cb0b5c50b95cee285a6090e40a102d4ad0aee78ea265091b19b4b828cd224c6389e90ac79de30548dcb152e852d0414787254ee1c76311e6be46c8d415e4ad706cf10a67e998d8aed0f1987ad8b9cab231438a9d5563b278b82f55b70a5f61a68e5f2d17a5dcd13da92c318feee964171e93b58345140fa878078bc96dec49a1e93d4154eb110cf4e8b0ffb77c3c010d645abf8ae90a02f36b4fffc71d6b8489232d0f0eadf4516b25eaf6705f570292a7016d93ba8bdce188dc12db2c16af6fa4cf8ce57eefb4923f3468cc90051357e220b7cbafcf7d5af54f25e276585610d79faf62ae9a2a06575cfd5692c94a12cdb062d34a369961ed1d8e533b9b7cb2c4e7cf4be6563672a1262e4dee23159a6489714c706b721fa9600308ee4cee2315845ad0eecd7da4028c862bd325044209181db81f0c421e6e97fbc8470b4224d73b7231c68710889323372a37dc0f071832a8618ae8c3f5721ff958c104b7e63ef211a44596cbe53ef201a3b9a37499511bb8a74295c245a3e570d16834174d872b878b46a3f9d72e1a2d878b46a3b9683abe3f4551dfd5c7db88aa48d009aeb9e3a2d1683453cb90728a0aca08e1c4613b2146feb8bd132de68477174d872b872b29c9f522486fe58438e10c1180c879e9fd2d9ba391ed235bc68cc9d45d8a31ae5f07a8073febb2b56b1b756e34da08a12bfc2b8e42152b57925cef2e9a0e570e575be92b9df4d2c33027c4e9300c3f10fc4cb7939886735c2fbdd58a31001f12bfa40b395c345a0e178d4673d174b872b868341a0d575351f46decc499aa2f9c2a3c2fec7a2fbd7be68781a9232fd05d5e49ac42a680219f913c94deddfdffff9d524a29a50fb8930419ffd34b7777772ce54bf9ff4effab1e67b2de75d6c479edeeeff56b777fa7a07cc09ffeffc6656c58ab52d15a2b5d514a4998f7b3dc8dbbbb4b4ce9af7000e4631266f84e030306954c316d3c95f3a8fceaee6e4b6baabf97af1cbeb057ba12bfbefca29452fa2ffbcaa189dc8ca59452eaf8e5b793c194524b29a59452ea81df077a4aaf97e9a8dbeeb7335fb9ee6a739a46536b28eabdc8eefbfa724f2f956259777ac78425ab9b6567284daba69452fa1ed8e0e1779f3add3dfd294f6d7116f5594ae9d3cad98e524aebed0429d64c1d8952eae269e5a03ecbd9f99da9ffd27f7de03bd269becc75758cc63cad0f3cc9dc194a29d8dd327786a60675bf199aff477dcdff7f8f4acd7c3b5d4decdda2391da331a594524a2b4d0d8a529a9ad286e2d777b516d72a3357ffdf4bf1fd972b255dbd5ab955df2b85faff5e2bebaee28a1072ba7b6581edb66ece4963ce3973e6f4e9d3e7df64efeeeeeec972ef6a55f2bc39a7e339fd954657ed7dce9f52cee67467bde69c73ce39a75fd895787e375783faffff9cf596ad7f73fa4c25c5e0e7513c29ab398eda315f393a865677ec4febe931f8d9dbe3563a660cc5e17dead0ee6581ec983eeddaf5ed9873bc9646e7bd3e98d8c3691f1242fbf4c6f3f0347926fbada6d723db9b2debbb9084d0860b870e04341696bda9b9412c83db08374f4b75c3803bab9532bae72439cb8194b21e012d63e21bd646a57d35dbf8367aeac84a95bca3bf338060a6cad10c3c7490bf07c9165b9e34501d2141fa37412808216a803283211b55e194ffffc3c712875454ca01c8145b8aa4859b2e2f9e40e7883f715552c5c95083235fc28f5a95e106a2039951f10521b38420e28b1c3822dbbe8d1995109bdd2391680890a932c00c63d783aa735a29ad1fc470054a7e61a32b5492ae8c30aa5c8162063e821a1331519d1626ae787de3b5c91b00305c4e04dcea9e1499c33cddd399c31cc7610018b935b738dc608bbb2cf0e3e66648cb6a750cae95396bf220777409c575b524667f28e7ab1a8ec3e15fcd9793c3129ce1309e3a26dce18a2f873d0f3768b2d85911086fa898a24409b2ad768616638badef38b6f8face636bb15d7140826bb1c53756646c599cfde1b0b5788696e369cd90c3ab2188ec0e5ead153f9ee1062270936db7188fb0a0851147a0c0d8e182b98f8ef03074bfdc4747720899dccf7d7464098e0bae29f7d1111a5ccce0080b2e5e7069c2e080e0aab0d4702dd20b1a2ee782704603c2881035301244d1f5dc47465210c28c14d9c8600829bd69fa899a4f2557396a6f3a4085bee3d66788ec58eeffff2d27f32f4ff3ffffffffddddbfcf1de3ffffffdf29a51eedee6e53edb8eeb6ffffefee9cbbc9762050e37777f76aa25e77ffd7dd0efa9ffeffdf72efee52e6ffbfbbbbfddd5be604de53072e78b2bbbbbbbbbbbbdb57afeeb2ad34cf39a7bbcf5ebd26276d87e7ffeac5a2cf9a33ecd56b26b7cb4e8b27bbddddfd3bb7dddddd4d83a3ddeeee4ebbdf7ac773ff5957a652777759a9bbbbf707fa40ebfca4ac5fdf7274e94afcd57274cc3fada6af6368fda1e72a1dc3d9aecafaf5e95793f7b4f6f7e0385a9fe3f073958e01673f06fe7e4f9ececffda9d71e88b912d3ff80f5ffb49a68db5775d8a1b5d60567bbdad3e451295d5c29c1126696ac3779ef792b5f1779deac6eb735752bef0329066fc870ac578ffc2c1a13ca4df8815352d938373ff89dba6350fa2c21acb5f7fe0dc2ca580b42ae500d342ee46082792f147102222345e6c8080c34b2966bf04f1d1f138d23188e589c2c13832c834f2090cc494b11f80211ca046c054e6ae311413c61e445952317828e8488744cf95b1c872d132d20c95c01321d8283231686402ff2a53c62416c2d31edac90447eccc18d122b1ce5aaca15ab00816a132b5635638523f9710a10e8392b5768e48a6d40a07a332b12829d5c71aad66a73ad15dffa43ae18d72752a6a88043814095e21a2247e4a7921fd38040bf82232235cc1459f98b45e6a60643029938a8d4ec5de88e1136400013170000180c0886c3218118071339cebb0f14000f4c783e5c5c2ea48bc3a1481003290a63200662180620c410630c610632a8ea08003bb571b1b5d28e6ab92538f456f188d0a93bc2db4e411b91dfb7b4856b84d6e480282c8c87b213b860ecba34d473f9b735bbfbba91cb070e27583551eb3da938d2af070a9dea78e31d45ae15bdbc4b472bb0e231cad3c4b1669cb35b5de25156c939cf179ee56638e10ccfecb6a85f71ca3d35163060397332c2b945e7be8b899d412132c255c1f44537de41fec2f8aa318cf66b4d8990abdc9bc6ec35b76dde7ac80fdc36a53e9d587abf2f40e01e3970815631636c60ab0a1156e1d4f90f3bb46b4f06b1e5cd616eefa50cb268764122a6fa3d35d117befc737f84ea8b99db2c2b047e2f1df8604004e03229edcb7c70a7f661750314339dbff564fcc0e9c9a593a0df6f6882278635bc7ad7f242e6bc7fc8b650b4fe4b03d8bbb5a6a20cca8cfb705ff2d320d58f8250d4e15356a630b331527f21d78f0b09784f078618b31f88b506c5d3532bf9d045cc023420f54490e05374bdc7cf38d30032a38b8a40b693497c3e92b0198836f00edbe47f10128bc16a040f0755a466aa3360164d6d76a313e9451b5ccb67e7a33897cb09c30f710a3d73ad16548444cb207e87903444ee736dbef78077cd2f9adc6e9d6d3ed530e1a06a5634c4d4df1e24d7ea482951f4d033d2e2eddd15e64dead564dc9fccfab1fb39bc2e9c18b095510f64e817100070a66a3277ae0f11241a121fcb9dae7e9388d17891a97f1a180b4c38bd1126224e5b5f1888cf60c1c7c3f6c8dc5c77bfd82b912b1b53194cbb4a049af1ed9f20d4ed3bb4663028c538739f5839151ced87d66d92105c67058f6ac9c9f2c29ff0bdaeac1800e4455c7948ca6556a6abf7ff36e1a195a095bbf4daa9614e0733785d569c6900a7456c9b1520e50b3485d0470d4c4ffc09715281b1227c1a850f98634100e43b1cb279f1ef91e2a0a7458833734d31443a01cf2af6409bd49ccda11d47271ae8d5ea0e2b1df7e0d5b9e358ec19838921dcbd474a9b967b9494b4fd6918deead420956a79bbc567fa0f0f1736d0a0c00ab61bdd61fb4dae7c1c1dd7fc32c05bbc67e5e4884425336fc30b1fd3be75c93ed4f1222ea65960f253ca2846d2c0f4646142dee13f2dd0a4587877bb31b64186d40d1983b70503c40c61f9fc363133d3bacfb6e5a6d6eb386ba0c6d09ed88f1daf1222abdd5a1fc352bcd6c50ff4dc9dd38c2c09b5f1fe02413f3673684382a1dd44ecf827e7fcc956669913b75a0ae217bc764f8efb0a243667170f49b01417109bedef089cab7c89c627a9f7a7cd11493dd61ad6b4764e46300cc5ac8eb08f3b448148dd44a212f5437073bf71efff21b519d91fcd1729f4fc7684d2824d965102782691e37a21667a4a99c44e0950d4c7229be3e1faf9d1031a03029070b454a7e32543bef3069c915bac9b164dfd320658d64a7573dd8875b1376feb28e972e1266fee6bc5c75bfb808279c340a64e7c16e01d88954b8a5e38e6411fe04adcb71e5b9b20d20001d2c3b3489378b067930d9d171d2166ce7b6059692dbc6b14fdcd90ab2ada6cbdb63c0177a94aa6ddeb62a3139d49bfbca036d955ca5d145d29616274e6074620e8250891af575cbf83f6842ecb19b97a1e8c4e684d010dde9685cccdc21916e103fb0570e37e309a892693f9af27a698227b21cf152c854629ca0b34cc9a11a5b82278cab805ef2a2fb4aef2a3de8f203ab31848683d4360d87393e574bdef9e349ee0a42f7c1e13f0e620d005ee4364af3269467a237b46bda1e525da1d3df2495a4cea457a4b00acf0597da411502a56c7e9d3cc79a3f1d3096b2ee52a95aee1640880977a17450e8546d5ea6f0808b0c8f95c8815b50ab034236e2203c299503373d5acb9164df38d7cf932b14842ef4986b174a9b2e4b87f125d2a8ffd96d5517aecdc05c5158177925257489e9d90bc2cd2d0a534717bd0b2e8f6d4444f5464642f883294c9468ce820cab0c1d66012be6bdc7e47b871e7ee9bd53748e9f69a75a1895a1ead7aaf550686e75ceb529576945f464141c587a4cb3204891a18e16122232c485208b71c93edd5ec52daa140c96dd4f0b30dc7845f615e34a5a515e7cdbca068b8b1767bd0a3711205ba86ee9d3466d51622022cf2c34f7df617bf6e2ff800f9fe85e708b8417cc4e8943b75ab91e2f0117867ceb8c38142b34a2ceb90167101b8de441a66b77fd6e96f6f826d3006654bd33989cc79ed8582d574a764fff390e2e84a2aaecc89409f8dd638dbc1c3b482b9ef0f0c0505acaa620c53473345c9b22df075a3130245c7c962263f3b1911645aacfab545a1874317034359eccc515a07d2021d340647c1d7cb00555ec111cf988773c93042087c75c7cc67b354c5d2b3325c5cc260cf05280f81744499cb1bbf2556b89e3866e94f2fdcd9a112cffc07d51feccca81b3640ba1224109303432c4625229f5e8d87c620118894ce78261509d979c5a7b1285229d5c3cef4e688978c40558fd2b6350d0c15359c7e58d328a8326c6eca1802fce969b51ac6fea73488359b3c192ff8a0ad9862a79f2cc9463e5957bc0008058878fb6f122f4dbf4b649f0e61cfa6520f9df547ed9cece0d4cdfc2ca233347ec2337e9d0bb503c31b3c221c7080c828dd2b5439409105a0ebf1bfce1bc31032d85921c6443319c7b75c39cbd2729c9d510ddd074fcf1c422cd6adf9c80a7c3f4b091a699d1e5bec8e3bfab5201c630048b68043c31f3b66df91beae21889687aed006a7d745e82c50943cdbdeac4f3ebbb56b81c14922723d8f1e163ab24604b350a78632168fc3e30a1ff41d0073f52684cb9f089405181267286c475c016b33f306eda46ac0481d4fb529ed3c348860a38e373818b30e32f97b8bb124a366264276c5c5dd345b9b1fbede1ee200dcac8e02e2fee8dc9537f0c9e715fd6f6554e15ff007cbcee52bc1cc1e088283179a5adc121dc5e240b593518c8defdc1a41a12ab8ca33f19833ad77a39d0d80c2326f993ad123838a40757650782cd4660d175a2ec5195c84a008d94d24a6c4280f6eaee278807d2de44401291366e1ffb067dce109852b637b10695bd1226258241652a93be4959341cb5131f29e57c7ff4410f8551044860963b1130428e467c38a12858bd45a9504565d01f6ba0c901a2b90acd357d4e0094e1bc5e08ee580141088ea9d41bfd321ee81d8b055e759ea417e1ef71aa9f3eaa2a9d730b028a003cb997062e0cce01c6842ca64c94693d1a10ef3d0ced97afc87991acf5cff9fc785f2a13632caa1976a054221de0d73272465f2ca3eaf7f2be160f23a6a61b8a24b5b6b2283ea1ea3bf40f20c75d8de09753543dc80730bb09e6df2515280c52e3a4d0861da1ccf871f04f18a15cd8b00ed03fa5da1a527bf617a5d1e071bcb33e5f66559a8dd31801770a34e0acd35cc1882befbfb885f41bac8ce8e1bb42b18c16b5d28ac308b12d90a1c20f01c405c8e8f5c38a8e3b09bb614d92bfa3cd07b5f55ee47073e6601423ae0d1cf349a2eb1a6c3bd4043e8b156d764571a3b1eba08519a686bc0ba4ec4af54ade220078b463b1cfa3f5051854869fce246e841b834ec0683c589fb5bec071f3642bb2188dae89042bb2cae7c6f76cd42d1054316ae824c36750f883dd77d3341c56f9837ffa0c86500de8a297ab5621bc4162ac042093f2349de0dbabe6e93cc8a00978113b173012111db42b857dd4c08cadcf8a9f89443f87e9a8e5f46a5a5ea26e805729e8b8fd2053a2b84de1f9794b99dbc9c076c166d61b321b68ac2ebae1343e839d7436e9b27873c26988b3b56eed102b978223ede406d382c081d5458164edaab6c6da1407a417eb380dee5721459c8e641d68a30319bd2ab71c5487b42b07d183e763c98001f6d913e2f1a2aa269bbf0a462c8c10ac7825ded2b39c74d3e2f344cb2922bc3f61506bff128bbbab4e6a70257b0a5b5cfe7ca82c838bcdd291a078233da2638400e2b1a1a1e592ca09c584dcda74a0fd30ed18dc5121838921208750de5ebb6442a13e42127b3881d997329bc0223bcdfa30a29430c59b430f5731578275dc7a8b4e50e2e77d0838cf293122a9a680197c2e03cb49b35d70cccfc043cb5876e4176adb22f4905d8bdc2cef495263851d456c36deeb236c50b70cf770b28380ec20c2f6b9f9e4108759127261bf535613e42e2a3767e140bbbfc703f919427277591623c6141a4f50583eefd812f158edd7841af0d01316d1bc3e8631a501883b7328caf40244e9f005bf83c6a7512a4f51ee94de344602d96f05140fd769a3c351ed80d9bd7030dce6b9c0e913988a4f0b2db1dcc8feed0dd28253b91e57d19330738ee82f9cc5890617a47ad0bd3d229c701749d200d2eb8063867707fb3466ae9a72e7bec7df4e2baf69bf5f6ea0de4072a8c3280e008afe7617cf388fded2bc9411892cf9532963c4d4f0a888f743a98f44ecb7fffba61941e9989f0002fc604a06a4c00562c8462ae47d433040f0d1c90891ce0491294c4c5c985bca61919ba3127adfa366db86b6ef2433397c862ede49572217db7d3b21596af8996ab62446dd79eee7239097707ae3610d7deb6435c9bff8e6d565eb652904d46badbc1f11e393ad78ecd64033bb1594921301dc629dc529fa815df6601c1eb1fcd4439dd9a409a59c8bfba4990940a014137357311a94a5e73ee3ff18abe813048a9e0d483926f9bd68e3d9e5490b35140b0bb5e31ceba77ff8396bca321f38b385b902f493c3a5b5bf7e9afcbce86fa1e7cc3e297270f6a68952e9fabd6377b0e946901ad59895ef6c34dc4aa56a899aedf3fdc0d14d616fb08a5ecc89d2b333764c38a07faa87460d064f557512717902b37029eba00d92a44844a117b8374d5153c65346b3e22ebdfd1c20bcdf030ae244c1770ddeea3a86995bebcc219107f897339b5269ec8e7cd46c53fc1b0521b36f3d7c94db3e2675aa9ff644b4d8ec76b75d84f9f4ac72cde4a7c4e034b2107a7081866484a7da76656423629593a7ca81c1e9481d0d41967e3cfe00b44451936e111ce5ac1c2c64bffe56c05688cbd1a1be7a025db666b0d717ceac7e7f6dd15347ba1ea26f8d3221e68764904a5d1ac3792eec48b8d652a0e3fa21a4eb727717638d83d3043b3e7f4f32560439dd21b809d36ec81af37ed0b55d1b89a757f790d1a397846d84d5b46696a3bd6a6d12bd68ff7851486b0db7e628759e7e297239afcd881d99ed3234e4a13de9a74441b28c7691985d35ef3d06ea8b388adcfb0ceec20831ada9eb4e3f7e7e6dd1af5c29b9897ae57dba4e4714a3a5d391bb49c7672602934d403e6b483f49099910ee98983ab6eb252ba4267ebe742cd6cbde53de7b04cce4cfbb227c4dfe72f2d82c7d65eae4a7e3ec8cbe9afd0f97d1a2f56a1130635012ae1222b38d216204882ca83aa80131625dff0abc2feef24b82846646a9ea9ab2af577da7a720dec7a8afc11a70798c9fcd702503e217f133a1557a6aeaad46f3f2ddab59050e300515f8e4c9bb06a4644579f066dff9407293003862807bcb2caa5d618349f7bd81299fdfde77c1043f7777e7fd5a0ced70cadf7cbce5588020a266fc1fd8f6c8ecd0f50d3d056eced0e95c5e6c00d8b4dd0448adacaf0e69b5c067607177c61748bb37c4ad6f02eb6560146352417555edb29d5d1616a799ee5c9fd5c092ef97f9bc92646a9ccae6bd7324de5812d5d5ab96a29b07aaf86a66ff0b7e4dee6fc8d26a1e92e2e317991507a1bd22201fd552177d1e7addfcac2d686330095d4be520e15e94cd0903b5b9b1bbfa03edd82dc1871c9d12e8ca1d6a4e6fd337b3a64db7fe896f2bd2a525899bbd62b6770816c21cf0389502280194cd9f91c39083da68306f8567e6f70adfe37e4097225d8a57b8edafce75be8cc88dfb0c4118ddc5df05c32d406edc8777dd0e459e4995d5d1a5020e38fcc2c3047f134023aed8328e7293dd1658bee72a3771b40f9036cf06c8c644b5e5334dea15f3e991bcf92ed441ed4081e5a1c1fb9396dc9da999c6caa5bf237ad0468633090dadcd9b6eb53a635d3d92e8f572c9cedf4076e34601040c3797fd1b619c115b48003698612dd274322a0ba5e6385c499cdcd04d7d96aa41bcc5d958f03677d18e9e0c858c7925b4147a189c9909f24b62f1855db48278587d726238e474971208fd2f23102564415f1621c31b5ae7020799b151f659769a7e71f01baaed61567404a65dd1c2ea7adc9550aeffff50292fc1161f0b104cb161ea6a704aad0f460b244c109e476304daa3c2b3898c466e574bb6b08a5308e64c2e194f3d050d85b81ab4219fb074758b2bfb847047d8dd29fa7ae882752bc52570e8990732144fc371222dc249cc9acbcd1613cdba85355700d5243166ae8c798de09341d44041bfc8e87e8087af7ba75aa7d51eafb78e09bd1740d58138b81f0242c2cb2db38fa7da17951fa94523bdada8a641129395ab908721a50721ef5482c106fae070630c3e84126f2e7026e2cac916608e2c9cde19bd584076d4e58ebaf2fa0e416a30058348322c48336798a719bb8ef477d4d5a8106d437baca5adcfb22ef9486b7ed95a21fd11f5de0d52d56ef777b0f86faff9bd024772878758fe0ecd4b4906ba855af06d2cf03f74d715a82999b355edca070660d5f4ffc81d5cab272f1f3f803edb52dc222d207bef40e0751e28314f23996faf2f444c7ae53d6193bb016f9082fe5f724f903710fef65f740aebd792c13a7a45a1fa03e6da6f334c5258f63d4cc66950ff56003518be09529c1f3f94197486ea0ff39e67c4cac99904fc4d0baab43c29e2546c9c013d50cae6f2c49f67a528cf309083eb0c44671c5fe34541f08090dfbbc6544a650d1c8db8d30eca03e0eae5f27e2cacd570311733551af20eb8701fb885d50e9838f154f1daae4482deaa00119cfd741fa0953135681e38c633b0c35c4b419830863958d5e895f8f14616d5c7565d4fb6404727bc2606092825728b4865a8bbc548f55954552e1aa0a4f03930a48f64f8bbf242355c8c5f7a288b81d4ca01020f1799afa9cbd4f76d8d52651e10956d0aa1720528924bcad9e97446a1dcc2ecccd12493477e6994fcd031647126bcba93b6d09f80ef115d1b8f5652778a10ac4639454dfabc77057ac09f3d69b3e2998a63d0b5baa4fd16cb1d8cfb8f9f8fc496ed431aa7a5748605d6f74eb7c71aa5eac94662cd0a61da51a3eb3240a173821c467965f81154a185713cc1d94427a9284467750a918345fd158c7e1b30910b84dc5b65d2f8053252b006cc75785abd70b4263d62a80233ab8922ae393216a9d8a5674c12ba44111b3ccddf2a7b02e22f6ca7e5ac943ad686f0a4cd76c5a826fe61fc45a676c129b8383021bc4396917a802602b4271f407ab4978046c92c1ff39692fc6bee0e29c46987074c60de4820260195e75091838e8dec05f427593b0dac948a1d76c265f0489d4f68ceea602d18ce71506212d51f864e60c1ce9f77eda39433b7bbf1a0b2f280cd9d524392b4ff0222fe8a62acdd6b36c2c2a64c07b946ad2567cc2ced2d0d9e1e3d6a56184c10712988631762b92f137d3fced2037807fe6d21ec72827813d073f828a6c3b5bc573dd7a60d265e64dfb7476ccc961827600a891e58027bb7b8f044dc299d4bb0435902ef03b31fe65845581c192be887c17cbaf7e9ca897c250127141ba4c5f76c0a3c422999b39b7b52a923d0870078d55058891277ca6b3504582dafc146418a77c22c0dd1cf99741164506a70169f1855135760b3494832766a53947b33bb40d7f656b8caa6138c4e628ed40169c036c4e3e2386ee31e0ae55852b5a769c78a6e2a9f7dbb6141765b01f0502955608a78a7098ae16e75b19590c20a47359c6a144545628fc390d1c8596b8eef54ebf11ec2ed84b0fcf34e784a65d72f7a592c16cc4b693e6e14f0868417130192a5cf2323aae6c51d7cfe710678f8c87cd61d4e2be5c98af5311809b45be29f67eb5e30d6c9c6a02c5b5b6f09395b5510454600f6b673a21b2a9c50f177cafc02a20c63e23d06e898f8fab8fe0a693c8d3eeb800d390efedeed045a871110b5cdd158c8f0a0b82adc973fbf98096d0ac01dd8183ac7572251fbdf2f2c71a8306ecccba9b430027e74ad1f5eb755152d5bfbfd4ca1aed3e11d7b10e117f51da6662015f828b08a8c16f1168356d79a7a3d2611fe5bc0f0876129fa873f06c5dd54c6776ce2060883d41e41ca63c08141eae13a884e2059ff6a73ad63e01c127a0da3a4587e5b54ba8ba97465b216b997b6dc1bba316196c69d9352b10bdd0f94684bb6e95670ccaf6d5002d915ec185c8a6def1dd1194dbb7cf828ab5f0ac445b23a6a9e87e407069a6a5a8b06eb13084c5ba02448556f6680497be2e7fcac45743a4c492b69bf053a5aea7e28ca77b1cbb7a63c40ff29d5230f1470f22c315df38e99a6556ae4e8b6e8c39c366a8a96fb8bb7a8a264ba12d7e3d0bd689b4d5c3e2267adf52fed6ac145b50640ea6ce06b3e63245a4fe4cdba64454b0e182a5e640d50f39cfbe1e064a5e0d24fb759b7741350c8eedf6a4f64bfa7007bcec918f2b203c8dd2c7f4285f9a37b3e49a604ae703eaff2c1c59de380583e815a07585faa489448890bca0092ca8ac6fd9f9b93a9ce647b864f8213447ae2d045cef5568e5fe7c0229e33a56bff2d42bb75d1fd3acd9cf60ea464fa8aeacbcac788d094219caa9bdaa04904b148401fe2f010c0b5698a438ce50c7861b0096fca4aa3f871702dfae180c8249f25abacb8655612d1449efb10dc98bc1665c2fe33ee7f92500c2ddc59418083a4343a996525c044ee8edc0be298bd13f28be8561fa401dd0ad150530afd1108238889e9f5fa64f25a71bdb08e8d108e82888683d8ff8baf82b4f1709109e927612d95719e402c2ba0b1b9fcd1fc5bd9fd9cdb18600a626bbce6dcd9653a84b08eec2191420524f6678dcba412d422656b898eeedea9d2f2748d57c88b655cc3c31ed054a4dace0a71d7b4fd51bae7752b81311d65d42b7ede5e3c477845f7a06bffbca4b41e4305ae1e4c428ab7341e03af9a0b6ce8ee438b39ce09edf48025528c338b8c807b737080003a0884764b972dbac5fd8a1d196b480f6d5f1d9356a206a25ef7dd5504b46973418090c0265c30072b3ee3344a6f18d3d19cab8df175db8b3890d88d12cf097ea8e2f1543c1a0c06946f556b3c23781df1af9ac3fe2dbf781e09c614a10697c1096444f7e0da43015471de4d2bad04eae4493ca8a56f6cb8a4cb78c10fa4b138451702ef10394d19d2319a05412bb045efbe89a76e72b7dd9a4c0de56367ed8b2fd1605c9e5a4b7b5291a8cc992d2e2810246c8f747b0de7f7992395cf66dc180ea9e23cc14f5a55945c28e822cf1b58e4c7240b78b22e4e0973cd5726ce60fe5d20eba9fb791a036c29aeb8dfb13e22ea42418b06fbd28566c9746891fa8b388e8791c48c000b868181b06d06376ab1824ab776fc08c60a26c537d49d1f65d2d4f6830af29ef5b1672d0ef57c33f3fe19588efa84b41b71ebcdc6c474af7db3907f989235fe93297d39a50c528769dca711ea614a4f773951a3d3f6e1040ee7df39d6e922ccde0e0a8ca9aa25e29e03e8601a4956f4eb518588b727f21bae53405946812e8c89a32e8abbf7452a6697e78132994a47d69f6901f05dca76e278121f5dc4ab2f9228fa2865b47e93564094e39546ba2dcfa9920b84e2c40ce523f8f5dcfd91b25729b4fdae63ea89c7b241e1c596999fcfc03575cbd39fb0695d55d8e5152a58a1597eb72981311e4b9dfa368b8ca33c78977b54d9d3fb7525162866409962bd7ea34e201131f8f6c21e9a518e98fa4668f1dbe156cca4771886439bb43d4567ddfb34cb9dc318f3731c24f82df80305d1be941461806a6670859c3fbd984d197d53f253b32045021f40091dda44c0175408d80b235f82b40d708bf5420b6e1612c43bbc614c394a8056e818b82a0fb0645e94fc71411c6067aba2cb208c3b420e1cad140f112112a978947b8202353855158fca35bb8a2c201fa1ad233f64e8891cf0cdcf6a73b12da81546f188eab38bc602850d241a538514f839d01ca624d5a7b05496136a5a4a80fbf105a3303ded484e83f2e380605eb4162826e800fba03e24ee8082a33e003748787b10d426d980a89f21af41144c7d85cdb6af8d15a60a5819d31658226128875c0aed86a401109c64a37565b310a4306ba89614ad0d895cc682a52dbc0663ee9845e66e46c5ee09542140406e70a9c80b40bc92905961153b742fd27cc0358f9d22044411da85bc8dc264052b8d13e3be0bb9fff5be8dac7006c4165f30f349692ce70d6723161e0a716c2bdd6c29cfeac2468d3c8e81bec420dbc1f82849155b98a6500cb1db90c2a13fb8237578424368653da4bcde9f95bbae556858a874b739ae2ad6631a0955ca9247614b59e083784a6d777e5f555f9b1a0490f623a95dc651ff8f81ad093c29d208a832dd5def508bc040bb41d2775fc1bb80365efcc7c14911094c1865c6b9ebb71b58c02552149d21db10dc93f09043d9186996c0af98f3ad3a06713c45bc3abab2590e318aee9e0db39a807566fab1a0e17d8a0062d935d08d59882462120599e6eb945e714a131af453fa70f40584ae71d703197676c62b09afc5bec59786a72db2657265298f89d7f3d5d029461480913ed70caf81d9f31cae1495513ba0b39451a8591dfa0ceadb989d6036971f24c2f75d36ace8b8f298413dc459b9a7c74ec1f372833b21cf0f88500d4d61d930d0de98472abf6859082f9beab109e7b9aa24f80f67e2d273ff3660ac2ac265a037409cf83bb723840be1dd83a47b5946a12a07a3128448876cd0d456554e4a2c6d211009aceb63e86c0137ce21cbccc84c23d59131265004aade2336d2fedc26a1c2a9cc5aa272fe0cf5f33d27a067eba590e0b719e646292547faab164bd0c24d5a85bbeeae1d4ad72155f40cd2c72248bb0a10bcc284379c751a96a5acb54b027bdadb032b2ca0a54aca352b6b0921913fa0e7a0618c5602ebd6ccae333feb8fdc343f2d42f3aba3f411d69d26c3c5004bf99b3bf535877cb58f101d43d93daa296a94bbc8820a61569671d65e61979eac9f2a86a2ddaeb501fab41dd543c742da0e4527f04000a1c48feb4d10bccc079c4b36344416ea0948dd4bd7f0fdbd682094910ff468616913c01b2b07850e81eb873128683e889d785589c3c0dafbe61b2661f1415db244c18cfac9e30e86774b2b19e0508f3d687b4ca86613442315c42f1244817a7eb07aebadb654b3433e886534dd3839a6da9a58dda0e68b37dce520c9ee66b8fcb8ce6361c8bdf81d950821ff46cc7b40f97ea5d537e578859378357420f722a3420676ad204a8d619948677d93085936cf314a8f5bf93fe690c4740af777268f6ec35f0427b45f3cfa6da2374ca57a03ccf6df6b1103388cddb623884acdc4de051515d958878757e1125044ef03c9ae121ed95b353b00efcad93c6dde70bf12a077e7e227f01e2b5ebc00d0e0bb59617434cd40503490e9ac80f32265cfd297efbe64712357d5027a021f05a6c62081a890012bdad8a8b123b1a38ff706c0caaa50290c5bab95294c4c5c1731831ce932ee11a59f9ef712a080343d08c527263286cbc0975a4965e23d37c4b519cc4a05873e0376443fbfdb0e5d645fab842e6dfd6950389cd7cafb99818b709ba10eab352f3946bdfbf381cfa0e644df698a535ebbb98124d42d12d2b86dc702eb21902186cc0ff88688cbe46f1be0263ca1762029b85414ded2ff7010dfad105920f77cab0d7f4cda2c2630fda6d469ec3b904dd1ac5de0e623cf6a8cb46c709016d0dac2e5bebf3c0e458bd6203578dd9ee112a57b4915149866d828525105ba01ceb9f21da4d9c828f28eb8e0f5f877eb362c0bda0c6d117727344c2367b10ee3951aac6dd98d2759328f0ca6a99e7ac7d20f361fca569d8982d4044a028dce1d28bcf18d548cbccd50900298914726dd6b47200331cb7cc8b519061206db8b39a0ff8b8e6a261f9134f23cdd44adfa5e30b2c7fff9da6e6c6bcf86996a6535df054f3b58029f557e624d0d08bb1a8ddc1f195a23f4ec51c69cd7ff81d4257ee3d52abd59dbf4e6233611d14d001dd26cd1b077ee3c5f24f278b34e8fe201b830da21be340fcfa2d17f39924e569830e31f6d2239f7a09e3b9ee2990148656787baab78b42418742346653ee38dae9da3e2d363052ff6d704c7f667852f25862069e583fadbb1690df6e4be619764b1ae7202e9b583683ddec99b2fa1395e3271676b68df627c67d35d2774a0cbd91f65a021fa06aa6aa0059e3d9407e79ec8fa2941acaa6cf0ff4af99226a0dec8ebf9f3cdd36b099eebc434b9b235a519367d2d220fc2b96e065d4a348fea9e6cd2523c3a56c2721aaf8f51bc270345bae13c2da86b3838b8e2c7d708473d1f2729958c95aa65143a597c9d2e4b74eb82a6ed184147de7dc465c2e2a8a84ff5a0003d1e1fdf17d1458932a442ad009a2719a2bb145b3baf82c39858b5ec5ce8674599fff3828a48a3ceab0df7e9d86ff04d6fa7cb6e6bc031c2aca0b7310d090d812372faad95c09b55f28162f13835933c3b46a998600e87588ede951b513b77a1f43af5ffb1eef6801f4b93aa00e362310a02ba26d2dced2754a19156d7d7c246cbc939a6aca78ace58983c035390836758af77463f8f9fc349cfcc27964549dac7778a658361d84137ffa7d46c4518caa2dfbe738f7629abf505936121feb49babd1ac44ce3275a63fcba3c4c6b0d3fa99a5baa69dea226ee5b6d4fc5a92af6a5e52e97b135e54dc89b7cbb690a93b5dfe92df775bcceec12e88bd322e63e7200d213a0a9f3c4e92d950d63051b65ed3f42132fba7ccb62d39d5800f28158c2eed121b3a17fa7d1326584537390aeaae48f5d97cf95d3f584fa274acfbbae2a5ecfaf0ba6748afcfbedefc419b62b55e2efb49dbaa3770d25ff99d2aa31c67ddc7d5ecd8f38f42369502c3874e2d7beddc255163b98374571302598979ad8b2ff1524934dcd8f226717a37680e0765d434671d730f546be0b3f91a17a78e6f5c7c707297950a768ab7014d39b0986a31bb9feb2d403567f2fe252cfb926c1d6a20eb6f6e74ff8c11c7a06dc871c0fbae4c48bf59aab81557ea515661f236a4e8dbb07b38f824ffd068b786666002b7fb9b477d457a063a059f9a0e0110363897dac74d98adc34b3fd1d8621b28f992117bf00979eb09749c50e2774db1efe390935726f1a32da030e7f717da7b12b3c375490a6741e9edb81045d994a0a677bb87afaa66c4446bf55d68a1a11fa55249e671dcf97cd664ae851cef4552332eb1c76c1af25d796f495ea10cd49ca740a95dcc4e6e3b49e899053d542bc8ffb8441d335228fa17ed3b5251a8fc3590ce1fbdbe02135e831b30becb6438614d5fda70e74e730777331f43efc9a63348eb8fd7662b0d97386d002d8e06cac2354ce136bb82b5619ccc9f85df17f630c783912085bd1e259c69657249d72835db4005ce694427d4f0d5be59491c8ec4cf0112acdbb5b8b60da1ebafdb377af7097684703747f45f63db5f62e0c5403b497349d457a7dfc1f1d72dca54b40d38fc69f86c24f35f13891fee5b466f6821b4a0472dee3333a8c5d5ca5d1f0c18ade7cdb6932d9c75eb56ba342911760349dbcaf84a98dff196a9ddafc2b8ad6d784da52b1461198fcb2e318f71580bd217b628e8a119fba34b2219504d3b0ae0d39a41da448a85f2474f35462498f85321aee754e204d2e05bbc1e0d4fb167c85dd27583ac18f7ef81268bd220bf2b682b4e41fab524c55a78048aafc06934f9c83d641afa8c4e42ce80445762e5b3db843cc681229fe5b7330b50797105598237cac3a4235c397d81e0b6d22f4cb7c9c9cb341c1e7b494b9cd48a263b27f1cf1945ef0b44f4fc8c95ebe4fa0e6dbcf663b1693d8cb636dc7d2c4ad5ebef3c35b861db3d257c945e2ae536ac32de15ecd5369b8f1a254ebc5f18df7026cd7913706734a377ccf79617bf81b85f0e36776db11cb956dba76101a033d42e33945ad70fb7f1c6be0b9af58444c7f1943c54b3d485ea095feec24b208885e10dc260a5050c889fb21b68280aa67910063523b8ef200ffb1397296039e22b5c9b46cf1f48a88ee9c9200de0e1b98b8733922c72f7dc615f62d6456927a7517836f64c98143990bba0905980acd21df42b0658eef1e6b7c8602fb0ae65f72397c0b0b47f8474aa43fb564808c64df422d25e81d93bea0e04b646d644ff8161af25227172ae54ae674649a25f30a5ff42a92536c7c678a1df5e1ecc35700fda37599f7ac4afe7c2b81062b6a375f4e224d3764e1cb93812caf44508c5b4a2eb3eff02245f3803acc018e2ea94da9d17afe89b067f96b5195943c3392b8816f3b08e9e1c0b7ae7669409062000491bd344303f805133b314417c91969a181a339cda45a721404d16ded7dec0ae7e9bd9cd9ea9810c70a2ca6267fd602c27e4119779102d1e3cf98c9188111f8f60b4a85c14be980a14f31873567713f6821f3c5d52c5c9779472fbc0cf6374a3a5bc44d91f8ca6c85e8d6d7afb5f9bf7d65302460a01790d50f644db96bb809cac62b42952e0d7917983166df5396d739d6e871045e369403c518413586d8b27c3d7f350b24a83100c70dc3859455671e3679a5c9c092e15cba6012882170131a7022fcc1b739cd1051c018e1975274a46664e82583d57798dcd4183ee2fa6080dcc7de6f987979db612c6ff4cf1d89b76100b7abafa91a42d19151886ce07ffc557a49f9dc49229a889725da0bd10d60dd5246977b581e74772a33774b06ab9dc8e941efe114ed7581c616b66f0ba3a4dc05ddf48aa372d0cbb53c1c44596bcb14637f5e1121a48b14b569e6b86bca70bd01fb4a3a7277eeec368450d309fbe98ca9ff87b2c237d25d5a4149de38a5be1bb17e7fe666a068ff156d7b5b0cad2fef355fc14fce04e2496317f82db4727209120c0f3a2fd8be93e0775cc3c6a6761b8b75e37f99d4be23496e5708b92267735723443da89f0f96ce450360b9d31d1dfddf48055efd76941f07f9413e86d71c5d1df2e1324cd89dfe84028ff0c4be4a36d4b16eeb364f7efc2af51be8d1d7eb080bbe41c20a01be827d098f00f0bd1c52add0b82dee12b137753a71baaf8c30fd14ab81f33402690723e747e894b0f4a3c1d3b3050ef9f669c3d1da11215de238dcdc12381d8c65b2eddca014bea6d73dedbf0c232ec5e8ef5e4e786cb44a6d4631a99322d9ffe0c3495c196a35df44d56506448f1f1739d5dca53b8fccb3819e7f17f7673368c8b8048ecd4e3a6daa1072d75ed32d8bebc5c49199163c3394d926e24feb7106fdcfcea91599fefdef18d524e90337a92d9ad1586545c1dae1c3df6e040dce7f55a9f488e0011a36fe9460f8528fbb3e177127de898afd0beb6927c13fbb4dfaa78617b8ea234574b7b905bdb0f974feacf00be10cc7e0cc0f803c0e1e94031d30b37793cf72027675505ce053c3d537ce5b74c9b55aa9a2fade9faefd027c2c60d293d13ef0d7728680a70fc8f419041c9470b558396ecd2ceb572221bb3a7598339d2abcf1001bb59edba032a8446954d5f42db8fb5485f68c626c60feeb555da8df251182fd708ea05b834582f7de84012ceb40dd15bddf0ad3f86fe4de17585fdc5d952832b995316fc396fbaea639da06c606029311fd9251797a4ae870d137d329d2ee8f33bc59fa6c755f87be7e3382409c479c7889bbbb6760040889297f1a065469ebd96313e988aea3372293bd89b626fdd375a25b1fceecae324cdcd6a708b53ec4574252eda425044b255c78d5e21a3a1c29daeb68605c8be2fa4dee0a026d1f80ee24e01bda2eded0d8e1c07c0a3ee8e80784dc22b846d7be67f81b618a4ce7e186beb9f5fa6c8daefe87c2fdf58691319f0850ba2df97e62411f732b3e714a85c46dda776c869ac65caf1a74d493f55c7b1d8ee15f0be33e784fe7174b34ed3beeafd92026445b84eb7979050c0b2d16733cab7a2e6202459d61f9053746283a111294e593fa454c66749a7254c150bf507565f0ebea91417d6d20187ec42f5fb7ccd77290f46294acbfc67564d0242569c3090c90deb09200ec87d86ae83b83830960f96b5248e930bf753a9d5c19f59a135b686b42df5bcbe7ee9a9ef299b086c72ac82829e8ebbf5620d777324a5f94cb1cd57afcdb4fa9e3c3c4a1432aa1a3d826d92a3671cec4262104b8d070bb7e7a515061383133f906604a072141fc965bf98de1ff341069658013977dff786461b3b13621f27d4b181adde0072d163b1572d8ea08d1529612230a3b9d39a8c5d83ffafc6e30576b7796377da74a31a985dae10b0c7b4dc9954b3f7ec3313325c60ac4920dc5d19d93e5798189f7575938d7a4f2635e635e7220fbedf9f0356e053f4bb4866636ddab29d13b2eb767d71fa6115cc85b492ef5d7452ec4399c670f00f9b453dfac690d1ec00080b69305949de57acc2a1326e66a0078191fa68ea255b76a1357456f5a125187b6831afda8209ca31716a06d782e4ad4f3988e0dd2202ac6e31c3916edb999be0a17fd97a38e4e61c7348bdae9dc7102de2b788bbcaa36ba7221d3bf5a2d1afef867a39a1f64d59218628dcf9f8048c942aea766a318d86c902d31226baf33cfeef09248a0a4998054edb0e98c3a98b87d8f3abeac04db5751e6d1cb6ec93d4d36d65553700c782fbe25bf44f9dbfea94ac227ce586521aba6ade6c4a9c9be4b4f467ecd151f997c7c6255b09abb95098f0fc4f56233168f9a833ecfe0c7faa7aabfbd7573ca46f6c23d2d11dc0c51c61b56557cfbc10501d05e19c860f34f810ed214e774dc3c2be45e1a44f2c7e9538a622f821861c4c92fdf5281a7d0377a7e139d3cb9584b921176745999a5aa9a9e465fddec800fbc3e54c417d6402f525e9e157cfcdb6e864f83c8e0e96dbe54efb2ee0434485c96aa3d5fa1420cf0ad78ecd2943af11bf5f72269e5a64c879bd9c4f005dd5465c47dc4d13c66428042f9dfcfff61865a926a5032501cc4853f90b9a23ac75a23a943e7d85c51330a2585b43077489602a60a3fa82bd0edf6f46811adb5ae829102279f4b526ea99bf0796b48bc5902521da50b95aa89dd91b9288d9e00dfd2b804f6cdc9b08394273464b033bb8b2013b6cb7e47f8807f129bde855d2b7242c147e66dba936f735c1123a79efc6c44c03a0470310fc0497e2e17f857cc340802095bb10fb857ff1057868c6239c054f1d058889b50cee6fdcca11aae53a6f454c2d15ab7a16039702a2e43539b60ca68e562c13d4ecb565d95fae5c29e3e669565dfaea37b7c5b4b84de44580c17af18278e7a6d9b564c406857746e4d42560c0a1102d2eb069cdc01d2ef5330a2bed9bff252b9e887d284d57c89b52b6633969511723e48d627ecdf26279c93d6cf263bbe7370aad25d10db31d38beecc824152bfe11d6a713da9df7eab0f1b4c452e8d0e8a320efaa6d49947fd82dc34b389601d0f8aca9db686f6c8ac376f4445b705330038ab7efe3b3a9714812b6b242b2d6a22eb23bfe6e3a613f33d4ce3f3be2ee00e02662aad313031e3f790969fa4276d7329de32355f77a9ca9b50061391b232cf0782c946aa684b99c7170e367e1a72a3284ac33751d8c95f28a4081fee4c86a0d97a094c73947a6e435ccc81e3ec3d0e3498ea5ae586069f8193e63aeed1282f523b0bd5f0c93c7fe16aeb05f70100d4789a3fb2b036ed7f7f602abb478e5d63bd3381b612b61ef7fc1bfb3589f88bdf40dcbcc6bc95aafba8ed05296e40080ba6b79d4664630a21b62934cebac5fc73a197b0eab7b3976cc8d5674d457b5109bd70c71089cdbed50f0490628bd5c47bb45effb36341cb17bb19b7ba3986e3966b0207411479311b02189672e33c4148e5bb06593f37659d196eaf9b2142ca8dd5bba539dc77131e50dc29426f873db21e1f0e15c8e35fa2eefea8f6dc979c0e09cd9d7272c8ae678b90411c97e9d6b004e12a37adf668e349f52189c83554c356ba386542ab7ab81651ca45e6afb8c3453819b252625e595c5e317f2aeca3133081de114e370c3322baa1fed60877745f37d21382fa7a0f95641d60570eaf0f9930cd14ae03840c1caa08d3a07b4cf0a9a0d34770daa393c75bd769a76580d35d2e68fddc7404d4b65c3dda54a7b7e3854c1fa3fb9aa0b7eb14f9979e8aa4d0f7c1a16b1d6cff434f2c52382ba795289d40f41c3c2f31b977e86fae8310e71fb58672871e92bad782850aa25dbed375eebc901dd0bd9e9273c087d2de24a51434bdcc92629f2ae19aa69d0bce0fbdae98c03ee5e261950b4afd1c7215b119783a68bad0fd1dee23391f8dcb35394899a352832d2754275e99746677801ee5c2cf3329fe89f3123193ce52efd31056cb003d2743615bf3e7515b3013cef3f388569f47bbd5a0b6862bd3530ec34707f4fa14360337feae21899e100355deb735777fad88089ba3b921627a53d82ab89795e033ed0ef0e879598a3163d4229eb86145e8dba7db6b9e4e05069928cebc7cc49d2b02f4b2793d0a6da10c5945366e2aede6a1639678e3ed7f2a4ec1da5b8c26a78124960b70b461f82419ab75ec0703ac0286f14549c844e937920c94347d20e4582e45057d2b3e5baa3a51c9a8fc05407ebc2c5d420ff8823ee160f294323bd0005052d25ac938e05f4ec0eed7d3b4c9e087c834c02433fbb084f2531c414bac8920b45ea75f52a61698ce6e747bd2e018a7d3c1cd1b42f96f3dece717295958d84b46d8d75a4952ea4a176ee9a87696e369ecc53d7465e4d3c759aed2957f5303b0db25675c0d4b889ccfc4f9150b5d96eb16b49f61794aa2a97dfb397fd3b6662766a209ac593ed08b00d88eb0131bc97179612d911ef00fa49e646b6152a13ef69f3fdb0d424df27496b44cbc3dedc3ccc7e25c96d8aa710bdf2bc45e85182e202c5b0d23dd65820dd6a65506376152d389a5e282c8b898527b317256bdaa3be98da98527c510afd369920d9b616058b2377b9e361af7dd85bca3d35331dc9d373fce60bff7e704678fa1e3737c79383e8c19f8760554dbf43148110a6068817e9c8ac81272e3fd2acf50bc1e0320018bdecf258d48852e9ecad58cc3faee4befc393bbfa76b18d66c07621dadcc78002ef3a9180594bc2267664547444fbbceaf8a019d7c22080086c4748b5a020d90209b3acc2686b1fe14c1b02518bf891fec37823f95658a15cd83ccc8a023c71c5e8fb9021d9a3cce4aa48622bf9793f56e2b3f7f9a6dd006e803ff2d534bddefcc3b24b60f90a508330be8390941d8cac27a1ff39bdddb2dca07253eb8ff74d3db78837cc02e3d3faa41e01012153f2b15df2423cb48332bd4c7625ed2436a61d91f1a0389906dd6a74a40193f4d051fa7a61472c5e709eef74f16f307e42fae827197d22412ad6fb9c9a40d09a9c7d49495b5ce2836ae9f82ff8dd452bd35b004e658a2818f1c32e2bbc345f80ebc54afd32aeb33708444fd8fc6c9b43f312991b83a8c4c7d1189bbc83fa131559bbcb69c8415099c3b2a14737596183e465433ee60189fc42c772a1175990792aaf00c7cad7ce604002ecadc5f73c650910570eaa49a7d602c6ab799a87a256888310fa8ae2ece0fbe026a68c2ac6fb40bdeec8a921ed3dcd3d9af03528a866778a11da18b06f8f85a2596f2170f572a6f939559cadd9e7ed33c225c55e4ba9aef80072a550f0d85931ac021f68703657f73e8925f81cd779fdf4184bb4cccdf667bf03cf4eeea24c54f08f4d158faa2574ddbb9edee98cea195ab7460685eec506f6df97d14d5e5989c054ef428c2b462661433cc2c7be41a546b09c3636792310c300da66e4776a4848b3a3ea6ffa0ac9896aa4d0f77bcfc15eff57bbe5ea37a0981d1d07131ef6c333740e199a41d0e12ff0c49f0f7117b31c49ac91ee9d33b161bba92904026b665d63083c07905ee95d9ffb49b1df8e4f7ee3b92280ed13a3084bd324e3dc161787a73ad8b36eea42d90f332cd30c8d10c34e65790d59095946f013a3f630b81ada24c075bc00b0837c9c54bb275ccf57a2ec947789d0b1c6595bb7f79399f1e9dc68d804a486c19be164a450b431381d82331abccbcd0cafa1934206e502f76478904c492be848b6559c3e8b2fe65f947c2edd8f245bd6115afd0974873134f6730b0cc74f359f06047671ffc500f65432ead4bea9f1fa6ebd86604267d1e5b5766e3d77d3c526e3cc2ec9c21425b53390a0398d49fb9a3775f4b65039932a8a6d3673ac46ebe94706b4c004eadf4bc158309a55493ab94997836fa9ad91e698ae1372c7228d282db805765cd2d761d81debd680de4b9ec23d23381fc5fe2f6017c49a453a361590a574c1ef05349642d9d65a687eb19753a73634726d6c6b9f10b21bd984ecbdb70c2d0cfd0bff0b3f6032f4832df2bc5c22ca9f792d6543552d8bb86a6d1131a33c3f7f1dc5196c49f4381bac5505fb655f2f419221d6ca13758d257b20ab394964a711b8081c64bf7894e7446113c6a978ec29d3b19ba2299ae26d748d797a244489f2a42d5a94679c731e80c7bd899e2623571368557cd441d7a0af8936284ed163294cbb32201e8e38a45cafdd20e92c8955927b49ee222d6f56eafdcc7643b416d073f373d3c40dd0cd913893dafe9ba01b2b1a47e92d858f5047a12877ad75b38158c2c0b65c2b55f5a9db49557d2604fb5a0f6bf58c72dfe3c9df25942b568fd1a071c05c8fd5a0716cafd86b3d35d2ab520684a650d028aa0b88c419fb7ada13674eafa74bc41994d7d37aca449c49793dfd8933a8d7d3261a87ca1571a519712d1b34f683c69ee819eef518111a23922b17afc75a72f5f22c0b8c091de2d124b25167d80e723da6b31d4da07924ceacbcebb118cf27933ca317752d4b94eba7075a264d9dc6c1f2fa0b49ae3256fd9514672ea1ebe7899fd3a07b814dc1374790eb6554d4ca95e8df0594ebb54efdef01f38b85dcc3fcf73017f2a7606eaafb7d0e2b75531d4e0d913acc6f52877977188c63a4c33730bf18e71ee6387fcac2dcd4bdb7e56f4bd5a5c373f9c815cceb67d2ced52357a9771db6a96ba54a3eae5aee928a4172d5826512963128855baaea4d295526a91c72404a8734e381e9ba2c48aaea3defaf35283b3aca3cefef3a6b934a317e7e7e689665493229294b4a4a2a259592ea4fa9a816957e4a3fa59f52515151517dc62357f54866414212a6eb8e783cefef2c4f2614399b954f9d23d95913922bad2555f55b140d9d904d91ab1572ddae1081c6a3b53423882bd792ab3aa426916bab12b1db85b91615e5fa7ad4bd5e13925bc0745dd7e10f3a212857a05c3b5bbf6942b9a6d8934c922b6d8bc6d1597ac1d28de56a465da36e3d5255b52cb4aa5ec80b3a50f793ebe6936b85c2e681a7a1d322570d0bcec684371e93a954043724106f411b904c6a1cdbd1651a7a26d1383a5756b5495a4faeda0c727df58255c97832dbc18c27d7dbbb3511bdfad3dd80a2578f72b723770b8a5e7dcadd9044af1e7537a1e8d5abdc2d49d7a8cf82e44a631255f543b2242c916e893311942b52bd8bab194955fdcbd58e90e4aafe48557d96594b91727de947ae341ea9aaef4ea59f5c9f25c915e72355f54036a8133a51fdcae596e091ab0d8b56d5d77a14fc65f5167fd603b98e20d713fe626496bb1d758daa823fee27d7734cc499ce75abe79a88ab529254d5734b74492c92a423b9bee3366ec95614bd7a0d73ade8d59f56ae2f25d52ecbb623d376546f326d474f6c59fc9492eaa611895ed57aa257bf618d277af52f4ab09fc693ebb72ce20ca713673eee4ce2ccc9ebb7a3380373fd8614678eb6d8a2d892e2ccb77121d7d7ed9f6694eb2bd251d5c9b51ee57a4d6e2cb7ef8d24b9aaaf3ff0465ed15b1d912d25e55aa170dfd29d6ccb1fd3552e54d235e051f0291726814217228141f0db91cc326bbbeef73c996d3bcaf5a5a25a2acaf5a62b03af1387dcb8c18a7d7048a6b883121fe80452de8e51146c7300948323792b8294b7225b446f834582608ebe59165b5f6c31814724c9f0ddf83b62a7a79094b767f77bfe6011a0e86dd656275a52b5bdef44125d230bf6834ef01849e2d99ce0c9db9dd0525a0e84f2f6147cdcc95f4e90a64dc1246f5f53a19337888b00e56d4950be4e04925c4123494418c915f6ed441cc915fd56d2a610ca17fe9a8a9dbc61970823a9da0e8d24c915114852b57d7b864eece40d7f3d4552de9cd0c91bc5441c49d57623db59833b20cadbbf9ec2c8897fd9edbf0e3601245792b51d36112457a9d3210b07b250be1d1a218a33a56f4694e4ed42793bcab552b5fd74b72b5bfcd9bc39d1ca1beea2b71d1a6999f0971519e5ed2da191a3bcbd6336ec033a81a49de8641a59a963293c91a604c237c2f0235ee396586e0a0bf3b557ed55833c1fe409ca54889ef6348e93d3d31750251a473d7d71faac7519c995fca4cf6ed02b2d336233204091b32430394b22ce9c4e9ff1c41994d36744e24ccae9b39e6c8938833a55397dc644e358393db5226657d82cba2df2b6c3247a43323d6dc995d6d276d094073d633a3dfd41af5a4e4f85e4cac5e929915cbd9c9ec2a0bba90d323d9624579c516986e5dd3791ec0ed5f18aded1cf34f4449a498da33b3d768421c5192c08f3912bec545382cf5fd0a5c08ea0b3cb039916b58830a1be0ef31ed8535848ead853c72e04e6d79b958a4f3d8775dd54bcb98e3d1ec39ec238a963c781f9f51cd6062455dbafa0bc3d75b7c36cd7eabace0ec643afa41b34be974c5199a6be09c10ef3ed02362c8f5a7336da6ba2f6c286e5baf066458457645b1692730086533cb06387390cbeb9708ac7f5eba9a7369b882fb072202758019295fa0f9d5b7295d5d20e4cd7791e1090d692ab52c9f3feaeab317c7c7c7cb22c3b3a7a719b554292484825a4125245aa48b59515c995d6aa3ed5a7b68a327d6947ae342359020a92463b3b3b9ef7779db519cb679291dc82e46a23922aca41d12afa188513b82932e5ac68b2ed6c44db5644e4026f45529564bbe58ce4aa32d18670465a129c1167945ddcd45fae4b0b22b532bd6674fa2d081555f4305d672dfea0138c720065fa43a3db82327da32e391bed84324464a5b62c1a47e76c2bda582ed7ddada86b703c5245b72a5a451fe401fda7f3c994ebc95453421aae458745a65b1632e5764a2520d8526dcd23997240dc4fa6af8913a971d04f2d7a55ea6b080624579155da7822fe361764faea851717b24a3b59666d0793e33f98fc957632fde9724c448f1ee5723fd1a34fb95c1397038a1e3dea7247a247af72b9a0e8d1af5c0e49d7a02f01c9d5b64554d16f4cb22136898ec8b9254a4672b51d19657a17772b922afa97bb191dc9959665d61e65faea2357db4ed6551f94ea93e94b48f42d5bd419dd5b2921657a969b237af4db8e5c955a454fe92dfe32fad3b6f375cf317277b3ae4157e80b10673ad31f20ae2a9254d1d3d3e4e8aea0d47b6735ee8aca1d61ce287af4970afb71464831227596957a95654f6c3ed4e5f45b12d1a33cd1a3af78db891efd8b12ecb693e9b738637a8933dc29bd8d33df29fe3828ba38f37156c8f4b4fedb8a32bd762457f49a915cb55c6a49996a4699debe3790e48a266a3e72055b156fe415bdd511d98a94a912ee5bba93f5c974e542251712a1842012940b83e0912cb3b6eba4cc3e9a5c5b729565d6766d65fad295b9f9891e7c0a17e1728d883a436edc913756a44adfb8ff88adaf93bec8f3f2bd04630b26f9a0501e42b22e5c845461f9cb4af7061f58a49964753a9e7afaab8958ffeef3ae234a72fd1556d46f22d57fad848672d77e51aa1d20a7eeb4aa9ea7a7d24a3fe34fd7a89f9c022a4ed56f18d65bba76bfeb80c9254e074cae18967047a1954f7450628e1f151376cb3d04b404871f9be51e025242f412af99bd64d90b98652fb21798bd642fb2972c7b41b199bd64d98b245a96d1f6608430d2a04993096343d4b3ac258c11c6a15894936453f41941932200810a2ec880154190239011723c2ace7017908e8ece0e58f15d5c75cb1700e42f86c68daf93c896596cd14cb27c7f7088849192892920921bf9834994c025566401990c49a20a199790b1892311494cf2452553c85f5ce26345969734e0c97288065ac8f2afc110b2bc375483a3dc4336384296af714196078207135ac8f20c18628249962f020a59de88a11b504107073ad8c10119788a14a1c7a788157e868a8021cba11f21211ea2560e9214191d21dd20cbc3241da441e7063b3b60034f1347e85122cb1e3282f4e30411509010114f963dc483a32c1f731667be4d28cbc34d28b7d014497913da8c907dc82dce40a20cb7242cb825c9cdd9c4d2155d37e4a36404435f68f101419e9fddec253ea8424a9e73ce39b119f97a2791628a198c60ce20075d0a2613544d6610021990010c43621c010c2be8cce0838ef95aa8eb1c1d637a65a52ac295f686456e4455bc8c19ac4cd7d10091e55b75bd74bb7c1591e5bdabaf0d64e95d38124b298cb6157d4cb4020c482527d80069044d8fb410c1bdc71ccfa41fcc16d0132da0f1424b0648f9eba22cdf56c877f2323159ee2119b4e8921944accd3da4441bb2b027b987944022a2b50f52061209d1d09841a38b4ee491349a9877727970b62f8aca646ed0d050e5c8724ead7236d8c466092bcd8e863703001e958d9a7925bb2eecba2edaa815b9494faa68eebc24362f99f3a4f39a5794534e39a5fc94726612ce89ea1848e3ec0bc503adbbe17c9c53e2ec0abfb0e7f40ff62cf19ac8c3cd715baa240f7c81b9b806b9d3ed9cd23f8c2c78c9d95ca39b86e250a877af22ea5a09439e9724f6933c197ef630e529a89f6e6f0afe687c3437b9beca7a6f78cbfd6ec03f68e496dfdbfbdde4fb12f7433ce18f473edddecf3ee5f56a29d7e68616f615e67a697fc8a0ee77bacb4b9c8dc51d3d18bcfde28e5e0bee6ba50d5fd421d75d43dd0f66ad391d50e59eeef77cd2ecfda1b37dca9b4b4067abf2cbdaffd0d9e21b5a5815fcd5bb1c723aea5b6eba2aaf9129d74f56b939b906c1320a63d086cb6b644dcca2075d60df6398eb05e622c22c05c71f8b4ff01dccaced3aea792cff6458fed1d44896bbf2973b391b95a7ee4bf4506f7977bf9cdcb1e49614fce5e494dbfb5d057f30ab1cd67acf9391913c9247aae0abca57aea9ace0c0aafcebb2ca6ba2e491f0baaed35df0e9d8e926fc7557777b597e6a39ca9b1302f5165c6fe7eea2ce72bf6794157bb8726d4565e5d637a75281e8ac828360d93e7241c03469d26447ccf51980b9e21fa8af5c9827b74326a75ce5167f5008eafc24f920f51c411e2323a12322a496fdd745349efd2793abfd47a3723fd34f6f6e07e4c9292af88b4056b9bd9f4cb6aff77b9675d7fa1aa972835c59e5cdd9a86020327f30a3700564720afe78d87b7abd28879c0dca4fb723109d2d0e7205d181264d9ab4b209ff90c9278f3b72b5b5aa1ec6e4faac56fc6df8078ddec997e7933c196f71d5aca933800891e8d1ba71487b6534cb7ace47c80361e7c060c4e090d135e2bf1b06e0411bf1dff38c4cf4228acbcd43015d63e60d442f7f32594787862a80479228a3a5101262e180d8409c8155682f62a199340a3212ba060c401b2cbc7681c007a00d5647d7f824ccf276864d58e8c3920f9093e1a14fcb962c0c90abb74adecba48c5d7d5d04d334e4e7f5a169c09ad2101861bc380c6491bbade8259d64cbba3b2667de0b68b210ca0c4050a28b88a8c602b2bc5ac5e50b0359decba65c49d69793eb9039148221b9331c02c18ea9e5fdc6e98ed3f22a6a8e38c8954ddaf12100ca2fb987424064fefa25244bce46bab80c41cadf3cda8288792ec10940c81f3542434b6e2e2e93682a89392ac87e14c800f2a674c43cbf247a51069616d1d60c269e3f716662d1aaf8a905518e474747aaa0e17137d6c5c54546a665c4564427c3eeeaa0582d5707c5822b6fce86e535918888517ec94d44e40845355607ca53de33af93cde97dc234283b02731345afe584cab18b7abd29775ead6be5a812cab5e6b0cb9b8118c4f591a2c750ee970198a27807cae5738d440902e445c6404ea6c03cccb31586951c3434f9c80704a6264d9a346175d7b0ad7427d09d4dcc9fe8c5cec7757aac00353f727af2751ff39d2f98fb28a78460e5698b0201d1a0d40e7a79fa2eebb2dc51a0959be5a02a0e3081d8586ee7959b659cda51b37ccd12a78290f312a778dcb4a8d103666b12b576928841d18b4838ed2d1807e3f0d8812c97df3c858720e103cb05a7e40e64a5a4cb7ba4eee272212d4fe11e2e7ff90b16d2dd05a724e6f17297964b2002f448f42e6db95c5a44e5b4fd2146b9a7907b68c808326d512671c6f4f82c1b621f4fab50c9f1b4886a91291639d22ce47829ff6c892691bce48f59447d81fd2890c4418c381267604bc21389bff664689e9d1e3b6dc9a352504e6f59a76d207996154c5530968251f00957fc7979074dde2890c9740a34b31c2dae004dc6f00784e9a6933b91442f4a1ce40a424893264d88323689b6162acbbfe4eddf34ca4e232f4faa745c789e6e9f1fc53f68b2f60dcfa049247a1113faf901029a447312116597372bf566c9899d3ebbe6d2b9d6d27579777a7bb43c75ec0ed1f2141662e4c6e5dd85a4de22790c4961173c892065f9d91afa409119904a1b9d5402b59800922bdaa29802490a84bd33a53ea4c4a91d9ffd494c7fa80f6542ca679c8da42d7903135b391e43527739057249e13b7bee1c123df9895dacc17e3979ee64996d55bce46c36708420fc60c8a5933ab21f6d115d7174b493450f529cf926912de2cc377f72fce6901c5b4b620f2ed48a38f3fdf801eaf191ab26b2f3f95da7adc6e1e3c215b82e9168651a85c6d157e44f6e91618b1a5d17863c9047082ef77161d85272e991a872b9cd921253a02a02daa2401f355a82f6f4c096cb5b6e4abe59ddb1a3388321c955cbe3b124aa4377e4cac5e3290fedd1828d3ab9b38b7be94855fccb9d4952159fba13e9ce23a98a7771646dee2110a4217ff3c8e5c2ee9690000422f3088910bacbeea624a62dba641ec5792404ce884b0c3a310afbc122b8127df041073b20db927be80936e427bcf044d14f4b99a3dcba054e2a3430d04498c92e92ba89acf8c88a184708aba50a3b02464c0a24403188e1f3a29c72ce396717a44ca459a994d1186126e79c534a1b39e9906c49447461d817ae2fcc78c10848ac0470de0c6d2e51d367ad22a3226dbbce5a795df68ca7dcd825239c48d7135910b66801d0132420b2001e9f2764d08382a427828082999d4048aa3a7b228a152c00053a3a80b0a311bb30ec8261041b2377145d10438c28788105387cc1b2e48ec20b4e14c10b51743d48b62e22cecc13cef4dba355d76d77215f4ac0130e6e1a84105a6b6d2dc1ec1f4d861d764cabb2cfd4d8ededd10768b3961ac34abf6e91d28fcd2eb863348d3078cdeb9a9e91adb9878e78e10a360bf9fbbc47433b524516062928967be8881443ae9f9c88a717b439693721bd539e2c90a3ac79e2c800cdd81ba50239c6d32cdf37058165898174938c6118e711391ecec72c6e51d7755d5729f7d01126e4cf7ee640eb188de330d5fe936b13b91ee59a45f42a508c9f628b5c638c3046182352aeef187f72358254df874690ea8d8f317e12212455f1f144141101e39d58bb76ec12512455da8910922b228e2e2b9e42286b4652a5d5973eb803a1acfdeb298ab276680429b3b68d2065edb0891fb98a2c4d3bdc01529ce922ed2db5778cc61323cd82968a5a9cf893ff41e24b9992513e428886ec59ae509f90c77e599e2f8a6ce7963458e9237bb06338a2feb514ada20ca5100a6aa01f9f9d3c44d1bd018a1ef4bab33cbe6b39cae52b7749a9682a97e5a8fb37be69c2450a1d54d20a5286c75f4be1c828432914ada0e46c22c65e2335ecf60d2df02704e8f04280ae8bb3b988446fb6cb8d30d83eca31c60bd2a3e84d9a459eb185099bfde0cc277a970a3b1f77ae9e222bdfff681010504f0aeb89de757474a4f21ea9428332dd30d91367a60cf2bcf4996ad0e9c1ce90680434d48321ac83f29c8941974b0cf58027cf5324712615e7e74ff23cecb1fd8ede8ec9d9348ef826287a2a1772f488521a74a9fc3aba7cf2853f382b6f79c461b9cba3cbcf4fea86e5a9b33ce5027de42a75d31df5eea86bdd6de95a30cf9d4279c68e3a73fe221267523e3f8be40a7578048d60512b7fb2a7855a9ff168ca783f0a75a1905431498a1e44f28e1e3475324fe2ef47ec9c1cdf728593c3ea4caa7eba46aa8fbd71aa69d668d30873f744c513eea993933ae79c73ce39e7fc49e5b84f8e3b0fb99a5a51a61742a4492f26d19bd717a06a7e9221cfa9863c4faedd0c64393e1edd0b8bae31df42996af205b2a767c87eb2470ae105b5679d73ca25c823a0b460e1b116b6445bc1c2a2b460338de62963906da52c3be1cf5a3c4dcfb2ad44b169858db95e42d1ab6e1983691b0796a79c22cfd951fc93373092a704c2fcaccf354543d14e9ae998e9167f59663793e9d7e46caa50d64a375561adb5e22f55aa37dd1f4c2653ad37d592092b99ea4b2b7d714a3b764dbb66d26ebda95ec3b2c725639e0c8f7a8f05746f298058de52106917666ddb36ce86fe6272ed3a6a1c58f40a8b42abe667e93acaf39ad46e56deb9a0def21edd5db09095776fc1428cd40b5139eacdeade2a1d16d2bdfbca85a0aef2d4102a47fd46e5a8577cb3f2ee3571720a6816cb4d5514eadd6f50ef5edf756fc1382bef8ea302391b1e2c3db98347b10465f815a10caf72a5206299577951854df140bdf3d7513092e208a7490194e18b6047c1285f4771267efecae2428a3312338a1e93c696604558ab8fe2104552055f449cf95a8a534ebba6dd5a51b8130c046257748d79b1d6c5965cac08b3e2c87e368af81167e8e7a4415235b9cfedf3725e6e1167b417f5b4788876bea983b5bac6445dc594325d339d6ebad8d7a9d33b0b01caa6db37a7c3def49a78ba3f98ac35996e4d266b712a6551ac111a8a351d25eaa06b74b6a65b5392d5546852ca8961589bd2de9673ce0bc34e4bd74412e38c104278b718e3c4d98cd7fdb2aef15d2288914a794929e3c4536230cee092f18a18931ec4b0c65f863b5ed7bc660e8573083b646a88fb983300ff86cf9be1af8d72f6989b828f390ebfe1a68688390e4f41dc23e638a47adc7018bfe1301e00690a6cf6d835b128893d429484a0241c654882dc43486802094b202189dc4354d8dc43541cc9dcfd66e64e4caf91abd4498c13ec611cef2a5c93c9958753a51838558a8153252144259309008f817164ee6537ca30e336fe9d9c7236275807b762e3a6e065bc5933ae77d57bc4b80c2c44c663c8c0292e47c815d0ac4b55ec72581e4ec19b19f70eefd5780c8ce3bdc671627c460a4b46885291540ade06be078dabaec238399a164fbc9be262dc1477ee9e7715c6b171ef3800788cd410337ad4788af3aeba9018329ec3eaa1bacc65b0100f5fe0467519188706d748553c1052156be29b65037f4d44031b816f1600b0e44ede31b2779b756760bf4e7a76f29314134e0d112386eade853c06eee10951e14b95097bb8a5ea6ba19cce1a0e17c6ad81fb74b38cba7d1d9e0809477213292122520224747294fbc18c029fe12c86848a868ec024cbe41e12fac94976b60d951ae21e873be01e079c72003e8c18f77e13e31ec63172729c141703a7e05537321ee331304e8ac3a92166dc7b8f19f7b0102337315ee342bccfc03d6a7cc6676021315e03374b069671151662e466c655172203f7505dc6656021dc55b8a5ea44939c0da732e3a64c4fa5a49868524c29de4a0af7d44a8a938153284f7137329e4aa1c898b1825354b65b141977064ea53cb57273192bf886c655dc4da5527a7087d67ec6950144e66a514ad69eb0acfc2b87f98ba7522e9ef297a79e4ab9dc9452397794afd0a4c0bcc09f8c8b14cff47217930aa7b8d368c12915942fc8cc283fa9bc26e664538a3bb9a9d4cab9a71cfee4326e6a050f41e3aaa738dc8306567dc6653c95827bccb88ccfc0324e375d2032a79c64dc96aad355b7a5ca05d2dda4499336649413cae995b34139eafe885ebc4518c1c28cf21f7e1cc2c37b82bf994d87af917106e5b18838739a97717892c15dd51c96891ec763c82f55dc077540c8e16f66eed7e1551d3e3b39bceac2132c13bdb73d577ac3ebba258883cc2026c7711cc75d1cfe70327778af77b7ccf418387572d5735826ece1d4094e0de13dc66fbcc7f8c963601c2327f826c65518e75275f21827b89fc3aa91f0367781d0264d9a30d921b3c680dbac184064def007b38681c8128e000eb759306eb35ea260bf1f5d84b3ec628fb9cdbae136ab46cedb196313b78ecd81892fa630e79cf2f04a29a5d426ca35ed1aca0f9a0c3921b0b6fde446cee6243e27cbfb3d4720c39fee372f67da6e6f4e8637c8b55ddeef46deb8fb6d599b3ae8350c51d77e733e85c59cf3f31e0d19334fe25544eb984d1e420861a4810d3112610bc96b0def4723c39b60609b551f5f83c87c437e850afb6d25d4077f75ce68640cbf9382fd3cf983468e9797c9e2cc87cab285a609e0ef11ec0735001c28cfc3b8d6dc8e79183fb9dfc9eb8366a4e4ec7508c04bb502086c9251ac853fd6da1b376e683a04e03afc6ace2687d7c4d5ccea5773363ba04ea893a6556b6db53f9c6c3c8a1eacb54a1e0cbb2857351b7c92c706361ee5ebd5daa4dcde949b6e54123d28f385630bc79947f8d3456022ef50842345189277f80e45207245cee11fcca72da0489273780e876289c66dd8c9c9c93cb9e289cc41871c0e374e07cc395cb3a75faf185669d0e9302c2c29296f8e8525e584c36e6861535236cbd9d4aae3f4eeb5c26a391da7eff0eb62ab9f6ee7541030ef70987738ccfd72f20edf2108017c00ef68accc8e9765f6b7efe674c01ff071bc26621be5ea75b8343434a75c3dca8534a7f9e9d809e6155fd7f59caf9ee535b2068919f52d25057f39574acad53511b25cabbf2e7b5d36d6b68c8a5a45464618923b77468216b2c88d043128b1b9912006241ba783dec5bbeb020a26906c81040a22499664fa08c5904c1fa13852842d327d11aec8f4ddcda27797d45de28c193366cc10d23366cc98819343e35c0aa72cea299f05a203e6ec33628d15eb5cb81cc31f8d8cc538eb23516b0591282a6971f6cab37036b57e72db9bd38e72533a520ee328efcc72181e5eca711e5e13b59ae73c95c2373cbc06e3f4701e8ee3c3733c87d5dc3d0f37957a7eb372dc54aaa62663213d9c87d7f4e003e4ee9b7b711eee759d2e9657cc741a4f0162937d06d681e3dd4df7b3f93fdd171708ccdd258763ec4edffd59fddf1d1e77f45e70b76121e8bbcb7b81c03c00fc65c771940b738c9d0a6773e10f275f3511757a146743af410e08cc28f745cab19b8284c728d357242208657a8c08addc435464d1e51ea2624946a293e9afe48911830346a9e6c3cdf11e2e0f7f716146b930972ecc382ef67b61fc8147cf72dc87332007f6e10c38bd876bcd5d3cecadf7874cb6f774c19a68aff77ae5250f0e31317e612ef0310c8ea84b4e08fa8a534160c791a88b44b65a8b5142501f6e0e0bbb9d5fdcce289defeddcc3cd61e1fbe5644a2477eeac71a86b184cb9306f712665666b32bd394a4da68bcba2579f72ba66ef1724460e01f51988d9877dc7fdd0ddbe539e723acca89bb2efe13039ce728be4c029fb1ce7e1ddfd307cc2457ac0298b83d8e1399c073cc4880e01780e3cc4c8ea489c656426b56387e7f01d9ec335952d09b98790f864c8518cba30290b36559f9383d8e102b800b00fd4777867980a2287d757ec03f51cde7905f3950e872ff8fb75b82e8e934f98b529b76731d9145b537016bddabde2d3399b0be6a77b17f7833987a37678773f9cbc3abd1f4ed621871b24e61c0e7383c4bc03e4ecb31baf34cfe24c3dcd2f997ce3f6ded0c2d2fcb3f906cd339a67375ee284a04d9a3469922bcea277e3cde9a0c137be9ad921e8c6953a5c49240057e670e51237b01ffcc99a83c9723dfd84bf99ed3526ecb79ddeb9721c67632d863f1ccc9b433dce543c3b16da75428d03e61bb096aea32c375a8efd861baedf7043938b93afb7d88b0178fa0933a5e4a4d4c81b302cbbc7c0313860f853adc51fcc57095bfffff3bedb5e3140aa2aabd61b99a80651db80af7129b4c4ca4f39fe753cfcb331efb8f2e1313e6058d403e601b754c9e0962ad5ed8cba9d61b4beae0ffbd34fa7afac5cc3b69595affe74235ff57e1727db5f29c71abb3f6e4ec10180364eaf91315f077361c6a48fcab1a75c4d6e30299ccd75dd0f02d95ee56ad7c500cc11c8f55f677a733627db25194bb92b1a2a25db265945454545e55f17d9fb5d08e4facb9aae1f379b7000a00decf67e3a646c0543a213ee681a07ecf0977df52cf8eb360065fc05fe3299bbc0aadfc62127848d9fbc466600dc0f66188745366ee3326c5c067fd606fe7ed0c83030004ee3aad74800dcce32ee97a9eed7e51af79347c8f0312ef793f8078d3c4fe3defd6e320da824d2b81dbdfe2582fd32ad844f5698c8f525ab72ad7f78390bcb3597bb84fde2d191f77cdd775c1d2673c1b227c76500c49e823fef84bfabe0afc38a60dc895e123d70080b49f9e61ec2c292ecb3454fa6711817dac9306e3fb3761921a9878c4044fa40266c66b6ec277af51867637116bd8a82ae016fed0a13ec2751903f591467ba43974395c34b14340ed36947bc9049103077f466ae4fb95ffde99033611df51626058939eaa864e070cfb396d6fbf066e5780fefc1c37dc0427c380fef010b3172e3c379b8901e9ee3cd8ab906b7a813756024459d24265107e64f0dd1c373bc470f38a6870f98077c1ef9e3917fc8641818dcd13b86f119340e23c62d0ccfbbaad398110307d59bb39171a1920b7188f1c3e06f66986b37f9f47a0de35a6eba761e9ec3aa16a786c8711e7e93e33c601c23f638f526c779380ff039700ecbe2efd69eee07f329e5d5d6cd743f1ab962d36ba4e9dea7dccf7b7342c0b88df9e9de70c983533b6246ddc56b24ccc5e1302e048231f7cbf2fd2f0e312e447299d4e8a35e666badf5516f2d13ad96256a1129c100ccf65048e8542f54ffc12024156340668b81402660abc2d60b201344ad97291c11b95ca2be1e5efa1ce5b0208c98b75cc1bce52ae532390ebb28d79f52ea4d3030f04793eb636230c69e973fc92393e30e19e1486e79e9da4ffe82c48cba8b766df3af18ee9cae35077d603e1df6f02ff3e19fcdf65f97ed3f2fdb5fae78b87dcd6da972711f6e0fb7e50f997cfaaf9d2ef409900bf330fd29817a0c63c8266c0893b040c35aa3721ffa68783519da099aca18ae0bbbae09afa0417a45a88529b33c23af2967f462cf75daae9479e9631e3bdc6e68c1a68248f1318fca9d3b7f13a776a0327654c660cf77ce1d67e4f624547ca09480b00d4dc02e7a51ecca4209dc381ad6de9c19c811a3f89a1cc8f130cec8432886ace5a5564d9c6530c3160d34b863769baeac35ccdd3967420dccc8b25d2a6345d60c4347168c11b200e7ea406bb96261d89583102c56ce3c0246b80520682c0d6e57abe6c90296456fb3b0db2c0d76bc6eb396d0b03967841ed0e68457072694110e41c37266a075a9bd920660074e3ae7829009373c10d4829d12a020091f104187e107f69a584e11248c0cdda00966e831ba90a022092d4ef043a63bc3fe6e83fc793468aa60227f2dd44986aaa8414f14296862086a1882c492b28972cf1b720f1535c9a6dc434548f688d6cf826d2e421e493e45d306441b0eb48ef920cfbcaeebca2ad69bede6dcf29cef0b4462b7c8764d6e14723371a66aa5f78138409c89327af2317a387048f476a8dd400b11fbc9e46db2c06e7126420ce9135ac764119569e24a9b8176552a22ee207f4d09c87798d422077104b4b09f0c16f693c9376b15bde806f2754920aa906692269d60e155b4b0f0f29b110b85748dbe0a182c3c8c314231681d53935b080c36fe9a71c618048b54d0b41c67e39c0c71ebe8d93d67f7ecd9b3bbc140318c6254ca8961584b2963f2bca83c867b46b694f328e8c7a6402b652f3dbbc41fbc32eca39f5d83bd59edf89af304cbf097fda2b77ebb27d72ef7c9c38c524c7f7439fba4d8857f1421ef8f2ec74b25d06fdae18d2da4e672230c9b768880f8fe341c44faa83888ec472d621ffdc1893fd87de1ce4060ee5f37b5e37afdf5fad227f6d19fcfae5d3aebb33b2b9e1b86951e5f7a8d2c5d98afc38abfaa5dfaed66af77be5ed330bd2d61fc75af8f2032777fe384886fec235ed334fc553c4bf7a15dc336cf4db5cd73977ec22032633e801c41af8f2012bb3ee23b5f1708fce4769c726ae21df1fdb8a3cb5fd32a4a7d9230768650681d330fa1fc25040b1f2f2bb0e53819e9a8699a8f2247c8b08cfcba20b88edd4706642ec281eb9d254e0eeb7ae471e1ebf04e213a595e0f8194980611ade116b90f9108a069dd0ddf57b0dd4162ec9eda15ec372584337a57b0d9a78410c2ac218470369411e9ef8285ffbaecf22f71e66edddd36ebeedeb2190498bd0f2184597e9ba8f932e7dc8106000fc06bb0514353386ae5aeb1d316bd993b0a3028c95df41aff784772fccb148260458e570840a0d1488185ef4d87488370caee6e8bd45300e5eeee9e32c6c4c4995496b7eeee9630b08d7d3492fc804681902a78db51d84290b2a09021514da7e4869c0228ab846b5860371067e2e171e20c4df4e05519e64f468706f302da8364d9342746310cf380c019bdc982655858f089d82b04bb5261ad15ab87174837418a335be0479ef9b94d21996cc43c4bf70d7f7f07b18d9d8795e422205b44f4e6514e60e790a833758032c59148e4c178628c31c6083725b496f029f2018fbd11208d0862fb4e6cc27e91076a10a7b2c76738882d0e49d1cad8e3cc1cce66346275a2146c7cfd23ce00cc1f95d8b586339e60df6e77967f453a1669640552d0c91057405a0106223a39620dbb189cf9ab3ee283cc8c1dc38c88de3c8d94c2d94a944c1d29298c3a3b3c30893c672a08cc47846fae07cb3b8c8343852776585d77712012419041100bc7e5382fc7717178533b4acfb961b99188bb474e47841c8f96d36b5a844f5d23f4dbdd3175c4eb031ede5410a5c797bea3744af107e3212704c70096a7ae414e01cd6a79730e60790ae31c216f4094c44abd7b0660ce5e23e32d3dbba597ba8b0341c03385100bc7053ea2a7904410cb883cce0b3ee286198258296ca474177c04968424969193b7b038c1ce97ae4c5db973c89d3bd12b510cd57d6641e6cc6cef446f422b8c66963ac212267e8aec767b7a9a379623715647ab112caba8e8cd883f1a18362961bf78abc3be747abf0c578046f6615fbabd56baf1f4f06218a5cfb0434b33faef26c30ad0c8df4df69e9f3a53c7b4448c31e66843b1c89361fbed1661f9d54165b97de441a1c1da4f163c87b07c0e89de1cd29de52831c218233c1dde53778dc0b35c24ce32f2d2b19c8bdc351695b7ca63562a7dbb5f4ede340cfb0f9db1e76478bfe7084c085f57de5c94a5d39b93e30d72e5151c0068e3462ebd466eb7a3b7650ee51c8eaf9147dd6fe6146c44f47ed0c8273c77a6ce144a7189fad947457cde99608b4e9e7df6dcc4990b70df80c8d8558185cfb2d935127e592ec272ecfea0c93106b119fb01224d9cc93e9fa3c6932b16dcd1cb6663a16b58a16dcc6b175ad135e6e98557942e3cca227a33ab6d141fe329463f9a4c6113585932eca92c8bf391888b900e3e4b92f2bc4f134079c6a03ce77c4667a6ac429e3a7205ad88aaf979052c8ade8482fda68ecffc9ccd3242cb9167b24e0dd041823e72c5806cde8839fff2010bff02027b09a5441b628071f61704cb7d7923ebb79d114e4a31ce112cfa2b23555146aa6472c7c3932a1739b0f0510a1ce4f8971cb0e2e5fce7498f860b27d44352d0c9b1832c2329f0e4af5b9c8e148a90bfb6425eb38b332f71669281c6cb08905808641e73ef319fa20530b862152e256cc8c109ae147477cbeeee8edd0db1abb1eb6aec9a92045a1c4084534a29a794524a6d421bb023b431e5001ada90d25a137607703d8bd08694529a8080958680ad602963ec18e337f3978ad0463fe6993b69638ccc119ff2d76519638e97dd0def17f3c92c718cf29ab223c45840712e8c5ed725e31111bb9a482831d8a4dbc69cb31fe1bcb00bfb81c5ae26f3921884524278c2a08497d863298310c3221614e3a6e85637567adfa3efcee240b32ba6db867ca984bf23f2d5860cc32efafe840328c5b671c1d8309e408c4e194f5e34db221c006cfa2a4b598c56c26a29533cc4c2d7c489d9b8a49098e7b5d2f6755b561bc7d4b87b6a95fc76a53c59205fb133407326af439a4ba73b2c964b1848d79047e44b7275bb22044e402206186c29f7901236d0ec25bbae086722f4e0fb82d73c84104208af39bd6c622f110ee03ac5b2972c6799e72c4d6cd2db7962d9cb8bab94c15206e11bb3557cce2cc9946491bf4e52a4a40a29e418e42b265f57138e902f254ae4ebc615745032f97bc9c1841e26846109567ceacc107476094755c8df96278aa80479526188880b4b90420c2588c00a4ab8c2da2fcbb009f644470be2764a5089f800cfb682522b49ab415675404b4f604e10ca86884c70cdcc4e91822ea080080f04996147676768880d44e814a5d44026cac490813de58e420c6c802164b5dc518ce104558ce1055f18c30c66f4d82c771463c88137033ba99079ee28c850c5fcc001e2cc67a3a60040a0ae6ba27e20c08413af28818040a402851f9ca025a60d489aa8ec0401c8058c249028a11205105c40052888a09288a0029311b2eeeef6011172f7690ac0a33f1b675266314fb0f0fd3883e7212b7a727fbe5c97854b50824496f88978868e872965747663d735a38c538832c2d2a905c20b4613b412b029ffcd39273c651f6d62fd9a98d1eb98bcaed933a31836e7ecee19e48ad3057d2161e1e375cd6be294c472c4a2db66d9b265777777675052011e368700982057a4b4616268c30b754ddc3171e144cd84104a3803f003fb6519a8a58456286163bc1a9b33b330c88e3dc3b28cca2ca318c33d6397638c1d73288c4dc4d87dec7336f6c67e659916331a23ce6a60d1314a6cbbc61170ce6641291cc9f663c71c081f20e535e735fb03ddfd5386724af99a78c1fce564f9a923c2a3c81d68b2bb5bcaeeeeee8e51cad9b108730c5d843093ff72329c17964062d89c58b7a9d492177627463367dfae715d18c5e6293ebc2e2f6bd8d735fb7a4d2c7537be2044b141264f39a544a26577c309610732ece779fd82311a6918bb21ceb07c733912c227c42cce5ca62ccec0381ba722ee5cca16e83296d1f79db3c212cce095e1a71c81d4eaadf5b262b54a292fe7155a8c51da07d5a880200806913065f6f929bb67e4bff92cc64b39e79c73ceb89aac289b905168cef63c19191a1aa12c7dc83e64d3eeabbb9f050dbeb24bce970cd3c83db3d2bf790c675225e72f0c772b20a96ca8a46d15753d8d3a4533224000008314002030140c8804a3d1682ccc13416e3e14000e839a4878569cc9b32c88614a19630c30400400404000406466da00c0c436764055e2e393cb7f7b1169696b44dc3d53a14306f060f1015863a2d2a8e5843b9ffb1ffa8beda4fb023d1822bb81e7dbad20d60725548b59eca7d708e201e3b7810fef2df099633a29698dbd2f1ced3defba012367169b549e4d97c89dfa747367248fa832b38c5672abb70631dd62fb7c83312f247bb3001a6313212385d857242d53ca162676cccbb2253d5c5e75268c23f738cc0ed896aff9c3a49f7b4211fea5dd17ebcc4092a25af46e284d62ad80824a16614b6585ce602bf3971b0c8d51f74d0ae44034f3aea9ecf41d62ad7d8108397e3277bb31d0a1a1c8771c6c2e2776520bd4328b64ca5ef0d7aa8ffc40782d4e095f26371739baa153e4cfb722c8e14744f4cdca76cbb26eb4068f060f03935dc6e692010fe6aeb8bd090278383d7c603c47eaefa506271e63afa1838ed54ae28f32a6b9064e12c10b0b4488bc7adead5c92720472bc2420b75c37d19f2ffee648bed2445cf523c8b70c463f768135a76089b243a87348f645980f14e377a9cea930fc076a81638f0d0d90086e1d54713a8721f80ec81b7ef4c39bda043b160e3243110d5424069a3480936c7a4d954cd512e0642e15543b42337a6cbdbd8b8d281116e2510fd134f9c9f57848ecf632a45b81b40d5be89fc85854397205ee5d25fad1ae49424ceda8258c431a9d380e047c84615b261da9fd3d61af153243bf0aaeacf3c6b18225e8c690dcbe4416ffce18c230257e1d8cb20e0c3e1fe18fcd421986c2399fa401b3eca1ef13d0293c667ddf4869e7858bd67ef8bded878b01c03731c2ff9be456fff7694ddff5f69e73e8a185cc91e73b8fe6a044ca8a7ca55efd7ea8f8961e72e36431c4611d3fada9655befdc3426b1c299cb0487195a16511d77fe3b83ac56a9502e95d8a00ccdb971c23c1dd65823ac470d3418a6fba0523b28c099062a9e98893b143d5a8e1e9b0f2478495e81b84ac1722cf92302aa9269b36de546705a4bd228249def296ff7fad39edfa4317049cde183030ff9e1a30389330ed683ca5bf18a1f1c5d1c51b32529375d164e4ff80208ecc4ac8f2b3bb7c4420fe3904d931f937293c371d5466e0aa0e34b00d6acfb4e0c58f7f476a28e13f9884e0cdee4b5eb55c5564bcfcb3edad5367a6a5797caf0956978b41005a2bba3275d275c5d210e7f919a800383ae15989db5bb8c2f32433a440bc8ecf88a61e53b75b7ed8a01c2e4df9c4062b1c2b6fc48f701d70a8a87e34aa2014adbc13e7245a93bb0c2a6f41108779272ec56c733252b48e88ecfc0c57e7b989db3a5ccef273b165d5394961537143bd85c1bef0447647df647a9ddb3eccdf51f021bd69a5c4814db14a2df1b3986e44abc4dd8c2e9efc10bad6e0edc875bbff776c47ef0070354dec4310362cd23194b7037e939e3c6dcfda97aec58aeadeccc3afdc97f380e9a284383367c04da44e6f14a2f6f6046bf80c9598f35331f1a0e5113ba8603c2f863028743239e6fb643fff67e8948545b549626777658a5a50cc544b4e1639e4888859c598a9279f210a81dcaa528ceb010399ad36a9dcb4dbe86e2dfb9b1ba3c9169a3ca4ff1c4d288165573338e200b8e6140be97975c0a4a01d11b881ba1b0688513c657481b947a58c256a855e657015c8437fe54329753b0f14ca5dc2466031d3003d348ac380c969c5bb6fb579cc23582874b87202068b76b906831396ed9352a33632cb81dccef939a2960823a5a8714fcf13ef3f4521445ad7fa4d496d3dc4efb1c7837a2f9ce1089147a7b683113975e80d235164f2c02992f69340182eee9aea434f4c5b3f53f804bc98b2c1e60c6d0c98471c064e711a9cfcb5111fe990de1f10265f67d28cd21a74a4a6384d49e53e43b191a7e781f1d301129f523d964b37957d8e146ac0e673fcd126e69718fd540016b8314dee79fbe432bc35daa3f3078388aad066ec691bd0709840ed1d930e67738a2b355b4cfda2a494a9cfd26c6463e17aafcb5815b5b48ac8445e24d5f1cfda0b9ef3777c0f24a2f58cab0e4e63fade0cb9d2cb593caa285d84c4125bd80a1c6aa230d2c06e34a2c78fd74dac4733a1287122223f3ce7351cdb88d925b0edf02711ad3fa38f264d2f039299df95d04dcc0b17dcd11f1149f079538689e70eee6257ba8ba85532a9afb879e765bf9c64522a7f5aec4cbd9d8bfb1689f41dea405ad318c868aa5391754a78f8d35b47db53e8ecf87fec02ea293550fef24dc6e0cfc11e93b502d626c3afb2e1600409277155fd28a69bfbf18f2a09f67cdf609f61f8a3c890673951edb4f23d78920cdb9e08b157b1c168f45ad2f8cd73931a232c2b62d5c4cc108516dce83a4bb3260006e8848136064b63b69c5e8fcb9e3afbd61d9fc4623bd2487b5ab41c337246d643af851320faeae845109fdc4600f216fe429290eddaf6aeb6a8648754188c8b3ecd379e96ded7132c80288aec874cd785721725ca353b4903ba297d656f76292b5fa5f4f9be561c4de639a6aa0054f89af41cb7b338048ac33e7d8ba371515f93c4badaaa7d9222ab3d6dd2906da792a2769d17164a3ee090c88c545a3694bceecf4ab1e484acc4d232c63fcee98c29cb492f40352662cc0147d07b2580a19392e91a0dbe45ca52a0252f0d1fe4c976749a875e91a9824a4ad32df1acb490a2958b2b571c5061bb57b32665108f383c4a7d463fe69469322de535b6436ec0d31348b52283e2ac868bebdecc72e517c662ea1420e2ea0be47f8df233a9dac41e771df965e986cd3557f8ccfc73defadacb0c835c53fdd2f0fd4b802e585a67f29d292d08f49912853080132ccac600496561df98a1fdb943f1a53bbf403c907e392a3125bcba002b1581853775d46ad8a84d89b9d0c527f885ff7a1bed4a09bbae225512e8eaf4bac07d6eaf3db807dfa8edbe84036738d189bbb8e0b83da99150ec914475556ce094223ddfa764366ea61d81ccf668c9a81564ad7c843654ef76b2ed5bd8407d61621d86023f2d32b1d5b38784d4179f1db676e9f6f96f97882a70cd33e84d51da044ce43897a29e8010191dd76e3020d94cd3bd912696a4b2cbf873a099050f5050e1ed2443331784cd4da9d0dd116b5681b20de4ce509416829d191ad8f178d8b6a168a1a68f7a0a9d509b59d6cd9d732b57451ba7d59caa22d1c723552f4246b63fd06a5267695481dfad90f4a1646f68917cb45692155f4558c59cb9e6f1612902f88593d046c10915ce832aa5a74a0cf22c141fd5a75c91e608260d02db438b5ae0c2d453b39ad74716da369e58239773c59fabd7cd27ba89d90a52ffa0c3b4624ae55a9d99aa145307dc6f5675e79e3558f1f8cb09086e9e61f976c3f7f9de8331061585d02b49e0961dc181c4d8e048c0529375f4f8395255be020b88ef7e248a757fbddd76ee806ed79c8533fb2f1f8b00f0b42b8e62e22726a128239fbe2fe73ffad1d0478714e044a519fdaf4e4706b801dc16332d2184bc824e9041b6a6734ce7585cf52fdeaaa9498aa3fa449102819f0005b45b9f6667f4fdc400bdeb3c8d4f96a8144484ac9b8192bc7c2446cc3f370c42559c58fd2304f901cbc2cccd89bd5c4db98ccf407e05db64ab4c2176dc67ff2738b667f9706aaf55578e3980512f3c94e1c83fdfc096ca7b00ada08c4b9a7f2981dd8c3f3f323baa278672bc14f3d8d8db265e2b4c21815a78f7d19a500fc55762e262930f4b3128e2a7327b23dfb944c190fd25da2a7a6c2f28809f1e7390bb4a77614e8d9dd4d11a9c4412a6b06f6829beb8d73898743c877264b60ec764d5fda11561eb330f0fa6fc9e29f3c61444838a18f3b7b598987bf87f83cf8a0c707d900fdb815b7b5302e2e0a0eeb5c011cfe26a6475f8608b5ece79af3ea01222d31b9b3853f20b4569878eb9b01778bb180136b8917c6130551a2ff655fc189b32c56875b63e8277465b8259b2dc8a724bfdcb9645eecdb04da3c7ff11aabfe6a5f52026c4cf1978ef96c9f31a56c230882b9a2feeca8b39a187e28e1294e2f79aae36e05dd3865255b32214d4ec03e3f435724c100194febe1452bdf276310313add860c512a98e9de30fcd174571a482cbf73c78e5c08b4f9c49db2bd84bae61967dc7b7e7e807d9ebcf9af37e5c1af22459ebc14c8b2108d54b7fc92f0e415b25d293d9c98c921088d0726366e4762d5c16b62a72d3e058764ec60809aa67c49937576038955367aac259476368557b563c9b418ccb7055523bb40ce828e8ce4ae77d8b8e9acaf4cca4f081361b3b084f4f935099791bfd4b1751eec0aa0d1a604816ccb54923ba5798186c0690090ad100ccab762315eb4d0ee2fa776a9d09933c891169770441c83ec869ed7745f9ddb91d665069cce12176d12dbcca8b1048224a5119d499cd0082e0b24f74a6d6cc4640ef820b6ab6836cd6d374099f74421d39336dd554ac6c59a6328d5c4ebfddf7e5a1aa4db59b44912b25d2b1637e8a185ac0fbbb455a2cc51c3d06059d4d3bc9b72b419c3527e85cfd0ea43c1963f023d279efb094fa4a962a75a8812a24bf50fd36234b848566b364e135b53b81e8ac88f11e3898cccc3ce692e2bad8a36dde9b7d61a6aee17a0ad9ee49284a283424f4d9130023ed4858813e0347fb41d54f96f7986dfbf09875b67ab3ed2a2c0b4e485391f37334b7280ca971cc8638e572d60e46b5fe4ba501c40d5b777741f316c6fd5c56704405ea6bc294616ff95d3ebfbed3fdcb256d56946b6c04e058d732bdcbbf14c4b2b5465581d70a26202dc5d50b49f321dbb18bdfa69a0c0de8227873ee9b67647f8a3a7bf381295f219414cf7021d7b633b7f95b04f43857ce6998beab7ed66e02ce435f378ca9afc2d9c97267c9289dc9ab53f92b4fe7b2b506ce9f49b073d8bde4c82496ea32c16c043674bd820f5acb061b56b0edb407cfc93423bd161eebcc7be83b4127e1fd4609651aef10343abe834f1f164a3c949275cbd854ab9e294e231946bf9d5bf170a3ee72466d9a6562d7656d0525d3209ec8d839fa8834a3af685010b97a062ff3ae0c1a80a111424f8828620829497fef4953551fe52ee21f884a3fd53dee6fa17644471f1c59f7f7e01f228baeba95416b67d24cc975394a85685ec21e576c7446fbe1a4a701dea87f7381a10a929fe6a751e80f5d7a679b56dcd61db6553bd133de15a585c1cfc32babc38e429df36b9cb1b3e93c10911a0ac7665edbb2de33cfa3b101312a0c8b11e14b129197ff0eb9f121a617c44a805c17b44943f5cbcf4c288a5aa32ee2a5080ff8b943be8d6e0a68ab835a78f68c279e43712e350c34c502ccadbb24419da5c3bf22bad29696e0f3854772d50f7968b9ca069a2728d3905fa00329552a684e4e9e5f82d55121c1604db0ee006f1e0de516ab1d70bc0ea68472480b58334b11f2ad7a5ccb5a4032ba260cb212eaef0be6ddf4c95e11c346772740989e9faadc8f8c11876f861e512b894d47a39921ab4c6460c6e8bebc09354fc804cf9b59bdad3cb94ce9085005eac5cf49533945096844f8a1113b7b4af69ee9e75f7d0099d6e75bbdd39c240ebbd0213f73a4df4cbee7052df8dc2cc845f49324955886d000e51c89c8bd9a78c043fd1e48941fa253a1d8fdf06e00d28860ba268e24d049d96a813972283575024338d4c151e95c2a4510653434596a7d1d305581dfb7be6c5115b9a93152c70f647244f735a9298faddff763b70bbfa4d5901bea34bef9f4219f634fa35a93533000336dd0d99116e4d3a23880084464052a2ec469d321ece80db6bab330ab185b32a876637306004978b49bb01081d3a58ec5c3b2f9b3b5db17a1a4d2e9c9236631b8624cd2862fa1c324217ef737e0e46cd79c08f67b5f39db24580b8716bfb096bc790fe1b02ac658c8a3c33cf064d2ccb50905963826c6850e3a4117db24ee9b2bcd77171dab1bb4aaf63ca9847a0e70cdfdf3baeebb801c617eb6e7dee919eeebb194b238fc8fb64705eaf05ca0e8fc4f56510939759682aa7d5277b968c89e172ec3aeb851a16f05bc67c4a6715cd10a8db04dc5deb3457c757a65c8a3c667c5e3ba3c81ceb5036cc17bae2a9324c055af9e7234664c3a306f5450f3162a074bc5048b6fd7663501951c48015fc300a7a97dd7ceb05a8045ad549414d086536d6ba4fb877585d07e99f7106a36e009c422fb77d27df07a1e93137268b1bc8a23be72272f76ffb3a32bac5248c7ff8fc7ad3d146e27950700e3c2c59aa1f5c4a0d083d68187521a83e36b473cd5005f19b35e6edc23ccf897a4c3fb93f859dfcd1f0f26cc45a40859488c8c4a11ed9aad3d6cac4c0c156f8332cd24c01b1bde76017e945da6bd1e13db405e8aa020319a69b4826017a36a4afa4a00d51b3705cd4f3022e88353c8a5d0dd1fff6dfe234ac3abf1e9156411e34def8a982a74b9911909931e5338cedc5342f31e5e251b9739911c2954798b5140edcdbc72c2db3d9802807395a921921326292c6bbef0c4572a97bb5d7cdd5049a2294788648820a1fc9bf143429fb3379fd88c2ca5be114100b2711ae057f598cf75df8ef1c38865325177b55648a1d15b7a5252d04c2edfb49079b9a3b4046b1e1f87ce526545a018a071aeee55747c87919e11237180b5ec6e02e41a2e5f77de1d43155514b9942ebbbcb2ed59a8105e89fafcd38858f8ae336a7afce90c14e8eaa874e40b64c03afca87c1cdedb4261c9ee486e88f09527e4c24feb0924caaa40831326cb457a85856eb55d282780f5b939baf9264cedbcc435326cbbc3b661ee33848592d6acd4d983c34e06a7b5bbdb4af61f1caf746cca12648d9da68786846bbd6e645615496d98242df15a44904dbc2e4721600338967605d57fa23233cd0d4af629f0ec9e6ab90fd4a7412817a33467402b8be0161a62288bb95c135cd23402a11918fd250f3d6d0904f1569af6a54cbe389600542e2fe0b3707eba68556a9c522e8fdfbb31b6c46212d765977a0286045fafb3918d38c38267b0e3a972d811264401cdf3586844982dd59af7e0058031992c77450b0250bd7e5764320797d48a0f3f36030e45c1a21e8be1cf44814d080a7b15e267236f4740a927d028e4ed0c97bfecee88272bd827341c703b1d4c857cca9fbd3d10a96b3e6f9fb1421e1eeec91d1cb30cca8506c120dc7a6c616e370138a02f2ded6940db5c1e92941c416c2f2af7d50ae5381fa970c8a0a44edc0fabaafba29f38c902a34f9f523050d944688ac0dc001df3ae96a435fa621cd81a601965f2985b798ad3243c70765eb68f7f67e1584400b5d9e2729315e714ac75b0a0b32c194a75a3e9c0f0ee1acbdaedd40214324409db721cbff86ca6887b90b800e7860b9ada5e3cc499096a954134f4e765f6a58b33abc4dfa1e0221b46fdcd08adfe3953393f16a8a2a117cc52bf1d0f428209ba78b10481c55803e95cd3ec79099771ed3507e7b5f6551fad4b49f0f7a32c71a052187ee35c347df512ebc40bb7ae94a2389137dc510b694233b731af2a00bd1507e07c441d9c2f219b02e923ed5e5b7a1bd0b544e226474274ec8f35a85130468320076bc9ce0c26dd033b154356d9bb33d46c556988a5ec27b97de18f4915751cd18aba8dee4a73eb172742819871c40f9495d1121f4becdffbdb6617d1abc3152254489d6236309efce375519506ab2fb31c2448b9b32d91efeaf93b80251915292cfbd573dd5ad75726989e843cf9e3934eab3bbd7adc7087be75d787647cd70a5b69ca3337b327dfc7ad5569e23663ca5ee844b7480054b31fe72b96387aca843c0b59334d599441dd664685b56bb9f4db46997cd731d2da3b0089ff13c11b09f98e135666da5306a248611337788444c59ac0aa5c614035ff50f8272cf339acba389309006f8c477867590bf080bddf6bfa523027ab143c68498b11728afac88f684ccd8e04806c91d9312fe8411b6a4937d8102715a0bc838a49f1d0e0b9e27c047a1cbda06fefe380392fa1fbfedc21a0651d93b20c81a1111a7ed0c44cbcb8247cb703e575646a5241a663350e5ee0191bb9167a60cb71321cd7211ea634b735db159bb5b420b343d4073a333091046c703e45a5e43fb48b98fbfba7761d74205c68f733cc25bd16db1a4d633a9cc89d0cbcf3058f4b58e231da5fe8de53672689e03de0ea79afc6538a62d36d729c33c58ae66712493a44c9799d4016ca6e249e2dded55ee119f8d43ad1be5920f725668c8f96465db3a1c9ae67468b8fa006363d6d2fee85ed9eef9a113896a08d35bcf3783d121589757eee278b94e71e4e94e41bac9c0e7bb844740e3abcb211ad2060947948086da401d702af6dbdbbb18bee1375ac4b2f088909309677193aa468fc3125f3d6170a1afd7fb1e551afbbfde8f61d0b71d00ac1fe932c08d62382c1f97af39417f7cea6981b125f2f3b5f7369060f67adf4dfabd5ef3da7d1eaffc64e3178c0df4958c132b673b7e24dcff797937f72567034de94f3318ba0f66c241df9003c2f09f9f71b71f7974fcfb6e2459dafe8f2135090fc1cc1468b449dfc2e5b67d926c0af2be9a478da0005d53f3fe8fa8356d2470d01185b0e45067293aa82fae2ce8445117af79631f84375d7b4f9f4e7855a9457d3181c3d0a6c13dab0a1a41c8aac32bf5c41864cb436c97e7c739d749b124941dd404c9af42f60f4da322fa05dc5aac283f9fa612567b80a664763787b9f1761fa06ba811147deac1207d0c6ef943c33d29e9a031bc144b10b32e30cef6b7d5c7ee4a1762825590e05f6b3afd1212f95458bbc1a545cd66ba2adc3b9a55a2aa3557770c610c6d051239da83d277001dbbf035b77c7ce6da840f04d43030a3f065eb5f74a0f70b78f2bdc7bc9785c5b1369c9115d790cbbd8cad3d8a23d1efc6db23b8faeeec31c15489bee096ec7381f8729e6886be1837658b80a135c4ee7ffa6d06c6fa304994bf8ba9c4e7edc8f50836ce1e1c3d386a1c6edfb9ee95e5b1bb52dafa58f7be9ce5b0e882195125a53c4e33e795eefb3352da1c20872bec804997f96659f111ad109435b95773eb88bea1c124c4516ee559e7c581d9b1143ec5ee10f32c519e3227882d82c4e74250d429c23b044616e0a70cdfb63b616562f6231c37bb53a4e4206c21ff4d9d1c431a65963fdd765f068daaa97d009778b37dbe92fb13bb0e3ebab4821769b56b7347a32d1f0631672ecdadb753719d6a17949fade60ec0f1d942bf35eb5fdef580bbda9218bdde66519d8fadae2c4f36ff389b5e8bc79e67846aa4faaad24854e95a55e654cc4c4da3720feec8dca98950ba6598e9ccacaa09a404d52945f55248e082d366abd210594afaf5101cbda6b4ea4abf6e3efbece722946f79c2de62772118514a3e5dbff9af6a22b5ddd7b152eec6709d74341278a99637a94e297d4cfb40c8e954064fc3810ab0ea6e5a2b8d77f6fafbadcbf05385f82396fd07a0441b857f752c696a469414dc1f63fc4589df6a018d5cb6a54bdb3c59219ffb3570172b02fdd65bddba677814fb1dd29ae243a7f060bcb25b7725286bb3745eb7dd95be95bd7c47c1aac839153f2e480b0b1ff021e8f4a4cf3b34e5978093a48691fc83150f2e875c0cecbb37f6381de797e0ef00dc8b883d25f9dc24a2a034e05e45682bdd7fb3c865a501f63e52af077a3ba2501270af23b49502945e25c95c44e2a72753a338155f4aa2825b35ff71efd112e499212e3b7a81d00693c768c07a13e736bff9b4e35dc5accc57a344bdbb776326d4fc8e870aba582bb7f1ce91ec7993d40247a9e4491a9ef95a5853dd4551a860f1c5b5611e2d6adbc2aa5c6d152e5a546a87f6a3e5a5e0221b658e30cfdcd11b9d873690b833c345182c771b0a14f357ec53a0d611649b93af066f6ee3a460943cdb21f3724219771f1977b5f3846750f6424112a885cb10b10f48ae93756d470ee3ed54ed81ce8cae6c3877db6641b0643689973367125ef406f696eb58c67dac6f1c1767d4eaa82d0f4d35236c998b3c0bbec8301ef4871eac90dd66739b2c73936dd6eec169479eff6d8632302955ef3e01e20193c49115aa31773c625a1eab0d69c01fdbddcf56b6f6a5a799d34d86438af30624bee30d6aa1498514d436a73927182302d2d4fa426634492cdff758548690817c85aedda916b44073f881d0e1ce6aab2e7aeda4cbf24cc324c61569186dad962ec6de7bd095ff7b0c8d52f1b64c9686f70c73a2e3c6e0e29c283811b93e76f4579878bf19a1a65cac5cbf1dfbd53ce1621dcac6b4bf1b5143a90661d14ea2287de3c97d1066a4d405e76c20e8d9ce6a622ac9ee42d232c60d2ea1f672a24414458366e6e12abcdd3918c01d7e70aaf05ae487994a5b84fb97becabc2e6a564d1c0638516c384cb27f148d497f208142b358366adeaaaf229e360b28779999395849d5fafcd6d89d96b05267ada1ed91f9bfac8985d396d38f464407d46017dcb4867d7c5d1ec491d235a0d1c65233840b9f8bdbd237097aae9ada2618c883db74dffb7b2f6d0adb19c76492332b6e8c80d8f3aa6c582595464cc0ec84dbab790bfb1de86cb54bbe24e0ad25b19ea57cac39504a65daa8791c17b2d3479dd373ea8e9f0b7ae0388da35b29953c9d46cf08c263d24e66a91195dc748a67ab3ddc1d1b565acd2a55109b199c553d040501ec9c3c101470bcf49e45f9b40088dd22a0a40c2895f8e28d58871779e145562689e9ba8893931faad1ef3b13fbe728d11f0dbdab3d898ca387ad000b817166914a4dc89800c81c1b526ffc2901db2bfc615a645ea6d5d49ef7728900978c9ea1a02ff31545255ee28100e4ec7053a2631e946ea050df4559fdda37ba1b8ede8ceb446ee7e24ef41a7d0c7caf81b65b67262f7842ac705fe36f803b11032c3f4eabd191de8bbddecc64624c49bb0c098b73095799d5c69b0394f3f884c4be4bad81d892de9e56b8562be2ef4d20ef440d028a9b13a11cd8fa6fb9661524895dd322739c762bc7c13ab66d7912566709ab1f522c406dc6e3b54549b86a7b29fea9bc4604bde5d1b4330817d0d7647be40bfd5030cc6601df002854190fd186ec7ceb90976503dc76238653577055a4ad1034198b32d30302fc9bb6560af0705596ca06b4b6107c5003c225bccd708edb6cfb9e84defdef90357990be679485cb9f112cbbad0c9513d166aa8184818749807b2665e0a08234a81b8d6ae0558c251e684d3c0897d532f09a40b1eedf699639a1558f6c75e3761350465114369edecdb9e04f2304527a68183230327280e61d2ca7b0619efa07e98b133fa0b860a735a04619e2002e9e9a71732bc51bde299beb151d4d5b692711a827bbddd1e43592bfe844ef243065056e7f40ab7760504c6adb9d899c2a601eb2e44dbd635c1b051a8ffbfb1dd8e9029c9d15a4fea5b74c905cd615ad9f8643a9af046d59dd90121092022c0aabacf2a7dbcc82250f451e008646d51f0c655a6c86796016fd266ff7b2ce86f13fe6154a4665c7333fb049d6f7f9198ebfc7936e74340d74c3e745e6149eb31988b046f38e522b2422a6bd154ae0fe6e8beb7aa4c816bd11436a59956eb134426ec501ea9e631aca105dc86c151c0aefac881e0009149a496091be97713360f935337768040b217d9c407828882dd48091779884a834ca2999c031ff13681a1884d3a90819ede08e4b07c8fc5747144c598106e02d7064fe5207613864ab49276eb27a370b197348bd556d9881174626102866a2f862d6d6c10004f2ca0887d7f17f17343074c401d78ac8fd3f47ab55cb19f757a18b1e33b324dc8894f0307fae4575108d37cd7a08aa9c157df624a116a225a1aebb0fa04b38009a9cecdb28d20df2629a4346f2b48fca22bb65573bd28652d02e4709b663d7923586ff586f131a1c22f29f5303db8e5828011dab99bfeab744e816123123b66bc96e9e64e758f805bb202dfda12395c902566c5f506626f0e2cb038a9c7676817dc72e1bf196942893112c3468e306cfe1c0ed432497c921c6b7db911b823b7ccf7becaf0d1dfa618accec50ac6fcbf48b2e01bd3d781a7a8d21bdbe54c612ed8c8e433ca4b7f8a5328d1dd9098ccc63801d171a0f131db61dc46878a0923693c19f599dbb418fc85c7c73b7e04e3ccf5786dce0e06e084541d9e1db27adddf10bade7a791511e0481bcbf048da90aa09bc7bd019eeb51748644e9e6a923a363e1bf5c6b537775d5e722058fe6402a725e61fcc89a6ff6e379864cafcac0c03a844438d9aab5a97792ef193d7d5023d706b9a5b96c865dd4873b350e3322886d3a512bab9f27c9fa91b3b870e26647d52626ba26b332c17a22be9d4add760e3375d028fd10e7a6df2c416119c56830b8e0fc91c6235d39a162a047cb692e56eddf63d7138b0e26aa3fc693d7562be780c432dd54fdd8e18a57146bda6c30623b846f82737d685b2f42141c03edea0f4924e55a45bbbb07031c9778047e62463849dc3a2d25f5666a2b502a1d3593ff07f04bed875ce1105562492876d59193e79ca4135c387d005cc5e758faf234c8128f740c35ddb4903e5cbd69150b9e5e145019b7448c24b12aa0b60c1c0461fd0db1ba51eb4a1b81aced55864b569fe754dc6418de827663bffe0b38aab8cb0b75ffba296d84bb6ee7a90d16ff3ec936fe547877db655672288790f5b9290ed4f9285947453ee85522da2e033a6f5ccd52c828803d458c84647e09ca9e66c564d46b10c85666900bc5149bc5c6468341b3f737987aa0b7dddd2804e9f5d1f0318d910a14dfc9202141cfd79a95aed2fbe82631584c8a44af2584d8ffb2a56c90fc9f1d97abd66fb02bbe384d339fb7baa271dd04cd23f7ffb3faaa7bc34843f0f4353f21d3748eb401ce0e795831e0db60024f47884def0f5cc6054fd99906ef4c46fb872ddf55d3043f4e6c23b3ad847f8232f7555efc0fe5232d7dc7c5b3dac37be54f9781e030b2d2cc1f41ca1674b116127a7ddc50febe8eb00f1d14298791c65381eba2fb49474523e2ec5307a31bc65171ce3f098087a030a79a70cb844e88d1213cfa58e54904d86d2e0222075148152a7d1a2efa27041789aa4f8eabfcb5a43f2f905a6b01200967a61d15f0ab11cc558d388fd40ed4206662ee52f41930ecf87a0680223f8ee0b1f197e21e1666d19f6f4d5b871c07a92ffb8b8e90e30c16213d6a8d2a4367b5d207fbcebec1842e5dd7ce59a9a3f330ace7e29428cb660a06b3436b169ec66b92bff32f7368608a25a3ed7f16ec4ae410111a226c0194e7aa3a98e7fcd3ac238f6f34f5fa5711c37b6081281de0ab688ee667448fdad44ee54da9cf6a0f6f94cd0ed114f019b5bf2f9e6ed21622f3699a4437136159275c437736875adc7654931be3bb41d2e753407be0984e923fca1b4b086a5912c24b104e922c7ab58fbc374a12d75be1bd2a48285b00365bc3692314369eb1d71b85c42f09d747ee0054c0d9eece12f11596e86443013058c81843033b96f2031e8c2c39611d1f6fb4d384109fed2869b4f5313da0b9800b41ec60907fc9894170486fcdeb5835960ee31fe63a0d21e3f8b1539e938f775b1fed43ca09b0d6f9056384ce40d992008ab0bc44696cdcb99d24ab7bc031b40ef7ad59c7bc93c47bbdfcee8f5643c0504dfa659d794fe8f8643a0bc2f3ac9bb99091af3b0ae2784e23489f71d22f42a09e46b4de865befa2a346de0bc882642231c1f76cbf6094c23002be31429d12222de7450de501cd8b2af9202750593bd38b6c35e2cd25fe67819bd523ca87e5c24b7e517b746a23016f645ec988393a89f1122b62fe4862bceb1dea888c825bd5960d4029831af2b9aa1075c647291690fba5f82dfaf332ed2540c9bf3471b8744ff79882d22b5ae7d318d70192b5a12c4460d46cf1af641a69975b7ff07d41ef2a65ff1e51f36512af357c16c414055e5b3eef7b5268ad64650e4fd8c19f4f2fa3a842d1f2cdf0a49005f5d0350141f9490a5e2061dd03eda013346af81468b1855f1b9718020d0d158973a41b38b270e3ced6b50c4ff42bb78b4a3361b121ccfef2472d4c32592a2a3f4155dc202a8e784b661a1a28d224714853636900f10c37a31deb824732a3d56aa2daf861ed337d7cc89e54b648a78666279d903d475f7d0520561a4a2e1c25ca1a11ee59543d90ee4b80aefbd9d776187edf7bc35b3df1efd2f0c8410d5bca2536c75bbf08f976efdbebdef84cbcdc40916b9d38f1a13f32ce1f679fddd7c24f5f926c1a2c0a5ff8f7a657eb0bd21f1a10a0adf82e62abd75d057b0960a08773cdd04168a40ea6b9c8cb1bce3f101b1fd1fffa4dfcb610905f8279b9d2ab87f2db75757ec60c93937bba28a78d31753e536f04f9e84d6c7411adf693c26ded1a4451d08afb978bbbb2bc12591f520a5d2bbf1aefba606285c479ebe5acecba1f008bc9b4afb3503739bf1e6bec461d55dfda827fb3195dab61702d48c505b88925e2cea0fd0bc86eb7bafd2f480562bfed37fbc92b2e2e3904b07100f8da40494087a968425c85bc743e011b137129fedd7752a66f1dcbbd975e6fb14a047ebad528168f98d9491fa140717bc20dbeeda0c0aa4ee2d0498b2e017e21fcc06c5a8dd63dd56c7d93ac939832189bb20e7816c0e0b3d93e7dd3cd51c79cc27397565fc31cdb4ee34ef9365c2812c341c70e4d312e0076d0154dcee2682a1ae2aa9db1881acd181954a2e1743661cb7a3f524a855c6f05e4629578c357612aad2b23bf8b8e9151b14a008d4cdf7d5574d330706ef158b04f941249c139d7b2aea6e5bfa16d649055a7706e8b883c0d64a3331d08a65e56dac6fd367ea257f84ae464b3fcef0555aacfddd6f6fe9dc5a2c28f2b0382069deaf7cae4c14dde2a4af2540967ab8fed78d2d377d70084c2266d135b61410e1463f212360c290d1c7c4792f721b046033d6ed7acf193405b973818af0ec7e026c80d0a28b9fdc09ea73bfb0d0fecdc347d193d107513115d520c0739fd34ae7525dd795d0a4d6a8bd189042303c3944dc2c3bb913d40a918722ad5f08777bfa45e90125afe3160a9cbc067918fff1847147324879610249f643f88086295a6d7ef1b1ba0c6999f4fe41f2ff9b88d54445b94f58b066d56d405b452b3b38c8f51fea981f4a21da56426c1cbd71cba4dcf362e432481e4bcd317b5bd0a67db67b0a559dcc252b459ea1847dced7c8c8b153e3abe034f70e2b29f708783ac9c8dc073240f49a7609662801c9f89c48d55772ba037be420b47a473329e21e033021ae4da13729695a7bb563f6c277ced9bc63e305ea3bc2b1f9c0e7227099230376bbad2091e51edec9e4dbf0d2854f8e75aaadf13a5adb51a95bc19cf53f1d13716084390d1e765f3d4b296079700bfd7647086e9e01d4e35223a303b9a10fc061962bb29667f31261e7d6d00ab8b044ca292b91ddedfbe6877d260096660e23c6b8c41e883763b636c71d787c019b3eee8665c401178af18a6403dcba1c8b6fdbeec3a0fee6b2878bc03f30a82ea62d2cd60c46524e445205c68cce4a49f145e2aea07be1e7e38e41ccf7e091cddc2ab0f708b9d210c8bfc2af7b4d9b7ab67205b53667c8e7f9274e2eaa3c5e4cff1b6d637b802f189ab81b1528f912e0f398a6e9b6dcfbf2cf968822d95a69b1bb98f6bec02f8b2d4dd4e5ea78dd4648d4e9835c2c5d6ea6e57a633033fef44eb478a056a485c7523348583bfc549673c39768c9e0c51649f6792be29a213655f54ee2df44610776c42223ebf6eccc4fa6eb7f122fab17d82b85941859e556ec947e5af5ed293382485a5dd2e8fe0e34edb3e6a0804e92f23a4bf9892102abd65310a2d65b1fb7147d5a29155deae468fb8e470296c6a9c55f04b2dc6d42ebf8d65e6ceafbb42cdb526f7b1af844b7185234b687b6fdb64a530c5d63b60b062db1a9b2445b6d424f563f784e0ec58c70ccfc6c6ce04c70d2d7e48767ce7ac6989679918446171e50791dcaa69a6125c580e5dcc4ca1bce6eda84dc3539c95f658c37075b16f6843b3f5d306cbeacd5ee5c14906f58afd327cde5c43d5cbf7530ac0d510b206ff85da670d5ccd1b4c40365287bd48fd8ea07d33241f7da4b68fb0b4a4c55f481f24118143c7a52c5ffb219cfdab489303321cd0dda1232eea3ad777538a4a7ceefe8b01e7e10681d51bbb283ced841ed0d0df633d40fb174de1397c9b193c0e638828e82e2c9a20f59329ca4287d61feddd39fc3e476e4d5800cf9fe1f2ec61ee4313409af24d344c38c57c74b3ca3c0d0dab0ae4e8b91c5266605797626ebad7ab3238d4a7411d554c2c233d6c96f0cd15fff9c548cb6d38a7633359294a4c2d203297e0fe8dbb2392385632e915ae5d230d9eaa57ae5ab014b4519fa4aaa953795f9385ff9459b05b7f88f98cce6821e3532f27edf388d9d98fceb5b92c3276c4cd6567375a29dabb52a75da242b7a314809d267959b263df1e6f373b9c77d8861c95569c9e9797aa02b7883e0027637e1051995b20aa1e33db0bfa6a0c679088da269cde95258d64874164f02fe2a716bc6805bb2b5ae2e85f77508f28d09e5a493fc7c4b4ff811d0b205399221532c678a4fa0b95df74ac3c736a31654306a9dcb4e9465a15adc26c57442449a8c83319efdecf6d74592421c0860b68aaf60728912ece1ab8daa507e32caa501484fed83c9a5689c2de2ec0af973caf23d907b403a64b6b1f3c21c2e12fb07afb69b89aa6b81718dd20eb03e086e3cd27a9b64ae9b033b693fc4e1592387b1aaf070269e2f716cc694246582a7a7056c2ff46985a397770620a0b33c81ca8c908f889cefde81ab7830d7162800443649c13961076ba66bf3ceb306c45cd5848f8b6bcb6495f7013fd3e84baad8350d369f53c105739851238a9f0c3bf7e03cde451595445093100e63c376aff60a216a5d51c43ec80bf1fce647237a7f22bf19c83199388be072c3982af0259066fe01afaff41a285f6d990bf365f5546d455ef7ee8aa0c71fc95033068d0fb35e36278a00701525151b92729f20716ebca2a2a91aa73b8b3d7cf1095874df4b74ecbbc19523818c603877fec492228aaabcb49cb0c5f8256267b76647002d288a0d23591f620067e987c241bcd08ce276a073e21b3acf61331edbec6bd129c2e7ea3df45be5808109dde59d1baa6456912390779193ef5177f0ff4e977552ad603758a1373dd6b5094a626b55de0f336a058e390abd183a49cca8a965afc770cd8279be614b1ab9d1e3cf458490030411c2e1f2f04edaf1ff1a33d3e08961988b2ce49c2b0636a076cec93e6b2c90520cdedac14c4a87443ac5cdb189a42223ee196d21483486df2a64820c35ebd7b680b1b7f6a3d5dbb5756a7ae7d79a82ff82ff440b4ca9afcc1ed44dab63bffc93a3ec0d87697d2290374b472749fc19a42ea1db1dabfc41cd085fe6d52a1a557e8ba08e9d01c7db50515c2a32e3c5891a7ddae9223edb98edaedaa01915330d2b84e2e27a2b90ab1098c149a81b60b522e094923e158d9fee0f9b099a281d6ab3e9445ef4f4fd062624736cc9e620d256743c62c0d387c348c2fb60453d74f1a8a6164cc68b81077cb0d29d4d2846ae974afff20a6eb3df9e464f66c47b4bea18301c2eac14adcd9bc56eb6a12c7b6bf45c0acffab7a7b1fe70d69f6ae5093143d7dd900ca021ae1c97700ffd1b16617b151e8fcb7ed40af480580c9cb4a4c92c69b383cb88edf652feebd84bcf52b30df8dc58f485d0e74a8b2fc908bb69f2271a9412c9077331f537765b857be7d6ff48e0601b03755eaf7e5d2434077215131d55aa3a361ced31dd9f7d055e6cd589a5a48a2d43b0121f94b6a8bcb8353526b8c16ad83f7501a2df9bb237f25fd05bd8449b295775fbb8b6abe34f0ea66038f385c2451ea912db50134c77dd904a41ab0c54c1173434742c690ed384ad073ddc05144870c08ce31fdfb5b86ac5fee2f9e49a276613da33d682a862fa272236ec96c36015446e356d7adf5fdc197d757b7d7258eac95d90481973785b6471ac802f726e17dc824a5860dfd60f98f253aa6bc8376c71bbf88e14fcff5f1b0f473a03229308410fec36fd004946a8b6808219e95c75fc36e9dea6cc242d4d2f076e3c17bb0e7602a8012afe9450778acec6ecbe39d865b8e73ae85f9f3c448e0d7d5ca2bba4fadaed67cba29b985e22a2442daad690380f751dadc931ac9285a6054fd05e01a8ed801b0db90749644673383fb808a8adbdda51000bb08c522fc5768e8566b4280b0408c36d9a6d12ef4bc0a31095babf53c64793a3b794eac375708c3769ca46786bcc2d90d8b9e2f8dfe18453cd24f1a495fab30be5130fa2e4a5b1d22256f43176c4a58028ff12eaeec070eb35abc8cbb5beea7a0d3e390864b13ccf18d74debecb0f12e4db6b1b2608da8bcf3c4a6c85eef8db244b691d5732cf20f0d8aab1f5b8aedbf4777b4f4801a491f40ac7f5735ad60c42689138cb2d648ca60fd67548933c869d5f640aa29fc533c928911e99d375fd8a7ebe28309376500c48970cd28c020c7f3a338fe889e1766b276c6d175e090263edb794ac371a1a22b9adda656a7d3e3712cf20dd1413999b0ac37f0ffd3227c40d136a78c74592ad3d91e89becd842ab08a3d0b16d0ea230c5994ac0bc829477fc6e8891778006c50533b83a68542d30c36aa914408f9190ee72b73379b1ee6cdb9d8db26cb50233137ab3cbaacd0736f5ac3995804fe4949bc0dad0e1108f96f39c07e1b63081908ebbf9576235bfddb489460bfb94217d09d176947e8d50dbf4dca0fff975254a3b275b297b6930b2d04d9115e6865208cf1097a0cd1c41df0f8ab22434398a976fe8872c37d4171202fdd969cd66959ff487001c41dc62dbabef24b40a14e733f824bd4bc401cf0961aee662ce2c08e7e71dde9da5e7fcb0464ecd7c7b652403d712bb9200dc6c4b9dc80308b91101febeeb9d0ee049af0670d0205307a09d386e1016ff3e0247e563addfe562bf8f1b589a605cc713459c887111c1a6bded18b0a33eb3db58dec051796312261028fd66af69e9dfb822439c9a0274162d61a1a4c72cf0b2208404114838055e53ff0fdb86856d3c6e4a28365056c9d28b19ae8fcdbad74e631bfe053aad406170f9692583f09452b3f298dc7cf2158b4429cedcf38619e620dd60723a056213103904f39505fe4b956ac0e7e4b4ce3735d2db55e2400d27d5201fd2bc24cf45d2bd8878a0838383450e6d2826565c180a2cfc76cce131ca61a05bbb11fbdcb8bbd67e40d668ad90fd0a11ac827a5d07cfa0555d2b59b8f2f2b4f90e833ff119da56c87108581c2d9b5a7a03c70c39e1005f18f72845be647e7cb63c6bdd8d58bced3ed7df99f355492a32ebe824ffe90b33e8bf8eea189c64038f7870ef9bd1aa9fee79a43dfb806d11e55e24610dd3e0a635a2d039fc55e449d1b62f22c1662f619891f0ab0ea2ff76653c17985fd1b25881be516a66449f1832ee84562b63bf104f8d327b1e56bab6d6e14ee347a64b5bdcb23cf1695d7c85ea181e875c570ab971cdf2c80a15fb49758caf03da703063f19abdb6ce6e4356fd1c131efc9b2cf1d3dedf968608391ced7b96ee6d071c6a8e38ae76cafc922c3dd99b7eb5c25da32c8892435d119e8533fc3bf65ebd02015b7013b82996ec98d18793a6c43625f0ff004762ab4df9c04e83b4768ba6df27a8b407f5149907819b5344f0e4a76c433ef88880293866ff353ff4f4b5f35789694ea52008808e815026fa225f0cd3636f65846fed129935f410b495045dedc4e2a706cdc292203e0e4188a27690bea5f86f22b7b5a857cee935cafb9dd50ab51b32c6ab96a104271a12afacbd795976718602098b257abaed5d77d1eef63650f2db3e2f815b83a359f31a74486571335467c4640d5257d731515bb0ded783e589fb8559e3d7f17f455115860d679930fd5984411c39c2df51e320acfb8c2b8249f0f80501558bc9d97e4edc268de6f98b60905f169ead6517061521999f68d1e38c251ebca319e222f8e48f084eacc6ce695f847925a83d2db6b75ac221d6e092e7338a703e66f5ec3a3a4930e1ec40a7805b167b1256af10622fcf44b11dd191f4f145ec0ac5fec7c99845beed924138ae664b56fe112ca3ff0a2212a043651ad8b579f32710de1f11856dfc12c6be0f817fc81a0e9e22ebc75806103faf3bc26ab1854291ba3ac0649a8aadb04452e18456af98617a3fd3538f315e060fd875bef2fd0f58f8c2bc0d134e14f71637cf880c955edad8e8b611258b9d0895cf2304e46380b28b1c598043e82dd57e44ad06bc617f78ad02b205c9a0d292e0ccb903a834989365267713e54690647ea678a0e30f8545f43420a700b965204ef96330855644eee547351a9153ddae1175c5c3a49615261002a89a3c7d28061d6870254bbfcf8c4d3f232c3b458bbdf452b4ee34f22b3848515cbb8621ae96977019660a2a566dd107b2e69d8f88b8b63a3a3db4c384833cb5dec81772ed77ad64ba5d2f574c2cd0f344976ed58deba32a0351fd15b151547da3ee939f239e01c7243e77da80e84b77ec27a9ade9e837aece030d51662288da86781348da2cf9e4d91fb1cf94d77fa9d82927fd506624718b8cb4168d64f1be9d785abca0fae1fe967e8bece4a59e416fe8fcb06e2a6bf560d9025878d4ec80b8a1a000f3460ca67d4d0f389276b674c70b4222c1c22c5bfbde3e51faf73e1d4e1457d17d911bd02e2e9d96571a739353a1a39d22247711eb86f688155a2726035b1db07adfebdec94af9755e8a48273d18c61d81e6f03afe27cf96adcada8b8e2422475af05eacefd52e17a3dda8c655a41d9b8300f1e6f94d59a743ec7ba5245af0517981f8d9e6f8baf8b86a0c82fbff35b84fc993861b390bdae49f3c4c73768f4106be0437f20d00e5b95a3cf611821aafbafa8c73e48c18a7012c4d20f6cbe87e71f5c6fab6e44556e79f75b643915068073f7a1d94604f7226ad60633ed37bd4ab16e4415a7b80d7903b448f9031760807a180d55a7f1854579b5272b11957aaf1612d02750c1b0ed4a59f6a0260da01bdc294e39416814845ccda753801cba9e02968325471d550cc2b2ef8c1fa0fc8700126355ab49b98e12c2b160ad383e59a00692599dc3a35e8b9b4467ad4f78591a0b8fae470077f55f1cc14fa24a682c61762b12d9f60de3c89110c2408f3a83c4a2a9c87d0f3f111a71d5a3c35fcd49da62b08414d6d34a28878cb2b1a625dae9d88dbb12b6385b1ce48e25584b561963cc230d98d1c2b6e31505279a1f0bf4dd9f44a5b50108abce5b4903110cb5afcd61c89c91f2ac4be423f7de443819a9b38cef2b501ad2a42123a943856ca3e66f327b4030242bd9639c4901443a99f54c2c08d768bd4bf755ebeca478b2aeae56c936ac081d81c97b3081a4a48d49978870f31f7f774a63f0102348cd06621a8465bc756d11f7edafaee277d33e7f2c35ac543f025e1db35138430a298f796cb30bf208294ef18e18ed8286233e477bd1e21438a8088e5b88fc664bdfefad96158f5f8db305babc207f361aa787711edcd0040de5d2b60d38652981e2f1346fcb1af0412113ce3b1340489010c7f373f1b4218e146858c017ebd9305f3524de2fcaeccdaa814c7dc88b7202fcdf6aa417745bc1ed88fe3e2bbbffdfeae08fc3196641dbc86d76238e96d608cc0444359d7de34765505d899cc0d538bf10ebcdeb8d945abe5a1ce710b676394190b80a76b7f6aa56ba74f2a7c86a6157ce8890a5dfbe0a62ae28ae7347f0bd44d3b67461b7d85a6739215ee65c9f304f1d64d34baed53a40b135f1080c599e30fd504f462631e69f743e766f7a8514ded78feabb6ca781789b2eb83ebe056286d212175c9e08c0a5f1991b14825c501f3e7b8b59e242a11768ce43902711722b383c7e61e150d4eb1dc3d7b99dd14b1565b2f98f16e59e3f6d3506d1ae3c1e4f6b310da49462744bf307a6b1d361ab45835316aa96ba83fe8e2e5d5e2d0b836b396ea62de9b5f83e1f76cc1fb7adc9c30983ee0fed148a50489cbd1435bb0d69d2d8ee98754690fdec4ad02506ebc30f255bb96c281e1dad74ed2a0ac3a477f597d961b2c7bd0627a42fc11d00d04e5b59c950ca94d00b64bc0945fb3dc5e58241b4c3c13b846b61424c6c86c751c55749fbc48a2545b6375a0b09f5ad8927359de381f0c4b1294a50d8cc73ba487915775640afe2c3cc45a7f060cb1ae44b2931ac78a2e5539b3ba79184d775a5fae5df3d433e32c312df49171bb3c7ff1206a515562446b7a5a0b399d22247ef327a5487927fccb78aee4d40fa26f7c0757bccb233d8e2af61d588da5a51f5a00f32ca59af193844e11787f86d1fc968412c1af469bc8cccbfd775580dd646523d2fb63ba43e608908e372216bac21f61bf3a359da80ccc9fb3689d5fb058f793d2bbde05e6f1339677b48a606868818db2ed04fea2c00fc730f03586e116eba4642c404df12f6a09879ecd5d620c7af27ddd8e5b72a3790c48239ab4155e147d0c26085b1068686cf17b89e8f62156670e25f1d1b0234a2c8c2dd532606c3f2b8940066deadf66f56a922b8c9cf60da212194af4316cd4536a0de98198bfc9388cc1b7c5cbdeda337e1ba003451175a7b390a11d9e4040894ad34eadf3117b6b3861d7ce0de1be0a2404a40f7de0cad44410e0f892868a392ec0090cfa482ffe87de1dba5402550fa24fb045ed2efbc9461e05b52ae48b35f65185464cf6b462e063f4f2c6063dffeb4848b50b52a0a14105f89f0aad3dac2c35466ca7af93e8723ffdf0271dfc73506cdfdd8320a28137221b7fcd608d32ac486c2909c1ac125b05ae3f11281019adde1c1329cb3df59849f502c88f1bf3b9dbe218cad2299ee2b5cdb14715068dd52809b001e98740673798fcbb4569e6b557a9f6daf4cd90b4b55f6e151cc2fd4b9646e97136b108fde318263696076ee49074466211ef7c49c13ae075e9d83845ead3cc005304d81fb57cdfe489f2594235f94478622c8bf8383ff6074a8daa64024811500fc192f8c1a925a5db63022e2821d52dc8c53e41c5134433693b7f67e0429f6d0a93422a684846bfe3e797c3dab31cbd0e6dbe76f6788711d335c3bdc070c8ad0cb4ab20c22102d82989e9baed187e4e21df4b23ad043d91383869311668ebba68721586a097fa504823f94abf8bee2c60787b4e58ed29486b2290f005ea5b32ab0df41b648a4b8a214457f8d006b68db587d26a474d55acfe7bc8bb9a795e2c101aa468001dccf1271148b7818fd7728108d3e94ab8d42ce7ea4e38e1e8429e985c08a5b5e2112f514f35ba2f6efcbc52b672a1a6a1d8bb31a3353bbd89267469059d30207dde74a498105c20be18992bc0304053b1c45aecb1e82d652fd88a57e6d875f16ef84f3e627ec84d1179fa9cf46e212ecb9728c4938b398fa82b1517b33f1940bb31e13ee69adc6d9b1ac1c4de8c40caeb788364dc5bdef3805cb6e2ceef695627b21b443c45613a8bb2f2ed5a0f2efbfc2aa0d428179a308318c8c7e5daabbcc30e7849bfcc11c8db56ea1583f0de3d322cba806c9249c5542b2c9877ede25c23475ab5727d3543e7cb7a2037b9356ac95ce4e7ba518385a5bb1a752e9abc41d73b3f36286c2f0599d3e9f23895ad4c5c4b442811bb430c470e634d0751a5c5eb0b4eba30f482f35b67acb748c7a7df179c043f661a2a1531e30fa6a7ce50f9c2162097b0b3d168abbec56b36d2889ab4a8af033097c9aa15182f3f3baf6508bb669e14dc0fc26055f4699522b318cb6fed27025105446dd3c9e62d3d796934d0fca083ef3e54123992cd5be88cb6aa4acb41ef6c20e394e220d368258ebcac7cde12b2a3231441db814d82110e9a078cd9c3afa8e7cb06bbecff84ddaba5e21d0a20f66938dbe31edf9d6f0b28b8bb04167eca3b2ffe703a230e8ddbd4bcbe576903cb061a907e2d01feb3220be336bf9640965e64a2d71ab29ed35b0bbd0db739a0c3a686f44b2d3c4538836f9bd32c4921b8867036bf9e0df731b46458c0b24100ab9daba55026c39d8ea78eab8951f7248d77b119191f91efa5d7b698de7e209089d1b452f538762a8b6936a7da646460e43d49d78424a3848790bb9c2b9bf641b1dfcdd9ab695301333bec634e610165af8860cff21e80f301cc0053cb26351fb4160aca6e99fc9c1717d635396a8052fa97029219c6570642c519ca55d40883f1a49b1b94e42d44da967bd7983474dae43a0d9c106ab6957f7bd7e98f919cd87e29f46b4394ae40724246f783dde38bf5b286fdaeca31981fc047567e7f6e353833e548ba1ee51ecb2cc6f575737568f203bbd412c8642d36a14c10347b3843afe9079b67adf8bfbd888633c531ce524aa8c423e4c106a287a733c2dc49892493e29a394ca38c289136c34fc730d6400d66e56f5befb615a3cf83910b1a35f704e7aa114a843f0bcd23fad81276504b8f31298046e11e91332dca33890239c82d924439f258e00e3f4e621b6ea4a645fa1c451a0383913cf7b9f070861a92b4b935b6a513803dd7e65ccb44ae88611f7af66ec68ce1afc575f9241afb39943550afd4e8cb67ca4e6c5cecb86de427b290579a207cc7d8252b27062dffab384ba338d4cd6fc2573f02d4a0421a51ed218b19f2f0fe3d81eb819f81b4c6b735a31edbc59ebe5eba4b081cd151ea943052f72e036b76b07a70455ea383f291b6904f1f9eab6c793b645c73635108abf378a9571fa6a505de763ec58f9195c4264ba895c09c3be0bee4644b65b029d48f3c48c16859f04251fd2bc24d5d83fede56fb05d8ea311abfb620e56b13fba59fef5f22c98189d3a94cbed22b0bf73396d9ed71a986d07bb75e56f6eb4955ac218b1243c205ddc5b6085da66fec5fbc41953b27b7b151e7317c3e6f9fa9006f0f2f89cb53092486577244abfa99065e705a39e4ae5e2f9182626c9c67fb0c3c17870e6a3a9514a789e90dfdf977865d22ce65218a910214de41a7894766e9d41b80aed92573c0c12e1da0fd1592a78bcf60f9f4fb0c5fa1cdfbc792f78f9714ce6cdd692c76e05684158b827c2fa26f03a9dcace322b61a76180d8e91063a8807731bf46b5a4f05db19373b88d85e5ca06893277c57bf2c1d781aadafe2256b599f2103d19a9ebc7c75c42aba47e25e31883f138f7e5b214a3bd32ac84c41ea1c60dd43cf2aa7402729e7f6cd68bbd47e26426a839c8aac6faef6552267d0d7894bf5e95618a6d7bdffe5c5ede31515e1b4ed325f5f1550f8886138ca405ef357bdc79bc0115462404d615762d78913c8f9292bc007c9f9abde4ff78a6cb6f0d2640ad4407602afd3825f50af05fa65db34e8c8ebe1460f776ec01e512e4b64f62b81b3367c1572b7489416368859071baafbce97d325940304d6f58029294e354f9e03f4d03a42e4cd0e30b88c61d9399fa25f076f9bf896f4733a986d1d9a63d17e26705f1a681a36bf5b9452383fa018bc48d01a3f9d8344204c989ad191c1b6ab65993d57ffca0e9e931f34883821825e8378a74e824e48ac94607602f5f2659d35d41682c275c861afa189b898101bec6e1470a82a16ace3c95a03e878d8b76c6dad9578668fea2d0952778403f082a683c5df519c0a2580eb9dde228e0284cf84c2936d3777395d49a13dc50d38bacacdf6cf2003d309196c92c17983a179777451abc874331d342e02c115ea9147a565968cd52749918105793517e9ca35af49a18626843b6f1a63fb087e3b4133f55cf2ff79ad6b113f40e04420aa1cdc447c6b3700b6041acbc2a17fa81712445a07f070db66f4edb4408a8e499fa7cd821908bab367cdbe5f235e3023c588d872f3f415ffe0c461d2faec735a339303c63e74f57088cb89775dee600eaf9a53e6c9608dc9a8467d8bb5b4eebd69c2ed440927c45337184dbc906963f627a13f13185898faf4443dd558ba30fdcdc4a6144333206c945d7db4d5d1460596c31b2c00e435d6326e95e239394fd8e9bf411cdadcf6f9899195b0898ae37cc25720ad74042788885fd66da309c6b13a0d73bc0678f0afc6b0a71fd7414e880da125f5158d23fb53567db4a42141a121e7b2326c50d3ab3ba34bcd2032ebd41237c056575d26c85c426a8ffb575054ea3173f1c6833fe8582a10a269bbaca3d082ca1a52e5553c871f0f82522deb356c416e88538dad8e1b4b912c176413573507db238d1a725533db557c2285d9304e2b7d19ff4c4d24fdb48cbd9b6f19d9194ce5c3424431c0fdd583ab25305ae6cf6b25811edf0f01f7224df67873b293930dade3e3672055224dd0f9ed455cfdaf041268c8f49a7beb51de0aff27365b215a241d71f41174257eeaafa0a68beab5a9ddab171a9db0721ac17aaa90242b6943c394feda96730f8f85312d12c27a7a88e8049486f162b3ce5b02111db0fe360ca416d27796f25d9d2e78ed1e5ebbc0a20b4083120865fe96daf9125256bcc530a291541fe87c72eab57e15c9643d2a61e4db5cebaca8f52f9a85a0c78a40ecafd1526a927f18039af82075cf1bc0bba98f7a00402c1b803f4c574f6d40db76cee91506d0da21402298b2bef6187aee3b85f7e153386580b82914a4b3c69cecdbf1a108c70174d933c9db0f54bdf8f546b514fafbf0512de6d20d780a002bda80a5726055bf8a28603219d862fd92910297e4ed0227a3437e42ae3f78e8e6e22345dcd87ea404d0e29f6818bc82dd1da4109e030465210fca758bf462a474af16fab51128c5cdd66808b9e038eed7cc7ef9956a00bb082b1c4685bd314aa0ba2492cbd7d10bea7099d18d1d6a377bbf1ea4db13656f600611c12a84cbbed41d571aeb9934036ed40536fcf813125b2ebd953e25bbd2a45cb7a24ee5f6622e8ab37465619bd178175df9b7c95ac64367378c3cd0140069f1a771f53c1aee04e1f055038c566b91b95c7ca22655c860f06904f68b7e18261c129e2dc1066f3675361e66e7d2ab46b72a4c2a377378da04199aff21e80ab70b35db6770582ba46656d2137222a01a683821b72e589c8aa7f49217a74c628dd2017a48bdf83b2f3462487b2606f2f47b1eadd7abaa23616f5adebf77a39d3d323d14938ee88ceaeae23e1b4c9b3e3ce1f472632f5b5f39d76c946a67980a135458b3ccb1c9509dad37b522981d514b41b4c131642b50067fcc118d524317d9e9bb442ce396a86e5b428b6a40b0e6e9e857065be7c103a77ddd2532889c1354383e1f9c160afe5590bf756109964587b7c9f3d92666eb9783551511848096b8d8fd30f17c9642c58cee5c0d6de55c522906e7c45d0939454bb44fbb47348db92fb76d51b2e1d7b32abbbea0d179d49ee3913f8165dd8456d2ba61a5000ca6596b3b9f3723523e0a7d82bfd26912cdcd8870dafa7bdf5b480290a8a735d157012a965415686d529745418d21602241402b778291d72f7fc183896d77ee248d3fb8b61648c9c9a8e19492e106ae93b0cfc4306970a53bdf9059f151b3001eea9ef41e1eb894adaaf54a13bc734fa0e6f6112685be9f080717db0122d99faa1fe97e05fc1c57e6cc110280d9ab0dbd8ca86243f9fbcd6dc56ad9e77625902dcbfd7b5a172cda669cae253cbb95c3c97c18ec3584f70c4491f6d34a2c55bca6d25d7c99801f94e7661c0a03320031466d9e9adba4e1981b7261dd844d109016712db57388c1d35d1b999928634f84d5ca611cac5e53d2e2039b2d2c38a0d3ca438a9502964a21ed1ea5ed8c044b3e022a4aa02858f29d365559f77471675ef0755b25c5bf04c2f9f3b1f39d920e1b498a3f92020833c2755565baf15e96b2b266a118d40b39653c63033d31ba1db30d33b5f2e9237b2156a46bbb2c74619f06619a53ea93bd56ff1fe58669fe7511c7a990ecc1a5ed2bc9e6d45f87e5196d40abc44772e37ff7f101988e8a9ebb9ad25949d694f124c02153cc6970290d864c9fc72aeff8e522298c4cd489ce25e2789c1921c1422806bb805c617c8981f9af5fe0e4e9b95e6e60fa69beb19c5fca08a0bea187eed957d3893e77b59a91fc97d7290f6c23b4e17520f9430e3a898c7259cf76caa23d06ccf16d36e0c7900dcf3f1c0c6916d425e20f7bba9b45a1d09dd87e58bb85a621ba8d74406a767ab59f97334fb7bcfe113e966f57ea87b90f6ee7bf4ab3660f2436c764f87e32bd6a4a5f978fc6e9ca350260a4c1d4d1dcbcc7c059ff8de670c2a5faf08f5cea1d9ad4f931ad45fceaab8ca38719bf8ae152e302a7e03c453bb3338d02c226c1776fbe8e696def33cc9a8c9000c6b680a5d20055aeb5f01948480f2206be62f668247ddf0c7424ca4916f324aeea057e551b0629edc70cbb75059d714fa3f5d707c4602e27bae0361062da7c6e503e62ff3c30b0d6ea39534d6c23d2f89dc49d6488392305f499865b2e861f20775641888c38bac092a1338f422c4e159c1e1473ff24bd214cd639a5fbf5823bbf3537745755101814a4cde63c0db6511d4390fce353cfa12700aeef529f39da47d3d78b77d7ffc08871e5061d166580596586a33022568e0a95cf7736f611b39b315357615d4a3f6f86211409cb0cc64ffb35760123cffa28be2fd724596afd020fd0606d159ef9d5720fefe5273afe00cc8b7ed5865a5d488980d67ef2092d5bf331f2fe24071b68d51254e57c1881dbef8b4bcddfb4553081196965fffc1b05b39562a191b41e6ad1551f9afb575c21efbe8616e516d9092005a6084a09459996d80416e9ceed1877dec58fb910045aa73407dda5e58104366d3712aa903d766c352b84e78676f30cbfd99547d47ca08c2c8728e5f2ae3df8a8312186375af03aa99dba2af73c21f87ad675dd8798a7c997a65a3ae958d01b217cc4b98bb08a3abbcb77237092036d9bc43092367d4d0aaa905cc39e28e11a72a5045123d211ca54d98e669240dff4883fa2de45daf38c752977fa811c1b55609c8309b3550a367079c1f6fc8ed12bbe2dc4c9553470a59d54d323420762f84022764669e2bc16e67d0bfbf723c270ade8cbae829256ae252aae31387d096eeb18989067ff40ecf6d9be0342960df95780ef81a84951b907fcdbd61bb4d88492c590411462e5e1639a5fa251c03212ab94e4778ebcd48ad5df206b2fb4fc4033833b9034bd6ead0673578d551691020256fac43fb95aa6ae497134ca08e7d3518057f3261387cbddbc1bbffe402c25564a7f2af46154124ac783318364a6f22f293e3a82528bf3c284babc3d064f142758ea9d291de32f62ce0008ade2de0a150a61c86b011430a144588b7ddee8ac29f9fc767a89615593c7cef9a3e02db71efb96210ffc816057bdfab5fd9edfed807ffb3cd84a99ed564ecd5acbf159a7662b9e83f401c9489b65f88d28c97b3be308c3119a80eb23877cf281eb11a6be5e765cefa15ac4bcc8dacf47d8e483877609393d19f95c9a51932adea06a1ae4cb3c0ca4867dcd8dc487acf0cc0296852ec641da9d7c90adc81ef02981c82e33da89718949f34877cbe0787bd80b8a88a08b0d6c8e100a911a79aabc524e257890db7cb927f4305ab2683ec9d378019880afa570ae15f6a52e8e170567c9a91092fbc294a7bf71f5278c5f99b46b78713fcf3b9810f421acdb2b014059e9cc5627e96660bb8ceb2dd172f412e4f6c614bbded915c71ce29d7d6eea3da7cd166caf4ce413a5f66002edf6b1d496bde3823c26117940b9bf5f4949d6ec4df19310a57bc43a6ca03b020a28f1bebdeb251d164edd02169a57247af1122ca37431883469aa901e50aee0b69745fa977c45a9477c1f45acba96be8bf42a68e4a48ac6ea275dc87d5647e2e4bb616ba6f4586aa3a8fb3deaa7b8f082cc90e104a1611654166541f14826d253082135ead870a659606b596b8adf85934b0b079d1e7a348209359f8d168b15d0ef918bb3dafe822f91a9131008bf9bc199f3a422af1388d5291f23219001a3f3d5c5e109fc8d4ad62a06c63db3ec3d1f1c59bd61ca52b8e4f8c4840570a2e9e26665b3d8541ce32b34a5b12d9c425857fa1bec75d78721537a4ef452ddc253b79c087a28c5bf338978dc89be8f76cd64a252ef0e7d46944b1d89efa1889ca5c81d67d660f50610fbe71ad304d29f313fdfd898071a4e0562cc3b3a65c72a4341a59bfd92fe192d481032e53482eff4d94565562c8f75638a1ba60594a8156699ae300377c18afbfb4f302ea6b3963704a0410b565f7c971d249255883432743e5001523f663eed6660591eaf966200fc61e1b87911d4c7522d50ec5ec51c15578cf50f497b113e1da18444d50dc7e723f0363c352ed6ca3406f959e0f064827e72f9c80f923804a3555826927e11609a0eb522669404843073b098ae0603a2041c38a2f4214289217cef2c63ae05beaa00c4b77f7620750c01f1003331775706336f448ad32d03974ea0ed155c22e2c0b50284ac48930d58be043c9628b8faf8661d782ea9437cf7dc50820019faa5d8c33e845ac65b064d007cdf0aef93ccf25126d3827b7c60497cbfaccd4530e981976044008879c184324b2281f396bea0b15df5aef0a80ab4a74398e3110515c98a8de0caba4a43eb33607c9a1bd0776134292c039741b8e986de6cb8a66aac1ae7bb9472fd97d61c6d8b84070b1ff7096d4fdc52e66d17ea857ec064a1b77821eaba5c7cf25dfe8dd9188c7a70f327a4386953898c50515c5e07b0c8d6e20e0c40e749b414ca0dc4d78f302122a0d60d41c0d7fca4c5f851b06e55b183f78e629b3fd93c1677a707fec77251ee896bc52d6e13432c95e54ac7eedab5a6d4f4bf009343e6a283a80128dc03b60d32c47e69ffbe15c3cf1539a46079ebd954b9b07ca34564f3051b25957b3fd9c146a43835ec85a59bdbece417978db00e2d86ecd767eb9db491a3f74740fa159f871790ca84094bfe32f747885cd831b693d2e63e75e963254a313fd01e86d5d29436397bf7d69a7825a8084a5d17d7fa6f130b642e0e61f86b346e15fcbdc868f4409d046959b16662eb78ad806784ba3bd0f467acc909bef00a7acd467eadebe651ced6543c8d98538731381fd0a23cf0ee97170830e471309294933439d001954d21c72ce443210703b0805e073ab3bba107a02a78b87e77fc3c2384222163c35a4c46582b2448b3c808c48c862f1a2b4ccec42968704a2a951d320da2c846537b0fa1b5d854da779109d7dff4dc555ae775322a750112438bc976a3628945153369e17c1264478f227c0020a773c6437c7999e6764911aa5d8527567ff4cbdf0143e23842f5ad3c06050cd6c4de29450a9f2e0c9d248992872fcc9ed18dff47fc32527d0b6fe889e000d54e71ce5cee2188dbf37fc98f2e3d34873d09982e4011564bac12adb29f0e5790b47d2812800808aeb89821365525dcbf8bab4ff7737a89f634a93bc80acda41e358e611a024f02399520cdcd11d4486c0908e134c2f3c7c18f93a5bda9d6c5e54118598f93131d9bf4631b0cc424b11f043741ed6204a8c51808115b9e4b4dee2d50a31608f1414c3fc4de83a5c7f1687cea2eba3b92782603bfa73a54bc78fdcc752537c60b0f5f1fbfb4e05140588636e9918dad3f48d75ce931a02f39d4fe0b39a7d0eaa3e224ef825cb7d94d25380e1fb87fc36c760f3f6e6b62e2d52d4d1682f8e6684f49df629902262fd646ba2a011e70d14f3ac26fd3767c10709ee101153500b44e422a69cf21b5381c6f4b15f724317092d9fd7af23e6e97258ee7220020fde3f01c465d26bd888663966848540372608437fcb966a8d309a7d75858d131e72f173b6b85f1a27c80a88328a1577b68d201f1a77bd0dc113b061d544978f06dfb4fe840c2d8981148d625c85dd069744b55b65908bc32a4211568bbb20af3525d106d0ac97a0ec3f7f27349087e89dc5ed7d33f3bbfb5711904b085b6cb3e3346e0c901a641874a6de568564285939a19e317c7b4aef66b744d7ab0163911b1e911d7bd2f5ccefd9fb12a298240ef6a837f32714e3709c6e08ca9216c981c9b1a582984dcf0059310c09c55cda92ef77a329a8e86fcf0f744767a6c4616726bab748c5a6fc32f1a05e45a1d84bcd20c2f0275849aa97ad4d3f0451d0ce73a04a45016f760d36643afb9eba6d021ecb6e53b912cbef11d1f590bac099b3e98e8fecf332bc009c7ce15185796d3d2f8acdcbff84a3b11cc89eec9296df8fed6a231a8f41651a673f14540c1190baf6382354de66ea56ab686d7361281573ff327442f7a085429844b800364a662ebf996a6a3b21769b9cfcbaf41806d7cadc138b57b44a2abdc60a731d9c54a6c8323fcf279c2fa13c5c8e8b97896cf3c54be90ed130ec753757511ae6917b772dafe94f521461d63cedba8242e1105f28a261632a30db863d7e29e7835f3b71168cc8405ae199b538d9e3a5d89d16fcb1a87dada4f29fbb52b717efa0930a636924b530aa4958d20941a66ef0564d55ac8f667807bee96e083e2d6bdeff0d73807fb2e08a6df6154fdc05ebf09dd2603a9a387f5d6f0d146676f5274409f10e064f8d88f54a6cfffe2e69b994d5d69757d57c921983d16a7d0806cbef21ebad0b1f139466ad8b0c0cb8a54e53c3080c616b026149cf39c3acc29e759d0fd6b54dd428ccd182614944a9b71adcdfbd3e8a95944f79b1337050feed6ce72dcd4fc6b36bac51a05083d62406d0d4e83041632a9e84d3d0ac4ff393059f7224bf0ad5a4cfcffba0ae9660ae3f350354522aa3394da4ce1383faa6723b8063c93262a593a590d76d00f38c149e69925b9ce9ab15c3b5e88f94a3980050ba82eea1d90ff8530787e72564125ad5d6c9a2347d4d1b1bf6fb712fb96bcf2c20116c762b69449118546829be48b8d980e1e04712d4c90136832f2fc03bb9ace910446bde292d37e0ba2e228b80ab527406c460004db2e108a23374d737147b1cbc22532b8cac84b1bfa9a55ad8cf29fb11e04b18f9834763279aacc000b88650c893678a5d1f4ffd844f7ae79e04a33a1db7b89e7a4cded60883703d4c430ba44c7990f59b5e0e1537afb6caadc2d649b18b19c4b236314192e3ab8c5c62f007341ce35a86d809756859fa14afa6184296f65a4c262b14b9bfef9795860986eee85d52d25ce6ad99cd48be425b91d3b6a18236b5a6b327532a26d2c2d8387a338169fb882cf145b7e8434bcb7d829f22f5e954caa9e86a1d7bf1240feced94f80e00eef078feb402f008ff05ccb20eb1a74bd61089d92b519064ff5c2176cf5be544a2bfa705ba62bafda1c7b1551cb4460bf0cc233e2570b2068cad2dbcf92b112521ee8eec2d9703da3b49fc33fab217ffbe97573271b867b7e6649fcfeab4d359ac0e8b3d37b2eb1bdf4fc38e5a8e7734bc6e282b34fd6d292528a9d92740468988f9a2be8e47a838d538a0cb08b914e8dacb50c9e996e91cd9e63aa1a8df0533a60289ac23c577340e6bb490676a1f1c23fc8ca6f918049f05425f7d0d240f1562f8e05ab891bff85ce6fe67b7f265e1903d2e44d3c9a030cf1b61d62ac6cb6ea29283319b65cd3d1ed99ee9b00fa0bcef7f83076494857a1aabb73d8c8dab2bc97452e2a10a1d158fec1bd1babf8a836dbc0924759b67a1168ddea7ad06b73e05390e8c92b79703e6def143f28365b62e3c1e0416281da2b8f3c9b3adcc2398b0a7a4a75d9617a8fa5a27a5e9123056b1adf2fee36342c98329970c01b0e9271b4012653d4355ee0552f0809c288fc352b8b71bb2b2adfb224fe3c3fee3f6c9c236781fa8f452c1a3da1aa50fd8072aec2af1fc479ead2505224c0e7cdb00cf9712e282d964a6202fb6732c77bc425620b1a36a5f60bdcab24b99a5a453c5882783a1fd8aeaab85865842dd03ee87b3b4b7713b105ea4618ac3563234e2c2d2a249f7bc63e75ab93663b324ebca3775ce4bd3c11e40754d45fa24be8fecf73240d0208a446324c7f5e86c2a00a735a9c8e21dacfa4acc9673f33bdab6cd97cae66492989a4cd1f0a2431e58098515a1068a1bb703539672337e9b7b25ec0747737630c6e2b259967efd4b77d44d2a92621a25865b3900657cab83bd399557bbe6711c0fb0acadeb930f7a42feefb9e21efded7a2329fb1a00fb0288e463824882efc21cbcf93f671aa687e990f23191ce25f9a4d0d5f7eee8292bcd4fc031a1b9cbb0774cd2b8a792bb8d81fb55485873b875183e5f91ebfe9f1de1d8da605fa615e3b372b6d5dda3e70451c252c39d4605fed1b0f3bcd993005a2c398c6d0efb2ffb421cc4424563dfb530c7aef1292627ee24226c6bdfd1ace879a94f379bce15e2bc50071bda35c0beed005b269478aa892aa8f605c5556668fa685f7212ba0523881d261005b245b6301cbb132a45b636bc5c8d50876738073908aef2e92dbe881853e0b9785630679571d900bce84b8fb6459efe8c6d6227a2f5be9b8a0e274e6a57b143f3e52a8a3a1b36916575a00c0a35e238e3ff4bedd51fc1a80c7fb01e11d04d4898ca07fa9d641695cbfc0b7bb94595b05fe9fec182ab259ed771f4027a3a892bef38142c92eff302e5b4a3ac9c1a95d339ccc253766ebb29b6595d32d1190e23cebc5338cf91b4f4dd9c92bcc677d392690519712713cac72f3df2161f4e22e4c153ec8dee26b4918bf30b507460a93cc3d6cad0c40eadf6808ba37e80d93e31904f568edde2130984a123d19d58b59f02915942a54364e8540560fa6d9aa95025d3adcad447d05a09b665f02d8c2e319ed1f66f8b2e2b11392574e8d83405cff9a54b74fd2da9ed6e0497a530078d8d7832c59e37c813f6f4da8da2cabe89ed55647de9f912af9cad9100f4f1321cb856191e57051196aa9b54c0061c834be101a4d700ec16528155c16388913860ded7c62500b6098be0589ae1ceae8de53123dae708cbd9c8a88e96472e009737a1ec6464fcc28fe1983d8abc58f5fdd9353065bdc79ff750beee71b2cd45fdd3251b223a95403726ce4635c5fd20764ebee9e2b7e725afa457513bddae2d8468a907ebe1cddf204c831422bcb07c36d046cc0512e1861adfe67af02477513763bc8bb4de4f2ae3e04a201c9af37c4b8bed3e8200297795510a0f166b4bf301b8020615120a8ea242ee1da6ab60bc6373cb32da51fb3ce051013a7e20c519cf821b7d1c36ca1a0f9854d52f799b0454b5da006bf3b83c0853995887f6443a7e545b4c29495ee0ba8bb50f403ca75b35f61bfc0948c9e033afba4edbeb576322d49035e4cb60d113b40370cc87a35328e1f26f8dc18cd70cfbbe0abf6a81f1b0ec1760e683c2bdfcfa11bd40c2eca814f4b4195819a985203b41fbc98377f1a11fe498e21485ef200af052d2d8b7c40c87c8784e0799bbbdeab5de79328f8803f8d942a24e83e190ea1a0912fc950220ec17daf0d5928d2e8e2de07f2e076f778b1ff6a955f2d1602aa5cc1dfd30c3b70d0a7f74d2826c6792a6e211535bf946a4f50c684ffa188600acf10f00886014d881610f3c6b3df2c8a5a265dd2c45a7ff7482790ad62542af58fb8b339b82fdc171b28269acb4108e886842f7121ae47cc9fc472f4536506478e182201dc3e246496513c05920a3cdf6a8c3b47d794420671e592b93cc258b73e9a5d6901607523af77118d2b7e2294e2d6ab989cc80754359177bff28ea4341483e3b57779c4b80f5a041ff07ce5fcd9bb9a2ae1b624f6aa544e11c5c55f7dd8aaf1321fd9aa92e7640038545b24f0240d7257de4f2f4b45a08cb26eac54fbe52e2a0267256c1be98f6e7a6eaa3eaa5794d21e19b3c6341bab8871dcbaa5ad1b32916f152f7d5baea0c0a9feb50745a268ddd70a3c1f73e4bd7ff1362d55147c2a3926f92a4815db9c9eb1610fd357702d3e74cfa28889a6f3f38caa7962f5670a3fecaf725d0048036cc1b83b6f84aaaf44d5e9cf6ca300d393b03c517c4c08aef9924e26e7d02e9386fcef14c4ae018c91982f1944a7e5127acb6681bf4401d975fc666314642efbb7793b047d45b3dace5cbae92cf46b1e97428653ec23c06f208f1a4ef13cf8aab69e3bbd257e4e27dba671f5e128a4b47c1e876d192209c353f721ce48a55374b98a697036105457ce1e8ff732d5d74b10d1e68235647a86ad785262ecbeac5342b20025229dc4e2735552f37da064f36a573e0913993afbb98938dd4c7473cf71b0384a630c3d4ec85d486b69525095815f4797375f97a045fdefb535c683e5ad08cfe3c47a0b75792b35b6ad427f71e0106e2229a3d83aa9f22ae155bd75f84151f5e24a0c2352dab48a3d577cf0bdeda6d7cb8712e48a1d3e25b677ea3742f15953e39ab5621f869ea1896f6536c472d79b2369e70f98ceff2065cec129d1b389417b2deb536bfb04dcd088d04189d9765182e11e4354930af9a80361d397c6cf92f6d7427f2bff27f8ba94accfaa5e84384e45954d02ddec3a6504ef07a1c45f4268660d2645b258d2734d885acde6e204a8412f7d7fe25a0c3ae57bcaa747e6c8aa9225a71fecde5da8cb98ae17192df28ae7a6db30ba2bb1fa92bc051a1995e8d1c3d98c474af51a6ef010fc9ec1956400d1b6908a5c5dcd5c408d9b3e20807497ca37247f17e1cfdcb7d8e44556b32a898eb0d2782bfbb90d68e41147ba2170536329f531930daaecd543012cc48752177aaec84110dad6809c969a0ab6968e323e658b64538ff43c5af121e4f66399092acf200a25d932ff59a43dcd2da420c5ee72d4f52ec56e1904afdd7a87efe2431635a7ebd7d81ec5cb836eff8d4b22634ebf11d1438f91bee07fb1c30031d8da24c10b1f6b66d48c638d48e67af9887f7e59985698c2c1bfe48ef0281115a153d84c6e21bcff24231662374f7202c00ac6bff57307432222bcde5d86c73597deb83cdfd73bf2f3961308d2f4eb625b46d16b88ab83264a2861f3291a4929636885286d79bf9f45395462169ff6bd53e898f54509b38cf24570c6dd89601a5028cbe528a85639bf8ff0a53995cdbf18bb8fb9d9c9abf96699cdb4e7b067f82b8e34fbb7f095c98ffca8afd10c29b1b217a6d91e8417c1f5fba6725bbe3895db33948763429a69526454262779520cf05ffd78a07fa8a8997174a8d7b2fc34d6b39c6cafed1a6032546b2f1de727b0385932851a133acbf694ec0fc4ec9565958f480b698c81431924924c8075e56a52d00327c80ec2e2193cabcc2810b7bbf0b46e5bf39b1ddf653195a5aefa3ee4081a218e582349bec13c5b46ad910a7d036f0d2c608d9ac8feab9b1ce781818404bfba61f81394d4367bc8bc61157d70ec7d878e63982905418ab0692e4c5f7b3ab76fd588231ed030e1003665fce7c9c2440c421d28381098730341048d10df3dabf079eaa304eace1e3fe012408a8f29a844371f2546350d8787b435ccd2d014aca1c78bc6cbad243829972abe2acdcea7b9a88b50a90f0c9204ca3a3f9b54305e15251d2f4e10ee00105140cae798342b731c20e6cc34bb3318e4204cdc37d1219c52bc53e32e6bf45c1d6ef7bbe8e72ef9c5aedf5f175380a7e0a7b76ee2daf2633ffb1fb5d61a2184904df6de7b932de50e8b09f50879093a76447829c34abad4df71a1b6bdfbee7c3ce553cb49a485c4d6ac23a5dd58e7d27295dfa695d2c26b52db287b55a0c24b4ba11dd5d3c70a1cc147820fcf43e0a5edcdf3f8a95d5611f2d05a92c2c753e9b1d4e381b492f4159e02b9b582f156cddd0ade4a83cd3945c05f9af5a7813e699f4b2d3ed3a8c33c092df3e47aa6b33aad33061fe11a186637994da6042b5ad57ec587a7dae4c7f311ae41a789aad475d94d66b2b48d89dcf86815c12f55871612d5e5f391119c3a0fe91647e95ca93918ef7602eebeb614c00ba73b8fa8575a3ec233e28e9eb1dae384946766867c0821bcbbce92df380d65b80bb84e8b340839c2853cf2e31ae03a2dd2904492a4ddaa77fd94ff68521ef41ed2a4bc89963d1569b187b4ec65d8652d8d8692acb29b0cfcd46828c9aa8ddb0c15a9cd4458c729d650e41ee03a2dd600c59d9556dae2df774cd354a7572c4a7e529cbeea58ad187dadf49556a230abd66318f68a5ea66f6573bc5bbfe396aa53f7fcd6b7ec2c036f33e8cc269c52b1d38b321057a71bcbb4c7caf4ad761bc1cccdac4cdfead22c3be9938267503b49bb89b2963ca8b53a6b8297e9da5bdb6dd2b6acab8defecc79cc8f7d24a3974dc7877658e77a5fc7437b66f46c7d5c48dd79f0faeb1a9e05171b7fee38a7dd837c5ddfa327d9fcdf16e05dee1906dd3759795e9cb402e7cce909c1ed7c791325c2347a8b8f559d7d5707349d769a1869a4bc475b6aa26b95f5a084228d3577e93e9cb3a7c63bfbec9f46415518a76abe227c8ca742389ff1c141fd2b2a712edc4ac4cdfea17fc68eea97832bb595606deca6e3355738d845a276d899f145c637ad73bd98dff7ae2a0be67a18c7d302f2d3ce941b6bdbcbc88ee494d569a0e8fa8eec6777b52f00c2992e12c2cc2dde9687821bd6071fb431851069a961868a8b91de35e2e5b4f0a9e01df96b48e67c4ce69125b13908267f061ded4076ea82dc136431863a4674ae5bb80e82b5031c59cbe7022909997dff42d93d12a2290c9ee00dc0cd856c6ab38d3fa2e0878ed0f190c048ce816f8800b8580b77e93b9eb2e743193e670e640518afde1e6707f78404c11ea6762a445448e4a55ee0cf9012f2f0a50c0010e308001c48861125304f8aa995c3145a0947efa1543692da0ee021953044ae9d4640ca515614a51b9d6cfdc3a2b40a51501b7e4e670b2a29fa1b9d2222287b3b9d4258199cbf67240f44dec6572e9756bfdd3b6573f5dde1a44ad94b224105d19d17d175e5a674d60fa344331c4c1b932af00557eb25d4d32c249dba619c82a98a6699ace9adc80fbc31f62f8128a6086c69a8991f605326603ee0f31fc1c55f0f1509d132287fb0333f363d4f813ac9ad42298a1b9cc7f98b9932581bc3cf19df5f6304d30e7348114dce95369c9b315cfa14e878756470d2d24c12666fa4c8c8c26b1bb5bd6701241f79ecbf4cce384702217c4cb229b9ac47d4575ce654ed932f574df6ff52ad05da7e6e9f5e445b7b0186eaebb035527a33a2250b00ffec13554d00f3815fa1938157a47b121bb56e85486acef3c2fa106d9a5e71f4e08be94b570e9c656b8945a0c844b7dcc39abae4d75cb38c508e1d48c641068157a4a9b5ec80f1f4da2d7c09079c005419dceb52e4ccfd1b44960bfee62fa7152f641698f26d14fed0c593cd38be890517aec331f41cb8e20fc657514015a0d5cc7ac8ecbea704f65ce79aa59f3d59a16a5d6034d7a344ec79a34dd12a71dd1cb534a27ba750ffa48e50fe7b4b07bdcd114fb08d5c9d8200edf11f56a1e47e34c6a524da2f4f5d9da55280d1910da40b67fcb6cd3d849e99be6d1679405f254e8619a690cfd43424fb18bf89029b9747b492e3d1cf2bc30d22dd4693dbd4e4d4e29f54c5804de5c3ae9bbb9f4959a4f85fe69d953a1879ae8a9d09b6893ce3a7f69f31f8fe65e367f63de8b59866c13510ca3306ad679012fe478417331152cb954dd668a1c7ba5300c135d27041704355f313bb56da6c8a5aa3bab88eb54a5aeb345c465ad4d245ae9167a4ba3a7d194de3d7af7281de2d2b7109c10f323ea1555a94af5e9b3e7f24e2f7a2ef0f47f2ef1f44e06b5258863d5dc210f4a2ec24316830484281a31b5a007d388424c13f2a185ea64e4dc290bb91eefd655ef66f77d7242c0fb4ec47bef04702e0e36e03e06dc17c47dcfe43e00dc67d94d64a4b216c6bdf36f9959f408e77c56e0684632f89c17979f2bc3e5e7905cbf1e5f9048111ed2e35ed60ed1c2903dcb86121d7041bc1787bcf7624e6deb89ba392e989979729fd84ddccccc3c396747fdda3dd78e63cd9d5cbb5caf2ebbb3a364a2995a109a967d4b4269c85ae7e160d527cc364e9c7a629ce959b4dbeca94367c85c8c8b111dc62b08974018df45f4e36b8c81a3edb586302699a6254d4c44da857d94c18b57d32d930a215674a4792e289f40d773c13e659f4ea6e863127dbe9160684ca0d893394db2ccc2e920ede3d1324ccbd8c7ebee49e9e3b6acb6a69ad8497ac7b6ce4e770f19dff10238d954dd69c954d9b7d397b6a72aa38c30d65c33b3331dc08b9664d32184104238279c304208219c7114a58c324231c421977a9d46a0915330890b823adc91a7e4cea55eaca9e91ecf051a792ad4df42ec64390423b46f48b432a091e7f26c0bb13513031d136d87ce90bd9f5f0cf509c873a999a7ac8881c5a50e874cf7e1034845f5782a14f55aeb057074700c768e611733a9ed15b9d4331f59e50ae31ecf856b322ac9dd5e1697fa16e3526f0875f7843c15eaa3e995ad4ebde7ac5665555cc08943aa1d911db2fe4549447ee4f832ed443b32329ae071340e9c5ef7112adfc9d82e0136c943f63ee7cbdee31ed5c99833cb442492dd92b8eeeebe1cf05b13d79500c68ddf5c892fa59452da1cf1d0be491619b2bbdd5996adb339e0379e9fe0f9f33a37d9e688b68a79685d57ce4d2a6a0c1940844e15709de8ba3bcb9672d46f73babb140bde75ccc4bc4f1a0ade567dfe5944c8cbbff7ce6326e6591ef1d2da1cf5f3b4d2dcad135a27de794c3c9dc77be76179ccc41db0a110133f644c34f15c98a0a1a1a18979114e27b92625e14cfa906dcee630ce750faa33f143b6b91dd73aba855d66bfbfc88405f8466bd287ccc5af34c93d3a19d3734316930bd1104e854f9dc91eb2cdd9189102c3f770ced7a811b1125ff39f4d7d1238566eb4a51c2578b78a79772716c8eb9889919f1a0a24b449b0c0051c439d92f23c6662a4e5414f599bc31d6aeeba24aa90a7d23a213fe57c2a6e9e873c0fcbc3b91dd30cec6906dcb35b9a5b022679c8a66f434c5f70823a0f4a5178eaee53c678ea4eccf39053ca3f1727ea79cc57ea939eb24e886278501e4578a74e9d1664a8b9eea4151ad75d67053920e16e435cf739499fece49e6bd2fbbddbb19c991a3a4146172f8b5b6badd5a2281af593e607e3ffcb06e09515c02d0c158089dd4401b01f0b00eb9e8ac766189db46bd7ae15acb0768b6aadd5568b1ebe52971b393639363936d5fa5551d70d9753b1b0bc1f2c34301ae5480d75cb54bd4a2dbb5375486aad20842548d1ee18a7b690d8fa130d2bfebaec46e34ea7d1f2cacaca8a5cc12c16cac2ac4c7737cbb402a5bc68c83f4b5978c67c979597646141b2524f69b362e9ee66e996eea9592696ee696261a1c162b195841f4e55732be6ee943912102b9f78c6f4e97d0a22247ab5a294ba8bd2aa02d1ead4c5c235e8998256f56a2e33d50d1942082194333a569e15a5ab57b8465f3e2a5e0d0bd790f45bf56a6efc3b535b5919aa31335fd75ba33159d0b2406dc3a151978f26a14f771faef07b7cb565e1191264a93de1834ea8ddd8e2d6361ad5b23c9c5b2baaaa2aeab22c2bcfd2eaa726312d7b1af5e0a4b3e724bd748ba7b2ac58c896524ae9a5692c5ca3521c1a0e8d998f43a301594633099128cb58b06fd395daadbee1d0ee75eb553b66a75544f5d2559d890987c6c2352a16295fcda558409c5285ac8644f594361dd36af66aa5babb4bcf61dd1485d123161234ce4718db96a8bfc768ab943951e6449913658d3ddd58cf3955c6c6be31927a49cd292fd337cef909e7fc46cd39678cf36c23f5b6a32cc6c738e3678c51d6cc2a227bb4a5f83e96d58f8da00fe89ad70a8e6a8abf2a05e37d9abb549c2ea5c5f864acaf4eb5eb53939f346a8a320b75cbe4b9982d8651ec5b758f700de9b196aae766ca96e267e5395f238561169bf198465f2fe1bcccaaf5ebba6c7579dd3a52bd562ad218638c54468871c80f92758a846e57d2d2ba3e4a2995e9a795b049e97ba04b3ab1293d10fb7cda0f175981507ea319258910c9a244dd234261212917a136acc88d9752f2b425b8527d2845dbce0a60f26c41d28eb0538f171149e9067aa4de4da9ea7c85c9b7950bb2156832993604a2eac330cdddf71e469908fc68d63d1a251bc61378720506af8c5eb172e14bb5ad5c4a29ccf215977abc62e5621486612b37567cc5153ca3c8159f06d9fc6024cea2cfce9a7557df9cf3692549cdf9de8cefdd94e731921bef1a47d5f3ea9ed11161dc79cc3d5807c6c94868b41b23b91047157b8a71be15aaa3cc8bc798df8fe71e71ce0dd25b9667de5aa93a1ef4899e950944d98f87d2fe71eb93ef69dddcc33ad43ad3e8439ac9611e47abedf989ca62769b17cbdb52dffae4272c8eeace3ead4c7b3a97d0273ff1e8e1ff04d79887559502c5a58fd6ca86a3baf3950a14179e9fe02778063cbd9b2c222823b9b1bbbb9b9f704ea5415ed47e40b8755ce6f279153f6ba55af5eaacc167d7ab95ce39674b47cd4967654a62d562947e7b8fdf7bd396e8e51f333b66c7dc4a4ab33bc64e7237c8dd3af190b6e74d6f9a3d379eb302d2f617fde8a7cdae6e9e33b38aa87f9885446631bb351fe33a59cc6e1311f101b9954af9de7befc9091ff7ab43ed7d4e69f110be5bfabaaff4ade273d17359992bcf4e2cbb2d5755256de97d1e5a7093794d6de93d9ecf5c8138cdd9afaab375c49c56e6e153aa533844d36d954de66d0dc5859fd4a51193dda69b792a1211752e8557c62be77465b453934ec2c046ea145267855aa5966559f3b22c4ad9baae43eb0cfa654153c8e51a78e3704056dddabebbbbbb9b7ebea76a62a25b9e8c333afa6eeaf3247237cf77dc86efd04dd38ae6e79942e014d28e7294f51ebfc7eff17bfc1ebfc7efb1c5a798628a233333b3075a5df3de0512cd996522d14f72d3c6d6ac7704d7e8b365091172e555ea7ba07cd7bc3f51762be75c1ecdf6b242bac86e22510d8c5ff6358f40d5428206008f26867d34a314bb89ee0d18769ba2074fec76131bb2b05f1ef72fcac8ad1446dadd3d3d0cfb2c0ff3207f7336cfe5a4b81c0bb3a869514a29a59452b6045fa78d4c4c9c764d9b9999395e1a2b3373f3cacacb8b356796894494d23b1a798675782db9754d4ecd9b2e5a727be7e565658544fa45229b1a7ac578ad57913a7422086fe6cc3291e82791acc9a2afec4be419f1f24eca29e4f24b615b040f4f1a89f3c96c2871a35b26750fd5e6a9d4e2c3acf79e2c83f51e175c43deb2ae495e58cfca64175ce3559627f3489c0b99f93db6cf96ac1765195e5bf2467221bd90d68bf4d1923837de4d69a5945276216f2417f23d89433fa7e71df3c82e7806851e2a2f4b4a0fac26cdad966559f559d985e42274bdd2ea5bfbc81b97853b6597142e0b7c4ce329a595d6bb801b0e87830387c3d970f0bb56b4acec42be3e8ae14ed3651738ac57d5d25092c9bccbd6e329ae5bdc8d8a419b2e08cb6e382afb8feca25ad985bca1288973a9eca24172e8864b2abcb9151b028563a577ef9d53cf7f5a7d6b111412bd6b464723e9c3bc2e59eec15ffd0b5eb7b80696754f697d5ef0e6c250bbb08ff7deb39856dfeb7e481a7a51c2bee3c2aef53d245ce39d21172d6d0936f6076fe235e1cd8defeeee8df6d5dfe8db625c7e2a2d9e73378cf3b9b1270fbf7ddc9cd9f4ae5b7fdf3e13b0e0af3f6d93168376649d1fbf02f35c9800d96d9e844cde7b87dc5262c72c24aafbdefc09d9130bb26d652008e5256937b62c24aa176f621f5bd0c776651141e1925b2fcbd2dcbdaecbc2de2bccf368d4533494c3d044cf34ebafdee83757bac5b554a77ee34dd2c248278293c4aacbebba2e6c9bbfbe4d7b7d5155d7b7fa78c77cbd32b3a8522b032fd49933cbaeeb882a0f7f695beb5c6923136f92dbf578fa94cbcac06bbdfad63a5993ae8b50b46915515fb2ecc6d242a2bab555ae4fd1c774fd621f978cef2fb846a56c7fc133e2a9bb14de5c9652cafe62023500d45063bdfb55dd4d0821105d920de19ca0fcfc24c3b76d094aadebb3db34a3e3c94f0f08a6df711ff5b7756f93a16ca94f29d8ef51946b50b24fa98d3c039ee7a7f7fedee127aef13e515611d79fa557e419f3c15fd78476bb7cafb1e3a59abbad3ded96364f69f5308fe12b16ea96e90ece73ad9555bdb37cbc0c12d2469e5155761423d7909ff8f23719bed4e9ab0c4f94ddf84579fa39e37defef4d37421b79c6342bb676706e75e51b0890cb80ebb4c8c9b93936b7eadc8a91ba05bbdb2a4dc675cfe5130f92daa354422a0ff3a44cb756aadf21733c87b4b2a5ea155ea67abdce5bdf7a2bd6b9f0cc966fe5d2062d8d3301a4096ed7a195ff3c5db9efce3585bdedb6322d66335b6a8b9d5af6b273a26c891e7bc4a2b3327dafd3697339aeaad44ed465c1486f455885444d621d76d25c0ecc8370e6e2ea08960d25982eb163b343a90d256c2c6103f3a866d95882f9d948b6a1848d259ecddbb96c6309e78212ddce8d9bcb8930220d455bc2c689c634547d137a31e13c2efa862fb4f1369488dbb38194cd8d87d82314dd0b8675228b6233fb44300eba732e29f7c08f34f75234e754606822cd3914cd0a7dece6965c07e5e3355919081d7fbad1561978a91c78e797e01ad596a8c74b59c953b6c46c97e01953daedd95cf825780684f444e3188e71391386a6a16827f555279a8b715611f2c6a47ab495c4c99cf37f11908f274368517b79efbd373fedb3598287801ab486eaaa63c69899e185e4b2484c2df2138ca45b26f64bc3ecf604126624d331f313dd62c53be62835772d4dfebd62f05570c9a4e4ed7412bed142cb489a04374612cf4822c0976f51f17d6e59b6da9c4b76cbdae2c7ca2c1a4a32ca6e38aa63f4932ca2343f59eaeebab3d8af63f05ab6749d9a0065f9090b09689f885cd578a8c51810c2d09d8f318220744bf1f4f58134cfabb35be8734b93af22c300e89e3f90e6aa568920ed5611743275a94d6d0bddea52543c11dc7f8c849f58b13abbc29c3a538b43f8c89c9375260fe123131fe1217c44c431d6737933097c8475f888cc3c5acde465f62eb3bfc73a7c8412429f01c9fd755a980188b49b8e2b0fb5f8c8333339de9544c8770e6691982c22a2140fe63d8b88eb9876317f72374277e11f64cd4d47d4fbaa3c41111101e1291bd23806f4f164d6eb890fb2d23cbcef482e8cebb458c3cdad5db17504bc59b74c0babd0ab96c6a734ca5611f49174a389365b251e4513b54afc8926d2d88a003d4c8bb4ec28dae7279ae7261ae8ceb2d131a1c3f46348737385c6cb1059bf5d43cdc23c07e3676e9cecadae2d783ee29bc23361159655c73ec7b0eb309d61d9371010184d4e5044175f8472628279387461d7f99e0c7b523c299e1493a7e5116c460708f41110100602496c4405c8032b9383b42dbb333a3010f611100c34b2c204948140d64d4037b138039d848e594f9126d831cc9a3c115e9e5899be26761bc10cc86eecf9c763b70cb33e0a320a320a320a22bb90145a369bd1615d24fa645d348964f33bae1545a2ec5366d15b728a2815616589b42dbb333a325196890ef344d63d5ae9ba1361229147748fe5c13cbf2eca3c22eb338540d84766a27fa6d004fa605384817272d2cacb8591797e896c36a14c2793c9149a40d3679a98dd5ea8cb5f5ae419565529bbc5d339e374c2940b90f0e1f20caed3420d3ad4e62a7b7daa7f3e9f4ff5cfa7faa7b4e3560e7e3e55755dd54c223f339b62ad5ebdcfe792f968db435ac9fa609f4ff5d0e7a1ea0a1da631cbfac7e43af60df4ab7a8acc747d3e17945f36f4ead7517e7255199cbe5d329a5899be21bb8d6086b37b32bb615745f908cfa86c35817aa9dde0a71df5e564a54d77b7a7adf3118fa7c23cd83dec394c57fca9be65af144eef1a7af560a7af0f81348b89d48f87eb2dcb6e15d3f3113ec247f888a7631fde7bef82d2c4e4105af09649e419cfc48462138a4d2836a1d8e430cf84faa595aa4965627299fca2aeea323953186326c7ce33a35ec913c72106f1873d9c31c6159f5cafb71bf35d87401fbe2c1b6334615a85b6b9fdde7befa395765cceb24358c157d91c0539f53ecfaa2aabaaec302fa3fec9ac2ca3fec9fea1b8faf0abe715f594f8f9565596c2aa8fdd463093d9cdb215351f84675074daedd94cc2a036ec6eabab99032dcbb2ce3956b52cceb12ccbb2a6c9aaa6eb569d769379599c1b13c9344cb3a65b293ae3115166b504c37b5d4d3a51e9289da6191dce4d229452eaa615ce393ae77fcad2fe7f68c54e3c16c824bb2cfaf19c602093cca2a28732d18927f33cfbc75e009fd089282546004e3240010820630056d3ec05100000c418a5c010a19c9884401f4f865d96a2368ab2b72506ebbdf8de93efddb27bce49ca7e9772644589f608c89b2494721bbda845f958db6e4cad572debfddad7dbc29e61575b95a5941565184b25d5c9d8e4902b1fe37c71aa26a7e88c804c37cd382335aa99736e9bb555dddab4d3dd2625575e29491a4717e9faf74edb6e2949a6c72f489051107931c403849275a0942d25948f75ec1631ebd5f58fe6c91c13b12a2b33ddf8884c131fe1237c848fbc19aca118aa93e15c7c6e92da96f5ad264739237411c6cb4ff67db20bba6137ecd449e6a4ddac539b8fed198a1180ca6e2f77fb6d945025cf360fe65c7913bbb1911bb21b34c23817e7cad0419f76e301dcde39171937b9732e0438ca9d7329c061dc3917037c74e75c4807c09d7351b900b4ab68cea99034e7540ca039a752008d009a0c6d009a732a34d66af6767b11800d80dd56006063d88d34b229763b8c13bb65d26e32f186401fdbf3a2a124c36ca52c2b13af7ca5a56a29ea4dd196f897d9271b79c6cbd1baea4839c2a9463574e74eafee46b4cd0df5a699eaa9d4e254e465afaa5274aa8f8054232b4a9647a6e88c80700d792aee163aac3c9e438b3d20bb356466666666b615f4bc5b551c5951bd149d1190917cd53b8f82c05797e90ac05752db463537ba2ce6cc3291e834f2a50504692a7a0fad5292409af7f2b2b24222fd2251c35190471fa722293a232055b5c518d55c8ad1ed2585741439650c1b2ab194524a91ddfef8c44a28e508e7d6f7deabec28c808c8950c318ddea35d5bd36c538a4e671195d018d12d0e833459641195641acf4b69a594a320ef103eca51104ea9ee24f940e33215792ad3776e74725e8cace0dce91b691a05c1d145ba089592e4522c95f0744c8329f25c5e5e565648a4ffbd225de4cac72925c98d1f05e11ad528488a0e458d6a2e9552ca51109e11290c16c01ce86f301a2826d7096b17a5924a2aa9a4dba36207a554bee9bb3e293e94e2c6243f7b554aacda9275aa4abb4d333ae4e994a7534e17a573cae953b7eb74bea24c594a299595a5205ba51d51af9f522291234fa594a1cffaeba297b624dfb4d69005514aa90455b55237b75a1425a594525217a6657f9ae89386726872aacd7fb4ea308fe935a5e0cb96e4add75f405c29b8c6f478b2e702efb1f3b624e9abb4e4ab86843feb67c5d54528da89963d15eb269a7b139b8f508a7aebd53ba7fa641151d15bab9452fe52534e33577f70d059d41fb7625d31106fad9ab5a664a1d40a83a2a09cd45b2214eba2fa030546b5aab3a5faaea1ae3e205cfbe4dbfbf17edc780ba556ebd937bde94daf288e5267c16a5d1e26fbfcb81b8c1f0c639232ba07868d012346c5f5c634b2392976cb60882c4bd3b585ee81a45d920042870ff7e528e124348ce4e86c6ec7ed0c41e3c25c8065a016641e22783e63f880a8f02613a010e80f211316989c7caa38f9c4a3bc8080bc6051018145cb20d231ace8101513a572cf855ff88557483b4c8456906d2f1df8cb4530be906d6e679b2d5b63314563d144da8aa6e2c19051c6944f18b2cded4c266c5e919d9d9d1d6793813354d72d20e09a5b724dca0c10226d0c847b308d119c1b9b259d835f6c08c1a02c6c707ffa30a9f74932a4c87381e767c43c827a99b21092f38a02dc8c68ffe04351649b33f2e8f38820c988b647b819efcfbe7c608d2fa09b1797ac5578850ad214fce31a3152396803ca03a47f16869bf1a89d3da2c27d771f9d6c7337324dd818c1373733f4630a79136fe0cd0d0d7838a10d372419cc822ce00c8921babce3bdd7ec5ebcb6995b430b49b08999e11ddcac04fe64c1c60b1b0e831736d188112336e69c73259b73ce25d9e68c349c18e6b9c8bf1bf15ce2d4a47849e106373827cab83b50b58103b5d908597643348d72908958d0e366a11930b89febb4888318ee969dfd40732bd6f39660222db9a19384910a2fe0bcd8438f1d3b9c010b254062e00fee0a10ee26a2e26ea41fdcedc5077773373db89b335273210fe690e40863f0811a7e78010c7007406c01270a353c74e2202466c60a19c4600d72c8c210a2c08798feca737140164cb8828a9c1a306108317d98e7e2b2480213867421061af0200e31fd249e4b0370e690072c6001061e57c4f46f3c9713242982199450410728d82066016668c10ac0608517841c89699a1ab0a1f298020b7d40430de620071b0401ea8006150f78140951c105e6023f5c4970411772a0c8208410562c8021b0e10311f480033a08d98153bc81055317d04007287ee7c590374494ebb61892852147ac232c794ec417fc0b23a0ebb470c313575eb7c50ad0206326c0096e3e8639b8a49e89a20f3588c3139840042531dd5ce4478c3ba02e60430b824c3d842e4c95138e0061f0890f52204245c1092c48a18ae9c4c4872d64b006eaf270dfdb62055fd09b2d64a0c5c5aedb420660b8db23139c1093c7f3aafb1e1a7e6be59efddea3a6a99d13629a64047ed93a17c47b6bbf273778af708a3312018f609a3bc5799eb2ceca591096005238e9a4df22c7c8fc4967e4182b8cd2cd2b34855ae184fc4acfb175ee21a122a5749a788a16ceaef4add14fd3ca95f255ad1ee35df50d58d6bd95a90bd051d43c45e79dfb085ce8357c6fea8f60e6be379d9a93faa43ea94f869714457d4ed4e690f023988980a31cab505db760539fa51342462744844e08f89c10af9d101d3fd996e2dfe361bad497af5193324608a7e93d7e87dd7756e92398b96da72907b67b4208fbd49b7a85da564d337bf6ebdbbbccfede2fbd57e122c699e57869638c18dba955e62d6db38aa8eeb42e68bdad0850b768ada89de27c73be4f32c6279af46467154c4f359e29cd2eb5f2360601949055eeef2eda8f217bef34de9ce83451ca73b6caf44b736fabcf2c3b3569a23e69f212c6e8966a3759750b94d24ef2512b8114627ea377b3275875eca2ce3cb4e009363195b7d0831076626a7b010b3cecc4d477e30220f888a953d59a13030e919c980a6f728cc4d4a8e343484c95556bfc041688a013536790214284c4545ab5c641a6f0e326a65278d0c3196a626abd830c68626af5052700e126a65a794092b3862038e811533124b44127a6665a0cb1424e4cf564810b3631f553b5e6bcb8998226a6829c165f6c01276687b3f9820b45980d40d440c36f48034d4d4c3da95ae32d7440849d988a52b5e69a015b75793603f85554b5e6eca0879d9a980a0346ca1e84a0849a981dcc6f8b2f906c2949dc9ce634cda9e15ffca4c1c7865372dbd81c86c1e54c935d420c48e6bc1b433127cb4f0069244f0a32f01132b4ce9c93aad7ab463dad3e0b4cd32f7b91ea75bd08774bd7e3294b630ed9e888ebf157a5286de6520d87e8f69f83da4ce5ce030d29e504a6cf1731cddca76def0ddfe3cc7d7de13403998d70b4e69c73e64a6d939fe4ccb52c3ca30ff366203318a4e4ee9b514d93e4a8a649324e31c2a74c2949ea08488ace2808cf98a0803e608f2689609a373759f328c84dd60f2699baba4b5578aa82b7e0f3d139345e562aad52578081c015229c627c36a1132f25949406a9c944f808e49c0b2f2584d7263dd122eb4ffc28a1d40236dc82d4c403d224f98034493eca4ea2fae9956c244f8aa86dccfda2ad502756b0818140b7307c40ac90f5b739ab2cc2806ff0049b98429a24af9c429ac472c736032b1c3bdd542ada6d42f17c5e2bebceb998fcc2ee5c16f26837dee46c5e5e565648a45f14e5e434e6076f6c9a34591a4a3297a3c3c2c833a669c7754d3ad922eb6f2ee746073c70f5c443ce0322815427c34db74e2554f284099d9311c94af5b07aa5dea2d349ba05b6924afe5d1a914664196495a253ed280864db5e344e1b699cf6c2088744312e83d4469450a7510d16190e918c6f1612c5b80cd228c8888a0b3b67cb7a07270bdd8b6e89d148b2ce190599e01458c029eefb2848fdd64fe1ad73ee1b05494972273bc99caa868a846d86847aca66b148b68944a225504de8609ac82df154f6f7eecea8e9188b2615b1e1226cd32d946d4e90c09f70daf8848cde15814bc838068cd38a1bb94811510c1263d1840e915bc233a285d0081769e281de3645951136f2399f8b3cebe122f7c5ccf29b78d9465a42e592385d5a6861861e1701b7623b3144acd396641bcab22454d5215b4a9b4dc88cb879cf72f78aac240fef46ba150908ea43740b5579c0e9e0a828bee421314417c5385320090dd850e2c69350272718418124346043891b57647c8da040121ab0a1c40dd2151941011b3148403c7743e2233ce4c8345d73e2234ca4d6a16e40dc6a52cc7242f0090f323e5b19275d46b790ba25f2890fea542dc39f40218b775d9dd4647cdf7b7ffc77f73ec4fbdf65bc9055ada4ec66f654445374d2da39391bda11093f587eb0fc60f9c192fd6081d60f4a29b590702b8ee507d532c7f2c3ad38961f593896898bba0d7199c66516c9c233e02bbe86442864a2e2d5f4147ca75d99f6fdb83c979fd8677dcfe9a39068cec3d0685c886252cd53ebf3232d0586283bc9e2c287404d1dfc74ab2dd17a59c712cf52ab65b12cb52508a939f9d637ba0846ca484bd1606432226522f8dca3bb65dcd8dda218f7bdf7bae70f961f2c3f587eb0fc6031695018429f8f941f2ba5b41b12d30eac91b2a1e828a69dd0a5168a62da9976604d4781c1f816822de4ce77145d73e79d9bd36e32b0c77bc6ce06c87e3c8f6e240cb66082348f0fbd6452d2504c3b4d82dbb46355d5b403806f5900be4d013cda8dfa27c6e33633d03d02b0ae55b2bf56e918768e2c8c771a31bb85328c3ee512dd3997d14f465a8ae61c0ccd39156a1d907b75cdbd6e62b7ac85dc4b64e35d6d431fd1bdac876828c940f29ecb5eff7c3cf71105d7b82edb51cc40bb73a3e019f1991619098470aebcf08c2078b9a568b32a605437a25ba205e214689715d22f12c5ea155622238ad0b8c7c76e248f15b1c52eadded2a8b3cdebaaaad8f5155fe306c4b672e38b6dd3366dd336f3d166a20e35e93d74abb6b91baa19b96feedc28764e1a060ce0a4653370c22e5dce74cc22e1727c480d2ae16e748b3ccc8e69999439ef6e9a7ea35ba08f2b35c7d3b4d24b4cb6d25f58ad3393929d243ad38d0eae11a8a42d98643dc9d4880000800001011315000030100c07c482e18838d2242da40f1480108ca24c6e5219e86192e49032c6184200c00000008000a0499800d2c3730312345a41b15206bdacb84e2b1f029f9d8e502d16e8f9e56813233a05d7e6f9c8d82ba6c3e017cb304a39141e336b391e3ddd9753d16ac99b135d53d35460e5c9d4d87b49be59f3cf10ed73be8c02e28ca0009158e6ca59f306c35e552500df3a93e1c977f46aa097b1a5348ae8a5e15e4a59949d7195efba0dd2cb502fe35239603ae269b8975ed2594ab2ef2d008884cd6708c21b7349537e83bd1c95ea4ef8508c587121c40d06bda614777b35ece57c29eb573b2c5e39897c65f0be5698e40cf11f4ba729757a4f707b57fe60cc5f42ac8155b70a1bcd4f752e784364612e9dbd2ee8d85b85346723e0c502221ecd1a6545dcc4740916040c75e432cc1fa2a228b470daca363049e2b5eda6fe879a78d3d6a3fbc1f772b2e3fb96440008a3a1e05798919dfc836ec0dbf9099c5f7304ccd142332e09710fbe421ee299b6b2a787e60fe0b62745cd66ded1553cf41f83ead56b0085dc86fccbe95a63f976d03e45f5507290051ea7a0d17d6f510b7137c179850bcf9744392e16f609f4f113e7141b2825be0f6e829c0e67d2815a1fb71f4c3ee57ef1363fec21af9ee9d7a7b6d93a30e144dd6a10435c921a13e479a70816f50b96d948fbfdd0cad29629c63fbb808a064ddbdf5f285252857c0103cf4bee02e3e05b67950c87a2b964cfebb9679fe16ae67807ac185d35eb265023b73ee520530cd95a3631b4bd85714d8561ca9b12607418649635443037306056badf3fc80a1d5e3c3c0078ba0e3d15fd830d039a2fcbbf9e7d065dc1c5f025fbb4045110b3b2e64faf077a995daa30a2f52860410493caf1dcf1a4b24c0f2fd148402567e9d823f9f392cb5db961b7ba388d1db9ca20289d2acb5e88b4ca0a881d2991ae4af7049156f359edf613591c5a28c7bec4d3b288a4d61a952cf63fda3c8104abe4893c2ceb4fc686df7cb84eca5422aee0c8fa1c05d50f2fceab26e40f8b6377951a2cb9e685760ffde5b4acf2fe30e3b506f89273b1dfdb8b2cfc03ce8bca3411943aba21d2045e22d41b7e5aa0722241431ca49a19f0a838fe78f4e4f0bf36fcacb4c416a46d7dfde6f65da9eeda75dceb65207ac21f8f8bfa61fe3b77e0a7493eb84190b88db1c52d340a04e0e25ac283a97f2c1b7da38d628323c35b96800c3baebe1380615ee94a0fc25f33e4b11332a53a01cb821c571da192c18775f599c7ac55dc161352378efe0869e2e10cffa43352cd755a583d4dd4188519a1f0495b647eed4bc186d94c371dfa188a1eb1a270d48c9c74efb4d43c21abfd81c3e981af146730ad2f8cb3bed16782e0f6608bc291bf6e8a58f35953fff4a149032b1aabd3688b405e0e5c3fa4bf3eb96b82f11fdef11189bc4e1331c4feef2b1ef1f467307b6fe095ae9b2755e5699579148032accc1eace3054df08fb56ec6b645ca7969382e45667f8d4372954896f0597ea72e32fe50145e8e18510798543664576976520555ccf44354df9154622a337427fa80c5e87a45350a18341ab2c459d9ddc171639e7d8f68c5d270a4a383210ea2eba3920708022f04a45507e3ce61341110aa9f30bb3707b0574b77bd27ac4c45ebd2c8b61a3a38b619e9b341faf3aaf399c3a9f212d899f9b7e2f534d9add4469b2d4397f9fcc2df99f8d799f5fac7bf69492a66143b80fb9616bd314cba11f48afed0edba3232e68e8d2654e0df4516a7563708b9ebbd10d82c95c8c6fb9498461f3d2788b6c8ad74f0991dece840e90c8ca46a2b7ff8d68d1d677ba7b2a66d72254b86cb1a32085e0569978c770c00683ea85c39c16c55ee0a3515d9205d1235f2e3ba75020a4da072d90618259b4d7a1e890e422efb3347f49c5e8e8239361b2477cd28fdb5f587d166b5266edd8212a32799f223b098268f14b9b7200cb1a85daa48ac8a3a71b9a75bcdd01f440feb3e3782f5ce66033418ff16bac6d312e97451f4747c996334c916b367156090431c4b8c2b2fb195f87f1e6cdc62e9c61122cecea36d525a24918ca0b7343756ba003ed99fafb9fe3cbefef7e92577c8e7a8c85d4733942deaee85588154a31fab1ab585f3c21115af0370eccc6c6fc6e146ebfb2b1f9a5e4737741cf39488af3744a43f4195bd5f81751919f4f66e505253d3e04db13c7ff0d63c163f94ba0517bbb3e38763a508fb4cadb14016e28a617072b3ae29b6a9bccb0f60f24370d93b3a0b6ee37ccbc89e3cafe9d451b4c7e7605930f74fbadc11f612e7d37f5a0db49dce6412738859d31f05f8209661263e7e54025df2030ecee406a058066334f82125c5802d9205d7354af750c9c109bfa4dc64e19751268b37bf527bc1906bfe9bc3d06bf3d8b14bf785554b3e46d68062de684c403f4adb71fe0bd69a27507af91a600a1ec38dccfae80295a8f3bfe4f707e300e7885c37ece307b775ce7f38d6a42e998411f4422ab2b2bd8c39ea86368432b41ef1e6c3b0aa2a6442b76a8afea7ff39ec1c3cb3f81e24c3ee05b46c55850828a1a8e269139d5fcf2d0ee87eadb8cbcaa3e9c67218c33bd048a66c2a3cb318ad97befab4cc05f10ee07f709c54c9f8782aafe31c65ebc5e590c4437cedec9a31d59afcec40f02ccd9f9e29125d747ed2cb669d3d5ba2414e19583b4854aaed797e51e6a543ab7fc63cb80897c30c4961ff42ca5df99d769fb69106937cf32018654bb3d24a3a8e2671fa130fa8d3ea44ee706f2f85d1319f93a5f075510c5d11793b9c88596802c48532cccc51abc5db62f942d97a18f20428fb7dd7fc9b44f85f3e026beae560246c11571579f0cb7da5dece975c8bd20fba98bd6cea45ab3e31a6abf5fd59a4f3fbae4108c0720d99b3e6b399e42d3ac95e2e52eff661b8905a17c150ba6e1f359edc0b2b2ef6e98ce0b7808329e33797f4562ba2cb85f3424afa7a1be43903d96a54700df5880870ccd76b970c9b06ae137ad74e4156fd40b53aae42cf87e9b7b1365d510b5a0b735d151e08ec28ab9c30378235f119eb2437b09e932d4e016ab76908d933da0aec442c204e436a8d48ff3521fa9a2bf3021ca717e0b019ec7fad46b3207bffa64cee6d83064633ebd431ab94adf8b14717dc2086faaf831bb0e6f25c05c811e53d1087f85c97bf250422572a9efe9fae2a2af9b709db20eec9f498f344422a77bb7f2fd0595e966f64609892e1880d675f0a0ba59006d55eb64600bdae4e503ae2a45ca9a196806256def0213130050c4d15e5a8823b9b5bc4509cef0f39c2e74cdfb5a953038f3bff437e456f8119ac619d45af52abfd48fbfc27497c1c2d73feb9c7edba0173ab8e2b47cd9665cda557b0dfacebbc4ea7032f2bf57f69694c91d64d787dfd0991956ee2be1a645e5f0b4b30148b3b01bc406b8551784a18c2efb3dc86af943fa3b40f78e046a6cecf5e0355a4ebfb90fa7b14244316d28f43c3b3ba143123281a61f822a484f79769dcbd1bd6c76e1ac8f4b5d8e2d439528d707f395c1ecc1a7715a6b431a0f6fd89b8aa0285801ac875a99989f3e2e7630c6914e8b082b4233a3636039949dc5c6cb574d3c5847f4590c821897d207a116f7e4f5c14846aa8ff8f186e47bd9a49c3d44c43515eb3f34ddbfa99bf462ed95f17a3496673bd525367fa8b70bf479ebe4b8847c4af3c799001a4304c0eb826607120e46d61bc52f1275161e2cc84fe91f48bb50ee3dee807373d20fa3a6c5a5a4b755fcf8f031d34c5af19905c962426b0f99072ac3fcaffd9b390335e242adac4fe9f60981daa5f3921fb0c8761169d05782e3343b4ab290f4289ea918a6f512f9b020e804f3a64b13b4c64db384924f591d52b773d28ac046a4b81df9d24d3ca3a23cb7499db77b4e339174cbfc628b6b46ece7eda2b026adaae926031f03d30dd64b475fa820c29cebf8f4c75bb0d94a73b0c96f8c40d15247f7491a7be9162c0aade681b0f2675951e43f1e496cca6e8ce236e1eeb535a58fc1075a399e692e36eea60eed8880765871c2b78697a233f7aa17a975df36dcb7c5bab1e905893c32a41dad72b8f09152d65e20bab56584448164c2478015161904c0191d7cced300c98b438b6f5c857c2207e066a3f5fc04fa07aff49c18e77e59248211845faaccea9263f58edfefaa4b511f98d2ac3e502315d39d0d6d67f72ccbca371c88e5f429ca63ec39548e20325d98951df6eae992fa9adc8037347c20c2aecf5dfd0f06a1f653a3fa82e318e7760eef521a67816050212cc15852623b4964d531e1318c4d4411d2468aedea76da63ed7f4a1f7dcd03028917654f9edc46e39a778ebae52991488043cfff9b716e5ae7b0a0218a41fc1d4329bc5f32af06dd2ce15ec3f1c3e6f541139986693891042874d6ad25bf9525e41d2273b1006e84514238141b1074775a74b98abdc71490c0c96f0ce7e8a938a355502dc7c29f206ee7461b7c847a87e4b5b77d77d88d1e0828f312522104725f0f311b662f0c176668966fd7c82d3ac63cb53f82902e16d3a3195e8fe41337e651e58b285ba66ad358dc4ed77a68e2ce34a06b09875abb4be97c3ef01b0e5536b8648f90d6d0081614c4328a988772313eb8ff5612170f15480b0fd826f0723aa141902173dde1128721aa7cf33453a5cfbc6ed941cd8f0b5c5d7410d76ee17a8d5112bd03bef2bb716f59bf27374d171192df29fdc65ae70874c5df4adeb7fa87f625f569c996b84e04faee6c017b8e0d927b7bf127c728aa2a6060755cb5d0e930e4350dc0fc21408da19b7130075f2a5419b86dcebdd1b1382d89b4a943bd46f0640e8d17ab7d0168b277a3d3aaa453fc3aa47c7e31a92de240718a50670e3fb01824386c019a4a04684f448b01de0901da054a557027f3851d17924a53b73edc52ad55493505e017320f83e6e57eb514b2a72cdf470d0e8ee173875194acd0ed91d65770e2172c6312a4cd7d15b20a3eab600bd928077d55aaf086caca49a0dd68a6d5b2d564aa0c38dbdb28815c3402e313f96ac8f40316b28e9d428aad7c7e44807800269b2435f3da5ec446610ae5eb39051838018fb9a7e8ec0a74bb6381171fd99de482c8e8bb5e3edb65d8f157c01e2f2965cd70c164611664a6d01d43afd9b4a1b5469c90645ea739e132281ceb3308508b039ed6e2db4f9e7e97bbd36599010c313f36c18a1bd3518489fe8ae1e28b16e980a8f786260ea37dc95c889fb59f58230482a16d738cd50b009efe79ab0b5fc2212502000e8bad67b3fcdd3926a04ada27444ae69dbc4debeff9758405f25504dc685f2a69b28b6e0050b62e6667c0c114a18acd5e0d830f3493f35ea05fccb27b7cd8332be79d87868df6fe6d6ac5f255f3a69107ccb28143ec2f2213025fb087a74412df4024e4c2fe0901f01148d6d84d96a9d4b03fd8654db33bdb15d77236ebd135b254aa86f529fc3372977d447afaf24377da1134b8a58d8a6a52c69b20f7c2c2182fba4414587e05a7cd21cd26518a018a9f7ea2a78d789abdad06c7b9bcb2a845863b23bf39b82d4ffaf616022fc3ed961f46d62ff0a575f32a915ed9f7705c22b5227ced444d5d1758c7c52f870cb6e65dee78d959aa5aa40d87bb33abf9cbdf601aad9a8336b7e922e0c3dfad325ce257842ccba8f26dab31312ea462abb91594b73595ca7bca129d9958710a7ac3f3fd121a9cb53f69c913c4876fb3f2fe92f17addbe494252198f2fdf09767feb85353ebccb79f67ad39910fc6fbe93e0c7cb73ee5500a3c81db5f208430f95512820f053ac814f2cab2cf7aae262a89db970da58d807d0d5cf5a287cabc1d4b7f3769383c4cddb6a314b69ecc2be9f35d7d305a4bd94b887dfdd121abaa897616f7e5a537461ef11b979c2823349b10db0361c86c0d0ac92ea4489b2ccc7c1522dd42463179151fbeb184ad8263283acebecc87c8f58833c1ede47913be93583a57755fd16edc611a4075f16d029b7af9e4af2550022b33236145d0ecd5aaddd409a5097626aad88a2133bf1f3ef6272979fda28c3ceb9a14919e78d9028b79e444bf07b3f615309a7d4cac2406ca7daacb996461a54f06f959d153cc60c25e46d3d09170276baf4b39d37d9a18f092b8c1ab2f99cfe9dae28c4534d36eb1b953354bc992ef2c4b501ad0512c372a0b89d3382340043118f43e502913c247a3cf02982b2ad82d1876d31edcd3fa09f9905b283119a088f0ac4ba4a5b5fe53bfefc108693d132be8234385feebff6ed6bda88ef6d1a4a4710fb9a6798240d3e33f1b385c20a221ecd9edae3e407547d2181987e22587dc4e1f6a8a4d7cef68dcaf04b0b697fd8a1068bbe667c56d10e9141ee5974215e6a08c1083546377ba5f7228f6b5121e54b7862f9af677897cd92ba8de74677a39f26b6cc83a8479e39f644258a1f808fb8ba7aad54dc90eeaaf9cc9213cd13a6c09f443e83c19bc43e82c197443e83c191c331d30524d2bf03efb7937f4afea8216701096a422c5f4cd105e286bf982bfaf0a454f1755f80653392c82371c7ba7c163418f4616ca4fd7c8d2b5e0b8d5cfab4e83d27389b3651acb6766d21b20530166f91033bf316e71779152568b555c6c4a4d0a6aa75c9cd7dcc8bde3a8c09949d0b95c2849b6c13ed9a560c7f62e04456389952d5576bd5e11ed6609a8bd8f3ebf647e19f1fce29182be444f0dec69fcfa249a98338194d9f2d5f14aa70d6df21b9d74d01a3b1e11c71368282949ac53352cd82d2a43dd679e8694edd19b5b1b77940b9c9d0bb321b8ecc01a3768b365d814848465def84783350d6ec3a1073279a687e3a01a63e6933206489a3bfb9ec7326d28dbe684ada197e82d452a984ae58ca7eae62510f0508735743adafe18d4077144cfd6957f9176ff49d8023fcdfc2b28b14cede2c456cb06787f55ec16d74c3876cac91c13bab853545e13781d1fa4130e689905739b0becc649365f083e5cbe9bd255bc3ed4b005b17ff569d6ba7dada8bd8cc6ba005737e80f5df14c4a282d7757648a3b07e40af85c732cf4b3ab5b4a2ee2d5c46c74e06bddb50dfcf5be7de0133dc7e565b21d68e8e23560f59ceed05acec5735a5950adc4ecdfabb0b2b1d1f468aed0427ce672d3e0a5c6ae31c1329ca09e4e4e6b0c50ca2135a1f30e2d5083b96c20d74d77755e20cdb04b62fdc48ae20cd2bf7307ed21f7bdf0e9602ded2cc6899dcf376b526c40e159f60ad2109f435256876f564766bb38ac6dc0446e6fc5cf83e2ff6918286461c95aa67e7dabf5ba979ddfd96338af4e739c29a2be051a7b05991e25049c9c7d155318e9c421fcec1fac42d5f971767e8f6cc39fcbe5b00620136ef80f94511af7751eb228d2e00202856f4d2913df71c2abf2b02cbabaebbe4108a4da91f1ac506d9728768ff47c0a59a735c1afab2b85b4d6ffeb4d96eb6de8349c4848a83ee7a0eeda83c12f9a0e51a6d5955295552e0688c3e5655502162c54bcb685f156777a7f095f5b0ed9a5aba2e4966ec49b6ed9329c7dd1bd33adefc20ebb6d174d9ed86126aca5162e8861ea7f21b43a53cd64c12935286c1a6d3a0edf584b278e91165c2af27c4d5cfe13247cef088fa19ebb9b50ed04c225fddc2bafa4012e7a1e30530cd95ca51d52f6513d54ee1838a5069839b2625d84043f5649f3a6af7d8def5442e3f22a6f41c1d776ce8f259e206ae69d5327c537abd30eb971eb7479f3e754f42b0b31c2710e382856b6af1c9987e3caa24a75a08d8af8799ad2882e0931abde72cd90bf8f0d4eddb138e6ca4c0de55121e1da4eae8bb616ae1ad94dc3a00de1989e995d837d5d67b839b6a0bc13384460bd7c06b0a3eaa00030fa81d8d27b4d2b617068aa1291a557f7750b6e626459caec50c25ba8b9c96f5beecc4a30bd570029621e0bb26f52245b513efc320b1ede1ac634f2ae668b9a175cde54ebbe1209ddffe70ff52d1f9cb14290b645f21799ade1c7a018eebf2e330562a6726949a215d2a532bbf5b918b52ab648cce52337f403998e82438cd2040e92dc85f363d977e8dcf2c958b263bee7dd0fe6b3cd9728c423e79388aa498be4665a7256f2bb8323143ff55532a6e9073900daea1255a6ec75a12a3a072d8bb05b311dfccb10859eda8be5868e18340c3c3846dc6cce73215a131b95602d3c3a1a7fcdd0d9129a8a396657908bff311b4d940e36e603b18eae4733e61430aff35ce431e5000456d0da32073dbd3a5c5b9a402b9a515d99291b1843edc6cc49c9e8e6cd232b8242361dd65002f0941254297863bd19a8cf32e2035559444a3dd0838f8c6585f31eb0f67fd5cc9c0f7bdc0f264bda06ffa52e00c5345309fbc5065e26b3fe190a74f106886807dca3963c0d84da793e31d630c16cdbf49b53495f996dd68e5e5d11f2027b73ae3dc8cdd33b191786b9dd4b84e4471eb4fcae60b347a0ad9ff1ba45e3e02ba8301a445724e772d51e7d5459d2538650ae414561f0a6d1f8e5eaf03ef2bad5ab0d8566e45287f81fcd9fc78c065a27a8a05000224e2dea7515e42cd053402c2fa2ed74762cc48e02b2568f24ac15ab297f4a0f5fbb2580507678b903f571e2315b450626fe4f28795c2143739e7c61a54cdc714a9a82d5f4187ff3154612a522ca7bbcd2649d92723d1141d2ab115ea2f4492ac6210e05100d510c05a18507f983ffa91c8bbd63e898d70e87d5f7f97f90c44a345339f319d56df9611eb4e7e915c893a88af4295817fe6db3c8d33f4c327dacc2c08b8ec1b9cbd3c8ed079cf6388aa815d269dc144770194a4ac0f91a2eeb59ae1caad7033151ce527bc4ac6a28834283ed82dd8fcbcc656121bbcb6e1b5aeb92188ca9adb400ca769b23485c65545ed95a55bb81561d316c1eb9f6cc5315e935defe7ae12dc33fa1495d6c01cd52bfd77c78fc681b67613be429ce6d53116922bc3d0234328b792563a74b2a614fb2421f43f3c5ffa356963199ef295415cbdf9a2811d60e93c105ed23dd070420e4b6e667409a3184532b622d27ac28498080e418835a30b5479b8fb0de499b1fc80e3f42e4b54d0bf3fd1851ec1fe92ead42d50c6ab54e781de310568ed41399df2d478643c5aa11249371596d77a86b31124ac6c944dd0a9145cd2b67ec0cfdf8e3b69a7bfdcc66512ddb7e657df1683888331d44e65ab17fddafaf5cfbb3e0362cce8bc66dfbcab67eba0536e88d5a0abdb266d2347b029cfc273afb498cf8954bd3f210acbedaf9a21ebdf72103b52a7b7102504d52dd0d20cf7944082bca52a74ff4b55907c48927b79e1e5f38d70b9de48bf0181ec28ac1b95139a3cd13dc57faaacd3c18eb45598612ae8e36153699b1b528ac8c5665b3e397c84137afbf5b479dc22d6ae84770f1b67c6c3262596178cb709cc26667f1d2caac1608772b6930cd23c3e800e084f019ddbb0d8de12532b1bc08406077a32bc451f22406e59fb055cf7dc0a16861d9dc680db19d93ac1ac0d1c74272821a1a6a53cad80c6c8e223f45b2f1e09ea79bc24b2ba4b56c8a7ea8213e341884445b15c6bfcf7e8166684a94f80b0ebdb59dae8faa5222aa6812877da3c7f4790375901c5ed0d1b152f42422e581ee58ca20c0ffddcb60c7b3795d5c989e6c647983237cddfca4fbd6f5c94fe79ac2633d15c057018713766cc4e3dc64048fe79894a30b3c0221f92d95477994c32ab724a9e1c66fa68e73433a2a89e1d08c712d56da68ff1512b5e5a36dd0c2414dbb39750751c7ab3b59902dfdde7664544d0fdb8d02d002d4917b4c39a0ff0301b600f2e0d501ec6111a7be9a7ec61bfbd5af0b8a9e9e28ac8c3d508d174a21b74f80f24708a9ce52aa104caa2e4fa38827c09908589d607e2928d8716b9675f6ff2efa00eeb1ce04719a4e7d834dd37edc8709f84aecdfe374250a82d3b488273a633f390a38a0c51f1e7d5d515b04d8095d866b8ef06e96691cd690a6825ae92dcfdda05cd5354d49f2a01c6ea20e0f28dd50b4c118fb1cf2957e00608d7ea0839ba8c27fef304fb29f36ca40695c98defae48e8ae7467566a2233fab24ad5df834bae363d6bce1b4639b3abe7e984a9a687dcc63a7987ac4d0506a516f41b2cd84bbe7c66d942f650e936242f191d79ba72cab6c7e970524c73d63ee116fad4d8b1f8658c3c48871bbbaec31d1e4059be678d3f4c8b40ef9d0e3e17776068636b7a39dbec899ced2a8773a28e91210b236b4f2be6c5368a730c016eb8cf649561b694aa72bf5f58ae1c63c798027938e3dab525819e7f44c609e1c5fe0a32f6069ce9982c973e5224f921f25388760d4ca0d8ce0386266351ca0e3c4222db7e72ea55638ad22c74a57d53ce6ba3a5f5e1a46005932785d0851ea1a6f1e537d145eaa609d0ca03530981532fd0a04a6b4309b85281156c6e700e536682fb7daa26e40533394de5fb501527aa918671ce1e3a1227b975064bf41ee59a31bcdbc37082012d470e5ebf79d9586f6a2274acf5bf8b24ce15e78395740a66f87024500d82048beeb7e720f354cbcf8941be0cc2c609d510e0ad3157120ca590ebaa437218e8dc088c4a431911caf014226ed4ee2ae1836329a9c0905cf736a96e72532009a9e612dea2f3a501a9c2064d6e1ed02464a7382bea98ad208a8193a2360aa30fadb820fc416fcff7f4782dca64ce1ea177968d1c20d0276ee573dd98f8e2528b313efb26a0c05f7df49b4229ce9dca97766166abbc567ca1ff8c73a75c54dcc3f231ca8eb99049fedb3a21a9d00ca4dc0fac401105520cf6c3364a5e223e46f7343e8e27f8f8016607185a54d8e957af3a3732c018026fb0522dbd01913cef0f0c9cd6e0a53fb63e2417420d97210f664d205e212860b38e7c8d58a8bda31226d781812307822ed8546bdb7870333d9c2383a7d624b704f3ebac798e364dd5cfed960d770fd34088628fef15362ed32bfe6dbf53d62052300c9ab35b1d73fd6aa19888d212f6aa1012eef5624e31c69c387c6be3154fe218c5903586961eeaa296f170b295e23317a1503d4adfcf20348f2317c32469765476976644e05e2a9b63be363aeda872c73205c90b7a8d312dd8fa2439ad0c4c04c77239dfbbb5fa6f311327c6d241dbbd428bc707c72e41f77ad2907c2351fd02f47029f6eba31e737d182f8f46fee73aa2f7db0e6d130745d3dcc2576e6c8bd9c37eff853a285e36d41ec7dc7f7964311f80cebcb5266db0a48a9bf2e7632aecdc86e6a04124e890d03647c9b029fb3cf4a5fcffd2e4fd379a34bcc5e2cc52f392ea8a7620acd8f4c548ed52e5d9bbf4ab4794117c60c38a30022fe932861f62a3cc432d0cea07f8c5e2524a84d37a232e870a81cc3522f29df0b94de6c83547a34f7182069419fcc6e8c5b0718dba8d8e1eecba729f4b29b58d198854d8db401cfea8905fb30883efab5863cd17430d61c3807cf4e03cd75f5cc39705436e1139a0509401349ef7e2a3560a585d8e0fde8733fc16dd98163e834cf2b4e34f151dad2f09e25fcff4439469ae678e730f2c6402762e4d184804b07c88d7df017e47957423064aef54ce6a30d2577917cca79c116997f237c82e34c1c91f152cb25e6cd8dc38fed27922ef985ac604065c5ae5bd2dbbb0513ae2b6c80f001d71ab882d24e294f55abd4b4c4fd31c8960b97cf4226d1531baa897cc01584aabbb7a85c5ec55703922db3fdd7f5dae9480501d8b66ddf6c81bb8e81be69387c1c85d61221685b82db91822d8e8532b2c77bb4bad02760bca09a9ea341e8699b22c8d1986bf1813ee90c1029613c5bc3462e42a47102a7ebe14f4100c7815f4aa70290e683a88d9f4c1040ce706487ffdfa86210373d926256ccb3cc506d44b9bfaf77d0a81ec20f87c744691588ee7ef1c42f3bd44c755d4661369b6c45f7c2cf8812bca8e69aa0d7d3f817efe793e07bf904109af190f093bfffeaba66b6f0f3b51867ed1af86f649b7eec5fd7861e1acb9660b422d91bdad796afeb441837f9d7182c8b670c4b546031591220706ca905003592156d8afa63f8c1dc1fac676ba257bd55bd3212643bb95a1162f9143c9c436be3701ab6d8bc496e0fbb9dc94828c5885e8d045aeb3884cd08a1ef822224387d02a8960d33eb872668ff53e340d99ba243ebf8db5726dfa52f3b9521d1451daeaa2cef858c1a27b5c092c2f22ef74091d58ec1ffa1968b316d5b597cf909e5a5c9b1d9eab2aaae491ad87cbeabbabe42eeaef7a48a3762abe8f13d63867405ae6ff25d6f6ef0dd729be01391a8b52f16cdacd4a5d24e9f798a5db48eae76435583b5d7e44bee70b68eaa78631fb0cdf66e21e510721bf7918d8b85c944c4746b6b4688cda0da913201f1302df90623809ec4d2e64fd50d71124f4a04e420da47b44a02ed2e1d723c0f9c7a960426cbe15662b15219f88ef463b5359f0394580d1ad666442bcc4c69d3fad2939eae3bd6ec245157118d53c6c845caac80d328412355e1c33bb8f66e4b7dfb549773cb76a260f36505222af4d58cb58b3ac47295096a29d644526b538c819a148cf6464c5d3d54e2209e5b4b688f62a8fb3a0b3922e1d3b945a5eedb3369d76d731f536107d0402f9d5f60d11ae067bd0a6df04ed9f8f8d216cd290a7b23f43e2d6524f4d17e94f7bedf803c2497fa202ddfd76b2271e9ef3b791ba4a014330465f6d9be68b70560a3c4a5c7a19d45f8c2782d61a5cdfd738eb4fa202ef37737d0c1ec1ac51afbe203940c978aba6dec1832918074ac7289bec5573ab937697f42af6cf25065fc532d983f61034dcdc45b5543cf1345f472090e212ba49f2e82ffc54f442d2629f02eef88b44c48bf18702dd69fbc61621fea404615f888584f6f007afda443d564245029d55c8ec31f9409fad5a27c2c54e8666bf571209f3f532becabe16b7ca0fb34f48ef9c36ab7d5ca3a1ef4eb5abdbf41da1351d1b39b7d3f16807995a501eda3bf6b110a5bec5739615df0078663d3e53a73efec50a1519f015b315be005f9ae2474be305a4bb1d2eef89c83c4280d5b7aa87eff4c36459684c37a1bd4a66659a5da343dd9cd9dda9507b917c3b11ed9c4411d299675e9b27134570a92b9b68ebac8c3fa0f8f166dc68193da21f3780464fd6267b634982ca6da1513fe03021b4c6eb1237235489af974a600430d3706a45c3b0e34199961d209e5442c85ac62802b516d9734571ac34c5d6afc40db8a7b88f156c329647d4d0ea01ad1d4b166cdbc04fb8de59e43e4f25577c05b6fbd28cefcaef16dab5645fe08ac572f7068ad2359fc9c3bb51886b640782344e7921bad8f9922001cf0a751fe15f7caa441948b870e2ce9fd6d6c803ff7892bffabb0c0f48854287916cbb0ae71890aceb0d73cf0b1a03af6ce96363e9ec46959a53869cb954d2fc5d068a90359cfd7fdc86c278b1d574657e0ca4685661fa81d58744301358e60c3a228626c4ac8894569892d2a8f1c71cde57a94b2a8a88cb9a2c06822539e1aad35d062096f816e3384b92b5f5433af902a2bfd7f97b02c7733c8f8f8af1e5f8d773326fc20d775ce34e9047c4915a725607157aff08f514d1184ce6928abb6b0d39fb6b569d1391fb68c83ecab34a7ebb76438db59d2ff6e567a48af888f60c27b70c4067b20f75bc7a07b5cbd1655a768de92ee5b2f5476bdd815a9736158c7c757bf4618d1d18d2efc32fda7f3d083354ccef84b7a4d1c457e9c5e9ff01fc0c2e7cab690277c5cc5e72d4ba03bae321472a89d2c54ae3cda7195a51b6168718c23ee689d4cef1d765eae266bf5426386a6af8486e9ed0b79bd66577de2b69bcf3a6b7ba12fd672773a6b6986d7fed0724e3862ce34c2ff2239903a2498ebe2e652b172a2e8a6314608ab7d5ea9137fa3223efbe7c04a4f23f0cd36a6f0529952c25951c458a83ba0b9de9f4b178258286bca029108e013362bf2312ecaa5b12a5a5c3b6a1f1f774d3dd4e54072f2f65d0e5945ff792e05173e191624b230da7a20aaaa514f8e0df5c213766980d38ed5102568916a877417dd5041c950fc5c88ee898473a10a0a342f74fa4e832326caa2a8f16a200dabd671098a36a9091d5f269ea23c23cd26702cfeab76dd86335730682f54d146dfde1c2ae92cd4863e4301edc51afa9e8d7190e5fbca1580053e714542b7248f632153d4954d3aa1c597c923b4252aa841bc45d124dc4c8d54bb48e89f3d48c649d31a1a988146fa72f4cbd7253f081336d624b14fc2b62b9cde8696bf36d480e1cf62a30424946c06aa51d93d0953aaaf543db15766020e4888014e6aed9eb87084cf80596cd3aeaaa910baf60ff55cb086c1a1a5ee91961627cc45889c3990fa842c6c08c76dcb2b9115bf0dd4c34f420ef6d927f971df43817d7dfaa2a75679756ab9a990e22f7054d1915b6ace483c12ae09b4e09964cb7724e92c928c988ceb063b1c6da6ca599e3aa1c064a6f00d6c3f39d6837e5b787400ed8fae4067552115681e3ed505d4c7fec01b0cc4aac186c962d010ba1a5c972e7c57430a228a4487497f6759152bcac87570e4644657bb559898d272fb04c9cd314c8700ad6c4917290cb58d34ba989896b5164291dba324f5af2339d7d9b825f4748446e6680f0db4e3a7d83f3175ee6a077c94801272c3452e7c679b2bc9e28a87560ed884f349675409aec70d5c53fec3f980bba6dc8e681d8d05b8c42ccae51a204e7b7cd8cf38542abe43fcd733cbc172a0473edf11aebf7be106b8c0f9e5bf52f14ff80f83a164a677c2cfb016ac30ae28eb4fc8a7a5b2401a50ac882b223f300e0b22f5fed4d99b887805e581814265d7e730bf1e57f41d3865bf842b4ae80632e004b1b8a21bde42c776efe64be3ac68d5aa043283e1390b21aa759d57d89e817e7454f95ed76bebbad9426114963eb162c92344b3041bf729bdbdcacac07e714d16b775d8839cb432bd9541e6873ee7236e47ee27bf6dd0c43cd01b40703b0b03bb243323aa34df40d213a0c3fa8caf5fbb6d3d04bec6e5ed2f1b2754e5be961b5e98c658fdea053561f7358a5367fc9f73f93161d0d49807b20100dca7da6ddde64a9e0f15e92b523f687a8745b8f11ece51d37dbd11a094008ef235c8326c7bf09e262759ce755f7936878ed6b82fa57367a53e243977509a0602b59b14786bd0f2ee2b1c909cd7bbf1f597e9fd55a8d5b6d87f07b8602006c55dc2cb3c3c03c1ada255117dadf5064f43401ece3c8c2eb69684aaf34914793ee5dbe7bf3a5875349daa6264b55f9e3f88ccfe567b68d3220942e3e3d54327fbc9329de1bde43c4f4fda2f5045f51ae7528ea79fc7be871c32a01da368e929bf31b7756ca174b7203fffbdc1cc0fa5eb7ff71f066530c5b8154af1960e66db0514d0cc0734bc5e7ff0d94ce19b97f4441d793e9eb496f480c4b29d7d2e4efb862c5ef4d877e6795e77cc39e6314a42e160ef51d3f16e90f75a9648c8a4e075135e78eb9de38db2fbff5cd203ffd4ae2304fd3777117fd4154d618579dfd2955f5c88beae3f5c26b892f6bdfd811c974c7210b4dc83260a5d4fea4566b5d6371b1fc2fea5a15c801a16fdf275e17014ba65113c77d79f7ca0ec170507da136006220a24dbc23949bd644c8a1b7d26fd40c507a0a328d8454b55596046ed3305bfc22f81ed4bc3cd88fe8b0c00265f7d2d83979bba4f33be987f2af6e6d2201521a06d3e805e1c7147237b309d9eb7ac0e9e93f0b833146d6798f3c8f2c5ec742b43a2413de78b9051f8aa22b1608f247d979663670a3e2ca54d187ece2734413d79c79e2e74bdaa9dfedfe2b9304bf46d5d3830a99edb9f9ef76a086cb06816d66abbe79bf711dff5bdb72d2fd4dd7dc2de0fe88b06dcbfb614d035904d50cc3ad799f7ddde0a75c7e081c8165c29b608d816840a5ff49e66aeb68a6f482b429358a8e00ead8364a78a441074e3183a9da92466674210cf93093c7ae62a175530abe7337c0cc21b152b199ff471071dbc1fe31d150089ff7338206fd9954711fcdfaeffdb37242fa757fbb192430e1559069b8f39dcab3945eb75b5cafc46c88fdb865366efe5fa516581bdf7301817f3f55e68c47ffa60a4ab336aa57e114bfb83d2e6fbddc5a1d9dc9e67f16a2fa66886cfb6a1b5ebb5ae8abd8a1e6824b08b3a98f9e9f8f2c2c20c8264f0a24334cf3380909082e4e9df7df4f387f4137cad1aefa28da7f78bcfe3964005225450bc522464aa646cb295ec863c1b06645cf590de5b344612639d96b73c30250e6ad691eb214b07b5859f253456c9fe757bc9f38b6d63a7d5341774dffc1d004359e88987ece05989ee9ec2b33dbd732a7ad35a267fecec16de07d321e16241ded0ba67d34b99a11bcafc577cb49ecc3d241f57eff58ee8059e57afeecfd766232a2c18cb06cf22d5323ad3708c77bc7fcabaeaf94a2ab3ef4f58d7626dd513931f69379479b74f081543ffbed38db4a61bca6c9c1cab30e5e6c07833f8067b3c92e216c23318d7cf677662da646b1ec91e9459d7367c03a59ca7f5abf317cdb67840fbb78ae39ea6920d49aa93449568a431686c9c8028ce29489ef977c7b90fd78fc58f09b7403f4c0430075998a41b7aa7d18dd335c3ca0a47d74f109bb9524aab6a57cc019ccc563bdbdc5d00ca097cda449f2e92f0459271939484aee83fd1d51f6a7519fc03945818aaf835a1ab726faed994b6b223a8341ef1d09085513872a2055b86d2eb9d20e986cc9a2724309838967271942bc78c68c6fcdb55953fd9da2e6c97d3791d3c1942967fd82424b6f3fd4a8db88c4f948f385fcc69934d1a195091a518b0c7e8fb35c60ced3fcc545edc9929c1a8ca165f59cfffd509ca85ee81d6aa3ecfda056b69b9defd0a19795dfd83c0498831763c29c8316912a55e45495cfd1d2118a2b6efc117b744ee1f29711a1c754660e570429c1829a5f8869344634a9d6b05b6c9644b61aa8e94985ea5ef59ef5a67b54f60a4c450b850a1b22391df37626ba5c8e2c0f2e9ffa14055513b47266fcbc83b94153b366864662646f9068d32575fdd73bf699ae90a7b20723672180492b2ea3525861ca0e6014cf98a8c9040a470aece911cf3192737d042ec851c9665b7f8bcd830040162c594b354234f1a1604ddf8c3105712f4703310f4bf5efed90af739c85e4bb8f55328f4cef5f9fc3bd2c11b6a751bdc96705af171f228c473e2bed244103ebc02682c633b3188389cf8b8896f0c847b2e3e460dc3aa4ca80f52812517fd9375231178dc73c78a44ba8873b038d030154c9faaecebd50f1da10f1eb7f69729554025e88dfe9c1cbd137ca9e1ea4aba164863ae4b34dce136292abb78c072ad94a57dc5beed0dd8d6401f7b527722b7175316165f47b75c0b072f16ccd768e90c8c45278e3a91000192abcffb4d21e8189852f8a3f949282b618cb34ad5253d7342799692c3daa5ad070bc006508fe1af4b74ae7bdeb856141f93e514cabc3c834c5ca1b8755e0b7d5ce1c6ad6b07df4c2a0e8982fe91c5c2a67643c3c3dd2549a573bc14c6b22f87631dc01d4d3a049bb68de86f5a04339d5a7c9b8ccd68c7013629a2f850cecfeecdda5f4ea36449785c0c2a5bf95b437e873a5ee7fe6eba6436eca1ae50c1b03f47d49325d2dc40efe8592cddb7b3e1b45e3026aed7aaf5e48da524b0ecc9ae23bdaf29edb767f5a26a331bbff04ddb492f8a64e2a83836d9ce136910aa436c85b94161d95e43e1658323f45ee2229960d7e7dbcdb3c42ca206850f93c62a62295a7c638900b107c37de0811c8840042eb0a412ebf9ddcd37589a3303a31c373e45d79aea6dc1f39aa54dea88066f3fc6dd96fdbfb359b780441d6cc55042f562ca2bfae51fc854271595351e4b8f33ff5676e362a6125ae6948933698b9b1a720353fa6efb4b1b62b3edf9da12240a9a401b47de63744d0c05f070c83f0246c98b92ba58facce6bdc873f1e23817988da1232887cb26115f65fdf03f32a551faae98d1beb2bcff64390b57d82b671887820715b043cf87728889ea8040e0cbc17f8e1f03d6c2eac5d8c1de7ef8d98e645d383be6c835f03bb300d58f102d629c47a85f8777999ce2c34da9fbeefd3659993b93fca6d8013323d4b37ef0934e7a53bed3251e78b36af1fc4d48fe3b09f6747c1cb5d60336e998aa2fc593a0a9041593b79d419f394d8eaeb4cc6981c2c7d80660134120b7091decfa710bc3ba99cb92b8f0a090e39aedfbdfd6ddef42ac24c5027b50a1c4a8c2720a8e51ef90518832ed4de913b6375c3306b80a7c065e1844f8faecb5ea5f55ff1e08977741f0e9e2fde7be3c0108e5afa93a3c70ad72163d4ea97027c3ff2aea2f120837f41f616b48473b79df8cdd0eb8892adc2f1b17f37980e326e1ddd21085693bde25b9a3ddedc0c0551af368b0b88f98893468708738500c1b15f5ace015796b38cba948e7f533bf719c3ae414f95c39a3841e5430f93524c3e38f2996fbe93ade8dee9fefe89b8e1e2576d135137f33e5d669ee9a56b9c61e05e97e61da3db18ae7bdf239fa96c8b4e114b97f02f430d02f87ff370f51fb3890ce9ffc9a58242d990a93e9584d2e98e2d9a473ea70b91fe43818552c6c2cc5c1a2b02ea354b27cf2f990ab36b0da8b51076e7c3b1639c7e81852c255b705b96df329941dc49ab8fd475f2549125ed27d70f306edd9a4eff8b79109506d9ba3709bea94fd03fa4b7924dfe3399aa09bc7342eae1109cbb5bbe4002ce11e2b38fad73f2abc6c86a7c521a1ee8cea929789d39ef76624e300ccbf422325fe99b69efb38c3fd420881c02eb3e4d43d3ccd6814721fbfdcd914a02f2de106320e7ada640e9668a54b5e32480f1a9da13411272aafcf202d6f3c96578c111cd4acc894319b27b94ae244d70ac21740f12432251071ffde208ba19e4986e01066f70ea7f67d8c8cc78c34f0378884362379fd124ce5d979152fc22b2cf4aa630d5bec3020204574dc975f7a1df3fbd243b0e934c6e535231434304ac4a291f5a2f4e725b0648b40ba8d9843cbd87c4f471980dcd35b18bf4e09c9e21852be7de289303183e7575f38444f058ecc4cc6a491cbb3bc0c2b875da9c8c05d66ddb09e4c2d8b5cf6efb1dd3dfef0768ebed33a9c4bc832b2239d0f10062cda84041b8882da16a23d1237cd4f70288638cd85330e97aaa90800b84f05eda706f012cc442f3dc3beaf8088b1f3145ab54c3f9a9558b23bd2f1ea4883bb64e8ee5f38cd25f566ff570988b7fedcf25c69701b1f48c7d96c2518754996f0fee2ea6f9971363fcf3cb7378add722801b5fb731e0a197e04203720dff274eb5ae75a8b91be936d5c2e0d1d78acc6c16dca9174097a85ec3108a03f1034f1aa45e0022651d678d0cd18a04a84d43d068ee2566f452325662d274c2e67900a85ecc0476f1f052f9fb2913a393f3f2c0a6118939084c9b9936134881acf77de67f3cc4b41210d4c984aaa7c0b5384c8ed97d9e61be5ad2df0e889c072f84ce64a5b875e32a7ee0403d843dd2f56613555f9919d3078cbad61f059770655b5644dfe3c05bbaab56b21c2a20bd15dc85fa56e6517bd343097f6bef4bf8e710adeeef020051eeeba7c10983d8e82d474774b052cc0484504a1a831a1a9888c3f7128251b95363f4b4c07d5a7e89ee555e1bf2b1c4e9c9b030715e849369e8c3956d9c654779ac06f07c1ec3879fc76a401a7f8aead108521dea63a252fc0a453387c2b2e8a5d9c267c538ace8fb66dfa9b21c6dcfce0f9cad69f2f56c2e15c35ada0937078fa86d689bf132f599c3ca34e4256875ce3745cc8bc7434581f9e66683e999369f5c75930980e367d99dc0340184c6771f4d0e5a3f9c7fa2d382716d2298c3e6029208c50b3e73b32dd4a0af8dc71ae9e85fa03c8ec81c56cf369eeb60faf7f9c04f8a053511dc943332018372729fd368840b925e73777a7f177018ae09ca095ac19eb84cc52153fb4a61384cc11059f62a2728a827c5ce390b280cce72ced14df6eb3bf2edd9892b42a384dab92a9e47f84ada74a2588d73a0e0d645885a81a08881bc6da7b89c48a16f042e18b07c12069ac97be7bd49740a5e61e918843d7ccdb41b41073670b798a61e7ec5126b60bf443b768dec77cea7f0ee89f921f4e20807f58037d0a9bacda27c10c385889bac0a0838a6ee245f69be64b956a368963d4ee034bae244579a5023b7f34a1c9eb63416204ea38a52d240a0d89d6e9ecfe38661209181a88109daf73e3e0d1107921c9f235e0c34f12db0134e090bb0b7c3f579e3e05caf931f31d3ce2b905ecb39131737f3facf5b26f4fe7e6b8c04c84a014864cac690f9189fcfd25db6f85b133717b483263b4d36e59f34b3a3d9103922c5cea5349db183e881c3ba97d0e5091b27a9eea32c62ff8bde0d526c633fd08dfe2a581d9f764ea896c77acdf4e0790d942b9aa8993ddb8e923e2d6f5c4109361aa00579472ddada7bb82390c0b8eb651ff5b1bd2604fdfe5acb6c4767ed8e057c01f34ae6772e8e8b23fab3cfc661474624fe477f4960cfeb884fa353983725b2b2b4e94af1a2c939f8f24ab8ee7ff36adcaf33b46eaeb29427c57c49ee3431a027b635433ee893538a2054db5641063858146a0f7f1ef039f70c0ecff47e31ffc53da337a302aec793ec52a2c510cbd57f2521645fb87a4fde6ec2af2958d13d462747a9a5a86fa9fa0b99fef00f829820fb3a38f2a23c4e38a468be9683ea87429b9abadc38c4427cbeff6b5ce6db791fb633f888a2ce1501360d121a3529f1e5e54070a837c9ca44efdf4667d6a7f2f235001345ca372c6eae26857ebe89973aff7b17edaa29d05af280ef3bc3bcd378f90d5cf7ada6955dc5ea75070af06b4b788d39f9b05668e3413db5eb15073d03f8afbf43871f6e0214f9b525d374b9f72c3bdeb6266c88c5c92779b2a27397014158985ccaa84069a064347df1c1846fac4d170318f5be1e5eb56cc61985bf5243c3885e1cc1449ab69f31c9c261a61dd8a2f0559c7bcf9fad0cb5ec185b3c944aeba2a9dd3b8cd83d838d3ac641599a72c89034ed58d113348ab64adb0d26554cfdd40986c7bf7e1f8ba2db85d7d5d3cdc49ac9e2f989ed13136a3f01a7ae460786347a082a347a9454141c718000c458a4c5febaa45a8ee4bc9eac82f31602a47c8c13d94be9e9cd3e741c71a6e2a90687082ff2ab3fbb5cfb09d95ed954fc2b02dbfe41ea90b06cac6a69dc218ce6c6193eabe4af365c0271ebde7746d47474c385541a698baff630a7e91322a6e425241a5686d6f0a21333fe0a7e87e1dcae29fac9545859b7e91c23ad042df0ffec48b03290a4f78f080e59e3011f13c1325dcb1af514eb19cf4159741b4befe620486377f5f8b0994d19991199a327825d5ffa319f852522c45e21683e32bae8e1304b46964562f0944755d64b45b8e8ada1ae86993fc95d9aa179bef28e74c30e2983628a85a36f4796315f514894bc0fa33971c25bc3fdef25ce4c605d72fce41993991b62f35b74d2c6c9d91c3463a35b3f384a57b6468f05c63e06b711cb34ce621d7e989ed212026c83a9d71d8fe6a211d7205f428ec50ae048e60651cb8b776b75a160b2ec371b34fca664348b5151b1b52a8fcb352f4dd2c264aa13c0f973c62a28d39e031ca875c1f0413cb27369a495baf622b519082946dd111f3256a5a4b316768a9d8da1b9e6606e279436b4db6781f676e2e51f0035944b83b796c4f4150cbd94664161873cfe8a8be4d6443f0aa7e048a08ce2f736e23df47550245c63c91bf0c590b3832c9acab6dae5ee7bf3f210175e4c9461f75c4ab93d425fc63387697c7d70ee5d9a38abbe986a676bed2fe4d2750fec5607418ebd0cd82e36d93108b9a8e55c6ae0fe34dc6bda482e31799fc2b095e332279b7dae068c8af9b01069cc3d1bcd928c1e3c815fe98e4077aefb810e66aa40c471f68375e60f8a496ba81edb5692b8575d7abc8c0b5a955dbe6ed69c7781343a891a59671f48287f466ec02e3bfdf9527290d00b46bdd9f84dbf3b703e55b97b9f72bde3b1dae0f419fa40c0468fb727e090600ed503a0162b711f23daab2d8027c75801e12355686594cb943441b088dce43c582f53177a4f119e97c02e9a3e6155204199c80832fef00b046fafc8b1bf4f56088ee6077f6e73981ad5a235adc22d79ca70b5bb6c3918956e8d27aa39cfa1876680302a58584627516896c36a2666db867f12074276f985ba1267a696603ab7aa25b2920b204c621ae740d77a143b0a95a6d264aacc87014a0610c1e92a695daedc44192b7c893b4c16aacbbb9e12c9c3f3e722d617f70f4a5af6df88003aa8f037645b70c9ad9802e788223153dbc3b115ef5ebc6eb1f2536bc8c9fc190fd565150ef4b2f46b79c4ff7aa256d8943c626631a738fa1eb6e7327a281b7a4bbb53fc340ffd8ab47298b52547a04aaee5d1106c81a9e9fb1b8ffc16d8a40d0bc83650e42485daeccdf108f363a983322a55c7a5133483af8609d56860e1ef5c78fb75e05636a90a3641366dfa081d836a88e440416cef8875504a3c5147ce98cbe05528a1e8e229b611e3bb1a28341e47a196931ae1fbdbba9a92ceca542caf4db7ad4a7dc99a58ab8aa0d24bc1429162bccdeb9cb30530b9e5cd3ad4d1618cb29fe3ac0726c71ffd4b19cbf61e1c8e3d0867340e6ba57340502207589c7dc237a0409bf1b1fc6520b372e4e6965bd5def18342a8e8c907d2abffe08e5860ba01de9a2edfed52cf2432975a3eff07bf3679b34e872138993a4e5310a2b1fe5bd48bdcc481a8bb4143389bd73a7e7816290b33b9b609301ea29380fe44ce498a671954ee342e55ddaddf8d2cb15c4a3ed82ba5c5165854dac4f7fc82f82c37cd77022438a517fd01628f515e4c872ae25d8af1d07310ae848c36651d834fe4d1fb8f68fdcd2acc2bb2fdc9bead38713e9668b520900f531cdfd272ccbbb1b72e6e677aa66bd538c4f82eb3a1d5d349febd312dc577458ff8d397c3d4883e21c8f6a30cc0918db0f457900cd49523b067973d599de240ec2cc72c0b7ecf83c1ec4e1daeae01773b839fbfa7a38d521d75e18d08799eb645917a6aa95e548e0d19e0fc516b1f962da368b9dc33585f4c6243334d721d31ec8e8066cc924152fb52297aa3099da70d27aea79f482559c47d273d07673e0be0178d90800bd57e979095688ce5380d063713cbdbcc91afd044aa169e49483034fa0b83effb162071b9575b18da5aa792310210cacd5f06b5431d8392813aaeff41b4b52c0d1b8a0fea18b84e0ef542aee8dcb2272744eb6d44849e0a1724120f39c9ce3f5e92ce72f78cd9ded2eb0368dd331e215a619e55ba41ba651779ad324bd55b3eec020df8b3c5bb073854edc765d2cb7b8626506cdec7ceaa61338df51e137d69575a91e9d3f9a3a1bec997cea751080ca195b19483ebe8ed1ecfc2c7af3ac0b33693f105a12def795cfe64f0adaf2c2a8cc04194d6c88351fe077f0d10c8af5cbe57d912203632bdbce89cba418dfe6a2876b287bc5fa8dbb21ea4bc167b19c92973eca612694972d2f9321ab8b50269c3ebef7b3310204942ab828a2087744b445c042eb69383b451454232fca11d333426ee9d234af604529e7899048f6a2490ed8a78faae832d20ce3f3b31cd1c08eb816c8654822aa6a7e53bae05db4ce2894667a07189ece585c684b0d66ea7f3ee24a565012eb132af3686c9cd777fc9deae96c5347e292e239509e9a0943ee7e2a677d0bede172fa9ecc2f940e8038c7e04583c1887021f6a8910b9bd40bc557f6c729dc6df6b170075f0e2df1a62225ee0ea55fcad3aefe7c68a56f73408fc718f0d5a28aa3ddb8252e50fbd6986788d8015e365dedb90db8873317fc472f6530aac84d869974a0cc69be77959a3529836ab2cd5ad13be0b7b99949ccdbc320cc3b07df37f784c5e57f4a1fe5f38e3758cde0743e07c7e419d97a26c9f2d0503eb98aba575e723ab0c22f97c7320c950f9f2ca8af1208814f391d1beb29463fa68e3e5fbfd035b745477ec012c51cc8269d638689392a2ba7e658bc84c5bc8d0a0841843e79795bd323fbf68259b0fdda0c5c952736c6f6ac133f5ae4d5472c9e3893ff81473ba53904506a34640e3f6b5cf32719923eb8200607aacbb821d97fc6bc2abe0956773d1f6c6713ae40cc0a806360e838d5bd9d515ad6424a6ff3fd04618fe36bbe06ff8ea461fa7589abaff81ee8d4507eb1abbaeb771043d2989acebad62c6be310eba069e57f0269b5dae895e26498b4b14bae39fab4625f31739611f7b6024a43316c223fb158db6b13b87b21166b7d5e6f7606c61a433d7d64a173c696a39ee79f5b3b777e20ee67e9f01fd73e2ce587bf0f6d52c77e4ec22b69481134d07dbd952217d3e835dd220d595cfa7c24768dd74c8a79e63391d055e1aa9e8ef04d0291fc594d8cbaa596df39fceb4bed1ea6a474f4550e15e377f9c21a6eb31a97c682377ecaa5882fee86de1b854dca73b0d9233923796d3364fc3c743ff62d94201cf0f30c5cd2370a7454d73489db1c13c76c5c0ba8d18984cc1515e005d13aa83f23a670fb62650a576f4c9c298357085dd8d321660a689aaef300024440ed6206be6c034dd1b63f2bfd5e192e592d1793308e2d64096bc57736e9b4433424fcea1120f7b0f90cc1c30d507e6215a81913301e22eb1cea93af7fee4621a287a00c2588208ec024d5196ad82f34a8317457292fda110b7fa235a7525e758365f56738fd180d5e1b48a784203e0554f30521a834e837f2bbf44a7db6b275be2e2d185d9dc7ed7cde7478ea523ec1b987edacea7de36a9728a8642729adaa35c093f22ea7aee4427e7afaefdbc27487d06fb836ca7c7944ee6d0041cfbfc9634ab6e2ade2c13a823cf00d603569a3d0c8d8b251688860e9e225e300ee3b5699d0fc69afd6e6a95292304ac4152311359429853824dc5703824eb29309d5781aba626ed73337dbe189629248a99f28482f4157be885429c89292ba5ab7b718c098b47bbd57928c8c0a1261602ea3e866d3113354b00127b2d4d123dba66bbc728f7902440a3d89e9c4a0ce39b2aadf6df50dca410d5ef42e3c19fba01650c2b1c3be5c5ada3aacaa78f06c4f06d6b4bb887818dba24ef35e48df618b74d70cd5f32216b07d68eb88c621a148fca0df027b9234fd6a8dfdd5c31ad44d622353730af211761c518058c379ee52fe5e48250e885ae5d70175d768f9b13e40e4067bd75632c2ac3dded4587d9575b98bca7506061b4d270827ac7fd859cb75b3ace21890ba35a4d0a69e4738beb255d10192f64bc13ca2042393fba8398b28c59ef80245036699da8fb95228e29f682fa549c4637b8f2276250e923faa944e10f947d7a4a821be89943fb9f1911fdc38b430a3f3077a4bbf5a8617e34f2299886a9441466cb2af85765f404c837861ddacaca14c32e31e5e5bdcaefa9186fd774bba26863fb2b8becf7253ab7ba019541520c81b154fc9fadbda940f61cf42169cb27ce500d9f0edb6f3dd8217e0af71b662e4426d2b3b0d7f37e935a94d17b8a4186ed544d6879ed22edabf946bc3a5f4535807f7670c007d52bd4f466468d947138ed1a847187adeec84108a1ece2b01e184840a2a24b07fe60cb0de83dc76a4cf99e3f4fa5b4a34b340fe9312bf305363bb8d97ed4973302585c773d97e4374d0e0d5fbf208d716a77d44d31497f5e80893fc2d044d48f91821264968f2d9f6f19a2a3be8421f4acaf6459b455e5d76610e443ca66f9fcc659b4304133d5414a8bb875452984ebbc5e703328864bea78478a5ed3897a296b0037d90d151db3f79c19c64f14adfe8539a5463e2548236085075002cfdc6a543719dcab52f9c71a67015aa0a0a295e5838965a109e79b2975158e2567c0cfd11e51fa9d3ae9aadf2e1f9bfc76a0d4968ae2ca1a2f90fcea9689578b8db443086fc17ac09e411eb0c25aca4ea9c58fbe81ae7c62763d02026f1c53048fae4135e7c500b5ebee3e599e29a735abcf5e8ae43be4878be066f9c37f96c727c65f7d525ddd273555e0abdaad4a84dde0f3c27ef099b872421b1dd1dc53879270dadb699adf06ad37c533aba059963a73dba4ac9517ee9e526a47282ce14e9de4fb2195fcdbafd5cd7be8fc008c198ea2f2c02536cbfa0c7d9a80280ac6fdf6743a28956477bdd874a1ab2ddc4a6b850ae75d5eb9a10a5a891562f62eb6d888b38cfe879a45efce135cf1397d004fc36a1a1809255c85c55140a610900de2a9898dc490df6e01c189d5dcf7338e2851455dbab25d94fe88def9aabef3334ee4a1abef1bd011b49c733da7bf1cb1111038889c82039cacea16ce858002eeed57ab682055cb78a514846c29a8387c863e49e31bc7c0aa4e1b83e52e1e40de5e3eb52fa43d61756022e82b26091c2c5171746ff28b227f119080392384a55764e35f50f1518384cdde3844d90da4b99eb4541679e6d063eebd9b7d75885fa6d73442a94be876ff3c8c45e67a70e9947993a756a445589a46a3e06bad3434a89519f71d3ea63c8694c583420b4d498e899637102b137e0e30f6c2ee779584a9655a31bbfb3838ed5f0184bcc8e1d74282245bf4eeca888ed708ecd35316a74bb29979996000f90a6e2e68d6bc75d689453be5b9d13ee6d87bc647f52fe98c51c1950dbbc015e70be8b4f80bcc82da7d5bd0dd9d29f4726a793bd6735c9e56c7f3b233e490325c5ee23a66441abc2bf3968f4e712f115a154576090055a53250d52f0d16536cedeb34e389112a25b1a0cdd0cde0eb101a37dec22546157704f411a7ed00175555aead7f0da932532adf7e8512a3dd3f5bd911eec74a1a2acf8fc699c43cbe7c54490b88d3ec4f4cfd08759d58c27b380d05f28b6d215afdc7f79a745dbe3553145e300bb017dd2f0a1d8bca99b2a939229c68cae867de88d8a17dc0d26ffd6440fb183516b384fcfdbacf27e2d0e6fd05822c886f872764ede37ac1005405f918b590dcc916089fbdbfe3266f7d0e8c453fb74308a736ca14e46e04e1645ada74309ea90cdf9e45fcc2b6b80fc9e420dc8cb90ab4f4f83655345fee478cd8b020f500be19eaa8ee3e741fadc57a06f81caa08204d5f98356eb94bfe786eec711683f89a047d04a6ea3217566f3f25efc9ffc39362e0dd5e37260139f13dceb699153cb33a16bb246ae99c2cc2ff6223b309ce204384bb946a06ff82c4ecdcf5b5ab0e8cef268af51d8d4b9a1a46565785c5095071e48fafa3875e2c297a01b04b6b8e2bb56a7bde31d60462e1e4e28e4dd360b762b694e17c96ea150339b417c6dc70166bca55cc2639a71105366537b56d93a81d1594215b46fd0d13c12b099813f5a176849660b686f5464995050581da69763eae0871cee2dd0576b62808af46b46120d2d572d049c2cc2cb90cad13860adc57c5160bf3c1265ec28f1741a5631ade49c354cb05fb8bcc2bda74e625c93a4e5a35d52f48de12b4475bd4da1e824207d520942d1a684f4ed9e6ae958faac307fcc16013c9075bdc351d7daab10d728efef4dd1675b94c4d0aab920afcf7b86461da940a8856be0485a6dc2ea3d33e246d8003948d2f0a5d439b7a8727988d3471fe89616c69bdd9ed831eb19ed9a95be1d2d77d6970ced3557cc0ccb5a0def14171f84d2e50cbd4d6c0f36782089041fbe7af430408d1579ee94a443aed3cc782a96dd1e8e6c6460b261026f4d41bba4f93a14a18af6ffe9830f2cfc341330626685c17b10c592e7e4df47027db918bfbfebbbfacccce51177392acc77ff964e1698a88166408d18600a6220f3b47a97665e2d451a2e6a65eefb6826fe9fe88d7585177357aa4cc9e27d7791bd1763f26ca6db1fb0d1b837a3304ab5965ecb647f706d71f6272977bcb7ceb8e2354db9ed5bdde25f2ae531848fd707f8f0ba7adf7f099c7a454dee7f856ea1c31b06d606ff97d6e2454cd366cd78bf04c6f22c8b29e440f9017c2d9181253d76ad9017c0c7c9f233f404c97081e913b8310e937c9eafa57d53b85d07447a81866fb17855c8ab2b8781466df59733d46a4cdb4472d77cc675bd2f074d9dc80d7b06319f14f4462c48cb6ae27dc625ea8f2e8ec99e9fa95c14a7b0619f82a1da97092b2b1527b77aaa7bf222358e4012f0cf65def2a460ce3213e77513c405587614418f68e66e824874803311df3f999ab7f404f03c9230cbb6773e8c8c4cac9ca0c603ad1c453633f902161170f784ba0f3313e311d89620cfd1fe5c73967012b81de8d1860266bc739139895e911f38ad04664f7ced96d4394630d4d28d23e40a6acfad442ef3044ea219504bf1380b1202b044e85027ba2f150b832165e90958ca59940ccd552aa7a092cc85eedf8077c908482494faa30d0da37ba05d8f12d69a0e0d1da25a451dd4720f0d25ac863a3d486be908a1d5a17e35a8aa0c89a0903af060da1efa8ec99c4065d726a22766620feebe9e9e74d7fb2ff917a279ab3e45ba2f5906f8d55d518fc00370f112a370edbf3f8713fae71fb2b2621786c335d14a49f338e75b99d6e514616244ec244a66d9e25dc3794f4b5bb52f92e42a309af3aab04ee66987a8391e746df02c286aa1005ffc7c1371e1cafc120eff56494869567b6502166b0293b089f3066603b042679cf92fffae2ac317fe16bf4b87841b23a1767558bc9ccc70c8d050ec6ddded14b9683fd28a783198366175befd99302c25a4e886b5f2de63122df975a704e1bfbf5b97696f6905cdd1b2b2035814663c59039b23ad60a8788b6816a7891e68bf12f2e299deb4b401d151425bbb06b4005d4f8c6d187399adf053163131fbd744851aa9deb41bf1b199cb9db9051d13350d9f75daf35e52bcd8a79fe505fafc960f09e54f554b3c2c55f68eeee845e9c28506c543c7fdbd95211e55300f1aa41c2f45dfbf337b2167c36313e879aa8ba21ea14e38da60284fb37e68eb58fd5b57a2ac205976344fb91e0bcf15d446bb32d85f4f70dbb6df52428289a5172134c28f8cadebe84984a4a6c82017f34a780611531e3e1a491fea603c54cac59924069ef6cfb800d201266c45eccd40e93adca972449c8a6672337b2c254f6e1e1adb857845b4d3322c6376406da41e0c174a002a13a5f0738123ea8218a1ca670d87f1658d0ac263764c48e23c3065d564619e05a68632052688c552a6f15e77cfc9f0652cd214f9c0044463460fd4b562031d842da2e40f58584614e896d0cedec8a69f4021aab53b942b259b39e8c42ee3782165f4dc43acb1332fc580fa39df89b55ea0f931238a557c5b6d88ec93291ef0eb721ac7d7bb33c74443644606699822e74b32c1de3fdf2530cf44cf1d12cdf76460be0cf8877a50c075648b7303eb9d911e959511b026ef40f213b1cf5f56fb3bdc44b66a49e4d627ce35e7e52704db1a19fac9350fdaf64c6acfde2c9b0633e8ae8b6be2ff36b27ac43cac1cb2515220e5a87738972f325824fd22e6b7f8885c69e3042b7191d61b004364d89ed3ea65a1ae340944628a3e6f90c4aa194bb33730354d7711b16ac8cd7fc94c1b6589b151e3e0d00d25346654c9103b9de31166288828e105e0ee7b56dd7121542ec7c0345e9014309f9e5f86dcf932b7892805d856171551ab8840559f3e7f0d24c63d900163cce1f65a5873bdcc6546902a1957a68bc1407b7e52e90cf120ca87e05d41831339834858ef80db09fac0f7ac672761bc048554d8f1f9d4a03020d27b1af27e3b2b2f981af778ed674edc8165745239177d9613f72d6e5d65875ad5085121fa920b6769a6824485b8a73352f602ebb4ba36c452beb37c52f0f6a8d9fef3778f531d8ca712100bd19d36bf71ba14dcf2c63060af9c3d73e58dd67da15029d97a6cbbc746a84e8600913b1320f4c86dcbf278dde947f9052c4a865af96426c0ab3629ea190de96cddf59552e86e151a200c5ce043535fe10adaee7a537a9cb3ebfeefcd0befee356719664f43f6fce44de17865fa44b430739caea90d49129b841e6b9840faaf7bf319c6b0ae631c28764c719196f3454a2619ff5db129616ccd6ea684491e83e2ecaf26d1a0c00203de21af9cef4509b79961b0c3836889ffaaa7eba7fe8588d691276461612240477e115add24f036438bbfa9d2aea987000cde69bb6a72fb2dadf4aa66ebe3892cd88c34840f1e11f6d92a55d90306dc44d5f2fa5810f5f76c848d2d07ad793b66137a1a9026e338aa0c29d87e1efa095773fc58f4324c506bcad8c3401bffab14a606f67dc5bcebe14af28a5d94c2cc2a112a4ff156a2a901394fed2889d0b1f2474792900dc0ce619cb9fc681d01065484a8e21402476a1cbb48ba9e7ff611d969f839b9259aad21b3cf08f6522a2a72fe6e246a9c41bb2c6a20f28341712ac448b9ff69a352bf0331921932c4be73e90d063f543644a96f76724abb6fc1c6ccb2a141a03b506fcb8ac4cf929ed51c084ef662903b9704100540b55a488356dc7f082e1f0975556658e008b1b15f165c7619778e5c9d8b582468fbedf8b4473b4b4f175aa128ac47f7ed8b81530b81123820f09c5524d56b03ac7826fa3df532f89b110c4fd818382b1dc74dfb5421dc351e03231a3ae21aa500a68583a769dc4c29e6254e13616fbb41c9315f02c13eaece9710cef714357ae4ae8ea14a27adb6332847ac19a906a97fe12f91d367911a4c470d6c7ab1e4778b3d915a93454a7e4e59bedee0e5e5a14dfff5a3cb6208798fe22ae54a128867ac81f9a4f452808111459881a02789f266b838cc1fe7be3ce8569d2d8385fa19449c9884342249dc2d6985199a74dfeded4ba3ad0724308d5bded47e74ddf8cb78c1d4ef631c1fb143cc168d1df724e697bb7da3b8bd3afd3dceaa3cb29d1c2aeaaea024ae9b9f529628010f8afc4130f8e3287688b8d9f2a823af8a18cdb4819bff816ed0fa95048cb5c6ea13fe848b468883c41a09f17e37cd1d018437d1df080f507c0c9822cec49734568e78bdd684bef6b8df10cde6d803aa8e45593e8bec39a1e80127a239975046f1b19c6c6702a0e8070eae103cfbd5515faca38f097102d22b09525c7a8aff0054f77eebf5fce9ba00a226cff44384d256d2cbf646760b0a421ecc25aa96d1647649435ce747df8fe1933272f44139f2d2f37cc721e013015885add011d0208d0795c3607bba3fe1127e3a603539c272d62708d52d2f37d880e3726b0ac55b7406c1aca5038d450eaffcb31c88b71e91104bfe90190e03c50dc485131f160bcf75811115f3f57a3c12c12fbcad9a25685004f81b3e4e422a6101282afc7c3028b86197dd7dea1a61b5cf1575e243dca003a50930cbc517e7d8538606233c32ba37f7d8928aeeb5d7320c237255054409c105c2f75c3c60a36d7cb7a1632b3353cfdab53d43d73773e9c36c5efc847e0a819f2a340fc9e49907797d535e31c8a651ba480af015c98600346e04a2a97aaddcc2aa47af70d8f828b86f11e1cd4712dc4c46edaada701d62dd9924d7bccdef6d304be2a85656e12e175b76a6f353d8f4c6b0a941f2351f619c5e5740e5d9aa1dccf99a2b68c5d50f3ba8d167840e3faaf3b1dc4d0ff979d8e2b090ec916845229d18725b06f597b2f2359fd06593c9057f1e8a8cc475c0e4a3fe745919b721ccca99b888e444423c3a1494559e9345a2a901ed7096db378b5127447a31c518acb7fccb20ea53b613575a3b078b9b5eaf24b045f4ab110d996eeda9ec15d1b7bf89f4d548347849549ef480ef0ce0bf7ccab20411531220a20d3d77d876e105e02cebf2f129e906106912fa1be7f020c99e30d35fcba4a8b5ad342a228531d257ee47b67bc45398437b6826913abd58048399c490e033b07a917075800359e6f8949060e180a35b7d82574152a1e9e7998391f6ddb5b157003f17ad50c40d580ae3fd5a320b30da6a9d5213ecae2fe8215f7d0a26acb85f0c772d5603438a9d0edc7cf420c67bdac978d75ae132a08e518c77315800db2fa4c52871450a2f44eb94d70eb3eba47c7a28e910077db28a2ce404a29a9130c61bdd24cfa06ab6df2d688d7bf5a5a8859098313a4f057165e8dfb73fb9abe802cc8690a9141a6e5dffb2f508720ba006915f471ec2acdce5aaac040438f094b0ac947786e4360e5135cd229fe811520863d45128bccb41413d17d32f97689a1189964a009e0caedd78e264a2341b0481e5ac9414665501bc386e657c79b371a736205b770a67ef25174176893a0c9f2709e14363252a92ec2e10918a8bdda5dd8db433e0241a3cf1062f064b534a8c2668dd5b7dd4b2c1878a9f9c510b55d2c990f819d43e438d8e03c75ad39ddab498ca308bada6d51537826ca755870444b49bda83c51b4edf6283850d3465a46b7a5918f296c0b5040934dd76874f376a83ac3bb74860ba07ac7a00b267edf2638dbb85cf293a281fe73d058af830aef9d87c0170fa790c7bec95eee2595f64471993171aba06dc0180a89a2e29ddb6674d1054186e82d20d4f8164e164b078ed49772b78080cd5b955ae49f7bcdae20e45320a4be59874e7f591a37b46303563e99274777271316c9006d44737d20811ad68ff462d7cab94318d33e936fa4cb07d1a5c3d490c72e7e411e18f0647400decf95bc540b27702313aaa60c21c28c608930ebf40d629b7608a4fdd962fe78017f0fb0bd367ff2b258af13bc4d1e0b7d625c90d0213cfeaa9331ca72a1bc70c910deb150c0f5574d10324b6c5b09156eca40582bec81027ca271e4b21d1af2a4585b337042a3ca8b8cc7da9d808051db1ee8aa1c938894e54e2d9e2563d4a59d467e2a8a357293884617148c947c58a7464ccc57470228e7deef8e70146530069aa49fa23975f9055aa6b735a27ce4bdb0783afa24a4adfa493e1543ce6a567aff2226ff3b6541860ca091171a33b7ca9f4df459e8903ff845a9fa4d87243810d57d7ffada6bb8f24d247cbb36db877df7bda28ead8721b3ddfe147185140a8e9980631625bcfd8e55893d103a32e0adbc6877e28a3aac50bc0e86c65378cd44e0d240f4b78566d92f83eb0992e984cbc4f286aaacca4d6dfae22dfbc0f543425fbc903478dbab3343fdff9a94336f154c06127f43db2c87d3b0aa52e3b20639132b56bf01d871ef98df05966afe3cb60c99d0b4c785c53480e5c6d5bd3ed563525cab0e6ef924a158f2eff7a27323fe8def7763762a41d9b92c8f5eece23cb596efb5683a44bd490cabeed49e87ffac64e245a3e310e50547fa21a2922e67ea2dcbb9df44828a9af319771338945b16816bc0cc70a2d8ebc166d4ede75ed2028af56841e943da9e4d0d5dbc7520bae4c0de828773fb53cfa4ac80d920e1ef9db2216fbe7dfd15777833e24c35e9f8a8d13bf9e11e8427e5d2c791662e4c930a6f22f54e68538cb310bf2f85de14b76f7d2072a4af3fb17c5f4d2184ab904ffaf6353615e06ecf0c4c83efa8fbf4bcc6e40328abaf1403c7885a5dab800f2083f4e7a0d415bcb8101e82050a2f3329c82a3ea96e98888330d5e9dad3926189c03e8cea2f5283ef6a17c8dd2e40c8b328a12981b867596143b095abb6203141e85c623d48a67ca8107ddb7b3278d4aa0d9e2618f7d9edcfebc594d5c8045e8e49668895f1b1f54feb519a6d3d2cccc4e8238bdc354c92db4078995de9c5ce02d49f608516c7c4b4537a2986db55369f12b72b4a5114139829fcbf10f08b777b494fbe7b5fc6c8c11f4758cec291b9905d25ed3863514fc80470f0f82f129bfe88c28fcec4333686526f389f26cea3a525fe887cea7cd5d4a70d44d076711067639138539097b5af5161f67cde416e75ce085285474e485d1d59e2d003bd3c778a78b023c7b1387097dfdbcfd6625f16e435748c521ea2a4f452de0dcc18bde63533bb837fd213265c38f953ff8fdee911abbbfdaef2df8f5de6bd9f76f56fd72f1f2398b9aecac4e32e2f79541ffdef3105fd5b296705b925af93376a68972bd882ee81e3f4ffbf60c1aeca6743664f0ee5133fb38472a6c39f6317835e28ace65e7474e99465bc0c235819ab61ae6445fffd0159f2bf11da187ed9c9cc87fe10b67319fa6bfdf630602860985ad4784a18c9a36ff3f52a61ae28b21c9feb6a81e05085eee3d8c6cb9cf893636e5d1fc44664b55f1005f35b4eb9ec3ab93c4a6c01926c85899d17a437b7c7bd745fa2d36775c80597d43845884747f52720bbd4d9ab2129b120fb5d222908af7c17c68453bef0544646bc9b52492b6d7851837ddb1982d42c6a8a0a735b8a6ad9ee4e346bec0143619dfc1194860ad9861a8d5a477558952781b84481085e6be1765160240e26137f9fc3ab7fa7f745cbd8e9f97561953a9c02f9fc2d6a3c264e2096479106d956a69088c54d11655246cd93e12d4b810c33d930d9524926309874200a913b1c2755119f3461b39fdafd86d726887a8b0218c84cd78b716a55e10ff5764990d0870a58df4a8ac99ce847e9d9b5a61d1eace785f2280f460481a9501aff644c28660c685ed057d65f7465504273d4eaa5b3864439f23b1cad7489e5dff0cd567244eb0e49c23141047e6336dd1046bef4ff17e949168a21df1453a62a2101b179e2fa1acbd5474548fab837d4704d8328ac181b4b37f4e491b9d6c6821578fab7807c8d78642eb09535ddf778dbf7e3c1a8174a7fd3c86f90547da5004f371dc794a1f6cbae88effca0a6dc590d4c3f4b31c245e40e4d401aeb20609b41528bb8af929ba5bc4003972594b65571548e264a9af1f6eeb5c8722654d6d81b4a61aca5af2c42d5db597b8126a1276dc860342662f8228c1a0cd2f13c0709c6b8ec68e46f894ef28c775ee049d4daa253d8c78c2c2f77adaa869f68bf5c2b83826c181ae59b73954f131f4c3651d7ed0bb09d51f5893565574741a1c9e64394510d9c233b5128a06a76382daca3e18b778f8be8b2febfe94ed782f5baf445c41acb8a73a65ea98d8820823beac0a50afd1252a8641fcb8800c2e0694e185069929b9f8366450920591506b440b95ff6d931b818f6c8539c125a3032e493343c194fd5a506e7de9717fe8b43888d657d63bdfcee3bd19c3d021238c803899fa60d24e33b5c8263c434c44336a63a5b11713e9d748be5db1de927c7603757e127e912abd8fd42d3f9b6ddcb4ad2327462d1964cca8bbaa28ebc296a5de7746bdf516e82bf3065dc0c165457d3845258a6d819350495b2d3e3c303961eb8ff2460d9794845e5494f731c49940134a64fd5dd0a92958eb91ca13814d0c4ed78ec0004a581231438b66aa117291228abe2f585ccbf634e63516db435671f803ac3157005de9908284cf932fe373d18a8f0e0277312d5c806b4ab5f665153399fa7e1278f3d5a8eea451ed8c5d7d85fd4da9d70af5762b763caf15a1c0e7dae15779c285ceda55081391b4e35e224862593d219ec2d1835022a713958b709ccebbef3bd89e9d6111c6fe3a2e5c8d04e9485227396fe34fbacc317cb738451562f292a12ae42b106f7cccc1369990b95e5a84dad998e1c953177a40076759502d224128c2b9ea43c984ed1dfc09b6693dc2b4f1b8e399cb3dc1ceac3dbfad642a883023cea85913966618ae1648a35d4f4b292833e63449e42401fde88ccfb66100d462c9cee7ff211da2c09d26e453b499919936ee3493627ad430b2d9667016a6e94a65cc4c46a7d90235cf4a585bd552abcc841925b3b8b30b46e3cb7649c738f38228efd0747e7ebac029992b97c52654b26fd0cccae9e896c936025c1ccb9c4005ad5213ad1afcb13e97a60681bc50c0519bcf70a1c1dd77590a2b86788459a47f16a97909f78dc73770ae5de15a8364bcbc3e35b84a64e5e26d857daf71dbdfb5a55985579027e7a793593e393a33e22aa6959641305eb1227f43937b592886c52abd4eb294dfd22475b98e3a5b431ac678a2bb10f9967a02625250431087e5d13e4333f6c00add16799dd0f2943a1a68b032e7804d4ba4cdca1c2df58d927e122987c62091c633e33f5b133dda892b25ce8bfbfbb7520e77b4b6205a5cb0e79342f928f65420329477b4eb85c1d876368726573bd84d7d16c08351f793f935eb6fcc615d6d4472e7f6285f9d1727c6ef889301f3839c179a7da1159cf1ad7d3d4d576215e8152ec6fba631113dc69c03dcb95e9f8a06ea97f596dc9ce39658803a35eeda7880deda2eca4d81560dc0b80f943842fa54e81d78b2eb8285ee472368c3908e6c29a822421d6e434c8dac773a62e8237d5a99d2dff0fb1a805a08bc23bf9c737d53199a02e7f9ab6728433720fdefef05a79659f9798e8436fc634998a6bf77a0921268dec01a29e0ad821600066705cda322b0942b6a5fde571a61e0678d80ebd0908230757f6142129ac318509f59d04041249c505055e7d62698c7006d610f7572f6cb1a025124cff694152481f4a062a7435eb76759c4c8c60b0906bb8230e1addc5c45fa645e1b0543e1711ffbbec4468b207ac1ab1a20b54ff0e79a9412044469ed2fb5e1179d92e24be3dca770398f794f6f5ede03d79a7108771b1d886fa7a997b41cfddf52237610ebe1c029a8f89bb211554a488387298a3c21fb0d40c96909558920b2d0339e9ba249019ae390ffeb99b7cdab6d33a392de967400f7f024888ecbf1115b3033c948c52663a79e840bcb3cfbb1d20d631fd4ff50db0f3a745bf8a98c6edf330c72eae6f61b93ac97b93d6f55359ddaf76d3eda3906ae0e6ce2465a0818cb55ef155389602bc8e4757075e18b7269a264b321c00ef58f274f599a77127041754133c5891c58ca66c9e671e7f465a4bf7c027dd1f34182d9fb153816570f6f40e602cb2250039e5999424c738698471cde073df46a8173569c6db0076323ee137b5164db77c1a7acc560d77c9177401520fafa9413bac9e23154b274c6023399fcb301cf901099bfe0dda78f8fc8db75765d3a857e4bfc5cb79295cb13a7a8c654250f9d6cdbc7a326bc416eca002cbceb30f4529d9dc36d7ca90788174e5ff26af9a45764c0a9655f8d8dc8458c4b2af0a92d75f33a511554ad465cb3ecdfbd45eb2a5e91a2b74f51cd9983bf92bc2d32b3d4e034bab0479304e559e908305fa7add04b986404372cb39033d9a164695ddcabc884f72108b6d30239d4f8434e53527a7aa8a0c6536b86029bffb9228473df97462d41de9d5838d02f364d2240f2ff5046d4c611860c8bffecc35ba2550a2c447d14185bc09ae28bd59f2cd1969ae4d8ae010feab22a71f5dc4d3cdc5d424ef1393799ed5ba1f23e33cc93cece99bea6fb93f950b377abee6c80505f0cfd23acbaf5117fd54e5634e5bfa0a1f1208eee8dcd096706ac748005d7c64ae940dc7d72fcb849f142ca3fe936e72c84d4d521aea97dcbba3a74a099a8a8cffe0f45b52b09391413883eb161da7c38efe86989974d059c9f842a7b144f0e168349fc571ec2553d549f0de50ff478fe5ea0a24a0f106700e8f56ce22daeed89574087f7fa6b634673eb54980022c68aed03209c423a4cb53a81baec9e4b44f91bdae3006fcf61c9d661e4d9b342cb5a614a10a2d8fefd473c3ad56da07179083be44aca65bd15d999173aa933c1daa50258991f1cab2efa04cbaaa273c5584b6113f6016b8bdf79b8ce3e62fd28d540fcee28bdc640725b7ca1448d8fcb7571e30e91f5a6ba0b23fdded28858400f370178722f5fb70538ccf202e6beb26d81293227c3b651650ba9d8f2f3d61acade1fea2463b38971bae63298a6cb2ef4e84d9c8f21b2680d495cf2dae338cfcebcb3150ca238e2fa34173d5c6409bacf91eae00dc8c4a906e06f86a41ba571961e79634d0ddf4887f9f96d291e3da9aeac649266762213a347c88db941d3519249f661915bc24e82fcb0faabb0bb5ac30f83ca7f1e826e9828e7cc1bf480e710d66cdaf124e1bf8a214556ee67518131e4e7bd54527d50c3e1535cfc449e8f5a45768845093c60e9b9628c233c92bfc01747eb181a64d165776d0b22ee13418fbb1a172986b3a20a24dbe1165a637ad3e990f32a50ca8818493c062e1eb4c40a562ace5e5657cbe31424ec248815330ea675cc0a291ccdca40fcb5831a5b7fe5f2af6a52bad90ec2113d19569fdcc3ab1f045427462610610cc211b83e8cc62a3274dda7c07faecfe5a94a41686afca89513f265207470495e741b9aeae82690ea82c3c57d854766f0b825037652e87902eb676a0cff77cce229bbf0f5f9fed23aad95b55c13677ded6cf1be087137880e06bd0cf71b8ed39ea289a2329a98f48bc4c44d4c54061da9f21dbcb5776ae3bb7a4b7c0baae9ec94ece7ec8a7a8b80a19afea7da117b641964c94b9667717175754ac80d26002f3736e1482db3fc840a5da348cffe13308c22a43f4a11dcb9d0800af0b7c20d4640ec0b6cc2342af6490cf3017a6e518a198f1f2290b11ec50db7512961467c6fa9ec01e841a5b84fd1ae0abfa5e6992eff181899e142a1662e529f7a4b96c2aa121b97540aba5ef9cdd14346ad3c166c7bd18946a2fd8a2e6feea7e5238a2821dc0059b6078120b2f8cc6dfb65de819224593a4dd40cfa811a210f8073836ae4e1da694e72e342718e7dd355256323c11ba386bacc59ca502e401e3257f9c2e060ae047dcc4ab0325a6088708a6433a7fc00e2f0beb063b7578b381001a8a711a98a05dd2b591ecb05b464a073482db1fa11b49d2c68cf71825668a3ad87e2521673128cb306a815548d5e1ecbe66c0f74e426c55e1ecb0e12b48ad5e5b1a44b4280f10aea59d290e27059595e92088cd523fa2db62275624fff44773993fcd116cbde923274c58b0ab45e32c1546c034a158e6a5b30145ea503da7996d0e7ad34be5c6d5bb8cb595a4b27a6ce13003b19ce0bd01fe258834645ce122ae22511c5161d628bdcf0f801e33eb7bbde4ff37afda35e0ad72ffe8f269670e1bee17d834a7ffce22d3bc8de64cbbda54c29a5cd0683068306346421ef166a21168a21c68f6b70842ab696953f9439628c514a295329a47260be0ec373c498715877c55239b8fa67a91cecbf37dbdc5870dc8cb9c17f3e5755d908abfdb6b586bca687e8526ef69c150041507e45a66d69c2f9f29fdc04bed56ab558469eb59b80f06b3748e56b3fd3600ac71c2a9a48434b46488db33538f252fbe79459651a354e3885a8475388adc110f08f5262526ea80f3b15b4dfde533b50bf7d9cdae19f6ac76c55ffd9aafefd981fff07aa92406307744a6e668750ca47fde6eebb6973325bb1ea550c72a8e1004328575709872f0870021cb2f0828315e011c5ea2ae1d0831516ae6931238cc023acfc35e933c3a44fac4a9f137b29a7c4a4f499c9a86931238cc02b50c6cb74333191b24c37f33134326464cfbf71291c8ce2994c866518f3fa67c2180e4de09fd96233d8a20eafd96e2fc60c931ebb3119dbdd1d6bd9b1bbbdbb1ba63bef86114497c8ed5162324ab92b252633e93353aec6a1c2f82ea5e4dc93acb56024c7c86566d8cc30cf231789612d774a96f24377f795bbcdf5203d62188661f10a0cc364c4aec062160cc33029b12f24e65fb29c207ac430b98aa9ebc36b5ac76b5631468c433df699e3ac0ef73634d98732aa8e4dfe7ecaeb788b07c4f3693048bbc03630b02768ed058bfc30293b66e6f828c6e9be7df8f00192c2e19f0f12d02984da3239ce2eb2931455c8b0218a183728e151d49095e090430d798897542e7ac9e0f0030350a81728dde0440d99b5a2640316a6a2c5450e95f9aad790c3912d9d53dd38eb423ba523575653829c4471648601c81083f8d188961aa7a89186276a0cdaa1a3e1ec2a73d5abc94436654a1c894804612938e245415eb34a35b4acdcf080238c948ce0e086071021a186b0ea55cd902a90f88113c8c30fb6a042b3ba493ff052032b66c8c28a1c9470c08245d27ca6a25543a6a255b51857a8ff8186f3851c5c23d001ae1c1274d21a657cda3851a671c08fdfa790a08cfa55fd313f7bd487ab1b9c4a617ef6d9e4388e7bcfe9e7487051ae598eece79c9aa6693eab99fdcc661735962dd89666052e622b9b73c3c9d628616b74cd987b394aedd63e7b02c2809a00cdd7be0423ba757e3f4d7ae6633f7f9a842a28a002592cf505ffe2a5fac854f91a90f50522a06e7ed38b64585307f303bbc5c2d23ef38f88e6a9fce5664212babdf64a4680e021b2ad2781f918ca53f9d7333f95fcf9cbc23e55f62c60d9639f4a3ef6cb6221fbf9f3fbc1c01030f0e243abc5ca3e955c96f6bdd7f8d70196401419b1921c3c3d0a68c8454c1e1134ec22958bee927f0c8df3d3386110f971510a09aac373baaee1efd81917a7d59d3776c7766e5eed0760c188d3eddedcedd47d77fb6777f7c605c70884b8bbb179cec8cc3122f18845cfc89c25c6e8ede8e87883ab78459432fa17af702eb6a5a9dba0968d3916a4ec97de8e8ed7fc40c71b5cc5ff188966dcd238f1080c74a87119290284225b106088224e45b21079d2220376a40b1aaca06c60ca860021635ad18e6e51036ab5c56be3820a27451732c0be90a2b58ae08ea4b80a2353617e4f5061607e12a930325ca9300f238503a62b402af51bced4144d4d7d4c7d11414da5beb86a4aa9e5434dfdae004449b16d3475b3a9dbc7eda79724eaf67448ddbedbbc58aadb838db3495f0c31c56e4e0c153930e20b220b787531c4c58bae4ccd9ea8d9cf8c0b126c7183c5f12e1543610b2432cb22801a54fff954c593106d26af0ac39c161796640386618cdd4036d920a59472092c5a920829a1c54b1750aca0b224d960050d590d65862c0d01ac494fad17528d3f6fc4f5828b11473380410e929c205a22882d3ecf2cae1ae4e83a0d72185feaac68e8344eccbe307e3a4cb5205269542f6848690c61894ee188af56ab55e428c9155c38f1e2cac11169440a58b0558c5695115de934ceb2fc38c3801ad2744982290b23598a6accc2881a93862003e84ee6933927457129129465d1b8e0500336b9f81024776c119471118286a804e362c411d762cb0e2dba48cae504397486147772692207def1d4e4353bb9b84068c7109c3a224e4a337c914a32801758d440802050545da519ba0ce0896e759566d0a244b5ba4a3334e598814969062230f0efcf565d6f6babaea7daefbad5c398e83ed7908584d846ccaf8c671e388732f3f22fe77c42f40b79a96e128c2fe4275c2ca5eaf093da8c04887d3c8277016d905543a061ece91ccec2d33898098e3cb1836e6d79c2b21fa76c19f6d987e9c4784171c207c21996a19ef63bbd2bd49199b7f21ac6da6582262ac60082d228652c21b1262645998c22d98c61034f4e46f2d46234d1260a45050d5d028409456d44201ddd8004885ed24c9c4a07b93fb953739566299aaf30169723b99117c98d932104c4d0122a538e9870a9182ba80161f63c0df2c8fefb917d3c7aaef037ab071acefa537ff007e9d8c91a769e4a61fe8e6facc5afa381b6a22520e2487b47b96b8ff25ef02f3a2f1470a0d03930dfbfc5878109b30f39f662e488607edbfcd9f3ce87931f11a5edccac82f13ffcb587e1af3dc752f3b28f44f40b7a16cc47157fdd4cd7f46b2ba09d1419541745426713db3eaf4725102f3e225ea1eb6d6d6173767936085a4c4822b3f79af92808ec6f0efe52330cc3b22fdcefc06f7ce9c110eb8ed8bf2c22d4af07a3baa7ea9fb5bf393d100790e62b4b284ab08c208a96111c69ea8fd9dfb93144897bf8de434b69410d57df030dbb97122d980d70659a8ef10f7908480fb53044c92eaf0024862f08d78486eb14841fc837d72de58361c762a93868832cd4eaba2a46432ca12449c9fd8341dad81bfe06ec092ff8172f3bba55e5d780bde1da5e07ba4a4f05fff2e5cb97da5f03168c2ab8cb4f676f646dd6a921585986d2b0d3b0659f61588c40acd1b1280463be61e9004850595789071c146009edba4a3cdca0c30250578987293c18d5f07b8ba416282dedb3e4ea4a1e1ed7d5de4041c36deae17352da750f32ce32b8cfcfcf21013a122833aaf23659a0c7d688cf41a8dd3132a7a47b60d82cb4649bf99918638c3ed1fda36ec4b634616caaf2b7ce3e9084adc19f01fa518bd2b2d758d3b44c7bceb0d8621b581c32c5e2f45377b1a07c192f624af582f2851a477bf911091071282e699cf9dd854ccbf862c47c5e44bf229814d71f7b0b68b8efad103d1d373c14741a94361290e0cc1cf584f9974dcd999cc9005b835f3ec83632b7c1179996b49961a856a2cdec51dacc50dacc309436330cb54ccb0ff3a9df1ec59307745d4f4f4f4f4f4f4f99cc27e38bf18594c27ca1cdc77ddb3741d000314954326d8d661b315a557e7cb23596ee8dcb9f93d2ae7bf94bd953f9924a83724a95ccbb9bcdcfbc179c911a1c82ae8dec896d645f346a2eb6067ff1c9de7c91696fe44b25745a098c14c6bd029aa0303fe3e5c72316274eb1a07c39e38b465acc17dad0afd5cd2902a500e8ba19f12bcc179960d080c6f7efcf8be44fda715e94050909090909098983268a6addfc4c3ec641937e554013348c46ad2a3f1a21b9965e4c325b63a590b115e4394258f2a390e74496fca8240e7d2c8a4d362858edc7dffd5412908f3d0b8e7d404d7a16c85f7eaafd88b25f96fc653dfb11ed9837a605195e0bfa91f7145846c0c2753ab51ba10723f480668b369a9d95820842d0d09f78dcc96b4ad8010dbb656f1844a914e60ed8c5485cb4af255751d1f217c3021abad04e7b933b6571269dd76aa99b406f2667a55ec8012b21d085804cda096d8dd49c9476dd3fd8af55bffa1583d7c407e235d1998aa6a061bfac6c4e347a6d0dfe4e0ba5c2688a1a7f33f21c9a45a3ae24ac3cc799bc26fe9c9476dd3f08ae564c948a100410cfe9d7cbc90926323de938adb2803abfea406aa30353e3529eb3d8a1a01da0159b6c036324f6263e17f109ce4a7ddc44ddc87368c450a1fe5da917a35517fbe411f5efcf3e9992c0b252bf291eee1909fb908b7060518a28d3aa5cb492de6bf7b51d0150824d6e1ba7fa63f4f7e132fe7cb84ac21094fbc17ddcc17d5c887dfc2020e5730a07c7d40a42eac6defc622a05d48ed3e9612e770648ccc004b57db8da334002864bf5a76385d7c2b362df2f5f074f8fd4549ae6c3473e906725bc447e10b94d44aa0c2212878e704b57ba90daccbc165a537056290456aafc1b8db33ea8f25dd8c1098b949ec2812282c68a83bd0c8e2ca502f6330d764464fe3958056eb509c12a69c815133190f27584a046d91648849478108251015d25212521185816ba94e2b81e68ff2a0931a9d8af6f18c6428da3d2fe3114e771d8dca67c2e224a3db37e98c5bd4c0ac7fc28edbec33e1b50b56a50feb2745637b06f6713e1075a7fa0d8739dcf2d240d2a69500a3528352bf46bc8462b603a66a6d0551212aad86fbcc92859888d3c466a50be00aa501551ea97c53dcae3e9d1625640e3b1044d793dbc463ee7f98842c36daa12ca12757e412410277655f9233f062168b84ffb1d7d7808fb9529283666a6d99b1eb21f7d4e4add6d36a45bb338dcddbf0f40b32bd95a93d2676262626abd8c3c92e80ae1fcffff9f3c74f0c0e44f791a696664907037604c1d9fe051860e51c60892cd33e3d91926a349a49991e1646a68e641c9b0e2bb86a780523495d93c681f3a7662f849229c4f413334b403ddb523c4483bce42317ef3056f194e345c97cf8ecbe572b9a490cf8da741973b0d6e41c3e9e2a01df6666f76d9fc4960760d13dbb922ac18f4536d1f4f8ca7458f025ac40202e35371d1def4c3c0dc97d0033ae39391c105c5d88a3e1e0eaa28d58e50fbed53ede0df9e5f48155277baeba672506fcbc2c9c582f196a5793cd4200a6c834bb027f433d1fcb888461ba59a4341d3aa54f854fecc04658287ca5f68233343433a8310ff1ef9df4f93fd7afce3f7f32384a948912d32d4a7715a1c0edebdc0daa06117b64610ae2964ebc2deecd3b08d0bec09fbfb855bc57ef1eb582816317fa78f7eaacf1f3e5ba54a75ff1117ebae52e5a8ca67cfbe3b85a3b32cee0fecb97e347aae8ee8578e4a49daf863588f9f3f9583ab0f4c642a476318b61206dd1b8975330deeeeeeee763b4de7d90467409b06411bcf46468ee338ce9b7783a1eae158f2632592df0f0858d46b38994a01e3662a076bac699a37350fb5715b2a7aa738b5198cf0054fe3540ecea3810395ca81550e47f584ea0ed55d9f7dbdbe70a91c5db9bd49e5f0caed8d4771c0487130606052746fd893c1d1e58895c66c31a8989898182d26262666c6c46431588c8c311ed3311c7302bfd8c50cf38446514336e2a1d496cd07206088edb3623cab8028a80ba7a7713819266e18b8f2689c6f4229527f884151a4d07c94204f9e2821c5b69cb9a0092b4840b97b70c5513061b27df49db3bbce93a06d65a3fb1d25879928534cf041fb2c15666ef6d2ddfbab06757a1ba73b7e389d7a7737b66f9ba0057dbd48e04e9d3a75ead4977a0f9c301a5a52d42038a345431eda6716d72747c4a7c9556471c2a589cb15c58997902926f880fa2c158ef254c3a74bd35788c0fbeb4a297d77e3faee7e3dfb294a09ba27ed966977386b0e58e065e7c60c1d68b82e1d3a74789d0e28ee2e82b8bbbbbb5f5ca675ce3f7ae156d9dd940b3c4629dbc4141d9d0f596989a61a3e85120528dddddd1d73772cce06fdf7c6bb2c8d954d83fbdd206f3bb3733132d6e43b8e8a7083b92ba0fc73ce39a70735f161cb8a4667db2fbf95ced3689075a46c273c8912585c477614bfbb45a8abe4a40b126c9c34dc3e3831738f06f97d70f5f1e17e0f1f3e5cd0d91b7eae09ede183db6edab4695d274772024ce5e70f003f9290cd86ab2c450a17b91e9888a0438cbcb8ffc18ccf04e59e8d836dd7e5f4fef7864a7bd8a250d73d46667e0c8b8286ab1d5f89c2737431f624185058517612d0fdd5f2036b4728818222e2729520690853e4c95a8aa281aeb866239818824a08945c69024915282aa65eb3cfde8c42775775f7bb068ba06b43164e51fc553d9fe09947d2753c14c5a1788009e7c46c2b3498f1a8c094ca39ee72a171f6092447955f5d7a340eadccad2a4f20d95243bea18519ba204de1691c6e41e5dff53929f51b0d12cd5fc5b430c405f2573ea2418dd3534087a2108edc5d623724e6ee2ee5638ca57030f67247e28e64ce22a8ff7f838d6152a83f867dc488e66373ce1857f06a7a31755d47b4f1f4c47f148ac79c3c3c5e3d0db644794124cfc67ddb1666af6def1e797ad9164476332fc398962512ebe1c2d7e8f9e8ae9bf3eb71a3c5850665d6c37d9cab2138d3a0fc3ace5eca28d4ff553bfcb3cf9a48fbe8691a57d983cb85246bec065b92b610996982020a8dd31f3d09e5e6666460cd38a9410d6d666823115aad5641336040436e794f31826469fe6ab55aedcdaaae68cc0f5ce980ab07e90c82814fc4cb781a3df6b71f44dd403f05ada599a56e0a0dbb89441123468e8a1c0d79e9ffd93ec8d6e0efe7c0720ed0a2096d203e9e0f8fc70edbe8a0da3bd9cf148e2835ef9be1ec695a8a086ac842362d90866090bd41816d70604fe86f4d0b7a544316a2c12d579cdc9091274f505f3c61c26408131f5e0d2ecc0be8d72a3289155ee136c5cdc1beae03f766569bc69993c77baffb81c61ccf1e11f68bbd7fcd7a57b520e857285f549957a50d7612342b92e4430d509200a19ad0cb01326308fd979ca67d7326314b46d33c63b5d7467be34e360b1115435328b122d4519efc3d07e6b51ffddb6bbfed0dba7dabd0bf793d1af427a18924a954654b65a52a5dbad544b0df9e7a305ebb521e6aa2e69ca86ddb8c3a339a935277327ad0c948a7ce18427b66764e7376dd3f08ae56298f480af56d3427a55df7afad3414aa7bd25ce9289bb398b795ea0d45f57602c6f64e1fc6c873603c877eeb35309e4e08528db37d1e6e40088c944783609bf6dded2814aa67f6bd4429c95dbaa687e74c963b35e8de46d597696ffadd488605fdfcdb8c21df0f9056cb63f3c72bbc6373de6b74f0146b65bef6bc537fec07c16ac45e9b3888b26d93d8172e5663cc767fdf3518d03ae3ea5cd1073dcca3c10e2af47ba401bf0f08743ffcb8bfa908ec77e353edf874b8c2d54cbc22290906f47f65a48c0da5734257980ebf12164b4cc2201ec64fa741ef874c413ea603f641bc4af9d9476fbf5583197ff9f2e54b10af1c0601f9e964afe3ada47f343a67fe8d95ce8e4605c90674ca84fcdd395b4d7ff71678b6c68ceacf23dc205477ff95e76c1f2b995f94b287c7c7f341a1fd27a8d28b51a5b74b489654e96d7553bb37b2ab52feacf263ca5ddce3c6dcf3afb6c68ccaafb33524144e705f0cdbb75e83fa580814a2a4fee8f7d98c6be6bf59669dab95484a438ab817b2f5fc0889939b3b78da41465da52737d84149294992ec411ba4f7424370b9719669869716297a9c148df3ae55f73abc867f7d76097c2574a7174e15fc4b5d50872ff9cb2964ca2ed5ddddf1812f35fc69d5fdb80abae8d75daa1493d1578809932f5f5adedddddd9ff6a8466d956e8f8d5a4dfbeeb92f1eca300c23e6a373c2501a44560d45436b9e0685a0daf7a980a23e5c0939aa3fb42851da2729d79e5909b51feb2fd4deb5cdb25578f36db291826a2d8b14b8fa2f14285d52529ea4a43cd12289249ee8d2c4d2d258c9501aee2bba0e349c759bb33f206ba571c23929dd710ffc81f21361cfafcad1771f6c20e857a41454f9cde840c30eabc293199c407a6bcca8b1f6f311b5e75c7d50fa7df40616e7c7829da385ac038a66a95dcd7c41ff8e42b9621f0cf10b7d364b8dcf9a4fa4b1eb86b74383d0b75016640213c8c8ec1eb19732945232b38c531e716c7759d37380809a00654f81eca380fcaa3032fae7de70f4ecb47f2b30b30068a0fb11e8df0f05546a0876529c862a55765f3c7834b83c1adce769707757fe569b06b7f31aafd9d75e40bfbf705d2b2846825acccc2c9955df2da9115d59798286da5f1bb1f7d0f323a4e74748ef7e1c04ef0a614dec8b086145212cd5673df1e5f7133beff66e2a5c5b2af69bc4e54a9dbfbf836b2583515ad92589b667ec53fdf601a558d83ef5a90f889b5fa722807d60830cce5feda7170aa9a1f6a86deaeaeeee0b3f2108e67ae033f13fb29fff237b08ec6826557e33a9f2db3ef3683a677b17ba66f6d042c37dcd6c57270e7a784a32425d2514e4b0bcdb02ca7533b804e599066bd720af409edf1f00196cc006a7084f34039bd3c2fad81a5cf931b038d10651962455dea6ba5d2a7f0536c747f658d095e734c19e2bf77eac2d53d897419ca05ca5122ace2dd719f639b22f7bc9adfcdc23f27cba867b40df091535d4910197989d6de1bdd2c44e287f051a87824ddc6ecb8f908406a8fda1571b209f90f168b0f7b5e2b1e113da3d1a0dead8b08d04ec09fd08c09e5731a0a83a27a5fc3d8f5461bfac9edec67e56ece3b9c1b59253583e494a8202a5698b1042114350ba326504fdbbbbaca40b13264aaa50a7d6feb033298defef1f90d7ac8a05195f7ecbda9517d2ee419d9d16dd8dceb4caa2a32d550175a13852523718fe905570a4a4822e5e18cc0b6630fe19ce9959b675f78f20723d7cecb7e6b01f52ca7010ab7f22848c0f50647c80a2a4944489a5244bfe5c8f80c2748416a10a0ae84f038b653f9ffd1f3e8ba5fafbecfba781c552fb53450985727f74f78695800285092682824aa8abb484117fc1822d4f9858efa44b19dd37c77f7fd0cdd05ed6c90cea1ae999f891e5ade195df8ddce539f15f04959f1da9b22fb514d82f5569d506d45daa61a8ee60e4853f7b8b880921a0404dfa81e2cf0f9bc90b1afafcecbde51ee439254041819af4641f1f0828eb57f64c2a16a26abf9f263dd8c7e79ef8fdfc3451f1c49fc0b2a2b601c58f5bcf3df60179150bfef1e30784bdefa77e59d293f1531fd0fc38bf75a075e2b2f1901050931eedb1073202d23e36f21a1ed201ea63232ed8a7da4f4581f9d8f764af7d3f4df6b517c2eaaf67fea878522f84c57d13150f50931ed473a5c04f10b3b09f8159d803a154fbc1d0335ffb7e7a780dff0496e5e3e535ec427db84da9cfc96bb2af5b5e93cd07dabe16c21ea5f1872d5419fb80fce7a7daeccb1e7b1632ec81e4671f0b1890d7ecd74b610fa528e0ef4abc865b3ee42da45ef29ceea55e1687def21a969605fd1a7aab72f7521f35c84b6dd420ff26a49b0a4d71bd76f77f47c78d0697bf30e2a8fa57c6f622e8462d647e75ec34b87fa5f2f7f2224992224746a4808179b98290b06dc9d6d86609d6060a3bbf79a8a75e5f714531c462c2a47154dc6fddfe432ec291eacd9be12f64241aff16c2c9698855a4c4941a32d2875cc4b193cd0940d3efa618bf947ecca7da3ee637a0dba8440ff6243154340300000aa314000020100c064422b150389e29d2247b14000a73864c805234944643591224318c428818420c308400600c101a1ada2600cfb45151019851a3f4ca9642e3cbc9e9e230c410bddca5922151eb6290133dc8040710390dfa9d5f2ee64468b80d7bbbf9b50c6a5f8db9db7bc1bcdb5b99a8ab1417d21efb8839dd7eef530afce31d0b0d48aba7fd31c98afc201dd4ad87cf68586ae87da0b73c0051f036bce1c9f10bb9d9ca75d0a548cfc2f04b21e143bb30cbabc158702965b9984b789d054b0fe099a6802f25f61e62abbcaea765bbdc3e6cbcc26b135de1d173f2bf57e8fc0fd30dfe28c902297d465cd2c6071cc1711a58b54da2af8dcd35eff98c8983a40eba74339db4b835795e46ed6de5bf7680a20161c46f356cd46ec6ace0e307005ee094ef35939c959e05e7502ed346a00d948eb664b84ea0fd76602d2c4df7c0c0e85432409a2e4ff07d3efac79862deae4ae6633d0f8980bedf9e1d6d4f3f185b9bec6e75b0a20ac2292149b94301ff592d1152560019f0896466a9bc403f9a3a599624420d5414ebcbb4642be8297680a4394efa251dbb909bfb856a465519e302c1d58c73c26f1cd072508acb8e4f6c0de5976b654bc022c0bf059154ec50115f6a43a7fe5d5c351cc885a1c8a568492fc6688f56678ff62d926b0cd78a9db13e0437b320f81ae1533d5d9f233600ba074ebb18800db48727f031e718641a090c8c3051827e9e649f29567b897d1d03dbb5b1bda355624c9becb19a793a07af76844b36b903f3eed7d13bc65189837eb28f5a6ff06a5ae00af533206d9a0b10e636db6ea0df0585da3706480490c8821838ff5b65cac4af862f75ab69fb17df951268f7ace8eca935978cab224883c18b96d60c48f77c51cbd60b0d162becee62040fe7e8f281813cd569aee986fa4a2abdcd66322ea8891ed04b10f5ace5e7bdad198ddafd2634dac9fcbd12c25e01de377a1280ad60b6d78717668c492518025b6363f5666e28537bc547ce8f0b61814684452c48ad1b77e60a60f81578d9710730185fcd868486b2977a5b38bab058db322207ff6c23a064ce0472356f9fb72e5d0769ce2d49b3690636f2adb9e9937e03fbeef0207049a13003c28153d0762e5eb25e380af784f8966daf63e9870d52d2787c02fac858b4c47d6105379ae144801d963e187d1cddfca6730e8bdc4a816e28752552286f7d182c57429cfdc376ef3d673a9e8e43080a275dba9512541f6c2c8bdb9bc08e030479e366609660917d9dc516f60c1694faba7be3b49eed38f89322139d6bbf14204b46ed3c8c0477000be3d3e3a8529c1983019e5b87b7362baee849a4e7bc9e5798c2979f3909288113db26d78ad91258c30585b7fd390efa1a9ae0ca5af938e648e1a06021a961ea51a796e5c29a0eda16a72c8b298aad7af5badfb3dba5fd94f5da8ee00ea751e8675a6180e552e03d9f01cd087876a7bcaa3266fc40f652ff305dc5cb87b22b7f6f32c7d0a69ed5d56baf6924935c72733ec42e7a5342072a5e0c7977645060151b4ebf484ef608807c17baae0cce493f20bd65f20f3d00cd5857f5584a05863760897937d0b04f8ea5d85cf263fe26341e0d0896fcd69d58dbb6ff00514d4cb0ad7cdeaa005bde134efe0862e7ae15dfab73e63d81905206e6363ba1a3475e15bc721bc90e92568481d88b641266488435d6d3dde216eed4fdf199359e04c5ae0dbdf5c3a50de72f2f452cba382b003b584abaab53659757b51f6ccebe345a9ee57ac148f806c0f7a4b386e32a765651a45d14b7405708a8d8c7114db2b1e13cca7e9ed21d465256c6c1a6d0143bbdb3600287fac95b9d13b4cc504ab3e4e5d97d5fd028ae8a92557592f2012afe7990db1b9ee1bca96ede4d3c4bbdec8c979ce08569112729833c93d108d91b7e0212ff9f2e484f03d297edf234fbb4f1833a5628b9a1add0ce938bf5b50b1399b8341c17ef00520c6a10bcdb878826bac303a286e00be168961dcc83115f5d1eff3521c85569ea590cb4da5eff5c2ccff80546487f15e8d6dedf2a81c60aa8e103466dc75bf52c691f731dbbeb9044ffe12da857b36d23007136e7b24f1d3db28db579c0470ca200692ac2a3bbb79abf16aa53d97c3d4b2dcff097bf68563d9dd21be546e641da3c60689db8417fa5fc6aead8d4484fea1c55ab3a2b24b851752fcd4e74ce7473d036ef03a3df503c2947de0983e82648e7c9685b37f8d246ec786157689df0362f91b6887737efb7f4acea4707cae198add6e9e176aae46c956fd416bdf44e8d4ef0c1415bd8e305e8c3b52603186061dac74f078d86f0cefad81b6524dc9e89cde71bcf73ad0db24c805349958a17922452adefce8cdddaa0eb1f553b006e6d8825a41760241c8f45e6805cf5aebb45000187fc99f2c91879aedafd7a8eaeab9db19ae57a65fb9ace508b8253a279d96fdd3dfdcc9ddfa85e0a7fb57112417d9e741625f337ce2a6569362e8f87e159952ccf799783c830d5199443e66c30e0fc95acb1b431a30ae451a56c94e98039899d9f2ea24598cc7b3f6d363a5b6248425be3c213165574a24b8c867a3dc4b43643410a826568a0e1891131b22f42006136368ad666e5d429a28e46473f157e98374559d29223b4a5314c4072e1a8b0080c1c1073a484f09504e8f30264ab5c5c1edc05d8e2f9fbcd4b86be5b6774dbf3bf3c10c51705cde0ccfe45f19c056288801e5768da31fb4d112fb4a0a827164d33526bad5c4a38d966731f36d792f3636c50267a092c5f52150b665896f1941f2d2a6aea15033805ea2465fafdfa94d2450d4acfb45e6c91bc48c2807b50da164cca7d848e8211656ab39d15febff3678c214ae11201b4beb9ae8b5f075b4e17a0b08f1ecef2dc53624743e20eaf33da156f216532f64a4dfda7e2f98be5241c96426e9a4dfc500dce2f202e276d59ed82002528555407d9a8b216d7db0e4c79621cc76579e6cc7ac2e8ddbdf2c1aaf8f263f0002b0410a50cdda8eaee3fe413c1d5ff6c8b55666e6de9947c21b952d650f112abb16af715c9b3525a59415724ac4fd808fdef64de05d91f43a10a36da60d2e847e3694f82686c174a00c84de0207f9ba02d20b1e73dd60fd645372245041c0be35f37a46cc77b83240f882950a6912e1be9de86b355c99d87d880cbeea3426c06ec937927c65f4edf5ed52dc224a3d280714ecb67490569c92db668bb78c7ce42e41e16f28089611362e5ae459d1f105d11947dee239fcc91350de0e42946e0f202308a80445749decebaa4a7c13f634acf318b3b0a74327ef2f7890a40162969c29ed09152804966498ada0e7cc6c2d3c6345647c6f8ec41093c7e30b0022ae3111e80efeae238fd5eb426c3c2cf35f81fcf370fb93155754fe8763d7d32880ce330beefeacc904feb219491e1845e96a950e2523a9e6f5229aa90132d071b8b1e9cba1e29d56fdaca15c0b940731a31176ffcf6f9c3ace50877b5f3e2eead764a2b447442af776799df1092c83f7bf9b561783321e18ff9c82fa043b7067a06a1a7cbeb3a534bf9424a8cd89ebfd375ddab26c0a932800dd0000d53d4ccafc649d8ebcce4a54fad78fbed1f4616ca5b16100def77b8107b14ab05fcfac65f23d81abd3e9a2ce180e3c10bf60352d6b1b460857c52c3210baee9715b94b39ecd3c97e95f5e3dd2d7babb1e6c4eec7fed7c6fa55d5c8b5d615314ef9e36c6c34427e5a7e8fafbc99343030489ba20af84c7c3fae2cff247a234afa1f9592ded8203578b1f80eff5c3a07be6d3c0a94131fb4c10571c8379d0d422eb743a993848abd36accd3ed0629e262279b3950f20061cf3d99d8afb7c0918cf1a045cbb793b1608205c52ab32cb6a89361319f3bbd6b1fb330595552ae19954b7fca5433bc9e413ef398e41ac00e08c220f8b58eea709e4b90f8829b4287a2c770dedff1278a6ec97d1900e3c3e84e35db91841e11c3693f44e867f51c2188968a1a79d24aa8e41ea4ec0b9e6c9080922e1b75d8d3f00dd21cb468cc23204180659cfe07812fa7b171800367e00fae60590120ffba117dbaff94556f5f7dbdf5fd126e3cb1fef00c8893c4f60138f6863fc4278f089e247add297f86dcf4aa5fb0156196639901e183074eda75efe1c40b5a87f289f2e6a21c6213a8083369a1f835b74d6c8741eff024e7f1852c0ed554881327236c7b04e18d495a8e99cb22289207518d8d36e1b0f98522f4b376f0b30cdb1bb326f77ebd949bf354d052a1e52dabb3d0846d2f12ec85e44b32afdc50b8ef43e4661ee4f8189009517b98033f8fba3e58155fa77605fef0a0a04d5ae9224236d0c5228c695a48a67eb09d0c5a998bd281da0115c50d438f19331b42e51210506418e64064d11d10700c5bf87aed1e270e2b65052e98ddb6caa101c20b1a9f57c880435a6cf0a3ffea5c83694f2bdf6caf32e183a2b344ed92d9a54fbbc2d605a78edbc3bfa02b57da010fd9725b69f3863d0a28fa9f17ae66acfe5240d072e48bef1426f375c6d6875d0ce3c044eec0daf61dcab54aa04cd44f97fba40d4d88f30ccd08f26d24db57050c640687a9a199ccb1c2fe058325a4b9b43b3860c6abb49a6f85d4f6751f25fde8eef2241c31844c4bc36a2fa1f3e5867929f37684c1d14abf247ff53b1edc8507c0ff76464b68db3c12c3b5889fcfec2a47d0a35185a9615f8c8be63c95a7aff06f8f3318e5a2141746d8d41363251c386f09f4daa7a391f2e4c1a82583f4cbc73e9d5de5271786e73b2e277bb63d4a27633c902c7810eca6c2db134463b2ef38b21749c708e2d949157d97a645b792db50f23e0969064bba67dcb2ceb7d5aae4dbd60aa3097d979d361341146a7d343b42e51dbbebaa4eadbc21ce0f2815097cb0508c9e3ed6d8fb692d466bfc1edf1b2758e11f00acb397041d9f910aa401c476738145d8e2da15821c87acc3d95589fd293beca5bb9fcd1eea4cbec0db7de335e5fb5249b89a1688d9c40dd884bda315a1e55bfcc5bfb9370a17476765596d25dda2f889b8bc66868d209fc8638e415f0cada750ea232c6a793aa64e38c0d49a7412fe9948f31f867a0e98c026ba719eecd328b73c1f954f0b63085971cc1823be1ef9148c41c38777fa21b1ed374064aac6778a8a9e3dab4755928af5025237ff98b89661366bd702e2f70be7d67a4608828d86154271f9349b02751e0030a4711abdb4799d80bc9b34527baa6a58de8a1bff5e7fcbb71c505560c6e70bcf5c58642045794b7e85fccf924caf469f2e83dbd4dce90588ead3606c12afd46c1b6587ac8aecef66136370eaac6fbf9142d344448c9fa7f29a44320d8f3655847c06feef6d65a2a26bdc25cb2081eb7f98bb3f9feab89c6bee2c457c315e5d4b0c80c5e94b94ce295a31990d6a18b9b4fa550c82f1490a437ce3c90f3ddaca51e892411f7a4eb3648cd332b2f81a68b7a60a87879997d748887d5dd3a6a6578a98e8bc3eeb78b9e40544a4dfbbe2903ec7bc879f51b00e33e5b59defa5adc3aa39e668aadfc08b42daa5209dab4b9dba5d98c6a3f12e00a3c5b455d1506e110050a15f135e06790fb49cc5259a9eb616e600c4d27a279d6ec272f4b73b5a4f8165c2350523a1e0aa69ffff57e54147216c7ee780a0072513c430a29a1ec5ca7cf4ebb8e4595162380a0f77861316828ca47374cd61e3393b36e40f7c9e5111ac710ccf0bd6b0815061820adee301768752f0a759cb219343416fabc042357fd143dda81774a865dba41904349eda712121c5ded7ef5fcd131952c3d016775cb5b61593625aba23d041568d31cc7d4132f8fd644770a4a5fc9deb28d073f225a8ee7534701ba3d240c7a6605cbfd8155b27fc6799a4e1239e29cf110db55ce5e20b38c33b3adb49987dac8a5b877f7d067cbf721d7073879347270a528733971e87ef318d3386de7a77a87a212648f2fd6778de2988508bd9f4f2d99ef9a3f461229aa1d3aeb46581ec0f2ffe2ceb08878dd9c599a5b25fd13a57e698c332135f3707b5b9d64a0da08eae159bc9d605b683f6802bcfef7fab771cad584cae63fdbf9521db0e066432d8e7f17685e5f6fe92abe10fdde2151d0d2321c2a8148d10ff4138f63fb9b1c862c5f2afa6221472d14db06f9770028c9007c426e18658c24f6f4cbd06fbd1a5182c920c6cc4a2a2631fa4ddabd21e786ccb3215e87f24dc2c3159c693afca6416cb3168fb200029b728a23549635c8a8943b69ea89a113f57a448ac548c1dfbc747c8b75d888451a660a47e1c9278fbc5dbab6e843918d788c66ec634af895925d9522e9a060463197d5d80613841827bcc22d714c8643ddd12991da40d766314511d420743b59187815e1b06e63caacb6f673a944b781ae9d95cce0a684611d70e86428c421fa6134e00efab882b4e6e468b2018f6d59be986a198225ad01d20ae21a42d6006f5cd7ae06f67edd443201c274e99e0099bbc47c022ba01c6d8969872a5183c58397558e008ada6ee4ea3e4b80d9285eb390111fbd2a773d5e487d08a0748b5848240edae13de2db1dd3f0a7d01d8a962217a92003db2046e706ad27962f9f8fbc141aef1caaad7de40778b8b757bca3c4d340befdd50aed43b7ac2e1613bb337982884b47f75ba9ea8fdcb1968f939b2ab90f8ddedbbe17d3f345dca2921695425eba9d61b48702f17395e32d24263299ea9a35de8c49fd6796ce5342f1a2d26300d90dc789e3679f4109e7d0fa9963be5cb048786ff5559c5596e040290f1eb6ad1f4df3f93a01dbcf4855514919c2cfb174cc4f03a1aa3dc2a1dede485b16ac3a9749b9420761dd2d70ceaf04f92daff4be6f03834cc0eff37b38177a171804000d5573e2b4ce5998fb296070879f9f4571e61c2ed78598559c5b217c3c7866ce52e5998655c679f43ecfbcd055ac48a81af2ba7d151d295eeb933caa58c9f508c9f86ed675ba20b5cc9e7352208f939a103ca2f164e658dd01fcca7524e5e963ec9ae2517be1f69ba3ccbe8df1f65e565197ff9552f1428b0ee1445f01177f28af03ca6f3434c120f04154990a0f91f1090e9a323f0bae498b91dca3f14eeca78f210d96303343ef4235037418a9f7fdd72cccfe850a6e4c47ca23e4eeb9b6cee1f83647781cce9277b4f41dc6b7793e2b27c4c8c186688da8d4ee1f81f44245a10577440406ed496edfb96ca23c636f75489334a81ea58c438270d60dc8b61b5fa2f0dc756fe9593e623bfcb8ccd5516c906f9672c51cd31cc452606ac662ac1fe2d65c18798f40895d1016b98bad17745099d8645c16016153c11673d1cc2d05d083b08061e66a5a25ca6c07bf782200aa82f36d6e282f4d6bb036938e819df0247060f27a08e80b0fb048c7aea39ef25874af96b7cca606731d2315ef4ffae78280016124b092bf0e00c6d94c98ffc9a9ee11b02bfa403c2a9896375a501464eefe342d519541cb33d807b0ac8036d5f6ccf85f09cd8f79ade7570b7bce9641edd35654c38c3cec3b67022c40152d6d00e8d340025f95bd64b0132ab2925c7929cc692b5fec458a2fdc3817b24876958cfcac8cd4d3afcf79de99652ae9719763e3c4ca6947711581a25062f8bab47dfc0b20c171db507f67df9a22f28ac5ef24552535891fe7fbea4ef15242b2c4ef31df3494dcd720c088bd2cca466198a44f03c2f4dcd9a782b3434cb044e5aaa0f7512ef3dd32d9537e098b55dd33c18de4f24f73f7af927bba3c7915e1fc93a38a5b9f9e993c1c9a17b257b86bf3077a547bdc40fc9474384b0b50d912523add5ecb54ab1fc1e48b7154a381f5203b700616d3a34796103d0c49eaa2864ec9e4b7203bb0a3a100bba733d18e1155619b09619ce756db14e6384d23c2b4764a401285b2cf1bfb32888a1077d0de9f047a9cad26f6fdda22c65b947c521f247367586ba46ce3a5c1ca6091c677e56a5e0b9af919179a6cf9366722dc779ad4458d5adf40f6f0671a3f78d54a2631a6abaa489f9603a82f4b31bf70738f1e64bace59ceae66640f46b6e3f25dc051177594cddb84063883d6c6e3ab2aa3e2f5bddb894a16b25c95970a630e6f2fe42b5c1f11901273876310693ca6e19ed77602a3842f1b2069c01bcb13b16ed80d0342bf3de0b05662dcd10da1f5092a38c5894639a0db6a0e62058b00c53abd56811f7cecf3927fbaac1804853a478ee0d1b52121110e52ab8f2ba79771c864de8a3526f5430ba4ee8decdb81d60bdea0181b56d91a6ffbbb4bf0442f1926b3e8e1e15e71005e8f1a20e27e35ea76cc162497604dfd9d0ed3b542ba8ead33dcd7b830e3ce1b12fd1f0353f1f45eea6d62a423502b9b364ffa6b92dc05bfd3ab1e0deaa79a2e42ecffc9d57647f1f3e01ff4a3a7499f8d863ec7a0593a0ea4d94efdfc5fbc38c996df201f174f0b32ff6e8af22446eb9c2002d4a7b30ac8c6c5d77052bba7ca078af639a39f8a470870e57bacdf51018363cff4233633e5490930d98ae9471750e915d0a456e7f60a3f6c646933333c5eec11aa345457c8517bbd13acadd4bc2773c03ec7652e80425c68e8ab97a357ee35312ed0474bdb5a1539cb22d8e10a87c70eefd8b9f26994e8b3a14fadf39450459e4ad2136e58c5bdd44a861db1d8892c10e1523774f8321dca50264f6fb5fc4578418546975e68332dc42d884e5965be52bc45272020dde40fa65a0f67add422dd70d25d3ed54a14c5618b7ad30beaeaf6d54b9cc6631ba176a3e7ae4c6d4f70a8e92f2b40493da63b7c37a98861d90f29a462a30f5e2c4a7ab9699b0d104b1aa8279e87831e51ee3bfafc1d3358cb9ea7e3694269954ec3e8705d42703d664722059c47c1bf837894ed15e247e23dd745e3d8397cb728204482bdb5c614de4692adef7110af2958dde7144e0d5fa696fed12354895d931765794e2e4c16eb89b5b2265444bd152914f62cea7c9330dcb37f9a0e32aa0a9ff651562924fee39bc24eef1e5189f7bf3efb3fa6ff27c0009890f2db33c298a22c0cf419e576a058afefc0a8fb3f9078cf344c58f8b063a683f833d2d2fbb057f0982b88a87d2b3155cc32223d1893dda8a207f46777e33bae1f58b6973325fb613fe57e8001bff08f219cdb20a9314de5bbea6225b1e781aaf796cef47c3e826c414ca71f0f85da08b7fdce7fcd7613823103f6a17f4a38a87e144163fd8aa5bfb6230ee684210bd70f3867ee4154505b74f00c62aba397d81e42bb492dbbe697de556dd1d33df7de63ad51e02ef888121854a850f93d9a222629591e19ffe309bdb1b9b9fd3eb25dc1df0e8491c19cd6ff40f2b2da332896c368eaaf581c83e8bffbe8416c86c6a6c34de30966865e927895d4b46b931f826cc11b94828737435dafa4f9558dd97b6fb0dbdeb7b71397c106de0b04edc022cf3dafde623e9f5481a6b7502697268fd49fbaa4fdce873991b553d36616614ad0a0ed37805522e4af6a952c397cb54294f4480fd3a06655c15d88f1f8c2612bc696f874a128f4ff25468d726ece0a80468e08a2bb16f9ec681365690b7461db8ffb4445adddfe973b19bad28fef28d812069e3c9a07c36698ac665c9a4f77c57fb7670f9279a8b6fb030739b53fadd4622d9323fe0254f06bb74c23982b0e2525db8b8d0a370cbb062570a2aa64c15210ba0bf5a19052dcb86ec6cd2936e927a013a45fb6914a3318c59041ef1d5ac6aa08b39c0d5bfb5cbc28ac0e7da844b0ccf03db957900f1952c60ccb413f53d801c15bec5d7678fc9f496bbf36cd20cd8068dba111307d93428b1ce410b3e2cdfdf5493d43a0b3a6881b0ee411a0b16e3a4e65350cdbbec972903ef25d18c8470b3b594044766593d887b211aebff1cfe9e2f022a56ec4fd6573a04938c9cc554569f3e8e8d391a8defc44bb3098a63dcc9595f43d73da9e0f41554fc9d7ddc23f1ca6bdfc60cd411ba7d8bc2c4ad05beb66e6eac530df71d59287b7ab247e52d74d27a61ce98a4aed40ade9eaafdc282a8e967e24043f299b5ef2705b5ca5c1b34707c75976d2b0a18b785b3388f8b6ca340a7d3d8a5f7ca1e40e7a370d48066eb8a0a36ec4fd854aabe6bdc8f7431bf22cf31fdc79192a4003ef0bf40c2c3f4bea46609293d7b0e3eb8065a5d3cef62c4dcf053f12c1a857e65bd9458605bbaf99a93b9d987accd003841a32cb60351735979967cfade3c2a8a69aea7e9a0788b2e779272ce4e359d2e5359086f79aa56417b722f375b3477af4d2fa2df811a15ca84e2a2bb0445a452e70df980a8746d658a442415ade9985ee34159d30fbe95817cd58b9b27c87a077b011e5e8b68602533556d20e4d9d057a46a697d79882911c99949fb1d659f521dc3263bcf4453dab3ff94c7d8b12bd81d17e22a144ddfa6b250d6efd11fc906b511fb5541083bff7c71929575ecd4d830a8eebf03a136ece40351c6b89c2ad14dd6413031c7ec8c5407604f4c3821b032b280914ee9be88a57ca953ba77e3c83884e912425ad2d8a15a73b8307a72e696634bfc6b74c8da6498bc9153e8aa15383694d045f325b0765c1ab48ee88558366e18d46010a3bfd5d7595f9944e2e0f39b2e02a2190069f3396bc04d66ea8ee1aa719047a175048150cc4ed6b8745d147f1b6dd266e896c5ea1e93b357087837864f3e88fdc98d4ece64b14a19736483e664f945cb0e38eaf0cb50af122620833064ff7fb307b6f06a494eb6056b4ab3ab84dd8698672deb25c390b0171d19ee6623e4f47b0a9e64b8e36fb3b1abc2210fdba6f3c94138f66720a85be5e025eeacfcb80d75eaa9918bbebd914f998b9c3ef581b465445cec8541b96ec4d9299156730a0bca221fb38421ad31a90bdee4b4a215fe8171f531900830a7209a245b3a6b8d02854410b06289263718fc6d08a492ee5b6a506985ed8138b7e00000c6f4b7ded35e6fcea4f614b8916161a588355a063061c242c0a5cac779cf927a3f88ded44efd55f142eb8be316649e3b7fdb029a23d638abb0f68358877423c6caed110e57a76a051c287f51b87000acad0344270991de63991ab3ade4738ecdf6bbf48eac914086397b7032f61f483d83f535ec19a4e4a5eb3bf6dcd1efc4ac50de291e9a8d2d3f99f6b812b855ef641ad9ac86a9ac6336929de869c9ca0b6e2bbccd1204dbcdbc8dfa470f4742d783a92513f4a0cfd22731ef3b0afd14fbf05b5329be949ee4e3fd5d76c59b5804127cc1ef2c7ddeba106b33858f2f62305dc5b75951c395f3bf0f1cd4d54251db70a39fc6b631065f70d83454f6b5517ea49055b491cb0ca561b16d0ad241057f02007426e8148d9d4669cc47f38e1948816e8457152d3b59a74b315772f5a11ae842ecd978b150c20f336f6226bf0367513ac98201ba2465b9e4745740f3e46a920a75cc052b69d0d41a42c46695c76210d748f57e889dd77c0706ccb7d629a946a12c7c21d560b273618333411114ac4e933bae43c063e86672463710b8b57b155f96b2a8fe0b7614e0f6cc8bc9d76a268328a94b5afdfd134d42c35e6e35c506cf7fecd518e311063c929cee93f701844925b80503fd58513058e7308ba981b98fe5e23ded26918d81137923b5dda76430e5eb6e7cbf53161a160770f28601873fc0c73dd7b843142ca56ea388d8673a8ce160f4908c60ef0b49d2489f225c84f3c208c0a8e719e201801c19205156fbcf6926a8d60cf69d1bd28f65f80893a0535b4023c25d713ce9be17e4c839505320c18c2835237fdb6cc5e124c766e659a17637c6dad1bac49ad6919c8b7a1318c687513f876386da7e77a99c001be4499642d9922ebd3a302cbaee4cf7f5a9bd322e5c5ac58ab0fd250d4ce4987bb213ab5c3e75f07fe0d540b6ebaa8b0f92bc6d84770def2ce2c1c905e4e545118fd15383b8c7ace311869db2e6d3ea488509ac157328547c8cd2e50c88fccc0340c00948899be0306ee576999e31c0607ce173cea4853fb765f444a0d753e47f63d7ea6be648c1bfcc60308abe7d862c68a1a90a87bec1b8b15ebe16128d346b6dfb03a1a7ba90477a3d81a3bf434a4790a5137e1c7ed64304d75e026467be2423121e955a87dfe82fedce59aa263baa83a1da5f83c2dcb51292e5fad1cf24a93472c58160964f139e3242db3f75ffe4eda4825c1bde6ebd7aa2b503bbaad18072ef1aee2932cb7c7d854b2f4499ecac1a921e40c8ffb8e6fff2450d2e3430eb9018f8c69f2dc707513cf522d5734d2acb91f150a9ea542e5daed3449809f8e76723154e3d0c76ee4a656d07df3bb452bfd872a270db53e5439706fb6ff2dd88c435bb113ca57f2ffe70d9fdcfdc41340ad89803bbaec959dfe9a32d8138f176793b6040cd4c54aea0a34525f18efc6523faa6b3ec7e4b39eb491441f6ca53e69613d3418002d92f9ece907b50f1a8e3fe1c77368d05887293770bc692b02640d9e6f36d47c00217f4d199fadf75066f2fac4bd3a836de016d9b669cbb31c41d05a5c8a00b9d69dd8d1c94ac1092b891b7aaaf62c2e7d22766841a3bebdf390fa669791f24559dedff72c32fcc9c97bb9b8b13445a2d4f76c6971daa55c2284c41851629b88fb113f138a6a5ff521b34a845eed5b2904e8f5ee2a2fffa07007ad637fa7519ca5a315b536c909aced28a720d6f2ad62ea4c7b48399d27a32a20bce288e8ea3228ce97967043e7e1e06295159ab85d7d805e01e86f312834bbdffa02a5ff2601a7b2459ea9f030eff49df6d3962580917863f2c89e32c66d68b940c424f894113aeebb6d3e857c71540ae5c9a0dd96c491c43295946ad467902f196103d54a33523529cbabb8b82c04a875546749a7a975320d0c201ee704dcb30e91890573fe6348a0d0f37f79badebef3cd1306fc4dbb7db1744aa045eceb66fa66bb2e171efacb4e1f0758fc77b6aadc819b1a7d94d389600384b3eb4946870b5f9680c28e6734d8111ab4dcab7e56511d375aec6001fa7dcea48c3236dbbb80836ab9b6b5b75f4ec4eebe3d2e8d64c5ead9e6c0e6d98c89f911de90ff118bb6e2039f0dbb55bc820fbf9b436071ae80ae64edf5d8cb85fdb7b7a0e21f02d24df941da8c5010b5a27db34681e704391d3b4d771d7ccb471a303a258955cf4cca0146459c903d21854a91373d06101419ee3b52976496710448db0ed5f4b557f670ed2cf5a763b790e18ee88a8e2aa86e03a07d564a394ca4d8c98bcb2f2c48b9903d9344c4432a9dca485a15277155bd38a0aa3dd34f3b5ec24580b8cea5c45b2469ab8ba6cfefe3e7e639082aec95ca0ecd616ab9774b83a099c0632b4fdc2a23210486dd1b6889c4825e3285e0672f88f93a3481ed4e0545b85fc4ca31a2c584a2b4b0fc27dafdc337ef604c5dccebf69acfd0763c6d1b26c665c0616dee4dee5d2d7b80cd332cf84586382824072d7c3a9a71cf02f3406b7f11cc2004822701108c4636aebf80d2f07e55b38331b4e496fc05eb00ae9370d33720da213a1dde48dc65c94eab29da2268a1eee83c5d6801fbf24152fec6033c4fc55bd14b56223d5c48da0e78559c6f6bb31bd2fed400bfd6da3311e96839a62a3527a9e1f616124751451bf8e77561693f0da1f0bd30dc005aadeec77d4070778f469ea4ba277d38c871a2b8312f4100bdc2dd7831bff46ad639741fb1eeb69bd2130c3a20afc0ea4867f04c80d112909834799749b25333a238a434fe1b9a947110d260bcbd01e80b69dfd408101180aa984e0a5f99f2f6e240e3e8584ab53766170d13100b7c95960d0cd37ba3c85cf48055414c57ff8f94df64caa0d624d36eac6d059f11ef76cff51755531ae9dc235fe0b3a55e3a852e73481159dfb1471ef6ea06f97cdbf859045ff4dd7a89c2014b4d4925b96179739f0724fcb445bc3296afdb13024f9eb54be0712671d94acbddd88a4d27850b90c1ac76a4c255a2aa611ca2d16c58a383f73f86c62b61ef2be35864f9bcaf1a08b9b89a7605b93e6edd011875e7ca6587ef6cd2305199a5c4030c6341e559ff7d4cc87a87085e69dc70c230ca46327e718189dcdee089f7f72581b61e314c3b376c3072d8e75de464420a86f7d64d8245916e3d71fa7b1021f1bb1815baf4f4ceb1eb87a8dc136f17a8130228f559f4637a94295e9d951f1e3ac48c1a9cdd9c26bd407b6ca7efb78206285b7b76eaf6518d2decee7d6895b3d28e6e2873a896b0bdb5b18aa822e68aa9d91f1f5a70c489d5e3b7dd6815adb6482a3e8861cfc9610c1569f967607e0b4685861e6cab162d4ccc78072c72fc86e6325a66168442461eb5dabe01979f07bfaf80db00b0109274506f0476588f7c150d3c6a377c2aff2e08a7b316efc89ddde2b8bbdf26ed0876f478fe224aaf9ff74e094834deb59bcd3bea1e64c7bffd439d85ba11a930c5d53843701821a772254eca30a85cd43052341e72d19c7ce1a6fb91ca23fd3001ab526c1b9c0ed518857d18bbc1e2caa0b0b3a35e6a7853ef283f2ae9a2572d1ceca57b3169313aab34cd6a8d920c2625458cac4d57df04e48bfc16f8b974e178909535e26b965ae2ca251c881a995c6fb6206cee30a49dfb6e91ef822780527430c5ade57c0572e37f43d6a86d6a62211061c1b27cfd824320963cea0bfdc0e6123ef780afe27f4c0b5a3472cae09a9d1bfd5855ca6c6b0e214f2a2dd0104b027b518356adfb12dbfda7772f26ce6f9c98f0e9d8ef19fa4ff34677a3d233c41c0fa424bfa7e34261c39156d7b7328100db7fd1f3242db62172e3371b2735ca7d4e67d2f3b98e04a0fd74b9fc3f555e3ccbd3d024bb482758fd9acf44c8d88bf73105031e162bdb9ef7c2f9c08ae7f771c32bd945a0550e17c00f8c66835e9d7970f9850eafd31107efc955143254bcc9a67ba36013176080185504228c705d0a4e6c7c8f2c1792c79163206efa5deab2ab97b2986c4d8248e0b1368ef585981b11045edb837d014d0110c64d9eb5d79cde7192ad70d86c1460063f80abbd69c944ec1ac1758e2bd239bc49429300054f4bb0368d0cb30213b36d14c4386892fe4d10f19d30e075074f12a507714a853bbadf4f633ee90dfe85fd7939185afc14ce7621cc87e178ac6b9622e61fc09d29554bb5186f23447d8a35e9d36f64b2a0390381677a4dabc577b6dfcd942772eec29d51e1ff351e4cb792a234694da0a8fa4804d0892f4ef24cfadcb93c767484cb52b912a7d4eb8417e19406fa99414cdb410836a53841fe26ef0fc68933af2a73170c7fed35108f01157df71dd1156ccaf6f7540613e8af39196dda838705d60f1ed1a1bd8ad7178cdfe6e9ddbafc2e61650aaec18fcec6193ef860ba31bc6af99761f5dcde3972e45ac3efb17952a1d7be1792b06dc11928f60b54d856538f41ddb6d57e24f53c19983b8518c97e321720cbacda5702f6cb194e83d0a5a3d2342d262767bb78535b96134196546d064c927bb91b50e7e708f01948ba39158744333d441b68cbcb14416788596ce5a2307638d3b4ee925298dfac9d96475727a8e26a7b950ca53242e88bef7dc34be4461c703953cc3c2fece071e8d8bd5a74ede4b271735394725c28f45a3671dfc136fbbd19b37e834663a272b8421fbfc15fbcef3d18a2cc8bb4e9d9e8cad0f9cc75450148377a698bb949a43fa5067270e6c3f55a5f79da08b0c4a9d0fe4445f82b37497837ead2dece261244d4535e765c6f9ba336fdecbd48c75966d0ebd207289dd62fbd4f0e531fa24bfc4791d8ed5174367a2e16a43840c6aad41e3b93e09691f9923283d1115a2b451efe8a527e8f89b1401dde5161eb0a87f676894ba5145f7bc8b2a2a08e69b940d3b9ddafa9659ff272874f1562a2619bd04f93fde11c9648779c592dea291be88ae8da90c6cba989d911d0ab05250118e56e56395f634c2e4d45bd78d936dbd70100252e56966554caa6e51021d605bd76edffd8f61fcd03606f2318f9a408d03a2605117e2591a326f317dff9872b30104391a0a4ad3f54cfa769f4974168cba0f82ba17041a8135633708a68b665e357e0ad0cd7b1caf45e84ab0f1736336d08a7808109210fc5ad9814c1796bd82db351a3e704b5f123fe9f8f9d30d5685d16f01ea9ad21ca79c214d0bccc97cd9556e2e8d94295bee1131524afcd01346b482f17e3be3be5a9d02c7d4dd9b9fbfd6edd86f65da6905c3f45425b8582ae89049297d46363b7f0a544f80f14905fb306bc7fee6ac69ae40e1b24d9811f9661cec821e7df5ef5110f88d312ac5339a50a1c4e35251d94e0befb8967fa2b906744b832845ece13c1f8e630e1c281789b60ef09e9c5fcdef4e543f042d3c058b5a066772b240b5d1506d45adb3e8293d7b247ef76b1372fcb1ae35a16e24884204d62882f78d7bff054301027a5c6bf0cede50987f0b8e7b1fd76fcf72a8055e76bc52bc814310eb2c9f999e1aedb3766178cb05e81ca38dec64576cc80228e00f1422688ae1e7f56c4f6718692f1d7309f99cb2215b997012bed94b2f08d6a9f4b47e77452d50f50557b6e63d4f524439d35f7a054332857595f77b1ef290b42d4c31c1d2d039c69592b8c671bf57275e5bd72fdb56129954bd5fffedbd64402d9cf0e23060656f70b0d0a31e8ffaed2aa6c2a1482662c8f46b11d682a1835811d0095f85b0f3d30bac7b6784c122056d0058ef4406852339d8141a44eb7a01e4b50240b0b16812758d7e2ebf621afd8508bf8f427f4deb467574e1e9faea1cfb38ad45f19932eea0d97cfe312ba4295a37efdd62152ac47677754d0fd71ca9f355274246f366a1e88cbca7970d74e65d9b7ab5c1aa2ee4e950486a4f71ef0f992546bd326236bd1ef11a692f364788936bbd5a039b8e11df8b082a80737d102d88a92b79a8a151c155a0ca04d2baecdc0102699bb10e6b6d978714ad7d07e092e3a5768598071c76e04e187e285c6fc08caf8563864e91b4cfc884e532966049efb50323ebc8984d8a1170f37ff312af579f545ead37cc8eef25a52796100ada781da94c7b4d5a0a8bfdc1d6f7d0abebf4af09c70a1f9e22c4953a05fcfde3b16e7394e2a0ceca462ced744272ebf47d16d6063e87f730a673312fe1f10412eeb2a74f33410c6302bb4c1b86c2ff362fec2ba113538167cef340bf120a35ca65f74bb98ccc92f6e60efaaadd78fd5ac41432769266e7d7591269e4da2aec889a4a51cfb69ed5f66dab4d38ce39d8b380f7d09d17aaf2d36f0b264225e733581848528bd415474cf066a03503ce3e72bdacd10bb94a5ca304b455c1f0317c3fdb9ef75d7857cc4797b1b37cb05a32d05b4a75bf579ff595025390933fba4df0c9c4e6f3e9aaa423a7233167d7d7037cdab0f6a872c4cca02e35669bb252485dc0fc066d5d13b038ea9a4eab91cc5cd1db21615d00ff7f742a6b8a0df1712a3a74eeb38da4dea4a9104f95f3fe8291e355ac9f4355d4426fa57ac340ec7860043d027ce62a152d54d94e5ed143590344f664f1c0dbdc7b9ad532c277d76fabd94ff85b7f5feecfc3ff9fbcc84c294b073903ed3d098c2cdff1b0f2ee17f474af20bbca5084ddfe2301f0b7152df30e6ed3d7f2bd1c49bb320050c40f7c4edf9666fa385b458bf0a6a55b34d45f03fef9f72c2dfba39890428084c51a675c2507dbd760ac82d69119bda9fb7a35d321ee3bf12c589ec01ed324e05f8fb22f0271660972e363313a355f469b380e495de7dd510fc099ad40ebb169dc1a2112be88a0693cf86dbf47e9b81d2444dd845ebcd236e35e9833c08ea364c4c96456e44108264cba85fed342afc882eec2a273e9b83c65c97a8bba1f51ee2f4aef6f07a96c79933ca373ad08592b8f3f8fae7dc427b363bd8974e287cfc41c8aa62f666bb993d92da350fc1a0284524364fec375f98b9a757959ec0934a34bcedac2181d2ce390f79635b6fe0d3a2f65e471f65e1a99a702a5572b3ed3bb71cccea078c5aa020ca489d505e833c853dd155989f9dbd5619f621c579412d7641ebee51c2c548886a8a9ad18a9b4d4eb102e780effe4f8c28ee094a08a60fe4b35be16eb9c17dddfa30c24e98124429bdc06a4ed71919ffecdec856cba0ab2130739d9ae3267be008f4189a38a1d5370496e39c27d8ba01e975b55e9cc7518654c1867193d074a24b9416df456504780acafaf9a033ead10aa18bbc673d4a562199d32c08f0932fec0c81b941d8dbca840abe1babc68698ca2456953b45abbf823aa18a85a35e66eb7307c9cd4f29c29c4ca55f7f9588a885b963415adb22d0f033fb980398171b15afd2c52a8aab933c2805e32837eef01dba94012a18901e9ab0bdcca10eec7da348bd220fdafd8f35ff27f4a41deb57d04cf8b7fc12b4492f401b96724808ac44f263c40bdd650e945862a2ee90f556bfdfc540c4d43e49581460b48ec146ee9676156feda2a23390a03ec5afc990409e48bde24d00e1167e04f8a2c204211599d378c41cf0dcab8364ea75885520ab190cff3b324c7deaf16b367c17862338a1a4955f87da0a1b5da4ec1cb545d060458dd60fce281012f13e719dbc4dac4ca7f052881123ad6d4136d22e2a4225d85bb8333e9d1d124eb6b15870f57f63664961bb2ec86cc7967940f8c92d04191f2f9ea3ec4f963038bb4c36245e089815874517aa53cb20c050d6cbe57380a65d74b3ed83778602f3e53190c7b21819cb1f2168aaf869a5c57a997d9d7cb2b4df98b2cdba73d1d7742bcecb5beb234b00b6a79415ac596378e61a5953c801c87f467669b355b31bd347aadd7f4f1984ddf9d1de95bab69f2393dc4526db9d8feb911a9dfa805b462cdd825a8eb15864bed323e516fa2581880094463fca5e5f43467cbf4102874c0f228bcd3009dd05c77860c34767e7b038b35034bd705967ea781efa816e9aa97c7e93b4bc933ae9d418ceae0cf2cf42e9ca82b4a8b87045d11dd2c244d9eac00ad4897b9b83cbffaf46f91ee00092e0e6cc7cb533ff384374e05609e9192176f7665f938007fefa9750ecc4ec186d6fbb355a974dda7d9d97d1e9d7ae666b5020951f2d56f9885b9cdffb2f1b59d39743aca9ca6cf1988369e5aa6a0f065b1b7b9a1a81e4f0b77c88a87d709f94af9f15ee23b1c25a28cfc944f4b3dbab1f336883d86380bceef246126f0228e6ea8aa1be83992b91d59e2188a3c0ff1ea6a68b0b12480bd52720e6f2e681cae1ad9b98fcd03eb5d2eeac5888d50a71aee9f0387e09b1467ac24b69ff0364f3ee7e531d0f846cf37a4e36d98e1a7b608feaadce873cb6ef24852cb88043934c3bcf28c6488edee100de2c38af1f8b795f207a57fc5be0f8f81bb0326b8c3f738bed181126f103f20dc8c0f4a7a796fe89858e1da184e7676a2a38f639eddfb9b628e8cca1eb313b10946cd78b4c102aeef53e503119cd142093924846a51e32adf82e51019d4b27598c28b9fad71e743d7d2356dc984a544a7e32a79f4664a7a367933fcc25e818369f672734d7083dc68c3ce667afc8f179fc3876d49948142ce28a279a32a48241ee59ef957c14ddb92d327130f14c315945690c21021db1b571411cd8ae6ae61b042c046020301e89080f673ee0eaf721152d4386ec1de5f08ff8893f0b6bf3a665050703231bbbb9e516f057b56040e1e68e139d38c7c00321b648ee97ea8cd62c2263cef0f4da533140f399631fe3b8b081252414d8a7af9ee09989d1845f4c719c0f031a18f96ec086c1b0383b143e7336a910ca8183b112cca18f2f0e35da8d8382f89ef22a47070cf204c7a981b4288f697d4be99e7e6658652ea6ce4d0f91b2827e0ef18fa6531fb66ed5991218f0fae7fc27967abef1868c4aba354227d4cd408b1fa01921f6650983ea133ebe354c19e694450ae93f9b2ca7297bb4e736d8fc3b50868eaef9bd86ee2ef58ccee62917978b3d4d00dda33a215dfba9328c029b31f5f4e8df522ad3cc211e7e0a988c803ffbc812ea5f0173a2a4f907742e408498191b5a6c767cb377870df4755281d5a3ff99ecac9841baf88b09b45ed6ce5c976e4ef7c7f56c162b9098620b922a20c464d1cbe20d34e637f8624deb2269184e9bcd345b88c40dfa5918a5e4798206cb82739e0b1c4e9cb4106039e3b1017129288eb15a09aa50cc0375c12e31fe941cb6918121a2a1fa188ee45caa997066e256c02c333b3edaaac90b8199ce11c06dc62f18a3a51042957146f2cdeb179c8171f73f41a2694d6e65a79c41a2333e3686486137b1906099395164c3d845c06a30d2d3ea12eff1a6da440f7dd34ff895753bccf3130122cfd22873a4daeeb90732cb568ef8771f321d1c6086049765efe875f10bb7839d43b7dc974a4e3ea6b063d171a9128e4e983633dd20f04e2cd64584654b45e938d7ea7f08e527e2bf0f0a5b462db45d89adb7fc61c553ace880d2ca49fd869164402117ac28dc87c5868bab71fc203b84f8210798e72de57ea7de9585ee7f910f4e9ad053bde203cf43640496f3c73443fe4a8915d2196053ac175500e940f8e8dd487e84b5bd9e107b8ab4ad30ef8d69632cdf039e433032622b0c835fefafa45d4f0c41b2233e474107d20b50485da81339fbd20911d59cc7d9dd4bc2e0b47f3b1b3ad42374c0ad08d40626c076a1ab66491377d3627a17b984ac04d13aeab1bd4e43040060903d391c4fef60a458438d7c2fe63ae70b38fb8840c2329f2fa43aa03e562df0e1629abe281f63cc7c2d8a5ac7b075a3c2f162aeb086d9e54b0c5ef6134a5b4db468dc77fc1103a92570c44e648ed4131cc630c4f03e4b2f9b7511420cb4c00a0689964a070dfde5cf9a82357cd17fd6f574e4a26db6d8d8a78142fd45b5575a21447925d7a6256415202a0ccec04bac5a174a843b202522cbaf25dd125310a691bf6c04f83ae6c306b34e697b8337761eb6eff4347c62e9d035e1aa30be9b033ba311bf85cb1494fb70c6f23fe780f72db9c6c8b4f8c8093c516fb6ccb982db2eef75239e5579868dd55643c2ebe773d84b4c3b53feecd86b8ae70ed562cd9e7b4339fda497f2dd35cc8c30014654864a1f5c7568bb31f1c20ed38c947d63a1b34706d01dca23543b96eecd5038aec014d893afdb0179a73e5d7ce0287213013b71d6a2b2d3d3329482c9903bfb397f17d6b511895c0311840c6a055b445ea38c1154184fc64d8596a1db590d56b5b888fb9ddff83c083977a57560821c66414ec6de11f15a98a0b3d853df49d1c8a56026226e7e1e9bb3c3b716dfb864773c06cbd39c5009d5abaf5509955651b9f246d50f64f422887de398f92aa79f5428d4be9006bca81856210b7781ae9bc5ac9cf2de3a22b4197e57a2fe3619569283b606b446cf0422d314058f148917e9dad43265a326e590a0451a8a35dd9443269d858a0666f34150da644c64d8e4745211d013009fe4f04dfecfd7447e695f12454ef5b7c9f3350ff8ed0761ad73cb4871e2d22e6e749ceedd5321ce6012cb316ebaa05c9dbf9d5234a75315ed5df280c1ca916e121cdc236871361097716fa3b35a660fd5729bedbd139ce34db8ab29c177fc656fcff5af6d21c7c4995cbe4e99c75a567332bd842c339971b63faca21959943f7d2ce2e374286bb8d06a5582151850c71fcb441b50bbd256f34a23fa2283909e6f34559605293d39015f52c82df23ed39f8c37e6c15c94554f3a5e7d4c593e806aea1ebbcdd266584dd9148645c521261dd70a108b051d936a9207bb082cad684bcf30d9f36355c13169c3c38a279e2e257dce65d7f8c60ea11daedbbec5ef894adf4044260f15a2a9e4a725805d866121f171f384e666ac0169d0e0d5afa616e58f48c693263559aabfe6ab7dcd9632b481c40770b702346b6148b74b6324cad32b362398b7dafbdbc8633364186bdc20d0881ad338f73b1644a663a7f3c290a1f93f7e0adfeaa1ffb3efcc3c20006b3a4b31cd1f5c3c01db6d2ad1f418e6e78a400cc1e7b2cca06f8a391b1dd1d9bd35de692a06888d1dfab601c37808991d79a6cc5e87bf936bfc090865ec7afd4dd335e745523f8803abb9623d54a3a666d00d9b0353910b30f8afcb836ff7c5ec5247425984460b62f64caa234755d85970bed17782fc7c089a19a544a880b1eebc14c363ee50a9114844eb83cbc19fa662c39d58ef1bd82f1ac7ec5b29feaa1ccd3fcf197647048c8c9791f38d39c58d454cd7b694fe84eb67c3357336af946ea23b48f154c5512c21b227e63bcfeaaa04ae87e6027a380a5b706a22cf853a51cee12fe72e7ca7ec50de09676fd36926998d16d33f539dc1fb59e43a824411497b2ceecd1aef0615a597ccf57709ed27e7ae885e49a9ae992c9b5aa05165db4b1315bb997b4906519bddf1c8976ecfa6af7c9b7895272c2c0972203eb4d96247568634aaa85fa93e304e375341dad0e19d94eba0e1774f4095f3fd82a187049ed8a52ab1ad9422dbf3d9b6a70ff0dc527b19dce49b7ec49a0b0ccdee5d529a4062de19ee1bbd980e6adf3122d599344ee2371b4d7f15435a527b09d4ea3a1f8ac5d5b2df9a01390486a5df421a7405f806e4de1de8f46cc9e137a1b0b7c83ac53e4205ce2e7206cc2bdf39b2164c3734dadcbf2b669fc5b15bdcf4ddba31871963fe457857ddbb8ff884d7b0399ef0c604df356decc4cd68717bc29fb78fc66a11b367c1efdbca11f4bae259a1da674f5be6580650ed7b5455aa49f3ff325f9b370acd31bd359165fdbeaa13f31a64340ae631efcad27eda700bb479aada4654d2a88d7884547ed4fdb5849e2e5974fd7a768d6a740140efb3b52115675ed730c5f8110a6ddb6b884370eff78261cf9ff8ea048b47e2765d21126777f38f549c67b10e06cd870b4475aa9394c50913435a7bbde803d26413ba908cec5550b3f0e1d341e7bc88c15eb715925e66b3840b8d2dfa65045699c60b7c4265fcfe59e7868e6958174d90177620f6e7429744d95f4310320332dde683bc5576d9917c72a4441db07827895c9a80f83b5c9bcdddf1529cad3d7b6d385da6ced6ca54c41058c45fd624ca45acea8d4e8d397a9a743ec6b38943659431c2204d7d180684136a4a3d61b446400d9de162ad632f6cd01b48ee56e0e3b8043fc1a37f38115268ec2e3712c7a263e27853b6bcf28006b4b2f05d8e945242de1f9ac69dc96b5ecb6a9b6cce2cb9e61f4647f9065079f8eeb26b1842f4f26ff31aec8c9d601e2f3d42346b2e39ea550ac438a2292fc4b852f1ae43c67b25e30f101f8baf9b6004e0604e3dd88f067c0fc3f2f39d960f1f20ed173674409b6597102a9f6e14363f963d7ba694e21e574b397d501c89d7cdc1f17017300a9605e662759916c8c513243f786bdc6c5204578db07ca09f7a6e7ddb5418a5838a4d07a3f3b98d9a127cb75865edced017030ccf23633533455c63ca68b6dc2b046797c117199f4e8bcb78bf24c970e1d95f25bb29436478e14b1d6f353603f5a1c09302dc040ec7051fd5d2b67b6cd6a2ce3404f7c8cbb61b1a4a4fb27722638ac0de2f52f20839cd40b3de6c194cfda7bd0927c9e03beaf13d8912f0ebd7323831102f814646ae0df83f72b5f92ca8b0a7d021975bba41e1a6d6aed817e976c5c7f1409fff3f569fd91be85c415e1233be46844f648ade9e60a445b7c6d9819d9272ba4547a88299e87fc0ca23f61050bfabc553cab042091b71d813459328534bdea20cf55de19499be78a1febd20ca5220d90ba80724205c2c79ed0648b31e4cb357f3083fa2d40baba705261d07e24f0bd49c01862379b867cab68c5e68189aca39acaa01de8a864375e2b4d643b1dd73f92a55d94232e36b7525cd921f989896137314a742c402658590ca1f0a0e8233745b5e90ce628aa07c5a839a1ea6cf5dcc0191129022a06384e9852b5d289094baad6e35af4bc7a79237e26b34095e11491c9dae86468baaeb2026433efa38bb1f884db536bfb337e3fb9c42bbf53653fd3fabb9a3a1192f0ddfb08c1dc13283062428c3a3acd7921d1bfe0b6f3680bbd727feea3a06b1d00fbfd81df8670de150805510ccee254adaddb9eeec820375158e95d349fcdb57d77e37e4bf8f220cc7789e8532f33a24195e72af28cb4dfcdc7f96ae906317410faa957a77335271f67a11f06c64853ae19f0eeffd284e11a3f514a12ba681028b22825913816cdf8eb59b488ef06bcb118444a79a668ec6d396171eb9ef03adc121b9cd3436c92c4334e4d811fa59e2882eee1264f48c86a20db05fe693b61a38a0f410cef60bee734978f2bf38972c021f04e14b240ac9fde60399aa406a1245f39b5ebdf993fb3bb137f2c3941327e7b91b54d9ed6b1c59c95eb0d8dbb473b1442af4afa8689b7c958dc4579ecb2cf36253635fac682f28801f37312373147c8e7779b52d9f63bbb70ba58372cbe43411137285a3e783f150ed9b68ad4ecca9123cdb5c1e59551637ef484616d76ddc85151c5a912a0bbfe7e7c98e98b0293f86c5b4709fd1db455d6afd9aaf89c8b1fee09ccfea4daa25df9816a3a06ce1f80a24bfd1eb9f039112771467575622a342819afa2460a1b0d6f80d6ec42ca711d76cefea5fedef7727f85ccc09486a58b542f52e823ac2f34922bcb3135cae97bf69cda06853935ad638d55046894c0dad57c8f44807ea144a074e2fea4a0b8c8cc2dd3ebaf9f4fb863c1de4cb0dd7203adfab18cda6e65c0da14d9b9d0e1b0e6b7e483c19aae9ebdc9caced6937cebd1e2e512479c062a11acf774e7bb8a379535eb9505f4b5e16e2ada1ce92a2e8927067448e958180bc76652dcd4975ed48bb37d425d0811d8f41b25fa6ea00c45dddd20db14b7cf3c0d10b38a6ffcfa429bde32419a6bb69fbcb70fe5f800ed529241314479b428dd0549fafdf3a55ddce521ec03939955a18cb8cda2f3550b4f3d9b53d8e8a9c22150335973beb48fd8d26a367290cabee0094be097d3410a44fb28c9a21b164bad8ebfc8045bd09eec244d3ca8e49cf60f0d8a9e8d05811d07b2cffd7533e5e0e8f2c4631802dd9cdcee2736a142c7198337cb6e919eaf5b8337efc1449a1266d3369992436fb8ab8225c76594dd5e5ebdb0b5962bd9ef4f9e3718ecc1cdeb9f53b494b5497188efd2aadd2dd8fb192bc5bf14b1de22dc4341ad54312fb0eed0f902fce205d55055fefa45cdff123d7e2bade04c8853db7f4195c8c10804eb691d704b96dc6cb93259a23ae23e1c5f1a76ae9fa9de69996040c94646b9c9579f414b935d84d6bc0f70ff037780dbf987c23faa0535b898b4642d5145ae1b472ed5b9f57ed04ad3bdbceb2665a8a3fe6bd527d34913685aa5640361f52e00364de62be7c500b1adcaa92310b880306f5c376d7ae82f1b050342f28a2b54e28e491142604a43c98ab360ff070e6f457e51a37de4537e097b0e3ea2ac501a63f8cf97f3d6db198f673c10e29d21c688c2898b4488903c6f5ac3c4737b1d5004d137a86bb15c0fcd090ba5e42219d026f8d8f2848d31d0f90dac423cb75ba7ecd3700d6065c7b81d237c277d8062459df83d1eab50ba865b15c117983f8e9c40212d6de1e76b189b0ee108691d763d20229c0051247c30dddbdb3a14e4d69e09f914384fd5550b55de90a502db8f81df3d0bf33e8148e0a265373f93b1af792de3b69363f11912d170b07665bc849aba574dafeaed60a471255597ea544f6d5172aa43d3333d9f1bb68f9d8eedad3b741a2bd21f0ce6ab06e6c947b91a090b85c764231a898e7c315a9e1768b9eca83827b92aae43a771b7d1d66c8e844d36540d67adb50e19a89c9184ce7c7ecf955e7caf1f454d75044957d54d498daeeb0dcaa3ab0a5e6f103f6027b0c8e21e30b7279f06c19cc071b98746b8d2c0e149461372b430b0d3286262156154ed6916f0c8a4820dc8562399e971d4a12e89690dab4c8d28b30be170f9c8a534cd91d4277492fa45996083b9333e9078508c3ccb690c3fd423d7fe2bf594c8489e44fc929831bc199a219406885ed5f00b362aa15cc7604a17a38e85dc3dfd092c68038516f208fc452fb4fa88c9176d2af8557dd242c7682faa8da1e730168afdfcce77760de5780615726b025590d92da3051193d013699a5203571153e4be4ef16717c6367b61fba8014a301210526258d14ed6b73d60a365c5338bc60486c92a44ce103f55260c9896a069dcbfeb0e3834e41e494cc4870481e025d732e05faf0936884af1e69632bc16adc7ab70a7f955f7f82adccdf3e84e4249cb3559a1ea8dab4f732a3ead954279720de66a152dd7e6ac718381f84c28b42e64625a040b6de681fa543084d732d64a774653e33588cc9c8e92788725bc928bf4a90d122c4fda2046def513f6aed96d24c363b31deeaa2cd0bbc2167315301aea8a320778ac59a6a9a866a0638f6b2c8192d2d19a5d957bf8cf51036553ac474634416e14bd66324d9e6db380c7b057ba5813acc65b48ce8abcbff74ad0e233938cfcab854af10e0873a8710a5924ba4bcd07b5f1b90a7f8608608215062251e48cdd1f3eddcbb7280ee1bbb873418a12688109dd342dca4a07739e5999988e8883d13f5fc8d3b1dd2203092a449ba500cb1e25a554558d81b0393fc46d260452ee645fdd18eb3c7b0c68dbb87034c38feb61d85b762e9f87362208afec3748291114f64d3fe7a06b7608a0668c95249a704ce32d88c3886c76b025e4e3b11aafc2c40fabe81eeaa142cbfc79506bf292848d26c5e3b8c034e9af8980fe60761cba49c8d53c8c5f3d691a35178c40929a58c0d32889ad674f36d3234154e44f33907290c90e67076c4e8ca7e7dd1250c9e2e1eb010840bd276c6ee25e3da6eae7d8e1910a4ac7a42841ac1545b3d5c144488e3277f99fc201f129bd3aae73bd3c85c32a327f013e3b6ce40ade0819eb831147800b5745047a04b2cb07ea5e461e95d7dae88c499aed0488a1e563fab5da784f92fb4751da51349df5320a9b459125efa30e5ebe0efa55e7152583ab3dfee44685da5a8cc04cb91cb817cf3ee65e22762dbb152cf4dac949c56d4857616d74877b790f203f576995f85e31eb8c94910113758fb0bf671002fff176e06c4a3e2a58bcadb903932b727ab31e3482a386a774d6af6b778b552e07c6d9660d3b416e1c9134f9441b6e1b43a30ccf40a611b868808bb9c5447720081ed9a43df1485b5182e9071175e05cd65352936e2eb53ed2267e83b7e964d6eabeeec399c6432f30104b1e09bfee48ca514cb383164318ef063c8b881b35921c0135a310ca4f22284b9d0aeae16b1c9ee16094eb5e5e827442296f7c533e65235b1e511b31dda7646a4fd2cc1d1b67aa716c32bd896979f4d1fac53426d34d45a756ca25c1b518fda847a511fc3c9ecb3a9b42e2eadacc210eb8599e19f4f7b71e05d21e576a73ab0fdb4b829ea4a3853ccbcaa897b277cb0bca209963dd77517e430be48aaf020228cbc70d6c42e926bc850bd313ba0f424619ec67d990cb5442a7a206aabad19580e64ae12a219e0ca366872c991e41b408d628ef858c208d6796989061538f736ea05dd600ef095cb8007e170176a6e3edb78b7df27f077cfaf778e219d27712610e2151542d873817cf377b25d266fd765de3b05891f83808c194bad871ff5d45514c4fa0db8cc5d87d5c6402e4c2c163e2709475783a8056e3182549847f899c41c6ff5f3d442a536488b12f76e84bfcd1ec95405c08a73c7183189d17a1f125915473b3a9998480d7256d0298de110854bdc8a498258f9a03fba0c802ca2ba1e8e3501c871c4a4a950314006d923ab12a39c5178bc049f02283dd1035382e900d8adc81581cfbe1b4dfb75853c010a30c3257eae070c0979180961061806d0918cf31643ec2d77a29679caaef3ea9854ea33fd34426e8abde615240e4cc01a3e8d4800837f290f31def003304643b8642447915c5a66adc13263b727f2a8b82eb516d0a4f4d16cc305648d9cdaba7e3a5a1d3e9a96e5bad58275cd3bf81d1f91f8c35bc1813e8a94531dfb3aef671bc5624212697c1d25ead2da6e586968fcbf5b9d7fb3337a9cee9400a5732ab2e353e42438e4a44e818b7c48891aad87199c76e57b38213e1739a0d46ee5987504810d96eb5a42a589e717cf832e2a675aa776471aa3e4d6625c12affdb37eeb0711babcceef5a72e38f4848e6b650e7eb20dbe6197bd18eb2def3e16d0ceeb0bdca7cefe194f6884e907172b2f1eac18ac62970b06f62d56a2e169cf025c13ca1c27dbbd109cb2f0862b9394a981ea112c46d054a8ac48587dd59b92c145da9d122203ee412871598332254ce4300794d219981f13db341aef8c36167da1fb862583088ed70d89e03c38e4e65fb44ebd12046ba4e5df539b5c887801f22c47e611b477d61c55b2ddd94557ec9fc865137c2b0fa1959d6e2ad0cfe4213932858a6cc4941509f2f20193f7a940768f59e400f4231657471762e4217a1253a47bb7ba45e0859c082553995305ea5937d36047e1040e5be54c21c578315b553fb39729932c57ec87abb44a538dd2e9a14229a96f0c866eba8a520e0c84ed6cfa1e57e8f81a8db4a70b4bdaa495dfa1c976e8b5c92f2e59ed30d0bcf266809abc7857e795951c06d80deec776d4067d1553fbb6a4c696e46ef9b54b54bde4e9bf90bb68a952c89d99cc7cfcb00b050be0c9a476993c2c49e4ae5a54505ac4c3104e6fb995cdaa591658c4ce02b5921d121247224a14591598328279848a05daefc1a5290e0741df15efeca455b86bd5e615f233006b94086960c088b3c70bd6f972c89f3bc2e79fb93368a3e7579bb074880d0b51cba2a4658cf83c6a6fdd6d3fd54974297738b2d58be18c9e120174661d656a45fc2ef974def5c93a7b2db5e24481fb46771bdb1b8c1e1d858b84bbd984ac13cab19dd8846c14c643a83721093c112dacbaf87a74ab723909423cbff584dc07fbad16f981dd60d81178bd76d23566bbf766e77518cdd350a0199ebb6bc32dfc695e379843f0dd301d3d046e35a51fd7ed9ba4fe1e9b9bb5689899ebff137120af01a2d1dc68e08bf4e179c9418883ab82112a553cd506e339a1b48782c8891071796755dc713eea0c20a3855a69a2cd55aeb93ef5d442b139f8e69dd1f2dc78a4ceee2b0c9cf0df3ae1e9bb61ec21ffaa567fcb8d50dc174e343eb0ca3718312bf16888edd414a3ddb1d644087ed395d10767031ed792e0cd591a55028828a257d4abc7656ca2fe3ea0dc6ac609176ceb92fd629c28ee0179723ab8d174c821cda48a91a6c317e178626e53f16fb20b2742b8dd73800df074756eadda83af3009abcc19eff36b80488a527ae8bf5719a12c3b0bd4e5a98b5dfc04ccc31c23df32888ec1fc197d26f2e484c5519114dee59529425b481906e0cf3239858a986c0d9e93cbf28773a4e1f133444ca12b9b934ba6515239551f4dca89652285c2993d0f4360547b30f20e64548a4ebf2ca44dc0b481faeb59ea5a6111907b4ed2d1fe84148189c8b1a8d84a4cee667e06b1e2d2ff677de30e70923ef554f175e9011a373be6e99d8a8299c13db923e3f2f234d8477eacd8ac47a9c56b97478431c0f7993065177a1a1522cfb1c88c1e47b9a0d8b4eea8b9a75d35432957c5fc4f9a5b15d6b68d0af483c50d3e97809f782f9bdfc025c575ad7759546656dd39357d050de280852c6a4d3f57e037866f9838ae595f637d4bb5fed90a38fee1c4fc12baf6db24e83f6b11756a203904db334b6df046451ff267de3bf2138b61bdc5269b538a7e9895e59411a84bf147ae9e98cfd0cd221f1c40e9fa7383372a6f3ca5f88d43eba34290879dc7a9f69cfe3cc2459b819b61c627243bf58aa5c6a7267ac78cf042f46853d9b06c963057574fc01a8db60a3dd886596705cd280d543274e3b8f8e96623c1ac5c866ee533667f6497c312ad9ea725ab6f53478579fd871235a96181e1193637de84e80dbfc105e7572cee58b0188d7f1f6ef51f24e8dbcacc0232833af1324339273ae3eec10f8b0cde8cdeffc02c572ec49010786319d463ef2513f320146103ba3b82745c308eba9a0ea58266fa7dc08955740b5c605360b57c5f66d484a679b773ec9080c49501be08c87ebe00cd3cc310ec0ae14caa4340134e3a5eef9b4c21c36e17e94fcf1adce9e476981795bd72a191e668c416d2f6eeb6e59652a62465070740072e07dc0bd93a300572e1e675c7820a9d5bdeadd42b485ba43cdd82ee47b89784eea7d7fdf723755048f7938988119095cc0947cf74aae15538971cd6420eeb7b2794d3ef9813d40cf8a98b8a5cd9d6a71df5baec791c28a43eed7674617361f251c3c6b2a4c54e9a2e29b0ea59df48848afc5bb693c3dac9c9a9072ff221284f5072e64bba27a8b09d5af4204a1d095585448c88a8fed5bd9cadbe71f8ea42229a9733ecb416815aac34208f1f0e7b5195eaf10761fd2afc593deb71c8fa9fd56af5abb0c8ccaf1e874054cf0a8918adc21f11bf2a0c419553b0e3708ad11ef49d195d56a864e2985505c6de6254ff2510cb8d64b26e92a6d3ac67b319d5e32d79227dface5c25c03b64c6913bf325173c36d2152cc1489f1476c8dc60e44e3f09f43da99346bb81bda5b33ff6960fec2d43e099bd1f7b4be88386df8e077c3b663e410acc7ad58f8dd43497a8dd36afbf11bc67f2d175a9cf7e273bcff3b13d15f2fd043b157a4beef7b8e46e2cb9bf91c03413ad7f0a5d216f2473cea80b55d4471794b885d39e9528da09a8ad74522389c136a42e22f0d8484923914ab57aeba386af1f8d444b809b16cea816bbdffe8065142bc98f51921f230f4722d60799628c688236fb2912b29e1516f99945b4223faa67fdcccf204da4a22b27122ba4edc17cfcab1f659415385ce118831d366b4d4b93c98fbcc621817d24d67e8eb65a92a4cff6d652912d14965a1acea4a31a064f30004699fd14c8811df772468374cf853f463ff73b4ecefc7e2a1cef0d2507ba30806176286228b8be9cd95a6e6ad16e16c98643e05196152061f6adb5d6edbfdc9398f80226db2ddb9f5062748fcd91fdb9c5beb4d6328151629dca23fb938afd293f13e48e0d9f6a9db485912dd26802bfe8b3dec88c035fd47bfa9ef7ac9008ebbdf0e7fbd41399f93ef53faa13f2ffb4de7b16f8d33debbb1939e03a0626a2f91fef67be051a01e99ef53cbc87267cf92b9933a3d77d2034effdf673d6fe3fadeffe8608f09ee681784ff3fe3f461e02e9bef53fded3fc8fd116026985f77f68ae7d1a5ab017befc573ff3ddccea675e4030eba9ea59e05773813a2ad44c1fc7182c6746f4f3fee52110eebdd4e3f881c493c91cd61cf8833a288158f6a7e028ba9864b2679e91ad2b145d4b29e58b0a9e7276695a7eb100a7e020a5e38c1aea9e9f4535e35c629ab59e13706ebeca27305db8508a23539dce01ff7ff53466cc7819353443381c314e38ba38d77fe128aac21a8e327f854953fa1196118eef5f138e622b1c63b5a69921d6100e41f07e27794f083812e64f461613bb7c275d1b7a0e0040d9b4ec34da2686aebb4d7bb282c060b87bf794ee02edee6edadd9476373872b9a7cf321f8539d9d32d09dc6b4b8f05842be12f5dadeeb59dbadcab7d4aeb04ed579a6f485d2d23309db2c55a3f2d787e8e9672a72f0d3fe70d2cc051eb53aef56f0872ad4a3674c9f5ab7cc09b7190476f8a1a92100293e96fb8a3a8354a84926ca5b243aade106292e9d35aab8e1836685143982a5c706156eb0fb9d62f5799ab0cb629d36f117ed46a24268628a2706109125866b516e54ac549ae55860f4383951c198431e7c40cb6e97aa93db208da9466004388f67042b24c5a70a62a044393a002212a65c9dcbe6cf9c2a54eab4403112f6c36c460c06022d7748928c05e9659b278829100e36499258ba83c62f10ba727b4e5cab20516368f3fa5dca19fa3ed14789c436456b42642f6bceabb4f2993974c2514322d273c00859fe0cca950f6e7a3e33ef5db4b0fb73c9ceaa1bba2543887b660224666aa4fed806b1e9f0b7fa8c2c0e31ca20d557082a13a4818ad4d010593964c8fc8f4471911f4e7049a4095fe03ba47cab7639280c9c2e9697ecef5ad222929bb97dd6f985ce9095276e9495b949e38653adbc79c20384cf2a0603b09da4cbe6829207bf27c7f14b05fcfc969d1715accd101d71f71b2879fd3a23f8665ff6d0478944e3eba7e8c752e830a5dfea20c4a64f7d9b783c69716dbdb3e2549292500b2a5d6565ba96f1b121dc8a38b07198490ed1e065078c4221358059afb45e802dcefcfe19fe2c8602f13ebedaf17bba1a45f0fbad1c740fba04438ff948729d057e1e62977eaf75824fbb70d652cf4b721d1fd5a6b7783a0088f3733d92a53a6d054c184a60a2636d890840d33ccf032a74ed1841f1434814e2174ce06cc16a5218ec5feb5041e63fff37380346cfe30014ea5607c4808f12121440baa0d50903aca1160a2d86dabb556bbd99e5270dd68583efd1b06aee1ab7fe60e63e10d392738f64474cace19043583dc45e089007beae7e7108147093f80cc94edbad40c21070f1083ad0dc4116d282be18710f865503850ae6c99504a41c19f9b5639a7a4f425f09dcb90c8becde958770cbb2b05430d47fc426db7dd22d28be12f29ed6ed99422e1eea8975d38b4c56e2a84a951151b266fc3e4cbbe9b531a7ad98244f75e4b3d69690949949f63ca29a7cc3165eb88f6e30d30bfeed4dda5b4a981c17db395baa49c51c3454e96b5c67a6d6d12d34b73299de15adea52cdcd195a7faa8089f8a8ae0addcdd6ba5b5d64a3b9c929293f24ab939b53555069d73f21081ce10bd6d72a6f794524a29a5f2f502e1480d1b192175e10eb9dcefdee1f8fa1173987c569eb456bbdd71ec57e5afcb0e4af9d4e5e3ebe6da79524a29274d4a19a502a594524aa9d7b5524a29a5d4fb542b3cf37d18a86cac5c18a75836683c0ef42eee928b044770aca19452997f83b97524a594524aed6d5fdde01aacd68c67696ad4dc8a5975061c5399db6a64cc70d9bc6478121c0130c3456dbaecdfdd6c90fd3b9c9ef18d5073879edc49659f8181cb868deb06a76ce4fe8e86c7b97eec1feb3bed9ae9775d336db029a5e1b5b9a95123fb77e1cdcdab064e8b8667737f0700ef29695455cd8df355708ac320a536b36bbe8865595d4d4777772ef07c1fa59452ca9aeab5e54949b3497a299da192b2384aa9ace102bb7baae54eb5dbbdabcdd6ceabb4aabcefb374deacc32465e7eea56ef348c9b1ee8c47371a8f4a4a6dabd64cf95eb3943b94565aa90c8f4aea140a6af4dae5dde6a975ba3ba6b9bb53bfb91100986aab9d9133f65f5f0f6c29ad332d1a302d9a992ff6267405405691810c6a6bdd2a4e8d960694564ab3b0f645ed97d60be31b3b43ab9db9c27ea9f7d28e56cb62b1baae7bd985b24c9932b6be36d059bd6e7476543796565ba68cad3602b8e1d9dc8875ee9303ae034a847670894c892385060e0f2c0d1c0f78aaad0183f3e2e9a1d5bfbe2c0daf96563b64da4a3ff09922c5cde3a4fb767476a7d56e38346eb27c7a656d819c84d940a062cefaf007c3968c97326a70c277587f4d173c7ffc57e80a4000bcdb354d19c8c820834f47fd1a35d4abb5bfd91a2d0dea8b34d4bab442e3d3e12ab0228c7e58b45e18c33cd8a7637b1b1b78392d977f5eac4c242c66789b6c6021a12934a9e0a821f349cd04d54766470644f4be173f1daa176ddcc0deeabf1e7d801956d779988ad7f94af50d994fbcce0415c8c88070a9af0d7456af1b9d1dd58d8ea7a323bb4957d66e98306f34ce104e269b4835cfa46945c804a1c9ad5e304436b9e4709c5b643602b8e1d9dc8875310e3a0eb80e3af0a4f4b9dd003c297d068063436a1107081a383cb034703ce0a9b6c609e7c5e3d1ec49ad25266ff5822ac5faea9161b9483497c93e1df46545b2cb200cd9b639adb488a58f9037fa93903bf5034f4a1f1f4f4a9f248c5d5eeb8dcfeb66a63978824e0eb23f75f798f489c91d9f14088cf1c54e0bb3c316960d3c44d1f4d0d492e202950f543a1fb2b84b5d23aa218fddd460f21cfb293799281fb8c8aca7cd63e38a79f5d28725eeeb28f900743be83a294de48e0c2e410f2f5c2994789062edd74f8725c00e284852da61092d1b614daf88be3a8871b5e8a04408997e875d2efa2e7a058728a40ce145174e66f4c5e6a9405cb152e562af66091e4516f20eb976453a28c1c9f4ef3645173599fe96938229327d6a37a5211e32a55fb9e4e420e50465327ddafda083031513e4e042a6ef395ea26891691352e0f18a3a50d8cc8cc04d578c1607585b68a0c4e0021e9a8122f4c28a5e160f4c544d2c612a4e3e033411b5520af29c545328e94690f44141810ba9273c2859b8c07550bab80618c1500a4a18306c475c1420254c51624862002786a2387161a916258a0b062041541422036ca145a1c2845e2e3480134b51987819c53aa6650b316cb8803924b028304cc1ad2cb33cf9a08114d826cb2c4f48884cf08c2cb33c49914197272d32e0e2290ae604af90d4a8823f2736ca60d6908d21f08a080d76c038a9c613be4c3570c03335510b5e6599258c164c61c0a8410553174416b08d013606e69e9c00df285b4809e307518c510d1bb097651631546a1c65119374a41613b3c5d6a493392924302bcbaf5f18065f292fe82370bf510a5aa048ee14787bfbeaf7d519039d4722790b715a746f5197c5c4609fc205c4eda2058a5db885f108c214b1618c714be90616dcf09447fcb48ad32d98eb965d0577376f5c33601fa9c733a6e011a7bebf9b9e6cd93e02cdfea927f8738e965212a9beb08884a285312420a168610c5af6fb94e3387ffad465a8c54240e58e87f52be55e8242dc3bd9bd48909ffa1da9972ab8a42f4122cf41dfee0d456858e7f841ca0f600b12794f411cdde37d7f2ce6b21c6070151ef2289b7498b8269d2b0afcae16a58bc0c3257379cffd9bb70db4a0dc3102cb5047eec8afdd5feacd5d0098b08ef4997912f1a72111fa5eb885dfe22482df3f4ad5a9c019e5b04afb81c4b1c3eae3f7503aacfaff784f7f23a13ff5fd2922aaf0e77bff2dcc6971ae5ef58f55ac577d10d6ab56ff839f151209b2fa51fd785618fb9574588ed81830f4ab53a039a32c14a1e14f051c169ee0b0eafd98d7f6347c6d21fd1ffc1ed2573da534a4d1b0c8cf1c72587dffafbe9c85627b30df7b2b68ad8f630c7d7f2449e87b9fc4ffa3ef3d10ffef5b416daaf0b5d5d716fec0db130caec0090536cd61f53f1003e5fa9c18dc42f5c330b8fe6c9a4935e9db42da6227bfaefb0de43e9532d21f391b7881c7f76a10264196c9aa26ecca4d690946269d4128773f16c99386eb8144e40b8018439b11790551153902055ea2663fdeab422233cb0e3800cd8a7020050c41b38e6a0ffae5ac88e442862a42332fec0f9433d79125a425ba24c70b4573b2d2626f791d61e9deed515e774322ef91bcc76ba4f99130f34c016d246107da88c2374273e98ffb7602c3a979c6761abdc8a19a67742427538b1a3b6a49f38ccd25b7182ec678ffd5c3bff63bd27b91910374a11f8563913cbfa1644079826d942f28c3d85244cb0e1a41e28129cae40df49745cd33bfc7b778911fcdcde57228177605d1bc47ce80f2903bbd8ed80277c2118b39798f87c31ffc1f0e5ff3677e5e53f541583346e16bb258af7a396b16e84e0ee5b0ef3d509643d603112322ac377afdf03e0172a6fa9aa74335e0091f58019e54cdab7e944d56d0680eebd5ff1801c1ef7dff83c339e4b0a079e4b0315ff89a0b50bdf740beaf098918f9f41088eabdf766dec88c45f35f8df747e6ccfb1f9a703239ac5f334ce187745802e4cc0487f51fa9be6936318da999504d5fcdffb0bcc7615007d15ef3ab79ef83d4d484aff935ac67853fdf7be16b862f04785ff341bcaf097f8c80cc7ccdffbcfc695eb23e48cd4cf872ef83cc3ccd4cf8f29ff19ee669bcd6d3d474d00254bea505ba934371636067f2a5169de64beee454d4475d94db432ceed44950ee1464f5a3fad53b943b2d60155220a73477f2aa38aacd3ea7e9984b290f94339af43ad2d1dc21e9eebed7e5925e28a5f5012dbabbb7839fc3eea639e48efc98ecc529bb3bec965da48d7877347436c7032692e6a18f3f2665b247ce205ad417292515593e0a0e90208490a70e52ac40210cd5202ba58aec3fa5587fea604576b17e92303ec78657c8b54c762bddddaa6e7882dca92fbde46a240716f8a3c97348183dfac0989412e63547f697b0fa29b0eb8fecdd7fc20b914db7392f40261ab4e840c68b306ea8412cb14d7aa82f7ece5b31b48527bc58b550c33cc1b48277d1c2e54038c3ad6d58704ba48262b663b3d25a690d16f097a59210458c21c4942d4244b13428e91c2658760068be27440bb93eed5ae9bf8e00aa1845193d512962d43f2f9411982deef9a51941e132bb7928eddcfd7a97a500168a64f76e760a159986f386e3ddc2117b8bbea82c042656b64d22348f540a6229cf20bce45492d29424733ad7c4a9e3155869bd7a3dfabfb3877bf94f2499c8ad9e5ee656cfd4864cee06b2c78625348c3e0d65c3c601f08c2040691ecf80a4995640fa804e7d053a54c20f1e4bc6abc210155aa443c20a04812f7d2f2e2a32a514082fd1a73fc42954ade17e377b7bf9e9f0d1dbc66ba7bd96c6451e71be933623df9f136886938684472fdfd4bd9f0af1a4f590835d54ffd6d0fefd8e227de41d7bc98ffdc40b7b68389f72bd3fadf4fd09a57f7669f55d5cb66071519953eea7eed3200273299003abc0f38fa84dbe3f6fdfa121fcf23bf768173cb7344f33d5ecbd6f5fcb3ce21291efbd6f8ff09422af0b04d8887b276dfbbbddedd29f9f2c5f51facc21b973ffbe0264cf8442c29898b46891573ef8401441d0c686c5baf77edf7b7f9cb4fcd7730d6dddb5928142fa90c3a40fcd15cc60aeb5d65a9fbb628bc0435ee7dd6ae55ef0e762c04745cde3ea82bd86a5fe0643f64c2aa496fa4c4c5ab4c82b1f7c208a20686353b93c674deed4af453e44471f9252e4ceec41faf4d76642dea85f8b724861ca9d8aa536538bf53beca5166b95d4932e0bba1916a64c64cf0974932dcd5b30ff205b876cbb06dc2b8041a579f05bd6db6f26b2c785ba903ddee430e943b34dd9af35acfe3e0b9c605ab48f417b05db22b037794f7dfb2e54e59d496a81d2619b17712f7031e0f9d43c76c4f387a25412b875381572c73a90f441923e7e8473c081b43890088236360e2404044e026f368923913bf6534dc224789c4dfdf3de24202bdb5a3b9de40e7d9aef4f02a3e030fbf762ecae1702ead30f529f86488064b3995772672d18c038bfc8f6bbc8f683d0a709914c27c9817d25773613a2e0d65a2640b98588b2fdb63fc14481ddc99b869ab2c5d247faf474923bf6b3ece91a562061f69998b468b922af7cf0812882a08d0d8b85b36dfb6058fb36083c7ad9be0365fbd6eb99a00cae0041d320041843d90801f6c068f0846590400c836fa8d0f0430f5e7e1012bbf80106b10abc7a0116633420c236592a159d40dc01d764a954c484175434d001b3b2542ae2c1865091932745405ac4d8a0c953161867a944d4e5044426d8801605080606930649b863a286126c97304289e8034c4440d8d082b72c958878f0614eff6eab57473a6520696459abc9f293e5947f6c88dcc98084f573b1828c269cbdae7379333a9547af87adfd6ca5ab16f67ce5ad4a2ddeb6b0042379ba2a75f9f43a4ecea7a33e6bce1c8b43591c48a704e1d69aa0a6bc413d29592d55cd274ef73c2a6578d2a3299b1befbe365b43c16d9b7f73f391306987636978423a413940381d9d8e3f59432303261e0600e87e8f36a98c192e9b9b215907fe8694fef0b1e6914a4a185dc9743f980274c515474041c152a58244169dd36ab7f196b0b91893f993c78e7443cafbde5bc311d370e6de5bfc28b7f42479073ef83043972fb490c169e61ea81285cdeeee2d031e316e9c7657f3c8dcb31ebabd79db7bd2f3878c6a356d4e9f41d3c1f1a64079f8903d43648f321b903d3c96e691251a1275df605765e50196d0b0f9dc93710ee540bda039e49ec354c90c85f69caf21dcca5269862a799c41b98416271641997beefdab7fb7c999021d227de66637ba6ddb6fdbc681258077ca56cda0a01fd913812119909e0464cf1087bd181ce571b3d611ab40f9b5825c0a747a9dfb5bc2b7433e51f70d689ed8090d6891c70c2b37067fc63a416207d528d149efe92b5f94116a7532bbbabb7177775f8735a6d9eb6eefeeeef65abcdeddded6058da4694de48efc9512980cd49353d214ea204a29add45b4a995c1aa294e21a9e2f7f8eb329cba7b44b8bf273b4982b78caaf1183e5d734a5d49b524a699d492df250f711e0299b5221f49fe60ddb2f3b245264e645ba6750e041b55aedffbf56abd5fe3f6989e9ffbf56abfdff77d004a189f4b964ba073b3d413575116e72393d54510bcdf0ffff1f4c172e5b269625115ca97708171dfd44ba40ddd3b55aade8a8a8a88b7e740d045dab0975a935d56ab55aad56abd56a35ef367501438518649eaaa8d56ab55aad56ab79d01fe9ec745aed76b9546767f267e77d95e33e15bd57b5f26da3ab5837f32cd9e4a2d39680986a28788f283a2c0578662061f55960fd16f22ad21b8a0cc8f6eb513beccda709824b9ffbf26717f9134b6c224d2bcdc3bdfc7ea6a79b9ac9752fc62ed72ff912153ca548ce225a4fa12cb97f9c4eb2fcc9448230b1cc1bfd92e674c57c856aaadb50ba85baa4165241518193502fa95a28053912d63d0b94123697963a550bf92a945d03f2fd2976affa7a7c4e85aacf87ab64119e3fd4505aeceea1bb86b6e22aea1bb078ae610bf50bf5ea1b81fa1337fc277b0f9617f39e6d06b56a0cb0102247510b5ce00596284f3851c4154e30e960adb5b6061f5cf08219c22ca104083ac9cb096e1212a37ac55092263b34f1a4cb17274e6c5189b842cabdc208870eb2b8e00b185b64698111f5083741e1c15eb1c24cd312375ce1845382c3115a94184af08014461d02045c962748ee155090d45a6b2d81184b0606ebe58a1a85972c668a349822040690c00287114c11a6c9163329a7796e9e33c9262182cad01412601ebae01b9e10a203415d82a3329f3d8284e65176c90e45a61ae571d226d05c32859c8825398fd34af6a67214953d004d8628ba72e5ca0c2cccfc633c4e9072e4055f4039e1441033ff19348b3cc9aa8e58248bad73e0459dd8d6850a76d8c24b91951cb4f8a18bebc08154134a6e70128515485e70e1160890baf9f385807bbbe97dbf79de77537f5f08d86c98fa1b522e05e688b5d31008f75dd87e432e1c63a1c3a6ffcf7dfbc3fd06e4be0d8170bf85f8b3c02c937f8ce8ffd84ffd6cdfbd7cff5e08b09f7a20f653a10864fb2e7c8771e06bfe1b995d30f5f7132067ae90080e2be46cfbf153b65333fbdbd726a6a47207676fc0097247be6784e7c75a942f71748fe01987dc915fbfc0217da8b4b96a0007e562381a70824c862079b6cfb593390c662061dcadc9a59e2c3dc81c09997ad0352a1a19302053ee3db04648a63f45ee7b0399faf07cbfbf03784e4d231407acc608ee4d11ab570f87f4a13e3bd596872cb616ac68e10bfd23a4ca6502b422b43801921034e952a72c81258621ea0b2e822f5c1430d45a6b350192db4215a0285a40e22f7c0ece52e9a8288f1fbb5e0800093cbefccf1175ac064af866a97434248e81b72c958e6a68131c31b9329924b11c1df132c6568778ca5d964a4378916189b5d6da301f688d59d244eb8b314b527004e83b526bad958b0e1c145c8078a116610598302ab8428c099284f1c3064518474a66b8ae219686b052a543681e2ee575aa6f05f290b0fb52ca5b94650f7658d3af3209bb72c9089228e3910273ae091cf852bc2fbf1ed4f3f6f8debb59db63ae902b5117b61ad65a74a28eccfed441c47aa7bf43e6eda6783856ddbece3cae3ccf48f6c231a65219c92a8cf11bc9d88570bf92592564f51cf72bafae563be4abbe7d16a8d330fb1514b9d48b62f35831d63cdc5bee6e7fef9c77daaeed169dfd252592f288979440ca7666bd68cac9f62f879f7e3a2c70819953bf43666ebbb5077f5c0a9c92b2147024a9a3af7a5538aa8c641a8e3ade774672178eb1affbcf48fe7aacc6ef57a191bc0a475927a4be4a0a517d55a55eb5a382ae56ef90d95efbd95a6b3710079939ef9d3766a1aab413cf5a67752ab3ba2783a58023b516a50bc7f2c764217c9db34e20e89c73fad359ebac4dab774e3178fc1ca7230e32b5d6d818f27ee02bc834ba3fdf2bad94d254caa6524f53a930265bede05d1f62caa72395024900755cf04542cd1ee851fb77bbee479c5a4cfdbdf47e4e419939b0befcb617f5177d9a690c31269c20bc796013d162313451327b05f929229d88528299117d2f7c059929303935cde67b2ee6a6eb240a542a0bdccaf2bbf995febf101aa02fa8b46df844b5643403000010042315000028100c87442271402498e8c22a7b14000b778e3e76582c1a089324c7511404418c318618400820001162184254441c0020516c50695ce0c5a843790fb716cc6ea340f88e8727bec67ff44a591a7d4a03d016515bb9882701a944cf604088a9ac816dfba7aebf6559b1951f11acd87833f99578132e8b05894b0396bc3c14fda0d81c251ae4becb11b87d6df5b3b22abcb0321eda997ccf0553aecfa2271e5203fbbb049c307d2ddd77ffdd1754039b8b1d2194851b34e639d94b16d7181c34417a142328fc0043766f574ed165c011b932275e5aa5044c2139dae091585a8e578a2d1336986dcef41d8a343a2909289e66c6fb733806b46ba64a4123c90e2d87cd49fc6e03bb9a0322f89e04b7144b6a4664b0e235b373cc9dbcc5d5e9d5fdb4c8ed074022da12347a37f75f2637d809ff5aaa49c1207e4dc0ff36febd6f733da9323a466254a02390fdc1ab8de241832d2227f81dc8894000d566a6afda11e08d31ac4a34960b097c22b653a056ec1c9659af2a2c92d5f952168d6d5986da6a861728ed695f7c6c98bcca5dc585b20d0518e6d7556507c6ccb4a8aa2567ab12d6b5f718f3e062835b4ed068940d137ff25650e8471bd865f927fa139ddf988d7bf7af073e58f322439d70bf6c7bf81e675361d6008a9efe03c9fedd952df8c548de5ae9927cff1c0ede0e57e01cc7b5c0299081af12e7d99a239d46af049179cd0789f2245cb38d45bf2015786f07f8e1a444d1c025635f92dbaa09a50a1de1fdeaf02ea3ad1850150a7045f6e050e9a2af0c47432503e80f843ffd477f8bce44b7a47a9ec4daced89ff4d5e0b1d45d5fc0c678f68eacf4b061d677700538d4a1cf10b87e09d69bf802f9217aecc4edf23d0ace0ceaaac108501a41eb2d5ddc178b53990499e3bd7b804cf315ddc373618138c396eb1b57f2049a2483ff4f90f0322dd830fd256ff00c58a483c6fca47dc0dd3bae6e76f484a42bfe1f7a8d396f725d1c9a65527795a846f3d77abd5516e4b1c1648c87d555170d21316494f28c21cc8b32eba08697c5b3e01b72b4be9a80c61682a1861b4266e0a026a09947b0c78eed58bd7b674232d34f3ee7f09b099ec69e57efc7cd1c6a0907d1d0b3299df18240ac9ed79905926e52d70c2b08e8326c3dfcc503b8f21d7e589eb1260be009d1fce33223a67972f8dac80c55953eb04bfdd6b53088b008f77a3471df79b12c164b189474cf3efd82833d3db6ed2baccfd79e45b364011f2ad740de9a8407745e2a8d7de6218527b48a82ad9e5979aadf0ad542059db4e4eb07f06d3b5a0f0311f719d8e85d7f1080d21523f8b68c310950d4300d1814d8d7b32127e42d4b5553eac0874ad205acbfd234958e4a54458423f57cba213eea0326806bfd7a5852a4fbbad310b100e89ac16834a27c0019f7406e91b94b91acd056b1e086f0326a5e1fb51a64bbeaa56bafaed72b597588ecc825c9f9f1d18b473276ebdea571e43284a417ffad8d58c788d207cdded3c885732d27e8ba41f2c5a5d03f1765913064f5e9dbd73d28da823dbdf12dc756b1106e6793d369c239adfb7dd33f786536e4189798ec9f9ca3cc61a638e4a5ca04083d6548ef7bb3e1bab03d208abb117d6662c2e16ed826661bd35e3aae3426342d13bb8e7c569d7d719931ec6d173374fb16bcecf9b05870168fe1508c6eda0ae5867260ed3cbeaa26c4815302c657c4915a5af1328cdcde240804e073031cba83425810c6b8013a379c53b30b17e3527a427b35937213b184d4132e9948f5438601f71afc250e2c874f691eafb9a1a88252063870888bc49ccd9e60c85ba3651afc0b875d9e0f69f5910d01be54d96a5bc92d9dbe7c20450de810987c49b1ec4a39c71e988f3981762514d65a19446c0ed02a648abf4b43e7910c4ee677dba24382c020ccfe9f8c90c81c12fb4c9a675a66fe31cda40caf4f4698734d3d8d1041ab89e910b5c700634d049f665aeb12d6fe1c771995dd38518b11a01f0fa0a3ebd4437b8733e2628aff07aca3fa00d3b69c9fbcd178bae094903a04265bbc15b8b67701065c920096c17a21aa166da90b79884decf2d5da173f54201b7919997b71bb9ab38089fdfebe4cf5c88ad97802c2ca559d966c49b1caa2065e3bd18cc909659a7da867a78ab4566445521db5e200f5698186f40151831a1404ba072a1cdf1ba4319e93458fa4db89c9679a2b4bbd895ba381cf36372b3dc9bb3500e6dd863033007b6874ab93f0e2d795e650d0d768e9eb827b654bc44a5cd6b404ad7d646d3ca8917eb37868c8174fff3eb4372d147d9d1ff188e24667fa9ee0968a7366c10e2c4cbef1adc26085982e28947bbb1c907cbf8363e5a3c4a5daddcf20f8e96edd4c5060ce4b4d5102f4dbe2cfdc6b523f559a4b7b4df7592db24bb0fe1038d4813adcaa8b42055120979520b5ca66ce2dfb229f4be442cd08941a1591ad89622a79db854716fe4a94c5faf8e129cf94de03152c15338c9c68a0790bde558927e4fb6f28b26fd68c55a61a1a8906bd6302deedc17b2b996b196186e54a13cd3d7c2c407a9e284ec8dc8add9b6fd1049892eaa0451f25be43898ef8d567697653862cc6bc1628fa5672906520457d2bc90a4df8c8ba0d041aad13904562a33b797b1bf06b63a33bb5d9602cab57fa57b4c9c729ec3691d09be1f09415dad8cf364190135a7898d270a88c1c200671b8e1c767971b892a02dca774301a69c277232c08c7739d1a0ea04b05e44f67a84c08d1900afa40c3b704c9b44bbef45b57eec3fe374b339c86451ce7300f0d58c0c92cfc22850e9c33d3806099e4dea1b02589b7d8a2713799084703ca7f4e5ac476d70fdc7a6979f264d810747871fca9237808392b5bb4ca721f4c99a7a82070c65e7794c4f35bc4bd1aa66fe42e76a6de91544f5e6a63d7d77c9e190d0f5c00c91a5bfe856dd3770c5e8b44cc5a6b145eb348b578e9e2c74c6b9abf4e4c67c473c8e91b57f595d54aa527c8cf69020f5c195dc4f3cb351a8ff6c5aa761bc46aa706c7a7d915363791a760476223edf30a6ce021b82aa8a7c3aa20603d009d37640a3d91e0e26b0c0eac4d5165ac679aa2884cec34761f38dbdd1dd2ec38dc3a31b4fb88812546426777cd3f8d24dd4840b301bd1f0f7945cdc8efbe6fbaf30fcb3f6033def57b0520255f1126e4605fb55d2544a1d3df0f77c64eef6a49dc46d89373c6989547b44d06925186815edd9cfb0197be2352f67b36f602d480af3c620ed5a206320a36b1529ce2d9b5038061bf04e5de27b0eda846f6623c4a221fd76652cd83572c9f2391b4600e92d9e3729e0c005af50d79013f851d7c98144ec7d9733a329861b046ae76e4d228129d8d46fcfeeea1580586971509264008285f2bf81c6dff8e9b3efba76dfd97bfa8fa2400e1b00a77a75e2278d42852a52d3037e8897d437e1afad513ba13b24821b0f604640821f003706f93e6f1936c0802995ec54d54ed25b18e5a9e4877c72b7e3f9b2e61f8041f3cdbdb019f7f89a0e1af3fbbf76140ce2bd03b89e16b36e0d52b1704d020a129bb7339b01ac4398c614162c0be8b55792b8cba87f93bb602ef2ae0f499b9191132c82edaf336c43a81e142947d037e217cbd06c9256fb496e75d4cb0a48cedd2cd3ce05691a418996e99ef4734b59626ff43a8677616ff544f830985dc9ff8e4668a5ccda95efe497fce8b890172f6ed0d254119ae31f69affe67fe8251055c84bcc7c1cefdfc6a007dc9049518ae28c4e559c733f96acb5e5ce305cff268f0e234be81045a5e9ec4530f2ebd060c813ccc892bf88d395782fcbbea4ecf2f9e95f91d090f47b2c9d1ca48058de4fdcf60ce8ade0916b2cfe757f6feb9d2bbd9f2f66990ff89d46eb16f31827665765909e4c5d2dc21d2706cc273b9e69fca00db21273ed7c06effd3a3de8ebe8506f5c5626f40927f7b3061172ea62c176c449fcbd5c9f41e30c4f8818017b9ef54531cf731415c7e875f283e601d9d3234f4fec46018ab325e6e9fb0dd8bd58f741a7f7832f8bdb81eff1b8e30bb2d955ac7c7643ea6d1a99779963d6a4d811629cc1975b20f9af9eac32c67eb9b67ee3e18d48ba7c6d8cf7ffdfeee7fba579caf0ccaa756587dd14e6aa8e49e8d79062aefa82e723228a2aac0da806056f60346e1502c376fbc55e1c7223245e9af5b09312f819981dacfbc1105996e88f27b6d2a260f2b6ab12d9b3386f80d78b0951874f8cf63133dc63bb2ebbcd76fc2e8805d8592c5685ca52edbd920df6a4b53718ed2d791f9005e00d1ef679edcd3ebf1719f808bc9c700ec06ace9efbc31d32fe3d033560c3a88cef583e0e2ca13b574c13fb9b297b9d74effd5a4640313abc947bcb48235e330b49da7720cf9fcccd159616af63ab41f5bd0478a8a602d9bc9345c76a1f2c768d0070bc2df3b9762e401c97e8bb2f1d1c6d19058897f729c16fc1cd33a788d110cef8c3e94e29b425e7496b49b33c89321d1774aed8e672925c966d7903d63a11b64323fd284267a03a1d5fa3925e58e785e51b5fd4f6fdad90eb72e7815b31d30f266b8c2f81da0d6983ab8c9e22618eadae426de7031deda7ca17804ef99e46544911d6a769f6ac7b23e441bc96319da1c8323726704782029267afd29635a373c2f97ff12136392efd0528bd44f635503d2b6a7aa3dcb7de011973d9547c7339209d46e40af776701ef86499c7628ba36146d1e12433b552fe630ac42bbe30669a6e871ef3d47e93023ee883ff5300c865707eec9ee9a041f818cd4188046798c741828b83c06ba351ac3a22b6c5d6e905d38ae6e37c40f0eab05871c69e0fcd2a190eb4311cc53219b458caef1b33cf7a71a8e80fba422cc9bf201ee431f7a0b6e77f411ca25b0cb22cdec8c9042bf84d26ef4de0256ec37278ac8722e894c203f5feb8ca2797a02f9d3845afbc130b3d9ec75f427cdd27f7d0449b07dd2a95f73c79ce9038fb03d2af94f4745114b63693ed184d4443adc1c26e7d5f5dc574b4ad1ef626146834229e5c9ed63185b7ee020c950d1ca715589b0a95cb61a2637b8bda10120a0335f616e821e4c2882b6a2bd8fa25bfa88924d14d7e2292e54eb4f7233ace3da17fa6f32ecdf3bf3a4794438f3b9f832e73723d0d393d5596eb48501bfcd3280e11c7b70a73b08927a43c4f28ae722771f07780a46e16bab5c3c937e23d8b55397514cb3a5cce89459f55b72b4088b91caab967ce8fb007747b3f38a3377c599d1fbfda1d4a7ae65002face8fdaca2b083553e87de3f5896e02805156e0d71ee5944fcc450d3938016013a8d0d709d97fa9948ef9207cf2e620eb3f2bedb7529e3901a75719cc88517f5102c4614d6253d2bd9d7f3ef1a96687742503a0360a71dc85094c76be8cda0590c17f0f5856b6c8e9c04d9816f8fa53b6c8394a6c2933e093dfc453042707d7f22f6aa79bc4e0d6fe2cdb17eef233ebdeb8570bbf30a952a69d90df002c1a0480005cb8a6a12713e7de42142ff5848b3fb7ca268e3e2a3b68876b6393064d894b7326f428824b0042c324be77ff4145704f90978a4a6277695ee7ac18805e2ed13220491286fd1039bf11f3b1610a83beb79f175b014af4ffe380c305f36abd6dad40e8e3339f4190bad78145bff7d0ab424c4e3724da2d3e20512c82eeb3075a5f26fed40f12974b1644aafa62b1e97558fc072255533367b0746defebbaf63cd091f31e5b1f0a80e5c22c4c34e1ad68eb0da9b6e09e9df2e4b0e440f8f10812b210395bc14e20474f06d54d54ad78ff27565432b1ac53dd1d64e3d7e9ab7f50875a3c330e759e76a60d351619070e8a1437715316f07157f0333351c899deb20820ea568cb675b71c669325247b479216461feabc23f2797848c42651ab3f4976d9de701e71d5df03180524ae6cb38a5c900f8924638d9271e1d4aee733217a2220062ef1ac5a6bbc00a09b7bcef4cb41146fd734fe0021f35c9287fadb76cde9ecbf00a4f8639982f1e20e837f12e970b55d1111850b10aa575306cc6c88937e41ec789a0f81da85df593a2c7ee0d7185a37efc0d726ef8a8daaa73a9f1b88eda2da7a2624a503349499692a1686c99990affad100801a63f31e2500cb32ed3edd8d85746625b5d94d4225971d6647cdbe4bd87d8bee7d788c2e16218e7a432810dcd67bc6a09266c149f3522282231aa885afc0dc742dbf2a0a645f40e10621d709016b6dc03aa38218ff47f8449dac78300e3abdc899cc161122be8f82e7d86395571c8db99ddfd8a92c2efcd3c0e9c084420cc8b2aa7d4846800d08002259b3ac371590cf50b80d50abae4dadc004c6fc387daf60d0f73e51a4ebbdebd725381e06c13d8afaad461d4bdac6dfb347e95fed32dd84707d07f32ca6244b938a2df10461f6158af9b71d3a2c966fd4e73dea272950b851a9846c02d36ca02d0b4c621e92e8d7300e05c198977b57e34aa1f504a2cca1f7609b776c55828c90c35a604d1f1af9e1e7815fd1dc88852026cd817d3d94a7aae6155ff30f6903703fc50f9ff9eb9f32fe84aae19c40179be7c0e0d927fcceee2312394cab7500696461cd20543469c71922e4c15f3a2840d5407946cb9c13cca6667b9bba34ef5563a2fd26b26adcee9eaad40c506deb068c87c28a25ce4ac7193fb1981c7e03c56ccd12bf8caafe96371002092766ba901f13c105ddae20b71281e304e62c78ef5ff360869eb60b84e979baf76ded16721e89990fef9757c959cf270fdc9007a92d0fe5860f744b21dede2b55f9f9facbed30acb4f27b4623add5a6a1bd44b4074fd531a3e8219129ecc41d81e185dc3b0467fb2b3193cbf141a8f30baccbd51f155ca065344ce171ace7d4a80585a11a6c073a9e3282a338de6fd909d7a9acd2c9685806d11f6b7a7ec843690d08de4758ca4c016eba7dc9475158dd36f00990189bd5b07a54f0256b2b59f1f41a361447127df7aa29af93fbbb1ca757b2b221c4ff0b4c464656ba560250a491a1fddf9344815e6eb19820539aeb0d3aa57ad05424a6be231b5624c67f5a3d28fc18442dd08512d909714dc8874a1c284a204882677679e184128b933d9e96c3a196bc83fc902ed313405ad257de8eaf0c1ef734314afa34d22b70319cdc419cebc698275ad5a7e0f7d0e3ea6634d65714e8183f24c12e8eed247cc5246843acba50287daac8dca394037d93e7e675890364fade86dcf4d2f603b7ed025608e698181ade8fe74a183a460f203a03301d1b6d687b5cd9af18f1266299f29bbebd3d393958679948eff17f5d158dd1457c15827d625e69fb0d0994f255bec67998c9ed902f3154110514b6f2984cf68f5cb7832b6808238148056ba51412fb86afb38d65140d111bf3e1a0d6b5febb1cf09dee7ff98f06b893b65b05a6871d696b1708848668c8621a0858a0aea2316c3a20e1e9346114f45f2c7ab3ba6529b167b7dcbb1f478316de045103127f2830ecd763d92e2372dc5be9d1daba5e0b5dbec18763e8256adcd88c32cf1623a6f54e8bcb99bad1a52ad75c164fdde84c114f6257022b386c038193941422130a3cfdfeb95c416c53b25ebe54777de417e7a79865af4a207329b3f84f366d0a115a3919490b917ef14941df2c6f27cd04f0aa8106e628e92c76b386abf9a35580c325f239808d13633d2359c95f935634f16862110ff3dbb64eda2e78e8b3408b41df9a142ab8e066798910c42a2e2c86f778a7c4c39fe0536876d398fb901f780516ee6f9ef91c001a22391747873aa6dd654e70d66690494da4be7e5a218b911f7c3464ffff6ab5c1ab906105991e9bedc147b01a25e2358f3e3eaa9f7e2cc1d9d06870495f6b00a236a19e17dc205baece553bc2f94b87286bdb113a4d907e11fb802b7fe0dc3748c6ec3ad468e4b3ed691b59714e2f8d78834f7b986706e245d9c5cb9c345d7bb1f6a1137232585459feff0a33b540bbe0f55bb801b70a63ee3423c03db16171fb19821ea326dfe2b6b058de401699069f75d3126a97a81111305bd5b336deb48c95a6c1d60130176523c1a6c1cc658912e047c54912e0da4c0514ba39f9e0cc0d06cb97dd6c367b37d6e4b20fd160b7ab8bf4bdd8fd4ac9920bc6742307d7814a0d64e44f9b0270d492111e8cfc43606b7f509b96ef2e9b1afea5e5b380a4cdbac54b35c5d77e0a53649601884b4e9dcc7265c8e498f944bd43268364c9c57306939b6bc52edec8054d740555c151c6b366a55014353356c4151efe858e441b2afb29f095e4aeeca0a9ac9c91e50b5616c75e515fb0bf67b528f3938124b02d10729b82cb0f88bec6836f3e3548a278eaaf5e6adce52bb018bc2404dcdbe27e4ffbebb16e9d44cbeeddea399ee4662674a28a2ed795576d3dcabc62044de2618792823058d130f0f1509dba8dc43108731970f7dbd05fa5ff17b93b6ce01e5141f63c36b34d11cc29939564804b9cf98fa249f296e16bbef9e1a791500b98c12d3713c4ac9a4cc2366519616a1fa155cd1146e33d8d35c111406c1e900cdfeda1e2bda1602fdb3479910d1254cce02482bdac45fe2188feecdf23492ab460f7765237debf4fa8f7440004671866716f439c3939aee079ae57790828fa349bb9d263a6fc53de1aa65f7c8343b6522fc59a19dea1efc54fd92e99485c3eaa8bc392d5adbe0d2c742cc64d08d007bdd0274dfbd7e4e16846dd8fbc017e984929526eda1fe97c23e71d8381d45648df37bf40dc991d9685a022fcb2430f73a8d1b755e18dc7a335c21f25552c127023ff180623d74fb8dd498c7c0c53986b17384ca4e0b1a67b96217030aa7a24d6c39dc41cb2103491bc06e0cbf638e0967e4d8961d5c5371bf354eb9a6a7529db08ae3ecd5bf60a94215cac55d92a107263f92e2aa3d2f82b120e70737471560f7b132f5d6195b82ceb476ec9a9f86afcdde12742402a5c9b227e582e934e83f8e04cc31d5072c195b491a00ec454738a82b297e36e1b334539516d6f86356708a0ad91bd17a3e2861af30ca145f18c7c98b646ad40de9478993f9918c256e14240ec424ff2200c2c2e9ee77c057e3cedbc9139e2b92032df6e4764cfc00cb65aae672077e2949452beb6341536ef657f79690eaac86aa564a4ee53279d7d0d1bed754bcbc7a245f24a7af98b0d3441b6a1916bf360ebf583cb3968289a564e3bee2055ff209388f81058b852e52243c1c49d7bb9553d1a7b649ce25e6c4a9c335932c39808f37026ea32410be16d7f918bf9d65221268f8996c39bfde4374b02342db7ac237feef2f9ce33994f69f633361f40cd70a9e6550e6c6c6336706df0950c26c55525a9f44bab34ea4a8afd1217c9e9d685badc00a47e5b009e6b15417f3c4591815b1640ce00f2774ba163c94449cef009505adc4ba48b53c434ba1431f1f818916286484b6ccdeb4f76c9259676a760d0f2e9c4695fecdbcd208b0e41e48ed125ea7a28d9be7c7e9565f5e8c921f2bce7c1fd8b03702d2831c039864015159fe7ea8654fde8f5fbce48815bf8955762b616da05f0e0887f2bb9f543611ccf635d94c3a751da38183f71316d079c35b84d7a9e628466c05a04bdc88d3979fdc3fd67c08e578541e6bade0e3161a7a8670a9d294c18f38dff319506a02f9bc8ad80b10d6cce1fb2e68f083b03d83cc02ed8640bd439808fa0e902e9b1bdb51c9db84a41534b246d4e5c3ca981264787129b1164a8d6456cd57d4187f155311b785b7f2de477dd1147a6c114e445221a6ce380101048e1501d44f5898136505f6841ce181730c0e68bda980f9804f9de6be6d8c04235a470124c35c3275b6b78017d61b3f6b8d436161f09091c9ae7db61feec1a27c02bbef8b141dfb41c8e1e268841a225e1fdc6237f6fc61461c18aa4161d06920ffe6744c87bb25d75a6308343d378e13eb44ee71f45f81b16a12a7f16725efc8cb585028e814547180d708f0a2c98d102e0f5a93cd99ac08949ecfc28accfe672a8b9dc0b44fcbad8fd1d461c76a4785d57f3b04ad5f994c4f8a3f60829484df216ec4399961eedee8111bb59b041e9232cb2e5993bd508f2dd3f02caedecf428c0189316ba87f4fa5819c0a9da6a8396dcf9874c9bc4455af3a5263274cea2697faf1f10784c703a3a8079ccc0f26eba12497080e1e73aeb9a8f995a63cfe5a93ead4e1d7ed9921c0c21b78af7ed9d9d516ac8d00726dc9d5c7922829ff2654d64ac3df22dc3e9f27f78b38f3f6a80d63e1ddfeeb59c42768c893168edc5435f85e6a135ca7173c5eb892df138fe7099c7c8829fe128ef49ab75ebc582d3fec530e87b688670d2b3f51a59b437289555cd744da04f10a7100f8080d8d13915d5029a6771b63da6340bc2c2b6cf1e7d87b1df146480e60fd6c53be531c02d7f31a4c50820e5319c61b4931c81b57f89064d8a1f5351c85386f431286892426ea9e95c099215f68c23817d38315e580e39936975036569855f2024f0f339652b4c51e85c75740ae3d9fcb882437dcec022489ba24b4e6993678fd4c85cb6493e69b4ac192fd4f77afdd3e09c51749d9b93a75d90c5ece0c6bd9eaa3a37a5612c74ba301f3eff94add6417bd2204c220f90dfd1c927d606604f87ca2dea73556214ddea13d917414d96099315a11c3d302b2b70961aa432ee50dc165bbba49cf4481907e71258e3e5a0734d19c2f008206abe48c8ba99067c19fadaae9a0899c96abd2ba3ab69162c91a215d5da5881e614f751c69a74c5d8ec0541a44321a03bf1bd64ee391915cd5038d361e37ab2792ac553080363067d2aca54e2722fc544d63423332d8bf308cc08e3d08c33f425ce8e346d51f7e7d94c3cc1d1b7fa20bc3b0b457824f69f89454ab1e1384c73e0e64fd7801919cef697dd5c24df6385aa71062d7e3a04952949e71af3804bd0b3d400cd8cf99a4d4460f3a05c4942d15477e4143f86439ee2be46286be9d90229b1d7881036e0aa80270a7e47164d5b8fea73ffa9d7657d06ce2b364414c833e08604ae54943f49c1c4f7c89eb0bad3a643f4a7bbbd4814726d02b7bc29f6731ed9445a2060d0938178914b0beae8f7e099838356247ea574a3f9f003858424155aa5ec5f318ac715bd218531d2626e1eae94eb99eeb1660916db862ed52f8fbcb132f1c00e3c1376729e78b6e1d22f022392c56cb67974b5fb413a1cb33ca5dad651c35be0ac24951fbaf1c6a8b0e93eb9714428b36af1a3c5f6995523ff86ca18ada0e1b6cff976b0cbbdae3162c284d0474c76219d3142c86f1a0f83351ba91fc487d863d747aaf3b0da2d72cec230043712e2913822629c2d91c62a5338c173fd7228d4769866bf789bc1e85307bc81fa78b8c26c24921b415ef83f2ab4875353c289c387a9e613003ceca0ce96edc0430c8f7db88a81a27067ae909a2b2cd2c8b292459df237653802698c8097552afb80ca8ce6c782812248c4bba259aed93063395176eba28cc17072f5e74c42e4ea9081ee104b169026353b9b976470f4c72e6fddd8f1e26616b5677e805d3d2ac71d51f895544efb86f0793ff0c8b699ea4626fbb2336039e2fc34ca11fbf1aea1ff22461fd60bf7d86bcd6f8f9ae30059de7583b8205e240f05a6f43b61d1a23545c3d531801e60f5c0794345072ea829a7f5084003caa1404b90c9ed84876b9c9a7499308a3e0241a4715f779a33cd5f302756b22df7357fb1a26bab7bf02d2aeea1db427a784fe1a9d878806a85b1fa13fb44416ebdd04746a4245ac7b06423ad9b21e193d5bb0ebd73db5fe8db522014398110173f5bb90341e0d9d38ac4f0990d553be5215d6da88cc15fb5145562bd38466a40dc320aa757493a26e4bd8cc12c5200f4c601ec99795c9210c916bb8941452bfca5eab46cfa7f1f174f4044db3d25c38b3349c5675e004c4d29afccbaf0a363e9610678b55dff82947071db794d94d186aedb80f6ae695c2194f3c7cae24d635670899d996977f0b4e3d4ef54190f2e9eabecb611d8e7836551dbc35009415cbba97e50b5a864094a55b5f20bb49b14d7e15f64cdb496bd219f8267b205aa024299fc8a5df6a7f3f7e94a12bb25854e64b6e281aa943854dc3c31a41a6450c3e1207acf8af9259f792fa99350769d58b6df6dbd1522e7596b6677b66a3f76be6f030e06acecf5f68d8a40c61d20a2bb01c22d8006f467573cc7b600f9bf859aadcf1efbaf2efe1590c3541f316428d05647046be359a52d6328fecd3f17c93f8f6847b2314e552497b4d47dfa1d5c91966a806d1636ae7df95be10bb5dc3d0c5b3aa1157770cd26017947593dd2910fbee83996c68d2ae693c959c7a732c8f3d5e9298123b66665c4cc6e24cf14022179dca80aa8292124653762758480566c448f9079840b2df1d0b4a2b50f644264db1291326804cd95baa7bd0cfa24e649777d366b895cafd16a72b0208812025fa3752c8e5bc6818f5c8ebda7fdd367d7bcf3558e3c7e05de9430f1e5672e579c507279ade88a4b255c3e593f410732bdacd11f0d6ee8464b71c0023ef79ea2a7a406dd5e1be32e97c074e302f73b5d99661b0c36efeb5c721d8297b8b55f92ffe75640d633ccd3a44a2c29f639a6361e462db691cf6b32444d6fbb6c88dc21d63b8db2cda2f012b7b46bbe2b253f4a63e8d0f5c2f637fad48f901167ef8aed89c56b4e7bd5f515c605b809ff0f41fa93b1eb003b85f02ae24deb775aff054ae1a8ef034aded829c7a1f7ccb718d58ff522da9f9393dbd1f130bb1dd5cdb6ee61ac3822826f9f61a678d6f207f3edf9538b5b9014848674b5071b07307b715b5b6f93c871ff56b835457f63366df690e1f806609675b9b6db0af3571b0f04420ca7bff53cb0fb062a0c609fc715ebcad55fcd9497e4e898693c690d7153509f252df84b7e9df9533c8d022876f93c39e017aaf07be45c268241c50b613a830b550dd77e7c9180ee43bdaa5916cd223c1566e96044b96e8053556bcdbe2a5c3b903eea33055eb817d7c36aae87d795f168247f29f19c195617b2e40cd6179ec4bbc577f86cd74d46fc1dea01a4f31f0cf07a7851a87fe99d472bf65330d376ea7cd3a0fe1071380d19a87dfe20e16e7399a10ef84f1560b71b9edc08d4e2d22a6f78a89e383b1edec4140b84191317eeb39055ebe31782fec44a591466b45583cec81642b3a89a6c32881be04c743bd5483b7d9757e0cbc73c3eea1d1155f35bef6af62a5a15b48e58589cf7502dc6432c0da755dbb264a596e9ff0ea95e14e0b0562b6367b27442107acd36a6b2ada732efbb8346349a3cc2b148f8e5894cddd2dd0fa54087e800e8bcb067228008870660f41e9614fc98335cbaf334c659e3fc72b442c32f9f9e23840b860f11fa5bdc2bc99beeecb108f33be8fc359cfb807a56b5b661fa08b1cfd2ad182b3eb3d0f32cf68dc0ba23bff5e92fbcb72b133c1497be6a76886014ef1fdd09dcdd1d58094a7ca599d2c0fd99e351d9695d3dc6462e97fce7b823665d7c94140b893c51efc054de99e2fbd28fdd14b80515a91c98254199a9724b94c61a4d07c3cb19c8ebabe8e3d1fe79488b4652dfe9c0a491f67094c6b0602ac27d3e8e59a6bae0f71147c1d6da1bdbf6cb046d5f7d33d07d225e9cde1d3c43c479ec8428192e2563bee28ff769ab87badaea5a9cb2478527cca698fae8bbf59ac49fb63b13e712d1bc2591f2ab0abdaa9d3e11d44521deb07cd5705d453de9339dc37128e7ed3a52a8e8f8ae270ff56b3e9aa27b596aad85546b9f393cd7e05cf82d89f46848855f0d46a375b08c35fa8b37023f32bb39202bc853543d2b26be7e00dc077438d16d4adb5ca5d8cc13ebc0edabedeaab6fb9229a9cb80e6a4ca9af6df21142f93cd4773821d122a916530cc504f05a0e789dc6b5c4d45c0c3c587944c4178e3685b2c496e4f523d2499a8ae5741501b48646f4bc853c7d6ea48356c717311763a3b16e1e8119f78e78835681cfcc4a1d88308e58659ced19cdcaf467c6383ed4f522cd1292b6d920e4a3e8890df8d0a0beb3729cb54ff02580747172ed7e1a816d35123e32e336c26cb58e608705a78c6346d54f105dd93b8849f1a13da4733d8a46a65b54d2af3399994de7fdd3a6f05446c6a8ddc0e9908c15dc15cacfe11061ac56d0501bd066dd121a212dbc5dc880b641977c325fdfc57cc020f8ca1555e45de688208b5d3533425e706c52bed8dc4a47d5dd7c4bdab9348f25d3cc78f00d0dd9dcc4eba2c731b3f2a7f822858930eb8f8a5b24c8ae664f3b736fa65a9d7cb44e9d7f287492555acfd877544a9b8e83dfd1c2c53a7eb1f48fdb7adf90333a803b247492f5212cb69552b7c4e185fe58c45a12eeb2975309a4cebbad6fdcbe1b25d57aefe23ac25cf7464591e8abb495b4a31bb4ba73d06e290a70055cbda55a452ad41dd15add8b1ce9f8b1158bbf5a5d183bd5280393ccd0e3a42d1779d5113d01cb1539dad3aa061b9e30093babc42a2127fe57d97063f7798610b747f02c495b55f1f4a03a38c706466cdaf789eebf82cca093071bea8499e16fa2c9b57c964415419fa240267b33a50031f358b83de58360e209e0bfb43fc69979a47a799f8a5ba91165129a9f4f59e2d30d61fd6787640ae1cead847455f7d5bc35eb7f29ca7441ad3964ea300e5ef3ebba2bac00ad87d1886c8cc178bf4a13493b29332a54fd01f60405551afc63ec6f9fdff2b4a75c95d80d8d12210192192c6ba568b2d93069b8a8956c10b867d5e442e179426a2b88b213bba8cc037687aa499e0aece384522a29388718309f40d5f82942e2a0f337296f3328f75551eb46ae97225411cba07b7e4892d3331b9a570f154ee6cd99293d4e7d8525187915f47af3c6b395a6270a009b0b258fe00cb0dad6f668d1b71a335a551ec3530321c3ab8a04085574af56c120880866cb76a6587993ef5350a9642e810d2f4f32cd927575943b6834ea1785424080958a12a918d49d2a6be5c1a84d987a5fb3aaf54d8c51aa439b29aeb7d901c9d0107f42bfd1833a87713aaa22570a4f5f96103419c0771f667c33e5c4d444c38406c5562f7b2c145ef83ed86bf8913f5f070f3e0d047c5fd9106249524af2ce9f384926023a33fdf978a4c6df9a03533b524166c5c83334bf89bf4937ff87a76981b750070583c7919014c5835284a422a9cb317cc2fd629746718f3726df44b1c9198542d805a578327e6f1fd548ec43063922866ab83303c1ff9275319f10729824c1fc63a4a9d9b0c89040c238079202a7d0ffb2b69250761152e280c439a2248a70ea2cf3a5a03139a7509e1e3f7f59b602039686a616b4f5f9205e13084a0715fc243b0b8f36239c78bcb3f5fa7867569fc3fdf250e8246dfd16d9601105480788348641dbda7250e6dd392e8bace96ae0ec21c21ed4497eea5da02408dc13a9481db8e0f166cf55f9f01bdea053be32c85d1fa2fe860ee6aa0b9eebb58d8812cff4b624c8a3c1dd43d41e7dae38e94ff6df8298a7fc060102b0fc378415461f26c79721b8faa27f2bffc059f603501228034c3430c865ca3def301c5462462777aaaecb279418d7a7b7d688cc9574cc3ca50094ce3e4393100c51ba8d026eb1888cc988c6d6cf36d056b4e181798d92b630d43b25cf3f02195aa0d4883828a997c9616601e8cceecbff89af12881a496fce5ca5c218c76cd7511add428eba094f587f0fd928198e559c1583e3cff159b1f98af8d2851ee7191ed3bcbabf45348451c26d16910c2932fed577670a07b4308c53ea14ccda7d415d5498c8ace6a6460bad15ac5dcf1967edd2f14610e57630a089742f8a9b13e549ede8ec60dcc72d5360c1dcb25d3ebca23e3467b8830cb08ebfdc9d125fa27c2e588d08f20d2a06632d94224626f56c524e9368bac3a26b52c9a6855d47d72bf04ec0044f52131a431468949f7251b3589fc7549a89b931e9df73ca42375802ee658763eeb567e0698187ebe5f7c15843b7ef6c2f9b375341ef43cf77afd621ba74be86555d996fe834d8c11c1c753d0789ba37669a0996e68b59e35ddf31edf2b04c571cf2433c5727a0b32b1d159f77c60e29e556bb81bdfa3b6b3346f88a0d55a532364d5fecba74da018e715d91c9128acae6558a70269fc85e1d904b20b0aef87fb5b1566f1123053c9dbe3db0d4933a239d53170007ee0119558b90cf63d961f5c15c6992ef22c95b022134317106c7d0c56a1036ac8e167b40d2a44a4c62cdadd5d3c77b74a513b7401f98c682b8b020215be21cd5111ef0ae699946c75f7bd5577ae152761ad8ba03fc9f2f097e265a379b954e2fca6575a2e60391e2e84fd160447724e743ba2571b85126a1c76fe514a1c3de9a781b2da681954eb25662ac8715f2e5069ee3752e78185ef019f9cdd6da7c7dc8a6723ec04ff8f543f441d2661d9a808dd914b8cf7530e1d6de2d74c6a9de31cc5036250388ee29851f0e85112066f01a04fe1ee405592049484b0793105390ab6a5dc7168210d89269914eca8fbfea500c077f28a69ce1a366a38fad2093d0cb276f721ffe4c59c1ba6126fa8ee071af515b3de22bc96b8dcf6a4ade847a01d7e4135292718a2d2e0add0384d7a79d3e56cfd25428d885e55ffae1f5556d0ee2f5587346c220e8003bf1a7916dc3ca915a4c8e71b2bc18b5edb5e934e8625bd7c7c29189d842c36baca0a7c06b4c1ba8f1a3579306f4caf559f016df8a5c5ae96a902a7c040f91e3c5fb9848df1702bf09e365c663061b02fd199f3d162d24164533affc4c8f6f8bd8bdf3b6c901e2178e43a27301a1c5902a1eaf1fb4f85e50cb5a2c85b4c02d20a4a5bb47b118072765f140e32963e40f5557b9222666ce8641b8bba8e5c592efdf3d38c801c5aaeba71183ee74c05d48de3da28b21bf531eac910008b6a7c3baba9e60560f036c32c16e6bfd7deb9d16896f5369d2579dea22aa2186a3869be52b3f636f34ce97c0de6d9601f8bc195c59288260b8228852f382aee59d7b668a1b763ddc3134f99113ba7afaeeefaf674025afb1db183dce84c915782a9228ca94834e4cc1f265b5fedb66504aa60d1cd82d548a830e8dea02aca52ec47fed7cd5d296e693c9f7ecfc67a80cb721aa7419db0ecdc2c08d6ec1401428972bdccc593043a5aac9bf824b70ca074d7f63aacf9ba6e72c9a248f78753b509971f0aaf4e79f386e7c1811e8699d46217d87a31d101becc98f8f8c757e510dcf7826f05b43f969dc401b814051845c36cff8c00fd1331ef31efb95bfa324c0cca391282cf75258585e3346cd91b21fe5da95ab2caf814a6784396b7469f4acbcb3603d5af5bcfb15c84f3bf4c6754d404feae786d2f176fe7783effc714a0f7910cba6f00bf6bc4ca2da359ed3734c5f28aa257b84e3a0776281ce2d7902a65c96457c311c89041abf41fc61ecf7647f0712bed908daa0021b0700b1b0c68bd720bef443c118f0baf120fe7c5fa213b5d23c017cff4692b9dd95df857295628c29cdad5c08cba7ce5ba53514834d74a4b660f9f1fbccca1e83e10e89ec0578c0959668fb436e51189053dc331d42a1607c679e4090c6017192103872cfb02f300d47343d7ea10117fea905532dd6b61630d189c501325e06b64d53602cad5aa31e1fbc82c2c8682fa16dc798b0c73216b402a849b564a524e27e620e0855102f3b91be8434700030511c12e84a21d75dd77f95f2f05e1de40da2578d4875106cc53a0864cd573bdac96f65b36950b00ab1cb04bb2e6edeb1f6c4ba90ee0cf09bc347dd955379566a24c742f3ce626edf6fb38ef185be73ece603ca1d3466676a39d692c74f04436c495d269b866c09281724f914bfcf6d0d5be93159e8abc18a72206403c0b50e5f271d7d66a047584f1039157516e222941ec506620025c6981f4a6585424d87751a7eb762dce3a2ea1207608e229a3c72abdfeb845a2660b28ad6393c294f5bdd3ba0527022580a06847c71c7d98f16454a88799e90a43006d69ddcbafdc6a5eca74524bff1002a2ca910682fcf5d991e3173ef3fe1fdbbdde64fe6b2a70ceacfccfde4aae81e146ae88426669d7a754ef29fb52315b25c48e2d84d65d9bc3109bf3c852af1a87189891c9e3260989ce8920dec1fcc835c959d088fa1b5483dec5a5fb397cd273d77942f7389a656c00fec3284ca0fddedb3ad337e8476c8b0eddcef591187079ba00a7a14e1405ffce9f50580e6aae652b7f12c1fc4d514c239bf2a95559663cc0fc85be6c58b023bac754404064b778205e52d894c70d6b31377ad734e5081d885060aca23e4dccd3403c9d535b8557279fed82c690aa12818c3edbb64742ad8f092b6046be6148ccaf2e0363c7d85330eee4afa7237802a6820221863e51e3fd6f9f5c3989db6ebebad5017e3490e1b5a9cba19b40dc91b49f9e914a4ee728e6a3213f33e1c94be3eaa61781603e32ba41ad8a4c5afd5cb9a9f3579e4eccb60e4f8a7739b1432a81a63fc3b5258f0e791d65c7cc97c94bbece688256fe0bfcca66596bc717d75338d89925da126fc4b43e28b0c02d6999af0c197f7ad3d15c4738aba0092ae1952f60891813147fc45c8589f74aecbba9a0827c72bf14fc06253b1971f276c75eb4c1536cc634eb220177d8035cca3cab29519b34cb2d55100f7498bc1f79da8533100e7cb7e9a87b35b5099955e5b47300d6a5fbc880aa020b7096a66bfd34ec19ac5467fdb43552b501ff4a4de5548a9385aa40b3edbcddd0c6fe3702c6137d40cc2dc28974692ea53048e60ba53e777e7ef3f4ab010c57b996431925994d498b6d43c15960162296a1ccd0a4499506644b98dec60f25e7e3ddf029ff067f1b499d4537ee4627537e3b3adc02a3f46cb0588341f116ab5d428cfcd860aa4c1e0d8ab668e0e01471d9597e7e0c7674e242dff7bf02a161d79303d0267d6ffe279dae4e8d0a9be9d9e6c057c8678b79b8afa40e9ea24387e2a217f6c2c4a1e94933567a43242d3a9856c3eb5a175d445abc9a8d09a7b5c586b22d8d0f535a88b6c64b46b4c2f7206ae474fe843962056d41c58a70fa86dbc83c875a6ec6f9cd9a879084ed19a3999aff795a996c9c084b75b33e88f5f374fa92e1e03193c6e45a02ffac065d5ae1bd7d62232c4dca862914b2aeb724f14f498f11c528cdb68b16bc46482c5e5b3d13634d3ec8e67c3e552b4664fbc3cfc123082dab5e560c1aff0aebcb9f4b6ec8dcf5b1b231baa59c32b5578ccc54b109e43e7160ea7207805dd334c63cf758e04362c69d093c1b68c6ac2de3bd707cfcd8da8066765ea5bdea941139c0db092dfffea54808cef8a232694177ab17d7f5c97289389347b83cb33dc72ef157b298766295c4111f8ff25f8f1b38ba00af6074eaee86b17e192db2932c3165eddaa1ee46d355232ee844456497ba8e103a5f6e611e7fe72f900798b31747a88eb6800d09bbf09d34bad628dc7a1b00e1f81ad874619b5f1a8852aa0aef05fbb5b5990e672ab6332d7a0fa638c14a0a0ee024549459dad99a125d15af537c977802974e4944d1000633b8fb48cff0945154ee69047c5c1050e0aac8a581f89c3447aa458d114fb42239cfbd132abdffb87b08e1e15f3354e4944f12f4e85037394897ca3d0a512183ffca8cbf1092e98d3abcff28f118a3a72a0c4f6ee83db674a0647e513684846c39db1c6d4f061eb3b6a147be006d31a3eae30bd86082595a0f136d6993e0cc071c81c9b9112528383107648ce3aaddb6e7be075ba1f4012c601a514368008dd85b2ea506d8719b805112227ff171b2a6c4aeb290d42437939b2442592cdfe67a48ea5227388026a0b21283a8f870281d2fe97973738efb8c499aaf3ded77fb2819a82efade8eba95330e93e2405fb3b11cb012bbbe3a2197220eb55d9de7d63af674dbc1064eb63ea6facc21cb214a1fdf9d8e96f05c7946005ff67294a825168fc654335ba99bb381fcc4216b76da9ecf19989e7097df11dd7e6a4915717d7f8b2d924c35506e02318ee603c74061c9fcc813ca58c1af09d21c4ba754f020bc4609b728edcf2d7c2e4a3248dd5405719c9e98df80bbb63c40c8e8bb99c233688a6dda36e873189e228c9574d37099dbe2dbb8f318b86af32aae615e67e46d290b256fd26a398d4fca71691f8ca390b9c7af221f079b2e02e1072bea6b05be4bcf656704ff2a980bef27498ebccfe51e289a86fb44a365419be647ebd08c180e2d256aadab69c3080a499f9030dd9b96f0779117d964c0c8d0936c88f132cfeee15365592e46daa6f1f5c884264af51f876c169010a69dae6fbc3382f048de9bf61338b73f4ab5f02d2ca32f84f91c45a7ef25a34a9d4daf98d36a26a1592cfc366999369f75d1fda2262695fff49a071a14afa7bbbe72385e9be60a9b21df9e09f435e88c09b615185c564375cb2d1433dda29d0a9cd5eca59376dbe4ee6b4f467e2296a18aa4f81ac02213296990b283a1d36c579e8dfb8f846e4330d139c598fd94cfa777f3081f2bfca1cda029e63da1b946f213f9da70cc6e29afe479444673a73ba945a1802fd87f7f299165abd1499c79da2684f26c901677ea1e453cf7a39e774b128905eee31cc996dbcc17c040c9359a9f1bac8dd063436c783b225e722f0312bf93730a1f5cfe16de425ed030b6065e85f8fdd6d7734ec1981d52205fffe8daf6d5224b8137bc05981ea3109d4fca1be0c810e99307cfb8a4e131f1ab357b785ae0425e8868d71724b79f5a71cfe61b8cfdd9327de5a1431b1bc77fdc804339982b96e026d4ce8ad1f53cc98001121e2f5225b4fb84a22469deab4fd2780d8e76b3703d467a465634aa08f79f01e34000bcf3f011b009c28b42c75a45111ca824441c147a89a7cdde1b242cac3e6443f8c2dbe8a20151f4962d6f62364420d65fff06d5f034d2da4b2746818b286b09ea7bed83fc13b256318e407c81384a7063382ca1f8bf6bc4e48517fe08c6297b06d0cbd6019414690a29fd30cd9c4342854e4b67f347c861beedf4b02b3d424cc0ac0a4b78410952cf11b4f2166f90f053cbf38fd104af7161ee364fefd5211423bbab5449cc5e7f035f2a2b1bbb313e110d0ee4d1b6b58d44c1c3de90c0fd0beb54ad1dc064b6b787c8ecce420137a3ed3417039de9765813397e3cd8bdb4d0ff0a2b7d9a6ca0031f1950fd96f9012f35f4973175c656443217d9fc8dabcbb458d9f112ec68a7987a40ca812b17fc5bd67f6ca70d89df2fd88d6cbe9f44f2f924f355860541ae6f936a94a6fc65b636c0516b10c5029573b44d9a529926d1ee84abaf68daacb8d4af046de4cb1747fb7a8b9d23052118b534a81f5bf6078bac85b7666cdd3e3f5294c198a43cf0e9edc3279d288bbafca0caa7ba44c50d432ffa00869c0d3e1a859c73bef7c9142888e02a6188e5aef0f762b117949480a72aef49fd642f2a7a2bcccd4a20a0080b249aa1608392fdcb81c6249d32d21e83c2d04c65f5542243e052756976bf7243471efcbace1a614f4ea7ed4de64a7ccf7a5900212a51db03b34be2f41b563ddd989fd079a732d01569dbf802727ab65aec2fcac2df7a1b7cfd05749930a77644d4d55c136fe5aa47a2dee5d9004a373c0136c9e2385c666fd415dc1a4e4d3f0061d313db364f6294f60f2f0ee974bb3662bf87ed336634c4531f8b3d051a9fce19790eb924b833ebe8c045ad312ee7825df5b41d45516708d2f9ed2831f2ca1739cdccffa17a318e66b94011c975c1721d8b63593596450b23d0e9b6cfcbb9ea1c1285abb561b1cfbb96417c8b4f922f6ab7f2b0ebd44b9c3ea59178d252b384387f44bbe22e05b00ca713dc5e67367f98fb8cea641c7e803d7493737022d1ac1da6b41f48839342eabb19687401211ce6f77d45871e878f9d2c18b1b837d4611640dba82e3fcb827ea1bbc432541546c2bda81a01879bb2fcff748711895c0ce8d47338c150faec01c85fd8f7b8707f37707474b9fc378479f3f5b93e593102acce44de8a84fb2c62c350716904f1ebe596ff6874ce5cc800a16f6af99dde74494af689128fa7b4b0ea2d2b986504cdc4f64ee8a74462ac3b51824b59751aa3191bbb0e70af3a16a865604df4356e8b3157aa03b55f192b45f72d95fc552c96e033a827c6f5937da44d6b16c78c5d43824603f495ce7d309ac420e9061dab768eafa78c0f7bc4cf3e57ef391bfdbf7e74aaeabaa204e8152e0061a6c2a71be0e8aefa0fc6aade9e994bb5439b7ba8de53456d61a84d1d59c867e50ea969df1cebd011d801e9a3139ed3bc2d0524f99c2234461e22545a408d539650b381defaa4f9a35106aaf89c038acce3623a0e9d0eeb3d3471246e03720a60b6c748f3368de922502319eb716bd260d74cd03a364c97f76bcb97c70018dfe9e26f6982703eb3e3ce831deb0a2dacc92b5d8576e358da850fb49e084a202fdf5d97f57dd4d145e48068c85a0fa46ab1836e560827aa32802c61544700fb0e0a97206ee0dfbd650645e99c0a686fc7b5f2d9fd95f693ff61dd34ff208cd4f3c26eed4a6267dbf574c3f60e4aa680e741271bdc522d21eaa5ac46fdce781b6c9a380766e3ec3372c75f2c57014a42735d20ebdc007bc41dcbcc3a808ddbdd24f99af727c1e42b24d9d9505b3973164e6068ffdd8d172f8b1204a558a34d38a743e5cb88797a53bc4de440feec468754caf0e2c341679e6840dcb677103d87f343db996a5996a20e60af6355c6392af3b5c90ab0fb180c9a20960d0e07efe1df80c242382306ef787514f4c186bdb9a514f76cb587dd556e793f36878c9c6e725db870ec5e7c5d06244cc3e4e6d1c64bde84779756cddd44f66391dd7077618d51985ca45cb8010681b75d7112f4e423a217bbc403c3e4432225afb5356ab59f57109fb3ebdcc919dba08b8e073123a789de7669b91a50dbdbc5b866b23c783198f4ba3b555c71f2ec457c5974f358a687724f111532c3d9ecf3c947ba5c1476720ff0fcea5ee031a0f282ef3e319450b873705f0a12d108442166e4494f4d82f2d89c3288c7b7ac5177037682bf9d0e0f404071f1f2dd1848fc8df11f88a1f5be4b4fc098161b2233d17c92acb861e5e78b83d2add5c58dfe591193fcf52413ef7bc7fc3102feb4c87d8f0ccdf64177626125f357470ee2766f9f806e8ca4bd79e2311136ccc045bad10ab2d691de1cc6399433e4b1f77b2eb47f3f39d32a98f2c96a93b0303c96fd8a2d8ac0a37825f07da91a8d6a7a270f0d43717402620713050032c60267abfd294e53a0a9150eb65445455e32e6ed4dbbae7858be4d8841e28ae254101843e3f887e369e7668ac383c38924ea08a1eea05051ac7d754e87324c60e805bc12766e826a6c7082d65a9e4be20c7ebb4511f6a642345129e55156d5d57442846aa5c83387d82cbcd64664cb737a171cb1b6ce97b174e37166aaded1ef2358695be1c94ccdb91495f6692e1114ea21bc920e6380fd997057788767c30cfbef53b81a9f2289eca0a4804b048f7150b844cc93e49c3911e6257f9a3ac2ffbd669a9064ff28556c04215c11ee35d110c7b555b0ddddf12078f2ec44d6d95e3d0686098a6848f3c6a78b55845443ba6b16ddfeef16f8c6015328ed8d5c29ec088ecca5dea9d0cd9b68fa4200671e553c2955620e651ed6fb4efef1846a70878639ca22622116f5fb8b7617b348dd54b60fe3901027444abc18337eec0936a3a880b01a74cd97ee2be11d8972df3af7b2f2d384b22fc6ff64264f698a3d0ead5aa4e63d913c93f13bedb0ba8a5f7af021e9db01fc76c5e4fe944ab6b7964baeebdb6dd3c056e20b70615296a5061126ee1c6f4947ce69e08c4b99c4aeaed95e91b99aa0336c2ead865cd1e507aba16d2f88fc695a47ddf946fe0c19f511602d98ffe48b51ffd11f3353dcd139bedd76969ce674cc201d681c2ebb7fc5ca21e4bc53864de4ef0f96c8c1513cd01e26982aea0bec34c8791f0677bad5ef617643321e164506ee4c16cea4a2070bf64b42002c34866ab19360ddc3557576f9add31d6feff031b49eb6e490922dca732e7a368e6b131910092f574b5573760ec0cf788a16a40dcb9bcb91e2e1bf455e3e310563d0fc8997bf67b76f03b109e46e862bc27da116018ca32887896bda74a05ea5c111daee99100b11665670fa740cddd8278ca3f9eaa110385b60f11db22479dc7c6cc85421681278dd2200b23cbfa8fe618d275137688d335111b2823082cb66c37f76104be175c918f9fdcd86cfc34cd8065524ddc8e741195f7a9785b8b791d996dde34e1ca109887ee18def52ecfb4df4b759483442f4d0112a357e35321dd1f325e5e30eb3c97d8230d1e84c5ac2295f54f12608c78391ae7a69f18c647cafbc20832684d3c06f12e8443291b8072c4c99e1b8cfc1720bd5e19beaff324ae5f874cd0af84ce694d00dd84bf894122bf6a53199d2ea8057db37e14e9a057be7a7dc82a36a8b50bb9243e9c61b9843cb8867c50ef273781088640da142595f80997db8b485275eae9ca772ded5f9fd685ff701d2ed3314de89634274ffb921639ae2b3b2e6dffd395ba0d77c0722060bd2d94ca323b937e2b8056ac6dcf2afa5ff00be75fb102e9e7c947066001e80c7a519c3503a727a3df72ca339f8db338a7a6e2b974d68b5e4a2f75cd283571ed90916b2c619b09e3c9f4102e74fc9b479171f05676c35ee8b2dcac462c8c223fa371d7b3c1fdbe4b04d20ec20075bf13ce68a7d1fe73526ea8cd829f32d79e0b1eea0ec7b7afa64fc135f9c8cc002d2e2a90351102231ec9a2962fb96d8d8f4891e2246ff9130197047cad5adca757c74437d21bc9c805a837a4b62636b5149e15c02e26ebf6ac42383ca48cb489a5c08820deb1bf9a309e0111b3d42ea3cdf09b581346ea12c69a80cf47e7b427fe0d5c641ed1e23538b315cd23d267931875064a8f537965db436f47269a60d6b6e1464596d9179e3c82ef4851c9738c34062613ded7d4cb8298c60c9f7a96f4b109bd75dbb9e2620a1a9e8954c3c68034ff67fedb3adcea225a5d96a5e03dbc81934f53406b997f454af585772711a7b3cc9d3535f66c80d2c12cc3e3d1813975321fde4493058b784769d137e9ce2a4a66e511f2c327e93334e40cc3ea1fc6f03c2aea330ceb0dc3e340073948f5d991cbdb0d2715dde35a11949f013bbf3d4d90749db3b2849907eb584edf1cbd951787be304de7989053b9e384ef79278f749267ab4c62c946a260eb9e66fa223992b44e564ec5c45edc0355c3c0370a9524e4429ed68c90cc30d123bf40994bd14c25a754510940cf2ee9c14630de2b52efb7a3b8c7781f2ec77c2193a8a0941e37eca682b2fd337c74a4bb12a0f1477758d9759f3f07424488568e1ae9c706c6b08ba1b8b868a9146b9667f85e41b9b7664fb433d04d67ff32bcc966df0d2044ffe35ef26bc05ce25917c1b492822e9d4de0064696d9df6bd8b280e1dfb7610715349ed3ff83da7639edb2896ddb0ac3be364a6369e6449a0ec7fa322a11b6d66a83c205378391d746bf7e12bbb1c7aa988fe8c08be9a0d793ef08a8f3ba56f32589d7a2303d665c4568616a7e477a2975a1fecc8ae785e61ef148056da1dcbaae4f2bdb96d37bbe87894292dde0eec39c426a342190168a17698ca7ad319cee9ee5f26a0c174174588ba1b61959206ed371367f505759d6481572db2376a285d09ad2f92378797e10881072dc8463f4a2e00d85778c46642a0895f65b071b1803995420fbc871ad2a698552a936d99e7ee844b306c450cb021fd073532159225a4ce29179c47c506b9429cb28dca138eed324291084cbabc2c4b3c724d1977d463dcfdd439435132eff08401140358b5e7abcf00decccd5df4012ac2530a2990c6455664eb910c589bd951c91a8c30c7eeddd785993d835d1000f87fa1f046c26fe7a034b14f9beb1b1e89d68662092e629c149e423a359f7659696f27457496e3e2289c1d84321e371dcad42e5ea4cef279ab217b78dd2df8eaa6586f08b01a9ac77b200206e079f6ce107464f3568d586e9375f2d383a182132f99ac15ed8c2d15b75cc4e6c8c3148e6e3699c12251a83eea859cbb988ae03ddadcbce8b49d04372a319a446eefa6ee2da51c6342519363918aa982b18bc5700a4a5f8a5c1a77f38bdfc67fdb089df5380de99ad73fd168234569e22957c80e214b52f698cc912a0fa817c4ac45cf732251e4ac8180c015ddf2728f271a0bb63b40ede29c23487e5dd5d7f3b75836693ac86ce070aa6def697a6b13062f5e6d6a0822a5143a14b28e60ad60ac30236ef71e96dcde405d68b3071941b79c0f70cae1905a78e7ef9c73c4c167743621afff5112adb2488ab866e35af5acbd6bb9e0fd2f8174feb0e3e3dca055ba9429705d6c668d8ed95c88561c50b84e8fe5c69720d7eed3a83237963f461e8627a0b1ff92d492842afb7a14eb436686ce71e43df5b7fbe7c4948ceefd6dda4509c836d46d619f25690c2b8cc1f2a69a20456607c8da030ae6f9508d85508c22eebec9e79505504022674a2a9ffa6bb1e54724326aa91d41883c53648b077be2e9e5864a4d5b5bf29bbb283db8a055020c877aa42b08a957206b8b547f34b5b692aeed043340a3332b229d6824575088f84851072afbb648f8a0ed3ab031f3134107ca614880eab57acb8ff718a2d23b6b9b0354f76a1479fe00fc676a4659bbb04e03bebc62c60ad9f56b6d4b5e4c959e430947d35a1f75638c200c71644cb4485941e2756dc00f9df4ea80f8ab3f86af5a7eba9481116bca9b7d24b74cebae16955fd8ec94c1d3a2d957684188824674aada8da4f87a5d10683a8860a50e1e9834c6ff5544dae0ab7be4280a713ace8cf28b405f8ec4269767a74649e12ef07b5a19050d218c530d6c29ea1b18d2133cdab7f0fa43661851b6da737116e2dbc401d208b2453be61488c657218efc64e520466f1c21892710ebad3dd9b8983ae22c92ab7004ecfbd06933ad5d31d3094b0131825b10499aac357cf4908b374efd10c81b5fc939b6c5a3107a2ad3b5f4084ba4cdc24d13e43c57e2ede44e60a3bab70e71f709c4c0a8dabd805adc12c73a9b01e9ba9f4aebbfb478677b6f6460bb135297dce487435f47bea5e4532e3182be4d2ddd3f2f06440a93005e4abd6009eaf521242c6fdcd1f2eebb3d5dc853f591835907b414ad9b16287f084e8fb174dc7a696d70fcf195d4a511c921dc79e00659595b6550edff40083121a4c8ab8ab7875be3813e1c34e63877092b656882cc976f995a34cf117cc30e30844707e4164eb91bdff4c166e262b7dc128b2e87620fe26d3fca32a9bad41a95d1df3ce2881bf832416b5d6692a128c3dfa0a1b31136f669b4dee3ecd1a7363749172cffe0787cb6870a47e700f2259d43515406836181ad5776a8ff3cf5915910f586ad919cf875cfc3d35a3f814e21c9f4d921956a29a1ecbcb9033b54a817eb0725fb3931db55a027a8fadd840dd7e0e0c691a67e4c1adb61efacca5ce07ea28bfcfe5112d0e6c896e5687b236ae1f0c949f0c89ed968f07fe49297b2680fe27428de7411d3932f50a040d2dd4bd89d172d49ff3fbf993857eb30d0e19763662ee4f6add3b37e273ce65ca70b2693b88e508b53031ac7e5290d114abdd77432c2f8a7636ea85a2061337365374d623ce9812dea8d0fafc9a660aed715a386562846ed94a55f3868e0a151c186032f68fe65d038118f1b94e1f8fc3ce80f73af3ea65834d8556f459e9929086e65b19a44cd97081fd46071e82c841a3dcf2d76c1b23160f54ab5cd0912bfa3a23af989069580d7429db033ccbd7d5a3f4fb66f258b8dfabf16d52cbf992472b16cb8a193456e3c322d5f736984f7daa2fd5b0e63d3c191796954326321b8e94766e9644a5f79b3ca394bc1801a8abbf45241e6a3b0c36dc59030af7e385591bff1a54e6b622f888d034051a56c7c3d650ae8431f405021ab8949c8e750bfcfed5b3f1bf58e174e9e43f295198121a2fafe3eef746207baa44d77e3eac97d47a901e7cdb769e9144942a282cb7682351a744af2b8ed865d21ac51a3c331b63ea5ea00b35610ca36a66e9cfaa87dcb546d6e31684bf197221d16141a81455d64e628a8677efd0479cc0c47ba845def81d7e79d86864652099ac6b02ea28c40d10aa366aec23a5326b71b5e1fd66d78b813324008538efe2fff289e51c461a7cb218a7c80f1ba0869f89334564c112251219d7d849c944d57614ae5bb442268e24c9bc069058122b911e703b2c24c3e24dd65bc8bb350eaa8aadfeada52920d779f13e11b2687d73ab80044965e09268789a6c090969da3b0cada66c38bbf1995368660b35a83d7ae06a7b843ce2bece287ff51a02abdc6b378b9d65199ef0a72d20219495fad061224d241165a544a7d7df22322786e74f59199b682bb014a98c170b1a39e52e9ee645184637613838b0bcee7f792d0e03dbf492390f1790c107a2174864ccc009e34995b029074e0da5cb58f52282adbb03e9028c0abd48f6d5b7c9f01f98617ada1e93d0d45a79a2718f3630cb1e3c51846d0612e8c08560b304fcf4031ae96694572056b24a07159d088bb37ab4d38d0835da51aa8c37e30f5a145d4c1f95f6dc3df41cdc7f89ef4d0f2b5a280998d1ba9eb8412d2862063671b8617458bcf0b2f0f1ec2812f7f2761e7dfffffffd4ff6265bee2d654a29052f0909092809ce0c050a43f9ccf8d1c44ddcf4352971539307e1f0516742ac3d6a5dbd42724b7dd9fc3ca8fbeffba17383d983d887bd51c70d75eab85023759a5d17e2f0e1e0416ce54aa7ea1eb041aa30871d390e0a6a3f053d67ffcb2891992425e1cde6264dd3b4ef4971d4cb90a3529b73e0d8337e4ca0107165e241dd771772538bad43863772541f018ddcc568d62eb1ee9ba29a9aa2a2fa888df6a14bd045f40aa494b2e3af518110203cedf9c9987f64f899305e3d5445e1ad90c4a9cb4c9849163281ea611f1c877084a96cd42d1ac2b6d57449ed1f4965186973936ef5373b912d6cd01622691af600e23853bc71998a780884890e15deb8501cf3e9130927c0a30f5b1c72802465044a9850b932f11828bc02ff0e063434a82b266aefa0f6e43250672797b75f9ed05f000b51a52376c09efe3eea3e2266ef9fb94e0cade383c7beb277cfe33a23d5afff0e9d11eb80e13430e71b9c4c46dc83ad48791ba31fbd1a43e37c37bffbe272409de73136a845b01d436aa2d322d890b29d76f2203e8a2151a49c6e9edff9ca2a223b5fa444f3f0ecfc0fcfb42cdbf99dffd1debefa1d2794f27213c2d884decb6f0731d3afbff7dc04695e32135be11edc85d9c94a759b1f3d1e48ddc426ec02d6bc0b1b74816df917e9d80eac2316557301998f79ffde52cb473794783c3ff2110f0fe223a46ec23d3ac63aba466a529d06dc15c720d6b907af8e7ef758cb239a221ec4aabdfd349ff0003ecf67df4478be48892cdc164130ccbec33103b59f871ef96ad7d91d3ee1e19fc7860f79c2a29eff4109d80b75e67b106aa05977f5fbde2a88664f5bf43e87178a586887e71b7cc2f319f8c4033c3c3c3cdfe11310f0b0f33c08ad6a084f58d4423b3fb3aa31e11111c3802fe048a3e24153537c446b67db59366512de8a65124edf18b1947e32cc69f2be7e75de56bf9cfd59fb6ff8851e73ee5e1385c73e4516575cb982a972303844fce910c77149781c87f38437e79cf3bd07daf371e1ae8be33ec5fdc671e17844acdc770dc4f5d4719d3490882b8d3571dded5f778f66d6b1dddd9e725f9d205efbbd7638f650a9171cd7dd3dbbbbbbbb7fdcdd6def6e6fdeedac05dc7577777757ce4ca3a9996974cb34ba750bd26dbec875edb7c1d1aca7af48a5964d2a25d5b2d9867b1bee6db8b7118458d6d3e7ba66f681d9febb1b11397f58477f90ae1b4d6faba3b5acb8f087cae933ebfef17136862e071151e1bbe1e9f413e9d40bb4ce6696cd9612bc5977c90a2c5450c192153c5802133db0024a18fe194b4e9bee54ae7a93744529cfa49487aee88af2d015a53c5c4ab2945366736bee91fdbae473727e952bf0ef6b85ea95ab0ca0ca5f06d23ced3dee91bd7c0d7cb1454dd334eda56a487b5074e2699ffd1845f65ef5e4d4fe47b714c3355442fa7f34ab8064ffeb929f8121eb604de1f5e414eb90bf2579628b5286485e5213545ac1e447e218c21be9d10976000589082780810410d60b2a595260858923a27cb1031e1891a9209531690172d5a985b15a9af2059309aad49e9e7c8a55952750a8f2fbc91be9aaab02085594f09c78fc19674870ce3a42c2ca61d3ce5e526609ca30c489976551781e645dfefead0d2a00b7fc671886ef0faa3f0c3cfe1838d411c22f9f439db9350b695a74cf62e08d2c030c91610daf9f25a5f8f9fea19c3635ad8a25740828a92a8c84d08670da88c888d0429b9060c6b42a6210845400115332294700e19222796b992081028a60f2a2601a9c24555125081a58f0e4ada50ff3c34fffb444e07575ab40614104d4173e8881020ea0b4a0700694127c48c38725218c98c263eed147abf6be1d3e2cd981ded7a2949ffd942c9d78f2b746e1c9ae6357bbe31eeb7d2357395d7ede1a9ef410c90c8e81100294cabf2f50d58f2ac74ea344a5cb4a6e97fe3a92fde55355551f1d5413eb9c90a830421dc594142a3fd4714775679f3ae006f81085038fdd3d03def2e7a4e598f66662726a402ca5c494b4af557b47b5796ef1cbbbcccbbbee2f594a29a53fbbcbe94bf8944b48ba03954ae876ce5156ded1d7dd7d6ed7ed673ea1a2f639e62d89f1111bcd1a780cfeb64422146a9af1f33da97ec8321f7461fc90c4053318021b48b0f1c4162ef025234820fc208d0dc30a2c54502e62204608360c2a94e820a2a80111413461c51629e613543cc992bc20aac9921c3861841c2009c9d45da2e2045418415997ec52aeaffb0fbbfbe24ccdc9a5e694bed3478b3b7d939967ef99d30f86393316acf4f9b548a9d47c6a99bb53f7fc05e27f546366667a84d37eaa25993d70f70b7082f0f8a1b668f16056ee53cdd9c185bd9d7c7f22d520c1db976afcd775b787fc662224b23e89e92c8085e6b3d00c8f3aa1f93a4160aa3f4cf5704c529f7c6086d45beeee04b1723034cbb22ca39452174cf1831a34955fa3495514c10a57f9b31774107e90aafc13092a5e9040c2a0326f7142e5a5f27753073989caef7d4a4cb85229156b4e9516540e42f570fc9a9fd54032955fb008c112a1a5e2a3eed2882bdd3d0c222485a12eb8a89d85d3c3f1abac22bcad445cc765ea2534163ff6c5aafc3204d9170aebe2e7df262a767fc0b053f97128eaa0258201c870aa2cb20462142af38e0dc76d5a29a1b0af7d16703b65f33c4de129970bed7aa8bd7358973fcbe51ea52c5072994b1135449f2975dc2ce28e9fce615ffcfe1c730846731e86d7bf54c695daaa20371e185eff4ef94d4260d2fd532e9722597cab8ff53378fde1f91cfe04d90d77f8ec87496818d2a2ff0c59a101dc86212d36ebb4dca1c8779ae8209ea45dca12abeeee51aaf7cb65225c8a649101240da4e3d3891cd471b354c7411d774bf528ef70e4a3f61f4a0668a0558281d2376178232321212121f506161529215f7e92da034c93d0f65c4759ddacdab1fa4383194461243662a7f6b3d20a414a93d52285c6af528e924003a1f954cb32b044a7a713b51f072ee30ac99be1c849d38974007054e0c9dfd1416c44b776ecf0f161b1562b24a4f1e767859eb61a74eb679b81f7c3492218346852e43b25fa026fa49e5786a7d33a5078d5078f1778238fca38108166566c70813ea7d2c7f3993eddd215e73b28579cd3bb5d91f967bef2ce8afcddb6f85795c70fc2aabf6ae367086e7f59e342559875f9b30e73577f1fa52ed5ff874850007649698b231dc5a4388247f5e75e985e411d3b987ded7bdf60e99ccbcc54db750791cc5dba31f306aeb7e6fc49837431b8658d3f9472f85e1adeaf385948f0ba21b4940fb2094b5a1c5551a3cb4c428225253021e1042dda50c284c2092d2fe20c1b6981b0c61426a2a8c0093880811a501c21460649218f5220b865ddb4c06b4e22c47df645a9df3e891038c45beea4d39fd2e94f7d12a1a26d2bcab62442dbe72d29bc19c6accbe927e4de7b19702a9e0c9d0af94984f8a5b7fc930811f156f69fb7fc95b0818b94b0617e1616cd90c32cd4b1613eff0c89784b4847fefc2a3cf0c75b2ea512549f413f713390992a85711b55d5811ca8937d12213ff256160e31ea286fd14f228484236909a698d00a29c14f7f8557c286feedc322ef3bea578876a863c3f6fd423a94071dbd6a8067ba4c7e5405a5a19199c42d7370e3c3dfeff6d53bdfbcaf9d97cf6a480fd3d81e9cc43ae4b7e49dffd13796ec8093665b37b887f6f2c66fa0b7e28d1b52c78d1bcf205df1c68760b7e28d1b3f321255bebcf1db3be8db167e6f7f23e4a31691963012d3be364a299ddbb67d2f1fe6c79eeafe3d4339ccaf6b1f78836907eccaf2c6cbf0e5f7dc06eebce83fc6e0f871ab39defd7380384016c89f55bef1db86cfe0b8559877d5d08d23620dbf55423c90c5194c2085cf71770394350c290cd34ef4f1ce55439de893fd8f097ec4e1286dce29a17ce328979a1af33b6683c6872aa79cd27307bddef847b51d1e77779e2b4c13e4df9161864fa337f0805ba90c2e77c04feb181cc51df0d33cb06b71d5373031adfe7b8e763facba626228bf116e9449fc49c2d37e14abfc61256cd00c0bc5c43d6e60daca5032dcc03d90b00ef9854c4c5ac73c2a21abffe8af7e5534d0ff543330c8460cf5c37a16615ee4466b78e34679686407362ada818d36b063207701398a8bfc22483c1b703ceb7f3497c4f484373253124331ed0b2ccaf13afcac67a1acbb01f67c08fe6f20f845907096653e335343f33b7f464ce13371fc80be1fbfc7ce8fac9aa5006edbf2df0177758caeeaffb5aa8b200aa0d370870682edd0ff5441e8f3f71f1ba578c0aeeef473be2807eb7960d1ff582c168bc562e560e5c0f139fc7b5efe4bf0250f0c4ec334790dfcf9687a402f07b8dee209e98a86b09d704c5257211bb528657e5d270cc7233caa7f4ec838e11716edd0a227026f6428661e3e70f0f8f1791f8e276fe48e7117495ff33c1c373734a43720f736e098a3662111d780e357679e061cbfce844c0c9594c450ab4ff4f91199f5e327036f6c26947a1eeba9b34050a6004419b2775d53aa5c2c90b048da97d6473eb4230dcf816c6c5f3eb89192edc147ac43be6cb922d3d03de297c2470e76c7806ce5a4265a9453fee769cf494ef695bdfc1e9c6f633ceba16a39384cbf37fb1f9e038e3d95be0d387e5b48c4ffa37b3ea9276435a7a38537a5140f62b54f95b3d2df2143d1fd354d63f99016ddb5a11d2dca9faeb9bb873f5be53bd287513d3a3b365fd26cd3380c9a492dd39848c76ab93e4052feffac06daf9d5cbf769209d97dbd39ac7f9554991b23ae44f1b2d6782f46dc0ec73b80de4ca03eee2e01c58ad9353d37eaa86e6c3681c27b32c530dd1988c66dc38e0c8aa33f593079cbfaa4dc3c18356dd62a9fd9864f5dca986769e53694f44fe88e3959f06e7573c5b0f76621d47583943783684445a944f1f07dc791e50e7370e6c8b9df8e504ae727670f1564fe5ea6f562b1cd8487e28b32ccbb44cd3f833d6f8358d5552ee93012a0fa932540efd351b671bed1d84edaa866cfe47f37378e4a7fa3bc80fa312e2cf6f03f2fb88dfc762411d83693f323bf1b8789a114e72a285fc1ba83dceaf6a933a60afc0de01fba88d5a94eb922fd286ff9ee7a438e1f4c0e3183bedcb5f7e0fd8f32cb474c594aa42dda5154851b9addb01717e05faeb8039dc64555936e7bbf365b2cf62f3733ef54c56cee7fce855999c9f116bced36cdbca79991cd8cd4b1b4e4543f60cdafcaa82646ff33f5a03190a47d1ba09a640afad0292fab9deca09c7ef8bc0d7e12f4a22d4f33cf43c0b656fd3036adf420c0ad13e87172a7fcf73cf3bf8c4033d3d3d3dcf604f58d442e0ab6af8079f9be0290d84f3f2198a9ced2585e12a6f8f6d75f07b9f037e20b860e76d215d1787e31766fc37515a942f6d42761272528bf23d203cd6d802aa1afe8bacec9798bf87bfba813776ac911a481ef991d956edc11ab0e61d1c8754c93d0d38f654999f01c7afca844e440c038e34f5a563dc3b0c3f5a943fa481fc191c7f5b4d49234be5a74758425653d230a332cb9a00af0784e28d0dc55b3f2dca90478b92478bf25755030bf5bc149ddea1c435cf6c0cdef632b353daa66c383938211b754e185bc22276c596ca2a205d659ea1b8ff088e58aafeebb4c9cc99f7fe6ba06d669b993321cf99f7dfb6779006fc544333cfcd8032328fa45dc667405957b56d1f64fef632a091e9acc463a175550ca9f79e9b41e6b7e75a45c3cccb84d1a5cafccc732fdd107dc9fe12a4f9560991f9992a622ca937ea56f1a24b65150d313133e10e560dd53cf7a3e5fcf6b481669e478b3099df3126a93ed4f0c69f6a0426138e49aacc1bf991097db4e8dcecb6f7a09c9cf047ba8536e07c4ef8ab67214ed6e0502465e35024bbe4c436b0e655aa20335ff332a08f167f1a0816c3ccd73ce772e7737e2392b3b393f3ae1ada5435c83af3379f6364e66b5e82453aaf63130a89f91c5ea8db1725115a3d0fab3066cbf92de765c0271ec8c9c9c9f94d27272cc2791d24b26e7f13fe34d04c081b3949a68aa126dcf1f38337728c97c87cccc77ccdc7bc3fd79c7fdf8facbaad827e7ce647afdbd374d00f6ff96fbf3d6f0f1c5887ff168e5e8bdfe69f8dcd8dccff6822fe3fef8f03ccfbab54bfc950c65f158587f3dc736c5f32ef3ddf0703859301b932946d731970ebb675db16ea6c32bf2dfe688ec96ca11099f0090f398ff31b119c2f52629bf99c9c997094f96d7b9c4d666395ccacab4200ceefb66270de655ee61b88261cb91ad95edac8af79ce8dd8fcf7d90e329ffd28f3313fee506dfe03479bcf6a6ade553170ddb6c604a9091db0dec27919d026ac0147991f699d792eeb6a40f93423d79b99979151e2c1e3e74746e6c7af9bcc8f5fdddcabf9ec6dfe47df803a78bd9101475a657edbfe876b5566bf81317f038e3bd49ab789a9b951d1c01ced6ac0ad34b44e70e498ffe13bd418702b0ee88123ad5be8fd0f9fdac3c4469a3a3214aa316d3101de7a8f92670403f2bf6eb8aa21bbad9543926d1a94825b16b7a5a0042f539c52cffb3ef932e54ab7e422b74899e5eb0ca5d3944e9eb73a54cd19c6d055a98e1fe52d8b7d71d9987642e08d1b535454038d2f53b234d0f86969a07163aa3d76571a287b62f251c4a819aa8de8981326df82249bd857ffec0bcac95bfd947adef7fd8fe2d6a5c5dea2dadbd868a1eef3e8a0d4c684d5d1bf5bd4133ce9d44057f665d4405b7770f124d4cf23f7a02dca5bfd0fe54bf2984c244a3deffbfe9d6a3fb7eafe76344de8b180fc37c5bf0522bc19760eb620024f470759b587c1544d8ba241be16eac0d57584f0ccc0a548b8ca306aebe2a481b693500dd42e7582c8ea2fab87230f955f9e6c946852a71195e792cad3a8b2ec52f925970ef22950b349f5291ea4925d5cc988698937d59e46ccde5289246d4a9bbcd5b4c9839e9a9a68136daa4dab872a25dad48637f2539353652b4e3c51a88164f7d41bdf206da5b3ca999fa90a4a5b825b964ef6fe498424a89365ae436937dfb351aaf245529d3fb27cd449b5ec4a9d2f756ae8976f43bf0c8b9490df9f8536f06f61913f7fd315ae5ff66c9dce699cfefaa66dbaa6bb1ba669beb3de3ad55c77adea97e6df51dba7368bbf797e67e6fb69ea841dc30947efe36791b986959861f8a90bc78f0bc74f85a398312b51de58d2ea8423ddcf09470f271cbffd2f1cff261cc51fa7ba5f53d4e2fe0ca8e44f1ee4635b1b138e9e172ac184235585e3b79f0a9fb670e45179763c6969387e9b71d4e7ad56d5aed439e182b4a7bf7150aa53bfaa2156b7b4dfc06596377abd55b603c1f9737dc415c5d868a4557214b7bb9ee4634be14029a17400bc99a4c2913a73a92c95a5b2549651aa75777777a7f8658adbb66da3f9946af324ea4d5a8c62448b1eb6931671a078631f31a9de40485bab9e38e19653e0ad15509c547f19c340befa56d92d10e13943e1b6527fee2e4005b8adce5e554f5587ee45d60eaac2b4aa838caa7b8191b158e5cd6181e7deb5db17112b551db2ca441cabb0172ad3e0c52a7f17846395b35851c6165354e134c594de6f75ccf046f1f3544e58562d761005a255baf2c21bc5da3cc43a859452765048291bc8a594325c4e825b393993383314fe2c41b946b8ed9b167838bb5c6a531651a0c8236994e549090a6fe24ca2b858699212a597f491962c549438899b7489aaeb5477fcf0f30e6d28a9d4556a719f1966c7cfba606ab4f0ba37088e1a2dbcfda902c2e14ae9d239ced65b9bfcb232548bfb315ab89549b2499728272b4d4871245fb2450b1315279dd4b12e579ca634c1463012d491cd42061c33bc6d91856386275b5cf6177e0e351970db6266f9d2259581d7ff5503b9bae4cf26540cbefa28a954964aa354aa4fbc9c107851bc7eaef25bdc178cab873eab7e1fe22a5fd65042cda50b78231542142a8b5027242317eafabd1ed491a6f60f03e1858bc39d91b4e2806cdd17d755128208f56b71eb2a095184fac1248cdba83bd7c5ebe290430242d65d1a820f940d982d57aa4a8bd1db252d4cf503de2e699952f7bdee929626aa6a5ffb75a3b1e2cfebeeee761590cca0d2dedd2e8174b8b29a823e5a641e73abd7f3b36d7bf6766f21799bb144b62a866c6edbf6ccdffdd9d63c5ae4267125b81567055e566f3450fbd75715e466e4d4151ce3e12d5ecac3a5cf9e3b3f6564c183673b319596c9679095131b4827487728d6fd4f12fa78a27d87eff3f2c9d127a43d4df7ff4085b4e7ae8f635d387a14d6c7d18f90f6fce00e407b6625d57d1819fde009bdb000e077615be0ffe11352c2c31f2db6774b2e8389b68294272ddf500401aaf2b3b80ca4ca3e95df3d26f73625b8e94ae4b2ac331f16173ed78c460b3d18161b48cc5695b3a7bf0dd45ef7aa81565e85611fd5a3f9eaaeb81f9f25d6293baa1ae232eeb79c4c35a48519a53506ae0dd31da65823c193a31f5cc8074d48891c64edd8910f42b481bcbbb329a56caedcdd9bfdc0c1ecacb265f6655916ee77077252ba37e7a3d56ce53ebbfdb33a5d35b47582dad66db3f74bcf54190fa6bed4ee70eb56372584558b528aedc3ca2ab7fb6ae7491b48ae9cd23d7bd726336bd9d7dd8d18522ed7ace1f1eec32491695cf71b854152a5675a8aeb568479f985d9a1c2bcbc84635195a9aeadeac027319c16e92fa970d795fa1457e9ceaa2031af814f62429a6eb1af74b986cfcc27959abb160f975da35a66c8eb9a5f7d672699596acb9ae653669a9639e179443eb9be2b3aa774399dd022ad780c6e2baa72c8b60ef0949ad4b215674a07b0579c9916b2104443f2533b32cd69449f9fde8d61607efb1770577c81d9647d79f9ed25942d6ee1762ad949e66457aebb751aa4924abd279ec6592853d02e8986fce7d3ba99f4a9fbacee4e93bdee2fdbff684d0b97abd3cee2f187da04b9669dacfb72594e4a29cd6896895e5716b981e68622abefa3ccda4b3976ab59e972911b5a24227be0655cb783ebc6d5cb8f3430d91371a7f09f488b383fc8324ddb3939aacd15a57ce75f51be0682caef330bbb06da90dae0fab90685c00ced48c36306c2758802631ca1e145e5f746fab4051043489a4ab324e5fbf134ead9ccb299c2104f4d68e1d2930b6a963dcdb3b2503c42cc5b9b83079e5677e989c9138fd65d7a427a3afaa8189c94babf340426754324fdb520ad90a1c4b63e4aeb05174d57f895eacb65471db70b0b7564231e3275e4265a38195577271b388d01060bc05063290c2a6218218695165c811a03690c294b6364c182022c3ec0f224d9f8f934279c0f599665d90a7c985d202105d2873356f0124402b6d8c1144b68d962898dd9832ed030a2ebe20c1904f1a403277cc185ca954bc8c1199feb8b20787c51459defb3088d104fa4c106133c28411421c9832526b2a480f036005ec0a0cef9d40ba73abd061a797ecbc593359c40a50d17b0e08a286e708457c45bfced130b31d3acbaf081a6caa75e0aaafcaf8b23bcb6041e1f7fd44a0e9614a1c9833cf6ac5071842c82948c045e84a869e58a10bd058a9c568850e7e4a57286940851bab54d50283c2a5f166fa55b5b47b16a44b8d2add57858e16202056c69e298f8f85341044870e2815753b70a12889043081e4ddd2a4868238527783275ab4015b1c5f3ea56814a4205243c9bba55a09c48c251168e36d0ee4eb99276f777f713ac245169beb06e953482f018143985952080becaf9ca853ab27cc61d3ebc1b9b65b700403a2f6123b46052fd084b5a3061c907598c60698b2b517680c552d3117c588ad20265898b2e4b3f687a028436765f9303759f7a0e7e021bae00c2084f0841064ba060022107180801064f28d9c11231777767ef27ea589cb999b9a04e46537706132a68a209f729f5f424babb3bbf3b3716777777ee31a4bbbbbb73636131199e497777777632ba63edeeeece3f72952419eeeeeecefd947999bbbbbbb337167777e777e726a3c570f666777777eedaa18e907ef9cd8e458ed14c6e021f00d14c58b25041d1b4250b2c47685a38220b348ed020d1a8e623e6880a0c8ef8b842fd8a91f6d405c9080b946c09131b40c1b263c6c90766ecb822fbcacfcf2b9c94317184169c2406d44684932ba0b04829a744c2fc058371449447c42f852e66e0c591ef8a966dcb931b68c142fd4877a4f3b94182cb123e57322fbb728575e8a93924e12da8c00041451954904c0ef2138cb043243d91f4184c2f4da62481090b1289448ef15333832e68f073659d382e74c0649db0f0a05e83c838b1a2081e481c898fb16259414412ab7d67e993f3baf63cc2922112e62b417e0ae9e124dc9ff3eeb7ba5b802b929e01d7aa96cf2a24bebe2a863252eaee5ab7ad92322cafc1254a149410c75d837c4512672409ed165cb4408a10e74a9a100613a11e609a8a580444f08249a8879ea4c98458194a423d30b310dc72309d8163513582a4ab94a10e5d8d64e1760db8658dac04a9f6732fa04fb73e160aab56fd4b0f1cabe3a543d104de56191aa13c84b755d0b852fd99634cb1260fe21897e618972eefda208e3df9a0b168f4732c8d6d6d9555352cd30f269efc6d823128a02835d2902a20502b14e1414dfe4c6e4a8e9a5889518ca981baef29b6f34fe6a7b1ca1c638a516951c95127c18561e49852ed576a208d4a03f9c7a05a037d939c83f3e52526a67350a3a99c0de7600ac7c14ec74155652d1ccbd262c782b0313354313cf1782f61b8dd8aea493918199b1c1e8e3d79100cdc77dd4f57a7027df625bf5f876b7b541874e8f87170fbf96129030c04e851a7eca01fdeea1ce4aafb9299191a9a2536526c6c6e6e8e7096c0c1c9c901627583d5cece8e6a28e5cf4d9e4c535982fcf3532ee5d6e01f0487b891831b2c160b05265010455185292a743e5a3ca8475d1d66703e9d8f6a48ea00e2ef9896da9307937442878e9f9f12b0a003163a1654433eb1206c10c7a0bcf5145bc22e618376ebb65a50d2826a8895ac88f0465612eb3a72ec8963593a8895c4941cc5b6d46625310f3aaafd635d4d04c1108e5d1d57c92b22a80b520d718c4b8b354835432a1c532f3ff32d16c531a8a6e71897ee59462584fbee635441e677e1287f863a466648b7452da8a35ab64ab1a8065a185aecef5440becad0a6053eba3ae3820bfbdaea23e48dab34e4070c36c4a0fa09a87d71c7a55e542f324625c47fbe2743ca4a90b8f6d105c7ffb5b8a4c509f3b79e9c224afdbae0bc1b5329ed53dfa9972afa23f7dbcf7129493f05d2163b74da1d1a91df8554be67dbcb37229fa6a47cfa0deaa0d5961ae552dd214db19462b917eea6b6712a9898999aa6a01ab685648716611f0e4131fce392bf2135ec36e5e8403118a98eeb86e873373743eccbbb2fc78a1ac87f6a6fa4a808c9b64313c996524a0f2606a42faa0e4c894016c80631605b41439c01433c08b62d1cc6f0a0dc45a08c064e4c7184ca7fa31ae2a5eeb9a8a3e361705ab75a655a7c299e9d8eeb7878523ed85628a26763aafece5907ad76b4c52692d57f2553d9fdbf00814603c1182e641686345fccafbb71e3c68b239dd4e958ac1c2b48da71e0d869121bec720c29c263ff1cacc5c3e15540629cbc71a1c623ab9a3d677cb4c41f899452ce0e0520bc8eb1f68cc4466ccc190d278aaaa199f14b0ec7917f59cb40e92ffd0325bb8208542891dee7d1789e2b498c2580a18329a260d22cc836c0860b90886289255af083904b41a35377498b1234b8c815aca0026ffcea2fec0bf6420cef3f807dc10600c3fbbbb02f980b42efef635f301f3fdebfc7be603d06f0feaf7dc15e3ede5f00fb8209e005f4f283f6050b5a97ff8ef707da170c685dfe2cbc7f00f6050bc0bafc7fde7fc7be603bd6e5bfc20bd682cffbb3b02f180b29bc3f00f6050380389ff5f375ec0ba6635dfee1fbafb02fd80aebf2fff777ed0be65a973fcffbfbec0be6b32effd5fbabb02f980aebf2cf79ff14f6054b615dfedffbb7f6056bedbab49779ed51d8170c8575f97bef9f635fb01cebf27f797f1cfb82e158977ff7feac7dc158ebfa1bfb82dd58973f7dff705fb0705dfed9fb83fb8281ebf2eff7ff7dc19e58e02bf016086770fc0c7af9821101e97dc18864f8ecf705230af2f4f705232ac0a77e7bc188847cf7dcfb67fb821119e05f7e5f30a219de7b98178c88e6b77dc1880ef0365ff3fea97dc18868f8ef6f5e30a2219ff338efdfed0b4654c3af5e07468480e7f99df77fd9178c2801ffdff3fe30fb8211d9f0e183efefed0b4694e3597fe3fd63f6052352c08b8fc2fbcbec0b46b4804fe15bef3fb32f181103dee755787f9a7dc18888fc0aef7aff9a7dc1881af03fafe3fd6df6052372c0b3f00078ff9b7dc1881ef03bbe0518118f07fa00bc3fcebe604437fceb05f0fe39fb821141e07d7c8ff7d7d9178c28023f8077e1fd57fb821149e07ffc0befbfb32f18519117fafafe3cfb82114de0617802bc7fcfbe604414f8187ee861bf2e7ea20a843f2800f6ac8b7f0220cfbaf88b803bebe29700180150675dfc100073d6c57f0388b32efe078037ebe2770068b32efe068035ebe22702d2ac8b9f01e0ccbaf81700caac8b5f0160ccbaf86d0061d6c59f00f0655dfc080055ebe2af011c0272ebe2a7014cad8bff00e0b62efe19406d5dfc0600b375f10b010bf041405f17bf0c60af8b1f08180319957fe885ca0f0396ca4f8001547ea1312a7f75a1f2ffb852f95f18801895df851e95df471895bfc7abf2bfc0a8fc021040e5e701eeba824220a7ca1f0070d7b5036c21a8f2b3e045e5070050e5ffe9a2f2eb00775d2b80bb2e17b8ebf2015500f953f841e56fb150f9452e2a3f0ae0ae2b07b8ebc2118e9eeb06b8eb0ac15d1708be0f2a7f0fc8cfa345e5df59e9e46051f971c0ef8aca7f9342e5b7b1a2f2d7b4765d33618cb7c4ff52a5f2ab72ecba381c1b48a9a8fcda8dca9f4dc1df2b0558d1c8525b485ba95c79090d2a756bff04fae5e98c2c6a4edda53396a8bce1d45709e9a91c7e8ff3e4350b96089113cb51f2a4d440dafbacfe924a3765e164e5e94af54d4b6d0f37264a3def7b9ffe3e4aa78731f4fcaf4b675ca9feefc4240a977538aa746a71eba26d51393b24f8be2d6a6e514d9452598ea234715c9840d13d1941c9625f502f46e0d07fa1b28b67f4ed6f514c4c4c4c4c01a3daa884cdf66441ec10d1080000004100c3140020200c0a084422a16028186ac2b07d14000b869e4876589889c32088519431061942080284106008010081a99a1a00f9eefc6488e4606f630c03b257007b312e2ae872714fe80b28e7b11eb8ee7de9fb51e6850079288c27a492b5b8cc4e0ca9bb0b089bf9989a40cb37aedd12c2b831f3c51c25944241c49080b87349c3b3196f2756f4dcb3d198e2ca92cdcb0142ec2e6d9a85122e32f3b3add43d7208e66a346218d43b459036438066a326c6bac0197ec1a6520c2e8177586b9871c38a360c139b33ce1da8864f61120b5b3b2150ee3873c08193f2949d54853ac1095ba41d9b08498ec8f5c1727ac9b53ed393922d0d19372d94e093d1a003614dee8426b5a2ee7a151f27bbd18d3abe4f18e3775fdab7e6c3dc5ab68d610427098dfca8290f6bf87df1fcb8c19f3f5470c50ab5092b3b91e26fa60887da360a52be693d1415a9a9b4578876e59f20d6152da1bb68e17b847b02ea233e1e05fc33147ad4899561697016d0ae5421736d6450c4788038dbb671df1df7d0d45864706ea12ba9637766a89a6a626c072680ae5847f7d2207541c40690e54b32c3cc0b56d824ac5852bb0c6dd0736b673ff1903c942b182afb33ac6d1d7227518eaec7d4f2b6ab2111680e17dbaf76c521d58dc44ed52898414bc34162d8b886d5c17be1d1913a10845f76c69d02de0d37eaddc0b966968e51ece602eb2b6e5dbff1c89d1626cbc02416219ac459e80dff86eeb4ea4f6f02732c4450bb31ad8aa620a833d6f18fc5c2978f15c36c5d7352b7a285ca6c824933d01bdbc28bafe835b5eaee12535a7d930c75ec6812c69bad96de61e4e0e1b876a6dc03d3df6eca4951ba959ebc6004dbdd9e79529d42d151f3ea4da13185da3ededf38b31a153b2c55a8484415f44dea024194b51e77933876df34bd09b06f0266e5f9cd888db8d8d18c699f7cef8b5f12a243ab83e1628118d96012cbac3b7782f5f40b66e9ce58a3252305acb9042a757bac77fcb6d75c5614eebb15e9259538483d592525bd64ca04f641689c43cfe2d1bf972a108a94a555e3fce690c34696ead7ea767bcd61f08ca4236318919832d3828f02b1e4949dfab3a0afaff772198230a1883356505b8c45802ffe1a54d5ec1362a726f07c98c54585572940f8c54fec247823cea4e16379e0e25f19ac40c7eb86c431d1572332914274e5def29ca91e70cbfd20513ca6683ad34c2ab64ada6bc3620a8784f67158cb47fc9a3f3aecc7bfdb47d4d2c5644e5225f7222dedf70bae09f1c2fc1432f051c83cc8c3dfad0f45f5387988768efa311aa88f10c9fc5a2ef726851c20bc7d2e4405d39d057c3428967017d04d98284bb7992f1d85ca071555b65112092d52c7015e4ea5d53aa95f27498b5e20bc9be0d88f82633bbe908aab84ec82d91f496ca4ab16bcd68b6f144e1c46158a7a2d738b6dd9b98489e7b655454444b1f9b044b46977e7d1ad5f477e067e20dd9a6c3d0e364303e33c65a092e9b6f6ebec860a55f0f9de0ce7ad3c54d0f9513bbc754574b23e9f157b04780733720161060a77eef886c4380d5a3f33540ecc2dec2015f41035ce00ceef0460bacb043f6b0f7c27b84403513f0761dab0b0231a8b42dc3889983274a0b525c4c89a73b6982dc600d5be0f354aee607f9493b4f784887eae02474533726db297d12ea77290102158c9c490613faf2a861e75309ed024bbe9b9c708a79da204ef695ff0df6a74b70c0871ffd65672ac0b7eb68920e9c031a3f461bb613aba7b1a2fa8b41d178002e5b3ccedca14dd865f281f9078b7f50a41029688ea389303ba059932d58a0663e663b275a8e13b1df3f734a14bb94ba7c33799d75beaca92a1d490897e38b2cfd64b4c0b788475362577926fe0921033a0949b9a22bd037894db162657dae80072abbe851d93bfc3e781b07cbc2a50271165bfc27848db09f3f223c43227d07a412d214578360a672b0f9b31c2d5ff4f74c88baa2ab6f141d1521525f4e08e9bbfa201c89bbcdaf1495af381bf3069f145271671a8191b17422b12292a9a961087402df67bf614660199c9896d6f5775e7c567213d4c8ae730cc42221055ff0f402c902a7e6c875859e566414a9f56b5a1745a81122f0dc94265205b401c0ad2b8ecbe818f4854ef8ab42a0b53f3cdb4a84f755b75126cad72242d20e5c6337928e939902c24af9872da09704a499f320f751f0b2fbd832427214c3cc2118de8bc28425fe1f2d1690077c6a9a7f59ca0a2bf3172667840627f53dfea699579ff59f7928f3cb946c22cea9afbb0032008baa6b79ff8a00c3667ccbd3fa1c8282c180202ae064f858e3156109c5c79c3778102f78806289ae434d4485e0b5f18a4f82bfb40c60191411f01d0631d3dc190ece090fae56035c442ead1f6edd0803ee7b953be3077b134dd02c65c163b7cfabe11b0569d68b37dcfe6a7e7699d667d91793561df202c12728d18db0161e2bcf0e4dbdc8ad74542cd6c3f0811f2b1a6f2a40ff9c8073ef5299ff98cf1b1b468aa088745c1f8ce38da69915dd4134eefef453338ede853eef7f2941f48609b454c5cfbef3eaf2ea21db2db879d8f3c39f2b4c2cde497c9b1e84f28535a747aad42ebb249aa31c0cf213141734a510a31e002355e1d03902fae08c22ec0859df5a90c8073145ce05762c85fc8c7cde1aa96b76eb26fd81eb773abd2523acb6dfce923ec8f9bd96a727931cdb5b724e6266825226795d48c2d19d543270c2ce777f91524644dc32433de2f6153f60fcde82e95c01c379056fd61f34ca02cffa4a67381aa0f09d244b816e08168f404fc930f2c1f9783abf0d22a948bdeb9b8376189f24e6331993837c1b232eb140589a9429fa5e4928e627a964c2c97ef85d6d8a3dba18156d06b42cf0345ee8e120062bbe6888c552adce5bd291efc0618875532201727df082ca2faa11dd46262c9a2070ee5de89189b5fa9a6d55bdad20d79369f620b1da05ccb366b3a37aa27dedf55a4b4c6b25305015b29b0323438fa08b07666eff1ce21d398e0e83e00cd09196ccd0ee46de74a5f1cb01059ac03a3c9a4a082b65a3c8988b9eda1108ec9403b9c5de265d8efcf13a387866484fac43407a92385077f9b643d9a386149b17b7a477750ba42c7c2a9a77b3e4b79e61569902ed7d4173cdfe2b54a31dd6b819805667954e5a4751965ac08bf9e713af8aa85f2d6f8ac1b78bb0b1ba07cd5bf08527f1a4d294733337e618f0bb259f96bd7f2ee4a32a4e4295146287d4664c82e39a09588b403a7178b9aa8b91e14ba3511707660c2c703e306c29d199f0d9d953e5ff625c53fc03eda24dc81d0b30d537178b1908e52b171b9009f3652a26dafc8a5cad5ef8a7f1be640c8037b92294ce3a51dee1eba66188313b5ce45d8c357697b607e24e153a4d91788afda8fcbc09c134498c4e589928bec3770c5a6ecdfdb99bc73cdf0a911f4ecb0e75e5338b93557f2f16b1987ac160e414943238aafd7bfd936b1792adb65449ad6ac6bac2bd8fd289a0211dd0b4ad78ce3258a55d24560973b48cf55e5051b32432411b9d0d4b0e67e4ed9f9937aff6861c7d2d0352edd2cdd760ccabce0e70198442eca8df812948d8481bc978264c5aa9f26f5c01f5aac7d9cc563c09d4e1b70bce7c3b1dd66e1c26163b609890aa0f800ee322bc22f85875be551597deb6eb7094ec0a4eeb1945136be237bd1e009d463c8ee43488352c73cdd96773a7dac0f8bea55cba42d0794b64a73d2e980816cfbaed781c6aa06b51f659dae1c81ed85d36e153b57da9885a525ee9120489b23c276bea0e895b697f72c31ed88575475858a9e42afa2afa1d7d053e8d442676106e7c8ce4888eeb66149ed97d5def5d62b09c077714ab6dfacad816f1a1af166b6b2014583d5bd93f5339524035472d1d75871a9e68b6a83a67598284b1a2d176ccd7d9f5456268e12e4a6adc6789792ca3b01f29e3dc857202a600d6d55de5c07273a86788e8ee1edf582cb9fbde07caa546e9005ac7f1c9138edd6cde523194bb7fe258c6fd7f4a6ea0d409ddf62d6a53ff0b4c264b89dd520ebb6dcb16594959b863d38ae118b060b7cf4c1e62949e437cfc78e46c6ef89393f728459fa8ae08e4acbe62651f2c31c513b49db553df2185d9f12e23d6127341507a0a3dfe6e74889c072681955c5cbd2e4b0ea8e0430ba57e159d157ed6a156f3ea0d2edbbb2ad3181b4dcdbaddc3870acb39f0cd9c57024c4870ce01f883ca9b2315b980860476fd4dd4cdc5284bec02e60e95ac48fbd56ba5e71c16b9364bab8ff688f16d61625e28b77db4f7f17612f7b76e3798f95c03e7fdb8a4cad466a36e2f0a3f52cd2251e51432f6a69521846afa678f18f0b8e9b6923b4bb1188d79885401e82fa8090cd7d53d2a6144687172a51e6572f10cd5d1b0a13c8b9e2be11aed72f650471983eba2f1535dc0b3d3841947673bebc42caf1a57723072c3f0a6fb4e8ca8ead49941efa7f452b5128c1d8a4bd58be2174a2349c0b0d4811bc5c51b1898b932ec9d5e91f43e6be20130cdd2a1a675084e75c10e0ab6b8c2c1f6320bed5bc0ca2ae320472303e345f7d0639511a2df7f264cbe7d245bcbc99f16ba304817cb57daeaf0d8508a4e8f431f7b351465902aa68fa5c8c919d158e6a1410bcc3cc8ff50773182a89cf92e5dad4bd7ef09b1b875d11bd1dcff16f2c3b5907dc0918b1a86e341d3cbd05ee0ada485d2cae7e3a288b879e77c1db3cd04210bb2c88f55864b6304f44879f79473446bfcbdb62ecf68020e12d51b7e2398502e8f3f006454534f913778b33cfb280ff6af11da4a0190a74ff92c27e8a93da8379e5c5c9a0b9c617aa27d7590946cef564bffffd3df3daf8689e29810456a6243810e2f2421cf3c708223711eb42710fbdad89b38cf2ebdc78dc3d188c833fe8b4626611c9c373a4b3c08bbc0b51e2bc13a76047a8f26bee0332f72d3889a34d1969809c242d351106c2b97b1b23cc816693fbff5e52b49ddbe2abc5793a96f369318ac083a04b383fa7148e83e71a0fe972a368d910649f01642683b900a7d4abb50013c72ac97b46d3611471f6a87d3ed7b7204c68729557d883469f62a96e911e89752c798a0f2853ea596b982b4ae8dd6d92cf90ad3cfc796d05965b52a91f2e65a1167079043ea34ee9ddd40a19d7e7dfdef008e5a3b0745bbe6439af15b14b07872aed34d68bad17eb2c3f4fe27223222870c5f48a7f0066cbf9136387d53d7f6ce32b8afe50e4fad9a09c812ab3f0770e1e01fd465b212956ad9325abdcf3278a81633b8fdef3841db66daa5d6eb4a26a418697355f3cc448bbe0bb88c6d37b2c31f0aeae963eb307395c065d7321c459dc167b20b9882f47e5c56b8b84f6a8659c993b13b5a5c0bf7cf641ebdfe3a0fafbbc07bc76636ea1c0579078bb17eec81cf79402e009d68279e7506d4d13dc0556c98dfb0ccf3c855cf16ac55626658f47055e77125a488234a347f862ac785f936de0c2b22459cf21cb8b26d8da80ab62aebbaeffa78a291f15562c46bcf813fd75ec18f7a7db6044e4f70b4eb3707de20844f64408e98b385adb9a131800987ecda89bcecaa57ce810c9e6aad1575fc8296bab0e82e36b5ce272f8a36288a8b36603e951befa3c4578390ba6dedc086f83a2fd7181c8c3b3f17384b050b49a0ee78f606c83280616e6a0e7d01e8ed0d48312662f6a6933e2ff3bf89b2d7fb194ee0f1c374ab69334e65ef795d9d483ae21a57115084892259cfaa7a995e7ce72d8869667ca217b9399047bee81d797f5f5b4d657372620d8ea2f08460e0c1f57c4c78c182b517e6ac1fca82f6f5e736feae807622129a7f861df57a09c9b5bcd35a866bf7ba81f2080f8db1456d397d0ece0d0cd29825a5c344ca7ae9436abd65e2f0c290580ffde2ac9a7339faef3a930fa94703e1df9b91f4708eb086f1e44fdef492ea567e4f360596f88547a110caf8be7614b347c9f11a1b503794bb29ba52cf13e4094075ab0609e0922a7a35540baf0fc774517278eb801e7616336123d375bc427dca20a6673344a030dad468aae6260323a6ba75065b192d897c8049da355bae2c6e72a98c6d6a637c26009113c63a9390fd61cec4f583d2141a9654b2f176a6c257885d3a3d0044db333eb8f8a5f60f680fdce7e72e702ac750ce9b221047c73de797910218ca882e3a21c5b78fdbf7254d489a291d089a001e171d6e1fbc2897b33f193e3463ccbfef423bbc8cc2156d37e6fc46577a1132a1bc2147c55d8b320fb3c9093a92af11a55370945e2168345c6173c748868676e4f359c901e68214bb43c883d94cd7e793cabf9469c024c5ce585c0085f6734adc0eac894f07303377bf4a1fb731db83346691a8e100eaae3ff91a7862f5805ec70a94f268f6c4b4b942e933ecbf6406988f7acb525320cbb83f08dd27df781403de7095d192e9833f77f49ef347b4e57d79862a600c790a5ee528edb0dcd28be1b930e9aa98a96e3527adf0afbcaf029dd8d9909650ffff17a6ed426861c53d0901ca0f56fd995fc04008a7eb5a290c5e235a4de9f5cc5a7767743eaebc0b36cec8ccb52c71ef68625c43253dfd6cd2a12170cca252f22b3ea541cb23bddf0db0065a3fbf3527d97e009a4d3f4693b3e5afeca161e0b8dca863691ac7364ff9bdbef4820134278bdb1287da0da96987f3028e000bd93145b071a3582fb980d2d11b57b5a7f063523dc6dc418188916a990f023b01ec20d1ab4d1a31d2be8c791276c027eebaebfc6e8c83154e4e34618e63e71bf851bd8091b8e20f6aacbf9031069ea5ba6e9fb3574ab74a3c760d72340d2004040516f60e1c4fe96b7b61dc0a665013c2259e69954130e24a600814d502fccf0656d7d697d818afd17ab08558deeb858a242f58851649c3644b12144d55cd3cbec6a5cf4a6098aefcdbcd0bb6df5252a9a5e5faf3e9695d7cebf410327438924e63f3670631bdd0e432434e0959037c2f8a085447e563b3bc141bfc14b3d95f66cc0cf1ac0f1d7658426e743742504d482462496d63d8c567a5ca3473b1ae488ac243d002540ca44d1c8817fd53b41231731fbd8f1c36eca96727aa78b6c256dc5182638b420e7787dbc626d2b03493a9d27ff280718d0f376bbf4ac6e576101885938487dd9a3be01d7b92e1559aa9e2c2d53f02f91cbfa691a0009618a2297326c819b2c350636d6938ef01404a53c90b4a13d05a548a402c87d8b4d4aeed19f0405989cadf35f52538fb08f31e29f30a1f2e17a226628b4c57a0fcece4bb0caca823db2ea24306f25a54cb41831502f5d94c510dfb8c1313ba0063b85282bc10edbb50401ddc3b3a3b78799412f20d3af55ff7e300c06d37a8469944c8c79f4187411f24dae4ea3736ce0ce41049476a877264d28e853add467063c518011a45e89baa3d09ebb847059b9a0c68148071253fd7a0844b3bc830f27b3a937e3ac187cd8e8f3d9b3fc559d6105d540dacfd4c69bdce8180a8ef7211e3c2731cf0a6ea0d29f3df8ce2089551465a32a1fec8e9724caf9f6b5960f9729b56d51c26c0e3e64321589bd428e8c7338b346e4ac22bb360fcb9b89cca0be226ba870e6c32146304991433a06a222bba8e49882772dfe9541997fcfaff30468faadef75533e3845f7cdc7970e458855567e68bbd289b5349ab79cd19567fc0baa93894b2d18c4188e445c66d1d323de802cb1a11a251acd0d9498e2dd446fc4d0c3032b15ff8c1301fa474c37f7a646c9fb12883b3450af86a2132bc6de7f53fb7c01f90797ee618ec40642e1386c2a33ae710d2ed616c613b77393be485e45a6bd065a55ba4b0bd7febacafa65477fafc0855ce0cb18124666cae0b747b40243f07f6c4b6b26e82563d7528a60fb4158d90d82cb7f13fa94e5c4c7a7f3fbf7ee5ca1bb43f4aefae641446f00a160fe3a54671802e122e632010f52208b5529271b60780c328eaa1e11dcba426f9abef358139aadad7193bcbaf2216e9a8679489d75c6ccb5766e7355a5144c388eeb661d3a1b138623075a7ee66800709e73bbcb430d2ba48830cd610c225f002e4bba40621c78b67dbce47bb925eb7d9258d548bb593c4a2cb1d0d1034e53d4e79f0979b90b795defe507eaf8a6c6f9347a97a86c1fa5035042ac1abacba4341db92d34b8b80cd509ad49feb9c9bd6e4bab7db0086288d704be611d42ec8b1db752cb0b84fcb012f0080f68cbd8b8fd6c008c7aaab58195b592725b2bdf0faa4fec9a63ba0bd26d171deac847696d21ebfab550aca17c8c3b5f64982c980c5cb230a0ffa18bd6e545e63dbe763b1f8a748a9676e61565b1e0870538a29d9a8bfa545879e246441969c4b8935e6614b1bdbf9b2d45e388413cfaea829489c4b3c8b83462c5c2e2b6d4d35aa9e8bc5baa7436fa5e8a9e88637e4022c06f06bc5106e48834a5f8b07400c5ebbec14d4817d86add15679174dc482a01463ad6387765bc3b23d5dac8b73578e6f88714638316d26c6c540c8eee972d4a22acd04483ed7d9ece3c62fb5b26596004fda624c29ea860bb85ebc04677dd4b37b3e9befb1c8bad691081b349b2695c2d6ccf483824651b259604bebfebaef1b5710226c97dcf9e0803fcec037709fd757545eef2ebc770698043b3bb7fb08b120876bb88e4cd6d678dafb77e31f606a0dec0b4d71635500deb1650f55eca1baac3961b0a85cb556d80466369c2952ab1d9af45676986df38c404ab0304d4950f0e7469758ea3f4ecae494704e07f55ee1c0e5f74ed884d1a6020efddf5ada633448315490f69801958faffd25bc17e1d8e00702d1909e01b6e929a79626b5e0f25d62b3b4a41ecaace592cd78b07d17c818d903e64d50ff820dcf75528e8773b7f77c27c2feb6fd4937be255664ed8e79cdc1e4d50de3ad3a456356b6b550d66c17bf9a01a5cc836b08dd355efd7914c136a56b960754f56021268a710b282c072a260f5cc2c506b3d223465acaf051036f1962ca6ecd3b769c40233ea1388c8e27e6fbff44390389a7af60c7c71f252f993f11aab8b1e74818753eff1c0966c55a6fcf94ac237d3469258e753b08f6de14361d6ce50e58d27634ed840f71496cea0793b80a128414c4fbbfdde27ffa2897c94d63edf2fff9d097c4cb3bddeb5ef7bccff66824fd3b6d7fbe6ff34d9f83038ed2b5c8e81d8156c1687d78e18db2f055087f08043287082b4b061b5bd211d224a1d4eedd93f867b88c25fff88dccf87bdc74cc690d08fa162d9b86ab650cd8a6ae295561a750aa2a13070de131b7a55913ec3dff0f4188bf5748954bea5c7e4eacf81bc17a6a184ac632bea9420901a2d108d1a380d6cbfae33d0342e108d1928512e9f7469a0695c20180df06dcf58d73d1080327a3e3291d77ed418a963466fabe6b6d758370e63f6fe3dec28ad829ebac279bd8c6d838de95e91f98e020ecee5719a5246ba97b8f7572dae58fd0b6993affcdd6a43e983f20c54533237d132dc12ee4f8c8838502e70080346b24d697d433ef0b55d11624f2e4cb651eab2c1fc2896ef6ec0010ba55a8e820383439e3c5f42c6a43dd4362c87a3cf1e50bd6bcb3e9194e6f164c1642129d684a497584ad71ba09d1dd0635a7260ee724078c2b558bc5be82d2b4fbd86175717a993dd06fd12db08085ed7467c0bcd872cdadab301ff6e27b9101f2a6ff4d8ba8704312e2095f504569e87822476261e61e809778629cdb5dc55219a2946ea6374db0376b3f2904cc5dd2b501d07ab80087841334518dfc75f985c4a834ba4dd6e863e4345e3ed98341e5fa42f858b3294dcb80bad954b8aa8c0fe13c8c8f704239f5d4df293ea6c28240240bc637b9070d9bc2d7d02e32cd697d1d8521d3d2e34ce46e7003c6ab88e7a6af2a4021ee0c984c62ed3b927ffbfb26e8c8d6971193d2f1c5c01adc17e631cb359c73015735a3eae6f2c519198ad9f42f9a1217a964898cf6f7ce9c45534497db944d5e99358580c2d5b566e2cec050a3c48bbb12c1a8ca3e9235e13d1444a80031b9d362b287a3143e6c86eeff4eebf207160a949dfbf273bb6a794cc701077326da9c3e2fbc208d63348daea79e08a8a040b10d38cc7da4ac492b6e893325bc6b0d534dcc3a4a6188c6eb580b53f505fdd798893acffd0b1deab8767c53cda342641ebf82986382ab531eeb875fac03c1e8f4418d170eeaa7df3247727f04c7c3dfb3598a3c33e50ded0bfeeda9c0b0f87a0bf7d06ef03c474ba2048c0a2353b7c85b00ea7937bfc48d442c7b85f3e65037fcf2415c7d38d447983fde0323c115b45020b2800c2f1b14df26f9f93c250f0fee7c367c9fa13984509933d653f685a040d3ebbd8f0f91e6ab89c003b579254c758270fb2e7984c0d1c0239059a8e74dfadef16ef2864d250b6d7e33c902b11491d77ca0ae35b33e0a07762ad06037a1244103429a3c19c023c42c5c0412101076d6988d04ae24d6129fc7301cb7021fda98d6733f9d6d968d4ef1c53554ed63959b5c0dbbc4f4430a9a1a288bfd6a98319824ea338414b42bebb84a2a42dedba3793234f828336d83c8c991d386084a60598a4ef671d412e5343367a5daadbf539272c0c67f323e6aab78d833b378144ccce6264d4ba0f5f65343588ad626f51f6360087e93cc8e82986456f20173ab4fe75cfe6ee70c9178ed24c21561a7415c89cecbf6e3d16a51063a45aef0cf534dc7ce32ac8de356cc528a5aa0fb6ee16542842adb549669c141a50ab2d4008777827f1cb8a4c106e3e4a37eac07689cc40192e910d71d5d96b911abb75033b6b91a8ad824ce7c6331af35805076d3fb0aeb20da0432deaa61779b3fa0d5eada633e1ab410bc4e8ac05a809e4e4b90f3005ac1fc6e0d34e9154ebb6bfa300022b28ed9be72e3105bc3640b19595810076f3aab0314817979526feb6eebf7868aca4ad49b1649a85f228a1a7804f22551fe9da5510095888600f7d6abc7303420398f1682242ce20f2b7dfbffd5eb6c215bafa7ba553f71866b0eb4e47d257a1810166960450917f769c6582443126c0241185f7372e1cdb77ee061c6c2ac43a0344b65f6387e83084712137e20fc2a233360ddb18b0cfd10acbcd5ad41080985d9b5cab7965c2ab27a3f0529d9dd6d07c1d6bf0d0be707b5d69c683b6eeb6e6a9e8515e42a6efb75a62fab2361f235fde9080fc7d07895a7d65edf77d9f1fe52ce12c9de1a0570ad7716088da90b9fe7a8527999325dc9bfaa9078197efa95af252bd39ef924e96d1ca8e0fe7cff1d12270d396d09d1b160e9560181973cc70561c65eb6cf8ffe3ad236ee7061c4f02cc90089e10906300fe4c173cca890436a8ae6899cb0eeaa6c99a0fab25716e367ea814df9f2ab2ca5abadf652d70cc591416564165e9860da457d370fbe2f69d219ba14f6d74e2c4cb42892c0853e1dbb028cb49694f4f633eebfc65a14fd4374d5a34733e288e3ab314e922e33104f9bce6d137edf119de8ad5fe4bfcc22b3dbe2d78f515b9f098a768d2c032bb5041026579e46e422dd6640d27d802f2b92bc125b9df5b2bb9fa36a640290f1d4caf2fac484cc06236dd14edc48ae1c028f7a0513cb8c233a0b153021607eaca4c94290d816884008f728fa85c6a321b595b8b4fee7701465e0a887b34ce401ba93d93866cd9ba41c12c99b1ad32d7919df403ee2cd9e4d40491a4c55eefaf5108299b0ccba5c24e16eff6cd88c545eb8166c8374c73588d8104aef40806354900dbbf26c25ab866665f424995a0fd5cc1b83ea7ed4b9c24426875f90e66e8763a71a01e15c60261a70648579dc3bc55228bc8c31903350a34c1fb31e389824bdde9e6fd45e876931f54e988aadb434e8553a6fec51d1d14df848f5b39525bbffeb45ff408293a6fe090607702248804fb3b8400f2ea2ca89af7211fcae41bf2676c57a254770fc9db0cfdb4551fd382cc2628738f898aca16996fbcc76380bfa17438fc9bbe21123c81d5e0fef80c11398cf91c94905d6a8a2a1ded801294f22383fff60e2556c549845dd1848b96539a212f87941a02d6e15c16f6ebf063f91ba840c4372152220b171057ca18ac6e01805915087965ec6c621196193a9a1e285012e516de7da1591166c516f4d79e720d1fb2578fcf25941304843cec79647009dfafdcd3be4d29b1b2ea47c4b8181d8a641f01297f052c66c56f9dc7a0ae8a8547dd9efbf6ad1c9f356986143b7ed6504582b7010423805e114f7142bf1351a616184518425104a67591dc9a5b04de73d42d29021b34230f542f38442d10a1fd4b8b9c080290bb801f7a4689d90cd6d851aebd95457c39e807a13caf6ded826a85a815ddbec8100fc9228e3ee8588126510eaf84bad0015083c719c3956636e2d921b4f2df56f48b029de0b48ac5b236228fe083e031fe0f925b77bd26c6a6053d0077be8c6658728823a3c2b925ad82a628f658fa5f44b3ef8b478b8d51c85152c9e2587ac7f9a7be4b101a953900cbe45b246b0e34cb082187843a752793cb002710253fb2f7aa45e8da27edcb3ddb313f7b094c9f54055d2b61f501351a5ab2aadb0b61cc80ef314ff4ab783a0ae16ec626265eadf8c5d71f89a7b2a936209dd8a3e5779903480b159f6ab0451580983fd2e747f12d1c00943483d09296da2690cd5bc545f152fbcc022861901a4da55b5c74bf25bb09feea946bb3bf94c7b7a96c5e554963638e40e088649163bd41b05988490131af951b80ac287f9aec86ca7a8faaaf0e88ee6ae090972ab5d8b3134aed521416ff4fd5d64871494439f1009b53c67e7f9181dbd68d047b05e64c0b5a89446eb7471a00abc6c6db9c0cd4f8c10b8d1fe93c5da0d2f0c9a59ce4f5bacb0a6840fa2a669ce1425d6b7f3577b6fdbdf667a98581e89de94c9cac8139eda2ef1d769421fc202d869e6edfbe74a0629158034f404437731a2144f4e03293122851c5941a96f9da3a57e59aaada82cf5ae4e13266b0db0b2704ce674a03cc99b0829bd35d88577db9ffa83b2d461955140624d8cee3723c44ec857eafce821e9d5585f6c414d0f90103cd1aac26e5b0b08c69d0068e5b59df96efb50fe27f9ea3aaf8ef4366f8c884d573b9e7dc819239dafc88a3911cd3294966490a404cfea21b803953fa5398b60796bbd86a070dbf95b2b32b75d43485c8c0b8e7cc67cc4d6ba6cc4ff5989701e00d5968a4856bcac825b8b51e9533d53f583990c3ebdbc70f0404a5c05fc604ab73b245eefc092023d94a49998255c4c165313985e2651f1d8cd9789b77cd9ec772ff2e047c46aa9819c5ab461cb052f1e04f5e8764b08dc882b70d2c90241527f53de8520f1b451df0a5de2b1ac3fc70d58d9de121a887ed0be9f4181363c6ed3d346a863cc3faec6b19e476d29e134b7485430c7bbec1949173d0dc1500c2c8df96c029a073ffbc2e9654b9785beb439d203f0b96abd44a63c551a581acc088cf3d18d8e010e72c18a0a8a238a865b74fd47940afeb524338775c8ad9f0bc41c15d5fc473d6331dc94462db9443c20eada804fa2dc046ab03c1d8a7472e72574f924b621099fcd72407464f46100c1aaf40ef39ae23eb92ce237d2ec071ae441c2c7f43e8cf9dc4cdfa1b16336c57a53d474cffb718e75941df08670953fbeb05dddf38fcc6432f2dff5ac80f736077746014b75f77f1188a117bc5c42a69d59b33f76761e6bd636ac5467b723eaddae97917767a9b4764afd5ae239f9d65e9a5ce982e6357564dc40fae15b92764b568aca946ec6685957f99140b098d067c8149877d329fed61511c444c684c67664ff362fa85b76b99fa97cd155e3e94e0ebcf8b22805e28cbdd8b3c8da2d47106e2cda75a6fae759f71e6b6c33dbae16a6f3c947123311dfa6717883eb2e38f24867825917cc6aab32c8a65881e22c628a0d51d2f6aa66897b70e4afa400389ad59c31c530f7153e5a69a6fe296117d8d9d60775020f4234d1be5f5fb11ad42fd944ada0be201e1c1f9d32d42c4c9c496f5d3e10afc540f02913590433038fff6f909f74ef61af49719e4e273a0cfed51127490d9c8831cf2e251ae621c9b3cc53e8192f969047d187e9225b439058ef584b3ec937d948644022d099179b862fcacdbf88cb4c385baec8d5470ae8a43e8b2d04f843cb829c759f153ff2f2962ce4b48d0ca6f8c3187436daaac1f8e763b3acb93c5d36b28ed82571a1dc23e18d28a75fbbd163c5ae51e9ab74736fede2b11c86ea792d4b8efef8d806ed0723ba9b9471a527a34ab574044a22ae4e5e23d36a213f221ae8f0f7c3993b5c3999c2b7b859e0386e4065195d9a1816ad0905950254be89e7b597604c60b385e1d40832e8b90d5782d6bd600de17050476f1492aaad58c33d5c34686b9fc297aef57d8d7a29affcd6801e8539980ab61dfc8cd6474e18ac0123c6794459210dc763d8d939564974fdc4e1e48de9e6a72059717bfdf76939bc52c2ce104d519e4be91691e8377f29ef45c7d4ffe8edd2d9673cb86eb25619bbc9e40df2d2dd678427283b4e69b4c43ac9c8905b8ba26113031ff381999cd07eef14b27e39cdb7c614bb39a7e1e2a7e831f4af16da5dd432424bf35aad0a28da8de7039738c735a39c71f0d3a02a754b3501563311d701d5224692fb40fd43466b81d53748a6f55ae58cd1165ae2016523d31a5a7242e8ed5a11f162ae0ebd0f94940eee4a909620d4154121c507b01d38a9093cbfc3d1324407c5eb5927f4b349ace513f906fa2af708d88f9dff4ce2e78e4fbd4a9d7ec3e2510e63eaa1227e220f6b9ecf112188bd95d213b5e19e6d9fdf6be208c62a989a31dce9c06cfe66e2db644597fca6763d424ee4896f7d69772295ce5413d14525c0b9929e7f8c39b3c742f8d2bc5796080dce4187661fbe67215c35a0a610fb03da8374b0ee051102b9a3b72ec66798750f3c7bd6c874da0eeb750085235baf4a645800c479a2347ac2db015a27e236485496027de882f1a8b8a32150bcc60280231d6522e1d20651d591f0d4cc1c0ce23bb0194a414f4186120d5bc6de6d8140c1e2a8b297624fe124c18056b02c346988291be19e089615a37e2a1b21b1ca01e6c1694345f49196f3dde3785cfd9876f8bd8b5566bf0dc185cd26a5b1faaa41d8e248cf76aa3ab737bd5d1d83182d7456b747cbead6c4494aaaf93848c4d7a80695d5ef46ce766a58fc5ab40b44f5ed5d46d83a280a243f1a93bd0938acb7c0a5b2d1e26770c65bfd2e2a149c30e4fed0ae649fc5fbe306a77fb243e2b01a399639eaa23922e23ea13990daa8922522c6c3e94ac880d8707606971fccdd7aff6bc30fec947b141df86c838c9c2392b68d30ac6d8d3bb8e0a86b319d0d2502ba6832efcc8a5600cd1586d31bcba10ee66080482abd4fb46ea4d3678279c018a7399db99f81233c39e5f0723cd8897ccf467c89260c326b9c41e77136af26a3b972cc61874bf8c4fa6cf02c11df424022a0f00776400c49c1b0ff8c630361b9e3067239549e250dad5be14361bc20242bc0c7886190eddaf7e3e3a9d63ce6734457035d02ca859beb04cd0841361c4b39a754a9d33376287d90647e625951b1eac1c5e64b520509b9dac34e5fd657322142fa119fe1e7eaa9dac1a44e9daf93cfee98e6398c1f4366f82c4899f97c3d4f1b8b627244bcf13c62399a1387a8bdb82c350258edcb5509b7db00ef35082bc9c1cebfcba4d5aa3ef6c79442b4ba809915b16bd346708c16a02a95b220dea6abd819ef265d0e83cef9ecfca8e5b6a6467c9b167d18524e2bbd37ae05fb700aeb5a7f74f5d9bda2f1d686b3a54a254926db7b17427f85de99e442425fd723a0d5f8359d604533f0bbf99a0762767fd89941ddd922539469150aa4753110acd9bd52c35672de04d291c1dd17a0c4d01086ac0afd947be46c289eb8480c0f9ce12f16b9ee07b50d135fb404270aab9db50cb3a73bbbc1df7f4b29db6b432dcb6e3c1b1d261f091e5eb83ad5fa6703565567b9143a2d0fcb79a1835801ca29764144a769da946381d69d642d555e26c064ece57ecd1d6c11f049a8215fe35545e453868bfb9158f693c03f737840bda1e72d66fbbababfc4a3b0280634c47279a531fed08030e50186f01b0d37590781ac41eedf8c50ed160954606e26334f8bb34f8afb3e953390b213b55e6c436f557667f7e87d0e53f09d0a51a2efe167df0b362f9ecf0b4587864b594739c805c61428054fc40127b4a89661979808036c7a8794548fcf7ba76c9d6dea1990fcc159177ce34ce0fa9ec2b6598cfbb2c8325a2c49321714be67ace643539e70efa3998992c2f235c4de5c6e6be17dc873345f5ab9f75d6891de7dea3e3c7d89dd2d13d6d03ddf6ee1fd6763cb8a4014623ca256af7e7f9dcaecaa487e82cf163191d5d54322ac0673119351ca4380ea6d909dcdc5e6953246b0bcdae7a38a2ccb5ecba7521fc310656e6359d155cd6d976689036dad860a40a57f2be2c6e1928871182acb859667c3edc337d3a1a25ffb5f5f0a732c4a2f0adeded62abe871816273726c26d89226a3fe4c612ba633c329a9f491ca92faacfbe3d5a5d399a7e0dbc03af97d0408725fe74458e2a2db05d05c96b03e33d064ee358ba03e3df399962640acb927cfdeffe993716d7e125269755ab1bf500ae9624dd1c881bd8b74bf0b0c49959460af1adc7da2206d70dd8dfdac74415e3fd1011d9dae8b89ff0e04ff1344b303aad860aa2d248b78749548d467b78509e4f92c3e61a2480a36486c41fc9c3491cf10418d6fc9e82c97ea2e9819bd63c79b0614c82a4c1ff79746ceb4b65fea2baa6f7686a7b9389dd0ec2647332a50de73ac11c459aea451b949579cef6fe9af50ff37c36fc8f61ab484d6907c34fb994e3f918e54264e03064761fa1e317abd33d2b74684a310fa876e97630a6667f9e23ea211e4b1c6a494d5a74aee9a7bba607d657d74f96b735e3b0f5e21f920bbffe78866833c079e538ed7f96624d4bf98b94a9c9b549321ebf313e745555bb4d53b4e7cb48fee313b72e64b6acd240d2277fa2e695b538e76ce6cfbcddd61ffec232977ccbabe80df1c229ce2189856afee5741cd37dc6b6df01599f1ae6fb789f14e9ea2b3871271f96141b69cf7aa061dcc0d2b46eb76eb46e71980f9f0d53484a1fe71f77dbc9a09476abec4e3ca089196f10850298cb63502ae7878718503bb50bac7ce8586a7ce6e712e63f225a52cb6e6012da9a3aa43b4c30ad819c30d789abcb9177a902bc9a40c9c079ce4db71c2dc429f3196468a3a7f13570ac5b7e7d63cb1992d602c7822ce274d23c17de3656245b06c6e4733f265ed5f361a9431d276f45f8dfa79953be544377398733a8b3e8f2904452a6b159cc54082a3907786326d1eb864b0bc618e5ba79ea8df84e37a42ca9aaad10ee11249b1a759817247da7351d3c9c7b640560c619f23b30ff08e68b9b18ae2d94053f5e9309478f00a222c973ec9279ab53c7bdc16eecb89f53e3aa9cb38444403ef52d35c69be5a828417190d2fc315e30299b6991193736754659db25f16763ed5e8c37b0c0ceff456c5570a2a578741565b825d17486694306f2b6848069c7f3c19ffae0ae87664bb0bc9c22c23257741b33c5b8186fa8a03125861777e034ddb2e8b2424f73cc9725b118dcfb0065ab64f47061b7d7f45323b8d55aaf60e193cce5c104249b33513480b0f65bb87803a4131f839917c738295de37cfa3b1548e584f4198c055ecf23b2c837321d9c861d1ec439d0a0b9b85d8a268251248f1c329dccbc1c2f0272abc01f145e784d1ac05c1461688a5e2ca8a14ae494fbd187f847c62446fa52a20c97be9415c4beaa69a7b8d17f145fceb25db941fa401173bf618cfa47366b00249b193202eab9f1e80339d2159859333634f1c1a667265a6653b75356c8cb6f4400a6b884e60ec1dafb7aaa79f09320b3053e8d3559b0d68e7cc4d785febb8c0cf02eb979aac9e07f12566fcc2a9cc8423c1bb77f95c4af60bb1fe945222d1207a64a44c07bf8561c7122faf80dc0c12d1dcd9d99beb7b2cf80dce237424df2f13e63f1671430d224003877c21cc7b4e25e5501c36fa1d11056b5b866a958f3b9e20b43f03d5047c11547958962f6e96447e5d1308d720fa774ff67314f8cf7c973667e5c673fa08f6960d3f243d74f777ad2036253e2d492ade5322851df4407180a00189368b1b858417c7207a728befefdae6bed13226e41506232d28e1bfceeefa4949b4dadb720cc85424259ad5e858d8f267c43c23c660fdfe4566745b6addb15be8c03240ccf353dcf0fabf7b7947200e9a52dd02fec5a454a152f00b10e24aa89810ea6707ee057d41c883a5893dc933a704e1134cfdb2768f3131234582a2a0975357c0e1a5c058a6114e0ae5b06ae7c1267ec5da3da86ff8ac861ccc7791ae7cd5fba1fea287c2137456a51030fd60f62db750358c84bb708195afb69116ed09ae13f963bccda18a2dbc52403ee6fd48f4f3403619a30305de273ee783dcf033d69b5d2daa58fb56832d3f28ac9d869357489602e0e52dc5804bc5dc684abd43efd682e71759858a0020c05c8b5188538817cba910d721867af7dde666e9a1b6209a54fb5d8c3f4656a96c96ae3830ef2a2c41b8da17e75e60a8745f52bc5934eeff30685508be9ac185c7d9c4979de4b33cfb266993eb579f21eaa0018725473368a422f0272d8f090c677c8099493c16915ab8f45e7f88370afa20bc714c21b6d028e51b34b3607ebbb00005c5d4157a7b1f4908a9487937e2de75b33805eeb6817b144d4c3b9626f313cacff3f7971a439a41df490b29e3ecb84461b3b8fed352aef0880cb1b16cafd3d618d5e63fa4f09e7cab2f5399cdabadaee92e29e144bb0b62416b958cc0ac4dfa72dfcac18c97cbb75069d0f38149f81a7be1a98a713ab792b4eaacdbc7d6ecfd19d6f722386246f1e08d84b97fe53724865afd5408f2248b721480a9663fa88a55418b77df3e1cf26d4f9cc126fbc937992084745797e5a44d326d393dae0e221bb09a19c4aa23cf8a30a8d30b54e4fdf678cb82df834773af527fdeaa13df84fa2308fd1196985623f755911e1e0853ea2d9abd7d469d82a8cb63836592715f5d8520755b9832430a508fb476aca2d9da8c1bb0c30fa3981b39e7834a456e13de0f19d37c91a241125f35a34077f4b328638098294d7303092435529df441595886c160ff2f558b5e0c342b514f32736a6079c11eaec23e986f50ec9ac4d70f91a71c5587758089e17ca857412b5832f899641d6aedf3209cba44b3082a7ed574b3a5dfbf5369ba002554fdcdffc5b1f1507e686fe3d06d6271f780781a386f472400fdd5abbe9ba9747e9322c562b18333406326806f2dd31636407a19246d2f219e56435c7a72bd52d4ce3aef8002f82e000e5ba7694a17744ace5c107913036adfe8237d697354714d5519b848ef6e39b13a9886f333fc674d44ca5f130d57c2798dd83a30c5f3336d995cfeb58a4af7570a735fea9d66e846693ea2c75a102b63a0ae7b953c51cadb05fcabdf84d4520b692a74b840d10b099f327fd283559775c30cdb82fa93f2762f95ab04584ed72f7d829971a3cb955de0a06046020828b9d32d6de7130ba5068031eb9f055ecb91fee8c58eed8e9f9cb88356450c620ae8eda543c53666c267d839389c32b7caf1e9dff661cd3b842b6e8b64af819de752954e643369b669861a0d29bc5d8242a9caa64d9ffe1bea94687fb2169b6d3a82219d95652f8e78f95ac2b41a57b2c9a5512e7322b526640345b9200ee8f54ea0a91278ab849e943ebb390e30b95f1c6ab3f0c3a9eb7df16b3d6d570e1f99c7e10ec65fb2edf08a97cfe6acfdf911ce92127d0eb97d7050100cbc2a853b91281f56da2a38b8ea14f4f9fc3439ede7d2c1dfec4cc9e5320c4ef15aa351b02bdca1831248d2042bff9656cd2dcd4e619fd11a66586a88d9fc3447f437094efaba76577e1eab4e17c4a56860c9f989925b8d6e052f294a2c8e4a0d4bb535b82aaebd60e5f55279a1d314ad4b18d9b10387bc3694eba406d60f2085258c387575991f709dfba278ec8db674d2e9ea12fc2bd0c30d742977bfbee9920c24e452f4d45169ad7996779d2b2a956a3caa932b94452f3894a59da1c15c3bcf77ec6353ca6e3381eb121492cabe9156b8586d8b5582b33bc53b03c8c6821626f0185873fbc58bbdfb31072a9e4f410fe1dd8d542f735eadd3981eaf29d6ac3dd1323010c1b94e258d27c215c088933f81352bac5decdbafeb3abb243100f18c609e140d776682e93b57efc5db13c1df64417fe89c6b7704b08fb51eeaaf66830c823e02938845456ec538a1c0ebf8f91e6fb31596c57c49140c6370d7c153563b69f935d05ac705b60ffac7108d45f33ba436f4beb6f436563d80341fcfc3cac5e266cf8d564b9a1d1c897947115b09968a23d4e30b707d0f195c3060d6b71d4b367bfb7656258a767185f9f7f69d5bd825384d7132cb5b87fbfe28bffae397fe5c4ef46051e00dd07a9b72cd06f573dacc0b426b42981049a287dd7bd0b1d41988cc027699e6ab550e8fcb445759a09890773e4fc8541236f1bdeedcc7932b8944e19235aa3c65956fbcc78ec85c6b0fafc92d61fab74eb0b2d2ddce333f4289e91791a55070cb537a64b55f53cd558af5dcce24ae30b68b73e6429842836f4b35f9eec1f0df48beeb6fdf5ff79508e830683c8007c230a51dcbce0ce2c22291080850ae5a9a1349436b0ee3ecfea689bd1b3c16993fafe59a850a2c034f02a9a71f66873529b74ca318c8834986125f6795bff498e8a91e726fff3ef0aa3ef3b5fd028d23ccbf3e07a125f8537812b694e828edfd95878b0606db73339a4979422b5d64f42a01a68e1b8a16641203f01443b33fbac2a062a9f0b65270cb3e106c84f502b823cbaec2dc26ed0a8b698afb39c685ecea60e51c35794af2092ef085c1df74ccc3cfe188c4466b7a37e0f1d310e1b438e10b2c7eac248594d3a8adf9c1a68796375ce682d452d32f7091dbdad105a5581c8364013d542e0b3a0e528987c3c8d1d8fdb4693f216eb4ffd5db84e4be09f79b95f1d6bf87b529fbeb3d1327ee4560823ff7fa6c4b1202ba1e4e4794ec472e7bac40a610c451814a77b2d950146816617410804133272a09902bdc75aca7378202e100fe28eedcf19d1d13477206a85dec5cb72b95bea22189ce04608a39f02a6b45dfd3e68b8532076d7e7f6a90de6fbb242999b890612b057398dc0271a9d0be9c0ef2c88129d0fdfaecaa383f197bd731ba37ea5738ced3abe820f9e804b1b588368dbed309e1a62c0a5a3c71af07cc2039b7f183fe40351d6d82a0785e085ad31593ef885a53358b990c4cc2c650462a05a3e963a63ff2b5decd164022e07046205611a485f3704ad821078410afa13af1205963767094a23233c585473f1002b79e8c1f22d12f241c48078826c36a492b0438a81c414541668aabc1c3066eb36da4a77bf7234336dddc5402a03bf0fe3503de1faacbbedc358ce719212712d5dae67c294508a4cf7092648e738be41a9c4a48eda2e4f386c187c851255390630029e21a92caad7d54c9cf048138355a38408d1397e6eb4e35e259c95e271b815d682e7f2afe741052d1b70c0876809277e067c62211a0f3a2921b2312e4bcf4f7aa44d0b57ec3e1c8fdad372e13a94aa9366747c52554bf7427f72c586b8191145480a7cbafa2c47862783a41a0fb2ccb1f0036d0e9faf5e5631a35668beab75c36fd5d6e827f05a6a1e5c714f3c493870194d35993218a55790d5af757520d484c97bd9640bd7422bb1d42cb2bbace5c6f5fda69840d95b4d4e097e657fcded22a9d297fd92507d8c0ec7cd9371b704133acd1db8bc6c3e1ab79f15e985a12349ed035bd02ea14fb539fe51233565156a9bd6df98626cedfbc934b9257554472cb75e6b35c986a20b89d41e4039d0f2615345015fd335187337d48d43a2b32094087f2466356aa54b0099104f0a95f92591cae96be5761dacc8c28909ea7b0296ee4dd651d9557177c6fbac2b549f9904303f652d8e808b85051b3078e68c524dcb64f4b61805f697948f24076667af59af26696e0e4cb59581497f9828fe61a48e547c60f782a4fc67e84fc9ac9784d42beb0881345060d544fe5fc3cb0d2846e732b3240caffcc60ea17429cfc9277e6515170afc4b9ac4b4f9c93f81b8e556af197bd5bb16186b690bc9f1cba7d2a683ea5deab15d10ba4d09c66fbea91a03c2242a4e1a0733c2e029695a8fd10b18ae74ef255c72a1a9ee9fd161d3677f3bc4a2ce9afb6233e0b9f9aa8b98325776be92498eebf9b2e4e443bca3af48c4c57ec280a68872e52edc9e76caffbc2d55b7033161617880cebb31241eeac80211643066b0cc04e1724e48dbb60d545db168a55e778f902971ec6de93db1eb56600532ac31f28fe4133ee902d2a88c2947907d036080d4da0d35ec811ea84148a98645f7ff9716672dae14c0c0561d895b5c17f13ca97eb0120987c4c9dc08d0e10bc86194f71e7ff8b5df8b82253d08de99f58bde72b765908d4ba5cf493dc15783cc46e435e4bd14a02de3bb1425861674c903a3e884e8d703294f68ed54e7e3ea95038b2cde679e91d7b25c33007a41acaf75ea2f0dd5f75ff8393fdfde6bbe300d66a95618ee036f975ac47e8c9f4313544e0f3d2a4287b82b1473368304d21d1914f5a92e2a94a3382fb9d29008950c7f70a5106f36c910d7d2acda31404a656d92f8186f27fea35910a43e22fb2377254bef888ad473091d7b51150ac99efba4b1b6c0c7889c86c27c9cead524481344710a20e5beb252cc380479677690bd9d633141a8dcb3b9285304f43d390b62e37018900e3b512871303f60e8d9cd1fb6c054b902417934e01f3660b0cc8886ceeba4d13cd7b6bc7951553ae520068b110bc1cce3711aeb01750c8c1f31de6ac7280320135f0fb5197c40f603a46648e7325d45e3df7e21cfda9d63226d3d5cc2d810556150fcd89d32747e1913d0237eafa57ab7646a15e1d0f7e928f19cdabaf10c089226bf661f41da524553c29379b763949f8585561392d604de93a0194701a7ad4824779aab316b452c3d61245832b28f67b7116d684d5ee495a49b4676028abb3cd18a0d1a44946aa0764ab0d592f2967c8090f4c7b3ea737598e7771a59d6fb5527eede2bbccab8231304b8eece0870966648aae87450c12a457ca021e76a7c0419551e9a6da4b6cb07fa53cebfab1d381b577207849e829fc85b26aef139d3f02ff6a55276b53ff6826125340c15fddf869757b7585e72b217e43af610c81729876da5020a81615e65d4b392e02228d2d498c301d7be3350919efc6283a51ec580136abd7373844676835c2acb575b4de25ea6cbc245bb31f394a93e39cb53c4cb9312431f58c4b12cf24b3e399844f02935c1b5cf0747ef74256084628427e5dacd6a29898b1d746b20bdb7e6cbd32a00d5f02139d3b679195c22f74a63dae4774b4def34752af12978848b33aa92f47632375db472f05732adfbb2ae4520e6246081dc2c79275daee00d32d8bb1176d7ddff20700b2ce913e8df552e4c8610ccaf03bcc734c04bc3888264fddad1985a9cf389d56df72e3335e08b265773dbb273742697d6ca04f3c1e7411aebe8d56b428ef06e3324026ef17147e11dc17f68635cde19596806996c501f4b60b3f6fcdf898db9086ccbcc8e37d87040534d3ce3276956c96184a04f2026327c26ac9b083ad4fa37749affce8c434f65de20c83ef62926750628674c9c2d8d32fc49e3bb0461f0486580582636ca890fa84f202e097926584d4e496a7f3da8f5a34dfa565df0236b5a8aaa117f773d2dc3899d9382e9bf5cf07c429431fc1392ff3460ea28353cf8b53ae210911b72b0f70ae623fcfda213b4d5ec7de833dd1b9c8af60948a422b7a9c1ced2a3151c3a4ecf657f91ecf41bf5a825611c50f691d1ad49444dc6a8496de21b2568062f6dc6f7dc9662eb9d3302d316282b22483012d595be867f40f69feb582b32339b2b97590a509722cee918e409e8daa367d5851d12e23264d3f6d073d81c25bca2c2f94993046b571b3a636ca93cee0db21a27a90836831d103b22f772a06ff5b61e4e074f00c0cfb8fb15f108585960cff591eb750f91365622f60a6788b460b253117e2a5055228272f06c436e470d56ba961789dbd2ace13c127e3ab9e600728ed4acc51c0e04ac2dce67312a7cc8903b5c0eb3da16b12a7f1dc40d53f6242491a940f0990cf035cf4113c12edeaa9533426627fa8207a78af9751f09e4c9c6fd8bb039bff2382a027b890b7ca3dae0ed1755c202088e88e1ce8384a66e6a9a4b46261e0de6f02b91e7e38a373aad6ec7dc9b08cd31b0bca184963eccfdc0f5f321c9a6760b933a73cc00cd59c16ef1b35506899fe830f02f00a2894948c36f934d6a7ce046558d0fc992182c9ef8322cf96d38da0e2cb9561306a7b8c48ac0f55a54d48aca0ef32a8dfbde94b278398bc645e2379dd76ac6981b2a4dcbb994c313d167d6468a27a8aec462031529d543d7be62aac314d036c2dc252b905344a8e278ee4ee181f3097f7edc64d289b148e67b3e3593ba59eb2adb7ed728d464a9cd06de9a410c2d2fc9bf31dd4897ebc9ead42ae4a8d201cbb50d207a7429acfa30347616bca4f497715a2523bbe2f1cc1ec0631885ee1352fd4e5885a511f85674a423598de4df2edc6b9e956f1ed77426b83825d444e461ec128b58d25176648b07f82e6269aade0b346da6781fde324a19c029e543fdc5382f8557046ec60be8e9fce64b36d20f9180f1ffb07bd2878f522628e6fe996ebd7cae35a713813d0b2a6e49b4b0d2fada5f9a6645342ac876b2aca5ea064fd13d9652b007a365370ff13f0bbbe7dd010fd7b294d091ef0de48e30193faf6d0c55e54d3b9adc1310ca826e64261755e4d5034e56a1f0d1aa13fe38c5af61105430fb29a09188e6bd23ab2b66819a5c20155f7d1fa011de8d6240e76808a8888ceac6e5bd67035e9711a26a117d67c5c14762f3f94c1e0ded36adadf680b3a5b28325331c9ffde477699d0f03dfb813176b8c4e7627959d1d877e474a738993f46137ba1a297b2534e75e4f908256ceb87792aff2a1f11ffe99ec0eff0e2aa0e4262715de4b79833d3eaf5226abc5846bd6cf061bfd9583b216cf248abaf1fd6070913a3f707ebb26ab86cb0b130871b2f616e8f5141378eaee594765b8cf649f80af3fab7be17aeeb753aa64ef8ec49cd32fc20dd5d1dd96c27d3cdbb581712da6fce8f987986f0deb441f3ee751339d439cfefff96560b11842f861d5354ef28079106adf7eb8088560e4a6b22074a849a588d5c75042203972e32b2da77bac9585fb23d7db17d42a57bc60b7d08054d953e64554de39a04b9c24d7945ef22d7cad9ddb5856b03aa400feed5aabf09d1bd60d06f089516383c311f7f78ac4c6acdb68c419e039a6150bec2e09046c2e4995f5bce65dd36209c3f4e2cc8054292f9f009e5f2288da554c560d8d024430d22d8b762a16d92cc457243442adf25d219a0fc89b78a293fdefeccc77ebd918629a947aceb601de8258fd35ac83b5fe228a0f328dad21b3e75efaade1081ec3b5a89e615f2489d72261356f43faeb0c0e02484623fae1d293cf55210752c0ddc40265ec0bf90613c142577b0c4e5faac573d715287bd2c21454401ceecb45722f1c144530374ea460de1e6fe0c3c3f2b3c9af1ecae2f2cbc3f5ecc10060a080a26bbeb23e1aed0ddea806df98cfb8fca05e9257e1139cbe7210e427d6af98b5ff0494bd4edffa01ce8d848efc1e34498b8a9e38e8c0d05e87fdecd368ef87d9845d2b0b34706cbd67c2331d22548aa410e88f2a7596d4e2df9d59d165b2bf4fa973386d8a6a7d15144cccc38a436554e0399a74a854e375d2faae9c987d99cb436e7da3ba0bba64821e390098571d8c2fa65af64681e570432bcee2003ca1c0b2d0115e87648948fd30b6ec6edc1c05bceb6d4154fca13da8b4df9208be4c1f33933efb2556f88715ff7facd00044defd8cb25a65c1abbeeb4656146fab35f054ce56ec50f1ba0c512c52aa02e5688c5069e12fd97d802895d459cdfa4c06c71552f75c1fef78f1b2e5911ec819a004ce2ad3c5548b49d52e09e9dba0907351bc4ba62911eff30bd56a95358cd3fa08f3e9201e85069855657eaf5834d5d52544248e08d387d6f75c58d4c02e2c021044fdacbe06eb5750c4fa1d18631af2d6ed49d79098774d4f6ce2a6e44d3d27709e05331b8de89c57a76cc1c0336b35a70cc4ccf58047d204dc7a456bfba0041eaa8e35992ece03f2982f97fd0c5d640d1c550c4f8b8ca071dab771364b32407a967741b9ad744972005361f29fad3d36a36e7b7f476bb8b6a6db48e02beba9fd4b2415b71216ce091ec825515da0251456ca44f4a2cfbc00edd6507a2f44890ddfa91d96c234117f87014388b171ada3bbec39e8109a96cb0a1bbd6c9e2bb6223b64762e0be0961b7e1805e82993ff9dd181f5d13e5ecf52d67a763cea9859603f27b97bc54ce62abdd9d1e18a107147be07c8b53ef2488c208ba23abd504c51ee8796b24ccda856bcdc24cd2a82524bf032d74b502d14588dd3b4ff3b7e1bba334393ed6984406714eb0a67192dbee2ba5783f6b2c20ccc7f4d0f6651059c548f99e65287da537d0a7ef056d5be81031ccc2229290053dd106232a517d40013143ed9c40a191dd8dcacdbcd7a85c0ff0342ec32f8e2f65a8ad45ae53bbe4500cb9ff783cee8bef7060d1c202354082fc8ef0e8fda0b09f29144210ab08386d30d85872c603442a19fcea13d58b25af1abc43e1440c2c1671eaee9c9b8fdfcfe78e896a0d3a08917826db2d815eaf9751caee6230466f25fe00ec3f7aa2ea033698f68b830e702c170068b51c3b80270ed68831eafe352a5bc4d5f0608808bf2300d4517f620976234e846852c629bf5c1f0e836280f836d336e0e674de2d8e953ca58ec744fa4ce0f6166a6519d8881c37d3ad4babda1f1f06dc81746a0ba281d85ff7815c1d35d417fc7a2997f8120d1df0ef67dd5ad22ad6668aec5ad5a2d240254a74faf79d9f90ddec61d0f426bb1828868af387edf13a3e87e0409092e6564f80370591b80a078a2479aa6024a7223417141dfe94ac6b0ba87632773762db9676db70b390f0a2df2f63501c39195c3ac463f1aaeb0e3c05111217505fe3d4077b33904d06fdf348aabef16d160fe25bec9db8b6501ae4cd50fc9d038904b932fba76e68eac89a9e675226da5bf35e16426a86ba2398cdb5df39730c6697d5b0062cc12f256bd78e83b295be22181ec09280621f256113204f8e34c49acb713f850b5649eeb55d9580aca660db1ce28743ca196f7b26afc5b7b6b6a67ed140e4713c37b3197010166d05a53d27f5ad16b86491753d3e2f391a48359c400a1fb9a7403735323392e539aaca2e5cebb545a5a32017433245e5de1248a1d6955e09edd3114a9a459482f356280aa2bb98fae329aa57f85ab969fc55c11798291d3cf59b994dc555557b5795c9b32ca1b9442d99c19210aeec001daa39d94893d6a1e29a831f34a613c8da73600255999931d4c7390e64ad457f9b602e980400572e39cd1b88e5c9f052fd930db7b13e5016718384b370cf7edd755ea75a73c736436a19d03215fca359f663c7af0f16818115b9033cecb7072ea4560f21de6d44a0ec1abd6d9f3af81404a78d6bb666b5912105d921fc65febcc9f272db2d30002b616d477eb18e714866b6e41890aee1f3b4061dfe4b3d23905a67a98a882833acf6261ae426d0b4344795e1748248bc3e89ad48af708e13caba08cdee3d3b94dbdface923b309005973861868e7c9295c34521e0906ad854e2a1419a4e5b10278da3345fe65ee728c81a61dd348e2e3604680285d2402085b52009a98e1d4e61f75e17eef53aaf407bff9bed5b07b891a7030d7eec01a3c3289d749a6adec6f78b930b702fbd3a8bb0c081cb2e11cefa88c0c0c3e7bf036aaa59cfe626990dfd3e85ecff37a0786e25060b91933a266451ca90d03c73b174c7f00641e2999a7034344cee08fa7d44043dc7db3676a00a5dd586c4e6fddaaef302db3694e511aaf3302ab443525587ead793bf474c7d3b6e4a3192351e83275319fa6cd042f962cf82aadfded240c0aa2dd9da2a41d60c8ae75441575a7d1e638a797aa512c20ec2acd380c3e77d321660ef8eacfa32a4514a28fb601e8f87f357eb7d82cd167c45c4969a3af2a0b6055d046d866c5d9ad8920eb90e64d7a2d4734713c0915f12444d9782e768aadebabe43373fc139fbd605c4dcc64ed934c2e1130b2ee25bba24fcdb1d1f5559a55543bec4c60fa68ca079ddc53e9dd7e4f447052dcefc61ac20f8c0da7de6dffd62328740522d9e5e7e8cfb119f86009c0a0c72dec3a757ca64c64495d9d16a1550a3d74bfac7aab8221bfb6163d45b0a53009fba81f259d09fcff4a9ee3f30b4303afd87a23789bf1a63ecaae08578d09190ba5f68de5efe8c920a922c40373c139ad601506b2f4bc60e2129b78826b17ac5d954de1ac14f899a603bcfa2ca18742b3d84a66e23da145b4a3c42ff5c773a62226c8d6a8caeb50a208908222b2f601ef3c37599a48fd505bab6b90436c5cb2189641dc542603de80c1bee938e68a0c28b48e6857c5daa05ce25c4c84b589b3137b280c1df8adb5f4417a497947f05217dc888f684f6873793d12caf19dbed38cc967e408b900d239694a982ec62b7abccaefeed39feeab13aff90550e70e6e5b97c2f664e8b09d49df95b3729ac67ae5086f03261c99ce9893e7b7c1972822bb50a06395a4319405ec18a632b53ba958dc67ede821bb0ab7d7b36afc78a9722eb3cf92ce6619701f55333e845b22969d4a896b8fc739ff61ab78b66242f3041400e8045eabfbc66ef5c4082b2c0990b31073c1332480aad092714d30d082c5ca6a74b9128c413c873726cd010ca3ad4dccd442fb8551afc2fae2ddb82a5622677245814dd6c37342af69c895da809f94c4db3ebe4232ee2198ff218b17b8fb9cfb36747aafddcc32a02d91ce5baac5fec92107d7f2a891baa738867a0987a92f8c2407c8f54d74a05e5310a2da05643be465f374e90f8324638d86e7aad04f8e78e58532eb0b1baa849183849482f33c2660a9de2f5e50b245b417ba2ea706a8ce83c55543fecfaa8816301d98f187670088c9d9566cacc2941a490b470867085ee2161786d1177d07f673e2c0a8651d868a4ba2b976e0f2f8dd06f2281c2291b6a92844ac498f929687965d36d896adb294ce9c643d0435c05979d56d159ada4a441f6101b69b8bdbc114102f63bac7ab7ae99d62f3237d4fc4fefa46e8e44b0f64c847cde1ccd209f135b8c391c4a441bd2c2813888f62b903e46e6d6ea1f835818cbef94196323d420f5a89ba871b54982115415735db870d14297cf51d844e6c059e8fe85d6edeb533217611da6b19487b3aa91d41a006447654a4eac0a0f286982eaa3f11d1ef4c4309ab532bdd7202a4fe76543a2c481d450055fceb279621e445a4324b4a30cb73bdc817d6e160dcd84ce914226b992d106e291267e4824eee77c0a9d465bcc8caddcacc50b1b2642c8448e5a8a0f826ee8300e2e0890ba7c84500c22a0380a81c759852983bc24683ab87be4814ef38e2ed55a3e00400c3b505dd96238d178af20e18b40a622bf6974d7a3a95c01157dff989f8d2e2c9e75312064cbb8963ef7f34ecc400730d482c3e4a9aea1ba95ac8dfd0a264c43694b03542e04e9034f85736c5a14a6741115453c244c33d87d9829f102fd9f2db3546e166b3fdb1ac0d4e7f49e0e7cdc3e97e9b0a9d2b968ebc04edb20bfba1da7b56e33d8a51345864119e91be84653069dd51201cf312abf895271e2a37311dfb3a9d16df93f669992c6dc4b208a62254e84a5b65377632bf89ff7083db0ff0c332e9064eaa61b39512645774d0e229333b48aa845b4f4eb8f93b8e69b360db8639100db2b50ea1d4b0c76b8b33c4b620cb528162665dbb716581c7759d6c9d2cd8d631b594a474a9e21bc65c048c9f6716cd4b9aaae4472329f49a7b9bf8c5b7dabb606cf6e47930f0df472f604a2a62e03118d07ddc31746b9aed06d79387de62e286343f00bb5fd56bb02373d25c62eb8b9cd082689b50bcd40aae1b9782406b789695b073c271d4ee38b94de5c7d178b8ffeff91d46eea483089603f37804bf83962e656543c2324689a71d63423f88fc2dca29e319045b90c6050f19b74da2b9845723bbf2924208d8b65874a13aab6805db757a398497e9a31ce5f011d3076e49c6a271ae7dd147418b061602753ca51e6a2f7f4e366c2ff4b992719d174bf3c21dc1b286800a6724b51b1097d1912d3ca829da55ea9850e2fc19aab11bd571fb743fed9285790b98402741110da9e3899321f0647c243d5cc2c7605286a4475108446b0d46c2aa985409b083117aaec0fad22d080401735358cd4554decc2d09f7640b8ca7a719db6b129f72d298b6381d24f5ec83e4e9e861300fb2d6c00f34fd4d78b619383106c3aa5093274bebdfc230b8255bf44c49c6952e1414594f66af4361cf24e1734a3e36553297e296496af7d8db57c5af27243b959d51f20c7eb4654a0ea2593852adb900b5c90c17d03aa8bd8e6b9954ed47653882157d694853eea42c8cf59535e1a81f7c0567c45441d5a9b4fdd7bcc2ffee32106a88bf1921d66970313ee34652c7b2db0c41fdeae14d3c0b93832d497bb572bc004cbccbbbe704d10f2c7018fbc2aa4b7ff151e6eebd78d87c010c88c11c2e799e9273ecebcd3b2b4d7eb3be350bc15a8ee8d648cc49115a99c775ad63349caca8e261316b716a94b99dcc9b00a72dcb9cd8448e470cf5d90e9c5a6883390eaa4bdd84baa353b949145c98e6ec8b979ae700ebb7c70b0a2f9a86cd3d94bc6188fe4719afcd7394afae850b8b8a57c1ed6ae883a520084b317667408b69296bf68a92c51e0b00910f11c1a066361ab7cc40d01d83cdcfbad8efa6400c7b2b7df9cb84b6049808a74d860d18fa8f347274977067aac57790114c6ab32bc74e8039b06ef158cc5ab529e8b57b9147575f9885846d0b365ebd0e54b3d60171f0bfe7ffc2445f5c610b8d00cbce00e62b43e14dc55d2a32d63f795746c0d9c84a09d19b0720b6522e490447cb42b4619c3fc12d125e0484836180364b16ef6dea3403c74d9f92d93028102134dbfecc0f17c46a4d6317c5cfa69ff395aa84bef9d4ca8e4a81fe5b9e387e8663083d098f69e666294620842b804e0b10d7e5f0fdb2c30e7b19c5d7ce9b0bd54f5f5c4ef25fd8e83d22dd6201cf5008a0957ef1610e8868eff4b34382ffd76a5ad167718a0970451fba13a108728a21e040e8ddb9159e2a4d66990f6de00e9f4a49da729bc994f32fd21ad4379c602b13edc5ece29cd88c161fb53e7b5bf221fbfd1544b408cdfb9b69738c0f444c38af947f04eef7224ae440e85ce81132ed20fd6a08b7e7c7a22d5d731145bc1af3cba061f15d7ae04e76aa435bbf6d5a20cd051450cb00d054926f86e832992c800f82a449879454bf11d111e40907e146d6827956a0d0b635c054e844b43b8b8155af0a47b7c1b92f9c177f588afa6a15e7f2c318bea4268bbc11af70604ec9be9f6165d827ad68d513cfdeb919beebfa6f2b92d8692d4abd2c7e1c109e6c2513504cbbb6cadb2dd4f45504b77f8fa26581d6a7f5d18250f8289d705dc1d8bc2d46c8c8b56a3b6ec5ba60bfe37b8cfdab5e744706f4fadc4814ebcca050dce2a784d8fcc6c994d4854f977394212aaa46f915d9825b331f921ec956e6e5a679d0b0e4a4a8e3b80ba385d93016fcb835f415f4ae21fa8685c8df21ccd8c4ad0d20dc4cebad442240f415d6839c597d10f8117d059e0533017288bd86258f90a03710924b1558970333af678dce4bf782cddc68e6c849612a8cf84d7ee199579676266a383fa729b69c1bb3fcc99e42506f55293193accfea1ca602199655b13b20cea5849144a48da0d2bb7bee180f0043134c7496603a65a4863ee49c0d77b724096229b309eb6101274202e2accda05f0c0c3b034b533330c6ce3b3149bec663e2ff0ae78e2264739ed3f79bd4c06cfc0f54cd25f655cc5b857b92be8cc846f037fc398a656843de93789529a672d354ef5053ca722c71a628119cdbc89539adbc011256f4ef4013751bf94622331b18755b188e32079e0059158dbf2fca29fa918ef5096a93e27ea1f9e7b9586fb0db0e4ce103fa71927c5a30523a4a1b557ba611d5181049f87b5d3578efeb15ed62555c45c95e739dc48d5d89b1a19346eee9649720ce20be71ddf7cecec471e3790bac553678cbb848f0a2321d57063ac65bad11fd0fea13d44d12222989482291bd690760084e07b0073203ca3f72503621eac4f840c0f5af379d7e867b4ecfa8437fe6d613874d1a6b4a8fcc7d55fa56383125ac63d7755dd5d0dbaf32f63663d6630880bbbaf247949a2e65159675adb56fb19bdc7f89497bcdbe0848763d92f65fe7eeb57addae6bd332eb177fd8d192f0b2d30b76e207f8e362e211f4b1711fe311d1043bc62b95abdcd33c8d5ee2499df89c0d2c184a1d4b7b9e3427b566fea491a86661463b9256423ac16234e0e803a683e455310fd8ea0f9fa828ca96ef590587e2cfeaa3ac2af0a5a2c71b04499ae9ef859d197961cbaf681bb1b634e92f866dfa6d03024aa53e6f67db7fbfb36ddb7e1b4a42b76cda4c992933fdd7ed4c675baddb5002bcaa3c0b226902acb7d62f86bdb5d6643299be6867d96fdbdffc75fb9a724f19f8b587d956b4b79c846e0dfb2cdffc25d998cdd56399fe35bf7e90846e5d61e79c55aa6acecf3dbab027dc39d20eb955b9cf97347b8e30aebbb95ba77c2eb54a1527f6c42e480487e4c79f28a0860c410d77ce96b342183d9797c72eacdcf4da2aab8fd10cb3f7fbea150e81e14f5da137037d78402f7e0761849ed72a6bf4aa2a75304429c03ef62d60df02b744ca92eb97d4c72e0da50e108c5eaa8a1504160a61bb7d485eeae89fba62c04203e0eda6674c8c7388e34044fa56ab351d0825c4e8b3aa755befd65b5e1c41ce96357abfb3054bfd59f875cb4737d473c884518694f51656cbb2f4071f47f4e1d5e73edcc1e8b6657dc51b96bb68647d9dd6b2acafea4c22ddc15495e538ea43fdc1b774a53f77aaa30a28a594d2ea734faf023a84d0e974a702858218ba6c8f12dfa330c07a9475fa8c925616ad547644e05aa5cec49565d518e3ccb9d785510cc32686490cc3302c6298631886c11a42955583449905b99910d72a8d6adad4344d46d7340de20bc3988d0eaf0b5bb7d6420cb3f6664259a669dbb64d6bc7971046cf9ac3abf9b6c19979c41056964bd5d0b48728c8cf77fc32b05d6f189b4c27df3dddcc8c27b42324ee1cc8d309e108899b833cf06b788c31c618b5bbfc19a7749f4b61be54b992f4c481982fb0d003949a77ce2b39135ed9baeb6c6c6c6c6ca2436d03521fbb00906a3acddc1e39a7ac8935355e032fed83e1749a99e1381a9a1a35f0c6aa689de130e73457484d07d40175b1734a4353a3464d4dd779363637372854aa67e762685574deb821a35f35375046ef6cf00dbe12dab0216dd88836bcda6442379910148ee3407983729c6843dec09104ae40638ef9835be24ef5ecd41c570e1682bd317f292171dbab23f3349d6d07e6c163c29b96f15c1e8b5d3c3cd5e27158a37d45fb5e871107077338703e5b08b5ce9183f32204f403c210421041870ecfe33a211d6ec70e1e3bdbcece8eb6b3b3b3b363632313ba2184c3a3f615ddb89109898f234772dfc91ca1fc5c177de7e0703964f41c392aed33a7391c73721cd29cf5a633a11c5cce0de17a16e48a0075441dae83e66428cc9d5474284f803d4f4767c70e1e3b3f42266421beaa954a553435654c792a958226ed2bd2e1e9e87411da910989bb0708f2b83c78ec509e29a3f3c0aa7d4b3c2f13e256277ed43a3b78ecf08c20a343c8b343661d3dc6e831422b7ff59bd0dda7363f222866f3d8b163270bc22313a23c3221d72828f8bb0e631129401581e107459e11a4ec4164fbc748d4790a0001c884049009c11eefa9da5734c2087284e8b0070a85d4beb1a3fe260081262c8c6e44c6996c77aa69a414d248e98c926a0de91473ce49941373a0110906d260a7f657043f3772a31d03f6f73d938804c03be0f8dfc78813638c313a86151cb2ed1923b7a5ac01f5e855abf5b562dc75305715dd441ec444d8092184dc7dea5cdcaa28a5d4a97b2c62d239e5c3af43f2ab6ac99773da9b1e2f289d93cea9ef3c83fec420c5bf0ef94f2d44df7277cb5d4f49abdc3306ab307f5214a8be728931a4958ba4f690fc1bebc72b095b0f777c5a7754e2db7591d4aef4d07c9737d88ffe0d135809dd951ea25aeaa1f83ec3d2972caa940942861bb24c1720e1e1080e2e3e40022f5d0081cb126362161d30e388279acc3082262418244a62e0a5035998a84103369c71045a31a241135f9e30592209337e904598264884e942c90c2906121b4c0cd185164590994195320a10850c252652c2fcd0c5bc922305195e6c20081f34d1032ae6480f61c0600b285ad0031371cb912d3e948004484835f8820c19908104298d1ea028230c2c494954073598628a256a80d2039931908821a3054300010aa32f35d030530922c8a032c4132c64446024c34042811684e940131fc22c9d012684230f0021cb18198ac082e6e0c8ac02c9092ef0618b3159a0e10130a81847ca78312687107421811552fcc0831eca50d9e28b333e3066098914400105151a7ca1e18b1c03893efa000f9618d3449829611cb1028e61860e70b86203165ba8902408c3064e0091a481249070010e8a8408c1126472c032441857c0e8c10f860801164258018510f308119668a207625809410c6e9853e091a9a50b078a30438a1f68918418f40bdc12850cb4b84203661c81c313934a1a5794a0063878f24412497c8104822993c609c68ce0cb1667502fb48031c313204ce0050751ba4092c2165d6cd081862852ac50a5235420819409242d30b1850a25c48069a265a6801a01c41622e822461844d01b1c992f80687c6982e54910aabc400772043f88c00654b4c00a0e5ba2e002890c63c268228827be58c2872d907c51c20834c290c18a3368a05e60900ca2f040822bccc0e1055a403252762042074fdca0c50cb309241698e2041fd042891b82b0c2060f38e38805629630a3075e680d669214e3e3012caa4841175e84d1046a11812aaca46183204ee00507ba1c296201106980b105193a5cc981d200491454ac30da010f1ae08013740631d00004305ca0000733a2805e661648341bcc20450b30a688810697b802314a3ce921cc0d42d02d47240f31474c3027619eecf81188f8e323c6075a01e365c7773137a72c29fa7895e84379b0e3fb951c36ddc1beb82cd378043525c09f2bf952f46ef08071fc3ff635f237778d370229c6ecbbebe6ed7e6642366f6176f3a7fca5f6e96f7296bf157676cadd679928b5b38f9910f69f27d5f8a4d3d1c912f87327950cb8c6bf67416abec607c90aa3973d8ef74eff383e6234faab1be37e467f7e0c247f6ee898e1682875362db5335dbddf6c31a569ab54e9d93769ff883ab08a8d118b91d43f5ec7bf7127db7abfb9827dc79bea3f586503f9d20fff127d28fd1ca3edc41dc7cc97c2c09f4cf912944792ab9faa554b4a86061a68f0bfe63412e44646bea05de92fc85a7de7db9e31188707f8835a64f6e3ba6ac5b8ebfe33b8af8d999023f1439628367d0c6a195221f14396a44d6b75749d4201eae931e14dcb2e10166310474675fb58f153138cdb6b6fb529b0efeddefb4375fb6aefb5d785b3bd32cc6a1b5c98fe946127d3fd7ab7ec3bc3aa1635acfd479fa86947f7de7befbc990d2e2c135a68616484e52f67635fa3cf497f7557bc4df0f49346e3199a65cf68d9333371e6bf222af42b38a33fece929fb36e5df387f38f6fd4dcb593ee2a9093108adb5461b5fa6ea4e297dabb2acaa48ce105007faa81fdfc6c6042f6c19718e990026ed6cdbf3e3c76967d3b2aba4b28ab01859b08108b344f73697aac9356832cc33d955057d4929a592beeb9ee8590f923a99f0965d8b51ea4facfcf564dde34fa24f7d8933b5397fecd9137f8252330aa5d78362a27814291d8a01dad388cbf9fe010155203cf9032552f4a9a46c229bc826724acf8532f341d18b3ef2639229e22cd0d81f8dae2a897434f6855536d4017fd5dbc7feabd087c7587f75d39aceb47fb00aa55a89dcf46da5844aecf38954cece0edeb4eca6a20d49db6e94e6bb1b98053f2adf649bef724d9e791aeeb5c76ff115b072fac32793ddeae55996657fbb1aefbad310d6e81aba66dbe38f3f61968d31bc7dbf313621faf8e3a4fdf2a7fef7fb7b47bad8b24a4846f5dd49f4e2e32ff873244792187c17945c3fd951cc4cbc5d2cccb9aeeba29452eb9a3e57a67f5dd7755d9665ed58182db263557fe5b96bbe95b66103feeac4138a65f1a665106e1d1d1cdda6bf0eebecf8f6b2177677f6ad738b9d1ccfc39b96edd8186d88db9b18d9d37f75c67f382fc1f4f4b993def8b7b75b166d599f3fddb608ecb2bfa2287b28fb216b6b96bdbdaeebd22eec56edf433f1badfeb2f7bfb417263d7ea0f76b96e3fbcdf4bf06d6b6233b7aca75996595d62972e996bf9da7a5d6da30b2875826203287655a16f3f888691b5828454a7acb08e38dbb9ed9d9bde5d7f443b1bff7d7b73c5827d63ec462f76545bfbd6d3fc153931e9aa318d556ce6b4693965d921eb33df9b56e464574af5e6dc78fde7f4f70259a0ce71883afe34436aed3b86d94c04bb14814a50c9a1d276a0ee081503fcb90f108d1d7d9cd817e4cf49fe489de851fa0d903f3fe857ab8ad3afc3315be2aad6f710faf5c3080c922a92dadf0ad8dbafd25fead2f067ef5bce74fe746cacba2e4d94b3aba34d8ba436d54377a691fd4d5dde4e4eb5d65afb35887dec83e2951fab3999f6d95c4e4311100c981e860c98be060762d24b1c88e9fd6bc41bccde94ddca4bdb2d7fddf79f8e1dbf7e50bc377b98ddec7abfd7fb755defba48ce1eb2bad3385a89dc4355d71b3d9ca26558014365432b631ced6e432b6178b095c43d4497ecfa18e68e25895b49c5f2f5156696c6dfc470ccc61ec3bece8de9fa7e6928a7d4fa44a20fce1ce74ddbb7b6be045e637c35a6ab43d7f9f0671ff5634d4718c40509680fa5cecf20cb940122e5f31fe265caec21a222ae89fca1c0102475744aeac82aedf7dc00266d7a85942c530648a6c542f7a3eba856bde97b0f8aa345c5b3735b6b71b6cdc9d976d3b2ebcd222cfa0e8a78d82da59f43297efa3350fe70dc9f3ecb50d9cf3c0472d24b5099462960db6666def4309cf457f73dfdf60d98d1a687d9111666fea497c02a75502b68da3b10fca8161c087e07f2612d053564c8fed5307a1d04a2d5e8ddaff9734ef4b0d4a9aaf937ce237eecf40001459d1f55918df10808298c5fa94fe833dfbfca775da55f5c8ae042c49e1f87442e457079b267915b5d8e31613552814dbfd60af557814df557813d047fd2eb3fa81dd312de2118e052041727732b997beaa8efe5520a5ba38f125a2bfdfdf6b1d0a36f037d6af4a27dfa1df4713d7d6bb3fc18f6f13be8436eecafdc411e0c67571fa1577dfc0cea602c75aabf740779aaf9357fdcd657578da315ee64dbcddbf53fe2d88ef9176dd75f7d0a03ecfb8ab8225225e697ce96f988efcf8fe60f196387434d9dcda638e83bfc0972273b48fed4a50fe370ff00d4891f97e24ffd751b092edd80392a9f1f595d58e8357f3dbbdebb2fb72fcebe39fbeeecfbd04b80dee36a9b4d99c6efd94353c61868918d3108ea55911d2058d29e32fbaa7ddc5cfb8b3dcdfe16524a7736f6f52bac6aec87b2afb6b705c06f59c11e33219f655b5dcf8454ffed6c0f8abe594b29a5d4dddd35f6d907492dfba699fe7636fdc135fee0bfd4c24cc80ef601d285ca9a73caf8517a9c310a71c2aededddd7166c09f57e9cf4a0404747a82458716649f69ee37cbde5ffe9c2a9abfd4dea6eb6ffbfb35b9060dd6327ab5ab65d909706b7a9e4cb46e5a6541e4cf24d5964f935465ca94a95ba45160d93ef6f7d29b7d633e5950fd97fa56d8b362d8c2ae6a55f267554d19b140daf32bfbf153a832feb9422985a8953f98a4e5e200891fb69450e290b976717dd79f7cfa36cbd7d72cf74df6dadb2b13d22eedf2781dd92ef616dbaedd58f6f5c8d5b2b77f3d561fbb6c9642d1ce78e2ae1f5f72ee9c007ec88203cd2ba41894b6f555cf18eceed42184103e9c4257fe9ec89db8932ddd0996f9d39a724a6e4ba93f4b3ef6d8755ddcf5f2edcc84a4f4cafa2a3e5137777443767029824b94524cd70594caf17672e4ad79a6653ae5ae6fe5c5393b2998049403276e3bef964d6ffaed31beb2148ab6696b307ad7d34a7bc8331fee9f3fafbd30fa571577974f63956d0352749154b1d839abdcaeb1733bcb72db78b1b86fb2bfd7da6bb32cfbbe70df6cafefb7d033a1cb923f6fb8bb7c1a7386e05029e38b0a0afd59299d4bd38bd8bcdc9f385d010da3870202fee6290575fc973adc45cb6e129654df924f89e694ef50cca5c3132cf214e914f1e33b3440922d9fce4dbf4ef74ca88a2f33d1dd3152ea35fac49f918a20ec0ef4240584b7c3e3e04c20993157aa16dc450a47f33635ffe10db91f1f38ffbd0f8eff727c6efce7f9d8f0f15f6a93f01fd01f798f12508ff2d13dd41f4dbe79541ec0771967d764283e5fc3fee4018c1166cb975c0daacb10cbb6e1aedb6578c5e608cc4a972115b562dc75ff51ee141809fcd5db6558a52607e049c841de4716f2353200fe270b3d4e4efd08f9c6f7641c2f808cfa2e432936978f709fa4ee1e6f6fe4111e47ee795416001553173813a2b12e244319244779030000a1548690077a3d2cea863702576f97e10b6480058d11f8abf8d264eebb0ca3e09ee66d6cb8e7381bee761926e54cc1dfecb20178e872016cba7499009c179adbe51fdb5e81bfd9e5126ac5b8ebbedf9e974a755efc6420df651fbb264339c0d3fc7c8d03bc09f9e7ed4f36e10f90a3bc0700d2d5f0b0cb24d828e3f4f183628c31c6184f32292949fb1a244934c4f8f8a2143d2f38d9bb401e2d5227cb95ec4e64a70279b4d871e6e3cc7f914b0277f9a72607d4edb20f764597078071d1e59eec5f5023f3fc4fde8f93771e95773c8eacf35d16c0b6c947509fa46e1e6f3d5e2e43086b32843b43b8c3c3eab143271f8190c7480c465be7adbc34b9a6e66dd4bc083535b3cb01202133f1307100f149f857c2dfec3200382df876394526ea24e16feadbe51e9c14396e974718d3651e202575e37cd0c3e8e1b88142039b508f7a9ae7dea9a03ebebd910971a8f7501c0ad3649bdce51d9312feaa08b7cb3c1e6254f6c9f931972eefb071464dd6f135b2f73f39e8bbacb3ad4d969b8b3128bba703d3641b32b5cbdeded2c58bd29718268e893a34206335c1dfdc71bbac236b419745e87208d6043cb7cb395b086a72085f23e7fc4f2ec0e3e41c7f23e74765111e47d60f9409f05dceb1b90cc5000678287f88483fc238e9e8e82893f025641f06c84c7ebe8607f2a3a5c02772f44bd857a91c513942bdcd8b40f3dc5b2f13b2d129146d08211a9506f60821e7e402641873e89c6d641f99840ca30e01725cea94701712f28ff7914b781bf9df06d5657d9552b7cbb9ea80bf0a80dbe5d7b2a58b8f4c4206ca2ec665b07bc40f923f36cca872254bd4898f83237b97e879c9aed4651c1b33a2cb37503de8b95db6b19fcb507c7c7e7072cf002e0e6a7b54ced91598f3b95d46d964a75293bd4af42a19e06f76f96673198acfd7644fca5e253b8d8fa692e2fec6e6f43701f93354e213aff245208e4c2327b3e35f2f351379141fcb1f66d4a926f2285be2e003d296a7a29ea8821166694ce1a5ac17766528d80f134e889ec49e524a31aa6d76c01fc678d04257b042ca0b51ca082c44ba1c5ea864a4e3f0822c2ebc07c2d09903936de32f5982e1143938b1bfbba39414fa70337607b168f8ef5f1915c4fef5715f9f659402f0df4761ba05540bdbbfb5305b80c6850cae040474420a2c044d89492bafcca4262fa015b000da3ffe05f9037f85e853450cfa1416b629d1c7faf8275c81572ad00f79cd8b5ed575bd705d4a1ba752de77152e2d0002712a4878bbf4bd9db0c5f8180f49f71ee194c14058941fa720825dd522123dba2fe56cc72943e528c658f557d5917429ef9d4424104fa6e094c147181416bacf0b6b8555b6a29765458b69d9a11069d179a5624aa6a495722c4e2eb6edb2b0edb3b7d9b6592793c5f055ad4bd334ad5a18ce9f3fc9b4ecca6a666536bb19ceb62ccbb2ccd2d6c3fa4b6dfe24ea443762c7d732a49457bbced2d5aa1615d2487fbe67fec6dbf64b6dfb0169f64d883f2e7cd5277bfb37b20d1c8ee66d7297617d5b6766ac9a1a341cde5c309994f0df87d643ed743a65990e7aabeb8e968e8e96e2d1921b19c9997884d5ac565c6b05dab5d628d68575524a5f51ae2cde188f8ee2516675448a4947b5bad157603086611886bab1e930a3a5a4384d3e20a57af294d5ac2e549fbfddc88d6a8862845305555512f6769c28874a49a717c9d94352d7eb2e830d4af287685403e6a287f990b2f43fbc292a7fc6915ffefcd31e3b7a07218ebf6f3f3b8e6cca1e7573e2a287bab9c16167ef4a5fc6ec48b323102612c986a92a33cd859d6938af945856e997bc6a8555b6cd43f2e7e7568c16b6ac9a1f7af531a62f3d87c86da94091c4c0202c9fbe3771a320729bc0ba419c49b5a6c41f0752ab13d1a3bec5b7446f8a11d047dc4044ef6807ccd5ffb0172f4b4a5e941cc90b4e5735aa732324952b55934ac2a95143662643af8c3f85d4a0017620f3514ea267e56ac99c713a207a2c78730758e6d0e03ed4d0e2f5442fce1d60a951190b90e7caf6db4490092bd4f0823fa8e4829c3ef4ff5fce6a42f4cac0df4bcf8464cc9965e01863ec2612d6d34bb8fe8b615bab3fab8a12bc8f5c9f046fe83dbef70b277afed8855595aed14b5082f711ff24d84bf0aff9bd878c1173c1f2adafe40c5275c35bd66412d630849694f2f3f0756537d72a3a05014e10f0e747f15f70ab7a3742637f750355f94a4a5dba402db54a596b4de29bbe53aa5128e8214b13d144d1f34ff544cfdf03d890f9c5b0e5c3f0dd0f03177861cbff70f67cf9f2cadff5f5ad4f6eebb3b6f51f8e6519b176d543d6e70f495165af28f0bd37a386dcecefc38dfd25effd7bfd7529662de6ee1935c4fffa4b0f5dae3fd410b92f6d7da67fd56b7d51b9ed3f5fc2e8535541719b3b16e176d17477f23bc659ab1860df9dd481690499b3aa26c8137fa681e15bb9304cd74b88dcf5bfd63a2bc9559dc6950a70bc4c948e3ccf842b4c9ec0401bfb947b54b06f1b23d0864040de8ed6dfff07bb482995e613f80baf9eb63f99b2c72eec8d0a78e5aa441e992d5fd62c5a556cd2c2209b69ff75d8572630aa7ed1ae4bb0ab2a1c24ed6f2b2f1d117affabfaea11df56ad2c9d84eeaad2a82173573f77a551d517ed4a9aa8c636f08728eac80f6242068e91df754bd004a5c90ae2334e8d023ff6d2eaa21731fb1447c88d5e9cd782f46de5740aa13f67177db069adfe7ca3866c77ecad22387b08c782546afa714e3b5fc87ca1ca55747ab155f96bfcd7c33b495984bac936b9abc10eb05d7f5516d837edb1e7d7d05f0f0e68467fdda95613ceaec5a84bd9337f3ec6b5fde7799ef6f171601830b6d01e422bb6a6e1145ad52c4dd31e4aed09007f807e401ffe9aa601c91f1f03ea646000fde748408e84bbee3d0f2905b4c3401e1b4db0fc48136d0c7270c54a1949fb53fa7120622cd5d002fff5d6d78f5fef95b1871b7ec4aca1f9f3ba3c436168be1cf26c5af353520790528efef75fb73b1b9a69b4faad0aecbbb24c58cbaec5ae8a54c99f52dbb6ec2d8b94dbb66d407b4b6d58fef89498923f15f0b2457eb0e2aed3df7b29280668cb16ec5db4681460ff20e9ef4a385e680cf9c79f6f59b7aa1c8582fc0f921615e3c4b6d9d08a182d56651109817b88481691f38a9842d42e54a99e05384c7221b53dd79e9f702935addf58ef4f5d000442c48958fda0777d1b46ee6e79162fc1dd5d471b46d4a9ae286d1245208417e12cf01e368cac1feac3a969fa23c2b099da1ff6433a1b811afb548a2815c4faaaf5148498fe52d0339dec9fb2b7699e55d70ad999a960952953a68b3a7115020ba10f9a65fb4b27b6bf10b7f24892fa4aac4f808c53d704500d210fa5b9fa2b53c15f3e66c4dad588b52f25c3cb7677f9f43d53c13315dc359e720bf74be812eb2d4705630f3314b09dc1c03d0462ca309c9e72798994164e6ffad44e459f4ca36af4a2ebfa033b03957ddf042e34157d3ea20b81cc3c0ca6e79e9e7ee6e90ba9fe7a9aaf8710d2ba29b5374c600ceb88ecac8361060629dbc3c0bd897bd3b3c069d36f9a85199d653bef299bae7d135054a72e30f884a01c3a60cc5941c41bebadeabcbc04140ab24c19e9310cd6706e8771155777568fd07b58d1670583af84e0b437e2eed6ebbaae58aff40266072f607630da514341b1b0952923b7f5371b71abadb9bd4e6d0c2c25be5bbf7080ba14e7e1bf1dbeac2afb002a239611e99e87c059b763d1726256915f6613e93edfca34c3cc1a328dc8c801998618dba4628819620b104cb144c548ee6049054488913421bc4288a5a32962f4306f589268c0a008b7d86cbde3b0fde368e5555565966559395525bbeaa165d5b7189df5a77f16a4c26e5996cc558e87392bc3ac5b68699f910f87cb84dc5dad2bf3b72324a4da15f2f8756596f541715a9635bfaa2a2d334f4fc86642e49e9047e6af0add29f3778570853c75b31bb66ddb766ddbb6d56db3b66aa373935bdc7ceba12589515828a79c724a09a3124cacc0ee417624ac2884b0a3049a907ad47a208f9d99901f417c4ba9a1f65279d4244621843da7860a42bfb9e1a441023838314e4a679269c54208218410429f16662d66ede4ec09fd5a95fb5b1e71a2ac2aab56abaa2a286755559555ab5511e14c5ab9af555b4eab5955ab56abf20a7ea5616559b55e17d600cfbb989d93e60f0bd19cd13c2177ed866ddbd44429eba729ee13ce39a7432ef037b53cb21ea594525ed100cf23d275d67e73cf39bdf2ceb2e6acaa5a41f841b128494cbab88b5d183666f81ca574469c1c58777777d71046f85083b156021b67430821c4d9fe9002a6d40fd8e3eda43e1d5c08db2bae77c7d66cb14ce796dbdbe9e142a8a263621633995278f372204ffd4c77367794dbca9b6977c7dfdeacbdf6f7b34c639a96f9be7342c8536145afc82b433420a89431b32102a4e2a8f44e164435656648002000000043140000200c08868442c168381c1266557714800b7e8a4280661fc99328885118a48c31c6184200000000006064a6888300b99eb317ce9b79d38f19cad04833b1c8ff42131b0f32e2999964f16c2d046d4001a38a3cc705b6129d10be10723156099b1938d7682629f39bb180e7a4e2d2c460f8679ab9eb21c7e75aa9be2a3f29444e4abc12c4357b7388ca019d6f0536016a4a6b6a2df0c952d5a04727c83bca2fd4a46791d9583fc0bef459748f5aad60cbd08f630ecd1bf3e78deb71fdb9b88a488d7e56a2c31190e808912d857b89b2e5e7d88d13b607671d0055a047d0112ab65471546478f726fce304b44115771db376c2d161300de24a17c947635f8a08372eea69f7d63874235ba36f11928c8102e2d83a0b319f9605352a11ff330506663565ea2b0683e34b8480c03cc22410f2d752dffdc6a6e75f2e6f0acaa709710f641e7ac302d9b58d64e7809009f169525f499a0da11d9b2ebb1ed9804287635a3f1c7fd481be2d9f546e5f1eeed2beb031d6df1e17c534c4397884520f796cefa41de72489ac8634ded1b5de383636fb96fdb0e943039b398741ec865e9bab63873014c78a6c603fdca883ac74969aa6a9d9aa8ecc840eb18fc64f4cf1ca82469952bc2518cb80b12c5570c69b39e85843c18d4e585596eed365c90fe498579799d9993620c0be9121b5367b38a0d0c3cb5acd341f42a2ac1ce50681c68b60529cea113c53de7244aa31abf5f90f9768e2fee773a0046135783a1854059838adfb0205d481ef69461b784496b4b469c571a4a847451729075da4a38519b77ef07792f65f062481d79fcd0e6703ef3f37c09551b96d0539db6e832cb1a875d2e681078783515811b70ad77d8d1c89cf7c22937c662279d179915282dfd73d2a3b7cf2202943bbb2cb2d4b13f2c5c28ea5780ec033a514246f39863c5c889e1318a98d2dafadfde32a76da48dc84f0bcc13cb4493feb4847a22f2efba30b6cc1a396d9d191460f314011d98a13f76eeff5602776c6f393fe2e448e64b5a75daf31342dc435ad5cf831aedcc2d644f924464787187b896bf375023fc83fde3f1ac645db2f41ffbf09793fb3cfa13b42e9ab0613846b824c7fe87e11b8dc976e4e808d1f310cb5cc9e4bd099dc2dd6c06940dc3c1135fe64fd42cc3d414af1711f4c34796904ed35fbdcfa61bfc93bfea10bfce4db3894c6441230c26656b60c249f3234bae73084f2544aa2db933c51a9e337513258dfa1885f5b5bed36ffbbc3a1a7e7016dcbddc085219ad490efb794af754e34e9ad505975b89d5fac7fdd887ab1b4f8c858c755db5901678ca35840a0b4119e2298d90d5393773172fbb46fd5a961e0d688d0cec930db2eca6a999b6e071aff0beb04c9ee8c0c95f3c12e13583607e022c73030038396d0e61a889e38bd82727b4a2abf82ac1534fa47d426f855a50ec8e4e2f12a1be4f82ce814035c0d9b00139bb218e4da797e182b160f42a3f7fb8c20078fba474de297aace375ceb374e32a84ac996179336d731afd90a967f98c835f1e143de1950dd86014171af2ede66eca02362cc1ea2846a090c39b9403360a76b24283074e9a305f78815c42882e18fe63cd3603647af0bcc5c1e49ce8af8cf5e9cc29fb524a9fb6e77d5ad42601d58caeee6a8a032ce33af7fc2af9e3ff3aad83fbeec2a253ae6dd00c5a444f39b125891f9f81be0596e0ca29a5e9e95435912a4390fc43289bf5c651cc768ebcac84453f2e569ce56dca979aa0c914f794878f3a62793b09037c8f0658015a81bdbd83e4578e37efbf969f1f71b770750dbb8f8b92c23d1226c15ce474955c8a92c7717c31513180820ecd1ec0d0ab7877d414dea391fa0aa6571ddb028d2725bdbc5958877aa48b31983b30f7d51d3057e84db622004103688962f0acebc063ea55b806c152345e113a8fd096f542a52b1960f9c9f573a08aa1d73c2656778a9c46df9ef4924c5241a6f9575a5929fa0c09dce942cc689dd8712d33a3dcecd4a6294e70a0b718872d5d055c893ace9e74008cc0ed83dfb78020b32bec9ef40f9312bc424b0cd0772891755d5a5f789cfa31d18a39210624270c0857d85b2d561c35eced9e04186a19499dca5c2f7cee1b4ce2c1aa34269bb43f8872143c18010635beec9acb090f30051de30754d3f0e70bda9b70e090dbf10d02a1c7f87089890d07b41056c2e479760010c25e9d9e62725b9cbd0dce946b56b63a577e44c0c64f7206fdc814cea47594d266ab37e84946bf68585542299070162c63e4509677e0c98a657df302f302e024c32be17f36483ff47a3c53f933550398108b945cc74b75abaa3cbf72c5a99a5a29c1d57a49246667e07d462b05820099f7d848fa7df70dfb4ef5a8f4a5a3dfdeeb72041b424d620f94a2146e79f187527959348c3c09d41d7521253eb3ccdf8b1a7fd8197393eb51e5d3ac04c6f35a66a584b3a33edb06bb365e1d271761049e28a04105ba24588ee70c2501b55507d45dd9361ed1cd26738746092115dbc9e52783e22590543ef18ab2b15ba1038bb0da8329f99b7f505a6ca8c99f0774f1ed00ad4a120a05295abd4408bab8c22a04956d845c58de8fcb3e42d46657d10a96026dee86c581157c78ce6fe1af30ccc2c4209d449ca8ed025b0b2a8828a945d3b900da61609c544e00af4a0bc2fd827862831347c7983c0b6acb92d0a1a6badf0ed93b7fb35a9a54c916bac9767a5bb71088229472fef590d51dcf300154363d3e6f33a833838d8c0c5e05866571441ba315915654d5a51374998c18d2ded47066e692b6ec8aa9c6226f6b9effe8709b402ef81f9251552bc7f7d59498d17df6c8642fa5422ef28569e8909afc4484b1ee3c83149ffc643cf156f24e1662a998da5dbd83b63a15ff86e8dae5e0785f67c39c0daf205cbcbdab1ee3ad37ae23eb915083bcb36e4ab4add7f87fbd8b71946f600a6d4c15037a06bbf43c00b6813888eaf5af34d9372e6578394ba6a64ea6bef3f9acabd656a7ca6f238775e2895965412c414f7b75fc8790ab7a9f3ed5a2c8945523b866653396dcec6bced98392eedef3e3cd05bdec2b655577d1c431e6061be6cf25fa43591aed0a4db74db8fce72deeb19d48a7d12eaf49db8f5f983d23369a8fa23a3231fd638dc21f2d2fe3ec882b6a660085d3bf9810e5573212b061a03d0dd510882336cf1c57474cb50d0b29e912cf67edf09817affeba1cf1349cd885e5bebea78c52b8fabdb94173621213cd04802a45466a12d5c880f21365115fa914a46d68ecbe500aa537b818d82ba52567b1693ff9af1e5e152645a3131b42bbe5bb9eddba2dbcb67c62df50caa35210c1946c439ba983a79b2a947d5481b646ac4e25ffbdf552f94a9a67d78d9012e7c2489e89d861a81362ce9832a7315f1c17cc2154816d4c606d58538f178d0f528d3f70c47c9654b586895304d42c6d77a800d2e0734b0b9d184b89328d207056a4aa52828b35f72b626fe6e626331b166665148dcea3e85f6721e9206d083212db6773841ca4fb34a442cae70e4927d3053187a3761842005ece952c91b224f74399dc3895b2e7cc32079b63a73d256b987a4001df2606a269115481a06b8286947efe218a7940cf896e017c2c8eca100f805dbe6afb6962205fbc03ed798c61f8a42f0d423bf2145f8c70f32b3bae9e46735e195a4327cfd05712b6221138d9cf86a76bae042b4a5960e389bede0d80d5341f6c129fc9318b13308a012c77fc6ad0f0d95853e0a77b262c970e43631ba11465658b176e0e6450d70a08754bbd8b4c17396aa1f0d25ec1fa5d591a37d72fd9eca151a8d4b8801c78ac45912942d8c9e5a4b46f030f055fde15f343d7d1e6fe103e639254b342ecba69e5048ab0d605b88f7d32df24ef3869de4cb0268a0e4fc9b544e651846934d8703235f9d604e4cdfd15e6b4552e15f44265cf4229449ca9430523fd125da087ebbacfce07959863acb9a9f946c4f5b91106167cb1f4aed74661a4d46c48d5da407058b6b02e64568fe1cc45433f51a7a74615a83ca4ff58e4f070796cb4ce4c553b88a59205c1517d1c72e607e47e09a4d009ad335a5bb846d843e41ea5c4f0cb9f1c36de3dad3c67b9fc335a37e9a711222997e0d20c6e13b19f04a08718b8bb8c77da05e25088d777661c588beebaa10ebbf6e49807b008215a6aee5031f8613a160f99f6310140c9b29794b6b8ce91b8d4cff4ade7a970193267470b55853777f6fdd953d74ecff7d8a001f26bca7761041c83f35ce36697f865811ac6b5aca776b035307a75432d9a3b72a17fafe854d44aba7fd5243203faea55ad071e492b27403a554d725bcf3aaa2905dcb9d1bef3cf64685d80fce310de97b92be5bc2c3d55a51d4973fd60e5e9c3600f6cae970c2f58830511fd5ceb40ba50a0e270286e6067a65d21e7638e193afe5b3a99b59f42a9546245ae2dc99773b291b7d85fc537bdc3ccb8c9ce9825ad4f8a18c2eccf386f476d9702e623ba28083251ef712fa083ed3598b4c90182d71612d14465182f8b0fd49048a27a5e091747e47682cd8e6197fe0366e25378ff345d531e34ea3b761aa39b545cab93d7d040c2a1e254e1d9e3a68906140dc237eca1aeba020c6ab7ead9295ba8509164571b5ffb10c1fb6e3aa333140f870f647125b07c5d17a18e801c8aa3d6044ebe3718f2c41daed1568968ca540a3d78733678246244a2b841949669e0d2751322adda0e6a0ab14785bbccd4151e89dc61111695fbd254b1d5a33b146c9742f811e2e30ae5e63b370ac12a2f51aea517b17c23adfd0b20c0bf6911b6dfc23b3709d2f3a59c59f1b6dbf40920d05432013844032d413c07543425033e30ee4551583b62f611913e2e1de56c4cf1f6ed9f5aef7bfe7bbdfff3d3b25de134d3e1bf7e79df8433831ca605975b997e295c38692004043d0c0fda08e9269abd52aad7ae03256eb66053fee125cfabb04131bc56aa00ebe350d23629807ab4e9e93e5afcb42fcb72f5c0c545e2935ef17d650ddca3b1719cc9118fcfd62dfac7664cdfb0dfcf43403b69de86320102014c4fb0391134d6463c8045df4c8f118411a308a2fb4fcb97190a35d6a83c199195ee22dfa342ba317817db3e4c6595828065c4c700e9e3d37fcfc888d7ad85a30108e776347a70386a9281160f82c1faaecabd40d6c02a81b2345c122dc7644cadbc3cf8a23114216312da2e0a3a3274f0d942a73e553cef868a0dab8a4cb1795d54ad5aeea151b603f65af270c2ce2dfba6725056b667f2e2745661415e6a5a26b69037f9527bf9e5da708e688c5be8a6cece7e94ae555095ea2dad49c0f30628ff1c6edc840b1c5a4b3f857b8a573e35de19717efc83796a945825b099d376eac2cb9dcf76a4c687396ad4fe18d260db60a976ab88ef6080b33941433723fb3d94971571a61804115efae603ae575b619e005e72f04722f589b30c64777dcf4d79763fe9c06500464a26aedefd2075f0c007e64fd8b3200c634b369cd22a3dc916e7f2ee4791474a33106c0c8fca1b4d70fa81e42ff989e520362f7b0ea08bc9a0ac1f420e0ed93f06b2a99efaee2893e45452fdb27d1c8df09ae6daf40936a894bd4880d933b9648ddc14084b5a4b3c3845c1b9381b831329ef1445e1b13bf46df20888263197b88666f2c0443e08aa31ef3289e3764efa6ffd91ccfb9abb5e4ceac0a71ff0637368a71e6d315c7260f435dead76b200ee3db34d02c05a8c01a231d4833b4800748787a364938383374a19c602ebffe0e4c8d497e682708440d0c114aa444f93c83e03b2a3ddb3d387319482fc62a35bb93242726aea90882c53aebf01fe8191d93280eb6ca556aa07b20e088b78a880c24bafede68da0b3f9da7e5e91b32f19b32d839d2036f1373512b90e7d20384f1300c8d23835382d70ab7a1b49b048f96c62fce14e5caba34df71d8591580454c4931acc9e1019b6f512848ba03fac040fa15eb0fb372369828e71b5e5763dc6921b32904060ae63f7c2032d783465e2c1ce4d013c10d5c4ca996033c374527560dc0981bf81a2688abda9421d62e30c371a99871544cd46fbb822c2c444b5f10a8096e92f74d12bc56c28eec9fa581c4e97062e0de451bd807edfd68f5b234f880a90b46841b08fc2cc4924204e8eeb1015df476961d99cc607b1cb1271f2c55f1c3d22208306cf99f3bbbdf8c29cf04e3c57cb047346c9273645e07e726be99d0f7206bca2a0ba926f227573628e295b2dbb725d939932429412b5d9868c73579eb1f24e3da71b8a47baa6cff968723b0c330ec95019cf7c1268c658d2975af238653650ca84f80dc5c86969ce1fce802c5f84e63158ce087ac4053b31d11374fccdbcfc6b0a4693293693908683faf26ee7f000ba79551fdcb208adb2be718f16ea802b1845462cadc7be00c8905a4cbdf8b07f2a8b900e0b9807660e760b25fbaf890b772cca97150b3b518616ccb0d02361d86341226fc53a51787348aa1d75771a7de437cca05c38f75608b73c71f1112d81e90b457a3b61544d7a928310091871ba15ce31815084dd0e590bd1d192b1a29bc187623768576eac95178635e9ebe757c92518a368fe143d9bb6920278dc3360568a352359977ccd59112072c3a91857464c4952a885f30ad5cae12a4100173cb1600b552a63dc0883f5422e26cd4ac6bd044d1e63b1ca9c6d1471c60bc40040771e74fb11a4b23f2d4988069c9bd276e7773b437f4f69fdeefae14a5a9924e28a063d97b42fd843e81ae8c34557a988ec6a210719cf8ffdb5a9f9e918d6694e64fccdb915fcf98b62af8b40b79c6cbc2bdaaa6e4fb1c8a957c0efc09c61ba19093b07a1516a96e858fba65a05e7cf16a70f117cb6487704a865c6bf6edd606cb5eb6344be7f72a2ccfe9fae24ec93b1b3e5810146af75e0653b343b2a8897fd398041c9eb9f2f537a96e27446ce9efe98e1bd72439299cfc46d5da6bd520aecb4bbae01212b0c7672a600ea6295f4db58a5b9c363d3ff7349a0317f5986a70e9bc52f0edfadc2a0f61c0596d3c50413f50f56c4e4c51849ef403496a1f22c474d0812a73b586921840095c093351bfd29d4bdaaa840c94052670729b7b40064a28609ce26f3362c4b603d6360be79ec1b67847b69510db70378f9230d845b106f5550753ec23b87c8591766494d8fb0552a5e4a437bc62cea06ad937d72aed82a790a9d03a589ced49829fa30dab9a35e96e6ad6fa1e9f8f9f021fc7ccb921ea6ee43700092038f24a1e337dba370d90b869ff2ae9d307f92d1fb7be35ba88efb60f0bc7b32986fae188ae5c990c747092ac447850645950ff40acf7b93f4210d0090f33b9e946821a1d5c3fa50f20d2e443d8933ba42b6be7d9b8a6d3858467c05e47570f207ffe1546bb581f7fb3e790d838adca144639bbed26a8e629ba878ced081b9aca610b25a2f001626ebc0eef8823620ef356405cb6ef2dda04dcbb9968dfde6a8d82d50ae1b6d153c28bd3d4580ee532e802c3ff26f42013bad61da5c54ab3ba5a6d42ca5e482813c52473c6913d35f3e376ec87015947394d749c4b9c952ec50a00d13668b62656a7cf703b2a5ed0e628dc196e80e35b317e8d1b07edf7cc1f17f6403319c6115b3a28e01c6757dd4509495c6d60b61d83fe3e921ba351caf987b34bbdc5eddadc457f8dc06de9f2a19f8971bb7517f2459166947dcc8d516e5897956f5bb0b02d13686d46bc44459cd770a20d7e7c120ef074212e6a1b6d41d62af94aeb428f4f4659960c88ecabe4ce91cc9744b8caa596e6808e89c9264577dedc235dfc2e66b8ded6c14aac8e166e0a37ecfd4b9b83b12a52256a4322b04359070c7b87ec62bbf0153ae810ff32777f3e6fc552af48fe6da06b8ab2ec8370322dcd5bfced48497122a8462e0d97c7d401267cc8fa43df07e3c35bd7d7db9afe734bae24029ee0f27a69cc7dd5b41dd0904c73dd33898f49ce93ce0985b73cc1db77e66f112ac2db6c3cca9b49dbeb188fbf2c66ce01665839d984c87793e28c1199f2ce136b82f3af6e4de777e1e3600ee06ef1b56497220ecd0edf2ee279fc5bf24ec9dc835c4d55adbac878ad7485e442dc44776bb797ad79ff97aa0b763a72cd57f766af9ff69ebff227ef453661417b9d33c53f39f7265c8db667a99ce3c5bfb46e3df1fc0bf70b88cf2fdb59950ecd9eb1b7d0043be8a7d956d175e6116aed345f9ed2ca638f9d27bf2558aa7d8a7b840ad65f87d4d5c0481553dc9f81ba16ed72fbd7d053a7b5897a6f46d1f94e27a675be71ebd5635f1962c2a6027a97c44fc68488a1c14dc378bd1cc3d1b43757f4ae40b2c9bb5853f0a0efacb75b13c8aa0400672655c46f05012db3faeebfd2e088db1b738af8d0bf1fffeb628fc38a694b0fcb91cc544b7c32a4f60e024dc5540bbfb81024ef48f48392ad571e17da4eb69201c47cf5c37b87df77f9865eabdcb2d44c70049b4faf25d220b5eb80ec617041750e855f4e6687628bcfbb9e2d741d68b61ec99b0101206dbaac3821073092c0e1e00ddc3457048335214471d16b07da708ccd965efd74ae15c5135d172c4d36f9b1be0c47b9698abfe904614cf3a451c92d1ae2b0d5a405c8a86f2ffc54b82689b2b0bc7f06df474055da040295a87235304419a86fc42f93c77d8fa26f1913df8d8885a5ccda66f2a322958d80fea2a472f6a333c8ab66761b5e7d776527224c0185361e0ff97d92a8c89641190a0d6e2bf100e1d733154fefc33f8e0ceb84d06c8d5388c831a512508c03593a29fc360c5332222cb47d3f76395a54c96585b46014d66816d6302c31f03888f08e6fef60e99c347083d686c53e66014b2d7f3aa6a40faa7066cb0941e9fb0fc1e45105d6661cff1df877487dd0405b62e07650c704de170a2c4350780848148270b78d4ee5dbaccfb8a3239655fc7b1f97c5e4d79314af7156063ed6abd8eb567db3d7bc64e0efecb94ee6bd6a8da21c8824d6a8199b6c3d3043b27e8322ccf665126cf77e56be0f99b3e618cc69211fe20144a515b5f5aa9f992b7ffb08b36fd95e7aa3948024d7d424042529062b4fa592370b355b3a743591f9916b06aab3c03760093de1c6d4aa12e17cbded4f4ad9969d1eac0f06d09fb04e4c3868323b3d3b247a144d795a936f5a9fd5ef8e0cdce71d4b68891fe4ae046f192f3a241aaaf4ac6a8c16624679701a439ccd1c58a24fb31045d3f84914bc5aed122851dc2ec9874e6d3c0f0ce4a1a4bc05a9b532161dffb13fe440406735406507259db663d2d1fbed42a564a445eacf62a7cbebe791c0723e718177c0eba5d032e1e7a681ef1293f6f9f9f9fb9e74bbbc24eb88a70576d1a05913d5606564a3214d94198050946bb09dfb8657a872c2274d67b2b9446c74a6e9932d4f91a1ae45108d83d450ee37037e0413f360a6660bfb34fbc11f74b4cb2c08007cb5f64975889cdd83df3af1c046ca98eeee5a6d61757272902b513c50c2660b4522956a22c7ca859b1f2f19563ebcca604d34ca5a279fe6fb14338d2cebaa445b95c36a16132f750a5b38c7119fa504d877dc61f228076e56deb965cd3c1e0a119211cd4046c72f6467375d0697a549ca60617b29d60f5f5492e6d24b1dfc7659ac44e24f69f49758507994ee1cd5c3203c2ef441026c3e04a4e54c4bd04c8b18c8f294d41142f20a1372e27e07c48897ec7b87c69ad28608c46eab274141075611c9d38140c4c60f4567a4a086028eb46c3780ae886344e649a076edea083c1ea3f66a7a9bdb8e21aaeba4947bd3cbc2dde0764b28a744d622873cda3f88b65a454288633935a1addb590eda51d04548d0cfe976f2a8bab00c66f16775034b13ed9e9aa509a3ab4524c5fb58b305782cd345a4eaebd31076fb6fdace4916229def1c7cb8029da8eb939d63f4fad2000152b351edf71249f0b2d17eaa263f137a89ad82c5a94a9a388441bbf20f4f2a40694d54b500853cfb16d1982e2c94ba1e7b2e1c0365cf71c696b4d6c848b5e3240fb7a071f52a9ed934c56d2479fe0abd077eacd60bd4dbf16d451b6842411c9fdd3374184ea5215e4ad16c20da9cff2a005f3036617eeb33b50718bbccb46648ba5e2f6a16914d6f9ad2867f612b81d50cb9e5d63acc04891900a0e311ca91a9ea5d606838622777f96688a41a97c7fd095d36030ea05c5840a13ac48c9a6d45dcea7a1af0349f8981ac4b6e17c616e70d19f8a5e73454c56f498c8f2a29552c826c0066228a5008ad43bcf2395da2980ab23dcd8b49732ffbc7773004e1466c8b189040c3e7f24bcdf8ab8452df50699f1457bd4988ce941aa1e09d2cc8d30c99d8cf6ac6554f2a53f00842131021c14ba6ad314ddd5c912f12d7173401e16f04c0580875b3e2f45851d03f7296ca22ac7a4aefe6e919b5ae5c49f7c0d394b66b17f73ef2ca732b269e4c17324fad68ce4e6d4cf5339f92c9ec33a61afc76a573073b9c661845a32b661e746474c17fa574f194da3a76733f944acb529b7d0255ca7ae62d01b9b7405cf08e6d87f48277b60830e4fc70f893a247a080211ebe3f12e8e3465f4970f8a25adfd4531368b847d81a59200693ab4bf6bba2157ea81f2fa4a4aa8b672282035ff49e7511867a59b150da0cdd51e9ff4f52d4efbfd24b85086ef4994d6f0a495c1493bf36e8bc3a1a818f0cfdee61b623c248884acbfdf6c4500c074121a98e1682b0f7a1b366a72e5ba45101bbe0175e32e8b134bc5ed847435a7d06ce14023d7dcd0bbf2cb716b88404a286476b8419e888ee6beb0df853519b89ca7ff6c0366936caf064b1c5f1b2f8c09457d92ae1a8146142001bc60dfc05023f9127aba0f7a2b8dfe5e64ee53f29c31e3893a12ada442423e190911514cd040f2493563837a0aba541012651739564d2cc57b86a75661aac4a202eda38991f8e126cf74099a4222ed67d22b3e8a06baaac3b294d91379deb6fb5ec77c179b72631cd62460902ac8f34eaff4c40c199c0f6e75e68638724bded50f8aecd1183f4ff6d92455a4009857d2b41778faea65b53a570489eecf07d94b68013c3b296a59ccc39d12e420e02668a4873157e32de3645bfcd77663916e80bb8c92e8751f4a03a071f14efa11c01e42332838c8bd8d3c3aa7f10fa705f2ed537867f7101c6f82257a0b7552da28b4473ce54408706adc18fbbf7049ca5b4b511f4d1bd43438c1d6abb963db66cc378caad73431b1e2de595eda73bcaf5e2ff872fa6313c2bf673621b85ea366e315ca38520d318445b05b7c4585f40dd4beda6ff7847d50b6cc0b575d391bf8f083c291d288568bbccc0da89a001d5038900a4ca35f3978b4dfd4e064cc0945b2532c3e799ce52e36b46ee4cbd6f36b1a1a6da315d56a3b8948e87b6340333117ba62e80db55389517e5eff846210f3b77159c687b3f68bceb817181695fd23fe7470d719566c0c62e5cd69141c97c4f538d56420bda604900f48525179c7d4cd514206515d5722697c14c80674af95f37f6acffa2317ac376533e787db1009c49bb48f6acee3ac2370b2780630aa56862cec984b12d12abff05637521266f7da6ff97781e1c869f7298e320c31c30b296c064aeb5356b6d7d5ffec855bf7eea41e4bf1936b5de845e2975dd16a0dbfd44d16e8354ec76341f35ed6d7f795e4739b9eb7c8a8864d390286deedb7ebf8f97fa790713599f9890a2034044a77dbed0aa84b375589e644650632983e7a4e5d035c56ff29f2ce79181ef32bb67c888c23d85c9c360328cf5126c309aaa97f041f04bdd4c3be3efce04eba510afd55f7e9c2293300cbcf32d1d082dfbb7953b114517b3d2d16fb6f3a4b31295a96fef3606c1468a376fe36ec12cd93771112feb1a81588e040faced0ce8f08f3b3931211b40556d5e4b279831a0c0db6d3f612cb82e252c0487c6a115aa42983a06b41c2e8d05c44b5943163e80b2cfe5e70fbba3aa8633cdf268bc435cc422be60673819c46d75897712e1bf83ae2fe7c282eabc82e3a3588ff984eb3ee7afd448e789758a6f6776c4a27eb335c529d164741b4cd6a2a4c669fb64b7be6a7b83684be167ce376914fbeccbcc322577810241b0aae424b64580d86e1632be5d05d3a6b7ddecf61649b06b3ca4e44b0126fd6d1b87882acc47b88a7f95748efa7480c80c0a2f11a03d19d5e34b9d4aa29e482164df30021f1e272f7972b44aadaf7b9297af02f96a4eaf303a743829c675c4b71d777f6f0f4632914e31edef7a3226fc32af38816dd7e971f5c4a32170517f4941d766176a1014161807efc3a8a23e5e42a1d6eb8b1714835eed4de404eeca1349e3f077e09da66f80edfa9d8b82b15acc897ca200ec1d68948387bfbdc01e44b4e13a768dbb7e3102b7aaf6369f5f280a2d45e14bc35638d994c44c7c71b0006ab9097a1db7ce419150debfe9798ba93364c2dcfb0f909f71855f232360e6be38bc597790cda887e00278f5792fb53cc61773040782e728d0be49021ff68ba4b69f574b9d7d4c6184564d08850dc2788a90d14755538412278b9fc8b340a11ca64ab3edb14d95701c206ae1ee36d5d621e744d4394a99eb0002bc498d67e81faed6dc91c69f8f5089a68c8b01551edd80acf0437a7e2b6936387179b38e1fcc1d4ea94515abe0d3fded7b171ba5a72fea1fe1a1201947383f525cd41639ef787c5bcd22bff0982949d6ea7c152a990b94ba60c4fa0ea054102d1ebcae1d0da2af52b94424e229e2a69ccef43a11ce71ce7f8b19e05eeb1e03438afff407d122c93d430d8d15a5dc3c8d269fe104ffa09d0c7d6a1640ffd7aadcba9e5897d966f91efd580ee2a3757ea53955a5509b3d65bae22210e0c0bf9520f11295a53a4f573197218f5cb167b5cbc71b8ea2a3c3e3103dea21c81f6c0237150b7b75db481321fa39c116886ef957f7b328ae5f74bbddca7b6f5344fd09b1db1c69f820d503f49e6a7cb8810ea6ad87ff290511670a4738b6a0203b9eecdb116d4d80646f747c8d97ba311c0764581fdf98ac28c76210d4593d81b3d23be4a37ddbddee67e5470bacff2761551f00ef5d47aca184cbcecf6296137e0e37df8b38bb9187a6345336572a1cc34096771ae6a8698a68e5d18ae3d965cb178f347f606939b260e2acede0644bbee10189ef89abe5b0d7fca0d4020ee4dc8338d09b4d6e17ed2aa611683e6f5420f1da711cc5f5c9c86423e28253eda9832dd8db6233bd6e4e7c468f6cd7c1c03f8d53889e816f44629373553a1cdab5fdc48851c0d0b5c778784fa7e5c85a3e7e72d91815f6ae51423bb985ba596b1dd28ea32d9a9d344300bf54e75bd76bcc1d3762b57bd9ea6b90afc445764abd8fa4f3adeac6a892ccc91b7ae8b56ef599b0df8bb4e384470be7ca10f866194b55b90d12451406af1d447b14c8762f36b13e5ed937500a9463462e16ee2be628df16d1ff7855a8274010fc8e577c65a7e8cd6f2b66a4a2c848b5b6ef99ca7967ad81ebbb46ac16fffb7b235b008b1f89e20e396955e050c60086021833c3fce2d4e36b95a4d8faa574d76c6fd147a1e04702d3da269938fbc92185de559ee53dd0db0fb96eac950f01b39454317cf454fbc75ebd1d7190f5bdb394bf997386fe177aabb6f60b4d9a5b99d464f8c8b10fadd7fd029483e1562dd22da7874694d392103f92dd7ddbd4d89e804e6133495d48b0a240c97b9978362fcdb18ceeb8f39c64d4bfe4c58e6f7c7b69d73ca406102966e160743cd8be15649d6408e4aef42162eac6fffc0de44425cf5debe7de5534a3154e50e3a6a789d965242217c8b464480a4ac41050e96404913441f9b13611192773423fafdbaf6885252aa3b019bf35f325d3a5ee30295fa524e52ceb100b5df4bdc087e6ee439b2b2186581e0c7049abbd701e89fe00bda5c7c2795d30026b24a464b5e654bdb507e9c9c482a6654e759c998c8206b71f0a9627f59b0344f532792b55cb50f4f796c2b345b33940be328a27e1bccd1298d3ea569848652542a314acd926cc951e4229d1ddc4b2f728c58248f6258b153986ab68417fb008fd6d3a58e3a8d47249d5b055cac118afd30adba1a9e04107d04b5534c5cb77565ae04958ad52a709af8af0cff5ee8b715ce97c08f821627b17537d6008684f31de2a6c09c05655ed87d315a36394669f10dfb07d09f1008fd87721af0aaec924d82c8d246d20ef3f158aea12687d5c5f4d6cc1e4ecfab57b42e610cf870a9433781468f94fe50171b35da3fa1cf93e5a3ab3e8faebddfb1d566becaa841e0980581981fa32c9f8e6db4dd169d66052cb9d4925373727953a7fb8f19b14d0bbe703c93588e3ff35054398b27302b087d03fae6d92bcd29596840ce942a8edab1fcf4be58f3e3db8b52d91b243a8620390ae971908242bf7fbd5360faeb19c70baca3e96f3a8497acc08cf6df4992888edc6c67244a065169c118df4dcc6be1d44068c39e26693fb64f8df61f56c6c079e551f4ba93fe60842be5f61e015a21e43884f6caee37f962d3540c8d0bba43112d012f6d567f98d9fccdf602d123a249270ce2f59eae36b2a1f6bfcfbca9d9f7f44b13f70612366125fd13472b1a63708cd7477e3eea693d7e4eab06f3b971e2e519b2220189c406680668f9e4be10558ff819b58bc65fdc7587de86440f1623c3bc5baee3efed42207283b67a2e2f0f4f705de34ffdcff4fc5903d9aa358c3af4ded11743fbe071db7bd98bb9ce40f9d18300be2af0bc2341437e4b240728bfc42d66fea9e9ca77024c2bb671dd142047885293192ff78f48fa582763f3428cab6d6fe9770e90833b1480c914f88d0d77ed73aa3cabd85e101a9d2e8f109ef134893b4c840c15c06298c97d590831b28be4cf20710f89d3bbb012ac1459616d50b2b4c221b7f363283ddaecc9690e66a419c52fd5e84c228681300844ba7925655bf98d010006feb986361864ac1cbedc63a4139ad3a031f8181a0981e6a182dc7ab6cff79496b8aa4aaecb2b209f2ade21197413dbe7c7fb9a5eff83807657af64416300935704677b44408a6415d523fd027dcdee8a19bf969c0cebb8a776348c7bb627022a84d873bda054c5a23c1ecf3224ab2719fbb9740e6fda9626cf229d4ee323809d66c30e1fc9a3bb683c0494ef7f95fb2b060258a7218056d589be600bd8fe28a151581751915c782674e6ffb623294023b30bfe1d5f9ed3ea15c0d94fe2527148a4b1fc5458522480363b82d0aa9334a239eaebffa5eee83c0175c09fadf69180ebbda91cfb6d3c67effd3a7db74d6f53fac42699e8ed4024b1e85e3ec528ce53c772d9e483b249c64757696a3a389ab7562028a671ec60ec8329305ec4a2456d9eed294f0146aece6a59b79713c3db73ea49bcf0722ff33eb034147ffc5a175387e5032a4451d9947ed8652fc01f44e7f967de58c7c94f525712e92286d57397a9b19f63419089c836b68ae9e0004c2eda55dd4c82c4859d3ece3e6ade01a78b614ac3fa4ce12fefb52a0f552221b57a08184f021f71456ce7cb3371d6d94cb69e04f2ade483c7091360807caeff8e204a482e4181d2011410c78ebbeff126703844f5ad32e4aeca8b4eb4e3f305b8106bda8bc873773b81e7941168834604a42571596ea245852fab2bb293819247f52353bd9ab2450510f710eb540cfee3b50952eac8f0ccd3ded4089d4e2603691e8658832932946beb7c4a02d4db161cb8752858a2ef236c78f807a5cebc38b05435b6b3c5616304469a9c9fd245612bdd066308232e09a94485708497472ef2498e0e875d6707a68e35ab7f4a22633cd4b8f69f1128ffdca5c0624375e6e8003c0191e48d08f0cb659b0d08f7ab0950aa1e20c897c561a85630a3e2b18f8d37bb1f2a756ff8c927198d2d24584099fbbdaabfaac20274306087bc629269af20666dd7f3524c1bdfb8a1e49541d1df30b53459ce64e6cff92050837fd4fd93cab47c80e3b431b941267eb4cec6720534528d3628a6360f53144610fc4aed0fe1f931a7ecc9a39c2cb7ca603651d14c1c2aca9bf0c61069486d708ae2882f931f39ce619a5e70cc87e6368cf38ed97131c1145c8492ddef5676bd56a0cf659716638c7e7e8df1f1ea5047a45f8e5bb1b6045085504f13f518d410c7892e1a36909c9034fbaf63db1e0896337418c11c686d71d142bf4b445ceea2daaa91fc95fa69610f6a1950f02ac5db4582b9e472fc78f5eb896880b4a74e762342b0145927d6b5f9a6e43c6683226958b02e0fbbec4f0f3c96353da961fcfd1c39f9c368c2b0cc4797cca794037f9bc06da7db7bac34d203a9c06788649db16d1bff2077ecc6220bca84de9b2c183159f0ee2b5280ba525bfff3df986157965284d1890b3287ddbc664736a5ca7eb25e2afee50a940fb7e3a882586f6677914fa48ed865154753c7c524d63b785d374d4f53bac436b9c1760f55723be6d3f9d46604cdf32bf76160427b338587d8c0f46e06d367530f2ab4bf0b2e69b446f177bc75da7185d47f5dcf6ddee7350275e65fe0d8470bc5623a3ad6a0d0902bc21b06dd8e2a3abf905cd410de32925bc716a3d86267c4c04115a21a0d20dbaa7d3e96df04d8c7598f0e8fa15d2b742657e1b6fcd4fe14d2fc39f9aa6219ded46e4d3fd876e02e4aa7e41f148cb7181b6168123b44401b1188c7ebe7271d44ecf7c42c8b6eb529970e9557c202b4a553411367ddc656f85a06cb8214a4b20f7e934128af6dba4fcb8c23dd2a5bb15385262aee30602d13390e5f7af58d0bdb01366b3675cdde503164b9a75975b1d96addf1bf02bf2be712c259b7f3c498e77cf011663fe9e65bc98eed0a458490d2e621fe1cd87008a190b09c2f50e68e5167de078331734608aa5a3efe994d0b832370f99bf3e3a67a894707f98a2faec0dd8cd48a24d98f059a23774f793bd33bb9f79972a0059bb340a6489185a0db6c74e76dfc0e08e0621e56143b0e0f1a6c2298c1d76a3114510528f2e08d901b68d07772067170a05718fde10d2476743bc06d8e34a317ab2f4bfa927a1507e1ea18ac89de1e33d2c3f6da054d2c3ffe0291dda8851f1019d864128ced7bada9239d9f0afcd9b753e2c442eca4bd223bdcc490b42dee88b6f63edf4c94a4505bf8da54c080402746b217832c831e3d587e0256be3a82a3a9c2906f22298e1e395d5cb4131c5ba91657135918464e1e18386f3cac20591d5f9b8d1f0e89904fd163f3fcb631a1cd77bc082e6599a3f2a4f4c8e26954c7600a3c504fc05f7d167290b1774faaf86c05394b553805b7c4d70865c09230a43aafecfb1272fd4284419521b5319b03a598629a005e26c8fae3a9eeea510c3d761b0f53cfe1b4061d42431f48c474b70475b4abff4b99820163596fb38a4d8af197ba6832b606c1c939608cf1db118e3cea5670e4d1e0fb2471cdae58a626f4038a684686c68ae64a9f2bd74759f0f6f91ae0add030864421f0afc8def56f58f3131ebb02e99bd18327ceb0c3e7ca22c08296a5318ba31a0868a3e80bd4ef9ef8f5a63f2951efc71bce656b1f891b766f0adf619698aff31d5d11f02ce4e93022296c7abba33da3e83aecd24d791d24642ce0f88fb6e8c8286ffb887d22452b4fc262d5a6e915c72cd94c424cc98771194ba74587d8984f42dd0f5d2cc1a7e4b32d7ab0893de63ba3a20e54b266352b800dc2de80fbdf33598a68cb54ab9f38722c78ae0b425ea6ff031fd51e7fd0b27dab233ebe41e1b892f606ceabe49ba1cbc6edc9d2fb98f7b57e78297d3d6e086af4466bedacb4ca09776a12ec2b6949265a49bd4b6ddce37d9bb20aaf44b7e1284f9c4f5276ff8aacb3453fc2d2ba51c9a8e0c50e4fdc278ea5d839140e527de30726e8089e3c0c5c9f7d4b3887ecc5618b53da00b078a5e2bcb0c50884356eeb5594a1c595c8f74fcce6632446fab8dbd306c6d2aa59f99a01a35126919bcae6cd7a825a2cda0b3c2e542f41155747998f13e54c38f75d9e281205c4796e2ed31a08154c99653bafaf9d7502c69dbd0d3c3a740f3ddcd3b3e5f2786ce0c42f10d8e951c2d6e255c02157a94093cf4c4619b6651c44f3046cd0a2bd31ce0bd40f8cb2151dab3e13ff7acf1d2c3b82198abfbb861422461d3066cafbfe77cc489a52d3981f62a5c766ff6c2e29f3349c48c1c0ce748e2255e85d70c4161cad2c8acd3528889158ca05248b5e30d933badb774cc585c0a187a4b5424c9b15a322e0c5a6320ddd445eab8881fc7e34a7d751bf20a0a4f8fa6c05b55ac0e7eba2cfea298f5b3939383c24ead1a2c83bb5346958a5fce57c0e299b4fa4fa5601c06b96cba86185dd0bc115e215c7c7c9fc1d78d242f5cba099283619e7cf8aff8ee5f82ddcbbca6d33b869528fa4e3e598ca5d14b6251ae4ee0dfdab080d825abd6d08b91c28cc34cad010a3e6867c87c0cd14d00f2546d75e027765f88ac9e3dbde2858920ec6c6575ea103006f19955c3ac3cb5a8d41d33b8475bf17f05853d1b8c09a1b25784a66307fe7289388ab84bc438a46262f1aece39e3ca57bb1b2abf550d063334a1546812ea9d6c8a205e0e45b6ed2f6e115819a419c9578b1f2d1afe888c4b79b666937ec56d2b3144bd26adf100e41172bdaa1eedb2df12ad8006a66659574c006c344702e24b54fe09a3fd7d2a8a87ee3c55161467c80e26554455d2a0f0e4a4910c4bdecca2485707658734a6fd64483de1a901caa2984be1d108d66a9b5d04f6c2326b6cf8511ffd7a049959e3383604068a3e375f950850e356f5d2573e5f77a4ba2c04d04ea1b20eda36b88ea044f3706abbd37840b5f3787ef14094179129b54c283393fac80db3fd317a2b8f553f6459a7419d8b158589f04c5c70260255a1425be6a2de5dacd88961fd5ce8f49f278627b4831eeb3a6d735688b7a34124f935e03c60714db3ae3fcfdad8c8dc6ba4ac3cb206fbb7c4cd9310bfc0786f1b5e815b5360c49ee7e8d26f933823f05675343d7b9d53e90602b2aac9034a94c55c2e3210a6a9b6344e6d2ee78dc77e31fe38ce639f862654488cf0bb548eb32fc4be9631583c6440edc3327843cd80c96d27cca7cce4094cb60e3a701f845b02e9c91fd189dd9ea29c9e1e832d15084b59fb9bb9b213a02b70cd81c4328748b9a8893cd0bb1f845845ee25b9c1854f0166512cad266bf874687e298b8f42785c2ea1014d25e3b6565a9116941be22b8cf919327970bd956cdcd3dfd226c80e573079116ca1b223adca1264ab3962ddb96d0693942c0f33dedb2c9a662b9e3d0577c2f5b220892cf439be7c91b9fc89c270bd4f781bda9c1b97a8d5e650afa681abd0bbbd8c4c49641c0912a1a558a51243ff8a13fd7a1e7d0090ecca7eca19726b082de1cbf65a747b14a77889e1e998d769fa068f6341dfc433f85a41a086898f67007a9579ba3c29b5a899892221078faae6fcea923cf067a7d4484c1e2a412fd7ca898cb1eac519c3e00cbd8721b4ebb99dee40857a36c4db9ca470f830d13b5893788356ad0da70be61b0cee21197c6e74555fb5dfda90320a4284ab13daf28b1517552f50773421aaea469b2233b54bb2e7a78f526cfcc56c4d6040394b9ff8fdd1640d3b2bdfa797e66c22d2b29a155a2c25037ca0961dde875ee5f547602c66c609e8f6e53138cf986d80c78d0a5e8117ac743617797dd99970920daf81ab550f6e0a4f1caa0fbe1ac3f52733169a8c3a4bb8d684958a8c5029be4e821443a8f4145a04993ac4e20948642a2f35b6bd54d477f704a8ff3c7417b142b2b2e8591a6c0cec5c2de996ccb2c042d81e137e5b8c945e4cc536e678b11cd5c32be80e86d2f1ef04c897dca657ab54e4e4defdc425742c0dfef9383cb34c07b4ee36c5bdbeea8b84b0d25f58a3593b61d9a80eac846d89e50d9518ceec09ebfe11ac102547149125790c512d72ad759a36de382e7843f62758ea980317358daccb191184678632b5b5f1bac28e31ba1ac35605bdecbd9940ef1c7f252e73736057c43dc3cf543f284a4252f5fec770561443c5da8fe24e2481dca7fd0d38770cdc8299ea63a3066033626d8ad96b5393541a5b873aab6b5d53f8e911d02469ffa36e8c19df658716d0bf2500f3513811b7613eeb49488d02bb490858e2e017b17c4156be46083bb2b4e77d57cd1a716d0c249cc14ee368cc830c5698020ba66d958a59d0c1ace285f2072852158d12a856e9f31df085ba114c9a721e81447a0e2b93744e94117352b29283f8b541a1bd92f38221b339b3cefe0855819315b104d4cce7cc5881ba176991c26f5b3fb845416b30e7a3b2bdc139da18904c0161c42ee339cddaed9e88933bbf4c101925da4cad0ff333ee312e0decd57242d5f2e6655aa4b6afbe36b2ac9914e7bec2dbe0f8cc107113b5576f3c8a4ff7431110e59b26352e81c378118fbd9f70c1da569b62c64c8c1fe47da2deb45d10192a234d5089fc44406ad98596d915e87864573f2ff3f8484888c8fc5bda034b998a2b71450891b70c2257aff1a81f5ccc61aed5099702ec7b60f12985228763492c18322534ab3afb11105febb0a3f394a5b1e19540ec401127a76b16707273e39e80888231e373ec35a71c711626beb21d2bb07e413926454ad3d4cd8dc9381fff122a73fdb05d54b0b02e4aacf22321e2ff19a7e6bb9015f6293708a953d7c16b245a55e17c946cf08476fe4a0899f6dab3c14f7a6b284cea90375b9f3b7724dc781498297a398cbe274eebb29077002e863af2cba0c82e31562ac05ad5dc2c86331251ed000a1c830984e3c777df04c6dc178ad935e7683a4ad43294d01f6edb9e1797fa15c9191f88f6185992dec6ba7ff961be0c6400014790b17d50850406bcb019b0d0eb628f40a3b4366d68d7fb4d0cc4aa706bfc3c8f4030915b645af3957f1b469189de2cecb86f5236e225db0696937b7d3d56216548358530a994fa7fdf2276ecbebdcc42493b4fcd2fa5c71d9d6f166aa0b225b37e8031f67da4fc222164e2ba52deba42aba3566fe4a6105214376d70d1751f284ca131d213cd879792fd7ff1f2e9b1aa9f896b8924ef7a8e45dcd8fd97b9e92032850cbc3ff76d330dc40b45d46bb3543bf69f051c598e303b568a0e1e53a2c5542e8ca32f4336011e36a9805ea5fd446744a4e5ea5f55bb7a773899e43ea13aaedc9b53bc1a1073c3fa01dd01da8830228726146c8de594f386a4c920009602807bce027bbab820c95335269406bf82e703fac04638089b38fb446ea734d1d178fde7f1c4e940d2b52a8e68145445cc38fd55968e9fa3d8feb9b676d080750fa7b698947971088f12aad99ddcf41f1a5c93ab9ac679edfe8850c6ea425ac39c72ce2b5b814bb3adfb2f347c3e54fe9adccb4411f083338eddfde64ba2012d45a5058ff1255163dd71e4fa4ae4da46faaba14297ea9efd2e6baa41a1edb9508e3b67e3bc6e8975c0a29a2fb28fba630cad14773154d2b1abba50cbf7ea2108d8e0a8ed1593cb19c506dcb42ee260114e6bdf8821146933cf7f5e3272b13dafda40c0169a98218d85eb79672bb1b2e1cd0853262e944ebd01d21602514a05e342248d4b08e22eb43f8546b4dc430cf8a8450393ecb1a31b9d0dd8a2a61da570f94897f5beba7a462c9f5367805e043f235782e7e537c70eb4531f3d3c3f1a39be4fdaed6ead26b1ed761e539c2230655b14eebc7541b234a14370994e7d6c78af4d41ba467807ce2218c4d82fc1087a332d35d99b1176ef3696835e2e40cb4c6b7ebe60edb414cc331e8be095a3ded7e6bf81c5d0dcedda76d04c2aa7a1a0688db4fa6aa98f3c45d61210d974c0046fcb5d11904094c6700b73d1c48cc20eef16ca8dbbc0181e88d532d18ce1a2f74b5296c1c58ce32491535290fe453d41413d9449d0cc5fcaa79b88d8423569cccfbafa3f502d44b056b689911612580699422ccc95022fd7ab5919c285284bfecbff3a04e50b7614d971b542b4c4dff36a5de5de251090899c8a99b8b2ae10121dc2224a5ae9e0e84338545802c060681e0ce5893465ee1d2f38a883f85865d4b43c2a240dde6857ed476803c60dbf578d8dd1fd2f32172a9d02b3f94c95ae5f2cdf2b065452615b8d343d91a915516b930730a58147428dfa48064e4a99fe91d550bdd03812a92333e4b3a78649d1f69b484fcca9a5371c6367682e864194a4ca01d90eb79ceb9a35e34e9a58adbc528268d2e1580fc197a89b6b03086588fd187cc073898f437bbc669cb128e7b7cdfff8544cf517f2b833cbe1233a9aedc78a7b9f446d3530d1decceb6e3c1e8f5d6419cf025d289d75badd0f3e18987558f50b526cafbaf35a6d913aea65b16db180a0cde4c0ba6b463730267efd591483f515730fdd8c224950870f1049d3a0e0f1a4c4d2efc3f125466c1b318c394d0f134d919c289fb21801438fb85ee4eac5a561d20cddb2c176733a4b502370d1ea802202948f44349da347a7280f466c96c5242756b710a85d2e88f0251ef70031e3e85342a0a960badb1a693dedda6da76e02d2c0993235a9367a14e38902903663f6b3bc7033108de9c170f68418c40a3f3b9c90254f7f4372858715776d3905f7e2cc4db9dc83f2c9242f4d73e5cca68273ea8a5e9048cfb50091944f7987974b0d8d9a89fa6c8e81456c4f5e1240e889f36a26f526b753ff549a7b483c486407d719eee4855cf8e3d6da9b7c4ad92e2cac7612ef1ff41f5264711a8a797d6d424921319638aa1652a77a4c109a607182f9a0b22b2baff5bde75c20b990697cd60068bedf5463181ca2f820fba50599e12eaa09f97cea7f7768f1526c4dd39c5158167182c1fe9b82373865a29ae35e1d76956ba68ee21428da18121c268ddc9d38a2364d695a13250d139ac47f5619fb8afcf04fda0ad034cd5971e1d06038e18f431e4c07c3953f792d40e26c10cdfa523be712bbb263cf089c353df708a60d1e13ca5ad964ddc07e979b15b208471676a0bccce2238b2d5e6710a175d31eec4688a80c66056ff03fcd10fc64244551556fc2059a7c5058d4124fd39a2cb493a13309f1e49d3200f6e0436e0fca00fab147443b7fde8158bff75a24eb7c0acfb4cd047acbab1735b61a0eb6d61fd81f9e606a0cbf94a624f30649adacf1c742fafc048c25c8e1c08543b105bd7f576b6d38834673d34abd69007f76c311c4e902bf80464f914ae5acea4a4fdf20c1a67a41e6153e3c87ce422ad85c3595663c108bbac3323f791d275387bcfab21666c357078436d9a9f9ed2208320f0cb6322c32125ea1673579a3eaa76a8f0e726f9bf2c0bea7abf25aeef491fe22e674ecbce9a7831453771a1614cb67187d419a1ecbf8ffb5c108b085d29867d7e9846d4eb6653d4d99dffe46352533ea85e793fd39386e312ce8fb5cfda468903db37e52c3f3281d889acd0f2df8afcd19bc29b4d8aec5f156941432d679804700c38d9c07941fd17d5b43139f192effe95247eba61647b77caac4fa21584ef124b0bc24dbcac1adb18bbbe264dabaf339650dfd09f5c0f647915c15be98b165a8007e345274b0ae5a72883141e56722762750415c47d6f36ce0b0da24ceb7274ca6e1be5ce260322b2a698ba737bf7050fbebabf344a09f1cbdce722e7f566af567dccb030fcd51c9f667ce744f900b22ff84fbd3e87dac73e0035517eb2668a14726758cbd9710c944b9d51502442be1db150591dbe1b078e3d7dc020030b32feeb27c281600c928b3a36fb04ed2d077d4dab56e97e9c2707a14553b158d1692640ee8345c3fb2fea77d25e4a10ff8c2cf10df133e888d6e9f23f14d0aaa2bb7731cd578bc5bf541232736022dd9d0c7530b13059465556cdd0e5a4fcbf2bb92021e21ce9f4da86dc3a93f3eaca39dec791e11a7e6ca4f37594f36b1619221e90b7df84ddc509b920a610b61095788677c95f09b4867f988e7e3b10405f19ec6f21aa120c26cba98f05faa090a50d14288d5c6542fedc914db46f093dd0df6c61bdcfc5dea94ec72e647af7951e8e884701024296417074d71daf1f269bb7f6f077f76a3bd82f272c6849719cf20ef8b0bf9bbf56f7ce92ca2c17f0a217082387668bcfb0cf272312155d8a28a45d3fc9edd1e733fdfe1168a96657cce44b4f891be357f75dc98f826b4d4590925efaac589ded1edde8a25c4021928b612cbfd7c1bf46a7ac8f8813818112eee90017cd8a2d46436b6ff39e169a8869f69773f653ecc2032f57f0725745c9b986ee452a7f064284628f32599d3a88c429bd34edd4a489b5334f1f4dcfea84badfdf5311ed0cfb48d2bf4a9535b3c4a5b648e8085896783845bcd0f53bb3eee625082e383883a4d0ea9b3912c088eebde91def124e4cc76f808787156a62fd041cccd82c79c2d1ba2401661d22787125542e19655782b635b1a6f99cf2503d7f5fda5ea6e2a73b6bd5d291fd5e916418aa11fa78c2c68cb6036805224e562df0ac5ea32d3972450f5bddde9f68b7087328f846fb8b6f81b2ffc41fa3e1ff6e3e52a2ba4fc56eb8904b832a4dd51a31799e4aed56acde29f080e65f6388dafc04e0929ef018234fe9183c41b0d41694070ee547e18e77758a574b98518e1b5fc037d11a307ffc2af06c03dd84d68cafd7129c1dc855b0d829fc163d15bfa82fb13a929e3223e52b0a8b46e29e0a57618064d62d5bb301258ff190132728490fbb4aa5a45e741eead75352ad2bce7dcce531e20b9e5cd2c3390f1d2517139fff5d6b422e383ce9457571c8a1732fc160e02aa97816230adae105acac57345bb50959dc3f1635194c467068c4c05d4aee649594727181f8d8492e73862f5cd477f5e1823532ea548c301e85d372a72c968620546494e902e25d7922ba2029b7177cb8296b58e8dfcd16662e0d878c5b33c769df460822a6dc6e9a63612c2d439aee9bcb48bd332f99d1df7314a01f25e35cde0d85e89150e2039b0ad69fda9642c5095cc09f7d8ed98bd01caaac4bdbdb18e4c8deb0ad1b632198053546057cacdeee19b503e455d424c111852c65b1cd87dc726b9c5e6218ce5340d446150fd3e2317479120f978ee9bf60420033c040dc3d667e92885c6ddf33763c4dd15164c7803158194ce2194e88e94be3548225ddc1bf29625cc0eaf498d97ea822cf1dd7e31e67ba4d51a94dc327d85c4cfbf17340b8d99b73248d3c3cdc82442b338271a0fa01897b4489cc5a2defc5b8bcc00842c9cb252a60a03588e1294016b3da55fe866df3509cc94dccf0a410ce99e40afa883971bef29944c619217975196ac4a78166343d899bc0e76f87842695320178999c0ebd8a241f39fefafc583f2255973ce4c27776c36dd1bd7d78d1105686950561e9dca5d172ef96908c6ad7ec6f563fe314eead35309ccc54f983a0b06aa39f68ff588a982c3e1b23b03d4a7732a8324e2ee50ff43f98b3158373e9b470794c9b9bc1704340c05ed490fd03050e0a1f91a2d4831d4db04ae16db5b0117f6e5d81a463f52230ff8bf52e6797281089b4015a381fcdf019783c291b55965fee711f1437089a28d338722e070e8e3e71909b1196ace829e45fad7365dd8270f4d4e6a327725a1635b33b8c4a6734da08322cd7397cc6749342883c7ff136f0932286e41a5120fb12c2d1d18b23500c608bda0029e41bc0d6a038452a12d34641c28c6d42193ba12bebea464eb1fc5a00ba6df921f415ada821f2c65d87a254dda1f4a0fb3c9448e3e8fc4fa2e8f39ad8d20a91f7bb65f7c4ef62417feb761913fd68860b20978da8e4133a3ceb95e2388ad1a5bd10388a795d9ae8ed3cb979763f42b912a411cbaf22842607bd27417fb7a200e9f61133d1b4402183267f99bc0369f42580d9e90819d762e5d5b5ad0182cc1acd4f243f5fa1de20bcb921d5845667c453ad3649be0316e54d17adc98bea1bd4fc46a303c2ad18d1a81f721512be64fbadd6ae367c52d6c91f663cbc41ff79aef786ca552ba820e01280617a83059db9430f2cf0e9550dbc890f0af1309cead5e0f209b0a329b5f315a0c8df0408780d40f1c876dd6d7d973ad67818a0734da102ac34aea624e3bd6a54815e895cfe6f32a9f460d07b186c59cbe7b0ffa7b91aad31ba977733b4f2fc3bdb758fcb9c31eda20f69c346368bf1713100dad1932d0cbea5cd8ec141e68b5dd5e8c5d1205eb830dc4a78fabc0b80ab1698ce5fbc7e96abbb2a629b74db6488ff4559050c79b54da564e5305e21b10f799cf54b5e347b432ac60021ba63e53d0ada9e384dc2cac71afc203e2f180773c5a510030765143a7319a2bcd86513238227c10ab23ad11fa8f5628e27a555d548309017f61a685ba17ea7f5add012607a1e9ba3ce8f4999a6f12526628f7ae8ce0e709867e7c550d026ba9728a9d71a31cc110cc202d9dd4a61f091cb7852730fcb24b491e079198a4913b26c2b0f32deba055cbaba8b184b8f4f5a90900e8942e464ae1e00b52ac29f3e40b7704d9d074ed8dc368e08d46954a53ce64e0f3d99daeecf4af88acbfccb9a7441958494d18cd0e3f3f2bb704815b1c595937852a7a26c058665297d195f41b1cf3fa17a3e7f66213741450116e043025b6a56c1fb837c641b00cfc259b17f47b367be1fb6949582a0a0f8631f2bb1fa63f3b6f089b3fae8acf289451ec8bc2f7c832b5c29e415efe905d3aa3527b5761b4473b480e00e244d990100e3e88632491ee5d7bbdfcd69adc481a15098e42cf36694f5efe0882b005c5a41903f0f7f905296c1d3787e00282f164c2aaab966a788770263f095adfb748fc416d63043e45fe3aebf159352364de4c8e6275039b1d6a2e124280a03f5e6d26529d855f7aec10f8ce40afa49054606028dc465c9af853b3145dd61d875a0958a521a18a55f6d286e60d160b83f2cdc27b4235e650714ad9c7d00e0c347e8071a1927b880596e745354b28e82ffacfffc3a59a006e236586cbc74f1fe1d3cbece560e7ed8fd1fbf98f0313d3c1c0d9d34115e38d07e831a8f87f01b695cfa39ec8c3ca4908de6abad71b9e3b9c9c24e05358589708d413934ab1bac654ed9e05c96f3ee89b8070c022d6d61a6f7c55592e8c7565323c1bb0fc3e30781b485090d0757decc9ac2b3d09a1894aa213b74d18b588cf2f935528e8053a94f940fed7a03042a109eb702513fd9b57d467c1a27f27d9586d09c337e34fff214cd8cdc6449dc220d581ae25e2990d8e407a66026338b64a1842d57c292d466e305ecbb87580584136b28b3b8b95f573e723498e2a4b4313e0fc3754fc9b31bdbe7e1237f30aba8b6c72b66f3cd4bcbe2e01ed602c88bf20da00410fee28c37def869f5d06563cb232bd8d245f06db57deed11d1f59849f6b2ec8cb075e4b9c76c48b8ed47a1818884d306f2734aa8389c5cd28fa0dde97c13cec3c18cfad30cccb11ed9e213c79b95124ff1297b308cde9ab4ca097a0fad72e480b95d06784e572752ec1d31e0297326dad5725a8c0de32ccb4ba5d6f2af6f0e0aad26e0df52a25eb01b054c8e62e68081bb606633821f73d84c2d02df1dbbe98a22d453113448873f34e875d329e502a743acdd0e6f3f492f5874dab25d3c9a13b9237ffcaafbed1e071443c3b9eaee983586663964538018b2e12053a147584fb5fdbf5e51bea540c912f75cc332acb2884c1a3cd192b5026abe19e01724d8c9429b6450c14f4dbe59556c33d4e324345c14af86cf84c17bc26d1971752687f1f535065cdca38b7ca3a9b9ff6986b4f4335f0d1bdcaf6bba96482bb56384b727f5ea82b01ab96f86ce556012c03f06e4fac0e551a417dd43e9488869d55929df97404c29da98ac4c1d4952b0b25294a3ad89faad5438026399620ce36103497885a595b3bd4a0d526a04480dddcb233f07464ccd0b1e362a01365516deecde5ee9e28b329e2179504515b1930b6107a437a3d65a866f206708c879d88682c74b673f2f1dd99d24908c68604ffd81056a82a2b315b8abdc828a735b3e5a6e3dfe66e1917a628017a0f2856fe3002574b3c5d46d5f5b48a971a9063f1ae592d4f456f7411544c103d578b3d82be3a40c90fabead4c326b2e359ef86d07bcb7fa31ffa43b6bc96dc750aa05c4e7b3b4a4448457d806f9c8df1a5b0f53833425ae384e48bf565ebb45d119414456350dc8bf033dcc31663b2e0fdf523d8406bafa2010b2002b82823f15af74a3ad7c4c3e87fa4e03b63ba54465d5af2ee74988cbb32ee29365ff2083e21d85da37efc84024e6b51b541f8103a3f4eab92172f527d12360c74691acd3e77f1106849b51ff7f19a932900b531201875b719acc448b6b792741020ab055262581e78213a028d13c3d901123aa2c8ab098271374096ce0cd3ce108ee55f5e145c1f2a60157851359b7e5308ef576f08e3e9227233e868220ccfdf6ede96b6344f3541a141d1044791d8f08c30773a50df496cd3c4ef93e014870475091b88e36373e984e89994c5641430ba57bd7553582bc42ab21b88e179354b733c2e6ccac454b283ef2f350e02b0cd887fcb8bd9e8cdc70ccbe8024598fc03ead9a6019e866a41590211ea6a1efedbb79433e6020d83d6f690624e7ed401d6e90384a1e85d993cea9f83c199e16e462be0f383150186cb789dbe08f7999985d028b0b328708fb49bac9309f99266a1977b450abf80e5e59990f0690ebe02916cb5b2817982e40bb403afa0cba3a58f81ec7827f61484fdcf27d1169e597f2252c2188ddb984c8f4f0e8514f1fd90aff02e878401efe45b92dfb6ad4a317454776067fba0ed215a01e9238790280f33bc782272746de898dcdd85436a30814318ea9410618f35cc4877c7cad245548eee207d8225919594a024b8afba397e6d689bf4c15e87501e923e810d234799b415bc869a13fe4b1fa4deb99234ac7f561894783a90e447654df6faf1d98a9877f61a148aa1b2ba37d2624babcc86cd63497393681e70c67bcc959407ccc0600dc1f20f8770953a4f87a539206941ca30f24cb7e9d6062f8ebac08d840688818dc5ca9f98054a25af61310817e05765198eeb76e7c86487bca056f582fd1a39671f70657f1f59ba5622000e5443f6a3c442eb4315b6787451321f0e5efca5d19bdf9d0897b2e71d4c2a7095c2a13bd7591e1f55e7614d9deda69170ed7d1111f2c6216d41e8ed050bee96c7cfdac1318086c2915b955bec2821441269a2ed0cb5b114a82a416a5e61e2a3aac6a16af8a4854c242cde70c27ac553f4e939288e5e85c7a1ff319e5ad040750a69ecd917cc87418fea409359f757f46a28160fa2b457e99fdfdfa8ea7070adfac3eb5edd733c55e929ac8e364470da2ce336b8db6f55f3276d9da172c8a1f397bf59640307c2679060b7a183a6c1f4f1a5ecd19bc74c82cb7883ac9baad7a4c11cae903186766c33632bd780681f34bc6991c0233310b9e8ef70f6a946bd1186ad330b1668bebdd19cf5861fb06f4078f5fdc8df7d4893f208ed8be7a0050a5fd52f76337581ad61b9a967105e5cea8336efb52cdb3127e0d3152d4d1df52a94cf12a23076da06c5f63c9e725a5c23fdbced24fc4c8af680a56196dac59d8f2095124c0ee825b54ffc3348b5587e075a6fd6aad72b19a40aee821deb17be888fb4c0b3eedc467dc76481e01a506422bc1f2d977a98160923d3a75300934132e2184b80ba5d93b93fa5fac96db9eb4e43057bed1654203c2f3f2baf095fd335e970772e52e69418d363974d82829674ba0a3c064fa407695fcf82f1e691b6297df41d5312b8e67adbf4b2404e9b66e747cd3aa25abb9243111ee1f82fe560dbb4bbce29d9689f5f6da7e59f96dc046a7f7d85633b7210e684a767bfadc5ccd200f5649d0985229296971d5acad8fffdc2c1afe5b8627a8437e16f754dcda395d1f49ab7189988e3bd9fd26618659a50ac43b1bae60fc304e0c02ae1868cf7834bdaee9a5c7fd0cc6096eea06d17e85ec997dab35352eb77af98236451ca72018a5aab42ae11b02fe99ed0bab03222c82022e1bc0b2b0267f7572e3f8c4f6038e82642b023feafb046d7fd3c116be8fd7da587881c0ffc5ee8796613ddf4f82df91398587a629961ffd65da28963ed2eb25fe33962bb4b86b97849f434d415a21b473e6f0c9257ece9bd99ccc9cbc2c04da63a093a1cd6840617407ee5ad5a84dd4296d09ed2c52ac376e4de4303a4e3bc4aed34aa1aab836386f7a6658c3494b9f2dced9d9a96186b89c889d20a985266bb8aeed13de92a03e903cf33d54597003e49fb427172f988ce4aefff334f84f213eb76a2ca398b8c1135fa2d70f74f5e52a695f9d974c3dd69f8c473f5094dad7fc92e092cb212374182639e71cf99ad2fd4c9b97dacfe3e367ac6c5438de6169c7cd4dec5551bfb1e06be18cfa45b146b08bd3f47a6f105e54496f5301cc358aebb03d6ea5f7919a293cc41fa6c4305a75379eeee9080c2b402cfdeded5802e1c7d0e3dae484279350e1fadb6206e12b8c2be0041666ccfa3a927bc0267371cc849cacefc73b5ad89295708113ec15cf83efc0e76ee14d252ce68b2072b25b8814c2533c9b387e344dbaa3aed98fa6e886061ba3afaa42c566ea84e61d7ee0a9e1c3dc5eb74a5d818ac0356675715d48b9492ea2f7f18be5317227d7e0bd8163eb2cd7cf018379712ba3e23d47afb61c270c7c4cd25321da3669df270526dcff1a489fe1db9f313f8abf0e3dec5e7ebf5b01693499b011fa95eee93e3b471506597d4f4ff37e0d2bc9f1dcfe9b259baacc350f4d6ed4bf7b891f6d5500441bb3aa3a9fe7c8ba49faece7be1489c463664797ce8e279a4464162c22706888345828fe810774e4f6b38885810a1146e84e845bdac08a3eb5f35fb9916c73b0b1ef4e3e4f4948d3272169977558048fd795f11c6519b8b63e2d05d354d24fed29f7be3fe302cda5e24c7a52ea7d27b4f7988375d48b66d4dd0fa5da3efc27b562ac95d895ce51ffa7715566af1cd69f7336572ba4a7c5280a15f3373635aae65f5201b6b676c86dc124d85f164dc759da2d5fa4efbbbc5dd1c4f91413854a15876e3f748d2715f98068581421b25f8ae29ad78c69c4416895bdca8c46e03aca97be88e2ae480449c2640df963708162b07b6200297c07c29f051de67d817d3988db1a879ac6167ddadc78b4e61b831095e4e309a7082784d6afff3ea16ae3f35cfd7ff1288067ebfcb284b4f07c61e6feb52750c79a069a27398f4759838e6117290eb37fdce596cce00814bdf6fbdcce3af8466de3fb9da66b9d2cf9e09bc2983c0071f28ce3c67513f8ce561ac395ae40a1d7740c6545c667f94ab2301b361dd6925445b4c558d02a2b7503d6b185a5026001f7ea6fcde53a88e6f9be701b5280b5fa57a98abbc6578cbbbbfe9183ffa71d3de546698ff0a3dd8c85e19de7ec210443d5e84c0f774fb699c25ee8c20210c51c28f001037289f6d27f312f5f45fea8006b110f44c100fed60034a299e4b9b35f216d905418041a35b26140e196fd72a06c77f61cfce704164598b54f27b9959723aba4b8b2205a086141877b223f1cdbaf25f172565ff9b7cf077cad9163b10a1b68809ffa3fde074fe796546bdd39fd8138c5c8ebb503d69595cd968995113450f87beac4c6fe2b66251029a43adc74ccb5d5fe21993315e3434ed13f2d8e81ed7dd60e76fe52f347feb704f036470c720c28b965fc656808c2393c0b6a1b517977d54d17dadf34befb4fa25ea6c7cc0a12a4cc00aae7a174b443e483ea686f414049286f627a3aca5589e935fee235c3518f8f0c7c20d2319e8667dabdac051178d4a4cbfe77ae67cd2ab45aee7dd200ea90920efd30717f8bc367b01ffaa0a6bd3c0d8b8bf8550dd81ecd80ab3d1f4a248d2a527386223317471fca78cf6b619ce7e36f052882ec1dcd68b212727de8dbf39bc9c3ed0226a910bbc6ffe5097b28a229220a6382841d653707fbe69e03f6bbf280dc353d887b88a093c403629fbebf695022c720887bfa65772233ba09f782c8942a90cb1dfbd635c59390297111e4e646334a669c5e573f2d1ea120eceadc5da012b584acd9237927a702ea2f97d172d4f8fd0f900e6a1874800bed1ddfd771d644e99ee54c58c5e32b500b8787e6fde59eca28b8c114d14f834c74a1f8546fc3d3bc745ab9b423b369353d0b73a2b9c9c1ba3839b3b91a557fa7173fd8ee029698c59f0de3bfdd4fe0f70714aad4d743b6657f1ef7fe7f1e794d2b33d068a89a04d8051c858f90b14f647c5b1214e25ee8b68ebc1ca8edb6e386dd18ce9b45fae10e1111317114aebf4051acc57b53fb8812c68a8d00deb63f130f05896aaa38bbcf6f563aae9004a3eacf21874f74a4120aee8380ad2e459c28a3ada04ca520391d832e2d83e5de943b110679f3a096407dd3de0ddf802b0d98d3c1d82ddfbff4e7f3dfaf23a888e3b917ec717028395ce7372a8f05382201ba57d1fdc37126be791e2f22feb0777d4663a940561a2c457d575fa57cd5596c99abb3825d187dcc7e42cce4e7f2f644b6636cefb479f7f9012b7f0622ce5fc033c7fe846f076808a11918afb3e4355d223abb820c741f03375303b94613a16f926beb660ff832f46db3677982ac8967af136b65a8f5dad46a506485e3cf24ba69791961704161eed3413c376975940a190d2152e5b7f3cc7660bd0667adb8063a90d72da36ea8017647547bf07ae857f5b36d55e23656493ce74b4059a409a71b054a8bed97acc3966334cac1f98706240204f14b433e3d261a7b1d08a6d73309bc9fae4a3451991395ba6e565816f8ce4e752c7072d440a41fe121295398de1760865b178e10515e3cc3608139eb711df2fc9543a2287791342a4ee66ce97d4967d1b200f549fdb3a43479195541896cb4bf5aee709e8116c93d40eb0ff3b53519bdd9818bdecf69e7ce0013a4115715ea341b746a4c0260d3faedca6b0b89a3a55c7080054764d4e7147c5193e900b7400735e040c24e0f2023266b9f33d4d9d4a037b742a07ed223ff4640d512125c2484caf71e5439097ec2555377a3780e788f266d9058c33919017843aec43710e98f204fceafa42f6c1d528df1e2ce2084958060c6f078a4db164b9a4eb7c3e2ca2bb35ffdf49b0df7740f21f0c80e5ec59367c2d524524d09f32529eb4d3af8dc0f08e65b2277c3f2fabe23f3d347d8e3598a110d1c66860b2147e1e851a07270c4b052460c32cf4a3381f13e79b39ffe91962da126af94c9bff80196f0fef0a525eb4ec9f2b63b76bc2ebd3df1e4a3467fc88c12cdb62a24ff01b80eed8303564a02463c0989b52f669f70c37045823d470b8602fad1a40681e7b23effc6241df80b61be2369bf1580f260a414b5c87343b26e8c16fd510187904bf8fad3f5b1bc2ce905416e0aee0f64988f6269250882cf9dc832ef83b4cd21e035f7ed89c11d351c9a2971f5517c515e88eefa5aa76d65b90c5752550bf9bdfd0e3ba634129c3c5af487f11fcd480d82db932caf0fe43defa070a5a4a099ee2ee033054002cf5a4cfa7c97ee8eb9afddfc0dcbefe3a8f56a9ca3027669060524e79a6ba13c3eedc87cfb051346b8146fda85329ff6765a983fe848ddeae3048aa8911f322580e5a7dc36fec224d47f15a324e43fd4a091c691c28f79828c20461c14040ad48a9059305816a503f2460d49daa6f7c11696a91b2ace1fdec5ca0e4acd0c517debf1827a4a560c79d233ee01188823eb83f6e31fbf2120e805054e012fb5b9acd453c1ec3e0a9eb42c2fd3a71e37b3d6882464efbdb7dc524a99520a8b082f0924096ce3f2fc31b04de9b7ff0e70f90bc03f7adcd45c8699a91835a697edb1593aed47abe99f085a208c03472317d2f3921b3f15395a4d0f84505115284d8458b2fabc6b6a22c4922ba4be4b57eada51f1539ef76f32d5486986d5ee5372499fe3ee84d25a4da67fcf4947619af8a4e824eb2d7f01763cc4ee6b14dcf859eb8b17b232277cd1aca2254a04ab387b6444a21b185525ba0437c227c2aa91c58151d3464ebb1fb7286732a83097871899263e864512f5e3160fdd4d24953f3b69647b0bb0ca83a898c528dcf848fa870f3407c6f1c18403e3c88f5f01b6a11fff48ffd070ae8f6f3da83a0263e81f9aa5ed237299fdb88b25da48025e82bdf8f448fc4863afe0466ec59f338051a7d5712fc608551bd3f931c79d71fef5eccd39d342340c596760589504a2f8474ffb4892823dda477c2c7ef4e6523c299aeaab3577592d05553d3c444444695c807dc48f11034c13ffe32624619a780315d5488f7bf157c840cd3ec5d33f7ada477c9389bbe809e34699e44d5a4e44a41425da673dd9fb50b9381ecdcacfdeb9202de9921d4c7630e91d4baabfe60e37e8313a6c814629c76fe6523691e88d3e3f66dac7052ea55fdac1a4b27b2ef6f3b9f4b5b8757d7dc7924a5feba6ef14c228e3c31bede773c568dd7a2f97872e9699a664bf24977eff88c1ab24fbd5113733837b300693bbf7fd70778037da1c6d54fe90cc5c223272965984069fe5535aab49723ef25316f56b2b577e3de54a2b526c2f91d85bfaeda5cbcbef2aa5ce887bf2b7aea7bb0148922c27b9674e015c6c270de49efc1b3ba8d98fbe81b6e81e67d93dadc76db8bff131ff5118d5cb5fcc46476d2fb76deb71373bbfeb46b40d712eb9d0d8f60ff9b1c42a0a51f1a9cdbb17fbfd42ec42edc267c906e055fff0cbb4bb18e5d1f81ee338d3f4e7a1d806e2a061fe75d94fba8feb2fdb3ea4c52105a5683cc331fe57af9cec45469960a49561e662988d8e9a636818e39c6aa8cf3d03483ffafed6ba5652259d6a7079ee8bc0fce874aac1e5b9e781f9d1f3fdb970dbece95443e9b9e789f9d1dbc02b2641949efb20627ed45c90530da577f922257bdabe74d28ac4d8d3668b909494eabf3c4ffd17eb43457b1f97afaf591e5289b91d262ed6870a8fcb97de06ae2fcf3e80eb5dbef4fe3563b8d8afdf6342e8676fe4eb217e3d3414961196e632073d7a7818bd26f486a2853806b7213dbfce0c6e537a664e7d8c35f22fcf8d9cd47594daf5144a6bcdf8923aee8ede2c7bbea2b615292addec575df8650d5cc76dfae9477b3ad5b03df745467f03b3ff6e341eb7f93ed3b4ec6f80c0cfe93182047e0faeba2114037c1d0dcb201c753f2bee7f5640dc8395079eed39bbd9c02b1db8d91c1f007c5e610e2d1595dda3d67fba64cca5131a1fa065646ea497c43ecbaeebea2e4a4d1ea40db1c3184e5b2adbf90c2fef27949ea394de5c8a7d89d48d3a4dcbb22cf34dcbbe3b2dc3fec22c4b8f269899f9e740154a6b894f4eea4e3e7a9ed1e85fac0fcc8fdee7e549ffb3d26a77f25277727f97fa31d607e6ebfbbc7ce98847edec8e1849a24e08388126a1ee94591e785e1ee679b081573cd8007f87ec6de095cbc3581f9f9f950e1456cd66f918cb2b98b7a71d983f65d6065ec1d8d4cac57ed7e7c08924759dbe5f3ebdd4f1aa76bc2219711b6ae3cf41c85e45738a452a85d16b4af786c20a2b806c5a86d16b426f247c8c1bcbc8fc78771037373032333d6a6a328c5e53baf715db651b8625faa70ca334cba80ccc81af33037c1ef833f0bd0ca3b445c506ee132efccdaf0c5719d79ff20cd72c62422b92a71d86fea477f9d38ecb9f6ce855e94f455625fb3fab51fd6a3fd2e8e75e2fb3a4d27f7e8c310c7b86b0ca0863f04415517c981bcb9847be6919f642ae2d5bb6b461c31f39055c9ba9d248230e3448c37d1b3532a1c243df1d601bac2bf935eea8fd66bebfac0bed3c11f981757ba0173e7f462e7cc242725e14cb8000c9b0ebc7bdc1000244757343afd93df03c39af99197a4d197fdc3b8ad643d492c633d767d9c32c756fe0f82ccb328f8bd13c26bdc6dce8bb23d92fb5731996f83f6ff4fdf57af8a774a07f8fc949cdcda8f99db94392bab687a8eb2b0ba1761bb98ca2d55c9e7fa9a82a7bff1e32c398dd8b3fc81fe87dc557493f320e7c5a03d9356b3e1b172e818728855dfd7ab8d1e7c69883da3f82bf74bbaedf5ca575596cfb23a8d35205f81a1ae754524ba7bb41a51fd4b1419dc1a57db40f7f26ea217aa21d9d19dca6a18ef6e1ef704bce0d4ced238afafdf7a0dec0f3c1ee3bbb8da8c76d3ec67283c9543dc6de41c9ad37c4a836fe31b84d9b4c2c1d45d4af9a58cbb2c630da5996cdcf4e32649f39d76599f6cc651af69d61df18f69de6f33dc1e73bbf7f7e6f9bd6652719605b1ffc9da35b859164c4fe90c48e59ea4efba56e64c991be1b6354fc517c2ec6974c13396b993ac22b47fa909b3b8e2285a8332ea4d18778e10ffe23bd8928d643ac228a262e57a106d1355dae420da1abcd8d8aad52b799736a327e47db9f034f50a532cb94aa3019a6653d1cd146a4116544ac1e5f613a355373a660ed69222d510888a2101951374ac9d0b40c4208bfd4d58e348241240bf58854fffa7e97eeeb9503b9209ac6715cf771cc6d9ab669ad75d3ab75f7f5fb302f0e3ecc8bc3f51a65ce24e3dee6d20b8eefdb2503b45f920b3fd2adc298e6d53db7e95cbfd60da7c5410608c60584fa994c8f6ddd551847f56bf412aa9af6d95fdda7b19643ea6acfdca5659ed1ab65dd977d0ea98b437c987539a4e86557517825a8661442088f5c11218cdf18c42086c53859e8daaea750c5fdf526a822fd75913a18ca6d5e8d4bd858857d9c5807e328f818db4a837a59ca2b2c5169d462a4f3e1351f9e88f80cfca2664f214c72a1fde80ce0d7f06f866118b6759122b9f39b5252f4895009245ae7cba9e5f2155f984194032713b58c101a11bdce06f5bbb9fe566aaabbbb7b8ada2374990bf2566ebc1ed7ad855951112c9229698b8c7c84ddd9a0fa5ba9fe1f17b5cdf7503c0f591f640955a1d5242474bf2b0b64614ea06ab2202a42b9110b9a72b5645e7c980b6efcefcab2a36981a80883fa4d4dcb8d3f599355194ed68dbf234ac52edfc089d01d627141f108dd3ca8a87ff9d2c0f7cfcb57d608e2c6e7314585cf438a28acd13dd078e693555a1746eea018d48f85fa892a04b1b4206c412bb55fc0838aca97af44410dac9abcd48dac0285a75c58c19310b0d0a47a603e6149994058e124f017ac2c454d60c284279a587914ae7f8de222faa9824514222d2d289cb8c2440635c0019117b3ce14c040e3410aaa002209fa53646967a235c512ba5e6e4d31c6c52eb7a638632ee1964401cae2074638e2889567e00b368a5a555650831c1011456bb68c52469413aabcdc12a2410b51849c702688105b422a9861e880460f5cc084222ba2285d6e0941112a020241ce979fb4d5e553f9358b269c70a5fc198f16492a09130d88e81a0c31c485156674b9e58328acc009723425891478a1c5d009b24c2088b450e2074b10f14bb2c052ad27435c78b9f5a404330373085f620330890c942e7c53ca035888f0f324063e40620c278e085263b25670834b0bf9de9c5860190209126230c61a5b8c20011663e0e00acb77b0022e8eb82e27818b9607d0b8dae5561223b8dfa7a4179ab713ef543a33ec2469263ced7ce3369f0a08dc72bf4dc53852de7a250a625c1cb77a97ddee76e8eb4c033f36a1ea406666da1d8bb40bcb5ef38dcab95ddedc15aa5cb4bf6ee6d2c138ea9ad736394d9bdc77525cdea53341d4f59adc3431aa76dd8cb445bddc26fbeb395bddbbae87a155e15ff1da6a37ca344d7bcda52bfda8ab245bca3ea3ddd7d787783f1dae666d0ff1cacf58e8d22b73c9a28114d757dcc69d57d362db42125d8fb7ba0d13d10008d7b3d0d80b26975b5d10e072ab0b2b3709f44117f785cb2d1f44b9def6d98cc63b2e8344bd5e931886595ae5c605e1614acba8f32737445eec35312a256dc184228e0b82618df110ef11243dbc9ef934db360c8b379bd0b351f6b48cfad55c49ad8431044693fbe3728b4807d7c3b2e36661e53211164358586935717d5c6ef580755b5f64b9dcd222a8a585932bc513222b54b4b0b4a6bc6cda18350ca1fbc2e556184eee4d182c30b4c46ced3736a216308a89a2a0445554a22b626eefb8deed002304444caec96db8d583347a6006902cba3352ccffa2890b80cbad2f987891c665e172cb0b2d2ebb4d0a5b771fc52e04eec428655a7344cd6e6efa0271ef86c76fb0ed65b820482ec65650d3e5bacb7a7c3b172b3d89e3b867ae318c7bf7b8cff127759fcc2565309051b1efdf3ccfbd1e34602f93511257847d003e54faa998d83d17b82018666a1c9c69078b5aff8b97f437489f034725faa4cced4d7f4f8f7b2cc3dd998c2646cd300c4686de7284edb84d66638744cd7ec4da9e3ef6c17041280b580f0cc7eef180e168c85e875b3d381a6e68b820a4ef3b391ab2b7372f7041483fbb9fcb6e43b296723464efbd4cfb7976db60ed788897c3be2dcf65a6c1be2fb533f0509da7dcc51e062c286b815ddc90ecdb520cc37e623c37dc10eceed434e99e59f36c2b526e3c2da37e3757cec76c534a7fa326f784f808a1769895916f4fa0d27bfd8672f98bcb2d2eaab804b8182764be96795e4d0dd6a3e6eb713d0ec37e731b18c69118751bd2f76f15a62717a473903ad2b7979e392f35fd18a71f439b922aa97e8d89e962ca9db9dce24204976296ed377aca29a0ca50a737eb4edcf315261405d1ec4906ece963f6c4bd3d8d9eef0e90f41a471fa3db69f4a3cf3a24a30eb39799863ed67d29ecfb3199d49d76c6bd1bdde584c56245b1cababe64308acda069d42dd63031f9268ce2abc3c51346f1fd523a5c848069f83601aed61aa715f5b071d7a02f5fab8fd9cfbb18d0165d5c9acbad212d9752a1e532110d9e98d6b032a58563ebcea75926c72c05d2217194fcee8eb8279f0764c02b81189151b8f275a070bfed7e3c04733f1ef28e6ef176908cfe00714fbee7d5d4f4a87949d57817e769cdcdefb6c0b443e2cdecc634da0f89b7ed28fbfeaf9b1bb245f7346d76231b8d44b20f8485961c0dfdec5e4c74d3cc8ccc0ccccf984c2d34c60d696cbbb98921062031b8e4c47013b99b1e82ddccc29045fd642ec66dabca588692b80db786547025bf9becf4e830ce842ac85e3ee16adaa6a3c3c3f333f04851fb4bcfdc901dcbe39eff484ec7bdc805e9b1359765432c3704dee6283b8e4c4c83bd10ee694cf7c120e9993d86eddcfee6b9d9f76b5927432404e532d11466dc7a99688a1f5cc62244e6621b0c523037a4da9feb0f611827db8128f9dd3b5095044ec93458866118cfed1bae7342faa74c872475373bd37ddb4bf7f5f880dcbc97bac9d1d951f18ab254cc758ee55e8d769ecb9739a2cadcdeb62d320efb371df9b8a75ddb75514a63865858a8c609d13ef3ba947bf27574a0b6b4a9aede6064324ee9fd4d2c73b7d7816930f5291629a5305968a42f94d2178a75497cba6b56a963a6d9dc2ba27e48646ea5dab6e1c802d4dcce713a9c2c09e2b849c905e976db4cdc93929503ca57596e531b4afb111d90b88d3b71c20549c283ea0f01b7d97a6e30e2dbb68dbe63b8197e6ee7b8cde8e5c7e03693dbb01386b59452a68a6c6580e8ca211fb7e116104eae7c20a8dcaf9bf8fac9958fb5c7dbf2c1930bc3e5561845578b1c91fad4a9b3cbb847b226a6c9b2ecb70e89877141bacb76ae7fc605f1a75dbc3cd63b24a9cb29ba318e0fc72a258c922fdb7e321c1723ff8b49e29efcce89ea2f547207cc40cb1642b707781b0890107045a5b2986480b52a314e015a6700310d544df93e3ff0184e3061ade2fbfc302d15f83e3fec006a22c54a5a2afe3f9c90e0240aab68a9f4ff00bba7bbbbbb9bbb25d3305b33d0284263e85ebe8246153097afa041e52a216a30714a64326e702ff6304dfc1e8269e23ccd06729b18372b56b86a004f3aca57a144acb287b8f163931bb5dc6fbb3d04e3cc797ba02ad54050c580f9f282ed610c685517d1a8f8b451f1dbfbacd5a1c3e57e0de4d240d9fd98a853b8299864ab6a1c151f4866858b8a1df5e9b86dc3eed9fbd11437451d5a82151d2c97c8029b3aba74a3971df71adc5c84b809aabc99fe3143fb881fdd541fa6bc51c9ce10493656fbf9e5712fba1ced304d7c6e8afaf2a4d7a24296444a4d6a924f44462f474f6464a52881f997973d2fef43455a986abfd14bfb1d692ec8e8e50b67bf929c82c0ca932f6af6f1055a7c0d08e3909e5f875f98e8729c139e7bf0fb53504260c6174330e2076aace07f12f5a331a298c62f147d9900d195f642dcaca85ccfa50845bdfea3345c598681a88078afeb3dcb32bfae8797e501cbb21f825c9d0f7e31c62c8c9b7b1d8ca3b668cd6235fb88b3df79c8fc877b79f7d34b86a88078331ffc660c337b2f8e645cc805d9a1b708f99f7b7549ee9675356754aa79ffdcee7a80dde44b72e35f5434fefe1d30a8dcddcfedab76221dff41a02a56b447f85b33619c7e93cc9bd6e034cc30fda076c15ad498f821c0aa9fe123ee39048c98a0f6efc06afc68e0be76b5fbe8b23a308d3c03890b8d647152effc9ca2a09f73e67c966b8822212834212673ce391909ac1b4ca9c22ac210583810ac882d253cb04407a49452b2e042621221a594920821823099fc1586c604a65d6e2da16289152d084153de4c1ce932839bab73d30e4302872e5fc07ae372134b5b7ad069b55a2d1aa79cf26504f5e316141d776fb54c5e8eec3c881a39a1b5d3cbe436476f416186f0d84eafe8b4af1ea259d0dec1851f04a1402743bd03cd6196805e58e1f5c743bd1399a81f0f0545c9d181aaeb31acbbb9baa11eeaa1dee954efd01d541fdf990981cc936ec26468c883a8388b70b0019310a310810842601d6c00160d018628832068af92f04fd22ff767ff588beb115a71dd9db280b852807e35ad8ca3dcb4c5c4ee43d0428b085fe8dbbf75ed4c4878c1002ffc0a9a8fb84b957697339c5e466e1eb033840bffc3b94270e749c5d2156239c2de11a8a233720eaa2a1ed94280050b96200e64a1290e409287c1e9bb3c2149bbcb091c1a01bd2f6aa47fb4b310ee13d158a224d1f2b11653d5125f9878423e8d523fd6f24510be0c909a9afbb1961b8ce4403a618cd02e1731b61e333230148608cce5089cc9d832f68b0e3e2ebaf0a111f814c6ce2463cbd84d90b15fa8162ddc6be92088824f9b35a596244ed4efdf29a5f0af7f9d2450e55df65dac549ac4b3e2a5303d519bd0a2458b162d579a802549171742f8b109beac8d10cd43a935fd27a07f6054a856415a523fd306eaaa53b7673810b921f4d239a590decd795d7f79b2ebe109cd34a99fc908f5335d77db6148d4bf9f77eb90c4620713a66a6194f34a82d218e5bc28966914ab584629866159a66d1bc78d46a49ac154227db58d1bf568b4916238eeb71189546ba9e4e2f2f2020313c3059111a2a670828a0387c9044d2693a9965c60626e4478c36fdce81ba5928bcbcb0b0c4ccc8d1b26538e6b4aea5293ea1b3f986e4c381c070c4c4ccc8d1b3870984c3972e8d0b163c78d1c384c394c39749cfa9443c74966470a9d5d6106002cb4e0a15ce0d1a3c7d643cbb01e3d7a6c3aea0623733ac9ec484185ffaeb3768515666600c0020b2db4e07928940b2ef020f1e0c163c483070f1e3c78c8ec4861c78e1454f8ef3a0bbdad9d2315989dd9f9bfeb989979054e86a8020b2d78330480112c1851ddb6d082e7a1502ef0e841e303a3970f1f53fa88d07db40f1f3e5868c1f35028175c7081078f1eb2478f165af03c940b3c7ad0a0e49cd2615c30419927d5ad0b1c91be3d54b0525fa83406a18931c2b8bd20534475eb23150001c0d030d0d0d0f464a1a57604d0c44e53ea2f4e48b576f0f3217c1d05b043085d4c103d14fbb8ac89c7b46cda0183eaf282faf1d0ced0d0d05016cda1472882ee7403bc4cd47ccf347acdb75150cc8d989f4153b02a49146c23ffc6cbcf1903f3da283ee98b8c1e3e09be125237e1dec9dfad40d4dcf120889a2e7467cfefc4a8cdf1475f04fe8b55427af823ab840a0fc9d257c2308524ea07d52fbd074155a985588539d1f532ae1a9182b05041198c93cd3bdfb340d5280860f0c0abf028a8b7c0b55c9aa983e3a70e5425390255386c433171769b1ed3311c754d0451f349dd7cd9589ce5ded472a73371d4f4a02677ce6c0605050505ddb933fa2015044d79a9228a4934499fe32f5d5771b1429a329af34b9dd441fd3cc8a3b8cd97bae236e1361f5fa9122528ca6a742364481097c6c3863e83e80d44314ae97f24034c21dcdda1b7684d027ff83b3d146015cc04d826fe02d440b1d70fb91a78355f8b3fa80b80377e0ff6a633b88ce8232957bcaccfcfea212a7632399dcc41a5514606be3ff48f1f87a40fe66b0f5f4a7dcd1d0c5631f7847f869771e79c139226e9739c3422b19063c1e17090a036fc18db4ec76243afea9b60ec72523b5055faf93f02aa71554f9973d6e0ab6a5b0b44cdce594f1c08aabcca8c325f9b92cd06a276e55560155877ea8477be5b619c22a88a6fe241c5825671a7c6927d24a53404898afcacba055156b8379f347fd4cd975bd4cfabdc6e5d2b6ef3e1b8f3e7d756dcf9f3bd8a3fb7c324cec7c13393bad684c65544612da6ba4d216610f793b935f08a096ac70b2adff95feac6eb239f986f7c24442e50a2b8aa003db46125b2da38c2fdda89e6644b116df3c16c3d4666701b6825063789fbc9780aaa4ca6f89aa9b6a03244c123d0623fffea4e6e79307bf213cff51462d863cf2b2a4fa8ee04edce1188e215c686ecc4a81db12098213333d727b5bb9b075a4e0c53d2bf28d54107a8468d393ab80d5f2918041c85d99c2c4e90a81bbdd839295e161887e03e10830b4c8c1f18218740c500aa720835a057d890c17db97c850d297774f90a1b4a18418b9bec4c321d17449d7115fd7adcf8f165fe8377dac89e64f624c3bb83cf9d94ba0d845235339e4926422168d7f5542c503108e96bbfbd4eab590db400d6d095fa555335fdbbfdbc5a83c6f0bb9b7b98377b0cc3be31cf7e0713f54b5d8ca35c71ef9cf5f961c57d8e675d0f06395035ceea78a0726bda689d00d1d9d318994da5eb73520b600da5628c99fde0cbd3c8fa6ccdd1906d4fe9e8475d6454fc4c067a3f9f9b3d5b0fc69a5e4a0b0002e6e3a108bbcc651513ae818529a7f90f4fcb8fefe3a7d89dda9e6a80ef5f24beb44aac1225fed002271afa29e9a1dd81a8f927cdbb93664f0c900f5fd3ac0f0bfe0ff195a4a43d69f37f569b3d6996071ef9dbfc9fd5cf8acad0cb27fd977a5e916c0e0e2719fae989483ffdb6bc92160d2a27227de9f7a5f644447bfad4e2405fb35709159ef8a45772d2de2a89f674fd4923d9d365315b44c6f7374285f6c045d7536b011f08e143fbc3e8e147ab0344cd6738e1977d0ff05e492ef673aa21f28c3ebeb4cd8a3edba44ada096cdb411035e7d7a021834ef4e5a9066a79e49f78e25fb6ab448e75bf168aa27e9095e33a6a8450b975f97e70680a54f52a0668c40e75997250bfd8795abc15523cb1c216bb16b819cc6cb16301005bec00a095a07e94852d7633a4245ad862b74266a57e3176b6f542282b958b6e527f1b680713ea4763a782f6248a4381414d1cd58437c1638bdd8e2b3b29177d618b9d8c1604510d3482fa511f5bec4edd35907b4fdc6b92da62a7e3ceae9d74fdc45103a0976d2088f214aeb4295cc805811c6f95d413d032cd4308614321681042c834d43d18a78410324fe9ef90f414fecd5950598a00ca08a10cf54233cac0fae95fe1cd1ea39cd7d636878e085c18c39ecc21810bbf3df93206870bbf2b506fec16a31c07cc3108eb978fd3598860ea7672351216da404848a1ad0d40b91f674983d7b8bddd0b060927eef5f17a0ac4bd9c105da6a93a228b4d76a3e988a10bb3d48f7d84509531704be2800563a8e1a40652ca78c14a422c57c600ca957fd9082f74d03ae204373ebd62239ab1e2c65cf9b4827165cb881604910f85145bdbcc98429314dcf8728bfad53bd345577e943b50a144171f8001129240c51cc2054f5c90c78d50dc184d26d642064a6c37625f98da848171c42cc2093542965611683c2122cb101ae04887208a39d064060d40d1c0086628424803538c98818829401b116f6ad305e594725e39c38b39e7dc1202477114da84a3e496275cba90e58c222967248104356bc2fd6a3555982b50d0407d31a668c1779b1391f9e3c49dcf949a482e9f753a5c10051fcb16edf7e180848beecbe700affc972e076c2bba97d5b1a4c2fbc5e81c14a8327dcc8dff2a0e1badd501deecbf1b1c94dea875c441b9f061daa81f5774e18f9ec3c238d9c3e7cc701b9787cf157164b88d6ba5aebe465f7244b08ff2230dd84986f8d8c7c7e1e5a37cb12719220ef24b2f5febad748a5648e9e5cba7f44b5db51f0feea8e3a12f673fbad9af9ab6a2cb5a6f10420cc67252380a72562e8c10890a3f76f386b6606e6ae5b2501ac08c4a9d97e7cb37995e4e8c820f63fc669c1e1a4aa9fe1fe58860d76d756bea72300d7cd9e948d598dca66e9c05f5fbd44d0e8cd2f6d0d9f5cf201bb186eec052fd53eeeeee5f5cf525821604868a6a6aa3eae0bfa30815a3d79411fa476b819fab83ef284265efafd4abc0a1bf01f601ff45d32e3f64557740882ea264546a5ffe6b630cbb54aa948c6114fc43328e0a17c20ba1055282cbead800023f16b2018a0f3fe38244185a2be300c13832e3867037da8c4a85973929d9cbeb7229d910fa57f7f98df2e3d55bb48b034c03bfb92119957a5d08c4ae99465a23eec5ef537c5e65ef2ca86e84280650b2930cf179e2cf3dfd4cc3256a0ee318b98171e2c36f00ff507259f500154ca6528961b43e4c036b9ca480b88d3b61038cbae3dfe3957d270b1620687606b59f4f1e1f5a254a564aa215b2e255bf9351bb655ba8e3a2b2ad1d79a87340c6500ef291c02d5baeb4523cb2582b0821dcb265e55bb6a8608d1ca4c86732ae14fe359aebe118e0459ac96032c84083e4af792785452507ffa692833fbb3d11e9ebfdec3fdd16883aa51b5f23c9e719165c22e5b4532d7d7ada81d60451713eb5a79db9a24fbf57d4e12ba1d683a808df2f7b0351d1e1f717f16739e40eab10c10c6a53aa5258f2990196158b48cb8af6546415fbfbfbe10f90f084751b0a1ad30cd1a8db44d88d80160eb2dc1c97afb0c1ba4360528426975b4320e372d1e5161945b74504a13b4b77be469acf3ebda2fed12dad19a36234da229ee7d8bb5dd2abeca36522c40156d803f52a7b13f6d967ba41035a1d889ad9d78c7105d9a11f29fc48bf5f89126a7b6ac66022fafe45a875ab258916fad7f350eb4385c7bfffb2ed478022d03750901decb52c5a9f5e65dc8e0645a3cfd9688b5809a201f58abe6619a278a0f56122c40156f4817a757db44b7a757d0d1995fef5f1a137478fa31ddabbd5a27fd9d30eed55967daf32eb43c5065e3151424549665b6360581a0b44c167ff22bd62615da06e50e7e5161144440c0115911842689d9999bd2111124a184550462a0b8d67be54b4ff10de80c6348a20d283a296106d04418408c804d41aa24882c0d426178470c6d0d51982e8679ec0c48d975b432cb9dfa7588fb385c6333836f84acbae8ecbb0e6d0f12e36bbbd020f6a578710be91d9f5ecb8c745468ada4a670f59da9caf75bde209ffe32e43adf3558a21b7a062d6870a8ff6d9fb68f2a177d2c8e415e43c2baa7dbfd8d14752b677ae48af36ebf3c34ab3b36b2b3d05a2e0639d110aa9b568d4af592c0a37eb2c6d0438b6ff622ebffc41ff9b5c4b9bbd69cde2308dffe7c275fe991856997ef20fb9b10d86b33d7f896db4cc740056298027c09effd55120870ab00f7f78861ad79f70dbfb180ad75f07721bd75b88eb708b3567d4ecd93d6e48f6dab5c50ede03f00eaeeb34ca3921432e4ec80e8d456e988d8614512087f6e17f791a5a9e70fd75988debef5bb2e06b00ce0895c2fdeca400d115f7b2930254571ceb466b290bea47a9e6970d349ee12e8fa3e27677e20a4854f8adc58f85e4e7b88c3d76c73d2e6af721349ef99ca734b3ec295da59b7094f7138ef215a8807d785b7fbe5c109bebdbe569e116f5f3a12952aef721efc26da277e143dd41f01f541e5a87fee14a149181eebef19477468eb837c56de077fcfe243a40d5cc525d4d5a0a520a1da6aab8d7c409fecf8516f62a767de7f714f7fa79056d80ab695700aa2d5d8ad1ec2b01b48a95c8821b072251e5f54fa42083fab5909523f0fd752000a7e00d3318eef90d91bed31eb9611a2f2280d70057974d419415586ab75a0868470e2a7f771087304608234c615829478e48c1a85f4f99d21e1dbe13582ea0ae7b8eeb5fe93a659c78994bdcd59c91011e3a08104ce3ef4c7383f3fd9b4c371815f5bbbb3bfe8fec2b0dcd538c43baf33dc639ed29cae799ab537c25d7f34b5b43ff7c1e2554a2e5e1bf5e49ffbc94cc1d58d47e36991c06acb5e646a0ea9a454a8c1cb9809309b08a7610377e43a14d8b2660e4889306e2099742f1208a7d84d11c88da99445ad48f8b8cb8cd478f40c06dba280235bfe61bc7385ff64def97fd67d967178bf1bd0dc6a4c5987dcc3629a1d45ed3ec69085fcdd69c51a9f63f37a319ed7a80f7b25d8415282cb8b204145ba4b18a9e8a25d0e0ddfa87774b54e9efb90725848e43fc1901bca07aeec1a4b5a834ae9574410c15d1000000004314000020100a86c421b1602c1e95cbc2de0114000a8ba0447e529849a32008529842c610600c2080803100032033325b05e52e2b6ac05478bf273b1cc876a547901d81ba146452eef7bc0a948c6ed2dea62f4c9784d52eed030910924114fa59e0de1db03f7be46813a14b0483308478a33da0abdd88f57483bd0929767d894aa9d6a74997a1d1efdf20adb8322ff4b9f2db32957ea26f2727881446ec4a0366981f409e52a16cba27c834a97f45c2e8d2266ddfe35961756aafff73427e714d0be498bc34156c2712b34a8c19376272f61ccbb04846d1069abe353cffe41950d37bd97b971f906e73df893077e4af3278a08a15d69543ee8a40d25557e39c1447ae6f27d6fa8623ded381c5db8e2645ed5362123465a0da19a66d735cd0901b33250d21d3a40c601e869e3a9b7e400274800cf624a71aa248b5af2ddda3104e8262d332a7d4534f1d695510b5435dfecd623eec499ca60a19a64b673854e7e8b8351a8c1ecb49f3ec57b9cfcf6218b3142dc652067ee3018ee3f99e4bef8a6bd3149fd698085d9b26191563177429c4204ba735ae485996d66c534f02d8bea5a5f99ebf4df263bed1a7ea3db6ddcb779e5035886f68f9ad01e7e6a411591c11a285e9d386e9b95fe3849b3b131296689b60c7047fd6af67300e35afd4afdc8b1af0cc57d479aaa5bcc3b0495a6ebb1a4dee9fbba915a5e6b9a7b7a83e7ca942115f6a4c7636452c6cce9b2d3121d0873852869c1acea97138132297234ad9f71a7036ed93dce4a3d06876107bdddea8a2497b7a103032e60360b535ed44e2f434a3f286c8db3040a7724415e7855431fd9d2550691537de0b6b9ac00cf6060fe1dd1914837aff900d09e14cbf9b34ce17ad80f44f4cc1c7bfecd97eb4ccf1e734863287b6749e0a597b3217d375eea163f35075453223b0ad0463ef194305c5e3ae9d5d9bfb431a0b34fc277c567413af7ad0516f20f7526b81b41c14f0285746e9244f91818bdf417f1fd299aaa46dce45ec861de8b6ecc22c1f9bb604676a3429910131b10bb7fb15b3b27f806bcdd4dc9918ab7e5c3bcc653d35625686ca8a00dae6407f0e3abf8444079703b0dc69b0aebec2138ed0e46f218f23ed8fe9337ccc1d3174d3f22d25120b373ebfb55aaa7927d9e457a984be67937bd4400b158c16a7582a3285187737220644d1674744542e2491a3f12e3e2c208b0c3e6a31cdfdb8db67d6d421b0db3c3561a3deaa9b3300382a6375739025324c9f99e14007fa8255f8a775a6cd7b7ba1ed1430fd3e025ffae9914960d95dc21732ccbe6af91a7d969d7422103823d92b876a54989366723d29155b1b652a4d0713868417e99da2230a84b62b9ffa95df646bf920c6f5a5a209df264518f62e82fd04b877ec21c699d05a8fedd529a529a45777e211905de71d67dad532308ec29c450f9704cfef7205cc1d5b01fabdb8235f93c6b229c1b0ecd0316a9a37c2b468962deb93a00266bd779b973fb622e9455b014f10e126fde906222f62ed50787f916944f8b3c326ebb16f97c21ef00c3a881b683c196137cd1dd2181a9b61d00cade4d67256ab6c36811520dc8e8f598eac6b96bfa24807d0a526715456ad9dd5392e45d278fa52db44729ca53d27f8c746fdd628e7680b1ac639c0b4479ea1832dddffe9310f7cafcde26b1ce83ac0aba9fefde4f20bdd4a697e5ad76b4658292129e9aa3cf3a3c5e64808cd35d65d1ff1831043dfbf4e30da8f62e853e320e2ebaf6b4074bdadb306c5de1c6450baf472f59d1f579acf9cb60c940737e52f9529d9d54980e634f15b3732c56dc00204014a399d294e26a748e514f939650c25c9e4833f71bd3294c0602053a530d90abefd540f85f5e707211f476e865f51315c05ff6706376ac6b493cfbca1cd613bb8704c1c043003fc100f0b0c98d6ebde89a300ac9ff3cb4d9e179da4e307e3564725bfa5470c94d164049b5828ff385689b94f3f892c0f8a4de70594968634ea62f95b603392e10f934458131cc2829fb71b91d5ab7cc5ba8fdb090bcd6462d6d6b7112c209022d00c703b61ca3f70769d25dd7ec93c91aa1a3aa08b1fc2618dcf4bfcc7614dd6968549b6da939444e589d17260dca0d9defb984bd573771752bbdcbdeb245fa129d25aabf4e755a6d2ffe4a6070ead45120df5eb2ecee3b1116a37fd61d0bde355392efaed4f917cc8029f80aca4a44bab6f04824e7de31648a6a7f1bf33665d0fc8547a8d0cd6d5ce61e82974da717122f615cef89cda9cd04100a3f4fa2fc88e870b2d10d7a4ae535e15adaf48b6941a754789547fa6a793c16fcf49acc54866c396dd637c756f06d458caaf97b08192b89a957564ace6fff982c7a17a2e31c0e4393eaa2db87b007be308595948fcc286d4990731ef073d9cb7a3785dc08ee79f883b352a2f98d000978449cf4f78fd59966e09315f00af3fc7f9b408bbfd74fc03ae091c8e1ac83859f9efa1d1f78f1e10db9accba489de6a94231165a627439d5e81455eb98cfd404f86fe605e103c650133029087cbd2aef653dce4d82f41264787f5bc94d02006231e10dfb31802e9d52fb3d96277c0add8219480b9ec5f6b7a21d674f51b46d88d0354a802d758d6d430bdc4d9050da6b49b7f4b30ac0b552c13985651d3339aa0c309281050b4ac8cfea394236cc0da609e7e904b2159195e69959fe560b265d7682d212ed3065409136028c1381a0a6296e0b1c7c812f55d46b07b0fea6a3c346c3c451c03b24b260f8fef63aa97325c0246fd5ef1209533ef63d32cfcb5606d063cbed33632929786041d91eb23c1b6ce4f8538f013c0cd045ac3a21e793ff965ec171bd0a0537e42b9642b34c221238dac2a9bb72073ef45cf5f82a757abd14608ea9922b491ad78ba3bb9fc7405c6077e5c40193d65d9d5ff7e750ee19d2e361655c4e5dcdc4e5f09357e400891556e5ecb61c11823acb329a7ae7e864e5c6c8c23d75f74b9b5ab47844fd31d2aa0307b2dbee95a1d4c53cd2df7de0159c3283ed866c9232018ee686577dd0adadac3724742074a9a5f37a41fab171400a989cfd0c878270414f62927f78d20875e2028ce5acd0a66db899a666ba5aa361de96b9da3f26c5baa4cecb276a4e5b79978f005b3c25b44f3cb2edaca9b53fb08fc9e1084eab2d037ceca42956fec090a18a154383bed00d6a7d03ccde11317107e09c2351e99af5eea103af304365ec0f94b65a30f7d228c5bf72a36afd4c24c1efc99419f3a0c0fe5db33dd2358f60f78a87c52402324e1dac9722d94b5dc62f7543d5a09e03dc74cb3ddabe0228c297a720f54a740a663202a68d0e04d1367602598a391c92ff047c8d34f4446f95dc3bb60e0e5b86a49ce615ff5df72bb576a04f11d13b706aac6f23f4c81e540d31e5c0cbed861ed42e1b2a948a2111fe46a8535d1f168f9de235ca0c1807d8cc2dd870b0705520a0fc511a2fe5d442972e5d88a1ff98e7965ac31ca22d3ad1ab59b99b12703389017d6c1ccfe2df1abfa3da2c94e9e106b9bd9b64d112e9a703b389c8b3c9170ffd7ba022d5255ba58b040b37b066a79a934e97b8c14e99cc02c64d5de8051d715edc14114f4821039c4a7103750fab7d994471a32b9934018ed0c73b1637cbdbfa5ac8276e26179f5a8826018534ef1b93aaf04b00ea485c9d93accbeb24b6854fa6703077bfafdc655c67cc7565c94a39ce94922c5d64e5ba933bbdc1727df3818fda7d1cca32445f04abcf1be64a10f3d70a47026c02201fa35cec8c5692b88ea2ebcb178a51568d406e51b3a418c592a246fad460028ac0519be451405a592bdd065125d37818f459c1679adefb20963759cda88b6f52afdc628c9f1bdda3471d5b02344d492da4a48a83befa10ef1b8944782701b3c16360662ebbdaa6564130847ac848941251c5b41301c42a43d12e0c6f3defb328aaf8287fc051846758c866c5420f50325ce3a81b8c038780f6f81f11b83250b1ed750f0d2732f332abab1f854f780c34ec4af3db42b048ad3377828785e680d43e4da611d579e97de4b8b2c7c7f8e4caefea89e321b5fe868c617e68dc3ad178bacdac9c04a71a9f4f6e0005d1755752d04bb84a239b5ff2cd50865596899ca1cf3e5fe2238ad0d87e60f9316e150c8d873b08f7a08cc86576b2c79d5acc09b8adb4009c6528a54041815ad12a0042d1a7f5e3dda474554576152339e9ad1faf866494b9dadb37ced17c7c4d0ed7c8ada71d3202246697637015ce7c71d3bd6f1325abf119eaf2fef79e2c15c9fa7325a1a638fbd5028136684fc7e76092aa31c3f3550255fc22c9f1c89817236b743bfb573262098a462b22a4596de23e096f79956d744e9026aecdd18fe05af37ca753c6136534ab3de739f19054798923a4bedc1984f5e92e18a090ade04e7c8e8d41171e32d38e41514000bf47d3b57a52a07405eda8a9ae0bb5f2f329467fb89c10164176e2df92ac84c578c384f9bed282e0b07e3e5a46505e2d0f8e6ef0afda3d054e7e86908b1be913253285f1115b4e9931aa0f7c11823936d2cac2d05857e0b4bc0f558f2523a93f02dca963fb21a3eac080c54cda404946b72f727cc8fc6990d624b86f2d92ebc50d73eff95e6f3d6b9774a943e9c42f027669b6198a80fac4bcbb12b6df2fa333fa408dcbaef4016c3860b18274903728e23079b04d026968e5a3a07282190b052f0fcfc130e0d433a8eb485c318bf20e6d88ab6205521991bbe3adb22fe3c67eb88676c5fad8b9b3eb4a4fd405bdeade12df9fe364edc2114449d2620257ae4c46d534e2a41e5d09707e814995c550c7038d47c7249db13c408c308f782bf85f55d97f897e37a61e813f28e73824720d7517e9a17cd5320f8edb31ed5980ce787d3bc4c490b1067caf6c20448176731f37f323cc8a1457c04f7f26043a3f9d1b8d814e3c62b7c454b36d158da504addd16639b109602714fa48cbd1059970e4b7a2d4cd4e07ea37dfdf7373e1a18fc6a9d5b31497adb38cdf641a8837ae31fa397d79a303731f4ead154cc48aca45f0bffcd6d64684dd7dbaf5c7b87b6a04aaf049400d48c1a297bdf2621252653aa9e6638a24d39c06fbcf75ec2f87d72b15614142d422db44cfeeb8a15c73890a5b597664220c451cb0524579543bff334149951337c918623c4bd5a4b4f2327843ce48cfd78e24b716f18e2dea98361256ef990714f5db2f767dc5343ffb88ebe8f7861d07c9bbcdb843b66bc696174c421a27bb6e98b1b114fb515bec98854ac57d9040de57e57130816135731b67295d3923796e16aad075132da0947464dd314b4b2646d4e2ff48089b4fea90f0461d6b4cbfd8100e64523a02773ce0a3fab64e6955b2dc76ed4eb52e7231cb328c714bbe4ffc9caec215593343167eca95d80de326b113b0f1352add7b31d634103b7100469be7264a03e31a9e18a44eb0432510b6ebc53bad80323f531a8108c7accc67da2c573fce609ee4bd78cce03f17c6e24a31f37f2594b5d1ba0d4b573b1a4341635da765363f2840c748850c44c5abe535e0cafafa284cdd83facf9ea77ab4312dcfbe7079430c314c669efc11fa9730d3cafdb5a700bf5c1dc58443b76d2f1ef700f9935a57321f382e44e6b92c3b700ccfa43e6b9c4caafe48b19672062a126e26f3092168983a888cceb61799fdcf46b207075d13fdce31ac66a0905b6bc7fe3626d19a51b461b3a6887be4c55ef37f25a431daaedbdba49a0b14e9bc0ce4314c2dde4a2f7e8db506d6655a851ee2f2c350a78a5046b25dbfc326643802370ece24a4e445d7deb158c71a9bcbb02e6e180c00fb9eb3859c676d9bfb5e6415e93505454adaed082eb2810f364a619b37a69daad3431e0cc185d5fd28294b4e01ceda81d819f527f032771e97324cc8c94387aa6b67617ad4cfacf611eca215866d6355b14a6013cb2dea0c203d685bb19a6ee84517863e21c9c4ffbe2eada1ddad0430cffc8b49a6f118ebc3cf73bf846dca495129d3be32f45be73d2b126c500fd6e4fac65e5f9c7ae21d922970e43fdb2c32d507c99e60b2d67a5efcc1125302bf2dfc6217123bfe65005d9055ca9659c0fe162ac480015502b28d1fa26fa605e6a1c409096c70e0027cd9d214c8d5c82b8ebcb06cc80c05ad7e8e18cef5974e9f07032f889f8656e7a8187146f73911058b549f4d673f378e07be6dcf456db0f6168fd51fb2916d6081703634833e860f601737315c6ba830b14a3212b7e30d3b7d9b7dd7ab340037b2a9a60715e175acd103c6067dce1cb6e65127357410a9f6bc4dab2980c3bb30a911623d193d1be1162243e4447ad47455db0e3eb7e036f1ee08bc825ff2f43deed1791a4c9484525e3f4feeb73cf85a3cab289544c588f452e74beb10ab51bde1d8cdf162cbe246fd0a4958dd75713cccb3ccf6027f71144df0263c46fd652f25a15c81fec0739798a593dcdddd56db573a0aebc1556b45da8f826de5bcbf40b3760f6c8ae86c870c034fd72dc27333da0c62e04b858c1b0bc2e04896a7edb1bc9716f065f681e97724d7b653f8952b3ef9dab0fcdc95709064aa66041c19153ddb10183132ef5700c1068ec7669da674b56f3ee2111fb33e8d02ee44f8fa49353011cb0ecb865e52d0116480b9673d063f9ca93d33cc429259b33dc6ceac1d09e8bd113e80957871b327b9da37c9f1a6eb120b46ff416836669400c587eb62c3762c35744c22494c6c97c0447ca67b6e60c7ce7aa7444046e40849b290bc8b37208c395251a26e843977eb2fdf64a9cff1aad991be60d5a17d1f74248813c77863f37420065dc4886ff338bd69cdb46346e2d5107b014f6ab990e7169760cb9b9aa42a19f6428ec8fc640a8978b1564427dfae96f63602dd2646a14efb2b1bc191d364bb0c8ef68f1301de8e2edd98260a2a98034a2606dc383fb36e208524e19d799c18a913ab05ddce6e89915e29a26df4be867b87379d22af9b0b60d54a7799782ca38a1f390f5da577087def7a70b9b501729ca66a08e7770fa695aa0e0789415d7e6dc901ca6b75d769a52a86bb42d8de711fb3b83c4931f07638bccbc113c2b5de1126a45d0ef455427a22d79c5c22876cec885b88e80e40f6dbe3cb852057e0610bee421d5b02ff0f956a1a027ce331d581190187118a7988e594c16429df372c76704bd81951bcbc5e109fc56336b71d4caf960808092b06d3bf7301b4839954998e16f5924996e79cb5290c81b96a34d6e067f894cadafcbd2e2ca672cf96352e6064ab72cd3c7be6aaf35a9896b76ce81ec1afa927a30c2562bf7982aae4fde3ee893ae1b137d9c01cf19621788ceda0073592ea93b9dbcd4eb9f8697bd6716c6b3a9cb9efe994f1924f8306c34680f71042b0804f4dc0f600721efdea709803520bb08bea44d79e0aae25534d2e58ab3e564ed356b5a7c4bae03fb3e8683e0e507b37f7e9f1008ff0384017ea1ff45f2d46b725c10ac1b457e8c0dbc245d3b630eeaa26e7177c92c0d3b02c7a364e3ff33bb0db938f51de7e8e5933ad8ccb64613246d12899651599b2d35dda96e99a179bb4b15acb1a3508d1f7b556408691c5f169123abd9c66237443d96f9d4d148bf5c199cf283b5db45b0e7183e884c43865c7f3567d2f7e937198ef87a6266697e3daee88a68e2d374eb7b4636acc77b9e7a8f3cdb7a42fb43b1d531b2011d8aab383c5ed3def1059c01245a681efb10486e94570191376bdc20d663188519153dd063dfab66bbd551373c0672a3d9487d029634cabc5876413b4c7785c51e8ae70dc11f050e3b1a64d02a683094124bf966628b8e068390a815f7f79358729a59ce44697a9c11d2a43a5cf1572287d3835614391608cbefedccfcc730b17c489ce03c5d9954f2f7a24a11236a346feb1d3f3250204fa0eed4e8e8f45bc8e8ba9b10aaf9cb8c086137a75589328d3657bcd94055b85de9971b430508f1f824e7b8fd1e969caa6acc22aa23fb2e904044239d1779a0bccc0f6525acb21e760b624ffe5a645388865b7c5db599d6096723f1e0a11a8109a734ee1f21e84058bce70a939426bee69a1026111c802593595c890746b195c18cd42acf43986405f82389520df7eb85605b81c3d5b4516d771f22a6a89824fb651eba0a60b624c77ccd50a1249b6ad692183f25917c96e447cb60122b5b911c774692130347d8deddf74d9281a088b929047ffd07fddc94f6f59c8a249a7d0137f038bc0c7ddb825a6351636ab377a54217c148ea145fc2545f779b4181b8403fa22a92389685c9a8542682534c26bf4a1847962bfddd31fabba703c94619ad48e4c982d5e71643cef7e1259a7109d9e5a7d281a0ebc4347120a4244192985f3a5ca245e0f8ae86700ed946f00a02599e9bdd1d5dd3be72c471b0f3074a15461616ad8f8048508354b727220b2959104d84b80185b159302858c7a139d2b17d0a32c9594f4207ade5b51ca0e30eb67400cc8e85b50a5f28feef9b5be983bb277e40c09fa40520957205cbd7f3e993383b518d2eac89c107aa03299086ab82c94002590122d423526b08d0e6fdae4b4b2c7ed2b83da3428fcd8984030eb5bfa2a093a9203b6954ea25cc151d73c182564d38022c89a43f236e86995f82b923dc5ebdb0402826c969d42fca782b95fe01ed3379a50239446922317e67563af0033351bf28416815746cebc787ba436d66ba23a3d0308a2346ee384b94bb48ba865127928b9d220b48c97efdca93fae75e1433df6f9802bcd50becb760302e69177285054448c61ee5f76b9d570f9066220534a11d86deeb35f7ee18b9d82a82e06721c1dff1fe039cf0faad120edb8aeddaae051777bf11aa57be06d74615d0772cd1783234d8fdadb3743057f6422e6ad6125ed2292834d149219f63e05f7cf258f0c8f5e5148409116ab83d7f731cf02a553f81887b3903eb4fab00aeebeca8cd29366ecb3c91580ea15adb83aa02e02e07184df61ef5f15985e1ac6db9d976616ac85673fb471c2eab814a2d23c4f83549c1ce7c0d8dfbe67789fa2b0b09ddbb01ec673e709059306244e9db32a7cd0f4f9f2cd4658c68a1fdd8e6010e1d026bce66ab451045e18f861c0735c3a60d6f2bb220111e90223f5125166e66282b72db65c4f4f581eaaa7f2b79fa23e0a33bfb27f561346031fb0812a2a1c6155af99e406a80c33baaff903441c69d96f0a3904c56c7e35ea3901fe440d13c6716121fa25d7e49448a88157eba6f650d50e02ad89d0e8dc02ab765488e049a1e701afb1061de9b4390aa12428020f21bd9a0a23f1b73bcd8de32a4d076c4ed6d0edc60c52fbc1cb0c4cc7850f1d10755faed489edc0b925868d0981540afbe5ba5487bc28d6ded347b0d0a0137d4732e5cf996161685018e3c7d2b900330f2667e9a82bbd074b4ce64bb85e6f2f3e28785e6b0e2b99a4785c3bf403eca880bc787965b5079e63f5025e4c4b3cb3ca4d7dd53b4c30c0322b1370ce06fcf188aa477bdda064c09cd63ccca775558d45c9d127542f3b63134b80f82a53b75091b826dd0d446feaf9e97eafbdff7b7eabd33366b5310103c652141d439f577892f5d0eb154eecc3ade4eb8ad9c26eb314d8ea205e12d17077b752e21292bd69a9e3a5ba9b2a786956328eac0d35432dcab5b009d03d35f7a34fe39c42fa9e49d5763a734e8b0d3f9539d1bd0c3288bd6c26c4d6a7c202286ccf43145d921d206c7206234557603067703d32c5257bef912083ccfbaac09bb3846417adb8dd823a047e19bb001633d6591ff6565caea25db2121e10ab7a7b25ce6b28b05b821eb41b5d1ad819fe036fa53e8817df628b4b7681810fa8dd9f2eeb6197ee37f12dabe44791c2063ce607c874e79683fd441243d54144fd2a40475b772154dbb2be2330df1fff6db04ffb82c39c8bce50ccead992c56c6f09dc36197221b7fef7ea2bea65b7206237d32430578188a4ca203f7b1ba94b012d16bcb1485d754912f53749c8d760aecc70fd7f8a35b346a6efb530aca2d1a7bfafc3404170650429b07f09f72140ae078798680edd8071c8995d0cb9796a691907975b6ba8168d7e9973c287397dfa401e8ad47bade0eeab76fa47a102e707c147d960aa870f99f494c4143e571ccbdf32f79cf6134187b3170f5618ce44d5be290d31d9a19738319a00e66d451987c1acb5bf2445fb02b5771193aecdcb086e1281e6c15c8c13c7f8b9bddf936d8ba73c41335b3807f493a4e581e8b7f8b066c6405e0562d0f9737014be10faf2b3f36dd0fac95ff0022083e00425cb96bef9b6477dca946fe1466c367662aac4e83c2708b9ebc283e4de28d92316d62d335ea005fd531c96dc34d10e36af8e8b3d8b6a7912a30377c8ef8d0b7fa914b95ade0855ef8457a313ad35bac31ad48059abda2ffb4895598d1ebc2bf805627f193a4b2bc61f2280fb75aa655b0e427a14a0e79abd5ff2344c24478885eedfffd461216c5627c268089e8b5a16a0e5a41027543e0fa31480c212ec46cda9dd4797edad82c9fbf385825214d9331362824742a45970dfe90b3a21d9ea124ec478f86011689493cfec428f9e78477c42340c207ccfd9088861f9897815185850117b8fa94e9ca4b8684746816948d47485dd40708bba1c218e0da74801c05b190e0412c20eded8216d4871d6a4b869e65a1ae2462f1ff983a71b757c8c42a8dd375130c6a32121d22bda395dceadca9d2bbbf0677efb43fa0ded84bb0f40aba920317f0436b35f96c0d76ac9be17bb87886d4c745cfd416c4e1b10aa370ee30174a760ea796a2d265af60eae5f6a6245bf28a8c3be279d4a1781e7e1893158f133ebf1d0d7460817f465765a0e545c8d61b0d2547cc023e62ad2ee741798cdaa218bd753b6595c6076c8d1f0da89589ec7b07f3671d098a0479b70040fbf3437cbbb81b60433434f2795328a0e15f58aa42a61654e29332cfe10d6f25efc1b5d40c0520b94344d9e463a501b9393e6cec1fef15a55807dc181bd0b75faf9d0324c9c216ff41813fd617de51c93583ec0123982bf6c1749db84152357d2ea545087d48b89a033f4f54a8372d4ab56ce3b1ac450d81f69053ef372d379a1c7a0540ac7a24114711e08f85ead3870bd92d92db746df7cd7ba24bc6ac19eb8e1a08caffdeca19502f4c90337077113f211db1055bc0dde8fbd8d5be02aed29fc06962e91aac9dd3d8858374f40dc06db90f9a9e588e6f6fd90e20b9063e57183cb544e726ec5a94a02839308859f2cc3a609639647c80e81b0ce86376bb8b1085080f705295010f1d3e3912634f6b603d158acba7abf7a9f815e919988e16aa9020e927da69bd4adeea9afc705d5735e81e5adbf47643e88f9629a46b3971299bedbf2e05d1c0ec7d4e7c3219b256500df450d9042c2b2db7fbcaca9fbf282514d673b03514b03c706504d281c1fb9af02419aae94e1dae558341596867ad56a2e0d3a98169499b61e9c095be1ca01b09be153adc014935b2ad29b40ccb45f52c2aa089d9288f5409038acb2094078045267b96bc6596e498ff730a34f6a4fa6e2c3828de795c649a2866029e009382fec8a0d92e90da0cda6c2b84992ff75dc7be6b8e5f39be7c1ad5c4fd4ac5704bde5a2a0ed77edb3cc47779770ff44ac4f7be53e739bd0799a420f46217d1e6a9fcf876111c796708b2a508b37088aaa3975ca087a05ae7c259fcec9d83c3153d1f8f5eea9f17a8d6412950c45c04e91c8738793e8e21832d7a2a2b52755452dd17b53b1520d6868a7119f94b56ec3bf9ec27754e1f8ec30ee56eca4bdc4009a60f05d3618ebec78d266e4da293bbec28b05999fa9cbc8abf8c2a95634d1996c1745d8654e0580d41d48765eef94679790861f22f428872c64180283038dc0c741573e28686907140df7d5e299e6c5b8a2ef05ac1ffd1950ec858bf4780ccca2bdf06b42c20c51df415976a08fdb1dedb0fd7d021e3e1c4b2dcc5d5b5d77a24e671260a4237b29981e0a5c43558a1b56e636f97ff5169966a2ef2282a1ee075b6e00431a936e130e9a820a8d9ae34191240e7102eb753c8263f83afcfe1624b4065d3cdebf60c476c1b852155f6f8fcc3b2bafc64d9382d1cbd11d6e59c36f1272adc52ce743aa3c3d9c96b99be2f071e2704b32291bd74a80c2ca9ea9a26e25475cd658f864678efffe1ff456d9276370dc58315333e6096c1f3ffc30a1c4159a64c8591a4b997c24c3a32ce7c1bdfe84eaec3a07d0b7b6fbb8e374864cb49bfc3ade10d9babc5fafe88279ba5ddb805325d88d7bda0e4f229cf694e2a2187f894df0fe1465bfa997d8e10c66a35ccac58dedf0d3a0010b24e6a2c12867e83edcad13cf7663ce119bb8d48c0c977e3319fce73a6d3fb6e9b10a7fd9893e3d5d236c9cb03b0b0ed3680404075212903fbb664189ab5b9d3c5489349dd64a81dba502dffb2f9ffe2e171b36f98eabe52934f7d58d4a893da075e9cfb61d7f80d53668f764bbdbb2a4b0822df2df6beb583810601d36bc0c180e3683e3cbee52cb4ded0e4587c4e86d9237709c9e2c93c93e133136c4e3188bf25b8665368e489bd87c0e407faf38ed0f8f526d25d073aee60fd01071defb843bc933eaa99d4c1a5bff5a650ec5143ecd050a360f9e75cddb7f711fbba8ffbd2df4e509f0d2614d0ef85602262ee633725de6d102101ef6d8080c0fcbea500ea1fee0f981b53ffd6f77b735b2a5522b212d201f8a7fbd79081ce748a4f95779db0aef77eedc3afe6fba12fe1a6414c2f0ee5133726827bd1dd2b788f759cddf5b215878a2cb3aad2d420a6574352d733d389c02d19788e4bb9958bde5cb86dfcad33c24d195d56728b15614ea4a4553e290606bc8f0103ff3eef8b7dabbf1cdeb0db1273f37de761261bd966393628017534dccc4f3204588bfbc37760dc4a263944fc2b35a787acc4f6c6e912c458a08ce238ca2e104b6f8d7e7d43dc03bf26e3ace8ea7170e18a55256cd694ab3f32a3d838351ec47add1443284f26f0f13656efdeb73ebb211cb726b28c5f1c6519193212b8dbc8042873525d136da06596a3f4cfed931766ee502e6a1968b5ad5fae3e23f41aa4eb59ddbdaf57b75606eac5d2d8cc14adc5be57b75738d49248e2e611e8e5d88034b2aff775df9f7d36f132dc2cd385089ac4e61c331d30d995144211ff08eb37b85f8aba618c6d3102971f07c0dda6646de24e3f92fa323a029611f0b4f9a5ccd6e14c1429e4e10948eeae99f1b40e460a17e29cad00a11d88f1a4fe7055e0131a7b2091cebd4d2cf1e0c08264fe128cfa2f95a2910b37d4ac2c86ea313e45e02bd49226c3ca7c0e8e3573b788deb087f94337b62c134b12a3291de3d35848974f950ec4d77822c8d0fbacfb3f814104fae5c3c46bdf0907617a07deb27bafb0cf0e82f2a103c0daa6897e9e017d988b103842dd3c258b4b5e7a99f77ce3da4985507132212e56558983ea53e23c52ddb4fb149daf24cdee054df3e3f3863e40450f2ff1d892306f934d98e029fa929fbc799010883e7f5968d932bae83613f008043a3abee220b67315e0bb8c6a89941de6d4b90e1664d88cbbf4c9a78eabe9ee1809fcd8b87cd61e8caa50b663e6b308921fe509f29bde6deeabf577cff906883ec57eddca4d29d5bc4ac010ac5ce2a14ece0fb834e5e18b7b26ac6bd475119cf9f0421625071817b146c5a0e751b952fac022192f78050370ea198513055291067c37b37dc3b51042815482f41dd007a5b7c80fff57c941e1d7b1f01f0b196257e536541f3a29a0723e718a19a188aabe6a20d630a466cac365d1f95be9484035d100b48b29e141afa16df78d8e3f0f1c9e534489be19d2ee6389811e86207e601fe5afa1824d730b7665c0ba55958d68f7af6a7eab9ed802cbc32163a2418fef7276d2eed8210729d0829d63b1e5a5222f55dd2b392a8da58b34754f3606cc2b723a5a3ece8f6389baf21c95d91d4743e1666643ccc15969fd5141714b30a9a73d647f7dd4b4b6ea2380b9b2a33cfe202e2ce94f615782dfe4f4a61c0868be12d6debaf37318f32d3c59812542576e32ce58b4aab773f2d24ea282acd03fed7e727bb407b2da611f8c1f59ab4ac8cb515a1cd96a39871e5bf0cd7237665f2b6e7e3a805839e3bbf2aac6808e8b0434eea516d7255366e13754cd3cb6439b6dd03a5d1f62aec269ac1cf670d4bfcbc297d4418e823e8d63f2a256a142a31c327f3e6ee40368f465e07255484f8068a1a46f5401c78a17b8a4c0c39402de3cbd71cb294f91c5a3d578fbed0207a363d35a8bf7fd5ebee5f7f3f5737adcd4c7d390e04a24b87137b36a74dd91ec62d197570a677cb4bf4b626056b51ac28632302761c27f6e8f4814ba7f88ff15fabd97bb8a4f9872cacc1e970f12b118f235aabd43fa8d5a5fcd509abb03d46c26b300ad24488c9291aa43a086e0180947840f0f5775e8c9b4e5af33e4897857875e22c35de80b0d249c0faa929f73ab4541fffa518549d436de8caf339b1f3a6456b35eb199cb6a05c82fa9e96b09a68f930e635e204ee9038e280094a783348feba6158fd8b41e3f8c66ea32e071e066c0b9d048caeccf5be097367484985fc5a843d5b0f001cec072df05745d47957a68a1121b0a7f94ff3d732f865b7789400641ff9a545f2cff2a750601a287c880f6b7276af38c4c7582acf5f41461df3fd5d2295e864e97a1533bd725654f94291737eeab7629ba4750f9118e8b131fd0682a253097fd78fe4267b9662cd7acbeebc82318abb7886688a835b18fc85b4ec91ab0207a4afa13f6ad192c09808fa5ceda217b17b0c8d5e7e20ccc7088ded78678f66300a2a982ea80f0534290694b16ca53e9b8e389480e7c2e2d733dc9e8a2378b7a3157a0bae8233885003ad7ebbd501fc96aa7cfdc08fe688c06dd261dac840704b43542b9e5389422846d5d27d1950c6a40e800f03b07900fd9c6564cd312480bc880d428ba8fe4812475a41c3f301b4af8f19ac43d371687a11cda8fdc87d4868f43c9991e94a9b53c51fd67b82d559c24451933eb22e9dede2e0946d9c61cebf2bfe09d94eee6f6e410c595d2e770fab529b2a2f9607b9b2280e320d7d6b5ca1cd6dcf9850aa300c5714f4dfcb6320332552bb45667b9aaad4118faad946cb3bfa1c3daee34b99756c7eb681d116e418fc697e0eda2d872b2962701caba7942467c097f3bba2068860181e3f935d04292c19816a4d46bb1dbeccede72b1b00474b1de160731dbb3029763efaf1dc8c5c6a2ea43e15118896686563705eb7c364d9d800912f1447dbe0a5ffd5fd92234eeb1e312132d7f1c7cbc80065252137e7f842598d870d800fe2c540285449058c09ed2f1b7f5171e8ad80d18000caf9840ed78eef4e07914efc0b3829fac53f21ce40d17bbd8c2ffc9ace978909d5dc244d55fe03bdc9e1844696b4f4d801ae426b0ce8a86ad3e16ad7fb324039be10bd8162d933b09ae8d9520be283a500dc9353fe8898b70bde56d449fc091389ae4cbe96d2c5ca8aa791f838d40dcce19b56ef6c92d88d79b0c9e7ae87de26d47cb540487b80ec513c7793d904038891068f0cf1698819376fa8b352ce56adbec09293568bdb4e099a58c716ae617b69c78c731a7038166a43fca05c2eaef19caa4c425053f957a47826175372a125220fdd58ab6f0d02b12da8b56926e04ec4a8edfe9fed0321aadbdd501a94019c2bb96fdea3ba2645d1197841b2add2fc5d5c837b3334714ebfdd60ea9b6d021fe7fd468cf58edd8c6ed1a90222c9874f3de69a26b74d322bbc8942abdd1fa622934526a0746b69b2483032bc7a789fb33bc94d826ae63769222b50a0a67be7f804ed819eb556fb35bd260cb2857a50cef32164bc6c414a78a1504bf3bd08059109cf57e9611f55934e1179387266f1ec47477506e326f7dab99261d568f659379fbee0cf38ae81c0cf988e250466cd033a70de8dcfbefa0c58c2ef707448cf1aef0b7be9415b08e1df101fcbe2b49d1ba5e1c22db2983ed9aae7a6502af143a479cad1c3221750fe03ebc24057c111f856b36dcc3b01f127bc283c69a54ea4b423767d06d7a535f4c51d648eaaf655343005c03e4713733f39715467c129436c627b526306527dc8d965421ee4921310441ebcf07dcee60d92a87e0f3c11f1d436681e176f8e81a56f78b20e07608a114653800c8241194c14217bedb270d0a85e61eb993a29576cf77cdaa2c79a4c9b5026e1172d0a30a9c57bd3236a770190846d0be519b60d058300a18481c07cc0d342691179e2ca010aead2ea8dabbb103a2a14b3fc8aea0f9944f75cc2bc48cecbcd0d254f89fd473f2f19ba1c40cd0e2d26a1b6d98fc92e3d585aab68d2b38ff988f7a16c9064f9bc968137ed1c73452c009a228b8ac0d224352ca052617734cd24c610cb1492250854adcf81469a4701f8d0d02efc3e944dff76e86efeedb3d8c8e9124b42fe6c81a946841abc3490341ba4ddebc39dde83466e3918398f393d66f256664bd89cb8b57eb423e425035bcbb8486a8715445c80fcd6c8dbd335465fd4530abb41f6105525ab9d83cfe30324fece74f59123eee3fef4f25fb25a9189124b55256fabe9365ef435e16b48bb78e1b75fa6a0ee1e4c383514446b4d72e95c2e36555a3cad7001210e4fe7a67c36cd58cde12a657b1402ead77dcc32db34c1dd34a3628c9b518e5c2695c437d9d3e60792960a7ed673411feaa3cd07209dde7e6c0156283eef6dda6bb9aad4c57dd05c1792c6b607825ab0b47e4a9e0c267748328477920056abde478941f12b0a8a38fe9bb5f695b84b82e80f24a74f13e96b1a8e0b255022170b2eafe70d3ce53f65c9afc4fb8348b90598a9617b66591634b525657e3e24b08710c06c5969bfc6ce0d24ade764b4c2d857ef0db3e50b5196f1c5f1a827ceb5c7cfbce58ab28d37ab1dc9ef3a0c8ecf252b806c684fd4f75b18279bf812e51e4350b4069c9e2ae22dd8f181cad06258a8c4543d88f35bcb540c95e13347d560a0ab67a5a1c135ccc23c490c7fa3c3e934020ab6b3652fb1c6b5c819c514b582ad5a66c4194ee2a5f4edde7d824fb48e8371ca629667b84219cc30b0fff6759aac367349d83ef960ab6865acb24a6a7cc7eca1e8452012f01dd20d2b467ad84f033c7881c262fbdf4e60c071c112a9962102c8002d3aee0bf2378ca56f129da8bbc9c049330010936b92dc63e9f5a21b998630eb5882e2b8bd01517c0daaea8af9aa2b2e54dfb53ad7852c95c3b32a3a46cfb7cae9fd5340afb0171f63ae53744da451796bc30f3aba41f2bb99bcca0099fad28ab7a813f54677c639b4bc962b5a9b77b24e0852a29e4a0b720a926bae75202b9f2a44d811e7c823b77d8219fab97015e10d8e549aec085aa7927df32b558c02fc4db9c5c7b81f5f3d9a29663c3cdaac81f0f1c167405ef2e8e2abba60a463ddf80d1337c55d133038429ab6217a81908f5b9b9b23517b964a37fe090ef1efec62ea9bf2a14fc7e18ef3165dedd63d3f1bb2c64b925b6bbf51fadd04de5836e74ceb5cd57e2cc8a741b6d6e24145e159d1a852235366816b938492f085d98bedfa8a955d58c7cd73d9ae548a7e5ce6d0c8b7291548280e3263408800231299049872da1e42116a7bfb7afe14097301e2d0926116728eef9db938d209d888921b8aaa12993f6570e728081aeb50bda2c6ffb5fe9e9d98e33bc7df9d952a43e140d6a3b06e76220b769733d9b81bc6c2c7b74e81c33fa1b31e0dede5df22b7c189e1848f704dc7051eb83334187b2112a43bc0628f802356719b0186d1caf84238b2af6cf719e61a27f640b3ecb06d33611f929f6145050c43ef8718cb099ee9ce4ce008bdfaeac68b59ebf36024393e5cf679ed5271f8d53539eb40c316ede5009962324cb1fd7a8beefc1ed507d97174cd7e7cc5a839f133dc90d0fb171a8200c3fb463651dd033dab012b34415ed13a3afcfc25ddaa462d1420c6a86410be35776359938bf3ba99cd195eaaef4709754cd6000c7f0e0ab62f49a92117f2ba9c603ea143f24ddf45069b263db0fdfa2f09697ecdcb2da448f9d53e0c029e068e539b8c2dfaf76d382f9ea8d95304f57c5f0171224e85262052032ea7c2f1a0083bc4822480eb55e2e09b504a5a8bff361e3378c38fe8c20151cc774a8af9558cfcde866f858e6459fd3608b1e13db70ad36cce5298769b27a8bbece2c99dc99f91089a506e36e42d6baa71d396735f3cb2abb0b3d6250b83c0528c2b412ba00be3c95ce0c83e50ef944f05dcb454bbf7c60ab8ecc2ae452d0beb89693385bda25e7f87e19a0cade78ebc2ccc1416076092a42edc1b52ad8f1bfeea5ffc8f91a245cfba7bc607184bdfee0033361d118fe7371b061395de9c712bcc649b4a95dbec8a29ed3339f83d5418484730916d243f7a3237476e588dc8a5f6c72e2d4aa88b29159d5fef08291ef07444d588221a63af7992fac83ca35409e09c5bc23a72ad641221eaaa098c90cf6383dd0219c6fa8a6efc24cead13fe4999642619c61f7858b484264fa17ae8da2ad05e86f1a50b537f1fc47ed14579342f1db00b1b85d2cb9cb5b53590a0878cd7423866961ad5b776c6828fb819d78f5a2ff62792a53e8ce6d2ecc94a3a1cfa635b8bf9a5a3fb9e61888299662ae648047151c46e303264c517b5447c3a095479edcb64c65b76cc7c5d98b6d191797d9e9605b5b4606f379761fc669ecb196aa76c9165a8e80e2c021b36605729d9243c2b6f0419fb9ee1a905cf82adee5bf298d297156f1e6d943dc70a3fc40c0e07c59e9a9866f6b3119c7549b05bfc0c1bd3e652f4751b8d56cdd52060976b4db19fa827e895efb7698ecabbd038c7456e29de81e1e061f65075f4c8244b8d4c004943b266402deab8b2921e55c63c5fd751782cd0201c78070b68a5ae6a2b21d9fcfe3ec6ed896f4f3386c4365fefde1b6de95fd9c185238b206ef6e10ea6dbeb4e1f9ec4686d6c5270dbcdef08ed73bd33053e2f84df5ce6bbe5d4678c07df817f9e0f9a9baf629483209dfda20577bc5192c09c89238e8c98437e22a4b46692f003028a86f8fbd06f251d6ffc0e9207daa01de51c1563843888744a73d8b61a505fc576d26265e4c5b5d232b2308676189173f20d26127276e98d40b9a3ede0050b2d7c381b7c157555bb16cb36a9498630a6aea33564bb99bee57596f0a92de5f3da3f8801801161375ac220c96acd41537540fc6397098681da7fc45d7b1cb940959f229320d70ac517ead4c59077e46e9abc8acb386008f2474e8adfc9162cce5f7375c3e001e84f69498b4c7b67b64e62996e033e9ab04d7b439a04e8ede2510431b08729ece639c07ec3c9e5d7dc4ec82668e08e1b7f5d6489bd065e8fba125f505301951b0a985c7f66cff44cb49c7b62346c0301fad1a61c6db6f5b09ef16ecabb60a83a24398412f43843ca833f1f363f847155d5daa59c17728f8146b315d12ca8c238eed165b0fb01141b9bd65f0e6730a32b3b6aef82aeb4be9f14b993e7041b327fe9f6142ac7fd3654c271005873a6a41d4a404bfbe05b77c3d94abb1003e7a9daa5f6e52bbdba3eadc26aaa4fa43be755a6634d5cbbc6bcc87668b4245d8076af5defee1593d2e71e0ae0b269b18ce6051a6758669b4eb5a6276d280d7f870245c3b185c92166d43d6f026050714332d109fac8ffd3ea3ca511740b6d1d0e4d47ca048761a79946aaf5177c8335c3a622133500d192f412973a8160e464548a00e3261c8ab390fb2474ea18dd716bd9b062261e7e8f6e99249642e9aa618289a3fd9f6d1b925067b0580ef27587ef3fb9f23db0bd91b3c166d1be5e962b9320261cdb07a8f9df29fc698078a46b9c200ad9cfa94077537d8b1aba332f3c361bd0f8fed83762cec4838dfb2d861f48f1dc41636994641975336f0a5e667964951c40aa070a4812bf1fdbb01d8d0b73b37c3886837a06522a61d8f396e4509eeb0d238bfacf05ee7afec6b713a22be268a8944d7f0f0a44e3480e922bc0dadf40caa44542c5a2759e4331a975ab10f9094f1b56bf23cbf8d15386ff9d0c5c47c6e0cae4ffe5046c4da0ed542ebd3f8869fc872b1b71a866add2f050d7eab7d293eca5a86b072db2db7283091c218eb969220fd5a3f3d18253a23c0852fba7520593d00fbb7b03a783bbfacfea0b50c41d4549a5c3582f0299f0d5bfd0f8724f06fee71eaacc90724271b09b482a3ac4ab3f14b5c4b356a0b87bb83c55bb812130ac77fff131eed246bbb5575c355c241787232eb2c85c09079d01d20f1dc3f04f58df90becabe2ae8e4dcbb450b3e207d64be969a4fd136a2f8a051240f38a6f65210a14e3ce9eb575fb0774b838a8341fe90959a29a80a892f5e86a819bcc41120162f2248a13da26ef90785f240bd398039063e7d748fd124885cd07ba3536280ba47baff810a84a828e146b5219bfd08dd867ac61d67a3a85ae181f3be78e15d4eb74737bf7f79c168cd836de2c8bfb2e21d4fcb049bfcc594607c425de3ac4bb1459e07dc1e28f1e02e547007825fa1328034e7c2e18d03be8b713b4f21a24cd132e14ed7cce02537fcfe7696eb7b95b8ae96c0b6a8e003c9948517fb617be3ea21f5678336078c62c68b460a88541e235890a90b7282ebeac89c44b700d3f1513da84e1c9b8fa5819f5e6dc916acca2723db81fb1557659c8ccbe2b9e35b997347c4b5dd168d0ef4113a60c1e1216114d7d60585ad20f651c76abaf908d6da96c20017f26f6702ae133d2cc70bc65c43bf1e65f697d2e916007cc0c68de275055c71b0b4a35dfd21fb7d64633a04db23f49d20bc194fa4f72c4a5e08be701d0f325a0b1340e3ace5c979606571cfe042cffa80ca1eb922d362d1b968f8750f1b95d200c45e9ddf396b9f5563d7b47a1f1fe7db27d31bb6f415b9de9f32950ff0b443e35bb8d974d1fbe2029657c4334db586e8c440021b1119a8c87a3430e6e8d05978a21ffbb56347c176834fb1eec0da0a6807743e814e575f3a1173d6e11409af62e7ed7d160ea76499b3849dd551ba9ebab0a1e4f7e89da279e443c112569c9ef0848e9b88ff4b72ffef58c9eebbf0073fa80e4f38892c6fddf1e9ed68a44ec631e06fbc12cc8106d7ce3c89172f5fc37e65608550fbee699a7e788cb95e0fae5c8a36ac4f47a6207fd557fdaf3cf465ddf79da157652a67562f66683668990200c75138a4a210e439aa8a249e804423807e69890ac91c33febcbb36a947dd85a2106f22361e9d93bdf7a259a9c8f9b4e0818e432ebf4ff1290b31e282237ccf5cb17f42b8cc57b9e2d73db46c8d8175dcac384283f3d841c802af8ab43051b9c9ffac2148e8da667ca6a2b10ba1ff67ee4062bfc5fa66ae5d7a542dc197bd3bac25055683d719bbec07689aaa7099c3c00558745e7c1cfa938e05ceba3d5ee9cf2e0b7048750045011b9133d8d63ab2fcc076c41fa26bce3caabfcb5949af058951d9ac53c22c838d68a4221c28b3180d38f1c8b46f3cd4d9f3eac2b941dc718d40916f8311380703518ed721c1f042d7d18268f6e2239166001ad003339fbea7c3fe9c9a203a50e3433c8fe633879918975a8cc8a5774411bd959f69d573b791a2360bdb8c1ec23f7d5e0427b7e6780199c81530dc8d21c12f14a024f03e220a49b4204c88012c48397306736c16394d090c096fc0d75f5f1347e128077abdc0002016900d5fd6ff70e360b6ffcc1f2bf3c03b6d5e1496cc58e8ad0d6e162847c1eb282b5909620187e6800a636038096b4d4cd9f097b8d2903e531bf674e9fb159e34b1b1050521639f9d50f083fa5128c1ea11cff78f022f2b9c6729a1732e93258cab6f88502f6d7a222ca9ff41cb81703726a7f250193ce455ca70f3f918388562e19ae35e374d6aebd4763d226caa9bb28915577eafecde1ba5f28b47caeff0fa4ac42608066a6ecf646ea4231001d0386743d6462769f81f71967deba1117282c90958d42bc335215a451f3fda094e5c6a927a10c10312188944cf17a4706c05ed4e344c37d3f3e0b50e6f3abf3138f3b5e2401c84e10de31f09754988793241dbc580e656837604d156e3d5abd96dbd549e9d31c04b4ec33de7418904545294910ed2f60c70d3aaf74325f38e853b9a4beb41ee442ba49525fee31c2d4e4f2acd9913a7d584a13e6d793818b80202ed4571a626e7bc3e4e9fdcd3f44521049f63bad551b6c733f37545abb4dc07668a2f51e99f35d4338de4638588c64d0a17619c96f6920884441bf7d563c744681108fa96223862ae7bdc4dbf46eb1c4adaa31a40ec489ebed66921e3d51de1a31dc6d9aab594dcf94eedee1ec71ca4196edc8a7674ec33129bd56a616339bb502113e16c4e888b5ea4aba1c5520051dba1b438f691deacf598c3c9151c28df5961fb637feea239dd576582a441787b5f364c864fca9c4aa1679fef747ae3f488fc032921a30be9ec244585a2564eb7065fc6150d1b621b4026013e5abf5d057b53190f08bf10723373487a637355cecb13dfb6e29313157f248c62d3dc2308daf3f254f06f3f70238e671e7d9440d80e6a8da5ab67db447d51c519121fa412fa23d011afff5f8c5c0be0fab2b2da751d0d16adaa32cad97e7b753a7ba0111ce340114b38145c66af14b10f34d600a5782e15790f72b7abe4b214d040f843e9472679fdc9df40679c7da2177a6b9cbd087dac25433e9e7e549df68eda3221fea3f30d081914b7c9a204986c846db6ee2941661e60874f8b752afa147b6440c53965c1aa75d3dd457c9afd7dc687829e85c384efce6a6b0988789320372eddad3e957c20b7c03ea4e777219d0b636442f2477f060dd6385946d2df75bb47cf4f7afaeecf1e57b74ed179e9aa025a29e435fe1e7f7b7c3e8aad1e88c6d608bbb49bf0c07457f9820d8c9efde01ef6e8e72a8441f6f4b98e02c9a527ba270bb0f922788b11bfdf93fae5645dac0a6352bf39ef36729244a0245acf3ebedaa4089bef9a624ab56d18f03e602f773d8e6280ba3635f55db76e6a00fe2bf95e564bd954f1403dd3be0cd9ec81f185298d9ca704de1ea97f7694a973b1f5899bd67f12efe210fdc0a670cd4689cd43ed8e56383b01b84074205f22f47b8933f5954018ac8d98e61c6573372978f177938c1e446a80284e0c28d23103adfaff4b27d24329d1d685ad791b957dbfb0fdce9d208adeb927d9874aef367c0004c13ae0a86fc3fa18497c5fd8ef2d92efc176feb21ddddb02510e9888070ae8a517ddbc7742bee4b3a1a03a03caffdea17fb3c886de783adbd0750e388d207babb1e7de82bd80ce0bed9e949fae977dabbfe6614a4e881d0a51289672a5ead9a75dd32238660e11b59c81e48df6a45407582d593f8b3f34f79fe26aa040c5ce6849287c31384326c94edbb2744472929b3412b4b084b996b987afcb18c24b8ae4e0550b5c0eda1110111a011ea270c18852e70fbc38b29722e43fb0db79bd7736b1f0fc519e3ce6da2acb6f297bf610f9a7bdc60bc318ca762af290043af03e799962b1018f497b132476b87515dbebb7eb14cb1c28e587c58cbce3d33d66e9c90ed6b768795c83542308246582d4333971824364a40ec7c3990e73bc0b9f5d4ae59145dec0809fadc3e0160475703aeca8a9088530bb7c95d4aff4b6ed6c9d421240b7b815248c823f03397c85e2a41c29a94eb3eae0232027c3d82c9265dc480afa612fd78159eff068e81da3acd5a3aecc341431e9d86a610f2bb8e056707cb3b9f044aea4178e78bc7f0d062b51a77b41e6932f133d11075b4861ec78b9c2ed8994e2921597a07a488468ce35fa15ee4a5115a5197f62a66329a7aed8962d0e4fca1e4e3e7f92286fb70cc29f96fe414f43975e9f1379323f2cdabd545c5e6b6391afd1f2b30ea39c5affb62ee9f89ef15277f7dfa2ad35921f0b3d2b7b87df6922f8dc7c4524ed7bf955a554bd5ab27b7e761078daed1dc56bff2b50643c44ee6a54dfb705469fcc90078438e330365e89996268fa47d9792841c7b09f9df2ec14074af02cb26b708c85943cd94364167e06231e4ba6c31e46213787ccb67e6fe47cc5e3b6bdae95d6741660898ca966bfdc8b434b673385ee702dc321c93e04563cf5cf29e95e190411f7f1519b0a3ce6339759d0753b56028f702dd83be8c7db0893ab19dd503967060607b7425838271edb2cd2dc74dc530760483186771ffd0c9bec7bb086c4f420bed030b5424c1f781f3f9582156f54cd54a8eea0371bf2a39fbb647a9be623314c706390d2f1cf636b883c543c08ac7ba16aa77ad9a4667b93cbd15769a0cea2c7e92d600cce287f8b73c11497ae1f04b54a482e9a7573cf022c468a2a8b5b02a714cff14ac4c7bbf127c0fcfd47f23f367226806faaf7682b73b178e13429154edb5e544c88fe63f4305ff4baf5e7b95d0e53c4885053be32053ae00db3f4f052d4a30b05486a1dba7c1ae2aab3bf215078dc9a632442f09d8b08e9b7f5106eb72db85f72d7c493624505abd09c32e6cd49689cd0273510ff736057bb1d80471be62c7fc1507c11ffe57ee1147eb8d3e2cc2dfb8a3b6006d9fdf8bf67270535d3ea01fbc055c7c3640ffdce3a9cf878b0b057517d7fa73ce7f752a731676979663b6321f93e6c32cb615ef3c3b2892e16a83b1dc250f8902d28ff9163647a1b2531d843be84368ddd9ae942aa1e1a912462172cca85e91c173703a90ac2d0a65266a1828639a47313bc239eabe79412b44e96743a004299cc418c7a733d5c1d5940475d0898c96274632f5811cdcefdf03ec5b1b852b89a350eee2b0eba0ba749e872bcee48b8991781ed4cc5cdc4c5c7942ff8429f3cb818307b3e9e359cd3dadcc8dbcb3e0de0dc05b0bb814d065ceda06f2d07149510131107202279bdc7e3bd2677d51211f5865da3c003ba4948e5160db9404d879ef3d19f6b420c1613f10a2dd068d0424b18b7dcc36535aebf215aba4ec8246fb4c833dce17c83a06d4a1d00960bb1c51af5d1c57e5fe237a8d665197b2e42c956f8a1b262871ca2e791d1a93918ac3450284f2b143197a36e303a9bf624a6d445384457a4cd8bcbecc86e83af04a31bc05723f1e6cc7728360f2905e2586fe02952dc6489e33859abb869df56b6d6a46ed518a7bc9d221e58ee918444c0168e74ba8ea96415cd1390a56837a2b41a6a975af0c830bfca70a4f25c644a5c83016fc3b945f40b67c40d4328fba9aa4e6b26acfb27bc3c9ebcd8efa820d133cfb260101ea5b83ae634200bec90366eab172bb63cf01838b26d2004aee5829c1fcc1269863bf9ac7836d1f74f9e9ec631a9513d2012752c610043966be300618ed5aaae82b05e2ab33c1e0297fec247169bce5b62ffac3614721f4818abd7943eb6e6064fe2eddaf09c2f31572e26ae93bb008b7ae3518346548de1db3676bacd119f3c2d2c9d35e3794bc0d95d788b785627f69534b48c82b073d39ec9621821f0221cfb998d3fd1329e0586fa1909553da42c83af706365a35db5cffaad4e830bb5c71f77ce9920a4c7029a406f6bc022fd1a3faf7784e6987b8927d4e5e382254cb38320fc2b8f2a7491b29a5f33eca1e84fc073936b6b53356a808934396c738ba00034b8786e6a8868512d614efe9b33c8682ae3e56efc4832a1b4cdc178b0f865e3eba0e0721ce80209ee56f076ea7b622c39981a0243e5cd7e378d8832637f13891a76ab7fe9d8a5774e5bae530dc96bb60eb81ca340177e51a562a3657b6d51286eaf050dffa9845889ec3a9bed78fae9c0dca40e52b31e04cd752aa97c6779f0990afc40e679fa3d10ede239c3203bf17464b0366172fcc7647c72ac7097f79a822194c0e52fec351e9664096ab892be59ef697786a5d9e1d91c768037d13b4a289767bd53f241c499a13f13baed4b7a09f44ae5b8f2d4c74f1e259f9fcfb987e33772e1f0424e9d0470486df547e10617e8a08f1fdc641a83eb4aedbff2a2f9f4aadf9f6d1503719b862958c42b4f1218674b47929b136aaf84cff9de88cd10954e2ef9481715f941bc38a8db262635971e359a3b1acdd6856d148d63696151bcdaa1bc39a8d67e546b0cac659531b07b152091549c06cac0213b78e07aef383d4f5e0753e409d1e5cd783d6f9c07572d0ba1fbc0e7cc05be707af7bf8ecd479e30e1231514c69cada36dbfd902c8f19a6143d8bea66a014fd10a01debdd63e222e0f2b33930c137ba7be763440d00c7b83d756c89cc02a6060450c696804245d50ea43794cf10b03db03f21ea3c7a1b122e464cadf9ff1400fdbcdf1c9e4f7f043b4da142a898c56af9454af79d857782f7636e58b4c8b5d41536c325002a5be2f4f864bfccf4ca293b152b5c1a72cc1344e64996d167ff1cd4d774134e2176a01ea4f9f678f3e5ccbd83e3343782d9f1c87dd193828aca06ad874e712f65d9629f929ca9d8fbb16ef6b4d4cf2b12e84e91ba20281cc94adfe7db2bbd21509e6e482e004853fbe03f5a0e422173e95133eaca3d979fa0336f0477d478651a9a9011f48aa8b053e1a00a1cb6cade011b03225cee9cc0227675e31d3e16e0fa102c2568f577d0a1613cc4643c24d0417a7e0b52f1d038a361f0722c10271326eebcde6236144bd1f5518c3dea46eedc3869e90942de91ca9bc2ed7ff2428c6e79380a3b1abfeae5dc9a358887f90cb10188e164e4148d8b97594a01b85f6815e2a483f19577335e4d91bf6f784e9e0ed0d97dad7bcd7f0ea53afb6be6717f8e79b6e86161245a8be2811a339dfcac83db3d8e4720baff9e0d5936b79c75713ce2c68b5ef389cfe8fd9d683dc112fbfeb2fa5415c74e265e4e9fee8663093eb4b48bd4f681800a6d6191d17351c52af7ffc8d2164001a9c4b20d9be4781ccfcb0a8ef2a54725d3b9e00568bc4a818cd38dd5005abf2ddc3ea2b79378aa0f48424ad9e0e7a09c8064d2a20c111afa95d31ba7113aaccc9067e6c8549d640dd307d79c53727e6e1ba9b854a3204901ec76db04eee47e17540c092c4eb500ad60e228b8a0c6d5c8c0ee9b59526b2128e1c33253624181c06b51f0a09fad74efdba1c2121eea0239cc40e9130028bedc45ec61d975ec288fd0e7d2eb5af9274a0d6f91227d9b1ccab9d0154845b639b524ee5b5a91b2eaedfba29c82af83a616b9d31e6d8efc9dfa4d2513e8ded4da8b17248e2e08687ba6189f3a96ad847a26de7f3659b89c77fb972868e1fb547e080edb9c42edbbec1f422f7d46eab45d1ab5713b516ad95a22875906ee8c2857806c4ee33823fefcd92df0cb8658ebd950de6b58be2a1cf4fe9aa827f06622307924c1bb4b1b3b59e7b8d5ddfec7322387820884cfd860174813567db4bd4027a91a49a7801504782f37806426f0e19f74a4f59c2004627c1df0ee635b2fa6b20f3a82dd761ebad1272e58cb1d82f7965c320a0306b3d767ece37077d5cbba293078d32f357f0eb0b78ed9cdcd921b5346ed56fbc43e18918e8c772875ac17d3b30658a5c90c0621b22d2e4ae82b8648c146bcf836673f5eea9ba5896051416d84268f7c3a5f941d615f3107d763a26d914c1b6f04e59fd8b3e88967ad9f94fd6f455cb8b571ef473f5ac9a1e44b760e4f1ff15ad2ade6ee0104a53a98af813119d4aac13624fd6a466195bf6505f6941f25d7730bcc2e08bd0c15343665c2fb2fbcefedeb848994b6b0a927819873583a27c61a18cf353aadd06d2426825469a1b4c5fa3851e66d82aaa6783efd75b88738e2ca7156e209f8d75355572d5a65dcc617122f112493ed94f263033ca4e908ae38046c3d8f2bcce0ff1ae2c1b26db62f4db4e2dfe08cfde841dfd2ded1a96b6c15ba2ddd00ec5f49d6ae60496bb8b36806469ed07a2391d2d692bf3bafe08aaa1b2a5053eddd499dcdc9b323ce93997db5123135a8bde95285883f3e3d0c5ed3856a52fb79ef0cdd06914d52fc9c1c00bfc16a9e9248b2ee7f85ef7a1c1775a02010043139f828239b722178474a97876c431302dd573bc85f357eedbe6d71a89c2d07ff155c62688582d18cd591e351b3faa04b17b142f16ade4a93bc6c1f01c2b542baa8d92b59e11a88d34d0b6f47a7665e9174f7bce57e62ef90f7c939f2a87266f01b400788defaffd5aa46631ef391bcfa234ed8179a9a4b8a74d19bfbfb87a122abee14fc047e65700e2a3c0c3c3185edcbe20c65318278bc1b90824ab1de9a32e1f805afb2c00c0a156c5fed2dc98601534e145903518c896071d02e65a9f7e9453e39d1914a78d11dc2ff8390272e0225a32f75dfc239f938ca5ca29e568e99ab18a301071436ed07f672e29ea893fc1aa78368964a99b69a4820fa1ecd2b5e983c4b1685dce83d01b301c3a146ba672a763dcaacc96bc7be4ee0d54dbb35bb0c4a23f5be655dbc8e61ab15f9cce82e750673df208d78ac87fe3a149802951309f5e7b247ac1eae45d263e8905bba61a51ab771d43c2d23ffc00bb0a4fe9a8b39083b31dae12da68c408b61a00328687fa847cd8afb8eacd465fbf054acb2c674c2c244ad50b4af5afc9c1f666eb836545297a7060bfa7da8bb58300e76e4d31e5224361e4b5e45ea3b3ea172586f46a95901462ee15ba77bbcaa867aebb39b656523f6ddeaa9b6a9dcff8c12433380fa617996c1774ee499986c7e6b141e37f1d095f2e102cbdc4b06b655d5e03de7990250d3f478879ed20eaf74d9285be921c1f3472befd87120eb9a968e5c6c3bb772ec329a369376795351a89aa0d294f16eebf4bb50418448a7156dc385a5d5f5f8abdbea74f13ab2681ad49d4a7bb4d4d406c0f2fc3f0993b498cefd1991b1f75c0858f96c2e49d0124aa0e2ddbfd5b0c5995db19e23d02a222db6978cd045304c266c623fb5e4311df671f70dbacc03fa16ba58007701f6374fce0ca1d8772065779e287442a30ee2bad4e088c503d85d2a4e71d2d666d170dfeaa851a38188c399344ff04fc168f902e9bb9237e159d3b48b5c5f609f147826967f05526b550f06d5c2cdb200126a350ea6b54c84bb185876399602e85fe9a3124f04dedc454e2e8ffdac819505c6d02ac0949ef4f739ddc36733a6f7520846d4dd4aa8e618977a2343b2253d0f7e617bddc79f12b0404b6f6ff839bfcb00498ba49afc0b3f7c4001da0e7556418c0bb4d5cb3771c88573a6a4c8457abfeccec09215eea152c4831c1a024f20897660fad3ea0d2f678e9dd897f73fe8ce398babf8a87a00650a148de1e07dd59ca1433c15ce95cc18e65dd55a26f0776e51225ab8584abf80752f44ee6e67c046a10e37360e196fede0fe1038b5d2b6d1243d8a5a6a5b8168deeb0204172cd553ff26861d5187dd0b1848a192f7efc1e73453ba348e7f788f76449696fba56f674bf9d59818f58251325a4c5f10aa2812544c2fc806a14b370b9c446abf86adc2c98dd83ece888a78a8ec7407895cdd33d8cea1b9cae92e7f9f4e8fec81232064bb7ad8c37f6258d6dfd0a760ea4f4a695d734fb841b760789b1ad3c8e7934e5b36cca5bdd53dfacd927a3abad36fd7122722d0c614e4d282b711281a1ea444275157265c6b7714f6276876c5d34c8ff3ee5243f800eef3a1132cd46067b39caffaea48409536fdf4b09acc148472185d6ce77904be2a7f25e24f500527b43beb0f0efa1a4bfacc3c92bfc63a8b3f9c06759b2fca2297b65984dfd4ea47c62db8a08395a99193686375e2f4ab81257828e1069e95f4fa12261ae6dfe55896bf1c4321eb401a6945c98e234b312fddbc527e367ec353fa9facefaa4af46d8d4eb4376dcb97dbb74f90efdac7656938555eb49b47ee78eb81456501ca11d6df07c29f19acf71c75d9868d3f6a346642aee4d1701963eefec5ca446370d11d7eccdc098220779e359418cde4527a0115c1b0b9d3d22800da87bca60184d04a21ca40015b01a21813115420377200e3284805600befbbf0506e61c9408ecac7873d75c36d222463fed21a0935694e159c31293b6adac5e28375b6e8d8f8ddfdd317467251da698b8429c019584e7e1e3c7b62b590d1ef9396658ea5ce3080697b2d0352da18366454938e8e7b6967489d75e70628bf7e02cc134956693a4e575156549ba2d2607108bb34fe78186fe4723941d11132a799e7b6a6e3042dbd6070a80ee9d048e7ddaf19ac4bccc37984909e4801772b7cd1491def5bbbe905e4424bd8e6bcc19a2d7e7cedb793d75efdf173b0b17ab4944fd7cd7143fb786b67a3d1cf298177c0cb21e82c95fd0ed039786c5240eb9f2b504e5262eac612f9872fd781eab41004a72efe87ea9dd45fdc17085569afdae8fa4fdd1cecb5e8685b544831171aa89cdfe478ecf517f6e464fde1987cb019fa3ef4e83f6a9909f7f879723085aea16a374a2f0ffac47c5980711b12f8676fea2e752ae33252f626df3419e7e358a62054335d447329bc43860836af0f8b7154d2c5dc0ad05d2af46092d0959208cdb6d5bd24554fb94bc2a9dc4960d70bdd673d6e03d6d1d4964735fec078158822b7cfe44e99ff5e8249854b11a047c18971a49cce6b061069b02de621dd49060e9d8ef2749dfbc1a3d10ae775dc7d9ace45612950fff995d29b26de8c6bf1196d4bb52e9126201d4878155131f45d15c2d58207387d6fa28ab1772a5aed866f4bb46bc1f16894589191d423379b27b37a5ab4f389a49a72f728264c92eefd8c04afa85e8d1ceca4eebd7a1664b48ba68ae99cf01ad4b861cc533b83bf6d4d679bf2e113030fb2be0079832fcd115a8324bd1a7fc6a9b45723520371f3595b21c95c067040465a69e7387bf96265d710d6cdb4e089e35add86284b09d46b6f3a5d4f7c7aca86ec6913dac00b17b00975ad8b34c07a2deba83bd630542f280b22d768e9fcf7c2a4a3a8b86da35da3e3836a0b71281fb687de0e6abb54440b77b599e58f4eb163433985b5543dc9dd784d428a667a5787a3f0a11c931011e137c607dc3fa9f04ad95f6279ba63957cd576add37bb27cc52c0c127e25f7ad67ea4db2bd43fa52ac3582e159d726c0d432201ddee8e36eee44a53ffac797a95d683a9b42488f2c1896a773af7aed21c287b678045a99f16f724b3dcbbed1ea075726b40069a31a8bccf178e12cdb11dc3aa47f494ec00015095e3b0c586b79c46f0ad7ce1dc362f518d8ec4c628270417c565b6d3f996acb7fbfad6f81739681280f7d3f2e1ab93fad83c74e070dc4e099c6db654e9a0f7811ffbac96e853990481c833092b788cc624b0ecc0557a529b771573f664216a4462a5af7e7fe9f904ea42112e75f4fbab958a2439ae0b624141d1eb5a4e5cee7a38934fc4b9483c8a1adbe2bb51933a21adc42b1b0245cb42825fb5c6000574f7d0f86d41695d05aec3f6308fbd3b3de47f17e23446f2914cb83c462437a373c8522be3422a96532bb254e3fb80dc74cfa5f5af7075db85e8868f85b72e5a9c114e8bcc5af3d9680992312a0cb90fef5e29c0faa58fc72c973c56e8e24169171399cee3359587e7ca71a225d0932131587174f4419ad995d433e24abb8b156eeb38de9515448ca6a820aa9beca337b53cd666b6503e5b01b08925dae3d91ed9f878895ec6097885c2e795acb11913d93a80ad2ac4e2fa2a3ca209197db4887a4909664feddd79f97454ed22c4a02d9ce0181c4d466acb828b794773819e80f5837f6fb957202ab6410559a32a97643e40b927981b7578af8f4799f19178353ed0a3b41067743e46ce76ce3befb6bee86c7d80f32595c76e7ea33d4ec87d8b19c6fa9b1a2d3f69858db9490e2400ccb71d7fa66cff7c1e669711abb1bdfde74c14fac9d04a126caf9bb5ab5a84110d5ae16007d46b15fcdb46c0046a1cd50048dbed5effe502b5858fce71fb8d55686e6e59ae21f0477f687e6f33a4df7e6805a1e4176049bc7f297544ea8aa4915b5a6730e8b2c3b2d200ff0b2054baa6d26cb46cf87ddae15aaab8cadd5c1e2d835adc7c0fcd81e42a6a72698d10d889395e4d6deba38a0bc77ff9442122033e0e247bfdb225b825f2e1891dc57b958e57a83b61083da7d1829d235e5983cdb253ae86b32bc4998c9b00a664e471163d80cd352c8066528ff34c1943a4a07322bc8176b3a9946988d3f494fe5769b9d97ebb447a4b5f60ca80073ddb6e324b8fc73c959131f1b5823bfbb85c27c4ec7a25e4f846b7e09afc532386c77ef36a5ec108e9a999c0c768acb0b653be3451f989dc2b83e0dff812bb86fcdd4050be19bf70b5ea9553e10b134f642f1b6ef2fc1ef0aae8dd16782ccec29588fb37b4fcc3c58b6ca06a948dcd88198ded0ad67cb45410e06554f9856e51880f1911bf3abe0c4c27663c7f8480754587990f23e01ff25920c8996177d652a2b8900a8c28d61f7ec89caadbd843d1ba7792b878a7dd119ecf37845ec9267988c0f3947af2ff6e118355ec3aa62bf6878c5bb41015b3491e361c151fe2bd4ba6162b93872f4cbacc439507509a418f1fd05a9aa2e77d5fecab00554874638061349471f2a0b9bf4058dadf5fdc8aa236e62641a90c2e5ee315c377f9f52d83811a97721bda5ea6a326d397cdbd17be3a81e4371ab8e59dcadbbc9ac94da1c50e4b605d5431338ce34ed9aefe851cf15f8e029c702dc1ba355f5deb0068dba91eb2c3054b42ded2ac2ba15bdb3baa42259ee1cc50844f020022deb1c72c3e7233dae06c19eb4dc0623c3b9fc9b05e6c4cb1f4cdaa33bfd033fd46904275c5bb873064f6cee7a422bc8569699f39adb506341c6f0fee328f35d9a966e9320e4ecdecb3045ad2ae246714b103951e55031a610bd89be241bd8921cec4307d29da4e6e03e89087a28d7af8a104ec1c0795db59ed657c459ad73a005ef9759977a213b95ccf20959895148d969c988825a75e0da30e990573797d1a16adbc6372ba1ea149dd10078a1cf817db91b32639e9b7e4e0d3d8080818c1dc44ac37572aa5308ebbbb9f804c85136290c71bbb7c17123bd4e8c8922294f4a664ab15241ca9dbc1fb0e06850c7d4208f48d1b3b3baef8bc2a6cab91ee60a7a8e9424968532d1af40e6c872afcc7ab75fc08e27784f13dd4f729502566a138a723137cf026ccf275cbd4c05bd7f5ec14e24ea7fc0679e5acaa1d7b01a783325b9b1c5cdc12e30045a1c4a8b5328376b252d93c700544bf93c224d4a29661e074e05b80c997ccc3f869b27287a575ff300205abf720dda05442179b15cc62f4c1e7099b664b095743ac5d4e0953298ff7526950c1a3c728750fb93a77abf94e66defd6d214ae0bdb7a0fd7085bfb850bee5407f3c9dc1a973cd8a0607edc5e042939c59c49009bd84e2e5886427c7b26864e1e51e53b7a2be111be3855370a067c22f7a65af10c5c7307db899944755676ea0fc52a3511c8c302bf6c2342369bef5b265b11fec35b850233673cd70a0491b91a777a3ef3d634db61532158695964da4958c9b01b66e08b0dd44eb26c744535939c9865445c80b2f6421efe5d75299afd016c8bc60aa1783bfc0a356ac17477b2a85da4622d3cbbd496feb5089a7ec7b81db171f97277dc24ba4fd3fc464d603c1f49ec032d08e742accd7542671d5914c163af8208d1aabc614d264623ee8ca4c44359921a77f9ba92928d607815b8c6461f983db426d1d0616b5b333ae1dcd392977ecf181d5258d5550d4b6b39bfdf14596b19bb7b6d77283fcae385eb5f1e2363cd66987f2774e6a3daa64230328d1a8ad6a8accc6095110dc05d4a52b4cf7d8d6aa7e849c51ba043e0a823f57295f66caf769555c3e24df49850f388912941b94648012d5be687e576d3f5bb586c56654f748b48b26195e3f52f18088fb0beb82affb87d7aa0df53fa49ca086edaa16b4614b543d3d6652bfec05f654725d0b9124c03d278efbee4e6ecb80875e511a58ecdfd7128ce61744963c6e8f07ac783cea320dadf749066dbcc391fac9a9bdb651ff26838c9747b7cd4876ee717610ee7865ffb4f6cc853bbb5f6db5fc7f0b89d4af15500f2db06518de6939a10af925da60cd3b235f128bd1aab5e070d1b7643cc7e2b885be673d3c39ef359c6bac70c3104a3b5f03f3121537c78fd7a8aa6a4cb3fa77af704301b0c87f2fa5224f87711772e62e2e9747e52b7edbed1d8849e03facdde91592090ba9216032cb8aa12f76621d24bcbe42f40247e91562ede15ca60e0e73cf36e34eeec7d0b972db486382914e00c06b540a96a4a1a15754213f8e9aeafbf78ae17fca807ffbad584ce691ddd116db74608a126b4b2bb7b07280925093009878f64c89faf29e986c70870a36f874d293c75f83515bdc9e1e9000e7f0570780e85c363130e2fc4e4f0480270f82543874761c9e189821c8270d8a1cf811c5e861f87aff201d209494a9492f0806489c861cf7d1c7af097971e58f038fcfce8613db487df083f720880f31c3ea6913f5fbe3efc76aee3d0bbcee12597095485c69c1c5ecbd20978890471e4a60568a5c75a784e6e5280bec94d50b4d2634f7e23372140b372d301b4d2632a7c959b0aa0b9dc64a4951e23facd4d457a2be0262ce040501e04010f3ac08914e0468c7e24173d96b50d4977412731403bb9f4177b082edc85ddc48501e80fc8052231fd0de0db85105cb811222e0429e0420b88b5a0939c72dc8fc845d82100fdedc75010daa1a9e0a024a7adbf1d990206a03f146e08f73bbef7d69f0917da424f7242417fae8b1082fe727e11427892d30efded0bc004fd091d85c75c3872895c2341416e420b408f692a5c0b26c472dc480b381ed482b621c9e94f720aa23f13de447fb10fe024402181059d9400edd4d2dffd072c18394c53b92c10799213131602a03f120ec402d01116989c080b1f0480c883b0a0bf20076ae1421040c2139de484a33fd881682af73bf2c308d049582204c87fe0273f9ee404a43f58d6c2d07f682a9789fe7edc25b0030101e92fe84234150e48c8939c86f4d7fa124d05ffd0df8d7fa0a9e01f1f007d48c8979c04168280e80ff600682af7c87d0284c89320fa0b3a094f8290f0242798fe700ee4c9cd8d3c810179921311fd053913fd91f0007cc80186aca0930ca09db0feeec7e33e3495bbc29127399db082fe863c4853e1562012e463051efae37e64051e4a8e9cc80afa23f2a027ff29c010157492938dfe4ef85ed74712fd057d08921f1f9a0a7ee9cfc77b682af8f524a720fd21c99ef4d0542ea7bf1e370992070505fd04fde027e9a1bfd579f4e0f1242724fa0b7a929f23f990158c9c707d5c252a10d19f910f5181c89027399da03f9b2b51c187fe587fa9e0e3f524a723fa23f213f437e44a5e82510929e8240268274d7ff73a9acadd4d295c9e148ca460444b21058d3ba2a96429e8efc88da8f022994ab69b8a4a20d29fbe0e4de5f2e828c11629c2a3a960ad3f9eebd054b036a2bf9aa97075ae692ad7d61bd1543823468a1829f224271d3afabbb73a749ee454f567e4b5c8ed4bd054b2dd9402bd3c97a3c21dd11f7d099a0a77a4842739a9f4a73a47c4a33fee5a53c1db8624271efd24a7a9bf239ffa2be1f442b3c90004800293000c2d394149122426e4111ecb247c67a00b65213f9247780999841bc9402f92859c481ee14332095af2205ff0411948c3ff64215a02215ff041f2085a2ac917bc0879e72164efb00c0290ec13634efe23effc83ecdd47ee79650f64ccc97be49df3c8de79320074ce5566cc894e72ba863bb47422efe826a2eb648f4877398ebcdd9553cfc9d97172f7d46fe48c95b7e39cfa2a6757e50ecba6a5969466cab4dc225fd066bb021ab648b36bce48a0c4022936cd330b0d5034d833db1d408006061269861b2b0390fa059b1095741312923f14683bec0bbab7d6c3251f30952f68067fd08c9671eade9b5f73f6744d3f037fd04c14970b6321f9032bb53686242fc8577dde00a65f50845d1152cceaba6378010afc052dc52520848290148989813c3546f8bdb0a504a955fe1092af0d52f943deec801ffb87760ff5845b9b457bcacc9eca1e94e5a0fa2053b21d81b9a98439828881bfd4a68f6bb6fc96af6ce71e10d1ec18e26e9ac0b65dca6ddb9036ddb659bfd42715e035e814358928d6180a5f767d9124b33f986606f8bb512aa828a5690618459f484a67a500d296b3d62921851b9452eb5c00471d0586cfb2419ecf428966d494d97996edc44bc9a4e4de235fe9710f7a1ceeec42d2831ee7b81e3d1ef34e8f2cdbe9d123fb0ef723eea8c175e7316731c6b8f3e57ce736eeec1c764a72ce390046edcf4a972d25e731ea2931c61863ddf9dc3bfaab42b9d89d9093f3c5ed8212235f59b7f32c6f3b99ae54c897dca94b70c8ce65a6eb17f9c2227f2a14cf79e83800bcebe438941cbeea3bba3e411f8946be7ee0b2736c789e9d9d9d9d9d9d9dd73452e0fdd5331b03816f7cdffa3bfeb9f60ede3bf9dfdd3bfad3baaa4103f757d15435f2e78cfc992ad04e908a334e789eebb8771c5dec7b2ef00936fa3b9975a83594af9defe84a867cc119a94a3fc121fa3baf3c348ffe5c00d03af487f74a477f7773ab1c38f42757aae3ad755dca75eb82bf8894f445fe7c53693fc91ff8e40509b67c85923fdff2144afee0b83c15237f762e4fa326508fcb53a50924cbdcdcb8f987f78d9b9bdfc854e97a87fe5cad7f5309c7639764e7b0a34ad04747850257285d01b0843f59e6c975f91e19caec3b5996c1b98efe2ece3dfd619ce728f345de8bb1cbf5bf5e30d817b423ec7068fde5dcba32dc391fc5c91fbd915a608837b2120c9407d7a78f93576518625797b8fdd5a5a56f9a994a53c96acda30bfea81255923f4b6ab63c851b045ac86c18bb376960798bc42375aec02f36ba2ecd6a96d5d71398db10ca026178d8c00221d8df6f012b78883ca899b7c0123d7c07353c3019ac70c8384f63e424a464245314d04d0c7e8b2d180c16020c0683c160416021c0603098bc71ef4ddd7befbd5ca4f04e209b9818f8a548908bb1fcf9512395d3470a31126675030c03fd91baf7a6eebdf75eeea6eebdf7b2388ec25b44ead01d1e3e71fe7407f2f011a2037de25d96c3ab584b1583e7689c18771004304c1783d3255f31062790168313281583f7d4c01d776f90345832cd73624ccdb4ffba344e182c082c04181c026130d85dd96b56579140aceaa81d63d448afb592dea803d35257e75e1daf6b5ecccad5f8aaf47256522ee3a0bea01fb0204499e783abf38ce7d2ecf5c5f3ea51af65b97368b7f66a2909fba0c72bfbd537bbbeb4529adddfab8704cdd4eba5c15ef5be226dddea7a65daccd125a95aa5b5d2d77dbd347d656e9787069db2fe7eb384d43f1d7c09947d2645ed6618a31986d938a29860a8992a023c85fd9285a065032d6e9cc0dfcd1004db4b93e1533ed205914bc041261ba1b9c88aa399881accd13c643765d764d37da6f458762d27ddf058a6951ebbba6a164733097bc7061996c803f4d1b265cb1c76803ef2ad2a7006caf121ff08c1e1c6bc82ec1c8ee61176d0c01fcd22d01c420e8e66187ef2389a4168858066203b8dcf179b067f540747f30f56991d1ccd1f442e5aced1ece30648981182b504d30d24da28022bd910a1b45a228a85c40d2a2598f0129d1250ab2d565880e34246b505aa025b5354b7050515d09ad0705bc4e021c504d4b685064b978bb6a58d1e889a404a82071fca1041c46529892474205ac24c1250e84094849a24ae50524a02044a444c984922cc0f444d5c72d0783f2c1de3964b2703d2019e293c2df98a3aa49981926ad75a5b2e18b561176994f100e9062f2c69d6e841039cddd0a305b8ab800722c02c0cf808036b4df4e0a00a2270b621183442e0031a5bd88059649090907e40a38c1eec5cdab08b36c6ecd71768a4410234d668c9c10e5128a17936c4062184104208218410420821841042324284f1a201df15f830836dc07c8044163d5650851558db100a8926a640c28331f0dd100a09227ac4e06c43282480f0629352ca29a58c5766526ee84329fda69c73d25aa994724a29ad94126fb9240a4a4965a694ca2ba794320535958b0a0c2184104269ed9c41a6a5f605a370a296ffece79cf39bb79452fa694b27a573ce7fd99cb37ed63ae7dc2a47d3e06c2aa7def47b0d01ebfee69c733e421ff8cd39a79caf5965a5130758d21aebbdf495c4a5524e6ae9cd6c5d73e9a51ad2bbe6d24b335bcfd09bd9bac6d6ec525bb333d5da9aada1d7d635975e7ae60cbd6b2ebd34b3f50cbd99ad6b6e5cc9ae94935abc532f6c5a6d16630d5b461abbd45a6d4699905e88823489b42012e88b16a01fb01e286f8f84e5095165d2c2c46491b0543da318242c99ec329753a9a65f28e87649ee6f778284d9ddeea2180245a6881441905ad3bd1913d2182631910b8d484abc540ba1cfbc4d9a8b71b4914b47648184d2768408761602117e80f6c7ed6a64d7236e30220c1641881140ec29718c1016f4579669b892704a08e12319f8c988a495b5d6c2664f7cace2880d5ce18123a8382266add2b6d65a6b6d50d06b7f2da62c76e02f36e5590113103d6bf0878384d9456c20db6a8004f3bb94527a420c3050031a41d040882e4a88c97410812f6c43c51a5bdbf2fc8837ec2f4811f8655b11ec0f8eb19ab59dfd6177aca5d6c62d2dd8918a6db394d9568b6d7fb1eb2f180cb67d90d01222226eb0ed9f403962db4779c1896d2f0306ae40d262859219db42282268c0a4650c9722b874b9b22d84ca0017f6622f62b6b50fb2d65a6b7b64e1c0bd9d076012a679f1210363260566071ba6cbf562881a0629c352460e148bc572831fe6089e6a96a40bc826504f7488206213305db238819b8c008d7429fd8075288049d8186a18e1011835baa8a106163d30c0aa0dc1a8d1850f23f0b6211835c078f980ef8660d4308303141217c8d9100c1b5b94b0fd6bc5bb6950a2440d0b54755cc76198109109a2cc182595627e3b929b3eca5e77b6b4cdf96d9bd56e75d65a6bfdab6e72665de04fa7428922034483f47a990934ed0f50505faa8e1ff0847042a8a5c45077f698c2b4f6846b179a98ce16a4b2473e35c67ce268ac8184a54b9d99cd7296d15c245f2ca4745c8a4af0009882aa81e16397c472306315a0062ffa090cb56f179217f38040ad0c7fec06c47d7e3e19c357e5bed12f587be27927962e775838252ff504f89387eae2cb9697f67572437461c134a286e002239a2070902a03268d96c833bb21b9ab974a5d0e490b16c102a1845862df6cb92447d8f2d5a60ea14fe5eeb32cd24aebebddb093ef5e9044c70f986e4be40fd556432d44f312263045a26b75419f3a035c796409f3f5d556faeb512d1443227bea5363e827b00b0ef194c46d2b19ae0e6838d82e1b0eb5d65a71b85d34e104c5e102693629a5843e74d2092f6574c176e50f84b0a0bf30b51267905286b1d18927d0937618a38f59529b669a3e92f747f38b503bc618e352f67b6917a3d0de69aa539a462c942e118d80116ac9eca187b14d6608a554c9cec84a4ce84911282fd4280c0485444949f7d99388b6db0c6348287dead2141b78098cc92529ef0b6212c6e6375967ada78f59c4e244c6a6ebb387c296b4826c7d1ae36a4d2a8416586ed8794eece78de636bfcd6f9e91fc7699394f49dc5edc72c3edc566f6e2535e6ccb5ebcd985a49682cd9eec3113ddec37cb32884642b1411e2fc2a889ea679452a289346c90e766cf3aedc5ec475ed41e91ea29c098eadd8faa38191d6557fdc8a9283beabaa77495edddab7057dd4a0cc660ec1ec6b6d82591303c8049dc148624f644a90bc978b3176b517ee23951a9b25ffb5de9a3ecde8bda48fbf58c52d9bbd76d4bcdab5c5a50c6068e422505c1a691524a29ad144a144a29a5dacca44501a5748b0d0689b4a1b673d8c01149860914af1ad883da73729f7ad17d4a577182af72e474a43a3db2bf87faa83ef5953e9a3b5be0d5aba84e6f57ba4ad59e13d5e9bd4d17a9b4b73dd1d7a752afaa2b94fad41ebc7609460536f8f0840e19f822765f349f7dce5bed44b347fb4b0d342640230c24ccd02296a9741558ff647595a96151474e45a9cf1fd17b2d2a0663993e4a69cf89fdbd077591fd7d51fdfc07d33ebb14622c3b9c324e95071f4351f6d4bbc77db3077fe4b4fd28f5ec474e9d2ea2bf3fca9efacc1ed41ea73df84d17ddd31f51ed412d03d2ecd17428616ff336ed39493dbb51ea993efa117dea463706b5a6ec4252bbd7525a5cb249d4ad84edda29942812804bb5ca5a291492b5d6babdd65a5fb3a7ea084d69eb6b985a19207f3eefcbf142945a6bbd078740b873c021f465e8195bd40287c82a1026f100a39658041c120f213c03a11816ece18bc0a86311d0876660533172cc025f458cb1650c228b0cb6bc05e08b7e0661c6968f715f1d97a00fb5400db67c84102ecdb02712d22c6385495a3a2595b27e61938254920542e3820637a8ae6c61c5997a450d2ee98cae0733d6e4d0829a43adb5561dd81c542c11a8ba484d81820c18d134031bd460072796a05e10517be0806a731b4205f1441a323d5833704825692b488091c314293893431850c82eaeb85c9c01020b986146cd813e08a61fa99b1d90b698316306f26c6e674ebeb07cb9cac03c32e6e00d4d087da2a69312d9aefc81504a2965bdf9fbb561841d84a2505c00cdea05a00b019248427290fcf9a07c8970f856ecf0ae7d781da1c3bf051e067c012f177e2800f6c307d97148857cc18770f822120eff04e8f02c08393c94270c48c0a144913f5f130b4f1d3621e0d961910f3924f2a0c320ff6152618b017e806f874d2b3c75f83515e0d9e157a484c34732f2e723a2e5927cc11b397cfc42fe7c418a1c3611bd0bb596912f49867cd517409f7a9d31f017a3caecfa28a64c7d952f1813c9c817c021364731d58ab59672d9edb35b2dc3feee69d7823e57c7a5ae49a6a5dcdb674357dbfbec6aef664deceff1afc6f28573fce14f71ed7b3b2538f8114b37021438fb1797602a95c588c56adae52e6ec121705b6db16427e4ec387f566f5b8ae3ba221ccfa1ab38d9c3fd45d9df1457a577ca989a65bc21fb794d4a8fe178130e3d0395426892147243adec35529ccd53cde56c9e69e4eb862ad51b7942654185c6d96dfbc23d51a8ce091597d516ccc4d26283e50610ada51b1e709472925c9ccd1509c71a39d4786974bcec50a1a3cb0e343f93cd6832005086e70b1e647a8cf120ea25a6078b0f9ca05c7e9cf1e16c9e6640d802630a418b085846e06ca64004e16c9e68e4ebe69b10cee6f9245f37f7d10dd93cfb06c4470f10204080bc80dcb46ed8701b10203e3e5aea0201726f06044896d90a8290114408418810988f8f8f90880195a6bfc9ad9c314b6391af8a5bae1db18c9005c3583d527d646aed2cbb37cb62a09bde52aca97c6dd9cd0f80adadfa223457f4aac8d55b6a7596c5b8713b460d73b4e02f46c52f7ef922ab8f59764fafbecf3ebba1d68e5f84dd907d2a73406b47fd4dd9574f69ed98e9f845fe7cb41b8a5fa895765a0a63a6fa64d0da3bfad1fd4531bbe6c8f214d8bef1cb06a486fa4a757d9623d1ce6e65c36e5edd85eae805880f187f3a9773bd76762ecb2df9aacf9104cefe71bb56224bb2f80241807b491623803e707f5b48de7b513856ca6eefe918357beaeb925e8a51f255731481618cd5323beacfb5a18f1af88b513baa4645b5a40757789c00771b42618145191f5c808a170a7085c203344d6460c134051630b0580a8389ef2d9376564a2b9d954a2979a49411afe6953f334a29a994f272369093569b5ff313c279b3219c509b32c29b26ab66361a279a29291a0821a438986dc468a6d2362a3d234633319aa9b48d4acfa06a6cb322118295ceee55ede479e6b287e59bbb2648d7b8eebd37621a35b95811850ffb834f104a0c0a9ca298d00006d03cc1c36cf292e68a2536231ac8ac5146cd0d67ac985cae5043857ca0a905300853060c282618b7032ce056adbde280167b75ba5a750087bdbaaa4bb282647457acb1bb735d920e7eb9820a1d5a3069a82b7088612079e1e588e8851559d02ff78c0d60993744696ddc0d285dc08b316b54c181304e40c5ec54625b0e6cb16d6a5b6badad628b12363de5a1034f154d6c7b2d151cb0d65a6be9611535dcab04864958e67401cac53e09319d18a14622c91eb8bf8ba948c1929323a27898c1131531d062861717164a2a8049188f1164a0870bae1b82d98193193b90c247961d6851811d98000736c2e031c271411457ccac59139b37aab7d393a79e8c41d86403c71c5faf18c5e002671b424df18507434031850a5c504a0821a432d628bb9871ce99d93a29a5349b76d639699c73427875d8a69c137eca0c3999e79748e78c311ecacb28c116e99c93b26084c1e61ad8a54c770a241ec86092228d1cc6589a820725319ea600a20230589ac2081ec6809ac2e90632a26a193268c0e4400d17186f08260d1df6771cd2c08018692cb1031ce016b918bb18a59c52c6edf5028128683e79f5f888446e76fd5dd3734a2112ba604bf92412612182208fef16391a6f2bc7c2b3a8c50d053b5c601965193c378c0c782106195e908f686478216628398a9297d4a7f6b844b36060cfc33875f001dfc727e910e2834f332249b821d004726965308d724e55d376d919c9d8762dc7a739b9cc1c9880f69cb71b45b24408004a48d769bba9018ea773de9c118b04c9d79c954a092f9c3d70aad9828a405953546ed5d4da2a9b3ec218dbb2d67cec7a043cb6ba2b48fe84005fa99ccaf52134c15be60440583369a780ba014e6d0825451a3e8690e28c1460ec6e432829a2aeb665f4a9d4a65d0c8120dc5259769ba57eb56b7a48ee2f6e6fbb67543f9f42d5d333aaa74fa16a7b6f964d2b76862967187b6b96e1cc663c5b4afc7876566bfd3785a7d6ecf6fe8b99f6ae1e82f2f54de1d936d6db5cab151ba70e5bab556374b58838216a2bf5dda44024983e9e9eba4610a3f6b25bed65ba08ce9e59290f4f4f4f7018f18293524a338dab9e93ca182319b576a952d62e55c71438be4a69350c744f3d05b6e52c82ca1b1b3480e1c3e0cb426b0d1c2fa7f0ec18e3149e3dcf13a714f16903f7e9be60eb42afb843b463522960e9b63293598aabf976d92929678c12069b3adff13cf2e7b6648fdc1c2e93590d60f9ec35f37cc600d77f98eeda35a148481084792a9b64b2ce6d730432ae7602d011bee6ab6c4277f6fbabb1968f99eeb867e4991ab73c805fd76d60082505d37e9a3fd58b33a4e8210db659e3c504c6673e4872c1fefec396367cd0805b5b6489c2cb52144cecef4544e103de36848a62a9e5a262a622a5f44a09e79c73ce39e79494d26cd23969add44e29e5945266f2be6094c6ef7b5dae9b35b0f8e037ac5f26ad36bba9596bb5f225ef8f311827ca7fb5555fabdef5663745b53937eebe6ed00666760c7233b17bea267bfaddd45aebeb9ba7347f5987ba5258bbd93247a98b7694d65af5a5db96c6255f50c5adba24f05072f3aa99bfc9755be0c8d9dca8ad16a594bb9956df0843d549c9cd0be16d3229dc340a21b4787230c0f1355575f637e7cce8cdaebdf207de4a7180a5a473ceade3b0d8b009f8e5527265e008e19cab2cd35524105b21b1c6524b2b0dd4d635965a5a69a0b6ae5943abad960c5bd7d0325450c69a32ce9401633c53c6cc4119136a4d171c37395a5bb5569bdda036752e417e7435501d2c9ab05bb2cbe2a214a4c496ff766cf81d48246e8920c821104875a82ec378263b60e7248ba57494d9338613714b4c8a4848a94deb5210c5002865b48debd2f2a203c5a170bb255b077b71af1712a15be7352d15bb244d97e7aa150eee82b9588129dcb0eebee068c375e1c2850b17c8850b9c40383155c76d5a54266f78c117632c9960192424a41b9aa0816b820ce73406eb092b5450a4e0c6179dc4b277ec8fdbdd6119bb3bedba64815b74832203504f8800a7f9b89db556e044164e423441868b04504d54e00699a14698113c098162424c1c038a1928818118bc98c0024b21934503496819620359d81c3c80a4451f3a5cd26c7afabb04984d8f97b0c1a63c6c8051118c0ecfa64d6b36e5e2b4e95d9fafcd8383314a9c804c53139b5eea005320586bd3245ab029941248b82e165603aee86a0527581981034427040e2f749cb1c9a085458e0dba2daea441a3b855dc242db57ad84a80a30dac04ce96ae0d17746d58e1eac1b526cbb6869a6e0d3170769093a56bc30cbb83141b2758ad41828b46b5668bba0136d4746bba986bd4c099a00d1b562658b3858574c5f502098acc0b1acae03594e8aee83ac688d41536c4d8aea051c65e69b9726c08e5010f4499800607f07737f528de7e105949795c3b50603829fe04d20e537fb2e93fd134edddbfdea5bdab6f2c51460aae6042aae2a4e9abedb38bb9632e45027be8efdd6c96dd669aa76a29b019b5411e3c81644c27661ef9caced26480716c18e80e627d09910bbf68d3de3dbd8c3ff29c5c6de419d9cf6b8fba48fb165347927b11eb9cb6124be922ed5d113ed71dffeaa26df39cb05e5fc47ad5de2dd2eeddec292df0b32cfbcd32d6b58d9b167792ce98bd5eead888754d7b29dd2435fe91bdda357d548fb5778db6b3b41f79f746dab973fa086bef6a8f88c5fa1136d2479c3ed2ced2de2d621deb2a4ef7ea22acd266cabbe7aef69cb058f89c3eda8eb7eddebd11fe9177b551f7edddb7145665a20c65f664d7f20bac55f62ecb328c6941b3278b58e42b68674b4c536a4d1be4d956abcbaf3a1b1b9bd56ae5c47b77239823078e635d25e7385ec57b8e5b8949d8c91f79efa0777ca39cab728e737ed4ddf3debdc87b77a98b72367c2bab17b5be7afceac6b1ae62f31bafd2bd752b31a9d25558c7afb2baca4a0c77c72fea8e2f8f6daed255726ef32adebb5b896115cc717c231c57e9a39ce3c8398e1f79cf7118935d124f7b91ebaa17e9b46ef491cd6f9ca5bbb7eea55e74f3d58bd4c70c7a4ca27dbcbf70cb6faae7dc087f471fe91c3f47e7f847aeab72b2c77de730e6658fd39e13d7736ea4f31d9de7e8fc4875d7a63d4d3b715d7503b8b4a7dd4aec06d0d19e86bde39cbbeed2559c8a5cf77415a873e81ced11b9726238349e3d32277b9a2b7b5afcedbf6718cb89da8b5bd7dd888573d63b9cb37e74e369ddcdbb1be1b08ef38e759c1fad7e93d24e6ebeba016eb497ba95d50d80a359bfd15560dd9c1e91cdbda2ee30c624de7eebb2973a8cd9642f05e4053d4ef51f8c2a923d267adb2cc53ebf90a1e46c639927ba70810e9e32ed31a1b7b75a4ad534c6b2a2c9951a2222e882572f3902cf675789dcf544f2e7a2205ff0dbf69b67fe22929ddbf6cd6e5151db3fd8e6dab66ddb52598bb0bd7d9e955d13c8357bb61c047decef9c73cb36752d9522ca02a77e9ba4e007a1b8772b9b1cb77803db1cdf86e3baaee362ace3ce3a8c6d94734d208eebba23d6b9c318c775b7d968c7499b89595fddc8c6e62b7de4347fb4ba11be8d66d91cff88f5d5eaac17adcefad445f8361792b24b01c66e646f7e35e75cadceba951b87bf916d329c3dacbca93a4e952f9e3d54c70af0fcf743bfbbc10e4ac2a8e9a106259a6a30c40e492d08030653982fa830636fb03a2d68c286304a6394400aab0318558c1b5610b5c54c0d586ae982dbc2cb952bb6060f2805f50086085090051a25184115b11578e0863ddf72cdc3a0b2508305582e13e6e2ea722faf27a8a079844e912ff839e18c9762ec72fd305850107d3a3229a5b4a5c33329a57386286f1adbd4b822f88b4bccc7bcbe809171e67e3a1066308319dc6aadb5d65a2d7de40e63174e7f3344cd3066b395da0f8aa182c6d7b64f368535b395521d635652334869b3c43441676064bcbef818971809effa8179a0b4caa0517391b09274c5a5a02818547c8a5d2297c804d1ecbab4e76193d8658628a6e8c40c63b643910f0a92d0ce9066cf25f055efc248544c970be309e565cf29e1ebc99e8f51863d9fb62836388120661d679bbc719f6bab609324ffa26cd5b56c73b86995feb46df3450922e7375025e0b259cff1b2332a809be7bce626dc59df62d62eb3bd0e13e09bef759800cfdb6b9afeac703902d31b8ad175d80920eaefe611a05b4a8edbfbcb62e521eddc6db04d86d0475bb1ec6a65594aa46c36e3d8617baa57aced3677dc37eedd6137b45dcbdf0c43da59f66a18ae24d25c71336c284aa4ac0eb7262db4812f6c7889a4bfbb39dd1d4b24782eaf20d02449ebddeaac434fc926a5dedac36f96bd4dc45ad4f4070314a41d03dd10b0f138373404ac705e8e81f5ce1b92c27dbbd552585f5d062dcb2d7f43aac3a8bf21d576a1b9cdb0a36c2599d35f448236f90171d35f44da753b772119f12a07cd9774c1107713d5211c426f1f5065775f6596a6b79a9eb03a2b4b4969ebc5572fde3ea5691886b6738f7a6875d6ed3f2b48dbea08d06df5d097b6d552bac32ee7782a47a4cdda3547a42de5e639cfa199b09e73d90ddd3ca789eada6dd6f2eab06372f39c9c9c7d31d055f68658bf39eb25c002c505991d332e764d6e76d4526c0452dde0ec7532de2a8abfc16e88fbea36774d589f8da68756d71a2b472fb3dee5cff5c9b0216641c882c75c406d94bbc9ac1bfd459b3f6ce1d6c9707299953f2b4838ee23d2bc4b37c9defde6f84ede6e471638daa7e2eebac76fac5fad752931d0ddfa77e3f0f6563f40eeb8d29fdcab6f5cfea06c2e8a2a43f1b27795cd0b5bbbbd97a1fc91e190b5ba71564b47206e9ae48b9bdbdc856412ee5df6ecf190ea9e3debabcf72df70b657e5d50ae7eeaa5577782e7fac7faa73d7b2c7d24338f7549e6a75f89caf3cd5f16d6eb377e3ddedb79c7c739cdc3ac769f9e639593bce8da6a9f4d0cd3d8ebbea387b9c1e627d75789ce377d95bbd3bf7cd266fc7695d95bfb8556f1d276fbfb1d19f95bd1d6e57e5ef861eb2b9b7fa567a8875acfad665acca71af6e337e97ed6d32ebb01b6261fd5959e91828d7e5edb06312c28e31c429735b1d01b9777400efba430b1c0fe7032c7c96e385663774b3e373e40e33738bdcfe5a0f889b76f837e32ea5303563fc1253293d3f9d9de97ba189e92facdcec4ed8ae6961da94ac54a7dd085d707c2a03c2f12c098eacc304584a03b27fc39de9b8458b7c55fa6d76f84d38eeb5c7b93d0ece715c38872e1d97628775131c1db1e4fc669c692109378e2cc9903d395a96e1e814570bfa581d976aa10ea894ec98a972182a44230000000000d315002018100c09450271300e26b2aae90e14000e7796406c5099cc634990c4300a82206300208600630820840064942aa20301946a70aa9e4126bc9c963159da9b7e6a1782514880c1f32f774369bf5052c700b13e82cb399fa52af277b9f0d0be18b0876bd0d1747de2522fd6b50b1a412694da9fa8f606ba690ea60c289d1859eb9757a711b4702dc182bd32a8bf5bd29f58d408607197163c02efa19be661da82597e4de90c15f52dd204b4dccbb155ba44abc55220889d5250d440e75fd6a27da565ef7305e2b31502c2c19f7d8e10781857526cbfaac8d603e3898e6577258a12a014bf51ec1e95ca69561c00a6ddc5a608be431d301860c8ed0e9787ed2406c2825bd58d10a623630f58985a1801676ad2893ee0aa3da594a1d5b4b63cb02e826708cd6cc5497ba94dd1aca2a9dd5dc3dd3ebba452329d7322174473a262d4a6f510c7818802106581ca7f830da512e18d059778e5591a15aaba37ea057c195b8ab37314dfd9e7993adb4ab593cd51fa3c57d402a5b839d5d9a2492cc4404247883acc4420601484f3c3e32509d7f4d2c15b8db31be32fde779d62291ad12f7c08e24d5c84601ac8688684c6819f30fa0b6392a7619a5db3e8078d97710c0c3f517aaa1510eb405bf551329e288bc2ff9056fa88ca11fb7dab724506fdd8fe764cae53dbd5447e6898da82e3324e87191b76b3fc09ad65d42f271fab29f0b484c439502f24c003fc647a0bcd03911591df42bd02406a38b8924d50c05a00f190840ea00711de30518268952e84556ec3413eb6469482923289a966e568a7dc7aeeefdf159baad3f4b8d5e50bde370db8674310eb77e59379d9a708bb8de482ce0fe90e0eb41e9f366bb18a15b55730320d591aada7180f4708bae3668f6e0678307549de09f455d8c0b6cf12b9aef5a36b5c8e461425e7cbc1261836083b22a328e9ccd70fe11aa5da44b57014ebf535d503372bfe085f122aa26f168e462e048cae005da3d801e6ecdc0fb443e894dad8b204ee41b52f491bf611459364f61598c5ed6f56646f12232159dd37a3f51e093754c77ff125fb62f8a9a21c86073ed636a8306528554bca2a25db1278d603e83e8a7aec0f352028a6792710d15705a2807129821033548d75ec52cbbf0c7ccb466dd056e40db05d28c9066c9710da27c56ab21b26747771cb5fd6ec1d4afd5824a310322a27c516079ad0322ba7f33d30d6d017b8c47e0c635085a7904eef619e2333c063995a1f648d4af8bfed8937aadd61cfc061820cffc6434bb763c34a9469f74464d9b11014c0d82b88f6c3275a18af3fa2b053eccbc81f34f059cf05e5fa10286f6b4eb64fc53d442c55ac87a72a648b153e835fb66d132b61ad1adae757066402db534052afde3751c88106a10cadcb854350d5eb2d0a31d335feffcc303e46f324740124ff816f40f4aa2d945578ddda388c22a4bde6fe2942a09285cfac04877883264e0de93c8f505097a28be9c0ff28e7fc4ac6c8de4b23292e46474a3888090fa88f0a431e962ca8fc4829dff3d90755f0dba504acb0ff256e4643d7c8a090b63591f5d81e4bfd6b04b0041be29c93317113bbcfbb55815384933a3291b2f08297ed41297e88123c8732329ddbfc545915e56a7550fe97e658ced39b28d4099f935b00b0f5e443b20b0a2cc3f68fb1b4e3f42936b35be4836c0877ab9486a0f5081f347c59d72f0940ec17b1deb8107098a7392149972c8dacab1655b33e7f99a6adb094374b432c0d9298a45e82d9906443b380d9063ac1eb9a80363b5814adcbca7232f47d5cc19b98fc726f8ae8f807244683456a59b43994f645e2bd28e0f4ad7926517f646f4998c70d332c7a56300922c1a5e3797e0729fb9d1f8aff46695713a835c773c1451123e07a2a04b04f943c88c9ee0b687c1d6aeef18e71e4a3338505bf8109201099ad46bbf7c2837dda08a6ab02508bf0b3d5a1ae930a8ef2c208a23340ed3ad630e46967a73cb17c45e148f5c1c9a9cf4065f9ec912ac3f9ee6d11830f61eef026e2365957a02f820415dafe6ae30738c188b31204a109a36d95b03b2215fab322183f36f5934ba754137d1b0ef3c4afa1758f90fde37819d434b84c74011bf0d6f5883406a5742946e507d3c0e5bf204f09860bd9d2f2ce7326f982be1383b0d8438443745c9eaf514c7ac95db1d521151327b6c8d50063ba8a5882fc7372186824a45a886b788000e2db420d801a31c8fa1d76bdf45f84ed82478a347920e89bf93e1e4fd84ae03e90aa43c32a7c4da37295fdb19269b69b50c0fd179dfbb1f403f33e297b3bb1df44318c470ba591bb154592d76eef54e5b91e54aca063f1505188fefac26c045bd6d53a82b32c5d48e6995950a0a5161dc71ae261c9772400637b1f6bd1d3a8c2c58516d98523e787c62e072c7f421e206552147ba2a8286f120fc768f8504ddd869b109e1929ce61a2c7315011398dc6b07cf5f9f80647806d0d56fc90fcbd6967940dee1e67a841c703847d26dfc27babc58244805092230346d4b6c81c9086625d49577f793a64fda86db5fabc144d5e47de5513b60eeccdee0159c5786939a7224193acaebdcdb915b3ee50f2c71720b3158c7fd940343018f99931b24577086451b9856323104308868701b0ea87945cba099cb6e789a1fe861cb7a2336cef279581d2e13c1b889714b908074e2028857e04be0ba074e77f7edfc0d4022476e3c2034199af049d206ea9da807521d3741495685d4d77ce4dea8ce1854cfa64592bbce8da72af921d075f4fae73a15beb57742f29773af7c84e298ce4496ff7ad524ad47b96d3d46057b4db5d3de2bdcfae76123ad6456fe4feff92161ec38e7d4374d572448732fdc518acc302e148ce9b98951f47d092036369e59f3264b60ee3423cdba8bd1c846425ba95cbeea80b7e3e296b0badd524bb8dc4152fc7fa8e9f95434e31c54367177a2960930e2259e490e9b3b03298787912c0303d3b43585bd119e2686ab6899081d3b6bfcf5bd4d23a10d760879f7d574848956e50e411c831b2e5e698828b9b6171471dbbcc1f9f03ab5c84d9d5f7760b13797d82e5755b71f7017e7d60118f914b1926e8ef11c59286b602ac20fadb597cd132fc4c40c4594d3b7acc7e809402db5066463e7e5d48c3d8bc678e8519807a0a8bce6ad127a1e24d452d4ca096b373390265b2954b8ccc8d4b974fc361668f8b47580d2ea00c879dc83e700c917592d8b91167bb59981a29817f69b9ee6a806ff97ca8c821180d09468c0106221275b05042773577f7eb8fef0f3fbf7d489b68645de51e027a1a9b1c9ccf2616f613e654ecc0082bc844467a52a42f2c00c1ca99479ca6fc297dc4a235140cf204ed843676cac14cc7e770000d6fdc65404f03142fc37d715e945950341ad1c755fbbbff3702e311cb9450f23aef20dcedde5e52e6f02e4bd2fbe7fb0c6882ae633e0626e0f7838fee265aba10dae4817d1eb425c0d77b1a57846c2cb6c15bc93833a7cc250ee94debe58db9a8c0a6d83a014bac2555eef64801b548eb46f7ba60d2993688d86fa79cabecaa0721be4eb4f521df625cf7fc864c188afe2baafcd7e99e3e17730515795485e99253cb35f7b10075c878086ea5b58931bc33e6260535fcf1cea904697353ee7a66969854768685b721c4c67e97f950891cf6631f34016c8004ffa45ff2561350747fec1604d219e3b26e26de4a9882b55494af9706cad4a88f73e1f9574cfcb85db1e183137ccafa14d378701222c9be12f621639bc9480cdea0707a13208a91ac6b208c9d1f20981a3163c3da617b87db3a526af0625acd3331a73e0960c6110ac8fa81d80baa82b6b5480ca1353523f79f5f314ea0a8334e2814371860230a1ed33d3a98efb10b4a7211e67aa1c5b9908ba1ca54c57c877c42d66992ca5e601bb3ad8c34c9d8305b6554552cf3de2f6f15a1ade069c88f83355cf4a839a04d83c11e395888b6275f71518ff1a0679768233cf483ddb2bb3d3e326e6166defd884c6c16b208ed2eeb989469529213ce01b111826905af023fb7fd6146df1277b309dc28e102203045ce2080d9cd81677fe30b1731997effb4fe988f0b34f96c8920c117e18485cd32eaaa74c1c1f84dbeea2cf5096d66ab9cfde0e65cb24c82554e9165476e9d4b935570cb0adf7fe7c15951bc03c26e12295d8da204220424782647902575b6560e172535669f034f5664e8d9389e9d93f58bfeb290c4b5d39084f924bdb2456a75b7dd6a568be9531f0a69d372011842c20567a6f1ac496c63ae4f9b48bb1d285a412afc67284a350d5bfe18eb049f43268b998e6980155e8f231c49a5bd4e8d4e8aea4b2ea83d252c156b08c973bffc8b4498bc9ab33bd5b0fdd317e160b031bc5753b6950367b082867da2d11a5d34c5355dd642993c54b5feacc3b1448cc72f0ad4df1159ea12335115e7bafb71bb0d76af44c9bedc2070fcbbfb36fcb88ab86684929e1053925736ad2e88011c731b293e0fa73c202fab60adec36dae4cbf0252d6c46ea76cbf8d2f59122ba5c01057595955ae2d9acc87ab821c423460fb5be1034fe9aeec9561adc80d95387d82b0e924c6ac4af58f31a20541537ea762b2fab57422b684ca95204188d823d2f7c9c900e0ea445863343847e43520938bab887d81538e8eb936bc4aae9b8a9be5f18cec1ad2cf1a767b2030d5f1d85bdcfce8bb6d21806c9e7f0b9f77b86be6f633d91ae2ece2e826ac4c4e31b875e25e476b2ea89894b6805d349bb99d41c1108cc84af010bea728dc5768a9dc8a3d8f977299e0f76b3ee3bb3d4bd727c569fbd855e410b93475dab51d61e42a40753011e3190d58b53e4f93b6d64fc384e2ecd106f16fc0afcdfdd70849d953a037b60e9eafaed1768446fb468287d11f4bb42601f8e3e41841ac58826c6189acda3fd0a70c9d7792f368791418c8e39e4e26eefadf0ed092784ceef4799be02370b075032c3179aa66558db0a2397d5c8a87b50ac49661d149e32ebeda5b0edc419afa4c63ba19e6f71eb3a1c2d2b41d5a4e357eca4c3974bf00fd300ff66722210ebaa53fc0bbb239ebc3b778e603c36337ef5deba04ca0c9d388a917907ef7539abd1cc32f9cc4f364449ba01e3b7c11dec29590ead6254c078bc35cc368b88a9074775575c4b084718b99af999e57599e1c1f619a740200aa6caadff73508544da8729054cda08f6c93ec723ef55e7a737fc8d35c10d6d8ba7930755c01014d1a930faf638b151c41a4d93a982645264c9c6d1a5dbe08b4d937bb900e7acb4ed2560731fe6bda0f946cadcbf4708fc2e0a2b097b0f259ccbe97460416baf5dae28bce08d04050bfa6cf886cd577e3604a42af3c3507587519e0ba5dc98eae3c1e5e95925a5de75320d65ddf7163de8d203d00d12cb197c4e1093638564893641620fb3bffdefc88119cb59b7a4790a5cfaa07e76f1d71716da62bd8c250e082ea9470df3d462259532917fc00b5fa8d9f9eefc917de2483cdf2fb5f6a34c0fcc3bd0030b7fb0661486fb452f6c508376b55ea3c0512aabe3cd9e37676dad4f1119aa4cb12574eaddb5ab31a4f0caa7bb268493cbdaa9e4ccca2e1082565e55b6a3d7cb33282a6a14e64b95a7c4272c5a6e43b1213e360e6ed236d447082d97eafa04a58645371a6990a78a2fda40f12ad972e1e5d6aa9f0cd3498b93096ac25c89594dd6f262e006f185e3a0e811ce53433dc0cdfb887b3856044e7f3e105b0f046f564fb1c9cd8820c381dc287e714e0cf0e14289fa7db38944ac40bb9a15b285aff73643e5a83edceb5cbeda46b44503638bd7fdced406e75a00f1012f6742c4395dbb78d0b62073c117525475de6c41a9979a659ff6062790c6cc20101e43f59026320631cc26855fdd56bcfb43692f9e85e9390b9e10d720b74c523304a049f6d5a25595cbf820c52a41c5b683af0081a627181712e3597b6d002a123d6a054bfa532eaddaa1f9c2fa43297d1db09da529ba77277c7fec848d095121bcc1fe0ea2e4d71b7804deeb1194f65b3a3defbdeb6ba0e8d7be27454f985105883d9f19c009c25ed2f558c8552055d4fc4e7beb8673e5feb4354df06238859f31b5cd5ca2c1985e9d7dfd6ea5e4cc78b32783196a30052813c453d402707c9dd481d22d66a6c454cd65959d106b3961c1fc04838219b66f3a9c0d745895f849a2d68e8bdd2768ab90099289e4ff875b174dd9d0aab3844220aed91f4ce8c8165a5cdf54cdd40ff0b4b683708b18ea4264ec849a159cf2500a62320c49be9d0908afc423d8ccf40f6f16927c7c9e029ca1e27ca8963c20a8f15eb27cdc542102bde92dc18bcab89fd3cd6689f698741cb659681d73beef9a44d50cabcd6ebdb92a88f164b6352d93b05d236848089ee5f1a07598f33279907e2c1b9fc55bb73df30945321dad79a141916b23296d07b9d2170dddccf9fa146534333a9985739dd620fb3bb3c88c2822f7bf4133e9fcb6cb960605fcc06cde5e5b94186d045bdccd248845f7298358e49832b4a3ce2c0238747aca0e883ae39af6f4963ab029ef3d78814e6dff8220f5ba41be765470fecd3209ba44955d00eccd9fb924ac175967c264c6a445f8fc5ef76651d571fc7e4ff731f0a564b408835144d87b883d7aa3f24750404c06d78c9f065b57a7033331883a26fa1d3de69aa65f453f6f732b623b23a21d6cf1fd9a35ed77b144ccc2cb0ae39a7b744f8eb4856303818e5c82d2018bf22a3cf078e359753930dea267f48e4e9d3db1d5002706c724e494e462ad471f7eccc734b7dd02a384c4f402b662ff33c35be93c06889897d57657e7977dfce32a0f6d02ce3adc77b34af9f22263ab404f88d1d9573e6a1f1b1607927e81fd79a4d1e8ddbf3a2c8e1a92f8141a22c1a22554bc88ba5be93af5a54ab608d1fd8cf2ef04404b5f8aff50c82779c3e0e68150535ce4e04bd97aa28541bee0e214e14a204708356bc113cda25fee0b1e50b9c00645de6cf6ae8c113225a3274a6303b34aa7408b8e5c5e35c5cc80f10f24cdaa6c87f18b4774405a24e301b712408287d9e48a72daa726d863790fb46dc3543c8b7cb7a3a1394b70afe84867141a6594d2d36040908abb65d6eb539929de81e27217e49450411fba87c8a175df0beb3f81c64559f45532bae17626adfa837056872bc8f51628726817274d0c17b6703aa0c559397133aed1a7b12bb1d6029112b79cf5a26529069098aef22f0331c814159d4bae0cc91db603c5bb0e3481b479f951c67a06f075937d19a4e2d4cfc7fc2e604f59c383a88f1775fbae93a4c22c529a4581a0ceec498a782cd6bc6991f4c08133f7b14a866a7b13861ca448d738ab9a8e60a2015dbc2db192097bb1d87df887f85cfc2d462cb6e1c54ca4090374bb12e91d331c83da119cc96c8dabdd859546c3c69be55a6dd44924ddc6941e219f2880595749d9d70f9ead23a6838d09a5c48cfb800aefa1d9978105d344d13eab180a0e578018e103145a6445950fa86728cdc7c59ad19a7030f34b25f27f7fa0651f8b667db49140dc1596c6fb969a6fd2b99d1ca04e3b380172b77aa7262d428127937d0d8dee9f40ca82450a11a197bf7c4b5db0b1bac56f7f28d629cde4694893d7ae88b29a01bd2a2944a8afd05fbc0adcd3c32e58047433ac6449c48f360bd922d28f180b8c88629b92a95bb77501769136a98b3f2a12eeee8e53804cd74351a6b2264c2444a240b25c9330580d820ef0cbd726f6e1749f6faf279e37d1663976312a4b485f1e18abe117d2ecdf162a1d116b18975bc27b6e806df24cbc0618574485beab41b8dabcfa9e0530fe93d20147ea837038e13072a496be7c23ef60a074574888d979b6a690a4cdd5b0f67921f20177ad9b782d86ac95c2b4acd297fd34d84e81be44750f0503ae406e6d909e9d0f46a9009484942124af377600b4a3037f68948f14240406a38f501aa1257f4936d3a0736288938b80a2110c6a2ad1ffe29445959a62ccfa95f719235e4cd94c83a863f75098cfee97cf6c7d5b0dad3759b35db5ed8128cd0322919e2fab0b7d08ecc302708b99df12232d1c824344fe3670a0c21534f89e0bdd2f7740dc2ec794de2728657cf141e0456cbe33026be29b8e544f6a4e655bc6506cf9e9540d80a3b92bfc78729e5523c8f06d4a942d72fb1bf7cd3451a01c0904e7980ee45956d23cfae32144941d336cd397e37d509e6124216742ec8548210b9a6c9cece18671639c6d704f63bb6565f7690f7678721a690af9fc2987d0548595fe30dcecabf6192d83c78f8189260caee6bb691d9e5e1c388a1a4089baf06861450ecbcfb02efdf7cbf0a8ceca30eb394388959f2f2375cf46470a9dd6671e306563d697e89c7b427bfa7897273292062565a4b0a3f85fe76a015cf2ed6e4e33417aec98284e41dd54f517c69324cd5892b9cf478a8440b876e37d2b6bdf2d6833e91cc56071aff6dd82038f0a88bc643f7a64bc074518f8e200719813b7a096f4e435f632ac612c6657a4ebe74d23aadc5b5134dd160a474a1a0034352b1daedddd909917d152ceb277cfa11a74973f15c2803abc6d71fe45cf1a879adc8824246f99a8c3e00db7b29c5e1b3058b7878fa9db805fe1da0f2aab3e50f687b5aac7023f69c779d41110cdfb54beaad3db9b7e139be161eb7b381debd203c96d3b71dd5820e229067e67bc44cee6f5416fe2043f70a46a9ce7a88a4a41b037f501374cb9968144aa8606ab69096c65d3b6a6d6d9f9bc845e2d09011a0961b64011f35a737b46b4679b68599013b56e54b5e277eaa384b819ffdebce902a64b8d002c094124e91e1f17d4b2bc8c20d23510b6c9817e45ba782a94284683fd4dc18e474dbb636981adead3251354106dfa25c1ce77da0c0130ad39f1977d592629e1125846d6a56336a105d8fb58d1ceb641ae013772cd3ecaf0b48acbc4bd3ff9b70565709f5989960397a587c4812e8cee5d01e27ece34f5b16bc86c37312ef8cd7307aef4e6b6b66ba1fed527dfd5ae2d9c77f3ae61c6378422f422e9ccc85541904d391dc4fb7a0153baf24700fb94965adf575e1596c694a3d3a381c6d2db755f630c490017e9a4ddbc505b0bae695a6d42dd2a492782cb59c5d5bf5922af9b5f3202120c53b3eea8c9f2021b0dcc3c943e1ddd0e843a7d9a8ee0ced8dc87a668f6deebfa164db991e1b032fb462585933b6751032b651960d0f2d026eaf07565ffa40cb8b25ed15fe84544923eb111e29d2efaffdbabfee193a5dcbcc5c30def70bd7f585d37cadf6f2a8897b0a5ace33f8302b64b284f547a59ea976592065a23280b35f2780231becc3198b035913e200e6e78f38a3ef9ae646877463bb09c326537937639be1320652dbbc72cf2b645055171bc9601cbdcbaa70eadbf64c54fde5f78c42f17d03351f529b2f3cc55b1bb9466889013c6074210694ba8c3944ddfa8722929e668ab163625f7cf03d3a61078fa779879d71879d9f35c1829c26e55e83adf9cb255ff4bb0ff7fa237899ddbeb2b71fdf93fe59de5f6418793464477730cf1faeff90781cd1ae17df7ed625dc71e3b4256547fd8586a819b0f26dc7f49adbe7f09fd7260259d5845b50c43071a2b2346410b054df91ca0b1ef371adba99a9d556be71a95ad49980d26185a8c6ae7808a999a34bb9375b423557648d6ec92d1a68e8aeb3152257fd3573477ef62471562ccc4474707c056d612e2f1863fffd44a0685990876b1a7c1a6c68fe27a1127102413b432700ea794187c6f042718ff6f6c0d5a532514fb5c83aeae80856d64f0d5c169e4119e56cff1e2f878855bf37df1a5fc22cc0c6c98a933efb111054a7538bc1c32976eaff63040876a34e60eb67e442f4c126442abdbc764ca1673e9a8a45a766e22c30224a2c41bc9a86b10d6d741837914eadb275ada129bf185b0b9c46eb35afaa91f133d5428d1fc0d251ea7e8e1e9db869301e22078810d9a459a8974cb822724f588298a4b0b25c69fd6888c80b94df1086714c726af358b756f1fc6360b469571aea4556fd16e8a2760a2507d92a05d2eb7f6e35e9ff1ded52175d7b163de694a05307c59ab70071fc791c81f0b8ff979e164e3d0e1bd3fae6d44677e4024273174119f23bc87abf1189d5a34ce780d754415e295301f711fdb51c80dac45cbb17f40095220a97a113c50aea2e979e044aa17161b2ae9289f408cea251fc0a36f84174c70dac9d7d4aadc4c3ed722e7c2ab3362e7e02751cc9f7145af7821fa032d5b3aba9e7fc3fa4e358501eda77ef6138ae9ff0e0d1cf1bfa184a350a85b5fe1e75293357819acdd3afd62137e1ff59077f0301d32eb45ce0f98d46a4d46727b091a64f9a798093b97b92eab9c249b00ad3674e842c58fa9329f1378297a8a75f1f41961ba3d9ebaa2ac65354d92af723edb1140eeb2b557117f04bff12fee3807f9545998edb4cd24ae37ffddda6a15eb750be48630bf0147a7c0f44ed909d96bddf04658fe009600344284124d14327f0724732cd16d26d9c4271653faf0646318bd4c9198fd8a7014341a0a8bb02aca93268aac4b99da82c7e5587e2cd51c45214cb7229cf9b43ebd20c72bfb14f73978d1a42c23e4a19434d1052cfadd44c3b45122ae519d2023d8bc19f61fed2f1cae851b94ee122aed9c09884b283524967ef9e0f80fda203827de0562e198c2e1f0936a1d0dc14c53e4a64e2de08e5cd384e32caf568e4954579c32a2fc83b6aad4adaa702b0e8d64ff2ba18973ee6d49a35f3c805393b71a1c8a3429d2ffdb623b166801409c82f00374482053462dd309db084a50b73f5ee42de462c1d4faa12d3fac9ea167dcc4b7803e2315bcca7a75154f5fe1802291b5eeb94647c580b297d485e8cf17d47b74dc55632fe149cc098dafa4a8c577c0d713db689610726ef5bb95f3e4ab1efff63516dd143f51ae6766f91c826df31f9a80e75b5ee97bea1e04d80677ea5ab55e08fe736d5854746185d1adc0ad50f3867058a3439d6d38618d85018251831d37007818056263c73993f21dad787ed20e203e3673dff800071902fdcc2089529557c86a5b842e7ef5c7f84022a1149122a8e17a059c551802f07cc64bfb93b69b116c247f26b3e6bc5107af75af33383b87313d3ebe6753b6d0682f12a4ad0b79b4e23a8760a8bf7d03fb4cc6e65c954fd578471313115ce7e2d22898892ea363828f9f1a5980509bc78ce5d32e048a0d86533c881edb05847e2e922fb12283e738f69c17d79229f848e923062247ab94b8d17ed6012d258695917cbcdd64a1913aace0b10a61c6c947798f42ec81d84f2860390d48ae9bcc269998f2c79e66ec5bea917a849283c3c705851b90043dc9c784b8e5762c99b03c4696258c194991e64ea43ae20dc996f1f86f9db8e670e56054d126a679c15eb911fc048700299b6ef609c9719e946381850d8129079a058ceb6252aa2322b2dc797415e196663f7cd40c5edb42583769dd8a547a4a6cf0a1d7f169796506bb6cc9eb1e6ab4badeb91d4335e6a9f680cdc4060b9e2fbdb87fe950ccb19928ca1742f99aacbb63c2c0a64d7698f654745d34155ccfa44c18c3a841390b6d38c97c0c2cd0510582ecc6bc3ad17b26ca34a2fb215b1a6e112ed79508be134e09ecf97a84ea5fd9eea2c610e4aa977da1cd9011207630af99bc0ebfb13da475e51a8b92bd80ca80017c1adb0b53d66d009cf97e8598139cc072c423441a75501f6f45ad4c1afdc6b7c18ede322a5adecca571632a7ca23e259d0b3aa7f207305f23a17e45d4a20deb6e684c9dde60ed83b6e121ce158c704ac6ee642644befb05667a4b5fc4c01dd37e4d476adfb6ebaa138e93648f17f90c963a989aae13e793d29e1488050d44ad528692c5ef8444193c4687d984ea17efedf49cd452264ff6916c5c33a5306323adc1f4859fc30df9c4a09dff6eae7240a7ed4d6885fcb63ee56e975eb90915dbe883501308aa36b0eaefed2da7d5f5e7f10e37c544df6f643a7611c9947346b59d71cc60c46a1d5d6c41d450dbb410cbf79f17e202c43788d89b275d838352962450fad12b2348404315c347c994688b95544b9f85be0cb3ebea3d961b99681a5b9bd13c329aa23d0a6d2ca80551323394e1fc76ef27787d0eb4b89606161cdb68e5f538a41c7528bd9b525624db2efa1dd18be7f14e7e858cab45b2306e726789d1776b30347fe90d023495b923b74d674739702c9b9901cbcb9a4e7d3fbde930d6ef6c1775597df630baaf859171dc51d1d93fad28e8a452ff234801a9ed7d2cc2b1684453bb99527263b9a8c11d654ebaa5c4d098099e49332a29dfb6113293932dc50d822bd19af295c1fa8265262dfa0a5973e750e33ecd037f8c76538ad373ad9f63b9e40e4dff4b85e67f79660e27ed1e45d10d710ff4b92e0e0a887bc72c915e5fdbe6a5f2648ac95f163a8edd061bad1be3234b27308c611b91043d99acb0f64ef6f6ad04d56bbc4e779248775e1bc128fe0118e33d3d6a44c0efa759e7d857a77b3436f6f03d455a29286c20e6d9162cab9a5a0d24d1c31fc7db8964be9f4fb6d7435a0f2d165ba0f50010af81e0527a6170e738ac0d3f3c1ffc77b2cd750627a768cd1200c86597fc8d7671a41f1fe151ea7437534874612c25cbe5a29bf7192c5670b807de735659a91990d10938e0cb80e9a3ec6d5f53401f3670b9f3c2cc31ed0e6cc1311a0eea6989f92c9e8ce89ae97073a0e84194827076ed2e7e2e540485e5c5cd3c68ba16aab9b28346116a97cf101c815257cb0012250658c798a256a8e8144d3eb0da89423721cb0a25132217968207a076f8e0d40dc0607358a35963e6e74ca502187012cd8405efe5070064d9f403f79cf56f66a0c0225a7c7a1fa97d0ef6563bb6a42564e43539fc60006a717829a05547a3b5af02c43cfbd40f196ccd5c9e4f037042c46439e805dbeffaa7ad0b5d3018f2f3dc72ec8521e1c5fb974b90503d5c76b1a80404695f710028f69e1f87d34deda7b7b28058a70ad53a5f74eb429c44a52f046500f5fc9eba780256c6961d14835dfaab413b21fde04a2800dfe89096bbc878648bb6880680d9047479687fceb201b1d57c0fba429aa967c96bef8e6f0ad7136670656078e3ee3fbb4d65cb0af1d4f2a0a1b85fe8e0862267f748390d8d45eb1d16e0fa3631fbe0933de0894d3c9697e5ada267cb8c050bf80906ee0cf5fafe4517cb801a1951b17088ec2512afa0f4be5ace3ae61c343c627f78e354bb97cd0629d1a6e924571008a63440fad7d5f69cb6378a2f3f456d2ec4f617f5e8ba8504dd783b650c988e5b49585048602970a1b5642a00089405d71ca4f7b40f617bbf36185784fe04ec4d9b5a83ec0fc96e1c76868e8ffae0e7532d6b7402e5864dc77eadbe9275e403bbea8ada205f2550c50880e9b0342851c5c53007b7d8520847fa489c60b3541aa4c35a7856af6496392486cb14bf83a271a3b693f742bf102c2635b03c601cd23efa33646f5fd9b46fa5e44204727ccbb221934309c111ff8758719693b6ba2e89d12a3ab6dbc7b243f4bf6c8cbbb5d257d00e40f3e1fa92a9b8e9e46493256de71d1c9163922ab0b2a7d0a9f5cc9a8ae335d000918099ca029229a66de2aa651815c8428bfa1b94782f799057549f606fb8ad3d58cf1a37065da603094eea4653bc593ba402fbd7b20a3366c246981378dd291aa7b44442e78bfc2084ffdf38ee82b8d612c7f020babeac14ce5e3ba1fb707dc997652417564188382db5c25be645a6d41b16e817488c1a5120fd866885048788d075226599c81c1df626c59c5add1e5fc1962baf239237f6430c0fcbf97ca33111ab99144d798e18e664d5f8e852eb48d85396620b0f19cbfd12e0d867aec51d53cb01a81382e184fe12b8e90f7ba568dde8721f7abfc30ff322cf097b48b8eb1ebfd004fa5aa9600184ba35118a8cad1620626be68c7bb9592970a2785759d6e86b80a0d39ba9ae6823d4c810a286bc913df00452d023c6e0eb2f04453fd514b413683505c662c005bfdd9be192be185add7af4524807145492000d2ba8426b0bfd8f5de09834e0ea1f36cc59e79388f0c9b695fc273858ae101d3bfd2464bb53854f9a82418dc01f374dbdfbc5655b938c3da8dd6a0a0ef05a0bdf496a7d24a919181709c5ea58313e4f5aa1c1cdfcc38d146b4d784bc92e95c47a132b7023b613795646873fdbce42803e05d0cd01a9456a3144b18020e76e185d232c6edac45aa67b135c050526101ef051fbfca73b21c0a02cc5a9516dd0e04ea10ba00e3fa2e674c251450122b9f63a24cd1f262344f9350647719dd8fa4c24eccbaef7c4768a043cae22a5bf7a659198f14ad7cb7533818cac48bb6fab60a25723aae79572e14d3ce7bb56f96c38ccd7074a86c5743ee6ce79036e66c7dcf7e119d5cb789e85bb10dcab84b35900e4d40d66c1c34c4f2f821968b3923fd314bdeb55be17aca04245380daf4d6624866311133b40e4993951ab5630f9940e8ae0502f8d62678ed5278773c3faf6fdf7721aa02af6bd7a7f8cf2f71adf29087aa8b6b77715765826b9f7cfa73934d1c16c50e8f9101de132a073a7b3fdb97ba216314bef4a53bb8dd17bb72050d5e4a7951a176a57d6a9b4eb16bf4aa854210b7496ab3a461c29ca6bed739e81f59e071b53447c40be7ac99bb6d166de1f99e073f392a193bdaa7eba1ef3f7f5bbe1c9e92e063a8a816e8ea3f3ff2e70ae67c4dedde7c332d6b01fa00b3e8c7b168791d82b8be9a15d6118cee92786ac1743914515100db77d168a298b3034ea20e4a4d5d024a470048598a83695829585f56d995eaf536ee0dd0089fb9c28184563dc83f1436837b83d7cc3729c3e9e10f26fab415d501835712bc23eda7a28c49a63a5d07d202aa2f6fdb1da32dc38bd24110eb63c8102e11d5ed1280b7ec3f741b7da61e7eddd1b044a973750132aee7b96c2d839e0d3d41d506bc4e2cac0d001170cfab6e2aa593b166b19b9140a4f472f02a51d0b38e31165294dc7a274ea029eec584048b2332d551be042a60c59cc91149f59b46162de580a2dd2e2e7d225f60a215f7b96b89968390c1496c075d1015fd598842b8612607d07212a77294fcb0a3ff122eff95e06a5a208bfd4a6a91622d34518b43f5c869335d82009033422fa0383c9a47c21a2f00a80dd96aa3545e1928fc0e47935e2305da3e61e48ca4d281fbb197c0b91c43cc1696ad70d51197847dad972cf9238f10ae36552ea649d176f99f987554654a6b24eeb74515a2e909a2718594f4a3b47b385aadc00ea8c6ea49e2c2f67233f66e14014592f92cb2851836052b393df3df7690ff668a34144b2fe60917fd8ac04d177c3669d12cff0be796aec9e94ccac0f0e024803def499f42c8edcca491055984141164ad60c442a9e344b62ed9d559095745ba141602fad45d1b0562d185e6bb8421ea34106620010d574da18ccfae55d55f6a596afff2b474b8ad57793be1d888fe579e4eb6047f7356e68ee30c442403bba346bcb94d66620b8d24ab0382e818fc5de51b503c6f8485959aef311a511dccb861f546a9f074dc0ed2028b02a44805efd094051c4a1e01d221b7bbac524a60cac58667888073bf6c4803e037cacbd4736bb1759db6fe3ba8d48298e8adee76750e04a2a4cc2c3bb2292f3122468a9b4774e4e91d088fb524ebfd01d29e094cde2009fc7ad0ea755dc1048f53dedb49bcb3d8a128f61c8f6ee56d8ec2355bc5af5e0672a9a0f41349dc3a8abea87c0d9deb8693180736adcdd35e07e75c98941db24d6fcf50bfa9a76055313fd48a8b6f5e2ff3312b9c492c18ce7a02f6cae990e7705512441fd1ce32c511127be3b5c6041b76d3bdb196affeb68a85dd6ae813cfc7ffdd8488ca98227914a2bfd21edd4e80e091bc8c3258540f3a9055edc0321476f940732778d9108ed69971c0c79a603cc46a5530199d638aacf3edd41c8d3714e6d4489f31aaabf52fa0a0d64743e87ee2e5d8f9b1b56365dda61731c39f528f477c2d232d62c25ea7bca7eff94333e9cc22a9c127b9d5e46fda01fe421fe41d7fa742c5a847bd351e9681830a2cfc31ef7dfda2d8583bfa70189164754ed51e284893471c2c27277a98016d5a330930fa3247ceddd90474f273a09f331eb38d09bd3152b1c44f5fba780c90be1682f4315836691597fb9f43e8b3b35240b80bee139034eaf42672b3b19014954e1f04ce9552d915dff0a9492a37f6f5337d4df34fe112d808bdf25ebc349c6f39ecc1cb74af5d09c193d11b3c798f07254258fa60231e6994b609c0a8688d707ed82bbc1f2c86ccfe380785bab3864d9de6eecb703f2119491ac75ece3b445323b0eb24c81b6890d5212664a8eebf31639d2250ba96994685805762541f83e458e8f92d603c08ca8c17ed410f4807b06a68ca6243052dba3d3e6a6e4d7ac1160f9e83a6c4a9653e718fd8a0d5d0200db4f5695ed3ce9fe5d74f104b509e917a9f537191e36ed33b7b42100bf2eea794d8289967b95e7e37d79be102ad82ae718160f1afa88c76ae2b6a617f7e93bc7db88e16793d2ae0b400860a8fc6eda1952c21931799da4d7475828ac4e29daef9c261d69c4e04aecb4340959db8705445ec0069dec6130f1d18a097102dab338325abc82800d14818e9924d351f44f95773d04f1646dbffc889a88bcd28467d6eff739443b8823d9a4cfee693a96fdc15da5a0c17566ff6dd7400ef44e48088d52ffca79ce68e2e23d73458f65bf9467956c74bd504377b207b4e605bbda5c8e6750d7b5d7dff79339e0895e314a3b7bf063d8aed54dbac394b6efdaf477768559e5241082529a7a1208e2fd5ba55d85e992ce90d1c5e44a2b47a97ee4887b4ca778d408fe721d0f9354bd53cf17c969f398a76e721a2f92e0b68e4fb10891dcf060102b484532149295345eefbd4759c0db7d8cf3dc88c6fc34e8193e93abba1622f89840f2d21f72ba4ca447e0b6f73222a32e56b5193ae4f2d2771120d0228072d7218ce77ee8197fc01397ed084346eac458ede2413e411fbc95b91e78da772091de8592d8b4356d43e81d1aa8651e463c219a120e154abab04ae4568b463f104b57296a9bfb39100d49c28cf1c719806fe0d79ee3d5e32619b9fb41c510fe83ec729f218884e7bd181eea68f415fa688c4bb37316878ac5c4c0d666a5d8135a3d6c827a00e2b9433325ceb6d7c0696d8feb1c950fb150ed54a0dda88a563a84df2b5e37ea0b678cab460c84411f1538d0dd65a3ec5de4cf0c3ca8b487da1445c6e1a02b97982a719828c486b34c59ec0c16f140e44813e2c38e1da7f54dcc7c878281ab1492167021ffe40a9b5c56715f051bf525becc89bd97e543a5120f916aed56d69019d8c1d703d1a19ae38f1791c4da632f9d0632d000ebae327488bf46391d0abc3c1e98131e95823c083dae1a30860761062cd2d3cb9c60463cbcb67953f019077f52419e385f410119636220194d6d1c48cdbb04d933a1e591ee8f3df70d33a92841a57383610298606a421e121aec7e35f1222585328614fadf7674414e635b36459bac721c5660a70d9293f4fd64d9ab6265e7a4de49c205353c8f20327dfc910d531231da5a562a7e28ae1192545238bfad2e616d6892532dbc09034984b5905956b2f2794bbeedfc3678764ec104f8507feffc79df90c00d614914a394954f45575f67fe4d6a2f823bd476d5ce8d252b55175f698d725bada9424d08b47413abf077ec37c03dcb1da1303b8d97e9f1a1c227a51101f6d75921294074fd37370a0d65541fb9fa4977de1d542b98d94742d08211b97a483ff63e4976a36f51ddd197a4e865ec7c3bece84d88fb3659873e5a2cb75a18288204276614bf7b516fefc2300761dbf29007e1dd84db6a51d5d02dd5ffe26010f2ccf569eef88e331d4d6e9b1b6d3be695215ab6540b5335691721decb8bc1301c0e4eb547d008dfb916c49debf5e3d5c77a5b97cf756459c5bcde33af75a1c9f5b432ee3a79e77d36bc140971d256e6a211d5fa17644a06cbd00e7ab791aeb804920d8410b5b79b4e90cb72a6b29aca3cef5576e268f812d75bc973f604e2b6b4e5327194ce84fb7b284d560589a67898df7d06f950f1300de90fd34dc1d247abc374610ae63c971482350d986ce88f111571a4165661b91800b72be620aad9fefc82310034053811a08f0f0aed56a4d8f9206f11514d1f0ac16db842515c04fc15be54b047ff9dcad7be144dc765ff566908f0044293ae69f991733cbe38652dc66fcc9413af71f4924e36add19a907756c38b3b5b801a561953994a3befbc082d13941a26ccd8e97b8fbe9d9edc7f1e827b0ae786657d97e9fd106d8f91e6897ce945c81932437b85ad516698b6b1447bd8a5298cb87cbe8616e69017a2314f53ba2af6c6ecc00fcf9a0da605a1dd220f483d14593ff533bb2e92cee4746b4a833330c9cd3bc648982e176d41d0e965ec1318ea6809e1c64c63417f87983714d25950d26e0e56fdbb8550baade8448fa485cb2d804b12016be1d9af962fc6f715af9cd141fc0b58f3912f599ee1f8de42053688b0274cfdc207c413296a3a768088e1f4e0bf6e45a89133932e978dbf5e3a42f71781a845be8b484f40114be285a63da57b6e9815bfb9062dd707f8e1716f7b527550b807bf6285b2707e9df9de14134906eaa0e7409bf4043f20671926abfc3d6b417d748df1cc1be5c688fcc91349a224196e9421aaeea1bc67845c58843e1a92e37fc903ef76e52f1b59018f1e4b1178ca28170a622bad08664350191cf3f90500244dd754327407f8ed1b3629dc3e8c7a2ef525899a8ce551972cb290ce4b0006b9d45e44375039b0c194d1ae29381500e3e8c51d3fa971bf48daf18c8e8b9d0763b8f141961e80aa2f1ca4ea20fafba97909c669fa4fa9db27cece60092e3ac5c7349985d925baf86db82c86295973d183cea0611eb57b4f9170d6a4a8f066230dbbe15ef97d14f22308496b62b16423af6c4e3d32d97539c01735a25548d0ddb49119a6989196bc81f372e2ede51187d0f1d1c7789f744de4a87de6d0112206268057e7fb982681acdeb6511bf2da70ec3a391f1542228c3a23b9025c158b83e00f03da1bb9e3ec6c2fe0989c519a9e9e21b4f0d8e07d2367d1d5aedafb38e87be4f808da21ff13417f8be908181af67ab3b51c8c121e8174e13af04fe85b93d4651f541f6db745b3718883726a25cf9a0d9283d1e1e8d598d121859e8b509da3e64aa798ad086e29028806c2de4438d3775a060943d0af375bab9284e3c3a131d981c8cc3785faeae24622e5f87b06fc83119f3f728400fc7d790e70572dfe909d11013218ec3e5ba52884bed9803797f11496292f73d795ee0206ed23225b5af1a9e8c722cb081cbc97a68a450d455e382fd2755aff05da5bab498c90abba44b3f03fe9257a4cbbee1291429d986f105d3d8aa736bdc624444740e3c744576994fbdbc7a1bf949ba99eb113cb3d90ecada91d6b758fbf07fe79c56ced06962a3d51181d8e47ff0a66bea5d4fa7f3d4d9a7681b99b497e57af3c437def6360a44f3ab9c8b7d3ba0f21d73eb093336846324a120e47f6537f532a8e7a328f53a9a8be269318f31ceaa25304a0c4db6e0ceda2d2dbc504cd174ba6f864510e628557f13643afd593c2e382339ce3c6fa24c00221250cf1a9e441a35af53ea6de4d014e37a7cf5484ac45156453a4c5565e74369115fd505e2ff7fe00a296712612d3e9714a6a38dc4bef3c308f0a62f5095588d2957f362fe5f440d820d94040e628174b28450f781771ab234b03a282a0b93b325fb5ab4456a32e071ed83b539efc35413e5734fb527a73e4e094407fb8e1dfe2cb5d7e6e1e4335291f5fce22afd1661185211a5fb0f6497f331f7ae3b061313dc274763de4ed1e7b9feee9adc1d319fb2874ac162d99cb4ca56852017cdff765021a388689ce8ac35b771b5acedc6f12e8d377a3fb10c126e1277a503af594d6976c6d010158ab9d8023ad011742b7e035bf9c29d113912b514ac01eef3d90a27845a4094ccf63c8cce7c3abd5aea13aa45a18bdc4aeb6fb72e489b2285cb736f556e712a6e1088f977bd27c953385a4f1db7cb1a9dfe14774f3b4dde20bae242d388c90b4ea63fd515330ada29a4b0968873d14cd98d0cc88d20a67f0444dd8e9486b0a957cad909885705deb791089b40e5e8dc4f21d830e9aac746c093d2f1923db53ee725f22da3ed90e0121ccd0a42e169586e0fca06c3e4e9fe7dea2c232496c625f6011b3b6bf8e21d2bb61aaf28f7fa3afc03b7e15e5bc40f858d723d1367e65871d8b25b8b917d8009084e69032c0a618e7b5b218928b01027b4cc8786dd2f4d6a846cd8e22f585d985e0b8300710396beeaad4cf252a27576f1459bbc3e4eb7c5f48cc44c1d5c1adc721c538c18a432293a310e9eaea5a1d0736bef4bb64c6dec56fcc2a0d75ea141722fd2f8f9ef1e15b70ba4d678fdb167356613e4e264181fef776b60a605a39629ba7c8675c456fcb211203b34ea72deba70129d399bc749c0411c7722cffaf43359c113454c07c5dbfe846660e374bdf84f022919ac66f9b73c3defb6db5849235548dbd857cea9e3005a31a13ec81c7a08e14398ee23f54beff73d8a8eaa0d7a658ea1142b219033070b373bfab879f5e5ee9a9dbdee9060d68f5e04742a65365c23685db4d5ada6785ccf70c96c185eaa177e407236e27bb4d29b011a76be2f323601103524a6678d4f88df32e5855b3fbe59f0b24ec285e85576fc6538a7e9cc75534e70816766729c05198fddb6e9d6c248d4cbb5492f10f8df502029027823f808dbe6b42df07953648d789633607a5f1d9eb5e97c54abb1c8f74f1fc14279eedf9fa96a2090083751e866af3c9ee394fbc464bb5a5922e65722ab1523502c0e88077f7700861148da0410fabbaf00ada3c88eec1de7667cf5be321f77838ba587be1414e9ff540ee4b1829d38d06930369fe3b3cb206157aacdbc26e446bc21a14d49034627bb476c9b620091431ea590dda99280725277e81532655e7f1e910470eb26b33373e3ea08d0c76b4424ecb0d79d78734df5934b548574b5944310697556b7bac23071ad838482192c44f7cf829c1a449d4d4661ca3a6862350ba1078e63619c5198378cc83fc1df7168f3d4b775a923c1287dccb4b8dd6280c5294ba3e59dc04adb14f461c1e5b7de9ea9aecd4550b85b681b66c6b637d8a607142f2d69ed1c25d6ae0c5525b48a63a13ad597303b451be63ba66eedc75ccccd40765fd9fa853a81e63e83292c2de8c6d6f415d8e6bb7d6c4bc070eb9a456a2cb5a6f59c532aab890a2f9dba868a1125817231eaff7e59268376eb51a2dc920d182d176897d5847b49c217f0322e22c0aa6ce63d67110bd3944a982125e1216505da7bd61cf036a548197034a7cc58612ea387a6a9dc9fbe14908908f40c06775da13e384ac2ad72e404435b387fe52237082e8e708d87f29def0e6f44f89e9eb85f3560d5661139281699a8f970408881320c1402bff78c3569c9484e13398030a464d8d764f6f70d137c341d5fd111397a9cc0deb4fff2a253a6148fe01ee9676ff1ad3db52c073537e72b869c4d247ee53461987b433d50c176b1b26bf032b8384944290d5fd8f6c7e9c1e90b91b1c15bda0eaec5dd6aa08b9ec32852c60ad47c4a7c846d6954e88da3586bcc26f1271e90888266f54b54e3bfe31c02a88a50aecdca378cd81c02189c8d46436ebb4cc9695347d33536bacb80d6666b0cef3f3a3a16a4b631d197ba1212aa92164d61aaf3bfafa3bf7e691dc2363f121db81e95c49c8f84ba8e26f54ebb543bc7fcc78bfd3e83d550b30b7e55f90b1864aea21c4babebeb3a09013c37a02b193d15697104f8bc56fe431f655eff81170712f0f269812600215c68cc1ea446548186c3c86c43504cbec79a8a53aece6c9d683f5de3c5fd588ae52096e3d9c1efab578fa0aa902257546d73420bf6b84954d7b8d9997e9f204279dca44742bdbe9e2ec542e69ea41927bea276dc091dc6409ce3dbcc514944961ca08e5be73918f6431acbedbbe3ee1443345a5142eac0cd457fa51671150092f3f9137f83866abe5e8a28079b36e8cf042c122d723f56d7808ecf26b1e2c3ac53a12c3247b13a13d5c0790baaa883e8e696b799b23ba58ead308890676b35c466106442e3201418618589c805b7fc2fc2a6b023d8471dcd6c083c3627c90964ef5313771e414cf48cf4afe6b6508a99202bc95eae717769e52ed24452c267b6a789329e351aade4756027b14949a248aedc23aebc17afea089924e913c6830cceff3a670460ba0fd0d1cc6b96e0cb33ea64ceb5b3ade67303547b7330c0d9ceeb6b2f71e6d60cdb2081982483567da1a1a7f0a413b4c6e720035550eaf902f34594addac78826b09b7196952eb72d924782296790d6734e0e3c29b414224564ecf307fbc8466b70ff638238977e6b2b1bd0b60dd0f1949adbaedce51d778e3a92296f96cbc047007c457de78093d0c6072d4e61430cc89167fc073d2dec81923acec6e5a896ece6307b7c4a62c542b4995f3e16a81c6fcc70b58c596c3e1879fed05c1e3639ae61504c48ecaea18e2f255ff09ce0568f1ad9ed298022b27980fa9da7b5d2a84e4be56dbc6f3813bb443892bfb698da902a9d7b3f85a86b9e6f34172e6be038704ad825e8636cf341e9a5b1c34d53b7636be62e2cc3168fdcf99c6d84544fc280918134a5a6b35fc3b817da4dd28711ccba44864cc4f74445278c841be91d4f8f8a6594a5104199e97575938dfe086bfa4616b742409f06f7df7da00ca54b986fbd20bed4bc881050d7b5c62a9633a778d15ff959b2832aa5c5565a55c5d456193ff6befde5f7be58d0054210fd9579ca64ab835cb1784ef6028df3a65c236c56ab5e960e1d8b1c7f2503f5cc5ac4b25e58ad55b452917a9f62d98e94d1fd58e2eb2a52f9269c14826cfd2e983657f83c1536b25cffe5e5c753aaf6a6ceea7c94302949ed7fdaee5feacc2f5d4a5659dd673d9fb45b948e8c36a65b1aa1f2b90c94a973938bc185a87d8563f9a9b3beceef98d3b4013b31f4fd9c92c6cb61bc65617aaecd4f5ad3dbd49bf93520a77cd506e41c28226aa6dc16f4c25bacd16bc889161b9ec39446b1e88e9d65b1dec8d575c568511d748d1b2e3e977b3fc91f2fc1190f0473601628284d2814dd681197b9a5244f379ef286722203997978cf5f830391ad1acaca6b910b28a3a894f807d02b30bdbc8a2bfa649b1a0b10956c055311facdd3d5ade6339834c085543ca553d7008103f43b58cc96a4211f35f0de33033d0e73d8c490e83334d4e7c8b0a8dd8bf686f4cd26e79d191a6675ed85f72c52b4a86ebda19cd6ed01692fa9263ae453462e331961b2a862ddb0b79a3341cc727fa27d4202a0bc98cbbe698848b58a0ea195ebcbcd2b58df7e628b69615ccde5aaa14f8eb9869769614c64e55355e7a64fccd48cedfa2076831a0c0420d736ad59ed31a65e55e15255729e2eacf88ec62f0cb69476ecec16a814f705452c5ad6902f72f8e3559a838fafb4acf35d5edb502b9e5f2c5c1517b616a1eb76c0f9d6240b76bdc5ebb0ea3b40145eae000fa9d42412fd3788d9e7817185b930a6eef4895c61c37fe7cc2e3f8c71e5575cd44662e08381f314e3251e35a24a680b97af984818d3eb8871967ff84c0409c89a1c70511bc3455379204aa6f2764eef76652335ad9a6d1632d782d3b955081dc72f9e2e0a8bdc2a42c95954d9f7935d0598f104aac431b09d73b58cac47e2a36e4e207fab3773390cd83e50fd37c0bcfb587ac99b6f30375e980a840260b203b79a7afa81823cf02287609d4fcfa146e6ac642b4158149f7a4cca0557a69d3ff5f733edf3e06849a0845742e0e11432d494b6bd65f3689b2a67d531ab7c5e82fb70ad2340e30f2c49a264496d0759224323f63a1895a43fa3c44c83073d943648fd414b3f74f10e46f770adb19f5470b7da00abf5ced32b191e3decac62d7a97463ca5244b40f915955df7fb20f662431676038156331062ee94e1347c5ca0f181a65049218917bc12405e33cd2fe3ee1f468e0726b0c409af029bf214d61dc0c0cdc26955765397c77a12336224854e61959e735b0be7b501e4271f0f19b2d6b570a8cfed4093062293ec7c2c18e22c7cadfb4e2fd62f5179b32e60a376cab08319b6a348108d2a9deabbfc07b9526d75a32ad05085d9c3a9b9f47e6e0410948793a11c96bfad2820c6dbf540a60620bc0efc338dc9522be3e8574c422f7b0f4bc128fcd30dc95fda6a4a73a5c2887620e5192a54339703d79b369117d603c9e1a83d924215c7aa3eb12bed2a3bab202ec14067168507376f9fa2dc4cd435fe57559a934d0d50e8574f5b811ea881ab579de04b4d46a55539326847741eb13dc4b400b5cdc55367a0dbd46060ace696a280f638c7956480fda1a8bd91dc95607f2bc00c2247b9a5eaf478eca8d1d8bbb312f9de172b5b6f120ff914c48eb7de349a497f4461a02f9b5e5eb43457bd2240ba523ca04570121b817d007aeeba11c17e756ddf3364bff5da359806c705dbdf8cee8b7e48dd417426de632d27fd140a53aeaa62293c5dccc2d8b6f4a9ac9b0734216294d209a58a788fa18c75ebfdee7a92268f108b12f4c1b83c9d5be8fa4e346877075b41d51a7c6c5e9c548b83740995a87fca255ee89ace12a6493c9486eb7dccc9b02d67f53b846bb05afc56b1a064d86080258d6175492516995a19a634c37707721209125d6362cdd600adfea90bad40b0eb3ec7f8d9eae2488f5a86915a29d3447e7597478530a2f086ceb2d4f582cd676467804fe98e280c381dcb2932889578ce6a8990d57710ad256a6c8398ee412649c14fc7fdd1a0f3a848d482d2e3b770e00d5eed8f26a12f044b8e57578687d4c93bfb88df125fc104de081b3a5b801e26e2edfb4da4e3257fd7d10515a2ef164ff78c627ba5380f704c3bc0c093d9b32cf024487e491f4d2beb110b8aeb8ce70db4006c240088f4d1a60e414a84d851501418b21eb542bee74d24fd3a6b7524b19491ca8724ecee9ba9b96b3f26d3e4776ffb93148c45d493a789d83de6bebee24461de41e017039d1980b67eca5c8489f14a4a75d2221bdb6d479b6bc9814e5b312d2aa485700190a83e0df213fafff6e158e50cb05c570f29026ad700ab9508df1c1c10abd505952ca0e6c0c6bfe4ae3b9ad7d5110f11325650a41cc050c28e90ce815c0ef7fb4b1e327a5cc2fe24afdf46e4db41517350372b77381c69b8d00a98b4ccc451814feefa516035f0b2a91bde09db77ca8057d4266b2951775955dd0541cb34d74a4db39d35de5f9291f4655c29a7babac2dacdad8cd37033b9cae554f05da38a321b205ec0a0805b85edf40966b9acf362ebb585c58bf467e4d5025f30dc1d52b997acaf80358711f41c4ee3da5c7df582e4d87029229471c5d06ac69cb5f138558ad1a91b2c7e5d5308856642827eb4799233ac8a58048dd2ee3a254a5a13250328a35ad75c505aa6ed342d53d0ae11b2e91b32f97aab90b0318a6be6742987eae3fda663b44812b8c924db6c539a63e74c1573b22b4b52dbb1d3a6e64c2a07248e0af5c7f446470615049e9f6cfadb2989eca66c4bd6877cdc4286f4d0eee92ec82a8185af5203ee8368730dbb0b9257afeca0a34aeed888672ca74b2900ff8204b8cad939d07df4c215732b11d4fddbf0fcecd2f41bc3028674bad903e4b0e2e362dbfbcbe471771de895363937a63cb5086678e3594e7c09cc29ae4bfaf2137e086d5d4c28a20aff0e24777f5c5aa0587a5a3e82fc009a9a873a1f3a06fba77772716228f1c7c5abd2a1cf38de455ae8bc2c5b08e9fd2e469c4ed41bc27de3caa3f82ce00d8f2d76089ba66d4f00d13d0c5c57287aa6b9fa1f758f8b76caa09b662964fbd719488ef500197caff04c751384a5a83e4efc7693bc727862c04231f9d1ae15b38e70cc710ce6d4521bf6e4e7b89c0b369aeb0c8c6afe240b22d814b5738936b6495f33b5f5cd4327e264a1acc9f7d2080038694af34dfeb4a69146e8b872917c6b5ad755e4338b3a191fd6ab53f465e571d18f5e8cc22f4633afb92d01a8408247e5449f3a41eb66c959bbb9ef416a0a790503f534801a95e41dcf8284b2ed1d91f2a4bf174d264a33ac7d82b188006c8510b0e394fe60b84f352c8f67029bdd15829bb65413f0a650ce13170c7a52d61ce26cb36679ddcecbfd34ca9a934bc5a801ffaa8b62f78a2add22ce17015ad01b06cfbd1c5c1c00ee4b7129ed0a142394784535ebb24f2028d9632d3743c63429e5aa5ec2f0bf5939632a569cc31faec9c0f962678c64615f7eede107911a7feec98884f94160e2527541c728e620f708b647d54d96e3c4e55e85807783df46bf7b5a9640f71c8ca1b7f35d369817625ec824efb6f64aaeb98a11f3d5197ceaf3f2129720536761d3ef4e0aa6e9cd6201b5393e55ea6570849cef792461ea65303edd41e202d279555107e2a8a81e135be8acef324c421d19335d1f63f7b612623b46a182a1d38e9f8e0475800e010f586ced1dc8dbb49751023ba70c27e4a7ac8c6cfc045b65fe54d7842b9eec6768d024670413c49eda57d780e3a745bf8fed7490fe974737a943cdbb9a1c7e309fc31148f1bd0aab135e5adf6e856af3383e1d7113491751638caf37f2ea9de3917e680c77fd255c9d938a0080bc9560bd889ffdecaaaffe432e4bc8adf53b0f99015756ce4c5e435094c5742e751526a59c212e9042967502a53cac0e541ac50fef424e7b19bdfde79c4d13d53e467892c91edf86c69446a5940ce242a0bdb726ca17945544e3979aa8591a090c27534cffe9a5aae4bf50b39ce66468bdfc7601e2ef9d47ea32f63e3a91c22fa4960332565401c977c98674d675c281ad91842aade990dd7325360aba6a77b60ccdf76beea285c15a22233906ce039b524d730af213b3c5139355e8572ec045d2392c05f0a1c82440b3df97b515d912de448646f8bc63a710dd7c05481eae14e120a25ce9490f7000d134fa9cf3e5904c7203137e5c6b7999d073950166a931c06454014f521c3c5280395cdf99786d0877f51f800b92774853c0f30059c8423771ea84e06bfba1610257ca8c989aa7ecd5e73def82b538d2986bacb6b0f458c067934cd29ad551ea422742c3e12924a7fbcf1165beaaa039cb5fbf55eb05c819ce95f3f4ec4b11d2c3655b856b53e106607f9e9c8cdefdcc88cece54b01c5f81b46146cd146b7826c7d9ad93fb9c186cb46bb7e258e5e83a905348171b0b0824e7aa121c53384844e542dbca334b7310436c0fe4d1365a2301e78f79c900881e124fe20130319dbce3d4c68b73290677495eedba5caa53f8ce246a400412f5f1f4be8b6f13f6e575c1571d5ff6c274a8064591eec224ca81146ad772d3603b10db186d22c6839597d89e6436fb28c4d8677010e7458a65651f928567d4dad0d28e1c4728f056dcdf30cea688d929f439986247e173c685394b07bf4b8d26e916874af3e0a6e650a39e2a3fe4a9816016d5aef84e3cd99ce6c1e93d7d56238f53ad78dc0f4c386a5c21d45b243902607a9cf730e4183518bd2d968ac6ca82b2fb67dfb2f46bde8478e5c10a5cd7167221e392f8478ffac9787408f35c64a3009e904186b1179b94d571a5e01d790dc684eec09828914f9c05facc660b003d1b98b9301d722f6198d040377f0b3e8000081676ccc0add35383e5b2adf3d3f8a461109e678e97697666712eac072090eb94511f3f97e905186cd32eaae0e6f196db5c1123437884480b2ccdbb95694bdc0feaf1f2391f020c9457b02d1939c83b386759c47316d2cdbe8c765f2e25df05995f8a3eae348d3c5609642417015d966aa991974ea66ff3176d08d00849d88808a21028a8b6ea396daa24d99330cd1d3f390db7ca46c0b810be0420ac4957a0e14a453225320501ca580345cb71b3b567b3e487cd764cf441fec6246e89b129004182b374ea4df53bdd15f4227dc88ae00c8216c184d75ea8aa4a5d604b0c4403ef80f42c7152bff9ba9a22d30e34487bf0033c21a29d6407154ad64e87e13cd4e2c0c6d0ee0d59421f678252840cc19723ab54803f1adb66eb9aa56465c079887d09101e62b23c4e513242dba9994dbeb241ca16fa8888617b6cac2258d507a4bbd8e428dbb8ec71d341c186257cc8c0a657392a239c9e2c15771d14e83fb8818757704d07e07887e106b37587cdf9dc269a007a31d5fab398ccd4a09549ab9718156a892aa82a26327347da40a065ea5838f4b208fcaa462f29f718d981253f769071ded21064702f49697ecee70965466d56f6c4e961b2317f379f657ef561a6d86b05535726e79cb89a6582ba228f29402913164dea1580003ea5c17e0bcf44a26d21dc189f1b5996351ebe9a9ba9eb08675d167208e1f7b8f3c655b05a67468ea6c7d8612ba0b7a7cdbcecf735568394b404c0266f480d1800e7935342272d346405ed2077d4b16529302cf50be2c4150a112bf770068914ed6ee2cb73b4ce68c80e087a31dcf01f53857ee3f04bd3d6385bb3fe4eb47aa682a9633f299ab45504fa30bba25a20181ea50365fee81889443650d29450a0329046b6fd2852c97fd42a8d6288a74733fb5daa8a5734901a1e8b0e40602a430d721efe6d486786ce9b85da93d80e8c0c12dcc87f72017ed466d1482344eebdb72444ee2da54c3205c10a8a091d0a1308cba1b64dc68eb0d714614bf5ab5e0e1d6dc5835a870e09fab0e97dfbee9de3d9e45bc132489ce3d1114e7ff1e30f3cbf6f228fe7348ed55471ba8b0716decca75e101c250c8f1d613e9bf0c40b7a03968518443cc142842221b0603efca00584161fb21bb020818926c876c08204ce5dd4576ee07e61b1015bdcaf971280d00de1d323134b99ea51a7582855d0475d3ae9bb4164e7c60e2ca3b1ffe43ff91f6a471dbd02d4e69c6d4347af002f4ee3a04038effb86fee6e104b1aa94ac815299e4df8c73f6c0b1c8e284216459c214ed20adcaa6ac3d928512848a7670430dbe60507c5005113ae860adb5292f70b6b8b1e8a2c5931f9e40825112580f561c618c0c0c1d72d87a10460cb8f8c1890d37f01026c9078717d20b0b24271886611804a6c082071f2051f485123e8412b0c801ab825a11461068b0c10b0f7c40a58b2864c000dbc1042fa31f54f811f358688ac30eb04ad3a04783fb25c50e1842083d5ea14165ce89655224ad70bfa4d062d24aa552c954a158cf81af570babfc8395d3b66d474cc22affe2b61991b84b8da37fdb5880f13b8f368ebe24b0fd7a15d5c0fd7a49c14f8750bd94e2c704710047588afb2545ab251936e84816fc19c5129cec203d4631466683fb15450fa2c892443d5284a31d18010544c85206abb528acb8200b31b4a0610c1aa81811a910e560ce395357c06c81c208cbb75108a9748840c83be79499084dc909657b944c53652050d1875e06fbe1959e11986300810ae718700f7c7989a832c5aec1fbf4522b36abf2e71bd65885e3c5994e5e3a70b53419a3d795a42cda0ca0d71357b61cbd9ef882014df11b29425ec54aabd5e1e4e81568e9538161bb10c202a0e8af4087e025136ec0b1044b107e94525a81a7115172f4e6681cf355c0b3051c6dfa663ee7cd1c3f5234d5e444707cf8cd99b95e20220752be1062092928c0747882f900290618866158bca1e70d3ef002888d0745d002872776488253ce2909a0c3133e5a580cf7cb892710c087971361d897135f946007a9c54910aa1356387105899a52428c51ba7faa7eea2e31eca252cf11720501fdc4169824a4a32d46af22a221215710d08fb7c024211d6d317a15110d09b982807e602b499118601812a407cf0ecef72a4be30d6d9f2224c51525080ad0931f9fd90a03e64b9217a42e475cb66831caf2ba526485a8cad0142129ae284150809ec81fe9235b6130982f495e90ba1ce1c8c5bf2d5a8cb2bcae442b18be4cac2273641cf20f36a055a9e7c0c7b056a95494cec7eed481339940972b68d950f6370ea861d80fb3a8ab2ab61fd288f147e3801826bf3bdfc02adbdd0dbd3b5651a9e774e350bbe9dd6982edf78657409fc6d1bf42c2c6306cfc9294f26569963efb5aea52e931997d2c956ec81c52874ddff44b69a5c280b319638c47266e2fc678638c5147e3d0c2c647c2aeaad8f89d819f4ffdc78170673103b2f1e96331fbf9547ed693bd7c2a367751cc30ece6ecbd2ccbaebb32170aea9bbe34c677ea39100ad1385429f78edd1da571c0d9ded0c334170cdfc6dbf48dce417333f5af1b626424f12fb61552cae8d0217c6c4305dc10e78831c6d88ee35f3f0d42ad34424f7637f41a6608a3c396d808c4f16626d82f74e853d8c611e3f412c4be144208a97cf83146195d89fa594a8fa671cc19259533f60d7a851b8d634e2d621fb10845504d1822125eb1ddf276479af50eeef9a7083d6b658c56222cd5186354417728638cd325ab0eee170f5e30f5dec6bdf8589884e49f8dbb5f292a65b15008ba7ed502d4bef49ce784fb2ecbb86f4c9534617141b8cb7de699ae474d5ce9b94c268bf52007f227d8ff86e14ffcc77390fc5d2e21fef96b5e10ff6acd1238ceb3d38b306dfd80f1561218a4a4a38c3e7dfaddf46b2398443d4aa9c948c42068235cbab9c91026d246f46256544158f82ecd4d3ba8f33bde28638c32668865308319cc604e49cc331235ffba6191c7de4e187032e45f3b0cfe3915eb5ce94df533cee6f937717f1edba1e4246e9e38afbc99480a639e39a9fd6da3b54b395b7677cbee38e38c33ce39e7752fa2e085ad31d41b05a41217f221d991e5ae78033f85969d0f1f7ef11c5984096a7002777f1912496929ff2004821204e4aef81e04545d5268201272f9073f432ad65d10097ae9241c5da631e2cca49765524a8a69190644624d85b9749ffdc5a750662944c77cc8d938e263790458becbc611fd739904991cdc638cd15d42f7ee6e82c148c559d3e590869e02f78b065ce0eaf0ab77a418ca17f2414b4a8fbdbc13a09fbd054a8ffd122a42b02ffd92ece92fb9b01597d09ba16083758c29814ce800c40f2bfb2aa9bfcf9f71f698b3747bbc9218af0a089b2110108540f1e6aa58603304a28fbdd35f82fd5c42450866fa55fc25f4aee21582bde9b1a75fba4bec53ec210a4eb858a5a75fa262601727de380b99a784092c3a4a428845456585092c42c207894505aa9480503c080bbd4277bd826b627705e75dc1f916c03e7b0bcca793e54a661006146fbc95c4bfde02817a2b02b56861f8ace935cb814c4bb877b7673de7a440d8ecda60118a63d21b8391a3fe61de0e367f37b20da689db8e4c857d8ac2ed471388336c8ada36d555f686e794aae9bbe3f4ad058861961dd91eb44ac76d9af7e8b0e96df60d91fdd1f7cc945d29318d086dc77322c690a27cdf7c4079537e63a39277020725580d840314d6b6040e9660d5504103ab9e208955e32809563f4ed4a971031a585dc50962c0eae7893a359a3062d598020c568d2935b0fa87449d1a47f8b0da280545ac0a861358fd45a2ce0c0e5ab07a0c560f01074fb03a0b568b210410c2b0fae11735b01a0e5181c2ea87425147c715376cc16aec0a56aad503ab1f16451d069c008a17ac6e2e4760351080c06ae824071eb4b01640469820b0ba817004563f4c8a3adb1090b8c2ea8760a2ce0c2bac2d095b7c60f5fb4fd4b1f185d50cd0a18b1eb0bab9d081d5efaea8d34f6869620b963ff1a18b18b01a5e8185cb15ac7e278a3afdc4d018276075562507ac7e7f459d28041a7c7e585dc760758d82d5375a2005ab511083d5ef495127e78814b0fa1d4cd4a1b185d5363becf06383430c58fd3128ea94acb04e5a94f8c26acd05464060592b395ec1dd6ad5d062e598c5b672d412434551abd58223b072ec82f918b5688062c4cad1cb5cc2a8d5e202042bc72f9468a8d54a4207568e61729c50d46ab5845859fa401a865a3e43706165f964fad06ab55e50042b4b2825318c5a2d22a22cc1a8d5ba8207569652a018b2610b2c7260653905cb51ab25e50656965588306ab55e70042b4b2b520747add6105958595e916206ac2cb35001d46a4d798295a5162cad566b4a1656965c8060d46a4d9982956517295cadd6942fac2cbd4cd751ab65840f2bcb2f9507ad56ab0824585986d14ad06ab582d0032b4f9f1db45aad2d64b0f27c5284abd532e28795271428865a2d2a62b0f28c82671449ad16951e58794ac15d049ce794c8c59b121105064ab8683084137e68a1e086ee07a024474a10a3862dc2d0a2450e48c440e1435f09e20b134e98f8011440604f4a0003ac8a124cb181e27e31618299c54998cc09866118564312a4644e5c590d4a603e3870e2653a6902f37182c5886c87ac86221f319ca8c009941a56e083854fd0124e843003ccc70a4c8ae924cb747202d30ab61ab0d87c98e0848b520d5e309f273024d42838273d30dd60d2a20626947cbe2825ed207d8c40392182fa184d2758780d48d2490d309f32680d5a322735d48004adc2e704196a092c2b4a90c29ad86ea0e2414703550fba329ea072123334c1dd2ae6e177f7f5bbdb737aedebed89790ecb486c68da69d358d0fe64e266688257a8efb1df3dc779317772777eccf7982e1288ebd7fa266f65bfbe49061f9a0fee63bed63aa36e35dee4c1168ed15a78f3f29199af41e36df733347e06024d5adb68fccccc8c47bf763450dbf7a3be7e4dea6b6f3dba4a205dcc57cd43691705adcd3694d679784b79a798467d95b79bdc6bfdf579220daf717b9ef5aa97a1501268bcd2ea6bf5b91b33540e50a8dafde9f439a6c66bd7decb4570e5acbdb948cd6ff6e65ae365319f9d22865dd73dcab35ce5b6cf9eabd63eea3b7b5731319d8dd96e8fc6797b24367077572894e5663c279379ab1e8d536f3fe6372f23b181eb5d71cfd53ae3ae667cf6b5a3a152a95434ee6a46ad3277d575d90ad5dce937191999e7644ed9766580486c60ae7bae7b8ecb2bd423b1814fbfea90d8c0a9bbdab2df32eeb355f7dc67dff6ae50b747e355ea7b621ef5a998477d4ccca3503116d5bfdd1e8d4fd77e67bf7b6bbfb3dde59ef372132b57546ee308198d1da9ccb22c9b32fbeac9995189bdc96b20d208c43e661018f612a9c2cd07166594df110806047b1963bcd9b1863bf8c1f027180c1f8b3ee6bb40b38b4120d35b09e978e3f21e8138462410c326d4593ff328eef0b67137f372924c71a642666e8d6c7bcdeb18176e5ea279a8d7bc7e2de6ceb83083aa713bde7030cb31cca83f83665e04647ec6631e90eeb7afd0ab368a4a6fa3c8bfd69b9b208998fee6ad7cdc9e52c43d343e2b7de5beeb7adbb29ff1ead665decc0cdd4cf79907b9ef381fdd73d9e28c898ffa5a7df8dbc60477db37ae5f2fc775377fb769db6b703b3dfc158faec77ee32311c2c6a1799ce7318ec5dc9c3df7ad3dfc2c4391163e126b66840946b1e038f38c408ccab8ef47fd8c77243e5cf9b83ddc779fdd1eedb7245d9793601822f5aebb5948d73d4fecbc0c5bd87ef5320cb82d77336cd9af50832dcbd16c07ea65f5f2aba2f5ecb79b5da8f1db6f31a713fccdd3eefc2ce2d376a7e6f59c2e1288b35fa14ede0af5d99fbe5e197c74cf3deafad85efb2cbb4822ceec0fce6e0ffc7ed8c21a677b647eab3f63860b333366cc98e1d1cf4af565bed2e7b22cbb19e2da5e861477ab9ff92cfb1a5e6f40b6ea75f576bf09e12ae4bcecfb67b84a5da8b1c9788d6be94b5fc38b1b10fadc975ca871b99bc84526b2373d8f73dcc3af35e67b8e445ce37af5b2ee6b78b546eddf8a6054cc968f64db8eed396f957d97f1787685d4d8be765ec6715cee3ea37efbeaad3ad40af5fd32df7d7dce5b718ffa98cfbcd5e9ed675f65bcd4b6552ff5325e4dd5cc6ddb738ff2561beafb538f7a6b7ffb1ae3699ff2627ee5cda43c2d06e5c9004f57c8ea57ddd7f899cfdd1552e36736eb75bff2666a78339f79dd5b2feb4d488deee6263337dbb4ed884724e2ec22716c4309ac09eb0fdf48f64fb1d62a4ae501bff4b5e4d54e48295b21f6d27853aa9f6d6ff2b8bb7d7ccdeb29bde94f57156f4cda735ef6dc9b5cb0b7238d3726edf6946af7b5a4752e9cdebee6753727c10f79e2f6d27ee769dfdd476d092e7d73df516e2e9c6ec79b8ebb99892dddedf4ad952a8f92e7037ec97a27ea82fd936f3c4a3f6b12acbdbda5ef2fd19c04e7fe23910eb14bb0212a0ff826887de6955694529e689ade95b4a7268ee39ef332cd4df0f63909debc9ef9be65bf651a7dd373f44d4f4ddac5b6db33bf6eb908cef47b66dbb671a026d99163c0d8e72218bb997e73df83bde9b96bfa8e01675fbf1d7bb941a0095e75a6ef4ccf5d53fbb7dd9b99e04bc4e9a58e3d5d7afb21967510f7b6a374794cf8990ff8f3963c8857a65ff9b8d8c49e2d51b7a75f79401ff4e13b2e79f9c31a863f4d25ada4693717f91efaf135edb5dbfed5eea10fff74fa7af2b20a9fe8d7a89dbc06d2bdfd9277bab9082e55d5e312f7f2e310acbdfdb8eda8df7d8c77ba9989bd72f3e19876d7f431a51ae371f5e2ca83be0ff854f3aac903a27dcd9007fd69fa7ab3e91e91a5928f1e4cf001302feeeedeb50df6ad7910620d279401e2f852cacffec88633d99836bf62a68961d83542b33b03f63360d894917a0c43a876dd104a2803c4fef1b13fb2612cd29f5e9c7f8d6417890772130c679833cc4772c2f3ce00ffc826af1107c3c33ef6d682ec913e9f05bf0d53c8472046e23fbd8629e0e8829a24a043f718a59c13c3324a4bfe512ad15dde4ca394d11d4aad524a391ffacc4d5a18c2f70f2787841f3ddec0813b50d4b699c1ca145c7ab9054a165cfad209c3557c8927865b32188768290e15c5a1a11987e250f63568b08da314fffca97fdefed92d72cb9d9fe116eca85780d86112eec691a11658bef4f6a48704627a73fba77dd98d4798946a8306b604553318d2b6adca703fd5fc53f506e5b7bb175092a8e76834bd83fb5337b04fffc3c154985723088bfdbc99f6883a4d55f87495746f6f4b2e36f76b02bd820c1070fc20bd02f522bea3e0c5f2f817ff42b1f187449d8e415e9166c8e67e0d7905c1b4927743a757a08ec10d48f6f2d634c1e62638cb6872608564d96d9b1e4651d5793bb17ae9e75f5954c1a67f6c2ad53719cd943e9f4aa58770276e3b7947339db49d9d5ec171e95f88c173e2973e01ad43e34de96d13a552a9542addf0aff4d0abf793a7496347ed665aa2115e161e9bea4308e3f6a3093679d2bf4ea202de6067bc7400d4ada3d34d5c83de0f65613f3d21de6261df5e66821b89c4f3573ea00b4f29c4b2b039e52502c3bc8e37f1a64b8c3addf166d88addb171b401ac804f98e8934e13db13bf33ee221d8630c49006dcb73d24b2850ef767f92b1f262caf912b300ece5d06ceb1210bacabc0426323b00cdc6d44766f2c50ed8533cd6b074838ab6854dac9f60a2aff3aa8de48c10e58c01becc45db443165f149c35ec7d053eb1f0e59d510bc0c58d1e0a40040bbfb5da36392bc231c26d488e4038027928f0f78490d2c60f16c3cfaa9fa803595a8df30a8e39d8c679fecca9ddf9439b5a193f3e1d22a9a492528993c373b2a7b452fa254c353b7fe68fcd8ab227f03d258000d0c5ca79058531ec7c41f8f13dc720a04f02277e4ae5396129009ed8f70fca1f2fc31ffb36b039fec420cff1279e13dfdf15853c67e58de1ff60f8ffe339fefd8a51081a57d81efdaf69349988afa5accd9b70b08fbb0847881a7c7181e784dde9d18f43a343759fc63fcf47bc4a1370de91b2fd5f08ebb9ecbcaf9ac2e66f35bf1ff03b6e780eec07ecdf63becb2fdaf9f58d63c9e2c252088c8b0984e5f4a1819d3f77b600f0c4629fa7f7640a24dc2f2c493970bfb02881bd28ea74f424cff9e239d8536aad4af59f7dc99330c6f82c60eed1344deef14449e341b192c6e873ba43b1be333d27fbb983f30c4df24ee6e520b2133774d8c05624e227bd817d9c77200b6cb6d8230f2a9511a4607f9a96299bf96d039bba0afe190faa3f4d0a435e09c8a6704bf1830d70c0f862849f1d0ca8c7173b3a3a0b3684fd69686cbadbc6a87245a11f8233b0425f7441cc2dc1660c0828eac496c4801a03c2802612306582c568c0fed15f13a971fc7847d88c8393031ba24540571c1afa420bf64f55e9621176e872211f7215fcbd1b6c76210b7d0862e853a80c611f5a41c83f77a1298dc387a20f6c8e4371c8e3908d2245684a169b5bb168b6aa0f95f9363c0bfbb611b28408c75fc5c07a44fc359fc8c23b44deffc1c691cd2aa3e789371907e70b2bd83f878a46472aeae0dcffc1661cac81f7c17616341ae8151a0f11e239f05a213635a968a9c0b8b0bf121ff9363c8b3e0621ccd8c4300cc3ee4ce22a804912755a9c183653087443f5b1e16790abe02fbde97215fceb0d6c76232ec95aac1575e43bd21637b253c8735e5f68f11c0f8a32c5b93061734cc2fed5b760376a1cfe52e6f862e1169cdd08c98de4c55aa61cd86c53d95114b66dca46f3a1225f95020c6cee97e5c2661ba5b0d94ee1fd1042082184dd72f6ecd9b33b1e51c28521e7c3a3961747d83f55e408f491574629a38c52ce38b18a6118065d49112fc93dd247b08beb7ceba936212da24256db7047b0340cce30c8837e9e508d0642894285f5f716ce306805bfbf0a2f84b03fcf8e0bfbebf0e207b3dc85c0b9afc8ff6c3a1fd82d7ed34714c926a97a00e65b7ed33c55fcf80d069c80f19c24f8e0238e6790b874c2400d40b5f2c40a352712c28d31d0b2e2397d8597271870f2c573561870f225eaa0be7bd95ff2eb8eac8b78a20e8e6f363552d8fc7f6505406c38be6f3e6a188c79c4255fb00e143086cd4712c2fd42e27271bf9088f0c72094e765e9674b64e1e72560b07fe45183b1db8d63debc2409e725449888bfe21005fc3a0d540034c2a25aa9c23305431d104ac110429d4fde07f0d44461db891b965094420bb500c718a54c410a9e7640eba85a075509f46bb0bc9988bf70bcb4461296c61b252c8da276d47126e8c0e5d55852f033c452d2647c91c31616930d08b6a0f809623181b003b56d4cc0840c8e581546814511ab8d78a084114b053c60e16209c065049722569d5ddc40882156c54cb04412ab662ae04110ab9b8002c688d542b0c16788d55f04e1082256ad5af4025084a41b92584a04d022a208442c260bf029c20fabb1f0c20623d6f7050a767f1bcfa1c1fed45ff3af2d27e5552202564361042d7e586de3d1871a1920060f492c252a5811c6118b09aab5c5ae8448251e049630462c29fd8bb025bc42861118575094167c253d7a83a10130a4b67130411404ce1667095f46081d32a1b60d2d515a8247248636efe0ece8f01f9e03b1a79023855ec133d3f7a75cb31ff4e4767568b7fdc6e10374f88d27a015d0381e4feb04ec65af5083fbb71da58f1efd92e7a3e1675007bc3ba723acebf09b1d1a50b025d4b6f96edadd6472ffee99be898ffb73e933897dfaac61449f4253e9a6fc939a855f189ba9dfc08fa988fdaa1a47b4c266faddf0bfb468e2a07ae907ce340e7fb8b1007deb4ef9d7051715f42256b547d7a9ef697ed3ad00c8650c9c1d6741f8b0858ba3219c298e9716a17295ab5ce54fe3153aec57173dc0ac975b64caed11f6039d8a4aa148e44352e89314abe1353affef31f9ec43ef51a9f9f69c9a87b0a606974a5a95534c2e29bd42728a7f9e9442fec1cb43c2d2974a39353fdf8f681d2ba7749caa79a5506e304afc9b9fc4bf195f06c1d02b34d6817d53f3b34b566a3ea7bce6b367993e64e3fd08147eba3fbd816d024f14bae0599ace05db76d8a8f16abeb71d36fed53cf4e4973c16e04b1ef03188829721aeb936fed53c8fd7ac6116b96e1c352fb51a221f721b5658d3ffc0ade636163ff38691c34ed6c6dbf879e239415127c99c70e298b88753382821b5ee39350fe1eae1b683e6874005603fdf850c748ee9e767ea7db618d5f0516ff2627ff0318f0686ff1d84355e8e2f74d212c6e3317daac18d855a9a621a1212f2a12a442f37f22d6ec5b3b8162f9a9e93b10fe2dfec998209492121cc83b8cbc67536de8643b75274c58750f81a358ff6d8781920aef9209e93e10fcfa1475a2ad745f1cf6a5306c9201b33b0335ef5331f5f0a094921cfc15ec7fbf9b268d69f2fab78ce7605cfcf320b9e443d1febac149242728a1c62c1b124a2c9a7f1d987e8cb8b04d2fbc33f1b354f1040838d5d3cc7c6cf8f4851e73f3718e9aa79d37ccf931b0268b05906f504f16ffe11887ff4c8284151c75d320837f42af3a14729b1e9e62518fb98e4dffcf7e217bf99d9e7f6dcf322cfadf837df5d13859b29ae71570d2f435ce3b18d4786b11bc348b1f0572ff333de87b46cf19c159793ed52cfe334980fcda743f2ae543ff3b9c1dc0008d702f73e047f760b1c1288e5cdda97bed478c653d1f088f89fe1c9789e0c30c6cb5ae643783eca93211b1267d723eafc9ddca659f8df377de502c8416d1b79b2fe4de95311b083cd90c8debe90c8b30f3de939ab7879c4b76f79649915a845eb582f30169180319965df798d136fb0a7168b5f33af6b11cdf4321eec9bf8292fc683561a75ca2ea47a94274f39822296619909c7bfcce413630cb55608f405679969ca2eaf2c528be422bb74af2b451c07adbd48208fcc73b02dba544aab86f2a015ffb0c77995ca62367c605ffbcc7f8eecc582fc27eac43cf60ec573a2788efcec841d798e7dd4634018f3208c611fe36547d4b60c83b3f7417a82b39f5070f676fbd104a3ecad5de7446cf0ca08c4a74722717c231d8ea887017591407cba19da7bc3bf18fcc39e03fe61db860027367b286ce5348c728d655f3b9e7c3c27d3bab6297af705ffb0a71a3d71dfafa32f3843220989b85849ca6d74c57330ac888655cc84758fa5fc9b10a848d4517552c47060c0bef4190da1b044cbaaba5ff58924f19cf8f57dd4afb5d65ac3e0fa4d1fd6d7d115dc5e70bfb2d8822bdce6170c3f460d7a595ec1b008e248875863187d2638bb32a9be464fa9571657f0fc1dcf51f1788e7ffd1e5555359aaa5458efe15fedbe81945ef93d6afdb6a9b707b6b0252e300327607051c51554848912813862055bbad8628b11c48041104198c11170f02148881daaf051c1ccc28814203184215cc9d283186300318f3065052a3f4f4822cc183208c2420339ace04b0f2508eaa10a96021370f92268e04cb1e822bfd287d269d432460361c4a8ff0c4db089b5d05af0bcab161cf3386e8241cf72e79c73ce3c21c5f36146fbaee4cb246cc00afb3766d89c73ce09348e7e991c6c8c3d5b7ad1b7146d79d11d5e5b68c1bd4516dc2d01937c93d79b04a8cc62fc58a2b494655966929b04fc8bab52896634e062bcaa69b6b5afdad7faa79b93606fab45f0f6f6330ff59d1773aa7faa9f699bb6755e6e125304f7ccd3e87e86c6cf68cf3df184c6411a35be964a5f4fbf51ede6ed2bd7695fbdda6d0fe16b5f3da871a7aafd8909e65ef37c701f03bfbb99d6705caddc37d6b6ef3cce9ba1098ef99819dcc77c6f5a0ff68dbf4298bfc678272fd73fc9a03a542a95abed6eae1f83656ca5b1b57e198665d8845de68427e88261199c451815a51a9e0076d12ab53f60aa2382e1cdf32b0438ede38cf7d4335ed75d8d4b693210aa64361a3366d7fd065f06de4c24055393d31ece7ad2b4874422707af8dc77deeaf4f5bb6fd7b4d5e9725fbf3e470477b0a630f7f0747bb6ef52b8bb4452d86e3eb6db2a1a57ce9832a914d4b40e7615c22e057f42a85d6ec26e42082184282f13c1288a632c8e89f91a73baa70ff51c17f3a76fcad9989f93a6f0bc99480ae56522a98efb69396ea6344efbe9715caac3f3bbc97199480a6b29f88021449a0834006207a926020d80a08208462919341428385ec16928500e10a1409161a0a86cae58e9bfa3809e9ed669321675b279a1fbc8c5a44cf6a22e774f73ce79bbdae1a8a2a15aea53aa97b1aa4f69dfbda6c99c7ed6ee352436b47a35cd7efdd879b9ebba17509db742fde93b4a354d5ba16efdd39fbe3ef7272fbff0029e9afdaebb446cb8db23a379446cba4bc4065b1999542ad5a53aad6adfa53aadaafe55afa2e9ba17e87ff5476783e21ef539aa5da5ba99ce90b9a993bdf99ffb19af370834e11ede6c83b99b89d8745df7bd751de7e5176c1e431a0c6930f7f6db7354d86bff50a9d4ccc39f79eba1663e26e6a2ec678feaba1770ccc7c8e7bc8c7acdcb2f74977be8698ff24e27cfb166d3a3bd041a732fd8f080386b3df51df7d6a3b14d2662038548f53b48e0e265b383042ea4a0368bcddff78551a1e70fdba1cc44d052e7b7077fe51f83707c611eaf3202e1f6a3f8ddb862db8e9ed3ddfdca7ee9d0fd219c4d6210c4ad1939b09926486e2d10a778800a683ca1d7dc10ac651b9a54d6f0b77f98b3f67f088637737f02623f88d6533ffec7496562a6bdfd55894ff1e5576dc710863fc385e1cb7cad70d6c80186cd45f0f63602333ef5aab740e055f5d4b75f3dece373430061ee51588668e1f9337cc4fcecde7e05f290831ce42007b99f0fb98ff172fd917aed2377737cb1f36bb511e87ebef6a7b7945abbeaae8fd3d56e1e82e773f5b31e10a7b2fd989be38be5b8db937aedf6a09e7b1eafdef4b2bd443e9c7a5444cd78f8dccd7d258d7b2462998733785cc6cb4cf0b4d23f0e73af453c2390ebdbe7aef4efe625986adbb6c3f44022de2260aff48ffb7ab59be11f893be66b0fad7fde839dd087faa64fc2404c587beb0dc1311fb71da6b6c11c4d4e61eedb5f7a2af5b6dbe9db3d4f4c7d90edff69a0642490d46dffe03545c0f4d56463eccb08944c9ec5e202171ce1fa36428ff3f210cc7d47934c8cea3feaccd030c9a86e7eccd1b83350375b999b8ab9f99f279e3c2410c73ce765d467eff6ebd7efcd879579ce47cabe7c6e0886da43eff4315ef78e4f5e465d5a737dedf49c37c487c675cf133b2f33c1f56a57fe87b7979b29fee4264343b0840800220b128edf48208e3e64acb0f99f86d34082111536f70bfe8e0e1e8feeaf84a3ce6df1bbd83d957aebedae92be4d58a62bb59b8fc4a01804c4bb441e2250e4e19b51a21882168c833b8a214809426afb90d5316f9f55a800ee4d5b3ee2700b6c6bc184bbede7c642f7f4e186e439d86f2fb71d5b103679361fe79c318495dc4ff9dbb7a4bf3ddc1e6e011500f1b67ddc766c4d7694baae7b16fcbbcdabcf794db0c435cb3cacfa54a27e663fc76664b1b4c78f209e331fbe0e16f59aeb344b7a2688e49f8ccf04671e12962859706309a20b5e006e2c41bc009f1e7af9886f9edc76188165e0550bf1edb310dfcaac04fb5b8ffbdebc0976ef8863eec22d600a5a15ac3d4fdcfc88ac127fde8629cc9743fe491f700b9882fcb943b5b63d932acdbe09ae52cb3e635a9db89a30186b0eff6edc10e0868773d338fc336f003005ff8a6d3c20748f374e4f320cfb52c55a0bf1b3cf10630fe3bde11f8df76b1c3c7c45b388aa695aadb53ed5a6cc5efb1a3dcd93d9c758327daeaf51fab546198e64b8745be832307d235d06ceb2c46e8271082c3070cdd77cb09f0f1f43081bba3c1b9e05855e76c8c6095df1ca30f11109b1d80c5d2f03c42e1d58f80cf879d67cfff7b781d3e61bba54345909be242fd8ff864dd9e4584db12f9b2d24427e5e6343a737a85654060e4e5216ec9f2388902e3aea9bde2524e47209b9a440178ecbe58a49415651d8243c858868ad120c12f2cf8d8ca04ba607d005849424c465250616167e4c7a127bbc7afc78c0d10fd5878af419b5ee1e416c606310608f30ba60ff1f3f640f56f3cfa6781e8025684a1ff578ede8c83255a881cd36017de34f593b8dc38da4c80115acc900230e6ca62d486db05118f44d5f4d1e863ffefdfc98624d0aac114fbc811f05fb13ec57608741a28e6d1fb48ee91d628161d185ad7ec1332c77c9a8a5fa968c116cc1a4cc08368ca01bd9435711ccb3e159548a24b1f1163902049b3ba9086c9e8f3aa55799262cd18bdd8e37f9db51a4099a8b0a55183e54a3a13bfe2561338d5b6cf7079f8c2a5d38fb910c024202fdd01f22ea47447e9421911ff99117ecef5ddc0b9574c88f2891fcf123223ff2a3272da5ab8bfa72c7e3c934efb8c7d71be1fc38f39ab08ab2ec2ae97893a3500c6ac28a40334dd878e54b62c1ae2c8a3744576cde21a23f06e5080494654747961865099b77e27b32409c77faeb5ec2365204f2276ca6389a3472c7be4082a14a10215d62908b0ceb4f630516c628d115831ac74c1376826142e3f0998414dd592e5bf18a85374b2224dc464141f3c8bf56bffc7bfcc05a3d5430ae42eb09d6679eb0f0711cccab83b0bfc4c971251e6d61f3e73f5bd5874abf0dcf2abde69f7b3c5e0f256ca6168a221838c00323f6b1deff82fc117cb0bf0dcf03b4dc20826a7ea38ab7fba879e2d314451f30700073ec042d4ac148c2fe5acb070a1582dda14f6c862df8b303ed1476b6eabbe969bd41a2e9be406fbb7fd65f94f0cc9dbb53bbb0721a1164084c0f2ed8ff07929730ad658b43a65716a424239b61bcc2e608b47df7a7ec43d14571910a84bd077424ec434343eefae2d50822253dc6c1acb77e1cc883a0f52050bc29e2b697ab8bcd146b911221e43f2fa129561c0a7c1b9e657a77a1a12c363798f8039bfd487beeb3bfb68fe1155f18c78289ade8f0667be1960c07c38144b6e1e6258937fe9a67823ff1860b9b29a65a12f58c09306058e9a29ce8f57062b7c4de1277b06048699982fec91dd8577545f6937039d0904b4a15a3e8452b6c7697bba45004fac1591205cd90416404042a8c3081135b8001f4431345c020c51006fb13f9b2a323862265d84cb514582f5d5aa6a0f4b420db02a42d43bcbcb0ff0b54a3e932c43f57c11f853036d3a8c5669ad48497216fad228c9708ec9b35b10d88ee8e2a15fc197498e7f3b90afe363c8b4a868fe3dfd71e4e7ffefae2dcc0f95c857e1eafd16b6bbd0461ff94a4f24694c1c1e6ef7e9fc5e68ff6f7e9b8b9af7cd8480b0fca947ec1fe5a9047f129290bbff2d830f66a1cfe364a80b9a20e46146fdca3640f92ed4921a2a82387a4101196539e0c2baf0c722914848786a43c9248f4775446b082fd69bea688a894ad7585452d11d10c0000003314000020140c094422c168241a536565fb14000c93a248745418894990c32084900100100208000400000088c8dccc00bcbdf5763e6c71bb01c0cee3087158de58af47fafc668d52d7008b50c11dcace6ef541765362c9b20775709e16b79d1e2c8ca5fd113d585aec72495f95a9b562d016689e6e6d922c58f60627a7e5170064bc88a92bc017595dde71fa0805c6b5fb5338e888b1ce8242a363b4dae59a0cfe25656837fa81860b6dd383116b0544ae81af24ce2a5bafdc4a8308f5741483cc46319365a504c6be0e5bc65d12d3daf2fef471af7f1d91f59de9ef45639e56ab34d38417e9494cb508995c9744f9449a6a3909af86e09a94982a0690e6e8c28aecbde3bebd5e8a9f54cf5e83dd01c61ec3403c0ffb3dd6b1f750f5ee416ece557ddd8b94243f0ce583c9acad7be96f3249ed9cde7e4707c222cec723d0bb89738586c6904206add0bd82ba833c64027d57388382da5eaa8340c150adb0b3b07b53699df40684ea7d299eabbe986c4f7d87a0c0d05cfd008b8dfd5d85f6025c6f6ceec522e21b48633100332bdbe1040cc59c693db8a589a7dde0c756affd0bc1a6fe293560497f05b6f2870427302c2298b9c9dff58a90c1563f85691b21146af1fb6b6c2f7efd8b5ffc321fdbef62171035ff6cc51c694ac1af619b8a96c0c9d84000fe920376504d4acee79413ba024f8d9cb34fbcf2da288c33154ff8e28d18176376dd4c91a0c3e4969c85ceb9476e2574164263d7395f3a9fa3a7686eb5a79cada1dfdb82fffc84143d670e47677262eaff857ff6532badcede4f8f3ebc0f8aff899d6f4b46d11c8a819d0b96ed2a7898ad8b98a6f6965b06fe988f04efaa17a1520d020ef7cd69d983ee35621a4ae0d0f997742e366d3ec9c6179193ee51c54aff24ad0479472076105a47773dce41488748fb927472b8eeb82ceb988796236ab76dd152ce500cf95dd060a41556d6e03ff9323729cca2f563c671790b4c4335e868ba18d520c042d23214509e5718dd5e9a6a6b566be52c1852624b4e9a721df7cf094106ed7919aff9f1f071f06bc886188a6388081bdeec4f752ebeb2879cff93dc511e1fc92ad38a3511a483f971918cde9ce732846bc7cfb927631b868a5571f61539dbb0e13f71470ae4ccf9b0769b06edf3311b561bd0f337c9982c39a77680f6fd7483b10eaf55a387369f519d6ea5769b0fa9a5b6b0216d737e565404e89a7a8625a9343e25f753b87941f2bf64f38148b0bc512cafd94440e136ff4c6901e8a8ee9e1fa149503e02fb40d9b1476046497a64fea740bf5c9bffb48fa9756d1e32328ccf4af0be8cae66c24fe16e3ec865fc28df801d155298633e82815a526e2f779ffa687a0ee25a9f2f15c9ac3c0e7a65266f3467a6292e638f1ed0745895ba109b088a6074749acffad589c30ac95b854add954e3dd31e384c874ce359f09ea159a19feac963e71c660c392a1873510eea586f5504ccbb0b53fa2c2ab43d3cfd85a7aaeeab5785cf7715c6534b1c23af9b221e53910aa53b475a07810bb32476b1e6001b5817cb5c9b17c719a6736118962623323c10e32a486a24fb9cffd444c3397fca3a52cd70f0bea66e38cd39b1fbb6e22acfabcc9ba169e7e45f97be0e9711d0337f89ef6340cd72ab1e21e29e81a0feeda5064feb16dfb9bd6b128c405ac79fa01c6955df03f79cfea36f52f7079ee5b4d1ec9d50f149f1c0f6dd86658f832d60e088d234e3860a66423b3b9be9cb60d3d3a2451371c8bcbd32bde333731b619d906a8d341f009362dab908ec4980607b93d3a94001305c7d0bd5822e959bbcd2868fb30ff3b0dc88b74dc559a8f328fec37a1f39bbd06da88a34b31fb030b1e5cffe26e22af74b5d1e45a689c9811d4c58aec15de935c61d40463f52c8bf9b1330fd0eac0cdcb096a69c0766b745a810a546f79e91cb3ec8fcdebc8985e2f7bd05cfd34ffa1b62dd312df30fdaebddefe3d495d032dfc4496398498b61ae80bc23e89e1fcb58aee1052ad20d5aa1cbd0993abb70fb21fbb735605ade496bc58b80d1963aa41803105e44a49e782b48602fb8a26697874799b3c4a71bcd2988d8187643241c341a6166f07156f5b41303f713d488e69abe29b2d413bf940df1e7f56c14a7959dacb56df8c9b85dfd5e4b14cee8cf8a565d3f9fa11d3bb9457a3a782f12227d3ecec7b87b706c9135bad7415c47a48bfc682326992b439349301585ac1023033cbaf14586a7dffa9d1d17bdb975cd7517aa8c37410cde23c208f28783a0972997a22f00fea8051609f5ad58e1d8b47ad8ddfe1c64ecd3a6a119e75e2a1004b24f15a613991bf90411eb3461a34ee642dd4a4b9ed255e4ba05c64ae9c8368c2ab8c2c39bc6c44bca8aade4cce4235c2391de27b35db5d113c27251a382e4336fe64804d8ad5b13f161233d29a034d2257cea0ea8664e0d4b7662530a2d4a582a7de90239e8486faf5dd8453ef9911ba36eaad8631a5131319769c4b0473e57bb92252b6490c1cac908bb23adc8a9e830e91abf3a24576d7ebe5d8213d8ff942ac1c5c074a675942782b2ddaa1cd08605b3952af210c2069706d119893499d79bcdf9018dc59d72754d0e398e86f3015909e70d13423543ef2782ac923817c9059df621323f33ea39e7e5b3c4c1f614dceb990ca6ba30722ad6a7e183dff41f72ada08cb49426c0531f8c37a211b13d1b5ce424212267ab333a4fd7c9819b40bcda9d15516624df0a46ad4ce98e0e5eb5c8dc636fd0d2d58ca86c3ed73cae0d307d72b8d703922c848148d41040c6e4e7a1f48192f34f5ae45f79215c30df061682a07c3fe089f2b3b6754cf4635c5d0cc6c70501098278e8de5d29c8f0c6381827bdca12bbf22d84217eff3f7404ba81ae8afdcb818c64d9bcdcadd521281e284adbf2cfd9904696189b8e11a370e9c2fcdec7b08287d4a26ebb8f0b349121f2b9165ab0602a2a0ddd4bea3ba918c5381042bbba75d0cab849d66b1851677f2d80ec9ddb9d3ea4980451ca5baf77e003fb8a0177d2a4505e439f5cafd53ff5dd2073e1150bbf84366d79bde689588fee9ac52ce67a67446aadf09bc379cb106d1ad60b902956fbcdf3537e9309dab6be41b135e86034955f0a108bc753fdb584fbe2dc2fda70029cada1a8dea300b986ab35f26a03ca6853829c84cc864ca023c3d26752c1a2db0ad89a52ad9e3932a3f0a7bcfb5faf5c7b9a7772b708dbc86b2f6a66e626975a836d85f676f12e4c2227ed68311f29d812191224f0517526739bbd30cbef7de5570093dded20bfa76daef648e194abccde1b8f0eeb6ca48371f62f25929023190d0981f7dfa946767405ac0cd840bef0dff841cbfec4fbee1913b65405b751e6c103957595c9b2024437de8685632aefd073825c6127d4bfabebb3fd24dd3337302a9e1d7e48a7968fefa6b015bea15f37216868eccb46c37faa5b790bcad875b6c98d3dbd9fea891a711a50f77f2399c0d73ec528490bc1894b0eef3582d5f9f12c76f80e10ace64b4fb189b09d1f3f8b397d0ba0dcdad2f84c257ebe2313d3b7e9b9d2e98cb80ab06d8a60738f2ac258a52747b5fd0050167f5efb745223e512fa089e6d2736205c34939f8592a478e94feeddae146de36c96159713b85f8fe6eb75611f3a376884071362c27414d16bce21c536c7b2d54e2cb5d5c94401091f497d088d88202bf9409590b3f67545145e7816932e7e7afe262efa42c874d4c136b94fd46ec2d565ca8acea621ed3843e4d59bc831c4d1d554254fcd417ea6d0224f7ae40fc02d4fa587f37bfc605eccd990f8d1f80e95a4f83a15f4d466f92c87b1372befcf7ff9bc278038f2aa00aef575bd28045660ed57fa98d93bada5a14562397179cbbb048769f7bf888d8a8b7fc6266551d8c396b35b82a09c8514edb8854076b8b7c82f29a46b59812da87560ea2b934f9cb062b0390be579df51869a11aed68f06cf40fefb0d1e9db875a9edf413178213c8e717a8967780e5fad8be9c27926ad3438e85bf8d98780fbdb35937a0b571d0b755f010c483c97a16fa67730cff49e55b38bd615560da418c0c73fde0cd06657b1b78e2b86ac45efe18ac892bfe01d0b2829039f75b80f66c172ed913235c221dd7b2ce73546a9adbad89667b466603168f529acb08d2b6b12bef714af6437797072a58277e402ea2c9eb7a64c4ae5912053ecde75f5497957eb98f90a0fde91251e4dcc12f089d4366610ceb8178baa6ed38ee129f83955949ff37ea7dae43456ae2d875a9b26a37ee2f69a4c97c3fd42873c5ab026d9dac78af3337a77ea0b9a094913b0ebb9c840379795e061cd88b5ad0229745c40b9cd824967801d4b75f53b1c6574b57fddee2d9209c9646391f643c939b48fc4c2ed03753fae15da873183239cc943d60dd7e61e1446f4b66b653b7cff29f481b0398b82c434e919aab04f2fd21f67c097f71fc3651b5cf772545614f3860ef8251b76da66e435a68c1a913b511d39a9c2f141d4c9f44dade3c4f0cfd2c4bba2443248d45bf242836440dace00c92c106c5597cede299364e5248cda8a02c2179dfe03365ece914bb80090b7e3367a80c1b9452014cf7dc5a1171cc0af17df33f618557aeb01ef14a7d529cf190da28fddd1270d7f1bc4773cfe665b1f1d9020c4a35e32c55df1d934b98c8879ac9d51943632a67b0b84c77791f813833f906deabee4894c1793655dda5fdb72ff2778aa0828ffad5c6b2d03eab0210fc18f385bd319d0b8a4df5d6af1907a2030e497c9e104110740d0423410c5c126983222aee559ca093b5063894843abf799b46d943b2018431edf113a6e6b9d47c30aab91e2760ef7be455040c9596e9637a9d061dc1bef7ac06a4bf5c0c05155a5bc5532863557ba890bdd350f3b81406a042de67f8b320cfd50d4a1f6e1c478ec2ddfe7e48f3e1f222d4ca2313b09b39b4cc57256056d8e760bee7cab961b9f4ca7fcb20148cd7dc0e39a87e6169ccfab6b10537702ecd7e60c503edaf671d5796319db236c3b9432b92b621053912bf51fae699800d6045c8a5c0569c5664c6959a02cd172dc55e5e0a7c29fcdb450d10658528b28e9089972695584dee4c89f1602616bc765c57aae40662de3f6a216e8218678c9c6f90718cbfb40625b2f377c262e862a71af1afb431405ffee10f17d790b14c686fde64bca4455eb755a360353a81c1c3f3700b7c40bcea213a0a2aadad071fe16a37ad5e8aa28295b4aeaac4891f26fb2d1f2266da1f73181df6ad8cd76c2d89512e12cd2a498dfb0539f8146072f58376138006177472f901a3a5e885b5da22c7798e0f82b50fc3ecf53486e84f3a499d3444211220ddf027e64418f8b1d603227ab351e564a486f436cfc6e5f4ca98c73670dacea3042df1a217343a6d97d8693a6b115b9a7810af3b4432b8b167804a005135895d1bbace946ba8bbc199f6b0dc2c333ecd2e054db3b4bccb5f0a380a776c05ca1dfd8bcf55984a9785581c2bfd0ea79666325038ad436b5a627dac2281defd6a352ea7bf1848033b59653e9986eeb4b173e72edaf015fe94d1406bed8af9b3185a865c34005460c67463b42ba4143181da0d584219a0fb6d0c2b44d3a469deb7e3e45793663c837ab29514723eed0c88d734ed1f3960a04536a3b023b5021db3f3b05acc76b3194242a157414c37920258153cc9aa3cb1a9209224ae19f7d222015d37313c76662a8ded9bbfcdd564ded0c693d2b7f637ec601481ab1bd8a30158782528c3ee190db110d5244089ea11d5b34e3fb196a644ec97acf61598ff7e57dbae3ad27c79be08f85e0b4add6e2d845863c3a4e5e361ce03f3f60b32d08d97d19efb6f12aa4b6608aa2bde3353591ea0e855429ce829d50d9fe7dd02c5d4544472976b9db3b89073241d899236e1c7f021f2a31f5b1bb927d6097b502c62ddbe9f438f32302f572774ecdcf25a5e62bb7f72762781c8e28f32d056642de8fe2168be17e77b96c26bb44da5088487794177ec8fd1e3fb03ae797705db034ddaa6c421e090be3f82f805f5a721520e54922cfc4584c2da675761f0b26c800dce8528ef89ab60d8e6c962edc2e8ad3b455051ac350795f55b49e896243569540e38620f58ae9318c82513425a4e5a0b00c880c8df865bdcdabec578c65d31a7766013a319adcd5e08a7c393744c04124ec55506e093e8a10bc81a1022c500660c2b6e11372a852aaa75eec54f694ca101136df74a591fd3076d63eb7068186711e3fa62100f8cd583044dff7717b4382a46fa60ec84ebd6de0e5ab58759a5dae8e6dd82be47991b72e33195b76a49ce5549be04329ce0a5edb4f4a441f481a1fb6630befcddb44646bc7ceeb49e0c1051c04fbf9d1afa108e789b22ab61284549c6d3b43fc8abdb64d5ebdfd64b1e2239513ffbe136deea5e41cb046ce5bcceb09d949d60cb224562673e000e60f28f86ff0f64a4eddcce9b1a63e58a0d2dcb24f89df13202f5baadf62964d6fa3a6bd092b9b516efc9c2361d403355beb7a7e7606420f968f991fb279cf536cdab4310324fe01685f5cddf0882e10a6b5d463668a61ab986bf8d5cd9876a11f6f290dea7f2980ce94485ab250dabe997c02a473e399000cfabe4ae5eff783f6d281e4f57e909983c250cd3d1722b0d6c915d326b4ad57744ab6fa07adb81b578de5fb8d3cbaefaa4525a8e84a9900f2ee7a4ac2f2fea36137964de3ef2a524a30aea830f4680ac29618ec860567873e82c30bb54cda869e676758b27a360bfc99bba472b505dacae2a0c2b882413f8d737fc882b57f46e09950adec77578cbfc8c4a9facc280644d60b5d49be8ffe70479d610f50422f813aff62050c56b53f3dd860dc6ee6d37aca382b673f09aacb9a195ff80ccf6fabf93b6ea79212a0dc37c4c7db5cf95978d429977b152adf80ca9956d07cf80fd6fd3a69762ae4fd39d382e540e837d5d019ce8299178db971b7dbadf2b5a39fa342607eee133fd1ed9dd0414efe3c47acadee50ba6205f69ef82524c4cbe793cd73bfc6628b010a9344d626f85076b62e41afa88b7811101f6bc02d89171c79145ed83bc87328ae8886ef772a31fa4270d487c97f6290dce582056b4e3da0b60e666a9f9251ae843591c79cf7f4d519e76baf6b7171a90326ded473e6465785bb40eaec41834773adfc90ce8ae00d76ab1da3f16433b84799c26d1b9090e65ec19bc7dfae3d403b1a8f3592b02196102399580887b4117cf8a324fcc894e4fa4adbb83737a66e5157d0e130254fc2c0d673bc48b34fe46af4cfcd35f8ea6f8981a7afc32f3c592dd2a37cb879a89a1b5a54d112b29fa26e5ebc95d10bf443a691e3c1d91040fb3e5477f8a8559acd64c14d970bb17bf02b04184d426a068df17a5e31605307bdd85f1542510732b20ff8dcf39427563d9bd147c5b2e0acb2e8535a6ffeb11680671d62126e5baf9784993ad0f50d23f98aa56755585898e16d2623230f584acee1b1ce551b3e32e007a2124c4afca4970c48f646725aa770f7976c07d0a817a2d7d778fc4f5261374483b5cb6eb46ce340b68cbed4ad9ad300a86d5ae59da4132340a3514911f7deb56f4fcbfc88c940eae3893ddac04d0990c616f49d262b7bee75c2269121d9ff9bed49af63703d6238d4263f59163e2fdac8cf598e628f80b320517ed7ef93036e27b3526daa65530063bb707cb7eb5a018f28151b090f053804486272ac002764ca34e2a907dd091755b4823136a525b5c78e90f95b171cf8890524394912bcf068447ad868f0d4444d1474e4e3bcae03968dbd503c16797d0542aafcbdfc5201e26465560c2bdcebd33d0eff34536670327786342855c6c64e7d224eb00091a5fe8f9631c4f575754657f51eb2a4ef2ee780a0c2ffb13400af9484d3b86642649d00740a26fd0c0ad8d9c26f56f9b83bafa44f4fb7e0f6d93bd4b7d034f95636ca01566e60fd584c4fd6676afb592e8cc86f6c016c4b6d2c31ebb4d99a524dd063a7791de64f796854799a825ebeb537c10c91b49023c77594625d2d36d3e06365977e2863f29f8f1e6254879550f54a9b90a64650716bebadc514d06e3384380c9003b5290e42989d4f28ccb4bd733a0e5dd88e08edaf1aabb02aa09ad3ac24835b8043bc7c580bb9d061971e4fb334402ac542b17b54a641c47696988f3ebcf9c33980bb39c73d005b3b78619454ff35e1ca763443958441a1153820de26035086c0c012e787e797f40351738703850a22f1cc198a37ecb3a07e2b310ae52b57db03ee03fb27602d6530dcc1955b696b2ff0c27646af7e21fdcc14589c2f3caadfc98b273c9574b1931991549cff4dc5b657a51419e2b19135b07caba82a574c092313188015574fe605c3e05a275603f3ad7a0d50955e3e29df7ad8d91a28372297fa11a1f45249fd7e173d467f7fed9aa699621c1509875e2096c5ba815507c32d33a99ed598f5a14830fb4d4ab9fc1392cf97043e6ee82adc5a8eaa91af973b7dd19381a2fa81957b4f921144d9ddd6bd61cc4f18f432e932fff65d4088f85827cb1c5e2d34ba0267f52593aba9deb026229772971d928ca843aa407f027137dff4b13eba0ebedd147e23ba8a02c03eb65a3dada1bb84205450a7a9aa25d92ef5854d54e783fc2fc445dbd04c1fcb8bc73c85579c12bb271be3861fe027c39fe5b1cf080a4d79cc7c5eac2e896aca823fd8eb09e6b0704c1a086b54d9f463540e0191e000b74442d695a1799a4e3b955ebabca6b3034eca7b6c2b3bec138022a5b25c8011c6f5646c81c3fa844b9891597dc6539987ee13ba184238f0f2857348218eb79455fbdd88e500d5ddd53a9ba62c881504abe4cae3303daf32d9113bdd196a02077b24c919c2015beaab82960ec3b37578aa4de809a62bf3e8f7c63ba898bf0c9f3cc26914bfa0479830785cd17578ddf70306b4422bdc151047fa90386e8089386adb24b6b8d15572c7fbf01026c5af2de7eb0c2b5adb36c25b9c74dcdbb061b131e38e0bef894f90c3a36634e02851212fbbbf8ec840a06893e00d5fecd986cb7f6fd24c5c473fe7f5f66fe582c52e2b7f23935f19bd81dd0961016839db5f21991a58d70f893517121404f8a5622d4c0a074c7bf6f150d3b373626a8c88f27d5308e6d48b7594147a1f16f88f3c8f173a5c8e4390190d6cbeadac1e8cacf980becd5e9ba39d3568cd8381cecfab96dfa91b10b7b58bc89da82659afc7990b1e3e97f1e035e92449c97c5f6e7acbde920b652f89f785207e0b56b92c8db69d80064817bf5ba94a32227b959755ed526e7e05e98581bf23b9e3a8368b03508ca034e49005c802cd4490aeffa99db98a33bb15fbe8f836ef5752b14eb7078a1c43225c3d2fff9882b6895c4a3bab235804e6cde26d6bc41bcc6bf0cd72d33aabf709645b3829428d9a39512b1e76570af0822f8d8f878203b8346174a61638943c54c4a2ead1b40e4320211ab1d5bf0a0868346d582dac8986ca3b9011243c7f85a851a72cefc6d019c5a82893f5b84222c512f5763c73473ff3577a9274791eb64f101b1953e0c22ee1e30b918d815690c3836e779d011d1bce269ba653c4985b5b3e2ef479d2418b081064647d19b84aae48b889e39c943316fbfcf47ae349b2417dcc27eefc2be900cdf9719d693be3695664a53771fef8654bdcea05cc41004c378fa12a2cddf50ac98f43265e3e29328cd8a2222dedd8cb2d0a96563ba029b66468c7b8a56c1f02579af90519a0d2ba936922a254094ca8edd7ca4a7ea9f0807a074ad8dd9aa03098d469fb5df074d6da54fb92968572c024cb923006c87a22fd81fa59c499a3d0e773b4e68bebcc2455756380fe895e78b014f0545d3af69778e40ae15ddd4532fd3460808262ac9d30ea1994c422785cca3e629e9867ecc1855d80d799056ec73326366399e8656c693811c8ce653f1c07756c8ef1097d3b9496f1196e0a00eb7924743b2b8152a4953d11e42ad9abfd39499f4be64a833dd70daddab9d88e0ea1d46c50d83da768497574e74563eca8bf5777be0ac635f584cd65b9e9cdd064778df888e18d70f92a1574a904ba7209a61ec8e9ea2db350b2b764bbb78114e8c4c40d7828399a097ceda9615b2177c239981cc333a1eb5e75b14eee591eb486f87e41559658fbc9f3a83840a72f79dc19c5f30544c80212c36cd7c633c6064d527e3144907f87083da6c76fef47c49d85837bf7872fb5a3fb68ffce50649e11ff3632f2130de24fcd2029101c40a517b8de2ad59ac9dc7b5e85b514e8b47b281ee310278a5a4085633c5b16905ddea50fdbc8009913260e8065655320de44257f6bb86c6424acbbac0fe8839895d4fafaac62234d33125b83082864c40749d805fe81e70d4e9f6b67c1574e82d0ae40a8a829adfbe0100cf122ab347a56239a0052a5d1c1734141c1667fe9ec8817d2f6d7c62db5e3b1726eb44de3624e9d25907093d8080c56b1dc81858b6a36d8fe49cbba0291713b03cf99ee70030e00f3468eb2a1231d51f18abea950ded7b3a59c28714476b38e7f8507281315cced5d2130ed5ce20b5bd82004b3836f98b6e3172d971ffc5ea0b3276e6ca3bf135c9dcf49da0fa7336b68ba399708c3bb89836b104fb69aab8a9e3c431f21453c013b37a21d25ed2f3aade04b71e1133b36184bafe1d4c119642d280d81677c5867ac4d418fe2358ba8296ee4a8f0f2cfc9e9226823c2a5b36b1558fa19723d5f3723dd3cb2a57ac4cf185e93a7d91bfc4d4833c9b0cef64222965c9577134b3f5399c2e4bf5a6d3b74143bb20a04530371fa8612cc16e2c26a279553eb061504b860e838d85807a4fe685fb0b8ebf112014bee891d7786eed29ae0d6ce127cda968be7faab74a86761d727fbbbfe483630b54e1771a59fcfe7076762c00f27475f9d9bccd1456e65f64c9f7952f3b8cf5a61025961ab9c2f28f9322e95daf5de131c27f026755bee9f136230595c0e9302a85d1115ac6a8e785b4db2cc06b5e55282b81c720ccd3a5c6a4aa2a7c3661de3428b94782e36cf5e2dfee4b58777f38496da8ffa05483c22cc126d4c74af752cb35d22981a3147767685e515267b275320877ab5d69c66c8240274233c04771b59d4a9faf952ffd8b48a894e59087d8609285a738dd3faa752c2ac53a195dccddc5e6d4c9089507e2a2bcce59310c2b7ca15aad2e35b2f302936a0207ccf1da58143e4705601ee50c6919e430d6b039d4d79805614ee1db5ac9f2e5e0efc603a3e9b17fe90b60f11a781038b1eba91949c04bd49e4ac62d60a8fd374d287c649abe7780482399d05147a29113b7fe23bd5d3f9723fcd6adf25d5771480b111e7cdc95e4f538d7d6b66a95fd994256aa795bdd59e7f3d59990a36392c19baa6b0f77280f13c45eb0d73dcf1da213e1883256b7c71a00e8480605c0241f5e8065ce15200203d55bd87f360ad5b640e84aa34120614a0a5e456fa942aadab667848337d5cc9a117f10897d8cff7164300889796776de4267586dc7f647be27308af6aaa74147b31955c9ed5d6d528db089511ee643ee422b8c68ba8daa06c463f175a3639439fea3f1eb5a9422d6da4430b93bc9ccfd78c1868216c745cc6a865a148185d86a13040cf8f4029e99fe8511e69d52d974ced5d8737f24b5410529c3de2ef4221231098eb8fd4f42dc92ab85b027a300803647f805bd1838a707658a76f8955a7300dcd55539970dac5466345b9b697397dfe73dd8a9c33b6ddc8d7c5a0e74c6964fd7bfca9ecf1da92efeae0fc0c31f741c1ee1771a9ffd78f0c66d009e1e0e7260029fad0b242cb3417ddb607f20b204b8b8396f25249e18c6839e4e9a76d36fecbc7f813ade0ac4b68074a615c0c2d47d98bf12b1824e6187dd0a27bef1b0ba43e257624aed64c7ebb66f6539246cde441526fbcea52afa6485049cdb7901db46aabb57e6862af9bc93c51a4e104384a9e8f41c5b49dd40afbdda07daf023f8fd1dcc294bbbb709b8a42dfb07e46a6696e7f6cfcbff343aa54e471e2ebbac8a2144f74fc6b1e3cc56a71f2f34c48193d6c9fdb8d6b1f21c27ca74adfb502a81c0916ac79861090cf068b4a77cc07dafd7b65d18973d3b414b658d644a66ceeb914b1502de40dbc9e8d4fec7f214c11a8bc0c940fb79fb2b3bec90e0bd644d0b0510df7e7c26e759e8e867d657bdddc42a5b3b713154b64b94e0037a05f18e46afc587760a6c5bdd26b50d74253749ca59afbaf37c90bb74a37bf2ea46b37a9b0418f7bdead514d04fef50eb1159b99dc9e881869e071350f4fc21ab915a0da775ae5f61d4c7e2c5b3bd94cd5d39678b511b3c546af275cbf2691c692c7d48fc04ea632842c16549e632d3f907199d84f9caaad40bca46b809f3482870ffbea262fdac543f19d0fb176238dd863018a7a4ba2bb6b025eda03a8561e7b3f54ef0520ab683e32ed13c4e085d00845bc5580747a032c29db7e65d5e65dee425cbfa1a170810b5d1b0bd6b21ec90bb9f60c6b2e1653dc07df8b1205419eb7d174dc09d8b0a76111db1d50996385d3605e85885d6464ce1a0136eab729452b5adebae5addf0e1aa1a8bd61388ebf57a69f3a1d59fd4a2305cef3d814beb1dfc705656c003a0fba8b0ccb9e49e5bc2ce10dd2c0289b9509bc925e431229628ac0f26e2a95f59aaa7e188a2ab64b8a4114a8212c8caa7032220c07f5ea13a4e4870f92f2f35083443bacc68ee1c94b5f9f0ce784b5b2b6673be54a913ef889be364e1e2313464cab6738f7a797714894c3f48a1374212714a6ba2cef2251871ddae1abc1196146178b10a6eeb7fcd5a0186cd9475960133ec2e0e235c485ccf1672f6b4d0c9869979a50bd02574c77e36da2eb2c85cce22f3a4cd6eb00d1191c93b3c1c0af0be5965158e153c873ff8086b5a05a2d06a3a59502a2b98b7f7f12025e72fe85cc511f0396fef2053f9875a4752e429c7a11097edb0c56e0b0cf8eeca88ca796bb13311fc6cdf3a198697e5aabe7192e1f666cc86c08cfdaec702a506d8c46e03ee9f3513c9a8002f3786cb5b4fa83234bf2671c32b65745007c99c02a8827da804deaabc33ff29c39a25aaf6e7ce24510e7c0522cf222ecf793d018e19b4aa639e930b9df07879c1b9891306daf1eacd6b0eb9164df44d6e2e033de5e70173815c310626679f2b20bba7f03d0f1830856d970acc922a04f4147456881ca0116703379429663df745db1ec3c4bf370390bb00a9d8df5317f1f0dbf458629d0ae7ebd3c1632f39fde2ac412eda147d296acbf6f681de73b78c47ccd037090f51511208eb6d026e499af8196f6467ab17c0ede3c3f50b8e01f1d626d49e354c5e4d8ff9ee839061b92079a77b9d6f0372be558dc652c0f9e6a788591f64aa93abb59cbc014459c423250e06835f90e624b73f5f5d1a1e84c37852edb3c26c1f4abd664981f2d5852c9e377039bf01de7918687c8d901eb3a1ce1984db8f968303ee066b6a912c51c046fa7832df2b660ab588bba9737dd33d6c15a9bb5da75246c86520a8a0490148e078ce25f25b674cc05fdd1514ba073408252f414eb4d3c791845aec4424770b5a4513cac9d416a67be8e075b3dc5925ce50d663e6108c4eba29144adc2b08eba0becd5a3d2f5e36683e7aac4f453150863669c5072472bd230db33d06bcbe0e6a8eb602257c4f10cfe03e3f712c238125c587ab72bcab0cba1f21a2ece27431d3eb12c760eeddca04f41bc741179c3f211619fccd0ae50379275b4cbfc4ba6570262bdd8ba3face03a6e65d2fc6bd9c1fc4856a279de8a0c5e2ea58304b7af1b95a5ba6c2098a0debe67315acf99def2bd16adf079cc9532fe3f50be04123445ad2cf72e855eb36ee3ee3af5c958ea6d4436f397bf106727bb8dacaa0a0a044cb31f456a3eaa7e2c96800a3c59b6c3255ee8326545d956c9119c2a0a697168e06acf621abc8f4b81b49d40f25a1df010bbb1c423a37e0425cad5b2012ca5d4e3a0a33809535c4a730221ab583f478be52edc5f740adda94558c02a05cb0b56c88690e729bc549b94abcd6c2c8625ad95f31bcb22ecbcc88543bec00ab75aa7dcb1060bbb0577317bd8cdfd0a967d2654543e5eaa9f33aae3e901b2e4f1a97f7d374918f86ed083bd42c5a4b996d2739b7b038bdb46bcacaaf79bec7578ab39d64ad25f73f65773e859e2256f225d23fd74ee4ba350e12455b79330890dca9b7f42e8415bcf418991255b2df27434257b5f79831b7f2c19d930405c1f06b5e75a503e0e68398b1b0023e21f1923b34a75a1abc787cab4f2f71cef7d63915d4f5603d508159e12379ec711291f68b16399504dd2b1467a97397febe16770c0f2be84e1070bd7fe1e8e1e5ed91ad8d01ff3d9fda9380a4549d1ff03ee8e7199adaa900de48ba7e9716dbc5037dfe3dfcdf8287e58d41ba0b0974b342d201c991870db7aa1025987f13d1684998c2349877e37d0870fe0afc7187a0cfd23a91313c4e80ca78d029708da936e8b639735f06ff3dfa3dd4c0b88b836295347dbfe18db44f88f48083edcb1bf8d9b6e631c8c024199ec4a742276a570b12d7f6d9817a641605708c51d556f44f2410425b799f17c9d0e5598c89c75c86465e1a7c2fa137e45e7eead8a23058afcbe34ae1faa1797524ea3d5ba8cff0d807ddd6186280c5d452a60ba9286dafaac4d5462a6ce0accb9c7f2d9a2dff6f8e655d24213e46593ae40cbf59ba930203b0494d8590ceb027611ec73cb4af2da26f59d3158d51b921011e0513376b951babe06657128980117b3236b8a07e1b6339518c4bcf802621f2935e2541ea1510604ed5568a79db93029ed547322b7f491d814cc97b3dd98e957eb595f210c2a6291a01afd7f7322ca4547445fdbf605986ebdf5c1737dac4e0a070ba15efcddb901c24df73ee1cabaec7fdabbea8dbb7a21962ba70d042eb7eaec4d3d6a4b2c4ee8f17a12b7ae6057ae1d8b7f5bc74eec9501c25193300e1281f59df0099b98d44595c0d89e54c7ca284127fd416fabe89988564e4b669135d83f9ffc5c8b83049e2f0e8bbc813640e5953558df94f3dc627e1da26a1230f6caa37681bf48c951748b61e686c7fe2737a89680c6356ea4ab9fe392bcebd71d6439764467b3cb33758bdb38ed7e5dcd9d5ec9826a81febe0f5160696ee01bd105f2d693e5b3607a3e60b370fc8213065ff51080ab42c1bde746d3be6cf51ff385a9cc6b6a5ebc25eb4f82265ad6debfa04af85cc0433e6bd81dc9b841c618844604312de794c2c35a40b00d44f295f7fefc42d6245c853c9700dfccabaa12921e732e3bdc3316ae6d2288b5229ab0994ae45208d8106fc81be67429b16e51b58c2526a201e87b0c3b592b449df3c577d71f8a04539b6db1bfadd365e8e1ea1f857b310a7269f8ffca013ce0040e0a94402d721d2dcb7144842230d8ae5ba6096a0ef0e385442a06cc3a4fc189cb29ba7c73f01bcbe4578f2220fa8e9d8eaf2b3b30e44bd345fec1f4465cd4174d36df8286691f7de610c68036a1da277f4f4b6f0dbb9af096e28143741fab33a66dd42986d0325d7db58f8f3f1aec37532b5fe98f4f6712b05132edbd7a267ed2b61497fc5326fba562c135c5e3a7cf6e69b5c79d986fdeb5b5cc4dbd2f2feb682ffaf7b3db72c769a910c38a84479df4e6f44c7d965313fdfec9d38de5ab865afc6bc2f54d61391c793408189158dfa73e1326506638c269a3432c8a6a5e419617a7703406c8ecfd28090fa106b6fcd4aa0b694e2fbd71660f3c158f1ed1a71dc6308ce5e20e554460b5b6aa556be16f32fe045605dad9f9284a2bed96c0b38a5d4e3dbfe65669253d5ab09fe7c3f11499a8fa8946ecd4a614920d903daf0240cc858b286627860772bca0fe65cebf983a77b7e30b505f9f441a956f3a6dcdcff57d8185c2a02b625ac154d9a0c6bff61ae24d1e922c4356b5ee11a261034ab120f1c0d57b0e0ff17637de91264cbe05dd5bfba08aa52305499d3d066024c992e30ead93c16a2518dfa4021fb0642e0840e5b278d7b83130246640a831e05218332971a8f3a54f534eb50d421b7d53b055a6bd8278b46dfe7e5815cdeb6246eed85dd5fd7f696b988dd8e956345175dd20d87a952fa740653813bf5d6b61fe75d4f22cf02fe8b6f174f40e3fc6f5bffb2c390a69b8d8d4c2b57eceb9ff0cd485ef96ba1806728d714ecfaea3ae799b20a9005f3097fc71a5a35e225b8ac8732a79ccf701472f36e3f4e4eea47516d88cc64c1392908e19247c44fb364024b8d423a8f38c2fe59c47dfa238253a0e6d79301d9d776320b921936acfba6ca962596d9dd78b0988a802556666f5433b3e2f6eac21af4ca7913798aca6e28fc208aa14527d3073a77d12624deb7b20815ab75e1813c3519c1c5c37520a20b6aca1725d068671cb5ad166759d49905853a92e6c2490f2178feb5e8e7a215abdd4c4bffc239804416b105be934b40e1541934858416ea4cdddfa126f4038608496fe05cc14880c9686f4cd2e5c720282f44893c8b1ce3d65a78dc57b40bdaaaa452873b9cfdf65f872bc031a2c0c70191469a362e29b856639a90f17f131393ffeaed7f7d5e60bc82c8f7b1aee3fb798511eabb05e370cace1a987e43fda50243f5f5e7af26244a28e05f3d530fe25feb942c82d3d846b453a21f02f8003ea688a09eb4cda85f5db4a84b92a203adb2b91fcc1e838beeda0a61bd634bb4d7f3e07d81e70ae5ec0bc7e19f46d14da93fc3aac6270c213b42de1dfcc2214826946a151df09f67e61465d77b315040663a254059eaa2b2f7442217898c44e916ff6930ae8632d576d72680681391edc4aa1070d28a6984ffdb07fae5fe720a84e655682fccca14b3b95fe45e3534d2dfc9a8c33af0f85e9efbeea970d7ea6cd67615b3cbd1ae6fa268b3e944a1b257542308ecb256693482c425a72058f851080a90de600d140c17db9529c5f1ebf25624bcc4fdf21632702463ad80557089eb12bb31f885231372294c6b89be502b9fb67970b0e1342eec0f2e79a978e3ece3da45e3710375d4574a7d37b7ea180012f55c028287d3f196292b8f15cc730148c01b945c159079253081b0469f3f173969d10373e8fa3e1551be375b6c7130257dd0f0c64454faae33038fc283da2728131ddf19092ed4cca205bf64b58efde89a5f2588c80813b57c5eb62935436ab33317d14326d6d1a8ea568fdc2b6ed08ac46ac01a7c6947b5bf12d025d82b0d09a51d51b3706b8029b2db32204e8c14c5419f7277aa22177da15b9548ef6a1a1021c546c0a7ac5a55624793ba578bd21dc25a704f71dfbb7e00f0bd3a4d66f2052810cc522e9e6e2fd1fba9b82b60aee239697fb49c3c5d70552d7f5d19bea8bfabc0fc2b0ddfc9af698f200d9eb9c36c24743ffa456f09b23e9e5ed53aad1d7fd0580d173ec03e6ffc819e846c1b48e11ab6f5affda2359252d08c1d6e85e3b1ad4d54b987a3972609006169090f3a2ecd76e36025e1a63e586f9e7e3ac7056dee318a69c14d43dc3e8d10b3979b0a1ea2d5d295e1158f018553ae51bfdc0dce2773b4b5b40dccc626ecfa4315d5ceff2a04fc9bc5cd17155260dbbfb6aa4d8464d7290cc72a8b6dcbedff33af42ced74343d79ea8b0ccceb708278046f390b0e4de0174542c8b348f49e974dcc7fd668a3b60584681de095c4bb2459a0b4137e64a3c14254d453902b02a538db34632bfe1b01ce2aa901669e666a5a729a3418750525523195c1a880397813006ad911821c16b8a8036775d650b3b4171eeab7e2bb31cab766b05f649c881a2ed1e7c75c14f31b14128c4612a88809e212672cebd6e33722be749fc0802a2327d7cc5754ca6c4ae7da09a891c1f0fe58f9b454bd4e0a51af5e2ecef75f772b497423c4c649c12251070f9ca16cfa0738aa38968f569de57e21d23ca41e19f2575b819719b570ba228fd43bdef991de75303c8ba5293209598e9ff6b0f526ef6fa43060f12746dc9a07c8b2a5280506d2d499218a00488ce0e065ad8863dfed034bec077bfafc3161ae11163f774c9ec139cb2d5645518a76590f1bce60bbdac2d1cc4fda17e58ddb79968b07490841ff343cedf3ac1a30457350b99fdbc68e947c76eb6f11f1a6e0a5b5ae848e1bffe2dd4089d334657116ca14ffe2eb60d124ad10c009a9bb07005b3bf789ff688a22326909cefa80538a43198460683a9e4471b1a53bbd8866e349b387703335543677d9a4a54b02491062ca06643ad4a2f7f24b43dff7cf10b6143ad67cb1b94057efa53d0176317d56de1f6e281d8f69de842ac03dabc5548a7c980f8c8a21f6b3078814fee14aefba6045c5be1901993d17487fc98217755fbb946c6c411329b65a23f1beaa30c486814c43435bb9c359369b3f51b18f1a93f5dda68888037f42830fad7cd6950c6a76caa3eb0aa1553ec0154a844d5500273429f0f5099cf157084e086401591b370bbb965798bbedcf959deb54a07e91ed9a85943f7859369dedd6d94f3d6544386eebbd81189de3d5d7e804ecb2743fc9e2b1f55d390ecbf8923ef407b8891b187cad86a4859bbad945a5bd79d6a2c3dc5ea744dfea26af63501160e57cdb707b757c2b6f7aacad8fa76e36279837d4b118865a31125bf98e4772b2bbb74a397d1cd0ff53edfd81498facdab178efc1abe1d446f8d81074f6ed8e0e4011c36de9f15ea607049fe08e1a3d5e9edc7474ad2407c1d239ff4b0bc3678446e9122070ce4adeac8f87b5959189db3099b04c8eae02728c87591119273e30f7a02d5666093552ff32f35887b66daf533ab82c2988d4c1c6a5beea8a25a66d08982e842b471793713aa60b48e69c0a2a0e8e3d844e287e928afad1e0182897b98cd191355c60525231682082aec10d9edbf30243d076d89a3a9b10b9852f603b6d3bf65bddfc6dc7a9759f11715cca376b9d9d5e6fcc3b32da6b6e8e06ee65eca0102b82ff39f059c6891caab193a428729acd9d4bfc23b7c215c7358ca0f72994cad2a3636f244bd555399c8fc738cd689127fc465ae80fb0c14a23cffe05e490e4b2a671236d64b7f8bff6dc556664665174097238b61ba621725dfd58a6fa1c5b75df1d7ae3a10174c558603399f5c3ae3c0f5bf15a307d5c0cda1fee964db22b8f89768254c97efc8142d324820a856b1a00ab6aa4cea9bf90a75c5fd2f4e896c198a65b3b502722d5f5f333c066deeaf55da4814831026585a4bc27922c3f4b2b3c3ebad9fee018d5c454a7f491b09093edc15283e58d3f1f864030d00374f745f38ddfe4c28dca9943c9f5b9c3c368f8cfefd411a186a12862e4cc28f79b594c44b30f5b3dc42bfda773ee74147176acf1a2b1589a03243cda07a9508a02c9fa7d1b3b9b79c96b5c9f2d3f5ca7f88896a7f1f652eb43708d58a65b5b9db09456f17639dda832f0996f46c15450a8c404dad293f53a5b51b5201d72fd818bb8cd000d4da8c724eedbe4c84fa14f136676a679252d945d2c7e3f3349f7a94f9beea5afb334d341079e415b691620f70f04e0dd33a974800f6a81b68fec66b060fb7b80f2a6be16d0c484d78c2c88a129cb2caa3d7324d82d42a70328bf8262d72271a79dbdca2c1827292b4bf4c19cac9dd90b150d1179c4299c13a65226bf94e2a25cb5e0a44f2739f49c932539721a425806efac7923b20e85931eb52ebe109ff57261b7e026e0ed79eb54fba47504a94089da386ee0975c206cd5335497ded0352ee7b17aabefd6c059277c127397212d0a2619d6a3ac15409bf529a1bd7708ac51218b7ba7a4385c83bef7c2e2c74c0d823e220c930507d243a2b9a5c2bb944ce17ea5a0bac841d96af901769472de5ceb2dcea0230b7cdb19d76207f06815eaf8a6e9cb98ff004b23bd05db6ccebb87bcce47052c18104589be143e2523e7c3231874ab8ebe862ef4aa39405b87d512e4a113588aa315e72a3ca3ff692951a38e7532738c4f7de9f903bcf4b49ec12115caa2bbc765a706b32d9c3a7fda899315ac053a1b9f0882519ae659be9325bcbdcb0a5e8f781b88442d7cf0515fd7350887d2243e28e51352adac496b8d3f80a11d5de5f029b6c847d5929c985d20ba849ec6b29ff50af08b7f8936806281d2142383a45c1193efeb21f025b3581d5c3e2c2a025cb32e862812469bbe785cc8f4c9f5f33e0bf19827380f193fa5b4149fd2cd0c3da989d7130f4090fdb16813f460681c915ddec339f0ba91b75e50556fec47a8f3ff98d20132a371b23747458c783c76b3cbb991d5b0d65124b21711f927a5ad4ec04092a709b53c5057dc5d2996b50ec75a134e08ea11372f79ff577607c973cc4f8ae6a659d700b81d517a2e4c8ae86ae58e270cfd8730007945a36e2a961a9ad62e910a2f49302f72e37b5da2b96509ed24e34108def9699c60d764a048f4b15bd8c6dc5929832bbc255281f0d1b565b3437d8d5f79c38daa64e202f1e2486b6a225d84b6fc8cd10c6a1cfda57615c56b56493c513528e1db1f698336880c37dc6f28f003734293ec044363692ae938aacb95063b6e836df1a150ae99e4b620500ffc6f02d3c2c5ab76eca4e4f5f49be4b62b9d8429f7b119dbbe8f5eaf32378c6c974d08dfc816a3adebea48ef26c87f6a5a31ef4baa4ad2c5711bd842fc4f35b5b6bef928bc034772e29d7d12fd3b3b61cc39288ce02fa2aac3f5384d7795d09e161981bdd706ac5975169f5564fcde8730c8e9e333aac2f6b34c82a265896aa1f0cffa2c3922661c287dc70d38775a6102b0362580cf630bead344a7151c89a78b38b32e14e69e7e9225651d4d5e029c1e3ca3dcf644d57ba33a68bfeaa1a0774624230c57310576a5763e20461afe83d0aa7633b40abe05035e1227f91f23e20b2d2fb35738ee96a9b25cc1f2b4d5fe9e0b721c03c2658362cced80d794c73fe4987831793fe54fd9e8ceec69cc7f42d1ce401f9ff3ffc46a6b4a3def35dde3169f11afe2f511bd129bd3b98cb50a044d759978ccf24a5b2c36735f4a8d1ee949d3a7d2b2e6fa6e04c773cd9a9095188c777ba2faf365212be1a127917c8890e51b967bffb5d795ea2530742b83ebcaef03f0583b5a4b25dacaa5b0ec576bc8c8d130cb625a00fbdb9280863228a6175d163175dc7bfdad5c8e0f0d3bbda73b69623b29362c63783b428f3d7922a5199dde691332522cc5aef067f2f08f5a50081e761c4f2913036f95efd24994adbcbcfcc7b67f2e954c773e824d3d95f8aca04cf5e52bc671387778f56ceb445f671dd88f421e7c434b4977ab40ee5f5608f9b7ea08b23f2d870dc6266c3605194e09a9d6b9501d488008e1395ded04f2c8d0d744e23bfa87052621fedd6fbaaaca5ae1b386dcd2261468c7f76b2c289ea6e72743e3fb43f8019dbdf0b4504878d7b69528f44718ae4cc75d8038a4c2327acdeb3c6a6c59245c59c82f2120b46149093f23a21709d6c33e8c9df6fd25c110e7e4e248f7e96b1f914a6a53c431b0aee78db8ee06874dd6367473594005f6165249a87e8d5393cc1e1ea229a97170b82a5690513ded5b63712d0ce5d205d0024198f17a228d8f22bcec62a047a6fcbda1963d5d21832ed074457f62a30bd8f21aa1aad4284515117ff9607538eb51d51cc531d0fcf88ca9900bd28a07ef11551a114a2e691d76822e62a6c6274c8a57a33513f4f08d815fa6d6c4e69cb8c0fab17a8f8ddfe12c19a92aa13223213437ab2c1a8d60f4445a4017f2939598dd3a66ec29b695e89d79a5856594134095eca45f19823022a4c667b5791d28359c317c523090091f4f931db7c78421370ea8a7db22efe62cf1d571faad191899379ede566f02ca7d0c66215a9af4e8d8eaee682e4107545233283eb5fce62ce0149a554abaaf182ce649a4127df77911efb59e15b5ae5a98f481bb0ef1c99a95952def60ed376b73996903c459aaccae7f91011a30d6f7012136000dab754e0069367732339d2facc095341c57c88862ad0834fe7ac044dadd64adac246ff99569a120d11ade2f87666c8f801278075d0789038a7f70966c77d3e2eca2ddfb93524ba5b7b7fcfe082e6f3d6886b3b42137225509d7239e61520e98c0231562b6c1a48bfaa595b97eae369d9fb867b9d2b518b5ad89d95010aa1603afb5131a64f2c77524ef052659fb2d28398a995494ced22d049a22e76ea742391895acdd52ad57392c0b5295ea0f3188329614e748262de426f468b782a8be5fb653de30e49a986083863d93a004bce83179b28551d2d637f9ac90c28eeb637138b582491f55ebae4caf8fb76fc4614bfa141f62bb84b3e2ebef9aa8cd8b3479500e4b8c90ee94c49e8568d48f70a97f810b3f92a302e475bd530d5287bed51551d208922e93ae7dff3826546786d01ed0187a239ec9b8ad563622c4d849a7e5f74b7e1f2d1d13eecc1f5eab5ec6931d34ae1cf0649b4cf3086e85c48e6af65d3a2c97ce4b90c21c1048dbd9f76d47f3d77303a7d4d4228ed7329207655185cbd133a401dd27d6dd8936dae049bc6fb4a43a661700d94cd8ff9fd2a72a5a1037d5388662543abbf6855c2bcce3ff48a120208fa26491d12899d0c65882f715ee6e93f28bed2679a5aa7559b3ff172a82a96b1282f642d40fe5ed612e91680c93aad62000baf15bde39069cea3150173aef8acdd9c97784c6adcf93b5dfff574021eea110f85e88b446ac170a5293dd211ab2b12ed2aaec3114f309c2b4c13e883d91327ff45e8421ea22af943ddb9c214dc95a94a7624dc40faa378d1ec3c755e25c30329de3398ebe0327ee892ceff16b5adee16afc3806f8b6bd25739f23907521c06e90320bee22d3f754551f31555653323a9220070efa5242b183fb3365a7d8fdfbf8a95a3138cc71673b2432bb2b54ff07c12656c1bc10066a6a0120fd437e91ded602f30e13510dc192d657d4e6244189caeba892edda033d490732f8fd562c1f85dbe9310cd7df7b12cec8c21cdd4c9995de536055cabe1913b4d1d991e154b977a19512cdd7427b68c9d53bb59be4fca63a8b4d4fe9ea2714ca07cebbe733bf3550b1a9f62105ed08e7e1b329fb0a9c4cb7ff26a9470a29cbfb283543aef326aae261555569bc0efac348f9677f67df59455ac5755720b9d611d1b571db4b1086d59b8ca443fd1eda4197616bc8657e180ac710c3d8f21ba56cbecdbdfc4336755fc215f552fd1693e37cced71a8f242d3328456d0ad64f2ced4c33dcb08fe1dfb71fac591a99c151c8fc9017b175a21a04aea05ce380dcf14aab1ecf42e4487a57329b73f176c9b87ec17108fecd0480ede99343ca5caad7826f11d8903cf63b10a1b5c2b917ce04001eee1a7fe8aea78e1c32d0cee443b16e6d785111ea8813960469687e1eddc4d8b979be86295df22e6918045cf3e533e9f93a100ac582e3bab559e8bec866405f9d55369ed8768448232a148336d1253f6d3debffa81da1069eb1de59a8d955f8e00ea8168ea8658c16fd9ed04892e7af2f523cefff25de209e56e9c3b4c448e7e32afb5718778d306a9bcf61e6677aadfd604f15d433a567671d63f43019e94204a550f4b356273e5133f0aa468623bd8944236aab1c5e19c449aeee9c620bd057218a9c6cab1e1bf80d0e8a6ebe48a0eb35204d2e951bb9c752c71acc3259d5567c8f82babdeff387965e59caf39c86c53ef1f400480067edb79b70f388417f09ee989d306f35f8297908629f13459d2094d4c45f252fe6eb9212cb8d77960191d71191c03fdd7aad5d5aa7afa696e89c99d120179732aa8a3e6ac933abfae0606fa0e078f761c1f09f6b0cc64f0f8e167545bb22232e773fd268bf9695837f8ff3fc90e0741b4fa71a50cff68d9e460e851089ca1cf66640038782fd8c80738ec6dc1855f74d0cccabb4d84e5f2af83a98a44f2075759b5c23745d0e33b730cebb73ab9ed8c8c6e0bdeb4996982b13694d66d6bd341074e5b7e56a1466e559807ba23c1a2e2373b6540f3facc01aba690805205a8f11bfc74d4b2701688baabf495d5b87938f0baa45fbac3736f024880386b85009edba18285e07a8b46d7355d246a1bf846934a464a611e3a230512fff853999127e3ef347f88b0c563627502fc3de9b11a4a80e01e14fa6f1673c824eefc0b7d3f1aa1a8549365a63a95ce8bf166b8c8ad282a1d9a5b06f0132059517569a5a8a2f7b534f822c7315536b0a88a930a3137892a6a06c86d2522e013a4eac9832fa08ac24e462417e40a005208eb86b691d58f4c8bc82b1b75fc6d07b48f56854db1fe061ea5617dc1cdf3417179056abf928eef12563a60360d563c9daf969cb9737a525cd4d974592f16594a4375480c2eb41978b41e03fb48a88c0f2daecb9376ef900d4d47a7dbf7d1e3f7e917f889a3b2b4710e595d386b1e1a0680de56021a9487e3f9c613075d839febf48c5c3744ec44fe6552b11a6fd6fc485290145bd831a9497570557013b7067486df6ac1862cdca39fef15d500b7e28c2595923735bcf4e3ab95509bd45e52a4bc3b9ffc38d25d3e27854a3ca8e4e26a4866eed9c6e3604fba0db65a6c91029707e0067163fb52f72abf86deda90c7de18237fd17660ba92fc427806ed598d4a3359729750abf70645f8d3cdc5634d60eb338bc2281bd3710fbccab1247cd3eb7963c9c46820da15cf66e1fd5cefd9ff7f562f4a72aaa15abda7be8dfda8435662052e36ce1d1f4fef6c1111650267f682402ef3f9b97737c5af86db8c0c246ac0fc99c43995eb8cb5b4353079463af2a90b865c2041a111916ce0830b195f0a00874912f3b771f39631836bd29057b5ad4dc71ab517c396cad82e9d31d86a691e82afabab71340dfdab0b2677ae437ce823723902a3015b00edd6639b1d36f669c67934554ed04e7beacdb6372fcccea641ca77779ebebdd308ef4c764ab61f71b27caf467fdcadb2d36bee49f103c4df75571b4257c2cea459c15a2bd52f2c2bd7df629ae20c9ab853f25890be9dae831087d2161291cccc48d6bfd4143d19bad2922a20ac0316f29b277dac55017002327b050ba836131257ab0db76aad90d2a17183901b325c6cab9861d6b593aa447dd3ca07ad9e4658af4c51d782308b1f83e892b04c749ecfae959d68f12150cf309f90e8247eaa7234b68025fa40728422af00ce7d27ae78c646ddb0083eff09f72450b0cafac998427f618cd1715ff8c18ce3205cc47652c2c993568a40345f5eb72779b0004fd86eb2c1764525afe3d44d1e5ef3add97eb3ace00e9347afae4cd5f9511c33f807362e6f855098d3aa38bd3d26128dbd8df44bd80fd95ebc643f328a62e1a2f2421642a0c95a7eac4e85ebc41002fa5cfd2f7b40de7aac2c749dc7b65400625748c463add68c337ea116fe396e13ee1ab6ca65108bc8427dc1ee73983942f75538651245b4b6ec931413bb4c13a6bd514943fd65dbd27171183f6aa2127c8449369d30b6f87c8142f7be3fbcf1ead38ddf0c6157b0df3f852c1172663c8de5823db9b351429a6b176687428203e0315bfde28dec6596b15ed03be9c8b32fa4616dc8424a332aa680f9b53a1502df5ddb13bee822c83ae4fcc2f332e1d3a57fd18a5892b6d5b8639bb5f1813560d19240c3b4810faa1d8bcabeae02916d83b83474920a261d51bb09a8b871359647d173a61cecc81336c525edb5dc713e8d37046da3dc58687a93811c13bc4c0ebaedc5868ae89f85b59da4b02d751af3e7986556a75119e41753d10ba14a1116a127c62bb841a668642b763eaf92c03386436e1be91e3d10e6f83106a446e96a338e2ea698738bf6b8b34349e56c0dbd9d4994f4633ba2962f0cafa978140ad480dd24c8a521004c373f3797faeb90e1e9ca4b3e4b5c470a39ceff250c59248714e0d0d6e8381986fce4c510c3008725e6c1e6b04fa9dfcf572e5f1a120721472dc512c74d2ae082a4942fcb8dca9d6b3ee1764a0f3c4c212a8e30260f3d098575b04fae84a67f97e5fe89ea784a0279fe26f784848a2e4212b492bd6e24bd4cd5c14d0cc2a3616202fadbc1622e94bdd5d7c85f9b88c9a0e8ad273f0591c67ed80e626bb1e9135e137a0a49ecf77ff6cd310973c6500ff9bad5b5787b15e49179987fa88f077fd12e32e9c04cc217b587fbec7ec833d02a131e705868ae52eaa64d83aab95dd497c681b0d2c7e502d371e776cb27038fa7b094286daafbadb96429dea74f4d8e8f8e3df30e72dc6120509f172383d77d235c20373565d566be43eb966f8121fe23cfa3824e1ced9bb1091631be68f79f7a0670446479b462817c02eb3c32172d057557dc3172b12dd868099eebafcea2e6e738d213108a4faa0a7c30d39f5e9552e42477fc0704b9314b14cfdfdbfd6854d00c2d4b08cf33c52caea7c264433c68c41c6e80c51911c70e93f9c6d338f50d19965bbbb6e6a37167c0d70f2669d5d2feb413f7245f90ab387378d8bee0dc4a55fcb5760f235d0687b51b9e2a66cdb9a2b76520dadc3b58b101da6092bdefd940ede63791edcdd93bc71e82ba79c579e631e0760cba65f32417d977cd339660b4ad3698cba07bf385b0235fe192739f05167bc26f23b33cb891db00ab20dda7aae49d8eafb080829705033f324db6eeed74e327b98c736e8d91ee9c98ada6c686ac3e406771b287264a3d0e53095b835c723a4dade439d8e51682676ff8860b94499e1407dc1d523e8640b7751b2a0fd376cc50730cdb65551bd5f64dec28f7179538337346787c68e0ee50a240d563758714b06ec483e2486885d943d65ed65292434b69ad965271caf1f97d62380345602075bc3a41419cfebd0d88a681c4342b9b7753a3634fc19d561ec449598621227c032591e40ca818edcc5dfb3aa86450c4416c3c92a20f48bfd1421a9b208f56ca8cf8e58278c6077a3f10ba37413eb63783aaa089b217e755692f1b0d1e6d7bc4455153b60d3e8bb420968181183967b4b942fe0db86b1de6a7c1ac63dc9c4227a5ce1001950b6bd1c65cc8ad1e67e3d664a06bdbcf820e3b473cb09567a9d6f93bd24be0880165ecfbe206fcc5fa3e2affa5b682337a7c16c377e9c65500a7119f621220c68d46d55e57975a25b5ed45184d7c6e1cd95432db77667cf31cc57f6f2600494c1fe51be80184222db904ed2861a59e36fb1ace1ae02c068250ef9f4e51c2c235fb2f94b3b00f7f1802f962578723dcede3ef035980bccb6d38133c7936b2e3eb49ce18c9f2c0965ea153260e59136ab627c154b84c9403d45cc58e882e1cddc92add480a26ce86b8372848c3ac8aaa2e1c320220b52a8eb08eae20ae68aac994e2a88824a5eb791afe1447d443447c15852a16dac0f102f6ec6cc8832924983f4070cd22551e7ebee86646707b7e3b1d7fb08b816a7f77a68d9e28ff43d3264efe0497057676198446de33f15baecce729ccf3cbc77415a5d64af8d3a0dfac6d0c042ec1c811d7ec4e973049dc6a0eb9e0b04c91ad08fc7e0f4c08df76e33986c8da0c7a97eabb891fd996ff3f02e104b5dbdf9b7831c0326b8c48956b200d8b95ea7fb30d3f345a0447c39a3a5db56a664420fbd6e4896346f4888653f7d72e813cf8174b385feb65679c62f0f95d0fd3f88c4601165cc71f47d43f3b801a4ead5876e08903b2f523ac97733e25e5f5e74b757406165397a0045ee3b3eccf8513ad704a08c732c921aa775c7e36c469d20e97947026abd1778493790367dae22b9d70e04cc6ccb76b5faca3e5d6844e0bc50b7c2c910c53cc872cc5c010874379875a83cf0abfc92e2c4a57b644fa0ab02ee43c7e8cc328c8ef1cdc04bba8a29c0ead76d08963d5d089c0dc31aa4968d634f6dc803b7f7ca42fe10656ecbfef6f7f98faf7024a6d5f5049d3d16a97e23f366243806c58119d2b20188d0a9a209512ecde8fb4d6a1cc3b3c12ea4980a19eb3ccb7b53ad52209856cb5ccf01b73e420ec7e213f24e47bd9198f4509f9548ed496250749f49dad347e4043f6dce0b9735826d4a554fc043be7dd4d722b61aa64c7ecb3fca0eb59da5ebec9664b5c3dc4755d2647e4d41aaa9aebe9753804e38b5028096f964fed9a5c86c68c642a3b04a10df45d79cdc1a4641170e84b07d7067b07efd713c11c3c08bf401cb185ac46b4d4f50d69c5426f180f5ea342d7cc38e214d112c21a5b2affcaab8970480308cd3289c468b83a4f5b8ed822e2c2bdadb072aa5e8e3c1f399ca90d1de3f4cd9a00d474ac42e05295c43e51cf4320db89f78a8a59caef7f688d9a20f42d20065d9a19d3db3c9555da4680ae3562a7e2b612b7d7df47d5e447ba40e166d365a9a4b61cadbf99f16c3b75793b43751df1fd5547fe2fe44ee3824e85a54f30d0fc0f0fbaabd656a87a197625e1724737c18017109960a68f042148cf554615361fb46909140dd9ba5e0165279211b909a8d0eae444f9a099751d0cd60cdfe4b604c26a05850d247587165af630eb2688a9bb0e86a23aa7370408c4fe739bae2f1a63ac329eb81d076a8ea3f57c124d6355b44f35a2875cf390cf4f62a8bd1ddc14b825e4bb18a4fa236a949cd991efbd6651885f9b0caccf96c8e504be8cd53c722ab890870816744bd8ba37b25b59503a92ea64c13b296168c9d25de7104601d726e6559e9eb466d1777e1f79945b63eabf6ea511694d22d915b4313b9fdcb34ad9c2d9d5d450fcccbf82d1431bd991f9dfc05cd95d4fd877473e8b5614859ece1d79584ee30ded1e5676c76802679b69fd6cf9c9413feeeec8fff29c5b3dda9972977bd7c096cfc83ea76475790f04a3de4657ae229b7c225facc13ff83a6599aac01e25a8697d487febba0df9bff4339440462996045cff0245aa5c7d69b0dd04af41d0e238f92be64bfb4624970907077d2029330b864ea99315d9811858d58ab58a404bbf5485161a1612bc47e6a0676e451fbd209cfd024146d456f39139b50cb5f7df726be05da8b039bb246307542316fdea80fd80ceea02d0657ce2028021626f9abe05757bc020cd009a7a764ae70e82a917ad45cd24a193cb048c8d14be9445b63b7dd5f2fc084f309d1bd9b19d093e7b09b5cc927894594ab1a683e0d2ff510e7c414e30036c95d308c5a04f88036606ade109e013e48019612b30097e425c282368b5db048b031f201798095b0193f00be24099410b7002fe0638206686e358edf16bec1afd8d4ee3b7f16df4373a8dddc66ee3dfd869f48dbe46af1adb0dfa763665178128689b75b0dde187220af485a14dd085f09939e78cc17a9c3c7e66ce21635a4e93d39722d798395b0f13e3e7c89d330d967372fa9cb863c6d1324f18be47ee9861b60c13e677e2983246cb71d2fc19b8c6ccd162e6e4287d2e73206724d8f2a17f52f89a38c6ccd1629e18fee1e0486e091b4853770f65f1f97be0ce8c9375aa895121d573ef05cd9e76df3799ba14a82dfc5053b97d38009eacdad67af1c8c53e1d92883a5ffad380b420cbf229f56115f427e85bc3d2c87f7d1f293b507bbccd5667587ee23b807c1d60933f0325954c18f2ef11e725acc54a522370da8206f7435630a88d778e2b60aab653263f866d7211eb82031e018b8231098cdc8962bf5d82a539c7ddaf7494f2972a24d1c04eb3012101a0f3043e2959d42764987ee2f5d1e11afa4ed1dece78d48118c83b8991810f822692371e713fe66b6b2912e3e04a4fadeb90544590d3e7d18581f773e1e56f61641acc0573de12d6af6a0d78a59f4037767d25e33606496cdad5a83d215993fc27270dd6d22ba7927499afe0f3aa77af935be6fa7680965757c7cbc57c42cee0ae6c7833cc01d6b72eaaae5180aa3e852b02c973a85c017094b6d0f05bea797a0247fefa4cc50a5dce370471b0d9f6d465b6d002af78089e6aaba1dd5c56279b79c0357350f8a2eee06d2084140c4b1d805eb670f6d3bc43f1e54d8b391898aae102146e2d10e5e1cea833c895fff409fab2b184d9802e5cee2483544d2aa06975b483180a0f4fcb2928ee5ab0c1c775182f8ba15a882bed8c18f54483fac31f9bfd65d67c7d3c56f49194a88e742f9a92bb641c829a6608558975106ddbb6dda87a00ac68a70d12e5e061d2ee0674031d836b29db95eaf35676312dae63eab2f5d48c9ab1840e06969e395d80ab766927e3475ee314249585a80749d980c51c2e0f1d74d63b9e6835859f47ede59bb2c80814173d427d94d84741945cbb4f7d1a2a3bfd01fa4b512d40e1e36dd8c0c05554378ca76f78865f39458902a6f3071bb5fdbe7cd5f86e2511f5b77b2efe85eff72f5f65ac020091516dd31002f052b539222fa2f84127c6ad675d7b505b1621173952d648942805f969d7e4a3f8bd9cdf338b5f42f5f39a80e50345f3dc5504707b78ba7328379374be3c4344101f7b24e78ca78f6002977546776606c0e46db31b84757f95e10959184830e28ce5ab43250401e3b022f7340dda7db83bbd4d4e81456f6f82d1240da1cb35d077cc185d141b1c7ceb204581407cc6a52c813b618a04c7f806caa8df3d09b04a1d1ba57154867fe95318446e12aafb1b0d77cdc0236af234f7724a65454ab80c144f3775c92cc15006975936124b1c7cd40cd6c4ee3013195452dfa1341cb50228cfae44bd87812e15a0e514f5ca09eaef397dbcb84a35220d686f59b634be8810cc306c03170223c95054b99b8f33c1b14b20233cb3df430a868cb390c1ec34d3644fbd6bdfaa555697d7cb5cb24726dee2f5ada3c4da530ee15a693ed31aea1bf3a5e937adcfb1d68ee301ef9e76773c0674bad3d45a00adafc360214523581fecdf8464a40481cb22d541abd2e40b8ef0c6b2c64f2bd60ac3953522a148321ec7ff786a5cbdda9b39a791e09dce1fdcefbc08bd787c5aaaa79ca9602cd6e0f78b959163bef69198ac99e8cd7f9a8db0ac46df5df67960829408e2fd72ab370d786214cd223374d57cddaa898df01f7dcab64767004b9bc907a697cf090f10447c46b41506910d18ba78b4920dc3924dceff96b412bf23688150348a0d51cffd1d413b1aca1f142394e3afcb46b02a8682fdc88b15ac753d5b6f2163a9e5b1c492861478723700fab7aef7f9c3c7859627491a888feef4943067df6c42040a9ba8c93acdbde4bd03921b6278d39fa69e13dad6ecba0b7464c6b70ec34b93451b05f4c4600098e8b600b4681109a2c7340ebed12e62b301a936349fb7dbf7b0e4e7cd1ba284a71797a4dec830c731b37cb65adfc25e8fe8b27221b9debbc7084b026a1d9f53b0cdfa5fbc066d5d2d97311b27c8ae715085a4cd42080cee17c742163be37a9c00495978f9124df0075a2d8d77b3b575c96568a64a454c20c733bdaa3108d771c809e8d4a577d566f6e071f2e68ce086978f01af5eb88f80c990bd1154f98c607d6944bf6ca5984a8f4298491569d55942a62734836f07b17303723ceb98880cd87f3e0a82094cab9e73f7973ce217cff33510839860ea318856af9d58f16ad101c2a22d722e456f77c5b5dd27c5e22230a384496832e095297502587130b11645065f821443d336a74f310b4add2b779c18afe515f513abb14f1aef373d4f20532f612bce97183c56da0fddb77ece6313092d8fa1fc45bed5fdef6f0dd3b68b82024aaf760625dcff38a9a49c8c74d0cf8e1e574ec4e614a12a01905863b599398275b16f12e3d997c5049550196a893bb4a2ec5f5b6eff2bdea83b986d1e7a94145cc256979b5f956bcd9767498fa281c368248c8ec512a762d76aaef4ce388c4527d7c7b7fef2f5ca4de219be1f66189ec17409a0818efec1e3b1dd77c15a05bc63d0031041439487a46bd48e9d05a352734f3ba923d262d0af8a69ba2b4c1cc58055932742516311aba55c8b8196837e8622e1fabcf89002496e234019ed7deb3440a910209f8917e2ed152aaa86ed67618de87795fbfa3cc32e15aef20c1c46cd599cff0b030dabd2daef1df37ad186a75e2ce2addce2ae876876c3c0b823b30515f434243ce88baa3b9b881a669ab4a75630a774227a03a866ecd04f178be1122d2e99b5e00d5e0d343620347ad070e341209ea49d52914ce47111c809b802aacb43b88bfbb9a568211df44629f642ab2401623ba348d3ca60ed8e619005e1b9290b08e04b2ac7213aa7440a30e903847d6eecd39f7580eda3ee9dce0ec220c05fb2c51dd34725acc8ce054226c6426e942f7f53f24efc8b1a4605fb4e6b86cb4d6adcaa8bf53a68512b1814773b77557d8f6f32caa4370198910a00f99e9382967342e214d981edbdd03d83b91513fdf576152a2e7e70500c63f1ee95962dfded85fa3047526fd03398c5abcf3a3e1f02dcee7dd60d1d2d0884dd6631de69037414374dc5667e1180790e46449e10b637610e78e4600cfcfd6c7e1207300b0e1dd01c7a1923269269c866f8b6f075f3d5ac56904516f9ee9c5937a2002e66a0ff7c9c4c18bc9950c9a489974581e781d2779628435592d6f4b6b998259e910b67df459514a19f9445601155232449e94d723a6f9b92ab9d6727430c99c6282bc79944a43f2aa476efabe79332e9baff489d26676a4ef05f07964008361b60cfb10114efd31a910886d93d72ec3605762f722b55f26eb894e91db206d060ee4ea8e9238b974c465cea1c14a6fb06543629ee1165a34ce39bb1ebb617e96d80219105c3d35e3ddd246e2357a1c893e4f660cea2398632d567c28883d2e87d99baba04af7bf04542c24b2058ce767cc05232b48ab9d61eece5868b05533401dc2ec8bd7682de66ab711e89848bad04f56732803b2c3fd76080f299e7224e05b0a9fad8fc250c608b29be452ed8d8b6306556acf9f389a1270836a04413609a1d1ab6e1dd5d9d235057235390fad6faf8e21fa6fa9fabaff3fe86ae8e16ede74fbbaa32f73ad664d9c495ac98eea0e279ae266b9be1be102fd47c6f91570a91938ee7d3b926e76de3f3d7ac2ace80d4cb2d12a735769c2113368f28b44ffce9649faedaa6b98b7469a2fd3b5664608d66d6154ce85e4330bbcf3abf9d513c40d3d9da9801482019abb7fcef4e749ca616b0978a982d3e9c866bc8dd77f93f510422bbf4a5d47502761436d0d6e951822e396c3ea2f8e02b8c2b14d00bbae9f9cfb97c9d4492166458be0e3ca2e31a663b048bafc4cab50015039f67ffc3ebab48fd1ad68fc7106b4f36dd6f69e6b75264fc11c5b0c791de3ce77f9ba2b7239feaf4a87f7afc0bcced94842ff29d82192cf7daf49dcb93c2028b56ca886177fd293591807e18384558ddb900316b04ec3d623754250071fb8b6af2a4d87d18fedfdffb807cd408cc80f380030762e57a05d375b465a73f5fc798c68f54b4e809a4cc519618f7af1a468e126ba73d1a07906addcbfac2296f0d03de079189249d13c7377b9968a38ee2e0a2f6413a0c8df57327b2ba920f7595cafdb8fa79b58ec9a0ab4f5604d95ad1f697ff02e33c5f76e615fe588546fe0645ba6d1af5b6ca803184912f778b0db503c8e9b44ab8f98089b7294ef0ac01a60a4f1187a34fe4262909f561fde3d3ed1e6a5283c15b9964b198444d106e50998092d80a547d492e12f41a0c023fdc80ee111c946dc629081a3cda10a3b1e85c424ad107a4f6dcb99cd9811e6b225721990f41add00ea8b35b85387e09132f7e05e3a0ac49c9362a2a56b63d10f7c511b4c20250e9cde6d876114608e5d05eef5fef43caa203487dc81f6b805f97c80a0569e57b159e399600614a1ecb84c013930e49a7f4a9294f5c0b51e682cdb43676ce46f299b344ff2a8ec0b8dea68df35a3b10d5a5498a561a9f73f8679c7ad9fbf213321144d11ce971fdb9001581a8274a7003bb88259a7079903779b33dfc77dd5e2c4e247448261498158c4a6e2cb858a29cffdf2449b5f66584447d9a0381680f490accacac57bcf6c0ea0815357ef47bf7427a59d0de069675a8c7772d4ca9b6f6489b1efec5849c33ab7fc125cb50656e7ebecf740ba9ce542581c42a27bb853517d283e0160e445096a44577905f4b75056f4f86ee24e71e7a26fcd67309053f7a27cfd25d5e25cb7e152b2593e52db08390b96e867ab683cb6bdd64de1fe0f3d226486d5260e21c98a3c1fdecc460aa4589c9c7e2fe5c773c307d0a126c0ac11a4eb59e36214f7d9cf588b5da94fb963e3ac5e1690bfb9e794fa207e2a37bb1c92da3e0c611e02c73c9800c8abb6e3e96e9914e449d4ef6a1f531cb9c04b8bb0254dc6b99b33726e85d243dbe6afe96bddbb7364db8f90ddc2c55c56b7a8787cec8f99c2fb3016637cce6cd02d4c8edc45dab90e92470757516ab626ba967a81fd753c543e85630b70d7af61653abef4c880877201e7686d60c24773bc15c9a8fd5b4a2539bf3570ed1794069d31a044eaf39408a99bed0502aa6de4356809527399936eb60edc68b1be4921f5bbbd45c5ed17540886310de573e9024bcd290724386bf95602391dbf5c2a3b3c232d9d38a67422c80dd2a46f04b2baacd4b89c52986a90a5bb3a5e41740331f57e28f4acf81b60769c1e4302319c427dd1856f10704a8457ea09a50d7dad41ea1b7cbfbd428f3c7c2baffe07804800bcf8aa33785bcc42c8c910bb16217f466c237eeb8c9650d606240dd641329c2c4a641807a5cf4af5c070b261e4e3b3db17af687e2f946db01cef665837df1cb5ae982815b0e072ccc5eb6ea4820a553460be7344177a439c41d4eff30d84d8c69b360cf1dcc3c571b4b37b685ad6af7e7f30a7cdd4bedbac884bbd3b2d6eb4dc4d68779abbd387eba064596bba0c1765171b336d0e6c69a4be90223d0bb6f287b517b76b7e1ab65690b6e9cb6c2a71722ee3be095a78b3d4187e205c97e13b2f9212549ad7ff06a72ff5d0c7755feefe737097489ec6006b38a3414c8a8993f9f10bf5a5a0e9904edfc24584a06992e6de2c6738370cce0ee463df57aa4b77a59aff5ac9ed54fe137e5c6bd996ee8e6546481d5baf16fce1b74e3bdb6f7ee656f0aba21de6b1c017d88b85367f14f656a5b0bffda996dd180b98fd1d16854290a47847a04939bc1f9f6081828da7351104faf120eb2338274de14f873d7a7a969857b31957f1e323c82184b50b6abafc0b446889e2712db8579f42dbc752eec51e7a1bec5de6a4b7a27f678dceb3128d7b4a897e49e75b84352cf4e3d9374aba3be893def7c9f20fddde25ec7a05edd92f6b385b3eee562c585c2df2cdf2f41fed0d2abe7c2e2fab2e297e15907cbc50aa3f4e3d27d89c21f593eae1bf0acf657c5ab7a710dc14a736771e5cdaf90c060a5ce37dc5c518c66dec5952957538a577ba599cfd2cc4bb43206654af16aacd442b19a798b2bb9a8a614efed95373ea3999768259a942dc5bbb1727b60cd0e45375756db89b7f24a54fcbff2e8e8028d9f433f905edb8b0363fd5fffb90dddfe47466656dcf036f171a95ec15a377913e0e325eb8a5517b4dfeb54330b3c9e039aa3aa855b3052aa9a74ea14ae59b46ba470d6de23dbb6e9045638eb56919daa4b16edde55cadd2669b5a2c429a0621a8c1a841fc2100400529608e28a8c5c5e1ea20781e27fafd7eef55e12c6bc4fe8b1caae37b3b6d612a2d636217b6fb977e508e4071a08d3d5c93063a6f70428304134ade323c3ab90c4aa726154ac90fd26ee31c4ca02051e68c07c56a746a353a650a1d2f05a5792fd581347f922b613726c3134193e653493647590c28e0c9f2309f6abadec35b9d845c49f179b712d57aab7c34b21c37755ccc8d0c464f8ed03351226c3a334f003a10e0a199e7b7951c67824938ee24ffc9155bef803039213421d9ce10f6764bf0afbf1726e86af49d8afaa60049d3c8112447342863745f9a123c3bbd6b0e172d4ab65b75981ab11486402f6e8d33bd12cdbddc0cad938f1c795e1332e70b82a71e28fd59125fe1870f3848f8ee943391ec77aa932f48c92c68606f6822a00e00a226fb644596baae596ba6a3031352bc4d4acd082878367430cac5981082d980183e3f52b9b34934930482f47469c0d334a22986143110e36dc60030c830866942237ff2cacd79ea4b36389b2560abb59aa5a666a1f1d4c6c73de4c2980f6726d75777777b79431a3b3bb71f79d73c6ee8ec51e514a306c7c3f4208514db8bdadd37bbc72856d430c55518ecfa109413e44987ca802473ccaf111c9a7a5813a56ee5e72779883dcbdeb7e1022773f80e1451047b0c1858f4f8cdb5879dba8e46dbb0d236f3ea4206f3e4d70d00417b090b5c336d0c828ed912965824fa64cb041a66d84e00a0ebc9a1fb478811442190abde4243cc9f2564a964b4862038d2ce5490a1940b104a38d04d5b26125890c18174c36583093e784a922724ae8000e9450865d2204f2473a401cea92e59328813ab03f293e225ff211952f0db046fe88c421007cc93560f2d540470d24a5b5ad96ecb70e2c0cac819747f2104e2c7b0b14d8efc740a687e99b4803b38940e4696d8f1e666eb6daa3ad4ce7040206eac82f85dcba17038170b1c7bc95f1e6c09a590f03759460a58c929bff4e799e7042ab65ed5773e2ec0e869929868135b1f4ec26f172b64d579c2c5cd77ca90d3b7f8900b9d820cc566126550b2c0e7d13719ba065467b1ece0c4f3ce95c99613fd86bb5b6d592b03c3529365894bf24b0cab550a7b521ad8a7603ad8a5625571f6d48aba255f1628311484720df92675865fed9dbfb0f8349b0b6d24674a8854025a5437428d3a436a24374482bc106fb86cea6d995f436195ac928d7734a49a59452ca7e46339a6536349b369d4d2af31349da858c8c12d205ec66dfd992ba9c4497a3f6baeb4f292b97cd3eec322a3749adc8ee6e39a7fcbc72ba9e645795bcd3f2ba1c7541a6eb8926a59cb3bd98156d104688124883d50f5e6dfd633769ab924e94ecd47c581626d8278cd504ec8985524694230e803a992764e8c29ae8cd63aa0242424242a236dc0013e20398902a3f5202a56f909090909022ac616541ac0c3c071c5720f08aa214a1a13caf0cb1c168a9a252b56aba9d97e23830fd8a515830b231a2318ab245571e08a2427a91e50d07884068769a8e3d22cd545f1401348f4304d234d3b2c841ab2a14d4920cbc52d5aa66da81fda051a402eacca01ca240b1816ed92dbb65b76c198dae1a72c2e0c0e0ab6f61366258179113904498bf885d432ebd7bde943833d6dd46466b7777d3ae5bb7d464679dcdaa6514d367df289d31993541d5ea49fcd25efc8095313c0476ce395bad5ae984dddcc056fbe6dd314653de24d7a5bc4d4e526ec21a9ae54de3b2ca69336f25aecabc99b8d2c699386eeb60e84f53a96ea7086be067d10661a6076b20aedac4301bcdfe699aa6497a654728259bb3c8890decc0892644232072e287a8893432972191134300b52a154750031809694058102106900d8608030968074700418a15238080046486116140e9170c324018525a5fb4b42108815404243c1a08f10321bc60d2da322412628bb90358cb22592003322db0801416f0895181dd32240a228d9717b6cb902888a3208c0e932bb89665190f8ca094d23190fa05c748aa3efd823ffd82325158ae06444dc0c0082b55e4cb5b020bae341124234413506cab89272e2840c05a9adc618433a0384a810704bbca70e88c19c83439a307af32ce08e3c76e190e9d518433d238425249ea17f4f9017232001b3ca12f1f9200449524606087164970923d20609905329a65b406233489126589295714418a200769e4e00a1499cd3ab0840c5c800552e4600b1870f144e3828b2856605944404de45386444045e4cf7e8600a21184d08f1292f82162090330f1092288688827800c1044510928853434308411c4f8c072190ea521254a1a53764c61b30c87d2c8c11a6914e5c0b41ae3bd980426d7971a6918e1215c202221a55f5068a84a919101c038a23979280d339a20c1450f9080381a52034a9e191201c144fe9e63d6c46b85268d6a9a0788d08630541a011199107caa0a8aa05682b42b8698568a321a1021855045be604dd2c18f5012183f0308824f52108418c0109eb4981cb1321c4ae3072220903a0ed4564ece6896d11d32b02c19121921450b234600c508275e51ac29432223909899c2d60c898c18228527b6942191113e438a48aa7d038980e0402bc321352c906986444c9068b083ec8b21542a08c328096900d10408d90b8260d37082524a29f5a10645449c0f42d0807641240411911055e45586444240c9c0061be76bd958637422e67863582d43a21f1f3c614b39466984221aa29f2d887e84b2cd90e82708099d26c020065460618231b6b002762101318020c6154a88220650aae813642ea0598d28d410418449b135c321353a60a5e529cc73d639e9a42d3bc3f0cacf4b7b764398bb7be291a452ca86f204310a6a6db568b4c9df12aa840f980fa9048da22961e3db4a53ebc369b610c6186b8510c28cd65a82b07ea74bf7eb2157ac69a734f6a8a7771a654a9f4d082b841aaeb7f488187494db89510c3a3a12231e5589c10e9c32d4ca964a14231e9dec91ccc596b5167f47e8e930ebd262eded6157e4845b495aadc3c0e9dd5bdd3bddfe74b256d5a24552743b9db6abeec7ad4edf4eaadbedf6ba52e75028570a0f3992ed37fc1dc991db56aa956d657bc2495a79d5b276b3276b397bb2f69e77ef301175d90531ad5e254e8bea36a53aac3dfad445fd645d4e27a96ab5be242d7b249fbe42a14ef4747a94cac4fae9aeceba4356ad2399a6ae32e1242d4a8f504a69abd59242c3913c7f4f4669e960043a20410ebe324116ade4562283f84bc2e5c943f6194f5e6997b48361e2af475e6d6e938bf2ae3e6f5744c5624d6b97b4ecbcfac7d2e4ed3798b5c7169c211e8b1aebdca7655d6a3bcad5e567afaaf638777ade263a224a86441e18ca5ff421f2405046d939ef1019a1c6d98b8a1135c48b11e3af872c53af29db4b7872fd112526539b5a08cc8d75e0c94b622e9d967209efe4d4c07ef028d325ddf23e7d9276a1e5f44794f0b0b9b0d8b05fcd137a347449cb9123fb459fe8d2e28297b476a54a9c167c8408fb4558e4431bdb108158ad830748d954aaa1d6fa392b2cbd5edbd0b0255c85fd603089e3daaee5489caae10a68e7b473d8b51d265fa68a2319b0c6749369337da7ab15ebe1b767fae5c242261cd668d8e9d4116ce9dbe72b761160bedeb56123f334ccbb4c97788a02c0189379790ee7c897e93058637a16b604435ac24876d305c2f4cd74984dcf3293e9f14a1384d2643242c34ddba0098394601f83ba54a511cf8305b5621739d6b05f0705b9b8b05f0cb22252d12e98b029c3a69214b2aec0d22089bf28f412d4d2500029cd32186986a70eb209547b2624871cd8c6a15a39270b8311c2881f10a3917cc9d2e3c53da55f42edc94fb902cba47fe44b66b87ddab30200f892bf425a6e47ca1848338c0e2437f87a81a82fc5580f733d84b53edeac529afd19968f6cd8cf47218993235ff252ca8db2b0618d5a48ee0c657767a8a83d9823cb1af68b463627e7cb89460be897bcec97b4f25808b6d7b0972b38326219adc07eb625676715daa8264cc861613f2e77e9f51c9c0a308a9beab36f56577d536587dc94df917d6b3abdda7b755557a6306c0f6733645f222f12ed11ef40b3499b37562b1c93a53a0baa57f2f3f26ed9252b6a3ad4bcc34b86404fd62e85c0ace1782a6fbab2934175d3a5c49bfdbc29752d85e54d513b2755df698be52546a2ba09236149bc446615ebf5dd11c95818ce4b16d4ea73b58a744523356997a7ab29f134e16fd219e349c618a3f693fcbc277b59f1d7d3b7f6a68baacd5a5d1586556ada94f3b0a39485e55feaf5a6b7ee57b36bda670c167f3d64fb1bf47e4a3255f19055acc3c669b1f0973afdeaadab24abf08704667b61961d0c31b3e01d2646328964d7aeb14e57afa7f67e3c6493bce9daab6eaa3e753b6b37c99bba260cafd99fbe25d2528c7a4569d9e3915ccfdd8f875c67d681874c7db2e9d9e9ac37ddd2dd81568c645ec21bbd7a02deb8c2de6897da391b141081c01ca3ea281c2916d1135572e9b36bd7ab7a765195e5d46ae138b1a42a4b6618c95ccd194a574d24594eaedf2267fa2667e3c0588643eb829c2e0fbb19703cdedc48bd85e5b55e53ffc63c0ed527fe9278a8cf241eea15856754c9d093f56c62d7eaf328d5b3ba425d7595eaa2eab74e6567611b346c868ba48ec2486ebc9378291c6f1029ddc02d38585866df49eb1b3559e6e3a90b72fa9ca8393f3360513f1d09d667f774d6955d90d33728a5f4b2d56a7559575d5befa26ae16869c1d1ab54b7565917ee7476d865a5a350cf6cc8cdc27acbadc471b93cb1d81676d9e17ea96f6f8c2423523a0a6543669d85bf245e5f55cd70afaeaa73bd5f0a73a89f90d4a3bad6faac7ad945827ae7c6daed4e579851f7f452a705d990b598a9e6d26737a41a3520a7744bae971cf339ee4b75f984e4093d221460828a10a0e4d96f400e8e6ef96122216501e3d1e4c05e2cab8f40caf4ce6d6b1df6e7e4e453a491461a69a43021763ba158261c2d2d2d1c374c2cac154a754ae570ddd01423aba5595690f59de6b8b3dc387545b673f61c8d34d24823a5f6f4598e7e3b6d1cc77d5ea69c7d8a3e753f2179bbbd9f907cb2dc763f7a14b641c352ccb19c4b92f3519c2427af72b8961ba7e75a386e64f6593764ce701a2267e04ef614638ca79310976ef58d863de72454876c9556d1234eddbea45870b4b80ea5cb057fb505e3b8815930cbf330ea2f3939a7d3e92424c7c60606a3a1f13c1898974c5329fcb5562f2f17b645a55eae4afd2585ba769b3a9d8464d555f84b92934f9fa7f77e51084d5d6b734e54488ea739a79c534ea6393d14010911410e0c511221c892e505dd7769d71064e8eeb6e96e9a39a5940d9bedcdf92d838778d2b477f9c93cbbbba59415ce43082184b0b1b0f15edf05c3cc9d638edddd52ca150864a073ce49e3e1acad496e42fc13b249a79c3383c910692279341952da40e69473ce09e19c734ee9cd39672c452a71b43e73ce6932ad86a8539bb46693d60c0b4d8cacd6ac0d3a6bd6c69c342b514a33adce4cab6d64339b5ae50e4b39d59229a514cf9969b50d9ad579941dd92c7bbc966571ceda4696c11e95873933b9711c47b336b6d66446a306bd5a67d775259ab55192198d1995117758946a7d9c8f5aa4996cc3e462b29964367358b0df4c6c3dda68464a6fd9c41efdee121482d58ce4c4d2cc5a3768d846ce49b312a534d36a96d1c09bec309842f7ade3b49c1cac65da2cc5eea62cd8a314a7a6695d106d562a618fd852cbb21964ce88c879ad0b5232c98de3b8ada78cad96a6698f734ec945d3a4997c74c969c51efdd3a90b92fd3425ee6460e3b78823ac291d962e21ac29cd5caa9ac45940df007bf47510d0b2a1c8b4997c5c6c6cd94b86bff0a646afff132b371b6736246a398116db0c7e3a289c0c32ece0940c5b9e6d6db0f863b9521619ce3bb3ec5ad66d935ca9656545412c323c4b140875e0155d90599a32058532540520c3774d562e4c6929b2df64e9b490210bbc01c4494b0cfb554d27c7aaed08800c9fc30cfbd5b354605d707060c07593e1cb0a554c3fc86153e558c0bef999f4c7cca6f853653287f98e0bbb212fece1af872cf3ff5b22730a7fcc85d94b017f3d5906c73ce6dec3dc2f49fe51b81f0ff99f401267c624fe4e6f18dfcb7b7859f2c539173604fb4da01374c49e03c809bdaec7ae4b629a14a357fad52f2161a7933b86cdfe4da01a76dec265574300ee32e2c2f333e6891828238a50cc85f7c476e4cb85b9850b63aedb933f28d4ba9f975db838e251cb40c3e2a359dd8fa5fab4271348ca513cfab8fcc5a389c50368fe68527f60ca03a894dffa7ad2480b6d5c402816007c172e8cb57061acb5b0df4b3e19a2d003d703a45f58e2b90f757ae4fcfd55582925cc95dc3832347d03899c90c102bcf92a111368e43e0b5e041998729321511257f2869af09008102726c199675c02c4c185fd9a8ceda6331d8d3c3d2aed75dffee263589c21911256e4cdf428c4952ec5e50a4bcf4deed18af6e6e9277b6dd0b0d9b9974ea58e08fd40760de17014eac9aaabcd60061f108aad2e8cd13c69c8d917d608eaf4c82854de2e045ff35ba954aa37a7944da1de57ec65b5e74a61183aa7acf4913f4aacf0a489932c63f3a97b031068dc1b7ca4dc1b7cac189aae2954faa6bbe89b2c0bdbbdd59948891f64d8d1c0e43a3460fbaa734176dee83edf4e248eca9a7092770343c982f1178b2e5ff47da13cb5d0679b08590e91e74e9f2ebbec27eec6a1f66646e9bbcacc0a2091124ff2cc3f4646454748502091123e793e5e699c199b2c325857a816167633c8dc425c5724fa904df1ca7663924b8cafbf7081f5fa2f096c521c457fd13730cf2efa665af1a34a1256a41c8a55da9b309b88058c859cf626dea13312fbeef371a86fece72395be41f53773f7ee1bdc9a333d93c25dee54a8bd69cf5dfb93b53826a16ebcd2836c833a3023319dfbec21cfdce1ac339dbe9ba1c3a58b8496cec52f2ea1444edd3324f45c9472b3675be4b8c89db647a510d93e01a3bc3d0bb97604b0c66422c385c0a13cdfa44a864419a0424786444d8272ed23230b54f90132f1404a224a1bcdd9423e453f5434d013560bf58d8b0623edcd33c9f3f0eb22f2bc227f2ff98b4938cc17cd204b398b57fac5a47f7a3b71d95dd4549a79bead50c9f33d7718f9f8f8f8008990b022e94a9e9ffcc9f3891a59e44f2a416f2a6531a96fbe5894e75d70664279beae31b90d76a54b848abec97a32ddaced8264575dd9d1771d91e893296e9f7825265161a54fdf449f3c332b4d46dfc8f94eea9b2c0679beaf40ae0b925123f8ea8250a23272868d1660cac1a8e298c48124141fa9c2da2e86ce3ac4256425b0665e754b5ff0f0d0de844935f47970a804c10ba1580f2a2d84388a4d91447b16a970451f1f2aa21441e30fa7ba5b1a484231d8d1eff4eac258a4a26f287629311b294f3aa393f6e6a3933cfb531e8711c2f089b5d1eb0914d4c9269d51e66b03e3d1c06ce8945067c6676159edc5576d6641676c1b9d53ceee081f4307598cd0dded75c37477b794db0fdb766d64f2e7f23e578d5b6c9b9492b694b3bb2184d0e64e09d31ebc9452ce9b29e74d7777378b1933c6d8ddd9c60454d671db35a5a8a9b4954cdbc695b614544d2ab1a026163060177a3108c8b22cbb1a8dc0d4b030418ffef480d2cd4c3b64f938e98dd09b593725b69c34d36ac984ca3a6ecbc1d40d39caa6a8a9b4954cdbc699784add90996ab5d412947153c1958eb449b5504a0f4367162fa66cd8700ef98a93cd9291c5524bd544e965e9565abb212518fb5431a52c5a76ba32bdeede012b7f704a6b0651b4a1812a489841132bb17eeddb1f7253a2223090e5a7a4d99338ad28899092270df294b80cfbb5e2df3712a7c2e25b0bdb928d484404144ae1b4b48b4c7f8fa8064e64d99c19064174812c88886022cf4b0ba02053fa6eb528a5525079decce844885ad9204c865289f8eef21b0a36b0dde3eb86c21636c3b300e35ea49cf234f9949d7e3a9d8ef4cd119a4ef58f85b3faaabbb0bdee50da0c7f47724881adffea4dff2250ed2b9111488c3f59266529e31131b4296fb0a87d72761c72b0a1872f720f4639fb7a28ca59b7d3ed451fedddd50195d39d7d3be12fbba6e57acd27d767328ad4eb5d40e3a4b425fd2acd9c83c499b1aaa484848d4eee18361e0730723f8d1f2107e1d45bd256354dabb5d67af85a6bad75d62adf46d0d7d80a81e54037c9357badf3d5f45a7acd6a56b39a55ad6ab5e5663a91984b47b0116eb29eca6aba34d55a6bbdec82546bbaa9be845bedd563262c4ccdc0d0b22c05b046fb27a59c00f6d00e1b6a34b0466b6523ed69dfe917d92f067511500766ed3d05d499d71ead0415c52fa25133c9da95aca19135326ab536d33ad6ab430c30974e24e61aa98841b046bbe90856e62f0611a9efbeae7e4fee21f55ddf93af4bf3b2a6bd6a1046c3483a886eb141984f46d3112c15ed49813a11eab4f27c4ba9711e28fe54b15f0775901179be89140ee4393b0479ce22604d0e1bd8f8af6310ac99e768e267add606750e1227fecc39e747137fe6eb5733fc593a23eea22b869d8f41918ac681735a213527991af66bb5e47560fb72f6105bced6b8cb69ca696fe65285cdcc46515f7e1ac9043ca49f33c2181ff19c734a29613361d30eafd596f059649b854b1a47083d7d292332893fdae96dc0a16ff2b6c939bb66edb65cd23b3932c86e4913994c91357cdf896ac27e1d254e429327a641c80de050922349bcf6280d0f4f90c6dfe4c951f69671a5ef745f54910cc7d64aaf9f37498b7cf759fa2cdadd8dbf1b3fd21569ccca6296eab3342e229f1599d73eb34f9361f5794de2c8c5db1fcf0ca8f75177a1f010ab952c863cb95fe5b56f99bc0adba061255ed2a60c23493deb159e384bb57cd62d9bd5b1e3e4ba23ab2fb9ee2c4efcc943daada4edbb7fa4af927e92f6e83b3db26b181b84b19fcc9f39334a5bbe4f46c8cb1b833cfdb431c3fe30899bd5b2b5c4818e4a803929aab0cedbb9ca93ce3927b637d0c70b0ff207f3923f1a14963841a66f7d8c4c899cb8608923583c60bf7a030d00654a89342094e9bb05b1408a52831f2b404145d91414f06056cbe5d01c019b1865589eb9c670c6457c10d30ea14f64d84e296c1499cfcf1623955fcd0da5644d395bc258fb2666b03dd93489ad5619bbb9da77e609a314aadf44ba34e37433510961686c5e28945f6cf4924a29a59cb2b1946163d19523c8404198ad8b36f1944a7db04e75ab92f1b46948d8fa79170cac2aa652e7696197a7700bf3a45218d2ae95da5c6e4fac757b622e41628ed7aab575f26a0efc822d8cb52e8c9d7e52dd0f16a9345cbd7e49a011068a98f205ebdc65bdf6cde95bbc2c1dfe7aa06caad4bd9cfa25cedf72ed0ac75d375c5c386e6017015a7f790d2ecf812bd07297bfe00a4c61a4e52eaf80ebade85dbe4e77b956be4e6fb956be526fddd6679363927853a943a39cc22cf5f67eb08b7c8268a4bed35beaaa3ebb20aa14fe6656d9afaeebf4d5a395eb3adde52f6f5dd7e9ade7b8ebba4e775dc75baeeb8461e051866df9098f462f9f393e1fab481c1d9fad4f97d5a7eab3e5fafc093a72bcdc54aae59eee725bf7e3c9dde95d27bb225a0ad7f6ba4fd995ce42dde20f1a65fb6d83028bf2e9f5d6bbbc27d6faea56e2b854980626aeb7bc75971b69a9cee3c2aeee3d312117ccd3825ddd7c4f2c5691afd9c29607106c8ebffc84f3205ff3e799c288cb5d7739cf144674bc75285f2d98670a232d3f01f3b4dc8579a630e27a0be639825d304f118f10f99ad7818f84fec12328a70bb6f2650f632d2acde578e9c9b09c041659d4d5eae95b6cb53cde8a0c893cf0247f3143220f00e59e58cbbcebb6bcf59e584fcce5f6c4b6e65cb727d6727b622e37c65a2db885e3c9f4ee96be23bfea1a1291588dc3044c78518426a18c13e209e50d7cae0fd7cac9adcbe43241800f251f175a38fc76f9eac462219cbc850b633344171197eb30bb9eb9767cde35249b3962279c4a29a594524a4c23941c3972e4b8cc711d394eaf0e281ddf6989c216f69b4a344eec32c05c73d8ed38cd611784c7bb570c8cca9c1e7917c9eb3043188cb91f4da6df646ee797fb45a21f2b59c7656afa08befab5f6511fa150a878b4d91c7641fe83dbd1d65a9965be513222520c71f3ae87e311ac690e8af63428da13584393b2271914f40ad499aad3a45bbb6dcf41c57eda2aa35264bd7bf8f3be09e4e32426665d0c32cb7ca35b0e1bd8d3e351f7f2ed41b01f4d0282afbecd5b2d2929a4d0accbdc06aa3505e1514ac66ea35c03f50d8c3906b79356a2bd0934a5f44d6645df08411deffd7905d489691c9f4050a7f51f38fe1d078e7f15c7eb61c4a142f2d527cfe5e3f92ddc85ebf2811f50c3ce33761969c1c7835c88cb078e22860be02f3cbf2796b1eb0139a74236f807feeab1900bc3bdab09c19a7eccd5ae006279e1c2f018ee0b177235ef76197605e8580c587bf2c2d5a0c070352903fbd52a4faa6d5581817d92dbc763de9f494420548dd803ea7c22017500a09d51b54308849e71d8d5b07397911682e0d9c27b62d06524ff85bf8079048067c62ecf054304c0231b30108a452658098af5c4a6d88f266dde8579fb71e58f1f3e6e43711bca1be7eb5a46284ffda4f336b95f16eee30279ccd5b97763a645126702c9d71911084da26a4420da13ed45b4e88cdcdf00c0c2ed27b0a60fe43614edf575f2044aea6b4f2290ee40ecd11a4d6a0ec09a06c085f9476fa081daeb9e026b1abbbce7bb30f3a556f40afd88a9942dec179de0098499b03782e0a4f0afa270085bf986cbbf13f28df714a813f3be975957e15f0bb30efb887cf559ef22fac6c7bdb7cdfb50e7c76ffed9dc7d857f35775d8f7f9d4f873918763504e02e1862f69ecfb34d198a65ecc289793e0f2c0c1c14c5f25d784fcce64ed81eec5bbe3cf18735520014eba19e119be2df7e7d7c8b3f5a602294f3a54b10e113f37161daa38771fda211c80d5e017f35f7c03117079c041c913834fda277a187c1f4f42908d15f8c8f54c05fabf56da3dc0b7f31bfa4e7c93cc7635744c765300c33af8bc47bcc3bb286e63cbcdb93775c9867ee47e3c275d510801674f02314e371e13db06640149b42e29c980b329f919efcc743963bbc1999dfefb4f43c997fe6c2bce3fe97b95f4fbebfdf2287a5bc0f791e314efa464a1e972a7c02f9b8845d7eda5ce2efc72790c4d389777aefe27bcf3b4cde07cde58ecbd3ae08bd5764e63318c21a19f997779a5f7632d47ce6927aafe3d79534a7f7bcd72576edb8bccce975edf8cce90e3c44e6339f91c1de77a4773f99a3e0d57ca729cdf13d8ca4e6331809ecde775ae62e91d9bbbc5f0d7ec1fe7747e4de7bec86c03054012f91d9c7e93dfcd97c3ff01299799cfae0c1437a7f7d7b5def255f3352e6de5f3ce469cca5f45e9799c11f95afe9c48977893f27f2530999c71c097aa737862686493e8f6fb18361067f3d7966077ee11d352c9acfdc14bcef348ffbd5fc7afdf5172eec155ecf778a9ac3ae480d7efd15f37b1849cc656264be2369ee4e7ba7a7f9eb13eaecf8ebf599d35cd8deccebf51e3dfef1f83ff31d77c29a99d7ef7d7b5d24b07b19995318fe7ac8b0abf099fbd93c739afb29c934df71d83731f7b1037f4bf28ebf5e7321ac79e18f27bf7ce04f490c0ff975d8373f6e73087562eec3067f3ce41daff98f0bdbabc19f92fcf2813f9ebc037f3c4ef39ac75c086b6af0b724bff0c7e333df9134f757a1e630c37ae01d62e621e36124f432f732f432ff8efbc55c739afbf19067bccf5c9ad7dc1d34f7df71fb93b907bb22afcfdcbb1f0fd9fbeb4258e37de6e55d99ef38cc01a13ba8846d979435eb149140000000000315000020100a064462a140249808bbae7614000e7a9c466a509c0bc44112c328ca20640c308410020800c6001821a21901b02068fa44c7b603af965f4e0776b3e92439e6ee0df3f9043d0ba2916888a315e6157695466e2f4a16c7177c6a1cc7c508d3950d20e02481be892c2660f0d4ef419fdcc044cbfececdc2511a38f95a2efe2825a2e2ed5e42266650b9a123184c883a5985dc84eabce2305f065d9498a27bbbecd7322f50b349a2c92f2e591998dae67ebbb9fb5a98498346369818f17daa06af4ea3b9e2e3ee3d1b2f9240adec3664146f8bd6d5695ba63485d14ca530f552cb4c6fd15505d5be01c3bc03cfcb9d94e9788e729dc460dc8fa174560f28a237f4f44b96f716055e376589a1544f00059fc8abca1c349aba8ee5ec02610197c6f217aa1735a350b00aaec080e719a366ddabdaa7ae547d03a1419b5dbbe2c0c01dbe09070e1549ecf5f3cb5f819cfee76ae6d199e2757e38286671c5e0f6022810b3f32a86e6c3fc6a4e144ec95162ec4bb6bf2f85ef10518b454c17488d565d4221ff5f65c52cacfc016970e7b3140ee3e25f4865c7613e5397cdeb5c4db0ada37f9bc309934cb518f52ed3ff0146e557ae35776bd7e3deb7018a63c34eb7b4c1ac7d263d249e85fd60c762948d33bbcb8ce8946607312a51685b29f83b344c73b300da18ef91478956b4fd6377205d8c0a72dfca52cdc7fe47a5e80415542a9c802c4f94d679a9716dc78ae3f102c1653b2adea0e183061f3752ed685a1d88e2bc25dcdd565f0f2a1b81964c5adaeb4266dbe492c2269614ed8c80b0fae7642654bd006fefae302f749c2c96a2d873b9cc1786fc2e482c6326fd0c2e36e18618dda6b4aca0597a408a3f78815d2e9a00590a481de70484cb6f8d6ba4d0023d6b0c22a14d5876ee92f73c7b703c28d6ba62c4a9beeee1ec4a3e06d529de1c31e19c342dd879ccda2ff965a389b5c5ca79d834cb5fff56df25967095f1ff54a70d53b8983f5dd55de7cadaa146e8916d286eb4833f1d1a123bf24e39e5db4936262573fc28fad5369a46bc26dec02a0621ee02b1e13f7fa5896ecf3609c4c8ca5fa93695324f7e2d138916cf3f7d57d070ff0a99d71ada9e80ac8b9cb366cc399dbf0b8ceab1f55c7befb385a686eec46363e992967f1ea8416963410bf4f09ca5601112f1a0fa208e779d3f869a4493b048be70835bd1f6d6480cdbf0f75a27dfd58dc3f32ada23a9bd1c5b1ef15fa442cf400bedf203dd468bcb41c911a33837d941f71a418a2a96d3daa7e235fd29e71ed169f77381e86b1b2a5cd05fdc0896966360e1c621ea85e291ed2810410e98916b25f054327e2d7a5ed50d5fe8f5f3b5a93e52d6a6ae004b79c272918756ecef181daeb60355d748f975a7bad227bcb252f700e5cfaf9ecdb6d44b17144c155e2ef25f6eefd6fa166ab5fbec9900b17b4a9ac4313f0ef70c1dbe26a7469db161806c76f41e4f67550a101151da22ceac33fdfacc80fa9db3da808ad6479a05af102851e1e1b840c572ebee8f06eae4a6fc0eb4ac65f7c93144d98fec669b216d1b140b1f974ab36eac82fd0e1247b03bf2492b7237e6b7412b64f566d79c3ea4ddcd0e41013ee3a51d10af92f9a2771245d1d39a4c4a1b8858dbd38402f77427f1fdaeec5575d6dd6c5fca8f9a092f760863dd6e2b4af47e5f8e6050396de8972cd01d24d2bf9aaf82f4b1f9b9df5f217a21f4a22244b7f4f0745a3d5250e36ba70c5a592832e39960c15793debebce9dbd577826d60755aad603239865e8e4cf58851cc09ba5c8e6a2581ae77dfc27739f94d0cefd8e5c96bc4e10c3b253c4881138c0f4baf9f441e5c16a46130a90125618ecbb923494a6c27ad25e0d7c683706c3b9fb186370fb4c813e580ab3da85243d3b67d57b34da8f1b473b214806209dd225ecb78840b1c15cc7bffc78cdaaa108af8ed90e48e9fd1c7e6184bd1d328bc8153ca03bdbf3c2de2c50b60b5d06ec36080295bdf9c1c01fba71ffc84c06f67102f109780e0aa37f88b7c4e105db150b328c4fb0daaad6fad8368cc0b38a96dec46ec059bafcf0c56faf5d683a41226754a5ea094c6e05dd889b59bbd0a39aa8f870af1af6c19575a83f98d013097e00f1dd8c1745a6588e4b5c8fe8cda2b5d1e092a7923c62308bb7b14e8c8de31908216d89caf7a5524a030100143944549212aef0b9a0dfbbd7503f78003bde88f82d2ab8b55c555989d7efbf6b3ffbeeb98e8cb23644c0b5b9bcd2baddf06f1798d07b484cc6a6ea7f38099f162393b6867c91dc844cf7ab68e200dda96fa22b835aee20a135a349fc91522e4939b0a2248fff9b982f7720d0c4a1ba5a004eafa3c4f48776cb6027ad64715d879259c02660d2cc768cc4157d78e33a7c460b270cc8e5f372459b094dd6f9e36dd99101d1a3ad0370806813ea517d860dbd89995a2ef3aabafcaebcb0b56e293ced9d4aeddeec9d84856c52779acc58e39ee0d223debf7141e440ea059713e20bccb8e292bc0f0b51252ec61ca8663581f1280f81c245ec1cc7977418b4216fc57e90596fd21f8ea9c76d72921bf110a570a7d5aeeca8678de1425c72a6fefc3c7d526a557aec32801de6effab5d326c49950e16a56915182b2bb77ae37a2995ba27d7a5e7dc4cebf07804ca590e512e6f0497cbc8bddf992f8351c5013befde93cf3ce1ec75530b77946a453ba6882e26f13fd280c6d2c2a9b941e8ece17a4150f12d0a7861796e4461283eb77ceccfff0c3e4119dedc9785e19bb5b232c3f750967d825c20509f3090bd2b8d5592d298de1bcaba35a86998f366f484e85c9f790aa64e1161b65e314c551255ee1cc975f91cce014173bf4f6393e67b681cfee8571c3c82fbe7287665489203ede7879c856ac0ff738e169c68c47ae597811fc1a97fdc31c8ecbe470604d8c944003875809ad1f07001d117d4bf41857a92e9257b229b5f0e3318f1ec45b2ac903f3a4572d2136d37d2e0ba93bed7949f719b95d5fc55e45163092bd1fb729e78a9157299862fccb460d12b24c9edd78512a725aaafaeac63dec0cb282bd0e7fac500d7a9d9357058482800c6f5de20d0034bcb860b7e178165ecd39d90e1765bb39e3f82694a29ea30589469ee19a8a3af6d06a1edcdb574b8238b7d1b60a1ee3b0b02a37db4bd5f068d36cb2bc070cba265c377010af6c8669addee3d1d16a836e666a2a1e439307d036be7ed505033db9dbb60918a99360b296529bf9fff472ff87dd20283145cb3452e47d540833cb244291429029c3e71855ee3cbce409e16553e1baed26a875957b7270910a90ec1e021015e6b8836af1e01bcf6db986d23800d2c0b5edd2f9467b2e5fee8fbfc4393f15b763e8d2d9b0d1c5d9d9223cbdf06ca6dfaba08dfae1b9bda5d35eef451dd920383a6190570c17d03d64a1362ade067b8e975165d3825983264cca8a17eaba7dddc8a3b0b63bf1cd0cfd4e28f2b275a0ca6650d1f999e4bd822715c4148cbec4da862377a0679ecc77bb38b5ca3082c4446d5af019ad54a74526c3de0b0d1d637f3ea900bd0f1e776e66b57f97a80a3eff39d57c45393bd6a2ced250544e518cf086299b6b5f296d4130c9d9e80b9ec55a27cbc8680cf4eb0b55512489908ad637368b41bcf4ca700ee22c84696a5b73ab419913e9b3b64d6ec5603fa793f7fb4d24cbc5ada6f707b029f8e87f8f574cd1590b0880296d27446cbd45a38f532e4abb51621b40aefe864adc4ca0be1ec84581f2b0aaaa036e86ca1876bba5a30556e50981cc483375721f0149ca674291607e98ef668094e200ac068fa3bad6e6d046d1ea357ff37f743fbd16408c3e68d238162ad19d0b4273742a2c842520815cc3954bb9b2e0eee5ec8ff8a2eb86463dff758d25182754e764cbac00124b950667135b4e9a5f1b66eccf693dc8e3cc8ba6709a8ff8c5668af6bd15ad455dfb8b1cdcd295c4ca9937db9b1215cc07faf0660a4d0e9ab56fc481a6482e17492508167ca0041b812cd62b4eb015061120f2f775a1fca969af74d37da81a5bae7b8a318a6260329924495bc617cab2942392823ef4bfecb5de493a6162049225133400d3c10c815a0824a8b937de7fe7e836878d9a13bc5cce7a15dd2228e04148aae1b38382cfd7fe21a922fbf24e79515d01fedc6d677c81caf82c76976e8a55cdc40054dec6a240019cb5180393b207e357076f05cde25057d3fffb7181a273dc280cbc4260b7cc1356b76e249b759197ef93f1e3638f7488af8b46adf11bcc19887e8fddf322673de1c7bec2eedf12f31b9ad0a3003836452c572b3202562c8e82cde5071ce422396c10ebb4a6168742ac850a430f8affab0182c4130484d95e7d199a629c8c8cd73062c2661c4d143bd218c32e2cfe99f07923d6adced813c0afb41d836ef6d6e6acc09d375a63a1607f0340feaee97def24ed69acacfecde6dedae6eaed93b15677143ae87da89da0792582d9437a7c23be25ffdcaab5985ae65e26fdc262683c3c0fb892519ac27549a32d5271919e4676313224ac2755b6132e280956ccf6c6d6a6ebf2072cde802a3b5b0008372c4b6edd349408e74106f5b222d6136f5d6add4cab9350698107c1e026f8ffba6c4e75f070fa84cdc2ddb1bfcefe156932bddcda48abb79370f3b92079d35c9c4fa50d24a344705b227ff5a50d2e83c26088526e5f36745e30d1200a407a0147b889d7f05cf5825fcfb53c4c60e3388327a471fe42f91dc4441349dbe205e76e9c993feffc43864c591212b019558eac49692fb46949e6242d63bc8cd57b5e14d0170c27c569abd1cf025bf65a62b86f5a6340b4f03e265fe14ea937e51715f4314ab830239220c504c15615a643da015781eee3cea4a943c7f57b05a409245b93a1985ba856c0b50ec4779fb3e55425d4fa3defd0c5bddac73977a50543c5913b672ee039fc54e3dea3524caf3b7373dd9a4aabb657a603293b800b6e87d7b38dfabb00eeff5f6b28af5907621c89e5d82b6401403aef75a7de21a7538cd39dbb3c69b81cd452e8bb1e510025d04e7358296edad4e258137a2146c36a58731a9a9bfffaa915b4cf3cd06329012428317524330812978d47acfdc3359eb2400a5898668ce2807413fc3ee2570359c260d4c487debdd38bf9f07174f7206f49e23dbf6fd5a8490f8bb90ebb97af23ba7373ca85e8fe1ef1c3ea5b5df1b44952b850b67d9f68b83fbfc760b40357cd3eec28f634b25ab5c358176170cbb1c00bf74d4bd3f7f3e1ddee2417c77bcb0267d55db500e398c3cf6a05407ef0d03c9b04243cae235c4d319a76cb26e007aa40bf2122abe7e70c1a1d3c308a2c523a7fb4d1a351664e9106cc2674255f7df56e8256ce2dfb03e8079dd127b5c9c36502a9562f163dc76840d594785978433128b9b3eb835c2992650d156763670139fcc2768e9c2cc7056c7cdc09d8928f7b26ce7904024cd3a34c558df59368c563f7c917235182931c448d523f278dda44f0a3712a8a5ddb87809d2d72478bf5d1b466ae39f83c648959e191173d04e6f42705d6a281a6bfaba156598f58034359d6746261e1439e3865130eb07452cf218b39cc5334857ceb5bbd33c2e35e7090149de3bfa9c5340b9b646e817ed0c5bcd0f36a3cf1650b2490ffe9ac2ff05cacd54208e80ad08e9dec17358093dc7eed1192173e62b593286525b865a646b09266633336c06bcc7ca48504094d935cbb6290e1436ef075fa26db2902265f3d46b92937d2c7e1474cc8a4b5771279cc7a595153baf967ea9a8b50c84b2eb41e30e1dc1d4d99da4a5a8ad4c1caaebcd144ccb6b3846a04079b56e73e02e8b15d7d334d8f40a4aceade42e3333d32de4a2310b14f1a3b91cc6007b42f46b25a11f4839db46db88075cf5c01dae1af370580c601577ba06bdca77e43b2059a15269ab2c48f70d7d137361cdfaa5fa53c8e6292006722b63822fa0ca3b6be7dadf4b1d3600c70a77fbd24867202940b735c04813dbee21bb1b94d696eff9d7b9bf0168938580eabd7b2ad8911de8949511bd92071db1d0dd4c80f95b09e78f637f06d112a11ec9fae82a42150d667b55a4c03d8d61cca31ec1899993ae5a66bde19ed685e210fbdadfabde97ff5e01991a81661a227ba94641bf9da21095867aa1579a468f3fc187dc2c7023a7074548ac090f68cd1926d27aaad2ba709d2ecaf13d015787526ca3e474016e9aae3c5950c2d581805a1202cf5ff54e16a601d422065c4baba8ded193d825f3e9ed84230d7643e5b94505a732336ca7756ad47549f7cd06185dbf17312c0a285cc36d290c8e545dd9f63d9a7ee87b7f3d761b781cdb58abae61ddc99c5202d804353ba22c53cfb79066e2b4efa603fa5edce43bb5f4beafd3f0469f996ba161a78c893b2c28f5da804f84c0fd615941028714f3133c6692220fef1436ce0fce5d98a6aa38c16cc18a850f2680326aee68ba3f8d9d53b6cbd69167b98b7bd35e992d88e27813980f32218a3a66a0ecbcbc959db9661bb004c98596bfb91a61358d87a099b3aed0c4551a5cb42041149f101aa2e471818f793feef44f1174d7555b69179b7571af375ab28ac8f8f1a33e31c41335a8a18d8cfee8373c7845d5cdd3975e7350c6224ccebd87c3e70a81ddcc184c8ad6114159be29ce518285bdeb5808fde507751b31807335727d4fe4cd95cdfc384f6a4d002ec60278dd209405be92d4259a7e38229f3d50980c40e8e9141d44e2592c092d11d63f0360fc83232b6c074b7fafa265ea498d337ae6ff9349807e688668b5399d690292931c86fa51e33ca3202a9a77d68a9cb326945c967376a97c3d3938ddeb0952a492eb3b16652d2d473af01a4b0027858bcf837a424f989081634bbf7a11b2aac11f86eb03d31526ffac2b82dce9352e8b5ba1f26aa6d477b641a59ae62d7af011feb251191a627382a4c3e2ae2d8c05c1279439ec1793e4081db183ff46569500a9157f3970f642a37dc79bef4ad142533d43a0a24d75ebf7fca1d8ea65b1438dac006a74e6d7a8b238c64e000e846e63f7bd08eeb1f1d3e4ed812c710205c106fbf6a7e2d29d03ee7cbfbbbf11415fa5430fcddc99a95bb947153dfb373db0c0723c299d7cb3673fc7db6e4ce7a3d0076f7044b6c39667bf435dc5cc346d94bcbb05960045cb5ecd32d12a29dc4f984ab8c199ab97e51f77203b22bec7795071792321d3603af129574be29994e96186e7df2f5c57c9cf9d4cafa34e47054261e2bcc6069f094e5c1e1b1e2cde17e780ba90d113b305d8d9bb5913f7f3e489c0ba1d9868f3b816b835bf242ae9be4818099c2c8e6dc6b17e31235949ca12b9242b1a05323da125b2816710255280f0cfa6b768463bc4017b82305bb6815095324ccf5750c2d829552d0c38527c00874bbb6d6a6a4ddc8a65392d3bfb1eb6418be3c7ef0b464bb3d42bd982cefba7cbef003e4cb4c0e1ee01cdda7a0298854012a826b4c9b61cd1d4d0351a0415a8d810ac275c3e365563d8004ee64455b13e044e1c8951f8b3d8f37b0fd057da759ecfbac0a724e6abe63d01c662df91d42b8d1ca2bebc0b9b601fbc0194f49a7ad2fe5fe1a9136b0abc104bf2a2056b15ac89bfa2ad91e0ea53b116dadc4b4467d3b6bfbeca01e9172618f2654c615f4c61523f7e0a7ef9ac5b0430cec126d63c7af3ef0e0173d0c333437380175f68f096ede2f42b81672d3fe4156ee26a6c8dd4f241eae5b2f2a2f7cd8e544cde8813cf45fb96031970ce7632bd0820f2bc77deb00477a490eb47e2701d83456b2a08c4cf3158c455c8e217301ad11101fca9c80a1ae0da80ce68928b70d70a6caf878bdad5736d36a9793d0c8f605101aa4818caeb61806dc6ccae7bfef71affe90c02583e6873a1e1ea05319952a6561f8631750ba03c55f83698dce94ae5a8c7cadc299fac95d54e738e22b0e88ce40a330619c44a720c1ba2a844a07d6655dbe62e5f40fac450ec50d9f22404c3b624275373288065db41ee54921d27e4be57e1c0d8bb01471d7149a452a8d0d5a731ad11eaa1c37652203c88d2bb84f393f3f59898e48518f0ef98d9d6e260fcc29323efacd3cd5c17d137939c20b20040f1328dd98e33579f201d04339ff4017c95d243df3aef5e566f25224311cc6cb073d92f584e4ed94d0265b53a1e0208a6a4c996a3b8fea42134c42a6bbe74b4545c31142fc9ff13a08b0c0535486eb5928b4681b92482015c14ee9ff7d10791b55cb8725a024ae8c38d0f449205d38a198195d0fe63bd72f6f408b626126c93dc5353752e1a3c5c591e9efcd33efc937b4f128f48f9228457932695c3cd7f27004fab7508d0b2d3d539684e268f4f5906eb96337fb7aed9a89eb2c1537f7471053b9bc4a0bfcbe488d6f75fea79d30dd1793b00480d8e8c3da3e32acb1269a1c0f7930e89043dff22ce348f45a3d783b239c8e22967a544f998fc0b06275fdd92a0ea1a06e1f21bcdb68dd1f2f782f8db3df79af89214f2aaf20ac040f0f7cd3389357ed953df2767015479284956ff6900536feb77524a738ff418aea4c04cab2bd0d7ee14d356ebbc9ec07f2a7dd0a7e1ab7a65bc64d1bb2b0863835b08420669ea0407c0e3d37ce99d460e0030475e0ba4a470a07903d82981787ed991c565652e4c4ed6c156852f305a749e46c241e848fcde89608f68b823d08013dfb81342acf7ddba874dcc144c10d8257d24a3bcc8d2a936d7978bf89f6efc4db972e6321b9060a8a59c671348d3d9a2fb6b1a6a7da31c5a58bf38e01245e297108d0db23e060e19538eaeafdaaf8cee62f1acde682e041baad57d55b2f4f10773af3bc098c0772e45f4e15f8f4aa3a7714cc5c6b3ab22fb5bbaa1b16c11549421803cbd486009e5bc2734f3059c39479b6e7a9cee54d42fa56b67af70513dc55fd823c2b29111ac96247c4b531478a82d7102555114ad92185ac0b1cced4b084bcb20c5cb8f27bf85738d7d99ec2da8f5596cb5f5c5d250148adbc8634a17e68fef426b25f9797a85c2c6d9e175e96258af56656bff9e820110769060218a383f7f02a9cb56a5200b0b11893dac17a4d84dd2de42143ed0807201cc328d97c1645d4a0c6ea9ab7b8f7e9c09d3f13b00ea9c812a860af5fa1641b171e032aff3c8755b956a38a8f074a79a3d3571a1dcf10450f997c4c3a46c4485dfc52ab59b1216b5428e5322824b24012066cf2c857f044744156537ee79ed3fc9a2f94a8b18b1e160bab61e43df306368d30594f25867e4b220ea4640e11a64fad3fc3f94b537fd1dfc1ce268d1ebc5be5762a03de9a10058c137f913ace1121e1d11de1c1139693aff947e1fe9d734244b0459dfa2efc19e1fdae752d6c53c2fbb945cee06b882210c5db15c132d2f1f619bab4a734b56319aaaa1ff10bc0821d6634c969b0b29fa06432f2422d1dfd82edb74e482df624d0721a88b846d28d9296402eab19d0ad6f0a9ddedba7221dad00c84c33f1d16715f9842b007c8dd7231cf75310cabd2ce5d3dfda69daa7ffa79ca9f23c1a64eb1b66c070b6f1c7b9a909d4cb830c9582c6169dc100b188f1fbae69450c80a319533d4f2efa2e1803250bfbc6ffa61216af8dda157763ea727ef9b7a5173e8a884f39ed250ffb64153316130021725882b3752a37169df64b16c88ffa1b9cf1b784302eff90f006f02beb80e0bbd760fca8a2cd6a235d85d9dae54e384484f1220ae12851b8514e69d9e6bf1a475a8adca139b8fd7443aeec2dfab20ff7c1aee889e572817ded39fdc9229e66cddd4fa8cff1c7bdc5e58c43f37f9b6b7ccc79831451c53b3e7a17a810a42d1b8322da0bd8df1aa3e12ef8f305b1dbf8fc5a4c54c7b360b3de04785e97f1e9202b361949b3c8aefb3f1da0ed894a45e254bf20d0fe716ad321ef782fd02bdbebf3f25b27b1a66fcaae62683f6c8cb951222c03274dfa0736ed5a7e117b321e3fe16a034c40517aa4386d4e1898d8b725f298a99cc4eac79074bc99c1ec31a638c52eeb8ac6f48ccfb245831c612e81b733585c6c0cca2be6507d9f05e52e7087c64e004a065c845a7d724e786a5f7528abd56808b91b04f644d54aa09e1e5970ccbc44a36616af429b902b2c0e3e461a6cd492c69f0367446c9da40c3b09370b00f9c72048bae54d2b5300c5753c87389a2b65f81d636b5f9836751b7e34be400bc29df146bf35e8f78be6ef5219699d05886a315acd0c828cc63de998ca30c6fcdb285d05322c03e7d7f7a2a33ac2d7f53d2f063ab9a360511e721d47aec7e6ecd3ca3ffe28ed76bc7ddb89e0a64d3be9073b22654564acd9f9505e75c2728533a9671a127113cc9256b1557a26b7173d614d5144f6f66157bc2ec287672b10b1d3122f1f028a79bf6d4e74c7d426d2dca4e086de05401b0a9c8ad7f15202132b1761682ec6ab4a0264ad49e5c74146d40d4b92880173d9576243f578c641d63289eeeb22eb9e12eea32552d3ec026e0e7d89035155b8d5e47d7b607eb2fb2bfca7fea2c81ec52f1182cb1421d057a9079a420ea274a93c7b6fafdd1d7dcc886e4c8c3479515faf485a07082d5780992f524a3a674ff01523ac6010c453978eeb06417df9c72f486cfe88e826ff24ba2738c39d218b395ee884b772e14aef9bd615bee5cc1e9e8cfa7b4b627367733e755c44ed69e2321107fb97c68b39bbd40e54bced37b16655271c9a6d575e433156ab80f9e2be2d1d1f55ad959d87dd4bbb1c33140088f927382363dfa681710517d850a1171589da3b5df4b691404f733070420c7e9bce730cedbec68f032d352d868a815ed7ac43ee5b26e0189f62aa67989423d8c0bb8240398fef46469b9d016e3642f6a976ebacc63a2b6de541638d8ee5ee16777f78a7b62ceee5e71277752faf85a78c82f9b38a0274678964e9f056eb843e9bd5b06c50c8236c71f19ee0dccb07b2cd311affb8b83b2e4bd9a8ca6385a1494726986aaa51c2959e791f1720263a2e3e1fa9b26be238ebcd524fef1443a5874a3bf36369b7dca90f3969d70b869a6bd68374844880e5fb849704073d16c0877b35539f94e6cde74b351828d87eb4ad8dcda85cb84bdf3d8623fc6f8ec2a623c2df5025c666ef5c637f70b8ea471bad36d909d54676cfe99e56e500bd3c984463082ce1c58dc80aa7e577ec9ca3f9c73a0582f13ab5a86cef34fadd02fe0935667515a2a17bd6146f0fe878faf163c0172ff17f46eecc87192d23e961fb4b711da473a2166ffb21d49cb647a42bcb09d98cad42f628f4bddd12d09fc8731322b9f45c7700ca2897761e81f98d03823e4344bae104143574ca3ecef34f0d048f48ccf5889e0898df0527f9032b0a4d62c094f23fe38c78c9d0b9ff6a31c6a73cbb06f09e16d81b28e34703d869cd234532a4f90a91968560edf633de1ef7edfdc02157632debf0c71108713b30e143dac30d5ba72a55027b9721b7b04818d46dbacd8c6c9b2c53e3ab73f1fb2232118f5e5e35353bcf59647de5e41347aa9da68356a6df0ea20a50f236bbafc3eeb0421e2832e6de699a4287569517aab185b5dfa1502a5ddf6324e3428c90e97cc5c69f8ada10252c49671b277a116af7666f6c649570e6933f58211d8d7f50b91fbcdc36b0b84c89f42a7e47d68d612920c454053d4b48bea5f94481fe43476c61add25f8ea9ac634726360dba16e49f002fa64b70db2232dff0e020c940c441e659b9eaca5478fbe3345b2afc961b1418f01f84c61c24fff478abc556c8cf9182e7421ed7d5ba3e353770f60fe5d15c4839f671ed2c816194d64a588a24871a59e6a168a314b9d714db9310d6f99573a27c7a17be654ac317ecc9fd6ef11cf828a71c7b4e7f62d3398a759ea00f9dd82d94928da72cb5fab68da11c2d21e64d23f96d1834e0d0ce8f97aea3f24cd735903bbeae0cbc36d66e3ea96e7f028d066361c306aa914119015c316ab6617c0f932d881a518cc22c708cdb77157b96dea6e8935dd7243c271045fbee044ff88336d1059092067ea51342678ba9ad0c285de1165632fda90d50e1b7209c69d3c275404d3ba2177f6eb63e3fd5daa5fee0a7bc8ee9a1a54ba4d7eb2358a2048f8019c16bcd7578bbfa48488b59b8b87a188a0ced4358bcec8d86599d973899c02c7e16357dcee2d54f7aeeedef295685a3d2aa2bdd8dbb4eb3293755c3f02b6f76166dfa9d94157874a8c48243785c590303d3334a8841abb29f287841b2fa7cbc9ba280de3883246a91ddedd47c67b9d013424a055c0c24f28cfe6cdcaeccd56c5c744b812cc1ca50a6c27086ca610830def270da47468cbfb4c4d1f4260f208d36324787cdbf27a666009f760f4d36de1d9466dfec6052f80508e3fd17981a349b40e06ef05400250df235f6a9134a257937875bc11bd55f52dea1ccd927c51489ed4e8948ca5b86a8315e913a95b2492e725a029d69a13cb646b044006c93233672c9a586a803109b6d0d208cbf8def49d2897b03ed20428c4e2b803fa0cfa37d435d31aecb57737e76e4bb76679e4c7435d2302f77eac817650f735f069730d6cf2cc64c052ece401cd22eb4e24f2f122a6f0c16f56b95802d516a68a017cfe9d50d00fe396885d529006ccb32864d1a8b3041c149d3514a1800609f430caa7e3775e45f629b8a8b882a0a627b9a791ddd3376b499bc5edd20c2f73b3963876665434767afa375e1535699096bd9b63b31e43a846fccc5a99446c9259ae26cd2ab6d046f1b40f136ad4c9085c20323959c775c575ff12a1a7f3ea338f991e65822458955ac38f9bba68e34235e02db4c68dc73a70ccf4cff33636b02f34ac21025084bf42048332e1641a4c6b4b11caf4187808d510174c997261fdd06a5a8a0443051edcfa0428f94c32db3e7f89fb140aaaec66e2d2af45d4f7ef224d488cc488d17a16615d986c76682840f6b08bc44e66c60e8b0c75e4710ac75354783c554631a8a3e0607e090157e3a476069d920ce3440351e175b960f5d542362d11cc6f10be071d1b4ea4de1bc554402dd9c9af70e7265479ddee7aa94c8b97b7c424e666ce5235b519c478fb450819519c2f1f1054351eaf23edb19092dc5b96b674fe8ea22622481730f3d955183b5b66d663753c19d3182b72cb8344e63ddf0d4da719d3cbe513d6f13ca766982648ac48b669072157753abd61ff11ccaca0922c0fb28790db39378143cde2983d44479fb9c2fe50e87e83f11078ddd623f0694bd13708784bbfbfc46b46c17e0b5fe87c210bf3034dc3d1a9439ce9004019c138be7d6f8ec5bc010b4aa7cf01ecadcde2477964810d87c52c609a25bcc1001c0af10525f9654138dbdaf25b24a58a22219bcb2640f26cc4a507aa8024ab04de3a07f34032307e1b8d11224080724be7bf4cf855ae2a95e5a6701ad534149e920bff64a31043b415cbfa7470091a8105091065a4af8c7dcbe489b2de24858aaa9245d8b287309ef17f86b1e570cdcfb01c7ec82a2f61767d1c94e47c5f0bb2c7510063b63298a1e8457e5ac23ba3726d85015ae83ecbd60b1415e9c94dc46db990325e022cca6de063ea9215a053389d7b49b35276a49325269d0f94e96862821ca4c655977251fcd7fdf6ba895842c782c2c89addc2f89a5026bdbb9f48e23d942273621210fc2d5046a07c156120e6b04926d83b593e53469c61cb736e6259f95fc6576fc78722a05a1382c7be2df1fbc8bbf7f7237d0c775af540046d53ec7247c0de200c70150f7e7fd5127390442da085bf0367af3ee2f89142a561ea05d4775c4463d821d92ddcf3bdbe60cc776d97339e25dee77bbed116f4da22da6a26e30bdfaf36318b528263d71a2d07f1db31e18421c5d6a1f02c6ae4c4ee723489cee042e21ceae0c3b1da6acf9b2d3298ddb0335d2f75bd9593006f22131c6fcd30f57411c00f4fb95a6665edf27979c6e911387be4322767c88844b431f1120b5fcc595fcff81e5c92a3d1f8a1a64df3e82722c2530a8f817d481d231590ffacd4420607df6ca37fad9196846ea5b51d62f8a9637c40ad852b5eabc1aaabe12a23988161c0ff30bb25851089d8641f11efd7e8e7146030800a750badb7e4ae18910b9c796c1039d656c806fb38b0a3477da4940519c800c473b1dabf5a9957cf236f97eee1fdc002700779783379cb577c7cb3b030cb9e56dc00fb7e7c265317d7e96533ba78c01b4544c1e7171b9758e2a465950559ac6e902574571b553e8c0033933e7750bab6e785ad66290e0699cecd744f86cc1e3a28a2a3f6e6abb557cec7613cc49c33ff13a82b127e2865005563a44dce0a2a114d523f24f03f4b372ca2c40f5203f5858a9d3bc6e97b31600ec94898bd3bbc39d76dc8ee513aa7588ee3b152790822963a341285685c9c8cd095020c74ff3d1378ff9ec6e52d80947f723b438012d01590c2d897dfd5cb778ee793dc5ca7d7e6e44da4c0d9eb2f5a5d6f376081cff9ba45175677dab13255a6c0498c3320b53353ad4c9a4e18972ab2831e9ad7b4608657b1add140a8aafa3d4c923c04558e1e30e362219faa771a5592e01c68b0aa4149cd86873a8805a38f69008f1747e6ca3b6589d5ca524ae4ab40971520ad293c96e01ef592188f2ab977f674cd1917d30e911411ef7aeddd3732fe53c5bc49b72d90cbc09f3fd116e11438e061500c0abf121c5926f3b7f209d86f4dea6553c5692fa0b903074b9829b1ba0d1261ce7a7bd9fbcfe69521f1208d3d313130b21bb95cd5965dbbf549d39079973a237cc393218359cac66a14eb71c414d47587a4d8ee6930bdad911a3a2e72beba01293ae3781f4fa442d440edaf36a75999aa8373e565d65488e42e2f536031caf9e90a05aff63a621e4ae4e7c41aa42561db13cc50b353bc08d8b1625d33e46e6325b3da2058a3b98eee5e0566518a793842f2665cac31f32e523728a45c62cd19012c11b8877d84a0a6cdb0e74dafb450ae330a2317d174bfccfeae03fd09aa4e264f31df64d28dda21578ca331bf8738682faea06b7d45fc36bad03f6d4f0dbfd44d0697933e5577d1ba6e4537a7e6b7a89979c155b01bd8dce5867e287c4c988ea7d748e11df60c9c40e5bca48794f546268fa8ed0b068b197badd674c75db7d335694736869e557a6591859039cf1bcdb35a2f3239c29c3818457d8308a623260e56370861c5d1f91b7cffb07648ed4b3b5d51c3115e4771725986c33512f16735a5d6da85a040cacb2e84147c8af0e3c800fc722864991ad49259432d75e0d729a9587a681ef98d242b4db20bd95df1f3c079d4c98c05958f809cb3fe9d9e487c68edece4c489b6f2aa1887976fade781c44236e1d71de5cf59a64bc8f483384264f9ca1697dc5454c027811d29ae28618af915b62b2ac280d8ae5705d879103afbf99e0a86bf24f0ce7798d61d7efe5ec7a26cc95d0264e6f24300c491c89cbb52b144d873072fa34270c1aa25d3d7b4e2c4520587d9ed06126198fbe09fc6d32ff3f786ad29a4094c015270f10fb78cd4c4646cf851f903162e8608b69dad535a02040e933b1676c64d675c64f21e70428cbe12c06be37838bca025caf060850b217c46efc0f86c9a8478af759f71cd7ec9d5b51060d755c63e8e1761fc1feeff4ef3c93108d3666900ca89856d0c8170045850dda988b1122a50e50e5dd94cf39a98d28dc133457a230414d86c91824a4423498512fa1e9dbfb1dd1467eafcee2078e5189c4c2c131d3c7046eb1777f574ca7660a84a895625edcd856bf7adc61de7ee5806d28a399d54310f33a8acfd6ffcaa719fe13949f2b2af71f2df36043920a3abe327558193ae4022f196e26dd89ba84ca78d7b29e2487bed123cf01f32e9b392731cd0af8bc7735e481f670ee52c263362a687f60ec00dcf561020bc3fccb073de519e08e5c297242d6bf7f9ee3fa434ed0269f7ebab64e0a69c72e693e48204ff1f3e55ad59cacaa88f7cbd226fe11796217ea9eeceb06205cce67c2d12bb05ca7c6eb97d46c743d4a6bb44e4b891c5c32144610dff67612ead7ba95aa5e9f25d5b32b3c55197abb85bae026bf2a252ac28b79eecfe6096b08acf263def8fae9e39902b6412e5bcb3d5026d78d6c28a9823fea6f3b4c30f3b862c6c9ff50686b06c23d6f72f17a17d3735a0a602976856b086f53ca34353ae9e4bb0cc4e4a153e318ff55ca27c7219f7ac44db6f2906d88f3fdc382f4711c6f40dcf25a4e4dac4d6f6b1c809546c234352bd805bd5cb222e031824e07913aadccfb5737630d89c8c78d0ff87abdca010fa12ef0bfb431563d8f582bcb6c3a809af0d6f8a492e84056787288dc7f5f1c3e50b0ed1847cb7ae2ac003027e04d88047720076c46f32e11259137838f68bfc98c55637617a6f6b4aa570c0f182852f01be59242f525a1eb54f922e38695a99fef75a40c7f1140b6eb9665d30c3dff2a948882ac700c83669d8c2cfea21fda7fc2582829ebe923a810a8627b7cc7962eacb7048f2051344e2e656e357d4992d095e60ea0a52e7b4039e535bece44a7b42830b45468752db46c0ffc7250a71b8c26581bc3c89f9f4ede2b8843847a8e64e504352f117f026a5561340765a7901a71221d02bb3fd4c64a65c6200c408ae71e751b924bb92d5482375264e8ef531ae536cffc09c4d2fb3bdd1a2d727e8aa5c428ff47f69eeeb22b65820d1980ea8acf7b479e20747cb207c2a3b64ee49982346200461b8280b5bd1b0f9510214348582ad93b821f6dd69451c41356c323e9b75ea2b891071e1a858beb05e6e7658101b743013801297888ff787758c0adf91a5c3b4767ae292d5673c75a418c07ad272457b4f4740e103e9778bd15bd741511526fe62e28f6e0965b50a829bda3d69a6d4bdf318987a8fa66c76cd228d2e540dd5c4741a095d5b02a417fb22d7ca4292f544243fea08c42567772c28485b514a16c2077a4b9c81df7a8c57497e01cc5291fe29e05f2a640a03262920b5f2870432dde660c4d99f10a2f94b640c972c8c5cf27d4053062884958f496638de088513398203964fe12b51a08ead32600d9e02e4f50b177073b25152e53c876add683812f6ba6cc44c87807939f048baa221d200735c02acdd02c58579a01e5e3bef97306c4b79bc58eab3cb12b513791822ef92b84211318c1566f553f41fd7108b495d87a9eac0817ab9a34f3fd7f1bf94f14ee0a834d0c01340af85086367af9b47d4f0b0c8a784edf9dd8de2e697a7363d4d925402b43ad4ab08a619f6317e666d504fe06a2622f3fe449cb6cff387e49f59c641d7aae56cd5025246d896958951e4ff1ac80e83f35623d37ed0c517612be47d96f1005b21e4b680a6d6dd17492587add0c634f0e67488e10c5edb30abf2eb7015daa3fbccb94d8d81973174ff86760dd78b47bfc3a957977c3a7b39ce558e2353183a50bf9eb72802f3de1c06a7504608a4cdc8f8bedc3291ec6152cbb71603d0155684e29a02d218925086c97ea100e5c280458e9193dd949230f5d4d081fac95e9d0d62a7916e8e271dca11e41485e6aead38da1b65766d3d312fdceeb28c6fcda1142a1f7025697f436fe71919bc47b9e6e91723b6096b4833510431143cabbbc579500ac15ac664ab0d6cf3b43ca2a8d4c086d50b9ac8ba65b5caa0300aa23851c8498471038afa8eed0f78acc1dcae0ff851e530ae22cd32580d46c1d26a3e09deb6ec72aef402e643f63fe0e6054d0c8f413c9ba1a209ce7cac41a742244785f58f30f40edc3180cd98d8136d3e816aa4209d2d46d9edaf44736f1bee359fc8ad2f47913fa4c76dbe689f5d301211b528c0e8b364a790039c228828df3eb460a982b5093f1f47e5f4090a0dd1150440a2f26b63562c8da0f0dfaf186c8b7f7868189726584eb56f0171e1d4556d209b84360e97fd7240caf04885e2746215c7a09b157a0cc8cee307bd4db08ddb649dc1e8f27e3b81bf5d42865ff07fe31f1f4230c11f4d1bd065f1f9f2de940594cebae04412500906897d400312b36f1145f372e23175646693bfede6891f9816c10c2cc122219fa35877b28bf9b92db5f4d77f1639cd12fe69dab78f3b7c52b83b6131daddbf204978b220001590833aa0744408b3b1092c12aec207b35fb49b5dd9eab616093d709a4280510b3bd5b3eb02d8b5d5d75507a33d981cee236ded3df00a67e0bb2b56512b5e0e8b848a81e34547675a0bc88bde54bacd38062981339358f5d3b43e02a5e6bc004813b2c5baedf4449b2f7ccaa56c40889d1656f214b62d79feb3638b936315857dc31aeb6f794a93765dbe470179e4f1e17f0f452540dff1538b0409bdfa08197c51a92418c91c86c097f50b3b4981e293893b82a8fcd4c1e3a693c057f480f40ebbb8e0e5bbe72e07cf8d70d1966672560c79b9362312ac623b859f7c7e6fc3c680808d344c82946e1390c3f94d234451a936954db84095cad206d7a781a89c8fd6b49dba45fc32e09d5705717a8d1970f22cf3b772f4e87bcf483af6f25200a0b6e6bb250ccff9fc4c03aba70351910fd5b42dd293e999c0d3d514a698b27fbd689a62411a68d10255931f0bf940fbb62746ff45ee238a300d02fb11e2b85266122237119c0c4b37f18021f015eb2d6fbd6e58cd3de1ad5d8156c4692fd01132389a3df001b6200eee64b43dadb077fc8b0f8ce3d714cc26a764f8b7a3d8c30ea04bef18ab8f6189687f6e589ecab22b9f0349a61ff695555571a8de1eb2cc07ee3729e393f83c4171030d7321b65e80ea3cf71a1c7740b20400ba51c1ad3b3f122a4f83cbb1021d1846ca5c059477d89feb81d55dc74d389b4b7abd76d56cae32a9506c1198a8fe2a168ce27069d16a0105b19b226404ca39010dfa5da48e4b2ee27545c288d96ed643118a6b0916e459889d14a2105bd6ee75c65dc7c80b072f989e913ee159625eb230b2b30bdcf153092654f06693475ff7bb51d5906b3f9ecb74cc67f46047f98baa8b44a7542ddf776988762a6d66abfbc8dbeff6c3314eaeb9ac9d12971d92a689d58e8fdb0f93b395008433ffc876fa4ab638b874e8d404867da41955b068b59f990f265bfce2466899584d147bb16b96aa568e3ff2efec3ca73a8d27db14142d66577e4a0cf79dd634281bdbc9199e303b374ec928beae8d162c9c81ee96ddd9e5ac6ab35f88c46fb0753e7658b17253ad62039c6f843b0dad17eccc6b7bdbe6e7b8e5ed9a717b9c8c673e9370d21903f4921b85e982afe49396e5bc35686eb499d99cedb4becbfab9442baa14d200f6e8e7977a6db458b86eb143a55772a9a13856371a73b8fc846622ddd61d4cb4fb18d4546665692c91697b9719f22e9ee7d08119f76dd3267b8b9337e836e31894a07bc41ff9a84739a00f8cf91b51504ce4d6e538a214566a8ff2dfd355433fb7f1732c358a4409d01441dca68362e22a257ba5d723f7cd04669c09b47633c8b25ba49d3bb5f0b8f233ebb875999759aa1908368a33d068415394fa2e3481119c00506dd26e8b4e1c6d3177e4c3e75e14193bf933887d798a02219676bd71429bc1d10e176765f71cadd8e0fa549daab12193139a263aba7f24beb642d7b1002c13a759c30840978c4ba097c62331d61b281db82f2eeb29b92c0992cab28bfa9be1d52ce87ec06ef848f6943b6d2b7f872d19753adfbbbe95037d2d4d057872be6993884a612d24eac7fd854ea7e87548e05b595085942e0281cde4194c39d88d7f681dab247acf6d412885346f4707ccf2c5dcdf7bedf5dd002c03001d3bb957538db3ea7fbc793ba2cd37482bbbc3466aaf1344226fa3799515777dc0225e1fbb54e22d921ec33654102ac1e8a2db9b7bb4f745c317ea8bb296889d75e19692f86b76ee90bb266d89a2c09fb02520a1c581378226878b1474f50660f78c3eeaf3c260a4b3f30c2c23f38a1ae8a8ac7ca9222b417a796a021582890c817ef97ab63fbe5466255a0c3f1b684f8fccc7e6eb3c47a435fb8d1cc817421557bd5331a2862134aa7dabdf5e72c4f595aaba36d8447ba617722ec28f9484738ce3f3ff8c3543c9df0120c37f9d303181550530b6d36cd7ba0b719dc0eb47ad0c4c9f2cbfc1aef7b96e80d215f4426b34f6b2ffe33bc2a1ec878d5cedbca4060e06db58c129fb3798ca7ee07dee4914667374f93813afff3f772b6249bd649b781d2941f049832e3771fda8c5fe1d0c891c991778f63a7747cb88b3e05b8b884828885440f2cb7ab021d330bc4d4d0d96ba6e470bf7318e6e6157e1b3addeb2eab7e6b2299743fad1cfcf03fdf026213ce48fac7f91693d229e64f103702f3b1b62a033a274b08c765d8c3791dd4db8f04022f28f57ef4cd9bc71616db93d1d07d7207d3cfa3c83a873491095ba3acbe5da1a05d3cc29f254508ceb6476a4a1bdceeff6ae9f9f31450afa97f31667e1004329f9a9666ede9e806caa4ca1efb2351f7a1af6b378ba37507111c56c2e4d76b5aedcf944b9b6bb6fb793aeb088513836d475a20fc2ef361a1280e1079d5747027a5efc5d623941d4fd8d3579cb17dc42f13e538f5645608cf85ee5895c195325e247e5824e31ec5f83fd6d5b868036bcbf4f2c24be4100cde8178eaa66a034a357c9a1920bc1d70b238ed62e33cf0e37f42a49b8b2f9752433711d94a3e6ecf9dcea9b7c8d4ddb7a7c0058ae04bc61bfbf7a05bc7acfc1823d559be4dd06428cae8cd392eacb5896f2a6a4100b3012a8ae9f4f400cd1c88a02c68eb916021891d882afe5e623dc27fe1abd55d1c30f901e40019d65bc9325c10ada4dfddf4b59dc19731f2a0aae1385ac302c8f5f65aa73bf7a4582881b3d27b467d367ca2530b40864f471b57d13809a7dbeee4461033bc99819a926a084b735c70369f9e61dd347c97a931fa5167c3d51700d7bd79ad25681cf152ab9668dc982309076927a1f85e08e6f551a3f89c10add3602bb2f5e19a12321a0f204f7bb8d8ac5a3be4eabaf01cee1f687a29b7fe33e84436926005e4dc311ab8a44e581cef9c88638d5fb11274d8b1ef1e6e9064f409ac0b992d31e99d324031e09a1cd0f82855921d2d2881f0f5a4207748d10a403a04d465c008856251c91b0f3af112b6afba0332f621c6d25934a273234057948019dad33947af6d962e226857644bba37e0c03151cd3aa38293aa3ace9e2a9bdd16469e5634a4fd987f30612ae45d6a067edf7e51e56f10016a4752208096722e8fe6dcac78f34a975250869359c87ca8eca7d230b01e659769afe11d4fcbe4c964269734cd7da3598e3fa6f42303b19c450f983d1b973ecf774aff043864df2a2d2b31d160b93824443e4907bd8ca5c3f07c7912101510bf13b734a58d86887ea95b5b9baa27c38c487151b07d3381db4c56fe65b49abc9cc76db119fca588c8ece62a6aa28b00273867918bffb8796bcf3f0884287d8d7830e4c3662ac45c1823f34c4e5bfe6a98184e378fa9153b1665be9e9f0fbc610e34754aaf5c86a9f03798e2487d0c61a53413e0dc849a0080dce9ec665a04b63152adf34737d9d3e6d4c582d593dfe9c2d3ace9634555f339d3ee17ae4e295224c6f1643bd99d04eb33ac7416d041e9a496491c241ea668a806534e925a33f199a5cbf83392f4deffa37239ca8e07c7f171358415640ea4683fb80cfde05c6f30f3e8f9d2f15b8c3a0e0ca3b73f95bda3705858bcb4947686fc51c2fae87bee5726642c8b1a8154990961250b6cee87f9eb1a32b3657cb5ceff8048d9bfdd0a502ca5271c0c56e3b237a782496ba620809eb15efa34e0afe524a1a0b56db7c58d066974df6c1dd24a23b4a0a48bff6a10592abc339644316129611fe9c49c0f751c44f88195fff0353d69731c0a444e4aa0f7ee350e1fa18f12e575978e25beee04c2b042a0ea206ef51fbf0cc707e40a904a83e2a19c8904d3d8bea774934f138f720bd88871ced7fe8a1811a68d8df742a608849aab7fd90b95eb8a6970698430a3c720e05a2fd3b174cb6345ccbff282d7da3356d364ea437f859c959b9d10639221c6133c94dd357d45080d9645b1e804ac5fc24e751e624dd233eafd9a4bd46e45faac314e108ec77b940bca00be9caad4671107c91883dc79078ed9d242214bd5696484d8786fa7bb4b303263b8953a8686a2c1f07f9e306d844a4afe6c245fac954f8d667a09b1026cd8d67af985fbc8f969efa19f0b666fca97553a335a06e12df3b583f21b8583a9a79e8372e1a40c805c70fa402573beb132faae42ca492d80fc1257952c24ff524025716a9dd5461c89af73c9bbcec7ecdb7b990a85489c9d9960c7bccd8e745b880cc709e7687027cbf02702dab7260000df6df86ca3314693964a7147de667560bb3db2656ccb2cd1b7493220a9488305617330ccad252db6eb094b581c2a69c06cd773c3c611a33ce5bfbda061378a657d1f6c31a2bd1f6092ee403156ffbb3334cd49a67e47a5ac9b8b751f2592ebe512c3da705d99840d246dae7bce7d8154c2f35f9483d0e0939d1b4ced99b6a47afbd99a0d3c4a6036e7af1de05b4f4d2d1b32cb7c45d198aad21d3fc484e2c0307b89b8628dee366ba2e96b0c2a1f580a38255c17192792aba80badf7e978e30e42b346e8cc93474df35e2d0319199c0200e2f0c168ad9803aa83408ffd9c458802d226956c41913c17490fc5003e00e67925de798b0cda8d5eed7431f7535d0f1d0f052c5841f13396998c49a48a37dd00a4dd03a4d29561f9b311f436fa1e5740ec6ba106f1631d0e652278cac462e6afe78082a2d18d0109b926633c410153e54eb9beb1a1ad23cf6f1e577ac8f1b3546bea0c6d0d01cdb98cde4e356ca1cc2d0d0f897978c6d1a91fd319ed55d914169d32c343406945bf228ba2ffe2c0c7ca5f888b19f9742435946d01731c45944dc6d2c665625f0d6587ad2de39716aa244fccb73369412bcad4ccec3237ad9d0aa63009eee0c9b5a0f334eb31d73e415be6455d70917d28b6dd632fa973a1a9c63df2d45ecf2c4a921ffbd9b4235e441a568c8abe79927889bcf7e7ee417b2f23d3c98eaf770ea9cae755ab006cfada004af056026f401e18ab5b5937f0034641c92b417f59c627ccf2539f2bf5c4064767ab39ed6c01dcdf8594085856064481b430f8b2cc1c3d167ec61f22cbba8890d5f17baf63bcbdc505776797c635953dfb126624cc7a9ddffd784963de0f4f3b300ae5728085a8e8f2c2ef9618598eeb1b8daf5b31e6eb67eaa46f1521e250257b1e3188758b78a21f7f1144943b7e4aee978bfb1dc28a95ea03b6321a0a0e6b5f53cd1d10527d4176cf93525085e97427478cb5ee6abb5d6238462df3a2041b9aec01d99f20219a8f00b011409ca22a7909f239b1da1580b6edf8571af32ef8874c0a3780302b83c41f7ed57e30c5828bcf4bd04b8d9b293a31cbdf05516803134eecbc0df37d697382baaf8c66f9cb06621c23da3ccd14edd41428af45302d0a0ca353fd16f30f8f318c0fce43a6bdfee2c330f8ff0a80b91f3273e37b6484baf67a1a3945a394b944f3d165931ea5a4858c560800af2eedd82e9c3812977377c6c6339bad9351e3877cb5864743b44befb2a1a98708016247f8174b1413d82efe76f887630f660ac3039f4101458cd25b5c6a05e7bf31024c78d36f3ca53b5c91f672a964956960c775e80228c81e73171e5ca34c2cfb15d98f78b270a93b82191a0ac5482d882884c4eab21ee7f5a3f3158fcf6df191a93ce10bab165b5cd33eef7b3675ff2b2262ac5f2fc9dfaa9f5846e0a1c8eb23ffda8e459860426f1ee2c49a5f4d14b62d80d48d6400e6a42fef3c77862148924258fdb7fa4b0be1dffcf25cc8ba475c7d3a78f051c20350c4be802608ca1d4fe8afa390bf45e03bb94846786e42e03ccc7b7f842cca21545df417eba1e7469273ae38c4e2117f81f772d1acb24c4acf0c707a600654b21d96f9ee1cd82577d650c46b2fc243fc8a92e9c4377f25c8256b981afc17281a2d977578fd6e7e5ad2d5567b2464996508dea7544578541efe250c95fddbf958a373b80c57eb1d04fcb13b14cfb3b5b8bdf76e83713d1a4c320406af41fff1ee23e906deaa6c0041f1d9adf5fb1bb56237f607866b7345c6557bc119774f7dddd676aa0b1efa4a5ba8f10d7b6741c67311991d239e2318db93651af27e587d3f5604f5a0675d24b71e931b531c7245fe27d248d5d5ae8a9a64d62b341b039f90ad395a99f7f014a3daf22f6b0d24c1a38686a055dcf94b2d8572cf6d382444cd31ea8af32c1bb011a98b8b69df8cd243511310e481bfdffdf59dc9b4013ce32b72a29497f527c0be9b2393813e7b55cc0f5a1d3f9037950fbc53af8b0c185c411f5f880e0deaa51287a719fa18b82bfec6be3c1af461ac16f981cfe7ca86c60f8110e3ea286fc0da5dcf294058f73e5e3620cf552eb074a766e2b054493d12341c299afac1e4037213af44a8eb785b2b4bcf3e081c49b9685d3e7e0c0b7d9f4bb50861e4e97a83216cd1ead54f12f894667136d05abcaf09dbab318ff0904bc0368e3805ac82d7df57b57a76ad048f8a5c11c11c23048cb810c0515f63d8e3b960a64fc4d09f8a491301f0eab4cfcc505a86df794c892c095af8148d84b48d4635bf7405dd5ae9f35fba1de27fc18209f8b924e0d9be53e172ae94aca3bb26dc07f650c12614c479b1163dda2d08625c1881272be2a36c6e63b6412a67d85d9452e5a126c1f46d699b1b1753ea684cdc30a4777a4e520ff0610cfc484ff24f4d8c29219f33f660737182befa6e623963890ff53ca1e3689e9a0509311ac7ad383a17f95a6343234573f5c62970c9c3fb948fea27f995fffc4e162b55896ed0526e9fe392c077da2082c68fef00e433168ae3ae8fb6109908f0ac9b6fcd409d415e45375f0e6213e16533d626911fb7b5360c10e328c04423a2ab6c106f94ae59e35bea3903e235a29f4f10cd642ba33b09bc7a88e4903ab6157cac5b255e161c43f252ea6d26453128a18f4cfdf3b68e8e7cd61abba085f7c9d99c20f4b9116992f3eb36331f599f6845c4a8825e3d8002c33164799075bc1f9f3373ff49771179ab89fc7aa56cc60af0d474390761114c38d71870fed3fb9462bd63c736966c78b45263d7d26e17981df2e1baaba9dda2b24d2bd5591fcf2892f9984d128084fca1475467d2d1da996848948c52f8e7de949b9e03cc46612ed03d1dae1c704d17998771ce7af4ef8fd1188882497323dae7136732c6332217bea2bf2481ea3b4e8a7cc0596333c5a5a274e3f9e29096d3ab72b3fa231d8415b2d65cf362ea20bf43e3141e62f7c3312b119d79d365a93cde83494ef914afe180b7178864592e3fb6dfbeec3fac5b8bf680ab6edf411335a55e939597d0692c0bee89402384896516361ed06470a3e325e9d9a4279a1cfaf0652067a2d413f0471c4220c5cf8e8291fe8369f6ec633c9f7d9477b07aa6a7a10bd1da89565df506f25718716080a2a123678bd00e1557fce34d72793f8d1885c05f00ced1cea309cc8f0c69e8003675230a0ff32a552f8270cf5dc81afbb35ecb5274655790030677e8dc96474a0ba38e6661b573a873f4b0d7d4f75b9cca52cf29005222cc8211e194710899691afbc33017e9d5948c1cad5592f100ef1c603d7aab6c80e486f191795922c5cd3ba61dfe254adb74e76fff95c03f6d2e423a9c62298941ba8c1a2a42a1411005f574783983b6fb1ec8758318f35588fa83e8dcb112ad1558838ee0693c06bcbb1a7ee5461f882c292bc6f415ef068a64a889c1802f195fb3db1526494436142a5d3d894e606c4c33917721928001a5ec743fd55714cd366a71774b0df8211fde296c86eb9d174b1347cd51ed7fa73309e72edd4a93e3502cf31b1bd00a71e6a0af65dc8e4030e7d4a6ee469a0c67a9bcb2e24873e972ddbea021d65ee11a67cd296a4e365a0fd13e1ded90f219181ad20ea7d3ee2b6e773fee709439beefd52efff063776bf24e57f1cb9e92edb54a8bf904b46f70efacf844c4415ecc7413bf5711a41c1e12f9044b6a882f900facd184f0abae86dfd84de4169f4c508162492d16d858ffee2df7f7c4bc6ab0b45874c700c4636e706a283db902128d610e55e1dd3c41c694bdc988cdbb592f6445495c64cff52e3e37235c3de85204f6775c82a0810f39b0968993e4b7b70480754cccf08ce92770d60062cd4fd68c0dda4472beaf89fb2cbae928892146d4643b8fa367f503ccbc0301a83c190aca98f5c878fac41bd25c9149e0cb4c2b6247dcf99f859d307ed7bd2af9f3988b1079b751967558c42ef424eeeee43e5439a00d16aa98f9a727c699f033a7cb2618be02738c043186eea545597050865c060f5b0a154e494974daaaf0daa8ac4c2cfe1dda1074565c41412902e8546d9e752d4c352a0b4b5d1f4ac3292b687153ad9fcc93b2c3035532c26a96b2a7e69c5f982dbfdc2655cb3cd1f889a2a08bbf883980fc41b454b33572fdbd6d9ef24cb080a03f8bb92a150f9a53c12f4b393051e0516cf233cb9583abe0d26385acbd5bc1e9c67755112a739b9534f4c00c9a55c6aef0621824767528b11e3c066c9adb185efe676fb347c2a860ebe8e58af54d300a9b304d17b38fa486ba36bb7b61cdd655091451bf55d2143e1ec897cb62a5d4a3456361824e428517f5af97a77f69e580dfe6b82842fb89d0c49bd3c5f36922ea7c890c55de4faf2e7c02282c159d5734bdc4c45a84f292c721f2f36461b9d5ef6c107663cf30426d4d1f3160d3f86e101dc7f1642b7b092e4c2ad91c7b8408935282197bf974c975d201e95b79634e5c33864eb958273f781cbc5c6a11fccbd9a306e048c6d425338965f9728ef992a969720747325af16b48884f3a87aaf8d438ac9bd906e97b82954ace7e2ba378db35179f949bb09854e7705fa1fda630ce122e880b457c68670172050ea4ca02f2be8743135c77d9e740bd26194ea78885476dd6ee42125b30eea87102aeb10c3841073436a7d1402c69206f4f0802f9baa8bd67f39d0c27de9db3a5089818a9d2fddb2c348a2232dbf7daab43bf5cfe4d2f73f32a2ed5c5fd29e4a36a25c8eb6d07421c6de2a7f485b98f9baa861050cd7ccbb541368f73668e93208312138a528bb2336d5671a429747517c712e452e0cac4c18d9503b5718c8d97d6eb3a5b8e5923ba106039bf4dde3ebf2a01879ee3b668d9e11ca3851ae06bbcc74802c2393c0c7996907342b4ef20606cb52a39cf591b3fe72d67a34fb3f681de528ed701f8a40e0359db72be58f12c337f8bc7135ad3f3f15385a6148d2255d7a1e5af3c5387d494c6b97772bc9a7b974c46576719db46d5e8ba12e6c15fb3e4294428170d9e4866331eca07f2872ae69ecccc33456ac6855200a7173fb0aa4fa828066652ac1827ea4810e6d5daa94aa30e134cb9c841e6d85d961c2d86c38019dac91487936f77e5658c3234b54addab6502b8870e91df3b38a00b3e41417f55f49b9a956ebc265b5722dd684eeadb3ba279d0222b78964d9e685846ea4a80ef7d10f575c8ce21b51a29e81aed1a935341ad84cf4ea799281e035fb2f6e81ea599950509d224b8ff372d1997cef86eae563bb0a3d887a737045930675553f9200e48c9dac89d21c1a154bbbf54cb9703f29899032d6516e9dcaaca79c75d2dc761816fbb6875ab6c22fb79b9917451dd6bf9ebf0ca8ed822489056a3befa110cd8f5c95225395cbf0157bead8683939f48131e5e76ee3528a20d8323ae619288b8d77dea8b9964b1c1b92d2c49c459614ad50190616339b8281391a5b6bee82f2f8d098c9bbbcd9947caf711366e345c126f6a2ed9852eea45175ce0c0c07d089e70b7d8ccd3fba09f3363311ed55904aeeddef3f00dc3352bd18e24c433ec658dbd02f3a013893885adf7b96b4e1d899bcc91e0806790dd4978d8c59db5d075f40e5744f576255bd7816d8217cfb58c35e4a16f4b1018d528fb3468b5f4163969c78f45a0d2d5a32a281fe9c492870eea5cbc3d9d5f151380e46a383add0c5cf1ea679fd026ee68f42dbbc53d973cdcd530cb381aaa910daee7822e423564a6a757f0160745033b92854ed4133523be8d1683d369b6d980fc590606b3ec3a3b201e6fa64b4b1e02d3d2097291e0f54b4a059519a7b1a4347a3cb4e288f8125d357dae726638b95d4136e5222ed1cfd3fd5c62329f48a0fea5a1553a2b14cba21f55dc969ad86f1d28246d2945c719acf5c590412df332ee4e4fa1dbf6075c46b058f1cd5d873c67333c12c91662062fe879d6aa0e4fe330ef1ed06c92e7a9ed6f74d8d704b79fd37f9343e76962267ce9b014d51604557c3cf429fb43690f4891801fbb738a2901c86a64fbbb08825c7986052786786dd5d414c32861f2ae4ec2e0d0438c6a146764632a3dd25e4e3791f9b3d1e35ae7f4ad6cd17f0e004475781549a9c971954390f3ef0b7d310ded069e6896381ee5dd8183f9d69adce7f222380d918fd70435e5088df77150ac73d820c7d353b6a9f9a8d2a53793063242643a17385555e0eb9163b147fc9be7e208fbed7406b155c4336afc7dcc7a671a89b7daebb6a8574a95e3af8d73b7ddd688df10d0c284a0afe6a64299ffca6beda704ccbd12b24b6176eb888cecf2219c7b0c04b495b334cbb7fb2d82648229856f71419bc62f494d51b6dc9937caa690394fe598f3182d11fbb527e12b1a8017aa004f64ad4dd2f9721d88a2493abf35f94b65d025107d0d1c7a466a08e90ceac13eabee18337a8869507fd1146680ae5c66162aaf64134957c7592c485eec09a15fb31a56a6ce48c54daaf542b2878383b7687b2e63a7f411eb805d1700bfc56d072c9a651448073615590c70eaacdfe158067512cc79e6e3261eb13d55663b82b65b18282c8508dadc1b36776b196890e47cda38bd521ef61fbcaf201f432218df35bbdca3be2280dca04fbc575b5fec3bfb4e45505e6f4e03dc5a2295f2cfdd929619c3a80a92d3ca9e799cdcc6ddc2bba412c43c568aefe0909857824b6176f8728627b898e99b1683b124c65c82bed4cf8e5f177a87ad263861a0ace1efa56d171ec5c5bab5a7d70b4b1e609e70733ff1a72eaf1516202ebbb2517c1ca2a5c44f9f7e72282127882a977cf64faec89a235592698c73bf6dd6afda36cc6f5a9f31220518e956b3d3ced3f35157854c4925006d22bb394e17ac656609acf1f69b0e8c6ca12d63b580cf1336f733e34ce992a713ecfa3184e506c80be221e500c383112008750e509a883d70e0875aefb2029db9689a9048ab9bd9a1cf5955682669f85e164ece85ea1b3296e62edd4f22654fb26bb4758339b66f242faf49621dbb644b5a6399ca344099d9fa48e17aa0bbabc6f9f2c6dd1147dbfc777f53df961eed49ddf126583585efe9023743f14232b1347a183dd76f3a45c5b0afd89896bb12d5b702ebd31061572c10f894cde200b654171027b610c193ebd95e82565b5538bc00f69769f409b40709f969a6530d984e5ea22e0f689912b09cd6f796954e15e4e91fe09a862fb2d35fc38a34dbaa978511e74d0a26011b121c07ff2dc1172a23ddbb6303233f2ab7cd7749f54ff2723673d173225d4daaa092af0b4158830397061b2b27565e1ea7fe2dd456994f32f5690afee26390ebdf8dd67776d0b53b4634bf81e2fe734580efaf1b8e96d5dfcfc51862e12273270167a2c6a8ddf808f4f8459eeb8c0dabf70f39e347a38a943e073375aa435a8b6e69bfbee85320a82952e32d3839f56d31d647bde2c52422dbbcafd0d416c3a80956b1a946dee704085f4266b0a1ba43d043a1a1f9a5a305c15351d9981a263f758ddd46dd4f5f7dad545b35ba6d52a844a7eed36a439734fa8ac5fbd02c2071e99211c00030b60ca0084d1bdee9c330ad85c00f4001e6d6bf884261f632ffa08f661bf35db96969a889051237bcbbd777309f508dd0914239d623b3a15fde41487a563d4bbbd77637b775defcdfd60c3180cb3d664fa51287aaf77d7bb1b932fd5c5342a7805bf53d74d267b8750f94ad783e8dbe5556f5dfeba3eba4eba56377bbb6b92e3e17615c3ac35997e14eabadbbbed9aecee8750c117c7a651c138f6e7d5d464abf295df2136bc826d64fb9b7cddb03b664366d1adf683e817ee21fa867b8c7ebdbb3e62f2752ac2a347f96b4423a625d2e57997bd2eefca7e5d5e67afeb9862ec2a81bdbe1bdac8df65c3dc1f3f44895e5f595c9c9edecaf920f27e9663ef2af8266fdfede554e075f1a86511fd3159723ea8264ab668717c1aec42e52d4ec3f2abb46039b6d1295a5bb438cdca555ae0d8a92156b00a8ee91475717f69bcbe2a6f7ae9d977baa961ee53b2c6a12a571c62217682435b42e17bbded1db9fbb7b82c5fb9f82ad7050f5c02eacaf18750b98b3777cab1727c1a95bb68f17b9a16bf2dee7f4fc3f216bf1f82a5850b7c67963ec48902c22e30feca695c541bfe62081bf00b5c6f8bdfe4ebe2aa1cdf95c764adebb29925d75d931c0faa99f9af7c0896ab5c72a71cffca698e574ec382af72161617c72c180fe102636c3b557f9323e7ddff342dce72f1f1102d70c4bfc9337366aea8dcc7c8d0468ec72ca52da9948f3e28d38629603fd891ac795506512a67c823396229bbf664a98a41a9a44962cbc21695d4c28ecc17f9932f4b620a841ab139383ed6c7e463c24c39312726873227f644ccc7fed4253144512cc2d86861478290c8217246fd15521b65117246edc6b2882145f4758f75aa5fdc920c6c1879ec44a15e8c883076a6e2651147f0a1961563376e1cfab8f9aa17e56a5cafdd5267bef4adeb32311cf3b22ade262a66091c8da1666248bba34b84b13145fb6e188e9457cf7c8142cea0aff5f2c93ee8a504ebbf7e4171f9cc970b27d72b93e0e8d4fcb513031b4a9e70e664b90509836921ca5c4a228c4a7ece0de4190653155450c8533221cfcf9c1a8f1d003aa6145812c8224c66b060c8510b39c6cb0d48184c6a000231d65c3df345093e3972b561244f8ee461e1c99949266a5e20b64c0c3420a6e6656a0a24301561e506e6bc0c19b173c74513368463a7a475b16da2304f368526b5276b9e4dbdac96b4256d29a93c6273e1505a7d35166874935c6f0f36543860202f8bc82132070859e3001ea6c6b14d727cfc04b2a625130bb547faf03411190a9b086661d60ed9b2e843968caa92216710892a18a88e3d2e35b0d1464b53c5228df1891d72bc8b0c1adabc0559289040598749fbd8a64c122986c35196d8ba381eb24ce32dae064663a634d6fbe2a519d85035b34d548c14065bc91c311f1a04ad5eabd7b5ee9e3cf29440a84b72d7b48f8d3eefe8e3a3ca99528b3e78a6009d74e80f5d45ff4c54979460c3b884dcc74153f3c3290575c91591bb7265b3edb4ab8b4c14bdbcb1f796bb2524d8f0cafdf71160e3b2648dfa0dcf5ba169337368d533a07553c919d9eb89e4199fc81816976057765d5886165556bd33131533511876591aa31ad81e206a7834cc77611bf3a5071c9fbdb65374eef0d2325ce24be8b3ba648c7b56ef4dce64c81821cdbae488645765a2228d5844cd5bf333da8ae1409bf8bbd7b78b75915c37ec93899cf1913e1fd2d19641d2bff9e678c832094f2cd4209d7b64428166e9922e0ac644d1e310e110f349c0cca523368c3d618c0d1c34350ee01181eddee9b7399a30a589053943e659ba71a6b267573681bc11e95abce88626f0d68899043e720ba8f524d2eb4938147dfb453a463a7612965c0244b71fdd2f8b6eb2f5b66fdc76356d6241a289f96419a536537b943342df5ef1862d19437be56af4e9294743db4626194389ac6a9a96b56b59bd1addb6ed35e837bc4d99b357ad46f6d0bdc9968c512d2a35496f1039ecd3c890af44af9b8659c7cea4f36e44f6b0d570e863b368bc62be2293f9729d0b5dd355f944d5dce1512ed1c0d277cc0e13e67b3daa5e1527cc37fb56c819327296e87eefac6bd866e4bbe876e02b26422126f23562f6f0c9be07760f63b7b7b8b83d729c8f2d6f585a2163843eaff8a25e28f039e964cddb7028a42787dbad87b887369abb6fe7ba6fddf6cad5e87e3d05e85444ce88b9eacc977a9f1cba538a89a2efeef49928ea44a697c3514262c319c47ddbeef6942be6cbfcf614a0f912f3f6530ae40c99b7538ec66671b766d775af31dfede4add3e6c6d5d8cedd9bec63eee40c9f522063580fdd30e58a6c552443e89e2c57b161ac6a6dde2bc6236f8fa21bfec81b0ebd87a4b6d96fdebf7ffde1d0a6e6efdeb4d8fbbc57aec6e71d7be7c8193163de2947c3ebc9db75514dd4f579fbd25b6fec920dacf53a7f5d47c06579de64e27d2ef1de24f0bc7b21fbd0354dfbbeef35e6bfdf84cf1ef7cea6660e6fa11a44262e59f34298bc4acea00fa9f6cc85661a96216364af9d3bcb4e391a19932caf092b31f19c3d7b942167c89cb964a793f220afbd86ccb2d06916bac936335f58868c41e911edba76dd38b1df647ac3f3c8b15e77562c63a63b4ed98436fb864172bce24d8eb74920634c26b9df37979439a031a714b0886152461f9b2c420e298249e3585da04523489c884a62f013951811224f6c3373054cd9c694b3bc917202bf028d2db438b5162da24c8b162c2c518685656525caacaca8a844191595d329ca9c4e2929512625050525caa0a0984c51c6643a3989322727a55294299548a42843228d4623108c32202812451991e8fb3e6ba38cb59e17653cafeba24cd7715c94e1b8d8b26db165ca685a9645992c0b85a24c28145b30ecbaa2cc75595694b1ac5aa34cad94764799ee39a3cc9cb145467e5ede486909c104e8a70a287c789e48b2736489247472884821b26c92c515414b9848f12325ce1563d12bd30341a91461bce28a44b04215991e063d55ec9e2aadd78609c33353071a4329c5e982166d3062c3f853310cc37eb09f8e91e590962c8324905c226be426251356e630027b2387c8481f1313132fb52ceb9a40b5704c471965bcf53246a5ca22d7371614f3d496b1ce6add1c88b0b5946d620e43582343b055080707e41a56a1cf4c17d4bf19b1218dd9b558b3cc14c7999219111acd71c26c745249295529820d9f290a063da57f31bd2813e7fc8dd6f5a17b93fbdad48c61193246fdbc8dcd46422ddaaa181e949cd5a2966559169667a439d0faf29a942b298388af51e6ccce224f6b725f0338808359b81034777a16d19158c43c859846e44924cf2b7c4cd49c3c988e649922c655cb25661892a3e4287e01e3666640cec9040b47004a120435ec4451038b0832d87440822c18c18a220b491822054cb010638cb2bb37dad87c99b13b7637a594524a29a5ddb17b069452ee1b1762f63eceabf21095efbd76ef09bd61e9cd25a0fb09c342144d0e4bf701239f4e3b03418ce9ef3d39dd996949890a9ec8f5f4c5fbe4f4c43be9520b96d2574a573979a9f4caed78711baed9303f14141b504c9fe92b5d7b71633295dc0fd4647aca0d6f72cab5de5ea484348b5cc0604fdebdc9f4dad47cc232640cd3eb0d5db2e9338d82e3448d6ebadf090e61e412e9c689d2bed1b649ee878d3b0fa1dc9de3be594b0303857af1827a1e087ae1e87b41a905bd172f6e9c29cf761a0d8c9b0dd7d36b2fb237fcf0c5855c476fefa581a59f3032f7d0bd4b031bfa80912b07235399b78d865b16343747727cc46e2002d01460dc4004202964f93b6d3802f7892c49c581a3ac54ca48230b8a3e8d52cef328776f87ca4f1aa651c19ee6554e3bc7d1c44e698f9daa9a17d6ea795ead9ee9a4e4795da779ef3c4eeb3c1c59f4d1e93c3a55ff712a1de90453b92715fbbaee386155a72a27e26ab5a2d368441ad9fa5315590e3c5591e5b8d355c141a3824fafb59eab1d47e34315444db3548612c98aa84a011d38ca4e4e4a99157db5d6d1886447b556558761d69a4c3f0ab579efea3f6b2b0571d0cdf36a15e1eddfbfaf6a15f7b0b5b31da992ba3a1a8d46231044a12794aabe4ff483eaeea24f54323d364c4a8aa9d4892cc5a12a77e0c88a4ea3118ac99e946c6647d64a1c22eb6d9b8a7b941908c2714284aef34cf5dc8e2ef33653ceb28c4412812392c7ed40b9a97298060577f7c07b60e76d998769baaeeb700ff01e281a91482452d7913acfb3342654d7ed309d8b3b4c184b795e77af13bd870dcda277dde8ddb59ee79148249287c3eff624d2f72e7e64459fe9a298ce75dbbbebdd5e2e9ecb36d3fd4183824d9c0da5d96a48f32b83165f70a2ce3ee3911b87d9bdec72cf3e10147d190e4dd144b1567bab918636b0db87ad4ba4087e66a6b86061b32cfb68a3413c5b20e5a1e5ded9ad9769efd7d6b2eeee5dcbb2cc46f4ce3dd3a8956937d432dc63c4d1daa36c949548e006825a9659dc0dea43c85d7b86411f344cbdacaf69a73c3051df1eb8043c466c27e7dd4d33ddb3a311062d16711d531c87439baa51aa510f8737dcbd1ab0dcdb02325b9f5a9665f778e4d6de97bbb5a91aa59a46b9db542eb4a959c371cba1909ce1117978641b7a808b92c06176a2b089e298f0de81af4cd64e940ef41e078410e00d6d3278d1fbd8d75bee3a3777cab2efa60b66a2ce70e33851deb6813eb64d2385b4921dcd9ef49d466f9525adb7eed4022d32053cef74020fe2eddfd6ed7d8fe0d69d4de313f813f8ed21963f7c02b18d981dcc0e3ec3e8f7ed8636fd6dddf67e05718fd2777d6cb97bdfd062afd495e8bb114923913a52e77d218fd49fd733f4ee3b9d2fa47fdf356aff99b87bdb4874b2ef814dddb9ab8936d2a5fdafffbdf187c1cdebbc5028cb361105414a3abde1e85696652f1da4b7fb4e0f7e7be9f6f840cabdbba29344371c611f5bceb230fbbe7df47636d93b78698f0ed35b1f9ba5f7e8bd631f9b8fad1d00848d9cc1143370828f2d5b40ce608a194c71b0061a8eac659444414ae9290ebb6f9556db3d76c39470889146f560b5f5ab187b2aaf44aa28f444d64fbb77dabee3f495ef60b94a47e9874f1b5ec1342cf766da0bb7c74feb28d52a3e59ed9eecbf6b9dc9844f169f729cbe729a130d8eace1d0541fee2152a9448f128552cff3a84769ad59adb56ef68638b2cd40100c5119040f5ef35431df907f1cf81e7d2822d2e9f41da313dea182a3cf36adb7793872d7fd2405e524238128267b52b299c892ac5da17693f1047e74d2cabfbb912ecde923f0e65059b122ec43a5cdaddb56aeca4f9765bb3954f0cabd4bc382e35576e52aa759c12a98e684bdae533e545127c7f88855953c8f69a284e0bb2190fc715c08a4e32cb5f6d64e6d3be9edb449a7a5531c8a9a36f77a8ee34eda28e57ef8fe59ee5e73f6961702c99cd55eefa9c3373e0d73d7b8ca719d394cb9136cd35c49b471b7d72c672d77bb71da6739daf566efbacce4c9effb6e770bea903d72a14dc665dfd7894c9dac36fc914db7131c3de68ee3344dcbce5dd2b37b83c4ddeb6e3df07e3814619bf6ba73b7bb373ecc7157f36c9ac33e7e009196069ab76d17512cdbcff4774578b30dfe7b87b189a216f7681bd2bc61edde64f086417253d228c3dad4186b1c961e47f4deadb2ebd63fd87ff8068edea3f5bebd36959c0fdb1b9fb4f749c3372cb5d76ebbcff2287e05efe11ee06ddf90721ee79d50d268e4f5d6dbd6ed7d1bf5d6bd511c1beb9e7dc320b96d08247b07ad873b7a20f9fb4c77789b280f7cf70f6313e5dd7bf779d47adf4bd2edfb3cba7db4f33c9499eebede28d5b6cdebee9dd2eddaefdeb0946a1dd5a6b6d13e958f2d1f6fc1d0df39cd0b92696d8be93bea7d97dcbd5b9a17cf8536f3f346948eecebedb52e37ca9d62fa10f743fda9fb0e949fbe43e529b7f76e48b377eaf0a7f23d05d7efd486dde3f70bb4debd4b6b101fbc537cea4ecfbdd60e9f72a0fc741a144ca375df431a3dd605c9b5b35564b75b7ac38aed462da5d45afa7978d451da7d1ea51ca59bd5a4773311a5d7d2c7a3ece88f6ed6729f9974fbe928df7142d9918225f8a8a23693bb386b6d7c7d77b96bf6ca0e7ff5745b7fba33fd598cbbaddeb54fedc41dfcc87e23909bd67ea6439b69efccc2bba1c69dba7fb728f7f41a84e68463a3fcbbddcd91627f7a6bd7c65d8dcbc20c64edf494d39c3c1a149c929e6ac319b50182591a24bf344fa8d0dcd5b0de369bfd13b5bd5eee9e69db7ec8b09da82d7236d43b098d28c64a1ae91193747bf60377efd96bd753876f70d8c391defb7743eef16ddf1eaeb7eaf71f3ed4537cb2a7f7bedd933df72db3f806777a79db876da8e5e11ea25bdca3f4ed3393bb9496b651a4a40a8259b6d18df39e7d0343d9768fc361dd6a287ba8de1f39d4358cc966fa0478b8628ab9eef7ae7613b5a139f49885425b88f36e2fc7891eefdd74b14e79f8a10dcd75bbc6dd1ee063ce32108719c8e049f76e77431eb9b321eea6100e79944e4a38fc91edbf874c3814dd8b273547ebb32c3bf8ed8a0ede1ba21fd9e3eed9789b6d34ecb7cbfdb8c16d59e761198e1385c30cd02c7328c3a1cf4c798ae3478e8f41fcb0a4f949f1d988c9d7f7e9d58ae5f0d73729babeebf2baaeeb3c7c5dc44d527a123d985db71dd2932befdde34a7ea661bccbdb6818ee339d92ef6e4da77870d8466c628a4159ca08b4e19015b6626ca27866628c266dd22ba48dd094c5b044aed6afc6a185758e8480340c860384a988cde9db68982cd8503ee1c08ee1207285fd66c523ca707986308f4ecd03e9d4bc69e60cb1c252175fb0615cd2d6112bc051a2042272e844d949a58ff53a64be504bbb8f9462be08315fb29989f326a6200b64976098b526535c92b5deb488fd0822c2480f84423f3a4513c0c5a01f5186cbf4fa44a04e94b1995e2a1165ae402f8970090399864c1fca3164fa5076215329852ca74842a65c963ac814479fa892a9f5b09deb126fd7bc3f36943a2af43b3586c416fafb043b846297f499424829268afee8a09a3cc844a9a53a211d580b63132575e4a9951b1882944c21043948304308da27b70fd044054d54c7051b4aa06eaeaf4929e62402a353856c222ccd3e5186abc2a2204e27664e9461c9fdd93d6530719d3913d55fc9819539081334dcb507d98e8368b72692b9c444293175e6763bae260f620b1aacfcb952d83851f28a896a30581994fb73620924a1882d7d202020a03ec6e44661dbe78a4109a494b25b36edee96e10e748724ace1880db15c84d6311912369446480dc417cb23c8f4024654c7c49656c2368e4e755eb9810d634c0d13638d189638606b20a22e53080af632c1cae7d0215afc0e98e4013be325cfcf2000888619000160dca0ba005a1ee3383cf5500eb18e43df7ed8f8882d3387088a066c3873a65c71df68e623ca649f8fc9e1f34088ac8cb758394bca63343d4610dfc5637f8fb1616450a772b827ed3a3cae64dc93864f3964dce53a72b80e39dc25870bb1e1321e5777795c692ff029870e77b90e1deee2722101b80e38764ac33a5caec375c0425077390521b3f65006659f993208c705c6f8c696f95f20266a3e07193776aa050e51319d9a2c388c91658c1cca1d142a0587bf099770682d883fdce1cc0396c31b96475c1061b55010190efb584e177ca8b0c72bb30a071c7050a954383cae04704f9dbaa7c6a71ca994000420800bb1e1a947ec12464b4b0b0cd461a00ee34202f096c7d50df7249fc3e32ac63d497cca11e332aee386e7808500e0375c0616c2040d007ec385d8f0183711a0c88c1d260a35800be3dae8d4fc0d57755b6e8c8bc3cd38dcb852ddb88a71e3ea861b572d37ae60dcb8ba6ecc03a83153b7621bc6c400f4c53200ae0dd7c5ec7a9eb042cf135638810f0c0cc330152a8cb1d1c34f8c12248001a358ec819d748a9e3040a6101335491e2801b69a31cadcc0fb94353632c6943f0d037e8a5aca020cf96a7b289bc8f31207d200db470fe5111964c5555d49ae069781c4969969c17af77bbd46c05bd7c8106c057ebb427440b5fa3ec4aec003a1848a9f6c3373c5272c6f39c87ca9a71cdbed4fa1930e4ff4791e0d730a611ddbedb7db875227f450e684b045c2d67b8b74f7547fb3e2eea9e209d07057756abec34150d8e3805cc38a09eb71b53d443d5b6df71e9aac0d441932e4c981f842447cc9260b268e9c6123a708220c378fc8b3a661e28a1447b2c995a27bade65db9d3a91bc496f9eb4a2457267165114964a2e63c42c3b29133e4084a105b72e8ca5c8361d95a12a2c2528cc3c6445d2558f9309b1a0c8a80c4bbf6ffdc4a7c7a1082247890a80286945236866158cba6dd2d553ba07aa28ffccf44c5989999989923e4e4d0443125f24420030e7549b17a58d775cd5f3c72c7eb560f375986cfd20b368c3e34354772297354a2842a72d330810d314a4513ba20a2020c83a80917801f20428250980daaa0e9a805d49452411c74c5c1c1c189a886b1d13895cab91a89c086126789d9b4e79c162a478e20c6e80b4b1c598279491c216cf8bf982d67cf77b71665a62414d8a9c4199ee059459410d8b9842a46a0b3924300421474565189108ec0596975a3777ae0034728b2babaf0269f6e5839cc40c630264a7e07497a70566d25923f471ffa5b3fc1d573f55cb5d65a6bad97cfce5cd26dcd25b5a7f6486176b7a58a735e2eb55eb556975a65b89c40c7d2c9eda3840db71c755a4746ebb44ef5913b5902c9242a974deec82676e4ce04ca5d8449c4c2049a4016106850ae3ad3886d64a241330434880659249e39ada83ca8a1cd933ba886a7791ed03ccd9306ec48c67ea8851db17ab6755380381ab3bbad6e7aeb5eef3bdb6a2b05a84522c8735a279d2b03d9c2575b97b6e0a433516dd5478aa38c98b47a685c92650e8fb8e4013c2a0f2be877af29b6cc6b328a177cc0a7872592f8acb4ee001337f05969549ec00849f05969b5e7a70547569ae5042c663064a55d5bcf112772561ab60149c1b3d2b0adde134d0d129940e4089e55454d948cd911988004243b44622044d5348a61d8abc51e0a65c65e6f45f7fb41cb189edb7ca83ececc8a6d990b43f7369bd1639ac5a4155c8dcad19076648a17ddce46928c5d912790b442c6980f61184603bbee0eac0402ca92abd41a4111180cc13ccc091802e8ad6953656b94a996dd588f6d974e1486d5502814ba7693af4b2e4e1476b2b01d65d942a0efeef3406fccd7e79b9614b8ac895dd69453f6b02c7cbaf1d97362cbb22c8c7aa19a2fd3b22ccb0aaf8ba27f81cd2dcfda018cca4a9bd2534a69a5b23695b9be6fadb5ce1ad82badb4d25a2b0cb6a2d9a78956276dd95d67d3ee39273eddb8c2be2c8cfe4d9b36a530daaa1f9bca6682165f8419a5216d02413fe9a7920833833a456fd109058c760eae4b42b752a0dc9f411d6d6d7a051b5e38b92b9389eaba24b6583d9dea3fd7ead3934319106c587d8e4c597daa143f5950cb8699ab89335f84c064bd62a6ba02a9c0ca26dd6448ee954ca9414d727f0275aa59a2b0a16c02947b7234b02c9bcc972c70e68bfcb5a467db208727d8303619126402992ff4dd6f988a598093a392152891c3d81395a8e08a091357f3a1b5d1b9c646c300d17303096c189bf467a6cc01d23038ab6e15489181f851d3ef1f551d42a8923a3c35353535353535353a74e8d0515353535353a343870e1d3a746056a5d9d1a91361d69af00e150cc334b15335db6aad12c73376fb7d1688873db1a7fba14caa4e81a3930eb2a87ce5a39b43e58461262ae4a715dee4ec212b6485db0f1277214da35aadb5fe264b59bf6119f2862ed946c3ad6eb20cccd95e10dd90268baec53967ca34cddb9626839fe91f7b4513a5eb94bf5e1a581819c60c7dc0f0ace63616154a555cb0bc45fccc2469dcb56ea41c05ff403ab7e3bb218cfc7ddff77ddc51fe5d7b7139eb9e4e180573971edf1e46b724fadda2f42b2cd7acedbb28f8a44bce87ef28f8548f727bd23dd57b2761584a4a4acaa9621a1bfe22936e714893519e82439a9c72edc5a9742747a3f4931394d3afd3c9c9bbaee34eb89393128e13757f724d076fc82393aec9cd0613a613755fdcb89ae97b4f9484618c4e718fd12deeb18272c38a7dc0f856e88a0b96d7d3b75061c1a1cc2a57b1d7ac8ab5a00f16ab60dc8df644a09d74eb0257fd66e572c36962fc86cbdf80c3553808ea383c48001ee3372b19f7242fe337ab1c6e8e1bae3acd0d575d5ea5ba0c1c0400573d880dbfe13738a860c4b8a1c58a2013c523771afb25777cb082dc30bfcafb53672a315fb61e1934711ae6f44e61d189325c6619819d79f495539ffebd61b0563daade84ca4c54131657465ae982275dd19da09b8e8e4e5ca5c4d549461d2327df3c651fddf4947bcab08ed14d271d2b4ff9ca532eef094bee58197c7a2ec98e53ee12ecfc699fb9a46156c209c40903e28a470d5e7918814ee4e36af430fed8187de561ecc98d250f228c5e4294913bb12507730711e6e43d97903170d00521c288c087272b57f248cec8c953ae3c5d693252fae476581c9c21fd8e28ebbf574c599749b4f46918d23b943ff2d3a7979033641216b7b85e4c5967b12e77a24c8bd8622d911b473c7ba6ce9da73b713ad54fb9132574d3a87f72a576a513dd133b05fad0c82e87b49cd149e4feaa74e38a74e36a74e30abc713564a56558eec49639244485c5b0c4012277e2e6dd78d343a2c51761c5e9e6e9d69945bc775c983af3257a98c5a2a9105b0a39c345c628437c41437ce9236223117b07b17d109f105f342a2219e48cedfd1e4394e1de2d3a0bd974c58b1332cb3b0849e40c1a19830511a6a65344fa501841471379896cc402b1a53fd7106180c89cb9634413816147c4549f67e6d24397f4eb82b7aee8d45ef2ecec441996fce5fe7c22a50925a223cad01314f9294293d026624b9feea89cbb31b69cde82e5ca23220c7d424c519f4e5135649ac54579764dff9158fcfc5891a3613ab9d65ba649148c541a5deb596777727a826e42a49b944824d98488dc44a0373a6dc22b92441699454091682659913c512672356acfd979a73b0d439774aa0a3983662163ace02574872ed9c9134f21f7357be71222aaffdd898488f291319634cc8c22a65a362137cd625291db9b40b1a53f9f0841c1ca1e9eef4b1a66a3594cda853c0aa91ae47da88fcc51395d79651228a66b335140666a1ee7e7e4fa285d1ca4db0316728604628cd9303444be9025164d64938804223662cb3c7861c8ef456c51cdd4fc8c99491a8bd8d2e76e8f21b6f4b7db6490319e1051fdec3615b1a910532e72464bf1e284dcef20c4543f0ba62b4c468022a67710db07b19188a8be75fb8888eaeb6822d3c8199d8405d146ce6822b7409f202ff1851cce1d34c4598688eab7b8f3e72ec9730d3175c41772bf81763ad56f2372bf89c8fd9d9db91345c5595983145738d13384123d4284a1064e044d9c23e008e28c789f997693b10a9ad812438018bb042b63da0c7194fbbac194410b42ad71b307c7449d64287778b7a7e9fe5dfef3b0e9662531695d550c8aa14924cf1c2c3bc2863268c917ecc4456822163f57f830a9a24891bec4b00c8aab89716856c8162a08c68499420499a4496654c3c8d5270e0cbc3083b4287a767777239948827690c8254c41f2874221c2483004fd04fdfc502c836415f45dfb72466155da54042919423e620a9f385f26206f83e509d8d82c7d105bfa920731c684913b9bcd0f28acf56a447bc368414131413287f1c746187d76421782854e8f248b7c801c95d820284b4e869e5d8876ec4242cf4e7368c7ae23f4ec9403bb761dd835eda1ec210d9be46dc8277cc427b2fc4c1256eed022cb5f3631280605d13c658eb56a1017689d97143a4a7c8ee8d66182c57efdc77cc18c881a4684636a9a0830b84294a1292da74882fc81d40167a36144efc7663981053fba10d149affff9a9a9694084912d883f3a37b042981042bae8f5a7799ad1c1d3902e7ae44e13e718611007618206bce83a48d8060e0262535c31a1cdcc17d90f0390e56d8833a40a628c3e6647a4cbbf8832f4f2a4fec804da9823d8981d6acc6067cd34733eb4c8da8fb78ef4a4adb15d5e9e6e5ce217b1e593f235629638a4f9b352fbd4dedd6f363314ea50167746091595914e8e99b19161a973d56031ac424dd4d502454d1d6f762fc8c15982176ee0830023da6d4c549f6a60c3c86363c665c26857990608f20307a771e41ef33e54f9d2b02f582c54354723b47d08eeb153563643eb4395352c6b59166ca4481c59e28989ead9d34f744ff360938707db393251488e44196ed607f1aa77337faad66bc534df411ce47b909b5588cad67462727227b6f4e3ec79e4889c3187e496526b91687411e95e0983251c4464799774633ad5a3eb7913d38c46d6da8b623ef06a7434127d640a32ba27bf5b9ff634e02df80f07b1074728d14d28d3e88ab0195baae4ce13d4fd79c57ce18932a1dcda73b6b68d63aa8285827c820aa89f9bb9e9c3710f4598c9d3a966429e3b1665b673aaccf950a5f05899b54f80f61139033322cf6f9916ac7422893cbf5db3b6d8309e05bfef8237766f573e617907af63748b858c22f81dbc8eef2016c2040de9e085c44e7d3ac07fffb01012963dab4943ca9f3cb17c42c3fa137d9f083cf7378c45babd90d2c15ba4dbd3906e71e920b60d630fdea29cc803ef8db090efa35b17f54b570eb10dde3b0de85d748969be8fb010fb9177d169bc8b70ec14f8efa11c228b8097c6298777f034de413c318dfd085f744ff3403ad51360405c7d380810f866f5b8b28f40a25be3ddcad8192957ce876885acb5d44f9e7a2ae4fe09a70f0ff3dcb7abcd356459a3bb7c8dce872a6fdbb34b6dd2d0b013b7cb5f903b3b4d828096fcf8c81596f1e4892d54d81096488e4c54b73c92fb579ddb4ce9014e963b71623151f44d66d0bc42c76727f3c1ce8e8f4f94b93f55e820622193cc9c91800a9c30740089945276cba6ddddd285ba58392af14952440335c6ce52e4f0b109108ddd48f639e79c73ce89a53c92e7e90d6dae4c7ffdba82f0ba2f735e71e412ec2573a80ce51902a28930f597e71ab2c441c835e41313d8d02501d488f6992977e6cbd430dd7246392a392f68864fb28fd91158ab4a9e248c01a358b52eed9a9846bb8957d42bb6a0601cb1e13699ac0d7d62d544c584aaec32511d635355a1abc246faaa186ddb3ab3b6b7296742b034dfd0acd6758955666aab1709565e073c2d833e7264a29640f54347e20c2901349b0911466aa18166048a2d68b0611fc97d7aa49768249d2476f7916f8fab1cddb7ebe8be5d88761d9c90ed9926638c38fc68ecec9eb28796cb30131ba23cd61128a04082fe749289a2bd83a491ec20a1d612b1859a7e620b7d88084b7f58320dbd4c2189f4ed2c456ca1a71963622d1c62cd23c40ca080a20a3aa0a2044248a1831c244890f8f4b060618dd0914148924c89058e13990faccca14492f9c0ce1c4a2448649034431259be590645999bfb210f6820f73128260a934155d8cbe201425225164d8276ac8462a2ba39196465108c9e257a7a7a7a321250613be7f280165f348f5944eacc588247a684953953c26648d896417c8999a8b89a1151fdda84c7090b6c189b0c6131c1ac41c87a6b96481aeb03e9543f74b1192d83886aab890ad5c407045fa062b0d288c61796437070e490a6e8a8740d97b4450b158d0000000083140000180c0a874342b170409ce7e2201f14000d8ba64a7e4c18c9a32087510819440c21860000000019001860b48d00628607bdae1afb40ffb997e327352707c5c08a31b0c6489061496de9c085263ce1ee420974353c2c846dddaa2970138d3b18366d0fbc58a44e6f2755c2a99ec67717316a3968f5c2933e9d4a07a9509afff7b4d8c0072a1b06556ee68ca99b16357f77514715f4bfcec3981594865e7c74ef684e03124c027f2215aada7ad1c71c1d48158e77b03cd4fc2c5f47fca94f3a3b503a6f068dc3a14d770f61384a75e19e8350a5c96202734b3c1e23cd2563cc4858b4615c368ac40e99074db6073aff19db91e526668a4a7072c223bd6307be64872dc40879a83d1ef899ce4bfb6b618c07a9be7434516b19268ca6a26f768c7541a9fac9b1395b16992975874c8297f399d93b2bc8546075c5dbb88b3094877b48c6ce5ebea85d175ac86f32b60086657cb4dcd95ba2c0381608813623b9345baa6bd30eb626d18c83cbb42ec939fb0fc90d535306a2a58205c5c511a1a5091ca9ab75e852704458f038fae6d9bf35f610fee3ae4ea846008f79f9c09d96d92200c10fc09486385854f58036b3fb8e650b2e1ed5cad70fd2614b82dbc82c225195a5c037425d75298ec532e34b3dac180fb07c17d37d9907ced04282a239fb43ab9e2727a1fd3026154f51b048ac9ef95c035f76782d4c597402d3a9d849ae540749b0f83a42a8d6d90c57e6d61464600f2a1f95574651e19dcef569e2995595c1efee95463d23adb4e1dc57d1a2de6e3917041a4677841e0d66b28ba49bc5175b51c8543c4b9f85fe166ed878dea8ab12655e8557bcb1afac9ea702558d69e64262721add1b9c861405efbf33ff7f7cd13d4cfeb2c795ac646914ad58a8ccfb8d15c581c7a7d40f073cfec2318cba85327ba13f730c068da5b202a9aaedfd3268591242487227c417d30b10c7591f0ac52c27b329bf3c217d124c148ae91b67433e3bc51c1ed8744d2289ab68817f53249a9e0e9ac40a71fd9266f51df2eee8a13697d6c8a226179a17e5640b9319b345329d930945838988a6d2b1c567ec232cec72f6ac0c7b9341589517e5ae624c635207b53de01dee30683cff6824f9fd8cb44cc91d345bed990a0c8dc0dd2545aece2162ac058f5990a5906c64d92d397ac8303eb0409117a34282b1c09f12035caa5027c31cfcc875681038f0e955ea9954fa93db312722d52529df8292fbf3ffac215e7c5615f635306ccabe11c97c65045162946e63c9057a3898b4e1b6782efa7c93a4ec95be695438ab73b740398d623f8d223a59820819336974526c021c28877a57bd7797f39353d1fff4350d8e1cae2164946f6acf09304d23b83869f0d0486503b7be90e812aecb82af5ca668363cd0a569900275cfce2ab009d49336b63c6a101e24932b70b82e239e16bfb2795cf7261e54dc7b53e49cced8d0e171a252640fcef3768e04be57755ddf9627e0143dcf5d536e1254271380209a0b18a602e8cf3f9c4d1efe12272acd42c954ed60825dca15a191e53d4a3a7385ba96ff26766a173d0794cc660df0fe26156fc029fab5ccb1262bedae6bde670e071cc74896c7f38fac9d5682547ace9172d764fed0504e834d9629ca27d0201d5c920e42c882c6485eba7d9224c6940e44220959dabb4a007a6eafea42f4b7b83cbf27bfc8705919388248198133531ffadcdcbcd56f9abc1822647196122029a7be49bc44c70f27d12df41546118e97af53939bf11e1cebe8340b1782d65e3b5875633abf152357bd10787073e6740d6ec3974ff5b4e4dc5fbab4a08ad7b963ee6b44f8f9e2fab6e2a120ac1ee66b8079d50d8bbeecea329d7f8f4cb4abcc816d77d9a3a407f0c786f636303394212d41cb90aab2a242cbebac4f6fb8b68f862c64f8995485fb4d4c566c09c6c928cbf6f4f4f775522e4f0671122003f418dfadeb5849d0ce0d775d16b852b500ceea511325f59d408aac02c3eaa75fdcd034ee001821539ffc9d73c79918ed6f981176616bd19494521bdc5834977e4466b16a8493e390eb3dfc251ff5ba78d2f1fed70467b114f50dfeb7969c8561238d03f4af733406d58a33b385cdba9062060e76790c65d4e4a652e92536c0249c3bbdf6cf9bcfbeb8a2317257cf0f0bf72bf651548189d29d586198623adbdb8329db4b4102da44fc92c9101fa8d40734f338817a3873031052d18e4e31cc6ed614822e4ee1fd7330e85259e1f6bbc3a49d534e4ab8b95882641385884e24e4cbf0f57a1551935c6c313910e4d24d957e54cd17522035c54238519f022732cf265b1fdbba166561e8f75912cc26d2389e762fc476b5eba6aaefb2cc6d87fb7742ab16807a8024882462a0b81f5f003e853a8af3760165530ca366954ac30601bb138321b6091c7ab1771b82736818a41113157ac72e446cdc877a21884d9e049dcf0a1c8ec227d75518a4baf78bfe9c60c8a51da32312b2bd00247b101c3a0c83b8677373f1b5cb4c527dce9df333139d690971ba4d263c570d21d7e14e22f70ad95a12d3710215d0c4ee0bcd3f475c2aa0550934d93feafd5052ab294d3885f34e0a33c1aff9f8442fcde8b8288da1144f2dc59cbd148f0ec47199e49684cc99fbf0f9d34cb47e86d0b42124188a2a9608fc1412ea4dfdcaad5a170a62428036542499f762a7368ea7b4ef9929636000e27ab13cde83b4c686b35f60d700d9b92b8c81684a068730b64dc00007587f7651d9316341b6707be0d78ca87c031bc46f60ff0a6a3feb8fb1b15d0a8b3024a0c20cfa818ffd458f5f386dd84e71df6b8561f86bfa9162384394a0fa5191dad7fa402ceb7eaee813d7e708a166012100651a13c761f4fa95355414d5b00e99116730ed2ec688d398b195c8691212905c3604e4b3fc171aa9098f86281bb1f2fcc8b79bbeb33a876a292bd1615ffe92f6875e6bd4e92e30350bdb859a6a6c30ed5ba14932b74540e29e3393735ca1805634b22e24f749396948c614e402f7221eb8341db72904d642b8e90f9d81b4c19e7dc8c6b9044f37755eaf65836cb796b7d5b2f7a57e79e95bbf458694503e43010ecb7e15194e2e5e8abc69d410e9bdeb47da050e3cfebed7bb28d6a0eda9dab852211e3f1c8aa61d4a6b87ecc2c0cc3d96200e086cb06a057355030262593a3aa3aaf06dcc05c091e4115da068d87211e456e48e8670f61537cffda54792aaa078bdb8a58f804948875811c155f0c5c6bf021162b14b78f017ac709d942374e81675084201990bc04711fa700eae9bb4139622beb02511e0368077aeed34718113eebaf255c0cd9e84897a0216f8f0d80439c42ce08b641eb4609550c1a8dc839c583a72b46c259c364135cbf95519ba2e6c07bb1126cdebd02c29e35c413bc09f3d2ab7192bd49dd8322d8c41e4246273c63db828c8c4a871590115d0c47233742654423fc0565dd3f745f59ad2800020eba82f74049a69fbd2ae31f4719b8744594a360c7053e621819262fee971119ecaee6417c5a2e40c984f8ba0511ce55283841a48ffdadde6034f69a0481da5356d607128adf1239e86c8060ae2ff24a230a3cf6869e0c7a1dacf47a5d7b523542d17349c9f5512b4ed8d9273d23684e6c953651c35a4aec9ad9d232fb29ec33f26213e242950131f49b21870cf5d13e943f498db245856e3e20631ef9e438027d07f35b8f216871591b2498410ff4cc5c2a49fd6cf44928ecd20a970d1716e4e060066dbe4465c5475512cac110eaa9ccaee36bcce727f7571b18b702ffcbf630e2d839008d363dbbb8c04113077513cfb21d616b9e8a57975615e217b90194a05f6e20959125dcc43562ac889ef8f15d87f61d35acbce8484a008f1b3addbec08bafcf7c5252c390ea0102a4d8ad9286f1c33b23890c77628a1f1ede59e88e41df705e8c7800435e2a33026f0c481eb8fe318112365407d4361c47c2fbc6afc9ff2a0eab5312528a3a090eb894341c9e9a56c496620f617703bd1dcd92d05b2eafc65caabc42ce362a121fd3c8fbe59c3263abf8dd979c0a25ae772e1bfb55a153566093f4dede7ecceeb347b07d90ffa5c990a1226ef0398666faea318efe3bed2be149e85db476684276718c4247e04f7970af61adecefbf5d971c639af891e5e079eb98e8e3eb27a8d1f540e37fb815a27205661236db8425d2c749e1a7fb1edad2cd9a9ce07ef05633e0be4c8018196f2f738e1f1db99e8a3f21655858e9309016c50007f9f38593bb32b81286d4ee4771a64bbc1b59e259b467a845383acd5d51a285d68e63e56ad0c58c1819459aca1af798c53cf05bf7bbea429fb01759ecf44521394c9f69b1c1edab754c8f752eb80942976c1f2ab15ba9f956d347d036d9fe6b1674dadfdf48c127bb2807d227612c209d8c370eb07c5297abfb93d671c7969004f132f4c01a378483b45fbe74bc9dede740bbc3a04be43c19e2f6baa03f662661e28360803f26592a234abb6c8852f19dbb10db288c75f89ced5494a66da9eb9e44d4bfde85244d64702f1182a9b867d22b0cd8690b37ecc1ea0532650ffcc3a03556e49cb0ebd03d5851b10fa199244231dff624088c4a9f6d8f622b14646a672e4c6fba9ea28bb27e6734922b49398f15d37ec9b6ef7f94916abb4df63e5c802d0ef67289a5d157aab46832c5f281bebba26b1228b94baf9bf8f8240c3088c86c6f089da104c7106f78a3d13aa6918e5811cc74508c82ee0b472d6e55421d64ac22350535c4465ee37cb3d1d062ad3bd5e960ccfd89905b62684f9f063c239536c8f370964f866e7715ad2dde7f03729dfb203a4849d3320dfe406bada3363f2fe0e9de3d9a1928d06932471682d598db0abd0e28bff96ffa41b966c8b162e335c1ffafe241bedbdcaceee3f695c9bfe9381f35cac15b0c38a578a0da2760fbf93f4eabd2d1ed969caa04709f57dc274de1b35120e30cc68825660a31e2a5134f749b2c25fa4273d21a51c7a8aec8987a9780c1a4c69440a37745bf360220bd646fd06a710c3f9be977b793ed9a10a89372cfcbca3175001505b4f2dfdb4dd6c00fdfc623299202b95e1492935e4eef5241c75919cbe1d62ef7d49dcd22beda0da22c26db1a98c3250207254f40e2ca469788abe28e60541c6219357e7cb6058521b352756f68d28c883f70310fd94e01178ca2925848cc952f7b55fe3f5b2e00592b4a3e900032d46d1bbd40262c05a78ba3619e26aed24bc4b681ff97e0515e909e26fbb8270a4c9d97829df39d22f1036834d31a7b06a9a398f6018cca5a04df981a30ebc332ee016527a101bf9f537ac8ef50cb5bdf83d409fb1a96d72608da24b9993687560c33879029266a53b397bd6621856e510280ae19da8dffb1da775a51857979aee9c1b2812f7287873e8fe6b8fb3f95dbb15d233a1f3ed0a818ff671c3a395ffd9f954674800c3af45f2d94b8443dcc1f3104766083b71082aeef22f40e8abab5208af1f79ebcc19fb841b0f3c0ebe5ca636a3edf111e79404ff15cdb62c9cfc5a3d39d76d5f8297a13fc11d8da2e40ddacdb6f4ec0b52bcf098d0b544405b1b243131c23c0d48e9fc7e7c5febaa2a2875a8e5c421045d6dadf5b904944468f5a0fa93a71b5c41dad3fe19fda92723bb4dbd86e4f7f3429e66fb326470daa4d047c3eb23c1abdeb3bf91a16b67e0fe3ec023f76fc99c329c2ba05d75812b313250beb0c05a049c04dd74f9222db0bc29c14a2fddf76a60012114f913498285289cf7f96149c1e66bf8ec66201a80ba7b479d478ac6fe18aeaeb96a692bf36547c78ba32e97f59eb52fdcdc7f1cbfcd9677cb896fac05b718cdd3492336468dac9da2705b63d08ebb5cc8a9e52983358621c5c3ab6701d80e7480fb10966b6a3624d1a1bf94f7862477df7abf62af5965f984398216d8f4930e3c6160c0b9c9bbb771c5306be56a5a10b07973207dbb42afdca03c045241077a37151104085067f980f54cc70544b16187d45231a718018fc8131182f3c429908e426e7b8ead2439d1d4761b4d516dc89a71b6cee25ca89b3083944b19268bb4b51a2c3d49c020d9b1d1592297553a38cca8644e2231983fc526bd7f9a15cb36888f5f08a6a8e21df4c959b1f6b6784d8dbf7479821c47c27917dd804b79cfc96986ec1df61b8bd04d7637ab6b39469a773acce47ac4d34f072c54466c978692a1e3c85a7975f90fbba33cc38b257638f1069cca3b47ca15406fba6af7e8ed127de7f3074331f232fdb18f12a86e29e7f86ed692c710c6ff74e07ee390268572264eb0df42e504801827821136c2c20b0cd670e9e92b5fb730ecf6c6abe183253916875f1c37c40f035befa1050afda8adb3fc28458aa113810f2922229e229f08c299d4a8a8ce0ce1866d1a0dcfe7bb27f21acf24c43033d295ea8fa097b94c83f3816eb19045e6b1b39ea906d251993d53d55480db661563b1ec6b0cb36d03e55a016cdb89292da34e08e179e2eb28818d95ef5b881cd035c3dc559934b9d8bafe4bde69b865cbd9be2ad4ca7fb234274d95a2b7325618d106e54d8b4ee736132f0e0854727c15be2794b37c0414a54d89e60cda5c7189f213a28025646c555f2640759771a6526538db1c2a41c3f95e6e231ec59e6e0c64a3f9d590bd703af29e7546f8c8a4d680e8bc4a756e0557bd719aa0a885a4583d9b1653f6e01fc9e65b225c12333a3709809e431f8327cca9efb862253c64ca2683773eb78eaacfc1c07bbf07cb0b987f0bd82f2ae3ed7ccd3493b4151d7748fb640b8998478008edc8ea9c746ffa54703f235349a9f040e6866b1989113d064d0bafea15a88625ea7d09c923a8940b74944c73bbbdc9ca18a3ce4ca53102436e24a8bdbcbf7e2b9ebe3a9db201bacfee7a7fc532af8e73a1d7f5917f63b52bf9c36cb5da2c5f4c8d90218b390ad98579f7f661c2afc818015eefd707c9386629e8f4147ceef50e4a4a9de77a574980947bd891146c0f88fb6636c1025c3491ad48395fc1104b4f819124354c26347a5b03230cf0c0eaf54269bfbfbc7cf3ec23480a6a9909c1727db3c0392993c332c9efef8565624840dfcdfef80681c5d803009cd2abc50e0d33a5c120ef1b93ae73756945ecc203967f25598a90c845c2049f5fb8da3bb952187946c820faaa7bdd84f24bcf7d6b3cb630d2302aaf334651025875b762363f3f0d896c0fa43bca885c1725411b32619c47927d7cbecd6e16e4bc216bb0c6e8fd85fcbd9786abfa4fad9f0803ec11dada9a971a319c17e5f4266ac96251ee9a30beb28ce8d6cdfbf7c25596a48ed12112499580306b3425989eb52ac3439b96916467af337b6d6831de854af6e81884c80e187b9975ae6ad9cb9779fb310ffe17c9b2efdca7a835cc3532883e36c444b9909910108a65e033abbb7b050431f5ce27049108b97f4a3d8b5efe5e2fdaaf340429b8e4c548468f1bb312b12832c1b8dae39db1a438b51bb4ef492594664aee7e694c278b8a7b77de51fabd9fd938265dd22289ad49c5d340939f9e950a7e0d14473c7448eb6bc8ad2131223cdce37689592259ed4e6dd0e32e8a6344f88928ff66a1f5136c9c4b980693be0de0af7fa5cb0919523d55078a17eb8efe8f6b5b1965d35f5ef237eb8e46e2336cd437c57c892393259f241705b7bee0dca7b7a80cd073ae8aaea5d8a6dc89dde5109be94a2ed11b35b4d8cda6f8d61c055492e92517aaaec534ed527c0fefb482c8a2288de0330d6ea5094ad2838aede9c554859fa0c22623d18fd120166e49ecf970e63a1357ef70a7c830a8ca64cba4009d94639b29e6c95e3925f522bcac6b91b4d5ca75ed383f4dfb5063cb3bef9ca551454c044d29f618100a7ec1a78ab22582ee6472829230fbfde79cd54fbe284d893b5e5e2742b60f43b91528f91a1da137d64a4a9585be30b30e8f77eb1be799d8097a8990c6ec04c9d6f7f1f99e8678cc4f21a26f519aa3c3a16091fb9470f882a95957ef828c85c6415925cdb80b4b08b706e25dfacac1748d2cf3d77f96db445be5aacfd4ca5e755606e2601f042c45787794452f91d7a91bb4f4c5e42861d542b75ec6a10017436a247dcaaffaf751cc0389bbe19a40991c3c33ae166f0617d0ee1a013c49d5c4159f1f068f1456acbf894413f8330b027bc5845d93c84a5666e2943cd39b0f4dca5e87e38cbc53aa5e904d6ef70bb21f0b6b2b3244161b990d808a66826d04eb60f50da8d071d7f47e4a5c3fd2d9f7b4e1e0d8c0bf8a96dd7bf4b0d6c10ec1fd0aa18f524d97939b2749e4be3edd4a603afbd8be4312467102d1c5ef0f2107d514bfe681f5d5b64702bf0d4aa00643d1e13b30512ab8e61400949639ce12063e6dd402666e3ec437a24aae3e864835d4fc6fb38542625f60d5ab26bda6d1806e4b70f85b872819906c3a43f5a23c084962958adfdc1eb9a84ac70d4ad690306ac0c33ca56a76d1bad5bae88feec72256ce13578550e1a6b895ad964073ea0c2d571aced296e48c92e1fb358af3f810656a0da77c47a681eabe1c36069b4c7b0299b0faef33ff828eb1761f7f75e2a9cfe921d882ee73d262050d383335e924e0588ec6265f1b380b7b3957ef0c9ba0af2a51729a0d16484c9263d7c2a8e960707416ace6a1f31450c8263c3531beb2ceade9f05737180cc2723685368ae1302cd054111ad9e82bfb0ac0054c1946e81c720c8f83345d749d29562debdc520d595dff094aecaa3b71307017e3665c50f5044747a4116feeb6af777ac391d60735d04739d6b6ffe42fe970f01aedf0d308d965cd4bcae1083d6b1fe7428e8fe6e6003702571e299da69044f30f6547cc7565be556c517e9680ad87fbd339b48bdd93afa66873ca2f0e3355801d64d7659a050b7704fe37acbb43a237bafa8f573facad95cd93aeb74e850ef383f866db75ea8672014e23d2a1f217e984d2e8c1ccf85dfcd9837ad3143d3931867fd56d91f118d5888c04267a79cc408890d8739bafd490bc3021d5738497ebb59952fb28d18627692b51125a36858dd7f121ba7b8e2533fc70e9959c0188057b24c853c5597cbc484fcc741d16d30d35a69abf55471ec44cef6a7c28e04134105488fa66a503d20253310828d89aedd00137d1c24a6b311603104696dfce1ab0d69729d676acc8613b8c2e718e601debcec66092ee4727784e94355b6701d42de6e0605d90a983c6635a74dd9027bc5f57b969863efc1f6328fbbb1c8f2f1237382bdf13c01b1a68729fddb928b73a23e579b9d60d9f6f6a13348218f7bd20819e9a9293ff7c2489e4a69f98f77b12eea61bb57df466960334794f41589fc96261f28e7cb3c807808f18adf09c4fd3e6dde7500590712400b0d3cdf905a24b1c5bcf9a63134aeb1827d71debd7cc6dab84187c7e3c379847de41a796567144b00893d94b39df68efb733746b0f8028fa83640f158ed8b40bda609cb7f53436cd55f9499a6daf7662cdcad645e721b0813e3f4bdcb57fbeee427ae10ad2e9ac1e852588cc261603e8b984f5e4e94f3e97f9d8b4f6bb44d2b0ff7e9f93468a8612a24f0da13b94874f1a0096eb23763961a99116ce80cd3cd1ffcefc8ca8b33100cdca2f4b0091a4c05800a4a60914debae28d5707451154a325447d4cdfd6eebb9488225ec69cdc962f93b7e1f952ef5c6ae8f8326df8e362d6c1ea2efffd7579681734c23b637824883943b588a757eef5de1181081c07495c7c3ac01092c0baf4d648a54adf7ae347ff9c6359c213b49a81a795f64a14400b5a8fbdca5333b80122195d96709f8c9e3042c2063c8587e3ce9fcd1c3ad0527144b2d99c95cb1966b8c2648c9c11c1a30ad7c5bc46dd168aca9d4527466b2862991613f10fc96b8b225b8bf5a0c941e0a7a47ac3b19fa0f02b888ae93c6afb0729b52c1a3bb038a8daa25b73695d8ca4a960331a65267c0c13ccfa0f234134ae8696bc7846e37c744859718411a7658fecebf6c371d1ba114dc6d7e19e92e2bc772bbcf076fefa78ed5bf916c7431490e0c49801d2eeacf3d8e9f6bbbd2673c7836c4db574eaa25fa0626b82085ebeb8721e98dada40716b49bc47c77ceb46a40c6ed8e575e75c3f96c3fc186e328050d687e57fea9586bdefb1f29b32fba775fd5f7b2bff3f5f109d243b5f45516ea67de051c45719003d14b7940c4f5ae016faeaa00e7d9cf900309370f48f76973a6d41817cee190c4377c18e37639673936e865ca289b498a64f1457e8ad064151e87ddbea0268786fb15624ff1b5027fcedb9a1c7919856653a2fcd76f5286965c6b5c284691e94edbc98fd19cb81d92b1f11f9202464084cd3a645814e0d0568396e02ca72e64709c0fe891678b2a280d78ec435b5e65cf80faf27b67b31ac960098bc9f1539f5ddd76829adc8c84f529230d97a601ff8831dadf23a927826b169b4fa450678ae6876a81b05168381c21ead4a65a8475b657e12fed4eb040ce8e4358621e61cbfd79762478f948c4c98d90867d244b10dd3dd917c844f111f683a39922a2ed0c5665b1f40c17c21c4f5e34d4ec1202892fd68cdc390336fc7635f067121eeff5894d696bb22615b9ba04b08aaae208e70056b5cfb3c7f037176951f0b42719a1871ae12635ec3faa2740cdf1022a6c7597d0d09f243a19b2320c4e4d94d6e1bde4af0e310ec4796b178af415b80ba4780f045db65a3b8484f65556d88be28624466a675d6ed55844afc335a9b6a35c14d5218257b5bdb2bb28f481e5055307a4792da78ebfa5e5bb1b8aa77c55aeb27c515ce57739dd690ed3b77348150467808aeb64dc2252d8a8cd83222b599a173363ae9f40c1a48ec84e93c0009f2acad20fbf9295d03cc597e28ccb27022f861b8e0d895b28d597ead89ad120a269cfcf71567f984c1e29071bd6e4a46f00bf793a16770f899f2c5080287495df92945972b825897c96237b2d42beffe64621e9068ea3d83d6b75930d57d40ea0fc88dd22e5d0571ad8c181ebc05d0ffd8c7aaea29eadd323c57b405ca2c5045ff53aa3b12870b42ad5af5c69376ed4c128213ae66dbd9ec3d4444fad85a7075513bd444e0f8a7250dc0a3741f2b4af687ca3251e9acea3a5687e4748f00a06e4e490e088e40ce20b732a3e7ebeafec9a6711db1fcec9333660171aab313aabd25696dbdc6443e820a5f1ae43a3a9f411b321e0ce47ed072aed688ba36cc6052fc231427974a93e83d91d25ae8d9322abfbec95a875df97fcf56bc679ac7f062584d3f244d6e28bfaaecdd78c8674e88b55c2c97730906c3ed27d1cb97a1566b9f0f00ebdaec9019df914719de311e1a98010012b04db445539417487928dda744d5a72daa1986921f625d0282e94fb8e671d8bcb76380a8d475df23d3d60e7bc83e2361d860be83427592e15864c454eafee81397d5a601ec49a5fb5e79ba18722bdfd556f7978c0afc7bd15d0b01b2c0bea72af2383dafdb9f2729b2d976b71f28e8ba86b8c6e0bac7febf26b6e2550aa2810f2efb39781981ce990dcae355caef5f80f62824cf324f901c8011b404c708997a1ae19864e3f11e050959ec6b15aca471b17fd62a46ea7625f4e1b01cbe02b3a511a185960a715306f3b6658e3fb2fec74a1da54ae2a8132977bcf40759617e3094457ad059f36a2446e1f4745ca015cec3ad6f1af4c7c899d258af398b07c484b9040e249e0ec07d0b7cc1a4a405824a1e440cec3814da7af763aa0c42854161e3979b5d74de5a4449886ff8c36e22859072351901993ca87422fe7ffe4193164b185346dd82b89a2f7ccf60237c3bc52241cf475fa2c073fd639869f07a89406f75bf97f1d6a2726f1f6e065e382f700c4b13977b02e26542bf9608668310175ed9f69ef3004ab41a3994319a9fceb397b3eded87c3942df923a102e913e92d9ade92d6e39c7a95b3de92eb6192d5d3e2a9e81df30a9b807a51a4ee4e89afef2438bd146341b5b0c21b863b821b0a6ef4c36d104ea08f9d294e93059400bc9e9fa5387ec31f9f1b81a21e331fa0b96054e9c554f867dc40223af5cba662018930334467196fa3ff599e0dab1522c9beacf43387b0cc8b34f033627e81439d3f8fa5ee3729c3f57ff6e937d0952150ef75c728b3e6d67bd9843482cf48f9aa1d004c24977b56aa024f7518ec7d283e83ba8f7e511f9c0f50baf1368d791f805f52e6b8822f98d9bf91bee8832ec104233cc007700b6cd8d8852a9efcc9ff5bc8fef8d4041207a7795af176472fb0da6aa9a85f8502b70b41c2fb70ea286a1424e1c84537da386753c3c2a96666c521defd8be2082768e90f1109e677c4c836819cc88d2ae85cf5431a0872ecba05c421d0c3ab473c0e2c0f7c63a9fc55839a70b0b93e8e51c25432ef1032f8eac30e43e3aeb7df872e8a87feb378637f7104746ba3b77e1a6b3304ce5aa88ba42d8532bf064a911589b8eb8436b988a4bcf4174a2066e714d105a6cc8ece993df3a6d91551d858603c853e88fe1ad59cb64540e0ff0cf53da6258c87e5862b8d8edd13fc1e4713fd16f2aba3bbd356af62574d3c0139fc55559a6066d908551a34bbc576e5cb688cbff6acd00cf49cbe1adb5c4397335d40b0071e247c903eacc0e4a68ca3afb62e4c4a650d775fd5e4a4dab5ee27883ddaab2a1c0b5dd7d1998270e37ffed63f220eb1c6d9915a78c5cd2b3954c3bf0bfae030874e8fa17b5bb59c141046e4c724c2e20daef4c82e1306484923990bf7185a4bb8c2ec5595accc2e99605b865ba8dd15e0891b57da8264a71ab3fc267e1a32d2054d1817993d6b596656c65eb635a8cd0c2bd255b381dd6ca1d73753f20b59178cd1bda4d6a612fa15fa6f62419f5ca5947a5f666d32d790e8d60cd064373654ad147a47f401cc37d800311dbbd2ae7dcfddd1f2f8d95de384d6efdefc55e3dfff87a111195be01a1b59166d8016ac40695e8b50e30e34f1ab02338901ae5f101f011bea97f90386dffbef87a6de33b64b6a6db42cdb134d1505cea1aba117bff7927b6d32c4d5720c8182f699c1d3cd073a68e6ceeac122c96d1eff180ece1303b0ed8c254501da78a1c2f1abebf8e9124fe81bfb08c84469c200b715eef0d7ffc7871ef4ead83eaeb961d9602769c104f6d37284f4a7a5a9cf13596bb34fde37151e8df0f21970a3be913f52fcf9fffed0943e4fc59275d2291a87cbf3e71738b359d5b7230754b68a4ce85709ebcdc98f4e6f52e66a02f01daaf1d512a416a375982d138696206c89f31568c8fad663078d804bd53f657de6c7287effff7de84aa063fbb8e646cb808da45d12384e6b84d0adef87febcf70c9891195d08d4e6bf58d1a21ae983a01ff8a0c4b1a59970aa892722f4976139dd51304fd15b291e05178d4a63ac3655845f23bcce9e1ed9eec8026ec74da1fc3cc12fdf59df342160e1829fe90286226758fdf284e4d6e286b1201e2161c1a7534bfee7885062c1960d390de077d0ac3d5895d8b43af33c4287b34e5fa7841ba73722972d566db4d9fd28276ae28c3bef3236fcb4c6c7466057fcbb73ab9b2ff250df546101e259bef6b91b9bf6fe354b45660c5b05c36bf9e78c7a9c7269cd1ffc7648b285d729240b1c183bfe36c9dd348def7b44bceaff1f1b43ba1e94878722fd1744e24097a2bd67a760ecb8f31b1d506085028f63562b716581ccce300ed36f9b87d78498bce9cc63ad17c58cc6da32bda4a63132ea3cec0de5534c770c4facdccfb73f97245a2700929129aa3e774656b18ce47f44f5ab4a89ca086265493e1f45abdce1cb727cbdfe9dcf90da5484788a7b330c3d97d01c7bb8d4e051b6a87159079599b4f04b15e7f08ca4bc7cb2128d018c2ef5ddf4517ae5f35f05bfee049eff138a9bb8a717997c62ceb77d91cb9b1f517c0a5aee084af9f7e22b586e210597d33a5d392217f97e95cbf30337dba09ff5555631668a87ece94740ed49f475b82647209a400fba51baa9e12efa475ad5a456359be11f2f9e7180a61dc9943d5ca236b5f9b4cbf7fae8be445cb1d189c310ae8275e6b24696d1ba5a9b2c12ea22bb10d80438bc79af361c4066492b3d4ee12ae3b1d03dad55f78803a395e30573ccaa678c54cc6aa92cceb5d90d5a90d4063f7794f3d111c8a413178bbe4bdec5937e668268f2b3dc8fd5065313795b6a25167e3aec9de7c9bd1d1b10b817bc2c34c375fc71f479d3051bf6b562e013f9b0f99c2f67a2278e4cb75a7d2be0c2075fc8b5f33857a54ff423922f4acd89f8ce79e3ba4fdceed7719ab91fc361b647b79dd671175dac08b2e50f0968619bac5659c591e35c8f6d3e9a935b8ab8d5d82e0f57bdf9fef91b9fd6c0ed88a20571c619c9e5eaeb955db03e94eb2b1a435876d38f8f767c4d0366ffe8963e8154ab042fc94f4001a5397150b12e169d154930ca42980c41945b31025369fc40b839c275517cf4268e84104cbb83a5e85478d22181537209e56d0d37fe4af4d162ae371aaf6f63991f8233d77dd2a9d2d66c9391cf7f2af6f972b82237780303ff0acd31be0bd5eb1f37711868d430f000d4a338330d917ddbc8f059abdb0581005e13fb645f1af29088ddb3457d2259898c1fc54c83b94bf2faeec7ccb34f40df3511c88549703c0b361a7b0c3261dadd19f960e093f01abc235983152a9e14ca00e06d9cd19220170d90b8fad7e87b68a6b64611dce2ecf05d54ad871dd4684cb57330e5c0a8b0350e1610fbc593125a338fe97949ab427fb3ae97f33d08e12e4d3b74302481691c06fdd3ef1ea631b3cd7ad9ea1dc2689081e4f609959359d9c5c4ce268ec23f967cb2ef53af6f9d04029f05f7fda2d4a22646cc26cdafe5c0892012fa0a6753407fd671c1a59d73890f6481300c04121e5ab354448bb34d9870c1dc3d69c75abe124010becf4b456b444d0921ce64463ab12e933c971a930ccfa1678c86b9f7ed2eec857214f463b43989008a5c165b0c24cdfeb7e1860990b7135fb8319a7ccfd9a1104ff3ad6b5d1aa3ad51a734781d1e33dfa5cdd0bdbee9b26999a3f776fac94cd39ae19914e0aaa0744eb422e9b98d84ad5fc7b47da148c88926c916331a1d51c616352cd4111ba3f3d77949347b844432210af0d53efeb1ffa78d30b3820a08ec9913c171207c56a86a4e3ff364a4e8774fcb1c30c85fcab65f4ee540469e1e85b4f03a167940cb6099cbcd566e6197dd6f7110bf087ba164479c5fc203fd6c4661836b4dec8808a7597d8ccd43dc086d3c0fc87885546b21b1c58df4b1409267f82b4c196d93924b4bc5885fcd17d97b2b751791fe64fa21c1044c9b905737769917efcaf510a2b257a2ed5d197f536a009bebfd82c5a3c754fa5f365daf2a075875d92c9df63dad3f2c8dd977803a46c7363eb45dffeeedd59bd2fab8dea7a949aec59f3fcdb58610d1ea35957e249b3ffcf39491e4cf50b9fcb75815cfa3a6d7b6eebfc61e8b226b054f1347bff07d3c681fda6709ebb1f54b5a2eaa087c7a48ae7bacdd8a6012b8e866ad8e25b5d271d11a369462582a686938b79162ca33b8581242c40f8e623d274b6b030808daddf556787808c28148457a3f4195d5bdd4c60d8ab9d2add4fb49c1d5ee8630813ddd8d4ccac2bcb5d479db2f8d0756acac1e4b84db705d3fc54d0f78c16d343ea84d8e4f6dbfe64bd6ef6982dc2814e19dea1e8b442784e86bccf37118343ae302e95a26005381d43b4846e5873e1c815c18f456270f1c5ea4fb9601d01bffe4718745561397f3e132f14df213d42bae99ed8b13c4bea4fdbe026ab82c345d19429aaae2c00f78dafa8a9799486c4faf4f487c91b1f4f0de324b9f580989d0631f4f74cf6d63f9dd727a94a94db30029a06770f11be353ff5e71d3635d47592fdfb1bed6d1cb940eebca73c01c0ae17d7b9b803c7f9ed8b1e333aa6deb53a72b804843a31d10fb74375d378843ede6186da44ee83be5e8de78db31e58a1180f0f7957d4e21e9c7e5ef046f6e2bb291205ca674ea22915aa36ce9faf73a856b63e010be1d8e9f5924f6668d2f144c3f3f35614dc808101c0793877b3f53a7f8b96c29d2c7281f45450c27a3b6f62ff30bc51d3667f1aaccd18179dabeff0746117c47247a905a4b564c4bd5d1e5cfd2b9667fe657498026ac77dfc22df02398351d82f4982f7741a6fc9fc790bd3116b210c020d7941f7404a4733e950453dd04a8e9bbe48f3c2eb3ed7def4be2f172fc69eb551431ab0e9b530c4eefa7b5d5e42f7f26c7973f3eee7dd5c65becfe7387d9b2ee3f6fa907d19c2df3ec01401debfecb1d266eec8283ab30401d17d462a667df3e920ffe9af30e2259ed8967a65921988c96850e4786da3f083449086d50c02b9593441bb72ba7c1b66455dfeecaa1c79f021e3ec84c1b580d928a2e3901fcc05c2f43eca28fbc12c3c8a33a0ab94ea3e53f52e270c024494b9010c2fc945c5e11b3641c7112420be99459fdc2cc9fdb7336bd5e13882d6c2954819a04a05861710c4eef55992a978acbef0e040a0408c836dbdbe4061a366c36fc6068e8bfd9c7ec889af00e72a81109b0482ccf257b660ee7b5d20f85fa8abc3333ad29e1a70f8d2221f6989fed0a4951e3d663374e388ce0dff6fe171507e53cf8a8fd3c85db761ed251fb599d7d7515a657a0e2400f20497fe7f51fbd8ff9b1b8c67c145738ca58c57b2cf38506a243370a3c71fa9d5637a337855a8b78cf610613c94c419447526ffe84d9226c102d2f29daba57a780f1831d10264baac003bf984b3f47f18e37c37cd455781d7b3a6de687af9dcf18ba8086f1228f9c49dd73818793ff97715ba3dc67693fde399a8c6f0ba498ba420cf2420135214cfdd89011f710fdd80af0f288f4061b62dd24175967fc9045203f01e7ef298092ee97d64b8db07fbc335acde38ea0e201f83185a3efa0d87aece6dc907365070ee5dc5e0e7c5034e9fea5a804ef7eece687d6f088e7adee2275b2b888bcf0d510b3ca98d550fcfb7811306d8c9bacdbe6109c66355965bcf819a678996009a8e8a10b41176a1e368bbef54ff0a128b2e8c2d4a52b31243704101d71beac519ac3f10aead0e9ec6a5e4550fad8c54151f35e5e4b5bba53fcb20abc57c413a2607db266d6b5be8511dd1ee54bf7c83313acfa2c606305f0c701fafd50b58188ffbe11c71f50875c5e9201f520aa7f0b6a9dada402fbf6dc3548b15317fed91cbea69c8fa3a1f426e206c5bbb3f7506002824bbc2b834f28bbbc6689fedb14d6e14ecafa532d10b8f328a1cecb28402affe93b5664f5302a76bd085d124d656b6ccab8b85d1ba21c287d68a1284777de096be4ca8f89e98e4ed65404f5293f966d179300708f97c7c2ab961d5e1202afb389445add2318ae66b554b8d91332a782e4e49e6a473fb79e8466b34e16d8f3e4864a31e53b98840a65cb50c01c8030c7952966618d8a530cfbeb29764056f2c168efc00774512338169e582347617ba91bebdf60ac71b8371066e1b3f5573d3c5df5641f25b57fcd4b572f8a5a9c9b5fcc57ba58778653173d5fdf71aa87e8a8e7e8a4baa0002246c176efbc41d425ba12db094b8e64c706865931268c3330fad6effc93ae9e662d2b99ce5b51c1fa265005f25f15346528ba902fd30a0e3066b24608d677a850a14373b904e1c38412ac7fe332266b245e166301a26db75baff4a675aacfea15b9c64cb9add13b2ceb5b588cb3e7732a8546d53321002a384013319da24ae808d02b761033a6ee1fc57d430c54b4a0f8689c344e9ee9e5a383a832c54ae5e65dab3a16fc56f200970aef5687587c055e35a41d4af49dca9425950c7b03fa04eb8a665c34c1802e257ef3df5b002ee01a709584ce6e7c230ddade4691b50622da9d0f65cb4bcaba29b902a2da60eae7a467a9e71ce51632795416d279872e267b26bbe98396b9ea6760459fe23eb1af443f024f4b47fa5a0b4ec2766ba9e5ac8701ab033b536335917aa21024947d324c04057eb812753f8b77fcb0b0d490cbdd5c487ff0c1b916fb1620e4d6353873bc7775b755626f827352dd3dfcca7057d05e3db356f8519708239e63ed51035742498451878dc444eccd3ab5775b6450cda8742de5f380548f5e769fdab294ab3b4356fd91fbf0a8bc10c2e7ad3e2e55c92156d046af0571d9da3b28d460074e35478c0df8d7902e12012f8c61454b8399232538206deefedf20b0ef564a4eb504bc379ff4fbf80e38d5fd03f37a8cfc3b853f7546c879aaa6d21c99c9962555dddca49cb2715cc86f28fc868ee023dfc724bc89f075d7af1d81ee88bf4fada419e2e6c016fcc5073369c186f4427417e150e2879c86112c13f61bcb9a97368832af2a9e06f182ad3556bd93b434f03e8bc507dd231d7d56de8a0de4474318f9b7a613ddb4357ee4b37be0333d0f2c8d747ec185dfe7f69b9084d5b6b53910b01a74caedcddf79bffd3f035cb1d900a38739d7f45b29e9f7418fa07353f7a3ff07025d3fbdba2621b6c7fa0569e0a74292fa6d792af2b25f804176651387b73b181ef324aae94168a8f4f81d318f06f9ffd617de22821bd28d1b9017c6e7bdf0ececfbf18fdfd7bcffaf2bbadb522714c3d67e7aa12bd20299c20507abc7e2867ca6b39d0c253ab94ad8ccc02688fc7a887f802fe5f5a8c284a3be640362fa8af2c55a9ab38e923c4246603c39521a751d04930b043ad947b5022617dd64ffd8982c3dc153abce2937d5c544994cd69a2d54302e69e97a99e9f42ee2003dee33c67545c6b4e57b6284fff0344c7dea9bad1f014b335d7d39e2a240b6183e17dc9a0db7c17ba5cdfce15eb1f0733d059251e390353211db06071e909907af6ffec9e52e02eba2def6e40e340cdd5cf4dbdb1aa9c3c257cb22930936376b16ef0507963a54570e8f02c7e0525e83430889f33ecfb024ac44cca9937a9bb746a8ccf279e5d7f748d8558a774aa7e3f2803f86b0715d49345fb36724d06de20f8b0606a18451c662bd35601dce441b86ef1907022ae11a7c87341f62d063e5dfd6be5dd1225101f5412d340003248945c9fb9df7fa265e84679e600a1abb15c0dfbf45c050331f43675d8ba296ff00530754fe991a46137c216298df5706588bfa80fb779ba20a3f1f94c14f5832e6ee1afe190a1708c773796878f9cfd4b5a6f6ef531a31ce784f5d531c9ae1cee7c6b611d17f328e69953199c48cf902f5a206865b5ebff55090c66710084e8f0372f80c51419a77d12b388c00cc840428809a6b83050a2a660e3e5367badc8572db4ee333beeedb0139d72e103c9d9a03ed7bbdca9d9a06f9a17d4eb714cee7ed62df778772e8a81896454a1cc8f58c34e3fb74a60b19691bbfa238691c624279862ce434b8ac9e786734e2fcdd8acfc085860cf992eef37b5def6085accdf6f284a824984cfa1600ea710114949735afee0951e9fde04f09761c5a8a6e9064ab8f69bbeebecc5ceb070af858e9837c0747e4511542e21cdfc99556051ac94fa44ec01cb2e14b5641e5e33a229dc858246dce5339f74ec46d44a5e1dc8b45cb5b51e075c6b40d395126c5883bb87a4c62cb13c2b7d9a25a47afd0de4122c6d15cb4578539fa51a43f1cf6721c770f8fa4e41db134df9fd1af59a4b74cadc5c3420aadf2e02024780ddd1e320a1af632b002aac3635e75000feaf41b5758cf62eba81783bb7a3dae55af842964ef46d1747390d3f1c80e774e42f53fc760e7da7f097fc231942e06a91deaa8b8d18316e7d610a1aa27a73a58cd04381e30222c033c3205769b4be4de8545371a9fc4b2626b4b165fa08a7d0262ef024a1724e06077f1b54c6c4ee5dd9dc6f3e6a22b17df717326f689cd014fbf1e14800f14e1d4b04225288265d303ad3a167951599b43ae2d0b0a111cbebefd654926a4774eec0d3b97288167f6bb27e0b96a0f82faa8b2e13d0d4b8301b16aada9478cb8539d3da5797ecd60206f6295dac05a809b266ee39965116d346fc8aa4e2ea0964d18336412a14d1fefc763590d972acfd70e39900602942324b7ffb2142a1abc461dd50717125d06b953373f88bb64c6f72c4d5ba14a740d68733a11c9a22f386979ceeed2653c5d5b13b61b8fb3c67560a0a187b443e4fe5aadf7dd9dac47390c4437569894e779df2b5a7f57d6a4ba449ffd8ac9438e11fd3c88bd327378b4dc410fd3c2358455f1a9bec3241dae84b3ad5b6e847c370b47fe2d82feb88387887595ed99bbc1ce21dea7b189e98eee403315b48fdc1dbbeae94f72c9cce4d8a6bcf420c57bcc13265fdc9ab4954f52aedab343de063298f3ae6d2cdfb5ddba3ea6e27dfbc07cd807f2f2b817e6cea1f9be30dc53ed779730973c903925c69df96ee75ad45c9e01bebddd27b72995eaf50f70be3c6eaa85dfaa490ec1aed418531475c64231c2eb5fbb9b070da55a27191703502c632eff3fb6e8fdea0fbd0866568105b609b9806587af021b0e1f2f827354369587d78b5e7a7db95e2146887f4d4ce1022c670f269a2abead3b17199fbaf0ceed703e06d6e56891d6ab642782e7708917fc252d0aa663a8c3e63d8b5deb91f1b548e56c0aa7192e82826544aba0bc698e10cb4e9d1c0eaf9bbdea40ceef248bf896f25b40c7fa8b762d7572d197f4ee686e018bbd064f29f2dbffa32ed90726d183e05cfd02a84767336a1fd7c23663815093f2ead7620cb68f0760f0c2d736c9fa79322dd66f5068770fd7eaff4da3a96c887ab32f2d00454efd616e464a4f3518491fc0c24d2dbe0acca9aed5fdec2becd6910dde915dd61956685374929a46573a2dc0beeb81cf90f799a1adcd1324f547d5650978a904bc17270f8dfe584f6d3e8c67a959eb2ab7b952bab14511e45922a05547d128d1ec686145c53c3ddeea28a36bf219e18a95800f6231f833e113c0c832e21bd480e6a906eae3cfa060f8831e3856be25caacc7f8e24f9d68a18cc001d85722fa9463ac83eb58945d778c474bc1713df6a0b7a00877ca660ce3842b31f2540288ecd9f263d6d4c5d7739a968edb4aa81f7b945079434c09050ccfb2052492239d0e509590c731dc1ed1596780c94cbce128954f3ed4b5f2f16a280d1c5a0ed3ef01dd9ca46cd0d9930076c4a36f95d15e4734f7473e9918935b63e9529d79562f4fd9876127d95bb6c3400fa97d2b756856e6ca37a645c25da54aa1d785afad3c78f5763e4af2e1b038c02e3e62dfa549d230206f6db499367703bd96645701b1b82f2dfbb5fedad839168767f3ccde49841f8d901be51c2369ffc9b86a7b57b58ea47aae7996c80ac16beb51ec75a8fbe390a5f1d566c03947540a3ab66f7c0578ab3c5cb3d1b599cdc572d6e425665c1122b3cb52f82073c679d6f8ba987c3c56c3aa3d9258e10eb988f595fadaf7a8fb714486cc032fb53824922ec3d72f13613dec139e19c86297f5b1b80066a3e7c6b3d875ce6bdd0a5e4f59512ae4fb5a830971e8ac84609f2ebb0a9ac0c1dfd7d7e475497d42c11a7040ecb5b9e4f9087bcdf643fadce4ed61e6c17aca59ea785bd7f4f6f9dc3eb675bda3269cbffc212d62b0920a4a947815ba31b22a7068032609208024fd1420b86fe928dcfc91cdd7b306f70a6c75397da793aa2eb240ac0499aaba8ed640acf6ca08ba70110fda1c68839b2796014ca340555d0ea0bff51a555d06b2453cecfd1c3fe040457be16ebc0d967fcd158437846a4e39a6d094294b018a2e3ac7d59e105ce86035f05c938f245ee1d730298cdbd17c55a4213fa39ea93efaaf8e0212750ebd525b97b5eb24dbaee862cc7de73d9020c85bc78cacd74e6aaf500ccbb657a9aeeee9819824ef74f6558fb850570dba49f38a33510ed58d40eb5ed181a347e8815abf4e7caf5707b9257554d49f0f950c76b047664e448687285da13d0eb8850b5fde767208872ab4b66770be68a5594929f497c64a65d2658f007b70c17ad8e28ca3949400a8b369b57b595bd78a5a56e12c58fe22ab7b8a15bfbc2cb33c4fc03beb67cf206bd86809d09b7d98e669c3eb26ba485f8d5f794d0046fc360aa4bfab02a50c129b7b390b56414eea376526659e01b9f1b923965c25b1404c98bec2b654576aa70b30214b4c6070acb71ff7e8dbf145b0a912a829940c6ce1cb2e8da003060d50118ba6de5946039661342c445000c91f4bdaa7a343befae0498e685e8c4be658eea3c939322d3177452eb0c1c2b39a13045d07f336216b33435c79aba815469009191840ffb406c6fb583434b3643d5d921c4fc5408de8e16430590a4e6681532cc1690ca642ddfc79104b053e859b4645a9f9a1fe4b27c7f07532d8588b512e0124326405eecd1c5377b22619c6e24f29877f6f36a0fcac1a7a3f8eca614067a55ef421497d32506443d5b1052f479eb164e908172796206286dd576049671a6ace25607663c262a0a2c06cc0246b4a1853f26e53f00c5ee4e3cbf2940560545c9ffdfb9c60f2daa22d0b2ac7977676e6ce159411b00147a51a42c7f7b4c9e12cb0109921cac212b9ccabb2e7b10e17f570e5f2b2d95a9e511a246461eea60dd847b70645d1eb8536d01bc0816dfbe3317f74785ced5409624fbd81c53c49520c4f0ac13555498f97c38c1eeea51ebd20fb2c126875911478662a22565d50071a8b85e560781b0b50a49783212c8c65af3650693129bafbab400a3790e71d65a16d62a00cb3e64cc0b36f22d665a666f73e28f8accc080cb490b026795f3ac4a49995f6f364a2c1c8e4d2ab97c1d2faf12f4ab92d8e6b6e35e2512f70c67ea236a05c55a67ce2e34ba708f324a21ef50609567d910cf2d0079b6418a758138f755a1e848d198b9c1a763f244436aa7305272fc5a708df17fd982ea707dc08045b9a2cbbf2a8a9f3adad3bae3046e42ac0654b468366e2e88943cf33a363f29e51c17639f5cfecd9916623415abfc58928428978cfcdffac16600477796885a2e3eb75ede17cbd1ee4d2923df5be3e94dea46e47261ff987827c74050368e6acd15aeaf17b8301f60905ecbf50274d27dcfd40cec0fd189d9ec6fbc1c61d593ca8701bc32de304eea365189ad683195fb42b7c62562c4391b33eb960df11aacd957d11955671a741af1fcd1834ba832506110a51453387c7d68f049905550120684db6093fc2e376ab92726e944272f92c54ed9f108de09ee8b8fc8762bb926c04e459b476d88fb4b9304216b5c2f738def7589368849250026f14ba30e2073c2b83d8f75f702318a42ee8aff18fc6306c6f73e39f63671bdba214045c8c508936db83d8ef349b7b12aff222a08295618f1222b40a2f30b3626fb3930ec2c8445f902d689761d7b71bf445006e3c723c1a40a505198e6285807898478a5d12763015ba061bea3341ab38faf0fabc9b8b1232c2ac4c5a37da047491907e910ff3d82c66e3320283ade7b87a0fe48aca078952b4af222fa48e8a59577c7a9d49e0a814ea0b82d1db792e2a218c9a7dd92f69d556eac2a221d430443c53dfb9e766a07821edd4bb66400be005511986dc2ded50aa9fa4f5a4c466ed5ab0ae34a944f40a6c06d4862b848df4b893deabd4920a8f9a0dd99345a665923bf33790b35ce07b64b2e8f3f6d2aba5f7e75345fec4630164643cdc5f41fdbfeef62384947023cc67375febb2cc75e5c83c21424a5fe24a15b511f98f2981306628ee197baf77d7830c298e7df2744913a80056b9d040aff9af96896fdaa437b7bb82f64e0ce61aa06c4b6634c180a6b0da2d68caf2c1e633ee9cf704655f48721eaf962494d7cae0e7fe1cb00eb4d298c873bc6d761568e661fee4fa06638fc86d5cf25a607ed1d53a40109cfad398325e70afdc48ce9bbb6f093890f3967cc2f6d9b111b4689651dc209879d00e4e68538da47a9f067d0a11f1a0ea353cb93a4d182e363d673b0d3a59ef13ec08ab6c4898f8496a8a09f49e9cb728284b1844df4629c47d09c90991d20069dedf75f889fba4704c0963e27c7f9a4f6a7d06162dc6ac10cbc07f4fd0e0200f34cf26bc24d782d0a026e0e30e8445e9390da239ff4f00486f162c45b86da762ba40fa36896bd03b190a50a06b04d0a05ecc379014f4937e6c98429938084b45ef3bd2efe03d19879148692429ee40dc9bb4e476511231e930bf054e5474032daef52d61adde609f9a84973890783277862188dbb69a8613969f551f6228e2714fdc8df000ec92a988d1882d865c8ccf1ec69b034d2cef704ec510890e845d099d999060f0e96b5a10e88d556060745c338533eb7d0b838116e555818cf009735b56cbaa26ee2cf2b4a897de93cbdb0d1453af75f5abd20e2619e15369dee064b555ea1113a1e28c6e516ef465823c781c9b073600539376c9db1a829b1b0e4db98fea241a1d81857194f9f0e6e52a1b9b09c49f46c8b08623865ac8042a58eb62ad996032f86fa38c95a5951aaa39674f83f82cdae16468429e2c3282c63ddac98c38666b076d704dcb4bb72bbdaed64356a8c56000b5453fc80ad84021dea26fbc9483b0bbb0f993408918de67402877a453224672508dd36972c00a78adb2004df56ecef3139d80ea9c2c4099563738dc152b7eede3413f938d53a7c22acd1db359070d4795498c8cb2330a5ae21e56ec9d6d66dc590ff49c0441879826cdf5d3f5d89c8e8710f178e135bc1ac8cb24de7fd23d350c2eda84b01a6214a746efcf0dae462686219c3805ff66494ec4d69cfeb7e608d87619f9f3d5ccbf019e5d228c6a1d9a15d902b60dd4a6d72ebd7a0c0eb6710e5ab013f0613faa090afa930898c25cc09528b44030d2af60de0c8834a51370f849cfded966dbaa61bf04d1b1d4fe485f1122b3e6252513bddbbc5a3b5264c759a49941f7d7e214586ca401cc9d4d4dd1bfaaf32350fc6486bb0d22d0e8851afa22dcd0dba8f3d0aa60190169b0980216f34252187a5bad08b7b19e2a2f8e59233f69cdbe925a2e8bbfa635071575e30fffd6d2ad0dfc864ee86d9bb14513cc8202aaad7f82120d525b00626a906b7d852c41a6df1c17bf1073e109232e30f3db957d7e7566b7de694d0c673754298e8765a9d97976f44cb0773e0566740a1e0489d405219a1ba19fc5cc9f8abef8b7423862d2779b8e9abb19b109dec7b5079a253609afbbaba7879a03da8612221f0c8a2c4c3d204cc7ab3a8f1965374388a9f7a94c1f2cf022b3fb5cff8c0a35d7ff0a51d2f902a295714621d819aa7fa60c1ed787dea6ccb3961541a26769039be9e9ee6b7c0f1469ed8030f9d64f63094c4ef0502b20f1fa9c513e65e66829b1e7936b18e9eb9f7c180c80b025c96d49c22feae016a16650a5b099f2c0ce4db4bf5b86c97467cd37345403060825cd333909978d93e57a066ad6899acd09c5c517565202812342cda186889f80391cd41a0799d657388749462d9ce25138161b505fee4938ba17770d04c3b689eecd51159dc0c02d0962a71e14e0426f04eef5ff5b22d4d1cb5546b1a58b26c0e2c2b5bfdbe0992c51cbd7767600fbad66e6c5dd182681fe9c613d68f31fc00bb00b39c681e411b2396d125b852c2e0adc29c04541354499feedd46329229b3ffd412ebc37646075fae66368eba2e237ba646c61e11b8e14e1fcf9abb1495bb614d1d45390ae4414ccc2c991e6b0a1c6fc20eb4e2c3dce8db1998ceeb607321183e4ddab3ec49bd2e94de4965f43aa0de3b6eb7632f8ec3d8ccfeaa33a502f7a015d0b79681ca9caaba5ad6d182d27101bf14b5b0786cca9a3ba025ef9e5ff4df7598d0462ed92cd46a0bab22793148cca27b85b1ccb470b05261f0c3a39c4406de6fef7f6386116ff5b0b5b56b752fc8ef18194ec4d799fcd0c0c6f61ba22ebb374a01783dee533df1095cb6e91d775bf1442c8ad7ac447768f39eafd2058ab8e91e2604e0bf82e4405b386e92bff7bbc11f1dcfeccb2ba3470ee5fb8b9ef2f550dec104b991c325075686ae4284589c69a07ff948f9d9e4ca544022a7f6279ccb2ed352ad4bae9e6e65e9bf34e6de1941209e93bd3507acfdab285d961d473b7b16d9d76fa0a5adb04373962582c83098551d512a6baddfd23ea4181e401647b799c38dbb9604072d617edb9601cd7bfb6dc912f96f8f19de6a01e4f61806d986737a7983be290e3b417a45dbabc81dd355f38084812ee0e2fb66159fa67aa63efbbf157044ea181062b9a85d29d26de6301ede0d1c096a9ac16141850e834bc6905c6ce17e12c0096a28514463fc576be070ac037da5e30454d24369620b5dbd3b4ed6829d3060bd02b5a9fbe10b18e49eb926d1f2f6cbc714cf49c2a0046c6da30713d62f44dd7d71e53bd98a6a86e1f446c325bcbe1290d598476aa1a3426b62a7e248559bfa573d03268f9d2a8fda8138efdf7b7276ec25a51ed1567265414af8631dca963e38631e93df9e6a5be373a672760ac6cc6d5f30662dd7de7dc7a75784fc02bb9fb157bc3b76d9027bdd5e195905163149d795bbe36538c00287f67406191a462c6db3b3d62740d181fb6a7697ddce33c50bbe574df0c624085791db6a8fc3a482f651fb613f562eae59d23f3dab0dd2cca8ceae4cdfead67e6bd9b05a2c82b832e1bfd75c1cad825e7d2550b274276740889b18e5819529a98047cf3e73cced1232151afda058c6cfe5bdbcd6a230c3ec0a63b332769a30124806b1ab73b7945091b308a3c8c7c452a6ee2526d2d1d043518282cd1dece5b1a778d978ae3a1eab2b96352fb124704ff7a6e20f3da9a1a6123f4e984d33e9517949eb17da46825c5a83e4215446dae239a015512a7851632a3a202f0ea8f8b186f4356c6bfbdd05a87e0e67e78f713334998990ddedf2000d18093088372202e96f22ce482ac68c11d239c5076952be9548dfe642824905b24ceb58d49995ae0214b655630b44473c0db8b6f4f15160d936cb6179b43ddf380acaef00875f0de106c747a3c88d419fba00135e3dd579a71346f4ce33cc2d7a9dc1f1c88d2d585d74a98a63945003fc6f9ff471db7ca582098327f2217c099843bf4ad2f82e12542fd4b2900289a3aadf1e81c745db4f50aea27a196057d68c0e7d450f4ff72a460a512ca60a06bfbb4ebfd1d844c5a9c1c5180177d86d40efd6ffdb47310cd96230babd22ba62e5fcb879e39193a1abfafbab906f6b0c14fe2ed9f2f15e76bd84d2e078da2b61cb13023e941725d6ca63446eb370ef99098d3ebc9c6b2e5605a3aa24434ba202be22bfc9c10ab01f110e0c7dec7ee0673a087703cda24e68b33df6592c62b3aa55013a49306423b269b8db14ea2ed051c839ac3c5b57bd01d717cc04aadee10dd53e30040728e723185b9bc9c9b813fca7b9d8f0e06b665d1add0390f369e31f0034e6b7f93746407abddd81e54e05c8167e6ee2c21a5751680d6d64ce0925647a50ae00c9434c80bc34224273bd40722b3680fe26ed73a990f20bdfadd20612340a0f8dec82262bdd910175c53c457f4534a14351a4134c213965c8c5fbe9e776fc1abb9c9072af9616d2e934928cc6b4d46ce86f6bfeeeaf059e3c6c67b726f3ec960a74dea364ef2e607e276bc10512b6add49da43e47de84f6a1686cae93442a740109a251e70463d79bff20f6a8eb31238b7ad0fcb0f425a1bcbe6a83e1afd11173e365ab8b9191c1b70eb3fb979fe8a4f0c959993c44e68789a89f52b2bd3cf4d5a19bf85575a9c97f5f66adcdd24416185ee936c340738f68e3b4cf3b06ffa69a74a4d62b966b18387311fb786d6361b53a2d4ecb7e759011afa0b6ee86103548f48017d5d3028df992e21bd264b033edbb0a1f2f70f6323eca4a85fc15e5fac1d3d047fc5e762490255ebd8c0683976a6f2e6451325d6e08bbb8340a3cb871b26693c6796e268d926e5d54fa1a8ed277989e1fd86b892e152a106b2d6417e4566540040ab1ed099818015dcee788d7ffa55610d63a31507e66397adddcc35d9f9a82ba9ba4b5b1e0731d63fb1126b521fa7d758c329226f029ef6df9ea5ef787b25ffd3843cebec7b7111714e06501f4740d5ca2e61a24ea7f7b42d9ea8b1b38a8e001d706326a6015e3dd6f77604c0a19c532661406c4905a5cd5d616c483c7d1363dcbc505463f97652e08ba17326a1e807e3055e7b2d1ec775d54f668799a9523cdf8d2590f9bfeea4de6c2cf8c3a17334da1891d57a9c42d8185e425343f41a0ba3b98ab9a4d003e5d0a4f0109c5f04c6dc48a289cd85078539ef429297428f5061c65325528335a7b20c867f0ff38dc455b583bf1f4d83815e2a96eb34c966af1677e36d9bd6dc5ffa9314df9a1c9e5963ff85f431f4734ce22d3a8be55e9ac810016573ac31dee82810be687d8c0d45d439ff32c7eee9c34a55f6f20d116701b08a3d48aa2b99feb410a90abcfb328ee655b6f6f2de5335e95069c10613c8bdd392d08e77f629cf6d068b19e4146e5d443b48153285d633f9d1f1484c2dc75e62c4923b74f392afe401f215d81d285dc9aa5b8bfb6f43eb2633613a4539e1e5dccab933bd410f11c14853c60d2f73537a9821d230d7ea0c52f75ec64ce11d51cd4f19a5509c462d18f153d5a56a8f9d867827d80eceb02e7d439177a5d3071049762228f7d6d6af60f1ed7b4829a2d053e1e683cb2ba12ab57227f894ead70204618ebe08d246c52d11cb70f15e698302ef7b87ce31c5aad0a9090aad6589160caaceb93e8299f27e5715459967f98e577a20052c2bc96f5e5a4df606b05dbe961d90a68a71a55c31d8903d489d7078f8a9c683ed70d4352430478fc095c57ef58fb322560a1501ad71b809046a763b8c70a43cb983ff2a7a1415c6b07e991cbbc1a7445e0798aa6859735428ef049363016f4d988105cd61e3c9908c4676badc587b6bd1a26105057fdbd1e699b9a9b1f2b12c526c2ee279ca7dacaa990049e7ad63f0c53a9914b010164382c2f9687fef7b7af337077beb9d640a1c9d9cade1a972b1ab129efcb9fc912a52078d03f98cf330c7afb64cadfab2b93477788b52f3184fdb6bb6f712f86982c7c1eb2803a4362f3cd218e2a7ee80c7633ddb64b087092351ae700b38b5465a057e2e8efdddfd47a2e367af903a313d9a8df4dfe203169e7c0df1f881c4ad6ffe63d2a1610ab2b147b47bb9af58d3deac4771d64a9eb6e89e0b2cf20e683958653a18e49dcd69c16b36cd39034700d28eae67b15f05356c3f3d701ba69e71bbd9ce66395f1915f92039c0135790dcd492719bde78cfaecde9c6a93803e4116c52c67bae250e605796c7b9cb141cdbb8c85aea434e8388f9a84357182de00297eb62e88917fe1b4b5bab71fd839918ef48d6022a5cecbb706b92b56e1c9fbe49b9405a88a2584340c594bdc492908ba41e7479c479df6d3f6b75ff88a4b86ea6976868d66378587596ce93faa25c66a837795c27511c4cb3f6fde6091614f4cd567bab274c4993448de70f80044f008c76ce7174d4f85625fb4dea6f5b45a28eee96122f2d3fcc4ab02663687036bc3d9608e9ccbdb0773dade8cf4e911884d9f1572870cb913caa319ab42c45804a468414f3d40113d1bb04950bbe93bf4ad809274c76ca502b3c0e5db2172b3e172e239b5d163c60f578dd934100b62fbf009bc3d78bb31b4673d7213a46da687271ecac2d04d388653094dad14c81c147f4a49ee060f38b5173b4128b3474eb3a81bfb1f5846c48801ac068f0e3225a38184c1cba33f91a0a09c61160974ed849622312589a5c7da85de78be4768e1363ed1fe5218a26ba0905f6dd7fc7b111f050e9408adf80bd00f8deafae2bac60f19ea04b664fdfd9a24b9ffeadb0ce78db4a043b8f05a8f178adb10ba2232e30bd5d7cd80999be2cdb89ae1b18450a5a40a13373c2f232e3774c9166dca8eeff625504c8d4d5458d2da0db043a5cb190829cf5d090b3a5262a181075bd071610f1a3febc70b38e6858714508a25c712b8ca430709e191e5605c79c82abe3f5dcd156b99dfd7c53c0da886e979373e141cf8977ef2fd280df6c977a83838d08558e78546c3d0a93c57338aeac138c06c26172fc4fe4b38497eec5f834caa65fe4d5145b3048fec4f812c0f66b37ea11d201dd0029783b900fb21c0327cdd166a1e1c307c84364d012ee39fe04059112dde1ddf05454a7871238e45e69645dd649bdc921f060a2de7b68a8d7015350333450a3e5cd57187e5228cc9b7de5ca5d428bd61c9fe64abcf1b43bc9e335a76f3885a0ad906476904b1dac781fa9db05a3d1391be2daaad449cabdc483a79350e909847990eca042c538c4c83b74ea1063a47112b6af25ecc3add7cc6dfa563adbbadfc63e619d9b063a8098a819cdc45194f70bfbdf7901696fc0daf5e407784c158506d370564b1a814a4a7182e2509ea139beac8e44beaccfbde739b6cb3ecc6019af8ac6d115095cb56f039bc2202868f644755abc9c21e60cf48b503e853d535f417c9171757d716ebfc30520cb4648437f9ca3963b04c7da77e5fbf4f7b63ebe14bd113afee73dad00557547482ba7a5e0c46efd5af86e44ddc5332bb1403684b537f1ad9d7da06d00ce803b1934548378d1d06cec777b0befe9257e14d327260ff3201fafdc7444f5b15c546e9d55363a75302ef6b184358c678c7f6afea592d017abff6a67ae1df8083e75667a423cf2033b83678f2051d98edd63f56d3c5953351871486e5bca5df552b7f888f53e2d087ef1457f5813ee8529386587a762adf2c802f0767cda402916ed9586f5f8bceee5f433adfe7ac1119f656aa0ccc4cb046a18348c61471f7986b2e84af3353c60215037d5b1386b6cd95c5ab37d215353bdd321fda85c6637626f86294838f21b3bcd6bab439a592784fb83247345c51894b8fc83f39b5db053107132ee40090799cdc41900f577d627062243fb0f6ac2fdd021a828b48402c46ecf090dd94978fe11bde4d40d0f00405340280df5cde43f1ed2a025657a744e71c22d25e04bc201ddd20beb8eaf32b30f690d6fa9a1a02cc626704e8b32138ddbda631c9e9620d70a3a3e83280dfb1487bcb16c3ce81a810e1611dbe675f6555d123ae87217a27095f18b47b8cb58dd44e551eb4b54623c4282a69b88d54fc6e04e0a13d51dc9461a938f931f7fde18031bef785aa16e3278e13cf3dcb712a447432570cd78707ac98661033c6fb22fd44e6adce7fe30a1e308020506c5c73d25e0fe75814dd831155cd7dde542a6a4f1287dbf9e1ea79ea3dea1e78fc8d4f20c79ba0747d187d5a132024535fe86334aa388f762eca0e4ce498d978576f0307419e74c45998ae3e73ddefb84de251dd37bcfebb579b95ce8664d7056260f5bca0e3768d01b607c11321a2cf2187c2ee4f318c7ccf4dcde900b3c659727747d2ec528f3c9c13e76208f4020778d0a3c0c51e16dbe653346ec71d8cee71630ed69b4097b9f78cbabd0bb05581b8956dc853cb9a3707edc49227656060c34fe3f60b994f6e487e1b1047f105487e8898b30f3ea1cc2bc8e78922f2ae82126b7d7af5596316c4180f1e0a1bedcda9be7e82dec06e8db6f148030b832239c6b5c629afa53225ef50b4f02cd8bc965270fc814b67f08b76dccac8d8f2650da286d6845e603a608a455455ce66a02919faa01612c9f7535ba7fef713309fad078f2e157740116d02f17f14be0f4677fc5931c5d9de49b251811fa03ddcc4c5165136e41bae56a1d3ffe83bfc800a263dc6082fe2ecfe15ef5353567a824dc3703a6afa96dd0fa395758603a064dcfc72d8c4149eded1841efe314a01e9914faec47084272cade2bcefb0ef7b4d30ea927be12b1551d2849b4664d955a381db40757e530d7b4a3f6f86d33073ba4333bdb907fa2a3a63568b217bcd641b8fe6ced657055b31fb9f037f706094d1df567f60f39850a936d0ca4c81aa4532e987c72d30f9e59ba57406f7dcd1b84017affe2f9af56ceeb8fd45a3d9bbc98545a65bbe48712be9fe960c63a25ab6a6999b54bbac29e8f1f6315dc302541a060a3715bb2f91a949cb510e48ea8bcf4cc1c21768bd3d2a12d40d01489c910140c869bb9897594601820ed3f3feccd57b7b3c503c0d930f1182b1b1a38aefe13ac206cf910035ee7e4df6755cd09454b5b642d3a21a09040d6a0c42cb6721cd91a8c894b148c232ac224a41f697940ecb4aa220f73b001efddeacbb642d4f56053e67b2e4c560e7377047809fb85ac622c794c212b85f435ad6c4884e132f22c474768b73fa5ca69d763c78ae74192ab88f7c8f67f8df8ae381ced2769d67e23f6ed00d86473c003609de6d07a3d884a32f9ccf8684652eabb3dc08e0b99f7e7f5b31b83d2aadc707f536eb9e97f682e46509262337d1e5e17c627f8ded0148b15a6764708b00601e4615de3027212e4321abfa73c622d85317c88e5d9584614f4cf23680892c1c506c11a0908e7e6b793ca49191ac00038a7775e6ef0cd5f3e3c7314ebb16ea6698dba5e947cc808b48b300d7462956f6a3aa1a49db126d2a612b3022592ca24638010569d2e69d43843621e8ab09f4cbbb66b8734fe2d8df62807f20e17b21502f9052a101e44c87e5263a40021faf533bfbe313974b7661dc2598055c55c0c83a660f9b1417aeafd372fed6a202344e15e4c8e87fb0cca3869165ef0f36ad7170f57c09cfe824b671be17166e360dd040317fa65b6bbba50083b3d782d8eb48692d646700f431793e29d38ae8df0238a4f5625113e79b98e672130b4b8a0196464627e1edfda6146ec714f906083b54bfdecccd65223ccbd07fd86870cb4656acb541007021a7bea23027c6be2f6e0d4f91d98766f042fef26998b50f52a2674205d22396a59eaf2b8c71649a8e056189c0deebcc5f405355333ae3419941c74c0561774b0b14007ba9079ff9f40c4df4d788a094bac77f5fadb24aab7074d76622e47f28370887aea4c6d1dc87d523b365252d9efb86fc16fa321900616046ad41515e26c6f49d3dd3f560ccf85aefc5c48a04320019bb596fb3c901c766bfc86757f4725176382b301b2d360d9d120c16180ec60b07436b371757f4e824d53132653417600e15775de6f1c8e6f36dd5f1e21f71d0f50dd116a059edb803cb789d03c7b431c0b003ee483bcaaeb971b072382b703b2d761d9d331c1d67a3577078b18789a7b940f17a643429b7192d3c649b89951286f1275db9475d55cd21a6796a68ecb0fb5776e0e1eaf9f2a76d808360ef6b3c51f76bf1d768c7e56df7d677018c76ff10aaec414d58fd882dda02c230ea249ae1e0d1b886cf1cd93d5318c4d7607b577164c8b95a819e4487e99da2763e6a6d55f4159f66f186092d80f93a8dd4e9d8022f075cc01b56d424518bf05fed964fd8423cae7dc25478968f5ae8448bf6134b1d89731a69c3ba730d505987a8fae1ee1759272f6c5fd112b33a4ebca4e122ff67475f659e562a66c84ef9a6de37436a4acd1aeb5725f8c6831416cabcf8c4ca3aaf2814fb5a7a10e6f94a77789d01d2b71fc9396b3b6d38003be261f7290be1ca2c1018f432c0951a0f1f2a9e1208558e4563227be3c332da12d26bdac7ce02edc29c34da7344600448b04c3ba059dddacf0be424eab0ef2cab9e4800eddd247571cb18ff6d07d1d4a2c01363d6a8d19872d748e29cf9f26b3800310769dda6ac68319c5263ab0711c9a0fbba4d271334baa9739e4ce4450e38b4517d572498585b54613a9b5ff94ddc35c1ce11d13f3eb60332962022318de3141c39d000b03d84039d9c00ba60b676d997d99223eaeb3fda3f2ff36f3e0df25c58e4976536b8b3771073a59215f4aba9c2e3e1713bf6a659c9a06ae6220794de25fde6555341e00aadbc806e442260faac721d9bacdd710e887402d99dde28284ac60dc583f0d36f1fb2aa43b8dba23581ddcda33e26dc5ae09ad356da98940681fe519bcec25aef6132e54087f437ab9d941695d9c92adf9d8d904e15246bf2d9cca2146a29b7738f71bbbaf0f9a44aa8564d0e717afefe421fae29a841dd9b1b7f6baf1c1e688d7ed23f47c0c8ce5189acdef3422ce7c58b01177494da04dd31ce7ad3ccb9f78ee1e125d2db4414f5d15c7f09ef036ef9f2e94a0f80c402f0264d44fd9226a56f229ca6c576e2ff71cb86441f1c689b06b8ceb0dd7caf85b82e3a9efbafacf34591dd73d689fec463a1f11f2a85349c7294bc99a6585c1032db728cc08691d99dc5888f081601243ef02484e938af4ed38bbd6bf0d349e425800a2e424b602088d67c8a9970b158dadbbd2779026fe1e877e036eeef79ed82f258ad63cfe5006174ec9da4fe9d22c0883be069b9d20eb127308d31a363b7844aa5c3c3e405bfa6ac2dc5ffa74be0c58ed62f1650208b0cde362cb9708578904628c80315bb0d521f79dcbafd177527cc690c702d9a16a193d0b655f8c3ab92bb22843650dc74167205404713f6ea64fa2d0b70e8a0098af23d6ede4dbe26fd38a02189654ed8c523fb3d12bcd3665345a071c6159594a84044726ca62012d9547fd9c5be115c85b1b8984ce0713415773c0a51b8e135aa4dfa95568959eddaa3266dacbd5fd106935e285a894a9d7d0a9e5ac28d63aa3a4ab7470b29b6e1cadb0a3111127f96ded162420edb795c13991dcbd3971ada597a0a4f0e895dfe518776e1e9b61939fddb0123ba5d75501ba1983b5711894ad4a4ed17edcf5fa9a442930c2630f23d80068ef6645b7724e9c3b0f1318a0ae8bc3a7c02672281edc9b16d630fd4b1d84de422a783b7ffcd758d0b04c684b4854a09b2f0a39470f2555c858ad088f6d57cd03a9e676896510c15cbb44f2aed2ac5138c3522b54cba4dd5a53bd5a02f34d40d61f254723b05557b0e291faae9aa6fc056b6473601f8a882a261567979df3b08421dffb10ca6296e84fea9f1c5bd3ec6d011bbb6f4924a73f39c3ad1cdb011847ae3e9b9842aa654f4edcdff8a63e17280597e2b2aa5ffc7a0d8ba7b45c68dff41ecc6fd99c4a75f56b616d9109c7b86978b11ac9d8c1a4e4ae280b9712024aabab8b22f5f56304ea6ab78e6a3b029d5c0a2e61234463fe89506b44a4af04fa3874c86f6ebd0ca96fabb25ad8fa0311906e00fdc65c0785d9e9a3bd053c9952e5a34ffcc5d298a35cec3cb9562123a026e8f1e4e0c3839cb042afd09d35ecfb25c61f332521359aa7f6c9240f9cf03e82d731f9f5f487c6352aac0314d3021adc555f5d30522a9b0ef1e28426524ca8ab663d160dba674e3ce9ae2b07ef3299aa251505685066cfd96aac86c2e88aebf742986220d1c260a817bd5a040af1300a49a1878ac3a36ee8c6b98ea1cfd6ec45363dc2c3881006697befbdf79629a514f205ec05b305bcc1aa6f321d9658d2df45ec244bd23699d3b4134d6c46b5ed88924d4868a64454341372f992679b6c33da8e6c421b0c969c6626d995bf139e127a45f589e44e9cc9694e482152cb9d546772a6ea3f7da6cc6936b02bff15c3f3292bb72935e47b20a7acfa2f973306ed4f6304a095181512d28c9413261f274c4cfe32605e5c5a586241b11382fc6867fca9e850f00d7f15d19fd819234b125144900aaa3f92ea7f1a8d6a5852044be2b02bff203e1dc6ae8010fa41142f96e462497f1fee7994a652ff2c9a5ab650a5a9e536096911c36215344755152ad86847a5763763a2ad7e63d0d94d6b9f20744b4edcbd930e688082c61c6b7287059e1d9511d485c9c3d3625848335f3e561f17cc916e8ed067128428c8d177baf9afb95bdce11102ed6f74706c1e4f3c7ade77ba59c0d25800696767fc4b7e17d072a1b8ff8e1dde9722eed0817a17e6a7fc875ae1e32aef8cb747d5c3538b5bed10d4b7f1503c3d288ebb33de7fe20b5c5346158d0951a211954f51e93fb15869a7917d5040594dfae7657ff81e3e2bfc920c59dd0a47f73c4a6b18ee0afcf04330f47ed206cbc349b2bc479c26fd6f9af45edaf116bad5dedddd9ca404a9cafcd73e511f9c73776fef2697d58ac024454535a31e5a8c2c94b6265ca9d53c218618328218b80bde82c80b3943414008f1d9284dd6090e2d6029bd89113257152aa8cf76581097299c4d66a276c9486c1f765de735c88a60f275953b13a9b00d3336628193daeda4b6f3a6b03577cae4c632c54293debec6a063f7919055a8a0fdfb251b19ed380dbf7896aacc7369ce1d168e2a3f4fb7542a03d134bc03ad856e6dd211231fbe823f5ad2911ad42621a63a7b5ddcca335fb10de81ed5ad658afff58d41474fa401dd2f3d5a0c18f5ccdcf4fd295dd0929b18caacc9229f752b759310e8696fbeff6e44108340552b8c0c60dfe6994273543e4785a69df1dfc6f042cef33cefdbd7f721d8034e15f0555a54a15248814853535393d89432a2787ae2a94997265331bf339f128e5fa94923b1318d59bd99a8de43781f48d44bda08e56d14f6964975eeb899c29c4fb8ac03dda4a127d5b9981e4dce9f58932a1650fe79b58ca4d2f78b240ecdefdffa8790eacfea968f9e4769ec4b560a9e47e79093ba4944c84ea89b34645439e6349e47692af54fd24a52c7d6f4cf3f000fa9738917069dd58529764cf56b117b8ee4bc8c2edfd3f2348a501dd7e1f710ec979f2c3465748a1a9f54c00a1d17957548175dbe4c81638f60046d7997f7173ba6ba89fdfcf21268f99751022ebfbeea98eacbdbb467e4e56d34cdcb4f16d2ab493a6be46efc948b4aa37e98e73c75ddc19973ce39e79c5d4bd7c9a5630a99f3873961384ea3e226a7a2f2a8ef49993eb5e5e72e94da32ba5646fe11631c63ffc6719a14d88523c37666e280f3e7fc9df96541b7295a4165a6d71c0d7474c7409949e8349acd8ececef8cb0826b0d32c74eb7bcfa18367a88e584644cd41d5391acdc66667fcc313db6c0daa04c28279192fe3431aa2ea05044710550fa8f1345ef532f2a8f134543cfe47f8df9d5919550b68797e7e525fe8ba81ae726056fe960752b728288bbd33a597e2400a1be0cad230ff29fa80c9e543661a7f5ffe357e5ffd32aa1ef05fe379fcd7a8f13d22fcd7f8ff1f7b667c8dadf1e2f3f81fc71ed5ff8b63cf911cd5ffd813f335c67df1c85166c840cb55a25e8aa6c02e28aa964b5bf958f8de4029632c4fd1b2352c5ff2104e78e28c0354dd405751dfa807bba0a7ca309f82498daa1552fff22aa4c66d52060ccc7bfff240eaf730e2e732f234b9b38526b75a001c3bd37f125d402cc460e0892181681d4ebaffd00474541ae2be4610f71523ee4bf579b5db978e163398a63fe1cab8b8870c031428309cbeffb3719ae7fe24daf8f046da7b11d2041b279430734300374455f8ac07f21280a80a6f7c8e00fec6877fe3c6b36ea0f040588fc2e7b01e85f1c71199ff71c2b364c61cd6a3f0288c3fc86701b9210001bc0922eb4f106f3c29a2f0366666666cbc09e30ff26dfc8f137ee68198f0404af89cd597f0fe2500e04d187f98f000f81f25fcea81bcc22e4124c09b200ee04f10713c2916e00b20aa38a44d0735e941429b6c9b55ffada85ba51fcdba45f4bd1f756bcaa6d256444b9739cc5d4602ba7de92815168a0afb44856dd2fb243b653dc6e6e019ec0d7f0fdfbfa3fcb04b363be34db6a66b939d014717ab9e8630b963d89533d9b08e01f1a7a880d5324505cc886398f7d33086a1612a1eafc2f97124e75ba972def3bcb1c7cb540dc0717df58d2e5f398f8b391e4beea1fa566bb8bdcb33a5eca9dcc8403be33f846e23ce78d3e4d65b1647449894c44ec0036cc9107c9061a526fe61d09295941aa502d7fd2a003c9abc05ac96bc05ac763e36af79881562613db4ccc51b610d1bb94993fecb83eacff15619a5c29c356c14f79d08564f754c0bb5ec09a526bd95fa951c1c42a78f4749c29559d7d1a36b7be609db85fe685ee84f6ca157fe9c98819df1f7440cec0d1783765defa679c2eff9fef43de02f9367e4ebf7449d1ebdf2f0f4dff784a7ff9e47f8fde9797c7f3a7d189efa1576037a5c5512b45c261e4ea77b50605b0758d27fd4b133fe9b8b72bd35e91f9c1c96252519aaaeba494900a102cb8e81205210c3d49834e121d03b2684fbc42488ea34c94c63e11a93a6a1cf29292a2a2caf32aafa577e5f3d2e9f32aabae579a47ccbcaab7c4fcba7742ce3ae8cb4855d46d95c79069ffdb949b7fc9be55bbee507cb188295f108f840640da482a3a3de1f48ff27d3e4c3ac44600625163908d5e2096419d3f1855ef17b3bbe62cec72783944f797e1ce620670939978ce4a4b20e8bc5c2c961d96091a806a3bc4e932c43b8bea27aa139ae7d7aa9c7acf2ebec740ba6f2c340e303d68c80a23207618450e5e7e1b6f6a1f2f3ac80b29af4b1355bb97befbd6edc1718841a89fdabfb7e1b4dd37127f6e895b7d3640fd761b58d6e7d651f652eb8011353122d60814cc935a51a55e2d7f62f5f4197669064ca508ffc31095ab23c2f06ceccecceeeeeccccececec3f4d9ef8c1120c8911c90d03bcd9d9bddb1b8b203e3423f18a27962cf919829f109205121a9ccc40d4440a2366109a2205480cad00c80a211560b14b8ea2348164288a228de44807283baa7852e4480bb890a17a90c44fcd071b92340144d4440e4ba408c202206a53d8c086fe6a30248aa1708a2234253f0005315bf2e467c8cf2c92439325419014418208dd6700ad0ea9adf833ede73add15ad6eec93d965504f3407da64044db5251d74380ac2c2892896242931028a2555bc000914330025d54cb08276e2892f7a7bb777bbb7677bf7328e6ea5e65094a41cfcd0474562dbdbbbbddbbdddddbbbbdbbb35318a6c3e0b850c507a77b4df6cbfa3cd26de6c37dddac6f279e38dc51bb6d971c3db363b37f34df3f6f6762729a9010fa1fc2bc3738c7065ca19e379a9909190883890ff78fe333dd2c53db72ef315f820f8a7ef091fd503fe49f56d2dda6256dd8af1c7798977b12b7f1e5487e24cdc97ce44c55951b36e0d6d6b386762695a881d52ab25252d13063000498ae28c192b2bfec38d2de33e3128d7909a74ee3bd4f729323561df09c249b757211cc1ef1b4bf0bdd1d5a40df8a50b649b19edefe19272cf7395bf837ade7bef5ef7fffda2bb54f7dee55a66eeef7b15b67e63f879cfdf89464eefd234a7e79ebacb5bd79237c30a8ca458b2e1081b64d58b8a8a8a3847c7b89bba514ea44612edbe8845ff6920224affd91a21b666bb695f9b118d8b84d0b29b98748be35105ee69547d5fe2201d107eb79db8686b9886add815c91dbb2b716d0c42b92fb9569980231379230d328fe6b1c744b4d3149a327e9616626139da1a2eb6e5c5b638116cebabc1c8b652dedf89587f626b54dedfa1e01cf4fdbd880dc261dd8773e4185547a2820a040f41aa7f87d151fa07953573691167fc27a69e13617e135f9e672d24d4b3ad49a9eecf21a12b5f6e34baf2e55caa48ec846f30f9ca7ffaf00d26a698524c89c608ad168b3565b2297317b896dbb4c9362396d191c21431e651a2ea19899db0f44c8414a1991251d14c28e64b9ecd52336488f0cec4d433522966f2e11bfe2c4c3ea713cf58624eb3c9b4d81c9b11cb268bc5e60c605e5e3ad641ddf4662e2d2cbf4b61be9a49aaff36c36e22d84d86b186a5d964be82718ecd886ff8a302375f10a8d731d833099529e6e8ecd6a07e64e2d6a854ffee616bb83fd6e4b83bd3429a746ff6a91ca549e6906833b1c307f2f2e7ffbe0fc71fdd7f3fc0f776290a98042cf749d79f9f213fddf7ec13efc1b11b7f80db0528dbe709a862f04fcf237cd4d8e385370c68d7bebc574ee7ec8c3f4369928beaf705dd4616e99afdd5e0ce35aeb112d7d6a64316d25ce3a52e7f546ee4d919ff79946a22a209e7740bf8fe5493ffdc6ca265ea26f5a38afbd2b5286e544057766d0d379ebe24ba8d3adea6d3f188a3d3e9743a4de634e93839364dbab7747af8f42ec8118de3d435a2a0dd77834968d7349bad112b5d9f5f14fc83782f7f478d3a76e6fb8276638a8e59501f62b6851cc303cafd4682ef32ddeacacd61836ff89f3e9c4d22c0726d8db73cd82e7c7d5d8532154b20d57b70c7b9abea6f8373acf646006ad7502453314dcae040b9ed8659d8db5077aed2d5bc28540a503420f1135b33674a093e12c40e218bdfebe8967faab7a6605229a430bbcbc36c9ee3f2309ff3f2a95f9787791e2e0f33aa1ae665bc7c6a54f5ef4b064c932c1fb67c384fa78d85d296959516951696efb422d2d08517683d3d7f8f2728941304ec8c3f8b07d81b2fe28dab6b580f964e53fc0441c50e3f4d3c7952cbf4459d7329e5f5c8d3e4e4f131392e683fe9abb94caf81e5d91a5ae7b7b035f3a7d75d6f403dbf471e2ca83fe934fb9aaedaa3aa7ef5b301e5c61f996c3184a157feac49a2a29e3957f967673ac811184d5b88f301d1b32e6a1943018202e463c856bed334bfb8891d08317bbd66b32e6a23f07fb6860b4f10083f3c8da2e72b70f4888a7ad69dc0cee76ce65238773559d433577fd9b36de49f9db9b1a9cd3c31361c20f8295ed0a288ac269bec221a6d224d21f307e6d3640a3893b6046d9395dea4f96a095a4ed884398d7bde37c392aa3fe581bc548d5219fba76ca31a34977a3661d2644d9cb48954fd5fcc1535bbe8710a9593c6cfbf094d19bf50b7d8f368bb029f859a94cda029e38d43a5c0db269b42e537e9a22f35e94bdd2a276c0a75ab74da1c72a739ad5b4bb37103fda269a949f70eb717e107da2f739a09e3718eb359396130d50ae1cf9f4d544e581b9934186dc2605ddd7fc07ca1c6d904035afa12adbad3684bb425da52f5e762b4745a1735e9bf421335d9335a1bd168b4179a2bb139788cbde17f7a7f37da1a5e62094eb21d25cace84e015d33b5117b05998000a190cdaed395bc35da38c9c9e51356c666666661e4b162ac1064110fcd0719af410f652056511fc0ec3adb9707442b25b5d99b9bb9b6178a1f3b156734078cae9953f07e27c238b6cb21b6348b7626b38eecb0e22e18ca3d3834611fabdf7fdd327f4f91ec461f38bc27c4f0ce2bdbc07c520decb27c8bf7c82d01b042867eafcdd0294ab98ebe58de2aee602c6948ff499d0d92dc5e41ca8baefeebe49cb5630123ca33d763847dbe0c2f6dd871cc74d1f581141dcdcedc4af9ab3dddd45207377779fcd9b37770af72278639962eab123b2d0a47f221d83065a0c4124690a307c50aa0205330cc1233aeb3e0f5fdd75980ff90816b63531b1ad99df0b09e14043aa7b91128e6d0dd7fd37c28c72dd976a1b550ff01e7c1ede83e1e63d0f301c55db6824e5f7857af067b5cd27e6b0263b51b571ddf6df7be1d8037aafdac69c6f546d1f760f82dda8da461cd49f3ce63029e8fcd261dd7ffd4593ee305fc5be316837313549035af64c24a2a5c3981cd6ad6d8288a0ea5dfd55a40d87910e837143ecca1f89fe61a2a9899734a9c32322adaf4e25082ac776c67f08e5d1c685e49afdc1a07bb7fbe60d04b76d034fa80de4f0b481fc1bd8830a4f1f828f7a1ee0a3c653f827149fb6499511dd9ef3d8fbf80b41af1b59a4cb0b9237293e1cdf0a9acc24740393d0fe44564fd9944da139d4db9753c6c44253c6513e1aa8ff2e69d26bfe7dcfa32379edfb5ab7befdbe5df9f721287aad919a5ce2481f7f1c92d71ca95bb56e95dbac2ee99697be4b886aea085aa66ec881fa6fdd7ea8032c00aaccac270d9b51032d1bd6b186354109429747fe1f304292c5308ed6675d9e688114a5f881996b35a41d983908a9492d46c3a0297ada2f29cecfdd5d13d0fd263a8201121c363b6e6ca80eb45c9a0dcb85c4ee76b1a9269ba363aac95e124ed0316c32202de1e8baaeeb7e7b9bf6bc6e75dec6799bd76ddce62c1da5efaf29d5f28774ccccbfd3e4bfd840cb55e57fb18167078784176c8d8778f8197a9be69a060e9479773218364d34238872111045b3a259110c4533a2d98ca8685624039a01cd8488848a8c8478a1fc30d18edab9e4ff264926654eef6f83ecd6d25411ba35cd02e367cf903fb5710cf364a2fbada496293545f4f62be02a2a189ffcd80e0aca485d32d2f6cc48ed791cdb5533d2116db78924c4b4a36ef5126666e6187b50d8083f0943b48f5033d0466ada8f44747fc4f184d6401032d2cea800a41af1cfd95e3efe08c1cbe5aba01951cf84d0b2675dd4b396b5d00d347eb2240041f702e1ab66f469aa49268e8a08b978d3e4eeee6e775721039224e1323bb7cf8deb3ce5846e935bf3e6ed9f8668ca555325fc50c20f5984ac9202ea620141f73dcf474f8905eaa72eebbd238e4e4d87524a757056cca9f5eb34b7e1e8f8ceea0f4b70bbbb2c8fba76b89c481d22bf9c39915f8baaf9208a154504a55c43d4c7225e607676677766676676afb150e369a106456c8a2390581f77a03d7a23120b78109e7f1e8f3c9367a7c9de259eff7f1e5fda6181679b3b7ec33bcdd3c26c6b1ff3a9d41441d496b400fa82871f9808a5bea281f2c840b3f907887fd88128a514e88789fc004d77ff719afe2939c63ecc3eb13f516f7e6143bb45a98bb5a36f5650a9dcbbf8a09df84d6e2e624c933d95e09fbf7371b04df7418fdece30b703fdcbf4b82bc474ebd4a44d7b0cc29529d746b7b6da58afd5bf2fd336627ab5a586a0278f8996d45bd24fb57ca1ceb9a47f7b759630d4fe90674bddfee6474656b7df19cd48a86eaebad18c92d4cd6773fb6fefd2adf9dbafcc06841b76288285926b89134860f1ecb25ed014093950fe0ee830ab22072fe020ddddcccdcceb62c540ad20e2c4122d6214394110314c6f6b31e0d06464440f458ab868a2429644142a9210516406126858f213daa0ee7b1c6b1e19c6318eb14f73cd6db1e6d9692a22abc74393a7d960fe556c51cb57826e1ee7799dd771dbb6b9bb4fe6cda793208313473b14b5348184431bbe4e23d34bee73415dac19ebc00721eeeeccce1b4f66f776253da91d014612417c3cd07dcf4ba57e64f0191181388c37784ec42b8a9408519188a00454f480c81731081a628914454a569820091a9e7c5794a0464407198d99d99d7dbabb7378c40a21b57caf1ee1dbf438cfebbc8edbb66d7edfdc260f68b948373898210521995008a1b933cfc9734e9f93594da8b8412d7fb21b75ed535a9951f76f7cd53a9aec6e1860e4d3344ecbe9d636418488466d76f473bd719a6daf69a71a8711ef594f4bc5a880f21351e0088d2882848e5e30272087a39a0d6666f73ccf73f6e9ee9b3405915aa650e09344b4248908a8d5b56c752d5b2dce61b444cc0aa35aa66642c4c2f6be267a33bdfbbbd605922ddc87de6cc9bd8f364d36c77936dd363b96f3fe9bee5f990e4258eb13ed0889d6b414122d6c9e328aa0f375b68679bb14de4057b98b421c3d7030b033fe2a4ae8f6b3396cf20183073eb035cba1c0564bcaf3a8bcd3dffa79bf4223639b9a7cc8f89e948c6779fe1e984f7d8f8c7f7916984f7d0ecc987a1e735ed8c5260533aef7b7fc0b035bd39e4baa49199514d1d5e46260c579a2a48d20d06d3261b174f7245c19274c4b5b33756bbde7b8aedbbca02ed70a3a4d2ccc1d1a45481a8dc6756291d3eccbc325a7f17cc543cb223cedd74bbdb494fa9c7bdd9d4be19e6b7323f3cfcec0bc1bb613ed0889464b21d174b6c6bddfddb1fb1c705c5fa57ce5cb5b4a1982da8ddce6b51729c272eef771db6cd431f55b3be543433ea55c4019b56c847bda743f25e81c3d1fb706749f3584ced5a4ab28a1deced20f1ffefe3b3c5b73aafe18d89aad66becbd4251c4d93d35b4d3f2a45a69629d269fee43852622d656a7f7f9abca8142e3745b9746846020000d3140000180c06058321915840281c2d7a7c14000d77984c724c98c9c37112e3484a29638821860000000000002a008188010df3fbc11416fc68e1939ba6d428385c039439c70c73e9987a22a438b8b27cbd3f0ec0bd2f1f22d8870c8ec036211322c125d046ffcdb2a9682ecfd7848c359941eb62eef31ea41a0e9b0f22ecc16e6be837be6b49fb4794791d7be959424e05a7ff7975cca5eda5be88d77d379a1029b74aa3b986c2e6ab6052ce5e6d389b260c3852d523674af5e37e735140f685ce331425c46ef50458db95b84efe0fd76345e183d6e036bb9725c2e9d85b0a114569fb336e135508a236340e3d4f9a84c68fbdd4043d39cba62339f6697f30b53d7440adc6af45b42a9ef1c7c420053c20e4b87035ae92f842a1980ca84a01b4146da423fa5704e52259f53c57affb6d941f5ca24f58482a051301dc8b753579501af73808271fa9c0c101de25bb1341a86e21ba0df56907a5f7602ee0ca6f61158c2e1171b889bbbf67d5decbf929e574fd363e6f34f6f033bbe9d0ce6ae59df543f4b5ad0f5cd38eacd8882e9400b8ca96134338d0060ed4598b28d11be4b90407759965c2031640a104adb086765c590900c830007eaff2eb4dc9aeebf581a4dffdbfdee4d2df10eac3c7f2dfd6ff44e8faa60729746b02a1964910da4b533abb72d90939ff7afb5f288cbc1bb2c8744846e69967ea7750d08d87093ea4586b234ac576fb484b9a2b67f5000dc66bcd8d11629fbb0868d2861964711ed1c7088495f57397de8d4a309629a1d60c37c9111f46aaa07df2f60a789a99d601eb52b2b87eaf928d464531cc7e616f056b63c4425681df837349e18ffe0665ae9fb253da2fd7f7ebedaa7053793adc4433f30d94d30558bcc756befd89445c16753f59b64fa10fed62d23c4cbcca728eb1fe505c37a1dc8238ce0b6547026e71310fe90e73d0c730e421eabe4ca58f290e85bfc7207c840ef50cf28491560f6d9d8b4b19799f6d4d1cbf5296b7227dec1b4af47bf42b52f3b52852821db91d977c65dbb011e82fbb65e80d1b6b753668d8185d961abc42463504faf64a8ccd40d40da7a643e0f953cf77738fae3b8450dc3f88744e504222eaa0c036d13661f55d427d44c2b46cbcc2279e9fe2d9e92494a6bbe651ccd1d5af1906c83f25a542fbbecf013867219334dfd11a35417be63b4c2bf85e68ec4c21eacfdefc7902456f12be23e185e177779c3f78d9a0803cfbd8dcace043d3c748d10c6cd1fd9f34b0f55003326deb343fe8dae37e632b0803713f5b0473dcfe09f2d421053924c2eb654f1ef0897079a1909bec637fee543fec201de7c8caa3ee2046af66d309015204a001c4ea0f83865337b95722c98f149e227d09154853184e3657e2f15662ebeb3477047081690e22c62b91c12207ffbd4acc6a948974686815598c5a787fb28dac43ee0d361bbb0d3e945ac7c283e46ad40634900dc1350ff6f9fac9c285b9595ad7f4c281831772578369256fdbae12c7c01f0a86554d72faead2dc2d584589a82fd6b3739ae140685a093398e39ab6da2d3aef3bdac73a219bce352b3ed8a71a64741e8d500f011dd18ea3b2a211737d0d6b9ceeec07f7f58ab2a8bfd17484cf7484d9f9edc399df64d1d8329e6ee816adedde4596aa0ed2ce129ee8ddda18fd757f64023078535d1c109bf4eace3aba2b11e824656104e1bbbc0ad1c7206f3255041dcac6317b8cb230a81ad5ad58c196afa96b160506dc04acec05d3350029c34483d9b8990c9d32aa309adc08f7b491adcf3e47a45ad764f6024d1ec84dc78dfcf17038cd800167c74bd155f586ee9a626db3ec90c8a89cc5695601388dc52059cdb936c6c1281642042e301eb352ddb5d6a7af88ca9bd6fe37567816108c9eab58f80525ddec093759e7e9ed9d5f14954a5b9ff4cb93ecea763485445cd3ea8ca0ae5853ba7ef3fef741627d1fde17d3ebdcbf5f48bf031a2b2f27bd360a4b536e4efe4ddae0ee84e3b314c11f98ae123c429195f4fdede52e9e6a7f7c0d867ae158eeda51c704bb242a5548f92743812c2124edcae58c59b47cb3a6eb33ae1aa8f309153c7bfdc3c07f5f9129f16ecca4e9616d0ae86298611aaf0939b63e3e16cc5811e971dd290654c5506ea473c3c5a1a21434f1e1dd52a42951a9923228637f30edce85fb6e42209967c60848484b5e8db2a00c53ab31863cece850edf8ca16109583c72b0dab416c0f9bda585e091ca3829c40c0b9432203828fc4b3c3db08ff4093bc61e8b02a22a75de6e7e51fe8a4ebc88b6217ca056c90ba61ac70fa9372bfad57a9b937d3aa3fd8088df73cc272f4bd6b96fc5aaa1dbe4a61720dc781225d90b673814afa0ce53140d51ef58cdf15e7533dac44f8d8388fa25a89b94f235a44935f5e75ab342908252fe5c5c0ce5700a8009cb8061de7a99d0d6a56df6dc767e725ef29978d1e62294b940a6fe088b1b9f29f3097127957996fdc654a89a6e4bfbcd04593f2ff565b9e794030d3d9d95ed54703e7a0e4762f4a05f10174f4889fe5126645622b1e311eeef268d62ed3555e1c38529359b29cde014619720c59c0d2e8f7a17493a140ac916335708ba24eaaddf103ad728f2e7a10b77b5c9a737b76026b17acfe11e6f6779852dbf661d56762db623cbf2b8050ffa974d53dad7aaf9566b919b7774c0efb0212a41dfa65e84c27bd2b5ca9ae31ad02a34c7a00db57b5b2d81f113350a10b5fbe747f8a51f74e02ab8b3a6238e47a8b877c9c63a66219e6b0e440e35ef9379467501042493ab185098993d052fb57bc502c01e9f2110c4618c72c4678947ffaf2022cc0d86cc64634f68bbefd1b0fe8a74ebadeb1013db6b19a730a24f0409a85c80e5759d0f8d225288e0430afb41c6f48c8d9bcc1d6acee1673388346128589a3eb01e6be135d13eb4c042ad5b1fee5fc7b8407ad6a8ac11778a785105e0da8ccf8b86155908791f15f11c93e4dfc2c9617e4a0b246a3cdaf7d7c8e31800d588090eaaabc54490705670e4f726ad1caacb41120cf8062cbf3e00433aa2855a9cd4c72aaaaf9d85c6f015d7001194346ce6a9411a74fc147068890c2715d6fcd06e5d36cdb157f6e206062edce0499fc2468dad53d73bce1016f06a5d534cb4b9b227ef86445db74de10271c7a88a014c344e6911240ee78b4c1621e1b1f7a87964034a6f5bb9a7b5e8d3a7931a1f53a748209e099b771964db42dfa653315290639f3503b06347def8d35d579c9e0a6fbb0978615f728d1eeae36e6da27f945cc05c8b29d2b0752b68c04880232cef1f964e66818f6d1a2a044030d23928af467772af42de8023e2f503a37bc2972e2ebbe8cbabb05f130a2f4db22b6f4452ba201ea3c16d9737a898de8413056b292d1e93e18b393624f1b6af4982db65dc955ed442d92fb2d4c44295480a50f4a6763c960f656ab6d82737c5b4764317905846e2967fd1fa144fe84e828ef904740b2d3509a15568fce0733469a0af51749040467c9d8abdf3ec86678da489a86c51ccdf20d9bba9c9a10a21493acefb89f4124a01ae9b5c36f2a21321b192b18c7910a134bbcb8a326d3a6ce1a65a4385aaf1b0b5c1a8130b925c92fdf42c98eacce4d8930dfd0459bac17a15c2275d1f0e214bb9edd2b674fb403bc41598286f41ec868fb086ebf84341617d1c820cd5301caa7eaa34906278e4d4f4011aff783948690480b6e30b670a58955b24a82f8e8a940a2cb59dd548066e16a04ba71cb36f78394bfcd1453f49415dc2855ecfdb4f42d28849ed44c9f51e23a53a25ee003a6d933cd0781ef91d7573db0f63ccf87cf0ca26be8495eb1e06d104eea5a87fab87cd974c1e626a745ef4685de7261b4496e5a49462d3b67568ca821d8f2f65c9577f6fd594ef10a414bcfaab2d96d556a4f8fffd00cf0b3fe662de8b9d178203e0c6d861d95f4c70e8913a75b38f60ab00e3abb0aaf7b5de3629a8d448297982a21e20a019fac1db5e10a33ba3c00cc301a40af6cc506deaccb982b981ffb64f97a769b91b4de11acc8ffd8694e505899da04900f87f65d37986004c1222a81ef06be634aef422a700bf783c7b3500b2398d3ebd6024a70cd67e3ed21f1c2c27668981d293d9b0ad3c9b59fa1a2b38b32c5e18ce0e5b9ea9491807c5caf9b7405f5e6a292ab53334be0f03f8d750f7f82848de80519b34628e62fbdd9585c772fc459802705df60fe0831dc399ac70db73c6a3e542e320c9fcbb80dc4a3e29a010ba6b5bf5f4cebccc06ac54f1c33407e39a45507e2cfb3bd5dc2e451e36d7e1b5950cc3640840e89bc45c0174c59fe31a22486cf2b62dec2fe1a9ac65ee04c82ae9c3946d6ddac1a8053ec01a19a5cfab8afca6f3e0a7f9bfdc03c568a5f12d166e503659993e619d3b145f11c7254b8497961848cc62c47714d43cf7f7b84e643dd1c2c363b73383393b10324bad722fc410b60c6d38b44f009ac425500636acf2d180b34acb4c72b3b0a31f2be2eada2c785284742f21b81938ca1a52f7e3dd27412434d316947f9c2457ba69b9c5ac75cbb81ced1dbd0fa701a19c76d3942fa5e381f2c0c4f274cec4458c4987c3d8903458e47314903657956fa29af88a22cc49cc08ac33a9678c5f318d4074689d12b56c90daa79cb65e40025946822e6103e18c8e9b8910e7a59fd788c31fc30d51a9734eab0f25e9090e6a26eecbe8da317d7d8a8b99a60e2dbf698ef4bb406d391976a69f7478027dd3d5db0ca93dfcddee1b8892a4ec8eb8ec66fcfee2593efa570ee13fa7d26b7d7b6145899bb7c0ee822460ab2aeda0b219cbe3d678f6e3de043e3d76d1fd1d233497dabeaf31cc47d48591677c3033e7b0fde8047fcfd1d12415b3dee8d6f06199ec55c04904dee665234f66f59ebf7ba840220fe5cbab3637f4ffa9e8a9c59da675b25001136619807f7a5acd1319ff2ce814bcbb01c3928bbc425c40caa166eafb78278b116879c98756018b8bc8a94922f4a8eeddcc4c5c9c3de741deb995dcd50da11232bf78e242916cba97ea1fcb7ef479d55209e6c48913ad83c8f110446f7a1166c44bf180f1bbaaa104158ebbad2ea2a4236f44e658f9821884ff8f90cfee783d4a161c9a0d12386d3e27fd98a27448748ec9612ba99a66258300558863ae49d1ee342b9be15b06d4a4de1246d8adebb57ab312861647ed5ba9034fd49c4971346cddb1b47501dca38fd799ac04c0cf62a765cf339815d62915197eba18fc5959dba18e731419e55eb081613cb29db10f4769ed8c796a4fa5a2f6df7708aa7ad6b831efadc91b9013ad3c4c976ac2c3894096a117aba338b63d1c61ab4e049606b054989c751eb89c4bbff00a5aff4339b6c29e421e330014253f3358bc34926ada2b54bd483e12a9800e9297e91bff59abe75cf90fa2c53779cb012fd061b25e5ce26370ea529c42a5ee0bb88961a61f4d3dfeefee4c03480c6870bcc18e42830b5bf7028eaca7d9f6c3d50378d47c0f7b354ddd9a260e9ea118e411b644082e9a92994e94e665bca2d0670db440672c70b0027a8ac42ac6437f400cd99dccb6c74089f382f314dc486a2f5e3af36915360642600f87070e3bba4c06c6840b2179d1a1003ee9842fecaabe753511835db8df110998418100b370cb6921e37949d9771b3111c2dc74a86fe276d68619a752f332201ecbf315138f377eef90c7761d78c6e268ac2b2b9a9299ca316065f6a1b75defab79ff4aaa3d1722a406b0fae6686b6ba8ec1a621f58644ac702182bf5d9b274b863c83c7c608df188a437eb6823b2049135837851a590c1c728e5b745788eb0f4b5808975b31701f4941b40ec6e8133b80ee02a69e14e7bfc1149fdfd10a62a70fed82cce1e707e32ac6a11f59ba9ded4e25796024b1c729b0e9eb1a9e5f28f7e29ea2a7f2c37474df742470a44ddf75e180414b8a10290cfde0d97237c67395e942d233be269c6410554e2dcc5ab313af66b608c2aeb861556b383ae4629ce308778595f389b974b24f5dfb9cb8ac9019650f80ed15f94c67dd048a858f6ebbfd8551b393bbfd275495eaf6c4229bdc9bc885bad1a13312a8c6e73cfb003b18d924c02af490f4e6c86d3b8cc83b8f493a2f89a22380a5d9dea0e47a68d950b697ea7bb8f1a69878b6d870f14b99c446cc67265c2c78152dd674e4ad9ecb4c76b62b77c0d0f58655eb1b1a0144150a7926bad4a49c39b6ef8af0218c05affa96b0e31ef895f9ea0a684c072c18cdb7c3a6d833230eb9a91712fee75167242de473aa6e5b35e6782982ab068a5984aa944c7e9c85bb1ed8cbb05e5d140e0736fe3b4b774fb72428d714a7dadcc9b5779e9b7ac2c22d0e35471af7d2a3ec91bc49b5b58ed3c85e415407df96cf8fb67634b8b35901f299d421f8d7da1041f09580b2babb23fb6e8c93b16c1ce6eae2c60720211843db7a5f857c7b1ac0a4a00515a138934bbf88774314ade4b2beb1ed3f14dbbe19792a026dadd2c3451881689e228cd57800950e378647520f372b9d0b866d953312e1b8e9248cc12951b4cfe3e32940a3911efe1773dc191f220a154fef99848803cb8784cb8d8c882c8bc7c15244251553d13167e196446b554053df7da43d06042e5ccb7a30b12a6e9eaa6a988c2f6748dadea5c6ee8313657fe6ec84d5567cce4b24ccd760fe080f4f465aad8147d8fe1a317803c6d2aaa841f9e8e85983d9dd9ef13ea14b104248559a6d4a790ec178f57fbbeb14601983daeaef49c06b9658d34599b596b548d7d161482392eec030769aea81d1efc9b2a77fe0ce54394775e9b9fd4aafbd44db4cc79e8787c862e9e8b3c794e9200521abc41c4952d3ce651949685340ffa65219bfdb6d9801c26f58c9eb53353e5d4d085720e2d445b17d90551572648b6941544171101571e88216b74b077384a465568801c5e6ff331bdb352f2e97a7539c446949560dd1516b092caa3603a946218a40b8d9fe36957196de6869564abf3f47aa19e833ef78e90ab46e1590a113ee67c415576651f3e91e76481e1919c35b12d2a56755b8e5a44127162cc2abddb09e09052529cc6cdeb3e58cc03cd0e14fab33d0afa33a93e170c6a0466fa51114a1f5f3768c1f23e4815cec692d8662a0bcf136a623067a60f1c9093d6ef8cec51d4b3f65217b9a9b6f8a5ae6598004943279803464c95fcad3a3a000fc1f9fbf002f3d26873b4406d6224c261085d7fc4c1ba9088031e5b0e5f1f483d7a1a4ea80da9083a8d0bd1e397ac591886f855b2de7c375f0703b5398e0b0a3440b19f3cbfae6e09f492f4328067205035224b6a4fbc44233d78f18cb43a13970949f5834c4f40b1495b8e548efa78bfaf29955bdf5746e76aca1ac9f4b15e4184ecff0a35fede4c1649c6993bb28136b88929f0dc17260419ded7ec09d8d1e19b4037e48f57d2de6ca730eef147de7ee11336b3594356a2ab2657f2b1e720e69663d3fe36882c5ce9daa39a988880b0d1ad0fb73f660e15f6ee0e6cabbf6624669964f2d1207bbca2bedc8997697472588cfb9bf14f993adec19cd118909c29f31416200e89b843e74d79d0df5c610ac3c5f6ee48889c7e1fb01490cb1a8256ff117f837ed28fc761e81049eea7c45f6d130b29c52a065645100c4b000bd424249490a1d37b6443dd88601288d22f39b894501d4c1c8b64495c2df3d39d7efb21540f646cd9be060fc7c389e023752955d64bf53cf5da8b7fdf5552194bde3925aec7d23d1b46b814bd0ab50e82da3e777a1d6b278b71ae994a0ab2e140e14b0659979a56c2d45149dc04231f9b1dfd1942fc36a95864d4fd4da580e187c3b36e400fa8a70f193fdf727ffad0d95248bc1e2ce03ec11d5d8d3e1e32f331c047cbcf737da00bc35460330e473ef7166fbfc75dbcf387be533b00e9615d86a430fba7663af55690463d2f715a8715333b1ef6aa2e0170c4d2e3e912df3221e861128efbc10eea160079bd593ec5bf4af22eb648c8b45bee1b2da6796d50512177a8bf1025f1a4da4a144a5d8341bc40d4d8837327f36fed53eb1eb9e690396539f699cf9ac483cecec692175d619371b974e3ae5de58e2dc082219fcf1f033664986f15bfdf4941b48686c549143012e42f6123f4d8be8c19c510f3b506a1b68c1eb5437dba20277c11d94bd94a671b2f0f071c5b43c3c1dc2005007022e4c1b5c45564005f5bbf67b8a09eb06ef25b36b38945730f1d903fa8445295c71b9a706212cd02cc04c9a7ba73025dfcab49faa1776fd64cc2419501071d20d37c7b001b5b0a4b21955be26d966eb4a731ad37a0b9c8cddc0cc27def34a06a00cc8edc2d982c4eed931cc894cbb3f4cff3933b7151b71dd7f132a195ab05f9e420f3f6ee5a6bd2a189231887b9bd3b46f3a7b8864df31537c50ca7500f13692fd427ddb1453dbf872dc35c36a7f88bb69668d8672b9b48c3bef9e99e9a5e1e4d2101ae32bd079e144039325070725f0609aef3c552d03e5fa17041e3825db33711064a59eb06c2f9b7e36834bc715a4dde151641832f11efee1219db1419c1000fd6f221b4ba9f31cbad579905c6ea7dbf142c9da8950065a69819f99dc4862146bd2ce2d48c2a83d5ce0b1ba64d7baac7fc7a87254fd1ee0f762e0aa608338393eec2424f6fc169a6a6969a6a682f07a08006a03c797c0ec2392813cf6e75fda81bf6c3c93e844b61747a1c5d72b3bcc9982ef8af861e5299fca2ad589ec227ca8b1030b63a8e83e4bfdecc7abcd1864be4b3b45267731dcbe4e8d9752413689f2e1c50f009f438fb9ceb0e39296c816c124d44caa09bd2161db0f8911a094c1b487471575d552dbe1272e996a0660d2daa49fb03dff9b1a1252ecaa70971217b4533a0e7e59d8f07871c69f8ffc3399cd04af434440a8c30ffade43a287eb3117bc9116626f4c1005652d28f5468ffbf4f4a3f17290e27b06c1a0f4a37760122d4c283be28dcb9febd4b063c1a5343f134177e152e99bfda3fa150d25c15b6a18c69b8a46c953026731f4721853fceac236415266e898b105db0a3121b4d682d90f44770eee7901096b539863155e3e28b8fe235e5d474b4b0529f0611f060379a3e4f37d8e0eb397c932a01ed678d9018242fe6eb4b5d36be482b957c0d11e7ac0cd842261417289430d12c5d081227d207facc291cf02d22a75087ec0d9cbce192600c32fc62c5ed331a8fc5e463dba0d4a0711a1545b4a50acb31a43f95991d9b746d162c099f7fd8f1221224a8c416fb84a589056def4002369655ae7708909b982b4e7487b6d6089d9d0a9f7bf113468af5364ff749831a6c407cf782f2f99927150d93ca91b8587ef3223f2693fcba2074ac93fcdcadb7e89ac564c4d16a83975526e813790aef8851ac4b6adff1e1c41f84ba7bdfafa026da3e291802810610d78c34329825710724dd9a5367515d5813ed59b5c8959392ed4c462537da136ee3695e2495a737e5ebb0508d569ef820045d693719f549346aa410975f73a1b2f062bdb21da90df7b420a55a0b5948b63133ca6bc586d5c4117d8f1877f3f13832b0ed040127ab0873a05d20fc06e857fd5d43400a8e6623e5253e0a8ef4d85087bde4fd177122448e6abcf6803832ea731aa1c95fdc574f60328eee7304754f625f27681a37264897c84df8cdcdff3eccaeb95051646187ef0b716d64b5043189928a3710ff9e2763b91841ce42b10489414382b319a65ceb0a66571213ca6d2f546df4fe7d8668188389035e5b435d5d719a83d8c44079dfabd196f61fc60c26fddf345c7214cb6cdc80050a7a1212e9cf3032be97285421af45af006c4a28bf674e487d13653d141eaec1b729fc085faf2d6c6f3dd8769078bbe3aa86fb8b4258f6a344a2cec17070dfc698413a5db57ab9ed6ae9850e6b8e460b6d6c08853d287950af928d296fe4bdc7ef793f811a326f74a23eee7166fdb83971e174f140f2d243c9f98a33cb8edbc18faf98fe2637196898be92a3c94aed3de3b5a30d233ff5b4a22600a5b91174c649e5e956cf66becf2f9b741132ee7f8391ca5ef43d3f45f96f64a00b50b9e087589e5c15c2f42d57e0a95e1ccfb449a032b6f75a196323eaddcc37f24cb75a1060dffbec358a00b0fcecea97d04d09a50a578f14c92c71ae60ea816c4b8daa0e43a61c9ecb19c2b557b2637445416e91b1ac0d7c6bedf4cf8298e1d57dbbeb25a25e3321c2af5803a4d1a14e3921e4dd681ce948d9ac27b82a43f6f23119b0de4ba31108cf02ec93c53038a7163f2539588f0262eaee92e66ed030cf299fa03dd74a3f0571c66b5e76f95ba204de9d3b955354f53bc7509dad7f8e7169de94c534c0cbc3bca43e853482439b71d5c67a01bd0d036d65d76e5fe1854d0e923985cc151abed7e4ae614cb4f20aa988924f0b0bd7ec597629640001583632bd388419db9e27947ba6e93427fc3082de2dd24a2546cf3b7024f9eed1b42df7a56b588c888e88816a1dcd43df2b0793856693bcf97abd227ed703653ece68694f8d2c07495ec490c722d02331b960d59c9c0fc7ae2b55c4da7ed976918924dbef442795c2cc922f031c995bdc79173a291c0e13663f964288efb98d839289a615f8ca700101a22c7ba52934bec4f54fac46b11f955469bc14bed644e40184d12a353945c624a4c04f2f8ec36ba18b1024f4b01698c1e5f644983216ce2e3af9a85e2206a5c683c013c1e9c06ef95eff5ae4180e3c9c923eaeb40e7b57180702cefb6d368de9b81f2f6cea761bc7a4f55fa60eacb19229e5026e68e0892a7dff4183db1ba46ce0bcc19e0fb994accd11e87915984c1a508e2c3487fcf240e721b0cf35b1439a51757118b1c1481c0014e1c9d78d7303623d9ee86291ff9589d9a82c7e2d28b14955a7e526b096a8b96df6bd71e7dfdbe6a0968bd9d283bc7b347c39854eff2d18407e77e6d4365230ae1fe5e3e35ed5f49ee1e0b8465004dc2d0a3a559615b511ecb0c0d88487908ad1b29f9969cbe2935093c030dfebaca2454ee37322224fde714d23e4262e08f87f0e063a0bc9fb98fc9e2aae10812e2202da38311851983a9d9c901408159b6ddd435b87e4d29698496557762d9e16bef2b71260ea3d507a08db74187c1e8270dcda32bd8a543a47b1705df594dc0d1cff4e0e3146a0fc3b0778d912e4c8e34b56ce63e880558e2fe6263a4f5a80e963e5b0ddabd64c5bb73a6cdfac1bc260447d243aeada03a64d8dd5f094a2636bf62421f8c25d20b4b26d913508c9591420143211f55929e5b539882047029dd47d7fecd7809fc434b1c3fb8a4a940e9115d2081023f38bc76faf1dcfa48b46b1e20e6915c18ebf4328ca5f54858fc2f4816df280569903e81e6f68db31796c12d24223487aa2a178297a14e4ea390fe483bb8660f24e962dcf05687402390042d30a2c35818fa9de9316b3c79627400688daccb7d23d96e6fff42d7f63dc560675861cc35f5260f6236c922dad351e69ccc0756f8ad67b6e323a13faed0408200a0fbc0dc3780b22e7677cd3b232237aac64f862f33f64084ae221348546aa298c789a0d17c1caf968d3a262a08ee9bdd7653747dcdedddc3dfbd79be29c625f919f786811dd8ea280a060b0631b69941e50b0085f1dedd87ba954b097f5cf7304b2cf63160351c78fa4ad3396b4e58de021136df7c042e51440bf92556677cd630be115e14070e272fa0ae6a6f9fec24bca37cda4a40ddc37c9c204abfa6af193787b6718eaff64c0ebe362171dceaaddc6cdb3b88d92613cecb7c832ab7ce503aee2a0a64ded8c213b91ef35556b84f542792f9b5321002197392f180ee9a78cd21cd98333c305eb1f53372745721af6deb742a1aa622e7dc1964e377dbb9d319ce33e94d11a5d211964bfccaa969003e1d533537ea2e52d46f98bf8917f57247a4fea49c91f6711361f04bcbb320dcc97ccc81c84eccf956111de122cf40fed5e855841a1b4546af842fcf0a4d1645c3fb9505e887ccaa61389e4825dbb23ba77335633c895b41279e46279e02b18e96f566753825a7fe98c2c62fb9527edde51e43ae85263a1ba44096ee8135f2030c7efaf90720e8a7cf44a58953d3d6903d7390dd5dabd20ee242877b680de21fb206a75bf68834759d4a87d31dc2719b513ef806da4519b6271411bfe9afc5b8f7b1b6a0cb0ff02895ef908066ef2609a9730be939a87ce91cbb273e7c442f724593e24b06a9ed26d1ab4a009e67cb218ca5798f35c26ca5b71a2b065c7f52070d5f5f6ce7389f3654b49e888bc081df70334bf20e2c7b2276c07dfc2dd78e0fe6f260f2205c60f882f14180ff33400f5b9badac39d18f13ae12cb7654028ba0d88209d560d02dece6ca161f31249b7282b149b84d973de88b45044d236c23861fd6bc3884989f8a667dd7226a65b7419a1be57b9f50d40c73006ea32745945deaa4a7cd2cbbcddfe101ca46c72129a295db4c91f21895fd63dd4bb9cdaabecd500475633b252144fc64b93ccd6815bbfa47e73833511ac69fd38559a9a08fe6bf67e6197f2fffe35d51b0dca43059e8e54d206b7ff5fed050e71462428f233764f9cd883067ff7477984140b0acdcabc8ed97b6c001a6bb506571f5989e750145cd7182f8217b1e786469987e171b8dfb6007d39873a0c2088b278a1957d20d06073cf723b09c01008c52f118d5886749f0625dd612e5681f8ffe209a0124e6d0df07a9aca39029feb3de5840e3e61754e319a7628628ecc7312b19ab64cba12aa665c25348be574315432a751907eee057ccb1655b97718795713db1a76ae05bbeccb77395c9318e8fb539bc6790098a7190775ebfeec78ad4fca06954db4a18275fda419023f85bfd0a2fa705d335333ade35d661170fc0898a8f0759d3b2bd097a2080119db3d99493a626e3d0c5e23e797225824442b5935c28e2223020639764006eef088eb8f57a9d129859025f2e1d5cf16ecb8a6bc6141866192d813765ec3c215f2cad6c0de3cf190d94da301551af1847db2e0796aad32049ac830c25a10fe15fabe4fc74af39f9285fc19d6be8a76e55b190609581c8d070d0f708b8230bd269ea6c1f2d7e9681009511c0c9d4394a90b6548963b35399633bbb9b054a6b36c44f28cbb1860b1fcf65998b991c981b528b27147e7000001ef66a784360cf301a1bea9274bd7ca70baa9ecd245bf84fc825de6e579c629aee8f7ec0e867b30f742cdc2e45a9edc8c890b5075a8bb4e7c2df6c7e4a4159c989d941d59451bb67695a00dc60474134656936efaeaff697739af4a57f9272a9a6aeb2507b4b536be4643ec2189681bde910fe99dca4479c6681937a77e4f1432261a064efdde8819d950b5b00a4bcb1a4eb5b1a696ea43aca006ae917eb0ff5922430eb1f772f6b97ca30a578b4ec97585ba188025fa12ada180e563e3387a2e2d875e6db425555f31b79dccb1475a24fed96d52316aaf6a5cd932f85cb107c7f9824835859b396ce9302b104951c9c736befb0704ce8f5947894f4bd204065d4faa47f212dedf21149a602d261954d7cc52a896e81d7b578b381f9c0bd7694ccc7bbe1806537cd04354c002680976308d4f637af2d4d988beee962611a905c8319e3d360445f3741e7977eda96c0678465a7e08f367be9924f75bfbdafcf078b89221532a0bf145e6b5b9454498d4b35c2f993a346b39bfe603c57969a17083a49d724b09b6e2b92adf050c6e40aa8f90d38b5bfe7a3385764c05096cec3adb24e6e29fed5199b2966911bb70dfd6801ba3288ad9728f00ebc8aa431ee24fcde9f0457780e88a57a7872734befd65c282c5385c13cf1b7e20dea9f92ea843e015f2553c27a8697e0de286f011d7de2e5f185bba452553ee65bf820a04309bd75dcfd79eae5366060f09a9836a0723c4e9beaafd9f59ef4c2adcafaf8d0446cb7f84699a7efff1d32411d807e771e2e36b7156613f36246b20cc94ab67013d613b6b38cc7799445b435f1f8c0ad3e8d2a051575de7f44e10f00f320e664aeff8d9fc5f4ef2eac3b64a6db536b18d5e135d0dcd30746fd57fbbfd3c5c26fd1062e76e9594cb2dcc424cc8145025b79eff727ddfc86b24e3bce3161eb5a3471a1a60a12333c7c49496ea072ebee09659f78f7ad3dcc29bb7dabd0b1a4233f623519f32b6604c9feb7391181b2f6d304024dab983b833dccafd795e83f1817a87d00618d12008456ff77f440214ba82fc88143e5ff403c07a82a3fb39ddc2544d7d45ed2ffc267034b3a60291be53480a266152a8a30c16789d4f90217a19f7e5b4fcbbed992bc6b064bf494888e01b2b91d04d362478b4f6a653f4b7bba916655cbbebc8bac47745b9a16e34e4c709b8b05ecc39eadb585c847a02bcc593d964e63c423e414ead3113cada04b6fd6db9fec86f951f3a7b51193ffd63c8f81dc27106535c05c26c0efa52303114f43ac43a16f757a8a9e67f4d85f1f5cddbc190dc4f58f6f6333e0fc847ae275addf512e75c638f9bbef4461a0be4eece9566d315e9aca6265c8ae288fdfcf474c3e4fe3023cf1d4fb04e1222aabb1920cc118b7f489da1a1994649d644482b00764d04064ba7d23f054957b666d8012eae22e413485bc2a8d3ee75fe0a8bb80582f50ddd3f5d6751d44c63f76344f6d220aa133df4de18d86b5df2fe00c6a2fdd0233b1849b5a644dd3fd3b3d137f1a4597402c6faa9fac072a9f9c55106cfa8f4a36d3be334585445be77da1e8c072b20d8da1d464ec5053cd0b562f183cc8d8f1a1363aac40acef5dac70985f2842507870bf9dda91dced1a5c2c9a74eb0be67ae46e4ef49945208933da97b2a177ba5525859524f4c394295cf25fde937e1b4c02441d128a4345dfc4eab765004af4a97e88343dfd3e93521815972bacb25ca5b7226feaa98986cb2a1d4fa6634f04232adfc92cebb9f66b7bd5373c4a37c323f3301fd88708c52a01201ea30e6194ff2109128b318dae1af48bf420f4afa8e5b18236acd8717fbb265a7a72bfe1c631906c4b794e707b5ba2f94d243709a599da6e28724bf5a080b193315f9bb3f268f3f0a2980aadeceb715d091d83b5f048556b8c65adebea09ce19c6a526c00f44f18cd92a7ddb288bde3c681a513c099031b9af5da8f94388e36d31097f1dd3c128b3a88d941841c5afeb9cd295752766d3e85353ca02e3fada6f6c785d63f715bbc51cf480b4861a3feb90280b8b1276aab953290e8c30654f6fd3d11a6dcd1891dc51e6a51e5859a49c7e1fff56aa0fe80d9eb4d97cfca6490ba583f388702a3a41b23787d1b4d6aa81546e6eff9cb013a3fcbcb115e3fe7e068d8b21c420dd364283e4f1a36bc68e9139476546dfda5982cf3aa138181aaeb04f7d2b2c49276e90ed4d438214bd8d471df05f61c706ceae72ce548023919a98f7fa3169d0d467f982154a0f714c1f7eb547a58e98b57f43c4c5f33f6ca381024499232988d1b58b565ab2435e6cb9c35f25b1209669968f2f587d4a73aad5eb9144dcce87c224f6e78cc906b9525cb50775048c6a36263452d3af46260b8f72a15036431a1e6830fec2f8393935609f21f119798baa429fc4a201fd789dbc597fdc1691e8114849d2451cf3772b9178fe2712b59c9745ea4b8cb103924d3b7db400e3d9ca1bfb912daa478008c21c2345ef9aface9f66000388bfadf97ac2bdd523d7da6f48f88e828bd30a5bf9e5751a096e5de821a194d30a48c430c34da648eaa5bcd34ea197d40854be0e927de87d5e3a93a8519f5b56e7a978271d207eca08f90e0197bff84adb1db5c48c1c899540f2066795462ab2d86a01870eebea1f67cf280b03ba5ba14b0ef7cc42ee7083aa1f373386abc9160c50262d10f93556daca5a180bd1213564d6bac95973d0c9519c0d8559b38a2b334645a554f2d563069e7b72e3d3bb89a89ddda15b31c30c07c373e39b5e674863b72ee4e1fdb42265febc6c16a9df5f2f8819fbf7666f967007effc78408f46fe50f619187349984d3f59c7ed3b46f27bce1d9711ce83e43a6f657d05a47f3f5f4ca39da20a6a947ebeae524270ef6fa44fa952dce8f527eb6bc8818319e73b05a063723d673108e2820b30285d8f83eb689e2eccf6ebcf2ddd63e313bcfb3e9497f814993a251420e79efef3004cd65f44cd16ee16c4777dd44abd9eb8301342b3d53ff223973471d2ec5d2720810eb5e1da51ff9d583e1deac8d97aa84da47e315f31942480d10b8e3f7aecbd0b160a11084df7b12259a0d99ddb6e606f1439551202b33c5bec2016815ed70de6b3009901855c7a3e90c515a8662bdf4827a25ee665ca178c151ab0ef90f464e42b9cfc00fe404e2629087cdb0b57210d77238fbba36f7d53bf5d302580c34805f77a32ffaaa06df248fcd36edf08567e5c99286b0ada10138bb8db9ec1e7917e5303eac1d3b7165aac99d97095718f43d1e1e21f961c8604360639657878cb8d2a988cc6fe14b4838471e93d9b5f4000d6bd16096b047656f0a3c4a6fca24b4ecfc37a1e300fa3b13b437eb3db4112ae99913a82eb91ef2dcebc719aaefc0e0301a1d18c76b31ac25d20d8837c504df01834f6a7a03d248e4bef6deb4e409a82fdbf2cc780073f4c748503d9a881cec4005eac9951d46c53b792d3c6c732168496899510370765aaa9ab611210a35bd7bfe0938d4a685ed62e1ac8a09346973a91a5a8c939eb7243388edb0db00673a351b1733beaef82776b4b567812666fe0114ee0617e2340b0d4f0d4358080c7a09a961f25cfdcc539ef61621ad90036cc9e15c009aeb6b252452f3e5d3f5d3094ef5c23e793a22fe130e3898f7632c0278ad9cf005ac99510a95d48a03afdc33be9ff03cc32c40af01b2832ea1f51d181c14b186f5d155afefd093e31f94be008be92bc005260751aa4d83009b20357749053ec65d5aaf98f595c1f185807ea0ef0ae10572e683284cf7f4dbd88b4def0249eb4f946a578153bd4866ff0ffd085d7d6768c37c65732b9355e67356034f17a9079541f243c462b031951cae285944be967cb6148781a62b03fa70a7d4dbc7a1a755c2b4d1e90b0d47d97c14c3272af5edfa3a6fa87f3c0a80879883c2a4cdc96c406b3e461c7281a6c26a1ea040428e70d2e74caa11eebbac4639f8decc0edcb82ce7b68c590a9b4dda57744bde3d7cdc9e3c274ec5b73db9642d10e3f47cccb4614017154daaa39991191e2f27352180cb10faf3cceab4dcfb10e5234038d9f61c4e06106ec690af1cec6921170f0c623e4e04337a7be0ef7a0ee1230da2734211c5da6a171237cee84686c0ce14fc6553531cacd0e40bf13ab6a12841f6833d39481fde961702522b84588f44be52b874fe68e5fbb461d716d7a9b49a923f02208ab0f55920afcede5c53f3ee39e083c9e01b997d9a6e0f04021e8678dc8f6a3648f8783e7734c6cdc9b8d7dd10a4e79435b3fe402733bdbd137db27667a7266538da8747be52d6c9909721f9b9a13bbeae1c7b014423a14f18913403b0b1bbd2ec02f1485641a9286ebafd37018471432318e0871b29d78683042d07c6bac0a083c06014dee087606b92c2e9219759d7bf85673c7a398e72682dcf681f29cb410db429081be670285e91eb4ac28c70d5a9504eb9a502f6382b9f6f77c250808b97d1f5071b1015d55002acf2f9f3a09681050c58f9b70deefb7addfc0d6b02057f60426e21f6236cedf3d9f54eba4a743f5e29d1139ea8ab6681c02bc728848c03e290bbca49dd959b82ad7defebb7c9d789696dc215215cd533684f108c8d24b2016cf0f39e0636645258475393cad28f784371b83c5c3f7772a4a9f7dab0d241694cafde3a086230b668b27391220a6af86bd93c4264d9a1b676c320626ab14187f51caf9a374a9961ad5064400834365d01f6f43405128d12353200506d6d3c3bcbc184c7defe8346c67f45a8fb83b1b679cec59a613f762c992583b577be8082fca01b3b230b4546301e02e3b389326ca9eac9abcec968451540b68171a2ec2b6751f8218e2063df99b88ef45c76447dc1c6a6bdc886ee0fb7322578d10acb78ed89f2a9a06890b80ad54e0b48a6dc8ac41c04c35019f06a57bda24a7866e461ccf5055832ca556880bd87a418065eabbd111f1f6006dce20aa55efcda4387ba4ab633d31679eed833ea693f82c6c6fb7a9b826fea1b3d3d1655b442cc4fc08eed39567688d5a10178a766d115b21a1f2e59dd32e0f7c6a0d7c4f06de1659aa683b09962e31a863dc582b2946a1de2fbf5c5aa4d01df379e4a7b78ada380cdd52ada2fd737e043546c941d1407e156953a217cf7f7711aee380bf4a8c6bdd176efec9010a614074131beec2b52718696f623212a6c01d18ed0e23c6b8bbd3fd63e531999baf804e971e1de1e4dbb439446c59f9da1b097a2a95ee30bd0b2c7bde9a7d03c46d8e6ab01d7a59e5267704fe8d4668b5c82fac7192d91a60d547b123dc8a8255ab43672412f15b0f1db95f0479fc2297017f4336fcbd9faf54bc5495a22de5b0d359c6c33e872ce0fac226d0a1fd042d0c6448282955b92cbefe9844d7cca12b4a19167461109b20552387d25d3a7ade56ebb79441d50497b923651be1551c5eac20100e88492a54bbcf211861b0e41204c5336671b5123d2317e45489b45abc79fe55e0b5b9972d21f0199994d979e8111caf33ae07d13a15853f88aee26a0460522a3f9615954e35aa7a3d9fd064951b960a9a15914e2965286d56639043f5d4dd29a364dd73414d0643a9550dbdc940e351ede8c5bb304db3158c28dec2445cb016896227985d7588fb225afad8707771f0d78967d2eb09f6efe21c8c648cc8867914ce68e5590d396c74bfdfd20fe8aa53cffa8b14b3091d466139a97c82b6caefc0ff078818a18f8ec208c20c84fb214b2fae3a80d2ca189b181d6f2a9850b5d79920069086930a0298df90a71ab052d52fb2507164f3c1b7518c71fbaf4ed5e12d4dfdbee5b0199f4b7d0cf1e237352891439c9aab3852ddd268f52ce00464f03b6443aa40e4fef5838f2f5e90f3dc05d52d8a9e2d7d279615e5eb321260fd19105023763005ca06728d2bbb5620abdd05a5cf0cc8c0c24d8ff86d5ad0223b3b243bb50ca3fab25bcdc39760c04d8f2a0bf814f19c68119b5c8f0fdaa0bf7aa75274cfc30b1672c1810a7c42a0f9ecb7c8db58786ee6a34b91f792ae2f7a19085890aa653f182c844819aeb445b387341bfeb21129731307fafed2e5177b3664611e9b805e242207a2090498f8d3b41f7b4f03083e21dcb35713fc0759fa9ff6f67319c2f6377a7a95895e2fa699737cc390bf02d15be435e2ef4eb4678aec76e69264b880090eb241c04488c94ee9beaaa43e3f6c40d6a8d637a048477170818d598394c88540d07c155a3b1baed30fd878edf0828862e5dfc9147aebb178beaedc8e3919e2b33e5493cfb79f8c39267c8a8ed757a6bbdf93bd0d2ba6e643d076fe1fbb5746bdbe755cb2a665cdfad65fc150f7058cb38e7190095fa859f9d51abddc858cd2c86330b585d53f80d717af937454e00f735ecadfc0ceff89c2a0d9e196ce794d25e8d72a55f18bdde7fc8ce1943b08721bf63789929805d48a3ab52276c320006f6ac1e0db86b8703ba61986ee8950a2ed1be38a44defb2db55393de7aa1486a1e02cfacec5d1465a63007fffc92c5af01fab2c09451eee72fdea689806842475a2a518a982df3aa8fe691cab893add33330d7e8a17e1f3223a4b0c414303b7415d90fcad51693565eb4b3fe26812a25befeef5f5b73fbdfe182f12bd73c77061949c82517d30cc1e22a49dc6198c4211af38838ea5b622e5515568b297eb1eeb2639e09582b1a3704b2d636335d85e916e08a53b1f8f175155a098cc6330e6307c7466f8e790833be31ad2bda23d935b7fa5f68d74062a8f1a18c9fb7b0f80392ad1f78cb5b40f61a7220fb79caf4b80eee42b0f6c17df375e0b4fc9a7100af0c9c976cd33a37189c9ae39d853e4e9603537be8c69a6eeff1522f4238208c0beb20ff3d474a47196b0433ff0bbe60ec47e1157bda2b753de0dd8e0784761f146a80949dd0bbf526b87879ad9320635b3bd9df280018b3dc1c65f7c848dde78b2eb20e7981a9ae7ff7a91f2a8f5ba347680408afa6b659749bb26c9c48f72665d097445d2e7e4dff201c0ff010f48fdc207837713eea25af7f158f73eb610e53462024c2c9fbe75ccea90d13bc7f1e448c4b36cfdea86c11641f7e1922d00f2f9e1d4864c91d40607c97ac8e2d8031ebc7f5ba288f5e1337dfcfeaf0d3d5a12019c0fe4c76371811ca54069801aba595d32d7538ae73707f3612655ff26c88d4cb4d8831d5afc0833563d4ac2039d2ea97363434801717a8769013c11ac0ed6ae54b034d4eb059503c60106a7e21fc60c36b599fc90ef24603d84dafd0c4176e38c3ce392f7fc0060960cda47953c2990e57ae671ee8378368294ee13b3d59439897668c106385d9decae81d59278fad64d85ca62f08228ceecdb38bdb70f3f1197f809e9a9a30a6234447e6526f07bb7d535471cc348e7012623b308df1ac4816a19b529cc81bbba2c438872b0da2afca4d3496a304c56ad403a6070ffbad1d02dca4c3b05d90f54f1d82f20c09a1e05c7bb094bbe282e06ff6fb91bd5801229eaba3c1d71676d787b026f485785e9c17993d7ee3a27d53736e86c814a754cd144ffe2283c1359bdbb09422b45c6d29f592cb46da5285927d6546b4554da13cc65ee1fa22740161bdfedea00c7466b2643f0c3005eaa968856b49ad193fdd639bfa7d1e3674c91c92b9aac2bb01bb26b0a6225e6da9ee4f4ba6dd4d75d593ce761abf0998d6bd6cd2d9d54eaced69b7423d572862cb204970875912faaf2350f53e0a0d36e159c77a6f91603a4902b2519dd0d93b259571604dbf3d55765335dc752fc94b23599b08b050c2ae0b5448f0f97dba61425e89fe7d4f692c3e57d0838fca8777e9b514e9af1ea5b4e804608a616539000d469c7d6b33ae34f0f729c360f204f912944639c82ad312c4f31eedbfee0e00b7834297eed56e23388fe37b328d8ae927b4a8efe216611d8d97d8b835619f899c9581c2e427ec6915b2d2a4ebcfeeb0bfe9f9801f4c0275d10144548d8bd19c13e712d93349e3141c881a715d76259441ce4a2195ef70f99707f86991fe35b0a36561d9b11ca3fc497f68c613581ac83b8cdcc3dd9d1bc6eeffe13dddf0f6b95c135c8fbae10b46ba6fd8b91b427cbf79dce92b382b5142dc4469d28a65ec97e83913bea81ead74abf065ad254eb6d3bebeef60a89f5a25cf5d00bbd09ad583fdd17e7a6f186f8179df9d91919469b5c82e9045c8dcc59aca244253ace5f99963aa04ec1b91588041aa28566a89a220a3da54eeaeb5f889d87c1d75796bd00f5437b901c80da7cceefa3254802e8e2d62050984cf78fad896c8178049d84be4b4e1d6a1960795bec6df3e9be32b2c7ae6d80041627b398600d9eb6b7d3a25f718d40b5f18f5384d27782b4de90bc418b5c232b1614e4520b9fa6b47f5700806530b95a170921e1a53c4fdcba30f9aad59ac8b28710208d5860a529e1a1ae1208dac52ccc0dacdba22230d71b63b32c857fb1ebfe939d5fad572ae0828836a8d9fbfee7b880cd3a4278e5a3463b394849e731c6ddc8387ab43e443f6beac6971730dc49f700632d089cdc7e00deb0593caf0ec76d05df7b192f73f23184d42b4f7ecff851adc419d75c077eeac863014de8a58f9fb325ca546421fbad6c62aeebb8959f51e7a1ac9d29b9910ada085c85d5f1837e1b57ae24b4b93f5df9997cc73e04aa36d6a07e0d550ae270cdb3be37da01e4af63c3931343b912cb7debbabadb7b522d5541c335ef0a5d0c712d1e5d38de53f40df5585322467df7845f810c68c76dda9da9fb5a6b7d92fd5b00e9019dd88f5579c552ff95aa491df6dd2fc09cad9ee085f17ec652a4a385ee91732c0557620bde0b8b1a71d7e6103a8e90330d7f82aa9872d9202a630e76ae9c1737d1b658b124a124bb19e866afe9ccc25ee99b0e00a8214fc37ddd4600b27354bb58b332c9d6d78e690052955f4abb8cd7492714c59e1f1a848db44fc601834a812196c18189c36c1fa60299c464e1b246264be61436c4dbe08be8f782c1d1383b32b84e6fdcb922d348c2f6273c4c8ee0524989d1646388fabdbdc56fda910ed365a5cc8694d6bb314956ae4b39dbf999381cd7623de15b9becbede367f99c1db1d373769d30db38909b162e4339603e18e8fbb08d1b416463454ba419d9045a350749ce859abc5cfa94364b688a6939f88b325fb96301319cdaf405354b9cd62f8dd2c2fb9b90189a60bf9ab11f3108cdb9bf0fb5d7537f67aeead166028662ca07aac57fb86704e0d83217d64bd7fad12acf24dfecd197e25ac6bf9cbf0cc65c9bf148ec0cf7fbfd71dd6ab89358a7510a4f014879568fbc7aa6c6391c19f026879578348a59c7d35786fccac19f0bcc5a7d790080459e0b63d50606a551bce726cbcae2c01949aa3d35d47a5aa461d5301fd0b5069c03439c8304e5e76258283ffaa5b01f32505105f740db868ff561dbb0a45b2e2b72362250481d05083b10862da728fb926bb0b8ddc35de8cf87d4169562febd1a524e9b533ad75b41e59e1c8a7c1cba1c9fdcd16eada51cd5d86769b9073a9c442e7acff625a7dd10ade5c05fd17f1079c86334459d97ef4ba29007a5b4a64d804ce84b38bdcd8e02c61d1f793d50c60c7578cdcef582ae4dcca74625ab6eba6a2828937c2f9e6ea9a56ada503ae4d900b0d4ff84f7b01c51972891285f8676c659227ae3861b0efac63ca07668524c3264ca2d3ae502a0a342f60856bdc840d4a0d81f4018378b36c0cf7805f6b52405f25a29b75417622f25eff1ea2337f286acbae0bfe368d0c4580b941eb97328ad4623d743de60613f6cc48f248905479e7467abc63b1d0d232c3cbdd3cc0b05a7d93b49cb47e1bc20b05e4be2c807df9dcc11ce60e8f85c6d8b2cad1e9fd424b5e65078c778c41de4972bb1136dd8acd57fcc7f5f62d57585eb39d43d807705ddf6e0b25bbbf0ad35e417c713aaa90d1e75a3e9e411b583137f019b9453bf00d948ec7e9b88bf6e193e0dd3f8286bec8f32ef8ac2c8588858bab1c984295b7a44a0f43be0a3bdd44cca25f2c6e344304047e94ca94bef7d4567f71e1cf7660284223276374c01ac173b543217e095f77ed05cacff9b88752b540c300f6ab1612f8c8009e470f8e2b7f3853244fe9342640b5705949f58279d57d5a41e2b73ed2942981cbd13e6aaedcb0cb56dfdac427700bfabe36698f757af72b8ad9ba5a25eed143c1bfddaf0f0a1ad613d3857212e6a152a0bd13934a7f9fd567a5230516468f2deb78fac82a90909ce81073f2ec935291c3f09b3279609283f490fc758819e09d92de5f3ebce545a35d564e576f67f45158da1d4646f8701bca2063db25cb02a087817da464a2a48102e3877e02aeea535fd4da1651a1dd565618dbda9c8de4c4fd77c41818a9050688b2578ccfd1b4e23c17de61ac40ed2d61167afcbae548a807fb67c010eb26b9fbb4ce3791f228e70e06b48e8bb44086dc5f4072352bdcd1456582f206bb3c078d09787ab047ef547eb688f07e30c7dc30870156bbe07a2cb6f716758274632606f0089d4ecf3d73658cb392a0528a80f19779e538d600323ecab97a0e33e9a25d1817902306e131759c315b6857453287c0c46930b4e80f0a7fe4ee082359b21a222a1bc1d4566762e9dec8f5dae24eec8ce4ae9b51d492a20e4f923aeec1b74660d4b5afa370eeadd288e63943c6c25806f60a77137546ffba9091b0ccaf2093b6ea353abbb5cd03c56ca06b08a4743232cebe01817d8f75aba377972b0c7386814b35c940b5b1243e75dbe67d8f434ec204223092f4630adc1ebce4f276c2604c0b9785106138d63df3fe69681d790d1a054d1c18d4ecc2583cf7fcb087d5311404e5a8a51613f932174ff93e1bce5580b80abc9a025281091d46340a90c63a0ae926344f531487a6dcd78a6df4dd7fb8b419a6c9d2ca3031aa8c28b5d30ccba9a0ec5922617dcc1ebb501475a21a6bc70491b98de1303dedf668a235f05dc25451a34654439ef38be72d3c3d1e6cea9a2f3a7aa3040a48afb45665745254483e64dd3bf0f21a021ef8af767beef6fd2dade7b6fb9b794324919670867084508159ce241391f8a15cce82573d99e4721215b0e69f32116492f872d7b82b1e7130e23ec1d8a6c5761cfa71cc4d0c721fdf555917376396f38e47c05a91b08220404bba6b0ebcd3b8edbf88d0d39a72b67a753994e4d3913131393eaad16325f2b538dd5e9baf47495313131c9549ccd76739bdf820809827f88030df156557df97d9021df97f3f6e921425c3349fa97ced70f5299aa4e22e71f80ccd720383f3ecda87134b665dbbfdb6c1accd7f82017e69036af43dedc5811799099f7b75a8c968b5aa53a3950c5189732ba36d197ffcca9413a362f833ada88be74727490ea2269527551261a5d8e32bac4b54a91677454ce5fd6589783973dc3ecf944a508ce133991d3245a8489ced3292f60a638207b782bcc2115e044b3ba847e7e5aadff71ccb97e2ee70d290781726f8abb6a1512fa11125acaf4b9a319cf01e3e75a2232d7653ae21163cc43a61b7f0d32027feaefbcc7737e9f66e1b0ff8d7bead2e777d8b1483211bfc683c4af9f45b2c75d78f44e63f14642f0e78526267470ba56561a0511b267ed7ee62df339dd6920d3b6e72cf2965bcd04ffc45fe441d8b1952157ad80f1ea3ce6398e35dc98c70935720005f53eb814972e5251f2a42f4f33c98125792b47d3189d51fd64cf9f547bcbee40d2d122cd9921cb38214f5697e9aa22fe39ef794e0aeef0f01dcd2ae2f99de7016f686e6e6e685c2c0ae1b5f3532ce2f91d6dc4d22c9adf791e2328453ccf7a239da74639cfa3270d196408c9d344a6bb88e76368232834cf13e38f5e34ba88f53bbfa3ffe8455af03b3f027ded3c110bf45797b3a6ce4011eb6368a30de60b5797ebdc6258f05acfea22f5cfbfe6d14444a014fdf3b09ec86b9e8fa17d54d78e26b2f33c12d8d19345b2a69e3734f3e666ded0cc247b3e157948223188fc5bc062c578124a510ccda32d2089b0b4479f8764d17c8c9faf1d9245a3591aec3ceb79f07c0ccdd2af2745f67cfa379466521a1a4a3b3a6f665ee88d66d2190d79c81d92488c67e9fcce4b20e7799ec863901a5717cdb348223abfa369e88d2e799e88cec77831e7795e7422a6b5e753932e36bdd5a0185fb67462b030d68941d2a51f37dd79fa19c88393a44b3436714c2239cffa1d92f544747ee7a994148ed40d95da8941ea3c0f99f3536469a0f33bcf43e777348f9c67fda4d134a665c89c8369ce5325a7b11c927271973f5905cce2d0db796fb5bc2585e3230da494c65458d08fd14af3294c1b3594066b01be699ea563ee3987687e262fd190b5c8f4a15f436dd414260dfa744697350434d3a7359cc77ffab331975c75d618095c69a8a555afb5d65a6bad4cc250e7ea129fc5037cf1411edf8f19c4efb94ed0ddedc67a02196f501a9235dc55b1cba02293d60aa91a214170e74136220265e6dd841944542f3083beba6acab905de4e65a02eac204e2f5e359ab56386e6c397919973cefcf44b9a65e67c99cf794e994c43ffc7ff0f22c4c8c78cd498a5b254760e09aa770c31761e78cf3d11d5ab5eb45b728e4934876ab63f03e690b7c73999f0a5cd73439e7bbe549ab5237c9f2a529470c4fc11e44021777b4fc1a713739cc8fd383a753a6e6f15f520f248407ec99c95166a6cde62e17f244b0310d4b3ba42fdbdf72c1edf7bffe9210ca82ec7f97ecfe25ef5472f4fb32e0f56f7e37bd5177dafc29d2e12fffb4f1b893a08a82f77b923a77dc31d44e5ac95dcd37d1fecc8f287d57d24abd33c42cdc21f3eab7bf18f5e1e8b8766618d9fd5e9a2f0456d04a57ba30ed447af8f7ef0b3af2e77f4e81de09da20ed6dcf66a16fd72d6e8d482fecfa169abd17e708cb9734f054a5d8f53e720f27c23a55b7da54c1f865cce5a8f1e07b0f9b2c70e4bb78dced555675ceefb9cc39f9a6c2197bf417f7fa10c727e19199907694d4d4d4dcd1fed1a7286863cdaf4ee194d004a23d778aba7ccf8f14f31973d1867f0bd05eaef896a06d2336d8fbbfcfd26230579bed338e7654ed81caa2d6ff5a81c9e400298600c24597cd5ff84b5a6227790020075eba706f9f8eabcfdfcfcd4e3fc580522c6d179297871dc79a794cd49085b4af0e18a06e8a65fedfb73d0cd2f69be317dfc9843d5fd68535dd20c4c1acd8714752a66d55bf365a871a0f11de87bef6b70e06e0f480edc8d835f4562ee31891f879c791539f3204896cf7a500764913a640e39a74b66becdd3901eccb77970d2d8d0d0d0dc7d43f33536244d8d98f34a8be2ab4abcc3f99ffe911cc99ed68c1a42b46cab8c29b91cc739c739de382e019c3f7b621ea3b573a649ce9ded4fbb4c707eaffb3c4f5928b6dd976ad26cc81cf222ef3feff1732c0dc0ff5e02a09680a785b86f85dce99f96c692e7972d1c5626cb0586a6249854d75a16955cfefc30115fd4f993a2b69ad0aa7c9a55b40d0ed9355c7df82a92a5c1eac3950e593c444a021977ad1f8c1bd4e58e0d64dc5de7e9ec2debdb3748c351fcbeea12c8b824cf5de6397acbdb75531aa30375da03efe9db0781fcd8ded34969800f9640c6fd7df71fdda08f93d2a8ef7df7def4967f4c545fe341aaef6ab8cbe61a845ff6c7834106152239bd14402e5d6c5ba06a332c539c644f9230c59468d294182f37292e5136da6ccf396d92284e2f66d25470d3443c6923793e408a0c14e61bc9656b0aa1e5219583214186ccdb10212121a1214184dc820819626b90213ecac965bb73e9600a5187c900ce9eee098b11d410eae004f9870f4c6f4a18e7dc026343cd98261f64c4f063e70e358c7bbed39eb40c310224ea8fa48f15b9be9d35deca795e1921c8f4e73741f10ceafe665fe5eaa2df91a3eb31d32c3cc9db3be77c3badb5f6ae6ec77d3727be42ba7d6fc79153dc2f338932c05bb5ce5ae7acf34e3be79c13055b6bcdd95b638db7eaf8f3738d07e15725725d9b75d639c588961662a081d6724d87f1e8f3bb3927ee640c81a95bd1b39221b79eb4e2c7176cc894882cc3c8c4fe018de145a64bb116688c2679e09772d9836589d326632b4c1a2cd86c537559186c069b59d8ccc26616366b22d3a99bb764907053ed404377bd12b99cb01ed56dfb615b9876a5f6a9f745f7056e194d7269c19e2419e791abd5a095e6a654535c4d9ce26ae11457fba6b8da9411d989da2e51b9be6572a0259b85b1a5551f32dd5cbc55bb484d9fca79315dd56a6e0a964beb54dbdcd4ae5c6d3b3950978a85ab511bb689d2a8514c1b1d501af5837e385057a5e610f7775251a718b7e428efc2843113a5b3aa5845f705fedc4cc06d39240e26666afad8bc55bf036ae37a3169d4af5bdc755740c5ae17cce865d7e7b22b4db25daaab3ebdddacd3cd3addacd3cd3add5ce64cd68969774c9cf8476fad2e52a95e0cc53ff2de282c0a8f9ea8c2c96892cb7a67170bd4add52099b7b65ddf3a554bab41aa9fd9da76a95b0dfabeb6987e698ce524298c731ec77f0ec95bb5e438981279979cffd1e66033651e3919b5b134673427cb7a756ddcb57132991179cee6d75dd65b9d554e565df53137e33e094e46c1e92d3b9bb1e8ab9e65ad18beea45ad7a2222c521cbfb30b47615eaf9b29a45f59c3ef44b9f85abaff9c51aab41add68f63ceadd6ff38ca623333dae803afef3fbae5ce2e964b232f945f6bcba49591d689b4b4a66d6dbd55579daa4cada58f8d49bb3e0ce39cc7f16b9d7948642a65f3960c156c5cadf39514f58605164eb3d96c369b952e639a61ecb719bdcde8cd6b22d74a4295aa37f0e7f392e99e52f5bb881b8cb01a3366cc181ef665b5d1075eb53e91db29de72a95d7acd69d5e518e73c8e4bbee42191ad936df296bf0c156c939d551a387b26b561bf14aa957e65a25f659b665b6bd3a60f54ad2e511a54575d0a3975ea692157cfa272d6d65a39ae723adb8c33ce18678ec6808ceb679cbdf5b80616ca00d32c0d6f418328eae1ada794524a73b05f605c6606549c39cb71d776ff5383ba9f5151c85f98c277b2eb2182a00782df78f366f8148681873bfa8f45b6df3d7d20de83e39ceb541ffe286c485211a50e7e08f93c1c9233dcf579b88b6cfd430e7c70e01fd698607ad8aebbbb5f5b0f9bb5e500ce1e5b6f489caf64f717e4549d4af5e148a9be8eeb4221e28d215ef27df1c3f70fe242fcc12eab9e95f3ea698c6e0cb627f1f126c47f08927f5ea998e03ce87ddd6c776fb5c01dfcea5578ab5ea5cb957ebd77e28dcee66b74996b3eab9e136fa85636dd156f745e87f3385ff3e5940b7a5651ceeb60b104ccec959375f6911cc9eff90d828f7d71c89f19def2bf194c1f7f2297e55b3b20eef27a83780b4847d627aa371e791dd7dae5c774f95b5bf30c360fda58a82120f84bb9fb297aff1b74a321b025d9932948494aa0f55fcadc7758b2f7436ebee36ede717e14ed88f3f6e7fc71fb569348320e79430e7120f0e983460e3491863890ccd33772a0fcf4296cf5d4ea00bfe671805fa3774de99f679ee68866c65b2b585efd78ab355d572586de83159c02998c86d050197d42a750249a4495c0ea59b0bdcf14e73c8e38eff842c89e0d91db904614667443da10551b4cf66c8e9c1a3284088aef518daf9cc0492bb520644a0477bb373724ce0be15485c1781b57c8be3343e2663dd7e49d913aab1625a34dac69a9537aef0d0a83cb65655df5bfbdb07bcaaa7f854f5f2b4bf3d5caeb05b32390ea8bfeca3aad766ddf03b5c5813820de739ef5dccee37c0f9d1f9fc82f4b039ccf791ee3b334119d1f3f47138152a4f3a376223b8fa367d5e58ebd7a276985cda119384f593c5fe218ef896f693528869ea00ec9b279d61fbd7648968d6669b0f3395fb4f3396f63a38b749ea58d705ee78dc6dff9a3978d4c4d6263e3394c55a66b4f4a28bd0c8dcd8ddd25072a2f9102aed24d427fd6d97c5961369a01f4d26a9095c9b0954d1ffa443e3ece4f7107d2f8384f6b8ca624b0d826270762fdd4a035879f0c84223082e390d7e62f17072aadcc81eca67fa11c683e1d9164d3bf3507cae9726f5436fd3b75c5781012387b3ac2894d9f43f2200b6637ca81e653d4d4a67f6d35887bd1a7b1b19c549303952ec6c9814abb64e640e58dd1689c9403b176143d7120aeb669cd61534e0b962807e28ad8f471988ca903eaf6bf4b3568d4383fab0b07e779d02f548680e16818cee3e80fb09e48901fb50f0dc57ece8f5f4e2928464a694eb39ae7894c7ffc9c37c27919231aab2efaf9f3e3905df2ac2e1afd95ca1c9279fa76c981689efe172b6f2c77311b2edea22fc5066fac065d8cc7f1ffc67c767963565f30a60fd78593f2168da64f38313b2b12c86772c76d2ca7ef359ce791f3e3f3c0799636ba800c45886961d444a014e16896e76896eb1d398ff3b24f72c891ac49d5451f87f4c0c8b6c9ca2a8c3e7943f6a79756832617382449a18b2d7ca952993e14ca8322df9a7e21e72faf8d78634647fed5e3c8bffaa36d146e9ab7214bba6d7e454e9fa2dbd4c8bc2569c8b267cb4cd7add9ba4f9f1317d0da20186dd583dd8ab55a55195285d5a4ca549ba6d42ab5484db2b2dea9de82adda5161d5b54556ddfc7d7b4356a4ebb72679ab223d0e79539d36fd90bc01c91268979706e4d1c7974683705d6115e6f75eec15565dd32515c67947362e002720931927f1cf880f6230dea6cc271bc46cfbf84bbaa452894856eae9862a9b520c367dea54836848e0cd061836c5917a9a12934da1af12718c2fd972308740a03bffe775b853ad38ac9736fe6d2d7e2297799aa791c9e48aecd103f45820f87d0ffa3528cda6bfc34707f48178902a03fa440da00f7e5ec5f11b8421db3e91ab2cd8f38efe434bb69a49d2bf66de897c86ac71ab500d2b43de0c6a58fde32d2a02ede77afda9d57fc22f403c5b38f006c1687b886badb5d65a23300218a72a3e052cc24c728f1d38640ce8272b70a9a21e357aece851eb9173ce3d7614d57614f5b876470f216fd11d0ed48383a639a3d4a9d42541869111b8121a62d304304c774ab3830e5ee825a4160cc8c129a54e67b0369b0d2ac80bb974a6ed4c381f26a4b0810a909cb0c194131352174b4b92a49e9cb04198272b389cb04117b35188bbe7930964bbcc2f83821fff01402dcfecf954430e4872def3a9862700ec90ed9e4f3530d16252c30930b89271f67caa610a0cb8c8377b3ed5f005064932b7e753939809983e882376d9da4118f1f3d4e4896df77c0a22cb2effc72211c2fe8d6e416f357e684de6533f326a432693c96432994c269b426cfb348a6ec102de2aeab8dc17725c48e61a2e871c076ad61742d1eebd31bac51cba975cedcff3eea55b68b227f7094b8a9555d9cf8fec3ec634aaa3356a1b41d4dfafb26bf316a63525b9fcd9f6e7caa2b2f7fe6595714f3c8846d9264ed31ad6b449466bd40ba5516b5fac179096a907f8c1efc41cf8efddab2c32f7fed88696cb9ffd8910d0811ffc4f977401f8131d007e1962f2febda4ebf89e7b1c9fd6e57d0ed08d3f141fff10f086d8032f28d6f01f070aeb1377d9fd5383ec4bacb24f844c65a0906f8da38597546dcfd21a9555998ccb94d04daac3b4265bf27e6e8cb36c2cab7d8c7f7e644b41e66d6aea66696dde682d28e7f5bd87dfc3182fc59498c61d5a1bdf5bf6b7a53177d55fc232d90f77d5bfe1f903ab3f4e5e1559a65ee89615d4cae742d16899e63d7eec698ae57b0c7edf7bdf73ef69968efd7d9a45e49f8f92ec3dfe3cefaff7f83d7ddfbb98c5d95a17f97e496b58bc55033ffa6546a35e6acd05067df095a0bbdc4235c87b8abb77a1246a63ca31c65dcedc385eed49d3870a2565406dcca7424d55897d1afad21cca40d51cc7dd0feac05df62decde3fda97e671a636a6aeb6193d6748dc7f1f57bf7a5939be520412fc05e5fe07f7ce9996dabea44f92cc913c4f644ee7b195efbd77ca5bd6ae7e7a6f6b49dd9747ae7e5457fd624e306bbdc7d883e9a0df7d9df2d6b4b86e6135551bfeb2da7c78ec8703d9c718df171f3f381590c59fa28efb62102bd47c78cb86399bb6e9be242bc7fdeeaf76240c2359de6dbc7b64c873a685a9fe7b5f6dd8615ee891d5b38fbfa55c4e29cf61db83d5a095d6512191579fdfbfac369b03ddb78e64ab5230aca914b539aca43fdcc81ca298f3481c7acb72da6132b070da5e68f394a907f7bfefc41cf7f183dfd1ac412b30c4a2f844fe7da28ec9e56e100c6d9e72a981a3fdbd0881fbf8a9a8e33ed6e2026e0e6ecbbca72120fef7a07843f51e693748c57b498f043db2a45946836086035446fc4b8a1f79ffc7c6ef91e5b83d2aaab4e7912009641499e417c9efc03359b7b8cb3ede3e6a107e85d5e642f6245d4596b97924b8b915595f1ea9da5ecbc95671b54d1ffb9f44c67fdf6e9b44436de88420b5648bcd1f35e847a806e159fe1ab3dfb5843cfbfd2f91ab6ddb47807d960eeef1c330fe74b5551bd374d9c738e7d1be85652772e96050cecb3e2659dfe3cb912cee3bf10698b3bdc061298b124eb25011c5cbcea72a4fb6ad71e40f3773577d1aae65dbe8f597dc559f09cb72d3e8447ad9f57b68c81ea334be8d1d40c5ecea91de86c1e61006495ec4811c68d33fda251583e9944c88c3ede202e866e5c07fff6a0a06a4625e3dd645f9655e461be53f7aad7e54d74c4bd39ee20d16d644afd5e7bf1ac80cf3020a609b95c36efc7663cdd241a996dabe02fb2939932b301e2b8703e87b9a95833bdaa0b8017dfdd08dddc8f4194012d89edebada6394467d0b033d00571ce6489e54679ee4451ce6b0fb778b035d2ae5405cbcd6a25d5a752ad77f3a356d2dda6ad1a9d61cb25ce89649a5f6dc6293e026f0290d0acbcd974c706ebeefb857fdd7618efbef31c73ddd9c7deebf27a737ad0762fc16bff79da8c33ed656b3ec7bbf7aef891c7b7777f0c3813e6ff5f777d4a05c5d36e5b4edfb7bda68511a57e61be040f9ef9713887dff670ef9ecfb42431910cda1f0a7456dcca8d1337cd34c99e11bffcccbc8e819a51fa6192b34cd4aa1cdc29739343708923e4a72f8f8c507c3f0c110fc50b374ec30fc4007a859e0afb417053e7e9508be07fe07824f37087a9e66853f37793189c36421fde3adabbbc8dc7f24ad79ab7b16dd5ed73dc61df54269d06f927151497775e8fa56037463fae007a0d8179f7b20d6f34992bd0faa4f926c27deb9e3c8f34466d9b7f9a317cedb7c11cedb682328f68d6c6eb4d1cd8fac1cb583a37df7557220d5dff1ef5359cddf2f2993cd25aa2e990761dae821c481c4eeef1b7d39b9d818ecfb3fe690b53113640e797f7f86f418a5e1e37ed09c5b5cc5c53dd277d7819c7843fc2b36e0886e8fa43ba434fa3e6a1c94f4874d5f6a5fbf403cb12f9d4d1fea4630893fe78f5e2c5c84f339361ae7b12e1a6ff4f8472f1cfd63247fd8903e4a32cf13f95fadeabadd83fa4afefbde5ba129b92626eae0bec43177900f381fdeb24fa5541e328194feec1e634d044a91c703130175d6ef1d49ceeab2d406f63ecffbc00982a27e0f5561a87aac33febe7b173ff171f7de73f841a29f5951f75e0b3f58ce19f73d66e9a2efb1ce2208740c8bfbf74816a73350e4fde769efe70b7b9df6e93345d007d0079606dd7bcff2c7f8e3f19e03651d8a1070cdcae16fdf6e513adaac1d451cf4b01ab841a78f156ff8f4b15fc5397dacb621fd942c9313cda93ab5e122581da6ab5aa71ea65c72b53974041735c5944b677272a6ebe4f489495cc935683aae39bcb7de516881426f81d3a77ed9ed59bfbc78bbb73440434f674b52f04aee3607e806627549b707f641a863c64c4ac3f334b65ef747bbd3737bdace21ea85d38ec95032379dd2b0356ec67536fc219716466f30ff0a951f67cd894bf7062edddb126c093687a610484df5a32a54857258ccdf22b92d525d04a424d8f4a9e1835f86f75683426d911cd4585bd86d5b98087259a796a6e6d017d446ddc22d714b4a21207912ae23389dd93974c31e11e492dee88dda006361b0593dfc341310cc5d7299bc75932c29792b367d02fe2ab29b2ddffe73d2f007a56a10385dfe17cc8266fbe3f8dd89053092bbf7bfa26692f42f03fcfd02a0904b260678efbda73a039656010510720e4a5597006c752a80ab0a352b87dde1db1dea92c89ef2d6fd21d2c5b8ebfee7449dbc75df0024ade2aefbb8bbe0ad063d2875bf8252fbeeaa2b92b7eed7f70fc37a54c369094b407f70b5e78d1a5bcc9e9e16a5e0ea468d2db2f59608d62099caa4b6cba0613a08e298f3fd0390867bcea8135c89392ed8ab8a63ce39e7cc60cf05503de7a474ce39ab1017b470410b75bb2e8d4400674f896f168c07e125eef2b762ac1824a4224536bd4a5769d3db2eeb33b164cf2b7b3ed9a43678410bb509492e31d4f6c7500e549b1c33d5251f6e870ab515e32d5f926d937bc923b67a1e554a4df8be7e5fbfafa0934cbf76b5ab5df7714fff821af205dfbbaeebba0f042b58a93bfeeebdeefbeec16f00bb7bf0ebc00ffcbefff48c06e85abf0026f4743c20d9b2c17724501b7c47e26583efcf3de824d39f18e76c671096c9d9b30024e4fb17d490edf7e0b76a1087f3c61bfc48b2bcdec23fb14c8fb7bee79eee398740a0377fd101fee0ddf4afce7101cde10f3e48410a6a0ed00dea06685b0013aaeee1ee131c0c91448230823852041058182145f45b1533850eb31d5e68f2058a2ec9085937ed0e6f29ed700205296870d2430f598410a22b2106ef488f274640a2c5114d767842c2b64f63bac0965841142f4628cd89050c2b4788e08624685c3a101851041fb1e285d203591246872637dca0e48a0ea966457ea56cff61c8fe5697970b058630010f5d58a01dd1a41ba126e5dd0bc05050124b0285a8147422d46c58cbec06a428aec49a88a10ba196053c62830d2928a288305844d0a183d576a0a1476a0f15a69890984a32c6c68da94de198e4a815ac0842052b5d48490aa31685b3b956259a8070fbe2851794623a7814b518564990a00b1451b4c46ee0c0f0e891da0bb7c9044249102980e1e94b1556c4d490d85a922a27a93e4e8044851121d030821b56501be132a9553bc50aaec4906a21c4f0851630d65afb46f28eb1ba8ce45aa9d0ca83521213145844b0a289175abe702e7b1b8a5411831329a418a946b4508195b4446103432e47ccc930048e0d159640291155c44a186e4acbecbb4942a0a549971f6eb089208c161cbe7b24532d33d0e4249e444b0ba1529416116c8ae06265e566518497ceb3057ab86551c11547c2e8418a1364594060c20aa618020bd74511537858977e6b0a9e84cd051b0951bc38c20ba78222b6747ea4c90b51b531379cb083162338304520e1719574627b62427241072e382e94ace005081f76f832858a6fe96e96215172052d0460a2102326054530e52bf32506206e43d41053b205e74b59e856d17a1223c4174d285061845b1125a86ef55202272a2588218c089c1663b02b390b3cf4c0c50909214449ca62e64802bef80085890995159c705fa400b9903282929426b65ca14316599210a960295964b952801e9414e1f4830a9880e15464a1225ac942823c44eb10173c48d990c20f27c8e2258b920c9309446df1c4c6b43404150e6a0c9e4018148288d5848872e3ae80020372d34a1434ae64950081ec3df244834c0aa72b2a4ca9370c111ea1800e26e410a50a132454b1026aca4a890424a258c941845b9410705da0986aee110a85e403b27e641a51220cd314314f5e64a9022ac67147fede7baf9523271494e0e10729da123a380aa0eebd7763d764cdf4f1b7b73c87ae8bf92c3f846003942861603b7054101106c621635cab942423584871e10a264b8480438117d78fd401200166892c4e8cc0040e5c88d862ccd3c7c6841a5875a18b2b218922060726aaf8a2045db829a0f08e14e96207134819610a14332998e8c00c332c524ed084165d4411757d3a81029715580821ea85239c1411b4d06a21e20a771d8718931980b08202a530382888a8c2390d242c9488e24452d416dc13449400ac4cb630c97828e10712e08965b6f260d10483ad8a2a49ccc09d40866dddda975f212289c68a063688a0092648c022b6026e0b11307ca9fb8c0bf188148d5b6a654631d101d97be413620431b0c005942c60a858640939772b26e894acb5d6e71347381183a2e9052a489c280178a402575491c2298523312e4d2c11876841c458487001092e464040e3981822d6b9d2bdf37ebe3fdeff5b45b02f09dfbdf7823268c073885e24c0ccb09e5c266b7d66a1457d7757cade840acfe7e47499afb676de5c75b02a7cc102172938114105596c4fe0287984791de167937a6489ceda24e53273bf4302b660e2842b5d84601ab344ad6b22e2e7a8290c122eac70c10a09342580105725c83e5f2da8d5cc5aa11a84adb5b26de8c49624820f25f060c5cb72496cfbd4c3b65fc381eeb6ba0432330bb9c4e37629e0cc1864e1436b86002c11802f0090426b842727d70bd99312002926188491710c00a892710b4764156a7882b9a2a4208a36050094c8aa3d9f68494cd17ab8e04bb6d9f38956c3055eb2b7e7138d89b62484ecaab0f29f3dd9b7df696387d2a0efd5bebfbfcf397d7be9e307d874cef93bd4460694067d9ae9fc0ce8d379c3891c4fdd8e727eabb575fe4cbc13a3d571f7bd960e28dee8eecd1cd97117efe018db6d0f95ecf70904573dac7a08c1cfc3d539bfe00ff7feb8add53bceddbde3bcd65abdd66a2bb5ee6ea79d6228aa9c521a1c9deeee95d269c15a6badd6ef9c40f54bbc7184506a963cdddd67786b3e56d27577da8eebf0c59ef5be0a86d37edf773f50bc4f2c8ded8fc505d8aa050c7113f3fbf9de5d3a5b5dc6a1f50f745eede52e77b9ce76b8ce983fc36e5a71f8f8b10801bb3d2ff41e04c3190ee4aeba4419e41aa48090da30402b4a559d70b57abb7aa562ae4106982e7f4fa62b69585d6b9986331ca8c39d9d1ef550208e16dfde67163fa420b3fdc71f9670cec7ec72e5cb9e60268df98c12c1fd73eab4e79411255d3869f20313a957d41662d3a84d8308c116df3a90d0161f146f882a104cdae18be2e73065faa26a47fc4fbcb152893a0376871ac89cdaa01e91f87e9635fbbb32667fdf13104aec0f0b94fd3d166f7ce3f6be136f7806c0f80a958da5367e4ebc8127d00092c00cf083086a96d96c5b5cf36dafa8b7432b0a12c25851e40606edd2d0848f4000c60e2e3c4d75310b02091fb6503a6bcab3f594a504b1fbc41bdd986d1f639ff2230863892b6ea0e104501c314495afc3d16996945cfeb7ae053b3ac4b6fd6c9f7c90b22dce6073dce7a80d04051412dca0786284941767c4e6fec781b8afc1bd02e6e68e0ccddd75dba78722db5a2156d7ca0c3be9e8e704166d267c2a98855114f1ba9802b338018371fac29410ab12c6065cdc02a103a8942df6553d0b11d90800000023150000201008054462a160349846caae7614000c7f9e487c54968ac324c861148490310410420801000000034668688a036d8f710c200871e6e8a3c2fd99197feb07902cce524cafefd92f2272bcd65401e29fd44a851cbb690287d35105a34ced90c269de87d3e0be909d91bb5fa76f679e3117fbba73089e70420eb9c6e748c104ff861eb8ca2b4f51f3746c329ef600837f76a8b554fa6763110b7f4471eb75b4a8843c73b2372d6fdd865942867896a2d7345abc89abcce20d52a29b6128bcd81db8c86442338ec234cbcb83b6365398fedf854fbe56c2e36f1919cbee65ed49651a84b2d2021950d80245c84933fb059f494e33b854c2b17733857119ffdc11fbc0a82805171c16ef79e67f9e508bcab21dab9bd39fdd34e89117ceffcda36a55d60a51af47ead2570ff91d6970548457d049f538d49fe984f55a7448217630bbba23ee863dafa605f916929aa8c9556831477fd2d67fdf87a78a645e24d71f83fecb1ac1c4fba479b8a441b2ac63d25686ba86877030a0368225201cc865e5de05230a1a5068326f85ae1db86da83a1b84dd5ac66478224ce7c46b31354232fc493dd4a20283fbc2611d6b827ceac5992aaec1f014a6f3c4fac1a279c44aa76864b811808fe53ba7669060cb5a591fdaa5d1593f25a4afaa50e077acc90d1386c54e71e81d4c865a2e3e2766196e6a177c2e6d2aaf5f70402d7349561510db41f2151cf10e2a10b00f33e25c212184dd76d121bf4b8884e12590f16df0aefe8a6304f006d9693b9f6a73f5e80ae38a013717e144eefb77d3705dc29d984dc27a6cec0ee48796056bfceaedec36043ca5fb045d17d472061b98c4feb21138944c98a089c2cbababfa11c4827a16999e6a3b28b1b1342e0f87680392c503abef768825b451e818765757622b81ab5e217f49e4da8db92182f14121fd66bca5ac8726f3ef89b8b271097bb930e24d9eef729921c195378342661f36e92d849eecd130e7c7bc327653beaeae6f6845db752730f65a72a78fc49768ce0112f6225a100578128f489e79d1885b9f7bb00c1b0dd565cc633936e97440197f426c243ffb76c482e9826d733c0e3646f34fc6c67222cd93bfca368aac23def846c5728ec3b129774bec3e2e4d0b649c49368dda9644eb1b9b48bab135c1de477c18ee7221620335ab8a53350ca6867735764d98a5c238056f043fb133de1817074fa4834fa1297161212ad602aa122bd622b67531cce05f4db869de9249d103eff160a216b67be296351a73c72c2a1db5fd7291fd89b5a4b3db780b28a22dd354c8dd48c5db792cd964413b400e6d521bedb08fa8aaa006b988ed2eeb0ce3d13c48f88270cdf57794d4a4a5b0d35288332432c4e6de9dd37e9323f52637ea01d43b4b4eb213b224211288d915d5192c82341d15eb23c94591665a3b6007d41f901e3af918fd4be2e548e833b5c30ab5d456b8b90d58a1b11e01e170cbf870024d1e774975734acc1670c4f50496653161b7488c5c799244005f420b4e0585e7466a0e51aa980f59e468eb3f42eb36006b50aa93726482f5569b95312cd5489087d340e3b00d339839f8f88fdad053e7ea13d8c9031b388dc5256f34874541a37b04672d2944331b4eb190e0f665ffe24aba897b774ab1170dd37eb49c12b83ebee61887d905bca2fee42a7b5dd869d9725bc5f8cb96d3af5258c4e73e9759806f80bfeb254a4e61cac8551876fba88335ab9cac5c2ff0bf3d0910cb132763f313fe432b2d06c76b958cc9398e9a4694c911cb32c6168567e2874c415115d534da8e3d836bf9cfd92f7521fbe09297a3dea4465612352a76cbabc51d4e78925eda8a98a86291416b539ad401209a7864744a5a3013003c65e2ff738b6528d7b8c404ff0637ab0bb45f3b8a9e4cc9f0593981256370007c416025a8ca3f3a329754d015ea4ddc946922488b0ad28efa94a8f453a8f6657241b86640952350a862d412d01c35369833306f0889643f44a46a468659483a5d84ef7f2aa297eb72a8aa46c5f7b63215e395ed2948e3d05cd5e3f2a5ef6bc28208d2186b29fe9fd4dc77494f40476dfa33314401025e02da5111fe31baf7155acc08219680ddb1a54409f1b2510cc6ee9d202e3322841bf706824106fd43652eb3dcb47c204d3ec8b905d7b1b2f2031b13439eb7f887acf40d21a70fb149fa59c93cdf295a897643186806b32be00f7cf31ce2bc369c9d4f35356bb187f51c289e4b6474b5e2062c6114f8d95e69919c89b352f09514d282bc828404c2ca8e753cc7b705dc7b2471c693b62e9420a6b981402c1aba62eaf8b115d1f53d468bfafb6d517d1d9d6a2501e571d509a3eff881e11de5b7463775a0002d7093b55b24ca71acdc3be4b8f474a6fa64bd24b98a5aaf99027aec3e0ef6c4b7833c81ab30b7edea79ecc071c2ea37038870a228971b9311b9ea2ee7910f26f5bcf29655e4b85e89031b5f81381fb279dcaf80242a0bee71db5506125d5285062f242725ef1e2c30c78abdd8e7ee8b2d374a91e0243d59c7acd54f46d2be44c0b7b27cdf1ac684158ab40c58e6df6a2a3ead8469e3163be4178ecfbb53a6a43b7a4c895246d9109f0e0e58dbb7e596217ab5804742e86c292728964f7de04dacde186db7f09d2522751f7e021596fb0d4f8da8e5df75449f170178618fb34b60a24c43586d6217183e275d9325f509aa248e94c9cdfd6c1c2bd2cd3ed692ff0da7f923146fdb2b39ed7a835aa9d174a672adec0d8936cd7222935e0cf19db4465f0c99efc30418fe5b15f8eaee5f9021154af5e8e330ee0c2983fb1c0d811c7a2bf6f744ba0d54b9108a13630dac02bab1af867a87a5d53402da985c12b9dc7c25b8eb96024a864b3988bd2f87b917d19737f8f2a2ef98a492d7085fcb34a90e9e09657061d901522b85e4c391ed0c8f083c7774841bf96ef6b9fbd4aa248e42c3b4cc206d5d55040124989029dfa364c8432141044e462f9f74329e06031bc263f792c4d88203bb0841ddbe2c6815fe09d01c2ddc6de133771c4a536bb97abc1efe29c7b970dbeb30e7e6d6a9d2a88b8419afa7c9d33be8092e32fbe897cb11a2308360a465724d24b35cb3e7cc167193fd0383b9144214092eb5964e8ab220d5c4385d6a15620befc840c3f1b6035aba29d32d11e33a14a7dff61bb931429c3931f29a994b444999a4e25a0114ae58f5e406f947acf1e494796846c1c816dda64d6729874de08856120e43a2db6120af832ead6bc970323e358fa5358b5cd50e8f194f9e7af149fa7be620ed466a74607c66621292f0adfe88aa038abad0086538bc9038ac66c41fd1fa31be8901988b219a5bbe18615a36fd6940097221161d7a7175c87f99b85e48026aa096c8454404da8972d8bacc0ca388c5d64e5ebfc9d16b448c68be0e1d2ba9ba2e3080a23f41623edfe3af551659af70b9524380efdce306a16f46e3c409195f195e23ed018fada946f30f6e871461c0b732d16f356898f072022ead6b864ec4b721944d809c6ad3728e469e0f375b4ebe0d1ac2e1f8b82f02de4f023fb37ca2466ebb0a0c5c7da2603bb893e566dfd6dfdc1d79dc6d2f4e07e197703dc5501e476e68ce57bf2a323faf2f08a6f86933d638ade6fd8b8b7e6e78b81f78169ed0ce8a3578a6676e518006674c169481a8b30be9c541519ae1972961e2bd8b729810dcafab18b580cccde253f6bf5386fc86c44e95071b47f632f19fda19f2e805858b8973bb426539dabc414195394169b693549c9c2074ac903f0245e0da0ccbe553bf07821208bd1f823940bb08e175d42a68ab2e4faa8588291332694c31cd210ee6e3a96ddd2c4d5ab7384009e6ad5a6c93ac577593037626fa88e7cf92672d52d324c5d6c96088c37a6f5fb5bf00b9543cbcced90e4f84904da2de0d46f60ed4415fcd54b8fdcd0435a8d16d5d4010808fafaf9cccbb657014bdfd651e5adc7c5cd75d514c1ef36529c6844ae9b31ccf9a7c4b6efb3670e11f2b53307f0923963de024dd8fb8180deead008069c27b10d299a84d9ed1be6d545e560681688a0bfa8a030a1995f838ad76724519024bb1c4a5f9af344f037cc6f48859c9c2f44d5925e65f0d48aadede6812dd5f3b77e6f90d6a38c5fd0cf474da55c7b768a6b0673454eb32731f17f4f8140ca2846a640c6d2855876d4fcf9b4df27197b167e251837b7e175aeb37d945980bcbcfbb3ab07b350ee533fa234d0c4bb22ba140fd9458b1fb63029c5ea1f7a37416250e553d6b7eac8f53d4c79154134c91088c5c19ea7276df25e519326bcbcff9c10e93a2a7ae5d11b3d7a2bfed0ab03cbd130a10391f87b1e8562519ef4f5a46be5e5f2ec1af93ecd8ec786104230bf4db371927ab3b0323c7cc853adbdd7bdc025f08887230ad5144f855e8afa121cf0a919b6ed61a1ca4d66ee6ad03a9374ae0b46a0d7932b700191a815394efcebea5e5ab7b783845ed7a72fd88c9d95d35b9fecb0080d36a5f92c8102a6182c0380aa1d61f3d956818174caf9f764c8d22b1e5039bf27844b9d4ae4d8a808e08a984a384dd3c99ab9a21b4bb9ca29dbd2fb3aefaf0ed3e4117221cb8d9a42c72da1640e6a6667c0195d92b54d14b802c961e4f31e7b3138245b85f9872d36624cc29f254d617616ffb5dc348850184f162305622343c7b1061ca69db8baaba312471aa376df5d78327dc650704987df93577c0fe832e32dd2a6cd5b60208433173a7d41bfc98947a727c0c726d2d70278b9899ca3be51271d4a9eea132d2b7be91693bf8d17347ca2a34ce481958b9c06589e7329b3192160634a420ae91a14d62b01c01622994da47ac829b4159762d5a45c456d9f5984fe08070a2136323d20831b3f76c492176975158148989f1064b25d2e6c660a7f8d6fc1c8d2cf8986483a2963671cf3b628752e265acbd42669eecbb6217dc5acc344920aeae4ebcaf63252835efca55c6054d883699aab499087d42c14f46c96f0f94825e0519e47aa38d7816db244346fd4cff28e9ddf5fcdd81cb525e7457deb5f4de4af15bf410d113111ac6b87b493ea43948c2422d4417143680a5f56073cec1b177d12aef3381a84079785f35c8b02da768ef2673233a18baf719a00f6b6049e897a377604f01b510a3d668df8e7ee6952464396a451223ca0429eaf7efa3d25e267ca04e83dcf350563cac94046e59a8e3679fab9f16b02813ae0d4e98d5f65743389611621f6051afdec4f697f6fae3367c7fdce313fa19100c6d596c33937d06ad2a875b2a60d3bcc90433ee06e44162ac5ac41c02f6f96e2ca1e12958893104793125b10c0d891577ff0c18c6c4a21573dc159cb788c67d8862f73604cb5d50e75421a14a4147d62f6e2f0f92bf7051aa4721a58e208e31c49037979472d1557514b7483534a21550498bcc95d88d3f813d5127d82d786263e77939904e550d76f72e8b74aab3607942d9eed3e7317b1e98e5ab5cc178e1f1d01757f49bc3c20cb1ebc546d66004f303a981333ab505889b7320a029cc63fc3a337750a876c65bac26e82976778493a943deec4bc73c1ebec2c284e57a6ac0cddfa6c3c5ea55ac1c7dfcce9b7a5780e535be8331b323dd7286d8ee090ba4c6c9cde7d2996a38a0698cfe9813f3cab6610d4f974c964e41d85233a6c8b8c05b673fe67eb04fc31f19fb36f503d51f3679933c137fa0d0290590c18b32620155b1023c388808b9de48df91d1dd87780b6c70426da691d7834550a2016158e3256354f58a082b0afa78671a0423808744059d32990555fa91b6b6cb80be5d9a7b599c764450ac90a4608ab145f80308809adf3dbec8c2d6146286d9c7dcbaf1b07da8e11384f603eba4859326d156ff6ece92da8c6e406bd3456bfb315eeb386146708298679951248c8caa31dc0370559407c32e899673b52922a7dce31d52d7d35f0291768461d326722c9074c9b64618b4f26f1c57f17bc0a5607e0294850ce26dad78e7820a866f2973e5852f79bf3cc5d1449a39beba67408b5a42c50c91d054e8ac9df40b01e2d20e212a97d4259f0a88808cd0defa879ef11c3e4ec28e9acdf3667fdb86658a08cd11da9e81610f86ec02125e81c733a6b3491dbc0eae111b6050e594da4dc28310bc0875902ec4e1b692ad73e984bbe83a601910115b6cb3a4ac1dcd080d3951b941d55914e9293b33aa02730b2c232694da072e341105a699575cf523ab14044927cc8c714c0e0c26da6352e627c76670cb35b876cdb04c24ab7584d07cf6041830cd0578f380df3d9e0e0586d2fa8a1c029703d6429317e6cf0dd08ebba8cf243c9646fb3b6969c97a233816686b72088732ab2044209b1550a309dce7722289f3bf8aef8a248de09c7fbacc20e7fb775ec535b86bc58565426e5df5ecefd09d29564aa41a5f707f28be0d1531fa17c41e87dbe76a74b2ce9627eb190a5a8a62f6bc2c3aedb778378f18b5593477a45942b6da568eb2615c47f417cd0a954b3bcd884f680e96754dd20e0b0577dbdf039682875c0c6ebe801c5821a776197d26f9f5337b4a9c217155afe6708ac80d55f9c155915b68ab8730983025824f3d712fb8d787780d6b4f7219c21b77e2e5e32579e63026066d29e68d3baf8e919e54e1800edbcd8e104662f69437f217d768c58e7d09e35a09c23748251392646e1b56183cedf2b3a44ed73d74c160e6f473f2f002757b0d4a79527641cf89fac7b4202e9c9b4ef1f1e0cfc59b3ce9d87cb3fddb6c8be1ee52c5b2166d063fa64b8913abe39e4e27288cece83d183dd9fc8a1c6150dc0045f2eef76a206b60c154580e39f4c5ae5bed93c282a60795905a2aab3c9fad55e4960a30db96ab82d4d91c3f93a36168d8b5c703c2abfc37c69a455de463d2c31596cdbd768bab16d060810665c9df288da236319d763910b5cbc549f4a88e04ba39041d55be33d1490bec296e9bd74f3d27f90f8c8a7e595693367a8ab7cd19bafa03a9e0b1b1072df9014ff2d91874516160e8035439da747e4e3a1de180509e3660d077dba87dfc185a2a0d8d4b01d84ffc279123ee7fd619cd553baeb6348341f391c6431515367cbfba8a4f9abfe1d345a283880dd26cc29bfb4e76e2fa68c3eca4518f1d4594a1e6d2edd7c8245ca90735dfac80dbacf99f58d063a23f884913f47516a157106a122cc9de5d63460ecf0f6565380e9610da6117378590ac4ae726d276a69beaf2fde81b8b0c2326492769a6fa57af0a62ab5105bdbe3a765b8dfdde93f5f89c762a933463b412497cb0c4659c673050e12bbea44ddc5e50432b690c37801dba76c973f096484723726ea2c1d3e1730f2ce7a06631a4b0f7083a5261888fc691d3843f29f631781f6d4e475490e8111fa08a3c28963a52ced91484441c16a5a5c1e1abd0a7254b621fc7c7c847e975947de3318d52667add960d7c1a659e347eddcf6d36a3c27edc22a853d734311198959d471b20d6ac00148c48828c90ea6cd7142b83a520e522fb7f72c89722581cc1de63af0b058ff6dcb86ee09f0237fffd486cdbd1e4ee818f93c1f8c99b44632beb11f998a9d16e79930cba43d691729bee0379dbaa8058d4dbcf45eb7500e267dd3e88bc696bbfb1e2feb6c60a022a1d7826ed24ea77de0038578e82809238578e88b5a93720dca22235a9134919e0ea949a0f3db03283b7b0bd468f07b143f56f1e0073ea7fdba5d85088ba210db497ab80fd7c68dbe409c4c1853467d0acbb5cc21a442d49cfd634d1118a251884becd7c27f63b002b979b1939cd9ca0937248ca431020190e2fe7b3d10090ec1a88b3117c7a1b0ea28bb3a391fd641c980ca5d0fe5c4c90ad02a7915a9758d28d42538e3fccbe117adc740e3acad8caeba6a4a6d3414a39850c749b4d2703bc6b244b5d830c4ac647e4b6ad74d7a785acc28ae0d5d85e1e90d589e64755ba6b9c6ede53ab4a89b84b358cb82a794bc2f8faed871e0a7685e059ecf1618de400afa4526b43ed5de41d767c6b827cca2792d3112f5b5481cf86527919ff69b064935feede3e023882b2361c2548e8a9c66ba34e0975bbdf2a5285366762239fc725335b4cbc2412d1018e336c0a484834e7598d1eb147cd7c46257178b34012aa80f1a9c306c6d63d4ab613357f47090fd42844e596a824340b3680489457bf366085cae375733d30b61e4c64f4ec6d833d1050e120badd0259df9f1154de9865955b733738c8996aaa1cbe091966e68cbf13be8d9ca71ce17606a9738bffebd651c38ba6b23410425d1bb2b8eb91db957a96409c33729636345d9281c1b320651f8427e4a8a97282cdc9d57a2d5ad34e1e579622e9e48504aced3c1bb9c804e5d513cceebf69c67b6e6efb63c9ab0bde412b46a6e884a53f98cc2d817215302c7f5e804bbb9d7434f551f287c419635faec5497de2bb7fd319265ea31cf8bcac5f4b9fc52d5c4c60dbac2cc244045cad802b64d0310881ae4b811c7d70e70a167a31275e12185fb901f18dd254b79863a352ed85dc4a1dada9c7143b189710bf845c32f5685f872cc34921775abfb74f17a32f85fa7ad99a78e0d9f502dc5b479043d531d84060c454ee33697f3fb87785225091e6460b48997a89bde974e202e57caf7a6e4d84b555de206508655deaecb02956bc52a50b9dbd102b73a2818ce8d5b24fe28e77c10969539505d5c5a9571139882a2d2b9697496914335120c26fc917c3ccbdb1d4fa08a19f9755be20e44409fd7fa6a699198aae6314c2be68c8d17bfcd156043347c335804541a288e0ed573177f9fe336755b2394de9bd9a6046ad8fffc825de8b6507774001fa222dc46ca404ee0f9ee05b032bd900183d587158c4aa81c80c5be47099911e36dd6e1ff21e6cb36c258895fd616744426461f9c441e03bc8920a1df2034eff5de2a8f6b554c61a437f4cdb552a04d6f62b2672f23dfec82c71e57c5c2ac5d60812d353b92df92b41877bc289423a6485b3cfdad755210248ab7324ecffae6f0a30feb9b26d0a4f1749dbe10464de05c20fe8e58861585010b50c6ef69d84438265a80005aa960ea610d425c433f4fe86dafa281860e27b5921346eef35596eed0a3372324e98a3620e684096b49b32cfddddd03423b14ec50847c12480153070b4923fedebe2e9e74e29af29fab189b643ddd67b3af9915286c13e69bd5c8da852425db90ef02af3eff628d3513b8b90203de9c28b7e4a2f191b4bfafc65efa0db26fe78dc60ed5a95403f28f231fb05006b75ceac5f1cdde6d47c73058480bb8dd6ea5d0527854994cb35d99842b634249b01e9360aad971fb54123f267a2cb78c90bc9394f516543d0fe79d5bcb447dee6d13ceee72470dff088ec66e67981b40b50bd90f499452480d9be1220c53d80eae6d5b1c362f4bb8e3efcfecedb5fd621671e7c32dadc987abc3a51eeeff0b86c8097eedc06210d4177a959c6aabaf0ade1332c7abc33e267d1f9cdf0af150d87347b4804e15fee3bde26bb4760f58f5efd6733b47b7e21b781886eda52f2d20914c871bc9aed6842218a47ecaad0932cdc6f4a71a44166db01f873b5db97ec511448ae13d7a18bea9c14ba4a004400d9b9f4bcd59110ed1b8ce6c0ecd195dab4ec9fa98da84adc0c37dcd0ed9cf2f82625d90449a78d34d09bc7346f579e981ba7d21c29aa748f7815a5aa8c7ff6a16fd90ea4169237690982119dffdc63bc501fa4095650e8f6590e6c34fdded79eabf797beaa983ad183515369235cae4312ca01e3920db2a510c17c298fee689afb94f7f54fd79f05a8a46f8ff3364549f1a21af4224c9bad5faee050c4fbcccb16b4c832243f7a493e8a71c5c26e910bfe08dd322572a85ea26b5efa2d630fcabc8b54bbe817a72fc6981e0ba285f55524ba2113cb19a009b68905cfbcd6757fb75f569f14f297cb6ead4c7402c301262282a644081a97b35e0305febc42eb70e132c9c7e2c6e9fe1db2865f796e8c4fab8062c16a3e8ac69a2749359f68c465a1a42dd3de2de2af20e473c0d85f6df729b69cda455f6784f4eeda12e1f8008b436405e5877b2d2b2cc2f71e1822049cd117660f86032783d892b040bc52111dee68b8fd05950adb710b8dacf4b0f3a732622a22d18eb841f0df15a70365c4242142dd0670cf257db043cd878cfb6898d3a49bc27fe859db052d47840f8e4f406bd7ecc599a93533928910dbcd45f871475cf839fc643b470fc8b1c89805e226b100ac2fa986710e1720266d7148d2a55bdc0e70f8a2f10c19320f05a9ece04d13631599749bd954b9813ab11960385a9e55e04090c57b4a4a0e4318aed26a947aeee94e360a72ed4eecee06e7b04b24722d5c4808e647bc6e8e1dbeb3d5c5b7a4d842c4b7c2e0ec7ebe99137fb0c238238fd34aee8b21c45a280055da9204c670a5df10901c8fb228b38ec71427dabc1e54c8b2601ca0d9e4fb6198b08385011c97e4f74d6f9811b17237cf0d2db135a188c99ad81736fbcfffccfefe6771f2a60e98ee426292b92543abb636b1a2a8244106f2ad7721fcd19ca66171c6ed70322bf162a705ce8eb7a95a2d0494881ce5907cc328df0a155cfc453c0057f405c10240ed393e898e8e507e2e443f663fb4508a9679e70984d6dc598c4f1d603b1e5e8605d70a05849059e6dd6caeedcd5dbb051008a81fac4513f74891331e5bb94150bd0dc55a87e6d5f33f7740e051604109564b8b49c4b9c518b726aa45f460c9aa33efc2335ac8573edeb3ddceab85a4a604684ea15248d4ac273359b83f45032c7ebfc7d0d568557d261ac2ff01a42f0f3467583837a6011a62634323b59b107957daf7f68fe3fe947fa2ce34e591dd3491890c1ee75aebb9ba3d90c1674814bf8a5af169e4bf4e00f1e732a78c9b0cbe05bd01b8a704d76777bee7c267219ecc7b5affe90b02bc7e09dac7f4d1975c9a8e7f6e66351112cd80bf16e44ba13011d2a0f5d011badb03789366574cc8f0e60d29ad93cc40f58360eaaf619adb6df42c4d4e0e6639b429647c9f0c4672a5ddcf7c7204dbb1b0d568e08ca0dee4b5acf3ad746a0a13f6f1600d64216c34e69a920616891de81e515d884b80f49f9f44aca97859e79b42d3535a1f2007e83cb70d247be91eb3aab89ca9b357b0ee84f90c9fe3717480185bfb7da6c27256c1fef6607b6346257df31eb705155d27bd341647421e26667dc98482ecaa88ec4c50c84451a0e4952df50c7c540a09bb490ed13b0fd6686bc1e92833c1806c67007f1fba87f10c49a20604eb996cf479a8543bb003111baf87b8c4316620f360d492dc26f11c4101cc274653dc155cb045f9f9bb90f17b9bdc54aa84ede78f9837e4816ba654c213634e5c55b8e5a0538baa4a51584f98b4b14186a70563ae4965a812a6d290fe2d6b02b933d012e6e06d53a259777a86a5c8d40c496c8b6851db7a7be7505d74193d4e86cfde7b5b4b147634eacbd96f0ecf8373e702119357b6dbe10e43a51887a52d75007cf1ac203c162f802f77465d6ff9257339231577b7e4388390b6a2bcd42aa2a7b27d1462df3dffd00f92cb372ee8592cde9fc4db6ab044308a4709dd38d85bf319b090fb53011ddea6dd4d703322f8014f7dfd7c9e42de6a98490dc36919be84b09625ff99593a81607a21ff99d80ac5de1086828d5e10a45d500f5de27d91c041e03dd348c7adeb04aa11efa968eebae1012c79cea5ea6de996c4f8b2038dd579f4afc71873c4fd9dc4302854a26e5557b5e2cbc0047f9249f269fdfae83388af2e5909f79b1b2df13b2f104f998009dd206140519f8267f284c80fb535634f289f81a81d49e7c2713afdbbc5ecee769c2e26919a5142cee8669879c467d6fee0089960d84af82489f0878742b61a9ecf9de3201609bf453f482a6171d10d7516f0e4c93aa75d629435b71a352f47e9f08e2d6c29838e9e23ffcae87cd3b70886581210558242de111134bb7584a2ab3f9d168f18af167059eb2a2af2a461f300c7518b33c56159d0d978a51a1a096389fda3df65dfaf59488c862d2be5762e1a34bbd652ef43a7355b50fa7e47f5b306c6c6816d98fe1b0f0c6f2e12f981850268419ed92ae5ef29308c7377ebb7d1c9ccc2cac28edd3cebed585c3fdffaad14f085b43e78ec5b1274e910dd72e11720a054e4c117d8c4954d120703aab5f42ec2c8fa5ae455e170f61d2e59e288d21721822ba9a6d0684f015e36a60cdf80ec50d28b6dde4d572dcc6263cdf015e40d50374952f8f8adcb41e8760b9de7213825123db2978483f9d22c1106894c9e850c4759a8dd4d592cf8e3d2b964b1ae1a2caf9571701cc2eac65e1130bea9d9dabec0c4498f4300c721491b3aaf95f3d54cd2a2342750c8beb5c35c289d96e61ecdf84d482237a4c233eb4c9bdc5005b92afd41fe9d2bbf6fafbf3b38cce7250f592fbc52c90adfedd5fc4a2ad5d734c3858a0a06d553a0de4f8586b8655321dd980652a9bfb8f1586fa61d3332d3948e1b5738ec7a2a73542aeb36efd8ce806025c2a29fc21db88138ab40109526f1514ff1ab0d35d9f323265f4bb09d59769acaa6288da21b3f188e0c62f4c7307ab466a6daa1518cf375a9b037de6743700142c23d9f1f11a01a78ed735104ce10a45f78ded08cee6d4e0cfe7d5d8af32e258b43c82de6ec22cb43aaf3ec33ba4b19752d4f8e5c04245623e415e17b55149b63f5db00889d8a451e158ba3e867290d6816f33ea5f10d54bbfdce0a6cef939db5c694646f85b0752aa6428a2d05d2ed8395e3d3d476692809a7b044f0d4fc417fa741c5f837c609934722c0bdf518599a7509ca75b4ab4539c6cafe484a9e9610bcaee2d9c17fb872aa0c23d26b1fce5c043a0d174a5c90c33e3e50fcbc34438f15fe7c3b95b637922d2cd4448680ba54a3407d3827765301f7a00b8b15280a3a4fe5327a6579c31b81c737b192c0d0eed19486bbdf532d4adc63d10e6e79683d98583213522c0c08c1528b88f51dc9529eaa5fc2e1959a28385a5d6a48d25e891d8b033f378695c0eb15523f02267cdd728b3fd08bb42fa3d8f07df9cb5aefceca2cdd1a106ec25185b75891e00761a78160dddbe03e88d7597fe0613a6e3486c341343f789d68f7f2e372aa7688e9bae12136183f6f7a92bdeb67e881bcc38582ae26fac4f8a9329fd751e93331d5fec6c7ac725098341daaf34b37480f8e9cec1f59c9095d9fd1354461578aaccf2843249973c4c9ddc9bafb33ce3e0c4d098bd079ea8861a7f15a019aebe7c62b0d4e242679592eafc949b84f04d7e16b89b3da40c83d607c218d2c374e74023a7f44bea6810e14126926710e5929b84f8cac7fd6b59fe2c936915d7f633cab9d400fe0cb3d2a1b57a5b34e332395453172e9e05708d5e5b5bcc39c1321df7f071236380fde011dd26270500aa519b2731c398a384696c81d06a3022a6293b5f7587d5ef3112ecd748bb950237f4937be3b3eb206aff085485e5dba38446925ef4ba835a196b0cc0126f1aabd4b4c07823a12ce845452d334582f6bfcb6a1ba5ba612b9175990eef9606d6f47ae4661e97868a89b4c845f1bf950d4f98fbb51b1ce3305a5f893dffb315c4cf95900a0c2567a19913708405c0042e8dff254dfa600fd76c4a242dbdfd08cc06eee27fc3a2f10048996755b18b67ff419c1fdc04abe3c3341c06922e83da7997058857f7e79cc50b16018f309056fb7118caf53fa5061bffd8bfb35e9dc2ee93e73f235c1ed48742350619c3e99fe321c4f96731288234f801a076e7ad65a7944519f70dd3d4314b5a5c41c1113889da04f23db4c87915e0124e066ff9ece35104f7217cd2ae131abd9d335ee583b9abd66b0b56719e0bfc242c98ce6cb8ec78bbea43f6a8667b20ec84037fc787dfadc9c0d986f8d9c4d4339d0ed4bf86fe7e543297569c08a71e928705bee168d2412a016dad6c2b5345a51df60f9288080b07b844ffd9cd41998a9c7c7ee05d5e44d0807880acab4b39cfaa44157fac4a0e6ed29938a01fc586b3cb3a32de53117aaf55b650441a8b4bc2eb179fcc87e1f50105c177cacd33b9751a96315a4869ea779257f4cc9a4865b53ae60249db0242ac9d83e408940675e22347357426d14a74b68d1a18c788e30f35c0706a322bda97f2069b571e51f28e3c3c59588d3dd24a8de4c11af3a939e9a0e60248eb9b323fd064f08e88cec5647d2b14dbf99473c914cf2952982388d60b3dec2124b78d2119210d326fae7e2e4988ee40ea7f138925e3e3ae884849fa290f00b62965ae31db3c2bf13d05daf792a7f51302da1e2719613bee873331678720367c6ef152b7b34243a406848074f16ec6a3eb40a7588a6c8e1f4de399b899eb807402fcda1fff38b1580eed0f5fc0b47da9d526e8a4031939f4801d10a3ae242a67e66c24116065849233e116d74c9d8033354908aae13a73cf137c6ec0b40fe464836345c17628dd7f586bdb45a4d6c2c86e67286234e548e46628595d2e87ea12ede97cf2c652e54d99da85b20c150309211c38717f31e3517a0ed4f294d9055bd3459e755e2bd1bbc1cc462fe1198a287a27165ba3c6c10a59050f91b319454f80e72f39cde84183979a6102333f9c403b698f9d3fc01c2449bc8a46d3a469210553b227898ae1036e5ce814b4cc73c8a0d6b412a79d769b31f7a1fc869570f75c4212e5dbb6be6b4dee99c5b4b656376f925d079fcb70605cb936096d0beb93639e115ee4810b271ca59cd55edd4737e761eaa7ed90a1118621542011abbd9e36ff4a9964eee76ce62b6b17f7b1dff4eec31a7bbcb40c497ec175a81dce25e7008932facbd713030ce1f75030ddf17db37a56af37c0ff28ca8c1503f526384ee4a2e04fb1081efa6fa34d1586de26c6d6f43a99b08e0737523f9d47a0bbe20070cb23cf04eff3294f8c88df955c18ea2cc91b263a9fc7026c568a586b4c1ae78e6482ee154d1d10c95170db63f19dae95cf08871d959dc56f2837cfa66a9c8b1d61f012480822d831165960c4ff9b9681c566472bc60f5fa520199de14d2bdedb624cca0a9c8d24ea21c26832b9353a48729affc205c5fe039b9b1ef52f305038bd97bd4b13cd7b3a247be40148927f1ed4c194408965c0927b7a2966d17a4a178459b16c01ebfc4fd4ae043cf7754bba6a131c080c9a2151799a1870da1b79da09a2583f4b3147255ee66c6e23ff9454b20ea6726b97f6614c139a376a49cb8fee32ed2441c0b4154da16ad885eeb4e2631b5da6c40d44ad475baeac7f2ace1e7901f2c465957f8fd929f2df134c6ec3b0b7e953e5d0ca45a1a2a43480033b8811c3bee2f2b29f62ba5f36f4c293299c9bedf24fde4b11b4ea9e83001976ddf4b760a07f4097bebe0a562f666018eecc31bf67823dce1c02d7ac28096283a0d6342a8f4a237a3e154bc52d98c381082ebe1fc17aa6169ebe3af05d0aa35b2cfb4efbc6a88c006471847dd72bc4c3057498b1c79f5da2db6386586ea2451bcd500983385aa7233440fb126f352068b06e1b50b477579e7e81743a56f2398a65494fbfe15409f4bdb829b69e255c26102675c3ddb8c3d1cf0805ce6f86251602252c366eb4d3397767b4a0a2279118b4a1e9b34336dd679666ae3ad9f98ce959b3ee4180904ee9a40c511b808025b18f71c55d43457b8340358e3e8aeaf2a28093633020d404780d89b28eb12bb999098cd4091f2cc2dca0bbc39e5bb07be190c7bb2889264dba7bd013601dca77ed76debcb6039a9be329c2257d709fa004095c8666ba67aafc0e63f8e0f0efea3718ce2a1c7255f20f8e4bbb7459f480e4b1c9e7e910f99625da242c64180a8a3c153519882b1b836ba19244e1170eb94c5b3145507bbef996412b10a206c648b716e1fe9c085d9f7e660f2e21b1d1fb58ecdf8721cc9bb318067f9468a91efaeed88462584c340ccfbd9608ff46fe2ce7f6b39030bb6ab2f1ed2dd3fb61794d48131a17e09b664753e3f60bfe441597d0125773e75ebcde6f526b98c0e0ec3d59a406d51da3d1222ddb3940f674c98bece6fc8d38531f23f876e598b65307b66eb3fc1d23f21eaf406b6467dedc07dfd10ff36d0849b4262dbb95a172c39251b2c00ba2d109e0e603eb0addaa1a21dcbec670d05917ebb2ac95195d35d0008fffbbc0047fdf8cec334e9df575d3ce6cda5ead503da56e489d90255e0e872d8b0db0635adec800fbcef58138c39c353144012007337fc63f38dfe4e82723ed0b09287ea2ba6bedbe05ddd4257429aa3304fd764c3b47282fe00bdcadf3f37b730193c343da06c80b9015536be084d3e341ce2b225e037c9a0bea2ddb76ef97d57cec9d7f2601802571fcf5b4143aa35183cab80c6b7ce62fa25c557e61009e72ce9fa5898c6578572fbbeb6591cdf5de9bbbd48ce89f1d0389d5ae22d465b6759d17258453577aeaafb9c6750bc155a29f144b6cb68d014c39ec1e4099d201726271e95ef2e811eb047bb971c1688fa4e8d6eae1350c50dd60c3e296c1a2287e4aa14e3de4c5de840284a9638806f3d0206871856b14f8bd48747bf1ebb7cd5283b09c94208b37a71c4cd38144230744ff9d15054e5484f795c05c7d25774bcc89fee821d095070db7592ddf18a84aded3b59169696daf60c997a2a8ad2847cf72bbdbd0232f73882f8ccabe44aa102d2fc61efda093fd21e7b57180796032d3c35e0d684fa1b1e0bf83fe84eab8d3f865ca56b54128c8328f77cc936bcb65cef8ae279fa62085d34877578e0c5837b374dd106fbfa35f955c40bb5a5f87ac93d3c1ede77b8ed85368e9c14ada827a898b2b900ccb1c7876884e3d3f5186c5f31ddb8d2e9393e277034bff8a0f91dccdb00047d80aa1feacccf1e1749e5940c5c99f85eb4ac1c0256abbfb4264d07a77bb1f7f3d7ec6a6883b937fdee1f027cbaeb4220d814e06b66373768c580f988796132ff93b7e9f2f318133d286e78773f058d0a8d5b46fab4ce94720adc581fde2927fe0ce443577c50a7aedf8fe75e21d98eeed93567833bf8c878b5b088131128a7456b593c21c7f0b8c80dd0012cd65dbbcf6d3f132e097081f1cb04c9385e1444cdd836e2f019702fc856a3ed1ad0188af8637f830320670f0b331342fead9091f1edc33c5128bd259d9a8ba89b95afd984e6411f7a2ff19440657edf17c8fd071a119901de9faccd44b07bc9197b5e8d72bf587a583cbcfc096054f0f78f0f43686ff9e7e95457fded4ae03359cf0db5a98844e7a5b563096f92f0c96c463209a51cde59c5ad4e3180628b7a2912e50362801433629dea3d3a9e41438301fecdb9150bed31b03751d5861f604f33697378c396867988f925953a2994b93cad955f42f8f07048a81f58d47f3ed931cdccd80ae8ad54d063ea0a0c5d3d19edfc72d777276cb652d90b307f2d1021edf9212542e54b1dd7c3d2efd90f81831d8801b68850b3471536298481492ed68d2940a140f8a2b4796cf91d151eef277e2eb0302c64212eba6fa5c0b38a1570f309a2f79e4372d09dff4ca193339f9686c635a7cac4929764d1fbd1a1d09b29416b72a7d3bd0e82567842730562cdc7e6ea759d79eed85b0ef9591761af20ca076700e276985e25fb12ec662f0db86c6e801504857202d6b50facb149a6f445449ce14f62480ae455eafac6bd218873b10daaf77fedf387a71751418bd7a9df80501829ebf41b4edbac835a7a602b1cb334798d0bc7f30eff00acd3502fbf153a91bd66e37a372ed3e58ba073d2a06dd1fb539cffa98ba07cfeee901e1ec28e121069922a5152793c5cf9fc180804a0e726a8a308167989cc9654b3805762c194a693acf66c3c0e34e7dbad11850f1bb6fe1d408364c4cb10f4f3760b686adabb460bf486844bd2e67eb69a10eeed5599f1bfe41e11a59110451a1e914d6dd4e0832ccada086a36bf620eecec50993f63be23304cf04a0cbe725a35afd39abc971d049b65e0c4fb18f285d382256260eccfe056b839b8fdd70b2237f7b060b32932aecfa2600452425b2009bcff687be3814dfee877b012bafcd10b851a9e44fc1fb135408e9b1f9f3a910bd0c1dd88c9496b45fad4dfdd97bc51e86265d863cbc328b8ed8c18e511264f894d4c668d178b5d86811e6bb726677296265f5e494fa9a15fe058628c06f87eaf3bf88e0c2036eac63e0c91ef34f50b0595bbf4072f7224f83664695867ae1bb678015bab4035e2e109b949ecc6d66a341839dc7a25d8fc84bd3c739b90a1be9e3ff519571d624952e46bafff3ef676debc25ecaf377055694cacbfe9acfa7703c946da7a0383ea2eea88cef330c855f7dd8a107b31e45619a4a9c5b15cdadfdd01a5891c289b70372b6837a44517e56066bfaa205928739260e66cd3fa8e6925b1b1fbce097d3e0aa33eab0b7c5ea4c07e422449081da0cf1771b30515bc63cdbe82635e3025713ffc0f56d6d1900748c3244887d7c68d9b94da5cea781599621673046ff43f8ecbb14e53ea300921b16e5b03deec222193f52b3b325dd9ad631c6e933cb147d83cbb355ced395242260f66e87059cb03568922dd0c4d4b20ddd90f3594e823af705800bc4b4ca4b46ed4544e9f3ec5dd01fcf74e28426042237b53c373fb7ab2ba08d7784b2ee8dd6548c3a4f1234ae6b8e3d630b52e61ab4f8b031c349f124caea74ad91ba16e1ce341bda6abde7b1ddddcbad2762666762cca329da72292876967ee170366736cda2a40e9e3c2b3cb523d29a7c4bdab1b8e130d5b493ec3d7dea6a920dbbeb0e51a5c55a6605b7125c8d0ce45db87ed89582803e338efff9c748e30ba310384fcfe1af1f7268c5fc5f7d3cc280d6c903cfeed9d66110a02af41a2661128815f02498b1d48b0d8a9eea79a54ddea152b552b4e566889b5003f6069e273e49ae9437ae5d59ec71ec0cb865a135693202bc8c646a88256a0cf712a8b1d3bd57345b148cd4e53171af122dcda5d0af1529621a0edb20baad2accbde7b45ed1f02433195802c0af09bd866e6fa8fdf9e2ad2690dac35c5dda13f24f37e2b91a3b890bb53814b40e32a963771978f5264235dc7f63fa82be5645ec084dfd211f57c5693ddd32ef309ce0526e2d226a56f498962c4b7bbc054e8170d8f8855dcff4ac4245d64811a2e580dd662575bb33a2d72973736a41bf55830ad71148335787eec433525e068093e8cfb2bafc5b9691c3ce2397dec4b1402682a8103b420be13475ad71ba9f8a9aed8d94f7f7f5061dcf987eb2d3c592253378fc14d0a3aa0d10ca2cbc59fc1345ede6b5e8b9aec74194974712a33a46c853cdb52d61c6343c784ac5e6f77be5263de5ee219e9bc670346edf8677756635c386ab22913393c9fc2ee7916b130897a55e2b9d322a1185212556c16b92e45ca748e0eb0b0422e27503822524a7c9d23db635a49ddca2b07864f2ab00c0cc0c97e212e2d35db65102fb97fbfbf135a6cd391078f7fb81c85cf2b7f7c9e36b0d39161ce7f4b5ec9a63392126d2f3b1085a10500c2cc860c8b24ab5c14b996467aa3c1a45cb8f48e3d9935ec51df6973fbbeae3ff0bd2bd1f2d42386d183c2ae4d966796a6773e4da07b73b34881c627ecac67a7bf3ed229ed927582558d1c75fbe91588ab00b2c160de0a456df45981f73dc98e95be68899d8d13c7acf6017f02802fcb034e168560d1404c5ff9eec40adcd935180b9c33ffce7eadbf6e571d741dfd3c0e92403a109ff6ec9b7f70535c6df2c1e60537fb3fafe6c99ca6c8b0acd6c2b6756b410630d3b060b3a58d0937a9b042b6daace8bc39a0f87d122c38209d96553ca6c745d74c6ea889b7dfc20508033b81c9aa083a0c93874038905878fbd84463427651a32acda86d16cd58f92e2bdd0d97a46866ebd28cf428accd2463049144cff229dbf3368a6867c3c2b90efd2dd5199fa10f547bbbe1e50e0951c1bfd086d5947976d04c2fe4977fe644319cfea2112622176327f4e129714d5dbe33cf8bcb95237a7e510e1668fb7f5c51023ae3db2b8ba49ddf9f0eca1efec402cda3c2d054fd682187693578281022468b3a6a604adfcb66b6a718344fd0d5a1ae03173449ab78a1cc829980e0f6dc5d91f8a07d1ea32c31b1ad785205e776638523f788c314347c11957bbbd80b374ef397e5d3a31a105daf920493b9bb3beb701ac738bf906b4fd03ccdbe4b09f923e5551f7241f43381cb5a27602af570624c14db3774dbf9747fd800249c192e67e9e63aac9cac9e48057fdf155a577fc35bf9134317099b64b85a8a5744ba9b440872ef8e6d7abf35acbd04861c2d59b53496632119b0007a89312cfb97cff6d4f57b2fe35793677261abe12b459edeb996f74c30650a0792119ef9700adf973c00b3537aaafe3c9b448707c100b30a24d3f012d414f36cc291b6af2ff94cdb0f76cb6ea6b129f466b702ccad0fd6d8b99835ed8e6cb3b481426c2bb11e57e117fe590091c4229924c34ef030c1144dacab32ef4fa807afda534eafe958be8892b6e843f0deeba39d2f711851a4aa693feea33fc437744459e105712a2160bc5eb054c35c35b424fe6c8760c4bc8f925ff452b7913b4e416749ee48386d36e3e6e9af29d9feafe3ccf9cf42194b2d24774e9da182a59e14268bc9eb81cc2dc0cfc232d5362afd0da1862d12b0264a62c0a9ccce61648967759e0359ca7f0ddc99e25682de13876c551f23cf4336f5d88716008f9526af3f14a99e1514872ca14569d290c9d9f36f655040820b1255fa0e97b3f80e17417959aac383f8ff197638a47624a058f704e1439c13fdab94e900836fa3911a13328a2347507b0cb4ff63c686a122e23b8ba0ee8cc21966aa22db1b92d58c913aa876ca8a9dd60853a4dcfb760ccc9e50e710b4339eb01bdd9344f2a30cefa95317b017965bf447100b703a07451085657c8df483679788121d675c2820ae1070248b46284036925edb7a06132ce2a943e111b585123be604d8ecc0b1777af93a540bc5f9e1e7cdc5799c65d7423fc518a862fdc698c5be32bac20fbb1d0f2dc41d011d034319fe02c2154e064cbd204fc0860cfed60aae55a8ba9230780f31f8a9631c9acf94ee20730242f7b695fca20b002086a4e04a300166947cb6d7812f754e5a83d5c76faff07a0072b7500c7b125e2e2ef15f6bf2498f4b7812d2e83149ea24a50185e09ffe5078f9da944a60a391365c0ffa96e6055388fdcda03eba851ac03e5d736651ade4aa54529d0612cbadc5c4351d28a5b7dcdd890d0dcaeb5ad2d8b048e1cc8a4466c149b577aaed0a357792bb1c26419fc750c681e2b5024b1392ddbbc84b1c501fa5c622ca68a4ecbd62740e5f96c65387846bee10b14382e177af167c12bbd6756a15e64826bcd3df531406022af9e179ac496343dbedd3cb7532cd23c6f3f429a5ed1d0400f42eafddcd34a6776372416486b5009cba5ff45a70c3104aa7eb6a54d66ac272bb83c786e4e3364e1e786f57083013d89721fa7e3a192e1b8633c40cdde621615498ff3c5f1793b704a27bc6f36580e6a2a5c1799ecf3b2fb1c6a516ac4a12c45c7ef87f19bfc750cfffea3b64c34e9d7fa75c8b7219b70d92c6cab6c13311850d18eefceae8df35d00642f3a7f79a8de06605c93fc23a9ac45a419e4308a89382675c9e79aa7833d9f52f895b26b0309938a7af24520e061c984d3276a136b5d094532d36d452537325942e7e7ff4c6ceaafa25ffebdcfe1b5b0cd7e1fa084ab3d18713cc8295edb83c64abe890725728f5459c01f9d46595013c41fa752db2c6aa6653bdcd0552384ccf118ab95d9d232c06df5ef249132161791026c1500853755faf0fa6caaf099d90526e7859863de08dcca5a5139b1ee568ae9d9e7f0093971d883122b9900b382b612094d05ab9746b332212b5aa40d02003f66694b1a77f52af97420a43f2df22bb29a4111a4912bac8fc8bbc4251de925f96561df87e38875e6b9fe69c1053c7c3019993f1ee0ee11504cc0f19810b0a43ab4fc2b76e71bd1fac498cec8a12509e856d6011e9881304cb23cbae4f84b5aab03de24141a7fea7da0389e61e37497a878addc42b5c8dfff061727bf557c580472b3351ace57e162b1d731f1125c5ffef82e93bf7bf6b7b4de5491f39cf1de74aae13d6e1f1fe30235a49080046aef913925db858efa3012f9244bac90106393713e26cb871b5f27171c1dea719074323faa6a5d900409e28500b0f057a3b576d045196118a634446f23802d29acb8dba93922543e846f905a3e5b1470d30c9d95b808c913a6ae0178d0cf0d8481e2cc478250ca4b44e333e3d6c0dfd7bb8cdbf49be5833198708041afa67e2bab4ab2779fe9c34c4b5f5f3be759a5eb9d9ba8d50671bb81231317858daf82ded9663245d1dfcb4164ce8d738f02ac146cc7d008c1fdb7f54c0f4803a0dbe5f8c3e605f2c547b89fe3339864ed1b2da0bd991ced317c40376c5f2a354e4627881315db417eb20a85c08d1bd5c4c6955273084307a62b9e42af0f55262e54c5981a6e110df34e8e1fa0b9904628adecf83e4fbb2866f491c85f8106aa1030aa96146296543ec21e02945003fba134e46f6e25f393dd0a6612aa102cc58965e9550e48c389c1c04a326470cebedb427e442f8b848df82a8c5d55eed0d1446c6e5d6e0ccdfa2d219019ad3d400fde350d690cf04d083844adefe5069c7066b0ea24854ef3f5853328d7bb2ea735b370eccec5f0f777a467c98f040c423fc4c3df237ee8b1e9cee6c859c860c0297667809ffc0b73af9815b01384834fcb56d3e782ce11ac9124345a3d34fc22ff7e0c3149d66f7bc8feb9743bb54405ea88902011cfd4ed07ee19c6b8e6de6dcb08e2e86427e5e675dff052652af14d7af936f032bbbe508c54fd4dfbd16921e7b1c1471e96f3a521b911e32a5888b5a4083be97a3ab843a1dacc19e60f161fd84c10fe94c9952829da6979a83ff25faea14df6f6d5c876f3103a8a93deb51a3834c9da185355a8b189585f7c71ca082295ba29e326e60b9d08ec5386deca533a03b903541380cdf616135e348c6b09a5cd4a074d7c2e3d794e44a0c4ab8537f3f53b12ad2c2a996c5ec0a1b6d9a25d920a782bbf2120262a71f816a66ffdfedf5e5dbb868d37517607e880d697720a0119077b19df4e9e8709a177bd25508b00c6c79d4b1c1ca7f607aa7b18e6f93e40c8ac9d8705bd9deec9626cd4aa06491416430f1e204177b62d1bd18e9fefa0da4d6e032f785851dcfdd3e2a2058b1811aaa976c30a067d9accbe4504abb7c2a39492889fe518dc529cfb481320dc05a785cdac3fd225936716b149620ce252d079b0f14a947bd7efa17868935b6483516f7653fe108e5c1da91db5a58a3aaf920ecfacdaec9cb997d80860e966fbc4c2cdc52f41fd3dcf8bfd70fc4a28f99128b1b5e0d412c91fd59a9deea1d9b5170e92e1ba12064847d72f9ed9a58874ce906252c6679851b735cdd5f3f17e35e0ec6117e83b9718e85bcfb608428bf03df02e2950a07e80844403f21b8b0e6ce349c5ca2c260aaa780949050d2d9fb90f890e0d33b4a8263b0f3ff72d06ad34072f3567c85a6e301d5b374d9a78a94e5a3523735e3f9c2db0734aa7c7c5787879687b485f1fce35966c742b896aee8f0361d98ff221b58f0746a0bb4ff1443b1f21eb26e1503187f52903a842a278d3cccffe3328876cada9acb5f109f1679265c39ff58a2f5f63162117f63556389d00b7ddb9cfe0346c62344ac0c9f130294d0178425920cf8c5623e09bd387d8f1d1bc4a7df18f8f38f20680ce2734505fccf2d7e13a0fa68ae5f7f949346bce6896c992cff605197740913534fc38ab50d679c92bdd04e6682ffb8581c3de476b13bed9e72cc7807e6ae6a0f0fca5cd9a03086c1a5971991a7e0a074c128727a4fb8e63240df8d4e87ba2077b50ca0c1de5ca6b4a09fd2d16022aad1342b0dfcdf706d13d433db3f592bb467f911fdd09969d1fcb4fbe4ac156a4227dfba8999642bbb7239cc6bc02d4e1cc5ffa47642171b9807bc2e62027befda4cf5d0b994e36b110580f40ae0b8505bac989738219bc3deefb4fb85037482687f8f196ceed78ef556907987d952b042016046c57e36e47e9d5e4c71d5fb7bd2327809e4663d75a402c9b6d89857d2d07375273e3142dbfbd1c4c658fc64e2436ad5d8a714d9a626b8c6a26c3ca5cd8b7bc75162e5ea63a1644e4365ed6b16107b8462e7186586b0b2c43f526f0656c544b70f5e59e809462b1e00853cae8bb57e39c55abe0e2435c53bf68c0dd39e3bcf6da3250f4ad1d47f1e9813b22b109c9f2ca6b06b362f8a0c11774cd90321561ea5633ae94828698a5b87a338a0a1ee58aa9e3759a68ebce835ab5bffab1cb564a704c220e8f451d02ca511d3a61071e59d7a638c6eba218fd186a9abe7144e21dc862d71cc14fbe19898710ec7321917cb26df10994c2d4980eae0c9c512cfaa4068fed52d0c57c9dc3fe75b51f333210839a37ff90e8508bbe215d7fd50cc4c90daa00e10194fb660fb38b9a85be80afd5232edba10ab7c98dd8e5ca4eaa6fb7828b529711682b92e5c980bc877a83b9d7f0b848181110e370bee7ad434463f90c954705032d56c0b86305b83f61642daec190941c8b687f46d70c0c0cb4d627c0af930844189d3df40c1ac2c5e0f19e598bea0d6405cbb41e35fd850f26bec7aae8873c883ba0fe69c268839681796ad11c090e891f6cedb944fb4118092d8b4397dce87fb4755b1ac74217d12597496c41370c4653df24c3df308c2c9605efcaa3e8fb55250eef97ba85bac046d6aa82d249fdd348bae7b1f6e658b8072a2aae3dc22920e419e656810cf8f80398bd4dbabc4df89b4b46328524ca43edc03677156dc05a215d2c504db8b28e876a1797ae0b57de85f634151a8bde6002948ae1f540fe4d5f53186fd979992d4bd95c2fffdaa0d02596e17b439ab392ae0f50e6bec0af1ca9668890801d5dd1c9fa69c06ef9fb04b9b0260e8279bf93f1fb0de27d60b0c0d07329f986aa78e6660a8d0785903e7bd71fa74fa1ad87a952a22ca0c215d035817ef038624b5445a326d84ca96a7486058add15801596906b1d78381b9092f504db0008628d32fbca6471359d445a248c0019ff3b8f6157b7b45c14c76ef673a927ac5e425c0a2cb71cabda5b2f323aa037543ffe1c84c1833ac61c016bbcda50b219bca8b2d210914e2e6aaf5483c943fd4e7c68228b26bf751cb466667a66529cc4c19812a8306a25776f5ceb24a601baca327cbaf470a61955474f3d9ae0aa8fedef83fd62d1d1e843a835c3b993a00f09faeadf015cb28d01b01fe5ca49864b667ba0cf0ceea8439d39cb2a9ce71f7b3a5a9b2774141bfd68baacae775d48ba40cfdeb1d1018f77ec090a44ca5f4672f8a1b6110421edbf5014dac6469e980d3e207f43e25353c1a7d4d010974e145a7cb8a5e05d7d79c7f4eeaacd410dab582adff9b9ef8ffadda3682651dbd8ee69d60464070908bec020c622cc00cee15aed981698ca7d413b83b78fc1a2e6c85bc11787374342b243093d26301476c94e671d7008c7f076dfc7d5ea5d765cc4e82b0fc85ffc8c6637909142f4f3fc943170002ee6e4ffb8a3807970aad74a2aa0faa7a3bdfe4c925757497aee9bd3c1ed174e3aa9ef62d6c8df963d0272545e3a19aca824d7ebb9e22d1818f67e98d5dc3e1b3c45fbbaf8a5e053db3fa77af51d975a22ab70321bfc40af2e3828542f4236adb4755552c9437ce84d39332588d33eae8fe5119eccca99d74962a3c9f09ee67eea15f24e58fdeb5536db348f335c67ddcf19dfe848cb1bf5f2be87f5641032816376f9dd3a983822463898a9ac4fa1c88294747715251561bed2933c08be3c006f05a7b3fce71c179e9fc1bb1de53392ba96d0080179c058c441b9e370714526fe5a01dd1ceb43fdbd75efa6324d799955a4cf9441f50c25e456c6436f95fb183851782552a4e3ba51d2597225b8f2b84dbd01ab4bebb18a49712ea84e86297c4be4e394a3d88646bc8da23d09373a2534fdec05540253bb9435ce0f9c1ee444de9557f880d3bc81ae16dee47085dec4022057b0d3cba15569f542939f58609cdacadf9d5055a9b123be4fdde7985a8a4eee0d37032769527587fa1e09cc7122c8323d1c7ca23a98dd63e970031d8545288d6224c9cc034e60731a9212a89fc6704e67f4ff3638366168abe7c5300fa1dc6b95f56e079cc9b97595750031d8d346244a5619031e924c5eaa8ab82200032737621f4e5684fa19c40de1ac18cc6d416ca42dc59e52b07e1a69f3dca3ce63ba55a4c1a3cc761148f83808c62b840b9252ec3fbb2060b9e7c75f6d94891722056d24771bdc8806d3c5124153b2e07ccbb16b02987c0e0ad70a29b48ddba6a3201ed15f4c055ce2b9e3feb5a7ff082215587c9d891c9c02c2eae1c5efd8625c6535ec57be13465f5d4b5acff1945f0a7a11b0e41546b1e8f3a3ae85fff4ec1c89c2dd44398d04e7689464ce2c631929b4652c9e7645684a0857d6c2cbbe2363496c88a5d05050fc76d488ba7f953959cccb5ce8e062c203df001a542cd5e3ec4fe97eb15619a9149022c9ad71b9de36a3a5d257a0d3ccca684666a703ded560df69a53ba546dbade63093831c306d04bf0ab91ef00f96e22edc0e9745ee374693ea38e7c9a66f766d395be678036af3520d65e817f05c7a9e4b5ee15decfdd2c40e6a75789c112a2cd02da7e7aaa27b57b50626a8f989630b47550d39efbdf17d08da5e066039e2be80c51a0221853d0d840fea4e5d0a818de468b455d1a99b98b69ba89c118ff0bdcb250fbfaef760e3eb3098b92512e0cbf2cd32052281727ce17a1d55824fe953029190dab087eb179c5981c1e785a2400bcacfb5fd63025983d3841b2123e21b529bcae8f9162068db42e1280053dae8de583b3b713f2f78738df67188b7a01f40f0918fa1e51ddf85757ce251e903bb996d87ae4c845a420e6333e0a3c292521190d1318d4840446166d1241f4a837b47179ea554e144991857037225cbcb44e782a9c08d58f166da0e7dddd3b05ff2f7cb5ca53e445a3e6c06a1e3e03c7912619a8418606b4b5a6d8df274ce2aad313d5ac4305024352e9219046a0ec8ff68f6d7ce075490b9bd41fc9940f8a73fadf6577a4742f08d0524f72500d944e950ec1a7b45d2bdd46df4bedae251dbfd53c97a4d3c746de80214c46675522ca77fcbb13500597ad629d5625f9c2ea4c38d1334225b00ec20b9127dc4a15d65f129f4f95668768b51b02341df16c8430c163878ea13ed24b683b993732cc35b987c78e2bd25f1fc6ee4e152bd489baebe997a247076d380c092acecb79c91213a29ab370776cd2c3b3871204cd156e2ce3ff091fd31b65cfb824f14f400f6d9bea7894b8e2744e60b68cc0c05084c024e1cf64867a132f7429c9411fd0c9e225f4828bd9f523bdf3f5a8c21b09dbb8f4770bde3a488928ebdf0ff3d2c300bf6f4eccc94c5b1e4551ef25d144cdf78fbab3fbf37f01160ecaf91b153e6a9322575c082c4eefcfcb41f606eacbc87e9ad7022a0916ca782ba8a2bf4f408d135a1605c85ba1e211a78747ffbd1ba7c36589bb7cd801166efcf55a8e2e9e24bc6cbcfbf1ede191a777fb4a6a67a39bb92498b8d06b287882c859d668a7757716572334aa19f4624fbd7dfb3cd42a34f6f12da60c850a21a2e9998bf4256b961200e57621dff71ff89860ab8f1388b889e6836fd22f120d9f42e08f4999454c0523038e056404d989a3dbee88cb59a57efd7c5bd3827bc85a0bc8c02953ed0d7dcaa108c115a48ebe00c19ac6a0b7daac1b1468d6d8252e93f061bc381523fbea0f248d4de1945c704fd01510d54aceebfe791ff1a44852613dbeddecf2e7fdff1e981cfad3c615f65ec413546c787497f2dadcb2022a6a2aa463bdef07ce1f303b06c8413357261f8d662a71d344737504ba69b8be1ea8252e6838ca8936dcd7041dfd6a646d1cc0b12436f3c89a7feaf8f57fcd34f860017798b1cfb22395d2f2836dd02988ac37178f82e5c543a98b8982e59a0729168c866526ce53173da0b9300e6c17ce85a74032f052a82142b290911a0edb93bade04baa6e061678107143823fbfdbf3c06c0dd0de671ab6567cc3ee3a657e7ecf6d10acfe4ecb89f9698307623643468e0ecb86d9d9b18db9ebd3272d674b43d42784367f2454b3759ca6bfdb30a9001d8b0ec48ed1378d40a33524c3a81de9f331833c8a3e9cee970f651dbfce88b26ed8f6a4240fa2907529e11a44d4b35483310d25e3c006f2d7d51432acc216d43a4de48db275262f925ac1669a7e6e9317fac48f5a8c60620767062e78bc4d93c3fbd5dd47a332512d2fda7447f76a7badc77f862f290ee4b89804280f591a6badc290d3e128c46b681e69d71c3ed2a3b6cc4c530e0479309d6287b692e08529de31d830126afb4a4652a8aeb3303d3547d00b93b661edc1b226d6d79a7761fd1e43264a090a0d8e9cca3454ff74b8257714e299ed3c6f5b6648b9c26bc78ff09121b9a485282e4c5c2b240129ac0819c8532b0b9cca4472c180836f7285d09386581375779cb546d4c8ac6043b3255ab1035c1d6e07647f453130bbe2aaf04e5b7bf49d0cd6474c25a75c67901a23870ae77c32e61af3ffea207f8749100649c3cc054c36691d4127bfc7ad18e1f018ed75f0609001dd83e41d6e2ac66964c248eccb2802c378c9252146c8674ac23b81fc13b0089add0152a1141a6472370df94ae57e54ab1c3a26c55f24a1dd0ccd360e794f0a63987a08d50ffb84a76d3689ac1211ea5d8917dedd6abf81476dd0ac1c7017aee6abc9ee1a41e6f5edd0b89b9d99983857dc32914abc1e20c29c2c2882c21923c947c980e43393500716ba97ec56ce33fd4d01240988636baaf5aca649f87fe606606fecb888b6a7c62dc99688774d648982ce1cbaaa3282467050963b31d95c29f55d427d4166b142f767a695ee5be116bfc9455f405c12a1c3e7dbb14564f94c73dc0a7af0aba2b89c172b2fe5f9c059c0a51fa792481ba1fb6f97faed51fa1e1857eafa818290875f34d876e2a17e5adcc7bebc7b01b941b9934c2e4942e9064d836f976444ebff2dd6c52f44fd9132f4a4a0ab659f052f5b80e6696d217568dea33b7a90302d011384961f7809b0238ed7e26a28492676e4368ee5548a3f5be6b7c3f4342ade03db48e82bb247dc95b52638fc38802881d0c2691f2801d0be3a66700ca06e22070d3987ff4d44db8f952832f0a74e43f77b7874bb68fa67435fffb3a5d98b034ae7766999e8c9563366a70d86110deff01dc7cfae0391be8ebad2fe2d816a06daa82ad16587e43c91dcad74b672541420d12c50f82f737de005ad7235436f404e87ae5b3ac732a92a34bfa3c20f267fd4c7ab07947232044ed716b52a0eee6bbd8388d7e4d15c904a4ac17bc8a7c57032a9e8e8a5c30ceba4a078e335cf0db5a938e3233d9e16a503d741755da53cb2b848c86c25199e1245000f93043ed0b8ca80200a4d1cd64118869789d5e90f2b393c38faf9492f91051c29563e737b8d7c5c704dd199696ecbdf796524a299394015b080f081b083dddfbbb0e92e54cac171d082fc24500c43d3192e533573280171d8acfb0e33fc3cc2ba48f17e79700bc38bdd079718ab17b78f8e26c5abd38b570f0e2740200fef30889f313080d369831481685caef5a062fcea0a9e47b518a91645422baa2362f4ad98e17e5171e456408b2077fcd8b52a900dbc50e7436cd8b9f6366bba86dff1cc9aa4168760028e60680a22e0104c59bad251901c5cc0050d40b004700c51b8d480450cc0a00455dc4a5116dfa2180e2cdce50208062fe0014b50730a84d3f01a078b3f3880050cc4440516f10146f68363a0028660380a22e402b1b6dfa4240f106cf7c4031f780a226c06bb6e9077961261628661e50d41d30316dfa406694857f80621e00286a01f88cfe8ecf70cb0728e60080a2d631c2ad4dbf87d175ba30baa20f0050cc1c80a25e81a2ca69d30fc7bc012866ad0128ea1c5054c1367d1c50bcb92ebaa26f3300c51b15088a2afd81a2a6ff44f90614b3e6018a7a0798b46d40f16657998cb26c0d28dea87480a24ae70045adaa59e300e9cd162d28de6c51dbe055ba1615499d99a40227a67136b3e19bd31a5112b09766d4d42475269426457369ad198cc2742a8f5dc49c9868100d923ad9680924d86ba63edf5c37cb3564a1ecca2d2525a9c314862ce6e4464652c777b7e1177e022761240c0b1386c32d5c05136121ec72fa7c6f4e6540c96257264c8a3109690ae5ebba3f5ca32b044605a9336363665032398620757cdfcf375791ac601a93449c2d933a54db5c446c2fbccc10238707fbf9ae9f6f4d4657f445215949636df91d8d4d8fa40eb67c20b2c73f67b1ba7b752315f46e7bce0eda5fb6a9267b2d49007b326dad71b66912d4a63ff67c516362e747142005d8b283098a40f6fc1f76fec654c294404ca94bd3d6db9f7ef69c2a5a7a983d147776a84a2582ccf6f7917252ea5cabe420875486568656665b9e200fb1b0b267ce13a6e7d3393fb9bb3d6d0e91aef9405461026da74892ec49bd6c31f7b03939e80955ab5beab9d30f7e53eae1299cc4113ba16def4bf92738cb47bf50d65aa5fa705321fa725aedc559dbb8ce4bc9e899ba6bd2e66cd0dcc081812a878e1a9b1d3c6efec3ff9bcba0cbc02b92b327160f2d0e4e475f3467ad73cc3407e3ae38a741e7f3714c74e57405e6a17d24586ca645cec5b99c27c8593e6f61b287522ec63ddd7baf067f2f0777f5f7de7bc3bf37c8fdbff7de7bf3f7b22ef8f7de7bbfbf97e7dafcbdf7de9abfb783cbe3efbdf7eef87b815cd5df7befc5e0effd7175fcbdf7de1c7fef002ecddf7befb5f1f70ae0e2f87befbd37fede9d5be3efbdf76e7faf8ffbf3cabd7706e0de7befd5b95368e6affe7befbd3deebdf75eeeeffd1000f7de8b736feaefbdf73e8de7c1cd206783202c9e0e80fc188000767c0440a7070034c0d10087831b2b1dc20d34c8c1c9c0c6df70cfdd703540efdbb8edb79b8d9bb1e96ab66db3d96ab64df3e0766cdb66b3d56c9b8c6ac360db3ea523874c25c340e6d1641be3138d8d0e870e372e8d8d17a7c376d452b9361db455c964797399ccc7a7f18e3e6ee08ca6b5f6cbe59a1dd49f6f0ee394cdeedd14f7b6e7eddf896526f9d898eca1201c398bd26a85d62b58b687f3de572ad2a702ad5eac55b6f7b548f684ef7d6d39ab6697e76d6086f4a9473c2f5234b677f35e7dbd9e5e605e514ecec3a30ae953953a78915ad1247b3e2467d5714c1ac791e98af37c11d2a73e0179911a01933d35ef3d1d725695c968d191f754c87974bcf7148af4b1403f5ea452b6b703ca59d6356b79ef609cc7e6bd772fa48f3d7ad1c1d81e064bceb2af57d3cbcbeb69741e1c4e481fab248017fd0925d993e3e52c3b8eb011c953bdf7ae83f4b14f3b2f3a0fdbb3f19e9579900f156d2fbff7538cf4b940d3879d63c2c89e1b31675d974be68272cdb6477385f4b94701f0debbafd7547a2dbd9ab647dffb7984f4b94ad387d5797126b1bd1aeffd2472d61dc76934bebc991e2fce29dbbb4fb23000785186b1bdcf80f4c140f3bddf80f36cefbd0ab207bb64ae984882b3b0cbfb22d2071f4d1ff6a5922702d9de6b04e7d1defb10644f7def43e749bd062f6eb0bd773c7ae08b747b9f237db0128eec71161ee9cabee7fd943ef869fab0ef79af81e78197b4ab8bb2b8eaca711d4d1fce0acf1165715cd5ae97d2f4e15e1d286dbbc964a36c94d5a7e9c30101a94fdb7e9551d6368e553656d9586540d3677bfa01e4a2acedf572bd5c2fd7d1f4d9940670f4a2accdf57abd94a6cf762400a56d35996c948db2a7e9b301edd8a76ddfca284b1b472b1bad6cb432a0e9a33df900725196f67ab95eae97eb68fa684a01387a5196e67abd5e4ad3473bd2511a292bcb64a36c948ddbfe7d9a3e1a508ffbb4ed5f1965e571bcb2f1cac62b039a3ef90900402ecacaaf97ebe57ab98ea64f56e2e0e84559d9e57abdb2ebb5ed63a5e9938fa6064a948573d65886c76d1fe7e39e9ea64f069a3e641508c8b7889ff653d9531995ad40fb3494d98083715634c801713200410ec659d9f6736e523c38ee75f3dc6bdbc7f9bc97714037321e321907b4ed6750d3e9189f6a461de3f8b4ed833b389beda554b3bd746c2fa56dffc360c3b1b9b6230c36178ecde56daeed68dbff1c9a4ab6016120c321f3641bd0b67f6323e7f1c9c6e88d797cdaf679dcc034da4ba96ba954faa5b4edefb8976aae23cda5b934d7d1b66f53c3ce649906d4b564b22cd380b6fd1a239dc7a73c8ee3530d9ed68b872fa5acc197d2b6cf693a2a9d4cbeb3ebc8b52d78b4eda738a11c3e95641968fa6c2328aa545a63d9ce40db2ae98f7b926de3f4e1be481ff66d4bc5c5b4903a761bb77d95f7816f1930a78aae9b6cbb93f3881369c79c47ecfcf3ef590478fb53698e7329ecaa8baeecbb5c1f3817fbb8274ee6a22c0e8cafec87d996737151dbbab898d4b13ba78a1637d9b6bfc99c07cc06c5c168ce5a4b0ec90d50b995742e666dd6aae7643e2ac3e2dc323f559a0c78019c1054903deeeeeebec3f3c0531f0a1e62145cd91c6c990505aecde974f373ceba757fcf885377b73216dbf5f3a79d6ea79b1e50fb1944e1c62b32c116e6b6e005a48cba165fb88eb65402e8aa3fc5acd0b10279c57568e31ab4f15331d2474a1fdbe3a761644ff7acc9346663c7130a8cea098bb429f519ff6cd2a09851e0e1d2fbe0c88f15ea7419e5219612fcd1cd8fee681af7daa6713bb6d7669ba79b1fcd5aab7e0cf7dfdc600acae7e119a9ef3b3c112a131393b7349d4c934903b9209d134dcc06e3c73b4c745535d734cdb70f3450771ee6fc6108c4cbc60fa429c706cd01e92efe1adffcaa5d8105bd2b2075f05340fac05545592af80abf93e8318fd9e0094e210cbc22149c4473c83d83f7834c1fb9e3e1bcdbf4a9efb258de728c93e1f08a5cb07a78856cb3baedfa2777cd5da76d910034dcf950f594898eae83c81eb977360d695efc1b3830f091db878ebec2ab1b9a46e5ab95d672784634217494d19ebe9812e9c8b4f1774f71784552600b73cb8062eabbd75ee519d1de035b981ef3108b1e63fad1ea400decb4ea7d0b75e74722b3f3dfe764073e7d8e7e3a609a82f0f45e58464270b8f3a1ca5b9476ef19a1413ce4412226991327041584ae38cd30464a2e0b8235d1592daae17970f347e319c9e01c0245ff4964348de88bf7690b48c82b72535c900e7ff8af52693de60ca1ef4feeb989bf7b7102b16b7846f2fbcf18394f77f49af144c8294febf09b4393a8a3e338e6ef5e14f2c022fe4da26f0ee550c18f82d4c1eeae4e88b350a02bac04b524674d58ca1fc0182d4e214b97a40e7efad151882f31fc9f23c7cc0c550167d7b450b73f1299edf9b387ce231ae1c04ef4d745b6f7231c38893238877c0a4d21222e7bceb30905ffa43c6a26a78c02a5ed15f1dec116e607f953ef9e7f4e7d2ccced81297846dd0764fbc40eb60bf18cbc4f9c401c89418c266c638c9fc39db79c07c85d1a7822e4f7bf224773d65a2ce4be14e877812d878aa64b7404e188068f70e0053cc4cfc2dc1b98c28f17f0a3e03cdb63cca47ddcf6e579c5c6184856d24baa9f4c94557de5df650d631ce2e778ecd3af7e8d4f888c64eefc3b94e54fbec20f66e3a8240fb33106daf88336fe1f4fb4e87f57a8fee4f8bd22146c61ee0c6ab0fb68cd15c6390b37701247ac42bbfefd797fbed350d09eef5836fd1c22cd45a9e09df781ddf9a5f529377c737cd022654d222faa26bd9484ecc9811e217dbce88acf5c70e127e8338a44dff31630ffda22f3535e91f917949bc23aafc8b49bca7bc11e1e52b08e30412959142657f591b4a45de98823750059813ee2ffbb3ae82fe93fc41dcc41e8191235729ea35a93f66d39cc75643ed2f695fbfaee84ece9be7e37df03c5e9b2bd790b98bf7945e63b9483f1996c86690c6afa741a8bf5a0459fedd8b3524f531f7df21585499a7a5f39d59aaae87f28f34b1ff19887f55998dbbd7828ba93c3809c4774a75dab4bf6c8fa4960c6a830bbfe0f18b4e84eeee43c1e73e9d291a8bb23d125aa44b160f19c4daf7858fdb9499f3cac150884e915c8c34a6352a7be10fa087d16a62355094495c89eedb9dfb6bf9fc881e274d9e6b0e8ef3207e361fd9c1e747d975587c252a9087675905e79ba3f63333663dda657a897c7b111298cc2fcc859da8d5ce25abffead4857a44ea558bc68fad023a48ffa957af926d592a64a49489dfaa2e7b0eb733f5c5aa43198f388f4efd72fb2c78f50ff90c8587fa7a1a23ddf7d3ea5e01cba9da8556eae503757bd4e596d8a7a719e1e3416be4ad39f4f9f648fa493562ed5f99e9e8775856a77f6d01271a0ed3b149c3c48ee0fd164687c04c9058f50f07ead427f86eab306ab874c3879438b9656cb3af3429cc77e0c170ce11b2104e7a9b1e007b66efb41926d2b0d61841c9f5c51f76ad4ae4f6badb2d65a6b7561df2c575cd9a21ce5df0fc179ee8fa0a239abaefc6ab0fe21839e2d0fa5644a638271cf33342e4a29e5e74c8f3e2769473f107ce30fa2895cad0e4a991227845215826c0d04d96208fb88fc4e0c617bd769da431b5fe34f903df9ad9e2f93f26eec39ffbe8d1a9fd42627f3a53e51a5f70557989f0a415436dc092dd0b267befdd944f638cf7dfb53c8ce2b2205c50f6c79c54e20e731c1431baa54f2e7bb6690ec9992fbb7765224e9c3bea863b59c55f3d321849e20d878686d9289f4f22d9d394fed0312a5f3d39f4f73e6e867bf15ac7d77495fcd7befbdf7de9ad4791ff8bef7de7b6ff579e9bda9fb61ce5a7b185e9bc569698ba1d427482badb4f2f39772b6b4f33895f1192dd55a6babadb5d61c1974adb5d65aadad44b22db35811dbf6a5d7df62be9fdcd509cb96599cae6cf7a6b8ed59634f1d53f64c4daeecdb6cc73c45db97dbbf8ad98413ee0ff10bde90e9743138b9e5146999c50a2b5b66b1e26873dea9bce8a6a524d1a7a391d9bc907c2041640f1a6364687fe44abcb1e9933da93742d40ccac3a54d43038af5b52bd0ae11db63173127262c5b6b50a4443bca630a4316734aa540d199f6eb8924249895dd75a0e8aeed5406942cf6b461528c4948dbc6e1d89819942c67242b98c6a42b9bb625dad93b5b4be36850dba62f725bbe4f9e3ee8ac51482964382b1572456b8c8c8a85d64d4f0149f6bd56a98e7bd22dbd9a4445b28238e0c5da43035eac4294f0623d8204aff1fed40cc942c1c88bf50506bc589b2ce0c51ac3086ea30ac99a2e115ea42950c08b748b222f521684e0ba08c99a30105ea422f8e0456a020f5ea45912f02285512892359d10f0229d81c88b94ca7e91f630c4535e4896b70ef0a28b618017dd8c02bc485f1022e38464f9cbe745d7d2f3a2574180173d05415ef42725193209c7599208be3a68d0f225b883657b9c33d775dc10cfa2de19c43f846e1e601ad504a7f6947e62b735aa499f6e339d765ad5d1e049aba6b1d91857156caad56854a1a6654da3d99a06567b6f9d9fa837e6b4ac69793e0627c6396bda764268a9bdd652fa73ce3927a53f2db5d75a6bafb5d7da69a7b5d65ad05f033bfb48926ed68871d2d68a55e8c40e23a163bad79b820e4ed061462bd44de3e10d2d7a6aa973bf86ff2a95be5ef40929489d8b8287f77384d0a2def763f7fe910d50d6101530207d24307ddcbf7f5fcf21b13dafd8f367128b9b4ff82183963d74df9f462fd0dfee6f1c0625dd91308d9fa6e0f7526b41fc9c6704532a653b9b42e5e94634d28b1bdb8dcfc627e5782754eeb49c2ad5dc4013385054a924b881db089a90672c386b8cb2868c4e20fd46e0e40f710a66106824db390f96c9f9358953923d9e13b22725f3a91428cefaf2b8fa929d95ef7747cd987bb31b38db665af5219ded189d51564542ca39d248cee37bfe48c791ce2315e6e1b45291ea8bce26fe5918a82807b3e7ff8041d797f36cf4079a1fe22c1af071e813f5329b3c9c4b37b468fa1cfd56a8938629da602df270cea4ce3c729f85b96945aa583aea3cb282a92c903d5eeabdedbd979f98023d707b2a6e4f917eeefb5cf7fdc61487c1b2ed3737fe56f02d526a86ec997b3e3d63b26a8caee6cb6098d5c99e55863d5bf8452057f34db0e767d9136a4f2e629dedf99c5791a4cefc9c299a22c5f6fcf91628569f8a64aeb9fde63c582e6da24e1e4eca654fba14c659f3e9cc79f03f8eca662676f3e992cfa7239d383634b469be3365cf033ac58abf89e59b41334916c6de2966e447328ac8cac67fb7ed3e12996d04ff055b98437cfb8ed0df6610c8c29c51b2a788b3985a8ae9a455fe10a775d3bf20dd860ce930eec08b69e8af02de2dd01e73ccaef4936e7ff6f0d07bbafdfc193567d307c8f4d1e56c247828e5061bbf9633b246eee654fd9c01458d6303c59f3efa3529545f8e5c6dafa596bd3d069f137b7b1c05d8dbdfe8607b379201c59c02b78de6dbecdbf87e6c3ccd097b1349d81b68e3e5a64988d8b06103c4913a1b48f372d31f9a772109119ab79686e6b7ef7aa0b5294d0992880d319c2158c1eefb8979cb9ff4ab88b3e55b210090b187b0fce9729e2b7fb65c30611b412a09d9b549ea95c8a46472a8294b6b194957a9d4cb4c29864bcf820553f5c019811f28394ad1b4ebcb3ae794b5f370669a5b3fda39f6c22581edfa72f7d8f291d81739b03d10891cb37fb0f162fdfca1f31cf13ef450a652a9542a053ee8396947322b985f4ad943aca037f39904afbef74368fdf29e013d1089f6168362b69e0732bf713232325aa60192c8e55effc63da765b4d6325afb8ef33eb1f380842593c88dbff1338f648ed95ab6f748e698a5ed3da62fa33f2d23da2da3c1f7d0f33c24f6c5d4b740f70f1dc0f172d71a8fe3fb99791792903003fe2469251909b9806078a145e4c7850f8c59420561948186983144665e49122233a0129abf910291d8f7b81f66de7e343640570e22336093999f81ed0cce7c3333df05e8ca312801a9e3afe399408b322684fd99b742ea27765063066ca222a264e66b804d32112599aee42b513203bab055d1e1081b6658220a23221f904e2f314a9a9eaa4843082292aee42ba9f14a667e03945503d47425df41155dc997719926ae8a2a3bdd25655df79a4384ae4fc2f431926082ac596bf7604a1d9f2931498d8273ed39b779f9dccd6bda8df69b767301674d28bac23f299eb3e6757c8e573d063c387edea0791b357ece6821431210c20824384f9680b3fee7a7e03c746aee19d1344d48065050380370c240700a7da0e6f1353cbea6be6351b4555b66c1026873b5dbf1dd3cfdb4ffeffbfafdf0f6ef979ffbee771ff7ded77dead3fa6bd4781a9ac7f1dd507d187c8e4ff53abe1cef9f8eaff9fc6d3eb96f7e884f580db6d9f1e1afde0778dffc64a2fff8e70ed0a6061473ed6abe9b9f3b87082d4ea809f5a263d9f8455762e3175d48083fb7e39b9b47cddb7cf58cf0f89aa73cbee639ef7688c0e36b7e88efa8f95a987bc7cfa8300e14f443fcc6774dfd0bc8953f940cc5d9b2e1f1edf8b2873b3ebb6d3e0fb4afc1afe39b613cc49fe3f39687f8559f0379881f83cf5d9f077988ffc6e79fdbf89cc88b3ed79fcb7cfec2ef7d0ef32b8e743fc792e44a1e8efff9927b53f61975721eed77fdaeee5aed27b5cd1e11623577affed683ec5aa767a4babbdb26772ffee4b328143c6d99a5cb95dde5685b6b6f68d1d803c1e737a3b0bfcf3c0cc63b34e7bc71536e5cbf9a9c358c71ee7276d0339d87136a688a21595a9ab131c638632fc8e59e833b7586fb09e53cf9797c267bccf846b0a0c433aa89640322d84c318de5f01d408420a58a27050900e931e29e160eb0852440f2e0dfbc6eeff0fb9187dc73dcbddeb4b7f7b6efb64f4db1b2e4bd8cf6a7d3fbd4adb53a6ded3ded53e3ce4fff62b132b494df6508b33508abe831d163a2c75a942ed5d73b897414a2ae1e3836236da21e1803c18c93e331ee7307e278453658d5caa55efcce73ca4459381ed3590d6d882a1ca03f81220d0a6f809906f428edab0ef41507e617f3c679de7beab74d6fdb96da5e664b6daa6ddb3ec8b66ddbb66ddb96e319d9ba6ddb64b6ef3aaf03c189e319d9c0143cc45ffe21ce851dfdb66f6e0dcc86e99c4c9db75c4dbed7a14a148baf9cbe90ee47a9481ff8c8431c16491dfcda4789fcc96555360633141415a39449f6d0ad514da323dd9af653fad071fac0afbd967a24323bf5be395013b2a54880edfd8e8cf7da93f1bcd17b21cec3bde7b3bd2780f43e88ece9def33ccf7bcff3641ef48c78329ee7698fcd3c967951bfcc8d5764060cad56eb094d4113aebce5091213bef6de7b2f045c509a26fbb95694ac3c011440464b3c26d65a6b9178f295041365021261804c482208ef689a1a3f4b96905ba8c0b0d87105587111490912ca4c7ea680090a98c8518a1f7cedbdf7de8b63df7befd52266b6efbd59b4e82c29a8416ef1824836114608cacb154ecc96f0e0f262975c5faacca62934686826f304370dc99e5cb9f7de19165f49a5a526ed01332f610d1dc0884571c117504d88dc1df67dfd65df961833049530c43873d7f5a2a8cac507345cd5015c185da24a45174552b80294305151f282285230a94c38456152b493f1c516638ccf10a22b99f3cf0d32dae414443023308808dab6018c600c125f9c44b0022074706d3238e9321be221bee00756748318980f485ca1a105dc1623c238d9a10902a8254304c929c080c26310e957d1146ce402261915d43003bef6de7baf962186f6bdf706cd24b0d8333a202bc5ce40492042a889097624c3740415453a218b714eb0b04e8860ad566b0a26da320a588bc849511dfaf071feef903bd18c4411bb4e6890c517638c3186a2096a639cc31014add2345adf5087cea801430e5880d1058a9f31c65011c20816dc07ec300baaa207275c15474f3efc4802821611484cbc10b1c5cf84c2618c1fba128ee0a18624ae1841144ae6932e320419618c711090af649091a021adea7e5250c49210c8926a80a24395a11b4034f9f071fea160cce42e859f31c61896e42b393239d905c062a110205c3c18e1258b2b58680f5d8af0ba94c0a5559a46eba5314362965c308c31660213b431eea1cb82461951b41f262e6ac03180382f78428b2d404c61e50b26921859c0822c323198145d2c90c08c20ca920ce30e328da32516482d58985c18635ce5c3c7f9b7415aba5cb10d6d0da0220811784d00e921a78d68cc9596eb0b580e38074b74022a122a87555e2b4843a9e80730309528f785289632e00a59138ca5d8bb64ee501c7c1e91341fe7c3c7f9af42450bed89b5d63e31f2957c6598465225fd183ee009d34e102fb90aa127202a85dd42d3b8269a2685144d4dbeb811205e55a986a46ee9873a8009d7bdf732f1d68e945454996d8cb355420b0d8c1d722ca850c2894b8a6108638c9d6839c00917187ff2f4848a1374618124c61833f9f0713ea84b0a0aa32219c688fa82a50c5c44654c92a6699af653e42b7964e50a16a5127e9670184230f1e104569c0cc1840c430a1745d65abb84155fc92b198b56522dbd91259ac29d2ad689fe9a74efbd5a64f0b2ef3dc2044a206901c58c9f228c83982c9a946c0892df5a6bc388f94acaa08a84316bb98a4009e12064c87eb44ad3688d6fd0966d015ddc34848238e8d1c245d40ba2a2c002862e36fc28a1699aa66521e42b4964f482212519c9624ceac249ebe2cb931fe20e5cc64c7162cc099e98627471e24a54f5408c28ad20664c5c60a96734a518d074efbdef23048d9a664ad012941d6ed0678c3176f94a0a11d9225b18fd1845c8b0a488a84b1337bc649210d22a4da3f505bf20995165a8082943d8862dc61a59b640810e5f77982e8b2f166ab55a31608c31aeb131c618bbb6dc2283d0c6d8b593c060a225017df83817e3ba25cb0d395ca37ad444ca3d62ce643269c8702706891d8b2fc618638c316e32c2cac6d80a4d0ba4705ca0c829622fbc6028081fc4bc8892b840c92243030e5aa4f03065054a44f105d7d02445152f0a0d5cb23c63a4186717bcc08698983fc6788c2669204dbc61fb846b63998d31187a581b20c62593f029484c1c146f26c5698b202fb27851a362c0d7de7bef55c0102d4dd3d2c3089a3811c2e8c7059806241f2a52102e269911cc7849914c235dc96cbb9c819dcc2636bc144394b404132a4ba4ac00cb11627cc1642597a525268c317e828bf6908d1248100514315aa0d81002a3218c5a60b92c1947284a10dba161009391d5b20570400206298a20818bc98aa19264c91353d3981fbe98155130b6502e387cf838ff4d59c420858849c489549c1882660b4b2d529c5ab70a30568c2a3b425b6a88a2822f4870c49319943c29f1a24a9221588b0a0e60ca408a61280bce0b4d0372460f49d0e0c44a165e10c153367e5db497e8a00417b2041e8ceebd178acc86dc321446b68778b652f45333a8035e18b5ec4d4fb49c8a1f2daec75c98e84ae6265aa569b4963286a6699a56e42b7964e50a16a5a5052cd19414dbf7feb8039a8062b2538788f94a0e21cb4340e921662a225a4f842bf42efb4ef184114245f98bcc842f505a0b0b70d0863e7c9c7f210fdf7bef76b7eb5234dd1054a150b282a12a6ff1c518638ca950a2b531c63570d1fd6895a6d11a1301652230553af8c08f1645428c71c4c513938c222b5eb884a317141c143f0049e1d2c36c630c055f7b535130ba925bbb4b2d8021480a1aed892c964cd932cbe2880722a2789112810a2334ae931ff287f7091a829aa2e81283c18910d5034baf2d34887105891db00c398c51daa116162be2e1c3c7f9bf181812a30727c0b852051522b7a6b12f0e44eec5185b0d4fa182102c696202511469e143154fb4cc10021aa6e4f0650fedc841e34806335e512ef8c20823820033b524b19480a21ec000d3da320b8356d1524516a9a0d1e28b855aad56138c31c63936c618e32d474c1be36cc7259a949d291cb64f348d8a29464f90f8ac598c313ec3e52b299489f403ce3052bd6be609eed2e2a29950303ea93c542e4442331d232ccab862044c284144858b0e2e4e8a1aa880e2046bb55a4fae6482b2e2c485c9101eea92a4699a06f395444a1a999c620f1843e62bb9c52049617297178a6820818c66354dd3b4fb9ab7354dd3b42366be922d971091d16d00122f8ac3fdd162888240f518638c957c2597624dbe9256ab2110415aa569b4c68106dc84039525fa6b0c3a1830851394fd7b31de72451a1bdf8dc128c4c4ec96518a14a37ad444886dcb134948f91d7c826af1c594a9d56a51c118638c319eb22d9bc288da188b2562d8b62d4cd0821ae38b26a204e1189ad208639bc64499819e41b110143f685439da4952e4840f3f28e170839527a6174c70d102a858abd58a6225153324410521021fa298587c31c61863df18638cb36c1ac18f56691a4d0375103e4041b1a40b204d9f08f239676cadcdf9adb5d6da28a85c42d4ace51222ca259061a47d9a267fce5a105cd62a1a560933d8943a672e64bc76cef96d9ca7dbf91f27eb336625a0d17a2c72b6399909d56ab5a4dc2bb534d1b4ef6c37b9768d2c6440fd7815a3195e4489bd60c51437c81dc408e386fb2f7b780e60c6921b6078418b491573563486071b3235b2e4a22b99996427185ba9513c11e48442b9f77eb7afdf7b6b2d4307269e68594195344a40e46229fb76a1b20315306b5dc539bfdbb8fe9481914559ed7b1cbff2c5108d0e3f186f50687124b3c86634bc38bf7d7db981bf2ffe8ca1f8e2858d9f461546c9c66fe3aca0c5a864cc184a7b9aa1a90100000000c3160000380c0a064442599ea6499cf5f614800e6596526c50369d86b224485214c510a3000000000000208800829073b4a3001789589a955a9b67b75d52f2f90cb9b4157bcdd2c16ce3e00a990a31292226c739bbbd9835c20adcc6afa81012339a8037382fdd96c7f08b065c974661e27fbe4b6b2600cee951ed6d1c1c96205aba8556c83643ff8511e10c604d7a368661f77c56de01b4617dc87331da1eb9a09829d58134a28a237f74e4ca32aae8855cf3505a7cdce072f6b98838a5d6a375f2bcd63d2c995f60756cdabdf3d30f62ae806482f2e47fd2d0745d633cb442a43114e0ec4bcc81e0860d4f474b978ff8c71f480d3364e88b3bd2e3bab5e32faf69da18b2cec5c44bcde9d49c5e95099b68a5a701e4e6baa1272bbd14fd1e7692dd4b3bc99b8fba5a9c3c8ef5ec7a01abc045be1013800ec5369816f763a72e882d5cfc32bef807ff526d70d39601b99b926465357582a9a4acccd80c1d7c0992d1a68bfeae692239d12300edae46f6ab7ca0bb8d1ee94cc9925dc131abc92cd9dec37e20944b2766e17a123882e69f99e7e34aec1c67275835854084012c2b051d2f3360ef867c98be957e8668364aea0a8a4054494ac64b56fa0f73e6a633ffda7d13a6344c142b028d257aab535d8cb8d4842da4457587a87159ef481344ed96963c519c67e13addafd15397b633a8a08a34b8f0ee2193806ba69aa9f7974550bfd34c867623b14251abaf7165845690ee8d4aafecc1a9c3d4cd2b5efef7c82a8e9adb37d6935613b7d97c1ec4c8d7f0a486aca200fb12e3a03bdf243d0cdf6b57e274dfbed096f8dcbef9150e58292f0d7dbc28fd5854239db3400c10d241b4e16e47881bf28b7815201a36e38c706f89ee09557e7df2edca497860a1da903fe008c478d59a620c59a6ba01f05cdb7e18c0433643bd3feed737260631c9e07d006b5bf63808adbc7b45b7ef99aa0e5083a693e85183120e430db11e3e40907ea4618c467097b8074336ebf41d69d1874b8927312a54df0b10ad126090f2f62175a70ecad31d6ac2c30535e3e16a8ddc8948978012eaa875417b41318f703dd749607b67573e026a9e06665b282c4fcf8e299fcdc5c45993af3108d9f7046db141719d84240fcfdd6f09f3a1a9efe7603bb0744354e9c20019d4e9f5e7bbd596b9fc885e9e5e36f9fc8a9ab77be6c6a20d05a692df0b1253154b6dd6d245696b2afc72accb89cbd07d6ff1f4797a35be9f69ef5debc61b848a4c37341738aa729631219d35f0b839edb3b0d2e07523ea99bcfbd208cffd0ea2b9bbc9596451aa0dfebd42dc888495b4cf1db9a9ad6a0e38963ac28bc74e88861bd68a7ff8fdefaa4de013b5af3d5f2a02ba7e43255b2022065fa05515dbfce106f54db4f28bb7552e39881a4cd65865cf8fb0c5a1b38338633248e159842ba32e12268214f8a898b87fe3865ee5ce60ae80503f560080caf3abfc94ba346cc56d73435b2a66abcc7a44d1a1cead361b9838097d26b0ae0d8c8740f7ee85655c34356d631faccad21663422484ed4a4f5fde07582a2273f61178228dcaaca68055963f8e756ca37296d4b64cd06f6f05d172a7ed8de872a3081d11de94aa91798c980f1db1d6cada53246d0cfb194a6f62a0241bc0ed903f193288c7ca587c734b5be99d57619649cbe0f4c3333ece7b34b58c9b4e27f03f5b974ab95e9c89218d10b1ec4939bd4884953396d851d368ddfb7f13f340bf227dfd1741bb8fe5af4f3ff34e5bc49884ab6eabc5254af84399184029c3e5f463426b2c7c695e5542f3876a1597d79e0ffdff15a0a423cfd07b6eaa2756eb4bff2e7696b6fcd01092b9f5ecfa9e43cfed87ea1b0cacaf0b63910f719b5b5424e60ef026281698ffadf90c95bd336d7509676ee0250887152e543fdf4d0ce9b2835c2d8cd087e5b6e6f6c4aec81e1da1d356a58ede46d3f906226a0e856db6ae22c73f686e3f4bef09d476619aa291edf112a6db9eee92f22dd96cbfd36e35c315f161f0b46d324b0f879bcf98adfd8eafdeedccf22c164249ad8ac917983e181f9f3915ee441bfb6ad680c9b45468589bec364fc56c0eba51a864602bb0cc7161784c4224ae9089b7914eac4ac63d78e58190f1d462b80638e0bda7f4b5021af785c2d7805526776e6f60c979ce3d52ab4432dd815e35e4a0c4f94a25c16741d6911b6896fa3168042e74e8193560fbee3803a5716ef90d40c94fa423e994f9704d4563e9c484af9c5410bd89c4d94e3b1fb3f4e0493d562533e9b8a33f7032a42b646c56afb7b85d5e98267d4435a07e53b1f84a77321bca95925b94017437c005b39a486aa3415ab3194553288c478e017678604c213751d05da19359bc4f7ace368bbda50b60392e5b505e63b35aa39bd0d7fb811f2ee6a0c232cabdff2f178969e5c7fb3bcc63d0a5266cc2af47b925b1fb997088f34e21bfdd7ad8fbe7c0d518a52d68a54158b8e57d8d853c9d7b41062a71f60a10af8796db6cf4f0a7be6c8f36d4c199cdead3c01f747b2f2b830947dd087a8940e63b820f4ce65f5fc8b2e2d0bee4bdf30ab550cee9425a937136018405d5ff245d7ad8c077f4018cddfffab03b49e78750b570a49f50eafc38f9a12d526bcc88b46059a4c234ad28fdc13291b2e6cc106f6b4f5aaab4a50201a6842fb2bb6ded57dd6ee06b5567a8dcec04917816a71c1be608e44bc836ebe3958ce016c3f9857777952765a778f18874585ff4b64e6cd430e319939db0887f30c11ff5528158b08e1792ea4cca196046a792fddd925973b6012e7c3441355007fdabc21890579fc706e18737901ff960b62c22d05b65ccaba1d3d969ead8a4af0cb4bf12d6815562c66d6f3e13f2c54fb4b6ed0eb74c3e5a099abf3f3833b79d176563c9530bb040f2cc04db2c351e6f998d0e69b4396c79639d498a5b2dd351e306d8dc62280b9547fb6615e3cd399f5be9f2f5b9f7dacaa9699a7068a0361a48466a4c4cb17476da2f5f47ea44a089e4849c94e3d0d3597d7afce5193179f4ebbbb45296fb3e1e059b747c7340866b8e310673e1d5fb4ba63b2911115dbfdc595574b2fe99dd5e26680acdceb8e799a95c836ab0d95ad4b2b908c03427d96985045c49a4cab93d0f609765b4210d4aac2933e935c8d6fdefbff8a8f753c03b457ea60173cf748bafc448e1b4ebc7fd64d839dd7e7d5143dd05c1b32ee9e004b6c6aa99d00dab977667a1bbfb1ea856257b7c49ebf00824f1aaaabdf5c31433ff30f503f9635521c3bb9f506bac5431512b0520d378e0aaf4d90fd8022f72d806b13fb283189e59191a3e6c091c75543cd6cc87466b42842c45c1c1e8d0e71e93536a3fdb4d1b8b998dba6df603ce243cf117eeb6817d587d830e262b6721cd541856c8a0347fd4edc940436c308b33634fb4e99ac15d2d5f6931fd3c1c26026f0389838850355c373e04e41188ef2f9f49cbb6951ebca41ed52f8cccb902750158c937424795facc0867281b3268eea29f3f3addad0ebbc8840512141a9eeead73452003ab6759f4d68225221076ec90ec1668c69650907f7fd8ee3af136ebf9e2b6681b7dc42191c1b33dc6e669eaff2a3ed0897a3808ae34541d35f771594ed5b8ee6fb618a21cd6c3ea4006d6783b9f9a58fe76802bc45df94f7f5b16767e193a3a9af43cd6f0968d75e8a554bc605cb00399ff6365158bfead1b489b280ebcd5ed20869684e1de3128354aea070461f9c7c2c9634ce70001e97bce1f355eaf9948ac0330701751cbe76efb18859098b1b79ed39d974a016a58dde34f0e0c39ddf12b8ecbf8d7b40d7697e1a5424b94d7f062f46e184889e7d4be6b0fcf064bceb37c45909a679d3826a0cb8936ac8b26a0e45bfb0a4d22689f3ba237fdc72e41bfa32b6346ee399f6e9bc1350b6a9ab827f80fd3cb6f2004a13f6e02d567ced5c13344306bbdc43686c24447436d390603ebdac40a0a44c8f375e1f30a5d02be287f97b02fddc2aaf64b879c398ed31eac6f900ba8ab2528816cc480fb4799602d3fdd8caad6684898ecd63211cbee13733b51ce5fa9c21b97bcbf4ab59b7497cc855e666d904deab169136a81c1b34a455218a8a74388eaa106eb05050d23cd599c0b1b91e4e39464527a120f8fe91a612f693794c90321131a6bd42e4f0c08955e7f4d9a2db9112b83faa8317cd39fac2cb94910b282f74cb23dce4143925841abad3ca5f1dfc098e2165c3b5abd46d07339e8b1737cd4f7ab84d3250058e04982db947a6231d2ba7698b342020aac7fae284ddbffd43d9e816a87a3de6dcd0aff6ce0db0546392b5fa8b0e9542b6e5fd3c944ef5eb794f6aaa5a3589b13d059de1d2c71b6ac6cf0c0c5d72449d795f81883f62dd32c97bd8ee704a7d4367a014b589bed95bab6110b91a8cf39d23635d994c7c8780437ffbd4de259f678358f3e0e2738adeb753e3396dafd4ae5a3b16f2f30894027dff081cbe640300bf93240ec925b0bf86a6efac326311762adb8167f316cc358293a39821bfe952bbd81b4b6c2dbb51619cd0d6106261c7323a41ca0dd5667c1d9c7f535caab2da27f06787de384f4ecfba96b6fdf15f4ab0e08eac7fa3f6cc713b323c7361bac2e96280bec301cea58518c880e4db1cb61e9ab1488abf04ca7c0920c8aa3bd7984ce1587e6660f2b0dfa42bb0c5fb48eb78037d22bf0aece3dbd3f15c8e073605e04e427f4de09dea961ea93b2a98966c2607436d0a554619bc09bd9de262669ced06e1a2b0cc061ee782dd2e0f851c74df6467246127020c73703a1ea980fef963cbb9048867fd464892f49cec9a1f5ff783117af870030c73c4c37f5d99daae862c3cfa322734c74e760c8ee0c65b4ea7fa5e74934166754317c63ea0746c6d434b585eebf15dc4697ed53f178dbdc65a672853f4a6ac12e7745b94e53429f3bfae444d989a450304f4a46ebc9c491fe7c812dd6c941342b3196dc54fdcc9385e2939da9fd842a90cdd0fbd9348eece2503f9592ab468a8f864f6d41ef735e0380ac00e84e11d9ffc7ccbb16b35a83b6cf030a042873c97dea4a22394a1ea657ccff9d20b2515e133c75741df6091256d2c206b8510ac14ede483a066513e26213128eb84d4a4ca4d9442134063bdfeb22e64e774ed8f77b9be1d70e9bf37454037eeb53ad91c6bc1df58342348ce0ded737d76df5a3976edf231b2df75e38dd26e397f2634bd9acec8cad7dfdb84fe4ba971430111f13619fcc9344e55fcd7619dcfb4b427a1da24e10cab86da1785560eb19d8fee95ea9766f3e71c0b87c4b20ecc1f8e572973cb560d5d3920b951670218f17694b82b30506aa73890abcc8b7300384bf6b258932d1f9205c1494e44d981b7922db02a1742397cd3d8f66379bca28a990a2f9e387fb25e16daebe96fed5a79e729851c9eec0ddb79f4b673b6a9f4ad2239a17ffb39897185b4c266d39778f7bfd4d4ca694d5c2c3b4fc2dad44465aea4297525e633446c6a57e5f781983ee1021776ae690926950c4d6095ab7620b78ebc894d4f8a1339f109a79956ea64caa05acfddfd52c5b2af1488ecdcb0b9982297219c97846e9c14f7c6b2d561059da05febffc313935ab09b6e3d3e6fa69bfd06cb36ca4add2df7e66cd8d5bcb0a6f1801d39b5eae9b1bb218558193518f763a38c698a702df231f8ead8bc9d6ac55cb495488b18386c6ae39b58433ab9114de31ff5d1f4b7a727aa9979e19c75de1cd68f2e01e3e4f3f3fcc104e5361fb654c0c2c0aae4c202f308f370da17e580750c075e1c2cbcaf86101a7eeb99380aca3a15c0465b9375b20b912bf46c4ce9dc691f34cb057d28f458be7b3b25956b8b0669d234d2497ed1122ec3cb84aca600a4111ddd0d13073647b901ffa5becb4a8e354435a900668c127176ca3d40301cfbef411a268e7218f7cf23e50af1e0e4e3a2b2c323d3a4312265cae7a124d426a09dfc6099eb50a25099703c7da69b261dea18cbb6455e2a6cb76d283ddaab5328afa244588b52ad98df7ae3200e1558b00b1cc95fe3fd5ea8b94ac8b1f98ddc17581c780394bd45db415e705914c22efecce660f107bdb2ddbe618168781ddd0142890026c3ce6f55278c0c5911d3e6f9a371e5332f3c5d8c707217a9529d742266b51f8cf069f3471b78feb66cd8cd56ad1e78a873e44ebacae533e0ebbdd7e118d785a67286133ca6023264953a19ad6a215bb961b7b1350058e43a35e6b22619893a16e45c8e0575ecc3cdc1aff031900e37c9b8fca8b1265fe15bddfdeaca365ace8cf540189f30de1ac62cf4688007a52a0ca3199eb76b6180ec718053d6cf00b116c20b9203de1ad8cec04d0b8dffd63b28aa32f945bf6703b0140272cf50939a40f93d342d2cf143c3c1d38d573d0599cf963fafafbe1672d7587ab6cd9b7ee641f038dd12cb9b93f94cf7541290d1ddb0258159ec7105697facfea65202212d3f4c6549731712c6186ddd32888562aae5a3aabc151fdb64ca73b84b9180b1a753e9da5ae2eec31adc1440d814ac76b75d0510f7251a633234d0801f812dfb00b73bf1608c6471e0a127edb5fd6cc403d0c30cccb13f2a7918a6428428e11f40c90b3bd7121d717a5032e5791c714fa966e258c99c8c529489ff5606aa729cbd7f865836680a8edcd0ff887766e65ebaf81f215009b466ca1295afd3626468d7bddff5af49e8840da54e7901691308b91e6619afbac60f621595c6c7ac3ec7ddb00343c1e4824653b9c6aab38b30c052236b0a39910517957c391bc801fbbd8505b9294fc0c9682c53537112b056537dbf7bf2e6d752d349a679f0a021585863183dc88d5f02faed84cfeeda1fcbbe2899e2cb38098b5d815d408bb03d3b8b5a6052841f0eac59b9914e783ad42ca8577caed35c3eb485be09b41c43d08fe53acc92b763a1fed1f8a453de2556860c3b521adf769252364068ed6b730789fa7a0a66fdc475a61e1a93c0b8046e4b6bd11aa54726faa50ad02f00936eea76063a81c2a22e2350dea6d6d595fa30916d7f1e80ab7fe82c21336cbc289e3c5e08a6c3f2e0d7426ab58e2b6b953040a60bd8376710b639f5408dcbcdd1ecdb3501a3564ff3beee3a5d7ba0a6758bca2dc81231e0233217306e6283071a93875903b49955ecead296480b233d18fd9e90dc1c06dc621c1e1e37c8f6d7bea717f5a48cebeec09a7cf974ad3eebdf259f9731ffcfc732855afe4217b9190d7473185ec11bcb2e56a42cf4d57932b7a5fbe4fe0900e4e1c0afd7ddd3886e4564d801d9bc023ac63181ee9f913a0c6e013c317474340e8fce98d6e10837a197e636f782fed760c1d21bcbc473f8a18e12243a15aa9bc69124080c97095f74544a121e55fcf38c4de25e97d7f9ac047f3927910d770dcf00d0df614e5d3aa0537dc4b695525805eb702025228c0cadd5f7bec55e0aa4b6b64d4ab14c6e41ed9771f07b6fa135764ab2585988bcee7ff00f6d4451ff7f4ea4578244f5a848d496cd4ee1dc9d14d4b6109be34551b7d781d92058c43b8f700ce53611df569fcc1f615479b6b31dac4a62899897dbd3d066095a32aefaea928bbd9ba5e367406dd8359b9ed0c1a8c15ace934c229b0e8f0281671b316184261549211124506650e851c03036b1ea8c858c428de10ae205115a1cee0a593d4e37ef14eef1582caf7a8a96c52291772ba28a51b5df6ed897527aa45ee514a6641fd3afeb29a390247d9ff9a3b79599ec9b38301b50ca505f8e5bc9db5a69397e36a663db6524bfe555e9ee726bffce6352a8877ee90a17ed44da4f4028892ddb5b9ac9073635a79c7a04a62ba8d3a196654e07ee37fecd2d94a4bcc10c81923b420d8bb30aa0cab28f384d2e4433214219d123c72474c1e8cf8203d9ae303a22a5d0c7c8a29cccd9e357e8711dce9d01628d59a5f1019a24c518c02865ae754996d5877c66ee5b9b8128314485706ce39a8a59f62198088ff674c9db5304feadefddc6a53ff5753855e1743124bae4215dc1df5786896e80330cd8205ba3921a1f7800b16049dd546ba937b7b1b06e0d92f4e496c2e5cfe16eb2de57032cdaa0c92840d04e98c5c58a05821d4d29b6370000bc76c7bc9a303d4aa336b6798b0dd11480d6916f8c164502c38a598bec0a4560a6b7ed4dd5fe37343951320dced3e2af9c44665ab358d9dd4466d9abc90e06b32119e3ef818a82536be931c2c1bee502b4ec8d0293c78c5e78707d370b2495f52c60149a5de65c05897e1db3aa52fae888a47bea337539644803957c5ecc7969473270fe7ca7022678b75e6447e7753b296166e8c0c0288aa5dcbae9718ef1003f5b850bc0e09af26ace3b98d6c94e5e6c3b31724f87091d8f9ff2d1892afdcf6f28f44b0a4fb1cb96e8f9671c840c20a00eabf249c1b2e4719f03d3ff9216616e617eee4eeea27dad466666b181fbd87a26a0b9acfb943b803a80ca30125506721cabfe288e8defa16688228a8e977273afbeb419d400ce206614c5052b257976b522809d31aad04771a44ef1235c3eb4022135ba7393fb944ee74f767f899b392605a93a7b2c1d6ed32ab85699afa22194e6c840b680acd09170a72357f7716cd9ea73dfe565a6146de9384834c24d60a176df7ff0e7b1fd2a2d7272a7bbb47936f108cf377e0c157eb8ae1a27278d613ae701dca901e1a567bbf152845744d0c5df4e370013e3dff3c91aa8d91088d25a3adff19d341e0423d33117bacd8ac2d3b7c5ec8576c8e6008227ca1bc9c645bfb190970d69b54b11993041dfefeaaba69ef6f988e71f4512502626b07201d364c84d56c90fc3f619a9b24b00f2d19eef175fb6c7c9db3703019e000c10c5ea0be93c3699fc5b94a283ba89e13f2b5a8afb2a3af5853d5070ffe843a1e9caabd8f2e3509da9316711ce0d398dcc19c3ad271ad5cc3475b5c11107f739ef604550391d957d662fe4a50e34726a73fbe47120a1e247b545e8def59e39976046985750e79abf9b4c5477cd508286e1011c309539850ba6c9520bc109b265b6302a0b170a0bc35f4f59ac0244cd82370abafd888d4ec14f56e502d53ef24c03f30793c010daaada864dc5aa204bd4a30b7b243ff1152533a945bc4836f89cf813e10fef31c07b5b7d0dacd43ccbea61880c8bc35c5f0b4f5e59630a8f1aeb822febd9320285119d72f15ffbaeb11a4324331e2ce0a9347af1e9101209f680e00fabaa0b4645a4e04ceab5e373e54acaff45d57717d929c69cc0c14fa55abbbe0312b563e829e464aaf3d6635ca1cd3b2d2de4a39e79efe3f55b847fd947c36a13447afd162213f1edc32e61caed08ba90a20b5e6da074b74a2621a0eb29e6541db16ab48534b772cad16738898bdfd3e842b890a6369c79b399f730a6507b4087d1c5eaffa76078fa59623b9aa813db321c290032deab6718561743f2eeb1853ed0315344a00ab4a423c8cecd8d146b1535ed25c0a9ac2d15cc31142e7ed4cb4151a6dee7a89c36cdc3dda901a771b5d23654f2fb767d2819d72d20c37795e493fbef4f9add9c6aaaf9103a6c179633a0c10d7b176b265ad039a53e0e4cc37057a2aec74f6061e2b3ec963f18aa9b0c74327c9c80a1afbf5cc133c2e890ade8ec574fe1001752d77b49e83ae1982e88f0516961b742e0d5044a4aa62db5eee43b47da06be9839efbb397d0bdd8a174e4ddd364e5a42d54b15dab354199c7058f06817686f30a907385fbb0ae55d72e44564ae994bf3d9782d1483d2180633772d4bc2d742488b5eaaa7fba0027c3460ad5b487be964988395d633cc33a7f3f94eeefb22db89413618f0502b875abe51a563b8950aefb3f57c4bd270ef316d762b7d7ab329e93a19a5dfd506ec63d200ae5a63d6e02d985611481c64ba2613238deddfe28f1eb0b2956934395b06c5a61c1bdfeb857736a3fefab01756d581a4cd30b136f763f6cdf2569456f4e04439f20fe90c1485031132a9552fcad82a3899445923a5edee0307867e96ec2e7541d3b5897b0de141b01703a312e0c2a543d9e50df7434fde4857117dd54a436845d57a7ead81f89e54ed113903277db3bdc2a233deda93ad255f118748b2ff4c9b8e190aeec224a0b0ec9c8e3aca01beca1f3435584fcb9dc421c808410f17601c3c4622cc40e481dcbedd3a18f464794159791bfd98168fcf5e7c9a2fe2a88cd955f853d0a690e4b53095c1b83fe1f72d918431b218f9f94f900bc624bf65f6e2a5180f95bc259802aabbf352c83a2a2cf586b3d4cd2a5282cbc2c96aa5f402954d7db7224c611a442429c39d33b0b6c4f57f077afb388b46d666d8a9290cddf9df890856b65c71ef967e03d316ba7301edeb98276a745b202e45e1eecc6ca12e68804626431a4de55328eae00dc317887a8d28a234beb74a7cd19650fd06da3ae4d006c0e850f09eec6d2d5549e46f0180a21e6ce0c8d997e327787723caf2e3e346b23a9d309f0f16e370ff47e43580429d0888ba247ea44a034f1a7a9588982170130c0c03edc250f928f669734fb7c1e90bebab943662ee26c2344357632e7aacd0cfa5d47c512edbdfb70cdd173aac1e70427c81f74970889e79110b91d80c3d6440f49bae8b98afa20a27ca8fefa46baa837ff42a94f952f15342798e8ff3f9fc773899dc29a00336144d71bf7854ba10142ee4060303af38e77a3e5d3b0832ee792228e2c707b03edb572382678c336979426834a5d1b55298f91296e9cdec3e6cefecd6c0f43d9308b54ab9c5719fc0d9062eca721844d4f6eb6fea7e959d720a06d48100c4620a3274615178b1b4a4d7b53d713f0139b51a02cb46c1488b587051cbcd70cad1674047382e9234828ff8b460d5e15e194498abe6e51143f6516eb11859e6c8e8e8dbee3c976ec28e408d81c9a5d390a75e5a5e2b06fbfee77d4d380ece5015ff9e0d4b9154d3160f627fe2bd847fd1298ec42eefb6d029e91cd7f2060f08270a56b6c04bcac807ea68e3537b2c4d0f1d4ae41d0370089554c840b586e59cadc9594dfe893119d0acaf1bfc1f65b83392ccdf8f1b847644c04b4d6ad7fd5d4ce17989dac28253b6e2f3232883f2d8ccc30581a68a5c21c1b10bb1c93a8936a55fbea790fb8aa7a1b8a5f31c1e39e040d2c5b457b67c3bf7e4870f4677f4a19c58fdd3a6c82da9929b4ad5484d34d8219db0c9a4cbf5a606232c40a137fb50e0c2c85488b1430c5b39f72674c12276e356a270cdfbec9fa705fa874653a611ed8e245c7ccf69f9d1454faa1c3dd1d6a94397de4c79d2f0902f3a5262a16274edffcc87b631b3948cd4cc2947542cae2104d86ac5f896115c782a00ee4a89177da304ea6ee50ba0aad21c80c5c34f787ca23e1003fba884d2625b3a4bee767a0f10b2747ca10dc81777d797312079718ec227476d6550449152b3daa840d252f6f5b10e82f25bc9c17ed61e1bce605eb46ce8758abe9f0dd3911b66b212f1390d0506d2c11857bab27525b5272a5a4b95a0357ae5f0d2c4a8350b2e8042d740519fbc09de395c010ee6b4e22755e694ad5df71b09b033b765aa3b22d527eecec48cfb47e39097770a09141e36e45d12736344e32ad630361134448d3b126e990337d485f2279f0fca461c0fad128f530fc15f8b923ce006407785fdfe2a06d5f4194e016d6f3c57cd5ac661ec10a9a6a8f7ed9f69272d136376b182fdf60abc24f497116f4d572a1b636f9eb7e026ef184484e35a07eab254173a83fbe147312c6106a646d9ece9d448e440045e1def6f90b74466721029b409240a849e98ae9646342e3ad809641e74ff6c92eab02023255043d1f0e0e67168acb766272c1506bc14e2164b4ca7101ca09d33b6c3361ce6c2592526bd50990ee93235853096f573040e6daa11fe543f02558e453fee17af8c669890778e7b2c887b3ca9af3f419347050bdd07088063703ba12c100239ed2e9d56c1ee7d00a832a0b5713e5c0f2f45fd227757aafdd15938fde3bc5b417880b7e49c89eeb35a46a68d94468f7249077eb55d1b9a39db78d86de774aed3e3e7b574e61363daffb5bbfcc7dbb1f049b3aa9e1949dd566bf9d31c9ebfecf8b1c2fd5a66253f62d554c874cddf04a4e879f30f0428b6b9990b36d68f1314dbf3d1070c1ea71745330e60fbeb19ce7f9583de72b7cbb76d79b00991072505162a4c4eb6d70444ca030b88416de653057f9f1c6e1df800e13ef3d456c6ce9eaf825faaad51d7031f2a06f51d23f475e89a6621ed9c2d6a9c38998ac10d1fe344e90a106e41843d1176883a62d35dd119102fc7428eb9baccfe4a786dc0364c5920501a97e176d7316969f876f6739c4cbfab26e1251cf021cb1dc48bfaebc7c2a1661e27221c05315d1f41220f8c2835dd4bcc4b78567bea10c8ba4090021bc650db5232ac295337e7d40d43896e5d733f5fd8d95117c707a8d5c662681f4f3bb9bfc143d06a2d248108fef9506536d4cd3980881ca12035c8604f2f32161027ce85c4f7507f0873e2e7ae53bef9467828504d4e3675b22909502c79bc87394d48cb7bb209d60dfa89234ebd8eb3772631f80f01c85790db234ef58808313f398ae307c6f045a3f1ebab74bc9d09339e7770b569e744937bc2763cc4d6636d3bc682573ef2b996d96fd699dc7cda1c7c6ee590c6366666636cca774c5156e6813420e5816906a7a41701fa0dca1419b42d543b2695d649ff95f67ba61807f370200635939b47dd3c23f4ce54b1e5c2e155e9496418e240f31c7b2462efbb7579e897432e4a1664e357374a246216ab4426f97827616306dff2c7153692b3a8f433e40dd47ac317836e98ab48158b0daf241273c5b1998eff9c2728ba6575a8de0d4e5506ed77fa35c0cb61e4f899c3888eb247b615ef28ad104820a97474f8d5b2c430c2560f68b9e27b8411fe0fb85496d3c5b508c7828d3c3a536412607372ee4ff630671c31047b250640e72ed825d012aacabc7950998774a54156f78dafe42781fb9a8ba666fb8c4ae8a4f6de0e43508321dbb0e0a243669528246c8cfe34f41c9e1f11295c46ed444e1825b8a076b0ef8376b6d321ae0bae95d83ee51f95336304fe008fd93f82b58b36cbd5f822dff0c78d63cf1eb2d40e9d4aa7f365aa688f6072bb28f2643fa25816012b3d328a1f24e638e4c016f43e31856744d88586d60ab2c6072f897fdc64f9f3bb1850bf400f4a378dc6bc46833dc661b1e586a0a869c826b54d5dfb1d7c2c9f2a21bdc44792ae0dbfd8ac8095f69b919d4f58060a2e88f988ab14871c0cd63f0efd42403d717cdac51f26443a69e1933386744ec296d79562831dddbcfa541b5726ce8eb1b64cf3ad9b35cce735e90ee36865fd75c97e4abe6aec350fd9e043835ab4b026857d392d8b09cb41d5a4cc9a35346f52abd1d989a9bb0d62829e6cc4ae43ad77095de51a73fdb46afae55203c86bc182cf1e1f22981e93851ee4e88e1b9a7ca2ca8d1faf6a9576bf6547b6e63d40f188b1c52c48ac51d7c215ba3fc77c5070790c41a409a2541979493c9320b851a44767df89a11912e661a85acc95f226283ae522b6ae63592fb868b6b74a622d80e80e96d4d9663eb78ed2a40b2d824a4acd9540db9a81c3831b0a06aaef679994d5f2e10c4d71264b7d41e3d9c67035789034f91c479d5410df09ac25deab0238987124a67770e26ce4a54e42352334fb10c9ccf3a7d0b00c34f3a2e75fcf1e00e52678fc3210c6228fb8e510a0318075a6c0082fa8b8ce72ed2a54fd8904734f199c77ec18d217a34d1a225c2e8c682a60599f0aa0af2649974306992da04e251559a4e7382f1fd3d8a4ac6370e46c20abaf6099d2d84016e9f2e7ad6b5cff332fbf7abeed81798cfefdf44f2cc700e6f62ccd5a2006922ff8461dd0d892630f3709aae03f3b36daa95e53b4b196ceb21ad33f81ef200c2e57b83664e44279bc9f4fdfeb5e6fc92f408298ebfc144551ef4304019ba7b583111f9c30ec66082de8bc081b90ac28d273857f285e61aa311ee13b676c4961a28d3f102b41be004d188ebbd6ff37feafa90bec272ceb2e1ec33a0099770c744416d9e5341c1ccfc1a588b6a8ed54fa65e78466ec6995df8db07a0d1e44a801adf1a85fb14b19d30befa0cd0bda14357ce81536c29445604f3775831e43504717de0ae52972832c8820d74611b1a2bf0ea6483dcad463f2d0adb56d6a45b6c4281e32c715e9709edbfa7089629dc2dcf70b4949632ef32dd77f1245a60c9c48b161fad4c855ede1c7ac0604324da651c362a776bde28fabcdbd30c5108855420f776d40b10c9d5dae25c1ba3889f8cdcd54dac626df8064bdf56e765519d82faf2bd9124f804a58b2fb0fec80bda3bc0ec798848dae2621a1339a1bc2802a628f5259cf00ac225f6ab086b6786278532562970502f380d49b3954da170581d96b3bd1f79d34afe3886eb49d9ff2287f1b5f94691089d46fa9587799e8718ee1789515ea918f42f8b11bbed6a10451ebda1d12be87cc40b3582971c9596df7827b1a32fd45f3d479967ddc34d3370f8e12b0c43f5e6d49a87b2596c20a6f47a4612bee31ac43da2f96ec073ac1da3bc56b731fd774d3f822008ed3969df670b48d7223108c3451d193ff1dfc9de0cb000642a8f188b5550118ea17c95b21f68507e705d6d125a078929fbccef65f63d16e3516e1cbc4e80aa894dd00c2afd388199ab9de1d1e7352d889c8b6d3a637453d0ed844ee3a01ba52fa16a147783217a2029cbe4680d14fa0b5ed0d8058073c18ae9851a603d9fd02b8912ccee92526e75f0c42d89309de25c7a3dcf6c3801de6550e908c58537a9e41864310661c61e94672375efcee09389dcdc5f66717c86c744ee8d50940f54c85f2fc9a8ee2824d22b362c507ca4e9b7dbaeb0c80864c58a0d3358310b769153eb580d47913127db0287d75c1e84dda7f1e8adb3c457e010231e23be631a2b806724ca20ed9581920fd857b32ecaeb0a1006774e1816b983bbb29cd0351c6d1373aa10e8923ae9fc94ed108a52fabc4b0c5f1544c59c2e0d4447e50e5db7d8d07024d204d597e0e7ff9a4fc7a9e5b64c171939c21005819fd344ed80529addbcd97083213b8783a0d35328a51954c085bd1fb7416e21e4ec2218a2423634bdcd969cf5a593beb36ce4cb7b0354c6c42d0e4a870332fb0a4b6da29f5fc4bb5ff2a6c355ba6825addfeb60bc0c287e97e6c951cb19be1371a419e5bac0b9bfc3f28690afc62aefd0e9f18b04dfad528291efee35fb8b4c66fb9bf954b9118f2ce1e1276385855ae0a2267e9f8e665b2c6cee23a5d7b4b9a7d82409c1b1cd2fb1af8f0ca03442e0761c8f4e3ea25e86a46174ee1ebbe84613534f50e4e1ad2b01645d9122082cf84d589198c717c228fff447c95be7b5e558a85e52a2e94c55eea20ead7fb64e565d32b50b7c110bf4b8505bc2f1e07d76b363472db05391359fb902cb97dc265c6cd52727704e6134297bcd346f58d4218dda55f9da213796d347867a569c5105a40ec6f7ccf046aee230a361082874e115264bc25a270cfde7a198052a3c24a6e8e4f40cdfa66e9cc0abc9410fe492b4cf60af66437d5897896d8e5592e86cfc651ba058f8c87d90d4cbf6270f1e46aeeb1c4a3e77847b169b27c339a87b91d66507156f3e87a6331ad5e4e22bc89e3b6416739dff4813680a8d0fd9bf9ff9b52191dd985754f271d4cd9f21becb512408d8531304d380c80da54ab02291326d27c6defc6aa9ed1cbdc51c05cce30238fe112e2f3cc326877d6aeb472b3bea01b9909edf4fc2c16a54d9bde746590652bc643185dc07f3f15347bb2acda8dfe1cae8b9c914d4a3c8e767840c7ffbf0381df9c55ede8ab9298aa18428d5feb46410f388b846ab63da3c946309471f5b0a982686a5988502d6e8f1dc74c08e7ff1bd320bb46e1780776109c2208eb1417dffb95a487597740497726180bbda7dbb831979ea8a51b44d70800022a8b4223fc942327e7c5754739388a7f76d4c397805dd72887c8738756ad7ee74939376a8d49d7cacf858bf0a08a5aa64ca0caf348114b309066c67a6868255465d31554efb2bc42748dd9e69484573a032d9a0c880a90e3e12ad2dcef8ad970d8b04e3eb8bd48e347a658a892c73dca1c9748488ad029173fb7d58b753ba7dc33005f4e8d3e5f3e9e442da81be733bebc9733b95d55ece240f71e891c79a64bb23a8647f0778a845858ff85ea61aa4a926cd5bbbb9d924e76017843c0e35186f0aeb8ae12098c4caf06b2a5331d83006b47d39f6bb84f5add049e7b46c744ead670ffd58a2ccf22a618671783c387bb810662f1957d4e079e2de68f1c421a6ee779019008a2e39814b144a6578d579e121819799201ae4679499b01213c686037a6c28c35d5a1b686f1a623c89191a19358ec71bef62f6a04c4fb52b9e1399aeca00d993a5677e3d460200cc2372ef0dfb911543e44165453f1f23f6b787dd77772c9734a80443aee6a300da711e271c9d70960df3ba5f5817321da3d434d6c1313365f709340946ebd6b458a061b6eb73eb91459b00ffdc300bcbca89a16068d22d3e910624543c395fa9b28416518f4acb060ecf8cda51427c5f15b8a63f1c0262cee1e8a7ed95d7264b5f43170ada9ef062fa6a3f3bbe428ac9b42bab5bb8c6fdff66310611422fb262f6c5e1c9bea9a2b3a45c6b1dd8ebaab36ccca1a99d75f82fe1d1bce7c1c283ccc3db84842ccaa34245d895d7f67fb379cfd6613226ee557a368cd37974f8eed68e8be29321ec737d5b524c1e73a25f64f1589679b2ad1318d6dd2d825d27e5abf1dfb89b8587bc288d5015315f5a54e28041e73749d522a92db017d75e1475979b91da947d821b21723f3db9295671fae647e0309611ebea3620bb31d7f0aebd4655df43ac39515daa521dc14f926a59a5177e338b6f2a38a4459581af11b73f58b9cb2e7b05797343ed813bab7d56b4576d41f3bde6e27f6b9ebcbad079f650b66dda0518f4b2c86db180d81e8b5eaac61da76509846def8b79d8b64b12a4e735c16af521cec3ad27b15cf44e82c46012ead88bf4485c5b60fa94110f14b54f12c21c3ad3e7114782a589e79025562d2ef3a5d33cdaf40ced8c094d900824663e18ae84263c07840536c220a17d5c43a6e85fd2cc1462bf1bc690f48c273bb01b4505a8da50464523e594c34734edd07e31e8f93163955c7ca056a1f223d174272c59725bf2a6ca33084abbb765355a19f9839c3d6d87f7ff2acc55a79552b52211d1acc5017429875516336307e3fa8fbbe2cee7a817f2c1aae411eeef09ac0a4ef27b4ffa4cf3a58ddf9037fe984af5d78ada657a779e3eb3ee20aa910e1ab38681b03e1ec76e7613af7ef9ba47350265158fb494687f2cc55bb6a2d67e0b53a334bf585243e13af5c2452c5e0d2eb6aea38cd91c4275ac567f8ac729d47c61335cdb6bbc4317e9679436e5bba709654e49d96763063ffc58282a4fe1883e4a7046913bd508344e2e4a2bf6f6b62f6ab44c099d8948988d3c214179389f9bf2d43a42c5ac20ebba0d56865a292f1ff3c93d178df2ad6b311021af1c2d871aeaf2ea40b1768c0ff3cab3da038b08a45e1019ff77699096470c044a48d727bcb7182193401574558fe58b61b56c7ba3585a3f4400c4720206ab3b0570e881637a0ecb05885458c5cfd7929e13ca5a14951b18982e92945e1579a6ae36884547c38e0ce353195ec03e374e07f65dbde85b2e8f174a0603a579e2132496c52466d1125b30e68afe2d96b546135cfedb8adf98e8e882f2d5245939ca446df3985394ef080dc324ab9eb061d30873734f572e922d3abb2faa370f4fa27d59b1362fe09a9494d1c1f015120e0219a610c8a582b160178c142eda3d49e2f3e44eda428ffdb546b7af3b13aae2e80822c3752c041a3932aa0bf2e94492939a6cf95961328a6450beae94aa1bf0b5effb754c98cc1cf492edca4859c5f4b26fea5cabc9692c8dab6308091691426542c378737db809e28da8cc34a699b75427a76e2f2e6493c1958a35fb75665b9efa57297b107468c987c12031b34fd6b47084b59f553e9833bd42c957faa1125fd1981e644fb2e738d30dad10c473949dcbfe1d3855c3f0a32a2268b990c7443ce0c3817ffe1d0df8c74428ef154f0f904af5799954bcf60d85137fccf076e31124610f80cfc1131cf42225945f469c878573509c0702920cbd0e1ee56ea69a7d490580e0aee677ef78eb05020282e97c7b2548856e825c67f0c35fb6185c23da3777acc48636401519f28c93c93b875e8c09ca28d092315189624c1deebe190746df0fe88082551b308c6303a3417ed682c9f1716b94adc72b80787f0697a4062e6f891b0701a7a1ea5e5bd66c9baeac354de33ac65e0d995e98d91fc98d79c350e29659dd93c7c1ffaa83c0dd5e70312da0137d228abc1f074fdc606caea84071a0d1cb0869d705137135746e68c05260471ee501b31bdb490e6cb7d6a170a87274cf30003d1262642c2372fde55b048486d2dcacaecf8cb280fcb530a3074bfba8b8e823ba41600428cf91605641879aa3d1622b5be95b98751166a27011f6debb0803dda2305dc5c3120986da95839ed014d2fbbbc92466991ab207ffea54f17231cb2fac40d9682c2e1df2f48417e11feb2679f20465b474202cba751a60afe8651da7f84d118e50b4d38f275aecdf2ef7fd89022e3968074dbd00d14e23ac3c533a82c1daeec2ad0a729c0ab65c5c0375c0234fa9d0cfe4b4a89c8e3e20cc522b18c73c56d62638b19cbc7f3a0b5d03b108fd1b912e0c5458b14f3cb6bc49cf6158a035a77cd38af323618f5c08311d77298ea4324f08266a6c561c0a0188136c4f47b16ea3603648432f45764eec0b090b0ba6fe03bdb057e1474e6cb369fa78a2ee484a13aa2bcb88452d7977b4fdca0d28829ed07f09d3177fba494240d11bf0433cbaded6ace02fd2d0e7303f0634a00ed92a6377e48b14a0483d560bb94ab55a4adaf5a34e2338483cb14440e9f8c9b172d52d59f31aee3f7b73f1f714048fe511e496c8550e06a700ade3b983a0b426d5cf4f6e29746893c8717946c88f5249005a271637ead003df1b2cd41f41b08dae54c00d2d4d8f42a3b100aed136485b260844d9927126265f7a1f05d301499df38d4a003d27a22e4ab0f382b559f66a87624ded8aa84e7e623730f26da39f20075f6231852f8f1004b1cc032395bfc362aa9c067209ff305ef02d2c6644579a9664781a903c2a45621d8ed70839ab84f3e9a952293fa5e82915dabf83f07de1ce2652e0b5506cfb20f1d0648ea33180f477c69e451a7b58856312409bea0f6e2274e65dae8420d8bdc060adceb745251edc9fa068ae23006276eb161b7098a5432fc9d81e81b0ca498b24820e5b53704462a4a655c0146540ca16009db6b9c5af9b52d23b05752d548596c60834878fe92e070fbb5daac7ada19a6564d4fcde160b013f20ab5786d29ccb5d05ec4d1a10368c2ca362b935d5b2aeb19ca10120f34403efbf78b6f425070ecfe16ddbb993dcb5519adc999da7da9a7e3dde8c2cb9dea2fe843377c538dac473e6c06f812ec5314376ce44fd69b872ce849ae27273c392a5965a03674da7580a229b73263d4b7f48bbff652cbb78b6e69cf9e0ccc71363af5a23a084c6effd28e59ed35dd98ecca00e2c3f866a7a692665d3f89899d95e8ec7657a7955f4498dc06e62a4687655cd99c119b468e804b0307ac311e44aa3b007e680098e1f1f24d4c8dd9fafb3676a45212d7986a5e2cd3310c09ec7daaccac3590c8a3677ce9c10e20801d47294dc0d74da03b6fc0bf6bc22e6cf576d1ce6d25c9cff9c2369dcbc99732c72dfbeb7fe361fbfe4b2c4a11f8fc51ff74f4e4cb51c428c0133020a005bc4e94807c27f921a0c8e82b8154fb2df29c56aa6ced8abfa6439b8d02d55d3fb5b4f381eba5f3f536573c7060849301f96ab71dd6cb24f59ee5103ecb2c426803595d3ede6979f9161a9d7c2aee61463857b7f79da891926eda4b73b87d794c9c6be9f449ff19141cf65b29d4e93b39c77cd4358dbc4cf6b4d517cc52b61382f91ab660195aa7a87a4a28926b3237ac437c7b9502c91e17bcde2a847e4d19b0a63f603da66dbd57ac7c11c74ae130db409f89e336cc4d86bfcb63bb3f062b255c54cd7d6356656dbb3c77997c32b36b126343eebcf0ebe2762ddcbfa9ed03166a55144d630970207dbacdc3d072172b9feac02046e8ee44ad24d3caccd7fe2491cf998c16061c78819e45952a040e1d1a17e56e8661cdd292a7b6ca1c27a475d1e0850512388f29063d46ac41f2347ad28ca1f4129104685b2703c07dbe18553a8225655971bf1fa2185b414fd12ab568ea40af9831639ac47532a31c62e9f2c967eeb4290c44de9ceb868fac83a15e4b8e5125163c4bcf6fb7ef57554d65dac7da1c15a03a4a981c476086c201919aadb3931f35609cafd067ca20fbf98879713a0c87fcb299d710060c274cd3da7f0a4f16611cfd6873c429e504474b25c65cee202c2779de260b7c42d202609125f4a9b6ffff35b97f2c3c21fc08ad1523dbdf64bbf65a937ae8729371c039b59a97c0ece0c438c2efecfcfaa941f96e0802a464ab1f4fa931d03ce0c07040e0c03f33da93132116f6ecc5dfb9fdf9a94272ce8802a9414324f47e6c14617fea724e5cad009c310fa03073f5e46c3d218a9c7cd5f5c94adf2d12f26023c70f70131e2c2be3e2a3b8f73a62123ff1f9871f9e7be742747d5f8825d5c29868c6a5745ba28a55d7aba30fe2caab02f4ab7638107e4cd629aca00a87abe0b5b81a86ee00b7f5d577a38b2581b1ef34ab46c47e3c62a4fef2cc02977549bb691b55619ea0d80c6ec46814a159aae992d400ad34ca3f5d719ce9b97f61a0186be9ac02700494bf4e0acb11ab2cb4d833b76060475e49600c3a30df85d221107f8c3ab0e485e02f41907a1be6cc627e90974060c54c7928dc3b5b07c040823864549c52d100acd95263c0f78405389802256be0f66d36d0a78a608d909b4236a5f59ff1382fbd2b7fd5c5bb6d1586dd9399ec46b415f6330b2bd9b83c2ee55dc045759223f394a1974dcca9bf72ce36ab44f7f0671f894c47b836c4819b6fc47916d9d20de9a727d8342682d80d22e2ec2ef56afef612ccd31eaff59cb6c451c5c2985c50e836b65d1e22e05513bcf83be4f9d9cb44fa54859d38007174068f305513f2e00d43cab5abfb108c16e39c41f6cd19d2ac91970867433db8e17be369ee72671a052ae556f8466aae55ae132d5b939b7c2848a6c884fc50cba5ff01a7e942355f825d8340bf000b202c2be17de0cf0bebac8b3f6dedd69c0640a7a8118a823210440739526302cb9c47706f50dce50934dcf4e5cff93c5e8b9043c6d9d9c18ee15e8431b4f12753f2557882fa29fb4e80d72d8db86877e4e17bb135f62fbb3fcf9539b0307ba32d1fdb14d561a464dde926e626261c9c63608303157b68143136213dbb413fb2d347e396f2f048c2be045b059c60dbb255171dce29e764bf8e961d12c4efd4d83365eeee69ca83635d7bdf185ca86af01fe972df4ee0ebf7fe2c84a98cd2d52994131ffbd34b39d8e5beb60312312743946e10dbfbd44c0aec1412fe265fd0a65743c52366c4989bdde2dba576777ce939bd132a6128cba211076a45c070b5f918942b7d5e0b9cfec2695eb6f8ef4cb36f98ffc4faef6a661a64787d9a9f2299d0f4003d375a29d527259a539292337adf7e389415ba9f73135e8416c589ce0477dd9bc5bfa92d3808fb5bcef1284ee3082c53efd4b3bfd2feeb99817637b8857f14a80dab7840ed30ab4584c087887806940d1e3d8e86201e9e97112cc9c7c110ccfda590bd825742733f437b9888f068a70fc23efbdb950930ab81f9992c341c47b73638827e0ee4cece8e3a1ad1a63414e0e854143102ea69dfd75ca1741496ef2bc9408541e1ad6f6e58b93217a3ca8541dbf4585e282b4b277e7154b9b805c43b33bee0468a650914f324feffca65063107d770b5f3e87fc931550b2918af665cc91d180b2f51910b969b2ac50562c16996c9fa0a160c22a19ad734759747afe6cce98b9ce9807b07601fd8fb05c51f4c55f46f2fc31bff122e712e51f4d5e25cf58b52d07e6a9e51cf1c1c28803d4a330bbc883a08d3840fbedbad55a1f0e4a89c25f42cdc8cf3a4a862eda5c0cdea2ba741e00c31f218c94231c64d475ff24038b85a09dbab0692342cb30685a5618a3eb5fa322e613b896aa3b90c9a57ac0ed2adcf4ac64a71132223222e5904a8cb391f1e1f297da3287cc276a054a4fa0cb2e24a1166f2be2ead1d03a55b84e49dd283c387f91c0528166dacc5231263173c48c6ddadc01f0e8aaa79dd00a2ac9c05ba432c2057ca72b9d51fda11038fbaf546d558ef17465bd32fa4dc1484e63006ae48b113c60c6a5f0a440af934349506a7b57e6c002493214713ef762b9b0c4dbe15f63115aaef3af893abb55591063996f41fce58167b74a303b0d5df7780d12d558ddd0ea7696b8bcb509b78e1bd8fa9302a5ba3943fa28d9ed46234e8c621174829e22c835e3fd34515e5e55d2b65a4075235543d58028c4c74a64f28491cb38ee45617fee85984c42776829f537c0be85b234974f6a3e8e7d613c0015b817eabf2ba2fdb93262bcd16f443c0ede0078550b362e849f31c4d7a3fe6420b6182177634c1dd57f3aa998a01651bfe33b0b81fc7a18c48515870c1a1ae88b4158b41b5244f89dd9b5159237a8123be905a36e8b40e5a1705ce35fb74df9f8919e1132b2fcef2458f05171082a0327818affad2fa20d0bce082b0305728a008c03a5990a1ba9b6bcea0792889c1d62c2890f4042330bc71a81c19be930b9faae1356287928f2351867c811ec40c82fcfe44ab8e5f94901edab3889cdeea6c9aeecfd5506af9e849d2f79cc765952fd6cbe79d9588ae3bb33b1ad6df653e0e9086d6a3dcb84fb6f2dc9a8637996684518f43e2672995b6424c0936a95b3e3dde2669353de7a2d140923018a452efc8e2f4c1fb4b6bfbea0150c701788c07600cc1442f73586dda14054a97bc2fa5b881d9014d8aa4971fa487da281e617020c0b68d4e2c48bb381965b63c5e0a695d5c58d0671cc496e430c787104e6fba2fe6f29d34f3b1fde236579f52ff44ce57f7149d8bdb7ed3f7870428ada5055c921dbb3b466adb907ec6a1b6a990aab0d7ac04e6e6ce6df49eabdaf7ca43b7b1913ca94e8dd1b9401205aa90c4b36822b391329320c9539478c1e071d77e8d011071c3becd8a10e1c39e668393038d7adef08be63c71d39748443c71d3be8808372e0d6a1fc3bccf22a388987f307072ede4a5f8e4df8e2cf5ee527baad4a855f9b59b98f7a82d4cf1756ae2955f16756096d056c75e1f012c1cb93e7d6e271044171d4e2a96d09c04545d23084a3152c267480532930ccaeac78766da09b0aa9159733ed4c092e7bc4e6c2054a1d9f2aca981eee39afa134596875af74774bb8d4ce720b594e5a73d6ac07eeca4a08adcd9a61915b49bb949519663cf0165b85b26ad61963ccd6d451d69d31cb8cbbb1325a2bb366bae456d22e656586190fbcc556a1ac9a75c618b33575947567cc32e36eac8cd6caac992eb95525a83c1a7048b33a1bcc50f975c53ea2710484f4fac26b5b69d5943d2a3f105ecc467fb9e913c3669e39254a7be09664257a951e954720ca3c00de277ae9b976411645e567df59ff5acd045eda356aacd8969bedb64b6c9a756dc5b4ee968bb56cd1ac552bd6fa719451d959f12542f0dae8d7a73b4ae59b87b22701e66a075f90242c2ec653ae791a9d224235fa72ca738273ee7261339b12c2afd6d63092bc9806aee44e00356d86b3772f6569b2e05219310f0872115a38928b10d4dae0e17ef053494dc4c5886c94901ec8213a50ba90a0b39afb1aca722edb1c801b9daa513fce47ab708f90c2aed1380f51b362a19c408cef9e9874b45376036ec1a2f11288c07ebde8948b57a4d2de8c5c019e18db290e1cd28e50123eb0fc2364b962b8745071da645ccc002b69a070c48e080d49601f1cefeff5fac933fcef1073cbb7b33b9a77ed0a83d1eaa8b6316622d4bde0cb1f03153adb0b1f4cf6cfc55d3e9c019112e55b38ac7e79ad21a95f930bcb651c0bbb24528c474aeb49eb00b2ec22fa981d676968a07b14c55cb54728d31e6d130142b838df9ffe0773354ea5816e40c96f5bddb6d0eacab6daa465ec3e911d378ef8d33a746ba2439badbf72dc0dfd020e980ef23496df2a0345b899921f73fe8cd7604be6751d89ece9a2f97bc57929c985633c7c3203f1b5fa81a056f8b952d0cfa80fb73c93a50e626335b61c70c40fc813ac5c1b1b8e68552e05e2e974b36c32add18447b2d2e177b1d14f05f3ed31042e8eb8dd186027b4ac3e2e4edf0d7bb2b2b84f45a5b51d9d1b0f0511bdecb33a88fca40ccf9bd601d2772319555e43858ae9794786a41c85f1ace26db60e4a73da45eca6d70ec50188855603818ee005100c3cef92308b8db5b70f11eb1e0f0ca0dc758992a783c8119affe8b87871040649c5902be2e2e4c860ff47b3f0e1e63bd38d9c40720139bcde1ded593f2bff48333edd8895abc437d7825be87b1976c0d15a813d4f22055293035db3e895038c1c31e143361404714eb59e27aa7813d3d2085f61e18c174c2260689f317ab3d912e5f0dda6e9bbd8985d3401a4059e4e5ba0f496c36008773ef3e4d3e2d298947882372b6b5cba7ee2a2709ee1b1a3672fb4a5a1bb124d4240fc64afbaaca3f0365acc1f8b03ffb723ddf4431bf3e7430b97092c2f7dc31876c101f114c3abc90f4d2f6252ce98149ecc5ed8acd140defa71dd636ca1455be13cb5e9cababc4def79878e231e33ff1d7fa33cdf18befab12f3191839a49dc568e4f3883ebf7b90d9b0b1d63a8b95c5b5b20afb6fa3b0cec9e160773cad9030412343bfb00b5ef33206a03e5d03b661e7ed88613431b2040eed0aefc126997e7336ee124fcdc86cd858e31d45caeadd590575bfd5d0b764fcb8839e56c0c02099a9dcdc16e83f6c40b35061946a6290149643b4578388b4ecfcba63701696bd947ea762ee6861bde1a765ad8f5272463887f756cb8b3e67dd97a5715df29a0e0c5d339a223f3d9d26af0b3b6bdfc5cf5be095eba5a84dd27928140ca026cfdb1065040138038fcc890b0cfb159dff8d76385cef2e880b7091d06da2810da3b9d68e30f4be18b8deb236b5d16918c458422d83c68bd878e9410a2fe3a4a76ca4709e7c62febdd8608748864c5e6a8c87f49e25193061881e7701527d99d4083633f1749b4a6d86baa84ce8bb79a48577b58b8f866b283c566230a3840b26a7150ace4181b8320e06c07bfc1b181cc8439aa33ab0cb9a890238d60a96bab9e0a1d157a152a09f17e4ea331a96ed1e031046450025809b16a26ec3c780a4eb9485aee49549e7a9d2bc505cd06de08b3dd0ee7d9a474bbead9791b69b68b64d0a23dde3b17d9a16bacf56ba96d857b561310c53ac43dae331958f2b2476ba0e0428ce6f3417c19b8258a512175b58fe9c75f79909bbd4ecbf0033479461f63dd19fe943dc395a0d6e5ca99c2b98f5ce3ce4f9f3a60da3ac0696bc84f04634c159501c5515f4eb2b7ec8b0e3091a739a0b8259673959de6cced29d11c561575e34588dba84c7a76665f90decdbc1f9d8d841705ff4a688e0d231ad4ecd6a1e8466744b1b4240a1c2f1fc4cb86e19a0ee2943d448a0a297ea7b27a9e96da16edb608246a4d5d3c1fc8a7a5349aa46163423eb0e15fa8554454d60846a3cf767a340fcd2f0b35b456c44282894150461685fea1cef0ea0f316fdadb6373b7e882e835b7025a236544b84e753d6a8c1abf1a60940dbf970be16f8cf7b5a67139d8adec08bf3dc1d4afdcce654b21a3ddc8fc4a9741cf9c29322507b176991554ef53a71ba7c6068f1acad74da87a6a47856174631ed7e5a20bb122055ba38eaf43fd69856bbe98d2fba8cb8cf45e649a08c3f767101cc014c46aceb07561c4c04a67a4017995aba4c3790325af2b52cddb4fd990aed8464981ccbe9c4483ffc9f121c579047ae82c9282ab67f83394ca0b2b013c5d010af4dc355770ce61750acc7240ae50e5c6eed0e64552951712ddec19e28f9907ee30612477136af386f61118d7dfb570de7c4c681f1a17cbcbe442e5640ae7627934cce10ecae6a60ee50db66f3adb8ae077af16e826774a726fff1d310353034603bbd91abffc38f9013491ad3faddd27ebb42e0a815ab25104e6c8c69b1841e3436badaf84d45b4a84c494f20daea8dca3b05a62389b43522d3ea7e8c72edbeceeee454bf596369d4f280845d13751c939e77c216eb5eb2cdcbae49c732e06d55b3a241a8fc8f7504cfeeb160114632a525e623a322358a5206f51e99218d7dbbfd8b1ddb54dab893df7fe5ddbb45a4b654282836539f671ec9680792cbb1a42d13ccf6ac2076868beef8e919022393c2e4f366b46f1e60d14026e7c26b97d77f7a757bda5c121d108e2e9f84074adebb60994b4ee09aead75dbaf623173aa4ac22c2feb68df5f4d0a526fa9101152fe208959b2b4c64d388e3c5e3d40215b8df242415b3846476f06a7d06050573713ac8cdad0ca2006f3ffbf4b918434501865e6bddb3e0b93c403bb9510dd21c32b47a7a9882964f4a5e4a4fa78d7366def7ffd9b2ddf61fcd4bebfceffff1fa0cd9cdb2521c396bd01f5c13313beaa6214a198f8ca5131817ccfeeee6e347c71eebcb603b1a123693161a59c734671aab7f409fd0f28d1dc1bfc0f29c3e4c7bc20cbf250396041e15ddbb4bd8bf07b767777a42c249c7b4fe7eebe33a1213a24472867e3c50b628e0b0a510dbe6727e672391c77777777f7202e45a2f1c4b907714076e7f9406f79efd96b3877770722aab7d4a839001db5f6271c9c3bace52ac6d58f7a25963688745f6cd88d301d399ad1e5ee633f50398ee4cca880445afa1191437d91c15ddbb4bd995eb6e9459a59bbd62517311185a42a2c9f2a1f8f9755c60739b2e433f4734b5c9beb2ae97a9a58aca666347d718506a31f2490e5a91f8447166fd9658097845112381fedd004dd4d582da26b83dd12d7e6ba0e5cd15a6b2049f5962a974de7f30408d42b70cf2f7067edc0427304deb54ddbfb573282918f530b41bc1c434b30a6b2dcfcfeffffcc1d1edc7fd631710861884168bdce05efdaa6edbdc232a237e3e07b76b5c5dddddddd3d884b959ac4e02f75bab2345592daad2e40b28ebc5ddbb49deeffbc5c89b95c4e664d9734904b66d48b5fce90231f4515d8e8124b2fbb62964400843a939503ab36b304cd8a22b49195861d58402c79027ee1220691e97892e1f3b58b8699392504b24d5b62ef481ccdf07bee6469ebdaa22accc2ad8fdd1a6e11b78c5bc72de456d24ddc8133eeee24c434ce4ee3c01a27d6383425232e30d6955b3ac4c6c7552583a9b5d33484daf9704319c673e7fdb825aecd759943ddcb4fadb5f6edd45b0ac734451e10bea09c73ce334cf5964a5165759dcc889dd0ec5ae5114f1844e697ecc17a1159660c3073d0d3c00a9c94183c3830ef4e366ab1b5c23291c31eafdfb3bbbb3ff5732765815dd05299624083d05411244c4d5490cce869986293dfffffff6f2cc5b890915b41d972c29b8246997fe55aa429168b3cc5a0a25091a88854646a560928eb55aa9135dbd1b0f1003272411f71244e73ec4312791ec1c4258466bc51878ff7eceeee4c285e9c7bf03dbbbbbbd18c13e7ce33519fef7a4bdb15b7c4b5b9ee9531c32c1c81abec98e80549015271e532637be0947307823005757757712084ef7d72090af311c3062a2689e297fdff3fb9ded20c9c7573ce43e0213bdffb493e7c21592e930b38764ca86b6b63e085e6d18326b2851d764b5c9beb12d9620f98bec1f596b659a78265310192e20aa9eae7ad1a3e65bc8899c96514a2ac788ebef0aa6924516e4c315b286dc9744f392ec664f411926819ffabbef5c4c9b80e69261ed30a0cd06ddf3f5725d55baa5c660e554dd7b9e00c9390fd40babbf3dc6cb5536f291ceb132b1aad81447cc35313fefff7b9998318d0dcfef37c81102dc6863a44468071d9d440aeb04a61ec040f32c566e728c4696cd8d5530ca291330386870ab6e20945e5e55f07f724393c1e8ec35ff332a5ab088bd34d915a109d56bf3361c38eac6b6bc788ebbfecdf2d716d25399bb43d77f7a41a1a9c3b2cab81758ddc32153b7ef944249d6822a1313d323306486fa6f4815f1519083da22dd39d791585553c4392a8de5263e6903cd60280ea322cd3911bea04800a0bf2518304588f1d3771115186020d4ec0e44a70d960690153ae40116080686c5ac134d9fc40be2c19309bd1110ad205f463e1844b8b1b0818f05a19723c423da990fd789249326aad354b53bda5ce27d4034b34e701f8aeed0666d2bdf5e9a6640a366af6fbffefad37c6a06cd8cd1ab6407ae4e55cf9cdb8d0ca11c118cd84181ab934c1a69c463f6c58cb2b513d97ee3f7548f4dd5f49885c386106754b9cedf45a1ea9c771a8b523f366b311ddc731eb04a3f9822175aa01cf02459c197ebb756678d7366d6fd7efd95b9d5b92ea2d55b61d5a96bb16c248840550aa0b860dd205fe2970fe42585860435081e637b10e25730f28c011fc6cd7a312523e7777f7b8c697c117ad91c5c1f596b62f3976b76b9bb61d8ed16affff4f51aab774d9747e90f2f4921b37d3188b6ac75a66c2ac20502df4cceccc3499c68c18728c6e896b735d1d31b3fcffbf2a12a45e51ad183b6ac4dc58a135c3bc514fa6920afc98a4bcb4442075df33d5e399a6ac66b4d65af7bcde13f49ea1f710bdc7e83d47ef417a4f32c984738f73ebeefe434abda554595d1d7e88ed3a54c15fc10a6cddf663fdcb56eb0bf4c05ddbb4bd31ac00b0ccf994002061c7468526a08f538c98b8c5c56d75feff0fa2516f699127731014e4debc0ea9e248584700f4065207e44a41e8e05ddbb4bde1155c7777e5abded2e0507fa0246a1d858348486444c72b16d1b2820aa8a753cc8a698d94a8962bbbb6697bc7231d4c0c77aa663a1440129dd24e13834ec693526f29555617089e18887717ab42761d08817db4708a95814b24b0495334e9da7819feb9b2a45c87a477fb1e4e617f20dd3cd98e3094268aac64ec70295dd860b1462c60a5bb3b8f8010402eaa601848979ca1e342e28576f4d3f56c555fee9085d46dfea924274bc6ffff1ed3d38e16ce3de21bbbdefbff07aecc2fa432e92b6c967da0146559d98b09d22763cf2f6719e6d3028d4c0c7725aa9bb66b9b5693edfd2b091203014530203a3e2b462ec213575f31173cd08d207aabb0686c5878666830069deeeeb323142b091316954284104aa68965450015cdf32034eeee4094989669c8e9be6bdf1febc50a6ea74eb3ac36dca25f1a172e71906a5e1362553f532b869e47096a6473584efcff2fd930e2fe338fe5a9649885d906a7d74bc3221ca524c1403183a973f4a29725fbffb96877241ca872ea0f1ff9c99261bd8481129f2d0f832e25a70b9c17e371a5015de6b480493acbd199cbe55ed4232e352221750c03ba25aecd75571ebc382ebe50311383d34c8704616c0af0a0e9d803babb2fed1071eebed4a38cdbf7d7f9ff7fb9ded256657bff40adb536a2516f6991274808841191bb3bef3dbbbb7b8ee77a4b5bf6cbab60a092fb3c1c5945474bae1b37b61e05ebdc1ded162c2a63d3966dd7a089caa45c6f01adbb7b902cf596767d0822b683e30c7e84e4eb5d5b12a77b5cdfa3891584172873f88efc766dd3f6ce3f150709a2a88c651485081d9c98c705ef02f72fc40264bde00b3c7ce01da11a3122d6236b66246548887ae755ed150b295750e7b925aecd7575bcff7f9f32c33107e36628e377241bf13462e7844c0ac2c5b8c2ed8861924437a42899c2ffff41f70e46a83becb2cb215459c3eeb8c6cc96505fce395329d55bba6c3a9fd00da8a239126954acec11ab2073a28627a6451126299e8f4ccc8acc8e64d218f62ca2a43453d48f180e50345b9ed25b2533072be5762e38c32939e79c6984d45b4a84c494a2cada40d38562b66b9bb6b78f75e69fce9945a2e085988ddde9ce5b89ab556ec5d7dbb54ddb7b85317410b582cc9325684515c49a31a26cd95d31c3da646d7a01bbb65d5e6979b1c97b4871746df091c8c26e896b737d85b58e987a4b77704c53f413238fbb5e79afd65ab740546fa9f1884c9eb4a074770756d07ece39db20a9b794294595d505828dd8575044f8ffaf9273ce5f39f596bec121d178f4f08564c36e9e96d4647c75199e81f550656042dac84e988830861eeba64caf67be20d9a35733f6a3455cabd81234bbb6697b8f2d6742d7bfde0ebe829bc54ce8738189e853b3719622f524d51d0a115b2a502d18797e85d602ebad0fa452503174f0f8111183215b412648cc1fb690d1e77f001b2e7d252f7cceaba98feeeebe96242aa6ded21ddc012cceee6e8d3578f0d414ba2619a880089d1c3b7ec2c246a4d0a79b212c95f79edddd1deb897307aaaf6b6389818ac26f23e9aea991109adc340d64793430674eef6c802e6bccffbf12972a091571ff4a9c056a9bb36fd7366d6f1a361e324052d21328b97b81ba7e5804edc080250cd103244aa80495a36a840a6631035385d09d64ace4ae6351d82e8851c70fa8488015b7c4b5b9ee53f0c52d716d6ed4f94e09470c39edfc8f58002f5b6eba444cc6bbb6697b67e07b76777727a025cebdc689c84aa70ed912aa3ac4a54ba1e7cf4ce5bde02a0b6c05a99899a13fc2c8604442a849e83e29022c5feecacbab97e37d6c6624651b881cddf3d1901808804a1e42b2b0cc6617785cbf614909b7bef7ecad9635b5866bd820789221634a450c142c1b303f6a52b462ffff19dec761e2d803b61d8ca2be357d6a0d7b5390f2a8342d9e46c5009d00331a041c41c3401cca12b9a6031480070d8890bc7888d02c1286c6c180480c0086024100180c0602018140202c8a817096ca62b805e646dbf3bd2e64f64fe4f004eb23ff0e699e3247d24b954b5088a40ecaa685d8258c2a3eb4ecfe165df5168aaf83b3641af522ff11f7da40c0a2cca02c46d2efcdcc6a1175a1daa9d70e2a750166303407f0b645b3fc83a82b1e4899184fb508d9357cefb368f6496662150a6f7e785018b411225e0e15f5890e2d8d344d1149d7f438da024305fadde9c440f6f31737f3568755bb2fe44eb98682b9ed86ba66f98ab4db8a862750ed262b4417862278d552ef5a1ee7874ac9ff53c3143d4951a8845e4981874b338fdb6644167f70da9070c9695afbc2886b3fb9fd8c545bb6e2da3c96ac914c53d3127a343d6fafc05c2dd69c4ce918a410957a367bd3c9241d7c1218cba1ccb4637b47115544336634360960ff0568b26be93a44a1a2d9f59b24d4d66695674084fdbd875a244b6e018a06c2095e2dd4ab8dc170c6fe37ba6bdbdbc1e8b152458909ab6d0d8a7ecbca1261aef5c8f04b1c3068a2b35b45a74db7b089e3dd78d2b48c6259262ccc5d1dad46da316394643eedd95a6410cd1e4fcd54fca74e1f6da5b8bb3250970d8d5cf4a4a195d4643556a2188b7bfd5559311193eef6871797c02bc2de8bc8834292b0731e924411129b9ca537a6ceae2e270dec2c56a22b96e463f562dd90156539a401cfda7ebb33e130c2b32ef4653f2413e0940f5b53b2c237b31677e5fd1a5ba367da9a8f52f3ba211cd0a86acd14aa4534574928ada454c5c91726a7a4cca5c9e68a194a25bdd2e1ff64f5ce58c21b4eaffe332f7dd0630929ead5abf96f88b98f4712bb4d25861070fa396f6c3f228aa769d1bef21e9e5f3ddee813d442ae61f6e8103da1331e1fa9e78d1736369bc1bb1251fb2176cbdf28b32e55ade7e471266c81a4dd06282c44d1aff58c1627dfb68302d90a51f44d311893b313a8307cd6fb1475788acc3457c7b4fd399f0880683d5c650b11cd9d249aff68132935cc4ed966f320996adad48ae4546194780947df9a4e180080b6741118468028346c2867ff5c8cb30a14e029c09e75d282ea573c268928293a1f81872649162790292cfc5167a458b89fc6f0fd6686b2a058e8390076939b60b212624324df61daca31cfee89ab31cb4570f2e01b2296c28f8a721385c653b853610477395dfa84c8bd4a47210579b988cb39a3a2c755a18cc1bd73f346275a053857a265e82b441021e8be4a6224d4d03359ca241f3d7c14887a47646ca2c411139ff02fd8d3318ad02125e321b6237dee5811d423c8a9a8510786e2f6c731a10a01da3d9a5796898a7ca49222908098242196da2adf276c85713d91c840af479be33dd44a5eb0e00c6ea0f66ace750ee1db88d1ed6f050d177a8d4d6c6088a44ce2b2a490949a94b4b2a527de01514f2f3a3301a46b8f2609de770961ca6bc649fd8aa25cdac6883f60893904bfeddb91fe918bdfef655f3c8e517069c457ef5e66a650f89c7757ddf4bd252eb8bdd1c0613bdade3b21caf239f0030c93d7aa99a04305b4a17589908f2b2fac28b7981b3ae9e762258d3f881e1aec599b58884cf5cc63bdb190a6736247b98d5cb9fcd2610614e180a3298dde507fbebd8deb27dc403ec12cd41cf3fd70695f9192f71dfbf654235c6e90353490315fd6c832bde9802d0853ba985356e9db8af0566a27858c95138b2db3035d7c7a3a75dba3b647d4c995ce53d2c5b4d91dc8ada94cac2660ae2d76e22ba90317ed99b94c64fd6e32287beb800bfca12f1d2a2218ad7d1db5ca5d3b15a28269a39f7cad6b19a4b66f7e239af7f89607a8a796e0afd971daf7767d82898e207218b3bc828092d7b227d770933e0ce683636435391513bab68dad1389cd709cfd3c40e78d02454f3c51050c97d335cb8a9278364abbbcaba81e076ad8261218b934eccc8c43dff240fab4aabaa8d5c6efdba7c461f7be65bb39cdccadab8549a5b52571d0cb81fd05257f52bc54670ca95a3f890155712e5ed711a3a30a6ddb7ff721dc7d60c33917ccde9916c22a0b4b04d0af2cf4d33c4e6e10b9e3dce44cc35e553ab56df458700e79afb0220d95858da2acac25d9fec14943b4a5a1fff0bfb26a4dd03fd1d0b18b36fe593955a56e6c0b044fb29e7ae1b62415fe0edb3738f03ddadf16285f195300a2f2ee76deb793c71105df2539ba939f5340d31ede2c94a4d025862142884f01f8b598b61adddd5408ab29283531086f384921340b5dd1eb61b37b68394340723ded2dae6516f96f14f7a417ab1907ef8f3d8d002807e59119c18490349de164614cf2a4d018c482df8a54fadff007d1eb27bd59e53fb0f0af55089995afded158869ab33264e0d9ec7bf7a2abfb5b2d0686615895ea0b03f339048da25177b97eb715f87d1b76e542097067eb609b821735cd01863e577b6046e6f6ab46eeb5e81bd192f6d9586dbe510289c53f0e68887b0360b42f22b057fc969c9d4526900a413ef5d1d03f08bfb46d36078b080c9db4de95ca92f557d53820708327b4cadc8b2892f67e0abd2f158e8c14f38877a6bc6b9c4f3276af85a56859bc1a55a67fd2bec14f8b438d341d5082006a530ba240c0df3f9c5422ddddca3933d61c22138dde9184ceb36a9cbf6fb9b5fef5e3ad28aea8c716ac000560b91113db931cc3057892624067762b3a6a9b0941a5a9c4c7ef8dc2f56ac24df912b4161ccd44b5ed0e896a88f89219c826ce8f87bde318ea29d098ca286bce340d0a3ea2b03a4dc786543814d0d7e91bbd61729a3651746d1fa26c0c61c4f34605d342b5c3ac9f66ac3c78bad3d11a88b7ddb2cd19c17b8dce701d600e729e31978ed283e17bd13975471a3cc41380f61b06e6398572c969e0a97c8f0e0e1ffc1e75de3e8ad321dc86edf9aa0ae222941c5ad99472e7b497fce170223b142e1d9d710f84883ec8f038cf50403ac8bfa5be213df902c8c309038fd2b8b108378a2f35bfbd9111e646f33569271d6b03fb15ccd2e646434a6bd7d12267fb3cff5d27d2e98334a71d985bcbabddebd1423a96cd10e7887b26343f81de4cabc0c072afa62e8c7cb05c6aeed6bd1769bf89179a93f1a6cc33976e5b49095f86a79dc57f7cd358d583071d03968b122cb8d09a05fc47adec2af778011f7c542ec21fc2ac4299c316b9b112b064e15331e6cac305901a167eefdd1defcaf6816b685ba73f8b3cbecee1f82bdd2b89654323073de92f0279361ddc40b851462f2bef68bf7c6c788e0b05565c089e13c681f12679ab7ef9ba9ff896d673ef47529ac26095eec0fe4123407ab6faa661484aebaa842b7201eb6dfb528c06d760a637fbae62f1d3bc14d90c54b814df5806b6921652d24ab8e6143eada637b0cd72fa85511925f5d25b5019bc983960a35c72aef5d1235a162eea205db3afa039ad0d2e604bf6e5f0aa5b5d8b602d54635bd41d408a472636a64855314e8282d9b4bbf573350423b6d42693728633f2df5fdea4fc962764d5f80192fe48a89bfd148273cb239add4821e82f9643abd542ec7632e379c8cea7bebd05e38fb9e072b7da4c52bf436734d31fba1ec750e77db919b597124bdfa5214b2c8ecdf37ee72fc8b79da76f87306ec947a989a549238b1e6af86b9577b39aa4d7f14d3acf0d74b922082611b0eba19c2f31d3580b2505c2c15283ef06b9132264df40f716c2c541561bac5bf141f24d724920545cceede2df3f42b39d5aa37946d4b5ed98f05e1fb0e30bee5a504e93f4498f0e111d342b496ad2f4e1f4ff849c982949182dbad8a5fa4c9801369e0f9fc5680685ac05030ad4c4241faf9eb0a0e17b0b25f92004ccf3f3f5ac6bc5d61ab9e36c80a5b3397a18d538253934ee2c38bc13353534c1106bfafb9dd6d6cb96c74f050444df427c6c0ae8fd0b2952172f5f981c4cd6d23cbd4789c704e0d6f09bc12e080065c7516174ac9d4a35b5035767f959234c16fa345d631204cd16fc04323b557bc95c8ccc5953e3abab2b23c449f7f2660da91a9d322a49ce4fb65751590f6623eef1398865d64680c9156e7910a949b7f4048c7010441292de7129ce5036b030541da3d701c3fce1c711ef2e44b0e8046bca4094dea630ed38264db66adaafdbbaa81a47cc44616ce544e1419ac089e82c1be936dd76769eece46f515713c1f02649320b810a4062230def881095b3f4937fe3b0e8c6dbe3ca7818253db8ed10c6d2eedaeeb1e1ab8f3be1ff8f77209a1a6e5c21860d572e8f0300173fc6c2a2347e456ba045efc66b1abf12b2d76760aba0ec363e19c1a04e44733a3ea7bc8ad605d8e9725d0d49fc0c25d494e0344c50b616f398b342edb8a1894229c75ecd67eb20a2d7687cae4c330d13435ee91c21c74aa81054cfd8170ac3306e3fb097327717c6a0cbdc5de3d921fd7ef7a56c2e839d01a4b883fe558446cf79df45115ae624eb16c1960813dd326f3cbf8594aa969d497a53f2030e1964eae09908068ffb047e7ffa76a9d4564c424e87b4d7e412f2dad17699342f204022683428ec9295c3ca27e0ddb0c2f6e11701e9cd20969fd2f6c41a10902704f0ac8769bd1a50d1832c23d4aa888bf3c5d6bcda86761f92709fcb0c60c26f20e1ab9a0955c7a446dc5a28e9e1e371b81126b7c9588b349d0642927c3c733ce462d4b41fa86eddb5f655e5ae883ce7799b4156466c33b15f4e0f4cdd142eae599fabe121b1cd09c5fbf759726074cb015a22dc7dd33f7e1dd1ee44b9b9999cf6b7afe8b95e1331cbc12822a14a6b76411b37f65ffbff06f45ad9a19d4f7b3dc8c2ab945aed68f4d6a80bdddb98040e8fabf9ea2e33939ed1f67f68f7711d1ba6b4090d8e1ad131584f88aa1b87b0d1794ae4e9eeffae272335d065c65885e150a41a0983350131a91f648dd8ed9750e39c62b72e532def6ea17e0bffd88aaa70451cede72200c471d3a5002c5e0f6fa24180d1471824492dbdde688bfa41fb4029e138da56dfeb755a3dc949d459cbbc5a31c0aaebfade577cb36c49acf1af887f6679dee08e0e36bfa2d64938bd418cebe8c1067b011ea30f7dbd88d884d65e340493895c03c835bc0ba48e1c402839721a7e20a414691b12ef4ca1ba04fa31f71ea6a357967a29919bc7e7fe5edb61ba0eb613ccec12d7779d4cf61a6380d3dec324e84529b72deeb6bf2ae9b31323744956ab86e8d7bc0a41493c245c0ca0ad88cfea98bf6a97582645ff908de9a238ceb9c1415b68eadeb2f8ab10624f72c6559612ba7fc1323dfeb15bea4a857a0f56ec1353ced24deb1172eefe871e56575a0bc12c3d50b90bca175f125b9a3da0bf442cd46a68e06a86a547ffe5c17cfa11b977d968e4a02fbd41d07ff9e4d54d866965af5736f497b826c02f6d9d3e1e9cbd13fab1286ad5c4965502d99cf32622d97a200ac8f446cd0a477a938c0c13c9703a4dd57eecbcbc742fa1944608a93744ce7051996ee05a4239cfda769080fa6744df4ff541f1d08e784b07876778caeb692bb9e788673d9b17bf49fc5dac918d70377f1c6c587b8ba233cc12320a303b55b31d2b34a115e96a5eafc5da000152a60c3294c4817b3077df6cf4f3b60db39983e05f13e7c66e084105d287db7ba5328224be105f81cf482361c6d34632366b58484e8d25ec257da93ff08871708b6dd9ea121730964a1b8ca3e88d1063efb192853e840942130a0669a653da7d2df75522648aa574bd3a29257594a111c53b7421b60b088916063356ccf5d84fd6432eebe295c3552803800da55593b9f378fc8ffe76e2371bd072d3193c91b24adf9ec7b751630309762c578eec13a747e353128e64daa4a423933ef1e90a451973330c923cdfee5d7712d0ac9426173e69ed3e21c4b2cbc82d5fda3292b2d9a5799380030ab75cc9f823bcabdfd466e66a4f8ef611c1c7583d93470ed5c1d64217769222423cf278a34bffe5e1c513f0fcd84146f85880f415c520cab65967690184994116c5216fc10793b5c5c415896083570e317e7d7ddeb3719e333f36ca82805985976c9e4b50f355f9f194840ac79abd232f7d7d32f9a6efbedbc36b661bb782ecabbfd9ce877b745b38e77ce3e681d601763490bacf0a99d8c177aee097ed7eec233aea98077c7ac2b979e385d474805fab5aa88bcd8a964ecd4957841b07361c04408e03909bdb6cf698070725ba56209131b194cb54404694c68f6c36a071ecc559dc54e5b87c7c05264aa022c965107a3ae4cb2f0c72bd56eb113534f7590d4dcfb928264ebfa28f548becd638e42fdd4cd72429abde6d3bf20c95220a5c6a481da5ea48ed54da96b1e8577c332d98bc5a6b6d73267ca80bce40cd021d4447ae98300aa46b93c2d31a2d2246d8c45411993f7cf9215b7624817d8779a3c2db8328d10db2204bbc787500fdbc5ebc9bcd71e28038a7da15324eedd453fb6a54e921c908e3694405019695788ecca1f3b46b20bf381b859732ddd868edd1a7237ade96a05a5cf12e093438f1ef7f3b33b5cc7436835a6db765cbb14643b682b0ff9dcd4e4ef8dbf1af4097881b93880b6456dad962ab116944774b732b3f1c45a0520ab8514a0e5700cf36510c31584b061f1836b699c521ffdce1e99c0e89b5dcfea76c532f34f0f92d811440128a9bdfe03e2f4d24683d7fe8f183977ea8f2d944bf544358e0918041d55223dc07b43685381e118c6a3ba1a4fa713d1c2a4a3a97839c994f20c3013ebdddb59b65bb0011f6051f586c24eaf547bac67197cbfb47e939d5e9b7dcde3c5d4ea20b1f7c060741c76b732e4bda7ff60d96ed4821e2b971b86bba909b6939b71f8608eb662e62914c0d4b538c147a086beee2d3dafe979001300568cf821027573870356c330c6e036badeb53df3d357b97f1c7f9d7d370119e77913b12bcd79dd62c0785216292327e3a6880af7b6d7807929cd3342eba9283427020456e980d1d643f21d73522a0cb0ad4482931688409d813baeeb6ee34f654c2cf8cbe81eab8dfbae134ec60deb1b3ead5e5eecfc8cf8c804c49a988d5bffa77054d3b6fbe58bd941948de3e200e1fc316a70edbb85925d469c5e2897465d7c3e5c010646c36e09f1593e3f51735adc6bee6f9fa557169481a8695dbadd30c6f2dee99e6513c54376ede961d573c1f3cb16db9bb8185c3b908e91bb54be0225aa6d51efe24857de5891a7709bc9eee680c756461af9753bbfb475daf342e6ebcc6fb748536c58fd5b7dae3d2d8abdae2af7f8a116bdad5cb00d4a8215a349bd917ff1d450cae6d3b975f40630270d820fb983a30d602c66dad4f0c1cad0ec3e58a3315bfe59bba5018e46b956bbba8c77281aa25360bc431f499e549e8f928ba59527ac5cdcf39c07d3042e86e39d6a6ae8ef0f70a08d1fde3f7ec1bf6f66b9dad0cf8ae90428b8444168a90c0580156220318e5bf2e8b5e70e2bc6ece9cb04fa0bbfae26f607b804aa5736168509658c609c86a0cce70ae5daa08b14feab81e48c9bb3c59c1b0f62ddf690d91db364ea3286cf219e29f0f005579897d1bd9a8a1c97a41b800825c44be6c736fe3bd7047d0a2bf3124d921b7254bfb9d5993a440c0954d4c6ec53301b96e1735344e1c425a189ef90c7293dca0312772189f5c57ca07e950dd954a766d5779a191922e19966174075facb6308c5726174b9510075770f7915f3b06f658ce2a5c7b60d86ebd88574fc55cc1c02b4ac3b4320748eeea6132dca3dc6f5ac179fe71d6bec523be767cd55a9f31f6289966041c98313d957871d67fd236e24cb549ee258f7fe3171f1b09ce4b8f4d696fea15fcd087c75248bc919c76e974643797a90056c9b6398a340bacebab26a790fac76ceec942170938318fd9cc51d85817315db8580f5e34d1a00c1af6d05a5cf14e76f8e84477425ec910a3dac1e6c098c1f147c127e95b3f4bad2e01dec8c35931dce2c7bee53598b6bde7973071a0a6955d9cb9972566a80cec26f0e8ed81e7951a4efbb575ad6610a864e58422045f40d1f252564ec548b5546695e831bfa1fde8b6c5f919eeb6c8ac9e52753d0a6c678609984a35f7b19cad9d965d343a2b71f34dc84040834cc3d4e2fcce21788c995a6662684ed2a4be0e04f9acac09651a0754727b7dbd694d2a53536b13af58c89bc8f73397012d16edaf370a3bdcf4a5328e898a1626611c9f10af07b53c1deda04033e1b81101daadf8ff6df92ee534e5c8c3bbaa20b44253fabea55b28d22d2391346911816d0d8cc248a2140fbfcd8f2d0fe273d0e462acfff6244408d2c5b54e63afe35b07bf388cf2d7daa7fdc18785549b578d659486d0fb1a18d1809526af40485a1a19d2139346285d54edaf80860de4d4ccaf17529a48a69c4e4122edc0994dcfb1a90fc88ee511332d5337d4508933a67a95d0dd4a23250ba18c0c1235783de853b9011daf25daaafb7eb80b34e1f5a26cc4d3512b453fa11825a5bebc5a20d0910fe038ad381bcfdd14243566610fb1b5a3352cfa6b5be72c1704e45c9c956ee598be33456ae20458f125abc95b84b80240f89842a3138b5ccc9822bf3179799844872390fb597743cd1aa9d2b44d4759fd48e2d162ed7fb41c0bc62122f892364cd6b72927fc6061d4cf26958e1ce168a1919b6d894173dc8d85412268b0d379eba4528ce085e30955786f12d57962fe451c2d523d51cb9baca878322bb7e297b4bd87e43b7f6801cc12245a7bb8d7cfd9ac8ccc44795035eed38ad0ed080afb4c3c5485a52ee4f5e620ba11240addda1868e97c3bdcd8a83282330f2597b97030d425ff6092396afb002591b82fd07892c47c68bf3f62e4081783b7a4d67486693a735b34f2eee3b1746714ed4125aceacc82d19c9b343f54535b23619509c2cd0420c1cb025183376bac82afa30eea09ab0c9ed51a644b4ae5e5a863a63f7654adb046b295240b0e88616e53cf40aa602bb033d908a5444e5a8b78adc19930591c01946db369fc3f6850c874119197ed6d45624fb2a56890498be906d1ce405ab12ff4ac82ce1e23002c7a366128a2f758c59bb3d6bd306e7f4e8efbbd3d244b555c0a5192564390d69a9711fafb7b379ee72889f1f74cf58806bdfde655bc93d6b07831bf75cb4c71033198f2e8058f188a297a486a32835104968cf14f3d755d9bdecec0f94035c8679618a245f22d81a0461ad0e024054dbe3016f1fcf2a879ac891fd5106608ffbdcf3d11f45ccee091dda2cb13f2aa44f20f1ab83914b7b0aa2ba97b88d928a4b8cc0290f25af77e643422aae968415e4bce91a313487745c8d3c0505cef3be10c1f036a336c9eecdb3d4a6cc3d0e51cc8d0cd274f0e7242fe5f3139b383ff3f9515d9c97c000128f1522679070c725ee9fc00736a3c7441915bbe9c3c6ea7bc38e42b1d2d6f17717519c1b81961ffe69773e700549e494b90ff1e010340a9d813f2eb6df8887acda12fb90000e0e505db744670a3208f4c0e7e920f7ce35834657f4ab8c0184cab5bf9f0232a88ac0051e5798174988806eeea46858b5ed68cae539ea970199c98b3207671c4c270452761cfdc2c7119139629d19215776be4531642195195a6abfe50b50abe36bd26ac4e9b72536890598f4ccea5b5bb026c21ba3eef3f14875f10b37d783f7120bfae425dce01f2323a04515a6c9ee957f91dea4811d11b7f188ff5a272d89bc507bc2eee213e03917cd2c8c8fc27cf6ac5fc6c89dd8b629ece1f6a754feb15d595bf71bd6efc3947040427ae02fdada3d6579900ad5d668c16804ea9309ec56a54bd70502cd7a8a787833923604a3565d7b5fe2ff4e17e53cae04ec8f7a783b4fff7744826a42f38d87fc31c88239e828ea71d96cec115c0fd62a611daf325c5b310ee38c6d306358bfd6c1c6943b37aa6463083c843acf5a56c29e8ad8a2b92972d33d2ad507858986e49f9d4b578d2d02bfd5bdf320bb32fca19adcfdf3a1ceb49f3b1066b5af0165e8d449fe64a3e206270fbea7495ee99a4abc3eed2d591e4067a1a5a47655eadf13388bdf7305abf9385585130b1136a61b853b6e18118905c18629862ef04ce1f9139aeec31c2b763aacea6371067789a8f58c305fef29f4f6f8cdc789e5d7755120169e858363d8ea82ed17da2381a03ba9a4d94a8ec3bad452f278bfffb40a2879205aef144deaaebe4bcf2ca13d15911cc682f0a0cbe43c023f742dad5ea478ab83d98aeb6ec983b57c0011f22db7a8cb99f2782e7d055ec5ee8288f62d240627c95521277bfe3d2e121ceb296baed42a2fbc8819e343492a39730a110977e7d1d8054f6fad40ed6dac8c31eddda1205b087243335b323b969591237811282f7e83e6639672f9ad9fc553c37d93d946de542851b058b3020664141533e76557d75ca8fc5b0ef810ec596079e81d1460f3091bbda7a7c1efa3aed6003185ca144617f87e3a7ede9f743e6e977786f6fe53b4fea9a3619261d783f946a13c3fb9114856aa06f18b8c3be73ed7e2866370ab06f7979a58c16f7af20ed76d2d6f91b0af738cc5264d6f2c6a786aafc1c01d598bb8fa84f6a7e454d0348b8bcd41f3ae1f7b028337faf664209272fc7ec0611a8172dcc269acd9f607e26acfa24ff16d8e772dfda4283a63a73a372ef55226ad58d19144a526ecbc8419646485e042106076b482d87c9648963d2368ade1b834caa97552b417043cb900136df1c242e3f7eb56d79ebaf56bdeb6e235090f971905b7f2e182548929e025697e2edb295f3bc57b63a16f9efa707c277dccbe9ba94087596c46f533dbbd05ce3a6d605f37f1d3358776ffa50d7228d4a5237d2ed02d77a834fcfa7fc44c1102aad4e244a6cf26724aeb15dda5981cf8177623f249b8b763ba4edad621d119c4b017ada842f58708e25a503f6a3b75858eda21f429f7aa0d80f9444ec0bf5ab0cac03d0c682caa3257748598db2963fb767ee8393d7c5f631bbd4b858b236b4ce4599c576b9d8801cc9dff2af3ee5d67be05e4a5137c263b04d64f6278490f802c202f70230305157835e2d6174702ea87ecc213b267e7070ca091e77e6726d5951d6937555e6f6ff3bb8c59c9f73ce990712a59949a5071e4b9b07a42e674ae95cb0544f6722bdc59c1e8e471d4986c04cced04526e48825672ccb4430a78fffff4d2ebe953f97b541d6065a98a7aaaaaaaaed8ffaaaae1106d0e6eb05aa295befc88f891210a6745865536c5cac54244229692549abb2964c2477944a301972b960cdb411c2216c8a563645f5c99868533389a46555d814b635eae3ff3f972e83e0eaad3f9a6be0040fae9a96872786232aa3a3af1ac618bfb428cd7c717a8084bad60e4d702bca7ab2ae555b582d0d8d20451897f91ad2605eee91f9d329019cf1d8da8367b0bbbb3dd1bec88a61e179c191fa6c01ecf88211c312e300ab0cc74156db5b51d693751dfbd1fdf021d5c2939c2140d61b74621372a222a25122e1c2ebe3c6a6a6f6bbbbbb3ba010629cfea829943526f115326b5dd30865d5b2a2ac27ebfab076002a143a70eb122f898b369b6dc5995c318b5043c9169d5bd489546fac0a9bc2b2972003ab13461ea28c32ae13c8140d63580153dddd352bca7ab2aeed29b5b505c4465c3f13292ea09e8fe3865b7777d48aa42e2b63570dae271ab8da08a9c4058e4b77b7cb6229182d3696dc9278dceec32e5ab66c5ddbffbb2af84ed830fd9284c0d29a5e52841d2fe5ad47940f175dd45392f4c678ac7954ddeef64c8110774337f6ffb18e28cd44263d60298b584b9c333fb843b537e79d4bce39b6d6387d0504f3ce30012e3039f4aa0ce994450301de8ab29eac2b0f2de608012128bbaaa1a94645950c4de4d443b49112e0032a9d4bb76b8ac061bb9935c3929715653d5957fc12d6c7ffff9e77e57fa744f0007d88ab592308930ddf970d163234323864f87f14c39c7d5a5c162e276fd99aa41bcc38b6c0a2cd669b494da72041e0180faebbdb4ddf0c052676400b30785cb07462109da8ce14c12dafeeee0f3d1dc61b5a93b6ff33862494663e19ad368861eb1f72b1f2e7bc588c802220b960ed9011290a6a1933b8009821769ab090d8de7f96ccb53bac509ab9d5e56187d82c67360d4d76dddd6d18aa4c69a6fabf10d562fbff4c4294660e3308a662ce6fc953b2f7df4ca621b6a47a6b8d6cb8f16289dd97354f0e8ec063d0e45804b3a2ac27ebca7b9b73ce594594661e91496587aca5ad8396eea58fffff3860702bbf0e1b2d8b8cd40c59fa4b793897125d379272c920998f1b215217f15694f5645d77217cb6a6b6e4a5bbbbc99029cd549f32fd60e175bfacf8733ea91411e3f0ff8150261ac4feff0dc00986d588592e07dd750c09142f70090d21239a351853b06c77f7900fa5993f6088a160568f6aae45edbe6aa4436966cff7fb6004bc0ac618639c5bbabbd95a46a1f63be3ee6e2b94666ee10e325d286ce35815368565310c4ecdb1350cb41a5be3bbb229dffd4a5ab56555d81496c5ed77523d9f6d5d328258b2c26b7ef9ffe70280e9f6ec51eeb8c4136d58fdffcbb91473d3b7b19aff1fcb86d24c5d4f032cdf8f76769e865c923bd2610fb2fb6079fbf8ff0f2534b4f2b7b8d6ddad944c69a69abee4803cb37703c09b84ec171b390caf16c22ba89996a797946606cf30ee8131c637cabe59368ead71748dd36b1c5fe3fc1a0728ecf7ee09fc727158f7d41dc7b52a97aed89d7b61cf20dd7ad2cbba36f310b6a42d8ec8e7f032e7bf55f3ff2be9509ad9f3fd3c5002fe3f6f841a5b6245239c747c332335f5cffdff3d6c28cdd4f57cbf103d805db37a8b31c61877dbf296addd880132ba8e242ec618d718a234b378442695226a2c557c9382e2c17b51067892b62bca7ab2aebc921b43160c94d01325b613b2947104caf7bb3141614609163bac5e7e3ace760ad8fbea1b3b4598c7aab0292c5b03005e77378ec40b39dc4995245b7c97430a9cab1897c5fdeeee6ea916dd4a37c61d6731631fbe106be707a29e9a33bb73e6f1ed8992b1f4f1ff9f461289e4089b9e8eb6d7474b12a511bba99c730e16519a794426952182cb1aa7deeec52da705590b8104494f46ab7bf06efd3d4f91c32c901b784f8b218e9a8c68a05c0cd13a8f3b7eb83a154c62329634f4248f43ad087684305ce398f0f471146488cd022bc8f811923b2292c3e3a846850efbff6f3184d24ce1f0438be2ff322b9ab44769113c76e1fcffc16a5cdc92654a33d5d95bb25c4f36e89eeabc227470569fab730855da6cb69a99596c912872dd66deff77e8c043aaeb5f1e6753532f898a2bc8c66206f9b1e85249810848d68b209e196228fa884ecc540437f0d2d5e9e888712372bb3efeff5f97338e8cad29221a6c36ba860d163d97a5006ecc38ba526c94f08731cf3d41f410b6d8a4694811efc61e308dfc5a862472445a384ee494d0f755c345219b825d5cd50659dc11917839a71042af8e28cd4482b84afe38ae942b3760e5baf45dced852300f0613cd6870bb181508993671ec97ec7e79250930206408955717d111e70c4eb930f2faffaa224a338f1eaa9039dc345ce668055f1ebeb12a6c0acb0a91f4b4d7dad16f7a8325af407a5891347700cdaaa189d1825a6e93156528cdc4b52f4e4f0816406d8117071a8c31c638aa09001a7528aba5458f251c48bd4444aa5154342d3ad478a4fd7f18d44be97be9eec6f86d0b3f2576ba96c8ae545c8105d970c09df8cd7a5cb09afbff9584509a5994f464eca0648577aaaaaaaa8a337bdf5a95daff1f86446966324cb9862d51c46cac984e45ac57b3402522449e488f9501820792373d2db723c1125a472d406ee648ea5815368565956adb4ef0eed4d0b8015b21c319b60454b26abfbbbb7b92509af96414d16385c2b6dd3e3b2990a2ce8ab29eac6b1490b21cd54562e66c81a7d301f3824caba8c914d21b3143c0d6d4955113d412a8e753c4cb811398b2b46010f278f05801416163fe08fe3fcf645194c143bedc691221bbe15b427edd30b6d2afd8c7477d39c77004df6e47621cb16952ca51559574238a2498d24cf56f4dafa4f9012a996b915d581536856571cbaab029ecdb4c5d6663d1c7ffff1cb61c22872e6723e4520c1d442f1518bc69acdc7835e49d36ec9e2716d030a88fffff01ef8fcecc06d23d4368853c3e4470158cbb0257e002a6c88b5b8fedc724e34176cd7a39d7c7ffffa82572e5ffdbffff3bf5509ae9fb013308a7a0caff12e0e4c379f14ceec9399b90455ecbaab029acfae69cb38f10a59943b5b81e51902c083e49959a8bae2ca6254b6e68d316f5e043974b956a50ef58153685655b75c74077edbcf08562c44c52d4901f27b058b28bc2b12a6c0acbe217dd993986b86555d814961debd66505807a594f742bca7ab29a6bdb8404d4ddad43820bb025b29b2043390da51563657adf740b57c3d5fad121ca41e4f6c562654a33d5decdff5fc48d62ce3fbefdbf4c12a5994a0f64966f115343195239bcd8755dbabbdd54f9b7c45bb0375bc21155228eea85ffffff15302436214a3387c52332790f6cca9fe4869f7ae07e1cd0bcf58aff8c4ca78fffffc5b0b295ffdd4035030fd44c6f85f24d81f5758e7530b662d724fd09d6201fe3a2635a35e6fc254df00e05feae0257316163238af8308a0103ceab86fa529aa97eb744db59dbc7ff7f61cea80957336e37398ad408eaa7e12e9733054d3e2762f070a167c609d70425263c7182f39bf5b8bcb5d4f8432cd5b5efb74f27889baf1baf28ebc9bace786b075e60415c42e38e19352a88cbb3bb73a8cb8b0b7c90a674c4909161a49b8080b93881bf9b09d9ef37c36abf33eeeefe4262115fc995ac8acc07b79393d14cfd55d653dec0dadb060e54b5fdff1fb72c0df81e9596924f3227118d12274a4b48079f8527231f1c28ca48109934f460d0c1579ffbff91921ae9a9918c8d64d5485b8dd4d548628d54968998ec54555555754bdda563099408c20092540449662868464cc786d5ddff3f0a08a5994220a28a5694af92165e50f514b946388854a72ea6c80cfa04b595ba6ef75b53fb9d7177b71630a599eadbeeee96b7cfee99931cc298d8e8b101b4aa6deb1a65a4ca5bce2df43ae59c734e12a599ca10394b9baee7fbff16530a08885b1c331bb639e79c5f21946616059020a8946ddee6c40079131a68040d0371248cd31863001400070c6a94b4787808311687c5c1a0480c0484026130180c040040a140182c0a82d068aeaad17800a9362d9b755087dcf8d252e1468564365bc5a23186ea284aae53a43daa469d13895e5178dc5b2b30f6db8c5b8ee015ec4a8f461befdb5090b46549080152a5f5c6c1719314fdc262e01b2f7cb846499bac1e5a5c8b5520cd8497002e3e611b62c8d6356057eee490bdaea48a573a2d93e28830caef4f278d631235b561e51fce0ed32674e53f5140a552cb7c0d081c6388e0e53a5effafcadb1e9bb7b2e6da0865e6d8d3fa48fdd8523785e51f71ea1a27128cee1c5d7b313a04ba1da2b55f9be41aedc5ca165f290751cf0590cd0d4fda27e79761ae35b87b26687011cf31c28ad9d213cb6344da3e3f74b2b3537c3c235bd069f7683ed20d21d4b088ed678cb5fa2a8b5490f1b7bf61818323e03ed030f223019ad1775bb4d2eb1c7b0de8168040063925f1d163b92332dc60a11e8fa243ab93c61fa4c3ddd46864a2d2308e8fc72fba05207a5cff261d3ce57fd7f153a8add024690786bf3c69bd9e960280f148bfdd347b2c4e8917a4c69317fbdbe47b65fe1897ca90aaf0343c7295c6066ae25db25a775eb1efc34f746a1c8bcbd876ca1a2cda61554b1aa040360a9311f60f9eb859eb6db7cc115a2a1a8a6941cbebcaf6f168f51d1ad31f04589a44a940b87979d0107e60ec29246a8ccc420d8fcb4e3ea5c9ad027bd880c3948e6b7159b4a8a37f4cd55e4911a95427b5d31f4d2e256e27bced380dd8d246cc8829b585e8f429a07f12dd81c90e4aef2cc53877cd856996c1478ea4231f03dbb9cde6d8de7297ec59b50b45e032049ebd53d24e41279dbfbc974d67b9938564044581bd86a8ef7d6cdc08a29870510420372809173a9fafcedcec4568d34eab4f895b5024e18176a716b453bba8d17c4aa98641e0ade052f9272f7b879a028af2df79c3a056ba73b0dcc0ab1dbfbb3ecf2a45e574a9214208b332241ef642a9b3a700c8f059c4882a07b51c53c0c4c948530ddf491f68f199e39d885c90506d27e3097393314eaf300cd5dc2bdd5d2f3e57a48999a80f83cbf9c362786b75587cc2c110b6df4957d4e698db840b57f3990871489c67d1bb9709db69cb1d53706044b9c4beb1b1adb6a704c44f90b01ba8672f30afb5ce0a199edd47bcb8e111e93344e453b4d2244f262a824b6193cf528a7639103ac8b8f2a9bf48c2343523120f50b2cd953e8adc09dcbbc14975bd51999a584ada2ca8feb61edad30207495f2dceb01a900e462e6039dc910c907c662c6d15f58cd2e8df6e596b650c42f533dd0d81d1c710855ed25db4128e89420b34545bcd5aa3e8d1c07cf9370547599d25c9fc3535068d70d49bf3178596ab1957e640d3c1c9ec30ab08cf814acf3bb05ca64ff945703c097977487372036f25de21d993cf004ee36e30c75fe07c8e237a9a01dbb35788df885ddc18fa956f48bfe02d9850367135038276ad7ac5cfdd5aeaa97facc69751b681d13c3fcf0f0452f8018b861cc8eb837bdb995d8d04681627cc7ad38588b3024e671d9ad1941ac2b52ff4a94ff9ec9119c77e26f4f16b2da84947bae7c04807e6d7896a4eb000169b8967d635e87bccbb421fdf28d726084833494e7f3dd1f6aa5243fb3ac63ed839d08a4bcdc162b3595e9d5ebf4459d602799f8bfbd5586690b47ed354eab043c80b429f3b4ca1c0e42edb66179c066fac66bde8536217815d0c77fee1a07f688191d7f3b54a0584cb0b21db23e415fe7ad635084a5e405de7c966d880a6746f69be38a57145cbc3f38f131b5b21e5bdf0498a9e2bb907d5aa73183bbd5e33089b4311958b675a65fc285b577710993c27a5231644a4e96ae90a487ee4b5f25548fd8b6d66f546e5ebf31b5b22d90630e8e9505e9479a09a0b589aeb9267946fb14fe12e4b5bf927e8662b339ca794bcebe7924a432b6b215078fc811dd261095648c9f765445061abd52791a68bd1ae7496b0272b2185476bc1989a6dba82cd1e6595ba632c3c2539e2cc4490fddc1983701b68a2790f7ff8a7b6f3504497669a34a6b5df26ac7103b1be2d273be43d06cfe8503da2511ac3b9093abf2e5a23c034eb8629158e83605bf704cea275cba29d285a1868e5d6848115adca25851956892766d702a8f8df05f238a80c2a402072804596d9116cd5da5f2fe3f834001ac6bb2609735f829a9729c75aace0d836b8065dbf5c8df4e036076bdbc0eec5596eb839aa9f283ab945c837d4e89aec18423f40e74d8cf50c31ff70db8457a528c77a3e540551713c65e776e3272224a12720a9b9e434ddd663f81bf7a6ee289d5fc5c00297698a96aba2e380fea4cb7fcbfc438db3b037c9112df4f081eff2c5bf86c1c8ca5e279d4970ce10ac5b53260a9c2fefd849d37021d84db480268086fe18e2e5b029c72a3852341224da2635397b4231b8fbd5efb58bf18e9920bae9463a4980e06a20cf274249c6005bbcfe7ce8dd18c24732cdb4ac1bf83d11b657c55bf551d7b85cc81352d7a7c53e89bb842e069f8b2c124a6af601f9b69bcef5e6740a0ce981c6c7714b376ac1ed6ca411b2609a0d4efddf50162a9a18c4213803c0ed22e26c04dce7b9032a2229a2c083b04df26a7f4c657e471792b80fb7e08dcdd5298ea718e1805344b41e197f95e6edea21c20a06b24c5f28922d3d784a3db550c565354db5df30631d0935751bcf76da87e0e9a011f121f4da51412404c9d533ea8f1b47c2a766ba97b8751079d3abc46d9e1afb396038767c27d5737cd76cfd19027c2517ace2a75d1f2d7da2387c4a568d9c5904311c9fef21808ab53b5830728ccff0c1a15829d66e8dc39a93d514b76b89e25e9d555cb043cb9d3a0e67a77c8ef637ae9e59c1be788c702cc609d62950454a5d9c578b09ceda25e6bf646822edea84c8e59816c400a69df0178f8bda50a373bfb87b442a100764cf27fa86762ddb6f1c5aa225543fb481039a155063cef8bb3ff2e592becc16f12b8f93d10ca7bd85a644beaf8ce26b7b20a3ca57a6780188e2f69f9d7eab8449aa11e447e81c35a2a2c7771cdb03c1d4f793c81db60088efa7525a972757d5d2eb1776feba731f8830be46903f5f1411464cfc60e10d96c79d2503bd6befe426afa55f50d91c298ecb41f2cc0f06dd7fb4a868b05a8a9ef77b074e8fba84274b104ce035f24e70b17b13a5dddc4b3ae4afb24ae106e84657b1ff6c49fa936154f1752f996f6ea52be089cb271a71c6f783c5997e91a0552fac57f96413a7df75af1f4f8a66abe2e4135ccbc3d8d8d6fca963f9f533e50307e01cc56d5bdf4feacc7a481144a30d3c7c55c6ab2a5c9ac38d13b0cb04ecc556f816d52db834b498546e7824764d532fc61e67023e4d178d2707147b0092326e06550ccb01985b2a541513973be2ddf77c2c98099f8990cf5b973b5286c9544566989fb38bc5247f2d5a1236d6beb0cb0f494e67b19d4dac0e73700df4781b55eaba76e47bf70066d446295b25417f50d0814e4b3530c7024fddb0944d737fced13c0d7468f2a1cae92ba079f3a212f1c0875d95c9f86399f8bc530c36c8a3da191668369fd1b569cb210f73b09820cf233bbe24d37d370caad446009b2e668b8ebf147e6fee3cac7025d0a2ead12c4e9e4d048658313f79ad5a630264c542096ffffcafc920a94d3ded10ef4a19a576f6e80444ec71712de5894aaf9d467b4a712365766e2347beb00c4b98017a2fd4955a3ab7285639dd392b77110c9c1c1b2d12b20a6db882c00473798ffe2d7b3ab67acdf9581ac9484a5000817f0b57a48b9ece8473f75d62ed4be91653391c90280e4be7b125992693464a0a244222174232851f3db684db69d822b1b8c75f36af99cd6babc646e9796a2a2e1551f9862c5df57abbcc8b6873a900b24ce7abea3c9078941bc4807f073d624a9514c8b2146fb8ed92221633ea1b5444cd927035792ae8e2c22a206cac941f7da4616aa0e32cb533bcfc704b421a5a676a2e93b0505c95b550d4c544e00267dbb6f72c08576e2350e1f469f3e98483749111862081de8772d4b56e7a49e96a234abe8eeea3e116b5c24746bdaef6b7d3493275a86ddaff53e254618fb4a19fb07b06e30ae735850e508df75c9f19de0ef29821309f3215956c124129bf0e4098b807229ce8086074b272accd3281655a57a501733a1da0399981da2ec635447792f9e548724a19f09c3fdbb2b78e747385b38d78a995c203d80254b4994420fdd4e01a32d812921ecc8b9c7d183ddad7d23d1f49477977a961f6ed52ee658fc49db2bead3b00d4445d8cb97b6af667936aac950647d04f7dec399d5bb2afa1d386b5c29a41583892242fac073acee0c7740470225faea9d56a87c6215b60c2c7ca9734afe6bf501ef2b16a25b8c64276475862d9a795aa5e5e334442f9a253d1aa5a930b88a83970585559b7ee75ca8a2fe119d85d7b8249c9ca40a079b1b873568e1b5551ca752b629be3e06ff7eb0faa4b490e11f169d15fc97c4dfa13f10fa031ae24e8080137e5b3690ed6ab8a7ecf87c7577fc2d8ad055c8214e103cc8920ec43fadb5e332b4e05261adaa0a2413b37b1ff24c2b81ef63b9bdad754cd1737d28904bb5670779d624f5bc1068cd0801e6001b8f0306d27a5957f15f60d1f3b443ec1b2d9802710178009518133e01a4fa23257e2302ff1ddff9750f6fc024a837c6af43b46a17aecf7bcc0a5d980bf7e91c36b631cab928e7652a3e5395289179e82399b02c978398c4e4796c2efa5a6cf4fd704ede56334970e33d447d6146bdbcdfeef36d319c0d40d3cadfe267a4bc688acbc30c9fc52689aaf22b132504da6328d3d259c692c8614c6f114c2136c651b2849ed57681cbce5d7ec868975d13f3b22e2bcb18c369a150158f43c588f848518a1c3503f525491444e881a8696f16b519af71ccdd9780c76e973e452fa293057a143030a0b4e6bd895823cf05a6dc82cb945740fa2e2e85dd61fcea1f0fa746c15674086a9839964f7382b9a0ffe83fa03816808fe035a21d6a7ca3675d7b1bb7c16eadd24b159d2d42ac8cfdc552389d1980bfda9ecf64ea08426a51851b7d24f05511f813af01fb2d15ec806d423e72ed88249a22b5c3428e0e51b9d1d6b3b180430513c2b90157403a533edc59300a243854217afd93138c291a9d91c861a66597f1c0a75708ce831bfe516e8a23f9eead92a0086d518d7da90b5e096652efffb956a443fa022a07dfd5aca652255b4bbfa4d6e7bb38778a0ecf9441718c9fd6e352c12b38112bb9575bfd5bafbfcc2bee0b8d36cbdaf4d8a279fb2f2c4688d7900602553a9d939afb7bded4c3c37a5d2fb7bd02ea964bd9a69a5c263234759936adf5f51f07cd2cdaeb75dd5ff76b4902adfc34dfa2ba87d1eb5bf0bb7d3aa9ea8308dc0156b5ee68c85c67cb39352aa13391e126a2308ca6a4d75e5110b0e9ae17cb0c50de55f41dc61f0cd5ca6e79715841d7bc10692cd9881858bc51c94e9229bf1992361e2e2bf02015ba3a9b1cb2f04f2ec93a44956c4af931d28f597f0c6ca20278ea4d5888d53971a147aea2cfa9aba84a0e82fed663cc3f65ee777e3e125eddc757ae872a6b7dc2560d07201882badc1fd2affe4b7775ef80d45ff2feb7cb12a9121ddd54807c1587bea92c8ec3bb40d154828071b6e417fbd5511957577aacf68db03863d4776bac2cafffeb84b7b9182131aabddc536355432bcf0f696a9aa126619489e1c2f837e56090a568740e2d036e1ad58ddc669f3eaeb25d781b0ca4a2309e5ffb034be64faccff6797b8a4fc845ba4f183033f1ab983220670ffc2231999ae83ffadb834c048dbb4d7fa5ccc3bd941084927cabb0c7ae5e10f7fdcd441232723b42a53c91c716cfd60bd1371d858f58b717353649911cd818916db570b2c071169ebb7653c9c590d438783eaab595ea2702f0ce7b618fb342fd2e44324ab75a30a4e6d5d41dd8d926328e96f99d871e4a368dbdd0b747bb8532b48be47f39a153c69b843532a8e93d7af5d643312d8e5b5a0c4a25f42219acb58f2a70185476e6e08384c5c6f49b77819579789c11ad80cc72568b6c9e9ca2dce874dabd6bba4de1b94886a49fec7cc5493534bee914bb968949d4e9831174104147cb09ecb22bc02aa12f5f38d0b5f26f0053046901c43f244c279943ba89b11e1f1c79b935d56d06f6bef29bb9aceaebb31884f5044cf3a013a91e663af156b02a26eb6f83c8cfabb0ba9646523a610d6fc98009973a394195fe11da460de87f866fe5573402d801d4f263ff9965a7280e28bbac1fb3a91532b116666f1014580a361bcd554368c3ca907f8255487d14c049ee329f36d1c965f0fb871c65390ce44bb2842a5678922df7aadef656b933226b0e5f49f1a87934e662483344f5b90192273be59a78d50521104002e0bb4d70665d566e48f7448cc15fea67bc89905dd64d560c9edc3772d7fd0fe79f04e1e16e153b4c198788d4958a48c5bf6907e77553abddebc4d936111042d296b4a8cc2094514829e441437056cd6627d8e24d3402595c750e0d6bdaccf61142b9eb40d792fc1263427c75c4804ff7a085386eb563553020d5a2d91f2b938c451d0e1e46a5e477f6fdf6230c4eafbddeb1e129692601de45a6c59a2902133e5f6a230745579e1ee33275b7949954beb877d6213b8f9e936bb6029697b62096eca3b90903a67767f7171721fad61db7398a629fc90e9e847224950390feb0d01424edb4a4e35b638e838aa595cb525d25225e5b021ec60f55019655ea536c72983be55d13bd4e96587c7ed40f3b4f505f0768d27f3233e3826a779b6da96ea128905ab30ae2dd9a9274f0d2b6d99e1d25bba5b08dce4414451e17b3fa4c6859ba8c4afc647dbedc69b6fc8b76d45f0224eba4fd5c40dba0b542bf719df330757f504b21a1aad7f1d401e2a5f83d2c6d2def10155855e5956be4409a483234b7c34f32756ffc36f090c50992fe760a384fe8b8b759e16c0e65b8ce2469aad7cc75aa3126b186eb7be7f494dac0d612e66872435f5ae50ab6971f21e6e8e22a4029135a61b7984c9f5f7c4e18a0410c3badf31e95fac7cfa3d154312c3a4682813c11462febbe9dab5402b434a4f05e49f052ff85a0d4f45bb7192106f45466f5b20c3c70847587331ac70b6d0f4bb56230fa6e66c50038cfb4624fac635162f6fb87cc1cec3726c00722b670a1efea68938df478446285c70505ffceb73aa508ecd914b96c4918556a269d38f495a8251b2b0be5adb91bfec46f849b060967363139e2d45f127b22b0f8439cea55ae51766bb3b92cfca3f4180bc8a1ef7f548bd86c4cc348b8544cb3db6ee5cffaf1929356d9288cb80407e847082711ea1d233184ae64a78a6a46ae59a4510ca760ab19d7d4e0ca3059ec005c0e864e5589b654150b015d2d314b519eafcc0b80c768df4e54836a95ea3ba878b035b0a05ac8826c5306e3659bd8126f5a261dae5b3851472b3cb8e118dab83603a556232584de2ab5d5cfac6d967120e469e0a249c2a84e7c2aa22391db067a3a275dc2a092b81d30f0fdcbc34faaf08bda5adca3346ec6454a80d366e899c2f7cadb8f4033ef6801f4ce7505fb9f5e9297932d4b73ff34b69074d344473edea2d1c4925f5c2b53c8436839466313c99b431c4a191275219dcca464842fd4a8352f4bc28ca6816e5564428a218d1396eb5f4fb77fd978bb38af36fb6e95a205e34cd60cfdc31d8d3139427e3707d7c278e09dc9b8a779e465269b1a008776d0858f259f86cb188578370b958c4bb8b76a169daeffc32533e6dd1c2de30d379e0bfb66a448b0f3060859cf1e061ee028af35bf19db4166d67846564c600ee1b32ed8ce2f2804d5646aad46f6f8777af521c4dd6a0bb77abcdb88c74ed3e9aa987517d220108b1a922ebe9bdd0598967c5d22003d678dfb92172a40a02c641e9346e75e2312cd96e7ac7691062d74ed5b2011007f14b9d6efae4e95b3ac039efac873f07191ce29a3a77aac664ae8246c66268b102f78c60330563d7a56c026214a8af6f2dab6207bcfa4f7edba740107d51fc2eb52afa264c2ddfe1827d1a1d7748cb4445b2f45b4bf953239bf7e60864399f74f5d24c1561c1176b8b564bfe086fe44fe158da0ec3a66ebcda0345bf73b5dc84a4698bc1c3b5bf5181f49cf3c818972d1d5b58802a4b7314b83be9d99ec89bb4015c386d96e87e99b3ced7eee25b9a7a22986e0843d77aef9caca912b5d0c88f55061380ea1529cdf84a222eff2e5864596c8cd9124646384f0cff8ce257aa2eee2dea3c3845c968e7b1c794963ab7e0908141a0d262886a99bb5fb9cc2ecd67c5574ffb4e7cef3e257c8aacc503f343ca9f02380b6e2726d982d1591818417dfa0ecca45fde0ed31a94b84e858415e52e22f5b9766a6daa8ec656da88c25c5c79700a6b9a107647fbfc45bd95232a2bdf60db1fb6bdf309bdb0ccccad1f11efb5dc1711d7cc3edc0caf0ca1909cc8283cf2a0042aec2a386cf7460c95d20944ab34213b702d777f31df7d266c3b12e63de1627802154a13eca949db37729d8d5ea9638b3e2706bcfdc5f20f2f822940ccc657083040464a9f93aba30924406880913b6f50cc7c28ca331d8d1d02f0e1def8a485517c0419fc11c39e23914fad2699e57923472d7145fd0f06afc16b379d8bb8a69cd0273254d470cf70030ce3fa02f1baa7213f2c34953515ac2e0ec98348f36fca03d91e8697cfd74614cfccd74c7e4798cb3d28bfc961136e2ac71ea2aebacb81bbb0829a0c07f672be14b67c03d8d9f31f0e2f079bc71de86b8b96a0d04e057fda6d35a7bdb49db820fd89817a7a9a28a5521eaa2d59858b96cb65a380b589ad04836f715661cd76a7eb5fa6c9f6d0a2d59634a960fc11538d24812af0cd6afc0d4b093f1801b6d001c24ce443e21590c524d303000805b45bdbb0e03447da1360ac21ad213a6027bc06c3e10587b4e26967b33564b96b530a58e6a5a8051ca179fbb5547e2e57a0d43287cd018565b6b75ee05ae07b8016948de2c4ca919a920991e025149b093a8c2fdc9ff78c7cc9406c25da988d7193b2bbe45cd379fed3a6ca7c322b05e4bbe017f1f2fdd3b2dff9d641e99a3d566d6134550196467e4326a20f8d1b090b8009c3633d80e776b2179d52854d461e1a8929d1e5096dc8743cdd1cfe7ca31ae14ad046ca127e58a3097e81c1dc164bf8e17d4829cd8de665a551a0b1de6c4d5e094ea71ee568863068de987841de2327e4b70d7b87d846fc1e05d1939bca72c93146344659f71332aa2166e1ff3417077cb28429b10d1c22da1a2ffe7c673ce6ce8fa1e66f22b1e28fbe63a915a507b095a8aab9bd16244cd369d39451dbb5db4145a583f48c2d2a7365424c4e77ad4999163905a029b4ae74f9a8720f310a7d4012a44aec6af7f92c71f53f5e9a9d92bb8329157068338468af607b2e87c5e3a455459dc62ecd7a00fc3a18cfc04b5e46c352bd863720b26a9369ca080274574e2766041555b8cc21515907e700c78a89e0f619a757e999b034773ba04951e3f7b70ddb668d91c8c0698815e16abb03d03ca9813aabf069f6ea2a1583eb4ef5288d43257e704ae86f80404db7822f605e894c5997382d6adf78ad1d86fec29589e76e887142ca7caf53df09fd1390b84365b0ba89bebaa1aca0fc5510538954961b137296bcfa152db73535223a74a4ebbf9d25eb30c726e450229ec2bf5a7d06026856c6281c0a62e534a486ea8f80fd2ccf5356a8e50f54fd2677db304d5220fbfcd29548d41b91a9971e84594ee5bef6577bec7127915eb0d24ac0c82b0d207e565d5b130d4bf2f1b50230b381934c79ef5cea9f8ec62c7344b17c91b3fbbf0f85753f70ebdd44d7629623304549ba870cb87bac1b9343d114855e38c4d9ada3d145541990aeb857eab77e2f70e400ff1a8bb12a429b3647749339e20a044d26bd685974d10be43e38266dc96e9c543670040e9443eda9b180d4a8a7d95f7d05ead92a4ac3d23723de7658e57e3d5693a945dac2d5962852c65fe9eb597ea9b06b3395f5d1132bc756c03a1b5da16d1e87705053bd9ce85a9d73412ee9aab365298c5cc7b0dc456282424934ed9746e084c088c62ce9467c5b0b06338b6dd9215b763372b481fafbabba955234d57fb24d9e93bd9e06afca8855a6b057f998b3e58f3d5902dd95cca4b81591a7bd3c8ce56b2915d27dcd51679cf75d43925efb841a040bf357f0d0cc86abcafe2456937483f7d5b58ddd0dac538fa3fe2342ae65669f760a288f9f523bbfd1e24dbc76b196aa82164a287a63a2970b881454a346aaa0dec14f963cc01bf266e801828d44584e73d3b94320fcaa79691c947539aca8a24bf6d9c9c693876e5f9cf7cc807051bb4d4c21b53bd5da722bf7f58a36b964d03786e4f165e04faf96b68a74e0f09a628f297cd9c348275c32d1dfe014aedbd76714faef4d670835d13d71bc14a868a5249d5c94c8f9a698afdca73b3a0b8808c4ed165f9a5552a9774963112457136bc5be16f2c70510dacccbe8a8dae3b917518f6af4a772d573e18b947a8af60a601823eb85ca0d83d429d7ef7cd186b6f555203a9729c067e422178ac293c12158962c6c03842f021ac12960562090d1930e50943f6b202ede345de177ed4ed3b36f485cc931ca5eb7bb0efe1be5bfa857a41381c089f7c31ab085328e55aaff6455cd76bdf74cec0ad2a706c47222ff2aaa7de08e034f88fdb6c9265b4a29a59452060f064f05e8056fe9929f4ff23cb951a8526506cdb77ea32d50a8e2350d30dfd61da62ebc4e6eb2a432f6d8715dc1376b49e5eba796c7d66bcfadaed88e55d08d22ac42d349a0c736271980c342bbea6cad5334dfac3fef37eb37fdeb60db21ea53fca9befb767e4c807dfa1011ccc62113037aede8fa0875db05e091c8f49f3a6680e9c8fa10127c18e2c310128c48301f307d82286c1c8eeed8b4b3761405c2911d7958a2322a53b59487274e4960c4a06f735d8ad7a4d2086b243e3b0ce86bff94e8db98f08baaa331e85f578200d37ba309f37712d276eb49d5f1f873c276eb2e36055d40a03abee3766fbe0c76bbddf62bc6a027d0d7fee3f9f5f99e6f9f3fde68c2f6ebb5ea288c18291ee79194c18cbf30e6d66ef7495777dd5eaf1e23e98e3f4a736b0783578192086b6b558cf17d0d773a9fafa3752c924915063d12104186e973249201a62318d62740ffdb19323d86b5adb5adddee2b1d79b0c9a0153fcd39270913ac3e4511767392f0ed38518281528abf5efdc784f9b583bd734ad5ed18e38e247debdfce6ece4942f50e6e9500d46f55013c6ab09b9384e954ed2f65e1ef18c3c4d7516b521b7c2c4c9f63d57427a4d2d26eb77bd2a25d8f419fc4fea3a4a9ff589faf02d3579faf441f8fa41d2140abbd38574defaedbbba1edbb51706e551d7a77ea2675e10d476ce709c9b945e2276047d269cfdcc20ea356af7834c13a75183a9f9f801d61d09fec30ee6e97f4934713b05787f143fdb6dbed7e97f809e01146dded766fc71feab8dd6ef7e16eb7fb3a9223d8ed76afa34ffed011c9d365afab4f479d12fd3b924c33fec77a0c134f3da9baf730ee6eb75b7bdd8f1d91ee6e8e2aa04e794cb79a3e7d822e9474da6eb77b3a6a65ea79a14a7053880b7bc2f0525532bc33be513c69664aa03ca7f9d9c0565a6b6dc38dbe23377e7829a648c1a1e6879427301a3b8ae8e0338315192bb12d3562778ee7799e1785a40a4d1db4a2744520ea4bc8961874e4889385871a58a21c3132b342738351394dd92f1b5821f6c2b2318354a13903121c7632c49adb9c1ee004e3032d8d0b61d6c4a0e5c0522bd346cc6c5d34ba72be72846c25192a6709c207f69ef09495f6d219e79c73c6b203c9e76c85735416d09c78a05f727659da861cb6160491fa9a210c980db46e121b1ee440eed54a6b1cd3ca87d5102bac2dc46bba57ceb060396d3569af1abb26298a95f31496016d870796730e2ffbb53515f62009db4c59e51ea2c072ce5987a5b185c5c985fc14e2c29e708642e4d01e58df7703dfd05c36ec9448648e95225934cc98c1e2a4c79490106c8cf1d8820108a719dcbc91e2c3cd072288e3a508950f1fd28cdca0851b865c2a62419a3cc881dca93cc881bccae9172cb2b04748539c1c3abc6e13d61286858700a283e389d5cd063872ce19890ecfcb996a4e7d4d894d8d4d954d9d4da5e170ca0ab03a6269c8c25b6bad776455a1b9c585e5c50eb01c84f7de7bef1d984ae692cab173e50712ec39799003b9df9cd6749855c656396e6c9db5d65aeb2f3055689299e10c7ca179d72d87f94e799ee7a1d1aa42334ad797d818129ab29c6f50ac0de5fb0a2cecd13da692d868c0f2c2ce9a929c73b6a17b6435e51db308980f6b15e2c29e30d4509e3170669f51f3a4425cd813864fb58a191f39e79c438be79c330e1daad0d48ae2bdc0d1e520543583f2eaaaf185c52c3b612a32990a4f210085302d64de10b1b1a6254d142968b059ce535e235a588295c52a889919179048299b52662fa4d0bc6c28d953daa3d20526c4ca856bb5ad9688588098f51045446dcdeac992303435ed2b2aecb1c156b69293af88e11757c6c23651c07ec0e94aeb41447b29e1f182f274b5d65aefc0aad004436676811d5a0ec218638cb1a8d010c5a13144091324374c512f4faed8b8e0799e6725aa0a4d1d3e866029c9ca19b0b2b51583b132ca0e0d8d0894a3acaf7cc656b87a54b3a979430e0f7220c7e15b67adb5d63e7455a1f9855ff820860b71614f185a5d1e39e73cc40acd9d33946faf365f61cf5c43c32c076160a69cb9b141a8a992b3508554716ab86b1ae7d9b5eb8aead2f1f365ea862e555e806839d124376429bb6d74641bb6daf03ccff3920ca942134b49d6169705926091e2f9408b0c8e140e4da684d1209f3d0ce41d75f5ef08f28497f0eff2b8bf8bb3847ff4e6e23cba5f0924eb493dbe9d82483dbe470bbe5081e98d88befd13fd8ea4ad033109e7b89194f1382fe15714a3fc48bc263cca8f4437218e4b23584186fbac215c17dde623d82b562775fc7a093149c9fe2091257cc745d1667331898fff884a1d8ce4895157bfc7af9b709b97487ee867a965f7624fdfc7c7250fdcdd472499dec74571e90317dd821d9081c293f8b8530a177d042b8a4f7ee45e41f71e9164fa1eff7c4423a2bbb8820c0f5c1c771eb8e8e2e89404b799dec5a524db93e0760a1fbf8e134d8ce4f5126f93d1236adf587cf2230fc62437e711939464bc55a2494936075d474c02475dd55510c484369f7f9de66c5e08a4aede4692c9366d22dee24cb28ee9cbc84cb8aad3e6b3bba7064d1ffa219c4fde7e7efed56fd4d5cf9f4f1029467decd99132fe3ce72ae2cff3a8ab3bfee9781ec9251df1c98f76becc32bd9e5d0b923ff1b3fcd2f2dffc6c37193b62f6273f5a41860374c61de83ba3d3ac21507ff2a31d9f479febaaf6efbbe988f3288b641593643d2e25a5907dfb1e5d909d8e3094ac2efca414b26bd7a30bb2ef11468cf0a92e7c3a82a54bffadade9eacf1a34f7d6596bd1a2e0a6aec1f036ab8a15412b705668c807ea4655450e22fa6e5a67d7d1c93fd6ab1d9a12e2b04854837c070d4109f5a894e2b5ef3197dd8eb80d4d09adcd37ef8f7e2ac8a3cd75f5ef6d86b7f91fcfed5655648cb348a9125dfbc93e9f29b7b5bbd8a31e993e8be4d267d72299fdf6e59b8bebd86d48b7ce4db36f6dc2fc3cdee8cf1984abcfb086b5d65a6b69a5420ce5a0eabed65df53beae8db71522f59ca1e849f6596acf7448d5d5749ecd5f55d7a6facd61393741583fe2dd9e6f644281156f0a044b0ad306b089e7b62f5db6f9deff883649dcaa84cbbd6b16fd4d5ab49fa4e3576edd397e8d2d31208aea75e7dfbd6d37c5bd259cf2fd0e9acdb3c46f53ccae0698ceab6915cca696f73bc455db535ebea6b9cd3da27282655a78e41a48ce9d674c4baaac017d709d66cc23c81aedda7a01e93aae7d18278d7a01f3cce5183f926d0f4eb79c612b02f62d4c7a3b52246ca4bd8b5679164fa3c7f89f41c8fba6ab361512242e8ddee0f21f6bb2f98cb9ec5189e5f18d975da2df644a5f95a544af176d4d5af172ca12255c7e30573d9b32761d7d5cfe3985d571ffb1ec9ea7be9eb579c382425ac0ebea83d385bebf883547dfcc17e6fd97707209ce59b45cf27b8f1c6f72798a95ff10af200f8595ea97aadb7f92dbd90bcf5ebdfce0ffd10da2add493afbd775f5c9eda0ef7182255ca4ebb691b479f5adab6ff36f484a9874c78b048a4950d8595b5b5bc339bb4dc4f7e623ec55242fb9f4365b92aeeaea83180841ffaa67723bde23597fbb57a3fc0824ef7f1ee547d701e0b8346b08365f9a3584ea37af3e82ad22769b98dd139564bc9d3f95c4a9777cd30066429bd5818b5e502e2d67470146418e0b6fd43eb2d38d58bfe3dd7fefbd3731d6628c2fa698e28bf1a423a65c18638c31c634bfd9b1d65a6b6dc5855f3dc6feea2754b7e35093903ecf4f33326d8ad0a8b1153c61da396647d2da91720de120fc7e9657a27e3a53a5b71cbe09e4d488d953aeb20a98a75c4fd1beb4a2e4c96dc5aca472f6d689e8eeff05e5fae9942ad13525a0a74e9d9e5ed15987b2c2595ad1a4a6547ebaf59b751c96b78ec2ab8a59768179eb406fb73c9559a4442d28012ae5afd73bd67a6bf5112a9d32595c914e9945601d95f653b7930575ccc23781b8688b4a43389d1a992c54a04e4f8dcca2e92c54a05366d1747a5576ed9e725d3de59a2c5498b3684af93b2a5d9172cda239d4249ccfc34565b2983f47af348474050a55b24c21aa02852a5c66d07cb2443f4b32459e0ca7e0286e4d787f966488fc0b7808cdfd2213e47159645ad0f2659f40b4524b2bad14db4aebc5bbde6a2badd4d24a2bfd284833ddd4a3975e5ae9a596567aa9a5955a5a69a5d8565a2fdef5aee096c5695500e66c0ac0dc5cc19caf259c787bcbb9bd53800230972911270073db04604e8f71a19edb24a802fded2498b3360198f35a94a08e718d4004604ed7b1253c2200735e084ebc70020463521f70d3e38131617a3ae0c5c381314e466c80c4cf72cc11129ea701132898f8598eb132918131347830b07381bdd366a72ab7b0402de1a54405c05c1633a5870245ec1056e5cd981a54da1ccd29b4ab5e7c5759c504ae18279f04c05cae62b04a44404c90db096272801e04c09cb63c7378906e6b6e1e3601cc691f311f17602ed7305478aa4ac881396db5741e400298cb340c92f0280c91efc3f4b079de083a57228491d2a9724003be2b068039af0518c209ab588039afc502324f199e2a05b0b02bb6f7c5236d2ac09ca76d08604e7bde170f84045c30595870002330a72f98ad112c30402d401198cb3e477c88866e7845000d064810cf95e709008c140fa90390d33784131e01c008e6740827bc126d0827243da7c9f4785ed61f8039ed0198cb148c44f103e6b415a2cab6b967f34e8039af0af1e46301e8f916e96b1325c09cae42e0f020096a16b807869e9e1c2484d8f1d8353b79841d03c32f60b71d9d9fe5172a3a399d45ca93c57305f2fc2cbf64f1dc2e7804ac9a5305b6d9b6ed67f98588cdfba263c4fe3263a785ae56cd56a9c837a3e52b15f866b47c47941961c190a0ae6739fc4892033956a094399a5368d35ba5955a5a6da5957e14a4996eead14b2fadf4524b2bbdb4e8467b80436442ec57af303ac28e9b2cf06ba2a220be7a5151d50f2222fdb3f4d2f57a0f81391d6a855a679de990171bb6b641606e5b2f572ee8bda900c0dca640800ca06616f20bdad620fbd9f8de3aad12a2ebd7165e6ab8c06f9de2aa21604ed32d04e6b4cf522c2dbff53a03055dd41643d54bf3be14b616f583efbbddbecf368bf22cca0e7af0ad9847da5180df9a2fff5c151de4b107abe63ec102b7efd58fbdb5ceb3487b9e45791669c7b328cfa2ec9e0952bf76b7534509d0451e730394313f67d0fde1d303e6b405261b1cb85c59d2a6c6d8d9d19c42db00604eff6774805b058180b9ed731655d0057d17d6d6eab9972fb5950073b69c776f60b75b09f8a9d7122d7c6ac8155ef580b94d02cce9902be41971afc29cb61f0f5fd501c19caea012f08ade28a8048401cccda2ecf7bb4734053df75e679db5cf599447bbb5beaab3287b9d457a1665a7b328fb9c457ab4d9abb61f90efa330dcc03c6e16dd3cfecf52ccc757c73f4bb12a1a0474819f7a16e70b600e8435e1ed672906f533df9eba531f6bbe17d605eda12092756c2faeb859441d378ba6634ad388cd781223e769ff2cc3da8461664d62c29cc48499691213d6252c882c61c2a4a6be84b130f5258c888d2f6147a4bedc301e5e07a91b0bb69f651891c79561476a7801ea92c5a52bec8bd70416c407e6a50bd7ee82a509acece2e6757e965dca3ce946f889cb962d624358b0167bbc25eda98aa5a23df8597249c24506babf608489ddb834e9b02a3a5c747e965c5830c285446e7b5c452969e28252a48b930b45ea7a9003b933c1ee41976aa77af47ba9950b632ebca1f1264d7339a27180727707b23f4b2e3c9e74231c85b9e8a0c1858a06d63f4b2e505a3603669415fba8dc5256966a4358f0254be811e40895314ca444d16052394790148c703831c61ed2788c4bb0a7c74d47f88e55762ec1d6bcf7b30423b36686accc6d8354e0b2f9da7bed9b28cbc6a986383acb9e565c7aefed962599bf77a82b9ca11df3cecfb22cdff6b32cbb7096212a5f52004291b5660c884a0a463e346839928291d84d6bbf9e97b35d6d133ded83745d7b76d6a09bf6fc529c8fe3dcc7e636dbbdf4ba09b789267c489be3fc2ee96a7d1f138e73138e53e1a3a5ebe95f2d5baec7b7b82392f7775c4724975ec74391a42a489453412848823ce15e0e020c10609ff6db7bb494bdcd7b2ee882e9716e13afcf6bc9d0b7dbdc8adfc5b93b6e0cd96755412fd5d9b75e7dee7105ed19037a9c56c80a51eab75e2919ec2d3390d82d631f080a7806ec50ef06fa8e488fbe0956a082db77443aadd075901e55318b7e459be79b45ed37f18a3de3d4592c5b763e2470bf7c73c6b85c732ac0569a53bbd3715352ae613d39c5f0b55bc7dbbf4058fdbb4048ddfaa66ef6d55c830098945d19fb414a199b1c46787864d4a2e6b8409416465504d60f31305c3655a9e6e3ef258a23809fa5da1335264ee4c08173f3195182e7629c091d520f4ee40e7676b5811fa4f8f974ac93f0504c5b7b6830a76a3787aac6d69c1d95cba91116e1b4d3ce9aae579a9a1a358d0cca2b2dcceb428b2a02088e0808341f3888aecc1e7eccc131258e952c376c1c695d706940e0f8a8d1dc1ac104fc00132210e44035688407a469a5657d0e923c693425f4668892064395b42a1fa8421ca449ed90e694b5c624ce12375c663a1041c31054c2d42096c3161c80e8c1ca13ae1bf8a0c4890d9868e98065c30d34fc10e222368478089220497c34b1dad2c1c3d4912828729ca4c8d975a53d6944e4240edacf6aadb571cede5a3b9f9c5b2b6e1dbd1de28c11051152a15cf587195fa3ccf8ea1fbe5dbf275010c484d6ad6b3047b30e9b3c59648c9da4d41bafabc0f4d7317d4ae10c29e3383db9b3d0b6beda6aadcef4aa6489b2d8fc6d60cedb1ef69c8e6412f6ebf9d314c479dcb388fabcde2c7a018b152b40568cea0aac2535d850264c0d607b6ac43d6dbd600398dd0b6bcedce00104b5e3e7aa488d16d09c9419b3c58685001421bcdcdc20062e3548dd70e81143181c9c68b88216150000881b6ac7d5e981c90e438c64e192b59f7a44e07186eccc17133332ec1aba0612235fa4685185d94e24ce3491e18c5a94263a84d84d3ce8931f3eb2667003856ac8a6915d20a64717acb118ca7cd93376806ca95135264a8d72ef78ec10e04401b91a0325e4c99a138979099b51840d5f566a1e600992034c4790afb1393c3e48116707355b7478128395b41461b45a984104d85a0c7276a000f2c4860f1d48ba1479128707cfd65690355a3b9098ed008747070d086288ac356072680305ad040a2e4dc2d8a80147899c227cde802468c264cc4a0e6590b81971f6a19064ca922142e03809d2c684561a1498304b98e4c06687b766876d6681c34406316084f8f2658699587821082a24438ad090a5e644106b80f08222c30d333748c3234cd3c30b674d5ac072068d0e9117998eb4af1b67dea8e932a22b4195cbd75a271065b26d88737c31c645583dbe3d38b28a7111548f2fc618bbc9222a52c4eebe41b3d68d9bc73f4b37664f863e2767a218c29c513833f33c22ced0c0d24d0d1c4432e833448c8800c10043d566ce72d04424c428c4b90715a0c9bd2900110539d33ad3218a5e7b56c313d190eb40672c9cdd78d28d6adc13fe555ab3ac01332b239a5aa39bf4106bc8f29a34529b524aa9d2b54e73e02caa3e8baa4fb1cdee6910ce928dd9d7323f59cc59e267c926cbe38a588326c566061b29363b9ed8f48022b2c126091b18b2d7b7066dc6962ad9ecd03f4b363d2e9ee19b75d61e280be41ac1b71cbe9f659b27f98631c6e2cc5d2bb6016b436593f859b621a36de46c9d1fa4fdd6ebdb919cc1dfa68fa8ca66d1c5b4379e9f659a1920ee6799a64a47fc59a639b293a6eb71651a227c843f4b35509ee7d93e355b267e966ab04010d4d9517306809fa51a2c5fcf8d8afeb334737adc8d8a297e966633f4dc48902041a2c7a73413c34d16277e96663e3cce6ff3fbdebe1d4915be7a6abe59777e6e21b3f138141f02ba6e10451901114519a1f1a25243d3c44a0d8d112b35ff59a2817af0675916a70c08b5322a6a6550d4ca70a05686835a190d6a65576a287e966536ca769ad2595429d2dded763b8cabcd741a00dfb7f43f7cbb31ea67a46b2bb53adaf588ddd65a9f1819ed8c88661035116146040d22a7b5126564b839738ce600cda13866bec8ccc0b9beefbdf7cd073fcb3354fefe2ccffcc0e5242fc1676a88ba6ece5c455937e31918a2dc9c6921cacd191e4e6e7269268d99312b381c1aae88331ceeececccec86eb41650ee4d8882dc847960324ab01e776ef55632b23d3579aeebd60ca64b995f172a30c9781722b73a5ac24f3fafcb3249bf2a41b8140d839555427edb573ce592b8cfabafab5c5bdf5ad935557bf7eb55043656988208208a3216ae08166082238d00c71e3bf9fe5103b3321ca6895917143e68ccc1632568e944132c496d9c5f7de2f7fc9b4fede92cc87bf40d59691d1e17702949ba8c4eb9a2a6a1022c50810000000c3170000200c0608244194244110835cf8011400095a924e543228a10444a130140c8581280a621808821004621004a3108603599e4379006f08f625a52f948835d9a91cf4e87e805b4d6f4df601d52d4ec33bcf3d2d3cb2ef4fa9b91f13e453a7286cfd7e8fdac537da566343a7491b1cc373e4b609d88932d64caf92684f9c1034e1d0a249b244afb01cd0faaf5e890543d89466a24a107bf452882f2f7655c21e63184f5a1211b5b7854fde71975188f7dfe82e7626de93b73ab7205a3e88db850b9ed2700fe052e8227d43892d0f9e0a890df5a8292dfcdd9c319a368becad0b221fe3d33c420a543c767b20ddfe5c764e092255a42feed35312f4bf3144d892cb770951a74d32648585e0da50e8ab43760ca2e7ce409b4da4706f4b8b06731862c939f45b5a5aa71b3e8867c6f5ac641db00cd6ce4e1b222e12dfebf302f45ee3e2d9ac0cc6ad6d7d4ab823b4b06a5fdef9ad22c8adee66d72d36d8ad786c782661414b245898c148db51440d011450f010ee8398131faff942ec5208f7e5ef2d1ccc21a262a20cb37a500841a3031097ad9f31483a2882124a7d18101198160045036a53e505710e7a3168e594c5dd7f64d1398afcdb0fdc23f5ba786357702997c9c5ddcd6d5dcffdded81ddeca7bbaf9bbbd6df7bfdf1bbb83b7724f377f376eeb7ef77b63eef0566e626a3f0e16c337fbaf1ffa39f18cee60f6c5246bbd2b22f01f85bfecebee5079eafebd571fff9aad298321a14848d670ec65890022d8cf7d4f62be8c0b3618661945fbb2a405c71d2c938fe25d95ba286e9d4f2331374906c68f5be2daa789e8528d054e053941107c14d5c678e05c3ead5a18ec07b3ec040230766313faa8069b20c3fa51d5e9eb27931cdba7796860e2f58cbbe8ecf560470f7310e3cdeb508a3d87de9a87aeca0e102834ab3e11b9296e0a3a9b298010e095f65f4ba53c2c2cf8600b69d2458dc159b07a96aba364a935308e1d0268d2e6f9bf189eb43cb4d61926a1c0073c3823cb6b7d376abd199cb3532de9876240c4c7401d9f8193c9b93ddd927f3807637c0cb07eb8e2639ddfd99c5bd22df986b29663626a20a30ec9ce7826e278953010f7f2300f5556f619473fcf97638470f9d64532c1b2e142876991e660667e5105037cfacab5670b835c418e009bd1fea3aadbc60b0118995b0b90fcd06d804e1eaa2005c4baa5e0ec0a7ea697e289f063f44252ae61e92d5069a44c3f3c0f2c192f8fa8edb0c10b20be72a73b5ef8c765af2c9941fc0a8db7d2d321d8214fe2c548ba653ec3cf7c25dba3ce1155eb54748f790bec9e87d2d11f41e83414c1a35d1a17c99e47ac3bac0a1b3757a0258a3aad9b1f0551b16ddf8498b0eb2715daee53d45e4772fb3dd9fee4368de2ea00fd45bf955bd2b4dca24bbd71975b113df686187fad43635358bf0fe976cb36f3cf86a3de28fc03cc35f141da38c9e6450a1f4081578f3f04301d68b7d5a2800960bb15471668714417bdb2039d7b2d2789f11ef588a2381ec7f122d7eebb1c3157087cf1e884ef48f14b7a032a4e607fb04706330273e0dabb033e68fa6725ebf0962426a4d04df6f55eab0db04f1c406dfefe849aba0c61ea22ffb307c79d75940ece2f8cea004b9826b80a72533d1a795a3244c3fcfe326120233d650a87a3b4900d8ee18e7b59a8f7ad35e513acafcdf96cc1a5283cea440c46a326f85bc4d489b05d0de1db35b54b76e4b31bc76b159c3f7ff51e1660e9e326cfea4e88e5e376b2152df47b7386967e694e57f1775a680f416f8bb63f83ae6219b423a1f5739e91e0f645fb4b84a2fba1039459fea0e70a618044bd52f66be2a7c6b2e2f8b9adf6b2a3fe8a3f2f3a7ed93d59eb3fa9eb137a246f69f18415f05ff76397fecb955367a248a54519099e6bbd81a0b21fa5270b0b85ff6e7d993e6f75b7f67aabd8f9ed41485f237278ade530d445bff18c75b85ff7fc2f9de27be68f78e665fae71601be0dccdb7ee91117f18fc46ee142690239f18177ad42eb53847210a930bff3a0d56d72547cd9fc03a30dbfb49dabf82fc7bed842ea0f92e9d0f90d41b320c2e329d4690cf682e8ae47866d63c0c00bcb07237ebe1a216ed20cd2e9570d3efa86ff968e2f962fa923e2b15671157ab70c8fdbaf07bb229e33c2d132922d035f529dfe292dfb8956c26c632bbc66fcb21e435e7409d3d27da04ed2aa043ab300a267fedcf7a96ee874bdf6ab1125ef22a33c8a36cdfaee5bc0305c94604e52f2a4da592a6a59c1f4ca2c583f0c87459c07c344b4a48de1dcfd77d0f08c464f42ae4e62002637cf83a0eccf104d644ec545c9582047d19b027738d00f2ed5510b93c27be604146f3d95e207f8dca8eed6cee43786779a57831fd86de207a99c683182ee11bb6e1acff97e521abdf913497f063ca2e616dddb6a2bfac013dc1a982ee576bf4565af01f4cefe7412c19ad9dd912fe737913110040c4de2d85ab80db42ccab34779d582a09e8522a70104c8d88d12751c020224d481dc7651f0bec65e745638835c539c06a90165d6def00526e1a641277fe3d17aad37c3229f345c2deee09107fd449ff066d17201a95e194cfcbed970359ecbd949f8a39a83fcebfc10b75d046603bbf8b83f6dade6e002116f63d82f71f9c3784abc1c3f2a252faeff43631d7818bfc486e057c117587713b4b5b11c6989e10ae4f565520ef49d5811721a5e2dc8033c90f31299b78b83721a3a39dff6dd94a441374635b66b3ca41fa23fc105447415c0e561e45bc2755ea714402b7e2e1bb4dd55a6866781b6dcf21d705221bc764621fdc95844111d660191010ae80eb3170c3a47aefae9de817d421010892f9af0af0086fe30884891fce2f9f14f4f8cea0edc00bc96bf4a3e32704131b6aba03055e1135c25687890a19cca4b8b63f20e7842048daa4534863b80e3d39a73c03d12f49e8f265262a256f36651730e8c4872ff782a1200097d92203e24e1156ff35937922443dfac89d4b6ec80164959c4373830417aaf5db1ad5df4b2561695b89b5dae157857c1f0b69635107800919e869959546152853edc074579282773d03043e8f9ae5d1e5f4163700e5441bb6fe4c9de9a663dd70d03e7b0915db4a6fa5c582c71db6b0a0948c4ab3b4bdf01d249a5cb5b38dec3da6f88c9e2186f95c3ad0425ffece3e04e380fcc166865285e67d20f4c6e4c4addf7c05fc1061f13841a2982ea494a8354d27827790d5589d111516ae393bd6087192577c8d57dc9969cb9825debdfdb12fe70b5134ea01b85b7f14ac0bdacc11adfefd5baa661de989898fc06e6592c00e29700e0b32ed9bde950fc166dda832ad7ba4331239a281e25a61337fd5feb61900e036470920aca9e2d67c2aad8cf4727f4e613dd3f02c7f802c19318df719d543fe6d3517ac181a6a347b4ebb2f9507367149ff3895d96740aedadbdbd2f44066c564a8036f731457f571b4c0fc706b476c29b772ab2aba1e8f62f9d43a716fc497b602f17cb4708555721f80ca5a46a001f17dde0fdb01c7b771e1f02d3cb73b833f601f8d5d108c43fc9479017dcf36f242a7c4ff8639b13585c9cff49e3d24fab2e47253d7f39cc9a57ad2546d5c53fc6f9516a2b14f1c31f832dee4196f1edc98d6402c949e3a1e7cee8bde2880bce3a582f209ff609c7f1e285ba2c60c6886b82d9b8558c6120451aeb7bc254adc7afa8ea87ac48a52f2b949173130f1eb32d208a10671872194d3cfd8d79fec66015f1ac3f384426c6396eb9eef3144e459c539b68e9fe79d8f0295c504e78d58a5e0377d513000b0d28dc92b67c765a906168544ce77bcdc3b5ccf06758c27c1641103c5b86f0f5483424d44cf614894a71e02801eb2fa757bbd5c0a661d40047c8752ad9087c3aa2e42ea5990d41a63efe3f40e15f44b2258e3adca0c7beb74b35873a70395eebb7b138ceef7e8c02f9e26536f1c4ee7234bf51034ce338f65c04fdc1c57f08f0a72a884b225e09833430f5d2565566edbf0f28f8d7a16097e31711f9859e7c9815c63f17e6f5e4c8b3ba1ffa74e64f602ce27fd408967b8d11264c8b0f283fbcaf3a4751981e45d2ede514808974f1599df6516e71ad2c8a0ede32a0350d1abdd6d238d537594124f384f6dc7bad8172ea026a376b5d4ce47b144f6b861249c80af9949c9807850ac769d6c7d57bb00960185c899fb79acd3dcd896756d5842fbd2937c437d3413d517f06d79df13d9d0a82a310577f76115cb7ce8f183a0488c29acfbb2270c5dbb873d63e651fc08a0a2ea50b9300430fa204f4d527c93bc13a78f8b181254304aec9919c15a1b27cf16e80fb954c301857b01e7f438effe7bd7d9f1d9b77dc9d3fe6ff58269d59e5df21f3bcf57f2cdbc4cc43bba61feaec9b6e5e360ecd3baec94f689ca7ff694bae5b1042127e91897e3842438bfb517b16cb48c9194b7d7785cd6354bc336d879323a2355751bf1d66eff21d7393752a040f2103d5635c1a8ae0c790ac8de30878b64ef22a5bbdc5fe652e9668de6c7744b258d21e2e7e9bcd199effd4858c2956fb182175e66c579809dc0b0abeac765d1b637818b6f4f32510c672220788b7a25b4e2bdd2e430f69d893881d4ca51d274e36514a3550436939f2a9c0bd90ec3c53fc63664a4c3038714a5ef0667cbf5b318b15ca28eca3c3c5cf206da3273f211cbf2e9f8dbf5bfc651ef5021145594a72cda05965ba0d5800692a8b220f104db55839af75c0ceaf16f4d499025f029762a8276271c3413a21ced80f784aed850c286ed166c69744c0bec04b0088202dd3f3cbe6a7ddab11bd9e4919eb08510d48d32638a3c97d01eccf7aff0d902d7935616a35392fd9ff1ff6c3d0b05bc362c63d466f0f087015abe01b838d07bb5ccda1a6c653a6d3d912098b8414c63a9bc263260a889259724a895f4623008181bee3bb060e97fb40e9a1c45f92876d28281e855352949800f2f41410638338aed668bff597401d05a4b7132d88b4494adea600b8e511fa8103bc62143fffc39ba50b69a32f1811fd4f05c3fb3f45e312e8aa374494acbdd5ebed202d3e5ad841e35568e081091c1ecca26a4fe73c74c644301117a3faf662b3dd8dd49055d05b1691958eef1a7cb3e95455d8712745743d274070b67654a0f242ba1e3c5b7d94333aeb1886256290e8b0383326fac8cf4d4f6855316046979c9c705c4f6d8f85dcae983952f8a5a37466220985a8db6c9c79c81308fb1603f8afa5f631d01bb6b1ed0910498fe369f44cfad48fa7338dbecfff4aacf5b4af05bb3ab2bd779c46c139175c39b00d03844580f37bbd0c3974170a42ff3a77781003b754ffcd2c21e82f7461f0522396e0d3592ed83ab75a7ddabd88ed66f08e5b48c6124963897a829c8792771e13b8ae9eb53f7d2d3b05188705678a5f4a432cb55a7674f5cf23d34994b377aea71cb9c5b570cdb2c60fd22103c79908875410eda70aa732f0b9f997feb18761c70c9362f0d8ba5294b580f534d3925f35b0e7d3d9a1250d7f05830894ef2e45d06db64355b1fe17b0a388429ad61e864c93b72a1ee94bb5c48c02941a578ef17a81c0c965375f333dce1d7af1b58a1899265dfd8d866268ed80ddb500f320475d38a06459d4879be976e8fda7f657846a8e822293dedb4e89a93c7a965e48e21b58df6d4f019480120112204db01082eadea8d3587279845f21e9fca1ff6ce0425adda94afe106f2b3089ef95e088eff329b3d69b1e68ae5c78836af78e2af38f7bf3cebbffc7ec138bb4cba69fb5fc3354438a394d721b5b2bb9218d98409ca79adeb7a8ad271abdc95e036a34de06410d5187e480ef7719a17902fdcc970e27903b58d10171efdb31067d98f72605021ca9ba6fe8316d59588e410edc4e21a5fd58687113823b94f49b6f8e67d06391640dde45ece52890794aeef96927d9c6f826c584b880d8b25c0702b888558a8896dbad6135035c70c2826bdce0f8aaee34beba7df23a229628c9487c9b814fbb34384bc14e0f9d1a8b25519c376017ea0522201a9002ec2f0ba8b1d98903c7ce8387106e0485fc0bf9a25dc0c3028ee35e65d53e7a0348892393e599761292b3b4589d231998ce01d7d70813711dd4e8543bdd9c631aa84d51462dd4c85dece81a6baf4791c0f0c74fd7673827b6e8068f4313b96f4006b7061fbd7e7bba679b3c6cf1a3984d9d318b2faeadc4db92dbda621a0f8fec3b8887fb4332ab5dc64aac7d0e9521cd3a3370c6867b3cc5846a21a1649a76734af2ba22a2852ce15b0ab53b6022d3f6f5c2c5d52f6d20299302e737ab6aa4f788b785c19fdf6284ab9bdec3d55ca22c9039e83a809b2cae9ca098013dbf489fc3b7e8a3fd68ad92a2a47ba26e478d49f9c55c0427a9e2bc970e8c80465b30ae794be41c338289ab6102a4d108059e03500fc88a65b5307f4efff528134fc3bf3ed0b3f6dda14faa9a5218e194d6d2beeef229795c8534313b9be8a29e56f3d0363cef8814a31a13b873615f56cc4c4ca0cca8013ea56a1632e52de396aa9dab565b15538221aeabdd3094e22f9554fb6d84e3e2d39fbefd30adc835b8d0b9b7b96ac0ae194b4e2612a466f1078bcc59e50bf17330882382284735daf404e55a5e710cb2f92e8e21269efacbfc9171798ed1a39ad5bc23a59613ede5be283750d64b3eb62cc2b49e8201a62a2a3f255668d4f75585913144c832becdccf64a1dba7494d94716e6f695e73185f0529457e7c967493cfa6fb365c50df115c33aef0eee52c07ffe50384a208a9662347cce083e28c48bd4ba36a9f185f4ef91a3bd85fbf97b6e1c96b10f9f59ce03468035899bd61f9753503a4d74105935ea8c2cbd206ddb97d5a1fc1f4d4558041f427a0c8219aef47a1e05109dceb79e3eccf4090d4520f599ed31346247c5aee8e09fcfdf8b4d84cbce98bf32def5a5c2c455c672ce30c1f31f2d3fdc21e5be3bd85555052d991f125e4509826ab9ff190ed51c7b959d636456f20111a569fa29075d44c58df552227a5bc2815abbca36f535b5ef380d14ac95826688542774e5b7bdd7f8675e6a0e4e9ba85368164a4f508023811c835df08c85fdf908c4f5f5c099ea6225c7a1380914a33c65c5287e392993afc3eab4a91baf82c4947ce631d09648998f534f2d2780d4f4e8b2464cdabdc7a5ad5995735a44b080ab6b82ddab0f4f36466665929a9ff34565ff06159becd0f696d7ac246c750e36d7a6f7854b9df58ca295dad97a2066af1ca4c706b341b8cd5d90c5c5dd3f85042707b66e47405c19ec9a37a7e9fce015207a761c932f11cc6aad441341f29dd6b6833d490d4c6437cd36947fabf40cf55ca5888498d774033adab5d92e766807896948cb1dd4029d3278370a24e8e28c8884117195254238d531f6ddf04d634f8239745707938c581eb95658582266563928be82482a1f22c86c4994a14c3c12a01d70d827703e090b0caabe13f34cee6e1bf6ce3747ed3835589e7b1a0e4d0207e3bf03baee1a4f88b1cd9b9f229ba0f47be70e85258a6759d36da31e27c1f017480295217f2a5f6af7b026246696c99a7f8bf49122ceaed3c258514ee00fba085f6a2bee10d69f2574c27be352b5389b1f7e1232c055d8fc5ecba40e36785dba784f59696f39dfaeb18fe6e738f2896b3849a3122cf36292fb9ffa108ee0a140b0a5ed177c06939de4ef1db3b6708707d16b094ef7ec3059a454d8d443da37d1ab0fee2bf4c0cd2c31cc6a667840df26d690dc65c78e14d956605ba29beef803b87e2bd550e101b0706cacf77832b56674d5bc429d5b9fea85a919e12f74d64ab2851f54821b9f84789b187dafcd813a4d73f9bb7a869ae048d031eacb48bee13485b910d88268bf068d753ed9b9bf62d2d2bbe9229186e82b3a24a3aa10cdf4045484ba4fd0b0c96119535c5835fbe17d821fa3e76e016d5a67755f9cf9d98010b50c95ebda505f2754c3ee2d7b38bc398dfa81e9d4b0dbb3a38c0cf2659db4ac786a216fabb604639ca7833e7d39011c742a12c7dee8cc14a3faf8b43d2a29a69c6bc3e1eeba9ac3469e4dc672b360dab155c84db6df08ef16b263f2ef264bc56092583431252e1bcd0c7e4b8b689535d6cfebadd0eb04998ab505d93e3c2713d4f74ba7fa12f429b674c3f3fd2b11369df79667840c09d0c53259edb1b9e99ed7c9da418b9ce3346b03b80d8d5ed68d36745c12339eb03bfa0f9f47581dcc67393091525429b08842a16d53c57211e606cfc9d2c64923932bb2560885f8ed8149b09ffc2837ac7f654ea49ea2a03fc457fa3c98e78cb4113763aa6cf85a6559f4842269fa96b19026a33e0a93f7fc4f42405eaae74f2f9b3de7582af42db3ad747c5ee6a72b28e36ad50bdb5ce98d2f9043b6e42de9954e15c8f4f1686ee2652273b9ec7527b800e4b2279dc242d4c653b7b8934d6bad3cb56fedfe5ff560f2328160d4ea4f30704026f3974125939392d595cc7624476ae9f66ee1997cf0d3e395e67d5baa43af7dbf596bb3380341314081a3d82a0726006ccc1f4c5ab85f70585d7eb402f2a13535776807fde8cec59141882cb347633c198cd31e6a60664c4e749f18443fcfcdbedd0e52c4d1276440c47d8ab9dfba245bce3681f83f552db95d4e9e95883d007032b2638ac1cc972e6a796f4852c5f3b69b7eaa6ebb26ca62b54bb181533fd6ee5ad331cdb711227589ad63b43254284f79fe478acdef813cd26b0f86b3b093325f2412e1bf68589c401080d833fb97113e741d0e427dda0af9721742e2ee89badd512d9effdb9cf8bbccc1db77103974f07ac4512ff07e39473de93d8593be55cdf78c88fc91575aca8e387dd5c46f152ea3fd14ca040e65e1d7e48e74716ec3a4df6ea7604b5dba0eabf15017cf221eb846a7e9545953906e3d868f366017f08f76d53dbdc550363c6ac6f57e19cb34d19acaa6e8adf510967a1ecfcfc00bfa2667a78103d3be1fccef7d0a61a66ebe4294c7563633f99eb50c38c4dee1f1fb9558e67478e072efbc257a454a716cb1fb7bb1b9905c2c55a9ce7e0f0110fd853793a1c8082feed4e65462e3b9e49eec511e0da82171b0baec5ec8073600c5abec0d3e1d482a71f73c42cfafa8f1dd0d63fa3ed483dc1b8a87698eee95e6b9323dbdb1f2bbde05f48d0d9c7e4e596e30da07422f458b3cdb8827b41d9c9d3089bd1cf1e9dcfa429c6dd5c2f8fe5f20d151761a73267e07ae3df15aa6ec951b0f65d69db94139fb9c76ac6ca00db0893dc880b8fe81e8e1f900787f90596aa97dd72acdcb00ef67438046e38096398c53349fb95a6919efac8d03d14c41b183205d5568cf86f7e36ad2ae17ebdd3abe6ddb00ab775047d3cc8807c21cff016025ff9f145ea3b2352e975cddd8bae00f08a0c123ec9cf2f31ac75f45d30ffcf9b5d65d7e7e338ff5f400e80b71ba45eda3f60be08d71c484c8268b26ebeef92ffb3baeccbbdbe0355bd5fab1220f29c08eaa40c96a8aeb53fcdf4ac84585dc372e95eb1e6060ab8c6730b4ec04d05690966679167e79862304a8fb717f4d05432a9ab6082f7d35e8646cdb3eb69a31bba7868870b7871ed44826d4fe400f1c5c43537f80173a49a1088f8abdbf171f16e41368d3dfbb8c7b1cce0a85232440e33dbae5f61fd7ddd17ebaafef2e5e06617880c0054e000b2030fbb5ba4a02073aca13eab276c1e874c376e2a2b76dc7d4923d6905b65245297165d41a55e95c30e623c0b2d8815b5c9986bcd801706f6b9261fa9b0d26c1ccdb8e283639600a9d283cc8e4bbc4b9564ef7df332bc4f9905797a26e05e5cd7af38fd655260c32ff83a26ef1746433d23dc61259ec835af1322767f06703f2e6548d858321e4ac4939f8c2c77bba97c91677b3607b231d0c774fcaeb9394dfdf96c9a899341421c90f4e14758c8a9a048d125aff20669fed7b0d474bd44caf74b52a336a671c493db06c7c92a8c1f379fbe2a8382bfac44d244fec0e84cc0d61a7c30798093b78c538158017f884aa3347092aa17ea04a0e3151fc40fa48543b01e00b85d8a71f6aefba7a299a49827fbe147f9ade3a0f052cec21a0b5de196599f4fda1f050e6633fbf267be3c63d997e12c00f9c84e322d22c6b94a226a31dff4823267a748cc81eb9ed25589685e524f629c5c69ea8a3fde99e60f68bc92739b5c6e76c6dc1adb3bbd7ecab4897e753241a8098f1c2b97dba8bdb0adca96f9ea5e608509c4d44dfcb60eb73f40254aa577c1bcec7eb270f9d07b4e5dde04b9cfb41df49120dac2efeddf431725c44bcabc887a98bc5d5bfb7e873e442bb1dee089a00b955970bcec608d2851637fa5d0c11c88b5727c11fd2becd04cbd493c666b77eef24949390b5df72ce0fadc30eccd3027f67a2363fecbd4285becabbba57688e361fc1822ab6d1046d67ec5c44ee785a1eeac309296fcfe39b33c275e7e502372bea67d7e4b8899a573198e0194ff835b19bdfc91ed42687dff87fcce6997338d735b1c019194e72f9efc8aa4a2141f45371790d2a6a4c9b5b9dfddd693f556cf28ebf758ea235268d712fd9a9f1ee0e7efbc51f7ea49e15ff3cc3a138c00ddd0559e6c9d93f649937516b4d630667a2fdc345c1bb1c1d218e5bb96f924271bfc2c359e6089f136c68330eec2d46c3afdea2ef18aaf9c35f5b12281635f88c8a6ba24b62dba60682027f826b3117365b3ac7b37da680a707a9f955f98fa417fdb1589e36a471c4b7c7f66f9cf73a619885618466a4db06782bacf095a564ee030959ea4a0c4e18f861e0a61c657c2afa8ee3a97b98e67bcca8bff16d76769cfddc16d37d163f74691e65e79b790ba4d3624cd1f3afa601b50cd72a52067077d31a24145638b9269ffae4ff9564d2388d3f63f917a95d3407850b3cc464737060a4bc6bd79937ce2498fc21a0f56963bcc95b34e578621b9246604a6eab683367bde78ecb4edb56aff1e3f11b71cc3d5bc75279babf9bf726c96ee469eb290793d075066e2142fe4d03c09f9e4da606077404f91b0382baebe1513a7c9e78fbdc9fe4d53bdd50ba2e3d8e2ad7039e61d23928247b29ed788c7fbbbf2748197c4dd173c5576c6443d630ba44f702429924ff2751666fe2d34e266eb3234fe3e9714c66aa2bfc16cd54bf02b827a6f16e41a67bb87c8a87ffe9233faaf8c79274eb1ba74fe85fbeb8c2619975e415e60df508bfe7e8c8f4cc26e34f0367aa1070505f414fd9897f828378f7993f380e0f7b2d672dd2fc5df4cf200607f63d5a4b0caf05a001a9932a53b00a8370802fa03830a95e4ce2578f304746103c5d9b605f0d6bc60793165b214dc65e507c31dee160af1f207ca541d98cc67776368152f50ca6fb84ab326283d00f220a93e7c931e615feff41bdc56f73a73be4ee12531407f25887fbe693b0a4b6aab279ee25858e139838c1ab0404cd9407597d45c833aefaa2771760946c16f1e3879a9b4f29dd8c95d8e713f11a3a49406bbd7d6d828e0bfc98bd62cf1d1bf8e36c4725fe19941dc9937e89e32f0cdba3b8946c7da54063260ed9df879c827c92a529796c412ab0c889999c50729d28f042e0112978e7811e2a5c42fffec9c68668d577d89fb78229fdd5d97238cb33259b33c700f8ca52a25209ec3e10c742618e219105eb9bb6735cf6f1fddbab1bfd0c8b05c6e9484ce5599a819779a6b81c386730a87e39ff12023df3427bb02522f80456bb8e2c7bb6d948b8810d8a80acba3a34ccfeff4e31bd1c2671b0e555abbe6b498deb0a0d7d07ea096fef8ce84e4986eb8b7004141642c85faae28193616c2fe7b76b9de48db86600b8981c5f6ef747df083382c2f47aef577cb4346547b7f43ac0f41a7372332f2f3234289daea64c95c769769895c7340c38596cc9f5e31bdb5526d9bb24917b5ce6d354c4186632a9d6299e0c8618b5a2fe36eec5e37f2801fd6d84e7ca462385a1ac58f486fc1c9d1832ebbbadc41a3fd0f82503eccf798388548c348210cf69f4dabcb6f3e70c332acdf7a5b54a022e98a81fadca535bc7440f4a6e2aa361d68e3cfc733f679cfb2120f07f63cdadf67f5bf748a71d19d664e555f76a3c7e4614c97555f232439625ab73c0d8feab4f534fa91354acc90dccfa886b3e71e3454a0ad183c0a486c219122dad0c7488d17c88f88f53d65ceab9834eaf8166a982539b69b8bb82bf0c3b30e9a2e61ca91202752277e207319a35691a4f347bf1d6fc56190a3e43cb59e447c41e2aaa2054d3fffcff323a42789e3f6218a4c4162bd1e574121b69294acb375c5da3b70b8b010bd8a629ae64054ed83d63802813bc8af9782146efca9565d7d32ef466cce972964afc1b6e1190708292ed48ba12085844f6b3a9d5a31b0b2641271378b5e5d216568db0e19c735932d15ddf7ec63e91a59de4e3797dcc628ddbbffa20af29563e64e78313e4f2656c6f57ac414730df464ff451e603e5bd2d2b8bc6ba62eb3b2e1e710f20faf2a0c232f4f4c2053dafdb14bd6e4fac6b212e81d23f510a4755e8dab7e8f543303a1494be1ed505b366f28eb0a93c476f02605e0ca082c928a91057112c11d02a602c7a37623cbd4d599da03434f1884fba8701b9323c642f0dcf983e39b5f682e014eca3ab06d1734aeb415a714dca15188dd88b473b5b06c985cc481f4e96ffc4d54f1774d75ffa9a7d58fa7bc53d5bc7fc4e465a9d8e105900ad074a46ad711521a3d4d5bf278acea9a887ef789d962b17d91dc082783d0314f67e4952dc5e0cd507af0d98cc92ad91f6e2d1b14b395c70f22494713ae3cb38ed9e6028e859bb379fddde512295d8220cd7d16968dc3d7db1e81f6575a7a63988839cca6ad3857f1198b2054c4a775f756d2c3fd60b922ab2b34fd3065cb487ca5b0f19a0ec198a45fb2b4b9efaf8dc82a260a741c148f22acb2aa7b6ef0909eed5f7292bdba20195ed81014e2582511b88c7c30b7a0334216555d712149fa73c7cf034a6363c3fe1e18687ccc22fa64160ea2165933a4a7a09033a2a4f71945ac18e70aa68be25493f37e19d9e2adbda64a9b3db6314c47461ef63c69d024d5d1c9bf5ed32a350ef6787b722bd483e131a1eee097f49508e45fc519b2c0780bc95f0caab77379de21097aeab9e2cfc5720f47fca642370e17de94b0830632b1ad3a28c98c76776a019d3708d0a6cf276777330385716cc014e04894fdf4c0b52cee7d30bda21a1dd22d4756847447b57975ad120205f30ccc1900a5a0b9b439e46428b168c2c05350ee1c4061e7c4de9284aaca9b0e2ad5f19fa3314c26ee93a79b560a91645ed7a6774a2af802865dcd6eb6ed4621f96ede841c6434803764c3bcd27cbf92ff7ea5b76d77a40246c274cd83f37d7f3ed70481a387e1fd6deb790004dea14dcb062f3f5975943ea801e12887f364a76a8a0ece689b2c1d589ad60fbf6b1e3105bcf3b111cbfa39f6b01af73e4cc51f2162631e79202452c805423938ff5c1685e26ba5e0882f6d9e1eff0c465a5f571f3a181a20dcaacb49078dfdb9bc9aaf63d25d46c9cc683c352e40d1e19a929bccdc4a6b5125d2a7929477d57756cbdc1e9a3e72655b5029aede61c395a29f566ee33bbe66b0217b04c2597e4cd0218b436abbbe6d024238d08e4cecda778d6e3e50a5754689d3bb4aa8668f1bfa0a101dcec9edbeb730c6dbc1e83264ab96b6ee75f7ca748c876f72e3bb75f053c879497bde09092dd653237a79515b4d856563482a13e969ccc9d37a8627d7227fa78a7f8a17939bf92574aede9e7658a80dae2439228f95b2e3e2d26e29583da6b80d3cdd3d23f025729a2322dcea557d531583ba9112dc0e061bda12a9dc07b420d6f7d9ed44e0f2eb8eef8fe34a96180e4ff7a3d51a365a2cdf8add5a7569f0e01a2398c1413d3bce43134b0a43db1dc09133ca6b7b4813b7bbe553aee80265f375a0e8b0219bc710255e9c52199b9de6547aa4da874aea2d5ed1552e3cd13102ec625861fd9c0d25c9b7908440c582613b4a061d8b19611b0b25eb7f1623a2584ee9f5a64fb9165047756f7edfdefb841b41844546f918e694e2c46b278f30801e370da56434239909ede42d6f5b61276759949c9f9ba347ac972de480de83d49d55b2c10749f41da528f1750508b263a956a5d3d3b35417881bd9044a97dbca8c956d3719e38f34a9767082a2eb3a299381ee90cb65485f76c76848bf3f47ba156fb9f9f2f0c869f163b54f84583fc84e74c1df5f0e5c708afaf324d24dc20ab3f8d0516f30df92f869c4a4100e318abba7540d5ca3bac2424cca56c053f0a5837810712f9462fa8ae765a5139f4005d0b460f318aabff72a651fd6b4700946804265eac12461b7703386c04fc3e4904925df87d8d7e35e9bebd192d8fc1c04854d81f9b94d4c3d2196e4498f85067fb1f97fe7030262991fbefd912909e6041cb7def18c7e8ae85aece40418ccee42cb1f1843327d60f1ff419316584a2a67771480e89334cbd1a6b33fafe419f10d55dc34c597003f2ba75043be6a725f83aed41ca91c8d709fe780145f4201a76a54bda0cbd22030350e89a3116da16a6a6ea7b763eee767206d057dd10216c39bc1a51dba4d007b23dbf2cd6325c8ad3aa82d6cae6a5287806447dc143273f500998b85400cc27b350c27c262e0e38f0a50033e5e4a9cc95587d6098fb1d2bcc104df3f1f5e8989c8dae1a48540532045e742987591e2bad48df05036d30f35ef3aee01c10d983dbeaa944ce5f3406a141ed59d5fcb1561397129c48323a965dcabd89127ee444b01ecc83aef5a2466dd2fdc4b59a5ca3abe50477f42bd881bb9abef562a7761f9eab54c04f6af33eeef4bf240d158b0488c4c19376ddad59c4c01e8d59bb022824539e7a00c67a8ebc97a3aa9f582c3ddfede0fb47db07f297a6340f0a8e9651bf416fd3ccabfc12f69ffa81ab0cb04817cb566ea7c6f2e98109d278cc6552492bbc8b6aa67b885e9f38694f970f7504cc35091f20a97ec324b8e912aa3af3d03701c0137826aac74c548dd55a05c75323a0f950efd6d29717d2ee7414725c5da0660791248fee222cd0b0c02dfb61597e0ee9e51b809586e01c1390c60564554f1b9d0f1ac86a74fa59834d0ccbf386a0cc6cf644fd97b4e795990e53a5cca75f7a86dff1ef33b8deb8be9290a7da49805921d3ad50db89d1a7b3ad1c7ae03e2ce9642f69993c144cd8e5965c9ada5c5360098dcb008d84bfb33e10002b73616e34cfc076ec826d8cc02879b42f6fc94e501723797dbb816627ad5c48f7e352794feda0cf77fc1c65e4dd6e4010efa061c09d56e7ed6e8e114676b50a14abbad14cf2a664127b9199d42c543e5ef4692b9ff5821da9f9b6891bc74880d07a0953d504ea3b5d27fcf6d062d1ecd58f495a60458a4061ee440dfb8713b34cb5065eb18392851c69c52420a5b0615ec80c0ad1e54b7297504273aae6a4c434b2b83ebca82f80870862959315e11292a5a8414c99d6b1bdbc7ae66ac0468a39ac90342357159307b1580b2883b6ff98b4e0caf6f8816f94e94a0390493629de113ee80cc56670866aba0ff70c43057b0921eaaa3a313cd090d8862b60ac688c16f2731051c1844eaa168335b6e884fbe093f1ddc0c707b714d750aa4909a91523a8cd9504a2e3a20c0bbffb753ba4212cbd3c3e0e0ebdb6a6be818a149e114c5fbaa9831ed830d80196a00c4be9ab8d4e2f3c75266288936cfd0b27fe1adfcf500f4d2cd736165e80b765598297a57f28ae75e54480c96d3b4a39206f9f900f993909c28697b553601a150d33fd921d36425483618e00d07b953ca7a5eec7b9e0cbf187b6be811a159d0d30bf94e3e03f209d3066dabc90a71c92ab37bf6c8b1726ebf32adaa58b8a9ec1ae9d3b0d5df3a504f2df55f72c2c4c7d24405b55f81430a339b74e40e4ba5adb599ac60b1934a785ddd2b7a8140896571ad23c2038464c8f087d4d3c81902a14b282695f3027ca72add8388c5d21b8257243d666eee44ddb1b36afb76c05361bbba9087ec58f3a9f5a993fe467d2b8fd674a66cf05264c09a52ed99342145c9615b3b6e2eb85a6e2ef96fbff37f0286fe2189325627e8d9338f4805d089edf52626d7be864964406fbd39ac2ba5e3125592a7a338d4a5808e9b3961de474701222ed554ad18bea31b4286b9d2f2f2a19e34f0f71ce6136cfa5849f05032660014660e830cd012dc1445ffe19ff4c158de1216496446ded1793c296578baebe6c4d2e07faf117cb0a52250589914f2da356311186b53bb6bc2a36f2e43cdbec8114489f9e1e128f0eaeed7b59a531fd45e91f423b7a26e3960ce64cdff14e48898f806366b1ffb6a00468e6095034103464d86b589ff2bca59d92467f245fdfc69b034df08ef5f56445abd9f50cbdc19e80f0e55c6dcfc6d19ac5bb598e5183ec69d7767f5666599eb295c1ac3bdf2e735d86f094955746592928aad4b2ef59cf815107248a3cb00d62141aaae8f9c3a84322e25f1802030ad5114f6b4c7f20ae4d70e1ca57b2725e2ea060e5a49fca82bad1a209e6508bbfe56607cd1ea35ceba58d02c45c036ab4ae8e5710400b398d01e149323e741ce94282775c1cbe664cd0cf78bc3d3e3038041707c220e96dc40f08e2196ce00e3a9c734bb965461c169cfc91795d7063c9ad56944c24484b530c129166c027bda4edbdf7de7b4b29a59401be0976083808ac9353cd9e9740ed11037f37087ed23e38a1f688859f341d4faa3d62e2ef1663e2276d76729eb1573e727cdea8f6b0f7d159a07a778e3c69201557b7b97570cbac0320ffb02ecb3f9975200bde9083fcf31d1dd6330e1c30182c76e3062c0683e1c071a29a33396e1c7ae7ac4c26dd9df31da24a61e10db7cf5d2e3dabcc759ac970bb7c5cb7d9e7f52a16b9ceba158b62076db893797ec5a29d83532c729da8c6ec9c7356ba52d9f890509c89e26c0bc5ccfa4c0c75e48c0306c3913fc5a29c43aa830bc3ccba8ed0d20c7e9073ce3860301c19fc3399e40330b3fe41fef9160efe65d669fe60b00ff67ddf7798e5e0cbac73907f7e7078457b9bb778f0d3e79c33ec200c070c8623e74c2679107a99750fb2d65cb805688bec9e58c4fd070cc5a22d003828166dffb1c71d2091615907aa1067d63bc0f63f99836fc9b1bacdb1caace7c85ae726a918ece02a1c6b0f1c27ed66c57cceb3a393734a4feb653528ca681f168002a954e32880cdadb3f278904e4ac18f7aad95ea8626996c1bda27cf99e78c757bbef29c2e9d3d653cf94746ea107aed613faeb85015ce5d69f5e34f0d975e6350e0ac330093a513b0b4e795bccc4f9a5417327016c648bffa9cb3e452250a971780a85d239aea140e58a26d57e2eec46927416c192597a62d658ce145470f863e51b1b0ac3d4b2c2eb858cec04e9b0cdc0e9d6a082f54e28b022c431688aa3d4b1cc850b5b09a325e61853eb488c81197d031b353f278d153e61003570e3678814eb0a8180d3e586cf070830b8e4d887360f297847e224727c50f7705076b3ad8ba0000f8464606101a1ee810e703271d51661b0c415c0d3bbe1c84b804a0fb22002ecc00c6f0d89e00c14c8f2a7c64f183734300170c6d6200c16414603bc30059d608c1298814224e866d032dcb01b61f10e079293242842d09214c8c5066081509e0b020c28502362f16805fc0806d8c226518d9c106475c20817bd28028231a1cb0617980c743095d906c4440e00813c444800909909980190aa0a9c01516d0e2026d30f045065ea0013cc606c8e0001a1de021ce094e1e8842c2705443920d870ff48002e60202292525588204d298149e4832130215a8508a60e362052f580869ee61043d8841821ed4e8818cae5645ca55f2a20564e28416319b3e5c4ac3e446dcb3d402a7052d3770e173d2c483a1e9b3c1c9d3f224e5c40828259e744f4091224a29650553c0a062c60b3eac11e504860f86186e90c1d352456a06303424514315ae89ce4a1457bc2a6cd8e2062fb0747b963f8081c30f64e4f0031a3a401967a9c5cd9ee50f37e8b2dc273b6c5378d8828593a187eb458b962a5f36a53ed8227eb8466ca94870b967800869a64fc6596e11b3c970d72d68367d1844b9e58a2e21cd5bd4d02e34080a04e542b7d01fa80f540bed81f24077a059a80e34078a03c5426fa036d02bd40aad81d24067a055a80c34060a038da22f502a740a9542a35028f40985a24ee81375a24db4097581b64099969828d5483002165610810a21484a0169891210a0f0812447a4074ee8000736a0810c60e00216a800052620810898000124253cc001460d20e18891220c588002882460c80842442842c001689b284808062800902102fcf0d103041e03104000847604cd747ce001908c7ae1e1059c75f686da4a3fc51e33d35d457a2a7a818728b168993f188b0ba071e88efa5b430a640b412eecb20a75c80debcc8bf16e3224aa219e43ddab8cdcce11118990606fc799c443ee3eda6e0f762156a1ee6e88bdd4aa30d64becee463bd61280d4623dafee7acc5927903a91e81eaaefe69c75d634f0efbd07f1ad9a5cdad75e9188266dfd148be6d0b5b4d2004e2a83fd5662a9b2377c70ac3db66bbf7dd364bd1e527f74496ae935d3e6c7062a6e6c90e2829b2b6b5ca141b7512d464bc616639581b5026705576220b45d79c10ee32fe3eaf1c5f89663b86779858b2cae5841668a1d5dae33ee4721acd4cba8ac041ab88ce5952c54289c999a2b51b212ae4071569e5869e25aa8426f996ddb368ee3b819a2700933581967e08267909a82c50c59f00c3e34c1a2099e5d51420d6f3a2c35c0296ba001951916698466694a19d29431b86056451a5f182a2aba1b64f8029732bc6046c5ce9e659518ca2a4d68b629a680e14dd40da228226c6226862e3786219a988941871007331886336270010733314811c312294881d099281bb80045d40c9e405146a9894243e687bc67f608c65946899965d4112fa0a1d2c5940b9a28f1829b5bbef0c54c89d59e651497282d4d4b44e5f0b4448e3dcb176cb0c73dcb17c0a863c488f91123342ba2a4c2460b9b4549c58a8dca1927a0d4134ebe259c7861ba22382fdb0f984a96a74bc586272a559ea85079a2d2c2940e0d318a31a24c61c113a9295c40494db1028a14b76739e54c9d22834ba3a9062e70cad2a40627dc7456baf8c270b20418181833c41a6160d0c50c42d4104319058fb809d700d54df9d24319a58c32ca9319988e8627700aa6e012b426103540e9f095529e3c990921658d2dee594ea161fb01bc1dbdb7c746ea78fa88fb778bf591fd7634bf4ca4de9b9b7ea9a3f489d9974a67523321b66a032f332f5e84bc04f113a5890da0b0186f9cbc3650d438e902a58aa72e50cc38e952425162df3d4b284868f9d12234fb014a540950ac64114b285252663ef4f024ea095409e504ca05a129a2c062b6eb02ca666bc289a7c56dc249699b70c255819b70e2546736a431830e0a0264bc18a18316694c896206275f6ca5131840cd6ed061fcf62c9d14b1c96719597b964e76d8e438db611cf72c9dc0d093c6c66620b15a40fdbcaec92c90fdb474d746210b641f8b19e14ec2a43560d2b8739ac802d96fd6dace02cd1891796d2fa5df178469f12908f668fede7655f6c5fd7473e380f6a5145cf66bcfd2ccd49c7a0b1313a918fd3c08f3415f8c731fdd237a3c841eeb9008fdd535b479fbbcdeb269265228cc4b5da1d8fcdcb121b7f4a1ae22117a1bda9c635b6246dbe79ea209760d18555aa06d5a69b440f3320b546f81de8c732bb92cd06c02aa8fc58c6c2761d236dd8049dbbee96981e683da4c9a1bdce68ad0951fa1d1f5cbf0b57736c30c66348c76cff22906fff9f62c9f58507d289fb4944e47ccaadcfb11cc0ed33483a17c9262877b964f4ccc62289fc438cd6098c9308bfa89aa325b69207419bef85219b93d4ba72f9bfc65253871f9716ab2f19e65d31a9bbcd0396e0665e4b8321568a229a149cd78abbce9a87432b8b965d3174db328a3d093262eb4000b16512e3811830b61a4b890830d38f62c5b88b3557b962dc8c00550dc38712a5b58d33473ead9b36ce189eded59b6204605b3a69f0a52f108f7edf786650b58c0883922617ba76bdd9ca25d1dadeb1ed3bad7365a775288a375277f4cd188a3795bb6dbbc853b087ebab644fbdee51aed4e8d7cba0947eb6a4e4b340e09f77a63f2aa71c47326db66d26efc4ae90de396b137af88771dee1b99549f54ad97c9ba79e0ec8d966ec62ca60a764ece324a28c7594c0fd2a9a9da23e73c94a3534aee47b0d336932fede9efdc3724d6078d7a3da6c91e982647f1ae1ead8647df05e05b4d0ec1c7b714883dd59eb524ec1bf73a1ed9f37c251609373ee5a2c6bf34d9b3d2a2ee71e9284bef82e915be4a14427fe469f122c523eef44bdbbb7af48ada8b21ceb2c1106fa1b5cff67787d9de7e3c6108c1675d27733959759ab7d71efb23aac7bb73a86bbd63fd870d7f58efc7eed9e48fa8f0944671e948a1ed79da1bb577f26e6f0c0a8414dab85672bae101c27888814f4feb022e3dbe97c9a4290b747b7ac6118ef72d098f1d9e4cc2638f5f9d14da5c7832a9b2b26bcee83b5148f8a35193747b07cf8945c21dbe262d816ebd3cb6f79516f51d8302093599c2d2f60e7e78db1d0b1b1f9cb4623c04dc9cbe63d01d9b5e72d17341c20b12511b5c81734271c76f1229081e6311c4182b31d97e1f625dfb8e7f2f88cfc4fbbde045503f714a4cbe5fcdf43d7ca89b9eb8dfc7eca1ba8334226bb311fc2f7bb9c9aac39f342e370942c3bf796efa096b16ee2d65f2d11a46100e73da16f62ca90ebfa1b3377416c71c42c281e3c61c42ba71c3c61c42b261c3670e21f9f8c4e610522c069b434830d86b0e21bd5eae39abef9943483d3d3c73088967ce26d2ce8ece1c42d299b339849493d39a4348ad166b0e21b190c639ab5fcd21a4d54a358790542a710e218962388790c2212410fce610d2f7797308c9f3ba39abdfcecd21248edbe610d2b6e1398484e76c22dd399b48d6d6398454e7acbeced91c42a273ceeab7d85b3d972c135a2f1990f6501adbb40c23a53c224b50963065182c5041584a1388d977cff2082c6ae89a103b6dca54bb9174ed490b9f73257c235a6dfb146b58d76ad3027137028fb7df1b8ddffe4d7d17f5953252bde36e24fe1ee37f376a1d1ffcb273f0463adf3e6a1ae57d3c4b8fbab675bac6b9f97eefc11b71bf1775cd5e4aa5299a9a94d178d55bbac6b4bdf51d4dbfe0e7e85a4bd754ba268affde690bd4a48cba83e7748dbbea2c4db35820fb51ff7ea56baa4fd76a9f91dab4405246dd435d0375add3a3127b0bc46481acb54016ce54944bc8cd97f11d1a8e66d9e074a3cb0da74734347c995a4bb4764d5c3f46a130b2ae9b6166ad79c86d7aa2d56eba6bb69bc8d24cf72b3709427b95814dc50e956fc38656a25fda75b777b0c87b2b9374b7be4cae003ba973925a391232b7f7bbc57b393956ef02e77e8864f4c76ea4e32f5d938addc675bc6643d79ad0383429fc987efdfb0d55dfe1519de7b121aa87573d3c19d3aebb32a94335c904c9e8f51b37fa5f52484636fefaf5d44a2f5d7bdd86a66a5e474b82ec7c09dd54c78680e739781eddfaf89dbc84b28680d7d1b24dc5a2159c39be79e99abd05b24216c88e87d16c82a6af9b60e33cda8c9306804f1accd69e4e833df65786caf1d89b6c5091083d08c66207ab88a4c9462cf69812130e0efb8d14f05eda266042f2d2359fbf0ecbb5251aec20169134bdcea483c360afacc4c4e730cde4f31bbfa19b9e72fcf598911c87fa39ec93168bdd464c3fe5386c72f0bbab26b98b26e8e72cd1a658046faa49d53d4d2f8e5a05bb49d93eaa43b62dfe836cc402d97b909158207ba06c010b642fcb2758207b00acb0c90e72931507fa29c7f57f72932034a51c9a05ad270dcc643da23ac96eee5527596ac58a15fa653fe5c75eb7b0db5328ebe3c6ed6fafcae48d5cbbf1a77c92aad9b406fb537eedf5a77c1baf0cf5bacf6119ea751bbf91a15e875dcc47cf50af4f0bf43c693e36b2a7c9240bd32a6c9bfe95a5ae5e1264537dd47d4e6daac6fa88b9b946d0a8b0ed7ab049109acf6d1c6bf0b0dff807e5a39570fce1b43e9e9a04a1e1b88f37e79c739ae08c09ae6cf086b73e9458a0d1fed833688791a46194582ce46e4f937649907dfd84e3361e821aa9eefa271c879df44e52355b3fe1f8eb9f263d9d6477d52a6cbbd35b7068166e5c93dde8d22a6ce44403b393898d87607da48fb6c07eb7bc8ef1abbe2ad3066f9e531b9659989985d7412a1a79e94e24616a4fb1c8c84b57a65d7596782a2c0a905ee602b3eb7dd4d8f53f3a8ed8f561ddc048bab6cb045e76bd8fcc882abb5ec79d4dc0596957e3f515895dbf6202d273f182a67a7963a5a0ae141a2c55c6568513d309f1c6abf20d21a682437c117e613262d75fcca22ab3fa0267acc222224ccb4d0e1167e858d929228c104f11687a8a28c38505cccb8912c08ad8f58f95e04c47c4aebf4f09c2a835f4e9421b3f6a0f72b442c75a6537ca6c602465bb04f366d7eba8a51729bbe6791e26b8d689ea14774e547b6253f43951c5b1e553b1e8a7a27ef7916635f9b32b185234c1449b4cfbf5a0a89174fdbcdee6f8eb53467afb23fbf0a7f6f8d1640e9d446853fd7ad594295f8b5a8d4d93aaacca6ed8c011e28073239f60238c18cce7f3d1590255460fcb6ebcfdfa2b1bf5f0b83a179a9e3c02cf199d9c1d6e47ebe49ccc1a5b5b4b68e4a1125778a563d31f51067ee10d35fd7c3aceb3455e38e293f786db8eb3cb41555e8461776b10942028425a64e0ac207532762fb08b19651735e6ec83336fc410420f82b5522b82dd5593b2a2dae96b6fc539a76d0a620d4ae9bd58b62ad65a8bf1ec02a68b178a8f29bddd5c24e8e244e57400679d73d24fd102f1660d1067765dc2da0fcc998228c38c2f3679d7ec3341a02008306a04a125082c4148d9358816bc33d000c128206e00820b07486a054a0a65a24db5246befbdae15949cc0711cd759dbdd7bb9241aa8b2eedafbce765df729165924dd08f75a6befbd5cc6c70aa8b28a801f171299cc474703fbfa24f1193b34ac74a3eb32a11f96c88e60c422b11a489254abb4494a558d098261245dbbf688e1df8df127ad8393e3f6bb37009cf4d931ee7773dc274d567bc4badfdd019de4b163deeff6bc4f9a071fa1f6887dbffbfb3e691c042a9fd5b1988f5c958d7cf46bf57195c4354e98365a693289cbba88f6bc975e3af2d49c12a441900983cc1764d69464d4b852261921c818b15d5546a689edaa32b1c85a7b2f1932656243ec26992ccdaff1043ece4beea990797baa91867c46363ed212da66e38b30db10d96a4fd28d978cd9b0bda4c3be22cc36334c2e3d41c6cbd681e76da6db6791abc95a4c84f94d54afb8648526175a60fad1bcd54b6a9bb47bda1e829c18a3904481c1519b4e61242b6c1c45a144d1a8bb46a98413a5182e3c6e18bbde314a3258ca27a22e1c7a4b409b435caaf0eb36a702d44981602057870c757e18bd93a110581098f1de2704a8d36a08f5aeeff8e0b66d0fa8174f42bda897b6973fef987ba7667b79d6183cc1b4b977f4c87e567104a23d750a74177520f8caf6ae6c9f936fde41b3b9c788dc73bf9af41e3b5704e3e9ba91bcf79c80b3b95b27dcecf017f69b7b6ef34a2ce285178570dfb99777deca4721197e7c4e0cf6b95d1deb5d8ec1fefa3c7830c788848f3d7c4cc7605a84a5adf31891d7592cfbed3ef73cefafac7357d6794f2655f7ce938f5a9fdc773419de7b8efef169e523eff9cb3fc2107bfa7b9753a0db1efcee0782ffe07c48df93b60dbaf9bc10b87692eb66701ba3c3fb262ea03b772b825095ddcfa9ee0a38c1dfed6e9be5acb55673f4cecae3c7be97ead4dfe625d4356773da30f15d749b4353cabbb5dafbf42ac5f976d786f0dde25ff6203123f93d29f528f5b890e46e3f02026a8feef63aacb5a30b88917e7a5d9559fb201fc6b9ef9c33341c131a384ab0eec2a9156a0f4ad636f7a9497b255c469a5465f5e1deb24e95e12b49f2a1da5565415323793457034ea2f10b51982f15e3cd23d41e56d7eef3642b1079199520203c3d39d11059fb638739d4138dcb5569d78dae5fb68530bef435c90f5a65ceea83881875aaac5231922ed797129cf48571962880736febb69dfb100410cd213a87e8a6dc11d7e31289454b689ceb537be053fced604eeede7ab77db1f16344ba6fd779eb5b26bb93db5597ecbed3d444191b0c37b1a8f52e8ff7597d3b9d7346ce59158b6c45c0779a5c0a7f445184a5cdba4fed71bbdf1355f137c75acff9d4f94efe740e5e47c75a8f11112fd2a0e60c00d9dd9e2727b3deca222c6dd6988f56faaa7c24ea4d35a867956ddbc34dc7865c2626bbbb734328d3eee8c6224c279898c02e2fa17190964c384c4c3ba9b5bfdba4707f4a7687b424c84edab687e43d692b6281dd1dc792209b8a0958d2c16972bbdd0e7ae208447b4e1de417525184edf76ee19cd15f1e73ce48d52e1a3267f44ce8924eed986e410f0c2d78ee734f8fbcf7265dfc39758380b43a317e155e0cedb55693dcf157994719e3eade571f3fc5d57857f7aeaeaa0b37f86111b8d77349b8d6a515b55c942870a3ea3ad5491d7cef05bf5d95799431aa1e923faaab4ab27baaf4e78c3eecf2b418d3d1b600ac32da755dd7755cd775f73ecf3b97bd9fcd6df73c6fdbb67b9bee964cf0cb28fce08cc24fd0970dcacf4f10f7feb85c5d5c231365302106136b9a687ae1327166cb6a8f0e0926c4f8a8341b54c558c97ba918708a609c251352f62ca7b26c01ec598e19635b4003dd2d0aaa629c5546492a72b4e6a02de3fded829a18f161468c6a8f4b373ebd32268c7d5f05382b7ee7bd83733749adb5f66a926a926e22916f7376ee3bc7b845b4cb0a1861eb98b36a64e69187919c6fc8a9a6ebc6f122b993562a543fef18368b9a33f6f72c91107382375b68cff20447ec316bf6077b964ba0d92092da63e277dd3924f748a2ba3c7af7529d1e46fa2934d74c09d41e36ebd833828cab7707df913e36fe23d341f270ed1177e1a827d7a9ee6a65ad95816098b9306fdbc3fbb56dde0eebc422efa0e775a0d779777361b661ae9b2a1106d9a031e3fdc765cfda5a67fd06054f2541bd7d77c73a3cdd778e431d34c448ca36d639c639cf39fe8f90475fb14887874727e11dde8a444810274e1c347bdcc93af9ee9cf0adf0ac1c7ecc2178fb2ed424f80d1cab6cb4e1528bda34c0ef344f3a3339dd6cfab3a9fdbe8368d22c99710eea2f1f71ef4e43f2d3a4d0feeaf45d587d8c3e58b2fa31cfbcaa3a1eea805f69f23b47bac60dea2fcf4d392d748500ed838c18c77b9ff60ad9b9432b1689a08eeb6777dbb98fe3b88dd3dd9220e3eebafcd34d9ab78d9261789ac9ef902e0972ebbd7462d5f689d0ed4de669f267671f8ed3a40edde8ddbe713f8fef62c662d1d6d11fe4ea0ebf1fd60785a25142412818e7c711bad1e5e2b237c5bbe81673901023495baff5ad30d41d9875aa6cc35e4ee2dadb7de80873733ae9120912274e9ced537bdc5d6b5556c7aeca683767219971aca2111c0d1262acf73e394c8ff8d1d212850c3f5c497eb424e19b8483b4586a6d9b5b83b4586a2bbddba7a236b80255d9674feba3155ec79539906afbed765b47df6da758f2d177269b66d2ee0da476bb1dbb23d0de6f47e03f91ac7583a326936ad781dbbdf86a122fd536ba6d14cb26f1bb7c64cf64df7c91d07724adb249bc7145c8baadcef656e049efdba6491a3541bd6992d3db266ef6dda59bce57c786d0df22f4f74828140572bf697b49d6712764fb15b7eeb2f4d86d611e3539d708e93eb1c803c13cf7ddc07cafddc11db72ee67095bd1359ba21494aaa6412ed3e7d74c9ac43a15020780d39d71cdd6fa7dfde515c414a528dbbe3cf7b2b4f0b744cce351b7f03bb7fc7502810aac9ef9eb7e1cd6df7debbb94d53287407be4ce892aa8e2640b3c34d4f8fb388b1b241d8b34cc24d125fb66ccf3209a89dc4d4067778fa338758dc75f66c82b067013a0ea60ff0cbf5f54862309705c1d0f33c2fcc47dfec3c2f0c5fa75f62f751f8af087da7c9babf8727aa96ce2cacb53f569aee8fb4567bfa2824bd935693176f4b35262b6cbc052c30e24c9318b65c41850aa2a8ae6c19d326aa0d531a4be8a06123031b19b059019b2deebd3b76c0dacc0e1a54e082cb1316fc0046091a3a2a90ec1a356bdc4cb1a9114cdc7174d924467aed9a3454054e382976c884146c9a9cac0973860b35d600b1c11cf6bc55765411da820b7c31be343466b0823245b0f1024a67868d102d3653556ce0650d2d35f0618935d6e852c0e6068e0d0f52ba30b808830ba61d3e44c1268d931d336cb1c69a1748b005182da0d831650b279aec88d2dab3dcc2cc1650ec90b203ca0e2818632c05638ca1f0ec596a41841634dc90051a38642186942cd66481e60325c66ffa510b5b4ab1e73f5862ac65137bfe0331e5127b7e0e81dc86b76ddbb66ddbb66d4bb3831b1a7cd12587285eca8889aa200c4e64740146142d5aa03853c375bcb8811733dabc81c1541764ca266219258506db0a153da8c1e50657b0a07b028b3328166840b14135c801c6932e6caca81203369d1358783143100d9ac61a039d2d60d8d1640cf72cd350b1c3290d133b9ed29c200d1120ad61677de0d1de90ce3bbbe9cd29ce1f0f4ca0fa273218b6d0aef5549f80c6483fc27d9d3540cc780e11374e614f7b2bb52a72697f01ebd7b4b36799064b53cf9e651a2718c400c60e4e51bcf083161460d1c5c3020cd4fd7f8ebb26ac7c3c3ce1eeb550601175b1a8d2744518ab2b6c3083156058b105973328b5e18a356964a046898506563c61c598d91560e4809ced79f2677b9003888ceea827b3d783f4117f58a07a12ef793a8118a13bea4998b38a4fde15c8790653b7da24655a9190c3364281502cdd28f3e06eb25b6d72b4fa225183825bbac5943161a140e814dd515fdba841ad78a18939ab27690ebb0a608d917e09bd00d61845a05e689b393465b95aeb69166b7b90581f9f40f6554d0f8ea9c3fee620538725daf653db32794d6698f16346694596b20a2382c8b0e2cb0b3228abb0a18a2a33801304a78a261ce26af18558bdb43359497a7f846f871c71f7fee17f07bf4ce3eced1fdd2038456b6b772ea9ba6ad326d58da92882e0e7ed4f18aa549fafaa9cc71849a14d647d048931f250a9c2f0f334488cff541f736aae3e7e3eac218c9ff3a178f04eaad811f1e08d446da4a2713658c322234da29126279553a8418dc6ab1d0cc02ff6f6895590666fc74b58c80d0fce1ac2ea24f74d2cb27d92f6e2b7af32d4694b35b216c24ad76aab33991584fa5941507de299c32e5bf1f75ec81d4caa966e5cee5ec5a2ee134f1d23b22f96520565ec1558ef9e3cca18aba55badf5081fbfca2024c4a6eb84c04e889b29352bbaea446e953b0be4ddb31b05d7de7412d70ec573a73a488b91fcc1719947191dd771b6be8a4482bcb12a166b6419b13ebe356aaa5b44c273b1d811d77b1ee3deddf66425969411eb3a571a5f93325a5d47d75a5fbd9673d57b726c7b4f6cd3b123e3ed1fc07a8f566a29f5dc7ed2d46cf19c5256ea79ec48cec79bd0eac95259c9953b0be4fde6696f6cb2a302873dbb14c447815ca8d2b5255a4d8aae9668abe9810ef62cd164d968ca6c3176c47ebc093d67bdb33e4656cc84d65937caf99863d43a4bd728ad4524dc44234daaaf94d493747347ec5937a1e7741cb7d7723e6a23d6afaeb5ced25624121ad9f9dc463cd7e9b119dfb36e643f3e288b31545a29f55ce52adaa4c0abb292ea3b42c4779abc9be3b873bb23855c737a625e42396f87ef9680d968751dae735920bc6d22110fae08e20a9ee7c87890314e1a8f96aadfd14a5246aaafae94f3d675b492eaab9332234d4e393ad6b5748c7352e9d8f758a78d8c629f3ec2fa65fdc61e30de7ebc655d95c757d15b8dbac611d9952ae9824b5e650d31c5384193b7674945952e69446931861a4c6a58d03101a6c9146fa6704393b2076b56aa9f349b4948816eac5370c0a435717772128456cf9da8727702c598fdf6bd1a71ffea3d13ea3d5da3b4dad43d8c1df13414a5c58e78ba064569debb1b7d6288892cd07d988dcc32e211a11ad4867b585f754d2a76a49ebb513da76b52f635ababeef4b440429b6bca75db0dd27a410c8149030f52bc55cede493b9513fd6afd1ac0e518be9320340feb23f49e56a29fb42526daa7d8804933526feb9644c5720488c65a29a6aa684489c93df7cdbaf0d138cd74bfbd8e31fa983edaa69598e0dfd18ed955335d3d2d90c5126693e3cd6ca9519aa7c4a4bbf70028136a5094d6bd09a57577a13b372f53a7a5ee39cd8426556b914d934b8e92e0578d023ebd127c7a229b56825f7f330a98da59af6a098d8302be1a85fa7a2676c9d6aa86d01938e0f77df105f7867b33a788b271e61451db942cdb942c47490cd034b5efed99333a4abe8d82019aa6b635f3e628c9ed42aa33b366571a7669146e17524c5b8893c14c83022e87a926db9ea51456ca28b49465c204855146b1840b416bca3371ce9c31069c3f9df5517f4fba40fa39c1b97acd3529a31004b591ea56d7a858f538f220e3fed34d55d7a48c787acef3daceeb29fdbd11fdbda7f7b491eb56d7ec5dda8805e24e754dc802713cba46a46bb740dc7534f855a86b52de6be1bf7bda687515f7d5e9a90e754d8905aaba46413d2d10ada7f5352923faaa6b4c54d72cf0da78d6d428c4faa44d375ceb9346395ab8cac9352923f02d5da334f0abb3b252f8ef635692320a35cd6295c2f368b3d29a7eb1403cc818b5524d8a8449c3df3e699f56c237d2544f53c0250553fb0fa0344c9b3fdc6ac9560e88a02dd86cb185150f82f7de7befbda0787aef1559e238de0b8aa2a8fa15c14f111441711445d678a20a8ee3388ee338b258add63bebe3f5d6c156265da35095b56eebf82f5d65e32852718e5a3cce2c16164f1031c6d8a51297c2f054960f2af1b67e652bacc9d541bccae291ead4b5319e26c05658a54ae2529565b8ecfb9db28c15d74ed8c3b3dae8576519a8bd7a584271c6bedf61a9be8a81ab71c43ac6d23150c7b491cf61f778cca408ae34fec6fa8db10eae56ac1b815ad4e409fb7e458ae756392a955e81fa28fcea44555cfd86e1d5a46ba7876747b55aa956ab202edebc11bf3a61b36e3beb03f6f1e098b15ea9ce3acea1e8da57f599335bfaa56577257189b48442cd06bf7a3de7ad1c4d8e2f55a71abf164bcce40946ad7c04a65de3a793b8c4d545708a4531f1ac079cf4a8542cb7953d4d32a56844000080048315002028140c88c40181482c4dc32c647e14800c8b904c6244154a22418ee32088814806a1184388318600630840082169ca46001418201158a2d577ecb846043cf14c7c438620918a066b84dc99b810adb5b4fd522608dab7562a9c3434482543684e2ae184f7720053e0fa25bbb099c630e86ea9e253d24e22cf2a5520fb06205a3b3072bea38bdff101383d761ce609962d3c15cb319fbe29163cfd34a72b841244ec1567e48281e58e78dedd6962e25c31f5d174f9984e107ef44b6d9597dfa579430bb81e119fd5e5ca611fb0048bdd20c01136cd6520cd1d5d2f7680965d00fc0dfb2ea7be4641e0fde1537a128c00e5a801cf37a823355a3366cfdfa1373c326ca6440f74b9ecdb7a7fa4cff0adf64c808f8d8e820dea28595f6a786a5019bdef8f85b0dd0b91d8ad6f2c15b117104d2e9800f1e4f54331d4ee7fb973f5dc16bb608988c721082dcb6c09157725a4d5ada288a1613cfad6864e2b49e5e6d61884974da39bb45d670f293140fde30e14e353c9c228dc34b30adb9e86469172b7108f28f01d92d6ad27832cf6c4bd1e7f026f380318cfa1f1ea6857111a25e84f96a5eb799640d1836f89bda1c3b99c4b4a188072fd52e4225eb2eebb54dba0bb4e5771a738717151e011e3e7822503212650da0f504e75b55b6d0672bf9b9e38684aa5d5780923fc4ffda11e942e141755b0d4c3db57c73aff42cbf65bddf4d9ea6226e14a93d5401862af123730a1d581ab5ab4540e6fa0a46e2ba4cf3e1ae5568aef82369a1505e04df7939b6f3a3a9ddcf5bba07370867aabb44bf228e799f37739456c8c5472c455441d03e73192f4679c9155d22dbad5bdc11690208bc3a31a55c2672d0bda8157957f8dbb8e178c961c6e803e4b1fa72f35a52243dfba9e6142873785c9643631bd9acd931d0598658d2f025e1ae4e36e6c6bf4afe3e3c0b4654e3361da24632834b6c04764095429bbad47d91ab1e92b163266d15577fb439948d46f0e6b55dce9a6c32dcde79c6521aed209409fe2bcdefc98b4cbdbc5b23c4cdadc6d1c3b8faa7ba3e387c6b1bf7f1193d675f9479417aca3d35c84145139815c5943950309f8b5767069cf5a6c828a2cfe29f5dec48261ed07d416bbb18931b4a70c3b98aa20924623461b92225dc71330e809ec9e420a6cc45abab3d36c9055b31d17ce2e59a1ec4f3fef3fdcddfbe8e784dc7a03318a3bc16f6965cebcabadc0f45734ba6c0a7828239a31d0d5e29b2c83ca48cbdf03a5c1c0dcc573cb47f073baec4a8579203466d78788264cdb333e353061ef40b0976bcf502fc2a95a18cd877b695c574000df50501315e9905e2a0e0d0eea9d868795231005a79b337d7e4c7bfc50de8315579b2ef2cf93c9feea000cf22632f0a3bdd2f7e7db25ac11a9f2b9520e7561eb6794217968bd43d754cae53266c9ba7a84cbe3e823e2d4ef9df0afa1d6b7fc9dc719a6933bc89a3ea6075dd69131473f3a15c54f8a59726ac4cd86ab6833b4c77f4a57ddd59ccacd97f8e81f52dae0a6feb685684bd4f798dd99eb0b492d364b22304da8f2fd6a6f342a3ee8cf2ce8959f6078cc9615537dae85888671579d11596cd552a32ee40982e86110cdbbd534333e5b4b0d4dd821d83fdb99434342e0d6a4220a5d991cd6ed3f1bd32355552cf0455d48161ec5eca4394e0d91c76b41c0f5e86cc5cc808471854f70a0e83bbc80176579824aaa1c05a121d56bbc80abfd80d42829f246270492f334d6590c0213fc29e1630bb7ae9d2169dca6a4e62624281c0c7cf88ab8d0c95b4e12ddcf76474c59a4cd54918fd262a38a67a4ff30278d39a4cc396b0773f2845a70d8dc884a7a4e94ab1f1699e044458b466b8f7926b6762e5cd44647bc7977d9600407386f4764cdd8d3fc5a6141246a6c1916c75713d117a8088d5c0911d5589e13a9f905d9691728878f3716430500992e97c55ecf3aaf48426eadf3816bd7015f66d469fc836fa6dbc8bc9763f9b34929ee790370359082575303bedae2ef7100ea15307c9124af2b487f4c36988dce6dc4c1110ff6cae36a44dfab582f39bae77ed0bffda5875a43d70b39df6e266c190b6664732cd8a59dd5cf99af8d22c50550ded7e01e467aec7174e46f0eb511706ec5bbc1dda545b963ae2be154d4867522a3ff6c4bde7ef707051ab4777b96d2e3796cc529c578f57007023492e112defce4105e17836e5dd9faf2392c9e152b364d24f29196bb3eadb04e26c8b120eb458e02d5570e745c8989a860cf2bae2d7c527fcd78fffa2a0ae4a0cbcc3e5dd689b4b15e4395bc90a990fe72c06c49d8d57a74a838c16f50a422c023201350c8e2eac4c65ee0b6ea579a611859be6da66b3a8ebe99366857c2cac83d6303b83a1beb989b578e79c505a0896315688a114a406c372fd4a36d40ad32c24d29f665b90db211a8b7311484049be543d6035c27f10754b1bfe2ef3dcc57923dab2819ce3c2de0002208ccce3a89c81f3ee8d88645bc2c3bfaefddb1c286269d6aaba2966de2f305a97b90c64bb67ac0e0933cc4cdd861d27f8c54df2e4d775d8d5ab7e48b825ac5aed491819c0a74168230109b7220a1ce231a59dc2c77149997806544932a2f59d4eeaeb15bbb1d4f064949f863e4ee640babec0d969ed3c9f51a1721015759d104e9b6f83bdd3f2f4eb557ccb8e9ed8afa8e211a48defde0c42e55bc44ad102611e5104370eca4a2b28bd1216debc0a0bb659fe6a8d4b40f2813c9aea27cf7c006386f049395bd50c77a0a83fcafbfc79600953a9626dd3ddf0e30ae36e7827ce8aa93aec9a146e04ce289177cb2acd8d38aa80d2e7da2f6e6bc688c46ff53b5494260bc9ac10ae3b9ad4bbdc0c2ee156e737dbead3861741e58f12b03402c1bda38ac4b9ae58b312b468cf7e03e7a3d0769724fd7a24c2b6c37026158e80ff0fcb65a31cb1031f471dce4f2719bd4cb56773b013326b18cc40e1b982a374ecf29673c75364da7445a747e6e2bdf2428c8e7137bc5ee923c60526eaac1d7d89e77c983a9469a43299272fa4662f8786957720f988e1e49071002f79c4536547ab25f50cd969ff643cb502b64b0a7e70668926d1b86d0193416498134febbeb97d571d89e79fcaf044908a129f82e9b0e8911ec39bb08061abe4e224f8487ff0394b22f2f46de9619bcb45042bdcd3396b0be0d337dfd1433444775e6c17be52892cd9d65428db381c5879bbcd9699cc0f16190c1ecdf217d3761136ca413878bb2a874f2c5a5ede8c4c1940aaa66946eac4789163c02dfa94e3245aad9b124897c8a9098e444e66e1aa93990f1437d62b2d95c62fbaca8615e7c0ee5ac76887f2eb9865b3dd9b837adf70c69bc516efa27db985e04bfc04944d5f1d81d6b270ad73cd80b2a72c4f96c243ad7c57014fced287e3055560118a88f8c4f07c266528686030f458f58dad06d2e6e5040b411213eaccd3a820bf7d82fb109b8af28b7b86361445f0488940b6f7ca48fb0fe93c716b6c3eb253888830e42681674514552f80242fb5d08dd0752374e9eae6ac68387d7296c62ad4340909c900f0c25bc84b6fa74884b502787256d75a6a74d780ea423fe456ae079f0da730ab43b0970d0e55514f9acadb6596ce46841effc8a0494421cd83d84da3d50952ddb4e9f3dd2cd4f7d13def6a6960b3948dfad36577137c589cf2240a95f60928676ac26b6f03c1a0771839728595c2bcd42e0c4b0d205f38d120e534a69e4dc4df04eab0a3160a6b81b598f620b8313bd4c660ca0480f4a5313b02c324a169b45a5bbf506fbd36b269bccfca182c9edd56139f1bb574c15569ffee7097b54de6cd526308db0392cdb9dcbe6586a013d4d54b0d800c1143cda812d4014206724322e23089c2cbb3dae362557b0d5fbe0db21a4b8cd069a6bb435313c514b6cf1bc984758b9054a5b741be6a67da1e3f13d3b2657633b216297ee20db866a7ca34ad6c9a011286b180d5e89d450854d21e6e26f06008ed6b486bd635e50f6a71a04467871806996965195405b05586ca45337cc5245210597b0770d6c9fb087f0841c896650604d4a5be54db55b682d726e0045e34888c6cb3f44ed21b78e5b7583dfabcf1ebc46138f6b59a30f816ce2ec9288f7d129591f422e1264018696828b2e5498d2738403ed8f280b071c74dafeb0ab27a5bc22b70c1214301cd0abe059225c572581aebe581c7b71ecf2cc7481f0acbdcd3e8ca0f02c829f2a9312c5bbf4573783cdee6df8aa512db5e418c11b9840b975859a9ac3bb962c74f92abac648af97556b435159b6f83a4cd98651fcf45633b749aaefe26ad15ba565d3b922c927538524f2e0686e6be7e3879f6a88436a4b798bdebaf461c335563335d7ec4d4ef810b524d4c883cddd8c1656fe480be8f63bb03569ddddfaf0c2880dc1d17530d9a832a5bef9ff729aa5cbe59c75372846a79ba3102d47cba719215c25652ee3ac264fc1b496ae668d85cb7083d4ddd77c79280f4f5cbc19c5c1dd39b1f92d3acb8d83d865927e873aea288941e04f51946ccce313c62eee9cfc26130ee18bfcc5a02f4ea19eb3c0f2f4f740366abb1fc199d0a603c90fef13c3b3ede3d4422b714dbc150ca278f50a2f7132e0b6c3d68dabcb3af5e2bd93ddd8c013ccb24e3e36cb483ab1f5fad65ae8a24a135aeb4516cc29349de02b2334fc42e92ad9e106674ce3d4d0287d80293b2897382b954f8f040e67279e4c1f116b6b5b777b51e2a0bc80438dd2406c2da00cb04dbaa2c3e9ea9cb7315022fe5bb03025fc85e4b853e5fd49f7ae0f83f83addf427630dafd03c5ab391734f255510e166c3adec2325989a51810d715e031979de12e289ec574c04536aa56cac1a1bbab7de94b918738cf103b427c5751e95da33b2a760d41148c411674cf6a0542954a44307ebd4bdc65a653af4f80165e60df92850dec7a84588959b929f99fc9432ea48df5a593fce625d3e2ef433243ece4230cc3d015d578b41f183e8d07f1e999aa09e8beaf6827df7cd003e430b11a8a89b2097b84662b77b1a24840537f1906c183a34f7e997689597db11e924fbe94c22e443fafcdf2050040fad4d9d8ff043643a136fadb908f8edede1bd265b7cfbd621eb9676d934917726cbad248a53a33caa5bcbede8cc2901136bcd575940e08b076b0ce328b516f9d496a21ec416c93249275e8db92d267eddf462c26b36caff620ec9ca86b48fdb624a6fa65c2b86b59345be98ef171ddc0927b6c6e009c42d0a32b06721b798e82b8ae916435f93fd95bcee28a8b64cbf8602d11f48bb5bf78f10e331701629ec2117bf278912667d8c628fbde47f0ded3068d6a5c4c575e7b581e920ab8341bd7c0d6c424059a490321185c70336757bdfe1df9c4ff85f4e2d9cc6dcd82c54375667da9f20bac3464386d65da88e5a709231f7115be4eec5059ae911adb158b5084448aa5fe3426e4a2e492af50ab050a146e7b89ded71c1d5938fe3fef170b84c08ddf2648905bd214df6dd94398980d2c6ef7ca0e8f35a3b4d2c78dd6b95fa31a7d9fabb35f215dfadcdef395905b1389aa782d163e49626fcbb8b8187ad981b3800d331f2a384198b98d4c6e095db5e76c31e0949667014c98efdc882d184551cc1af8f608d2c18aab8063491f0aa27206ddc796aa0891218c583e67588164e6ab23f3c18160c143ff67638d85bdfca873ea2b7a95262648cdb8a3b2cf64c0db22fb8c848d455c6f575d2e9af63795b44b10eb773e293757b14c4ed552517f9baacfe780932df19c18251201ef67d5a56666e4fe7e06c3d622fcf2c6331fbbe5790353ad622191c3145436e43e8b33b8c45c09db93f80b77b23ec31f25f6148c466f41e4d270b04d4c0beba7f6a7788f79c9e7f1b4ebcb06634dbdb20ca283ca8a8596b28053e56bdd4723943562e542c2c88d73689e50b096d78c74f04390e3eb10f54097a91ec29928a9207902b73b037408594195ae0b9658f3cac217002e5ab71e5b448a32175e4cd164e355f11ccd26441964dbc3db7eccfb27bbb65679789a10ec109edbc60a2e8793c842d7b0c0a2219ec550c8d9d04381a431a41e1d4e5c7f9f9f192be4b2f188a223bf0f9f109396eaf57f0c55a5e063b34114cc9df22d8ae2ddb49e0c360079a10bcbe59624c96bb6202a50bf6428c4363d516ca8b33e750614ca58e1bb72717060220fa2d2cf3a2d4e72de9173a9eab61f8f464a1e56edc1e1d0280a2f7594edd1abe3c6ee2c8ed41938d4feb4d50574d49b1168e2bff7d74d76e790016faba103c30900278d58d5ec2327bd980dca03c7211585f13d78f06df3a7f54beac95a8fed34d49db5a080ef5d4242236ef2208d0fa9e731b29c10e500972d776aa751db54ed50a79e232b253bc4652656eb74386e08c5931e016adbb3d46d735d1172eeec6ce23b15a4de1c318861f5621cefd514f798118b52766f7245f93bf269f7a6eb501837f38134c470a4fc591c54d0fcaad7984f767351bafcf222cc1916d1dec2bfa0f188b2e62586309ee71268d6e4a2c8307f44485419bd5e3e36a4737425d4ffa2078ec0366bc60bfa4e0d5179b05de949651af3ff17f593a07442d2f407353f0dea9154f620deb7927b5854cacb40566bf67c592d5896012f2b8395ee4cee2f65a723ed0c776a90c2c24ca457be678511ec67cd7a19410112c472848eac9d020e5bf6c0d88b2606806722dafcb323325703efb9b44ce6045132c3a5cf93b355d1d4762dd8cfb590df85e192b8d675d8e54b99446e915ab480321634036277003cbe49fe2606f5366955787a23ab085a59306b1f3d3aff61b5ea80a2095ba25936e8b6822253b0155ae797262ebbbf49253568035cf625925c07087d8494088f983d8a3b5ce31749d8e42ea0a01b4892c48a6224a17904ca21798c4ccb9f12b3cc39b9d8f756701c0d66aba6c60043a012b81f6bfe850ed993211a5df900b6a8f473d762b778680b7a049ff91ab97d520cf4924d5b01d6bb42c4466d4d2c63725f83ade648f3bea9aab74f96b58812ba31876f8d054f32d07ceb63c4127955087ed1b53b5f6b4d753d274d1790d3795b994a860002f97f369ce6042a8c434111caf0ec191b8b171e505abe32883419ca136ed99d77e3429cab897d5b2a46f77dddcf15e81e4c292fb8130e094a1b13158b4d315fac1cb56784f8bfa8cc4bac21793adfeaf43e3b72f3b458d8d81066fd9d636d490f4b733ef160cadc8d890592727e5fa6a393977b0c57696511bcb776ebd7f976f322db442186ce6fdded6097697a686535d09cd98c0f6a95f6885d761fc7f1f105d377f85584261f750591f1f94249139367836d1387dd25ec235c1d700ecfe4fadf44e911faf1df6bc5e12eae2961050a609f99fa4c3f66239bb980a2a492b5a64eae164324b5d7761b49aea69c8adb37d832e7032d0a041d402201e718e29fbfe3eb633185995e1e848da250b7686500c132733b40c41605077dece7c5fcebf10c1b83976f9dc912cba624a08b64cecf20df211a3490bed2f093edde5fc6d7e4957d9c74f09dc88626a6136bc3cc55f607909a1e9c5af38d4d9ef16ed6d92e2600ee55d130872db418fcbbe23a8d37bd4bac0e688f2d669858b4f5c258a5af97b26e5440b13f7ce517a9eedb4d6ad897403979644596a1d306f02a277e1c9c76d89e9353c1d7045ab90ab6197a0647a433a6c21218795b57bd0d2427962d057c1b013c2b03772ed100242fe40818444c4398293ffd87422fa2c9f83548d9169e9e7b578569a05c89b245e22f59f4c55758e942fee57c42db33d874993d496263fdd146162674343e5852e65136b23b98a46ab0c7a907e3c8d175e76fadf384bc60993bdd784fe919f585f6d105c39b299b80f39cf4a4b44decc421371c1db23d7cc5ba70043f73b4501a47e6e43e9cdd6853c182e69d57b657a370a80ce30ec4d81dba877bf005bade09d84f4e4ce24c3d47d180b4a1551b4eadab3ca8c0bcd111501c5ef9ffceb915adf368f364c0f4abc48e0e32325eda3e139b904a2b01293a88c8bf8da8b50b2bfe4da64433c66b50a7ba47d56882b81ebb733b8a4aa5d16ae8de623485ada78d5c87b2e001c783b8b84cb4b0c2b8964e985f04e0218c4e8da8fd5576ad25735fe70371e065101982f061e9197b75a5fb87bcf7871479166c1eb420f96985aec42e9f56c01acb10d7c091a188caaa7758449fef068c420ab9fa7299618899fc4d3a0dcd00b8d7537f400839e8e28408d55f9a99fe6d0050a5de6dcba337544c108e2ae71e883e3aee780b812f88edddf472073c377c5452969952a537e5de6372da1c2689c18fe038a472ab5e742ad61c7d4606b30d98d7ed0843d7ad4690f489d901fc333a893a3e8fa676dfb51494a94665d6e2f3f213b8c04f516704a216dd47c6cf2162085dacf9c06376fe60f9e688d35e4c97c8d20386185cc48f556f1cd395c7f3a492cc2e136959a4f05cb0be84708ac56e1aba75129f1456d874b74f1788db8c8d1da72183a5b24519d0264eb7a8ea863d96b2603c76e592c25a71cc0d22b7d0c142d047a867e43d4fe21b39216dd2a2d4ca4c8cba9f5a6bffb1799bcfbe3e6e5e41dab005d285e6a744d39e0425250b4528244b80eda2ddc4d2686dcdf4120d9027b14bb70ea2e03c32a68d71cb586feb421fb806ff089b90a9eb5a809b96ad9aa8ece3166c7f415c2dad714fa14c6f344155b567ebfeba835b82bbb06578a17959ec13189e44807354fd6eac811dc674ac748c28b3b6b20eec3a97d42d948f8456814512f440eb16344d79c5dacc02f9e5859afe90e051e8cfaca03218c6695845968181991f5869fd9d57fe7ecd53f5cb2c7141dd5ce9d9646954306d07efea29fce502535de8953d5ed681b1872241eb7589ca5c79f0d42ceb08794c56b7ddb869f75fcc8a28245ce3198d4875b4739b02ad28384c65b8c2740e43914d591d6eb064ce622f95feb007592082472c02a5b44ac2da580f5a4ca73485803f4e814ce40b65b71586231de1829694535980c02ba85566b9e54bfc34a81277f0bbef96e4df60546382f8a1dad379549136133da853646684e36bd9993cb6692668313700ebdedd683a65babf356e9436bcc67e513221dcafe34a092d113bb55223644eca266129da8990c3140bae2af9f6a452e28b04298d988139225646683112c64be939c2f7e5335eb328e265744103723aa3f30c0c4e1e1c929a6c96290177cd4e06d2b44a671c0d8b45357cd1134d57d81acd39bd0ebf62f3765038bf621448d10b0bdbd858b1073cab64a6c1bf7c39ed10ec1ad36c946bb09c71a66fae7a9fb5a013aa2f45e4c18d3a3e76d9ca9c381eac3325ec67f2eaadff6c01ce2fc0ee08744a34d447fd0a52467a8382d2ec745f8bc75cc57ccf53196000aa4f6da565cd8faa726d0f6dee6264bbe46400bdfd2f6ec23f1972ecdafe860d76f397bd135d3a74349767d5d7155dba54c409c15e6e3c71212225a1b0f2039acbaf8883a7d6bc0e09903a2b2bf518ea391e897e4426c454dc570946fa7440bb3ccb62e9225eed0ba25b35508f137627d46114fe3afb1091d85f7e5c1a2d50ea3d4993aeaeee101d7289e74b8b40716756b27ae4c9aa5e3519d059e303878a9cf7054222af30afdbe743ad99f53058152c24586b06133f836c6e16c0cadcb9ef41fe50ad84f7829f216e08a0aa25a3828c992d92da3c72a1eac348f9a136935711fc83913dbef91e4121f4037749868819045d4c97e9c8df1b348e8ad724dc0f160f7e9ac50b7546b45fe6d72cd91b88b1180b80e7e87b261c17cb4c3fd172dbf078f71cf1cd60114342dae02810f2c390f9cb920451438b811c93b68fb0d8dc2878833930d27172ab53ed1f6176e1bb20513727b5ae557f3adc57edf1b7800238aa988699de524570809d18397ba7ce4b30944a91490846d550d0ae8a762cdce2df65f7915191bd2f275245026867150a18a51223585513afafcf13481921fb3f61dddc35b4e5454d6d11762f2306e4c7e0838f05542207a1254bba376137115c24bb7a4399ee50e2f7dcc668fb888ae82f37e2d594ed567387abdaf284d7ae0e4e1c56fd75d8f5b24eadd3a94f107b02f02d37c226f679348cf3d3c0d7a42491d21d3f98171e75e0c208a47ab4b4a32050c3317757a4cca29fd0d8c7c672e94eb02c85696f8d985d79c8b21f624c31febab3153aabe275b1729248435e6438b9f7a8e2e424d5754d69b44fc73afa6b1d23a7f19617c1b5a7130a902a267740a5f7e5da973969ca48afa4516e34ce2e1ad9b4f52a6ef197030bf27663a34d673fa6ced37fc82a044af5f214149c2dcf99b10834866512b16db42ea2f93ed44376f88b0844583791ca04057545e66cbad13d2384b5ee738c47546b64c9c765ac6cbb626e52401da95f315a172a284a8e4eca5aaab700d9fbe90101144068ca09940837a1a5ab9f3f494801776bf5a9750230c98be899d98b6d8587f7e5e2915a161287170c9689b7da15d99a01a9a3eee6422deaefdc265cd65504531114fd30d800225efd3311195d0975b448cbf4928931ff70f1fc1fbfffb33f8937e2c85c0a241868329d434182959e123b420dc5004580d120fcd3c8eda29a1e98ce03e780881d06124c559fe0ba64058d82ebb831732dca707e54ee41bedf0d2f02823877d015d998818a3a63cc845f6afc6c82023ed95d8b90925c6f7a18edd906da0a5cab62c85ae9c04c209225948b3c4bcc5c53ebbd872fb3bf281e5b00721f9dd2344f0c0b5a344f0916d02e4ed0ce40a38e6af79f156083b35e1116223d5eadc98ccc9b3816b88257e6187a0372709f26f9f2256fe744b7a49885e41b434e0264b441aa1a98f0e4d915d89856d1af9179298a7654851da3b642d9cc4131c9a52efba9e1683e772a793e4d2edea95b20eeb2883d212fa42b4795be85e1580f71ee2eff8458e3ff2a1b49fcc1a0b4da76e04ea6ca9b90507104d5bcbcf62318b2877c62c24cc11eda5c1dc9c1179412a4054b4f2028193a67096d2095256e9589791fbe1edd128ecb805beb82a37639c6b0c243b351f93b0fb0a892061eeaace2fc0256c84ef0032e3a8951d27d1550897b07a21f5e2ed31e671fa198c76d5bf12ce1ff6f109c79cc48f8015af107f77f2b862a9a3a12e48e4a6b4bcb74968be534688958bf6cbf2f694aba2c0e50068d2dbc9978acaf21e33c2534a48ed044735b1a57fb75a2abc68a317f0beb8e799e3aecccc5198f7b39cfc1f330c66583ffa7c3f66122d40c11cdbe53818a97856daa051e6e2b03d221f9fec210822bc8705fe26e20c0433a41ea1082d8dcd79e0adb1b623c78257aeeb6c79abdfa428b436ed940c64f0e40ce61e20dcf14895f1c0cdd80a7ee22a09d3fa91316219b1ac3725c7559b18873be6c730d65e7e2ac1c2ea6c228920531adcd85e66daa411384fc76f780ed06837b331607c8d0d1e18d6363e6e5075eeba2212e985b6af168ecd439794c183d38cfa6b4142e04a877886f80a578642a1a55ee1573d5ffd61d682ab2cc57dbfeb234915dcd13bd5ed6a2d50a8022a2eabfb118135086a627c27016b1ca17475ec31fab5c73188e67bd9c1b540984bd4a70e46a62917a4500f0b5d058c995c74d5ff2676f897d837e0cfc11fa8a408061feac5a8724dce74cc41c91eab62a48e2be25195d66a7f841ab135a56a5bc9e64ce161c3c156cd9bf707055bde6cb889c28afab349a93832303c08b6f82b7a7572d80a0c0efb6edf9123a3c5a9513b53b13eebc8bfa5da07b2a5a72f7391849e472820bae446d0808d5bbe4613d4d8b1c98adc4e6206d90840ee460170a9cd28ebf41cc126b54227adda5dd26adba8fd874dde316852a6f27d7441a2a3221fe46ebd5f780f21d77abe0916a086e4968c964efa937f2f2486e014c3094dfaf186054babc7864af938623ed3c0be3602dd20e37b11bf5ec588c1e1e82707d9bdc922baab90d8ba78c96e0e45556a40425d639e3e4550ef3c0698e541046c47b85917b521ebc18c8398516c0da2ad35f0ffda6fb9abaf0b8b6f5ff2636e5b5086537a6f512a2137c5b209bb94f7b092102067e52426d02d87622c3a86d81fdcaa9b571fae25c5f50aa7f2111859b9bb6b200f838fe36486b935eaf20611f27381665a97afa43920ce3013b62f0160dbb52e64dc9bd31675567b4c8b97419fbcc1bbd80e342847de462911897583dc57898ddf4fe3f9d2fe6fb75187b1021ac35c2c10e4dcb3a5cc2b15911e1812b921d79b3e9d1f39d5833c9de929d0d06ac6c9b71bb0caea6ba90cec9f5b3977d83fcd0412289c800703161cf40b7c89740f7fe1f03e226d97a30474f851d402a88cbad3e16de4079f22e0baef28003cd11a8a82b8f489fd9df0c9c713fbc348202e48f3e24bfd4e8094701159a97f35d378c4f926f535a11c251c7372b0bc6b527fded5c4f3de11d6a120bc44f0525858d99ee036aa3062ef140ab6355000098c37c14e167713f485c28ed1be2e35df98fccc84805f15b74c262beb35c9c148656086a540e2b027f491b6e08ba409b070ca0386940c1cace44f2b4e4a81e4d38b404506adc094402b6beb329c24e578844e0b0913398bfa3741f64e371abf3bc30b737e6cdf1da88eae298f859b5d5937d55cd680bda55811f9f24731b4997168de5e896c1dc83032712044ce90294a54a5d703d40ba73523021214e29292fe4217c53ef313c286c0861ad0b424b76606c183cbfb0af1cfe945b0d117e58ad30bde837887171dd11801ec082574f8331e29ca3bd752582cf4e6559644af3808580304f0c2fd5343b69c9807705fc98db600d52c9cee43af5de176495ac7ee9abb7886f31a1ec5ee60321c4096bd7fa513d82d4de573ad6d91fb1dc8a57ca4d24509d20997618879a585f0a06ee639ca66ffa8a78e5fabed09cfc2042f5ab71e2960df79936d1346a4a1631ce44993bcc6fb53bd2efd5770853b081dfa6944879d822abc8984a6bf1d8b4b190663a001dfbb4dbd2379ec5c21a0b1309713c0a63ce8e0db91079c46525d0f27434e3be2dd52b9dbac8d9dbc5a0dd613d5a3fbf8bd279679fb019ba519fc7704766bc44d997eb98efce58bf02a2481eb83ddd23259b14a9a92bcfa0af23e4739264df77238e2c25a0a26c3fb564b2a6aafdbb514917559c7376c07c62c5aa3da013b9a001b7f19b0db3e6d8fc0727cfcd26be6929f721f204e40dbddfa2ffa45797b08f870f6a3f0ca2738507d98be8a80c2ffe0b8a07cfd80dabbb48b9b9ff9b7eb8ef113973307e8e2c5a50f261097d54c0e435f6418148c733281cc31bfc9ea53484ead400d4462927cc812c5bf2aa664bee315ee6b409900cc7e71baa640079768b7aeed6f41f22efed0792493dba054f7e43088ee9332c1887af7d4e2f5edb9511294f70c4a1f4ff82e3b5fdd0bb3666d92fb93b65590c7b068cfa378dfe5e653f8be329e0f86d60775bbe4fb665c6a20be4d0c995f0e1fa060d1328802fb0846baaaa88fc736bc6d73986c94f9234ec521ddf2fd9fc32aa851b38adcb575cca8b61bede1e81bc531ef2f194972bd712e8a3b807bda5175799b2f9693261316525a824f99b7b0bb95483213ad8c153ed0da04c353399c26f23cf90aaa2c0da4db07c1272c4db047acb8e39636a9dc0d61e5d2bb3b4ce8321146e823a6692c3609fc0b23ad060024c7c8301d99a05f7c418fd2202aeb1724ad969fa5ac66761b1a4e0dc0bdca8d5133f2a5275c4f6fa6362f428a18149a8e551fd49a90263665d82c88363c201e451f79906f5047ecdd1409f959c288f19a5170cd15a8265ae0e43a8c27f52811da31f5a4292ae01acb9e990e333976597e3324061ae3c258069a8bc1696b102014b27dc607222621c7c2c37d3a0185c555903dfcd69c12cf7768ca6643a59887417ff0cd9bf90fe8d3cdf14ae074e56cec4eabc51e723c51a35008124d0a4234a4240003701b3ea2d9639847f2b468a3324650f5a537071f70f05c3ade0bb071beb12c6cb7ca73b24bf4d5e6f4910a8225e62eafe155730cede643cd362247d42b5a200e23f7b6fe46492f911b01f910c05456c0b210c0e697e4a4ad432094599e1268a7088cc5ba9a6ef48b039e418ae512d86e96e86e7e50608d3bda774984e2faa22e2703fb2d1991c2a48c4da7b80dc28d722d83c3369a57ebd8a96c5d88deb65e40812872d43cdbc2707d0f70c67063f06c878010e11b7bb58f863cf545b81818dcb14d6171edb7e4a2f48ebc81d9d1113d95ac78be7aa964b53b0630e680307c42bc2c1fefe16b8e0e748685d9719368dd1b7ae53774e14bc11cb22e6152ceff88ec343e56462344d79785e60bad0a081ff058caac14814e8596b977c7f924260b502170e58d0a3c387b50861e4c615735f69da69301e48159cc60fb238ee2b378e51c2537781bc32d492a0f57aed8e12f296e20da5a001e9094b0e312dec8d0bcba0a60a0efe6044ad3a94553266559d86c1a3a8e4b451fc065aa24995ae40c5ee381ed82a580d983d865d83b9997bdd02c570f0a9879d1158ec059c0010569831e78eb3c482a77f2c1c8fcf227f0d7128a0ac460fa1c634e4e1d84cea337ae915392ca23d252d320cb611511d0c9febd06795c54e744f2c00227959a67029f340f8e8bc51837478f2c4aa5503a03774e03926419530cc3c372fb8249a7a2e5370b22cef2110712c2ba151dd6279a91a8386cbb435bd9392f22c508304b79fc0ee10b5497b4a28594bb697f01c4caedb62fc3f3be271b1c092dab0a4b8a3d9ef890bae7284a0a562b115c5ae8d86bb508878059ab170ac245ac291c1406a79c1edc7d233d20298fba9837868a42848540f6ebd8a06b04a1e91b07f4900a619d8012c4d1145edad88f1c07d49214dc5b75b516aff81fb237d2849890b5b3a711bc7c661e9635d44cb550ea8b883289ae737bcdc871e76dce438d2c415080d4eb8841c9ea3d72ba0d5a493f81574e256bffa7ae6848ac0e75aa0e0248ff4a28af4b49396290600a29a8dc88f4f47ebe2cfe06a2e2049a02f4e45dc4bb1801dc005347cb83ee469e32bd301f2144978a5a9018a0b6494e7cb6bc4918437cc82fdbde1139989cf7856ffa11e400901b009f45d150d020f5e74c15a2fd1a4f830e650225c31604b74afe17d662a568173590ba710edf45edd4769a5f42a709901a0d9132789c77a19069ae3f5e19aa37ab47cb5ee3a3047a6c36059a88e5012621737dd004639218ebb134c45bcf09da211e6dd592972bf3f44894be9ce4607014e4536dfb343898762436cc712947905cd7e8e725151bad273cc7e134bb53544855bd903e19b4e200cfbe4527594d5733937b02e171e311b2e2cdb5bc0989af370095f9cd03221dd0bbbc9933ac862f377dda023ebbe4d1e940875814da93074d84437018cad2abc1a484a26a187d5c126c2fdfe460b46c89976b02857e086aea2e61fba5eed0e4c4c0f1e843524aad3723f5d55180701bb94b87229e9753fee6d56b03e8966697e69b605b941574ecf0a733941d86861c16cf935a2a514f88ef40a870088789e811a43462a81e5c85208021086f6ca5fda9837051ecf0a337cb68ea3c136762b654279c8c54e590041f968e371b802038e36d8c5df3570141671b5cfeadbaffd7fb269b428db56d31174064b119508b971e7917ce6fb5497195a05ce5ac8975bdc266732b280638fe83968a65c7e88e62e97e0a9a17fa728824ca35084c55d88da80d7872caa71d091774707b2a8d3e93a2292db0151f5734402f0008db4a08b7c2d8be43859c006a62f0e7fb6537f6ac8fc43d09b88f122d7c5432d06460b30c2001e340fbb4a0f323c02b8b412a447181a116844e1e24e11887971cfba6638ed6d1bb13062e85f8623e6f6936415eea6fd264d9a8e3551712ef325d48560567a96c6ffe962d00f5a059d7bf33da7fe2279eeebde8433b00ad5f810d7fb625e6b8ff205ecc732434406f51a5b86a62a33b3c35a974df0d0e128f47e5d49c0d2b856718bc9a30451d148c5f51e77425fd6a1c37b0d797cd6cc029a8ddedc020518f7c2c102a34a8b416dd85aa7bfeeea400ec3eb47405c0d611547925780f6a67cf6ec26464b70d8927a20d1078cdc01909d1be1d52a77707355b61ade20b1177861d8ccd01c435d3910b85906c78e6879c02288d5921ee560d7906f18223ac797160110207082dbf5ba5faa0203332d3eac7534ef46162a25742a440b13a882838b091e2ef1eaa0ec1c6286eb15f18c57b346dcb058d93a085ca04d7b24460d148395efeb08993bb5a67c800752d4f2067a00798f67453a921e5672101ac6f0b3dcc15e6cbd97f3dbfefbe76e5e2768d2272ce7782ed67188bb5158f769771b323e4fe838e566a508e3f8bdc84d1475b449da6266a665c098e195ed38c7d54408c954e59b78ae1c0f2528d779380f6a502cac503f89c02f5d1f46a8c56867e5526b0e604dbc1a2195c980d61831ff9831b8647e20130c5f3c900259e15d1da5695fc89aa2a0b1f3302c3adb87f068f868465af72d2c264a28dea23538cbfdacae66038d525c9e6f5b4b1dcae87ae93635308431adb0f887b8494c650b89f5b33d25ce5f5604dcd87cfc4448ec077ce6a152d0c954489c8be4909575b0052fd516c5305cdd9e01d9294878a4e01ed1cc185dcd43f318c79cbce8d09f47e57e1da7fb1741035de0dd0e2f4fe8dcc184da5b4977dcb84f94bf6e3c5c1ad2850e413d075c1f59b376cb0bf9c3ba1aad0fb4870945c70a4f376f67e24b04a640d0c4504fe5f13a292a32e54df1e396046768c641766cd5bff9ba508fec52e54ae1b05a46090004a69995b01d1a754d3c2e4a5b686f413b5a92e2b62130f37f1dff12d29e9861366a1d379a08bcafe3b7665457c56508e642bce2c202256dcf200cd7488f3348fddfd88529b0ab754fa9dc12a5b545355fbfbc65dd206635f5f44009a1a6a4bfb99b0d5990f33dd67207c2f14b220012cebec72616ae02f60420ca6a6b861e9613d4413977f618590e4f5849a82a09657ecb51477076b1826a6861c21755b9e25111417c13aff1d109f3611102f514487b92700d19115c9d0a24593dea658c53a061cdebcc2f93445565d83a1eb2d8fb8e5a300a98af15b30618237416ea8f41902f6f9b496d31e8d6c24cd8f5e9e305e0141dba80c835802e8fd4a86ce0517b2b90ead1103ddf455a75e664aa3c13046eb53eae20d1f0ec2171e531245e571c25da123dc77e1b06063bc2d890c870fb227839556505a418331498820de7f84d0a7eadfc689f63095fcd0a9b96d80e20a96e04d79f109f59daa0dc831b4f31667a84feca68d2c9bcd0ec2df902f0232e05dfd8f80668f0d8863105171586d83e878d3ae9e87562e2e0be0df4a7540bb1f62d22b28975dcb143384c9ffb7051a7377fa848816a1a6165216f299ac9f0eb3c13379a9a65a37c29a08f7b5ca60e703388040ab2e0f9f9edecac72f4450fa95024c13532a6b7679e1444e62fff8a9f4382d198aa1c0e4e7d0913fd01dcaaeacec8411fe98e9772d2690ea211e8733b68e596295fe0bd30851e067f3d5df139d10e04f95182923dbc7a04d6c17de6a5f6c18103cb4ba19d0a5262f85faba3e9aca6cb5fd9b4d3ffb29ab2b45afad0a6d0124b57629d0c0b1e2b71e859fe745e9254dc898a282beed28c409adc68705812561e10ff93b62177f3a71620b2aebec38c32ef21cc0a76591b5d1a22674d002a87203ea46e237119404ed6ce8ae1b39b961bb33f6eea42d498ace063f1a1f2bc32a123d865c1ba36d0234e472b9a5f7bc7d37d40cd10b08742de7d0923ddad89ea3a503b838009acc9561881044293aae5cbbd4a19190f23c064e97eed720669da61f7c0752ac2a2cc7886e6ab17453299409a888059330ee742b6322734b89791f550bb40bb6cd9998ad51508bf2f47e660dc2b3f922d45e58b98c0528ede4515d416b711c7f4a12d30532aab07aed285075441aca0b029060f93b363fdd34e704ff392c5d88ebbdd9c93f34a06842252d65b63b1ec5ae10c3b6d76c35bd25596fe83515d2423c979cb01c199d2c657ffa60acd52b6dbbb5b5cd6a560155c79efee534d6b158c0a41811e292878cb2f01e257b200730a05c943054e2ae1726ab063ea6780f3838782f41d8cae302566cfe669a47ee88af71320e551e06332a6bd73038e08f24f55b0a01425b1a2ef917f3217846ef50b2dfc6ebfbd9f105c66568c5e5c7551da47065e5d659cd92415b739257a668c958701491ec3bb4266a9061dfbe8be448852f25d525debec0316cba2cb325d1fe09dadcbed33122953fed9b0fed4bf6319f810f45f6b1f58a5ab2dee38b6e777161af5b8ea60008d75154d7d7354ecbbb6b7d4de39877797def1affd8b7ed4d9f0fbf43e43c7bfb116b76ac33932fc27d4107fbc987e42fb8597d8c4bf8cb26af6418f2102cb245a9792760bbdecab359e43905034e646a4affada4f844e4536d3c411e9623ab415aee61f215922b004d98c18e71b74ec2cd92d58433287efbb9700ad523cf24aece6b30d8965c4aef6cc41972859d0be6473f5ed05f476295ee252b5ce5fceb6c932d3e2bf695ba16716b8507a87db37545359747b77426a969d7f10f2ca4d06fbc73bd752949be25b6a56f1829087827b2d715ae272b90d5bc20adf6475fe1aaec9cd74790df01e540f8fd3e93ed9441a09eaeb52c73dff7b71b3849b84ff893a0391c9f0085702b11f16aaba8ff0e3604fb50835b140af2a742b352179c89bfc0d4e013a98bc0d816f7d9c93f37b40b68d3b12835b3d1a759f50c8fece6258b5b11e2bf0bd0f9cf160c5d162b51755ee79d26218120c03909aee1633c3757a3eb91cb3a401a387ff8b24c18f6d31f6c92abff1b7969bbc4ad2d5b7d45c2cea1cfa1e622935c00539f6475204b12173b017887401e4be0ae67061c874d90b05495e68ea178adfcd1328ff7c08f01d61e4c389f1efbb1b462ff8e205bfe74f3c75362fdb5626e9f389455ae4caf39b00088fed13b1c3d43644eeb04f070d57e6b620a6c7cfebb6016c0897f4bd7568dc50cf105fbc9311391ed6bc3f9a93467a151c353986e030228e5d69068b9111dec876a91f4afc5c1c13ad3b90537f38bd235e915eb0b85168199f58b4c6474504bc562771f0833b41a632658b5bee28f371ca848f1636b73fd8dbe0fa1bcd66814b7843ed042d6743ebdd707dcdcd39bcb330774a616614f698a01f2617d236e2c8891d4860373f1917d3d4de40dbaa2076d69394033d8dfdb6caf37d1f53a030955cec1be6fc131cbe153cae0df6cc8646e5cf289d96c4e7f07bf035d10702e39742cb724f55299ab3509009c42934188929030682a837e984135e84bb8b08a481a948e63016477d93a377adc2a804cb3278fac40387bd6677205f9b3221b2ae8cbbd43ea3965b58c78be4f09c71ebaffc76e524aff609021074ef9b09a274b7ba62d601d05a50c31869fb23315d6c5d195aeee1171e15d20454eb4da390970222290fe81b0c9c795ab15a48da09ec80edf7067dcd1e488677b3546db280fac43a7d1cf00af8e7ba02538e711329d1623d925bff89b63829990a1e878c38994d687d46700e2417f18d087ea7ea9698c432e3101b16a0a4377a356ff10838e9c358a38ffae21e36865b199a215b9b2332bd7c920603e27367724c6c2df1292a9b13160282cfdda2518838b1098ab036b4f3b0b1a2fedb939fb6f3e4e5f01317da779f0e780538334fca2ea1bac5821f8385ec1f2ec32b19140c1c6b02860fdde082e5e446c2c08060bda3223c2e8b8d5d2648744dc435d2287c97e31d4ecc088fc2ce16bf4c05a8acd1d59071494793b80ee41d44432de6b8480b664df153a8020e6c140d182561b8dff0edae34acd750c18336bf9edbabff981c2ab4ef9b67d6e16ec5975b93575221e1a8054c811da5dda424dcb9a37c873d6d48c7b3c885fb395892390fb84e3a38fa142fe24f0ac0d434ab14c25072d2de9cad4943718fe1b228592bdd69964c789abf7390c69c1842ae08ec325b6422017d5d23bc69484b70815219f3077b966253dcf87cb17250b4ef00c621b25e1f5cd123c30f04a99516a831e3ade53cb3f224cefcb900d5207e26797d4a44844451c0d9b067485f68ac6fcc03db623dc99bd6395cde143f0d2a3744eeb1597435ff1ad5bd2b50e8a5ed591b170b35415414ce271129aabfe8fa9558876ee508f92e94eabcd2d755986d5793dbe36ef83b1117a7264cc4d741aa6135894c5f5cf751d4965fd55e3b2e17060d33f45a91583d9f08278e4adb71e0e26e864e4e079a064d3583d96871cb60053f611c0284eea9bbaae7202df7cb3bb10e8565aa827c05b307209c890f73dcb4ea156dce923d578fa16fd5db779597454264772701fe9e9f858758750102f7da75791a8a1294e206e0658efd6c26e8965652d4892b7514c70ac83f0b998d7024ea34d515ab93f85c82ee17e43d01f5b7c48cb13b687d1ca54b1640141200800a2f56911a8b8aa82853069ddaf66012cc3f6c1f8a340bff67ecccf45bfd6a9f031f6f37f87d6d963e7f2e93c557fd3f7b3b28f4a672c4ea00829584abfacc4efc1c1ff78574e5b02a8bf9ff229bf1e50bcdde0603e3cafdddb374f19a5dbf4cdc7ec994745951d71ef4f39946dedf04b483c4e8d9e39da357bfef40ee0914dafe5369b2ebef0cf18d4535cf0ee296ee3bfc6bbe9040f71cc361bb368b68e1f3b38a5d0f35b357d1f3e7a54792d9b1af5a84f94d3616e5b9c577d42072adf36e96d8ce1f56151f7845991e93cd2a5f023c42e254cad1be990a36396d0200a21116a7afbf10c308dcb202fe115a264f12084b31b32e1988e892556aa14b68c83d657cb9fd74d80fac6266c19b17aeccd579c48551421065f59f90b0eed6e51a8d381e3ebd2a5fac1e93edcc52ba959fe687dd0bf15a62d271691236bfa5614a2d4bd80a91900b91bce59b227ef8b8fbc2bb3c221b1c9d4afe1926d7fcb90a5193671d2c0bc7f0f9fade4a8c742d8e9a8252056f937a771d53cc75ae83824c404fdefb0dd6dd4ba93acb1c6fcce3b7e0770705d6cbf30c9cdd9a02a6158afa4d92043ac6a2b05dae97856fd0008e417d6345036829d8cd37be6322a20bca1cff5ae6fd08c525c8fda31a151fb1661080cdea5858a99f3a5e25552b194d025048441370bfd12bd187aea4f08d8d340512e61a7823723b48770c7fda02cd45101b1c276799180bc375a6910383f93b60e62789c3407e587322ff0258d8c25b5ca3800a59d5d61655c919dc3ec1d2cc3de6da90a483b23c0587dd8060f586c72d02525b67f6d3857eae8e80ff881660026376734314003ea52e3a3654ea6b3c8b0877266d6239421926fbd2d53dd87ab40df0c19e466c623534acfcdd593eb5f72af43b400712ab7799aadb6f6da7e95c97310aa43d9451097f077dd6cb601b6a4724410864696511d90ae181b71b23af5bb7a2d0129da6d43ab643a93748c6768b5f5e91128106a363e5e020342a7661e8455dacf528d5b876b59a711597cd26110a0175b8daecfc4c646b395342debe32b4028e4567b4d7533b4a5bd22a7eb48187b1257b53e49356e85058dbe0f02a1d4fd1508319bf588ad3e4bc77a04565a3e27353784a3469f0752ed1bc76b49bae667e9d6edc955c53ddca6e9bae21e56dd0f4128f38ce76875ebe3238044eb5668d0e0f730a5b9e1bc2ea5d57e226dba3dbbaedd866cb4ae57aec32633d5fd150cb1ddb84aa5b77d4a686f0a071abf1ea6b5b74e579274ed0fcf408150d359f55be735298df6b3274069c3edd1752e7d732bad8f8f808110b3d94fe1aae62789d6edc95522bdede3293020746ab6eef674ad7219d6738b9e31a7cfe01564f314eda535a6bd02c2d161d4a8d18df93344becfbec845f89fd4a3acb91f32e5f7ebdc5e2709f29f0cadf0bc7dfc0759f5707a7bf03fd90a0cd1dfdef8db5bcfff255bd090fee84dd827c9da6ed737f704e010c4e42ec41f7b77e82f320b1ea2d33fc92a70487f7ba7fff4be1f8028cdbe30b103431fbaa0ab7fbd88c6004fb9fd4af5e0c1be917cc85d73fc4163f909542ba244883507167566c96021699e0754e8d9fc0f5edac2c2d4046b4a192a2681e1430b18d11d2454965df7dbebe52e9c90fa5e0de7efa61f5576fc316a36a17166d84f674080348781eae1d840772156751734d28d90cfd8bdc2cc791f874dfd7afcb572f7bfa39b94fefa9aacbeb2e6d8b11fed667f56b07329463e306c5efff263ac4fe08deb47c963970032bb1160c1d422119b9ad2497ed8a37e040fb983ff5af2b1fb7f80bfabed6dc251e13015dd984f99769bbaed1ec83c941d7e880834c29eee585be12f8bab6978e8f5ee0ea216f27e9daff5079901da399756d327c192f6a48365d869880322e18c572370fe3a0f724bf22fb7abc157fefada15473cf55fca1653a56a0464150784821d6fba4b0b0cad77b38815423bde72eaa24b5eb38a67eb1549061309d134405e7b9fd1d8a27af697beebc6dd580c624a21d7acc42a5624a22ce972f16a4a7c9c401b73501a611e07f285f42747c157ae801b8a2de289924794f86779ce4725a62d91aead5948dccbdd752219682119b45bba2d0c6854b04919639c40074ab1907f894662c258b4c6268f2ce49acc42c9cd23a5c674591dcb8bf0476481d205f8dcc8e8d0f3c89f0c2b5fd1619be27f8accff0745c3f9525a6865b10885b359a4d42f1ad2ad821a1a64818cd3109047398d50be4a96e37b6f5e9262853ee67371d1f8fbfa4e4d0ea4c31cfe6bc85dee47fc7439fa2b78ce2803172d9c5b5962665b162b28422cb943cf1b5b9e78b5baef3a517a9a7dfb372b6a7b8685c5ef8fbfbb21e8000d7be14c738ccb66a631ef7584aaaf4860d0740bfe0fc21dde115d4374e8d5da5d58e96d319179a91168d93c79f1d621bae6d1b792bd9f90812053ca4ed4a90502cc2536cb80008f171fddf736df8a7a62986899c8fd7cad17028b0ba10d08dab614602261ae2b98f31d3f4c47d68de2abc3eb6a4656437eca6b205bea11d53e8142ae95be95b3da8cd18ef76ddec7cb851b7622d506a87aee324bf452277d932e4b7f795e41d434ef7058459d3d0eb7ec64ee8d4954ea0c4ac23a448a20d5794dc2c380d9bb3cd28561104a0bffa92c15436b516a7d459e265472d9540c1c849657fea4b25db5f08d377f8b0a1dda891a8f582d5a585bac33aef7026b17b73e43d8e1f540d990ebb9fdaa4399a9aa65fd4b406bef88025aa7a191dd2554c88ab39a93b696307d3656fa01474cdaa63fa00e04ef19ca1d428e60e2daaafec19b7b505fef43dc6731a6c9e3b8bde6953f40b7678c6970b825e62efd77987ac940706b21f5bc8b4e69a19b717a4bfc659f88d2579cf97781dbb9134bb82dd5ff48752606c331234c1a71bf3adb953b59c563fc752e0fb1e3982f83d01845e654fca040e700e69b193ec82fe3e38eb87f456078e88d5390f0b20cdee94b3ec55c343ff114e57efe2fc35ef73a7d62848ff7dd405f6c6b769349df166b12aea1338054674c358903cf8d8b48bf737394b7f744544d2feac34c37e72c9f5a59bc2d557d23962623bc62fd3efb72b6140e3abf81fb865ca7368ed6d46a7a85f224ee5e9f6884aa0d9164302b3f80510360bf169168ec1a5d8b38bcf19e32d84fcea3be09d1bfc7d701b3fb9ed1d0fd27d9286928501bfca543ef61ed20a1d4bb7631c925b9ac320c5830d2cd81df5f8e8e0bedbcee622a6ffd305a70de82a53b876859b3abebc5c901de69fea666d7e609a0891b7ff40f467483b87bd967f0c6cdab30795e5d715d559c9fb8fd95b789651ab5318a1b92cdd0db88b63736c3f12e009631799c125d08ea60d12ea03e806a438a3557d2fecc8dd28524555f863638676a8df56ec46e602e7122d517ab4cc876155f1fd07a70f50f71cf09a230f5c8864f3f8cd2325a822734953e5bd85aa3ed48d4772516d543e691a7c759ffbbc39d0375e4972e4a8173d7edb990a66e54fc1212888ba79c1581d7bd47e255084917dbf56f8d26058f929534ffb48ac8c558bfa9a8b9db2722c52df3085e1ac2a87660af55c4d5685d8c849c8634ea0cffda4d91ee1674e2018cab89a554a6f8a7d974ecb45ac30513631651af6660f9f45c7b1919bdcbe29fe62980ea659c28e58ef0f6440d2a59b764c30901cbf4afa9d72b9ed69d275310f02fecc99548619ba50de5d1252ceae54035be7437774dbeb7799901171b54ad0d6540098b1667e450fff2ab2e125998ee843e44e9a6ccbaf69aa42a7108ca0ad3db02fd1ce0ee376ed3d0300b7fcb421f11af3330032b4d9a7f22415f3cfc5761776e880566d7ebb32956d0d9a33534d1c3e326b9faa744da12c1a491fcaa50fb5271250a65ea70eb7a5d67523797dc0ac05b7593602a46634c29781b6325e36949c508e8af3e76d84f534a897ab4ec3c124abaa0e367cdf1d06b97780efac5528e477e88ba1b87ff8cc8901babf44e0b19d6f2f0e551212d12a7c995638ed8f86457e555586b1d89ded3506731853815a27fe195ab9dd25788de93121aeed1eb4bf8172ee91990d8b7c9b3dcc48e6ae6456b68386e3c91761d6bd0d43371515b4134bd8a59886633ffac12576c5f3a09d7424de3ffbbbf4793efc90446aaf3684ce09a50e73430aab60a5e6b588c99da6fbe825c7c9ff45449df600b20bf77ee9d039497d61e2d8ab6ed6ba045828635d4907ec5c7f580701c3049b80284817bcca4506eb12cc7b54e97e483c21ebacd67e2ca1b565e119d49c6e84813ffe9da21faddc3c4099a151cbc04f76f22472703e6ec03f218c3e5722c66d3e0988b2f49108a13f32f5445de7e68b10373eba433ddda86816c6bf2acdd40bc07d9cc31f4fb93e4f2c4c0c41d57daaa55b40b8eda685bfa3be43ef755d875e4150870f48268eeffa84e9f725ac38360fe6c036d711cd0d67cbf85522a2c3788fa84d802e485ecf7b241858c48097f055432227d19ad9b1d8a0046ff16f668c50a9961e4d69fe24f2eb0f0d8a215c99e104c785c4f26970e14a788c8ae84f3b3cf111f016610b17805e6bfc7509dbe5111a3f69f7281235e1e91ec8acd47d273ceb0b05740cde61c2c8120f0f110808bd24ac59d11dc3821aca83849cbf868118bf0d7d3f98633f4a407cc4ed7a43d3ead57bdaff4eb2e5bfeb932fba6af2f7bdd0bd4c60deb887a738fcc0dca647b4959d1ec76ed97f1e0b72edd5a63924e0119a1e0bda7706e1122d0d72c3b7e0802876cfca8714a0dd5fde04bdc655a8b8a984e063bb256ea33c6caf8017a2d3b6193a868f6494b506c944c51740c6e1fbc69be9c859daf3f16d2584e374f35fe6b8521828f6023f939c68842198291ec47d82d13c9355a837cb49d75475a6af0c81b1bdeb81c42ddd4b186ccea18a89ee699bf8c0bf77c626501dadd9e59c4ed5aa4d9b03b8e89121bc67dd8dd84ba0f3c18014b75d6a7d5f0eb0981546063bceb4fce36e1d4a869a4d35e10d9cf3b03a7ffce7e8dd94c45f83688e1fe1a4f8f0b3712865e2ebf17064cdc3dec5709d3a1a1b2b2426f4846fe4c19e7791b9b3116a2cdc3cd84cafc528a3bdd167a63b372f9721a46aef15663c7e7615d6023ec6f3a368c1c24661a128d0fb5f5ef0a34fb7a68339d0ad5a78bd3a1fcf0561291ada4fd1269709e02076abe9eb848fffce711b73ddd557f01aab18e773dd45825174035165107bdaba788abae04bd3b2bd56fe1b4107deff3e2e1eea6bfbbfac25e1a277c02d4eaa3f9788a02750468e6b09a77083a6a047e7945c50f979a82f21c49b4c537359682549599251ce618b011554411cfb1b244d6980da2a69a45ef3d1c0a708003e96e4de7e4796bc52ab1ea4a2104a50955d5cb989469db0f2d83230a7024c2be5108e72a04fdeefeddf883ebd6abbd52f757d6d7f25e51b7bf181ed348a838d86c4a54d208a2944326018cbb01fa3b254459404c31930e92f708f42ca7254892a7b48a3d650cda9c609b016bd8103ecf350f35795247f6966aa65ff1929d68ec07e65df15ee9a609331e46676e78508e2bf29a6564abb910a462d88c01fb43d329d436d964efbda59432c9e20370049f04f603021aca40426d32bede257ec8f48ab60a81aa4157d2ccdd0d10cb4ceff566b5e6b9905716cad83dc0e0d21ad9839858a2bf436640a637cf6a0d93600bf996dbeb02ac4405742d234975e5402412c50464504480cc5a6b2d50ad592f7119888307d50e90fb8e186480ec430681206dc82fa0404005f88024401e12db5af08548ab2e0d13bae60908b556fd839229dfe8960a7c7001103ac0554bca21df9c3dafcec16bb797dd25d28a446b06b6edec1b570f6cb01561db85a264ebe11066b6b62052a135b97a259feab4d43c2500fec1ed5e85cc64ece02c6b00aaf7822ea2d60a921c3292946f690ae2fa976908fae1af59e2065204c1592e69e41bf8a0830efa0c04414b53d15e10ec85e400f2e74852d8735fb200638c31c618037170dbf75a7b814a24510014cc8081174a5a59df2f94958562c837bfcdca0ae2b6c13718d61e5435e811fdb7a1efa5ea1544b523093b8ec837f06df50ac2da0dd5a94e6bf7f42fcdda06e1738c3fecded841f7f97dd8bf8afdd6b63e0bafab9318804c6f05d885dc640d35087f4023e4a96e8bea3178aadb92915dc8f549be799341ac576f1200f9067ead20da0b05d666da4276a8d6acd76acd0a69c9e550adb5bbde0cb97a45412cd19f33fdc412fd3fd95620529f8c2485c9183e02a86660cba50c456c2e324f7568bc7ee8a90e0dd5d3f184f74563165169108d8038d3695175104559a64e3d3104aad72b8ba73d05b22003183ef5b61d54b7ee8d2558fcf55bab5bc763071b209ff644d7eb4ff5c1edd55adbc482f6f5c8ca245f5a85aaf20c8492db6fa05fcf17935c2298e905bfc51f13f4afd3a00dd7e96f28d17fc90bbe4978d0cafdb70bbec1bf8086d000742f19e47311155ffb915f4692aa640c1f416b0637f0bb56514abdec81d8b5efaed59a50967cabd5a8b5f65e8bb3d50bf16624297b9d00e2aca621f25497060a83270106d5da750e252e3b10870aa2faad59c1187b4c53d1df1ec473ab1848ba3456df34aae3f27a3a5692b41949aa5a37d1dfe51ef770a5b49a91a4aec7f01152d891a4c09a81e79e974b39c8a3217646926a135da29f66fa095d095d39096146bfa4f0252a84995013dc2b70184c82de0a21279e8cb434835e07fefab58d2ff83cd208ff256f69895c8b73a5dd80fedeea1863bf98620dbe1066d62a5fb71a84e2e4b6d6f6f5be77f6445f3fb982f06eb55ab93a7decb5d6ea4454441a7433dc5a9b0999c94f240a29c9ed336befe7e16bab9610bf21e857129156db7d868b16d2ebce84fd6df6f5ccd6d75ab5745a37bc445aa5f840d2e5caaa2b57c78b935c560a4ecef4c89a5241770296d41a158ebc11d3e58c1126a9ac5c162e86317cabdd2ed06d696eadc5350bb0a4990293142142c40319c4636a6510ac54e30585cb26c34c149d39c296d284174a2d28a6aeea6f6e53a273e46f6559eae810512acb058cd1a93107690e4ec69c11c2847861533170d812dc0d9382b3615c706594b892c2bc4018be5e589a7d61cd10bfccc890993ab2b9954b1232ee4165c303abb284bd345d1b52eeac031b9351c360e0c8b026187276883aaef7f585f565c65a7bf157d8979a6fe6799ef7816036c090c2300c65229810b01e198c0aac0a98979f9f9f9f9cc1bcc0d0808dc1d0a04183860a464adb86e9086b12755f3f92bea270412878aafb52c266cd1bdb13dc8604dc068f0fdc26076e03f5c2060449f925c3502e99626392e304cb41222748154521ded49299941997b032615c1efeb4441b95af1f5f510f546b12f8baf1851bfb1b18f65427078d9c3272ba7cfbac922410c3e8cc419a830b81ad6a8a4d08d5234629cf17374ecc4c098788e001cdd5e71b449f398b111b3e18dd8782e0504dd0af510f35eaa1c120d9c7212888839d7d08b3f73c030db924914762cba5ab0a98fc817cab0501790909faf1d5f38826623fbdb42bab6bd745064806441b946c6b926f05b8304010e95714ba2e23d6b69567344457ab37f26c9c2ffade888271f6edb55b7c5104dec8fb69916948445addaf83f5da10883626b97d66abb61f41a5add65a35bcf55aed07272c6a42d040c66b3d14eb060b55cee6d14d74535a67ae0d9493ba99727572907b01038f4a8e474e890c3b27d8f9e5ac9c2470b016c02a1255c74a8f330e948f25a7184e30e70372755e9c7abaebca19811c97ad3337766e39c99cb95c97b37339b293f8e4a29c5f7250289e3a6387c971a08d0b4d6294f92145eca90d1593932cd725b40e387dd4545184349533399aa74d2873684ecac6022f098a4e812125e5f4713a97b301b90cb9761246bfb8fa044aa795a8988db38d20c06a03a60db927670b66fa85b3079133b73586926918b4502f37627a085503e6dc71622585c8751634e700725761de50aede42d784625f504c60319090ece82221e754e46c3a676ec9d94072d4ca996b1c58ce3267063406addd99cb79d13bfd8467860a678e3e69ab14ec60da0585734c379d39386067aeb3c6ce386797e91044a95c600024272dcc7d9d09c869c9d19d9cce33078637540addd3317427fdd24b754c8f8c335752acb042a72e1b3bba8a9e51e3e53c72fe6893739c233820c849bb7214a4f172774e30c7845ea15927f5b2878d99d30590294cce496cce49ab206970d234f77e3afe63932729cca163e3d52442209783a2d12ed66439c3a8983387651627eacc39e1ce38556270985c4c9933c2c3f19ee73645de9b31c2db21a7458d156c4128141b9053a4ae9433945983f554b726ca8f4adaaf9a286974e50d3b1998e2844c580dd6a8e60c53995b03e4c7a7ba354ed5b6ad55e55936954d69aadcbb01351580dd76c0c2097df29708e3ae569e7a74f0a07a49f5d587a27c78fe8d627d6dcf6f50ad559f40b68e1b9344d7f189ebd80357670f63a9b57660bdbaadb492ade5d75dbcddd7fb3a514731c1370dc4175f4cded103f286ffda296289fef60c3654d043105c41677fbdd28a0278b4c88ee8e08c5b688a02ee9ab01cd1d9d938c106d49c393638f8032fbabaec50129ba366840d97bcdd7a20fb74c794f5796a58d1c082038569c9c834e5851bcc0404000e2822c606cc489a1f7242aaa75b421213d3d10c0b4e06a61647f7de3434dc5c11588d45dd71fa121287ea6a6c097735c2d0b0b9710fda3181799fa73ba62a7ff35274022956a8844a035a98e244513903c74992375e5ebba5b1dd52938d4d8804a703e378e06c06e2ca1a720e8fe07078876b4ab271ed70562f80a73bdc1010bced374afd5a15d501df5ffdf12561bb9ba4fd2c6e5737698ea041a3956fb91a5df022b0d0a0dbc988b3938164cb1af2435503638cf1ed70ea94f1c0b5f8763392703632bb195ffee7e96ec694a4322cd8c6d8c6ec94bcc031afafcea12d50e37e754aeb0fdfda1fa291ad1be991d65a6dd0c7ba881abe25e9102e5bbb530af3e2d39d52162b0fa8c96262430718205be10a6d90feb651f29eee94aadceeeeeeeeeea63a6a8d3e25bbd80a6206d415a8167d6fbd679f375a073fafe14802246bed4d4713f5ad8bdfccd2ec539b01032e7a3cdd291d79513692189293c3d184b54e7a60146cf28215db7bdb12b5c57e6ba7b576f3a8607baddd293d398db0d65a6bed968c9fee9470947894722b28c9f091f7fcc5bb24342f7bba4b129382dbb2dc005b0ecaa15d1294b74f77494efe56ba90e46fa5ed04a932861f729ecca35c799524c3b694d4428d18d51b130757a9848c102fb61956d23ce14155fa50a19c03048a470a37cc183196cc3c315e64b1c3244e0a6aca2e664a295faeb0983daeecb460735ac1dc09f92ac17684a3ac8241030e0ca43978ca3a5f43d8985c593274e52e0b10296617931f53259714be4c305fd0b10389a9dc428a619a90472aac44a16b4c2b29cc912d245009d3c47603898985c8181fb67387c9e6a849c99152a9678f39858e0dca4d0b68ca27634aac2e495e306f58915162a351c47c8342c906aadc72be98612be1858b72471d17e0b84893a38c090396c9c295f20428659e25a610236282bc4082798e50da71812bb5b838ba72078a9c2f6bcca918cc2c30b61830d8784429a5aa4c24165018d2a3470c39b0d43099762d605c19b3f5009b6a23e74c29b6339b6831974c797281c891b284a812cc092f9c6cb83d364cab3d493ef4849993c5ab44b265961163eee11255a58472528a49a2470acc0fb127734dce84a1474639a6a785ad8598e9e4cd132e3364a47809b3624679526651c551c13403a424c3c336c20d332acf525925cf0b5b0e3b5de2984e6a82982959f8f294432c5e7278651aa932674c955ea24a273e969e909c34c696cc2263472ae0090266f2e82acf6cd99ec6bcf0a2bb6233e1aa6c5255de99ba1365d2f16112792a879c65f02cd5c073545ae1319bc06c4d5d65922daf315abc9463ae985e57260955361c53e59e28b3ca8789e7a954e1b4b9b8b364cbdd392aade03901ccacd2d5c25679648cb98217dc9512cd559baa335368a24c2c1f2d9e6c36ce387696ca37768ecc1c1e9b0e302a5d495b25d718938917b3ce95d2cd559b2a38536ba24c2b3ecaaea71a67589d251b8c3a475478cc12c04c2e5d2590ad126c8c69c38ba974a5c85549a76aca1495a812061f604fa69bd34c23b654fe103b3212ed9e5bdae798835aabe5bf0736509d12580d3a005aa7510fd5ab530fd53fccc822ec065f39f8aa0297b556bbc90e94be1d010d61bd7a394443d0c7b7471b4c82bcbae184e71774a72d4f773ad63c039eee743071acf7a7bb1d475ebc333be219fe661eed5e0ad0f71cf44b43d06f4f71ab8ba8200e7aef44fdea462060f1f445d4149e57cfbda741f6e2f0edba672f066b2de8b1cc2fedfb482b0b41ecd73dff2ee897e679d05f32c85aaa3abbbf5eabfcf5ddd31a11cf9a7641152b8a3eeb4645df5b3ca2c0d6abd75eff76704c7167753c71ab4822530fedf4b675f2b9f7f50718d93a55cad741bfde3444e8177c9987b4a29f6fda4d067afd79f8b6980e281db86ff7c6beddf37afa2c76fcf8023cdded40fa158d45b0bd968d24ba7be620f8854dde46bf79ee5303123978947a18fda3c93c9016f41f088e34702cd16e5d846d1c1a5ddc0dfa6d44e1b9d7f5236ab7fe91e2877b3cd1ee919e75fa91e8d0e4adc353a71f60e4a29f6feaa1dbc11c93173d0791a72f6281c23d7d1c632ff3d0739079d143bff9f82d8721a9211465b4998fa1e8216de6e38c06bdcc43da8d05d8e1cdfb79a3fb335f711f03cd380061fc83431f1f692038a290b948fed06e78863d4f45d1087e74a3eb9ee823f369998ba3e8230d4d84a4e83ea2288e331765b4cf7de8480b7a198dbacf38862842b0d6c21926c70e2e7bc1040791a7cfe28b3ace53fc2376a03416df23099ae74d54bdfd03699edfebb74a3159d46f9d08457bb56c70407d88a7bb11b27ee714e694f51d3aa8e8dbe79ed7cfbb794ec7122568d1a2858bf7c8d9075ceea7ee7d14d3a0ef403d50f77639afbf4ec35aefb8c147269bb94fb563079ecf3ae4b16d588915fd9f7f7091653ec296ff5c7683cc5ff1861ddc121b464a650ecedce83ea52e8e764421238dfa3b45ff8cbcb5254bb47b200d6560fd3c046927bc15fdb3b65cd7ed05afcfb07b8e6d4561dd5e9a11ee6641b463ef89e0f5d89b4c1396af1e3279bb3b897cf5d0c51fd0fb1b4d84dd32df50d44fdde87e7bd1cf37e9e2471a759346fd94bc591abd61577122bf08d543ff42af5eff0b7d457fe8962422896827784abb854e43af2e86e058f4f32250eae1665358f2d63145f5108734a3fefa3d82e486131f1149547d453f2eeabf41441a74fdc3f5757077425d10cc65592b55dcbf95290ef04d0e0de0c38d6cade592df62aa00a7d4baf776f616c4758f8487e997a2c5ea15df4a5e3a14f68d1eb0f803807e1d743c9e188bdaa81a358aea449804bd2c22ad208aaedf0bfe54500687d935cdb94d5d1f3edd35698979156a674349d3111b53029023a804cc983162e8146d800093160000180c08060422912446a250dba90f1480076ba22a604026a74a0261280a83180662188461000040300060100041188ac11854fc696ae111e10cd10d4adfbc73855d6c5157cacdaeffab8fd83d5225acdcdc68de077071832af5d2cdfabc90ca8e2f7f8c1279d154a6e33d9d7558cb590c132fc61a6a10901aa598ce0cc1f20c0ccb2640a9b6728ea42ba70bcbbf03fe651d285140cc105c091dacb07029941d5b2f1e33e25c8b669a1dfc76c6e6ac9840555cf00274f7292556e0b781ee185bca54e5e5559c2475ee2120161b6c648dd381deb760b75ee8d7b9eb6ad3e9a0d46f6f4b2f1cdee79429846ae5f5beaf9532df5bc74d7d3181fd89326ed2c0238d99ba2300cf3b1c8729d8563f61c925b8630918259a2b756a1069717ea2177a486599dad36d5b4743f8d45b02eccf814f269d4916990b8615c0150c1805a6a9cbe9367557b336dc615b3773ee07ec408d282987cdd98a249f89508a3bed15e2d030f1b7c65196289326d671f83f4c878ac08855dd3d15145450e449dcc2e46af93e83280e881ac1020d2cc3a45c96ef1714c1c9b4ce3e988238eb9141308294b8486afc40e39761217f810a6ce77e0eb6bd62d73bb0bb5e9de13343551cfaf0293203fc8ed9a3d3179c0fceae403a7d1ed6aba382889dd9c365da81c119667005bb2a6264678abb08f9c4f86c8377f47c0c10759f5adbf434f2d7a12ac4ba24b2c88528832468a6dd6d7603127a32bc643541a8053100f150193110540072110aa43d4d604e40eb86f280a677056eea8d98a8091b66bf68ac3d5bbfce958c2bc68ddf448399cb0e2736b27cbf2c090e7c3447f81609b8fa5236dd012b3b2e7092ec10984d1d100d3e4cbdfacc0a81f6b55b82fa622ad9fc8283971daacc47ac8a602cd2167804472ce35b200b78f860d56d07c8bf43cc5c36226dfe2e8603a3e007e1fd3ddf6f00b8a51595b6d6bcc8f6586c39f7f950014c6acf1d7ee5dfc5b21e7639f2faca85c490d85232a757185e1379443f4766b451b3978dcf28afe121259f5a428cfb9b8a05fd9dfa241b6f91df05bff4a848e24d692ed71484f1d701dbb6240c88174a71a434aad0b97aa508af2a69839902773466c15aa40a7e8ca38ec26fb4e9a88d3ef3543582d0950342440f1d07de537c36772a18692039a61e08724eca09b2e20a6bfe040f4c0cd8cc82f0e68cb5b8cb10f300857a0de483f3e358fafb7ca02f03c68657034be02aaf97dc25cbe11021142143908d6ff1517bbb0380726303058f17ea7a30baba110dafee98c9a78d0289b6ab0c425e5b131539ea8010898a0ccfda467de2acc708de1b9305bed8fee4859cc9b998872d7c3d40427dc96ccc69cd5f37ea15ab0c19ba41203c47439b7dca07b3e5849fd63221580870aa7f1b82d297dd3be103b97117fe3305da99aaa26500d855c84a1bd93cf9264cf7434dea47152942bc4684482632cc0d2a8da1d03804eb8638036b6985d590f6dc058877b64e9487a434499188dbbc8fcb1a8e226da167e70e075fbdf7c048916f998a9f18a96f32da0bf692e218396ae83dc27fa11a79077bb774e01c0526fdeb10ac2d3c9d01d230d23de224ab256f81d95cae2704eb805268241aef58b49834cfce937034b68750c284ef428d3655ebf60466ff44253edeae876ef04a7308533c65f3a2191604fe675815ef8ad254ae12403751020103a396798a16f409de6c177c113fb874b652893761f5aa8c06d4372431fc9c64b4394024a02263f7e842c4a28b36ec22ea43c877f561526c6d4223e0ccaaf6eab4b6d5a12e11af82674ebcdb3e5889b5ee4eb65b828ceb40c77c219825f6613dcff4ea2a0e0d16d1664db8be1aac149300db70f56bd3b7d8406a156b11107e30d626d10ad5fbb75bcca7bcd41f140fb3421d85e5103ea54945bd62d5749a7a8423c7360205160497a5d01cf00bbbb96cf0a03812aefa0931a6d6917321ea4591dd0b0511ecbff0c3d2f7b4c230ffb2ffff626608b94c6fa52a698bdb39feb55787a42fef2ae9f537adb7d501c308a5bdb9b989a9fe6b57f3b49ae23be0e1cf1cb01ddfce3921218a2dc91280dbd7b89357640a411a0b9f52a181364e7790298afa9213bde4ea2c53f71d4bec974d3e234dc72a791404ec71b1136e8c7613bdad0a6905f138d70b201d85633374c3f9731ef882e7a96f0939c5238d25c881cd8050ea74cf1a34c6df452c976e59fd4e40d99066c1ae90d6dd1352bc401759f0e42a8abf4adf5b6a0631ad27b030c6507a22a05c8971705026832d817aac4ea137775eebf5199d576358929b989bd6673f3287903d8509ff64299b3ef273ef634a9e55c20e7dc0bc7199779071513d208746ea4342d61b51297f052a79c589f141f6b48fb5885a62609d4de4aba808de60b2bea5497b2599df07bd949890766321d1fd058489cf8c6007b19694f57d25fcdb1a1742cb12875d87a381db63700d6f236b9dc7a2cee5c5e7f93ff13bb92852ce48c39ae53f3c1440ce67f81a7744082950d5d7e2a51a26fc946437189e0e40de978a6ab75ee422d02036efbb1b301b35b071867907547f39288f674ea7a324062ae8cd21a2f510d52a46d6ffa945b3991c109be2ec2d87bf52471c8f25b4c44964ac3864e66c12b6cc4b21198f8ddf31b33da55434e883a41ac67fa30a872049cd9cd3d8845b4de12aa4f25ff08c414f9e142d4bf7ccb32ec6b4830a392ee26f58b33cfd46426017271918797bed8d8f4bdd09569ce95cd8224c843345b67e4d1bc6643d39e1813bfeb1d249249c56e445d599ba67895a07c43fa7164723078dd1d15c1e9a6bdb2759666c06d0a48b9cd36ebcc7aaf844dbe2783cbcbaf3826f36b7bd63331829a9e5a261044adf67f1cc81a01331cc06ee82b106540203e234cc3e20d36c6c69d5ac98c930b87f633efcf8945b08d4a0c9a8a43c37d30eb00a4dbd7b61a925a5ac77bd835c4cd7e3ed79bf85bafc44ec9d609af201db1c6bccc60ce906ad489d9e9674a526cab6d1c23321b4c097054f62f65244e6c0c7b559d85a45a8030ea72505a4fdb5ad856177eaa9005d99a8b42a9885af4d202eb0bd029488a5019b0f31abac32b9376389d784f8d4375dec91a61cba3fda995a65e3d32adacb5ad33e1819f843c288e2cbc0dda463c69b0653cd530da60a1c59792b1ecf899bfa7a9d8fedbca79893e047a31e925855e70ef875be3d1eb4294eefcc6d1b38b092d854eb75036bc24bb5475a066ae517b0c869eb91caa8a24442f68899ac572c3a81c16eb4921d276afb4ce383f741f8086f2210e3f8797928702898b743a53c5b4d59d8141c420e221db033f651634ecf23cd438eddd1b3d9517f1ad3301b7d514b68d7876e6fb230092a1b5eab1f8c9dc942364eee66e1732b188514d13dfde661ae15713916075a818e245c694e46fbad8a73e80f074caee4ec23398a30f83b0e76731f2524a8e1893fbbb38cee05a0f159ff844817bb5e22801c6eb222bdd7b528476a6c1920008cdabace58c39f5035be4f5afcd1a294a801a6f74d42b20aea1440aad492cfe492a60c503f4eff54473b9a1bc1aededc5249cdc72c7d5bfa1440ab67ca8f334ea48c93f7616a9d4b9514357a2e55b32c4f63e698d22d754b10bfb81c97966f138222445ae6959923db6693ccd474dfa64767cdc863f20f2cd1682b1a82f03e652a9c5f080e660ff75e4549610143e1e35dfa75d5bdb1c1bd982873057734dbb6530894b52e6c9912c8b9d45182d89d03208974d0b8749a1099cd4a3c3317a5c8bed30eebaedb7dac9ef639f070642bd6013df7b5cd1e3b71685bb1297cc5853610912173779da50f3f5dc400d1b30f55208ef98e7e401fc5044421fefff76913d8779e11e93bfa38059a96cb755ef7878214bfa9d04526be9866ec0d1c136fdad2da0d20b60e4d5c5d73f35dd8684354afb2b4a44994f63846f3a0d3b5222caa64010772638ce33f271a7f03b649bd8ae339b5a2c18fa4f87398839c87ec7cb41dcda1fece1a80ef23c340593706486b07b1e18d80f827ceda83351477e8ed76d2375135df7626abda085130034f22880e054d6f84f18528d81c5adb32cd85275d11758c30ae049c7225ee1e0311d04db57dd4af396edd1bbd36be9ed649f12c82e1065393afe5f314c8db69cc2b4f8811ca4e63115843018ebdd64a6879c86fd4db45b5e452dd8c3b58490081cd7b08c9d02482c9c20c3d9bcdd15723bdef419732b5c417dbb7f9f63d471a287a80b8563e2c19692e596e5038abe631affae8b8866e02085530f33dc65ef6031ba69c318ee631cbc0515c723d82113835ef1d998c264b4909698caf265a53630897a2a495c5c716d5d8c542e4233ad5d542eb18eb04f0d00791e082b988b574bc3f128f9704ead41cd77a9426844103a98167d44d97ace544a52243e87c04e2d94d18cb89f0754e6b9a69b19b7c7bf4c58b3a37589bae0e8c8ac3e927a4b25190d030b0bed72c0ba734409e3b68097504ae3b1f8a48ae31e323b0fe4e2a4d7027d0ac60acda63a2df71d58b61c418ba08b0ae987e774c204c8ec405126d35e30b300a838fb01444b75f7fda0e2838a3c749c6b9c8cf04dd644420a278bd85a41d38b81376fd08300f263e09622509dde9e1d751835efe0d7d56559986d160d432021dd8df83f3e41e32a9058c54e60994f8cb24978289123316b9679a738c056994a4ca0b0aef3fac7013f7057a4bcedc14765d0ef7dc85013dec130b174e3c13e266cfe592d74496f1decd8598c8db4763abcf863c878c6cf804f4642f306171163a8ee22ac2d1ccbc1474467f20f508bdd7098f732c60c8f41b303fc6113cc74afdb0d8a8af79ca06ded9c1497f6b439bef2e08d0d36a6a03fc0888bd6574017c5c9bb845aa2723878d0857f7ad68bb4a9695c7ad8f94695d6d7e4a38e520ac37b7c7c1862419144a37df5c014bf1a6af88d38b2293b0b2792c52a82f7c90081a0dc47cb1760521b1e52259aa8452a46de052d92140987b1349d1c58dd979e0254d7f54ce0c772c3dc9f5364f3fdb2c89de47b390fe3c268438b06a516647b3aba8e9959401ed982bb16b901f496afa453e5d6b32bf9171c93f48cbb3a2acb7c85c2ff7989c71b011db0e9b6d61b62acf96b3f08619e84fb1a0a5cc13ce9aac1bbddef4f8ce4f285c1b975271cb9c422f93cd869019817d34a5eaa920faf2d4b24df84e4a0bfa8670911c6f3a2c42d6d46c198a021dbbde9d046e1451c5dd60c5b5bd27344f4a80799f54c7526c7f4b2746ce44bd45cbeeac757c26fb9660a3587353c0aad0633aee0e4964d08e25def8072bfe54b420b050d282a0c3aa32fb2b721e96d09bd1f9c48d66cf325de169cda579b32f3ce64c525c773d0f79d54b7e17e0b17eeb4ab505d72114f250d61c5645b96e7f612524deeeab54c6a0bd71bd661864fb08baa6e2a078df09d9c683f13249f2655f4d018a83bdf4562e57874e1e34323d47a49e67cfd546deda6ff61d1130b1da5694c65723f416081d3b6d89f2a7cfb4b0adcb46f6e4fff19877ae73cad32226ed0458479ac746d41a3c22b45f1dd622856eb457ea1e4a0d283276fa9d91131b4e4e02072a17cf9c2b6e5d4953de16e98e34052b61c3edc5efdd4a22989aef84692c3eec2171efac1a43d46c4804b506a4cc3f20efd2e1a8383cd313bdecb2840899b0c49d74f753eacd82fc3f1cb1ee71cc385a84837be940b9a5b16da816af903ffcece73d13f6e993c40d7e9b9190d917046adddec151a39315bc2f9550c75f0c34d67d42321da1b751fcdac4c4de99b907358a19584069f280ed63ae55f3dc88eb41bc1a75abc9490c5a8227dbd6a79ee2d481c4fdc1989d3c4f751a0ae5e14b9dbf4ed15de08ef136c73e517c36a28ff34f6b5e3a4c940e6f5c07990eaab578b23c8faf347eb4acc01177534c20596a8792fa5661ee71b96d0dc71419a2fa94b71f0641058859fc6273452ecaaae827f53be886484806f7d5764fe0c38ced1bec1763a8c6390b2563ab10bd05a245b66c9af386e6ca65d23ca45d8f8ace2fd12423e62e9152fee9079d7cae11ee0c46404c63f16ba36d3269c5da10f215e23e5cc3bb1bc26bedc6c97e77903caa6f4933c07629f00943aa6f11a79c443bef83a0bb521de7439a2e061cc09ba5d8739a15a5196e7d58c9a45f178c59dd9162efa08e0837dd0d3ffdb3f8dc0755158a8ebd9e7d482e1221b461966a1536855eb9333e1abc4a5ad08e5771fbab8389c10e5d13fe08f5502abc93735d579031df138cfd4655067855640cd072c7ac4b62673cfed9288feaa01a539c6e1c2d0783946eae08666b6efcf5ec235a83213855303ca62777f8a70dbd9588bd7b2c55f4702e113a1442f600ebf58410a41a685c4d8a99dcf81693aeb1d7fe9647aac1cc74fcd4f9d3a40047c4d99f562a720041283d6325943605fd7c171ddfa2bc8c82cb737beeb172c02b4ceb2bc618e63a86bd1c3d95cfc93ace95110ba10286d1830410fd85efc91f18a9cad9363b419e3a28f62fbedd09c648f5bd30095a7ac99ec7fe4e9ff83502a40a6581eedcf45a2d591bb0bfdba27f6b2f27486ce5a095102841bca9e1c09043f23b71d2aaec20dff05c63c222536acb6efa65c672062b23fb3f3f334108f6d36e2ec5fe0df601ebc87ec3a22a4944b6e0f34256bd081cb00673e0c6fbb9f47ef25965bb915629560cad0a42028f607b5905aff98c05a7e2ae8f57249a5040da96205f343ce035a89809c780b81e47aa17243d11083460aef2f99e399fca13aca616b53b2f895e37aa65efbf75a30277b8834fc5e873149fd7c666d2a6fa281806736265093ef5ee44c3ac18a198bd0e7b582d253388ec7a630ec1ee924b60721f0b48eec1851c2826900b68815eda050274b4f6dcc7c6dfd4f1e0cea735a12bddbab9a9b3d977907889782200a117f75b1b8778b816075e543571dbe5c96d11384bce3f971772bab81c616dbee9f29a78acfa3c5848b5837bad7bf192660a403dc88ac997c4e941c812dd4889402a349e02ee3f56ad1108e8c824c58f2b8ec01582ec8239e720f0ad16f10b5e14249364631e181e626ab5b04dfba6caec86a3f05f5027171c62acf2e1c2246e4487d39655f218faf1519a4b6aac9eeb5a2b1de13c2a8591c234a89fe2e04891ede138eb07296704451920370205497dab2db1055167210c6345eee3aef8045d2997921ef2a240d9fa8540b8c183c1ca36f44d5e8dee48a79a20a5a314609e767159808b47a4c2e2c0389ac983be28ada68a5be3db009d2e233058a0e9eb887203061f5b0b1a567ae91bebb30cd7a3dcc9b86782b838fc2509ad9ad6cec539bacb0970f19ee0d66d95ff0a3e7de0ac74037b8f9e73046e59f95bdb146499a176687bbc6f582dcfa49013d47a66a0a1a393c10cc2efe68854a1e66d3a25c4cf8854409dac16c0d82a44de006faf8133b9c1bf2ac77aacc6809707416b037a94ace98895a81e7f3b815a2d03bf08f6be3cb2a5799fe1d46fea7c61dbf9f74fd86549e24c686199fef9275c49ecae94726cc59238b2ada8beca99b882ed9c6b0b6ae9829ff8401b8d28edc4d3996bb17f209fb07f446e0821b00f1dd3b00c78c214c09d2aa3d769ee8539a846b1dce63d83e93ff6ef37b4e932b9fbdf5c5c807d02bb9f9e26ce61c44a3184f2754d61a5e791cf609813e68d498541ccac3e5a4fdc134e8fd5062fc075cecfead1b846be30f65e15a95619fdd85a11fff33eb5866150176209bb004aa0070190cb867409e6b01e969569b10aa9d9846f32209423de08368ec038fdd46d29217c11b408c08b003499c526c21eb776ae72370830e2c7ca05178141f819de12234413218bdf0fb2ede2e903ee0610af440143f41b30411f18e7609abf9dcdbec32dfaeed8cced654efe54bb2e828a2330709f3d3816703eab66bd880b27ac724df5108de342f9d13936c40a84de311a120854373bc648049c15579f3dbaf3e13ebcd62e703e6de78f8816e64f1a9712e2fd08ca699f1a6a17899f9a438b78ef5b01c1672e762ef253aa0e43f7332c07ade707610e2808fd8b66c29c115f81fa6a47418e0effaef627bf0e43fc33b5250594d6bb759fdde53eab960702882158e43f747456e07faedc73417faeedeadde2fcc039822196112f840888310501c1a7b97370d11fc372d02e458c7c2ca89bdd92d667b0bd25e8020d2ef19e789ff5ad0f4231021f041b44244255841e842322c5113f0df3cf9a2d0dcad266854014e4f35e0e63f629ddce20d4053a8ebb6875e9afbafbb2959bb2deb13039ee79d52811bb11e088c0207c76e05820f8d49aa54400fd7f5cdb2e9e3e076b2c849fa4db59c43bc4388269884d107f10e940203e0283fdd96c592128a09a7411a6407022d409c102e1134327b4f8437351237e1055bb5e7e6a49ebd6880b7d29979b870bdf02cbe7c78d22744238431c8b3081d08cf823d485c00f016c0486c8cf789d15621f89a344ac4e88a0cf4f7b4b4704a04f3e436f17a84f96ab4680475c422884f808210e61265c248dcfbf8b17741c250cc048264bd21dc6c2874edbf6574b3446a74892fd915f8731fa99de9e0262d16d5c68ffb88f352df89f8a70319da245d6c7f706a31118bacf263a16909f55e383501881f808b598fd17ec2673f70e2de957be63c06e932b281f8c5383c010e88a37ed6c8422e21191e35f3721fce4c2816a7fbeb462207420441719e14054a1502c84b70d32a2c5c347e39e42d4e9074dc999136707f904ba154658f14aff68b140cbb5ef2bfcd06e2915d1e2ff09b6abe2f919b7092116205e208e20cc204c1b01d4f7c96afb84a0c2f4415a3739ea936d6d1174b1baabd20bfbc7eb680c4a1f49bb5b5fe573afc98b70401446e023b622a0405040ec8350cf8816a34fcc5608840294d4900db0df68a55fbafc8c65cc02f5e43cc54d5b118213f14e0446d18706ce0a854fad43477c10aa362268fe73e0e221c48df093f823b841019416a6b9e1c4533e99561501200816970f953a6a9d3e15d92e923f2bd70da13804e0d715c924b9f94598223623a6b7be0844f976408d98a1dd828db8618c9cdfd743e1db1d73004ead119cc5fad16eac880ac4dd0807083128be19027a4b71258e1ff68759f0d66c994b3d18a323dcd18cd3fd406a67b04d11f9a6ba33f81fe1004676014597d65c88155df8aa582d9ccbe104f904bbc208e5106e448a44b460fad41c6a08f17db5444ceec813217e562e078218818f48d60f8a7db20ea351f273e5ba1157fc73551fef001839445f18f8bcd0e4a3d14d5431848ef013f80fd7883081ce1ad144b06810c67adc093bca4985829345bda9710f90e7d9e0b721cb61c9668aeb3366c6c2656071dfc0de396942d496aa8534524d91816a37785ea7b69e1632d42c2a8082f6c12f6023922e74ba70508c6c3d8dad4b0feabbd3855e720de3e7c033df67e219269e088187828f76292525dba9f2f02273c4fa3e72acaeb1f17d5d06ac51f942519e752883cc8c104a31ca6dbfb0d0ad27056cce2c74281dbabf04b164849eea78bb0d563a40e03af63efddf22790ec5ae19baeae5f51c9ac1cae8a9668937d4fa622593724a7cb20ba44965d7a2e73f0a75174dc61806c13c60756e02f90537bc085b4b5bc2f02329b9850037f6e4f22f9af210dde652fa91af1d5f35a972d2c2f29b3ff152ca6208cd670a662f7f9ce18c40877aab9f5a23f04a4b4e3013263b42d0be41490b6735c105bb62f59e221a3f7835e5a12cf6781d742643e8c94c4581d6ed1df6022d46aa8a570c44372f61d8473c759e464480cca582c34cab1a7341215aa45f418e9bd52486a3e347a6ead63944e7dac11010cc17783a52b2d843d0c56cc17d75cbf045e3773eb550c54a4d7b3ce7ca5f0c3b308e821abed32e312b104f1977cb2ae372e25ac8bb2bab65c1bfb128b14497321398e3de11c120044641a31b42fef43dff86cfe76fd9cebd7f39cb4d455496019d4b289f5da96e04d061397a11243a1cef3080f5e1a9c1e15da744691101c4795341f017cbe057837d3978085c2387a53d0c06528895e1e428fbea0f59518a7c0d26fb2674c41453445fe7e7beff06ea43a92e791cf61584c5adecaae6922ff22125a0eefe3fd6b102809473f59ee10b63178a7b177b358d86db064f65b867ca6e8bb5002a921841ead9742607aa4d03f7a8aa58b66c18066cb0e22572294f6ee02d45289e277b0ec81e36d3d36863c9566473e18689a202f15a576003f8ac00f240d1b0fdb6bcd0857a6e7b86eaa8d277b99e50c9399fd48a1cdaa10b63c57506a039eef84e4e922c267376159c66abaaffdbb186b6d4f691e88e01096f081af7add35a6ab5d5bd259549e9672d48f7b1c8be26f6de0cd6fd3eba1220dac1b416752d3a4b46ac7713fa55b3ee3f300c2df0f08eb5992ed682098e77128e86de69978032b80a0f26b909b04c3b546eef6e727836a12daea981ff85d0f6d3e385c7668be1d2e422a859ec0e921e7dd6bccf144ec4fa805fdd037905708732b7f5560810661d6678496bbdc706201ecd62c2b1a02302605dad60517727a20679aadc708d1023db52dac037851174654d5aee99c8c1c633e150c39a0cf06aa4dc5e2cb630f4d492616b288f3ba90cb38dbae6ccbdf9e038dee09d196ee63df81b309f644277cac67154cf54da4eb71fcd3c1f5789e73a8f9eb08d579e2b5bef842f0330ccaf29662ffa74787ce4fd8f1e29dc46133088960ec5cc62528f4dd0109f5720d5fb88d13a3415c1be9241085cc1bbb6c5e7e13cbcc1d5e340e91037b99f62001dc4288ca577e6586e5fc4861e3290fbc9baf51d78ef7f46720e16bd840c451e99ddcf172f27a7b35c6fef2e3c82535c9aa6f9d92384ecd130a49f6454c16060525529f68ee21c439ea9b1193f8a5cf7af1d0a09f4516a905b138283c05ec1c03aa4ed05d274155bbf5d5b7fad5b1ad1218788d6646543b7cf5d2b85cd366c53ce0e4fd7287047c7b2bf1d2a79e956f0af1d99ae73c92dbdee061f71e4f661646b1c8003c4cb356b5f25524ea1fe5ea07196b40c2221dd2abc4158059b9122be16b618c64d05a763106bc07882ddd768ce7bc0650ae0baacdb227a7514bffb8336b7783c048603927abc8201cc87214e24a7b0cffba678726b8d4dbbd590124811b1427c05fc205d37730a9914140ddf0cbf8573b05753da8b48dff27b6f7c7dd5679db2f1dddae9c7af267c218c62fb9a7729c846e2cf29a0f11140ecd658b5ac6e36b8ae8490ddb84a07214e22824bc1da031cb9fe4549ea348434b81c43c153a70ce1cbd08a8bab1c8cfe4b0c052d17ea21f209e1118525c287ae01a8dda41e658d16e8f4c015ba3fe94002a376311e901a18d15a199ab6e16c874089284775ce7594970a56836ca23ce68963c9fec58e96590a81b41b37f17486065e0e3f472549d33683d2ed59d6f968e08e311ed075b19590760400b20c23aca3d19ce1aeb9e844a68602b4515855e5f1b24ecb1c2d9aba5dae071fe50b4863e3e9723be9fcdcb60da082c68f3d7758b48333eff20fa89bc0aa46db3fe58df6a19f7d1d46ed781522c7cc0abfeed35736572dbb640fdb980e604b4ae5c6aedd02051adae4d77c9e3ee6985cd7542c50bed2aa89658e9f3522d7f47baa55e9f13ef23cd98b79447f27f1192ef038aa2bd2cbb70ff4c05e27dd8c645dea92bd070675cda7d7ad8bc0c2e3ce6193428815ebd698c6700de565f4ce8adb9812373582755924d124f5a8dcb9d81b2f44eb2acbb6d73c2b272bf310bb9e67acbdc84f8a6c260a85344ae80e3850c9a0cd28d2225f0bee6bb3023adf19fe1c224c16d3ad0c238b5472fe0cd50963c0140e592e9a25ae7489ac89c109492c885595f80b538264b2b04b96e74b57b9fade342c1c9b6b18c9149665edd7698c8e446493459060e618d80a9b8d6619a0b3c8b2d621f75c598de46004895960b53f09fa9d8cfc9d3d110f0deb8ec5521d51953ef6f5be2b1a2dcda9a5c4cd3452bf3f13190916eb4a5e1d104f1506bdc8e8cf770ae7a2bc2d6ac5b79eacbf4c6c05c45bae4f447058d4e1fc6e79769f0624ce03b8d267841ac2d2fa3bc7c7c62e1a634660ca15eacf306932c5462a6005e08aaacdb4fa24818b911629ce0294f3d5026c1f53a640ce2ecf177011235d0b119c3f957e07f1b41189a265c89d11c904ea69bf9c3ca62ad86a17d9ca1adac34d2da70756712e90dad7a4a66fd6bebd694088b53e77b6ac51a9396af2356a77c5e67a6c53abec0a6f8a0526332dd61942a4cad5bf7a9a8ab88aa5e5fdd9bec59f9a216d90162e1d64b5742ecff9ec71695a1ce4067978eecdfbe9e02a47137370bf21b931963b21002dcd74eb6d227419154b8ef69a70eaf013eeda25eae5e2137cb7e56337b32615bea5c5745d20da9013f264ee084af59f841b34cd65228fd7226611f2827be14ed1b0f5c84c56f3af448be1e6facb0a9dbfe1dd1c8160d56824dc12f5177861c7496cf06868e4106d7e14eedad125f216b6712818fe4ce48606fcb79d6f31a56606384d57d5429394dcde3da5c62259d35262b5c5e6f89c7694e03dff1adbd75687d829a46809679488135536786406d6dc269d4c0734f04f1478fbb1cf39facdc42bf87cb10450acd1c9fed1f5a10e56be65eeb4ccb19f4036de83023047dcc2de521a38ab690c6499c113c0751a8b09c73539c16030e9689d52bdbd0cd8c4e96cef17b8b7fbfed1f6bcbf61f9384aa415394febcc05b1522051710e4647fc027e8be625a2133c691e48a309e6f03fd81af657d13a0b243f5a37715b31d9af8d0e45d98122c0d1cc3f5371bcf25ab655a3ba0aafe770f0ea8d463f18220a522b0827f52685695ffb9d470335e896d8501313ed174b78bf98b3ca6bf0a0f1bd34a814c4153ecbc4db6f4835aa1302b2e41f15cf1d5604b730cc687f502f73dd15a84d490b298c8e9d77cf0d3e78199f63084760959e1ec7fe0158ce978e22e99714840f1f425ca2e3fadcd58b268eba294b89f5a6e799b71dc4a42b47376527678ec25558a98ce88fa1d0db7341bfcfcbb94e1c520e5c608e6417a4ac1dd03d6c6143097460de87e9c5a3d880b770a294140ccd9b4fd4ab73b3b4b31833a4350974b438378614420676ed08f09d0db01b8360f6d51a721ceb74d91bbadccd14c122612c3388942f7272515262179a08aa4d9ce0353c46ea7aa09c4609b7d4704106941a5687148bba795e1ffb2cf3e922ac1f3fcc448131cf3f9cb21b157d88fd6bdb633b8e216e4b3f3e6680d689f11124a8fdf78506f78682978c367354e234dc8dba6ac475e7ee6fb3c9878e62f9bf09bed28b7899423c99758fa49ef322b0851fbe24ebfd2314095c9ef755895b25439a5f7db90a99521d1e7947db30efe84c51b5983329e62f99dfac60327fea0790031d69e1f3fcbbd2b0598b9c6f2d318f26476e15627e26b0d6b27ad027a50a832a892f1abb7cf21d4bf9a6fcfa05a62fd4da6aad5ded61ddddf405196a55fc552a782d2ed840a065d0a925a1b626cc83f3d737e9d09f6af0f678609f301efd750755af7efdf383003f0d10df0322547aaa1cd2c0c19598951da7d35d1abeb3ad4b720f1dac250075b6fa5010573fb8efd79ce826e9c97cd73d78f088f4a13efca13751095d35d816235ac5ec0a324277032bc9034422e354cfb62c12218546c9896316b456f2473f0647aeb29aed0463389d1d98c92518d3081c49116005ed6d9011d45049c448fd8bcb6fdcdf94545df8683984a5c762654b391d629b68ab236b62d1c3a00e42eb673a2ffb48b0b36bba70dd2b1789431130b0bf3837e302d1dcc45c5bab0aac1204fa193ba45410380b4d3a958292b819245d14f8bac8c1917fc8f55059c341d6c367a511eee873a983b4bf2a3ed17923ad32d6439de64465637772e31287f89281863798f56d40659be0800f7dd3d79b10b9e5de726f296592329909670ac40937dba261d3d9a871dbdaf463fa7ed51fb5404a80e39c9a0a95e63eca79fa33cb856439389ee6e070a19c108643c7d400c7c775e792b0bf5973a1d152ed32d7856e48ef175e172d154887a8a492baaaeb615a6e1ced3beb51c93796f6c1b723576553ae0acd48f92dc65866abef77a16743997db9c71fe21be771f4bcd13734a8c72633aeca0bfff74fcb3876b1ab5cf66ef7d5a6a676f797d3b2ee3babf1d55ed85d3b2ae1b2749c032fb0fcec72bdcc433c39dd75e5b58069f4fa4e00ef9c57ca4efeb679dfcdb0e3244fd7fd94fa765dd8fda5434a1d97e4f518d49cbe2e7aafa79267be9cdfcddf5b379299aba352959f8bdecbdc79b7bbf7c7bb3fdfb230b54a2ec27200e923c92453503b842d6b59d66cec1fb54ab6b72114fb5b28af8b339425a994f2503a36896dfaf82505cc7621ce7b99658a6b997d0eb69549d9f7bd135bd68e58b3b3d0b6fc62cb9a14135b695f7de9f75866297dc251dc7648f7f73f5d44bfb189b8dddd9dda9724fa729571cfbd7beeee491c4f8b85116be6951bf1d453a5d0b55472e4fae34de2deea3185238a084ae26e085a0d8b02fd79eccfc3f982d18e76958523a02240ae6ee0b6dbc6e3658c87de997d12e028ad8aa82b1c7fb6cb8ff8228791fc9c1cdf2d6d8cf3321fc14ec04fea66521f078efbdee3f81aeaf891d2211e5248cf04627300ed6b0f6bdf56ac4039394d71266772da9a356ace9c3143864cd69831565bb64c59b102e5e43465324da64953523ac104139628519204638c43115ca445d2470810fc187e8b35d00fe06b6323aecd0487a00892c867cf2417381bdfb81096443e42a08b509268680ab94c336b9a914478d31d379bfe5ce342f8a9cfa6ef4c2e347bfa3e85be4349229c4d71a8f3de4b99d6f94ee31d7aa6af8b5d8ed7d1b2c739f04bb13e0f7d25cf9440ead7d7d1b3e994da5f28a54ff534ce773ae7b117a4c726df0f0e7e9806f1fbe3e8cf458cb5f7327bb77ab5de2d7313d7b6619023c0515a1d7121efe90dcceb91eb73817af4a94dffa547579edea6672e6e3a08c8082af777e40757bc53eb48c2c65ff147edc45f7bb0be17e4a005506e22225025bb3e09bb86586afcd3d34d7ef6fd9824badbb669201dc0ad7abf69ece9b1674cb26baddb05e201dc9eabffd551c9c63e5b126ddb5699cf86c02f7fc7f8af27a1c0b93d97f52bcd37942ee2f00ea15dbcafe0ed019c7b0e000fe0bb726f38d2edddafc3b3da1b5ec18fc318e5a143d208080bb83dbd1fb5c2dddb755dd775f75eaeebbadbddaeab33ee76dde5e4b66db7ebae54aab5c9acca29a59cdf757a84edae0b9dd039b76ddb6ed7dd6dab72e3b83be6a36e0451f472c582e50ea516fb47abb848ab1938366a6b9b61cbbbc3964584d9f793b90817e2efb3fab571feac9e3a838da9576aeb66b9ed726fa7784526c6e9c938c40fe7f85c39477ef0f1ec9bde6f3bdfd41fd6f9808800a5e8e6429ede42a4ba9dcc36738a0daff4f164432892f77263f19b1a96419e6fead92b16f3f14dbdf33c3f32d2f7d5c551a9aed9536fb0373dd6bdbd72527e309481cfc4beeb651bf77c5617b1a16ce328f97472d1a56fe4a31c7a6175d1f33104785dfcf14d1d04fbc13ff473f2910d83f4641b4e282b59407f11007065cb9c645db4e19c62c322cffbedc73905cc36248239f8a65602802418c8373509f9c88623d44c70912e01ba027a930c3030b5d28e137000bea9a1b8487f837c64c314c40db0074c216d0a7df4779aae80738f730aeef931978e8436f87c88b988ef219eef878f259f7ca423c88faf271ff5841ce8f80048073f40be00007d2b74908bf806e1e7f3f2277dbcc701f8bc2ccb49de6fa1ccfb9c2d807ce4e120200fbe39c585f2910df1feac96b522cad838d90bab6be3a16f4e11ca453ca33cc4f7379fe81be5232f9c4f2ed6a2a6eca9736c1ce483b2c7a27c64c3f9f461cff3ba7cefbd2e6eb337ea0d0e85e1f01c311d3ab2f9c18ed9ec0339a55c5b28a54f372a39256d3f43d9f6397be72967cb8ca4fbcfc52bb95bef379d7400e586dd0db65724833d36996d5b6d682483edf5f3e873ba0bc79fb16773494625db86b231ec579bc1a65af6499ffab216b5c496fbb5a996b5a82eb675b18636c97e8eac1151266733813fafdbbfbafe74004309e0323b8ab69d8816ec9752ddf5939c86b2ed9fb3e9d109e1092ed207c12631919ef084e65f7e1550ca70e3a8d4512ff67ece106807d0e5d2b15d86e30cd39ce459eff364cedbdfb8017e4cfadc07f5cbf5f77efaf3eccbbc05491f294baf69d57cdf7d1bbfc077bf7428632a298fddb8db79f8cbae1778e30607862327474c878e6cb6a3c7eb10003b1f978106df75218efbc73df9e8761f11b9bbf0473632dbb46953e41e4fdd7803f1e3348f8f1fdfa6710f8fb8810619ec0020d4dfd3c36d3db6d29e1e9fb2a7a703977db9c61e93a4fc15e692e75d15419c01222a0832fb67cb5a10426c22b0f68f2d6b4358ed4aa368a896a5965a6aa9a569aca5340dd572217a75110896ba58b508404080a3acb9bb13b9aa56abeac90ad3f660cb9a1058423c6d71cb5a106bb610521bef4f6be317de91b01b2fbfc78774bc0b71372fed4bbb727264fa755dd7510976ddf7e1f8d98121930fa46946f052ad3ddf8ef2ea7b6b434b6d38564aada59b7dca86e65f615b6ae948d5d8d1777e3a522dcefbd1c30f36a433431a8e124be7836c33e7b7e1927b414bd350ab471c618e5c84bea568a6106badd61e73502dfb99fee4be28165a5d2b1ca19ddde7e40871507a63c9a537cc09c710c78d90a6a94fd65a6badb539a4692690ede96fda7e1185e91b389a7bfbb582e04534cd8759a25813699a2c5114459aa6880e2da13cf563348d28ce5c9caf43bff32c916662a2199a86a6a15a340d0ed7314505c22116fb99b9bb3b9d651ce642561508876a95ea17f5b19444cf66cf9768b6dcb20675b5e57355f6ac01d1b4e78fdcf7c409b767524e09640338fedeef42236c4774a17dbf3a827ae4be43c23df732042592a64a6f3b241989fc2d23a13fff0b6b0d61341fc90956fbd3e624fa3017a23f5f3cef3bcffb8e8aca0a4b92d9f275bacb5926dd7b45bad0b3dd7f437c6fdbb99fb9c8e52e0ef7b9396673dbe6c2a03520f76e2b13ee6f112ebca18ccb479c6f6ba3ecdf2a5137d0e770b8dadcdf1a7dfb03d5b6bfe16cddd6c1703a9c9b0a62b910dd32270f99569b0bc7efd6fb7e7383c97dfb37b2915ce4de2bb77411fbfef417dbf901818892254d52609af214e5bb3ece61f317f5753776df9fc97dceb7ff26960bd56c64d67ea8dd5ce4825f918d7a9d925ad7b47a5599f2016acb5a0f637aa8b2ab13285c9b366dd66c7f2272bb162ceb102c1dcdf61f97760f4ddbff89cd7623f2e73be1b6943e54c909b7bbcd3db513c9f61e72db943f7fc2c07bb276ae7cabba03399807529a10a6cdc659898d4327af36fbca073dded21ff57b68199e5f0ffddfa34708f5df8308fde043207abc0cc77ad41e3ab1f04b1554b024152ba2bcb2658a45318abdcc0890463a51ae0bb1904a4ec223c849d8564145159f638d2063abf3bb15d8aff81c8b4cc2ec672f33093b7e470826ff949c646dc8491667e160430d5938d54083163748f7e123d320a50454a4f80c4ea6ea471650ba0ffbf6addea26ac76730339a9492006168b31f4880b39f99843034991f10022d480d58440218275537f0f8d9f3d060709e879ee160d72f6daecd0eed248dc81dbfe3f10e4d250c4d4a0250e1f13ba8ecf8998f2410e677682a3c2210829492003cc21b763c952aa49404a062444a49801da14ccaec67dfc6c63cf4ec77e85908267361b513fb1d58da198cfd6a3f87b222b2cd76fd93d1dbf997b62b63133871bd077a6cfb733a11c196d7f0678c35dda2d1b0c676db77854fb0abc853a0d16834fb3a44dc477d223323b28d8d671a8cb5386cec0a9fe4d8f604d73de882a33c3e831732cc204399186488e18ba6189ac080a10986305e80e105332ebce082184c2e30e5246cf318519cc9a3d88c8216d044692127657c06c7340bd3d34c775dd179aceb8e6969a413429946ce42b664d0622f298fb3e0b49c9471194bb1d7797b060296684b46b12f721dac6b2ccc4ecbd8a66085366da05161b6c1861950d8d84a23823342a005822d47432a85ad355c05521f58430d5f81d4133562e06aa43c100336ce022925363068810b3048c3054c69bc604d9417acb1f90527a8b1066317e4a46c711aaecf2ecd819b972e6e4d778d73dfe04c1758db829c84b385c1065c9fed962bbc925b7057c06ca43490df6e99915258dad98575dd32e7f08aa43c210b7252b63929631b831524e5c9af66056aa8b00215ac01c31bbdf04650548086ddca001b18f0362e205d44c3db54000d2d9a05fe7b54e0c31ea1a43fb472923d232759cc0205ce48d3820969cc8852821968982620e98ffc92fe40930217249082325ef8644b76fcec6558864309ec0867a1741f2e970be1327292252327590c0304c838d314813328888104148c21c303a4fbc82fddc71862cce00031cc48698099306818210c306a6000185fd8b0802fca4c5140192f46a0c48b2ea824a08b13dc808013d49c0e20290fe5a99900872492f2982087241370a18301b8d8a20a922dc890e0089912ec60a4045af050002db2782a9245560f44b2b0f001098b2b7e18225d0cafb0c24261399a5600414410578488b212d3d583ec635ac410f6b1cb155abdb4b17f33898b5c4ee262953792b8583f3f969e8b888bf57318640338b3c84778661181e509b847daa6cdb67f84cc45f0cc9a581c1185c511565c215584155255606131a20a24b0b2646b8ff86a7051918f6eb25c4d8184540d381f7531b3f1e3e029e4141629a6a28022892c502431e6092590b84f28e18418a025c0515e0de990479ccc540d60ddae2b464b2e62df158eaeb7a1554eca3fdfa56b189cbc25090fc2e423bb05cc124a80c94776892f390967259af8c2449516aaaa26bce4249ca996e8c00b972e3929632e4cfc74e9c2252765cc0490172ef9e8a60b5513df9d01a832c02472640ae926101da101260d47c9c5ae9ffde64e2154f9e8c64b133909e72a2e1d34f185899c9431123924529efa92a80322457d44fad4072285a414698844f2d42e57fecc3dde2b8998c049782e919332ee126609305bbc7860b5258c962aca23e6d69f5aac94f8e2123de8eb111b1209a201ac5b9c4a88c945ece770cc8f13ce2472120693434cc37c3a74acc8330637ae7141b3658dcbcf96352e519b880bd95dff48123a54d5d068b42b46b54af2c831170b242379e4bec20bc923f7d863d39f4ae423bac19619ebf81cfa4a8c0b9badc196352a339b4b95edd4a963225ba2327d22d3c79aa34bf9a955c66fb5efa598c662635aca5e17f3c774900f4486985319091124f21056b224b1fc9d452227d9c7e1a8c2c63fb34c2c5336768242f1053d05fd008ee2ae37378f6f6ebec8a16c8c839e408bb5d537373fd68d83c3e69ddf7600a9ee1c7ed207f64875db10c7fe9c19c97503f637b42ce7717cce37a166ef6c596b628a7d5d283fd012201d123de7cfd13623c1be1f2fd6370bcee320995bae8b593e9f8b29d68735ed410178e3c3cdd7b7f928e79b89251f49e558943dc2da27827c005f145db48fc371ee6f1e9191e0178dc8491c11172a221fe530c4633eabed7e72f71756176995d207052570d3ef2410fad3888cc4ed22425991fcf4732829a51308293eab7d06f181fa4aec5fb1cf3199b18ee9ab6ca372127e1b32718d4bdb85e9148fafe424fc396492dffe242227616bb3ae547c56fb967428f6ddc7f2db70d6a8a030cdfab0e6f6cc45ece330874cb6d436912d59bbfe91fa236c41b3b7ffbe9f511909fd2f1c71759ac5949b9d572af519e552aa45946a7b39bd7d150a5581ae50976075ae20065886a1dab2f6456b6f59fb5266d620a0a67489d6aacaec9b2d6b5557bb56455535a5a5caf6a3a5cd05cbd98ec82389ec960db1db7fe3426b61dbfbab412fa007023501facf5bb70fc93c8c19e1b7fafb5c8cb9582b8db65ddf4ecd8b43eefbdd9eb761e15e8a73595db57b8abda7f4066dfaa6b0c7ed95e81eb9f7be53a2bbf33617c445a0312067eff6e4f442ee6efaeb026a27773f99edab9da4b0bde7f413babdedfd7571ebac68b4cde94ba3ed4ddffd4387ae91bd4c8e65e3fe93443226f37dcf876d39cebacd761b4b1fefaaae9bfede76a48f2d22bb33dc913e1ee4a27fa7f78f2b70bcdd7cfaf631ddec36b739e76c739e73dd7bd76dd37a0145b5767d92e1d844d4a25a55d48698aa597112291a9aa6a6a5a996c416d5a25a5ab82ca022c0ed81b4803a404180e38c7dcee7bc0e3438723cfdb94676adec1817ea1e470eec6b3ef26ecd431cf6f6efbdcf7d3afefe876327e771fc38db76ecd9361cbde7381d1d9d7abf3ed2fd1a5a3dd6d9cb8c64ff5bda9e92ef998ea635176948cbb8e8e1c08123680d98f3f5bb2e27279cdbd373e7a836775716def8aa618fb7afd356eb6c998ddc8761acc70aa4051c41a70ac79f8df3e07f2106bf778c3d1fe5d70b17d1ac713cd6399f8b1f0dc7d9867d125a5354ec211374100c5f5f445f300b1ba2f3301b8ebfeda8e4f53daf8eb36d4358ce17b98e7d986b79ff3dd6361f61dc853223dc778fc47df74bfb8af9f3b7bfaf7adcc11ac77ff5084966d55c04847deda7759ac0b685ed1b8e4db6cd099bc070be623ba630e2502a0e6c00c759b3db47abaaa8a4a4a29e9eaa5029540a6ddada62a3a585a64c991a16d6555515959454d4d3531597e252bc696b8b8d96169a32d686b34c6de642937b202be0c855e1aa38f7e442e0d3e7a05ce8f5f4392b2e14c549f9d08ea7cf6d71aeca85acb8312e247bfadc1587e5423a4fffdeb7d6eb3acf52ab54b74c532c2b058d8bb4aaa96bea194f5b9a65b2525ca48fa3ed14eba46d156d9fb485d2d68ab65156ca4e511e5ab35476ca46d9a91b3b65a5ac0e930b8df639269db1fb6dcb458ec907d07ef73a9e4917724cb4b9e51c937352c66c66e88666d35243e96f6c249113a5592e44b35cb45496ca5a55b9500efbf629968b54774fb35cc866bde895d534cb458a44b13ab9eda5575859b6b3d862706ab9d06d92443852aaf8539453f995a37136be459ba8942af48946512a498463775c0ca0ff5d402d0c3261a009238c23aa6a5848dd1a16524e566a5838cd1c2cb91ba08b332b5844050d415f5a3b6b5830edda021a3a0c7c7a16f5c349a3dffd5e6e8519acac8dadadf2256baed7ebf57aab9dd03b34b73b739ab5da61ae2d9c5b538d9a352019e7a91fc6983d4edafdda69b1c3a8daf527533e723dc2c0dd645ba7ae5f7fb5cb0b5fa112359cf6a68a4fd87604f3169e3102c7993545d6aeb0b287a851a5bb3e91aa242ed465b1eb2b39c1ae3fcd58b9c806f4e6a472201880f42f1d22522489fcc798f8b3a590696602a93f694276f8ba726d210ec71f3353881751858cb1ebbbf628e953a79a1f57388aff0a69369c520ebd201a45996d8cb070415580726fdc1a1c7e21d32b1c63e36fe12882e1f853db4cb5a16a63d5e6ca6ad74b27d977e9fb8552896e1cd2bba51ac923ad607369924736491ee9ffb968b9ac8dc071aa715aad6d31edfa738d0fb9118dc9df3fc7d992726a8f5bd6b0ac6c9d1080b286e5b41d8b861a16d38e6d55b165cbda14517b0cb2eb1455f608ee3973af428bc27adc6546eccfa5cf6b54646d599b226b0aaa8d5fdf77b511388a9bca5a154f43d4883e08b4d61a7e77cbedefb63d2ce643f7b77fdfd95617b9589fe621419840b9e70701c185ec66b939e75f0bfe136c848282762af5f7e2a12cc0192c1d6389a574f7395f4ae91ece2c5f414fe058eb9cd405c614b425352cab3b9d56bb71f7ebe494f73a4d9973765d54b54229a59e67a9acb516e3acefe3388efbbe8d8bfc755dd7e56ccbb83e8c3176b9ae18af2fe79c5fafda9519afd70b046b5756b5ab346ee7f2170bae685bd6a4b032b4652d0aad8d5ff2af5700ac4541668f5f83c114ef9cd86e345f7e10bb85a00dafd89f3a0853d31bd970c779fc03c179fc7d0c326100e957bda38348008e4182b87b6d02120314e6fbc25550068dac7966bbd33403f40538cea63d2ad15d5fbefb9979668c33f30c972a141403388a206c2db0cf19fe7d5bb775e307acd8b4eb2cedbe7694d6bdc56d928edaabc5dabc7da79bdea8fb4d2fe0d5c58a28cd493a7bb56cfa553bf1dd81a57da5690046f73b2da3f7a3bcda307a611add67ba51b8f04b9ba512b828befaf241d8cc797e5c4cb3ebff0405b9d2f446f7cafd2d518c19b3062881ac00679248a604bc4f7feefbfe600dc7d8f62dc4740efdfc70027c62b713dac6cc9e396c10e6b37eb1988d7d92886e0973ebb9c8cc61d7a7da89ef273c7607969ee4d8f49d706ddab4b195e6a68f42a561559b072cbdcc24cc9fef5b14dc753da514767fdbb6bad5eae0cc1d080b1cc59f2049c4fdac2ff6d46a7d73f73bf7fcd86ff6b9cce51acaea2f6da4397fec21449440e68f3baa3f28615b76bfbe33f1eeca9a5f5e6e47fa6c9bbd57ec09b29bb538a410bfe36b6ff7b7c7d4e3aaacbb6a99fdedeb6452dff7116cd372dbdfd76df58ef4d9dccbbc50d43d4175c666dfcf07619228ffec7e736baf75ab5d2e5babb4dea7e7acc6661e7e0745d49834dbfb3eff700204bd2f3ba0d2c097f9e8fa3bf7d51f77daead82ff2a3ee6dd697bb1bf7f6feacefdfe9edafcecfe9fbdee7eebdef5d7bf937ddbdebfa786edbf6485ce8bf415142ba9ff3ff1803e6f979168b6dddcfffe12eb75dfc713636abb7ded8ec9f009df4d8575e7fa5c91abdbee7c7a9f72f50cb94bcfe755f19ca12a3d7cf4c41ad02f85830205dcc21942546e0cfec7f5d1a757afcc2d07bcf3dbf9e87c1ba3b5d77d01aef7bbff7f3ffb6cafdccfe557a2d0a2b1bdcb20605d5c6fe79cc4519c39b8fdf96b1ed5560100b402547ba1eba9c471658ee602969bd2ed211047dfb21e667d69d0f7fceeb2e0491793fb7bd3f2ee49bf7d4eb3acfebbcce9b92a86e32fc7333b1ef9f93b9f187d508feedc96b7f8939d7f7957c63efbbcf7fe622fe4b7b7ad37f8c01f1df4fd7a357de5e7e9288e32a955523db738fb47d0d47285fb5b908c65daef5b1add4529713baeb7363de4e5d36fca4cffc4ffa383ed38d9956b3d2799f60da9452f167df1e637b661b561ab0dca9d1f98db5c89da87242ca2e722149eba54377da5cebf4af19c9d29ebae62217fdc56c51316b36a55fca88d932375be9f41eae710321dd02cb2ac64a90f9b9e3ce29a55dd7751ded3a988b414f200a75dbcf5ad84be8c7c5faf25f624cccd39cbbfecc56ead405ba58ab0c226b566a86dca8fe111772d0b6b1c3ecf1ab5f3f4912dce5234abd7c4429ce479466bc6d5c7e24b97328733d931cc402902eed51696357e7d1a58d75936f7be11c832949fd0ffb7da2b6bdd6c07cb1a75fdac5bb74a1944efaa4c7eec0d2ddf32f165de817b098569a26e8f2055017d8bc617bfa056bd33bdee77ebc746f5eaf745456570da7d432f9db1f3901de97db6545c227a3127d3752e48677055fdadcc9c0f8e5e3a01ec0b1eeca84993d6bd8b2b685cdde9ed2bff47195d6c68fe3ea9edea7f46fa6d8d3f9257e9c70ecc01275590abed2ddafc79c4fc9ad808293d9667faf74f78dc7292022bd2ac80c084686f3f6f38391e184b58c04c80d7f0952011846963ff63a1f46e7eb62ffc2b139e76c6dce16678cb1cd365b6bede36cbd4c11e369cb9a99293355b6179a1a8b93858333b6cab8cbd4d660cb5a97a68d7f83dd54fb22b5ede32f4fdb7e96b2edbbd850d176065bd69ab0b263574e4ca8d9221a34b52f5b1bcb28282d5adbd2aaad9da9b2367efba5ca6ae3cf531bbfc501bb954f63fc1e95876cfb3106f595181157a28a30c28b741f477491e222290f16aa2c4d4817916042d21f534b24b145521e25b4685142bac8c316aa2a2e5c7838420a4b961f9000337dca9503ebd20587892e436cce63ea60e4a4d585f3765b2d613739385ebcb876c8593e243e15745e1a61397d4ae743269da598c69ec467b502965cef3e6424dff9259e5f7e25745c3ada6aba16595db0776b5d39195655758343e501972e60c48409e3250c145658803dac26d0e36f70aa5cd92a1f59d88d0d9580b09d93f3312ddd0358cc9f90d3ab0be775b434b25ac26e7270c488717db9e9dec5e423d71739d6d13257a8048412d32ac87eba4c014b46b247802c64922ded9856c092512cacee817d9a91dcf390b9f3c7ea7477e96c9996ee8195696984a54b31abac2ed74b23aced0e02421de18804172b4c1f49a295489ffa405bee85015d01ceb0deb6cc0f98dde0389820128459920990463a0a582241152e545c3eef522527611d7212b631adf3ee057bd5e75f72093dfeffc3303ab8870ee33ae4e0841039e0f0441038388d0142d21f3fb2d30d5040f90d4e258a0f7e4c8192fe90e2ff6325488944f645fe2309b0c7cf5c421835324f20043541628045b2843051be00a1b5d63d5ee6231d5991bf0e424a22f4837fa8306af43f54086a663eaa40987f0da5ff5f66134230a343203e94edd0e37b7c91b761a4a3230b7bfcebab305162efc29291ce13a11f40219d90244aec75429912ae8d91ec9ba064239d5f3292329d708afc61d404fe1e8e75bb7b38e7f436f0fc9f17631fbb41412e607777f79d9e0f8c92b57b827e071673ecee2478232c71f1e8494a915b6badb5d6a7136d322961c0c5265068d4cc336e45e4c80ee0085e38ceb6f759793e9a735a2f66f3519d765aaf42d1683423b46a5a66b4d00819414b8d04729565b1f5e1c393d9291380df0c7b5b5a4ea0d6534c8b494b4a9bfb094d2c52f4979edda6d068b422d068010d19d0a04234021a3b481fb94751ab055a6a481eb9399e3d33cff65c25a536d3b96d8865e7b6e196e88564382bcee30e05e55330169ee246bc9f4ebe23d2cf0a8fd70eb97ebc9e8fd9a69d52f9c80b4f00facc50f4846ba7f62b1fe3ad61e546bc87e2a27b3e6545a1fa6ccc7d77737ee5629a315b5e6d5933c3873464368f2d6b66d036fe3e97669a3fb5008d3389ed3fb148b712f233ac7462dc6fe68f227948e83fa19b89fd8c94df4ece1bbf90fb201d402617b0ff5bda198e998100fec044cff3685704841446d8534f2bd1ed791b80ed26b0ddbdd5f94bb3c6a6d9b26730d93362c860db4f73c6a6d1923cd2676357d46bcf252490d7e77aeb0a7d0ae509a758a1e16e755535c6cc1ebfed55533e45737733cdd2c52d33aa064a1771b76409a766842556b5ed242c51c3850e5506e8fdfc51a281ca5ce8563e46cb6ace3d4e2d2b9f34b5340a75e70f77958e4a3292b5f6b367ea0e2561560922c58726564f0f0dcdd0dc02bb7704c31915f533f18e985f31900235e5d12268115e28a5cfe7539268066d012671d15fa96a2ef4e69c33045d7a4a398ffb7bd46ef2cd4d697b3fe73767c6a15bb9e86fe4542e84b587dcc87dbb4f8d0ee5504d5c68eec7e1940b4df7749369bd30888b6eed2cd2b6ce992409c544927c01bd1fe5d591efb116c5fc9ee7fd8b5380dedf1dd145ff3078c10f9ccd84c6ebc16658a0f75d6ce66fa3820459017aef85452e42d9f6c799883dabe9ecf909fa71d1843ddf5a1be4a2f778fa0407aa021ce7cf2817921a251a6b59b027d6533799f9d4389c9eae7b84fdcf1e61890b49179241c41fe95947326c596accd4d04c810ad22148871a1a5a2d055653413904e11054058a4a5a535881f3524bc194329acaa8613f399dc97232d85032d46c4a51b0b5291952bbfed46345e228a594ba4615b6529d61a5563018e953ca29ba65ad0c2c9bb3e252ce329c8ef02d6b655839ad428e81e5639469e26063bad96f62ac2579e49a2bc616c814932279e4185434d8755a33341a2d8b917c9b8f26077bf470b4ef36dcdcbe2f06bccfc43ecd48740d9540a1fa371bf1df68341acde650060b4b8951b5b777a92d6b669a6c186cb4dca37fe6be0ea003c1796c102d37b2db7eec8d4017b228a8b2ed1ff1a16a44b7fd98b51f34b3f63d23b9e1f6b022efffb9906ff14f6efb757ff5eb827800ef57ed142b5502c980f49164fd5bad24b25512552a89a84b22aff5c8927c77a79bc317c6188763936f672028c0b933d52f7757f8737bf5c35f6c02f1ffbeef8b4d21b319def63b0912e19a91e8c63fbb8ee7f7481f7fa035c0ed69917b7abc3edb9fd317e62edfb66cdba6e461918f1ede6aa5a5096c4d1318f6a7be54270a58eecc2fe809b41873e198c2fe0b8e31eb2485cd8d2bece984dbdcb67163fd5a819e00e757f965297db52bce34f92e8dd66ddbb6edb73265f6b66dffdb6f1fb4d5f6c664fc1932b15f5fd8c9acf4058fbbde538ee3386e72f3bfc97d94523ddf6afad16f7ebb8eb0c96d8ee3b86ddb40342ca5da7e2b18d097f6f69b06b29a77537d7bc0f3fd3fd8fc7009969503e36ad39f4d341a7403385429f79de6ae7451d226b00f89d79cbeb052466b8b6d6cbfea4274e24e02d938fab8bae4b63d92dc8ad89f219322f3392ebc2bec51896e2e8d335bd6d638eded83b6aca531b5a50bc9dfe8f66c48916c3849369e646cab4d60347db1820d5650c8c64e2551ec2deea4101d1248fd106c01942e521ffa55fa50243982520a906e7a933e4b9b7e5b248fac926324962423cbc82fce482934c217670c7153341acd8b9114b265b6954a81c1a80206141851604c491ec964fecc74d2bf014ba01580b2e6c5d31ec52dfa9549840f41ad54216c101b101cd4fda1f3c1eb013f7d3ce41d5c2478550175b891c30d0e384eb01b7050c919418e29311b74d4a043834cca6c861d32f088a147d3c3a05f085d0000d34e940c5ad060b2b0c1a4896d78daf0c1c68fad9e357cd4e0200640d8fcc0a0833402f002a035412ef0a005422c18521364051fa880080d215a209c21803403302304344529d865189141803322a0e0688c2162209921124611300af085913247bc40d285014e90544b6282037081802d124046490914a0c502b26040d6085834e00a0758f1002c12aa80001511984202574ba49840142540418131263c5101272c802f6085811032308051004c4068224403441bf88003414e1872228482071d085202f240009e74f0819f14808080835d1f87c067d7c722e881f243051fbbfe0f5e816749dcb40d360b1ab49041941d2600b810bea061f8a61e31f09061c70c3329321a746ad061436c4a8e11e450c17103cc0907879b1c6ee800567991c06577701ebeb99f640fd9872f88cab77fc0501e107606918fb60f62012cb28209f105d1bedeb007a80d38deda15185bd6b8300387a53976fd118888ef471275df105d6c15c5ba58b3ebf704a92f42ad9dc069d75aaf50fbf381da502fa4587ae5036aa3678b3d3f364a04da026908c406387f02bd001cc51e203640a02d10280d50ea88202a178b67a9486c53d7fb6c46a2405be07c117ce886d579b65742895a6dcb176c59db62cdc69e91eaa661934fa422901ae0267d828c00fdcca7e59b5abebb059979b5658d8c947de9508fbbf291e8a2ddf26d81f948144ba02575d8b2a605995d14debac45767be5214a108680d90fb1da02cc051dc3bd37ead61b5e18e0b855a8cd9b2a6c5963db5d8b2966566772085dc90407a7e2491c51bef0f943e1f13f9888614480d900958133954312e3a5d66db66a9171e55559f8f6c28f6c400b4f38bf82504b353c36860258af1e144cf131c8cf9812200510449217415640a222a40a86200584556185d21021643b2886451002d8e94c00064926c8180cb8512132ca036c2091cd00509d38b08dc324bbe28010c13c2b080190c88318ed104051b387302192894a1948227685230230469a09cb182160d8d1654c0b48217d434b14086164871410d6ba6bc804a1a4e30c8814d9518eca0c6d31a3e6c41b111441b56661b2268512c18d18254942c4c532e28f1c216189868a28aa18b0c5533809162458313358cb1218a295723a0820ad60d573865e1a0450e6474e0a24a8d045dec508607309eccf430860f677e28030a0d106982d012420556d40cd10222d65c49238a4d116a18b175c46c438a86a5852c4c48bc30d594840c4a48d152c396294b5061c2a9891ca8aa70d9a1cb93171faaa0be0401c64a1822aca2c418e184d41359c64c41a144145ba460e28a6a8a2e5454550106cbca0a27ae1883451459575950a1055609ae2093b585165c90e9e1221fd1508c02e93bad76e36ee7e12fbb5ee08d1b1c188e9cd90e1e3d5e8700d8c940830d441e1f3f7a7c3800f2d3410080823c101a0af201911010043080108ab6110144381a8244a448018c1c416280a42407404002942860010c18a1010e78000910888004964ca0040a9850010b5c000319189934d1c00638708213143aa0e481271f480104211001141556589ab4c9c26c6146994cd385f9c2846136cd18a60c73862965d2306b9836cc29730493cabc613a4d1c660e538759659260ee3079984fb387e9c3fc61424d206610538869650e3189985766d42c621a21e71153cae5c40719fb0b03f2024a3046a9ad3e04969f9535b140b3e79c73ca39017caf5b05a4eca854ecd8e992562a9a110000001a5315000020140c088542a1509806622ee61e14800d86963e6644950844511aa3389261209a310600838c013023403052c200e2bc81b72899f9e7cd6fd94238a6202ef7316b79e56720c2df59f15d4193a3422d7f5c7fd6e72626066d5eae68c65d70846f165ad570db2644f984d2952ba1f4e0e586ca8c371cdb51c4f6f77d77b6616085a60f624cdc9e0dc6c06f929dc35e5b3213203a3748268a061ebb5924a00487d941f763060fc7d3ba613e0a555fbdfda1f2bd8633d15304cf0398122568d56bd3afce8293915f1dd891b9ec8eb639b13be4a9e945db66fa17a9b3bf4a9e6e04f2513a4d8b368716b6dc3fe600652f29387dbfab43bdd8c698d5a0cb29b303139af69d500d30ed69d5a0f3cc21a78306b43c8ee9eb42301d35d3f111b422b84340c03e52ce0800c03c5d1aadd1103ca840326ad89d14edae928aeddf06655fd8054580bf7fab038a354b85f296a9918481b5f28945d9dffa1c53f85bee953d5863a4601803ee49643661d45e041ff98531af7f5613b878f8d5d52e46a3e2865da20efa1102ca37fa4a4e02cec7d743f9475a8dcaf0e14e6fc3f4db09727d561b4b742c5a77bbacda1dc07866b5a3a32988de12b71c0b9b48dea7830b802e65f00dfc029ad1f82f5f7feda24371e01287d1db568c0255e39d00983baff1e7269ddd2618c5bb79c63a748679a82debd2c32c79b9ac3f2f755277b8fc2ef4a11311a5c8c0e2a0560a138217524d607c503ee1a4d9efd70ebc87c96655eb7040837e8ab04919e28a6c623b96b0b54313a53227d26357a8ceeaf5450a9699dc13a7d5bc691205c0716e5b6d42ba580d86ab6232670c5c8d1a06b48a0d346af5be24a4a5440b3e93278e1f1e152bdd4b198efd6f8cf45f53ad1aa69852b31c8d4881c38146c0b028b21603bf50a8f0cab564026c09f369ab3b91f7c962e517675f7c23f9f3c44b7c1574b2e6799a58d462330eab8c25dc34d6a9b2698575f9c379eccea95d9b3ee5c14cc0d3cdc078604a30c0aa075d0437c5c5d3c50504ef991ea190c5ee833435e538c176c606662cd193aacf527ee6cf4fe6a2852ff3d025d218a75801f149a5484cc8d703f25ccad9a19947fc4b56dc33cc3a60a2d88f42a0375cb49e7f4a18c5f6ddcde3c3b479fb9832bbde149554f6f0d7f1ebe1f3a32f3d722c90bfbfc9f25d95ee9fae61af2f68cf847731a078558e5f9858d84fc4628356dab389a8d38cb6d26c8fcf6311a43a8de227c46dba0d34b1daec67cb564618ecf124c93eff025b4955a2d3f738915c805796a65e3a6e0a7674ea6a89bcadd5a89b3be58fcd3d69de8f59370814fb7ea02cf7f1b00694e9b31fd00fa807b07d10fa4e9f0447df7e93033f2e0c3c36365993e1da49fba9173ab4eec947c54e6f0f2c184d855e9725ebf48be60afa19053011a43a0353fabd99c4b43676c5610a55ea1bfa35ba5325a750f315f2f13d06b113cc67a18a0d547a5e85b02a76b01b1da7c35eb0871af840d7b91f2c60b1ad80e5351a6a526f49115c3726f0ede861559fc900d65b5c675bd0e548220760d68d41e127c26a11e1aebe2c9628fb2735676dcd6e423d1303d46a2bcee761964ca712c3ef1b58f8b12b74fe0bbec74da5bfeef9416f90c34d028ddbef4c31a6a5a39e36fc311c9eebc68dc756398c1eac625070c1acfa8dfbd737ca4d600064b03ade029a51040f6d7efb1ad94241d662dca5776f80f9518c19b154c8b064b1b87fba8981f0bb3ba40fae8dd4c0c74c2c4c2baccd0d9c97446dc773b4d53cc9a60d72383a78acc78d4e598702bccc80dbe41e740e60ade3c209b57cfcee2a097d661a57f9788353118e2e6944f81a68a750c34635025b81047c3433d011b8ff9a7c262bc1f383761486ba3ad7cee4ffbac6ce04e405e454e9695045dcf28706c5fbfca4e6948cf41cb353b9d15b983130a1099f708e693f8e1add347df153023559984cee54ec537866262c8088731f39283370ef6c9cc245d2e4962e3f09646518c53bc3b61188f5c044e45e91260fcf9b7bcf6a06df0c35902601bbbcba0a0da24986afbd612de7f7720a8f1cd5145cc91358ddb0bef95df19f6dbeb02135836a1f405dcf40b85aa04e6ed39e907429dec5e1cdea3472e0b7ce4938b47012a8d0755857b8e80ad7632944e3f322ab2a7fb2d56160a9f3e1358f8584c399bdd8b103afc04ef958704f4eb73bc1ff53b89a2782dcf13efebe0ca17bf3957df2466148761880605472c82f24f3dc662575c9cd8dca3e65f68a713321d67177de77e55a965644712ee600d17a760e724c5da0da5d41a5a799449b9370c1281ff496e14dde1f5069be1799405be2554b72d4bbb836a9e5b06d31288b464ebc5a6c76569269ff06e52a409b6dca59a37fc7a102e8d9c359d447614a880409e8c5fbc5bc7c3c46536103e650ea0e0856a5aac4a5e1147c4fa46e9d7eec862e76ba00664cd79aa1944130162196065f914d019bcd1b55a00d5cc12efc0b9f1fbcbf48790ecd4c5ac4ebe89ad469c4bfa4479794b8114f1cd04db45ac61aece26bd43c51e1156b4c3c499faecec5349a97c9304edb9dfb44140dce5b07cbdfa8abe5fa7869ff93e38e09b24467a9970d43c77e62aa7d2020c6e613183d3ef7a630ef56446851267735e272af9fee95ec17c39b3e589b41ae20461847f342c8d22c4b3c28d6d1d723fc7d3c8d9ea04365266ca2f6dfaeeba9662e91c82d820bc157e222f70abe265dd3ffbb236990c8fe485e66860d81286a402ab310950e700f60b1f4ac262a068b292b3e3cd558bdf128a0643590b7aee983c538408edc7dccb1a8ca5791f9ba5212e63b6a3bf20e51151184497ada94a07f3c1c2b4d0aaa2422b4217cc9e1cf4eaa66a8bce14cd267bd6e60d13fc343f221852206855b9f71d7428936b37c0411d29eb12fe61da96cc93b5c4bfee701c875e6e79f4629f42ed817c38abfdeb87d6be6d82af3a342e3ed8b8b341776b23c5edc42fc1e9db4de12ce3d93c9159b9f6b6465e2de74a3d496662d0290d8d11efbc0a94a7da4b84d63838671389ae4aee356740782152d9565383ea3a22288649ef2b7045c9c5db760e1b05e9e112b6e4b50e0e9fdfa2cb9e79d7204a42778af7b0fbc061e16aa4ff9ec28dd39a248feb2d4dea6e84cb2b5c6d4ce19a453c1dc51d0f40c3065f7913f7323b0e79122243e8f6e481cc5058fbcaad7960870327cf722ff0947a260c8e5f71c7f72670f7883d64ec1a2fc45c88a2199f84e7c5f49be80d1c1392259b7580268f38fd5c41b06d0202454ba5e79d5f6a98bb412b6639ff57020da4b30d7a13a7b6d0d86685a55a629e10c940a8d2f58ba06403abafdb4e916c697dec40ad9b6c2c336a1676e88c0f00c65e445ba53614c3064658fe9c261781e36afccd7884808c97604bf4d485be8198d19e4ba3134092864bcaeb80f29cea2973c17e3d7873cdbfe54dd48ad7d311002e1c9365e0cd7bf4ed9d94620f6528c4c2cf3ffdc6dc82efc1a9a1cedcdfc230ca473f5fd7e83ff62834d36791115cba1e96a503af9d223eeca1c8ecc9f830348963098ab221fadf84c87c2a765a45570d4eb50d7f830a65ba0157e842a23a8f9abd0c9ff73348735d3ec253cac949a5eb40bb5ff23568191d0b6c02e2c8925eb976758de3e6fa4d73c2b409207bdcd096c1f76a6e06b30217eb22772b8ad39bcc819f97f91124240384ed84733141a4b54d5b96759bc4e90b3312c9b7771e8f535c8986d931a0a9b365b101920956af64c19f449ebcd678bcc7efc5c73a92197f5fa5629227d883c4dced4b2fbeb1ae49de71f6d6ff052c815d537f8b087b7c6b0cdd914b88cc104a10355ac69f383d3e3d0456c1cb22d3772a750b3c1626011eb3e36191baf8de2c459599cefecf5b8602917f15c8eb3596847b2f1f21b58b882995023a5e7cac2767dce1a8f9f16a5e8d95b8445b4e949ba84932f0b90cd15320fe3d237dfde415e6ab17d9f3a3afce9cca17b5ae3a2e706c0faecee3750f125cc104d5e95a16e6e481da1c7991cb9127801e43c3e0ee0280ed0e1f276d93da76783df2d360f54962d0ca421812e4269b2fe3b43f86debc6bbda8179326201011e62e6fc5fcf48ff268e83ec4cb3b1f44a6e0e4080bb7c3f1bea8720e7620f45f87cf35dd3e05e80f357f87f70db8b095b917b38df685a4bcf59a4686a3847828a571d019550116edcb2812f7e9a04f0d6267380542503804048a6ffd2b3b8f38c05db4ae9f462cc0da1a963ba847b0df8a0ec775f7817b3a7a24b86c7e57a0a4a10f19d9509415089557846623d1ddf938e1d72242743114aeb0e4c23afe0d7e56638747dea688a4431ae834284bda82f6cd161c620f6601ddff296d6c65c4a754e09f5ca02692d57705c944924b46aef351ee4bc2ca11bfae85e06c1dc4c59de534875e42a14c499a5a0a55f213adf2d4da62c1ecd55e0dafe9756133e86b3a038b7ecd0db0f32de7e3af94eeaa0d57653adf62e131b085c757585a7e0ba0be4a25a8a23df3de50d8dad786cef7142b2bdfb24d4b1fc205f8a450ed9e858d3f8240ae1972f3e906080f852a926bf25315031950d0f1f66720499f819ff31da02143f676a5318a04470038a9f3288bbadff3e00e028cbc9d1077b201bbe547be96ff810736205ce889171f2749ad182003d0ec8c8ee2a82b395a41b3e8c90b48a937605a0d90a3b8da2b575fc5496e2a24e04a4c2c8465d34c99ee11cd1c7d09b3b97dc65837547222c25eb5f8a9b87095da22870a2b1475c9306f7134a6a23e3893a42f69249cbdd3bbf97a0cd4bda7b64a8366971b6c215494d6fb841a4116a5b0f9c7c68cea28f1c973ff276566544fef557c389b13846d89d572094f8786e6d19858c4538697eed2dd0be18d2a14d581137ac04a21fef59a7697c6b37abdfd733a1c7f5c9aaa69d9e1e69b6b494ed95eb4f1a577683e94b9bb1631cb101284c2c4c9bc394824e1c3354a8215b9f512147e5bfdb71c723a7bdc60361c0aa41c676d00a2b7db66e93eaedc344839167dcbae76bb076d3d1beb383d8b5406233dcf0439af87f7e86bd73d42bd63bd86d47c2c4d8c7eb223f86c400b902ec0d55e3bb744eb2fbf8da782a49dced8137292f34623b034ed6c9da3588b1ec938cdd0b894407e1f811d5ad5d61b84ce5f9bdb8007cfb3520d857f9765f62d8ddda5f0973a9ac2cd0839190a434e5a62c7f67ac52560c47e2a2edbe56f6fa0660d8652691841966f69d88856ac048b93d1538e7ec7012eaf9d3af9cb716a1c13c9e20caf1c152ca5465a1be6df36b7b05d738c009f4dd60d720526d772375b058457cee3825413b021663aeb17fcc26b7759bd0f5e1f1022d7623bc47ef50c86ea07c5453cc44fb9452deb8c11ee8c535b52901513b031101c28efa7dd0fe62b3d53bb53f5a6a8a5ed680413c2e722bea9e935c6919fdbda6d5ed4bb8f9b891f8f045b60e77ad31dce4fd096011ec46a95f1ac1b7ffcf39184ddd4eb7bd82e49af45c054f568bc5f22626c512e397ddc93e023e7379d357ceb73a6447e5bea952f206553409643bc7bf357ff60860de76e6716306127e580df9e25ce2524115b0681bb4344bbeb76f49f7591f842b1ed698e26b480a78f6f0c5eee593ff2c5a8114018755abcfc5bbd4f11b3bbc5590882f8cb82c1e00f614db9e6b7773ffe1cb84d0141a6fcb85cd7101dddf7c211de38c05756ebd0b378884e28de1ee3101cf398010e5242a1f2d58fc81bdb937e76c28689e0c743ed976bf23de71ecdd6f501adf74ba9f0e4f00849b98371b3e330e49506bc13a37c5520a5bd2c3b78c3c9ff1ece4dbb7c87c99747627de3941dd0703a1c4c19c42503ecf6edabe189d8f2ba864fa9f052585fbd82fb9d863217421de006d2200b4377880232a199ba26e7c39627cb2fd2d1e16c81f96a5b044878a8319ec215b2182df011612e3bd1e3283997fd82725181bad0e48d7867d3ebf3312aaffc0fc9b8d48f61afbb590b197aec69df6c0968b90ccd11e45a560ec4aec522bd5440cd43d3542b37aac71db94355e8cea6583edeb465684b99178d30e2de6de19a45224584c49cd531e2d81d3bb95fa97569d2a56c39e38c9e89e46ce130e6de1867ffb2e5803f9e8805734a705a699666bcc0ade326b6236cbbb056289950494bdd34f0d2f6ec26f88ad67fcfe028954557a8a939c42484bfde452b644e63fd2dd404e6e172088810431525f89f7026e8f6bea92a27af34032955d78060083fd40e44bdd507c011c4e68eecf9a13ff40031b102d60a7abee8bba18a57076e3a3c9b070b03a6ca59684ef810ade6638bde1bb863bedc0a1da6a8278429f41e138a6766ae122f2ff014864d3d6ca0e17293d5baf400209a633227e9e824737576cace05089c6daba68a0600d23d4d72150bcedd66a158e2265a85445830b5532a67e9f000436edf6ec90a8d2a3554a1426c38ffc750418dcdcb5db40c1241bab2a1181c2b5cc243f4740e146aba55d3856f2a44a050928486596fa3f0a0ed9b058b242e1a54eab6b910102148cc87f67d0d0ed55ab050444d2bcae8e142a58c948f07100176f5bdb5a8522250e2aead060c1744689df83c0c0369b9d351c5ae2b0b212092344638cbedfe67840e0551151c5ee111b76faca9262327e697e398f59fe54fe1c3e196f39bf24df2cef2cff0c9f14bf9ca7bcf0c709e9d4a03d30f960487ac69389d2e20bb9cb21c9f288f2346fc273096c34f946438d861c0d3f183e26cc20b47168e390034347c38f84180a371c6e18e260f8d8f0815046a18d430d861c0d7f53031fbb670c01afa0760822d2aae28824b125904b23b04874faa18979ddf2aa5a31b7b392c7c9f1d406517e9ed0ca538ed43bd82b53a4e23010c6a8ed15ac7b5abdd874b0f7fa61cf9a1d267dc9025c633c5bc5855a93cb13c5bfbed84e9eb51c0ebb85fcb41ba980c40457629d764d09904b9800ddd7060ec6456c11384b3c06f4d4da0a22b942d551fabc8ebb6e6d0e7accd4168b6449114bfcab358eecdb0c0ab0a07af0e4c840a755152d8af1cc9fa9fafbe5040d191a1d04ee13664c132867aa8f079898dcfdc1db1e0f60d73aa542b75e860d72dc2df1020cd8652a6ec310cb6f143ee63b848df5ab40b254ffad4f3f2a33bfe7d88a3251630d93be51cb333c6ddf6edcc6a862c3e450da8ac972a306e23b74e8275117fad9d89b00420337c66ad01104f15bbb5824a4c4c608089730b4b0c9228075365139fcd0b9bedb38704fe1c7c28c4e80c7965d3751e6746038fc9409cbf32ee2f0d3fc911bc6da33ed04c7155800a800929c3763ea3f2deed7fc97fdd3f61686b14126a995f074949e622156fca4c88333ae414d1fc8e6b0ef9b1cafa978458d0174dadb79805743ad61ae0c068c5d1e7ed40f1767232ed7067f004ea14575b20ca0f04898a73b789e1301394b4b8b91989f38d36f6bf33725890bae0ee3994de5f87c60b6b68fc5df2999055468af7e00003c1a99682e2bf05b6ebb6815f67f27ad51976159dadeb8de690cf2635a9f8ea67d5ce848369a1941e00e2f815c8bc6199effc3c70b000b79917fb1a6107ee7e2489cf11d8446fa1ce223eb29698b484d47468e3f4a828ef49aa9277dbde84b6f0fe436f6d95bffaf40d592a58887b1c746a660df8a694d0ac050a9d01e1b38cc73e80b7ddf7aceac7c0139de9883ffbd9ed2ed57bcd4b91e6f24b0aaf15a6dc124b271a91371c862575ab3fe10f4b963211fbe877e7f6f09ee3d72fc000ee43370d138c5291ed3cbe4c73a4c3acb9c75145916cc3fa9ae775443c177584949c0c7940090525dda2343e937ddda34467563d703d0e30d8ee3a0b80e8af320380c80d360dc0dc671a0b8078a7b001c0cc06d70dc06e274509c07c539001c06e16e304e03e33a50dc03e2a807556c9ee940dead9fbb2b051206fc950220a85b2067c91b5b9d3e5fd100384de83a9aab7509608f2a5b54479e5d0aa28d47495720adc03482d00844151c5da0b402290aa6100c45306ac1a805a4149032055cf4c2921dab2f2af9fb202f833649ceaa9749ff7cc89351331927b5c5e4bf3df264a899d079cd12a97f8fb655fd42c9ff4ff9996849e4a8ba90f4e7b3fcac9a9338525924f9eb915f56ed449dab2c90fcf4c88b5d6b52c7b58b257e3ce0c5d42ed969d565a9bf0f7860684aeeacbea8ecef87bc0c342438575f26fdf7515e468d091cd42d93fff6cc2ba306d20a26e0a4b298fcb7679e0c35933aaf5920f5ef313fa686099deb2e4bfcf2c41b5b534287b5cb657f1fe1c3a42dd1a1ea52b9ff0f79b36892e4a87291fcdfa7bc4cb51371525948faef395f46cd491dd72c90f8f5cc1f5b63a2ce5597b5b487f05f3957a2e2bc3a19115fb4094434904e5513d1fcc07e9720f58bce8c56f56f9a127a3291a103a03fa19da6a481d1b667639227cb94274dcc3f9200ff85a5f316e5e2547fc8d7a281cadb2300401732b8b42a4f28d77d30731258b5b647e1639700835fd4683b59d99a50a28e5a8506e2133753073b8654689ed0dddd208f95f159f51caf8abda5cbad49180528bb7ff87bbe4df882a563ce084310b3b3e8b85d559ae817785064dfb9bee6ccc6f8b3965aac4f4fc5ffacc6b04bf82d5949d24ddc836a211d4a8bc5d6aefb50f9e3c058a910a429a5a5ebee014e60014fd62ca0e52b2657c051464d83270715eff06f62ed35be36f0d5b534eea3217368f4729b88ab505f70d821e26754b37f5e46241b30bceed67a401bacd48bbb2eab814d5601040e0123b3b23009e84f17a6931a59688cc6b20992d08210e88561646c34968f540c471894321444c60e53ff66f4caee184ed262684ae6ecb0bb45065b056c77c16eba925a13b11b582562521fbf94873d619eeab70531e24714acbe94356bb91915c0fac77c542a93b488724726e8d6fd9e1a49216a7631e54a89d4da83b200cc283bd4d5731180441606e3d7cc53ed285a6580eb22dc7c814bb801b0fd45c3a95f1d881aeb23c85cbb818bdc1267304b300fa1931a04c97265ced83100e11f14e58db4695f7c1c8f9154906181106d9835d501370c59e9948660ad847152050f176cf790761b770943a707586b658461134187b090bc5d141d0b490e01861f715c3c5723190abfe31685d8a2f60e098b82359419927ef08cfa9f1257c6a0c43e8a1e375b7a460c2084c5c8c69dc9315dc12a80a46e5eafe083b67a826015c0ad9d26a66fbdbc2035ae9cfb0c37387c1bf329c9827c7fe557029b6add91d76d70298e123ac84fcb22ea6ba6504c237bb872d875024238bcaffdc7da628e79d15d5b93620315093de0b9da45ab349c77125e0025d3e14192ffdddbd78c992ea16c449f177c70db36dc6ba90540e44ad7eaec08310b4eed30a3df91ac1d72625c5f80f1e1c68b700c63bc1472d7fac01e7b1e1e1d5cab15ea14c89bb6cd3f14a7e2074df41270dad480aecb3004e0041681fd598297d441085ee3104b634c22c2b123744afdcc0a9ad4e782f5e7edf042f138c6300dbcac674bcb1c1aea0445cdeaf7af129f5d9a11807c3999068be878336933957d889cd239c8a5d84869ac317676cb639f552d1ce6872a78a7c307e1282e4992e07d906961041e389fb11d767dc59235451f269a33781a175ca40d697112c4019f772636dbc157e396be82e5d36fd8ce34036fc3d0e34f1824c5206f6c0f7ad4623cff513d1ae8b997598678ee300ce48f30125de34e5ec7ffe71ad0a71b18c0b9a297fe0db5c3cd66c66b940823ca88e66194138a1c93d979f5c5497187c71a826d3789886a1e6723ba6f82a1c11cef5893ca3373868fe4625ca454c482d179f2d961b4724a0d372e84e8e47f24c2c08c32569dc1d69dc6e9f000d4939d93d25b814ed3b709af4f6e2132bbf7ee55157c27c9fe51f9bc8efea51a8bb93aec27ab903a9c277db20b8dde60a96d149e539fade01961f450c9521889251468649401d99e3538308dcd721a4092ff426d1dc4e52de7a05a902bb29c8e6cb4c6b400021a4be749c5117954894d4bc38d041c2e025eb89df769703c125d2fb449d3b9f825e20e0aa4cf309d77cbdef8d99d7d19fc8be3c44b942beab9e2dacc55fe5dcaa3cbe4402a6a29edeb54433a59c542172be559018c2b2cb972441f3078cf0f478c4b3ea98573cc54b9d39c7a69c7eb702ecd5ba52deaa59da39c4e6db914b92693c743facf9cab8481815aac13f7d9bd8cd655aaccf55654a1fa188a5167a1dd5c7da4214970dd09aeb67dbd7e6de7b9cc72a491c6d0e443f655c03fb3c9d27585162f326ca2bea75cba0676aaa1f7ec5661c3f898862cba4d0d6390992b98d475930ad4219128f516753fdec5e9f9a3261f88c3d61bf3ad11795fa5fd8d13bbed798f3ae5c2ab572aade07c861c7199fe5de3e246d6bcd7685c0c16cbee624bf8358efe934a0443d68be4c9be174e730b76c0261e92439a23dd8562f1e627c3a72067ace8fcc744fa54ffcf29a98ac765225a52e5c64f165bd3171e2256103ea07815e661cafc66621aafb037eb88be171d14db7b3fbf322f2ee8ccfc69e40cbb637fa6716fa5601922da82231017411fd955f291ff5b60f9e6aca056464fbc8ec546f582eca333af1de4f8be44004f5f49e37d8629824a304d5736822ee25d045c4a955c42cc154e267ae73830f73fb4400ca8662a96ccac90561a3651a6c19723c0b279ec9a6b10c600ffcf6f08802846d2358ec19624f369fe6c05a4f5c5fc70f1737911e444edfa7d1b5c79630f852ee8593381c1572ce2a01bfcca1b7d0d2760d39e25463f917a216217f95b7480f8c35d1ea78fcf2399c6e8cc74486bd29a4ec7aab838a5ddd2da8336f85dcdca54ef3e71ad737f8dfb02eb7cd92a0bd07e861bf766d8a1f898cfba50b5f9da3215224b78b2073b94e35e81557b6a420bec86ac754f18d25a279c6753a20e9cd8619cec2ed7c5e40f3fd0d91deb6d5b695c30839cef5afe5694ee893bd8c98ee16837e97ff8619d76678fae59038a343171f6e48881a14ded0777b8f31d467ddf88c7396e3c28b5a0c0b1130bdd357d4f57543cd76bce087367ddb90aac059bb9f7ad5b7b7864e05dcc0912e5e001fbb32cdae097e6f7dcb8f8ee8abc40d111d336e43d78600ceb1654c6ee7a2cf58a117111ee599ca301f8e51d390694c6852b1258436e3b04ae4dc61b19948414e7769919d74d76466c0c5f085272b4aa891b5615a2158fe04e2c0bcf9947c9d22d1e7c08a194ed6516285f5b22743f1b3219755b0ef53d2de56c62207b9865319c97aa71205eb1a538f1dcc31bf7d1acd549d4316199187d44f553d8f4ca4b7b37148ab57383e182e2fb1df4660fc5acf0218b81df436baee404be7a864e0456bec5e71e16de4a6da1e46a3db9692ae2cf9b3eef3be15c99c5d270273c2822b3fa32a769a55b1bcfe708df6e2bbf6b0da0711953c2b8f0c994d21a2b6a0141ecbdb3461eed3f8ec0d40fc4cd5f41728ed510676822062f80bd7b6b3303fc0b6abd4c540ebe99cbf3cae1c2406285d4d2d8e196fe5e32471e96ad92874b4617179ffb70175fc3faab89ba677b890e7b54eecd7b940de69829815257d0d18828705ecee8d1e1ada10e3c4ca96662d1987e879c69c5fa8ea3006da4a3acc9ad13b02cf6c9d79cb094ebcfd47826f4afcdbc443e6cba6e952acd52dcb85b5600fed6f06139ad32680b4552d272c4125d6f87e8d6a10aa2aeaaf64b83f21fbd4bf11b7135ae9e7160db71e7c092d171641ddd2210aeb44428167e1b1f474942481d646991391424788d606f8a12e0544bb11edf5e53413b556bda8acf173b43bf0a80d59a65678c5435a356746fe56990bdab94a57142e3d472623cfc1d71cbf21da931ac49dc89c53c667928155a945770d529bf1335a7869bc80588461ff00e7a4b7be008851b841f29c2050a0aed7bf5d9c8fafcc42baa72df290ad1460150a57c55699ea612977c7200c375657df1acdef3a79437858f541ac3d2dc8702ede5f19fab9913ab0983f77e0f4c5c0a7842fe316c6094f303cc84707f018ddb5fab080a201762fe80d824b7be5e314a8c0d071e20ea23f470162765fb29875637c24725d919eb3c9748025432e9d100f2ff89c44757c2511ec3fa40c4f2fd3f78bb6640696eddff515e7e79e9d2d2877505dc676e6d8f20375f7c126739b5d634082f53d68a29b1929f526bf701604dca66981f86a23af3e80e264f2750cb38731807453791178c54456fca431418662feddc54784cc29a18e5942485f609b4250c7a439553b91b4ac79397712b8c711e8dce38a6243495c741de7f4ee93b3022dd89e03c0ea25463854c1c6c11c6be59a07833e5b21d671838420c4a23d66dec9149024d0425e86718e431fa799261669ae56685a03c2b8c21199162637f1effbd81bc538df7cb13e204bd2470b042f2371b542231ff1db1437efbb1a7fa53dcb25a1213c96ce28db42568cca10984c75a1a8a2c27176572da05cf340fff011c729c307ce33bfdbde6d7b315393024c2282bc5ddfc46814a12d41760ec5f96df39c397d54adac182132eb666aa8766ae9f5f680128105f99410ec7f50859c95f61c5269a63cde2bdd02361958a9f1ba3bbdbe5197113579560252aff0a57119a638af448cdc2ea2fb021e9dd586c6b519b73d974044fc3d1619f30f3e28219e3efa78f54990ab470b95bb035c8e01a31421766157e5544f5c5d615890fa801adda41379d19b1c5a3cfcbe92128644abd19ba41779d93590e6492c8e906e7454805da0cd2679ebeaff1f941a278e3e34cd2cb76918dd238faf48b943d4eec898381394a41bc3328518124d8b3a954089d52c9088ae045065fd54058d9bb60516b11a76bc3c24389a0901f80747210278c631e381384edd8308b1c7f866b30852a49bcb74411cf8fb2c1901729206b55b077c3ea573a6ff8d26e6c808942ccb88c0222670bf09b3df601cd76e344a20d53feb9f016cd34d9394412dabbd1bd7fecc750dc6aef2a40230633318f76019b0e4c89b19a17d3c63b6c73b3ef5532f67942bb4a7f4a16c16a0d60c412b311501d0d51f3a5a0aa8d692539b87eceaded56ac132e2acf2d9738ec4944a45a44c40a1eabf38f1149be81277190664186be65eb12f61b027c3d3a0c842819830d212ab7635d58c976c14784e414aae792c9d283302a792809b2c02e5db13afd385c2e6625d9f79c07d58f6093bb4653d3d0c172a51c94a49c0756a9b7f8533499bbf3384a925b153d06169c6e02367f8d4ae0facbc659ffd89c3121efbee219445f61dd6eb9a057e199a973627288034013206dafa58b194eaf76090d801219e77cd01df6a1504d5f57ea58d351fdc20be8a9ad5ed4f2ec78320c47a754ee8b0ec4617a3935ac5139d188a575c3fc01f52334350e14d65891dfdd2615658da107bb3b5ef1bd177828c96c3d9df2cafd10487eca304507ef4ef022b157d4e2830eaab088f6e5151082f7f43b0dd0a983acd8d50862058db0c3fcc3fd5863bd0c7578144eb4e42431c2c4d6f435ce6f795adf34e919c367bae02b5241a32e451c8db62e7a1bf275780b85e7e0b8996a0127d920398a6ba60531d7ce9cab62e3d12c634f9cfb015cf027364827718d40891abec56e83e4ab53bcdd1da577583d8b2ead4380bba0ac41e8b817b310254a56957e14255320257693c97fa87266b1aaca70d561cb397bfda00dee61f0488c7e01295375aec4fa7483532aef4c6d1750f8b9e2f56d1816fb3aa83ec428485c02f2170249b52d0c24bd5854c8e3a46a92ba5410b709952e55c3673f58c7d166d5bc0bd547b7a17347ae9cae38e121b5c4f182a955e286be5ffec09f1032a063c7d48784518df844fbf46cda52aa51b1591514f4ebc0e1260219c372d5cde8c922ef99c5e5f5517c62d73d0591626287b34cd1ccaa6d35159c0ffa71b16e8eb13bc702168e33ba90185c946dde7a7a08c46f79d731d7a6a0ed0c1201094fba0f53faa6155be8053aa1b1a7dd85cf350332a20084b86c4482af597e17e3b3920fa2cce942185c9721636dec466f6f93660b7464c04f861d9aeea848617792ccaa7c5d520381bb1d360d38b2794b1ec9d9aaa44094ca90593e9ef3d7f15a0601477cb852a8294bcd4545727e98fa5d138ecf05f86c6f8723e886985c09fa9d6491975fa00577529f7b638f6d086ad051e3d952f215771cb4abab01758fa1711ee5313270165c8bcfdeb63c8317068d9268b0f7f6f22108a16bf38f02697b873309489b038c6c40280bd28bbaca0486a5adfc90dd0017ae736ab3bb0bdd306b8003c5d413fa2809168bc451b6b61c310af53f64b4d784bb43c532ee440d5409dd25c0303b4402ed7b67b94231a0a1d86afbf5398a48a2c024ce33238e93e27673f3526e87da6bcf9a16e991ad0d13c81611f4d5650d77366a17de0462de76d02b82db9357e23171c269c65dc92b215864b5b4e91ae6dc23e0bc3643a90103b06dc0c450083bf1767b2875fa0c7c3e264b91e3a5c0bd58727282493c2f87f4af126172e39992b8c331ed13e5048e8fb5eaa3efb74032fdd44e007273274d3662ab306bf8bebdff987815ab0156a6b8ffa0da1c7b79b86ab5192fd30972b1c2032eb2db38e0809c44c76538fe910e1cd1a4e785ac2f5150a0752d584b2bc658c8a01b524d339a4bb970bb5b6ed43e82e986a1fc048f9e2a491cd9bf2c78b08ef486aa02e3917217c8b671c7b45f8c8ba700299ed127c3d0fd3f12e8bffb7c03647876fa96552241c9eed3782df6315a43252a4508f12aa200cc080c7e3bb8ee8b8810b8def132f395fecee287250f6e7bef415ff10119afcbfa5ecd1be4add1ab234fa30b8fe5350c13d8c17908e6728bae1ba4fc1e1c072b8c94f42faf58efbbee59de4348271fac73e1dfe7d33ee46b7558f5c4d20bdfbcee3e82cb9f1618256d501a2e0e9a81b8d8f0d23c04dd23fb6990c884b9e026590f985b7b1d31d6cad366394c811a88fc52544147dafcf8a57bc068a26949fc0c26256b9fbc7c3f503fb9630a2dad9f2802495eb3b898cdc6aaf95c1c70bf3630edd9352a5faafdd8b59c78aa4de6a33af874ed960854ddad1495940564679810673f13cae7f9cf014664823e5d40ffd8fd6cf0f053f6d4fdb8a938c9b6784c72659ae660422036e822910a608c50087de16aa0243f3dc44511681a42bb82d9d608ec7b59f56da555af749f0f1a524d28e4610ecc15817b9f4da8370a5f98e3ae3911b0fb12bb3fb1ceb70323214537a74f0516aa8726468636e5302645dbec7b1fbec1f0006efc71af65f4c54d84bcf7b33f71ce6e233ee13c743f169279595000270ca94757f4f6a3f2f23f636b40bd317fecec2243fbad6db8ffb3dbf1a50eaba69872cfe5c2e5eeb6c29d2637faaf37aed8639fd19f8bdc51f9b1341b98ea34baeab3ea9689dbb02572dcfefea6efe9eba3ef0eee9d9c569472deca19cd46b1040753a4967e43b4e22243ace19a2c03e5d295f28df8435253d1f85abfd4dee5736a31ab10e155d39544596d82845fdf3aff5fd01e9a4ab2d3409ee730406192df3f389f53caed958614f1bc1e69361012689030b0ee149b52d508ffd7c21905d1a9050709f6efb9c53884318428c4858d1e84bfd64d10f1d6a601f320ef75dc27ef429e329a90884e58fba1f772fc0f5dd7c210f3bbdc3ef860851841fb59f2a26d249150129dffdcc5ba1fefeb7fa19dbc64b08bd8e4410b456ddc15b59862bfec4086dcafdf66f97f538585d9ade8b4735f8d084c9407525491555cc01a798c5cfd8d6915b653ba1421e095f9f36d36d9d54314e842dfd3e4845af1670a8b444320281f2100b47dcaa3cd6e88f414716585a23bcabe91afdc83aa9fbb4d781f7cf4a93931f424cf7ad41d3f7e9f84dc064ce7c3166bee18272e8d234196161b5f3700aa67c2cfc2473bf94adbbaca9a9a5e6d2768fa521fb6359db929bbe74eff0906b27e5654c0aa82ce381dfde34df49cb993be982fd633df33106db0ea409144e9d8af5099a657d6b3e7048111ef0a8856b7028255e375a118f55aa4c75ac2b912aa09fc79e8ffc4b9ec686b2b7c5022ba457fb392bab81e9ddf9cf7919a07dbda1f41c7ee671f4473deafdcfb01f24ec3d74992d38883508a31784d8eb87d995275d791bf8975626935584fb06f55c3fee2769115e970228f6b7f4d1c2c6428dcdee9083a82026346f49d6f21927895cdea9b7d85d8e79b9e044d38d72e1c925f6e1fbd26958299c4a6c2c84205cbd03a12a57526383052cc0c24c90f62dbacbcad10c44de686572c99702552f8b1b37a9bee72d7f2e7e20aecdd73046c95c818e66b66e6142a8523679822434c4221076fb208746202dc2f8abe131d096881c366668de033d150164ad7ba27ba1a3ae5eaaff0b994323413ab7198536fcbedf2ff627a7cac37bc1dbf624eae3f8b7e8a8805fd163144ff5b9356c87e379eec00102d365a4fe0fbfa650f0708340a39020d484505342dddb0f04658d637f106642c9b55fc6f26933468a51049b8ad3e59b05efe56c047357d553e9f428c4b44dac044f4485e5c85f42a394f96532c795071021e297290f51724e578b741882ca0d4832bbb48dc05ff6f542601d9414462538b97e3df592c901a4e754b7e4a4a76ffce0dfefcff0d54264302a83fff43d7ebade7d0930f5fb038945503c360d5bc206ff5ee18369bc7aed8c57d61fd12f04fe29c8a97c14bf6b434223105a7694cc71d795c315f3e37c936a20cfcc42600d05e0d0b936a2059ad9eab76815c6a938bba286fad6544e463b660065cf476d600ff0fe641cf3e1ecab36ab16e30892ee8ad8c18a724b8759a7b718ce9ae94728b2dbdad7198cc3ad36fbd4eeb8a1855e14d989888b6d65b34be223d6a152d3757723621886ba44e380f2ed0082086126310996e82ec742d3d52045bea78dbd8dc37c5303e583f18db09f8e075586237f08860662393fadc0fbc06afc49a57ad50a7fe9e7e9163566ff93850b988f75a1294bc1ac150be1f449883bc9590124193dd51410463aa68afe6c1b29f4509c660f86e75dffdaacb14f93188543f695f0ac49d11380853c84e2edf88bd83ed99dbf9012f91cc251a6856a240eabc5755dedbb71e30b8330b80b41a75f5c40bbf3929b7e99a8ed341cbe01bc1f824b8c0701e3c00795581cfc9bfd4b5f7de1ce533f9e60106009a1748f5e1798be5b3184dfd696dbd4249aa32e6846cb5817da8280d221e03288b93eadeafd768f4b0d2055ef2a32369e6f71eff7d8db951a88c2c2cec294842de1a62ac0a7c47ecc6f3c1f9eb1337935dab2fbb8e63637cfe067084ef586d862e2e9a48d1875f9b2df6bafa846d10810d6ed6422d8e3f3115f8168597f6f0d7d87bdbc378da3db6a32d2d162502a0f9eb7940ddcf532ab6182f57b7bb62317ec7cdb6ec463d6c802747482951a55bb7842247aa2e847af215ea81e93afb1095cd315b839e4073a97f717f9cf251374fc192ac190390c66451f1769f2b895a63fe6092ef8f8d9ec09a793857ac85684e0df92bfcb6a8fe11b69577b23b0addf2a6cb3806c7c643397de7228e16ff1b4fd8f3722d5450027b652fc7c48804c71ed239b773c48b72594db00576172d345b50f287abc1284ab52c28b818b1906429594439344c6a4e5585a229b40c51565751d52e659851fa1ab908d237e649808be24ea99b0405e8ababe1ca765307343531db4187335b096c689d668d582edac7047878825840ed90a00f8ef6681dd759f34462992265498c09e99f4f779829895e02041b45d43b525bcafaf8e600b33fa5b4f8012059284992b1bc86bbbea350597a498abdf3effd8d31ec6852fed4bde085665bef81ba98b8c9777450c473bc033efc8b7ce275868d1ab9517abbd105b9fc2504db4476eb44203a62aa451ff06f8c38697b7aebc416cf000bf6c17772f27122ab280afed2a2a81705c7fa12754d087973f7011c960e17fa3cf4df062a10882a923b035edc3893ba9d2a77126bf1ceab18b383c53e3f0f81b0caca25b0ec797312a8d57c1e02c096979b40d9e7e625a06c2b6884f990776698c2a391b8cdc50feb8773050fe4c8112f919d25b08647e972010000d2fe751f230b254e1c2e7162f552154ee96b0376523227ae1e8f3602405e3d0d0769043b35c76ec6ca95d9603ba2f8214038b98df3d3e65502f5f3105616d003b5d22e35a91563fd0b2630fbe67a14cc1c130240859c88d04e194c0db43c3cf40cb408ac76ee7e8a761c38c3e90272c712d1254a4f63d9dbb663c7e4b6b7c6ddcb6f9b45779f73fb6b748f1469e55c5970d2fe586e601b75ade37bebdae9fcde5cff7ed381d00f5c40d1876f5b79051c8c040aca7324ca7f83646348f48c1467e15e19cc18e4470b2d4c73acf9d72df9e3c8a329b951ae0da3d18da13229b40197f94e5aac6a58577c7be682b66955bec4f2a0c8aafa07ddf5efcdaec4f35b793f17395d791780630cbf6fc5fa5f1e5d15bc7baacac304111f49b7140c2733d98166e027945feae464ab690e085f60a729981d8975e68c2cdd5fec1ce27e964d8f7b5d8a0a9c23eea98c323b36287297a4bf55a67a6133a7ca4dfdb90d42c8b54f4a11f9e76e4ab3858a3828a9bddcdaa6552b7b64c2571f0464898c05b6f6a6b747b4b5d30c156e5abf1f956f6e26914dd8bb0f42cd8eee6e9c5f2529d9e66e27a61d76e4e0ed4a0196af29ba99ea099453bc7f5529d9676ed2d80f9f270feffd5505c99fbb99627f78de6cf8f75728257fd66d9ab2878c7c52597a1a983d52152027aabe702fde2ee6f65f1539d9e5b7a5da9dabb705fe7c1489e497bf9568f7bc9e1d78f3a12493bffc4652fb734d6fd84d8111480a44b634bf8ba2c214061c08c5c742db378beef95f8636321fff326c5b249c0efa1d682aff0dd9557bfac0739484e920afce4f1c01147ed3661e81413e6fc4c584a48ac7a54e9d3986cc87a81ae2edde442ea4632ce4d0a6929f5856a6af0f56eddbcd9ae7b8a668129fcd2d23a8c9bb8da47d4d16ae987099d1db582c719f7b87d02c20cce0ee19113ca715f61e08b0510174da6ff7d18f7956db67fb09d7987d98aad837189535117a8637c0f15d67009477cb2d6ae2c22e01c5d8d892456885dd30340a6e327eb032138d28c4fe50594e6c164419638a1d74c7afd4132b53b7772d8aeea61ce16159c97867544ace78921f2c1b4168eaf6506cd9514622a98eed4cd1ed3ad55269e2382448742a1c7689484db4c011bafad42dc73d5d64f93b03097a0f9ae5886745283616a789d2f1e5e0d88852acdfbb920581066f3d28336ba02dd0887a79f7ef3b2b055f9bada3d5541f4fc7cb708a3a03c112c19c3d868c525e4f9063946c7740195b7ca0a9e2ae213f4d720ea413b9a2e3abaae397ab33b06eaace27b8c3dadd840cbf5ba6d0dd6f19d8038ca627b818e3fb9d4951c7da80ed3bcfbc046910776a87389f367dfcf3b24c0c1312f8973796161ee298349cd2b5175cbab35f89372a179fcf2ddb5b798ec6f9f4f6f389c69bfe99a1394020321916afa277a4bbdf2486bd5f17d1babf8ebd59f4f2f8bb3bb7719ea973d7edf2d2871e6c796df39fa54cb17aa50e6a6872d4eb9eb8e8e8be4a6a24cb590ab1c5e517c7b18625a022387c174d22b6618d2f582ba289852224c9fc69cc3207ea084305cf5fc1301672e2a809331fa7ffefa04523a67b6fc43bd5b5319c4ec73d10cf44d74efacaf7939a755aa0a683a1aa5db6388174242194fb1bbc69602a23241a81cfe574e5245c556dbda03eac64ece5a5b19461225e3006aed1ea401a5137c07a50dde03604889e7880917cd7da84df57e9e70b41bb5e2007180489fa8bc11e4e8b5a407ed72ae35b15c0df7a0d3ae4a532504696e61ba6f9bda0166b2b8d7fa49ffdde1eb2414418e1df07ccba396dca45d2cbdcfd72ad66c54a74f9c87d2d8fa006e1ced177a8645d7b171f1ca95789a8413de4536d70eaa16e1c24cb1066947de1f78a3bc61c60d43a7a259c3fac2c88ab1acd05b89d7fca604c872103ecd34120ade48c48ec79b0f934c07e47b167163ea3fd0e07587cac6b01923b6ab899ad380eef4221f5b25d736e590f5e6754b8b526b3f3ef2b0f3607c3ff3e8ce465b32826e98132d27039d605b9dd9879f12692667763020c2f10976797c03cd1d17181f0966b1c28e3ecc02f21e5ed3c5e06af70544eb89ad87c4528a41142a17f64ebf53c37b596fe249c24c05a82089e627cfd0833878b6f0e42fa30154bad0e8e60d86d917d300a5813967eede2371672ac81cecfedb7fb665c905b4b82749747712bae563e28afd0464039f17d232d581f42e2d11d6fbb86ecd97e88c260eed466455c4509de45dff9b147036af7b13f2224bc02d95d399279ac5e4be329a76bbef6cacf5135988aad925d772a87af5a5edb0b4afd1250ad4a816ddfb33502d620cdf8af3cd12a99bac594440b70b449a5b9cc554a2d346a41f6a66573fddd506da59e98bcda9f3fdfa4f2e0f296c427f320db8f664ea695a14c39e5fc6ac557e06d6082f62a185e6b46028ca4cd3f5bfead0113ad9f5c5481ded52605c2253d698e7ea006260b63377ee59c46c62e8f88c628c09bbe306fe2d2976946b51eb0c6ff710e08db721f1385101ac163a52149970892eea45666c2b78e941ee62e6ec7d9a66828620fe053b607fb5bb1634a5f4a4890028f14b8b4a835ab988ccf2159ce73eea956810dcc221f6c88cc43f70a8724c6c748123940cc95ab39ad8d70e47aed04d303f3aa07d87e83528fa008618157ef03ed4dda648927cadc3ffcc0407f0b8d66c80a6b158115659586a5ecd8b68814d246a9fc4674578da4299a27eb1618fdb5bd4fa8d188b84116d4e4df7fad24b449f54d696d5344f4a3230b29e5db91af1d6f2c6249146b1f09444db30add7f8e88ff56644e834ca313fb7cb25e394af3bce32102f9b362d73aaa16b9cde0d4357fb3e5161b0b4ddb7c351321cd904626be85561da98739397c20339ec68289b5e58b83e0467a0ce8274e6832eb6e43650224bd2974c867ffcdad9440dca8c9fddbdc8b6fa701206ae776e55908691fd9a2842dd136482f139e1afbb4272de27e0b43df896a91e0fe088a4b2c2bf2d33f11c30c68a19e196cd3ca97331f742249d85e8a35c6fd685f28fa3e66afd842b8e28865035e071ccb12f62dc7100ef6952c032e1178f8db0958fd2b20fdce1b5ad8c04d65410646bef32a6b28709b5d8166e302a6e8e97742e158b353e26b0e9adbd6c951dcb4fb6155f24c93f5eccc17bf9f20b8751ada81f2a1d1d2489ecc3df5e8bb7c288fe91be75c22d6a4b3a33e58de84f6bc2b01a637ce05cab51484ed0a166bb966cc23ee56431200c1366c6f18f4fe64a382aeb357c7c9647c9340881f6ad95b6fb66b2d3e33e6aa1cb041ae66024b0e03ddb2fb17ee287be38977d06c267ec9025bdfcf9f347bb9f1490f2e492c788910cbf486a1b5e87588f4b4d6c31d4f140be49b8d0c689adb3adee6a82e89e9ef1b96b3f00a4b3a81853186140aa4cc599f61882a55ab5cb8a818acdb15a6e6037f85eb0e411a85ab26da0f994c16cacddbd562dd5d9c11b64e4d297bc70cf39c32c39e5b514f30442637573a2d5d5bc45367c74168e68a45e830e72b165b66288af8e19d8d2465a255c7d966a3ae693f92f20269ca9588f4ee5130c91f8cdb4820d022723fdf40b916b2d1c06cb2c9e5708e35c726644dfa2b90fe627befbb83b30a5a59cb119d0f6c663d7b69dd5b4bc410ce5050685387610f70f983f45e5d798b0bc6845c6998d7888412bf77967103b6e399099a41feb3166a887ae81b1b4e649341c9c9e51e6d6108f3bf4ad754598ff0821673ab777f87f861a09fa27096be0ee0b098377719fc331bce8bbfe02ce9e2b24f767a56402ab456f37e0eb21200575135286288306fc9c9dd4a10ef4572a7341cbeabf61d6d5ddaad70eaee1a23ddab6ef09b9c4d1d61807439282c37c798894d692030d16e8e98b9e18e1e7a28934b626b4d105e22494ce31642600badea37e18b34866762aba2c8f9dc4fe641e99c38045b426d6e40069e08378cdeb32d0abdaebe8851edf018661d4da4f875ba70ca42fe75b48cb0edb58e8952f04d181e5ab76413902e26fd1a0e93382b2e87da7a5aa1402b94ff02cc9d2a13d9b56b65feca5f5089f74598e42a5c91869c25c432482fa14f218b60dabb5f6bdfdec9cd2df10ad2d750570728fb69e244ef6734612630215ea29ae0c0c02fade927e1fd177ef2892b95fe9392f13550ffbe0900c9a6f7603e2cb13a77f70ff1fed2b4f4efc2396cd00dcc344809d8ac9f9b0517ef6b9839430a1ee307687a72e588fe8a926da4aff893636ca2f8ce337c7d8e30e7650868e440edf1e1f1a0efa9810626673372228e1350ab8179ea03b9dfa94e9995b3a3b6121418b48af77a4a2c087fdb014601fe736ae80cc26181978f466b221967a2ef7351d60c7878c2353c8141a334c6ce5521b8efc5a15a0b31e6152ebffb9dd5c3ccd35a5cc4d39979a1db6c296a171b5b4e62a97000ddc05b6f0a9e93590eaf8d09468900a2ba254a9dc21c8579009c427b485e96406b5ec6fe0d6ddfb165eb5714aa64036b1d99db667b8e66cc196c64827d6d967c693c8bbc9015506b93b05b317b76ec0eed64889fe618dff9aecbda004915fe88aaea7d9d06b4332245e660571f4fafe4da9e84d32261fb3216bf3c2355cfb18396844186eb8f55827beec0530812aed470a68ab3fb9442c9de9ef26b3a405bca2ad5e97e4c352b7c45cb32e890c498bf870804eb68013a0b3f8ee810182e4aad47d1d65213d3ce905b966726392ce69cf3955198bada521cdaebd77d538b3659c6ea428ad96d7918ee5b3d5d50289add16e33378f28653fda087a527ea08f33e8a1b7241a3e6770f32f0d9b78acab098f8eb1529553e88daa6d68619337a1651ec27659ee9683f36db19086fa73be70e04548dc10235a9a29c18c0fa48d6c04dc134dede492089619a1824587f1a9526397483f13dabae8f2b2172496b66b8c5d860d940216313742f3323a9e3c2b03e59dc7ececc679c49407b056d6c3806b9c8d0123913b6510314e2de36953533ae63e76a5d125dea4da9c5ea42e9f3a9e25599d958b216c2e035c13f04b2615aec119dcc812a6b17b1ee4a09340acb1846521fd056a366c9c7479b49c20731f886a56c21e0796d5ee19c0b6fa4547fd89d653c56e0cb5f3847c15b29eb1b9863982d94f20be6507823e57ac3e92ce3b10a5f7ec1398200a1fb9555ac267625f9868d5301a25969ae2a8d7bc0d19fe4fd8730eb7923e30c06e8fdacf345d2bfda7adfa2cc5652b8abd4ebef29f3190c3dc36f85248876fa2a3387d544ff00f64df30534458aa0381028baed1fda57a5b329ca2a628a30e834c6f7e09af9178fa2eaf2fc49348dceed4f9417717142be3019b94ea5a9feb4b2fd082e1b099ff8350ccbb653b8370b4f9ea4ee77cc01a4c9f4894453645944cd7019e4a09f647024e843e4a0a06f1b639470944c3e9b5f40e28d49858f86dbebc5db762bea9cddafd721e09b8762adbc1eb3f8c0a026636e1a943874b406804ade017f5fdf223a380321c5c98618afb3364209ac28d130f3471e4628473d2a3b23d6329bb11e2da10068d1d6b8374bb4f740919bd7f8cfd9a5de82236dd38332acc8e4440060f8be477c7209a745a4665b8bef4d7629a18813d7bd24ccbfdfed9021c0227a7fd1ac755f644eb46bc9d18c8ee4da56d2abe4595594fa68b54c09502fd59694cbae8dd33929c59fdf546020954bc63472b26f28b3e321f306c91256be8c02a7cdc99e6b43d350fba9d24df29fc8a93030f93776590a357e49ae0d03c40b5b300e499e90a2022cb8743b9e1af3834b633c8a8a6320f34c5d9ca0f298c6a17738ced89c2b4a1f826a3aaa76fa93303a979e3a04250ae7b211cebd2d262fb4533c9796e56d465e1a4f4db56c5027ecfec255186b21e31b5991f615164b2682d3706374d6caa680423159fea37b475770ec849f0534c9a516922989aeb2e61bd965ded4210a2b28e7fb21effe49ce119ac426e181f848bdf3fe6435bcdc9e114b5a6b0576adc87231ba064798107f311f292bde1e62a0f6f79c33bc7f61820d90d4ad01180a4a7096845f8ac9c2dd09c941843688cf3168216ea6e8bd5203853f6f6b5ab978950258a90b2bcb637ec844f9a96e8a0dc4ef08e4327e8e4a2ad493e1560b2da6645792b08d316c40bcc6c2f442727679eefd8fad4c19adb18e07f8bd74537f06eb9530330c0b992a91e0d95d6e62b3acb7be3bfa50ea9d83ad1d00a0b594a813ff505bd01f55381d386c0978bc589cb4028ecd7519d91144ca24b8b7e699c1975c5d5193d697d0240a382051943c2444c1a58f5867f364cb8927cb55b475c0b445f5a91821b175456bad3a4617d4e09ef4ef756179c06611eb4a49cdc0be82efeaaf5cdac56d3fa1507e285155d40212bb8af207b8bfde03c4956795f187a121cef8ae1750865d4e1914bca7710927441933b80c68ed16cd388ec6c8a132573a1e7abba1ad17e9f8e0b9a93c9d0db11e406c7983c42e394f500bf20bed9cfd781c9d57c2c3798e3b52722cbf8e603cd82c3b7692b38a02f42ad838a2ff4930ca63b8fe6cf37a56d9a48cf5878d23ef04178bab4855283bde449035a147bb4d108017f1aa777a72272aa7c389fc5a8db2170fd820991d8c5070834a17edf818828da398614b6aafc9629e4bab6c1547801a826dccdb79f78ccb38b8eec2872c5bc7d6a605831bb2c67a8c8052a65a19eb049a63606a0c1c2b67d82685dbfa6a9b3ab76dacf611c516c62fcfc8de84825393a6fb9d42ee38d3fc3c53da8557769b5a98c6528c5a50146c61927cea5089e9c4d596b529e74ddd3d9d13cee41bb744db68b753894486c6e897c2f5392e1baf303290dd72a530b8192e81c25c66cce8dbb0ba02196aa855bab08ab92774f8cd8262c3ef04f0658f30bf56142999d0f75997a18ace4045b5d1da4716ec64a3b3725e6f252df4134b2e405b41a06d669ed010ad204fb250861bddffe08f5486b81a01d95c5e5dbb01022cb05094c981e73a5c9cb5e9e5d03df8d04cb8129731b93d2f8f9916c2303010f75a17ba8f54f05a5508380159ff21084cda8d5a55e31ea9784b666c4306e82a2115d19f9ed4979b3774acdabfe5bfaff6874fb5c24e1053b42fd5892a9bffe38901c8ba110319cfeb39a03f769b67aca52710c7e88fd75738e1aaf37ed04b2b295326cadaaa6dd7346e530ef88484b1bfa769f50f672b3b82feb7d11e946dbe8c050cecb6ae9a441109ea7a17d7ca98694e4dd149d1e292123e28b31055f320b0f4dfee8d3e6e2520ff74245e1bfe344a8572c5b441172adc12a8f33b393bbeed8c0f7e2624b7bcb57b7da8a1f53fa5c8b599b7778bd85cb1e8b90cd987dea1170cc900c5e80db6450acc99fa4c8dabb159ceb1140a9d2aac75468400494e733781294e93b38273324cd3b9260fc7053b0ba0c69d78bcd230467a9a4ddc5d8c06fba4da7e2e4983aa63498dd69c04a5feae7a93f49c8d25bf83205a2cc0f6fd176d32656387f33c83ce4eb96275f532358b9e45bf6a2acfedf0147f17a310f8549884c3bfd80eb110ec8ce29cf41272220fe960ab2c59964e20a9d4d2186b84b560c40167412c0758c51503fd0ba4d3ba864308742c75b05dde782ef0432ac37deb30add13dac0e6021705649e82d2cb8e30b23143e04c643738ac69cdda9cd97f97cbfa1baae2b076fa78c3feccd32962bf2e9339893301b94f30fcb31e8564afb067320608bf2fc177624ceb4a1612a5ded969beec3a10e00b84db5e8180579da0abd40dcace57de8705d80ba468a365ccd0c8c29397fc10a58101a0b71c4524f8b8e3e85d6b720f08507542e71b29501daea58601a2f8c9ec9971cd07b38a18f3f2bc68ff3b6c7532d9de6c7f0a9a69637f427f2bc787eb8ff8e40bdcc9bf18ffad53c3610eba57a53abff388e44db0da5db1367e80b51fa709a30323c59ea2e0c4bb7c9b4ab335648d49149bd827e9d13fc7e7c977aa5d38dda79c7b9cb600b73a115989527e80f9759ce975fc544bf5e00454763bdbe29c47f2cc7d97aea1368fc44c3fc5d9115372a9e429188985911900c62fb737308e290cec5dd26a37a1d835414d620f17167cd15dfaf2c91c911c26ad604b79195bf96023745a32cff21320bd862cd4b8c382d92e8d1bd75e120e27905ee7e1748507fcd0fbd8cc395c46c641b4d881e1f4a7380a7abf9d64528ae1a0bd256c41baab928948172a5ea1c50862454782b70148575c771211488a495cc77e969c74b4fafe09711c6d7093ce993e1f190e4bc9645352354517c34bb8ca173ac6b7f6e91e56d16a6ed899020cdf524af9e93dd333b09b48764117ce6eceafa4a4a13702538e667f8b04e99ada0b28902161f7edd4f0aa5d13be4582d4553e409425091f71ea261820277a1f3b392e5e7bf6857c3aa5ea07f07211f31203572012654e67223fa74f351475492bfca950119b4a456c0d9a1938a56181b6ece68e5cb76509a6ff4ed0a797d5b55536190baab4be3855014104c153e9e00853e9596f5ba6e5fb6ba70a6c279c878609faa35744aeffcbcf3e230a0f945db6c042ca2fec4ba59e8eec387f50a2dbf815c10a229a659ec44b63b3f866979d17c97ab4d34f0e0819ae8f627bc5a03216b7c1738513aa8905c8763ea82fbf15d4a5b2e543a30a913880f81702e8531d9f9e3ba5a2aba1cc21a1c1201f9d6d3984d6be271c24567791a708e638ec311843eaa32c93b89971d0d0b948d414899597b7808d7360cd5cb10eac20be53dbfa3ccf25984240e3accb26ef25a55a3d4e40f3f83b978032d24a33a07c78b3973eb5ef8f7dd4c63c8c2fcad8cead4589323cdd8ad1a4ad21b9d087f2154d954c959ecf3377c2e3665e9adda15310fc12d38cc20ab519f7ae365737c9b6ff33512a8f82efc44c9b171fa73f85b7fb8241ad0a4d545ddd6c606cc18e70006e4e0d534815d66d7911161ba83add966935550e28e1d90841a64e494143b21c5ce32e664a6487df95e2aa585fc49fb8cbf32bc2be86957dab37855bd4c99c45799a1d39835a02f47f4bacb97aaaf3b6f19a82816636a2f80bea9e4942e18087dbe52b1ec92a8663ac03fecb21747e7b0d2da2cd2e9bb80cb5840c0c27960a577b4cda60e26dd948b112d9ae621d81e2a56f2ee0aae1a270146179a6593246baad2a5fe5e65d097c66e90eef4d04a0c2d4ca9f9863fcc54ac54d9065758b8609d958a5c65b7c49de60847170dce5e6edd6590943189853c27ea5d049dbb21ec523d46b5e0d14a8f528ad5c750ce35580c3a61b4a6e6ff68a6326b9677178fa67e84c60b15998e339492af73ad20005e7b0ae34c7e1146d7ecaf4874fa4ce97dc541b26aac593349b32020a8a6ba57cf188cf3607170fb101f86b4310221b0c20fa290d96e9c42111a286e64490c3dc45f2e8dbe1546fbede92aef6a51fa8480fa5b21785f59571792ad4ca1d7d6b3a5117b5d20c728eaf627ddaa20034a08e10b6538096375847427270c646ea1a797ba6880a0dd36e5d00490904022f9643f0b8fffb53ccc01546726428cfde3313d66d98468914c75230fbd51e112d38cc50a9c27e6da079282c651f9eacf760e907890bdd26f1838a9ff1915e20fd357008b0a166934f8bc4f83d8a71adb96ec23c6c25d95812a28d8924e8981bad767ae1e8e426b1af0dcb24f7306a4617d25598e3188525caef981c4dada077696cb01c2d3edaa301844ab3270a22addf3e2a8b59927e4faefe39db21ea7c8973ffe32ccfa1a245895c513d8f329c6a5d25126eb5e215f53554dfe601e5032be3b7725907d4c5b9c3f96995f5970c6a2e353535626c7e3d8a60b4f402efd6183a6cfee9139c5724dfe2bd5ea8e9c70c3f52b2e91a23bdea04675ff7651c06dcbc35215e797ab1df2a2ca2fd6f0c9aeed0700e01f5127578e807c3cc1d86d41f79f355b0124e0af71bef97f0b3bcbd17cb0078548b656eee0daa5cff37c2298827e7bd3b03050798b2517c069ca36c644bc8816d6c0875cab47d22fe0549d0bf73fbcfc44bd25020e502b0ddd32022b065a4b9f7daf4964d86fd3d8584856001e6c480cbb400da434149dc4b71f6b0d234497f840b36ff8c1da4638dad478c276773ce83ec65074ffc67ff750c22b449b4c40c040cb4966e9b7e56456f3cff643a34a5a135f976773473fdc3e159be69b6b87604e4b04385f9abe759f4b7a5859ce79531880c78018b2277113bec70c9fe48693c53402fd4c1f8cb8c4a371be0c46cb074312b2a2a1f601608bc56d09eb47c9010a0a0cb428865d521ff17b757f6c9cd25a9cfb45d0cd751bb4676869d73aced65105a1606d94c9a023731cf4c01e9dcfabb27a059678697ffd48937d81dad0bfa98590f977e248b39d17aa2d9fe2edabf51a2283f8583e17bdb0241992fd89a9007f0a923ba675320a45daf41b7f0b00490a107115362aa16f1570b9acefbf06645a41a3c868774c7249ae2b77375c94e93c4e9e2a29d8c43a60af2c1f9c3dfaa6a234810105db3795ede906dfc19b7e9eda26225e4eed4ce43e4a4e9d41a71556f507e78b55c018e6a6f6997e3051bda142d4b84c530181b93920c8e258c4991ecbcc8a06eea8408184b88def4fa906f59d2eb096532ea2ebac20f4cb79efae1814086516486f35de3459bdeeb8d9f12d5e95a08141638128c063bf2b52d044773427ef5dee7360270b4a507bc36d37c8881f5a86a99ef3abf51594c9bf079f391b59464c96fc2319644a5be30a1c009ef9c205b86ac903c21c11092daba944714d2d997e18b2e3502a7ab56661501c4c7cd210678f42b6ede3005168d7b55e3c5e70f8770243f9e1be5d489b090f30d9ec24a31eba25be0524fbe5b710306395bb930f7bd3ed4ffe0e2091be6495f4a40ed063bb2bd5ee21193836273069e9a82744d37c9d31b8d10d8b9eb4a87d6c8fa47b579519c85ff500f592df69984d18d40ecf2f3f593aae4493f84c69a6f3b6f09b4dd9bd81d3ea079234cf6ee08281cb5de7c6f1894c5d35757d598535a83aacf5352f447abbb3ed109c1d3601122ef7f6645bee1426f1039aebefb95737363a73999fde4655c093872dbfded9053c4752d364edc0a1be8668eb8278004bc7fada6e1f286512219da67f59ed3ee4562b4c3ebeed8c9522d32db4374feeb79dd4f9256ab82104d13267d0d5d05ad4de6c21ee569f310158116189063624cf8f687d8da80d2ecfcfb5390b568c8c941bd30b7d7d2ff1899dd792138601cda5046576ce52b82a112745d6948cde41b28493571dfa3b80b0ee792468bb009e9c9ea63c6397242dce0cc71666c25deb59e1b4f54ce16c610670b4343bdc5acf74c36b32b5a06f3e6cee020e8493935cadda985761b567cd3b394ea7a1a9c19cc3aa64fcf817e4a96a7e7fb7c81f6860d66213cf187bbc0dcacb429deaafdda5757a41d02918a122103cdaf0aa6558747fa4c32569e9ae490913828e10be0e6956c7e1317ce5e46823f9df6f275cd7eddde90f2ecc1ad638928e4f89d38beb5d7d661d44c3c099e22d5af1cacb7ceb3584d095a579600af5e8dcbe0aa166024377debdf49cc82cf03e2b786fea659f3e58c55917ee649b530caa93a3dc78abca9d0addce4d17bf5e74f34719e58249863107751ab8e964acc9749b568e811bc71c35d67faa6e904397d57165c09491ffb2bc69f7394c9923e83cd39337bdf7982a9ddb7adc1603da7e9b98b91a98d0f960386fe0dee54f01f3e8ff3af17690af8728ecbf7ad2baff247d9c9cedb8e07e04c7663cebdfe8f47d200e119d7a1b43d2e482ea8d9425f27fa32746a3a5cdf86fdb034d182e5ed8d6de535a8a16f27f361ffc852287fc1f8ea312737d35a0dac8ffbdd4b044ca5b84f3299c900854576290dbc266c830baa9966ae14b4f81260163ca8e9d0020bae9b32ee93aa93fbbb7a628e23782bc002c1846b87ccee32199a208c6bd33bc004c92a42a56640fafb6ddd2f34567dc5d606f117c5a6895aaa5708cc2909a761bf988c6e033be00accc897f2f0000c5a326d0771ec4008c649b4f25501305f7e2e6312c142ee4b47615bbd649479bc2be7d8572f091acf1358309109d61e47651738a4ff4d5d619cf0e6ae30989833ef2377ef907159caf89663eff8703c112fe00f10e93fcfe834addce21061a032aee988c762ecf6cc2a1014b9bdda2f7739425e0bc25a0818b2860b16ea7377aef064ad52e85f7ea3398ab808374d3e4efd9028028085ab7be4002b38a09266691bd868718505c36c11e13478ddc35c7b5691b09300c92ba25368fbe11030a2bb832adc916840d5069d92514c3cf50ca1b6083100c88e92b7cbf84051a7877033a754c4391a4d0316dc0f41308a79af4606db8bfa7aa8b00ee274b2b149cae04722bb7e0c701a088bff2d44399191901c69a394b2988f32b7e0e20fd1d0fa8c3772ea557c39c9e8fb553327e8bda430fa2aa3be8334156dbdddf01ad0ea21eb0b9a107e84070f1be01080394058be145811efe5a5d1502fd37c9082b369c40dccae3244282c08241d092872f204ae3aaf7b21fec48530f7b981f29875cf7d4a0ad91ed091ccd8266c4e45b93acfc37d34e81965d356ed50aa22bc7de55b26f49642248bdb744605deb38162d30fc2a0b24502df0c95d031fb3455f60964987088fc992d80bcc52f55c66421d3603ff9eb1555ee0e9ca4117ebff8adea3c2959c1ced5f0cb049613168fedb8aeead139b57284a1e5a62b56fa88ccdc54ca34fe7675d0bafb6831fac4f96869a717b688fe82f71f4117b846d1fd80eb692cff378cd599ddd4a3445fb898502a00abca687187461f2d34d8fc08ab5449785e395947e2ea5d6a817860afba6cfbf0723d100163adac3282cbbddde96d95cfeff4e85da9b4b6965bccdc1ce203c10f64a5fe6dc33a09439cbc5eafaf7d104c26d36912fbe55a7eb02aa0f260e9dd0f763d44753836033309bff29aab095be0fc70d944f494f170621abf4184f908d78fd945d44df28171fe43d50bbfc9cbfe7a7b45478e3d8c0712c9e6f8e509a5610cda471e6dbc1ebda75aa44ba0821262b16f9fe71f2a616940556b7d116ec7c0bbcb560be6c24add594b559094e0234e9302a6cfe8e38954615a3195ea7cdea8b36929506b793e50df0d3b98a89a6d823d0ea8123815e8f297250d33ac85ce0df2e55f01c338c547450abd85542382cec31a165241a29098ddae78129196488981e1b5e9995df3699f264e3470feab7656598ca52ae1ea71c6cd1c3f60491026bc4dc2bab9bd929fa5bfd00c1c893f6b7b4f04bcdcd808a619776144c89e308fd88681cfb309bd2dd7203da1ddeb6c08abdc051ad34e3adfc86539bee35d5a423ae301396736da34189d96982adbad2b031ece7ce3939af8dc4de689fd2aeb2e8a9ac6a2230034d6bacac920588eaad65a4ec5eb0e39891bec00a59b7cb957a0a49cfd0e2cb21fa43bf2ed23174592a41d33667ef5ddef028e86f899cbcd5b78873cfa6cf27c1a918cde36ff40d0ddf646c9f7d339e1a0ac0040ec096e5a64adad5b347fe40038bfcdf95d9a99d003dd8eb5185e0d9a7b31dd4decc53af4d2856649e62ea74e2f2ef373aee9d7cc15889473d724d809b2bbd45f7ae7a179ff682f29aafee556925d1c3080bb65f3db3388195d04958d674fef3b5528284231c95991735aa5d1b64f9300c8980c749d1cab0dee9f89b621299be67cc407da1e058d21e7df217ac41e2a559de995930b10342bcac95d02c7c2f981011cf505592aa2f9f4bcd1cb3028d1b2a82a79215daef167014ca99949638b3ca5903dc073ea50f486c695a35b43b98b6600a7cea88aa6ead88248013b7a48320c1bb1fbaadf40177dbfa50d2f32ac8f04bb85c2942e50f9a6a0e43d208616f32c26b98bed6a34ed8da24071facf8e199ca173602a6c233a40268bf9c9b4db9ac16d0580789f42cbd13331945f54bfb092aa2279e4f032e92cfabd04805a670ba89eb29349e015f36d34d3c9aff267f90f45db44489d070f39fc787de66dda5e6c32f371451af3c6a68417f6de7a4ff622ab3367dc64acf039266559628ea6a73935560b439d2750418678b18588647ec1c7a3cc4307c32f55ebf73480f7b5c43fb56d8c49871374d85a4f38c0fa2df8234b5056efb854814551030ed6a3a0c581bee38d40832fccd155c40f303b5048c0ca7d3e988fb81d36345d58afe29c46e29194d64174fa891b4bb45f88b4f249bce8df5e3f3b0b70b13abdff33aa42b5203fbcd31b4fd40c2ba096db2770a1216e814f9125e91b7f27c3c1b2fc7f3bc27de05dfcdcae5bd40eff33c98e7b52cf87a78e0e7b140cfc987e3adbe0bbcd5eafbc00ff49c7c9f17e4bbf16cbc17f8799e07f3887c37ae9507be40cff38aa8f703c90bca6a0396b7f26c3cf087676303c3f922e402af08e87d5feb73bd1756308463c5f33eeff33c2fc85d9ef30fc8786abca8e1d44b0f6778e185870c1174a96328b1458c303c8a47030ed5c3041eaa4ac09f7aa04287271e9c454b0f61d43855a229587ab8a00456ea9021273dfc107252751c5124868e91229e1baf89181e0a9accd6ecd084a6c0c7991c1704cd88f880c2100203d121241bf000b40606339a8301f5b1e33cf000e333560c4ec132bec17d5386b72c77ca8c6a7b8bbb23f98b9b1e87a1741eebaea5ac65e626832daa5c362e1b50c7ab89cb66452427ca84a69e974febe66504e6ecf0c09c960cd4ad74562298a6cc0d552d1d9fcb0604d22162a444d50d979c1204d261c2472484b505f45a50185015054b9258e6036f402c3f27a802c10948bc30c163c1440ca698f081415641398f470a6b832faa5a2d0c9ccc54b0e30885551513005005c4a64b4e8f9c1e2250a920f7d2376e5441d936556632842e9b950e4b0a54a105135ea08e16116fc71213ccf0c106c905ccbcde18808e0f873545743901affc17264ee0c1f2b9a172a3410b041089cbc90952f450e504235eb0201c32a3436259e18a2a9cb38643191d253b3c2e43564f5c409a9870e372d2ba79e958152d555911b9a1e246d58d6b4907ea65458812951b1b2b3950251429aa7c80404d6e5a301e3aad1b1ca59e1084a8ba7959b980c642156b15b2bc9696d60deb490b8994239cd3e6c8cb4aebc6054427c9c608d864e3a3c7100d825880e4b5c195270d4cb8798dae253a4b8a969c5c39a02b080bb66a6293031ea1535c36ae1b50887505349ae2b184ac7858160cd9bcc89513a5273f5e3716d8149980d48443f4f2018d80465a465421d10126b136605d6063041cb223c98ac80955a390b7aaad82c0156b849e10046005be4b28e1051a269630028815c89040a5a56a4fce4200e1030fb86c8172c2d2811598d1121f0d322842412c1cb0660d1198c181940c7a820071f110012e8610428b1207302215e4e0b4aea0220149103104103ff4c0830e5b7c8e088d38dc1005b5660e13d03e58430d05c8b028c30bb626e5c98d8b88186028b2c9409a2288803969e2a307cecdcb35440802a000e1cb2c4d1d2c5151da21002a0060270c26552ca1841164ba70296af2a30738012f4ac0454a942636ae56132924c0091f6a10000b231460871d5ec8d224e5c9911c4f8e551cdf1ba01aaac6770668c627062b0c4f031f06be0bd87c9163816f029f043e2abe26564b7c526018cf8887c18b086b880e90cfc75781d743e4c1daf9442f04757c38ac9bcfe6f5fa5c2ed6077a2bcf6bb9ce8e9590951555a00b5520961612eab9da302114a28ac5ca7169a00113c01e92803e728038a2b5421588c5c6829b213fca54d978013f585d80b35b392f2a2fa3d6cdeac98f1bd61655af28aa7a8060824dd14a073672c0a862ada962e504b94055ceeeb1a2cae6878ecff58425c49ae14c053840067002d842d50e9e1d3cab2051e8f5435c73026b8397910bca6ac70aca0b88aa155312a1d64d0b89aa154e2b0808849364e5813920d00d15d6062e2fad20ad9b56989c1e393d6c7ed858e0f2b242c109ad202b264e60655195411810476519100161393b5a22e8ad825648a0538e8fd6e7eae212e26a6255a0c36be1ac5860ce6ab5fa56aed56b657333045cb9b6b8767638dd88ae96cb5bb940225008f45e4056424cb0c1807544950e244c105ba09057d209201827f4c8a8af498119194833012f2090c569838a0106a5230ea214e1bb861a4247c21d2fd7970fb234ade9c20214c0e085211b0630e50630302081072800014b0c21346a50c3b95fd0b90d12a8e1c0171670c001c8941002081f7890a5a90a150c2ef061011553905942891248901119822f063ac0f080185cd59a149cc00d10bef8b040c4c003b0588002100045132f04400559085eba64695a9240175844a00a1bac6c4003127880031460851040b080421912a8c1c0170ab0820a27cc547db9a424eaa829830c3020e0802912f0441131b8f0a52c0410be7459527a02fb117524d0050474c02106335f86d0c11215a527301d3aa097418604bad0028b2912f0441345c8100033603a588af204564494e46747047d4d196478400b0860e1802912d0441132c4100017cc8c210303020742e31c7260b9b243470786c0d0020b1e7419f2c10516765449d8ac59a5e043014b8e2f8ed711a0115f11df109e922fc96ac81b7182561baca805187c433c21ae202b20de0fd08767810d8f9d9d5508eec8d111ea04c9018233e446b471bd5aaeafd562b1569e0771bf09739870779dc73769755f9b73425f62d2de9388bbe7ca31e32d0f73b884394d618ecf0ff5a1f44babafa5dad26de9935daeb9de485a2dc57103878d10870cf719b55dfb371dfda151a0509f2850e8b5b6a7e13c11e214e13ea3354cb5a57b4703338ee397252bad2043eeac273dac23ee8e818738465ce7f1e6dfbbe684f20641100457abefdbc0431b316cb8b876eb2f29ddf852fdb8a43f3e4fe613ebd046091b1bbcbcbf2bd5a1873654e5fdd0868a0d1135690d539a712dd7ade9db6ecd371b50e731df48dce3849eb4a6b639c1dd2f70b719e185e6b5596b7fe61f77f771f7235e194e92502934e79344e2c489919322274d9c307142e4648913254e92381972e2c4c8c8a8c8a88911132322a325464a8c92180d193929322a2a2a6a52c4a488a868499192a2244543454e9a1835296ad2a4099326444d963451d2244993a1264e9818312962d284091326444c963051c224099321264e888c888a889a10312122225a42a4842809d110919325464b8a963459c26409d192254b942c49b26468891325464a8a943451c244099192254a942849a2644889932446498a923449c2240951922549942449926428899321a3a1a2a126434c868886960c29194a323434441ba21a7a7717e2a10b059d47dc798536aef6199360dc5d03f0cb0d90cf8d0f0994043a02a54037403723504a2975f70cdcdd88bb17717790c7354461ae9c1908c29606b27077201eb69698cd28ec066836a3b05d7b93d29bd9cfbed96ca674d7def4995158f9a6ad355da34489c2a3ff46ee8aebe1095b3b2a0a74e408dd95962f45da5b732d2777582bc8dda9872d1da7daee9346a9b67fdbfb64d2e19cf151c83ac37d1cbb70779787ac07b072f01f0a050a4de243ff34eb149dfdc54d335ae9c574f6e393ab59774f18ec62bb735966b47cd3ac240cee3e86e01cac9355bafff8e4b735bbef974b9bfc30b42c0270f72e1e8273b8cd82977bf9b88c6b66c5d1a4a52c45ee2ee4ee50dcdd030fc1289d474de6ea641c0a2a2d0edafa62d2dd7b90b9923966b3471847913966a424c9eb7ae4ee3cdccd7a6eb296bfc9cf51296d6bb349b76dbb8f45933976b39df82a6ddcb47192ed5ad3d61cb5db399cd2cdb2317eda5f65dfdfdaea8bc9bbe4ee629871ce4a9ff1862a7fe7ce9c3192fea9fa584a6bd6a9bb9431951ac6d9e97e95ecee501eae80e83cd2acb933a65577dfe1ee3a3cc7dd71dcfdc693c1ddb778f899e177fb16e0ee14a6cb7b621aad61ba4f4cf196e93c0e8d49c62441faf78e26b4448911f94e68a513274a9a90e42709c26172a49db76d6dbbbcb5b57d16c2b65cc951a84a89a02d4ee871f82644a340a1fe7a1955e0e1477d5b33a7e96cd7d98e879e09dccd1a840f0fbd27dcbd87871e0f1e25bfbed6dd75dc5963bcadf358629c10f953a1e7c191bb5be0a107e4eef74d0a853e8d96e6896f9afe506d7d28d597d7d29fc2b8cfb25cd56977b771ff4a77ffe1a107ea3c6e5cade5ee9e679cf3d35b69f9379ffb33bdd8eebaefe3decce12cddb6e64d6dd7ee5d7119d768fd5aee3ec443a77277d1439fc1dd75d8ace59fc274b72d597395d479247f4aa6ab5988cc5a88c4a6598576b9669a35dd9db502ddfde3c0cc17073840151b1f6890f8410004c63875c08aa89a0488d0c831957c784060e4050fdd6b8cc3061134992a006163d4f35380245ef000b2c2b8cae924231c843983c20faf0a00a98a02c7d15455c57c05c48c0d38384467bcfc4b013473c6a3291085600d2b72de3e622c1ac63525c5a25e071e134355d5b3955a3d521db4284b0a4b6b4bb5a817fb5c3ddb8bd9ec10426506779c1d3478d4eb99c1a3cef3ad78563c5b8a45bd954dec6bf56c2f06ae89b1c01e2a7c7bb1af870a6f35021c213492080defcc19907ed4e3317306ec49420c07522b2ac6d174c159519c55cf151c5f8959992f332798e07df403bd038020084a7dd4061c33f55156cf5e51d62ae6d1970be49162f5881913b3e9916a51d69415eba32fa957cf981808ae562b70058220b85a510ff43ceaac2270dcf3bc559817b5b1a1ceca1ba4ada98fb6280be411f32326f5f578cce31163c58bbdc4ac3cda23664cccd52305d28fb65a3d62563129a71ea3ae7365471538424000234408e9f5c011a265b5e3078f7a3d3e780a30b3a26652203a62d13154ad332dea3a5bfc8845cb90a9aa02573cad9e174f1488b3c307779ccfd3f1c0a945573cad568be2b8ce961665f5ac7870583a4e2e123ebaead2a2df9702092dea1d7d2e176db97a52c869b5563c600a24b0a87704521c9c1565f18c2173c43a5af5a4907304d2291f4bc989453d58d1564f0aded18e35472cb0a70aef49c13bfa7aaaf04a687d200e38ab2216d107429042c1a1be2ad2e1f9705639383cded1475f3d551ff5e88bc78f7272a88deb06a4371ffdcc8034877a3c24d850efb3d1a17e94c343a6aaaa8a27050e8e56f486c7cc19ef684553e0e008a4ae23440b487568d4ea0887474787dee0d033ded10df5e88bc74c0ec5f17848b8a19e8d4749c0a15f4ec8a323848a8bb6a45c3d43ec3edaea1962b7a21cbccce0d033d48c0e4d811edd504fa7a76a453deaf59859d19b9e2a3329d0231dbad2f940878784125614a7a76a4575b4e844ade877c363c373c63bb2a1383c6652e0e00887e27c3c3a2b1d25215a40aa433f58d11cfae23163d385cc914e0f0994841b4a020eebc686278524c470106b51ef88888d508caf89b57aa486d87d74889d102d20fd68d48a7af4e5b4a274f5b5a4c0214a23fca84789ca086d70848000867aaf55d19831257c74454bf02848c72411e5a22d3ac6cc197a14654359b48417bda13e26057ac4ea1953428bdef49ca1472b6ad353c2ab87455d3d25b43ccaea29d3f26e06aa8858c3c31a1b5060460df0f33ed002de1c4f78ab700e1318f17e2001fe00636172629f8ff7792b2f470e325e46af550370d05cc941220e35719cc1c6cf8e385a8863863872880388389088e309c7f158211c73b88ee741ab1d8671a461f580ab1c560e1c5a787050c08343031e1c6378dee781ac9507470e7000010712703c010715703000fc5a28a0f15eafd70f9082a0d11b676220f8860dde8a7e3a5756d4a3204501e7fbc21ef405d27ae0f84794055116a0e7795e16edad413dd08d39dc308197e6042dc4da30b3a24f629ea6046956ab96c33cf6a238613eeaf2c0d8176bf57c445d84ad9694778515868c7f06d820063aac0d11ecf8d183c562adbc1ed08d1871d88f188b4533f0271e63d1230ef3d80cfee36de4f06a0388b00d247eb4f1046d638a232c26aaaaaa8e38720aea286d10c3017df5e908332616c67b85f9562c23282cb0e5020816b96898bd22dac24c122b6a26057ad4ea49e33908e6803daf2f8ad6ebd57ab53c25cf080a96b0c7aac56ab58c5a2ed7b76ad196165e822c3e1c56192008b672a07c3facb0022c232deab2f96c40b0f5d2c971b9e84b47e7f4540163383d2c0f02691530e6eab90163208e0dbde159c16c28ebd371b128c8638487d2d0c5fa7c86582c106c5110a42d90b66e22f0b2f93e9beffba80d0fd0f7b32a8aad98b810ebfbc0d647592da0cf670512f9a409d18055d8785ecf8fefb55af5f8b4284be7f54d59794e73404f07a43d3c90b27ae440f3796872c0f93e96fbc4b4cbf5ad58ac6fc5ea01f2201608aebef0c2c603592005592c10044116c862816a8a7c7c7c5e2478c3f5234c8f21b1154841230e6319b91c06d2211f209f17359263c40b968d0dcb8605d2cf676504054b0fb0e56ab568185713578b7a8cc562fde09902335005c3ca87e903af7c14a42c5087e5e2a161fcf359c57af8be8f8705027d31acbcd56a459b4cf97c5661c80611abd54b07908d19b13044b195b7c3615e0f140f5a515087c3be1ea75032107ab18fbedef83e8ac3e209c3a11378432c4a8d7846565febd3f97ac2901a617d4394d230fcc162b1a6f8a0184531f2fdb0582c168b0d13c4582c8ae5e5c35a7d3e465f8fd1e7c3a25f0fb562c4a250b084445f93152513db1ff5629f7b01c6c7a24ebf8f05ae562003beeff3becffb28a53f28b85a7dabefbb22c4f1becf410aead06a79200be4a2f5b558dff7b1be6fd5fabeaff57d9f1cacef6bb1582c568b25c4cae359ad56463cf40182e2b55a2d6aa4b55ab5807c82a8cfe7e3d35ac901ba3e10044110044190822008822005bfeffb7ad0ac84f0224aa91b3c0c7d4386b0f156dfe7f91a3455aed60742f1a0d52a8afb185d11be62af1e9607b97a7a8c7c3ee12aa4d4c8ea034d80b302f220162bc87d5854c7a31e0f088a7a7c3f2cca3a0ac3f8c45814e88302bebcd52a67f5d1950b9ee785a18a85d92b4fe7079c149c112312f33428382386f3e540f97e563a4a203562a4275c03430812690152d0e7c7eaeb6179d0e7638445874e80650804b1d547575f48519066e5a373586fe01039200c12c359812b6781617c629ed7628134e61ae2412bfa83e54d88b8cf7745e831d0d56a40f8d12ff662391112e147411e9607b128cecb49c00409a220011a17f298072420c27f5ce90b12033d88f5d9bc1810b25e37397ef4830436c45674489832622b8a839383b3001d1c34e1ab47478e8e520ece0e1d0a087758118a6115e18e4845c863678a1e3c1250410f292ca8208ad0870508087ff870203f5e41807c3150489055ec3544089121de054430b8c0631fc580877a3d3c457a3e234532300245e8c5400d32008f68f0f239f2c5c01f9f55ec85e4c7db0089c73ea00dbc20a06f0c3a40e8c5c098d0f8443824648030c9902b49e22d51f2112d71225c31216aa20993a22646454e8c604e9ec0a03c8902454a140ea4f8140e9a884d398a211d252129255151aa42c54a95252b1d2c79573ac07285094b13539626a72c9f16a7272d504f51505ba2b86c61225c75e1e241172f1e7ce0e5cb07207c01034208606421cc647546ab24ad24bfacbdad76b3b9bd85b152619630a570e6c5e19bc36272598cce5b9f7bead44d51e9765422ecbc114418330209634a20814c0955644ca83ac18432279829838299145000400a6700f0a9706605155858a105165c6821002ebc10802560782106186488410032cc20001a66a8810625c2d5006af06c1800016cf86e20000e37ac72c041871c7c071d0ab0c3c743017ae0c1871e7ef0c181f82108203c2182580d210411437811441851847784112b248ef0d89704125e6ca544125fcc975022897015f3623945433e6f091d252442228e083feac57c3e9f1f5f8f9107093124844e15108cb55820cb83be1e222342cf0b42e7eb212a22043d26dcf38cf08ef090f092f09af098f868921a38fe799fe7b570c6f3bcef5b83873572f82e80e31f0e0f26741a6081173b40b0461b62190b66f011f3346a8c50b3001e70887e48a3c61b3e9e6d0905c230ce819847b178e1feada07c3e1e1aa02120cf89ce84de43c641f0cbf11ea0c762008ee779dff7b97b40e0e0b80750f0267f8ad69f9bae5660b028baa3d1f2f77dfd39f7d98792368737adf4feebf6d3a8edda5cae32d1716b6bd299942828331cce358afbdba6da34edd6f42f7e1cd6f47525e9b574eb334c0d07d9e8c6970a1fd1719731ee7141d7d2b7e56a562ed8897e356bd7d2d75697ffb63149f712cdf46934ffd45ffa19d73eff6d97b7d27b526d29eeb78529456569a263f925d574a4589b95026dfd369b44c7dcecf7493ed5cfe88e46f743d1b17cad9fc439476dd73e8dfe6c4bf1d64774aee27c68ddb5a49a8efaf1a63a579980f2dff6dbf0a6fbcc99f547ffded1e8b52399716de3283a262de56a9ea4ddb9e668bd96ee7b6292acd434cf1afd5b147d5c6d223f07f5ba7e26ef128ed2e57f1395128e7a1c46dae6596b9f7471d3be2746aafd13ceffc1c54da6a5629a158965dd1d8b874dd870f7809cb9e97a7b7d52bc29fd1237a13005d3665398a64c99e264cad0142153804cf9e1394c7f32f0a1302a447f32a01428030acb610a9401f5a1140644c17cf912931c8c117290c58f4f95c1a8b62deac98baf0c06d3175b2dfb8c492d2b7feb33ef7bca7027ce5e8b334ffd7947deb7e5c7bd6cbfde16473bb5145969a6596b325b5050d0eb7acbc9ec364f9c4c26cb057d142ca25c41f1a67f96b4527a4f4a0d308002a8a1608a7c09a354b9e3bb7b29ba7b29d9a6fa1b46c1e2ee3f40bb97f259dd70d3d5ca0d06236dfefbb6fc657d2bdaeabf5f85fc1cd49317375d6c757e2e545152e4df90b4bb7ff1d06805771f8f9268ad96a5fc8cb73e738e7eaef4a7bcd527ffbd16484bd5cf694c5e4c526d6f9bfe131393fe9bae56e8f8e3f3b72d82d574dfcff944a2e3c6f8893e3131d1ad7f572cb4525d6f95eef24f298d74eba7d1bfedfcdaca68f9a59dbab6dec86be9d37de4e6bf45651c6eb4a3c6fdb61953fd53f5d26ba9ae375ac3389bb8aaadac56dfa465593fef5e4af6b65b6f24cee69c2cd737495892bbfff01006e44e6174574af1a6bb975aade1c4012ec3597cca82aeadfb9e1817f4a6547e5cc6e1642b94c18510c5c3221e34ce2f02b55dbb332fa6657d93e24df5b634baef5bd2d66aa7a6e5ef9abd69af8bbb971e36190a8baa0c2d094109bdf5b6a9d66fee6ea5fa71b9ea13dba9cf4ebb3e6de7fa379d475a509322dc71145f8a420e6348795cbd34474f283a8fe49231c9b82488fc1293413f65779db2f94b99aea65965baca6ee4ae34d99319d77010ce864cc6b853d89798a46fd2ea8dac9fef49cbcfbfef5398596ffe7dad69da9a7e5bcdc972f56fb2fd5a4b917f2365fbc45f6272bfa6b2b5cf3999695aa97d7fea65b76d7532a9ec01c0ddab42a14c0aee1e0965aaaacca040c68cbb37a68cbb7782bb47668c092578644a70f748f0c6d8b48a0cb183851934eeee1d8800cb147fd99866452a2de692df342bd2b5369bb3ecfb534a2f55b7be5bb6ae26762a5fead6276d62ec84c34d17db8d999ebcd59a666c6b6bfeb6b72eb66b37e662a72e4692ca15f74fb5bc9fbff64fa5696f4836cbf43647fdae1b6a6b8b25ffc6a7187bb76cd356d9e5df1b63c93826ad73364abfddf7c44736abdf5671f6b3537ef32cff4642d9b8fcd36ebf2531d46ee7ac49e5a74c8ca4f55f1c2e6f7d322b6933deda5ad14fdeafd5b2ecf24f6152dba4ddb67fad79b3e096707942e94dd6bc2f46dae553d7cf513557de9aab3c0df74cfa7f6f8bc361a41bf951a625ef89917664cd24c67d92dde6c94415b55febd8be8fdb55a728ad9fb4e55dcad99bcef8b6cf580e57b7a6d5a3ddb6a6dd5ba05aee1e0b74f756eedee7ee9ebbb7668e14b83b0ae658b366cd9a356bd6ac51e3811d41d07490f3317a18a2e6cb1743fec5131e8a5c98809167c1030748d8a20a0f9c8a2b2e807326e70c6f22072a649600c37d882132f8788115ba0e4faab0010d32ee0250535ac00010b0e22c2469428a32f3e0279c004a04d504463e8213aa31608059c0b59a2b72222079c271162c6dc1ba800baffd60860d178dfa4c86a812c86069c13fe04009ba0000f9866f21a10d1548f0a83be5a4e87abcb8c2af2ce14060e072e15598406181230120e1484e85788c0039073750a0044172e44f9caa8457c4c086177571802a3868428d139da06404272035e0496c38a091a901f27184391e20440a667c032a5e90522543e93f1a4041e29e1eae0102e698a3042430c28d5c1eab2f4178c07ba86c81238384294ea704e141024202fc020fc439c2a8220a1fd2c2075cfe00250fc281344e24b1011138102a1ec482a478c07d3c008c27b528a15b30fb3e1d01c2f00a74c24c816abe701e5d5c4089129070f8ce0f3e2230fb32858b2a8469962815e021990330a143180df88e146e74745140e83a70a0330001c305ae630510358cbcc0798e1a45e028536081aa1c243b6f728348154e0e618e38be38c36f1ca0c119392d3e54ddf400f5883aaa729b33150880074b44f8eb0d165a0841115ff82ba705193d607155b94810a2f000244bd0b8a83ee019c00808d0b85c5ef870ca41cd94960e26151376e4d0b49c3cd933709929ac0d14e172058f31ce3a018513725ab8d0b0848c24d1c1ce195560184dc810430b4f54813588a1c38e1826d0805a2e0f4e4a48e26068010d60304064ca8a0238802047192e61ac6c6040991fb43853b5a26db9917a5a4357421828e9e18703f44b811a2c3ab88d876f0237a87066800c0f9f106c48e0cc000c345f095ec430c48c32fcf3a2230401d040c1ec6392c20f09b373f6f5f8f184c36ecd14cf04407851c314aaf23090e3816c2799e24d41b48117b10d26bc1ebc0f5c5314a8f2ce7c30479014270c79627e7cd08d71a5cafbd265ca122c47428f8a042cf000a80683b784840278f174c6cce3712ae10c1a95175ed8442a031c68000f9e636004cc8d4995ab910304264dc8aa7c0c2a940082891639ff620b0c0930a2829167214512d59305d4a9d800174e78651879134d883184a7a5ca87180241075128e0e43a3479000910350b9fe1234de004151f67e18887324cdcc08497711d893064051e7c042b535ea43ce1e33a056084b89d271c572400739041430e5e63c283924106239fedc0438d15de08fd83333c2a2a6aa2f02d67beac41abf0c29d44708df0050b16f02b5130a9c1880788bc8a94595e8304261ce9450501243471c63910cdc05de08a0e7fd2a584264c200081177d41c68925e220c389ced470e4869b1c3c096e07270b8ce1858f2600f1443411c2375880181d3cd57082ff6c808010c4f18305ae01154e5c51039a13dc4836c1cc65c108efe9c00d0fa080c790d3a4d66e882e0bbfe00b03dc2813a5880f81010423527c013d481844620fe8d1c0812c4981104769ba0f2d1ae04511111db78096002f661b08f10a76c4c143842058701e13e08085a33796f84e1020284981dd719105256bbc1a21f0d0040490b141d7c37700600425eca0a1e33a7230233785180db88e021c608610379e3c670d288268c30584e76c500230644fe538ba015356d834f11b2ca6b2448004a5df14b111b1c11983dba83087084a700002fe82c30711e05c89c25f622680a68808d6b88b0d170604504214eeda6df1441ab013b8eb75844d50ad89b776805541f24410de82f58862c464c7591bc8c0136b5838c1596592fc80033480b384b0c0608ae6c241319676590c2b1c1c404e052b601839a8a50d204168910107431a84a4b921f45505766e5d2c5184af08a0040514e078e02b9a15b80700b1c65742277c51f2a307ffd630d930841948f8370136b42461060eff8650b23519f1c23f3217541942c60dfe79e172850f4e49f8c7448b36c41cac7f3dbce814c1f1807b2610634a097e28710f034a413ca00136f7a6085341014258e25e0f443d7007d8c1bd332b40a14651927b62b8ac50822139ee7d31c104213ca8dca3e20606d248d9b9b7e407d7132ad8dce3d14ca0f161cabdb08b0a42ca18c33d9782c50c104bdc49f00309317a38701f230d921305d871ff029b2957f0e29ec5049608634607ee54b08145911cda706fe20164f0e8c47d0825286e7c2b771d685ef8a2729fa1c72b19e1e1ce02540c60b2acdccbf85072021408e13e4297d3070514e1be73e4b0dd10c51d37f40517ae22dc6b54907152821ddc674558808b5c18f70f4a108ad0e4343194c6b9a66fe6ee4e1e1e4912439f949f4f9bad5d4c525ae94fd51bd594d58618fe73f34aa0e1f6e4062ddc2b4107a327554adcbc12361005ec880b508fcc4f1a2713f821c22303001b8ce038c0cd2333471646432870c6ab72c1a9484a4f149e09517e349931208d77828f344cc8a489c22bc34345c4030ad47866ac0d4bd07031f25090438d1230aca01e00cea049d6fcf0f25688319184522b9e0b47c218e240c9140f06285e42217441e3d1b0c3692c41270bef865a55900eb8303c1ed8b00244c5088c3c22e60863030ee8f0c273228d131239a060f0ac20c11b4882e03cf022a0059a1f27ba2a0f8c149ce1e3010f67786e6c21e288ce89303eb10a2b1ad470459a6fc9076832388006a2f840a02167c4026fdcbe17901051c4043aac7c1170322bc2834e5901f142448f122546ab290578c1a305ca6c8506541a9aa372063cc930c2e0052726583d51682e50e28334ac36c4f048a09aa2777fe562abf543d9f2ac17e3ecd32aedd66cb35d2b75f34fe12af96bfad61c7571d3eec6a4aed5f76fe4b6529fdb45eda87076fa421f23ee9ee3ee373e3d7c42164280c14f664139c2dd3d0f244001267e80f1450ceefe79c93d1df1458f352570f78f081f8a70e231451645eeee0dc101047a7a9082e2e6ee1e07327cc902830a3a50e1ee1e0356642ad0810544b8b9fb0780223d0af0810cb4d8c2dd3d032841731d2a84f0e1eeab3646108213483880002370f70f8b120765b070848513b8fbaa8217bc50630036504101776fdd40c31b9e05602998e2ee1e196dc430668e017ca0c8dd411c662e02dcb6080386fb97f8067d89afbbbb77640677271281f727376871b331ce3a8f34a12ff115ba96e6ee42a8c119552fafaaca84aa9b2af7aa2affaa7c55e52a54390b2cb8dfb88dbb9f715fa1ca6daaaa4ca8aa62a1cabdaa6a85aa133c03203cf0bcd048933baedda52f6bb6e5b66c5db1d86def9208d6acd75251da99b95c4cd79b53d4932ca71f57ef266b0e87916030f24b4c4e2959724a91e5cf51559c14894d5a36ebc65b4655715415475a7d6dde542f7b5d6952942c39a1e477a2aa387ca3703d61f23b69184c8ac4e69194f273399bb786e174d541c9e2218f936ff273c624ddf86a4a6b96526de9dfa2e893992c63d9acfc9bb6d7d668fed2b4e791cea3de16674ddc6fbd73f79e7c6bec846b776997f1aee5ad4c66cd9fcb62565cc64de5ae3ae9f7829b16e0ee57dc1decc06d75531b8662d179dcd7e2dc9271282809f9608ce813a3f38b14287a579dfe6b32bdab39adab89742377cd699ba47535c92efb66b3afabc2dd3ff010031a4c7bd2928c49462541b8766dd09b95d4d766b5beedeaa4f36856b382e0e105398ce37864bf09b4eb671bddb8898e9a9ab59a27695692deb6d551dbb5e53de9e74abf0bccfca9376555df9a374ce7f1a6ebeda6eb8dc81bee3be39ba618ef9bae370a7b9d7fea33752f7f2abffea7ff4c85d4160783e9fb5278c3605a9fbb6ea8276f35ebd1c556e7e702e5ee4b56623c5eb9b4df34ab130e43fdc54d51ee4ea99090d0ef9ab7a69d5a88bc3b1d94cb5517b4ffbea5e1b008414c868476dbe69a2bffa6ebed9e30d8ce38973bb5ec7135d7de5633de1a067b9cddf7cce1101e9cee4a7fd7ada9bb2be94479380448e7b1bcbfa9fe89bb87e0a1102afcb7fe2bcbbfad0c87734d467e4e0b913f25b4847c1a49d6222325342743b4a2225a7d2323263f4454abfdd00f91b526444e6aff4542e4d6671612c283bbc7dc5d5f6c37f9a692c6b926779fc241fed24ee1ec54774d72f72858e8f772f7206b0441836ac8c756a39a624a58b264397a52aaa214d5b4b47454a569e9290a8a4629452165c182654bd393d21295a5a826a5a4251a85a4d4c151162c31a5a724a5a8d89312d3962625232a515b94909a94b66851828a5282226d7edcd9e4c424b6f4381b8514b5e57136aa7c11ac59f3dfaff226cd6acbc5766dde504e4c47417ab8fb17da9465292a86b484c5c92906e40cf72f146989ca12929213545094074a514d59908044e08af23779e69fb2dbe26cce012102481021901cdcfdc78782f94295a2625c969e9c1e67a37ed7242af74dd97d53f6bfdfcce1307997cc4ada8b6f252f6e622a6d16772f2a2d2e6d16dbb5f9cb9c653f5496fc5359f297f59fbec44cb61af534dcd964ab51eedee4dd9dc9ef1dedeaf095ba5b6c35ca76edb515f7d9dd85ca2f31f965ddd5dd898c6a7b8bbb8fb6baff342b17775f72b1dd56e39cbb2b49e2eee5b5523f427717bab8c9ddc7a0c761285f4d0940081b511039c8c5b54309a50deec2401537ac983272af0cbe19c0121470971b3c2c8d300a59e36b44e0ac1a58285aa2c600f7a810d70ea008ff704f96e860e7e3ac1a560d58a20113677d6044d20898a8fb8f0b090b1b487197e2428b2d6a80e15e03c8c0e044cb8cbb801c81450f736471d0660133c81630e5ae14b280018438d6784b0b4e8d92c51a7757fd36151ef817022b63970a38714781115560a6a4c1a24dba18038a35ee728205c90394299c65860f330fcd8f7b44f83ca9e056e12b262d7878a1fac1bf29381d1c805be32dddc203a6ec74be9240129a55d593af9c9ca6907440046fe13083064e90c08b7f5128b102ce41c45d28d0204415961ddcb546083954913373ff2288395ef8a183b7841ce940070f4c38d0b559b3be0856ef13ef2a160ec29dedaea66ae62e9ccb4107a378eee2c12b59a2e7f21d1ecb024f87f7520216f96a06f002d7f77ab1c095e7b98f6ff4cf3d2d20079ebb9eb07c47cb73cff3582ca20fe773cff3569f15cf73799fe7ad5a227cdee7b93e0b9e3cafe5b9fcf374c6d5d76af9dc500ffc3e10060ff4bcefc66be3f36c9ce581dfea3d2fcce779df6bcb27e4f3be16f87921f83caff5795a3c1f9eb7fa5e0d60ad5c3a3c0b3caf82d7cad3c1fbbcd6e779df4ae67de08d0dd197e34979792c23ab289eebfbc024ab9beff37e7634f1460093e05059397d0efa178407ae7c40d6e7ad9c45833786e79f8761e89e7ba0f7796a78af0f89e77dacef5b79de124fc87b7939dff77d2d24efc8f7819f37b41a7180bc34f07476827c03f0581f100ff4569e7f4e1fbdf140ff6ccbe9cc7361e53c0df07c0a16dfca6b79a0cbd3f156367cdf0bb6f28c56def781f4cbb1f1f1589ee71a02936030e47d37add7e7f23c98f77d1b58b53c9b0f5c4d793ddfe979ab20cf06e7f35e2eef9bf25df05df01159f9cabd1d5eebfb3c1d305c811f90effbbc9607d63c1b231e0eebf3589e8e2221df920bc7e6f368af1cd7e769f15e9eb7fa3cd0b3e211f99c7c433e9ccff5b1bc95f7791fcee702bd156be50543421f3a3a3d425146868bb212b8285be3e26c878bb31f2ece885c9c39b9389bb938d3b9380b808bb302b83863c2c5191a1767127071c60117676a5c9ca5c0c56a818bb5888b55898b758a8bf58a8bb58b8b9574b16a176b0a2ed6195cac44b8589970b1a2213244489070274890ef0499e23b41b804a9b9fbcb46c78d8e17d0452f392e7af9e1a297222e7a0172d10bcc452f4a2e7a6972d18b072e7aa9b9e885ca452f29b8e8e50517bd10c0452f45b8e8050acfd90152e53b4074be03a405df013283ef00e9c1778024e1ee3a383b3b7038e3210e34788803101ee280000f7170000e5e7888431a0f7108818739b88739ec789843110f7320f230072477b7e0a54347c7cd6b473cc377c414f8ce8e10dfd929e23b3b3fbeb353e43b3b567c67678befecd07c67e7face4e09beb3d382efece0e03b3b41f8cece12beb32385efec2cc077762010eee84143141ed2e0000f69c88087348ce1210d6b7848031c1ed6c0f2b0061e1ed650c4c31a843cace1098e0d8f9d1c23dfc9a9e23b394fbe93637d2727fb4e8e19dfc91980efe420b1c3fdc78d0e1e54f4e10a226a4972510b948b5a4c17b59871518b005cd4a2838b5a9a70518b025cd4420117b594e1a296375c7ceae1e213918b4f4a2e3e7171f1e9baf884828b4f33b8f834848b4f50b8f874858b4f5db8f8f4858b4f1e70f129042e42b180fca88085325c64210e175bd871b105212eb630e4ee366278d3bac9e942878b5dfc70b18b222e7641e46217555ceca28b8b5d8071b10b9b8b5d8871b18b115cece28c8b5d04c0c52e04e062173ab8d8c5102e76f1848b5d38c0dd71c257053b3b3a628e4e8886150fd180f2100dd24334b68768a0e0211a347888c60e1ea2818487683ce1211a5a788806181ea231020fd158e3611a403c4c63030fd328f2308d240fd370f2308d99876988f1300d321ea6c1828769d8e0611a41789846123737e08e1cf10411b87842095c3c01052e9671b95886878b658ab85826c8c532442e963172b10c928b659e5c2c535d2c835d2ca373b14c1917cbb4e0621902b858c687968f17a8f0f0050778f8c2161ebe90c6c317d670771d3d6e76585e7c8765f31d96f61d16007c872583efb076f01d16112f177a78e802110f5df0f1d085200f5d60e212b7b8e2e216d5c52d762e6e11838b5bd8e0e21641b8b845133a3737ad1c7104352e8e00878b633e17c7ec70718c0f17c7f0b83806c8c5314d5c1c93e4e2982617c740b938c68b8b63662e8e315d1c73bae3d8bc76a060e03b5090f80e1426be0325e63b503af01d285b7c070a18df81f2ee9ec3c383c4a07818b3e261ac8b87b1301ec600e061ac079b1cb101402e3680898b0d90e26203aab8d8002d2e36008cbbbf5eee363a44295070510a175c9462002e4a510017a510c245299670518a2a5c94620b77efe13f2a403dac00918715e8c0c30ad05e2b8400063a81266a8490a8d2dc3059c08f9a963339f8f0717777cd016483bbfb8e009039e3ee3e840511d2ac59f317ffd7644a5e15544c910029bc6789300ad77934cd271100841705029e78e2092928b2701b28c078d0dbbc83b874a1a3edce92b22c3d2939c994aac49eb24441c9a2b06c8951514a82c1727a0645df56a5ee792369f974dcd12815a48d9bcad7fdfda7ba6bd2efba93cadfb8a98673c58271d4a6fa7d3152598f5c8c15039c711f67abf9960bd25e020c50827b5036cd7a84136fb048276208aa4eff547070e215549af646864d04e167d0d6b5f6fba4d9bc77accab479e8ee3226d494f8dec0040c486552f91b731162d49a56690d676ca7eaed69f4379eda3a67fe6dfcd9d17cca5c6b146baae968bb16db2ea6e34dd75b8c8eb7df980bc6517a772b1314b08912403ce58b60931841120a4802091f7f7ce88f0fd57d936f20092cf507210f930091c000121170172a4205891328d535a764c9d2eb5a0ddb5e23f1b27da6478441614fd69c3ec201eef4c17ca1528228982ff4733bbce9085ccd1141c4d027f74d992c4a141a8587de376532234e30a274f73781a8b6541bf1b9eb46fd9a6a7be2923eade633661bffbea675679a95ea53dfbfaff18da4f9c45ee8a8f5b96baeb95c4582a4eafe888e9a8a036d8b10f1fa4244263384156f8c33caef04429c719caeba7de456a41b1d6d9646f1aeb67c1cce527de44d5a8dca475493d8bc5f969696718d6a4bafc566ad7c3deafcfb7135d71cdddd8ad35b6c43667dadaf7d7dca64667d0dd31ac774e44869beadd1bf6d5cc6356d561a366db47c6d29dd991796c3597a71d67d6eb7ebc5b7f699ea2bdd6133f7a5ae369dc7cf35f7390783e9f0b087325f62a4f16963a67f23a9e829e69f70ed2ee174d5c1606f9e2566c2e9dac5490b1e8c0c50001378a9c10ca7ae9fb7b7410188dc33093b5c2067964a36ab754f5599469df1262b95aa6449794f9a3f77a464c9eea5663f3f148802f9f8d4f006944867d6b2acf4568ac9f29bb45963b849f754308eca5fe62cb52cfbcca2df66bceb52fef23e958d9b1e67a374180bc6510b88000e2f57c2d96a22c51e57c93f0af34fbba5376d0d0349e58abb91f78fe898df29a9ee9a34669cb33b7fee5a264a55cdaa318e665cabb4fc769c5d3ba3aa4c33fd3a6ce6cfe54e6a566cbf466d75df27f3e7e8ae4ed726e56878d35dae96b4b5bf4fc3367f8eeeaa3992d534fff6b7a829c6f2cbdfd18d6f4977369374fcb2e234dd35d1ec74972ed6f59fee16a47f7a2a4e4e9fcf5d719f9d76d54ae9706c9a066848a26599818c7a8ae12242d10c4453ae8305dcbd04016cffa41040e841210313ee3a94e18cbb8fe6b87ba90de8ac5cfa2b33fab7dd4b5d1dae7a26bb78762373fd6bf5a92dad371d2d77eea57e4aef5e4a1fd15d5e53dbadb79bdda4c5e18bc937f3974bbfab25b1d631dcb4fb2b7af75770d391f085ecb69b6f32a7e285efbe08f83315aa2fef520070eeeec2085c9861bc27ce9d52189bf46f51b18d9bf25f5d968d9b5e6fb94b1b37edfbb7e2f23bf5f0705a00c2dd6b184f27ca9701c0177a9f4f28d3ac485a7f2ecb98cbe1b3f37d2e2fa80a095fc28211cf8a15b058817a73783f4c48e107ef042e0498c0a4822f881745dc9dc943326276e009cfa8f11d15ceb91d6766d079a491e0eebbbf62cbb12b4e001881cee3eea58478f67ddcc50e819cced92d02a0072e4fed1545e1a6b5091d200510dc69d50be241e122582d82d594fe94dd41543b482827a3da55a6fbfb39056688c0e9aa23c778688647ccc657f7170663b2b979f2b4f1cdb3c43819add63ee746f2a97eeabe8c6a07bd2dd71b12aedd258d9d6edb76c93867a5ac24954529eae97fe3a9d2c432b36a5bca64af710ee7dc3d339695b9eaea2edb1cd5cb76b2d28410689bd54964b25c95e92a339fbc95a495517e69a768eefec3dde570f72cee1dc0ddbdf2e9cebc5d4ba38672756b9cddbb97ca670e67ab49fee75afeda8bf09f6bdae284486d7125249570848434db0b220c770aa871b754ee4454b80709c15d47c8033d9c2f4410a3830d170fc7784182061437e93c925fe26bf3f642afc7aec434fd4487cda751d9b57a6b6c45ffb53b87fb6b83e89fd7ee8b49fa64b773b820bacbfb3ecd616cd28bddc930c3dd87689428b403236cd179cc7fef99938c433058fefd391725ca58335fbb7b30fc7801f40260d2ea3e71ee9e0b345a4b0884225819afcd591d9a703747a5b82a76402cb14b9231fdfc53621c257d28addc36eb38e04e3ca4327f9f544b5419bc08f65a9c2e8cddb6a6d54de1ee473cd4cd4033aee9a0cf3937743aa478380543fe6b71e114964c472ae114f8fbcce130199e599c30c0f699dbe76ddbf0c41285d2b1fc6c4f3164a5b5b367cf41cb3769f53ea53b8c4dc5487321ec5b19f43947a376583fb35208676148c9994217a1612029108549a114262b479ba5e9253da4fc325752db9202510e804c327320cc298cb66b6fba9a9a0295f7c435aaf3088389a180bb0f7928c6875dcde69fa278973785c9caf277ae1bca842abf0c736ae8d717e7f4677a6d7e27aaca14f526ad72b15daaca346afa5275eff6b5414f5e0ca4f7f91b4f51dbddbba0fc4e6599abee88eaa7af51f356fb7c5e5b6d957ea678c360b32ff4fe943e546f186cf685d69668d55495a96add5fa02cbabf663dc53ccd585baaef53d9d6274e464fbc3be98977b4b644476db505ba4b74d457874baa3759f359526d6fa5c553555345e5bf96e969d44772b8dffb75ae9a4f3513ba757db33e0e88c99b395ca5aa7f8b2a4d7cd39f6f514723544ffebd9fd64375bdb6f6e514ce395c7d5d6f495f947136a3d54ed1fd1a898e6fd2acae5f2be9d36cddfbc891fc37f235dd996625ed2d57b30defdc2e93b4ee23f7c926bf56ab3463bac9cfe19b5f9f41789f95de5cc5ed5e0af61b5f4a85755174bcf8a4b66bdfb4371d9de959141df5dd42c75d29ce34cb5bc35f31b9ab398a3f1f79dd6f7b8ad15074ac7457d376ada6f5efec5a3a9b7d9efd0001f9cc806274fcfcb7b2fed677898e3a6c6a9bab4c3aff14a6dbeeaae9cecce1acde96026d5d73f4c97e4dcbaf541fd9f5b681663f3ef7cd71465f9ffb48173a0e01dd2c74dcf5c949abb634f7a4b65d8bc39b3e8de24df5e53df1d3ec0bd5968299cdbee89d79b3bc2dd75d7eb6fa934cb392b4bc95a4e3c5b9f3fc530c05ca1848cf28ae7ede3a77d25be9aeff64263f3f8eb45be36babb6a4362013e34d6b65d097e6597b7de65fa23b3357a52eb68bb354fd2e9f9d4cf3a4f2e79f5a9276d569e37b2b92d67fb7ed72234f268ca3a06a56b25d9cbb986645d2911bdf74ae5e28dbb55a5b268ba39de5ebb069c6366e32cd4a6586048ed27d9502c0c26cc954107931ed6ec9556762ec443ba1f643e5306eca65d16fe2271363a7fcf72e99183b955fe6aafba7ff4ca5bcf82848489b18e7645756c4dd7375e3ab7154b9a4dfc64c249d5faa6e285db352b984a3cad7b5cf4eba66a55a96adef92be18a966a5bb74d3d584cab896e5499b9d70bf9732a6a243305f5c6b96f54b0a547ea61bd3fc5219ebb014894da120770ff2108c096688decf61301f086c80c001770aabbb96753f8e0251204f05af052077cf04ad71eeca721aea6302fb86dcdd8b8720d8b8eb208d735748ef70b833a944dafd95fdfa9f742e577550faa9fcb2fc1975cd5220f2b9d0f281cafad98c6ddca4f56fcc0587f7ad3727d94fe92a1ba01ce10708f88008779fe2432fb696eed8aec4347acf1a0dbab8c9abc20f2c70f29e3526e3505090c5e9aafbf1d9ed1cee65da8e5264dde3a62af5e36a9396959fe57118aac4b88a69c6ca9fb24ffe53e885ee6836363637e5d32ff46f5136363637509cb68c5a9b39a08c6bdb6aac6b19db9c8b518fc9582bd578974b5c6652a432d6ed6f2abfbc273e82f2a7989acb923f97abb9cb8ce27ddb676c46cb5bebeb2850c654e858e9eb59fe5d8bcd3e9f24599fa65fe3dba6ba52a0197eda54df34fb5d7176eba75a7fb6e19cab74bf8de24d4d5b6bb4a4ed72d5fac98d2fcdbfab49ffb6819e3c4b9c73b6ea28ad5fdad22c4b8bdb9937db896ba7d5f47537b2daaebdd7da3e46475aded7146f2a85a93eb22dbd91f6a6a3f9776df757ac94bf2b69cddc9984e361d400a27451d89dc27c288551dbb54f140c857d110a1acb2fff2f7d1add55dcd66798b2d2181defeea5e8678cd3b66b6fae5dbec44d4bb67a0475a604a81c42dda066545bdd5f0a446d9546f1be96525a3e982f3487180aa0868271f75a70f758f054f0ce3ccde1ee545b2cda568fe8135ba595b6746f044f51dc7d2c5f0c1d6d954677556756baf589bb3f656d5b5baaff12d37490b6559ab6260cb6b53565da5669b2500b07dcb4b5b4f8a6a395da2e696dd8a4ee4ee5a11610f49f5adb1bf99beefababe99a34fee3fedf33965f5fdda97b4326182d5d21264ccb852a730ac1494131a77ff1a7d6262ca389c530e7ed3678e3e313189c185061e308ef93535eb7971497514e3306ed76ca92dd04c8ad109857c2e359cb1a69feb0e67b159ebef9a1f775e253a6e6c6afa38bb6979ad548c8e7a679cfbbc7b29aacb8cc9cf949626bee593ee72c5d99cb35d6bd66a1836654f310f7b5aa555006480bb931e4a796ac279c8e484dbd8d8dc8c363636373f423a484893b80cbab6e284b01d474de2524808a6737bdf7cc0e82f1487b73e916c6c6c6e64b251976f9a1569772b13c6519576ea5dce2c31ce44da412643132770318be2b5a23796c0506584a2260f9dc8b0883263de00983061019fa6ffbc946f9af68aee9bcadfb5cc6df9122369fd2479425dc9c07dec000519e7acb4e4610740b8fbb8a3d1a7d15b499a3f47f7ad36d729fa1723996645723262020535da4ab754c551bc69fe32637aed896995eaf095da965eaceb3fd191fc9cae26f925ddedfc399c73b467575cc6548c9868dd435633f7595b6ac4040a8a96bfebb559fde5a88fecaf426949e34be1a96be9ad24d575d712df74b5b275b6b5adbf34b10fcdfd4be128131d7127ce5255dca8b5ae340ad31ad02b7ca4175bfab7d9e7dbc6b5bb14dbf8d29aa53fa50f7d6d562a749c295972cea8b67436a3bbde36c59a96678ea263f9f773b97aa3e7d6b586e96c369b7dc61b8a8e5b63933e0d47f579db369bcd9b3e8d9aa6d5515bb31b5f8aa9feee8bc99abd7fdb74f6faa4afa3354b5f9f957c1a9dfd507d79978060b0289f19fddc6ed37adbfaf36f6bdec8fdb51ac6694b6dd74a9135efb77953fdb6fb536f5a930cda379b35a9d661d3ac54db5b141df17d129bf46d95b45bdb6b71f9f797a6190b578765b8fa5bb65fcb642fc3e5a9c5ec828725b744312110438628a614f3843940613f35a5bf335e1f10718ebb2ba1484a13e72a798af95246fe9490f65ef8bce4bc38e2fe49e02ab96f8b532a31d2d23be17e5b3a56303318ac66fe43d1516b4bf749a3d79eb65cb1e05dee44a8e498b3b129af54cd6fbb18cbb63636f8a62b6f2d1f77dad0efa269362a574ab1aeafabcddbb4b5963bf5b6f6da6de96c47abd1ad31d216b6eadd54fddb94121dcb92ea4a6b56a73f8916d1389395de1387c364d54d615aa51b5f3a96bb343fef4c2b423569f9fbcdba2b2d2fd171091de9a8848e48744c4261356c4d13933f4f5e7c295069653e375d6f96becd9b522448487bf1c617e39020a1556fa01d8dfe6d9bf55a9bb555b35631cd8a83aad5cea37de66e3bf749a65962a42f31924e2aa3f69bf6d625632afbccdd25a827d2e67094d2b5f586849b4cf3a4929431d25d2aa38ca84431d94eda27956fef273d796bdef7cf7aa352da1667b1ecfc53ff7497c6a0cf3224d76314121a4537a0982ee1ad31be91b4ac345a4fa09d69c713ef6805dae7111d3d8831c1604d929cf5f3b64d929c545b1caed666651d957c316eaba9d051ef74c6f93fd0549569e3a6376975e7f26fe4894dd36ea81d15cee52795d7e20e76a619d37d13aedc0ff5e6f9a4fba62e11e8c2c4c58d25d3ac485495699c5155a6d99b38e7cf69aaca649ab111cbd3165aa919baba6bb6d18bafc6fd97678ddedf516aa3f8a6fbdc6ee39deddff47d1cddddfae689f74f05fdc5d4acb67e50fedcb9f357f26be69969d2121285a2e2b4b4dfcbc64d3bd37cb25d5b2ad55d7395ab63e56f6db16cdca471bf97ccbcc5767f5b4dfb2ee58dedaa99d336a9c4b84a979bae56dea455bc9fcbc64db17a64bbf6fe94adb27153d393ce4f83884e1470c2c2c90ad1e9004e41884e40388d426140b4e695e194e41fbeaec99f326d4def6b6b5632eb59da29bba54cfa7878728011b35bf29e98fee2268c9f9c3c3756529e54053c046207aba52786942859a2ab4fe512d59757ebc72200bcdf5e5bde4ad3b67cf3dcf771b7caaec56176a65965bfebd49bffa4ddf8caf67d9ceca7acedb3dd52a4952acb2ad32736cfdc99497dcfb26233777e8949d3aca4aee5ef1b79e2299cade50b097959f0c690103b7811820086b20c93c8c8156478f192c6dd573a579c33775f5d40e5f396086854a102549859d02447142d2531a85a491c54dd88415e8460c498c921012bb45c85850e0cee5e1099fb1702980f0423d18a189d472128f2a764e5c3609f3129cb69a95c10ee06d5f29458850cf7efcb0b5e9a0fbc78f075f9b8b8fbce7a678854ae70779dc71c2e7285ea8b4d133b5524291263d9d6cc4195b996b76ea8df780a069371d992a4757512937444241744a4a224aaca34eeee9333faaff3efccfc5398de4a81b0366374acd5b08931d2182445d61cb575a5328e3b73df273fd37aa3d5762d05caddaac36128bc2feec4587e632ea369ebbe4f75b6625e5ff3ac690d54c33be3dbd36af8b18c6535ebcfaee17d1fb7c97a95c68a4dbcabfaa7ccd7b8bfed29bccdbdad492b7ddad20446f3d4a6b9edcfb63e7a8ae21cce4e4e331a4433a64f6633255dbb945b572c331a4461fb7158b775f97febb67fd3edcc52b7b3d570c6a4d604a81a233f7931b9b48fdc99121d69f7a4f71655ab54a540f43fd7be56f5eea528d0d7ea54141def163afef8e830962326282bb8a97cbc9f0beefc8b9b366ec24ddf943f97db62bb387779d24ea5d04b551a853d65797a52a2484b55b260d1e57d9ba938e1b5c0840c77a7957a669830e1f92032a1721f77884ca08ca5a5e9884473e0fcb9dc8fb8484445d21a221094b84844dd475bcee0640cdee2c5c50d606711387c8002359ec64712fb16a21206f82c6a466b67eee24e5d6ad3d6fd49356f2a25b39a6f052a3feed41723e576aff5934acf830ae28fa954774dc2b51b8583192949a2c3d72693ddf6cbf096555d92ffb6aaf5e364b693f6a59192244a5eaa9a34a94a922fd584891299927ad3b29baeb7276f95edd732bc652ffb8bb7a6e1f0d6e1f2b36cd7de94e96afbafc9f096ed9bcdbeae6299b632d9d5e19bae3799b6d9acaff799bbf677ddd56ed3ac3625667d9dc4acab28442053e7f149f9629ee81367b2e2e80cccd47dd99722b39b9cfe9d619f7341bb52b6db7667cc24139150e12fdb6d9b71988a93c9b6ae35b3de8cf74fe1cedfd5f6e697f7d45b5b538aac264de6791f8ffbb883e0e29137968c4a928c4341578733eda6ebcd027b3582149aaba44cf7d71b722f26664085bb5746ce4a337a8f84a399eb538ca340206ac085fb78b1d5a7495ebb6ded4247ba2bdd57d4c0080d78a074a741d5b559adc1cc5dd4c0c8dd450d76dc8dc62441e44f9966c569318359064614c8dd5b2e66e043cc20c7c81cee0e44a94a0ba39534e3702e178d84e114a6716f7ef95f9ad8caae8fcb8fcb1fa5fb262e195f9bee9e99aa32514d475cfea8f14b4caf05c2f94530cd9a7ba99adba273a76cc4fbc7a7bcf8c876edc65c46fd1b4f9176df6ab3365a77b4ba77ddd5f2e223a47147ea237f73a73e127480714675a54a546250b9f33449aaa740e5c5e443d1b1e24ead2bdd99db92f76f2533a6650efa916dfd3459c5b92d74fcd9da874add9a736790a634466177898ee5ffc65c70d3ee5626fd1b73d1612cd509476dc9475b9f4cb92d4f4875d7a4df98cbb54fe2902cc4214cb88f60be50994c1c8254fe99b740fd99a5b4d5a9441282852b45e97ded587e06434eee9b95866daef7494da1e89804a6ab619db18e3ead029d5a5bd95012ba35c6d1bd8792e0bda3d53069f7e36edbe659fe9959f5adb3fb393ca3b7da5d7310de417a2c2d3d62620c4ad9f2a76cfeb2b4d45a4b8fc44cb3e69f52a29d9afe8d02d5dc89b38ddec8aa44c7dc897395af3d0e9354dbfa64cdbafc396cea2fcf7b8e26c63d8fab3629dd436bf8cc659c4d8c73380cde26363176c251da76b1f9473bd33ca9ec6e0c1f4969fbb471d3c64db66b77386ffd49394bdeb8e97e2ecbc64d5a5355a6b7dd7a2bd24f552b1b37e9c7494a493b53eb37f33b55bb7375422abf2c632355652233fe146e5756243a8e74e3a6b734729ce9f09dcd92d00da89e0599f54baa93222b8db630eaba504d9d5edf6cd60ac651e597a749be49de2d4f92a73e731aa8fcfc3977d7f1c8f880eb74eeaee4ee11f1395ac3f4f5e7b28cd9ae2d317995caa5fcef4413738c728af889ffe29c9576db9af5d4a2c3587ed7a412e32a5787ef953769758b8e5155266d2bcf0ea82ad3c576d7a76d71164b69bea50283ed70ed2e5dc0bde8b1637f3ee428815781cf480aa23802538457c3cd8a1e2b7820031e2b42308128f643957fe57629bffc9c549a59ca2f6d75aa59497c69e1ee321955c56da1aa4cf9a576b72ad1f1a7ea0dcc175a67b66b67d91ac95ffba4fb53dbde13d37d62a09d59b37488e20db4a3d15d6ff868fc9a95f23be951876f9ace76eeccb42ab35d4b9ee5e719fd4a9f6649a819f95cca9ffd6c9631ae6adbadfdbe35d7d336bbeddc97b2202a85cec61f97aaf9e54ccbca1ff3dbcac70235a34033aa2fcdba7194ded7c2664034887e99594c858e3b7aed98f1e7988c3f3324549569e6437f664832a632f3a1fabeeeefd03834164d69bbefefcc7a2bb5edda7246e2fbd987eadca969add5309899ee2f0c96df566f6522ef4ed36b75a59d9896b6e66ee489d3959ae6ebea4d3fd151df9ad374ac396ffd379bbdd5fc407a06863e91d9ae7dd9971985697d32d18262f59e3f3e54e34e325bb2ccb8ee68b4ea6ebaceccf2d65b26f363a6a1a1da121d1f97bb7de4d6ac54f3436121fba3675787674d3e74d4d966697496df29e3a81998d9ec4b352dce6a3ae6af2d95745baa976efabef92595324f1ad561d3dcd12ad53847a544c719989a95806810ad59e9cb8ce6ff817dcd4f6756a29c9492645e9eb244412d59998d60661a067bb2d6f2ef2ff9e9583e59f3e7ba2d05ca785b0da5c337a09a9f966fd6fc3b303318cc342bd2eccbce2c7f77ebcedcba62a1637e5cc6545b186c46afc59f31131d731547b59dfdf88c3f3e7af75230d8cc9a399ceeb30dfa4c77401bdf5aed4b4ccb16e86737dbbd946c36f536efcfda666b3fd75c5a3033aafab76dd26ad0c537577137bd3381b22df76b8bc3e4c89cfb795abdb7ea7cae74a16399abed33c5b56b7be84ff9a70fbe14a8b65471b61587c3e4d32ea6e99e1e5abe6956bdff6efda4cd5b7fa6f9c4359d0f35eb8d3e79f3e77ea7ebd3cf47767fdb9a92cf65898e527467d22c494bbdbb313ae2ecc524d5fbd69c1d6fba6ea88d9b8eb2ad4e171fe9cf98093749ddf386244562f36ec14d547054cd4ab52ce58d416ddc74dbb94fdae95b7350b66b97be1e95f5c834ed0d496ba41da2c13ae38d6b29d57f061a7a4655d6569f0175869433a09861821faa2d50f93ef43735a30a3372a035bf19db8c29666c60061133723405d259e3dca5b4fc0d822940d082ebf0a59a4661b319bd5689cb1254931215a5a4b17e2e57631778088271acf9a16a7ed96b58195a5051861265cc8037fda1d7d26b6906e60f0fcb3075191c543347a3902187b364cc408600dc69143214400d05f3e5068b6fc903bed50616a020021068a08a3044f02b7a946002d896d21381980fc75c838b18b450830b2118101ae2bd207073772c4b3bb2da1e8bf6606e029dc7a0a08b4d0fc5f02f314e3ffed24e6d2757e3815b7805b4d8c0e3e113f0882ef00037c3cbc019303ace4330a090dd6ae66460fc70778f7a4b55996a98aa32d1c7d9a8f167b773b8af9bce481a4493cc7ce88c9cd16dbfd27476cae66d5a5aa5e1a7291dc58eea789652a4cd34ac292e631ae776e6d6d5047a9cdd77fc793d9b51bc4fbcf301ba38bf083b6d6f7f6aa1e3c5f4d637cb5b6bdef7b7a53a6c858eb9936e7c81a4347dda8d7cf25a283afee84cc378d3abebf8a3f5a1e553d91ad5554777399cf73531ee326b4a12d434a33b13a87c2dbb78f69a6afb43e5890bad741fb9b8f431cd1cdde55a5e4cbea65abf794ffaa479e6708e3e4ddbfb9f3f476b96ce1e87a16654ffec72cd3887fb283aeeaa14b6fdbeb6cea066411e64e91245c7d9d08ce27dab69d68bf5dfc8faf966a1e3cc4a549526252cb2a82625a62a4a50b2a62c4b51485b9ea2a09ab220c99e94929ab6e44e5ac3d706e52fefd9656b5babe1a02f6bdeb4d297aab88b2d6d22eb7daaad3573b94a475dbea9c3572ae85a4c06557a234f4df56b9ccb676e97abce3f55566d2b694dda99a3fa27e862fadabced97b2a60fd5f6b3aed476b1997fea75f84681b48949bc71ced16bbdc49870f937dd19dfb43eb125ad5971b492f74fb376aded5a9386ab369a712d2a4b138d82dac274920f458bd01109926cda7d4f3a54feced479d7abcbf2c5f01d61e9cc34add48c664c672f55f7ec46e29cd24780717fadea9bae99a4444d4e5ab3f4c95f4cd4e4bc9138f72ba92caa9800cf6c637363535fa5a7d5239d475aa5790165bc56e8d20c6e0850e1ae67d44966bb7647d6d296b792b227ef89efe729d997b25bdf24711859696526c639d9ef3771969517d3eac5b4f24f99aee6f2b6adeeff7f5773b2fd78bfb63299aef965f8ea376935ff35cfa96b65fbb5ace697e9fecacacff96b5fcaca8b699f6fba6e2dcbd5cf52a495d2329969da1b89c3a4ec5a9c6c67e672350246221024022fba7ba9f2a730131721e0228b17c1227151e5eeb66bafc597c2fe9e19c685c94554adbe49f16ee2a2888b0cdc9dee5e6a579aeb9b483a8f19870bb798dac26e11e5f4a6eb4db6efe79aa354e31c85edd7b98a93d9aebd67ce651caeac32fd26794fd97e9dc5e97ea58d33677c60c226c783591a16a248410a6e3e8454d0c3bae361a51ed6261e56260f2b081e56ec612de36125808795080feb023cac1c0022a651e4621a486980e0621a615c4c63bbfb4db86347f8c4ccc327c278f804091e3e0183874f14c0c3278cf0f0890478f8c21a1e3e8185874f7ce1e1136578f884093c3c802706c1710de1808b43d47071c81a1789ec7091088f8b4490b84824c945224f2e1209c14522d8452227b848c4051789e4e02211215c249200178960e1229108ecd0218e61c6c5316470718c1c5c1c430817d30071710c03b83846152e8e81c5cb25fee02efef072f1071e2efed0e3e20f485cfca1c8c51facb8f8c316177fa8fd70baf80309eeae73a4021dae1c20e2ceccc51d9c8b3b542eee14c0c51d225cdca9c2c51d0ab8b8f301177748e0e20e1c2ef270177954e0220f1e17798c2ef280b9c8e38a8b3c40709107ce451e23b8c86306177900e1220f285ce491051031bce262287331a472771d56887cc7ca91ef5861f21d2b5c7cc74ae93b56c4b8bb8ef08b91875fa878f8258bbbf31095d81e2a01000f95b8c143258cf05009273c54e20a0f959880874a6cc04325d2f0500939dcfd95138a3aca7051c7085cdce1b9b843c7c51d405cdca1818b3b9ab8bb053f441cb68b38ace0220e3bb88803142ee2e0007767f9d849dabe93b4f39d24169272707642f0c07742a8be1302ce7742d0f94e0825f84e082af84e0835f84e083cf84e0840f84e0848f84e0850dcd8bc5ca22836b9808b4dca70b189085c6c22878b45372e16edb85854c4c5a220178b602e165d71b10804178b6e2e16e55c2c1ac1c5a2165c2c22808b453fb858a4848b450a70b188022e167dc0c522365c34f27604a8c4a804f06da5999a744c213333321009000000931200304024180bc70312c16c9e86ab0314800372a67290521d8aa32849415219c20c0100000000000020981a02a5295a29c7c8d19282f33e01009b2b0265b1c6599152c7f19b177053c43555c0be14b1bf9c5fad8f1a6dea9b6020874aa802915f6811ad2cc131fe698eb2978a280d50a1ef92c4c70a46efe9525d1ac4e81034e235d5337003df3edf50b9ecdfb7fc52a17fd7f4086af45247e6af2f529cfe8e3149cd0db26bd903b6e488f4226b19e01250a3e9a2110a17132954b2729741f1642cb47251420a7add4522169a8e46a998080f4d3c70dbf53a0f36dd9ed1c8f0df14b9ebe397d2791b889d13924dd5ccfa3023e766edd6e5f676fa397900b4def30b070fc2477525eed178d3873c083c285cff25a8309d66ea8a70a0cda27360f908165e7a25aea728e39205ebc3182a9f66d740cdc774053a8fc169e04bd9730ba7ae045646414bb46fa4aab1c482844d99f544e36a4259f867339763fe05898bb9a20a5658329e25a8d15c75f9d01add8f8653879714a8aad6362c8b67c86edf38147d9b817573d83271a1192d830a836cba0e6fdba0230b64a236790111a66f81a5c10025160bf3b1c71baafe84642c27f24d5aa5b18e4a0d42349f848a78a8c5202d01ccbbc8193300d990b5dc5ef3a30dc7d2f8c94a8fb15806e435a5310fe768b2f226898bc334e1510b7a2d8832e01c3ad6a8577600183ffc3dc1aea0c6f80a6ea843ac6c2739af045a022eb631c4714cee200558fa4f71291f4ddc0f7c327e2b8899b4e1cdb3329b898df6cd3ab645eba7a92d95ec51ede37df57e99b801ed5c31978614f484bdf085cf2f9379c6af1120197c6cb5b66bd50fa4cc28e8bc48e48d19411a1545469298215a4902f6e8280b71a16f6ca743e3034371caff99d6ba142902ea7ea1086f52c049b0fc08ee310b25951c59f3b14f485ccc16fa5ff90fd808deeb3a1a08e59eac455db4ab051a1e400c887887a0bfb39a36a4e01da402a3c3a68f6a2efb681b4cecb44ec43a9ebffccc0595e83e47958328886dd0ee15aacd5d04cdba3deaab3a039a5dc52f0f519ce93515b2dc2513e911cc68f85a50fbc8fbb01215320a1f629f5a82146128b840010e72d8235bf803c66df8c2769a9b6728b807c3c830ccbce0954bc0b7a6c81a5479db1e6b6a1c1ab2054f8ddc9786ef7c608c6aac64feca2dc8299441eac3ec4006dee5b87a887605520c18f44abb9208536d5ff3a004775f8087e46a35398e9c9bd99239b8dd985493b305d7bc1dfc36a84680bb83712ea93ac6e77dc19b02843dc5658d2a48c3656cdee3e633a8652e69e51d218c104c913ba5229253f3b5f86fe348a62ac219d79ee8eb07221073e3671eb8a0e38b5b1be86b644f52ea8aede9db96da275c18687ce2625a8eaca81e37b2c1ea06d007a0eb32feb6e9ee7fa8ca87d8a12286ba76c42793dcb7842e72b0161d36b22fad1f79c893a5cfee9a3e5bdf39de13c96632e5a4dfa92d310fe400b42884e1bf8bc7d66877da31a00477e4e039009220603780f1dde98ee7f890819d0022e88a8ae4203cc01a21c1e19541288e058e01e7a016e78c7dd60600bce0e888096c3a436ff7ebe513b3f3a7cb90bd6b244751329e56b5e45f5930781b959a41239a2796118cb91708a260dafb8158d5bc416e3d8ad1a2e8eb9a4695851d5583db437d32eea0098e4efff1c8538d7b75b7b179ec8909901f5c4bd627463240404c14ac09ebb49dfa20f840094e90038886fcde1a7fcc3dc8ba721a727db6f1d62f32803a81673d13991381179cc736790a9155f57f35e2266486d9f7b1bca38de118a5c8eb9098f3c9de038e6af2da766307d48efae1b6e13f86d6ab2585d86dc3276cc781c28cf08a2ec7501620d10b0e2bd1bda1f7c9ec93531806e46d096a4521a3ef7fb00b084a6549150e5f2463db5db0e6da1a1c2d439b35f1c7b7062be2c5a844adeace61be787c05ebca890a291224cf00fbb807edcb6cb25f99ee38d82d40af621a3611f1685c7b2af18bb111591b4158ef6f0f334cb1e205439a8a88f00483b1421695df54f7fe4cb310dbc651faf56b3c6089113f87bc71e8011b0eb24cfeaa13e71c87319ac45469861e8ef0c66dd44eba1cdf368ef2a4a7fb53fee63260d5f839034786a9388b3d635b10174966d94df2d14686954b5e877c1bc53e2f96db90f8712979933cd632179ffc90b229d0bea9c5472297da974a00976f8de68b1da90c550fa7f98ae401e0ad26dfc0612ffaa83cd97de3432c98f8e8840dacedcd49d146b2de82944d8bb8ba11a581bc28573335f946148b0fd5aa7bb9162d183911dadefa20fdbb894b5578203e7524ca6d1869e0296931f0cce558f1431c54de2ce131f31149e4445db510120612a2a2ff227d3811547ca8f1aa21936d55b39b3ce73b42347802869f2287c36e9bd5e58c0b13e5473b2f08361a2e82357501170d42d7b3ad97a92ccde36342c70b4b442b8d351931650afa7340eb4088a34907604de457bc0bd4e77e585d152591cf9b366dc3dd46ba6b64777e2fdfc3e35e71e1b7cecf0730156c9c5c9ab70412c47c1be40be0da9e5dd53f4e357538d3d62570ada641da09a5f071f27c4aa9ee8f295d61b1aa2025a69a62468270ceb18b6def77924bdd6e97ee68d29cddea60a01cf9f529e77fa3498499ccc9dc7059a0bfa99d54fbb93fd9316266891df4f2429432624cb5530787f41792c433c1f2100fa8165b49d4ae8fe60fde9ed641140538a16078310cd2bfc96f5447273741d92b0eba157fccc94a8c22483acc34d222f5df2324e2dea7fb0367e354e8d76565969d2cb84dc91aee3a58d28ecdba617dddd6fe34f64deb4455192ec92b02fc8d757f90caed2538567840a37ab042fd0f91d221e0c22ee41025aa123f5a0a6703855edf03e4ec821f2a06ad04872b03046f0edc776d0035040448dcc7f29277cbb9ad186731b0ef6556859b9da7b5ae7651af672ec568a241597883a16f9a553d031a5426d87534edd71fc0d8c1de4be2c5630cb4781a1f40c770a345bc2e9d3cd23cc154028cf0f34efb0e84beebae9ff904d60ef88098bb49138caf8d30e15e2e8cbf035939a9ca1c1607bb793ad8efb3221f86c5a0e80f85e9ce1b5b36f69acfcb5890cee7b7043de4cd954f378b5c218a1a5cbd28585f7f7b527d303f92c92a5e2b7ca3496ff9cd2fa7fe91b3db65acdcc4df634e483fd35507818e0848bf0c69dde68d580e176f59aa23de20f1021f2eede580327e2963e955e0b57ee1b1bdf42cd74bba8149927cc17d43a69e12d0ae8ae63b550780397835ddaa317434d1eb604918909ad781231636d1140c1b3cfa67530fe761ef9b2a98ea0cde1c51f1769845824feccf0f9fd54f12871cfd878f0780fbf1d60f4ef606df7e0d4e16a36d6439c62a20a8a5cd7014a828e69af6a1800089a0671460b23438acd3796f99864be1b682eb30f5d50e90922a99a35049934a92238c8dce91cff51de3dfd934b783d8ccd7be13bd319551841047369a7d41671cedac2ff1c6da4b0f8922d4a394d442de5fa35c64cc6f8fcd322245a92cfe6a7b5b7fb10e81ef4e587994876fc98b3a2fb7c02863ec020dcd82ecde9650599cf0ff767e152b40d0b1cfd91b5007911aa8834467ab8048eae88771918c100245fb8d2c3a0e110169673a9b96c3fde2ffb930d2019db13224023e8a27f168e14d59166c8183710ead7229bc7a3e6b3f780111488e81897b0aae6c6116883ffc1192c84e6890a92148352b2c5d35466abe150e5bae7c34ccf91726ca13cb2e3f1e1c13af06f3aa7260736b08ef9fec83988549592c14a872ec98e69e05c11ef3e9564a6d90516ad899bd304b88d8b75a480ccd2e1c7a1cfaddc05a3f5ae3427d6079b01ffe349e67495e128abcf630ba66324532bacd578adb9cd99086dc15994f4d1f79a4bd85eb9359e6b0df118198f55d99d841e54f7fca270b7f48e927acf9a7daf36a5cac2ea0974045d4811f97e21a61c4d30177074876aad26316a95eaa476beaad9678bb64a326752da93c346c878c071edbd15f39636dc7da9621a8a6ca71973297c94afa2e5580bb27f5a3e5794f6be7c5dfa2a1f71477a0c5b8da0461d4183de6800c3724a4f023fbdfd1c70b9b7acee58d28cc2ec9c81996e13ad4e09c771ed94503fbe24b97f30215c7f1cc25315cc01b6d1e7bb2b28b8c6994561c4ba5fa605b35f358a0518b14159140c06934cfe69cbf0b86730630812fa559818e81608a55a02af318528ae8fe3d5c405708c9329bd78c36b00e3a2b45b31c4982513dedd629875a026822fc2e54697ac53b636ddb016519463e1924ba9640b02c1e42eace837c8b3892a7c0200d97d54de3ea9cf1c38d6e8b5695142abdafca574dce53086fdaaeb4bbf67690fe105df6319a1aa8d3acacf51c58a8b279faa6e7688613f822b87717733da453eb9ca6b52861d13699bc35d3a4de762515c1f0098218d6b8c82793f899343cde6823fa06f12a2bafe42185f8897a7b8e0f944cd0e510f3486504eb821cebbc22068640a3160d34c41f0976cbb3e710bf957012a322cf32e4e8ce574d1e4a2a404484d2f3ab355d144a703781422113c92238adfef0f48c356e9017455a77464921212c1cf496a528c66333d3c7804435da3d4b6fd8dc197fdb3b2f43908700d5f619ed33ae395a9925361f82a7df1bd1e8b154139c61cd3e8651d57b2cc48ea71a1411f29084c65ca89fff7661d0d2ad61a6de140e82448ca7997c066fec0eaa7b58387d7108a8c1bfafbf54e8bd1299e2608764891abf95f6eb6f7d5c31bff1a49c216b7ce8aa00773547cb592c57ed96ef8320ea846810ca8a5ef45e64ce028663af4fb2586f22cd354a86750cd9bee1b345ecb213e36ca183b3b538b928a54cddf5484742e46e920ccc42438580f71cb8cc9410e884c1e95191796b0ff55f07024941630d6ed2450a90c5cb8d3dbfc41b8e38126148635e3460901c2e9d2e3dcf22f3029c1b01a6fa8305524dbc8b9f52c3a87ceaeb3ed09a74221ecbd19fcc6e4c21d92855e936a902aa6a724cc817c08e5668ac0c7c10c2bc4278d8e57ab0c28094ba3ac20bb5692f4b7fb35c30aad25a952ebac0fd084cdc29a499d1b74dc2472f23089ea343465a12094566a9ae347fd5f38a78b31b62ad89ead323a884983d1bcd97328fc3d08081662bcbf0c021e7594624140058de19c854f9fc248aa069123e25218884fa4905dc1018f523c8e05c9ccc241f143a17b214d4a7099d7cd4b381c603b9cc94895d58970422c182626dc44197544388cd6b92a9b0612f683084a53b114c91094b2e5dedb992f2bf4de0005bf6deb0f0bdc143b9757f720778c692b474cb985d1022d2d5e7c9b639911bec47134fb36a3160449ff29823dec41d34c035476cc4406363d480de3e12220242b653421a15a5ed521f3d89e95da810e47e87a356a9c0837f19d72c092b2912b33a7bbfef0c6064828675706d9994ab3ae7dc235d9cafb852356300e951c8b662b1719382a78dd900856fb9d6b6a59557f38f7516ad15465e469e3ebb1707c97bfb060e48e71b39e2f5173985b27242d4c12a00d755a50f7336bd665bc125e8a756faede236086949c3d5ec911ea6a0b6dfd16e4fb2e4050686c38764a35275a0506f65a920254c173243675610d5b5e36404ec005e93e43a3482972e500fc9ffe124a0133690f08182e830069ca1310c66bf2dd407e8160034ec5098caab0c84a1297dd45d59d388093e9710b6fef01ec03556c745ebb103c72a805f058bad4de22772743a34a6d4c4d3b8a1116c7d4c06229ff4a5fb9d7e28dae5b4915c2268c0b9e8632a5bbe78913f569325ad9b329b6410a3cac52b8927548bdc64d00652796ede21570f3f2fc5c0cee8c0a2c2a3f90b051a11d7812b1d30b1bf8d544e381978b903f008cdbf3a0d13008bd1d80b0bc40cca00ee27d2fdf56a677b1bb9e757483e09a2df3de737c18286dd7813efba4d9525309b54d313ca9fc01779acf153291250225212a284eb69e5b521a11fa2ac38458338725ba40ba2dd9d7b7ecaf0efedeed42c03007458ca80f6185db70bf1d59b0faf906fd07a821fdddd4189a1cd360cf76fe4d8a46823d16726e2715b68c6c74f826cbec7b893f2ea5f48abf73109c2dd111cedb1816510885154d17d0935d62bde262898d45c5c1265a7bca14ac19d5d1a5ea251592828a246d17f9d90cb99ab4626480cc614a8812004f88ebe8849a830f6c29d754bfa2c732f14f3557f4060c2a4308b93536304d19626656af1622784cf0e78ee96bef16c465465c3d315e9055dfd49497c12f6228da394f56d95bc0f0644260eabdc14bf0a7ea4142b713113541880880405656484c378b00ea9bce23bfe17c4116ac23c0d8be3ae81138d83a533d45f311d0a10f8df7813dd3ddedae798d7243deb938ff57541e3625036effd654d855f8e459b31b83bcd6b08a6f3946899e113c9bd1f119318063906d6e2f0b3ae2bc9246e436073a20b3061e223cba9c51d8d7f7ef76e02e01e14faed7d77e2cc5652496d850520e96f86ccd3df7a03a946416e15e72de9fd83dc605516721de3767af2f9e518067105f4f87bb4572a7bf328fd390f1ed2b3ee51894deddc090188a1bcc2f363b2bb2f3d307254c0d8243056c789c395dcb1562c8b4addb53942970d4da5fae223045644c5fc6dd31697d648f048362059b5da8dfc6f652754ada18af960e30de9ca989bbd83c97d301256b37c92ee23bec863d9a7f9b07e28fc754c189a50bada349e56f95e326d75066dde76b855e16f792ed8c0178aa992cbbf7d0b14494d7e85ee60e9d05615d92c0e4b16f6ec8d9afdf610bf311c0a31f23db028c46296de47355db2653b57562f35a8e905c19c9e126a43a0e07adf810a5d66a12c9623ebec70a1d69a5ece3edab920b6360099a9df2f2088a1dbd2c8e0dcc9d0fd5e5949ad024d0d82c402a506ab8fc4d25290c5f20548818bf6683d12761d566adc07b26a6231f39ec1c5b1e26af7d594b17313101fa188fe718b009677dae0c8d53ae3e04142da5f6d3bd4076c54f3775c792d073cd84da7d7025903c5b908cac3456dc8c4a7c60a16af90159fd6ea02f0744b2bc702f1ea05646683a67648c7981da39354f4d258abc3aaee0abb458e39352c0e449282c57033d189305ab766fe04f79c35e02dba19dfb56fc3e6a75b3315c59430baa303324c0ccd8317482ca5842d23251bcbff6fe5b585b8762c5b906cbd60b16e0ca0ad2a837b7fdd86047b63e1b239fe2267bd4b61eddd6bd0da6d5c830a82d1035d1a30d9fe73cac1120e86f1fe8948764b9e73985de4b542c8ba75b98b275ca4878ca9025d8a3b40299849f41b7f01dd3f456c11fc919721b9c06c0dde4b6d9a22ad7abd2da1e99729bb383bef075e74ee91e41f76695a467f1596ca92900b6d3064edd5d3f33a7805935c02d98ea99efc922966d0d2d7bd6bf87fda18937316d5e5b7c73ef4978c34e4ad41b96fd4beba2507296ead3a778bfef7e1b4e1be6dc856dc3d9102304dfe139a2fa8680e5de887d3cac6418ab65f51f03b3e7c47f57320e3ea2a16d5b660270189cd275fea9d6386a7d5bf491c161bc28ec2f3663446fd0e4601e832257b976a08b631a4df8c9c4e6278c44038ab781e02ab1a43a91bfc2e6760464cea889a51f1970bbc07588a9908a7af5807963306ad4a57cbe6864d5d85e2598b9c8e5223e1ca1a1522f338edd78842ebc824699e8697f1f708252b028dfc4c7165e8a56b0f31da73ab71eb160569f8a5b71d8c101e79754d5d26230d80ab5d7a005ecdfdcca1c203b7f977dac8744901efc6069cb10674d2884baf10111157f76a10c3f623bff044a0d7f271b4d4e12c3590628806a43f3c2a88a87f84e9949369ccdbaf68a879740cf6f38e18b8e5247558f734a9ac52ae94d6fa159bcf5a3d193898c4349298146b8ade3cee785f7691027815cfa0690f7751e856517e1ad27ecb6fc44c4f48ccb1e6fe45b00b556f1f8170afddc15f31bca3cf78a23d8569ec74f8b2022f0700f7a62328a11945163121b79decdc5156ddb05e50e01c3aef189b61d1157386d4049098b5b94f04cb4046038145a6ac3fc1d144bf9877d9da82955461304ef72d9cc75ed5d81013f92461907c8979e11cb2f301250e0d1a05dbd317312b6711f344571ec461a3f7455af61413600390b751107c90c1f1affb88c68d3481071dec063cbca549223b6d34a1631fe1d2ee644cde5af17a06352bfe0fde4d7b2da0e3daf5ee2fa07f196c15974897bff81d61e435d489b27d2af986be6e297564e520c167617d323e94d1c6de1e859962a4b32074a63d8c8046fba8e3eccbde89c8c65a8fce93abf3db8bf2dd82a68f38744cd98c663a6c1e643b47b8ced4e8382f4f9232ef24801e6f0be047252cda4abb5d78bbba4145b2c6dd810fba1ebdd891ac38ecb7441ef62625bc5c86ef723965af821210f2ac7783e20ccff44fc0d60b258be4f3078499040b033918504eccfd647ca4f410a1c7eddc080e3421f4711933928d5af62f489dc09087393bdff1431ae54943b3d88a8882e9b1292ccbc506384b963915fc1610a1ecd41d36504b7cb8a14cd5ddbcedc487fc7600ee88249eea728ac6b8b78fe187aa05e8ed8216f9d107452a1cc0f05c0483074c5ff949301f9fe3c3942b6b80cd55ae5e1c7e18401809a5ce6b1ff47737540aadb96f106f7691e931709ebda44839852ef403659d1583f5390e5cf83280e0be6ee837d6b7566c919c95696ad77aeb91301587bab76b564f3088cea47caa69794445f5c2f74e4d1a034c3661a32ec8270d2d45b7d9bccc53204e57eb8874b932d0c4933535106e0e10593c95e13bbf42342209fe73ada9948470098aedf8ed810e607adfa7a7b37a25a17ec5dacf3fa4525d3f1a029b7ac08b64068cbcded6d7266ee2a550e8df04a1561e3ea2b1d9c0e7f1782f3838bb49441119ed74bfa7702e54a88354999ddd77af9325e073465fd0628a627dc0159a7391da9c322a6b15d802af107069d5ef217338767259adb17310c4cdaf9913d82d395dc7e827fcd0d27c493887247a9cc9a157c373f8ad9d76adfb503c03e44a795f499b823f7ff69b9c479c23a7f11f776436915cf735b96f07b2d63a52d7bc834f581db62c36a43346d7d4218025550935872da447019bc06232b34c1f710005988010cdec2eea65df145025e2c6b55c50b77a467b91901ad36056b203372be10fc682d64d7bc7fef30cfc0c0f9d20dbc14aef366739e3f9677c6e3c00c371de4e70dfff9369a230c530db6293c4fdfabd16895bfd64b44f703e9eefd42f8d3f165140316b529244787d0f11e321e4d840af54b0e2de66df5ed6eeff61b9825894d7dab9e9ef31b2a5b3afdbbd81e9ea7517154725317107ae2b530838061a34f0c546a1325cda3658f00fd7858e0c3a476796434d16f057d1188cc3dcc9b0341b253a19a2e8965e3f06f61ca9d3e8c9ee6c084ff5180536f3052eb38543076843e08fee0d3f62bb2d7bd3baeb27528bda8f39c927b2b2bfffcb9df83c96302ed5e82c4342e42cd9f734b8318aa69be2e9e201d47d78779840c179c8ec37a76d750e09dfe7093674021b4f55b708cff85a11388254d88830d4e6d1e8f63ac43b2610f483ad4bf95309d47e3583825bd10104a1ba3b5ce830e8c5808930ea274284c0941304ab6509c64e90f9aa8d8382d3c3bdc88ea2fd9486e38c93772665d353d2426e32e69778abbe50a342174d4b25ec58bfe550f375ca786e6c8f3d5661a1339ad41c227f8ca18f476bc457257d6ad6b6a9fcc564c6dd50aab81b2962ff5e3d034e1447059d00c4fa5d4936ca004aedec2fa03259317e05daa1e5d04b1f77063a4b314a937c0d04426cd991dc05f68dc37f99f151c6cd4ff7fab42ada690df2332724dc168ce9c5d33b6ef201b358b764b37c51f6ffaf884695caca94f556087d26e82fff1ba2434af893b9052aea6fd1d37f9cc490268535e6064f07b7682dc8f709b5bbab8867e940df8fadd940a8865de41ed839a63290e35dd577dc2a89ac58824e8cb9ce37a64243fe5447b68ec3a56a96202232e77196bee9f3a8db17f7b3854dcb871440b43855bce9d6e1fdc9485f59b2b33f8a8e1f8a8706aba83fc199317b8fbacb1f8b278c6a92558ab7b3c005a71c22fcdc766d71416c50e7e5905a02b4b90ed6350f22cd012007738df16b0d473c31b4676dc1f4a837d15993193be17cded6e673922f043bd2b455ce4807ee8e2ad64cbc45693182239433a83d44a8648120c66247c7a530c23b4c478600878b14c74686193f5382e921ed7c1d5b97d1bda96c1e2e852b5be654df1ff2a3ea0a84efee9c70b20909697a2e2a6ebb2200de5e82e8600b5b39261e9ac22b41706a02b0d371c344ed7e665bcf55dbfba1a78df805f1431059b499fcc9bbe0d835470bcc224458a89bdaefb2592531535f31b61ae10904f533be9890e0995d93590fbb4cf5dad08d3c16cf2a8c5b3eaf51b19e3b66331f55a2321e1158f985955991b794ce182d52a4fc450bf54ef735eb7c7d84f256979b6cb24b527877cc01ed758ae28850e3c514fbd9848f15135ae7feb59470336d008348c7b7f293611f6d3c439060297ae29016f12085057487388e8dc333b500d59a0cff3f2f3cf5ebcd07ab7414cabdf15406dd99e22c629cea505742622f121a21d679a40b559143edd23041c6866d33df1a1460b79853ee318666455ca8abe60c2a606b3a13f3be46d15d59ccbe4db48fbcd19ba517b3e9dec272fa6b200154117274da09a43d9ccc93730626ef9a6a40b89449660c03f8285bd03f16652884116e02b876ed62e183f5789a580763efd60fa8feb4aa6ada391b93c868089b4658c8a795fca8e4df7c20a5ec6bce3e63953df8a0a5b2593690d0f061fb9b0e8a13d4626ba5ce5f5a2a5a120c4e9f601762068c31295ac0c2206e6090f3758f163171fef3f1842c8e48ad21118ed83fca30a53388987fd77bfbf0461ca7be92fe4c77ddd27d3e381a87a8b3f93258be15e43481f43975df687af40b743d6c5e87766cec57a0d946a6f46fe9118f6cdeb68fd1650bc74948325fdb5de23901345b6d7958747c262e79249b88b3c423d5eabf767a3fcd6ed80060c1759707d24323f41fab51405edac29ed4ee103bf90c494c6ea381954a2f0c268f69aa394808472e0f5c64bccdecc7b87e8fc34a6cb81ea685140ace3d0eb36cb8f4692786da468aa84572b06655b1d5d488f4c35c958def19a31f7a3aea1fe5e3376f8238b79656b54a668808c7f043e42d4209f85a9d95029702e5ddc9f5ec38e4b09f8baa002809855e6c21c15883c8da6b95acbb99023ed0276975052022109844d216872252b3bf3a2dbac0b2d46deb08fad4fbde0d980c740147fa22b8dc88c8ac26ea98bae55e6215caad98a84646105982c15b879c83c5b6b6a8faaa4010f0e11244c8125e10aa0d6aa80d2b0c5bed83b554f813bf95ed2e54e6fd845ac6106b32c1921e06274280897936a262bf86f8634b023982f166a00a54fb4c3a23609327e2c02c00021fc19350fed96e111fa48912fb2a250b2f0f6c850fd698ef14c7ee9e764451e50ffdf2e17cf86cb1d4bfd56929639387e1459e3f3e4dcf0c2e0f7af233b0c90ce49f0a3d8b26b8ae43c4e2ddc4e59e3f9f27c759afc68c58956d3172c0967a3413a231430834807f85f734459b8552b33b45096803bcad2a1e04079fff6984667d0581ba0221032500c173da12f621606b564b00e5f5f57fa64cf0ed0c350b1357aacff45c35925f29476bb652b8fb606104c07245fa575a5fd00801a03361673721af9f2a0031cc4510a6488b910d985fe560062a65f8833277ecd0a9baeddec616cc5dd8334fd1778dcf4f9b66e71e69c96510f3cf0ee848dbd73d327092640187220e451df2da4c531a1022848296cedf69fcd50f6bab042bab36c68ddd0843d2612ee7c92fb517ac3b1ab37fb99c57d4bcc02d743d985380921cd4d8b0a78063026c720af59e05192c973d36463a5561db939423df2fc5999e89e863538df06fdd8a42fba346be291ba10b16b35a14ca539db0b4a0317a9527aafc05c147bf80f0f39387bd40b950c6b94e84216867f98e2c59e5b53e8c42141a0eb32016e1cb866a25451a0e33444f390a87babfbbc1784f54092a41685c0e78eb9d8413eacc21ffda28365bab4dc0023aa64e725a35d1698995aab2f268dc0f870650701717151bd860b4f962273e50936f6f2bc733a8091e4583d93da75b194b724b78146057eacac9c35f93df546c7e14bf3dde6464f85859d046faa98a437e8a136e10d0df5b95365939fe61038ca788038162c12053a60223e8cec033d986c11e02b17a56e5ed2d9cd7e6d0b45fefefe86a21af0a9f0e50e7afc8ecbafbf25c53f88264ceb4650790abc7b6a5f7cfdc8ed53643e16586f4125ca3cf7af1c88a9acc19e2951c78d72f2af47020c5b600cd8fac92f8a22cf9a270caadc88d1663a63e3289f304f3dffc26f1ee79af36ee4d6d5a5f05fe6d75ff65473d26386727715ca204da7eecc2453a25101afc33901258cea2a825223368c13db01a4135105899ee2a4a0c0b41b70cf2e4cc974c380401f49c30ea7b270aa0d922db7c72ef27ffd4c8bf2a10c9958422f7cbc2a7b94d0439d6a17157284c1e6725a338d38c1ffa4f6ceaba03c1774dbe7a3e0bc283c9b2e44c94ca1d16f1b7ed85cb1abb280b6bd82efb3020671b682e071e8cff8f38afdc68ed8470712fea2b908eab5433159f53314f28869f8751afb970bee9bb769db23d8f3b06a392e7bf5050adcf841c8ac1f702fe0ffc97e3a8ea77879e991765c2a20d19628dc69f6782c1d23ccd5f75ce1c8d81b4694894d56f30613ede0cb37262ffd109043945b9e6facc2238a5cc47f61ffa5ccd73988fa83629c6cac00cc7fb35728253405745c91a11380e476bd01618540e8443c3301ce825ee418ddcef67f09d70bc24f44b826f41db1c6698cfd4b8a046bea4450f0891565ec3b7efc550d01cbc8f300cd2dd9ce388b43a3fe94b0e85816c4b92f8c33f2b762a8521d962dece5df34e99a3ae686aea1f168d201c65c5cd273962ef517ad83c8cf6ea259c75b28299f3d9e9088847dd365240d0c0734b6bd91231d00b3f5776475ce9265a86ca4c13d747597ccc9dd0da897b14a3c5e46227d697a7ec1597d018b325e8fc93e14d1a2de9f4ff22066d7ebb8318713e3f4fd977f9ffe94b8c5305c8a2014fa309fa3f7e410d48b954e88fcff301ae85e1ba3e855458789d3b197495d069dcbe936324c46a5cf12507e2bebfcb98329c3f8f941bd2d8878f47438c00d5f879db370569e0f13740d3e1d798fde52a9a633af5e5168ffc88013dd2af1d397cc8408672a1ada8905a9d0d8f43412eff5a893fdb6a653d768199ff98020dda889ee9081c043db59e09e789622ac08b99c87d03407fa4bb6de3a7579a5d756014a710d591b516df34501135fa3195bcc6d6b198c86e44f54ba4738af34003c85ea49be5f70bc3f1c95296b6e049b8b88b7650b11665de106ceb6fb48ba77e81f07e0bd69a1a30f4d12278900db6d4cbed0a950addbfed611966407a91e0b7461c88332bb0225c2905ea7d2552b2727ac332268ad8038afd2d9685fa15bc6257f25c9423e3aa1c4b4b05db0f7b122599f2d4aa430957accbbe8a243246c78082da2211fa9073155e6e3e1bbd688058941d131c0e71cca84b24d41a9ce4476a2e290b02bb835e86f4cebe786a56429d71619dee7a0c04930af14e4bc4bf45dbb8b19e0a057e0d17469b566f450afb6dad06ad08cde0dd414c67b49bdd490925af05e1d5c08ca5d518957ce39354cfe2975a2803b6e949bd61ab16cd77db6a76c1579dac5e7a0c17165f7641277bf11b86ed5705bb66f1d53b2f40fbce1f4b3e55f8b0817c7125e4618c93b9469e8609fa82ae220e50c32b4322f0ace8bc800167498234a4633da9a717111f984f0719b405b6fe8a3ea66b181591baf4e6dd4187ee0555fddb0100484252ea8c8711728073c74dd47b45748edd9c0cb6ba028f79cab38d5c97d478745e73ee64b9a52c52ab1657a56c75cd312a9df548e5fb084b7db3585e0f0756415cae17b10c3060eb91889d66d84eb365c658c16d856991a33b2d26cae66a0e1367528297d40c93e77ec10425463c878289141df2661ad374005698e2544870302e0655a32f45007fa69cb3499964240c02658fe3735d4907a8cbfd17daa80e3afd991cad35748cd248ed4a973d3c74e716215833df7f4d130283269a48c9e662669c56e964be558c0d2d7bdddbd4734880e341acc2a2a2fc26f1bff619414ece0b6c247799d31bc6ad8cd7af42013d99eaf4cf7341580c909502559ebeed4463233df5606c6e8e169c3edf2a5410cbb0d13b5ebf02ddb823d7abf05e932e93dbee65c6aebef06db71442b8c1c4b0f1ac6098d32d017a05d3cdd837f7ffb335020fe2db8d0fd4073af82a3e40213b5421f9700fa50f747603a8e5fb7f82da1ed61cdf3d6a57bf1efe4e01f40ced79ba5426ce7ab5bd84aa783ff5623453afbf19028615c9610b09e4813b39bc662dde8d5f5f504cf7cf2b459a7f30c2ac81272904cd1ebe600ab92c0bd12b2883eb7164b4d505b2f27838b1d66398d9a10eeb9bd212736d555abae41bb441885f7a070a6ec6b68a951b37bc7f63eada6ffe696e460ced8d05e2bd6ec8a8186409e63b762c2f236e9e9c2b717e319d33a5c6c172d0e36b2baf0c677b868039bef68558d0ea381006215d09174a586def6f309a5d7d209f3ffe1685938043bcc2ca972ec7d4a1e418e706da36a1dbafdd4cbbc0b187b936af694f44962c38d8ffb3a8386dd50b44ac7dc2c7298cbf2219d94cd18019df32477eeb8f7b62dfe99f268b8616e7e7577db0c83b93f2771025280e86ecdd9ac94e940e99141778a53deeef584b99a7eda0e0def498a4bb9670fe149a97305e9c804055025720ca0821082141bec4589030148c093200d5ccd98e49409ce910b29b1821af64a1d473c42e17fa713576cb7a620ee32b3fdcfe3c3bb38c93090c77370547a5e330f368bcbe8d46e54918085506bd7c6ec03db423a7d60fe0db740796d211ecb51d640aaf1da43a753c7ba4d14666da9bdccee1b4379881776473bd994f762fcb4f211d0af5a3599f657408536ffafe15f666b3a4db544744e70f22fd63f446d3a375a77782aa2fae9c93db612bbf508e0212dc1025fd5b93f5865bdfb7fc48b7193399ce21dc97e1b3e839f39cb72d824337b1c926643e87ce835b1cff22dceb4a87874dc790df12b5bbd334f5a471b3ed70c9d44fc673156b727256c3ee0b961977936f068878fde313fb0e1e54bce3085ce62ab3cb4037bb3d57f51def027acc4c8ec5a2863d1fcededb5b38b2d94c322176edb135fbbc966f13fe2aa3e4eb4497df8684f75affc4765eb386969828de234775d3d9f203c60f81829f41cd66a1f1e523f53c702a5fe2e4d9ca33d022fd2bc09d2a517772cf978f3edb8b107ce37a00cd5fa31b67e7bc7a6a6fc1cf48fed7470b5d70d4c68fe4dde08dd4533bbfbc28bd725c3176663e1319e90792078e6b7b6672cf569f8bcd5603749053dec3b0c60ba9861f38cef523974018f38c52f7d7c3e2fae39151f5eedc5efc1b78916ff651cff13cce3da58b657774e2408ee20a74431bcd75ada8c51236e86e0c89f600d62fc1c0d81e6b983b8147fb5592c3401f0ec6a17be3969ba705785e6890c735dda9791b9d3115ebdbb77e13f13e5cd81345aed5d5d9a75ddf41ee8e17c48f9ef3c7e98c8ea57e24983283b868b6d44683ca8bc3bb347f4f6964887dbaf1aad183f2038ea4f6972ef2db371a470c8f40700ba284ed93dc75b7541c299694cdc976beab9b422a9b147a1cdeb716a26bead34ffaa7655379532637ce0aa6ef5905f9a5b229947a10c60d5efe6b51c0a5913cd40376036200da732f84f50952d1b507adbbfa489f58d49275e084cc165a62d3e3f7753a1dd2baab16536116cf8d9a73be3957498c471f407656b3e80a730a3ce280b2fe5f88242cf636e176dab073e0fae4e3e0eff8cc41b097b8225706a2ed68b355626c1c26f2f16bee2dd8f55080fdbfcab60d43d0a5683984e2d05eb88a773ec27d18bdaf3606f1d6eb9bfaf4ed973b40ce05236283cc90e50c98f0f94ce62675f0bef5d522441e03c0633a3e59aa681778b8c14672e7714886313a55ffd32dd99f9b9e7155d99a052b48b7441117581af151929d5c380ae0fa916596c716889514e6925ca2c2d739df4d4d8186d4daefef2d5add409eb980ff670166d286ffbcedff087ef85a2971f3bbf96ba315f9d50bac0c7fee089107e0cfa54abcfd8bd2092baff6ed93b621204b8edf9f3b39adde28cfca3bdcf40b2d06de1b1efe726a4d878171acd11f96c5f4d46ab9da20ec2040fc42a6d3d8ed1a7fe9821dedf2929e3c10f5590510699a2328a046d545c71d1b8aa9a953c046a8bca0115c3daf4707caaaede9c552515ecfb40e7690a7bcd10d70b435545248b87b957a74d8c4f1320c7bfdba0453ee320ad832b2a9b3d9da7215b584ad709469a89ad272663efb4b54c9b1ede8cd8977e7d9e3f581caac677e4189f441ea59f96bea003f8f7a5b22838e38786d7fab8b2a40c8ea29801637f7915ee6731535eee47acf4a88646274d3280edbb8e27706b9c92550e848662ec0daff0b1c5b274765223d376061f2328c817b6bc51c1115e809ed41e1edcd1e63c2c2a14dade148688a15b881ce83df9b4ab7d0149a3c8e2305f02fa4f8ef2e1b5492a8f97a0f82728a0c7bbf0cbfa8dcb4882658b950fda246fd78f77bbe7f1e626492f60ab6da1a02192bd4c814121cdf169af1247bcb0e4eb57280993ffad34213398eef69e547ce6a5fbb643fc658b618eabf3898b37d7a729168068c786049b9ababbbd4d964eb22adc3db0c78c514eb6360402687ac02ad42644b14d07da89f1d07f101f3a42ef5f5e02025ee41e4bbf0031ef283323d2257b3ef8eb6ab03c2eac79a2387126d5b9f4b1c8448131c169cbf3d9f814e5881991d6981750d7dbb5df57ed15da96d5b333a8a1f44d56b0b4325556c44f56111a95e193b7c713f21de7bf791cd82f09e0118b0d22132ff9a6ab406a27c82afc57678c33f41a36c019c952e4a8e0696a769bc0416667b7a839d7501864fa622639e645c764a1b9609f371cb2e18e59fbcbfe1f94b2c1dd66e62038a4188247a2d3d999fc99414b307c83d8121a80364597fb125187484e676fd793e69f9b9f93b480353b8335d7f7d8d3af8319e5ec694568e83799b2ffa553f2b8dd2ba1606a53bbab07a16b2d99431355320e81004f18c73d851504a19764c0fb9e00d860ef5ba38051f6cf9c5e3a9155b5e5fd240463cec544eeaa23f5a3b033faf9c05f2efe42f78ca17c3d63ee769c74b0dbcc8cbb10b199d4b250dcb15e1a6aa0f0772da15690f08097ef239b7492d8a1f698debb94e03cdb3c28369afa037149f8ef4bbba748bf3c47542a97cc6bee1f9182dc959e4a1d1f6cad492c8ea5a8509a0360984b01ccdd6650f8e56328c6b3ffc0c0da123e321fa79e017fd1ed75d84c446df576aa241e70dfaf73dcf8708e62bfb84ae18661daad9d9689e9c2aaf5c341b8a861072cd961f8024576615767c78f70bc63139d4f19f86e7adc0ec0c2339821441b74b9af4de5c1a93056140e5c3bac990e692a75b941b36a33404a069ef2a30db953041beed4c08f4da8046696574d7e16ec20792e87c885034ebc1c272bf7f70b5b3dbf0b6f4aec9b742f9ff569765300c9489192f01a9236798e51abeac7c5cc7aaccf4cfd142ccfdfb37ee800330ab03fe8e5df92b2c2ebf768a463040f8d234759f75f0f96b6555e161be384229cd65450961bcbc5f3ba0196283b1a2b7bc33312d396ef2466b515fdd3ae713bc7a5ea1a7b3f7e8657112109210fec788e5fd705799f8fa0b286c401ac754392d14e3eada14edf87ec881d5fc1e90e3b097a272a56001773c1b111003232aa31d44491e80d1424dc182998d79c3387b1d98e63fb804d8ac59a41b97261b2ca373ca784ab9186e9ac0cb6cffef6e283384d810e68afa646a1d528ded0da549e686940755a125b2f6488ef2a3a1d16628a31ba48a9d2788c519956598e695a983fc583011f136f64794719e7e11407e40d0c7362048550f8f2c49e4130373a2016ebda8eade3804f73c874fcd4d53a686ac7e2545c803340477034d120ef7b369b245221e924194d7f587bf62db6767f45df9613ff3363510db929f8aad83befc91e50335bb13dc8c3bc3baed84e10eed5e8d20c8d099ea33e7a79819e237ea46cb6c090cb120e8c62a59a9bafc45c69843d3f0e7cd6e22779455f2fef10f2a367abc72631e57084d20956a8217c0e0a97792105d830b85038883b0ed2d4886650afa0582e16b677c4267ba46bc3571ed7491a2ccb28621892af552c4425ad933d443e878ceaa7d1b70e16e0ddb0c78c10c63602d804ca208e3b348a987e44d36aae5f02c0a4a505ee5ca9d8c8bd5c631ba0ef37f4383aac774b6031d0fc0baac33b83e95b1854fdd261e0c45cf297ad9c931e4c04100a25b4289dc5959fd48ccbd4f426e0f8f7abbe16d32399f0a1c6325d3b6cda2ce53c73bb7f641542b0ef8bd7cbcb39c4c81831c987d7ab380b40e91813c83c561f098c6fcf7f0e97614476c763f0950a7448324e155e76d4c6f4b685583befd23575fb8684434e26c0edc04eedbfe6a8bf2e9a3b1307f29230005559742689b1aa1d6414d5b422e0c86332a9c5a857c6f1a8c5b911c85018d6b36ec6b5c83aa75f9a90c6c7c025e88d7081adceca07ab1613cb4611869e1d622f3b33d0a5d166fc4c3b4f7b42ec46b76c1e34305359f33268d43b3db5ff2800889d8f43b90380b22f19c07c7c38f199d859f41e470d4501c5e29c51dc9153b76964a2cf7c054d360e472260a363f5dc859ef68eddd7e9ec5c1cb127396a517be0b18370ee509558817a622035347efdb1935ea02cb9e654e1c1ecb08eafa78e2287c60c9f4a946be43f7d14adf8c303315983a86d7f4e4c1588a48064eb030cc05c2b66eaa3af6aa51b8f32e92f2e6b5fc55a2ead9fa72138e2c547cc18ab96ddf1794fd0bfe13306123fe54476b906d5423cd05f0dd72b90841afaa149861801cd2cfc0895d1bf2d0a2e65453a2d2ced8682e78e3d8a76255da354846227be9eb18a98b346ad7266fad0b70c9a1f7cca00484c79cbc383ae39c3c4aa1ea7992ae0e40b0c94718b95171c0c9c00273eaa24f81aa11a341e6210048bcaccb07b8c73b735ee8dbd0796706df803e2a5bb8b825991cc2dd4da543c110b6ddce16dcd2b81411f4f1a3b5f5dd1e5f7e8613e14dccdb32c215230d72a949b41e5eed74c1e2f330bc812cdb81211a5bc16b02d97a547bb3d5dc3b1521f1c308cc071144d6d6195c460c0080c54f561fdf70a5607f8a7090edab11e2dbdc60dad6d8ba940bd975438dbc1b6c0b595d1538ebae52b3860f569ea786b75cb7e4067754b2479d1ccbf9886dc2da6cfa6080d14efa3dd4a952d6fef83643ec807b383a9d65540e7f0252f8456e1095527ce440565152fdc2bae1bf1da201a4d2905021e33ac0692e300ce5acdc4cd316cf9296506fc0c3d1d9d1d0c9f936d9c0bbe7515309ce20411ef4ab77dfad988c38d96c74b1f0efab33fcabf7eba317c929b71704171e13a108714b4f45e09cc02406f961697747667d5db00adf870a115ad4366c96bd72bd009f6a1a194d205efe8adabda68d96a526d1d242856f28d6ba70b9fb7142f2a15ca1201ba572d6f61da6836c2071535accc9ffbbff37b71e5ee5e5edee8c941ec8482ce04f4c7fdafab9978fd0763d32888e9803641e18e78dafc0f89791dd08f4764140ddd6cf2855cd408c6dbbff117ecd2e82c05444805e57f703ac8222720321cbb4743efe56a76ccecfc226e4b287f75a0e58209f974a5da6a4e5d0eac8c74957dac09960ebb102b2b05ed6738adb4c24c14b24ecc2da436df960103bdc5d2d39e5d032fe162d205b7761cd49e966b83118f74bbf010cef8286790db3396ee24ade17720f2e2670b2083e1a069941b48de58a1872ab0116929b5bf1fcc9cbdfcb1d61f22a0634d91f48c056184f9c99a92d47c840469d32dca7c0bae9572c9d082604c761f0af30c1a45689de4dd4482653162324454e0d226407e1b8ec08d57ea9abe7eb3af3d5768c1967e091af01da1edb98c8ee581a6a2d3434328b5aecb9c66bff89b60d988ff9fbc9488e514e828fa6fcf1cf219f3d49ccf2805c09be8fe3a3da368f5319d4d16725733f812ee8b187621449b8a1ddacd7039d180022692aa95ada864c78994f97fc7220eb1ee1c762dc9e4910859c5d5fe7e133bab771740a063f9f71ac03d32c138b13d2872d569b58393b6cc5734201ca4a6820739df66ff041944444f4bee59ac051a33610f49f9ec1e857b61eea2ef39eb73425aaa73a69ff871be0d795f9efa9d52b7a8d40dd1cb2609f1e3b718c531f416de2d142ebede5edeedf53586e907aef3a54b333579c6b677ee1f6ea111aa616ac05d6892c9234c4f348de55abe4633f1ffd9fe1b55b59599d2f0eadef785cb0d419779b2e652d1ed6bdef3a9d57e2f4b98672ad88a3583a936e38580fc2dcd0ef8311f79ebf607c8d611d9554674dad6c27e3c05d8d318a1ce1f73188d9d327b10fce1a709c2368b6e1049d0bed51e2913dbc2de7d348a777449a5256cd1158d40ffbdbacd222073591f572df5f1ef1239254b17e50f0b7b0e88fef73a091f732733cc95d69d319241a70422e1a6525239ec872f0bf670b7337f5f785c8efad9636a666cc0046902eae8eb0e95d6e40f2c023d5a405726a77d1a7ad3ee9d6344ab4b48c2bd441c1b83410bcbf7da3a89fe3a26bdb079c9199a4067c9616c411af9cd97309b7122ef1e1fc7590268bda4837bff7b4e4d9a403b0cf78bd09ea63d5ae74df5954ea57d6d403cde7415d33cf365f921354f7243645b9de900480f177f983df3e6949b79668679552d1870c5968ab79bf751b1337c6eae8089ba8262367c4867d8ebcbfc3dc470f673408da133b67ea51bb93ea11abccd5f9e7735312454f604c2a692578ad619e8ba324dc5e849a3c8ab93c8466f0ff22caf67bb8b03f743af0e5830747c67be40c9c28ea584d52f69a869dc0dc14516a9a2b679244b5b70c1f186443f3257b6d146be78958decf68aa1b9d2de88bc908746c2d65a31a02dfa4ce02af64e38a295d83ecc49834e2f22df173c107213cd41f95e3e0453a6d536599b52f11941ef547b181e6136390ea8e8d4824321dac7fe143211af79e4903846767ee2f2d6a78433fb2af5ae29c8c930d2f16616d569d7824dbec08bb7108e9c621d364af3dd3f56bc7afaa03ecc232c0371532dc033fdda996a5d51069875623798dc94b4273ce6192e3a60bedbb3c0c7f2d487656edde1a2cad5a8ff7d34b27dfc579c8de7448bd2621ee1e47ac6d82d6b8eb90576477c209541c4f6067e7a0aafc1ac90035032d82dafe55f29264b4863ca5ccfd383357acc6b9a4c69792b4e14e30aa08f03854509e9040e5b1fc12e42ac6fa66c32324352195138f0880d86dd83d12b0852c75b5249b91bc339a5ed86f98330d064e11b449be44439a0529b556b76ad7c3405388971cbb083eeadd1b07b67c9fc660e852260e7c6bb686a2c095cd023a630a5bcf38a51cc86ac7920d3adbaf9c99a44b61033fb25e53366c67f1856aa6bd5c574c1b55f43f0df311df44b9e567a0350bc32fd8699f1ec5d2fc03600a2dce51917278f94f71e429fa273662ab5fc250af96b6854d99075458e225c1cc0d2fd5435e2126fca7aa6ba7ebf8e1a74f628ef71b98487bc11d4a3810492a14f09a113e6d191630d1eb4d44ba4d8380844e851e4881f208d21176c3d91509148958c6b5187b140afe3a8ce1380ad66c40f17b1b82a876c7d71cccf2b04b588de6fda296e84a71bad0c228d08ddd778a89bf075ed3326795343d7e0c046479c779d8013d217e559709f2d51a02024be9d861ef1bb072e973c62274c02aa6b6a49502537e90913c0e17c504fd6e6a586209b0452e6fb48ba97ff8cb162aade0f0d8542de017ad79d37979ca42e03c8ae5bc556faf2510661216cd6338e474481656d039c04d48eab98a09f7ab2c479718bbb6624236832defbe44cc122f5c36c1a178c1245b09c7bbe06ac468f18b085fd9fe21ab917d72c92f31e4a5be48bd2490750084eb4ed06a9a9d07ec6bcb4e34a903f013e7f429f25f71451659edd2f975ad0de32e05ae3364bc0979a6aafcba2692a36c79ea44041ec40d0059d5cf73466e174610de40335c9ad48167a0f7512d97a2b6cb335ee992d83b639c01d9a8fb01a9cb9598629172829f8989f70a365bddbb97d44aa990c5947a9ac07e671eefe3c8682017850d75f460afda209e387084ad8e11ed5cac5ec3eea25bd24443ae1869b030d6f41a6ff573048a19f45c463c7d122ec16bd7e32631af79e16359464da9380e800373dd4e5e844a5634bfa129e015663540ddfd8b4da3c5b9ca7f01131e151dba39a208cc56adad9cc70182205ceb56b9046ace1e2d6a244d548cfac5aece3a0077990b9915d3778b7f2441380f9509fcd89f0af3dfe54d44d05a31198716265637d75b4c5088be49930b08333469253f64dc15ccb9b995e15433d0087eb869b9e8d4dedd2bde5d1bb4eecea9b20c740f8c190f076dfafea718a3667afd9d8d9e2b2ce668ff6d346685a307d44584684982ba84cc3e8a213e005922b7777c50d8d3720fcc5649d9219d065e98d212ed5e989d10f96a7aa5921a5ca3f362c30c89d805e81f96922686377e4bcc5435b82ca75f3587758440af27687a408a0b6a15625424a9ed21c1ef58c7162d7a703bf5e36c061111adfee4c099351537b5d2a355cf4be00cb17832a03893de4543931d1f6d3ebcef84ef61f5f609ff7fb9f85d2793a787df83604b88b2ff7c6ad2f6598abd4d39596271b930005e23f602d042e4fdfbcef9174fe0c2b061f35472db3e97f10ab09a1f4dc3565231b48d39e51e002e5cd644a08e18db7a3be901b6f52571dfea13e6c7cfe179b52f8ef6423e3919905bd5e04daf08827c9bd13f6e1488cd0a04cfcd850443d5389c4ba251a3c06365e48cdc1ea5c2af27d262eab393745d1592c211b8dac952a930c3a2e24707537033da6f8d6c2e8fb07f3b0b0e6caf8aea09c8a105a8b99c2575ad3a1a4d7667e7344c1e6bc1d247c65f8e9770fe0c7a9951b645167c9cd1604abce2fcfb9b30dc15cd9993d5ece2203dc7a0a8666ce3dfe87c2ac8a6fa67a684e012f0a9bcc5ff25cb334f4fa9a76ad3514ff5114664557a32bc55643851f21ef644b0992d4f28e533b3ca43f8758cb88ea7f989d96dd91b965ef639ba60f14b892ab6de99bfba5c437dee44a6b5c485be7cc82d4a8ca08bb0de5c7987122a566589bc661e62792fdfc168c0fcbdacee2add9789f2e5ebc0ae92d0a235ecc7873ce1b40bcd74d1c3b6d5598aa0ed5b5f5007e293e395f2c2921a6e7f446a836155e4cafd075b2f3cfc60ea07893ef8eb40b9d59309b0601e3df57c2909340ce8089e9ed2325deffa7b310cab43ece4e4d0d27c773c10075228ab59e7f8182965abd0dcb6b652050b2d365e7b1d05f649b19ce7b62f47ff95a31d052ad4ee397b2cca64e292c6cb37dacb1aeb0f547ef44c998b4b1d7980441e01b7446e164fc643aee74afe9a6c5a8e69a0a34f1829750167641f1749da69f44809109a2a4c5d0312929049f38f9929fb7191ad69eb2da3e357757973d86362bc6c9511a347ce88106bce57e35c4dfe9a33d5d76a1a6d7cb74766356456b7a15a66b7d2e483647cb594768c48402704e09206985cd644a3e61a51bdf1c1f451a55910932e37e1d11e7e3d60929d96a29f93c7c382870d29deaf4666f9c6498becb1dca7a0f03a63998377b82d587aead568928700b483b71483f53a2543c1eed3b9b4bafaf2d45e10ff99da3943aa77ee5c2e1a84a6f0578654ed576171308d00096ab25c93f244ba3104662f94298bcb6a7fc1bbd7f3bcac219b574146ef64bcf0cd1feac4b74bc276102781f62ca04eb2c6d085012e0d06a2c2412ab1be32698f304d73b0a533c64920d8b33530b65e16fce14b4d615f1bfb236fab226c9c90b9448490db19bfe5d529963885ff0938a175e112d72c6c4327cef3f44702cdd7f83ba63ddea8565b001d6a23fe51eef3471f828f5568faed064ab3e2390c86882b5a6ee8782f0ec6c37d98acf968e5bd613da46c36bbcf9f9f0707590a19c28a509b27a8bfbdfb730032a64bbba14471ebea2c398a506612b785922597ee76139034cee2ff3e74a4d1eeb471cdd7f43068bad806a26c8d86412362793c7823e1e500fc4495399b0011a6988eb76f3be8047a849951eb253ab9bc2767db88e5cad1100b1fe331b68968198a2e033211de0c804009f95c409a4e13210a30cf12d725bae62b6f6ca513b8e7d9ca8eb0cb9b646bb178847fbd01b44b4fe1e6b15b0ab7c2962874d5fdf70a455f03d2e4454163e89b20e6a1d8033870e1e177cc6d856457c3624dd76227bf6b5d4f0c2243dadbc11235dd58a95a272903af1ee6671b636d8f47e90bc36d5c6e070d9067e7d81d504f566d040c3f193aee5b48195fc5910ecc4926d1ebb121c2d451d3e99a2386a69104bb5c15171ddad5caf8e09d7a051b33c1db342cc4ec3d81e59ff6f19983a44ca609a48d86a053d635ea49fd90b0bbe55be786c28205cbdaee73e6ed957f8e93b8f2a9209555609d3346a1b044750221bf76b3d1c10504ab8aabb28c0aeb89fbacce4dbc40afc27e0b3b9e86a3913cbcc9bdd343045e0ce24e72c6f52b6852683fd9a61533e5994c107ca65a0d81d4ee5322c0f7168e4c2b32eba8a7fd783eec9ef68d7f20950595988bf1f857bbd3e184aca1ee2e7f5f71fd30a1075e59ef1103345a8835806dfc6a8a246dd79b7551c26a9b16a7628dc65ea8c930abfc7a7cf04f1e475664e1373cfe6ca0396d4c750d114081f22d33d7981eb536e60ed2d3ea5fa72cd046c5fb110fddfb14466f0d8c35b2658eb69742505e7d1d4161f1d4c1b9af6e373fc984baa35f81392bbfb56c201ae31e2b6fe2a22680802d51d9ef98e7ea830eefa07667879bc93921d4bf4f117fe0d328d1586ad150b58685eaaf61e704a2fc6ec854d19ac27a9d236d88a1fc310c23255187c88a5e2f7684a02098fa671d68a592e2096466c5b87191efc3163193123feeaaac57b4fbb7d78352b01f5ddf29563946a45c325c74c70e2af45167619af91d10088f0699695decdea4b41d43be14e0b0fc95c150e122d56dcb90ced5efa1ec926bcb5eb55287c855f215bf7dd0159a7cfffab8b8f897ecef49764928f3792c5e100c8a3fa3044361276a2b987f57624a509b2a119c12a678d25791101d182af43f1d44749055116496fd0ad78598cfd78bb185d0a5b02fa302f3559a5f952b9ca6e639da088792470e04ce9d76c431d94f0633b7c9893c3a72e01289b8a7573e60cec814bd2e2a553eb1728a9f629cc9324f93f7e440a11a39a437bf3ed1ed4ae684904cdc4fa3546e583adcd55d48a8d0ad228e4eca534dfa0cfe35dddc7b817f9a01d9da79ea45cc49915a2935d6226b7e0b99417c55e29c070eca6c394f3994026fdffe5382a05ef7e348dfa260c790b9549d5ee560c7a83c1ef7f413a46885df2a15f14d81d83d4fa51c709d5ddd62a34b6a8d531e04c48920e525e98875cf188e8c800876a3186d081472c3e3c5180eb3f8b1dfe1b2bd18f271262211601f7b0a7ed0620c5dfdfcb981ba7a33b8b10af6995bf36b19889b9938a460659e2454ab63e1e0d423ad0d984d4d3c0874aba21623d301d12f606fc3296c427dd4aa1bd6dce71c0f8b31b1c2be774382b8db3f518ffa883b97da0dadd6dfee0a647ffaf1e89515ca8a6adeee729e35a3a3b43cbd4826397b4b7b627e41ca18eede322eada538090e4b924104dfa67909d1a4d4941ac4448d911e21c6068c8d094fe3359bc8a26ed66962bf618c6c93f9177d5f93527789b89ba3d68a9e1b467d3616e26af40dcf7e8e71e6fd1b88aa1340ebea1c0e8ed4400f13904be8e90cb4af01bb7be6b8843da9f878948cd705f2db20ff131ed1cfa4695d6352b78a2d9bee47e45f19a30cbfeeb561853cbb0ccd307a5c95c9824001f9e74ca4cbe5ea9448f3ad32cba1087603c3627ec1c11ce2d2a8692240d650735dd67199fcf92bfac80b38d535d4c40063632bb63ce185a3c5aa992b7a28b761f0683010d3a3c058a07d8dfcdf7e9714c9c639cfb4de8a8ee7bf4efff8c5fa8ded4d8d5bf9e00efe6edc2ffc87b886a071b6e65465192361c76ef37897f7eeb2d13fc3ed6fb02bf2b9b7dc973d4a5239cef90bf5e60fbf5d6fe601963d3d39fc92451d5fccfe61d8873bb2ec8e386d2752f7d3d64f3f01b90f6a8b13ec9fdef7842f7d7efeabb2e6dc7a2279860fb434b71fb32eb73f0f199ed35e4832a03f1409b38eb0b76df9f885aa7d741f777b24feac604b4dee56aa9412461c5784182c78129ade4459596463f7f53eac7e8eb8b15c2747a3dd1a848c6a5ce7974a54d6ded7b739ada83925ab0a1c7cf2cd2a1871513c77fc80f8ac1c8b12ee425bbbeaad522e8670902a42a597f04db17ce3394e0a1423ec869dc9de9f790da539d84cdf51c4b98c5803a02c6141d1b42c2fd896e4cdc9b9fc2854f5d67da69304f70bc3c4dbafa5354a0b896c60de031a0fceb8d8c1c2bebb7ebf1feb0d549dcaac1ed75ab7e4e6ca0842ba63a95fb17ec222dc836f37171981b6b15f6680a67bbead684b46ab654d35843f036b0a51c24a73d0ad34104b473c59cd7f6083cf94079024b5f18d50b9515dcfb63b4440189659718bd1e288348ecc7df7d80a9e8f65a8611049fd9d8ce67e831283a524fa8893c9d0d907c05fb8ea777c015a1b707008dc17fd1c2646fe9e85df960eb1e8c00e6dec6603ad15190860e1f1cf1f61a332f2df442b7a48e59fb5914ac307fcccd938ab4eceafd708bf0fde6d8017ac1d2e00cdc3c240978173f357d0f80847edc43d1498c1368e8251fe4ad885606a0078415e17dd3dd3ffd23d1385c5a02fea1688941bd1dd7e547001ae785bed2b7d02b117b4b665ce3306a37af2017009b41e56ea7b23e8a7c0f8ec0766a690f0d8dfb105156ef8042413af70ae21d1e75bbc6cf8df1017a144d736241c745774935344ee98b7c964c2e522ef4d2f71f7560704a505b14fb90e5b1fabe63b43a17c3c242dd49c46135d9cc8e1e118d401b64410fdb89d04b851870846e68db8351733ae52d52bac06fdb52efc13c8ff37187a755dabfc3018f6efc4fa1fd06aaf544f0f2333083af3dc6f335a957824187d3988ba57e605e43f68deca71724add64be8cfb852099ef7382343ffc9fd367e881f3b0aaf60f7c4d7d5c7b38f687be5027a7d675b827e4aab8856986bf77858fb039a83dc9cc4b10d281a01b026aa81cfd5ba674039c9cc6301ea3a7f32a4f28bfb059bc530d5ffaf4192a0a9eb0fd1137380a195ee1f3ffe308843862a6bf97e4a071f00791d7e7ad63f83ec2b22e3ddf41437fe96f1f32068481d3108e6b47849641eb7dc8e969a596fa374e1919517129d9d0d6d78056508c39e0df6b9eeb2982c2d98033193aeea3ebb47d7ca0663caddb4dcbd63fa8f6fe4e64427bf2ffdafdf4b89bc2625f4e9fb31e01e894321a337e3cd977aa1dc8fc5fe3fba2d504dff188d77e898ab92cf566377ff837fb106b8bf986c903053ec44f263acd65661423d30c33821061f32e594110ff80588f33315b06f6bb1893c25fc0a031cd0cbd3370f532c5572e06dd70ce7f3e9a1f0595c6ec10f5de3b2de433dd9c99e5cf1c6ee3762f30dca011f14be2629f56322724fb5f885e3785914a1bcbd017bef734471916ea0fc99cf8fe21fd6120ba7fcc1466ed1d7d570ae0e4e5dbc7602331de15d9ecdc821d65d79da065a8744cd47f37eec88287f9a1f3e8db1fcc7c88913afafdc66298b6f126fd1bee2fc3b0735baaaba2a324d607ba179b396e830e238d8d884e8d7bc018e1d731170dd447bca53a2b5a7bbaa8fbcee62bfaac97eaa96156d67395cd5140e54c2d2a2af27a7e2441758528d65e5ec7de319fcdab11ed2500de72962e81ea3d297683045dfcd54856393162bd9fd2a25313003e10d822011f3d30df0994a752c692c6233f60b2c8b3c0529bfcc878685bdfd1aeb6028971a0b16b86dfd40f6f34943cb19d1230e2ee8be4b346748377b4dab8de3a2456c22e06e0c0c72a54207fb0896fd02538d305e53d20b0ec8b7c8d506cfbace3c43a778f9e60b076ee3f6769cb070ddb077bce84044b24d69a8bdfd91738f48b62d1cdac43f20f7f56ec55794515eed0367dbac7d45f2afb47c04491455d41c5be1b78c410bdf11d4ad2a53b4c854f9b111babb072697727aa0ce0fb907f1d500f8436b57fae4511fb63eb9f84bb327cbdc939476cc577c11e6b4fb6c02f5c122e541003e2feef34b763424b3f66b9600dccd931e38d2475b0edb929f1288515b644abc3327e2136944d835814498caf7553c3f724d4c102922a772db3536562766d0b06b8453ad78d139d426ea5f882d11d24bdd728e1432ed77c77f3fd55b740c29187dd6f2a12d94a1a9f096f5cdbd00d754f24a23efa621338ff70c9aca84e4c8673e6c20c630d3e315c223fdf15ec03d1968a67b7593d1fd6676c5b586a40352270eef173badbc307a6be314255c84414134650469a960f0978dd09b711ad5d1dfedadfe916503e9c7d2b31b170012a7192916e54d541ac5ca57a4571c5aecdb0894084d0b95fd4673c630f7b5d55681174526928b8a9159fecd90c6d8e50c5f2285c1a10de52e5a3b8d273e075bdf8eeaceb75da6ad8120a90e252d9880271d9b61469d08c8fa02b4ce64a3379c1bbfe1fba817488ae9373e425e0f1974a9147efa9ead2d4105662eda3737edea4c9a63d17a8e567aac50897a0ecd72906c28dfc2e41a5df5dd61c17d7f6a60604fad402c8cab492d26f551585c095ce39c17e0fc598a3140f34aaeb6e486b2ac5d458a2f1cd1c54b503d34623dee4b93c9dc02fcfbab72f621cb0e90256ad537da4a4afdb38ef218922723d1551b8bd581027ac79c5578695975b096d0200d48b0ff1aa6548badd57fadbc6b60648a4f8f4ac2699d98343e7dd3d0632c2a0cf7a6b3813a0e21e8eccab9cda6a91dc71c3c42f3c2f564d9a998b107b93211ba01ef7abe7bd8e991bb15daa16745427db628ce4cb393599bde748c1731260609985c0e1b3dfa512a42f051a7510dc3e26a387ecdf236569ea6cb1b469a72336489fa5e9576c3d93fbb9d7e4b44216865aa75afd9c27c3fa497910acb90d1e36d3e958fad04fc2a4f33e25148ae183579c210fa8bed9aed5661943f52dbb362e25b036aee90ea2a23918228e466e645d878670c81e4b1f2669c1cacb0585afb9db3b64b7ca2f948a48d8204fbfdb2994e1e87a7d2a8a7bc49e553f844b86cefb2a414972f2a95b6b7dd650b18298de4122a258414464a5df39e162e4cd4d4de5aa5340605813ebe403367d7f157a93793f595f53aca8e2a4d7ee4074012a02cb5323a417d8eeb494eb0cc17033de1d08d65c4a4f9ddde4cbf28698699cc94163a910f1de124935da8a45019f05898fd4fc183863573b1f0d67572e29f8b97d6f2472f8b711b7cf173ad7f50d3a810e506a2ff93e270281a5ef40dde744ca6ca4b71e811c76d801457935455bdcd5f855c3d29d2a7d3b9d78b5c48b88df16362af28d795643c440b4be67229f7ba80c4bb4881cd168195b3a196bf2e5531c60d60dc6793fcf3866d691cf8cae131be330ac3c01830c027ccb88d1527d6425fc37f48b27e8afc958e277c4113910103c7d274b61f22b4a04f7b0c975385979fb794c20dc9b2ca5f8cd90be81aafc8448fe77ab128f429740b51918408ce4b4f3c05423e52a0347bf44ef670812a7a9c1a9bb93ad9854f1a5af49d0bff294229004042f513808a35fdc15d07533ec9f551ab32623d2dbfbe12029110a141e179e4d2efbbbd6e4212fa114b78ee6ad47d68534d195204d625040354bcfc573e98073d8bdf549a6d3485c382716bcfe1ac369898258ab299ab2c1d1ec2f3d79482903038841b46663e68ca4d6a4789f0ba25598530bdafd0783c2bbcff336a54a995f8f67d092546acc1150fcdc49b036bda364c1042cd0a88a19b9aa890001178a8b63edc7b773707e26ffca4bebd34c8cde6362a4afdf31eefb46bd79db3f49ade0b7a5a9e134ec2c5d0104d3848607b04818f2d42c7f07749c4d571d550c5023442af41bbb78512eab19f8f7674a126fd20467509033cd228564d178596f90d0c55260a20e153a6f5c6da7e1cdcdbc5a192200bfb1715311b7ce8f379c802673459710d3d2682b1ace45be05d605fed6552f7f77a6de7f6eeab7da6e7ce8f78a69d67a3fc478bfe9d7fece3df9f8a13e95e0cd73cbd49b3e371230cde67bf52a34799f978baf0b5ab12e5ffe67c2f027a8cb8d59e610e749a61eafd76f165cfc1649ef71f48647b7061e1669de833b89d8b5cf95e3384ec121a1b741b13b7430ed13e5307ac34fa1fdde82ed4f34bb3164292f40a57dba8d8a34fb76816e746a2c1b85197dc3081273fa7d23c6d296ab2218b76353f59388064cca506d4d95e486ebadab684e182f53a84d851e0facac28a7863c485c039e862ef22a152e74c17b250a9a10db26196755c0938a193ffbcc80e62d93468ea1998481dc5062a3d89ec69a2ebd7e3cc9d739145bad5a421896eb7db228eba4d5869885a212a382dec9184fb2bb12f43d4a175414e6eaf22f5c77ddb3488e539a920284462ead356142bcf3041cddcbeb22cf6a8f9c5261f769f22b5cee8f77b3a0580b44a8f0a72ffdf1251abc5ed4926ffc98851e150de81ff441238c21a8bae46611d933c3fbb94fc198502fc0d639b45bb04137fee531b1cf9ea4898b52fe3ac9f0ef9004831cd34490ba5b957070f302c8fcb117076f67ae27d846de2ebf9bd1ac7aba319d39f3b362c774a666225f58652f7dbede7de62e5d5d0858dbd5c90be6aa5dda51889584019af8a9ffdf3023f686ce85acf977a6e2cae426bfbc516c432f6cfe1bcaae638808e992e1bb47b3fcab9b00c75a8173c74f589730f38f4d6087b5440f413f12ca5612e095125ac4b300e424008c16f6fe99898d129bf596bd25b17060ffb061b3b00d5c43454bb21f063c7b03d062cbcd6be4ea4a86b8deab28c7bfeb87be73c8a8959890216864a6e34a58ee9ce02d5999ffc9decef9cfffefba7afaf3d92b490efd4a83c3483591a2748b66228cbdd1e7420fd46f1d26b0d8dbd83601e15a5d76087b89fddd684d211da4fc42a611ddac22dcb3cf6d6fea51dfc20f0cd3c3eba248ea9967fd84c248ef6b434b16e0b50447329e1ed4ad799b1a0e1e89dd434cecae57d6949670520c67c9398ec2220a77efa2e1893420bfd9afb9d50b2d8e5173236941285a45670292538054ee4fdc9effbad56206d54a78ff9d12916ea0f1a44f8169e209a0a3ee0fa71fa1153ab5ac683770a1d48e59da4ff59a8feb9c364f7a99d25aa57cbfa45b76a010cede3ec6219965f0550bc1443f8c6010a8298339343a0da30712d740cbc81d24fd937674451a1993bbd75aea251f0b43e76a4333aff96ac2b34df28ec2a9fcba1d5a87884ee61645558b3074812f4f53b0884ec568f5d8517cd01cade1e903f784c6e78869bce9e2093253f6407452ec3ecd9657efd68191d648124c2392f0597022c91ff866a946a2a1fe2cf37d61b99ec177a85efc6cda315b1b3050bd70186123a8d1695e5d927ac39733d84024910da51c09a72aaf082471980db826fa885d6aafad98aa269a65cab6b0b2f992940c0fc6fc1fb6ba1e1d79ca2bb15c0580bff044d6076722dcf7f8cf5fba79411e6319ac2686fa8d19298074af70b8bf8a241076ce88b093cdc27699b66127a3031be25b6d82f0543a5006033d02d5678a3870635f651351448ad649e90092cbbca12fa80262b42a9c2903454e30d56a1aa586d20f2494347a5738cbb5aecca0d6b226a7be8a595337738b70ffbf523f47c815732b0c02682e417c3bd3f3d5984cc04daee30c98b5d497234c12f598c79040054874b3ea8e01d91b50080a498c2025cb49d590dd207a6ccc7fe26321814095f28518458d7016925b4b39413882ea1fb1b2580e58fa7e69bd549e1b0a1648440ede71cca2d68f0fba44283f498c3c5acbbd885a187888050677f87728a62493270134ee7ab158ea1da10e82f243908e25e8908885a2746b8e448d3a02c9c3d0026f36780c81cf052efd83b1c9ffff815fad11688a308ce38e52c632eb9e4cb59c26e22e8a01d8cba3148c1f7af3ba17597cd95a3c9b78865fdff3ad553d340782be52f929d83f6f4d6044ae82731e51ddc9ef43bab1e4ae9a22bdae4e98c7bd3de47efaf2dfb54719408e404da99e5c834b5f3b8183fa553fefccb5f2bfaca3a4e5338a7810b4fc1d0f97a13403c7599a607bc7bd121beb627c83fd37283487df756ea7d38b8db9fe57ba7f9ebcc6cab3ecc7d70127a0f0e80a111b4309ee7a6118085cd548e8b797bfe2c4570a9ebdbfc2c44cc8852f45d3f7a7e6778b553f42a24c6c299b5fd959a111cb9c97b73c23a13dd7e22b980c645e40cdbe23d0ed56dbc18b95d03ae0e698162182c9f6ba881a4849681c3ada9fb6c906e7eecfa39e3d43780852e42121622f84235255fb3f7db690db4c3d1fb8d86e8b8c4eed38e05864fac37d926c0a29c4aaee6f316e37bdedaf8eb1fd3d957b9d0a24197a3539bc9bc76bb314bcff9e84db94bfded0c195e28254e6042e6a563e8bd12793134a919d48d012fce325c9ba590aaef758e70bd43757a60dc65a6a9138987008bc14718be687ba42bdb10654a00bc4a644f65e00a61238e892a70ee5d56d89b1345789a6f7e5000c82e5f9763385e62e1cb0864e1a2e89a7be3073adf92c4e8854a1b336c8c5414a768f3ab4a9eba29eeaefc1f221ef954297e597ba3615d3e3792a332ac892a0899fb259039fba984484cd435c1d8bb01d4bd3e63581dc277440eb28be7f1966315312ed1500e9b07a39ba5e6ad63ffc146f1fcda7aecb8645d2a29a7a4128243041bc1bef1618de2f9746160f47c28f6852e466e2558ec0f27607e9ace220347b6ee85d443c8865c1c782c88f2cee8556f6d37b7a1de249d3a3c52ad60b4c7fc83fb3124a6c7da2a1ecc2e9a1f0a17a5568287e0404c60c9b108cb381325606fc88043352579b5e3c11e84478e8ee72d9cd989e4ff6e3aa1234f7d01b6cdc03fc7c7e1ce17bee16878301c8d2de0f64de9bedddfa953e85570aabc00df6c5e8844c4ae92b82b2001c16a60d582f960e73514e19a1d7d97fb1cc82ebeb0acac2c1960c8144a571076c28caaed6cbf89f803a96254ee3588fb6c5169025046de87a04460be98b2f22da176a460464229239549091ff904654dac96fee466eccb16247b4bf75b0e4fd1feac1a67548d055705e75f82921562f76c5d3fe9823c76702c33a8b0dde91b4e9de9541882b6dccb1d4bc1fc8bca7d7bbf5e930f94caca5a7d455be1ff3a05b3d3b61d6c5736b9ee8451623d443bf977f558f425bd6b9ffd58cabef15e5f6e491df483d4e1fa493d5415ddfe79e1de7b0a0030038ce77a30822d93ff8605625319f6d363f81d237836a2ea2eef526c53c92d7a43100f0184195fe42e0636c0d9e7dcba9f69d905094cf23510a63003a30d874f7aa670566d89ecfadfd4622987d5e4ba5223828cbb662ec7c2fbc881f427c354261d028688879378dd18a404fd82784e63b983968f3a8af2d76ac10c66f8c8cf336bcb4292ae1bcf565d0ac5760f324bf0a78084515c034b32c8d71fa53f670d0cd479c43f16aabce9febb19edab9b60eed8de41cd5989a2ffbb5bbf1e32936f805e0e3845abeadb68c05ab6b8205c860b73f76572c45da3cccf247d89249ba60d3c72cde0ab3ff9ee1b025b3948adbc6e02179905eb6365be80ee3954ef3a69bdebee464ad0f1a49584dbc88c496ce703b18436259bee9eeba3596a13ffbdc222103788ab1d322749016a8879f4840f52841f018f87f09efa5dcecd0e34932d73fb92ba4b9580261d82c63eca0c56b0f1a6d25d01b70f661fc0f7d7ddc84f14d0addddb46d8cda3aaf5c2a47152135280cdc9bc45dcaccd52714e209f848bf84d1a43c37b8fdf9f834334f65e4ffd1f6f18bd3a0479d008bd179c9ef18c8baca0a2dd1e4d79d85858304dd3b61aa7d5a69b3910780cb355f8d01f33e13f4335a95a21a6729857bf1b2397d9e2ad270739354cf8c06a3137d6fb74b872ec25ed45534881cd5818e044ebf5b540210913abd90a0b29c28b69d1856f01e01eaea889ac3f67e058ea8d83d5395e3ca98a89da33eec58ef9ae016956c3c913a647632e87bc54810966d85442c0050325cc681b9122a2fc5b842860491fec9eb277a0dd3ad7958d2ecf91bca76bc0374bea8a1caef412040258e846f2ae86aae6edf2c96c7f6df29b9bbf1fe39249cc791304b4b8a886adcf68af96bf853c6df5a1c3d48289ea36041113896880178dcfaf39f10422de08a79af3272a95621dbe26231e5e5e9101d632291231d127fcc4481f6238640038bd525ba5dc0e18b57661569bee11712711cd0bc4a70394f55207e7464c7caad5888e680baffcb2810c7d1e95314e322b2dea7e024132565c788b293162ed4b586cf327b7c1f3684161d21186f0e3b87f160517884e9f2c9340a8f485ffef92129024c15cfc82226102e74560bd567fe2559b679526acf95f6b8a75a0601b81a91dc6382f59f912bb40211609d5d8cc201b177e7695dd2a8b5bc5fa7c19cd92c024107dce6a004d031f217d68d86fe4685c850abc2fd0f34a6b6bcc654317b0b125be78b863494ddbf6519b245f927a4673869f7213c1458717c6fda6b884862e74b6523de7af15634197513fa2b4706da848ab6bf8280de1fcf7dca7d7b127075bea38de190a33d7812ad6bb09f05dd500f75fa9a1d3eb76a31262f690d359d82e437d4b752c4c904872144c847f0c7cec02ceef18bbcffea4f7b79a966c6b566bd0d5278d48ba69a2e8e286422d8df8647a78755e743e06bbc19cec962033237b3134de52fbdb470be8c6f2de7fbcb0619fd679b4cffd9c6f830bf0f2fbe19fbedf0d8f9ce85187fe26d90b3af33de3c6b7d269c1a6b474088596834cedd819c29566442d925481809a5c6b4177062179634d4c22ae52cf659f28ce0b52d79ead2b242e74c2d7e4e30ed7839639a4222cd41b90e166592ca0659449e6a6634cdd459b24487757dd2c21c77f6df3ec3bf3ec2e2d387b0f9f7115e3e834e4b58fb3143e564a689acb3926e42062ad3d4a4e6b0a455dd81427059aeb8977ce9f16e3f1b51cca924d96924abacd385d081cc1435d724ac695957a0094ad3d1b2ab3ee3d0bace40117453a2998db18a357bca834bb394230b9b63192b760725a0399956ba348d452cd889640fe592d9a7794a91810db18c25bb831c109c4c539ac94ad6e92454a033859a6b0c2b5ad725d004d954b4540293ccf7109555739550b61be7fe4f4eba0919a84c53939ac3925675070a4137194d6c8e9558b333a880e69434a791acb24e17424750e3bc1aae00be0f86ccf0699a5264b349ac63c9ba5aa0074dcd764f39ded9f7248184fbc73575917b750977d619b7d44d6eaa8722a0a8ad3148bbdcdf5cafebdcab4bb8b3ceb8a56e7253dde1ca2a742c21ee650c6ecc1c6e9299b89629b83393887f64ade69b7fd83bc9e214912771c7ffc63f1eafe0086b5bc28f082e5ec50dff10d7e8bc8fdbfd092eb178074f585b126e05b0b615f7fe437ca3f33aeefb27e147a3e5a5f873c6c4fbb8ed5ff089897770cb7fe10743dee166c6ecd51490eddb390e4ace73c4fc1f6b8b8cf9827d49277cf18a93cdd959fde0010f925ded112bd606cf3044294d4948489649e5bb3486bd5ab11fa6877828302ed88ef0f3ea1012a9c89bf504ec3ac41e20554768931d9f4d430457f5ee328c897c4a044650281a3c60d1a0effd447f59460569a605c6fde96aa58ba462391e6281c55872fa8c1e5ea89deb10c3b21e8a41a09d52a1cb95c9bbc2b30fef0a0cde320669cee13566186bed2ec1385ac7208d6cdfebe27d0fee09dfa9e73bd6594a84a343f41b6369736d6285a7da9cb5c97bd1a77b56ddfeea0293658c6a7ab8a822d0d928237b5376fcb37fbec6101e2be50f2ce0dc4e9a390a62ec6793e8a3ddb5a52f6a04e5a24611d3526c86af495d23553a16564e4c47e0896825eff448b00616d7d47323d4cd928b92ca942754a2e3fa3e0025dc855e2cf29b51aba72f549d44c1f737bb9c2c5594a073c1673a9dc41777b3bea2e5b7e01f8cffc4dc2344dd65b5ee655a95a741f750c53c74b722e582528b03d3637f78f320a84c0eea6dfabc1b095776570d3546aa9f695138ee05aaac3ef8427320ea2d225e279fd407b68ba4e017de3b4957a877b1080c2f051a1c6ba5551048cb481dc419bc348900023f1a70d2ce4fdf84b8eb9df6510e60c22b079c4043120119812f49dc52926d915c2b2169114b646ed29e0609211eccead0076a416c002b2fa01770a7fa0615ac3aaa63748516f17f0adb09130a980a3838aeca18bc5dd77954a53e9a51be0a3df0aebace697fbfda8fe68b65ccbacddefdcf601da65de797beb5423e9a2f5d12d2757eed2c530fbcf9ffcc5b2bd4986cf0458d243576d4f8d11da57ddc9ae961c6872e70edd264ac65ecb3df0c2b8d308d6fbcb75b9155cc26b355893443a58b31a7f3a75599fb99e50db65579976c55da23a4afb6a85a6aab12098d1b62d2194d74b7b3a60b86c12a366798babdd9ea9756b42a9192eec3eeed06fbf0bdddcca042c50c0194e18332c69421a68c31baa3cfac4b57e1f06dfed9ec3ebf024ae424d10f61cf6bcd6a7f6cd17b20d2acf6a7525b43a544d622fdb5b224a5f740a42246943c8c2fd1bf50cefdbf507873ad94087bb652229c2dcad67befa3f7655f53de2532fb2db942352c3dfae3ca9268a88665139c9344951261fc9277c9d1e37fa1cfe10fbd4747f86d32fac2e13b9917dba39cfba29cfba2f09de0fc4993626c33d89add274a193fce0edd3fb22f2cef926cbd24fc7368ca6f72add03c4ac2e13bc9b92fc24119cb218cbf7e964393063d96b5a30c1acdbfd1bf59223bab2e9b4c5e5aa593ca3e4868565d299b31a234be343dc2bcd336627889a1274615e3bb6f6ee8cdf5fde6c669955aa14fe9055e3aea2cc16c86e52c4d01d304992e3bc4a0bd048004448aa040aed140fb73fbecca9f245bf993e623e54fba7d76c5f09dc4f06dd70a11a28ab7cfb7cfaed8c2dfbf13bf471eebf44be7579cc5940747acb2455569be4d6687f287def7dd3ebb3c9974abfc921e83eefaa4ee3d5ca64386b8cfac0bc98f85e0a77456892b4539ee1ebcb9f3786d4c4d95272b8d6294b31c83f2e806e247aad62659fb82b1f0537ce34cdaa4200d13001105036cd077809d04e80691d66b2608d513021d700446741b33ad0292259e4075d37ce145172a480117345b74d3a0a09b468b6e9a2c684e1047b5b30faa61d9048661f6fe1518be478ac49c556cce07fae8eba32fdc17b93efa8a2f843ffa8a1fcd9686b3f3a3af88ef7f1fcdbef4b42693f53f2b3f5ca9a4b53cca2c27bef199f7387bb1f7bf5dcad670ae4275f39344f8a32fffe86b562a44530023badba34cb24799cc479af4e768d21f2c148045cda4b14963b02b76982efa933dca247b9489962068a2e0497f729228d664927a3497feb119efe370a6b59fb53cdad9ec2988f112ae56a852a248672beb37f9615b338dc63e866996f28abd334cbdb791c6eced66675428769dad46422e2197f8c8eb0fe524518cb7af9428563b9b579542799486278d75391daed6c3980a7761ecda8c3f0fbdc7577ed867f6976492c7db673af384132350a17193fe5cfae596645bf4f466d86799edfdb2bdfdf43cfbc13e10663328619e857d36cb608fedfd037cf46fb5b7cf343f9616e67d1f8865f47eb0fc2118bb59fc38f9d10cfb8bfb0afb68fe6886658fd29e1863bee7655b675eb0712237be11e360ef8fc49cd50d4bdc8a0600432278234b1a5d9233b11fb8af3d941450a7a8544a7c94782a37292acf7e88c5ba4679f643eeee754a023c3729cc0727c0a287133a28f199bdd7c3014a7a9c086c7ad64b05783c691f61643c651713f9f06841135dfaa7ad364de41e22a0e32b25f169f38148691b1080b9e1e5026a1db580bcc7739336089e0d088874cb1b0e1675b4f083046614e008160d267cd122c7e647005f0837365b70c084b0e504590a5bba1b8709299070d1dd3925a460730c2055595c701b264ac0305aa5b78ba6b100cd966e1a22ba692ad0365e9eb0f1d28566886e1a217ed050a0bb939e38f9e40df67f73ec9344fff7f533dfc6cb0f9a0948404b10516880c8d29386668a8d07c8687ce377cbc9dbcdc603583acaa4cc03f3fe9267f1916e1b0ff858628d25ccb0b7bf36cb2a78b3ab70ae7f731a5fc2a73d4fcaf08d5dc2609b2e46d41061d3c547171edd3518982140960b588002361d38e24193a569f5d2257abf9f1fbe6dca58b6d5d2283163eae59957ad27417bffcaaadafa184bcf28ff0d53fe244182eeeed136493c914406922022891cba553e74f4721f7af272157695d2276f3e7fda6e9a1fba697ce8a6e981c70e56a620510211708056e5e5d1f11586f114a1cd87cdef217600432e3cd02aad34276f2e7f89cef8e89623061b24b2c81fd84356c59cd4d0028d378de7d96c4cba6964d348a16e9a8ea6a3194233e48e3b66ea98a923d2c0984b4bf3a4774b867e5a4d805a4b908a94b098a167ae68a1674a3053848117bef131b06383012246f4002f790a158d80626344ca8801747b9e04a2c99beb3d2a976455f23c095495b22dc22e4f0281718110ba3d49b34f4fb3c0025eb28d05ac74871ead66d95f1a14e463b3050536450c4002a12e79fe937830c5f773efb323f452eab1d9d2753b2be64be6d36832f648f7eb7ea8f32ca15099ff4ecf7e2aec2e7894e577954e11558e8e5feb39ee954a8cd155465c55c4553a523ac73b478a449dd0cbe5e4142982e9928d5d70becce7774790384dc63c2f85ca4f63b1304dfeac1ccb661da6c9d80a77f73fef6bb6ae4be938919cbcc5146c885341b912254e45c789b84d4a8755f865f4e6bfd9a7b9ccb79b95fd7579b514c85df06871b95a8bc32ae5833c5d94165152e7337bffa3defdafca5c65be5f6e89bbe091266319fcfad96796055bd1db6398df57cda75e71a6f826674c93d42b8d5641b779ba3068e9954b8f1dc3e2cc7b8fca8c3b9afce96832469331a79e57fad3d616ce49222966b2348bf58a81b8a6052e4d0071c40608158008a1fb87357e28e3872b9c855fe52c95b3f04c1126f460b32442f704faa186279512c5ae739bbd028e8b704e12e516ce0ee57e5617bec92b8f28ac064c0f45b8c70e363c84a184fba2595d93c6aa92cd606bd29f1a356c32571750c436991dca49a218b1e3ccfa5f52fce8ebfe0cf2585f56a98dde9c52c96b515e2d0dfa4993622871d7ca68fede869dfefc5969cc257e3a6325ced4c7424984729f955f9f954b998a27e6d743cfe3a4313086278da9306ad298e39b9c7bdcf288dd7966754c3df0b63c1e4df993946d912d9af68856e9a43fd916dd97df24dba21e3c39393aee13c3ed630a9a7b1f533cadbee7c99aac7da030df8af3dc3e671eac4489cfacebc4af16e623063ea414c9968c295048531540492fbb5628683e4ed65ef36ff25ff3ff8218bb80b0007145cfc66e21bec91a715f73046de8367b9c2fa34b5caa0a72f9b5b90b65337b7f26a3332afb0f4fcfd6bc3ace0e29d5bf62af90bd7f004ab4642f0dc2b6a85ef0677aa085a204ca0844402a105298a94112e166670e9b8f88951e423e5cf727bfc62ac015dc2cf2c4be9ea8c8128bb50a4960135e0943c77110c98300c346038a40e3072c68f01044b541b865279834e90493725fe494e86e3bc1242c617682303b416c27886d722f2cdd17d809da092675c4b15902c35953fed03c66a15736d9d780b08cfd9d5958aef6ce6095c232f8d1d8a4b10a56f0b35d9a15fcfc6110c39e36c12a39992bbdd50bc696a82761dfbf0d276b19276b394676565d33a3991146ba5608e36ae9fd59959e26f1cce893447866942b7efc1403fd3dc232cba099d1acd449f8836b5836c1ffa13cb2b1d6edd259b541322664ab980bbafb15b127976e577aad385f56d0339551efcb2df1886f3878cabf1ff83689cb5582367806eddfe82be2c7587e61ac52da0eb1cbc91b8bd5e1ce67f3bd866593297f3c0f149af2c706d9972daa4a3c623550f090000f20a850d12828b589ca2b7cdb6781800089b406fa570b622c73ef3b3a0e8379cc347604c9ec2f52473149c1d2f8c6088038df558332e078d5ba4d37a0d1dd9efde48dc562b16ef0a1bbc3b7b13e4b0f577973f7096e40e1da283ef8f4ec105170ba6f368946abfc759e1c0cd66082e2a5bb3114af4d5088f4943f4d4f74e81e8a0003e2928d659ccfa7343dd8bca691297de9e6a1bb7fd4ecd0d77e4a44aaa5d8a3b61b58270cf6d59a5e4768495ce01b33786b05212347072963420729734337120bdd311060862071e4749038987490388ae8207184d141e2f0410721a342072103d441c8c43a0899b08390e1d241c8c0e0841d4e50e60520657c20c34577f78905091c7577cfac208709a94b371bdd3c4052f57c7af38f0d5658ca03e887470f8f1d1e383c5ae0d1c3061e4348613ad28126073caa697c230e903146471adfd83e42cf65cd50778d931a665e5034c50d13d11bbdfa51d3240662d8877fe65f7bef1213518d690807d350adbbdb5947aaeebd9965ac1e7a354c3f21b92664e66bf8a1060538eb6f569641eb2a9f954aba8469f78c0b78504dbc709171d5c01586fdfbb96a7ecfa4a08689104f7525b9869ce50ad2a48d2667b8ca95a8f09b9a2ca0490e98fafd0f66330ccbfbb6080826466c214573400b031020f4c5fd25a3d09b42551a87358a889f1e59729b91c85064f57364c97d566e6429dab01cf258adcf8f859eb13caa2e5bf4483533f0aed29323a69878a2e8eec7e050d1ec322c18acc8c89584b4e4098cb56488204c3c4033409a0ed30c3998173cfa015b70b48ed841d2d5b06cd2b9aa4a243afe8519e59df4bafa1bcd4f73339b42c5ffc20cebaecd3229d4d1e80cacbdbceb7c663d3a69d30c5cba632a7c1bcac39cbca96cf689abd2ac4a33ef936c110c06833d71721f6662195d0a7ef56f13c66306043128306104129c2146890148e8ee26a10914ec8c5087aaf66303b2813811471620345657c1e5fc280304c48d12ccd8c93b2fdb4ece4e096d4aa2834e12268915d9da0bbbb71b976e8cdf839992f81026c9dda624af243da624deddb0ff599210baedac5258994ea3c3f49b9064e179d24b7723d9d2f829121dbcee4672d4b09acc7e4876ba1b89b70c74846f83c9904577c3bc744faaa5730d93618a0c418d6132a01acb4042f791326d3a32e648982360ba1b049a235b1a85361df1da6d9ef2a77b660440aebdd787139311312623b51e130c5a4c4654353324311999b2d35d93a4bb064977cd901a196a33b12504a2bbe6484e4ebebf54adecfb3a10ae9874dec03762d8fd0f859a15e8fc2fe4e972f2f682f7782a276f2fe0584179f4658ee356ba2f3362ac718236e56409ab94535a2ff43c82d276d718e9ae2952b30202681c60abcd1a0659acf91567f4d3167552d65da3d35d9353b3020d269c283d2606b18c68648a44daffb332ec1566938f930f85860634ab15cc8c11868a0a26a0d04256c159a6339f71c244a4892e6284fa1a3338009165a6015f835313bbbbeb98d4c033dffb98f45a33249850748861425d81da407763eaff85d883504add5d429b502d136ac7934b30130a05d3cd0f6ec62ce9ae5975d7a84c37b91a22606682689a134c336e74175d9051230210244c3144c9d7621a23189248a1ba6b8644dbb5b3b6810986ee5ead5635a91d7f9cab5ae1948f849348dd3528a1992a6880e8aeb999b688c55a329b19d51f2c6b4add9dff8ec3e057de7cfe632c7576925c480db1751454d44262626ac1089bc9c3e8d6c00c2a7423a04d0ed44d5cb7cfaef7645509bb8432b64df21d3c985800405b9af464ba323d2a6a12667a41138da9b1a4cdb4615ac1d5b44a6158d2ee2f59cfb348b95ef08756a9490535babb67f4e8a9a4d1bfbfa4bae04fbc602c85fa2b3f7c14b1ff1205f151b4c9646c7efebee5319625cecfb628d779a3fe5ece8f3178c516cdb7d9a5478a8149f395804ca09da5d32a55455a7c57e56e3949e431e7bf791ae1b8acc7209757e93d8d4fef7fab188823c6a0f739ad3732398b81385219c5f247ca6287531e9555d0ca3c59cb56455b1eebcdcce538532131100bf186c082863b31b299e66c8b5ec816853619cd493130e85a21a4a934b11dca180c9a8fb3b32e71e52451adff592d8a14799c55aa92bcae73f993e2ce31add2d9cc76dd0d0a70f7f1e9915906b9ca553e3d3d375a4bfa5c89bb7b029cc5727f8f7e372bb3b5eb3ac7995610574b1f29cc7452d00afd25eab5be7f27b44ae50761dba6005c117f263118fbd05501f0e96e619bcc0eb9db6432cb20a41e21f868757748e7675b27fda9c940fba4522793fef43099806820aec29bdd6b62e8ae81a1bb7fd4bcd05de342778d90a7f73e36fd48c3f4434c37f1e79c248aa177a9b4510ff765fb6149636e3d70da5b4d8637e36237a31eca6aff71e7f829feeb441eefcd4c1db9ab1ce5d1654d76c14fc96375cd9f7549c69e87e9129df2e6821936c4d4800e1edd261e6faab181a9264b4fe08c3156b0032d32d0404031470a4c8ce916c8d1ad563830d8473ffaaaff199966b484d79a663ad34c4e77e70fdd3523c2aca09ddd6861f3e7fcd8ed592cd887733636ab343592a96d30750ddd5d73c95af2a62680a97fd8dc5183ee2cbfbf77c880ba03053bcab4b3e67dcb627df8654a76987ae98232d0ae6677a9d2d5ec2e09213da961d94408e9c9acffe5c79e2761303a96ba8215fc8109dd1736a78c81ffb0fc55603110c3e694b1fa3110c33205adc84147cfc7a00b06ebaef1ee1a166a56e8eea0dab291e34877c7db67174c8e0c0bc118f63c09837d36db94a1dddd3d58404607dd99e2ccd01ca9834c945e7a2f16a320ac200e3a6ce2e002840d1c62e048011c5c781873ef32818e0247149b37c6d8bce145775fa11856c359c3d94d33821ace6e9a1674370f1a30fab3d9bede4801cba1ee4ed9b80fbc9ca8b3cad1dbea671247a08bb638d2dd5fa957a91b5984a159018f14ca0d2c1550c2c68d26ce7a18cc0d1368957ef1af6ca34c1b61b8bd6d08c10adf066b0347168bd5060bed4a3c7c1becb3d9bfef41998edf835c0fbebbdb59e13bc9580ed9d7910dcb97cd608b8d31366c4051f36a69fda1f09de424910f8eecbb2b499756ab95151c9c9b95457a85de98cc15276b38e270382124331c41e22c6751e956ce7a59d491c103a5c47469cad5fd259b3d59ff734ffeede6674f36e95c7a3e458e20d1d1c1e97156b543808e907c88bf52e851ea819fe5ac9f69ec7e92a8a893429318fc2bab367cdb12a2169290db5cde689cefd8560cda5a845d46b3bc59f7d9cd6db6f869357c2753fe446c33fea84ccac775df0d8cb9ca2679ccf5b1771fcdb8eb3ae74911711e1fe244fc7f0643b912ff6886793ca98f6694cc93329812cfef05b2e658d65a37a875772833fe25ba74418cbb01aa5b0d31dd1dd5006352234babd175c720d74b8d02d8000536f8bae36ae63db66e031ad22813d3e09246678bd2d8498384ee1abca03b66fc93c57a4d178bf59a140d2bd028020d20344ae8e28c069cd1a4fb263fe31be954761ec6fe2f36430733aa98d113432fa9a8e8f3ecbd32ae28434b370dc6a08107688044031766d0c50c8e98419319b4c860838c1b9021c4adb34a79a3cd64182143003220a33b7615c459cf6bc94028063fe81203a518dcc480070cbec0e00a0ca674c72e7f52b53486de4dd6ce57f1bd4bd5f762fc9bac281fe244fc314b7ae0edda99981b88d932eb1864c6d0c018750c14b410c38a5183182fbc00062ff0d21df14f1cc69818861017d8e18211b800e602a216906941981674a005575ad0d3dd75b250de640dd358579562e881a10318303062981c84f1120601617aba3bce2cadd24a6fb95222167cc10213b0a0b6c3821f2f1bab5bb522be76b602225680c30a4e5f50f1c5952fba2f72ba6705595dbd600c96a5175478a14377ec028e2e9ee822d645933854a0c4ec3a0f63f86bf95a9f5915ac5240c7ac52958214c890821e5c8ce1820a131755b828c0166d6c91832db66c81650b225bc8ce579d12c79dafba148e2b8f187f55e2b2ce572ce944fc73222e9335cf37e9995679f31bce411b82b3cffb9acb0367df85f86bd9ad2c625a05673eb3d251d04201102da2d0226b21d3c294451d597c208b2759d49c004c77c7d0fb259cc398bd559c8dff379bbf0fcf5c33eb5dbe16e75d8797c47ce5b7ba3f3b410a587081851558502c6cae40e38a1eae306245195680b1225b81002b7e7477e4e1f9190dbd5ca3516f5639b35765894c5001135013d06002ef8eddfc2bdf9385b55502232588a18a31aa6041153854714345185460a142670a1a4ce1c4143e4c219b42680aefee88333ff7a95ac6d94b7bcf6619b4c4abc4602dbfac93996669bd18abc39fcc94ba32066f61959daf705f3b5fddce579dd792628a9b36492184149f143048f123768f71dff92a1a01918008cc1d603e00468299218a39a24041146114a88eab0378c6f6f318fcef91f3ac32b647cec23f2d51f6308d753ff826bcd91bfbf953fe6cfd60896716090a16406105144140f103858f66c58ece269db4f3afe5fc18cb59c10bce1cd3a0fb572abd557a9b128669e8d303c3f46fb2ee80d893372afbe9c957adef7da55e75cd87fd05bf6b9f10d3fd04982770e82cc312f704932748e858cbb8af2d27c2b49ce812e67c4ee951aec526277e447c932b6d89c0daacf23c1164114127829d10a4417b8f2ed12b65f83d09e4c362bd90e8809e040a4100be60f1654b47fcc5a6892f9ac02156fb8519d6ddafb6891540c00508bc74c77ac1f94ca0c104154cd4989031410213ed65092f4a5e927c208d0f68f9c0079078604cab5498e68f41f198315805b4a177f706b4a12b794c752c5606bbbf494c5561eebdd92f61fbb5fb3356c37f672ebde2e497e481214b9cb1c40596b86189205dbce8027639d279f2afdb7a1fcb9faef3997d7545d1debff2d11aae76fe2cfe0533385bc90e88a0036007541c0883035dbafb63b055942914be3435511c686103606c4089fe9f3ea361ac2a2951a6af28d17a43031dd000150d0809230908242193084006ecc88017549b32a083acfd05bfdb79540ae5bef355adf3d52ba793208dc66e12d3e9f3bddbf92ae20b7e5d18f358e990213163ebd9d69021ce6252e42a426a418917fce487b9c4c1e5082e52b81c718981cb09486cd11d59ab18e66432f749ceea609dafa2c73a8a298cc2b1eb280da5f7352c6b9efc6b67d585c40e1226f4116558dd1161aad1115f3e893b02cb6c1d71a46593ca28988401336618d0a11d031d064830c2099311b9eeba6b8196c4dc1bb113bb9fbf7cc2b7791e8ddd3f9a5616be932348409f77d223fb271790e2025cbabb94ce055edf4dae7fabf6d2a5d8ed316ec51e8a05e6b0c0062cd000a13659a0c723b6b30815148183a9889dee8ea197a3e1db6220063d0f193264487c1bdeb2c496275b86b6f46c4161cb08dd6d439b88a882082b2622a274f4bc1bde0cc6727d1abb1410caa873d94f2bd3f1554cfd12c595c5b214f6e10ee55d2a49c7575d95b2cebba4eea795012539110742194d2b23e2c7ac550133ba3b7a1e755281fc49157040a6b7bf6f93444b7c5e8f65edc3f8de252cd62b8336acc13e9a8730a3bb7b882fdd1d6d6b88af3b0e41430f4142377e1a0dc42d21c07816220bceaca09d499c10b58f662148c0996fa280151d3f9a294081ee6e1f97ab6a58d62630c50488304de0278044026848c0879b1b9f59a44abbae8bf597b494400b125a685a9e680940104f04d10501640a0208103e00c20820baee9066b686e4eeac95cf6c87e4441ce9a379fe95ade21092d26a6725f45272e93c1fcd3e5d75edcc57b1be4d667c63abf3e0befadf2c931f3cf003961f8e7ca0c387287ce0a28afe61eb01f52066043d2ca0075b0f4d786883071af000040f3c3cf0d8e14b775d90afdcbb944e902ba6ba6c6b18fb68065d915669b7fa68f66b69961964b9c294e5872c48225046048488404f0472202006021a80c01104801ea0830708f180dc035ed0a14c77f833bd506241beeab08a85a77ca45890af62a7b37a75917a38d3eea3af2af35c255375afce67b6eb522f9451e7acd057b2ced67095f6368a3ffad12057d77d20ad6159eb7c15f363ef64a5511ca40314930e26981c40c6015238408b036c1dbb178bf5ea3c097aec5e9d7bec96c48c1fc4b8c562bd3a49143f9a5755d6b06ce283fa68f6ac8df9e0994f0f6c7ab6015da84c9132c5a3cdda56038e7832c5612a53eedb09622953fc6baf06c4d0dd3e2c960fcdb1f4574f4fcefe789e9455068460c262069621b034e978bd550c6dfe5aced622e9b46901255840071640846901411d73727254393a4ec493b2cea1f82aa6507eb3b7eb72c0410e3030e570450e52e4f0c59483027208731082d3e32efc04f957235f455fc5940ecac8573e3dee4284c1c2b7d909a63adcd70ee5b996c1d674bd600ad0a2805a6d29c08454f6280de513871e74475c0b073034f6c2414b96d3438943cd16e1e009a0a39b4902b848008d558ab39e5b9b31f5982901347cb5a62b7774479f57cfcca88811f04a92e98a90e98a4d38453833852818e47ac8f5e44ce88ea99cbca1a848c12b9a8b5da7137f62597339fe3ac7d9a3b43a3df4268df14c1aabd4840b010e02381bae8437565de7333be94a4ed312104b499608005e017a31af62f628cd56e9ade1eca53da67e671ec154764186c274f304bace57b1abf4365b5d5ccdacdb1a8e564bf3f568ae14b472ff684c0b6fe9ee9609d3206bcb8483442aafcdb92ff2f161b15e3d336b7b72f6a767d6b258af6b80394c564670adcc4c565c307d68983e2e114b5a938138d5a13c530fbd6ae3f43c8aa357be4f2bb321a6379c307f55be124cd60a4b3bcada376d2dff4d16258dcebaae5aff9877e473bf47f64f303662b1eeb5f72e995557c6f6a392536452296224f7b39aea923beea0a9b2a68a88dfb5428d89c796377c10be0dd642cd1d4a4b92d400d15df3c38f0661e8dafbd3d6f8d05dd3c30e5e6c65ba25ee8b90b051f1c4649bb1d5335376305549e3892a5d5a70531559054a15a52a475568f09945b9a9ca0f13f582461163a62dd8ea59fbd5d430d558505b8195dfb54238578a69f227633a24677d5a6b6684636052f8d1179e19e17fa1fa776674ff0393aafcae15c26096d70ad95975cd02b10afacc118fe9e98158e2686de12fddd486bb8c2f99abc4fd3aaa4229e912c694ca149594291e5b7707532ff2fbc38a98eef82d2b56b0745bc9e9c6d40a09dd31ffed6693be32f10b135ddf97eef881b64c77fc9bc5368b68bb3e591ababbadc7a46a46fd124ff5ab4e6e6522a6556a8b3730b1bb69e9be4589d35d372f4c4789ab96b63c2f318fc86687ad4b77bc56565b29980a63d6b6d45502cdfe7e458c803e3e3e9e47633e3d30d80dacf4a32fd4d0a8fd5073d57e9c685bd0be8ef16fde7558ba2a762c56a5d403679947e2c752f68a5e77adc7229176518765eb32066747713c6fa6c40cca2c8607e3c33732679065c6a60859c812203b8a5385bdcffee73659c436c7f94b3c761e3f36b33e640828cbc9592d0c56e9adf321d1b152ec8cd817f914c786ba5b4e40da709249240c9d19dd0aba06743bf16b39e71a8de29ae4a924949187d54eb759e2d0c3f8c30a23a33baa42ef334c0758d7ed081083001f2a6c5031e244c501548ca880709a42c51423a604650c4ec7d2f3d31e3683c1baff507edfa11c5bdc4fd0dfdacb5791a8eb62a68ee3ccfa077a0dfbeb24650a293e48497280340e20e60058ba63175699aa602765561b4351e966b5b14e8ad2077673b66e98e30631372871bac1deb0a372168eaba1d410ca08e9069b28248852eb686b38e950ea800206142f1eb5b9cd2ea3352cbd2416eb0514fd890e9ec8e0c9104f983c01a234859255a2e1c5c6ab03afdaeb3f2976b453d54fcd28956a531dea97ecad73cf935ffd512c963c253520099624c209490d24213a7bb6aac0d47cd9b5286fb9bc6fc318365c4002363cc08604d87073b281c7f48c705fa472564a07657474e5c87674c4480d232e464418796d8b7c151fcb5c88a1f799568afb7a8b70d10aa7a21188a42092111960684888a125a7a11f273f383961c3c91627312721505183d7ddf1710d37a337cfb6e2fb9fe36a7f2af5d5575bc39e9337efbce54358d7c80e61e5bfe1cef3680dbfadf2ab0d61d662f9d5d0f1da2c9333294b723dd11d5d374dd4e86e277d6a72812651dcfef82aa670b514e52f17916b88c56a6599cc52962a42659abb89f86d762d9838c164034c8c60626322c4440421129c847c6867392b7c9b1773b5d22848bbf26775f92aa630c558a23cf452ab47422d096249cf92108272109446d0114114089205bd10040290088066402afc74f19325623b31c5adee7ff26b47ee3185f2bfd253b44a510e942a4219396bbaaf52a8228c3262dde8cb5771465d55a58ca7d6c9fbdd953815be56deff501efd985a55b47e68b14e34a841030db918daecf8bb1139cbd62b71ab866596f7bd9f451a086080384e06f0a2bb23954e26c56c2dd24feaf2a1f2be8f8f8f0fae96e2f91f88e55d5229cc47f64f7c70765298cfbc4aca9c947451f275b712a39e32dded3d61bae74bf76cf57c7dffb6ea53cf4e0f093c5cdc2ccf96ce8fa94cc9c99b94293c94a784ee8ee04d4d965bac2d5897d259a507b91cdfbc268db1765077b6582674f70c635a3370d19156e90c5c66f8669801b553a63b565a74dad9d9a911edd0b0e3dd3149991693248916ac94e48bf3948486a64bd5d6561215e2949f93b78f666cbf8be408121264104386214e3230408624477870440547b074a78c3e85a967bb1667248d93112f46964e466a30c2a373f29693b7979111124ca7969344119f8ad08a149d8ac4a0b3860e17295fcd54ad3772aa38e53020474999138e08706e3845701cbf07ded96a76dfca5ac6740ac524e203a2778a1f495849715a6d49e95cd00ae1292deef5d57ab5b39bf29b74b56c631e58eb4995864a081592eae644040d22491099272241447a9c8684b1be9ad56dc67578d29faec3f6fb4963d77a0e7f2ebd4306302675c40e29a0532ac829d5a82650b7136aa85340734a2020a0506256f7f91483173160200629a7184e80410630100183100c51062f2c717a819e5e18800b57b8705d4841081742721d23b61983acbf85a00d6bb8d847f387b3074e6ab3ad97d230665b48727239dc8c938fe15abc8a13b90a2cb880852a58c8e1c402664185130b21ac208315905881ae50e4a44299930a635410e2a482014e2af038a510c529052c93c67c858d7c15696c0524023911ff4101d9225fbd8a948c806041ae1f589416d18ce2e0dc6f347f96651464f44279ea076584fb4a8432024afda08cdcf3242b0534692b56c1ce278d5589420e28c8503889713ac18b13ae9c4e507242905301d028c00f0590a7020831010c139030a1869309dda99f1f6cc46d264aa11ca3dc71a655fa9eb5316ff9cabbb04a15add2e92aa992b44a63b5140fa088d3001230801f804e10344e415e700ad24310a5ee1ea14f41989c4a80a3041594a0815309b8127c4e25fc3865713a8de0a4c3c97512c134839309042713ccc46363039b246c8a4e36454e2490712241cb4fac208dfdf8ca5771e20c5a8bcb11488a28d6f26330dbef6b407c15511e4595c293c67eae5d79b77258b514c368d2d2669593c66a93c662fe389aabfedad9941d15c0152701e4208029027861041d9c465062040498fa34c2d0083f4e22e440042544304284a153087474a7a238113f72224e44b39e1371229451ea0865e4310acac8a3e749998ee7c9d4518ac869d6431911a18c5247ae4a619413392b7c2711678ac336e34c6f3e3db3525b085d8a42c062429f42e86208a8b645a7008411becd6f96a8f74e70005800401a27004cd1dd51fa0400d909003e27206b9c8050e004c4e7042484c6ff85299d94a7308892d19b20975f2b3f96547f84a71f379c7ee89c4088e3044218107c388110e50402cac719271f5dba5993fae79dabba99d1745d8bc293c2c2b7b158387c2791669b6387c3b775298c0adf96947b1f47f9b1e7a1ea635b3bf9e858ebd4434c0bf34f3db8749f7ae45ee8538f26ddddaf530f7ae251a61b9f787ce9eea6a0bde1c4034b6ec9fec9a9a6cca9a689534ded54f34204fa19cdf2963fe9447381eeb6a14f34359c66e838cdbc4089cef2874439eb0f8919bcd663759d0f8956362476b74e9f664e38351ba7fec0a96ba7ee4ebdc21d34b8838a076de8aa2cfbfcd3edcb3d8a551f9db922ce14cb1a823f77cc3b64b0238eeeaee0fd3c7365f9df5f3bc0d881a5630ae51fe8f3df8e9d2057cb8e3ac2d4d1a58e1a4e1d293a78e8a8f9c11a3fc8c00ff00f52c8f5e947657f577f319da3ce3134470b73f890e38b1c5de488d2bdaab64a582d0b95b1658a9489a1cc0f3260c848323b644088e38b3872dd9d42a95878e56e957c1559dd6757b63aabc37d6af51705cbd622dd4c2f18bb51ef6b705c01c703e0288203d5ddb9cbfdacd2dfc06f746fbcdee87963006f88e0031df860091fbcdca8c30d319dc28e33e523b98eff04f92a56231df0f619676bebff0ab9c1a5adc56eb11b51badd50a10d32ba636afe12f5da48a20d0474c7d412f550f331283fcf37f5faf8b8aa86650f8ae881941eacc00619dd5fcbcec6b371840767f0c0071eecece08c1d04b183243a2843075a3a666b6f8d783aee2b6c66fcb10ef7b5bee761a69fe57de5e4e4e8d895ecda9f495ca3d1da4b9b5d95a53f6d4a9a7f2d873e3d19d3a1d0a7681665099b486428d2440724748fe99883ae65ca010362a5d6e69bbdb31cece4e0c71a62566b6869adf175afd1e4263fdfd648a12785753878a34b9cbfd461896be1e02885c201ea961913a67b4c97a431b93eeaee380635e6479c4937b0a23baf79a8e413d7fba0756a4600002028931000003020140bc62332b16c3ee9fd14800162b856b05ea1cae33cc821648c21c400000000000000461b004c9b09795e5624098c79f82d8f62a2db4da8cb9481beb753c7d4fbcc0011a86a0442ea728843db6e9ea28405b06369186c3adf84313ee780fc84c70dd954eafb8e16a8e4389d4f1da75f9f31a087b47002345f0c1bbfd168222388e873103723ea63ca1e609a996a569696e0a3f60d3a08c7bed33fe313dbb6cab83436bbd4b8b9952d20984220b5d43340e31c519134d91a32b30f0eb627444280abb4106955136c0a1596c7216f454370f684804fcbee4ac7a7682ffe0d3458cc1405c2943dbd27b3325f10f50d2f5aaea27f2d3b72e4adc5bd847ac9a6dfdc7c27041afe45d39257f942171e1a335331236d26797a7863c63e830af8a3e51cb410fa0ac629fd6f4a50cbcc48f437a1c08bf086cf3f58163f9cb40e3945e635adbc8350628b3b7b34966a4b2e01bf64ec1854e4a8e051e4bfe512fcdcced905a14b317ac6a40f5b2cbc00f80c190bd944b6bb630ba7f03118c8a4273cbd22cc8f9e6087bddb30ebf7a6b6ffc12d590f83dab58de83b9a3782789ca57a4e0fcc97bf2ede6fe54c018879a7dbac20827cd0cd8d97e935d4be20f409bf7581c2daa8bb29a1107bf20d7880db2d0f844e075c715f4eb36a621ebe4123aa00c065e400bfb096963198a776e239c4eb1efe551a5c82b0586a3f708b58a917a50281ed99a5f7e1e5e2939348ff6fafd01272f01f80fb315c175e3f219e0aa4f88ee3094e8e263e282c9b577ecb4e8a2d9d0496310523ed58a01061e5acee370cf5a07ae2c32029e430d5fa0cccd63b5089984902d232b511ff0eaf841fa90869876aab058e62c0870d821609caac5541eabbb8e42da37086971958920080bab497b46cb2b4b68a49260ff7573c5c9d89804227f2851aecad918ffea473d6ccc8985ab2d3797b4b868f9e5d6af03906a6027d77b8d71126b606831de9d2036ef4ddb4d2f4ffb2f3f5b5226bc027741a26d284f4251ada6b49e69f9378b523f9c12ad2b5288de3218940d0866c2fdf16cc6fae6b6c14deb20bab4735188e10b5dd66fba11123e901c016571bc6568980c9d96d06a1d3181a3a6ccff54eb129946118158fd231f2becaa3123e968f6fdf47ba0de7d2268d9c0903346c1cfa6df49ba212a7a520e919f5ba354cdf68a17b40caccfa6e7e030248d47b152b4c69a91594906cfc4e562844088dc11cdc1e242e82275d6da4b42adad609c6b36451a54abf7dcaf966c0c7a723f476e66e78f61e497f9bc700caf7dba1933ad0f604b6da4287284346d1e129fabafdbdd33bbb7a329a50bd8a029ca7472185f82b83e1e5e16d4a754b7fa3b3ce5f9761c0c7563518d204319a113d57f10c8c30d5714727695f60e7b8e66bf57a61b0b7b0f366c1791d5fbf3ee4fff9cb26c000aff73799c37f20ff7f192b7afd4edf03f814d57e358a5c53422421669ca69ce5550840b8475b1044c1d1c204a61b61af3ea82cf487e90bb4684b045599e9afb1bd551b2f6f1571255d2bea727d2cdeb2bc96045e717d3c866a2afe57b57e43f018e35c37a231220d8c2e3b74a2fd2bae8cc5cdf5f295a3ed21bbdb415af746739cd5a5afc47932751450118c85348455d352f8d61138536c4f6eac0829a3d7c85ae1dce77e8477a2180176e6dff21007ec543ba808a8ee9014fcc8953ae3228ded0297b856cb8babf4bccbcc238e5646c06c88061f154331648b9e51a5db10e04805b189393d592bf228a6764f3fc123a1f6bcb6a5c7a0b6aa078491fd3a65b78381de1687be99254ec0937347f9568980e70652b0fef6901549db3442fda73af177c3e07d5a6beee297f16a4fd0f942a58447b84fd2f8c1d8f721c126c6815bc626cb88eb2d44e92f2cb828aeb9b5f82120e6f7c5ac12ca49461ae18b69806e75305cddd443ebc832826b65fcbbc911366466fd5b8621399cadf3f5e59c04d0bb89475b7ef43ff753e0867516c47ccd4881d1921591c9c102a82371eec375745867e51916fa99dc2ef666257c8d665e05d9098a59788388babe2adf32103ec6661d728f40c7aecc52defd20a2a640107d9963c0abfe1497f9ddebf50b0fb74a79d9f683d5b094760ca50883e0b9f6ac473e7b17535ffd1b6f0e1991841f89a8253278c4953d68994ffff131bc4d17f5f3db01e74df94e0bbb7a21b7821b5d8ab51ce288be1a8cb9a6b6943d252bdc6535a151e6693030f5faecccc008e18042b78f14b4b082db325c21f58a5c85e18248ea611059641e32f41414727278122948112a198d05d14091e53d46074dc24c7ff3b3e3ef8246c8067eb55505655ce1ed4c27ba980a17d52fb6f41352802a9bb3c69248706bbc8f96cc7b5fa03c1686a9b24f82ca13a9491cb727baa70f123f5fe141e90cedd2b2e3c112cf6c86699d24c829ab3ccbe3a4d93b891e8bb57e3dab70076e508882aba4b2e0a0235922f89926e5a59bd352b65343e8c3e2682fab57b36cc73b18141ad8d69ac1149820456831eabc3dd96f787b163b4c5c1e7c5c4e4219c14760a74eddce611a3a7be33fd005236b1242c368becff57eaee707e31740bd999bc1afeabf6508294894d57b3eb7aac9f5222ab1b1b314731cbc2b38a914c266d9ac507850da4109eae721ae79ee1b2c222c20306ab08e04d7af322ee1382f3520da815a522ba98b7a3b82eb643363bfbbb2d4492da5980923f37153be92be0074007448856a67883d0044b52c135dd7ec6804f2777ab7eb848773adafab7f2eb8b143ea30cc60c772ed3d6c97f38ac89cecf23fc41b975080550e7b8bcfb0937643968804a77d67a1757e6d004bf122554b31cfae2e3e7afcd5226e5487be980deeb679523c47f5b715ff96c69ec96f56c5cf357b06ba36c2afc30df38c1f57417ec03ed40913d6c490e4cc3f70e21b20913007c888aa63a7b39bd732ca1be9c8482b151b7c2ccd78c1db6c7483d6c10f7bff1dfe091db70b4b1903695e0f56dcbadf44e072d3dd6262732ab6d0f75264f3d6c7e05533f3988b9599cbe3c4638ff120ee6d0859ad23d1295689043680d7892691fd6444ccea62717e8e11849571c493b2dab75e7b62c3cab656430ec5b6bdbc1363b7a5cefa14ce5a4abc73a2ba451b333158e906ce1129bd9bcdd1e5b524a8d35d43c6f44c633564bd7a2ec710cbe008e89f9baaf3cdd27b83306d68ff1f85598f4139212a1daf97a94d0c12b4d0a4fdfffdcb86cb3a4dfdc78911fdf2d661057422739c62781c2d0985d66a70e40df538c2566ad29af2c75c90aab6aa4f1b2244e2bd1ac5f9f17f857f34fa692e8a921e8bd5762c74db758e23555ffcd8c17acb49e3f6fa41d3ed2bc42b8b2711fc59d0f4b787416f30f18b05db9edd3faad4db22f21e400818c6ac4ff389c9acbf67242b0da4652ac9968d101d96e2a158fcfb819c7d6a0a44607448150a16d1b5a7c3d4f53b09f2174d7f1978512d3f7b1bbb8d3d73c28d627108b76cc98403cf6e52374c0b976c54001eb770d821c59586c4c3829a9bdc765c410316401df09282195f8e2cfa066a3bd912201e8423121ce11b38fcd9853d39991269b63d2d0920cbc629603b68639c8175808f3244162b5fbce135e046104264f16a336f290bf9b339e6ea99f0e9176d0c3eeb11635cab78bb81d04db82ccf3ceef2fc97ddefb3b8ea30bcff557f003c8a464687bac1ed9e4d251cdea62dfd71a2151bca4a6bad751afd2e36fb60d4f8f69409acb329b5e58a8418242130bcc76cd4ef2eca071dd23d1c053a50a6594057e1567f4ada5be2ada1f1e206c39f7b7f80402e3da83c594d87ccce9f0fb74a39f900aaf5d8c2db75db186d4a3f6a4394f80193d7139710b50a59bf463d213963afcdb5058605e454f6891ba1d6c6a3e1d1046b47b83537a0c44f3405e81cada1bd7dace161a3ed676abcfc717ce3ea444b70c194899ccc8d3854d2d2f9445f1b2d4b0aa98da0b0c6236c8a88d1e7b0d38222057aa45e223f3927064629209da4cea3e7c5c1478817588b20202c5d1bed513a0af75aab15e24d40c8ade1cc8c066517a460d5c65d137eedfca6f9a86449a200ec12cd4ca441a724e24eed47e21c414093faae6a9c8b6ad50eb7f297d646637a810cf7f92c0d3f2cf7e8a0df0b1aa7bf03aed13bae12fe6a58bf1947ece4c780918b3b7a926125b1610b56ffa57dca835baf1b3f54c82f33aebdb9f1f0c9840c83e52b87304bda75842a3f11007bef835e8c4fa3358910e54d7c1208fc2c750bdad7e36d0bb3d2a8d60a5defedfee6fa28ccf95d430085705e03f890b5b2aa871387b1e1ec19123a6fdb1e0d3c319625fb7829b804d957a0fbb5f7f926de6ac6ba994a8e857e5e8cadc3885a4a0f57d32e040511fc3dbd86a160765cc251aa9188b267a5225cf23b20ab391cf41a126d70b0867016a3122e3f971308aa40eb913be0750d3522f03e6f0642f503202a4706f973392abeb9f161b5da47a2d82eb47ba57f4110ff5fe78366feeec71fc9fb21195d8ff39228cf55f4c0c2fafc778e1ed5e6151ca79d71ef52ae0a87f77015615658d9f4915d35a5f28d2778bf43ced6c6415981bdaae586ad182137c92b1b65ddfc9cc0ca2fcce039fa81e6e5c9adaa7dee49f4996d696204042871355126cf3d6c6cbda28c33d91fc311d9b870b6ebacca7a96d6d9467e0d4b366a03c535c1b76c11418917969af3d5040807b4588f90868a4b018feeaf743cccf0e72001013396fd42102340639c8353a9381b9a2797224dc589ab87e6d184386814651341e8aa616742e8972eb20194156d2c6a0001100648761083c26fd712a3c8e0a9167a70c6b8da4bb00f1b7ec03d352d2a3ef1399cd5cf3e9d24f970f773aab39edd1e9f6f572203d272b2a361977c81856a0291e106a298399c6b6c342f1d661690a3fd7a4bb6d46c180a99ef183c254330c2e1b0398110e7f797ff868dc323c632afd0924f195c86965285315e907e92c7603535db1ef2a7ebbe6b31266df92478a7d9547246af57067757511f6340dc8e2819414add8970566ef7b231e9a860fece979579836775f3f27af5b0a106eed61c579fe37cf4e40fe09e5d1b3b9dc9dd8a344b3baf93b51b6622b4b94309f6710c0fa7a756a2aa4d90102e4cb31b21b89e5a24a8bc4a5b73bec3a56bdfb82101f80263a25b70f83068dd8d1e64cc98e63b3aeeccb78d6c9e3878b62a9c41abda9f32e3164453e971e6acdf7f29f55818e7dc5cf8d5c1a7bdb1896fba395692a30dee4dfdc509a42c658e854c1bdba8dddd1aec59e43b8a2c0a6d0fb8865c98d269cd04b978eefcf844f76d99251a999e2df85daa8352343c13bb49a0d681ea4c513829e8131c939ffa81a34aec3aae07773adadb9660b79ee1f063b8783e5f4a833a405deb1f5a7991f87d0bd131d8f8168600ddbd0058c3eb0017b83c1b05588996f8ca7ce0562878a9a8266d889a03b5cf0f2fb63be78735f9544ab4cec7ac59c16dda5e488b185b62bd528e9e19ffd4a52e5530df56d0f0a407be88f4de93a16986c0ed4e3e6433a8158e71c20d23c0bbfc107c79526e4557e05e681754b0571f8e8a5f7b03bdcad40d29fffbd6ea56a614b41cea3942dd73d6ba7c347ea9471caa6ebf7d7ab348fcb822b808929cf9dad5741f9556a6c73af196d4bf904222325a45a9e906976e93fe647b8d8adf09e5861e510a821b54adc469d9d3eac678229742a0312da848336eb6db59955c445d3f376f6874057af80d7dec8bcd18ccf140fd6b0831148c775656fd9fdea9c539f62adbfb21f3bd978e3926f4e64fdfc806779260b650e6d6cd0a0d534449e428a18620c98e070876f9a3daa5e5c5c8363ef1b6f4bacd049ae85b09707c1a5eccb2b26e5deb424523ca53d307b01855b4b62f416e2513eb84ef45f6a4f2f4d6d03edbbba4b05b8501561907c58cf8b106d6e2ef3b4bc1605a2ab601c36be51116a617b2c2eeed06e44027bc7b1f4cb023e3aa5de92803782256b75c5a0c7e9e30ae6c0812ece56e00b160d1a47562fbfd22db64204ea2657f713ff995cfec26972b056dd41671e17bd693c81feafbad81f73022d5f5e955f13a1de1a6b2f4fc4b975d0b1b21b4a213e4c67850abd75569df51a3c516d11577f2ba23d320b1b2e852469f02d762ef1684d514a8de7c7c7c4068f2475c52d2058964a6fe272491712c254e183cc293667605b9afe4c7151d6b79d3c4eb2f493e2fcb1afe4753e212fea6daf32293597b00035c4a0d08268ed71fb9deb84b5e5dceb2680026cedff5902994a259c44373cf7b15ec29e0893994772278f74280f5068023a0ee7b7b03393f0ef95f6acf13b6f4f3d3543124c867e5ea070a4fd85fdb7ff604b8ed13bc6a747abb9843f55de90478b66a21861d86efae0a8e53d0fb17fa9d055afe7a9e2c8c3f007c874fb6814077fc863f66f4141a48600ff7236b7602666a599ada2d22e6e0a968c803153acc98959906c20e6aab31be32554f4719a89b1a2680d12e9dbec0255699f3ea87214c999ce0c86fb1a23d7dd6d40c225bd449265bf500f6d6a01d7b50883eb7e4d32e0e657b50e39e36e1118274435dbbd6b30ce624509cd7894cb910836478f7fb2a15611ca792178d57f78984459496e97894409337b6fba4fa1d807f21a1d930801ec10608091e3fd4768f5f4b513906c11c750b15e72d4e6c55ecc9f87ce9f4100a29ed52fc29d936356e72a82f24966ea33213db9ed55439f90e7fc720c516a68e6a740d0c08cbc83f5aca4259cba5b2adce4b1fb689ebfab5ac149ca9957a6c801dd93b64fc75b4fa8f9ac3930145710c63f3e78ca0fbffd058d447b941815fc38ae182c1ae539b253bdf1d3b43829bce332157d12743c76e2a30826cb9de44a8415097f876b6822c22d094d35618045444bc515aa0ca28f3f14c24f0fdc1e2d3e0f6d1410f37c88e1057c35d679908e8f50e40c91e350472d468d34590ebd05a11b88587b8da6c8a2be46370a9bef2b2d42cb30e87904b5f6e345d335336bdac3f37781f8abfe29f85b9a4cb8d450a78cdda1be4a18b3f31908f2ce85805a0365dc7677793ab8d68b8c7af6438afbd211ff9109f0d322ed630f462f2f954b63d2408c0b2847113a23af6d434d0e746ff24299f9eeb1647e1fa4da63849f01379673dcec6875d470d284a24f9db9ff890a47b1fe0b55755fa998a6b32b88102dbc84f4c5796e7fd2334b6f15335baced92ff0a4cf253a6676c71983cf893eaabd3e93cfefadf56fa4da19a0bedcc46fc5b479fa7180307071475cc03d73cb686f2de4c9fcfb87d14d1cc2bf4d99fcca7b2a3127d1d0738579b8651cc32e3778afd3c698c10c4c1bf2d64a1e41fd4445b1cd10ad427cfd91d0630578aeab84ab548d00ad4a03d85d04edc9f4e8def432ad47ec3ef7ac9d20a44623a4aa3b87cc3a07b14fb0c07d313d02d1bfc704e01999139813ef1586549aabc0c1f984d3cf7df11b3e19ce06f67e36d4093110303fbf0f4668d8dce7a512ad94bc7f6008c98c3b6c036a0c7cb68d983a3c39a7e0d0d63c8a0ee75c70da24dd1d3484904804ad6e1755c92148c51b8d9e90cb9289cfad2180275a015408d83bc7ce12207bc48a61d1b9519839e081390850d51319855e220c5df296c52f1fdb01e25db2d048866b58de962590ce337cf77f986eac751857f1392a64f79707a3ad42bf6f1186414c7514cc5a5e2394c4ce8ecafa598f4f0740b7e06c982da5f7f6c866e4f12b07db104ff3f264504643826048cf83355b0323765b9330293837056746fa9cfbfc423e7eb7e96d0b784e53679e557bd2e24199f122a1c849de09a72aac58c58a18d1f44e116fa914c129b325f1c2e01cd00a4462d68f2d5765cd794064c37e278b90f351057fc2beec202c946bab29efd3693ca8fc6904c81a8ef85de40e3c3811ac6442ded8051ec73b2c8660982b8b271145b8d68477764362962880474e9765358c39295a8fbbfaa0c74cc2a2081888d02b6f094f9d72a9f722fb1ed0731a00ae9d41937ce9a420b850066b515d6a96e209c03433857fce0c51bed1a1cc8e8aadb4a60c999b8a894e7e351f5d470c74a5ce15c1617dacf4cd5ad97d738365df496fcabcf37998b52604ac87304a0ad52b5ed19b720b66216f59c48e8ecf3dbe906b1b271826f2c5872c55778ba6cd9a6ea1a42fab8ab515d39f6c23ad107179594ed09078d4ba3c8c7e104adc9881fce03190c68cad30b398d88c24f4f801f46252b6f12343084f844ada05d13e1b33c220904e913a2dc63d3dee26f15c4cf27533a8fa7f8e30d3da3950f93229f4da06748b773c07c24bd0d59a0ea502741418a980389a52ae296a3380219457e9493b46400291732e3fe7ca259a25e8c58aa173ef66abf170eeb4bf1f2e591b4952182315a9860a117c97c3ea7fce33a1a9334d1b7d7862fefdff14f68c0f1606f2c51524bfec7d4297fcb2d3100d1a7aedae7e05333a16448d3a7f0b4829c60b330e672dcb38c356804b8790c478ef74f61fb96e3c90cd01c19f0ae0a6094b7c3089c6e1cc396573d8c0783d561b072a6a3bac71d8a391e69be35442737055691335886d5bf2b264b7771892920140ab9c1ba4d7fd81c6f561e8e1344662c1769566d87101806eb9e1b9e5eb21a7b92c2e5ddc85d98b758e8935a37dc86dfb6ec9f460f80feb6ec7c2c5b929fd6faa2d7d692377f3b8e4bb33c898942c2c23e3a332f2796e88e22f720af86f8650e7710ecaccdc5879bad1d5e46c41ff96ede80bc0b69e64d3dd167915d149ae8e7c3bf8cb5fb0911f2794ce0bc68237a881231990eb324cbddb9b575f86cda0678d39c0aa054a20b2521396f363198fd1acffcff81585cc255115c2fbff2e3bc218afc2b4da254ae2d337c4e1faefb532ee53d8065161495441ac587cfd391717979bfc274924a39e4dcd2554ba1533a888da1cb52a47ea8e082b4a18b86e48cfe3acc54d2f4c64c82d22429eba88b1e9e663304b95df3e22509666551bf971dd3cb5fc054a82b2e0212600e549b476e726010037c6615cab92849bd247046008e9dca88207ddc5cc36310cc88bb284d0836a66cd231340f36f3ff6fce1e5bbd74991ae4364442d04635e6a9d8fcfa52a4425ae7c82df238a8be7e63217ffd6ac3104c988e2894caf1a12450da86b29599c4fb17097e4f9a8e7ee167d164d1990ad117a08469aedaabac3c919c301b5babc1fef4e135382f3849deb3aba67a045319c5b2d61d8427f138d741b8179bd8f6d36e73e4baabfef963e208ff419e65143c7a028394e227c53502eec93591522dae8726ecc0d5baa77e73f5ac39707c27fb1004ae16bf10fc565d31d4eb381c6cbeaea0e4f3b99ab9f6e30cb455a017996c0fa7ae1eace7dd644f8f6ed2e9d9171461403977559dea507539d8157e52a698a82dc88ff53678c3d0af010a441bb0107dfbdf19ba403412bb3a41bfb7468b6258a77f2d1e18434b97e09385bb74e90b03abf7a9a029d780ba2cf0efa68700a99343152dfa6adad5123f70c3d9eb4c85e3ecff798e54045b3dfe0fffe428bf31c611ab08257d3a75b296d2da6d7b94c2af28ebe1fa78b4cfa6a24762cee53b29b85cf10f3c42b401846fa1d800e6e549afc70e9884237f520da7a68a0bbf765872b57f26bf29425e10c0770dd192a94944d50d6a0654bd62e3513bcfa1648e339abcda083f8a522e3ddb0b4113c5b8e955f267a5065b64eed0c24c983cedf3a36e101afa0ddec9e7a2c607abab235b13f794d2bbe88e585dcd959693a93cb0118f8392a649b26f16ef1f93232a1fd95c522c740393310ec318d5a37dc382fc3ad1fe3fdb64cf44a71053f0ee0cb60b57efb47a683eec6ef4abff5fd41d8b055abc79364e2b960376d26ac7300ee4ea583dbfad6f2784362e8a9489aef24c4ab262b63df667dda2ae6d9c3eed0ff5a445d4f031369dabc861db4a74b0c5124f082e864e3531d483c780c009c2a66de1d0be999ad2deaa746500c2ba2e4c797ed4f57376ab2d2ba017af1ccdc1ff343105e4450dc9172bcaf03966a065669982f443f3cc572154758637eb7b02f3c396249699b59a461a74df339b3f967b1269d1f5551e78c8a40bcea004cd0fd216664868867f29524eb75efd9bb71e0f08f9f21314803697c583e9384ff5da01b7692606cb6c51356ab399e3a41130e782422102cfc5a095c3a918b06b1e2869730590f408d5d478367f5721e368d54e75d727594a778ac4a3e188a44305f0c611cf1c7ba90b0f284f52a245ac0e5667b3bfe9bfa32d077124189fca04c8fb7fecdb48c99d96d497c1fff7945c48c2a13a9c4ff0885a25d5fb843e7f80e21b7234335141d008ea78c3df60959c8467398beb19c997128ed67b122def88facf5c52f86f7aa1c65ef017ee387344a35c6e2bafccd256f35d5ca195cc43e88deec202bce1fcde419fd59d3abf12067be1d67d06c07adc87eff05ef3ebed3fa5b9621f0f3cba6b19d26009952968f7596f313dcdcc0ca6a423578720a1d430582ac2908a7bd295c8992353bb14a092dbddc4a2b9c6264a4dfcbf26f0e8fa4bd8d64e97081c7d1477365f97f79f950df70e9aae1224462120cb029c635b8cfb39b3653f13f795e3f2094937cfeffca4ccc8c09b8334ffaa1ae8750024ad9fb89fdded472fbc6ab425f20e96dd2aea6acb4f2d15830889a0531cf9dde2bcd713eacc09648bb7609be257521d59f2532de6198ee98cdecefde9a1751916c76494ad36020b95c6b8e0a83680eb4f44297ce15fdb21c6be70a170f6b3813f63e1eb0ddf1b239e80e95c1fc49f25672cfc0d90f849fdde9c3bf090e6da84e30e999500ee7337e691d71eff4df09e30c3bb222a55c1850df266e1f74c2af02c69bfc06c2f46d8656ab10151600a57737588e18e3ddaf228643cbcbe77487e3b9b5f14d4c8464e7e980d406efb926d465f5cd51d1c1dbbf12fc3d8cd4e43cc8eb91bb477679b47d7288e8f0c3ecbc2e52df50d882682b8911f6c5a05b27bae01988015d59ce3c3e032ba4ef2d7c2d9514318021404a9cb6475c559344fb1450b148bd8de464b2ac2e2b89cbb4b7ef079424a5b4705817ec876363262181dda41d8001a071411987a54eee566b1608ba445bad5ea61eb6fcfbb219dbc2c5ddb90a2c502cc9370288ac84e3e6d54ed60c690f1198778c213f9466fe8dfd7037a13744da90bca11633cb1e4c23776b90383b5ec52abac49558aa2e7c74d1bdbfc58e39531fb0c312705d4ead7e6f1ecf709a7173a8ab4e97cfe5ebf2644cd4738a9dba58f948316fc4dfa301186144c8a801ca7f889ef6091c811d108ddb5721b4684acad063fbf0a28c1a1b467ead6d45d7077af719219078843f3885a8e711b4be17123ace7a5f845b8fcb4da74ae5c847ca4dd3e49b65eb28877f1c89731902bef392605724ae61300a5f573f53a74f6bd9ee47ba098e2656df384a4a1a1d9b04df1d000a89ab229448d7bc6e62f9a399e30c89476593f5116b67484c6396dbfa9c863342f2af43cb0ed016852c07a1a6e94290fd82a901d2f25d0940a4df13a90a82d156a0c6db95e7ac70e622b829da16f6aa1e3d6d50d491d735a308de22af118d610934a3aa71189c5c3579f7d256755cc6379cabc02e5941225aa76a406fd3bfff7040381c01ba0fdd52395cc6567860ae2c47b31d62e9637471072611c886201253897644fbafbeee42b7512381d3bcb76d63bb465cf8b52c0bb3138ec68f3da34ef533edee7fd38877fe1dab45308da756d0a0d4dcf636d6cd5c09c61114a4cc28548121e9775b72e9fbc6ea6baf2ebf2e11a650ace454382e9ee75185a79e4e1e8cccb83f9987b3ffd946391d1724dee56532b60fc5e9c304dcffc8fd6d7c2638e87b8e0c89f227f28962fa9aba2ec7daeb5fc9a309d00ab4e8e0c4ab70bef20077f5d47794cef872f463a70f1c2cd99f50c6a176febcc741c9c1751e9892c73bf40be3b5471fb7d01fcb22397aae5dc2eb5f86bfb5d1ae5c85a384c362d1f9e58ad5840321e911bee8c449bd489bd07ff9c7442defde6ab9827fe8b20c4b105750d5be9fef585193b761faffb2a82ce4b535f8fe30c77b2ebf178dde7f0e484a4be4231e00a31dd514806505c1c46b3e6882fc31305073cf71b490a1e6eca614fee30c70485a97d470e1711e7759fedae6a25efc99d7a2c7dffe2fc7ffcd17be07d5ed178b2611152c82c69181fc751cf77d3b7fe8a93c7a9c04df6d7f1dd3d3e7fb2da6077bc637cf9b7c880e21e1cca517f0817da785997eb97c99bc08adccfa5610b78653c20a12888404470bfc896d4d03d2d9cf6396434126dd326a97733998f11e82ba88c456a1a897bf512aad9fca3500dcb2528128101a395e63b5bc6ffd24c069b8f5efc7de3710f5f458f48e279e9daf8011b60936c982df8733c5c275fec22222a7101f5c22c985ad1b890ba73a82fbaa697952833745d871d710b49bc5730a4189c90c14dbdcc1a0a49c3535a6cba9d394480ab004d2eed7acac25ec33c0eb3cecd59e98d8db11a1d84c15b03779ec0bcaabfbe04939211e48fc40244dd0499c3e075753e6159e0df8b6cdcdf595fde2531b193e435fe0fea9aec993d7f0b6d492c656904fc509f847516510e3109bef7f93e5c441845250ab4cb3b3d2cafb7c0d1ddc6990f33f94abd402c1755ea57a2996e1b774e5ab144b454742140c7243f8fbcaac21a2308baaf947f5971ded9372e0203b26b53c379d6fcc30e86de854320554b32e889bac7396b40561e7276de5c79d3c871f33878f984af500d76cc73229b39f2f6604cd5035d96dc396174d9d854461042fd80edd7ba511eb84f5bce64f05efebe22d3d274f4947b5a12a2002174ca5ccdcfbfff1064f612a49116e17d06b2332b310899e8e04c2ebc55e15523d411f7bc3249eab2d3d0ebb311dd86f9fcc5fe81ea109f8bdd57aa0030de1cfb89eb916cf9bd81e786e29bf627709d335a20bdfcb332a7bac7b5bed134b90e9e094ab1c2c654c7898a5ead3c352b313095b55ec91cde6aec6ba0d4643a65266cb22668dd9b8cd8bb333c8765ecad3a86bca291deeca48a15d7b24ebfa96954f699d41d1b624b03f55322c605b0d3f8f3066b79e53d2c43315e5cd14b0d8411a5378a7afc745c5974799a74e13c5500e2831a0e7353d91b0fb64a2e4f7cc3ca6d29f06f489827243b0299d19665a3fbc1e1a4e3922a7b83177e5cf012601c6c4bc460676ef8dbcc47ce367e4dcb2efd596f0ba98d688e198fdcf488c94f6fef27d368a419684b3aa1024f7c7c0d884aeae60f66996b998fa8b29dd71e46d7a2c6944426dcba89e9447d30afe444f69924c9cbf9986577d0b9929710928da1cff9a8b85cefdb79c1b21bb12c513119bf9694884c8eaefba81dd4893c93e0d97bb8b70ab0843e0d36a24d17747a7e7dc26db9bb61316f94113af354b21e46b608e7d6a57b3aaadb3402f68b8151cc740aa0eb10ee8da1e3003bfb004cf0132ed0289fe784d7c8af65ebce7d86ce1e12d438219b85389e7c67d727c9be6683a12871975e3785ed7ea43f3275a3b78b08c8ff8bd2cf4c2d3dbec2f39544dc726493ab3ef2536f313e6a77bb6d623d8e8e1b925035b53a66b429ef77111b22d3f9db082c9e24d5953a28d818bd47ff27b602ff680bf42f98461e12166a841f4e1227f83a97d0ba85f057257243dfec59ff6e8a16238188228f8d416be52ed655cb0f5b8d7ac508023a981cf238d385a66eb102647e6e2185bae0c4568c1efb09af0cea464cc2673eb0dd5263e473529a6b66e643a68bcbd5a15a0d817ca9a10997debfbc8bcd4bd0ccece7fed8b3d5ef0492dfe676c7bfbea2b52e792204566c96c39154b4a62f2c031cd0761a21ac84a8a9c694d53251b544315675a40e9b407f4807b8dcb229be9a54fdb4eb0a8e58ef6e83f64e60c5397ff2e62448ca933009c111b85c53b247456a8e0cfeb56f9f0f31db62cfddcb24cf35a54951a7724a5dea6139df116a6102239d2d6b2734e0b9762b3e0d11cbdb7ecdf3ddc8262504ac39e0fc33de223abea3e3bffff553220fd7c449afe7c0d88a5218d28b0ae7c597da4638503d427903917faaf9df0df0b526bbef8ca7427706644f8fa3e83610206378234a5605d68ab44f7549f7bc04bd3786f33948b60d25225c619da3fad7b76b38cde5bb24ffbc6f36eee4d57117037851707b10fd5b2345c786340c2156fb785fd1a24277bfb9a82f52be0c448104281cdf1dd4fc44bbc0ea535b918cebccba708f78637e2fc23e67849ca2da7055977fa38c8fbf2420b3d68df73d47f10afa87dcbe4315d8fca16bc62ec365f7ef8584d43be3cbadba65bbd11889596c90d8765e5f632487329acfd2192b74c4bbce73869f68da7e364b1d87cdeccc48547ee376fd39bfed6791e9df7fb7618b71342c74d4cf9706f9a4cc4c7daf4c59e5159eabde73f4db0c164ad5b5986d614bf8263ac728375e2a722c1db8ea82cb74aa312b5d85b66ea1fdf6bf2a6c8e781303f51d0d89995364e86d46b70f72baff39b3e822933376bfd511ff4fbd877ded65a629cb433e8cb1b313333bc0336ea17069d8c460c9dd54fbe16ecb198563e4aca3f98ed055befe295a58bfe05018819cb973a327ddc44c0536c1a8aa511ca8694549dcce404661bdbd14f915df2c6ebe782e73ef988a31b96a025608d021882b68244c841ef86217ed97146e3d59e84dbc61290cb312d4c20271f55f2a8931a4b1491113401ab6cbbb94e8a0151282eaf34eb423b31bff23745a752e1aed2fc57568ce222b8efec217ab499146b3741eb9433107137326b8c5d3411ce467fcb4fbad9971f5cab0334025f33a6d5eac4baf8caa953fd20418f3a08296ed1e9c69ad84f9f726c98465cfc0c440a3ea6b57fc0f8daf160dc557219709cab043432a9dc01de9f8bf4f551a1ab22d802d66793c887da0c079b3a2daf731cbaeb58cb648c6e350b3118bcb80b5be4fd7f2dee182271e7935c0466aad2d31a12f339c0d52029b5108d0702b9ee9aad2c1d0cda345408f90cdd2d60ae9bccceff4f921a8a323d3d5ac6af26e61db8cf7e8a0d8f00c907cedd730ed13a3182ed2871c1c9a2e49d40f5454eb101e9cd94b7a805120bd0e948d34bacac14f96d8e3dc6a262f3278cf3fdcb0e460618db29ce2df78e39e83d9c7773b3ee3f8e24f4e985e78ba3e307972d9fc277b0687365208ea4c1d38285bf1b1ebd6c386055c20145d8e6060d297c67962d049aca38828fcfe5bc8786c74cc5c2c21c0424839984708b7170cb78577aed3690e62041bd03748448f749d169cac92db3e24de44a5bf5f108c379599d42cd898235c907357437c2367167ca841ca4652ef32556f590475586821270b2cbded67fc0786905064d14c580608bce0255d33f21d2949fcf1de07eeb63ac3ecf8b9e8d632fe5baa3997d7c2233a9c37bce1c3052990fe6ec4f1a84fb037fb17a2f0ff6e90efdb52eaf07a0aedb8f3facda4d59fc12611e01a90f71f3657abdc33b0f7d3d02e772f32cc8037ee3935d6b32935830d69c034a1877bb73da3844a5e4a9f5fc6cc12692ba6eecae7c89bccdb462dc7c81edb0a65a97ab965777f8dd6bbed9d734cb36d2493d64012589bd6f529b157c893c866343f17bc87021110dac1ccdc560f257483b5a9f42ce5645f4b773fa84462d7227c85334834764c2e65d0c410a134b5c82e0aa4b35ebcd80987d907ed47ddc5fc9a3552e80bd0ab51a1201e2468e1455f3e7b1ca9b63c6f2dc1641065dfbfbda817b65e6553d74a42479739426c495dd81ad0ece43abd657f564f1ad5360222c8da00d1da0abd66c88176dd4e9ccfa113630606d7817883765665dd308e3ffb5a44a99f0561c2842e3b4e0cefb64b6b01a23f18e5f6b55c04d5b2202091eb47bf66bf19093e0392c6b0c16868cb8e698554ea7683c516a9e6ca7848de0018b77e31d86dd3f06256d0dac0312ab5bdcda836ab8e7cf663a01a2a1a2fd0cb7d5c5f1a8e462519e58642d1f4ceeb9afb76f59f7635fb051e116f555b1378a4432a0633ecf57368b993ffd94e14407e35f9711aa62fef293e824035ddfc3cd5354e21fc9576326ea79121ddd05e12a268064e07d0e023828f16fdb72920c5749765a32afe788067d0a16f8d9c09ae624b065d6cef8e79bcc44c02675fe54964a8236fce226ff020aa951bd64826571ea289017e424a53997be347341abfd865baab5c76fd44475f885329fc7457d2cd24c4bef6163c0b0d294905ca9f3569945a2bf191f72519a05948d7a60937c73628493b0afcb56e30bc0cb43a7eaf02f564dcc00b87a6f18d3372cf3d795b5082e9151e0854d067ecb439a02b17b352ec0374c31177da92308e8a294a00f2b70876d962f6fa30472e909aa6ca540627c651e453e8a3dc8be31fc86b78a76d527596768d9dc328ab584ba9c3a838b71683ccf914184f02c9b86595b556edc67e27d003ece8525105a4497b75b2afa1729b6b3cc5fbe8f03bc7adf08bea68d4f1d1f0691b3dccbc1dc52b44e9247326ac61ad3034e66d3cf1f648d0e1cb3cd89df5fa1dd0d1703be6c78093da98bad0c6f1a5632415cadb8ee7e146804d37f48136a81efe221432bde0a79a0b524c56db635c5dfe6220524a5e2028cd055397a26f85545c7eca12b78ca10faa0b2d88717032d7e816bfea16f0f16b589770f19b8fc850cd2e4e84f8717dfe2433fd774ff40c53f428eb7b89e4d52010334c1f9d27944070c42c64b59251c2eb6117f574bab20ae84404836b346d8391b25bf4236dad98b1b63a7e68ec0aef40502d4f8fc7261d7f63444b7622a10816899e8b8c770db00027133d1cf56716172b3f639b59a701b37af34dc76a7de4776ca77cf504ced0257c27a57e77f274532f4b217177aa9cf28b6bb5523adaea03985391a34f67f06edb10f13e83e7a38279b893db6647c8845a4c0259883577a83e4d3e1c945f044f3d1cf1e687369c3ad036ddddca3b6eeb42dab8ee7b9b81ac8f13750324d9583a1b8b5322b47cd4a040cc5d9f823fc517cc2e3e405aea619c281d02727987a7b134a15de2ff0b560c1d0791daf024011b7340df5da612c44e5eed676debec01f2080390883290a1ca257e103f15a8288c2db9e230f0b004600f6fcbc0b1755ceb073cafe3745497d4f8867d2d109856a73e8d16ed037e07fdeee6e3ab7c67e6a59713e8197ba7a7e8282b82e7a0f9d5ddb34e82c20a3bca7d42a3386c233825b5ecae0800d821066169f955c3effc34f0badefaca5cb16723644d00e4c3e3c564ee266c9c53a66a9d9c05dc2106b15f0e4876d42e342641401e4b8730f323aefc626b4af118df949e027c187f312f8240545fe6f7f14f15fb70388da8805f16d27abfae51cdc10071cbb678b26f6f4299ac1fc26a500c0e9c5827c737070880462100695918d3560ef30a3a41df5f9b433da349de06762e0507e14ddbbd0962c245dcc2b9a060bddd3f41aea6824e2a160b4ce4983e04ff88a1e524c56677d71305ebbea4387e46b28dcffbc20fc7db41a85ecb305fd5f204320f0182fe34bc02ff9100ffbac7e0a6a969b621b1486b9787d4e4ad0543bda6c5e43debc84408268df2b1828d14d0bcfcdab1bf52051ae32df0baef37ea77a0e311b0dc817146643c1b5eeffbe85ad49c757291895b08b65ddb39dae54bb1e0639fdc948440e1a792e7d12cc48bdc7f5bca4cc98f8ebf778de000e92bc5e805a709cd9cae0f9830be3597d545561d3ec418e3a8122188d250cccc578600b39b542ea3e1059c2b563486c897842a89b5196a1c35c480847eaea307fc1ea0ec38d904cb0224d2cb8f5d53afd32b917a4c7fea376030e6da56750540dcf6cb23d760149f7c16344a42f7607e097a3cd985e2b35fd77afe22e04fdc5b0f1c2e483e6b7a05b675c9f6035e29723934d60f050c43d381d328247a17829cf025431b8e7c803561508ebb35091b790b72fa5539927a21ad090e2df510662b897307a424cd380cd252f3f231326bcef276adb13f3d52e461ecfefa94ee89fb3473afbb62b0969f73ffb99d67b21444b644e207839278c6598a96dd5fbc1a185e1abb6395ff4927d14b707a2f1d3faf58f85ddf6ecf5329d8561f814c51de8f6c1f19e07f32bf9323ac5fe6f5bace5b476c4ae403085110bd2ad0585b891208a40b54c1fcb84d33d8cc3d9c47cdce5ae1595c4f80007cf4b1df3b644a123076d9adfe65f2d6a1b22393e3d01733a7185b04cc5f8b6204973269affa3494a963efb2dd603e7950d6056610685079e5d95db507a5c935cd306f02398d1564103613cfafc2a0ecdf7f793f0c21113d2686b6362a6e40f22773b24009ab6e91ab26964612cda4a36bd20cc1e9615cd0f73422a2148ab3116537ecb468e4371b3b65c2042d5b8778946d00c8ed0f8ec2bf70e329b66bf0fd1679d88e35d1c72361e3a30495efc0ee9712edfc27f0b6d6fe539bdecd1d2ed3f40e74792e74ef74ee3c8704ca4347af6e0f44d7a622aa6c1bba98f4d14643754156300cb84fff44f40b36835090dd16e719fc99e694b982988d8f24e9c3a8dcc088d95a7862d863c426fa48724bb0b90f8f78096b59735d7ffd708754e825fe405d3a71c2dc42eebd6099e514dccbdc75ac613c194ac9f0602280a83f98a7563bdb7ac498ea6d024d28719dc3ba132f4a5087a1b8d5d0dfb10d837a17150d1877b87eb3689fb6bd60d373111ddfc6a434983b6a5c0533ad4195359510df316f64046c7117e19b31685e6c60d4d875ce1f216280b00a546b19307ad0e381d007783e58b793a3b5b0e6406c992d0801d0df6c99ea6d6d771d9256ef949b507887a923bde54b2eef110861d33c1558870321d30100af179b872abb3c207d311b7759c32ad6d06daeef3280264afd14814569eb10fa9a18a25b78ef0e2aabfe2660403075a0c9a1c6fe3cf9fe82d8dad96ffd3f407cebc7ed4704c8092e5a8d95cc2e438cc606ac1e092d6ef72758c2d60017803caf0ad413bebd45eda701de08717c768da7b440b433d42d04dd0f6f973df16506a246b2032cf24e01e0826a0262da609b87914d4368bb16ab0c35c16c8cfe3a3cc738ef4e3a56a810c8c62cdc40bb121da1aae6c911907e75f42cd5e0a756212135650e0ead81f63ac5f8c521e522d86f0ce45eb8485f9281bb138b93430395f5e5e7db556b46dabfd0b15a9a47f75d65264f5123ab95422c8e5f8ccfbb55d481f8532eeacedc4f45d86da88a31ae93a0230cd3e45ea2e91624eaa5bc3b63d74f868be2fdedd83c1fdcd24f5c9407e7eecf780c5bc74701b792c788a146dd1107348c8f4cb69a39a93081361854d99546261afa9f2e7cdcea7e3e361063ec8f54e47bfb5cb382690b5036d20e8127437e17053ae7dd9ef5f302e3ac9dadcc197e37a346b3845d95e50e2f023fb184c9948a2bd441d02d840b3baa551082bc50f6c2f5591eb2f94ccf04e2e92aa970d2a53ec382f09c3841f15452f331062e3a5041d89eaca6464d24171c394f3f568962cb119a292da9d6d0ebc0836bc6a791260feedd878947863fc2f30bdb908a479091a50f70cb363740add9b19a26056101634e84226c971caab804dda3fc9475774245ba63453bfc01d3a1ea4771003fbac56a7d9ed25c1032ad0a72d71490e9c0f1eb888c04ca2446af89f6debaa211f1cba467c66f9b6a7f4f541587414fa11df2593eaec07e4ff0702e3716b723e172a41a4e58738019e2c0c22bb8b0daa92370a6c2533899dcda7685b4878e452d22c3a679a60e4e8be9e9c57eacd51d914a3dcd28aacc2b79b2e19173d3bfbc47347ad9f79b704e82b4bb1790546763ebcc0e79965aa6b207b86922d1b24279c28ba44742bee3892b74bad562fef0477547190f8af031c33a1a2a32dc4de3cbd3ba7fa0141ec0d55fe0ddc5f23d423488e13811d9b7b03356a9ee70d1e919252d542f4534ad0836817c53a76ed9dc4d45980654952305b73a36ee7964e7f94c7f33c22ae2e9d385505ea0b89fde8015c7a687840029af9eda6b109a4890a5a8ee18842210ba13602811fbaed726eea2d95cdd7834bc9df1db190db964d058b1f985ceb10b50f94fe1a7e65747bbd457b9dff8f80eb00539a7336d2b681619eedf33a09e5f4f96ed3fe12c6e93a7e259386865e6bb8d0778ede5c08c95939e6958adc40eafd8189cfffb2c65f99f4c9344bd7b29e470f32c874fd102b3dccd6bcca3e9c191ba38e3d2c91a0801a2032907f7c2c920085ba8a71b7b9939a0961dc9f796c0187cdbd07919eee538f47a6bddc982cd49c4ffd129e76933de8e158f44e1353c704c26e42891897f58cc8b2349a67859289c30e9852c974c4030d398932ff5a1cda80abaabba6ce93ef20d8d8392d4a0a3e6c7121c9cc24190ab68dcc762df4015eef827acccf11f554ceb6594ac7c2cb6e51ec7c03c3e163b942a750bfc7f4f1539c33073c142f0b1be9a69965399411dd3f6c4df9f5d9912eb3ed09e1191e3093dc1496e88ecd03654e65bc1ecb14ed14a60ebbc913cef32bff7f8f063f43a242e4b3402afca766719d56fd5325b3f1788d49b7fa3742d5e3d1b0c8c7a1ad9ef0100035f7d10a50ae442e4d2d9c6c8417fdd3cb3919b9a2bed815238e33b1161a69aec9ca393a875fd823e8ce9221a276e2b6c13b3427167c99f768b31db70f8f56648071e73e257eaed4756bcf9ef34286b3661a23f93f41eaff6e00b6070257eb736ef34aca3e06002ff8ebfe27ef0f3d65411087707822f40139e3223cc1cad7af9dd21afc0a6632e0e87e838fc3c112a695e1634eccf67dea9e761fcb4c24f0a7ffdf576b1b1c1d5c6734a50b3621a1768330275714d8ee24e91dc05f7e6871fbf2a20b1a7346fbcffb614e251bfd8fef687dfff77d06dea4d1e09ef2fcdbeebe6ffd56f4f9c84ea71e97255f819a5ce34d406435f24d75a1e1f2454410768a5a780d6cda24647a5f968b418c5739aea413e21c8739680824e1cb4f2e23feb5c30abe397e0e0da979fe79918f4bbecee5ebde3df7ec169ff1001f6c8a8410eb5c146d2caa3d36e11c7ae20a651ff4c49999c0c76e19991ef4ebb247fe84970837c9fef1752cf4da64df791adee734ccd1703b1967cda82c63dac5979609062423bac67a1707e7dee077330c40e557b5dfedcc785a3621cc2fd423cce8928a314575b0e3c4765335e778be730f55decab94424099b482cfc29def59c8a7dd88d6799a77390c2fa3af9a6d7d60461a26be36525d32ea93333af46bcd989f50878685f61081e87d42ef12d8c8572eac67ec459d29fdcb1c19ce4429163f726b4d86de1cea274d0084dad4b33d7b1c09541fc568b5444593207912ee3023feffecf97234473aba21b7232e6a497f003be931e5542ab8932dbb9450515ce2daee75b64cdc541981cc18baf1dfeedb6d3c76b00d84f9aaefab307b02334e24f24124432ba8ca8d32b6a51e62bcdaf707689bf170571f2e647c8e020d5a7b0584127a37f91bd0577dee6cd8ce19ca30d65a629937811977d423b849c5be4b3871194d13d1c0030bffd4091944b0a488022c9de8898e1aef743643b1f9913d2c2ab610e470fc6bb314b7a80763ed6ee8f8a585721fb1405f6d0c6472c96c81ed766bd466729178dbd1808002445f9ada8057f9a205ff6d03c2abc99b34f9afec32d14342f6343a02656981d58fb747a3b75b15ad7eb40ddf5d366e548869d231f900e85fd774feafe173e23977d2211692c3a9b67112808758cb1c5a6003548a0d1dfca9781e5a9086e9c53be47ae49a18d2bd0ca12306c2ace63d73dc5b9c2948992d06b900df6206930ba312049a632877b351eb4d9846f5de4c543aea061be8bc207885324a38547e7f3d59349d1ec99162d72b78372230daf2a88bd5458272240a729c737d4da7e4779e26221f1b77df5a7cec0b8b205dbff86f71732eab9423b990f2900a7f1d7420bcc7ad82fed3c1b131fac61c6aff72897c9d01cbc8e3e298a00e480e129cc344a236a38bc6e2616df6abae7c1523bc294e4853441792d57728aa18e234c195082b140f8b73d751f18e209a04b2d246df6e50e78c19e752146d54174a780414bfcd8ac2722d1b642df67df3126720a5e47f9f3749f790db51967dd570d05a50559f8f2308532720ed24d2da0840cdf964b575daf006cb5ed43f0f4d53c03f0962c7ee926d6dc18308d79b6956489fa64f7ecf84e123eeecd35f91fe55b3d8a62828db98ac44a27d72186deeee284d268d951fb1a5413bba5d9885737b54b19fb039a29b2e493bd6177cb8b8b6cffb5d130b4c9653f1ee3046de38b05db5966be41298d0179713bd666bdc720a4892d6656f8abf3d8b0f072d070649f09080f687f63c1ed34b7384c3e6b0bf6c18807109f1cf2fa67f3bef9d16c1ea1c6bff3498f6492b1267170f56c789b957ae4561f3d123af3600beafe857d945e7c8433463dc1e965b03ae85109ce253d331dfa4e3332bbf5d443c29d1936e7fd37c0bf41226c40c0d4c3f8d923f16cb9c57db5f1ebdcefcade110f8b40406d8e4f63d89b86ef0a199d8e21b224d3394322833c95ce1c12c20c08dfe018b4c1e5dd42c29f953a1f6734af19240f4632d01bd12c897ab7af67a58e7f75430a8a4fe6ecab10b4e8bf556e4c82f1bbfbf875fb5986293f516c9fecc4cec5bc439ebfd7e16eb935f111e5eb20012fd5b9f0f9033421c1b6836560065d44084758f3bebf9a3db94e3922fd9a1e4d3fe7f334225864bb23f7b9a8597bc0e627669a8e7a748c09b83ee7b26b630eebf43485b984f6fd7865ce6359f7623d119bf6e645d34e58e2fc7dfc1c1d4baf8c543a57ead500ce6d6a38657585975d34cdd9bfea4ea6b2b46243545f914f8f08d8c1e1e15d3b0a6884813e0947ce2a3a53c628b9fe87e509a0150f32cbe9d2e8b056c2429538326e4bfb499ddc79dbc203f1fff4492d53b02eeb9320ef3195dd7994e1f8c1f293c23a76a3fb13fce83dab58ec091e667b16cc1c557abfba1adbc852abdb1960476099d3b01adadcb883c1023492aae49404338730b75e4834e12c3a3573219da09d93a296ae4f6b7f5b127dcd245cf2549c714a24ba6f411373e1ed0be7516296514a96c6ee3c3ef0a4de11b38ba7c6cf9af282cc9c45b69803e45252a35c5c4cc950bdb4b1764a371a103a0454c7d43a1f60a2ae90b246f9023a2b642382bed9b0c17342974c85778f0fc67fe577bf8d1f944fb70d7fdbc589547c5ca4221772a83e7636c87e29b9445d1186e9b8ad585f1df53b2c92f788251689fe36e5564806ee450c36f1280720d6147c027f2fcc715ebc7ddacd1a016730b03f637d519b31a17d691d0470eae8bd36f944f21317e1bd2cf1c27a8b00bd7b9040b88341dcab28c085564b7a37b6f9e9faa9416db9d1e45f25056c49b8f81520f0382ba1ff8b564f2b0163221e13b54bbdb745c8081cbf9d5a6d94961862696e973f84a009a309e5b6c4dde339dca1df35a2d7d09273e32b59fab9863c03685cbd98454817f395cb899b8e4a0650990d3bd7585807853f12c26e50e1d04168efe08843b49fe8331c15fcb0b7df197be691182aab05bd0de73f9b45fe874654213e93079b68b5515a7db956066df092ecbdb50856aa976e3434e7e0c6f93b478202574555744ad7a67412f8205e6fb1fa7001d2b8a78fdfd01455303b797b450d895829a4d5a2ba62b02a1699a8853e8ceff64576084917b0b9bd90a708d8c22a469a245c03c9c4e8b4d608535eec1c0a8d28c9d379f8908c7a87c2e3792c55a697ceaa1530f66e05aacb55abd2c5e8c4ece658bcbc22a63e6378c3b129887dca929ae39155d9d2a9085ecd049f5514f8eaee2a50215fd10ad34070b4698b316dc88a65f651acaa023288aaf4644f456c886a896ad93a369334ca22e6370f1ed929d48417e0aad3612bc022e0ffb52a21d1fde6602e1f59da088ee4558519551150a59fb4baa4c05bc67222bea465a8cda8e81f897d27dd35dc091c96972e69f0e0744932bfa36816796d83262378ba47ceb4e25915c68eb21d1d56840d6fccc3c681035d0a16d31e1581e10ac338f0db408aa5b29fd4b0ad1b31536c5a0995a976bb165d6ac0f90be033ba95716b36a7482315a9cc79e97827b1abc28dd232c2156f70c4d1a3f1e7b18b5ed02ebffaf7073bb015020725a9e26fd291d43a3a18f2800f2e61b1f38e9b76f9f062a093674dc951eea14732d2d2ac93fe0ebbf79f5882a7aca7ba57e0290a1ff0a15c5a1cacaa78d6b2a56bae3b79a1becf7f837d8e4cf9ab559e08fd3c8ec1f34e48ff4376525defefbf46a85f2325c913adedc433e2e7a4078bc5e2fe9d90b6f62f781a914127744444b7ba0bd67e38b03f38eb4c50fd659e75f6c0983368ffece99a2392fc42e23e8f3b173d7922ef3c1eace06bb8748c0aa13adfc19b2953e196aab2b7834dfdd04f0520c03550bcf6df4ff5bdfb7ce30adbb27adfa0ccd0e1d6895745a21682d5fbe0ad39f5689ececa7d1bdfc8c1b1adb9286a6f0e9793671841244b76e723e94216e9a4ee6f8d2f42843eadcddf36912504bde40e683a38cbf970af2d4183f1c78f49d92b364324dc35b0c75c8cc00bcd02b8f818ec91e1f89df735f933e4ff81fd7c2cdbafdbdfefcb6d2467b0b5910aaa84a051780cbddf3d5fd52910d31be47256e5be39e40fbac5965af40d199210a9f1b7e81ce6c47a4f3b6427ded880db6007a2bedcf66b1ba6a7710dfcd079f5176a00fccc25b12c2a66c371a271710c3dc70cef254c0c341daccc062dc7800570be1c12b082bd63d4c1f2ad7cdb1f08b5a30e1b8973ff18040cbf1320f0d0e95b564fcc94dd68d97a455e464e69c1062b85679623266e3183c94e06eabfc4332d634e727a0038e59109ba347ddee28c068d74134992420d2caacc2c1bb8cf0d8f14dcf8c930d851b08ef59fd13e3ca3c2466cd912a0091d2bceae98f102f065a8566b5068b2b1f5da2edc7406d58ef240f780b45448d432d8c780d68f6d3e0b11a2c07fd6859804c8e28ad5342c666102510082c025e0238991920be52b21a3356aca954bd6eb9e39318701395325c5930271206a7b6871de2a5c37037e45e07ad5c55624f14416063c160012a0817da1134829299e3e370e3181a17c6054ffc56ccf902c36a8dae8d5c0fb6e9ce87d395963012805995e43275268ea440accf2617620e7f14573de637b27ecfd117cc1e1541bc859cbab0158238c5b54da9561aaba7d1875a62264b7650de83b32e588c3f0d0716acb3a1ce6e6cae2a080bbbd4b3e5b3609234c41de6681ccf7f04eef61c9030cb22f65473feb7fc878a5f7fd83475dd2f4b3ed77815ac595867cdcf9a9060b71672024ae3609cadd62d5cdc24483325c58e1ad90f42f012adeb74eacdc1e8021c7470fbf122618bad4c88876ecabe808d531a85de449a8271581be4de728f73f02db9adc53e64d674b90ad61994a4dc4eb16d5e3eb8c20e997247413a366156a7a4edafe662c3c3c0801fca05799c4f878301ab0e9c9fa6cd40b3e092b26788189c625e59e2f69273501502c1a886cb454180812a93f269addf13657a67e282b59e06c27a0618c129497386c99379edd48c6b8a8a8ffbe982ed66f201184e1fa0d8141168211ef4568c4c4720404c893fffe02f92879edc8ceca3bcc7fb6bd62cc4368fd2aeeee7f88f248694e8e7afc4a5c0f5bf8d61625ed227a1b1a0b9e9358b1dcf92f2138fd483127ea5046888b389201555cee98439f08df19745a69e9792057a21b1f4e75e447569916d1301505644f0a8510e970fcf3427cf22ce6f28471d88cd6bce768ca7f4d0d449316b9581221ba501aa5d9fb58fe4d84bb068c8f5f20af2e6fe3c0a3046199a5ec2ef5d6486d7355a76cb5f8790b3415c0931ca7b32ca065e36174280a6ce2ddc919951a7464ac6a4db61ff61de1f8e6c89eb23ded61bf7ddcd32a4fc7db45d0d9891684cb414f759961ad5a41ad3bb14186261fced6feda0479b05bd99a78d639a3066df1f5b08dbeb0c9c27da8f7744e3d98b9d4082b17b10a5f0593119e0cc63c3cb48e253636ee70b3a84faf0876ef0b387670e641b5fd2577fe838c920e2e9b9cb98ac698c832c9fd54f5fef3fff77c06c41cd73346751d4a7c70fe5a4e41a05cbf9bf8fa4edebe16a52c4c11b2416d30537691bfeac03b28c85341cff57c7fdb21bb1858d14aea4e4a0ebd69f1df88770e2dcfa40450ecf8fa3951eebbfec871d043295c0173ce751af4e0650e9842a69f58b0a1a0a1e795cace27e05a821cf4dcef531d31d0ad20f14c75352f6c4e1af3d57ad52fd4f57d52992e2ca6bedf1a7d7a8e97ce59fccfc40976264c844f881b0cfa9c107f351ef2968e53f8c84ec5db6e40adce48a63ea09bcdced80cdd57427f643e15e8f862bb02adf726031fa2653ddfa1a30f9af08abff25da4b45bb8a122dd3cde29cdbe1f6b0c24b32a94fe483420c91e8c130fffcef401fe8f9ef0451036638f6650a337da5bf11d1237f8216be2b09f3c233672c1f87a57ee27fbccd3e828b72172c5f2872dc487665538c96e1dd72ff394598f69e5896dd3b81946ccbd295032d9815f83a0d026cab3c541a1594bdd3e7818b743047817e7dc11d50b0d01751be0525324fe270d7e917acb042f3a35ccdcf27b9497a9a4218908c3ba264e88b02cd43e6b8938f3c13f03b02047125f5f327d0c6e2125eef895aa3d7e66013556a4c56cf3494f20a5a6160048de5ff8e33f605367c062c23f17ce7f489e6d517ece617e1883cac7730f69baba2760b71484a2723a5cf6aedbe68a33ddc3ef7791279d16b785e094d6ffbedb998f54fc060699a373c7dedaeccbaff5c696ee854b6556e04505bfa761079b2c0cad0ab2cafbac49774a7050348adce7584e07df446ee95aa46ef26a6138641b099895f97c90120d3320d098259e62c2ece5025322272071f92a95161fccba3b73d18f0485d3ac91bec90df3b30dbfa6410bf50aa7e74364bc4f71797cfbc681886eaa0621159c0707262a705c8f42cbbd165fe83d4aa3ef8686dc3a603e7c4d192587fa809a7c19cedf30cb51ee58875b508918bc411dc98ff163c9d7ab2f12403f440f876fc5d14ae2cb624a2e7f11c15fa9f49105af3694bc88fe1b3e49997df81e58fb997d339fbbad324e626a583282279cdb5daf409bbeccbc080f91cfb4c576722fed3bf574d918f7846d857245fc73457e6532a1cf991f0c9a41429c3cd33696396a092f4f5aa84ee710d89e9020cc064c670ec4186b427f2c1e6cb6555d4822578236e48d70ac0ac04ef7bdd330ace409a38843ea2e4ace31979df7eba9fc74c35c149c7c6a88b357b92c1b75d59d512013741b45969c54bfefb89f7cff1c35d858f0f1c2a2519b46e33937f56263f6b9ea349760dadf7993966e557cde75b29ee0cfba9d3d7bdc41aa9cf9541695808b3c7833d3aab16352fd8b749e9bd5c457edbac0f92d4cf71a8d96b47682a78edaa0d467ebb9f355e6ba5e65f9c7ae668e30b29dd089ded68f6b2df10fbbe472617596fdda6c8e00e664348a25d8ae7cc4af4c7fb7ff7368f3b1ec0cce33201ad74a300c39067802f3a7669db71d875bc3afe73d429f74eb2cde3d2029fc82e867610dcb487ad1df03d3a876e38c496bed99c4bfb9eb321ee7ca7c8590839b66fc3a4ec78c335bd79153afc23b0a0978f052beb25d714aa11caacf44d80d0b8b97741b5bb84406b7a69c8d57acb06f0f064f9aecc4de8a2c2b95f1d8b8b508e9da3ef637028582f5baa7411be43cd8b143887693c4d2b0c7ca28b3efbf27bcbdcf19be83a27921ad519a6e411e9970957d04374d9d60f8f65774d1a760a9c1eef61ae07a425e66ca735c7cd0ba663982e23600c8f8e287586cd41f1a886d5c21b03a283976332da9781a3ff87885cd539b0077701406a6d62e6515da9e2a048491f05c48a49f0d0436c6a10b36708bcfe0e2df91f851d7343b05ead9dcceefab81dc74432b84687ffcade5b3a5d3ba8744fa58d2fdcb4a366191ad292ae840b9a71855db2c1c3fc2a88ca0cffbcf11cc12ff71192b37b5ac15cb02a1b8247516c52ec9e7e1a0bb82aea480619518057c8ac85799c60c7ac8fd8ec3eb611a467c273ecd9108a56d6029db0420107618de084edc93d09c83b6232f5434949898ae9f826433eb3fbbed52b1509bb48cc084c5acad143b0d62c03953bb0f0a17b7e5f7e7c63e538cb505172b98fff2e166ceb5fcc525a9866879c87dae3be5ab65e3d8d5779da23cabe64ccdeec47d382475412552e0541d460bb19a65a2356f27acc394d441341416ffbf8572018183ac46cd1280022115bb1d51b776c61e005559738821c67226b73beccbdd4b6ef9eaa10df43f76d1d4489c59eac32c2c6977ef2157f84ff7a1d719fb681090cac6702e9d914d36aa8d6b5f0cd2e6378bd83d943bbe8376575b3cd78a7ff63b4424e9a1f7ae415048ecb6202aeb020011108fbebde7cf001c03300ca0135a56044f35a84502ad4e68082de90e6006ef0f5e8f0d1e6480d4025696375cc8dc4e9fed3799e21edd5138d627152ccf01e411dca1f8a83deac5df4ae736aedeb315b8cff43add3ebc97408300ef9c59d20277f77a5b023b79f6979c1f13f8090f613de7b6869cf0366d9cc7fa621b1ea57a83fd090ef76c3daea76c43dea3c9f91b78f84da99882f6db30dc984856055eabcc486a2a92919bf9c9e261a2ae020f53d35c8397e8b5d7fc5d3534f5aa68ce4de91dc068d8fee3898c95bf568b4eb06445d9e806805570ddf189d08211827e90559cb7d4d2dd2b9ed79a2363cc42c151f3077a339b3e2b5512316f6f3e4a30921af1d37ef4c42e1b9888b700fba6ebd4c7483dcbd6ff67fd50fecce49f1158149a069dbf459618efb2d401fa8109bc8a305dae68341ecd47146d2345df8f70dade6e8ac94f78d7b746e660a1f93fc6bd68b288970c507fec3cf080a66f8b7e45ce19bb579a6cd4ecbf97976770074c45be6f7b3c9fd32caff7bca21d921ea418cf19fecfd45d2ec28f8dd8bf4a4485e4e16f07635cc1ff84a0a0baf69aff2f6df0e27aaa28e13add852b72f69979171b47ecc62669807c24689ef34caa5e960c56b802be3338cd6f81b781918f17d670d4ed66358fcc0bf4341f8ac9327f340e67e400886ef9ba03330546d586b71068bcd17241d7270886caecdd8db48b953c1a2a9d4e25bc696684801413a57993883018f478c4838160f4b193bbb62b401cc4f9b35e8388aace39f82be8a9cd704033a7c68c657bb1034802ec60969e1c3f11963c37473c68a6eff74dbddb4e5bcd8bcd8b00f8b0f0e4b8feacbcf7b51bc5ab13675e636dfaacd39606b38f1c24cae8765a027b26dd44da7ef872c20bd0d36e8559f372c6dce3ad666c805258f92336b79cbd96340710e6b1916d0f391804c9846b8860eace1a39cde73784533ccddc1be5700c608f21165eff24fcafe7069f08fdaa371fa84508bc1ce1d89c1c2beeed807e77603e7716dd0cc9824d07c00c829d82eb0da413666f2e1b0eca2ec4ae1a36c2dc6672f0b2ef442e5c0b18ffaa917fdc17d56ceb3512cca352d659dbf9b8629d292cc1a7a630c2648b0998e1b3c3b9bc169a521a614138d89f579f4e7c2714a4f57f57e38730707ef9516f753130d44403af3a277cf413dc3f762aeadb0c918fb1896acfb4c189cec9c36b4671d8803c5be4f1cc12d1c6983e95d8f10509c1f9a61b491ae689195987e856931eb384db3e9688029d3229f7fdb2f27e092a098805cb6e1a2323a63ff6c58f370fbcaac70a1daaadde1c5bc1eb3feb0fd6e68e44fa0280a9897cda9798235bc188622bddeaa401af18f60e2e9525250db8c7e56dc54cf00f4abdbb9a71e00cec93505a1285fdbbc5187567f5acfd81e5cf8173532db56da124a29938b7a60aff8fed7f4bdff67148cb38c6ce416e21c36d0398a1455cd037f537fcae49fa79de829905732728bb1ce510cefc1cd6cb389fb3e35627ad3767e89c03bd2ab8da14c69f08d76e7ce7bb97d941dfdef5061746b857d9993f835f9e96075ef911d65d05cd3cd09419c0f2efb7d9f05ee94528b1cf6006f30158e70a751bac1fc0e9c60c03c231ca8f8f24e438d3a3f3e2b39e6795a452b6d870c0b1f114ed9f5c61c267c4a377600b301b50cd29d29c585b386f9f7439b375e6876d44814710c1e2961aea3e2d23f6bee6077d02b6494e67003cde03953666a98f259340f20c7bbda9d183eca7e0eccba974474b59f00fda4dc586bdf7c3f330fa1a60464adcf296a057e58d090a406253483762ffc07996fb9ac58672030d46deea411067d60afa0aa30082949d64497def516a58d0e490c5cbc86f11d3042938f47f85cbc7ab6fbdffb418fef709f5e52a25cd0ebc5552b1ee1fbc81d0dc764b3f87d06b02e49043395e7ce3fd95393038f3334b41dc55e0ccd7cbcd4d9af5932f58ca0c3ef9d34a670956596bfc06fa066b0a1f2514c4d2f8c228a17c7ae2001c967b200d1ad2dd1f96cffa2edd21836bb2d4a7effba7c99557e14e589f79d6679eca9682f1ad1d2a502b85e6a682f3baaf030bc79814dd5cfb23a65a6cf76895f992fbd935f4d3832a668799d9c55ff087c8f07cb4faa8446f164ba5868164d647f95818287bc120077f3704d6a92257ab6947f809c13bf407ea1f26423f41dd980630610e391b6463c8076c1474e267688f1dd068b5a8563bf7b465d39d8ec1ff8f3a04e0ffdb4fe1612ade3cf00abd10010af1570a6c690eefbfaf256ee7fe32d5c6489f9796bdc46ef0d5cbe7728e204a234d273060f61c74b0219cbe5f3d8da244412230276db2585e4839d71f58c2d0ae270c02b9503a1ddd54aded0afb711f866c0f46a4e62f184104eafa95e47872f3b482b3d35beb1f62fb1a83d35440b05395d0bed173b63fbe4b554f8ae7dedfaf9b0c4a415520446e8a6d93b55ec9c418a45dcc9ac5850b2105d813b8cb335e6419e2b2e1b70cb20c928cafe61c73da6d28ac82316c43db0cb004c52a833b51e6fac2a23c4f88ec53fbe0a4ad71e6e6729aad5070fdc393ed6058b627b4b42f407c07ecf72ab91c237b6345136849661a57ae89b3ca933c68dcb8c5bd0a549ed900c49c0086bd60c3ab7f5379ff5df1148f98e64ae1ad1c24cf0e6fae5ffd9eb852a718df05ee56dac13c675092d7c664d98641c83d45c39c913f9b063670b5dcc9c5adda2103bca43e3b2e36db3d3034056e672c5fd5325e193acd69dc82c58b366769484d6fc2efefa31733418de6b12c725d15277a975623540f84d409405441ceb02a3f84108e8b17712871e22c16243300b42462384f391027f3e03955f4cfd2dcdbad39464a647a90755dcca10644858434f2a12fba3855200a6d8ddee54fe960e70195f3b20f5107e4a1be91eb88f996167dc6e232031b7bcbc85aea537d5907c2c2ac0fb13037b96baae283f6e3577dec72e23adf2de724ac59f52d44ecddc1b6fdac900cfa7528c8371e88296364d2a02c585638f1c759d942493072717e875bd3accd7c5b431045a9ea9900b9db2f06d2a04bda0088f73817ed04b7be29370439d2da35708e2898bc5d1e8434a8b4b012d971087269393e6fd0945ba1ebcd4c687c8ca50eed0767707f7c8b979ec26d2eb1f05620381cc40c537248f49b2785f133cb86d397b8257640dffc276e9462cfd1dd4233f7a95cf01293460543bbb6342ae6c798b95c94838a0bf01ea961453bb899edb63f59e6aaccaadcd2bc98bc9fb30166786921e809f45be7fdded8f031efaf70caa77b06b6882868ae0474c4ffdf190f3b364e3ac4a6fd9f9c1bc2274bd7232c10e004bc03247390412130923c92e5c3dbbd13cd8f8d4598ea616448e8dd4f8195027c241ad34a23ce720e740fd702af0cab783832304b91f2c2ddd14d68cb07c56eb1384768cdf40fc68b55a8eda7e4c05d89475419402b1c3faa212fcb3dcaf9705f55717b88629d5bc7dc7ec3b4b82a734fb62eae974ea7ec1e939372d3fd6843bf3ae60c6fddcc7953a769f7c28766dd1a9039caa2b6fbc75d40b75d87c5c1fb91bbdb8db5000978ce03f7c78aea767600cdc74ea6ae8bb8899979a6b513ef5add17b2c4aef417bf8ef80527fb0cccfd8173f562c66603f99857a2d572bf5b38b7615900ff334b8c9f717c05a30a041b31bfacb9008957f44679bdf2e8de7a12c28739e0114fd40ba21db041860f5686f40a2817b86984f6095d4c63e513550fe0610ea3be5880c43d8c48740ec34b0389a0aa9507f10c7c5640a1e85c852ee202a3dc9546ea9531e90b25c14e3e0b16709497e9ecf5888ca573b30f9f4e5a4f4405fd47fd3a6cfe3410ce724d1baf3117a5b6c8ccee50aa282b8e1b745dfa940e07fc8a8af4d2107f3d808309822774a502a8c774d0ae71b19a077bd704211756babcda608e0d080da536d642428221ed66d949b4d390b44eecb73a7ddb30c66a11f7717f70800fbd11bda5db75cffd68c001d2e7b14fcbae6475142fb33ed76a699ae0c5c2ae54f8c2b25a125d1936e9d707b0c24dfbd62579750d0d1d3c0a92c991892c88caf91ee918e458fb27e1e2fe6b462c873d84e37983fb810cd76204e8d328759a1327456b38336c22e0f34b468807ca5fc79946337fafcb87b06ae8dd93f44bd37771d3eb805d997e9e66cffad20ec9390d31c7d9335c652fb9c195d8f7708b7d3c0f394f828e25f5a653f6ef00d3eac410f65523a9448c30b9f7c8a7752a078ea248be98036769a119fc97909180385d6dd0b431add4d463816ffbc5b72cc680d2b859491499cc680474ad490b7e030ad92e20bfa2003d6f2e5614304cbd4acff73a3565a6afc5e832f9c654a53c645eb08a7ef13a635d5402fc780ac0dc541f1c593a3ce01e5b09cf93d664215400d3fa3f153c44f47e50ef988c73b4abde12e46d3b7b9197b6353204f19d91a309444a528c9937361dbf0f4df64a1e2fbd65ee327cdf5a9bec94996d30700aa5ffb25d664569f736d85cedff8d52c01f623a3f08b6160a3c6ae77734a1a098aee24e2741c28e010788f0042dec0653dadf42e945ae4ad1a18a5b44eb0335deaab18c19d04060dc417ce632aec07f8c665d8c7f40cb0398b2ad685483051c50fd7c580003130af0f687528f83cad622f55ee82d20de0f0121d0eef55d3cf194d91c074fce47e1e9395e4741021b2218996ac9ff71d463a0f083d3a013d61fcc7eb3efb5f915caf4e7af380fa968448f2f00841d904ef2422db4794771c33aae3105f6c9c4176480313f6083cc9357d424af6e74cc213b8186314a3c6020ad52a825ce16027342e446f59e58c7055633d468e1c6d4d578af479390d9c4bb7707ff4cefe279125a3613fed160f8dcff7aa44776fcc6d3323e38842910ea3497af7e54884712f4fecdc356f63752ecb27aa6be4a6ec6380a2e659be18d4f68d4d9fed9e5a8789413c52171b4512be72c62b9d7ecffce452a63ce3dbb6ffe7274b4ac0732cd900e281cdcd95b5410f126a3f6b0bf1fac1661da073b5d55c5423b6f855ff562ce88c0e48b523dcae35f47ec573b5f4d9a168bd469eb9c5eacf9f6b05743ffc6d643082cccf52cc3a94a793a844fe40da8a768c240b82f78310b1a03c5bbf230ffe3646378690d4687e4f30fc06f5310a1027e570be311b8669987c9257ef5eb7e7bc6850fe0295315275e6a37aafa8b1e2e5f93dfb46dd10b43f4bbf9141b116275f01556668f6c3000d3456f49cec0d7fe65a1e113d5893f0848b0da91b3f1208608d0452362081c5dce062d3e7c303b0b40b26c67c1a64304e8e56e1b921f7557650bad38e59faa5c9d741ae8e1fbf504c067f8b1a4071169c77a23e610dee5d87e52e3f7f2cdc9889b928ef06e4e2a78a1785ce1c3d4fae09febdec70c1fde4bc45c1530a4d106cf83b7c7b31d8b7e1f318520ffab2d78b3a68d7f0d28721c373606be86b8ed81b8e7b0dc0b3d5e51bd3b9a10f1947e31ce1514c95753893f7dff997e8f1087993118763012ee3fbca81edb1d72c413a856f65eb13d7613b2be67efd60bee9022b52cbef3bfcfa3539c987d7232770f142df7bfc557b977dfc157cc3be421948cbd6c91fbff204404172481d9d8837f127e7b7da2eda72fb9fbc224b3f841aa948e2d07989b3035c12451be793239f192bd7718137cf4a065c5e3603687393704326dd4abce59986f9c74c59aa6524f6fb490549e8e9e9dec42894d4e5d7ec5de75a538d320461be86979a201264f33f251c39ed65ffa74c57f7bdc803f0fd7b09250c61be7796b41c5e17231fdd706fc5adab8eaca494cc5f06b205c105ea8fe923273db5bbdfea62c3babffe72e5f49b7939be7a9910c55c8e32dc7987ceaad2c40001d5d458728e6a3d676a4aef296d7c3c255ed79a7e56ac50e9c0a376210be388a8676e121a7bb7da61d5ef0c6fab88afed2bf02e33854c43e8f14f1b7811021777bef2cd3f5d965979040b6e09d9fe5501c1612892933f30d23d529de17ff9d4b4718b645eae623f96833ed5452c8ed039a50779bcc665439e7db8f59fbd1325b36fa741d0079c431c1c1db25530e8cba3a7ce0e1bf48776260e1425014cf9a86ae30fe6c5a3fd0144817d8066da3b393514d49d025afca0c356f3e2bebbf8599632b4df74e8e8c52350edc41cd72687ef939269764f6c45a45a3fdd73483778f22053a1d9fd82fcf549d308a201d8dd126347e405a63851cf5554dd6459b412b3e0abd19f9fc9bb42614f1ef7d328e919991d3dcbc8c62bf7971ac9c82ee101a7eaec4e40398b264f35109cab8514d18ec1add6e04f127ecbdb0e8f34014ea340b18302538d95b8a95566678bdfd03213b0138676c67693367012f0b520bb3113645b62502929a944445cb53b08d1915a850e0b18a2d05679cc5c2c80e6274b638d80bee3f1c67572ac9d4b3e6c6ea95606d4c3bb83ba1e4945c240f5a1913ec683e8e9cb4209e3108ebe46ad5b055274bba1752fc606c2bac2b0c6128ca910499571d3a0b6e4800e42404b5d8ce49128d14f5d402f7a25bf298bd6ded4f8cc1d17bbae658bb05a8b69d3fabc7ccf20e173e5b5fe41d3b55dee8ddccb15e65b40126fe786f84eb4b036acfb74311f884548179b0d88dd246306ee42df5ea5913dbac269594b8fe1a0d8f0c4a39cc402846ce941393a7e4e45b0e2173dc1495cbea2913c46467068f06516dafbc78653be054e8d772793582e80e5573e00339041e4788185530b4fa7747d1b236c25581ab3462a235f4c7ada43f5c032e1d63651a3c81bb45f3c7fdf2311e56fd6f2b2f5eba59daf453d338ef5024141ea92b94ae2e79043088880a099a45209e52dd812415c90debe3f1eaa2a3ee8accfd405b0c06c7057ac396f2f92381b338893405fd2b4be98a37a1a9d89c5df54c54e3e049c2b1f8a42af8a58f0cbc272d887e89816b21fbaf5898b8e2dddc58f0974c68f3248ed9f7bd30b566b478d5a96f127eee13c13b787673953e0713a76005fcaf35ea7d3da343da225496a3634f65c6b6a4c8b8a393c9425af20fed69df27f6650ceb5040cff7d997c3d7e722792722472af730b8f55791ee78de29414a1deeea4462be62f9022771d1c61d30739f6db1bd0ef78f0aba2db2131d4714f7f1760a5193b1ea823aba146ebbd1f88d43f90471e5278526966f79bf03a676a11839f4a83cd80eee6c2604723eeb1b4d4b95538c6fa0067993d4bf8d0e6168c414112698bd7b3a35ec98144f245a99aa827d9121c92745ed7ae8b61475f5dcf69bd21ca4bc90c0038b53d5d2bcac6dc8225a182c671c7a3efec9b7e1387aa14f56bc9561feb09a804797f08a42dee6dbb652e90878330701cab614b1efecc9a69204ab859be2826aacd9a27d579634ab888333cfd319354c7f58c6856b583c536a5f09638506b864146241246f2dcc884cb61fe0463229d78f6f0af3857d09c022a59f30b4beeaecccc0bff4f6663a0e48d7dedcc8ead42ec383557f91d86f1e08b3d42fe10605b22e0c7280c69c4ae670eb61c3cc5e7f6f15c5f9f03a07a71ae2511c7cbe54675926f6b96c06b1f8aed70724122b720203d6b18c6af7442ac29f87d33b666743521c1bf3fd36b5d0ff730aea22e5d664280116832f8e16fd4096f24ff6624571cce426066098d5af78d06da04050bca5b4a060faa42e0bd156557f1600ad9978f52c3cd8e4a879910e7c320b971e61b755a2b930f2f150d9f548377769808a5afee0b2051a677b8b0d4d0daec9bbb78cdbc4d623bee1e224585077c7eeb458aceb118ce1bd49e43c2c578c11e2d0c6421f57380d496442893077cc7f0db3b5421d784c86c45f4ade46ff8a008467e4681126f6e4c912778e0d10f9b7dc4bbc4bbe4a0674b1dd0fc83705171cbd12a9f6467806d10a03b7c887c943237333891c99b03d6eeb0466d608ddc9ba7792cfcdf5062f06be7b6191a6572e1a8195aa1bea7abb550969534f05b369a4e882898b79accf58443d5e62c476898c2dcb768f4f348d6cb36b9aacef65658d2aa0a1297b734990108d0ff144c06ea1e9d3a7a79ed58fa3e1745da88a00b4adf3da41ed247e8d61dd98dff68352a157fae7efa20c175eec2344b088a00e030cd14225b4a4c4fee992c1fa7c64647977ae93e2474945178c9765a649f8f8549305e0196068661061032a37093f304c80e11d44eff503e3473bb1ced4d820253f109972ea4794bd0c6bc76410c1be9429d62d360b8ca2b525bb573c591988ca65452ba3b249a03c7d5199ebcc3ba3f79f0306841bdccc34623b5ec71737d06ae1ad642ec13ee393f4741a33a667dab704be3c037fd20a512b11862a897a33813738693e7920a2484f0294ec43eeda8812b5af0b4418387c53144cdc4d9198b803e933dbf23f6355e9d372589108e12f4e6c3c32155469f5eb601fe8537a67dbff3b3a24155ec66c103aa2979cd852421ecd6da2468c03729fe06b587d949835d7a8d5020d62144657cbe1e8db1162206f1790d898a8946f5535820074afc2ae6d3e81c7c7de63ab55ce460c56c2fd3bd29a366f3979e4c6c1910e9d9c9e4931240f6e8873a63c786aea91d678cd96e2d2400d72dab983c2da1170bdeda68bd359dc2f098479a449a62ac3799fdfc188afd96f8cb74f4edc6ee227c0152dae700c436082842c265fdbe48dd5d43f0e99e8b0ac4c6ac640ff3b931a5db2705a3a1f4ba6efb1a15c649eac8230930abae799eb8e2044df54f474a6165c47953d5e9a0dbdec4aba69671f15c776902794dc8557fa7513a33751b3dfb4499342edea0e97d422d196afac73e35e03dc38e2652961dc4dd1d46273574ca5c4b3d00f5b4c71ff7471e4626673f8cb59a27b9c6c8292c5606f7333a539b7eeca3a7ef2a938220315bfa5bb8f5b882723fb7ccfc19250b8391d431f4d1778dadfa3666e65db2bc5deae4a2e02e28f07aad2764d272efe0a6fdc3c0a3cf3808810eeffb207bbac00b5c0870a07283065e6fbdffd7f7fae1ef12cc9fc1eabbef49f286c28cb2cbb3025e866de0448b8454b7e744648750ca065e95579cc1ba156891bd3cd3e8059d2b861f9485e25c186263956337ce10619aaf48aec5e20a5a43524d1971b6200718c18f9a73b25e56ef73f3fceeaea66a0d3c22260f4886714feea12b51e23995dbdde924e184f8d5544a613e2bf43b1ee263a594f70ca88b33059a1d04df485e573b6f37bce6f62adae609afba7c489b67436e5cf91b6936cfe350441439e074e6a7acb27fcf33bb7bece54650d601d3f3f7fe6637504e5ea989001eeede4d6bb988ae749aebab31a933df7bcf6fe32f450b11b76813c2785ca84399329697a06aba3a4d5c69ce27d3985ed318e51908dec231aa343afca754caa305b714f8df450381e2e9ef5d8a11329228775d7cfa59c5b065f36fb4cbad2c0e7282e0db0891ff35367f512b39308b5d25f4804487e40dd9a00cfd71d9c3bccd5597287ec39405dead1d50d6904ee96629b0a3756f30af27d9ecaa8c937f99a1d70391834e10317d8e00e6cc09b4a253eca8fe42e68e1098d4ec9eca411e015aff630791ba73035858b2d043246f0139fe535fb1baf51180d553939dcc56ff930e39c2bcf6abe5ed7cb15b4c6a13fc95b0475ce69896fe20c6ad987d89e5562804f1abb452f2d9dcd16b5b7a87eaf54411ee2c48058d08073a67b21a935840adaf02496c1ca2c3b618c2432f4ae1bbd3e66b47a516281cba014abd6f58cdb590238beb88544b8c21c8b6b6a0cbccb34715fc85cda581604ac8822a1ed680ba9a5f922850f12b2a6e51ec2da7d557e14d729322db62739129624d114ea15c16027bd9248cd706d73b984cc59be405b25677b91f60d61c3aab7867078390c6a0c7165e6cf1cae47f9a68046ec85d10748fe4cacc3662f60397e856042c68f391de94d02cf0b62b2af4eff67bcef61dbfe0b62f061dfaf74ac383ac6713b4c1657abcdf52467fc4bb1b8bfdc25af84f6286864e1f695fc433d2d40d7adf5fe5f55572304c16a20eac4aa45ed8dc1410f65464b82d20b8587e0eb023324cc7709cd39bfef1f9458ce0a4127fb441ae3a7dcadb5c41e834e2c50b49297bab7df75aa39a17ae37d7441915c82783ad0d8fed51ff672f2c54e77b0da6200ed46cd4bf377248a505066426a17eac38ccafbbd40603a88e4a48bc596858dca7631d4aaa02fcc964f60c46a72e9a9f649e90926a4738292fd77f27696de0eece6ea6e89075843613fd5c5d2a413795c6b646eb9ad866303c9e953a89712ec529a41abd9d105cb0e77fd951a7257d5f668546204b2f128799dc7e662c73138deda8e5dc53358a67044e256092a5445f23be2e7c9dfd856439861cdbfc25c1993d861cc0aa05a2bd1e1a924407d85fbdac9d6eab266aa4082a751bcab26887d146e5ed381fae7f7cea4eef8c619138d470dc2c6faff92a762bc1d3465f041e1ff32e1611b303b2f4e49ebdb04744f8c96793e69ae0d27a915a4d966e7977d33af21b425132ad6743f6657d4cd6a786a7b902bfa01c038af536dbb3b7f0e5dd210b29b3b0d3364d57446d131de5510c0fad9987c8d6e0e1d81ed2a46128d778eca411b49539eb548024a13e7477d9a6f1a6cc3dd879f3cb2c89211594b0645fab966b05188b2d34a5319682b1dfe544a9453dbf4d31f6cdf9c4c2ecc27ffadba746cc892f7d2d2080ed858629abce0ef50d4771b8570b79ac764a3ba03b81436a25f4ff4a9b8bc928855c63fed5cd8679a68268751cddfd823cb78f65d74373b2a70334760bee2748c3d55a0a683e00f7f263924afb67dad80156710d28527310609baccd156f6c99629ebd3006aa8559f63448908188386caf629a05306aad3a0fdfc5135858413a3b296a1f1a75a70e1873618bb23f639d267a00c0363046d1d0f6391499d4d8f03503c4debc0e6225a40f20747ce70d8f2b00ce6cb04bec57233433ac958a570759f7c43842bd0c8ba9fa4e798d373331108f074f319f2b5f2771cea7907e9b5a8d4469b9f8966c2b803b47f080fcb5318abe4a0050d08941f0fbf5e0a20ca4cf4731f7263a1a8b7ed32281303242694f007e9846c5fb368421272e06a4af0da5c452f21f9c10acff627e0f106cf1328030aee69789010b87f1db4796e57f69118c9e062d80ad3f06d65c1b6729f6eef17017521956af10e77d6cd26985e5c00ddd29db6cafbb6669199dafb158af4e34b1a46736994323c3e2c09ae7f9340f955494e2758e5e1098967b15cbd9f46058f3ada060ee40d7191ff0930371c6c8d9fa95d593f07f1c5fe1612cb11d00d4b26d343b5fc63548d41007f961f1434dcbb0b6b9562e67deb7b13e40cfe5f2df99c26f7ea7882cf71bbd092c9022231e52feca39781e50e03c8e08e760ff9d9a8efd41f82637e7f93dcf41ffaa7276dc09a91f4ff23c0fe2c1ed4bb5b387ec18809fe5908b283064db48a392f60e03b7eea7f0e12a6dcb5c38689a8b24fcb7eea8407b8aa97afd455cc1a4b9ddfd30dde064cf35ccfef77e8034d494847b305d9598337baf0a386c909e182e67f75bc9f57c58398201a794c4817d3837b580fd4101767ab197e8484e8875ced2d2373bfc30c1a1081cfb74b6dc68046d9cd784d688894cc8d5113b9d1196afa6cb8a28df82361c53300a003000a001600d000202a00800316e91e0f0a564ffd00da939301c9295966a752d0822ff881f14a664ac5b74fdd6f1ad272e38b9576c0b4bcb3f4fa1715eb7f21ef2e4bd77cc0ec89d302fde0a587e1ff9cd07a11de95afdb1b9acdfccce99f743c7765aaad2061437e72fec1559fbf84997b9d05a31708f52d674c775fc479f78485597be3d64d87668f771ea4f2ea9ed6e36783b110b3134f1e12c4bee6e186aaddd9509c5ae859f7affc40c4161df2678c50a5f8a3b43b5586aaea1200dff9e224c42442a9edd96b1302e7ea5f1284ba70357eb185c25963fa94823fc17609e66266a5707ae96df9025570d34c88cc0fcaf6abaef588bded6f29d3f22e03b579db8e1aa0bb317896db3c237893a0323d9c7d69d6f232e807bff04590be0a8fbd74486dd8be2468966ef68ae1117ae4003cff53facbea2eb97aed4c0dcf57b225ed0c3356be957983021d41c14bba73a785a8ca7ab3fe8f0c3889fb2c7a1c96cddced5e6040f2bedcfe41e98442a4683cd01550f49939b4048b432009d36ae8b4997b2bc783546bbc569d8ce64c761937b151fac08ca1a091da6e21a3ea69940c891facb6d6e7ecde2b55a439a56290e2efe33ad89a10dfc97197486f74e900861d0caa6e747a47f9224d33b9d6492d87f4bc42ffd9759247add2f39080e72e8e01ec567dbf83b708d59a351ebec73433a1a19b79e3f3662f3b8ba729afc4a57007e80f044bc4349a880616e71f1c16002b6eb08f9f01a61793b8c133e1f72f1195f30a8a7db4c037cdd850fa1f5014edbb0331863d1692d65bb4039d29d812373d4896f70420bc6a3744cb43d0aa2d5f4f643997ad4fd98cf81081545c2cbfbe90635dae8e75eef2b695d77578390b350fa1fa4b64f226b4be7c54b066db735e4bb027b6e95900091be946d33e0f37ce0337a01e0b001e202d80c8e6bd3d47d89f7585f0b668d5fcdb66a48c0ec63a76ed0766d576f695e1aa12725a40ba549b1bca02a5a9db5038407ecbfa2f05aa8e62f37bbec4ba2c60b43b29d5c3fed2c8ed617cd6165afb60f3696f04baa98647eed8efbb8687523deb0abbb48a85fc20047d12f629d84826dae0a30c7bbcb3bf3787d186d86d9c518718dfcb49cba91be9ce48fda10fec5a78d40037fc7078a23c59e32c8f5cdea85e02e24d989370ff2070ca087a1617fc81867bf855c986b26163deca5bc745f4a25295a061db6d4819d8047cd5545dc66e67ecc24af55fd00deca200ff46dd0c43aa9383ca05e924dff743af420182621c34a3b465cb7b5557d3cef8caa1a8827b1795c1267ada3f2f37a0ec884daccdeb1ee61d61edeb3677d2ebe59f502e99ce9ae652883786c1fe657887824aed13fa852c1e0ee5c4706d583a0d884b1b2ee26a030eb44e9863b5375823f4c12b980dae77dd7c448a0228aea726f4e5a8e11759554f8e6f72e7592acd47a1620dc3883d4af230ca975ca87f03ea13a7569f4aa63687eac28d6dcf83966a546487797c452aaf7d9915a649d01f690bafd8d8558566bad9abfed313e293023d1490207ce971d6d85742566568e1f08a802d70f4f2070acd5e2e8f691b955fce22b59fe94d49bf9817a29c58c74b91a16c5ee50ce7bcff5dd5be05bf250698626f290b9d943fe319d563bdfc712fab57ea2aac38ad57236ccfedc378eae9046b09527d02b5aa5ce8ea38b6b3586e6efa2d7224ab0de5b2f36cdc05d3bf5e6f9ad6921d1671918b8653033828fea71a9bdd92a4175f42c9f634055cc4a89d950e6809350dfe8940b137b3c832672ad4e5664f9ce7213e3848e3f7d5ee88be2e9fc17aed09feda48a3a3a1dc94c9ca45ba0e500f9dbe231e90bec78f91b89336eaf70a90adcca493b67b44c37f8fd6a7f21afd06d6164c8e8af28c726460fd46ef795727b8fb030e5230ba72312dd9abf5ffa5099c1d3d156e1ff43ee649857417fd628c53ee78aa6b8f7fe23fba21da1bebaeaf183803f4dbc7e4cbd9ac0f34a9fc1aa37ea20bf8e78348beadc665d08a469d3d40ed5c307a17140c418ece6fcfb70aa1e43feec6a49762c3504c7769f27679e5fc682a5ecc6749acc043fda3674956f67f1eedaf65b29da8bc899db6d48decb44278c3c0fe17de1b663f4dec396d5d5d1fd352ffdd5426bd2cfd4fe38a026c32314c11deaad8548ab284a6c20abc53952dff633f99fc6163e15778f72314984d5417106034b0a671ceca2ce9a2dba12559014c2039c19c399cc55a4849ab99c565b14b74c0564d2c49f04b910054af2c500516ec8f22538f1456e06a3f88e7ad5f3675bd422fefc03405d594171ed4f9684958f092a8d16c987c84c3862b900a46b92444dfcc108ea44e249a6568dd0b4567ea70f375a5d98c25f4b9ed900bd76eccaebd9c376ea35bd0e073ffb2b7260509f3fbdaa26dfc1c1ca92c0b6f581078d86ada9f1a539a5f36e7f587534fd73078eef37bcc1baa69253fc724d6336c7e261369ba076b2930f708615e32e6e52ee8258a0390d242506cb011c85766f1111b00eeb07a6900b9c6b44f1eed594386cc0301d223a919cec928f18de709dc7906cc6cd4ddda0bafc40e6147381413d96932e97f607c9067754bf0ba9578bb21363e445626ded6c67766f33deae67cdcdc97571deb4eaf1901deeb8f8460ce4e1830b6bd58035c1869862e5e3a55ae10387e61541eaea8d4d6b861e3d4d4b8aadaff30ced160074544f941648e41b72c165d3160538113e7d031de33d89c4aac68c714c13b32c5ac1a8673028090762cc6bb893853f5e2c5dfa13e9ecdd6cf990fad7067c60194b585a11a5e68a767bc8e2c0f0da692d2703e6bf1044a329210dc9335291db43d619a9f94589665dfaf5b59adfefe88004575dc67276a00cd40574ce6c608f0b963d53801030f0323bbef84767988951bf0075d5ae995f86c8affe0bc9898e33bf4496d10e00528e30d669095d0c0bb68ce281ff04fb968bdb2263e8458ed215dc3bb682c916b70531fc9c1e0c157859f4f8bfe18d65ca7676299d2a06a3aeb1e9829a67c904902eca0183f5aaacb1a14ee40898651aab968ef6b3a3a94a6b3e86b8ba60318c08721993225d72840d7e651f5f014d87d6d96e3817a3f9cf899a8a6f40fb39287c8802825df1d0e0cee488399646f1f78a266c8226a73111a6d60b32de2cbf0cba142a640496f90a72b44df20bb41a179ad6011af9bfad62f4f5681104eb31393280558fed38752617d6d43eb2b7a02eb3f50261f4262225a1c49b4bf6ff3f6ebd6abf3457862c8369ed1506f1715d2a901c633af4cf378f757747ed57ddf2c17c445b910d7f6cbf789cb609754c21beedc871aa5ded75ab19f994949d93d06b880788353d908854c21f7607480384b0878fe0d2d4bccfb9ac9d7f65d318f71d4524aa5adc74b49306d200cea4952d60af73b817151bb5119effb0c3bf9429b77c11b19087e89165a951b743e7a9688a7c5a04d813d414c90c78dbdc0425c0bfe9f1293052ae88df1b9a60bab5f7b883ba0c312e234eb026fc0c9869898d982a3ffb2a98da8be4b5308e94e1cf72938a5a7ca0034cf14833731a4959cd18aabb95177cf4c8a092609044b4dd5ccbd49760b6aac03edb8379d53283e0e47e5719b7596db74f6d946d72a6b2b523ad5162aab117132d50ba338c69be3ef4a1f62f50702c18eb62971b8fe5a746beec7b0582c8c127ae69b07f7e6a1f8f4621fb8c1b43b0d157d47f948c1a7b1250c776649ccc9b3310f26110ace85c76a04db80604b6dd06e40000bb691e6a3890966dc50301df01ef9b2c3d2fc4f419f7d72d711bfb9d68963a972859b7972e1a0db3e392b576ca6e23147a232284ecd9494a75bd0e3cdccf63bfc7bec32404e22524557ac751b2dc6aa33cc3929397ec75a8d290c2e0a82527eac5b62c43e3b384ce3eb5dfebeaf86b55fd457161df2004d4c8419a4b3d24becc1f17aa2e288db63b55a96b3416d4a3b2bfc9a6c6bb8c7c1f1cc0a94273161888d07a91227387c33d240b17fb27c8a8071ade1f11b4073e6e869efe27347e52aef54cd3d482767a30b846f6863c0ce6d6c026d835300db594635392134032552511f85b82150d57ab3ceb49c803916248c1ac1cff59c1cc29504c1017d1d7b6789eb8858c545c2f43f8493a4bfd3d9ee9894a5d6cf8e5400f8f97a69414e680891cb32823e8113adb154ad77f02ec3174456121aeb04d15046018c376791155f2e45f02f1c3aedcdb5dc9d3582a3487ccd9a4cc71ed0e22b41079b1b70cc380e5f47cd0d2e627368287346d0efc433084183be92fef49e0cfea93d7ad341f119dd2feec3d19156250b7a31133e812511f34dd00019c5205934c22527f2ada2e0f99d875e3a90a0ca489fa42ccbd732aa3c99939183dc541223fd1839c6601ef004f51495ce73e86b17cd991086d7969f2b2768c1bd5d72c79476d491067443438ec60548737cf538081a99ca9338353b5600db9d4a3ec8b9d0c568965908e8d44f3467aaf654f592c9b10ed32b65e690172fe34828afe285e994f115291396530f30c82e8c283dd8a8f1b60427a928fa3a756c19a676a519c079f0a573d58551edc3dcd2fe69c78cb735dab07decb3b2781e6c41feb573e1f823ee2c13dae7e46444e892cc49ab1808c3867bbd6ca0746be316138a0b7ce661a87d183b083b75b922006caa161c5c08dabc0da06a64a4edc96c4ebd47545f378e40831468b4dc659a272ea6ad15b7e891c090933ef3371d9166b7dd71b0c4281671ae24bce535ddfdb13e43d64d500b1c1ca476a362e189d34ac6ba856c5e6832fd003e6783fed439026c0d2eed3e0df85fed9bc6a4b7f1647f30047706e58dfeadae31d0ba81d5db7c2354bdb3dd4f4dc8c6448a9c3a054a93268f4e1010f08a3ae782dc87c35491ce8f784e11da89c83a80c5d90e3aa1a20cd9e38d46ecdefebd25838864d442d26409117168fc07a14d71813ca0313502a8f3f9935d3c0017e56a77edbd19147296020709ba08fc083f94c955b36539bb7bacb187167b80792442496a923d747b00fdbfa5bb9d3b7bd5e38b1e4ef45092071a792891072e8fa20f96ba8cfb69f2ed636eede3227367a7585b8bc7173c4cc0c3c42368cb8ead345bc02da557cf3d585e7ecf2b9deaec73d19e8414940321241588fa5026fa438788866a0734a6776672d5cc0cec3d5f2edb3b9d65747cc99cd0b1778e4d3303cdf2f27099c3c0325f1f9615e9cc7f1cf378e6ce5c46c7d7352f121daf79915c0900faff7a479cff577247d6d21d64eeb863c97fbd77d0ff9ae560fdbf1c2fff55ced4ffefe424fd57b2cb11b297ecd0c20eabff5bb5a3ea2b931dbf7f3b68a6ba3a12f0f55647ae0e10eac8311bc5af0fd37155e938a2038239103047d57fed73fcc431234e135f75712c90030f39ccc831460edbff5f5d1c69c471260eb2da0b871a38bafce01082838237aa78c3ea1fef468c7778c7bbba07b41456f91e73d58d2c37a6dcd0a00d30da30a18d0dd810830d16d8386283c87f25733f9dc6bc5c6692e293dcdae7eb3db4e7f25549dccfdcedd945eb14cfc0fd3b6919cc6d1228cf3d074d1d058e01e05c8143548d7047b27e6252ef9c797127896bc2916b94fff5b5c61035b27e4113d79d1a55bfa3064e0d9dbe4b6a9e9bea91a601e783b9591a61ea2b0daa3480bebefa0536bdd9fa7f73555fdb74d1a6375c7e466f92fe0d7d34e2fc1f41e38aa28146d2ffde261a05fcffe3805863cc773820d667d470c6ec8c0ecc78f335783985555377a798986165860a5f6fb51a53c5ba9c1913b8d17243839b10dc7c196dbe5a736f6e69cfd645310f962f6b5df456a332b294b15406080878a30e297d66afd2982f9b1b78e0c185b26420800c27c858818c236db4da00d1864a1b2063dc31069c31c08c011c2303366cd818c18604362f31ecf8af3e6c8444b7aed1a8e005c2f4595eb39f48b1d8cd325dbd63b1255deb144669b02471faea7031a64aa7348dc26ad944352eaf2e9b99eb74e5dbda915b2b064e0c08b4cad0eaa245b4c6cd9aab355cd64cad317280ac034c1da0270c337e08a5d5ec3c1b199dd0173eb9e9a22f17ce5d1d1d69595e1cacd67307c7cb474b751f3b0e97b94ba3741b0ac63b5dcf3e8cf92e5896b7e3feffc9ef8401465613ba4d30ac4a30a66660b8bed8fae2ea79367b5fd88efb1117ed5f50f3dc6ad0d06825d550a971a901e285d6bf17545e3cfdd71d2f78febf6661bdce9b84acaaac5e9652175b5f499ca37c971878bbb8aab60baa97eb76d105fdca05b9378f7281f55c503d142e92ec6c01e7ff2bd98d6c81f5ff556a8baaef37975b24556bb7e0f94f03e7d360a569e1abb532998c56b4ab15e9b053afdf1e59d68265794f4ee6232da6ba163c5968fda6ac3d77308b25b2b05f75a6dbe4bc2c807c182361610725710e8b3075ebe0a51a0baaaf583cfdff6f2c8ca071534ddca55434366041834343bfd64ef2bb737ad3717685d68cee4a7c8597285d7e7245ef8a0bac00e3bf623ca356dc6085b642c87f1d476b2d76aa028c2aa8fe2bdff49298ac42c97fede4ace451aaf8af5055a854a17a4685182a6cfaacba29d89822ccff578ec9dcf53ed2f593da296c53e85ce04c0a3752c4f0bf779a16852e8a09b0f2c052022b0b16396ba2e3d010144d401100282e140a3cd1e68584fa130738a184134027ac13449a98a309ad87a242c76ac926e8993767ae3843c3192c678aec1860ebffe9489b68ac7724744442ea2b65800898d062020526624cb8aec6b8c2ba0ae2aab6441f4b44b1b384124be09608a2841925a0fe5f08f338fea12f9779713566855e38a11ae47a9a29591ab34a3d738f98a7338f635fb7424196ee68fa1c7137a374bbecf962a9ab53827b26a9f1d8318f6325252a78592c762b9ada4637895c1240ae7e717ba769b1d8cd8c16334264202103124596a4658931797d348b7ba6be74ece9cc1b553b62ea88a32388bcf93b79df298059000facdeec58dd600582d50e01b42040553d3a72d52ceed72816bbbf608ef69e7b3717ad7c739d5dd4c6a8b975b9b9cfb74d23dc30228d115346d022ba28224c114f8a08abc5fd5aa1201f1b2f771b840b72535fe0b983e70e565cb38bee1eecd22eaf06f5264fdc7f9ad4b8a9e30ec4ba4c56193265a6ca2c512a83001158b59b3b445461222c113a4368e9f41056bf330497ff1f62082021dcfc5fed08c1e5ab105688255508325aff64ccfc3f991ac824fd7fbdc11c19d74e105a40bc1404d54e1049fe7f4c9cffdfe7183463c8e43154ff558f791ae31a03e4ff81c8faaf647680a07a2034c6393176ece0d4f5c962b11b8ec4411c259391b458ec46d27cd8a4c562371f36f300fe872d7e70e107a31f787e681047b94cdce4030b3e3cf940c364852153751800f4c0460f34f470f64079d88287137818daa18d1da8f87ffbca26ad1a197d3a20ee75cc77dd8773b02cc9cb31df1466764cf28e9976180213074c1260b28041327193ee0bdff982bf4ca043153ae8a0c3eddf87cd0cc47a27073239ec7278e500e49f6ed3d2a0e9c5031cf6c081091c64c041041cc627cf5cf0cce932effddae80d40dc3075c3941b10b0818d0d3fecd8e042b52f17f6ed8eebb9027db8675a8bb3e1470d65d400a686df7fb5380a47f14d69808306313450d150c00c59cce065062019f2e842063132ec6428ba3f5d2673ce52580d9e395cde7e06cf1cdd669510552d544955415545a90a12039a188c88414a0c406f7d96c2acb61416f3d11faa712e667bc71a0643171892bce0e685245ed02f8c6fed6e53174c178ab4a0a6053228b430a585a11682b0f086ef1d16645de2e8f244972532f89d2e5e9ecb175cb47009dae14264cb165bacfebb111f36f316ba821d2b58b1020b2b7cb002102d2c6861d2e2da518105159a54e84923052f290420052b296880821d2850f15f2d7f5d9792de0d0507042080140420446507950f54552a8969d5874d9c3b61eb8434279c7042d25f18660a809a9d009c09802e000fec98b08709624cb0b5f2d2ad29edf9eef26ed39789bb8b9ab8290b145978960c4a18a3041e4a482aa1032c6760c1fa7ccdab71b9db5876825004b30461c121536d4c113175c314d554d15712e782d707abbaeec3666ca6c4fab0992dc53025b0d8ee08a8052c03840262f0ff3158b5b6779c0f9b198731dfc9e898e49499e7c691f9fe2ec73829a0ffff73ebf4f2ffffeafd8c72fe2b812931b199f55f7914f36be4668e316d5f03663007c41a87cd608ea4e1cc6f64c6e1cccd7e4da86242583335b3c091254c35739991b29cd546963b4b922c40be92b8842d96c212aa4a48fa2f81ab81c5eaff93b0f0d059504d904bb0289cdafaaf98df5e96d77769309c9af2f23f65a78404734031802c84c0df3fd055cbf2fa3adddba4d966525a7c2b498579a9258ffb792475c05712632cb949e7738b93eabf9e40d59cc2d96cb3dba1994d093a9cb093397b972a77c7fc5696e7ae93df25e07038d6bb5bfef45f494c7b374eaff4ccac6d57b45c09fab9c9a56e9b94c4e5ee7aebb6e6b34a86bf2a0ed35bf378b7dc456d29fd4bf235092c5bca3b73bf7047b17f9df274e69b735c37d04c6bd59da69ae9f17d6c7c29f8824a389803758eaa1dd998e8cd5294ef5e3bc7529787250fe5d37f2d79f6521496e5dd7217d54394ad5abacd282015eb4d827944c209ffff34db8c9ae5ed32fc0bde623159bf49b25b51afdf244ceea3dc940be839d19ba147ebf1f0e4e0e9c0a3c20bdac5f9d1e2acb975596e3df21ca9716ef4a9758647a51d98ffdf25c16ce01db00e47109259ffbdeb8bb38f0fb526dff5ab336de4944e8ace486e8d9c0d39107249ee19d789f05eb943f787edc262b11ce0ce0871070871617022e08258d9c38a15cc0677f98399fcfa6ea71877fe7cb7d77b758cf57e6985b27ae3283466cdf276e0e554679f4ad22324e6714b7d6abf3c9ea53e40ec4387d47dea3649833a1fa94f235aa1ec0f85b2b7d7793a5b91b242046a0d9497af3f6cfab02e77a8a1ff7f4b75de65cc7f18a94a5905032a5c5099a24205c99433a6bc306584294323c019a1cc085446d879d2aa50169fdcf45d12fbf0ad665c4d9de92eeb4b2994d5653316b354f0e9828ac52c151d27b7a9bb519e76788222a58fffeaa27c5639d6c0ddb30fc9d7b30c93fb88c453b7c44c25e65b174ab1752914f0947a86e224c67f9d39dd9c8e38f544c9238a9830cacff24b61bb5cdb6d4ad238b6349334da8d707c7323bc8d71eb12de8cc29baca98da61a6aa7dceabddb556fbd7937172c390e9663c799efdba33d9316c7bb39730a6b29cc7fb1d88dbcb857e66bbe9ae8e8e42269a43e374fe291678ee3b2be92215398df6da6a9af4c400fdc5a0ad37f15818cc63f8ea5b69226119644789a8900544500f2a1cd46c35732e36c08d4d8d4ac086b586a4098ded3b684c412d5925e02fa587f0529bd51a2416904a520509480c2a5c248de84e39d6db216eb274b3cd13d59e0ff13f8f0c9014ece70428493149c3439095ea0595eba7b79c78a6b1e6dcf2151589fd919ee86b41e6859425aa6edfc7f0c86ebbb4cba4a7a4ad2811202560821b83e98e3bbc95613344daa824d9af03071f353d7c7c40bf63149fa0f320182e4e6bf6a1cb5790ec9cb77a4a719920e3dd23afaf2ff7db7cdbecb232323378cc2184d31d2998151cf1da43498d39bc463e79bc4313258f6d059389332a3397797785912b524b6040310b4fe6b4f4fcfad5663022129048101d91ab21e42991559051f50f1726d4ac30f46f80082a233455bc2a2a8a29ea2204a7aceb775bbb414d6d343af92590c8f308615cb12c66e1506f3000b0f82a107503c3820c913611215ea8be2dcc5598a73b90ee074504407be0e8088d80889b2422217be9eba7bea3ae6d61acd3808830314420ea6381832b4c5d0008644181a82440d922d2192a0ffeffdfe28ce71939e3b6871bb8d1b427da8b5f487da20ae772138a110d6bf9097ff1a0a3d09b978fc066585415e8292aed9cd73cf80f8d81a076f2800c180747e041e39e2083f82a4ee51771b977c9bd7d21ded0ceb0b35090cced7cef386e9de83fac25008614d962ecd926eb4898912ed469930d594e8528d22318102657644991835d1924899109293a7334fe711ebffe48d5575b43fd2ff89f3b5bf30df3e170deafb1366b77f7a0fc4bbf087672f853e702ae953f53ff3b17df5e1f97f655d20c7e42c7c51e5a8694467aa8486afa7af7c53a1dbebff9f977bcd850574bd50cd9e4b59d1d4f515d152c4a988920dead8a08c7003321b3411e183c812447e4490febfe3123635654a595efa439bec58e6a89a0db223ee6714dde39dfb0e29c09030e110010c5132a4811e37c21e227aaa843d409ef6b3b4514a8fa6d01f3ac555ab18766948efa057140c2d814285148130833032a0fa7f4a474b61c172f3607ad311030f3058e002362e18407881ed8208849021c4082150421c1823b4404d688196d002a6d0820bc20ab0082be8153c5500840224420ac6841448a180011e2e7882b3232a31ea437ff02e97b49b3956edaba9a976a4c9ba8a58ababb4c955b3e3d854962e9a7b367f2f17ed14c6b7edb69fe58f8ed6065118b5bb7cf99e1569dc03ea7c7de1046e3e9cc08bc98d7c38416f827e811f7c28419cff0f253042825e28c14cdc0ac5abffff99c8e57f168abf2ada44a09ba813c609432d8c9b8464be29b4ffe3a74eb7c390e73fa82fad4ae1ced6ffbf041fee68853b56e14ed5d71d9beb77be2902381170f155262b9ada463257eeecb9b343f0e667101ca0f326d429a383756ea18e90ce030fe8f1c098f0812af505d38d30cb64e469a781588fa10354a103b6d0010dc206daf87f007cd8401a0d50d1400b0d9cd04053d8001006900819a8aa2f1bc451b8586c577335bd6c94beba111285d50e8391e5a6d66673d55e40ac5db41b099a3d77769be33cdea541dd1788024cb840090b38850b1c102a7044a80009a102b250019d8741d9bdd3342ae4f599b6dac2203b0c32250c127ac0411092da010e81680981140199204c008e300123c204aa9ec952582e4c20294c80e7bfd69e3b7b8880508840901001044200688500480300600800a010003e0784718055b52f26fa439f5c354b71101dedab89c95a8bf1aed697cbc4bcfa72f5186c9be7a53897ef0fe3dd2ef3bd9bddd0003d20f8d080364203aa080d20131ad0141a208605c829404c580094f0c71e5f7b13fd9d662c76b33e6b4baac4c992fa863f7ae18f26e18f22e10f0ac28f23fc1dc2ef127e511f73fa78f34fbc3e7afaf83957735298639bb3644e057320e0e3007c70a99dfed0266b852c85551826b70e669f6024bfbd9e3b3bb54da40bc62d138c52db4403fcfae868fb2cce56128d8305d3671ca93849ffb5cab1f535cb81f5726cf9c7c921c611a7963b0e20e29012c70f38848083eaabe5b1d8367376b769af3c0783e5b9437a63cd1b27bce17a230337b2dc38c18d1f371668c34c1bbb366e6cf4c1061998f34c831948ea4b06e99847dfa8738977b4dab9c6baa7cb3b1aad5b6fbbcd5186b1e4a658ec46c7974c26bb15f1749eba4ae62e9bcc5d768ec98b7b38d90b4ed6c3a98263fbafc00ebcc1f935b4fed7a046746d8daaa5dfaf71fb7ff2aad1871a6dfe5f8dad46086af0fc63a9edfb5d60532c7623c96bd338401a574f92b358ec66e2591ab4341a78a3554d7dcd29bc4d9b0de228fabbc03755e11ba537ae8e0619684c8186feafb6fb2cedddc45b771c44c3e88c38ff729dd1cff0c08c2d1c745d9ece52179739ea3203cb0cfb66e8287193e5c6ea9fcc6e7a5fbbedbb7db91b9b797d3d2bb90152fb2ed19441a68c5e19495f06fd100173fc63c90878820010c868830c2c3254f851a23c9d6d647c1b356d826883dbdc360d8c71660c2fff97e6ce265a6f6cccb0d1c286890d0562a0214612627431686234a0e546cb072d520b8916903575ac19c01a14d620bd92d1aed63f60aa313149bad198c48c90826ccff66585e80732a1207d79eec5f7cb0ad122eaa2353c009230f608638e30be84f114c61130f800c30a306000e30a1844d27c31c517515f846a9a08d574351a7841871761bc7812666d3d45027bd9209b750951a35dcdba68474261f4655f41364b47fb52a231eba25d88c2846c76b7836c19ef603d93678d846cf48706d11f6ac44f3b443ff880be5cb1d86ee376e7b1d8cd5294d69ffa53492c952f90e29cee76bd33e6b9cb37a96f173c74a1d445045d24c005125cbc10858b0bb808c2c56fb1660b14b6b8a59993c68e304d99344f698ed21cd1420c2d7cd0c2a605d0ff636dad92ab666db6bc9472a099b9ab66e9685f4a945a1b106b6a97ac925da23fd4a6041b5279575f5fcfcc409d0e7613f3ca7387f9d541d96ea95033e39ec9bbdad2213558624ebbb6487a5792e29c35c546f4977b1d4b658143165ab258ca22812c7e6041c4ffaed669cca7fbf4a9ebb3d95c351af3a1584ce98cc592ffaf4634163c51d0c4f90fd160fda321533b1a9d06628dc656fb4e86e68a2bf20a2ef55783ed25aae48a5e7805fdaf405c2c760bada8590142156b54f1a58a5d154e55204085175464a18257ad893b8ee3f245a3ae198b59badb2e5a5f354bb3c1dc1dc912fb7254bfb7a87e4d199410122a781eeba6d8fa29acc229aa483c4592ff1bd5bb146ebe02b18eead794428aaaaf522491590a200fd35b875184717f19fbee5254bf375914bfbf611421d60b2b0b8bcc7f25b1a8b096604960a9d0a8ee0beaad6732ecbb4b396866992c16d365287e2114c127e0fcbf9ec07aa2ea770f183ef1abb42792c462b7279cb8aa79e704d557276c5f9d7055276e1356df9bf8fdd7739b4d2cf926787a3e03a7d228ddd2992b7e86ea4cd21903a0b906e08275ee66802524135b4c50e193d1e8c8040357695ca1f9aff6cabcfae08a678937d5363d29cbdc97a05aa20325e850828750092c4a24a94a5e58eff2528e8178079c254146125e92302109a1248a98c93223e6ab6dc2516b668a191090d8fa4ade1aad7d4b9133247a40a206246648547044968fe9887dc4ee88080ad04601c014e0cafed19ee9ad1b89d2f96cb2978bdff2cacaf21ef528dde5264e675911f6e59b6ca4a302231d473a8e244d26e36637bb912226dfbfdfd9713afb703afba4f879a4b38fa7b38fcb64b7225cfece5b910e3b9134dc35228ede4658fdcc88a96a499a35e2a9067194b9978c20229b6231d9ef37eb9792b422cc22ac14a153268d32539479a10c07968ea31d6db794c911264f9eb86ab632a92e6a7b103fb14f98d01ffac455b3380546d998e4ec5846c724671199711ce31fc744e8f4c221dcfcff0f613544d5104f43f07c0d85d8aa24e6098146882a2184709181f35fc9585532543adc69bf3d324f644232f4fa82082308aaaf63994d7de61ec4d3fff374ee4100d97a0c1add49eabdf518aaaf24dfbbdd1d637f0c2d331070f0145e02e2ea4320aa2a1053ff0fc4d3ff3b01e17a3170423157525ec4f4fe5f2726898ad991117120945496f7680a939af6dbdc3680cac60f667ea8e187da0faeaf967c59ebf281071f62f001c90707c2b8e1d4e9e5e472da2676da26760aa31406d6431ba49b73301896d23cb8e101061ea2f4b183103b60d9e1680720601000060d982b606c602cf8d2e6cbd5971cbe00bf98ff3e3e58aa0c5edfe5586ac3603152df1d4ddf5ab1b9a5b636cbb3c328df74dcd1be00d5ae83153a78d161b799e84b9b394891430e403958e0058d971fbc287929000702843854f5dbbb4cb72da56467bee948626b39c661c80d5aff7fc3ee06211be8b0c1cd5b5c2c26bb15c5629d7e407fbfd0869c0d3a358c514398b0862e350c551286f90f47031b210d6668508186dfff101a1a98018b19bacc50e5eb8839efd25e5ecdcb4d333020835628830ea10c31c850f4d5be8236d0d4550d5195a5ca15c318313011432e860d609803862560c0c1c0c0e5bb499020e5ed3d9ece96eece1cd69bc4658e5f1d0c162c83e50b48bc90e505272f087121cbdc3bbacf2b5bc9c6c18bebb962734bd9ede482052dc4d1c20d2d3461610e16c2b050020b1bb000a44b01c22e2774f1e1d2e675366229ac1bb13dd3b4a7a5e696c2fd2e792468660da3946faa2487b90b898b932d7a6c59638b9a2d02d8e264853a56c0aabbcc7167b2244fdf6a07ee1586b4bcd1c2464b172d4fb4e8a870c70f2a2c852a8090421cf54561fade9ee9a2f6f573d52cced158497176ec7987b9e5e97ca9de3b5a95c2e6b9353fcd8e83b707afc6e6760a96e535352eaf997f578724ebd8dc4eae221d7632b7d491ec6a1cbcb25b51efb25bd10e67f6dd1b22ca587267e7616ce24e5c96389eeb3e5cea868832df53434439c84d8d8590e4b31c22cafdf4613e44943970731edf4344d9d4badffe0d11e5ce7326ee57f01051c65a9bbc21a2dc4fb31c22ca389eeb9c24ef10513e8788f2ef72a010923c44944ddc71a5b9f91051c662ea8688f22e0fe1424872278788868832ae3c7d4344b93ca5323944944fdeeb4344b963de105136310f87f5ee976796b7e338fe01b7c6e1a86be27c9bd49793e5c63cde71e5d56133981bc27197eb2c15cc54a16c2c86cdcb75960ae5beb393fa52286ba990d804ce64b7a2a87e6f51fd9abf6dca8af4ce26c6923bc692bb4c96a4f3d89535aee47025caeff71be10764a3b165d84ab41b567a048d812fce9b66e6408ea536b6b493c1d2de0b84b2b15854bf375f50dfdc2fb0d3f166caf73571184be636aadfdbedb8c7cb308c77b01d895d514633e35c39a375ebdac4c489765b6272b444a32330cd6e4c966a4ab4b6d4ed91af26fa8a945c94c1b2272aceff88cb5fd6e9cc7fbb97f7776a5add3d58eadd336d6c46ab99e92f47f5cb6fcfccc09c33a770bf3a9d9b4499f9a8a7a82424504102d557acf78c840c721699cb07f57d41599b92a5e2a21c2be5a7cfaeef6d7deda1f9ef55fd7ab6b35f1dce057baedef3f8cdfa7f1e99caa3faffcab3ff95b7e4bf8a3c9dff17776f7ed7b41b773d580d9e0143f90a041494548d90783ae736ff515a7905527eb1ce5076bb475f2e2b927890498864183289fcff6a84448325cedcecd9c5dba58f1ebba575ea2ad99ec72051e7842e8c4ed44d904b53cddb67d602b1ee3adf7acdbb73622ace776adfa9c5dbe526b93f360c6b8275e1bec059e19e7042ac6461e58c951e30bfa8505a6969de71d439868456116a0050b52a7d8855e254d1a14a09558a50f182ca1154aa7cddbcebebb4badb8db8974ce8c94d6cc79e477d72ccad796e71ca11e21415c42948532818018dbeb8d4970c8eb080f894c49395a71f296048a9bf0e8542599cf93be98e4999f91e8fe0deed37ab525e4e7a38b989e2459420a230450921ca04e2ad0af12680db78b340bc01694aa2c98ad85484290b97386c6e1c2e868496a54f4aed3cfbf8dc6a4b3e3e4386d40d3429edb9ee97ab48879d38362fee4c404498238255b9f9a637dfdd4c04aaff1ad4358940e4ff83b960cebcb8d3992d8eed8bcd494d4e4dccd79e9981dbc49ad43bb779335aef14a6789b1788758d4b2d49b5966fba1467a9ccd20baa0a952a2e1fc7becd77afbdb4c4f3d55a7a2989315752bafaffaaf4fbda332731b72d51d2f9af50b2a090f99f9308a50765498502646b2d7d323d21f364ea959e24119fd0cab1b99da2f4e54eacb6e8848b139f131e7b2f2ea948eb342f2fd27e220db869409292acfe6b52af2cf72f842842582184104200a1091c4da2109bb8f05f5ffa02b18bdad7d4f5b96a96d298bd348a4da6262f2672884cb4b699b7be3491c91626529814bda2f4e5389d7d4858482820e99018f8af51faf2bc39c612a5af7991c423258eaa8eecefb652946874c68804233a93f3ff412fcea818ed2b88627ee998631607afa5b05b734a1d072f0ef39b9bd987aa32ee1e904a153ae35982f55f73bf4becff9913972cd9b6253a48342a82c0e6ff65b2de6f7924db42d68228db1fc08ade145151e4138b9a8afed25e9677ecf82a794154b24509d0ffd77d448c85896931e6daa2075b3c30c1830d92b4e1bb031fc40e70073a446210392112e54054428ea8894804fbdfbfda2d7596c26a59ee18a9effed5b2dc3f3af67bc4d3481c407971688c212e434890e481240b24412444840e206445ebf5e532854ea10cc4a03541565f839a7a262dcf6210d5ff2cc8f6ff391168ebdf5e8ead080444f55fe91581aa1c89e3089afffad219783919e4d7d467b9a5ee91a96d1e713a52b134ce2d8995cb57a0ad1689b03e6056db0ceaeb824dfdd77e05935784b96ab97754cf9c8ae31a2394ceb3d11c5db573acdbe2cfd6bf5c74f663f5ffe20f95167f6cfd3cf2e3f249f37a5d26a20f113e4fff7afb344f8b3e406ff3f9e7fbf562f28a4074a1a93c4d45579877f5a0acc65044174f2d6f9f1981639a7bf75f0d887591208a9c453610379043dca0890db46c30f424d67993a0f1af168b592a3e35d31f4a49736bead371cf14897041248b480436248c2154ffb5a7a7e3a82e45af7939e517d75766aab9781687040d59a027eb2b25b3a53ebb6dc92cf61cd1404b832fa20651a20656340842dff8ffba4dfac2e11c6e9bb8a89c897d9857a1b1dcfb578362d8bca645caa04d062f881910612007063a88184c61b0c3a047c4c0820bacf8ff0f5ebca0cb05572ea0a2103942d87411b2a3512c79dc3bf6c2bd3ca4f2285d8ea2243633def1bdbbd8d7bb49a3b51bb14214b0c08c68410dffb5dc9b52d102a50af0a8c0870a441029d8a35a8b710772dccf600efb76a74714740a9c8814bc441e3e78c21079b2441eaa0a65b1addcfbd7cbbd6d531737757d306aeecd34c19c09d64ca0459c60e8ffcbd24742594b652483b8b7f53612253842022ba20440a2688688a5b099cf2b9d16659769751cc7308e182a218655621882b8a3c70e13e24e0ce2ce0a3b48c41d0d2248f32486e1da35597d8ee890fa1a39d6510e411f22044188105481800251e78da86346d4b1a2ce4dd4f9213e50467cc0870754b0b81fae64d4b40a65a94f858ac52c15da7daaef42a13ebbd3dd7de810f10110c4079644076a70a0141db0406ca08fff11caf672ef1f2df7fe755c2779bfa54c762bba9c49cfcc527ab965b7a2cb316e6b8e4b1e6f9b38736f2e2b2a37c7e6353bc7220329880cc082b911e31dcd7626932d90c5f3e20256e20253ffe20274b6801515b8caa2025bea2d881931c896204d82182002c1128178f9aab798801e62024d245042024e0944202220c78c8840504420c97f0fd5992cd28f68de4bf580350e10e200de01444403f830e08c015844034ad100971a05882940271640452c80e7ff672ffe58f3238cf843ff18c57f437c23c4078acf81f83a5f3766d273fd9dc192674aea2b85f671c11c3ce6383107cb9c2a73329813f2a1c587152af061850f217b68fdbf6e6c528bd03eda6c2dbfb406617b04d1830c3d5808f540410f233d84e441471e0408f3a8210fa63c20c0830d1e5ff050c19cc23d3ddba419caeab214ce45a96327f5b9e34568b0dc5ab395668bcb5693ad5702da4840990470a9346629df774c71c70d77ac7007d21d3f42397bc8b9928345ce939c0be4e8d8f1851d63fe6bd05218ed99f5d06de619ad3db3a7278a6f60b6ed7293a0295360a4632c265ba2635291ec725c47b00ed7ffd77be940d32fc7744c753a9efee9006e4dc93a879939707324fd575a350eb135a8349545d458aa19000000500053100000181c24140dc8a462c1644cde3e14000051b47468dd9836d1649d54c81863600600004000400002775171a3e24156cadb10d96309df5fbd43f80c71507817fd707ca2c8e3c1d2c485cc87081f139026bb817ed313d887db583c563a9ebaeb5bb7465f92774d263f8d759f1c612a3d75c6e395969eef524e684d403039fded06032b9b8b89b1ad7039aab78d2d2f47692ba1e789b1137e6601a9be07bc8d895542b0971e36218b2f75be69489b84c1fe475eb70f9ee2f68d428f3f249d366b89df4583a6d4774b7559d03c9bdb48ed737f74ed6c625826a0006c7c21caf0724b86ad3fb229fceec5e1ccf3fd0df78cdd3e6eee6eedee483f8216b7e4a2dd6eeaaed2f7bd3bebe526a482e5357980d1cfe321c504e645716361f4761349d1818a174b657cc657a067877a3280ac2c82cf37b81a2e08cc74e7f20c4ebb55bda8aa05e39fb1f2864b60b424dfe96a000b7f94d84597095048a0101dd28cf37f4742b1717e4d0aa7bb14e47820446962155d27e3b9561af6014400add1ce74c2806852823a07782bd282522c52989188714c5fb60f17be64700c3be4e71ad3e92bd352738e569f5248fde93fbd02fbb45553ea760903b68a5da9b11740df2c9d7b33225a60b18279bc82351f7f7f974a1683920d4c981b42fe32395ec054b2949f6a39a3ace33cd21b2e356352a0a25343403a9037cc39166fedfce56c18b2b50eb9f6b8dbda5265a0e0bf4ce92e6aa0aa908736a8a57602b8a15f037d8171cc42a87db3094f7166539737a90b43a84344dc96d1377cfbc4f181761ebf30d4837fed1d28f2f0b81a23b59bce23fb8fa34a3fc048d61b171cf93ca840a4c69395ac7b4fad4e17b519e9ef94c1f3936f56fdff8441122b00ac6e16696e10909e7aa894156852d1bb91404fde7f1cd93c394617050641433236c309b9e31659f93dbaf9c143e3626036d248dc84a010620012796412a8d6661c6ca4a8a81a74b82e95e32a80f3d7694369ece556fe2148be8bcb1f3e2d4ee2f78501e83e229e331eae567489bfc48ead1b6133be1b837cc62c0e0de3a38a284ae8509a241e0ea0ca3d65b2d287c6e38d0ff6c5cfcba3375cd7cfc2f82f6f26596c900524ef851710d66d278b03d4903f76b00ddaa26ef7fcb507a889d598e915baa8ed2bd0fc63e68aa2cc46d96b8fb92625caa608a42be71154f9808222a06d62f4941b4907235e5e0cb6fc428297fa84e3914fcb8aa21f35eb1f4e3efa48d33287e4b1c525426070d5ecbf09e71ddd2051dd77b7b0d7dedda1b2cbcbb55ab504970ea21c04635b7f6d536c203f3d8a4cbead514548e382222dfd9723479271b35cf7887374495ba6a099ee386472ff770698215588c601b4dba6a8c981967ffbda66cc348bb3639bb1bc38bc1bdd7048808057c1bf480403ad0644329cec5701f92c861dc4ceae7755e8b3596465cfcc913fdfda9e5c348a921d980833cb0aabf0d0af2d233ac23c7f743e86033314c91709ba6756b364ed92bdc9d52003e54953eb85354500b251666f971fad0521fd20812e405fccd99035add92a61782ae43bb93141232aad6cfd8ad71087158ccae296b54447278c839e8536f0e86a55e2ad13e7c86df20524abe12cdccd9d45b144ef69afb4d6b1e0d50b99ddbd7187b808395f77aeb60e6f042c8fd21e501147273969bc6b4abc81744d90005d96c48a4b57bf18b91fe7c1d7a5258fa78b2879d15b9c6491b336d8b5b549573ee5c65930f4049f751bb77edb9bbf836980e34317c2314a1abcec9b11beb4209ee15943d8bff61b0b6ade42d640bd7ebe44ad29394855fc3fe6b19ac91b4d55002d62887bfe83fc7f431fbc3b5354f67e420a455fae7b4f572cd23e2d8a22cdce13765a36c309f4356977becf04e0cd9ebe9644c939131b62502b0676e4b20201db11e5fa8758c84a2f739c6ac1da4462c11ea5d729b9e3a3109166e6da97a247816fd0dfbc9a49a4f8996cb12f007c272c1dfe870ed836a4bf793e00ec2728fc7f1ed814d35f9384dbb6fcad0cb8eb2adfcc713b22b5b6f167a81ec187402bdb1ba080fe264942221a2b9067714f6e71dc0067b42e36b36ca7fb45cccb6739f75c0773b45bfcc395d0435eb8f8a125d7f1cdd1897982fb7c2b5a18919b3ee6e490276fcfee9631ed40c5ce0d822c663d996d823da258e0405d234af66b570e482f394e9590dc7a45afaff02e5bb4531429ab89aff67d69a376a83b935a9ca5b8157b7549994e1a09b8ab34bc5f63f2414f08829a599f4578deee8e044d68354970f442b13b9614a4ae3b7781411e13ad77fd496a91b72490e754019a7c78aa39782a073d3cb5efefa9d2f2d5905dc7873499e343c3e61aed628795593bbb4facec798bc7a4496508809e61e024b2b314f4fb35136312fad3a05e615c1b9eb706361f10d2bd919d7f1ba457288068e3db68386d44569b480dea4d8cb86702440cef39b136f09491398c313d2d8696d268582cadc5ad2df883eaec5d9a6c72eecac5fa2358745988923db4f7d585aec6ecafd99015b41fd0c2e393d81f081665b89158d5f39410969ae340685babfbfc2049d2fae3a3e76fcad774217616dc9d659dd46ea19b43661991db2d885eeca836e411f7ff34c034102160019910e831b48f54bc834c59e19962e952f6fc48077fcedcd2695dd280a687bfd30200ee1aa37c8448a0c56592691e48d459834139723e0c74c8bcb420a655a3e8d01f27b54ca76e627b8df283d809da70153c5483cb63e9801cad5057d7d1e846b512f6efcf1fd9b8a00210dd8cfb2af26287610d0e7096d6229e759c87545c77429723e4b9b1cdba6d30f74b67e46d8d73ecb0640e483c4007b1cca60ce7618a8bcfd7ca907090b16dd427fcfc114f471bfa1d20c8faa9c1d37bc9d01bc9e746a58ea6304698e5c5cc9faaefdb5e0af3de64831f63bf00451cc1bc4b68fcabfe1c62e029ccf3f9d82edafed7b461a2adfd28594cdc9a18e47af01d18fc6c6154cbf9acecec1d4d94be7769cc7f00cb771f49cf6463ce00169763628784172b58858c64f2ae55561ac55372d9c8ed559df71f0d0449495c81f12b77fb3391c31cc647d091c59c437387d3e0c54b4a1d3cc93572d6f4b942e41c83f67f8ef69f30fbf3216acf155facbed553df092374dd21211adf1331561c033774120c487b4f8880993e186ceb209eb0f2ac68b47612e1b83851d7c0ce61f90e669b2e3e364659c236871ff0ff5ac45d51904d0bb8515b40d6cd2c2f9acd54917957ac0dfbe845c9e9c915a753c5c33ce3b6ca9297faf3d6c8f896c91c1a58492b36934b3ad9d0e29898e4353a958e67a98c8c5a5d29c5db1f9f28ad797380010600a83d13176b3800a36f1776b94916e4d9b2b86448587a40c896b1e266c4648e2ba99176ba86e42b251df4d19ac48921d7283c834d02be558bf76b9c06ea22fcfaf6a8f7a3540c46f73a7c2d19dbde919c49c1f6f5ffb217fa421fe838393009cda0d358f2bc242293f1c0268eb2cc6a534196bdcee5c5358662e5ab1db400c9441768d050bd24ecbaa0f426f437e03b94ace7124ac2d667106dc9df2e05923249cd50e949efa52ce557ad99edef7ddc48831be8926dbb9d63299e09a350d4acdcf7034745fb19310180b52485c68306ef97d896f010ddc39012ed162bc5c07e5b47d2fa307974227a5cd3ea77b1351e0913563034fea7429e3f0aafe13a349e4ea1412db71df8200fd5fb4db617c34b842bc1b500a60c53153893bc8c74039ba79115da275b0d949c9f4c90521b9337972eaccc7b2c007aa5416e163665b51d3b22c405e61bbeb2465196277331caef2092e6f155e8b4ca1a8fcab8415f3d73096f305cc4502bbab3503cd0e90acebbffee6f1b5d5cb12c8c37cabe37e2ed497a4c9ca3475bb2a4c285638979b04adc41ea3405475cbfd9afb140bd7f899c855547b425dee813824694dde1038c6f22ab98cf4ae5923ec5709428eb27eaa863dbe40fc4ff665edfad82effbb1e811a7fd2141a9c46849f63063689aae5ade2d51bcdda66e335856cce2e66b1385d372393463290cc4e9a9490bf7843ab38953d2ff9437eb9d27690c0cc955b9ba451ca57a628ccf47709ae496133c905cd751494ee9a4e68ac14618c51c11cb1e6e0b83a90547542073e137bffb261c59008a99f9ed693070adebacb8409c5c4bdbd3d27303f4477e9e2f4a1cd4671b03836165a42d5a18b7855600ce7183eababb78327e1b097d06df400a421d9cb6afc5d5c9766e943f4f2c867d4761d840f4b4e09d6cbd0ee7ff11a93d81a7b4103dbcb8639c4e2bbc198667a3af4413f0fecf1b029d757b60d9da83476a2ae7d4a688b5c1b249e3b0ac94f3b97d71b690398ee64a46bda2edcb2981d1dcd227cf429693721c9efa560e9fea303ae39671d1df9132ad776aabecfb7866319c38cc495ae9568c30100ec09e02cc67353e868ae452f3f8683fb73a630ab79ae08dabb7ff4f65b683e4423ba5fa1abd67126c0346e2c80c77f0f634ac16539f8a994cce7ea77e7f3d21cf518b871277fe1923105b6bb9191e50595aa81c0604eb3c57bc109927363ee99f2c4db9ddb7af2e2bb166aeacd4857962b18ec4e1af6c5398b7e2c97edcd1853dd1798e86900a7406967194318f950c7115b2277443e2daa6d1c028af35fb91d7268857122687b0fe6a8b21c962fb1e371d6406b390313748dffac8394ef2be8e7a8a5409de1790880aba4d90b33f9974800c05cda41e21d43ac572d5d9dc1d3d301064d20acf204e6d44d8a6217b63a8c7b095cfb5088f12e2821d6d61719d13a82374022551b8f6bcc56c1b502b84eb9fa0deb0814eedc76308e83c3d2e493c2cbe96d7ebde5269f457f3511e7efe6aba1db8e6b1a106ef1f64c5845d9d7cf099e5872bfae2c9fb752a057057997ca3a0a203e12308d67fbfd4ae34dd9bd03c9fbc1184e3e866f7101569c4357808242985f5d793e9ad5cf91b69be5817c2f2d4c8f01757861d62f4bbef7bdd043f8f8fe9ee1fa8477ac2d2da62ee0cad16e9aa10ea8a989c909c7c5e48dfd7d5e500721d07a527f4f860ea3c92b3a65223646357bde4d1d111ac009c065ff50e68d6974e32227193e0c0dedad1e35853ef3761b1e029babd9cca9af399e0061643c11a65c42af84f2f8e3f38aa69d045a7f38cb18302b5817eabe5248a8b8a0d5d8a3950abe3ff237c4de42d16d2c614fafe6f3007bdca9ec0d2e57a4e82870a06bb56bbf3c1329535beb2c1773e0f347607daf93c2771108fe77073d8abf04379c17bdd89f3fa896df8890853ead950a3b40b1d200d72ae57b999796a75e3aea310c8a78e7533ce3b9467b9b0ccdef0c506464d5d1c46b7ea7a4d48d721375d5eb1b055dcd6c676562305f499efe83791985f600f54dc91ea511b0a93baa7e73b856ed206e6321a3df0386b1367e058292818868e4bea19f844bd6f6eaf38896e568190de16a487086bf3ac279e482b0913d5a2b4c7d0641bc48ce918d1ba6bb1c7e9c0d58a0eabad985efa2cfe7b04bb23f5d800d0de0ffa4c6c5e5061c192d4673fb5dcbee650739aecc817c64792f6ed9a97705d75d475b0a908aade2948910662f85acba260d617191717bd2f8326d92fb1728e93198d130b6006c25fda320d32351f912f832869a9a6c31af5d04a038160b194a0480f692195dd948f07b848ff42b3c378898d22b7e33d4f8e8f29a083ba70a5ba7be9372ae7acf753e42f5ab88762d25e0810f847d7b84e5f73506562bb5c6d815c74b84de897e8989dfef4330a7c0d06ab5a52fa8fad16913d2df9cea779553a35c2e7f41c6177108fb31fb5bf953128530674d1d37c8ad88b7c60a051af84d8437a9491fc8ca0311e78646af93fd18521f3e609387b117d4c0207c35d0efcdea697cc0ef4c96bc7cd639c9fd21619209f11cf635a92e17fe39df11cd2a0f68d87eacd8967e5a0feda6e7a7b18ebeebbd82e5521f98aa9f50763b981c3551b22762ae161805a1223a55c5e919f2f36b4272c0bc229fe64781a91a46e0e96256754f077e090855b316b7c336060cdea31c33433a5b1c6ca7fb66a2ed8ab44a8c6e5196458403d36aa07d1c7f0d678c632fa7993b20b0880d58e611b801154ded240fe3e649f264bfb04bf377d89d5da43e14b07e113b3770fbe69a3ffcc863133f826537c62f555f0ce22ffc9d84326de3592ff116399453711b6978da7dfa4105a5c2e7518740990d91f297002b88718ec311988a157922a7407476925ff325bffea886fe94e54bf5a993d0d9ea1c02c81682ee1d388a08579d75de603b53f57e78d5d53bf0c5927ad7891c9921482b5bf6892c995e6810109197b42db6f3e2e72f8563c989a865370f050b332209c40aa0b273d0c923bc440dd7c1708ddb98e1f1a3174e25ca082a96607728e86c97b666696c4e776430f37f5a754ea6f5a73648f2462bebaa5167c23ba80065d244cdb18b10fef334d91d1969d8ca27721b25e90b1233e8b44b8e4894912bb698b6d680d5f77dd81c4c02065586147f1be5384c36824d550cce5194cbf1c42d3925fd0cd2e816ea209b06bccbfa55dac3e78ca5a4be0e3f33181e3c6fd9300d9031608c73927e06285bb8075bd946a51785dd4a9c6d5d7e7e32768070797707b9a70d45d5d2c74f1f708d0a69eb50c231a501c6702639cca7f5c09da976f8d914230ab5c5ff788fc1e4a39481a49d737408d115a534c344c763d94b459879174a05bc8240b439153b372f0d516f89da1a804df2b65a78611da9d1ff922afccab36b82f6eb30e6f850998fd335afb9d29e4ece7709b55c7f7bf8f5413a0cd236e3edd0187dbcdc9455eb35bf0bc69d785d5141e92c219ca33d09d64b4c14ed0d58d9f02233dd4ced9a379993c0c8541c35c79c1af4e6c60982dd8cb55899a787534a69c72c00822bd0df36734805a65419fa87c7103fad03264e11307d06e614c1a34aa0884ad300dd5e5308000caa68e812df133ca6f14a8abaa185ede3ebb59041f6c566af611c46d5fb7d2b24b1e0b92d9ac577007b8489e6f41927a38fbd5b8690328c73b8a4e65b65c3c01c205eabdc3207c167e07b08b88a2b7b26b01fd1725cff7774df0920f5b76275d8fa2e0d9272494260db19a2304c01aa9ecbf699a21e7c3f6532cbd6ce926fbd4ba2c3a58be347304dc97f99783cd174f42e53eb8a9e2fee9dd2a995ba554d7d4e8ea475725390888cbb95119d9012b2eeb8e64f749d9783c902ea548d2bb17160b0e9c34ed05e1af04ae9403d7cba9588b0f8eb7684796e4b04883fb5580f6142338d970303248f4af43fcefeaa420f86b4630fcda9d6bef478c15dfc0fb2e733f16cc0848d3660bffc3443543c2c15ddd13e7202260bf07e6070f035cf4de1bc80a33ac174f870f8c009c64a57c4d4e34a3a62f5af16289c8a69550c1bbc7ece2631cac9a2001bc1400549b4138a051ce3c0f654e360fd2c0dabcd50b0b7da3bdc421fd7434b0f43cacc242138f5486a040a41b465cdee75ee1b27733260234e164e529d10e187ab413793dbc35b3a1979ecaf13528bc6e65e358dcb53c725de6e3d370aa58e04f6993298b87adb167187715659b2e85f755dd0648a3f3f5f009cffd81647764e134f8f32cbafdd79b00764ec24b02dc02c582b23fad89c39ac54d531bece98929bbfbce8c08f4adfc8ebc0911c5988cb0df10d8feb99ae89fa8f77e0fad3a8228d2299db807a695632a047f8457efb1e535990aeac15be2d6573cdaf0f0cea54c7f0baf0d5280815c605470119add45f0ba2cfe6af5c18ac63c75377891f458381eb3a14cb4ba9ccc397c67584e41a7ec17ee2207d48dfff7060125a1006fb1a2096e20e94d75eaaa0771c567ce85aec684b405ce200cf429c702508b899c74eecdc95ee08005d0fe2feee3b15b07728535421f9ca401a27336aec80bfceb6872f72865b07b0f343909ee7457d4a96142dceeb161a727d23811c0b71b986bcd54d17977f1996eb6b293b896232303aa8200c3f277cc5a79a465e127647e49134bd2b47b7c6fd1e2ff863dcd29d77363deb15f098ba98d8ab34060ee7b3ee1e16edb09f83953dc9d3202763e673a0653aae4a5006e39edc963045ecdbab1495c2e44b36dcab62694f35b99f3552ad5d3af077dc0f040ad48206eaaaaf22020dce7f33153a31f1f1e2cd3d6a85973b15f320ea047616cf67d2007e6d0e8b924fb660fef00f2451bcedaf860e5389474abdd8f06e40c1a7ffdeb8dc6c189c1fb6c74ee7a0c726b4f86cbc39ff1cdb88584be247c17e4bee8a1baeb82fff42c1fccc3efc857047e721870338954cc167473ecec22a7552e3b16b7d7da5b82189fdff58b3598b892907ffb496f919a471590b04106454b22e490a7027e449ae3379193e4670891575e9dc661796a7063ff789883ffe7b9962bb92f4ed55520a14acdfe49ee9c563fcb1cbc006097f2a2da17edc7a04e07d17137f3e483d29f0ea420143c9c43ed173f52a292aa941c611f9f579e0282501e701c5fdee386bfa7e5b12ed140bd15be54913c94d358d95405402762f0c4eab6e2f2c21baba3bb722887ef0ad7eb5157ff07b865ee2525f27263101adcfd8e7c9369304c8c2bfb4de777bff0387e31361c5e28a65ebd86ab835e89b22c67afab7c76e7be5fa8cc787e40348607c3e0b3cc394e1453d098fb14c9e8973f5501d72077cb3aa1f82178b461a087430fc62f06163ff6411eabd8d7dd19f4c6ba6c274b1b1b016edad5c87f6fd16ed7267d70777ef19b19d8d40ad560d5e1739eab8cae4792a7b5d89812ad88e7c475a8459d69262be10ec1f91c3af1d67fe77a6fbf7f0d4ebe6ef0bd166de7dee03761812e2b1858fb944d7cd5a22edb8fa5ff83fa1be9c5ba8b8e549cec2505023d195758713388d22c7035dcd4354d7aa33767aebb2a2c587b7f42f70e337791afd9547af8fc8c4bbb3f80d2f36a96502ed3e965fdcb566fea2c8a2253690b9f5a3801996887af6e44c10340469a7e4149407de51ee2e9eab83fc854b5612c13d0140c2e4d01afa309a353d007e0442283e07ad6fbbdf2507d9cf056ab1de56c919c71823a43ad718a1e45221dc2ebc43873db969d036e0950df683d9d3273c08647089cabac97e551e043fc87ee82edca133daf03c00070603a4fa91280d6c0366f347795597334fb68ea882d87ee1f87f4d1a9f638429c3a75637d78262143b10903ac4123bb1e8e36a56473c15d490fa19066d17e9c45aac5c838cf4c8ec5ca20208553c672184ab065802d4c959d3c778ab4c5d1bd93f5fab5fb0e5cd2d12dd21cffa1c1bee77e29327577669c64f005ef8fd06d8c3a44e0f032b233c7fa3fecc6bf2ecaaf87948e82476a97ff2ed5a830af9df585ce74a097dbf04e306ddda7926c2217eea6c8daaa92a33f95799daace88acc0b9aebf0f85cde627d9a58c003821ceaaa52245c59670bf8de4190600af0283af4d86cfe59a8c7f90edddfbd9ae15ea04021f3c0b8bf9259f6cb9a454847708755e370094511e715aea178c5d3ce2fb3afeb3456f891cebce1ea3e768a49afc4a7f6828d8036513cd1bbb5d07a327af24af4c7d8daa816a3c1a9be94ed60f70235f30ae3f3df0e469eddcce81bd2c8473c1f8d3ef02ee93f93367e53ecd005cf440cabf0203c08b06cc135c0e892ea47e571af10615223522013ea483b35137b6c8eb492810c6fc6d2c2dede45c22ffde58a3902cc5be61cd95100c3ac9ccebce100a3ec1c315640abbddae20eecdcb04ffbc9c58b7be1c60a40ddb15cd640b1b048b6cb462bb1c0b055d29a27d1391f7edb4264bcf52c7c9a9d4ee00e8da32a0b6876e82b11f41430552363e3eae4c4435218d95a09deb2f576df0efd71b34410df5a81ab656d6508814cb4702e1b0ede6fd08c03d1f1499ad31e046632a0472d03297d86444c3c6bfda8a4b8bdb748c683edd71551b1e28135637e064f00dd2720206e471813d9908fc5303d37916a54fe4509790419baebc00d33afa6aa037eee719b95f8eafe38f0f1267393fe60c9c8a1ed911a1443522edef65e21a9f4d90068a878b7855c1d50fad3ad9881bfc14ca70c4602352e27fc991ece95b7be797939d6f2e79e94c41bb70c2cc7e7433d907dd7ef882f38ceec0a43e648b072b19efafb84e60be3f5ee478c235385ee3fa59a1d6a324781a1b39fc67c9d1a956163e20c2fb873e057ca0703f6e1dde9acb60bcd2668b9b4a21763feac09557918ffc4f4eea0a4f0d9cc44eed83429381337c8712718eb9a927ce6cc0293bf836cae45d535a45159196d4839700f6cc604f3d2d8c584c0155e30cda8c8c01717fa0c7e5d9984c4c14856f7767a6f730538e669de833de781c1b271fb9a232d15700145b955f363550b57452a63da8dcbe91e46a1216106cbd184e90eee6ff0d15acc2b25ec79a74aa4f71d6b3a5005fedac263db7ec10f5071ab64bca6b59eeab8e7e035c4ee68396e79c28f6cd911798ed0d31fe99f342178078322a49077089b0b03864874150a5c689190c20ff20d2022679d1fa1c6d34f62e26ce115cdf2599e9cee7c1793f4dff71a43a40a56effee4d863233d7a6241d1fa82146042cca02ea20d2d1602c6eae8f158c5a0a60be1360dcfee05a38f682a99749ef3ddbacad74a9d813a1248a4bfca18e199e164b58a4e919862a287aa91a63fc07f7a07e88d0bee25109f496f98955ca29a89738fb5b3c33a96f1d3ad6b2ee027dc4170a339cc9b6e0713b9bd628f098fbbfbcb1a3ddb9436628998e592f72548ca331cc564ef923f4d834cccecf4595071a8c235c1fde16ed8e6823b9824be2b7f030fbe256b0dc35f76eabea2e804fee81c82dc47e262610a7697e2a5a4bce754320d4d44c30859d1f49b848b0403ac81841b9c660718ca144d3a039da6e17c39375be90011f2099cefaa288f46623856d77f6587688b8e38a1a8f5c204ae9c2d88ad622e89ba77061484eb283625d18aee09a88d852db82dec238b5803ba6a9309297e2a37ec457b29273b2be5218752f5f77c2b86e755a05613055ea2625b407018b5d088328b92e49408263f8bc8fe4ff2ac70b06d4006baf4c7afb1f389453574bd72162b12cc8e7f173226d165af8735e024371b730f4674135335e63f0b25d131294b529d9db250a9fb84b16c7373a116b8c16efc1ef63525e89a9063e09d8547781d7a24126d23bf138049d621daed9bf5b70e522760cf5816f23b2031adadd6ed6378beb1d596f3f7b6c509eb57dec36c6f78decc1c7b4c1eec68941ecf57ea3d5881ceb14220d00d948b310348ffdc03557fb6184df31324ff5504c56f22f8c056410f922c32bc1990d1ada45aea152e8a52aa58d591da4c0562c8aee15182408f5172f8f5a35675a6776610ea051930b52b39d65da2d341b02fbcd7e84508cfd7e0dcbb5b4054b936d41c91948b89c00194ac8f23d087ecdb4a508ac1265422edfdaae7bd768cc67fd19fe75b43f70a8bbd913895cd59899e4f020a1c64ef2ac2cbe46064637873425782790c2e5ced53bbe8e83ac5f56f15de66ece8a748f15402bb7d32bd70246106f97f728e36baeba596034846168b81921bf21f90e3ade509bf411c9576281979e61851f85e5afbb1b5f591b0269582223dd51b073ae5106852a4dfac27e953fbb4fb873668aa015113c7613d56bc3524fcf02918f95fbba16661198676028f3a0229a68883a6ac6c8d8c77e878f73fbf84f54c5ec37bfb9f25ff0aa00f76f9a96217d21a23a3d627edeff01e39000f644e6bfffd25fd1cee1f1bdc3de6bfd0010708781f28d2bb777de718c22a6c5e4c6189a11719d2f24a18b55fbd02b3db45270d4488aec686b5f6a7afdc2d132832f6b947cb6250a0e82204d31e3933ea780b8e90b4238a3ceb483b0ffe4760b0abb85931f74f3211c33cf486ad7c7b8cd71d6662479c8487b6b92bcbd9c81b3236b497911f132d8566d0a07de0f8e6cb0ee0c80bbce90dd211bd0439d123506de95391bdf26379c641d8e577281d7719aea805e5a0661576ab69740fdb5b5f578eb5ffa614b586c7bbacd7269afa70ee2abeb92ba1587c5c923aac7b87512589eb92d1bb1404c9d1bd2b4c20da610242f4043a7628c21827249f6ad51ec799c2018f0a6c3c0b501008f14ee6942152f843569b1ed03d866d0945e3b9fb819e4438006513695915a3035e1158dda51a6393f7be1ad08ef88673315be260c55a88e24a89dda96c308afa221e0a10d08d933006272088972d2dda687f27a873311c30a3de6573ae3561e996e4b0b688e29e6f40b32f9481d70fc4074c975633cfc71a966f0eae175e2e74e3026fe4c9bdb1ad0734061de6d7e0c52af17648faff0b7b861f19a8c50e6fee04514f4e4d2095157f5366ab71a00495ac353a5ac6f6b0b0c56baf80080356e16786042c5e72dd5e29da871dec73e6a1f68148c7117a84bf6cd00116143fc865b4d431edd449b5a2963e9748e6d88908f7909318cd48fbaa201dc64b87d518596ec00372cd3638f7fc326b623a1922db1a59d77be8148428281aeb063b60dc8e0a91df3f2a49d2304575a5f6d9c2cb8e7baaecbf6f5961d3117436a829a43620b859a8ac4de1f2e79f72e30d08122fd0ae2e3447e3ce626d4c71f1a7a7c126a4f55ad6fd380ba9e99cca42a759bae5304d26f4cf1b53d88cb112269b547d035d482990125688a3082401a8f1ce8e3d20ebc5517888c4d180d44c5108ab013f55106fe1c8eeb4f4ad70964ae6dcae3b82c73fcbddefe80dd4280ee3818bd4ae4bde751b8a3a0747d921577ad0f7936019f23378bf850a6501e50b19344e7734cbc462e0f492c2d36343c13785988e617429b96166108c12920791a3ef18b7f5e252631831a9bb7664391a998455aa7d742fa6b49fc52c7c759d63e36152ca18c6ab846148dcb351b07606333ad7668a6ed69f1d6acc9a6ecfaa8515845469a426d64dc7483d4d90b1e35e14386036d680bca3632e9403f385c2b463dca9799a3e57cc31fe40b633744bf5f7cb818c5af7a8f27c9a4d88b7daea99ba1db01bba02002d2bec3075796991db30ec1dc2f98929c0ef031b7446206c9454ad111226f19614f391eccad26ca805f039f6d3a4d712528a00408045172bf502b5a5c90488c4f2c6356061f01ef33fc04763c086600e37b65f581bd24a27c9b39a7f0c71b9cea5430e36e091998b19afed0741a66bc5c06089689e8111aefcece76e8a5c3ae27d1913ded3d60f17c989d019146871c37bfe619287d227453baae9b2020f46910b821c276fe3266707a64679050650a22e2133aa7a0f16b34345144c4ae87134dacd0e1ce3abfeab8a55a7f9827b2d0892a369d4051bb0c3cbac10d04f254f0215cd1cb4438293c497cd186130cf701ab42e94ff165ffc43310fcdcbbbe5fc60a25a8546e4274199d30d213708a60f739f2cad37ee467e370a3d517bd96ff405cfe44406081334a00ac618c80a681892d6c77852a57ea8ea3a0184b8891f25277d80e941b4fad9b3959fd37e1b4af560bc46c08c868fad56c0d58baf73e6466d959e7fa4047aac032ef09550d0c748b045fd1799dd0d5a3274c272c7291af54c621c1d35379f8b17b5ee8ccfbbe94e88ce136c3d990b9c0e2e7b2372080532e836a6340f730e95dfe9d74f031fde53835a19943bce7b52baeba50b8a2111fa65be1e97b5b46c3c0f2d16105a191dbb0ee22cd5820c28e8020bdc2cc92b0021f5bbb78e8d5b1045b43c482107b6cdf2d0dbf8f9ba124e761136e84a1ce9b0094d484fa620957fee615abcf8441348e477fcc64bb493316b0984de66e4d773e620a22dc8919621606c78ffe63b4d3db468688a05d2c5060305e203ce78059c49118577d4548c462680702fb76910eaff70e27419cdfc7b1054d1da93677efd4ca53a0becfea6f2d33880c4c117e2d057e322a7608f7ae3323eff09622bbe1430ae4eb25f090470ed5684ad9d119235ebcdb3e3c2724f2acb589d57fd55feb38c51f5ec2343e1305a75e0660c875c17f820675af3a382e2c3e47e5347f4172610855131b863296a1f0b887fea519a57bc76aa6df23d7fa723d3a749679d5f599c76d130c9f97a66f8d83313ee7c0083fdf5caa5fd459a72ccd671c3d54cdc681cc82f6982ae84989e663caa45ae7346adeb36bb7abcc2736b763c7d827a97c2f701992f11b90791307ea793daf7b20d0b57aee07b39270aa754d980a0b600946fda80db8432f6dd1b420ac08242ca0196960d12c2a00719c1ae439b94d43082d2624046a2fcdb36a93826956b827e1c2e6ee8aef4a5c5c2d5442252e5fded5a2fdb1715943b656dc2e84643bbd1d7e85a66d55d6678c1314461a71ec7635e8f94acf22c15f903c2fe3df71203d07a2bcb2b58f76d9b74f5ee302abd2a0cac12ae0abb0ad118db49ee5632a6e3afae38cb07831e5fd6243aba101d532e58c70c5f5c4e6f9a30a7600e75254ffd463fe55f947ca6d2af283cb5f3c4e7cf1afff93c707c4d037723a2be99b4bc39e9940d1247c9f48752772e23344cba813cc76b9ef7dadf50b7f51e76744be74741017857c9357cd9c09910f34ac55caa1b5a768163a6ebe8b289e315c090769dff8c983ec2d66e65a8b3131cc81812d8336c5170671867990015d7d66d12ef26c17c48d40d686fdd8bc8c7f07e87d4dbc7583a7c3fc85ad396adedb961bce0d497c2384fc8432ef0ae40df9b45d5b09e811a1aa5152035b26d4f396c54cfa6661389b37ec2a48711c33dc258a1f53ae0281633a98083bb118a7508d114fd003156cfab92284225f7c9f2c46db167386f730d7ed1e99508baa14c300e337013a6633fea98b4a52602153186d869acc0b44461b8face84c3be8e1856d51b71f38908bb1e57b09aabadc53ea2445fdca47913840bfcaf2d2854a0f6a18adcfdf0167d4ccf450e4a891e3485f6c58837e983a25d310392a5ba70acf99ad481f1f830a3b256ccbaee8b8227a35e8a58b28dc0d1da29a6be70ff16734d580b26606c1bdf3afbc7d2bc21ffa79928e43bbfe1ed7fb481db9d1b1cf91c7d7abda83ff750db30fc7e8bec7cbfb369cb36fa021e943b6b47ca28c9c56765e9f7c61e5d5110d898b05918bc778c726a64ccf68a60a4d446e104a32af659fe3eab134fbb3193f83b3a9fd39ccb32f2e2dea2da23cf9abbdc8f15f224983506056f87469511bff2f01b18f25c9228f152fc2310529a28c5553eb71a7a6801aab79a472f5800c4608be08b59f9e7152e3687309383a2d174abc57ba9e7267c834e657d741e73709fd77f76c0289d568a7adce14331bfad9a0f33a4ca976804efe23db5ced0182e968224ce30c924bcd082e995de57faf2573d4fda0ed66eb3ae0d759865d4b7741dedd3c69981fa17dcf3b8ba773bfbf75cd2445f642225fce3203d24f965ddda233fa41d66710b6f154cd4958f3a32a819881fc2ff1ca757d3386d408db447a20b68774b0820074fb97481611ec3bf3e264b01481fd107025c770081994c532457386e1dde683397b8f28d8307af81e240eacf4ca8a513044dee4ab9ae80e89c23cddde6ad871345553c3cf5a80cb29106d71839d1085a4b710fbdc5bc82c37f033d2be65661c56f33cb905bf0c12b4bd18c8e6f786430357e35daa5693099d67aa69c036416c37519b933c37ffd02a5f63e7090771abcd90f7d9e01bb9a3ec919a7cfa5fe38c82a80a59f5ad1ada62613959a2c1f3a7a0b7dcc2e5a2a32fee6e3a8f58eacd2d840b624199f7d1c640bacbf639708e3c9025d19c9bfc6794b5c0bd33aea9a67d79897e8c0e48f2854e44a3f0f6a9928c3ae400e01afc26acbd75282f76e5024b7af66fbd3097f6081cc020d62773e03438bf0d1dcff01f272f36ce1de013cd8e10b1279a375dcfc95bdb1fc8361cbe102636390cea7808793be4b2a13744110a504731e6dd06f0b740d556ef5891368763ffa4126389fcc256ab8cb9fe69d47493a615559a3cfbb059f7eb8e1d77859acee4b6c48a401b60123d4ef0296a888fb67afacb9cc5da7f09a912beca4a62b023f10b3b64bf9e28138d9c01f87c3757cc8b3cfbaac6358feb11cf8fcea8515b6268c34f672a3e83de3ddef7f2c5b5488546d26108b28e01074f50f180133bf2ab757ce0aaed3793727f2e987fca522f29e8ca35ae335544a7b9cde7b8013cb9992d660560b5e3a603f48907773a405e70f56685b9c36504e30181c096a0386a98a03aec70705033154efa3aace2c4f39474751e3d34b084f692fe2b0069179f0446d012fa9ad591608cd8da48a7d9c3eb06721fdd00e020618ca20c2e9ac66c59777c38088cd9ede70eec1ecf8ceda63d73edc792cd4414360d684bf57241b5d2dc6b81b5ee4956a6313fdbd41ad6d5e8edd070a21e755d6528af5865961676dd9f5940749f36c41fb8fd8e51b83e8af26d88358526b2ca4e1a2e1bdb7f9d361e6b33dc095d18ed43be423d466d004be044083623d22633eec7af79711f9bf9b8b18b47c4924fa9aed721ce2663a7dfa4bb13f9138e28f91c9d05cd88c698a00e34a80d0cbc402a7abd1f00457f2807404e5fea8e51103140ae88a2fa49d76bd4f72d6152104376652bbda6fa30dbab2c25a0e3417f61c985d7c90af74313fd1da67ce86adcee4955ff4fc502d24b0bc33cbce06ce002b7e5b367d9de5ad44f6b676cf27db35901071670afe22d54c9b1233db73836c4e6ac1cac0090b5c3a7f4b51db9de5d1734c631f49c18ded45dc2652548a659f19baa99a63d62f5cd9608b8661cf7fc88ec0ade0d13568d8cc4091e07c7d9d8544b4b521e616ef141187ddcb9f4caaec7be8d90cb66ec8ac2f78a19c48f7d18b55d596b7e6aeec7c3ec1222fad3d5bea16033b6ea9ff30f94e97d661e922ed23bfb9557fb1742bc36dca6b202f9218b2ff870b64c7aff4acd74513fcb8b1d456c917adcc57a88b77c978093edbdf8a5d4cbca0319f731c8b61253a77077ac2d575cc29c65290174ab6bf04860b8168737dfc9102903df24368f1f7b2e178eb3a0867537fbf301dd75b00070e5715cbbbef5f1164c30a0acaf78ea75b958af893f4cf76def228bc6ab77bb89d7977d26dd07a957c35321ebeeeb8e8b784947a4c5c44c85ee3dfbbcf8cd429f2cdc161c5203aab4b572b63f2e40759197311856661a94e1cc9cd9aca266af0489cfcbdd653a6ca84cd1b70175bd6ce932840f5f9dfba39dcca3b15b8bcc9d7a077cf38b4e43c2d0579de4186a7db488367c2afd8cc8732d7b3dde96a334335804c0bba48fd0465286160129e4481274a79aa46b54e93c2e6b557fb2d2e72de5f0f92079de6b46cbe80af70ddc05dbf944d01ef405129b75cfae13b113425d8444715edfb667ef8228415d7cecb2402405401583d9a714aaa3b8afb9b9b1626e82f85bd8d23c1677f9be212935ca19d341b726495f50d178a17db767ee7b105b922361938e6ef2420cf5572ab2cde3a05894170bb10df9a35a2e5a0d9d5a9078f169825924259a9ddd8cf0b7284105c4ac8453aea54056c6ace84413998ee6af9e2d8cdfe06af335164e90275613a357765f1c55c718d037941820d837b766264d093bbfdc7b703e589a9db324df79612fcef727e912acd2fbc12c395e98c7d8b1278d5a3facfb2093ba0a2cda2da673c300c8747da11574389142f859a588005ddb716964efe42cab10f97dd4a04a3260a5a6026825e1129294e92e7f63388d2923e31d8fc74a34a0a42857e41f811d3c74131ab73ceeba63417c3b902d4b962a476d8c8323527f6af03dd7aa2add82d9e5d21d4bd3b63f8d5508cc8ccd55c07a3e10328ba0c51bcbb616b001141ad6ccff3f3a52ae6bd1fd4ca26c6d2c219c7bf9e79d7a2e3c7ba9257c7b5092002ecd22082564eb9dc786681fe513752b2064882ce7dd52c19c32984ee445399c00e09bd31682a5f0d7b8268c65436ba0d4356018998a8dc55b108c85c25e42587866757b4341222cb7008dfdcfb23e80fe0352dff5687b3b98ef8289650de50556b045ccd304befccdb98564b82a096291f8cdf2760984f3a5290a44e3871e8295d4ce30812799d74142d12bd245dcf315f4b211384f454e489e87a80855f5edc06f7ba2ebd1219103f1ae4c0ece8e9e7b86b196566358b05cc4df733a2ca3e5cab2fdc14807f1aee61f8988252b09f975d591c82c0db757b294e16594f050824badd4fdc72bda7cc0988fd65817435a9cfc5ecf0ae843a427087ab7c2fe99ff5d4f65861a8bb8355a059593c638fecbf1e3a826ecba88b6706a738c63869960964139c3d0270f6aeb4a99ebbb0167d39f4efcbc8d84c7b0935899900a22b627eb81ea21dabe8162c59ef159e27d7df1fc13d46305e063c08e38fa1a2f902cf4a1ef9a9283f950a2b9ce2ef5120a77f313e7e5b123c64f0262a11e2327d243d216cc9c58fb1ef7b3994793308c3bd16c10a0d18170e663db168a09583b91ff6e79fed89629b3d856c6602382e5409d99925aa9c119ed429896044003f6012d99094afd538de684beba6b7652791a8a5cf3cc39ca1b042183b72a4339e9ae4c3196da559cc8660297bf7c499e329fb91e7279aa905c9257458f8b6d393ccb510c8b509b941841e1961a04bd5ae7bdad1b7132039f8d7582d268021d3a9ed91be2b17950d7a099dfe963834521e13ec9a009ef037c908b8fd40e854dd14a69eb2352ff34b3fc44cdd4cfdc9b2068c69794998649b60252d9ec53ce26c30323a7be0a1d9d2e8dcc9241d66c4f8baa1878a66b4c3d20318f7cb8119a5a146e839291b1a2dfb1c458b63f01f802ebb396276b7631605d285d631b0245bbb3efd7c7e23feb5c8456d6cee8430299591b9e3b0aafeae5fb0349ee5408ea192cbb605ca9957d1edeb73c077b7f08c421c4156c966017978faa5301bfeb8174e71731e1e08101ae94f23449880823d054c3666ee2df0d44641641d218e3c297868bb7b60d9d0a92abf6f012d403850546b74f4f85c1a0b4216084a12aee858dcb42edffbac874d5913fc4c19c893c06c9afb179fea443106df3a19bee90a03da1acb91ce8bb69102d4fa1c5c32eb3bbc478b459ab40428ea0d9c4381b988e037b5714621a2c733015a3240eb88844075a1807ab8be0318244ee29076f71d9f8a70c88e30f36c992efc24cf97666adf3d19bea51ee0ec446856ea36020bab08b7a543c33ac54794be993443b9eb60dfd9e55a112f64bd2ea993a220a46dca03c0d79634f6c63396940b1e7b052747d1651306971e7ef68338af2c5dddbcb20bab86bba3c2b43348c31284d9b759c7a62251a47203ade31ce59a9ad379f21f9b8279d35140f3b8c1b02a0fb61d1c10f7f5f8cf8fd72dbf29fe5c51026a557d536d2eeb105b53aea8897aa7a6f0670429f948c44e550a0d914072b73a8014b2010a6188e915f83981895bd3f5a0a3493aa1dc054fbd7f9d990dbefee196519f2ca6883d1118b85ebf42c4c50b655a7201d13516671a134d50284bff0ad0bdb09a642f3c149d889eb587d73424b1a32debfac2e237cc88176630518141aa95eff800710bbe87ba9ddfbb24defd95f2b706d96acb173bdb27c42d9b5a0198b2eabbc80641676ba36470a070db368460d3923af702771e00ec74270081b3a0bd4e043147b9479bab7ffc6c287bb0f5995a3a23f49393ee0dc99d4f9c6368b10a22322cc73741c13e90ad22260bb6e01ca9849e002338e225d1603c0f31949bc406f8a9f5594225739d39227158c362c3708b0ae5132b2224e2d300ee728f9917ced6901cac10590fedea57360968d08e0134e50abe98d3a12acfd393e93a526b6d6cdd88673aabfe7bdec8abd88bd6d07db79c2025e19661fbf91cfaf830f763b38f52a7448f1398926105ba8e4df2ec3e8b5089a60e6be3b649181c949eb2f9852670ad6ab8a9b538aa4b69d0ef48b3b10b06dbc8723b837ccb1d522a7ae506a04b72f50cfa0d8029744da6d3633f95df991d2dfe04842c66a06639cd166f741b5d9d5c794fe3761022f13ccda325af6e7a574a012bc766bd3f88ff20248afee366c2787572fd475d9f2a9ece7994603213016e52f93b13429d82d26d13b2bc0b584a4b19a5a664cc0bc5772d40f77cb956666e67125ffa396f8927a77bd2512bfec6ce210515b81ed8f56b4be8b677895b7e98d3ce2eb7959aceeb05926b0b2cf7c47c32c93cdd464445b4983eaab69ced1c1e33e60aebf28cec6e2f957aa635516e881ee6ef78862e828859161a6f2cedba7422d1f6b35d7c0e6be66e29510698b73d202c52dd1e043800fc32ef58e5b08312f240765450dec88fec10d5131b04d83cad60f921ebd85b7379cc879a4f33ff23ccedbc7787005f55e0cf19c39af55315289af8ae296630e85ffb7b3df5583ef8616a39011bf9e3008e02148d589c904ab567674b2c46ab30be054f9ae23201323e58848f789ee48d6d5f335941c3bc54de838887327dbd702d2bf7fa861dc1421bf8e76bbb4adf1207a43a155ed98cfbcee1cd6cebaf351d124c1bc1179d3eadcfde0f22a88c8989aa9db91cb79d54171d796877822c3bc2e1562a2443edb6ab0a2a7f37a14e76b028a6590d4eb80c30ccfb5bc114b4c4153b94e122fe565db7be43655d8b88053aec5eb9e2f65bdb00574971e4b59cfbe40db65204821fc04df783278f6e99e77e3888ea5591bbce12810546d759d278f5c90ff46e33d3f2ca3651533e0122c5e4135590d486ba75d4c6c8013cbeae0786b06c4aac200f828c8a6961c6cd8b538a82717996fe49da94f8233ad294faf9c3b24ac6737ac755b44be07c2fc96f6b688663dde191507238f2bceac46760f726fae51697c06e7ed9b5ce2cdb499388067a40388f59f7d87e37cb9053921ca5a26ac03b1f533367da375c4a86d21d7249a66257a9f6bfe3ddc0c35af0d945d7863fef070007f71c151e1e22bdfd4494841a7f405a87fe6214276c71bac5a6f959e7439650973e4072467a063cd51174a4373ee278e1eedc3b0525b8ba74abbe0a51bd950ee7a0b7f58503537e2931561179fd81f6620d96d05a1ce12a9588bd09bcbd0adba6a3b836432dd3950c29c582df42872e21225f9ac6c24cc0cc81add0518f518b0745207957b9fd8d4f974dbf1367bdfe6a757b33d6a5507c9ae0bd8483e4a5333d164d88fb4bba5d5280b4fed5edaeefcb198ff614ce7a3cb765dfd6a339b1d1a97f9a3e030d8c540eb64322bdfd77ab8493c5b1804716a94e973faa764e88fc59f9557ff259c8cdcebc62c6630904b0baab372ed174ebc92128aa5f1a316defeeb9768d8953f195a8a08e29185c56dd5624f975ba1c500d9e21e82ba46343579b241998baecd1d9d840bd48f094573a6064612bb4cf730c76199051b14fa2d882af6c2bccfc70d068deb1c24dc1fc5ced0c4f967b5b58408d1e0475d7cfec7395c6db77ef08abb88f7bf2aba975dd7f733362a3b61a1dd84d0af2fc069d688b404d460a4661767b7c6e6ba056ab141ffd59e5a39bb96a6adb350989016f8c6d3dbcabffc3958cd035aeedafbb0f1e6976eaf42cbd8110a3dd8b6871779a9b4d39618158b0876567b3306c12a1027ef9a5c4cf74f486c6e4d4f808d4656625e7c05754a54b499ff679b9a9e37d376f67b15f10001fe2faf3fd9f89a8df44ac7bfa64a7901fefc5a4232201eaf8d61ffd33814e7012e51a7bb1847a35849f522a00889dfb618038d4a35bca21f6a1292a921e0e7c6b87b77a73d00585df2a559aa3061a851f40c4d2d9af5e398a792f09bdd8b72dc03b4f648cd2b31ddc8610fda382040e8a8262ef3100d158888fbb2aca235482c1fd05fbf5f15ed8ee0e39bd643f3fd0963e77669a72f86f04157134a56a59404fccb4f288cdb5dd6182523db42524102b46662d011f34240237a017dfa56f857e732c8071e6ed4d9abf67ecee7a78162ad46393da94945bb9e91291b15d63871848a79122f652cd1311b5fb1d6e0d80b47c27e9179e7fc00651a8a4573a71ec348fa120d90f27041cfac1a3c3df5ca7fadd77b0c1f64f6bc62af40f5e47eabe93e4cbe0e25442b0043e3f55b12fbbef210827b03518f8401cf9f7d2090fe9c889bacf0c3b35bdcdda4e22a0c098a72fe06fada48220109f57d30a56a498c6b5060629f5c0859d98a5a6735067cca06c44e9351d531a26362006264bfc8c1bceec9111b157d582abcef55cb9be5241628dd22bbb92931ab09409f9d5e04f90250f9b4f16c648781d4abdc988716255429a068798c64497d20b22d0e380afe29ba2ffe570c9f2509c434964869e4800366b89bbd3950233276fb561e940276338d5f485953b494c32509e14b7b584002c889fc6cc68a92f262498fe9ec3288d2eea7a4288377af78e6f29a8e2f68501a57d0d9cdb246eaf32240cea76f93145b24a11289e0a143346f4f09285e8cb6d64799a83b307f8ff50d83c2de70e4d73ec80fa8bd6f689e53e57a6f6e5dad847d0c0a1168eaa546215fc45ecc8662427a15e44c356809791542719226eb21977f46c680c0bdef68f167b67af47b7d8bc8128e0d5b1a28e854d252f5b20b081af2a86369a710518a754092d1a3330205341c31279a96fe04a60c9abe2b97d9b953978cc7a12f30d2a0226f8898f7807285da2268f78cab075cba6b367af136caf5024d717a5cbd15f99e441c3afeed3c6f92130c2960ba487250a1538e7e1aeff17ae4451a27d51bc6943a6b1f56f41b27a56c8914944ea48cab098496f35ea1b8d44aa81615db4328fd9aafd9488c5fee59d2046401312dd60b3efebfd18f8f156168025c9a1bd64bd79303716913f754b8f8ed156f617c0bb6c28e83998f2414b0a0daee0f4ee3b0ca936616c638f3022ca543508ab108d4bbd342cc4845def43cb89beea0106eb8d748b6cf4c95c017e4c4a3ac25d17df8f525dcf903650e8eddf931554b6de7544e8f751ed159c2e2f5b82ac46240f60867cf508df4a693813f89ca9d0dc54851e27491527c16f83e5249e4b3f22c2433080ef379b5bcfdd5cbf44648dd9559b52a95dbf395aaec5ab17a56f213c2c69c2bed246f161dc1cda431d606573ddd67de005b2c9dd71c9d1a8f2da9bb7d928d76431b95f3e60fffc6c8a52f4c534489db616f207aef8ace4b05e8267287cc63357e603e2c377b98e2470a7f23c7fe7e86e80df2c4768e64ea4952c696606c15cb24cbc32a69866c524166c55d0f81e3e46fca39bd4e5651eb01c90935ab000ffad5d6735e85005b80a4cd24214a5d6018ea4b858a2e745c7552d999ee40dee0df7ef9a01208c0094b1794871dfb90ae984ab469038802991a76687e68800a764ff3123b3f0da7a4fca4540b379c45a779a0aa9f935336a453f87ec801d8b00063867ba8be5487ba668bc881a6a704154756625499248912dd347e642bfc949f7e801b158a3444cd9f06473cdc06faa139a002c3551667f22136dde5ea14fd273509d0ea69e2a14712b6f151357c87d1c558c75586f548c7b871d780a425c14ef869e8816993695663e226573700d9006aa4f4535aa75505f2a144e2ed4134376485125184b1f73a9da58a34b12226c12265a0ee0b4ccf682c1b3779af32bae8be28c10822e4a027948ac60f2b20d974c32afcafe314563a939ad2d1a6bdd1553685e0ea359defa12224e5eac09504edc2f99e3290860633f9e4b63bd8f6e6aadc1ef4cba681aaf996ec242c3519e4a2fd64d78c9c8de488e96853f347dbe9ccd45899765898c7b2e59ad29ce60d2b43c5309fb2a70446e1c0e13ce58bd58ec20a69911d7655e984ae43f120684b0f702d870c6a92c349d949e9b39fde5c9b62978d4eb8a43f6bd41a996b60af63218ae4403cf764210cbef154efdcf6df34debd58f1b66ea750079f0a97b9368e0a360d92df70e09365714acf2114971e912dd5777d1ccbf2d2a83d5c038001846bb18837b74ce525150e30bc0b079a353eb1b27183372b1ac0be01fa3e7cabd34f92318d3fb5d33e6e8936787da645c29c41fb3cc03a235a85dc4bcfd6b4e98073ba2d51f14a70b65f5e62bc007e76d90b3eb086e91b6bde38fdbe70fde2dde1272cc665b4677ff6f5b6da432aa221ae4217aa11be315f9391895f8c17ffacef7630d64537896d79abe4731db3dc2af978b478f43bc7bae44e06b61f9a528035598837062f7807e51108822fce16e1727566768a157565b7369c6151113804459f7495c46648bcebab6d8e187149d98a2e3360a0ecbfc0b607ac48160418bbcc1864f2845f26712844c931945e73fd3c819ddb145163bc851ce598770d4fc1f1f298d2f32d76709df7142bf3f29c5697e7c421b0baa043de67baa9e14043062b53ac425091b395a975447678fd136746f08f592427478487c1e99e52e9c75c2d362938bb478333b6a3a60d518f8f15222cc17690396145d0d6f8cff859aeb94371b12cbc0dbafe8e7be138020143c1444d0211f3aea1f861ef1922d8a15380ba9b46e141255c15e9e4aa08238d9039812855e3ac7bc5e9bb84dbd3016c94430de1a0d53ca5ce8c135db3fffe2a53e44e1b0f29b629bb4f52fea7c0ad3dcb59a72b569a43bfa804e05d07c20b7813f1902fd2b07983cf9a13fa8655fcfd937344779f21d62651b891d95ec9520a409d2eac6d3d22466c8be96b65512de6fa4f6bc0b50b6e6c48394bfbc4362d3334812f328ab4fb6b372949f6a89a23f8b2cf6a1e5447f9e9a8854f462853215981056e5ac11ad9384ee58cc6e3b0c79b72c800288a01ec4a0172092cba8cdf5df0787ebbb0830296ceb513f491f2cee7e01c5744800d66a7436f01106966c5d9ae21142efa1c065c260d18fafb302f3d46fd7a010c6c546318021e1ea4167b89c43689bb7ecd0e6f6cab5fc5fdc489233b6ca24a210eca212d9245d1edb0b80df7ea805d6564a3ba0271283dc611e72cabadc61848cbbedacfc66a08d84716c35080f97988d217223aca933289717ac1cb605a80f7e692225504f8951b3bb4bd4cb2a7f62459bf2b7c976f4044fcce3a76ac1f7d4bdc5bb0b6c5c2976fc84b5e1047cc41ba48093ccd7b6b23b43ab8812d90dad273891877f558444037165d04f67b00027340f337e0ffd68836ef72be029b6b089f8ac86f46f9403b40cc267b7edc5e2ddb7815bb72bc220bb09cf91bd00828a0c3cb79d11b50e9dfed861d15e38b6341957f32f5f19222a18435d9d02bd3eea26b622a74bea261164a8130d977000d9f7b855c4ac05f6d50d43b79336d5bf7ebccbc5fc42f9d5049035f92e095fef308da00045dd39c8ff63005e488b29f6f7683210412896e631445f1d7fced33075cd402215a67d31767fb5c0eb2edf1df30dfdf6b73c85b3ce93cab4ca9be8c67d9214073e821d9ba578f059ea87c4f921e4fb7e69110ecad840ea011e9bef87ad8de6eea178256ba846b0916e1eb12b724e04014598780899cad7fadd7505c3e55d10919c0e0613af22f526e42ffe9b8d149ed9b1b003587d2f46038100cb3f93b4f2eb618df9f49af6e4f322183db85644a1bd13f333c94d7b4a05745cbdd8ca45a613c6f6708a0d7d0ed603b03f98e95f33a923d2909804c77dbce2aad0e329603fb034ae7ecca9e006104d4650b3cd5f81886f219344af5d823712042a726a88b301d5784d40c67f20f8b1b2a8e4c93dfd5496581505204cb7fabc772f393bb4c25117b5f322247d585cad46044c9c3069904cf25f91af792840dc898a0e8c83df7039bb17c433d929a5919a80b974c4b1823d9140094c82cdc17a800ab6c1c85127f9b7b9accab494194f216763c21c1e1297dacf22fc8f2f8154a9acbb2f662d032964aad0c98de9320da00a936efcba3c934657f2903ba410718864d78d13fc9014307a74d05cdd6d77ca055831f94905073b51dcf0b571360728311f78ea3cdd3ac35dcbe453e28906f9dea726dc6181ef81eb513c993ac531138935a3c10856c9418accfb0314997413689337e22407cd0a4a188778d25a5b557e141cfd5cbd13f5d9dd114be4df070bb01dd30377ef16675defaa5b2634d0f9f97987d9a33c5167e3cf8226c9c2f57baa730d3ea8b3be75ff9c7f51929643a770c87150365b7a15bdad94f72a526ead36c52e26fff75dbb967b9eaa1161746e80c62192cec76a7d5538b65f15af7580513134284d11eaebc2c83f319e5475980b605d152f8b5c0a34be43317ef664f4f00841135a93f1336bc9240fe752d4564ab1d83bdb21aa396d925df00975963088900745b080a8f6ac7217839cc4c8bd65e9e862160a12dc36bed1a7e0191399839c92099c85cc943a8474c0e4f0bf8ea04a10b36bb9e65460cd9306dd48258cd62805136a6dd0b5cbb9def29852689e3b7aaccb20cc32d14225f67be7ec94a1b739ea941455cf04b96931dd1d410387b557f9949b18da4ca7531d311c75b5551b744f20181513e250034d67b528ef99023d58a2431a8e0ac195c3b38c6731b279eab0bda61e37c29974c14ef036c25629c674eededc587df5bbd40529f3ef9b98b7f889ff056904943b07b805479bb1c6714dc8fa83c87a16091107cc1f4a3cb187f15c074e071d96b3f5fac79af477aa3b8b1a8691cfce9784a0bd73eb8bbf9d8b881e44fcf9e8a86f1167a97bc54d2a7f7b447398e33be97fd2ece3f8ced7c835f2aa344dd2a74f6ec88b2b6e177875c74562ab6567182bfa4abeac052b6afd7ab7bdd2fc8d364a87afb6efefd2d7eb26227de664942bb6b6f0191c4df8ed93d3e5d5c1932b08f6234e3a62e1ed49ff07ab498e3417b7920e17eaddf159a7417e6ff63cb6f39eff3d4ff5ca89a21120611c5677c2c0efa2b78ed6b35a444797dcaae8539c45a2c83c843dcfc35f833f10091418bced14e3eb7fe4c7d2baec7ade52b2ea1ed93f351bfe02d4389f51ffede91f5c33f66eb2693d0e98bb59581da7cbe951747105682d232e78f46f578303436c2c6c078afcab31957af13d60c4c31155cc97894273366230e0bedf8963a423d48313e250b80270d828ffa5cc9b50a708a4be5bc2f0318b80d5fb5de2d8425d5de2dd5b90eb5127a8c2c9956388391387954b1047aa056b6c94b13bffced9075ab059ee96ab4614bdf341e80abd4efc7d122f28787ca53ccec0011deaaa704ccd2c4215347cc34da525b4f937188dbdd137df599754d246648e0bc791d0cb215ed9e88f70246779b7db2985270a09812a0c40d4fb92522b8b2155ef3f5fd4678bbd58767fb7d7a5a7b39bbbc7be735d04f61887bdda5492d3a9d645ad176b47cea41a26b120bf9e2c9f79c5d0faa7a164d383852d3fb7ae5171d8eb4f77898f1c82d1a244a3e2aedf7932d4588f267d9b10b85fa06dcc4473a8ddf1614b88445a2aca1cf7e9e9706bd5aeb9b000a0434fc835404421a97a938dd017a82c1826410b590f457b284bc1fe4de550c692b20a31223dcaf1447f70528630b14a19b85d4fb48458f75ca34b478435fb83e13edd79c1eec1de17313c867bf4e00b61b56f633540552c6f0b9ed45230eeccc4921719c470768c45e48c209bc6fb6bd4c38afad91fdbe308fdb24a5df4b28d739902a4a7094286fc968438657e99b1d7b621f0c7affddaf1c1938f18db5ab59907114e60c06a24b861be315bd0d15f5292d0d9ef43215a895f00bdb1caef75b614839221d5445966ac0d030d9a4233b4156d8f0e83aa7860ac7967e167b21bbd7586e4965ac9e6a4e650b0d9aedb944d9862afffc270b5c6792c84761ff155047291402ebfb7d26b906b65c371e07a4a065cca6f8bb7f1d4183244c0c606bdc9ce633cded1cceb6347b3670433a942f2c18a877c536f775072677e25ba9cb2dfe0642d7cf8a9db7d628a69e15d4c15a28e034c8a3f734046b3d09c57e364b0ec4b2ad7bc36dda91f0ae51b0545a1a8efc67d5c13936358bfa6971c14239db16d21aef2944785371bf53c47669fa39a30ab98865b0b007c6eb1095dbedc267a820ba9e56cc3b9ef24f7a440ea970e0899b57ea5258c43b2b4dc02ae620ff65f0c48cf0c044bd330fe86e80089976599c3d91aca0a6a08f5f33df86c8e10abd7ecc1850b3e7fb7946f2dc763d6fb362db58a970cb7dd82e9aa6b81f0fc2f873a204bd35b6d1fb8bd43cb79cce8c6590e1c19e14154b2becb426cb685a6b0b98ef9e56167374979120fc4493a4275863c52bc41033175cf4e94aaa6944722114712cf0f6a571e31cd8144866aa2602879659a307b675f0e5793877b32b6d6db7a2db3058b1471cd270fd99ac88cfc09996f18dda4f9bd73d08cc72d39d8e54bbef4509a2f758cff232611f0474e336a6c42ef9779de2adf6c8361048a39cff98ac3eb37ffddfff2e68d8f1387678d839be716c4af8abc66012702f504edd87b227dfcd4dad71c1edc236beb3308d4a237c990697e194a0aed0f8ec71c140e90540bada5e1c19629d76126b2c858ab6370914598e68c71b026865df9d6043d2c591a2fafa927212b69666cf539a47b3906747d9feac5fc6e91621454b08c0fdb43ed0c0899268e16597986216fc83c79e1b266cad42b32d324a0fbfcd501ec044b6fd181f3e7142969996d0b7f93e6149955e0b9309fbc3f0a4d70a1ae6389c6688453b4c4f2a85e85bd0130ffc169b8583d694d565e58330d125b22d0d961c8638919991084f6d9e96fad1cd844977596160083fe7814ea6d4456389982b24a0ce6a39e5df2c53d1f7162c93d8335bad25b36898ead329848e9b6c5325d4a8583bb3ff00495d4f138f7733816b208edbcabf7a5543fa1764a27995129494895d02de29a10f12db1a7c950de8d31c2a86149c1e0396430a1658ca220a6755333f9178b21af295fcc8f5474e081d83e47975d77374b325f68d8e276672783ef168238e7683c8222e1aa601108ac7edf415980faa1e9f9820dba28d4403e2d78767564a3231241206ca6d12496f30314253b19a1a477e314a16dc8c0223b60ed823606d2a0638b19178a8ae690bdae60c403c76e46d8c97b1e010a485c9f062f0cc4b88deaeacde714e84306296eb837140a8785f9dc6acbb879de001f2517801d7e0ece131774fbb692932c2c92be824928adf23c24a68e7240bad554aa12a44fd5d4efed2d96b4766b4902bb57ec0afe0fab1a2ee770b191efe87395fee284ed376ca7aab68ab2370a6b52e49e10614dea151465a99fd761f89f31392da2d55ee5675918b0c1b0493a83970e6238965149d3bf6d3c16bc093863db6e293f31678f18073938584531608ed6e5a1b11c3b00228af7def4593494e9b00bdb3390c955554a6874267852b4b3d5eb5547fea55f2f77f868bae4ff4b505913147da4f4aa125540f128f9cc9b2e557583e0b1511cd3d8d1a96ad4b6c5d90629780f618e6503356159ea1121702eacddf6094079bef8e1c792cf95fa2822cc46909bc4e6c2c70d4c0b1075e4d9aeaca18d2422c1bc5033c84a2f2911dd956b7298c26f1f17f41b0ec0ffdfa1b8dbde474d647b59ea60903f00c33b44a6d190f388bea577c344c753b47766327b9f7bcdb80bbdfd5b309ec5ae66917998478a3c116f60c389e00b380f9b6a80ba3ab5982be8ccef39e30c396517050890d877c72f816e541d00a7d7c070bdda59408ffd23875ec2a0ab036e8bb7090b7c7e08e83d32924d33d4ead57010e4024df5fe4b02961ca44117c246cb442071c95f664ce7692e4be280d625adc9d3ff73b846a6bd0c8f73ae0a417ee7204433b5f92bda4c93902e46d6349945a86ce54c2b3b96f3ece4d505d971c0d73bae610f82c6f3d7d61a3fb468b8386299edf0f5c7ff3bd3766bcbbc8ab09195a66ec34c41c251ebe3460aa3c1eda404d33d5e910ca065b363b8e5de961ba3ba00d74dd0d5943f23b1c55d2a45e657e9c63833c2ac3e5e80591770503957c9e2ecf8dea6bd3d2c56515a273ec8994cfea9b2a9cc8c27b764d3d230c9af37f03d5ab0a57fec6cf4913418d66a8a92629d34183be83f700749106a22c193416030072c9cd52656c8a15dce2bd12ad638d1d9148861aa9df8aa1b57996af1bd945e52379a333d1702b3ee9bd5e73e993ea99ca998aef496b4b1d2297d329490ad0773e89f5ab38c9f31ebd7d136ddc87f4183374e182d6dc633f9f28de847ba364213c905f323dc221ee8f060e99fb33be1d767afdaf25b084b012850a0c6117e2ad7dc803806a5d2a983bbd3b2a23c0199cca25af2b66dd9f4780f617aed3e8fd8f1b9d73ac8f59415db5e97f14c204f710ca44e42139bd39eb3971e13e9de3f48772220b2f1cc517abe155643f8ddce3bf437dbd5184655cd8f737047e88301ce1587d069dd7f0521e476f29a9856def84c282c3f87103e0a51b9dc997cda9e24890a496869e1c444626470ddef2dadc6a5a2bada4ad2b7d2cfaa7d539c6c738ccf82df2b1627c28e9d729e49ab071459e1fdc2cff09cf47bb8a77c2d7375ba2ca98aac738f18a55b372b122eb19dc42d29aa356fe18e0ece19ad052083ead5f1a17e996a40ecad1a68e683fc9b419b27d8c00439a1448d8482e1029e6302b525070b7b67b4e7aaf3cc6b9ce703c04671c52c98689b35ffeba2aefbb6d6279cd0b6dcc88b9180d2a8e0a663e451ce733850a38dbb278ba4fe9482b2508d9eb164fd37ef25964e9ea7fbc8446b6c4346d51eb234b08cc5fb4e57d49f737b9b6119e051c1b0ba3d6c19c40ce64b68ac04fc9f8a97ef972ebaa0ccf017399af2e0815d518b8ecb4d19ed7db30e99dd62064b136f2d96e66edfc55fa20f1cb3cb70a12868ee1e5c17722654c15e74da7641728005b2a138e9f4b930668ab5163d05081f18290e766d24a4e34609d8b235a4d420dd1b54bb58d90e3b8f4682250b8f4f66c1ddd8dad6cd992f6bf1854a8bfc3a72207c95dcdaccbd2a971d28ff0cf690387235f7203a1ed4febc7e8a69e4e73b58bb264b7c010139df84c80f6c8b63dd277d0ecbcfd8ff93d66d66583d29f778b81aed1c11092868a1bc72e4634889b65040830362cd2773fd2efc38bc9457c8c75bbd110a079130f38d0057fba390e750dbdcaa18ab8fcc679664cfb0345eeda3b2f90f2655e8592b95426e1a91c2a00b1e91e1478d618c3a75343489e00789b311aafd4989291a0f95b05b6c642e42eceb6be82e3df95e1b1725db9c3dc5d4206686cf390f1875bcca454b5118277196222cdf04c5d8cb1c8a23f35844aa329ac10753d02dda2ec5f2b0b6283c4c91125f2b64c9ccc000ed29f756128551caf52368aeca6465afa203550640fad21c79714a3d0704a13e2bec7a89efb63c57664343a3192d43caa2f04e49ee2022e85bce5bd810358fbf90487e8d4011227c199a9c483066e4fb317dd8af46c6187e55b70762e63bdae226802d20f3ba3f6055e197465aefa6537acd2c0dc78c0aebbdb2d4e8b34ff00070e12ffca9748dfc6764482b1f0937080e4111de8b9a400e03590c3ba718e1fb7568d627b16bb52603751f80af05a79024ffeadcb24879fa013d7210ec6b5985e63ece346c5e7ce9713fc40bba189d7cff44e5e228a01952785593b31469b3269f483e48a30f1d0ef2ca75aa2fc2b4ccf56fbc90df8ea4cde65494e49aa01748521a6763926ac71b1ec8c26f66b06fbda6e8b43e43bb8368588bc61ed09c5efa72b309ba37076c0a0a4e1b04ae2fa4c2140eebbf19953639284b67cfe6ee3e0ef1c82f154431071650620dfef846d2bad030e6624b8392fb2e55cb192c43d2f0e373f7c694d1416a3350ad63f58858e5935823efb44ec484c5db24c452080a90cb24c7bc9ec20851b4c1ab90edee04e973809be5f748cef2f0758cf95ba89a71ba13d27f13f2f1db1885a56447fb79e260c56b8131905e9cc36ca676df6b4f7ed31b0f3f7413da720b83161994d5137459b0a6d6f2193ef3717cd14bd349f8c9c873fd594e7c03543139071053086089904502e0e9a41eb1f7f5daea68212ea0d6e9e42e04c0542ec969c7631ba49f3e443aa5c7ea96c40c60bc2b175abbed4e0ceca35945210f22d773b15009d9f5a616dd92946eda518b4ea9094c22157bbe71d4b0371c88e8e9dc0a79fcd14e4ca484f1eb7521c0aee2053d83f0b47864252ee1e983dc92bf798490fb7f2149d5733ce3db3fea3c905ceda983833cc07f319e20eadc69351407965adeb381ba45d80d414d21fdef32d062233d4b1cea905ce29676e99cc79dcc002e70d380e60f388d51acad0c5f778107c23e500d47371c9ca5e596ecd715ec4baf0d630a23a4153af80891a4e3b4cea2342969a125457135710796961fbec09a93075171ca2a98ce2391f02d5c4bbecb530930aa5671ff732d6d330d42eb82dba70d7bd5799b888026d53c5ab0a5d63c97ebe2ee2ac6a7bf3d85c8bb84d481306364d7401f76ed5e040500b462780616bfeb441ede9055bab0e410d2f676e68d346a4e5297b8d3ed0d239ab155728d5e67fe5d722154bc1cdc60f8597d7799987c0b1021a4c82c9f826b7a7e0586079f36d3c184be6796956aeeeafc66a0e99fedf0b6fb5de52c42de6fdc1e6d5c013a43ed71be613ff6fcfbb2164dd16d0c0765cfa9319d7fd0382792d3eaa2f2fe778e949d62a8a1c9aecdfdee82baaffa125b5522a0ed833d06b20aaed71f446628125747db601d03c7314140f8aa2005e64314f522ac6d7c82e36f2a6265467827e2935ed017e610229c13b575f42b2866658a6c36374b975135a37e9fbe7db4404ebf810ef7066f7c62ac1cd8c8ff3c15805370bf3510f2fbc87b34b4c557b11db1804422f332fccbecf0c39fe8571a2be6f35692121d960c8d8bd8b76e2b2430c9990b4f818fdd60b00337ca18d4138dabc61a40d575ef55510215882ab47bcaa44d5a993a16da446173d044a06e9511c83c2dcb63fe08db0127759b4cdb011cf1cc5d68f902cad88424948ab067009ac9bc3ebb62151e3b9a5ef92c99243f1d795d8407f7de18354da2b8c9b7349cda0487e7118927ff53b2dcc54a776222d502092cf93c12ca50910cae16bc8d57bd42b489d87865961a7f769bd325c4a068c36be9505e65500e453d827ec9b6effe16901479d78b74a816df89abc9ca93ce477c3af117fb5975bb11deaf0fec06cef16b86b68ca3f13f7a60b1e4929178d35f5e645def10791c560c8f064e3b8c3bc01ca74bd809ea5b74dc685b42cd0bc8b3994778cd912511cd0850069afa8d23162dc8609c82743ffcec06969408df0452437deb35614db518556999ffdaa311586cf7173c55ab77db58570168c273b829072819ba2c2ae355484aa6fbcdf5a553bcaaf183d194fd8c6ce51df58e0e7746272561ab3478b01145c5dd6a3746551e69a5cb75361dbd184a6fe3b65f92bbba6988cacf130407e37c99c6d57fc276eff14c40b3045862e63e63b5b9fe81f583f58d03d02ea1ba19c849d429aa79787a56ce6e7a86322535aff634a644d359889f0475f8e6b79800471304cbab32f0f3ebb733b325f5edb8da95df78ef6ceed92377486a88ec81b0c37257ca3cd9fc769f23088c3ba4cd3605f77ba308e97f7fa6766dd4603c7738c356e1d7b36f56d41f3c25a083e72dfd969a852fc190891a74214349fb69562ffb68b36aa231915512658c3ac9f2a2c1377712b50cbcbfe52403268c1f401a565a0641c7bb1ced2b6fdc09e4cc722ad83a687eb995598f8af59720d3fa01bc85b4833563f096a0caa683741f4cbfde885dd89fb7b20aa2d7024987bd188e5416825301d86123bc0ef39135c7a3f0e28dad8de98f4e02f0240554d25b5ca6bd76bb6225fa5a08e49244dc9988be5d1965fbef9e94495a6747298d7f33b9b8a84e2a4c9ef6af4b802acac18526987619e09ce86e900b64e83d96ddc3ff6cd375ffdc58c9f346cfe26d2f7b48563c37796df6593b274ffa3dc35a4dba545f20ecd6b2e4874bc55bcda23ef12f39c2d1e7ae8015193df44460618157465b60f6c1c2c0fa5046920504bdc10ed654508c4bee9e00bbd325f6d5deed02c32a53f3296e5654372cee007721f13b916e43657b06bfa66ea1eec0e2afdbe0707a064bb731f5e5802ce3900d8c0603d1eb5ca11bebcafa0bdfd3ce04ddae776707f916b27e8224557f806e17745ae9df26b413d83013ca511e96027fec11412de148d4b673ceb0c5df0d8812c13890d2e3cb10ebd460f9c620e1a354d58a36fa9dd6218ed939b02cb23cc04b087a7d4aa6d601d36f2e6e1a03e5f497c969e1744af136b51761eb3423f91c20b35b9f02bfe6d0fc2af37f68aa7a494d86118295b40236dddfa892dae337cdd2bf1cb1e085deee0d256d723d979fc74fbb7bfd8eb2a2eb4364ce95c63f5b742fb20ff7992cef6f2a22defb1f747959718a0269faea870ab64408df838c4c3edc618e18af691445f64fc382f84bee2f8b46b6285669de8a5178fcbeae44cde5affd52197f54c8ccfcc8468a53f1d66024a870b6c71664584f600e83029839cb8284bb774019a173665ed29f11cebaa0b387c074d6803c6e52bf083a5d2a0715f7f2d370baff7b35de4f753582daf8c247962b1c85ffad6c891ad7d2d0e22daea491500a4cd5a0cb525ac656598dc4c18f8e27eb90f719f8c3f6e7844d2a477767f7b869ff1045f0e6e938810d02a1bc4103d7d8cc204e075e65c47881b10398a570b50961b4cfdac2769c6ac3d388ed4cfacfe9587e5c4e209549684760b9f7d78afd8fcf98ec27b63885ffd7bd74a329919a57a104109562df538d05bdc067cb4ba46ea178ecef47babf30677fbf34d273537726702d37a0f97fae6d17443908af94a4ea457002e89d9d1888a254bba1eb5b364f4c80da30050484b15bb7935a06056143f32895225ac77119d25b735c1cf6d71a71f101a0e0856443170c834b344c18ddf5323e305d9db55f7ec5939c711334dce1d64f44787aac03a04cdbb0156729b40b64ee7e3e570a709b175cc5b8a7078bdf6257a4d434fc332df57ae191e7239899fd77cd598ec0fdf31460d4b49885a68c97a1933aede95cca5614d5e34c4cbd26c372d82f883ae3cea8a31789941f696edfbd6c7525db9858e0f82de4d019ab06c2c7d89a52db13867b6723966029b6dccc12ecdba90843093845bfd5b4a5d859788fd1d7ce6e28cbe9a5b40a8c3d508cccf6361512f47878637af8a7810fe61f306dbcfbf6bb88ea8d7f16d2ed48133c8600660207f4525fa236fd107983127afc36dc24bec5649912fe65fec13941415b07ec3ad859b05a695e7b2791caef5e49d0f508bcfe4783cc251d8e1af023c236c10456058439025a342962b3ea7e763610cdfc6b3a7c96a2b945cf1ff2cd2c835485bff97672439f2a9fcedfced9f106c32b09b59bc60703f6470087f62dac55e77ef457b53cf326127491e571f026c2f8cde2d3604c52e2a45832eb7647a5e2039d0d1f509834ec6e9d60e26ec5f37a2f7053fa29f1de51e47d130e5169de4fd461cfb4b76b8f8595c36b7bfaa07a0896a5b6f466a79f6c5b4974750c7762a8c2213ec2176ecf59ab0cc2effa63b113caf753d405f610b415435aaa3da48d75b2da2bc2d1dc3dc3c7e9a63e3cd6375da722ac5a73c4dbb05ae8fb602e85c67ae8d393b3ef70b5f8eda7eb93ae4aa0f824d540de5e91a2fbc4d25bd07d721e5e629084f71a04f1d67416b7d7185c53fe39dd436ceef9d01241b4cca952c3cb46bc2e88744d153f34c0b591fece10640a87211a2785892114c0f1daa26e722b7ee39cdcfc1c147f76efa76a07a855f3c3f0955ff9cd65fce8e24e9c973db5887632ae7afec037a50e17b02a799f2bff9685c3f5ffeee702e99c4dfc984bb58f51d1658103acee5873bf82cc3bd516e2e85dfd7d3d755988223f79699b9eb3125c3fa95ff5fed1500ed2b8b0cad571dde47fd5feac1b9f776d5c9414ed8d26ec04b2651e1e1f0b10e48119f9d59ce38dac16b6b3a80fed6fee2cc7e474400abc0e5875da4d4c40277101ff9cb3d6564ca8f6f6b5d4dbc93eb17f586283a6c2c33f036bbeae61e8008c62e7fadd92d151a50697c1f23c697d7a8ef38a1809ce5a69f39ba69f017272e7d34e2ad7b7620fa1baaa9e764079928bfcecd5c4af617d4ce317d562ea232a23b1b19d479d083cd57e87f55053c4120317557b4ccda8e3b19f815b119226dfd7865bd680644aaf2cf33a47da526a0e81c78c20910fcb669efe452401c53b57356afd1229afccbb99c9331148439c93c643d72b861838efc8adf50006e88cc8be415b64739d55786d83f641c97b685426640deb180c454e1372228c6fc6167e80e01777b975a22e3c48356b74ccbb399994a6f8e4fc32bd91d26d8f0e78c91d4c853c6b6ff35c18ed93a3b40b71789d0b045299b29f37828daf43d3d1ae705526f0c3d3b42083e847471f66de3cb018c3f50489aed65ea2dda7f8e2511eb6aa12388fe80b68d897db7277644888d8f7e84e39ff78e03bed918b727ad35269335e68555d822eab7c7b38639a4139645f8205fe88349326c8faf2e7737b74c5d60de2aebffbccbcbacbb58df7a5a74cdcbb5ef90aaf1eaafd862cc67f42dab73855011c043c78873f3af0216ce1b2b8032b5c23b0a43e3160f9f0e6e3e8cdc07457c6fa3628dd72b5a150cf3fead105bbe9b841bd72c9d801227a29e7fcb7288f12289c730bc2a1ee4a6878e56c9f4bdf2516239026b88d4a5ab0817411aed08b12dfadbc76e53ddbea7b615b9d87a4cfba4f9ce62f594aff1a30721dc374c2299f390fd4e3e9108bdc4281f85f068b8a832fa9bd64e712544b2315b42d81c3e335f8e5759ca5865a1b45ea466a2a7efa82d7f4d421960fa6c53b11215839e20d65ac47468cfb7fb1f333b25292d54f7842290e8ab22c8363d3212f0b0a165237294ab91c6f58bfc88300d1b0baecea2cf5babc3b6ef0f973a234ec80a7a2f5b559b7d91c99f82e45252e7a7b63f69cb0d278269bc523e16ef2d7dec10883f6a2220b1c849dc731d13abb920d59fa4bfdbb18d8a9abe71e2a31f3ee7175388785d1e44a69fee27a820e5e7785031a05333878183a4168480256406890125fed87ca77a1fab4ef6583b4cbecf1e7b2ff2b604e3860bb679a11e2ddec7f993abf2905e2ffd5ecd9b5711f0ee042f22240af2101b5e29e62985b1a2ac0c51c7cef44b62476410e3976b326db1fae13c4ab4b5f5fa6bc1e20d14d2c83943386dfc4040db1bec83fdf3e7ba7e1840ba74738355ef57a8aaa2712822247c9e3aff77bf59425458445e4a0a92d6992a7d0c22b97564f83ee6ca33931389186f759faa395b644086654bb9affa5301604f708e5f0af2441b269131eaa518572a2272d148d9ad32f56b5ace8dc96093c4def4d2a91c33998e0b18e09cdb1c2a228946655f69277224fbffe10881dc344261664ab005d0224308ad77b84c5e9e7ee7b71cc40cabc7a201086572bdbdb6d7a5b60fd90e4daf25778c7da75408336e93e00dd5f206a2e2de0c24284fc1b0a5ffebb36b766c8298ce231601677bd04476a86efe144fe6e580f904020ac9d228061f22136a093a343c3cd442a54428f0e345849345af104f6c0a83cb44f1bf76dda9ec758a4623a120612097c74aead060778dd39629b6c4d772116b48bbc5c7ed4986eec15465201aff25ec63332beaefbf9235e2162e9cccd5c9ad9a08e58c96d4075488d5e383086d58f1c2dc002ca94e09339fb901c3fd6cb747486cb37fe1f20041f9c6b2ee6cc746d28590a2bcd01fe04a3a801f081d6d00769255e584d7af5b1a043e4d700b7560d405557c3af67f1838427c01648847cb29d05c1693d5ea04f4ec3bffcd8fa938cd6de857a49193dea3a1050ecf5a0bb94213abce7934f31bf644900e9465cf865868edffa4ef92bdba5a16dfd48a997cc6c4b2b6c4d616b4d074c74e166dec166c9a4af99ed5692aa419485cd3d7953e18698e139ec7307b74d8b84c9f94d86fac73a5dcf407a2b6456f4a7a111001d3a48b06a881e15f171e6f7eaf519c813a9264a86dc2a7d7d45c702101366752bf26ac066cd33a337c65c76c93f4e1ad7fc9bb0f0ca43a83ed7cf35fe9ad932d7bbfd79340c3fd8d61f84b8ad4c2cb605086ed891c5fc3da0381183866a179fc955b0cf88f1460e620b492de69d53a151c8d44e35c3d65bdc527f1855f13b07d45bc49a48362a2d64512432c362492671ab74b91337fa6590b739483e3a3484a2c8eeffca75b0461628471c25da07ccd4db3909b85e5a20df09d85ac01fb545625dc9cbdf78806796b5a38e21b812851dbbecd92e3b3594c4bd8f39e59085cc642e6b5a1b2356ae15f4a00ff9cba9e7c3ec742e760e0e4520d9c3c014b677cf5aac74c1c9500b94b02a98a106d0e8357ecc2f2ab363ae0d8c270c9a543bb257f33469b02384bf1a4843890ab329943bb10c43aae35e5d358f97d5a2a8f2ab8c36b86dba276f9fa4e607b04afdcc308850fff9c3eb46bde66026c08c89dedc7b6d96e91bf5fb3eb550182b39d5c89ac7554bb8fda0037d29f89f9392a2fb35c35b50efac2064f9f540fa8b78307c3d7db0a0d292c602f23f873220bbc5a34c2d3b6dad603b50b0934c05a6db27e46c0f85ce7493d98bb7ac56b24c54e94675d5517a5c73616e178eb40d5833d1f021fa8baa4e86160f1bdc8ce0d0ca102dc2e36008b27493dc0436c97d6e2976212f229713a2d33ccbd13921ce0decc6adc61bd398c989b4b37208cca4d57c9e524bb6976d7042811595439f4d58a85d98a36dad3f4112aa44b13601d13e0e97de50d4922c7d6f3508147c93e620cccd4225c750a539c3e482707112e5f8a79a89980a3ac6f993f7926f7ea959970a7c94d8a3b11e52658019ca09c0e7d8a0aadc2f322cff6707a65bae011430323053e7d3807a01f0cf0a1dfe6b2641a0d3e2e63111e29805f95cc3475ef3115dde93d3b0933b2de91a73d8df686730cebc7942549476e81a42bbad9c89a9e21a23c975f09d64bbf2f92fa5db19f2945f723c5e6d825ddbbd6ad9b96dfd7d510f3092755dfc7b759d08f8c37aeb1ab8bd445af960d8296961397e063418a41c36275670e65e10332b7a43088218bd836d5d3b702575a052f31d340034f64a2941f261e537a311c2c56ef4fd539915c0068d7f1ad0145acb88af7daf1c6ff510b76a405644c84babd7931bf1c09855705f2985beab880d6a30bc9e29317e3321726d4e10220cc70747369c4cf71a2fb6fe4c4c8efae276959a4ab33cb909a1ab307e6639cc65641a55badf6eb734199213c440289a37a1d936d0ec9c870e7514c6eb1cc3130ac659382816f6dbfdcda1bacb3b0799a61feae3be4ee21dded12048e4d5766a3ad9237d2aa62cc636a761a28868d1be495206466d1a99266bf9ba226ece9e8484b8c5676f1e1cc2986284aebb60c94b19c531931e2d0c23f09a471755ea49d3d53c4e3e4125db8cfdd7a8a09ee1ef9a7b61db2fe122cdcdfa9b750dedc7c2f329b574ff42d0934dd58db76f6796fe59b7312545fad99b929f4e29f4adf3f5c68827b446a87e28398789b9c98125baecbfbfac1b74a0103bae63d9ada8bd72c8291c22432db0935301e7cc2cecde1ca47b27e80f8677238210fc86a624c34042b68e1589c71df730c42a3bdfe2ac27d7ea7d15ab1249d07c6829bd2a9bfe710f3df6a8621675d990677b2f3381fe1bb132cf352a36b557b608bbb0bc13adaa04eb7c196393fc09f5339afbdc647e8b6de66672fcf9a9983191de3ba96133dc3bc2cdfe9c73e3e8c8cf133f7f46e7c3f2adb80197dc272ec44f95176580b6eabf159b6cf45776244f3e96c8c64825a6eadbd29e3851ee3ae106dfb0ea304b973cd4a136ccbd70dec7a5a6234fba70b1ed1b5a676b78fa5e187d8ffdcdbf9ef083fbf5f0d1e07028fc955efee2d7d1fb0f94716cada0a610c98e68ccf903a4ef5ac467173e8e0771d39e1a2267898171d47365f2c2000e6d93930dcade2c56d3cbfc620cdc2fa9fd29b960c2aca0295fb176b1618cc8352a9b6f160f80d29dc29a3c1a5138d39c97c36c9f0b59a1a5769ca450cbc24067dd65000898b6ff3dc41b19bb9a17548f2c9cfe2b30e4c8b2a1eda017e22f884e5697aa8d89640f0ce10dabb4132c001baf860f070dd2581e1b286c89fa8eb84563483ce08372c6cf1310218027c28e2272e927f46be9c444dbf78e27846f97bece201152380c2bf774aaf6d50f68721f1044f3e7837d864233c4db90b40163171986b574b2b258070b6e8b1284763613d792c257a12f5ccba391b6e26d06e7c5ca7009ec4837cc0f98192a9875cde1ac1d229e59a765260e8fa4807629311d01c4fb0316ba857fe05f70ebf8e0f260177d9168c8c03ba732f4214178f0f8df92a3f0fa73962e6ed2525dcb49768f51dbb442768824163d6fc7ffb059a75f8b8ca49eaab4a2aa3e03bf66f4ffd91307d75c6f1b09b53b29f2f2773c4641e4323296414a83d773913d15f593cc07c0c1bc4abe486aec3a48c1de23164f2e229ecc48a24cf20581ec64dccef38491511f79c852ac2d5457bf003e89662a48cb5dd23871aefe21f155fc9ed8bf6fffb6c9e613f7289c68b3dca1b0ba294ff6b0b1aebfbb05fdd8a65424cbcab8e11736776ca3b3aabd27044f949b970509b732cdfd4c9419e22f18c266172026148d51f6cba006608e035fa1b5cd74ad4666e463c87ffd0d58c173d02c2c9da43bd751415925df6cc2ba6f68d1894cd38e44d079e7f596d3a42d135b5f700188dbefb8e25dd83441e75d385006d239978968ee3c0d183bf9a60efee98fb78d1a50347d084674944f78781216ce77ea4f52a0cf0aa6c264507f34cfc54517b4e07a13197e3c6438a96d76571c93f0e040591e4d1ffed0f1c2807d2138269246da0cfde522f38edf7b370e03fe1885db5d3539aeb0444a6176f4f24f9e4c482aae8fc4546870b12f1b9e418abb48c41e71528a4474f881496cfa32d968522ac9acfbf35d9104338a2b2ac0387d6f44677dcd5d3453f318d89ae0abf4c88a724eb73a803aad84b3dbb4a355ddd1eca51e3968df81ac779318bfa61585f3c38c30c026a08e033c06955f1e4b743b38466b6b7200f8c9252de85ca491888fb5d8195e7d11d8596e4b583a4e63b576443f446b9f46d8f5bb4949c756164730496240a54f85e416a5552c9a93f38b5929706e2903f52604077f9623bc7927081cb9722a66b81389462b8acd7781e10a9880b41a3882060036acc5a371ee26f7e29f71857d73a257ae7b90c09ededd1044da2dbb2576052ab6a51dc44f00a6982a7b38a061c59ffd588498bdcba05853faa5d50cf4d03960c9344be7fdf68b44b56f65328e90972c10f748a35251b4812bc1b904d68e9d055a6d913860a1e2ab4a0e87cdf0bb89c67893cb8203784e2771183a3da68a319a39e15347b13af0b8d0392dbce9dcb6903a4f25b359131cd9e956c935b0494966438932bbbcaed34b374730e0050b5ca3f1dd82e8db25ae72db57d744c1741f18b7377e17c6e9186b6c71a9d46313fcfaa0026b0fb62b601f708e860742e567df188f44c1597ad8ea2fb0060346cebbcd0387c1f17b4711abb03f3ae1afaf0f59df867a4fb5767efd9f8cfa9259dd29f5bbc90cd7873cc076ec1f6c3540bfeb9d723929c4aeefc02f265d40f2ab9c35692d6cb3ad954cc7021cdc2cf875084e3dc548db3a0c774dbeb2315f3a9aa3221c33923fbad00b692bb984f67a437dcc4802d6e93a801442f5a13234f487b20bc40c5edb0d280878305bfb8370dbd5b170adfbc6392bc396106b3920bec0d3a63e2c2033c9fc41cd79282087d46019bd0bb17bee52c833d998db6b18100a551887b080b3ed9442ba30af4382a5406abd472328602b9f5bfdb65ddc37b6eb419bea9d9d3756f8d384820af18ffa02e32de964e0a5d3b1b75fd048da067390b5fdffed94e5a53099495c3d5d728d05cff30658ab80eb752a323b4b3d1f06677e858183d0a433c031451d9401a9afbb0bfa563ecf11cd2922513b52f79f0852a07daa5fe6941863a300160bbe07cfc5ea23d438fad2e4aef262ff687dfc376e850290e472ff55ee8107d4e8466d68c8654c9b9fa35e1fbf31e1865c5d1a5ed887d13b32076d49b83099286c420ab69043b9db3ed1810d97d372869ccb53d4e0458170aa6376c4126be983e4f3211e049619299c475e2852ac42daf960112153a46dab256f426463c17629a436362b00088a953ce04566d900a2a0cb62634d9bc22a05c84791fe1af05493bfe59243d8024ca91d7b0be5440343dca336a71fe205e02b3ca39b5efa0979f162addf292e995229142f627437e5882d92fb9d541538fdf9cf9f5ca790272e12f691da14ff1c3b5a63d44f8e3bc9c693e68c0cde53ebcb17b9e30fe44f4866f60e23632bdc692ee9cd6a8e4e0a00db836e89acc0e44aee9197261569cbb3766c6c619d376df36fec7a77f083e6343de3121c4276efed0c43340559604083e7e68d21b07f1349483918cb0e8c651e1711406e492e567cbc09e3b8ff7eb25de7f14cd2e20d1aa2ed42eccf34610a64d2fe3fe11b723a8e36e3a95036bbbd5b8ca76bf44764f657add728d678a598299e53ca7736ab1c1a39fca0b72c3f40fd74c6739f5caabfa60afa45f463d5ed7fe4b88fd92bb5a411de657efa3312b001f2edff252677969e19f3b19fc41eaf9951efff7144160968b7334f93241b6074ca902f16d780a143c294ecf0017b86d03a9bca96822c93b9dd085038196fb82e81bb4393c175cb2a559c92545c48d346b5974816a67c3017688439f9c1c6d1263b7481eb83ac581a88005559d73ccf6f68382cc7800ebfb65fb879b4b0334235195ad3e7c9c3c7f45bec6d044c54b3cd50e8512ca2bf71c10888baf14f4223d7455ee945b431e23b01ae22af99b58422731fe1cc4dbfe75a36da9b44c0cd1082e941580fcc7b6df20cea445ec9d5c8ff0f318f03c0506fd330d5db6cfbba23c73d296a4e49ed8b9226b631b7e5d8fed080cf5139a1f8842d25c35c5a5c23e34329fee4e64a12d79ad01697ae68596979b1016bd13d6cd40803c147a5224d2cbffda67902751a154ea2dc10ebc20df068d429472e697b60b67ac023d8ce6723f457c78e93ef87be2421df03fcb841f8d2ad5a5bb9e2ccf9d3032537fc9db16e1b27df119aa30713ea5962850213164d32c4175e934c56c5a00613488375c4e39ae1176606bf79e1733750fcd8aff65983642ac60d1271a9c4365af7d48b59bdc1e062eabf4904e181646d49eaca52d071d65c4bc436d00a7b94237404953b8b444933c3c5ee9b4d0e18de4813b507a58ae86a037aa94e81f4e02b6b5e01972ee68d6a711c85dca653a5799247a10471d5b0fb48dffd0f3caf5c90201262df96240f0848c02f5ce82dea42eacaf96882c58dcb4999c35753b733d6009ac80e9e49f00cbe633b7f4249e947bfd5618130e150d292b12e36c6b3b3fe8a0b8159cb5a2f160e3ea9ec271daf9d3ce3f82055384b3bfa081b78486cb6846601341db24867505cebc9a508214e07167bcf6877ea901102ff99b0a21f58c92aab856ee4e5bd579a34b026cdc24d09807177580afc0f5d5c210ed795707c6101d119c5e7ca334b4b3d7e7cf664464994f7d44e74ebd8d1d6e0166e75cf61df8a3bfeb605b059bccc8b0ca65a20a6cd62f9c9017e62a24bbc887753fab15f5198b1318c4318b57ff4f6ef39f8c622fd3491829350fd765e3268684d40510eaf26bf68b3e1da64e26e60dc1f402dac64f6e3517ef51b37073c321db4fb956c14adcd5f5620d565dd8e7ec916dd14ba60cb51ce861c55b7d31892a79a8e0c42ca9c32e0bb82a239ec55ed3113aaecf5172492f65d26c135b977a4f5c3bb396c4a2c33355918da88d80b852c39614db94a9a3b95d4d7b16c813911f5710c38fafb709966baa9ab6b2da64b8e83ca4dffb33ef12e818405686cbf32597c04e114191fea64c5b398c0901a17d0d540cdb23df83ce0d94cb8d2c1f3a24df6af2d18776114d16cd48a60bb674fafc53bab6ba2f75e1325f3148ac83c0c91d02d02bf81f86fc01ce554e7126966a937cc7597ce63f86ec46cecedc21f1e08d3f7992d834505bd0f1f9ef2c2e03b063feac80bb57da9b4650ba5eff7759df73f074a0a5f3b54630b080448845e4a90df898c4ff53d3c02b91e5dfa4d67acf9f589cfba25d377407b79b49cf7c787da3caa93f42cba758a78a42797f387394a118f87d9efccf2c19be11653275633fa849eba096c8886c845fe5f922a2001add80ac2d6bf306b55a8b15db4d0c1b1c39ff25ee7b8407aef21772e783e3bff3f20be2f7441c6e1bf1dc012cae1873f57389863dd240c335372605a187f05f0b51dd69678d452714e151eeb2dce75c330186ea3e0c9eaa87c632218457c4cd1cf2316e70717d81cf5df97421f6d3a41cff1916b89dc4f50668c665ff0e873254b417eef95a88066b2b0a1f1a2801890b5a78e117d3ae1450981454ae09c7c8b8fbfd1c8f92f839bbfa2f89d816ac57d12c97a677d8dbdacb261310099b5c319b00c49ca4d73afae45c12e30dc4d9dd39f0e5c5c7aecb3df1b9db88a07577d01ef7cd9ba172eb0bbe82cc97b1dfafc8d216984c7e24c3bd6ff2eaa7f3003b4abb3b689b43c81d423a1d80468ce64115487d9fb35098cfc4fc6547664a582bfe94a28a0b97c97a839b7f49f4fa3aba2e6adf8e38de90e46a7ae1f7a791cbdb318777264646f27cce7f8fe9c0c73bbef402bfc7234238dee234bb1d1119828359a5665cc715b511f9aad8d3810a925fff520615a6f687d68e20a7bf56cade375f389b700adc6ded373abc4a979fd23f54663213c91026245d1d814a9bd63888e3c78d0a44d00f6fcd0837f651e3cb3760ba021e151cf9825bb0608a637bc47663e06bf29bc3cdcfcd8b0f1ddef13f684cb859cd9af580b17b0c4485e82202d43e92cf8ad3116ac168562507a57c0d5789e525dc108160f8f20c43bae08fdae24594b8351f0705162d86ab3ae44d511eb11052db378c42b1df8c22ba92315d217cbfb95188d58bccdd13d62deeab55def673caae5271cbe55f020fb7993320054d2b4d27ac59334efd384de0c953f08be8d05d437a831aeaeadb1cfd02d49371000a8af56253f53877b1b353163a020c3f84a68218cbb6c23150b6bdd57da061720e3b70d26efa31884a5b627aec0fed84cbeae4ef97cde04cb5a207a96b6dd9c7fdc06e54ffaa9f737306dc943173f3d601c58fbf0f6d49152e4a6f346b67487bf6665c3104efa6ef4830ac353a9ae0bd9bc3f38e96cb60dccc99ef8efa64d43418736e5a54304b9f54eaef8c625cd8f5d46dca98fa81178cbd12eb52a2b74f4c9993bcaca369af876fdf36f64c717b0fb0364f27f3fefec4d9e44fa666209d5e21f24bb1bea1ff16d4d776fb35f9b731d8a5a981f0cd0a413ca41fb8f77479faa48d542889368251969951ba302a8883b511d3b5e37dbf8d713e579e4dc836781d3b9ef11f707b708e7839720fbb0b96d48b57fae034fdc875bc5f6682fee2cb87cda41c214b60ee573e9240071bd34b6817729c7ece5122ed824131b1c5b3f25a879c3aaed700addccbba69b3cc1c830462733d7e2f489d511766038c2a30b982c46676153b1d7d6e2470c8b7e90748f9fec97379f5b4e37f9bd3444f7e9565246f3ebf72e2cc45166ec2b4afa3b94fbe0edbae7e6cc19c5eb13112f864a28da29760e7831779b4af8c9f0e44d6dbec2368c3d1e3fb6a7cb31e3c3246fca7a6671080f355fa489f2b7a1e9c9e9e9ef17b909b3b7573e3c089bfcfe43395f5e35ceb1bd5e99a1c7226db1edb4ab89e450c49a29ce64707b2edf45123baa59ca9f9f95988bc289e3b8f549617321f055105a6d94f6faaf2164517b99c001dc9a1504aee55acfacfe4848951e81af6adb30bcf3d80aadaf1f17337df4aba7560f0787fcbf823c9bf9bb8b761f16df481d6a36e574c28a5786c7acc41ad994eb74584188f57290d01c1db457e4f49ffdf56acec90fb95737722fdc70cbf6e286b37c985f63e04bc1786f2793a929fe4ba9b7344cd1f47a61bfe4b8419884a42084c2bc6adac46ffe216ea2cc2b487ecec9c9caa2c4cb35b5dbc3b29882886452736b6536e9e973ef4d4bfce1ea3229f9442034d148be8b1d00099b505b74cec877a6d39082da9a35b96982d5d2d894388b42d4ecd0cc66bb03daddef08ecdfe4fe53eda98d70ae0a236c2038ff39e4bbef85a79fd1a75dc4aec1527484d31abc09829951d01876d9c777abce7dba14e04df89b3da386516e674b95bbedc8a48b6276476dcdce623da8fffa36dc95bb6d22b621f017d544404265c8a9d81912a6ace036db7d5ec43347005beb8097a434662f5f56aef1a6c717a9d98fd0d4ff958a8bb2ec7517b715901d4a9e22c66b150451682f3f1f52743eed71290ad60b41daccec84abfad4971c5a0a91b2d39ffdd199cc32f16161ba7978f447360257ed3fa6f01fb61836dcf9ddefebaebf003890d54173a07a2dd1d9d28d1a8fe2fbb1936e63687ed46a6cceb1610cc57006e48b58db5ca9d1e6df1259098702b692f7bc04b1e357f78920405a181f95f726e017849b17939a7ec6f494f288fd003ac2f430612e4fe0fa86cdf358228fc0c9cef4cd07759a54721c673c14fc220aa51a3ef9943422c88e7919580f75b6eb4dad912cda9781cc3f549caecb61c387d2cbacbc842c13a8a6a3cfa8f16c86cbecd3fe9a238992301a8c42024690b88ab85da58a1d5ac5861a7d7bfe786f3b8c190b202c3893c2a1f8d53606984964fa073d6731a241e7729d37bf301b063674fde91b5007dabe42e897041081184c4026feec0313873514d6a218d6df6c6f09356ac950f237a65bbf48c47d73a038f210a1f15ef1214f4accc5fdbc8bf1449c390697b12a9e3d9b99db6621a356ea273d833057ac2c58ae0ded3678c378eba5e4885b4266441fe9f82e3c119ad0118bb940082701f7dc057ebd9385a42cf58cda71d1266ddfae9a1d2e185274c7cc8c006ab160a9cc5d8a77e263bd8d98703daa52ec1080cf71251f70cd91efb74ed4c439721d8d7b0504ce0e221f2c98f6bd60e3d5a3f002f91c7588b5d20aa8d9f7f6fe25680c3563279d903ac8a27f69de517bd162a07ea64dc775940d1594c7fb642f8e258c62eb9ab176a8760c1511e67df24267084f1165c137aca9150b5adb093275d9a5978904f79eb638219568df090c4167dd67cabadc2a432625d5032648b2d7a225dd36a031612326cd45cad626255d2e6b66dcaa4204f8521b54ff25a91d29e5b64bf1400fe25f98fdf1476e1275ca024f811947886ba212108f63403151e4f5e6484c3230868390c45833821890c36432197a253c51918d26e4a3af8659abe29b807034a2fea248ee37db7dc064ba3295e4b626021fa79a16f124e16affa3be43d057ff8042da38d59258e50db158bc553707ddef8fd270a0d8fb431992203e768a174c81b58f96c9a61cf8eab72544ba42bfb0be70b8e93c0ef131315b12d0893d3982dfef0df5e80ec8c231546eb1c066a830840c7237097f307b3bafc85cc1a4fc92491f601af9eb9c3ed07d767b92c98ec53ee9f0f0e15698c05d985d06d3c022ff0a8a8f17a9b14747da009c1838901b2ca8aa4938baa8c8b037e6644150d4410a0b5491bc3300c268688858a0aa6e8608e02b668392d8b1f5b631b8d9a8da5db4aae6ceb002fa27907dfba4d782bbe000f8aecdeb4339254de1dbac0bbbdfc5687fd24eb0f9e0cf40b27b08d139806494279d00c8aad3a5c9c401e9c402128d5e4fc4099aaea6bf5f12112f31eb922faac502f1a3834831084a8a2b63011e232e19c70e288609ffa2071299274d2d438695438693a3871429c38cb89af13f62389ed54d01f585c1c0d93054ffa0b4f883ad6c409fbe184c120a1301038065c86c704d3b448304d2440a1003b610938d69a9ba1288f50441c8250c3f2801ffcb0871611c5a2a1c415419024141e705ce1c58b66103d7898cf0c555b68261045753279608200ca8ce763c5264eac70e3c40a2a7cde43c50e1ef645d5858d2124e1a48a227cf1a3d0cb5dd9802811e599a128204a745205c70d921bd5733fb40849b2c4668a0cb02469faf0c614202a64bf9811816250088045057a51e5630a4754a1e9640a3948523592240d1f2449e3461b7b58430f92468d3c744213094a4c07e573324514275340713285025078509101314e9e473a799474f242d2c91b4992c60e92a4a983544d219d48b106a90627526c7122451927527c21492c28410a20e210070d1d2449330749d2c8210e1faa23d2c0419224cd1b4033f422499a34dc20aaa82d4e30c0058d1b346d90240d1b2449b3068d1a502a7081345688b2271710802445218828d488020c2751f4800349664c9219731285e8240a21ede1c0c49e1c1440f9745072447182b206499242a00f553f1d29c78989154e50c43841f1e2048a1440bcc1861a7690431a6b38031a50cc2a34d5cf48e53d749e40f14ea0d88024492b404149018a67164922d1605f860a8528fa441c9e08c2133778c206663c918227a82772fc139a930a2441b20f060a16d5dce20b97203980f00372949828c2119a3224a20f6a98d0c1640e6e300943124ca660c203144c000092244d5fd8cf7f811213fa509dd9f2269c1309404992649c44401392f41272c14904825085a659759470128129aa1308b4a00a4d473e238ee8c867347d94884e1eb0054962142b8ed455f93839e18124893e584c4e12dbd9545888a88f2864ff379bca332b556931252b40312314847c3c68e6658a4fd5794bb180a80f16270db0815485a62433e68ad057f652568846d40903129172c2800e9c28208d0cfc60499258208303b420018628590423dc2841a3840c2709f080a4714333831304a821499f190d19d080a20331384180002449bac401ec19064822499a31942000094728421124c90c498a410c66408624955146a8c7013a1d901a450a94cf7bda09013c484a1620090e5042ba42152e70841f42c8010ea42152910e50e064001ac9ce0fb91b09400492d448363c78542702c81180499c04000e2a50785c8a0a7d4c47b4b91fdaf122430101557054bf48d501f9a83aa0e901c5740010872405917a9c00a0049274292af4c412de529f138d0f4e341e49a2b6902aeb99eff2a12133f43c78d4ce0cc9d65a6badb9bbbbbbbb33c618638c31d6ddddddddcdccccccccbc7af5ead5ab57af5ebd7a758c31c618638c104208218410bef7de7befbde79c73ce39e75c6badb5d65a6beeeeeeeeee8c31c618638c757777777733333333afb5d65a6badc531c618638c31420821841042f8de7befbdf79e73ce39e79c73adb5d65a6badb9bbbbbbbb33c618638c31d6ddddddddcdcccccccc8b237cae396be62266451a01269a2049d20cfd15b5633f44a8d01b99f9a105c5224379fe878609a1e78844d4e7a3c1424b45b1549a2b4892c60a92a4a98267cad0cf4c21148b2469a820499a29485290a459d92a2515a0cfca8746a2d1ed4c8a220a7528caf4f18caaa9fa0a0b4aec9024cd1992a4818224699e20e9a084e40449d2304192344b508224699220491a244892e60846308134b2e2b2d1426ad1051016b969e9a2a5456ea410225a74c1c5c60b1f5cf8f08c2cc5051cf58879d10a0ce5e901472bffe9c07c241049b44092248d0f7a603731a3ea3d33121c2a764892541201a9e40c48a8a00a4d3374535513a49141621f0c142c449ff9e9c4744231a3cf3f220d49b222029a91e4197926b505cca7230a51d407ca147a84171a2f44204992a429a221f2224992678aa68a23b4901a8105fba11e709445fd2226f0e69c113ad0c1082f6c872ab2f220a8cdb8a84494a772375a841792f474fe506929623f3e66423386f2c82402119224c95c217ff8f8214af2a32e3e2b2a2d459ece1f9588f2b8d8a7c2dd08a50a77a31df552d40d21516929b2b92124a1078d2a44b8808ba8b414516929f2e94ccf10974a543dcc10106856a3ea7308151068f2e0b1015552891f2428c40089219214620cb09988008c20499209241d847843920a1137f693746e10e2708424491e8f6322a11fc283c7065411c223499214253ae288e30d499274c43102a90b38dad0a1b079535d5143d515b523fa1836723c8223d83c723772d781636510660091248d073a20499e5048564d0f0ef0a7f2418940332120a24f871a8281900f04310641481a0ae808440fa27080243d118427cc084403a44a93058fd04bd20c208af007454892540249072056159a38a209ba62468485864715fa4e0b0a473441281e8f0f1e3c74fc21057e8843871f5c241d6fbc21bd91224992157cc8826bbd850034259274828d1b3d9024c944d2c1072aa4246b4dcdd3b2c20ae7064842e181d2c5152b6e0c91dc409124e93d9d3b61664c1b9a9024e943a40d38d440d1b186019ad0860aa436bc90daf000cc075aa1f242c48a0fc582d286244928f6d339c286212410c5c61924141e5c8409483ad84832a4191b3b24c91dca870d014892f459d983225078d88e1c244972d1b18726ec218924edd88310499276a07cdd438a24ed40d1b1870668828a1d6bb081c223f4301d6ac5435923079224893e6b8024141e6b7821556baccaae610022920e3dbc21e9d0c31f241d7a1084a4430f71d4cf4865e6e38362599124cd8e25499a2ba4c98a07cdbc4892a60a49d240f11e3ac3e854df22499a0d5492a4d140cc7bfe41332f92a4a16214b3a93a92a4d93185243d6846f4a099299a97925334b5d0a1468a068a0c4892a491423445530b22208a054451422449937257bef248fb91a11f7725f443923418780f9d2fa11f9fd04824aa1f0251212d5c8288dec5332b25e4ff25886752ca1344f42e2a2a2e10ba40e842c4b10b9166765242dcada8a8c0662bd0b1bb15cd05242e64a8501049d24481b222491a2844d547923416a88024aac20043365b7916214244414441840869b6e242e483345b09030ce96ee5598408110511051122c4dd8a0b910fe26e050cd94c4524a4998a2848339517d24ce58334530143ba5311e24e4514c49dca0b71a7f241dca984e101d2ac59b39595951517222b2e4462ecc747b3955017cd56429417cd563c2ecd563ccd56c2f00071b712860888bb9521ee565656565c88acb81089b11f1fee56425db85b09515eb85bf1b81009715cdcad784222aac5dd4a457d346bd6ac994ab366cd9a356bd6ac59457db85381f1741e883b9510457954dca9a888aa0fcd6771a7220a81e1e24ec55a1fee54e8c8c59d8a67c4853b15241d2ddca97c3a5cb8534932b970a7f281e9543320d00c89a059339715222e2a445cdca910a99f51e8c5dd8a8a16cd549aadb8ac107171b74204c810772acd5456dca9ac346ba6e26e45f421d0b7b85301b284396041b21398c3169224e99803cf410159a0a0f0f80284c24556111ff6635eb412a2427280220e3fe320461cd6e4c0a18283186cb3111c5400872924a99a28554c33ffe30d492469d38353cd2d50aa8992451a37e022312fea4892460211903e8c4e15f3a24eb3d187d1a9dc504992c4bc38c2e79ab3221f1fffa1649e45a5ba1f1ae2a1286abf873b2af4617ca8cf045513e4c28621fc70598321d63004697a149967594305663649dcadd84fd2510951a23aafa53aa1ca7efed38179eae97c0d5194e77244309f0f813af55b5ee4121a0199992c3fe3230d6974a1230d4310511e978fe9bcd84f0704f6d339928646431c68d041094494a7aac27e3a47485082890a2beca7736487fd748e5c6ac60382cfcad70972b1ff79501792a46180660167c8e20c28d2190a80c22326c60c1f141e9beac87cd006049a3c78446ead435519a620bda8806086783a33468aa84e0b7d117826cc0b7911757eb8d64766ad0f02d77a725c5c6b4ae6a599cc6c6126335b1693992db165660b6c99d9f25a66b6b896992dad65668bb7cc6c612d335bba6566cb6a99d9125966b64096992d8f65668b6399d9d25866b638cbcc16c632b3a55966b630cbcc9628335ba0cc6c7932b3c5c9cc9626335b5c66b63099d9d232b3856566cb929946c8e0802a34a181051d687840071a5248d218a820d98f1955a339a4fa8e8e31144092c4700669b262d8c124aa3a42445f8961b2341b8188e488e34554910f513294108a7aa97218a21092247dba683602c30a2429471c3e3e44e0a83e3464109294431081908e544a8865f91025aa428fc443b9f0e0f13c4413a5d90845542728e66d17782049d28b2824ae39eb242ce43f140b17c2f080debe67f36174aaea61266853553d9a8d389b23758ab6108298da114d198f6756fb9bcd666dd6a68baccdda7091ea5b3c1e1fb5ea70f1af22aa3a9ed07790c0cc1f1f335d3e2b228a85a5d9880a7d7079b11d205c641569c6a92687534d4e911e3da0cba2191177a3b754eda1630a389024984f67c6e3f141b550a224a5240a0a40a0128ad8c2195638a20a4d1faa138514e83843ea3863c8342945015285263aaa2469650a1d5090c3ed702a8903137540c1495568ba42f4e98c603a54f4e9c074a81531a34f35d7c44850b8d0c113b220bda07c3592410e9327c427a048f6613e2820aa330249059c8d740227882449ea694d8c44fee8a2e5c5e58b12a9e48c922a343da542a2aaadf8743ca18f59430f00804d384392a42fde43911ce984ac98f9238f279f9615309427871a9294230f9294030f928e2688710749929078286a088b085a26912042beaa7c803a2f9d992454a80865472e40aa17899ece1f445cb208514078f02080ed504578f0d86c389b0e686e4055d58335379bf6139a1155dc3df8916c1c3333f3e2089f6bce9ab5c86233b3983fb2783a29f5928252cd2c8aa05401820d920f81cab084244d2865a0a1a38c468624c870021949282af428a03ac880128a8e17c02149d214eabca0063a5e9044aa4414cba4e3053b2617a4f1a1444f47d7053990241d2ef8a2ba940be01896f850a11f238d313e44cd9719832349938e31c650c0141fdb411103109224e910430b301f2a242302205d7c18a11e3d7af4e8228b2c92503f363233546d92cc98169ca0058f0570b0e0062c60010ba658011e56f082158460053b2469a258a62355473402cd78aa98993228339f593b9f09f2783a321fd3114d199499cf7c99a8a876a06840031ad08087a240339ece8ce7fe87faa8600d1590a1024b89503ed6043c787c353943be2001ca4b0a38a1230569e8484111244a3483f29c2f5270002fe808630961804047180f987184247d159b8dcb0c0f663a90a410497ea023892889053e9d19125d41a1cc7c6638a2102523aa461765a68a992f3ef6333955f8c8a272a95ca8f8fc40a9c2435174478f1e2f59802811109922320298bef8e20b2aaa0051a21d4190b071a49a2324399024c98a1085c40b898241b29084466c48f3c7080cd38fd18f0020ea822846644575081d151a3c78d8f6565e2e4ee765bbf282992f5d94b8415af66e2fd6eae8fd67bf0d92e3747ce3a48fba4b091b9e2ffa6ebb3e1f7df72d1494ac414edb8eb60b19fab58e3afbe98000aa213216a35b2e3277ee3984ce756cb7b9da1546cb6ea64136aeac513bafc7dbde9a25689077756dbc286d4a2b7d7b06591fba7a6ba3fed331ea7ca5c40c3246e896ede6aa776dff6590933ebba6d768db65bf22192475d335b3e5a8bbf442ca7930f3659a60a6689a426f210b89406848469fad85cf698d77353a06c990c51bdfd106a97b3dc52097d7ee56effae6ebdf711e83f11b516d292f4152c0901fd37999a6f788e8a89aa669822c4636a39230c4e55c8bafdd5b33d36b9bf2b2b539eec7791ca2904ccfddc0743c9e779da4040cf241cadcf47adb85d0310a5d48c917647d4799473a632fbab8398fdfae1620912991e843a2aa138a2f255e90eddafa59bf1bc736db7bbec3f248a8d09069e2caf3968ad9346fa2a40b925dbfdd26b79f9cc7d64e6b7d7c3ad41039d97f420917e4b3f6b167df5e6f8c31dc826cef3d76ee55e8d6c6398a619e1117d304f150a205d92ab5f1d5d78feb43879cc7475a8602b52c48b7de366ef4beea4d9f711e77362130aa9ea67783122cc8cb6ea9f37a70c549a95322c8cd239d04255790cbdb9db596ddc62eab97f3787137e86ec4dcf3a2c40a72b6af715a5b5fb3ed68398f8fd409f2364dd3e46e344d9ed9097d354df6f347eaa4d3e4af648c922a48f8d5c6d870d6f88c4de63c7671a1e999b57247de33ed23098daa6316239b1e255490f1ba696f2fd666b3ed6f0ab2b276bfa953c6d7be8342a6490af2d2bb608d6f756bebc209af88484854b96331b231414914e4ebafb459c7d67dcbb4e40c16978d913176b4a785c2bc7632abed1032af469f10695bf79cb9eb6ea55de204595d43b69e9b9fb6d6604913a4dfc996564ae9b3bcde723762825cf37fbdb858ec5fffbe53b20439e17458bfbfceebbeee4809d22d8495ff45b7d6b976dc664912bee37af146e670f1bd8ff3d8dd03c574181224c7492b638f526699d796e4b708bd0c25a44f507204d99885d727bd9479d53a61e747094a8c2027bbed59c7f9f3fe6a91c8344d53cce8e3588c6c684911e45bfd1fd9b6ae0d3ad8bc8408d2b9e172d4dac7b859ee583204e9b8b1061f5dd5edba0d398f65fec342ef1212b930bf90a862254290d7d5fa2bae7819df662fe731bca251ac60485431561204c9ec91ef751c2be5c83c66f379cfe31910559b6da3949714da4629b1bf0408727d5df4daf92cbdb1236d404a7e20fb56a66d5fa41432ffd91e28f181bc77ce06a9e3c990d1c8af07f25f84cdb117df9a3c5db49ff71f253c90f72d7d1effc5d0260629d981ac4fd9eb59613773bbfc79cfa69b16253a90be7c460a99df3d2f6e939303c9d6d25ae9bd1cdd2e4a398f1d8744150ea4c3e8d0b6bab8365a5be3bc4dd5698e253790ce46c673c567c8ec98721ebb8ff9c6cd6fa9daf98cde074a6c2029f5eacbb1b3175a873124aacc90bf9cd6d6e0bbccbdd8d44351748b921a48e75864af51fad1b1edd53490aed93aed5ccb456b9b35b72e99818ccdadb9536e0ed7bc8bf3986d363023fad6b50c24bb9fd45b5cafad5d6c82d854120339db71f7e2777456e8cd79dc2a2530906fc61b9fc2f916b56b3dcee38ab2ce2d24aa5c4919d25a16abab75fd5defee9221636d7d2d6d2cd2551fbf921748c7b5f65ab0a3b3b3d92e71819cf6db3facf6ff17f7978c21ef7b5debfdcb1c63daae084ac490b741d89aba836f396cc779ec992198177d3a1b3b41cda1174551cc65b005eeb11dadbe2a33ea9cf318368f36a2980b250b2a8bcb276d934d7addfc7436ee461be798d18709598163754eafecf69d3777cee3e6a202e91c8cccdd9eb35ddb6a5d2990acadcfe82cf79b963dc679dc5c98a128e6b22cc2907efd51fbaca3fdda99398fed6f9c5d8b3392521629dbd6377ab3d4f9b073c83455143a16231b9824325af85c7de83ad6c9e064ec3e44d59691357e7bee2de60b23a32e3616231b2f9044760eeb7af4d535db659b91640fe16af5c5791bf2f5888548c6e5ffdc8496357bec17e77105b9923ca17b6cebf5ca666dcf79bc61dc42f2fdc256237deb9cd1c89cc7ad0a3024f7a3b76f8490b9b6064110bae7acdab5ea4706d9a4a4f78c7f67846ed95bb582623a8c7e248c77bdbf8c3efe5be9c7c8e6f7da2ef66f6aafb7158f7431b2b5b05d643c672fea7e566ae733874cd36331b2b9472473ccbafb4e069945c6603e9d2371a140b63867b7566db4b42ba48c29d71df93d59c3aebf5cfcd79a3916239b1270e4336ef7b95557a3d72d384d1ecfd769fa108c74b6eb55f6eb32e89e3ae7b1ed6c1e34237a1f1fd334f3998cc5c8465ee97445ff45ddd1e66c9df3b889626e065e72858f3257e383d3195bcd5609acacf7fa7adc7ad2ebd3b2247605e6335ba6e9612a10b5e1c76264632b7b6c113ad8cd1d8b8cdb6f33cbef4e4ae36ce6cb79fc222425f4a29569fa109069b2df0151759aaad08b40d3cea9178744a0122550099fd97b778deef176fd50f1eba78b8f8a831588e231253f7b93a17b945d74479d6331b2d97cc19c37165fec059941e8fe9c57637451e775b1a61fd98c3b8b914ddd480b1985cfc2a60e42fb28e7f14c4804ab1af2e1550d4d8f2c46367e02c79039e6e6cd7163e6a037c3d8683b1bf95deaed1c13c86fabbbfda573f27a7e4b20ff3d3285b63d7576d049201bd7faec3ae8aab769dd76a88d6331b2198111f9e89cacad5a997afbdb11c8f8b6314abb1d737a1715e285f479eb57766f74ccb4af08e4aaf7c5c87e9bb1d58ebdb4b318d904292299766cecececb3aebd4d53880a857e9adc6331b2e91071ad57ece7e05b8b6133638fddebf2e833c2c7cc3072de344d93f3900884821779a3d3396375adc6089d398fab23f3411bd1c344b7d9bce748e86336f4486dcd626403c4455ac8de7270dd672b6cdb388f31d022adc717fd3686cfb5785d0824e3d5b6a1bdb4bae7f035f3907f0f176d96d77cf53b86a00bdb5e7cddacae56af375b4bb5b02c06eb738b42beacc245570b1792553759b3fe8f596ad9e43c4ef5d80979104e7eeb7174cbc276efa113c4ed0202796773b4f536befdde6d9cc7202a64797d405e861fbb317e0621dfc979fc1fca5337cdbc22df3adae2bbfcdef557e63c863fb6801c39bef5da41f61673b39b6290783c9364bb38cee66efddddb9585d1a94621ea7a40319d6e31a30f13c55c9920b2ae8efcacdde9566bffeea53651888a7c11bac3d791c2f51cab52327b993a870dc6bf6d4db7a285b4d32b64ebae5b61b376711e6f18b3e3fa48581740e46448adbdbed8f3d3d99cc79b66278ab9ccfd903e9f8b753ddb45db5f1585a0077cc8666f3df36963a4efadc579bc79d003d21d3ebbfedad93e1d759cc7905f072483b3ced5ebde1827e4c9792c438560b87bc837eb73cbe6536eb0c5cb791c12551c90ebbbf56dcdb173cc59e43c16c5dc48240b79dd5cded0b98eedfa659cc71bfb991bca72bf116021a7d7472b37eb687b66c879cca946a04d88ba1be7230548ca4bca8b9094fa45ea23d9c8ccd06b2c46364278c87fb345c8a8e5efb72ce43c0e4d4eddac491473a7e9435415816814b3598dc5c846045142b771d186937a3be793f3e02845a52525e54548cae6d3791d1281d887a8ea2c46361c80b23e6be37d675ef9bab9388f43ff79922e08e7746fb5c5ed59ca795cd9ff6a237a98c6292f41aa99b27a94e2324d33e54548cac6238b914d890c5c6ba0d9d780f3142c02dd14159200531a5812b8c2025304aca04015bc6303ddb91f025d400313a082023ba498428a0c5c408a2b1aa5f0e6391b0a60c05d052e9084921159200a0ba040e15a5b80613307a502cce3e91c5914986202f3433b2430f347aa88c01410d850f10051688aa638690ce880e954513880ab993fb2d9d1002918d03154dd6cf8886b0daa5fbd056c7628000309d86ca440c026c98c81e20030946703f3e9c0c0509e081820c60205e0cd87ee2644892605083000dec44c118a00a80880fdaf36170040ca13950666478e8dfdcc8d9bf0460325bca93a9b8d28c96340f249b0195028f998f9d1b0197d304001a4365ee0081fd20e7490031cdcc00666d480063390410c605006192f70c11862b480052b50410ac298495285c000519f18cf1114743830f76da5f38bcd094c500212181981a4a30966483a9aa0891c602880d4861860f02179200090e8801d24a96a44079248928402820e3c213d128a7aa8da630d3d9a207a981e64f4b05af448e9e1000e48e2840376c082c4811c70400c69118a901c6892cce2115920e2d3a158baf359c902491643b2a0408924652161f1862461e1052ccec02208120a0f2c7220cd7c7c4892261188a82e92260c27583880872624942a78acc1c30c28222a08ca34adf048398421a4dae1804254cc8c87026d409468f347664c54c34934038507caa72324824ea2094ea2072449a26207ca099aa2a2024ea02002af979d8bcdb7f84d19c8da8b5a56d946763dd218c8c9f8dde7bd60b35f87815cad39cea6abf172ccbe0c19977bfc98838d23fc66c9901de17d089d6defb5f802c9eebbceefcdf68db2ea02492b6c18977d7863f71c4376743a2b74d4325ff7e51043daf6bede8790a3b3d16b27a475b4c2656f9bbcba3527248bf1cec88d2dbe90996e42b2c5fe99efbba76fba2664e4ebe65cb523a3f4ae9909c9973e65b7b7c18e7e3121ddaf576b74d3c2d96d5e423ef7cbfdb3eff64dee6809c9ff0c5a0717f51befad847c37ce76935aafedce2125249d8e272fea209b4cdf2464d759f9dfa22daefa4d1292f6578ed6c5b6bf6024e45d8db2e59a29bbafad07095923bceece603b65661f21a765cf7fbeb8e0a5d61192d5be7fd9e4c9b339d808f92cb3f1da767667d76b8c90d1bd3dda8f7b3d48d91721fd397be7cf672b5f5a1521dd178dabf93367b3c144c8cacdaeb5ec22651e9b2142b69bb536b798ad6ca33d8464af56dbcc3c9b568786906d1d5aefe6f6d9dbba101246d6737e74e8cd1242b2c81ddfe30b59838b3b0ef9b87937bef7d1d5ecc22163bc4ddfed7d2f3e1d846cc8b7c5b6e074ccad1784a4cf5ebfceceedeae61c0819db9b2c5e7ee88dad0a0849ed83af419e75c23be31f24f3361f7f74b4b9c86d711ea7bc04892c46362c30f1839cedb2f5b1ad7b591fa4c74b1bad9332b6be46ee37e46d9451f73042e66ed15a01f11d98f0c1dfd1775a1983f4d5673898b821979b96dee66e7d5f5d534f790992c20d0993362adf5ad9fe7dea1a3664c3ba76ddb9afbb6e03fb0c267b90ec8cd558638bd0aba56bc89f8b3e9cf3d2ba685d1c4df420dbc15f347a9bafad852f4a1335e465bcaaebc7deadea6e1cd20224c5ae4cd3102129ce358b918dc919267990af59e85875f6dea06d95f3382482292f4152aa0f202922aac8e763545a5266422faca182091e24eb55fbf1a4eed141fa9cc77e0749996de62284ce1ca59529133b48bed4ad66f0ef7ae89cd641ceaecc7e2f76fb68ad7490ef6e4f7e6ea616421add03267390fd60843edf84d6a77b4b0ed2a34fe66b9f3d52bf1e0709d74fdadc2f16ffd566e120e36cc6ccdab61a69ac363233b4ba0b9337488f90b6f8e6ab2f360b997f98a421edacbce663c691d947a90b17dd5b98b841faabd1328b3e277bf33658039336c858a3ffa38dcdd896b187619b206c901056c8bcdc5b5edb83eb6e8ed4190292029b47292f42a6a95a839cd5a37dcf986b0fdbbd1640305183e479eb6c0f2bb5d6d1c7d2209bbad66ebb471a29f5478364d5e37acc395a5985ebb9c919e4740cb6eb7a5adbbaf96e4ccc205fa5b6b93fc75665ee1e91212665903c394e37a9b3962f7ded8c98904132c71afb572dfcf518da24d48f69b29f84a2f0814cd0e0dbeeaf1fd20b6f739cc7ac81613206d7fcd88b8d357d7ecc793c93840a8136949da6bbb1764e5367865e9849224cc4305fb5b45f5bac3de77d6854519e3a4d53e83d9e182aa4b21e17c2240cef3a5e70ae581fb4d13d189c7d733ab53d2b6cfef00b72b1757d7673fd66a5de9cc72ee525488aa7a33245c1c40bdc5c65cdd256a985b1b92e3c1bdbd23abd4dca1ce33c4eb16f9412d3e154139214fa4629cb45265cf8371facb71db37651cb792c1ac540d1888b8f4adb026c6ef56aedb9c6dd1a64fce69bd746e79abb4e3d9e59fda3d22030d1826ccb1a3ac8fc9f7d6fb61504932c4867eae6643a2b6d079b731eb766662c46362e265890cdba069d4dcbcf98f6e43c66579071c2bb38be7bef627f3d04132bc8ffa737fae4e8f7f97cce635705f911367ae15f375d7beeaad935c82c46362a26549073567693f2c3087f7af4782610b8e13805792dc765dd84cdcd27749cc76b39becdb118d9a4984801f2eaf62284efc1d51a3bf77dcf2d8fb53637635b6d1205e96e8b7771bfb7cbac3e108b918d8cc91972b1e5a08dfe1e3e9bd78251b90f1328c8cb3f5b651446fec93a4ea59f201d65dc3d2f53187d42a6448e7a6113274886f6e73bfb8cb5fa2ae53c8636860aa938c1a40992bdcba67dac27b747df5db498a669f2314dffe9dc3b231bc184097245a78b31857cdfb4fe388f3715ce783cf34e936b7d642d41da67b638ce18e37cd52fe7b112a43b07aff3ba2abc0bc69504e93f9fddc5fc39caacd6161324c8f962534b5dacd4f9b109f31f47c4e408b24e678f56efbecdb6d08701999a1841b2b35add63336be6fa721e7f189de8854911e49dbf9a6bcfd1c5a87d8b08d2fdb2d141fa66753152e63ceec7ae932cde5c5eec5a1f7116231b6b3204e9bc5ccfe9edf2377bbd0c132148e766ff73778cf673b03d4803932048369fb2d71c8b6d326ceeabc919f2363c630204f99cbdaf6db40d726bb5b24cd334b118d9844c7e20abfbaf7eb698e3846f721e3b2f9a890fa45b3a9973ae9741d87f7b205b7cd545fb2e65d6c1f64c30e181b4363ed61ada7676f19dc90ee47aba28eb782174d7ec7520dd9dd3b665cf368ff152931c48777b2783eb31bb22e3e7e2c28184ce5f63ef39dbeab3fb8603931b48fad839d28ebe9ef5d9e00e4c6c20eb8c2ebef9dcc15ae77aedb118d9704ccc90efbeb7dada0bdfe4781b6e4c6a20df3167a753da9c451b8398d04052d88cddd2599ff31856cdae99c5c80688c90c6074ce9c6b7f10765cabad685babf1aee5fe276b9cc7d3544d5343622203596f7d75dd8ff73d378c233089819c7f9bf9c6c9e8746c2d0c644fc60ee374ad52669d97d1984318dd45778e5f5bcc316ef1cdf687acb137a7bb266448baeec3ba38b63ae37bd85108262f901c63cfc50dd6875cdda10f4c5c202f75edbbe7bafda86537fec0640c392b6dd4b67737da7cb69939649a360c6d6022863be7b55c73ed357c9039b8daba8d5aa72f42cee3fa5564b5a413322ee7b35576ca9abdbf9c57411e259c90ce36666e578d1f9aa3209e394dd32446c926243f1a1bf2b51f1dfb47ab91688aa6695abce15a7562dc394d48ea169deeba7b4e48d933212fbdb1cec66e7d7ed15ac79890942dac7fffc218ed9b7665c3979014d2e50e2ea74e7b5d670969af853e9d9dcdbe52d69590df78be77a947cbeebc8b12f2c50b639d8bd955198d91eb570d48ca8b9094990701e4c59bda11813a1ecffb24e4ac8bbd236b6c424948e7e9ecff47d79e832ffe480192e223e545488a5b33288984ecf6565df48ece7dba2889f4e1a20510394dd3344d90c5c8268c1248c855175cb0dd9ef436b695f338446d440fe30c1fe347445f0df9f973065fb7b51c33c7d5f4428ed4fab5f03942ae76b7e79ad3679bac9df398ba9fc842d983665e5e63414923248db0b1fb63f3dd1779aec0c808591b65f4d9e95eb7858e721ec7182aa4521fe4b2796c11b2d969335bb718b5cfa822646cebd9fbcf5bf516991b414922e465cf1d72bf35bf794f4448f7e5fc6f63361947f74a0eb19c47e8abf98aaef16bcc1e650cd665dfbdfd9ffe40506208f9d37943d86075866f7e2124acec99bfc5bad967e12384847f1dfeab1edb743ae390f317736eb96773f6b21eea8628d154490192b292f222240534b99826d08ce9324ae090fdeee9a3cb32c83aaee83fa41907258390fe587baf7d9dcc7fc21b75502208c93f21b4f7576366cee683665e88501208c95ffd7f51870d99afc8bca9420920249c175a667eaef7f99b4c09257f90b5698dceaeed175f73c779fc1eca42d4104af45999a699d0342d1794f841be65b66e9b8fceda16bb73913ec8ca13de1559a3b732636f2624fa4817672a94bc215d64fdf74e36d763cb66737c908de965efda581d8cad35b8dc90b5fa7dbfdab1c6ff1c4e9333926962deb03312e656286943ce0a61bfbf8bcd7e3d1925fa6c28d1a7232a61433eba383a6646e9622fd23dc8dad6dfadaf1f46d8ba398f535e82a480a89016d304a242769aaa69aa8f6495ac21efe2ff77bfac46dace2ede70e56644bd84123dc8051775d6ef5ecabed52f324dd334239aa6b678c3a2cf9b1135753f9d2794a8216d63f1babecc2a3f742b461894e441de6bd9a3ff36ceaef7effd16519dcb8c123cc8562be5fae0ba6e417fb889d3b4d9cc696290c5c80649c91d2483d646da5f27eb1669b483bc953ebfeb75ba66b7da3a48171964b8ae57ea3532ff50d304598c6cc028a1434718577bee45065d2f876f45c6b6319dccbd2ea8d292c24222d01c64335fac358badeb7cb0c941aec8d7c26e8bcde96f31ce6318070929bb93f6b4bc22abfd70906dd6196d8bebbdbeb0716331b20941c91ba4a55eb9b11aebbc0c574d43062f4252364d038d23649ddf3e46c7ae1fda081b21a3ede9bcfd2dbb191a46c8c8eea3b4c50b2df5e7e822a4ab8e99f7b20e6173c740a3084967b5fdeeb17395e1738990eeba375dadad5dbbd5102161eb0bafed09b9aec9da2124ff7dd3f5c7387dd96a08e922e5b7babeb5dc72ad0b21ad63466f7b3769a5712d186808e1bdea8bdcdc1ce1f78cc3c5d68dc1c8adb1e7eeb56efad6a5ee3dd8e87c4e82060ee9ea5bec5a7737725bf7721e6faa8dfd7cd556a019847c666dc1e7bebecd5717e7f1a713f3a4a011847c3376376bb0d90addb46ff10d348190ec56fabe3d63ffd673721e57b5534dda0c9da0018484b75ad7ec6c43e6f15dcee3c647429408182f012841f307f9f8adf8a2c3469dcfc63e0fa2366f0a1a3f48db9a2db7dceb56576bd5e480b81d15347d90adb2e50aadff7d96b5c9dd469a37e48b7ff9b6bbfe3d5d35721e579bc62548d0f081a7a57143bef59e1bb4f645ce63c647d0b4215bc3778fb6ab76cef63c76e5d3c5345547288ae3adb5d6dcdddddddd19638c31c618ebeeeeeeee66666666e6089f6bce9a81a4acf780462f294384a42c6631b211800e346c48f7f6359bf0d9e9cfd5f620e3e2bfcfd56b3d46ebb8d9e84dcd1a92ad2fee3a6f63ad3646f520ad3b9f163e74ecae7b5ba3c6f2e570b1079b7384f1c566462773eaaea3f63e7e1102aaf8bd409307d9d3be6e3cd9ecea98313c48c69eb7fb6bf6838e69c71f9a3bc837db337e34fea26ddd0eb23a735e8fe9a477cdf60e68ea20ed73cfc566975d66f05a3ac8fa3ddd5747e6bfdeb47390f15e66d4c27add5bfea61c66f3652cbaa6d4c541def637c2e53436beed3138c89eec208cb3ddf6e3c741346f906cfb7eecf726cfc830529f4d1af2b5b61c6cf3ad7aafabd70dd2adffd7cd93da36c87f7d216dcc3247a78b970d32b668a79bf4bed77adb5d8384cf2efbfcded76c9dedaa4146660bf6856cb548df6f1ae45d0c23a4ccbae69af58b06f996bb95ae696b3357d73d83a4b4f65b77c1cbf0f6bf19a4c7199b7de7e5e674fa6590917d652dda66f6b9854f06f96ebd75dac9dcc70ae1a3212b5cdffcf15d47eefe31c8f90e63abebc1d8dcdf8a4142eabca67f43ead1551b06d95c5c3fdfa37ea1756ac120affde6da8d6fbe38e9d72fc84b678c76c667de62acd50b923ecbb4f2ec1b99fd58bb206d6d8cb5eacb7573ec552ec88e76b1b5d3f67df55ddd82ac8f29336fac6a41b265c8bee9ab1f6d8c340b92cee83ef247cb20a38e6241ba1aa15738bf3d63cbd12b48f7e2bdf0557bd77b736a0549ed62a6edec73dbdecf2a4846db32ebd6b3d7cc7d5241be5358df7c5fac7ae3390519d775eea96b8fe9ec35a5209fadd459bcd4b5e7ed4641cef91d6775bde0d7f6ce9035fa85f0d508e1bbd7452848c8ce27bb6af92db72d3e41c6b710d6bf3dffb2d8a213a4bbcc42a6def4459e2b3641da47e97ad0ae09978b8f09d2eb8490f56d0f2e415a7f73ad1721bbf3de0695202fe409d9196de7983b4c82646eb3ce7ed6dfcfcb201264b3f9bcd9fa864790d1c5b68d56462773fd4690ce1bbbf894de7efab408d2dfb608e3c70799ad4904d9b53edbaaa5add9f8e21064b53ee76b8ed54b2f83429097b63b57d7b7af36c320c816ad5bfd2e7f9bec1d10e4ac90f9b6b37bcc20fb81bc6e3d325ff7e9a48bf94032e89ec1f72e75ffdc3d90f52bafb69c756c35ca8f07d2b5f6eeceb7dd4819bf1dc8f64ddf23adf6efbcebe9404ec636c6c9de0bfebd3990b679edba66a50d69b338900debb2eead577703d9ee3eb76d5a6add84cfd940fabb5f6ffd67f75b73ce8cda6fd1afd0b9d740c29fb0b27a978dec6f391ac8f6ae5f9fbf9beed29f81a4f02b6bcfb1177b95817c7ddfd7357945b89c8d8174cbd8ec4921bfad0e0319ebfc6f6fc50927645a86f4b71c4f47a3c775a92343fe5fbaa24f1a6d6d97db0b6465cdda36cbfc2d57ad0b248dee35bcfdcc3563c8bbd8aaae27ab1ce784ae1143fa5ddc225bff1af4e8bc13f231d6e072d6debcce35e7847cede8dbda70bd5ed57d1312b6ed78617f378cd35d1332b6d7ec3ad8d5bd789967423e6be3ebf6d31b42cb1c13f21d73f5fbcef64bc86967bd7e2f83cc685f4b4867e17ff7476baddf5a09f9f7bdbeeb21656e394a09b9dc3abd0e7a7bc70a27216f3fdb9a316ffd6d1f9384642e3a73cae6eafb5cb348c8fbb73e67f359e7e6650609e9bafb3aeb1f6b3767f608f9fffd6ddd9d73b62de608d9dc3f658d6ffb657b1b212d85ebed5a333257fa8c9090619dff6b45d61eed22e4735b8b5abecc5fe354846cfada6d77e337a77176222465eb229df0355eb3672342ae49ab6dd0a77de65cec43c8c5abf6834d27fbc9b00d215f5bd6d969d95b685f77212474b4ba181fe3f5e6432684b46db6dff65ab3f5b28f43d246dbbdccad166be387433eb62c9b0e5aff87d10e42366dad5d6bad20e473eef2f4e8de318d3110f2efdbaf8fa3f5c72820e48c6eba7f0b36cb6dc23fc876aeedaacd9b3af3e60759e16567ecf274f7f0f39efa48369173f441322f8f6ebab518f305b90b39de9073725f9eab3666bb32c879cc2c0d39f8209f3d5ede7aaee777bdc779bcfa0b39dc9097327bed2edb7541db57c8d1867c2eda6efc6fcd79a333a79a5b8462b828401672b021d7b42ed6d77cb97563b59cc7cc43c8b107e97f9fe1b4eded5ad5ddb5de629aaa14205ca4ea6ecc626463801de458433ea73f2bbbcfcf1b7cce79dcfc1239f4206bd7e598ffdb4ba9c3c979ccbac83475403e9ecea7936eeaeb3672a821e18dee28ad2bde08b945cee3694a22da7cfdfaa13e33a24e10d1344d53354d4080cc70e1a323aaaa8f21326d804cd334d5ce34b9223f3621ea6e3cf5ed34857ec30800478e3c48e71832ff1bdfbc8e617540c88107196df51a1f8b34b267ebba83b4de0e3aeaac33c86b393bc8e5ee9dbb8bd55e16610721471de4bc17d267635cfcdcbf4a07e9ef5683973d5cd6798b73905c9f33b57e7fdd385ddf20871c64ac77ddff07637d74d6fb221172c441fe6cb7cfaf9baf3ebf8ef378f3e01839e020ed8ab3e19dac2b85eb43a056418e3748d7adcddb207ddc2b726f380db95ae40bd7a4d429576b398fe1e3400e37c8656b75932f5dd4c55579866eba3f44a6c9c275841c6d9097c1fb1c63af45ebd41fe7c9e460836c7575f3e8b1b24a1b6d1bd1c33c167d9098630db2f1737e6b756bcec5feaa417eabefebfb6c0e7fd99b06b9a83b5ae3a37da1adeea241526e7459fe37fffff93d83e4659fa374da7663f4f56690cdb3f931b33ce7b3d396415a0bab63abebaa707a5b32485ef3dbd5699fa50ed9a221eb9ad3ad6d95f6dbbe750c92b5f77c7dde39fd2dad6290b12fdb7fb4b938b9d21a0669179bcb2984ccd6d6af8241ae3aadc73add3bceeaf50bd2b2ef091757e610ba55bd20ed74d4b2f7ac1bb37e6917a483b6ce7f2dde8e943ee582b45da3ffe2c5fafeb2740b32aec8625cf6368dd629d582b4afed6b5a5f73cbb549b320a38bfe91f2adac9f6b140bd27eeb369f3b579f2da35790fd2d7a5dde627c0b32b5825c6bba8eafddd51cfd45ab20179bb53e66deef61a4930a9299bf76e7699db519e714246d6daec6fe4ed6e6d32805b95e83d456d74ffd7bc628481a1d5b67bd315cb1bd78866cf76c2d7ece277db52314e43f87d7adc77139641c9f2027d308fbbd06676d6b4527488793c6f7decd9fa50f9b20e743f8d8f3e89c65944226483b6765cff432537e0f2e414ef7165f7b87b335e7500992bddeeb7132d88bdb7d49909399478e70fa74bdfa2141be175d656c99df11a4d3a68b3238e9f5690469d7a2ad394bfbc6d56811648c8c3a868d3173ab3a11243386cc9e5617d7a3ed86202fadd0b6a5d3df53674d0832bae560bb752dc3176310a48ddc6bc1bf0f3a770804d996a3cc2ba476adc6dc7f20fdf662d3ef5bee6f6b1fc8fbccd66b117275372ed6037919474bb93a7b7651ca03795f73436bdde78b0d7b07b21973e5c8e2ac1e2bd581846c9b356df3bde5eb9c0319efbd8e3fb275f7d98a0309e1f467b13d7803e993ffd6cbae8dbf9e17e7f1c7cc8faf20870de474c7663fb61665d3a319b2df556be7d7e991d25703f9dec5c9fc60b3fb5cbb349090adfa1de15fe89abd33901e9788a864f0aa959196a22086310010425949150063130030302c1e8d86a3f178a2287af203140004597e6a9a422e124983c1500ca3208a82180662100008208410628cf14a116e00c03ef6a440347b8ef61d6168e8db8d0df74bf5611d510b68ad2dc4e0fd4d8a705a5d0d20b5810f42cc59fd9f4544d406b19c83a5727210ac88d8bc7a22b7f22c74413e376766d43f788a5fac2fdf055a20aaed78093242b7db8e7c7791f20bbdc6d4e1d1c0af715c1647479b78593ce764b6f93fdf909a5f5470cd7fea27029f280eab52b3137df15661e3323b8ff7015830f651a7273da49283635c46bc941e5f330b5c53695aa4c414c740ac11cc8cf434f43e3b88e4e300cbcf1b5855b61443e3b7cf3ae2f58cbe3a857309bbf341814fac97189f5c7dbbd563afe96028de3f4d559c637775ef79a3917c321f061cf708f244ab71818e38d3693729bbadf51eb454afaaa0d78a3f4d96679d2e21ac2a4724c040e4260cf2b64988d8840a4f118c18df8bb57c4b12d0f1378c3da0aaf7845d991ff3d2e20506a60f0aa374a0c8efa7fca2a0a21527897b47f660b144cda256ae37b42d3e55cd014e24343b0245cc00d7683431844a4d024634b43b04256600d928b43186524d014344b43a0635a600ad515aa79145472ba4a62af3940685bac813d562c2a15454487a9b188e64b508086641d025fc6b50cfeb6ff590124f46d0febcbdae95a0e40be251b52f6d3c1b83e9328941be548d995566b1a4bacbc4fb17900195418442a82bab0fe602070a2030b4eed4f5c941dd598cb823f387efd4d4632b82e965e5d48ddeaf1cb73606e2728a1388010a05ff86fe03848fab7cf105a2e4006f4b5c860909ce6cb43b4223b61ad1179b067e396222d21b4b2fb206a21d49117b35622ed207421dbb22a26e4e92315b2af3bd8e0d743812230636e22eb60c9c3ab2a2440bdbb494cb10a390de587a252ed413d3d1fe6ff0381dd8e5b83a72928c8a309d4fe6985bc7bfc47c0397c5f1dbe276fa2f2b5ff4b24dac5c183104e9264bedc585d4cb8a6f1d058ca38db8ce6e276d68cbd03a55b24bd0f5d2245eb95cd7fc4bcf0aad93978332a153c81bf241fd5a11d38da48bbd066e1cb1474aeaa8c08413c8ccb8a5ff1bcd97b5b4daf0a490ab1173b17d4c28bf2cb7e87f9bb272156230d209961ab214a29b2415dbcb2d9a5f38cb4feb8525bd6b510ddf74b7417f656659966b0d9b666a9e068e85db46721620ba2f4a001204182f961cef46f5396b295ef6f0725dcc37df84e951d1da2c706a31db74f290f1fde9e2a18c31dc6c1ca3fd8cd71ea7da9dbbdcddb6d970c5a861734295122e6558f85afbaa0ced3d0e494ddca948262bb01a15bd7ba69d12db681ba49b30cbdb7d19f28eb2710b7b85237b6b0e9d4bde82f1c80913ca03e9e787d9c605cec4ea6c6783853117b6c7ce70855075dd0ab7eca674514177509eea1601f155d06c868f7e9ac0a2bb4a93744b2c62e552a7df82c7c80e9410c6568f1a106f5926ebb53c43f68cca8287dd6264cde7ba3e28ed5506c217ce7c270e662b2b5907a87fe8cbf965efb3b7b4b5c7729ea531371476482df40841102bfaf61c052b0f0f36752491b2b48b4d352190a2dbc7847ac805d697dac9d4db56be954d37ef10cef6614f290e60e834e594ac79483a807ecc9167e8b4e7fc17e64d6a7197a7ffb60324d2c0f265701d05829a8c5336af89c889c2e384a5052572bc0366cc4b3f92f636866a4a0ba2bb4e41041b08b68d12286dc13911d2ed884c9befd5c8c24c76df134c28b0aefdbe99986f8071a010630bccc416981aba14c7171b16bdf4baa4b93303585488bca03c33f1fe37cec4ed5e7db1cd7835346c12ffd18a84c2146237de06cdcdc199f64778ebcd2534020bf1c675f868d73e0457b31e2ec063f3fb0a85487dd6f5fb2fd7689e767eed5744420be03cd8cc05d25fc961271803032f9c728593fcde6332a54317018b5a471ad5e0677b35288e62d90ee373d126c2e93a29f3d340ac41f68f323ae6e2f80e81b27bcb68aada9e470c4716f437ef848369151d5cf6d460e9a38c27532573379c0dfc3517c428f52d4c94ae18c3bc42254650002d2c6493ba240c163a89265f3d0fe4f44eb282f3933c701949a201f1c217b46b28d8f5f9340f6559debd6f3a3d304a6926664c1c7740d4ebe62c7e155015dcba450bd716f65abdc3fadd02458bd856f5b550c362b9c58c56695bf06b51864573ab2e5ad8b6b8d7e28755e416315ae8b650d7ea1a16d32d68b4e06db55c8b362c9c5bd868f5b6c55f0b342ca25b55475d0368f1440ef9b59d3bde22f31d0369abd85d6897557dec455c4cc6a0f8559e314a7dd11cc36957b5cb6c70c7015b75b281a61ea2d4062f8d92666d82865b3a2cbf715deb6b0cd46144d7a1ffad2adf582b639a0c6ab5f23da3b046c3335cbed52e8d6b32de6aa03d6be437b4d3509f63115927af415d07ff1a85606d26c3d91b16695c36eb171bc86dc4df0d3dbdaa93b17e8d9977d0a5959b8c626fd8908db0ce78dfdc349ff6e9ba2abdbc22ab74781919c3ce111c1ef12dfe652bec7b42cb849dc1fa7340d3d0f77f6d6337f7df82cc9804a31b7468715d4016c709787d4f16e4065c7fdb19eaa279bfa83073765a6739bf1351e54f40e22a2ed8f7640d0d477fa262f489c1ae543fa3dad1213ec7a51a841cd666717e315c756d879077f10f392723212f29cee423df9a0c0bc3faca117b65bf562bac05247f0d95d89e1da5722ffc705194fa79afadfc08b0004faca5e3497d63ae05195f38e2262756700962671bde531c050685e24b445c7a0a995f26d17990d010f188d9b926e1d70e778b0f1e1411ccbe087cbf73c6a8274169ba76a8ed86ea20f28f3d7f27e94f2ec26f5cc5086c13f48d54e9f2bb5f0e7aac40cdc85e5c5522d0d07c8f135a0d67d9ef80b87cb7c8ef882c1dfd379e4b1ca17ff286936d98fb4fcbfd43a428c3b888510f14cef3f8a1228446e62f3ebfbf801a18e91203712601f84ebdd7b4c8d53ee143988c3ba2e7cf07f0de2e122141d06a40c9bdaea3c5d667edada6624e0edd34b520922ba36ff7db796b15cd379c03b7eb0cb5923ea410a9d47b0e2f223fa4fbd6e450354e7f2504f4df5cf4e1ac89b8eb197ca51d44e6c78fe0d066e627ec8ba4549b6f0a72cd04ebbfe59cf1eebb1e294fc75bedce8f02c3c5ce6769e661f1af1366453ffaea09e3e2c3dfb8dcfbb9def19990f05124a4d3bd87cfa9959ca9249122ee17e94c077ba424750a2a93e1fbaeada94959aab5b77616f436a9c6f788db4ad2b58c1a6d0e684530461ea6ec69e43b661f939b7b3cb02792844409aee219971f726fc7e7d87c8991a18a7adac404bb843238f551c28e41c55f69e772ac4eb54eb212708e75e70f176c0addba40d31567ed46f177816bc26d2282a95b7ef80148e8d3b689cc47ce52f679a1435fca2503b85ef17607876b7f92923f06f74b9908c0cc0730b031422c631b3e7a26ad511bbebfe0a908d334737b839333df9933a4b779edcf934dc68fd7432a623579ebe5cd3188f5d1aab6bf1ce093dd198020139c92dba6a4850e0596c1f317978aa487884803257c71fb8e8bbfcb2566fc88572d71082992bff27a380da0e51382d7f438f4070dd56fa239e89f7e4888d5c9ed7685e2290dcdf23aa6a8c02fde2cd94903d347eb7033a77246c998f064b19f922b17855903e69d553d04a0f6713a78de139d6d1ceb4694ce727a5c27ea06a3249a2e2a559a6da78357142b20e0089356cc31a9083ae55380fa68403147bd78ece1123224cc9f5dbfa4b07e09f8bd21a114249896b4df49dae845a4cb3cbecef597936000d8be25cd19e5b88bef4a557c398606e21965771450f4a5aa10597598a6fd4bf570190c308bc353d738c6f7891c4f12ca7b93a81fbc00505211291fffb4fef73b01f66eaac5a1bd1756c0818ea8abdee109d333e504cfa007d240142d0039dc1dfde81437d3e7add96ce88716644aaa3e275acd46d28fd9dc73f345f6b3f66ab40446a8c05e06ddd0845d07bc27f6b7cad87d00408eae632c5022bc42de5f160def1dc433bb5fe55d7b31e80aaa249219f58926c5970b2ab480bb6f8faf43ca4d833d97708dd997e0897c4ffe2efcb8f305b23c2015a9f70502c42bc0e5242403c3c90272dba7f8fd2538604a5e6221148eba4566f9af324ef844bee428366f32b279beabe6d0ab7e9c63c7dfc2e59e9281e8305eb71f0391a8aab77a1fb73db179e58d100ad2b09be65dddae58f344dca000f71200e27b63e0e7f9563481aa3dd2143e80d118a5aca32c02782db66e6439c9cd38c4fba064de9bc0de147522bc701f2e00f04212ef34ed702e017b623e53f9e48fd659da91e073b3ae75d2861cb3b41a77770d3627fb83aa75a2e88907482fd8586f69c8acce86d35a3b515a06c59c3e1e16c5944bf4e1718d6261d46e2fec908b569dbee34e195b6d751e188d3c60822849889cde55ad4c92d74111e0ac2b65a50683789c797e0d99f3b8b9398b744d2cc17c366868104f1b9f9db742325431149ff2546b7a51514829021be68331d8dd47b31d3799476ea3020419016cdb2c37e6a0a96dd19bc7e99a554f2a2ca1227f5db47b7e749526c9d65fee40e3fa2d6c0a6311e014c430a0f3220de787861ea4478eae17993b2ed31ec8fdd1ca7884d399f2e31fc8c9fe12c6c38890fd6b190bfa1341e63dd6f167abe9986a0853e59c434b30c1582a5385524445e2d7beb7176add1b8ff3d1a26b790c03697bc14646b4429f71eb20ae4db9a8e6b2d5d05e33fdb4e71caa9d35f692746242f49b6ccf5d44df5fd1011df591a66e3b9ce474156ac66113d8332499af1a49a1bea188fed2952c70de93d1b7779edbcb4c5e51b5c3816a728bf0308616e637cef76fa6d26ce824c5930dcb0dc1782df32613e8c29dd89461967585c0073f204507682b1cfee09e7cd246e0259b780afbf3fb8e297b2df2898245b5ff37a816a148cb1c185a76798c4209ea1a6cb3bb71fedf267553e622a49767e724aa594ffe57652577ca2036b1429cc9e7a528185d4302b9dd17fb3ef69c66a59620a9ead454d36ba99a88a8b94b1ed22a5677ae3fba95d37a179571f3d4ff693c1de9a1a36bba217ac15f026aca5ec0e28188eaf2cc243f89bb9591c44da6b52e9d773d17112fd1eb4b9df655206a6b87a074a0c55fdf375e319590e62e4969c93b0e254a792ee253a25c9dcff4d506ed53961066aaa304f2b18d2b4f965137a6f668f9e2914cb8b78f8590d852023ef7afb80f030d5659ea1613b2dbecb41277da0def3deba0051b1f5e71c93259b7dedb64d844c61cedd5a8c377739bcf408afc50546cab65551eb3d8615e6f1a500fa5bad569a772507b12a557abbfef016b4e869298811cee56683b7be466088f2050cfbed4cd922dc70c3753a04dc841acbf06d11da42057d57e45f57fc304edf0d22a84a55d982864e8c754e09c40aa1fc9e134d83b965702b8a48bd9075ee7108fe36a68d18034e3f5bf1997d1bf273880807d32fcd6487bac28315d286ed401814f921de50198bc57604ef4674175d442492f921d0630d261ab364cb8057aaae69a6b334aa85d99754146b59264b6cf27be1b87cf894fa7fec72f3d4be3dba0344647c0dcd4fad9a0dae4e20a12947f02c2f33c9ee5110e8a83a04871538980d9dca4b797ecdc32a735a53528123741455be5d05e27968fdfdd2cb8f81e75d2d902be426a9ce9e718a14bf41134e6e93b4e3e0ae32dd9e1bd8cc355dc6c58095a4e90d8b3169fb0ca5cf2c76dd4b0cc5bc19b54665370d63e51191cf0c7863d68ebbc1f22335fbd4247b004a43ff3e5e398e32b2b5b00fe91668af55a94639d340bb836564cc5503e18b7423fbeb9204554b9b41987bbcd82afff1362d666b76baaa3beebd58451579bfe256c66c5291132383fe50a489c041394b6fa2501b98b8d9ad5cfdc79a3a7172817c0be07f91154af6125638cdfa772e5390a4014952440686d30e572d1242c68d4fa8e1e4c381e1c461badaeb023523944d8d49a3599240faa8fa8462137b89c17a6117f2b3a9114421b9a1df747148b22681bbe9617c0a6647584499be813f8474cb31fbcdca8572c269770c1fb721ed75c3be1d0bf36bccc99d533b007ba7f80ea2035f5c5587f28bc08da9185a7e80d62ae65e90440ea2df604b2fd2b747feb45eee25eeedff5ff7228f4823e108e7506d4b0b8a864065686a2fda4f6b056480ad750c41e436abef1444eb1201061109633e14a99f081d0df7ae3ed84a69f8ff8095191e9f35e7a936588e3bb6e518b1c8dd5520ad87c6662381c920a44b1368709cc922e0763574ad0f8a5e106b4ddf2cf90331013318ce0698922771336c3e778b6f92f8298132ed5519b82bc9354544ccc3d8413997b4e641973c296e87ace7f9d26cd58a13461fe902626f4972106d7c1d4b87e6d33ef76f8a840572bd0762a0273f4beb07e74e48e481c7d61f3c6c54e758dab93d8525966583625153c95e472d537b64b9a4f532a830b43043700aaa39c8a7f6e54bb1f3185200f12e9e24e31a827493a4bd3e44849844d0a617b77304829c986729ec4b6c0b0fd58e2703e6fe4d990328d6c30f0ca073a0c8da671939601005ce50221ba2c4a5375e525649a12d86d8d6b67dd4dae83d82f2d4e519410a4b7285480feb5919d995fe3bd95752841aad49190b4d809316bc0b658fc75b9979931c9eae19279e5eb6fdfca417fb9a9f6ea5efe4ef1a370e67c68f2e98a3695be1d099f8731f5aa5f5a14b534368a4c2b4c7b5b6b542709b4becfcafbb8e73e6ce0f7e61edaeed2dd28736ebedf03e8132c3cb8f3c917e0f95cb08c28b3c93fa4e1a468a4e967e8058ed173fff9bc1135503c50e7f6aa0b6a80cf1941a4bb1216db06d8a5d9387c8451f889420a5b9d78485512e496d262e2c170c11a5fb88abfe294daae3615c6234a3b443ce6b7ccf98abe848e7cde138095329f9bf2f591a577b1954dd07d5a278048dc3eb1a1ede406bb26b7b8def94b67fa1e91a49291c11225936b163cb38a1b24b1b2504ae35ed4afd2010d96493f0a2e8c791a596fad4dba977ade6be75e6b32d8592363b0936cd8f9e47c9e3a6addcfa17fce0df7b885d27a64dfd6d8b2ab779470afb259403799c9e50a4e2024d09b92b43ce18776002c5799925932a561ea3512179400436170d10ef6866a5f2cc22b97c81cb495ee77379ab21e4c2c4b5d150fe7c5327dd6bb1ddb9275bd95cbfbd760462a798f00a2787c4366d2942fa8c2a779441dfa3a40387e1b5831698a9b4148380d157dc25f9186455146cd767dbbf4b858576b03dae235e5e9bd54039e34f55a7e26c60b1ce8a51b4de9c0d82fc766a2d032de07011ea0732a90431bac4dd5abed3e11979e3ec6614d12041bdfbcbe16e01f370e9e2c3887385e0ea7f50cbc3cf6e4f2dad01c243cb7bc6267e100b6c01ab62b2f0f0367287fee581ccde8adf52ef81fa2a5eadebbdbc21888550bbbf25b110b3e8f17720570f2421e5ccb58b3c687f050a20eb9f853c9d23bc9e2a2c6a79994de238040d1dc7a0f266158d08a800eacef02346932bc301f712801f068d24a095192310014fb0d1723eff46c802169607eb100908fc48247546758569e9f109b1ef79c5c4a72cce6c4e8c841a88e3b278426c307c76872285f3a058df5271786c874c2afb1b2f8b1fc73bf7d72d1b341c6585f8f9fade1b6e5d6bdf442ae84a7de9d14c82a49bcaa16aa217dd2a1b625812c352cc0ad60a958382702c2f6903eba36872d22582cffec8d4885a1f7ea2a8c21083effbad3cf83d14b75e746c67a69c74fbe61d8c6be7e5455a24f92c671b98117011c1ac04dd9afb756cf440606a1ac349509f3bdc171f51fd526b06fa21d41a74176fc92029899cbdd311876cb419644facd1d5765fe24e06926bf1c2a3c5549383c287d49bb9340eafd09642634eef18504e04ddf0ccf62b06bfc0455f1c52e2978cbc105507d43c5d391fd6e60e243005886e9082a488c80f09564067f9329d546ce0b47435484e53bfb8a3010bdd463c8d4901bee7d2d21222f618e5714580eacbffe81fbef2739c0713a880e8ba7111650da432a158a6ce78f77644c1ecba2cf34915f50ce62d35dbc9103e0aede0442700e43935d1732f89e9816ddf920a10589d0502ff690d3e25663d2e84f49ed758909865c01fc44c568d0b8bba6e1f9bf59e56a146f1dcdf4e4d458e841d5836a6a57c2ae2e04f2f195093c09372dadf73ec1ef940daa4603f770d4ac65338e0f90cd03d758184879c4d17767de5108b0d4f22db99048f10f46f0d321284058a158a716c077093ca5215b380644d1d922e1145a7dddf716015dfd7499a381be17f4ab2ab9fae43d5db30973aaafcc5223883940d0d3b0a7833903c90904293c4b7b88c7e6a8fd734f5428f0a29c4648c418a6e0357f2ee9c883daa3135e28eca0a75e06b18b51f8081c452114027f1b64006c59047e96c200505405f048f82d108130e593f0190a0241d0178123e0b64200c7a9f2fb40a87ccf1755ebcbb25c509d595394aaae116e3932d53b538c88877f023f9863bf09f61898f179bc670cc5efec43c1f319c1ec5d8d737aac1a2286c1787242140145936f5397db79dc31f8626dfedff3101993725363c3246bbb538d2c454bd0a25cdb69cffb77f6130391dc204e6d7f6fd2bd7aaf37f649bcb48f6ebfb5533becf4bef2e5e4530a49a088f88fb1581d153fb0200621229d9f3b6f87b6d007c589f3e4b8241b5549fdeca443fbf6fdb5f3ca34f45abf8368f47e269ce28e1091d392f91a755e647abcedaf931fc270206837028b605727b0649f35f92ff79edfef7f31971628892ded4412ffe68702577d8c0a008cca2b21dbbdf19ab264a423fe5105c80880bfefb1b04635a45ceed05040a342edb74ab7298c817ec3a69fce4c638ef407b43a4c022839aa1542ef34c57aaa6f86ed755e9199adc08ec0cca900b9f9055148b23d931eb70a9594e72389e1e639be4641befb49b6283b53a6fa2b48a27bbc90dce3cb532319a6fbfbb9c132e1ed0e52ebd1d627472098d895c0fa10cebf8d7f3a3911e0e5def01884ceed6d2bd854ab07808e83942d3b37b0feeaef0f36f0a87abde0620696634cbc1466917b0d2ed67e70bfe1e5e0512cfcb27c80e8d7537cda2a9d93649fa61e2fc705df0b6ad3f520bd8faa12140f6b52398b8b0c503f11a6eda3977e60cbcbb8fa55b389668d5f6e258d8123608a591d9cd52dc24a7f7f8debf662dfe958de04526bd4a9c8c37b8c44b1b7ca7bbfff6357afdf6edf047f13988dbc4cb4641bb9003658e1c763c8fd206b96821d1281d2fee0be074c3b4b56a48850e09a8eb9c165631d805d85f6d238b847a676428dc9b04b3b742021d7dd890972be0a32abbc913558a4f417fbfcfb396dd189dde5623fecf9af4dda686518cbd2db55081fe335ad8081db398c83421cdcf230ffd96721e7d8d921092d617cac5a8bf4dc3380c0d83ae6f739318fe3936f4f021b45bf1a112c9167a48a04079b8422ab4e70bece405eed0cc0626fc4bb1e5a1cfedd31c74abfc41b64ec5b6a9419a002fd88959e72a605ed59206ae936b79ec0a9743f981e128e05f709a83521d048c3fc2fd7f9607042476c06ef5fabc2332c583f68de3c4bd884da90996ff53012dbd7e66ed4ae4ca24c7e5461b4221fc0e77752678ee914ec852658452bac7c7320bcd5c11f32b09bdcfa49f714cacb9a2076eaed96c46b1b95806c65e154516a08832d769fea12ed0504340d1f8799d77757b00f3a568fc137fd06346bde0d06ae1f50856b6c0d79c1ae930ae85c9b9ce4d3d83f6bed66187a6a6703346b27bfd6bbcb0daa3801ea1cec5af7b85a76c7ba94a3752ff3d6083e5f4ced826068453092c869d74847ed76ff96f6b8258b2f752d1041431af1d6847f51ad9911ced22d2c5ba38aa970f63c7bc28aa647caacf1c0db3a612a35d5fa9b74efc917b9cd8d727ecda576f0fcd0f92fe45e0be1fbcdeebf68f460d09511647b6448a2a791fe7dd2a392defcb3d7e461f68b0b42ad999d645549e2411ffba6f120fbac7af9c24e72d818e96a8884a75b72eff36d0e081ae6b030de0c3037d1fa22e8a99b29616cc7924b0319346d756f3ce9eb78f62d9fb0a6319845546cff6f395d16e19e0f370241eabb1cc453170fdeafbe019f0130e28814890900510e15cc9d3bf124b28bd4eb0018a8aad49acc320cf08d58f7d32f486ca56ffaa2c83b4b394cd1d5d9e39cb303ea2de75b2a3f5c7e3261a345f2a3919d2ebb0e1a873e9a76d568bcf8eee7649b5973acf71bfea9e1be04c6e36f387bdbcfb65e5efe2d1a73c70e79c9569724cc3fcbd7ced46ca039b2140a46307f86a172b558eac56da7922d72378db41c14ba8b0d02f70c436c623a01828d724342d000c5d6dc9e70f40013035e4d1c9a5559ef39bea42c5cdc001c6e735390bb9370ec05e99fd364b6b5068be035e66edbaa08b38db961fa35dbd2ab754f1f8dae74c8d07cd36520447eb6d52e78981a22dde389761af78e72d7bfa7ede68cc5cd4f175b5b6817119e9db4c71f2d4298bcd5223f37d85d72e5dedd8466ce5c0679e85ec930bc8da509be3654062107f0dbd5789fed93a1e2ff2398ad48317786135b7b10d3b8081bf62b3bf4e26f338bc7a38b8727e083d4ab3839bf8427135efd0d82895bbc9f9e5397b117beabcbdd403fc0c9f13006e2a699819352b73a9627ece9df07df6b4e93e8f8a3bb9ed5baff4915f9987dacf7a409549f77ba0f8e58b5354921994b0bf061a32ed41e3dfcf4d534caac4356eccae07c98a338af9245ae7e1addd5dd6c0c534431875f09cb334c344966eb19066d6b150b8198f40a6d66afe827fcf8cef3f3c3b2f3a31c992e11fc1fab3f4d802e4071ff7f1dda64cf41867347a4d25d98fd5557a34bfd07b77efd1796d92ffbf28bcdfbd3b8ebb38ae393879a8c44d60b8de1095c7462fdf67077bacc80117e78ad2c4cc86081f24fcfd1238d23d1d018e194e50f287ed4bcbc51aa836cff51729b9a019fba6ebdf979dfb7656ac33a5ebf12f9524af9d68ee00f30a1500ab688edcf2e495afaf7504a8e340e5bd8f9de33878933691f04c72feced32bbe92e301d7550b2217708cffbbe632094beb5a9bf23cfdbf5aff71d9d8556ecfefbd326ded2d331e1ad67f25f966e604c89445dd307500817c9c5f9d5fab86d44fa7ed2737c43d3782e759da40ad9e8418cbcfe50cf36ce4de3e479a4ac5e23c690b73b69f0d27c5983ba79f37d4d97ac3dcca5ed0dfcf65f11b6a7862decce17ed67689dda38a4df71563a9329991b1db0887b720a30f28a74ece4e1a96ccac07988f462854e67f9380c242ef09a8efe95a6be4c02706f8a767765b67a7bad4e8bb479482e163264db6521dbaf70ed6bff9820e3c1f850a06e9b37b2eb3ef95956ca3677c0c84ff827c61cd492197eb3d2e0f8910ffc73639e9fcc2978aacdbf453d307f5788445cd48e339a0bcd69e4693bbb078598b3370fc9a99ebcf8217dcbaf1e6df993c58d2450c4747bc637db8d7d6fda1a3beccc7b28ebc28e5638da8f94a997f6aae02aee6953dac94fe83a89800394ca57f00c68c63dadfc0476428cd7ae79ae796f362a21dacbeafe232d827ea9b47b8d88cb18f9ce661148c2dcb03e7aa80730bbf4b12c9b38e77db696593c1b9916ef633bd1bf164a9e70353d5d73bf6d4ba405b24700917aaa4076f11d10e9ef21268077620b0c9fd4075feb4d4c298bd85913b18d854e909371b241a2b4cb7b6bade9fb7fbc8dcb67f631955134197d30f13b7a8fae12b7307426f55ffe6c477d4bf90aa352da52402608ad4e91f14d414b0fda2cb9567643c8f6994a6a0d1704e7bbb38e9007cb4c52748e7b575960bd572b1cd338a900d8dc2f4b95a2029c99579767e666e17b98f2ae3e438f99c46a420404039b0d0cc2f151fd5359a1ce6290169a330b9f5c73b7fc705ec9831fe2b949869b74ec5e83adc3101a7a6886a72fe89a748eee48d4f270dd00f1e982fbe3da37c00062b8bccfef710dc6a81764d66f5d05906166d02da05b041e7fd4e890bd5fb63d717f5e03f6f8271f8e32fa46e753c073c878a0fc3d2041f4b1233e3f077e6e22b99265becd40641939794df96b46c6c78810fc45949b6054245f53ca2f71e2dc14f97b32007710852f07930f0b2cd3403c85cfb83e58e073719f05728cedd3bb2b3d194f96d3f0bdaac5fc67f3d782be3c84c7fba177c6ca61f307addeaf3931510fc45d31b9504ecb6baa7c2dcfe637eebd6d6203863f3fe95d91a5010dae7950ff0b6c14675dd77f8e2bd9b37f727af36be013e00dfcec11044c80db44288f783507e69878ce26e0a9c6e29ad5c8e0a181ee9ed023824f12035680596bb80758461dd835597f05605ef5756d2edfb8f1ede05351ffbc2752e1f3b016ad321a362abcd28e251fcbb663d246d1402f1e10990faf604733ddf1ecae3a66649f9dd3a1b9ffbd132d4bb1af11ccc174106ba9df3dff558c03489ec2446776e2e52190492e3677fbc865a4dec930d5a14d185ab7bc0284581a4b32fae82e1b384cce3317d7e8409fcc7201be49c10488e2288694d029070641f57a0f8142b559a5622366c4f91f8f41f315b905711d18a3fb5b310107d5d000dcd57a641e325a7aaa283301becbaee001fd693f2626aed0ddd517d39048fc4abb656841ed2e669be012e160271bb44479cd8dfc83ab08427e845060c849ad94db01bd5156a8de42c76f236cf1920e56b8f7798c61d1fef9a4588147b4dad0d3ddff7afc5bb02f4157ca808cfff53b0dd86a760db56cac048ee18e3b6d0887aec975dcf9c1aed39ba265ed82ae74101403e46784fc96f9a7af9444a96897f7a73e2d8718abfd497ec01215e841d0055022443f0d9ad14a05e097e12380a508e89c760496aa059c03ef8104419aa3f0292f801b06e1fe6c81832d45054316c108901d5428463b35885f8a87009726a1b3da1078ea367016ac071a0c6b8ec45154b369f48538087e65089ea88a4147eed153813ae0dca8722812429f1ac56f4503e04bf3d041650468761b3a8b56ab3bec12c0960d73d3631b9cb6c664d30b1b886b0d58535a0d22d42a2890e4319a7e519017c1c320f662000729470184aac04f835c000b8bd09f0518a0141500be123e0562210c7c927e0640a012f420f00ab85408c571e0097a9900c0cba003402be2d02329c68025ea6107c2780a84746a541044e419b9839fe63a538285e0e1ce0686965d0606c5e0fa05f9317632c0ec2a7f75871c9b7ff2569e640323df9a8af16a107e6382da6bfc5e59533c6f14cf03a726b0ff07358e2aa814a3fc686a78aef0fcaed790115fa9eb3264d024e82abd80d0f7a74acc55c46a8cdb3c593cf95fd08a08b6a659bf02883543418f71d2607bae5fed5207952f5efb13ee73cf597cb8c58306bb16d4c7f59d25c23ced72a6bd04b0ed87e2534233e2aaacdb04e9c0c77ff20235d952b1d9e69c8c7abbcad49ee595ead1070fbc4a5938bc1bb1b4ed431185dcd7b92dfb8d04d4fd0ebfc0aff2f17faee4309abdd8b1e6f2a995208112a5ba83d4fda2cd1491bc9e199bdca4223522bb30dbe198844c06cac52414a4b7f46c8bb4e74c9d4fc90483b53c348ffcf9ed89ff800ac23b2957a711031638dd9b21751184fb3b7c3924499647a200cf88888c0ecda7d14584a7eb5dbc02d64bcfc80eaa3d826c087a67e6c4885939f74f23cd37808172a3ae9b79134c040da756d6da5372617d339c8b5fcece04e71cd32cf605d7cb84fd98a3f5e10c6c844207c88f2ed27e838d0d243af92d9e7aae63909863d5493ce0e0ef45560a0eb9ae0243cbc74da16d171fdd1bee46a23f07c300cb726c60dfc23e271b623f185f69049fcd4921e50defe37c4ca777bccc8174fe80797015468743fa65c57f7937ed54214694d69028287e7c7552e976a23bd5c7c46f7f52d1b3473333e136048abd60f26d47fb65d7ed16814a7eeec98e44274b5229637ab96295fe0a579da178f26631d94cb012e0e1fa37facc309a51be243292a89d42412680d2329ec4b901747be18fbbb520f9a4f6e6c181881ddc5bd3f773658c9a160475b9b520a8cc5fc6c470c55e364bfe6263a07d44c8a7ed0a045456992116ba411c0caca952377d9b58b27d6758c597cc89ee5835f0848af387dbc8de13765e2dadce1fc03fec394a6d5b747e8040e08010ecb31ca4db31c7d985e7d054823549a65cee90d3d9afd64ff61b97eb7c079fc453a55c4d97379bc2bea3b92c6496a265b012a3d3f35ab0fb09ba21d3422896065612374eaa805ccc417c6c2f8673b9c33c8b5717b042d9e0db14b067ca06c4ad2f42c00ca7ee9faf87c7b6ec446f8243a85f218f4fbf77410c8d741d3b0463046684fb8e1af3991fa593d1693ac60d1ad5ab4e6b0982a20abb6796f9acd62ddc323d76d24f03bd37cec28fbda6430494361afd74eb3dac0c9bb227509b51b0cd5e4a4303844c641e091976e1bdf707114ecfcf919b0688038a73a1cfa39c050a4a4fe8c1403fefde5d778714353f6dc412f727c54a2c4a9180944588883af17b55f6644e906f7c5de55da56464604c647175a2e28a290ce1b284090410b8f990650c1da1771adf39d831f2cede93121b745fcb95b8a20d428103ff73d7578cd646f65c869b86b44f0b2be734b387fcb464ba2c3fc7b59f8cb0eff2c6e92e05f6cf5dcb173df2c5084ee3ca5606abf07222b057178d722d3fbe2e4f20e277b6f9fb3b4de253680b48adb05a8bde23242d1270b66989e17f365d2d3cbf7c22a1b11b52d023f1ea4119fb2aeefebe5bf7b7d949e8abd0e57048dee8979fa8f9a923689f5399e2691e91dfda84737a3957358218f174566e5a07857b28656c36f624bf23d917ecdb60b68fa859d0b0fcaf511b0deb591e137131542ccb16436dbbf1a3aacd7008e7237e8d58f9d026932331668169d0ddf7ab3a9c8d73c1fd305e7513bc7f12f2182f9b58bfdc36a56c6a6679f3ad8875b493b2c5bec3aa380788a6d35c4ce754139e74f2627efcba8b838ac86085f3ef65b12df9145656a71bef88ecca6ee97a02b79e2691e0e9036be9d6a3b10441186b426bd7338ce79e806733087a7b8f37e22bfb3247ba09399f6d696c85bea41b139e723c22f918fab56ac96075961f4b787ac1d0a70bee3736d882b95246ed29075db870b758b8e07e7e87e6c4852e3d9b45ead8383c59a08ac2851b403557dbc3b2237556e211e8f50affd7bd30c6203da89b9f022e4b267c037bbd31ca665aed9eb1ac7dc62769928695cf1556b17d16ed57ecf342bd483fff7f4e80db65973fda918844498c6fd469154941a01bb734d950e6b590129eb34626b0e3b2f6079ab3c41d6ce99f330d782e76499e23e6fdc18535eb0889759789ddd6b3a7af0a74a96a5fb37bd9a3c6c040ab2441f66a4d0ed1f14d1dedfc59af3f68d8fc3c98596a859033d7bd3c167e4313fb2d12dfbcc7067cd2308f02e73bbed98e412059b129f5a73fc6f8785c1708654789d09d28b46c747021d65f592833b9a7768bf3e2df0a397128f9f090b3011f5b5eedf548c04acca020192319d4c3f77d95bfd5f82ef1b2f96b37471c2fa0dc4a5a7c1cfa211e378e223b495d0f9cab91d85a2614bd1d6614dee8a37d496ab68538f788d73d28c9cc3cb1eed4a5b76b0f335c9fca8e68f37ea8d85783e7a935248f05bea224f1522797347a3ce77445a3434d5dde8e119f4fda400cbb37d91e6fd6bdbb6cbd441afaa21c1149b5fd04fedc83bcd6caf7b9421462761a29187c126ec80c68bf04de83339e9ab521fa28750d5bd8add669ba83d2fdec9a1e0cd0823f263e7fa25a3ae301731c4aa98bdea0d95bd4eae0e0630b73f315007b71ef4ef344d7ad62ff171abaaef55dfc82abf1d53f136cb859108cfab933036d3372c1e5b90d022737efe30c27f2e1c833fa655ee2ad5fa0cbfcf895e60dab807e3fcd3861b0467e3fb6f007658af778aa47a66a5b18ef77897989756c0c99461874aea86bce804951f47f86cc8e33da5f59f5565806f18066aff4ceeeccadb52e530849838132516863e7c44c6138f4f428cefd85952202805b7df9cff2fc7a9d502ffa304763b8ff578efc5ab580dc98b4b99fe5f090ec1c58983e340075253120916f10e6e496142b1f4d6627434094f714a40fcf3f8524de0ad21584b982bc3d74b3982e3c0647d59b471906934a7820f8e65a48214948b4b3f818b5af0b451b610cfac76ca0c2d301aa7eb92000a894793a057eb8020883764718075e0e2761cb025eb0b91f5387eb73c44c800038c182604cc096949dd392206804592ece1bf5ce6f195d83aeff758142cb7a8d19bccc43b4366ab5834638b1db7c2ba783db2722bc811b1ca4c61d0b14deb70fc48d8ab896aa50a18581f37c38dd83254d6510694daa145052c84b78a53020b2117168deaf9663b72d18e6adc5306662f1005a338e0a04020598bdf848894e1687f356fad082532d63e4fda3f5c796c836a1f2441b498767a52cae94b92207349714b4a7d3693e8b6f0bf7fab665db7ddb0fdab158c4141a7781c8a4c672f57838789925b812de7aee0f053ca88232ad582e98af92bac36f3943110cf07f96c288d3df98d8c515a29777ecc10c7aa2b976b2490df83365a5ddbf1994991e9ce856958325024411c9f7f78d02b50bfd9e73038af47bb1480d10c2729cea20cf4df1979f3535f3ba04f0b63c352d62230ee4e14c7032078026815295d3f8014b0bd366f2bbf5f91101fb2388f7217b072e05b41f270739d5bef78bb8a304265a9f32b153feb9dbf16be6046a15c917445ee7eb310b12b2871e156e0fc5d0c9c26b6e571caf9618b819e42c33a82b583fbb44c150ff333737b1439479f12b51352983688060b7c29cc260962432318a955ef92b2e811b2e89f6e75f20e1708b2022414f8aa5995ea3a15b13c25c6d4fe327aa2654b2798670ea8752c07fb5a47c6592fc2bf5a9a52487afcf7a2051d3bd53ff175527a0015553335aca6c03c55c177d9f94c88dbcfd3efee47bee84d36bb7c282354c7c0f84716084b9e754c3ebee02f4d027df4b08131311d05504f5c426d961a24e72e3b8bc0d717f6c3dd9a3991bfa53f4f2c448a18701cef19701eef285d252a85edbdb9b502b196ea77c5a95567de216097a34ceae75aef3c1360a84a8244381cdf0edfa73b0fc76958cbc2394c54c11417bf479dd86577dd4a8cf4bb52848bb9997263cca7bc9dd599ccee7d0aec1adfad55aae38cd38c5eb40dec8ae2518f48851129d3d7e38bd9d767b43158c59e3bdceec2fb327857ca6780227ff3937d393272989a76592999db2ac03af9261a0ae45b6627872a0e528b6ce6921c0e974678d446887821ae38a8798bcba3706348f6f0ab780b6c77f50f2dfb0ffdd2874a30b7a3ea6cfe38b75105bb34a7fbf39b482e9fb1eeeb700bd1a9316f6acdcd3ebaf6349460924e130856920974aa020d9c6295f11a6b1ed8dedfade8653233aebe4e2c0399aeef49169b6da154cc2471694a613ef60bf7cfbfd636dd1da0b5bb05b259715543710af6126a5242a6f7d4d7e324887a08578eaea5c8938cab7c5e3e4317122e7d08aade36614c01a1f5d36a54ba51abb90a433add9247384874e7d2e001d86c6600b85b2343b0f690e310b825873f91141921d9ca266afe4c63a244023150a57accce96947b3bcd3ac39125d4ee472e75bc831becc3c7c651aba627976598f72bb75834ab83ec878012c8355abe7ad876a2ef96c630fad84c96f710c1ae2f59613d3c52d38f054667c0d2a9259ba576ca828c9fd632178973386afb6e845c8a2e1e3194de0af1a16a4b04349c9d154a4ca39a3f8d8c4f138249e41d77179a99da09f9e4a73b64041ac16073472fdfa89d1ce7c15946595f0db3f9972484f290a9a91fdffbc3c114eeea4106dd91b89bb5f5f99d01323385ed83d1b5693733a5140b06d832977036e2d03721c7002425845bdff156c3f519d064e1df2873fe72a8375a50c6d5bf290249fa7a4dea6b840f0a6fd5a8536ab3238eea474bf74ced4771158a8c7ba1f32401cb8481bb0fe5d259a16abffea8f8ff1d15b0542122741c32088b7a705e96178daf28379ee9bc3df3ebf3e624962493f6750cf6e82009636c24f15cfdaa8620dbd945875664ce01688cbf318c2500003e9246495a6cbe91a0e0a41399b4d9d6c26509ace35442075ccf188d29dae494da195ae388e3a6c8bb29a1dba574a1130845468714d97f91b879ee28d2768960740bd49d43c94b0c002e93a52e3d07e0a447b26193ebffe2a10ebe0cd518d0221a2b118b3f6c170b0f185780880d7a2f324ae4e207539dbeb167b6b840281de93191ddc5d9afd9ea50838d8c3c64671047c4fad289d5b887889ab42e50731d16cdc1e630742bb263bffa6a56cd445766b26d1f7640f296a4bbac8404307cca0176f0a51f0d8983a0a7560f38095ae39b4f588d0de5ab01f419454c424064854ca8845cd36464300e277180bc74933ff8b15e0d4d47344e9dac182d686a1b4390bbb68b10ad57394f83cd480c4c50510e3c9038f56bd4d061e82b60681ee5fcf9a1c722a4e39c7c01d7ace184b9f2c38c8bfd5bd99682ffe893650c6c0f83178d0064a1bc2ee449e3ef2e71490b473eb80ec1efb95d5c3ccbf35fc755932528351aa6c50b38c9ae5eb58e8fa009b47be9279b5c3fd1bad68b95960841197d52ae062e0c4c865701f26f59ffb419571fc3c056cc86dc3607e4caf2406fd5154c064118a3482dca517d7dc6f6aca2acbeca999a3e5ad0df9cde74b1e9e728791ac3180d9fbe230c5ce73ebc309d457532e1d519a20b491f3c8282cfe2ca6765117c4c92de8c08ff9fd11abd2e5e1b186dcec0372c8ef3d1542a7cfc6a5344b15a56d13b06fbbcf2a8f9d416c98ddfe04d96a5d9f90d8c8e9e575d51b772302c41b3b16b9bc2ee9f198863f8f5ba4cd7603135dbc961cebfb34b473ed4a367666adf2b07e44ab1fcb10d4217441fbabea1eb428bc7045f6f1ea9e8aff9db94971de26ff960e4226aa964e21b8804d5536cdb05ba46acf8689183624aa0ef0465c2b963d1ee809379cbfd6a98831af3dd9d6629e3de56a084277f132b67c17717f385cda1566f9dd9a1daa4def780d35d5827dc0f6ac2639ab78f7f08a480cf18bef0e69e34ffe825884ea2a015fa5c5ad34d1f623f0822e9a15450cc367dd8078bd75b71002969a06734dbc47bf613a4c744006e8aa37e01eae1070041b5a119fc7e0d822e04660b21a16af8c077c59ec97d98f75350bcdbeaa548c3006da4ef08918ab26f16e1f8bb5bb88638a899514e0009573196ffbf510dd0981f02c61c569aafba7f025602aaaf5cbe2c517cef47a219feb00eb44119ba8b2df1109b655f1eeba3c4e84b80acbb2c7b5df040c303f311758e22928fa2ade189f1eb232d4940ac1361d17645ddee7fd893a1095d866e0d461201c08d3562b32ec556b2bbc2fb01db08c671fd1ff9a64d33d082889a0ad53af4d7ac0f02e01fc703a1baa7145e2e9123f903c5a185fe094233cf3bf18521960b11932b412bde418e556843bab311212ae173b6f0c1e11e2192d86b89ebe484df2f7c56215151f96afee4eef2eb1f225af644dc578821727cb4f28e19046c0a0d1be5c1bfa490fccb8ae8478d2bc424df6d34d6dc9ed8387d41702720df1c382c0d44bc3fd423cd4be54281e88a6da4192870c43c1f2eb7fa711fa4442a66543ac4f81e90483fc3b1bc5351c11557552732ebb7ef0f4022ac4d17ad720b3975029daf394684242fe4a03e94421608fecd0e51a0ecaa5d6e82e08485352503305ac470adc8bc90cae9820008abd270a8368871721f487a6c518603b7a5adf1d1111b2fb34196d35286003d19dd652f979e137d79ac4932d541ab2a0fc05855515bf0a132f6d5b1a3d2a21bdba1e6732c65f9d5304853839942e90184c5993db5c4a4a22a86cd323a89becb26a4a6de39b09ee77b798957db5a105c1212514d3470fe412d64979222d99c49e6114b1b7bbcf2a2531f5cded156292d56923e7e673d475040bdfc54c4b6b95bbeff75c686dc8f57d2cb7d496686e896635a38627e83c8de3abc2787f0b4e801ffbfbcf33628e816baed975bf2c60987ea3c6babc4c723c0f9c8cb91514deee9e6947246f573e4c7d773901e0ef79f91796abd65e0d5e732a3dff06a842fb4d2c9d8b8a7629190936c3fcf779fcf36f1451d55ca24194ce40fb5472cfb10cd51c69dd9a17dbb6ea4e1ed34f668e20ddb50a1142bfe01bba81df274a3855aaac96101f9ca0ddff95549483c6ff9abf6960f94b206c1caca4d548acd3f97588806bbf432f73147ea954bbd07f457292bca089de8040a0e69277e07e69a1cc9af124c1ec0318372cb8045ec7a52953c346eb8728acb1e2117f7c85401f322834281cfb982f24af2431b447f5f27ee579185f6e7c6e34579bb27d13f53b894f9fd9933ed8d1318bb06ccda1221af2236f9ef573e7ad68d6309f988a028ff863c275386c425812a24e18a80b07df91b9a316228a92e2da39a3e9f48213cadf61dc25647a16a2141a996a69d755cc458c321aba0c748f666112400d473d4c11617e70765e82832b0869b98528a33ef8ace312d96f3f4d25be8f2c1c66d07dbebfede4169174be0153cbfd9568eaac4f9ba065095786a87e5004f07fc71c085e2f5740698113dcef8f07738ebfed0dd736530d3931dccadcb8b772f68be37aac959a3ce9dff6180941f5ce55665c13324a037185720764f3737eb0030294b91ce519c05f3467e76f8164cb9dbd287e034b6b012f93816d221ad8f9cd68a03c2e3a8ca14bd40d79bdb1842e52e7cd094c7f329efe79e02981def22f01d1117b0650b0e04a2be79ff942c6bc751309fe40f7b7fbade6585f772c617e3c890c2ec07f980b16027a68b46c926bc8f205613c4f1acd35dc9158a4a6b136f745cda0901ea9624cfec022b8f034c55ce20a3b1a3badaefdd5e2602731221807a2ef05c68dfca3c88caeaeced8f973ea59828fc9b50b997d27caab83936ffac0de02e87b25b9e1133f12a90341c7df3917d21fa7ad18eb89f7b300c75f10fd712e6fb217bf36d3be4d8cab614ea644c026ec29e7f087a1e93e19bfd371fc035c519289a1004ba914541b5ff63d786680f7da09139a6397226c705bc6279239afba6c7f53a6416556abe8680eefddefe3795158054039e9c1095d23da86022bc49b07d2abfd97a94574d6626026768b21148068095d7669e8031e242a81582f8597aaf31325312bc2b8c975020743d0e22c9c47846e3c42d65d4bc26580d1ce392f629568d11d74456aa8609ddb3af0d9f72be147300a636c97b0aff027282e449361fb3c3d5f8f26978d09eaddcfd37327684eedda2970b8bc13608a547a473fefa09a2b242cfe106b75ce3c64e6c34cf1c6ca183c19e4fb92e146f50496a4764c443b8e7b2365b7a912454b50b02015d7244a0f66c5bbaa9a50377524a0b11e4a349f3720c2f4ad2e64a749d66aa9ba0eda7194e4bcd391ebc9977855fe2c9cdf41bc630180861a18f308727dcbd0d39b976d37a1dfdf904f77a6a40ed06dcd94738374389027d9018b1943c5b713325dc8b5de53e34db7cf819a55ea2fa52b11b05b2f06f31084fc2a47a1f72d6098df6e66181ceb8d40135120f055587a63e793dc731c3439b83d9ad34d6c234c11b5e368983e17679ed558a5ea7a3ad33d5b9ebe300778ef8b8f578f6e30d7363c82cd9f03e1d780087c4c182d72e0319acec822f2de2a32f24733f57413f6d2e693c7de3ded77e48fed03176d03e7629c68662b9410a68580f98cd4c0ade2e5d113f8d72379e78ac6038525b81ef549b934f85e4714425e6990805ea4f011f7e62088d86b11de93ae990135dfda335ba4d6899d2cecc2c7cd8497f5226b3c59af0264c537de2ee237fdaa594788747be37d35c4755475ddb9647ceb63b2066cd4ffd3500d1c8e023e5a04220b3760b46439330f0f0f0f0f0f0f0f6f4337426a6b9f908494a454aa976679010b644a29c99492d81dbc0b9c99f87466e2d31546ea6e34e301030b400bd30a89305b754ea153cc4f17311a1a68000d2d6854c0c3c3c3c38bbc0c801a6220c214d28388d6a39e7fa625c4388441e5edce5e2284ea63058d011b39ba7880214c3a9430d9298b440b63214c21c78b914df249fe104218b465c813f91f15620cc21871e5d6434b9e902208e3440b19a91e545479a2102310264f59952647c8881a157284188030a5e777f438191b6b016084187f30968e74f988efb9a75363edc3c647c12d4b31fc6076b7083243e465059386161e1e5588d1077357fef6f47137b6f3c1246eb35ebf9237ddefa26b68c06fd898c0923d186de28afa0e1d3d18e5524823aa3a7f3a711ecc5f174b955267a972120f8697a4b4aca5548086062440e3430b1ced12c891000b2851438c3b986ad27c74ad38f91b362002e50a31ec60be0c7df524667bb5af83792dced6c4fa09da6e3a986e5baf64752ef5e139183ce54ccb19a24a29530e26a13e57b8a89e9519d6588b83f14a456cb56ec2292538184ef6d8c9d0918488a637e8337975ebd52f23c70d068ba6bba5847e25f3b4c1782a629b087a7ad5c26c3089f59c82129d3c8851d7b09af89d69d3fbfb5d0dc6d1f62762470e252d4d83316757528ea8f360123418f542e3924e6a44fcc81990e79e7592d8f0dd88194c9fafebc329b7951896c134e23e23f4d998fa6430bd560e39a29ab0a4d9180cf2246987284292490cc69ff9d4ad94264cbe6aac1962848131b7d9ae20536c3430587a3cfe09791771fc4272a23de2880929cfc70bac96e87069d927e98241e9d349674cdc0575e242a272ac3d2f919152bd05decf52e447e9f4c1d58229e72454dae4f24ad5c982c94212972fe88d05632491b3d1174a4551b942fa4b5e9f1a1d4f3c620593aafcdb1dea296787ab7067cb13dbd46a6255a86052e6de267ddd4444740c31a660c48e14d192429784670d0f69267f4761d7125365924b5ff250307b2425df15c2ab3e9e438c2798cebc4dc6e52427182d8f7c87f2fc155d9b9078710fa1cc4c2618c4b6044942924b583ca565c7d2217fca9460b6317defb0d57f214930f68dca496adb87f00e09c6f8ddf3aaba54b61ec1d319b135ce74881ac1b8af27c1be6e2c9f72885104e34a34a14f45869e1e11c1f41971d72dd4ef538660505921e5e715e517662198aeb346eaa80ad2471b0483e855f79c4a6dafac4030999950b9206db573f20786f7efec4e7af744f6d00d317c9068a6965ddd0373b6c41c939397fb82789007af3e53a24f9c24edc024277c56ba206f92b6bbd8a26f241d982aabd675f47091d29203c385e7eb087bed220eec0992b642527cd9788353fc38ba446f820ef2183630ba6e8b6e0fdb298aceb521460d887f49f4d7280f950662d0c02ce6e13cae598ae4a1b121c60c8c5e3aa5a81246eeb8be8618323069cefde76f856889c5ba9f53d8cfb8d2aec1c254276ef73aebe597e91546fdb4edca31b57923572073ca9369bf4a2b0ce7a3d4bdc8c6fdafac30dba7baec905ff2bd5d85c1e444e5e6fcc83cb9c69aab1960a8a2ce761792852429684f2accf196653997fa4d1f15261d523855d7317e3a790a5418cd4ea2744c5863ad057e820fbe1b3672743185b13b6591f11c23966534b4a0d1821c5ea0c07451011a5ab4e0867f71011a5ad0f02fb8680ed0d082c69db5c02340430b1a76c39d8bf3850d2df3a251f05186c3bd68418e2c85414f7a0f8b2426297b5218d56cd4a8f4f1f6b98fc26c71d2cf88c5eed35714c6d1e965fdc36fe49ba130cfbc8f288f7b8b2c0185617f3b4be7fe2cefdf270c2e4946d0155a3ea25d066078c2a04694e5ed59d7fabf138614f22c56a8958afbd4d80d745181b3829c30870d911e72e6dfb29cb809e39c271d99a142de4713c60a7af1223444ae8533611049c5fbe69e4bae0f26cc79c5de7b74ec10a2a55cc214b45c4d9f92aa22644b98d46595136182ead866f2004625d491cfcfbb1682caa2008312e6a0ad2797ee5b93e1f8c8f3008c49186553c4055d59e46449560086244c1529ec8e55d808ebdcb8617608302261aaca9ef8b521b2eef187106040c21ce36e73278b47109700c6234c6d415f0e42bba9578405301c61d8b7aa2ecfb7b0145463edc373d8e8e24e05301a81d0191e3e6444790306238c713f62d1e43efdeb35d63e10522f602cc2544ae26e9b84a4425a6aacdd5084a954764cf86c3fe67101231126b566592e665c46b4cb4c000311066d912da851fe41a4d3210c7f61db43caa5b9681bc29ce467e498a51121a51026e5392e9f449810061d134a790ae141982508f5385721447a2c087329ebef2f5526e60f8439ce6ea464656af2640161b69446be8d8a21e4db3f987d62593c6bedec52fac164f7df69fb631f4c29ee6e65adff50b3f1c16049eb6666df8331458ed029b2249f5735d672b4e0468eb5ced10bf0e223c905400c30f460bcb4f1faa542ce53aac6da471d0d0d34600b30f2600a6982a4b82e5539b45c808107f3e81e93b318dec1a4646858588a4e96658db5b230ec608e26579b3ee26bfe5263ed830d07a30047af200130ea60103bc23f8556eef5c3737c617e18061dcca924a54fd2f75ba489e760d64939b722bf65cfa68f3b030c399844d8a9a0ff63df851e0783a58689a7541bfe4170308e507955fa6358f5fd06931033ea6bb47583f1d37376b8d5aff8691b0c1adace3e87f8b922369882fa4cf652daf4e49035183f2d98fb051d6f92d460887339fc7327b17f8d8b56810d143806baa8000d2d380dc6d02222d553f5ee99ae00030da60cfbf57af7703eca3318b7be26ee8752224c806106f359678b37eea9457b30ca60f2cad24946844f8da700830c067517ed83b4fe1ba53406e35ad871cbd7e3b29be50186188c5a5b37bbb67d9d3d6130a7883fda42ae99f6d100030ca6b3b00b914275ea60d6ad01c6174c9d5444af9b8100c30b86f43b97bffd9e7459140230ba60ead4157ac7cc264b8ad987a11c6070c16cdd162752f27a1bf9ecc3181030b6609049317a1e52d809920f3336c0d08229291d26ce8fc9979033fb30b5d2038c2c98f7e2f3558a8afee75830a8591ecb3d59bd3aba82f9564b7b5cefaaf3b582e9b7a3e413d23e29bd55c1f4c9b28856bb5890142a9854e764a53fbedbea3b05534d2c7d77aae2e7775230a9a06137d2ac24465214cc7d1a298d2c75d9520e0a062d93b297d095ad84fb0473cdbfa5abb658eed209c6d5b4504ae57cf6779a601a6d61ff45878ffa2513cc6992b07fff8ba054b40453ec0bd3d6ad3fd7394a30789add480bffd22d4a8239e8a860fb5fc94bad483089bb9f117942749b0fc6114c49d99a488bb011cc11840a2a87d1cfdeba08e6ad6c6a3f4b53438f4430682f11b211f3b22f3f028c21984bece28afc8a259df6f0281f8607430826ed4eb1743e136f97140473bea978d6ecd68d05046377f5886b7a7779f903c3488ab964a13a9f181d0e183e30d75d075d6e32ebb33d30a8b9a43d7479903d2e0fcc155ad41d988358499ae02af945d68131e4c73ebb49c2c4e57360743b717eee57a16aa3a1c58729da62cb60e0c03c16225cccc98c8ad40dcc1f44880525f46f5ad60626fd172d47dc9aeceed6c0702a3e8a4eb942be80410393b4483fc2d7e4251d9d81712b23a7bbd58fd41d18323005a97dff932a8ec9321646d3f2380f23a2bb25b0305df06afbbbecc9f4fb0ac39f4732f3d167b1a72b4c62a284dc5e893551d28286161690000d6d81005a6148fadada644c92159b5ab10b08801546133af5abd492d72cf00f1b393ef05620805598c2da6ee7d3a810376320005518e4e7be3ecd5f68130502488529ed2911adb40987aba09d8b0f1514c31b282801a0c294ee84ae4bcb97eb2fd2028f403985c9c427ff298b98c26057396e9696ecd1430194c2204566e6ff7bc8be202408801426f7bc6769a476d2e6e8628b1a450b0f8f519852f8879265f7a62ca6111e672887243dfc2e5f7c7461833b8ad0610643d075973fa67a8f9a40e828c32a2a3ce928a24e7e51e82003ee5f5e9d25954612133ac65072bb2f31cdd0b30b5c4287188ebb9611cf7f346ec1f9280b833945131efaf24608dae90083214938713af79c599a5f3086e917ada2aae7c4e4dbb9282fe8f082e15bc4bd54e42e186f74ce695ebac73fc905d3e4169973514af6f45174d0b105939294f522df4d9cc65a3098ce2945c991d4a0230ba634f12a4b92e4ce6663c114f428a56c47f44b7e35d6cc6868a0010ea0a10109d0f0f09041c7158c3a493c699153b357a264830225d9e8a2eca4a500083e0cd0610573a4ac9491a89d26710f0f5e0a80e003004ee8a8824175ca972e6fc99354d5584bbbe139fc861766aa800e2a18640979f398e421775330a470175b17b4e335cd8f0e29184777ac185636f3f9d482060768584002343aa260f41c6f25c5fd8ad599066868416303342c20011a1d502874864861fccc3f5d634d058e010f0f15f80db41b39bcc043c7138cdf5f51527f36d52d7e31812e18e0e1e1e18163071d4e309c502297969610c4af8e269844926a0f777e6a7eac4da18309e6642a590ea1b53721a9c6dadbf8e0251872a86441f95a12d26a724a30ce4fda14f14f27d54c82797420c1f82bea25071d9f4ec5fad071044350cf11092a4a90df8d604ed1a5478f96fbe6a4a308a6ce26259d8aa076f5c2367410c1e861c4e517216774ea5e740cc11442cea3152d76ca2d4bd02104934a95e6d564769c488d0e1d4130c7121533b2e59ce3b36573e80082b12ac6071ff57ac2439258213a7e608a9d8492d9fe8a7caad436b8f0f020f6611b880e1f18d447f47fc7fa5356730f0ce2a942a57c499bafc63c3047c822c67284a9b2c80ecc29fbe46025569e832e9fd0a103b3e7fc1232faa774e7e4c01cf793f3466a383084dcc93a25f5ff0df50d4ca9ca7476dc49133a6c60b29bd1f7afb14b538aa1a306660f22f9626db8458e7ea18306e6206b92a3ed857ee5ac858e1918420a7bd723c553493a6460d0f5c1f452ca1efb7d2c0cefb13be446fc8bc8c2c214b73d6ae7707e2987bcc27841ee5225a929617b579872aa3d15272e88e7a915e6d6cf9654e58ffb5cb3c21037437755ffa2e4945598ca3ebf8f885615a6cd946839e59c0f6aa258c82215a6cbbcb99c13ef0a59a0c274ebf6e154485b3e39a730c7ca4a4a23ec1b3958604c61f0109552ca1f254afea5308ff04ff18d70fe1eaab19611c88214a6109479ce3e7d7a71bf1b4116a330e58e7b1a4134925b4a8d355118c54f951eb57f2af13d01b2c1c586c270e2262d9bb4acd0528db58f0485215e4acac38ea8c6da65208b4f18546d3dcd495acff2d558bb40169e3065ae97764f1225bcacb1c614c8a21346fd9113ec52a6fd7d1865c1095359fc4fe2d69ddb6235d69c8bd37622c86213a65431d789fb6ec9ae1aab09e3ed44f5b62dd3fba61a6ba90b1ba78b2f361326bf8a1f275d5f5ca45a70234762c26041a50b2b571344446aacb5e0460eb2812c2e61fa9c3e2e2ad5d60879324b98455987b058c23ec4a2812c2a6108b2697fa6b273ccd696035950c22074ec7394093126ea933086850bd1ba6a24ae92306beaa591266143422261bcb738a2539daac41224cca2428c70df0f6a52e711a6ab18177cf257bec91106d331e4771aedf183dd0893f214e18410c16cd28c30e78f9dae5f21f5b96511e65329fb9cc9274f9e2ac238ee3da3edb7f2fc441862a7a0ec65e554658908c366cdac8dc9da499243982cce9ccd07194bdd19c2b0ef49cbe6c2e4d9ad1006d51ac22d564ce6a93c3c70b8172dc8714701107c0400085910c214a367e4d6764b8a21b40fbb2c0661bc783d31fa395996bc200c49de09f123b1cc4e0d8461ce65948e8a1ff40f0863a898dc172d79c59559fcc1fc1366accc52fe3c310b3f185fd2986f044bd9c9f7c1105b2f2595a4d3635e0f0f3164c107b3af873455d11e4c41c8d1f1e446bf4bab078369dddffd8fe855963c184eb52b5be8feed13c18361bbf3fa95f60ee6ca932d9cecb0371766610753aa121242aace33f70c1059d4c1d439e88837fbe5a9743a1826c6554ab24d5cead11c8c6f66a3abd255e4242407d39aa5aca7a7d42774e2605c0f7796173a7030ae99d9870bf274c4ce1b4c25cbb446abf55da5dd602c714b4145a9ba384b1b0c1bdb299dc50a1bcced3b22ffd55e94145d83b14ee48aa74feab35435183f452a593339c8b7d360cc095ff91192a48b241a4cf9447eca10e6198c6ddaaf636c9abf04cd608aee22eb352c9a50aa2a64510693ba1b212f7e4f0653ccb17062d26ca6c8c76036212df34b2589c17429a87e1ded15742585c190d3d6efa4ead494243098b33e77309bcf174cd9c4a28a27715e757bc190824a3255933f7ba574c1ec7f9def42902729cb5c30968e6f2642b21ecf780b86a81f2584b0ea13e3d582694dad72fcceaa77370b463951a5f379b29b5ab1601cd5599613a24d4af30aa6b0fd59478d6905934cf68f3b4a8ee79454c1b835794d7627557d122a98ceab3f2b9a369192640aa63d75bd5f4ac63d77523056866817f92267b68bc2b1c32585d1eba0603cad94ee53e8cc0bb227183e4e9e30fa932cf79813b4b2cf394284ad09c66d131e572a74d29d09269d3e2c89c6e5d32fc1b027df4dbd64cd1229c12446477f3ea1524c4b12cca9a76a5fb3c2642498365436cbda826b5716904216473075e990f354e794e36a239846082d22d4cbcd7f8a60d056ada0e324f5e7b03040430b1a75011a1690000d2ebc40c1166a4430afa7d8b6cfebaa1492c30607ee3e90c5108c3732d64dc7ee3295f5f01082498e65af74a3ab1e4e48c82208c68cd1d9a16a9ea51d0f0f0058210b2018eed273ec4bf331e12106b2f881219ad6aca4e2f4f42a3e30778970abafb6d037d758c3f1e1c517391cc771163d3077deceb58dce4ab68d1c669b050f4ce13f7f6d9b8b0ed9da813925fd6b5e39393e6f4ac84207a6246e23f3126543c63930e851973c6f527d4bd60b59e0c064f5a542b05c69a7a31b18b4424f87da883a216f210b1b98438e962bfa05a5b4493c90450dccdf9d45c4cef7d1b28d42163430880ba7d353d6f0ad9c8442163330c44b5de92da84f56a2608b1b5e98690bb2908131c3b5d4d743462ad5be102316a620d1935cb45426b65b2ec480854925c7d3f5ab6b4ac5f415860b2a26bab64711f95d61cacd4a4a08f1126df256182396f8925e49cd66b816831506959c4e091d4ebfa4508d3557c1163752a22ebe78d2858d2db640018e5e0189b10ab3255dd3adf5d5afcb3eec0f315461ba3c2b39ba92f2a7570b1a34b4a0a1050d2d68380a9a021e1e681f568718a930867c864ef19239f10dff40157cd8c8f171e3867f78d12858bb618018a8307f2775dac6235e7ec8294ca2d627a414e6bd448708314c618813d383e4b7fc214f928518a530a88dacc84ff13c7c0e298ceb4195cf8fdd859895e9284cfea984509d5fc4a5105198a49afe05a11e4e3ccf408c50985c4b948c999d94da9a82c21c44d0cad974fc42d0ca270cda542cff7896212fa29e30c514d33457b7c61a0bbee80f1c5be017313a71c8a6ad478f87306d08313861cc104965dc566aacbd9f0b000e626cc23cbaaccf36de1aeb802e2ae0e161ae88a10963eca7c8eecec494adc69a2f51c19503c4c88429eb7b4ae1930af3c13a25c4c084b13be7e87ac1930c317b78e4c0b105171e1e1f312e61d4f6bb0a8babae33046258c2786f229ef77fc66a8f5109b39a9a4e5ac3ccbc932861d0e72762446848b10b8e2d100bdc930d0a4cc210627f98999af02177bab0b1c547310ec4908461562b89bc7d593ad901312261300db38ed725499bb68504562161160f13df7212de1344ec1e508256805a0e1c5b70413a10e311a6bc2345655bc8b11c2a00f010c311c61f75df31ae5de72a1f311a6150dfeb104ae9deab1703311861fe523e267f2b4a387b11a6ee7c29fdc65c6dcd0f1c5b281b6228c2a49f133f8450d7d93e0163b06b542449d1830c311823a41c429a2d7d1f2936920d1961309d460e22d7c608e1078e2dccc820030ce6141d11f4b94ef81a71f105938c116df11452e507820c2f18fbeed674f67f4f3b5d156474c138f21e724bbbc3f7cc05639cf7288b2d5241c6164c414372f658bb5acb6ac1706739548a3769cb436464c1b43d49697dcfb7a17a1958308f34ede929ea46907105e39c1c5da645a78ecd56307c96be28afff6cc184b6c8d1393290041955c827b5d5cdfc766190410563ffc80e1d65259ca59ce046a3c06f988c2998d74cf252302421dac3bccf838a7714cc637fb1f6c2733e8f0d20030a86744a6a990433e1697f8239ccc5eb15a1ca3b742798723aa19d3dcb92ce5213cc7d715c46a911b1549860b48ab5adeb4b1eb46709c6ff5db7121f3c5ebc4a30e7d332d5ac78398ff20b2f92606ecf2d39c6073569511948309e8e246549e49bbf1a20e308a68b37799b2ef2846f04e36f4bfe2c7f8b6711ccffb13e92ea49189d08269d3121f2c63f04839c5d8a13a24230574e9ffbd485ad6406c1a0276a9927395a8940306d9747f8c85eeafc812927a1b4cec49095d8fbc06413a4a48b1727e1ef81219dcd5dbe9ede34f1c0785abd25f72ca47c7660d8fdfe55af9589b60e0c96a735442cadbf951c18e4ab465c9771604a29172e37b981a9cf45b72d5be77236305a4842a5ebce6b60aabbb3b3f78ff697cba081e9f63c47ca5f19e272193330859a9d9e58c182da65c8c06842627c7e512c0a69a74aecd30916862065724e69a7571873d5b63582d29bbf2b8cabd7a9b5a6e4b8a91506a5ea2fc590eb131756989359a7ca4dd6d3d9559824971e95f2f9a4e0aac294525a8b7ab721ac4d8551542f5c695d2935418539dae81021a354c7083a85c9545a5c9e780c292253985b2624a16c4f98cea15298f2670f2aa69228f9218571ad757f3b72eedca3309f49cb232f8bc2581d3af2e321556c4361bed355ca666ebfce939fc87e9e13b3f309c3856cb933e2d7f9c713a620d16f27db9d30f78ccae1479eb4b339611c3f933549ba095376bf2d9de029775213a648e17c6e24ebca9809b3cc5c7a8753553a870973d4eaa4bb737d0973c8a7ce5a2679b4ad2d61ce96ee44c5889c9b75254c7b41b99d122bb25953829cd47d98e92761cafe9096462d4f58256110d671a2e935ad279648182bc951dbda175b59818441ebe8d121afe7cbfe11e638aa6639976fbec511e6942645e5c4c8e26a238c9246a5b1b29326228c305f2e616245a87b087911865827743eed5811e68bebd039f57d3e281106af78ed517911612e4bfd126631b6c73d8439480c15a1d22d4eb88630453c3121d9a38414dc42984c77c87b77a5d7c32584a9e4984ad162e5e4dc0ec2143a65975feb69782b08e3e7efa7916d0361cad0102994a97aef0161d0b19444134a5abdfe07e3cec4cb0e29723ec90f66391d7eef7592eeba0fc60b25d5bc2f760a5a3e187e2e74a5e0374a64750f6611a52d29554e4f52d583c1c7bc52ce97e6c16012827e7d13d5764a3c18fd4556843e1d3f72f20ee61aa5ef2ccd6907e3e98513b93baad696753097ee7ca53da659793a18b4a50a573274b2d8cfc1ac716159576ff1477230d7249b5119119205c5c168a64ca8fcb1a363070e86fbb871153335b6bec1f8c1e3578a923b65d50da65c7a674ae9ae0a4ad20643caf993bd7472b6246c30ad5bb8e59b4ee126640de69a942729495e0de65441271db75fe43f9206530e42a913d16bdb7244835135d3eb3ad8095bf10c8637a1bbbd3da2f58666309bb4d116452b8341a8532989d1cb7e2a2483c1cbd446b8f14aed8fc1bcd75eb27ff296c4c560d24baea5544da91c0a83b92be8d23679bd94c0601ad393e2cdb466eb2f9845ad83c872ab1cd50be62de91ff183e75eba601053ad8b13b96098a0a4e54bb9db82415bdcee24cf23f93a2d18f5ec27dd5e9705d3e44fada15d39873c164c5db2464e5e8d35f915cc296f217dac3d9492158cfa15b154073597ee2a98e6d449b5f8ad242e5430b7685321f2650a06bd9552ca69a1cf220573300f3337d9a260b0f568d95c8382d962786544b9f330da134c41c48f7d2a6d04cb9913ccde25545b5049c653d60443d637cfbf9ebd6f6782c97eb4ab5eec4e3f5982e9edcb7427794ac98812cc27d62992b44f72912418336d6fd5ec73f61009261521a84d2b1dc13c5acc549424a22719c16ca67eafcbdd4254044390977366d224c98c08061d41ac7efcda11a91a8239e6c4ea24a2e71195178221659985e510776196060c2008e6fdcea346628dfd2801c15c39e4fa32747ed07d095d42dfd828aff8c0246fe16ff969db43ac0703e8814196840927c663a97d82ce417630001eb8225a3d5ef54d773430801d68413582ba3ef5531778662e18800ecc152c7f0ab2b4f7d44bc630801c1854687c9e5c153d49968401e0c060276458fefd907be1220ce006a5a553594e8c906766060660039365b913ff3c9e44258930801a18238e4cb83c5e0106400383b6163f378b1eb4245be011c0f5a251d00511c2006660f814b157d953ae08fb00646098d892b3e85d64b13716e652da7c929cbd4ab1030b738510c2bbea5252b3fc6f91f6bae315e6385b11827b52f1f3b7f3b000d0a0c315469dd176399c9599b66ed8c0f131015c0f74b4c2a04ce850b245e67b973a58619e1ba533f12ec9885b598549479f12c24e52d05176a14315a66842c768951f9dac4d854962a90baf734ad829e585a10315e42c3eda6ada276d5c1a10011a5ad0708087470bfc0486868e5318d2861a5f516df9c46f0a73e84fe91e762d8579cf65ec53ae3c499f5ce8208561a4f5a5edbc7aa98238bcd822070e2fb6c8310ab3e9edeb1055e31f3f36d217386ca42f7088c2f09f3b848e3bcac1c51625c8c1c516250885d9b3529061a7ce521a14a65425b98298c849253f61dcb1742aa9cb4a2192c40a1d9e30ae6556d76aa5147fd40953ecee70499b862ccb55a18313a64b6da9fb713d04d111063c3cd00d12746cc22827a731c2df83ce1a0f0fe42cf0227468c2149a963aeced99484c18ae3ae4ab8aa2924aacb1f6710963f5966ecd975029a325cca6e47ad2a66b47e95f09730cd36952ca497815d558434a943aaec4728667cb4551cb4fea63b44e5de77f564e051d93309879b614725ee949649230e812b2fa431821b1bb8c844977c88927c47dd01ff6a00312c611b1b3b7a542627798071d5af8cd9fb7c311c6399d45ed9aaf97bd1d8d30fb8cc821653f31c290e298bc93ba16473bad60e8588421a94b48563271f72b1d8a30c7b3fc20b612ce4247228c1d45f4e6a868a3bbef408471648a3839d96bd9e24a42c7210c3f5252929b9763fa39011a5a78785c87210c9ee22eff25154eda1d8530bf5e24ed22272f84141a5a94a183100629a3a346ec5bcad5a20047afc0c30305387a056410c69c18395cfecaa7a60bc22841b74cfef4d1d080046804c2ace2b936449dd5870410a6ce1dd15ab1c6d5f407d3c8fe68932bc70fe61479da4542fa60ec0fdda253ed7c307827a184b49c4e5edb7b30c90cdd2e916b7e62ebc174f9913b87388d3cca3c184fdcc9951362c2e50c0fe6dc503a6cab750753a40bea2145b285f8d9c1ec21ea46f588141d3b753005a9262aa2891d7430d8c955cea542e660d4d3d972b59a6e179283219e69b7bf98f99cd7389827ce5d7b4a952d7fdc0107a3f587d0e9fbeb7883d15484f82f67ca725248e87083a9b3b9c90921049316521d6d306b4891756a724e1c42071b8c23f4b9a4fecdfd0ad0b10673be7b48296adea7c4c343081d6a30da450e56b9fbc34b5a63cd16e0e19106537ebdcf16561ae72b1acc957209f510cf3f6ed6582b868b2f7038063c024320c0118c1dce577eb535ac7335d60a4d312010c008e6740bd1907d93f6322305018a70acdf9b134135d66a060420827962c65c14496241da359653172671f1858d1a19f0f050f3d3c7120438a4d1129773dcf25e40002130d97ce7b2778a1408100453c4c9aaa7957b963c35d63e706c0104536ddaa6c80b277bb25c70f1c59fa96941801f3cfa6dd573f09c6404475a00f5cb81003e58b4859121ba3dc90e6d81a38b2d6e786a77400e82003d30083d96a654fdae530a1608c003e3a57e1aa154ce65fadf81c94d52c8d949d781396c7c85b86f93accd81d192d01b42c6a4981207c648f941282182b211961b18dd2dc6842023cdc93420800dcc791d22972c754ab849011e1e384a170850037396c7fbe42b42bf9b6860b0da89faa193e9f119025120c00c8cd9a7eb525b3dbe3402c8c09456d2c5504ad5079dcd8885416b4cb58734a977e219b028686f31939fa4bbaf4862c7965ac4b4f60a2965862b4c25f94cac3a74098b7e71c38b3b2d683c400b0f8f1b284001eb0f66b4c2f82571acebc4f6c7ae3061062bcc15752429d5a37b3f5aab30e5709e52b2bce7742f0933546130ad8ff73948b7a4c244c28c5498f75dc38490ab919e438419a830887deed02927a475afc6da47b261a3041f38ba066f91805232cc3885299b8821c26e5e3efd1a6be8c3b9485d740db4a1811c5b24bfa18587070540f0118055cc3085b94d564e720a95752a2508334a61906b5a5a1f7e56749881308314062df1bf54e5745d4af72fb8680e8cc2e0b1bb4327468a284cf1f65772b04fa1e357426150e2f4e99fb662300314a63065a1174f277ebe19f88451c6434fcd44519d843c61566f730d99e3cee884a93c5aa4582a48eaf2ac31274c17c73fd207314956ca26cc9dc27c5d8eb6260c3f6e41e57abd9f0433615a7f397539ed56ce1f264ca523a83c9d439f50e94b9854c6b8664d48726fb18429a730e51bebae61d14a183e68d16e71d348caabb1f6c10517fdb11f357278e18905332861b034361e33cf547d28d38c4918c485e420fcd4b6fe481286b5fa8c74fa481845a724f14cc84bd69119903049ed097f2ab47a9a6bc6238c59fa51aebb43f423331c611e376634228dab8f90bd749fb6c61ad96206238e9e949794d1293fc48b22331661d2f0d1c82ade9e29a24b6a62673b2dcab22bcc48844124c49b0da12d9de820c224fa41c49ed8ea0ef321cc21c4eab54a13dc3f8630c4cbfec82ba33aa46c214c6ace62d5fb87ff132184494e777bc8f191a3c8660cc210d4098f587922fea28d98210853e8f5f8c17357ce1c91dbc38c4098b48ce714237eefc68285198030e77fd3d5bc325d769236ccf883e95a457c7ffc770b397e30a62761f1473c7f64990d33fa60d6dd970f337a3e98c7a45c9e442d0d33f66010aea53c6bdbde776f01175e78d1650333f4606e13af1fff5973d619c18c3c9c2b54e9cb18dfc030030fa694ee1e543813415dbc83b1b453e70e9f676a5a543b98e5834417651e4f82e4f20e33ea609891d5ad20f3437b8c0ec64fe95325516225a56c0ea69ce3277a2521621e948339bcf7a99b7822c8ea92e461461c8cfefb123cd672bfc739cc80834967ad9cbbbbc68bf4e30c33de6090ba1ecdde34bb196e30674b2929a5f4a53af56a6983c1e44d8f7eaf173d6283a9e3e547ec3416ee396b30f5e82aaf48a5238d5a0d268b1fd352750d6d350d06b127d4d5040d0d660fb338a9973f652d04cc38c30c3318923e09162b46cee69d32185b82969482d0ea53693298743cb9fa57650ce6d8ad11f546e66973c56050ad7c51e24388d96130a5759ff0b62518f0ed9359f51232e30be6f7d98a97e45dde0fa9c20c2f98438ee36d2945081eda195d309a1097c9e15752fde68249bc24b595976405af6cc130b952c5113bd24ab45d70266668c160a2257e4e938967264f624616cc9b577e73dab31f52f81133b060b6d2f37e21be2e9a0d1b37881633ae7045b2deaaad9067d5580fd7c2bf7174b1013531ccb082d9459e4ade39fe96622412985105c3d749f556b1e449785430078b71b361af12664cc160da258267b887ba902fcc90825154e5d55139a419a5ce8882e146aa8d6da90e95d70c2898f7edf4c7c64497bf673cc174419fe9a0ea7f37c6194e308c9ae751e1cc53ec74130ceb26f6d7a2a9347799607ed32df12f397ef2dc8c2598cf530e167b7a12523843090613d367128c3aea3c7f98f03f2b418229ce4d90f5249a71046368b5af390bd2427f8c60ace4d9a9ae7253f45904f38f989f50a7afa31f36127f31830886e855317b524b3afd0fc1204baa8948faa6d46f2118a4e4594f25bb73c26843051f36d2e69811049376f80f6159cbb72540306957123331e5a5c4f603c38b49d28bab3835a98fd445670e66f8c028294e6be59ce6b39e7a60d059462387d1f4d12e0f0cd73a314bed8a4e4ed948773698b103f39f8e45d62b91b4bd3a3049d9bdd0c9ddea7fcd81415d794ed73d75ea331c184e828c982af777756f6010bb11271baa849cd00606f3db53e9f35ba5e86aac7dd8486506336a60320b0f6926b95a142d0d4c6aae22da08f5fce799310383eeb0ac9c77a13b5f3364601259fd2c87285af9cc5818bc732e1fd7de6ef5790d3260610e336184901ecb40c62b4cb51a6af53f25774bb36980d440862bcce1d923495e6798c4c8b6c2f4162dc952ff64a6a2066e68218315a6decbf5679ea6626833a0058d08d4c0d10ee0f3a25180850220f878808c5518649f24990f931a6bfa0719aa307eb07c75a227e1625f63ad0aa981a36b905418dcde372ec70e16b373c3c6ef7d51010f8f1a38da013570740d09f8163734208174c3e3865742062acca2557a45c9ca2c55d758ebc286c93885d9920841a514bf7462de43c830852958b63f616b6ed9ef52987bb393474ba9d4682e831406e9177ca2ac6d895491310a43eaa0b46acd9808f9230219a23028eb683149e8b32482a130dfc5ea4f3c29aab2ffa10419a030041b4941ded7d3e4e41326eded53ffd6371bb9278c92fd846a9b14d13ea9138611caca7276b9cb71e38449e4544984d39d4d94d3bd7388b264d5adba0c4d182fe4c497efece51241cd8439f6e9a03bdba6cb24e5c9c084b92ce7afec98923c65370d322e61f034d244551239794e3901f21a5ae04186250c415b2bcb8b76391369250c7a4f9ed74bb4d0e651c298a15ea2a85c8892a449983bdeaafd841589b949c2a4567e31c5437b1991309fc895b311ae23d117820c48184b5cc9d1e6e31e43081f619c147bbb43a538c21467fc83887b712bc55690d108a3e58ab6f9113a5e486284a93a8c2ab91c3ac8b86f0a321661c86ef292ac07f3b858086428c2242c94fc7c0a41fd53321261b820395775fa3071224106228c1727e976bcec9e2dafb156ba90710893c5d0115e2d5d3ccb8d761c1f072d20c310c64e592f7a59b6c46cb990510873c81d2689d029abc70961f8339dd5889eab84103918c81884b1439cd50fe5b1c2bd9a2a9021088396edcbba957e3ccc390619813029b1772d3934d34c650908a3e8ac9dd35a589c5f760b32fe604a26f258a7dbfc60aa0f594aff6ca873530b32fa60c8dad1d2980ef3c1202c8eea76d0f649d92bc8d883e1e36513225c8a5631f221430f26257f2e6c6e555b8c0332f260cef693e38308614cecd9041978305ed6f3964b09a2fdc30419773029bbbf102c9a0aca4576300839313546e6a9520b7274f1059aae40461d4c215a58cde94ff16cd3c12444ecadea8fde1964ccc1a0bba154a7c98a8fca0153461ccc167496cfeddde229d37c830c38987b25560ad59fb3dcf806e3b9beaec7d3718351444e7a4433de93966d30d74f7a75ef9c9316b1c041061bcca2f4baa9f5f7e764ca32c858833174e4cfe78e3ce2924e95c544728f3a4a83597d3f9dbd550e6a3b1a8c9a753a9728ff0cbdcf600a71d1d76fa10bc8308339766ad3dff1fdf288cb601a3917226ad4ba332383e1e4255987ec1faedf1a6b1f3612a640468d87a8449165d2581c0a8542a130280c8360f97514c3130000000c1e144763f1589e29bbb20114000442343056343c1a261e141c180d04e3703014068403623028100883c1a04028748ea6700c8b0f2515e935d557e99e1353aeb200d9fcc6754ce80c44c8119e6eca14f2955f0f1c331dc4d506d130fd1664da9c86913a19b432400ec18bb911457805b235891c4adeb651768091eab5d77e70eb293d81c4e3c2663444d433d431c64abd4c5e2ac4d1c74d6a65fd83cc3375796e80d929b7b27a360695d2efaa2e71a4927e3b85bf4b25079595fbd2e12d5ce34315756e9604bdbcf2447447949e31e3d015327d4ce6ff8eec4b19a3a68e3a2824240fec1a0c4a29cd8fb6e60e69df702c238fdf5a221c2e4854653009cfbb492309094f03eaf9fe9a44aef6c32dd154193276cd51fd88a713bc8bbb72614d62280f0dcb61821b33646137b0ed5c93179a1cec5d49039ba3d9b0fda804b3e9f375fff67495c531f413d2479b2969aceb4e308b44c3595f73e813bb039d68c5d33d15d074468af96cdc2007853353c5e872a516d2328d89ebea6ff34492bfb54746e9263e4f46a88595c6eb656166e4b4ff48995183760f133699db9bd3f91713e84bb02dc6f0280d3e028b4cb443aae45f1c59f868e386af9883444a0c3313163316ca65789f5ea051f15275dba98b19f039901ed51a26979dcee3cc0057f7ce0115f98c7c50561c4c70dd3a131d688e4dc0c8dbf95b9318d566b8c1a7f13a1820aad3e997bddc246f0501819d6dbe2124d360abe4e6f8b9d368b0e6c9650340fa75193d3f6165c390a5645f63a4630ccf23d0e988b646e2c50832237d45d706f09fd133460c2820c85317b4b310e3f2236f200911d6195baf9b946e95aec8046f4bc1f070cb369f9d994f47d747526de2682ce100b47127ff8a3d2a827fdb6947e9232edde09dc9d118655613024789b870a8c4c4a9023cfda92f006b7e5c2e9d26fce8d3531917d86936c09666eeb5d85105f5d96a1285d0cdc6088b5a9ce6545550fc62a55a82a94c5285fea0553886d36acb8394807da585bc695904589de91399533c582c41d09282f086e43284ed66f127a2d58407d58c66b9c3921c44d3fcd24a15ae568a5ebe6f550257005784a41641645c8feea284388cb28047a9670165e2f8fb11a03a18ace39a114bd716a330bd6276af016d6933466fd716a0dcb83e56b4553be0fa08563cc701c9322b365491d6fe6e067f4ba7832e5027bb66a42fbf982ccc6768fc7dc748ef8e74372037cd9c2e33969a5a8ba4340cca6fee1aac57efee90f26fbc8d5fed521609bde34a2c38edbe02fea1995c710f46cd8926f3ee054665cdef666013642696a1346dce3d9b935fa5dd876d522b5059bc58d8f7019d0b133494c18577e1ade092c4b7e1b12250b93e882fcc097e2ae27503b3d2c0545f0c15adc5328f93e951e631230d6579f7ee5aa358ed8e6ebb9f50ef288a543c45723ff414f08891a6362b4a7c585477a951373813a589b3513eb6ddff4d1dc76fbea8e4b03563d4f4bf6943bedc84aeb862c66254a72fc70a4f997d631840619285488e43d4e4b0618555bf6ff7993cd9c8e83d4507d42df8ac79ecbe7cf2cd1c8d51ef005c319d1b591c3dcaedeee1909129f14831e8e934bd575423155c6daca0b333ac0a6288eff7190aa94d26df0fdcf706f610be82a7eb81c69d36165f0f97435d6808c0b1cb38c91ef6680f65f2e8219ef2f12c2412c80db41909203cb5da2bf76d21f0a6edf92ef1be0a0dc7415ae763989a43686280f82c90a64bafda406d829e67911fbce7e50f8c9d9e4886e2a7f0ae954326d3c32b98d18ea3780d645642a76850a5eb633d09e8062181b846d2463553631a11bde2cb0b24489d5c41f0e67fb1e1e37159e99ea2a66f93fdec382ed9b60121641223d50946ac1edcf085e577a3607d2305510bc6127b38b6ce897021a09a554ad83c3d3d47a05f281ba95037af91c7229f145b624c8e36600b5adef16bcfb3e1760774c91ec83d9675d492ff9d7f424f813ec8f343d935f6c7aa7cfc9c9ad4a26408f147452bee24bf1154bc1421e669da917700f30d08c8414dc3d346bba0a73dd70d13a03c2c17d109ed09a71b79f24fdb04b7e9f589a33452ea6200b3c60c75e108fb01d33f2326022f2babacee5cdd3a9dcd48a8142f5dbb74c2bae7f146779f26c070527dadc04e5142a12d06ac44d69c68bf20ab902b3411ca990c250ab4a8295f5cc92e01c46c6f8313e0730889f94103c04a271a1a9668810665cbd920688daa2ab0ac9089d20193eca01b8c49e910e2df46f68e6512ad5385b1363d016da0c30f6def5453d35149ea2f30c5454043b06f36702f4f07841ed2c652a2d80f84f250e051e9685d1b9bf4710af4ddd3b1d58fa546fbb26549d5cff4339a3fe2537e46cd1a727a1f3f31cace2767cf447b6a6c2b2cd19c2803d01efa9f731c22a779f5235b4e70027e715161c209e23408ee15fe61c60367185730afa1e881b4be630e3034af70f8f12a7a902977fa47676b95d68889364acb145d639177c06c402624e91f0de01b5dc7d81f6f3157d71c7eaa54ed09b7247420260af12fa8d1892c80b00edbbf50cff96ad8f070f160ba02ccb6cdc5422419fe282f4a314fc05b20ce8d96f4f17d56882b6ebf66059e8d107135521051db202c099b7307e57c67fdc9b27b44e03c49d1c0c37b7104c0a645017d4c3bbf39d81951e3fd03ba90de3ac1ec34e460461009e16a010e9b2fbf61e8843fea3b97269bd44ddcfcef2e4f50978aede1bcb4735261489dcb44ede40c69ab926d5ab441563a5cb5cd513c0f480d8247ae1b730a9ca315ebd32be660f6efd4c762259ef8d71dd7b3c4ccd7b401479be91147834f9d154b8f4bfd1783a4174d4dbe951736a5e4549c86cf4313a4b6b52a8645720a692995df1f2ddafc3fca341e4ef76ba08b57f15a397087c02db6ab1caa3c75426fd433828c9d4dff765c57a22196fac2487ea9d1ec49c876ce273a353ff85278af8ab87510bd80ccd5a2a3672c6a1cb965cc4b0ace8757a1d06370430b48829dc1d645c47c30e91d02628f193ebaaaeedfc51f1bda6474eadade3e208cee33da6295565679256c4d188b64fd6f31b0614a508f9efe35e025317eac65e6f1b12ff2ace24a92b0a39e8e280de735f5e47a8ea2a9cd582c7c9f913def21a62c0d9708ac19216f7f90ec15018c5730f95e1f3b416bff1787514842ab6e6242c89073f69b261dd381c169785b0928962393eb211141e728da5a1147b02fdc6cf000f60b8adde605862ca16e03b1bf6e64e4f14ce7584274415967a248abb91498aad5e26818ae60c8a3985822946614154bf53ec087e4a9f42de02d4853b0b5020a2650ef0c9a8866091ddb41163b0f292e0dfa48426251b06f839e40f4b681606e5e4991057489c916c23a1a10f111120ab4a0eea4af2f70dddbfec18ac75d8058ad40d59ef704ab045c8e0506e67794163844b9efd8016364da9804ac9febbadd75aff27748af82661223f915301a21dcc370238d0a602024bd1fd430247b53534b3682fc35b9613ebe0830be262ba420825ba247918cb8c481a0ee359042660b38e7d2380f61c534dd182473045b738b3bd88d0f7cee823bf926103a40ecf63ea4bd14bba392e0725d3e2de186a6ed7d2dd18c0184147882d7d74f20a07f02b5e7c63e49b7d6586fc4b740f60a502dc94fd264c5691ed44e71655069eaa4c6a162a7f9d272abc898c52f2ad1c7f8a443fa2a18d66d8e95035cab372cb177a34618be41c976fec7648352223915586f21a5d968298ae628298b34cc729542169ad6216c156184b117d152582cd571ac306c5c6660a165f72e05a864c8b45e53dd71d6e8f2ead82e65944f5b7e0a3d16f1b608bb280a4b308d129e041a9c05d1260d01661bba70b3bd1596006a0c0e61dce18377031308211085a10ce0fff7f2d175e34669d839a773b2ee70f4e5ac544f1096d2479c1c3d1e8a42363e4511da8a34528dcd5a5986636ac1f1e55b5597d2fb1c7e13d4884e80a663246dba34bad54f32c81aa4d1a664651e8ab850c73c754189b59218b021d5a99db2c9cfd4eda91acac26cab18ad5c587f90ea981b8b1105e91d4b568ba85fbeee8fa609f2542566d22726436032c6f448b381725f00d7f6da63a51e2e5bb3f2080587eb64acd05a38f7b5faa830ccf81e6d83f6050098080b0a6e49c80709e02b988b6e97c2361c40a28eb5bc1f3cc321f7b2dcfd0d10510144060a3d04a1375e0e0825c87bfc2fc3cad2be668e87590abb907db333a2fc263766775c14e4c38ac3f41d5effc1410dcf315b1eece3416c9780ee738e6d0855aeffe1097e9329fc55d3e9ca9087c6df6b80a17e541c786e827099ce4b58a149e602dc906d8922365610ddb843ae98151c14a236db415ee677135d1b7075275f7097a2c7db3723e3d758d21e5462c54bf262b17e835eb50eb854909cddb05de2a3a42e75a28776ce6f754706652b4c3cefe11a91deb97fe26dd998a738d10a1fcfa3090139df3e1792db3d3792fa1a799d5734fe19a0ed81c15a46af7498e80f9e7f4dc8631d6f358b4fb7ce6d8ef496d391fab6b460156a256ac6030b05a1b43bfa89002589276a70e0e265de40dc84a84e5c84865a088ac1bee1ec06abf228b313a4ebfbbf9dcf8943699c0804b3d9fd09db19451f95616d378139a8d9e406c494208525791223aeb81cf08efd360eae8862706d403ae2817bbfe4490fc935d1bb4936a7d0c9544246d4d18beb20606739bb92e84044a44f27a1510d425446305293c1ae2b314d6feffc1b34a3638c94be379af27d12542d4045a5dfb6c7b559947740d5a75e6c831d8220cd4cf8a7e00e3812dd86d3fffdd6d5fe91cdcc08177ebd8e7c15948781be697d412d29e519ede69afd26dbe7d7d40ab6ba565eea80e62448f634b9b4d3ec6d36086214007381ce5e45158e66f6c7617970635580749fbe6003ee96cc3aa74de57ea131aca128ed9258365d8c49e1ee9bebad8baea4ea045a1dd445eb9aa551bff1f35282303aaab55f3159c040cf6999ccc99b2c93d965f3a952315162c2efaeb5d8ba5ab5142e77a35ed59e91f440cfe965d6baa7c729cf219e87ddcea44aab19f5662da7aea85642e55cae1cac810e8ce49c94c99ccc2dc588be5b20033a670bad09ea292df6aed65a28001fb8419a0bfa913f9782bba69d9c96ee5889373a889929155af5a87cd6e6dc1f13309c0064880edea01dda712c0691a2bcdc7a8dd32fd9d35ca9da2a44f5592f67f7b44a519e663a2d9c5b17032bd5cdbeaa0d0a7d36e035512c2eb62b309c35cd4b9408d1eb36395c47f42b69baa83781988d9f9af68c9693d0a2cfb19685467f9358aec464b1a400e3e90b4d15b63f6c618fb20b0e7bfca8b3d223538cbe49551a50f524d8696eaa54bdecccda325b59721ad7040b6dbd9576c28307109f07c6a45f02ada4021f4c27c70ad3fdd457f540fcd71ed041b90b96e85629e021e26b91fb357836a29e1b315ff8a662ceaa88cbc2dae08ab4cab5781264a89cf863656dd54a781afef003aff17b00b649223c61b3fc4ed93210d4083df7f2054ad5f8916a11250776bb474afcde8070a03ac3ab4642a82fd0d8b21d44f9e76c5f7b4306a0afba43828c8f86006948b2a39793e2c5fb67cd36e357a3ffaa4b5257f13d519c84c7e16c014db804ae7b16153b2ab5159a22ee0a8e47d2fcdc0c58a6f5bf55b235a4d367064e0e4dc820982ec17c53e9e09d18cea18a9b89ed4cc921459958cc60da9cd53225ff0e63ed03076fc4a041e6dc7b4e4a14fac99986f362dd8951d8eb7b95d7a28611de36663c2ebd3653358ca005f881c3d9897f0a16e74072eacd5f118d9b2a5efdb9b7b9e891cc2303021a86e3a6c8a1e43f0838d29c226cf57ff04dec33e016d6a36252c36ea35849c8b21a9763f5cfa7921011dab0f91be0ad109e2b39683674bf07674f3dad160c776503f680490ccbce93eb4cfde05655613ba1a611f364a06e2c4a0adef6d9cb79d12ba577a44d7295a8af828c9cc08b0db413592262d83227468524b572695a32bb50bb6910c25f221d1e459e6ed04a760fa838d2590b68433940f58691bdd1f17e25022389e0ea0ca70c8f94b603dae629bccf5a3dd7fafa071d093a0b6d97fc204a4c3ff45e90b1cab00874ad7d756880c480951be64e1ebaca40f0d107a5da0f1d81d059d59379131bb2288c1dcc769827490f4395a5248b4d40e0a1738c6c7df960866c8818bf2f167307a65a474d0e4e7f121d42dae258bd8e368c5f2520a4508a530495d3ac908ef6073ff0c535069c532deb887e8605b2867889a39b28730467b1df045fe000e47e3989990ba1981973806ad4085165a4bc1593924bf2b67ee49a022238f35b57b614c78c50f3931289fbcca9cdcb914d25302c994c1975870e2564a21ce049701d4afadc798e713ade09bd7411a40a316586aa3726e33c138cac22a532ee7c0a93fc9aff14bd712bc8ac13544d8efdfef2e7843779aae61ce72de0f97e7088bb782d4c6e9896a9a7632a536222338323a231b66e690cf92f64e8bbb466abee417ee2713178169814ce3f3cab878fa7828da4eb68c204976587778f0215358ff93d86c9f1da7f5c1a562049cc6a3435ba8543f69b84b781a58a98b04a45c9bf1f81e90db6a5a88153d7df27f23b4aa50662c433b04c5b20103079344120d91c52b119c1bb22f9100ef26cc7d746f92798e276ff8e7ca09fd068f4be423fbf992c0f99d10f7766b89b22c683c64dc34cc33b35d65871eb3f821d063403ed749c9bc0d400fea5c9ac30075cf431c69a462b1a7b219f68ba782255c7e683e988dea42343b4deada812efc2515b95025b3c5dfbd1e36217cb6fd280f0ea49fc22e81368b2a4fc6950ca1ead6c41c756b5cae6fda17481f4cd02a363b2c0518ccb650065be36a855cfb91c4d72196970e151c9429e25dae3d601bcbdea7a8468b85b3b2dfcd06e1a4d8f62a5f9ba3c8de9dd1429530265b37467ac74b3bd920d6b3e86f06b758f4fdc869a213da35b2971ae65609c05d6d6084e0d06e1c838a1dfeb6e0e9981011a7c0e427f88380cc0c2cacdd5752df7ad611a0f182d975ce17712a9cc292b30aa502c2ee3732fa41b2645d9eb76b7d081b0a24508b99c398440d7745229514a28e27a06002167b822982287535039c5f900163da00abc06453a610cbc71752de78db24f47e2841492a81119999032364964a5acf9aec81ee548df6ab3843717447163c286d6a084cfcd2b9f4dc1449111b2b9368afbc09e623171271f8f9ae165710844a9f0f6990e8a43c38f90d9b11560ca380ffe0eb9b59b411e0f65e1c8c6e28f2a1e8049692e181536899aa314129127804e3cbcbb56df21fd5be2c03c036039669bb355c3162a2d55eb00a0c9ee55fdc4e397f151504888d76721fb5d70e156d8a1258c6b39e6bf19bfb5130b57122f4b3b31b9d227e542b7e08768b3ddfc906067efb8909062ae0341bb0bad6e9bba5ed97ed8236beb408a1c2934f37a12f3feb891a1600f14ce07c2e6a83553293ff1441a2ad5e526a9a1cc1bfaa2e0a0097797cc20903967660c36109c602819029fc977350b10d505799971085720cb2c3d0cbb9cd37ba15ebeed57a3444fb18a2c4a10f80bd3b80240124d00086ba8f8576700a84c17239c5732c7a5725b5a22133aa23f7a9d9de905924c9c82c19adb4ea2c5575e61bc497c11f0c04cc23a32fa9a003cecc551d9ea042384a5f201ad5cadcae108a6f41aa960b032dbbaa1a7911ac62da0d819b7e744fa4ae22652b694bcd044772a323281d90205c5d5ee210a6b82251577c6ae0d70c99148ada5170d36751954b0bca23d7de4e8d8a033919278656d6e21f25c700041b0d6296e629f5bb8405c4ff6710ee00e56c1f7a4763b50ca5f061362ceef80e1904b2c69529064cc6b7c5c548fb3b64f259dacf03b36d9ddf5429993ae44100a51d35c2596505a5c040501a0f17751d00d8588369aac0cb8094d3e8b7ae995e87a88d9a3154c393762ef11323a406759431b868e3836867b8756c5dfefc509d8b75ba9614bb62e242becc15a7e25a13b623c0906d6a7a563835424a72c5f0f24e9e428b113c6901459832a3faa68543122575a27282e598e4acb2094be296b260f68461de88f59a22f600c0d4faaef59df66ba38876544c45fbcba2a6fca748dea1c57eb3c297f76d2004cd7a6d2b1001d19559189f29df22407539e9d4a396221bde703d8a83f2aa3c7650da8986bf9018711c782343210861750e0a1ba40ff641ee85635ca4642a6950fe3542eaa1fe3fd05ebee38f56d829c4bb9774623c4aaa54368ddc6509a01ed3334701e80e6774965fd7ab1199de4f99261b602e0d6549df6895d56053b1a492eefe45a0f23c9e58b5eb4af03fa7d6d9ef477a23754125a9b0a8e48f0253de535443e94eb0d9603118d0079697ab395ca1f16c9160c73600dc4bce18130aa31073abbcc1853ebabd656e8d6b432b42cd0597b70f674ca63111b6a2ce57ce8a60fe24597b02aa58fed7bdb80f5343cdfc92a225e8b02fb39eab7c6ef4e5f3cfbbef25b67bf053f58fa5fdab7c4ef565f2c7d4ffaa6a45f91a57df278f53447bbd75979c211925976126a1b251a27ffafa7fb836955d0e6f734b63f4ee894414c595b994e62f69f5dfc09093d7a5a1b410e66c398bc6f4b47a5a07eb14f0cef5a8ecc660f3f7dbc9226d7409b5368f9eff0b0b0c6bc9ccccb0347cf5c992bb49e631458b127ef44c6eb62acd7b203d62621f2d79834a481646816d50cf5669330dbb8d911dff6730373b8ff0674dbd82b6d95485bbf93ae338754ac7d72adc3897e2c41f29bc42a124704c92725e30bc7044937127d24963712a3a2929a8442e22bc9d625924d8c4625518955ca5383447c24aa2bed158073893be9c9b8b4a6a3edb07970af3dde535c082d078f661e3eeec771f892a7c89c475d1e2d3d08f5f8eb61d543aa87411eee95c77615349bc7c523a687821e1e3decf410cee3fd75b7ab207afcec71d68fed4d21c73a7b1fcb800ced88ae215601f185c8a9718ca8e8fea2304402136852e773ef5cc6dc38154709d11ba8328f2ef69ba23cd8f38e0917f7fa4d3b17ab02d6d936067d42722c0d223844530d6951c4dbaf4996653eef3684b379659624809d510afd6d024c57b6b4c4f39aa96ab5c3f991a6838adcf05bd98c7e00db019324c72d133e925ecab8105380e606e7c17f6d8a48295206ef1a84518b7de68e2e209810874e1c2343320a40f1b4dbc21222d3592f062ed80ae8c9a5e8611c534ddf0bacc3d815371278144dc15602ca81bca77d12b599654bb48d3530dfa0894c2a0cec0a33f31ce4b295491e9a716dd2b44043f846b544cc29aa5b420353b830475b0ad4b1d921f2742b8475a9a468637eb2c9724e430dd83247386e389c7a2d01701a0b6127b160a955e938c289cf05c7b3e2973a37ce871adbbdce2e1ab2114a9165a43179437663c6b010db77abcc2786499a1254e337a76a58360c54210ac9fc503d6965dd62437cf0db39b438b5e38219f22413635d0cd2dad7ebb4f8f680eafc362daa48e534991ee59ff25e409cc2097a5bccfdbdd82d9a0af8053c796d80d2482e28b3e47db119aaf2e005942160600ade7379ecacbb61b786d23e501ce9966c9715392a9d0c443b8730c07e787bab84968c58414d7026386141914f631fdbf871078f5baf3e6d6c3d48e16f255407b8e434084640a7c4716e1215323c2666ff88b68b6bd9b11a482cec660cb8586519420036266ed50e4a46870e6a49be064bb1b2fe617a189964cc13a7b6f55350c9e47a48efd563925ba6b746bf34499f85b1ff15f89f6e9148fd39c4839b8f5635a0226184a7aa63ee8d26ee9b4522bf0612846a6fa71cf5a4e7e95cb70bb944e8f0a2083ceed422ca8bf291d12eadd76a283194730311534b83d63c31940547b61049726078751186f9f6808515936e46c375436d78272173d80a20eb96efe242572ba38394724d3b7affe1894e34c4a46804be6ae3a2ab85007f400f4d00ab092d0c802ee0f9f1936b154aa37814cfa7de1542c0e2e67328d7387b3b7615ac044b68e4871e358000f4eeb2736a2abbb01501f26812c729f5cfc034b281e89c10709c5000e29e3ac5c4e65a59f09e34a7257560d1493dc1669ed86e005e7c7c2eed258ffa9cca61f7ae1d1cdb600b5bdb86d501c78206f056b279093c4bf34f53a9f7b40f8065ac623c7389285355f30ae06b429715bbe542a81fb1db278e316c68bd5818da16cd9d2ef063ba5026008fe0acc34c156710c480da7fb0e34668e5876c504a10e8fb7c4e6f07238189ee2d273f5b785ef929d876f94422645f08290457f9b1233676e2b6d51c6525448b06c9988d009923c72398bf297d971300f41a14f2951fdb95a06c4961c8ada0df257e68371bd16c010e43fdc3789c5f671e770f36a86440c45758b44034ff1b16454adf482ba65c0f93c26af075296796c02ff744904ef533db4090cd329522b2053bc24489a4ce527f9c783c227482d9110368caf03081ed464811e98626af381b718793196e6a3439e036c48d52360bec0432f046263ca3e706345dd7c283151ac431b06a5d9bb21278077bb5be32ad756c55b166646b427c3b6a6adad3b7dd5225b3b9af5a103a7d6e99d328fa5b986427b6484f5c5b1a92390a2607ae0a540a68a1f5e8d9193a4fd969267aa04b919c53642753ffe937704d27d1237467a8bb68d66c881de86f74dab694b0cc64ca809fe4a20bb3b4433a4e6be4a3e31d41d3fcac39078512da528f71927d7dc0494c51c15a490fdb2b8eb667cf9e5898d82f57384295f5aa0d761a55f0915048f53ada6d1515c04f93a579fa1d761a47a3639708c398914f465a8e4c3061367ad1368a6cb4da48f46070460b041ff58eb43d232355da918aeb9cc26f9cab1ccee9352a83eafc84869b782abf711c145aff6ce44d10b77ec1ef51193420ced8dfc141387e2c201fda4046f30455b2ab0ddb4036c4541a4a690e27247c29e9e5bd67e90c1627d3e7302ada05801bc118252935b9d6fd729c58552b9d376586f1308bfcccef22092febbd8ed82b390135e3154ea3e7e0fae5fb6a088f70c5c0f2f1d711ed60598fb8e9f5bd388644d7b493591821bcda8165c9ca8d95185676b71ace0a438e9585b482291764a89f3a65e8d499d080b48c851b94e44a410f8d8c0407daa6485209474185cb1711ee3a1cf3ea0dfc4645478157512e0433e4256a180698ce52c6e88255648aff76ee29943c60257aed1187b9a5be03a71ad645440c5c22a8a4542ea834f2f1362820b55135788acba4ba50956084a7ef114a81f87eea84e022f79cb9e30175a4804c444969a55df25710177434ea8a4fb48337c90f0dd289c71f3d0f00214229f0e9a381ce1d38bdef8056cd6e2a67e19850308a02b5743f285e818c56861ea407b2313bf1e9cdf8ab7193622de702fa0e09ee882b84e3c2c085d42f326fc4c423f783fb2a93b223540823bdf4f3762589803485210cdc40243ca219683c6a0a372b6b32ad5fcc174375c931adb1a6d58574d697e45a66fb79181559c8b71f816a90eaad50be42f3f741fdc7057f5e9544c8b8e4d94acda85b543398d3038c13f3de1697219b3407b3519b8d266024ecbcca858d4c3d2788c22b0ddb80641b18ed807b5081df10982f55b10c4cc49ea976c3cff91c73449f665d5134702930e091782ff2f88d7e5ad6582a0d0492edc0f9c3a52f57c00fb20f08e607104f2d0b7b96e92f97211632e90998c85d0fe722d2adb6524728f97f6802c85ea002f3b884379fdf4f23f8dadf5c0582ddce2ef23de637d3bcf6fe6e7b6b495e266b758f847d9d83dd179e38705a9ab87fd8fefb850bb4038a460987e2e52746597357b121ba6ece14ad9c14dcc082aa3d8a5320ec01bca340dc06cd1269c3bbf151efff71bd48901bed4d84905f411f3baf9166d0ab7cd4fb7fd40b20f4cac7bdf161bda88f355d7706d8eb7d4ceff8b8f11a2fb87a852037dce3d5c5bb25d156d5c92020d886c6b87290b213a4308548b3ba0cf6de6190751fc72032ad26acdd500fc1a720eaa4a762a274048c70c3b8cc2c3ed7b7deeeeffd78ffca3dbeb3f8ab9ab7579653a85aac3ff87e421a62fb19b6d99adf42cf146c9967a0e52381cd40bc2d0b75b7098c37d644725581eb609e8cc5c044ec81dd044c49389bf0a85165ff8a24e593f4fff04477fc0c5bb2de8c423ea20969dfc5d95a4db48b8a18bdcb601bc2a6d66c0700d63790155d884e9b4fbad5242e16906233635d2d8d453fef428faffac90deeb00840d88de0dc270024710739a621fc6ac206054925b84a81d3e89f10961b21482f37482a0fe20d0842ef222aca9c29825469a7d5bdf6bff881e13124dc0c6e5402750450015da19672fcc76340c634d8037cccb65a58caedaf501b047c3c69b794a256b5857c0881648784ef3e1517033a6d15e33111774898956608481597398027af7cab65075a5ea87f8909b13ee98a0cf1a40c443a51fa3c0bdb119a11815c7ca9f7ef86f13a1c6fb4c8038c7961c2320aeeb4e758895cab3cddece684873ad1cba72cd9aa3a40283c117722a0d197dfc71833ba3b1bb164a52f4fc7a1266b8a840937a33eb338f33360d475859b1d0dfff8dc3f88190fc4a014cb31b55748203c6ab6fca35a1b1e64c1a3eb2217454abf630c48495fadcf049f13e3306f652bfd225de84581b01bbee778bec44af16e551a87014bf6a1037c61f558233492dd320cabd87ea73802b3237cc792d2e520fd46380fc17e089cab21a84e3aec1e561646071b01731ed38f298e59c784c6a4625ac65c1123505716eb5e22e8ce81d03a7019465d22849273208a9b5b722f77bd37353bb48349da92b91bae90a610fa435d58f7b4ada1e16909c43de3fc97e094c3de8843355c5c101c60a0767679c823b7d6b3b7bde87ac1f262c0196de7c755e705b049e05096ca9a6cdeb141029844fe645fe976a0553c32ece269c82370576322f4ab1d4d8858dcdbef59f6e2ec0370d2ba9f39b8ae1e30766c2cae199eefd86c44759c75f43a2eeafc5fa4092f909c967278f689a8384cf8b0dd3e040fe03c2598811955d1301ebf2c6985e70ed978b83e131afa13c6af2b5cc25ec6e97733292be305b9a537430c2a6ccffcee4904c813933dfa228373af89f71aa0d6d216dc6d2ffff748a2bc0c527ddf106149a52584fbf05a780b8f179782300377280716d916ac67813ac52964e22bf1f453b7595487f3fc078e24c4f35cfac6c27ad708ccdab1bf84a8969bcb8243482399106f3b0a3d280e4187136b8e65811cf974eb94ab2fcd433aac47ddcb36e61d4c0f79f2cf17269290f1f3159e2f75b1f0dee813eca4021e89848e0b3660b46439330f0f0f0f0f0f0f0f8f3121b5b54f48424a524a4aabd75247e420a524a54c2989b7483b7a3a33f129a6c9de6498f8040402c20bc70b970ba529194ac5532a28a5c7a80127ee5f214f5a8e783a3168c07a4a297878ca32d5b663164c8ed729a9f85bf27ae3396c6c60c60ccf614305336698a143166c66448d9d4468e4d7c4823fedaff9a34760c189ee1077731c9d745baf489ecac9cdb74757703a42ca15730a19947dad605f82662425ace3dbc70acecdc3d44790ef216dabe0934a4a664a4e1e3cffaae0a444492b62a954b09a76a742aca8bd6799252a785bcb1d59a994498c769c82ffa484d211377595af29f83af9a33f9b8f1252540a6ee2a65df797284953527016f4925c3f4fdb3419052f2612c54f6645c1f9c5dc94dbaf34e8e0e1e80805abab13420e25bede9b147480824d136356ebd99fe0d4fd57f637992df6da800b68514ed0e1095ebb2477ddc43bc1c41c925f98162dbe419c603d922e696b494d66cf2698e469a1e67e5737d2046fcaf467d7f6c7c8e94c70494fd9e40ea57dbfc504aba5c77b83ada714d24b30392c55292d1ef27f8a25f8ad0c169e1daa76639560547559b885790a756180c60942072598bc41529c1c3ad4e23e6346c724b8b5f8e31b31eb3eac1a6934eaa6d021094ef848c8e1679d69523f414f60c60c2f3a22c1d786082a9a6b4ec999ea80049783526d2288fe11bc8ed021c7ecd31bb2c8118cd60ccbef49d4434f7e8398024e021d8de034e4dff43da943ca0d6211e86004abc12b8bcceb9e47c72c82efec5082418722d8efec7927294b29c9b023119cea94dd4bc6122ef22e0e175d74d1ef051765800e44f01526d3c4cfd095cf6c41c721ceebcba2eb4e372ae83004fb1ad2b43f3c2479ea1bdc51082e67e57491a5ec20042ba23db5ad8e490a5dc0050e1a9e6c98391737726cc720f00b49a530e5a2a26e0c3a04c1994ab595f54d67aadf11085627e5b2720b992de21d8060628d797b55a9945448c71f38a1ffa305b788ada1593fb06fb62629546366d3fbc05fafb7794bb0ccb4f9c07e8c6cb2d4b4072eaa78aa4efa3cbd5c3d30da79a2e7f4f595369a072ebf267597206944060f5c063d12ef2f596a767760b4268d3177ec16f5abc30e33e8a8c349765042c7545a0ac90e3af03958c88a215f4ea2b21d73b0191d72603fc9d131258fef9713904003a0868e38701b2c8d5c1711b225b57ff1451b1278c1c50d0a748e66c0052420811933686400ced00107f672f2159d624cea94ae60a1e30d8caba958a752c8775d631b3adcc0d7c7e049d3db36f023838aa0a116717b3674b081754b225685a05e035b6eaf6ea2a63ffda506d663cea1be7e3f8f9b062684a42fee6890adf92fde810636e7e5a4824cb3b45981a0e30cecae8ae6bd3bbfb69c02860e337071623ecd1c3aa59c45eb858e32707f994d591695e4c46fd0485e943b420719b84b4dc143b2181c5c181f748c814d31668b90f24bed88e4b0a182d221063ef2fa8dd96ec4be48018d30b041481229e4244fe434707071050c5c98fa4d41a62b499e44838e2fb09147d4d94775f111aa91c44a0076d0e10526ad28d15841684613e902a7b5b784a4bb50a1830b8cb6eefc93906369e8d802a74bea5f67ffeef4592d30aafbb3d783e7deb4d0d09105ce72d04188125a648c3916b811faaf6a21bd4d4cf10aec5a0c1dc945a9521347d46105365db2fe0ec2bf62765805f6ddf4e7385eeb163aa8c0bf7d324b093a22f7d33105c6826e0da9e33987d0b09156061d52e0af920ceaed453fa64a0abe880257a36e528aa8a3aff324b0fb4107143ccf5fb5fa136dd0501e743c81f7495a993a7a9ac72cdde81518740263df1aa4c5b1bca63d4d60438f6bf64d4a3d05bf461adea083099c1cfba469540c9a7a61435b80bca0000ae00e1d4b6092d6e49a827e97b549097cad779654913faba808858e24702ad47b2d54590ee16f193a90c0e71044c8bdb1f65dcd11b864392d57cc15b91742860e23f0b529c4226e4811f8c937713787e7583a18860e2270c94a9d48d14e770c818d1fb1b5e4256971371a2dd00f740881fb4fc24e488aa03cfb0e7404815359a966f235d79368aed001045e34770a399ba44e3a2b56e8f80117fc3d04b52153238d469d0e3a7cc076a4944a074fdd7b658db416acf5800d21966bcc53513dc303fe92f6ca1b32d4b10326e6a6354f162fa7d420a043077c090922ea256f8624e580af983daee4b30bcf260eb8bca8a34fc449bd7f75dc805352d3fe7609ad4ad7068c52e33b4144936be91b1d35e03c09fd697f6b9dc65423cd4632d322030ec841070d18b7affeffb190aacf8213622a88adbe27adb194051bb7bf2bc62ad3696e0660c4824d69539e64ab1efd9297b0e0bdd7df630c39e60418afe043bcb451ff25e84b2379d1e45cc16669ab6822061932556d048c56f0371e36415465d18c16197080b10183158c655325a3dadd5b560b2360ac821dbd92ae2fa7a42a7acf8dee95ed2e239b0418a96054a4c9c9f2078931a660a082d5089e9d95a2ed22458b2db4d8420bf30818a7e093d2eb2d49957809cd14bc4f4e5bfae40499925a0abe45e69d2521318690cad17e72dc80410a368b7efd90745809114f41c01805ebd9eb7df1828aba9fc11005fbaf41dfeb4b67356d8d2c2c1a80110a2ec4fbced39b2b928ae2e8030c50f0ad31c7d4aaaf9553e4e200e3137caea67753be9a2fe8a400c31368cf76b24dda453db5000010303a91a7eeed0ac13c5e3f80c109f6433669e5c1e2a9bce826b86c3a98ca21f754a4cf8dbe40299a6033fe691f9591f2f51f061899e0da6fbf52abe4fbab6082d3bfa395426b525a62b904ef19724c97a24e12ffa025f810b47defc40ede2eaa042754c794bc36e9a98a53820932fe645162b973266b128cf726a96ff142352b0926ae7ebeedbcf4b596014624f85361a75b7df6714220c1a5b6f4a4b324791e458f60f3ed72cc19b9bf73c411e40fc1bd73f746b0a63ba3a6902445513a23d82a4b5dea679d37ca4570327da9a4529922d8a094f64f113dc97037115c5e6f48c132e76bf8886025e62b7dd63985db7b08ae93e98ca9534ba5983704db9382f9067d39f7ad8560ef93daf2b28d105c3013135372b389b006c187875022b778cafb7bc31004bf195ff3dd0895589a0ec0080497f306cf3c75a1f29a040b3000c1e48ea5cc2649f78ca32bc0f803fb9927e9896b69681f0330fcc06898876c17327ddabc0f9ca5b6564ca67225e52f1060f0810b9195d734e7db905335d26ca4f4018c3df0b962e6deca9962d10327a964f2daf423b7926aa4a5d4346c24d30318796062aac98a936e6cadad9176c34990bc0bd4010c3cd89ff95fb91e52793968b4e0468e25598071076e82d4d518d592aeb809fa0476605c84ceb7119279bc8fe100461dd8d2a419aa555474a7d448ab1bc0a0032b1a24a49cb2eaea8e36ca66ccc0d145172968c0161478038c39f071640ae197b264f2a01a69280032c090c3b61be32565eabb730088028c3870494d44dfa4a275f90b07f6b3a62447ff7f48ad1a09da8b968041018801c61bb8f83d312ff807bd34ddb08132100b186ee0b754a760992f681c2260b481d32f4fb596db647c370301830de5a997875f673c598db4b741e3d0c05803a7329e92372a4e022fb830247f80a1063ec4cfb94d6ee6268ba681ab89f599a496d22112c3051868e0feb285b28d24e35ab600e30c9c45aad211a692d000c30c8cfd071962d41ad174712307a2d18243a30cfc7b99672b4d3949ca910c30c8c0e6fb243379cebf51df301b03373ad2bd2e26494a4462e044040f7d15d1a46a65038c30f09541c8b6104769a81b0c7c753279426e48a9319906185f60fb5fbc62975a47fc6b24046078e11113c9fef9ffaa3287d105b6d428d51f5754d0ae6aa4599a4ee003341200830b8c48d7a98269ee18ca13dcb8a10005cc98817c035d74d127c0c08c195be03d87de9e28e1e96987a105f64cc7d041ec3e30c0c802e721079545971a4d8f1d16d81c796326216f185740e74c1db28bfd56e02a66f68a0ec96973ea0930aac06bce6221a6f206993354e0aa468b0aadf89a9d62028c297039a4d32a414bff27111a0f6048814b49640ed31b31e8e93900230a9c087a2fc4d39ca43d9f000c28f06a6a44ccc94d5d502a3304184fe02ba69096f49350e67921c070022342321d794253232d078c2630f9c72af37ba8a568aca1000613187915d4af36a95cf5daf8c2d1043096c08e96fa9873df35d26ac050029faf3fad093d31a5bbd448c3190148f068059bf52d66ef901923bf1eace06aaf764210b9c72a188f9ff4c5948c9a6378e0a10ac62a77084a4491f719d3399a0137f04805e321b2c6b0efaed31954b06dea962789a6b47c993123070e270117094fc16a8af92586a89a6448c1c0c3144cce7275f3a8ae79548f52f06ada31a4d51f7539b413f8000d16789082bffd0e3dd31e09ccf01805eb39da26ed639d5b4913f8008d2f3c44c1a68bf729df42279d6a90808b1b34be7037c1bd4728f8ecde762a4ba06072e61a75f22d9fe0f45bea88dc9954d248199e073c3cc165ab77d027833c61f94eb0773a832cab0921c939c1b8baa88852f24df0b9e2080daa214df0216c7754b724ef0c658293a63ab2a6ce23f53e98e04ab9e48b1ad44ab29c4bb02151c342ecd38b765b82c9a92a497ecaa2c6dd4a30394d7e68087aeddba504374a2d26097253fc5d27c17f8dd08ea0a5e67f4a82cfa8adf7613196dc4d24b88ffeff9699ef7e3190e0e4782c31cf1174102a8f60d7f3a71ba5c4930c298e6035d46628651db61d6c04971db7da649fe7df8e119c4a4149b3d32f82ff68317ca32711324811dc774e7921672d119c8e57e90c4ac8eab210c1a9a484d4f862a534bc1a695e3c0dcfd13772e038880bf03804aba1f7c1c79432dd202f52d080b3f430041b736f8e9c4699f6da0bc1e656cb1d25d64ab6122118f91d6f7d62e6cfb11e04eb112be9d19f20b80c49738f504b1de225106c929982b0af511b6904045f7921f7e9789327e80f8c6adb68c7eab7d1cec30fbc67045922aa059dd85d7af4e13cf8e0b1079b31060f3d9c7aa33fa5e47469c005b420c7068f3c9c071e583d3df244526d2a6f907fe1450abe01382640812db4d8a2015a64200236328064021fa021804a78dc81bf0d6e5b25a2259196871dd8fdd7f50e0f41e3df1e7560cb5377ba9c3f5552e2c276e0410746e926d55deabf23a95c0088e03107ded42c4ecc7d3284ea75f09003ab6a31d364c7a0db937160d399507949b5396c64408b2de0c05bcee94ba998ea2f21273cdec0e7ce23fc94d64d88f90624e1e1063eb5e670ef5c9a438ab581bd931f6a4c4653a173b4d8821cc2830d5c9a103fe4f4e59f7d6468f0580397b32521c57cf2070f35b0d92e53f576877c927273f048039323270d41b99fb7bf72f04003939406952f23581eef68b4c1e30cbc66cb6baa63c94b9d3703139210adf71d595a82cac0ae07e193840613912032f09d95425afd6360f2e4cd21aae7564c550c9c309df933b7835fb084810bb5b2d21002031b9a2f495745be53ff17d8531aa4b5e6eceb96e405ee5255b6d6dcd0340f011e5de0367b68470f1616e20227d2eddc37d85b6074eedc9c72b25a60ec46d5e999ba9c72cd0223ccf46de5a6e9742616f80f5a91b3d66fced75c811f11f57e5267d660b202a355edfd29248f6d972a7059416d95ec8c1a3c4205ced6f2b628d3794c810f3993f6bc9162324f57800a1e52e04b480b3d5513a4f5ed110576f3e514c735a45d4e99c0030a7c861063984930eb9026e4c2e3099c9b4e22688eceaafa3b81dba429a7984a9dab83155080210ef36802579b635df44d954ce916e1c1043ea46c9aa563e6b10446dfaaa6bf4a15aca246f050023b4282dede5df90725d982471258f7fe2816af3ddd5624703bdea7bfedf4678c68c1e3089cd064fb7d2d2286c9088c29c91a52d4eb0a1e45e0236e6886c7495a821c041e4460834c49176c73fe7beb31044ea60a91738a71250979088111312747b5adcc23084c122aa44cf22a0f20f02121c7b6cf4954f7a6465a0b6ee45063c3e307ec7dda34fe39a66e30053ee0dd83728baf21dd644b8db413a4007909bce0225be0d1035e350615834e212c49be465a5981070f98aca24b34da6ae51e3be07a5dff4ab958238d460b6ee428393c74c0bd8f10aab27257ea9f032e5db598a794e57a4133669475c10307bcc6fe2e3d6ec07e5433559bf2353da7461a0d1b393c6cc0267d6f955c9e46b68b9c056e47c3a306dc45ec51a5ac2d66b088c08306fcf7a6a74ee9e324b8d135d02c181d3529ffa859324991460e1c292841eaca400c59b0f9a2b3a59be853da353162c1c64cd66964ff38a41003169c46ba9c41ad826e88f10a2627156a375fd4158cf4aaec20820ac973e7857371a3015a6cd182193368588c56c46005e36b1152455256a95b05d7d93dfb3e6570f71055704aa64bb13685f869cc18a960c7dc3666f7a9fd9ca382dd08c94e6737113b055f6661f984c590738818c314b9aa55e52c8dd1d42ca34ed618d26dd6766aa499c0868d1a34ba485cdce1214629b8bebc3751ea79498514c4f4be979a6246c19b50eaf52b8735d2708b1a39b8e0008e2eba5080165b68a1c5165a68b1851618d0220311d0824999ab808b220a46a407b5cba6a2878c8682cf2721265332573140c1e51845e5ec4d9a945e7d88f10946342519ef3bd4b37ec4137c0ac9b736d6a89887189de064ce75fa3ce48f5613ac430c4eb07e9e3668d9654e21493818b07088b1093ed3636a11a62e52e50a1b626882d7789692a9a568b14506228003c71a62648295e456ee27caf276d4628b2e1a139caa84549a218f5ec9b900a315625c828d25d4a5b78cf55a1e4b1435a9d363414670e4701c38ba125cb692b13b6f55de2053236d8d023128c176fab84954526692a449b0976152d46411de16920497432af9313b4511033122c1a9bb2074eea0b682ed376cd0b03b400c4870d952ac8b56e3997edc0208311ec1a70f96a643e893f96b4770324cae5725a9d9444412a3114c6c537aad47a6f4d931825127db2f4af61c82ed050d37bb8bb10836e91c159328fd0e221e85188a60cc738a693fe2798960f74d88a4d01ef48b880836289d79b2e8e468216bc1a1c145dd03ee109c8a95b7c4daab9166086e4da84ea9757c73eac210a310dca53549323b48fa3d1182f114abb64f445cd42fc41804af6bde71b437444e108c972a59225e786bcc6ba4adc0861781e0be53d49ecaa2e91ebf91022fc40004bb9e556ff1b56bf207fec2bbd2c8bdb30c215088e1074e864ed0aa8c90009f10a30f5caab547d172ad97748d5c420c3e303a6811e11b74759a7a0facb85568868c9ea3c50fc4d003a3217bd6504d4b22796083f0902e3f2fe95c1762e081dfd35c53c29412ca3bf09691ded36f8e88fad8e18b22aa73fdf31a69756077e455363b9d0e5c5fd4117aae29a84cb939f0f6197244cfb9dc532907ee2a6dc516370b1762c48133f5a733f7a4706064ceafb42b421be30ddcc4cefe65b981bbe0be9e326d884fbe0d7c1c25b24ab610830d7cee0a524f6de7b57e6aa4ad81fffbecff4ce376e5500397634bae1d93c68d1b9e062e9d4efa13cfa0611349f7ca83e40c7c9410724e976fd4c5941a696660e4e94b2252ccad0c6cbcbe9c734ceb924a9aa3b9487e821b9ea39c200619585189227d6d53236d0c671e59694a2d0656638ab9c9ae114134b00431c2c089b098f64352cc3e18f88f16169479ab4d8e91408c2f302aef87d2ccb92d6e9404de8517f80aa9dee3b9f1235d606c94e609e5f5e29ae4029b73cd6d4cd828114f13630bdca9f10c95a216626881510b651d923784329d2cb0164310125c628658e0748a3997a8a0235ffd735760b29fda6ef2743926252b701f2aed2c998a355e57818da59134354becd1392a303a07d3f9da3b2429b11a6953e0c2c7ff3a6a6ecaa954234d0a9c950c49a7ccbc4446a2c0059d114385b4af13d51a696b218801052ed365ccb81e47984fe0b2b86aba31218244538e14d810410c27703a66a769319926b0a33d3f54d289099c6b6b277dea2cc325303176895e9126253022b609ed96df22799e04fe235b4e503b2652be91c0a5da65151162e63ca523f0f6499d5263954da79206621881cd74559335bc7b3f5223cdb010a3086c5ace7fb7691a3452fb8d3b33821844e04352a9e933aa246b085c4a7731e9979043525c084cfed1e29152a74d9fad915670e4c061e30c023182c06afddff5be8554c2d222030ec84004baf8e2040f68c08c19ef89860abc701578c176851840e02387b5c6d5fed1efb161e302c609317ec0a59b6c95b4e9bc9bef183ee0eabff7278d27460f38d339692d57a8a044bb80183ce04d73e59113a4694b290d2b7a88b103463d3b2fc92b0fbb910ef84c32e68831b988a63a07fc6bce5477fb49e4d662e080338f9c5493f73760e409adced33f1862d880039c08cf9b25e97bec3e158cecf15477f5a5af4605233f6ad67442648af6145c060dd994b6ce501353b01edbc264d2e9631d96825196ddad4a65fff6470a3e68d2ae4e3712832419551b05ef31d7c79052ca8f1aab91562307172b30d645a30c5170a9628c1d42893a335d8db44caa38b6033242c1574a224529710d3223a0e03ca449572363b02ffd27f810ddd5d77c927d9072514c8b0c38c0bbf8220519b8fb820c4fb0994b748a87529f773a199d6092f0fba821d489dcd5066470821beda5bdffe287fd65a12063138cfab497fd2fc752d76568824d21fd6eb5780e299a8c4cb041bbc44bb2490626f8bf20e4e4d23b694bc4041997e0fc3b8752d7cfb5ce58a212ec45d7915ae973ccdfcba0047b27c4d742f2c89804fbaa27d126e73224c17f8dbd28cfcf2163908c48305a2a5f8f4e823e2a03125cacf348224ddc2ec87804bb7efb5927e9e4b9ef0826fa9b66cbbe89a7f346706bd9e79a274670275f456d1cb9d79d5d04f717ab4aa915c16529a5cc3b79ca5ad944f049e93a11dbdc537244f05555715b63a52c113d04679f4fd4784ac92b260dc19e7a89ff1d3b3db68560624413797dc44ea247083e272539550461f69a41702129e5a9b7b1bf4e10bc650a2a684fd5039c2023105c7894689faaad363f37640082af3e15f33af687468e147c91e60f6cd75a249d5367b3f2981fb8cc1941c4d5f4411fa5566b5bf36b5c1c4f34bef01b5fe05824c8e0039f2b55ae05197b40aded84f25e53da480603197a60edc5f4b49d87a4cf3379487b9bb4ef3c92aea3810c3c305a53e4a9ac216e6db0469a17ed5d2075818c3bf096d3856429febb586d59906107f66a74529d3585a424c70b1975e03ce4f3b428f21a8932e8c0765f2a33515a3f9ad648f3c2067216b8c998039719d6d9e46a726074f342551c292a6e70780964c48153aa72678e1fd93c66ec0a32e0c09a0875a5335310163926e374c173bdafe3062e89147c9372977c226d603de22515c911e375cf062ec8f83942eef1d0a0b30626f88e760941d6e566d5c09d4649232ff4594cc934f05d2aa297ba0822f468e05cd2441749f2abd233b0e9af36f456e4aa57ccc0e7a9feab495f414e481978d33962b628f53e3224039b33e62c495a8b0ce518380d316ed5e8ee754a254186183820230cec6d8b16111fa920030c9cd20d79a695a1fd5f20c8f80217f2b95712ea933686d0f0027b1a3e3182b264e0ae0b8c12215510dae45c60359dc817af94b6c0e8a79c1bb5d4f77aa405de5cdb74446ada484159e0765fc732af57e70e6181bbfb492b5a934e10cf15d8d4ea262ae5ea50aab502174be68d21a8282ae25a054e0615d5be4f757fe7cc9821830a7ca84fc1c44598104a3a05b65b35f6a4cea14d4c2970e3253b8ddb8b484a13053642b45819dc4424cb4081dfcc1e2a8ebb2425234fb82f67ee04eead83762a4fd9bc824d6024e75869344529e5392694efb3658d29a42c81db10aa4fb608b5053294c0d6ededa72f51d1b93256909104fe5350a1a35208a9420709ac67b869485abaceeb2338d691d35ea669047ed4ffc9319d9c31e32c0e328ac0b85f36ddd490085c7f705bdfdd5279913104fee45e0e35bdb0b31b0d3284c069845c55d922230849ad749dec723287175c68e0466f607b200308ecc4aca53f758a3925f90363704b63e6dd1753b620c30736c368c8e841c9e0017bf162d555b56ffea406942063079c576b281d7453788f3366b4e0460e2f3c083274c06a66cc3984a0e1a6fa1164e4a0dc7e3175ff8e051938b0b345634e704d31fb1b6c29659b670649deaeb962c84f8b20c49b820c1bf09ab531638990242765041935e0b209194b8aa56c70c181e43366e0281cc8a001972a7808edaca79de41fb3e084243522869cee8490f990056b23729b50e1971c7cc482512958127d13359b5748830f58a0ef6a820aaa57d493b49a3ccb1e4d57b062a7720a3ab5db0a45957a48c242061964057b3a66cc1fdfa4986a6f7cc102fec286aee224355228212fbeaf0a540a75de49fb099954e03f298f28212accb415c93ae8ebd66e9080d8ad59093e4ec1a78ed0a31282d0112153707b766934c54e29188f144b7e1c99b4a73429b80dcb2958688ba697320a46e9fc60f92a9ed3591fa2e094c79f9433fb72d3130a56744e4a59e6a0d1e20414dc79a83e0fda8f4f1462b28db1fcdbdaac91863a840f4fdcd9ad734d35937a1df8e8c47d7082ed3ed11925d5fbbbffb10956c5f24788e62e2ab626d89cda749490d68f4cf031a78da619417aeeeb295070021fa021801b7c6082d3a172723b9d3ab1342e6ed820c11962fab804671da3c6eca492363dd6489b3163c68c0e68b1851612c08002dc1b90fc4af161092e5432f5ddd6a07f3c3492175cbcb1c0d3096cdc6840f2828b06ac81e2a3124c3aaf9843997f8e9bfda0046ff6edfaabd19304f524f8714dfde9dd2aa693241811c5837787de3d8f44824d31b9566ae7cfbaf003126c2ea5520ee54978883e8271cf9e2cd3bf594efa8723b832fff8fed9f4d108f6745a8d765c8b91941f8ce07227b73f09f93a7ef063119c8668ca4c89a24ead0f45b031f55b5626a5f9d6fc48041b64c829e59cb4acaf43b6f0810846e555d08fa1ea53c80fc16e4e272187e8c3106cade68e8a26f4c4d41f85e0b3a6ca9244559b90dd072158cd49f976f613fa921f8360b527dae9d54b3db9fa1004db16d4494c8baffdf98f40f0e1c9e4269deb0720186dadbd1d524c117ddb2f3efec0a80d322c5e103d513f303e29650e1d7699bcac83c1471fb8b8d7975797e927311a7ea38fe10337d69de4988a8468e11e78afa0df752ff8a107ae23951069554bfde9e0f8c8036f1f2b92f094f4c64e1b5d9032047ce081efca6b394dcfc23bfd710756cb4d6f527f69418ee6c30e5c52634adde8e8764ca903636d52cf723a912fda0f3af0312499f39afe1f7360443a2d3f21ed36c6fc871cf8afa064b2ace79dcef2110776829d483929992a09990f38302a26a1e3e8c9b13ac67cbc8151dd793ae712a279ff0f37f021ae96c689e2973c79818f36b062ff914c722af92967cb123ed8c0fe27fd1b542acb7c9f123ed6c0c9d8a984d20c491c5cac171f6ae0fa4d997e0abdcf7da6c166d4f840032f9a9521585ac82dffe30cdcc99824050fd10f33701e296f44cdf6471958eda02455068f9653f0830caca4d8c9d5c61f037e8881099af268efcd787dfb4718d89c967b9f2fb5ed8a3ec0c0e7a0524a8a9b4654ce7d7c81cfec761df32e5161faf0026feafea22eb21f5d60cc3f075315838841eb35d2f04a0d3eb890a6a45649e70d8eae912ff8d802efef9a4ce87e2c65f91a6938b8282df8d00267e95e35d384605b1678ddcb11fa29c898597917366ed0c002ab959b4b42eeed3ca181830bc2828f2b7039989652d32935d2f0c30a8cb0cbfadb552724c96ba4e1e81af751052e26f389969ade23bd393ea8c0a99c838be7f4a9c24a16828f295c7d4881539ffe63786f28f01105c6b5cefb92e9943bfe8002e7aba669924ccbf59c65c2c713780972926f50c92685c8096ca520d4468914dc6296081f4de0ececedcc474a0e8f0be183097ce50b3afd268b153f3880f0b1044e54b99907e996dbb4317c288153f25ce28d6b08258307868f24f01394298d6216eb24db850f24704974344fc1f25d2afbe3089c9d7b56a8a7f248b9113849933798e5ca471118a51db47eae8e296e0c143e88c0462e2d42771aad1ffd6bc2c7103895835d8ed61b5397324008fcf7557592a3a2dc844a193e82c0e8ed52f23d8af85b3a0c1f40606f54cec1e266d3d3e7fd80310f26477f1041552f1f70935f538af8d9470f88de1953cd552cab32b6c7f01c644a2aad91f67ee3cee40a3e78c0beb678a50ea6c55fb4032e551295830c2a4a2cb50ed8108fa2b565c9d19e02143803906f60c68c1933707861e32307bc85a45719f69124c4940b1f386063d6179d379fcc6a9d0ca4143e6ec0fa96fe98a23fb796f861035ea4a80fe22afaa8011f16aae3ba994c42947af8a0011b928520ae51fc63d299055fe7aa5e2a043bb1943b78c88211a637c87a3b8b6beaf400128b42a98d31e8178f153c60c177e8535afe1921063d7905a752b44eca21befe8ece156c0e52fbce621c25540c034660b246ea4d3ddfd6eb8bc0d9e438923de514ab9e08dc55bceb9359a6213f04467b7fc8dcf974d0bb10124a973e08bcd65f32ede974aa4060358a12aad631acfc01db5bd9da366cb3877cc0dd081935633c1573ba075c44d752625a76223c60bbdb2bfba885d276c0be08116c475d94d4ea8037e91fff4348b12d25079c1275e341e898f7c5019baafdb5d2ed4e94dc80094a8688faa7367fd006fc8e8b0879a38abed48051a35bd9399632b402d080514987fc591b29f7b3e072c71169b34f845616acd768659094c782334d4987da0e0bde4d4f92a04fc96bd32bd8db20fb3a23858b5cc1c65115720e21d3d256306e4944922521c81c6205ff12ad5acf4c4d735661b2e0aaa9fe2655f09e7f6df487a454b0112fa994dd3c882c49a86054cc1e32675db749d22998ece1a7b326b72c319982f5b8a9a28fe54bafa352302a640549dbe2dd3a22053fcaf49b0a32e42073340aced33f9b3ca5ee4b098982b3e0b14a864877a38442c149d09031e974b92642a0e0c736c5fc63a15f1ff409eed426a6679ac674234f70597db5bcfb62451a3bc185a8ee649ba29e082758f3ee64ff7b3a68bd092ee55431b5e8e4f94d4db019fdd3645e6a4f4d2638f59758ba2ca9fd10136c0e6e962aa86a3ad9253879273f830a5132a7902538b7aae41f9a45f44ab09f16646fc85322bd9634b7ae3e097ee3faebe9cffb133f9260527e3a2d6a234acc23c175d61c2dcfb4165a487015761f43c8a052c4a047f0174476915b11a3ba8e6037e6760d2286598c368293f43ee249533a9711ac9e5a456c11a96d2e82ff4a4205957e2ad75404a74ac6dd74ffa85f2682913104d1a33aa2990c22f8daa04ee792f9c6c2738833ea7bc7102891b1f772af5308c6ef53e9484944ca09c1760c4aa8d1f126c02018a55df42475775abd092008cee4673a61fe23e4a809100836bf490d299dd4baa0260020b83eef0d162d2c784e13e00f9c68eec578e9cb33dd04f00313f226dfa46356fa7a1d40803e70fdaae555793d8a960f7ca89c83c8a7ddbfee1ed8533a2664ff27c9ab1e182b8d225cbf4d4c9a07269e59b020647b87140f8c502a478a3596fdd33bb0218ae6ffdcf4aba71df87fdb10849e75607469124ae7ad9c7d3af0a92798a64f4977690e5cd0294ab6502b21c6c8811bdb507a648d3e691cf851b5a3e3a83c2584032333d3a95fe40d6c599239ed836ee054ccf27b450c53b10d8c46cfa4bb535e8e1f1bf8f4c9a37e1b9244afd7c0ad5e4e509e1af8b48dbdbb9252779706ae425c2de88b896b8d06fef365c59c381e72aacfc086dc78d994a87863b51958fd98eb4fbf5344be0c9c9b4e4fe6fd92813753e331df6fde7d770c8ce7a9241649589eec8a81c99fe65a22dd30f07e2295debed62475c1c07632f97f7fba5d93fb052e6e9eaea02c45af5c2f70be25bf53ba0ddd97ed026fa6f7d2225ab0bb2c17b8b4e69daa73251d25bb0526b59b97855467fead16b8cccc9723699294b4cd02af31fa885930192fb558e073e8eb9ca87fbafd15b8ac29079dc5ad2e7b2b30229e43b036e9fdf12af0df1dec6490ac224a546033849482f9a46c6a4a3d8d9b72ab921478d39bb3461b09ea465160db4fd53ed8a649395060b37c54f0c8392ba69fc089144aec4bc809ecba68f8abfdff649bc09d90e857f1e4df4799c0a88adfbde5934a2f4be0fc42e5de88d257224a606cd773b0d34147962481cb4f2aa2aa4dc5844860f4a5dff020fcb67447e0f45a963693a4533d3502e7172632fb7cb3e6b4084cd0542d2aaffba54d89f07b4abca0623f0436598aa2eb34a488bb10b8917ac1f4aa53043d089c85a85dc27320b0eb5b17cd6bb3b9e807ecaaa94b0cdeff29f201df22a3c9c8d9267fa807bc5e92d57f5726f38707ac8a4e9a4209ff08393be0f488a42dd557c8bf75c004616aa7195295da39e0324b1635ca2cb969098003d6c6a4e8e9ec66eb12e0066c90b4b6b6173b882c016cc056b0983ea5a8854509500376cc2f5945ca909f24000df824c382e6537b92ca59709ddfa53b424a7e1759b076a6b641c60c522bb160537373b5a5dab44ac28271ef60b28469935992af602bfa75bafd75c82d5dc19767325532877c3995ade064a41cfa3cd5534a252bd82832e56e92af828ff77f27732d784852056726fdad3e948e3f4a05639bf756648aa71ea182cde5162258c58b203a059f47f209a5644a326f53b057693de7c71cdee952b041e5181e942865272505ab19644753fb9c951c05ab9e7b629be40e188028f813e969292d9a90985070f9b369b3112aba33a0605df3080de9ad82b27c820d9ea2acbcc4ed2a9ee044e3998a1576824ba52767df585fae71823b4def29a538b6fb26386df17b4f838d95ca6882179d420a3287ce142d93894e49ddf7cd31c18810fd4bfee8a5892ec14634f330f75882d5887942eeb7128c58048fda796b2f4b09d64b42889663b77b26c1f6ada5e7ae24f5488251da368904275cafa4e45ff59c16487035bad56b928f607f37a7183db9a4be388213b2bbc472d48c498de0f2ef5a2df3525c0923389d2ac4f4b499b4bd4570a579d3798cd1f46e8ae0bf2fc6cfd024a94f04134f5d4cc92cf305218249e199cba2e6113987e0437f4fcadbcf905531047f52624816c5358d5e08c69274fdcf55999a44083e95a70f593364af67105ce6da82e0b296ce9cd492403021e8da8b360920d820f9435dfa482195e40fac961a651994702d11e2076e74aa3269e5153b47fac08a12cacf54be897d113e70faea6a748708d1f13d70da293394e4e49a263d70d9572b4d06397ea53cf0ba397a7b42dea04a78e0255be5a6e5fd7fe80e4c7c5f4d13f3b8396407fef692a759882d1eaa03ab55c2237be8c046fdfb1c648890b4670e5cfaece6e37127e7550e5c921d446853d58b6b1cb8c929489cb89722513870912708cd19a2e4ade01bf894e9bfb265ee0626a8a50b12b462d0126c03972a752911dcad830ed9c0af7f3c0f31e5f59ce11ab8ec987b29c343c8ba1a38fdb739bf47358ba932810fd020c100d2c09659ba9037d9b77fd0c0a88c1c84ec4dc163e70c6cbacba944e47676d70c4cfcfc94acc192d4b60c5cbccdf849cc92a62819d8bdec185449ddbb730c6c4a691e1273c8184d31704a2b881034ab4ac78481ddea949426ffd5b380810b1e3d8bc48e6842f805be4b822a617b810d6d3a5a43e78917ec029bd449cd1e6348ae8f0b6cc564a62fb40546a50b6943c94f0b40184016d858395c6428a1165387055eaf45555cd7d45777052697c7ee4f1983bb6f0546a89b8a14325ee8be0a5c341d4beaca2df26e546034d9d88754973aee53e0b54308b9a69b774752e03c6ccbe2e6f5e09e28f0d1ca74a6fa483a7aa0603372004fe0b3ed56d079438a41ea047e937abcba4e96f45e9ac04f2e254547caa55e6502e7d9efd746dbac93b6047e4350358f9272168b2981c9196a2f51f34a12b124dc5929a8a44c6848602c990613f61ad2373b029fafd6f92a42cc296404f63b6e124ae494497e8ac05f87b2e021a6a63d4418c0106c86090620044647b030192369d6741058fb1e151d2d6e9206022f4a74fc983b6e08fb078c48e2f53d9a6f93d6075cfe911ab3d268d5b607bc9a0c5db595079caa0afe41f6968cef809131bcdd2c7e854cea80ed986e25541c5d269303de2f8ffe18623a6d161cb039fde37a5ad0a32637e0f7b73f834a9d43fa6cc0c9f7cd394ac6b425ab01b79b7a5574a6d8e901d08011ebb4ff2131df320b269d5abf0c9a6a4177a11690210b26554822a5309142751f0bb6ededaa72c5b0711d169cdf7755f06841a8ca79057ba2927e4ac2e30a3e7de6f2fe2b916de956b063aa6962bcb4b7cab082f532939e2d5d7bcaaf82932cc1335a44ffdb8a2a028daea8b4b065e2481c0e0643c150300c86e193d305f31308001838268e4582c188a0c9c27c140005462c344e3c2c121c2222101a87832261181c08048461302818080302c140201c0c0fcb0a3d0f70ba8f5f491016d864f976f89f9f6cc6117429941c168278c0b9b07d0815e404de0c45821520e670e1e5139aceb8b6510afd64fcfb39e4ce9fbb2013ec291e18f7c24987cb2b154ec964de2daae97b54239ed0ad7351dc81fbde55ba856e92bb72ffbb4b17c79a275646910142c82f341eaa41b97b68e27ac682828f1c8ed83a29f60620933f7c98077ff8c5c23660953125fc191e84fbe020fecf5a5be93f0b2486d02df86a78cc77b6b8e483bdd94b2bd69876c18ea9c3e9b8bfba31ecae906f3034c80c7a060782f402fb1d7c662be5a09df06fa80eac0bcd3aae9906d46562c1d45d0c3f2365681b6c0181b3efa37c48116e0115b0e65eb8022fc6863fe4a0d763f8b5de50f777e8caca8096f7719c8de7cc137b751e9237f21e3cb55f4d48255409658606a28d3c6a5412880d5143821c3e4bbafbc486aec342c3dd306a78126e0943c014bfdf2fd9ffbc768945ee80761076b837d7b9864e17dc05fc42e2a17a082bb419ea09417942cfc88b78ac3db41025e402cd790bef83b7f570dd4f45ca0b35c1c20e81b9503d647a987a15f4198c099742e804a3b7063ce5b68c772b397239073d8303417a81d3ce2f0b9484a6c08f50cbb5f9557c4a2e5edb70cee08a250e1e1d374c4933347bc6402890220472ac522af9fdd060527b71f1474ca16e3143847d0023a34a28333400f989c245b4c8f72f13320909325cc1b101a820efbc43c2d5a4655adf62fdfc53d0f5b676af1c79cfd00bfe584299a141e82fa41eaa87cc1aeccf08436b9da1e03067d8273c02a7287f9a631cf4bf3f725e3cf5cfc5a076eaac93f035292c16b610ca441f2f119c84a661ab00cc102774121209354308a15dc876c2bf01dc48c5f7512f285ee09a81af08882f2eb120a570cf3f5ac4e9a94703e96d4c5ff2c32cec270550797e4294904b8893a0065426c1af2b1c83ec1fb8460349ff27e0a12b72a9f95304a5fbc2d961f4a20629415cc068e654e214fdb546c9c891cee1cca69d54c4a07118669813ce09e1de0915941c0ce00fc382eba0d3a06cb01a44014e82766a5c03693bfcd7112c0272d12f62eea86ff4ba7b6fbec6b15e309a31356a6562f1ae8badfb56acadcd8aacd5cc747f2f97081490c712fa1c5f8a39ee7d7220591a2265feb4b715eb5f0e2ab1021add3c48f29fa4b4f451ff77bb3c8e8c08701c73b9772e720a97b8b690712a86b69c3875324825807cf72b681be8888ad73b25e053ec152aa72a4f20447dd9e25f5c4f910f5f588d9d391373a491bd0f4807514725378a640fb1cd88b9917cf0329a302a1ba8b535dba013232201cf5a5b87e2974edb1eed80a2aad8f699e8aee1773c94cf5df2063acc00c022b9b900db54fb2fb96be32f8bc82d66c77e572182a8c777095db6e84879f0c1c4b91fe6443a4ad5e4722d66fce13534d8d5ca091de539a65b59985e316c2a8cae81fbcd2ab326f80100310aafd155cb3bdcb99ad4ed9a9cc445b593f849c592be9de4ad3ae91a3ce030e74ad4a5e55c39d6b5faf9597614b79322e58f91828ee657da92d9531ffd93648bbd4a812cbfe527ba142e6b4ed819d968642400a1d9e8150b031e7653e983d2209e94f8ca91f889e33ff6f624ae3989c830eeed45ef2dba9d90422194841513e6a2d06942a515724111cab1d812ff6057560d02cf3f4a90b1ec6bb134bf5bd0732520061c29e3113b1bc40f61607a7a08c1848c4aa153b27c708c8aba0d9dbc9f713e81d7ca9032d8af3396d032ac59ec61a1340280c58d192117ea89176d1b7b498168928e093ce7eba743e3ddbadb95acadfb5ed98da9af6ef7a3db279ce88a6a7e6af10cc06cdd5f2c32456c144ece54c0cc9190028d80926471a24623796b91389ed04f6c6f566d0e16ddcc8959a5fe8e509032ed539b38d83c9c803d6dd24db586f08fa8f2eafdacc79eae9d06860c42e295e0d05bae40b3e46b314daf094539bf80180c0ba573ba1835ce2964cac961a85e3c580c5feda6dbcaa94b5ef2850c357302fc11dcffec3860800fca504e407b72fd923b7cb1da25148ac503fc90d4b3b4e0464ff9ea0dcfd58dce9ee043c6f49b1ee0c1e9239c8c5a547805f3d4504601493944bcf9307907d60182d40802b9a1feb9638a14165650c081d046848e0811270465a18a423908f9115236217d0a9cde4f16ff327c68710f33dcbbd31c94af58edd4686cefffe637aefe4b6a405483c7499cc2e07035820a26473d083cee6b561c953d1a211529e8d3ebe7407ad73fd316328e48918d144de870ac3221ba37b63165834b3125ffeef762e3434340140c7273b808311b62dd835191475fcf0f3aa7c5aef663dbf6b955b3308e298e85e3acea2ec7bd46a2f949d805b6492bfc63818d05a83342614185ae81061a9a299a2851a5aa490088d80cae64deaffe05217fe3b47893f8664bb16c2835e803e8e9d1f3927aa60a5aae012d3c5751a50295019481192141219ca4ae09b6469bcb85f67ade63210000e10b4c56ad48c66aec4a5b1575b37196a23dceccd8811d41571ec328ae81eca57a7dabe1a4f635b5a10905ac8b32611af6ec7c027d574a090559633b95de2ece656234bf422f2f9621e535a6e3940b322791f5f99c4ada6ea2e1ec3e5b4e715a660a646a68faf9cdb92f5b36dd7d602bcbe6cf4390bd87626a1618c7d9751a3f40a926835c23d525905d5d5be3b9ad2c6d8d02256d755f6692f0f710c054064598e0df5d47e94192eda34b7c1603c8732d6deeed3e9efc0ffbaea61e78ecfd22a2214e25ce8150096d90ca5296849ab31629926554339c101dd6f88160be726314416170260887ee0f4834dd18684c104d2fdaaa53e351d64c034a730af7c3d3c8ba64a11d6c121aaab4919fa90994ae1d7443dc4b69dbd7daa9054592532b53c10e36207650e0630c1776d9fde6ed60a97a248e40f4a42ee555341d860e64a3d13955da00c5b9eb23d732a908474ad49d80f2b0d767f813add37042b30ce9dcf8eaac7d7f82f1100cbc123cc06206fd97e78d155decae172ae58a8f6decc3103587d4d0cdbc87722ad7f9129bb66ba0954f4649f4e224c362b9e31fa9f88538d8c39d3051d2b68475da531fc0094ebd60c52ac2e38170526fc4464d64cd387fcbd677f3ad0cf71031c179b0a5a1ca049b86bdfc1b55b8d926340e1e42c7e6d3f9c345f84ea7e75d7f9247f8e116d9099db5cb9d53ad727af78fe0347643149152c5e665b8b402a76cb87ece60107201bcccfea7e5df35d6ae7f075186a3531c667295af6ed3fad1e528325c56f5dab99cbb470d78c502bc7c43a63199b0b8c573ba3a3b6669dd25074bfd4e3e6b6241135cf710f0a496b9d9fa1f89d68504cf65da483262183aa10a9080a7f95c62ab7743b55754495ca2361141f35b27d13b898d4fe498819789574301584fff2be37d434f7dbe30ab11d8f603c4648e2a1c5e36ba86d0252a504ce2408cba2e9338bf0791b6d2c2a9af4da5d051c906d5b2f9e86cfe91abdb7ff281adf8f188dc48c15624d70f908f33d9d7e288797b41b5846f0dafa65b4bc8d81653346ebfa19f3cfec6e3c743c8306255eb6b4addecd55feb25392f55597f20db544e1dfd3260d71cb5d44563c657a365e580bf8df1f9fb3383ff4d1923012272d67427be0d275922c2da74581c7ca846600397a2e58ac1548343cb0b75d07a946ce2ca9f2cd5fcb7d3c642b1bbc4a9890a6e16093d3cc641443b7464584612baf3bc824341458ad8e02dab48a833d4b6bc32822a4c17e03ed5c4b0fc9cbb95968acadf06880ac2c6b14492faefa1769b704c89b202b27f93d3d2c675951c6f32f07d9f96718d55285f25be7973aa2adc73aa46587cd51353b1f17b3f2f5279aa86210b5a9c3b18bd4fc878020f0d2ded14f6011188453b857bff2161ba5a6c73040350dcac56f6a0611917619bd9ad03a4ab53ac8e737b327a2fcb86e38ada87f115058f64b4fcf2798fc10e690bdb636c2adcf0355b28b9b09110c19455d8aa6d7121b28d76797d2cc6ea797dab4b87c376127b7167d51d2dea67d7f288b4d10442a9a817140106ae9e3ad25041c94e40cabd467172548b8e5190b67346aaae4ab45253f2aa68cf3104d3982c2912e086d4681bc55984be9b8d2e578e69a8b2364dc8c56a038cc7d7783b5f67493afa521eaea6092d4b764854f9946100ddf67b775b42cc84245dfd1152893d2d11a3a28c42d52a72fcb1a833654a8a548d5854e725d4c09611b9f77b0356fbf4cd4aabe061134a0247667b231855219b21d394e66a3a8fc3b8d330aa1c60fab3379f1a93d3c2323c2369da8493e746af60547391ad642ca084c4cf179cadf35ea3495c2694ddb220395bfda006f6e31119c7e02d0d66cada4dade822b09ee8601c3a8d0867b09b7a3155749df05fa874d12ce557e3c9f9fb2518c31a1e86686e597e20a72b5a3931883fe62671244b3ebba5f291dbefb72fc9190ccb37016c40dcb635ceb0587a3758a6a3cd6543d5182f1982f0347fc3da6c69bde2b636f27cea1a4fe6d8cca77e0a54e961bb4a01164223862dd4181010e353d3ac76c414c3d2ba574f8a12e4d0da148bc0fbdf07f41f85b2cb699ea24c5ce5e8e9d0ec10cdcefae347e3c4f2dc7e1d36e182f5c3539a68c01c94a2d2616c626236b221ff9280f9840b299b1dbddfce77080029fccecdc0ca27826ecf4a2d2463ba44f33e3ab6069f4420ef133784a51e4c966cc107274824dd62d0caccb80b936b01dc483035a216c6c4a3c88274d5a2179f93c3c06b42c1a44249a90c60de23bc4314f3b316a0b0fa55568f668a8aecf609d501e29e9277aec0df93c809f9638c40d766a7efa69528bc9d140d52a9b453c939f6571c095113098ac0f2001c41968da1529510d14f915c25bb1a416e5de4fc818d5769f94a55746ce3b499e2199309f965543ea3a25cc87d35d8aa2e8528e878f0ab7bf9eb488947eb87551dee5515f45554a98d2edca78186a4127ff35ffe5b4650e75d940c2efa3f9da2572afac1bd884f1a87a6ca08cef4d44a065392a0264612ff45c229b3818c49a86d28f9ed3acc37400a2aa010450f186d58b103029dfc21d456be086c0f4d8aa5c8f75d79209c419c3a92dba7af37604205779f82885c043791c7ab58cfc4e5686fe831e62cc821d84a7a992d3dfd1f5528c0be028cc66a8d13b58b59a959639e428cf79b244e13b0143ca6c568e55000a3eab6220ae32552799f898ba569dafbfca371507e0799f2a873f1b8590dbfe9104d72f481b53e1264eaf7d617691560a823feb120806f0c38bd6f81d6b029e9fb0fcf1be4c6e8cb494f8ee4894ae4de48857a17a64ef09a06160b6a3cfd373f8b0564f6e364625a9f698e29c4770d7e58aca888c1d351af4496ecfb33ce83a385656ab9cfd8250d6171474f91b92a3a9f57312493ee2f895f6d2b591cb849ca9c4ddd2ea73e29dfc7a3cd7e70a9b08a601ca7f4efc11b1ee83965cfd819e3323459c45ee23bfb0914bf361928412b0956a130d3faff8a0a135eb985c1f0c2847f1a0dc1160072b506076f8c347a7381852e0083ae2989217dc6b735946d5e6bc029041e780d9d72b757e506cd4e08f5c7640c65c997ff331ca9a0585f63b76c38715f5dd4f15c82ad2e68e1e450d5ce7ac2df7d175fc65a0158dcd02dff4565d8ac24ceeaf885458782c7cdbe78407d742c099b77d4c3a3405b58223959807db53f9a3e62d9c1ecbe31fad605cfdd4778bddf4a4a8cc8eb5b4bfcd18880d8407bc56ed43367b6e37332ec8b9b293d5abd92aed8ecb341c526874dfb6d3ada44b409caa6924df96d72daa46893cfa61d9b3cec66cc096d72e42e2721e7ccc2ab7d88e336333af546f03374c357f152153c391abc353c518c94055d0fa1c072bc965cefc95e1c6471578def335f1a371d63f62217f7423ffa45e36d678c97c265598ee00701a19636308103c6bfb6bd220e5d7b71bcf61d3e83f1efc7cf9169ba9330c7a6330cfdc88404af186a05be6e90e38524a116786b4585acbd4026c64ccd092acdcad81640469df7fb0c38d690a107e1cf7a305e41fbfda779e4aa5a3cf11d3f0cf208d4a2d4676e2d123be85a9b62dfc6205ee359cc382ab5dde4ed6dc08fd39666181df734747610c207b2d71158fe8e75b64ac8de9528ef107d27ee5bdb83d88d6c328de948c0d92b9949b6c8e4b0ddd6662041da419b333240515dd66718226336a9728fb205414515bacda8e0e8888833465108b42a7da409b4faa1f4da78b611c31ea4d42fcb76736363e651c0ec1a097d47561b581ac3f580378ac39db31f9eb50cc7978e8a95c76dc702a4f83032a80f3721119e1a5c15aaac7379272073e52cc7079aa5638e3b0eb673c46c6031a58323be060cc195b388f0e45b1afc45e0df96f3ea6e2a955d97a47343e62ad193f6391301541db3ba6301b3faa16466351582d9444e695a5d178ce842a6bd6f7a92507c2f9243a3425df218082be8ec18f288384d2e073ecb93a87212bcacc7f4bd470f2ff7a4aa70597f52b4812cdb4ce79298246b2a6ac9b1114db1674b65f44012c6e204b51476eeb1879683190667d6e73a00158102033024595516da4def680cc36dda08f18113e6abf6124ca84915a7a810125d4bd0b78316ce44c95200b0f154699820411dcaf534c49b214ba6a218b991be40ab3b5e383db51972fa382deb818902d46f16ccaa034dbd26601fc97e33b5b536570db41eb00dea66509be6dbf65fddccb36194bf20b4cc371e0a080969f0fd65060bf0e64ffa3928e36ef5fd246cbce35539384836efd3d5ca23c473ebcdae16a36878f3cb06abe378975d565e0390c76bb50065d890dbd386d07a044f6354f9272812b4eca08bd9365b47b1be49de0e3b3886f16cf314641ffc15fc508f46efa923a094f3a8bc375bef412450298879b4d748677208e45769e5c8992e75a1f5642b2aad4d544bf02a72efd5d55e7ddd022f8b0909962a9b16600607cb0edfdbaa4b005b6a2468d51549d2cc3ae5764747baf8fa223eefb5e73fb886bb6b4137f7368b34a78fd16ac34eea55d574c339c0b9b48e37acb522f50dd37859a2573afffdd9664864ad496e8bdba7da1b36bfc3b626c5d212210360872760727ef30da783335fe8b1737c41017bb00ee45401ca59b5cc4eb9e92153326314b4469b3556eab840fd0c21e8ed94afc1585c2b84d973d007ac707ccfa198b0e02a4f1858a10a54a08fe0c67c9d61c280cb6a0b72649f15b6ba258e1b2ca093042dea9c5f46394541633b2ec86a17014d230bc6ecd105b753cbb8cbee3c07b59bb7c800fc0ebaa46f9dc0335ab5c13546de116806b87a2bddac8e24c609c0b6f5f9304197a0db82d6a3a4eb675212685b89d1a64972b656dc9c6b691f30713708628147ecddefc1a18aa860a8adae579c01463f9a362976d069aba9ef7580866639c7481b9ca9933445abfcdc445678839157645b6f9949b0dbedf07447f3b78b9352915dcbdf74ad882ef2c6054bf4d017e90383a1817fe7c9c5bbeb3c7a1976b22874570436d64332500b67a511d6308ccf9f1230493dfd1cd4cd03d3a6cc3ac93e14145b7e368d87ad4fa8b21436071b910215b571658a16647bc7b64e2758ac084821ed9f00122b45dcf4bac0039020299be99987d90443e68be7def628975479732951dcc4ad6b315e19519b3f7eeb329adb56f0af64168e669a8d7ffbf51d49a5e20c3a1abd676e73ea6c0ea9ac04f7cbe3efbc8007f219f69d05deb114d617d0ad815833ba716b12c16467222189bd1102ff13ffc759ead670b5b18868dbdac8a85750fde785e1a23def49794d5621f06f9826b78c9de596cacbffa02fc41a3e0797a160bcac175a710e61ef9e5fa8e3df44590bb2951fe048140cc9afc38a1db64005f3c8bf8006694eb8abaaea883a72ec2b002eb82d5d394c87e29754bd29403913b45c39169d5817400a1f924614cf8573904e5185fb575d2f4ced6d452fb7e8d5086676cb48efac17063a740666f0a2993ae9a816535792355a989eeb3265a1c62dc22de1a4a7648672edff76dac6724b005471ab3f62cb282f46b975eb4097ec61a16b15491a77c17fbd01163f5f219c1df6b953e4ea807edfb3813c1fb4ce69caaebd4693e26089392e6ba5b6ce4c8173220bdb8762ca36d53170f2f1ebc4cea5e71a82a1ae95f4ad34e81d1b01d1484fc24f4e9df436d0c73a204297ec1f716922e77e7d8769c61e94cf51c2ec5da082290d98c83304fb0060bbf7b33abc96cab0ab3117b1bf6b125671e7bf5a6bdcc532752be94c66d0c0090750151f90bdeb24ee63c26f540fe6020cdfc12fe2f9eae2af22a68d70b15ebdc4fe626a6a0de792d8a375e826f45a848181888b855b1b73b213ee52e0843550179e1c0a68c6b44b0ff3c07f309406e75fbe33d904d2c3c940c24281a6a46aced01dff8ff905128a46165688380e0c2d209a4a109b1bda1614a5fe380d4101eaa14780a43602c14358b6567ad16b58007a1a23d433124b0d888c6ca6fb8fb083f403010f3911c06a034c033b82162f797a4f99b7ea3b6a41c00053b4df0b803d0d99132ca704882dd4d20ee014e0de7e708f83e974657f0f6da0f8c8adc6455792fd900e69ecb115f9185c626d200a45851c6ee269deef68858dc0f5309ca795fd5806d6aa533e1d03383b27e1d6b300040f2be852349237d1ac4fe182cd00eb1a5c73155c35ee949e4846f8d95a89c7d556d082427b686b4fa1e5ee01da1a961ea52b7588836b10e6101145db80d327d0584393592bff00c37d0c7b0f6cd9805d1ce70bbdaaaf68c1753477dc7a175ae0a0254471ea334755e8f07104d2733614802d63b2772c7727e22a3d2e369b53f5a8eaff865a68f90844a65f474e0ffed6b9848286a93331f8b57a515b1aac94f4b1c4b75e99a7c5140efdfb2e82d2a4a08adc40b01779ccdedda1a5fe6a4727829a79a5d082742a0771ec88b82813559635d0e758ffe82c80991473f724bc61ab29665c8480e53e4d4bb24ec1da62984b4b7799a3c10a2c9bab4d2be89bd0b971d8af469aacd0673280eab61fef85d8119337f68795f02571822c5606e764a197534e24140636ee8299a2c66b4bc1f019f9aef0a91619cf8258f972182f4f0032c9dbf71834c41905879c655c06dbdc0b4f166f62b38f711c86952943947da12603096f5c51573db48947358515143519087ba37c1c07d6be56312e29414379b8c4e1882f82fc2da19e509e400167febf68daf17409795f045f1b7aa9a09a5c25f7f21e0074921f1fd0d0f7a35dcb91a0e1640aac10c004c131175f4e93fe877897378ee476b417b1d9a682edb8b454f803d681e7df350bf4bd9e082b48ad60e02a032df1586a11a4b4916e19803ac6a0e9b2f2ec24a1e0010f0b3e12d8cc7a97ac360c586bfda0b4487e1ac1f08601acffbc4f291016d0f510368a51eba8b8574ec2184e4eec92c311c486bc1188fce8027434708a46c2c3f21e23c47e5d5a49e9c20448ffe258c98258ca7895d89905580a01ab089161b1942121c3d2d154492e6500c30032b7f1f0734b2f007f97e089e18f657d045c830b8c63b159a62c0e2360a3081bf0668c8ad6004dd9ace0c15601571b14e954c64e65133f07cc87497d7548b2f2f0e484e2e7f795cd067c464686548668f8d81723b8427d8cf85d74ade7e3a1a36cc6d140f73cfba4fa88c2c7df0548762eca7ec398889d69e9440bfd278419e7bf81350c4ccf000f2e83a5e069e2839a6fae4f8faf1f1f24be217e5438456928a1835a9f5d02df7973421512e1c3a6f7712b583ebaf2c02764d7faab2971645037b17731bb2f3d408e4cbe348a730714c7942f01ea9e8187ac4b320e20c24199ed9b549900952562fbd7434579645c1788b96ee5ed4be32339a3135f52b209c90ec0fff9e1e26a908642c74a17b79081190970517153859d2029c148c457c04fe99d3dd1bac1961faf4316f2f30c221a26846cd1b0486802e63df3143f6144555c09349abe3b8521638cc37993c48555ea5f60de1f857bc366d711f17f6890ca5a22fd6ac4f332cbb5ff5ca6a9c1e77c98c06741a34499f44d8c6ae074715a0909283a28637c1f24f5e7381a1293fa8e753d36ed198e9ea70023c3cb8be0e7f7046382b1d38d61b4bbade954f907d3c420066a9cc37c5906bc702693d6f7e9d0666e00cf7d66aaa58d5097c1b63b20e192e11214076b048b7b23c765f3b379a00b0471a5a260aab879057cd630cf0acdaac222a53a9866da61c97841ea67050addf463d95efb1b46b06a21c717624864a23aa2c512c1087530c60549623a53df694afa694df24e9ad93fb6a2b5637a187d9bea30ea90cc0a245215d26bf8cce53497bd00441e1970918924562eaf68b547b0ab63d760205927ba5451acd96d80c51edfc163247c3f0d7fe939c793bcc06601dfa1ddb2274448c3a6279076df8b779753685122d2794a99a2598b14bf2c65b7a1645aaa157a8d002eb3304a59e0412cf8d3f8a08c283ffd9ed82409897e26f5c4828772659ab347e22d7e921a3237b51b16ea134909f332474f7cbb3658a9f57bd4f5e45812aa9767b7683102993db0616192740fab0809566d6fbeec361733b792e475d96b7b26bd2553d603da20f78400fcdb5965fd0505473174ef239cf39407c7fabae2f6662ac2e3ed5f07184584dd223bc8fe908a4ef10182ed367f32da45153e78851d45175cd954598b5263540bc9bc4dd2c14ff169b1d5aab148f0d0777c1c321776f0d5dea17437a111371e9e61bad0aac889c7a93f09693fb519c96b452a7e486fe9184ea4e906a35619ac5fa45ec82e07870f7090cc049ecc624f37516cd9107920635d45641b65b45b4a1ef581807774a49f31104e6971d4c71413156b29b14f39d5fac2180d2e6de38004296f63410232d95ca1c11dc9f5b546423f6e9dd8c6e4bb659b254bcc2482ad9328d1c44384237390af69c2b65413d703c9c9e78d588adc82415b55933a0d42d1dc4e4232039f2d369bb16ab214b2869ef1ff231d7f26ce8456fde1e559af494db7d3df30e3beeca0eee54c180e6c9397894c6afe93330ba25821e23aa9edb29aa939cf10eca3754da50d4c6038edb04adbc05d7638680318f5183cbed609baaf7e3c5bed654fb335ecfd76482a56b98005c10206fd665ab4407a525087a29b3d42e122a45c9e3f743ba6ceedc466a3e86305a39808ca56c04cae69a7a205ee907b72092d4fd889c33e105ed56e485e14bea958ba6f6cecc7cee673cbc84bccddc662c2bdd334752d9d5b1f0ecd19f8e3a01e69f44a27a7ea05e16ca234905d243840303498212a83f9615a984abb1309bc07eb64ca98943818b9de52ecdba481e46d4b64f61d471af7e0c7b0e054be389a8b1b7635c284000085d81684e831b977f0a18532dec98d1883d7561293bb43949408d057815d420fa1462d3b16f417dbd0d94474016c3187d406a14dd9cf2700f21ce0c4dc7d44e8ba2d66c911484b059e29392c845c795f5e319ae10bd6fe2815d6f15787f08118fd6047ce993441f85648e3e44fb802848429e33eb08096d46aaab8807f48ef8e3f79d602445b4c5816b9942fd7075b7336709e2232cda8415e9e224dd891441bf4849f9678362744983b0e2348669bda4206986721d6649afb7817dcc1f6a50f7a411a2241984425887dcc03b83ae5f7ee320f4844dbab088553f4058b2771226037ce7faf4073f0f6800ef4a8d69f73256cb707b152bba4e470d57ce9c142d9f288fecb1e41418f2ddcd5e9e5e4d3bab4a23833d5086bcb4d97e6b549e465cf603643e3a523b48e83b7ea2f3a2d1fa015f2779fe271c6e7efd34ff100048dd842571ab924add6256e142d5ff9f192349151ad215129946e8ac62263165f27cb58d0fce9771b92fac71305d48e56a627c91dd530e6dd2d8dcd4c2a8ce0ffdb1038e75d33e7cfaf85ee3fe31e21ccd5789d53c9c9c8ac0e58456e81ef08203088b04656a2f6c1772158a21602fb5ea06f5b9a85e3d033d9e616343ce928487d5fbb87aacebc0323bcac3b41faadb610aec92a3777686a4f7e9b72d358e7c388055975afdf31f59935d8f17d9019d41cd52a4da3755bcd07dee3829ad370808726e96a7689b34f59f2b93b0331bb068990770b5b7a74abcf79241788ae04de0a3b1225763ceb094535841f5e22a9f26efe845601e7f0fedf8c0fc8c4dcaba9c98a06b8369132df4254de30e5e641ba45ea43acf7c410001e92a8dd1017c4ce3bc09fc4f7ac11769b14e0a86626c7106ec6c498ea7bf3e975eb3d090bea00ea65dd7c91808b0af15221fe364a398b81bc02c4fa6c5976088717eb70603163870be2e2010359a1b18472194128c47782a80255c8b1eb3486a8122aa1a2c80a870b1d24842ed7367245a1177a0a670dc2e9195354056fce67b608ac6dcd930e007c873bd9a3b950b9cb0b634b7fd8ebf2027fbb1e8eece5b82580edc5fe1fb5be43fad4d1c4c235f6b8376124423c2b2ada5cbc80b0a23a3f571d6e9f1dc132c3a6f0c5bf03c5be074ca18c266c9ebcc9da170bbcdbeab38ae09d061c7060f1886d5c6fd292ab2ff6b0724683b17211393e8832ba08d6544a4094ddabffd05cae4206813246f5c6c20d134680dd3a46285810fde053033d8eec23708a709b17218338e15af105d5dc938c2d4c52bcdd903815630bd56ab09e79a1c0b437343d4dab09e282a56f8ca297a8fb409e3eb22c561ca4b9a30e5aa490f90811c5b2718c290d9b4f040df8a3d01e70d4d8a0581103cb713db0d670efbe41ae8dacb2408d2d1987938651a2c2e850f523a642df26a789abe881ae21d07fb17059c355cb0a945840866309e783c5b7590829ebb1363f7d38d0cee8f05c27e102e268d47c7b52f737e0a8f942846c1f1abc1a9ef4a099dc2893f1ca01a0458735765c8c3f08970e59a4a33c3f41b870d23d9d772956e00aac8276152022d503d578927b9a4d0618425d3de94bb6ff87601e68630b21ac07eef95c708b0ce07d90a80dfca2ddf3c7213140cc1568a30596d1bb093fc64f85ee6e68ea7292d435e11ee041e13407c11015a6a07386ff668ef2bc26a7af9467f672845016982dbf37d55f368487ec60853ae288ec3037bbde789fd0102a4b25d120210fee66d60370fa2c5cb6b03832094ca8b7c5db58695a0f55a0e8b80dd9cf61ad05abe543af922d094e8f9bbace9a66b18e8185a2717ba8f94cb303dced1e55cd0ce2740a822a44a71fb5625ed980872cd5af1f126f16f7dee4d591b142ecfc77ee26d8f89b7aa5eb9794dc1b98c7e3e473a04ca094ddc8f92abf9147b9dfc9939a32441ddb816c551eff16163beb5ac283990d0eaede71a5b27803c4e21a3fa87c633242ec80af7d21883296180f29751338d08a21072cf812ad73e699ec72b1f5d7e2c62d44ebd65a7540a0da1c514da27e5ac6d3cf13ff5499c161d86876f49659e7c90043b2324730db637430337939a52f5fc28fa2b870066e3b1053fcc6b80dea7b5a179233b810443514a2bf0b5eeb1f533ce1c9c3397cee5b0f5a3cde27d6db953bdf87a7c99d10d165ebe381fe6829f61f2c60890eb7956218a0d0d6922033f802638d5076bb9489a376b6aa8ac67f25c4280922dcad9819583756eb7714b40b86bb8adfc21bc4268a4f8a1cdf12708080b7b98456eea30a55a6ff8bc5097b9e586382c47db412e438de5bfad90266ee2639c3dc2bedb3a94f9a84dc0b8859014486015382105ae040fc2514ec7802fe4044df0a3760b46439330f0f0f0f0f0f0f0f6f706ba4b6d6368024a49424a9adf153f8ee9029a594648a8433d417ce4cdc86362184d1863fda080d02010bf40ac50ac9f499f2b5ab325cc1873eb19c2fda07c868051b529a92123cf3a59820b00219ac6064bd6b472a993a476d6ce001362820011b5bd880c0183256c1a43e4f3166e855c1c61acb9f53da53c19f680d31c8fc7ef9265430f92ce750ff21afa77b0a268e8a96c73bd8b6ada6e07a77f46be99c25eb2d059362481a6aea99de1e29b8ed9027e4cadd28f8205a9265d09e29658b28f88faf7fb6d9d3a67c2818d3f8666a440c146ceee8b952b0de0b1df904bf25748af61bd2a8c83dc1260b59c53f923e25f24ef0f9647a8db69fa4fecd093ed8a866ad64294a3a6d825162c9dfe228799a9334c197902c5a24277bf55226b88a215a44537f25e208136ce4d0f71f73e275e55c82495a21e85e907973722cc1badec678997542094d25d81d913975ca5ea276a504b739a9c99e96d6f58293e034b7492b957eefc59304a373d25ff59e48f06d25421242de9f881448705192529f839074df23189521287d9e2a6d8a992378492a85a44935b6ed8d606c5c536806d5604284119c34d3bd2d79a47fde8be0840a26b2e45c5322a22a824f1354aede4ba52e272611ec560a22654919e97b47049b738a0abefb15aed14370c13268bbff6032a225c3109c14d1993d665536e11582cfcb9f9d2ea7641082dd2cfa73cca064705707c155f610e99a5434b5a80c41302a7b6be39f84a4ab77b1c3e8588055faa2053bee003202c1081193fbf9aa3db72203106cfa9317539ac4913193f107ee4a4726c30f4c12eb517a55374ef4f481534ae8535dcf49883ac4088380a12351061fbe14f5141a5e3a4765ece1f275d3b496255af0764d20430f2729fa2495b6cf6a870e301cf0001c376e84c1011d1798808dcb01cc41461e4e061e4c9b335a1aef0e8c48cbaf1284251d499b63c781c0160c68c08d1ba87164f941861d72edba183a090bfabd066edcd8a1038c3176dcb8b163c78d1b3a5c0c2efc04376e7419c3860d6263d84036c6172d6807e0d0e16274c18518a70b07dcb8f1858b21c6e9e24b11400c32eac06fd22554acab15931ecf72d482430162635879e15e14d70146ea800c3a3041dae44f8d7539863e073ed6c64b6152f3c80fc981f59c444c1b458e4c37f9e313e8a28b311c1007d6439d44cf312c37e370e0369ed2759d296508a63770c2bf4f3cb6ae471cc97003b7f77f9db263ee48a78c36b0c17c63f9a70f2d1dae2081a12090c1067662b59f8c41d449f30332d6c026e9d95c443019fd35db21430d69cdc135a5e995430b87abe0ec28c5011969606c4dfb6e64730c32d0c05d4a2633a325b520e30c8c9af2717dcde61b649881cb9644fd5f1acbc0c9143f5bfecccb5d2237c820039beede4698f24befa731f039a434e919ba83369535c81003e3be9e3f8fba06adc130f07d26ec5e82fbc43791db820c30f0d69fb55792f294542c878c2ff0232baff6f208870c2f30c1d4b485f4503131c8e802bb49a8532143e9a867c220830b5cf4283107a53c684b627761811b374c05376ee028db838c2df0d9f71b3d564add6b818f29f7c40a53da3cd959e0e249cd8c604158d0278b50be279e2bb0fa95449f2e09c9feb50297525636f7f414f42a70f1541236ba1a29c5a9c0aea9905e9ffadd53700a8cf29ca2c4b558c890023f4a5f27939f4d57d089b1838b09686087efe080b9848c28705e22483b9d37275a1e0aac5b9ff6e54cda4dc99fc0e62611c72d74c6de9dc087bc632da2e926b0aa96eb25242526302a3285ab9bcee8c9b40446869434428852c93fa4045652c81bed6d97174349e02b67b4b43e993de206097cbc48e3e621e608fc85749aa2c734b333023978deb6089c58a848a9b359f24e128111a6eec992a8f5dcfd10f820737da759c960260aa1282a276da7c552818c2070f6616363397dcc07029b2b22ed86d2b92ffb03c6f622e5ec5bdd26293ee0c23f72fc1b0f41a67bc0e7f8554a1649a23b3ce04df379695bab8f15db01373af39bdde4a4a242142043074b126f2d99262707bcfb6637355183034e729217e468ac0e326ec06b72b7aab497954d9561032ea5bc9a9625dd0695caa841b6412b92d438914103aec7473b0b4e7eedc8d49bf290052bde954f23668dec522c18bffc94549f62400a1eb0e0a44790f69af335ad690b1bc40236b6b0412a60630b1b840236b6b0412660630b1b4402362e30011b71f078059354c8316b4816cb84af06011eae60bcb5caf2ae294f9e6d05a739ad24d3525975b783218616f560c517e25b5269d15d8f55f02571729694d23278a8825dcf6717d306a5673b20031db871a30b47810e1d607c9123edb871e375a800061ea9e082ce6f2a29e615edcc0e555470ff1949b54474d4a46a233c4ec1abee6866f28e872918ebd4fbf020ed8292799482bf0a0dba5ba204bdfc48c1c90e161a3125798c82cfd5a33e652d3d9aa31ea2e0f562a5fa1c52a964268f507032db574590b955bdf40005a78334117358baefec797c820d795355ec8b1e4ac9c313ec8590d247f1d31325280f101e9d605490da994da8bcb93225ede0c109369552d1941d3d356463f0d804bb492413dbfc1f3bed9a6025d9e59dd8a273867960f0c804eb6bc18205d1a14665c5e081095427a9f157c97e31868e9580c725f88c3e22c326059d7181c723e47d06cb4be5183a2af15bd8bd9f679b128c8d92b9baae3777d4bf1843076ac063127c0e91458a5bbfee3872ec18230cc22848470c0d6c2567815f053c24c1061f69226ccd4830ae39a4a037dc8404a3e2263565ccce27fcfd82c7231889c1435bef7604b71f6a6b6ff75386c9a3119c4efdaefba57a30820beeda9b97443ce0b108268888a87f168c828722d8a4f4c42da12af7c41c143c12c17d9b56e9b859a445cb0311ac046d77cfdf158eca83c721b890f2cba2ffb628bffa0d1e86e0a4d999f87757082e87c6ce924e242f21941e8460d5d3a59844dac9fb111b049ba2c6cf79d46c33d382e094509bc54ac4f2897904824f4127a154f4e7c8db01c1d7a63a9d628e1172c5a6e0f1072e0909aef9727f52e843e0e107ae3704d11b5f1bf5ad471fd8a0db69d48be9b4343df8c04b0ed3bccb252478ec81cd173be8d254e5d0c2d17d881d142430bab00b00103cf4c0468e6629b45f27ab5efce09107fe93c633bb94c9e2c8f0c0597253bfd1be6c7d2167048f3bf0716d2d2d640e4916ca2d78d881cf509d2ce5300d95d781d321655656cb972548b4e04107ce7474bd749df4e50dcd811f75dde65532d6b8eb21073eaf280bb2627c8fe92e81471cb8bc9e665f59d4697239e001073ebf9a8e1435291e6fe06356341942f28d091e6ee05bbd72fe0db24c9989a305270c331978b481cb394951cfbfb1aa325f78183bc6d871e5c10626c9ec5e4a94aa1ceabec0630d8ca757f430b563297335f03149fb8e96df64d27f0b113cd2c0f765fecffb3d61d2c62c78a081c9299a9e2382d23a4967606db227a146d89ec528163cccc0b82921e26e2c9f1cdb32b0c92f467190819139e93791e4e7381a2a24f018039b338410d67b31256d1bf01003fbaa498a5d503a3b84b6048f3070a66c930c1d47b55f0a0cc7943456d25d2bc1e30b6cdde8cde9b1cb74ee385aa0430cbd828717380f6a7dbfcad3877ebbc085d7a9884c4a7bd0e102a3694925e854b7c0f9980e52e2297f53d10a1e5ac0721e0d2ae446aae091053e6fa8648d1d1ad444565df0c08297aa479859fc0abc84a851cb46895edb0a7c90dfde2e32fea9a90adc066d7df24ab8fa54e03e43f57966bacb4e81f7493172aacc4ba18ba5722995321f055e3325896aa5172bf350e04db3f376d929a1db7f02a73a7947c545855cdf09ac5eea076dcda263f49bc004cf5144aaccd39f3e133855f12c4b0aa1f2cc5f0223dcf472c9cddf48be12b8142237affe78d6f093c0968e65bdc89b62d23d1238b9e329c935f99ef547603f256bf650933ea57e47a5c949d34a70e71d84ca9643095633b86bc8ec24f88c9a63e79f940497512d491db7d4798491e083ccd9d245de8ed53e0d4864aade848aa351748f821d670336091a8f60848c5b413c54e7c71dc195345de7666a04bbaee7495e75868a0a23f8d0ab20624417c1e7a9ba20661d73f614c1e54d0db6b9f636b49208b6d2e9688f31b6f588d84c6434134a7608c6538a489fc97208779b8b2d0c0d43f0d9b549ff540aca275508464e4a8e11062118cf214cc5d1bdafef0f824fbdfb510b7241b01e96dd3546dc1f650a04772a846c49f99eb6090204ebc14699aa49273de9fc81f3bd1391ef3c7ee07774e3d5fb875cbbe9032f31644a9bc6bccc357ce0fd5753cb93660f5cec8951ebdf54e8bb7ae0aba2a8542a836ef6681e8cdc12cfd7e28907ce92103d31787ee91eefc0c6ad1c4c5abed8818b39cc3e3de705cfd78157cf9f8489c6b4392b3af04175ca7819a4258d990397530a49454c264a47090b68c8819598c13e84150736554a4ab27a8d5b88c3814daf9cfbe1f71bb84b4ae78edcddc089decda0cbbaf74edd0636a6ca2fbe9577da64d8c075ea5222d89fda5e740dacc8f6d49b37a806de7f84083958c839669706ae2496d03946fe247434f09b4262d299fb5eac7206ae84f6cf6f1e4a249399810f22e554d9eb32b06e19926d940e19f8902c54ee8da977947a0cac78796bce9253a5b41818bb3ae175a623e78ce068810e31c2c0ae47fbcd29497eb01218b8cd67a9fd93f70556f32af57684c5909917d83ae59d25a9c9415845031a5d602ba5a6cf6a4ae988991d6870818f9c45e8df36dd10475e70b181a5b105ce6dd369519a94e8a4a3052ee5e7fdd5dc1d92a259603746caa0eea7e244110b9c5b6acfea96bf026312526aaa7117216334acc048099ef267a5142f48a30a5ca5bfdbafbdf5b594a5025fb16c83690795ad73f431ba382ac017d098c2e291228aa8a454d19002b71f4443d787a8161b1b78c016c50b34a2c0a9260bd1b41e9e46690c1b1798800d30d08002175fad339b526a39b883c613381135bff42e7a8aa71750aa8481861358df4f0bdaf55354d57194c181461318b5cde7fe1a732c956101183ac240030d2670da83c48c6e4a62eab30c3496c029ef13eaa9367b4990d15002a7dff25f3bd2e4895d0e2d1c6178914a79b145175f58804612b8d4eb4a492b8a042e289534ea0633a55febe31928a510a071043676964ef622358268530a348cc0adc44b7a22e6b459544da051044e5409cf215b9e38a944042ec35a74d774567c1110680c81afca49bf52c4abcc7aa9020d217039ba74090b324fe62a08ec290926c1454408518106109890e495e89646aaa0fe80afd69c534b8714ffb328d0f001574aa594f4ea95e9b422a0d103ae57af92a6d2ec3b960cd0e001db63a3b761c98249d61c81c60e78136197ee62e80fa937020d1d70e2ff3175ac0b3adf99432b0c2ec45893018d1c70390691d73dd3f512061762e0d811061762744103078cf63bcdba1464a040e3068c77648d314516c976db804f4b216b9b29dfb7c91368d480dfb6d23ebf4d3d7dd1a0011fa459fc6c153263169cdd9bb6dadf376139b2e0a4de8e48f2cf34cc8805ffaa9236d7f2657fdb033360c1495131534fa65598f18a728b4dcad2d9aec00c57b063dfa52b2c58cc21cb21cc68059be49769d0bfe725439615ac66b4ccd851447432550366ac824f5971efb23e6dda76862ab8a483074bd974275d71093352c1be86fa4dffb9fd928f0a46435747e750b9b5834ec16d52da1d4d57bcccd514769e1434799fc508334ac189ec7699b71bc2724a0ade54667c932034e576678c82db6891fed385cc1005a73972758a9332a599a8302314dcc8bc4d2a5eefa5e08282179dd926a9ef6b62ceccf80497530eb641095d5a3ff7049784befc38d2e4a77d3ac15f5bf747b335c78e0381d3199ce0b46565fe379dbced83a3ca143163137c648dfc9eb7ffda6a08d8d8c2c603b6b0c136b6b0d1802d34c1675226f72f7dbe3023135cda10845ee650113bba0516666082b56c11746307675c820b41648af9f653841cb28019966062daaeafa0aeda2cb4b1c5186654824f7192501339c434da86125ccaf190439b9981044617ae6312dc067da6a794d6955f39b4ba0b303e083324c196de0d495e3a1b21ea48b0935da2e64c419060b2281d31974ee2a6848f6025fe577a9852e121770413728aa5f8e9d35a4b663482d31bd916538f8e3083117c74cdd74e593daa25bdf02202691b8043cc58045bd1ef2aa9529e79438ae03557f2aec816edb42711fc5a0ed9d6e2410463216ed01f2166d6c839041f84c4cc546117ed5a43703e7a3a53e45821b8d0e3993cab4fd54d08ae8450bde412f39f84e81003479587d1820d2462c62098a4b1d2d5f34316e90b82abd49bd9ed8329b33b10dcdf6e0ebab29724150182fd78edede611f278f40f8c69ab3f75b671d32a40c1e62366f881f5ebeb11d2ea2c5abe0ffc55c7cafece5515743eb0669182f0f4901df2b3072ee5a818214e1296ffd3039b4c3f72929a5ef3a57268a9000538fe781738ae3a2001731580e185eb08402066e481d39a1154d2a022a6d5f1c05d06559363d21a9edf81ffdb20313ceae474db0e7c2cf1d7b2cb1dbda375e03705b5187445f5e9920e6cbabe9873fbd69412e7c0279945e65dcf4cc927a6fd8b15580000aa98210776426e491294478ec98f0327b2e385507582039bd386beab3db7d1ef1b1855c942afc8f7b6f204ed08c60c37f0b59752c5bcb95deb6f0393763d5f48b55945c6b0819359b2fea8fd2079b26b60b744e8babaae8d9b570372848c41e8e86f1a1899befdf2539e986488063ef6e556aefc9693b2cfc08714da64c87631490d320397829222476b4f2caa6560944ad31084480c79f46460cdabb35e8292a5427e0c6cfb65a618835c0c8c25193a657dc8b1b31e0636a7dad0621a4212afc1c09eeddda8d2a72ff079eaa3a36e4a2add78814d7709a61642aebaa60bbc78784efda6e102a37394741fbf32627e0b6c0c4942c98c76fad1d50223536df69f8e27c966814fea937ecd251618cd88a9be976f17b91c5a27f8828b1d3ac648ae03479da0991414665c81314f2999e5106b7df3de0596cfb002a736a7ca88a12be860e238c1175ca0209d40877b5186821955e0728e223d847ecf2552ba382ec60e1c28e8620c946563030f6080316f30beb89f41056e83dc8865a332ef1de98b8303477f7170b0808baff2850e0bfcf109883106056edcd0e128d071bc281670f10503c0831953e04678091169d3bfa2648614b8b4416dc40b966d6b93436bfbc60d0e9828b0af395993ccd2983a0a057e948aa62a3fbf3c98f1044e099154b9b27437955608339cc0bbea086d79a46e507130a3095c08491e6b27fead884ce0a3ed77e7cededb9212011da7033798b1042645ae98aa4c6707515202e79f747d103a1dcc48023b69b494bedc9954f410099c52724379d01dcaab37338ec086c474ee1743974660527a8a418847af084c5caffe4a3146df9815e30b2e3870e346210263fd357a3b9dffc5b0cc60c61038916b4cc4d19f35e9940b6608818b7d2e4a853ecf82c0a6aafa87851ac78e436ac7026a3003086c28c949691fd359321983193fe03e65f41cfc7447440f0b66f880519372fabc37cd49e66c1166f4804fca247aba8a179ec61d3ce0c7bba36fe48ad88e2f8e0e318a0161c60e184f6a21aaae9f04e1660e66984eaa246da9949e03be72c774e1a9ce269970c097dd56ff58325def8a0d66dc80112965b1a0aeed554b1b705a7931e36a8ec9d3ad01e76a75f913626d0ce50c1ab09ade5a33a485560b0319b3b0c3b36f5398c9dac5f8e2a4d3012bb2d08245b5bb78569b2423167cde18740e1a3b5870a79dbf6486e0173b5d84e185eb0b64bc828fb12f0184e025c5531a565223bac6c60626604307c1ba9f106db59932725210e64caa83d0fb2924ff77081f81e053df5396a067396777820f40f0f9bde6e33105b533b1e1e30f9c773495f75250093efcc0c7902fa5595bd9c79429193efac0a7d7575aabe8aea0c307c6fddc4a3d85e41e58d3b4906741add6d71f7ae0cc3a06f724624a4247ff9107c6266ba747dcc9a22d1f78604c44fecf154d738595430b8cff820ba2838f3b70aaeee65e5ffa473d36b610400e3eecf0f9a638d16dc4b31c5a2b383a70b8bfd58193c147a452f1e4093dd1814d2e6abb746ce7c0244d49f7a27b7268e506bc0b14e8700a9c073ee4c0a8512f21670b922cf42ffc04a6031f71e084ce6bff4da1b36f0a072e2328ab0a96477aec38f0f1066efbdbdb424e11512c6ee0bddb46787814d16fdcb831838f36f0e6c9d2fac95117526e470e1d384e7050290a6480021420a6c30b2f8a083ed8c0e68a14a93dfff4d28f3570b5d9be59faa5e5fb871ab8d6f02c916b64d221fa9106bef7bf9392b42f42d51f6860474566919474d37bf6e30cbc89a6cc6a29a6f4261f666063652d4d32bd9652df4719d8a4845f977a503a499e434b4df041065efbcc1c03dfab66427e4e36494d7268a1e08ba303c78718d84b217ed9b985d8df8ae1230c6c6b2e4fc1c3b4cfd361f80003b7a75f728ed61633828f2f90f369ce21626e8ba60221c0d11f5ee02bac56c453e66f497268e1c8808d2dc84717b8d2bd110b1d65ee1d2e702a9ab698d47e47af6c0c1f5be0a2a5b8a9152adfb82106185decd80f2df07ea3465e8be6230b6ca51c44b4ba5ae4a4fdc0022337d3b78eaedaef908f2bf0315f658ba57b52d2b815f809b2cb3dfbf85105c63ce43abbbdd2967e50810b5a2c988f58f89e3ea6c075468f9e3a434a7c488193626a9d7a2df2c75013cf131f51f880427e31eea952761727c761e0e309fcf9dba64ebaf7e39999171f4e602d87aadcdf4a11d9a2253e9ac0240b21656b089120a41f4ce04784452dd31c423c1502bb858f3bc894d2561c9d600ce48de304607461f0001f4ae0aea35958974aba52b4c24712dc16d3bb112a6e60023992188701376e4ce103094cd011a39a7dae12253f026b2e4994c80db5592123f09573cab896828e6b8ac0a9acf02836e61584ba880f22f06d2a78d6d05be1ba6b213e86c08798be1f2a3c4d16c78381c330c013172ad0e11a2895237d7174a0cc0d7c08c13d7d6abef7dba1a4021d636c91868f20703ab3b957a94060af445bd03b293d7d82838f1f305a216d52952e59d5ee0336a88a646eb71d64090350838f1ef0f93de7dcc9d6d5d7c4032604f53cff705bf1b1032e8390a20e387d4164c93622fb8765630b1b5bd8e8557ce4809718ed3bb73c53c50f1c70c2f4a4511d947e52495ff8b8019354445f93b89fab83884de0c306ac4d7a2d21847077cd7ed480fd125943ca8bf9e18306dce8186a84ccd8c13212851ab3e0a2272931c82c416551d240b1430d59702986d6abfcf70c41e9c51874a8110b4e459219a9d75cf72758a8010b6e75344c52a6e41eabc62b38e1f527b45e7ccb9e0b430d5770414da9c896bf2b06b7157c6f1659fa9e55f28face0e257084144ea5bf09c55b03569432c846de88b2ab8eca0294216eba81b4a051b64c648769a6dfc34d77109811aa8e0f5b44e8ac1cff2f9478c8370eca9710a7645c6cd8ba233342e7c8c1494aa610a3e7752dee57c8b399dc610354ac1e6502a8927350bcac73cd42005df159a6388aea87aba35d41805efaeea2198f47cf92d68a8210a26ed56a5e5e46d691dd60805e3aaa6f9d53e3540c166f178d27cdcdda2c62798bce973507ad74ba9c7136c9e7cd283dcd4e804e71233aa44bfd0a12ca8c109fe6d3c27fdfb20121cc46a6c828de6f76d3aed4454870b1d61580d4db07dffb9419b094e78d69ea9742931b939b42a063530c17a301df3c70fea4daf4bb021d8764848a633420d4b70aaae9e63142537422cb750a312bca8f98ba81af364419460ac430ea62fae5aa831092ea4cb9433955fccadd790047b4ae8f04832640bc2ab1109c673ed8b9ca06cd4cf1c5acb831a90e0afbb228f0e41dd9258e311bcd9b8aa988b0993780d47f0d94386beccd22c4ad70836dc4f07651d32a10623b8fc20ef42d59563c721e6801a8be03ae7c5494a868fba48166a2882cdcf5a9b58969e16fc070347f72916811a89602c2421d2d4acaf236e705003115cd22023c70c22631138e3a2c621f8ce7b4994d68a212b65085e23778f2cddd933a61405d42884f9cd27082183493381d15b83108cdc284ae4f4bb210779d526a0c62018c929df7e754a923e6b420d41f029c2bef2b90969a5d608049b3428a549281b108c5ac664b5ead6f803dfa731dbe990fbc1ec5e55bb27cb1a7de0b49bee7ade4e1042abc10746b48894d56a4165f76aec81b37613ab7f6b7d8d1c126ae881ad4a6f13cfa6b684d40535f2c0a778a523a2f7d608ef0635f0c0ad69932631ff8d3af91dd8eecc3156d96d07264b0eddcfd014a1461dd8607282bc92acf59dcba1656450830e7cd6c5a45d42e4dc9e9f0397eb94ac499e9d9bcb814b9b344aee7890691407b6ec4dd7f78dfa2c7138b051d34949195266c4dfc095e63d91e2686d44ddc06778528d1ce936f8b731d69a8f121bd86a1d393a5f7bbd92d6c049c8912bc4a44d7c4b6ae0e32569a93508a1cb4a6960359d8bf6efe7cb104203b7eb163347d252223f67602c47d2bfdb1c3330e66e5b1dd275828897812b2522932599f44b78c8c0776513ca3f6dfc0d9931b0daf9b2978f0eb14e2306565f5d6f57fc523313064e2591d7bf3ed7791c0c9ccabbe165ba52b4e80b4cfc1b61315a1ce99ff50297d466536eb92ef0a7dff6c13ec7acd4728193d183f9a515a13f64b7c086eda5c62879d2a6b5c0698aa2524fa259e0b76b6d62c8799983140b6c348f9f4765afc07af6fc31c7d3a52cb4029fd3f44893a0a24d50abc004212ca7ec954ac94da9c0bec88d39a81016c934054e66bc1249e74b152229f0e51a4183c8a54382320aac9b8514445fb9a832a1c06da860aa2c9d89d69fc09932adaba43b81df51ba62cce1e9d3a8097c85901acd6702a3a642be3caafde359021b2fc6603906d9b7a612f811b58ff9fa25940476336af85eccff202430a24c9608d9edb45a47606d2f7e0eeaa1e349d008dca60da57ff222b0317f478e9913811f573f9554fa29350e813555710f293c21307a27679f9c267b8c5d1058d5ca9072b4030267ef218b12964564d00fd898e29d2afb33a7d0075c6ecf65b2ca2fa3567ac0e9602a7fe2a4f080c9a93b9a49ba3c95db0ef818546dd7064df144a603c6bec2444595d4ebb11cb095cb4a72f6ce66711c7041cf7c736faddda56bdc805327b2a434211bf09fa7314f87906fda1ab0935b47ecd574f4b4060d38f513aa2f79c5b59c053b6a21efddc9a8db952c180f12e26de6c7b87e2c1811d2858a9be9939081052f31497c2f9d4235f90a36bbb3baafe94a52bd2bd8a0932e765d48a14c6b059393ca9a83b5ac60fd4cbd0a3e4b08376d49a7cca2a30a4ec5dc935372489b924d055b7d49988e39890a36861092734eedac693c051ba92208d19ef89f33145c0b6898820fd26209095ae3dbc74bc1fee668427207d34c2229f8d2f9d1cc64879c9a8d8253dd88792354be4314fc6810c9724d3779c943c18b44fd4e32dea0e0a2c5db20ba235d2bfd092e7708393c8614c26ae409763be4ce58163a69e67482ab144bef7258999887138c6a93d9e4ae4896acd9049b2fa6ee3e32a5c78c26f85839ebb3c61e69419960a4efe51482f4d2d7c18449249172df622ec1c9143cb3a6a5aaac5a821149a925510a82e07d726b5ef2afa0f94070266408f393f963ed80e02f89a0a1f4d286eefc819164eba15ba134c8f88109f69e3a338d7eae7de0542da7de562b9129c6074eb4a63d95bb228910db03233fc7de4fdaf4938e1eb84c5a73c84fefa0993cb02ad613634af1c069c72da59eb9acbf3bb0f97c82767fc60eec06491b5ca3d8491201831675e03a8a75e79c2157254d07c63206a5936c9115f4670e8ca7ca206388460eecd686cc263c64d17be3c0dfa8e6e63af9164385031b24e80f2a47c9667dbe81b549b9574fd44c65ee88e106f3fb6fe7f70b2e8e18ae23dbc06ae44c3ea2d3a7feb46003934efb95fefabf3f79166bb1063e8b07f3ed77b38fab811321e58a1213d1917e1a98e42243772cb9a7bfa381b7092149db889a75e93370417bd0d4694f3b7333b041a8bc1a2f8bd44b3965e064875b2acd8999364306fe4ec99222bdbbbcdb31f0b931ad7c6442a08518388f563fc294302d790d037b22af629b0c4174a7e4d04a2dc0905a7c818d18a225a8e4926397fa85165ec01468d1852b560c92cb2aa5985482a50517d2a5ca936184716e145a6c814dba6b9fbe628f086e0e2d1c8866630313b0b1636c60021cb05068a185d3220ba605160a2981165760b466cfdaeaea6b8bb50019066861054ed6d85dee5e5125ea2ab0de952e89f85a323df4002da8c0569508caebf2efd42b052da6c0ebfb69a5dfd96b74a5c008b541837e8f16b4a951e0b3e429b5dd5947d4f5042da0c0572af51aba792d9ec009a54330a1326f94667368556d2079181ab891650c5a3881b1caeda7164f4de49bc07a0c399e3909372162029bdd2445123a889ae812b8512926124f25707d2bb12cc34f021b39078bb1d4048fda2381efcf9e11d7fa2370595a7a1f9407f5593702ffaf49e974bf6b99ee2270359aca6dbcb75a6b22f0515f84a5ec8b7eff10f8d29f6ba38a84c0c6b21d592f9a93dc04812b619bd12a757e3281c09d4c3a7b24d30f98a0397ff04a412b7dc9077c8e7977cf54520fb8f748f5fd67a1829e079c1e57b318f1be436807fc4911ef5c121d305a2cde955273c06e0a1952c896d702075cf95edc4b934ce710a4c50df8ab7c93b694bc95dcd1c2065cfef71ffd8a17f276b4a80193269824cd7ac9bb375ad0800bc1268594de654a6d66c107ab7849c8989105dfd1ba946c9360e9df587097b935686adefebdb0604f8b8b77d03b4f7b5fc1267da3b39ff0cb5b5a57b01a74db238af58ad0b682cda3fa94d0e21f27baac60b3630e65c164ac28d255b0e1a643f2dc54f1185505576ba7b3aa8d7e8d9a0a36e29dae1ed724ed525470273db55fe490ad969e82b118628c94276a0a2ead56cfbb735ff452701e528a112dc7cbf9430a2e4dd4d39eb37b8898a3e02a2fe535756ab52b290a2ea58f299d122ae2d6a1e0ae4774c49c82f60c0205234a63f013fc089946a8969e94a3e8095682870ca242ec049b3f2775a2e3a7d61c7282cb7173b668fa4e63ea36c1778908955384741e2f9a50d2c84efe37964cf06b9d930c15b1eaf498e0db43ec4b37e61fb376093e76c8912442fccaad5982d1c8ba5582df929a9ac3cc7d45a3042742c42cd974c658a29a04a34aa62043ed2da8b52451b220e3a75e5224b8d6984bcb74a9535a48f059e47be8603e828f29b2950cd13cfae8087e35457d75e27b758de0933c53afdd63ed298c60a4879c91b2bc736364116cac521a74288b7944882238cf9932af3289cade26825395af6a3bc9a415728a08ce377656804330c9e42695f431c5c43704972ea69cbadb7527e71482136b112253660eb23d842863b0b89a9b6206c146755d13a1a729a95410fce994d74d9d8e869d81e08465aee6d1699f441010ac59778cf92b850afdfec07936d7bffb2a15acf30393d44573d3362de84b1f3899f4f5f8ed5e755af8c0b5bad5e40bd97e54ca1e38bfd431b5edb607ade881310bd3e6eb77af21250f7cda969cf8e9747a53e181abde9cce844a4d975377e06ceb742b857765b4ecc09a4850d1939cd4b2aa0337d1dd4a3bdd4a448a0e6cb699aefd909a03a327eb5637269996037feda6e63147f41ac5817135dfcd6295f47be0c009fd953d6955eccbbe814f4a081f0b4ae77817379823c970cbd136f01d5b37828a101014800dbc29fd418479148976af81b111af0a3ae389f4d4c08a0c7da79a9a543594063ef44ee6cd29b134b268e0f55465ce9ef9b7ef33b03af2ba479decae1833b0d53157363dd2b72b65e02b68d357593793c4c8c07846091e54ea1bbf740c5c9fea335da23fec1403a7424ffe5c4a448b2ac3c046cd1959ccfe4566c0c068d0567b4104bfc07586e0f182bcc02599428a88f9eb02bf751593d2f47181b3a4fbb2ea2d85e5650b5c65fd20d3a4ef85a4a205bee295d41331bb4c2959e083e5f62fb10d8b55c102232c8ba5ce26bb0227b3d4fdd52651619a15384d1fcbdcb2d9e8d1aac08d4833952fc92a591915d8da167df7a4a64c3d054e7f571231674b0afcb6bd8898c98927ad28f0f9233306f118a3490b0a9c485c09b9d3e94bb39ec0f5c79c325dccf3f5ca09ec579b664b3781b5d12d66723386f299c0a9f79026ba2a33be043ef8a4281a456c728e12b898ff944e891f1e9249e0a3889853c7cb413f8804b637447e5fff09ea1d813b5da739067d79296604764c453ce6a0725e844ca000456037d4c9899e2775d7446093d0bdf5214534290e8191e32124a4f6244d6542e0b373d404d3d0be292e70b818a71e508020a0955a52ca2ac1c3ddd328fdace06b4105000277a2471c42017ec096674ada92bf55aed1d1a0003ee04e64d0a1f35e6efd0d0705e801e7a22663c7f1b8800b0dbca0003c602cc80c936f1253e5ba450e0ab0034e9dc64b29b5c69c357643074cbc8b41df69ddf353b7a00039e02e549b524205c001ff1d430711537c741670e1050e34c60e6501175ee0f03f0628c00db88b1eb3fb4325e8e5779c85c059060a6003ee227e964eeb9492fd05a8011be2e94f5a2359f20d0b4003aead455e8a36d3eb3139b494371815b8fd9805db29e6383abd6e0ed5f9172b00030718626091057cc8828b933d66f4ca3e69f7c1b1e3c610e368a0051fb1b0ac7478081e3432f880051f4b6b8a93ce7292267a059f49a72821c6f6c3157ca5c66c6923ed06f9b582bf2b1d2a241f3f58c1e6a86f4274b86afed22af88f3c42574cf1c775f4a10afefa46a78e54f57ffb2315ecb95d7896d2ec6b3f2a18ddac9b60ca7d349a4e510ea6378a6ade146ca90f1643bacd91d4a8146c5b881ba6695dba37a4e026b5f9dec56e14fc8d9dcedd561105973ce8cce9db534c950a056f6a5f5782bec9a0ef0728182147fe5f0eea4f70797793fc623e3fa1798289924d4bc7ddceecaa13dc7a2475f31141098f7c7082cd223429996983d2b13e36f1a109bca13a3e32513e30c1c5a08386c4bc5832dac5c725b864ba7372fb6b89d1cba159a47c5882bbfa90548a64f5163f8756a9faa8045721b46b497dfba0e91c5aa4b6bcc1f8e21af04109ce638c28d174ee9849e863129cde04914d968e24d88a112346bf10178f5d043e22c1eaa411adb316f7ff3e20c195da7595eca08f47f0df1b838cf963b6baa00f47b031e45831a51311a34a1bc1bafb687dbc5c9bc6c2850f46b0934c5dbca4758c41868be02ce4adb4bd493fdfae08fe43ab55501ac2e123119ce6fc1ad48990d32d09116c12c1f7538d8cd4f71e828dd949dbfd53cc0e1f86e0b4585a2abb0d19ca367c1482495ebebe6fbba5806fdc08c38b84868f8c7da8a4f024e25824100883a1703810808102e603e3130000000c201486429160248db465fc1480034b2824443e2c16281c2014161a8744c24028140608038160180c0884c2e15048201ccf84bcfc23fccdd9b69cdbc999e79ce7382bda9ccdcd90cd990f73c6dcce96250f9f0356c899d94abb0c693383abc7709596ce29ca2e9d82b9731b616f895c47837bfccc3d8f7b0ed169fade7f1c99303dde814deb1166c45d17335dcd2866080662750208a22d4acfbd8604ee0af7cbdeac53946a23355256678910c3f65c9854a1168be89b326a1661224fd6afd2d834fa7f6ba163cc780669085c05be215e24f785c3c2091c82a5b011009d7eb9d6810d19965687ffc01b79050cb0f5b5b7672bd90d49735ed176c4c29d8d26ff6656b1e3c5e68d6ccf32d42c88053d878cb4d89b356121c6e908fcc0d1bd5cad382fb3b985f4189e1093ff24a0eae6b9fdfaa5c7a996959b0743986eb3e77bfe4605f12f85557bcef57a853fb8c2e504163bad26ee3c3ea29dc52ec3ff66161d54e2d4b1c5b3e2b1d8a8fa2dc1c74d655e42884f4d4810f3bc45686720a124b49317bc4b00dd21d03b6a1336613f500a90229a4311fc3d17d50eb0280a5da010519193d28dfbc28a775be808433e704c21984d39b0c669aad8aca0c5806e182d8d867bbadb9df3cc3f86b525e4119e3efb0c8d706a78dfc143abb1fe5c0be0c2c521203af53ca677c9ba39e3cbeca9f2bebc27be75013e16e90f2092a199c3f5820ba5d5bac5913d05fd3d76a36e59f99f62c3158687dd53c9fd0d0f09e2b431be040f1436264a3ab96e5837d71dee86d59bb134156ffae571f766bcf11e8cf7cbbbf24c79a93c40de9537d1bdcf1cfd78a3c48f9d5008e8e819fc591a6ada7061db859d298fb06cbd5afe4de88881a8bb791ade8ab79f6fc28c1d2a15f31502527a13e44de07ae7b742f73c0bb357ef11f662e12d4432e6e2d6e105279c8059942ec486ca86b68539070ff4f306dbbcfb8c7f6469779a9ad6d6e460e0f52feb163274ec32f5c5b8c9815381b6604c5444de1d710bba30f9860b3a6929b90bcd9de75673efdc656e3f37b43bd4ad706fdde56e6f37843bc48d7add0ade9271a6ee3e7ea8e28d8a169d272a257e744752c67b9c5f0aee9cdb39a6a5d6a90aa9876c593a757dfb6dfecde67b6c4b5627db17d51a7852e9d76d7a612591324a962f1a4ac820d435cb2b47c6a3885148b1210d1152344927471f21a5202279479bd1ecae196a8e968b5c85bba4161d4103d0b8457b982332b1d19553c8189acb7927775e74317ac0cea48f51a9c552f9a8b1e799c1364f4e29153cc4d252a0a897a4a537a33a6f15869f05fb91614864694b76b2e641ce1cb30551477508c0e4932148e488940265835ca018c424be145e26d16c32e43082fb265165683c125a0171f9de345d0d14722bf73ccf4b5eef8122d7d0dd48bb5130da3845b20b0ce1fa21a9263f386e59ae48006dbd0dd2fb4101030163b313ad0e806b7b9135c8d4e8b36d2784b8b4ecba2f7e6fbcccb7bc7e71d0cb1288cf4d76b2f0555c40df0435082727b1ed7296cd0a83ba6c4df8d4210763e4ffece9e133f723b60a90efc57503079ee3f01ea559081746cad4dca70c00ea7d8b58dd8bb06ee401d05e25a05eb73dd78d934ea15db7a1745097603af90d5070b4aea9f052948fb361c7552134e496f19f0c34dbb77ce8c0d557251e7cf83215a122f935e5bc50db6d668269bcaab06e8297114998b432c92ce1d823e6783c1aae200af5ef57218fa4fdbf9dcbb015d3dec5fa2e8ab104889334ca906cf1b43a385ea9c07b2c09dfba501a262c88e36d4460cf7c4c3d4c0552c389c1010e92b78295a6b1e5d9495c0afa9a342b588eddf8989866462f8b5b2440cd9061b5c69132b7c48b483c7767d28780369438019d780586ca75b854e7d910baa21e6ba3e173eea11140c9b570b904fd41ecc560a217958c710becbd45d5389aded202876af974244a67c73952ad23619c2359f59b6dcfe3bf27b20851dad1a8b476a1b437443670d596c9630e547ff648a3749d2e00722ef2c6299394c8e993409bcd1d51553acfe093925723dea2900c7a55f6702e5f1f0a5cb3a2e8c8da7eaf2b330320861109db08ddc8add9f8b2359bb21ad000cf634ac2f598b19572b5d7708f19919632f6ae6ee4c0193252aba1ef3f8d4c441fb35297b165a611137747194e85e0883819076371a71099cc6adf9bdf4987f02ef182fae849bcddee61fa210009f1bcf999142eb03226982cee916ab5b02d44c8638000b246e30d3df95dbfa1be68858ae49e3fd0867190ea866edc860df2691ead54994a8555a2810f9e03a87b8adb40b4b81bb791cf86d3baad762f010aeed10190c80f89f19d2021873ef935831249264f3377a1dc9c5696c5c95484ec51fae7c0ed7a521bd037d182153ddbb0943d6f5440c1bd0ceca4fa4256974d0162b8b551462b1798ef7f3d5d5f44ca9d8686cc723e80a2c24496afa0f1d15133b6cc24fe824cfcb0e117cfea3abf962e31cb05af36e1be6dda2c07ec38d240c0761465fa1274c1a449b078c7b17401a5866d7a3468687e756852de462442d1c01cffab5d7f9e8b21c98e0b29fb214d56d44b4e6d41485d8d840ea2496a5dd51c30814c6f83c87ada6c8dd6980db039807197050b388d3433f6c9168949cd2d6bd8e0a70f29b7535694a600fee9b95fe98d8f1a6058cf8907852b3ef7ce25afaf81217188683c5459a21db11b15543cfeb47038fe752987062bd70956d0fa79660bfe538c4d10506ce825ca1ec9f18ecfa36c6a13045040410b2442bd5599307717502e0e697eb016517d8b090b497808392dc5c5a9bc8bb9d83fbe2f26606ab7520f9aa8cab5345cef62ea4796f45b325e6350c351528a86e3341311be125464182f4c566fbee8a3685c6452dec82941eb71c65412a74d56baadff13ab9b36d9c4a1ee4ab0575c83e8b488d15d9d3da1728f98bf1c840d621ffefdc294422da4424ba5e55013bcca5d07a3841724605c56df971d060567a16871405fcd63ae10619c3b8a9cc4f2eb4f6cd9182de961267e1278c9d59e06d00f5ad3a38fc3f19846635b4ac57707981c1b374094bb306cd73a02b7ed97a5d36822429e2c784579fda9809789b0e06ae0114ffd2da224e36f20126057b42f015905e4e28c09a4c915f4e2cd73f5ae06e0c45fe7bfd04b68f4267c235863e814c442c77631c9f9a34274e0b1655836d63fd7febf448e5ecb4e9aa1f103b0aa1bd456b3727e60278f5587faeec1aef32fe58362324bd29f6e4d061b7a9535998d0965b54089746c243fc63d7214d999f9a7f864c94e08ad517a298a654263eca4912262adee08a1b85a85cee0b35e8b67ab9c8e60216e5a5b67aef7004410477468d6126bbc8a81240518a7332a8a205f5dada0225f270174a03284325868ff7e2e03d05ba1b6f23533bf0a2aa8b73ed36dcc197ef27d2842010caa5538c60eaa81338aa1a559043f5658963ee5da999ab2847181ec470666b9ddc796797f29e3ab2270833f833991556e4b030611163d0ec60baac74a6faa4fcc27c226b87b2700c9e5a6cb4379bd3aa6b8cc9254b43eddb05e61c43ee4a91a1311891fe33f358e8da3178d6b49eed1ce3ca810fc8f4675039a7e6af4340a0e8440a270e14efdde9276a19776a26df890ee0ae41030858a7bbb4db02d4ea274cd846b7151ba7449874a4c410dfd89112d21f9cd127049c80c59dbdc98e8a95e8d72bfed25cac77c01ffb338001e970f2beb1e1a1c812977ff27238001b4d8522051521641e1e23e3480896fcfe198f6855ba8f995bf1a80e8bad7f4adc6143967bb1806abcf8e590abf26801b2244ed42b22fc25a3f248712961bece57c951a7e6485e4e4553c6ca8e61dabaf409bab6bb65cccf867e69054d0f621b84066e0f219d3f34702d9aa420139d0e421509e577c275e59fcf874c6acdbe1a741a6102e9f9464c478da4f748e9e83c6c3853edbcddaadc405b6e3a0bb8cc7f1d1dea915fc142bb8868bd9366b852fd7918f263e359a32d118704358481daf2149749c8e0003034d731cc498f0963b52301352e8d97f3528518e120c98f967812fdb5e7f95c63f57ee74bcf85af6a46e4d019e8a4b4318db5023c221cc603934afb720f8d4dd6fb2ed54700339a87fdf43379ddb237eb207ae32695bfdd68bfbc8fddec44cb117b95a286d37e49eb5ae809417641b0e7ca3fcfe6c6eb8ff424da114e99c39f4674c7c55376e0864a7e7ed14fec299d727f223e655b7caec63ab0535a3d14e349cd31247c70b4f472f4577851691f627052e77b25932965753d54abbb43e051ee0082c9026c74c450ae42203b2b47bd9c6880c284a0530edba2796dc8962b62155ad3dd2d6f16cd0e7036dbf80976396180a58f54e25c63a46b57cea14db74d96ab12d3c5e754a7e3991a0f3081a5105e3ded0cc4f3e83e9522a11daf3d8876f3b1eb4da137463fac6b2858bdfc14b1dcb80d0cc2dc3ea1e6c4c21fb0db448df5116580b6e05c40590d9240cf3521a4e8c2352f837302892e1a94c834369f51057c6bd385d786d3c97cfa524254632d407bf81cab69648308f9bb6c81c8b1daffecdcbc1a04c040d53b12e167491343c9244bd10ff11e5f2049c6a3621a5dae536c88de633c4556d5253f9d170516d98e0d5b654e72527d520aa0f16ad7903bfd25a5b1837c20d7ee24bb6e640e5cf09d0f98883787fb0cae54ca35f87d3bceb2f08857d634e990ff8b2a32daff820fda3a9423459f74c0e662ec0ec29b68fd39ea8c840160a94ce98cf1dcb405cceccea4317f8c473c0ea007198e6880ed9a8fcf4a83c2fab7ebc7be473aa0136eec07269d701849a0563825409352a3b0104a167275254581b92f503b8c2ea8518f386c8b19623ac78d146d58447b1d32fc08a355c93a9e77e16e99a9ccbff2593a2afcd7911958e9c2a3aee748522a3927e5e8712f11214ee84a11aa37e3a19365e9fe1746c86a377a96207a4615932a55eb100ef6ecde046f73e6a2a5b309e53ddcef26ebc6eff80d1e1935d93590974c0f1464dadf78ac48c95ed67f996f064bb784496ccc348cbf448aa313222be76bf78f292e4b81c1759dce6bb36adc3548e6825e20dee8fa622b0991e17915b8f8c1fdac02257dccc73dd8f002ad3061af9497b795b4d80b0084f9db04fe7247c9c0ffa97804feea0a05bd04ef0a0d7a6287c003033e40aab411300e60405b63ce460cbb452481bbc0e7c4461c193649fcab96ccb365aec8185e03c7c7cd79c094ca87856ea12ddc224fe4a8652c8a4b7126d55c0a6b7d70d25dd3b9e0711489252245dc9bda42d29c1290e7d5744b9225d4b01246aa98074f3b4c08a8adad3d23eae3cb180425d25d24e5ba7fa1392e3c45e92c7298e5a96ca3a719510ea523a78bab45a4c5d484f9ce679f5c7e26339f24ab053759973a37cce2bfecacb5361c0c0bd66a9fd3105b61f8e6837a87f8a2254a290ea10a9fe2d1aa7f228595dd2fe6f670b2389c9baea04359da53f024271ef25fb93fa9aa5be2662a96fff3e7696a2686435b2fa4a152f89a0e49a7cada4b30ad8c48fb003fc8158cfe90d24b314a0efee034d51f831a85f8c61e2a596954d4d70803ab3f3ec1b4d73a4bf8e55ceff43120e5c184d88d16054f6790590ff38ebf95f2201ec106305819f1beec2b43288995be639f3cd3cdcece819ead019ed9c7ef93eb51cd0d6f8f755420932c72769ce1c4fe8f14356b5973fc67714335cb4f3ec88ec299de90970f5dd73418865d253dada3aed3f96b829bf2284bc8cebe52c673a8f426b1888e493ff4cca36103a1009f3ee2c537e14fbb89d81313347fe8370035d514c86d40bcd159683b6053302ff9c96d679a30d68f33e669c78a1dccb4f0320df894e9a9b54f462d27ec08834efe3e400d221869df9cd1c220c1d7e235636327b4cdcc1d085beaf1c2113c30cd4e495f32e2bc5cc99d1bc637da41ebacdb543a2660bc70f20e9df33a1ad3566dd64a21b5475efa082e88b0bdf3721601ecee0025e3dc4deb67907de0c53efef0de38b020d7a42e71d4c8898673d0e1125f36859e1f51c1c6c185c7eca1c289c5848350a435c048cafb790486545e2c1e61d0c5e7071b13e7363184aba2434849911e806b327f01c4b58117ad9a256c56112184b25ff1187f54210d93ce74256f0f48ef5393044dfafb6751e71d80bd8822b506472b54caa1199a8817f15dcb0165e31a1a9039a00f9797536944cfbffb99801671d38f2e91e39a4efd422a11d0d8715c17562f42613a7461f90e6c42f9a74d86309d63c1c4e4877bf145f5a7a25256d64268cedbaf2c7661ff060d8207405e31db6c642717a6316b8cc16c27e944218dfabdcff02df4ebe2e7e7165934937e983215e16314a0a8d79cdcc05286cb6cb894de0d24c0069a9d852e14bcbffc6077234a2366823ffecb7f598eeb98c6ee7039c5a890baab20df2a49e4b2a59766d26480ac8330726356198778953cdd4b3eabb5400e8ba341271c30578f3f7a18a7a7d6dc6837beb0659bbf598dc4109112b7251148c97a06ec0dc844dc50f234e5258b828d78a6f364ac3261e2d2a60ba478c32af82743548901490f42eead5dd515a1f97d7a11704265f15fb8b7af19608aa9fe8509069d66c172e09f8291af272c3effcbcab6ab9fca97076e60628f93afe921a0b7e52b3748f14d5e1e3491281a5621d096f04a066f9fc2e306481aa260acdbf4067db93ca7a3f06be8e6a61deb5a681befc1d310b60a86c2c443a03c720aae06a260ab51bae780a53bd0222ba3cb4f927769fc084178f13aef04b12f5d1f74e43c118a49a0d519508a115f5541c00fc904813f3300135cb35c21c806ae3ee9111634d7f9d8f3c5750c4f84a06b5f3c9e8744444e590137f527afc65c7a02750d0a08028c3321594737515e0235dc67f10339f949467c24a7c3d7e21eb99a524dc37867bfc1af616ae3613652010d5cd4d05b67e0b2165a472b8e07e0f35a4914234747f81c67fb88684cd24e66ef858f545da8249b63525d37ffa641c20c5d6bc0c7b14e0d3155cb7ac6c0c5bd7955de2430101f3daed09c603d7350df9f4c09a813579cf234f9feb00117b9507bffa46135451bd260b384aef457b1bfc377943099bf87753ba518e0a2795d583b017f217ad58e18ab08ef3c2757d81348959b1630a97cac9c233790d84ddcbd94a404001295a34115cd63ee9b6201c79d720014110c08f40664d240566c2bda1b5c7bfd148953a56a4f16fe1fad1a26eae501b49962a50157555bcced0460fe98e3ec22c20ad98b7c8aeee7c284df811bd5e36d021a8defa91af1177e25391ebd5e27a6946184ecb8845aaa2951f2370586cd6cfa5fb55a6b6f9539fec900388af9224beda6a9c2c8bd12d56f7431dbf5a701948eee12f1a36fee9997f7d1067ef4accef88a92088a254f5a39287927a0af24c43f9d9d54bd043c404182d8a7eb26a7d6c5406cb700b7b47ee9d0f21d5bb3fea7dabd72a92a41f5b877318f729aac74abe9160a25d123c13af47541a53479e17158cbccdab65970878ced3a0ec1bea7c997ba7e9f174d73bede04133368b3719b3da7b199f52df3696e6f7498992c79b6561aef1ca30198f2338862f1df0a60a61c10156025dc54297d3ce78d848d3209c8f49b24dd8a036f7e6f96b1755a8a19802e735a6fcac53c7fb899137b083b22e5edfcf46521b0e6530995ee7ae497010c462ac6d2ebb119a04487be53dba42083180fea1454b32bf2dc165dd439301729c7d0761e49dea2717f64673411f439057300b270c39fb61596b13d0c10ac48a4cbaad4a80c7ce6e4f80ecfb72a8504071bff29f75dba42709c43424583f4f57a6390c7ff28c4dd06b91eda67e497bfe01a8edce4f93f612149436c2368c82bdf9b7426716ac4fa1cc5e176126f9a76516720f119d6637f51bf27e1efe978aee0b513920d151fa2928031df16644c42b622dd6158f8274e2512872bbfd6feec1e0f4215e0995db5c179d4924bd25543a7bf9906fca12504fa3a394d413a56ea2c47a4d492c343f1e5b2f90241e66455d70d44a01b214061f6f862689c75bf0d80b1ed54b150fd5be1ef1757fddffc72716ba1fcce9a4f62872cbda99d3a80cb7f213ca5356ee6f36c016c52259fffd302f28b13cb23173f0aa0030abd1412f6d972ff5590f8d67e45fc7bdbb6ef9850e9b93b40caffdf968b97165dcf725c360df884d2810084e85584c8374c4b5c6f59b75c4362bd01d2ce02d2e8c9d662b640b0c0bf76641ea4d0b637b0a97b2e958f0160bdb7b17062151805156602f7013067b7541e85119467240c9124e239861246fc75108cc77596c5d5e63b143916f5e221175ee1295ceda8ba483f321bc5c275aed647182b655a0311b7fc4da579f939bb29e154340e7468adc46f198c96c64ba9e3914954704dfd6f831cdc13da1f1281a46879db31a3a5a9afcd38ab73d52521ed4a191a7df8d845c3b2b4fbc06585c322c4e4e0a2c48fe3833cdc6818b6f02ea9cadb61619c8525302055b594db7de4db4ded5b1e8442bdbe73a756c65d56d089c9535301867813d5c8efce87f78eb745981415a0963208730d204e2b912d1627c7a48e4163aec994d160e678a7bdaa9ea4e8659b924114cc5d9270d57a6e4ed1f34dc5889846260fb2b16420688ecd0408268014ebe2600eab0f03a790612183687b195f9f6975fec47c3146a7f816d1d1b23dd610a23acbbdf419c90f19c8f7028fb0f3b1c9a64a25cc2a7944d9bfd29f76aa05473cdb075de04f6a1ef2b809d816080d885c6036c25f7d26f9e903e1c18d9a2c690f2648d8bb050da8c4a2e310a61b3e61f9cb08f7fc46528ee248d68174c490fe837129014ca4e0ec3506b9f0efbdc38cd5b39be743d4a8e65d5063c1a880685899f465b4784a730b496863443775f0351153267d71300d5c79013346b800889fba4d8ee1512c6f92b317e50d753d76e4c373c4cc2e10cca8ea7c2c120471e93a32de5842ed50479e062816ac6769f781a2a47fd5d25b9dd7fed580f473052298b8770e50d566d2f9c0c8ff2aa036f7d6a48a1a538a6258e581a5f0e2cbd3fa9a0249c8d6122b60b6aebc811d2797b44cb80ff27825e2120ceb43e045140449c346dceedfd4f5ccfbc488d65ed8e282522b6b2946f00fb59979609db58ea6d03c2569ef1a1340719cf51190368b557ba40fe7e21711349b696b1dc0012241c428b9420b7c8811f71c35648c9da23ae92f952f8226a848ed611deeb90a5e209ec843d614df82dbc0a3fc2acf05fb8164e0837c2c21ba24cad43042d08b6824f43da41fe44ce9a6bd66a111c7ecc8a84100c0990f481cfb0b0754382a2fee9bdae163e7f2c24072fa4ce9450782f33fa58c63eb75bf7e2c420476291243c88091a2908a405e1bb17f54f675d08ba7c96204fb097dc26bae259b41ae333a5ecb4be0415020b24eaa09301498f69898642326b1d2aec9755f26846ee8cd210e5bd491d26f8cd808656e44eca690ae33e9b6882188fb299327dc88753a326de4eec2913dc8e5095d7dcd963872dd4e95cd56468a83bf42586b56803cb0063cef42b41c5c863e691d22102acb329ea2d47f5018fff59caf96ef219e525abd6a29599aec65dc650b04c327c1f454af352beda3a5e22ba32eb0fd7e44d34fd07b5d2b311def030f7caeede5acc3eb5536a2242406faa2ef235099680394da385e27887c3265959f760f80980c611fd3a9566627a32ebbe6a165d2c00d84aba57944f1ea4cef4d592179623fad97d2880e600e635311233b973952902bb62b658a7c5184a9b21b370b8fe60d56c3236b2a00327f4dc556746a4323b0d17559d6fa49878230f58eb4d01f3faf44d67e5009c7f33dc416c018a58c551848797444988cfc275a8bd2da85a363b0a366d9a52086722cfec3b418f8d4702f636938caaa574259fea6148382440c79c528fc09190b0edbb0b9cd02c8dec1fa66797405aba8d05a58328e3ce3b37804b24300a9f3b875a2d8345be2d0c30d9e2e40a55a5e0760de9f02a66299116412797f21adc770ee9c3e5edea62d19306284a0b9fb72c65f5c1d14b54ec9cfc9a5080a5c162be5c52eb15930cb3faae303323fdc3ed1780bab1721fa05c9b72dc1e01a1c55dc7bf16a804b31c75b800dd1c6df8ca914b40022f0b26130c1dd8083c79fc546fd6f8eec49113e4ace29fe1dd1b40a255c412c0986827e8ead4a25d0b36f993f9e187574e9167adc002ccb28fdbf0f1643a3a91621fdfc0d7e7de909600e8d9cea1b92abde5460f34b0d313c219a13d62137338ce96cf2c3dd6c07601270d178d1d95e15d042d8ac35a5f2f0aa294aecf4c2a681fcd1e92da2e6b5081f766f281bfc4d27af3152b82f1b1427a608da3dd2751b35b1c6f9ec44bd57036974ca64ea777ca0e7c14fcdb91942455d7dd46300c973166ce03631fe6bc8cb7b801a0a171ea0c086b474bf6786d7462ce501a4161b1cfec274839c29599c99eb10b2542a10f52fbecb082e9ad4b52657afdd8670043a599568836db4903b1f1b225dac8686c7fcaec5c47dfdbacf94954e506fb6013f8decf2620b111829b3902b0b1b5035b2d77c3d79ec9661378b51b25d8016c670a4cd0e68813d9933f8d024e4d4eec4ea895fdd6966ab3817a726cbaadd321f029015a4f65bf482190de98a213feb9815a65caec141e687189d56712608243c6982c7eb0109894967865003a63b1f83f84f39fb1031a1662b3dcee42e2162940d082a25bd3b3513a31b20c2530e9477a4fe9c056a49f9f5ef36461daaa946f289485470061560fc4b7bc110253332e90621105bca9d8d9b386a7ad1a675b15206daaa00a2887a7558d5e9e3656bbe83bf25e8964558dbdd2344a0d7c7ac3ce03750bd054a46fc29e8bc11d97c13cc71aae8cf9fcd03d8c784aaf62f39f438689035ef0f96ff406b4e4b98473cce6b9579eb16ec327bca6bfbb6499da22364a10312ca2bdc5b08344e0e1838797d282b8043aefdf2611f84e3d717e06bbe1f6a6357fa453852d4a6407f4f52ddd4537c6982a9e2af7c5901d2c43b1092f0b3819ef564f37a6a04a8d4d81a1fa7a346187a5ce904d719ffc6efb74deea9ff6106e4907577022cb1868ee833b23c5cb608cd7b0fd308f207e4b9491538069991c3d1e00861801efa834f6a89de69b647fcb9e648c231ae80cc31147fadb619e1b480dcdcb43b58c1cdd65e0f8a25cb4e25cea6123bd5ca4b60eca7b0a56a92c4bce58463ce48223e21de84747f308097df3686e91605f7971e1e108eb7b974b29e48a93d903d65bfca9557523a3140b35d7e12bb234064d7dd704e9e6df68785545f580356d1cbc54e2e53ada37445e24b173370a360ade6dd16cb994b1cc358c9eae0e1a2b26361b66ca45216dd374f8f9d13f6b8f871bdbb9de2445afb3b04104b479fad1779449a092b9f154d4302cdc0b02ac5f660fde041baa3162988bdbcc002de380e0bedc3323d07050045dd3c6beb68208850196fa08e75719335321bef6d8bd7a22b784f4e1712167cee0e471223c23a5c776ddc9249a5bcf4a71090dd04e188f7949481e21f33ef96cbc8c2b96db23b55f6f6358347108e185d2e4f93f0f1120aaaad6664dc4079e945f02553df450e07a40e5f8ce3ddca2ac00b6fef4e44e6a805d241a167ec797b702a0880220491597fff8dc17b098f00bbd13516c9469b39182610e92e02899852cbff53c19325697d34d573cfc48c76771155b178a3cc8e56de086fdb830923674d9707a3186b617b29e04466c919a8e40dff20c41baf878c79bb1b11c7ad855de0864a0d5b7200fddc769a6364a32d9c922c56242609419430db85a12518c273ae4f42d96cde2c90d7ce90f47b92d44821743f443ebcda91c62048588b59c67db69e7d45355e3727cf0e42ee7a87382c09f94631427b910681c5330aa82c01cdc0767ae4c9cfae5467371bdd3aeb85b2ad2ce4f864a9db95ce6d71ce22d22188cbe5b4132374ff52f40495c1e914d66e03ab65cf49f79dae419102e5c47305c04e98ca4da7c03ad1adc0ef4e3f841068dc861f24aeddb62b85bb83884f1aae70fa0d6100b6a087a25ae0098821562d46db8bac21b4c62a9d093abeaa546543429f02ef404f1a7d32a343cf94f468bc9798a594756c889aaa314beeff83a9a44de5efcf9ec528b738c7ff559be327244aadb8b67bf8868ea7a808a9767929634c99556563cbf7a72813e570ddcca3b8b6ae791702e38d793270b2426dabf358627e4d78f777969adbe8af345a845d211b3a44fb070cd139ca575ddf27f2d25f23b67d48444357ff888f60008015f90336a8d59969c005e0cbff7686203a95207121f3ec5f691dae75e29a5fb83a82d9fce81cc6e1f641d445380deb97657089c741218ddaf56d3b1c91493041bd1aa3386feef390d8f724f0c070da501787f361ea0be9914f7b08de820ce6d645199cd232cfdfd5df43f76d37ded55b4c512dead744f18755f300aa1676cf627a08ebb10e0b5645493d57ff93381ee7efa7eabca6410d49666e884f89ddb65ce67eae91725133a9cba5ccae5f4ff8c3ddd9374e14e9be46e510c54cd9abe842384b8973010117474ea30c673f0e0d6928b5ab803de511a18d851dfe4253c6ba6182d9398c2443fd5d26954fc1c60ef59aac3f7b9ba9bab19796e229b00dd517d61ba51a1ec230af124a97fd046ab2e9282a8d14915145020663b0634bb8f8b29c0a0e86c23145514597781bea48cf03f300daa13dc0c5256806f8beb40b65fa3f8503a59af32ba7fe79939ecbc315fce4f73ae7d539fc51df5c81f208094012c89023e1bc4920a3150b46439fcffffffffffffffc2836884b6196b5f2699a4d43fb65e9f93292599524aea8a507fdb7bb1adce6bb700705002370ab70a2a0b6783f633402006064ec07808a3a48a09795f762b7b3b7018c25829438599f9948102331e8d11b081a310e628ae57faf7251fe28430560a3955f2e8312999580d1c8330b9a85c29994ed23e98046112426bde9d754e218a0261d07d7969a132cd4407104693e521f7d357d7e40fe60ba2e53fb473d4b2f8c1a0f7df345674b793d70763e86041041737efed2c1f0c6bd97abda71bd6e93d184497ae9efc5c8c9f9881430f063993f263296112dd1603471e100d0e3c1872492a49b12d6b2a5d068e3b20871d8c132f3b826ea7856a1403001638ea6078ad98aedfd9a225a7834955a4eb9a373122c77d1b9cbe2570ccc12c794be95eb864acd982430e5d8bfa49b2f3ccf19a0c573150b0813478607860666046197130fe7552e3a1974fdfaf070e389842ee11d52945d7f7eb0e1c6f306e8dbe9896f466a204898101316c6c1b38dc60125f5ab6e106071bcc7d7593ef53487a13101070acc1bc9ae57741d7a5d21b047567dc020e3598d5c45354f6e3ed48c958ab71e36f50461a36520d1b67a41a957fa38c1dbc7f192420f63ab091032788230de61093bb64954b86771a69f49a064ca08292010e3498b387c52461225f83be41195380e30c061dfe9e2fa4b012a5b4c1e9b7810dfa0635920d1db0251b3ac0097098c17055f24d25a70b950f9571018e3218ff928509db5056bb93c13022fe95bca4c492c818cca9bbb2b7544c072c050e3198a3e536e1f14708cb3a0c869c336554cd4704638ca154e00083e16db4d5271d9f274f38be60f894945f9dd6923eb91a26070e2f985267c7e40f2a2718630ce50347170cbbebefa72b574fff655c000b1c5c3057906a7f41733150000213ac81630b465739bf1b09deb5d7c0cf000187160c2178fac64d9e4923e1c8827135ecc297b84ce0c082c12ec7df8591db298538ae604a5a44856eed2748638c31ac803c930bf1c55392048e2a18c73e575e388d3d1351c1246fb174ef6939a6604a634244106627cb13a0148c56aa74a9724f0d237044c16416f1da547fc4fd13148c21737f36436f434d4f3007a1baa7f3236278de09c6ebeba4d7e72618f29d0863ea7cc276ce04d35dfce533a14e657909a67abdaf0f2b17613d4a302515d45e5e11d2c328098657fb71fb2072b86023c1d43eb69eb49e490e3a828d911c46e02882f9b292522907217663250229824ee710cce152cbbe49eef0d86e091c423059ecfb750ed7dd49b5040504c3a419174f9d4812820c0cc35f28ebd2ff22ed41c55cd0fac258226fe4dd30f5c2242b2cee93887861eaf91369e3ad257476615041d72bf2a90b53c8ad203ba48d94839d0bb27857c8d6a6ed1e63d973f4c5195b3109e38db791831a4b06a100bc26cc7b5d8d7c0b835249453ce7d71686fc513c4c8749a6c5ad85717f84cc979b1626d9ff9d90d35c3ca9b33059c8b8f0105516c6f8adc94959c82657120b73b00ea33fe8242c0c3ff163c40e93d542f015a60e5a34b55baebfe40a536e919ebf9f43c9cab5c260c9266dc6dd5cd28a025861d0cabe52d12ec53dab30a8d9114ac7fe51492e551844a6bd455c3f1559292d3fe975428521dfa7a97e855c21994e610a23fb22a27fa776c9146657b3acbb5ca6564ba530a5ad0cd1331e24a94f0a43f851ba4cedcd24ef4761f2944d5d52e5a5f14561cab75a290579288c7212dd84b8bd8bb183c2e435c2528c2c132be29f30bdec7dee2f1d2996ee09d37e6f558ca4d309e3a5668d50677db23c9c30c7a9d23fcf3e56a9b30993d25b39450a61f683ad09739a8a093a6974084225135ad70861c23023f1b2043ba9e1954b98c56554f6c92c215ac268651523e71257c20c5921e694982961708965563a65ad09f224cc7e966c7410af2a2749984f6915356b3d267a244c324ab456f81bbfc842c22897bccff28ac7fff61166d1eea0ac3ea7a4e408e3248addd908437e4f759e57216c4698e4979658f2751127a1bc3c8408524598724a1059eceee74b4d84513f449c7017f4e85111611eb9172e589ce8f9218730cebd5d9e53223f7c8821ea1b359284b4904298e25fd8ab6f5d8e242184d145dac5f828a195e7208c25f47da49935152a8230d998aa88b6a022693110a6549e4ad47f29b32002c21841cc6bffff07c3ae78ab5ebeaf1ff9a130eda7f4b3de0793e88fd65fdac34b870fc6d221f7e2a9f76048fe313c62877f5b4f0fa65879a62f25793089ffb7d3e21659abc38321d7e4ce509d456e7f07838ef2cc0e66754f2289b7eb60f4a03da4b42cdd4ae12328800ea6ec10dffad91ead3207b387d6940fa2a5c4dca2003998fbf24452c943e26048dedba17f3412a4a100381872342de35b6fb9737a83f9822ef5f0e979544e6e30ac6ec9a888ccf5d1b7c1a443bcefbd9899be3e1b0c56c235363cc6f885d660c8b9f9e94ca538b1e36a308d4895eb2fea6930aee47cf1a9ffd3480e1a4c419c9ff9aa256db13e83d9a468c93035aa92d56630ccc752132929cb099532982607bb6b13e299a3420663878430a6372a5a5dc660f4dc29463c93c560f211b978fd881bb286c1385b51422a3d35b925188ea12a1b694f5f3077aa7fb76a7fc88f17cc4976bd85a958296dec82b992fab64acf3f9ec305a35795aa0bf5313ebd05e38d57e70fb95c49755a305e3a799eb3ea3afd62331490057387e4b69792d2e94fc282b1ce3ac9f8f824e2e8af609219aaa532defcceb702e2773c96fe1155c17013f594d4ff3c21712a9884d6c4b4d27fe94b5330e80af627642b05937cedd25e9d4c27d95130bb752cb3ef0a14be74332f215ee509865b8f717146b632632798f774cc12fd9eac83b609667935ed977a32c12cd721844b30b5b2e112cce925d6de3a68195109061d52e6bcd905e1d725c170fed1c727f9aa9690604ad53152f8ed9e9c1752c01130533119c170a942d07d9db37d9e8a6048c27a72ca257be3f40a208241a28ca88a91ec29e7153004a3a96895537f4a59880284604a9e7a3ec5d472134ac13088a50b297e47c0305d4af2c182d07809fe2f0cd739d4e979331dfefac224b353a530b7f6c278313232744f5e9842faecc5d83995f3db85715de5e6f279498c5917866c15c53a56f8503a940b53ef4e8aee2192880be2c214645e97e81423a8945b983dd6fb920ed726c01606196d73f772511e24a016c66eddbae461e634946861f0cefb984bf75039cdc2a04c58ce963c5bca7564611cabfa4c11722c0c631fe729fc75953861619411ca530435aff6ed1506f9f3a554541235b62bcc2dc122a41ccd3071b5c290a3479a5821ebfb618549fddbdd53bb7fd87e1506cdb8930f2a5bfa5d15c64c4d0941881cfa74a93045319d5efc42a830e9b85fa9273f8541f25cc85cd85870dd14a618e1d44ebf530a8350572e661b290cd1f6dd763dcde8708fc2144edc4589708bfdb6284c7a31bba183426190dfa1e6d2749e561914e9c4cbded922fc09935dce8e16b395728a3d614efd6a3bf2e2f5aed2099356779ccbe179d3b39c3049d4ce92266fc298b7d6313ff5cb6435618aa73aaf6d24874f66c294a447b1d4b09c53b5983025b30ed94a5bf457f412c6dc52625da3a3a65ac2e09f442e91c4f38e48254c395da570e96927344209e37dd09fb2e53909e34bfe78a6e22909d32789332af983a57889846946470d4f199e119c10f7d596c118caf4f2ba875fa64a06c3ac794839e1ef434cc760fe9338b23ea204f5a71850296c961695c530983774de5fe5c748f20383d1d2b8cee7ff0be62496e339a8a4eb6e73720ae2b36c85e5d105a3c950932ea9d86c2b3db860b6d149c731d3cdf46f0bd97552ab164cb26eaa652b5ee66264aca14fc306b2db814716d0f1f3224c23076714d3838207164c65256e94e7b42d3cae602e65639ea2468ab896580d53567858c194f74a4df8ab2c964c457854c1f8d1ffe2ab04ddce122a98cbd2c80efba78318a76010b2ffca76c7837b09111e52307e89119b76f9fcab838228182325fd9b955216f0808239c78b9e9f72f48f952798e5ddb479d0179961999d8387130c3329cae51cd63bc96f341924f06842422fcf621c030f26982485cacf7b48a3a3843c96607a5753b31234069f87124c51547c3cddbc637cc85813030362dce06d604c108210f095f64882073c9060be8e707b3a3df668c97dc1e308c6fc7cdb17ebb81c3f848711ccd142463df582ae24d2078f2218dcf334846bac6f8ef2e0410453e7aa4a975b1a824988bb4e6ff11082e1a4ee894a21f4c54e308c7dbb9643b9db48f081618a37b12e59857e61cc53162d5b12b71c725f186b3ed552c3fc92e5bc0614111dbd30ca8b0e49bd041d7288f0c2fcb7b26f21780a964cbb30d90911b4a4a02da8ef7591e75cd92b9872a1e5647fb612c7854105b311b9c27912b2dfa21c31f2a70eb3a0c316e6be9c5417fc24574a1203033d18630c5344472dcc9d35dbce9456684f6961d02968a8b78549299a85c15625260b53ce49a7d873652c4c3ae5ca93ccbaed14c2c2e069da74ce64e5f4b98e5718bbdacf7792fe77571dae30699af4371d2a3ce7dad10a434cffb8dc69647f7d32f6d3384304638cd1c10ad3f864356bdb5c0997d3b10aa3e5fba0eea49e19e85085e174e8f939c041a331023c0f74a4c2e4329f7b2c8ad0b1827fe84085a923567708ba7c63c5e544c7290c9ee6f24254ccc841aa91c68d33c8404d7498c29436fa417c45aacf3db071c6096eec253a4a614ec173e62d78e578925d1f3a4861eebf35f959234ffe2cd101d1c1758cc2a4c39d48e695547aa92c0af328e195b2495d0c1da130689c27bbcff2f711ae403b40610a955eecf3488aa1b78e4f1824071d545937de0639b041b6c3132695b835264f85d1a771e34590fa848e4e985e23453f51fe196798e0d4071d9c305dcbaec7db0f196bc4522a2303d9b10983f6a94b8a569d674732d68e8d336e9cd6343e043b681390232de8d08439f27ff220642713863989f712a29fd26562c2f4c94eb2dae9507fed1206dd79424a8f9c3aaab584aa23e62b4db850072a61d2da2ed692844cd94dad83128618579683b02c49e19540c7244c62419c4823e37fca27634d67604619356ef40cce6a7448c224af575db2bb3fde8f84e1841ed562112b749f206188233ebea894479867c4430425b28e30c6964e12b2cc8d3027dd2108310bf3fa3123cc5d2b41ae04a1e5aa2dc2a4de2ddc27e6841cd48a30b6c77f92e93a237212619ee41255b54584b94aa5646f7934d0061d87304dfe9027e6892779ad210cca2f0511b9301b3b29842959ff7e8ed157f33c210c9ee3e792131984399a668c87b06d7d16411864e4a598b33810a653eff944673e7c5e0161bc4e3aac94bef422437f30be75886a79b0cde81bd4b071460d2074f8c13cd79ff695ef1d731f4c3a7ae3734c5d7c9b3af8601eb153224da7875adfd0b10793698951e93f7e435ec618a30c1d7a30bb8952ba9245ca65e7c110d79385c8e94e2733e1c1bcf93d16376542cc10093aee602eab8a15254f7630e959f96c48899192b6a30e86a0b23fc71ef5cb693a982559306de95547a890be3107d365f5f021e7b782fa7230460e21fff563bca6280ea6b9601eb7930eda3c380231306028820e3898fbb44d77fa88625f7983b9e3267c7b753adc604aeaed6404a196efe28e3618741cf16f3a5eacc975b0c15c322a5b6a0f95f8411d6b305d57c8cbc147fb5dd5a106534e1777429851c971471acc29b376245af09c67d4810693b89265f1e2d67106731e0f3ab23aad7b3a7598a1a30ce6da8e961ef9e62fcf64302755af9274cb8ba5948e319894a5d457d9573d9a5087184ca6e25e59f2bebeb07784c17cc97b84ea297580c1dc9e6309d9d1449e24ecf8823154dab0681ee75e6387170c42f99ce890e30a7474c12caa62c988ab7570c16ce15497752a756cc124776fbc453fc2850e2d18af5ef74d05fb3897ecc882d9c4086175fa43b0bc93b156b2091d583078593ce541e92041d664dc681bdc48cb29745cc120b664bd8fb0a07492c6df60247458c1249e9752be824856e111dbbe362263ed460dfc8c8b4207154c4ae7f34a7491ef9b2103c10180091d5330c9deee284b21edd26a850e2998d2547ab31ca794fe3f0a86ddf2c841c72c31f291a1030a26a12a28efef70161d4f30d6571e7d227a6adc103a9c60f6d4a347848409b9e464ac1513424713ccee275e4b54aa850992b176b68b0e26984daaff4eb0cba3bb97e139406f63cd3a96607cf5908210da11a14309e692ffd68cdd8f5a0d6446d748c3df868d331c2f0523400108c6188334a22309df46d01e420551714400f0840e249842fc3ec9ed18255f54888e2398c37b12570949449f91fdd0610493d23616ef2f8fd277923d7414c194ac2e2bfdd9b67ae8120f1d44308b4851b27c5e8e4a7a1d3a8660f8d7c8edd194086b4f87108c592167f4ffb94bce81812318c6eb30c2e2538255489bc0010c773e8ee46f512612387e61b60a539dd86eca26cbe10b47cb9caab16ad4c0cb40a30c397a61baadf06217c6a485928c355e9894f6961c612732d65e0767d84083ecc2fc966cb764f9cea582347270460f1a0417c8c097610305638c91460e6e705217e6fd78b23d89989eefb3326ca060066694a183336c90a0ae56c0910bb3e849cbeef87061f25c953c67d3e9d3ad5b98635bf0cbbfda41cdcd610ba3951ed39da487ad7a6a610acbf38e60e1bb744c0bf3b55e165521b48fa924143866610ec26b525239fd39aae39085d9de544bf4b2da4a411cb130e8b855faf6179f4212072ccc398654911b59626285e315a612ad4ed656b6256b0e5798f4a7f411b4b3f5c511472b0c2ff973be37915cf671b0c26c2f42eca8a45444876315e66d13fa626dd35694f4c68d37430f8d326c906abc0eca4011b8a0060018c1a10ad3b6c9a7f6df6eddd2e04885f127d68358c5b67d97a83064b94f9f2646d0959392e31486590f49e280c314e6f46b4a59104ff1692e85397ad22108f70bf9107c3446200606cc18811818e8c018637090c2f8f964a8a8898ec214d4d57a5f885887958619efa2c83cd6fe509834b6d4723c670f7080c2587ad243d076291f1232d6d0b6031c9f307b780c612d2f7a47ed9e30a5bb1c1fbd7119a70c393a618e3197191ec2bde3be64a0208b15383861ba60e931c7b38854934d18437877140fe1ff276263e0d084b9e4e64f503365c2144786b22bd3bfc08109c32753b1d2449aabc0710963aa9ff097fc1de32e352c6132a1449f0877f996304725cc5f9574ce7f2ea38451ee2eb6fb6dd44426b1fa9998ee08faf693b1468ac02109e388ddd115f73f1a9130868cb8723a1f27fdcd0109a3e9f0ccfa0d353a35ce40c6f10843d2ce12ea16ff53ce7a60e3735002fc0087238cf1d9b2875ce2137034c27c65daa5df7eeafcba4119c8c1089350a224690ba14347ed171c8b30c8336d51fab4894990220c23f52585ca3825a3cd011ac57024c274255b95c389c958eb341a751a9d81b3438439c4d39c471fc958db47b7349694868d336ed80dc26883594250dbe1c43ae80f1b4c6147aa4593abf1c1b20653f64b951f5613c7623518bee3dce28abc9d531a4c924288cad0a2c198163d480b5b9fc12022e6b283f97d4a9ac110abd2fd7bd3329854dda4d86d12321852f27ca3151e4f98c6600e537fcdcf5a621783b9de47fe23c9ffcd1806f37cfe9f705142550583d1de4b46f768651208e30ba6204743ab68ef05c3c758b270739bbf6417b0ce26d404317a4789b96012c9ea2b56ae101e4f1b67e409630be6533284058fe4215ed1824988faf82d162b744a66c11027cb4e106e95ddf5c0461a663c89411858305e5b95eafa3afbabac208c2b983a3c5e88e65ba1d5b182f1f397d896ac963ba5aa60aa160b299274cba57c2a1854851439cfc147dd3305d3dd7b1493659182f9530a2e63428d82e9f4d9aa7cdfc51625148cb17f925372fb1df5134cbdd96155c24b92f085e104539ae7f5b0939d208c2618648616e126526ecb1e0cc26002f6de273bff787f7210c612b09453c4f7ca49fd26c377108612cc7d236e7e157ebc2c1784910493fca9d3eb9d173f289d9186191d20411848205dd6da35753a0c8871c836d240037b10c611380c23a8f9e93a240f855104d34e6e65ec056da4814618443098dac9a93a23faff52e36d80c60dca40038d36e30c33126da481068631041286104c31a2f5f3920e1f3a45c69a06c6182318a6687d6e23929c6c42fc018c740827dc7d2f4670f0f10b435061ed93529523a4f6c317c6f413c9d94ea6ff5b7a61ceb7f0218f5e0f0b3f2fcc25ce639998eff0b6efc25421897cdd7186c3872e4cb32729ffc80e2f415d7261f6eb38aa53e592f4d4bee10317862826afec736b753bb730974549410715a4a6986c61aad634fdf079265abcd4c2ec914ad6a79fe546190b820f5a9874d8b8dc7df92c0c2a7fbf1fe7e9e2c8edf0210bf37cd995ca444b2cccb61e210513172c4c25b994b6607dbcc2b415f9b5a4e7ae305ef0fce941eb34444a2b8c559b16174197a710b3c21455a26bcf9fac45c9c72a8cb2f19fb2a8bea99c25636d35f0a10a735f9a9790162d7a0eb1c0472a0ceed9f49da77b8d7f64a4518619638c199851061d3e5061a7305d4e397448994fe2ae0f5318258e38f9a92b87b7df818f52900f529852860a9d6db370d9761406d7d1511db449a9f0210a539e3d95f2b89e1825e64728cc215c298b1eb2a030b75558fb089553840a0d1f9f30ad87917849a924af2f9e309b6993eda4e2de32a265f8e884794543355efb635cee8313660f3e3a8470f98f4d98ba93c8ac905532d66a70a3d3a8516ae34313261d43cbeba578e1b3f6e02313e63d19c1d2363624e8c607264cba7d9dc289741f3e87c6c7254c29e5cb49930ddecde81b669c618605c618037530c618a800c0c587250cf249a9eb590f495755ad84c96425bba4bf38418614111f9430ede8a5511d2d859c3a0e1f933024cf8ff6f24149bc21b14f99928cad8183bf71fc1109d3c70f22debb95c6dfb861010c70400c0c8821821168a007e4111f903048cf8e2621761e611295b91a164e7bb54a8b0f4718ed3bd88e078f7a154d679c6183046cbbf868842145f21073f11da45a186110f727721e7b89f7e5224c4129ad7f31354518feab5a23774c909927c2a4cbe646cfafb347bef081088367f7202c99de05391dc2982ad142fe4ba4da785cf830c47d14c2a4a56321f444de9e9d091f84307fae3c158bba222ae4c2f0310853b84bb5753da7eaf282308a7653e13c53d72a1bc147204c2d9e1fc94b8aecf00c3e00610a6d12dc428c94feb7910334ce061f7f30ab8974fa6247c6a9948cb51ef0a08c5484061f7e3045494269fe763efa60922c626fe9bc2284341fccaaa6246509eb88f51e0c1f64549c9fb01ecc67b222f2e7c98339c99e252d953db6bc2a7ce0c174f59323c7506175d28f3b98b3a5eb10dba10f3b1896e245855d4cc6da1563c1471d8c15cf4c7c96243a986c52994d1a1532d66e2033fa0c4f061f73302595836f9c0e231ac21ea45106213ee4600eae5931b392ce103a7571c074459cffb87e95ac81c68d3a7cc0e1f5eb9873667d51926f3042ce7c3593967a4fe30469860f376479e27ba54c64d369433733f14f48bc78c992870f3620ff392c8d1cf93da99e1a3ed690b2a85a97730a4a203ed4905645f0f865aa19c23490beb6f78325870f34a0426cbce362e9ec1952a1ef74e912bd916f0d1f6628ccb9fccb778847e7f0518666b7829ad193c2a8c4c08018221003052010030377f82043aa6a219e923de1630ce82efdb394b23664031b29e0c387183c73dd0b27bb33d20b43aa2f1792b42fbe3330986639463b2baa46cc8ad9ed21044be1e1e30b065162559e23e9875fcaf80037e1c30b0695b3e4eaca5df615ea8239a8357517a16142ee5c307ae9f270a65aa9287c6cc19cba2d651bedf92ab5160c9264f68d05350be63c31dfca7a7bed2c5830298df89aee6123c6750573be8e2ea2a276df3d2b186c4bad2aac5527cf84955f86f041059350495dcea65bef43ff988229e74a9db746968241626b8a897a11d1520b10a2828f28782962425a8da806cc28a36d6440a16008ba744cbace4eec0b0a1f4f309dae382295b897f0e104939abd0c611e84c930d9f86882c707136ef4e06b50238c8f2530e0430908f84842033e9090808f23dce00602f830c28d1b6f038e8f2214e08308370881013e86501f42b0810d1a0310f00886033c8051a30c342c40820f8f5ff8e2d1195e2307bd3880072f6c6083f60178ec82c3431765a06181303c72413c702186c72d08e0618b5a24c08316350ce0318b1a65a061811b3638e30c122cc043160ef088057bc0a2461a08f078c58d2fa30c342cb0810e0f57d428030d0bd8f81ad83863056178b402fd0c66d0288880072b6eace2c3431509f048450d0578a062001ea73080872908e0518a007890c21c2ce6e7be2c29d6ef0a048f51182f646ea5e4c87fe692b1766383e0210ac34910d533b146e68743612efd1a4943e5010a939795bea825f4f8842188fd91952304356a2a62a06003c80c0b8ca145f0f08441447a4bdd0a69545f88e0d10973ed6b856fcf17365f74c605dc8c1c68608c1f7870c29055b4e38ea4cf61271e9b30d7759ce84e5ae5c08d31c6f0d084a95b2e4fe4f4f1eb7c076760608c3170e0910983b25d55cb63c00313864b52dc7c3b889f1cbe81c7250c49dec48a914535f0b08431aec4884e1da37b66b5107854c298a5433db59f2861aa39cfa5b233099387081e1f4aa83cc2968479c4c4c68275f49461240ce7f9644e529ed35307097358f12e91bbec3995c7234c62f27eec43ac7a3db081027f1d98230cf9449a96f9eed108c35c3c7d532fad6e71469894322daa1ed4a5057711a6bb0fbeef29238ff03c1461b2e8e2315f65e75d7924c2b4399ea59727951ccd0311e6e46e2a4832a14584ef3d018f439836e5c3488d943394da109efaa8daee17c274263f8f28bbbd9315214c725ff9fa3482463f195c1e83f0f36c49ed3c046188752a0e84498a560c08737b96f18963c2e61a68dcfdc1a43b82be9b14fea94a7e30e8181f6fd4c99cfbc4a30f06655afcd26ae8755ba306fd364eda7af0c17cbd22136b2f1278ec616d78e881a453120b0f313e66f8028f3cb89664a747ad8ebefd0a3cf0606338c2e30ee6203ee94f6ea2ab82871d4c7bb22fb6f809cdcfa981460e6ad4e08c336cb0251003036280400c1480a0e8c0a30ee630d76e6b13a2e731d1c17c67d7af1e3c8f39182f088ba24c720a49a1871c4cf2f9ab3a2996a59c338f38a4071ccc39b669b57791c71bcc7daf6e2a2fe8f627b3031e6e387d8affb63b95b6e191a4d54b2663cd6dd4e881196d34f06003713f69d3b6ce93dca0460fcce81a37ba3230c618376cd448e346bb193b3803a1c71a4c6fb9748732a9c1aca743ce97143cbae9a4c13c729d2a4c84892829683097aa8f92e44b1471ee194caab2ddd26a78bfb966305f4dae907a30a9bcf72123e6e1bab0248456c933e1c19c435b78cf967758558488d2d9c15cb2ab73964f12ecc63a98828758212b6685db74308baabf8e16f2dce53998e279793cc92feeaf1cb8582faa447fe26090951622fad4a8b41d1c4c4905d7fbfe10cd4c6f400303dc601cbd922d0989b5c1f4e5397c2fc60643983753d3f521a4656b30ae88ce3ad594d3613598dbd4bec47f7acf621a18800693d07be94756673044cd0d8b55fb494290016678bf52366de16bff736528cf579678f82af7c9603c393975f544977cfa184c97ef3987cac8adff88c1c9f1b63dd49f9b1e065318e97a39444f0c910306639d99327f516ae4ec2fa47223e547574b222fbca572178c3e422871cb664a81015c684f655d4656ce16ecf3a0f447bab72d5d0ba5f39c6654d6d6fecdc2215bd6c8cd8b61420103b080a7d71c193978fa5ca1ec17747c39252b14d143845827a2df2a5c1e7794120b217fa860921842bd6be9cebdff144e7edfdad1df3a2978c1647b4a416707191085435ab38a58595a3b28607f3259d4e49ff8099f095f1d8fd59d7342365676a31d235e450c6802327475989409e414ecd4bcbdc29b4b40bde3ed56deecaa90014af0d2884a27843a71332009a59633292a0c4002f2e3c595fa08c6d1972c45eca4b4b2114cd1f524c50929025a548a949245b1141b110c42c9f814bd7df259870143b83d82bccecb16b34d0c10824107d321b32b899fddc140e959f809d3253960984388da294bf40b436eed911dd717e6f41c948efc25556a2f8c1bdaa176262fcc1f734df4574ef1bbdd85af615226e88aab31e922bdf1a32d5a59bab97023e9911b5e41f85db8f092ef9f0a8d6fe155ce3cb3493b3a5b90e7f5926ab530d8a828c172e4f7f8d0223b1d2a84d12c0c415285121e4c59a43a480b1553fa7b2c529193fe38963b395868a63eec45ae3a855f61d2397c8ed45859dd15caa46829e47a044b2bf8be5049c9911c2b5afb4e6a3f8818afc289a9754a45d57454e1f75bfee55829ea5498c2e6a4921d0b3d294385c14743a7687f293f7d0a934a21757eb1cb7e2f0a0b30853959c69c8dd2fb29924a610e93e396fd8c07ad3f298c7edf4994b83841c43f0ab3950896c34b4dc4f84551bec88c89cb6b288c236eb3a22561541228cc412b451555a14f1892cab7b9e81f12f5e3098350d9bbde743e7afa74c214cf6d5bf2af085d36278ea434bfbf4cc90d954d18cd752d9c12b226cca73b2cb4d794fe8b33618871134e998e1f36c5c47a1d2c7c76a77bb92f61d44d3d6521a7a4476a0bb0844949cb4105f949859754c2146a65f2c84b29615e8b2264a77021494a27815097f36479fa699230473bcf22e6bafd4a9130e48e94cc2f04a57d26244cd5e7c1eb7de7477f8471c259289323c62b4447742179b776c5d04a23383bcb95ad14762246182ea2c7bcd32dc29c6d5bde4f8a307f9555b8f6dd5b3711a63f53df9e3e879e1043c42bf1b4f34e0e6a3b4431a9bb5f24ba7c0c61f48a704a843f1d6654089334bb4f2a2949f22d5563c1b0004218c2e85c219b31263b6510c64ba373d2058f2823fdc2020491cea8c9d9de06820f12a2e7ea7ad30362dbeb2c1ee1dcc72e7f5075745ec9048ffac12054bc4f1f9e758f9b741525870f86a0e452b22e8fd41dc28505ec61ad2d9110947a3858d03e696363ed3c984f279d922aad9d85090fe80c2dfe3d498864f13b20d2da32353b989386fa89abd317aeaf83a9374f74a8d27fca79d405cdc188223b25650d9197433237794b88fba97148a86ca9f0fb210d07934edb177c674d5aed6f604288a6748aee92f2c80da653428a9c644adb5cde0663a968699122365c2aaa04b9db1accf9469efad8cb97ac06c39f48a583103969b83a42b85cf30a42868682cf758844abaad319ca67deb1b47274a66d06a3e5b0f859d75b6997c154414b87d2ebc89029b12be93194b52fa6a9899dcec2627075c6b32aa4340a83414e6acba9d34c4f70c1706c91ffa6fe73aaacbef004b112c7d2f45e30e55877e99d4a871d912e6031c4ca88a813ff5f2e9c75733f29fdf3d942e761f611625eda73b5902e2fbfb2c05fee4fdee69d16164c61299994246bd7737905254553a3c368d10d1d2b982d455d2e76a4492b56613797943ae8a95088262c23a94e5f9a42e2af33e3ea2c2d05d3e94b252feb8b422259758ab8bd408124bb4edba40fea53fe09a674314b926c277095527487f0f14b13cc2656742cd6ae5a9609860b1aaa4f65848fb3b6b0802598c3cb271de4eb93ec4a30bee59b28426c88d1a62474399ea1e90290505297bc69c9439ab5802318f3928909cfed93928c6038b3f8cff98b6048dda5eb927b2298820a226b5c12b1da1e8249567cc9e593ead287162004931e35af95b907031193456e74c0309d9874e661ffc220bc4e47febca4ea7c61b6cb23ed428d900b61f4c29cce4a5744cdca5e7861ee8bd61d17f35df8f15794c812d68549a84baa77252717a60b49b2246dc28529277b95ba5ecea2ea5b9892127fded52962a98a2dccab7a9a922b5c0bb34dec54c14dbc63480b438e53114b446761d2799de593c3b996b228ba08eb148e852a13643c448717c1c2bc13b322aec809dbf815a60f4946da89743922ea0a5365bb9c9cf89c2bc55a61aa5211b34e1d46c594156978bc8c972454d7ab30e54ed172c98dc892a20a9398e0ed274723473415c6f6cad3a67f54186b52fa58e74e61b214bd6db9f4fd2a628af7de53bcc25218e5ef629e5d69e47c92c2789f5ac9e36514e6ec14bd7f3d8ac294963f8c94a82a59140a7d4ba48fe381c268ee6945825be8b57c828b5f732967957cf27ae21e2d173d24ffaaf0e984499f595b291155173d4e1884458be623b409936e957a50353bdfad268c575244c676eadc936782ff2a516d499830a9bb49f95a5498fc12bf889b0ec94410a9f49628ae47bddd5abba412c6f932955a8424fdcc28717cd3218e9787f52661d05177bbe32e6f7e4920ae3e4685302281c93ecb275de6d49030fba85239151fdd6e91b1f60843bec8a62e7e658c46df00c370049eea6147dcad2935824932e691bdab2a8597a0a1e24f55901f7ee5a61d86c10893a7702742bc24f36a2fc2e83977989a7db310175b43188a30277d229e68b1a04350224cc9f3bc696d57080311064f41a9e77ab50baf1cc2f4621e57c3574318249d909594c8dd33b24218b3439dc97a09cbde12c2242c5bbb6ea73cb9a04198b2754f6586ba76d205611256a35f94481372cc0361943c4997d5a5957705100639a264d49af40fc6d1b553f14ca77799f8c1f8b9f6e1aa651f4c91e25f25f93a1f4c49a848496c3c5c2e59187b305ce94e6a4bdc30f470505be16ae4e9f82935100d61e4c1702ef36f957e9382e4cbb081827c4018783068939fcc4324a5aa5abf096e9c51469211c61d0cb1f77cf34cbb8248dbc1a0643c3b9c97e585b80e26ebed1cba5e9e1cdc58d4811f844107931239e9fc217ba553a13998fb23cb049192eef33a0c399874df53437785187799a9851107a3e6884923adee924e8283713635df82ee1094fc6f3024cb101e1e73371843a7f0ba038d5ea8f4af6652612012070402711c045248f51e00c3130010404078441a8bc462d13c0e85e1071480035228245836301a241e18161808842351201404844382502010088541814028240a27e196ec03ab41f74a5cbda0cf38737cb323ed8a86cfd25657810116da0600aa70ce296e6ae67566a0e70b7654604720f737c5c02e0d64724730741c6dd034c8fc50bdd6880191268b4923507cf74d766582231df89f0599770a1a4c373db28b2b0e747984ad00cdafcf08c0997b5e6e6eea267b805f181beeb6aac9539bb444f24f37fc683c9ca949faf447fea535fe479cd290c5f455fae73b6e1d5cb06d98220fc824eb376fd0c1de1d4480b743ac6e74a47b0f15e183e4091e968a808de6f2541c8e584911c341ca0bb86b6c938d8b7c3c2b5b544b4461523983f31de5922592fc69c79a4524c8671d92de4c7e09eead39f5d4bfe1a94df4278e6c79a33ca999541f6dbce7ee7fb86a418d54ffd00120f8140dbc9d22f28d7ebb9f1dee3f4a15f72cbe0681c61d3aeb4ed422a08aff1d39bc1c530481076fad49d9cbd92fe58118611efcd5e88ef6c36e3b08c946c14b908e148a6dc8692dcdeb6d7b5af9ff140f940d20c69f84ff2d9748fc199f7c0bb77bbf8d53bdbeaf305628eb7dd3512db1809933c2bbff7a5fda6e21c36a472e0fb4d899ab41175cdde6bf844c934671899fafe9b6045225aa6d60af4015ccc7662a87ee9f1d9487cfe553ed082d1c63fd550089f109f0a6476ec7a7ad90111def3be9d273a26aa725beb92225aeee3fdc6b4808250dcc5ef550e2b79094d8a6a18a5a039dc6d8357c3774190f03370365a7a63c1c251171ae9748682c174f23718da31b7e8203a5cb808e5808638d4d6dcc72b807b6a18fc51b26e5a233c7511c35f57d8d463b36ca40ebd4c484661f9c80837d1b25c6513ac446e73ed07f0e9d13fd339a4114886b7d702ba65328781a479cb5bf8ce1ec300d47a91f363af189a59d4e56ea9f7b9ab99c439bd905f5c0513afead53f1b3046c811da319a4ac96a56eb9ed2007c14672098d6710e0e0debf6e209b3fad0c9146ff7e6189d501df8bdd8147ca7b8f21e8e05ea2633757f4e6f3966859bab60e8bb5c1be05cd7c762000b61b38b6124703725a8808cc2d040efdcba015185262701af9e67ad7d2d63104284feb64d6eb5f0993002109aaaac1112dd71c4e6e0b4bb5e4d97cd9d90ceb3f0e98260ce2bae69033045f53409dfbba11a06654e95522090e53da0559ce056640975de35c9600f50932ddd94450109a84a94701587bffa21592dfb9e65012a0fa4773ae11140ebaafebe8fd28132685d21eca13d6a10f9ae18ec94421dc56084c35c66e1d1eca59547ad0fc0ec170bca1abe70d078bd5c17ed7772e7effbd63e4f37c520dc8aa5b2a5dd5887f3a93080e6504827ece1014f80622f0586fd0d16ab76c4055f7ffbba49c96edef3a47c98e35851308cc6ac01b602cc3fa2f23a0a7e6a87f02ed28826339280daa37f1d8ef6e28012ac3b7992e2db11c3c4767b0fcd54f9a2def88673a7a85ad3d44afb14ac087e5771d3c87903115f818a8250e062f6d1ad0383886173cf08a56cfa2c142da31174c58dd48e3914fd2ed80b49b531898070f7670907e822dc10d19421bb4d67440104da63b2a891a3ca4d51acf651f3c71e361870a357836b71da9ee74a069a5b6fe107877373c9b81ac41405283634e106755661a13990f1ee43a58befc278558c50436c5fdb45d569720729a7cd112c1206b628641d3171a19641d5baabba99dff00902c5ce031d27cee7732841421211974f0002e3e1cb08387e50c1a123dd7dc2192f560b40032b1c1f30413780ae0e0715db9d5c76af008ef83c6ed0f548e6a0d9ee7a387811d6507cb7d0d40fdab60c7a3f11fc20d9ec428864318099b40e6b307b4583b067722f1f9925eb156d5cb4058ea76f8be871624460c1a0669aa32683c0155cc4212c68ee001f6e97a29fa702c27bb2822a855719d837524ec18bb7678848d649a3dfd5dbbb5ff0073e0de55a38c9edb7b04a6dd12d71b34ae2dde6aac54b5f57a3d1efb775e284666143f458a510dce73dfbbec702304ab4c344334181886046dc4a1c66408a01c8b2d70ae21424e16835246a5346d0dae1894169478c33b565351cc4ca7e176a8e929d2614cc0e98350313f9e1584987a8375820e80054cd8f0c08b0e06505803113633f98021e3e088628c88c30ad93daa20163c484fc40afd50a4bb448f3255450e5a401a0ccca1b83c4e32bd7500e94f16a58d3b472e6c8135694c26de69913c7710d4a8ca034d91f673434fd44fb3e5691d2add2003467379045a5d75f175d3db4231ae012afab4ff57c033658c6d6d4f6eb167658f7e374eeff55ed2110f629d4a028503cb647c662edf598abc8f49fe9b384c8d9fd8c05cd5af0d549d3c550297945fd5da01e83faf6967c602eef7ba0baa36279709254d0da59235a64a31b69feddba8ab7b6a2354f20fc11ebab08f3e441faf066b10ad9b25ac15ca5516837a0861300f507c4e244389afa32cdffd7e37eb3294eedd42b1644ccbc68a20f37635b74cb661cf4e9445865d99cbe342c009b91a06000b63ff24116ce487b11a992c81c9b9db81761434f949930bdaba7bbd6c038d55283df3271dd4e7520c73008b4737df2c31aa1888f3b0e1878b1cf0b921327884844bee5a714bccac1ea25bd7f0f11e1b6e82f1d96dbe6a0d516fe8d1912c35f05a0e75b787ed813de8600d653d9c6b17aef7d2fbf5809de265ff366719869ee80311899639a26019e509f8151c866ae27e19840b2463f1408e11784a253050c4c141771070e9670e5cadc8b03d1c743106f610bc51c4fb0a2262485030b4fe61fa81a9fcdffce8654d55a8bf96213db4db24e8f92428c50414d5f7ea1db0927440a7dc31df51da2554386a7a54a906b88bc36eae965fdd8d8657d007f771fb405e35798557e9a6009aef56e2fa71caa281d2d71190a7f09990632fd0a90bd39bf0d50cf8b1a02981f8f9c18c838a061083a9012486c106702d84a56ae81d3e989721f1561cb282b4b0546640a1ea5e6d8e9deb6e2e06331afcc76b697620892e0bbe5e4b2457166de73ab573f8611a1f80b5d6c422c073900b3116aad24de0f3a0acbf719c3ea3988b7180b8014c160535c3871bc6433615e2ece25ae9c9197d090c624b1fd1c0c0dc0a8286d070801706b12c6e587ff95a8150da4896b50d079916720ae98d2bef454ed81c969944bc4257c8bc372dd3d215fca33f816fbabd579cd2d0d56a60667ef624413aa08a31415638ea0526713b34d30661cb537620f9b9eca9e0ca09059b34e11691a16421408d55bfd206f0b868ebbe6e9524a87530e7eac8c8f0a3b3d3c0bb8ec320c000eb4b950a0f5a89df0e3def45b0507e33fc65716c7f25654279a5fc2bbb791669c662cd9ee4aa39ce62389a39c175a76af872761a0d7d6ba436037aa1d7973c62eda5b1aba73eda03bc29ad35bc4e73cd0d34fcc2344ae4f6ea2aa4ceae9b1271ca760f1dbc0a03bcb7fcf552b02ae762167f9c545a6a41dc9e7235f35e42152451c14d5d2e2473e2bb1a7663b038cf79f831fbf1a41399f39950df4cfe176f8f416ac5a09f7c098a38c98b3c927aa2fbb697f0b31de0df2935f1839ad316e184e6e2be53b26e8ecdd88875969f73193c263885ec0f809f6c4fb0f29ccddc163e0a369d4e211774edd66eca0ba7a4c3ed95a8ae40cb70c1c693aca14c43ed386b24c54a524893515afc1fe2048b2c806b04fe8bb54d320e34542fd88ba4066eb37e8d2dc3d1c5c0eb4aac5923d9a76f3f610fbace67f550b5203e31a6e93cf4aa2ceb2eb429338628bb8c8d74bde9079364008916d853126280f980d9dd74e40d3449a65c58bb6e46b691fb52791582cfc56098ab40016e046131a182c29043533120706c40423b3d7a72b4dd417623d49548ae078f503e39425e044db78c0b65a8d5c12b5968e9c4897ce33b75f273e1bcb07ba86b3680161be25abeb05cb2cc30ea5db9a3ae57f41bbe72e94f6d8cc3bab49f93700c6dee1444990c542a8153af88f10494ee60e068957e8b5f945f483b67ebadbff389931e049939a0f6dca66cdbcc92fc7af95ad9d400f09e415a5ddfaa0ab5b495c9848644c8e68e964b84bcd453f28e142b58ac7795d12f3f0f47f20d966f0252cbe851e5e4eb152a546cb880600923287414314b9bc651bf76675cb6ad8129fb192e57bd2a386935e1352ee250d3c45bc5b02d53f201f0dd3199001ac0c98be3486af99261294008cbf83dfcf5f828e8867b750a5a3f6199b715c2a3b2e9fc78cf446b11896e53a15d74145014079aef2c1db5058166d1039dae12685e5f4e9caa0f973d08ff0af43e3310cc9a5e573052ff7610ee045b505e49106ee9dba0a4070bb03f007f417c967e3c455356bbfadf7ec49e47a40c2852004a5ddb1ca97bdc04e43cf650f8ea68bacfd829b8c90f0c9b24186e76fae090eb90a0007ce265734afa1281e43bc97fd59f05333e36138d5b1e2f802f83d18091015291935b2a23e02553970a05e55fa032c6cd4580f27fbe48db17a7788e5ee6f4074a331de655c63453a71d691f68a42db119e9c977de2b076dea2d63df8373c0090794bc017fd689b3bd7bb3205c9c8b9b60ae44a9c961ecb7a156be601ea334a873a870dd16fde4c2239bb8ee4788ca3b839c18cefa2c59b21f019f0b37e30471098be5daf339f81e07688ebea1e0a691e6851d422d3b74aac8d33de2ec6894006daddeb1b0448d6165971ee04a4bbbb7465093ab6950bcf93a930e7c00f8356e9d1bc67da851e07b79e39a579b39caddf4bda6333dd9c46c2a72cb2b034b261e209c301231cdf434b7e828f2c7f4464fd6cde242445cfc43c77ffb02800603bbe3c6fa133f04203b8a7d5bd1cec0efee9dd082435a3fc13bda89336040fa736b11e51fe7aa5ccfc20a6507c42bdf69fab2221e1e382593c02adcbf45b5add7a506c92e9ac02f51e620d37209ad315b59ef012ad22d3b3bb85ae67a4ed1f1a4a12c901c2549273db085365ce1f769958c7b0f1bc64a66dbe8318deabdb8986dda60f4b6e648a3dbc21263225b8b325402b39f406b7d23937360fa309a5bb68c60d1beeb67800a3100047ab552c63c5f777bcb8160ed2d0bcf74bd604723d4fa42f45b13874e9e95186c43835b3b80b5b1028acec69d0f71325de08d5327e9d8e0009896f340190fc7232b2991e1bfd1ff4133eed2cb74ee46c98f7b2a170847355a911f9cdd4c6c13ce38cddf9f9da12caac149f750c72238ede31641f0183f2e2bdc266a4f1823b01a888fa2f31316897220b27bc7461daa80cf6fb489f53d9f93ff6482e016258325523d4ea4d421566ed4384a3db5f5d987aa9401250734f5b7352f0d87befc1dbe41c92a4101e73a0b485923ccf99520071d634a14a8ae50d44d118de7a11743a78e936444da33f07ce3fe6a5bac02c14ee24de0752df349db8d0b2c2ac6960b8c58d3338be231e3a0a641c3a8326240b4593cde9804adafed63a74f0fd12b1a9ebefe57a445a814301addd9afe8522aa3f6f7206153ab1e480d043dbf52f9057adc890c5942f3801b6852d1c845a1a404a83efa945e3860990f826ed5a85574fe5182748320a55046810e52e0494a23c9f83c18c71a462c071b3903cd222be6baa84c8b9e44de1be90a54b6ddec20ee637e4e31337b734f05942b1e473d587bf3a711b1ef22391f2f6601cc8ebc6a92d684e72b04a1c99113ba37d665d60d8969bc13a5ab1da250b79960f23c0eaeb799deb659c22b917ec462a4f3b1a2b332cb16885033f106b17d04d12d2821d354305e6d04ad0b3bd3fe31488089727e858e118a5882e59628975ef7ad0529ad1d58b22b32c00a852d7d66b26225fae6fd03791dbe0992d2079d71b5e93972423cc1c3b2c4750307e12b136b6826583a11450877eae119c3ca6d26d6660276bb2a2d51445e14743b1465846471ebc9a8820750ecdd4133e7956a89034b7b6b427c53840f5ba764501366f91bf26cfcd4f040c261466dbbdf1880781125f3c2a946a936a61697763341490cd65e0ebd9c712e71224408a6210b7762fafd5faef3a9a5871585a6e94033c199d77f8e7989771fee7191990da6b5afacf4c3f5c67e0fa39af96315f44d15a02fd8e7cfdb37831e87e930a81e882b293284689ba1a5c3e7126bcdb4498c5b045ea120e4abbff1b4eb03c1799ab56e1155ae0fbad636244d1a9323b50fbe84836e19a98e52b5a490432a88d2a294441f4d16d1ced6ac6e02040fc82a20cd1b63b2a87f13c12441a199da27b8da08a9822f645096078ab13d8ba83e78a970596418829f786a24274aaac14ce13bb6909a26a42ef5ca50e4af0810e51f85df0ae9e7e0f9a9e749fca9f2a7cf816abced80cb722490ce22b75e441342ef96ca933641dd02cb38aacf8820ddfd85b9385822e5bba7ae972a817df8a66f96db2666e915ae768423ec88f188968a321d62a8178964af08cd2e104d774a34a87c4d4c00fbbb3834cd3a8b2626b0a015b393137efc39fd82249d0b67ad09043473ed2316bc27c142f254b0edde9f1805ccfb2986eacb51f67499b124b08405fe7f824b6b39651a4f9d9ba8753a5b525b5a8ac00b4ee70f035ccd38751480f8833a71680278183e8aec9d776283fdcf445b71abbbd05a6896653bc7d651ba5c680841eedc27a3266ccc67411c0b458d67f63d5a6daa13f31b62eb8b55f5c155ac30873801bcda2c0c6726a64f54527511838329578edde956aa40ca0d8db018d20f5a86401b8f2f8d5daaf7edad1667e97da463b3451f9e66606912225bf228fdc820ea3db5d6baad7c2905e8c22a22ab237645cdaef6db8b36dc9dab536a4edb4b8fdb24f3f250daa0e47cf7924e1a51b890ba5d81fba2d363dfefd2e90bc52a74320796f53465c2683f8be470ab5b2739c76cd445a8f2004b672115ecb8a44c7e29e2a04b4b5c07a8201c512357b4297056ba1eb08f706e259408c3fe2778bfe47e5cfdb356dbee57a0b07a26938e43e3c81147328375778c26e7706c74920e3f8c416dc7fe525b4b781f7de7cdcfd38649ffc9e71914596cc2a1a8a9b1ca11d31346982a5e898880c5dc092585f19bd2d171811440a85995b8fde6b4b1646a1e6557e3f4c95479690c1357fda02fc43e872074bdde2f020ab9647e6c9210bd745e1fd1f98974459fbd8cf1eacef6fa9b5513f524b8e203631c4d520f7da9f0f27153f976a125374edcabb5ee2b6024c33b19fc9fe2bdde45f3619a50912b174cb0603c186e61e065092a62f25757e7a7512276899aeea41c12eae45a019dcf612222d2c1b0d273a91d172cb93288c354e1c76293fcc7d6058169a804abd08557db0a5ab1086082fc9a4b7a74bc324dc109486c8778003825dc43babf0f8f04e2df4c69863747907ce3acf49944c82032de235bdb5a32fd364e9f13812a59aa92c1471b97eb3374791cce52a1e011231eda1f1b87bfd4b192eee36f40b89ac4525f0803108f2738964fd711cc844025c304b5d48020616223bdf31aa4dd557ca1931068551223374dbe4f2668037d05c35847884055e3ab5c152ce466865d15a01d3d5c7b02f2b1c42db858cb49d39143c96426b9a6551b5b90949f2eb87631757679534d21a64ddc36db3dd172c3ab28e378646efab7b6562cb76fe7e54c62ad2d6f12e008c49df8e2525a89169d3f409075e6221e99a93a6a7f463960fd47524e9954df4f609c1ecbf7f23e546e6c04dc4144778635ba1794c04b00af52d6d32684898e9317bf3b460627abab17cd42a055b28fd6e2d58f5a9c6df5b70d09596a29272329197c07b0433454bdfc25c02934e00115eddbd462e4577f2ceb67c44982d2c2b84eca7652f46466548bcd9fb28a60eb0f2941fbb67b2bbfc6d21be3379eb37bcf56c6b44ef24f50861b00de64cb3d6b0c060d955a50f5582222eb2802b3ed1de51bb8af2867d5989c45a92e7c7ddaca24fa404690d4bf5dfacfac2a22c0b7252f2e57fa74e02eea5a1b9797490ce100e487ba3bb892dc693cc60c27720aabc9e8057dd093b5d4d20505918635a1af736eada7b781254afbbd4a94c720f1f73e786d85e86d327affc96c1ceec4e1b28c70b113a61d5a5d15cf859471f435ec632113db6421abb55c6dc95fc8740acdfbaca88f5f52cb5bc31314b791509b1598e3773dae0ed3df6e13fbb43d6b91a1609c5d2447dfd4c8032d083b921e4939953e954a1c63393416d3a1d83708a9cabdd1e34b7bc53c4983f97742da9345aeccf5ee4f454e77c883d2314b1c6c65c2a926b63776e5f2b2c95f4d47ffba37c9b6f722cce51252cb2db3d87c35d2e5d25f778fbd950aa35a99f94556eeeabe5e60212c8484b072b5881cf2791bb6e618d4a407ac5841d1d84ea0053f32eb4d4e4abcf8dd8adb4b8f7d8e4122b4ded650b64245d8363663f109ed85315872e1c3c94dd2fbc6841a0845564b617d80697d51267c3827b588a48754838bd51abb13825cd36b931d0aac8503dc661e99c20946f185361dddab351e32385fa2ceee6c618b20a4d58cac8efd71478dc3821f1b44ad685a1a1d05bfe0087ca31db53adb69e9a4373a72901da6b761b2d5b04a470d90d312607eaf6189a71e1bcf7f79b9a58cd4a763a225197c3578f2f79646cc8b05c435740658e9065bc7343a21c4accf676c40cee25ac331941db3d2b6e27b3a44f56a9019e9e3586225ddd1bc29dd9b1a29a384e151a30ead38fb03236ca6dce87d46081ac9c54ae9254f70d22773c86f2b8a151e89f9c1fcd37dae479dac3207c03324a6dd0a65bbbbd76482a02eba30b02f58699f2cae7246e94b5e2a98c206435dc03cbd31989c0a83292745c8b5c57ff0749402fc3ca04d964d99a6fd5797b90ad30eb9b7b31f30b9fe80e2e666475596f17709dbbfdb54212d0d1a99f1209dbf446610e7b7f15370c45d8af465fd70c690045e0540c0500a3b81f489fa60bc869957c5f51f10e2e3d38beb1f8cce010c5b01ba2422421045219cd85c8ff667c460c49a519b94da79332ae6af53c562859499f8be6ed3353721e334b5087eb2ebe2c1114d9180e9779a9d3f1ca20477a6ec856c423be0232afd67689ba661cc549e08f75ffbf24fc42d234994e66470d1ccf7c48f86a1b48a81c4d61181019518afefcc281180f5d19c45e3f59d138f45c6ad546715851dfb6b8def5c350c277d8af1b072bba022bf1b1f7e1f8806df8ed2d6f6dcc4b30fb6e1700ffea230b5874bc89e9102d1629c0056438c1dd1e08c00abe1c62cd1e48c001535326ec0727683cf4b60bdfaaa56b9f5ba5064c2973f1fc833b148588970712a192edd4ee483f698fbf81a6fac471423c4b97aac52119ae5af7846a74f314cf587c0d12466d756890513df5c7fa9fc18330832df9f8473bd3ad7c1bfb6e6207ed183e4d015c58b5fdccdcdaa1fe1e0dc8b9792fe1c8c5933d91811967c0fbb31678d3fc578f5546f90389e232861b30088774d8a459628238c8554700599994923bbcdb7137eedcb76244b70f044c59f7e105a3822bfbd42e8e8b73b93f2c54cda5835738b51af0782c0b50fd6464177b85e414aa2b50071e2949954e43b0d24711abf56d6e800ae6cf8231d20a8e9ef672128b1fd670cede931905f65c8840b4c0c99d70ddef68663272021b8bb387ff5a0d7ae1b24ba65ab0783ea0235f20b54bff568acf1ec016e7f6e4cf6babb5914c03d55299e6c6b84bba1e92d4fe9254b982bc3f76b53c2bf3a007a6be2e3d18c0b3c860392acbbfdeba93aae1d1957a59f1a809784e3a791f428a3fdf6183f99039506c64624ed6e74f263aa7c19e14d1dccd51635f5e004343aef20ac11ec979936715701a820f9b34733b456e29e0aa83e6d540ccd037f7eb10c9620686ff5a27ac04f2a71271908e01c6f6a07bdb7cb16d84d8c1c7a18dbed310c2610bf5695c3e95dcdda912cacc075c44714d4bd0a775f65d6a69ffca7a7e3977890c910ed3f27fdb2cc51605f7446d9fe5a7e13c48c921b2f34d70f8e84469e6d9b43b4ab2854a1caccd81ff6c2e0d963dea992902e5144288d16d0f8188d01ebf147849a7b1e9b2ebb155f8f2902cf5a7f4cadd768c25fb907b97319fd7e897ae89caa42d9b6a8c066fa17e3b3235587a0376fbdc7bac3afc35c8e16cc58e5311ac5beae69e8ca7e94100268553f4f76a5619f0c8fdfa18eb468af8d51b8928dd351ae37813c47afe73c7cbcf928c808df3ed395a0e7e0cafe003dce4eb74dd71cee51574eaeda133b1fb0a3442e710a6f06ab29e7f33c0b31ca3e3b41094bd4c48548b8cc1b4259c8330dc00a3dcd8ae70d0a77a6669348ca8638c116ba91e9658d3e85866f77bcc16400438b68a58707ab1fd4b02e53814a3c7e2ad4542224d5c597e5842224290b9ea7a9edd8978a8c8fb94f85f837ed90d075b7c04992a167b3fd3e1795b97d87c3a225961b1f4de9d41b6b81f11ee6963a14bc8c048e9e54260adbef3537cbadc8df12b7441ae6e1aa85a58130094f186aaea06607c1cc3d4bfa06ce304b5c268977b03d6416a6748ad3a5d9d4ec8fe94ded80c0a2f0d0cd3d052a69b9129b217819fc2c4150192bc729b5edc0f7609d31a936365ad1f306a6aef0d892ec27834b9ab217dcab7b3a82fbb2dc5c530dd7018b2e102b7ea288afd850f1aca3927042afb6c69937ba552121f5b2c9a78fa21321eb629054e83eccbcfa490ab27717d435126ef5c9eead9964cc3376221e000aebeba8c9d3b3b041be98e9073aa21758b5ea04d0832f04fb99377872248c54a67ee7bcbe82db24a0edf465d8654d0c3ab5c41aca66a2533c05496426e11d3c658e0a773ef5358348c3526acf586ed06d857a2b2b19044522f2811db6f5e35f22f0a1edca8c8d49ddb32fd47443d2394f556ac9710c510ba4d793013f3063c7e78973dd0681cd02a6209a0b4202b596720e93945e4ed1ccdfd9490327a9a90d7fbc23832472af6e420b18759fced10ab618baf16c4043e94d84e296d3e5295fdeb09fc8ccba2dcb41274cc62b9af00f95a0885d51521fd9727c9a24ced543ab38e436ae80ccf88c4fd2ab1f58046132470bb8058387e098aba5b9361a140c824c8ef3ff12dbb787c9d6b612eae4c248319c3c865dc3c913a47efddb5d202d61f45f921ec60513803fc70afb50bd64777b10f7d649554eec1335b980054a1beb72416d78a871fc323589a6aa87e89d07b6f282de5190cc753336c96126820326dc6755b92e70ec41ffc6a47856c204223924c42f7d67ffd792fcc3889e63f5c600258311b93510ee600a2636b2579357ddb745b8b6489dc1ef29703ea877eb23994ce8afcd7f6e66999f30a06431f46e14e3e5c1417918ed5464d2b723fd0c527ae1e8b04e8e6f1dcf5e2b03cc89088f7271ff5317d2239d87f25df731f2c829d2c8c5e57912ebb159b72827ee8389b35f75f29a6ad16fe6e16c44b555aa9944dbc96ae0b1604d59038216957ef4fa29f452b5b27657431526f66125cbb6c2a03610ec9b82d0147c6cc12643f1143a270b9dd52d57335adf404945093315295d7f489ff562949a17b3bf97e1c08ea044dc581cf06d94c156f831e137e0c928ec018772da783813678286d8a0089c0a3317bc723dbe8bd8610a045cf614309e0257014c5b4cfc82688b70127d68400c8a3305523bf276903dd471a6a6da0faefaf07f25d0d97c713c8c1770ff55602d7dac5ab097b26206133af8bb155783333144b45dcbfc574900268996e2477bb7d7fc3b8171a2ea12d04a465af84e82a42f53a555cfecdb13fe2526bffaac5de2197c3a5dc993ebd7c9c77f14b3e86bca1579f2eb38a490b700e7db049e685b4bf6ec9e23fe9910db357521408aa0978d43b66ad8d80d075f49f89147287d0c3089df397e27dcf21f70f82567237c0dcfce6b85f3e3333d4eeef15f53931641e927830e7a0cc89c5d11008edbe92f904218d371beeb1b4f9136828205f1cb710e29b8115da70396a815cd9112791a240742ceaea4caa9a962e5cdc1a7f753c20cc7e89026850a342758d04ee47b4814b43ceb5236fffd5cf328758afbb723f92557fdf70bc16b3cea036f2deca4f4aa2bf7a1576b33d79b110a09f6b292885bccf7c6805e21b0748488ab60025184a53a47bbee1fda045ce314cef2e9067044434ef088a12b3d6c1ce270f2b378ce9436736e21b38c92ca8244ef3ac14a3af6e5803cc8d4c81b0f3fd412f3ef668e34ed585b62603322cef5bd8fa79aba174a447c8f9498ebb8a951545a2a735e0662bdf7fd29cac541eaffde43b21c429ffa4b86ec1725d6e832116c3f6d979641778a698848cb70ae22b03b26abee697fea238f8f6c61649aaf73a199e9d72fd3e4d4f126a17c802a286803884131fc5d0b14e93fe56586d542ab511f6d0e762e83560a930361e55fd88e1a18a7cd2120fb875bdd120b73f3161908119fa0d709f304f9d87efc53a2ecab3f9055bba5a70524a91cd3e0ee610e55bf8be531d90db4d7d949ad615151ae345f0fa522bc393c02a9796d7bcab3fedf26f1e1662e319c12173b200c6f72cfec3913c7cfc58c395d3b025a6ae4a8135baddcacb538e195a2b5750f1cf7e90227273684425e01d8fc67c35dfc8ea2f3d768c3122bff90187d207738ee4d758b776e53cd68da3118d063a1d0f5bf2a2234969fe0d76416fb69693b1e6badc9160d6b36dc69121fe2661911e704be85a8ee1c6d30bed5ddc3398bd76e0180674c9aac92531dc4ccc3c3c1ae721c152258507a92cb3dce4c6668fca56ccc6348c7cd6dac295010453725ee9694c2ed040525f66690b823115f13838bf5031d7827480bba37a936e151d4a45215c147655c01b5ea6b2cc3928c21dea76594baf491c37ab402416b2a244c99b8ca18046c01d22a03828946c15246708e70106ad758347c2f6728d04028a278c5bb2fa491b30737aa950fb2482bba68b5c12a7435a515a8e890088c4aa2a615a804cb91d968af8a7a82ca2c455794fc53b357193a46b1ea1adfd640a53250b7255d2eeaba76095e6744c7463c031de7330c3d83434d8553522cf484a1c3a19750c5a17a5147a51e88f5c49183cd373afa0afd1ceaa9a3b094f7afcb701488a8655431d4b9a827ee08ed15531e869fca16a84cb08cff9f241f4ba8f0285f65c42f346ba943ab6fab32d1a244b1652b6c987374c8dc11c732ec5ad6f2fea1b02efb1dd8cbd1cad184519ce80fd09c1b9db7ef07ea3f7432a999aa46d44d422bf2c4f9ade8553db582f75f8fb2e47566af15f565b95b560d37a9a72e109848ac3633f5bb2a63d00c882c1a059c18ca30c54ba7284465a04e75cb4a8c8e4695416dcc018d169f8a942168a6d486701d30f79b58279cb5db3c09a632c18b06369a218be336273cad4b0fa10a9dc27d41bc0386ace2214127f248d3a4f32149e19d6e89dc6af5f07cb95bec3cdcf3b884982df87ad8609e354a6c08ca6bc63dc526c36e88adc6c68645d2d8ea6192838fc62780eb764ee5cdf44f346d2f41cf5ed6b0dbf0b46dc734563e5d6730a2d92ce4bb2a5c2a8e601923ae4604a3e05c13e81eeb227c5a918498e897caae8a611a735141f7b59ca22138fce786949d91d9c831b418506c1ca03fc8bc5c0c63da50c17a462d56fd724401c0d66e5c85d05a5e48ca310c2b4ff902402288e3a3f6030b26694086c9ff4c1f0d4e066ec3024aa10591d94008b37af412a40d7a0c9814b8095871b0d817a845a4831f3af5dd66be611c05b01d7977c159a1431f0dc1763b774f348c8326176d47460d8c9014bfc7263c1f32a0284e12c6a2b17e64a36932d79cecbdb41a4feb715524f2011b14790be7073739ccc10e38335c4566fc709bb14a447a85e0444b9b597196626524361376c9ef1038ba6cae039b315e6ca9711067e837c3661bfe0a721bd86d2cb61191d80cb6c5d5b9bd91136c399ee3d8b691d98d65e51887534f6c6677d6be0b9dd88cc9a128cdae8d7af166dc144cc86ae5c8c6b46caa02beb045f90d3660b0a4900330333333333333333333e3ca4bfde37ddc1ff7de8d60c232aa45279a9292921209ac35aebce01de7e01dbc8377f0d67401ed0da10d1f0e4d52abe0757486b10e62c41ca48223a94327bb321b1fa7e055a63ce1d2e660724e0a6e8ebfe737785c565f141c4b1e13738c50991e149c94426d5585f6a5ee098ea47c5b29c7098edda4077297396c821f2ed492e698473a98e0b57d479bedef79094e698ae918f197b1129ccd6695ebd2243829e68b15296548706a3e6bf050691b2d3b821f3ebb9d49eab09fcc08cec713724cc9f4712c5911fcee30daf6690c11bc4f93de1ee45552ce109c24b143ffe8393cfe08c10f6311d467d6233d4170e3fb6e36eb2b3b0304d7b3cac52c5de59a1fb831ba6a5f7ce085cba91a626726b7f4c0b188eed1d5b47a5978e0a4c6e6cb13d9819344ea6732248f611db8793a3e87b4505a7e0ebcf6d0217ad8e3c0cb4813d66e3c546ee06d9eb7cb1f04b081ab5d9eaed2b33adab5f082d87f94ef83acb569e1b6c725211d3c0baf652e4731480eb46659781b24180b2779e6c95154d58c312cbc489a7f2bb2fb8faff09225c9a1f9871c6deb0abfe3284a9fc754af6d2b1cf97854438ea7565b56f81a3de4f918415388aec2bf64112d4398e081aa0ae762aeb8acfee1a334156e69baef49bf7df944859f3a948ea297a7f02579a648ee5c1fc4148e678f9e2d867cab580a2ad4c986258f144e942011fd330a5f2ddfa71ccdc7cc88c2df509a156982c71d0a377687f7e8e0592d28dccc21dada625dea3ee1f49d947ac8924b9927fc8ea12558b020695727fca05eb3a74cc509672285e718de849325a7d4d392ae929af0439248513535d57932e1a71c4ff89c35740e0f263cf7499b263269adb984f763ee36d1e953ca58c2dfd80c7fdf1e5fa412fe86ac1e49ce9a630f4a38496ab2cf5c26e1ada698aa6221ea2b92f067b3860f5f8984ebc9936d65b5ed0f020947cee6db72103d6df2083f847f2c094f911e71847329dc86d481a7a46984532187240b33c2bff0d03767c851c72ec20b29592ffb304554116e064dcfaf19bacf4f841f7bf0a0437920c217b90b73c1e3104e6a5bd6beb74a1343787fa163f3cb66e1e342f8d32621dd29ff84f0c2079d6254f6993708af3abe93f1141fa515841b358636cf5aaa3981f0ca3c27bff1f3ce00c233ff20d774567cf40fce775027a942747cfac1f50fa66346abd14efbe0fde5caefb1458b1c3ef871920d8f7b0f5eb7e414ba23f5e0556bd01a3bf3e066a4d57469ed2d9c787043dc6f23fcc776c13bf81f77297898e2b6038d29d9071d07621dfc4f39cec17d460acdd1c1f19caa3e883707377c10739a433e084f0e7eaa34ed992da5b7581c9c34ab9eb482e58b191c9ccf9c2db25f8c31526f707cb2ed322d37b83982abfbaa4fcc698333f39f4288f6d92d1b3cbf98c2aaf755e6881220630d6efb848fc963560d4e48993e30b7ec3fcd64a4c19b481552485ff5c6340c178421030d4ef504dfd8b0ac40c619fced38168fdfcdbd449366011966f0524e89acd441a357b803168601a30c4ea4cc1f59c425bd5eac066490212f937073e943c618bcb4b8decc95a1ff3b2eb6bef0a28b2d3220430c95e6b0fea3142eb68c8c30f8e21ea4b4a9089721cc850c3010c3fb2455fd525f30a656c6e688be1788e497e6735e0b97404617dc0e1b724c4939d892b8e057e7cae361477af1e82df8ad193faf355ae1046468c1ffb19c3286adc6908f0c0332b2e08cb77a78cd1d7e230b032fb20232b0e08590c1be821ba92e68f274d1257fc8b08293c26a32976da4bb8e2fbcd8c2aca08b14aca00ba4808c2a781f89a7d45e953cbe80046450c1df4e9273e8925ce00432a650351620430a2d230ace5cd0147a26c3c5568d1a99749001053fe23f3e5189b858be31c87882d31756db2d212d4b8e2623c87042d540818c26f89299cf238fc2cc4dc6c542c074f1850714d72083094e6dee4de7d31a1daf8c25f821cdfc440c2a5143274309e590638979a2e3586720230947e6f6c163acb83a073290e06dfe9c25a40d1f117304c773f81023a6c4b88a11a86ed5f4f4be087ea8b6cf1fcfa9559808debb89440ec9330427cf769c329a840bb1230427b84b47f3b17e529d20b895dded953d40f03d677498f0d19c477ee04555e9fc99c423f73ef05faa8349ead1d7647be0bd664fd61ee450226878e0a4c8a5327b074e86f71073c4e69a4a077e900d39c8a164fb2293037f656cc35598780f0ebcaa8c0d9afd22e3065e4a15edfd4b82e71c45860d1c8d1e5f4ff239f8e8520b377264c4bcb1ce63b2d0c2b9f6d68aba6916cec9c7b45923a1a52bb2f07290104453864f6d2516de7c8e3b280d8fa25705168efdff6726af8e1e79857f96a5239f9493d4872bbc1e4d4dfb186a3d6e8567993e9ccfd979b4125678eddee5a1a9526125abf003adcc9a93d554481255f8697d36e498c35a8224155ebbc75a1d9ed9c1ffa8f04c730c7b4df6e6fe9fc25b93e41d95b973646f0a7f2cdbecc77394c20fb12395f0b1a884b449e19ca71ca588ee8d3b7b14defd871134ea3ffc220a3f720eed22c77328fc10ed339c87b1fb9941711c99c7c19f70433e881e8ba6d58678c28df6618794365c6ad209d7cc2549ce0ed207ff72c28b5531df99d4a3fcbb09d74396ca13a2ab09a7ec2a64dd0489566d26fca0fe3ce68f35cb6a30e1d9bb745f889472b0f5126e1e0d9fa36bb58417251ecbc420e991a795f0dfaade3e085f29524a09a723db7d32fa78949293f0dca26886895312fe69ae0c1e1d44a66846c215d90ed70e2b64c925249c1829ddbb33a5922e1fe1a51c87312186565c948e70a23e78e9c923252936c271cd718a5ad4a41c898cf07d653a74e416633b5c843749b3e414b25d21a1225c4b216ca203a99839897025367ddc610e39db7388f02a5d468a9eaab4ce1dc2ebb40e54428721bc1c237d20e139469314c29b4a3f214751199226841fd65fab669f2c293908af2e0495a0412a624e10defdcf0709afd61e7781702b4d88b163f848313a40782672f75761d2a4cc1fbcdf902b85c5f62d8b1f5c8ddc954f34d607ff438a629b35ab6ccef8e0c6584915d6d91efc389e1cba87b3ec74991e9c98825d5a87fec9c195073f84e8108b1dc777b6f0e0e794356f26bf15c6ba83ebf669726059b3a65776702d6cc2255955072ff769c7b9a347e242073fd688ec40dad7d3630e5eceee961e678b62b71cbc4a1a25a925264b8c83f3f663f963ea8bebe0e04cdf5f86fb4fd5aa4911e30d6e05cfa8e571109f330911c30d8ebce6ded0b8b4c19f2ca99307f5fd5f151bbe10ce53071d522cb9585d839ba14722db5c4c88a106bf7c443ab6b7480d49831fe608319a79ec65f5e130c44083a795455624bf60887106e72fa9484bcc47b61dc30cde799aa7e89872989ac528831f2d7325cdfeb125916290c10f324d6fad3706bf277ffa24993e77c7108317a1e53c36c86676334618bcf940ae03cd124cd3c4781c31bee066180b2ea576c966e20557d5524564bef34f7e17dccc79429c489ca70c73b1759683185cf0da5375852017184c83185bf02ace3f36cdac11fed1829bb53abedab6919c3fb64819c4c8821fa2e2be3d858ea7432c3897f264df1837358f71b1750557d42c64a4325bcbf62186159c1c6677dfacf6f5e657c1dbd8398e3368baf78de162cb84e1c50b900831a8e0df98faddfb7de0999c8217db248449a99e66f2c59182638b300c181d460c29f8fd3972d49c3c59c48882575953d7696da9fd5070d26a44e592cfeb63f182055b1ce58a184fe8b25648bbe49ce0d5f747e9552fd61a89d104275eed82cfa4907e7ba18156c46082779b43878f30cff0314bf0a254f5775039281b318612fc3084075feef9c24d6c8f102309fe4fba0ade59eab23b48f0d6fe55a5031569d31cc17f995eef0c8911344611300611fca822fb3f6a6d086eb7c79184c41cb9c4b5841842e8da73bfa46304c18f4655e5644323463e06100c125307296ac80fbcdc71322dedf8e08e37a6c5b85c7a40e6efcec14cf43cf02a25252ace63077edcdf9922bad681a329f2479be53843c639f0b3e6385eadf78eeb4371e057faa0b6de73032f8b86908378897677c6b0814925e7ca746731520ba746e2dd2c2b5af8173dad66e224327766e1d4473ff389b62c6e93bc19258e85f7e95aaeb18485571da444b779b5c89157b831d53be6945f336c5ce1a470999c337bc8f05be1c7d6d829bade53dacf0a37a510555931ab36c7b10ab7831c72982c5bc9660f55f83163f9b6844db726a7c29c474af2c72e7563a2c2f73c1fd541d3fc3f7b0a377dac1e3d336b8a536ed55c653e61624729fc6c39bf5d7497983325851762dea8f48e2c878f1c459646f2460ea273bc280c8b312387394a6ff443e1791023e4b01550381b3165a3867cc2c9f1519e34d2e4709527fc888f91d6f368ca612736fb73959c533bc6092fee4f5bc262ea33da8411368410c4e4628b0c03d08413d22f7d1061fd539e4c381f7afa1c652dd9670c261295d26097bf84f3398a9d27ceea52d2125ed234c135bbd587a152096f43fa8fde424ca97228e1e7d618553e3aae8f3209e73aad87906f3b7f1c92f0b27d881ac3a5657723e18739bd234374dc390909673407a17a62e411841b4d6e12e308d77ebd3e8a4eef5d69849f2ba78df0b072dc3d23fc8bd5dae571ec5c2ec24f7f4babab15f1796ccca525c2d97c215b9e17d91c8a08ef3f6b4c1faf5fe6104e84b7dca14c5b6df20de16be5cc8a9d42782a1d45d4ea3808e1f6dc6f068d109db3c7208e209e839298d22505e15fae79fbab74200a89946eeb3e8e2640387193ed347bf41fbc8f43e71cc9a3fd4084f475b91493c7edf5c1b5e47f29a7cd714735f3e178fb38b6700fae87afee20c5d5839f83d89a87b3bb8418427454f93e78f0ef53761c5479e41e7707bf2c2c7c799437c729b583339a3bb68cf920eaa30e7c8c8a31e530c71da3832ff6ff9dbeedd5b49c83511573dc217b8614b61c3c2fadd70a9e38781f793c34724f761e0e84a87cc125f75418dfe0cabd44ccb176f5c92c089552f02ca4bacc32a131c22878193af41c778c1de51c14fc8ce91d85f4b149774ff0c3d08aec0e7382975324f6f6868ba135c1174d299364d487d162821b7294a3e4b496e049fba87c903257564af05245c8d2ecefb72a097e10527aba8b69ec4307129cba0f59f5417290d271042faf5fba8c7418c10d1da607ddf3299d53043745998c670fa34d0e11bc645d15dc21b81e955d730826590bc1cd1965b662d9cc1b0427be83ba9f9b6513089eac445947da4af0fcc0f95c1f7da776b3cf077e84a76fca6678cbf4c077b94f159172ff8407de5f8e63794739c00efca8e3ad4992538c8e72001d385ed6215d8b79b8ca0172e0845039ccd9c73f29e40038f03dca41c2a6567b0939c00dbc288fa255d286f2200938800d7cd91c2b74476ae1d846b9ca10ecc3e769e19dd684c7f9cd3d3c66e14713424c394e9bdab42c9c9e0876962b7786742c9cc91bf75148f9c9372c9c35efe0ad738ae9ef573817c3c71b7c57f8693ac5a887a487dd0a279d44e720e5ce97352bbcdb8ad6395ac50a5985f31f4a6d6c8d4aad0a37668aa7cc4a332ea7c2f76023a36999dfcaa87063b6edaccf1fc7fa148ea57bc8a19885aa4de18d67a57043fbdcb3fca3284941858cc20df691d78c2b0ab7deb447c35068bf390812ab8282abb168159a7ec2f598bbaa247b2a0f4f381a835cf8d8eaf46527bc28293ec55776f992137ee8f7d6482321addc849b3caadf9837849b50135e8478554e294cf62f139e4d5d761c478bd51b269ca834d9a1b2be8413a2dd87d1375eea6a4bf8513a97927b9f94a7ae84eb2396ae634a53c20f52ca42e6ca2c1bf524fcd414434e1d95fa7b24e1a5d4603967ef38b427126e0e326f4bf44f8b1e4838993654f6795f34cf233cc93efed31ec5fa8e23bc10b52e6a348494368df02bb52a4c76480b1b46b8151a953ea3c2ad6611aef4864647b5390c1945f82942fecd914984137a2a6787c84abe20c273b7b69aced4f09743f861b0581fc28518b518c20fe672fc9bb3570a2185f0ad627658dfa7f21342f8311a72c60aa61d4c06e10762ad599f20fcee50bff271a1251208afde526c594b5c0f083f8e393a8f473a4dfd07a7cc3ca60a17c362ef07afdc36c264fae065c8c79afae083a7c9c6638cedc1f114317f242322293d38f741d24abfec6a1d79f0623c6aba089ac3e8c08397af4e43dbb22ce60ebec4beede0fb658ec3b5c73373d781d90ea483db95b263344799369e831f74bc695210e5e0c6d439fabcc6c1dfa4b943f1150eae654e92f9dc342a7d839721d9f12de5414abac10d1d87d9632b5cfb6c83671a39c741d2d431996cf0ac5243541fd7e07465956c1ec658caa9c10fdb614e558fe9bc4b83ff7190c3b8d5d67cd0e087f07392dd3378bdedd1a5ac0e0f33381bdd7bc3bc6570bd83f5b05346062f25e6495932ba778cc17b4bb9376214afaec4e09d057b0f6518bcecc8476390180ccefdbf77c871bee0877e29671b8f17bc145273f061da2c962ef85a23bd31fabbf35cf06354262651f1efb7e0a5ec142cc3460b4e6bc654a9e262684d16885e1d7c482958f0b5dd6247989bf82857d8ae6445836a0527749810217c7b1456c14bde6973850a61b64205e754623a4cade1a932055742beec41ecaceb102938a15fbd3af351705cbeec3f780ebee3a1e07b0e3b753a9fe05cd01056511b6639c10f2ebae5ac9247e99be06594778f3f8c0e1a2678b933640a1faf5b64095e84d09b11568267f769f1ef9104a73e7f1c7ae88104e7fa7344f5f4b1cfe3084e0e3a42bc4c99dd6d044722653bb06c566a17c10f513307496622f82769a93ea423cdd921f892751fe628c71c9b2b0437e58e62f28c06c1f730735467962e4305821f27c96129da64f8c81ff822b612c2f47a10a50f1c33fbc91b246687600fbc4c3158a69b8f5b451ef87d1a6fb9fb8314b20327d9c7a1e7f9dbf6381db831776ba596f9162f075eb4ec100f217b640c07aeab4fe6685bb63206b8819b5fca26967d5c6f001b781df97a35c7e553d7c20bda21244d7972eecaf058c93ccc5acdc2f98aa134e7cd70175938123d3bfe2894e68b36165e7ce8133d473e2cdcb056a1736d7988cf2b9c303194cb755ce16a85bef4c85208dfb4c28ff6917fda9e70b16185d71f555cfe2c4a8e55f8d7b1c74345b0e05154e1ab767c3908396ab44a2a9c9e994b97b7a35454b8f5a9c25a8edc29494ee1e49bdc418839c8111253f8ef963c8e42be147e8c9ddd36ea34073d298a985635cb1fa370bd3ecc3c7fc4ce1ea2f073ecb952ce23147ed0724b33d11dc530289c1ccea3f9c935a7f127fc1017347bc7ed61c69e703e481eb6aadc0937b9698e6cd2478d2c27fc568f327290183ede4de09303a9f50fd584dbe9cd639294cc5ccd8493e67148ee9a63d78909ff35c2574a6dbd6dea25bc99bb54b163094f428eeea38e2cf66325fc28b6e3d764172585126ebabece7c7196fd49f8c1d29b6f4f648c92f0d652847f0f6be922e1479914113465c57490f043aca6f031e5e0ed23dcbca5da97426f089a23bc28a61d474937b3aa11fe878c9d3c3a9ec830c2f30e3e9c644c49c3a48b7025b2cfa25fc44c114ee694e1eb2b89f02d3a8ec73c06117e0c3955d33c840e630ee14a6ad792397b558d219c7416ca3fe410b92b85702b7518c27f74ccac10c20da95f4f7910aea5cc9c42737f50124178919e6adff1658e914038e3b1fa67f324361140f871d47879349dfff3073f6c9c5ffe2d898e1fdc10cd41a3c61c65f4fbe0c72c6ad71d84d2f0f9e0e5a9081297ce93f57bf07269d80e2b7f90cf430fde86ca520dc9fb3f79f093bf44a494c6833f371e9d64b21bb3efe0aaa7e710edae1df51f695e8f3267b90e6eb7664df1618e89321dfcbba43ed391de4a9e83172cfbfc6a2c073fd2ae58173193e5c4c10be396fe29c2fa0f073fb4ed896e1e43a76f7025888a7bfe4e9aad1b9c546fed39d536f86e1ee788930d6e6cb986e6c91b9daec18f3247fd1e199d326af0a312ef8e47ab7325d3e0fbe5b0535a5b0f3e687025ddc392cd61a9e50c8e4d6a0e22df9ce4308367f159b56337ff0ecbe0498cc86f6bca9a0c9eca4756f48cc14d93261e3a2ec570598ebd30b8b93e0a9ed181c18f88ff5af7dc51e60b7e468de778096abf17fcb0a93f66c4f4a1ed821bf37b5cfa7555d2b8e07768161beb3129b305af42a37cc428b5e0474c512aeec982df9192da771c2cf861e63c76472186d4b9829fa3beebb11cbaf35638086fabe0a73877f31012fba6829f72ec9b704ec189704b69a191829f3b9889cb11053f7b700b4bf93ca40b147cad309adda33cc1cfc93d4c158ba810e204a7530869823716b3b2e4ac262d61825b2949aae6ef9827bf045f353a7b234b18f195e066f449bb764bc93992e07de68f526c4ac99303097eb2aeb5f18ad27e1fc17f9ff6a8e41d7dd846f0c27806499ddbaec345703bd88e93c6f441083311dc9a8ab89b5893cf1d82f3eed2df9999735e85e05884c672d70e490d829fb286c98a09047f237bfa851ca4cff2077e58e40c8b613eaef481272947c991e981abed9653a2689685077ed0d1367fb13f0eb2033f567c681b3d126975e0ffe63953150b90032f6cfec366bfb2fc1500077e249d9d255d3e89ae0037f023bf5c3612726d8a15c0067ed8d7f93cad3286ad165e6cb41c2a365af8519a986d9259a7c92c9cbc621d694bcef943167e858995e314652bb1f0d45f2be7e8520561e1b84792263d5fe5fa157ef0dfd3ada66d63b9c2d9f48186fe68ec2aadf0d62b47b0b14829cb0ab7630f2b7d24e12adc8c728b2947a80abfdea227582c9b8e3015be5fd545e5303a8e0851e104fb0efaaa62adc7398537f641ba2bc7b1bcc7145e6dc4d4ea94c2ed305ad424e37711527895434f72f5d1dd3c0a3f4fca986286cdde8ac271f30b17257d6a86c2eb3a3593cd80c29fa9d7f8cc7cc20fedb183af142a2d9ef05288b38b3df127e984177f412c956685ac70c2ebb1f338a6ca26fc186e42c2868c29af09dffeb2df8924136e6a8851e22398f0256d5427e98ea27309cf434b59f5bf25fcf451c75399551ec757c2491f6d78743c259c143cca3a940dd932092f3c580a9e9364f99084ff31855812b6634a1f91f082a58b1e3cb49608094fb3624e533fc289fefb0f153bc24d1edb46f8514cc5a7d258b95e4638eea369c5738e83f02ec29f0ed3be43c7b1ab5584efa16a089dd22a443411ae660e55d4a453f78a0827c4b4f92b26a3c27a083fea682bb93cb5c7aa21dc786bf5ac4d9e2f2d8497aa766df3b9ce4d42f8a9b9d36b3a085f543d8a09f2d6a320bc694ddd51bb2731108eb8e4b8de83b4660908c77fe5d4a492471effe074a8e17fd38c4f871f9c4a135bfbc32746fbe0044f95cc32ed933c3e387ee1de7bed324bf6e078b40ea2a64eafad1efc73efeee8687bcd3cb81edfe6af110f7e0cefce76d91d0ca9af52f6783b90e6b73ab81e5ad6e0db35b92a3ab81d8748afcc1d2e85c8c12b8b2995dd2671703d54ef8f573a38781fcaebfa63c8aa746f703a7a0e2ef391f345e70657d2628769a80f2ca60dce46878e1e877414346c7072868f6369bf64cb1a7ceb0f79de72f5fd6a703d7be4a04572be701a5ccb7739c75f4183bf2134a4671a0b5e398313a33d9121a6ceaa98c18fead0d724a40c8e89a7c5ecfe4af927836f39ce399aabf1a8ff3178926e2ec4f42858ff6270c2fc6d75dcbacc1f066f2a849ef09863c607839f525ef320390cf71c5ff04337d5140f29217d78c18f3653b8ea4bd1bfa30b6e48b19c2485b372990bce59f684a40f72d0f1161ca91cbedfbde318b35af08367faccc741d566b3e046bb1cabc574d074b1e0d55b78c755dd26ed153c099b434d9f90c9572b3861fba543e47ca779f1b0a3b4c20d99a952adfb2353cb0a672efdba8ac52cac5556c5baff63ac3437d31db3a10a2ff664ffcf9b6e1e7ede48859f2de95108d73aef3750e1c5ca1aa9627b8698be53f827d33d99f2fba5e698c28bbba41eb2f3c4985429fca0f597a23b59be5092c299bed8162dd9a370a3e40fda91dce5ba4c149c654578b95876677cc7a1ba22caebe650b829ddff7564c7b61cb2010abf446c638aea486df9849b428ed581470a911896c28627fc8f5bcd42a8eb550b373ae19c78960e82b1c50a0e521d48c20627fc2862c71d346724e0c5c6265c0f1bce43e227c7686bd4d8a270b0a109b7f307edd8983f7a8f63055e8071180e6c511b99f083905c6d5372112d4c50e92932965d1313193652f89770babb2445788dd259870146172940b584bfb221b572b08401461717d8a8847fd9f5b17b4e295157b4997d887a7a109d7b42cbbbfc4938eefeb9225473f6201e614312cef976678e241d093e4e2675f9e28684973aec3a5d5269afec1187f1b87338c29678abb0b70ef70a79aff1289bd036c2550be92b98472184ba1b8cf0e37c1693a6cfb1087f725853eb137b091b8af0673d7c18d357527f4d02612311fe9a7af9c7f9d307416344d84084af6934c2a52c1b61e310ce8c4c276d172f4def8621908fb78314a23c0b001b6c14c2db681e2ce6d01d734cae0e3608e17b1c678cae0c51a9a941f821a4b76c99b3e5941e82f0831c66cc71777ebd06a292abcdaaacaeac7c5e51228df87ff600e1af44358b31440c6697fdc10feeda2b751cf7e4982fb65081f9628b177451aa0a3b60c30f4e4ecb24b12f52c7aa45b0d1072f870813d9fbaa2ae40d3e2053a7eeb61aa6d26de961f4506334dfaefed88d3d781163aaec9f8fb1adc2c596bd0bc0c0aa056ce8c1ff402cb43a0cbfc8835f21e4683347cfc596a5800b30b6b00ae374c10518c9800d3cf871b9a475de1cc3a4f9c25841171f3841170fa851a3460dde2d54e08215d0c61dbe08030c177cb1c51602d8b083a7f59623dfd47182159814a4e0e08264d5c129b79c3938952437aa0ba81eb0410727786be6f76b71f54e7080018651c1165812d8988313527ef3205c7a6ffa2a0c1674f1052939f076112f2257259135356f96b3db448c1e0bbce00d6cc4c12fd390d992c1a3a6145b75a0cd7bf1451860e80aba48c11746058a81116c711b70f0f387db0c39763ce98336dee07faab75f8c1eb9e106ada32eee4ecb23d4253eaf8a791c39ecb68f8160a30dbe7a6c99f6d1c63cd9dba20b161c5b18166cb1050646b0458d0d36f89f39a5c89363b61e8b8b2d2ec070410a4e5a60630d6ea6314f79324586ac1729b80d3538d61dfc88bc5e5ce02eb091062dadd3ba34c35633cdb6e66290b953b58f49738213787101167881811a354ee0450af2be0883051b68702c9ac6a0622f7e1ee4622b055d187206ef425b7cf6278fe09a2f5a00066e6c98c1f7d850219fd4d25c9e8bad93822e0c29832713730af3fa4bea09e38b1680915c8471a80055f05da4003130822d686c90c1dba4314721746757c7e08ac66cfa7d58a11d31f8315b8e223950cb09831f7f0ea2b6e251ee3060f06cc6265708ff3959bee05784201ff786f178c10f7334ef318dfb8574c149e96f51e9a639940b6ece9ec1453ad58c640b4eca665b16ee344cb4e08b5d6a0a92d2a5f6f70e26fbdd7b2c389d992ed9edea9d2b38b235bfa1d6a3d86105e72a778ef139b09c1d557033648d930ace9b7cb470e9297819fee73cdb43b1b414fc9118b2759028b8b6a93f8378471681821f89c6a658988fb59fe07ab86fada8589ced044f52da48f1f19a857013fcd0c346abc87124394cf02d36422563489163096e481fc12347555a2bc10bd1c166869cd2c649f03227b3489535d521c1f5207fdcae1259b53d82e3a5213ab5467053e5e8e314db577711b4cb9ed006113c3b931ca6979cd9d3b3310427a70c95b4729c3aa4674308ceca7fe4f164f74fc9b3110437f465cae1a291f3793680e06d0e391ef994424ef36cfcc08b6079e22323692acf860ffce875de4198e46dc1b3d1833f7bdc23d1e581131e9f63348c45b703e762b4f7adeaa0a203bf62088dd530078e7814e9adbe0d1c789fea714ef213a6be8d1b782aee5d975ed299b7610327b79a4711e9e31baf165e8a0923293b8ed26b87167e471b169ebd269c7666e1857d1c449ab2f02a3c76670a1b2967b1f0259a8ca51c62d607165e0e136b3ec7ce9257f817f239ca945aa9e50a27e714d3e5dd61c76985b72efd59c3c692301d56b85146e3fa833a4f59859bb54d3ac5b8146355f84126c5d87452e15f7d6b06f3a0c20f16730aafc7dd6352f630a9620a5f632bd67df4518a29851bf31e2ba490c2b3f0968c12320abf26b4c207d1ef3f88289c4d3d69fa0c853715bd4dd3dfc620289cb6912c62295f0a924f7829115390a858a9239e707ab3739035b30c914eb81aae1e568c8e909f134e5a86ec3064aba0fe26fc38720fb1f3cd4bea356125bf9cda1f4726fc54291fa61ef1f83c30e1a6ed914b96dcc2765cc2e94b1f65d7b425dc0e72b678f88e1ea42be1db7d18d971e71c7253c2d39c695b622b33d793f07360725922857f9925e149c664f69fce718c23e1c61434e7ce3239430c09275e24856675966b1f4184fbf3924d1de17d14c226767dd49a36c215f54f6da119c62319e1a8c744d5ca1e4de722fc8f467324e36d174e45f841d2491eef12e16f4c1aa53ffa87194484f7e92d857d203165f0107e040b734136fca268083723e51842f028c28485f0936407a9912384ff39b3cd86078f633708df0397bbedc958a320bc8f2aaad53eacc50a849783b07eb36eeb6105083f9c995fd6fcc1fba01a2ac37399871f9ca416aa434da60f7e289363f48997d0c8f0c10932397d58397bf0a37a771817a207ffe8c129cb9d3a79270f9ec6589f6c62f0bae0c1afdcd9730cffe023e60e5e7b7cb183539a3b2454eae0873972f4317d70c1a583ef992a31690ae123998363f9a3935c297db372f03de54aee7d1c9c742ba6ea3d1c9c90439979a455abbcc153f5a0b28accb4ef063774fac852eed82dc7d106ef5d3eb00ff9f38d071bbc8f4e6a9dd3327af41afc8ee73ebe540d4eda8a9d95638f2ac569702673e821cd46839f912c26979cc149e7a3d616dac3bc197cb3dff064d3e797c1495531f75493c1b3b33149511d8393c94672faa468a38ac1491be722a1d3a34bc3e0c9e4e06d29f64a8e04832bee41ff57a4aa07bfe0f95a88d029e8052f7b9691986ace65ec829f6ae1e319f34873b8e0e7cd9888892db2b92d78b93fb5848a18fd3a2d78136361426c89e7c8826f79f278967df96b58f0d275fc5a26623969577022222bf67c58e295150ec248feee5855c1894924a6145eb93a54f083c9db1e3705254f8e9143450a5e6a5289e935240a6e482ef2713c1628b8c96da225a67f7c79821fc6c58ccb92db3e27b8e1710ed5e2728cd56982bf39ce379b63cd39c304bf54ec249c4bc8d6c743865109558ccffa7c26094e8e2a4729a305099e851ca61c5cf9d7468ee0bb472166e690b152c4085e08398e6899c2f5e58be0a73c29c7131e4470f37d184663de48d13104b743c81d875e087e5c21c79572e430dd41f0e3102ec7dbea1db440702d8450267f3167f3074eea891dc5ec286dd83ef07e26bc6358c90c750fd61c2a5a2c0d0ffcb2b90e3a8ea6fb8377e0e6aaeb491e1df8a6ea1f07570edc8eab3ca590c581f315be56ed0dfc1c269329f769481060033f3e0a59f2abb570724c4134a6ce725269e1c76130d114d159f8df79629ab01256230b3ff020f7e6138bbac4c20d19636bbab78f21b0f027d8b5759a0c96bdc2f1d86453b694ef2a5de15a8a11e71f6c851fa6ac3c6b6485133bf038b29854307115dee638248f1682670855e19bc731a46473ee38970abf5a3e920f2544a643856b1e473139fa3cfad829fcaebc21a5c542d29829bc4a2e5b29973f47560a6fc42f420ab7ad4b7286ef706a915178122b872963f7077922a2f0abb327c4431f0adfc3467b8efe79c20714be450a0bb93d5e8d9e4fb89a3656e4303a5a763ce1dc8da758673ef1309df0443458b0bc2177a4e1842fd9999673d4ea39b309b77275889af346b2144df8914afa8e3a997574c9846fffd92c5b65e5ab60c27331b32c0f3999e6124e4ae7ccad29470cb18413738c1243ae849761fad206cfd9b194f0d64cb352ead6ecc824bcf4edb61d7e49f869528cc9b28f849f72ba9c3e9258110f48b81d2654943693db8e47f89e82aa457438c20d29738e432c6af67423fc38fa2883947b349a66846b729eb2868ae93e7a11ae67d9e09f61430ab5229cea286bca5227c28b219484b31c45af20c2b394fca14b88d6371fc22d93ec3996cdaa8a21bc0ff5d01f47918b6c219c1c4426757c84f06bdc73902a1d8493d7c3741b9ded422a08ffdd53e64eed953b32108e66ef9421de2ad70908cf23654df0f30f5bfec1d7709f29b2e32d1ffde0888ba528967a7cbe3e78a9352b92d1dfb6e3831ba135dd6a5f9c670fde64694bada93175f4e098650ec5c62f36260f4e5cdd5a0ea3078f030f5ea61c6bee204436b63b7875de1f840caff0cc0e5eb40a390ec283c831ab83df1263989842072f4a4a39889123c65b3f072f7d98e39e88c90aebe5e04627390e6e4e6917f5beeecc818393c7db3f9387cfe50d4e270b6e91376ef0ede5235aa749744d1bbccb1c25a2648397c390cf18d5e39e5983e3817f320feb715d8a1a1c1b19f1acb1b672d2e0fa892509963b98074183932ae7e6317557cc193ce94e131e7d33a02165703c89aac5e8f155f964706ce63c8cc1f2e6c818dc48313c3226710d8bc10bf9d80e3eabc5360cbe44c8299face4283bc0e085c9e123491e31a45ff03fec0e2486da94587bc195902991a84f92d3053f4afa63c2528ec25cf02a7d18973d795bdd2d38e9fd2b47f7214b460b5e856745084133250bfea754b9b3ad58f0b4cfa34a41bd8297572b86902243f2482bf8d27188ce548b746615bc8e9db3974905ef3a96d95c15ea564ec1cfa27541baa30b0335d6e04fce29a79c3e31c73fd5508313323b7a98bd37c7d2a7c14b52eba1e71c26b9bfa0c17bcb29575a98902c6c6a9cc10fd45c2c977c7e50c30c4eb5a492d58eb5366519dc4c1a1d7358ab99f385b9e200c7e00bae4106ef3dc8df352b1d440f1a83ff95917cb3e5387fe41083ffb16dff88ca61f0cb6d523078b162eedb58096a577dc1691993bce0c714d27f7c1c540cf9d305b727d347b221d6e0829f43b68fffac3b47c6d4d80256eda66a9fb121993a72ca9152430b4e287f0f5972eef5ecb2e07dc584a5a5160029d4c082d71e76567d566feae4158c2dd917b493a68615fc1cc40edb516d35aae0dda58739f8daa648550d2a781d9322f685cad86b4dc133f1b39f4b661f41ab21854a225cbdc4b3db3f45c761f25ca79428f81efc6f76924f179f5f64208c2e9e6a40c189317956091ead553abb45d1a0c613bc0c691f9a48ac66ab38c195892cff0c25175b2970810ab01650a3095eead452dede71b155bc50c1162fe8a2aca67d00b7c81a4cc0446d6525cd3d6ea4da530ea15e61420ebd1a4bc0c3ab3a66a4bd1a4af0a3e418d523bf6b24c1ff782e33410d2478c95cca23357bb8ce41358ee07cd011933a0acdea670d23b839cdb6f2dc45bf0b1d1f6a14c1cdad31720ec254938670c0053588e044f5285ba7ef188217a3d4f26d9ba7206b0d21789b377e7387641070950bad2f0f0f912daf48d95463f0fce7670d20b8f943baa5af508d1f78317d1c8597dc686c54c3075eb28a3c217610f56bf4c08b1dd39e03ffe0f3b13578e0d6467d798efe0ebc4ff2d7b93e7fecb8d6812f2556fea1c8f9a6a9460efc157b8f21fca4f848db410d1c78221f85b49023dd6adca069cb3ad5f07899f56ad8c0e9f4183643566ae157a7e4db964fe7a9a685174d93254b9b5938d1cc276f92ee78a3280b37326bc5dbe5dbbdf3a20b1ab1f0b5bd43f4f54fb1013460e17c14ab932f890abcf8420229f0e29c8374e0cd0a345ee10a67a4a245394b5be1c874960929fa8b4a8815a0c10a3707d6410aef1e1e73ce2afca02124e4281d55f82d39e88b1239346f4c2a9c50cb7d11613c5f5950e17cb04a1a73189e39f23885e313293964ba47e9834de19da4cb5c67bf1e79b0145e5aaa0b69aa228597f2f45cc8d1cf7ab246e1895864b5dbf049461285e7bd1d9235191de51e0323d8a20b1aa120bcbb2ea6e6ccba5c3a68a59453d88e06289c641d2264dfe827f6ac4ef35a8f9334f3ce41e5f65852746c3ce1b4af64acfc49245cccd3e8841f29a7f021f6458f5f2a3438e15ae80ed3d6e6686cc2f18f5972e4f46868c2bb0966131fb287d9c74cb895d583a68eee474303c384118307c48006263009198d93b4cf6040e312cec73fd541ce1c96a024625cc2e34443e6b633ca448e9b5425dc4822f9bd2e4c0947aa7e23c3497e406312ae6a76da761b25e175745e1725e6bca69a48f8a1e55053884820e1a58491508f5a2585f8115e24f7ff984c39d2d83ac2f7d0d73c8e36a68fc735c2cf41960d29d46784f7b92ba5c71d5c4461e6716791f1e63dc9c358af082f04092a398eee72611a89f043aa7b54f76977c88108673de6f83dc474eeef1cc2d99088507eb51ed6c410ce673b0fcb3b3afdef42e4b6a22a59ef6521de5539a8ca1e2ca5c8488f107e1c7b5699746d15680cc2f3bb10fe628809c297ae18a5a7c3e88f628158a542522542d6ace63ebe903420fc384b984e9321c337f8072f49769c2b578c4f1de407277fce2629c4e8e9238f3e34652d27ef51976a5e26d197eda5154172f0c1fb38233eaeb2ecc1b1b4f133db512fa0a107d73bb67e992a4d1eb677061a7970ad2622bbe51c68a08107278878184248be71e3d1b883375152d49e790fddb71dbc8be930b2265407ff553ec8418e2a74f0a34d26edb183e409cfc192ad16abd6146f49096b8d918a395a0ece07a13f556d44230e7ed2ec5959b4c39472c0c1ab8fb6159115491de40b2f24805b031a6ff0b2e5ec9d3199774cef063f98921c42da1c297ae6f8c2ab0d7e1ccb79ccae90d35684061bdc482a41c634668af28a69acc1cf1e39b45384d5e05ca808b229d633a6541af2940fb9cbe9a3c1cd39a38f7a449be990c6191c09e571ec2853766c9bc15b7ff140727f06b9b60c7e871c7a90c10fb2cdf585bf1c61b531705fa2219231657116eb115b44424aa798187c390ffad42a0b4356b1769e325612369f11338520f6c126248a60f03587f8ccb3e182b8c00b10f080c617dc54b38f1eede8b56337a0e1053ff9df588748a769ac9d018d2ef8bd1e7c5bce2c122b840b4eff871ea22593c61614abaea9913497d4d8b6df88f513a9a6a105377518bdcef3a65c9366c18f5268cf97333b738ea48105bf2d6a7aceafb973ecb98213ca254be890ade0a5a70eb36c39c8c6a80a6e5db8e49155f0cec1a854f0e353796c6c7aceb1e262eb042bd805d098829fcddd33cdc4b8d88ac1910253321540430aaed445394b9675952e5170c58309e91edd52b98602776b5b25325257e3a7bd91557c825f79c343a8faa8734e2f136838c1ed28933be6b553f9c409349ae06a872d1afdeb3bf630c19199edde90f925f8e9f279f4b14b3494e067ea4ce96147a6393322a09104ff25bb47c1e3be889e41829b7b735839a87d84466dd553bc624decbb3607afacb9e6e3a36104b7d3ed338fa56814c1cff1f44732398a06117c8fe9e3991ccf07991c34a03104ec3e4aa6ee89da808610bc770d5e1ec60cb1262708defc4848fe7cf141f00061ab1b95956c2dab8de84afe33c973c77624971f387296d2c5687e631e4cc3075e0ee222a5b1e84d6147a00b347ae04a38891e476a8e83845790041a3cf0d64224a4740bc933b883c2d42a3ac6cb5536694c7a69e860cbccb8cb2e29bbcce8aa8c14c22b648ec3252eb668e4c0f9d06f1d7ab686988368e0c0b9f671f1ec48534e1b1a3770fdfbc4a3d9102eff84860d1ceb9cd13e6ebeac4f2eb6bc08630b3050701816a05560462dbc943752c59c6bb2f7dc8119b4702d3349aa68698d1a555f80b13366e1a5cdd41dbc86b270227c74f5314962e1a47c9329c33278871558d4a215dbd52255ee362f390e8f36f2fb0a3fb4d0719a438e2bbcfa9446f36d8c291fd30a6f4a63ca9d31acf05346d8a8b461269255f89dee293586c7fc5155781333bf59678af4b1920a673aecd248539f6c54385d696424b8f97d4d4ee106af0991a9d9716a4ce19987ac3158cab210520a3fc8ca07673e299cdad05bb79d517877122dbb32224f8828dc1c07eb21797684c2f758631e73ea008553214a92b3530f72e8f8849f2f8f6f867464966a4ff8416ffed0622abadf9d70343dc6b2c709bfc62b4fb466e4ab78139ea598796e6e4d38e79fae836c33416b68ef50fe03137e0a2657de1ea690f5125e4a0f35f96b7dea534bb8e13dc8c16f07aa15530967d5633bda9794f03ab68fcba1949370726945cf1463dab428093f8c65f9bd031ff1c922e105f7b0963fbe20e1fd47e4d4563fc2e98e93da54d48e2b48331ce17534b39e7e723ca311be79d49683f530a964b88cf03b70e9e8e55e04d9a723781ca33314e18b847ccb895ae78c6724c2c951da76d0b1bb72cc20c2894f95b3d2d9f57bee105e0eeff5ca1355529a0ce107b7f12ab318f3854e219cba0b3174744f88b32c4dcb3be32ea55bac374d06f3c8caa4c283f03b44f1118bc8917546108e66fed01dc2a7e5c01208af62d68890feb2ab2a80f0eb62b68f273a3089fcc1f5c966b13d9ef8c1c9e01fa3f45dfab0923e38a5d1b3797ff0c18fd44335cdc27bfa7f0fde8f45cb79fcdbbf7d3df851a4bf27f67fc5c89107ef3d0e9d2b4bee8c4be3c1eb309447d25cdfc1ad30f93e779ebef1d90e07d9265b07e7435d75103ff2331ddc181ea6e093d2d46673703cba972441e33f2296831fc4b4f153afc9cddc3878722fe629f7a4dc3170f06efb93f4ff779027fa066f2d438ee4a7e330f36ef0ff7d6dc2e5c891c56df063dfc810739633d8e047464ab9af424ed98233d6e0686c984b31c786f7c0196a288b787cb2b5310dbe475f479d91ef230dd1e084b449a288f765ca9fc1cf72c93c58c80c8e7daa9ca9528644580667d663c911aadc543a32f89d345888cb6163f0358568c65c89c1f14054b335fb6c0e5918bcaeebacbee4e69a0383ebae5e31878acb53d517fc943c0a1d741879c1cdd453c9c3aa762fcb8c2e78ee1b62b5fa9f7a79580833b8e0c7305ff9349b2db82eb2c12635a5091e99a10537cc7868a5edde285f169ca9c98e3e87cb2fdb61e1b2aa78cd4e891a29ab37b96e91f20aae45becc71b48c153c559f8f3fa70b39e5ac0a4db47c4aa5c7cac7bbf95f7d67474a05cfd3d7490efb7328dd14bc34bbd9f00831a637430a9e7b581dbb07761f75a4e1408d1a4e9811052755858d51161dcf57a0e047592343d966b7cf3cc1bfd41922d3d638cc70829783ce1f623af72c95ecc0173498d104472c46df768f8a89640613fc38b630591fc7db12aa194bd02b2eb6eab2264e666653c7a8b4fe511382194af0725dfada0cd28c24f4b35951ca2f8404cf2ab8a85a08d6a8b10500dc30e308acc86c744ad6c59667a894657694a24db2314930c308cea44a9875190bb57946115ca9243ed9fb23bfed10c14f512de5b29bc71e3d660cc1b35c29b7577d9c334709c1cda1c3346bbad4586d10bc105d913768464bf00082ef71f420da27e9f3b366fca0ecb2aff77439f5d841d4af48ca9fc2337ce0c7fa383b6bf7356a7c61460ffc9aa88f1d59c87970171566f0c01b9f0fe5993eca5d31e2c18c1d3839fd85e4b4195386ac03bf2ea4106be55353c766e4c00f36513296c77bcc51b89881033f4d4ae49f1ce5067e2c19daba932c821936f02c4c6c6b8e8a149d530ba7430ef28dc84f0bacbcd2eba3a3dc453c347314a29d2db3f0e3e389d948933b458981116cc1820d5938dd414cb5a33f547446868d58381d33425c7f59f48e030bd7facffb7e62c45ce52b7cbbf2f90f993762785ce1755de8988ad8a874e903e3e10182c161c16824128642c1cd7e23006315080010541a0c45721c0792381c7e1480015d1e1428281c1010120e101210080a120a060806060008060606000006080685414276608e65301f113ffb4f02b53e38081a6d1e2e448eefe4e0fb5cc5a118bde5a418ef40a7a3ff30dfdc617d9b34ffd7f073d12f7e1bb37969b31c27467445e227f755a721f8aaf4ed82f77e9665f5bdba1d93731f72fa089045db88560ebb5199a4d834c95ed3e0c3d8e404d1a98cdaa2134f16942e68ba9fba41b2ba300222fd6a06b1c1ca6a896b6ccfdc63360f18c3951a5ac915597f4aedadcef6e00fc63a94a3a3b4606bbf1e2970253b672a21a18e88f40dbbad6a3435a3816bde8308bdcfcb169b680e54db13f5408b1acb24ca84317ee7365b9dbc93794b5579120d7a4ae5240048fbc521b26c423e8706e73d5f85f5ac1c5afa60d3a589fa8152aa14171dd0cfd013d14c91443aa1ce2f0943e1a836035a3a983c7980437517be3861a1f8f79b8c1b1f927fafd06f66e40a472275af5edc8473ad22bf37e0afda5492f7681368876d3003b81786e5f64530fec6c8e0351b39ae5ce166f2c92c2e4f8d4fd982f223b601fc623f544a3904486588ffa2f4609c33ecec7c0752a2af78c9e50cae72365db4ffd4d9d5f034c4951e28cf8a206bc3158b8034ff1d147bd080f7bb7c5215e1bf86aa9ef40ebca6dc46c27dcf35d31a2dfed9e13d1ce94590fa7dea84d510c01c78a5e7e03ea7262b79991f097b16d45de0bc047f6bf565f0d5bd5466c0150d689bd21e2d4b011cf4ce4d925ee8b33a8c9d29b4da52c74554706903e0f8fc281d6b396f1f8c7a4b0b1c7cfe80e15baf1acb1670945e9f36ab648e2ae2c6d954997c2cc80ddee4ee6cb41a4e12ede533a4097a029fa4a4ec773ec05976c55a48b8f09349043b5b4a28a671479ba5b3069e22dc94788a66345e7fb8cad240ac505a4a328a82ff007dccce8d4ab68283ef9412e3b125435a8180fa0a4a56afb162ed4be7443bd5c403962e29574c00cb41c01e849dbb75a9b68cf96f89d63dd92d6eed27aaeca953f48c9963ea2c04db3bbe3d7f183d25a25d32a480d55f84827834a980560455393d3e25adda443cc509046da84f6a044407c91208f7a3f80a52b9c0cca6f2890cdd31822bc35c105bcbce2f53bf4d765625b1393ed2d44b9268cd2bc06ea4e09b5bcd5bac084fed0034fb21abf6115ab06e62168ddbf0feb95e4f7a4ce9cde2074d78a9d21c6d57f7b5cafbd44dfc3f328e2e5b5ee76589391d0fd824bbd2c3b7d43c9e8a2ad048888d77a5745e48aa7f2d7e3a12101ba7a136ec898891e432fcdabccf66ea0f52ae4d4dcc70754345454b8a8052b684ffff4a5f26add98134ee9460064916abf75c718583de2c9ceb02e2b4e15afca12711fe70cba5fb1bc39e9e95e39764a8cbcc907b0dc5c5486c44c9ca42be1102f402ba5b95234f000fe40158a79905ffbc14f40d2525f74f40a85166555322f1f70d2f4c06fb2b339a1b2af326ab74f181a4ebcce5d6e6b32fb9051a7e9cc2341be933e18cdf05087ece950e94975163b55431635214680eb1e45e63900ed1901c956df73349cc845b2a216ab50ef40049e2a0fc6b9bb803e146d5aedb7e4fdc789983c9ed8817ce44849c0ca78be6c68b159b3b8a97609dc37edcd8158226241d48b004d8f039933a65a25fa0236cb4cd74d06c94966ecad561f4a198f8487c8518669a09c76cc6ab824819b89d942325ca44e8dd2f9795174188ccc62a4d2ea26b5656cf15d7b2eae7a0bca35a67ae7e83d26ef945f036f900b1030d8f107ec1700caa943234993983d18a22a49650d76d20897aecbc70e29c154e2578275b2af301cd9257af42bda9126b6a1b51d3cc92457abbf8a38e9985799d8b2d951ba41710f283d174e059d883163a0ba2b624bc6ed34d99ce504e31b2c173a342ffb6f102b49e09585ad229b0cb2bed38bff2f439d37a65995dbae0abbc1048961f62ee362f04b4d213c22eb7ac8b7342784be7ad77a30a41233bf7b46ecb290f83833f9bc307696ea4777580c982a941c4f715fc34589d90f834a4adbccef9fe469290344b86a7dbbea28281f0561a5fbca2408e420ea552337eac8227057a935e8a52d892e0334c9ce596c635652108f790a16cbd412e96f3a9631fa5b76cdcd1d096178a1bca5a55a454cef8f0f51949590312af52fd24695dab7da521e9811855046b01d728180095e577b1c659665fd3208243b8f42903c07959e8901640a990bb89bc9cf2b1b4b0a014182183ea944e1013da0aa376dedf002b4136c0533c1ba5ef98054da57ff75b7a8ba7f0905690241fbebabec72460bbe53b34434e4158a7a4c3bf7172ab95a54de9030704f411f2e3560e193d60d7a90b8a68fe143a8300f0acaa5600cb64c89291f98d8fee99156c19c26cb4a4c86c005c5b4c74286f9e05416ed8adc9b0443dabcd45031a54a44c719b5c5a3f1d93b47208fd96a81c9eeec29d02c5bfb7d31cc52c95b380ce2b6ba652f96cdbd52d64d609064a090f33b5bf85ac07c2019eaee010202013b6c352bb2ada2e5dbe4661697ff80a0678af24fda14cada154ad109d768a34502f1ba57b035dd4df1e3662e40725b987da53ee41685d6fde29cc4b342adc9b43efd6690cfa5860dedef1a4361a948e62504cde6d35ba2d5a49d758aa21ec1439e477e9424faf023dda2409af5aec88c2b99ef188836c7cc52ba3de648ab5b38515a91687abe5cbc924935d37f1407150cd2345a7b90f4f2e6af4e259950ee6a07676a7f2301b1c4df9ebf65ec7e7ad5133889599596d0595e355e213ea6e7bf67101aceae57912a7985c82d11e8475c5e4aac4c3f01d09cb25441a6adb32a478309590a6e8a47d3a1c16a3c61608f78e70e7b7dc2dc45af4983f1c94cccf2669dd08f98f5563319a15505053770e6f11298d706013bcf3c60e3c727feaf918fe988819a1a215ecaf25eecb1cfe29232477c21f97a611945678d33728766099f9a14ab62dd78cc888b346b0709f917598638607ca9305263612d850c308be4401402ec908f0454546af35427ec40a97580069739498b124c803d968a10f1b8a7afa46ab84ddeb2511df72a696ca1b55be0bd0ecd58ec06909711c7b5a46a28d5547ee7cf1daaffc286401a45201e09ad4cec8b8c0513b6d0f097de3e6358420431f80bba358630827fa5459c551b535731f80e59c2cde40c25e39b763f82009b4f293383d5ea81074fda72bbc32106e688a10450914041825764d7fe7f58f2e0081c24e56152e6e8e475250be06c6d984c32752011dbcc593b5fdffbfeeaf99c5022f40395dbe3bec2e11dc014c3c3a2311c13d063a2f0fbad1447b00f87c80490824da5260aa5c85ca450b745158e263cab2ce3196d4056012db99b102a3100c6a3f99e76a64bac0e628ae133b3aa59006bd2d43959391a90cdacc87ac62a02ee4288121dc11159330b63de8a333fc1d77968bb7faa4b0166a25258b4e4310767b7a0ae651928a396b91d6d7048fc6fc437a0ef7237ccd4d4e66b00dd59f29ab01b4c9373985b515a7d989d8d5c8afad9b9b72a3054e9f8e195ca45e01c234ecb5d4994779a860d15374497bdee5f84618095df991e2744ae8a492ae497b846f48d88e4b58ac7ab46dd8912832d97873e79925ef0151a2d5a415c4b0de7a664f6a342d0ee6b501e22044b6513ca105ee3ca45117bee4e33cb01d461e78ed9c4204f99127636cd27ad2995adfe6206925d63354a8ce1679490e0f7895f46a9384f28f8c4a9cea12b48b675492948cd1c96aa7a9bfd9cb71adf730b7d83b4d41c28781d44e55213cfca21db544ed4b01a96fa24c8bc80f16b34abd5dd1b6899832e75082d3261a560aef9aee4651f5a150498e30e4fa30acb318fe21e917892ff3621c4646ad88b2cfa491a410c4a19df7c6091657125e3f49297b7a29809c2f7812f1e64a04c27dc801b6248c043de9bd5094749de19cd6007d97af0837aa29414e5148890be1f44c0550d3c8259770c19462f8b426bc3daa66ec46d72955555e0daf4245bc289eb0c5213e4353d5014c141575761f954003e3d0381c8e60a9a3fbe47607feab92f4dc8c66a6edad89ef52645c7d3f5570a112f49ec6a26e92761f6242c5ff7634567ca4fc4754e64e5dc591501639fd3c03633e8a2c63ede1316ff31e4988257ef77ffbcdf7a1690f58f47c9c42d73bbde0e289a73074cea6149252022552b3fdb1f9229034ea5747a56744e6707b8d03ec9245596b9a45173a2e48c1e24a0e1c0a6c41201584a458099c7f64a85d894fd7c98d51e352810e725f2a163144a8d3750888740a5e9439186063ba8a88209cd34aa2f4e11e91e0eb79f4ddba3e334eb5128b6cc825536940f9114ab0de49509212767c01867d7b918bd325894adfa7fab8669db630a03f7f3ea91182dc083cee7c83b1e644a082ebb1ad0b8ce949f2a433e7986f08c20120b1651fdc53667b0d20fb9a07bd532eae5700d443a401ba89f34502ed9f5477b62a52c0c666ae6daa0a4c659fdca3d28aa184d1994b09d9ed5661c919d488dd708f5cb11803e6132da66803d121633adb0b90039cf3170e0b37e65862bfca93611503c61074734b1535dabe239326746a2902cd32a92a0ad1aa9dab303e5c74bb4b2713989cee1cdaca26c402c1c868eaa0249d7ad4af0d6795e3d3680d09b79dfae20410ca217cda3c1760ff686ac454c08548961c5996541617154f0b87333c72a254de1e097bb386516a314600e041c444a7699478e5b34b5385e3f226ae00461af8b234efbf4b22d1e89710095321397a22a98179e92936eb336ba64d1bd35f7f30d84d07f344595035b30978e9b6c9311cd1f7723ed5346591f1188be49540c62932a08be7228441999a9d7a9075efd56ce0034a8c000928ca8416f91dec4a7433f24562e75db5632be999334f2a6726b557845a773768d8c9b8495dcdd4e474c6913676198968f139478a3f7e4da5a1821e8d25c52de7dfb4358ab744c8e44ed8a2e70a3a749341c53b230937dfde8cade31f4db385b80239c1e65f29b74681c5d8f5e876f113aac87ddaeaf0da31c1ef83695c3253864d4d8329a37741aba91c3e8a664a83f0b7eaf34b87b879b1757469a62410d51059f44711276347a1c5a3c7c7678d2f3a75368ba8c0174a1f834c1dce04c7c4fb5455f438e008cc656046e1ce7ff5c44b86bb6ac6fb3438021ecfa34b8e70ae7718788987121100e52f5b6300cba7ae0f7e0aa7d9326479bd643658ffd181b0c1f01042f5029cdc15d051113fd001a253c10c78b3f10357907dc7407ce136c8ce71052a0370a826f2a24443da59a7a38c2807410f999029f05be30586edd3b7c76dcdb8cf23e5c88df94e1ef26c93f972c6cc04283f90b5cc8f3afe258b0f4f9c19d1791ae707eaf9df318fdbf526fa68cdb9756d9f0ff85c2b923ef549a5ec073d4ad22f2904404ec439f7fb5898e27ac347a2b0b1a1500eb7f6f5635118d18852ac24ebeb50868c9efa0ae0cc5d007a401778f2e11cc6877d98036bf02fec3dfaeb801338993300e53cdb670634730fc83c9e28b1e80f620745123475ea5a4252ff5d807aa8542fb0c6f03bdb04e8525d45e9e91a3ec93c55016a322d8a7f02e8aad2b2be3d708ddd5d779dd63b89385111d5d8367e74d0f44be72d9280c1cc985debc2eced4503d3f7878fcc9b1bd1904df9d9f7eea4bd11db68b4f84df69ec13e23c66896b206517b34ebb6a6faeb6aba287327fb50c167388ca8f4cbb17044f47e952efcd10cb1e9d56c017fc51dc959d88c5bd7fdaf374f10fc9dfa2b812aa11ff6a9280e32e91b4a558c522727a8faee1a7ed56d7f00d2debcbbd3d9f15524c4491ce740c818957da3f17700e6f4d2deb0a37628284503368c8ad4b4a753eae0a4d637eb130700519400d800ea3c0c686825aef012d8b8fd9c8ed0b896918621602d239a05e24b81cbf602b9d0fd0b50000d3c38c7af7b035c6b9d8b56f782f5957386eb766d713d478c5f23e3e2507444eb57a78817369d02eed898104002d7ab2bf811f05f0bf1ada8770030925b691310db3640f63a41718a91e4b5d5a811222daf022e668e0cf15b5f4c1f40f4a14d36c3c7a7cc897444652ea15844500d1bda8c6fdb8c9946f094d1a96906f6970711a21cd58598c5d391bbfa0da0d26207503a85844ef6c57bf8683cc2400b9cb0df71e41fcd2ee2263fe17adaa5ef808f106af4cbb2a01c25b09da9e166c64c1749a1a04edecb6ee4285d50607d1a546040e8f2671d9a63500dc6a8577bdae4e8dbb37371dd292589c2163477b47401eacbb169348e6f2f1d141bc0ca8d7d2aa6246e56a4949c6e45f2ea7a064eb745193fd209a9c2fa0f38a01437e719a862ad0dcf6e347ad359e0685f6c6f138a069fd5dcc685f5d50031d0f9607636e61910b61e9e17ddc846dcc89508ad55a9045e1b13b70a17097c4022216d2102e80c3c17b6772cdd19298762b73ebbade239b2146a8db532eaf6d378ff39acc89550a640a46bf1fc8d04f7105280a6858c3e9100aa50b2f32b205fda164ed2faa9613b8b34b6ac1f1fb26e684c67f17ab955bc686244bd6d2e4124e669db06470e9c2f1a9804ce35a3eb54d1b3137bad0f8cb6d1140f8c235c56955be911004ca25d810472a90df4b6d1d0cc026440b77f83d2da8f0a17e009b6286dfb5d3f32e22bbce92081572c018b5839740794c965b8586434577dd6b4ddb3b36c6a77ef30745dbad89608b3ffd70f06d442ec0da09164087dba36f038c2820d3e6088079a6821e09bbea05c14801a2e787160dd9db28b0e2414990c6affd7ad95ee64fda22f1e1c8d6134e2054b4a7956ac8d46f5bf2813e45ecba3690cc10991684333e92900dd4fc9aa2980a385e63174ff12f998cdb4b39dd3cd4a9aa56d61e93c5113eb3473ec4d9a4c3b55d865d770c1dc69a5b6a8810e91c955d32f3208a86098500cbeb1628c9a93aa33a9b4eb22af1f7e33e77822d73b0fc3059bf9ba5f0f0726fdc4f4b639dd30a748eb8ea9e93e55cc35969d6d4b6c70345c5d16588c8233799272522d2725a20f106f60950a3eac8fc60dacbbf0e0e270a38f44f1820697be78ff8630b20a7386fb94a5ea3c5d11a0cdb9b79a743bf6f7f7de689ce18a6eabc4cfdbc4062011cb263a198ad9f06dc8364a2997469db87f15c8814167893b3c7b649e7c27ec59825a18a57a6c71852b23968563e12e22de09ac620a5db2036cb0f2706a4b579c523cf402a5b41fba1bb72953e281c457604453293ea7001e1b9147763d2a8ec587c2563f7ffb65c8f217c7395b56d648a779bbd6170c0e9b99337bbecd9ac8a82ec1b880eb4b33a5ee01484550b3a2456a02715a5b77c2c3207c6c158a69c578a549a82c495e5aabd192f10566b7a9c85941d39c1c580a6883081eb744b320304d88213f5fe64b0012f0e665dd7d62d9be9c345334a2fa71305ce4e2964071a768b7506f17b670a94ece1ecdf2e17691168d6c3ac277e2347525738196b25356f602a42400e3682b33f497062515a4bf4fed6db51d3933d5f4643451866922918cb67fef684d5022948a3515f854ae1d8e0530e84e7f274041d60005b25faa0f7b9e6137c68ac301c8dd56771048f7a4ab331d60a333053a139c4e21eb48a94dbd80872461441c324a515d0e0fa6c52e5d70e7d7e1ff1bbf41ab3d5b778e0e8c355e323b6fcec0eef53063b366676e23a35971d3510999cd83d27721f01e6ad1bb7b26d37ab5f8826089200e8fbb587294f18deb220b75a1b437dc747e26912ec11934b95e1551ff8b22e060eac8c09ae15d0b4b6be9afc75dda0deaae5e190305338f758410ce49ad9b9b75787b61a42e5dc2cb6a147a351df04e35d38c992bf985dc1cb8e87808ad4e54012de7ba0d2a593f142807ca71dbd6c5706194d3be79c0c6c11e99a2190391dd1970c88e76ed7dba93a5913e8bee33e0b6b32af9ba6f62399a6649ab915e1d6381083dea087d142d8171496ca623808337a0e0ebde307554e19b96ec224d0e9fdbc74834bd0a4a5f8dd8d93582a7634660a9a11252200046da4066c5bd4298b9669ee185d029c790179a43fc08b2ee170beecb6d3f57b19ef4e9e14720867500f83ece013679e5bc5ed613b8cbbbc4d5c9664aa790984b227b2d8df330200f0cc0a16c167a0225d6e1c1bbf3623e19077a6fb8fd20941a0b9309196968477e8c9a12e6cdf7c8ab8498509b2e7baab63fa76c25c4a5cd06b5069e952157203c83654f51f5a2b2ad1a434ed5ba2842e875d78d06dc8f595d91cb28b81a0bdff4da939462c9e045f8e914be8d359d3eed869d42da1694bc64ca56acf6000486c8e844982ca2f8ef43139f6e93d76016772d40177d16d7c457651ae4ae45dd2cd16a30f8b8f2dbf30e942c9011d8a2ae5d2a2dcf237e24e84445b37dd8435f4eeca89af80e7f6c0386824180445586f6ec821d866ac93da463624e075f1772cec40b134eb44786f78a96fff28e09468c81594d4c71260676f3110589e879aa0731a888f3b14428a4d5422d63f4076c15a77c2862b420ab1fae43b6e5f0c2f831379bf3af7fe9748aac1842d262487139e3550d54e1801c63445ce6602a56b4998b828a0c49a5485a24d2fe624e86b88d66051cc1a01b960f1cbdbe3cfdb50290400132a07819de3ae92c500584fa09beff22efd3cc9f6d7db49e5516f0d70b15b4168441806c818284fa3b031d5c5251a70e21e28e4a6ab554bed883d617c2418cab0310a7e6aabe1ff60e9ef71c54cf7c51e99d4ebdd9b48744321d5d1bbaa2ed6e2f6de673a1d97bec65d8abc57b7a749727fb5fa28cdf46bc475dd2fcb79e907491f6b935b90eeae631bb3f9576722ca14b48b7be2ee3aeb1d7bed76e5e5ddd6fba1f5dde7441754de9fa55bacb8751de8913bab1ba82bb94d37b5e0c1d5cc7baf6d3ede5bc2a0b435a4e2bf2eeb0372daf015d36b5bbfc43963ac8d635dcade75d23bacbdf7895d9ab6e48dd1ababf5c776b650691c7e9c2d415ac4b52d74e177a5d64dd8abaca5d8d783dea8ab3dd42e87011d2eeddf4d6f476e9f5f0f2d405ed9aeaf5ddbde744cfe0f9583720d17dada1678d5974ebe93ed4fdd7fdd55d10bbaff990675408ede6f4727a7d7a817a35ebadfbeaafe2a66b9be1facc689bf8c930abca77684f8956c0b8e719c67893cbcf07acd96a53f5706355fe36225188880a23fa090a0983b42efd80622050158e645920a3a3e79efacc0535e24664cb277d86a2b1fef7660e7f141ad76eb950045eb3a80522ad1dc22b8ab5b73c6c58ac4cbf9b9b927bb5045957a867ff01ed2017181711feca5a8f8696be0879c9662ba0fd6f2b3215cbedb600ebce62638facd876494f9e84ed5107e8e6d857f580f4dda4797c5757f5cc8de220280f2e4dda454c90ad1cb649e5d9b0d7d09af97b2e89b99a867dbb64a904208b51fca950279fd0046d09cd38f5ee40d794bdca940b38025a5181532d6c071840baabd90215e000569667e851533f098d91226053424ecc8565812c46ba5997b570300abb2970f659d5a6d528fa2578736588e78d00ed9a2555573bf7ac19bae4736776cebb85ef1df6f67cccd87173c51671ffeb0b2a98163707103cb76c5f70a4a6f42e04897f5d591c2bfc5ede80097d1e43b30ee56f59ff5a4fcab15fdd6cd74f8927b0eea5398ef55fe7d3f44d6bd641fff3c20beecee4ec0903f129e187add46db60bbd1da525e3033eec967aabcf936b6c2e49fa8003dd1574f501219874cedb2632f573b05c430c4b21e2471ff5086a4e74c6934d3f9b8368e66a687fb288eca34891b8448e8e2cc1b5c8e438694800864e62d8bb3d1cdd1b9f2ee83b8a2798a4a75dae39b5d0fdb0f59b374aa7e72ff32137519b284623602b02a7755a09f82ee10b290d1be4ad3d814fa6db0ccc198eda902a1181439a20f48686f5f016d9334c4c375937569b7ffd5523c106436c2fd8c75bb943e57a0c54429001ab84a78230814c789c1732e94046e8c4c017a30399598114fa5581e2126808ea8e405601b80c6418e6bff97423c83457052f37c1effc7dacfedd74108147102fd5fa380bf3ed070668e82ba913204d78e6272d5ffab557d7347489406e20b7e00a411a0532ed422048bfc0af00a0b1a80be0815509bd41ba5ee0270aa55ec546810cbf0722e39a7fd5ffc005aea5af11c90288bc48f03209ebf526023c0f64b247505134a600e5d7a8e7194f18a3d485c363d1b58e491b807a3bfc3748fc143b25120b08c5999247fcef837a74fc149423b1c2485860e00632697ac8ab9eb3c1aa39f64b0b029001c102d902b6026481a4106432498381eb0f049169b06924441db2e7ec6b6ac12881c31a647cae7bb34108826c1f85c3707edc54d8f600ad48d08d505c0632f9a6f40035952023490215d22cd0eb60a01e373c18580c2ebb02610f4d0913f8410135124ab856bbd78c8f1a972a8155098d446776e00d44a7a92750511cb095f42fd205d9ab573352e50bd60dac46cdfbf659e1d2c7807d94fb0ef2360932c11d28838bc08f1235000187ab2ba806eaadba654f65ef868daa2029c195d1347b68a1c87aeaad0b028ab53b972f4074904207f003fc003fc00f20db0889adb5de499429c9f2a95e21e722534a29a59412c3d7751fce38df70a4d134079709030935092849abb65d984491a3fee424a6e2a73fd8564f1746d50dbd3b9fb4051d2acb8569cee2bca8a43f8ee75de8c00597d4c6926c49cadda2f0b4af6ab999afc3166693740853f7512dcc277ff20875afca26b409c0600436669420081f1011392cf01a20e03043072dba55adbba8662db216c654740a22f24255981db3308aee1953e2d9202965094420821a23344af0e8a4ea90c58c1a353c7410e2e181808e5898836753caf4336ad4400974c0c268723ed9548b5f613a59a7962b2a115718bba40e2f4abea9e9a81506b93f71fb16962459b3c268b296ebe8f419f1d32acc419930419892df249d9781d44e154e03e407346e38a02315954e6a54ad96f11e21353c6c9c19666a830e54e8f2d9a6b16919e3a5599f3f5e44ce969119a9e314a652f9920a6d4ba2b63264809c8083c314a610a679b2c80f35cbf9606b187494c220bedddc454cd0771529cc7ae55f41f4543d3474002272a330a6dc29b92d1fd5ea1685d94de9c99f243b140695a49473d4149d3a897fb0257a07288c2e6245895ad3232ffa602b9f30594a1f269dd88e12c4f484a99389df9315d64f8c3ed8d63a612eeba4dd7992d6a5241f6c8513a6b53bef52ea3927c71f6c3a3661ca3b2a558a73fdea8cd584c92efe255325ac8e124a5948d09109f3ff870902e19d0688475a0a3a30619244d733bdbea47b4c973069359ddb36276809e21f7458c224b99f08ed163b23229530a7493a8a50514c5aac3ed8da2861ba50a92f9ea75caaf5c1662be89884d154c7bc18714ad8820e49984e662f947685f3794522615272ca387d79623d27618384593fdd95595ee41e61d0caf124b784913dd20fb6e208636f9a6625a1a4dc973fd8ce4464d89801f27b35403c6c887434c29cbda2ab6ea92ff7920e4698edaea477d30f223b7e4de85884a9c4f1f867e1977c4c14613ad1392de82ceae78e44986cc484e9a65a07718208533a5954f81cb7435cf77176b9adab62a525cf8ea13f091ac27c27ae5fe5523a9e2d84693e9c924d90760721cc5616b4bd9f18b24feb1884c184ba98af5d259bccd621089312ba3a84b0a04018554b892245ff75923f40184b527be6268a8fdd3312aa20082724e4e81f0ab36929c7cd9c5bae5c8c396b3bfc6012dd52a85a1377f4c1e4256a46f498d09d8422aa821a78c4a0830f26f13e42cdc9792fe5eb83bb6f64c8888d8e3d98b34bc9b65e930439793d98af32cb3a85f3141ec22c74e421f5c935b4db1380c1086ac08083e30735424254d0810783ca89a73b18b6949ae06f723c39be7630db6a9f60a5e44fcb50471dd00c2b4bd72a97b36c2ce4f88f2a41caec4e07f3dde75d0e6929f44c47c4d1eb113ae6605e7d0df5bfe35e6b92834909ea5f64b8dd5f34fde360f44ee2cd3e880d07e3096af4fb83e90dc650928e39a69d6e2fd5e106d37d3c21f465bb0de64bef954ac5b4adc36c30fe8d09195f4b0d5f91d0b10663854b265a54e6684b01e149c0c10184ffe85083f9d6f32fc813e75d4f3ad2601a17bdcc4b9ec3554783712c8993cb44cb9a1b9dc1d42d26754bbcd196630683ca9757fff94cee313bca604a2f222da7920e3298540e65c9dc741a135f0d19cce81883297fe7fc8d0e3118467aa83269fd92d8274e4247180c3aad5ce5e9f99ca7c4c376091dde9c86cee9c4afbf600af1966eeef582f9c58210e7e9a4527717ae7ab313b7994dad98756fd17392439570c1a44dc53cb1e537efa28e2d984d7afb8fa6e374bdd81d5a30ed7d527ae6dd3fef25c4fd7cc8143ab280a990915dead21d583049a635cf4787c99620918e2b98326d2d3ea592d74e4ac60b38389a091d5630763895b3b37c324c4a47158c1754c5d7621d543029c9566684c7765653c714f28ef3ba9495d7935f171f1374523ba460cab1f4e7a81b2a5ce88882c953b0f6b8b5143aa060b279cf13f3781e9c196a19e8788271942499605234f931718269b404dd1e4c124ac95213cc3177fceeb3f466e799604e41899730af6309e6a09e942cda2525983a9cb8f87e9a76720a868e249884db074f7e695b4307124c723577e4ee925462551b388e619254924cad9cfc388c61b439658276ecb929f972068e6298b4f4092bb292fbe89318a6f333311fbd3bfe05710cc334b7a2ba392ac9deaa55814318a693175efc4d46048e60184c67c9057d9ae3b10103d31d3c484be62f4ce2e2d45ce9926f2ff4456ec9526d56854b8b7535f2b282f7961ca6ed854910f9568fa6b2534962c3c6c13b0e5e98cf3e872d41d8c6077b17297da5dd84fd521766f99225d989df0825cec59ae95ad1dbce62c75b5792df4f52427333345c98bce5c63ea5a758da988170057de6020e8e5b984ee85293db45877f12c400872d4c7262e1653f6ab8273fd86c80848c88c858ae85b18332d554911686cff6ea9372b8291316c72c4c26e7e027a87d979c9418b42cccd9a4a44b905ac99249e2e00003472c4c9296539694c8115a270fffdc12b4b980031606a54774897657c2c0f10a634813b30f0e5798cbedb35af34c5a61bbdaca96b6654b75cf3ccdeece25439f943870b0c23c6641fbd4662e5c3ee158857176f4a792649978b104324315264d0f4ad250f231482e70a4c2b4ed39c4ce84bac0810aa307cf3ed87c00e21882d2672f23b951c34b1a9ec224dc67c9ab25c94a6599c2ec1dbef2f7e875f1bc14c6b724e50b7d5143059b145bae2eabb4bb751d9e3da51c1e85d1475b4e59beb38e2a0a8385eb9653ff3842612e25fe277f89bb711d14a6ca72594cbcb44bd18280e313be8f4eda4c505d042e9880274c27b7569cf8160c383a61545d51d144ab50ed45e0820924270cfa4d7bd28fe979d2de84f16af446b343cb9e18248980b489c80019b9a109639d0927c73b7b763765c22cfb6796e34149e0c084a95285ef94175fc2f4a6cade74ee78be74b1c16109c3e79874262c8921c408a4122629dbaf99f820b231250c26464428256f1abf4dc2b4b26179b115d44d2a09d348936276e364ad9f6bc9038e48987a2c6c54ec29c9b40477c00109c359b0923fc1843c1765d4a891c8e07884415e520aa9e15102b6906f157038c224267928f996653fe97cb089fc071a39333c6680848c74c88848238c96529ef49dd6f296bc0c3818611e7195f7d361fa10bc8d20c0c0071c8b30474fea55d7ab83072545184b94a45b4f8e2311a68c7867a87aa8572f5372124ed7111019365ec08108639e24fa872d9d43986a4457f024491bc29c946423f3528927d7c85108e37bed5a901bba73bf1c84307a0c7593d5ef20cce339f24e0ce5f971148449a92027ad053d9167b22aa881c7e1088479d4847eccabd97ad00d191f62839b0310a6d8d9d3e7fc273d6a7d8c1c16e4c7c8b1914118b9e4f80356b1ec6a634cbd5bb37cac73107e69a2fe317258c0c1f13132c2c1a17e305f366972beae9bc5f203ac0a93f6492ac928413ebfa930bd68115969c162afa830d8a7480b699652509ec2a0e24f990a52f468690a83dcc53b154f5c44a530e5ae20eaba39290c361f74bcaaae52988cc21cd6a669aa4b4461f435dd925e234a6a4928cc967368adb1d4410a0a63c5d2f1e3efafcaf409835dda2755923c6192c4c4ce897fe9a64e182f48d1b024cf0983c79ccfeb1f59d9df84b9a468116abce25aaf09d3499fb9519e4c18f6b26e9c7c4225318409839e494ae91111a7722e61b293827a7ac5e7e558c2e4392a8ad2719ea25c09838a0aafcb2f254c6fb735df97c4f1741226f5f9fbbe939230a53f490811ad2261bedd5d4be13a90308993d352546d8ab6ce23cc335b7ada29b47a92234caf7b4932370b96fd469894f849a8934c18614e25c9b13bd48a5ece224c175774db3d5bd88b220c625e45ceec449872927e6f225dc562441877f4ca2cff9e68da4318845736c9f7358441e4986c117ee9e52c84494a55c1e5469f1426218c6d3909ba94386f826c10a67c26eaa912cca365451026d94356c6c711e656098439fb870061b6bffe2cffa46256fe80074f1955dd0fe6fa792b15b7b5d3ee83c92e8e0e9bd712223e984e3a0be1fe274c76f760d029087562c57ac57a305f8b1e1d6b1ecc2e7ad4f9a5783099ec15bff6bb8339c7495a449576305556f2ce72296bb93a183fc95972796c74481042c8f3cf5acfc1f84969a8d5fa3442d57230c9a8feea8dd697521ccc696d9f544576551c0e462f9d4bd408bdc130ef234225533d4ae406937dbc29b96b0f0fb5c17019fa3f8657149d840d2651c7732baf3598048f3e7b6aab4e76d4605092da2739c53b7785d3609273eace1f677f5e643498a4554ad94f9413d9f1198c9fcc44d39db1190ca7f38c302fd9affc32984ed465a98eb7e1276430783c75d24236bb4dc6603a7949145d256230e5d35af154faf76c87c1204b67f3e3c67ad082c15c2697d2299a4c4ba25f30765730c94b5e30ca999e57f4e4ffc92e18ed635fb7ecc5ff920b66bf4ae2762ab7600e7d1d4a27cfa99d168ca2738e995fa7f27559308a2ad9e7795b2c9884efe027bbed15cc2ba78458e8c5d69315cc41df8ba59baa6052ded9d3b253d03351c19caaa37988eea8ea4fc1d427e90bbd242779232918ece4caae2ec9841645c1dc37faf7f6de2a28818271ee5a4d499a6ae9f20483bafaebce75ae753bc19c3c44aa5eba09a6607f1f3d9f5bd033138c6a32c593bb4b30d78f4a09a61b694a2979b424985c2d0927f2c63d8a86048392d23e8eeef079bd631877cf4ae82842c6620ca3afa969db8a613e41cd7897f061b4a6c43088948f32ae0dc36c5eda73ca63e8662a0c734e1f2b6997eb9e4a83612a532a0973a6835e1230cc298791a7f3bf308d6c8c7a2f6194ecfb829d7dcffff47b613ae195f37249d0d6f3c218ab5aa12e8db9eabb30fdffeb29f9dd924e7461d86ded24654f2ecc23f37bdbcbc4380f2e4c2a9e3b4e7dd2fa975b18fc527c7f4ecac2a5d8c264e94185c9762d4c6a61f2c930a13e575a18d552f6f924ad5baeb33096bc54a7722a0b9370e287fd598a99672c8cff7ad2c68dde37818559c5da4d5d2e5f613893f2f44f922b18b968af1ea65698479aa5ed9c7e84fbac3097a68a7dc719b39c5518ce7e2df4e4ad68a20a93a47167b25352618e514f4a33541843c9d36bda97baa44f915222fc047db229cc39a6e9f025a514e6901e3474b2f029aea4305f92426d864661364918dd1f11da9e8ac2dca33b4ee8bc1439148651da4de78a7cba101486731925cf7d8a957cc22016432825c7d013a68bdbc104a5c24e184fce29e72f53c1c7424e98e3bd5cbabf8739a54d98d5e4fd88993ea9e49a30c82bdd75c29e09839fbd27956f553909268c71a5f774782e618a919febbea48f53b184397e99c99dfaab84f9bfe4fcaf4b09f39e64e296ba9c525027618e3f5acdd3f98f1825615215524f4c353bc945c298f2a9c4c95d694d3b481854904f9d5a2b9cccee1126d5f93d7ad6aaef758e30e82c3541da9b6c5e5d234cf9f49274ae7e57d531c2e426a7ff1599351b5a84b9b2945cea278a307c8ad7e9de245549893056aa4ef52375748a0883c9a57b74c58a501ec2a0a4943f076d6782aa18c29c93bd5ab6ba10a6de17b724ec57384b7ff1c38330d7985c2e72bfab654198f2a4104a4e6a5a9403613e91f1e649de2f95058429f8772595a42f53d23f982d4992a0e412f4c48ffac1bcf9bb21d45c929df6c124d42939db9412cc523e184f8af638a54a1247b907a3a9f423dea2be45d3f460ce4fb597d3cc83d96d47b6bec9fb56e2c16079754dafab787f7607934ecfad346d3da9991d0c3bea92f4252c8a685607835a4bb24952d492974407c3bb9fa0533acdc1242e49a1bfe29efe921ccc9adb41e9949224d57130557b9f54c2c16469fed2c28434417f83e164f9fc2eba1bcc7e552a4ec5d0d1416d30578d8e2174101b8c57733d622d073fd11a8c9f4b2853f293ba6851832997905d49fec84a953498b37db455caa2c19c4cea6798588207f70c86ef4a65a7543318e4fa49eb6b49977019cce9aa372cc5899592c1fcd94c6754f2b4dc8dc1a0c45f0c79366bb75589c1247f0c154d8979f5255961307dca5652f894625fcad7402f984281c1b836d23a97dcbf605dc6bbbd785ac8c5eaf86c51f289ac4982ffc1565e30499d8332fb924baeb5aa0be6926925593e8f6122545c48aaa7aff821ac2d187dc6e74eb9a985bdb2775da6c6abd7ebc5d3f569a9da56160c2346794ef9ce55410d3c6a5058306a48efe05a5fc154826acddeee18ff90154c67294ec6e560150cead57639c2945052904851c114dac376baf2d3693b3505c35eae79de393fd8a4600e1b65926c4af688b61f6c782021231905c3b5883a412e37c6836c302828982bcd9224c90a5a6e4e912718f54a3a4ff2f555e96bd47082b93dc6a68d58dca86e06d504c3253968cb6ef557ca144131c19cf27a4b92a4be874e9ba09690a4c52a2c2518c3ed7c734dbe888e6f25c1dce7a6e494d57bb70b09c66cebb174c24d10fa3e3b86495909fd1e5c94bc26c518265982bef0dd9e2d86717b33440cd3a9ecbadb6d7ec8304cc2e30459329e1fc46cc230ca49f15db9aea4124f1f6c3ed0609843094af283add3c88d326098e4fb13c424fffc5c930fb682444066e42f8ca162414bd6764b612e41872f4c62e1b405ab245b762fcc76268a67bf796198bdb45f8613afe3a81ecf56124901e2217d1684ec5bd73ed8fcef5806780793a4bc4a76bcdbb8bc201a37928709d00ee6b0aff77bb2223550d7c1b0196332342f1b403a982dcc7f4e594bbe2e3938076349fa4e89e19e1fb3837230d7971c95837e1de360f0a482d041ac2465c3c124a527a9f49c341584928d1a6f307792f44dc5995cd51c037483418f29a57298c90949aa65886d305b3ca9233f55de6ba0e7410d1fd0280107870818816c30aa992c39467e7efa6b0d66d39ef4a8c5a806b34793b55cb2c8fe5b300d064fdafddf4af2d1602a9db486e797eeec9c3318deabeae7e33efea56630088f23f65bff83924f1a60194cdadc73d6de3edd514206939ce3def3d7640ca69cf3c8d28ffd95223198fc3b89bde25fa353270c0659420a06a3b598b0a1bfc42f98dd84aa28fb9f7126e805c3c45ec3c552b06daf14b4546fb6dc74494bd205f3dcbbe9d91dd11d6711b151c3a3900b66ad68d5237fadde1d8d238305885b3076f05379f1839ed3e1c7a1164c999697fb3e6300b39055d66856cc5bbaac7026a79cdf4b59c482c9d34e094ab89c2b18be6409bae72dade2bf080216a040042e98809a26d00a7cb977785d6d886c85d1258daead94c42a2c77a544f9091da9603cf9ea94ec789eaf94e0140c4add892daae45c4b270d11d0484f402998c410b95ee27a2b58ea83cd460d8f432460140c3aacadb3cefbc14603a1602aebf58a71293f07133ec1d8714d977f3d22726494ed009d60fc142cdef67e12bd0f0ac22698ca2413cd32edb4ad432f036482410997bd8ff9f62f7a1f888c849c11912598367dafa42474b76cab1aa804a3f89f244c8c8b93ea43a3c68c1935108660124cea5795df7f1dd038211e6a238804e3a86579f224aaaeab814064bc40051c1cf908448688d9cb4812101a770c63a95c6277d06fd501a146e2c103746424e5658c243744560535f0a8c0196359ed12844a7e128262182fdd9e891a9d2742ec32561084238651de2c98ba4f0dc33c6362c9134bc7eca84e1826614de5557ad4b5985f304c96f2626aa2c5c1c1c131850386490e7d27c99b17edabe417c6fc53dbf9a2993b8dbb3ab116eff255d3f13b7e9e9ccdbb5e1876adde4b12345e183cfdbbdededc85712d49e275094a5d1894d29f4d10a57d827a2f1706d5d034b58f7f4a3e8b0b732c3ff1e27b720b83e7ac7897bee6399dd8c2942eeff5d80515cb502d38d178f9acbaa07a5bb93c7a4f0be3e7f50adb4fa5fe4274b859983edb28397d9770b230f889a6ae73f0b8658a85d1cf47ffc84fbb9d5f5898ce4407b7bbec15461bebca15a6f30da9a2f7d30ac42e2cca8ce5504b277a95b4b2fbb7362b0cb282ca13254fee746815d65636bb9b4ba3f19d756fe1ec842c13cfa20a838c097f429c1c97479c0ae3792a49e7d36e264e438559dcae4b924c7a8a4259123f5318ecb7cc47c7afc4b74b61ce65ee152f67cb49795214b5bb3aee2bd7a76dad658892b398d5a33075da553979432913af1385295dd8863eb19d47edd9830b85c153570afaea2bea754440e1ba5b8a5a49ad4f982fe9bf699fd21f4dda13065b3dbd2b4149272849d7097357b8a09fa4ead239bf5e384e18d46bc7b84ba10f3619c7ecdce881b94d98d2b7a5aa9cdb7388f35d5034613aadfde741492f13c6aaffa417ec04214a4988e1e038210f72983098a5d56c0f51f273b62f61f4b10f4afea44a091a42219c258c9f4227259c9c4feeb815e12a61f8b060a9c3dc892fdaad0a6ae06183a384a9848659c951547616651c25dc24cc2f4ac57512164a9c931cc249c26c52c5933f6ab288ae46b848942b5cca974ebcc141c2a04baf07a5fd5dcdef7b8441eb99de7aadf4f88f239284d59ff8a88db811e5fa12b9ee107b7b59cd3ce11a77a58212de3946982ddde52aed27d494d8224c9e54f80a72564ded451179892faac43bf3126152feaf972daf890afa21c2f425871357f62fa9b97708c355db7fceb69e214cdb77ba5784acfcd10049f60a61ec38d144b124e57ac9470873e6b789bf3519fbfe06612e3be526990ef5d3f69f208c26331fd5e402618e3ab25f8210f5b59d0e0e10a9a552b1512bfb0aed4e69f13c07d3ae87bc0e745043c62d10ee0f6ec8b9bff6d12b91c1f9c1fce147e4ca8c2cf1751f148bb714626e25df16d54a506a3c4e759658f1f8603c133de588aab894f3116e0fa63ad94ecb98d827057170e8800648c88888c78dd343fa29492d0b7342270f57b2bf92d5925f94c6e121edb157d24299279d34031b77874cc35a5ebbb3dae325b19e46bff4ea23221e36446670eee0ec603ab7ec7152086509ae0ee6ea4f82b613db5309277430aa7b8e65793ee751627330b7c94a9e2773474c2707f3f625f18adac5c1249ed2d5c1c1e849e9e93149c91b4c49861026ba17dd3de706838652fa96a349137f5d1bcef8545bb939ab4b66d244ad6851d7e4d860165929cec7d21a8c76764950693f4689abc1a4be453c76c54e17940663ef2549c9374283a99327c9c4efcae549ce603a25bdc74fd946891e3318e647c7d22e6530ec08919e7193c1d41a97b28dc1fc39aec991264a3ea518ccd7e361e6bc8292c63018cdb4fcdb6779972e81c1204dbb2f1844ebe44ef67bc1b027ac855c3bbfbb0b26a5d484e90b71c11cd482103b275b309d64668210134f44470b06b9962a3c56b260d0f9d35b5d8d05a3e737256cc65730fa5bba7072ba24955ac124447a6ead4fd258f2ab60ec92fa79a194b426f6543048b91735da340583b070c19485f2517a2918f6635ce7fb5130eaa8d86f224ab47728983ba885dc18f917fd09269d24bd52b932490e39c1e8490aed67254d304965951e6b4cae799860104ab4a52429f7a02f4b30a7a6aaf6f77c4a3089b85df83709a696d71a1d91f2be1e124c49990996963c865174cc536951725bd08d61b494214edbb675febc18c613f6c4b3b29c180635af1794cacfdaf961182f9a7af219cf345d18c633f5f3e8a76098ff656c642bc030a8feeb906f3a55aafcc214dae49c4bb6a074dabe30a8d0e14e16a1f2a8b917c68bd6a2836b658d14f1c2a4ca42dd785dca268a7661146149ed6249b2a514e9c26c99a7848b622ecce19df359958f38e1c2b4fde14d56ad3a93bb85592dd693203d4e3c6d618e596257b9a96ecd502d4cf5be7ae2b9cc2749b4302729c5ca836cd7d02c4ce13c78ee139dbd735998449ed83f268a85295b49f23142b030456dcf35695ea94a5e6110aad54a1631492eed0a63bf9eacdeba15464be993480baf92c40a838725f511b29d6f5e85b184d01f5a7c76b316d8ba80d905eeea22f0a103101a17280e5e0ea34001021084e402fe22228f6a84d858000046446eb8800001781d9c1b3aa0716420400022218f6e788d101b09880100020000000040000b00000000a080f71a342e20d2ef35683480012b0262e32c20008900808848c24100019c91e31c0508c019395e2384e300001800041210f21e0c0040001e708020d8e005828cf800c477812023323e448e87470252173666a05c24af3123152071615cf53c13363d086dd25b00e1cc4804485b1c206b812023211f22323c3c1290b430c5afe8a973bdb3307d2749127a61f2a7bd6561aa3e0b2ab7eccd95508d19337e06cff8199bb1c8aa64f9bb1cb38166fc8c9df1335013168906c88c54807c050d90198900e90a933039efe53fce2e5e6346fa1839337203d90a0419f11a336e7878242059617259339959b26398f083fbecc69987bf1040641c10f436448a8dd00041111a202332406e241e212dc8558cbcc88c9f61805485d798910890a94840383352011215083222e3c60c0f0f04e4294c996b623fc8c714e67eef20634adaf81db314064f5be2fdb32895a693a41885716c8ac2943a7b10f2f4e85bf364288c9e2dc8bbd7b7fe17144611622354e446e315e4274cd2579f9f245e8ff484493095bf53fc2a41cb101b40f84e9892bc8e4f52d65f7a13274cbda6b43de8b44f3a64426ec2e8a62b3c090fa6e2b7d4c4952aa558a92e7d651bcd36794866c258f964dc73ce0942942270c1041213e664b2c7eedb4a55335ec264f52727597c63d52a6909e3765ae94f59a98451fdc4932ecdfd9f7a29611c4fd13357ee244c954f98d60f3296ed9384e1d35c0a3e62dedeb48c44f2f5ae2297d6522be4b28dd07ba71adad9848439bfcfc4550ba33dc224687a16154a6bfae97070a4238c955f6ed1ac64bb20fe60f3b05163cf04d908f3a8df761125c60873caa8ee9ce453d7cf2fc2f4ab57823a71f74b5a146192f784caa23d904c8449ae54ce9ba1eb732d8c08539e7ac9a3a64b16cfa143983aa7e792f25677bc3b6908e30533adabb2562a540883ca1bdba5122184f94bdb9b0e2ad7c120cc7f5549befdb5fc1c09c270f2e93022fe48e3200361d6bea43b7a98db5c8e0e006170cb5b51a2a585ca655243860e3c465ea4d81f8c6392e82728a52ecc637e309ca04a92f298c925057d1fccf94f2a4916bdd926a7201f4c3a66265f540e22eb0f6a84e8600fe6dd3693c3789204bbfd834d0fa62ccb97041f59e447b4069907a3c55392924eec9c04b58c0fc183c984efb2587ba972971b7807b358e9854e2e27fd441a20891d4c1e4caf6ea7e8880f505a1d4c9220ed9467e9d7ce061d0c7736d25b3cb6ce723f0793a404d9498e92fb602b72304949dd79cebb566a486226838c8371b6f333c7a46839367e4424657088c68d942a483898f20815d3c193f20daaa8979c87a757fecfbd56da04991d0e0e37184bca33f7bf62b6e19465477f967daacc68241b4cd963625e0304366c9c909155410d3c6e906b3065c4c2dd67cc254ba5de56f24dd492d4e239483598d693f89877d134985d3cefa9ac9dd4c8190da60c75722c693c4b797f06c37a9c1394ecde0cc63329995c921cce949c530673573ce9697d2383612ffcd8889534f623442e30432167390663f52561f721db90111b2906d3e7effc24491eb530988338c94b54f23269a604832673c962ddad5adec5ed5a56944eda7112e4174c3254099e37cdf482c13bb848f5f4c92e98db243769bba28dff13a8a0061e2e482e98542c754bc7452fc73fd86cac6dc1a467ba3d94ec95fd93c8d91101c1d4827188c0059d055350c2633cde050ba6a454a509f369547f2eaf60b090a3f27cc765f52aad6036314ae6b3831ac82a982ca6c71331f53962ccc54052a1b94aa55ea72d6259ede5144ca17aefe24af61c264f2998af3ca5d352b28a783ca360ce3115fcb2bb75be100aa69caff760a97c82c9478967f1b2934e30951244454d5213d7441f6c2320890648c88708da07b209869393eeb3133da88f950e24138ceb2979c96df15c82179eabe7243d359e0f360fa3412ac1e8a59f6295ee83d13c904930894b7fba6e3a5b094a9e4622c1bc2545ff1e773fd8f818a61b517aa55f9d52461f6c42e8c17b84241e232033decc18e6fb64d9d1c35a9f30fee0699462a0426c8ab4301a0f6880bc203d80c43056ffc9e1243fdb123e1f6cc330d8a7cf262bba73e3000ac3a43fa4cbfb97efbafec1e6f13e001939323ea42e18d6ac59b433710fb54ad1732895a4e4e2df0829d6c030f8a8784e2a5b481715d1b8210210fcc2e47174cae7259ed2657c726478388d2f6f230830f819274404692f03847d61d269eb63ae27a47fb017869357c4ecaeafa8517961be8ba6d2a9b57117a6feb292e2093a8a757461182594b01667920bd3769f24fb4fb034b9425c187c2feba756d589ad6ec1c69bab5a0adfa51dd75ef25e50137eb0d53822201c1c323e3928e0e07819203666d4401c1c2c40c1a22d0ce22bf7c2dce42446570bc3d5c591abf849848ed1c29cfec4ec5de66fba6916e6184b4a897f0e29a69785399824a8fc21be047142b1306a7ce509164d4ed21f58184c5578b4e4c19368e32b4c9dd4ce6d4cec0a53692dc93636bcdeeeda56186dacc489134dada88f082b4c925ab14f4ae9e0a75d5c853989e96c71848926070668daa80a9368e6a2ae63d2dabfa9309992b257befc537e212acc16a746cfe675d78d33c0536061561d6fb39d366aa77da0298cfd5be779f6a4507e82a530b577f04b625ddf4ea79014e620c65198c3a5d47759944461300bf5ef24e93db92ca130697a0963a269e75853c9fdb48f50e169003ff103f44410b013e911a7656aefe43349c809c3b48285db8ba5ec953a4775f1e0260cdb167af5834c13c6ad784947e4a5f5e83013869d5382dcd88c983086502a7e5749f2323b9730ffecd58e7f32a5e7ab21a3aca025ccf296e3f2f9c70e0faa0496bf4af5c196dc10c112e880064872e3053b05a484d1eca4a9f211da4eca380993b0f8d1c46e64953c3ed0c899718792304d89956a374c3ed8426c00e13d641c1f7c62244c76af5fb515e4724148ce1ed1382322344a900609b369114ff3a21f7e1f3e42b170e9dd6d2e887a59c54fb2ffef9ca90374844168d7b21cd637c274c19364d7297950254698e452be2df33f96b4651186932d5b8a3028d3237af47789308baa8b735751829039228c95e4bcfc5582fcf2d0210cbab492fca8723f416c08a3aa0725cb4e8cebfd0a6174cfa1795a374218439ab60f2dd5208ecfda56595171d30ad71022ae65dcca4f4198468bd82dd11d1716d141c8f1b00b84c1646a494a673f893c68dc08f1a8e108085332d1d3abb5ac05ff60fc2d495e4ada154ae68a7e30e9132e9fe8174fa50941807d30f6de9d9ede356444d33c66dca071c807f3788f2511d332a2f4b80783b0b21cc6b41bf22325b002eac1246fa851f2a8fc1425f6c126e2a1c6031a373e46540598878951a8642c858342d27030168c44025130105236cb0100e312080020601c8ac502c2509ecab9aa071400037044263e3c242220180705428138200a06c3602028100604018140301004851e12b5466aec6dd202d642c7d1043a3303790457422b52b1483765c50ec603e390758149ef1a47ccd51a256ad7a2e30d23725ebd5c390a40dda5cabbb9717f88fa83d8b896bc0928eac4fa97dd102efab30dfb58fa3bded1b9d10e8546d76a118e1c7db2e8731f9f7d1d4d1ccaa4110e4e65f18d10bd829455e32ffae1b30f91a700bc1ca8a529d8343d6a8c7151890a723baa76852b405a0c5136421b3b0652fa88f6dfc192d60c7b43bffdebbab681df7f89f73aea123ce3b6576a6073f0fc6250e4f2cb84ccc00f8aced3ac643766987c360ba84482a1b0f5c1aa89f0bf35e10272e09a962168652212740c44ce96238fbd12658eda8941beef21a08cd2a481450f73a0818bc4417dd0255067cf95fa01007124cea80f88831e7652235a0a50afb1d7e731cf341e044ae71b71316280a05e5c349e3fa2d75c7f7a3f2d8db63885800b15fbad77d2f0671046049a64c10145aa098011d16299e65000abd35f9542496231ea457845d2a067cad9e46a030ccbbbb8ed374887fe5c083bd8fc8e6cc4ebccc5cb17862b9da243a72582a8118a599d8b36ba711a87d89898b4002a655995ca2be404f2a23bdf430e88093b2a0690be06977f38b56e30d0fab96c7ea6cc82c62cff16440f2171544c2d025c61f1925ad00fb72917faa9302493f43b14ee2a6f4e310a7bbcef9458daa0e7863a7c43752e0fe720907224f53870c716e0a3225ffb68efb1cd035717e80f26283493f19f6d3b39b8414abe59f047bc24ef9d6d088edc2de906c7843cdd04319a535bfd982e4459fd26ca2b9b1228e28e41497eeedbaf08a387f5a87a5e51bfa44cb2b9465972c196215d675b0f2e6260dcd11756f37f755e2c86b95d9a01d8102b782d16da29d22b8ae7b4e6f8883ad1f322e26fa57c80bcae8b747476d411b7adac62c233c2619ed943a4b876ea232ad1861471462392ef62494bf68e048d312d54568079b57794281c91f827e3c0a18f157c5b0e1c65d24a58a827e17c1a5378c930ffd84f3238cd837c11b905fcd88eb61f864b6079f339f45faddd987b29f6f8072eaaec4800ddb11689b7ecd78fb5204973113050a121e0fac233b40a106490989d6fff2515f0da8486682c5b705cf471df6279ec4965f206ca8896e32b9c34d589a659f18aa264672d106e0e19b5d3b1c66f6390c4519a8cd6d17f805b2f8677b6a7a8bb647356f9bf3effacac6914789ef01a39d5d775d634ec2c8921437e56501c775ea6f98e4ef902b0adf5ee88f9aa49c5f7010e6b16e6efebe134896b0c5d3c43afdfc09ae7f0588987216b055276cabb102522c103b7badfc9c42befd4e2deef1f42548e55c7de9985927e5a47be46ce1ddece4bd331a29b5a9d035deab7216ddc26c9261fe9920ea204740d41889a950cc5561d63b0070a4f8848e66172d69fb4f4a9ef5ad9a29ac9fb3ac05e14932e6ecae241ff586980da5d5d4a733f2f2a57d089ef538953137aa0883dbbd042f48f1de869728dcb57129f478199153eb1a7fd9760b4d585c6c808a537107d605516310bec2e7388d483190439d129e099ad6b04d5548a42ce1982aba0223972b107efb78e2568732db94ee9bee544b10f31adb6b1f9d8867460ac1bb5c450e40a5985c0c316ff80aa34138a361bfb291b466255a3210c72f296335e37c5073a314e7775f146eaf05ee224dc4393f28a7e8ca114448643bc0083899467574d3303e26854d5aa238a4786530804fb26961674882cf1a3f164063260b83eaa32e434b781cfd15f4a93c3bf8358b63dee87d00e9828574a92a5d539b45c37f24bd7a8c5d683da32b2f45e6859b6bca23221cb529d871ad042bda4cadf28ea4ba5bf07521e0cb0089868bbac1be6d46010ff54b331c81164211d7baa4711a898b9b49a27257f7e4017886c659e9aa19e4f9bc9bdda25c66d0fecde1dd224c7b9eab77faf1fc35dddf7aac41fb3b8102a30b9442c76cb10dd6b614bf1e3e692041d902e9b4e035a1d82665a484b778bd1bbebfb73897f9e8e0f23423eacc2d750314760364849fc49bfe1496c7f5671daec006a8f4b8305a75c00b937b20c78b4a94605cb0ae9324c8529847636b603f7ad512d5e02c681621a52f767082127b737acebb3b5b11fd93d8039027f1a47afda0ee071645304ce4bd77e458ee384159e6b5b587efef9df2066adc1e2932155486c8ab88e3a39f5616307c6ecaa44b573ebc61c2081d89d8428e997d17d016ef43d30b788b71182ab1e471588c1cced97288a4640029a6f51a74a070490db2c59403c751c0aafbe6102aa00dc361b6bdec27aee50f94a7be8695ece5ec5dcb98a80a8e18d4dd63c68bfd2bc9e14d42ff2ceefa39cef1e11084f0f1a99495a9d4c9f412748abb5e2fd1e0f45c9bd0608118b0a4460278b3723903530dd94d965419d70ee3a751e3e04a9e15008f8e51223fd921cd8a55f2ca5702231a0f64920d6b8679e79eb2c9ae29045d1bb37d4905abbafa59cbd9c5b197790ba6fce4a497be58a6a2f7a1cf12591b29226dfb22d392429adb9abc66b59f03ee64fd6d081af2197e63f971f24841804c03b129090293e14dc23bdf2f50bcd29f3e25e29e31f0b9ea46ef955319c7d788e140e97cca1ad466a0785adee2a000653f7b5b09b13463c8368dcefebbb4e761c2941bf36b6dc215e57731fd5c6633297dd722db240eacc4c98632c89e6a23d3e925db23fa3c0d4b176cd1cbc307bd7b22f6081302011e1eed53f45c63cd3d845e220701a9600d2670f78b802e9fc65c602827741b57fa7653382338de1e8f7d485d20a0bcc46f2472c9fa2bebf602c1e04ccc41210268a32699e42e3b906e50bcfba8837ca9235d17958ce868c2615f02ef8e811ae58cd7ddb196f550b521519713a543e5f8a62024e558258d37082aa6938d7e701d01b83d938945a8c84b4d1cd167b00ba7dd9edfe07c50e653f2844167133d42fd970dfacb889930514cc0581bc948ef89fcf0bd66b7968021791b468518ab65870c72a1ba2ce420d3bb897c5a55d275278d0fa7f67e638e742e83e872b2302b4b5f7bbe0a70d290cac1ac56c52d24fe589f3e1d3afcb49127ddae7004546bff062c62ca2dd8885450a3219cfd50fd84e4da6fe0fac56bcf6f9c6bcf64278b465a209adfed5c614a057ededcb7bff2c0088965aa85afcfc4d04273366da26af227c9971d84092bebdbffd14a074121d1ba617910216d1bf8edb6371c10b601340450413381867dc080cc733a50fffefebfafb7f80b51b00fdb7cdd170e0f13237e0679bac452723101dc83234b5bb1196f5165dc2aabc208994c186295fbf700b7d18e255965977a86f0eef1a2fca416265cdc114473f318f992231e0982fc26a1f35c3f8f7f5a43736b3dbddb3d1056673b6da7f83a3b609a38a86d8abb86a566bdda4413ffadaa1d6551aa6a0317812f3fc1c7769a3b8417da10e8a08cad44af99a7a8b45329702d65d234dc41b0d419d5e12c5abbb88b95e9f8161b439610ea18a474f62c40284c81380bcdf8c038a89ae78c34098f036c5047fa69d3dd1b878c53dfe695b5f8864d32d390a5d7ac2f38cb4d087e5984056ea6afcfa9ee0234576a10a784af94d92fdc6f56543da896a18e9d798f36a8506ea22f48f3eb5c22052a76de41527395f18b92e0b41ce1e4f41026061715a73fd0ec0eed3ffc31e1fc66525340bae443a40628a57f349ed51beda8ae2359c5f76249fe3f9f8429858fa18208315a9a298333d2380014232466f68e3d545191ccb7ab62e2a2984d5bc7ea28cf47c366a6218b6e0a8f67ec25ed86fb8b580b2cc49d5d9fa7647a0ad14fdb25e430260a5c28218c6e48745e3c70a16aacb1e4f074503a254cceb27b9cc0fe3cc191a1c72d1771522c51ec0a18d9cd7b6d9991028474346be9c31ccc2cf988bd23c0ee7c4cc1f4f6ab499061df36abf8824cd42b292014f9be97db9a9331eeef10ee40cc8561cfcbe8e4d364cf0cd954ff8d7ef613bb4be68fc195bc2ef2477dc962cc25551bb74b22d0477100727b0964eb70bbc1ac0baae647db86ddc9b4ab7cc4d0e12f150e764f73ab808b767bf438e3a5d42f9fa298dc7abaa9639303301689d189b64235f0eb415965d1ab3d466d6c6d1b07d4baf6075793f83dc77e41e28cfb80885827f8a506d32265c5918d036c3b23798a08f4b8268671e8435a73d7d9b09eaf040dba1459bb5d3375286baa334784e1864f848bcaeaca8607d2d18571c48938125c65eb8dfec2fd33904df9d443641eea5c250f71caddca2882c2824851a965b2751e525cef9efdddc11c54158d7dcf74f83f29fd681d17852d9d57f3948befa84fbec052cfb8109234973ca65d8d9e6bcef4f9854e5803b3aba0f2e8abad37568cc5464bde14ca3c5e76839ae278c151449cf0bb104080756b907292fe9ca1f72a631ad64e02e3066e31aa73d1b795b1c0ac4939a7314e94416dad496d5fb159fe49f9a1e5eb428c573b8aa35b47385f21441503d741872fd1730b2cbe066093f3d511c0dbe264f381361cb6f93e62da6e55c6445320de65a10040c8cfba98f908752c813f049a27450466a0517d21ce714b064cff6992cb05c330ad441f9b7862a904439ac5ecbc22b8e72375c6fe8d7c955391cdb338bff23904a681f7176fc53f05aaa07bf301b23ee5bbae34a9354369c25aafb7a39a7767509f09f5a364eb3ef5918d91ec179b9b594392f67a8fa435de527bc133ad6b489b2cc523252e7101ef287191f1f1b9854e4d2b16034c533418f616e6c3a96d426c1e246a90e70b8edb2bcd8e6e21fba0dbf250ba4d465dc788d6b750c00cbfba7e2477bf29fc19015786a729b9e3058c35d4a87b0236f7c74341f05766b4a6c51b7f990ce6736332bb7fa53b9e2882e5ee4ed3cdd0379cc9711b47fb751849d1f75f8bc1b060da4c1fadce78177c2f5c4daa6ff1c6d23eb9d9aa9b6e71369f96e243fb31702478756c77a7bebb81d6d48d478dcc6f9b44f43f9b8f29626f7d994b2fbfdb7c55d4f231dda56dcb0a04bfae52a949e6222815543d7c8a555e8241b5bb7173f9dadb2bf16c6d359273bda357b1ad603dc39140a0c02de290e0ab967f7d379854037bb712fee010c1b6e6b09d8e791fa9f9cb3bc5e60486070ab8986d4b3c480dde0e139601c63c3db6e80381975661f74cf32d8af7b38a2c15aa16710675ffa66547743fedadcdad5306fd14dd7813f249c0ecd44af802d327629e3f81be6b1e6010e004cf56a4faf4880a5e88267aa3a6143b4023ba0ed8f2d6bae6b3be370c09e5b89816926aa207db24e6c87cc073a506722c5a2d12d164a4fc0b025df68d9a52341d4142cf498c1505cbd386eea446a0dc7d8882e70b3adaac404fb45050d1eafc23d4576b21188fec0d7a55ccfc5c0b11104abb3bef167a6e10db4168d7bcd61d62c2df5106c33f57ce2cd51f9c26a0010e084986ec05be05b01c67d8e24fa75201be42b8ad29d07e5531891819b74cb2e78aa619632a0569c3b08210530dca661705a0b594a0f7b21cf172b7ae737aa68d87521b74265216d15274714d8592723b617e08ac5b7080ff010818583fa4619a6327d301130e484633028ec95fdb9c1e4906da575af185d373bdb36a85b4544b350418102531123f04398b8476dea4aa34d8c916dc5766f20dc60760d6fa2cd0aa41b9241ce69291ae44cb7ff4c2570c5b68a30001c1dd0fa442f211b1033453a6a1d3dde5b2298cc981ef9156de0659c54ab5fe378236de6c201e347b168210166de6508e669563220711a4702d104c0553efbb62bed3c724155ee6b7833365d579124d058ef11269c5f0f9eeee6ee19ed91bd1bd456d8ee55ef52f6673fc3bdc53f5d15d61e617c144c35d3752333791a4327592d30f0bb0da70f402e6e2790a3fbf842fdaf8da4b15611049a6b1f4a10f5446041f13edc03c0ffdb413a5ffde64d99e149fd68d044bc15b2c549f6ca4ebb5a80e1a4f9123eee4d989aaf079c113557af7f72a2af066bb5f58bb64e75792814005e2040221f6560e26ba7f67e8f86d98916a0442bc6a16464423454616b05976c11325b58510740ab5b4e222030173489cd49ebc29db438166d9a4dc29c8dd41a9c909833e22a67e56fdd3ea909ec3134f92edd68f6fa546e32e9803d93be02884671a1bea34854efde78ec6ecbc2487b5e2e6e48ab7731f0463cebb7bb9f6705b7651e911ab10027e22a19c9dfa324bf79f58f9550a965bda60f8fa030a6b25d7066f22df78ab82c01273d5ef08059ac93da83b522fc007601385e234f9207022f1bf4d96ca922b3d0fbf056b0aa5917e05a89962c79944fa505135c0339cb9c0a628096b65abb3fe79304a144fb142a8e0eddbbd63220c0f5420e1245927826e4124f7c2df0c75c9d6bc512680fb4bb91bdb0ef343ca5ff242152ab8f9c9d92af3b9913036e290d36d60ed53254d15ab979b5a2069914a0bc11fae5477c133419a3f144dd01704a3e7394026ec52d8f0dac21633949149988a4313cf04aa59ab45a70e03cbd269034fa25297cd3f4cf0185e94cf02cf8def2d91642c560bb061377f9ac56471eb2e908e0717acf103b1987701ba470dcba4c3147be0a26cc1915c99eefc75186ff1252abec10e15a52c67179ec0a4ba586ea31b0642303260191e6e2d1d19deda9d37e4cacde5ca9526068caaf02b6233613aa1d21b1473d9ce2e5d95ce5fae69681356248550d7eb45ce136b8028cbe1df541cad7953c25b197ed3adf32d3f9dd3442552f7767fc5c25f445c1a7ea7461007a2e3c30d76123307ac379982cd193ec6cb1d2a109ec509f0588a1b70a4fb0def95285a750f55987fd7460a90a46fc30c4dce33ff4b000f0e63bb1298c4681830dcdaf23c8a67db30e028f07db816a5ea9606b94f235838a5aed97c9fd322b9d37e887aa7596c4d79b6c5ef6715f28c44bbc4abfa191fed1d3e4527f0e0ca7865daba8858234f57140e3cb1e754f5c78370c587dff4c6e5d8f2418142ab553573f18979b05f95c489377cfa275a50118d20c6a33bcb519bb26b5e2c495b9a3a6749b6b4f921db042f860729ba77af44107b6a1d676c4a7c99b86565d489f1b302186761f4bbb386773373ad5839b53dc23655a6bb4d20cdce7d4dd7c0ab8e90211b3cc0cf6a2308ebfc83fc0c1e834d6dde20581862b576c5179b4ecb5f6a04a3f784bb73543a44b59408ebdc6a1ac8031710cf5c31171493c14ac4c3f9abb283cadb04a5adafc9bedd363e5fbeba67692caa69abe260c0d791cfa6d37e1055381dec62006db84d9f47421ef5e7268e5f2a85b3cded468531775db7d6c33763add8c7f2b89682527c30070e44b4d54102b476757c037d26d21613222918291bd762089bfe886d8172676723bd8c176f67a69663d59d06d2ca0babc54bcabf570a740b848f8987c959eed4a236bbc73ab7ca7138cd3962e80565749aff806cebe8bb2168c44b8d2d3c1c2c7fe26078956a5e887925ec48289f394a19ad789321abd6205972db2e6144671c9ad757a31db7fd97091db7e875762db7c01b601e4862242eea8ba4d980107701b795616499789361055ea7da88d4b1ff4c0455740b9cb2290e2d6c69268f7596bd5889b86f0b92823b0e43c4955236ef6f26c6dcd4adb9917de652216aa62b551a55af86dab96f4263fed1278db316990c2ffc914b2fe6f424254cfde29d37699582021d6708ff2ab76f21ed6a39b13054b6b3fa60e9ed2b681b050dd4b0af3efaa0ec45a912e549b4b682d289b1df507464d66ff2ba8f2e45e9d3bb6ec63c10fbd82dd9a6e49c945233587e82da87eaaee4490390263344fa1660982dc1959f12574ffde37845983cca07922fc0f75319ab217e664ebdc79b194e02ac958ab816519587e1acca4fecb0bd963aba110cc0a754e3b1413448113ce9cc9dec2b2c9880ab7fb3fc4098a8d445926786c6669651713894f8ba69b0698d636d372b785030a76773c2ba0a11dadacb9cc33f18f76e9134898c88705e007f12d45c3f696de4481a13c4486fcd568b47437371ceaeb5c3bbb211b4f9aaef4c1e3a0f96683ef45aec90f51bf23e2dc2dfb9ed2d2cb7fb80c7520b9dca4032174de30e58bc7f9d9eaf40e869664e87d170c6953c16d12b4758d79324d47c9c34f97aad2aae7eb61c798f9af34c2b96625e0536c5b0931fdceedec387b929fb164a0d5715f16f3d2de3bdd5f7d282223f65dc46e093632d9e08cedb10ed5d3554c263aecdea0540a43a5d83c29314bad4497d3e7f1c1edde729ec51d853d29c15977801fd36064ec15ac8fbbd59c7114f4dde54835c9ecedef3255a250cbbbbcc45151c92a692a04141c321052343bd200faea101ee8c72d9e605146904c45061c7a3acf1d34627048a871c6deba7dd1a8e9801162eb2b0540608481cb0e7bee262d2b89f93e462ce078802405eb63f2695d4edc9d3cd5c02a22b6c7bd95d37407b29e2a113da40679f1304aaa5ca92aec08acdc985f77f232a0b0f9de32c0fed3bb13b859e65913248b6bc2b71c186f5ac48375fd05bf7f45ceece8ca65b4ce327e75264d1d12486b1b6e709726058d8a0068a1107ac1e01a1b6cba60b1ca0054543059e9b5da1ba58686329ec3245355cf99e2d04e27d07f2446e8fab54a0ee41cd453004aae1b66c5d69e7a2a8a9f87dd546f7321d027a2c7aa358d0405fec0eb110622567ce455278607f05c1b032c04f3f1220deb220e2fd5f5552769bcde517a988ce1354fc0425935c8d220ea3c853bef1109994bebc66f2c26c29614bd832f0d890382d35814224e0c173d2e83b37cc3d8c8779e6a272c324ff5297d09e2f234b3f3c256219690a43d4c2d585a94460249e5c0c09d9448e457cdd9921bcef82f63ff8c0c8ca4b410345011c01f28db20a6d39865840299fa90757222b5f0da0331ec443241d43b115a342ef2a6c5c3395ee0b243d2bb52c3b9a82fda19439d382d48894b31eb3a24fa1cd85f42983a9c3dc992a52230a8d91e0e4badd33f5fe7471d01ba4b7ae89b7ee66e220b4288403e51640a34a984a3367834bb2ac8db6bce2341b144808087bf0cc3de51b9b0abb71f75d34f1b124c4a6b5b1c95897b20d828842804c2141cda623d4a2ca134e219d7dfd0f2754e25900a3dd8a30f1fdc87e27f58958cd7af7d8446a7fb3d96ade5e1bcb3f015de47e3d24db8508579347befe9324125afada274e2981d0358d5248a18122e124b615985a6c0eaeb99689270c2626c2868649c5ba7f6f17a0c7438e648f89d0cc57e7463b43a9262f489b0e650b9fa04306300b20632a90e1b6f4e3d69b3a4417cead386a6ad8bac776f04447afe5c4d6868fdaa95000ad5e1ba60af4460e710147baf586fb7a8816adfc98bd6d43932cd16b56e1d04d9d5d8bb032f57e89cca12d3cbf259ce0a8b4e00f8341494a94aeae4915a8f8bf7a202a3ca1291fc211451a6326810a12e25b1e4f9b2b41b44eac41bb016ac6c0d8c19cb8558052632c3892187a008f60b18d9471c356e8082187c6c16af703249cb6ada558ae264398b686694036bfd2e64d93506574dfac010bda8652fa7792b4a1032fa3b77e7db3e9a9a9d665b50ec1491e483b6b93959870cfb8b9a3e2c5d724ab616f69b970a425ac3aba6fe3677558506eae0262bc934d8a1ebde696c56230e5b55ba283e9c44c117a9e745f38e26cf98c39a435e1254db2813ed291394a19e866139934a3623652fc44808d60891689b3d2a35be87ad5ebd891bdf0c03d1bdf495c5604e5461b57736aa4b802a43d9b406ca00adcd9f337f13b8c64a7e58700aece3d08afe38918b9e9bacbcc02e67a94d16abba965ec0c53090747b6e93864c03897375fbb6ed9cce93bf84511dbab07a8cbd75abfdcadd7b0e099b19bf371dfd0a", - "0x3a65787472696e7369635f696e646578": "0x00000000", - "0x3a6772616e6470615f617574686f726974696573": "0x010888dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0ee0100000000000000d17c2d7823ebf260fd138f2d7e27d114c0145d968b5ff5006125f2414fadae690100000000000000", - "0x3db7a24cfdc9de785974746c14a99df94e7b9012096b41c4eb3aaf947f6ea429": "0x0300", - "0x3f1467a096bcd71a5b6a0c8155e20810308ce9615de0775a82f8a94dc3d285a1": "0x01", - "0x3f1467a096bcd71a5b6a0c8155e208103f2edf3bdf381debe331ab7446addfdc": "0x000064a7b3b6e00d0000000000000000", - "0x3f1467a096bcd71a5b6a0c8155e208104e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x426e15054d267946093858132eb537f105fe52c2045750c3c492ccdcf62e2b9c": "0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d", - "0x426e15054d267946093858132eb537f14e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x426e15054d267946093858132eb537f195999521c6c89cd80b677e53ce20f98c": "0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d", - "0x426e15054d267946093858132eb537f1a47a9ff5cd5bf4d848a80a0b1a947dc3": "0x00000000000000000000000000000000", - "0x426e15054d267946093858132eb537f1ba7fb8745735dc3be2a2c61a72c39e78": "0x181cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc208eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a4890b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27de659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e", - "0x426e15054d267946093858132eb537f1d0b4a3f7631f0c0e761898fe198211de": "0xe7030000", - "0x4342193e496fab7ec59d615ed0dc55304e7b9012096b41c4eb3aaf947f6ea429": "0x0900", - "0x4a83351006488ef6369cb758091f878c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x4ff3897794d496d78686afcfe760a1144e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x5c0d1176a568c1f92944340dbfed9e9c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x5c0d1176a568c1f92944340dbfed9e9c530ebca703c85910e7164cb7d1c9e47b": "0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d", - "0x5e8a19e3cd1b7c148b33880c479c02814e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x5f27b51b5ec208ee9cb25b55d8728243308ce9615de0775a82f8a94dc3d285a1": "0x01", - "0x5f27b51b5ec208ee9cb25b55d87282434e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x5f3e4907f716ac89b6347d15ececedca0b6a45321efae92aea15e0740ec7afe7": "0x00000000", - "0x5f3e4907f716ac89b6347d15ececedca138e71612491192d68deab7e6f563fe1": "0x02000000", - "0x5f3e4907f716ac89b6347d15ececedca28dccb559b95c40168a1b2696581b5a7": "0x00000000000000000000000000000000", - "0x5f3e4907f716ac89b6347d15ececedca308ce9615de0775a82f8a94dc3d285a1": "0x06", - "0x5f3e4907f716ac89b6347d15ececedca3ed14b45ed20d054f05e37e2542cfe700e5be00fbc2e15b5fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0x8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48", - "0x5f3e4907f716ac89b6347d15ececedca3ed14b45ed20d054f05e37e2542cfe70e535263148daaf49be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d", - "0x5f3e4907f716ac89b6347d15ececedca422adb579f1dbf4f3886c5cfa3bb8cc44f9aea1afa791265fae359272badc1cf8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48": "0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e13000064a7b3b6e00d13000064a7b3b6e00d0000", - "0x5f3e4907f716ac89b6347d15ececedca422adb579f1dbf4f3886c5cfa3bb8cc4de1e86a9a8c739864cf3cc5ec2bea59fd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d": "0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f13000064a7b3b6e00d13000064a7b3b6e00d0000", - "0x5f3e4907f716ac89b6347d15ececedca42982b9d6c7acc99faa9094c912372c2b4def25cfda6ef3a000000000e5be00fbc2e15b5fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0x13d4fe63a7b3b6e00d13d4fe63a7b3b6e00d00", - "0x5f3e4907f716ac89b6347d15ececedca42982b9d6c7acc99faa9094c912372c2b4def25cfda6ef3a00000000e535263148daaf49be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0x13d4fe63a7b3b6e00d13d4fe63a7b3b6e00d00", - "0x5f3e4907f716ac89b6347d15ececedca487df464e44a534ba6b0cbb32407b587": "0x0000000000", - "0x5f3e4907f716ac89b6347d15ececedca4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x5f3e4907f716ac89b6347d15ececedca5579297f4dfb9609e7e4c2ebab9ce40a": "0x00", - "0x5f3e4907f716ac89b6347d15ececedca666fdcbb473985b3ac933d13f4acff8d": "0x00000000000000000000000000000000", - "0x5f3e4907f716ac89b6347d15ececedca682db92dde20a10d96d00ff0e9e221c0b4def25cfda6ef3a000000000e5be00fbc2e15b5fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0x0000", - "0x5f3e4907f716ac89b6347d15ececedca682db92dde20a10d96d00ff0e9e221c0b4def25cfda6ef3a00000000e535263148daaf49be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0x0000", - "0x5f3e4907f716ac89b6347d15ececedca6ddc7809c6da9bb6093ee22e0fda4ba8": "0x02000000", - "0x5f3e4907f716ac89b6347d15ececedca88dcde934c658227ee1dfafcd6e169030e5be00fbc2e15b5fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0x0000", - "0x5f3e4907f716ac89b6347d15ececedca88dcde934c658227ee1dfafcd6e16903e535263148daaf49be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0x0000", - "0x5f3e4907f716ac89b6347d15ececedca8bde0a0ea8864605e3b68ed9cb2da01bb4def25cfda6ef3a000000000e5be00fbc2e15b5fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0x13d4fe63a7b3b6e00d13d4fe63a7b3b6e00d00", - "0x5f3e4907f716ac89b6347d15ececedca8bde0a0ea8864605e3b68ed9cb2da01bb4def25cfda6ef3a00000000e535263148daaf49be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0x13d4fe63a7b3b6e00d13d4fe63a7b3b6e00d00", - "0x5f3e4907f716ac89b6347d15ececedca9220e172bed316605f73f1ff7b4ade980e5be00fbc2e15b5fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0x00", - "0x5f3e4907f716ac89b6347d15ececedca9220e172bed316605f73f1ff7b4ade98e535263148daaf49be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0x00", - "0x5f3e4907f716ac89b6347d15ececedcaa141c4fe67c2d11f4a10c6aca7a79a04b4def25cfda6ef3a00000000": "0xa8fdc74e676dc11b0000000000000000", - "0x5f3e4907f716ac89b6347d15ececedcaad811cd65a470ddc5f1d628ff0550982b4def25cfda6ef3a00000000": "0x00000000", - "0x5f3e4907f716ac89b6347d15ececedcab49a2738eeb30896aacb8b3fb46471bd": "0x02000000", - "0x5f3e4907f716ac89b6347d15ececedcac0d39ff577af2cc6b67ac3641fa9c4e7": "0x01000000", - "0x5f3e4907f716ac89b6347d15ececedcac29a0310e1bb45d20cace77ccb62c97d": "0x00e1f505", - "0x5f3e4907f716ac89b6347d15ececedcaea07de2b8f010516dca3f7ef52f7ac5a": "0x040000000000000000", - "0x5f3e4907f716ac89b6347d15ececedcaed441ceb81326c56263efbb60c95c2e4": "0x00000000000000000000000000000000", - "0x5f3e4907f716ac89b6347d15ececedcaf7dad0317324aecae8744b87fc95f2f3": "0x00", - "0x5f9cc45b7a00c5899361e1c6099678dc4e7b9012096b41c4eb3aaf947f6ea429": "0x0400", - "0x5f9cc45b7a00c5899361e1c6099678dc8a2d09463effcc78a22d75b9cb87dffc": "0x0000000000000000", - "0x5f9cc45b7a00c5899361e1c6099678dcd47cb8f5328af743ddfb361e7180e7fcbb1bdbcacd6ac9340000000000000000": "0x00000000", - "0x6441fb391296410bd2f14381bb7494334e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x6786c4cec8d628b6598d7a70ace7acd44e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x682a59d51ab9e48a8c8cc418ff9708d24e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x6c63e84bfc5a0d62149aaab70897685c4ba24bcd9ac206424105f255ae95a355": "0xb104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x6c63e84bfc5a0d62149aaab70897685c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x7474449cca95dc5d0c00e71735a6d17d4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0x74dd702da46f77d7acf77f5a48d4af7d4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x74dd702da46f77d7acf77f5a48d4af7d62556a85fcb7c61b2c6c750924846b150e5be00fbc2e15b5fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e01be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f00b304f91831830500622780fd38770500", - "0x74dd702da46f77d7acf77f5a48d4af7d62556a85fcb7c61b2c6c750924846b15e535263148daaf49be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f0001fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860eb304f91831830500622780fd38770500", - "0x74dd702da46f77d7acf77f5a48d4af7d7a6dc62e324093ba1331bf49fdb2f24a": "0x02000000", - "0x74dd702da46f77d7acf77f5a48d4af7de5c03730c8f59f00941607850b6633d81fad1867486365c5b304f91831830500": "0x01be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f01fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e", - "0x7a6d38deaa01cb6e76ee69889f1696272be9a4e88368a2188d2b9100a9f3cd43": "0x00407a10f35a00000000000000000000", - "0x7a6d38deaa01cb6e76ee69889f16962730256ea2c545a3e5e3744665ffb2ed28": "0x00020000", - "0x7a6d38deaa01cb6e76ee69889f1696273f0d64e1907361c689834a9c1cb0fbe0": "0x20000000", - "0x7a6d38deaa01cb6e76ee69889f16962749d67997de33812a1cc37310f765b82e": "0x0080c6a47e8d03000000000000000000", - "0x7a6d38deaa01cb6e76ee69889f1696274e7b9012096b41c4eb3aaf947f6ea429": "0x0300", - "0x7a6d38deaa01cb6e76ee69889f169627ba93302f3b868c50785e6ade45c6a1d8": "0x10000000", - "0x7cda3cfa86b349fdafce4979b197118f4e7b9012096b41c4eb3aaf947f6ea429": "0x0400", - "0x7cda3cfa86b349fdafce4979b197118f71cd3068e6118bfb392b798317f63a8910c174c55fd2c633e659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e": "0x04e659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e000064a7b3b6e00d000000000000000000000000000000000000000000000000", - "0x7cda3cfa86b349fdafce4979b197118f71cd3068e6118bfb392b798317f63a893e73123ebcdee9161cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c": "0x041cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c000064a7b3b6e00d000000000000000000000000000000000000000000000000", - "0x7cda3cfa86b349fdafce4979b197118f71cd3068e6118bfb392b798317f63a894f58b588ac077bd5306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20": "0x04306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20000064a7b3b6e00d000000000000000000000000000000000000000000000000", - "0x7cda3cfa86b349fdafce4979b197118f71cd3068e6118bfb392b798317f63a89518366b5b1bc7c99d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d": "0x04d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d000064a7b3b6e00d000000000000000000000000000000000000000000000000", - "0x7cda3cfa86b349fdafce4979b197118f71cd3068e6118bfb392b798317f63a89a647e755c30521d38eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48": "0x048eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48000064a7b3b6e00d000000000000000000000000000000000000000000000000", - "0x7cda3cfa86b349fdafce4979b197118f71cd3068e6118bfb392b798317f63a89dd4e3f25f5378a6d90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22": "0x0490b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22000064a7b3b6e00d000000000000000000000000000000000000000000000000", - "0x7cda3cfa86b349fdafce4979b197118fba7fb8745735dc3be2a2c61a72c39e78": "0x181cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c000064a7b3b6e00d000000000000000000000000000000000000000000000000306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20000064a7b3b6e00d0000000000000000000000000000000000000000000000008eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48000064a7b3b6e00d00000000000000000000000000000000000000000000000090b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22000064a7b3b6e00d000000000000000000000000000000000000000000000000d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d000064a7b3b6e00d000000000000000000000000000000000000000000000000e659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e000064a7b3b6e00d000000000000000000000000000000000000000000000000", - "0x89d139e01a5eb2256f222e5fc5dbe6b34e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x913b40454eb582a66ab74c86f6137db94e7b9012096b41c4eb3aaf947f6ea429": "0x0400", - "0xa0eb495036d368196a2b6c51d9d788814e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xa2ce73642c549ae79c14f0a671cf45f94e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xa37f719efab16103103a0c8c2c784ce14e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xa42f90c8b47838c3a5332d85ee9aa5c34e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0xa8c65209d47ee80f56b0011e8fd91f504e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xaebd463ed9925c488c112434d61debc04e7b9012096b41c4eb3aaf947f6ea429": "0x0400", - "0xaebd463ed9925c488c112434d61debc0ba7fb8745735dc3be2a2c61a72c39e78": "0x18d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a4890b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20e659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e1cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c", - "0xbd2a529379475088d3e29a918cd478724e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xc2261276cc9d1f8598ea4b6a74b15c2f218f26c73add634897550b4003b26bc632a5935f6edc617ae178fef9eb1e211fbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0x047374616b696e6720000064a7b3b6e00d000000000000000002", - "0xc2261276cc9d1f8598ea4b6a74b15c2f218f26c73add634897550b4003b26bc66f2e33376834a63c86a195bcf685aebbfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0x047374616b696e6720000064a7b3b6e00d000000000000000002", - "0xc2261276cc9d1f8598ea4b6a74b15c2f308ce9615de0775a82f8a94dc3d285a1": "0x01", - "0xc2261276cc9d1f8598ea4b6a74b15c2f4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x0040fa7f398074858a02000000000000", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb30e5be00fbc2e15b5fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0xd17c2d7823ebf260fd138f2d7e27d114c0145d968b5ff5006125f2414fadae698eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3e535263148daaf49be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0x88dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0eed43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d", - "0xcec5070d609dd3497f72bde07fc96ba04e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19500e3a507571a62417696d6f6e808eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48": "0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19505905fe216cc5924c6772616e80d17c2d7823ebf260fd138f2d7e27d114c0145d968b5ff5006125f2414fadae69": "0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195066b8d48da86b869b6261626580d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d": "0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509d4a4cfe1c2ef0b961756469808eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48": "0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950c9b0c13125732d276175646980d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d": "0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950d62c40514b41f31962616265808eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48": "0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950ed43a85541921049696d6f6e80d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d": "0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950f5537bdb2a1f626b6772616e8088dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0ee": "0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f", - "0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903": "0x08be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25ffe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e", - "0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x08be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f88dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0eed43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860ed17c2d7823ebf260fd138f2d7e27d114c0145d968b5ff5006125f2414fadae698eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48", - "0xd57bce545fb382c34570e5dfbf338f5e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xd5c41b52a371aa36c9254ce34324f2a54e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xd5e1a2fa16732ce6906189438c0a82c64e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xd8f314b7f4e6b095f0f8ee4656a448254e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0xed25f63942de25ac5253ba64b5eb64d14e7b9012096b41c4eb3aaf947f6ea429": "0x0400", - "0xed25f63942de25ac5253ba64b5eb64d1ba7fb8745735dc3be2a2c61a72c39e78": "0x18d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a4890b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20e659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e1cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c", - "0xede8e4fdc3c8b556f0ce2f77fc2575e34e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0xedfb05b766f199ce00df85317e33050e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xf0c365c3cf59d671eb72da0e7a4113c44e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xf2794c22e353e9a839f12faab03a911b4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0xf2794c22e353e9a839f12faab03a911b7f17cdfbfa73331856cca0acddd7842e": "0x00000000", - "0xf2794c22e353e9a839f12faab03a911bbdcb0c5143a8617ed38ae3810dd45bc6": "0x00000000", - "0xf2794c22e353e9a839f12faab03a911be2f6cb0456905c189bcb0458f9440f13": "0x00000000", - "0xf5a4963e4efb097983d7a693b0c1ee454e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0xfbc9f53700f75f681f234e70fb7241eb4e7b9012096b41c4eb3aaf947f6ea429": "0x0000" - }, - "childrenDefault": {} - } - } -} \ No newline at end of file diff --git a/substrate/zombienet/0002-validators-warp-sync/chain-spec.json b/substrate/zombienet/0002-validators-warp-sync/chain-spec.json new file mode 120000 index 00000000000..a7964c0cf14 --- /dev/null +++ b/substrate/zombienet/0002-validators-warp-sync/chain-spec.json @@ -0,0 +1 @@ +../0001-basic-warp-sync/chain-spec.json \ No newline at end of file diff --git a/substrate/zombienet/0002-validators-warp-sync/test-validators-warp-sync.toml b/substrate/zombienet/0002-validators-warp-sync/test-validators-warp-sync.toml index 12951575f4a..e388af7c94f 100644 --- a/substrate/zombienet/0002-validators-warp-sync/test-validators-warp-sync.toml +++ b/substrate/zombienet/0002-validators-warp-sync/test-validators-warp-sync.toml @@ -5,7 +5,7 @@ enable_tracing = false default_image = "{{ZOMBIENET_INTEGRATION_TEST_IMAGE}}" default_command = "substrate" -chain = "gen-db" +chain = "local" chain_spec_path = "chain-spec.json" [[relaychain.nodes]] @@ -18,18 +18,18 @@ chain_spec_path = "chain-spec.json" validator = true args = ["--sync warp"] - #we need at least 3 nodes for warp sync + # we need at least 3 nodes for warp sync [[relaychain.nodes]] name = "charlie" validator = false - db_snapshot="https://storage.googleapis.com/zombienet-db-snaps/substrate/0001-basic-warp-sync/chains-a233bbacff650aac6bcb56b4e4ef7db7dc143cfb.tgz" + db_snapshot="{{DB_SNAPSHOT}}" [[relaychain.nodes]] name = "dave" validator = false - db_snapshot="https://storage.googleapis.com/zombienet-db-snaps/substrate/0001-basic-warp-sync/chains-a233bbacff650aac6bcb56b4e4ef7db7dc143cfb.tgz" + db_snapshot="{{DB_SNAPSHOT}}" [[relaychain.nodes]] name = "eve" validator = false - db_snapshot="https://storage.googleapis.com/zombienet-db-snaps/substrate/0001-basic-warp-sync/chains-a233bbacff650aac6bcb56b4e4ef7db7dc143cfb.tgz" + db_snapshot="{{DB_SNAPSHOT}}" diff --git a/substrate/zombienet/0002-validators-warp-sync/test-validators-warp-sync.zndsl b/substrate/zombienet/0002-validators-warp-sync/test-validators-warp-sync.zndsl index 05c458fbf4b..3977eb6788a 100644 --- a/substrate/zombienet/0002-validators-warp-sync/test-validators-warp-sync.zndsl +++ b/substrate/zombienet/0002-validators-warp-sync/test-validators-warp-sync.zndsl @@ -14,24 +14,23 @@ charlie: reports peers count is at least 4 within 60 seconds dave: reports peers count is at least 4 within 60 seconds eve: reports peers count is at least 4 within 60 seconds -# db snapshot has 12133 blocks -charlie: reports block height is at least 12133 within 60 seconds -dave: reports block height is at least 12133 within 60 seconds -eve: reports block height is at least 12133 within 60 seconds +# db snapshot has {{DB_BLOCK_HEIGHT}} blocks +charlie: reports block height is at least {{DB_BLOCK_HEIGHT}} within 60 seconds +dave: reports block height is at least {{DB_BLOCK_HEIGHT}} within 60 seconds +eve: reports block height is at least {{DB_BLOCK_HEIGHT}} within 60 seconds alice: log line matches "Warp sync is complete" within 60 seconds bob: log line matches "Warp sync is complete" within 60 seconds -# workaround for: https://github.com/paritytech/zombienet/issues/580 -alice: count of log lines containing "Block history download is complete" is 1 within 60 seconds -bob: count of log lines containing "Block history download is complete" is 1 within 60 seconds +alice: log line matches "Block history download is complete" within 120 seconds +bob: log line matches "Block history download is complete" within 120 seconds -alice: reports block height is at least 12133 within 10 seconds -bob: reports block height is at least 12133 within 10 seconds +alice: reports block height is at least {{DB_BLOCK_HEIGHT}} within 10 seconds +bob: reports block height is at least {{DB_BLOCK_HEIGHT}} within 10 seconds alice: count of log lines containing "error" is 0 within 10 seconds bob: count of log lines containing "verification failed" is 0 within 10 seconds -# new block were built -alice: reports block height is at least 12136 within 90 seconds -bob: reports block height is at least 12136 within 90 seconds +# new blocks were built +alice: reports block height is greater than {{DB_BLOCK_HEIGHT}} within 90 seconds +bob: reports block height is greater than {{DB_BLOCK_HEIGHT}} within 90 seconds diff --git a/substrate/zombienet/0003-block-building-warp-sync/chain-spec.json b/substrate/zombienet/0003-block-building-warp-sync/chain-spec.json deleted file mode 100644 index 8c09e7c7b03..00000000000 --- a/substrate/zombienet/0003-block-building-warp-sync/chain-spec.json +++ /dev/null @@ -1,192 +0,0 @@ -{ - "name": "Local Testnet", - "id": "local_testnet", - "chainType": "Local", - "bootNodes": [ - "/ip4/127.0.0.1/tcp/30333/p2p/12D3KooWFvMbTsNZ8peGS8dbnRvNDBspstupzwYC9NVwbzGCLtDt" - ], - "telemetryEndpoints": null, - "protocolId": null, - "properties": null, - "forkBlocks": null, - "badBlocks": null, - "lightSyncState": null, - "codeSubstitutes": {}, - "genesis": { - "raw": { - "top": { - "0x074b65e262fcd5bd9c785caf7f42e00a4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x0e7b504e5df47062be129a8958a7a1271689c014e0a5b9a8ca8aafdff753c41c": "0xe8030000000000000000000000000000", - "0x0e7b504e5df47062be129a8958a7a1274e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x0e7b504e5df47062be129a8958a7a127ecf0c2087a354172a7b5a9a7735fe2ff": "0xc0890100", - "0x0e7b504e5df47062be129a8958a7a127fb88d072992a4a52ce055d9181748f1f": "0x0a000000000000000000000000000000", - "0x0f6738a0ee80c8e74cd2c7417c1e25564e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x1809d78346727a0ef58c0fa03bafa3234e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x1a736d37504c2e3fb73dad160c55b2914e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x1cb6f36e027abb2091cfb5110ab5087f4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x1cb6f36e027abb2091cfb5110ab5087f5e0621c4869aa60c02be9adcc98a0d1d": "0x08d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d01000000000000008eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a480100000000000000", - "0x1cb6f36e027abb2091cfb5110ab5087f66e8f035c8adbe7f1547b43c51e6f8a4": "0x00000000", - "0x1cb6f36e027abb2091cfb5110ab5087faacf00b9b41fda7a9268821c2a2b3e4c": "0x08d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d01000000000000008eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a480100000000000000", - "0x1cb6f36e027abb2091cfb5110ab5087fdc6b171b77304263c292cc3ea5ed31ef": "0x0100000000000000040000000000000001", - "0x2099d7f109d6e535fb000bba623fd4404c014e6bf8b8c2c011e7290b85696bb3": "0x08d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48", - "0x2099d7f109d6e535fb000bba623fd4404e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x2099d7f109d6e535fb000bba623fd4409f99a2ce711f3a31b2fc05604c93f179": "0x08d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48", - "0x267ada16405529c2f7ef2727d71edbde4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef734abf5cb34d6244378cddbf18e849d96": "0x00000000071c0d84db3a00", - "0x26aa394eea5630e07c48ae0c9558cef74e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x26aa394eea5630e07c48ae0c9558cef75684a022a34dd8bfa2baaf44f172b710": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef78a42f33323cb5ced3b44dd825fda9fcc": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7a44704b568d21667356a5a050c118746b4def25cfda6ef3a00000000": "0x4545454545454545454545454545454545454545454545454545454545454545", - "0x26aa394eea5630e07c48ae0c9558cef7a7fd6c28836b9a28522dc924110cf439": "0x01", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9007cbc1270b5b091758f9c42f5915b3e8ac59e11963af19174d0b94d5d78041c233f55d2e19324665bafdfb62925af2d": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da923a05cabf6d3bde7ca3ef0d11596b5611cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da932a5935f6edc617ae178fef9eb1e211fbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0x000000000300000001000000000000000000a0dec5adc935360000000000000000000000000000000000000000000000000064a7b3b6e00d0000000000000000000064a7b3b6e00d0000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da94f9aea1afa791265fae359272badc1cf8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da95ecffd7b6c0f78751baa9d281e0bfa3a6d6f646c70792f74727372790000000000000000000000000000000000000000": "0x0000000000000000010000000000000000407a10f35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da96f2e33376834a63c86a195bcf685aebbfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0x000000000300000001000000000000000000a0dec5adc935360000000000000000000000000000000000000000000000000064a7b3b6e00d0000000000000000000064a7b3b6e00d0000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da98578796c363c105114787203e4d93ca6101191192fc877c24d725b337120fa3edc63d227bbc92705db1e2cb65f56981a": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b0edae20838083f2cde1c4080db8cf8090b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9b321d16960ce1d9190b61e2421cc60131e07379407fecc4b89eb7dbd287c2c781cfb1907a96947a3eb18e4f8e7198625": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9de1e86a9a8c739864cf3cc5ec2bea59fd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9e5e802737cce3a54b0bc9e3d3e6be26e306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9edeaa42c2163f68084a988529a0e2ec5e659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f3f619a1c2956443880db9cc9a13d058e860f1b1c7227f7c22602f53f15af80747814dffd839719731ee3bba6edc126c": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x3104106e6f6465", - "0x2aeddc77fe58c98d50bd37f1b90840f94e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x2b06af9719ac64d755623cda8ddd9b944e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x2b06af9719ac64d755623cda8ddd9b949f99a2ce711f3a31b2fc05604c93f179": "0x08d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48", - "0x2c5de123c468aef7f3ac2ab3a76f87ce4e7b9012096b41c4eb3aaf947f6ea429": "0x0400", - "0x2f85f1e1378cb2d7b83adbaf0b5869c24e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0x2f85f1e1378cb2d7b83adbaf0b5869c298ef7dc060436e4ed803af07632b89b65153cb1f00942ff401000000": "0x601de9615313b00e8cea3ef84e79e50b2fb70e2c8a47cff478b9fe8b3fa8f2db02000000", - "0x2f85f1e1378cb2d7b83adbaf0b5869c298ef7dc060436e4ed803af07632b89b6b4def25cfda6ef3a00000000": "0x601de9615313b00e8cea3ef84e79e50b2fb70e2c8a47cff478b9fe8b3fa8f2db02000000", - "0x2f85f1e1378cb2d7b83adbaf0b5869c2ff3ae12770bea2e48d9bde7385e7a25f": "0x0000000002000000", - "0x3a2d6c9353500637d8f8e3e0fa0bb1c54e7b9012096b41c4eb3aaf947f6ea429": "0x0400", - "0x3a2d6c9353500637d8f8e3e0fa0bb1c5ba7fb8745735dc3be2a2c61a72c39e78": "0x00", - "0x3a636f6465": "0x52bc537646db8e0528b52ffd0058dc2705bea5c66d15541040ac6c3ae971bcf5f1040221a8d1f8b7c17e61bf21cce87411480b10bd8daa5e3c2b65f8c4aa364e5a8ddf27c0313827d06a2d6334e074db9ca7d876ac8d052862b9984530f4d340bda4edddd6e4de5ba624536717e1139e14df2d875c7f7086dc3fa3d398b64f50fffc58fbf4fb73ffb0d39cc2b86761cfe6d3073b9c1fcee7fe611b7f4875f9a7d8cfe208fdf493f4d3b07d9a73ad05c8cf39e5c4dde679c3c8391b9ceec4fd78c824d218e4cfb79cb8be9cb301eace3b7f8a274c182edb72e2e83349855e7e4a2a795d7e27998b94f46d92b42eb543afcbcf5f5c9e5bf2d52dfd9b2f93dc33262710e3fc79b943e09fe2d00f8dd7edc4350b92a692a2facb7adddffddd3d89e9babb7b8e0b9d61050b2b4ddf3efdfdb3f629e9edfe9c18c4f8715bebf42d6f6e3ff74be1b9c0c8b9187cb89c83618e5bce6ebf90cb3918729745244063391ee9710cdb87bfbbbffc6047f275725e904518e7f53cec48efa788c4bd67d104a4eb81534cd2bd67cbeebb075b4c32deee59a43da30fd2d0c979410f3db2fb2972cfcad89d0f822c7ab644bade3b59d6eeddc9925eef8f34e8645980eb0fb2f8d9b2cafddec99273d7bf234bee5995292c3051e1fa97dcb31285eb5f76255cff23de917c3f72c8afaeaeac6ef74e96462e7d70864ed2ef48be2c9ef05d8f1cfa6e67cb79dd0ecdabababab5b225d7f4a72cfa6a53d9bcf739903246f521840fe916b813c65e41c0c50b7b60fe76078bafc61ff4c1bbfac7d3887b3bafc37979f73580490ef389f9f5920c8edc3f3cee7075fdc3e4cdba79f1f9c200db97df896f532c31e008355cff83a7dff7e1791b4e5097b400cb89ef19def24533b4524b567fe2c96c02292fe233d5900f2edfed96d8f34d29c2680f3270934e67054b7a4b7bfceaf95fd879b568e777e395e3aa7139fded3ff484f77779fef3ebbbfdeb6364afae9f74c32bf6dd9ef3de714c839e5df7e908f8c208b30f2fbb388847f8a2354c1e170305cb6dcb3b2de7eb0436e9ff9edc33deb3fd24ed29ef50f602cc7dbfda0ac7df8f683331cdba73fd63efefdb2f699b79f45244e492a38b708a9def9f54e6ba3643efdf9d41acdeb964524d396f3ce3fd247fa2f7380e4736a01f2e59c72bcfd606d9fb266c81ce3fc32bc0d3a198071be3f3f8b27cc0f725b7bc6cf3d2be99da45f916a7e3f38c349d21b7211a2597587be4b05e6ceef17b908d1c4dd21112e95f0ceef777111a289bb43225c2ade9ddfffe2224413778744b8f3fb594c4271b83bff48831d3217995ffa73cff86bfb94f3faf3834ed69ef11719fdf9592481f68cdf6ded19ff91063b9c64df908b10cddca5e2ddf9fd2217219ab83b24c29ddf3fc51346dc9d1fb60fdf7e16934cdc9d7fa48ff4913ed24c72cff839a76dd0789903a49e5d06c80dcee7f629f9a7e59ef1f323cd2903720ee774f91b22454f610414ad21610c79c190160c991a32c6102286c0604808865831440c2057860431c469881042da10f28221370c9961881742e6186245881c426630248b1035848421248e214d42de18b224644a081b42bc08a11212032164081943081842d6102203212e102286902e84782184cb902d845821a44ac8154248304520a449080d3d36e8a9ea99a3478e9e387ad4e8f1d233464f0c7a723d5b7aace849414f153d24e839a247aa678b1e287a9ee889ea71a207891e237a44d053821ea89e247a94e81941cf0a7a5ad0c3821d11f448d1d3448f163c3af070a046c68e1a3b69eca0b173c68e193b65ecc060478c9d17ec84b103c64e979d2f76bcd8e982878947069e251e259e241e2b3c31f0c0c083dbb9dab963c78e9d3776e0d891c1ce971d2e3b2ed8e162678b9da99d1becd86087063b74ecccb133831d3976e2d8a963c76aa7063c1be0b9b293c50e163b2cd859c18e0a76a476aed8b162a78a9da89d12ec3cb143821d26768cd82962c769e7879d1b767cd80162c7033b42ec7460070440ec0072c70e13901b00b9da69dab101481640ba00f102880b807001b20490278094000813407e000204902cb51acc20a61390a51a0d80c850fb52bba376558ba3660710a5da1c409280e06a5635388058a9cda026478d8e9a1bb5aada1b35366a30a86d51aba236454d899a096a4c0059a386a546430d57b3528361e76987089d2f74dcd0a9d25943270d1d2a1d18e88ca123860e1b3a73e880a123874e0c74e0d02943270c9d3674ccd0214387063a32d0a9814e171d2b9d3774d0d0a143470d9d17e8cc40270e1d2f3a67e808a143848e077478d0c9a263834e0d3a34e8e0a0d3019da61f6afc80e3c71a3fc2f8d1821f5dfcd8e207173fbc981ef8f1c40f277e90e047133f98f8b1c4ab04f34b8f0c604288573fbebca26a54d0c8f083aa2af9f0c2c71735197e88a1d3c33787ec8e9009f6434d1b36573a869a0bbc2f3a778473d49e422ec2168453e11630203c1bfce0522347784527869a17542d68984219603d7442c086a8f902e34167294cea425023469df26e50e3a5878c70a926d5259b1d6267c8bebc5eb0d303cc03a1d2384307467490a583a70e74a851eaa0033d8e10bfc070a8568c3db8be78687c74f408e2c545b481cb4a8f14e06c51657851856d8c3bc8bc78c5c047d40f2d6476c83421bb416581cb062f2f2f34646ed42d7c24e164f1ec78a9e15223e6c54b63d4e2c38a48c78c1d95a9068d5a11f54aad04b51d5c68b86010adc61a6ad4a0597aa541a39463031033726aa08901c9445e21ade05841c6602307a9f423f827300d1b19f4d4f1657000825718382da827e8b0886ef4808123021c23708ae809030704384ce02c81c3054709215d709cf8f1c1f900ce062a10383e8852b468d0b2c26962c686991a7048b09303ce08704a504bc306861a326ad8b0d9400d0c6ac0c8990187861a3a74385063464fe12ce1c4e003063ec6f831831e40f4f0c04b8c1f67782ce8d104a8460fa79d257afcd003043fcc905981103764a2e8a1030803d005433e007ab179b201818d10f406a01dd48ece868e0956431743dd42bff4e8402743074387ebac74576a0a2a15758aae06b1aadbc07f60c68c971daf2f558a1e5a3aa577aae9a24bea66a077b8946a9868c8a0a1010d1d3435a061636606345e66e2a091c18c1c346bd0a83143c7cc1c3469ec0411ce40860b4d0b605a68585093aa69a131a25ba2c982e605b52d343e8c1bb0c901f6011808604f3c88784551b9c8ae646dc072f820fe88991bbcc0e88ae888e88c70c9d03dc18aa8319851a3f683c8c60c1a325f646e206303992b19ab191a66b0c850f1a282460c9c20707ac00142e60a192b6049302b3255c8a4e03df03f00d181831d4419d4c6b0517a55895334493b30b41534565c4b2e1ccca99682300d980e5e0d6057604cf306e31a3655231b3e62f08241f5e245c66b0c0eb48c408c3f8c1eb08943868b07e2d5454d1aaf2b5e5b6cdc78a9604c0387089c271928402e5e55d86001af6aba8871d4d0a0070f3634d4d8d1c3071b2b21ce268b8d0d3367d4bc01bba1c68d1f2ea859e387979a18c09a6c7880d95073364b3565d0ab9a19d4b2b091e175831a2b180d3859d4d421b6f17ae2d5c4cb891f37a89101784718c3cb0697198e858f261717ae12b846e02ac2b585eb042e295c53b8927081c015e59a72b5c07584ab0617169716ae14b8b270f5e0f2800b0bd710ae255c4eb884706d7129e17ac2b5838b07d70f2e1b5c50b8a270657171c065848b05ae15b8987055e1bac275832b07d7932b042e205c1f7005e15241cf54cd183364b862a8b99a2943ac439cc3e606110e9106e21be21d40bec0711273220a8068b169c3956433c3aca3c6c4b303073cbccee891c30e0e385c841b7899a1e30510aa1a143555b5276a4e4c2d707ee080033b576021d88961a7069c295810af357464086100bfe0203141600387cc13322600bbc0f100e8458f25c02dc030769a00c1787d51b1709d51b3807140acc1cb8b9a06ce11343000c204a40c58075e65d868a9b1012ba9fe00dba1034137448ba047053369bc6cf0838d1e3df464515bd0566ab8ecf0a0d34563f1d9507bc0116205162a544da22e5195a81e783272a2462a9e8b189731052e3b64553eb8689911bee18901048d57171d2d3836e0d48033838e0e325f006143c68b8f06b5a57a458c8b2ae5aa636c72a5d1e303a21db58a1a11b5281f31e058a92800a2850f18ea0a5e50d4cc21dea0a606231a43b8801101f321b4e25b8833a82a10e5a849c2d10296c533e3470c6a5c5073064e08bc1fbc19bc2b5e0c3d33e8b1a367e81a7a072057b4161b1d76b4b8c2a01903e452bb41cf17206a0021a3cb0244059d53a743d7d4d1d075a0d3d2fdd005d1c305080f3d5d741ce87ce87ae878e880e0d1d2edd079a0cba1fb40874377031016e00c61f3464d0daf0d9d1c7ab010b700d7d0b9a1870d73861b367676e0e14167079e2606e060c101838621e3820ea39de8259a896ea29fe82e1dd55f34091a0a97aa5cfc106fc423417304cd123448e41891e38408845884e834163192603402e4400d23c6464c8e980c649e64909029a207971e60f4e822a7889c12e488409c41e4808885468a460b1a15c4ba88c120e60558450503b442d64566860c8c19ab993b66eae8b1460f1af460237644ac043124782cf168e22143ab8adaa56545cb8bda45eb8b2fe245f042f838818f2d3e50f02178103c11b12b625bc4a44627c629c6a81814b12d3113f810c207123e86a8d9e0b9e1d1e1bd018301ac0cd8182316a31763163eacf0d1021f57c8acd00981ec8a0f86efca1783a884480271095087ea0270872a06a8e585e5b5c38b86d612b5205a4c842c08c908b1a835d42cd586fa058d153eb4f808c2070fad21ea0b5a21086f107e69bd117620ecc1d3a2268697453746774617032058d870c026861aaa9a1bd8d450e3854d520d1c364d3638d4dc5113860dae260e1ba69a2f80cca16307101bec28d145f42cd136340d4056d0589aa973681e3acb9ca3710d03902ee6d5acc1b4c184a3c76a5acdaa49032052736ab66066b164a260b2604e31a5983f4ca989c584629e60e6a609261573cbfcc05cc1b46246318998219843cca46965c6309f260c1357c50215983e3c994d4ea8b820a505a1261098400424f08006a49000144e40c001941820090953082300100091282c38c07979c648c16a072a6a528125539a00b1b0640938fd4914a0254b5abf8127529c003dc1f92b5c548401202551a440292a025a00f94c1cbc0c34bf24d4c40914222946455058f0e0956c3e89895a68e1f556b8a80848a8c7c7c0310f03b7700099c7f1e05c090935712224d48400349c3bb848084a1323a0274b80802cf0018e1d2cc50251a02cc10011900b434ba04cb94651805ac04013141ee70b03ad7003067a22c5c992274da4084d71c1060c64d4048a519426464551a0c870ea6021a1264e8c9c3421328a228500301c2b067212454a94254d9c44918200a3282e4871e2e4f6c0a9019429170345500a80814be2d020041c3a7270e660189c19b01ccc82132953806c70e26022175680628128529c2c8132e50255a0894d06a78a8b9e1035b90010d19215a24079120568ca1228536e91901429284481d2821404581c38780a14168a8880a25c40ca120c00057d80f3063f018ab20294a2282e18357122850a14178680961811499902444404c70d7e026589115011910b4e6870dae0222028465088a4b060e44293252b2c8132e53699f2244a1322127ce0c8802f0065ca25020a2292e28013481c361808c80520171290c213a015566892c20f9c35b828c809100b4ebc7091511420222016a240791c35a240b1800d4e1aec044a5114284446558096604068ca94264b88809e084171c116e4448a90ed06070d6e614913a3264f9a18011d0086734606a00835816204250a14191c3338c88914a10a2c013272c109501520189c3298480a01429e404215686214c5050b2c3172024404e54914284b96d0e880367c2083918403c3ca97cb4820e770b83b919cc66355b1aae694f951efc6c6fb273d1bcff3bc27c99b1b8ffc1beadfc75f7f5d6b77adb39bf963effa7d5d2be576e68ffb03e9f4fad1a6def7791fd013fe987a7b5f777fb4995b74ff9add99b2338b226566ffd8fbbe9deea87760f7d755efcfbbfb1b476ef70aced44a99ba7762f56e96d8ac3a99bac74ce64a65cd72cf9d3f0fdbe9d7ec2f661bfe987ecceca4dde9e73895dbbb72f5cf690794fac7edb4d93f76fa71d3ef73f7bc8fb6536766ca9429534ad9fb28f5f6ef83317b53a64c993fca4e653e66a7cced9476bb575ae5cafef19021428430c8eed4e5a20e7a575abbdd0586cc937a5ead1f738fcc9f3b6598bb5377efd1dd2be0eeb0eab5d6dae3d8b4dbdde79c3e67d3f6f6a6d4bbbf6edaecd46beaf5fc2af5c09d3af5599dddbf70c645db43f7daa42ba5ee2ff6f656bb7fee1574265d57ef4a7b093b8d31b37fd3dd41b052a069482b0dc31aef1a760fc309788712a8719ed3bf5ab97b727fdc13e4eb09e21e0176770a1386ddd3b9bb99fba3f9421aeace94db2140a97baeaf7eeef4f3a8473d66af52eade5fb7fb473fef8ffbc6fb3effe6fc981bf600dab4ddbb2937b37fdd1f7bceee7d2008a34054a820303bbfda1dc0cc3e3bef98b9fb989bb9eb66c7ac6eba772c67ee58ecccdd64ef581d77ce9a5dd771d7755d73d779c71db3983b666618666f6731c73033b35831cc95997aadeedd9f7b8e7b7737a51ed0ee80f6cbddbfe6699e6e8fba7703ba76f7a49501ed7937ad1fe5e9cddd1f7f5fc7d49dba376d4f61d20528c0030e9d7f780218051ad6f41ac7a969202774cb7cddb06eeafd79b57e8e0098ce016a351d6f1a86ec734e9eacf6febeef874c7ba594c62adb7ccc95a73bedd0dd457710e6e476b06d427666a6dd4ca33edd41f77228655a29ad94b6f70ca5b45217a5d4044a5db429f5da5e2b58bfaf6777fb6cfe3e9c0efae3e993d99550e7ea6cc3ce6266af71f7cf6b6776f630c63e67c8ede2768ecd364077e8edce727767d51866f7ca732661febc69f3474343536b7dbd5e73ce5adbbd84f6f6aa57efd09d046feaeefe7277eef9f5d7947e1f87cedeee4dab778314ac2085e9eee6ea9f37280382ec3ed929ad15a4947e1ff7d7d49d7d4e0ec3574e873e42483d44e2341e76bb7bddcdeeeeecfc7ddc55669e9f659cf979e8ec79dd4eabd7dab47af5efebaed56937add4a35e53da3da7cf39270c4c7be73c3bca6af72e403b28d33dfba360d7fc79d8dd9336a594b67f4e00dbc7edec3d99bbdd3fff3e76e6767667766f6766a6a0e73ebdbda977f7f4cf999d5266fed89ddb9d32333365fe98bfef6b76ff989d7a5f6f7766767777fed8bddbbbbf23dff7cd6aedafcee97d3319113c99effbbcef930d4000edc950af7e9fabbdfdfbbeefebfebe98f77dfc7d9ff3f77decf4fb78ec9a366d9036edcfdbddbd73ea7ded1fcf39448a2153380f6e0c10496901a805cf8805a448219a0242009e0011013d2192b2c427841e20284446207c0043d323a5a60b72d2a402424252402852d3c3470f1a1e464550aa00dd742d48e981620120a22996031b98284053a634b9f10b00450122ea0e5a806214c50522cb81058c5ce8c14115201696184581423465899322282ddc0cf1e95145ca058c7c3461a1c8475013274e80827c42e8e1c14188f40459d20314d444a8024b5688028585a2262cbc102128413c00f8800807690244e4032868895115a0283a3e3e807922048505274b8c845c686201a027b4ce88a88951d1073d1cfcac00a5888c7190220c00052d710245a8022e4c99111575d0e29ea22220a2292d4871b28408888a142740444b9a143d7102b42448904f083d539c0015fdb0587062d4a4024b58288212058a05661f60c002508880a870608980a200adb00400414208a1e709d0122946533040e4a4039610101520a125559ab480035b418ad09215a240596105294234b3051f0c446401275284849adcc054017a12054acc94169a181501b500c5e87b449102c5c84993a2284d888c96184169a1022e14d1584f80808a96b420e5499426443606c8a88951d1922022291730028a92032bf2596116821150d19227519a2c01226a32a5052943c62640424e9600add084488a51d112a1264ea4088140250a90b338c8922852a014110151594224c5a8c91328424da82c2982b2240a94262c38b18005a42c31aa02c401952840fe03aba3f986d44cf805a466c28dc462c247472c9009b7c20e09e9e8e8ab48ee47484820528b09231d1dbd8e8e68bb33399a4847474794c9d13cbacddb64f2c27c611e1d1d1d1d3192787474243261a48f8f908e909c9190e6d1d16482348f909ac96dde6ecde485f9c20bcd848f90909cc9d13c3a6a2647f36832e1a3a3a323a48e1e1d21cda3598f26d264723499091f1d39133e426a267c74c448481f13a47974e4313942ea98204d24a46682349991281346426a268c8484e44c9026d264c248938905bc342633cf168a9a70ff6aba2dbecb9bc2179ba6703ceccdfb193b61ec6d8ad3fa61f6369d5af6e654377762d95b3bc9d8a6622aae72ea625e8cbd219102ec61fec6fa1bd3105beb6f48a4d0bd3775fb6f48a450bfeb5c0ec6de580fb373b4b709e5b4fe97bd4d97bd7993686fdd14da9ec24d2876c109ea68a220cbde9296425bcbde904881f5f46f93eaf6330db1517b63d949e5b47efa9ebdcd29a7f577f6d6d5766e7a36a8a2065a90800530cca9a9c58c21d4f882082b9f3dea2b9a5002872dbef460a37656517915a572a2534d533447713977a250de975e0555e5509eedb450755fba13d5955367bb266fa25ff6d477757507185faca087266a3ba6cecd37bc08c30c20a4c2b0b1cdbf6cdced8f8b1dbc7842862cdcb0b1cd6d87735a7f39ab6eff1cc138bfec70b7bba9cb1c1c59a4d933361c31c711671c31c611611cc165882e59dc0c8c9c1b4288db0f5ece0d41c5104fcc1a30bbb3b395796543826b58f0c86e3ffffc59fbcc3075fb6f74daa76fffecd86d16fe36cee5c961ce39d9c66a98c3873984d395f5cc2d371260cf8668c26947f0b30d091c10081bb60640bafc2fc840c4b644c4d6cf362bf3cad61609b64773ea809492486310fd0f6e89d41d5dfa25eb006cc6ed2c11b57b26eb7724253b57a2ca562d8eb568a25fb228f9c105278b10f8e01e4da4ae9b0b281f40e625e61c9ad77fde00f293f00738346f3f0f5e6ef8dd3759346f7f8b25f065d9a0f9ac269a5cebdea8de21bebae0b73842f8ad16d87db348ce817ed8e586cf7a10ecc26e3dab45253409ebc33fd2247c0ffe24c16791e1bba8a4fe9c96b936cbb6936bf3590f9265b3a8d43be477e08c269237db8dc9f47f5c3a9f7970bade7f28a8b003166eabf159fbd878dde7cc98b0204667f3d1a38ddbe9b44fe9fd8c3baeef25842a30699f8ea54c689f79bbe7d1c274bb1fd2519edb3117299f9a5bf219b7ab3fe57edffc46deed07694efb74443d45254beef7f5fbe6cf32ebb00559a2094852782dcffb727edf64b51fe99125d2f5823c31c967bfff6cf98267cb79bb497f70762bf16f25d3b34ae677f737e00e425c8fec260cb7accfb9197c18c158fb78df3d1549a85fbe709564c270eb83dcb8fbbd47d68f2cbde73fe21e0c777e7b55f502d6fe793dffd83ee2f3c7daa7f5cc7ff339ed539f7fd63ede23dd16297e25914010fc231d9236f559396cb9f4451dbc07b95cfa1e07ceb8f441fa208834c367b1c00727f8437ec1076b908d92ef3bfab93e259feb03bf3ec86a3d5f56cb8e509ff5ac1db25cfaaddf21e9d2a0eebf0fbf92f3b25c1ca1d56ab56c50f725fd22a4138a906ef841de9f40ffb3a5f7a165f165d52e6431b4e5ed86ef912fd27b89394839935ebfc41cc4fb693be2210976a147fabf48b6555209cb06894f5f7c16910c896314df3df03d5b8a0f5a1bf0bfef94d017ad0d6895d4f7be821ed9fa2fa8d64f49fd6a12fa2c5b7a0f3e089265f836ace70bbe47dab0ec08dd830f5abe1c98e3d2071fecd06b3d68cb794befc3073d6c91e197f386df8d002601c1f767d9a179c57a7ffaa02d5b1f92e0bc1e396f8be43b2ff3ed8618b9fcec359c0168182ebf8b87c8d1446a7568039884410f5924c16d39a75802fbcf13fafd595f562e52bf6479e86439aff760fbe5760ffb32c8a1279e40df6d59af7bef950e7e210d3bd10095eccb22e7edbc9fff89273458c5138edcd6b3c8790d8024c56d3dd80a5926208d10e50e1dd52421cefdaa880024a7db7ab04396480292d31d62725b0fd6b0251a00c986db7a100c5962121eae1259a20948b7f5a02b641da0cbd7fdb8997976aef2a8e97a0f86218b65cbda2e5779e474bd6f91cc3a65ebe787e209fd2d5b4e164356927ecfbacaa39b4588ebfdbc959c17ac618b49e8fb4f71c86f903802d2ed3eebd9f91e34df46498981dbcf17a94e2f892c583c0a0ee4c09405072f138710ecefb7e99e67f7ec9136ddcffbfd07a3ffc1f5ffbec9ee677bedb5c7df5ee59eecfd11f7c8ee821dd90fce59c3d83f3b0f3b1a765dbff7839d38028be17d3357f3dcc976ecd907d791bee95b803c3b3082b387b193b89cf3418ddb405cce7540eace2ee778b04a6264a5ea96485178b774e1062b2eff6bf6303a1597731f58e2ce2d977340bc71752ee780e0c01449686541758798dcaa1feed091eb9646658c2103e296464f408065dcd2688632ba5b168141821f504cddb2286aea561c8eaf2effe56f1dc0a179e98394ecbeebbeb8f300fe6dcb5c08dab8f4e9cfef49da28e9beb8f4bb2f6e598474e977cf7788afaeae1ae9f6776ddc79c4964b5ef2821d3689733bb2fbe24e9184a72233ad512b7927c1eeea5a9b24f3fd4998efd608e4dc105eae51dfce96fd54e6f547bae47592bc6d045e7ea46ef69739ee7cd9eb3ffbf9fd5d3401490adae4fca60d23e76e38e3d6ffde6b7d25cbd607b1be7ef7dffb834d860fba481bd7f32d91aeeb3fb2ecb643af4bc5a8afebc31769e3fa79c70769d80f36699384e270177c7afd82df645f16934c5c8b24b8fe458eff91ae6fd2c317492f48c38f643aee8bf40b76e147f20dee8bec0bd29edc7dd41b3ffc8f643bee8bbbd9d425be5f317c316e48f68fe4eb8ff88bec38e8fbfa6e029214f5b9d63fd260f308f3bf2926f9beda24f11bbedfd0964851e070b749f0c129ce1a46f05d24f8305cb04317093ee86f5c90cac1735cb00b5d64d177a9f45d81685ef0a98864d230820f52710416e3820f7247bb72e0027f0b2e86eb22792ed8627d83e233d75aa0f8618b2cfdb23e64852dd6832451288afd21eb5b248b26b00e8b9fe707ebecd8336aed752beb996b7e5ec029c3482fe76e78c19461ec2ee76e880173ad83eff3bceffb496ae0fbbe2f0d9049708add5cebbabbab5ceb7e921ae8ba67711124fddd73e5225420097c5f0f32333373cf6772dec9af906baf6f3203a3ebc50f1ffc0c8cad677dfdef33307afe7af5bf5edfaf31c05792efbf1659de777d677d7dcfbd7a2cf0abef2495796bfd6f72bbcbfdddfead36a8fef72c1ea0b26c8974599375abee5eff880fdd6ed76675edda3ff9491bfff9fe4ddaf83b59c291cbac537effbd937cbfff2a9151788744b873caadcf621226b77eb5cc3a247c64593fc8ff7bb092966888ab70b86b04735bef6e14ded6d767f1842997f547ba92444322dce69abf91776b5f7f164954dfc8bbad6751c992cb7a9c2111eee41aeb2bcb32ebb83842f7b592f3bf725efe8e2cfbe733b5b5674e8e757e5880ecc1bc7bb0f307a7c86d03bfb625d2ed79fb9899ffe33bc9a1dbfd6693437e5fd33259d25a2793ee43dfd5d5d5975b9b1cf25bed9077cfde7f64f93d95f10a511c0cb7ec1ffabec07075a9d4921544bf3edb72bcfc4d86fd54beb27f8888ca778b90eeb42c2261efdba86febbd6fd9a1f9e5521669d497beb5493273d7bf4524fe1ec9e57cef9da4d29ef7b61cba5dfa5d8974bff9555bde6efd26677777fd598434e423f0f77b437e29b5414aa892f96e83f89b59b3e2d03327768055c6166f787a2663152e32bf6fee52f1441f1f7cf1a5ede37df8fccc7359dc7a2e3243f2b9c673f9bd24f5c93abf4e92ef145b606b04d66b5e904524fcc1c69eb59ef5e04f11c9b425d29d2cb2458295a4326f392feb2749655e16eb2bc99782ae6987fcda8ce077feb4cf35fe792bc9b241f5c1a7e250bdde8321f862fd14e7d2e86f59967f82952cebb35ab644baad89a405daf276c19f248bf49eac33bf340092149759673eeb8ff8d0ed7a3fcb5be490b3fc59e4541afdc726f97e64ed7a6425c119ceff489b6987e6f52c6fc1e1ee8feb8900f426a431a8fb0f6ed9d989a5677c3937830fe0c4d23e7ce9037111229e4b043f12a7f1f399ad6793966a36ef99626c58da2776e9d70c29632c85eec4d233fa3c68a090e4fdfc23fdc2584e2c977ec9685cfa37fed16974f8e004104e4051e17036efa96d92382a821a4010431027b0252dd56cf399626cfc494b6dfb9e6900b6f91ec93400db0d8914e6df50701afd3975e97b7f432285ef3d7b3be234fa9fbd219182f7d3dede69f43dcbc3b9dcfc92a7980632a8800837c230820c2efed21f1283916d483a6071821f7e98a2cb1233b0b18dbfe4b9f4594ce17138dbc4d23e1f5cfa9c436dd06ceaa63f80cc454a1ea457d93e2dfa1da547d73b332eb55de97df43f1bc5b3a5f742ae44d5edacf7a5dbf276a92b612d6cb89e25a2765f1e5d21241fae17450049b9db7d496d59e57a14d6a2e9765f66e052cf46e1336e67a79e50b0f30515f4062df7e672aee9cb053bec48226efc47afabab2b1f6c2c227033632861650d1cfd39e4575797085c0f1a86c8e244d48153125238a3297cc62502b7f30515382a0248ca55c1b1164d36fe3203b77be60030ef949cb3a1896b342f1131f0193696c5f11936b637fea3283f7c000c18bee070b66a7149389c8dbfbcbddb720a48c34af253d2bfc506ec7c31c5958d9fc506c0c81823047758b9bab2f1c7aeb77702d02925bba7f3ab5df7fe951cbbce6b345cece2b8b29e754fc979410fe97b1d9d9776c3c0bf72112f65d77f7a7d67bd7befdefbb3bcaf9ebf7befdfbbfb77e4bca047f2ed90b41bf48f74bff7d37b1bfaf3f6b5a17078df7d5e47ce4b495ab9c6ed06c8dd532ee23d7fe791437ad6bd1997a767ddb3e865ad52df7f5adffdcc7fc0effea67d68cfea774f848b3cd7ea770f9263d3eab7c8dab4caa3fa8fac69f5bb97b50febbbe72db71c72bbe7c145ea3b55e891fcc1eafb43dd9b9ed5ef9f3fc5fa36dffbed6bf37dcfb91ad4b89cab018d2beb597d6f885e96e59ed58e6bfc2c528f9cf7a891ba7625406e9fcf9ffe47cedb91f45924a17be6da08fef4711082c503f8d3af4f6d592ffd7e8a4355926280017787ca0bdcc08eabeb7d11d2f56cd1674bfadd91423529061868951695545b56015924a1a34fc511bc67ae95dd47ceeb911d126a6d92f8d3f7a736a89fdaa1db2dfdf677b353007e0f4e1109f8e1775f49f1998bb8de7bd0458e8074cbf0c1677184ea0aaacf1f9265fdf9e014d9835dced520c6edb8e6b53842f78b64fd16392f08b278807e16eb4592f52d92e7b3888465cb79d996ac6716d90ffe9106990c1f24f9822c92c0367cb043909c9745125a97b956f283e00cc1f08f34872059490c8ce183dfba654d526f688358df2059b27e2ae967cd568be4cb22f956be5e475292f68cc3e95a409e32d22f65b77b9eaee3b9dd773fa47b5913b7fb9bfe695b67e4763ab7fbb17dfabbaeeb9e733a1bc4b923907932cf27207fb0b0673114daa77c1adab8b92573b9f4bbff6af7f7f3bee42ef77b229f4f594b689f7264a17dbe37d23e35f77b15da87733534ddef25d03fd4e6dc85b7dcefb97d6c6e19bb2591fb757fa46fc0263f21a608eef760874df6952171bf07b927bb6b685e5dfe3ed63ef4bfefbfe79ccf0671953fcdda074baee797b21bf6e176ec3e092ebba1fea37fec9200f20e19230d586eff386120bbc029c3487b369f67fc29e92414d0b9b87bcdedfff096e3cd097b46a3009e230826bad0800439dc20031bc760d4b288643e1db17ce9b17d64b73fac3c6d783987a58d4badac67937336009968ec1ab6cf1c3b00b91c1b745dcd30c70d888445871b9e7000a34b1177d85804e7734ec943ce7bc1497b36699f4049f06cf9d7fbca1f8cf6cc96467e5b2f6b1ff0fd6fdae7033f16cb96ac6f3deb0b7b36b6cfc77a7ff023e7055924873f451278dcd096e1b7fe23f986a4915fd683b379baeb23f98224df168be49e95b23bbffacf95b771d3986be5cd9db6f4409fd323f98a30bf9246dd9d21d86195eb3d93652d2b7fb0c9624ecffcbfff9e7d4c52b29cd7238dfcf24f72ec19dbced69ef578bffa0fc5e170389ccd7fc645fc7acee569cdce03eee493b1d6366e7f289bc187db7ff3649ccff34ee110c96bc42b6d5cce5d11e3967ffb0a16f7fd47a769fd8d047c79df5988b40fe7ae7cb9fd46a67882ff7c1681c672d63d11cecdc074fb75fa67dafa8ddcdcb44f3f933c3d6b9d9ef57b47922cce581c615e9d9e4d71d6b37e0a8c47b7b60fe774371d0790c9381ff48e9832e2703818669f30bb7da4670e23e736c0e57e709d72112e1a3977258acb972fd885948bf4e5d2bffbf9a00bb26b24bbfd4e96936888af6ebfd177e9839ea8e4d52473adf4af9cc4fbee5924c1ff3bd24ef2ad64d97d39afff47da28f1bebf6d50f7def3a5245f4f54f2c1f52c73cd9f8a48ba196576fb67dae6d31695700da2cc6e5b3bb9d6efe209b3eb96b9d6967b3691be498d00b9dd7f2673bb2d274e54f2baf49da4422fb5cccecc5ce3205dbc7a7693bd05387f82977332bc60a6d132ccc0bbcb3919eaa0fea0fbd0bc9acf62166f06f1724e863ba693f37e97734c42b02ee7984470653d6363d620037617b9d621d7fa99ccc0c839a62dd72fe7985070cbcadf2f32c9d4c495f1e775d535763b80dc0ee89e1af9ad1d69e437c9c4e170b83b9f92464eef7c4ae7146386ee0f3a39599c7fa4bbeefd5d44e23d73f2eb9fe2fc16bde7a40138b18cf3d9320d387f9224f0052739831657d6b2cbb9a52fae2c1eb688645eced55075653d6b71885ee61a7f8b4886e6d5a5e15a7f8b24cc4b9f4916f927392f9343f3eace771109b5b19ef54f52c6b57e273530724e862362345c846fff28e322ad20fac10e1685174e923d58d833ee597973e7bb2ee764c8e2ca7a361f64ea3db973790e20370876cf3dab5df7471a04596c40bf2d912efd239b3b8b2af8b7bd21d96ef4dbe64ede906cf48f746d9fcafed35f1af95561e4cb29cc777b3bb22d213124c2f57eda3a92da72deee3db2f4db7d93fe47bc6d2ca6e0b6f9479a927c9b641bf74fb521f9517733813c34726ea98ddb5dce2d65b90c63918479fd8fb423cda9c4a70246160d807429b521d29c0570b204e49e913091f8a74842503fdf20b64347977fb200b202e81d2ff8a29d9b8074fbdb863df3f7a79d4742bfff91e6f6b119a1dfdfbd9f4f6bfbb82dbb0ff2a7ef791fb64f5f6fbc2a00590123f8a2bf84e5f2fc72de69c39ed1a70fbe4c18fdfb878e2e1d9a97da0a80dc20b74f7bc824c8394a6d8497a77d4a23df3ee5cc48fbd0f7d7699feffa8fedc3392531ae7fac7fdae639d79fdb27259834ff120097ec88e099bf976002e096d4a1fca71301d3fc69ade328fbffe0961fb478025371fb6b869431f214976f49adae9b20e91af5a5cff405705954d25d6abb6e7e51204319f90b14e42eecf21727e052afecd2f940a0187279faf7a5ce65066282f173da87763f85726eb524bd030a19dcf9a3fffcf4ec87acc6ed9e26d9badbd95228e73e1b23dbe6b482883b3830f586153a9c61732ba048e3baec7e4ed3e603891abdcb3928a86ef9777aed5e80dc3eedd94a96f5d6ffb8c8e77111afe3229d73116f2ed2938b4cae79cfdeb441defb7b5e93b567f57bef67b565add7fbeff3bcaea3d4bdb9487def6792ef76d523eb7b5d3f3bf4dda07e4a96fe4548b7bf497b98028bcbb929a2e829a06e0bd13ede50fcd3494cebff61a6958d85e5c33c2b3bcbed2f6197610f8021978342ea1af5f5279a4d65be006e8b27787742b14e7f0f31f2852a29974b446fc95d54e8d9a463246f433581ce3c9b30da339d9e75397358ac6736582e7d1bcf8ed0d77bf642055f6ef7448c4471fb5930ea1fcff517a07d38f74413b779b84c223ee3ed248ac3a27f9240272438f7441bfd1ef9002b73900fc045910fc045d133be3ced53d621edc329788015b639447c76ec9b9e35ec0131e47ac677bcdec30fce56f25c2682f4c412414081613583191c61632a2ef3cf8ef40fb5f1330466940f4fe0da89266eb71351dc6e9e198ce53febfb6e0ab2489e32185bcfb7f5f3bfd6f741f4e9839d888465025292efa72d83be9f22fd8f0cf23e4a270f6bfa1b15ac19e286d3283c37c83fec197ffdf69e7e29c473ebb31eac64ed591be3f77c9b45d6cbfe536dfdb59e4065de69a98dc2733d1b44bfb32358aeb3677077f7f9eeb3c7985eb610caa17d93dc44c5718650cef422c4236344172210e2f9beeffbbeeffb84be28dce5234beec25d7478867011f0f96ffa67e6f530cf1f8e3d00a6b7c9c4629e5b16461221f331b171e61b1623ebd9477bf67d0c19ebd9f733e437edfb1639eb190cc917f6ef3f32b0960c599bf63d8c1c7bf6fd48f2f4ecfb1739a467dfbbc802f4ec7b912ca167df87a4093dfb1e2451e0daf7ec3f449af67d3f7f8a23f46d59eed95763ba0b0128da92874b17c6e2b22dc51785786e149e1b147eabe4b9b30c6dc973c3cf893dffb70fecf9cbd88d79181869a467fd317248d3622cf8230cf94e9bffca9189e28ffe03f3e3f7c3902c22196d19fe57fe15df4596e3156d19de72e48bc20dfabe1e39d2d8b487cf96b3fb31598e2e11c808c67f1739739aebbb63f7fbf0b97fc2a67dff3d7873bf77912212d1d69e7d7fc443922c6577da3246b2ec67bb882ee3f89e9d43e61879cb9d638cf5997462ccb83c1632def295467e8634adfbafd67194c9fe673c3debc68f2c6796ebd9982582c575e6be7624c039bbdd29ed989cff8948645f8c6cbd18d97a3306237fe7e22a76e8206d752c2fac3d63ffce3fa8b3b567ccb3d6cbcc9fabac72e9e5cbb34507a50e7ed37b1aae75f4e69486d487be77e1e4e2fb96eeee20839f0472b808e55cfade046bc8e4bbe82efd4f4442ffa667fc32aef14f19c930a21d2dbfeffba8571a399805e46286dc1b605b9670895cfa538c71be1091cbcc52e8bc80bad3d9656a4ba4282e7df79f618cf35d88b75c3acb18e74f2e287da702049fa76e39a48cf5112ea202d7c42fdff5e5ec87884effcc9ce6e1f74cbb7eb5338db11c5b3cac073b474906ba30a28ba62bc4c3c5849eb946a74d7186e4bc2209640463498488ffbcdeffc88b046718b2fc27d6347fff58f86a8c446e8b88ff2421517fe96daff72f40fb94d5a7be7f09edd3ad677d68cb1b6f81ef42442eeb5d547253010e42405d21ee7259f4b2c8b23d7b7d2491c953617b4ed417e7943377bbef723b59ff94e0b4ee8938ad7b7e06b2c548ffd6b30ec8d408648ab19c5aa696f6e96f6b342f121fdae7733aa27d3e4b0454fb44b58f4d4f2cb77bbedfe8b4eebbf17295a55c05640463f725a8c045d0184ba6badd3379d23ef5bb670137a56fed530acdeefcfeeeab98506dc95c5c44e259233a9be05af71d4219fb482023602d3dcf184baeba5df7538c4a2255e6531212f497de2644fb94d3a97de8779f0f8b48be5aad106f51a28121b8f042758598ea4e7a3d925e4a7208f363fdc3b66aebcaf176b652e7fa7733f7d9c0df97eeeeddc75dd7f1cc72bcefefc85276f9fbb2eb3aaed1779f1e59c62e7764195eae43b8c66347070d27173d3db2b6c6e8d9dab376a6773ecffe32bc73ea08d7d8081109e480219433847f96c3c577f937936a72573bebc541bbae637ecafcb2aeeb28384da0725ba270fd2759f2dc39e79ce5ec9ad0b37e27857898cbed233deb9fbc85889139bb5c29223d6b4a96425198ea064d8b44a73fa1d333de22813b9fff36c5a8bcb94239977bec596cda92c89ddffd4ce7bdf7294444c65bbce9348020c8df24ebdce6b94de476f9df7739b7ab48c25a8fb450cee5a79c33e43291cbb2d28bf5cc93fdf5a6673b7276bbfca6946b311691944244eefcb6b3fbc299bffbd2f3f83dfe208fe716fc938b7e3ab718e7cf1890e075dd7bd77d10a5f426d67d4929ed485b32b9dd53727631cea746dded3a4b72d9755de74f20b70fbd6077777b7bcb00f697eeee3d6bbfccf432fbf897dd3788a8af5f5d3107807ee9de414e49a2795b095f5d5d6effb2bb8d5a890817c9a76701e98325330d625ba70b2a7391c945f896f4b9b6c6382f7dfa5e7b367ffec806f885970dd0e6394b505582d9ed449313b8ef8201726fc0eaf60c07708740ee12702901167480f38f984c7c694288af7d027039c744976be4d7bfc8fdb84873cd595150b18aeec585f791f1b1bcd4d7e55c1371b0445ccb69006b53a8456c05e1a247bc6050239d02165601d3da2226468232623130323cf50a3855408239aedf2e0196db3fc4c80765c84528002e915bde9044fe4454c6cb3ff4978a5fce5d4af6b8200d295943ca2ee88594e471c12fa4e4cc056b48c9980bb2424ac25cb0155232c805c190923c170c434a861714434ab62ee80a29c9bae02ba4a477c131a46477415848497a419890927ec19890927dc1180c2c2626e3b24446e3ddc9ddd0b580f30aa8286e49a19a8082f280169d86c262ced9ed05ea0caa840f4a24415929d1841249283184a7441b6228a1c496fa8d97734ac8515d31b0bca6568b0360750ac1277189dc12276831e10ae7d42b146364282e505bc46496f012c25c2616de662249092c4b58dd3126b3c41bb5c28493891a6238c74416d8f8728921d8625518170c16e04cc1571954d3edc94dc059c41836146e323373126d24e18593f8726524c87c11d39fad4a9ebaced39673887333b72a798ada72e6b69c35151628d87f3f8e0ffbbcf88f0c4dd9552fc8946d35f323e3f15134b6b574ee3fd9287694d31aca69dd4f4e6ba75c12b95bce2a9eba652f4199ec74923dccccc7bccccfe75156198c2dff636c29b3e5e8d45aaa6664ac66aa50cdcce0bccc30cd3055cd34cd3459c954dd923249d9d1025bcdccd4cc8cac8b4cf6fd4de53f3c686c6c2ccf6a6a2c0d0d0d0f4b79f008656f4566ca66acf7f3a7d37492eae9659c54cf1ff3b3cbf3ebd9a614fb39f52fb2e78e71dad74f29191a1e5353aacb949215999fb132a599b7223369ec0b323b3363a79722a4db39ae75c76c59636c39c2d85206b3e56cb4e5f7bfc8ceb195950b9ef84007d0880304b6594b2db551830db87165fb5c8ba8343c80abc3043656d73147087032e08ab0816c2859e9d2050c4e6063a7b95e7ca79af1c2644714554d6ea585e25ea04e2fd0a714c0616b24a66e4999a46ee75cb3d9d8b2a54c566df9f7b3b9dced9fe5b4388d9d3c5bd6a7ce962394d3f8525bca8e2411e534be6ecbbf50311dd303c83925cddd999f89e241130545c38366522d4eebe741e79cb28ac9c46233333433333c66666a64646256c94aec9564373ff333df3236375f4dcddbd467ffe161797c0d8bc682cf36997d61c6be20f3ad076913283e65125f4f712fd8bbd5b7555b5575eef3a8ea50ac677fe2a9b5bdb853d15792b1de45e6adc4629e6d4a32d6a73e86a45ae69496a9db1ff3e59c1a81d32d1b57c563d556fed34f4eebafa3ac9f6e3f68ad1ad731b69f26ae9fc62a1be7d47c9a5652d3d64f9d1a14fff55552b7ab6e4ff194ffc8c4bac81e05a74d2a1e305e669e9d36be8cccb3d35c6fc563cf4e0bbf63969d063e28533ff6e28c65a7b15ee65f3c2c3badf5330fbbc92ccff7532dfec3c3a2e0b4f93330b6e42e773ecc965566b42553ddf92f5b8e31cb4e73d992bddcf9a22d65a12db9eace07a996dbcfe33f2d5b56962dc7caf3f178b6ac9dadf3eb6521c1348c1c20e780ec3face707adaaa68d454e1b4fd127a7e12ad3d8c44f71fee3ef24d3323631ddae2375f72e5053fec3b62e54d40b7d826a2aae7226ff513a8ab1d5af4fadf0c9296c396979a55ba8a5c97f94beb7e255eb4c4eebffac37b93375d465bafddec5f2fbf7f4bd9fdfb2b63fdb9e65a7cda6a6f2a2e5f6971d75fbbbc97fc62a1bddbbc828eef697dfdf915063e950936d2fa34fd73673d38b97cfab9a39a8692515859bca35531729a7b537a99a3edda64ffed3475831061a1da86105b67e0ae53fae830dbe1061441054d8fa6994ffcca519c0b8b2baf2c2d64f73fe13e40a1ecab85ada62eba752fe339da82307263a70c0d95a4bffd4e23fb76903bf5bdfacff89f21feffba784fd55fc07b42538adb79838ff695914fa2793ffb0ac0afdb3a95a262f789605a7f537f52e5cebf72eb7dfddbd9f8971d2aa0f89f6584515ff61b0b2be9c5a2e2f4d1beb5fb077f173abf52087e2873ffeebcbc974f92b09b333cacb6827d4d2b4bd443b9f467e1496a60df6adfa254b7dc939f04b2297c32f792effcc7f6e283c3f8c9c52e48b9c5d5ce4a422a717d6f3d72a4ef347c169e2f38f22682753cbcea6b6a5cc4e2d4e9bb6fc3bbf9c52f367b30abe3f4f0debfb13a995b258ef5f82ff80e0cf9c361fb4ffd992a5eefcf23d5b724ec6b263674b22d569d4963c7776cd8a01e49cb273255b3dfd92a7a82dd996b3cbb664abeb930463399d9e6ec9565655fed3a50b1595172fe594f29fdb1fc5d8fca793ffdcc4f7befbc207bf64a9af6b3deb4bce755ffdef4b22b79c4e2e7b7b41f4eccc697d7bc1fb723a85f641a95ccbca589c8baa76fc884079b6b2d34a9e6e2175d31480a327fb76da7ddebb9effc3faac16188ab19779feeaaed7088b81791ba6698bc9ccf0a8f9a4a56aa37999272df1d86c6c0d0d199391313c666448598ca4e120f363c8fab15a1c040c6b6c6e38480f1f381cc425be46184ccd746fba8db445df738deb9e7ef8370773b85ce35e56bcfef737f7a77f0bedadab9ce650537846960b1c5b7ff3b1a79ce6b73975e3d9e404c29acaebec6d56fd847a7d2e741c2bd7385c2ee46155415541b1fe6b2a707cb6815fb693d89a4ea3eb4b1e5ff65db64e89a1958176ec26961dab954d1dc5d83e5b9dd6cf36cfb28dfa0b69762b0b9073ca59553faf7bfef71ffafc1ed991569c9256fc236f325fc91b8f3f8ab1252d8936eafdd2b4794d947e47ff567f69daeadfba168bbb5f9ab6ce5b323154ad5f9ab6968cbd252d89b62426116c32bf346d37245288bdccdf78d8db8c5d9a3619ff987f8cbd4d2aa7f9c3d8a5696bf9c3ec14a7f9b3ec8d89d3fc47bb346d9dffcbfecd6597a6addadbe8347fd14ea71b3bcd3fb44bd3e6f9837636396daa7aef8d9dd3ccd129ef998ae7e3aad69793aa658f626cddb3ec518c8d3edbbeafcfb6fae584aae4477a6447ca9c369f92efb4396348b3bfafea8ef44b59f9b79cf5dc31127dcbf5ce62bd7d4104bf5b2dd0bec00a9f3efb4f685f68bd7e3efb8f52d873c73834ef2765530affc624c4f6b22f802efb42f879569e95ff88564914ad67e534ffd02a85e1f753eab3e583560904676eda52d6b24aadb7525fa96539ca69fed47a562cabc47a2bd5be409f6d4a2ccb4eeb9f504efb703d778c44def7cf2546ce2181eb27a927ce2181bb9e37359f9efce766c58f626cb5f5dfaa3259fdd638de723edd9884d858764cd9acf80bec3411aa6c4f3d778c7fdb9673887ecf1de308ccb5b256f6979fd44c629c498ce5e7e459959f5397f9d4b7fca43e29ff994f4ef3af751c65b25b7e52d79ffdffe23ea74fea73e2336ee94d7956de54cf2d3d9cf7e4e13aa82e1d54ec9694aa63a26add9236d128dad4ddd2735e5c8be7bacab5485955b513aea59eaed55339ad7826ee4beec253d6eb7389712a31cedb5fcea7afea32074715a9eb97179066c766c5a9288e15ff52d361ec26e78be9b159695cffd2fc6cfeb2390f9be3d8fc039bdb9bf74c426c9dc454b359712bdc92676ba6b675cbd630b6aeb1b5b53508b6b6b7ee9984786c24c9ca6763e2b1f52fb9cd3b9b8b3697b1790f9b7760737bf36712d24ebbb637fa4731b6ef6bcf7b2b2eeb3acf8e6e6f4c426cfe4c426cb718b7ecb4f94731362621366fd21cf8fec334b6d34f5a7a99edfba4a5d1e63df8fcd57f929886d89262bf44c4d6faa5d096b4f436d6d7e797f94f12d34d28be5c3ffe528e0d7cfe318969664b5a2262837dd2128f2de6976636985f92d9c64f5ae2b179335bc741e6272dbd8d7290f9cc21cce78f215d1c643e0c297290f930f2c541e68fe4c821cc7f91321c64be8b8c7190f92239c341e687240f0e321f24652c647e8bfc38c87c16197290f995ac1c020799ef91351c647e47de7090f994ecc141e63be98383cc6f128783cc3f8a99ad05e8d15f8a6123494c3c36ff256a6ba71d7dfeafb25addf3879dadaed70883f1e78fb111262ac34698c21936c214e3c146986e646c842987868d30e9d8daca9c6684a9deb011a6b1071b6192f960234c6febe7c761234c331b1ba1964536e276ac61236ddf69f3f98fe86c2a9073ca6e0a89b1ec9e3a29f1add05c14ebadb00b4e500714d3101bfd9b9527ffb137b732886013eded86f3eccd7b1944b0b1ec0de9082a64e8ec0d034a503029b18226ae6c371944b0517b3b52c38730b43c75c9c1e6f4bb4f5a0a6d5e8faf55b79f296663799de7e35bd489aae3f134f63c62ddcb4ce13ccc146da2f65dfc1b1229906fff063ef9379b07e9e76ecbbe86e2fe657fc3ddfe9c8b1c7ccecccddf904821e667fed6317ffbfec614b3f98714eab6573914cdbbfe0675fbab6ee7d89bf81cd8b7f63692f6760404dfc6de68aec6dea8ccdefcade778d81bc7622f636f74caa7702c6d82c9be656fd487a5b4875dd2b1d5677d39e658f5a6e66d605ee4f1dd7a98538beaf657279967395131958dbd895f639938ad7fc6de50705a7f8cbdf138adffb3b7251ddbf7a1bd5128af72a886a2b15df53cc5e3c9441e33cf637c2fe6f523d46d575d280e21c40b47257abe100422480d636ff0b0421925c6f9bee3f44b77770edddddd8180618e12351a86620e3a345dfc10c3d02592e0e038b95d25d205e1be42100b1a1d43590c66b090470c1fc0843de0f020268c3131cee79c58c8030b0732618b0576266cbd80e411be154f65a10f2a7068c287818f9a3096450f9b7044c10dbd0963399b1ea10f236a7c846710118387cb0c8be72d3223e390a9537322dca0508e713e75777797c1096169c4ea87231731950c7d60016343191630ca41f82d8d342714a35e1d842010aeea410802217e10be72086761cb0990d2c2708c560521fcae60fd087d00e1e9842d233a2021521312e37ce7aacb5f1391f07750e37c7777770a24a470305bba13864174e5093d2e6690b053639ceffccc3b406a3a3f40a0cd3ef0a0831c0e2cf9383e7adcd8d4d0c878ccc8c46260785c43f3eada24e1b93eaedbd202b608af5e3dfc3aea125fcf2292f18f34c82212d81f6998ef594412c3748c7d0ecf902305402105264fa618e1926653cf3a4bab95e32d5a9ae6985a9a6696f6d1021391cc2ae66c82b7cc288edc1614de64ea59e3dc0027132ea97d7c1ce793771daa00469c3052654a1b56538caabceaf0c1881025108922c2021339bc3079c2822b8e26225a4c1832c5101550f0d20585145410d7984943b0a0c043029e128ed0c152470a5042488615cfc4a5a053021d223c7610e11942045ca30d9d39549849319bbd0c669f336bd54135f322811c26847264630d1e7cb0caea773f4b4452ddb84e2f483a2994735b767eeb33c1c82dd2a8bbad56cbd69b198ce574fad6b784e8a72212f08477f0c90d15df4d8cf5e54d7973c1564bd602bf7ecb96e07f7fc46364949b5b3ef944245f3512c7752b747363be18cb822c0aef5ba4904c268bc53e161945764b16ae7ffdde1391781f8fecc278304484622808bf450ac5ca5819bb2d4a416e9fd67b6194d82d85aeff4796fede772292d0bd1cb742b10b0b613a53c613bce8077e39dedc502af47e0fb6c872bce00bfcd7d3fea14d03fff5e10c403877c07f3d8fafffc872ca108f4f45242f6b44ef28bbe3f82f925ea3f009d7b748a1f00365b2da7a6f916578c177b20caf0b7cd7d719803a77c0773d8b43e1f56c697443f09d74bd8b485ce183e477757555c70dad5078c50767e822e975d156f97018f9bdfb1669e4d73ba8919d9c2c67cb967f5bb29b1bd9188b8de16d7d19b640f0f35bff48b3482a2db2acb7f54e96357c7f3a03c073a7a4b7f5fe21c93d6bfd1107ed90b7ba67916595a1d92292eeb31e299e403b6a67cce4a00890bf2231f2cf0180ff334aa9fd2029891f1b500308aa314b07738cafcb393594408063ac76ccde185d7074808291950608368ca3173433466f8a668391750508698c2214514fb33ad200c20318a4418307b934965890460c52e377830fc8183d393ec861a46f7840c358d360638c0ed0183b30406862ac5b7800c4c892ea800553d0e2780206682cd102348ca08931d6343ad862a4657460c6c802c3832c63ddc28df15b0108478c314e80f0c4c81ac1075d8c303efcf8800e5acec0b2c6194a5db8d8f2410f638d0c3c9861ac29f062fca2e8e089b1b5841523ab08da0c660c7141b0327e977366fc70671c3043cb9d9fc3050f6a9871cbe761dd3c7f09fe439f7f8afff8b3cdf3cf9cffccd6f31f61c17f68cf38cff6f5fc44fcc7d5e3397cfe09e53f391ffb98e757c17f609e3d781e9f5ff6fc28f88f8fe7afe23f33cfa408822deb05e19bb499fd07dfc177e48d55aaf99bf748cbc1dbffff481cabe475f0b3af24cd2a75f7b407c91cab94f3cfc18b648ffeeeebc3480fac07effd072f439256c9929ff33c481f568926f3f56948259b57f2f15978b9207c4cc7d6c3c7dffc8b54f261affcb02989efe36bbe5563afb86c386f639568fef537f68a8c4de9fb9a97d97cec5b1f432ad9c4fee65d37effa98bde236251eff7a16a97463afd46c4ab0bf717deb29a9e4b25704605302df47cb5eb9b129b5bee66dec95984dc9e6e9c3904a32d55ea1b129d5aff9b657aa4dc9e6fb9d66af4c9b52ec6f5ec65ef16c4aaef7f19dbd02635392f9d7cf904a337bc5c6a6d4bdcd07f64a8e4d49f6aff7e04352c9037ba5655382f1ec95974d297c1fdf81bd42c4a6e47dcd8fa4921525245b8ebdf2814dc9e6fddf5ea1d99466fec5fa7ff227a9c481bdd236a5f16fde8a1292cdda2b03b029bdde87556259a5f19560af04f34ab18ff92bd3e6e3497be5c7a6c4fa1aab54f357a6edadd27ca57e257fa5eee9e3904a3656e9cab4d9bc0fabe4bdd2f74aac9fdf83548af91bab646395645e69e69578bc12cdcbfecab4d55825f095c257125fe9f5ae3fe2209047b94b43b2d3f865e4cc69fc3c48149cc63f4356711abf0c399d9cc61f23abd3f863481ea7f1c3902a380de734fe919c4f4e637e1749c469fc22c9c469fc2139999cc60f9213ca69fc2d52e6347e1679c469fc9564c1694d4ee3f7c819e534fe8e7ca7f153b204a7f13b39c569fc4d4e2d4ecb398d1f691ed1ba12017283fcdc73c738c284e25abf0a5cebf6c058765303317ee397b381184ba6fa619cb7ac138a8b14f10f054dfe8f6a4e8f6a2fcfa45d62087e3b8d51dd62d5afbbbb9b54e02245303f14f47abe4530b6a9b856ebe787d97236bebe9c512b98ba8d858bbcec7f2d8e9a358ddf6539b4207b5354546b4671b5519f8dba1dc5b5fe26b6d591868061b3aa4175db73652dc752e6e4d04bfc21309cf3f54114ea5f41f4881b97f841f44926065121626010751abd20ea43cffa893a5b06512d3deb328836f5accb8f36d1b3fe209aa567fded14fbf7be7bfafe9ef39f98a5514eeb87b1ecb40e46479bcbe572b95cee874659772fb7dd8b7b712d5ab468712d2d56fdaa5aacfa55454949494949b5935454545454543b39393939d1262ba7282b2b2b2bab693535353535f534f5f4f4f4f4549f260e377113377113a70277e12edc85bbf0f0f0f0f0f0f0781dad4d342a2a2a2aaafb69136da24d54ae2ef234e322e00fb59c862068cbefd97ca2962d6f7a36653d9bb19ecdb167734eff30ca25866054944b0cc1a828aa16ab7e54542d56fda8a85aacfa514545b9c4108c8a72d9b28ab61cc3a81b2515e54d2d56edffbca9d56255fb7969b1aa179d5c2e97cbb596afcb75aa5a4719ada202499d5b555555552555252525252535a5a6d3749a4efdd3a98a95959595150a3cc5533c35f33a3a6bafe7d3ea55fa51a6fe80538db2060093d314b79c5d3ab2ec926b531c8173458a3c5abba9fba0f97c51e0daa4f1cf6c62f1cfecd234c50880203272a4b9eeb41276fdc18ea47736f98f6cfc88fa0ecddb3f9b6617ff91c9c6b1cbfdbc26a70d5cf3aad9e7d1ef1ec67276995daeff6c721f6532dad44e1e0c40ce017bee1887986b1f0a5c842f5bb23d307a141929b841e1d77cbf47d13e6590f83639d7df6c797d0fa9f17d60017b9c29987f2e314f7ebf77699f92af626fbfdfc5689f3248e639285dcbd7e780742c3debb7a433f5ac9f243da967fd4f3aae67fd3864fb20dbaa67fd3dc8be21bbaa67fd3664d790eda56773d24cd9e43167a60ce9627817e7e2538e854bf916cf79141ee53476b716b0c5aadddddd44aa8f54d6a19792bdcc5cb3e03fb58ea34ce6e57e2587442691d9fd50277573924d5cebff6c39f3d23ebdb47be9597727f5ace7979ef59ca367fd234c25d336960e8ce5f40282b1e78e916f0a5c643ecf8b4596cb392c926ed95e5860753d4bfbf8f45cd3ed7ce1fc5318e2f926b2a9b8083b55d3d7677debc1ef20c6a27ef7a74ced1334ad479111059628ec68ca65d9a245ca072c9ca684e0f2d43e41dee58a1ed13e412ec6d5d597ebdf3e8c657b89baccb5efcb49e54d5eaebf37799337f984729affa4f3b3448ce564bafe93a9a96758faa7b364e99ff6c187fe692184e89f3ea29be8997f3b8d2591eb445eb6ace0d8126d2963fdadb63af27091cf76d4f765375151f97ca69d37a93a8a8b7cefad6e7a96fd6acbff9494df1677529df15f4ad99ca367d496e3d06ca367fe2328999dd481712289930505a5df7bffd510fcd68b1fbee892c17ebc8979988f199a5f24f3b197b132b11818d8f8728921d862d5cfeb6833d163bbab5dec76a7dd77d8c25f6a3d75dbf676e4bdf72fffa6dd1fdd34adfe47acef64fd47ded3efabff512b46bfffa8be077ef7fd51ebfd975a369817addf7fd4bd0763fdf74720cc78043ee85a6ad9446b0567fcdb52cbe6b256705a7fc40261fe1efda3eefb996a6cafbf3deb8fc0ff7ea9651bad151c97bdb1beeffa47fef4996a6c626841cb2dd6d3ee8fbeaf7f3beabe6b59fab72396ad7f3bf2af7ff43dad479f773beae891b7fd0e01363f2840ea03b8d93c538dcded8dfe6dc9b3f90fe11c7d5bd8dcde965c367fa6191b1d9ab4b3f2ba62aab1f9dface02cb53a6aade0dc8ec49f792baf1a5b4d0c667481b0f075139b81195d60cc0b269b81898d2e500616139b898d30957a3132638f99188ceb8fc21f6f40d6d7fd91f74e440f1b9a97752f93592b38b7a3dab2a1b156706e472d5ad9064db69b9a9918cc08fe51f8aebf2db56c36d60a0e8dccde986a6c3ceceda8f5333198d105b2beee8fc2f7bf1dd59f89c18c2e90e57f14fef7b723fa33b1bf1dc93cccdf8e627efcdb11ec5d7f3b7a3df8b723f1bf3f0a9f35637364ec18b31f636330f6066665a395bdec8dcbc6449bf347a17dd08e2dcb2c1b56fbd9da21f4df8e3c1b760821f41f515b3b84f96e6987d0cf7f6433595220fb73fdaf7cb074bdf83cfeeb19e661cfb18f29737a46c690dfb37e1812468ea4cc458a64488e2d16890433671b20b74f10578d4145b8bae38eeb4135280c1a836241b2a09ba0b7422204e5f8d5d51dd7e71060cf1d2351918f21fe21d60fd51ffa7ec8fba1ee87e80f157d53b7bf0809d16422b6e5b39e8865cb9bfa44d596b2ef893e5bc6bc27f26c39764fd4d932ec1913515b52a9b9fe44fddedc6da9ccdc69735873c600e4f629f2bca2aefba12216ab55148645afd758040313f345ee324533333c8a643f34bf48f643343688686868841186e60fc57ec87f08f643ae1fa20fbe92fa4afa8766dbf2f6a4b1a56cdaf279d872e62626634b8fd952068bb1250ccc9631d768cb97cb9623f8546a405b862d5bb2a8d45cfa546a6e2da9d4dccf96df16d7f3efec10ced5d5d5a5b6a45273dd96df16d7bf34f2ae5b2a33b7ad6cd227c09b1eb3c8b44c33f3f26a6c280f598d89c9843d9b45da8e21172132a2b7fba1d7a532c3e2224446dea53f24c2a512bb5d1122a3befe437ea9c844eff95d9e8db5b80895f07645a8d0db15a102738b506951e94bed4dcf66112ae3eda7e2ba5e848a77dde6f46c1669eb47804c9fc8e87b7eda7d5eebf96b6db15ccf1f82a14b7cfe1136fe2bf6fc31d78589bd917763de68e60ebd2e8fe7978557e689a8d0cbe38de89d79a3d81d12e1da1019c15cd91319b52ecd1351f1aecd1bf5ad792222a3f1fa7822a37a7bfccd1bc9ee905f1c2223d725a2d217c736d7e61b7977be0fd2b936bf0749b936ff86ecb836df8664716d7e0d59b9369f86fcb8365f467a5c9bcf830cb9367f8604b9365f866c716d7e8c7c716dd66a23d7605c83e1da0cd764b816e35a0cd768b826e31a0faedd70cd866b355cabd56af3917c4cb7ea26a9154859b1245585941452725f4460031ee478aafae28a10b0ae48828731368e35a717d4000c28a83881162fae08afc8218771e6724eaa885b8eef6b744edd690f358c327777291bae63b1b9ffbbbbf70da3eb724e0a861b5ece5d41c7ed2ee7aea8aa01581241dd1e21c18f449090107fdb2877fe5123cd1e01acedd34dd6f993e79c64cfb9022e5cb8542e5c64df5812b9a38f7fe3e0e978f6bb9c9e7161755688e77a9ee7d93f03acb4769de75531c6f5aa80010c150b1876f0210926a82742d0c515705cd1e50a29afbb2e2d83c7e58aa4eb793ef4522b1db9e08d29b810e38c2fbcb03117ae250fe74ca29e2d5e688163ea06343eb0851561b0ac30e3035dd7759d155bb07458baa2b5250b261e991552d430bb12b028a55356f4205af154831532b8acd0e1735070cbe7f18cc86d69aa62cb16301a872e72d862820f6879838c2b1b6dc1a53fc271691572e8d04ab1cbb92d465cf0726e0b102ab83296fd749bca7f3c2fb3ca9b534ef3ec0b1eae8b6745c5349ba6962a4f4c3cfef37d7f49a47b1b25df69de5447da34807ef79d7da13eb5b10d9ce1870485044c9bf77d47ffb347ded3ee864403e61b245801ce569ffeedc8fbefab3df2fe85a3cfe25c0c1964c1d9e8d3eefb65fe4343701cd94f651f71e73fd934a07befbb299b06d0f79ebe376d1d3992b643eafe3cc0e33f6de3075f4f77faeb5d4fa442eb59df302caa70ab475a01e20b302f3a6883bd5b2414a6c2bcdcf994eaceffaa5ce6e9cc53d807f3627d507c5004ad4d3fab71534e9b0fd3c5a6adee7c5733b55337b5963bbf2389ba17c1fa300f635f807d7db689301ff331f685ef619e6de0b745d2b18f817dec5954e1fb986f62baf3452d777e8cb4f11ec9167bb02389fa55783debfd895468bdebfd871a70033ffcd737e026fef8ad07a7a802eceb4f5185ef611e85a4fa30e1d787b136f4679eaa386d3e8cc4d9d0e974e7cb58a8182975e7c790365e54eeceef4652e634a2a27987868814a0801f2252c1a601ad7f7dab9f48059b06bc5e10fff56c83f9b648baa70ffbef41d8b3a882f81f0c09236dfa916cf5412a2a806d49ad7f3500fcd6b7a882f8af175508bff52caa30da97b5f1774d89644856929dd6226ddca2c01d42974ada34928d9d763422755d5d0072775227c5643763cc47d9181bc7366698819513d440b5851646884ed45063e3e51c1549b0018eded9efd97432a767b418dc510618531da0428a2c7ea82148a25688e7765dd7f97377871b556429430d2f6164810596ee061afe676b7ccefbcfe83f9ffdb276dd8fb8ebdd6ee9765d47ed1af53f27bc9ca30204b77c9e6e066f94c5a8e8c0951e65e5786354d8304367a9b8b2e44d41b798428c18a618c30a8fcbb929d0b8f4726e0a32b8413abf2fc3eb799e57dff33ccff3bc8fa43da39ef7a3ccfb59fb08f15c5a1b07907368bf0da57d3bb8f38914a07f2ad5cc9dc0eacea992e7ce1c0a7077feecce2a140c714b2377caeeb4bad4fb3ec08ad50c99c21e1083975bdbc7610f88c1a9677cc1c9ddaeb6338e31e672ee04572e4f39317af7a5ce0562022f2935c11b9732d9e8c7fa87da28a5b3ac945213b07129a5fea3db8e83cb39135c71c5cb39134071cbf1697b1726f0c10447c891e3e58cf096cb43faa7daf87352545dd8e59c144997c5fe233ddd18633fffa69c1d19eb99900c9c88c1972b1a8050818d5e71e98fb92a2efd9bfee11c0e8793c1463fa77fd8466de95688675c63e45b8eb7dae6fc26c79813a3783907051cb77eb9e5f828005fcc3e77a6902f403a521b92aee58ea45c73bf8d9c7ba2897291eefb3b2e22c7954d27e9144e97a7e8aaae3f38d4fd34724e055d9e6ec9530eb502dca5560ed573c7d8cf391574f1efa4fce7880aa09ac65153b92e5254d75530d534be65e7e5fa774efe43a7a895ffb49414e788102969f5c68e366e8a8bb42dfa7ea8e8b3fec435ff69c535fff9d4a58318dbce2f5c73ce498971cbee72fd5b88b1ac01e01f87fa1ff6e11f0fa54da8c4a9150cb4899a041d536a06680441400353156030482c168e08048a26d7f80114801098b2545a9fcaf42888814a19430821841802000020002030334c0002449b3da1f71f290cec0d6a2eda91cd9c18032ff0dca5a25b87109f947ed71b47ba08981d9bf2eb8274611b9bb453e3e7ac8da1b052cda092de2ca54eb20d304da0082804cda4a1f3c20b1db431f06a0187aaa837b4efb965f92729070114f4bcea59b995635e6ab964472cf4a36ab4b19709c2ca9de559662a421ffc529d1a7b238b3f2aedbd15738daf14666fd4f24795bdb76256f795d26a6f84fde51b60d7db9446a2d08e90226a9d8d122b1a6cb88ea4185e8ab8e828c0b547bbd13679d2e8eb62008f3df7c003341b2a56a1313c5bee8c133f55ef2b6be3a8f64de1d95bb8527d6f859fb221f71f6bcd8b6c8a9d7e5ae19cbd1d83b6ef5dca812c912fb71f29ccf63e3881fc2ddb5d2cbf8e2013a84318cfc5ea0ddb63bb22e7865cad61f213d625e0059b3965d0d0ba019f1b9c8f463543f237858748ee5ea3cc8ce2e9169db250f69c42c4957ef25f05bf927d337805e7a9c127a68ab304437b4fdf1cec75c4976720c5cf675cbc7c9600104ec31deab1daa6da90ea2e68b2d3fb183b47fada1739a348859ad424dfcd9b5a51a636050bdaa24005bb3e09d32a06af898c3ed46bd7ac2df71250bb69135da4b3230e9a600952a3cc8dcc1ef833daf8af458999fb360a2a0b55ccab6b747098d712665194cb54527b1c476b4e091333379dbd6d06867ef58142c14f115b2b940d25b4d25e5dc424683aff6af940c398b7e6d19b796ea7247d57f6f1b29f5a3042643962d66c46aea38ee900a581e4719715dac6a44d115c8616ed20a5c64ae32713d2162995829cb618dba14a67e654b9a7aa0ad972cd3565b969a3ac543a5ca6a717047923c352c8baaad3acab74ac18f070c0da4cd214b5d89b3bab2805208b9e7870c36ad252ece6816850c9a571009a29569705ebaac0e73f4d13750b574673759a8e009465223fd72f4de9a84d861936f12ed4982c4395d1424c35e51c48136a3bb71e1d79b70b521edddfdd699a24380f1faa9b9e956b7b3d41859a768f66a9d89e720e4ef1c4423e57ef896749b13efdcf6ce9e1356c06ce10e06fa93e1305e565f67da0669b831e088c05fa2f19bc2ebf67657f7d691c9ce87d1f5761c8bbe256fe5cb3f027af104fab7322ded5187c0c5e42ee42ce8a270b5b252e3f050235054a7b7bf28ab5bea6c6b4f4964b56e2cb65ff8d2cea2a8a4b3f71ed05c0442127b2aa9aa3d5949d533991365698308826d8568c9a443f916060611e49de48596136deddaaca8651c4e1c762906a01a1b40da9f7888ada2ba960e322b592daa3de0455ba1582813a54d77f8d896cf131506088a9bba9f2e218a5a46f5ec66a4faf1697b1753c30fa2d759189369d38b8d6059246990ab474780e435d3f1772b935304f056102dd56386b9372ef6b781125778254d44995bab3eda025a1b15072bad43cc1afd5682b16ce25195ebae8309c013ed5bbfaa9c7820349259df8681249971dfd2c01ddc3db884b424f3a0126be38a999dec88aa3d05b904b4bd83d2ee6043c1d394cfae52f77a340521e074963371f336152fe576a72774a16cc67fe0188393e5257b75f154c9409184dc7882e8e76c44c617f8bbe191a9eafe4d9243cae15e21df29d5863ca452ef3245a288ba66b90922243c5425aba5c8c845af81354dfb276445e7638df27521ac547dbc3cba9a395ba982649ee347c062f49167dbeb91b7d93f4daeadffcdf3b893749e28ea96747a2251dd12dcddf32d81258ac5e1626fd71cad511914d5d789326ef8c6c39e122d373d120c1974946253fc4bfb63eed5e467fba65f46440959dd836ea6d27bc4a21e599bf34788ad8bd92bc90f8902deffc3049c8b70c9de0629f23c561da895c73531c7471978f3e349ec1402aaeb5a6420bfec49334613ba38eb3267466eb8ce8d59adf4b3e7fa89e2274c0b2c1d5e34047f6fa091d695fe9d1064ba530cecb62fcef245c4b8f43d09f1cfb284d2456bb7aacc819ca1888b7dbe2ca0ff83c8994bef1da1806f9c27a7ebb01f4066e489df2076af97793f05fc779fded8cc8857e1fa2017d627eeefda020eaf90d931dea0bf2ef799e2b75c10b0f8c339059b86124a8db6a81dc435fb43b9890082202d636438c8a86aba073f75df8e3cb00f25ec6f0720a6cd342f71ee185cf3ecc02d4534e7487cf64be6feb6ec18d340400426452f811407ee619e2f0a440bf0d20f1252a42c6506345663530c1585405f964c212073a6ff8b86b0d61a2ae9c0511f5e57ec7bb433e6514688a56697d15b4c70ba4dff9ab8ba44f7a83dc758e4cf30c54e781d89513d83d6c9915014b882ac53f346c1c4b54bdb424b3db0688c95498cb9cd1f3912197cad54afadd7992b8f40e38baf374eb32a5e899740e46de3a43a8f39bfe7c9f77fb734e886a2212d4c175032075d54e4f44663a096901c81b5d71042a0f83841fc18dcfbda063064b2b09936097c6d75db9116b120847d2f7e01baca50e9ee5276548f69e0b460954143ed52ace21ac28e0c83f9e3d68202df581b25a558ab3dea6f7903571f32706ea6f46e7d1e53f6d15283d8ec329093f492b9eb51e5911020f4c6275593de84cc4fa54886d513dfec010bf4ac8111316299d70238b13cb64835f4849c7656d2e0a85cbaf474a1b9ef97cc84dbcad93e7bdf19c407ddfbbdfcb660f84cb303a705bea1c8ca65fb7955df5a2799b464b5499d4ffb010399475a9bf24a1a5aa03ef2c7dd2742b2336842a1b2c0ad87730a7c4ca3f80e15e3855f446d650449477629f313c4f6fb4a4217a4a3923e2f24408ec1d306fe55d3ce2f2f74536516422b51e0064cdd56b59be5baedd1e0d3f181055d0133f7cc1fe93eaa5410f74a11b148f70902a9f4e2676a6b4ac09fe8adc5f2a4f92aa5b8eda56735b937214772fda15e585d2c2a28777e3e755039e14322c5e88726dd471b446e35431e4a16d93141a72c3cc5fc1e0ce7731033d8ed114ad8b28fb8134a6a282c1fc20b6c5bd8caf1dc90d42bb6a4b01633d71b7b117faef2ff0a21c6a04c3e80736d1bbe6e843733cfd43091f91d2457f54f5355960682c21079aa9029fd89d215e307f6a4302057a57c42e62e034e52adf29c32f54f2d3d99d80053b9635ef497c564f733fd658c2b2819f189c57e9ab1ca23f1f2edf474eabbaa0371d966c29c6a30ec7cf09e866b7f88dddf0491ded82d9750976336d482c070633bb3b74b3fb1bd64564faff999dc059947cee8bc9d7815955e5e7a395c65a9988e184cfa2aba11d7a67263257d80c86466de8f6608bbe5ce27fe78cec69c143a2f2fa3064b76765d5c5d29e4f467b4d60793bfa8711d61bcd37bd612e548d115f7e3601fb39192e1fc068ec54b4eb8c9bfbc03f0d32c346d587193b8ea03f89d7c3b0388800ce66685019b0302d438b54cda15e038f79fc73f15bba5e4eefa3854b37d6ed5b9871a4c68d574525fd6e5007eac2a7ab425f0f09b43d6b8bb407bdd007d57dfec15cc52977cc66dbd6aad4cf6ebb25c7c66c7477729dbd1e4102b4911dfc436e9c29b3aad343aa41ef334246749f382e62d8d479cac350015db653088a4e93b24be39fa1beb8e1add7776c9826d28c4e8a96d554e4e62560277dd21e413f73e700c1b10e90a442a210b5c402d206d083c21b9b9a166ce94ac1f82a51040b1f3125afd009698a7b3faa49f4758298e68b352fbaf599bcece122f88bb819e604cc23088b88bd725c06333d184a2fe4285c4adb755ee942c78e0dffe0ca705cd465f6cf41406053e51ba9f5d14894bc014deaee964462db16cd2b60296041e8c4028d9db38eb6acb9a1451d6f72e963f8a96bb4ca7913b7e16a174162118e1d94dcb0593f660ee859b9736261b26643ce67ff9f7cb76152f0f222db9042a421a9d4b642938423414faca9aafca9ac52a4e42fefe1fcb3a9769c4daabe989c05ddc21873df5c3296475701c66f8e8e05e3e4626b0bb90c5c81913b61afcfa5bed9f78b5d667473e9752ece61a6b78bbdc0c0f572d765d9e2566c5112dffe7a7967743bb8568337ee2c091e2cd153c350a1ef642ca8e59a70b18be35a73b227334de8796aa5a5f908ce82566553f0758566843c57684a09a19e832946a089080e73ec42c0e15dffa5d3fc3a22ed6eee702894ef04c694441d3882bab5e3b19b77bb39b9134f94c88af0dacdf39e785c32ce9e98219758ee795b329c4a3283c89609c765679600e120e0da74e43590531452a8370f7acdc890af227ef833ed3f89dd90c8c4212c55c15753ebe2d2d9f8d70034966d14f77a869443d5e7dd4f25387ce285d9fe78cffb02122ba74e6ec3d7316672bde6f746497f635c08deb205c8fba9babffdf05937e10c0ce4b7c43971ab6ccd20005665d40581912a831504cc53d99e2078a2609b21aa271506b5435301ef04c6d6457862dfae833c81651b0f1ba9dcc52a791f2aff85393f5d68a7855ab398698775e08463158fb97bbf52eb4ee24fac01c1a5354f3d257ff4745dd952081fbdd08ea83dcd92f6ae1863a07dd78ba04d4290fed64b1c6014814cd81c90ec593fd8fc8c9e66b6c4284518ca65711cdf049454e5a59a16f34e93c1fd23c2445da0b891957c66f9b7466cbc1fc32b0a382351bc5b631b89834eddb2a8d35d2c4f2261733aaadb940cfacc87c0403e7d8ba238d3f1314c24f4941115f54a5041b2fc58816ae3864ec399039a91f8502577fc5e9918a5c0e752ab49da983b4b752de08a80bf1d76cba9f556393aa8ee96a2d9d76f3a8fec390782b9205334370d4f25d0f29510e2f471c6684044fa496ac299c91e9cf4dad132aba8437a109d4b188b6381dccd4af3d725174dbbca4ba552a85440ef9cd9a2a2ce1b0658827443de4eb17e69e3ebd75c3eacec4710b3ee4c188d391abb468db4fce44553bfd415f77672ba125a64755f54e99547dc8ca391131c80eb8b647d9f2b18d07b17d015be5927b2a40a66bbdc312e16731e49afc6efadd90b887593c8f0b8ab7c48a8837d2918e7b9b2ce4b12cc5211481b78b474713c641762d99a8aa0aa5fb258a62a393fb6320e78f168251db5e5b57aeb0d02ea9adcc80d00245fc80b9b1000f99ebffebcd30bdfd3fe403aa53a590a57f94ebb7d4511a1e9e0442465b695f028e6eba26cab08cce4bd653d01a2494db4487a3dcdc294f84dc59c341ce6f57c976863b57e1c376cd23fea5c09ae5ede3444c64404597f3f3700f12dc40fdbfcc89cb974adddc12545701f469326f207c133d0e620693202b01a031c8f102835953a465db484773104294f553ce22e39a560466b228950fe8594d689cadaff46a6b27f4e6e6b26313ac6365b1a27268a86e41bdb58d392abd83920819849a02631c279e96adda9889d39e3be786535a4ead7082aa2641d98820623ef3a77bcccebe6adc609d7d2eafda7efdb410b95844a8542b575d27ccda880f4c430f8c40f9ca179b09fff92163c85214f868e9a91fe9dcea6fdc336d507b73aaedbf3275509a8ddea008f3a04e5847b6ae6b006c7b4655231cc72021e81cb57cae946139c848cf14f3eac4f842b16b066d8e2354def71ae1498e3b6dac3375d7f1653a41de6187acfef508754220543135350ca52ba889eabb99aed267c66d7a7627acbe02a279711a81bbebaf5eae1c9133973f49e66f9c6835bea8ee90033c0dcb5a3dea5ba9d7c3a65c454448d6eda84c84ecd37120b0d8e18f3bf1491ae04dc9fb8a980d92486aaa7ff1795f166f6ce68079ac865491a2b63250b5eb7728acfc0968cf9f753ed242c871a6a4d98c43393c93d281ecf57fe38bfbe7df0bbf3f5cdd764dc7cffb471273a2c76a9810446a1c374f97bc526978649b85703a35e6a6e02429332ac0d99f08a41bbea26920312ce7a72d4ad4bcfb2682e1d1de0174d36aa0d34abd484d402463d7916b493b31c135971183a4214ae08f2ef4c8d5b16e2ff523225e1d5e2c263d71fa0b1e0e2b9739fbc53e46261cd3e6f7430c2baceab7dacfa6e80f3c78406efc56e47a642c4de674c8b5d7cd35161e98669cd281daea8be38ce44a3a790012e4e78f2da5c1c0ac58c0340db48d6e7a1e13255ead70dd2e4a27c4d3af4bb7a517290d679628884204515a079c8ae88ecb4681903a942059fb88880ddcb8d47415132e20251249bd05aa612adaabd5cc0832e680c9faef141a7ee4abcf6c5613159737bc49cd19fe629a5f1be80b35cf8c79d78d591a96cb121569ae5c61df116e892e4090bded4b1b15628c1f85e2831f5414c8d0aadd23e8950c7d3694885a57ace181a0bd4b93dd6742033b4b982c5cce4c66586c3f3b1f682a9ef939a64b197e260b6c5edfc670847719916f30c7127d7b410344119fa2c0af3f72066cae9a77af860fb5ebbce040579efc9174301ef5ced5da526b5f20689a7905da5c733fcb7f638ffe874cc977a9d16eabcfd6f82734be5bac2249c28ebcc59e54a2bad5c69e546c0080ed310755e92eaa5a74d9537f8921efbc44ac80fa2a7775c46ac323495bf245eec0a02e64b99e2e6f0acc6f7a2625bb6d81124e2f7c857d09d08c9f065f0d70d78e3aabf2c8fe93268e87915e7121768a0c5dae4a80b502002d86d462394dfb084145326330cf6ed07196d69bd5ce3dfbbfbc629e78ff792c4071317a6dd87cd79fab4f436a6ec909a98233ddb29e058b802a16b4c66d537bac5c8aad17412ae3d0c3f3a4f663dabb21d51b393a96c23e41cf7acb5d10044a7e8146bd97e9f43dba6bfb67fefc076d7826dbf2fc01672e0762c4708c5cb2088307d946e52d7cb124cf662a0cb003702adaf04c0345175b811ec78bcd83989788f4e1b4389789fe4dda5ee4d74da8d54fbde74852312ea0c790ec4ce2a98a419d4b735def0dc3f20e6c0177c1f676532c82487b1d5648541255404d0cab3c6bbb9483628e098e6e823a18406276b89152fddabe3ab79a3fb063e06277a710a31197a50d815da9ba850d8633da651e85bf2945d10f58d559a9eb2790fdfb65c841e04bd5afc866cfe55bce1dd1738d1d2526e04e7fd7e59e1a35302c3511cf560c8fbfd080e1da8b05137ebb0e1ee3afc97bf49fc18031abc78bb60536b59514be897565860f2b22db46d52daedf17e0476a962ca623042a2a79ef79b8f2815258014be8610c01b17c89c7a5111ec4bbde5e67255f7ff18b4ef6a23a5e2be22186c1256b5b985809773e3ed2de021e8354add2140e28e298e31c7b19feb0c3fe768aa8c33f9ff2c6895f2fc12c01713c7147e1ed5238b6f429e70f6dd475e5f2f26645005e23ca1bc15f2872c9f985331550a198863031a98da57103656a596bbec59350157ea33a60d0428a78d711bd6a807d49371cc728c1abfb8a6aae18c34d0b2b36fc0533f4c929d6d01572763904996ed490ff3f41c37a44fa6eb8993050330e71b5463223bd8b53788cf6f648d7d2db560290c1051e6450723fb978a0c213f0bd1af931561c271da4881e8397c02f79b1a75b67db28d6f6f20051bdda420fd7c4612b20a3cbf9778f96301c4a70981940a072d2f16feae28627b44a64981e84bd589c105d1406eacd04b583fc2d78b2162e5c2b6b32026ca2794d38464d52211b47f2101ec587dc58e470e0b8bcedc70e31f5e02e2ae12d31f99fbe766657e943ccabf125d627343edde9df62e9de6a5b5838121e3f9fcb21d66a893986b295dbb78e95dca72a153110bcbd2efca9f860203b717b06e1b2a2640dbd133a3c80d3b7f474f176898ceb2b2772e0dab1f460367f61d11795fa715b91d3f17e507b47031d7a432bc7861d1f45db58651491bd0fd197a30a51ffff9fa2ccf40e934aeb4dcfbef2fb76d4e74c7233840be7bb858202832b39cc70328959c10045cbb234e06a2c1281acac44e7a2f84c7f7fa30f4308bbd045612a72f1377d55dae2ba29ef36bc95c195437c1a2cc4313c5528f6790c9120f38157128e41cbf10406a72b85e0507b7e1228a3f2a80e6b85d29554fb1872046ed90deb2d0e170023928856dc52f3671e60d928cf63edf42886fd2d4bcb17359f59a07ce5048edf58f6fd55965d770220ce1fafa445a0c11ddc30c271540d3f8135d170bdba4ded555d8ad4b3534296f2b0a762da4bea83d60d89373d5c742bb07c4cfb76c0b823edb23ecf1871ed27300461a3d38e360ee80d2e338fca6ad682b06481e8e83888d758f9c4f37764f83d8ac023944ead7e0a5664559e8bab6451b120d42088dce7ada71cf4a1c3bed6fcb48193d39482b288abba24643bcec7442d5759e9b3094c52dd1a1390a166713d6a0a37b3c7350481b187e25d71cbfc1feafcda1eb22b5d8730dedcf9be91adb6ecb16144a25631a496c5c66ebcee41d00b4640003eb9b1d394f5f8ee79736e2929ce3791b1cc3df155e6dd80b2bc7f91ad13c1997874e15ac12488acc3f4b56d50582f0423087562b03c5e14cab16d17910cd795ed4c93e496aec1c8e42b259af81988b6fa1b51a5e488049e14d63290d30463343ae3cf120486af08f1c0f37fdceaa01ae14858b4a7b33a1b33c1a12588bd226edc4b4b9e1950f63c6c1b91ed74cdcf08498cac054231dfda990740021df3369b6b917e083f70bd4650c5f4debbf50c304c2c02920f1ff289abb20c24c23f22a7fd0d09b3913960cfa389173cb50b1f33181fd6abcfb34618c82a073353a14dae776fe127aa44a747296904b4dc0cbb7d2462e042552d0f9a7770e103a780df978a841f8cd6e4d18a91eba4e27d15e4e2bbb5fd1ce94b332fc4737a572399f759f2d2de70d92bbdbf391252b54d4f9d2a85d6aa832c5ac0f259bb6e013ba2f6d387fdefbe287834c341e91eaa162ea5470ea969e6aeacab5edc457b0bfcf526f0be7d998d3acb54876ee31fe93b885ca08e03fd1101a9f6283b664cd8b66f7ae81af8c330f168269a3a00a2c0835be103c2365db06607e1b80df50733be2f24002d1af85080efdf2891ce24b98475708d11c44a9ada84e8ec23e5b6540f76a277df5beb0078ff182e145082c0b48e70b745ad2651bbb70bc8e4a44da8bfd261341f8b1b9f0eff3f5bf8f4cecb0fe8637b6414d0fe7dede56801b0c153b3bc732fe6905419785c47e72f5c74dca782f222d82c987d84d46c3f83849577f2f1312d9f7c43231455d231806b26dfb51d8ba02fa1be8a6899e3eccb2f5296a1ce3657f20cd4173ab6d5c6642f29621cbff6f5f3ffef84151fb5da5bee1f5de807e861ef139f4b5d0c8eb07ada9136931878d4dbab9de4a8a783a8672f17e87d089e3d744b63154270cfa78a78fe1cfa704129f5fa478885f56fe8e6cd20e377c600fdf148f36798aa837e0bc17ac305960771d14666f739edab5822869e9f5131173b050a24d269c7bc12eef2af6cfe83165b10677ec60f740aa0e14e8edfa28e6412999eac68e15de1d1fff9b82492156030b289ba7836893213fde4d4ca4d6489c2133a8332edc8f8e483452c05ab127846b65fc5930b858c4f6fd0adc85e18fc675aeafc65d9b9ced088ef36a8602b422833128d4263be2cf94612d8b6809da3fc68f4611417b55ea332ec007171df88497c2d16f589402e30bb79ed859d31d9d83f6904bff7f2431e7120b7517bd94dc57fe1ccc3965094d4c8e8be8a2e5481b575cc5ec4f76122c0318b34f5ea50322def9c366a9a9956b9089d7326c330655b82edbad92b26b29f2fd87ab40b833cdcc711dfc62f9cd7bf9eb0738d4cbeeeec7ddd4b6015639ebc1f7d1c01f716642d54edbb40c3a5c5aa960a7dbe6a063966885fa62d49b28ea00681281ccdce548ebfcbf26e751f1b299a8dc3c21023195d54d3347bd3ce61a69da8605f89c6d161737efe6b5e527544cdf3827f3e62ebf33a7d7520031b79f3b8967ff40822c9467bda6d2bf3c06b0e5b42791c3b04db66ba7aa48f10424ed7cb763ab0cffab6af5e679af3183869c74b4e2f63d2ee48f26712972c2d4e1e4849dc4c75f7a3100f5a165f5e15697dc70a5a3ce1f9d3998e8ee3e110c87ef83a5fbc2a20f64abcebe87293ac719fe5b20ac2afcfa7dd558e9be395d0d972a074512b12391d7a856e1eab046b1542cf803f928923f0350a1d76efe4800c91d65eb9659b051104f7163bedae3d2157fade540eccb48e49522780ed91c88b4882f1e6d5a9e4e956859ef320223ea68a57c7bb565981bb56086007e70335f42c08ff6d1ce6a24850a91251ccf43e9b9617100fee0f149ba9b3bbc944eb403286996ff9774228e77b6f9fcec469e0a3704fee9f7077cbef9c3e93117f8cbd5d915b3c53ad34a76cc7decdc8fce33cb69fd1a3db3d11f9963ec58c302e7288290b5a3614a0be453e048ac50974dcbcf9dbae46a11a2d01ba9d9493d386007defb4108f7504d77601c4925a6daad1c5363942e014ef97b2e7dc4a6bde641f4abcd86c5c178ccae69e39aed0f09980653a7d598a67d87587c06110e005a754854af55ef79fdf2034e5efba7bcfff842e16cb8ad4f524331a30ed6ca4b7d121bc637b804f90307a5c9175644db5e0917add4308549dbd5e51a4b45a208df16be7b50dd54e58545da5ec79bb82174614fea40bba4e5433357ff87c143611e007b7ed55347838820b5364dfd7de952e6fd5bfb344420f8ecf3370f611f1b8ca86c9f1dfc5151f5c3b3de30d55ec60359d2292e926c6a7595f5dbc7300730539f47274c2ffe43306cf8ee6bb2b18693b1dc4095bda26f3360a7d247ec03d03693849c8e3f91a802bad6cc4a9a4620f93c0d3e1a4c744c6cccc1d7a9e955431c43649497d61f3d162d53379f79cee4cbe6bcdc2d61751f09612519cae44ba28c9d9c481806c777a2070465aa43dc7b50ad106e6dadf39cd189d95d647b22a8ca6d931d7cd4da0bf9fe28cc59e705ee3a7e3368e5df8e746a0540ea25c8e769f6dbe1d9b5ece225b7c796066500bf6ebc057520700e429d65a4bf05bd72cead9948242ae7131f21941a627a08c6ee5635749207777ec455eefce4c13a8e956b4509c4a88bb6d7190c73399899730719b5c97974cb960cb578e885a1e3d1e1099dd25a1565d2e3cbce28987d10a8a7d9125c41f0163c50d7bb3bc7eb4a9bec9cc4facbcc08e202dd50f820bd081f446fe007d35b7c60d01b1fa136a46e92cf79aefff226dc939b539589da8912f1a6b4481dfdccad4b23ee88ac7312ca70d9b3f2073aa1a579d8fe7573bc7fa2bef54c696c6fdf7e78d4519e4c70c0c24eb83497faf40dad191c6e70faa3e93ef1d4c0b9eb43ec8716fdaa9ffe9f2dd04c99625a72e36f9ac234b0b681f406702964653482d682f1f31fef22bf1fbfcc0abb32da30bc7887cd6e1080f2d610fdc3c070a05da2ff98797c02832842b37a31486af908247de748b1b685700e2429d718f46ca2b34d19be94d8182562464ef17dbbf66dc9a516a2ef0715879561d631f86bad67db5a330f5d3143db4864349b4e5e439e6a145353bfca7928f2feace6eb5e4f935d923728bcfb8b800028ef0487a83fbe1b680b9a91fbc49d1847f4b0bc6d1d810bd1501affba3eb024258d5b681c5257f7bcf598307101af3bb497916507da43ced9205c51360fdcfa0ec6f9c3d6907a49c3944942ed6b1403321c3f47189122d85e842c1bfea28ac0f786ea654cfca4badd50bc7521af9093e0bb0ce3af8d27af12451912a7e03f9ba0884a04a6f63c436d3e690703b53f8016f8b6c884824a342b9d4bd811eaa40f474e30e1c54b7ce52f91e860f07616aac89882820a69da2f20aa2f5a7e48b6ae869c82ad837cac55af7c9e5a685474730c7618be629379d8a54b4bf5d6354c2dde2d975fc749a699de5bcf32dfe13e06054df534d6608db699e91390cb95e39778d8f185a045c9a6ded78cbb8bebb23c9a1657a9b4865c78a40a224b6ca1b7e087d0ad7113b3ea9dcbf4e5c377949d01abf2c32bba86950ca4d43aa3e271cbfa86608830fed8589fd5f57021ecbd1e54da6438a2454ef04a642a9fd42f4fab6590527517b7dd68956e86bbe299359914199efaf4397ae386da63f6c14e4a36c81f054218576a384b5108b23cbe4cac271234053799dacbd91adcd74df345dce2345c3a9707059cba4dca3537d37ee0ea4cec7a8fe6a79446e06814c687a9c68818f439d39aaeaebcd3e2cfe75774397f32430b66bd3877911495c0b90ec1f01cb2451211e8fac316c1084aca550cac2d1cf43f788f935a21c0a17b13f88290c543e6931996c1e25e5f1cfd818d68f1d718a14012873a7568e4a9c3ace3871dc91a530c3f8b3c08a115bbc421eedf719a144536195e12bdd800777f408e6e9aaf1d3b1b0bb87ffc3c94e084a0819bd9d3abf590030552b44ce0fafb924615dfb78247e8c7fee88ab90e7e2fb0f2f3d0369979b5e7fa727d6eb82cbceccbe6c2cfd363a489149a724e02405120bf626e544ca0fc97abcdba3054a11e20cee642794a24f5032853cbea21072372b64424a011e0df224280a169000737dc72ca147dfb1449e13e8e677e24480e70a695a9813dcdc5b1e3b94335331815de9e233d6bb925f0d7d308a3643d99d31fb370823cab57677ea5ad136b1b45c389b3894ae5f5d2f3b31d2ebb1e1d08906819b867c13fbe7975824bee474b0ed6c4081ae26e36685abb04e98ba00838ccb34b2f802a02014695e898ded7a225c4104411f9f92120a301c48795bcf49412e8bdce70dbf5198df4dc5113a9d52dc7ba1289e4b06191ae36940f6b13dfc92f6f18f669e92e0c3d5136c18859daa4a2557298b148187e29d8705f06809d260a3e5f676e2316ab31df76b55d641610ff61c97b823ed61e45fb25b89ad18d96d9168c1be55674a901cd7174e0498f1a1959721c12bf32c59a6d1b0b7acc96e006f714aaf451669379fb9637e82057cb1e8ba710c43ed117efddc17d4b67ecbec195561f8d195d0b51a654142b29848324853cc777a8fc1a561382e3e232004670bb3cd56762ae8341344618d4d47208f9ae5cc52718b08f889da9a97e06a80f700af8dcf73618428cb7379e7c5b5052b59918b751a4f32224c61a66047a9d609ef5cf7252744b2127b7b0dcd7f4d8d13419201b06df235b024967dc87a922b4aac44fd1ef94ca98805203aced89ba43710323d67c2ffd03dc483c224fe43dbadfcce5aea24ad2bcede482b31e9ab7a13b324162d56635f5aebac9329954e1d1636841199d58b8b0842b667111739611d939f35196b8329c0015252758e78be56e19c3f1d6e7b73d4973a07edee1c8f31d9f1d20c23403b2a69d1afbc501a68c5d04a537f5b6f7f7d8170edf8dfa4ea72f16891514b5d8cbb41345bf16564761d5c89ee29274db5a9a08350f6a2952bd1a9f8631b85a59ce5d056e32625c6c658d19dbc973c83bf165489269f42f7c502bd3c52ebad09cd44b8ab5e1762a868c442724e615c2e6aabeaa3e46c1ab7e6104a9f8312b55e914184f51eface583add07f9da6228d3b514c31ddbaaca1e2c5399ea3000df3342ae2ce01dfebf17217421e038494c4b3f8a52cb91b36c77299fa336043a349a2a5f5d4896a244afe4726e94f2f1cd02e89a8cc400eca22979c08e8fbee7aa0ead455ad470eec33fc85211e56fca0e18f50dbb16823a543c0268c73bdc87d7a13ad4465e7599845368875b45e64e77f9ac29910108941c4df04224bee7e0af26808da05b6f30a0d558ff366302d5b9441918617386790e390d43dd8972b5025c6c003aea8906482493b7eb6987e1c89e66b4cf8d66a6432f225636563d47896aa06320b538703bd7233d2d1529cbe7c7ee2dd4423412b1455299adba9e05be87f440f5e14012d7e44c0a70f243ea516758995fb4641dad229c4b2df55f4ed2569830fb84e55ddc040e7687690240734c5bc05981b9d3ac122aa490e35b08dcf2cb5ca0f9c3affeeca04cbdbedc41302e1f76e456709531f609d1747f497efa36735819d20bb73efffac7e9eff52b0b59e4d3378f92827dfd5044f3097f927bcc27172a13e535873bc7ee971f36e2991b3e5285ca6d09c9b166b6b2383a7107018ab6b541699593207c7925a0c5050de446612391dac6b634082cad3711cadd66844153421af90ca6ec7a352020316d835c08861f77717622817ab926a6137490c2df60c003e46831b23ed3539f988fd966b029475e30ccfdedaa30e92e76fdaf4b1ae25e58bc6623d7b0929aaeac3d7481d9575a46aeda762796905a64186caeb0bd257d996e9fe03c602b168926d04f5b3968ef45f001c25311619ac1114e23fd8b1f382abdc0b49754ab15076aff23f4159bd0fe8d8546f24b812f542c1fab63a0b775563536c8fab6282a5450a59ba64521d033718dbbd107e388c2a55fd0e4711900eb7ffb18f10f7f17ec0bc10d484c1f998edbfa3218494f575857949868393238dd66bb50341c84409381a5c5858a3090a9a5e3b58533aaaedaec495607d3fc465dbb027d826ee187dc2d706a0e058902d099e6bc132daee3c5c5e197d20835cc6942e849f9fd7a20cb3c51f707a9caf9af5c11c19bb3a83385cc47d78e1191d231f8ab3d1d9e783c7a17147e14f2e8cafd98a4cf8f1f9ffe7b1de3e8fd2385fe6e16743bd53565ba155d8b4f40320b9581ece0b38edf24bdebc6ba75c1fcf395c07a846cdd367357e89fe81b277ba6c89bf63ea5ca94e4784b72e43615990f0c0d770aad51c735ee622927c9ac3672eb2a61cb3aceea79f601296b9ee528c6354265d92cf2e03311e97acfc850799408287c1e6ea83720320c2a0e42edff504fcd6828da11b30e5fcaa543794f068cbf16518f78073053f5056c69896d91d70b7f471f180938f2178d0d091153276065fb61fe168fec0a4768f2e52ec14dc5c6281026d6bca4897d4a04f074a38b2710160171b4d2dd41e0245ef7da941f11e1c2d79d6ca006d018b395bfc52b92cb4473910a29ce103749da71e5f1feb322497717a0000ecda2e68e412d0ee340f70aab402bc7fabf24c05ecfed15496fd39a6b658b6f098bce75a34662085a725f364e6fc72b38368ca87693e2ee25a06cab2f13c10633ad73b4610a0edb78bab3efc06f38b29d3540aa3f72bc90efa1e3bf52e0bcd928af40844e9cc78b7df1e7d01f822e608089c4007f1578090ec3b3c1e9b25b89c2b07d48d6c7c7fdb0dc4b3899a32c7456fd13a8082b44dd67413911bf6bc98e8502520b8b90edadeca68de6641375b4cb4535fa9283490fc18de9d4df6e03e9b66b13103cc9ba7d5f3536e4e8814b5d70c2f01c7fb69161128cd4aff928ec7a4ab49e6bab1c7fe7927dc7adda2a08f0d1c37391d73346781c2aefa346499ea2e5d2ede2108fc44a03a8c38166dd0c4a95162db39cd9b834c7d804c4d3ab9eb3635502deab599d5bfb95d72b59c90614a5b0d74eaf9cdfd00982b5aeaeba9ccee837140dac541f5d0f80381e1a6a9730c4f8f7e8b592c539f96e73b7516b998db9b6940b65d5a0f0221eda939af58f93e7d77a24b06c49ff53589f8342ac16f6fc94ff29dfb4a585afee9ea933122e8981223bf3efd4af410088ffca42ee334992d706f527a8d8f9989af067e5a9a2cb1dcf0bea18232260654431dd51726d2483c29add94c217d05bb8f8df072f3290689d49212f3cea2fbc337c2c0a9812ee72cfb1d7acb55f9c35d61e5443e6aff8c447252f4aa7a1c1a61c06ecdca76b8edf64881827726e0601e59b5fb844b99f7ada63a13627730e93ec90310a41ee5c744b0c1870a1844a91155f0f08c4e160f9e8ba0a0decef6d6ced168987d707bfbb50e03073924d44e4238f11b1b9002bcf11b746dce92af119f877e66bce32ede73a19bab999413994040d76bc561c893cec7801149659b8ef301d6256931b573ebcb4b5ce0df690b72f8c242a9586967dfecfd553b34ac214c3dae889f4ff465a916d8849cb108a4dc1bb46d2e4753dc85642762e9d4283287ba83db9657a2e62004f4b0d620a89cb1a8784b54e34aad099ebc1ad7da627aba9597158639a5bfc526e68674a278d7b0587598890192478083dc5015f28582c8c423d6b7df57e2c03e92f99a19231ca14db9243bf11a8bab0a0e52b3bd1d4669e67461f34c00dfd0c48617bd01416c725384c3ab741c7f9c3b6da7fd521d4298563ef8353d0496a901838de4541b4559cbd589b083a13a5fb626ea4c8c042f89535ce839ab143ec88a50e3db04b581c7278f551a8a0c88f2dcc588482abcca00ab84d498b8fe29b401bbbbfa42a4cc226c1723dd88090ae5b22ba8917b5a060f2238fb5182ee2d41fd51783b1ce5e08f16626f5150a104e8d63eb005c41916c3b78ff58b8c4eba0dbf7ccec9aa6d2ccc3187a3a3c3e57243b0440e80824362fcfce297ae40bf0dffc84b19e9a44a14ae41cb024b9744ab18ede9e9e2cac6836fdb89bfc895a99275fac83c1baa87f0efc48166f755a68405144199f467d9e57b559937a996ae5a5f18f8295ee7db7a98a459850aeed35e90a245a0c6575de32d8eb0a2a7de98741e77e219d80119beefd82086712390ec8a2a37e78aa88704aa86a250c2f91d85cfafa9debbb80f82eb54509b6bbbe00e6225374e4a47fb5554c833ca88ba7eec656e9a5a403f7c0843687d500d2e66659f5ac6e26a922e047d0d0c9e25d47b4e48879a0caef173b279536eeea391eaacc1c095d2bce4f5e1a700839dd29cff2c1a158d13d28883594972f14f4bc943dbf18c1486a472445615dbf93f665fd7422e5b5382f6b9d148d0608df5f9209313c53139c979a50c6ad89841cf08101b2c6a84b18fab12f08fbfc2ca794c2c51817d67f36a01b56cb36ad8911d2fe033cc1359926ab888be8b04e6456ecd63805422364c752783210f6ea0dbfbf1607c35e9d40945be8d54d4d7fc90e7571e20cc7f8bda3b6547dd170a3e917606cea48db513251ec0129194d1342637a7ba2387ed867bfe195e002436a2f8f93fd2e79ed9eec513d79d2a185daa39101982a301e09c7c1c225ac2a62d9a3fb42db993f9a3f774e321c6843008dd08f367d3ee56f0543be85e04438800b0a64513803b6ab4a312663f544386e738e6f443e3fc04d0a4f81269f1ce79121e9f9466cad5c5eb475f26834f72cf718638528c3e086107f32ae58b8e29b3c9b8583796e9c240c0faf9435b770d89b007d2397b2746a1d9851f1b9c9b59efeb06afb1620d64dd67687b5745721b673c94adad2a4404c602bddbb2d23658d969318f449527b0f128cac9931845bfc300420011f792e93535fd3ea2126caf2c6b864cbb6bab4d30214e246464078127706dea43bd1db23d6563ced164200c029ecdd9e3330ef7d76092a4c2806c348170dcfdc08625bcb20cdcc4ad32ad2d289bf6af7d119037f605b5afbf130a6092e072dce1beb864023a9f79c5a3a5f98dab3a65515609b404d5ced7bc1375aa94ca605f68846ac4ac88bb194d6f6da7aef92c63733af3c43c30810409578e3d8e22d31d0b06283d6924c9bb4901042a939610c44bd3feb72862b816866ad20a54de52c01758813ca8b6ac36be0c97708225c799a837cb3cccc967080bfaed5163cf3d8382d0a7c5f482bfbcdf0a4ea2513670bc39a5e00fdf19370dc6542f5c3226d04b4d2c0c8a65bae7c481bc49ac926aed78aac0af2cb110aece11b8f2b6fb6cad716f50441029f1ffddefdce253c4708d22604a82b2f5016a63271cd02e506c7ee1c80cb4ced4e47f6383fa6eee82aa0472af9552e176672d5592362440923fda58a8509a950cad878e023c075f585dc3552eaa4af92367ec4659bf5cfd8e6afd04c17df69629aaf19d1855479b5f1d7c722602babecbaa9186e8895c4115b8238bfab23413046e63be7970c971d902fb5ca2ff4dec4a236343bea3abf1845c1b469d73a1582d164635cfcf2a04ec1e215e89b940fca1cbafddc50fca43805600a8e086e85195800ed609459d79690f4a0514c53c0f32c1c1b08222a1950c04972abeed430e0f17eeff06544212756bf8d66c5dac489283fc60846329da5412f28a0a83d30ce860d16f201887c0af84de974d009e0018964aff08d4a9fb14785d023bc804899568df516bfa449263b931b92fb3cd3a4f2708fdd851783d1362ca45ff38a0cded50a959292da82accb2164b0ba6e0d6ae606d2109b53f666359995afa62923bb4c3254b0bef114505603218e9a56528fef28461b3483249d1e9be49f2445b7a3b878eb4cfb1036ffc01f57ad9908c34da333896b780d4f748046462c192b269501842175b0e67d9d29481ba563f82c6b56f3421c637bce9bb65f7017c4cbba2ee7d9616657655095c1319e295d1e00c640eb26f2f431e1ae4587a4343a79b870d4528c8e0f69595a624599e938458ba643a20681980ab6970b017ac0d7efb1b5e83f1b1d1b063926abd58deca36d3565288acc2d4088b8e13896da1e46350c39c5e761abfc4703271e668c1059894bdff08f0614aa4772d9f72e40ca6e04fc34193503ef1c082e75c79095e9839c18185ff4a1551f946cd70456766db1d0a4f39e59c52f62cdbce32ed8a8d3dcc41fbdf155471ab636e474c6eed245703acd50824f44e0d6295915c1412371d0dd2536287265c93a71b58b937d47b6a8671bc106c95d7aab570c244ccba305e40c4d55127dbd9c5a9ba9447fb46c313266191a701c076b04f76ec98206554d22c4669aa6c85c0c762d20bbe3f6a9f1ca611594438f7895240610c58f75aad70cd75470f9a007a30d8b5a66b6cd5bcf836809b187d1ae86248f569bc749900106cc2baf43949fc306c496b9a6a34ec5baddea773dcb7be6e2f04e0e8839f302abd884c807aa696edf973eeaf905e67d6d1ec80e4026696ed140ae4713a22c64b59ea37cbbfe1b35c3ca0e35f07a2990236b360f30ad7e84b23b55ba60505cfdf008b59d44305570b0a6c4b61ed2fb085c6be5482d0a77ff94280fec16f228d04adeeffec810cebc7be2a3943f40c67fd14b0b35c4a3764e1b639249720dd7827cdb22a04e235c9299802b7cfea5b7e9b07a554046400639ac884ba9f7ca5c0315daeae4ad29a4a780f5bd9929780f771215b229624002975ab68241f120a3611a03619244c0cf5d911a6e70449cb23930c93c99c03bb04c229418c1d2547720e3b3f5f11a0e84f0f51fba5af4768708271f0d432dcd8c1f808bb517fca85b7eb18b4ed187e5fe7dfb29277cdf1e9b9278c766e79590745e3c9648a4a94b9f5111b59ff4aad2266bd4dcbb7515195fab0ba485c4b62bd46873652e4fe998bc4fe4ac1a50d4b0eed44010b2540927b78d2ef5310655f3234c947811482fd9c0c6cf8d57d82494189b66697dc8798404ea234f787ffd54f04af4e555e138802ff0328b4c181612b4d80208dbfe6fd60659c42b0cf8af21dfba0e02b4ae205ceb8d55ba19c43d801e50abce08d4456940b0b515ad01552167dd7149183d6d7fcc918d5c22d5a993660a5d87f30da0149d4d0b147d6e525d843a242acd3368170c7568ac5c4dc2c83b5623bc4197daa2e0a13c07552705d4dc3717ea70adad8004b6c51d8766d22d61599fb693ace46d0d7edaf0a79f426834864b8fc06c7faf4e63cff3dfc316a740bde3001f18212b212881d40245ce78e0ec4fbc0ff945338c6d62800ae1449d7404da370037535090fb2dc3507c93e817a9f9b5dc5ba646915052059b0130c385531acd4a53d6ef234cad7165e4983c14920a6b1dd439844c3e49a52035ee80c3f81caf89952fc057db6bc1bff7c84b99672ba5292ae0930bb2ffacb8c8c6eaacceb0de43af7b79575dc5e36931cf83f68165942fb9de822b40f64fb78069f6d9c4665b39d6c5a356dea6c7f23c5f638119327621b2f5921f5a38475344a68af2ac4c0f4c06f1dac3127766da05c31da5ccbcf18b6cf3ecd417178c808cce370407c25219795f8fd540c9cc89977073c9fc4d8638d7f1b18a056b42ba00da1a4ec79674148924d98e4d9dfd73e5260f663507af88dbd72c9b713ed17a919c655c4fca9b71693899e4d54dd0d7fda5dee217f563d1dcec94593801d3a5284a4968d5cda17684dd1ef507c10caf1ca437aceb7d0af69e89afc4bab4a19d5a3cb79d2061cea20e49495ff6ff4f5b6da38298de4dbcf9188b581a927935ae7da7395a63d717c8ac5eb18f1f5915e6dcfb781c4092d23fa99817d889bedeb5190597d71c448f9b70346d64334d17cae44d9fd1cd6abd6a1d1d331ac63e837550d40ae851ee34b314dca48f9de4d3d458cd0c7b422494006ca41798f11c6fefca4879067a76c39bcf38af2791c92ea1e810d041f517ea35690b4c32cccfa2ab67cad629c718014d15d0e79764f1e06fbbee7388d92db5c918955692f2e4e6ce4802bbc02cbc6016b35dabd0b3d7c5e6c50973edb775a83f9f51cc05e6674d572f0bdab7dc19438ace4fcda2c8787ed7cc0094b21c5127c6ed177f6364cdd5e92076b7d9b7f9a4859ac965fd2e454bdb77ab009e205a2b8cf0ec12c3cc6800e2745c3cd5d021e34bfb6cced466231f4446b3b0843de787a01c1c04d7b7380246d95a9d82bd2cae6d967b9edd23a9f8e6a2a61f96d5e277650b2057ad66aa25138cc5e91266e3be80733d781805527e225d91b044f2b3a1cecfabb3ae8e095f8b1eafb2ad148b8c6d410701f6c4dffecb8f431a49e70f337d1dd584b9a6095069ea7d87e14402c5483ccb79c815860349a6fc9eeb639cfd52fe2fcd5808d066a66c6300322d74e199fa8c014c78b5424abc5949dcb81c7e5cae3d6dd813a45c4582bd5bfb8450b03ae76ee5ea2ff5a1a3db944a2d5c638414ed72eec1656b46e2167f77dc9761e4243021bc45f7990b953ad35eda2538395ed7870f350cef1ba503aba18f172dde2d46de2343e22de42d3ea1c2ce175a73bd67f36c108ad619e7fb06bd27262e320e95d21774dc1b8cb65355f3db34c36bbd2f596b1e4334be8265e6d27e6667a8e163336ffaacfec3473d3bbedfd5b8b964210594fd36304cd97cb09daf43e20eaeebe79f08829e0700e685a3f98078c98e302a0f5fdb7d8d3a1ab30521ad8f42dfd27c7f9974f55f2978efe8f1124b194eda34f5fc79a825b8868e3796bf411bfbea58b0afdb042941457f3f321dc53128a36b89dbb2dd85bb9f96faa21961a3448033f29b2ee181443999cc30fea01d5e24ccfd0c5463eb8f51e9a1a8983a30093ba61393e1e8aa5287c92009f1a7058b09acdddee731e7a6c4861afc55c7091f2aa5c8ef698fa39eb79e0af6ba2eabbc5df753a0b36cbdfe42d955a3143cd93271cb8f012652c43e54775a31cc3e3c9b60fe8e495c395937bdfb8422a340a3071b8245a12c4f2480edc87ea8fc93101fed600f825a4314fa0482adf0eacdb07a029c1f2f07de4c4fd3a5c0107a6631078867a3a812c272cd2b97addd7c3b4c0c7c19e13396721783c4f9272ea714669dee5c51d246dee723fecfff678deb7c37756c4538a2b1945250e67c6c117e75d0a619163be94891e7f13ea29b7fad1edb8988bb19ca2af144ac13acdabff82d07dd1a6d72f527d0c1c988f3ed1bf0fa1cdde0bdec42b838035e659a8b2c53e1231ceb843235bfb1d7eb52dac6a6af0dd4feda255bdfbe90a80d5b24ab259f358e4f1fdd42ce99778784529ce1088e9ddb178ac67345e4c80bcce2120715a1ab4e17c0790abaa4b395439b5153ec5ad3fa4018bca598f242c5200df5c3d4ca72f72f4236e70b797355843533b291a40c63ad423ed5c16838c586142cefeaf2f4073fd06fd1198db10d4e327a9454a04fdb0afbd25dbde2d15179920e06664e6986a9551e6d0e750231c91f81065aa5cc56f313373c110c7f022e05a39b2b021b6f59d28733088dc715c31a410483dc68f022e9286016b05ca4a306182b829f5fa3140aaadf5160359b14eae2daaf5d9e0e55d52a97313d46c0ab641de352f092cbacdd880d85e0ee3be096076fa84c23cf3280fe1d4406da0bf9f233e1ea908944b8bd1964c5f8f0f765ac4c0fe9a9e0dbbbe42a6f8fb8b4b9e423fbf56393256669012a4dc005c89325a5ee52f14f98402e22b5bb2ff04692007853f3f3a376c7cf9c23c987b5e443c2d488a05c8295d0f0f84c6ca7360d3f22f3632f0c30377167e8d75b10c515fc21ad07824e0ef2b53971f73edaf1653c5ccca861cc44cae8354b3e92b4d99bbf7e590ab7a982dbfe883b872b2bf4c72841209f0ca3895360cdc5e7e484738d7e4b6886e227c1e2e2f1526d583117d7c654a75688b0c0f1310b6cf6f2c7dd49dc3a84d0010f2b83839852265f1fff3c307404f18b5926493b6de12288b1e703cc5f7f5ea06ef1dd2011202c80ffcea302c6758de23336d03c5d25f3df577790a4de49efd09472ba626a60573fd3320afc9893dbb35cbeb08014003cc61bdff6bb1d5c46590164c2c7a0b82f1707b8f42789a6e9b96640fff53f71c62840ddc5eb34aa4d3f3ffd8b9cc782a993dc2fff8b636b75ee60087bfec016c72cba50c76d30f9da80d8638f029d4db221e00d40a908fb7ca99f32c671387cd3448972d84a69459dd1a17f1b40e5512b04e46cc28b5c8156ad54c13720b0faeb614a97e08bb4a78039ea027bfccff6db0637cdd6e0ec832423ca170ad3deb57ffe3343c34f069a5349fd8eb8de975a56587044472f49b370550fff00b16e9fe39ce7e0afb4b8c0e43e234a4db043c88d04284e5228cca274ff92236ffe0f68ee67be398a65dc407da34fd518f807840732e79b881a06fda39874e17964b0f4742c2714e3e70d92055827725bbc7942d9dc4828d3227c7735267230ed24fbad8e9883907a1e336963125a2366390709741dc89e9448fdd2145be4e6d34a4d1d91470dac20b4eb76b970ca456f8572fc4633fc2598247b792687b1c7b331a3b4461f0012e4e9c9ee9b04dc587dc8371141a655998648ff89e91ea9264bba62c8e825489d9c7b6913443b8b2141bea76f451f489d05cd8241023b948b112a703a173fd65c849ff96ad41837bd93a18a59dd35fee4e6f87a9e5aaf775041f5da2d8112a138c0cb8594454a45ca083886b4e310d0137d663668d80b30a9ecaadb345d561049d459bddf0ae98bcd165f3d1ec3fda3e856e095d7d0800feb329b39f95c9fe291876825792a3203f4cdc3addca09a724f687018a24e104c3dce0bf414d27c0bb2d14bfc1f5860f3bb1d1b84869e0c8949b867e390207d96b9506fdbd486deefac20a0b1fc459983bc0e0b98aee13da113a36ad2fdc654a2f9fd8128409c00ca213bd405f60f97c85f4332738288791db25ca328b4e7b3adb7c0fef638f5cb4b1b31e94e47b9ab1e2e9a13753e1ac41f849edc5777d3e79e911225d79a952d93ac11bc52b67451cd6b87cd75c58e5ec3d2c1790d1637276914bda8b547057b6f09f9056cff04dfd118043bae7b50b13af90a8cf86475d6391ca5b22b0a23d769a35ade080c36174db8df670d0b7555619623dba5f03abe959f440ef0fe46f5c3b243c71d9f7e8a50aea522d08a3a89548150983254d893e3c26c8258f62008eac8e3187c0db5942ae141e62412aec3771cd63e1fa224b42a59847c6e7484ed31b26a1fd8381cc0ac1b86e6873ad8ddff7a50b08836baee156592c2e418a7c6b3294d246683b645f046163430e170d4d989fae7861782e9e85a4a8d677f8bbe23ffc486cbe8efe00a4832bda64d452a3000311df6aaa591268dd750376ae9ae734810613de6931414f2c3d202c82bec35f761dbf0588b62177647db07a0e9f9643862cc51e6403f02914657a27f457d717f19afa00bf6084b6b34731f5b9964ea7cea07d5fc5a85c12a00210272f19b38803a94e9a412f7de54621888be887f213fc7d9c336a07c5cb0bdc4dd73508109047147332fdf6ac19d17d0afb263dea52bf6a651a5a55ca912ffb69c71e36c05dc2484dc2aac4d0f848e18ee5718edeb123600c02b8df0614883dd215e67070e83b980571522882f83a1e9ce8e828ab2bfe34f42558e6a9817745974927ae5333d244821f67d9df9c95495ea16745e861e5f70b72027b74e25f0d125871b44f3463eb9a068bcef7cc2e5516bb9f3328e897121b563e302d606248b579f57b2deaa605316584c1ee99e24c5a257a590124cbde59c00253c501317b40c2afce813c59075b831ad1e47fd01ce1b9ea012264450f8d083cb43541c6b772bb254f0ea63ece3168b9a27ae823339c97bf53bcc40755ef1ad035c9046fc2f43d0730498fc4f82c511b831d1f6f671ffbd0f60aed8d1eda8b0a6c318dd5006684b14fe4a9b0d4289fb208146c66bcfa93837cbdc17268465e11b3bc4ec000eba5b06edffda7bb5b530b8f076b6de88621c368be445efc6934f7da18263e4945fff49415072fdc2432368dc42cd6fde6a9dbc6999eb59bea5f2bc2c1a311322b57dbbc7d66815760a6245b0a8801501fc46d4c86204072ea71310dc2170ece85a1a4e93fdb5f3279ba9ef0d8b214e89733782b3073cd170ba670e47d832f8d44d8cc452cbaaeda04e4bc0c8a5243f98713b02cac0047c88d02d7be6a9e661c47367b2d984668ed2631e89d848a37ff8f8b7466fca64fc614be9c9da3cbc16fce7138d531ba6d1cbc5f82cc7fb4988c4693f6fad48d115a621fa5a1386c3a158c28c25a8ef9dc7afe78faa7a3563650455c591a0d943da8b1854a3284fb24f48f8520da6e6ce0a50ee7b2deced0701ec88adfcbced1801c4f10b605819f80522e20b15084141fbfca155e9687368b7bac253f77f83bbea5c3a0a03ac22aca32e7dfaa5bc33b3ddd928ab92af639675012a1f14c7ac8e4370cde2f184e1ede5465f7e7e567f3ba9313ea13e3b371c0ab55900b58463fa2b623f2c2080b8bd6f0f040552f2a3177953cf405d8d64f1cd6f260cd10bbb1601cf91239eef86da322d064eaba184c4ff115858062197f40b1b91bddc8db374aadd3248036e6107e12d416d5b45e4e0a87f5e7366446c84d16451d93f985e9dc5dbc64394b513bf93b560abd74eb79bac566cdfd7fb0fefe8da81f9fcb266991ede82bcc349e8bf7302175f6abc5a2416043252e160e04c232deba30f24f5b9cec79f61801c199db899468416c198e9adcb709034392d70076c5eaf585cfc1f102ca014081a18ae0a5e32bc6acca708a6c160c57acc3aa20169e2bf91ea91c10aa8a2a58b2d498c69fb5ee647cba92832fa4473bdb495e17f6bf2cdc42a82b2e2bc0f7aa8884b16f147021f23b06554a56a21f9b0d9f235bffb1a1a9edb2e3b012cc3777409541acf5b275561741ece824ac7d026f0c39ff21e284ecaadafa04c34bc72ec88c8082cc287295d9c217ef957de0e1bd90401db8dc3b7361777cd144deb06d680236367a2b055381d645d6330af6005ce078240fe72b7ca0c303286c50f68ac2a419106b6d863a9b97f5cd88fc70aad3b8cb8cad39af5f736e88bd98415ebd8574e562f1c614eacf50215e1c82a930f3e2e82df5a21da4bd7120bd320b8f2eb6cc6d542e995e34d900988f5a94954c33bbca43fb6ade09cc973c836d9230ee66a2c0b4831ad630f49691ee0a1cb1465ec1ae046407f225fa016553e46bfdc4ccf459105440ee49e7da5db84014e2ca337069a8998de3b3cc25aba6db94dac1530fd577f6846e09e4e1f5c9914d6b0c78bf7ff28e9881437cc0e00ac98277405a7e8066963a29156f6a41d2d6a9630c903da922c9d720ff8fba2adf52e117f595cc200ae9ef0e7b51966af7e78c5ca656c549b6d617b8ed4aa9127f7ae7d80630f5536ac75ad2b56300dc9e1bf14a71d6b7850c312c702bfae60d0a6d50f76e07a9e3f6347506f636b13d271468b01ac1605de2217f5f0beb2f2e85c26ab56e6a91a108275b0bf844c958b0af0222ae7ecac2b96ea4f56f9ae0aee3b7845a7dd181ee81575fc1f440eebe579d10078131b2379103566478b904b5f28680a5fc9f3684f84bd7eb99967a9f2278595f330bbc41d10f7088c540d0d19a93b65aabbee34b26f2d6002aa1dd673837adbca65866675b2a125a352fb68384298c38e825f986f052db5bfbd1216aa11855509527d20411442b376f6424aa518d081a9371b6cd032718b22a6f0cc6e9667db39525e5a671575a706e6e5e644bf8b3b158ce06bdd9593f11a0f1d641109c25c9c0ab03b9349633aa57318914c4702a53223eef1923db68cb1c5020d905c01d0dcd38433006ad5255116a3dc5aa7e084d8ab10d1f270d1c786724d6c8760784d109314249181fdeef836d59c79ae748aeb2fadf41ae298d92d0ddba53f1f1f1ff30ea125361a23578ad4b937caa11a384fafa1c4978c19b71ff2f3b609810971bc6be60c0fb31acc3ef21cde2b85fd21aff4958e738b981883b7f30dc7ce85aff73e4ba80d4759108954456b8601d3c93c4010b24ece63159ea22bb69f02b60db70af792a2fa220b1035cc745c6018a5e967edc1bcf2e9a2ead4ce3077810b6f5c2847b43b85511e3ef8dc4dcd31a6158fa8ab3ec035d8bd4f134eeab0bbe1fd52c5c141e06577af66599783ab038af045885f2aa6da28f48408f667f8ea5b59587b5c475a1b1e55262b217157993e50549d4927766119e674a733cbe8caba446bda7cef55a0364a41e1aaa69f965c139b829dc7427e62d36873d7e19081ee1ca699422c92bdf8288e340b8ca33a9a35c58a92263d3b5070c62ba0b6313ba837040f4639a22d34982149ed38fa1204117cc7af4c959e0650dbb161f97ec704463b16a1589a08c096da40464431affdb0d6c0ab84e554db7aea6cbc316ac951f79a8c9459daadaff17f543c9c4859d36334b7518c52e9e06dee6723a41f96840d2386d329eeb316709c1d95caddf882b8cfebf27ee199854b124e1adfcd81b3c1e5f4ccbfe23430cbf72b49bb05c7879ed1aeb2acb1bc7325b900938318c7104d8dd2057eb604426907a637ed7e19c6d7336d83d112b83f3aa5fc6ff0984ad06cc6b576f6ec62c38f37f7b5080ece2c62d3025205eec7ef77c2f5c618669f1e5bf20d792365e6c44d3983f83128179a89c7cce1f7f9add93c736c36eefabbd2f501d1d423199663227edc8b90efa5256ad8c8206dae862489644544aae2b5342f9a2f4b325477667b2fef471db6c1144b15fb04e1f41a87a43f14ba69515b4cab35d5ba326fe8ee6917f867b9bd4e50a8f2230b06c8bba75dfac5785815c846c533e0983e997aac1dc83ff73577f4740df9ca1fcc3bed13b611da3ed055b25b12780f32cbe708a56a79952bc6e3d23c99312246b90d38d3e3c6c2e3c55ff2f04ea1303ae45b3617988af9ecfa86c6808f1b6bdba20c4cfda71e6430c58fb6c0e9c82cc0d0a9a2e63bf8e93eece12a943eb702e748081e9b4d2e37fb920ccbfa6dde536d9f6dee7f7abf2c6c13b0effcd1dd4990a52cc3cc6687ca703675dd1cc074b308e7fa60d57076e56383d5e5f02e1bfe29592fa6ae0e8c90ffbd94e8757f89cbdb196d1502cc598368cba4989beb574a8ac3022354c30a9fcd6a560c9e53c4975fd7757d74334459df724a84d6706975a56094de3e9d39090389951b903fc16fe19e6f8c80716f7b9137f6911e40b5540f57c27a47c68f40475000231e8c613fbde599d0a08d9276c2f58fcb1df2f111428af03f2e9d7d1c942c4fa58c67eae69bd5e51400b097d544b6be51e8c28c66048315e3d5cdf79aebebdca54118d5f32f5e024144027a63c6f162cf51527d130c5a068c8a213318b7f40776de479df22dba62d764b5b57b88c7b864a62d088466307de16f7e2d36751ebc1e2c4d046d2d1b6fb46f14c592589eb6fc5ed105b73692674121b979988efaa673f93b32dfb4641ad085da16e1e3a2cd9a9abf9678d3c6db4ac74c51132a0bb1d858bd9f247c016bf870a2dcb824231408875fda4ef8fa2c52114c7ee586e213834540e622014d6acb682ffcc2cccbfd13571f1266051578669dbd9622319359d66d27f14042feec254952d3549d8b027bad35780315b0657360aa18ef18c10917a0a9937d276cee2e8a4495b1c2d7c6c3ac8a06a69f31324b026b0295fdb3474d5b3c1b606eb62d851a1e2d84fc3576f99a300016aa356b11baba1e0dfec87eb544743ba15c92ed5c3565706ca8b521e5ba8631070dc1d1d63b5307fd2e871acc1268f0da20719202ff0f99f7f0f53aff74b773676415e9b1455e749d291e126bd032798675fd4725a2cb877d0e83d9840c74cc6e93d4c0011ca01a4100e396ad83ad8ba3bf80d3e3a93b4048edd829678d3bf9060af91c49c06c5c92d5d4827b310cc21d75817f02cd8bf4515155f90812d30ee24f69743314677574515b5c0463fd3a49aadec3d61be3067e41755a76cfa96e44d4dce5990ec80cb998ace89e5c8c728af14cbbcad72ef6559e0d65100e879db9934b71c4856f53a49b490509c2984f8612793afe9f285d17338e80a47ce8392239a1c451025f70ff2390538b89a5c1fade36f54e28cb17391294919f780f945fd047b639787c588ff4e9913e77348fd09e8ffcdad96fc16f52f72967b50d2de81ef3037455bec94e6e6f36809804b7306776c639daea9a85fe120c60eb6019526d3493490f65d5c9f4d7260b6dff838b311e1240f849c44e40a8a082a86843461a033df32f2c5f10c13c642b22563f15e83696f71c875294cf5706c5fb10fc7feb9ac57a4bb033ae537d35b204c4a9b0e6569c85a1e4ddc8d48371519ad438a7623eaa621a57934518f2d867b65d6b2582daee8f78be9db3a1076d945cef90d7edc816074cd461f4a71171da3536e38517aa1a7c1bd18433e0d86f82da4eddd6defbdb79452ca5d0c400d950d3e6f5e740975cdbaf8fce0bafc74d1527e6a3d2009cdaad4805cec0431010a42e2484bebc5dc1bc82648c8c802f16f563d929511f2372dbabab4173f59e082b69c28d2dfb188b60555c1e566f563f5fb665d50fe7513f250516bee2322fa4d73376bb0ad185a31b482546188288bad5f42d1b7055b39ad9e18824b4b1f134254c2ef9ba5e2eb0df3d7c777909f766f3368eb9b762b2202cdca2ab38ab0ef25dc8bbffda6159d3d7c0ef45db384be2dc821118538dc02c2f466e122310516687ed3bcb7857a1f74a48505373f852a0e4cb418af5bb8f3ead14bcae8a814abffdc9b8a37472e4a513497545cc446bb40eaa97d282da791bedc219544bafa8f0a8b045ee1ca9aab9b46b33547ab2e54735724faebb5e63edf483aebdece68ebfb66fd75f24559ab8cfa0287c3e170385c08e6d09c035f0c94ecdae541b7d977c6212d0c43f4b34f038be70ebd04bdfcfc9d57443b507e46f78d0f511bdfb9bffd4380fb7dcf0cf913c1d26c212cf594481e99ad79953a532289efe7932c711903e641871ec2768ef7e03fb7ffa15faf52889a427a82c8311ebd3faf8e1f077f9fefc68f553cce589724974cebe1943c3ac4d9cf67b73b1e64d92b566a679633b618b63dc0284f3993415ba7953c3f7aca5717d1a77c89117f4acf522b83ac64a0d287082a673c08959a4a9e59115f10bd3ccd267b96a083e7be9f7d67ff9cc4e78be0f7dfb9af8a526646b495fa871565d00e43258d4b262ac310f2ad34a31495e411162579a445191b221a95f52af9ae9edd82f0b687ceeef80fbed6a3b21c23ba28431c2c5219b4c3952f26309e9030cca68a3fbbfd218005ff7bfc96f715c328b3123746592211934ad04ba6a0fcb47485f1028743ab63c4dde6aa458b8040de6bc3e826eef4bda86851c8b68635ac210882a07f3db0f2c4ad5fdcb4174317efed3b73e842cf81d0bfed1fa29846d31aac9ed1a334dabf3ec6f904b77b6f89b1115a6febad22997b6f0c245555adb5d65a6badb5561c36e24ad1d55e115b9ceb91bd169b35f2077ee1a7f1ecda9b74034caa3c2d74a9e88dfbefdaafe62f15fd7a908ab808a3903f10346b842888e2f88de398c7118fe3388e771ced388e63ddb99eb3d974d10f346b5cf3828bf3675e604bb3863541f333cd6c9a26bed634cdaac5518faf6bab6e6a7ad9d7eb553fd8ce318eaf175996668d7bab47d54d1396c1f0af63fd9a69dacb34807db234611606abb9b437566dbaea982607f60d017009dea233186d26c6625acbec27e1e0dc9a8c6adcb7d5235a53adc6fd593daaae5303415f746b2d3565b058f176496c9408ae180d92967034eecd4ffaa29a878746c3341a8d766d85c1768effd120968afefa6d7f8988e218414ae36a194e998473c63b7767c7eed411b64d2093e1e0e4e4cc664d3bb527043f112747cfececeaecd096684b3c97c77eb3593dd2d1d9d9e1e1b9d1683d3d311f1f5c9251ad4040f8da71c7a67b2abe9687a67b74896bad866bb55bb322cd6c227bcc1a3eb4ffb13f15f7f8d89f5bc340b9abc6fd1bf5a866f0d57b86e53d77c5caa01e55c7251989e8a8e26523cb7bae3022cb219308768b156916b2f29ebbac718d8c4a23f2351a1989a191ad3cb0d247cf4a5befcf4f2da82654ddab9baf4ef6ce1345672a542ccd48aad5665b3134444434a335dd6645452c74ac458b16b0162d5ab468f1657c5bd8da53339b6640b4594dac41b66c02f2201bbed1846c4dee33dab56fab3f43f1b5280ac27e0800fefdedc15f5488f4d3ac71ffdcfaaa5061eb07733f4fb309b5e605e58a3a7487ecd0a7c2244036c25d5bb1b862e887be2811d1ed5654c4a285db6824d228864848e08794f145b24848485506db3986cc26a2dbad286909572b8b92058b580bb3a9fc8c32bed6a88ab08de38988cc1a96bc990618c1772002dcad88450b23b3c6fd5a8f8ef0b5b51e552f329bc4ebf8a2b5bf7bf6778bb6d66a3d8b9f495cadb579cfc0d246ddba3316b4598dd455377f6b43f445599806b06f74a76817481e64fd30d1d769607bdab03a5ba4ea464797cce72e3fdf33a3d8baa88da02fba4b24dc8b180cb3a9c6b03144d8cef147f90343717c91a5098b69d9114ece4c678787d6e3f353030a12f21355615b3144742b62d1c2081f5d5b9182fea21b036f510838216bade5d72a02b25eb2d65a6beda006fe6c91acd7f879eb625d72496bd6c05fe33e07f64350ddf2e8d23d3615b0f315bd17a05ffebefce12f5f20d82ec1570ffa8a6e0c7c05edad6086596b6f40777e8ccb2aabf7265a74e7382f0dda7a07f9b768e27b4b6c7a366bd8372ff89c03fbe641149b4d1fca817d83f3f6e0e782dff96d8da4afb37b13af12ce68ae471fd8af393bd5bd4935b951301e3111b8d136b6641b94c1d1204bc4e0deec6bc6bd595ec525e5d86eb3269d7bab269947c7e78869dc11631c866088437c86a82649fbb9ce5967b9c4d556b0fcc8b004cdcf926399bd963d332c3d2f1d7fc57268268c06334d8f5d530d6e8b5b6f9af6edbe6f1bb797682ce1a01b67f418c750186aa2dfb967dc974ece399b5245659ef50a559e505010134035dfb8194035b4de22dd0d70aa8914ecace68c2ddc52122ee9b7d5cd48b28b8a9d1516b4d45bc344cd05f57a3d23c8a0a939a0ded501add15253a6f6e3fb9644d67ed07a8b2aaff2ec54af17c512d490277dd658121b9cd1cde877e525f9b03caa06c201d56a49fc18fdd45ba4857323029cb3ca8cb8fc86baed77e51971d9d8711a971c4bd1dc719db3feecac9ff3af276b8db465362f7839462f4fdb12aa9209355743894aa1d26bcd95636c24fdf3986fd14400e9a2d3b8d78afd604755c2f51642cdfda061b53acb542bd2ce327d20c7c37842af3527f3d07f646809f5196791b26b748bff64c2d09e2570389e1de7c3e39b66b348d849ecc383d65b647b18e7dcb5d7413e77199e3bf6dbeaac91cffe9df5a6b55366038c6edbe3711cc7711cc7711cc7711cc7711cc7711cc7711cc7711cc7711cc7711cb168e3e91609635ca3618c6bbfadce26264b831f1feffdfcf47a3e3ebd5e8f8bdeb6b7ad4e4bcd56199e1a0d9ce3a9b7c842ddf8aeba6050b3d2b470f4ad67b519361f1eda8f4ea3b550f125e70a638c4b1f2743d78e4d04947ebb91a10ce63c8ebd5a267be537b7dd7078ceb07e20c7c3ec558865e8be619045caf64ac7501ae65ddd5bc6bab7fbc4bb4f50ecd57dba4f3d3eeba9b7483c79f6ca066d2909c7d333e3e1e9e909122228485ba49186e65b346ef1a9b43133bad974199ccbb7a8ac5d6e64afd1b0d49beba191e4575a74973f3aad6ca1a2462dcabec31f259863cfa9b91ec75e2f2ecbb284f59c5697b33c5c9443d27765122b52e915e631c7a6024ab7569bc7ea62386e9964ae694c342c920df4deb255118d2d967bcb8e516ba54f5c6fd86967588bb065aaf8cace0fe44000d66e9178384723866627419a571a6aafb2e72b9cb33d5c943d6334db5e6d076d755769e39cf22e9fae5216af52f8f5b3e346cf5e9ef8142dd2e83430e8e1299e1de4dfb8f2756e1be563073fd06cfa5ce7b43f3bede79cf6abc539edcb4efbfab41fb36fda27edfb540bf47df4733c2e3a46cff1ac16892c1d9f1bc7934e0b63be5b6c15347e94b4efd88f5e6b8ec777ce8fa66fd88f5e5626dbb348d9471f3d8fe8b661f4a1eb30bbcf4e8719a5dd9b0ee7689edd2d137ef3e685bec763354773acb3e3aa84e3d8c39af3713c3a769f33ac45a3e39cb8de46979db51ef59ca387423f3a6d44f78def47c72602467474b4bcb78cbe3e6bbd6df2b1f39cb516edd863a791ddf62c935891b067a2c71e137aecb0d76374db3035ec34cf7db397e716c1dfc01f3a79ee325b2411c561fe7c7739d7fa3882acb67d9f1ef41ad9e2ac35fad14551747b6ea3174791c6c5dd72a45be748ab93d7e2961e74129be6a9c12d02fd737b7ebef556f7d662b3e9739cf4721ad79ed8bf93036c36c57cebaf9bf675fbd77dfb5ac5ebb1f3e7f398cf5c9f3f5976fe64f4670132375d03999b9edd4471c090510db4eba0384cd78e63e632cf91c2ce9f05c47ce63f1faa41cc673f1ac0dc74989b8e73fe7caee339d29cf3e7437f1690e338ae418ee3f8e738280e183e54031cd74171fc7cae7111e839521cc7f1f3a11d68a0e33bce809af2107111e833df4171e0d8f11d5407cd91e6788ed4ace9ec9673d614e7aca9ecaca93e6b1a3b73a4b033475a9e9bf6a0db8bde001d708623e8514435b8b70c666d34f69b331de499e8006e1148e3de40bf4ff4e719e4815e6d20ca81fb145ef108f1c918a9b3f7fa6ffd585b5d35650fd83155af32b82e8a9ad694b484f6f377edda2da0166107a32bc229cdf9bb5e6133837a84773cdd5bfd8dabbab75aedc5b0ab9b45a1abf7aca0abdf1834f62aa6f8695c5e0884d669eb4d28f5d04081ed495276eaa744516b1acd337abbb70e7a3d124dd7dfc09fef0d076c8dd52ef500e7a3862a1e47a8c0c3619db0814956ea81a52188375569b53136f8d6ad1367c04ca5624ef0822e253f304c9a22bc948c9d3ab4d15b8cb5d16f64527052d8eaa51e845ae59945ef4c3eb1a384def982fb6280fce0a578aac8d653ad328e2c09612bbde77dd29638ea1345cce8520f88f45b5bc29523572919dbc9b23fa4802295064037e429256f894f2bc5c30b4e2989afad382b398344554ac684c6e82dead03e2488524826ce2abdb310114ec24e113d85de59d64368081cb687901ca4521c1ec89670aaf1a4d27a29d8b7b7be6342ac4b6f114848ad0b171d78b5fc02480fbc948c65367a67120a718a29466ff127434d255195de1d9c46d8a564d797035010bd45924de53255a54befe39cb64c38ee94142698e8520f5e5fa052187e0c50cbbcf55ae62dd2972bba948c8950f4ce2fc6a0ed25a9ce48e19091e155e68c68268af04c96b18c11b90b9b714144e3842ce36334234378e6074e991e6740087110c93019cb44e19cf9209b717a911973660d4c099c32278468869067ce9489612433251cc28c4e2c53430e9a15341925f98c0d26192e386782d065b68466bc8848f81c09c9408166ce8867ae40abd10c980f4d8f98192be11929ca7811cd2891cfac5006cc2884c606bc4a395bf9e94ed5dedd81533d98dd39ded226c8d381bd114fe55de5e5a97a759fb62c2feb70efbbcabc7b05ea763c7c957b1f0fdcd9a99e6eeadb029f2ecf5e7d4fe0957dc2b96f07c3d75a6b73c618631fc771b4d6da529cfdadfd35fab3c7da9f81bc00202f0dfa96f8626c36651367f382ecd96cca68fdf087718da4c7582b3f59afb5166374976fad78f517e77bd1259eac38e75c7ece18573dce5586f59cdda2376c6dd7f51cd7f9b9680633c7f12eebf312b7c02f5f9f9d77ea52603de7bc5597878bacec94f9f8723287312dd3315849be463104a770ce56657dbc9d9f6497b481ac7b09976b0f43de7a046e4e5bc0ba8d9bab3ceb343078eb349d75c739a61d64e0e95062862dbad4faed955aaf5d5f4d5bbb1e0ce993c4a555a0db03afc2ed49a25eaf52be81ff7a154dd0d77116579cf5ac16c9bd5ea50c8a3324fafaa967444367bdb9c8af67507c95344f415f17aa79d1adde2c0279bd4a2dfc7a06c55709d3b3bf6e33a2d2d7836e462d5814d59bc572f47a958efc7a06c55709d33833da5fc72dbda0afd792968e8c5ab0a8378ba5f6f17a9590fc7a06c55709d338b31d9a8dda5f9f310021fafa0f8d0120b938326a516f164b3d7be1d73328be4a98c699edd07c6a37bebf8e410647f4f59e0364f00287e4e2c8a8de2c967a46e3f17a9562f8f50c8aaf12a671663b349f5a905fd7200241f4759a03221003c60b1c928ba37ab358ea19ad76865eaf12057e3d83e2ab84699cd90ecda716e4a8edf6d737d080127d7dc7021aa02029068c17382417f566b1d4335acdef39cbb93832526a41018ba4a2183718442f86702b906c36ee0ddfb837ace3811b39250a9262c0788143aa378ba59ed16a6ebb275801928ba325a35c0b2516141425dd6210c1187ab10267f37b5d04ba26fa7a8e57b3060e5d054b39250a9262c07881ab378ba59ed16a6ebbc9bc5e2526bf9e41f155c234ce6c87e6530b72d436746361e40297c4c3470cfa3a8e930f2619152ce59428488a01e345bd592cf58c5673dbcde89e00f0eb19145f254ce3cc76683eb520476d433716462e703092969ea060d0d7f5102800cc609251c1524e8982a41830eacd62a967b49adb6e4638b3bc27cceb55b2c0af67507c95308d33dba1f9d4821cb50ddd5818b9c0c148525a9a119544067d3db64b6241000030834946054b39250a9262d49bc552cf6835b7dd8c7049f77cbf9e41f155c234ce6c87e6530b72d436746361e4020723496949c68c1ba0d4d40afabad964ea6958100000cc609251c1524e8982a418305ee0905c1c19b5605174231a5a6143cb7b0ac0af67cb94e4d741cb14c3af8b9609865f7f59a6d4af9796e9855f8759a6f7ebda32e1fc3a8e65a2e1d7679609c9afef58260bfc3acd32b9f0eb3e9629007ebd66998efc7a906502805f77cb64e4d751cb34c3afdb2c530bbf3e649998fcfacd32b1f0eb2c2c930cbf6e64998afcba0bcb54815fc759a69b5f87619996fc7a926522f2eb4a9629e7d7972cd3905f97619994fcfa0ccbb4c2af07c03251e0d76958269ba5baa74f94be356c156aa708e04cc1bffeafbf4e03f6d72dc0f9eb01d8f9eb00f0f9eb3382fe3a13fad7650cfdf50a58fcf525177f3d07e3af2b29fd750ace6a91b68cbf9e74568b743dc6792dd2751867b648d75f9ca245ba8e3b4b8b741de9d416e9ba8b736691ae1f9d348b74dde8ac59a4eb2d4eb748d7599c368b74bde8bc59a4ebb7d3c8225d273a7116e9fad0996491aeaf38972cd275db39c3225d2a1aebecc53832988af346feebe8e9a7d01974029db5f3e7dc3376c5b2abd563a761e7397715f3d8774e9d7357358f7d76eecaf5d873308fc72e3bb7f5f1d8f5193bb78d7aecb073db248fdd3ccb735baab753bef268380c361001cee5d44ae15c4ef56b44f752e589e8ae57352bc420baadcee943b785da6574db295bf5d8df1a599135337ad3bee646b8ab847f30fa559ea59a5279336e8052533396664425594a5a7a824ac2253df62f3b68847bec9fd1cd480dd7cd76eb69d9dc860d4b0c58fb40daacbc38dba83df64f033411dcf0c00c475bb23113c10d6db33133f280164149bb91fd46b9717cf938679ff349578b847d8be5cdd5d42784708a2d25903085ae8717352510117eb50732388ce912c4051282209115e69081d72386ac333a22241ce1252c011128d4c0c584294af092664bf8840b574ee083102e1f2768e120d38da03ba1491256824033259c80133444818035c58820cecc109aa0cd1340bcf940c90d55cc3819ba0a13840a6d94d47082324c3c18a306092134b4095302191680382289102098b9210d162354e0208a287e2051831211ae1491c2f77ddff77df58a13595db6a420458931bd20e80b1282d8f0f402991344208284f033cd0891a5a3049e8e26d23cc4e7127a7cceeeb7abf47ddf057a14896255e487ad11c6bcc981e9f7c1bef2802893132409149128165a5882462b3bd1c2536865245a4bb4866811d1ca45b4f0105a369c3f3014c717599a3272776f37c9bd5d276153f776a9eeedfacd57e92a5da57a95ae52bd4a96eae62c8f3745eae6ecd454b5bb5d92a79bb34f4f96c7cd599dcefaf8ea22b8390fd8b8b90d947a5c5f7d833bf35a97d06abe337af59b118f57c7252dd1bcfa8cab642ac1bcfa007abc3a0607c8c0c7ab6be080085ca5254e9efe78f59f2278158bb556349b6c93aca91b60b8cbb29b013211f3b4f419b9929461c0dac2e117ae7a46d76cca41ed550afa478bdef6ca8a59e2e469cd73fcbac5ba01a85da59cab94e3d76b39388d2ec5253f3f3229f4ec5ce2e3398d0f49c6a2746d498fe7343d262642dbfcdeee121acd34c99c451b2de1e11983e824dcbddd253bbe63863df48ca57bbb4b7496febace87b7f400ee9299e734da62dd227b756fd7730b1a837bbb9e465b191220b09e82af3c20a29e8cfd344086c3c608596276a9cc6b7aa5eece5c404d655ecd05dc5486ea0ba2a065cc4e8b18aa1f231ef49002892198f86063450c1018728200c2abf22901f1c2e585228c40e31466cdd83543ce194957948f1a6648a28627217ed8906f789203c8981c80a0d2040f3acc0026081f6fc2207e8040e583820f614029524723a465e9ab5dad6e8f5bda00575a57ddaa3b874e14d19d6347e3310284fe43b13f4675d809692bc63bfb5773ae18638c6eec1f8a2d768b51119bf12763d65a6badd5daeada005b895759342ec637dc92dbbb4bb1975729fba4a0eb571a37973f2760ce19dd9f874e7edf9773fef2f77d9f8bf9dc95778a637df988e67bab34b1ee172abae39cddd1b2aa156d49e3ae886efdb2ec2097204714f1206a7bb6cc55027368367d4c501122cd6fcbcb4df9bfd3fe0b225c31e2b7dde51d50570682d9e7339b3218fa7590891e65d0fcb6f7011f9cd83f27b3d9f4e126bbf572aa392ecb91c95ce6158699e7380e1c9fe5a01e5c29a63ce1a03a1cc741af0e17d92e5c64f5059900b184807db061041f9cf8d064874f903c7ee5f9f0f47921ab6d83bcb7d5b1e8bef2aef06aef2b0f87153e3f551956ab1e5906dcf442e1a211f4ce4f6015ce7d5074ed74dabfa92a9c9351648b148f87733952eb9fd5778573301d7cd8f2a44bad7f5938b7012ecaca3d9c6bf1c313434ce952eb590be7725479f3e6cd1b2bbef207e22cabd1fdf5defa063897b770917574572dd4b4254aa2dfeeedd3db4f2a4fe5aa9ef54feb09e7729a58c2422fb59ea1b670ce3a815579f76d655e9109469e9cde7e4f34fb41bdfd2eba7317a8ed2786ac968903fb1d84808310fc1af56b3db24cf5abd71564b56dbc55ad16abef8d096d7d6b7bf1ed8729460b153d543867c99f0e4e4e6f26f9c01cb41330ac584211872c16e49088664988e37805a7e3647c895680bebcc8320baef270608ad14205f8611ef766734296592cd83433486966090096f16f997bebf162c24e007cf51ff79910b0d80c724b4c972bfca631415928da105a2643eb9d37329c0a8094c0c9917a5a3d9a4de5cc723c23cc7494b6e8ec7ca1e025c40ecf0f49578e858796f318ee413c5aed19abff70095584e0e7617a024f5a7fdd678773396a7803b5440a13da30712487df3e5c9ae8fd20c148942474e9f6c1f2dba792397383086f8cd031e44dba7d70f8ed63a5c46f9f2b1f2c2d3e44b444fddd3eaf2b9fd795cfabd7f3eaf9bc7a3e3d3c9cb33991850c0f4c7c6872c495df3d25b061099b10ac38a10211e9eeb1f2bba7891d9a10f245ca153247d2ddc3fbdda375e677cf16d70b494f941792297f774fd54baaa7c94baa87ea55d5b3fbdb23f5d7693d9cab5746b6ac382199e2cd90b4ca6f9ad65f29765052f5419a3457e9a6ddf09be6e2062468b2a42cb1cb92ee1e2abf7b9c9e86fcf5dd03d513b5040dcc123431fe9b96d545ebd245c37a39d1aa5e4e34decbc9eaafd3743857a580e255094105104a3062ca6f9a5391d490ac1c74d0ea6242ba694f527ed3a0aad090c58b0b6894880122dd341b7ed3a4fefaa64dfdfd4d1bc1f08c607878d4f070fddd3c5dbdde5f1eadbfceb3c3b96a35441026a0f8e0893354d228bf79a4feeea4b2d2a4f0c31133e9e699aafacd531535044b08266868d811916e9e1a7ef3585d61fdf5cd93c5236664c243e49944fddd3c50533c3ea67886f0ba783c3a1ea7bfbec3c3b9edc48ea9a822524cb540c3ef9d094031460910281cdc2c49f7ce0cbf77ca1c4105c994a91a76a090ee1daadf3b5a7f7def6ced70b5d989d266cadfbd5335ea769a8cba1daaf169076a7cdad98d3b527f5da787732ba24822a48d14179b23a0fcd691009728322d0041c20e27a45b4786df3a5d1948212545083abce1724af7ce93df3b4e7f7def3ced0cd1a203468b98bf5b27eb4aa7cb950e564fa7aaa7c3d3b1faeb3a3a9c2362d3c49724d448c98a4aa77eeb0899a201092c4f5c31a12add3a4e7eeb4021400d1537663e6063048574ebc4f05b47eaaf6f9d291d2a91481b91889bbf7bd625eed4883baea959d6546f4aebafcf76385787f0f1440813c61899c22385e1f74c2acbc9c9852d4e4ca124ddb326bf670228a2862a40a208614c0ee99ebdf07b66f5d7f7ec6a86956646244dd4df3d0bb766e1d64cd4e588ba99a89be5d0c0820845ac10a5072e5f5cf89df332b264ca1a2e19485022dd394c7ee7f040a50405ae3146207993ee1ca9df395a7f7de76ce57069c989a225674a4e931caa9edf39555739505739bb1c29adae9c9d43fb9d133ec1099fe0e0e0d07ee3845538210e1627281ca9bfbe71a672af74e3508541da8441dca8e1e2f92deb0aa1645921542f84d29221ca191f3e64d8c1ab926ed992dfb22aabbfbe6557322c7009191170095994cc876cc8ce6f19545757974cd7e56495a5b7d65c5674142b53feea2ad04a37b1a2cad250597a9725f5d7633d9cab65821882ca961dba9a3ca5b685df312d28944cd165b1c1865dba634a7ec77688b082113b62d0b9a9926e9de4b776faeb5b3f6910490c44128bc5b0fec6b2c0581518e38131abbf1ed3e1dc986508104ce0a16b8824290bbf634e3574545cbe484121871ee98e9de077ac2e2143171790eca6d44049770cc9ef98d45fdfb1a918d5126d9670f317d6f575c1d47c5d5ca0130c7482814e30d80ee7162085cb0f2976f84164f71b56c14441452607246d8c18936ed80abf613ca826ac4ee044854c0ee9861df90ddb3018961518112b517f619f15ecb3827d59e69705fbb260260fe7727c70240c12416cd9c1c41babc26f33688a561b116490a2254cba4d1bf5dbbcfab1e48413aeb658e121dda635f2dbdca6c985c48c8264ca5fb3c95f73eaaf592565424999bb6d4afdf5b287739509146890f232246a2b4d5ae477a95501178e58f9a1042740504977b9f596c8efb28b053655a474ecca2c916e13eab7e9f4d7b7f9640ef97494603e1da598b24b89f5b7ccfa9ccaaacfa9e4edd2eaaf973a9c3b40126b9ca0e1618db92185dfa5539625b4788152c24b0c26a4bb44e17749d543af0c9621b8146193eef284dfa5d45fdfe554ceef92ca0bd9c68b9bbf6457ce22d5e42c2e2d324baba7a5f5d7c91dcee500f2e508167638e10986ad21bfc91ac4944eca0a503790c025dda409bfc9aa024001b36608992b4c82a49b14f29bb4faeb9bbc22b19e90449e9051a40f72c85f12aaaaab8ad46d9287733c49daa059e2e4c7961382fc7e591d200c1145b4803ca52993eed7d5d3ef57d60d26f8b801ca171d2944a5fbd5d3faebfbb5f5e2ca415e517290d794579317d5df57557e41e5d72ebf7a38577b505d4a1429e28d115da92de1f7a895801d2660713a8344d491748f5b16c8ef71851b98b4b015458519a8a4fbf5e3f7cbe9afefd7d36b081ec1e0514cf97bccc263173c62e1b10a8f3c3c5afdf551877320b841480c63c490b01322f5f17b749a8185146a006303971ee91e9f9e84df23d411dd0c312c41262b041de91e7723fc1ea5fefa1ea7462a6c456c83ad886e443522d75fb1cb4accb2ea59ed706e5cd2c4901e42662823432ac26f512a07942f49a69440e5871ebea45b9c72fa2d3ae143161eae7a38d1a149ba45de87f05bb4faeb5bbc12b1701091080e2246bd7e8b50184af4210ec1525d584ad461291ece6de089335474d0d1c2134a52107e873b4c6d21c14b218a3031a43bbcfa1ebfc3ac0d58e04161450b0f880ee90e7b3c7e875a7f7d875b215711619422c229e3efb04a2b6ca215527585505de12e94faeb600fe7ea159e0e2d4360d5d0c312e98edfa09690962c3fd610c9024256bac1ad0f7e835d7fa5da8809a31b42058974873a1dbf43a7bfbec3a7bfe1102d20182d62c474835db0fe825957e0942b100be85402160d52449460f2258874834f7f75bf412850eaaf6f702a074b37487589b4b944dcfcfdbaee4ecddd714d7d5953bd292da9bf417a28618286aa89287a48f737f56f7e7f559fd55fdfdf15ceef0f2bcd47244dd4df0f6aebf3f1776bc85fcf5d9fee86a9526303902e42ac4e904ef13b5bfded42a5851f94b8e92125ddf94a8adf994b0a2c418ad4b0860990746737bfb3d65fdf794bfc9db9bce4285ea6fcddb949aecacabb9da57232fc7802ca8e24ba256914bfb156d5902436403142e40459e9c650fcc65d5d57968082c85615978f74e736bfb3d3d390bfbe3354f83b473dc1609e88d9b88badc245559867b10ee7aa559b34407a3abef850a4eb3776c25039e81842ca933527004937de3df11b4bfdf5df98eaaf8e3656879bbf4eb8488d13d743e1a2acbbc3b95a86479612c82c59410a98d489df57aaea5a31b9bf2fd6022e91ea25eaefbe500ef0f1376bc83bfdf59c0670975205f5667ddb285fc194bf396618a2ebc70a3c64f8b2246de2b7b55a00102427f43802831b2ce9b63daeff6db9feda24346e91f56da3fefa03aad2586fd62ffe3d8af96b9b84e9b643ec1313bfad53056c8c10420424b844e892b27927217e408982cc942d4b6cd9f284e50b1a273a1de9016e4e57b4c7922f639e44118509e9c5b9ba0686105ad0a1c908315c49ef9aaf00981e11212c99024c557a95f8eb38f0affb127acb9ce82dd3e9abb76e6ba2b7eebd75f3047aebdd5b3791e8ada7deba6ea2776cebadeb17f4d6bab74e1ad13b76f5d663af58158faaf382de31a7b7aee382de315b0c7ac3786fdd0683deb0abb76e96a037ece9ad9b3ff48675d1dbecbdf59e2d7a9b5b597a9b5ff436796f9dcca2b7f9f4d66961f42e7b6f9d2684dee5d65bdf71a37739f5d677a0d0bbe4bd7520357a97bab70e8484dee5d35bcf50e84d3ad19b9c7aebb318f426796f9d4704bd49dd5be771d29b7c7aeb2f2bbd5f576ffd9545ef57efadbfb2f47e49bdf557958be8abeaad874588553fbcb8e2458f994da2f3f41ebbdeba57d1fbe5f4d6c75e888ebdb7be0208cee5d4ba4cea2ad5add00a0a940f6d1f3acc6c0a5d08bdc7a9b7ee60f41e796f7db645ef51f7d6675af41e9fdebab6416ff1eaadeb287a8bbdb73ea3a2b7389ba2b7b844efb005bd45dd5b171241eff0eaad8342e81d5ab10e6ee90d5abd75708dde60d65b9711a13728f5d6750f7a7f5d6f5df3a037e8f4d683b4e8fd59bdf5202bbdbfac87f2200882a283601623511ff27ce8a6d9149679d14bb34924cd269066a57768934aef9cf5d64d287a67adb74e12d13b57bd75b288de19eaadc79eacc780e88dbbdefa8bca7ac983de7807bd7110ebe293deb7ebadf7e460bd078bde77eaad0745e96db7de7a5011bdafee15c03583171d4800697325cd497cbe62e4c7679f65bfe1ec349d4ea77b4ab3111fb6f8d05f665398035daca3d9048a6653b6593827d3c9743624f496e9defa96eddeba6c274b72a5080f9539c9745f14fd5f0ef779fd7e979f7fcf3e7b95faecf92ac5f88c6585309fb1ec867c76d06ccab52a7d0f66b3e92ba5d0af2dfd5aa34b157419a5ad1859e13176db8d56b352a489ff3c5f2516ff55a50a840b9fadd98471ff15a1bf5ed1ee65bc1144e9a4e82d9e59e449e1b42a9538691e4b5f29320196b2b09489e505c58ac345d8afc61883a8888b70d5bde1f034deb6eab1ae1be7a2a979accbdcaab13cb5bcca9205b2e441014b59cac298a5e804acdc71428c953b49e81268069aac9465d1db5e5d5d5d5d5d5de1943b5b39a598c4ac14d55ce9944e75b553024599c18856caa674f5945a47f629655bc49f12a8aa572b3f1ab4804a5993a0527fd02554025df172674ded2c3f1d325a962da8284536b652e45a51c246182a452432515926b9955f1ad16e5c510964456f7b7525b228c5234a71a66b34bfb528714cd6f78b5c6599ac0d6f947345dc339e342a7b6a4eac4538173a765c95f1557f5199b2579ede9465caa82da22255e15c88da2b32323c268fca9b9a6faf663a92aed2b6568f1dbb6851ab12682eca0f8af592442a3f5114af704e0cfa7c75f86660448ab637e79c69554697067ffb571df40e1f7c38572cd2ea598de09716c1ec9f69dc100cbf0fbdf13d08826808becf68c6e126a4675c7e58c962d046ed267e9e453dea10c5a9a0ad6f1c4ec4b966d3222449ad5e95212b0d0dbaeb99d6355ba6cf33ba6fe01b2d63dabde1330404b83a5b8fb2676c367dd93400f9e6cd6f1c3add67b483d16f885f91b2571c21b83f82f8419403fc23fadf35b5b4f52dea19cdde1bf8b3df376f42803d3f652c6af03fd75ba4812e82a7067d8b354a54d3b2e72ca2f8f6998681116d7d572b119b4d1f885ad3003a2e00e1c20f016e463b80d3ad21abb5b5625a5355aa32aad7db757d6f5729a7deae5f1ae700ead1f59c8c36d5db1dc0bdbdbea216fca0d19bf6167ccd6d94d72da8325e7fbd8a4f1863a85b84c590062ec24966b5f681f6dcb6123bbe50160a63df007f7e4f31f41c8ae199dfa2153c71a8d634dadeb8c7f5fac65d259427de0f8d756b64abaa76aa4a5dd036a1592a5e2d4700639d2a5230377d8ba55b290fe01c0c45f57d6dcf8ecfd0471bb6a610b551e69fe5b4786934f75bb652958751297b355e9007d1f6642cbbce4fe801dc9cbeb8a58d2b1f04cffab9ad36fb8c73b6fd2dd7a2ecb5cf5b97b6c74ed06c7dfd1aab36cf15004e9ec67cebbc132e8df9e629ddab87d64df00b40ccab93d6afd9047a788a2f7a782e8179ec7412d3d1699c03b8b7ebaf13832ae6e9e7cde8c49d49df396346ebd23fe2579ef884f6df3acb0d51e0d31880d72bf2662ad2b595b69fff88fee342fe23a2190079cd831cfb2549bb23f393e8a4488aa4e8a26f27495288f42092249d244992244992244992c4c9f199a9cb4c9224e943923d64a9494d239dd42167a4e79038a4cb48922449922449922449922435192361a4499664261de8ac9782ecb553c445d97f4e1b2996f072cd45d77f81fe73ddc783fce7a219d4fcc7813c3bf6d1c5fcf432dd6a6151d4bae2a0f3ea70d1cb814edb858b5eaf97bf5e4ee3be5e2ff7e979bd5eafd7ebf57ac972665eea382cc6f3bd5eaf57cfeb4543b7c8836ebdf3d241b7d5fd6bf6ca7939ce4bf6728d6e0bf5afd7ebf57abd5eafd7ebf57abd5e31747f4e30747f4f26fa2a5f24ba3fddbf72d7bfbc76d64bc1e73fa7888b3ef739352efabcda5e2807409ebe2110a4f56ab356c7c32d6ab1b5d8626bb17f19049d043ff0033ff0fbec67cfcff3c901fe2e309f568faef730a9ba53ae9276faeaf9c4dddb122eba8e4bbab71b8446df2a7cabee5548020f540f3ae8a15fbbc4741a97667b9eaaf4005586ace71c6b9175515753ac47d663e7cf75d26d0a3b7fae979ed30bf07360dffc580527bebe66b1a184c7eddb8f6118e210dda367979db11376bedc9a178c2e827ecfcfc76b36ddd0ab79033f017aba9ca17af0a2366e0fba350dd0d3e50c9407d1254e9e9a68d22db2e29b674dabf9a138f14737554afe2ee14e1af5c8fad882f6df22f9354b95247fd1adafeeadbe58af5e170c81b426a8faec3f4cf4b6bb7dadfe7abd17ad36eee9817babb5d6ef73d2def2dbb9da8b737514f475a1223014185bae9ca1d8fc7dd94eb1903f300cc12fc3903f300ca33e10fcb21afb81e0976308c2e6efcb762a7f6018825f7efa2167305ac6e49c79743927f18484fc8161087e590b981cacad923f10fcb2182e536e905a22e74ce6ea03c12f73d1d223e74c43fec03004bf1c953f300cc12f47e50f0c43f0cb4168f8c1bafd40f0cb27a86073b64ba6c879899c57e821e76c06e37b31d8f5808688b77e1b418a2b34a001b3c3e38a4081bcf8e6308761ce91befda56bae1cbdba5895aa522ed14aa215fbdf1d7ef5af32cdb048d7ab93e1f9d5b1de3e7386e863eafce775dfdf33c07afb5e21787cebedcbe07f2478ec7914abcfc6797df55bb357276b48d3222a81c704705b2d8665d4deffdc667cc1effb2c0c58ad479fe31ce22d8390a4bd49f2ae3c2da8bf713f06f2050c9cc2ccfa47adf94a5951b5028be8cb9010222e2229a2158874ecb819290a43a464851344552c3e2822f2e4c663280a16405a90c04209d18e1622ecc06237a445f401113a2f5c3d845022081e0c584154f0a10513ed8344914ec3c614d9a071b89c408b3810e1a0c32945635644515a714249eca981826c9321493497c49001c68b3cdbc2e9c8806481b25c581b9423738891d8f3a5c52c0c0b7287a24c2be2b68308686b684665137980a8105f3ba0e26bcce9563c07e1201494673d00e92a353bbbf2d3c4070cc393412674b20ccd2c6bac9c1cc4038e48e341766b7c195f70ef05f7332fb8f55e6dda10dbc132b93373ec84b22a7dd96dce8ef3bd5d8b5ed4de7b2f112f116a24a9883d59c22024a0f87ae10381b0f98dd0d6efcd366808f26b42c3a277feac944ffa5665dc6a9dc80e38b06ffefa0df1b3571bf9bda0770622a37307e1df10ffe702ac538fac59c3fc8a8af588a719503fbf0ec8e987e2f020e7f0cd14babfe8ce135a3c33ce395f8b03db1efc7dbf5d5cc415875f79686cb8d7f2b2a665dc17ed5ec67b7b86042f5b9248abdb31da46f13194e0a1c3951f8e20a24c5a2b88820b550e3bd82401c142f1d66553aa8cfc96039f4f5da56fcf40073cf67beedb5f7c4fd4c6edb17f32a90f95ed6449eecd7acf11bd653b190f99d355cabd951129222223521455e4a368c8df5d0425dbdd64bb22d9aee8c6c3b91a4c52d0b1c044162042dafcbe59d00684221f38a10b018874dfba7edf96d270e95a808147096fd27d7be2f74debafefdbd64db7b9e936b7db8deaef6ddfa0feeefeea9bd45f27eae15c8e11ca08e11df18147922652277e1369fddd41260a0626929cc9926ea2267e137101e20305365c88981242ba6f5cbf6f4e7f7ddf9e6e43b41081d122e6ef26cad257445df4151196ee1155e91e114ff788acfe3a910ee7aa9a214852c0c1c81a18aa30f19bc8490a0612945c45e124dd444fcfe6371114971f393061e20b5710e926da1149fdf54d3445fe26a2d244da68226efeee21bd1bd2bb213d35a4a786f4d4d0d00ee7f609bcbc312187373a6459e2f7d00b3a2755218871626647ba87b67e0f518006303a6489a2030d27a47b68cdef21abbfbe87ae62bf87b0d20c1149331405e3f710d4d6908fd8d690bfbea24beb86747ac8e9afafe0e15c03c20061c6092423bc014289df2bac9ae84a82ca981c88689921dd2bae92f8bd220b4b6bab0d4f47e449ba57a8f9bd62af58c1a56545142d2ba6ac68b282eaef5e51155b115b115b21f5d76d3d9cc340cc112c167ab0c10d9a1489df362d105c684184351fc80025ddb6237edb7a1f6831028a1e5a745049f70add0aa7bfbe573cc17eaf18127b6203137b621363eb62c3fabb6d595536dedf6db3faeb361dcee588caa18525588c14699225cd6f1b9a188ee872e689d319a874dbb47edbb0b4c023ca09549e5449b70dcd6f9bd414d55fdfb62adb94980e156d623adcfcdd2aba624e2ad43871fd85c2453128adbfae628773357448783494800505efcc6f1552434dfc80626a0a4c1050d2ad62cacc6f1555171082e68a8b10639a48926e15bc32bf555805f15bc595fead020b96460511581a15512a7ca818f277ab80826da16e605b2a78fc75948773475a469280b0638a2921647ea35a47a889828d151d2a40916ef4ca88df6856932294e8a1890f51a8a41bed15f11bd5bafa8d6ea51be5824541a3c0a2a0538e7ea355301eda8447054361280c95faeb670fe76a9b1d08563d429042e607dbfb7d563160a80851040952b89192eed312f1fbb422021b2082d8d1852724dde810bf51a7bfbed12774084c84130c4c04317ff7097b3a614f276c77c276276c779e3b40f1c16e2a4a93273ec6fc3e3da0c5083233f08010c142ba4f31bfcf18d63cb952c1071a76a090ee73f7617e9f527f7d9f53e6ef930a4c1b306efe6eefeaa9e9716d79d6566f4bebaffb0ee754b8e131f1810213bb35a910bf7d04a7204ea08a820c9523e97630bfbd4a032b5ba8a0b0830c4d9049b767fd76abbfbefdcab198381126517fdda1cc29f7313584d7c5731dcfe9af0bf1702ec71122d0a4e08305166ab0f2e5b7908c1dce7039c1c525cc07e9160ae2b75056069c78a932844d1125b449b71010bf85b690902982902982909010d5df2d54650a4199423b5348eaaf07f5700e035d636e6842c9921f74c0fa1d54a138320213676ec04ac2857407fdf03b288745489a10aa70c16221dd423efc1672faeb5be849680898203060c4fcdd4159bda02ebd20acada0aaad20de0eb2faeb413a9c8bc0162740b0a10ae10b0ea997df414e2190828411509cb070440de90ebafa1d046505c5ca4aea863160d21dd4c3ef20a9bfbe83a682a84a266d4a266efe6ea0ae2935535c3ca02c5e8fa7f5d781763817aa41c24409251f9c8025e5e13790140792f0c035029b2e1ba64837d00ebf81a480a1ca13504988d8ca4a375097df401b0808ab0d109136517f37105409e4a3041a52d6ba4a205d09e4f4d76b3c9c7b00970f7690f24215ac255c7ed774a60c3145550a2a84a14a776dcbef5a16053c1c4cb08107066b8a74d7b4fcae69fdf55ddbaa7191b528646d4aad09d5df5dabead5a07ab55d4f4aeba7abe6f4d777ede96f6d08c9e4070cc944ccdf1f72ea879cfa21793f24ef87e4fdfce8702ec79414ab16744873830b4c58fdfe410ae2861b868042450712e9fec9f2fba7eaf0640bcb0a63acae9449f78f0ebf7fa4fefafe99027fff50b569d3c6cddfedd345ea7cd4903a1f2ef2c9278b7cf2e99101a022a814091a0f7349a714325323c00040002317003028180c8a06a328c9b144f90114000e63b65260521e0824f220857110648c210a004000008000008001a588ca00984ddc1a451fbaf9cfb961c8ff7b3289e65cadbdd42222f66c6dd6ab7c1bdf1cf354aef12ef285df769b694d6dc1a333d0b5a3f8c7961c74a0d18c4e3dd24813a7e9f27ff25e9a1dd91c9326343a600a343ef5146b088a2bb11db8e2bd1fc26e9e0acd637d1d476173dfddbcad8b587b7267872f7993e8e7dacf52614b1bdeaafcd3e9be3aa9665dfd2e71d8f38ead7514b0b51baa7d7eab015f23ca901cc98c0413bace4278363584745700bc2f7ca205439e90da644d1af0b2c967765d8da3d3df290edd2f9cf2f48b3bdca118d5d6219b6ae8b4c33159f190f0ad12d23661796dbf0d3d46d64c6096ca0565c41bc82e53925b09e0195e730346a1c0642ac0762c782667a657bd58983e3a8369db82fc14df4c805591c5fbe8a63c420b9f468bce76a6f6e011d37547d5725005fadc4e0fd345637e8e0cb18c4ae6dd1061371328c52b1243f80e949c444a63ba5761a8afe2977ec36594747496e8fef731c433c3eeb1d0d4fcc9fdf6b11859b24e1a25930c61d914d4faba54e98d5ed4fa360a3d63e77d8aa7829e273a89c921b8aed9487bb9631e24bb547289d42e9521f2525d787d157d6f87f49345f26d501e97472c6e0d1eab884ca5d0a58fd4dbf8f3918233d097deff66b59aafda223d13c89e77d3a2ef63da73678d9de076508298328aa1c0f6c8bbaeae0dcca05c424cec1a375b4140a5c3e1a600280a39219be2449bdc19889004b31d38a7abb8d11953520f59b045ae700a7da6a498aed89686f7e93aead269de6e7c31b9abd054b762f40cb42cda90661a5b4a99290828a69def47260d649b6b29dd69b987a21275aada3f4c3616e554ad56832442805a962a68854d48274f4a9379ea14136e4c3e8b34d6377e003f991b3b73e4954f2920b0a5cbaf78b2852ccc7d6f7bc11981e052475c585592380b8d49ed07aad0b6b4f3aee88367545be5f15a2636cf5a225089fc7fc859ff7d41bfda5379385a2293bc6a1e9bc464b9b2a059484323829b897417ddd929969b47ad0a1ddf0339df0f15388d7c1e88a801cce4e69b09988e7b99428bbb2bc51bb64ddf4f022d57f4feb932ef720745e33c403818245b4f786ec3445ff9b020a71299336c04ddadb0b968f1081b6981a7b05a70276f8a3e2475ec520972156ecb28d02b08c266e1ea436434c9b06eb243fd122bf46219028429b3c013b9b6746ab970370f957df6fd2f64f4edc25d7a53f220339b5337a1c145c448f46f9d2f638b9a1288abfe40a3ca171740f87c1da80fc6349a5cb97f64094a383086c0dcae24701e8b0e17ccc5c07accae4233dad06aa3f31c706e046b7e50e7e9012e270c941886884026fa8dd0cb94b8dfd96a9bb854b39853bb78b30b30d209e810e5f256e703a6a041dee10f28cc625cc31ed8dc3520c2f8593c4632196fd7a2a8d9a0739414c4692c11b771f94e059c92aab39bd05bd24ec8189dccbd68b43e246ae26b2169b03bf141a60d200e280b6e6826703a008e9eddaebb7c5c3e5aa63cd390c8884e9e5f203755dec2f9bcaf695e54d5990806af7b6795acc3450fbb5534e322068ed64018e2f83ed9ef25705b193f2eb28fc91190b3c4685e17053dbe12eaaad9e4b683e9e35b32dfa544f1e87e301a1c4a6a5519be059303174506af9813a142da9596c9f9be4025a77ffb80d9de20e5db07286065345dd331684fa9dc4c352704695315322e616356d685f5aa05b043aefcd8882a949190870984a2a0ac1711d1f32bbe380a5169c09fdb553805cb7839203d0e961b5c3b6712d736b0178dc0c8fdc3604458418ef59a1495ec17edbdb0fd93e482a505b98e645884c80cfccaa2ebcc151a4a59593d76476620572e0288eda5954c755846875d40ac7c68114296488107a4231b80358a59fa70b383f0d36f684a5119885bea4c36415da8f7e8e4b551d995b449472234e3e14f58c2e75bbb060e558b7014abdce08fc5bc86dd8d83d18df260375ab882fcb42866eaec9ad651cf204ef9790048beef049781281b24a0b6aa0af03f183259e16a4ae993d60d471ad0220cf65220df03161ea5d63150ac17e5828c4130603d662d2b7bca17cfeb7cb85913df739cc507e3edafa0525d79d0c432ee0611f908d7bbc0a4774701c159ccad6177486e090f8e1c26c2432b74dd77c9109bf448dc2b1a4d2594d3f90b5260b1f31bda13e67ff72b008d1c7b5813333008eabc0ab8e65b7943d79827b130f38fa6b3560131e08352224285d60ad88cf75986348845da5b733b53b4f6b2a722259df684eb8a197029e92f568a2328bff318b4f6bac434abf55c42b357f0955d4e879607e48cb80849dc3cee84f722fe6daedbfd4cc20cbaa08904212285acc9f76b2f9955511db465e06dd0a82d9052fdd53da7c962ca46052153222a0d7e8f7a82fd0cba40458bd8105b97c4fd3bd2728d0b0797559fcbe18279dab5b9a541ae2423f23e971d0fe1d60ef654a3b512932aa0ea8e369d8240358f3d177e410c37ec8b918b4a7e97a243b382ba64e96924e571117f7458b358242b6795f0afb0fa388445fe239e16cf02d1be3e6df042448478e1bc457769af7e9705c560038c239c0132892f0e270e30408e3f8ff30388a864794d9f1d8511e9940a802a88ad15716c87d127116145711ef66089106924c820dc365d58b73e8832248a65ade3ea71a224bf922885053a7b8371eee4c3988b55d516e545bc6e16468f800f27808423fd5291b48db1ea191a76afe23448a6af1277c06994c93b41354182680169c2843ab568f9ce0718fe09d05f3aa1f9b51aeb41cfa0c61be9935ed6841a1da7d44b15439934f91c5c412857b17b4fa0c89dd026c15ae385ea91c9a906505e3acc355dda2e9ea456de8a793d5f3299d80a9230f0ce2c4874d849c8041603445b9e26aed63592e7b51d4bdd4c88c9c39a7cdf40ac46fd4b48daba5523e440b8a4a44147ebe6666fb573dbf1b2359bcc94fbb656bdd1871efcf0d343a5a1cb3f4c545905919fb0e9da13a75a97a7cbe996b30fe5562190c095150871da3088bdfb3b235daf2378c3f1a6df731d7fc8875257a1b79fda8859abab929b323932b3e8059187c810170466ec1a012018f5c16fff5837e1e203cb1a110f85a23d09b23acc203f0818b7cb9b082fa1bd61446f68b5e03d58a54e2bd96a32437b3e817b459c661966891ada83fc2aac6da067c268ad1b58a88c1fa290553f059d3c30638956901de9d54485f5269b10befd432eec6d1a1ab0cc8a15b2453f2562c781526acde7801927b34893f06373533b7d45e6b48c4ba67d09900efee3e23162e238ac260bae8ef40a22b255264c0c3f21ede8b771d884692692e93f0ef41656946de9c9c48df1125a902fedfe302622fdfd23eed8633a1ab3c00a2b65b20fc67d2b913327b3a62b8912564d3781ccfc83713331dd27e782955322330f1ffb9859f8806e76ddde7021ad993051d9d6bd4eec18a7b4644e566a86d4d83864c2c426920dcd9c8895879b326902b2a14d5362e25053a64c2083ffb9b8d56f80b492721ce0ca09e3b13a3efedb415726ac3181ccff810dd5bb28d7e79890af32c6245a2eb3e2976034bd4e6f084d2f5aa0fd257493ff6cedd36c84b4087cd42bdbc44ba029a51dca82990a4767203b454a90ebefba85dbba68e356900edff736e47094354ea2855b898c9edc0ecc225bbb48fd7ee7896122cca36eb0bf3d850d82dae5665cfa9314c8b435b858f38556080139d75cf5da329d6345f4f12ae567c09dfa7213c130a08a4e90d4aa3b149384fed197e3e9477129567cc28f4a3847701d85cefb443f7718209ef39de54064c203cc2e07a9e31d01a934a57080af926fee6e5d37fe1ea521f6c674e5c8b44ed060246968eec115a0bb88e0098dd38be8e0d2a7832ba10eae4b325cf893e13232ffb06dae919aa1bae8d0d1f0b221c40a6ee862a2cb5e4d0714bcfb4a90fa3f3be27e64e92fdd64562c1caf3a87e0e96db1888000949f57014c69543bc7f05861d99cfe52db502d7b1af734c23b289c6182b2422d007b8195c932001c6c3fef3b1b3864f2067bf37cf8579a0c28466851c129e684437b6a7ef03cf06843c5d3cd0fe73ce5b215f54e373ffcb424e03654e12654f6e8fc1f49d92fa264323626bcfaae27342a64a33d4f09e32ed5a62cc85f0aa4c846381b297093222f4d1220fb4f64465e0ca7dcac093f3eaed7c36a7d09d4cc832dc5c15084cae1b96644ed951f18fb6d95930056e34cf3a2ca5b6ed0f6809c9da8b29517da5f008e020bb6ccd9799773b5999cd49eb715def6ec2eac642b4adc5eb185e9adf196977edbbd1331e867a8ce6dcc46cbd39d08edf85e80a3a967fb6a701457642b3b6f5be1855987f1396e9991d913a99868f6a55c23cb36fa9191101754a98a8e72a9f9e4a4cab429fd3a2771ec26d668590e339a39c94d7c687f245174db142e813901572587117075de0f83632315b37d0bf7dd455e649e9be53cf49c7cbecd459dc72821124a79601cc008aab5fec97a88375dfb7681a5aa4fb89d8bc40096e803c76a7ed9b7662c06a3f1327fd75d9dbf0a4f79729b0362ceca7466814a4fe0a9484d16b1b6acfa8cb5ace96f5aaa7f7cca31322ead83cfec42ce1205249bb845c14f9e1b7208f9c389a323aa820a8fe11c95a6a7d5bb5d4e35a7b190a4893578512ea3bed8484ba220a610d20c59aa5dd4c2b01dc5933a08e4bd6993e19922d8c509293b355736992042b58528d3280039fc0c3069eca6881234248338b9553a350df75c7f3956501c5cc0dca0c3f662ca6d9e0cce59f58b491c1aa71572702580c50698b7895da5a3e135e2d7a423024aaf7ca9fa1490b24cddc0e507b86167f263e5cf811e1b086eee70a1da8813507b5a0842b5e38a8fce326bd784108ed6a15f8eb5454850ee1d5a255d5cefb00b5e7a72234919859216dcbf7764b37cf55a32db7f6a6231a9b4c02b7d9478d263aa4ddbec17be80ae16f8bebf5f897e9658d4d7debff96542c658de7725754c5823eb134829f9c0da5cbb9d2c2f7d5f80e06ea244ccb5a3bb789963589fa5bc947dea01e293b509473be1dfe3cd60277f28ed50a59ba77c0c297a28d9e84629d64c80e9b7cd8dac03b02ac31f44477532884c09b00be7de1b71ac0d2c33c2461bcfa848d4983c833663d383393c590b80e9c8d9a95853ab5783c55c9c8c4afafba0347a7d192498e7b38829ddf3b8af967fee0023afbed51f7a5c73008cb8185dd3351a53b62bbd62fc74b02948005829938a905225c98302e795aefd0c2160bd7d113181824a3b8bb4ca79a17108c11faf4be4bcc4963b6b280f107787126fe5ce523a487019daceda0ac19d0a6a982247e0668f07955033fd80f668381a07443e6d854dc63156722aa9d71c9a90824dad985af379e78812b7e0451f161351403e74ad4bf00067c7cb433478e438e06779f3d7a1e4a8d69c1c63c0590bf4ca3e18b9841e8ae086ba00822f9478139895d6ed92e9e2a905b7d2daad989f46def36eeb5a37e2eec5899755eed980d75a2fbf5a1ec6e20b64fffe8681d999cda81e790dd0650bbaebe074bb9e78dd9ed1d4f7ed8e078e4ea2cf3f5cb501ee9b49cce98601063ceab24b4883d670fd72f301ba80ed73332f0edfd2390ff702226192f95a702cd767276ff17a11b87a79bfc81bfca5d02bfbb893eac560d4150bd82989659a32737d06256323d8e61020adc76a3a741101b506a1d501416d1a4abc7b9108bafc12b004f93da056573d9993f7a2822cefcd1034608d60f3be8d22a0a6311121eea938d6e8eda267294070b23e8f64994aafb95edd4708936005ebf2ba4282e2060176d1be11558a6664ac90e4eb923ebd25aee87d0cc9f3a83ff73d935c7e72bb8e794e6025fd5bb33fbcb32b8934164120c8fcb28307face6c2afbdf80ac6a06f640a816ca84a31380a3b138f96debb920689701f19327ae48be359c9b27963eb0f45687fa95f7d888beb4836607bf022c9a71b9d649079a271dd7226be9762643c9730b0cbd1b6d041baa65a447f231f84432ae121000326a32e488a01ce3d051f2d4e8b23e53eb0b4d5cb81712760de61828c35058b8c9ae89eaa85f8293eed0b70104e3e9f0997e4e879232bd392902816b792bf96264f442cf5825da4a24d6cce9a453c8e5188fbf0d508c5d468874c374f7050d8e58726810c81f1ed0062d303d0bc289b5ae7986409d6c586e9331021e874e0afb0e915ab0c8403b0c9e022dd6e974b7b61a60933e2b0c859df4bd48e0839288408cd1e1276550810871c30bd053b50153ff758d83967fd7c1779b9bf0b829c30c98d5c71df838891845b1f4256bc45c2268a33e40408df62df428d7800e4dd0bb0ebe1bdb84c7471986c0549cc2c0e7580fa422decd6a2ff549fb350766b16e063da049a96209dec7134ac46add0c501a430358fbcc7ba82496ad61553a5c3639bc3560d734fb13f0eba8a6f1159dad44f5ecbc6e0501422e8c18c223d80514bdf5e29b1734313cbff05a0820bf9bd124602d479094885b834e18772341028abb2d6616a820739c1305d59fc53323b73b7b3887b2da9def9060bde6570e7f40564ff7e598516f3cd75557c0736d25924e958430a0519a643a183d598fa7c50ae46fa34989ea6fc4fd0b0e5e022ea0b7a585b93f871fe91f0181aa7b8dfdf48a7e78dad35508581b5f75b7bf79898aef7b8724b53680afdbcfa692b72daeb800667fdf778c3232151a33c7dceba9e904e33642b15026e027593b26de1663fd3134c53efd07a705a2a277b6d65845bc8df1b1b0c754631ecc3dc1f622c1f19608e17727da8ed45c7ad38259694776dd713bef6ae7fb8296455859cbd49fe76b64e62ecb46dc35b2015882b80bf432c04c5e97ec9183d0e94053ec7ec53a24c887bbf63b4a30f3ac740cca4f0c4edccf83663764d3dde5118177fdccb8fa922b500b99e0dde9e98efb900cf727b1b715094475dd1506f070f3ccbd5330c7839d0bc2b1355c6351ed1a4b80b8b4fd662f1abe4677a0d39a82504afd79087554074b98613db55a5161c4825d19e5a173b9486a4fe9722201f8ac91b2deb558a83d1560740d10cb71fe45cbb125f1536f657daab26c995ac93ecd5623d0c49c6c29417475c8b7d7da8a49de1ef82e5c50aa85e92e9fa25bd3b59490ec1f182f90220e6c9d3dda03e676f26ef384c027078964f11b3acb9edf188734ab8cdc889bf71abc4041a7fc64e733951f06b49b551777b7f481df974784aced2540054d8bc14ddd38b8a593657a1390701e14b6178848346e0d2431e3b9f0b83b51e02d49bb82aa8d0907e71362838655a8d1c0b798a4fd0858ed8623f4cc7847f758be0bd1a894b489a54176f34af19786657be77fde0a0f66e970f0ab6c323ed33b9a2bd58d8768f535aa686c97b5bd12db1acc955066e47cdbb8b0ee0ffc4b78cf4e1104824ce3ededa5e168f6f0275c41120fe2aa41c4d56795225e82e18437c9f2464bafda3a7acf8825ee5eaf8346b494ff932c0dbfa1873afcaaf0be3f2d304ae5ac84ac7fda4baf5d3cdd94c9fcec4ea83d1ad99600b89ba928719117223081699196c1f058f0e2f458a9bdc172edcc8d6d833ebc5cf929a0ed3937dab80888a2e19ad5d2c6dfac4d842a8fb5515d4e7e278ea572729b1d75d2b8cbe65bd5d20ca72c5e70116d4a919b0c42458a8d1c5c0db95c7147343cd1ce75ae1cf0ddda17484995281ef575a06558fcbcd8f8955b78cedf8f3ad053482da3ca8a8c4268c6388b257d160cad4bb8634a3be743f3403e6b797014b9327ccc02d405f9a2472dc05830a1471a264ea008c968296e2da4bc80fc303462614614dcfcbcd71ac0a1af1cfc79bc233a4ae3c15691501abdc18440c409000d811e89caaf57c4734b1cda101535ae6a08390cc2aa778a44403e75b276fba8b20949531fa481ff8a7176f0e4a8b527acebd2ebc2af8a935aeab85e3b27cbb2643d4aa8d5cf052add460e5d0d50248abd0a309f0bdf883f843ef7e7219a968e64f9d6f7b8cf3334acd044c63a5316e1d0ea89e1ea13c6c0faaefe7c03c4853750c8bf591e6448a6a3dd0734e7ea2652b0b321d516cc98fe5a042bf754a5d6ed54e28ef1de1e6588cc280b1760dfa4b92d322d025f4c6c0f7a1800b8c9a31a8dbf9dc732d59a5caedf273963ca7f5b83ed9bbc38fff45702159e04ad5a41d9980b3d6cfa40f4e6e73096b17843d47887dfdfa867cc0899b16f57b5dc173d407072095ba490be9601d19560e025affd6c3fd7c72b888ae28a0ec089ea787cf622e4038bfc30c9e3b14430b77d3f9e2e9955c9fc53bec34e6b2a7fd9b6ec69a7437cbd112e3a8c52e5115aa5dfe206b53b0407521bc8c62b86fca04e4960f144d7f2f24972c019d6a001e8f5f0884b4f3ea124aab54cbdc12d6d0e7fbe953293a6c1359f3d2593f794c3a2898ed250cacea02ec41ecf08312b999794fafba93070a0883a7b1524cc59fba3bb85a02942bd2e0d4160f1686b98815f8b96ffccd2b406f581661b70e921a0a2ac80c15ff39c9f133aa0204cec49142024cb765397103bf1f92989af2d67116e133ea8a8e86bd323b5c256584661fe1f366d40e3aa20be536254ce39ae4e65f812459779a91ea84a1dc9f0d58533d205820462ad75f484d43151de8b765bb8fb060fd183739f834c8aa4387e483075a3c89f4d8fce0e7a163d0f7bcc9b276611b57122ade7f5a03916a861be49a04068093a094e11deeb2fa00b21795218eb897cf0e59b555f738c92299d7146995ea78b274a69353f632d5c31c39e4cdbdf79a91761bdf08305938617d5efc49f755aa0e6b5c6bf3223c9f9058b33fdf2a88479e96428419e484bfd46a8a741f31cfc7d4d521c11a9a1c680b1bff22b306173095c6d3224274dd22db0e4fd467f9990fff220b758e21b4f406f9acb6eac1c993250de2d35cda3156d71ebb25ef04476e3e0cbea9882590744c3be8cca0ba5146fbe7f3dcef9d7a74ecb14884158704ed2aeff71871939e9874a5c6606af1f80cf558c1857dc4855de7460d4511126c922215c3e742340b31d1b5c3b75c848a71d71e6f411274e3b1e0bbc306801ccafa0c24e30aeeff05bbf99de67a47cb6f9dd2a471819902dbbe4e13f2b700ec818e7d5cfdfb759c0909b0ffb1105e3475cc00d382ed67a2a9321e5eda935e9960ccbc2da161f65fcc009e8efd76dda3fb759ce9ca624b9a51bc1d25470eaec57cd68bdc9e40406221871d87eefc7e074c5b064de1f97a7f874603671b74156e2e9e2b8416234bfabb8b9b1498df26dda1995549ecaa2d6b47e406daf69f5c8824bd11d2bb6581f3f7012b74ee68ea0624c3ef044597e1bbc7bfd047c087376b1bb49a575e6b4ed52531f1ef9d8671e77c8c6f500a0365ddf2ec8f8e58d0177d8d8a52832298678e6f27781d35a3c4fd4c87eb124863e8f644a01a630ffcd5c45a137d57a14fe3a1e2f87d2f10cec055a5753c351b3355520821ae8e90144e65b3d4410b5046da3d54800aed416770de131bea0df5d0e6fa1abac86944d5bcef9a9061f5dc82757e998fdefb399ec5584834dfc4ba4f47db06991bd1c7ea8452443fbd12c9c65979f66093a5ccbe708e1a5498a1722619a93cca0004c355b70edb15d1f5b3a601aa6b8d647cdb147a034da108e24448ff708a5d34b979327258edeeadead7b2edc619199863ed14db7b5b4a7a54adb74f45a1988762a2e1098d81277134d7bae71e526b5473ed7a8729ddb5d0ea3d3a20a57b13c4825aa64ca96e0909c2384d7b0f30fb3de700afb1887675accb6e401711fba90632520fb680e5f28c518b2784dda01017dc01475a245e3560d324047758ea20dadcbe1fa590b641d3051697069985b00ac1cf8a5c1ff7ac920093ab8606e52264cbf63d7e8c034e32699455cf8d1a2ba5a7f80f77c3795940d8de31759c66af7c333103b7fce6182eabd3fe7f051c0a515c513bc87a5ab8b292a6d7b350eabaae8b4584e6d1dc67d85f9bc0c6e912f69209ecf93291272b659e2069d0354c36d4b744bf9d744e05aa98d94d40ef903cf4a33e4751b66cc238a9fba76e1bf2b136819a3be28e6fc16d8293d73b75ddc691a393f7793154d550d2ef70c8c99cf9de43c1fb58b1770835e819d8c590f9c34995e818d4734319dee4a18cbc9a4372002663e275d4283733c6ad80f69361f768fbd9cd1805e454074d487ebd9e398116f14f22810f94f826c01b903e9b463ae9d050e2a6cc801c4ef9e3d7afa8d174f172e44914d8208699d85f0fd77efdf3d7b849e922f52f24d5238bfa59e9be8e411b3cd0ed770f34fa8ee9d7e318632d1761fc03287710e6f86415989ed8e6857b82f81597b2917434d1a72f0423ce20afd758085b152d02e07aba0998e7c9a75993e3701319e70ba52ee49d07e65bb3491c9eb96cd1247779441ad1284a30be8b7a162188d97628898a318ad09485f419f44a2119d7aa6bb5c63b4885cfc65dc284474847c8954964f07f8db960545d6ed93fe8aa96dec8cdbb208c8963dce210dffa58f45a63923feef227c4f48659b27a2452ca04573f369efc7cfaa39e90f7bbc926617be5839d9aec0b85b0765f527ffa39deb652860e5a4a53ab64d6cee1dfd345a0cf0f7f7a54a120d6e3278d78ee1145c456ec76d58f454525baea32bcf14952008939d338160179510ef2ed0324525a2470f499733857cbb5132c3bede02842e5b5347186e8f5b13c3aee74af83818643eb4c23e7f10ee10696b90a07df12444af27d75765c52dfe9211869af2c1dbf0ad9bd768a31c9c3fcdbcc3c39d54a0b24408969c8ba15bc31398af27180bfdd0e47009e8a1a553623bf67d2f281a428e1ee9a70fbb98cbf234b4a0814be188d57bdf432380d3a6a6b1a800cda084184ef999d3843bd8fe96f4ccd7042670597696c382cdffff90137bd36d7bf6cef744ac335c5dd75ccc5250a954a1b600200a758f655bcfca7ca6a2448c340b242dddfbcc5b02ac6c7b62280067d49712319607c255c78b4466610e790eea16ebaf9765fa21c5a198e64260112c05ba9382fcb9573bf730504a0b59cc16f914fb8c640d9009bc94dd1128b260184970ad6d20af4476c883a557250abef836ea1a5820ff10456a84b29c24ca66aecb31dabc89b2d98c4dd50cc571101795fbe9677c2eadbe349b1fd22ad5ba6e6490e96934886376c79567291ccc13c10020c25811ea15691655a0417566a5c163dc6c60336e6cb08ca53e903ee50bf82edd7d5508169b2cc2fb2d9e9e79504455bce4ffa821b3bfa8c1f31faba1f9dfc81875f7b2f2f97fee01ef3f56f6e85c3cb428310494dea4454f03a1f182da2387a597878ae59f070b0b640f124be61e2d7b6459dac9288f438ab90b7f22cd750f74209e10d773bc2495909d36a13d4d4b6a3d5f96f83d9096a87b722d757b542efdf670a1aacfbc40b7f724b207ed9b0edaece34e7d1c4d651552af72881d9803e3f30b266654b461d6259f36125db2a50da697d4b561f8259f3652a5b6db06d3efbd6d24452f97b4ff27e13243ef683da48c43c1cc9b64b5a176d97da9fb86f02816b329924411489c501812d3a8ad606d0146113ecb42bc8b919cbaddae0c66948909a629a246d0683b65dda31d4605f79413619c505c757c809ac4c98c7780d25b9b032f0e313789efa0a4d4e017b329524018d15b9be4dedc4edbd35e8e6568bd34cb99bd4dcbcabd3f9699bd302e137b732c37f56a2c7ff6722c43eea558ceecede84e60ef233ae2c732a8f6c9f92658b9894c8f9099a9b60eeeb0c336dc80f19d7d5f01ff46d5f07393d53373b7ab2b717fa933e5865227e6ce566fcaad56ffc4cdaa0e999ba49e39775b5d99fb4b9d393794c7666ece708a19db4b663659197d7765ccb0571031c520420edda58622d7dec7e859ee4324e8dd874dd0741f3a41cb3edc04cdfb3009baefc32668dd8749d07a1f2641eb3ecc04adfb30095aedc32468dd8771da6509320ea2b50a79f4e6ce337e5499f81713949d4e2aa5969b2ed1e457350cb309e37bf76a8b26acd7e08d4250436914111a5a5020d44082e252c352148e1a84a2286888124553031214c41aaea258d4e08242b0861214911a5aa240d440f2e4510d5ae2ee01b89ff6b6d23e1967470a5b710389bd8a5da7bd22d105c84b6852c3703faab5d09075c08e60a65707108e6cf751226990044e47cae72df795af1f7e3ea1c14bb32978fb2d28a18b0c6a47d24407e86db92a3f3655e1bd88594e436c355481d09f19fba94f2da6039ececa6a2ba1db369304359350a72516ec7cecded51b1f4064ba791aa75bffc0da11fee13708c8b8fe9057483cee7b22cba86e228915ebb46bd2143a590672c82bf340cb89463f793628d9af50fcb3ccf3a6f0b8bada356f807fbe0afeba3c173428774d5b014a5a52d0ba091adaf7b38b308133229f6ab544fb40af14949c3dba11da660d92e10782c84df32ecab758743b1629114645abbf4998a1d0126ffcc3a1d0a04dc094fc10e31d7d7de0fc53c855d810ac644a513cfedad39bb61fa8218009f4549a1f1920122cb3b891ded681030a6e5060c54291c8a20af0068ff9f402097710e4155177efdb30b243496212cd5878d58650fef871238488f6cbdd69070db7f4f8a6dfe1baeea6ecd48060088d15101c0f9d5c2b175389f6f2d540243d884f0d4c47e0373273a72034ec36ae693fb5837a6a3bc959b85c6f026966187a10da300f610d99c0c3e17fb340959320be4a683ed3b530f8496ba55a0a18c527dbd8f347bb0e23647156a450f3431d6b8d4bde9ad9c55d0004012cc62418eb10e39509e6f77f6afa0c86d96fa2c3c27523d82fc5c040b2cf6a34bc06d9c26513a23dd1771a42dacab4a0c038d99f61c00b575eaa0ec8dbe42a773942d82a923816423a58af41b65d0d9528b05dd75c7540561e1611825c33ea0179594483e07d108218e109a7d31460277728bfb887a89155ea5ab6e5ba8f8a83c5a70a6d376ef4bb60dbe55bd971c4df31b61d48189dfdcb5870631e3257e67b5248517ace70b1e4b42253518224f0a8558b7719c4c91b9f837b10637c4cae21c6f8807fee5fb803fa7bfffed9aff4fb7dfddd5fe8f75efcbfdff41f066e8a505cb01b44e6242e3fd2aa67ce67fb8262fc0fd4ca1be1a153cc366ad50a9a5bf58296ab5ed0ecaaf7bfbdeaf5632ad5c303e73572c07558b9880016a73859ad0daa24dc943d1d3b0730078a86e85d311e69d769b1a321ed96873ac9775ba1240f040c27744670d94e8209d3049053f4c9a2850a4137916854b56a84aca506bca0d115e44185048d4dfb3b3d445ff8ba469a36cdbea834cb51a259105e39b72c1132aa7dcc519557243af3b5427e3df49070421cc0fb86d0a65a0059a4a4bfb360f8f49aea084dd5ca39254d8d255aa69a030bf3321dc609fb0966247802d67e10b5461567ff8980bfc97c831d6aad5181183f71c0ed3381b7e2d0b461b383b07dba7e8d2bc92670f843ef8d20f3bd74163e3aebd215d8c890036988238459bfc3263b6c3b889aac2a461f0b643f3cdbb402773be3f5a879120d2393a1c06c8b5a8ff8884d14206f8bb414c7f7bb5b3cf29f8472ec94409bb3e3083f64efc0f9e6d220114a6a02770391b31b86f320afa6d3d819bc6660a35281fc9d170d061a10796ad6000a8c8963684011c2a4395464856a656eef0193c3b662709eeed769bd3e60741b0ec67a837b4feb9f8017f097510e63f42b76fb0a96e306affe1b5299b0e38f9683ff51bd6f4144f551c2889b1838dc22db9a3b1a742e75ee1500231fd565b5adb1efc7afc6600cabdf84713377be876af28f2ccdf3cc6ef971b3ad034709c6ff8b30f1ff76bfc6b81541088d6f53d1f24d25a98f339704038d51be8c4e0ec2745057192a9c444530b38ba8d57ce150d15774a8c0654cf19debe0aaa829a6a8427bbea12b4f1a25b2c63a94b5fe5c9429ec51a617e22b3c2305c05f5104ad034746582c42dccdd1ac5d6ce523a2b383d4e98a83ec19aecd590f1c6097064cf7f0a8bf08d1f78e55b0fa5250c99ea43407d706431cb42248e4122686fc1f674860fd0765139f1526f451b415653c9dc1d2cd5f9fabb4bf2a0d44aea6bf4efd13f89726d653f60e3bfde2c92a1b871196f7f997e85a93fe8ec948d494be0597f2c6a873f780c8ef3c8238380acb747b462003e6463410a1fca9ca27503af986504a7365ea451c3588a5f7fa23c4199a0b1e6661587d821320eb323998176026156a3a0dd04495acf90425724b9c67f441b9413a1b02d145921929d5054711fe604cca4fa26084ead2912aecc4c16a261fabad8747859d19451036ae8d8be5fa1f479d40051d1144f6be80826c7846648a34df0af6f61674cb0d56adce67d8eff71f9ffa18e951bbdf9dfe66d671a0aec902c08e8fe2297c8edf6b823ef1010f7f71a44f2318612539b58ac033df658c0fc3b2747cac106a417305a37baff069cafe733c1a19067707713a6d543abadbed259b5f74247702e053801dca07add35e77ed4f4491c5624ad0abdc05c4d8641e84ef293327c875ab65653d8c81443a571f8e5f74e5a2f240996c441eb6567d64349392e7bfd5e513453d76eee12ea57dda92c2bb35c99f8f44a18ffe04e5aa8be4fa10d8558738bfb1ad28bc5c357cedb7e067861f186dbbb3a245960965927901f5c23f9004a2e27005ecb7c3b9352d4cb0c0b4d2d630d8e32371a64377dbd2af7900d45ecc30950e2643c76ccdb546daec8e6223e2bc9bf8b5425b0a2d24ad75e055472234cb101a81e7180dead1278b1e09abf3c7355aa4d5c0d16e97e81a711646c6975c6c3efbe6e8687a5a20304037f3e9cebda2d2978bd3028f7bcaa1d09e3889a49472e7655bd50428c67731fd43fc2443e0fe4063a48b880b9b75015dc58455fbeb2f81ba2923730cea811425dbd4dff6cb20e76c33e8e4f528506721fffde6ba9dad16a32d3949b4ef1930f8bedc94df49b7c002e4285cc5c8124656ef9021ebe6b9018aa1a7481daef874c19e7d710e52d1640a4809b3490562c75feba6ead42d17c6d2e1fef5aaff8b7d012ca1aa424838d4280e5052d2ff93cc1a20b2394cc889305e324ce2b5c643a06051cc679cbfd0811e503197350f38ded07eadd56cbcc0f9d222a21f14be5741b8ec479bd388ccc517c4d42908d3c398cf37b2ac243a6c78ade57ea7730c51b30273e2e5e637363ec74567635c6056609a3c6b59eecbede479deecd0b2a7a4655f73e3569f2ed324eba9e1ff1520a2b4905af6c0af514daab6ac69232e5637be5091385079cdc2248c063ca1b985149239f1433b06081381f11b81b3a968d90775d6f3e55442a4b8f3f3184fd181e4e6762f0afde111dd22080814703b1e8886fffda8de78dbd5eeba706bb1ed45803c233e05121f04a613dcac7ba7ee2b34ac59a2ca9f439ff06f7fd158f84f8d508a3d4aaca7505c7bd07b54ecaee5bc708619bfaa0ed09709df31c6c4f21310f11bdb3f2bb89df2ba91ee7f7d425116290b19ef5cc3cdf56404b46951c0c8874c678b38986c88b2fb6b2973c13a57269323f5ec79f876612d4b58fb91c44586ac06cedbf7ae14b67fb009cdb3c5318fb90adfbd6c6c48765b0b774cb05656b1ec65762fb6d728b2aad69ad00bc8a0f692348357eb87530467343bffeb1284262a3fb3dff9a8b075fada0b76e05065b0307f14a765f79af62ea7ddb916e23d76c7dee007dca04eb8d8187516c2ffe7f505d3f5abefb8b68c124288937dadb9930f77d395be797c2a4a7e60ab9aced9cc3d4976c77f1682e847b27571f284d8f3a514482b3f37b000b07950c45955f900f31d95c937b99bab8ca47d1e7c83b0bc459f11a19f74fe2c695e72bc8ea395cedac4b38abd2ff977eaf906c0c43eeae22a93032a7870d01e19bfafae85ffa9a0f3e069bc0374bbbe968176173b38e4c5383a35d80e4e863500e21905f53875dd4d78a0a5167e30fe1b87d34b058bcc55e4e22c83fe4f84cac685c81efa79ecae4a310b5946793fd85ad07c983daf78b0522b20105b88e251a85dc8a7348328f4ee44775e3e901eba5928c2e4a900c02be691f12fc17f014a3020f68370e63c242f120f822210281406693e1e897e47446785755bc4c3899b5f5220fb96a21742b45ff1c207c99369b21494b365a757307b070a11cbf3123ecb1bbb242996e907319e05e397b96caa6efbb7658ba41e4135c5f9962f7e0422be3ebe65e6d6cf69234bc15fa008f0780137fab22d3b01f08091f96e154e218c8c7c25fecf1851bcaa7a87a93572ee23fd5c07eb0bee3eb4243ec8d5d3fcfa0ac38931664682b7506be24d5f7927abb13d5220ada0198536889fa4369e97f1b60dea267dc127b17238b89b29de63cf74d19bdeab661fc9728796dd58b981f0f37a98124019be0afeea881ce2a58da5780f662531b30dd0e44035eff384e77c3c53d7204712b82224b5cd96cd69c6e05b61f8a8421f006741af436c36b573e0c32d62067db26a0edbd89616698bd4a2d7a8626f15dc670aaf110701e6f24d03d90aac01b7ee0ce42f957f7fc73b9c40d290d5dc885a1e1b911b9211398e8be81a3454f1994a26a89ea276f884bba7e8290b0bdf5ceff1eb39e70b749210340053aed762ececa2763938c8e3e1624aa79e9a388a5078631b4bf7b1d71b7ff492b03879d24f7d4efe48aced9423421656f270c5dc9b4587fce4a1197487ab5b92b7eb079cdbde043c6b60ce5c3480b4168ea0b335c2e32aebd5c4adfa95ccdb8796f854e097f0abeb4cd2a85d0be6ce5463bb14de77c2eb2d30cc17ea507d6a066e8727d2133c62a286376bbfeb5be8f6d4fe8adc44371685ebf9d843edde3cadb992ad9eae20272ec18fff90f44a602c13a64218756e0affc3ec8919d70f11b86eecadd3e481b5334de453a4ed9ba318a7df66a3366e18e16ffc6386452e0f1cfbe6f61e41b5b6423fb1cd40ae5a884dd68c2e396fc5041cc957f4827e8b796268b7c97c25f80ba7c6f8eb8906c240a52162402c6669a62f6953c77525d241e13a0cfc42e8e9107cddd492b08a452e9845a16eaaa942df3428150915e8e62a0dca2a6af6b7cb3cf2fee2a267cb831de31f1357f1ca9263a3cd0c05c87264e20f192dd59412abdff08bd5bfe8dad4ab0674a81cb631a1a202309ffcee12bd58ed3ab9c01585c3b20eb9aed7ebebae70c6326ed8eb19c1b05d48de221504784f30282bfb3a52e7d0c0ca25601abf79eabe090855f26880bc8b7f1d77c6514ac1f09ab2d29321de96c570d726f6467cde180f895ec3c2fbeae36680c66c08d053d7816d484578de03d64c22457b53b8cfbfa40fab9ad1cfd93a8343d7db99529b5cece2e0853bc7f0c20f348797e8f3bb208f2949e64bd788c9626880e8de2e21d092e906cf31e2bf756d33f27d8cbbf2a0a06916ccac5118b3cf9a15dc265f61f874637a17b3f026abb91651d02e2f74be731cc86d4d32e174bf2bbd84c31a6ae5d3f7e9a129d24422e2b61611f852a505706abe7f21893fd5bfb0c0f606260a06871796246bff54b9b1fb4bf57cfc8cd6d72ff3bf9b31471c84c1a51be4774e5c0a17911e8c35a3f4d281a061e94bb5a75df2b9e1f0f21b6bcb0b38a37a3ef32e549b74181e32230c950bb842061fcd8f6ece4b4178ff27b8b8c17da1eb987ac6c1ac84bb41afa445190652c6d8e21457b8677813399d59d40c9d5e4038edd0eb97992cfd3607ec75d1b5b2ff97ae76d93a041a598b9b42ae5e2a840a72058ab80e854af4e2ecdda6387520473db9c345ba22eaa93d33d6991ffbfc996ee939d17cde47d2d4b73b4d10ad6dc0762b0b626a8a411358f362e89a942c7a8b466cc21770b5061bcf26faa3811df30592b8194850377900d4da4dba5196c6eccab2cb091bf4551eca27df5afccb0a955b5f43ae71df731ec3b02c93ab27a000c7304cb3011bdf2db43bf375f1910d58b6c44e270423b5e480160b8301e05b28c0e2404d403636e0114aef7181ca5dbf17a0e274f34609e59fb6b023a50b969862209d4a0e0d1021305ecb60a13fbb58ce2f81306dd7ab2181409975458129d875694ae7a13c1a35495fc76647f80b310acbb78c4ede3c2812947472f011606919b6ba04dec376b3e734a07b506804377c7ea4f6120c7d851690fbd561c01ae76b8b79e1935c122910b263ec61be06c75bc2c7f611ec1508971615c22641ef0e0e3ae003ddd25a4ccfed87b82815fae19da3573c813479c6997212fe2b215be94be2921a73dec66bb97f25b92510bffa04c25a85bae883704c91cbc82ab3fccda12732d94a36b29823ca4746affa834bc7be26afc809abeb9269b5493fa9e9fd27794d1711a85adc3a93871591dac2ce4cc39a8332dab7290bd7423cbb63678dcf2dd2ecc72f243ec9489834080d2c2ee06f4ea5c20d69b9afee922fe2ef3e4c99e80fa54785d4d32990bee9051f460fe02dda20af7b70bfca7a1e3c1b5c42d2e509961a102745eacb08e8b3019e79dcc019444bd2042d4cef10f1bbc665ee2164051a4adf0d4a278b97dc50d69d387b4fe0a015a2d8d3b95492bbf54b10400af950c9cc5b7910ebaad51e09a0129f5183660db0f579242e6ab4d0e70e98d0590b427ba1969f05e949c2d28061351bf832e63c134bd2945dadf3e36823faa5f19bcce6b8ddb8af81b643b892594f0a4c35ed9b77383083ee8e06ad155ff61359a939f6dc39ad6af842b56b4304c562089a1e5f2b32d21a8a6cbe96cab661da67ce0baed4719fec895af4179814f0741b893bfdc21d275a4ed8a4d0af98d641ff746396e0d669c92fa6ec5094db8a3b10ac697fe3ab8aac1d4318cfa36a0f56e91f6de0579aee033f77e9a757d7284368ce5e8b374a08540c8bfa08d55ca6fa036d8c30ff3d6d8dda98c2b4e9742c68f1ef89c5935b0b930791aa39bc756cb2139b6114d856d9ac9cfa940abbd0abf6d959b56c169cd211c2b1cc72a89f43fb52b0e728ccb64d4b6b4f42e9d600dc0f8542ec300258f2275afd6c32860ea73f82f1d77504183906a9801372d70f56fc6700295b99a83e4cbfa524045a33896df7015237377d9748a0341e5a5faecbdd0d9f902f429913836eddcbeb276ebebbb1d2223beba63e69fe30298f387d87e1f04755200ac8cbc93529bef2bd80962a25ae865e4bafa033bf29b0924957812c228984c2738812d203f65af8ce20c281e940e9c9f0c6b99c4906ff397173ea1f815790e3a55088e78d3fd82f3f7638e30cde40384373c1e02477d9579bd6de1993560dae29e0b12e0624d3639217ed873c6926b3460688d428fad0aeb687db9fcc3b36af336f75806f920060b7c3c01ed9e76b43a67d31330f578187e684b9a7cb0773178070528f9e1be1f3c36a96f3812050cf491a1e414efda1f46dd1c4da13b7dc1614a627d27366d30dfc5e01a52f3212eb208398396a4818d774364bb814be91fd7e27f36f2ed61cbb6f81bae58dfe61a7b19a29978c79f9f1fa23c3da26a9124c81bd8a6e7ee09a5e1f4e6056c1ff6bb2a9131d0e2e5edf6034a59d4dc23beb14d673b55ce77618ad1e91b88a8ce0955291f773ee8be47fca68f44c64612a62db627296d50f74445b47222151142e0235701d166872d863298bad5d9a9bba068a030bedc470fb834cedff4dcca543f36e84515722dd1cdaec754a591e2b2ffe70c334d0c4e12e10f0fe9fbae674b9e743ed0f59d674a45b17c44de1149d4a0078062924580ef266394d70d4f5d436248bd5c5c9156342b9fdf0496988349aea451d356ecc639f8f2322aa0c354933e1aace38c4602b6419d424e27e873cd401f4d74bce890a33e6b831260c899a1be34f709f43f68d58796b80e3fc8d3970d8a29ea3d70353f550561faa2a76315adf09ee7f9414669e1ac9f87261dfdaa4b5ceaef76f9d34f9264711033aaec27ac1e5998e95ba38da9be1f83736f0b9057d0f6477ffff38ab0b9daee2b907688bf35681ab33372cd4431464f335ffd6039d1582957816b91348c0a66623b9422795d797eb7a087edce1b35e0debaa8ab2d53665c8e43880bf0fdeb1a0b38273e5bdfb6c16d52ebcf28db601d146b4bbee54857bec63d10fc2bcb486e7694eeacca8d91307cfbec3935d2d762316c5616d02c1f91553520266aa56949ce2487dd2617ac020d83e9b47f5d677cd0a455a24caaa1244126eee3d6c6ab6d94608dc5d0675658c3861348aac0f46deed4d0e19d1981ecea73f28e2854c62f5f7f5078869f3e18f7e77b2be0843935d50be495e9b5635978c77aade571ee4aac066895332300435e00e79418362cd2cb03f4164a8c1a348b80deec28c1553435e97aeea1a4cd3c0662108b32aeeec32ff109f58914e20c1b742c715e1b50b8b47aee944b64b11a691454887dd9a2316e7f7cdf38d195a2e91aaf97a46fbc29efb5dcbc63c89ffb5143ab8d4b243470a158b07850bf1084295148b422e024817830aa615c8874c208a8537a24385054725d462bfddedb83ccb227cf4b34287970257f545f3d34148e8e6c26fff538458b91ecbfd59229f178a2b395d68da5cf4a30ce4452698f0135306e7d7fcc0348ccaad10b25df686bdc8d131c46309012e115894744663756279538b17891640d460680f95cb89a5ad0434e13905bcf9da7a6fafe672301afef0c3b72d67aedb8ed8f147e68a164c60c4b65906765e564714f0b0d534ee1f1f91da6dfbe05f3109670b76be344f044cc2690898f25de1183e8340e5bd5c2a27a4b585e32b428d90a675a67cf610fe5761228b8e6c029961b36b64a840960ea1c3e9529cb1d6ade5cae23f6bbd671546d28304979c51f7aaac25528ddac359a11f8cd632758f401bfc44fcc19e76ba8832bb11ac80458cd8a6433b88821cbc80374b057dbcf4607d0072504c14434cf61de7feb2515dd597999f9270227dd9d7c9c242e9d5d8436a46d2195accd86d90c28ec236f44864c1363b734f6570ad865fd5edf34f4ffd3e6493b50b84509bff453382097ccf9ada958380befe2966463f86ce83dec5886e8fed484b62352fe2754bb457f411da78891766bcd7832f9eaeac14e4dd693b8c92b34ad0d821e81573b7bbff2205901092429cb9e2d8c841b730abe05b9d32a3f4081928fdab4395960d8a26e70b81d73030ef2a1399f708cc4663780716cc78ab8e56414b0f1139611735caaf157a9f7829f4595c4bcf35fcc61d67507d08f0aca0028e4f508b4b052737bdbf46a0f70a2d9e43d2b24b07dcc6f3052a2470da80d2c50d72204dca81f9246d4034838aeaa262608096de97dfdf00d491f0e8be274f02ca624a3fa3f5fb46af1ea3aa57e5f70ac1d478a4ab7e0f84460013ea1ba3d42517f185f1c7c854681c4218ca810ce011c30d5d205054c58812d1ac946d38671a00b3ff3ed8ad2be3f4f981f8c59712f14b8dcdef20d26d8082b7f139935e9cde131c350ef97b1f3c29f459ac456f6b543bb94b1407cb50d0ae19f0ee428f79935c73999730e15164627a23e8b7fbbc123ecc78bd505090e9a20c2f485f0cb8e074e16edebb753b9c41b74366539b9617f1a0753581eeb44402e93c5cb01ee8215da3f4eabcafc2c639ba18e55f192b29a24f8011a54716beb885ab10a79caa3bb75a690bedad7b9f832fdd5f112d579296fef347fb487e506d2d835fe05988130b3c7ab8058f735360287bee1775848e5400b473d8dee5e5e49e088065727d72673f788ad2d63905209c9c90d5d7970b96494a2733abe136454a48722ed19f392a6caefbe082c109a568ec110cf146020410e6ae3584444cb4d59754ae8b4d22d52c3bf7f2ec907dcda65e4ada081231df4562a7032f2c4d964d10b8a3287c615e89151649e08b97008e464a0867e15286277cb9492b71abf136ff0497ce8808a8c8cbf1e52f8a856dab61e56c1755937951ec7c70dea12eeb5ae848384457212c317d46c942f377f0463b30043b41f0a0f67bb12f4c0807f0c304ea2005dffad0057602fa7c633656d18bf681bda8ae2f7ae73b336c2d034719f0692398353aff7d16ca0671c61d7f5adbc448a1cca51f4de6d571c4751706094f1be1602be5664f6eaa6372071c8ccea8de6a2f06ab83c2273be27727082661878944d76228ea601c1531a01807d7c2f9298f0fa4eb8a4a2f0fa78b91ca7e0a9210dcce16249532a4630746383c072e303df59aa34a019e25af6f2dac4809a77d6f90a29ccfb9f94ca4e3d39473035e61594a49bc296d3ae5b1a804a7323a972a1552b56aa68f12684519f02be794d06c5e9849dd3f5150beac987d80d2572ba1103230c1030ce349618d8519ca772d9921d12a89f2c83103af0fc8b5d189dd90841df9c911ab72d28319cad9b544edabe35886309e107ccc09e96e3284e0c87948b598caa90b022fef9b03726c59b7f23e02bd34ebcc9a185d623f599527957a4846003dda1bbdaba360687323df9d5e9f0a10c911d45c4fb8bdf0e8557fdfb45323174f49bb33036a7046e8deb57e602cf8b890657da8ae5c1cf97c763bfcebb5e62307de5ec47f0a7c307c61702dff064907854ca69a55493da7273bb08222b17eaaee7fda7c0a18644d84505de606da2be649464765d77d111159e96a8c44d66b4d59bf162a1aaecaa8c464fea76cbb117b55a71c378cbdb38edd1e8ca58e00d3c8c97bdd8f12dbf147c13c01a4c9000e26788631d62d3b736036882f57a397a5ee2ebb0a9946b6aaaed0f56182d795941216a947afe632b3848765c00cb0cab8aa3f7797978d3bb54b088a4058bbfbb660377da40625952210c0e8083d1623402060ebdf8dc697ef93118f15190f36c911d9088a78ddb18ef7b6a353d16bfb28952f3df6a520abaf632a00a5115ac909586741495e172c1862cb9af65bd2472be1ad2c5a96093ad05be1d113c4ee6ab50e50d766d3a1021a790b9d20a1b40210d2c9875b8ba95b5b8e1ec3e2bc85d7c5e11ed456d4303b49408a6ed7d5844ddfc2185ed7bba8a265c63e47992ca6fb0e597721f44e1eecc1100b11e6f0b96ea0e4d7a8c35d79e865a32de001606555fe5c25aab513fe434779afb16190168038c20cc496e114c7987343d8adc9976bfb2e689e1e3da4af10f6b6c7f726a9b9abc9339e988169831dbdb1a52af73cf6cc7a83b2f18f6306bcafacb21fa1934c92eeb94f26e9b06b128ceee241f294056a7160f6273c071ad600cf1ad829f164590cd507011264bb0741676e4008d28fece5e0a8f59448e4b35a8b735c1ea2880333f07033d8815bf022e2285b0ca525ce3acac512b4dd1353e1cd97140886b1d48d03a6ca31c2d0b83bf98008c8ddbbd66a6bb192ec0689ed92c93b35f246f69e8e946e6af5e81ce52af6a9c2590a2790e46f6ccf38456a017aca453e93560f09b9981c2e422e2c834864f3545b026987fa5a01d729ba98fe84c0316946fcc4371653dd99f2e560ae0b4bc60162412b0bf3975987ba294b59e2877ece0b71b6c448dc2d99e1f856e1cb4b84699ec1311cea4d29a2e3824bb703480da5c08efee30408bfd6b9272481a39caed7c82402eb3988a6893a3f5f8576a84946a8e2f3600f31f7f2c9fc27aa4a70b6bba8f6609764bb2ae05e43411b34f4ae1e665084258e4c0904698c2d6b9da455f2b3a68c876c6ac722e7cfb22d658f26fe74a9b438d48f51f4529e02b8178f6457c832f4e8ecd3a7c762037552a5ee8b7fca1dee72be675431a99a289668201f6dcd4b37bbce033a3c59e5e115ca00f7702a86df9b5b27915122a7357b4a16bae0ccc855103271dc4dcce6112965d42de6ada72f51909a08351900146c317ee13b27d8bcadc42a860b1b0472ddb272afcdb71e89485044019a3ec47b3ca960463d651eac263959f01380f8f919e2437872c0759b8e5c09264e0dac8e027e662c2abf75c1b1940c21e84e87a754d703713872cf1699547109aec7dcfc3238ff05873f96c1554eaefd0bbe377a29e80de5b85d83700e540b3b9d3ce0b024e41104ba6537aa5820da19a703cdaa62056cecf1c67c309c701df078e6b31026ed56e5e75da84c77bcc89632450232d54fd155fb03b19508b05002a310906a7321517d409d21fef5df3695bbdf86bd0ea43c5562c30411d9ddb6dc52a694640a3f0a930a7a0a49baab77559830c7a7c6777777ff23dbc3af9478632d47f7ec6c867d0c2141fd7d521f305e89359e34a89f2251047586342258a1c41caa2e939821478d31ce58718253da345236ad60819af6464ec125205c6567da9a6823679ae60f3346ee1760de63188691e6d2442a1f46397f985e029991b46dc70b368d944dea038aa0a0f5b943c690109eb08365825dc7d102a232658b9cf1de8a5c2959ca28658c314a12c827121dc3c14475d62d7fb617836c624448d8633f4c4c462c462931a90452d65fdab4171489667452d77b3e856ac618e35c4f6e552aa191f387b9bdb0756d240ff5fbcee380f5e2a3e20ba5336872386b2576d1054432c618a39452f20aba075ac728a594524a19638c2d85849146d05926d823c5467bea07817888c5253e020285fd3c94f1100f4d3efab9d19e192c7105f6386b0510c208218430ce28230ce6466512ccd2a13a91214bb22c215a32549d159fb92f0956fd21843470f5603761a8773295793217c166009b4c5af4d87fb0496d9e73a7a8a87987818ea8e4ba39bc3337ea10c3a28c58ef6059e0cb5f722ea58cceeeebec316e841c9296d25f3e74a34590c51e93f882b9517e652a7882c5abbe22131cfabb7b978461779e654a39290a4b02859a1b151a827232544a29e5bb9498942e4991247f3d967a786c1913844390ec52c2b9514a29254c179bf5c984978c31c618a5941247062ed7faccd15bc818638c314a29a5143782a1b880a3ec22482388e2db8821cd1831677c4c76362f6463e3332c903354df81a33acee6f3bff9f25ff3d001eae8201e1c1d280cf62f5926dd3413a9bd1c1bd4cdac0659616b6bfa4b2468ed30b922b2ca8e48890414230a7a7102f44550955c34fc7e6805917b9c3366934d36516cdc666e34c610b988d18f986a8c928a18e3a909378521a5134fc5fffa6408598b17f8dc286b21e4594c76648c31c618a39452da3cf119a44c22e7d87d85aacb44af46e832665294bde8eeee32b6df444d34708da62db0eedb24accf199dd0969312ca871042093b1a21a53db06c73229b2fe3cbc766b7af611b0efed14b3db0c6a45319d316a94829638cac448c3e027667c87d53e3016a1c4069b7fdba1a3f2e25bfe66103d4d11f9da06c803ca00ed4d16f32c1bc984c5b47eae6954a7ac9f97af17968d55c9ad86f823a7352ba03777a073939f84a7ad13a6e6be277a4eebb40f587ebc507c2258645efe0cf0b9c4570f9a432533024647a073b14935366922435b94919a3141a236f949a4cff9e874205712224b4519b1d2fc28c9874f7f7624449ac0b82094921a1fe190fe551b0852b7f4eefedbf444a229f40a1a6a99238b842f59c2b01d86555ea0cb03451013568d30038f842264d28312c4a8ce314f772b06a7bf79f476c9acc49229988b4eccbcb71c4c663cf0676d99e4b3f622a94d6afb66e07a6e92b70bf34de90e9930336afc9d2073dd18b5adc622946295b40a564e7cd64faf73c14cac66688cfd090f7cc209baf7dc47ebd38434926ca038d5ee4a6324bffa2c52998905e5ed3344eaee2ca575a6f1ad72bcd378de39526378d83ab12b7c90702137fbec3ffe88e27d013101823f1e917bb13adf33f4a2af590118b353edd9afead293881788d2fe9de2ce504b411f85eb77e303e0ebb11f8f1bd3bfdf01adf6b746e7f7dcec738b6dca394524a19638ccd33371aa57494ff6cdfba787ea64419aa47f6cabc828357ef41e95af966d81dd5d97bd97254a7a4ffb68a55ffb83c8440df1bec4a75a70175f7652132a6fb4c4b4d2fa58deb53f6481829e388b0d715eb866c4d7f944d723dc0b9d12b252a425d5ca930702ab141d5dfcbf1cdb81f99a90c650fd8f57a977ac8ff7e6d548fc9b41923b2281bb03303180fadda3ac84af5286dc1da6ca4b4b1e12a090358e9c7d7ecb509975fb46eb78644ca7ac46e8b564bedef8c3126b8628c53ba122637794e789e6f3fa1ad9452c640e73b16b7927c79c1482e47e05b943039355226a794513a9531658c5101793029860e5ec293d2cedddd1fb58355a5f7df4e229fd88169fabf4d9decda1f720e2184117b77c5103b222cbab92f0ec9b51e3b4f2261ba74e9327d90b24a9cb3e3dc4a1fa594b2b4a132cc83d08a3d4a4391509913892e6397b14fe10546fb48caa67ccd378d944d140ff451933b0c7e8f1d9d7f2b976cc881b521e421a2d8cc629c9352938905514a8f95480aa29991668c2065267f9b1f9bf5e933444248299f638c12462965472b40992d605d8c31ff79f43f948cff6c62fcb7ae17d306a580ac173f3edc940ff67a8b2af693ba806e32b8189cc906c8a634b05e1361afb499b48e2483b4aa08114efda0814d01b15e0c5797263e0ce771585420fa8bb4cae6074eed7ad35597083930a8feb04a8e0e1a86e3686afc35000ed51f66dd733562a0fac327f273a35b946d8112030e688cfdc055a4ca773f62aaf29deb266c131554ca29698fd89d9c78ebd35d069a0d8aa46da5196440d9d94da67fcf43a16c6c823c212434434ccbca1333ec68d0abf092242d470fa594d216accf1c359e307a410e9fc2f424e39c93e161d773251e3960a2417c3860abfa0f3940395472a654ef207cc97d471cd6df1a7fe89877cba457c067009aeaa68f729bad1527439aa6df145fba52f7cd2d8618ea4765cdba1f4a23a0f0872cad7187dc7b805576356e7016e1ff91e3d7bec6183fcacb3c59857decbe24ae0435354dbf0c0c5ad008bd015dba74f1ea7567fa68638c1c638cec0426d9a3a0497fe8b0d46362f2bd63a23552168954f9f1715a8b5becbcd483df25d63986b1173b9451c739bfb93941e5c7ee9b1f8397eff0096d71288c8a1f464e760b7fc71328c40176499a9b35967c6c855d2c01d92e409274a90628857579e7d1dda33bc767c618638cf993891bb1ece1aaa8fb84a911a67e94865865e76d4d3f8ce7ad4f19042c71450a32ae1d48265a3254d9c71fa7997bae431f18507f9f506afc2fa6ca0e026d4d3ff30028723dc0fa41a0f5097da40ecf0ff461a21fccd803a13fbbbb7bc78fc31c343b0a9b7e26ff221d7c715075af82ba0fc117047a85754dca01dd57fd7888833a0542106272508fcf60ae63a5ffe8f69f09e6bf5fd5cb7fa41ae767a82428c744fb207860b158ac157d0d869bf1f2428d01a840898ba51a6718a9fe839638b934f1b7971a3fe37cc02a89c657fd7f60553ef683d6ecbd044456d921d92e95d4c5ad8932ebbe10d408975f66e75b13bf582310d57f13105d8947d4e48882d7dce28c524a29638c11670a97bbe646d751805109ab9450a894914b3da27b1258e543f9fcb2f301d6d83918fbc26646f2a098935293e91f6709972b4ae95e7d0521a270c8f88c1118b61ee61553e2476670007d0105e7c0cc10ca8b012966537a703e918f5ef56e08f67ceef28744312487d60acc103cd0c2d74a4f5d00e4386c22e4cffcfb1153f57fef09f5ee6f6f9aa691cf2528930aa69ff14c0330c2144698a65a8475cc3e3e6dd5f6f2f1513b30ac09c576ac176d24875a6f879217ee4b9ea3368e6a26129771cb039511930f8fd8d4f8b00424c6132c5430eb9622076cea129923d9a3f8c8aa7964734286bd76f7ef086f9539ce87a51f70044ba4f8630f5f3efcc861ddbe7663c713a8ffd6f8b3d423da90533d7ae7f3c86684298c30c556034e38c5ad1ddae75da2d8d08bbdf9e582cdcb00d42a197e6d3a195ec0829efa6d3e6775eaee44011e2fc30b51c0db744aa4f42be0bb13c2e36578193a253c3e679504b5f99bf72c45bdcf407b23f7a6eb3e5759157c35cdfec48212e1e324d4fdadb1053627a526d3bfe7a1b00d9680406c8bc79d84c8f0de7b9d12254bf68a26785652fe952ce11f7811b492c2bd005e86cf59cd1550f8de2f8edf6f56b73875fafdd661d5007ebf9b70eac6ef374fab08f0fbddc3291bbfdf4f5895e3f73b0aa74cbfdf3fadaaf9fd06e2548ddf6f2aac2ac0efb7154ed1f8fd0e6a958edf6f214ecdf8fdc6c22ad4afccaf017ebf8b3825e3f77b0bab0ef0fb6dd447ad42c0ef3bcb99b06ac7efbb4e02dc09ab52bfef4fdca755aadf6c67347d402406ea986e0600ddcc4c07b560b07f7a00852e48423dd0228469c70748e899010097030b88cb8145657b80edd4fde778e213f6f69fe366466362c8909941a386c9c60deebbefbaeff41cf75cf7e178fe9cbaa51edfc11e1edc76c3650ae06c38f8ea8fa1fb260cdd0bdd67dac7c191ae905ceced9f38d21047d2c2debe0d8ef4626fdfc491b8705a8bbd7d1a9cd684bdfd199cd623c36932380d88d3acb0b71fc36942eced534ecba215692a4e3b6a9afd14a76d619afd04701a51d3ecefe0342c4cb38f004e0b3a00a751619a7d03701a8ad39e30cdbe0e4ee3699afd02709a0ed3ecd7701aab69f673702423a6d92700472a6a9afd0170a42c4cb34fc391849a66dfe3485698663ff35998ee9b1fddbaefb5eef32aaaf29fb2f98c85531ff6535786bd53d6d1c035a3b2cf2e4edd1862222818d57d2ee22dac62b21169e9a98b62b1154e6d152864a9fb1cd4aa5eed6793b11f4e7d994fdddfcf7c3875823e300a36855318104685539c82ba8fb9302b9c6214d49db20f547f92a01f746547381d006e5718f7f1ab6eadba1f3920ae52f705c02951b2243be2b59272f25f82802a442b2927effc55dd88bde5a95f7624031700ee60506644bf7e99bfeac2eea34b85bdec0802b1b70fbdd89badfb31f0d00fbab69fba0058522327009ce3096d673e7ed57e1e9df992874b5402e52752e12f078027d49344f835c2a036bca5f6f3164ec9f77e6d967a402b4a38cdbac9200832cc1da5a139c51fa462a5967acc1fefce9c29d3027d1b7461a67bf6fa73b0e7ede09784c22a29f377df35274171dbbd79a1eeef600fc21d2c58425e0ef6a012edb727318944ca489dc7218128f6e092c642b4da5ee3966c53ecacb4b721087bf07db0870327f8c649e9d73829d873a9c7ecb6090a3f86236c0802b3391db0454ff5ca838f205bece860c362b9a1ab0366acf37bb6f468d85ee7b373fbb0a9a424519bdc5753e7673fb98fa6cecebe01d4993177c4a662d84f200da8185714a7b01d2cc51ffe7c2deab7afec6b08d1ec49af91b89f29ba52dbf38250448aa854f83bb08ab3879f638d2a3c41fd76d41802d51a0889c33ee3fa39853d01aad82a5330aa6c434424a808a7becdc203a7aa4c014b859f837dec00dbab70cb10e8967ef0e4fab774034fee6bc66d1529bc2a97cd39272966393e9b1a2712d8e5c70ac108203a706a76275a6588a644a938326e071e046da907a8cb8328b450616976a61a50d30ae8e755f8455ab52b081fe38a703bc0af82ae1076762842048876972e15b2480c5305160c62270a3b2b25374c3464b418982f75da155eaed546822e2082cf8af44b78044106aed5e97356383e6705c3e7acfe7356dde7ac6cd4982123062d2979f9527712927de94b9d92d2679fb37ae17356317cce8afb9c55ce6abfe376098e33695028fc18388ffb2f5ee07070a82ef4e3d7eb05d71084ad96d1d18b3d7eb1e746157b21817e04b437b0f2bb0df6463e7f16a2ca4fd8e3fe99e63ed4dc7a6ea6769f2938849c88b23daed791f6f34511f5eb27cd8a3db429ec71048a3fcf13a56391cb81e2eb753464145f928b5e6c0dbf47f7865cb61dac2b5c5b7e98f04e8b75459525ead74fbae30fa7bee8457dd5299c621d13d425aef038d9b6137792008e3f3d8e0e081c7ffa3867fc79acd4235e9103290e903838de86e823e827c6ae0738030714d61ebc7eb185838b91cbbc686f606cb57e34aefc71a855710a512ce510c491177bd35de3ab5571e85539c630047d810138e24fabbce8856e9b669be6f923117b1363b0354540559401a4e1ffbf71e3e78badeee2cfd630571b54e8e745ce434d4ae06abbcf5463cb8615f4e3d76b6f56d59449bffad5a4b2084e1d10a71702ae4ea7ee147f57a7e7f71e5a63c842e3891b628397ba5700fdd41d88e080dee06c70afa5062763050adff4847ef107a855fcc5d2f03387e1aa3c82ca1f9b88ca40ec12e257a603fa404c7810d47120f843839bc1411e2450f832fc32f8618802ece1600c0e965894870d0aabc2180eba60100f7de1e050d3f0938ce0a645e8064e7ca2f84cf9f9b9a1c42d6cd2a567e54da0f09d09744b3574750224799df0b2220bc756dc012ae271c25ed429a27eb149e579e23d3d0ed4aaf8b38329b6ecac3c0bede2a7f26b6fe4de7021d2c21e3fd1162f2aa2c21ebbab7320f6f86100837eb1058de20bbef6a62bbfd6d21b4211da424bebb057a942d4abf8d2db8be051855cd8732bb1ee1536d0c2a499e5452d9d56b39af0ce4ee52dd5f0428d3f4ba05ffca9b0f4a3eb27822abfc4ed4aeb0d08fc5ec8ced5bb6fc9ae366ea32085240cad346e57923302dfdf091d25a854e9c9520f50d7950517d47e6d0d7f3cc5893dbf38152b3f1b716a5d5c742a3f1f754f4761d5328188b9706aab58b1c3af2fbaa2d87eb814a17e3d31e9409cfa62cbc5a9af5f419cfa9c4788535ffca95438c52d22eae7565af5f32b7588fae1a89951fca92cb457e800063552910cd4048d2d4e9dd8c55666165cb17b5d81414cd08f836ef07eed4dec4e34c81a3f762cb435fc469c622c5916faf5e3d756f78a185851bf6671166e827e3cc429ef4e4060779b0d481c13715116e8a6020ae58d1c8c5346da6e24712721a49c95c69d84684a66d3f86b9fb3da2d66d98bdd89867571a1739240af4e12e0df7eeb44407afe5dc1f7d7be243c597e7c589add0f9b1a5535beaac6c7691cc66123d9c7245cb3eef4237ee7035723f2d7c5854e95aa2ab97515fd548ddb1589db55e4785055f83be39299075a16148abf8683e3005665f2d7abf3f73f9b39290d92714998a6794801dd69c2284545285e90b781df6462ef701887530b21dc66d80961af83b0d75c15d42bbf0338f590fd0b66be2144bd3237f110324326eaee76ef6e6feff676ffa1113a8311c3d6ece7d4ad5b82e1051ca71b364c3568cc9091112386c2bc94368d944d4c466f2ef5e330dd6e7709cc61662d1af42c28bfc6dceefe12bb6ef729e95e62a0eda6f87d57d5fcb0dbdd87bb8421057cd7fbb77b994de0b367edc7aa91e6947feeee1b77abdd95800855a0dfd736cd78393835e4dffe93bdc781df886fecf57774c83db3ee7cf8717a924ed215be0b216ef799e0cf55650f29cc370db71d5f76303eec9c3d538c5d0f5e8f982a7c29c828a57c9798c4a4d7d825e10adfa9e0eef0c6468feefe53da9003ab57ffe07fcc70c297330ba1186394d284ea41a1e6464d419a97c327cfdea29412c3b028636904d24b3df8796e14a3a2273e0c2207b1d6374a29a59432c618db05ebf38aefdec88f9a8a42a171dc7a4bda6c6757d9fdd6c4e84fe4dd87d8b418639c73d2dea22d6fee5bd45bd1dca84de5b701428c5146982e3c89b076be3531e70a4e93f4113e3d57e201f17be80453ba54434ef59fd8b70f5cb1d7e6d6a51fde0cfb65ce0e4957ac93bda51b62e745c02eda421e0da1e47c602863e46f1fb8eb41c687ab23fe46eeea48baca6e3958614bc84c76aa9c1897b1883c077bf23df6e4a3d893b5853a28e3fa0af659d7575a8853d8cbff30ef6d4e5658eaf14215146ba12afda769a4730b63b0873fadea16c6e5c022b928afe47bd1ded474517d8b2a3f3641950febe90822dfb4e662d5b00de36690251ab0da8f7158d5b00dfbaef2fb8a8c51e5f79133d991df58a4785265073db3a4b0523fcf1b6b71ea93d9e1d487c3d4c33a9ce256932ad949953cf5c381956ee00f6c6a7bf91ed814cccb1712c406f940ac0afe348d7cf9436a7c3c173c13a623a809aafc60104172bda85236e99d22ec658dfa75508d26823c7a0ad4217f4aee2754f9f0a755dc6a9ad27f35de53f9301bc72d2c3d05f2682c56877ce923a8e93ecfa8fe162d1f05c2d6c82aaaecda4efab1871c0631d8b0bbe6614f76cb3aecc91df65ea874d0d6cc981c82f069177bf25fba06624f9686a0f2fb49fbc497dfadeca589ca2b4c2325ed1a4ba95bf6b6eeeb2c59117bab7133b0275fcb36c8e1d0c05867f30215f49ba9f2bf47710a56f95e0e4ec927717d853d99752dc49efcd975107bf284f51556f50f8bc5626225bf8338b5a9ead3c57a5bbf1a5a6896a5d95a7db02ccdf6c04ed54bd9631c576d7138e36417f49bdf030a7d28ad5fd1ee84fdae5887694ed8c38a75dc624f7e2605fd2ab520bf0eaaf26515f49b55be7c29492cc384b633d88a9df268ad2eedbaf3273d73c23d8a5b76ca9a7f383585819808bef0c354b054c873a542d65261f6ed9287531fb37a38f5b98ff4e1d4d747d2c9d17ef2898c52e1cf1406ba822ea74eeb59b765ddc47100a74a0fd9461e65599665fd5fd72c6866d9c3ecb3eca83a15fea1428ae591b1a00e9f2fc78c8f8d3ce29e8c057970142d9bd977f771fdf88759d079380ae4e14fa08eae87ab951fcc873d1e7e88e91cc9a3c95d0f70739e5651da499ea6c93a2ddb6612f4c37c6a14f6a0ff34cd13c8c3a5581df0a14f2ab606fec7f5f327153e73e73eb16e95574ffde4d12ce2d409e661253dfc8cfbdc0763b52a16613e58cf9be6cb2dc097612c0fd904eae0c2a923188eca14b54af2b46c0279482b5007fc37519e58d4a4d2d9c9a31eb3339966117b5b785a25839a069aa8d4acfbb028f06510d67d33ebac3319f452e567cfcccc2c5bf667533b6bc9035f5a813ca411d4c163a5c2ee301ff68eb6868b34823c6418ab630b5b035f4aa30a7f4615d4ffcb58af0a3356c6246bcd17a78c38d5c3fc24b36a0f7f1e712afb197984b57290fe93473d24a195df3bcf9342f2cad6609143328b0cc2ea80cf9c1cc2d640199471415f062d2adb81611b58689a0679eb66e6c85c12f443d5c9d0e173fd6085023b254b564b20f30d7c23d710429844728c2ee690c400a94020f67aa83affb7aa16ba8999b3ebc8f5bc5a2d14b95b684b0f35d1164e9dd61b4b6751a27ead056ed0d52ad872d5102bb4b235fe730594e10b06cd49a9c9e4cd23e88732d5ee866c8d7f0bb52a87a5f1f77642757f8d3179c56f5467c2aa77412c9cda2a5e04d50f6af988a840e425561550503fc8059311eef070cabf5d9c3aed7812f5834eaa0f55c7e16f62820e6995d734fede3494aae7a2f07fa65f9b09b49dd1b64077c3381a8333f22396ce561172e2a8a8bd198891a8f061aaf93b46977ac4d0b46d7ef940302b2c6931629adbd8830e85edb319323eb26464c9c822bda67dd6efdda576271f5bfd6bd8eadd8e2ffce7e7541c7e79e75e301b0f6774321d5c1a9c263dd6652f349094d841939d1da8e0ca125cb0cdd9bd5b317607444f44396a96cb0a52b297eb78f38f886d1a473f868342e349dd897f57349e76277e58e56fede7a0a02f5d13753dd459d8831f040dae7598a69535a15b321b77f2df1a3f5691385ec8c274c594202afbe7f0bc2a8a2a77a82aa8869580f0b0002654bad30f9727e8a9fe393db43139b05eec6dd53458f267ce077892c00b2780a2490f6b45e3a1d4f8053071558e46b784c6d378cd937005b20026aedabf0026aeda1d9425343a29fd52fc736870529a8b559bdb0cecd9b007677085aaf5e00ea70afd96b469dc565802224fd082dacf251c505cb06a7748d0fdaf5b9bc5e4c072c11765cfa120027af9b0a1499090201042f86a5513f58b6a41e1179b65b0772835a1f8053db65a2d085403048240104b8b080241a01a5d340d7914424643746832b443dfd0465be58ba37ac4a953bf026a8cc161f8f810b9b6e8d76b6f4e2ff4809a2a4c85df437bc3117161556fb12a08e44d2a7426b5bfa85f85232a08b151e6ddea8ceec0f8f30e4c0627c43a974fec7cfae19bbe7e5261d7722d68276169e067f5eb2157510f6d0d7c1c9e4103fa75ab5bada2f1f0db8855d5781853bf6ef5f7cede34511b310d7c58a36b2d760c7ddd1afaba15d3aeee83810f879e40bf6e56d011a8c0840aeb0c20aac1284ee2c62eb81971a9d1680b976ef08d4b409c61bf7c4aaad635769f076af3cbd51f0cfc276cc43615a029157e4701721e226a17bfac20d42e3ea27edde48b55f1503fec9d21232afc9e25885c0bfaf5d0107c085953a0c154bbe3d7d6c077223aeb56b9024f6d22f6e07f5ce3b724015fd590a93dd4aa1a73526a32fd7b5eb76874ddea1935a05a7f01f4858f0637025441ab58a155bd76516bab8071d45b6a0c81c2d20ddc8d6d5d02d23380e82cf558538cbf476e87726009a5f6b3528fd6e1428d5c8c0a4b3ff6bfb81bf483a31ab95861e986fdd8ed7a5e7b873dd82df6206b68ab7c81a5c25ac261bf3b243570edffe1b597d4f68d39fa16fd50d1e18fde2ff8e2d409b6a08e0a9af00e4c41d8f3b335f0fbd43dc4a958e1779626f2963761157ce26a2d9cda2a5db02afc36fa9ce53a15cae8dddae1d4077f2a7c58e448ebc06e52e1cf2c40e8f0676fbabfbb1fb6063e57f8700aa79430810f59ec4116e4610ffe0b3ef48bac0a3fb25a059df4ace0c756dc8952a114ab2f36893d3398013f803e82ec8dac39a0cd5718c0a0ce0c83f6861f3ebcc2a97df804d81af87c621f9cea0adf06f8413875a3c2ff01326115f41112c2a9adc245940ab554b85c2ae48fde28f8397038f511000671ea94e2d60c15ae950ab9637803e7e0d4c9042b8ebd81b50a196d3f75dfb4022a43ab0200b323e8fcd951c685c422f990a6b0caa687c464a82ea949dd8fd4438a5217be738a531ff422b238f57193d3dcdcc888fa3997ba91c984dd476ad5a5375841492d4ef1d4ec8853cc5c482c66c9bc8cd88347ecedcbb05d3c3172ad92a0ff302441bdb731711fac375ef317cddffcab5537bf34de0de7b9ab69b8de781cb6e118688f6cd8f8ccc6bb8d8fcf47a7c7f1f088536e63834279debfc9c4dd112cd530bfbbcf6117b926f4c3a2d47dd3e9e38fbfbef9d1cff4fde7d9645bd85ba34affc37e6a76d4d5a031a3fb4c2fd37defc9e83e0f15a3cb7c62bacf86494033a0de65af0c003a14fe9715d57d2c0aa7e00d6e2b89fb3ca8eed313f7ad95e73e3efad68a0d1a6607b940f11e87e1ab55cc3c5e0c4ad02f3b621ee8a2d014bbece8e326fbabf116006e573e30c110786ab4a005364db30f03125ef72686ffe6c2f01fdd176c1efbf5d77a93813b09f1f6a80a32385a799fb3dad21d11b023051d1e2c75ffe38fb7442f728483ea26e9ee7878310fc31d51b8c2cc5354c4a9d3101d38d126caf8691f3633146193cdc6c0c23b2f226e93a90f6fcae8db05fd3628898fe5d2926a320618b36930193d749bbbbb79316e3eca6b150f41a8cfce07c6f14a060a283f377bd9cb975363f8e285080aff232a0ac2362818803ad355e66e69fc913932fb47766f006b414a2e5b08b9bb7f6fe1eededdc61d68ee1ee72faf296851281b5e158a72499886872a502f6d51108c319cc561140ac53242deeef80298232d998f6188a828089c1886cd396d5c41a8aeeca93999c79cdd3d7fd99bf3677f4fd39c1deca67ceadd67a23d9f605be4a62ab05ed32c033090753f96a6bf3faebe593706d45ffeb7434578f801b2b6ca16a6d4fe21adca59f5ac3a4ca8d72fc9f3421e2fac4a92ac853c26abee7329763fe277334da8425b06d21a5fcec7e128a1b47e356798a6df25778a0feb16e1d82113185a0f4966c57ee1ea805ca3f7472cc6f81873d862bb3bb1b918ff7cf66214babfdf8500eababa7083ba6dc951d7d545a7d22c51c618e30fa2b020fe0c630140a2928ac05cdc0750d7d58527d497baae30ac34c32e30c182164840794161042618c8034b851e72aad0b245123b34d882cb166ae081ed2183c15a931ee7cb462aedd30d81173e3a7861d1d30323aaf0000d586083214461052bf0a4000c29fead28d2c41456149e8085a585a7987eae94d27fd0050c301da7262a432915b02c91456271052be850da052ba84c951c0c5552dd2a2e29ea47a1cc00084940c2105d24618515fcacf81f85c222830758698214a0d0a0084f5c8941fd4c0c797a6044142bb4c0e4f50fc42a28383822092944a1042ef8c7f46f031858e0678b1457086309415491c50b725084235eb005125842f8008b140844c10509b478a9c0083ac8224a9421a8c064052c7801152014094e4c38a009275842093818421255a860c21646208494524a29603efe1447909ad0993e9b18429e40081a26a8e28a294498011458780a200d8b2634a1e352d4efb5d0821cb55d5a5842d69a257091832368e1043d2862d5388c9deabac2e84295755d611ccd1bf8a854b0042030907022075380d2802d88a2f841124f68190285ca228a1ca86c3982082bb610644416cf62b148f099989ffedb000a24559ad0320250115c6042164f88f84901128ae0420411522c9607fc60092ac842062e2eac7041e5a75f8427b60a472062a2488a249a5471e2e708294d3401b40510b0f4e4e04089297494782541c78a19c4ced4b680051e37f104284d749c3cf1411195d5ee20082c28a83882111257acf8b7c4a88ae5ab2b8c292ada335b80bb40a89f8c8e23258e6a503d0c1254f8cd50fd7795850549e86942ca162656fe9453eca4faa338e5bf83532fd5dfc60141f6065688048450b52be99cca51631735da38827ef4a12b0b46a834aa3f34716ab759c56f9dad12418c1bc4bf83b14e8a11f8fdb25392b392bfa520b23bed6a36cd0ef933d511e4c386203f4026426c56cb16ed6bb978a71835838d0e14ff0eeeee6462e61d6c89ddc19c3333c78da61a5136ecb54692dc45d86bced1348d0477b0581a89599cfab6cb163169e7540ff293cc9ab5e64ac6afb79261b392f15f8d19646c1a89967e3f07ccc7bc36a4fecec29d1dffbc36fd98d2cb520fda49622d7d978080a04b972e433576473ccac1ca9da53217a4f4d2750f51c372f6c6bd1669950d4cd3df3ed8b381038fc4b3714170d89afe1b56c79459263bc8ca02876a7f7f6bdf0f593e3f7b8d29cbc77ce85a9adfac5a0972562188f19a73d833a77d89db3824b08b977a68a46f9246fa56890008192f045cc950c9e84e41627c8c4e095c8940c6c7f89c553faa39c80daba37f72386c8db63725ac8b9c0d5bd36d037b1d3b0f870e6850ef7c49b8fa3369776ee0514046272546b7a52031bad3aefabbd44352c8da9ae6536cd2ae2bfdd0497774f611c48686acbdd9da5880426d1c4c38d8eb2cec7cb0c7ff896098860b34fa3bb393a47d64f833c31e435485306633750c8704da4882d6a8ebc2821335d62d4152851c3fbc02856010e5e01574296dda7b85091a407168b66da651ce14d331313486b6c9b4850d7605dcc10a0ae2d407afa87c8581f415f0676e948353ba586db8a810540254c9ec4d12f686fefef73764fc500c380489d81a7e22b008085ba43eaaddb75da01c0cda1a6ef8a7de2c5b8b534df8a196161f5566ee85bc44508761e987d7207ecac54a847f074e1580e115508769b8053b4839ae366e403f1311e80787b4186159960cfbd47cc6985583f636ad8af1a55f2bf205e6b71352408506a87088a6428f63e8da80705543fbfcdbb4fba829497ce1bef764fc6743e6bf18d58cffb25a7ab82a1a5f2a3d8d199c0c27835b4e3ee44affc221698097b8e592b07fc376137bd0bd189d088088f142c0558c183f572d444a975363e4ac62fc6c1ab601fdca8d031aa3c7c6178ed5102b7bf7ecb9e7413813c01ac3e210167b081288e8e0f13b76dddd9d65bf599665998c09676bfcb353961539e2cf03a7369e04fc246152dd1d8baec7c14cd46fdb1b2ed62bdca0faebc0a902547fcd27b0375185f21d5be35e6de480fa0f69d59c1b58ff22fb45f50dc3d4aa97edfd5d1301102faf9562d7dc02125053240075863f1b185c5591a629e2382de793beaf3375b351b798ba65757bb8aa18bf6d1f83dba5217d0c4782e14893f4cd6d5fe2e6f7c675fc2dcde79ecf73766d92b942bfc8114fd235fea08453f3b90577f885dba669f662077f484c89b4dfd83372423a65339048ef836866a872a551f9718208e941e5d78155db05178bc51ac1ba8c822a3f2acb814525f56d91f30a2a2f1121b74d235292341287636b60eb57da2fabb49fbf714a3edc39c334d98e2f28c923751e7b9c7133f3833a7eb9124e4132d2d3b9fbd8cc3aec5b7345923135daccd5fc96cd2afba1f6cb55863d4e3787c4541b07ac7a00a63a56bb33e2b4e58300f34e02dda50bf74bec1b5bb9ecdc5aa0824c38bc1c54a0eb7a15d5cff41aaadf34e1f0729c82ccdf2a84592bed69abb2e79f1a6ccdd57c12c744089bd5fcd65c69118ad691709a94713cd4f8b9bbbb8c08a85b02b253a8db4139f92b59d70a04f34190a5dc9bfffdbb20d97b17815d651d4b8e34d0b65535bad082b5da1b1ac4a11f6a6dd29a33e2b4d4cfdce9477c7eee3ed819e13f75e7fd3935a7f6e9c7e7d4e6706023fdd388bf372cf1b78c43ee02ef6abbcb3c789779975b08389f5f6bcd5586ed66dd94dcf743ed561a49c2d565d4947b330fde8575ee4299b3dba6e95d02ed82aecb8ba2fa4d2f788884306b158d78d1f28275f28f8fbde44eded1b08a5dcb8651edf9afe263bf2dd32a621f39b92dba8a0f4b3460753b1ffacbea72adb98abf252002a8db4101417c1cf6eed285b74b975594400356b1dba659f6b6b9abdc605b9bbc49595e02b72ea6c60ed4fe41a31663cf6de376353921ae7570131081f0ea2708947efb21a56efb21fb3bb650247b94fd16d59c55ce8a3d761fd43826da538ec9f6dc0e3028923daa497ad70092869cdabb8ace958020a062afc94deb6f58fda7c64969d9dddd5e7ac93a1fb8627362327af747d78eb6ad9282fd6e15e209705f2190c562b1e0d27856fd03952727c5dddd7d484b0a129b6a2449d7f95ecd59fde84702bb544e7ec631c95e0829486c6a9236407ce64a35e464dcaebc6309888c2a716858fbb18c93e20363dd3de3cbec7c607f8c1d092bda72ca35081debe07a1108efef770e562d629c0f2cb1f7d681d6bdb1c7ee8ddda8f2b1caed33f6e9c7c23af906d8a57a27a10efeb81a81ff4988c9ae86af2cf706f26824904beddaa51fdeddd6f0c76f23b1ab61ab07b1da7a80eed009ac5446d25db854f88ca4bb7479e903c3ae078c75c0eef3973fbccf5f7e977050e2f18708620948a56fa8442c98ca9a5432442410000000026315000020140a068482f1804cd223dd0714000c7eac486a4a170985610e04318a216388210400001000011019a26d003f377ab5bb613e6773c7b7ad172515035068d34b4714ff6b36f4da4ef25b18a866ebec8c5ed5ae3710351334a1fa1a35d8d8b174c1cb07a3cddcf370caa0a4f18ca71e5e99be454e27a5bbd3b4d9de8b10fe01d9231f0e709c8260969bde5826edd42652b55b6554c5c67c4d7150b093502931c43656081818b8e4e561203835855b6ba3580ab49429c045171e75af299afe39e2b17855625631fe2efcfd492ec320efbd472ac454ac0d48a413ca6d17ac683863bc003292ece4136a8965134b23c12d9811a31c2595432145f489df68ed5a99f95d0190fd1c40642dfdc45792c4d0df4a89242691056950718080448f40d6cd63c0ea76833a10ac5466b185d102a1a4e7355839cb5ebea1d23bd392a94185e4cefe1e6720f9f29400cd831ec228dea517aaa5eaa7fd2751af49dde8252993126f0f9581b70a8d136fe121d0b971d95314e17ec59010fac9bb7099e2554d4da0ea396844a78753a088b156a13c35b0eccd07f5e52c5748f32479dc65943ed57b9e024b7540fa8ab3b360f07ad38f0b4be0d40889f2839aa56db96b347e05a1a45117722763bb0b7ee74d12c4ae40f590b045b8f6bde26caaf3b7f07379cd3891ed63cd382985e53184e3302c1af07ae6302ccb3d0162060a79104d50032e374709d3b2352aa940126a124d79d880190b85fad77cbe4de686e74b00e1da5deb53274074d1fa9f4eff58fe56dfe05ed1b5a4a9dc50998fa3b8bc46dca3da9ac6d4d5e4878a5ce0b424aedccf5ed6175071495bab00615c6cdcc45b2bc936a77e46aec17f6a6741608de59c18565aaddf8f9a98592c3e6b9420226b4510ed8b4a4a44a2c55822d87c10f7293f21a2a941620984b42b51d2a423d1325f18d98a3fb7ecfd3cf49b48e4b259d678e7efbc6f2b21d87ba3151f0b7b8d3b16a8fb5bd8a3de6f575b6f462d367ddb2d0d6d04dfa37731b791b020fce10a45e8bb872140ff05f1fe61eda5fdf7a7cab18fe24cfcadb5fd4971c8d79274cd9c019e3c3c79af8af682a2ea5bc6855f9267ffff6699908005ebd5250ce40f72aa81d73cf979c417a32fa676b7e582309174706aa7ba44be174219de7c7521a5fa8e07609ddd62350b69e245fcb8f7506f9c9f803b330f2be207b12576284b970715b935c7925b216a1fc0e73f6124472a400b158805e52178a5c404a1d65c916f563415684f90bf0fa7309fe49d7c9eba8e64cb5b9784778059d16543dd218e5fd94730d675b81bfe103fef107f1bf9ae58375e39248ecf4625eca9d31ecbc31dff20b894cbdf73e49911aebcb04e34fa05dd270cf385476397d9e7c91acb81c6fc04bfac104d93f05f0f053c667b47348c0523852215fd47c6913073ddc5efb8378a65e143b861c687e438d9cccb30a89f7072af4b2aa5199301ff23dba48c45f6ba662b9a912fbd49533e14de2da404e36389f052a431bf84983ee5c586e2c73345554642e1ca39a4d0220162bd7e23a0b0e6cf0b1f051b8b9c8c9c11da9a91742d3b660994fc5a78fc09fdf2354dc9570ca1f3a798d40b861bc03d4916845d32063d460b76ec4e5674535bb53b1631522eb46873e13419d20412c24cd02ea3b0be9780bb0dd7ad4a4146a9cf9bea45012b4c3d643de2613dab88ed250903698938a8acc6c28cd685da380aef9d36c0f5a0c1815936a268d3e41957e15804be307f9ab066f5d8ef7701c57a22b946c337bfc63cabd55d7e2f1fab31951d9d8aefaa2cc918f74e3519dfba80947184987f5f22e05321df6a8ba96ba6edbaed4521888cb65a410f893c97482b2ed783d89a103583856d1e6108849072e3036ef39f6e76fe4d3a4b6111fa7badec21f45caf9efc9fb8331219df48783a862be17c2466eba2d3679f8e1fa728e84812dcdeb1c4e0d023e7f32e1f0768fbabe1fc896184363d9f314006a945ff67042a23813cc6b53ffaaafeb0f26480e5458c774b0a493fc8f8ead0774708975ca0d9a4069fb21354fc8037cb3c8849c2fa42c7157b89286b2da1f412556e66475199af4e450d6169a8cd68e07a65ffdd4c2857be10f02df592be35e5275857609e02980a7cf32b77ef9dfee5e6ebc6e5c675d3edc675d3f5e6f5e675c3fdc6cd6eb8ff19b99fbff927c4c5f109072ff7473bdd16df1df5eb8de6a5ac0df4edb08ca5579d79dda5ffe12a1d1018cf8bbe172168e0a7bbed5e2abc6d54fe26a8529266ba3c2477e67a6045d4e2ab5ef98173209562a4e71023df1a619548448218499e589ed90975f1c6d5aa394337c2e32f214e547d71aeeef764a028aae6798cce850b3f839ccee4ec37a4be16eb11e22033e67587b863675e130318f1d1602a414f824075f8357b151b85f110723038cb02bd8b462c65d0621e7993f4635267c8ebc5068d3df1cbb41e9b848967f232ed17db6dec092ff3151bc2658e3dfad7841f8a1e56c5e60c4d19dc88b4054a00ece8b87ac0793ebc1000eec281cf8b27615aa01f25e3afd0b8f7ce03c7ef8dd00898ad28e62dcdb11b408e27de71f3321341d9a8deb9f2f2db0471ca006148ec19054ee8302e35d9378e072dfcfd44e840dc61fa2550b52af66a96937c8a8cc5fe737f43c1a2f6591404c2729e645b9487e70efa7ebd05be6287de044badf7666c4ed4feb51193f42bb9613f79e293a96b204aa383eb9f941bed3347eef13eb25af4434358111b3096092ed31eeb06334504a4edf4dbe4ba59e782fc56495355beb7c5d6d9440b7a6e9489855ecce444c882fbbde221ce00c275921c6f93d8ef43ae1d47815c49201edf2aa880b29edd166c1748b11354ac7b365c6a14749454893af162fa8b78e3ab25bbca0ad69dcf3c3ab34d3a48ae6b4bf76e97a6a982c4b8449ac10c405c6cf077dd54940365253560b7ee4c4b4475403c65d28c2c759c53d7097235521fe5f5a8e9429965a43a6f548f83ca70427f05c3a35bed4bf1b4a95da7265b2513beee10942f2ca95c8daa5c073e6030fcbb60f5cff4cb003d2df06405e2d2655def0b0a1a7243423c409eeeb5d22a0f4cd2714d87459b6095b510db21feb7b7b4715c9b615d43bfa65f89bf941b27c80b1f41b48611daa2b11bda36c5bf3224ed2a4ceb1a377d3129b3af4a492815c298e734fd96cd5c056a1ccdb93527c65e4d47f11ac058d550140ca90eb39517638fddaace56822f30768faae5237e1f55c3d08f3a6321bcb90f8a599caf72c97404484e985f8f28e3c813507c10d42ba427ab83cdb76e86856260ed86b23e5a13cfe74041450f6013d516cb0aea6afa82aae6d1ecd1cfaad36d8a85acf24419c50e63da3ec8ee934cc4dd000e177a4df31d369901ab7670dfbd494b27a16dc6c8e8d77f585cfbf0c45bc9c8dc86a4584bbc24c1385289310d0e0cad3efd8a1a862d8b06074838b6a9b52dab0827a2cb60646f16cb4323da13615342c9cbfc866646e513f53a5b4101d92eb63cc811e198a2b76b99d21454e32f02d8a06c56446e4f90783f0d72ad3ca1f7eeb8e6ccfc8361495f79a53e1077d316e7dd8758c5d582199002e666a8a5e5c64aec2e37384615abe9c52a8eb4e915455144c7949fa9b7a7e69d81b275aef28d32a69e4cd4bc11e196cbeec649eb0838cad87536708627419d5799538c0924276af4e10eb867dd6448fcece16ec464d78856b2b40a8b2cb5745685d2544bad13666b4230d19cb5ab9ce9bfabd2a3e7f6df82b02e744bd312434e1c26c68a79f5a8d9c56eeac28360985291f9b020d4a4f30fe1c1da0668eee333f91d4208996271b57e39e7ac239b24d92f61561ee335007e08b3ffb5be396983ea0ed3dfc4f24cf8d3cf8a8f4a662870e057ce0924d031c1ba98bdbbca5dbdb0478352e6478089d96adfb243cd5adb2af412ffa8e85a7cc60d3bf0ed0fed6ebb638efa405bb183551b35f27da1abf6d5864845270eb8c284e1510f8cd8a8212aa13780eca6db6a02a406ccb9c8b7322c2779828efa72238792930b88594e3f7b14bde0bb007708869dc115327065423b7671e35380a8476a70b0c4ac28dc9ae62469a98a29aa88658c1f1fb472ea88de83eee85c72b295165d8922a560e249541274f441cea02cb6b885664052e1022fe209759114609260e06bbe326c2e73e725dc281136b5cf0417abfb3451ae9d83dd52657041ad6e7f70efc4b97ca602623581181f991d06e3e3fa25803a78d12acef6caaf1607127900b7225dc81e81cbf566ab1d005735278e026e041f3d10613981aef008fc75bc277bf243cb94f7af030530431d817a0bf7132e252fb3b6c64c6b5ad53b29290a38096823f22a23961fa0289add9851277f335edb08e90ce950575c2178dff053d927456ddb8c2ef58e68148685b7c4a07a1e429f28a71df96ab8b68d294411dd33ff1137600ab2399b1a2b9a9901fbccaa97fe886263dd8b4ddc7115220416d52dae0c3c04f9388ecca5e76ad5c84d09f60cade4ef45443733f0bcc55e1cf9609b4ac71636e7afcd59e03c36a9e2fe72e2de3108d2f1b75e8556ccf2218a9739721968add49eade57e3ebc15328cd1332c0f0c0e3de997b853c3a6b134da6865fdc8867a7186017dd812a1cb9026f321e49c27f409b26906afb980c5d95ad2042394bb1db3a7a094b4ff2eab417998f6eb7ebbe7bae9369b7521b6c87cd9a666c302ba0e4deea8a6904a0fb8a9b8f920420871230a3a4eb5e4a9282855b3b15f7543117832439fc1e7aaa3166c2bc45db3877a3b80569c606268bf6327093146a0e035134298f03c8edd736412c2ddfea52cb484618163e0b47848662586d1f4e19a6d17da0a561a68af1cf04c62c8760cce06f41f09ea0496fc186c4512cb54d265344864f81c47d58c043438485835d31b1526da80b46a3bda075df8616580db1c5eb11d701de4f37e86a8f11eb472ce4ccedb8884f038e617ccc486b6b4b34d7f39670a0ec2a013ec0b99aee1c2d473e2b1922d5b8deeb2cb9b359ab4ffd1293e64702c53a927288d6ccf579387a48622df94ad0e4540b3c0a4b5007de1ddb3d64caa4bc2bd52c75c9f901a973a0a41850961e52616f6aa27e4cf08c205b20704fa84588c891be84226479e1ac6411715d6dac3c00855e37e8633963f0fc291608a95132c856caa8b9b5a6ec7d62a15ac6fb4fea54299475597523ae48917c093ca6ed24d70138c4e89a67e8df9bcc7b7998fcf8f6c32a4f1d5baeeb2ac984c382b70d3d1c0a154c5dc28d60c2adbc70a01881e7d67c980f2e336c783399058070b2209bd4afd09e929226780fd5baa2ef7ff464031b05824a8ac42e889e85d9e6212732f4c3f30d3d8701ab37ad231a655a1ae023728a303557d5e6e98b68bd7da95b7b15e9ffb6b4de2daade39c9abcbc619885ece1414cb595c3bb9132b41e142c87403adfa706f0daef98af834507c9c0628962ab657a01d6e07e5aa1365d2e248eb7cf47b0a5cb42cc2b3c32f91000102ed721b51bf1602e7cd3d5a4f6606c96b6f3aa1745aa0b1a8ec0285e46f0a01d91c846d82b83100475fa9ed12250e13641b51128e5a69e7e123fea07aeeadb0d1627483797071053b81628c8bb42d0f5bc20cba0c0df9e844854704a116c3714381c7478f64e1daf2838d8fe7fcbb629cbeb2c21c3e060d1d39baf60068327c9284575ec96a8401c4791cc48ca3df2c1a1b421645ace5c1f66139222dce0adad47cea0174ecc3a374aa3d1f2b5e3e8b48748d85e3a940d7352a805bd7c9591e549b6a6330f31d851531a3f2780ea1729b0bb145e920610369e00446da2a428912e1b8509118fb39029bde68cf02093b047533bdf8d114c2ccb956ea7a1b90b6d63684be84d37273b9f06e65553e8ef6db3d2bcdb4e2bfc126edbb54aba3015dbc3e4227b96648af98671ed6d286f375d6dce40cccd60d6b2c34f910ba84dd22aae682a23a4676b7e34f3f9e0f347301ff35be4b1808765246aee8d0193030570510c2d16471e8620985b52f82282c0422a2d603a3d387599e1c247324cd74b6ddc7ca1b1ecb890a1c857454728a2b0474d72a7bb5163fa5bce701076dda943d32e8bea413af0e13253de6aa3fe9ec13016f30b828bf3be7fbcffdf3b36ef11b2a2bf4c8f95fa36aec40f96d5ee2085578b8008530dc2dfe6fa573f21702dcb2686a64fef40160e8738c1810b2ad7c298d37eb0a3953985f0af10e08d9ae67041d50d800c38028a0e38c7b9aad57b24752a67db9f771b5a959570e2efc39c8f900a6290d66f26cab4d3bb540d069ddb31bbb7e96d10cadf7dfd9337b95f65e006f0dbc8f732293c510cb8530fcd93e15e81564ea390a80ac2876b75f24e3ffbc217dd7d05d35bdaa11bc619e7734082034c7c485d2d4041b9610eb221aed05182242cde059461c3c0b818d4a0c03c83bbf864ddfd745f9a937ed2936394287350b4ccac57c6601b65ecfdf0a81c70e6e285dbfa38b2c47654621f002f12c1b33a5d4e23b45da467eeb6578f86f6840cda781b221c3f18b97ee9a2dcfef2a9c7fe16ede06004d067436990090c2585ececc6ee86964e02dec5de68eb3c64cbd016e25746bc18c491188c1d2c7fa4115bb05d1c8285ca51bf7090fe68ac50090f3a140ae70d88afd2d085b8649d146923f1facaa537badbed807b80d662ba08b0b728dd9f2e1193419b1a45bc6bcbd2418c07ae1b037c0b225487c7db855d19d05c4dcbd3537765cba5410df7b2fd08e030a4ac17b207bbd4cb9dfd6baf0e3d31db8918784055bbc3bf077316ea1dbabf74c831e5f7518556550d3e372ac08b28d3082ac26f5b145face5a8253143239e8c214cee939005d1eaf77063aa72b7e1bb6f656eefa5ab54d451f953ed61f788461d8cd50279074d341d1691668feb7ca4858e9d6c907e4e2401c4dc29077416014ac9f1345935b8b59beea17ea7d924471b9efd8c03971ae0d9bd40c663029954e9068f3974208b688caac6b1e90db97312e01d8d8cb97073cce05fcf85ac5fcbe831613a58299f07d9869d42bb3c84f0f448a1d9ea9850a457d590353d8244d423ea95e07fb494530d5ffd538fa03b85484d939dc0d59238cbc4726f7139d3ab699bd6a0aa99ba728aa1226a4235e6c09f038e7d3d3d28ca16ce021a2fbfd85c90e66281bcd2124808e92d5f1f9d46baa3577d93e58ebda38671baa9a212651f8bfc72b61bfc85b80da9f4d6aed850fbe6512c3b1740236bac56463a497df357cace294ae31493ccf5915e9d6313048da035c809e8285a23b711052196a82eca830585de3fc564e83cc0a965dc1b25cc0432e1db47f6d89c0969505151d5bfdfaf4cf02382dec9ea91e409b6411a26b5940a1bafc3da0c14b974a5ae1ba534a5afd108e6341f8f4f86bbabd07300007223fefeef8543fbc207342018e957b88802d6ea17b398ac4cb5a05133f6eab839537f6b0c89133f3a114aecab88bb776e409612419f09dea656c16b5f4125a3cca32a2c0938707e3663d6b8b2c0a982598d9b4c8b30ac2fcf5a71f858c0f121e871a09f8b2b259ddb6219cee464432e93b2143d405bbb5f30dabfb20260b2bad0be4cd45edd8979dc1905b57f50652ccb16ebf50ce68ccacd66f35816138e06406d5a45cfd67d1ff2251c29fb378f11410dcfa5d39886f3d6d2e13838bbbec5936ad912c562945812d4a02926e50fe89ccc29001572fdd5a0bc87c1213e829ac54a8bd5e39294e71e696941c1678698f5c9eb4bbd0c5b3dd834b54bd629eba7d45808c983b1f6556570f3d2ddde0860306105f3ef18b52632fce3f7d8511cd4d129180758890113d29c1f46e3910a1b7fffc8478a7e15a0c8a86510861614af5a86c66240533f6e2f5e79a997bbc05bb70fe5c69bc5c0dbb1242b2018f684a596e6928496b605db8962f91ad2748132247db5855f27989e869b4781c37df347cef335cd61ce99393e9c78dbde19e55099cd48251574931e615d6af68fb1830e742b6141c7347d0fe89f03866d4665cec8e188333df6a8168510f52a929de4180b4dbe97d2302d4dc733d3d057a0d44200eaa8562a464d429005cb804e00d4154df4a7e7572cd8c56c6f35b860416d80f4b164945f3551ee171b0e922ee3dd3746e77432c27457e49c9baf2c463c4eaa5fc1b2e55e84142773acf6cceb70becd25377050d1901fe5dc4f82777651ca2671a0994457372a88617f47e896365fb7d0d2630ef70d250fd8ad269a1d1b8d615d45b0e7947953867fbb8f82093ecc07501ae06f0699fd383e57d23427fda748868d46831683a375a0f2d522b6bb988dd8e5693d693882cad11b7fe74397496c79b7cfacce01232020fa2b13ff0b4017aebb24b37d2cae2ba2c8680ad70684ccc01923369eb6c08b2ccf3050a85baee3b5c7657c13bcbe4df0720766037f093ea6f3a745f7031b3367d24ac6f694e34c533c47838623335f49ad5a5f7b85e1980283841adb9be0a4b930354214391e796c051b3523d11987dbf4ddcc3aab83bc818191c76278c5e9468d01a3e9c3e3d08526d9c53b39e550b80abe04bc2193989f124ca73b3e4d373c7672e2df8d45a78c85608d61c02f81bfde5afab9fb845ddfb173d0e7c7719f65b89e3864524ed14e54887da35e192aa967a49e8712947449ccd465497a1e3f8e5aa4a56122385703260e781dc0e123be0688fcd2b4f655523941ab242aad40c461dc386c160a8ccf39ecc017c52d19ed38d1772b5c70d74e2a53232b020d75c6a0bdcec0d2a7e97114ff66f49aa358b8ab63a4eb451d5230351e20ebcfe4c6470b9825caff1e82b2d7fed3771902c1fbeb6dc2840f31e93b7bb44c18ad3244d152521210510b6e3d507eabfcc8f1169b1c503631c8d29d95fcff95221dc492a06a5d8f55decefef653e219e8d2d9c655507fe0de978befb3b694ecd660db1927c5460fcfea93eab27cbcbee0521ccf339dacac74f9323b149e9e50eba2bbd4e6d6f21c54e2fb489236e3266a0b0db1f27171b70148cf8404324384b17013f43c45f32690e92d3f36d24a32aadf180d936ce5e22a2f52ee46923b44be6ef6fa2e25bc257dc63d0b5ea5d6b7f54ca1e233f12d5a6c3dfac15e865f0aaa33e5d4b3cd44b62b3621c592e312da4c3884468c861b7e9ef5cf32d613a888320b8d506ebd336f404b7532da2bf93ecef13402278d1ab0c3cc38e2faf85a00508c675fc1dda1d407af9c9c9f0cbd45db155167fddc2a4fc702f7dc45e1205759e50691d2bb31c9c6ee900b63ae15f43c32c99c3d7843606f724374933b22405aa81700fabec8d034a6453f305f68eecb3883a579d90febc625194b9a84034fb72a95386aaa662e6b2b1e6353d5e3416ce3ca67e7463845179c43f633199ac4404ccef2ad050cfc2b1c575b368e14d928a0759f34664f3d078e56b17a027f3a62e19cfca5bdc81e5eb0cd7f73aca6a40adc8c45fd6d3ccbdf78362ca2f9e8e2f07e39b571dadfe9b08a959def576d7d7036b8421d45ddf888e6a0cc384bc57126488d1ec6779d9469f4494e60d4467c2e12223a7108ec564e2925b9e8f5c91119c4715a42035b4291474eed855cb294d69f232029db6b03b1a1751d34b038dbf934eb81d46c078fcb474516e9e04e72c4979478a2fb8697715fb18114e0e0320c3bc5e79835ebee5fb3468706b1d93d96fa2a3373ac7e5e28182740483bf5918405222e13641475310e63ac60295206a11fa141d1014101a4fbd0565e8845760fe424294b458a66670dc144aceae853a3009b12770926346606fa01cfd1422cd536bd7a34849d6d331d7370dd0adc365ad720063013bbf393dbc3abab4986280821944fd81837a65850e83eeae9c9e52c5fe403eafebc83775203a14a3d0d351cd0f0b40f6a9bc8340168dec8e6aa8b588885f687a1758a2a894ee7f7e5125d522cbb5f0389764815f3da7467e0e88f3c03ec8d2e15bb01ff53e5fbc22fb4211fc0dbc0472aaa8cee97bafc190b33b3cd1ed1bb281cf6c19c94617c5f496752448656e1abf3e37c3946a25845c2efdc8efe6df563c24334103132586c1aa7627fd95707308f33a693e7849698804bc99b6b0874b5e8ef94414c3320406021455faed68f05376b6290dd288fd50227966070afad681cfbe241ac50155ba00279adfe2a6d842f14c6fe54115efdcd503a264cccfc7dc9095ae909fdbbff6bfb881679b9e3080c4aecffbfcc043d7c2d731a652f60737a209361500c02e0099f2e9befd39d5eabba98626baa854beca1d51cdde819368b67195d12a0c3e7f0bb7df218d6ec85ef0757e764b87d00674148dda870d6e5cbc4d1476b30890f74687b7f64378da481c37183347c4143b0daa1aa4c6cbe35a98d9d61175204c73603e6814dc6cd00953b0f10ce6a5b3cbbba2e703c9fa0879297458793d95ca1575e03ff265f9a9b569383dc5e94df14ba7204f34aa86e51c00df341bc3a8eb57df6b135f16b01bac7da6ca265af0e8ef8e53d2f69dd9cc1b84d0a1337a8cf0901768be4d5a23a82deff1a7f68866d9280d7df16417bfca2f30ce5b117c81c7a2b2cf789ef2372465e31a9524fa965c0b0a2da0c325d0f69720d25bd49038ab1cee418a6e2d4b8a129f9dae8d07e64adaf9cea2485f477f03d72609bb99b0ec600af2a1e0a11946d18910f495872d1fbe0e3090271c03a9e74095da90234ba249616044c3d1038eaa3183a8aa9a8c84d3b673c7d840476830e244d1b19e6fdbd6c05bcf336eafa2128072b3d97dd345061b144c4bbcdafb0b16db59a2bfab1b847ea40d183c1bd7730787bc1f91db15e7b758a966992baa6837608eed4519ba45a1b611564788fce29e0f88d5c11a26746c6ee0a3e3327efd8a31774adafed080d4a49f3b0164903009f97ab9e532770ad0cef7beffcb607216eea8026fb497d6a48e4c0d8706282abeacd1a58bd876d39e5ad8b54e78a5f28881af27653c3539fd06f6d0d66463bd557441440469332b0272793e782eff237c73575fab3a030bfa284526d95d89c1b9c041ff0b68113ba713e191e2a40aaed97bfe44420a1b0954480d8fd5db81aa31e003afc0c292984250ed599b2df105124eb7afef43045f617c544424b07f241d151509992b6f19c09479a5c92185165bc595bc5a2e02b72bdec2eaa386667911b5a54d2c1f9e75886ecda5cc1a5af1ff3203c863f98a20f342da55da62b01ebdc48c93d3cc5b72171df8fcb62b4bcdd533d90d493b07ad2428261984a075387f702adea3ff1446183ca1bd706d870f82d6fdb22c8ef905a7cf0d34ff57570eb262cfa2e6255c331b4028c215f1eef3de545e069eca52d5a3725b57091296aae4b1ffc87987b28b2e591d4717015e6319c4182193e4269ec515993a83aba7c21b935190e56dcbe33aec6d6b501384c590fd7524464c370043c2becd636f574dc18d26ae1c27909b428be71190859d94ba77d6d64151825280178286b0fefe7f6a5cd8af505d0ba29c05bea2556acb0fde62878136fbd99d26e290816ca8afa03477d6be4b0eb4112c5bb7dfdcf962828bee15ebce9ad9bd001771241604289db16074947eaa6201a308eeacb2bbb75360e4ce80c32a2d0de4028c00d3a9ac8af175a42bf564b87579c1cb37f065751b9e53e067a70683c34e02bb34b95736acf6b31605654b86810ee64512a751d395159f52bf1905d156b3ab709f68b94b976cdc737eb6d96d47b816e91230cc51ac78f7de223c70364cc2214a043d4fb9349d26e94309540078b1f1472bbae0e84893f523c31440cda29c352a067983868b1cc4935c0981a7674a89c48fd3daf4524b300b9956e54e9359ca7016a9f6c29b1fedbc99ede995b41617240a0c9ab53a72b7996533f3584d3e2c6a0011346173ec65ec01b23578c0c358c0fc7af9173b081689c5930ee4b510967c602eaa2fbc28f56e66a41854363cad7b2ae0984cfec4fbeb4e96e5d559956ffa7fb02cc8991dc870b08bb8606ad9455950e9406c6b592f9d210950fe58fdb8ac101cff9f60f0b60fdcdebbb473122ef8730552e1479f462dad68a993a7dd1981b21634bbcbe9294d41493c87ffe26c1344572f38ff84900666250402bbe0fc1e86ef30d48521463e973a42085da45dd18ed0c3d59a56446cfe06fb8d63941d79a62f20715800baacf3fb40c769d0a7f0c290dff1764538a7e37f65a996939fba1d841ba9b90abfcc65e757b9488d38f884421da665881021f1c4365f1291e56ef5ec76eeab0d204c54835f82642a13fde36fbb80ebecfe4c8eebb56b13906ed4dd22829b48a0f530b6824a262be77b9171bd08d8c7154f5c0e90fa4691d8fa696a7835020c1841c5d549679d3473b4f07d3774390e8fca31f8c8f30c524a5eff708ec4e0f53b3ac9da378119046f14693918ff3499cbea0e0ffa0d6dcc21857c905c558d5039e1d0505fc174d2faeed90a3d1a24a80c6b50919e7f5af72841c03bd895ea3ec4c84fe85075c307e239f915c38262b98d49612ac3aa4ed0f464480ad3789251b2131012e1bea8efce99b60d8bae984ecd3f6696a61a0541d275d643390998aca62a9789c04de27e5644fe52182ca337614e3961df5ede92c65cbf8a5c6c0cf4045c229310dbfe9ef8a3a42fa34abc7a606e7e69466f8486615ef139d4e257caf13eaf634f6188bd04c037736ea6a7bf783463a23f40802f43bde08c80528aa6422f4b869541100a3ad677c41d28185c86cc4c3b509dc01dd1581a1f09635c547ff7b3bf792cefe3d3104040fea7302438492345dde3ec9cb916a01891323a9c34f5b38ceabe47c1919752dc444711de5670f702142570227e161541c4d1a900e32fc6b09b4e1cf4082e676647ecf0404c70c575bb90384078b340a4f4ae76c5c1ba1088bd518c4fc14d8c32e0cbc65c0a2cee3fc6edd5ccf2228f93a93cd622082c2cd4ee614776d45c67021e28ee6ec77e8c437f85d923ec6375a8d3d1500eaa5d465d08b9eee0ce59b9191dee77e77c37695a57a546d13b9ccf42bc8fc5bbcd2f70952921c20694411858e0225ea94d7d86d48e046833cd401b72ce94a4415233dba5b983e06a662b69f21624abc613d80398ac2177667f56489b48fb45e93c95636dc8c465aab680f040ab0c773e10e05cb129703c1000b5fc0dfc4f32ba4be3d9c738a9d6a4086c0706ffc4d1ec08bb5f9fa7df24a84a3924857410f2cd3e9186b42a0010fc0545b644de56e9ba2f209d9b6f95b8eacddebc8e2dafc10acec466e455d186e27443134b6e27f591f096de8bf365756a7eb12743c33ef03531a8e950b450dbd170524385d6d2ac9469357be0fce6a3401f647c3dbe8e8343f13000f3b624ed16f704855cf53804dc2af0fe7210abd5319f1f6558d5ff40a4323601c95ad2661046d2ec327f660e6b69aedff825b90b6ab01f5354e03d653ebea6270688e20095c6492fb5ebb6268851e95f27e167b77b19797ddaca6518d7283ad3e5eaab8ca880cedc37f667688085d4a29c1d791e002d983b3c31a87ef5229d3083ded95ead402b78f716989e315619b641f11203eb49b1a451b00701383e382e080c84d2c675be7eaf48452879f88d7516ca04baf1d5fa54d610f9798cc7928de56bfaf705389d6ce4438a16b7848ebb9f6ab418369c51f72f5bc16e926628666dc63148df66686deaa9d45aa2f36e54f14538ce105ab35ac04c44567be15387643ff0fdb6cae0ce9c3a85ec15cbe485e0b4e96cb12de946be7319c3527b8cecc58fc1a92e687ca66005e87e91fa5622e978abf8f508316a6ca220445901048167d8e7bedf98347600101d1c120506002028eb1750ab4c2be3473d6e4d0aae7c2cef6f8577a200bb1e6554b26de6e965c2594d76ed3167b341c0c49b48946902a4d808b82e1a36af0594909891cec57a4486581e37c04c89daa2181de7104f1c8308604ddd1e029b747f9b7af0f228b8690cfc0c9b68c5a34fa7c4d078dd5577bdd7bf443d9cca7823fc1635b5c0fae65b621276768c030c35d9d073613591d5a7916ecf5af7cdc0897fb68432d9e93f25ed5318b86a6a0da8e4126a42a011be885f0bf5df2071412bfecef2b8cbdfa90bb7e2ae8702e85bfff1e732bf541dd2cde0f5e39f498b65be3b83933cd624465b722a4e52e3038d4efe310be15d4735ed0570be421de546880fff9d502ea49ddb98dec4eafee9c93fb1bfc77461fdc35fb034092401cf74a125015b6f09e52eed0138c4ecd49ee64380515da49957512dad8ee044eef060b7b1debc48358e596e49f3f82fb38179e4d3fb25cd99af884caab2f6764613ef18030df31784ceab1bb40e9382f4aa696f334f908a370ddc14b70d316e9ae93f82b81b2e66a5742bca027acc94c7f1290aaea9130b9ee841123dcfcf6abbe94fc70621c8af7e09ad8b3cd3258f3621e1622fbd99c661a8431754dd49f7dd1bcc8a40c81628f2c0df6e23fb897841dbc7b82c2ab877739ad4e43f7466a987c20c4a4bf0e286fd1a34c02194c46280ef30eace9cbc62dbb1c21be78599d20979a5d8a4ecb31b5e8125031da50d8b3e645fa062639bd1ba340b2e22fcf06ba4bb2c58424ded7fd7c35068966bc859fe48fbf1c2e770cb89de049fc393e913a487a0c228c6c66f564f60d4c248247a51912a1b023ee9e92d43b3900ace1e1ae30201bdc4f59a8bbe512220a65cab16b6e952e0f98c7750bec33a11b96bb3eab5b03b4e03f338748eb3482e665a6648a6349291d068c522be61da3689a75749551c5c9e82aca10e62b8f05bc3e2882d4a30edb55d8f1b3ffa6f2d10d26f52b9a38e590aaa0115e0992e3406e09270f03a3093b26d5a9feada1e7aabeeccf8fb128be603fd7313c5e9754fd074a6e533d6033b62625ab2cbe7f47642cc719654b3b96f7aef73402b1241399e6f87b63dd6fdad57aa28caa1fc35dc11d0f6abf552a2a6a12b9739d226eb8029cf4a6b57114104a492ad170fa75e807f24c175ecd20a31a3205e51248fbbf7907e1887f013634fc21fb051d6036cf8f6dc220ed39e8d3056beed5f593fa00357b9c17327d14c480683390b57888e0aef319fa56805642d9c58965676340629f1729becedb473059650264b1bf2d6e595e7eda059f595a7edef8792c9e5210ab5322f509ecc5037e759e8242496f119a56d6d7a6b28985d7c10e23dbbbf127227460fc439cd8e9c30874c80c2a1951c1a15259f12644173088300c6b80d8b840cf6bee1f2e0f98414674ee7f323538b29a5f10736aa39743978479579f40c5ef5832fa211e315415578162ec1cfcfc0ae524fbe754e3c15c56adcd7e1d1dcd0cef8b9b7f1278f56762068242138372c5edd1f883f9ec903a12333966a5c71f6293623f7a63648e5e3d7924569765104b58374ad2c2654158b1e94c3ee075fe40b20c52c3da7450fa7a3bbd2830652121f56299af10a5739b87328886e26d810334f30481695bdfdd04650eb668628b8a487a6f045d423a90ad6fbd112059bc812c9791f9c4cdc9d68cbb791b19af03cdb7756b30e9a0d7041b58e091507df2eb039052d947011eab0a72046e9c55bc1a45f708633ce5b5cac508e2018c9a512fd48891f21888094e6ad3ab2bc8cb4ae8c804e0ce9ffcd5004872d3045cce3680e2f676912562a57f6260778ff8100ed544454f6b672e27f5aa0505ba5a648c61c13eb16579c76fa986fd82e6cd63cdfa1606b17d2004f643ae1b0fe0b13f3eac65dfe906376bb02b7e11c17438ca458b01733af6915ee5b8690fcaff7c0af759dd167b599dfc6cf9aabbca6cdcace2a94deebbdfca5c11e917e64cf961cc8c29168c410eca9f3f24fe23cacf51cf6c8317f69c2601b90ca761b92f3e2c063f5df41f9390af587acb014f8a19714c8de40dc0b234c71b2c5a5b8382c0cd9cdd1fc6e1690d48cfbbd17d60e0f325ae3feab4f9b7ac016bad58e96687a308263be84c924c03d663617ef8b2f88ce62381935dbf9a5b275a3ccebc298080083cff471d819e23713fe105c30c203e9ff99ae052fdac47aa6ec924e5a53831a5fdce3251ee85824284e0b1f45676e5cca603a45405eb98fc64f4bf8003d736e869ccd99c66fb4f4b4ef1387e0a145d81eeb6acd91d7ef274b60470a04a32d43fe53f98c2475149ebb0a425a3e87d8a16d664e5073abd6ba43d7748f54757d592b8c4f857b51f9d692a5a1b4620da0d95a48ee1b2626b75cacdb17a34264f91aecdaf6ea5e1a2a381a92af3546c204fac86a40a2f01f606264f4067a902c4261e1af98007c2c46e3148784b0bcd7ec6176197d64b76e104d7236eb577cb88ff4a3f6530b4bd8583a5d100cd02db88c64b6f5a2a456284cd022cfcd2981e8c889eb54464ef1650c1b0ea803974e05d727bc01723ec65d5dbd2c64195bc2f02acfb62165ef97ebcca9295ff6a31bfb96ed8b9c43e70b0e29d3925d43d6d07c1d058398c570da909dd23be25bb2c02c1b9a7f1885a5d0f7bb13317c76a772e698369948411a38a4a8161d0dd8be8eefdb6314702ff4ca8ef02da3500cf1b399dd291d086f008708614a1a5dde41ed364206e13f15fb00e54e5e4fdd7580e5bb09b507c542b09e2f46a82d558e6c640df3164e51d9aac1864cc9b982d6c8057ae2d6fcc31ff22533ccbb95a2df33566e071a306158dc01efd77ca1ff1a7b661af5d15330f2ed55efb73d8008efe6dbea3c03743cf21e8f5a6b0828900370badcd8df6e51610c725378646c5fc300e886b22104343ea1de191b41a05796c850e3b59c32983dd6feabbff874253292c6e464e00442ee1586b0b9452002650b7e147c55ea8aa6ca6129ef227f7b6d7c13442e7b01f48d98c47870328d9f961d9bf49911861d935cb18ce5246b04e0f3058d33e46a9f28d6e156dd62b5c633440c8221d71a5c12bf5b6104acea94e69955e2119ddf65b9fc2ad3d5a0524ec4fd765ec97cb9003135ce31d674d239b0a16a59b8021dd91aa215589618ed0b2e3fe62c57f42d1ed600707b5b764abf009daf8ed9d54d458a4b7d91f51a8961229a4ac01d6cecc9d9c1e0125eec0f2ccd9bc400e3a6640a1683e8596760ae73bcd9469bcef912c2109f0675eca2438a8313e7d4c06e087d1f8a07d8f50fdb963142c75e43d59801921701004f08b3ebee574a90c92066232a037b9fdd097e325f300b6f1d6793961180ca73dc58d9d5654cee84d62027f215736c2462d8e8694ac8039633419c563e7e0eddff8c591c5bec7f5e34d809d010301a55c65272a1d50418c7ed0edd1886e49b62e8e0363bbc8fecbc987fd5bbe31d1805251d88514cdfbf7d1a113504bf64133bbd776d5af1fc3e7785ba58d4334fa0033e20b4ac56974ea8b35bb11b8de12a3f2af067742f0774b2cc99645e6e3ff048887514dae88af3aac78f2257a5c627134c40a14aa10f42c8183d01075a6e60ab94012e58a7164ef0d714ad96b27d0395a7d9df22af6c02461e475fb1c03aca0e515831ce2164b70877ea4f359036289e1c257963aa827eeafd8f1a184f3dbec109f7728a9f03fba01846a9d7121c5bf6957a00a3c95e2e3effc5cc96c214450a383cc00eebde608a37f6e52c53802b6820b1208622bb870204332df8cb425c0230bd3faa6792f514462c0554c96b39301f7bc884c07d0b2b0ded407a6dc6829202e89904385e4a6c2d0bf3550ddf5007e5d4a18311882362ac5792cbf12b0ebc6aa7a358f5b18a72cf9821d7f804ca206bc804a0ae734bc86573c67e1df8b8e5f119274766ce6e6ef295af6706876065bf6b7535256444c58445f70e80901587d9b333a6f9dbf1440173af9e1632565ad9bea741eff3896e64f17d73427b24bcdecc50b80fe31ba345c84fbc7b3d82722a46070faec51879c1e5fd0b854eea3e09e2c0bdb009a06b7d5188c9aa1f904185bb3bf1fe192b7eef5ef7791c7c081d986b0304e3f9d3fd173af2d3bc06736aa03f50ba787f0d497509a0cd7a16629853dc84a8c852cb0c9b1cd72112120e5ac57f339af7448fdfd003dd04ecbefb19fddf55778b869d191581182c84da051f55169196193cd91a6dfa028b2e6411c7309141222c2d61947e5c5230cd69df1391f3312bac67045c1adfa0caa9022f5cab051d5302e36541083110d2abd78e7e1abb6222e1d488dd89a20e75a1112c001c4fc9f8747afa88516463aa48bfbe606a219dc30cef0af2f8d90fbed0344806558cba64997210f779e9e45f2b080c3499416fbb3eac1a978318ed9f4fd34c6fc764a689177105047697acf52d93e8472a3190c6798901b36dadae0864eed48165ce57765d61272031a229d6605be903e38b3ab044730ca7f0bf28c182cb4d892ecfeba20ee72dd13d7bcefcf92a053ca91ffaf301a486ad92fb396cbdebfb3920864116a41a1d9dd27f5ebb53e4dc6a6fb4d656a6f4678b7197132046141040add4b2a135c027da490c22ce2ef5fef5d569ab94275f00b9be8a1055fd0055a19870788f1f37e61e9bc24c8b4f1852ec1a2c3e622a73ac3aa7fe57c0d2ae1bf372047d1dde0b6e46069d71113e34824b9bfd6d7206d706b0df6b389a17441954b45665bad78ec6e24a5d222daa406158ee49db4f3d964f8d7d908a132a805b65b5439f62f2a679c764b7260c2eaecec3a35019a0ad9fa4b35be9dd113fbd9e3858ea8f243c038bf283856a14642f6cba12abd3b9c7df3843e148522d2a5906b93e035ffadf996bdf6c648c45c84aafbada85302d3053b4c9ad653a57490ae578358f6bbea9901146417586e9a11e57cf050a4d574fe8087db4b98035aa6e4c84c416f19832c0737f5578829dfc64c38ce32768adb9c81cc655ac1d12e19d0d696da098f8cc2d10c66a7fb8b7004e71f91376f2f35230988784b8e911eba83ee469078ba79d1cd8097e472ecc0d5f233bb558e6dcb17509010f71c225cab060d5991004bad2014e0ff4eacae4337dc325acb80e63e9c5963b7ad6e52012ef07748b21b7b5be9eb79dc97fd8820c848c8ded194317ba556b9b58e364ef82b6986629f56d4ff65aae25e90e94271f0825996302c5cf2833cb825895c97431e5f417a483b8e7f3a61c3fabec64f8b0688be30a1588d2a337a16eca94e4228e6c5e608586cf6dd13345b408b2650a62073ea6e3038a6e0aece2bf6800513041f4073de9d53888969ae66142d5dfb7e2f0ad8a99607f2deb46db4a1dce01b311608e7562587d1adb9a1e9fcb326025410c629e0aa2148a5863d6a9c76b353c67c43ecb158ff0efaf596570614edba03f98e9f55c31daf8a7f4d8200defa06055e14337a8db6af16049fdd257aba5f76c54556489ad91466f800751c79af635c37aefd3e665d57c830805428f0ecf2fdb2caaaf55e2d8ccb7f96219c2fd5306d931771d8e206a761300e50a937782372767f7edff86c5adea81bb92b8128cd17c23313bca0dc00db8bae083496e215a0de67582f6f20ceb75dac2bb4afd98f2a6cf9dd780eebcd6fcb66203bacfc293944cf93aa72441c23df722f07c07161bebe940464f8a8fbe6f9e3cea2cc834b7c30236d3bd6db17479b14bf63b8442aba68ac1e2573b79536e6155aedfb17b82417273558261b97f9bbaa2a80ea96273f1e8df597d91df824ace3452377c5b96a48bc8b434e838d2d95ec218a35799e81833c067de69ac2836a0f57cb37dc07396ae0bebd0abbb1072bd0fb0a2c30b2d9155b304754b175cd6d94cb4b44758ebaa38dc8aaa5957a9dd012aabf7620fc425d05a30979ef357253b1227b89569b685eac691d45aea740f30701b341b51869572430f1a1c70df06150df65eacc14a1df08d446bd51ba730056b143b086031a500a2a0129211b4f45fc11b311d37b0d9e273fb6b3dbd0f0cea5d13b3a67e5856a51af7835de2fa32904366fad847229dd4af2a72d3ec12cef9e301d8ea34b18c6531867e4127fcacfe419240b427c662b6fbbf0a7b969abd2fe6484fd6da591b8e03cbe21dfae0809d6de5b0418966ea510503b8f3f3599050b6dd7e11924f429dc69b2d1f82d9305a7401e716fbfd53f8d51b0b7fd5f3ec53eb0fe8b76062ed9260a740626f8ccd3cbeb38d646dee589075d039ef7208f83e3373bcec38b05820c05fff0b681ef98a384bfb1b933198f2df981e8445729247cfe186dfc7c756683914e5df31296b162623309c2f86db977e1acb8904f8ef9e3f3665826c1c2ddb5c3411f8424d040afc982042b8845f734d2a7c0bebf0f0da25684e54bcaf4062271a080c3a9b81f601378c9ab74a3a22d8b902256efa8c48c3ad3dfdb295c5fbecf286eab755cb8be7f5205ec61f17bebf8464f817713224da978b44f8dcb9a7cf720626b2a47aa3360b91d712477ed3c61220e6029802a904ef16cba696206f455781a71bb73f0127bbd002670c9ccf1f132ce0a32be28fec58d7418c1f3c5b4b0681c3b73fca26077a88939f4960ee07721f1859e33f9b8b2191022883e724494588741e2fb858c1c823b34c20c2b1b96c609cb396d4ef7891870ac572c5d5c60e60f6709bd613e3809764109305f01adae46105e533602452572f8690f09e8ae449ceaa82386c90d62c22c5236a31aa3589c6ac38f864238ab0bee3a86dfd674db6281557a9e034975d3da35976d6a3a42cd87494821d9dd5ca0cec2753d1a45f6f2dbae438fd077500bd3268389c57793af96d834854b5f02124dca720def1c66d285c63d316ac4bd482bc492147c60720ca0de0c1f5bc4608679e1226a1150a717a45c66468b04714ef17f88ad968169a43c80d6c7cfb8f50dde222eb957e7ddfe5ab517e8d17bc5aa3426097ab67ad2b6cb2d5a56e70494673a465868277ba7d2d3f5654d180fbb6cf727fdadb85260e3383e183ab0db365dd8b661a2189df0a9f93c0fba98640f5699859212933ede180d2056bf8fde789aa1317020d220b5236fb351112c838d25f3bbc054a197e76e4addd2b0edaaa3ba1eae32a39aab52c1a40d04f85e281a69e5f24502deabc3862b004d6ef22c6ef0e97bc0b7d3abccec9f40517bcc06cce9e5e83ca14229120ba21b1e4672f6a60b53543adb6013fd60c89de7bf59622350b5e054260ba5eaf461269d222dbcdbb3b3b1ed46269929396bae63a0ed98db64a35791f5a307c308b242182d1f881335e7470f24145446a9d71065a02759047d439e714783dba45693f8f9de0e490b834bf861c68d9fea284f4cb9c523efe3f9393591e25ec9cfec12f8f37bc8e42dc3664678941ad2768c73927711dea2f42af9256617bd527f339c68c3f95bef715b442c3eef239e07525cc8e68d2590e6d4386b111b42ac60507b9c4048633a390c89ddd42feb4995b8bcc71d27acd4d4452d071d5f1a7327f51b86b8b0a747f1b46faf80789b81f4c323f67256603040095a34d6477f47a17098d4661829be1be804e3d69e95fd3a0a3fdc4457c76de7908b73dfcbd24cb5cf69041be019449a573b5d6a972b1dfaf351e4c20224e70323cde8986d509413cec84b017c7f3de1349a6b78da62b5389060f37d5aa4165bd11c7f6238de1c0c08deb6c760e108897a9e5a53f281e8863d1c4758dc0a15f3e3e927cafb6f5bdcafa920bb86924c119c44e1a482208278e222140bac402068280953cef01e60838b1da8898112ff941a4969c496309ccb300fcdc7ed72457a131f67886587344b15e2c0b8753faf395b432ac1bc82af3a2e0967c250532f0858fb4f6bba4479952b1795a2164a78fa9e3aec4203aa5131281faec613b4489109bfb9d1a6ae516af4f11953d65f3b1bc15f2d66a46ed473caa07e321e697b06483957a0f1aad5dee791b005fc57580cb4b4c0872f597d7d7b5ebe53b9c34983eacd97a18f83cfc5697f8f9d01fc280f2af023efbb1a795135a1fac6d66ae10285bfe7efa17d4911fa650b088dc6e393340ec6cbf9879649c27f59733638e4c1d260fdf808ec9762254e6cb8b66e2694933db23a8052f11526c75083f212ce0b63831f5ffd93acb91f9716d042706c4d6ce06350b72b341cfe54fb30721a97e5a2e203edbeaddc482a634efade976873fe04b93679877fa4e17e1ea812930c4a755365466517cd649e53f9c7dc99406f9687c1620636971419c85cc37539c80823c9c4472e50a7c5e95ec1bd725c02bc768d31154bd70da3b2e7447ae8b438c6387d772904551fb9ec94b8b4ff52c3d9403a6421f946e10197a016be6e401c531497ad9ac3317465d6dc5f676bdecf28a67b05380d5205f05dfcf1ea6bd031f704d3819bb332e8a57cf1d74d66c82470db235f66f96483ee3b6f80b4e6ec1709f26c59aebb28d54b757a3b5e7d4b4ac6f53f596c6d9f0deb1f2ef343311bbeaed4320f22837114d58880d05b250203abbda419731584f001d30e633aa6f8395c04e1597162a0c3ea572e58c5b423eac970b180fa25b770b9380c120bb37e7968ad5da8fb6a58bbe1ec88f368a628a8cee426274f5a20134d933d785697cb3b58859573addaaf3e0adbfe6d182c2aa56d8e52d0270c2b44813560bf3739ee468ebe74e1e8d910885dcc48504a661506fd7744fc0091f8f26d08893dc85b0fc8917e273f129350bc268ac897f1792c2752112c64d3f2c18b4e3fb38782c3354aa0b81689dd087d742895d23c98aa26727e61125f764f4b78d78a6a82c543ed5423d88e395c2ae7e279794d67a6159c0faa5017b0c4bc03d231d53cdfc3abe089dee5c4209fdcb93acd3c802bcda62170d47156adce77cdaec5b6801e07adfe56153b80325d3a37df6fef3bc623423daa63640d08dd15a8b7a2a4f4650951702fcb5307980ef1fa87d53d874931b0d4e7198907b9c0cd1fdf87a79111376184e88554b08143c091235197971cdce96407d2749fc271d286c752fa1981c2871cc049990f6eec5c51a657fcf4ee7862f578562df757d674f80edfa86a826d080405b1ee0246e60e978241a6db45ed6f59a90b82843820294e269e2ea0e6066345992c4a607641c1fb48eabf528b2cd2ed3897fe3be18992734cdf1a1b6a0497443bb6a7688f70e0b3220c5d0c73569e889976c70e0cfdd9111ab1829919d9b8a840e6435dcd7274238cb8689abdba6a0b6abde895655020f6f4d28f7edded0ceedb8d77c64b098026a210ab6a5261ee66b6d73a4369f8001ffcc67b25c6760fbd5a8bb3c4ad8f3f50b00a85ff61a8ec6e96ed2ca5aa537f9b115af98f82f46c15780f44a57409c69884bf8ddc48625c4376874eecaf928426e751d125a4db14af2737e227c98ba713f69909b2b46ff00cdd9c58e647d9b9e1762da520607e8b39baf9b707584ee277c55e51b8ea0e9cb039f2badc3b1acb230d6da22f8525f3054418711c66c69fcae312bc3808f098c17ed489c9861702ecbc2f9b9f4e48bea2914c8c158d1804b30df29af34522307832faf004ec720a0abcb5199a18ecb816e6fc5a14f5090a541d264cf9dfa83c31ead138ca5615b8b72d94b321feedefa56e8c9b4baa64c358a974f9af29134fd304b798243ceb3477b032f2c638f73260c9685623c57ac0b33c450821c78b6be2f9917ef5779b137c3a4e06c28f287d7645cce97c8891825c1d442cfc38af9b9b6e452c90a71f27b55388ff34a4f56b5c5c1cd69fbf19e7947e1aace7b60378e375ee65ddd702f986d9c24c19d1ad712026fe021b3e98b7254c64634364626b2ec625082138c9517441677e0568326eba12b939c04e473641e49c49eb2ecd72bc0cbfbe8aa3a11d91e2c32db1ab2d90dd16b001f8b4d9711d3f684124c6d9bc2a9dd885536613d295d11bc51ac7b2005a4d299a6952a903c06235b2f97dd6c4cb364d41e43bc3b445b4a2afd81b86b222729418a62806ee42af7b877b67f9a1b17ce61f9bc907f2be311b7d74f70f300b4ad76f08480d3b6aca0b48ca68a57a3930f54f438fd046ea82fbda6c6cc76a87ae52a03f006b2b75b0b6f4a832e53d496455c3a42dfa667a8d380a72e8a451812f4964b21b1a67afc228554a8488757a01523d59048a5e4a8b1ee4ef13a45aa4c98dc39ed77642bf094d45c41e83919ef5b28eb06e99e8cf76066173d4b6cf7fe5662d18a8afe4c1c26dea11e79857135d25878abc0a02ec408a62eda2d7a6f861226c9a99b3daaefb4fa3cd07b9199609fb27c0d1af0810bb335c28dda91425542db993dffb7e127725c5002cd793f33197fb82800a076178913b54359a44cf5328e149cde8c1576b83544eaabf341deb45f394da6230e0862a1c7c6c10bdc66358771b5a144dd2db223b595f8cc32bc79225034fc05dbaec1302904c7291091ea791793e7adb41ee4b22564198445745750b274751cfa052e18f550c0b4a60645c6cc6eb748a4836e3e75153787496ff230f6b5fc9abcca6a19ca4288c1185fd1f27988a21f8d1784b0766304d2da89be3781df4b8807fd735387a4299674a0c2e6e005fb953b5ff8b1f6715fe9c71404a246f1cb0f06e96c8897f271a17556c7ba0896568590e2aa41638317bedd969febc50112bfdff8744e43475d6974bdc6118a322f69fdd07493254c9fcb47dc2cf87d89a7cbb65e2d2399dab7667174d7fb21e427b39614e2963155f18b22ebd8ae875c2dcbd8e864b903c13a8d7d9e1fbe7b46df27820759b844fd5bf47cc3a5fe53d3d48a2cb344217916ece7e6c00cb847ed9918a887c5373da3ca224341025ebc9437b903de8bd84d977493f3125774bb0fc9f6fc94e7a4af7397f97d60356babb2939032bef769694d79c291356d658ce5441a67ea118ccafba69a4c8e100d730389aacf46a6a49023bcdd9aef4aecf81a3a0b9144cbe9cf3cedf8d8b4040c3f6dae8e44a38c7acf6e0582b709f90fe38186b3d82ff56b800867b1fc4102bce2ad5ffb856725b82f08a7974f2ac14e52f75422834f1c589c6177166ac552fea5623afd8587d512973a993551454aee3e0ca01b7d9a2ddf44b0a6b563ae335946e1c485a2f149787a4c6e410586f57b1952f53c75be5d87123a0a733d3ae465651a508f172ed5a1768c1cdf1470cd7f1b61fc76c67daff94c3dd33a5de821f08b6d128fc6e72ce24821ea945366e05f0cef469c064ae33bf48912f1b03ff9ea20a5e7d0f2adfdd48d5de69812a8a921ac48f7ff90b832819e2c472c82aa584360633c32185fe92257eed0161b2f8ac8d836c7153f6a51957760b35a1d6d665b58e35a1006dcb37450e0a6bc425ddd4cdb281d5254f991c0a193ae1c1824191b8fc29133cf0f180cc62b2bfee3718f875f909792f7c51c2a228945b5413e15d5515e721576889f942c97657382c29e6bf201584929f4fbd60cb1dedebdc87952e8b516c069a701a15e0bbfed1af9517de5e85ddce3281d07dc20f2a0a65411ca6d54412d5763e3f8443e889a7aa49a831bbfc9c0e84fb1f04feec07c50031c2fe91e2fb02ce28261508e48fcd42027aa03d27da747b3de5f95f95ec1439262726c9fb27a676d70e0ecdb2472570b1e70a40f853569be95cc57bab0d7e57d7a6904c749dd7955cb55d35113aa481be3b98effc3d662f7a595dcbe57cc00cd7abb613a31829756462e2a971b99e8283556ad0469a981590da86f1e14e0c7fef61ea00ddaad8441bcd631e9f68c3ad1e420d59d24d184a3c5e0d1bc3f230a4d24fd4430a2907aebcf28322a0cd9cb368e53a3420f121362dfc4843b190fa026f56f9f006978e6913fe3afa1ee2641ecfd52cb0f1f5f1fa68517d9a4567e0958255c28787f6eb294cc01dde4a82c7c3ddd2934ebde822a2cb0c1d0343a7e4cdbc638a9345a78f9380a96af9ac1131c6d3544e4e734cd33d4e08fe77fbc32638b88b7a61359c79462b131b4a53dc3be738de25aef21dce548b2b462125d6e6e167c409bcfadb1dd3e8fd937017be40b0e2bd58312b13438d9aa92e10148bb1b496aa41d818446d48a688b4fb65947977f6fcb0d6a113a053bbb363a85da5dc6f5f91d54db2892d977f8c2c2e404ed0d403c8d607a6035e915164a5b5ef8bd462a04f24073f528649bab27510f61af5669bd98ac7a15b3d706e751f217e4f4582f9cac9e42a310c3688226076f761f5fbf102f2c9dbe30b573340401dc9edcdd2b3a9459a00021959d441cd1f59b53b2ee7bd62e8382351bbe8b5e3f95e9e282bebe9c48f34a24fe377ca46f559c754e46746ae5a2ec32367eaacf56ea9360b92b31a647542b99da86c3c8a6065c24e5f9d1cac23d41b8810bd2a2ec55f4a52ac3cbe8de1d94916d392497c31c0767828883f938c090f18db508274a4e80d206f0aba97f07f6aaa59b062bfb7c7f5f0f9d381ceb4b9e54103be29ffb4efcd43d6a076e91e7ae3bb79e2b1bc512ae0e54648327e0e3f47d347f5113aec681dfc71800d151773c3aed31c03e45d7f9a7917f144531fb726acec0fa583849fa8d7c36a39a7deb0c8c150884985f402e50b7b384555610150b7afbdda9d5a46c19e6e79ec9e14c835e9685bca997141c73f701cce9d94f4bccd5cfa7e1f25a0411ac7311b08a6e10ab633782e8fc2799debb0454b5adc5dd77ad97aabd3eff8cb373ccf8032ba461549508d74f7062aad45ac7e2012a07bc91ce41a253bfe2463de0e5ea2ef32186121aa3c65fea6c667c55304f776c621c0d99189ab5bd761deaaa021c011a6681084af1e61ffa6420b2a3ba73675505e7428138d47706aaa4b630e1fcde009daea0a84895a12bc1123826f9d69d0f3670778a0320039bc1ba93a43658d41139fd7f296b863e6a6ddf6f5ab75bfe707f1d97eea9fae733268e17e8f703400169994590c6f2da7d55b7a446c4a59e50c62dfac0670f261a87374b894b405cb3623370e0530aaae36982f31f57abf2c2f5de9f0fe8c5d2a226aba51ff0d13108b4f8c9d421ba9030d66aec6d88b0226974e219ccdf3617568483af6fb37485170b6e3977841048aa70bf493fd4a17eab2a20c7d41f4960e91a5af8d09ca7da9a34b62bf95fccb07353915d15cdbb238f53d6dc1b61b6c0ac853ce216c172183d971ebd9e90f19c7ed23efd3e642e95f8488bb55c8d4ec472bff9a8fa8accb8cc5a586990efb70f0b3445113479dd6fd517aa15e36de2204ff7c181ac898bd7129c17017d91cd8f8c57d01cb4ae8995f7043474a9e4fc1062d7f4e8d0d95cadc1a2f4f44999c02d962e8357981ced71fe64968fe72486563b6e1d070aa5f523abca9f9f99ac43fcafaa452c72684492e40ba4e8a2cb3abc21013b23508c34565318e4aada1cf6a645ae0906edf030b6b4936460942c603f5da29ca358473e7d08d0d53c1b5f059559cfae579bc3ada96ccf0fd56cb7a0b921e408d3afdecdd7cf36ea83ab805ede9c4cb1bd30ada118e2828899050829e0fa9afd306d53f0b6b42edb20014e80183d73f9f7d06c69950d436f8cb1be43a12a95a7b1abb94090d790875e92232cb213b516b36f3d9d4a7cbe67d55568fd095c70db0a52b2e0e18dff623b24735d002dad91ad0368e0f6f1b3d4fa3b2384056301a34e6406359f9d408e308c5b70a75db5f395b479ca2b001a2a5104a5f89c922cd4d4482539ddf20d589023bb0f07c70bd3405521b4a86b12036283a768defc7ec32b08a7e63c09cf4316cb6c9e242c56a207c422f4c97cbe0edbc2d3be4c7d3951567afad7bce6a7b8b1f85468f97d63e6fa833944dd5d8d31fd0c5ffe6af822ac9245432b75deeb6296058345f3a8ee36fe42aaef01edd48c541099e3182e76d1f19df1003f14eb997708dc25a42f46fa300ae10edbf73b45f748f002400f93de9fef9fe92c03b48e9e8bb41e92c868328c78eeb53e92908dd85596f04da1383a7b3e6194763d55187e3220780a7a20fd501b31e5cd32052925640135cde8219955aff51ea08c5973acba08816c681569be9120c785e0ed54b9659a071a036ea6b21ef874512193d0141863673402613c2b0ea3c6161312f0007c08161607bd97bc404ddc522b42abdc1a8af10abce2eaa93465d1ca1adaeaeb3535e269beec6977ae59c76d0dd5d5668c92444c02b1f48dc356ae6ac0c9891f597710e8940217ddda28f1d8c815af094c48194d96dec3f397a460e1358919defcbe6b6011f7e04670e96e5928a9e08d2aa04a8852c9ee8faf5dfa748b9b063d7013ed7c8c911b3d8f8da1f3a62a87b4dcb4da545ef17931d8beea0bfc86dcc99160aa56ecd047b54248b2f00ad85d38d7f693afee7fbfa2128d018f99937dce7094db93f6bf0eaafb4d736bb8cbf5b7fb84efb93150127f16a30b353a6a9c3d9273ed790d90ca5cbbea36d80555c025cfa488e25eba5ae7d5c566d8540dcad41c80be280a3def80daccb8be3958f4e144d8a52290017864e4d2fbbeadb30200f88fda044e0c7438d8fde36cc56dab54264ce91140c7cb7ca2835e28748aebdabff0f0c4ff606b69fec88aa00b5dfdc10be5c37db87e3ffe8c858207429d37d1650772c9e7acb15bdc46af3353219b0919c792334a74a3ad9fbfa646340a8961037ab4f5ad1879aedf735e6d092c6b778021529a342acf125a44047eb094a8066fc2803844994b947123c1d4548a7804a9a642a1b99636574b67531884f4068d3f3e84d795368fb21399462c01f79ed4c89f24c58755c8423fd8b821a96257874ce559d8bf92e8f00309587029872e9a0ab108f846a386c245dcd1892b5c3dfd9a86ff085478f350d12b4f9f11b0bcca23d26af3c53ffafc6120f653cc441d675ca61e6384a09a7b75b347b24409633e3bce09011330ca3e3e0a04728a926910a36e0ea91c9b7340c50e2347270ddc2a8da6b816507f0657d532678004a8fc4b13abb08d28a85596f293346d9d8a42a5a70f662fc9cb07a6703bdb242fa139c2d861a9575a8f6207a10f8eee1d6a0d832fcb39f65461e7e734be83f1795bad95d21646a99a9fc5f0bb32d672780c27fdd0bcdd9404d343a7526291ce4238dd835790efd1429da4bf874964572044e403430fa9161dba21f70f703e2f635fe0c77c846b517fd2203039cdcbbf8ad13c6f3af43af3a8c92fc144ad1b4f8bf6a71c1ce9a238d256277e93aac5a4c0521a150bbb01a873c8907479f28d820a51639650d9c6cec2d0885d7724955b670a346725a04e2fb3b33082e55c3191ed6f823abfe671ee28921d919c6a1eb5b11aa0ce8346d739ff81fdf452ae2d74dedecc6bd93c5d0b45f94d5cd1eb40b15ea3a2524197f3ebd198520ab466c97b0231fe8629a8c273399e17e7a23a7bf9b76c281555653a07f986c72bfde7636d4616592a953a79afd01f01286a30f83049e489b395903b0fec128f9f3a074d986f9a4764350f0bcd0e54c6a3cf8b29778b775fa95b50f0af0034e1ca4ed93c4d3206e7541a01c134c62291125625a940b12a8e308e2fab3962764a80735cfc823d0d08aab4728565565d1fc6a205fcdd42228492f1c3a6f17cb0f6b5f9ca0674a8c592f11fc6a98a249a52c1e8f548cc28fbb73bb6324c895f862b2565a60b31ca61cd461f52b523193e27c598477e46d043e87012314e7234649958b8d3ea9fae87ec089af840f1304e061b65736c7d8809075585dad0d3699a7904aa1a3a8cc510ef7d5331ab1aba16bbd2d94d080887f8ce7d5d42f4816d70ed637486f5d00e654ffe14d52c3081021a8cfedc416ba75d7d6b2bc7111729e2409f4a03602f510ad65b33ebea2e98a54988e063a851ae3f3c0ff43b8136206132793b4a3ae32ad5b60358ea4fd3fe03e4746a945183085c6127e3c0b7ae06fc6c0b4bda553f12c9538a0f9f0fb86925a00000393c60b2c3b410cd4532ec09b069c89a819f95ae60af26ec66cb619c502b69188ff2c7ac883445008b909a77b81f97c20e5027487020e1100223817a1ffc7ce380412c0151956c1884e72bf1dba0202a6b25e2f2ee1c876f2f0296bf6a8f790fda128c9ce581e5401caecb39b0605606d6680cb2c05b33e8069569f9150d0ec2f9defae1fd30af0dd01e4ca75f829c81d6a29080cc9667985b76bfbc799a2fb65ce1a43382a9a512bc0c4185d562977ded362468a8be1e9a3fcefaa1f6f33374fecf3ea3e4150b0dc108e5335ad6e317f426e4055dee4b0414ba9e6df0f73f270e3701fbe2031cdf2927723840115c8a08aa8f7072f303bd4bc6554edbb2cedbc12036ce2866200434117ae83a45e59526342d1ead13981147d1b91dea622ef50c8d1f378b005fc06d5ee210b61f92c6267e9cf46efc41b55d37b800f2a619c2c2bc255052399650e2a5a8b1f2818fef77d1ade04b052d45295a6b561d92455efc1981e3260cc568f25a496a164013bf83ab9ba1b17df021668be876f9b61a194cdb92a731269fff309ee834e8563d5ebcde36b8f801bc300c2c1140cbdc12fc28e978889f12dc25299acbd37b8fca11effa843e0b72cf0b0cd474e678844ac4a41aa39b4d6a0d4f43a0bc05c4034134e14ac7444bbd301677a2b10837d4e24cd467058d47aa21cfec762bdb72794a0a2bc0143b90596fb4a0ef9e67afccb35bec6c54f25aaf8d4edf6d2d1e73f3cc18eddc61cfc89ba29bcd1f5aaaaae0952e79f042a58ad68628d515d2a6ed0e9b10e5a42736b3172dad43e4659fcdffe275750c9be96506a066e6d1d839c255446991457248e3597dda864b4f00176959fc0f3a7c6f1bcc672f2b0ccd4a5ccd46ecdb3b9a63a05a85beff49e8f88e98d3890349f92207d338e1337b34472e09a0b098cb43c9c9a034882dd34d893a364f65131a07a2f5da74f592834db75a9b3066030ec30f5f28ce8bf08af571ff4c47e8af12c6196c85b0975f88a3f089143e835b7a1879ec3443460d62b2b60915b88ba0791c6475388f47c398d026d3ab1ee8dce226203e9fb13820fec0fcb9b34f82e16e60a8efc192e0c381a1417306bce978eb8d05e958931c9aa533e8d0116f32e0cbe982b0e6fff77e19ed904fd2ecede624924e8bff0545de88763d4decadb6b07dd6115e9d402b999da3ce19a66317c02215914d15bd016d5cc13e674c27a7d0e2221cbbbccb0092031b42d52749212c297ecf6c4ee983f48ec0756a318aa168b934838d3c3324a0d2498ba3206a7cf8fe2dd13a9a5c29cff5c905caa9469760c80739a75f67f28cd02299e57f46b8623484cb00cbf6859a4298e5117f1cc41a61d1943199dbdeeeef45040870d5d3aa48763433f2370b0cd2a52c4bcf9440c55f3492e2e65f3914b0b380a655cdcd48d49608c64d981a47de3933385535bff5952d9376b4287d3ead35b307663c79d71bb4c007e68fa298c080ae047064b2f636c189278a4bb97784de29675ad1d8042baa85a23f810b601dab69161cf493108bcf7f6a1f67c397db571cdd169caec777dcdda34abfabf6ea70beacb82593c7f680a58f8a09e988f845616d2a7ea2a15bb166d04c1d32ded1ddc3be2562f6c252a7e49de157a2482a4ae92715ea1461a3a0159a990fcb344c37ff81bb0998100252ed801d8b98b067d53d11801145e7a6300e104ebe01405445f37ffe7856b66ce4ca3ef3838e0d6439df1a4e86fe767fd16fdceaa0d20c74fe91f3bcbfe7078fb3cbc7a67e61b6ebc8044cbe1a72fe2f7015aa71bc464cc078b630038a555d985dd73c2ad80e4ca6bd372829564690c857f14f3671d7f4737d7ff5367ec68198a1569f563859f5c60b7443980cc1eca7e4a0419a6ac875bfc598fb890cedf31f430ceb416d344b7eb007ce3eb9c8483faa824c7313b84269850ce88471b05838889064ca57c31ac480678f38f3d94c14718995aed836bbb72986dad40dfe4a65a24f2da03fc25042a6157a95a30d815271df1a9248c74b1cddde5f6e2a8e6ba65edffe82edb4892c5790a2d1d4de854167a7c90fa12714c2f6e57e904a07904ec884081213bc56c66429fcb8f0660d4baf7a451d822a6ced5476bdbdbb61142c82664ef2df70e5c0acb0a680aa44ffa19defe76eeb3fb7cd3cc96d0e74806897e589f475bd55a0e5b49cdfda846f490ca54327d6693e964f2ccd8fc99407307fcdc79d6a51e587b2f0af583e092252c968c138aa9a43de5db8ef2713f7db7441a556b62cd1699b3c3c3e289f9c9c0cf8f063210f343b2dcb5d7dc6f246b4ddb4d1876bf1dc65dfb4c4bebbad6b49efd997ebfd2533ab47387d96e4f43ae3b636283b4414afaf6c990be5dfbec35d35fdc4d18a6530fb3e75ef1ebbe8461a4dfbfb4f697d52c69c3dcc8eb42a6c8403991647cf6299ff6d3c71de5db6efabc97beeea34f74d2177a0cc5560aa9a5b4565219625c99819f1f0dc4fc34bd01249555faa6efe354865da67b718a9e647fffb2bfa7bfda4918b65d3b8cbbb5daed8772ed3bddf4dd8f3e12d54894462f5c6bb3c3eeed33fcd27ec23052ab6297e95dabb3528652ae7b9209d7d488ec4b58dbba90e53c91e88b2dda212d405ba347b38436cbd60c3404a1826290cc913b4a3eee337cde515fe8299fe9324a285f8a9e4895862fb65264a0f0f8087991a0eb22080a1a81b5f7a2503f088a404890b5f7a2503f08364a173af71a138a0a78b225148e3bd1c87daca9924028b3e2ca7cc7a23964b1240e6d3343160d59b8b39ee4b8d039cf74ef332d1b02b283cc7d1b727517322513e9d3208c865d349443287353dcce618ca57470efbec3fbe931e442691f289b18f787931a55ca956a94777fa1bc8b13e58d5f29efde694ff94ccbce16946b32a77be7beee9c0e1947f94bc651304cc71ed65d068ed3e217ca5330eca461da9dfbabe3ba9317fa4ab8a686f49ad125cd0dce4e689433495f6c09098a693d1283a7eba2eb64b4b16449cc85424ae1b6a3bed3657cde51bed2492926ce76295f6c914cae26ae26381abfcc0cfcfc6820b6b5f7a2502c6bea80f47bbbf79a93c52e53d7e1549f8ba6eddd5fdbbbf73b0cd3e14aef7e3acc2bbdf3be9d708aceacab190f8943dba474a4fcf457ca4f18a6d387999ef23a1d05c34a3fe118327dde4b5fca9aeea55ea5772fa5ec7778377d47f7d2a7c384e3f44a385aef761f8de109f974fd1095b1d8be96acb985bc6ca150e157dc0cdfe9a8cfbb8c0fe5a42fe5a510377a7767f8620bf5c5968c2fb648251cb345e6ecc470cc98a99a583af9f991959be2ce4cc167e0e74703ac19ca40cccf9c2d76ce392de5b6a3fcf49a947bdc86537d199f69e9b8489f993bbdfbebd47da615aeae1637660ec498e832f37c8fe862f366a79d38b4f1a7a35e8ee8d29fa7400c65202dba0615dcd3bd7337dd3ee52a1db61da58461a5a7749d0cda60eb64f8e55d0686a5600fc350f009cbe86497b1291ddcb7bf381c67865fa6973009d7d4dcd7885ee39d7bcde8db4bd36efbbad0c813dd98fb0394f568c86b8484db970fa515794e94cf3fe5d38ef2653f7ddb475fe9a42f65ea2ef26228555b285f6c9dbed81a7db165127db1d5c5cc16a984c7496318895df49d8c19dcf0ae061257240e3102c547d9f203b78a2bb3f10f6cc59597178016ae7c877e48d5f3105ba45b207ddaa7407888ad9a1aeddb6bb297de3855b18bf498ede767ccb46444bf9f8f3ab4dbbf2c86e9347e6537615809cb88601b96d191317dbbf6995608e6a923633ae9abd922c2291da56f4ff545b7f6a2dbcf6f2f7dbbd9e7bbd297ea974ebae84be9289df454e35709c716e9a2df7b114e354eed4891020f4ee06447e9262ca3f312bd84613a2f7bd161dab7ef109d034a20e1890b68685a220ccb6e2c7d243cfa745ca2675f4ad3b62f25c23535a1d774afd9aebdc67b0df71afbecb1b5512153356f3fee9345640ecd4d6cd9d8ca7e4cd5fca4204933b33922ba947cb8a23126ad953597559248b0649784e879a29914095aafb821cbdec8228d43959c9a9996906575958078c3ccf017a03daedce0862c1edd129b7559837af2451799c562b1589946a94a5c913ff97451e5345d4e1f0e47e8014fab93dee9935538a20a39ad6e7a13264f70c3049ed6e91fac04318b214a5a76dac027a8a5332f714a0753e9a6cf64d267f2fd4c1e7d268b3e93439fc9de6772f799cc7d266f9fc9f63359fb4cce3e93eb676025c88410d43abd0434c2a0a48582f279b1c13b1285bc8edbec923caf61f19dbea6b1a2a06058095a51a54b5d81e8ec0c51d5f79ec3b3c4a851176eec398305573ec7c7160c4fcc22c9933c9fa387667122cf4320bac4aca5663847573c4fb36f2f8e9117aeec9f79d3459530fee40cdbd0d4e8a4224a33d1a45f77c9bd7bd7494f7bd7c54945b4a3d402cf3ad194807dbdf172afe86691cda2edf6bbdb760f257a2612fde2f08a3ec2212a775ff82cbf98c3d71cb877b7a11ba125fab65f9fbd5a955dc3ae2de85a8c03bf3498612737ac91b3d7a89fcc3294837db5e1fd667827d477950f9c1bee8752da2c6fb3c84c4a8baff59e33cfc69ca2077308e62035d71f2f097349ccfdb03f06c495c9720016b0c1d9ad7883767b613030080c0b813568823c4f6337bc12e8e6d44bbbbdc5b058869686532e6d66a69544fbe254e510cab2932909d3030d59b68087c7933c234b18b178354b2a521b53ce796f63db51074dc3b012b4aad0c5709e74b13b635629cd689665d9a946c4cd88c0a17999aa3ee5d9999167a785fc08d260cd3020ec3c519329f6a6c5d120fd15375ce5db60f78c46c5aee675b16b25907a5601c306701557faddb11a675927c4aca43102945393b29364c9901b213e3f82c0accacab31764d5b07142d59a932787489aec5dcfc62c91d56ca12d1db4b59a2a6a69dcd16c6896987b88c151e4c5460e14ea07c1d5aa8bce15f3c1751dd73dc41479b19143ce6957d765a74a4619623e9a25b4425e2e986649913435437a88e9e1e57ac1bc62ae18ce1671b55a1d86c68ae58ae1e1a3c60b1874151b66a3507395a3596068ac58ae181e3e6abc445a83c62a7a34583456ab154d0b2abda71936d21ce3ca6b344b7871a81c7c71bd7ab061754f36a8fcde19570554a974028971a3125dfaa5db565cd7719dc3c5b259d1a811dba28cb83d344b687bd878c111f323082c87cb7a396c34d8e2613b4fd6060e1b2f3796090f2bba34901cf25324c80f2137384790c07a2889e1e1831557807e04f9010403e2e142175552dd16635d276d78c4f49034f2864804830fa0dcffd16d9ccc71bd9aa55fc0d249906149eece85b4d08dfad260a31a943e70ef1e72f7ded13a49f5fdd436a359c2f853eb411aed57346a744bf40250184836aec6f0a033e28a6cd06bf0d9edd7e125bc73ef66e806d71cf57c34d87fbd77ed5ea4d5d60d5f1be98ec6c566511207896788376cd886384f6933959ecbf203bd3c4d9d81d7f2b8c71c230bf7d07eebece779d693527ad6fbe6799e77ee0b676c0dddf02c8b7cb8bdf33e9abbedd3b66bdb69839a77db2cdbfb1e0e376c716c508b59d34e3ba44376972be64d8cdb03c73498fd93c2ed87f127025523ba1fe2533bc46bef3c731ce5c4167ba459ea61eaadbd17853aaa491399a4c12a711aacb7b3451e69547d9548ecb5a87b14f81588caac1ca27245e57aed8b1905ae583c3eb9c678882d98a9aa625ca9a4c1fa0ccb9d06eb27852ba7ac4d38ddc88356e220f105e20df3d3621c110a793ee4f2f4a1691c71a50c37bcf9d6e89621ded2eebdf7765d4a323379a770c3e8130407bda49138b4bc41d2c8badddd6dfae28692c607874facf206f99b53cd4906f2071d0653b001142d450a72761a5996652846e415dc20d3537a148b434343938216b5414f2fcd810e4c34410c5d48c10bc400a345a3c8947699524a293d856e509397b36cc615395469400e6da091c525648f61b42267437c51051429a8428f0a8030040539fb8a358427677f3122673d446021672f856e64b11e1c81232160082264fa1bba416f2290f4a8c8e189460e67e44c256736e42c873472868224c09cdda2a0276747d9e4ec6f96cca6670814e4ec2356a6032a9a082253c0135114ba9145a146a60f152144cf8c9cdd339249968e4e11c418999e531142103b310959258a205240809cdd460186abc5584d105a90f5d414c139ab91b32ccbb2b39aa53ebac45c4f2917997edacc467616bdb3e50718b2e8c1177e983831452b83226755d080660753f8020c9d24b4b22539ab020956e4ec349a45cb599665d96807379663de71b133bc78b4f79e5033ac56356dc990aa0448f361013da19e68925920b23062064dd505828b18f445391114041a9bae77b64414bc40664dd3b4d3207c11842733d35059eb398112596341ab5efba34bcc5a56c49156c53c8125485a1573682f0a8922f754837278df1141bd44aa3dab59560f20834bca91878b2105f0220603d0c2f572e4e12227c9ed72e4e12249017eae8c1c79b8904245836b73e4e1a209aa2cae28471e2ea4001ee16639f270d185ca095c7ca1251f01345531d397f6420a99e6d873040ec5e962086eec0102498e3d401891b721c71e1300753c59a2c0f86329cd33356dfd992ad9627dfac90a77d0a499a40b00f1939f34283f693a30834c1f76900ea52a903a48faf8045dc004364b08a50f95ed65593f6995fcfc3a2805d75adad59fd962ab882af92b9c3801284b2a04fdcc96d8720214647de28a9ca1226d00c1556356835658a10609e5809a856679ee8ba0661965f90ea743d22df2c80f67827086d70a2f69b4a60f92d84e93243f4e0421cb276450b384bd24cb870d463d92e5659d42969776489697960a4b45db6021b5f0e9427ee15333443eb1ca611fe138eb0364e346e39721cd626f6c911b7b636fec8dbdb145ec8dcdb13b56490ee993e5b9d08dc638ea14341acda6fefc6ca11b5d8f344bcda93b35a7e6d49c9cd9125b3b4a787c6aac8769433726860123ba00e0e7a626cf7469b2836c6caa1a871588c70d9ed9626353257fdb07757d5041d9e736e1b13e1ccd7dae3f3eb21e4e9ef8110426a483105d3c10ad903d309338c2c429ba45a6817e92a6c11a9a2136f2ed4474f1403d9039c693ec236e91a9cf159ee4e863852d72687d7cb6f8c9d6a759a2cf15ac681612901b7d8c009467c8910a3168b20c51a04f9329f6000dede08189533be489c31c62f6c147dc22630fc42d1a89db3c3434b9af10db014dde22d74f1291370dde1829522409ce9128c0901b89f5c9c9d9d949d248942cf16162254f83f230e878bea027490c1189e14e2a633c2af5f80331e4e9cdeed460ac8127db49170d368bc4a913d56205c6624e6c036e0f4d1557b493a8ea8709c832f718bd85c9823c51d060c8bd0a23f7971869b01f672a82368c1134ca7d181905d0184e40d9438382ecc51772a53396819a259c4672374b7711841c71c88a0fc137d8a780912e3418b97b8cdcd12587987f40c5157a525c918fb345c3332da94d19144a1c197b8a6e1cc24dbdb6db6f384efba55ef6da2dd6709099e7e35313ebe85686230eedad8844c99e55d65a7b061157625a637615bb553a5bc64e947a79adec342f917934935996c52aaa2a204a7e5bc7d1d99ce4a2260a81c82f9c91e3b3500e5e68c38d2cdbb8f285b44a9c5c6bf5116333c680c46b73688e0be53033e56e846883f15d77e3dab822bfd0bb9103cd368a3a11271289449b4824125991481365a24a4553d42229baa1b6654207e4071d6e9e77d103c921e6781e628b5ef2f85e1f8c18b7c7c3f80324440b1720413daae2251039595681849decb595fdf0ad842c71b89a715483a89924c6a03b73fc0cdda89a0dba33b4430fc9d95f6237118c394630d59d7b97b7cf005914c5851bc626303dccb709721afc4f13458a18094216326d5ae9875570c3991cbb71634ce9aa473a6822884c7118794ec793a2c65092572231dce77005529ce77972b4aa51524ca49208273b59d2c7fd7a5493dddaa4cf5e633f7ae314c52e92f6793fd39ad9b5bf320dc3742e86d98f0edb9e5d510e8943db68cfaea3bde257f6118689bceedc76ab3d7b66394fdbba5006d469419f3c49e10923908c138acd913ba3fbd347bafd52dda62fd5da97ea6c33b99ab89ac8202020a01e69f1ea2d5a8cdb0f59150810d00fb3abcdbad61ad2b9571d2ac35dfb0764ee7b9cd231bafd0eeeda65745edab9cbd88f2ea3f3e2aee154cb8c6e71aa239008e20f21d16566ae08398434811c01a55ca6d2f6d7e8dbeb372ed53cc4d6a8d5de0f201a6e0cd6de8b42fd2048234392439b5d9f382f456688916232625e4cdadc948e3a9df4a13ce513ddfb42efbe7bee1b75cacb6c9145705c1966ad563a622cc678d0e18a2b73ce3963766b310f40329c6aaef4d36b4c4739c5a9c62e6edbba14ae54ea300ce5a6c34e2f95bafba5fa5d37a58d597d712a7b37c2a90c7bdfb68bbe947d77d1435f4a4777d15316efe82e4aedf01ebaf7d04cce707fb40c10a098a67c3af528dd63cb7b6c99be542d7da98a5d35f735a353981e427e4423576c47644457935db6b86e12ebdee91bef26f49d6cdf7491c6e99c50ece726d6a46f6c6868fa2674d15fba6f668ba88814e130fe28d13e9acf4b17d1377dd32de822fa265e30ff00a4def8a1e254db7881f911a45b9a8633591c25695347afe17eba992dd2364e1ee10d631a2c5bd97723d8ef5354f58c1b0dbbb6bee924ba88d73c681cb412d987fb4b7bf387c3b099968c4d9574d2431a049aaf466822cd32b3226da459ea90fbc596bc29822377244f8e92fbc956119c9c1d253cd927fbaa0d5da4735a49fb344eef74ac6fa66aaebc99ac4b4328994699151de5d34a1fe9a65166b78cc7498c931f4052020102fac1b4b5e8f735da4975db4aa34fd1b7bf441bd660573412e1687d709234362938397207f5d99f3eed29a3934a753b95eeddecb9d7681fdd6ddb4efabc3d75ff6a3761d8e81a9631c9a4bc64b5cba0dc3ebc2b199d17eaf73232ce7df4c9a07e9ff2c1745e28144ee9189d7baabffdde6ff81e86721998fb08cbe8bc4cdf2e83f2d139946f9fe9a3efd6c3d88f0ea37dbbbd8ed1ada69d3e9dfa6ef4d2b7d2a8f4eda4a75edb49df768c4678c7f6d14730edf7b1451a7da5ed2361ea1a5121d2a6484e698676e7822eaa507ab984d2f7982d324e23bd07572cd4c75dc6d73de543f9fd4cb75faa6ea72f551f4a652f7d4b94528a83524a51534529a594d24829a5946625d26b45a174ef122551fa55a9547abfd47587a19ca3b4eb3eee4b357e7ffb4c4bd3629a45667a1e37d248b7a4f8a08f4fa296b58bde94cefd553a87613a5dc2a97afcb2ef308c746b755cf7289f8c8ecc09a7babbe99321754f55d2b9a75ea47327e1780ea72ae621b62eaee941efd18be8b72e34a254f260a193fd05bd7c119a3c67509e4ea69db13c451867f4893e7724d752c293a74f9e9e2c325b66d054cdd9c4499e4524cedca1b8831a6806379c3bdbbc22a88a08d4134e27363c441e160fe6cedc993d789e3ca078eecc9daec1bd84b7c84ee835dc453b9ab5386c9a5463978753edfdb5ddc31b27c21268aa66ccf327679b2d5e1325b365eecc6edaed93adb933adbd77a7795a49fb28992df701dbc3f6699eed8bad0edd706defe6ce74622a993ff38a3c67153dd349c7162d21ea20a01db225c2b09956037dd3e666e27411ee9c4c9a25ec2e0228dfe91b9df4d7e824f0de843f55364e95bc992d323af332a48f2e53fabd7d0da574903efa8bf4d1c4afd22fbe53652f7bfec754d1897f78915e3a0fb1d50316838148b8f4b9a68a9ef48d7e1fc6d8c453c695b8321fa76af4f5177a5c0e1b4702149863e4d0b756a29d3ec66791a9768d6aef6f9f0f2dea6f13e1d40ea2cbe720c2b1c14dbe747fa16f5fe8338481b293af8b741291652ad14a9c14913c3eb14ce9c4892bf41d96390dd27358e2b492cdbbb36b1a4c20bbbbbbbbbbbbbbbbbb5b7677db8bea6f49109bab17128936d971b6a6e6f6a5e67cd7ddc3b0d0bbc33ce9356d7920b0d57bf7852ee2ecf62d13e14f76dc66cb4099306bad5ad4773f0d6e91ab3671e85e8e07d4a9cce0662fd246fa488ce6c5f5b1cae10766c255eede5de6ccda7de2d05ed4bb87e04d7409e52ac5edbcc3f4a13bfbf61cb2778dc3794e6a9f30dfbcac974344962e2282f5b58b7c98d9625bf5ffc47d1357ea43f76e441209e170fbdcae3d9cf7f09d1f6afbdceec3fca9c13aab7d2825f76aad943951552f71c87da806ebbb5a67d7dd13964570779106ebb57ac366a23613b9be999038f4ebb970c32ec2a2d22c757ece39a7176b6863c53ef44e280a1ac11f4184fc90427e48ef2fed7a892ef337c796ee947b188f9029f707704b8cce7d36b6157af7d508c16a856e635ba38732485ba0f7d116987d555f57347c61dc9adac18633d9e2983f32dcdac9195b52d1129ee8a1bf44384e5508a7ec438fadd7a74afb08a76ce83b460f61191d9911aeb161b5ba0b615bdc778444b8665e08dbea1e5b1e76bd7c39aae85b3542dc568c090863121610862203c25845a6bfb305e647e2e6a1b75fa4d69334190aee0bee15fd35bae8f222d14f18069b91f2a5d24f1806bb33a4df4b895ff7270c83cdd819aead10dd4dd3f8c1c34402cd1a1bdc340dd2110eae8ca3340b77da9d5e2a992d293ccdc2a45942a740d1a5e485c8f2d2a01514658a61d1448b08441095f2c596e94727c5ad398c403274e3be93e2663f82d450c4ed3cc369787dd83499c62f9a88c211b01006115f006ad1d3f0499b4f0060dc27cd92d96878862f5632dc50dad8d4e98cd3194e25ce8c2fa5fda92fa5e11f5ea9cf380fb13503c32e4e3db66678f8149ef1451a3ec3e50c34c8af741a3e199fe1433d86487fe9b8a21df5c9f8a44dabe869fb1c9146a8cffd2493d0279334d8207d0acae8933c9fb459c2f45367c212d0b27c04a81722486f634ec99ccc268925d08659ab06c15879f566d4dd4d273fa7cc892bf311cb9d06230f8e1fd927cbf679992371f0e28a892d8748225922f9b6772a49dcbef797e80244e6eef3f9cbd9261a8d46229168f4eddaa7e592c9f4fb1da5d26fe932285f4afef4d8227d2989533a4847f98efb139639fd1e05cbe8bc4ef85e86f4d8eab24fcbda2512890359d3aaf921448ca08efcf8ec072b7d2fae982fb644210dcb1c9b371ddc0a06d7b605940830b8f9b1a146534a299594de076aada596524a297e5981ac06a72b8c44c861244296407f3ed62c210ba6074ae99663cf12262cb511e7ce6740e858a64db46850cb6d93a495f4cee5473b3f3932269bcc16dba26f9be8a265fa1e22b2c03448b7e89698a9a27247f2cc16ee07faa2696a32c5400fc9b49443885e8a6bf397d2d1ede84ec23542bca5935d473bf7fbd40eeef7dc2fae21fdbef4e9a476e8db374ee9307bc2589283344e499be812caf47208a594def9d5a01bf64e2b992da553d3e99ba777327d67fa52db675aa52fb5e11f5ea59bce436c99300cc433ad9055c23a1d82a6aff4d100c38d2daed59deb1b7a243649a64b32bdc1992dd6de4b7f3fd27782d11830cdd243440cf490fb23b5904d1aa4177d92678786505bb48a9e760dcd939f2f32a5b28b4cfbd3b2b599f4c556e672b0b971dbc4151ddc8a5d158cdb8f65ddc5baa8427ff821c8cdf24066196872109bb3937e1fca941ea477c1348823bad8d3eb105950f4acc8928a200522c7a0adfb81c082e0e689551ae4bed1bd4f14fa40d64f4d5cee5c7d78999abfd3fb8bbbf7790fc374267e79bf1816a7273bcf4fcb327423a523f4d15f211ca76a845f9faaec33845753458f23aed07bdfa78abefb5834a54304b79eabe1a6f1a776bdc110c4f0931590e310ba004556a7bc46e965f6507ec391f6a53c8739eece7338dc3ecbc50064798e468a71acb8707978f4f07129b970c3f81379785cba1379e4b51c7ba0c8228777053702653f6861cd29d2826cf1405bf52f1d2324bac8cf8b20f6704d5304371408892b93155d4279561c2382084ed7d67329ae5fccb985161db1d08105686a9db3d67a591bcc76b3a19da15b35cb74e9af441c62bc2114b78883a4efc6e100b27c78036a0000c061cdf2214aeeb8d26f2d6e189b8820e24043ded0ef5f20b6b060a20b6509c30b510b395221776c61916608bfdc8f724e29e7074a1c06106f90af3400904359664ef89899899cac3bf372f6f8653bcc07913ae8e2bbb3ac3d309bc956cd128a38ac5bc5f2f7e44597ea925db6962d146e189b6020ba3421cbb3a6aa87980b441c5e30d1a5de47f2842c1044e6791f335319ca81c6184331c31ffdece7810dc6b366cbed97c4a1c61be2258f96e3c3d8042666d0c5568d7c8c57e9d67b6096090b2cbfb3de5213216ffb96e60909db431ac9939ab860e931a3138a438778c3fcc42c23b05e592fb86174d2835a7befa39356d95a71443de8bad8639ece5833ed2079c64fd3deefb2ac434a2badd92773d5c1cbd9bbfe428d6adaa95671d75f988591ce9a793674233e76ee7e16c3997bebf8b067e7b066cba4b392529a6913d3ec21a594ee44eb7516636a06a81c1f67a593d619638b26a594dad43cdb2c61bc8c93ce39e7ec8e0b5aa0546a418a49062d68215a21597e5a1a032dcc89238ef25352e9a493bdd560c5799b25c6497134d88f361a6c1afd15adda0fae0d2058b38cc2e0aa3cd3ea0ceaa4d32c3dddebd9d922a3aa3e461a7d5e5ec6b85e965846907a1bb789626b53cc0210714111d900446e28c71e17d428e17239f6204186fc9ba172d68344177296654560308a9ba98aa018ee28c71e247e4023dc9b630f1231247cae82044e0ebfaa2790544a2ae795d3e6d974d22a86541837a4d9569b9d5a39a2b2fa7431c618230ebf1c278d94ce397bce49bb637777ce6194360a3244dd21ae7cc7d67ec0dcb4717ee243b905503f8632a8e7082472d8345dd3437213c91da3a1a109a29b8432890872b408430c2ab0410f6243c8a1f4d9410e654c62d1319913ebe8a40540c8a28e4f72d7cc9c808830960862084bc08101931cca224608914389238fe48eabd9e24310648083253b4fb65085560b213721db196b42104f8c410b1e317e5a3d45ee5f9cece54682152a4600c1003f99126122532264c8f43674838239461c0c90b96ba11b5c4619b182fce5ed59e8c6c6534365468352e786a8972b9ab42afeb42a66ea04045a5d11c4a26955cc4ab069d56c41a1622d6092eded9b25a4ff28fd8cdb90e2db9843546e154185ac69a7a59f9c653c4520e9236ed8b19f1690868606081e1a1a3b5bfae7e7a68b4c234f27a42e58790576e1ca10e544e264c9495114f6ca1863dd682127e0450d4ce0042a827002103d4e94411453f8a6894c4f8375a2072567286591e98d0d5880844c8f0adda07726891b90a10c487821451450340f144540913296b08230327d4a8480154f38a2022504f2618cc1586b2d8ceb158b7fb960228d1a8df1f33dc4263e31c618e3a682ac09b3091fa8481423dcb630ae9cc748f923251631461a638cf81469157725c4adb13d7b26d1c959653fac92892b1fb1684a29a594524a69a59452dab19e2554fc4049cc162bd151634716d4fd4e344b89c32c561da02eaaa88c9260439e3f9805716b27133058b58cb3e7258e9f0ae8c5157a0a647f5149bce8327f85ae4f01f0b933f245e9e0cab7066ed7168951d4663c7d7170e5e365164839f6576badb931ea92727833496679f9cc8594e76d6c91a48c73e5a3ca6c25745165e200274f7ff28bbbcad6de3b43301603820f9cb83b477cea1463c874708489c9cf33450bace8eea69466b5577727c623d6c3478cbe6009cd6685c4b559ce9d314615f4102aa707c6cda1bd3f3589631aeca15dbb0f7d1e0dcec693ca39e59453ce4b1cf6889973db68f3e83135ec9a314d9afcc4f468c2c34793263051a820df0cd44595f06e3d37dec881916e8903144f1cb9993f11078e1c4bf29c3c730a2249b6b879d6501a2bf21444bac8da125411f2c431ada5d1e012f6abd962f1276d7b848a1f1b6a4829aba4524ada5236c1d3b35b543ac618e3a3c4df887059f3190d54661744e4f4e2662339311be4a9a494524a29b5d6524b29a594ca15488f70795e6ce0c841a9b53725c79e2558b841ac0875b670349e4e94c3a756d5c7305cfad076f40341672b23cfa3c41b503d327dd5e8274a5c49a963a044707e86700399be5a8066fb6dc3a7b8321fa2783ee4792e8227587e11661553d639e794724e29a7aca11b92ce1ccdd2b3e79c731291854b26aba856c898f4913e32267d60af4019963e71a51e003cb8dbedb577f64bedc09c2af53a890a52b841196a603ae11236b265bfa38629705a4038a086a755821aa6c069592c839aaa6aa7aad630058e9d42078253e5801a9e96c51f0d2f50997d5631a2a422d8cf6c1ad44595b0d264da302b1aa48ff93448e792e812338d5d6be9ec209a0eea201a1e164b071949b89904b61dce9b36d3264ecec4f521d833dbac26b38c7e4183324c812850a6ef9d69edbdf3872aa1c8d4c79b3eddf4e927dd12c21d9b35dd90da759ef499dc073355f4351c71a1d8bcf8dae17ed238b62a9c357348a6dd1de4136b42df1d343b1ac213e7389c4428928963278e3671b28933a5c8f491dad4bad32db932ff40e9251d22aae88bc834894b95c8f41587a84c73ba90e589a94d5ca19f5c1177d263267786120a9c4c3f71664b131155f447e4c4c0064ada2674a3876472c68c8a26964bdac6da7b51a89634422a8de905b4b9276eaf4212e85ca3cf3d71b5980b26ba94327d0f99e6ba7c0d5fdc17fbe1c81eb7e87dc3dd8e6e7b5703127706ad794c00bd10b6c686d5daf01755f442d8d60d2b35e4edadc4a79095b8c6d6c5c5f71e0d43bd6733e4a641b06d6e6ca88fe842730fd17ac81c92da214b452a71673645245132809be8c283835c95c835895cdb87c329b9e18dc3323aafd0b9cb78dfbe830b9df3bc875216bf369cb2dfb8879e7a710f9debcec9fa1a90b832f4e1a896082f727df7b54d6f32c8620964a3c4460229b119722381b61c1b4cd5b7cd270c44a14cf631f10a64693736077da4bb69cfee96565861450e591a62d20994859f5a4317eeaa4392c644972fd3f7882e2497d9b6e3fadb2605e9690d5f5c170ee2dae7a05fb1bacf292ffa4ccb1b8930ec7e34d36a199dd7fde832a48b2e733fa29d6374993f19882afa3801c0832b3ae9323342291da48bbee37ea44374d277884ec2309d1dd20a3be0e2062fa0a16991f09daa968e9c4662cb0be11da593b08c8e8ce8252c33ba5f6c75a21cd1a553de67b28747df2a4774e94c65e69eb85a5c999d3d9c23aed05beef3eea98b9b61f0ab22973ff50b72460e929d9c06737696d41c6a9454a0c9a1a4024dd67a882e33d3675996512a8f9044642a83c840f33386259206692c94e1304621d37758823c710f394d7bd29eb427fd86855bf151e04fd735721a046bf491adfa4e466a73844597104e7419407499b9be91ecc0a20bcd0258c2cd00b073654ed114c52eeedeeb87705fe37c9d33557513e3f60d8e146e289db48d932adae64b7243e9244ea18323b9737de7c4313861840b4b2801c517805a7d443a914e52605c0d770e1ec2adb48b066be3cc961cefa1eff01ec232ddb94e86bb875316df06e736c5d5b004c2d24983f5b80877c2d480c455d5fa6ef694dd54442986c595fa9211892ab5b6760521503124f4840655e8a20a08be0630dc50f2f0742f3ca28b448991690c43a6d18b4c1faf90e9398d4a9ed992b2b4ebcedd5afce2be61d8760ea7ec630bc6bdc3298b6d8b6e53dc8aa5120de322dc50eeb4f66672b51c2fb9d76aaa68c6e4d21c99dc28a5ec2ad2308fb8428f852b314824d2189dc2912194083231b129c1e0081f538e3d4b96a084114422a571efbdac958bd2d31a4b9ac8deb54a744055634224887e712bada75bf670db28addfb66b1bddb62daae86128add46a543bd55e1aa477f9c034cb8b521bcd224fa190020d6f96415759d1a55b624b8cac0b4417fa18558dbae25611df80d8e29aaa992cfbae596bad36f6d859638d353eca1669f871657ef20702ab42f0f9810abaa88223bacc56b7b8af1475b839f440a6b2d5511129ae4452a68d6f5cb93adc4c7f587b5936bae5029dbcaa32ca31267b8e115d648e4d5c54c84c0306c61583b9f75e18d72be67ac1b85e30ac55ccd535ba67ffd8c8227ee479d8c82e71ccd7a3c196f23c7ac4f9f81ecd127177ecd851bb7da77d3d627834d83c9a45daf77b584dc6f0e8d119c681590df6bf9706adb0c28a1cdd3de2974c91c3db3fb8a1cd194d271f35d20580501271ac001d820c60a045567d2ceadd034518446826788191eeeeeeeea63dbb9b3261c2c4a7079f263e384a39f62c319243544f7592592a8c484204303ca9f72ddd979d861abac171b53ed380c9cebd725cf6ec3e7030cdc2d5d75aeb39bc7d309febd560cd7e3badeb05f39cadb8706bbc6aed898248ceea911bdaf823457df7f282ef6db63be77d355a555970fbe14aae7498fdfe61766d2c2348bfaa24c8fd4af30441e719a748fb4bd355c7d16870fb3e55f516b5c44b532f6eb8ca3514325373ca6ccaf53d82748ba8de064eaebd53a35922cf929c5cebcf92277218bb90118b5c3fe9aa59263dcdec8c08223c8944c8f133a24bccf2973474a3b69438e8434dd3341ccda2e16e1c0dea109365966326571b3824061b6c9ea661a359ba098d1e2880624ddc7e54e95ad34515ce4991b8420fd420ed2f32d56692a964ee34487170399ce812caa3df67f473e77ead440060dc89a495a4e44b13091039464ae2cb934a1876b19d2aedb0119e69350e9be7c6fb911d7d8461a393704ccd9e58f2ccb42c0ebdfd3b676862dbc9eef9d9fbd15ff7a36b3a0a86dd9b1ae5a37b6bdff7afd1efe8250c5b8d7034dda27c2f5dfa8bf41289849a2aad278cf4128e5355fae88dbae0fb46dbb8e38a761957343b5517a859681660ec9b21779374644b2b99aaedfd2e64e38624301f7ae82fed63d5d1c073650ed10fc19138589c9e1e239de6cd39499ff6d117e7d612ef207d8465644aa35f1c5bb195ea1da4df7b1930dbefb8279d84654cf8e2b7ec6db9433bb774424316985802354849a49209e5f6d36442e9e429e5744af9c5d7963eba45f9bd2d7df457e9238cf28b47275de6a67c32a593a8a4ac1775414c95a2190120002000c314002020100c870362f18040226b931f14000d83aa4e6e4c1ac9d32888614e216308318400000001181111d2b40920ba942a8cbde81c14c3fdea0a82824b6abf724bd5fff5abba7e36cd081f42841a3e8d589954911c46deff43d4a417d352a5d0bf67278edc51fbabef31ae69679b2f1dd7c53718eb4ee3afb8976666a8e4a974971f14e7bfdf38fbde0ca8c6dc55ec5d42fa48ad8d2ecca73c5f6996e2f723d936103f66e275c9145969712f4612c0b4531b223d07758f54d2fe9d5b254d19c99c68c975561f8a97eb15c2e93bec2a5bbd2d9fac9874f4cbf027ae16f95b9dc32c4f565a0d2dde3ea347a88ea53a6e693af227ab8074de3b2db55046dc750c71d88229e79b6ba4ccb7bf918896d0459cd1e659e21344a9c2c948c1f580b88168fd34359736516b624f824f43d4cbceaa5157c429c9d4203232548654acd9f60cf4d5077d4f4e1249fd985da0b1dca5d7b1915f5fb94fc274ae5616a5b25e6d5170303271e1b05d68bf326a82f8d260bbf471cbaf7a35e9025707ca0043f5fb7ab67a840b8b3263ecc7a7ddcd4ca2c30387d8b46b73f237b8df39c7a7e7683cff2cbcbb2193eee4b46756a84d1c2b465119c01182ea14d3cd3412a64fa67c286e7f82c3ef05221cea799a616fb80a57c5270400df974dea340696b8046bfadbb678cce68e7c8d00faa8552057e02b5fb713560ae861610cf83d2e4e6bf81943810214c7fd0402c44a772326ea421f35d8bb1800341d473566097ecf7143f5b041522aba2f3f8bca1d41f35ad19a653f799877d78ea3a01b13047cb28f6a8a34ecaed45ef33d6bf160c45298e1c6ce52a533d086fe5afa71844882ac39f71a41367c99d302a77f10f59b4bd36df93aa7b2d1552dbc1232add751559116803536225b4b0a121dba218946e5136d0e835a344bf0ba5a7ce6e16d03068bdb3a852a69785b99a7949d32f24b00937601115dbf53e1e5f7a7287eae0f4532a0d76323d926d91bfc7010afc08de1a571209d26f999481337e3352418b104402042636689f359abcf1d93235f48d5872853dc3f7f3ad2bd331c7cdc15c9d26996c706b6d20785c8e81f1f91cf58df09529a6e46d78a0955eed735b51fd8ddbb65e6aae25de354b86647473697135a38ab943b7235353d654ecb64608e63cb11a83e88a9c62b920735e21b7831b5c2f39f289cfded3b3d641d8e781679335c8a9079e768c77461e814e3e0021cc9f25738c7225091cf68dcb2006da4adb010fc4f8c0546d0e76c93b1b3224ecc30c4ff942c4781139cc82ff2293312b3bf47f2aefc7eae52618ec3c09fc1d3df7203bc0c850d1039b68cbddcea7fb8c622d6b9d9c07aab8a1e94e21dbda163626c5317278f0f06ca4ba80220e22ca74839e36d422158da641399e40921df24305e7e82ed435c376bb999e24e1260d285b6a889a0d7228a209187a20001d53b9d38256b37eb7b20a24fc8d251f69ccb4dcf071ea9432bf5f31467bf588e446c442d0a3fcac9456c150de2f062ac465c443a4b26f569e763cc131502652ff50963634a3b7297ed7edca438a27f163d318a37d428c664bf4e2f501236ec7c18c1d4c97aae59be2c689146c1d4d0d90e5552f8216bc9e2b6de2c813ad9c1b7fc487a7c1bc86c4d279e2870207f616f06022e5fd97eca0a0f0c05f5271b51f3d21e15cfb147bb692a72ed7acd5988deeda8b571b821aa63329dc7676b69b753e1e288a4263bd9221bbd1271b345f8a62c23ca5c946d31b0ac65ee7c057af86d8e3ae749202f030baa6ca2cb060cebcdb88593f0733d995bed518ad7b36225a57ae709c23847026329eceed3d0a0b680e29db470a3ac7ce5b80c0d368bc1a3993d949e9a83e1a4319b740b02e58ad6a0820ab7a017adb3d06d00c8ba74dc4ea33e52ebd244af9152de63303c1e2b38e0b66d317bf611b9fb039518c189f8db5f6a5502e2c9210746fba55065f4631a725041fed2511b0da29ec8373c15a5efa4bb7eba86802f5d5a1dc854bae79daf08254c837fc2b36db3ebe78d09d7950dfbe9a5405010ea4de4aa0807a1340e88284e10cb8d90a2f13935479c3f43df595b3440f2889b7f35d87b3356e3b162afe6b4927ec0ebe42392ec9fb999b4fcc2588912d430e4558d174f54bb361c4ff8ef4b163ec0e790f9dff1ed7c29cf8bc9e64f572ff7dd22eca03f609bab34fe18a4762c25593cd178674ea7b502874384956254f085b83fb3e2d7f7e318f08a01cf8b8c49f495ee913b6101418c659b00c640104ede37e2a3a4024733529d721d4003b5e5b786c29a7388450b3a641ac258ad9091b9bb5cff234c89b72c886b043c21cbddb5c6102d24264426ba7fbe73faf96e1dd2e69c50fcb430792c64a0e3ff061b0439e4c8a88794aaf6d299ee70f8fb3a79c779936d6fafa153a11be724991b0069a8fa52ecf46709a6c4435665917ec884383125606c7775c21a035430de4293ac57cbbda062ccfc23f546c2be6049383bd3f83964a411475d24fbd8c9e43a6712183b120f5009fb080eba7d0b0aa3ac2149a8229f3091a94a820c14219ed5f5914b32bf934fb7ac5f128218b94c128b2b691350239d536e907b74ac039f3f2e69dc721927668118607c1b68fc0ab47f85e79026b2ce30f14c29834ec3f14ce5fbe05d0f1e4e60c1d9a1ee42a79c41d659f2f24b0e1f82edfd56bbe680cacf94694a1760c3144333d55bc7f4d9529d5f8489e2350ef480b787f865293c5152fd9ef71c432a358a0829676949b0fbacc62b9b36f623f03ddffb1e3e91531ec8c128d54407a1e2b82880c465afa49d2fbf0fdf099a8b6807bb2f881ee22caa658f6ac1f1616f133d5ca35d2193abb8d4baac97bd1c4cfc3128866f8eafb35ca1ee82f2b005b8575bea9f27ec427885d50214f1fe6277d71b09b07130556a2cabf00ed30c9c20d0dd9fac0dd6696baf139e6c07ca531e1c8c6e1a3084b0e6e0d50ae7275a2e14140c8696734ef8fc243ed3bb27ec253e2366b99804ce1f90b094e00a5826500b1ec278068d9c5bc017c71c307331f2b332ecbea224bdaa14fa6357ab8b300d2dc81d97144029a9c1f87efd592fe367c51b3836c8ebc51fe6b8b85c123e6f92a9fd7f0dd62bcefe2b0f00a51c75250851df3e74ba4e678e5c49d88dacea588556380fce909cff8039b82d811e0585eeffc727834bd8b8dc6601573e8fbbfba51489b97f8a12d8fe4849761f6578df5ffb8cc4a5ec3a3cde9060385227f28411e8b282fb124558a600deed95789138c922928e4de8c03a82eff7fd4d05dc0501e400388efbd2b91920156622d7f214b60721ff5e1fd3f75e121ad75f76fef59fe249d860b505865d44e486c6114580aa86ab911ce832c155ddd186b5ba2279c00a40c89261e14c926b4490364d17d1559fdb6f79d73482d6b400d73fb05aa973a3fa096317964ade506c46db2aa910f91ae70267c83d62a701817aac49d2d8db3bab47cc7b6198bc75a327cfff3695f557dabd673448d45115a151138d2d23dc5a31788916aaf88f3ca1bfcfb1240e0c32ad0eb13dc1f5b6342a3090695c1a87c735bab6f26a0af94b57b5480d4c9b4e91935899a82c662457cf91a7616ff42d541ba3ea0d46724a4729dbe6f5a063af1fcd6708ca048152fdab2efc64e85f9c2f93054524e7a21a743ea9824712d23921a4a1302109b4783609a22ef39407ad727ce30a02ef619ce69d4886502ea8703104510f52d1d961f642d0212b0bc87d6833b8e34fb6f4cdd55aae01a63fa305fe141d7a6b20541e3054642392c0dea3984fb6f7b3a8deb36c1111eba7dfcddbee491bf7dcf1fb590aeab2716cd9993af260eabdf21e3323295a34bf5f9583f6ad63030ccc6e32a2025c429ae047640390374f01822fa23c72ce5a9dfbe386498e706069f4895cc518b49f9069d39b2587875200bdbc830372e4003d57ac6448bab4402224bce39b1d2268de6cfa0e1bef3232dcc66810fa447280227ba8c81694e1b55a060295b66735bec3b69929d90e8d51db54bfaf4008ea06e5f7eec487dcadd53cb657495bff8dbe03d74bad404af68385497799faba6eb2207b6a943a63b3f03c68c80f3275bc1a0bd332ad79416df200bbce6ec7c8551de0ba6939d0f932a171ce482f1de0fb926b94ef5685febe1610cc3edb4aff83805153de8ea2e9f9e5e332a9967feddbc29c5a00e17b75b7d59b2a6d53c249730a749b6540c870f18388f102b085e44bdb44889c2d956a70360395465bd0e34b40ab5c009f2896278258f705fd28c2f2596a79c10de9d6657336b44f658b390e4e4149bb3682dddd2b2fb48dab1750726bbe1a059bc60c0831589ac33f750ad1beca08f5cfcf0a407dd8c09b28fdd3d9ec31fbd5ab1fc54978bcf9e6a857bd794c7bdbb3a4e9298d07ec1c855ad8030b0520d42df0ab770317a3235f78d1281622604401195becbee5143bada08130deea7f2301e3b6172d7a8715e223bcf31645b27e0e558e5e5ebe610ec4a8b73ee667fba15728dd0e2234009a7ff9e6b96579a3d04fc84dbb5a277181fb379315dd0dd7d820afeb4cc69668a8690d493f3a54604f06fcb73e0dafa07befe56198d76bc7e67d47da62698b0f3b1047386e110e2b5d84da07ce4930f25bcd6ec27fb98c2c7e52f5a4e3922fcd05587c3fcf4649449b8fea7cd947df28f9da4f6506fafd229008bdcb101ff1ad4e0493eff08cf720dceb6852e5d40827881130e003c2ad9e54f15794eabae60b5a7d29075d40c7e9c264d7c5c426b00719a1ac3369c1fa29f1c89d192e1304542709ebfd8a15e724912936aa3cbb48ade181c70ae8b4635c3d604a9686e8432bfe909f6365c1ba7ca85fd3c424f9ccd91556dac0a137022b57cbd5615a189f8c4ac403204bbd61ddc4fe568aa1b24eee6676d8e1a50c4e4d3aed42f21d0b0aa73a806cfd3561657979d4c335be15f0579ef847107b0562dc126b454e39443267a441722ac106583e7e06dfbf9704290b659e9e11ec901f31b00dfaf26e5edec1341ee2bb3260a1872ae7b471307bb97c112be0bafc848de2b7e7860d62e517b6f7516b2c5f26493d6f7cc9f2de67c93e44214cb72c04d46277184c4fa5a31bce681153484768618cd68e147553953517ba55c0ea5867a4088e2d480d31ae67c9b6a3c6d6bc9e21a32c85d89a9d4733ec97e5390942daec9e6d357b2609a6c58f20a76b7e0040ca48d0bc2fcea5132e9ece05fbe4669e275c5cdc02de7398513c79190f3ea0d16410e7bec85e7b055beeec354deb090617b64c72f4075e5ce16e590b599ad61cd043b603f9085be0d6af7d586e7359016dfcf26e5e18abfc99b32e4915346d9b76309d25ee98f7da743adce963b25b7eabf7f976cbd9d1af9f2f46a287c8cb79ec0ea37861a60838c00d2ec566bccd4e812f0842d4db134ed77359df06959eceac428239e854052fdd86d14941c71bb9adc208551f39e3329769104e0c8eb24742735b828c2e2247d8d6453ebb881ae45ca8887521833b545886039302b9ac39ebae366307a4d9d9d3f4f40276d073282e3c51e5f510da1cfdeb6ceb0f45bdb38a64320810a8efd61e0527d6290adceecbd775d47ea2b8f51cf6d06b68516b2dc305f11b656f6c3b6d8da64d4c7741a2a6c056cb64713abf8bdccb655be03cf8292f271ec0e8a468391b4dbf66d975a8005c418b8a56bca370a448b59aa1b37294616ca10c59fc130d7187520dc90a6b6864d2b7432d4ac0e3a7c87853c8dacb90c9630d7c2272fa499214ba803da96f7aba412410cca108698f74e0b2513748833427eca73a3e79ca3c54c6451611367efabcdd872406d8d3b28abbd91ab70c0ce1542f4464e957a59993dbeb2518961ee07201170b1049a010c407c01d9643bc42948e676f14b6271a416e05cb140832cd7601a2906a16876605ddbf5228a00b78efaab6662889966d902bfa16467ca55db9c9dcbbf43fcf4ed74d7bad523288f494f1c3dab4e2422c0ac4fbfc7e7d8cfaed6f97981546c5171023e460c447414c1bb1fe1807374da41f78d4240c54885655ce55fd4429484da394f1f7949b0239512fd02c2ba92398bc4d7eefdd94fdcd14532eec727be4e5c7bad11381c7c2544a7d9b67a5826f11b1e4776aae6eb636c2d0bf32ea995bdfb803ffd8a7a565e23587cd66c3986ae179f6b129399f286aad7e4ce26efce8532c01e85850ad58f609eb6370a7dce18b8018c85824f37e545b95df1b7e04638c11546c006ba5c904212833b48c0caac3a21e367370cc100df488d20e221d1c071e06c16c28682b7a877475b6e123dba7c4420809d3747b653928c2fbb55a8614be89a5aec4e20b36b0430939971975ba923d92c54a8fe760f14b5d9e78f6141234b6507fa84b06c87f47c7939de2dfcbe6f910c3d056fa4977b51eee5781c4c536ab4af17fd623b417e3be4c567f18c29353d42534ab4a460b55be0bb5eb85295b16697499d165de1d5f3e402d51563c83a3e25503ecc45343253ef75d71f358bdae4fc65dbd7397c8937530371b34c803d3ce74b464840b595b84ca08671a610281fe8c1b3db9ff89387926d21acaea6967ca3174cadae1dd6585dfb606ab396b2827e0a57195524ff9a1326d427964a27fa8d3dbfbff44e550fac481ee644e1d89552af309c9efe2cf841d2126fee500d5802f22b60411c899e14b0ff836ccb85429ca8a2050d4d623e691184941ee4afa9e29ef8b865110d6861c4e2f305d9a8351979f4ebbbe759ee0cc9bb1637a78285897fd321ecb937ef08cac77666e5caaab72e2355b11416ae100b304799f5d416e59066edc0b833c01a3410c1b9f04959a1b62e320316a9268d7f1774a215ff21b62ef2896b8353335a32903abd275760197aaba2c6d8918d24424eb0f492315abf235c01b1a29a8b713d121f9f32e0d48a952c2882191fd836e085cceac673cad2f847ff40292e3c12f2764d29c4b2931f2c2b489abacd2b32aff72b1b0c58d242fff95c88cc99bd122d147f6d6a270403c0d8569dfe492478fb051fdfd5564286104b78c1c9155c048000d26276925961efdd6b8feae919f1a5de380f474007b4f9149ebe8bb5e229e4fea7ca54e11efda06d5ae5b930406e0d8a94c16bed42ce73e6d217c6bb5fda479247be06b8fabec7b99954952feab89ca34eccc4a3039c527955fd78f12c85f3069a7758287c57c27a9651e4304e07e4acafc3f6b56152fb7f5d0484656d3c378f5ab38346e70735de0461db6ed4d491f9af1699a0cf3dcf6aafbc3b7a77a053433abc351a6af39d59fcba3aea431b19d7571ea22dfb11c71321ace3b8c37fe23c874766ff44a4320a75d54130d80ec7621df0219b8a8d3e116f5e1d0e85a38f0a84c15dd40af3ed4796a5291dcdf7b012b89c528a348a06b5f9db31b4e18d345f36ded3be82a879744cce0847b0e13fba15c013ae892f0ee8c7c6840c1a5ac7318de809d9c2ea43f2e3a5136e8858f82bafc7b14ad066120226191be7ea480658ed5103c85d3224b110359236e647d5163f2e2f9603a6851bd367e395c84b4898196faabf63eebf1e4314493bd14f09eee37c4f42b4b86de4afae186f5b5d75fa5941dcb0ed5afd66c7f4070ab0b4585632d3c0e8de767d1865ea03bf397cd50e4fe0d7e0203a00b656f2003d3f6f591ec2ea1c6ac7542a567e39c366ef52ae892915081e360014adf7a594227c8f4bb03c4371343f4e24ec34bc23ec80cf1e7db1534186dbada216d7b9cce945e87614222eca43e0e33304c05939e44f5754e7ede6ad2f6268fc142619351163e7b34778a5c7807ead0695d07113e7a11c176a94021c3ed9d0cef3e4b274ae293aed5d9d3e9cfc45e35f5dd2d4b4ae761229b05f8c81db99330c207131b319a13d527980cbc82cb0704fc465ea75f02c4cf9bcb9c320a9721e27a4e9c333133737412cf8af2b3692334d3c4a0fa6b0d6eec86f69c1f88582c6d7645c9cbec53a8a47658ec3e1de06c9cf5fa67e4031e6db6895b6ae9315f67339fa290511850ffdf64f1dd5ed66c08cfd53fecfda9b66c7b49d9fa242a835a9da124ac62891871c1fa5be35e0ad9eb2b27ce3cd42e767ed91e4486bba2ce72df8c112bdd0b79b3562ee5f531d0f01a97f64238ea8b28f054fe4f37b6ae859f56d17acea721d3b7eac6f3d7a85f2e8930bf1856b8ac75cde72eadbed59d53f717cb8cb54c56589f60c995801e94391fc4724e35f0551e3b301f17e40584ee415819b3b7fc12d92f3429c3b54079acc852647a023279c2d036a6e29d480618a9df651e150166a137efcc2e309c3f72b8bb590cad436477909f0b8b0d94b9e6c7e1d682d248d67403c55ce1ca82ce8207b626e4ba6d737a16c7612a61e93984dd6c28a46f281fb34122bcb7c248ae39207674ae287a1f79387df61395cb6679443e482493926bf10290ff5666ae014d6b82b6bf139ddd89a9e34460640b3caf0b70485f4d37ab6ab6362429ad0c8658b76b900602ae8ccad4bfa3582bc323ae946d1b75e44d88ca86d0e5f637a6150882ae0f6aae405ea12d6df77ac663e28ab6e63ac9d3b8082c951d2f83df4550f2e645d4892498c52a3dc023f4bbc5500a3dd810a382966ea97d0697cb4fbb338a4f0b078f367ba4938059f5ed83a54f39788bb8404c35309bb49943d730237444bcd1467f268d8c83c6356bd751820ee3c9c576d3e538d5a87d63e0fa4d35ec0ecc6c08976f9c768e593d7229d4f3e4670f7063698fd873ed5712c0bbc2fcb87a08c432d3523798cf0119d51270496dd5e2fe3e56132962dee12d2c2f3c8f41f8fb29fc13975fe24ac35d696fc52bde035f4134584a005936c80a4102fb56d517fbca6b689da0b0cbe0652848599c0737597fbae03741fb0bd756fd40ae849d8c15ebbdb1adcfce40091323cd7f0a2d06f0fcba69a35c0db345b3170d6d03b7cccaec060b39402f8ee244c649b2523db53c25b6b4ce6512e08d2dec88ec22b203a2901ce5f433f6748b6aff81085733a1174ec4a3c55219f0962c00d8dca47fb4953f768e0a7b45f2147cbb8fd0871a2f180d82af43d00b3cb0b88fd63ec21e89e1e2221d69c7bf8a01cac477750127a4d4e99ad4c9bb999ef51e493b8c8e39c305fa0b86284dcf6c1e714c40330316d555eddba7674a83d2bbc8762a22f69d4ae2ff64381a2fe68a6a2e07871d4f27a9df04aff1ee0ba714262ccd301c7c3e4f18ec3e05a0f9d49c0bf6bb287fc7611aaacda61533305e7b488d4e03701f8d26632847e523797198d2ee4c8c8865cf1876e9b2bcfc1cdfbe6271a231922616a2aaf372894f6f30d28b065e3274f89faf3e02a24b0a541f3d5995d509511d0eba57da48e857f40882b2a65683b1a48d59bcd823f34094b754365c2db67dee8857b277a206a21f42de6ed2c55fd11ffd8d665114c780d8b7de7e685dc7f6fb36b05db99afb5fb745d74984524677c6babd41bc08b1228a2288dbc19af134abd271d76de955e0c5f4aee350a12487ed1013310a72ae9bc44af61a650d1a8b3f006044ae90930423b0b45a9d669502b90bdb098f9b4ecc5c8622e7429a0dbcef72b0cf84c865a8e938138af67523985787f0ab9b97da16f9cc888beafe8823e0a02b8b200756d81ee15adeabfc0eab9e6a3180a6f7c7bb1dacc65de75bd082d13b1b5fd055c487c6f1bc423ece879ee7f87348cecb87b6a8513032635bd29017deb751c9e08582117b880f6c355db47ad76de14a141da2bb894063cadd5c70520ba0015b286f61eabed0d88ded949251b40a1a23b151a1877329e86cdbdb1310936f05cb4550e069192a93af62573c4b708ab221d94210b874e5825bd6b2c52e78e8644773420f3759c654ba1e5d258ade0963191b5a1dd2a1ddaca4669666deb77496021ed3a14f0ac93b0c7babdc59789ae8a7280149a8d38d1ff581fa38b94c16ee8654ca1b6507a9a2b8b0bbb06b58d49e109e2d9019766926667e3fb0c2c2a41e783f7e9eff953e86750555e0d24aec890e9951583924fe18987eb161cdb84b13161c8d41caadf7e0bd6f64ee815053ccc00bc967c84584fcdbe49890a747cb647d014d48deeaa024afde198581960957923c48d94b32e93af7f9eecf7c635c68c2742cec1c880f20207dde5f8ad586e55d6f0987ee5b2519fe8cef1379f8dce8b39a42e38889f7e1e4c6aa3066b780d7ef584c3fba1b54cb268ac10ea5db8aaf13f1ee2136dd87325541233fbee10f25b3d1515bfbf8ce2e3c66bb0867ff1ae219f8805caad54b0a3191ed46f7e61d18020c3c9d8f475d077e188218459fd796c46b7598899898b03a0464140a2154bb93cea55f60d6d6742781cb0494b0954483360abf280d7460b52d3fe84d95b60ac9ed9b977cd6b65cc9cfbe7b08dbfe3af58c2e8d8b847271e0bc4542c1989982a0a22f5453e0852eb76d6eb362ffe82e709133431e846acb9184fb4f44918fe97389528384c01f81eefc1a1fb7157b3b864a2007111d5fb554a6d0ff87097af4ccca2db136b7e23f79d6aaad245ff998800442ab84a424ba24ff38599655418db7c07da9376e5a474a9c7d81668f8acdbe6e17c3f49035e01954d57538a98ad3667d2b332916cedefb47e5202d76441e6acdef3c748ad0fcc267698327f32b8331bf3234590be98077ff14537119c4f2dcc7f64c25f2f76bb187dbcba8e5a227b4f41d43a56b6449279adeca752e449362c7d0818fd99a4baa620e7e057426b15b43daf1832c4219959dbc6534b6667d13312c8ab12d38f7f5ea7f8b69498eb8abaf8a716db958eb8706451414f956e505758890ccc4bcdb44e3ae04d1d2a21603c53367a9e6eb009d4171bba4779cba21816fe0ce2c371dbb09f018c59ca15813e0a04119475bab3c1f0d3ca79884a1ba3d8f264367db973ca699a26bba920aeffb8c98d4acd309a8eafc04f52a4f5d4ce1adda7e0dc7d89e759e2ff479463e34a5676f56f796f6ad4e5ee454660dd642cfb5a874d4886a402ce029744bcefe5f81bedb06b1dd5b1f63d6da35bf22636efe884ae42582bf46baf6e0592385a31c853d564e89ab538bc12ed56fceb7dfb3e037b93d70ae7c315edab48a9c561ccd9dc91955660d371eef1548c88cdb8acb9fbe5ddc4cf7e4f461c335e0f8a3e8f2bfa8e3ce1227b17cbb943fec9e811eb3be16b4bb442d3cacf352dc9feb05c0ee0b3f044dca5477f3994cd25088209bf36fdd82424d8d695d0c5a722aee9ecf28c352958b2882a901e93c4c10ca49e7973e17f96fd56b99efa37dc15a2f45ced1cd63b972b18c1f1d7a7fb6dbe4e483b91a6d842d8e141f3bba1277310b41acee62472f184d24aa2e6423a3943c05e408a20231099174373c763e690950b0ea6e31075d414818c4536aca58f98f5ebebe3488b4a1ffd1e023ea9df786666643d2a4b729f0060eb53886182a9f03435cd75f318c2549a79366761dddd71ddc21d5ff01aec0c9a33d4fb649f99759a393764df9c3db4119e8d73b53dac303a8ffa3f92936ca1f4abf8d0629837090a863d85775d3d4e26e99dcf03cca4c9cf32c9d98154e391b6c5ce72f28e912181ee7fda8046181f69caa360506644df207ee55e8a17223bcdb3719518dcbee8796a0a5ca43003a757a841e88563cd4b72eec2c62f2b081a60213e25b810ea0fcea7dad26861dd7ed56c98767fb7b5a5a6aee612b843a9930bfe15bbf25b6c2aecb170361c67faf22a5066ac01b1c4c9f416b13f4a1081604bd2054f9e46363b67866577d0c621046f7188ce6397ac60844e8d8a818ef1fa09e851958bb252381b84afc7f382fbfb9d7c857fcd79fc8acfaa2f78f88ce3899e0cf7146b5011880d1a1946103572b4eb3092ecc77c4d744d03229a4be0599007439da4ef36fc69c5f59b229a46e13c616064829997155caf03bb0fc07dcefba8477adce1d668edabd14a708fa5a496950148901429609dbafafe7d6ee9432376415a9d4ccdeb11446da6a17bfc3015c6c449a0c9a371fbcb7b24c9d75757ffdfca3f0c043d91124c776ec3b5083ff0cf93448ac917acd9ebb2bf44aa4f5d78b138c50cea407ea53887ba4c162dee9ad00aa1e7ae861a8219aedcade0f05b14374f8d12cc7562a4058c2620308902948dfe6099b0d6ab962ca116d6d97668413fe562fd1a6308ac0f25e8034d8366781757775c88417709273b14e5775f4aaae8d7592b848a2eea62cfbfba52884742dff83cb50b1ce52b31c2896077430c9b3e633e9784b6876e32d065276df0451a1d32c0cc6fbd87e75b93049d37e6caa0fc6ca82250742229863dc0c0dd58ea17249bd06bf7856b3e28d0f5959e9dfd0de7552a892821c1e9cebd1b54aae2bd5adcc79d6937997a086f2ac7e8d1491a27ecfa0e6bddf443b797689d04d576469934cd21fc9f80e65b1c8100fbf423a0a1ddf908dd24ff14bf8f05b9fc8506e4b8a90be677da9560c2afc83de491cc4b97f94403abac0f0a194fe64be626019bf8426dca240383b6b8b7f8ee2d330d5efad6939ccd898bd0d0d8e0142389737439d98512164a7c1a6882194e72292abb10cb6590c0ca258fc4eb274ea4e3c342bf379927aa4477b962f150394ea6832831c8fccf69a5d8a0b32128e18a4344f1551cb06d2950222ba23b1c8c89655dddab670f4846308349cb9c0232deec73a8f44e26fe46f03eb45e5818b704bc967528a9e3620ab508089ca2b9588d23a9b664742892c6927e758dc1223fd388b65fae4fb55b416935de3d050b654918b8e9f78d91b49b994a69c179e1a2d80789b4e1a70843111a8d3bb7350fcba57d154838bbc1dea4f9159001b5bdc71f35a629f69448d2650fa0032919423aa1ca27b606a6fb4256346dbd0a60e3384f5bc9e1f177a4205e8be892ca8f6919246029471131f4efa04f69f26a3d23a3ca07a57a993acda25b63457e1254400a61d9e4e5cdfc13199bc835bd22a848d6fe05801ae7b8fa8a10b30bb7d9c8e4cb583e8aa5ae4830c9f14b933354dee709f909c1df1c744e6124d06a7708e5b1dee475f0a2c06719bdddbc88e4e43b50733fb956e4033bddba17c3c2b66047f32f304e54f56db386d4a0d10e52f93b8440a164719928625ef4a683e9666a56b0320717c0f9f14fb5edf9fce986b23cff84a2aee5271ce5f9798bafa4fe6f6c7e7812711692e83363c017b946c0f91d6f8be40eacf2fb827bae3d54d6d4f9387b8e92f3f82a1392b25f22f64174a19e14149a533725048908b6292200567ed9fe2010c1a7ea3347727ee569d472d03e260065991e26af101c251ba23a7d7480643295fb203d5b7a3b3e6e25af36a9c47ad7b9c38498e771dcfcf31574b8390c9191075abab3f89d01bd559effae6fd0c75e488cfc6379b8bb0dd3be1f5374c87758c011ab5b0313a0b34a32375b190eaea9760f336c664952e07beabfc838b9b8a81a5c420bc1d2856a83b67e6ec93c1b6258aaeca26b04145cf218cefd7b613aa83e3b9cdeee9fb3f1f228bbd6ae65f874212705c407752a0b1d740caae552627de4ea66e87360a180e31827b7c9fb0835d9c7ab168706ff865dfc7e1deb6e85d1a544baf53944d11fa0f6cf35c6355e202dbcecc76c52f3d188a43db6cc9dd73a4f8469a824b196f62124d32370f5a85ea45c14abfd037b752383cb7c5ce4725f42251b4ddcef8b6ad07e5449de1e58cb0fe500f6251ca865ad36c08340110ece19144bab4cece6964cfe2cc3bd1d29d1f193260ce92e734034630f2a35dc34103de3a7dd0e8b8c03d6edd8dd277ab4a7785710528ba32afe6a9225ae4c188bc5ebd50634fba8cc59ea7aaf3c7d0d052325daa473d2871e2f3161fccc44876a1c79595f6a46366296ed1b0c1cc49bd5cab8e05f59855139b602dbb0e1825889b2315de3594e6883d720db5558ab61b58efb142ae4c35b26a14972fd034ce7a9c831207f2a17aafe4de3d0bd1dce621babaed2fc8e1f561660b9626a7902a80d0ea0867508c9c0236c2900dd38d595b3d1c5e5d787b3dd92a23edec5716aa1e56d28f1987b215ce02664fa6b212ac3c842ebb7c579b3881c61ebebced8a06acdacb30ccdaaeda6ea8dcf57cbeff0eaa54252f18709be6c46358d9656054aebb848c7cd1b53223f36e94a5262215b004176f6963f05102b736dde71a69ffc688758c0961515525228552c4f630ec468399d151891721bb00a3a1ab5a92fd29ba2f3f465784c904adae0b00190ca8b0ff5cf003e63c258a2dde978f139c25b7f591c064e854521d02336fa3ed5953f9e6b66795c1a3c58affa386f8e752d4d57b8b57a88a4bbd31a297bc82da93217c67f803278cc3b8c6618154445edadf6e512e79dddfd81383ccebeadbe3ecf42e7ad28a18880963254c9e661bff80a7c84f7d7c53aa7fe71afb3c5004ce2e37ce595e88c642599718affcbf64c904780f035931b5c98985693ff9c6403a2b10be6750e6eebc11867ea182f0134ab5bb5c79a5fb7f527750958cb0e08229b4377591d30f91d1a534ff23e87f5c2054c11a57ba12fa3c2b976c00c1346185f5ce14de8ae218266e45ddddf98344364f4f214178f6954bcee6855bd3296b610e0fb69c8bd219aad27987fa31879e4743006e5e0f92d6bd15cf2f4b95fa0d8b7218ab21647b0bb1c0b83fd16ef26d9148d389bb09c5963cf9c9d4f6f539d827fa269cbe81c815c4f0752eb32d86352ba3e3e0427b78244d1e360c5504f830394b40948ccc8686a6578759b6991a4df92984876467262e6636642cd55877420344bc6569715e12071e692a7cb22711d90feb500f83d3df3f1c32f2183ef4fae32de6e8afdcef1facf6bbd531703d0a2a8838a503aabeb506bbf9fb87e2836082e1c9c55b0e5c082c0005b62a7778580858ac9d4d82171888b2c605d24b137281cc4556faf70d786dcbd9ecb11836b15e5fd7ea078399ddbeea4c4394fce1c704fde18a3588ba080cec67ea2bc3312cacb2a500d60b8e54ef07e95b3ef689ededb284e8c9c30b587443c77a1628cb3340ca7796768fafdd32442bc2b182d8c30fa54967c312894179aeb37e6002bf92f76af8adf5c12a0a43a7b419a178ca582d4e7190fa735411f01b8246ddc10d866916bee3dc55b59e58facc2713350bdeec614c937012efd402a99c5ca83b1c801d879c456ec4ae621d58c01d65680e52329ad87700789000a5c802ec7734bd7048b6b03fa009bc98e4a7eb2c34d3bd5b811042424680f5bc6c257cc32726f24995f53cd1ff4c746631f090e60892fa7b9e7d1f0d683121e2fa89b09d8594974064b33d11a9ea517200b2d570355eeb9a39f8cae722f970053879cba5ffb90c551e72adaebbdd15fefdfa0f3cf4e04ef9b67f9fab96bfb5d72d6cbf196fa98f1ee1e878ffa145c9bc4aa3e411954494aff8b80bdd7049fb3c814ec70dbdb414c34db693d6f5787592a0f1ebf7c1b89bfcb3fff936d7d7cc07326a52a57206c33ab8571101a11ce9245a6196e1e5f922edd50a3ad03b8e36fcc21667453c4399b0f4ee39f15550985c911cce8d26cf7ab1b815e7216a8e96b8a812462207f8a51e9a54923138a0ac220bd00bb11ef91e1e79f53ac8a70783e7a6998680e36000d002d53ba97fd51a09774f18d9a4220ce50c39fe527ae1024f2f285848ae29af638a1f5eb056305609f5e15cabd7b90f15442765684a010cfe570db9ba66de5ada9bdcc9456a3957bfb48d7f8051ab2234dcce2b8b01ae557c182a8e9500d4867951925f01016cd52046d8325f45add9128200fcd952cbc13230d6ef0563b0bdaafc71ae3c4f3f6e68d5b873f164fa1b479ae98428bb1e3cc034dc658b8ea4980e0fdf7adf91d61992d50a36597734fece06d591028ac47ccc25d7d988101e6b5cb656c34e362af5094e92c20e0d1f3c36dbe2f8cfa0a84372210ba20357e76f18e47e3e4006f1cfa400d087a61fcd2f101b11befeaafdb2994576a78f75839b6a69174175af485abc0e0a6dd81e12377ef180101d3f6d21c36eb58ba64c26f12a1d97c086ca5846a36eb3462bf35697fffc9bc1b97d0266f85c8118dc6594cf4ca82fb8405433583610c50642728ab66df25b1bb94c5efba828b7df6eeaec9530cc9ea33106e18a71790e0e4e531247379efde8299d39980e50a9176e18ce6aa82ff11b5c7f1694ea16294f737bcff2a0d9b4b26bd39db9d4961a32210e5321c667a95be90acac699a906accaf29ef36762e878789970f13fe6160db446ad1d868fc6857e68ee66d6d085b863ed18846e55e501a8aed72dcf5f08bb7ff70b48e50a144e7a037d214043015c69b0f18f16fdb7f9166dfb55a68480567cadb4fb21fe84559bf57e35285b43e3aeb1e5ac4feee183e701a834a55b0cd4b2f61eb9f37ca8a9e1efdc97921304be01b18e1d8a2d50f2c7978d090590f5c8ad4ace6b78b551e65cea365c8e352c5b4d6ae57c5a32e6eb632426b6e6cfb290198222b29705b4219c632e95124ea3d35f2925e45358733ba4ad75a7490ee8e77f8c623bdd3ba5a7c054e922fb8269e684ae154ecc668738bafe1a0188dd3beda462d254bccbb8187a9cc0af38f7b86ba2750b4a83b7a69da5a8316aec1db8a4f1fae550f37deea4ae9d47ece3f63fcb8abd655a94e4a13c3dcea1c662ff564e18662602ee74df9841be146c1c537454c28c53f4ccdac8c632c4991e8eacc8671782fec92f9b7d2495692f01880d715eeb4be0389c94533b93703818e330155076f9aa9be168007635b1f526d1ae5c92df354b5595c8f6bed3cde41ad916a3ee440ba1b65a93bae9994c4f8e601e079493963ee67061874ed5da40cdc0dad7247f68596979ab7105188584309ab480e699430b5a433b3c3013fbd4a1103ee8b570ddae0e9bc2f4567a94da0d98b2f182c944f3b919caf8c009fb15b91057713ee370272adcd8199de644ded7c908803c28b47eea19f486e21cf39d0576605ad7018612958263f1e672d044026f20eb1998ce3a4eb5704353e56b9b34b852dc948dc9bdbf1e8ea0a92a11c0e69c1ddfe16f39449f730681897cab56c9ac9b7d010005b1a93201adcdeb8a75390c6ff54b5bde37028332de40ec70694ce8fecd780f66c031cbfd4aa7c7d4383e5db1d2451baec921a76bbfceeaaee1530d7bec19525713c63f37a1b18df145dcbed6e981d600a6e1ec26b540e92601e841eb7114379313738f413fbade80b2f501f9bea60d12a43a045780cb4b373aa6d610e206ca386b99ec7fa1ab6681a9320bb86402d6456a8866ef352efd816affa080c327aeb164b11c3a51c467a5c78ee303787b0ac4ff528feec12ca3914f778d57b31d8a7eb2b8763d95fc40662d230d0b38b0e5054c775ff232cca8182b3896e6c8d1a2deb67ef93701b60768ab267073c7c89a070257ab1c771f9859c63414cb4f7b00371efde5d423028016cd0110c06e83069ccc4b26762deb14628080bf62b3700526069166038d95e9b1b1124775efc20bab823a52505ba008f3be66d99009d7730983766a9101f6ec5da1c69405036fe5de161db26d6ea785083ac9114148221fb14858b5f911a561296961b2fb232b0adc013b6802a2df0a766aa0524007f932a585782a54be574ef37a4db1095cce6be681302874a9fb8b1f992e2e0fe8ddbb4e84898cc168153e21d70f2bb2c8b9492782e169a753d9cb525e8d49a2500d34eb0a2e938ed7307563d48b321749501595da7af439ccf5861677e3b90632669029110ba5d59e2bb4b6f832425830e954a04d994421dc8a739c9878282fcdc5a928e20cfb8498b4687f921469938265809e04fd7ad21a0773a96e034b02f066edc0fd0afbd445f88487a72973d333ca5037a2d9f90c5eb0619616dc4c575d80569d9827e26a277d841586f9eef6394a325b5a9da5816b0690c558aa29a1331c55c38ec713216efbfb9322ff24cdc82e4d4034b3d65ea8c84efefbd3e5b116471a9920b77088a9d898fcb49cf8c4db764fbebb39b39d7b7b25b121d7ef7958930de12ab652153b0e893673c23b12b60c96f8a7c28d0ba6b5fccfa50594cfa6890e32988cf4ac0cd60480a57a84e4e25f21ac2eed7c9ed841fad933e2777f7f09a13bcf80988dae86dbe877d4e2e6d57c49d22625db425d9c44611310c5f46514c1a2c0f6b61ff1620410c05dcba6e427b9650d3baa8ab87e031f5a8cab39c1fde0be43302f8404f5571e5af37901145875c1d3fce05d7f777e1ef2f012850594b004888133fac7d0e4dff2b04711364bc49509c2f7e629b3a4f991497d542efa31b4eab2e0625f9d3272247e1c4030f9a19416fb5935622bcace9f200fbd6b7704e655e223135a99f78ff664764b0174a824c4ee3b0192c2768094d7c30fc2ed5f70cc6ab68fa1b493902d21cad675f0934c31e77b79fd45011bd0e6c6fa386f39f942d62ba5adfe773eb958318a52ba4c81e075e1411f7538ae17ad9d89d7f6875940226f6d00f823a9c58ef23480e25949414a5f090ccea2542db643f22c2560e906ce76684a618e231164ebace175f8b31e3bfed98153775b3a2004dc9314832d5ae47daf51ee6a813b073832949408cf1ad7cfcfc7f51cd2bd4bdd969751863183fe118995b7a268f35ce53443b6e12cfa4bc34c084e6d3e9215b6b51e477cf5248998da802478bb3192781efc22bfd2b2f85fb536a2e55e0295c094f92ae205a15bbf77e709b5a6b8157832c2d3e67669fb054c1f37c535fccfa7e409f4cd81fe8fabcf52ea3991ccc37016b661ff5bdd1d362ecb0d547a4351d567e1a839ca9e3c5bf27a9769528d86762e0358b7cb1b5a51115ea31c2afa086c93865c2410096e29f320b21f1c0887f25bcc50b320934fc9daf1d6589cfd66bc267f77d1128003c18b5c9ac345e883ac5ee11c5c41f543df29718dcda23807b1736fcaf2613003844b709a76c35d89173668af77459416981f036830aeef0eaeb1ca09d711bea22350f2a49db81dfe1b5a97886d6a15cb98190dbcbb877a3fdf629c30f16a6dbc2d674285f746fb1c2e4dc81f42b52f064ffb8a32da578d4ce9b76abef5a91947760496d1281804ab6f5bc079e19f02fc1ac63f76402f7a01beda48a08230a9dee6de6b8c8998cece6a4b3d3a37e880dedabe170153c9abc9541140cd00b9be5a0678cfbb72f268f145f265eaa781c34e8572b96327a64fe48d57827d492fa52f48907c0726062fd737640661d835221668cbcfd44c18b8debdf7c4efc016d4def3660e89921e037c27c7cb8c350741ccf2ac9b16c7ec14acc7e4b10d25ebd205d7728224187ea93867da359a8a6ad25d56a6e55c9b56c7b5ee3abe763d6b672725238c8c6037e8435fbcad8120f61617690bb2c454aed5e3c3a96f7d9c09342a3170040ba6e8d29021c70326cb3b8187e14c9aa1465b010a933724962ee485d4a46e1aa9d2d34d485827f3cfe37039050029d6d9625888806cdd36c0e1735c0ef6da4e709518ac074949a3c299b54168abce3198140d1de4d1bd92e48d59daa82abf6efe19c71cbc62f58b4efe1290d3e53381f0fe6915aa39492fad9e830408fabd9f25f0aceff1d41e9f51670e3cde28d1f89dcca8c1205df05b2e6c49ce41a81a9bd1907fb8fd2827f41952e5cb779f1401f3893b6a09bd0aebaab5b136590235e02f74f98fd49390757d8e55df118b7accaebeff5e707b4c2dc06e0cdf03d6444b63ddf3f2b7642e585774130b8433a322f989b485f6947a1e9f961a9dfe9fc3ef02228fa1586503d389ccf054d5c5c75c3bd96e065180487783ece3d78f79fd925ddda2c371ffa5fcce34c1e1462d54090d56ad53fc0090617983fc9778893d016ffdd7d809d440149b3447c6567ab62e4b43a90c784f4d42c777dff2554775e325d1c3100bfaa1bb997aaeae09f5c8ec8418345aed6d18de9855388c3fc992e3dc70ddebbf76cceb7fe39883301da39e36de59900d16d9db725f864746823bb16eb2820f1f6e4f39a3026e90d14a0f773fe6ff0ee3cfc8ba0884e0fed0e24c5a4f97c6d0e5ed7e07606e06aa4d5171cb43105dde426b9f227e69800a77f0797874bc401cf356cbfc83f8ff46cf1a38163d58199403ff40ab0177d994b63771332b0a7adf6674aa05b720dfe350fe87907ce62cfbe711c34b75a3e6eef46582058425ceb36c6e28e091e262054059cac5b54050ce32e8c3174db761ab30fc66972d95cd0d64961633405807e0d007556f5102dc2a49007832771b84cc8253c71bd62b07fea9e4772a7ec7aab58b23316faa9baac9a6f32395c986bd4398077f13cf5d2c0ddf0e6ebc469f46eeaf22f1e21714ecb417406a1b90192da3f1d4495c24cf6ffd5d101283b4649796ce7d5a802891d59ece54cebee724ea25adbb4f35512ba0d03570b1990b77c0578cd3364b7e51def8863d4268d1d6f3ec90d2bab2f557233d0d94e1a364474485c72e07cc9f90dd393aa587200c7680cb7e0011238712be6eddae7d5658a5f87a60432fcf767210978716a2283cb0220e5f9724a85107dbe64019e2763722dc8c6319909ccd96161512e216b137d044536ff5eca2434182c31c0662e620cc56752162d5b3fc894812f3b6eb862b4d7b8da5921f73e5d03dc8599526509cdbda1d6e8d80198018a5a91665a9d9fa7b3e841b769834d97d49932971db5659070201c4116ff76a0ee14eac2ca39ebd5baf84eebbf3cf8c2e3af8bad70d973f1067d12744c4b652ce27c2c1b80112115cdca62fff9e27de482a5ea08c6a63b633c514c73b3b52aaa47b1d79a65ede2f58f5b8cf5caea9070050d4159c71c0b9a4d6b552531ecedfec19e61b69ce0591ff82c6197f73478eb6b8fa7e62743169c92b5dbddd52c185029dfe5b558c7af6c7a919dd947c7492798112fd9772a62303014c62702ef28846a4279d129118662791a8ad1c157b9095dc022165cae6f190824e5841cab8c67a9ccbb432a5f18b8d2d3c89c57251bd22d4b62e4865c1d230c32b4b81b825fb074665699c8507af4c97bf4582ee10a1829b3994710b27e19cc96a1d4a8b8385e9b3b95b13694750eea4820d7917b322e6817dd048ef06d7bb21069cb5e5faae526cc71d9823d58635d49cc3221eb57db3aa779b5d38d94c87261048282fabe0afb000f5c53a3ffdd98b3eee06d37c8536e50fbb6b54f197a94bf8ea7ee7036feb187fbe2dfe1cd57637a54acb74ba3bf009e1bbe308a2041c61584b1644fa562000ee0320f33f50d34ed1900cecb47f91eb82a2ccfce0c8707651e422e913aea2ccee913e8ec318dd4aadfd9f687c8d27e61d30695ca6599c07f7b0a8c03d2f0f4859cb69d082462aac6634c59928942cbed1a5a18e439f5e9a3e8dda433d092d38f4a1e2dac01f36cb7cf9e0ef41b21cd4e9898557d15c1318a884a3090364245b86af30149a19866506f0d5e80d8f946142bd4930761b994c6fee386a891704809442f8b43fa770185123c9dddb3918e6c9ebfae5adfe866f66c0627553982f7cff6112636462ab2aba37c4f6ce5cc77e3570354785c2436e49d1d774ca2b9b8299805896a4a88390ad8d821e0c96f8efe651e4f7da2bab403a1c7fb3c74529390ad51ada3c59fa0b02bd22198a3ea84e291957a0554f22948ae7262f74fc312b1dbfe4363a32c04f7d126561e88d0806e2658c38e83d88ce9ce88bffefba70cad88c090f9ad9c9f5c7f933e80b69862dbf43bfc3f0c726eac154eb71e6a8db358a60670b5a310b6541c22c2d81dd250fea72f899a641570219215d52145c703d39008b6e5d31775ca33c57db4818a6909f69ec5ab55a5a6c680775d281c593cb21efc3dffd4a1b78519a893d259d525ee0a9c8e980c9d339c348dd0315746f14b1d2276e5b34c83c60be9ee5bc173c5a7ef69a5fc66a93482a6cbb45690d0ee970e577ca1998c614abb5f35711e00bcb9f90fc50e84b8e47cabad62526873921bf58b5f8bce088c99cc48a377114c0699796897242ffb2d7e2ff4e334cbc1330d3ae17b92e004a56c937c58a6a44b386bda191846ba8d140d2a09bf46f374987d330d8789607a353f5b84bf979db1fcf591174074e6fa06141bc046725d481b39c60ecd7d1a5cd9246f3485719911c2e8a8cc71ee9b7897ab385dc5836d28aa8de7da5b44a6b16545267a718db680765bde65630bb513be1fd796097da98d13ff347daf38a8e535035682b3c530fca9438f7596c07b04ca338132899c851a09b0f0b9cd22807fd9ad4188c16b68bf28ef36a1b1942d474886d7d87518e2bb7b8fa8cabf6ff95038f39e724b979a600f73526f0bcbc59155c609ab86f5e13a009ef1c201616d9f3dfd08816988631464ea60baa276b8f114a8b25d11aa70871de5928f7c6924e22bfd23f8a9330e5144f429573b65d72c21697a070924a2ba0c96fb84b83bc369809b41dea790ec0ce2205e695cdf5e74f53a268ca6d222b21b134638ff7bc1752482f8c47c3bc972d15be545b56601eaf81b55f0d0d3c1eb7aa26dcaf3831ed471bf02cd247df61dd4a6919688ff15bf80b1f16f4d017a30d7121fccbd875372f28d585797202fbbd9cf499ab0082c1dc4cb12303689fbfa89f73765943e4e9c8615c9ecfbcdcc0554a06fb192ae3bd403e834b1adfb0fbf1e06e4f8e921afe7fe707fd0ec9aa0150249c80dbeadd8c3b00e409f83501c10450830edcb9c578e443ed9a81130731c15e41cc04bb00d0c19e06d28f873915cee7b67fd4bf4f1e56fa0f53a127d00337bef1b0daad2867259ead6dc3926d096c053bbec653f99cfd89e433ef5332b0eab9cf96ec78f7e4b9284330729fc23464064200f9e6a9d1da6b487db3c210763d0b6d3bb3070ea95b5d2604946214aecab35051e2f8bf9262be2bb49125ba70a599fbc0377f029a79f32460dfb0df9ee305211a2b4d190a82130b26a0fdad7270e88a5b455d73dc8bce88e1c9f4f6e02a2d9a558a1631406d2db441b32c513dd7b2c3739be0d2d5ea4b5b4a460d3d90af5f9ec20337c7c2c784cb9fd796b1b4e2ad9615a258bd11ac8e92652188896e7799e57f7f249ec23233294b88c8151b5995739219ef0fa17eea76493ee56ddd7c5cd47ff779c361a83f2d1407c584a4c9b64193f61d14bae8bfdd45d151484fcbd61566cae7b8f1eb51e8c958e398fab2bfa08c2c8f8611bdc7466b23230bc2469be14d2c9aa20de768e4368a6ed3848867296d88a165b009de62a00a4f512c93ff57a70dde11ab1078a74b5115be11e43c39517a5ca141346654353c9094d0d4bf35ceb90f383776c47d57420a0721040966b6c1d62e0e997f7c2d3bab51e0be7549c17982bf84e6950901acbb71a44458ef48191c6a7bc6965f61624b48fcfe41ea4c1d54327cb34f7ac221d063b2e0b25520fb4db3523d39be5f20c85ee5a5d88c7da538110dd9fda0d0a62e2391945220732a02885e7b98d0a58009d00a3a723ffb9e5470aaf7e0ef1eb2012ad42522930da389e2b7b8bf6dd8dd44687c5a40585df8dced13e219fc298c74662d9714039092aa6c3e1642880c6f8d4d5243dd87be90fdcf3fbdd9bf5813124fcd7bf3dbcab63201e88d252c876ac5194b4f6d086296d5935ffcfc5cb99cb54b966906a39cc28695a1851906484b392c27b7d195917dabc9f5b3958969dc0cecb925d8f55639722da479ff0d2c232c87d3981ef17a9ab12cc8a61b04ae12edca7f2a48f363c9d18d6d5819b19ee19003bd2e87455418272156ad11ebe17492f9dfb1d3e128689c15a16844f473e628f61fabd0b88fadbdf124eea6dad220042b32e11d87c6a1d5787dc6761127566bdab8357ed1b4768f90d6611483161d22b4a8389186d6996f643496734388306ce548ec410c36c00198ff25ac2f229b9ed53a29581cc744e2e7d8d92490dd28360c14c93598baac073f86fa123f80c531a66e8affc021df8e749432c82839a3bd28122108a8442bebac3434c8a16512ab55955018555f867b7642b9db597894a75ab0000c81f2d1ba821a1a87a1b3ec952e4d2cb8286934537700c6a8603d545bd127f6cfd3e51b35422d0b2e2f007e9a55c284005ddc70d85b2f8df037d3c75406614e0e6a1c077ed9d8d5632779eb870c6ffea54f21ce636b58c94e3a5c437c7d6976d98b3cfa85bde04e2de1553ab7a214abf4ef299652a954418e423bb0da3b49a2d341cbd563cf535779fd9630e88c4de16c02a17d7c36ffe88c10f29c1558e764ba7925ef6c544493b7cdaa8c64c604378ba3a02986fd92a4acdd341a8c0c7bb3f1f7d9d9b7ee58154979b526944e9f7751faa3274230904d4011379cf228be33625d4cec99b9baef68f972fa9f3211a9576535938589bed476b56a5729cb1d9707d4cf43fd6ed0b4905db78439c4318620aec3353342d9203c745d171e85652ada68c2171b556c98ef3f8b0b54a9d2cc0e83c6e5c83ff7c4a6ff5ba22e18d42cddedce718e217d9a21d08d61bebd244b612990112b9fe9cdec3872d4be6d386a73ebb4db0ba5d9f7e21476f6e9ff929a608f52fc711a40d68bb7fae3b06a76718dc9836f5b2cf5a0eb86b529d33183692b028de22db2127c7201a1522de8f22716d09b6cbf1c49b72fb7bd212cc57280db71fc19b9d210a6aa08410440ef76b5f40f73fdf1b7abb41b532e84a03d65dc1c8fe63badb0f5227ab847eb58772ce7dc80bac4287e1e1f5677e908d91a035e5808e9c907eef7876ccde5de7987da71a8f81ae3402dbce411f4515d24fd23bf26d7005d4794ccb965ba56dd83c7cbdfee0cbda9ff7005a1c6ad912a44754dae1a1da6ac49bf288bb8f89c8e7df2d49d98e0c92a304bed8974b46f3b0846296b6dcdc1910f82adfe392decbeb5711772e9f89cd384dcb39c44a1ee077eac184bcb95133c273b7654fbc32ca2a19d783555687aa08388391ab83687ba635e7c8117a620d2658e203fdd06f835623bdc0a9d1f67ea1899e5ec8ffe6224d1db6b3fab67e1252a5ec256ce229ffd39d41259bad1d69a46ce425a005628427d395c0971d0711cc7443e23f3e34b53066a47ce124d8a70c7fd9bf5d61716309d63bfd3aff346054cd1ea73bf0eefa90a1b8cc407069946ddc5b35f7affb6a2bdaddd9792c056c9aba563027e1dccb3119e25f723815bc87de3cbcc770ccbc8ace611f10e47dbe7bad85a2a77b17249c3cafcdd1ddac81f09bb8f70aaf17cb8ca28a5c3a4ea836ed7153f86773a160bf24457ba03809a6469a292ae03a58981a8b1fd87c42431a23ca944501a3c8be85c339c32aae8344a51882a537362f392112efd0a0f62e1b89ce5abe7b08e50a1a3788f8f5dc9e27d7acefde45394b27f77cd22ffbcb26002665e29161b6a908a2801615842cff2491dc1c32a4319dcf622f9a438eee9a029eb80f8bf9e3507a5b7ea938d7cd82169964b6e7d08118982b1328c5316951d699ce2b967607a94df334ec8db489cde8f03f85c1953dae353bc7580d248af29958f941655da334a4135a24539e0e9b88bd898e944d0005640dfd4fe42691ac8b002d08bb1f63c602bf4fed452c190a7b00d93e16cbbe4d24eef721a64d3c84063a32a86539dde55e826264557fce17c04e130918369ab05f5efa631156d2c60f7469b5ccd7ac47dad4714a4524af2a9586f3908d7b2b8a6803f3d6fb58d5a25a412963ac1417ae9edbe25ae17a05e2debc7b470bbaa96e75c3a5966d9daecef89f8b201277a91b8f1467691344bb74a9292822fb6a2fb56be348509e9fc25c1cdd7a0397fd918aa89d6cdc1d51ce9ea0f12ea90cf71682ee34c3362e86d4438df91269162ec7afe9c55b9446a957c4c54a3ff475145d9a6b6888117db4e5eaef1386c221a36cef00c16a2f045b9975e15386033a40ef364c3a1e6c33b74e531ed4592de4a34a84388d2c3aa5a23ded91e4095e5c759960fcfd6f92aaa77372c47715a99b2c48d256de89b11c09c7b5fe2fa78ff22af4e45b99d2c964e4b11c5a37764aed5b30d611ca8c24441e99f960107b4dd07932c5a866d51a0e0cc1ea511541673c44bb94063254860f2679491490640f8c9fb0eb357dbc7ff6c4c2c0778f245018f4da9eb1ebd01ded5c649568e9c6711d811727595ccd4fe4aa0d30647f6796dca042f24746ee7bbe4b5d8d97893cf04944666375771f159ece94482db13f4715a4cf55369689a23c53e170e0bb06bdfd2ee15f9a89d5fc132ade3713db680b7fc368d4bc6b39f6e1f68e7aabd8882deea7461df0211c5426e8cf441e863fdb02e051f5f2f3a15ba7555ebe67b8fea237905bff2e1c2722a412b7c860c3317b6b882db62da647dcaf31a8838088e0c3c0bf4dc411d807e81401e72bf114dea5c1c6436a1a298f332be146f2fec813f1bb54c5707f06be8707c016c9c5a31013e10581bba3c5858750e91514464413e7e88f71a89c92b29b5ad9859b920d7921c85643e18b4f28a75b7060a7218eca89946b62daab95ec39468e071c3861bd773c5cc8b3b639fea3fa278d65a75b9693f2dc0aae433aa4758816d5be7c52e8f64facaa5e78a359e4e39da8ba28991ecf200a3eef2564310bd5b2cd0bea1978c5a89b1a8f5898c637afb718dded1d2f173809134cf29ee3875e5bfae417608fc2bd3dff223a854b9702f9aedc06302d0681c199142edf24eddd33505133192ea41115d8d5242f14791067755ccd10ec98b1b8c4090d4dc5d1ed2bf804ae8eccba4a2d6b4a1b017080e105656f642bf99a80f71d98b7612a1c337048da3d10769c12373ab3c3866560abe4dddd8a01ebc0f00bf670b36e232e160ed07f6a4794d1f717cc2e2daec2e579baf1eaab862be879a8c33f7b9aeced65941ebf2bfa66d2662585caa87724d639dc1a87662439131371e71259f6307ba194d70fab5f59190a0f057b301220076dcbd02320d558602f7698781f5a609ffc291d339618cdd6f1a69e4fb7eccfae65c7507d1b361d880b2982075b676f64d5f3cc909cf50f833a2ce390eadfaa0d41d7996848ebcfff4333d9cd080eb120ecb0df74f92347bbdddcfae579dc14eb05ec23fe354b5d0f09fe94beb6d672706319ef985e5693703c818356242601effec71d2f204746608c53a1ae490d4a2dcfde8ee032c99d7057d6f635b260e811fd882eb490cbc510f7e6ace0c08a1f8e38406963829bd55db708381155a81a52c2b2b4f67796144d965b2c8d38908aa8f0372c3d91e0559aa37365a669c661380d49c107eb60a4c81440c33ab19a71234d167f8a89dfbed148ec217ed97447ace156b4537e0d460728b5c280385c65d313be39baa27ce3f44a532fcd56577947b2edb9bb24c95b5932778e2a6647b2e9bb4df2267eb0ae8329ef9ff284191aef781769b9575becff7d51c5d028974b4c3981c4f4c7b0fc47614d2a99791868f6331046603f3a2588194fdbbfdd998f8049a565bedaf51df07d6892174d19b4876a3f5b1c4f7c5e414373a2ad9874351fdd092dbf8f6fca5c3c645942809a341e7c16c2ad354c759dd39a81faafd4cefa27aa40a914d3c4a5c0419d12e10e039e1166564e1dfd0d1c11991b2f7075c212b69e1b2b1287a387a133a7945213e6d503ce976a5aaa58ea3cc4b0445b24a2c145bfea82778d1ccd086baae94c9518df7e185e404fdeda70e3b0f2dc53b1928b977cd4d9dfb526cf374b9e4b34e740e4bc975f1ead44b2632e1875773861a996388d9566c8037d19943067691b9d7a429418d5387314e69454c91ae403f99d717c92eb0f78fba6228e61ae2e7d01caed2c9fe645013b56b9926db39f0c4fd6d067c8b3b9c9d0bf72e040195ff6b7d6b8bcb5b78b302017869b8690e2ca1a728c1e17d9d154ae12031f01129fd4e955090f31098d3a1655ba9b87b307a9c2c78af427e7196470eb453410ff9870e70669b60651a221166ba6299bb95571825247aaf92e028c1bb5ebd9915c5215c462c8f4b1dab28a95dde7cf2bd1f5f76a7447dc3fb6521dddb6e7b1bedfd76c53d2eb43eab18b23a4bf06d4503e84054e87e666ae0339f87d1fca555bcfe01459818e053bc99aaafef4d5df2810e8db206e31068459c31538142c9311042036c65e98090f331ed60b0bd4b77f30000ed4636610e83a2a664f2e3592c7144fa89ef3e78fecf4fd4072168168a2c5620a5c60119e48cd8393fded6962b22d5f9091f83626ab1a0d1e47aaf37cc3c647590ca6450844d460c4bd8bcad09294af2f527bf63d9c9457826755ffe4d1494839a39b7aadf80198fd179f99d2260bd213770a450a58b7f4ffabeecb6c0cdf066210570ea29d05b2905aa47413d512980a404195bc1ebcdcb6620b62b120142ba720cdd4c36ebb705bf42098a0afa6b4287782b38f514d22b5829ef4ecd30240311c795e886988048f34acc6009a2dd95a82aafed03326905af4abbd258a09f834a312e5366b35b7eeb502ae405a21b5f8b2e68c3a9e71a28e7c2699908de08a9385ed73ef65351af80faf37f78d8a2473742f6df73d2f508cc790c8c0d23539d37f74bfa2a0254fda72ffa2b3acfe4d2fb99ae727738066ddd0b6eeab8907d00fe444a38ac1e8bf63c67f93a9de4944a54deebc49952878bcccab035b0e4871cbc220a5d7dbdd2aff185a6bd5a118a345a29c6c9111bfd96833283b6839664153dc43646c2deca06755095c82098e30213c985dbc15dd1bb967370078c65577a50302ddea93917f2060be444967424c96f6bf3b2dfcd1002138439e400fe3d66dd0d38969df0f61cfea2fa041ac8aa7cf89b02bb63053c040cd416af653ba2e8b7b9271f0f56f0438a491614917de7208e63e4c926cf514fc97a7884602c348dc20d02d14cd5aac8ec0ce7fba996e2ac4a2dca2a347876f88a3706f6274e21a91ff43596fb4f088360d314b7054c25c127840c00a7338f00ea50f952ca8b5cc6c3619aff0278317a7700498a3053c764c0c85331585d36466ac76e78b7dfa88e42ba633ddd3f1491f84a0c2cc1a6d56f78dbf4bcd48c53b9e6234e32d29acce12f06f793634c236afe1f360c294c78feb8d548dacd6cb5f861ff590b7d8041037cf918c25c5687e0c2b69f30bfeebabd6b76024f11fd04855e36b2f5666de151b8b681cdf2d97088a20388f0aba54c08123bf6982b2ee4a300ffc1bf292f25a5007df8b73a5dc5dea2a3226fb400f91deee720601ab4c63df6dc4ecc54661b9a18c93fcdb0199bc410ee40192b9608f1000b3a986ace01e7823ba0027cc1544ab4a003650d12af1227d66db74c78934d7216f378a3d20711f15723fa7b4bee9a880a1fe5060282738b75afb5661f95cb7cb635f42386dd299b28b9706f6c08b0a10cacf71fe250bd90b246b430972b6cfd8a5727b62119ca3afa9918aa36424121fa1ea0638cd4e4c0200585c1023d5127e93cf585a05dc7d485fbbdef7b68d6911d0ed0f4ab6be285a842ddd051c4958d8d9d89d403560b3e78a2d7cc37d08aac26783f31e607dd375f4c552ac477809712073838d30f4e57b24e729d580b781294d763b25c7d3f55e34fb5ec46922d948d2d364951129ba75bbcdc8592a67fe1355a5a4b42707d14b938467a9d43c5fea7a2ae564c0467281a6e3ce255ab60f0b7eff7f7f24dc7b057f2f02fb5479dd954f90f15063d1b4db248429d627e8f234dc2df15d639592e550b3915c7d8ad4e9e7fdcd4d43480930c450dc942630f3238c2e7b176e912e10d7ba2c590be9da0367e4ce7ca02c63a23dc3e2aec3f6e437fcb0753447260a556f8409e24486b2fa72ded0c624b14b0c53313c40244942de5f76e89cc44f1cd62124f48d18c1a0da12d775e9c40beafc8a36770863c9a58952e03ed141240ba04e0dd4cf88b11507b9bf58bf4746bee50cf3792d1af80db365290f25837da91f429a3d064a195876158a32c6ede883a0e245951777c163106de1822c82f093abda3ce1b5fcf61a77972af3de3f7e2892ef55dd25d25f6ae7df6b01927187925ec17feeca6a64f00c64f1646e4d3b52cf75706bda87454d01115b5f67202741c19b5ea04a3c9ae94a999346ad0e90c74d519c4aa4acc6a4a58affa368c5b66afbde5a6b0f7c4fd1bfb24dbce0df84693c0260f22366cb1b2d2aa24036ac494717f296bd1f4b6ce8e75a0451910c3c3fa2a5e48ebf0e25cebfe2738a50b44f313e9486e6ae1e50cac3f20229fe1934a7005665dabffbc725140d13788984a5c12b0c8095a648699946bc37ad362d2ab79a84cf8d4bc0346227a52b40b2ef6e7f1047bd98022b88e71767e8eb8f61f70c81436bbe0a17abad222d0010c26f5b0f26d4b28a3feb1eb2a34af3ec491d63ff6a7da0aae0fd8ead6977fc02b61961cdecf001a6984e41fe7bc0b9a8ad24dc6f3789b8d3eeddd443de6bd3a12abf34ebc2ee7152cc298369f2720e10371929b3b5c38e9a6d7ea91aa4e14c00115beb87b0aa0464eee762d5eb474e77a11bc9a8fe1462cd018dc18060dc3bc8f0703178b3177ea984321610afab35cdba70e7539a8120460383d11889645987b070c481a35e713a2db71acca2e9d06046a41dc2fff6d4d9c916443b5b83b7d99fda4a3b0998c292787b65e8219da5edc0a63488a1c04c37e1ad4469a2821bb38dc9467f05b70ca3f26e640c9b14675042f5125c54b060c70b3f1264c61d0fd0479034796340290a7230060b9be7969c07dd2fd7c01dd33f8542c67665266e51f59946be712209e1e8bed1847982c4788a20839aeab4cf35ffea55e9eeeae1eed2fe8566c81063f3fc8179dfd25004a41e41e347012c2dfe66809d1d659bc6ed1e4a0977a229ad8ecf356105dc845c1211758837d55fbd9ccbf6f7de4cf0fa6e9423e2ee376b303dd4dca73b490eec3ec7fc1253f4fc898802d593edf976c9b38c5d1f9d37d0f7e6d5cdbac952664913596750ef5805413101401176be1fffa292bce4dfaa2261300a0041254eb1ff38a75645bd4c1ffd0446a281ff6f5b1bfe820ed69d32dd47f8cb6f81843801e0f2ff3b52c103dd60abbff87388133e294c9411fb777bbc9818e26e5b80eedc054c40282b280fca915e313c911aa5a0d8f0348ed7072d0147c898f2317b2490e16c0cdf0f3065c035724a19245de8926f3647db59850f32e8e29fed16aa27df418ae91f5c93911aa0205a29e9c70aea54db6c261a569a8864f1002e89db5bd07ddf76ab8c00c767d1218f40f3db05d211f027cdf7debaa0e731a95df72381ef094df45cb9ca0ad7a81ae600c2df4977fb722de929c7f0922f41298f1cf79d0ae17a3e46a6e16cedff9490356a5d211cf8dde32f949b649f493065afa31f1f34c325c425132d0b9baaa196b8302354527579ef2b759eade6745eacbbc11dc4219cd6f1a01b9f05f82952f8233485c9f57079107a80aeb11def45b06c5b0c46a3c7040677bc09de93c9c3b21be4877e02f90f01e77492f25260e3ee9764df120b830c48376c86d206b5c0b2a4b4311b845fe757b7522f500e92aa636b539c14c01fc2c20fc956ceff9b74fd087c3314dcf81ff8e24c06adf0ffc669634bac29c1cbc0d142588bc3f52de2881b6290ea00750ecb9b2a9e204d45102405fa58af25c02166482632df5cc525c751ac1873aeaf9cbe6893f494c999b4bc2c68837bafa865949bbdc3c445290f6ddfce018de6d9bc19ec01931b1c1bb918f34755fbbd61f4bbb089c60cf9b14b169ff0a077754b47a9c4945a12ba50830f3fae3d6fa0e199f5a77211a942351979eb19cd1b9d97ad5bd340873fc5c19e7a83028fefc6f571883490dfbf1bcc41e89c0b7a404ae77b6b2318c17813d9f0ff29b1b147d49cc7553646feac11a47bd2a20c59eaab4b730085f06c0e6d19fb26922f1ee1f05328d76c7e11f0aa90aad0f7aff603d92d3d5eb7b99ba39ccfad6ee3abc1f400c2d770b0af645bc652dc6666bb4f24b8c93400179e52862beb6a1254c97ce6e9de196adab02b623ddde97d3cc766173290cded705e1a8e81519cc19836b77bda6478edb5ea9fa41ef2ed53561d6a4bef3e62ef84f0ed339b1eb4c9a5677644b12824557b609541f6690976ec64d7456dc1d712ec6fe573990a63537742e586d07b7a6d5d6b7a4f2ce3db2328905014762c809bf622ccbe50ccda3742ad30c9c4c19895b5681e6f338b92895fdc217f2bc408dd02502f9027723ca9b8640abd22b39a4332240a7634d9048838e0c3f5c18acbd36f6f87e8cb9ecc7abbb8089366a7d5eb6c3d01a7842c4af95fd11fb3c48a793e2956b3042e8fe14bba5aebd16b71cce0d5d892645ab16ab19da271bf8b755d4938cdacac96e64da98c20e29cc4acfdf1b4f56851e2d80e1dd277e1fd57c86d05340b602fd52c8059e3e3d7e90b6ca7bb78087c0d1fefd90b1a17a4db4cf817b33eb1d507a83929f9099c169f67c27eb6d83b85f48da368c4ab28db4a76de41bd9967f55e0fba0a4c55aca8222a3b79b53a7cd58a462f6234c2d210c60a7adb9d69370a20993a7fd0e60f22c9a0c84f3c4b8404f8c09a47f412e9456f8babe3c636f2500f28d49dbd3abe8678d4dc2535af179d4d2dce797e0f26881cf05b0ed804922dcabef989484114dad59acd856edb10b41400c10dd2dae21503072d95f2615451580a6f8e3222dfb890d5dbe27e41b46ae2720546ce8947d2e6c8866e7467366def50ac1f37fad5169d263cff7773dbb35f8b563290a2229df50a8df80b2841ed830a81e21ffa07f2435b0652bb8c51a279e60816aed7bbfe5ea35ccc2450eb2b3fb5728bcfdd1e5357ceb26b597bf2b71872231a136e67c36845990d8a959035456032a63d67a5a30145ea503994e4191ec1e2aaa874b6a029bdd3c29cfe5f63c1694a45895bb0f30e2c0a823ea2fd6918ebd058120d24bf33f000cbd49fc7ab310afae7e6b5ab39dd9481695cc0a48eca57e98a0f6edf52dd99b6cb9a59429a51475077307a907d099497bfe9e821dec58885b34dc62a1199ec80765f70df91ece8dd6a03c839ce9b1ecb949cd63268ee59e7a64b0d670344ff31a0d3fe4c73e9e6080cffc5c19cb9e460334199c3a78bc1b2e2e48ba5946506f7a9e8b870e560de892cbb5e41a8ad262c245c9e55a720d452162b96a66686a6866a6ccb2168b8b926bc9e5e2e2ea2f5a0708a00ac46a535b6538fee632c3bda79cbb56eadad59ecfb44be9071757abd56ab55aadafbdfc9801c9e572b95c2e170de887f250ae191a578d2b860ba929caf52ecfb514d3329454f8ec0411bcd4f9f3b3e7e745aa5a8cf7776d32f33edd62209583542c757bc80191595c4e539d5b696e37a05c6568af3f08e7466b50f24d1c0886542ce34080d948e0b404850a25966035a1f90915d0da63da63271858d37e25d39540e6655e93e156503c009fbf04503c003f7b7982811f76363054e881cf3a205eb5af407bdc8f36f39b0e9ff619ae37ae57edf9db88423346d51b29f413126fc00ea73d98b781049d9376a8da62d29e3b92f6dc6d7ca19ee448edf9c6c4855a67be7f659329eb3efe2dcbba8f5ffbd3fbb8c6cd6721b1cec73205fc6ab5f2b195bb130cdb84e924242714a93dc76213047579c1d23bbcf26f2425cf5c9eda9a755f67a9ce318ca53a9defa9786ae79380fe01d37d3ca7ee536d1d4472ee6c0cd18f4e28b95df21d99b70983c6aea886a391e11ac991609ac6096d6ad9fe9d5aa0f72eef4e2dddddbddd0db7683c4c544a9807de2e2a3f90de591f13892641c15ee63faf2148a1f2cecc333fceea6cafbd6927c6f3f3f44ecd0e7d7ede1dcc621cdcee803755724de8d3224f758aa974915cd3a6c970fbe3dc3e5127e7dc1ed128e2e48473ab0326f3098d829af227a1981cd023e8e6dc52716e7150316ebec62fb3859e34de3c2d736e6ad9e6cc6cce6d13319e38b746158339f598266c621b746e8b284e14fac1189b7308f0817e53c6e6dc01686824cdd89c3300adc9e21c8faaf1807ed0b91d4ce6131a0545c5b3a27ad60a9585733d558bfbf313655e724d64ba7ec935a1dd760bdf66b3395700cac5cdc6a43b0b0f1695158fca4f41457902c40a6a1555b138bef8520c2eae2d6973903c65e5886873aee01d9cc4e2e8ef25f848edaf41829eb039b7332305cee9987840bf89c2e65c0b262c9cd3f14d709b7304a89333bd0c87c3ff40f1d7b83dc7b429e0f838c939f61a0aa71ed88d630ebbcdb91cb4051ff4e05df483ceb1508344bf89b339a7faa2699173386a70a0c2e6dc00ba702ea79ab81b4d687c6cbed0af860ad114ed6d4ce8dc0d19977302d887ada453fdcde449eda7e198885b2e88f66085cdb9154e3882b7611ce4362fb5f151eb508ca3f105dd0eded89cf3b024657171692fdd45fb80e68bc780e8077336e70240e96989016ccea98063730e00345a10aacd391c9a1816b0b03997c26f3feb51284a592cae88cce3f03f321d94cdd2a9fe66a22f9a2af58959fbfef321fc98d75638f598a9ceb5f445b562226e716cce97428dc7ada76ab8754a04b3be3d3ba8e5d89ceb564504d89ce3e83c42bfa96373ee6990b02465e1d8c5b192a7963cc553d47e966271d07cf1543f0be80423d06fb6b0615c13da563ad59f718c85e324cec22e14b8078ba3df3914aae909fda04d127636e74e989ee27678886c90406980f563a2130f28d6cdf6b4026cced9548c6b32f3936322a6d21e4fe954bf9c827eb06773ae46c5b826f425c7454c45a66322203467a3ba609a01415a0cef88d5c60bfa4158dd7fba37f48636e0d3de81f06f1847671f7be4c36fde617af89a16398f5c57ad6bafff97d307a8fd156e8e7f370f7ac375e56aeab9f188df577fe7c19bb3a71ed039ef2ab150e89c066dbc58c85b64b2621dbaf70ea0f70e189b9b717c9a9c01e5f7b8bed19b3bc640d3ba09cabfeecec528bb5bba43e85cba4008210c1146e8485d60eb7c44e0af167d1b07be38ba75f7d2254e8de30df30e3861cba97295ef70159beaeee391e1a43d825150e835bdc39b5466a1ca2716aa3470fd3889fd0ae5c5e124e88fb168dee1244ef5735d15eb6c7b9c456d156c75f38e95d1575e4c4a6b5037988c527a49baf0d07d0df04244514a5a355a609dc510c2a8292cbc1861e2c50701e4404f758bbcbc4005197891818cba455cbc1c89777777bd07e70fb5226887eae88bde689df87d80d8d92cff77361d4df1674ee8abb808b63f5175d152151c8a8a54b9010de20e2fb943fc886508b14b0e3b4001862b2a7191c312e10ae6840653d7284912499e4cd102830371050cf08570922cf0935c1159052076eece76842f00156adf50a576078ed73c6ac307e23562988cd371f8bf19a7c296b638951fd6f0135446a11d028f69b9bbbb3b33bbbb4b8feece746803407c77976e7436c18068d105b010e5e66616742bd5b12240bdf26cdbb62c7b53f7e33de53f99fb28636f7a1bf9304fe427eb6cf8f4dadb48e0f4da9f3a1b6c03b5fff43612e663303d8ca9c3ba184e359cba205ac79265475459fea8fd9a8f8f7f5201aa9a71369889b3c13a096c6f83fde989fc642f01eddf068b61c3be86adc3ba186a78223fa66f55e5eefb51650744556568cf67f061ee6ce4f3dbc8ce05acce24b074581d56c27afefdeeee1856dff9cbe6388ab23226d67fb9fbb19c0cfb31b4e72bc38f0fceda407bfbab045b315a051fcc48a23c3e1ac6cfc3a30b4cc6d051162e35c6960ef55bd7567494850918b78a8b1a8150e3df88b2fb9b257e7eac5facd84709b335a2f163e499b2e3a992072e9892648b4d0c7376447ef6b7bb522ca6ae51932c6a7758f74dfac3a2dff415c4000911484a29a5921d322600e580a48909905026a07062d54f7c71021efebf091640a8b6402285d0a2c3115478d1610b0d3a0a2962600458e504592069a2a5dea8a1355ed7a889154e68cbcdcf809d9dfd3d39806de03e22bdf1a9477cc901cd1ff9918ba1573ff297fb4a50bf10c0daaab1f3ee2b410cf4477ef16d1460aab103414c855d13f9eb83aa7a9fe655c542f3d7c10d5f885054b78aba39f0c2a546098f66bc25a32641ac24f9e32f6164057dcc43edb701fa98090f7a4a6d278cb8a27af7b1d26c2c5c8dab803210cebbbbb8b104b19cc548ed25b5d7df37f04e06b86dd89e2dbb535d3c3d3d3972701c8dd861a0f3d99ce6d14259e9a7b99d6ccf3a8abfb8cff6b030b03dbbcdaecd699f9882148a39c675c03b1bf9fe1fdbc82e067ee8e37c54bd93b67648506f43825f4b010a9d2aa03f54a420b60895795136ecaad50a0a0a0ae2968cb0b165a32756b539cb4b9be29f29a8fcdf168157d4abdc3577a94c4434b9b5571ea0a500853a11acb3ed467887e7119aa4f22f2fa9fcaec3f6cce7ef2ebb3337c56f43e5c9df4a73528a4211050505316fcfd3c43fb66e3db55aadf679797fff019bb31f143429ea9b835ac789608f9f6750f959e096f3cfc9cc44ad266a2566a1ee100d910f4d6da373569f1dd42dedbf0ee22a9c72c94e36e5bf4d6c133d3d3972701c0d1adc921dec5848e3b8a5853ad1f6c0f7f7d76a402613b210b77a4a7bfe454de479d0c32dd53f460ff467d51e507b9d05ef2cb7d1f696a2edc1de86af504ba046d002550595c269c81e7b4d4a295fc3ae547e2bb2d002938f715c8922514f691da5a5a6e2de49d5db4b94b0e5cf4cdc280653aaf313db93bdbf133551018a7c9f4062b985663df889ad90fbb88adc42f9e57452a3d5b18daa176d4e134a5390424d2b45e58f2888c8777835dd79c5add841c0f49ac641272a47e4478b5c07606783d9605d0cfd3df810f0518d1c1f55c86dedf721ac6794a0f5c3ca5159541657d2c6e88162bb9caf529042b3ba3d337b7eb66103857228fb5dd230bb4e82e529e69ae81f5a89a0cd518259add36a9d1d6a1d9bfd45d23a41adc384db7699d59e867a42f7d4a36356ebb8bb43d6a232e44056b7d005f2d4f2f2b28fcde1ef1e720be5b81fe887aaad04a891b4cebac01cd81cf6b13dfbb13027a528d47a1116ead7409cc43f27a528d4ffe7f1764db439fc0ee4abf6d8573bfbc395c50de4acd9a720e452ed3a84973a80ba46432c51b5de94e6dc02d63e3a3a6a94114d62a72c22e65ba8a7a8f9654e2527aa44bd71059402142772c5852e872e560a4850fa7209efc415f32fb3b4616510db637afafd72b53dbcf207a982da520719c4e62ce15467dd278be20bb0ee934ac0ee93466cf749225ce82a579bd38f6384d20eb573ebd591efb0ab8196bfa0bec609fde2172d58c787faf4302fabf00ebd82b282816416b55f3e219dec4e5c49a3f8257e9142dbe39b66caa0cb7768bea78ccb559d88a6531a6a1da905c3749fdcc2c8897c2752147b353a510d117465d8546f922bf90e7520fa8fa2be4936d4fe5e6d8f33d2f6ecf397dacc456dee52794b6daea2f6c7952bb9922b05c09536a73fc6b81e520eb2c0d2f289dc1c00218b2bf90b2d9dd48e4ad854b752f003900ae04a87da3648a12446628e5fe2176050a9fd722585a2f40ec792455a678dbe78523b4a24416040513fd94232022308f5934f3e0954fb393252af1118536a7f2cb283fa451e221224107018aed43a6b34840a6abf7b699d156abf73f207949f4f326c4ad0fd4d09caef10908fc3fc99f99898a72fa3c37a0d7b882814a548744e4a55aaae407b5df3343f239fd854bf14b5bf0aa5ba45c21c6a7f0dcd8c944ea4112a0959446dd9fa47a1565f6aff4a0acd2003735e6391f65a0ac52f9bd32fc345256c0bfd948b602c01fa63b818c6b2d06f02a211287e59b9746a2e8af6d2aa58eb6ceda56269b55ad9f0b3c44a11205793fa39abb6890913f57325fda5f6c36521b0d47e9c661254fb864c5d1a59e5d40a75bb1c75bb9e8a6aa2ee6b6e05eb70506bef4af0ce6ca24af52bb5df93f01f76875b9bea4715f1b55210b5df83b647e968624747be33f30dd37d936edd87cae487a25dccd73e6aafffeba30fd68f839edf63a5d78e5ac7ad60cfb1b052db7fe8209f93d25652f220131065a1ae4382a600857eada4a4a198a07bea74a05f077590efa8828e1ec0eea9566d0f7caeada4a41463ec3eba425dba297e5e4e6dce7e9f3a4606da5229a59473e54af98e75b283b07b50d5d6d322c671c58afa8227155279c1120c6050210cb8a85015a5385185922258441942f203ad547845cb912184b8c1d5c5163f108a20c85042b7f20ed3096416355601000b02c1aaf04a0ca290e669fc385ef7d57736528ffec5213254fb97e3f83c1e0742fee6f7719fbee1a9452aea1cf8e112c40227f343082184703e67a6ccb565779ab529ffd9858bea4d5c2bd81d6eb50baad3d4af5932a8fefca4394a7d9e2cd45e2b5b84d94eebce6404ad47726c38438d147600be90b84e57cd1f0ed315e55ff72c4d68821236b129236cc2c464844d684213fc1d09249cedd1da4d0e3388b33dd3835128f4364e1cc6f1f90d1e38aca3539df26a04b039fdb1f3ce9398c4a2d79ee76d4e1838dbb34daca71235e8c8448db1c6e78931c6185315fed60005157ecf18638cd1852a460405810809546cf9899da5c62d6ac46a8c31c61b75594a961c434028e68c188649214241d7a0803c157d67a5e840870844d19212450f11e081d2cb2e2855ab8abad862071981a32f9dda5547e009a04e6d8da927ba50c20a5350d30d01d0820715b878f1c30bbc60b202165e144151188dba454b10a2c2d6124dca0ff55bf85ceccac085123ec16e0e413b104695dcd9f8d8caffc256eeba0f7e0888549f765a5b6653fd348ab8d40c28e8477d053ce79b9ea1474c4e547b0a80d5d4c1d9bc5009e324f562bd39243ec7249ac6eb0ce34f7f08b963b7504b11df414a29e50f5030821720615151855505952baee400042b60384141144140c8a658416b872794ae8851b4608a1e5e43614bc056498e3046080097141900200846528600c011c5ea1a4979c1f4a72ea5f420a548fdbef20c623a5ef50e54edeea851942f5555d7e88820542d46b9c3585aca855a90ca1f3dc98e91e00ffdd86584c414779ec244acb6a2c2671eaaa8f07dc0e7221d42d4f4df9cd23aa687dd42609d3f613f44a9eaee6024f6e13bbcfa767807d3c9ae7321d67e46e21dfdc3e2800f77d48f5d7cc5d57d2aef3b0c728783f763020ee3070af69f10af3aa0a08b650f5f83f1e32e60ba0ff57468534b5424431847da9e609cfba60386f43875db1eb7752bc4abf6262e6e409b5ad60cdad4d68a446b53bbfbbd9bb3b51765377f92be2852fb073e77c1406e6a3f3f7f6b7d6ac23dde0d55054880f3dd78ab03df91000bec7cedfaf2582bf575f8e985e8b54ebf00ab8f28b4b89ec9b471bc9e694d23a830fbc180f6fa3ddf89a153bc43015e60e8f6cec7e6f43fa13efc7df80560e22f41f14585eac1962da4173d4829a554819722546104282e20c2059d2404138694219a8a2a264802bc92859222f1e33671c5bc1206108e6843b8c088c88a14459cc00737cc2956469a8afabd0f2d1e27bc07f55b24a4badf2a1da1a56e171f688110aa68b9c1122d48e2c7b11c61a5ba472104510a8660a2080b58f0e3af4ae1080d848c8c8c5870c38fff0cfe85d6353a62ca1147645a767b365effad3d7f17bcef5437e7f48257f7d30b587517e00bd9e905b9dc524a97129a60fc7d7a6e4e3fbf8908b46b3f991e802350adaed11142d81b1d11449552055a943c95f24265ea1a1dc13a0248059de8eda671bcdef13ac5af52f114151d1d2121c9d87da1df561f7513655c0f821d4542f977773b082184104208216466ee7677a1bb37ef36ec61629cefee32fce973be4318338fd9c4a07c87d9c4645c8a02e5668f2d73df56b185fb37dac389c9fec9e35aa4221ecf3d1dde411f150f8ff612f0791b17949188d062988d8cc0a1327ba89bcd41fd6eaaff5052752f0249f522aaa83b447ebab97768da3069a8e7ac1046201f9610621d01a38a255354f80fb1183101054208e1a90796a37e5b0e8690d0208a2a290a5bd48c410aa0b8e0cb1660e030742503362842020a1f562084112994cc304b99c54e477bce037a315a70a37e5bc56680a562180d84a818851edc2a5b2c11e40589269696fc402427a298004e3a37fac333685529df291d5aad563b1ce105cca473a3d93eb1031dac503f1d15f2582a589c7051e14348045185464418c9c0880c7cf004880a9fc7e7891315be0f1fd6088aab2655da3a271acc099d60590192a7763a1182110864594ae221b1850d50758b8e0045b5d28c8c60c1beb0d59f856ce4b141961bb22fa43d66e6863437ff727333fbe021419613b2b44186c8204286ac8fca0b32a48656dadd20429a0767dbc9757f743e8a509cda36b406d55e3f1fd12bc4c7d6bf0fb70b226408f6dfee90d6599e9352f6b129fe211c7bc41844c8108fa73d5e0a524377b7c733a4756a689d8f37d03142d426e1ec7791cfb055d7263ed728e37d5a4b323284ba2e33011b5a49467e508178980c34b763f4fc966f0f4de5e5d5af9432cbb239b1971c08b03a1f62523a0c1c06ac7c9a0f8ba8d4dddd2625e0869658fd9c60e0971d10afdf7cc871434bac6a9f1c306374b2f380a972c7455a45d0cf592c2424f41d47696f635ed39eb34d487bcb4166e64c2205e140b043b86e0b5c5ea406b3ede90598ff1689b7188eab0d29d4a789ee2e96f6564224ed2d0cea20ab3d56dd77972bb5a40775bdbbefac2f4b4c7e7ddaa769e6b7ab756a7ebf5bbec3937ea8cfe3a11b43083f20f3634e3d32245de602e78145aa1d8043754f351d92b38b9fa6fbe6ce74dfa4b4fb509eb3f6b2fb78ea56f82d1598d36bbf9d7a9c3ade3856c241ededdb9801fd980933691d5eb5b73f817c27884dffd6227d80dd656dcf4cdd7724eec3ee746b53fbbb9f759f2ba9fb2dc4ee386bdfa609f473d6909f1833289d018d988052f92643710f399cbfe1792b6954fb655996bd7c9f6ea19d936ec6dad4b6507b926b26ed2dfca73931804895add6e12a65c74aecda82ee774ba875be5e62d24f5a67c906beb7eaf2903c3ecc25a04832c00717ea4a5ae7e101647436fcfb23e3f77765644e640c3fdadb476a269dda8f5cb7322c5a75f96568cf480333b4b7fbdc7dde02121894df1ec6098912c3a694d23d761edda5ecba854bdaff407dc6d8b967d3e1cbce3d7670c2d8cdb781e653e343b8df8120aafafd00a26a61b98f85baec39eac28f4788ac0e39fad9cc1a5ba8df6e0fef3e8f70dbcb511bbee6de428d1f2b6cd96d1c39288c4125a0220c5457f8f0a8fbd204384cd01d361b6a7cb871c2232a61c224e878f1e85015c173e2068e14aba3bd8552aada833096a0db9768eb1be37f83aaa11bb682083b1d081dee8e7686ee0edd89488e476032bb2123460dcd8c0c8d81396d5a669a37ac563c28254d89c51831d61833bd4f9b30e639e7d6850959c4706664680ccc69d33008fc40a2800c491998c105a4cb15083119a974dca360e3841b9b1a34503364c4a8a139c26225090a5ad26a11212464c4d0901244444d141555393aba828464455252162e97164a4a4e3049e70ca537287884224c663c37363568a066c888514333234363606e58ad8c00011d61b19204052d69b5881012326268688a92942c624f63604e9b86fdf8142dc0c711047e20558007ea42289b586366d6186a52ca8e060d4229a536a1d4349865d9369526f59245ccaba19991a13130a74dc34c33d6d025284609b1a247c1c60937363568a066c888514373c36a650408e8088b9524286849ab458490901143434a101135515454e5e8e80a12921549494a2e083119f9f52f145e365e27bc6e5e36af1a2f1a2fd46bc64bc62bc6abe645f39a79c9bce82be605f33abdb697f632bde62bbea494d2a7943e6334b9c7d8d160828ec5d88ef1438fb086eacf32c687f26394cf9551e093164c663730a74dcb4c533260ca528cd221364d28fcc7e3ff3b00f7df1675ff6d134b2576dca360e3841b9b1a34503364c4a8a19991a13130a7adcad1d11524242b9292b27069a1a464d2dca4b9c91402697a8dddf421e82ae794262d738f99d330db7bcbe0e61daf87612eb3cfa64f475fe218260a26b3f87abd5eafd7ebf57abd5eaf215f6e58ad8c00011d61b19204052d69b59e2879c164c623be6cbc4e78ddbc6c5e355e345ea8d78c978c578c57cd8be635f39279d157cc0be6757a6d2fed458490901143434a101135515464456935a4a3060dd40c19316a686664680ccc69bb61b53202047484c54a1214b4a4d57a22243444833324209df01f8f8dff7a78d838e1c6a6060dd40c19316a686664680ccc11162b4950d092568b0821212386869420226aa2a8c8cad1d109ac19f9de29927d111ca8093c8c307ea0c4c741f50365fe37e99ae69ca1f406857a08461631c905f3bc1c2a158f2e72c5ba2123460dcd8c0c8d81396d1a669a37ac563c0001c5e0998586c9ec690ccc69d332d3941590c115c3d80d3730a74dc34c3332c0c789a50e8a68fca7aaf15f0e9bff74dcfca7c373635383066a868c18353433323406e6b4699c24286849ab458490901143435388888a6cd85484c92cbe5eafd7ebf57abd5eafd7ebf5ca5eaf9764254a4b344c66386b9a7386d21a2854f7bf82e7e550a97a78787e7c8a16e0e308023f902820435206667001d90076b4c264e6c557cd8be635f39279d157cc0be6757a6d2fed95bd4caff992af1a86ac260ab89545ecf41f0ae6bf1a31ffddd0ff6cc8fcf733ff7534ffe1d4fca7428cff3c19ffad30e3bf1ba8ff06a0925c503364c4a8a199e17a78787e7c8a16e0e308023f90282043520666d8b86f034a34045912c1901b562b360204c44798c54a386806674f3099c535cd3943690d14aafbbfa11487344cce68ffd56cffc940c5d7f6d25e3550a8ee7f054f7239542f13cbe70c9a583e67d004a18931c69e1707d65d319618f6d8f27c3c11091aefc8fe9bf03f53fc6f9bffc198fea3d80e5ed39c3394d640a13ac6c138fa2197c734886910c3b48c7971ccdff9b0e7cc76fe3a176fc02e4a68b3757625774787f0e50eddddddddddddddddb0218410368410c2861042c6b1ce45dbd581d07b4743b82b3dba943a107a775dbbbbfb61175386685d232f5a35092b758dbc4842d535f2a2c8b99bf93eeddc56ee36fe1a6817f3dcd1ae06a89d1e06a6b379000dcdcccb3c09683a09c8689d4cb73f9048e537c51334c524787200063f21b0deb4d7031802a5375a68ec4e0dab68b375761f528f54833176b32b4177b300f573a5947008ab1c080dad8290c3135aae349150828014456b28b5f2c5529ce24a500a6a50b4260917248104126134667d2eb62fe1c77d47653bf3bda34e3d078d7f5de030ea6eceeee6f4360cd31b1cd00f35e1eac7dd77329e1f3304414914b7ae11e1f620b07824f49b3b284f39ca860a14109e6ef6807e1e8fd6b9d13ab1759689708344bb0685e3a9183e0a158361ae61355840b1179a4e87e93e140c46f331cc3c8d4cf779357b98ee9b35bca7b29fe9b8209a51ad63de61defdb5a3fa09e98a3dccc7701f911af37dea11f31a9f5c680e7b98a732446a0b8995761d04c6015333339853f7cdb9751fd53a1397753b6fd4ee38f6625454b2551886614934d635222af2bf0423300a2459832d7870a4a3f84f5d28e8f71ec70382b40653f4c0d81596cb1a1cedf02fc591cad403742e3249f7a6e7993ac36e4c4079e3c137aaea0bc0fe7e00c87e46f9180facced5d3a90767ee9ccd1b5e53e1110015e47cacc33887cec59845397fce2e4ad3ab4c3894670df40ab7530fd6d89db9adcced796d08bdb339a2692b6b6b304a6c9adaa3c466a6c9530fafcd4159db9db92f46754ed5ad71a76e9d4f067f3042df1cc6d8157e9dc39999b48dfb6454e7beaefa6b9a6fdb729f7fc3f63e186fdea142a8c44cda688296d10c0000044100f3150000300c0a870342a1509646cab03e14800b739e42745a329ac6b21c4761180419ea8001c010430040000666a4d100d0df795064311ead65739644e40f58d6d7d089910dde5a6450c003bd139a4667ee089c9e430be73a8ea1522c421564652a7fe88484262d4c7de3442e4ef095221ccd1477b1c01742d59e3aa3c6e52e799b1cff4561f37e28ac7fa8340ae0d1068d3c4e120163cf1eea548dfe0bf4beb6593d54af47777ca04379f0fec2dd2023f1904834a15428953881b2ac036fbb044643a4427c471ec9e520e7ad5707e81ea4bb5ba0c62270eea9deb49f2f50599a0e9c6d610d24017d80d3a1af5301defb70de48e57814baa059841ad02f0f1d09b6542fb7009c8d5a04bc01bc8bd6674c5c8a265273a75554ffbfb4fd99a50221497fb1c0cf988a351ed7adecce5f0d696c3c5a6d394f4f1b5f0caab64af889fab749fd56ad7bd06a8b72d83b1130f942ea13c1a34ecbf1812577ca9ce88a0df98353b6bf924231a30d45ba4a4154174554da53a0e06540ddd5bbd80bda6c712eacb2d393e50256644ca044672ac681d5721d57a3d2b36f5405d131f362d02d360f7086530543bdd056e6eddf7109841946237ad1030cc04927252ec439263842eedde300f25ce859e460148ee615029f20850064bd01235ede6813610c8e1b4cabc0b2d70d78539d0182fa1f40e5e7ef2d82ae070ca3b048407507d8f2e7f7f9068c31a46d093d8b956fc0840cd5ae720f788626094a750bd69c9ab65e7b8035c270dd85ce8e1f1576e0f025819324b9ac586f30663ee34bd12d18f376b7cdf40cb4ed162c0d75acb7411c4bb89fd10db699bd050b32b46edfb6b6070ce27a5c241fb61d386cf492097ccc059af8a3d4e4151d119235a768d469e6e1d565b567de6a635441691c91e989be5333902c92ec5e6cd308b17a601a8b6fbcec7c83d96cbb208671c05380771a8d0b0c3fb01ce3f1dc746f70d426ba00501d3f5dec5202669d090c68718fd50413988a3736373ec778e79210a88896951cd1e514514a581fab28c82f151e4da366e94782f3f1cc0644c571be3c65830a381fa0364adf7ce615553fbc65f8f26a72f4d6fb6c8802e65f61435ca39db3f85d08bb1f76ba6c8c3e0712a57d29c52e27e3dfb34edbc418de55a8696282919a75d60a099e5817c4d81b227c19f827ac932a455832c5bf4be1bba015ab1742b8b3290a2e9b9c2a7537624ee69173af4e34ab5c49b99b3acdf78586521b7d628addddc1a36859b8f79b8217b781c8f9a4b6b5827b9a1411aa811218fdc68b5c1c0678ca25b5081c0e3152db45eadd4e8cbd613bbdc991b758dd7a5e765a9b0cd76ba891f5c209e04be9196809ff53ff3f22632d9b47cabef33078b50740ed0f2a020bc8e1eeafe34422364d82264cc67994897afd3465dfe7944a7bc6e2a997e58ef464802fcdee263af90836a2f6456aba9cc6bfcb329d99f17daf7ff2a909b494ce5df9bf31ce92bbc7ccb9e732906ad4ee29a87541ee6d76349eccf5c9d7c0814262d4badc4123a4c6456da52462decc5c576d7df7858901dc2d0dc4e88c8712637cea1d1c82ade48f21dfc7ebb2e7e574b54cc80eba0634f80db44d8dbad324502308500c92e8eef143c24328020d45474dc3a0cc2bd01ea2880f1be68222e47278a9c6fc9382b08621dc09b4729b04c0f0e63d240dad460d77ff87d4595350c42eb728852205a312d2d76990c9f1c8589fe4f5b130e2194834cdcb54bb388c7f977d7a138e3d9ff8d5caeeb69268aa4b9fc0d43bef0c71c3dbcd5f1624ca8388d0b2805287b3f16fd9a66136baef238a7c3280add275d7ef67c499c4f69a30e7bc7f668c2bed1f33779ddbd78c0dc26615d33e7df328ae240e8c8fcf4ce12012810aef8ff1cde2e74124317de6ca06c6e5bbb7a182ad3c47c65067bf7135b1ce697ff70979407b833d413c20ef708f8007b0371c9e8db0f939ecfe9e184a5acd59e91c9d118338d091aa496bc48dd9d280ae2e67272dac33c635f0a1ba7dbaec6ca50c351344113856a3a59b731fa4667cc076c0158307c29479f835bb30b24c4523cb12808b0eedc8e31e260a18082814243048c902d9502516e584269c4fc8e50a923dec5ff2998a842f9ebc68a435962aad1b0ea76b7e793a917275110c2741018cb14be13ce6526387427d424f1e13ba53b4add431c9349f50b3c61f3d8145d6be94aa1b38a8e89213b584e434a1d253546f1617772f5e838c071b9127e40ace55ff197b06f35d83245b85ea3de48088a4bd2c4597f3b16fb3a7c36cec6d56d7b1ae3ad5bdee3ad791f54533837cf5a69a32628daf4f4729ef062f0a7dba733b7c8eb1d214936c081c953662ef163e7f0ef3ac14ee73bd0ef6c2049e1b0bacc8f69514a06b623842675d886316682a7fec877e8fdb7e0ed0eac30edfc049b69a97f05533d1fc3b387705fc2492301889e45595ae072f3c8c7eb33e420846a20a5c82b23668940c50cb45c23d467fb1ea415cba14f47f037a70ee9f8735bc0da0003facb729d6a0d0c8ec68413ee73e37905d0bc6de20c572880da62e3251ffb982d41c8f2e90906532fbc2d2a7d25c6747b0511a9653a66f7ac49be061bed33989e6f61b6c90dc4be5bdc3be29e1aeb4c1a9ef16a63e094e6390511fc83e453f3ea7c9c69d8e1b4b8eb7185e9db238b3ebe78810e2eeb7ad202bcff13112d149f469f42474bea1ab1b469fb67a6fa51577e5b8ba236d484af528b1c59fab24742877332ee36c2b08022aba9cc045685f7e274b3ab3c7df070bf839f6f3aa7f978549c77b6daa1de3baf7c5921f4386ef2ff34066265667e2c45376700089aebde43b96749b8e7fcb4a5ac0119fc22ad2d841b284f0f63f353c88fd675a0f69aedfa8c5f655b6caa866868907981936b27d7f19619686d503d90c97178534ae06ac93a59520ba355be79ccd1cedd67e15497a3c997c443ec9658b23f1b5f79164d52132b29a612c6723d1eb5ac9b8fa9f21e760f1d2c142b937cf45b41e068fac75015587e3e36fb249677e54df3fe83c318075450f819cf4f4b843a55914ca0da4ea296f3f1ff1a510220a5d8ec022b45f7c97acc9a07e477da97c98ae1abe554431dd3ce5725b9888549e545ba8ab119cc04468b444d5f11ddfca9cad6e7c4eb6f3b9105d5d57e996b4191d0e3407e46d068b36518a1d6ea0a3b52f7d87251df3a36fb24a03f7c5db8c5c6302b94aa5206179293f052dc9b3eb7aabc04b4cbb80848953ed738a210d7ccda514ba9cc1476f3ee61d96f4ddad8ad5514f76c840e205457dee2ed0a9479217e90e66bcd8c31079dfd0bd32111d8208e3091f20bf4f6f4332f128b596086ad7af5e09de29efb4e7c07e657f098fbcd34112aabe7b9fe07accc09279f643e3b8541f16f5ba4f32019bcd54c1eb531607796c2d789e33ec72c23216461ffa8ceaf9fa3d866307c0a8f6e8ad6c5a0b1de239f2ed0d923623fbbcb1dd3dc3ab19e1a610974a85f73b73ea315834fa5a42b2f7f88eaca71d4ba180ad2ad6c5c77d213cfc5d4a8cb2c3e633c4f38b0f9052ec8ec2fa0ec23087d612a77d41a8ae25706f71d8146c30a9276ff05138c6b008cc40ba9bf70f9cd2bc6ec67090291a34232045387e6d696d03b96703894d074ec635d0c15fc9cb736850c7ff4f6b98685ccc06e4eff2dd1026323aeaebfaae06e2b6633b998790b4bbadca9fd68700d9338de539cc53839f6a9a8b721d880bd8d9fa196dde968eef8e37297c57dbda24f3c4def97686c7350027db4760ee218dbad664b4c05b1735c77cbc73b876000e0dab04e5c7a3b34a60dddbb1a60214d874e29bba9155e5cd1475faec963ad9889d4abcac18a2bda43ad971332e3cd0f961263b155b63b19f6689acc082ec27d2b72a38bb609078dc85bd576045873172549ad4c600bc0e1706b5bf3426dc6ca74812025330451d81d8dc643a16817af9e13385942e3c6c0de4302501a43bb027fe3d18b6e156e19aebfe6b0bf6e3bcfd181cda0ed654b92a432ba0ffee05f613fc4bea680446ad040f6d0a2ca458b65c050769f94b1fd0ff492b6a0b6fb50ef3bd9063238646f96ae75a893ae15709aad73aacc2b8a7b8fe44d356fdf879ec319ef9985ad49e17cec4538b4e00bfb2c3d8495d1480fd1f1752767a18ee8459454fce06c8b02450d6dcf50dac32e951453b0c98e1fe7e2e3de61566cd3079f4bac8fe404acf07237d0406210e2f7f800dc2534ee689f48eab0fe0af6fc8e60a821759fa76383dad01a00b11f260b7cbad6079e05eabd455f88e608c3615ae191cd60727e7de3b08ee483d60689edf9bb43f765e7e0c47ffd1047d13dac247f1268d2c8e17a765d6ff48fc1fed4b3bb443605a5ee55b42d54464497785436a0f74fa4669dea8b3921012c73af3327dc75f82126a68fa36b0e8b059e0de4009fd6a20d715fda45227b9c1d82e37007702c52cf5cd929535a777269869596a7766301d9a734b98e9a8c8701e3e1711199a014feba06b91cba96b9234a97e3fca33b91d122db83a8d142202854ab2a3232761483f03f31df63de5cc63b58cd8b61252b9507ef8bddb540dc9d8b776b8b3174dfb65a9d626ab4219b01b1018d9146f59ce21a0e7e386986366c79d2552b165518b868187328943d20724055a8b1cded27b78c287b9494110f2e8abfc61794176ce0f999953ec14992ccd6cf66c85b5ffd798751f23458e4c177ae9fb3c30bad18d0ec743b40924b4a1f2b6e89250695e6d01935e3c0dc9ce3f2c61b062e739390cf475be0eccdab1655502b070949a5f499d59b9ac08c19cdf28c1850e5d2d072bd0eb64c442f1810fea0762972bdc05e69f2dca7de0a19b63f62c1f8bad0b49ea1be7c963d85f51195ce9f1bd0aa38a80b89c22216d3e88e7012934b65db8af45671f79eff83301efe623453172d0ba0cd103319619761f18fc4e34707d1358c32015e5b58d2e1774988b84db402d051572d3f9497e57ba965e3e3cad30a43a1f25ca25b43901580108d3e6170ce01806ae1a09ebd08a04b3e1169dbab9c1aff4cc3f15fc8e5e0eb16fc9ca8d0cf9fe54a5da107fa6daa580e007636c7146ebfdc2ae45a23059b58d90f203b48680743b458c6fa916e3a368d1720cdf07855e13bd1f53e9b0853754827d16f96e2d2809ab3cf1bef14fc37c0d36679f5a0ffbeae887b99a3959b64faeddd853285608e2fa0c9bd35febed6fec065e0d983cbd8c187924757664a8a1a52b2b8239682a5f8d825fc5d821967a86390d3f67f8587cc2a46a274bc406449f1052635c7680e4e9e36f918cf459759ebe40f5cdb278094c7a3fa635c163f922471f31902eed7d9e3cde038abad625f7da1ff2405cfb3bfe5813747a1607bc223ff872c27663e9c8113ac4b81c569b8adb78072b471bf497600deaece3631666a400f9d1d4993bd3ba4a98d7598443f529d7b2949584e26a8740af14e66aeb2974dfb2908a269e07a87a3b6d1910f956deffaada1417e463f4834feb0eba9bc4e7a58344bafa5de615bab8fbebd6c604a6c28f82923c423f7b18ddbb6c0d221a0839a40a9884d694588150112893a8a72f7c1b4984fcc1f0b666d4868b0b6f46490710d47defe952a20bbe4d46929a59086fd39989c6ff4e01f33775112dd31f0a1c6b9dcdd8b1e40c4aa7e3578ba4d29742bc796cc7fff3dbea996345ff02b705e253a16c7400479fa29d257c9024a38eeff5a36f386354167a59e86e7d04bd74238bc3fc1c020d8ef2eed09bf0c5ab03ebc5dac26c2670a53b3545997577faa1e952be4843c1d474001a87bb15bb92d4b919809bdcaaf77a2427b0113d4248e67253782de84f09487167295a3aa038e9091ea44ebc09b7b2e963b73bfb07312b55255e0777fb601fbf2ad561399947d7b55b36cadfe8c39eb7f07a606a4c348d4dfb7a7fa07c989f72739c42e096be1e0d3c35525f4799d89fd26273a32b7e1f2a7e01a83b7e4029e125218276b6e5568d97e7d5f78c449bfad2b66c991452890e2ec07bd555f5c99dd50e59212de51211af6cb6827cc6f9b17381056e433a18e4f3c132a4c6fa4708fcf3078143f80a1559a6d8b9d10a0689f4fc61425db27380b00e6cca6a2b6047de0ad42af6b6b7dd3adff083c0360a6214cd9e984c8f0a48f8bab19ea50a2b93d04bd972a3a04c05abcaa20e346732c91b58a5944c1505ca36ebcfae15ad9c5c0ec3f3cb6acc271be14d2927f4afa1282d5fc7673887d6c08a279152ec4292fa2a7e6a99bf32885ef541c4fb45c9d15b181c8511ed5c9d4e44d8b656374146cad1bd6c602b892a816efe15f4234266ea2f44d45a8abd90b06e54939d05055bec508c5b76017b815c893115f164dc0b9432d6417efbd137f214c8b4370813d997f26f2f0e8c44ab8ea402d6defb8d32c1879aad03afdc204fa3b03a8ad00baa06f5196b4e0cf582ba8e2c110856ff46edd4e524583796744266489d9423e3782aa9b25c515402456613775356028df4b348b77d9fab9612c22285022b40352346627a1388015821ea8a747d8ded86809e215402a9017250fd61b106f216d465a4c6e822f930ae7f723dd1c57a98dd91bd0bc3a94b7d01560477c0846323eba415220177449bde08ed83a2c3504e52958936ca2639b5d8e6a71ca5669686015f1c645e520dafad39addb64f3cdbc510127c4e495b55201d0afc324cdd87093bd90b6f83d0e0404a25d82dc0ec66a1bf7b601f80f65bb70edbd5edfeba657cb077f4969d7c5e323f5719a7bfb8662ac24996a8f4ff1a8762f057fc9211fd0cae983efc840ec734e605f5e6509629b18e64620206d58253bb22bb03f480e42ab31a796e0f5c1ef57625322cfd184843e6bcc2a34c1f58df7222a7c3790433b7b6cbfd47646155e420cdf42dfc1a27c366d1293ad92df4a7d01a81cfbfbcc98a3de66d935c8afe64335bf1480a8af8d443af41b0bfe830b940a718fa880fc74a83a85b7952e907385eef739858601124a21e0f9a4c898b21e04eeaab7c59315e9f40da080a04b94bd2403714ee0caf44d35319f9ca87e1a6bbb5f7810a100f957f95485e85713654d9fed3233fca2ae425c10475ce586bfbd55db18562ce13e57a293b11411363781cb950e8e70e38012d6c02e4f06251476c14a2a30e21f8d950860e20028f8bab834f1efae6c6e81c0ec8f4c834273398f06eac1a065717b58410a03c109633270851a1f7636684415fa4cc530efff811b7e2571760fb11ce09e797d0e599012013e376f2e04c6c68d47cf077ad701153f3ea2fa478348e50fcb2e05a1218e862bdf9616d603a8fdfd2adff361b9fef6f8b19edfcf2c1dfee1fc8e86ee47573d83ac16d7c871877bce5751bf1fb09948bf858d43d70f96347b052bf2054008810e84037daf658b41a34c7fc8678abb1b11eb37b2de8f8389e05bcf1fdc816cc736219bae92a531fdcd671b2ea485b6e56463d81ffceeaf34ba5062eb537249b136b9564b2a83373bc8e934bfed3d8c66ad83f0e5d851d6cb23c18832a22f4ef93e2641ddf13c8791f06cb2eb2017ae72138f89fe1c85f2e57f2438348e6999c0ddd0cdf5438622640b6ee30796a4b4d4fb517e425b1aa9de428eb56285414240aa00a418661b5724124e29d1f08af8f6dbc8e834f574e6c085950342ca7209794a794e14fd583f4c807860e87029112a7c58db8915d116499f0af0a1cde3867eba69ca6fec51a16c8bdc9e750c35181d4f7b54624dc6692a9e083ad55f69109ba79b2e5a7c8706b0eef5df4ed13f955833c4d9949e2e0d44894694540fff8cf50e253a26f4c094f4a176a162a8ba2be16d894b1c4dcc572d01e04e8d3fa6c19e007a0886600ed5e5228041dea74138ce05528cba891a70b935ba81b208001a75e29d2736b124a85a6ab50e440b147dcaec352575167876bb07fba9e06f3390bf2e46039aea0188f8653456b810805cd2dfea5fb7bc626194c123e97da879e63bb3be3b830c86661dbc29d29651e32fd9ef156c95128652ab3a47c6b5fad20fe61d18d1220bdbf6ee0dedbcfb5f549e765ee92eaa151908ef72b29baed959920547f96ecf38fded3dcb668c9c703d66f37efaabc092fdb4594b46b673589c67e4df6a2dde5c9525290f9272ccc963edc4cc47133888733c4bcfae643754f248e984f476e63653a7623808c32001a191fc4ede45b04afa77da9e2524d9b7e62f44bdcf8820c421022116874f40f2338146e3137be335016a8271ba53dcbae0485fa7a147dc45253e19c2995fb68b0385cfa8ee0e7b51b0075bd75d651fe7d3ddcd948edd303d9dd149c607b32d0a90174e7fc22f4828b0403040a1d602dc520ec239a1f6ddf523322c9fcbc2ea02585f92dab2683442d7fc519df92e6f0b0a4925c5224814128538ab53962f56acfb068e00628c54edf44a2c23014629036ac7211e07919f61ca1ec7bdd6d8cdc431e8a17b15f65268d5c5b46b84bc09706b708f62613b480bef02adc1b69a6d5bf041afedfb1015a439e3fd36516eae779024b7e607e1162b1ff69c5cfbcc25210fbe20257827019ebd97ca25b9d8c639c913c715a18636bffd41acac736f050da63012a53f6c1bc918b21b064008b7c952b505e20fdf3e6ee9b3487d92442d100326ea15da1162c12039e7aeb3698754ee526c182ac4b327596514a2dd126671513eb609fe787f0c98e03b048881f613a66cb636ef4b84e0d4066f1608439be18e23e60e42ddc1d423ef57f7094587c682ef243319eb1523482389fcaf2eda2e0e9a635ab67b0b161d8c4612ae2a8f7a465881762b3bdb04203e209d4c3a5a1d307d42af73016e1c4a47140d305e5d3d32df9b6780e7f32a5b7b7532ed50614b8316ca9187ff652744db4e18faf3658f9dac1000d88cf283a3fd0e5d6ca229599e6aaf4f8ead73048d5c0803e47a5516e8e80defba2929ced244a30f268398d2e6aca80367861d605b2b6f7881fbc4bb86d0b6c03bb4704782251d3935d398863df66aaf9531ab00649afa44bc478bde633e739abc7aaecee9387af290898538521e1e1160f9429f50769daf79506e85f3d8187c20d89555cbb5c398c502e376a80b5a5d8f853ae59648e99eeba0672e121da01c3f72783de68543eb9f24feb5d9dced675119f758ef2efe309099d5c33536eea5fa0c5960b9ac90694b498f4eea9ce02ea426d14a9b1bcb9bcfe8f743c69175a6d5f83aefd3b8a60d932c24bd6bb1945dc905949138db8b41f2da228efe3e7ddc80a689e77d80398d4b50f1a414ab513a3f9abc133a91623d6d20b8ebfd2d65d872291099a3fb4c807b087aa0c1902bee1e3501cf16b2ca68898a045e3c70974da81b4a0771e81bd8e54cba3ab409e92923b0a21a569701e95f800d2f061c752c3abb3d8debf906bcad8b952344817d84a486d4828201d84bacde7a8aa2948dd5488446ed65d34c3747b3631ad3e9f16735ffc227092f697a856f366b8014bc69557d6a7062139dfcbafc5c7b1c36662ce66ff97d3778d183693ecab98cfbe941602d6e3c60bf6a9388147a45896e29d4925fc7e12c72d32a25b5b256206640e8fbd7224202e584188f52ac593e13fdc7d4a5e81337af345796bbd65894e0b5e86c19d9c8bba0663dc6bf4a4663b167bc14592577c803916b0d4e2467c1a2d12ac1463744b18af81d28cbe8f822dd51c1201c4275d6b79e3acd08b00f475003057088abf5fdaa30571ff0e62e419c8d086994cb5163abb796e86943142a8e622a6efa5ecfab5041db15e26d1ffa69136f7ae3bb9eed26407385b72a02e81f3a2daaa6e094e5208c38a84624c64f80fc81d7d9caad4b0aca4953b0eee10529b4a4272f97ef05b49630273dde627f6121e39afce8e575917826fcc131cf113fbeba77f2a265f3eb38611c8a5418bfdbd916cfaa06f4b95fcc0ca5d1c6e5bc48cc1e5d221e3664f098c008ab98cbc929299bc6dfb89ad30580cb2d69830d9a885934218be71570c08f8aac52d4e32de961368063aa7f72a913d98ffa0e09c9d377ac42652ecfd29241ee6369a7b3f4b167f4d7799ac227378aac77aa1c431796c6cc27a422919556157f6f7e7aa17aef1d26239afbaa735b7f0d4941546e6e0bc27bbd4b848c2b55e3f7b7bd639fbc31ffce601225043bc09205b307f020fbf96e734a7f9fb4919dc3c30f82b8b63a35c88b6e007f6f82ba89c30d72238288599711e000fdfd84d8d05ccce8b02f63a5ef4af63764936f48a9b443fc621cb15e439b6043e98eb58d7d2ba85d0ca354025c35524c05393588c75d4ca621ed4f66197e893b5c4e5b04b9496ea94334d32c446d995da7c8d59335a42c5a0d4ae1cda57b3c3b5b6d2c68cc873e056726b059a22e7435eac8a5889bdd2d456c6bedfe386bf519ac9dcac4740f7724eadde37cf22de3a243b3ed97a4fb834107019bc8b97092036d60095ef0eea350d29cf0be4f1e6dde1691453de32a5469d2e675f91846284cd5ea828a85746cd7346f2f8426a1c19df7cb0815d9e9d35290772034f21c756f88d5006de821cae6851125a5da3dbb48b8725fd3a31a25c3195c2e8ba295521c62e856e66d7b68c3d232e2dfd4170939f514605c2a22f3766d52b5005b92c11cc0bf8acce29789eb33ac008f303651b3ff7c645650391f46d4cb1a87a743c524c5842490101eca0a0b56eb74421541bd9f0ac39683603c50c99efc3704c9bea057ecc451baa944b0822355e3f59108a67da51103337deff97dca62378c1d07f17393775e3800100e73e5ff1c24bfcada77d9fe10226546939a9d4b58d995fe679981f0533832bb11a9dd3eb602c7f65e3d35cb15bed3a6e1d8b11e1aa40177b45ed3199edd77e0a2efd584996c46a8913c6fc8589617fdef789253f9279e76c161cbe4d3a8f439c28cd963cb8163fab40b9a0cd8de13abf7c826040a5241fa1a8fd1324eb40906f1f40f9188944362e983d39ab89b87d622df8b32b19c1dbc4d97c4fb9b4cc287ff50de6ec9487bfc6767b2f1b781c853c9f139e1dcebe1c1d7927514b68eaf2b0abeae8c442c775a20598b91456910c819132d19b30fdce330aae2ef32a90db888ef5e09fd5d747c5e54dbf130af6c29677c120ea94e61812530b76b1e60c6dfa31a3a4230c36a90fbfc8846bf932620e3e28c4e863b7992012014668cca1e7346d593a8ac436de93830077cf915f948917d0c21ec2511d831b32ecb99c77fa3c8bbf8542b01ca252d179aed4c24109a2bba3fce9bce75b80f13a3ddf96af9094e3157edf29411e677afe1127188f442ae59a6a5d2ed26c9cd0ba8d9ae3560790e40cbc829b4950585e97bdad5b3908e9a4e108f6a3274fc7915677b74a16091904c21b546bb01beb7c3fee40c8b41ffd07bca9a1187d1eb35cd2cce60b1cef23d58618b255a12ac6a5f0badb9af5abf40bf5d0f201b91b4b9cafe4b0d66c60f7146a6ee25ef7f750a81d6f935027d00ef70e9f48b75d800b0d305db87b8d9e39a1d152fbd1abe6e6dfe0340c70fd2887af99a04a36f173d5ee7210aaca7db26727a5e5e261dceacd56ffcf3fc2038d07ef4a93c12699dae49de9079616e9b38dadbe6bd1c3bedc967f150ef4f02783de16eb8b74121287049024fef877ebd8de1682faacb7962a8fecacd5370bacee8c2302191b0fdef9a79d4a18cbe5ca5ef3bad66fe55fefd8d9dc35e08e8bb11ddbcb9bfbe9b122a6b76b8dc66d99a064f26faf3096a4de5465ae8dacfdbb4840f9334475b8357d42140802c104bbbfa2fffe827859ed650ccbcf5c7dee37b288b34158a355889067261faf5af94d6d2e2cec9caca7edc1662e68a74fb41d9d5ce39fc9fb38539b89e1ad71a7fe2d658385463eff43d63f106f2171c92c559885af31c0ab7ae85a8e031208e899844278eea1d3da9aa5e4a94e8d9b73549ead2085088f13bdd567e1e2e23923072ab76220881d015e3fb390687449bc8ad829ab6286823d18bb8440dbec107c72d15f281e316e4c0548aad0fd8e9d7e7706a427ae31db9c2732d4cfdd671cb99d5c7ad6555f9f583a60930ec2da44dc5423637f9a3b655c284b8269e9a0fd9e446096468056e7a6d598190398341421726f366ee0261c6d0ad1203198378f1881d9ffe0061319105af7f2f9fe91357cb5033999c0c0f32496a4cf22878368556c146eb1ba76433e3921bfb36dc09e1fa738ef170a634a64ad9c2c93d485a7dd7d38a0895d936e29284af993f425c224c3c22c4916790c311bd120eb970b43307cb9273c98501ead19ca024ddca20ed8a78b797d4b164b3223f8a33790f94f1daaedfcdf523808207e8383cdfc5fa2913507d176d1630a08b2f8a090081c41ad355ea28606ca789cc2aacbe421e13bfffc564ea6e245acb8f7514f6f94da50b60fa95a3d256697aec17c633e1ab278fb4c4ba3acda78ffdd628cc1277f9432d2c681419a8973500ab4ded261d4b42b3edb16f4198e89302822bf11727fe79a5143b43d40dfcb1ef38a6ad491a788c4bda413bde92ef99e44604db7fde66a0ef8a3c4c3a30498e5ec09b2a65abbd1c10e906853cf88a05119aa502b8f8fd03e9647c81e1887ef754ae16fbaf6e387db28643b8b66a4e9e7faf31d087f5e1350257bc5c802a07998bf666a33fc3f60b28d9835dcebf8c5809e622378670814c30b9dd457159fb26b53e1c95e168660809b882ddc1c3d4549288db429866d34c76220154ddd4ab9e5596c13f60e13cf96bf5f831737c841c40aafa8e905cd01d7ab146bfd12aad52c7a685d8515377ebc87b2a9b1c3e6a93e0ac6a54d68a86260ddf635adaf7b09598a7d21c060a04e0c9273540f449264330a1d8d3f2a33cd214b7d4b76489a8eb05246f31457281204fd66872eb4057ed6284e4ad0f8095c26b3f54a17ebbbc427c68b12586e5104ff44053f4ac1f17aa6a8a59a4567d7e30b5394b69ac5dda4b22ba27d1c0251d2e60f627cf05e2c984cf15f84e0a9842896dc232d1347dd9a1fb0cbf58c2c039258059c52731179d1fcb8913b1c1a158858a408172d333c2f894e7877824f0b1507daa2733aaba1cfcbeaf786dfac0cf36624f6146a8173df41f0daaceb7d50e5dc2472c079d5adc8361313e20d8f575c031ede05dddbb7865d982f272dce26837d7fb61c6990e77379061ae6ce5b9fc9f3355bd4ff9a7db73f940fdfe0eb48a1152e89c4928723e9edc14bce90b22779c1b72f36bf24856720cb33f6a809bc9d2ad421fed5227bce558898c88f3f23114a453e7af0b0a760f9483396b571a37a4f255037ea0b2986f9a1f398bc80869d5d7d1de832cc72a10645984cd021c490e97306ef075a842a3791b2ca4816f3d23733ca16e917342c1203d8c846b1ab1be32eafe49924c8e1b81489d892215e90c59026138d530d1577b2f8010057e218bf92446dd05de7d6b9678420e0ffe060cb9412de06edc13e639d5a655b08ac6e3523aadd118ee1b108b5902e9f0cd94f59f9b21b25abadd84112b91a60ef254c0f394da418e64431e6eded88c865a976ae8b6332b92e02c324ce0238aeeeb94f1776b98401f04da5fb7e167fe892753678f7bffbfc1829c2ad70529723034e1bd36b9ca33716114aa3b90bd8c13b4fcdb9fc8a0235715a1463a91d7ef8814842283b1258808f4ad671c0e7611d7ff28f98300b79b63e266b7d0443ff9c99f7ca59936cfb22543b319f4ae0f8612416d7ee803b04c63c275d721f6fad0b60dc7a053fb11c72e33a78424addca64160ec17c71c5f0094cd63d2df90d565873ce629ff1f0bec2412a5253932cb1f931b36f566f757061fee36a8b4c4548793ff9e71cf318743f4a1c9488be3994f7b7e86c6e1281db3e77804bf2c7622474d9d9c4ca648988fed0e6d84bca4aac8479dcd701568470bd61f0c0b2888a1f23a35b559c0b816acfd6c1e53b892f17b9ecdb8650498a2eb11c812c800ff12a02b563beb2ef9efdcaaab337fa9572e92eba5aea0bad4877fce4843427637b7fd88535a30829795afff493e9998b5aaae17cbb6cb83b561a84061beb8619da0ca7a2e5142f10096d9890c65502ac423a1b164c23afa34de779d0ff0ef6d883f44c9628dab15b6d5dd7ce05118633e841f563d65ebd0b2614094a2e1b0de1f9c3f230f167c8dd67e2a20fe7f90ddff7b06f55b7462db05987eac44bfe9432bff0133585b7494c9a4c93b76edaff2e6d22a0e93e1e9e1985c9f8dda50822ae7747a8ab46ba238f438985335129a133fba59fcb64e969414be2ed36efd293956e3c89c5ebf846283b6a2d78cd2a5e3858e18c51cfa4255a0121b4af12ec4a3295fe949668d6907f7b5f0b9f9640b239d6d6367073680ab93f2cb1851ed0aacb307fe3145bdf49df5fbd414e3c225d645aa86c26f5896f1d7aaf13cc0a00cc2dedd5d3453bbba6830d804ad401b8fab7f6510dba3a21d65d5468e1107a7ddd63c06645ce6c7f89e82fb95439384811ad02a1ef00f16bca32421490c87f6d3d140d1ba6234ff9a3b74e66e774aec2807fe18700587a5090a6aa5f0f00e868f459d93831af24186695eb3c33d68cf6df43d2d3d1bd6f6420f1d7ef572d8e5d1d60d9f5071ffaab15d02417b4d6c94ace7a8246fb6bb4c2d45f04ec2f44400dac6fdc84798834340191dc18b137a836fd394798eed4ebfc39be3850e33893de7f928deb834d8cfa9342e2eb1250506f0d555007098d0a21cc8e4e3a636eff171ce4160a842f925ff50c3b1d257d699723b3b0d47225b092139d06c9043b87c0bd370d17064c7fa9b35ecfa6c0acd3aa3ad8170850d3c9a5d2bcf14221d77378e28dce1070af311c3c5a72247d9a43eeae38c0fbede23f500cb8a372df5b2c6a1437725dbb82f94dacfe713b8854c1607ef473d8b437bcc5866cb10a8bf9f7d056e6501d2e89ee8b52546ac2c1153f00b7a765eb435eba65bac805fe592142aeafeb5019d6d0f15a6730ce85837e2a08478c2dbef608b0c7912667f3576817d187ac4a22836bca24addffac70c15cce5604b0d7749d856cf75f7875c50b747ede9a43d3878708283283bf908efb14d4544ac28e96a7ef042a54ed91599496c40bf9fbfeea1a49c7760449c5d4f7008d7224d4b3829aac6b55a3f2295966d31821e20de126a7bc34a17d65f1db753ad4868a847c95a79b6d1b037ca9403f12639c5d94eac2e8087b0d302f914fb068290f77be34a0ead151b5e673273b54c0a986c85101d3616387644d3d535905e9baa83618092c54841479a06043804e081821364af4a5bd7151e77606ae4756e415a6debc80fc31e0f40665cb4521ad0eb25f09c307687630652570d83defe779d94d8bda202dd68b64b7f64c39edea7b911f58b975bfbc2de1c1ccd55bbd5c5d98b3e3a6a44899d4733dd5e73f5091ae98d83cce87a252d710a63b68b6b4d738e78b24b4413463850def2ac43fa0a87b9fae3d84a53df24655d86dd6a367f92eec4f52a2dfe029bf0d39fdf1562f38419a95fa3f1a9cb44d35b944c02b499304de70db1430a535522898b77eb812a54d0a8bdc3eb5c07f12e5c215def461a268a01fc77e2f3d43ae5daaf1092ad043548adba9db475f903985cf2075e1dfe217d44105466f6f107349c0290aa4f7e2f5d3a1dc1c8fde1ca8c79332014b6cc839bc05faa9e5405948cb91955c07e00dadeda8f0dea0a8e6cc6a6d93d20b769821f5aa4db2c0998f274583e6e5a648eee828a996341e1497c63118aab06c06c7195b80aacb62d6be6e8a10fc50ca56b9b94ab03a3c338e3a16be7aaa6b3d385bbea89c81b5b907a0c8c2fed07770ad3b1c8390f4c1215313e6981235160fda3bf0f46421b834856c83c6c42a575cbcd255cf4e9419f56565647bc1406f4aeceaa601732585496c4d0fa05b221b55179c211b90934b756c7c00afe15894635538d2267924c6c244a01bb536e08dcd1b35887db3d746dd7bc14923b54a3497da8637dda356beccdc18696cf58e69ab762792d874aa1e44c5a8dd577974d1c667f1e8a0aa72814bca3f937786b74a13198b9355606f8b11fb174a8b8b2d9c81bbafe90bebec204a3a93050328eaa3285f2f056199597bcc353e14b308bb5c3e22d91edd401124e03727bad236899b8fc26d0b51dcacc2b0da9414aa7683c3af2393cb106ca6223d4bcb37b77706a31bff303252e2c015dd0cd91a28fe85a9c28391e988ce70827c1db78ced988d71963e3e6de4b0588101375f33b79cb8d57c09a1c3637663da52523aab19532c031b883922e4ef836f34b515b3dee861f7907fa04c0cd4e083d68225d86851cb9f671c81672804714a9020acd0ca0be4f9c33eafd9286b844fab9c2a8580b5f79c7ed7992bb34c19eb5ee1aa38ebd620c999b91ffec0902d5fa933c47667c0628272ff3e9d58e623049ae0c3caa0f7223a48bd647a58ce1e95a62ba21b7505121cbd13411982ddf338793177c821ef7e2454dd2180c7e968f24cf53efbf7e962f769ded72c00c7312ea2dbd47ca95ca1eff0aeec8a8f331bd7405b44840cb0ba3b0cfded40a208730fe62e537c99561714de7d4f3c81e0824d7a045db8da8f9c88e1114a9a0c97e1fccb7f0126a95d942350ac132157eed442117c22cd69487a004c08d03eff97569e18adf23d2b54dbc924433b6efe4e20f42311ccdd66943bd5e31db7d4b1052446626486800a178347c5475274751719c7ff66073d2120652cdc9f1affc2a350583ede431cc85ec00dc441a6b529592a8aeea99047d257a05744f281982f8178c9a1364e21c9dd63fdae573e2b47f87b138a4b3597377a507e898492dfa61bb255c40fafc8bd9349896abe0a08b191cf1adb21432660a663656c53bae3b8f7db657878b2bb2d93e62ea399aeb6f5757e775b8e7fb3696da882d24d6f9465f1566edc0d2d6c08d2cd1a5dc56f30f9c47f78fedbd58d09ddac40b279026d513b7f9c1ab721dd1f8a6835218b0c62d8e03c6af48d530d6ba7c74ed3f11b51ac0b9a8f319ced2cd2846b6ed308a1551551dd598fd2f406e8731af3a8da3dc6fbbed744e4b22b3d73d5331bbb7245082ac9df6d72fd59db877d9b8bd442d0f671ef0eb2b872439c1eeb6b92368c52b662536b1e85645705511119f00949d5f2890652d1a71d5457674eb761b9d02657498f9b9f7bd8a2cf1cd6b1d5b45d64c00c7f2be2e546ab6e74d491898addc3e762c4476cddd4e5711f5a4ab6153e333204faa185c56c2a81628ddbf4004ccf4ce649c120d20fa33219d0196dcc0c7bafe2e34eaf327171a72a52c93528559ccc5961e1d502b158a7a701114c47f35cfedff455c23a67f5de66887b46bcda187dcb46f00c16e2225e88fc9fcbe5667a0676bbd527d371bd08eb4abec65801c226e021da0e0526dd1882755901482e8070572a43366ac23da5a14bc96330afb604b5367f64ac9fea96321efb0ddad7c329b3feee015b6a668e4473aa520c94ec95d4e367b50fbcdfcfd81e173052526cb65a34aa748476112c0c25dd60eb7a532d90f541bb948dc26018f4443bc714c6e67c0a18dacd5c6141b2ba8cca6bc820658d6de9523a8a42066fb0b3b56eed8f9ddf2d3735f87fc49ed82542fc2f8c4b1b71b1ae93c62ea07f1cc052c9dfbfa52f2f180943ca05feb7d5dfb04f57d4de9136542f9facb60af908e6c4a047496bf382a1658ec47d3a27be7027ec8555222f9f16dff7029983ba3bf0e99a913ee6f98ae03bf295f86469f935e0c0e89658d116a697009a0ab5a99a7434d55c25a770d4b57a741a55dcd7ae33ee33e819bad15413789fa3f1a6f116bd45c9cfcd8f0de0fe6c71814939633b8cc3bbab36ba416e0fc45a5ede806620506a6e5e222f0eae213c7e3a3a359fa4354a6d9e04dab5ced04bd140a0ed447f9ca458a9899933495f0337ae057093e52ad9aab05c6e4e161a540cc70e4f24bc7140ba401b836897e8651eccabf4fc3a1c0c829668dbbfc3448dd5cb20575753e7b1fb97a098386a10c9fc551021eb23eb681dca3c440b98b9bdc80723afdf5f22bbe5989755e2129648133ac04c1975118af613dfe9883d2982cfae922a19b44a875ca75ed3f5b92f704a2a0c8ac787e9f090f1b0c6f66223985544b68a5696f2afffd15601443e29d2afc6d9ffdb4f32b67e4e8720fb29102cdf4383e58ccbbafb106264e5a2fe47ff0f0e573c2e98b849a9f1b3129686a071e9b57540cbad68dd72e553dca204ee40ed99e0367ca45e42ca058f9c14da69349c183d8fc49d8236a0e81c9daed7082366627e9c95f72f67acacb320ed35c915d1abb8e49340e41bd3c04cc591a115e1664a9b6d8397097d9a6622a7c60e7869194589be5c0c7d6f0854dcb9f535625af328875c6266c3c0ff3df818ade7283bc1aaedee4b29e90666ccfe4e2b0d451f0972105ad695abde4cb846bd99573060701d477496c20f5c8a611cda86e46e6194b8b2974cad6b5fed3af15df6447fedb1922d54f71e325e7f27a8303fa42f60c14c6caab36ec22053599b1091540235472e37e774eaf461a4a64c54b9a482629495326b53b08c825e0d19a725f14d12fa7e2efac47bb2cbdc598af68f24e7f338c5d55950b2d47e09b6037e30247083a29038785da56134b57863725531cd427c13af0298dce83e68f17d13a85c2e28fe7d34a05250583b1a4732ca0090be652819091c161205f7edba145eb9f65351a85ebbce227e9aced84dc34de4cab1af36f52a01f287f1b8d58f35a17306270a19c057809e24ff4b78082df40a77de032f987d7827299f616be6249f4e5a3e190cc6aeb85ef605e27b80001a4ec66357ef621ad06649953c201770cdf8ab794ba2d74500a65aad04b9c8d793237185e79aca34c5b8d3399be558c70e4e907e9e70d798d62cb1888b1b0d6aeea4ab6c90c9a2b045221ec0a1df232b6bec70ebd5accf45927311c96e3a463d03039a27c137caff88b36ad06388da213ec1fc0c75c6c646faa14da7fc748dc01be9e6b62236053d79a50181fffe0700fd7d78815c3b99445ae88140febede19210e7dbb3db72b4c55b63cfd78aaefd598595faa58f9e72d00bd9b102bedc15fd31f33fd3a840c19987a91b1142b1f26df9635230eacc243f27b4fce3b1ef62cbcee2b30f3ac216218376d40db08bc35ad5f4a6f5ac0008a9032ed17e78798de71ba21709c63fddc113f14f320799c29e7ba89871e9225ac953bc3457e45470ede7b9fcd70714abc8dc19a4802bd06ab1acd59d69816778d55e7c9f10ed257d28e9c6e9ae0e3d53485a20ef6c2a46d6355a64ccadb040450dfa5f12c3f535c296e08e1183a685b57ada0ff8960a6a0d895e09c511fc79aacbcd03026b47eeb3ab4eb57beac82492303e129c3e168028c112518bb7ebb9fa4269617cb2ab61484914993a79a3f117434dc928047f2f549bc7fd0a3c4e593c7a554d046a94e549cf505fadc3537301f3be458add522bdcf5fdbc9942dcb34c158cb713e2df0ef0db5c7ef5500bff6bb2822c71a88b2c094d1ffc7e130a53552b4b3fab54e8372be661614df20cb7396a788eb565e30979e3c2b318a51257323b0f99ae03d179247f888ab731227111791f95134c2efd1dd44ab7857440fab93bbe07e6ca3e9b0d5468aa1c478ebc60606f5716b6a1bb53c366fe23fcdd205369178acd5dd230abbb0734270ed92436b5e73d0bfab9e956be48f2c31ad986acd2dbc06dea2763ce85e55ca73fb13e3d12fb5e8267cb7450057e4f4a0d1a7e3436ab139ec637c0cfd8d5bf14cc6e43cc61665973524a86121c07ae6611e43a5adbebe35549b42a4488fa0914243d47d13368da811e38483b67ebe5a4ea2f09a23b70dad0dd3693ba771899dce8da192f9b9536b801d3e0391968da8416b762aac180e30add2c730c85e400c27b419a2af339e481522297e3283566d296aa7691c15a87bd8c3a831ef477e13e9ac3d44e62731757b1838ae3b88ea3a5db9eb9c7b38bf16aa75cbe2ae9faede2366a17f9a208b3da4af81b2af3a7ca7b6a8c874d5f0d59e20a26143e911d4ba99925a47c5cf23c72d788bcb756a75653bd55cb0c13cb93e930b2e4ab236318e85d441b52af6793996abeac4e692961f7d335baf155068a2e99625def90b8434b80357e484381a791ed7ebf981d7dd5c202a15bd2536845660dff3a9a1ca6e9b7a2f904d1920cd7954918812ba863411a026440fbae3dcb3459d8a2c44695d23eb3abb56e2dc1935632787b33989b9876c6c3b03e50021740d3ba464d536e85a486004812ad1544ed10c4751ae13344102c44e50695a569ffe6d4083d5b26c2f46d7c5840c27856f45938bb13bd91e193c4f61c1f5ec2ce8e3a322a3b535a992633c3c82b62e5a3b81eee21d620fab80af635b1f85da35d204b07e5b6455d3db7e352f9f2968edce3a0c34fb0ac425da027b98d509d0862ad351763d7c4c9a4432b2cf741e2385bb26e7acb333b093aed231bc695330b188f140dcb89d752b9f9cf11716a076bf19690e8196f0ac4483e775625500edbb88e78a3befb70cbac0634ae3b998aa0b34db39f0c088f2196550552015a405c20cb171bccd981445b21176c24ebbbc32b2931c15a0f84fdeb8a9650f6af563f60b374da42601a6f7c9e1ac6ecb854712ccd5a9e811cdbe2229d8d517ff7e809e758bf7c03a88884bd33f7f1cff3c4e317d612e57c42af0da0deca619ec7a16f49131aaa68d42c4119565da3af3aab8804cf3e81b9c4cd389bf1c95c229a049b696d2f20b348b68d1c41441158a1a866446164e9fb4367dd861f287bd543eb164f57b1e80985bfbb0a75be18ada1ab4079301502bc7fbc086d2691082f4fd94c90c9429c99a703d724ea4287b70d58759a75ea71106b0e9745fbac0ac1d4b8d6b6c06b885413e3165f0fbea378507ff3c470a9acf63d241777f486386cbc66755d170e8a5a80fdc88d26b018aa35739993e7e8992ccb2ccd4edcba28e6cfb6241efe1689dd2f1aae17a4c1f765e5136a2288db67da39672195e702596a0b70b47299741f4e83390e3f342c046f2545766807f7b5d7ec0d867ba5e086ca36067a3e9c48ae593e101c9b517df65a4d2aaa16d3c996a1fcbe7fceb97a1f5bba29715407900f03f4e072335c34be830a347f75b74431496e01bea0f6767c3e7094be5669b514526fe0e55e808ed29f649542d2b641308cbd9b5f899d3fa8557891cc925bce017ebb6ad0c2fea702cc88dbcee394038c6f0b340db763e5fe15587df7d396da30abb4e3261a3fd41a36b17646fedc3ab94e585e989dab3ab2ccf4601e272bd1340e99ea9ed62eeedc719733b3077aecc88a1a77635003e81c1192d817f52afe089fd96df5f61f2c0f4bcd6490acbb9ee362247b8553860b5192d32b9592343c52f51897b45e3184c2986c2281572bc18a50463a2047c234fe0e7182c4f80600dd2c282209d207027be10db7e706e71f17e9c2ea51fec610fe718a5bca17387fed873dd0ecd822921d280487ffce790df1cf8e538c3d2864ca7532db8208f4bddd4a0fa9fd8b38b87c921d762cbb10b490af8262ecc0eb162b9d4218721a71c19618ec7e0392b9cc9ee104ed99474ae02a21b9af976b7b126696d075bc0c253106ad98fb7112844a6f5c91d2dc74cbb81d0225b2ca6baccdb8a21d08b3c500449aff7cf3bc704827acf1ed25ab076a0756d4f435b96c7b3f78793c311739242dff63a0ea974782d6135d49222f2d66f3a801a9f87eddbbef3d4f8bb9d14697587ef19a190562f768ee29b79563f4a7c3b9f906cf54cd1badba02d2ed7fbd5748988759103732fb186d2d1f2107ee1e8a706dc5e82149d7ed370d425a67c3f61686c652616e5eb6d782798ffff47b0a697a02a767655534c1bc1ecb71534b1798dda5c59adcf3a606a08c470d630c48c04ac34f6fca0baee01628d8b52d35257db44e995f3902ed32a84115168399107f2e4ce29733e5e9885f890cf53bab977906c42053d92b91831f42ac0f9562495c29dabe1162d57b2afc61d53cc893522818ac13cb266406b6659c2b8256401656e6cf45e43faa3b08a05dfd0307e6abd2365db2c7b13cce1b62c296d1b839899fcb4ddd31d17929822870756b93efd48f65ce56c0456ed0d376d7ac275282beacdba789253affafc7c162cb205178b92814a447c0a58563eb212e2c57693c25a42d820dbd5bd9df82c38e2e0cfb37823dbb5eb9924a848c83f5e87d53b324855499615300e8bdfc06beeb90bb2357e729f1f5c9c1ed405708ef046d602192ed4c3314b2e882ca19a175bf3a2cf2fb579ca16a4a008147684d7d10cc978abc1a15df0999d00950b92c34fec9340a25bf95e3b82f74b046c20be1ee9cea051055961e997e5c2e314141177a745c328aba7fafd05149b4430135836eca3cf076cbed9c34c3f7a93b6a8e8231266b24368a8b85c694bf7a30a046b74e25955f3615d404585759d215c38ced97abc0eec14251fd0f3541a6124ebe4b0309aad20459f750910cf1fbaaa49b7ab023a7244815e1ae4f5a299123548226d512bf52995aaf7112bc5470142587bad7258cad0ffbd9e5cd720dddfb467a61cac7cdbf0ba8be4be4d5690cc6bf9c2cc7ba65e8ba0ac2bda65aeb969502aa4a1c78e079b1cab3dcac5fad3618953660b40eb0d3487153decebee55dd0fe8f3da986268e7f980ef85395d02b277eae1a079b0ffe9df8b7a3dc7fa208125193c597c5cffb5f6337d58374fc5fe08c0c11bc6d7d114acff3898afe8a8eb47c8855983dbf2c57e0742f3e909cca9221ca770001bea85283cae48429e1466ca9669a4823e5b2842c89a462f6bad5c9b257e8ba1d1adb45382c5ac695d92683f06fe1838ee8da71a35741d3e208e664abccac8f311e8eaae2702f75199eb32efa0ba3d986638fa160096ff52c6aa2eccb10994de7ca31d1b41e75e765d546f0d29ca1596c66e0a59117b2fffa8965517c79dcc1dca80245f37960f606b468de54d8c53a481070ec5a136a228e38daae7fade7a9901044410a0622afd92bd0f75e4186316e3848d975077b9cd2f9445cdd53f8b12d9e9b84a1253f28e335bb5e6b7ca142fc70ebfb9d1a0160d6b740c7f920cb6156ace9a7ddb1eda66d2526151335eb012482b2559b3dca10980349a6a79919a7f0a27b29ac634589715ec9960c9368a5d1e5ad6a54b502b99f81a72483e6db177ab9e6a388a6350b3c9d4dc1a9568f6ab37f0ca9fdff3cebcd75ed1a9d65ac211bb086247334fbbe72d1f2a1ec892446ff72e425f1bf535a9e352d6237dba279d24f2c4cfcc15f18a38073955ad568e208d5c2fbf44f6991d6bebc2314ef3114de5d33c5825c412fe9b8e1ecfdf5e6895522a11fd82c8520579b6699f756cacb3ad361d18f726f57607606f009de77c45a37eac0a5ef501ad875632f44b65696370613cee04283529bc539ff8ab8dc71609c730c682f997548c6b0f878fa5c3a915d4a414fa995b038582c18ac14cbc38eab69a0cd06cc3829fd1955736bea523608fa040ca5f25a1c3b078bd821a093775a22e45f03aa4e3f578d18e9653a78ee96968390f999a04d4d8dfa929f14585c3c59118acbac5731584424fb8b054105c18503ba616bd91acd517c11902cca023e9b339c2745b1441bf5902189d035786038ef7468d2102e1803ee2d0823380214cdb80aefe2d9542231a63182d1a4d1e8cb9aa95c7dfbec0e45fd99e01260ccc7f6a8797f842dc1b1c4fd00adf9c01213731d793ed1ef15cead98ef8ad8600a4b6c22c0b4a6ed630fc3fa6edab6ff1cdb93da7fdb01482529b0927e00dfd849da00a5f0a3af79ca756dc81bf38b55dd992a5c4b195fbad7879170eb6583ed6e6da9567f48b6c29165e094ac78c9314885ca81dce5e83d20ad5abe1748a85a8d77797f425d0c212ecb2d9c4340080c304ee4ec611bc1b4c746c2028b213cfda833a8ab031bbdc86f1573794918cdba8b9b12446de3ab41f432c06b0473964832934b056df907d4d0886174e93207012ba0510a2a720fbc123df3d7973994a2d37d17bbde65a9052c32ea4a9eeca6376f6892efaccb15f2d2f3147e6323012227e06df99c3290224fffdbefddfc0419b35c43f3ff605622c3f1f637d705c6f85735332539ddf944f08899e9f10db362360f1fd81887d9ff1b19883e160d33e8c43303543637dc2ef471838e675033d6422e75718011fad2d2aa95b88ede49e63515e01b4a67dfdfc10a7bdea9fc44c367b32b5bf1373c93f7408590214f8917fafdac853e0ac06caf29c02ddf46e3e9fe6dd42cbdba99f3443b32c03844d7317c46b3736ff1790c121d27f58d02e031464a79d14cb8fa87a0f36cac25e161ae0c86a579ba9dddc25c9f22a894988eb3f082a4db6364d4124b163c427433707bd65f8749a2fe9e48dbb95ec522ee1532647ef4c3d3914245934d1956b65e62c480e138ea381c008cc36ebe541931164619c0423ad3f1b006b7180a670f8ec42a1c5d23adb34f94e8923b6cbdab6e9bc461c1d4e760aa02c9a58ee57060bdd61e69e418db70caaf5d627c8c28b279b0616573d1156edd31aa896783d6b9d8476c399596f6212b2118d9c4252fe9582c1d7eabfa64b63eda4f02831d2c26877654ba5bff1f7221ac21e1978691d5f0ad133cbae796a41c4cfcee54742b8c32b3b3ebf665920ff9c5064256242f9b3123960dfcd6b8b565b05e6fa4c242869cd191ecea62ea130c4022cc75d73722e90214529268a1116da3c388f7a8444f2e38fdf232d6d937a6f927ff639e46822a590bc08334165ed541fe4df286b04e692b3dab68fccca13f343cf2b7194d964600e40c7e01bd482923517bb537f3dca989c551a8677e92a8dffe401a379e020e8cfc5a50f208cb28d2277a3f0b757346c8c5949910935816cff07c5907aa121737b5ec576ba6eb598ca38df1bf9f9ce58e7bba9a326f1f79c371601885cbf5f869ef7ab61de86aab68cb84ac34d8b00719f0b9d79202e34709ccd22c865f825a4592229932b87c68c24e499a99b9be071737a506e80644bda5c286e0eb35d7619a4a482c4f07da3b2775941a499b0b3f5fbd3a203fa0d071d210b358c4f40f33f26ab5ab24db6090e90ce194403aeaecd0c710dd65795a035a4ffd32be81f52b095c2eab2cc1c50ace483e6767ff07df49f26d32563d8694edff2c0dbe650cc0e0d8a78f71854d8b0dc1758155cfdce898d62e813727465086f016468572999e70c8f7599d3a1354c71f3e8daf43b02ade7568ebf03cb076ca99107f81f04cd8748062fa4fe710ad3539493982f23e810a3cd7cb9e0fafb22b939132219f65f8402a77a4dcdf086e2f299026bd5731088b97434779c3a91f063cc9067807b9929ba5c956722dc00482329780a6bc4934025743e02e0ac2b844c3acf44352203a5947804369db5ca4da286d75d68d6f2422be879c3877257725ca3a84f81a73e5a81878164c130a1b53ab3e07a3aa990fa30144de232cb800f910443088a9cf5087ec0425b0832b30765179ff971f412c48acc27764aa2970c71ea67c2ac841c0264e80213a495c07cd7b548cff5f87453f314772d0b64523a4ac346e9a7638a9778531cbd0ecb60ebf7c801ca4a42628954b6bbfb9fe749bf421efef45f71b970627fd0832f00159414c0fa210346f2d3845a5bc917325360827db8e375bae6c56f410c79ab3a7fd70f1a0fba61c1a621bd058c16c7118420a037f5ba8d7260f0c897b19b656565d633d350859f5648c8160c63f2ff1b56819d5bc90febcf4eda5c0e7a2ef10149d7a5baa45afa7f7d423f54220f4342625a48a5878718f04888ba5c4826dbdcd4555e8075537bc473dff94aefec723d89d81838f646611219e01df5ea5515f5530b358e16783424811bcca5e5316dfb61a8f67d84106c745b0b170bbb7d42d0197e39d1a6d12114ef37488a0715d063e84e98fad7e342e2d5b3b0843cc1f456b10a9a2644297791076801cad64081674c08925bb49b324eabfe08f75c12f46308e710d3219f6941204b87322f0d3164ed50d01c8238460597a83a713ddfa14a8bb5daa0e983775317d21c24c17cc8da373c96620ff27c31f57978213bc7edaf03112cfb1fb3997129eb31d5708c2a6b605a7d4b109540c96803eb938dba7cea21c5edb5ca7255aa480ff3ae4d1d188366b91b984cde973022509fd9d301368dadd383439e5dc7eea2bb0e9cbb660c7bfc0224403fff18a8daaba7fed38c06919eea938ed5adc281643325d1de87365f00aff9d50c68036a020b8313f0a67a971cbb6350e14f0a8c06aef9954c8efb6b4be2fb4a13d688109098852e02fc55bbcc01baf052648cae44a93cca4fca29168dfea1d06b9c9344b8a374f7c1058344a47001c9ffc08ed3d0156652d9f2882615ae76d8d1377224a84dfb298c83f2cfb6c3cef1f849519c9ecf5e7e52e62ce9c66f85a9400c63fbd02b3d37e13f2c89809e12741be003afc88f995ba60b5477650f63df60bd30ad03921bb65b4c84582d912426a153b537c7d824cec8e1dfbb33b2cf30ccb31ffd013232d3d53c691cc262cc171a3ae9da97cf5fe677433728acdc3294ea79dd250cea4d9aaf2bd51a0010b586dce393017e292cc0459a835fc652d7cd66abb0500d95e3f04eb309f3ca90dfec8c1119c691fff1a04a384ddcfceb74e3162940920b76e64c80cf4ce4a5b3cd449c839b19c2e0068dd8c46fc506e9a905a4a16c3d21665a0916014aca5468390f8ebcbb375601afe0544b194eb97283aaa499733fed3944241086a1d82001691b75fc051a011e1c98651318b48b8d109d821cef3663627986bc49ddb55b93d60fd720a8759f315ef947b541981c32c403ad430e5b9cc87be358fe514d4d9b6ed211c77e72c71c136412728fb037faddf07e84a03a91bb28feb3c44a96604d781e3b8d100b51b651e029d19fb6b5261307ebcf27bdadeeee7c8fc6658785cc1323aa2a7f5d12d639ad71e91332f80ceb3111d8e701a815ef294ce7e2d247052c99e9b64413e61c87e1b7e96198f8a6244b94b124e7b2228ef653dc35b48e15a148664a360d21278907392cec5b37ab60d703ccc71f2016f33eaab3fac531ff92d840230d2a038b5e15c3e482c42b2465ee1e0542fa0dda7d5f5241cf8536fe98c4de80910eaa0bffae1397a1967e7b00f2afcddcea6023357028ec884ed5e5dc38da4d704f6259f3058d4bc2614739cc6230c9f1467c35c8bb4b6421680020c365f619a407f45cc5bc0197069e6991aac28e3f1589bb59fc99ca1b5aca2284b08e441eb576f2b708b64d414b2223e46f6fb55225005395bb1c8ef94079a7df2d26437051e149f6544bd10a66585604ef294c9bf9a783b17117ffc3a05ddd7073b629bda6a582270f3ed12e3ca40a9a83cd1d8148aef840e8fde04a4f2942b5900b7c79dd941f72be5dddea884c8421293cf08e6527400099672e1288e1ab957df1ba3090fe9aebeda5b48ef6bac2a39fbca30b5baa3691d4ec7661bcd2bdf5ec4f2d7cc3018e9e7da8f9571aa2501f9d3d5678091ae413e81bc9368f1193fa95ee437cd27447d944094cbd034a04639f5a304cca9a0e7589ed157bf66477b1ff7608fca9fdfbff9b9b3b641b094267b4eaa879bbbe76e5fe3b015a3336b8f3383f78bf2ab4a968fc14f467b68e18009de8475ceb0a13775033867d5ac9e00a1c4d5a6f5ad2f69652ca9452b009ff09ad095eb8a6db7857f58d46d363fa463fc134fa3b11e9f6771a6f2818488a1dd0eba24361a01fecb7e7fa36c95879d371110431afe5b190ebf9bf96d76a7d656fd916b7ba6a3df72a22e7f8661fc8cb2f2f8bcc402dca7903099ea45a6bad319c9925d11b7ab228d140b9602559a94af294a5861dda3ca1823d7102aa82c902ca87294fbaf8e1066773434f1625fa54cd98ca2689c6d0a40b13830c459e89145190512203021688f0c2e48a270f6aa9dadac31319ea931b5ab0b8169a685f3248d3b2da7452da462ebdd1dff1a79452002061e5652d38a4db6f474f0bee86647a59b8e61d679836600c2ef3f08e993bd2f87570154d0a799e770156f23cb6e23a6b711d851f5b85978b599ed8595428782a5c7724fe3c65b26432b71b8070250ed368f7cc73698f10e4ada265209c0cc442f66c09f6e59d1439ce10eded5aed97ec58a3e1c4d2c8c1810e1a3b3d3e1198d4c795cf0a885151974f5e3c88b9590766f6251ffbb0eddd521c6ebf7d7d1222190c84c4ca6019d3ca72c752daa42802f57dfdaa61336d4e2a72370b4f3e661bdddf5a2b8714b8f2fb8bb96c96534a798f6af795efa4cd6d9fbf688773fab794d2369b062510490c2d24619e2419a1460b12aa27ac16992254f8d61a37355902b01801451528a84070c50a2c2c9cd43047c0b086504a29e5374f6e562062840e55508e65864ea1c2e3bc10224bee8e5fab51fc54a5544b96268cf820c92029cb113b6a94c8c2e58ef6a7c097f7dff368fdabf55feb83c8f79ee9eb61cfe3fb9818c4f5dfc3c4204e41c07f3ddb2ae879dffa59f74734f9336bb63694a306866c035fa2c758d36511efc8fb22f0bda7542c7a7deb0556af138b5a2f4523ffd61bc9f73e5777420326282dedc1d7acfb23db8e5927ee402261040d9ad896e779b226c2082f9cec2281af50be8b6afa2443fbce18305f7ed17c5934df138d48903ff4a7c8f2a74a833276bef4dc9334917a35d83673cfeb231b0f31484bb4df75eb7974deb7bee547363adf45084708e97be883e52a11e80a5fff0f03cd9e6be5fb17c97759c522f99e68f47246e5f3f0ef5c9cd978487146c51dadf73a845d96423590d65961e54f4a933ff3bdb09b73d22ecda17817ec8c490342ad9cc639a409dd751fb61ec4c2c73ef20776598706652cdb8c9c8a5c2edfe57bdf2c72bd271a59978b46523462514eeb123d7fb67963ed4efaae679b0ce57bcfc3df25067105b1cd04ccdf0104a9087786ad188bdf54d11c1c047105f9bec500efe543c0e554e412adfce9209ea844993eaf7eeb8beab7bebfd5bd271a79dfbd518bbd8732eb56e87d51cbf3de251abd510ed9f6a1d8514693b2497fd2bcccd77dcff53e88fff7dcef7a1ec2513fc793f0c3856c5071509f6bad5855378765cd1df9ea7aaba3b48a85ead67fa13bb251f9f38be4cff9522c7a19c97f8947362a8e3fe6a5dffd9ce6b4a6893e4eab5fff93e0d0044ad8d1e7d66ffde873d9fffb22ff4ff4c4a27e17787dfa369da2e0512ace18505f3e8fee5d0ce2dfbd14833815f9771f447efdbc56fdee6794b65cf5bb96ab25a97cb16e6fc640954f9fc7fc2a0611833815d59fe2cc16a47b29ce5adcf179dd34f9131e712ff4c1f6f31d6934ff0efdc9c73e9efc99fd4736125adc815482064e6cce69b2d6dc8124dfd6ddb5c4bec964322677cf75e00456260c8ac359ece6f67f356883fb61b1e0e5af6003d806eb6b89c81f0f2ad8facfbb76d878745be0c7be88be053bf96c03c3991465b656947d2c55ee68afec6ab70377c04422f5c1270212fd9275fd170bd9666d38d47d0d3656e7777e26ffa8fb991477207993fce9de99e48fd2d0ed5e03275609e7bb9cefbe8ff8d304dfb1ad7b9a31a03ef822d087e9fc4e0c49e902490a7db0f2f90279cd5eafef81746fd47ddf3ca8bbdd779307517121184fdd3752f7d475dd94dbf591dbfdeb7beadea978902b7dafee9d18a8fb9d1088fce95ea7fb5619eb504eebfe25fa93d3baeec5275676bf430ae588b3ef63247890fcee7548211c71f6893c40fab00f521f7c1eb08f7d4c0c421ff66ceb5e042964bfebbc8060c915c0652f3454dd0e08fbbdcf3748f4896f47be828560d81a796ebf7c2f949d2bcd1725564daa246c7e58ec8e9c5f65ea459b78cdc91d193765b2891d6560083e4ef31acfe52e3f20dd1935d9c48e3469e5abff4db6e1dd4343b50e5e5696071848135684115a6ca39fc19dfb00fea93fd20ec0dba2080c543f47093b7653d61bb621654c6c0b5944807471eb7718b6c1ced46a6e8de25632b70e89b9d5b3b2da4d4b4c52a889d6818586ba69484b3714c4d8ba4ddf3def251ab9bef546df473ba1c8f5df090d609b953ff54d6800dbbc6f00dbe67fa291914cfed43fb2c91f69b24619cbb6d6b36dfee8cdfc8f6cdd14ce5cdc81d438f953bfa15a8326d6f5f903a9ef79d666ddfa1a38b1557efd7e924250d599a450ebeb7b9314aa9f58df25d67770075238df15ca5752656a75538c27ab81be5e3ff4c176cf77eca66eaadfb5833b54af56ef755d68821df7a1b973d87ec3c73edf87c5c23e2c96079c31e08b604871662b3afa22850f30d8ba975fd4bd148bea7bfd23db2d72d96ab0b1ddd7df81d489550d0e25d95116fa60e9f31d87d8fc00a5852cacb842c35ebab9964fbe9295d16e4bffef0322979ce6f5482e8d4777be6d59f3ac1c7b35b28698a24b1a234b7a58c346bc61b2a68d99124c29520596272d1e2693c89552ca1987bbc1063254a4c8a0851a2c2c34998207a90c0e862c5ba496f0ab2b5c58f71cde04eba362ce39e79c73ce2b5cb430320409a41470b0cd3477ce39e79c5fceda862e1560acc8a003939929407089818a2b4c7460340095a58817485071e5031a299d264652b850a384eba1c817567ee5ca085a4c388922aa34fd80431a2f8e988200586438024a0b16397421c50f3e504a29a594524aa1585862045a72534c0461a3515c4a29a594524a7718c87fecb9fe3d6c835d72210127a2f0d084e588ac2dce5c5121a74991264fcc60254a114c707028de804e1c0cab01a3d3c4b160198105154cbcc062c604ac2d9e3c59a214849b27babc98f8110f63de2031c40b356099f29c95282a5ff28d99c27577e22c2bd084952d597c81c4cb5499194baec0f04407295c38391182167bd381e86047cb36baeb36b7c99e76dda54c227b5a7727ca3a83da878f4c27c1cc2cce21b3bae7dfb1879ed37cd049a778c2bc3e68d72d95c99852ea31f3147fd0eb2fbd88adcf5eadf2877af2a7abacb2ca8e79dacbf3798a9465e8e38e3b578eb992622945963ffd1e333f03b5ccaeb1fce3ebdaf80a37bc44ffb8c1652019069779f8877f8a2f83feb43b0ce442dc7d0acbfc1ecdc65a5ecbcbf2644e29a7b5ded7f758a8eb2c9e353c6be49c9d0b3feae59fdf2985dd009e73ce89355a2cdb3fca50b2fd9ed378ced7654aeb0b92a964fa94a7052b2995799776b13801dff33bdf231a39ed8845e1fb88463d1fbe518c17ffc866413863c0051fe3828f312bb2e07bde82ef7919e18cbecf1fd93efc97f145ff329ebe0c19ef231acde81fd964bcd18c8a2714f93c06df00b621c5780c4423230c1e03d1473cb27dcfb3ade747598fc8b618e205e1d10c7370feebd705e1914d0cd916866cfb906d3242b659101ed9186cbd53fda8b7257ad50a9647f430a33f4979d0d4070b9de67f3aaf0e5d5716b2edeb20e779fe6370e771be43fb3ce128de1d91e773489c30271c7d884e8b85f07d7ff0bd8f219e7fe1c8253b8ff339e17874731e0724caa1f43de0707c9e709c97e777c2b1efced3b0861536d49138bf131e5d1d71004d03e76738d6b8389f43e684e0e384ae8785e38c1b7b1b8eaf1b13619f43c2c2fa603895427f721a94d3e4c34022973897785fbdf9e5ca3975a5c089ebc18e8ee39c8e30899daf249bf9a79b6f87732e71c7c578f92ee5423df4e53b94074d318718e29c923f522a9c54f207e7342a6a74772d58bee3c44d9c377138a93495a6d2954e257f80b03f451c8e891b1af2260a12e5e0c08d4dc0e4dcac6f119594586105218c501652104e80bb630dcb1ee9788c283cb4765ecbf5bd4058cce2f4effc8e38e67c8bb30f76bebfc551e777de493af9f3849e6f30e7efe88438a1b58285af304aabdfebafcd3e13c76791efabeeeeeef4ba4f2969f2a7264a29a54bd9b49aacd297a27bd3d04567f70ef61da197ced9ad3a67ab9bd22a25129a90e70c0116e28030420abcbe0cdc7e497fb69c68269a2128173e5f57cb342af2ec98465ff67c815becff4cc1f6bc4c26853eb0e67ac19e6d36146301b874000bb832a7c509dcaf7330609b81a890d9c47b4911dc623f5a69cdf39a44cb3a5969ad34031fecce652d50b840ebc1e6bc01c01bdb61411bc27a6aac99322e18f9e23f1c8687913101a83273c41d2d2dcb0cee8e5ffbe1e3037c9cc3ce7f2a9b0a4ead31235bccdcb6dd563a2a4f539a62f676bbfda84f4d5198a0c0708e48dd8003e788940d51a02cb5129813c58b121f43bdd44a9dd4482f9daa23a0a8d1498dd437201f8f14313bd478a48891d2b7ac36fc3e5c14d8d086871914d8d026046daeac466859e5c614793e63a8f8757850ed3c2a291cd5c74b121c6ef776766f3b291c5dcd832a0d8018294bf89005408c143143b5193e9300307c9962070402c0f0458a199271b47bdbc94f4eca62a488d9e1766f67f7b6eb6a53ef19a45e776f6d37e7f5f0a86b9da68f7db22e8da56d9b27853c2b73a197e7341b7f87b2bbbbbbbb650f0ab6866c9320d10efa9ff77ab9d0ab461bdb59f7b9b13c293d2576ac5df953865eada291101b156fd5c9f45c36bda1e9796fbd9a1372a6dbed96c456eb53857aa2893b565c95fa1feb541d13e5e54d1e99e18e526949ce8f7249e74719e5098a0cd51d254e4aedfc28a7787e9461aebfcc492ba43b4a2cd966821f6516053f4e24a52527aedc7132cd28b21f67138c1f2795eb3f71e39c7222eb8e936a86a9e0c75935fb719eb9fe136b66e59ac0b92345ba1ee329136d9272474aa95cff9142dd1fa9d4f5a754b4eaca1d698e9eb9fea61e79a2883b56a5bae4ba6749284d5f64957c73640a8f73ccb4a24bd40aa557d76d236d731dcc94ebd31d0c133ef5a58601c3d379bcc40d2b9705d21554a67021e608054d535c3db504973b36d51d3bccf5aeea31d7cf4061024a0c848dbe347a13099cd8b9a353b9ee6ee5ba4b5d7f1e9dcaddcb1d3de767ae3f7390bdff3240a2ef8f80673968e4d1555421c2e72ff831079f0b442136a71e3ec4fff7219d942871bbe27ff8168044e1874cc59521e3638044322cf81e90c882d78db17363fc8cf19e991be36d0eeac628c3c28df133902886ec08a5dbf31580443db323eeec618044b30a5e06125500c3092617c6530012c190c97e029048e67329c85d0a9e0724a26082097e07249ac0f29009c1e5791d908867c7b6f33920d18ecef398aaabf33820918e276fce5b9028872685867098c04102078704575c1c0c2e0ece5b2717a704555c9c31572ecec740229c21da0fe530c25a31d61ac0e2b8638d6b9f77b8b600d7dab74c9cb9f66555415cfb9fe4daa73581c4b55f23810dd73e0c24b243ae1b7b10248ac196007361ff02896042e07f2011f8aabae3ce7d8577ecb92fa0fb7abdfd725f4b44b92f3134dcd7bb40a2d77fef72595d97eb3d90c8555b60baadef40a2d6f5c254b99e19cf76168009e256f96092eebcb9dba25b90c30fd5a65ad65e4d8937b6bead696ee5b9b5d65a2bce6b47833bf630a18416258a48820a1f3276f4e6eb460d246a88a105092c544b77fed3a8c0dcf9b5249ceefc184834876aad3a2e14e941892a374954f02d7aa0c0823164a6ee38e34b0e253022052398b418f1e68826ee7c1848346bad74bbdd54a0c2050c324dbc6a2c819bcabaf3655ec4dcf94f4408ee7c5a8d0821eefca122a898829a536d9ca25089c2218b93275c8b2c3cd82f83a924b7be8bca13b0560008d0c5aa4b955bdf135d40a2c9480d527ed022eb4a198f893beef4383144d4ad5f65530529983441040b524800e5a6cb08902845820b9b5b7f7a7fc4a44d15140d48a84052c536b3e8d283102f0baeb0a34cc6369ccb9958106768b398d99c71a700ee9c5235dc2995c59d5c906cc982021d3c18920b5f0a3930890bae214a2fa6262da4a7ef07275e0a2e235ee850a86a458d515289e0bca8354be810ac6ecb902693470a750b0c2f48f6a6c7a30813e52d4d30f01882dba225061e448e6c19f38407529519a8cfc1a2659dd75a31e8d245959f2bb82ea6a46c8ccbb82e8ec840073bbb8ceb220d00907851e40d086a489aea1839cfb16f31096e7b9e4be9628fcbbcad3c07d5583efd503220acec89359a459250e188cd68e785b89b9bcd29f66ddb098500e0c8cde624e5b374cfe8c8858923900b7b0fc7791ba55190204284e0ae7f8e7b61a10907f8e28bac5166dd9ccff910bc98788209fdc585b12d278cbd5b715ae3a0947a1022013cc536e86d98d75f6e5aa8609edc51d4223814b19c7f82ddd35cd88fbe060ad49b9cd0b1c00e625c173dc74057566718c8a75873fb5d7a3206732c35b718cc83c2cd46b080d3ac744bddfe5c4bf9f270d655fe04d368878281fa5b0ffb58ce83d03f9c56c28f9d43a32302c9f27ba38f348d2bb6e1a9e11bb06ffeeee839b631bbfd7e866dc8b7dfef51f08dd8f7fb146c23e763b19b63a517f6d591b173476e57e574ce2879100bf510b7bebaa2e2b97ed3d2c9f11c15da9de1343f83c51dfdeaf663d52072793be8cb9de3a07339e618dbb9b66a346c038b6db4d886ebfb3b8b6d7cdfdf6fd8c6ebfbfde6485af08d9ed234fa463f358dcef9b1dddcfec6826fe4bcce8fdd05dfd0f96ef2254953b8b86cd886f7bf5ad7437965d867ae988172574daca3601a7cf93be92a754e071ba3ba7df908a5db37a96f3495297da3ab9a46f78d1ed3b2a6536e3ff912032931902f5172fb1d89c770fb1d06a6d1af139e00fb1c49a56f3813a6d1ef4e6e3f0e95db6fc39ea2a3601afdb0b0d5308d7e306c2ca75d856dc540cd40fdadb0730cd41f463dd891b360583916a8aec8dd907076ec1bece948d2153bf6111eaa27dc0eadd44b5cb0632bc16e4f550cc19406ca12942476ec250a8ce45098d24c1de5891d9bc93e15914295a62939d8b19b5e4c8ec3228527a6272a4eecd84fb72e5c18e9e2e607282b33d8b1a126c09acaa2089b348d6ba99c1c1555509921d253fd85891d7baa02aa21724cc034558769c18e4da581522e4d19aa9c9baa3141d8b1ab5e4f5db6c0ea92c552e7fa8c153b76ce454595a686a099424a6275f5821ddbeaaabb4db539c3e436e50688a936423456b779b26363d1dc1553b92bca7456bf01811d3b6b3e2d2d21c40dc9c98e7ecb80ea48921f89620a8c4b1451a2b8442186cb992ca52558ece84a4f309eb8c0d0c40506325c9450e1b2e4c51214253bfa12ceed892c24a6284aece84c2da521d24861d5e44e831d5d09b7c50d6bb29ea8f8d304538986a7efc6a40a282b382911d8d1713bb928235f0c29e253fe658a1d7d6a4c054a5262c24889b9024b4a892b29313938958711c28e4e0584a3f2059557f918afaa54b919d8e0925879cecf006147cf71172afa06046ee5576e055261ad5003c814b502ceb1bc0d0f7674ac3617e4864073c5d4c2a73484153c0c8126cab3fc4d0d76f4ac2532aa2e5a246175e982885c973650ba643d7143a2624779a34f4833507961c591a4263bca233838a9b42489ebb66407a5255176944a4762514837798b2262064b0b17555143965882e2831de5d21230b70549d29314a62d48ae6c51ca3145b9c18e92a975cb59110595155c344d81623f6ff965eaf64b2a0f9ae0f6cb2c59180f629c1a9c3c63e5a3c4926fa6740975fb5b090aa766c9f5ef97563c68e6a27c725a3fcf95f2692a197971b5aa8c81fc9bb3f5c29b5b94239ae4a465a85879b57a6d6a509222a5345de1aca865802f4a3cd95ae2914d4a59ef63205bc50ebe1448d0643372bd908ea266cae624ffc8f6b54257c82091d7d55951eb67452d57382b3ab2e590267487d41582ecb68701d9ed6f2155b7fb1a8edd74ab27a56ced2ef4414122da6275797786de6dc9cec12e1fb3003e9642d236a5b777f05506f244727a908b3d7ec82bc48fdc35f0f5f821af8b33297ee0cf01797bf077df78a2f365f28786423a2b21b52648a86c4eb3fea3dbe2cc028d1442e34d53968d7d838f4e1ab29a2b2c4b36dad5f7c49b90fad5c8a9fbfa4642e8cfefaa2864be73d9a0ff6397019070b619b2ed897ddedddd3d0f62a64dc76eda83d28e763de83b9deeeed5ddeb8feeeeb5dbdddd6b37adb46b57698fdad5aed2b047f557ed78ba5e7ab35dca1e3de99c41d26ff4ed1eece8dde9cd3b6ba55cc1c06030180c06832989599c9c17ceeb735e39e0386f4c84812f58ef4cd17df7bb9444b97f9dda703d832074627f77fb9c507ff495df0ce57fde4f7faff6140c21f43c1cf57eca64d68e5eec5d9c9e373de8aff733304862bbefd75b80840bb08dee2995219359ae79907d9ca73fe441f43f1bbe9c063e4e689d063e831f607071c4e934f073b8f5faee2c4fe81b0b4fe80b0bc7d605c597d3acd36efdc4f979a2e7c9efeebb47cb1934a5777b3f767777777beeb3d66e6f47a1e594b8fbf1abc3d677e151ec82633803c17bdcd6bbf75edf0aa86cdf762f1cbd1edefb4f30047f31508ebed19752cfeb72f878c4583b4b782fb95852e537db70792f5d9fc33de48077fd7d4e087ff4edff5e14a42cf4f2a752faccccf45be2d8ba14e7524f1c615cda458a2fb782cb5da4e0e17eee7d47df7bf672ec6875debf14caf90a03ff25be2803ebf7f55ba0582ba0a28e1d2dd11347d98591b3d369948ab30edcbfe6bece6377fed49f320dc77eefe70c9a72fa8d13fab2e7795ef764af2b90c1f673b7cbe512e56d47a1a707fb150463f9c71d7da36f6dbd8be3bc1ce8eb89b30fe4175fb03b56cb6d12174873ce39e79c5ab6d8c2ca953f63c8c7837a9aaefcd7e8197dec3352a52b9fbfbf7850470025b6fb640d17727d5f1084f92ed1fb1ed6a0025ce2d823a3ff8130c348f90a7388bd2bf6333441c8ed76f6d2fa1efc75fd9c52a34b9cb99e8a2f97e89910bbde832fa9c658c936b7a4a5284f56a6c2e4ae661645f22047727ac9a90a8220deefbdbe1fb712ff97962ddadcd77f200852ca693ba29c0af9b6402b85fdc04ff080afeb3d68bf2d90081499698cdffbbf9e411082dcefa7260882df4f94524ee340dfeebdb0ef1667ae7f072a20769981bc10e4944c8281644b34a1e594d32437a5b0f9359461c620774e5152814ad851e2a86efb3355f29c2633b3bff4319fd2e94d3e376faeebe75f5da0cb5adc58b99fbf725caed073c8913c612e51feb844ef1369e174212427ef918abceb8bd06c4eafa7dff77db1b0ef9c733a61c71ebedf2be4eb66ca35c0652d592c5ddc652f97b56425dd9d1e0f8dedfe73c2ca6f70becbe572b93e27ece77a97cbe5daf120970873c55c2e97cbe582c580b03d4ef3d6cb157af7f57a851cf0ae0b043f19c85fac000c247362b1e9e5844e385370fea3af1fb621f6e070c99eb0d8b740d87f1ee8c1843d831dc4fe85a3033bf060de97f862a059072fa7bdc41eb18379633171c86931256ceb7b7a767660b158ec5fb1900023b0b1afd669fd31716708471c3d02046169072fd08a218c7d77c2eef6dc0edc715ae3709a1c62200240d94f1c77ae164f974b70594b9698fbb95e5ec89f1376945d097ecb55410d33f687bc2e79bf594c3c0184f9c1f7531c5dff89de77f70b47ef8b8923901b73b99e9dc6379675edc73e87bb4ce8ae15c7be31317489a06520091359bccc409d43ce5bb6f1bd74fd50d390eff964ff999f681968fe50dfc0611af3a5ce7d39cd479f11e7ce2b5f3db7e70fdba8f7831f06ea8fb90e13669ecccccc93999927f374f38db5878164723e9db3328737586571e48e3b35c6da8ed3e7015f134c9897190887813c7e859681b2eed853c1072c6bc1c2ea71d846d8d7f320b681e463af49e1103dae1d43b519bad25fe08338682fb3d5602199ac7910ecfbb99b89ed86751048170693fd912de719023c3fc11751f032d1c8a973c471e882df6211cf4f70646b71ac5d1004c57e863a73c10745761a4ccce1b19c3f22b23018ec3de070fc11c679753e271cfbe63c2c0473421c9d30f63938e2009a46ecc170ac71639f43dae9b41a56d8873d188e5c55e3824d60e875e883abaeace5b1abbe17569f41b33b12c7bd2b7dc4e290695d66c22acc6526aca42e1017bccc84150cb73bf0b1cf38b9fb56add5937df7934da92696bdebce0f5609c3ef41f6c5b2d0c3f88ffc0e3f9c170e48543f4cad46cee34c1c1c1c9c9fa109325e5447fe13159ec1a23f99d00e25f54bec3895c239c36e9eb7d3dab73c9fc33bb43f799e41229ecfe155f729c0c1365cc8a9e48f95424426f87f22305e06052f3e910a3e94fd054f64f616e4b8209cd1bfe0637c18ce76c470b623ce18207ecf1789013a5970d04982c5883539580069795d03a1b33618207ce5e5ba216e799db367bd4e66ab4e0224104d53c63ccd97d5837c24b7bc4ec7649a2c6786b1afee641b55555521034d1a65ecdc9de241f25fb46f592daf6ba6dab7acac2c20f2a78d1dffceffff7faf8a40fbaffaaaafd2d18940fbaaaffaaa87c23e791015176a1f206118ef2f9e959595e5b4fe2e060f1f5fe0052b6ca6d8e4961cf12d2ee042ae25edeb738d08a49c4fbb70a4728a3d66276957b1c7a44dbb6743f1e4e30bb880c4e6089b26595417545703de352176fb93bc7c7c811a97a358f8d242d3e5a8a42fb788cb5149b7fb3eb42f36ad6efda82bb26e157ff8dd80ec8e406eb7dbfd21bbfd6065a6cdaf5efd49c51ed7ebc6fa7356b1077d797bd4dfd9a9228e2345a46d486773d2c0bcfd7ec3dd6eee21d9d1ab4924a8e4ecd9fde524e9a0ed124bf0dff153af43fee8e4ecd84c5f241353333593753925ede7fcdc71e24d5a86d61c34b5eb81a5843cffe9762967cff939efe998f9d19ef7d211823733f1d43d5826f7a1c5c4403558a6afa1953f4dd5a3c4ec266e1eda9f81b837171b05a621bf134b903fb2c5212530501776ec269ab73463a96fcc97efd1a858fbda6b799d7b1e9691b1ba894f5337e91b93a984eeaef94f0fe508c5a6d15f4397459cb9ea2a69951ba16fd06a7fb214ea3c76b968dcf2baae25d6e48f7ccf7a9d4ca4c91f1d9c1dbba99b9a264e0998cee96a9da41c1e4c24aefc190e154046bb4193d17288d8916941e3ebe6c0b96c2c175a2707cf6b87d2491e340a09b18d66a0a6c91c363de5ec9e3b4ca64fcf0e5fdd4973da1c3a0077a131d0147f6402b8d2935db1e3506d2866c3c7e3bcfde1153bf298dbcccece8cc3c809cb357a54b02c8e3db7ad1447a32b9f8f26f3d16c1ad51ca5c29b2815982e6d1ba54c9f7ed75adbf5dc6ac960f00f7d119cd632cc62e97fb114ecd838cfb356267b991403d13fe3340f8d8dd1c48eb599fc7ae79dc9e725a2d8e2f212516471c7ce758e568a8bb1a455633e076c2376e988c325ca1888fe055d58cf72e541b866c25fd84cf887829d856d34e8f4c2e152974b1c5b864b41d90a3d90a8d5b53a113665297d0ba0b0f5ebe5a823315c7939eac8d2a5f5e7bf6a388d3e1dc01256c7e5c0698dd5420363ce29ddddc5277777779fb25f3bd7ffebe934af041edb609e724e1c9df8441bca5db5acd166481bee58c39d597ef9d8a756ab31820f1c595f86a8aafacd15bed16a9886cc72c75a96cb625fc1a8902de6d0c6835cf4b1e2683ef619fdd603a8358dda320b856dbd477f874cfe8823b05feb86be7f3d0fd7776290ee5dff1283381575ef1267fe3571e6570c54bffa19db594eab5f3f0463a5486b2c97c8a28cdb1d964315bd5a9349211db52a73d4fc26abbecadf1c634ba0973e093e74882085be2394f21f61f9c187bdeb3f4f6cbd80c81fea33f931ab99c46ab562e24bd4d1a2af1cf2879e2063a06efdeb257d5848935d38434ffecc8ac07f3d28b2fc697f7deb5f624b647feec0ed102b4b9039a4d0f7f475009142afa7fc632dacc91ffa3487d653f6a4508d7f78aa255af9c37e3b246ef669320b8ad8d90e24efbbc7b97d5da3cc2fff8de5cbcabef043990cf6fbd7fbcf9d1d2cdfef5fe26cc7f7b306b0ed13dbf6fa198fb6bdbe6d2ff1e58f8c81eac7b6589907dfb7dee8b50309c9f52fa4d67fe26cfec7b8d93462f9e3fad6cf6fb5fe138d5aa251ad32185aacf572d487affe67a590b4d51ffd368d2a59c643cfb2ca0069eb442b9fb0f4bfdb1bcd910d699e68b24203153a8c913514b1446e49c9932f5524c9a4a8335777e7725411365a2e3ffd915d0be36e0ffee9ce74ce661c53dc01986760fe5cccdc62af19a873af9479824c93eedea07706c6175632b851410635b43332e490666882f1c577b2d25aa3ae9248b232bb237380124c0188ba228204575277b4566677c4cb512c48b16f03922dc858d855065b2c5826032d1654a2089b7339aa0a2e071184a91285829cac65b437510c9171396a851ab620411249282811c3840b2637de9021b5d65a398082439aabdb11596b240d4542c026290d45e342eb7294162c53522debbcd25a690650589ccb5157b8d09454f941b2f672d4151c9eb8f2441645a4086965aa0c915a6bad33cc550d449e5a628604c1c290145ddc91712c1525451452e48cd4bce63f4e4fac60c4c2de6470439b0c6ef6438341d513187861e9e5a8dc981f2ad6bb1c950bf3349b0c5551556e789f28235f5c7a390a8ad51dbfd62447dfa33e6ad77a33dcf16b90e18e4338b424943b32d55208eec863ae3c73c44b142fa4a2aa9031442d3de9d45c5145d2940a498419e248ca1b23382c490551440b36f93aa4900796a678818d1a1e8c28d964eeda1ddae5282757dc9ccb514e7277b44f83068c90220d0f52acf04413f904eadbc242adb5562b48da90a0852e7e6823612002ea85c90313921e28a53074435c86247838628635e4b9bc4f9496a66b2f476959bae3d73a2f7ecc60f065c99f389a21c907334850b88105304b6868152d545beb981699289076d6b82e471589e2c2b81c55e48b10b59ad76ad349e9a44961e5e5a8225eee68a558bf1c55a4cb944e8660353de09c308249912f2cc8265145b87407966680c10b93149535b65a8d2a92e58e5fab8146abd59418695fab81a10245052a0c946432c40a0a2570814c0a6b9a904b34704314370481c20878b805e15794c8d8e18b2263b07893c3937f2899e48eb21741d21434ec60868724ff503cd29ccd1a2b68b24082839632b51a184fa3064a22e112e4b0830b6c567022428bff20388cfb5b28773327542a31c0a188353621ae289bd3f48cdc0808bcb06213a2010b36a749a9bf6ad83c30b9a264933571c6a37e97664c931b6c426057b6fa9d68d44e048182954d488e0bb62ad27c83fe23db375f7456548d3c230aacac10c2260414c25637e8d0680055aa18926513e2512bc860abf906fd95f61824b26461a37da553d4154bf787bc19cc78d059d39f4f43ebdede3e1b0528eedeee2e9f711fdb867090f083032a574a29a594b286d736f76e8b3ed3e50d1ffbcc781835154fb6fa4e10e89ebe37c666f48db159f913847d79b98b104977ac5d2995dc18f4c18eb22b7f2e40bb1c756b73a36e672e47ddc2005d8ebae1703f64a11ad45208bac45045893636f90d82d04d10c672d44d863bdfdd8bf8e4532674b87df2d541635df1847e138e6ef747dfe64aafb790759b1d69b1eb1f631b5dc17510013c639c2fbf7f8ade112ebfdab5d2ee64d470afd49bb8e8b47d8bcfbf63a07ec97dfb7b6ebf8e22179281a5c50b2b35866ef317e93c76fdafdee9d806ffcdc969934f5934b998b2d8c273045600545d5c58b20605ef65e50e76b4ddc213160d48724aacc87a7ab09e10b164c8fb2cb1e3d36684c08eb44ea6596a951953ab21c58eb5dbbca209d7550b433898ec3834a9a8b49082d3224b0e0e60b023e3a67094bc48c17991e28497262b2f529ae84840163bf2540c8b6a4892253b8a6cb0235329cd2b8e7c57ec204204b6d891ab3e2c2cb0a4a061040b70ce958b62418a112324f880b2235b794ab92ad250596151c28f2a7664ac1615152b50210390a114a884ccf695412c95b2810000001000a315002020100a87842291480ee4d1b87c14800b759852785295caa34912e428884106194000218400008c31c42034662400841b56c86f71fa51417e37e4a71efd4006fa43a135d3dd9925766406335d98e1f3e42b414e52679ac03f9b8fadb2dee55c91f30e1778182846c5412f0ffa798402a4f097292e3f54c25f9bf50c5a21bfbc262d9f838ccf13512bf4298100996c1df0280bc341994c870ab3476634a005339c3ac35044545f0142aaafcb7d202390cf0e4619ad6342aee4896ff35f326500502460c97e021613232e30b7204cbe25e8d5798ee4187c6478ed99443a591507d17ee3f4044db28af9c22619afd3a4239f17ec93c277f28adcd5b12617c01685ea8c298b4fa3d65432d88bc90533c25157b51de23d6e2949123f0c450d880224a9cbfed72488d92710e8b226ed4321e6827097a4e04bc62e2e0a1d64c3da301fbb474a3afd9bc9cdbfe5fe9b20f199d9f0a907e4e9c9b7781d3914c58569fa7036dea1014008d1ca956e1b0e3c39d5e9635d5bedb8c92cc67d04a3ffd72f4696a91e01014c7d70bb6622a11365cd44828e603513073a02a899d4b7a23e85e5a2bda008ca259ce31112c100d47009363ef61b191bc7c2f60784631d254fd276a92219cdcb8de3125580c78bf433350ff14ba7523a0f1c12370fb631cd1d121e115a9be519f7dd5c922f02fa60dc1de55cb7e4790180facc5afa2332de183dce8bee354b21b45c62d69236ef2117f24b4405fee26f65e12f22c25bca9ece60c8e7d7dee37f2c11ec111aec2cd05792923b459d8e705ea15603cdf780e8559bc0a233c572a11c44f6df3d4f933733e9aca49e091339e428d9152f693fdc3274887c1ed38afac03b8162d70c32bcd8c4cd123276b829764c4c55610929aa9823c6b90c8ce21238edeb5e85faea737c4667331cfe8021ce1b669c6a789678861770b2a3962896746e7d7c7e501f18f50377e6323d27fadba284e56d9c46440ddd99b80e0fb7f5790c79193e6991c8db54f059fb01842936962dba14f3a73b0b4f62b1ec615d9d9c4d6d16f8b58f5f86305e517f4a1e0f6f61257baaffdd9b5ce6c01a6f85ea0dc58fa0ea13706ffa74c43727a1352e52f47229761169b983a3e23a562d7721af8002cbb03f866f0426f1e1801f62f99bb2933ba87670e11faf1e3b5903e40da79c3c87b1f4f819f9e01842de0b853f88576255d8a9ed0af895fd66348f2a07b3a5088497b9551c71de3680ae0322c1aa22931084f63b6492df2705fa031976583f01e568ece8af6c4d79ce5f5c59859e18135340d925f33139bc3a3731fb57177ebc4469508db24e289f37635f6008889323ab619f542c1f4b14be1d67b08fba2b576748c32e764558742cc1c40d583fd07b256ce20f28c3484c020155d8c8e2adb1110e8c9e3a4df7c2b33e58a9a7e91b64ea71afa9de5c7a1477e44288d3969f0dc465e5303d132924e1a10225790e101df415554b9efb7343201ce30b3b7ce9b45930a0b5ea74e296274da48b24628f4c94f004e06a5c089d88ff510c7d32d020ce5749f9dd54b6144708df323539aca15de33859670536ada3ee520a7b26f779c21fd5ae9b08c9298dc99eaebf440c4ff7e789ae30a8d221a2818c72bc07627527953e2e6e5037b9e2df569de38a95a5297d9c4db126b4c17b7054d2185549476bc3a402612353abe2e2d53945376a5cbd34cea40eb305f028f655648a4db4fefda2b4b67bf9d85739d13963ec899175688d8a2d0c33cc15831e10040f02fd3d316878e79a528b78a0c6435da6c25ce340d11c9fbc71456e2794791c94c214d9052118ed20add31cade11088cf3a407de4bbe8102d7d28132a9bec53c4881bd99f47398332c0cd517ecf456fcc1179316f452c7e6c3249c4a0165eba2ba422eae611a5465b3e8a3faf6b35cc5c1a216b649e4bdb8afd3077940ac2635f7eb166dc10edb075d5e1735021fdffd40b51fd28ac28cd742b756b4db53133ec632cb56f5942347191cd7e6302f14fcaa6645482478598055d683c69c1a592c3f6ca1666aeba3d043e40afd031d11c79084d629c932679ad7f8e465826f199954919508baa410c204cca2a60446307875713040b242b6a223352e6452fc5b9374f90ddc0684fc98add717c36c9fa0111575e43c2514e535fab39d6392017714691276deab6621e547308212a62ac848a8d78dae616383eeb0f4326fc1ef4b460d6060eea79b96318c8ea79513259e56c95160e62cec5ac56e93331a81a1639eb4b8a6a687f4c1db40cd5850b11a45db9b946fbfd284085c10500c37e26354723ce43e00d335e227acacae44a6b3539f363cd35fcc772d8726ba3f44ba304f0c2f9722b894eecc9c2da2496672c8770a2ca56c63764ca5738923b8b37d5c42a0251e6b66d6c7d9abe487c1e7231dabedab3215adff85e1fc7f6513aed6eb14bcb70c19aaf24ad82d413e364b531ea42f54cc7858d969f07116be9bb2e0300c32915da84f61a6b1298c5472abd8e95228a1c660a62563268545b54ecd57ae16fc10aeb2c9eb4855e941ec079276aeb134b1c76d03d8f5245b8379f22e82b500939b4bc17639f547948145660c96af5ce8a391dc34fcd46d3fa2b3ea23c6745f799f3c4d42e8952de67a925d8f1189692d24d0f8049f239026bda8b68ce7d62a5c0ccf09ca400f349a7631529ee4e26e7332fc4ca9f623c486b32b20edd172fccb7354c6d032b3b9ecf5a5cb960c5cfc7c12ec65bbbed92983280356d989cbb4ebecd6569020aea7e20352b3bb2fb69aee8a6a51df0d067ce3790361571e73820820437ea77f28791374a8904907a70ad84b30595491009b21887301019d8cde5688095ca3b56317d39894ddf196e1128c5629707ee3949ccd528ef7c4e7a0754c231dbac62e0577390cbd9311f60ec3cb8e96c3d4f60a1b4019771bdde4bd4a7e4b780071829878b16304288c69aebc0d34444f6ad1a07dc9f2a3083f214f54b53511246c4134be6b180219d9fda0be16a1c4d1ca6671df8f1d72fc22fa607704f52c9c810cbce163c7e8bc8843a770b96c958ae5387cb6df7f36b210fbb3459225f06b83e6c7bc8756f9403ba56ccc47c59043d04d3b750a516e60f56928e3860504956004554f6b7a0affb84a0b536980414e880133edd9fbea08010fd5c0918a1ead00e6810c51030e0d6e17c14d3ef862857e0dd2c503b7db37c234497773a5483ec6d7d9fb7beb43b7cf25b7ac86ef370a2c42ce03b60848e6f18930b6f9fe19961a6450ac39d9a55de5cb6943fe226ca981a68d77a989aa17ab483c4dd957bd2ca80f6e5f9f61c0f5a5f5967b02d7f6161d0e58a7a2176bc64f8bbb0ff17797b7a1796d40b092b78d907b9970055e4537e2a6e3713772e07a58a7a326cd600c2add81aba8dc9f1466474ee7e126fe0e021300c97162ca537083d4c88bae6313e61c46bd7ea07e456504707cd1165880b636213703c068645cf205d855307ced1c81043a691c2351e6e571d93375ecebf127be3a3cb2c2094cb8a66d47dfdf26071603385f8661f65d099ddd7c22648f6c5e861de69184ae19ca63ee7a1d68607f56aceb9e369b12e7b1ed37261d9dc1361910e633806d77a8ea7a067d6cc101f39a2503ef46247f505726e242c3d2103140f401986032a030bfdb7ce5a6b1591dbf6381ea31e88dc47b03634fb1be460c0d9d7d91d7965e67c9e70a5c833de5d52cf12f64e94ce265efcac479f97809ff9ba13cdb4d7094635a1a63fa04eba1b1b1d3b71b3f2c2b2716cb92b0aa7922872de90d4be1bcf06ea21cda6653e7f2df5f3aa0b33ebead26ab7618e26cea3040d8b83406460f79390839cf83dcb63d26280333194036c26b5716aa10542667907dbfe5d3f1197b4aa0c4e85596d297f8527defa46280de22946203a49a2b48b363850ff260061072a49e42a7aec7b10d5b4e672716cfee4ad125bfc9741eaeffb3380c34cf02faf2be702901256a5ed80e4f684b87ffd87d962c46bcf7bc11b667d728da01e4f5f17adafc0e7e61baf43e3636b695266a2433559bcf5d7698fc913c59b518aeb4b6c66e8e8c37d30ef931212733329cdbfea178dd2804411f2b6591fffd5144a787f4b3cdb8cfd083257d81bdc4edac8fe5c2844f8228b6cc45da57d72b8fb0f62f30e42bda5dd50fa2e834090f509caf7e35bc5a4d43ba829916776256218d8d43d1094fc580796356c45ef880bdd476bbe9e933150892ef8a81b897fa46de126617d52c23c9d9d0aad823cee0e4f2bbbc0758b2ab0ce0d4d343a89d4779083544521a3b80480319c6f7d9587e08064381416a74e492478bcb0830a90598b90a2e3c115ded0db6fb04a438da79ca254c54bd77558ce2612800a7db2cfe7917076b8df4cfa1cf1faf20a668dde5d128fdca12374ec36fcbb1f77f7f1c9ee2bf12a744b6b53137edcaa9b776ea94f34c1e4cbcdf2bf02092e0a691e2883f16c852b119eb012640e7cb697426b133703df66e6615fc8753cecf57e28ac8ae88a6bf800b5da25343b89b6f868393bf0c79ce2719fb825b9568569be30bc3d5806aaab6a19f2d056857d275d563211d0c11d40d06f65d7a260cfcbafea4a6bcfd422c60ec284abb50a98465537bb4a7c83322aa591b6429b3a6698913153b799a0bf09cbefc7714b60b7ac6d3e20f984bec3620f53ae44153540daa67034fc85b09aff1f29cc015478da5559651122ba8501a67ea0ec02db71dd865bb49b381374fb84a23e44644badb7f17a6c4f606f6befe6b6f89a0510a10677bbb4d7e9e165010e3646b67beb85eb102a628ba121075705e536eaa2d6fe55bf0fbcc4250cf007ea711cfe59e5b6720850484d2890d591e5d12de986e75afceb10620b96f6ac0e27c8ca34fe4ca17b1a0852b392455912f45817f39cf02a968331031c823ed8e022c0d06789c61eda6832e9c192ce590b5ddc885d74fb570828880086f5ba29124dc73c9e1f18f8cb83a1eecc8d51ffbb0bbfbf4e671ea104004c4a97b1aaa346a87e02fe9373371ee006d5a4d4012c166c0e3f40a72c77a96bdde65caa49d3f084aed6f65c532abf408ae08cf3b513491a7e09140d7355c89410f16444cd855626314a3bdd0af929772252f17672207cc8239ddc75418d3aeb0e598d4263cd3eb0c4122b866b042d4fdd6cd32b200b0ab1e8fe08f5ca4dbc302807c2cdd494b91dea769564b1aa9d4d83529d1d786f471db47f9dbf812c3843e433611dcd4b07391db4d6e4db7ecff3cfc0c1ade2f451be34cf7d00d86a482614d1b015dc99437ab043756346f361466ffe977d8c6a4bedf4a37414cf7f8814a98a06a4d11ef139081432eb85e856f033ec62addfa2f91c683f52f6bc17108662b6cf4a899fcbc4e840b858fe3127d9912e4ba84352f88c8d34b4338473dc94c206deef759957c90157d712a0e534a485a8ea755d2acd8ff22b5ec754c21487e5d96551e275b10e20338bb0fc243cdf6511a04d66dbcd9a0c59b1657c9a924c78be832b1242a65c02f041293079ab2c598aeb600211b909fbe694ceb1a91faac3f8037dc370d8af630e4637d8644b517309f9074aba1c8edbbfb857cc617e972f10c672ecac8da1ccbc7c680d4d8e38dc6f83865446736e90b4b6540e1145a7e7d4f201833df2c22317721320a43f922a629b197460b21bac26470e3012cdbc5d384c5bef5209805648a41a4c5126e3c7129dbd1d48718bb316f71012f504fe1687cbffa8358f0667e528e578a0463ab8839ba62bfd36e8216d8d9fdf301723527c20f87cfa612652e6f657fc92d57f98359e733d481e8f1cb9ad14cdf7f725920572c678782d9271c8733aa1629a9c9dea4012e5b0e8117f1bfd81c74324a28d92661c9376196bb0ee04e3883889fd99a18a4131d189d9a0ca03e73d0d6c167d53c7f58db13aca35a323c572473bd03de31c1d69aa4337b8a794cf5ea962fd49c035137dc600bdeb23f5fbb080f30e7bdb3c5de8a24954aa534d0ea27fc20270eede74fc4d270781c39119a859af32ccd19c9ef0875032448bc93808db1c4304694485f53b4dc507b52879a027adf3476269a8434272bd12220505682fbe978702073925255462b3a5cb14d90742cc29592266dcbbf28dd6c3571358bc6428fa28993e333189c60b9821cc89f813ca58b0c6a3da74fcf0387f888f1943a1e3306ee4854577b25500dd28a84ac5fd1026f76933435ece7f38bccb0ef16c744284abf84f3a24b9f03d81a3c09449f6e2e7f684ae73749e08bf4992cfc9d7e4e95f3045ee15746c3aae5ff62b10cd9fb705b9eabaad56ebf5e1d2a4f975dc27965097c833016d59eda716530ad9e29e58e2f2ba171399cc3303e5ae3907584bf5346e6b119f0b0a9fb2f5a617bdefade95f4a36e2861a4ccc047b3a3f655b4ff9f65ed139f7c1308f32a22c6f5b56c0d38054d024fb26ad4b7c6220ffd7912ccfab37b59590f1a3490c53afa5870b8463d7e6251a9448d575e4327039a2416bb65d25cfd6ee136d595e6bf28e96b60a58590a805f166d4d0c8ea09eb431a81be04dcb6a5475dea07f0593afbc7dd138a9ff99aac9778bf440d3e8473fe34a663d0c018faeb09bdd5c1d283ac464cefbebc942b49ee6f4bccf3c2e59248cd7bd3c5c0d93c9b68e34c70403a73e2d839b36ad4b424adcd7eca3a4b34b2e4aa294c847bf977559c58eee92299ace0fabd21d7439c6659d7c74ddc78e9d0710354e45f45f6fe396a247be17fb7067eeb344b000787dca4e003d133fd045d75c97e176320d3264fa91324411d3d6080cb99eb2332a26f204cee4d7ce2d8d399618481dca8d8bb577a183f1ecf971c9b94ee228dce1384ee7c76a9715861055cb09a933ab602b2920d41091eb5c14ff15809430c901aaffcd70ecc051e87fa6d62f9a97e48e4a60347f96d0bce2e8dec8ec3ecafd291b9a2dfdcb1219650d1bcd0b4685a4b6302c3351a5f030a799172a6464d3032889fbe1777d41f42a5959442551cff5242c8247a03750457c416f0662b6041352d1435855348f81566769593b1c8eca46e86ae44ffa4eb90a2af3789d3ab3c893b54778742271342e390c1c686d59a22586fb3ac42439011697dfa5127a83f1412d36e3dcc7697087d07b6fa472b9abfa79535fde6adc820c5f0e65d1cdaec158fcb0fceee5641ba6ea5623b95410ae1367bd55a265c78805db58af2fc062916dff637a9ccd0afce96c349867ae41c7a1686d68f056219aacc81a8c291930f9f4602a9e861aa0af51710e05c594434d56445f23cdee64b8c5d43eafe2e6904e97a8fe59b36c8ad1e7e8574ba29ee1478a180d0bbffe8e5db0eac4b47f9f78d91285fa3414aa7293409848037188c0750cd2a349948b7c32795d0e48b4566f7255249f48d56fb2d1785ec3e4934a3365cb35af90b02ec768685ba199072041c4b3d6fc7f099495ae99da95255adabc5fc6b3ea26ee056a445950003afdc03891bd0964ae84e6f6361b98999515378da4037c2b2dba5d5f91da039afa378fc7a382be0079792ae9fcbb5e2920e4514c155eb025bd08bd142b5bc67fc3772fa6feb355d02c50f969b281e43804804b5b01703c9fc386888d4f3bc808c61412de13a3b70e66518e56ec8de304b2901d789effa31cdc8d12331663a1a9c61f62c0584c99f5ddd782158e3df32f5509d191e06bf97defdf704688d80fb48b68b42b0e009005d8361b758ad1fbcbf655c4b2a965449a359738c91ea7f13a528a83880022c893f51020941815c8f6996c36fdf537c9ae3e11272e9334a57a911f8a563c47089a4f33c6b05bc95c002db0e040089ba31503222b6b54525837bdc6966df58548e790a38941b7b28df87bc6c7c9c66860a15913999769cc125ef58f83203833625062ec5675aafb700b489366786c14d621ca9edb5297f590ca43f71a2c93211cd7e7338dc1dd8ebb1015c5d12424470c46a0dd7a8f2862171319cb482092da1a9866e56b5f20afc1cdfa0247d783368164409d05f95807e1f7fdc143ead9269e916c125dac91d2cc0b267fcb641e4c08a28067b4508b77d106fd4849642696f820982df7344ed9910a2004ccd8704c2cbf10917ad74c242e5808f9e39122299a3ff4dc66f3ef957666564a3225cbec265086bd05351c3ecbff9c41219ab8cf3ef1ac58501442b083c09a8d43b26b8d1aa886ccb046d04e152f471b77432816139a18ff6f20edbde91351ce7c4f4be25a6109812ca62dd66eb558ad28fd6decc03263fc7ce143f60af7575d2048213b5011b78ca3e2c78c64dd6e38291b46b34ae6abc1f188057d17296bbbecd5b08c0395120211f3e9e2d588d34975f8c6cdaa3929ef58fd1f393b085bfb0deb11b433c449961c48195ff4011a493492fba7d4e54e94a3c38d1521280116ba5ff19b627d858898c403b4dcb0d1c80e39fb9acdb1b836d6a7605e93281cb1f64746e6913a8910e27abc301b4ddf69a77038cacf1f36a4ca51706aadebe9e0313585adf901482c0de6b14154724ff40308a4076d024ade8b088441d7fe1d17b15bc8bed23921b6101b05f9436b382ebea409e6be863b340cfb103608a87da97775e8cd056c688353112942790ed56ab9da46322977ba0c426af2046bf4025cfa04ad8809dd04d9321f7087b135cadbaf5126dc5c1182421496f8b50d230f5d9a103f0fa1a2d42b4407f876a92b416be125ac60f0c9c10ead93145134cd1cd8b968768bd42af51da46073c0a19dbb405cc30976c1f3874324bbd425e846303b8c8c01542d6863233a122c1144910a8b2396ad987306a4a2dc8273a40d741b60625150922d0167738bac7e4f6b6ca52ab1cd0ada5e55d5d5752d9019f707206290d49b31c3018af200419258098cd159141c34d1fd803ad74a382a4fd32c57d11a932a0c6d9561fe176513e0cdbb61cee338fb54769c20084255b3ded5093fe0783796b18b85d5d93e650f5e39c53e317bc0e881a75c542a36653e517bc0525f5370c68487183b6e3c4f7e9e9ef258a0d67e09474c70c475e761cbd19bc62cb9714c79e9cc13e1d884e4c226f133e181068456373ae0cdae6b2d141dc72b477b0d864a57f5b5d3f32b6bec7e8d262d8a694a030ea07071418da035f40d4bed45df3c18aaefb09817a51e667e81e97d077849033beb4ecf4be80b504de9baba66bca16141bc89bdeab8bd66af424b266e6fb79d09ce85775615d43a99ddef8ad2f6813a7b0f8603ab8f6e6ff9b3064fef8b1843c8915d4616921e58c93593760469b8dad6017e6b289acf31b8b2ca59570ae8bbb622a1538cf7bcd7e41bf59101d56634d39064217d21d63ec8cce3a1b746ef54fcd124607fb34893792122e5cde06d875e2a7330c20383d2af3b07dc37a3389d1ec6197ad2e0586a46d700cd656a339bdc00792a796e3a07131a01a9f47d872938a326074abd889f81f8fad0f2634c1b8c6eac8af67ff9fc9ad0c1a862748e04fad1c8454e6cee6fe83804a0f16f68a6b4737aed674b5caf706e8ac8ef421e6e7f434e799bdfe8426c359764492900d6a7f1742e3a32a0277731c82430cb7bf2c4fde836c50632ee7cffdec82c03e336a1042d3307239ced5b886bc13a23e0a7bfef22c1721d97214e8c50fceb2b4189a583610eda9ad21a0a60866a165a799184b520baace846a7e79a6ac1dc74cbc53c67f30ebfb622a9586a3714e9592da159a5debe8ef376708fd5dec1b17e83d5ebbdb41814935a69ac4c5194d13927bf7fc501a5f5fbd929251f9ec33800c5632a1236f844a75b49106adad7254e06e48a1b13ae4cc0f09463d6ff283e68cd7a01c52720e0c22c9140447295798afb48c93c242df820ff06d70928fc6959be3a16cac9854b572de7f7006af27ec864b576f3b4222d91ed2aab11e66ae912c1040e0a1cf1cdefec6eaa263bbb85ae81c724145f093520014597200a9710d9127f0b3e6601928453910e17a85f1700038486bd8c132556b894455130a96cab26441c0bc9510a2977e87ff002991331f5aa8d4700632fb2f11ddaef0203ad8c14e2cc2cd7dc0163e03582a78a78074d103cc4790f0325056dc2f044b37a80ea8397ebb9581c5d22123415506f9a081e9424dd3413000460cb144a8f093f619971faf6d98a3bded5c8150e7413166232ed59b2a4f099696c62f47a84c39930d26ba981b41aa55d0469519d6a4acb8269aa5471e45c94652ef611a88460bb31c7bb2596fcf65929e2ca36297de3ff4e6027e4d503135649d8fdd91669d324ed39a1061a3439a53a5a60a326dfeb45eec36f832018b5b444f0bf1524b45cdbcf6133bd96a4dafa1c9efca189f8e1260cb2246d8f02c4842406161ad13ed4a55a87b294eb4789fd175437eed5b028727ffe7439b1c3b4962407c30ae26991404edc855c4a01c5b54010584e81680ce4808f1ba314b00ccfba5f19c02ca4a4e14357bfc41f98a3377238f98de8844d1c3ca022591707774f4352b2a1c5d3e856ac9f5660bcb587e8c3580d6c76fe9c396e06ac5e8040ccaa46037549f8d900d9c29c40f96a1863c86aeb7c375f5d3c484fb534902702304fef264025ab229fe65e509871800b224b20ccea288fe7a38787a3b7442f300101b79ce690583384cadcb2546d468d34318fb3280a853cb6d60bd4f33d2143dfd03c062772ca6c9ba4317a3b61dc658da3e35c91a2fc6e2b1552579c52359a109e27667e7294cffddd04a0937808253b7f84dd977f9a1e00b88a219ea7dc50d329fdf0d9d0ca0c23882d1aad09353bb1ff4a53f3250949c67d1da8d420556b4d399de51a0c1dc77b64dfd5c669e6d84efc158fec2313fe629cacd1733c4a5f8c71a77218f2a56950376c64d7302c4b56c31fd3d44959d6afad7bdd39dbdb4d514855c480f23d106dd50844209b0a546723a4c4c82b2f1d71dc3460338f8d59c139c842d5b22de4709c1317182084200a338990fd59f7ce54cd90991d2128454a0823be45aa93e14446f90d808f06ce74c76f3ed2ed03b0dbf5cb80fce8936eee86dd636dba53a6c66c51b567c1262da575c4e3f6bae55ed01830892898fa9578f4596ef081fc05ad20c6c58fdd0dcf9f316b42eff73de75ae1737f10f5f9aa6898b7c8838197a4cffce9ddb44465c92bb6e77a1f79a172ded3a893f17beec8431da52cf0ecc0f78ae3d6ecd3da29eedf8769669d3e9bc7e6e0e59a160110e4e82af2894800721638c65f60fbe3e80b6d89fc99b52cbfb50292f3c7f513bb221f42234d64197a56260bad1f06df318236cea18bb5700149cb01473e335d7cd6ec47d4ae8c902077106287d67db85809837bb821064c9ae0ff9552405a68929e054cb5af4d845b6d342184b55aa25e7efd55e379ceaa9f8672817762842a1958162306ff629d0bd6d6c7e991d61c00343e2b400244c5f483a163a9a76ef38b8e8750e0b07d4be5716ec971e0eb409db861747134338c8989bd4325f3d7b5c999cf7ff595f841959225f04d5d170522941e4242a972e12f5abc280ccb6738669007b59871ce7597f9596b003b41c233b50f35c950793c3a625898fdada168fd0d18c81db19f51313161545845d8db20b339eb7acc5cfe4119b746d671b1e80c3fcb29a0c86b22088fa77ac035a07eec5bbbd364c0d7c4258c3591cc102844fa863353590206604838b78558ecb075a4cb6738bd2e4c203ef9a6990b8077c627f472d0bee8c2140ef111468d8afa022d9d76117ca87b7f562bd0892f16b574a924ddbee141166977844943c09b3e65004a5bf0c34ccc6c60b70d774f6758b860de80cd08d5dae3d0951c5bda3eb9f3ead78e19b26e2b16cd280641c4a320c051ce540433997b337f5f2110be182a954eee183ef8a93ac4d9f250531e5a921c79e78bbde82d4995da489170a73f9e4db0df0c203655f0e52f41305e35365908131867fabcbe1a54d0198c1d001d11af417a6e0a7e75a7fceb8645563e33fe0ea2aaa4c4d84c7b03c7f05ec37e2bb1e011bca3f17df3076dc4ad2d2d242c42ca857cdaed821a0a95438cb5018b43e305a8d188b890adb3504180c7536a90daa81ec34130865db10c82f9501b67a8f50a0c02fa63b8a8ada4967fcd9d7096f7dce32d854e0e25339b217382d835c555f6d0d840f72d0b1a8f8078f55d7afa537ebccdc6a75981a74f60f7f11b600408a7e417ed66b889f940fdd779c7bd194af212853687378f56a0b70fc89b47aebc32dfaff70e392f74382fd14a06f4e43a74479bd371bbf86a09ecbb77bd6acd63e2673d392f61330dedc85c4531316016c08a1c3ebe72060b7a0df1615da352da4b849123a5f0390e3536b2b020899d99ad0c2ef0d9f963e0d203764cdd806f92e8485ad4537bac7756ed400946897d756a569b00687daf7f519e73b75161f0cddcf79cd4ab672e45a6d8e97637a3b2ed1e520a983782752ec266d22ab3b75479ef5a9ef74f5c2ffefa4523dea50a3ff507dadbdf1bcede271233116c70a9493fb8943b903b84b2b340b63109b327c12914cf9f200eb131b0e0df5f7982482c37bf784881c7d8c294221c8b989cf0dfbd0367f07202207ce08d0590e9507db901a2def4478df167fc7801bebeb7633ccbbe3aea84377b533d6d00c90cf9ffa7e20d8809bcdad167cf47ad4ea2790177825eeea966c020f83dccf087dcc27cd05c1bfe448419ca557c94d7513dd0228139b7ea58561c1ba303064f3b5b90580feab4ac661677cb373f9d52d8044c40e120b5b4459c9f795aac1ed50be1c1d18a72703a42ab317bf108bd2c701a955618b240e2fc14c22221085061c28cbcc83c491780115367c83057491b516cb15c1fefb132bdf617eb942fea8cc97526fc2ba21cd3266d82412876b9a0f83578e7faa3e631c16f8749329eaa03d7cd9718b44d2c8429539cfa8eed9ef2d634692c048645e5f2c641539c83563e8514f758bfd2850d7bfe15024421875917ae698cdc1108304ecd83539766e0b22e820edd45121b336072e67acebcb2e1a9beadb84f06248e4f72b0a00288ba59f67ccca91cd94b56cc6c1e8ea77b385bf2c7ce0aaf026c12fd2d7428a5e482a0fdb2362ec17be85fe971759ffd054919a45cdffa348ab0e5e812030159cc03b19d78b2d57be5c076a2d09f54a91f91a49ba38deefc794483c836ea63ed4252b1312f2617c9948a867d6d7c9f95ab61fd6af15f95d66c265bf9a98fbd75c3e73aa30e0af0f8b1e035b13a9d0bb613e8de0556ae00be92606bc95a90ab20462a7cd6b5b9b5fb252926704257f87f4e3887eccb60620efbe4d17cb84c9424c342f989162ecf423588cf36aad32cc19b0b0eb1b1ace3a87092bd070b0464216d203aab6ddef2b2758374d2f10094b4152c7ba5da4995e89bd4765a7adbaa87d5762846d79d52e6621c10e203ba175e7edf5ede13e761c2cfaa5cc17e5cb64618f69853c091ef9fbbabd8b57c9e2d72a14e23d3ebbb67010d8f472c9805423df1e68dcd526e21891d5b0f235e7a59aab86e75f882fcfd28fe8e2aebdd6d2b19d8b9b19a2807349686eb1606dea25cf97b2e587d203232137924fca1db45dd2be7de55b6a760dbb01e5b2661b3381994eb61a24ccbda60bd322646a7ac4114ab145a1c3473ea36a6628a5fed87a616fc3ea760ca41579e138b62731e66143167f791c88a67820b56292353c9f9f318db9a142be455127972a298055e93315f9e548c6518e1cae6fa1406b6ac8f136f4b0a217d2de576672ea170824b1dcea9dd37431707a0bf6a12d411f163bb30d90b5d972394d7b6c32e87b7b5b7b88f6c88e265c2324565f92fcb17008f6c5f9e99323271165a0aa6a81494490d7b935981dc43c5296da0ad648d16551654ee2b7a98bbe0f8d0a5841d2aaad430aa8cda85a2ddab1be7d2049f241c3e5baf1ec8d341b36f8eb49c1ee56083c6d28f71cd6f4653cbd98507081e795a066e226c0fb4d2c6e1fd7fb7e177bb0d390319b4e0948c720ba8b1ae58c6280247b777a7324eb1d57c9fe7330ae227f9e4a49350e44726936775937367fb46b624b6f69ce3a06bf0e7f9480d29061d72c495e0d7b4c9d66289d944857fc37925368e3c34d03429e1e5273bc27918535a15e7336c140ac8124e9c2e9b561880179812cd08e33ce09ea7ac52197b34c9da3aad9435be0d6aa53357fa1303870de46ddb4358694ca249e4632b25d56f4b458f9b0dcf5c91764bf8a94524c589c3756bc0b0af4f2badd46e6ee0ac4e6156723f6f6746312a50495dfe4d5a1f1fc85412b61363b5b1bf5f6d29e1e2c6946868852701d5bb057df911b71f550481dc191d8901a445c12b698ade5583ae67a0f226d1247d3fa6dce4a78a0cfe98d9b4b0581b47b88f36c34abb8e7737964df85e012e77640ca78265a13f4d3428329c1e53f6e152cf4715f8b129145142156d8dfff644233ff2d175d79f87bd37e1948fae2f574b1d274b0ec13bde05ef8db54f1982cc795a40119ee01099662614e7201635d490e7243caae301d912c0b703d8dbba7a78d299d1fa70293202bf7cd10a7f8bbb3bd231bc8a97b0b0060817e13e747687db9876febade1be570d631772395cb676fab1fce95322ec350d9672423da22ea02b930f3bfa90bda31dfd614047feed67c1e4cf11c4ca91fc2f6b74f5383521e5c1cec9e3d81a8e5d948b5400c87f9a0fac49508eff3e1f95911d5dd13f3f1df388466a3af4b1c397446e11f2630b55b061d9b76f2ff7b71885a8ad424ad8f4da9f5b901f5707b438c2246983018866826cf7eade1b921ec3251f5a6283d37699964998d56472bd1a08fe463da4a91ed118af90bf3a7ff0d49fc554f5aa79e38836f6b19ba777cf37f8241aa725dee6d7fc0f1dbd3e059c6b69b75dc280217426f1f3a251dda3fe726e24a0bd10bda449bd55df63cb9bc0ce77f0a32aef85c78d69978e9de58392a631dd21c0dea658065d1a5c2597763c846ac512e0cd160e9448d1d7cda8a5198cd8a825434d4a0170cc266aaef5a78c7d030ae80f136dc41692473b059d04b1e972943d86086ea019511d615e21272599c051e54e458b5873eb3450437a251dd7fcaa5f6b549f1cd2dd1c82dcb680be32a1af7f38f20067e7a249edaf75ff4699cf5d25b52ccf8c35945cedb620f0b9236b267e804141012da3b543abe6bcde1f1e363621ae94da82f61cda86eeb1b2c0e4523035499201ed5ec1933f73104ebaf827eb8bd1fbaa09f829a7206e8369619a47be9ef37f6563e31271c9cb44bd580747ec37cb50f32629a6233c07239cd8ca0b091cb24cce0bebaba8362701d7570b8d13a960d6ba7316ccb9d12737436617e8cac9921a7e15604cb692da81213980b4742882c2cf0d38cfe221b8deae1d01bb26e4ec56486e02cda2b172a7944cc79857a8744533ecb0e5d8d59a67be46712c48ba5d2fa34fac8fc8b3b12f3bcf5a06844ae2c44462761d752a8de2cb38b0018e868581ebacd22690392810704661b5b3536c8281fcb7e1ca7f216892a1b09abe4260a96cff14138920f514a3e86139bcd09875be55d9b45e8a674980170c2731f53f221f7937c9474a400d35900bc75a41ff4d50beef98cd403e4e7b30a89041d6a107bb376dccbb081368e5d5e64828a2e302ba0b5123c048249c60751ae5c747716ec4bbaecfc1c687ee3c34bae01e5ca8c22e1d791f12a72be28d16c4e6efb85c162741b27f2c9d5c7cf704734892da45aa0cf00062c390c5275fb52c7a2f900c1029afdcedd88cdde606925011a85c42d6f3c70af95c399ca9a7322b5cc23e58543fec4ee52a87532d33106f8a4d0167e9b7db2f16e016a0c86ba70fe6c03a712897083ead0d3b31175c331db5963c30408370c08b11e7f457ea44954a54a6f1c15ed771eb2a0fb1335a42967fd05809a1f6c3c3376a6fc80657a9842eda066c91f9fd9043b889f822f83c11fb28e83fcaf2864e5785d0ddbbf60da73b86539feaada1b551eccde7df9deb238a963666179416234587ffa89eb4e19b2a992ae6d68a07e18a672a958df1c69c1f872a9e2c9b2cea80b223aa626b3b23d81ce4a598d2d7c374cc978fff163eac42c84a6c0cf88ca6c279579ded7d6f621ab72e180f5b0279c7b72dbadf5e04ac30d0764834e83d5f15b1e50a9046a94c6fb653af7ef215a08428809b8a58032e78dad5ab058cafe3124c000144920d85333c62dac934dd83c7060d7dacd811dc81ad13275a020e202f8f9b8632577249dc1a8a2dc25ffb727fdcfdb7f9af9ac6ec8a6f096260f7af709b689a22dd2f187ebb73df5e439d2f9361a14b98c48f9eca0c5259abd3722dbb3bbf98b83ca4f440b6552b1837d7aef7c607aee0a78e18a0ff430591b78f62cd99fa314bf7396733b2e7d946b5ebc34d0d86158bc6175d5cdc99560970f34e1aeff5650cf47e4237cca0b53a981862d0e8931b0ef3d8500496e04dbebbbf15ccae0da299dc0fddc597027e4eaafef71bee2d6d74829fe1dbf3d2d7836115a80cc5aace84838ab19e5714dfb010b8c79b0008c6f8d350d3c8687dcb2e48ec269d8ccfaa9d773e7207e1dd28a3857144a4d52057cfaac8bfd41a34321509e9b52c16358b068917d5832c6654647c4e2d305072df04c35b2178bd08b8c29e91a417128ae5ebb95df1a24a06d1f1b1eab3b5b1ddf1818d613909ce3234242c2aa8cc5e163009bd4403e03732846ceadcc36fa935d62209bad635a69c4e13a71f4bed4f81a9d514aecc664cbfc638763add6f8b99ec84a280cf5e9683e07b20b11f1cb0fede3eb5ea69af42e40ec973ab65fe40f5bf283aeb72556df84c4808cb28231132532d2dca7f78a99c857e7c67ef2b1357b28b994988d90a8640d8ed9083d315e71d5162c7ce8d08d4660ba990109ab991ac399b951ce4c46b3fe7873a39021e7e12b04e653a305ba793a54003c46769dee3197f2ad465a298cbc42f3d7a1f480efe98d0253cd95342c4cd22049cbf0b0c267a104c8b33f961e2af95026fbda6d204736b18b49700f8e87a21d096acb73dc1a7ff29f49032c5c2e7a45594740fd4800a368f7e08758f2450a803a717f5ec012549c04bac9163b8a99ab94cd5941671781c0f8fcfafde5279e14be8e5360e18d26e85740bd89085e1df9bc3189fdd34c6e9538f47d061a2c1fdf2529f4b2494a5f0f6de1e40b3156dff9b59f4299844a507cbb36f7bfda9c35454f47b3690986958f46c80710edd2d116c5e0e4faf7c5a68682439bb925a164969048d9e86f2474aba183af13f6dbee1e839e9c36e0a6aa342c86722b6e171280e1ed4e58531ac8129cc0beaa041af085c63c777a5a66e21c2b58b18379948c3f5e5fb3051517b889348deadb315425536fe5dde70fecbfe37a5e3660efe3c87e8ece9576674bb93db3d0b47f3a771cbd8e7fff13887b7bac15735d7c6d9c6ac15dd22a400f3deccc24949ae9219c9ca1e8fc88fd798cfe5ecc8d259a84fd442be39514c7d0b7fd08ef112fb70df9f231362776ed9a766409b8b809b043c681159bcfb72331de75cdd6bebd4c453fd704bf7dd295499067191511415a4536897bb943a6f5f5397ed9a8ab85ed1cff8782a3e889769e5306737b81249517ee2a105479b54f45be9d580f83d85c8039d9b34ad6312d86c6bc48c30a3dc1c3297d855d49ced13e2f353f9e41f252b6a83e72b6afd2a5e7cf54068ee99f2191935166c7d7135db821b3fb4b5b598bb0413b1a30d8bb731e19f57b969083ee6bf340b5547dc0fc121de1d079ac11336e0cc865d22986d3b95826fa6de54a45e9d09f63f2154a6da26dc785d33b36e6004414424fd95dca6682601fc1d61417713aa6a2e0ad11c03e6cdebe24ef83ac1191f5c77f43135db0e3f7fe515b185873d6f6ceebaf125fef4500e4754569303240d40e6d5c7308cb1d27efe375c5a6d613abbd2b196cb04becd63fd8e1612bdb291848e6089a5258991254c0f4c6f4737f27c3e6fe218f59b7e3fdb5423066cd2eed6fa539b4d0018ae4ad65ef9034d7b1592556e7d5aa8051bbfb112236bc6869385e19ced1e2fc2c4db4625d439cca0a309146071687ec3f7cfc94e3aa282c84f080aaab2e4462f841537eaa96378bb74e2c2c7e24f38a3f720aa5f37b4b34bc5d1b2e38ae1fc869fc8b558a35cb6e509670a24a4fd9d024ff6b2d2ce730e0f0359495fcd98a2199ca42b35613db27865dafbcc75c719767c48708733e65b53d052ea0922b1546b33d76cd9b1b0b11bb1b79aed07a20e8c4a99f0a37132c6b86903f556db9130b354698e3303e50c73aabeaa670a6aa297c1ac7e9c66f708fc5bdbf397474a34274f448d7935d8b040285192b6600cd66042fd41400815fa9e2f838c315c1a02fb820c1dfb36d5fcbedca77aad73ce9420e7e52a757edef19e21909bcbac302c7b1075db767ff16e8c933ab79b7ba4b8938f1ee2e759cbd383aeb18bdc883d21b8d03d0a312cb2c307d754889022acca3169054122d191dec1546eeb6b12b8bc940307c36fdb9105d512b5d631ac344dafd65096e51dab35d1c33fb1c1bdc6f535f8467dc5b54b888c6e58e2894fea19fc684dcc35e22e1126a7520d75d736a8ce3e91655dc1e8f46a99cd05c5411d72b6e1ad6b34e5bcedb860ed62310e96a431fbfcebfa14a444bb134a73251c3c1a33f75c11f66d97c813fadfcf0af55f00efd498ab1bb1ca18dda349098c881046e7989b162888d63841172a5bcf65b42af81887b60e9aee9f27b6eb1a1957e6b1fcc8f807642e568621dbbabae3abaa7d03ec80b915f155d01e6aa08f2f6d3e24bbb4c881a49dbce2de1d45f7f999c8336304838de2d3a57db7f23d8fb29026021268cd3200bd7d8937fdd2052eddeb68d8510bf3562438ea0eb21f5eb5611f4f8e6e0871716e786e552e4b480c5026bcc85b7103d65c7059dd30239ea05a4cc337b658020b061174d5c00e5a19ac7c3bc42c2b9310dc491fd37d50451a67aad59a6f12ea4b65a5077e7ea387589955108d7d838457d82c90bbdf0d2ff79627ff9b604de9d2cb55e10329daae942a4c5eec8c53525c53367b1f3e971b63f4a05e36faa7065ac35eb21ae0dd8dac51b045d4fa68babfece59979cb36c54cef4e4363d86377d0d667bf30263d4d70c9f95d620d1a9b1c584bc3f08a940dbd6db17528dcd1ffe1e68d28b54be1347ce0c91e3abb56dda5ba9b32ed448cfde6368f41910160b19b908f3b5609cd833827c990579298fdbc527868f01aa563851f094847dca8644eeb300d19dd419da702f8bd79b2b77a2d210d5f849bf6f771533a9e9a5593baeae695252629a61fb341478dd8151571873031793548503f53791692d5318d39d93abd6cc5e77f5683bea336673382b647829101cc83b2c49405d10a8a50a5b4ac733cdfd8f55d4a2cc36d2144ac51c95a6878a041fe2c79302e7d69b11112d4214a3cc2d6d54ad40b9b08953842f1ae0352bd98938bb615ce3b9197a8b39e25fc62dfc7ef784695315aceb4724bcf8d3c7a4c0105fdcbd8d8508adeec78aca5d536d34840f2d0d4d33019e7fcb75df9becc703243141d5cf935f9d42f6b36e3f67655845ab79add0f050c0ce40e7e28179673bf54c52950469aafb65303d0e27bae68c18b741ba8f7c1fe8f9633066d49c47b523c6f09d7e441895fe50a71dcfac15e0fcb13f5082d2fc94a5df8965b5e11ddc4d11d36f69cae7e93694e214a0996a0705ea35139b3f6b9177343ab967c6d848a43367be183948083883f4765312b5094103b66e8c8d35cadfe3c776154649a9385a8442c86a391b23bba19ebbbf1d0201471337522399b781b5376b9c3ded4db9a00f271904655ac4ae42474a2cc0b1d0f3528f72c57e5e62f800a2c6c8d19413e51c42f6081bcca51ef3d87f16e16db9597beff6801a76c3adf2793a939d296f302a351902a3a9dffbd185ddc24f9eba8d57dc001be14c69b5749c6f6c6a7eb6163b1e1571c6f107abb3b9a1be3f3fc0f888e69d07bf07c24be2e01913f7df895511c74ed0197681ae1f86559ecb64a09f869c50412a9d8ea3759f356aad509da3617f739cb1b95da1e19b5140e8c0ceca139274d2ad7d41247b275ead5039d27667547520f7755f9e2c5c2c6836e5f4027b0160801bfd3240e73a65d1a97f3bb48e431c241028e49eb846939baec30c42c717f4cae9f89a62d2fc51ad6dae1cccd268f606eca0c96dcdaae574fd31152524bc787c244c69b31543bd1c488b29f7101f8e425eef3c6abd2bc0c55b308b305b30d1e7387462087522117596cf1dfd14a079430e312f137220959a27864c8f7b4a2a1fdecfdf7bce75508ee81679731f32d1f7f3198e3f535bfdfa09170ff6cc0a95719916083a0e8ad9d3e47120c9e98ffc7e9398dff0d74fcb3361b51b4f24d293c722cb7a5ad8954b114192833d3b1953ebc1e8d12fbab74116e56d0e07519ad354ab86056234cef3704aa91c1262b4d3db4fcc12c7a554a10051f52800a0dc718c519effe3fd329057226eee2121d848fe075fc439955a509a5c1ff8506c68d54e6bf338995b6750f9433dbebc89bbc3be0b8c650f2352925dd5b22dfb43834f15aed82f3f70c32a948cfb11b4867088fe0569c2f5ba14c012f23df7076eba3b55e2cc70527d42ab4e57191f8a25ceb41b9d4d01dc64a8efc67fada379ff5d48c33a0e1c3521387fb0952918d8427b695e8862f40c222f20d30a13c7c6cc8a679fc2cb8e469018c977c31168ad502dd28428530d1b630e95ca75d90543b64da9470b0a08ba9b1d45b956360cd7a61e4d9fd5f339de6c508b4831b55a222159f573d55de262c44e3efea22dccd0063826ae5882ffa001f78930142330c4d652c067431fb9a574fd40fc436b4b04d3e9cce778c02569f12dc180e092e8629fc7c38a70867360dc6da0d5e37c9c14733816595ec3e418887e9b9119fe8100374c6823bf5d06d5d1d1469354971be8640850805827dfa6f0475dc530737d8e552701cb47a35498dc2e01285f910aa51583e810d622bd16b450a78089c1dd5731e1cc5bb4fbfb2911b3c8aea094426c16985f27b085e89ed84baf28f85eb3cec2d31c65116978a44a575087b72150ddc6460babe6a332962faeb90c4002887d174dd01bd4194e04488afcfe402d54b05fd70f9d19daddfa35e9427eac7f4ea0c4cd24bbb1fa04e7543df268f32cf221b57b1fe9156c034c4aab5576d7e91820be44060874136b4bcbcc6b4f27681575d3ac2c0f396b3fc9e8913c225bf35b8cbbd3e4825412f53c6b4ce56305961ae0abf8ee5412eae33462bc489b6c28a3821e2f89afcdbc34fac7fd573699e46f2b381daedc84b34f91718ecb7de5268734f547f15d21089c88b5bb1bb1b5df6ff1ba655212acacb9a1d7afc9927abd09fb7493fe49bd010d73e0c6f5597c7babcc094c915c4a1414583e6239f0b75537d975540e73f3e8bc0d1b28c073072a1b0596bb36a69696c514dbe9bed38ca8b624962632461e4a784c64dc0f258d2c383d0fdbca7a08c39224e0dfa6e13d99d70cb5290cec2d725181c86ac2e4dc3fcb2a5e630ac60ac4085d76b162abf6c90a3969274ed348ff8c2493ab00b7251da422eacf82247cb2f0b0f4f31bcd82ce43c6a8160ceab52db4d5aaede3f71f878cd109e6795a01b7ecb23365511cf890ce9a45609fe555ee41680d902141d3cb45b46400cb08e53b688df527b14ec84264d0ca6ed9b3615f55e4f4384d0c6d4489cd75ead20a2db945632752c965d06a402f9ce0b0adae1caf70a77ca665e2b3642cbf93557356ba98b4a46dbea590f6fbcdfe359717f1c465a2b7aefa88894f329c22f04e1e3199189a71955e727edb4638f849d133ea0e747b1f3043400d4a2b8d881794cd24cd299bce6cce65ee63603c56d076a4a427b7b86fc48be1f436ac3cb21d969014c803f0ab5dcf72a72e8293db0c4f0d8b4751349e144df9aaaefdfd875a98cbbf9858aab07326e3e44d91c51813cdb84861117bde4e5dc7a84f9bca8e960801c35d29e3b592543f5bf197982646e510b6d53c697bd3518e462d7788b04d66626952dfc99e652064cf68eb6993eea16ea02c30361a1e69c413590f44cae96e8d6a9e1931a45379a742c246bdb78a11497d6622eb2e0aceb201781a1a22b6c1425319aaaa10a9dad236d99eb1019b884ff186d6759e18948b8fdd46d6cf83f5efbc390a14e97f8781fffb40811dfd57bc684fece0db13aa6a1c214493f19cb0707d9cf72d9602293ca31bbe5b8d3834094a8d0e92feb4aeafad66853ae8c3b6dd410abc5c1a5e94137b325200fcb0545d6121a790afc49a8c8cec757f68f5991b0c00fa1086d54040d1452a819a5c1aef4f3738a6db25505a7b703b11659fd0897b62c36f951a4e0abcf1aa3e10e0c9e0e44fea6c1a95cb7c5a36d9933f9445fd45752fe1f1f680af3e92172c55fc159d0f911f9ed2116a323ffdd64faa074e649017f7cedf28515ce3d46cc6d01611617fae87d82df6df30546c589e9817b9694e4db98c63b0b9ec204eed41186b62e4dc60e69dd9fb5e3db4264293b1111aa1be2bf9bd982f2635445f53c1688e52143233a10d374e01895d072ab317b6e878de15a65f991f93d367e634a8019b4166927c9a24b98ac0725278a7dc9afc616e381782d503be9e49422b45377d34ac9bfc0089b037bdfbb0fc7eddc00dcfcaa597d181e39b7ad17586fa8cdea62d8dd906f56333cc6a831b9d03cc5b90c37339b6227489ea9900dd5e1d5908c28020694d9a3cf024cbee07ac85add847c1aaf2b0b62b303e2d512b7c08fe72e17c603a9b7c581a7b3fda3c522c3e30f080921431e3a4596ffcc941612685df714c506e0b216eac8cc7d9691ade7cde74edc2fe418da8b3fde3224eb882444a4392807d44d161e5d6c51dd3b771dd6a4bb30b91a20eb64766b8540336473dd097dfc3490e8de885f345995c8142fcfc62747bea4983f02bb69e1d567a7c0784e456d326a41e697ca8a8f342c28203df70ea7534e6df76201d93acc2f9951ea250261215ac58348ef6f32e1e7fb5e7e69d9dc8107d9a253b4ce4efbd5c6a8075b23434b293fab8042e9ab62161373a9679132b775394c8c6013489ad462c86a24431ed68abbda932058ddd126a4b088e3b4575752404072d48cef7d4a83e6ba7034ef779bd527ff4906b6a62e15d4869f51bd30047a7b60c9e29522d6b02cbe992283552200559a76552a5cf4d684686376d2b69572d58ef12c2bb560c54a9e17295c8727e5ed5b601eebb2ed7bc9d4f52001b12d5ab85123dd70db77b346b12eba8aa653bdcc49ed987dcd9b6fa9e8073c71a311a06c31442e39f7d6954f05400284403af0c880a71f3a096289f9c97f8756a485baca2066f230e0abc16cc07ca8119caf43d44ed5ccdea9af525b3fa5e9c363121d15e6e898215d6a9dae0764599d66bc88bc037f291c879f31b05e9be4467522ee6d36fb1ce9603202d0f6cbb30532a962f3881e604af270b9d639d622457985216e1657d25bcdcc0df17bd023a5729c4f151162514e1874e3d970be14dd08704172488098370c27a90f74e15b0a5a1612d29feeef192c412454da4040ddcd0722963c254b874dfb158253845fbf7b6015b0833ca2cd024c9200096cc9df8a4a41ca0881011b1392401da68cec795093af2e2e7f83916089733fd4ec303dd9457e17a2e44eca9615f62ccfa3870ce672f2f34a0e92bf60072799442adf708c17c163c0d97b483fce83f12893abad2b3c66c1b1ed0e2484170799a561b5a6c9d6c3fcced52b61e14cab90698d4dc9093b6e09aeb491e278eee4c6f257fe4fbdf77f79a672cd5515c78e49e9dc3e81b0d51db9f4d970bceaa75e531383c16420759d972e8f7a7362410f0a2aeb0014fa0fa76b4546b42c8e15cd4f7c0b5228240e4f0c6ef6007debb09c1b4c8e63e21798d5554c21044bcc2a6e7a2136a6757bd456ea7217bd0e88aa3226d65611c205431747d132602d7f7409cd74c167471f8a7041f60b4d41ee292d551377078a5fb9361961513278cacef52356f1064a44ae356380b8bcb6739254beb5a3a6cc5feae7c4f99dbe81073fa38fd3905bc159d13b4e896bd023bba3f076e276444d87360b3811eeede71b96cee3682a27d35282fd6f44989e73f4138c4a29eaacb47cc28f2c5f2f2933218476c497737ed4501ce3e624598b6ef0efe7de6a37d25a051264094fb366622ad6f1be5ad5c3dd49655f0977c802a55e6e570622135047dd0ac1984ad7c6b0ef865ab2e64d15ba658edf0a89595c2a96470eb134283976accf90a919931e1247f39f15296f667b09700e990ca37ce8a85b9fa32cbecb6238a493a416201f6b24beb3e45371c973744430ae02d85237d510c2a5ba7106eb4106cabf774d04ad3a08c66e84675739dad7b11268a21bf2f7e51baf213f4dbfde2ce71fed0c043d37ab246a288d96ef4131124c9f6aa4eafba1d2355ed51a15711e2b827329ab1415cf7c61cc6d2ff614a2c9d05500b310efc37d8bc05f853d6da21d0eac7e9a91ca31841402d249db15a370a44f75ed3991ca3c7a51a9b84e5d765d316402c11ddb9df587908e08054961f9052c1aa5327002f1e2f8bbc3bb594fff81d8236558cf5548a40c4b1b03721e3275c561aa58b28f1fec346091afc844435828685e71cf35814d50886a0012f3fd0857e3303d15f11b2a0a2b6df2d71a9fac43b0084e11063cb411400f4fb08cf6e9021a498f018f66bab530b20e58f0fcea73f64c6d71906adf320cff8f1556eb4c9bd4570d362d1b7db57e8115a8bfde565a4a2430ff5bee598cd0e01ffea8b3fbeba0db07286a4fa5d61aea62608f6ca5376ca18bca8f3a60585fd47d8cb7ae18b2969adea0748bed7ec7442d0f88f5cae067d899c0b9023a76c6388e22cc050eb0b55801c1634a971b4ddbc2d3ad671a57928a13f321d9e335e56ad02fa724fcae024189cca7587d498df9fb9c978a2eeee7ce73c892459f0452ac026b20f1f08dd4d3daa48b8a508a5ca9aeaa8f67bda8fd57c837877d5924a4caff0f185688c4336beeb1034b700f52ea05eca02e38a3fe60e813522e082ef724cab829511e0fbaca9a8eade836e33d3356e41bf2e1f156984b189f56a464fd8cea525b448225407c1a41c845ff5e3fc49c0fe37ee766f0c0caa2efdeae03bba2c0d1a28b28a1d14abef0274162e109a54fd0279f86e9650d038bd6e5648611f1dbc141d110eea7ae35468598dff70a8a31da0516c45f40b5dd835c419fb1844fc593d343d78a2a68d05794fa08d5630fae41036431b8bb5393e139eba0eba01ea0876ed7f6a93ded9cc30733f55d9e67cedc7e741a20f5ebac0ad89fa43b8cc78aa42c886032cef1c11293cf21d23ea0873c0ef7e5be5179918b97d783cce1c1bb965c4dc30b6244e16bbc3d56deac22f5cd50625a95d3f6e4272609e3c0d85dcf23d66bbc3197e73a096ea919a88b1f0c62eb4eafc28162623cb1e96e523f6f08a1fee78a64f6949d1b4cde3361ea87455776582f7df350a30768c5550bd648d6f4234a66cfcf3696cd337357153e2a1fa3f57a6fad70b369b6766b46d9326ab4ddc3183f9e603c9ac3409017acb59636ad0b1e7a9c65743aceed41ddc86b0f08caf5e4e980dd5f326eabc28e1ce681f62307a2f4b7e2c031765f8931c449e8178688fccfbddebf6456f475de2791e12f8e62c434cdafb0a84cf00b5490a36b4548e59bd7a9a40c4417cad2567e8ab2725dd0bb6e1f31072dbe354b78e4695ab14c41824da053256cf8a8c08e118f0d335bef1d324ab554dc01e4b00962f272e9c092fe1134f4153f7f41f4362306088e5e936642260e35bb9a8a7de6f7833a0ccc26ee9ee69d5c5c48909f1bc01028fe64a0fa55bafe8b02302f0f8c2182c254a9fd584ced26ae066c3c56fa68281489fe8cf0dfcf08cf6a93fa9a83d7186145fb5034485b99724f8a3603b54fca0ba520d87a2151b20f75931dffb2dd128b8d79fa20a8da46ea6b97e8d4c4f2ec12bb07b6ba8d781d3712af3ca4d0b1a9f37c57ccb2bbc4c53fc3324feba1c7745f59ea2c010932994243bd40268841bc44eec3e40bbf5ab275a02b1abe007bd399e0b8ce14b12a28ba0c77864c89e05cb5a78ac626ba25e9bb487c5956c8eb16f42b8423536878352dac51a1c92b25b5f583f3bbd52c50a235958cf45b0497cada21a28ca88424c69bf6a8f5e270e27599802c69fdbc0af25e8f70b6e5d66360f95499904e5516c39e7e3b1486bd57a55ba24e002028c164d3614aecb67d141a5bca59172acfa2819f860aded79af98e2107d4da7fea951f16803630644afff40b27e8911a23916f958d579f7780775556001a64a80c10b3547119c29823c8e6f6221ea62f2cb7e7a16bae65baf063169db7b4451bb545da46b5f77f1ac5df1ff72ef38898164d53b23bebcdcdb71d7d45e3fa3266cca0027f87c8e8eb6bfcd5213c01407ee2810ca8a1ac73a63fc5e345be45174753380949448e786161e1de2863e4c76f32fecbf5443b07c1e31c7c579d4fc94632797586f8f363baa792849914a98484f91255aec102e65ff4a92d5602ffef95c437179a5d2c483b724c403d0a1b84ca08f7fd3ec0a78abdbb7b05e1bf110308fdff06e141927fcbc11f340c27e9bc82fb043e1db113239202307473cf339cb291014307da46022786cfbe62bce9f8877ebfb67134312a92345d24a88082d63e0cdd4b7870203e874255b458fe5f3804f3ed0ec25670af750b50f60fb8acff97d707741ccf770928634dbf63d6dfc3925ff9efe8f32ed70ff71f2dc5907aba4cf35a661875ae222693057ddeb481c668c00656b714d9e0391bc1c8c9983f2c308b2f4e69c1620a6dc6c3cae2e3e1873ea13e31d1fa29cc15806580e534e1a48c319f6f28f00e3c817ccd451c82cc28bb95623f4d8adacb54eb9ad0fe7e0b52385281a4930c28c2a33d1b2b2a141aa219dd6adee1c59b172159e466d0071b092368d658315f9e65c6f6ae63c376adf3309f05ca3411848e14af0347c2e446915951dcb91f2ce9918e09d1cc1201cd1da2e7ebf6c3bca0fd8c40985e2519c892915de2ffee9b50d76e54051d7d21353230092ff24e0dbfbadaacf9f85d56c9873974b4382f424ce4007b93d01a37490155e716103de87055724886d57c68468f440c5ab75317b0c101260d3d3f70b790b4e8a10a3fdd846b40ad1731a868d48bd5dc0ffcaa7c3fd6c0a4ce9e085386670175d056a53161b7b35caf514e93f4e51cd54e6906356c390b8c93dffb07c7b0ca69ffdd83bb7e0d309ed6c788bcd3e3d42584af4e49e103614dba2b78cc23b35b2e8228d81d849c7ff133bab5c8adf8264479f86126e1090b897df48f9b3778171049ff92b44010f1cf03f02e32e196a14fa09717cbc829c7cd619bf03ef832d995f2848d0a265abce8bbc8fa2a2d0e430071e8feb302bccc320a05d15aa8a99e88e414f2212bb81466179e51194d1c5a01d9e274d85782d49cddbc46cacf3a14ca1072be7e9bd1799621c41e050e4f423078e025acca7e2d6603f63ef4d61a3e79518036f0e1b0c4521b6dfb4fedc938308baaa7f8833282e24cc0037ce1b27ccb0a411c3bc735a0907045a6665f80e92ad1a844fd47eb4004ee922f5c7a586c46524242603aec740fe292eaf876d47699158faec3c784d0267142d2b9a4dab63acd4ae53ff7caf051615eaaa09d4293b0233e3498667e97a475e6472d8e9cf44fdb26729a570994d223d1e3a424ed686accf7f895d9459b1d5a95d79fbebf67057248922c6751163a1dcf8471b41c49470c29f1f922a2f4d77eb6d00da4135cb688e9960eb28eac5ac380a376e04b86b623b7b4a2cb1a051f5851ef0489afce94bb94b7a8c3682c00b4882051e8b9aa6aa6bd60eb0fc43410255b19749c08d4091fb20dd8e11bcf3f810ab03e7ccc98341747201268c649bee58110048d3d2aeadf623ef2a1fd0c77c30bd7224a93562dbf6377fad34b0dcc60445373e1ec6b2c591b0a450ea32f78623bba2cdf0ae3b1fb4661d4e68a865e6e4869d9727b371a78e87d7439b3bcf7125c169d47ec8d13da26820b215ca0cafac680bde1e66288d7cd7b5585dcd062272350ef5ab500a3644d368e5aac7379843a174ddfdf46150f926dc60d0fd5eb3b3bd399012c1ba36ad0d9d5d77e88c601cf410e56f83cb43896929e6745a0f8e4a43a30e5501205119577328783ffba93e6ece4b52cdaebea94e26dc7c228703ad2cbcfdedd949bb20ca040b786c441791a45a7c986ca4bca556d2b9a42c273008aa13bcd3309db652f608582348187809e4adfeb4a24d5abd7aa26da0791be3b799c1f3c83586ece4d63a83149309296f959fba783ac627cc009ad18f050c88a30be908eac13d503fbed0f6d981f16de606ff194cd97ee6c43407c894bb5c2ba7ff3102533fe649df333b924c2d5d28bc0149723578881229239fd802a8fdf6a56f1bb53c09a91a913c499649601248acda2845d015c14af42f0c9971346139de39630c20c5a60f651f02f6926b29632b641790516582f9f0a3e42e626228feb4ed6abcdad4a614e3cd57da7fddea64ce6303e4e2e6f26bbe629549943f6d6081ddd6997b9008f0dd4e78b761249f84f5632e4800c4fb05921191a6ca173fd1f17c4af8f2171c00509a48c4f8d960906cb86e3aab7b0e79fef798ef5938c8d822dfec981f2dd3bc31375fdd17635204acfac307a3487d0451171c12ee1a209f103cb2b7c45fe2d358e9c5d2b2dd9d300271d3735bb2514ad3adf67699c2b3ef3f802d0d1a08aebd49361c0f9c5b134d1f214768bc6e1cc588fb0fa3aec1221bbc1bb3757378d82807861fef9c634f13d9e9b9c3891039de80cfae1fb7c30d78212860da6046beb7317bc7e760c7777eaaa046cc4f02ba68314657309c19a50367919a9f3e8ff1b54898cbec5cee96c4aea4aa90266193660efbae272cac2e61f18c5c3202f108aba1620d8c2f020182801ec0f2100a6d1b363a90ae07c5bead6fe25784bcefacfb1bd97b4b29654a32a5145804040483043fc46088142a539e9052c462600b059835f57a71bd18d1a8dee2eba3d6d0f057b6592fdfb24adb238558bf2d8ff555b64232f7d547ad61f92adbac6c7b96678568f9172c991048ac96ab86c52ae960cdd130002a180e31f0dfe20d228a6079ec8b68f9173a2d4ac074b27ccbf7fbf2a88d96502c58e6434bf622d34637e410d866399b65fd0a673839d69095ddc8b1feff2dab94838363e87a1c1c39164ece6549232d9fe2d135faedfa95ccc655ba715d2ba3d168a5aa5aaa2a23addc609a6be5b7ea476f55a51b3682aaef01c7cacacaca252556246f304d2565766394d9b8c134bb7384a3aaaa1cd670dc108bc5fa4d8b2c8bf4625996949794524a79c9eaa5bca4252d69b9110dabaaa48d1ba7972775295ed8cfc52e33d8a5c205529230062e84fc4197f7eeb7efef377f98b53710deedededf0fd2d58227537d6edb0fb750bf166e2ab4143448c023aa19c1f73a113899452d3fea6d550a0c92367f93479ec98fc6e79dcf26c0f931d22c49789155a86425608733770ce71b303c2fda658cb9895df65cbec76cae9fb47d59178c75c6cab8028cbbddb238898a6a94a7a86e43712c800349a517ed49ad1cb6ce3afdee22ac6cc850443c68f5a0343662fe58bc7fe07cbb73c101931dbb8c25eb0582b2596910e2396571942acbcb3947e20a9c0e8c6e829a03256328de44cbfa24026eb480e816de68335ecdaf877db87d90e1cd678d7adfb2ded60cdc9dfc132a2b1d241964fb125df6df22f292fab64bd351ad1b0ac2b46964cd9147fd3118db8325ebfc5b7de8aa5527c7959d688c675c9aa5ac96854d9c51ae3304dccb6fd6aab321c9d384cb32f7fa755551fe3ea5428d4cd0cf86e9b19925e2084f0dab0c931cad2cf4a961a4208e146194ab028f22aa6e10c3de841163d903b4d3451d44415192eb420d4d811420861b8ac86f35ad6b2afe557cb57825143fe84ee1d3e7efb30779e915873dfcc211cbdaedc5d811e1743767e6420a4040c51e2c3f70f5e315648603fa900c217865c1a7b982afe00bc80d980ff227c09af8fa51e3ee1e8537c1919653060f6acbdf752098c0a28ba98efdd0fb01212cc7df5a92bdb80cceb65bc7e4735e05bee610f9faefaf70c2be8a073f3491852c6a7c409cf7c34ccf782fc5021ca3f29ea7192c4542ee693113e148a69f4c97c0f3303017dd2139db0d4d2eb033be3abacebbdeff8de7b3038ab015fbe7ced17b9c03097caba2eab8a80cef71edfc1a8117fbed23eaed8e224307f17d2c77e349c0e3a6174432402b044f38a111d57b3190c2430fc7d78cf26b0ffde87150249673ee8c31762ffbd10485ce603ccd409f1b21b9480adab29a989df14f9f92f2ad8f614d08782a53fb820899423528278ca114454a4f474a11342f8e0eb52ab6624c69d2396c2583e225c1fbb034405888a8bf921fe7a1b403afc36808080522faa1c71717952a031dc3b1f2b78e74365dc0b1f6c53206c8642d127eae40a05fa1915d113344b539518d1641a819f627fcf7746c7369719e1791930eb5ea559c2850648b8ac80861c4c71f1a1a10916eff251a2e779bc873023b06d77b41d229e69b4c741c13a6a138f1c6942e707a55924148a1645222c45c0b6f5f16142476de24f1678f972478029400108a00cb880c6708f4365acc0b41808d335f879453a3a7a042d113bb6e7b5f7105589cd8c065093d4d882699d796665db02d17126f73196743e46f72265541bee1f6804531b87a94d4735997879f898bc58131857035b31777ffee4cb2934c4e0d758c75cd7b80373bd45357e8d8198ebef618ac5ecbbe7c5fa1151889aba00379ddd9d1dc2989b1467bd8d85f7ebf7e083dd3b58b18bb0eeeef6e8839dbf113c9722780dbf9d045a8c7d02191a3b48c2ee4b62b06661caebf7fc79630f0667c5139a05afdff3e73d22c21a28ee04a902617b15c8e0a4bdfbf573944382f9bbfb7bbe648808ca69c60b9b9e417b601a7ffd1b3ee0e4d880d6a80c853c652663587337acdd50044c8b790ce1ab1e84aff2e7f253ec19ac640c6b314eb6d40a42c055c95635974073c7f7b2205e670fbe4cb3de7d8cd556104d8bc1c931a34c4e4142cffb47cac50a6cd3283b7ac44822318dba3410ac7de6c90aa32fafc4101114b70c3720bcea7ae5724f340b53dc498c6bf1c518939c463b38275d181244db97f272a2a3b3fbf3c7cccccc9c392f6d3de0e4871042f8aff478b004999cc1e601c6ccccddbd8ebbd7b97b9db9db77e3c608a360294c3fd74419afdf830f767cbe6193f302d6dd1a83bf479cac32fb1abf63d5de0826bfebeece56659663ec67448c4d42475595a5094c1fbedd1ed696486683b525d2dddd4b647b4a3b647bf4692cec59225de5e4d8d7d26e8411427f858e3fc5d2aa5e96aa4a36aaea5996f5a41cc9fe37aae17fbd0d55eb2d592ac9973f83b5eef15e4544395e5766433f6e31b391a584307d9dfafd02a834aaaa663e58eb1dac45e9d922f05b1deccc331d2d59609b0add70291bdabdddfcbd0203e75cf78e94eeee0f2ecb88c693b0d71f6cd75d42b573ce41e8205ce71e3a084fb09d73fd9e7b19cafd7b7ed1f1ce38e33d84ce41f7dcbdbb25bd406cbe2ef55477f7dff6e7de95600183b96285a5ab990ac1367ac04197c33937849c910ec59a0ed3c4f8d6c1cf6199a3c3555b7e4508e1cbec848270468c314a1d7e8d68b8846e79749f21a584988eb6fab78ebe33f60c2847343cba8dd6d1513df7482fefbd6ee8ba1b967e3ad70dddebe79c73eea4c8589285c9b41ad8defd1cce98d5d10e1c64deb0c97d8a515530ff4d0b01434063b46bf7209c4b30d9f735d7fe5e5dd3b217d6629c2efd8aec4c54877aef596f35c26a4403be3895b9e4dceebe760f3b704d20fad7c8f5298e9594efd9893594945e954634aaca23af389837aad16f392a7ef5562c954e712687bb4bc8f022f5a8068a6922cc50a7c928ae20c3767087df33379bdcbf0c87693ce30c4786d305ecc47f61158f9460694c40ddb8682edac60005d85545bf7e0f3ed81da7a0a0dd06bafbf337c39d80e955554546de17b5e13190610996830b62da0a4642069827fd6bdae904a439130e4370bd03054cf5af61ac397f2a92cc28606e27059c4ea7d3e974caa1323910718299519bbe809a0a1db41196bc7ecf9f7764d40d4980de7bfe9ca4fa5aa3833953ec42843a383848a4229c85333f6e899d9d203b5660c1ee6ed3d06c9a768108c484859a8914371c61db62f8b6f4a66abd9560baccb25bf55e611a46627cf32746830ee183cfc130835876e102b6ad0fff4cf113a39d4e33393a6e8e080d3d39d24414a7d3e9743a9d7252806dec73f26102867f9e3869a593ca9c26f39ed486e7d545c0bc446facbdfbf5731ef1c032e1c764b28ac482e8803b53d5f8da69820f112245889060dbf69c7a86c0a498462f1f2208050535219a1b6a6e1a4ad3b4d7b409401930c371261b54806d0c04c4049e5c0d94d12ce4031b4a2d2d9d6117c768afdff32122283c7e18e9e1f9fa3d7fdefe8a520522fd5cc96cb896ab840035f15725abf480d6d4c4eeb4794096d80373bd6532c63dd107c5348e089122fde4891327575cd1a40993b9699aa6695a0e36b9cfc1010b28a6713e37f8c1ebf79c6558ae3bc4aef184212228afda2f16403cf5b5289e7714495acadc5c5cf80626d8b63f3fcc404344507c5a7b01c9a016211b50bbeb2bcbf16a27227cae3b7b374cf32858ea520936cb5db0b43909a67ff3e0e6e387250622e59584c89c7a55e2ccca162e3b65f08135a1671a850de123826f3be57818ae19bd62a3920e9d3662a808c771fc3d0e0ee78793e1e028451cac392f6055c90de1c877590faca11c6ac6cce30724574604d30a2d85bff7f62d33ef430821fcb74bc4ddfbb9f773efb7ebfebabd776494214bb1845dae08330df7ab7dc7be355a262f06afee41f74f4387f00d114159c93670c7e8842a314b3848151ee22176e278dc107ea2b1141e622a6ec70999ee9f778cc638d818c9a4e289a955d66750356d8c646e3ce42cf0214e986e7bd1b8a8b95002dbbc4811a6790232136ac33e38e889d188f0a1280a17334cd35595654130c5a9d48c869026bed48c979af152d97b103e1acf66a466c05497092ea6d1d601cbdc1f690c6c87e395b9414c8e23d5f6d703936377cb6bf481c9afdad563f2bbaede7d4c75314d1341f99906a51a8cd6905093c78fb9af3a73df470560a647f6c8ea3e715a263f1bb442eba465587b9d2c1729988cf5611f159c6620e9b5d3ebeab6ac6c3b36838197ebe2466dfcc6010e40296a4335401900821e2a93c3110c6fd4c67b0a3e2722448a14e190cc806ddbd333e4f4989999b50984da04055058292ee22286c251e8e400036c632226e22729286e681540b8430522e810bea1202127344e34cd3d01db5648a8899290a48bbb7b555553f66b20e9d40080ad061b38e0520310bbab23c6a7043a84ef46131a7aa2314dccced41dfc41414242397c3a9d4e454551a250494d1e3973377b895d0574081f7c7e5d2e2e2f2f303537dc198a351bae88d1b58fcfe3e0189203a55272a8ecce0a41ddbc6abc82890bd3fd86000dc374bf2da0a43516180d816d27d4699f3323703398579baaa66da3a0408a2387ce0e95713cd4e478a2b041a6734d9ac09c50674e601bbb2017238675cf885b8e20c2c47d69bd04846387b183bebf0efaee3e04feaea43073615363320bd853e1832bccedc47cc4d21f9410d242480b283f509cdbe0101fbb0b86e3cb8be68af5dc624fe7fe456fe791ff65f3b930f02b1f5896aab2bad730ccddbcce9fdd7719863575cead7bfbbc9d332bb373ccbcda0e33332bb36bc15a67d700d8c63666deb25619552765dde3f3d8afbb338deedac58e0d9f7784cfabe817d67bafa5e9570783edebcd5a6520f4ded8cfb5eb6fa7704af9fb98cbac9bb461af99661f3412218470480adae7d160058e073310f99122b60842c2c303173f4158010f5b502942944491dcc1922e9a54d1c5130c3006aca74ed10591c9075d3cd186740125092225446a300322b438a245920dc8dce732401865f7b231b8549300d574360603d4c4598c262f99cca2433cd28177e7f2af940256aa02ebe74b4d2f231c56a24861e90f48489912450b213f54621005c67b0d3a8194a94127e862eacb6a6c357ddae8500485a5038c11f74cddfe0fcb296408172ec32a4c09218410c22020844f4addc27237fb9dafbbba2eb391f79c70c2df69d7775f73777f1d3358da74bc533f3fa90cbfe7ce637c8d84b5c8708d85e53a87cab876ce0531e9288e080b735e776b672eb2d6ceb96f6e02e327aa6ae0fbdf85fff103e27929e60a6cfbf8de1be2ac192f01ebdfddcdfcbb5b477392d7ef515fa639b42efc8659103d3d6329b8a7d52c805c6825444586869c14a181326099b0c412459ae05004b6ad90d0154588526af386869ca4b630379da2331dd217b06d8584ae48a9cd9b4452284263ad3252c2779aec1f137a0b163688bbc2ce921aba055878a719f705f7f71c421dc23f7952852a40010a4c60021290d080b9690dd0344dd3340568cd05d4a4b50d3b9a8f108478788444c1644811137b647f36898e0ecd622a16a652406b58244ba653844da11bd514217c9d18e1f2c408e52e0f0fcff22c4f559d2047336c11e5d3622c2dc6d262acaad262dc568eab7e107655599f62ab6a29a5bcaeb6b690a51baf2606520ca5d186aaaad0ec1b737fc75f2e8b18049ea1a5a8c1080a8542a152286772989017f02e84259e6ced0e0d64fab315a55ef2922069a84b357eec355447d5b875db31f78a7db590114c6af3def3e7fd1bea0028140a8532c0d2686035f7a80ca8cc4a91496db897f939e66d752b9b951cd0c95b6b8f394d406de09394308592b4484280d668cee4da5d8c1849d329801c61f2db080a0a7a95d912065e7a6ce0c6f0a236ec2f4a524db57d8ff1e5a53be3f1638bb83406662f31103f5615b73f8f511b864668fbb2022f6ada1ca4c9e3c7644c4dcbeb8ef0d81d82110f0d63bf0dc86c87fb63eef36a0c765e6776eb56de4329af070584fe5a922c55cdfa8dd1923700f568c4157b0a96b8e0744ab91a949af8af203e3ee48e838367480e873dc43804db3468eaa032ff026cd321140e1dd446a5081eeae66d2378dda81bd40deac6279883a8b48d9b0731ab118004100053160000180c060483e180703c502451f914800f638a3e745234140844418e03298ae228c618420030041963084146a1a14107e32dc3d1252b309dd7fa2bc0260079069572cfdd25f0912778bff438acfd9fc4976d00892659e065144eb16a5cc5703f884abc36ec39236ac9c68d22f6e8dfa9c3a2e0689183a8b9b2e418026f1413a23a74a79d2f4fc72542a96905712f3deb2e4531df19e7c0e10e287f6d526f88756e52b727ec51c9fede104e2c3f650d0d090a14c493773849f2a8d8e49a7722596df977ff473ddd6bf929325352d82d02c772d2f10a1ba7c21bc6f6669c807882078fcaa7754a09af00aca0de2b5c291d08c12261090a0f716772ee185e9a3f5fd7820abd449c3d71a03acfbabca4a9aa8ead156be86d6c98de91fbfda227167382dec6ba64cac7a1273009f2c48c16793ba387921bf88293cc582e19e2e058fbd918441e4d030758968975a6bc2a24ca886e9161b84f4f619fe4cba73e775f2985728c8d7cb80f84baef87cc221d1fdffdc0e8b36261c39ef596fb889522843127c9f02c5bf723e22d9c77103d53a8b3b467cbcd70d441bd9043c416a5b9894e80a28c580a7aad37a643bc85460e67af37ace7611ce4517666e2d1737b287fefbf53b37ddab7920e087a6ada1b2dc7a9222179c8fb465cd2c27124757e6476fb7317b7b070896f2b2a5725683da7ebd52634c1d0d732d25de98b488423cb0a07be5e440b8c3f7173c48ab255a8d4f08920620a0b0262ae3858d66f92bfc215a462f4ab9ec066a74c32c4411c77cbf2f2af5bd97ca2a0b8a4f34ace709d8862ad4f5c15a5f074acb7bc720397ea0e50f9b45f845b7fca5925fe750af5e3c4e039c9be96becf7affca4afd7315cb64d276a998bf5f7aefb6d64f70c4e0497604780aefba6bb9580ed4470635a02ce349bf79a2c87fbf87fb17def7793ec92667a06c322b5a46ccf986e89e52c221293b95c33d2dcf5cc8f9fea810e38a4c257d615f359989c57ed79212a9e20f04fd1e045dcb9619677c2353b809c48787f9c1f4c119a01b0aad3a8006a23623b173de268a308dd1f286643599a366c277fafcc6b304e80fd667c9474b61fd6c82a1d998cf082bb8c6dcf29da4957f3286bcb93f6e6d497669a4a4084e54222410d0d1c543030fd0e326c4c6903bbe3d7731db407a623a41a3d7f5b6943a2bb6fe63d2621e6eafc9cbd408e214fada0c4f7c6b7003b9e22c9ac29d851bda1be502af396da6567eef582742cbf80bdc1756e1974d332d2a90507934be2ddb9916c97c88fae15befd0b1acaa06cf0ae97b65ec5104b13e2b729a5e9c117c6503c78c55cdf8e2fb3bc1ae62becfed8a0aa76989c8e6e84e9bd4a66d308826a604d0a170d1dc5d37e88f9a1937630bed3ffd4ca3899990f005511c1d3999bf833e5ad7136548c3977e96c1f9fa6a22fb7f72e12fbbf9534f8bf7960de7e0b86081a2dc883200ef0046000d7b5424c4bdc443b374118dda2a3008007b99b625e52eda4b3d2180355a9591ca6dae395db38bd5e66ee8ed179ce12c97a46bbb4aff9a361f481487b12943c8e7bb34c577a180145288b34353dc659e999fe6142f6002ea0437a472dcc4d053ade531d56f2303a59c22a6ac0f213e5cc2bdfe40bda80bb0f41c4d73525fb8451d0c2506db1cc6a1c0948b986c243423d52ad65169166cafb029e770de7a25c6100aa75cbd122a5a29d5d2b23f92104ab1bc0d8569282a7dcbffeb66251c490c005c6f1c40ffcf6771f2230b80abf8468a92bcd8da023a0fc26269c3d574e66c9943d7c28614119e4e0a7b71b54a4a2b486bbfa9b8e6c996fb8cec6248db170f020a560765ae9df90214c5b1623cb33588f87c01effd151e26bf3b45650d0e2b18b0b1cd23b04842df3e687fa28de7aaca8436702c7a6e166569adf90da6e9aa1c0fd0c65f0b64812a2d1dc6a63924f3d3e2d13d648d97380ea56509c53526b002511e933543b46cb09463ad4bc5c3e4b121bf622f015742bf76835417224e5ebfc63bceb42200f80579eec1fe471a30905bdcad33ec7e36a33b3436a2617246af64f9543a422f53369a5a6e75eacf6b57307d8410b81e239cb9c130d45d143500ece27e0253baaf3f1095eb97acda7891c5755725c9452e5eaaec3e5fc740e707854b62185f74d26b756a599c8d82bb8126b28f0f4943d59a1c5d415d5597bc2cc0f643055500b84a455a768da16ee34a57696cfed198c89b6c509e0e2635c585229404e76f7147c5b6cc73d03a083a78e2c7ee96fff9aba14e925e458618540e171d3c929a094f3c396483ff9632e1c5ad8bfbb611097a85ea23fdfc13214ef0ee3dd06b67d805306a588029dd59873a9a84882ad100b799bbff483b44a54cf4af18961fe9422b20d9a2bfb20955115995842279365c97d77b145dc2d39b4431b753ab06bd573bad8a76b55d65a779238ae2c748150473a9bf3ce516a3283b03092d42f17d0af4109d54cbb324fe109a8998e40bc4341bb7fb2724ed875bfc04aa78cdf12fad6e0d73bb8370f3cd5dea055906a1472cf2df66e9f801ca39d174db1de9da875f416b7b1951d55a7d0a4681efbd7843f769ca8a55a7535f6dcb1df52df8ad8e82773acf407d7228d28b92851c60e2df939a7e5143b1a3eb0e8048ae7cc8a415bc276c6996d73f790f9f08ff254c4b7403481d0902e40acb349ec5f48407b05d5768d9fbfa0e5cbb88be68dbdc59740bf05ceb10d6785981635a8a871956b99dd85d25bbd2e8f5e5b3c44a83e1edc5b9efbfcb9cf902dac53f413e8a43b0942f521e2d6ab2ba237705f6bbd5d8d797e3f788b6d03d87360c5abaa967e74ab22d93fd226f5ca5b9a19875511abc0d883fdb7f060e520ede22391ba4e86ee181bcc5a1347a63ba29968ffcd16cd8c972382dcec61cc72083962a8ce45efad0611d940195a9b97e0b8a162d6e601507107a40efd12b09f455ff7953a34a57137a9cb7e7d95b8dac2068197c3786d8a8a11ba05213fe306bc99c070670be8a0926ef2a4dcebe3d09ac76ac206317c7c4acf6547dd51313e7f979092027c7951daaf7b24298a116736cfc1a2bcf90a91682571c325595548ae8fda47a62d8eea2670e7dd1a5d91c7abb4b299436ef807641cf19572ecc6fa4662979e1bd145efec0c26e39678c4d6984f45e143130c0071ae448a36758acbcf521560913c2600012135c879bb8dfd75afe6f568c571899c22744fdff38d2fcf8d72b90a691be4dcd0dc71d32953a37d0ae133ec1607304c42cc103e2092858d5301cdc7bdcc2c3d4090109071fa09e20142cd062af13d09f1da11e77a0711b97d0df886c21df7d4f0f23f5faf5021eeaf942bbb853d487048766646b481242ebc5e74d5ed648985208dc9c6a61943e7962a625c2d705fabbf840893302d6346f729c087c7f9d34ff97cb9ae3db3b49a215be9951a728558fcc2564dba3cece45a34799c181b5e2c6f7b03f98984262853fcc2269c93857a68ddd8a01c8a065737585202aa172cbaedd78228cd8f54d2fbcd24774d906e64fd8530170dbff84127f5ffec779c7e2a6a57dac009c357b00c9d63a8cc0c30ea20b6dd2b8916eae0f07db64199a8eecf0cdaa0113a8412866cb1336877f0c3d8a8800487888e03e0b0190ab936dae58cbbf610e0ab9e835963fc570b902d867781327c76d5d876268ff6642042c59415be738c04c48f1d46aeafcb171b9a898ea95bb7d2a142e4816ecfb96e5e67eae12f7965312111560fecd486b761bcb42054664986ac5a6781ce7f85070a611eea49fcda12684238fc73f90dc2d9c46ab11fddd48fd7e86d3d8f119ac2936bf1ceeb6b1424bbba8f0ebb8d1dcd02442fb92aaafd9eb9c028526a29d5fd1d34b5ed9c150cf915b81de6034343ff5e5ec45f1cb8cb82e2a0085772a728112c88b88f98caca38228e0479d8d2c4431a44dd7a4b43f513b037ed8a1167124230bb62434bf47786cad4b5ca2809ffd7af6a6c700b042d3c1d74e0590193f4197f65fb37885d86ff8a710cbc451f3cefb04bb7e13a538db8cf9cea37423d8ac44e016d8cf84c44b9f63f01b170b0a8abd869d824a399c46240043293b24c567b36b5a1df40a3119d4d17b5b2f21c70fbae7aa256159a113e1813f0cd272c8fa1edc833da0ab3910523c2577b1dfaff6cc93c5ac8f5ac33ef680c14786c6fd600f2dc180b9e96f63c896e35e43e13a60b05224f8cf11fed8d85b859e75d0341235f73e60b8d385efe0db1ca614babf3fdd073b7ac3eb03e5e8cf34db305188031b1899e9f30148f444074691256d7fdfcde7e7251e08697175d25b1a2cfc6a69e63eaa08a3bd3e925513b10c766c502eb616e5e2a34545682e7f4b12caf7d6a41c81197553d3185bf0fdaf187ca54fe7cc1af5c6463a41ca786c4d60e76a2cf71294fb0ecdb9da3e2765f679e3157bc48c7b684116d5e76a13a0474db2bae834e93e1408944a3377a0ee3e48e066e1a4b6d164a1f0dad493a8bcda73c8832d256375f7c8bbc3beecc3523ab3ff53c4b59bd5d7aa76a2d617df64d87743d5601cf306f1edcf67a742b2462e652fdecd1fadd5ff5a188847c090cedbe91b07f11be7a0c5ead55724fde695667b2748da1dd4b4ccc16f3ac9d1d12e238451e02a6e568299bbc482a695d7907131f1ff76e69876570e9fbc590547d0a578af61018046788c64f6a36c1c683f55c665e5c597f3f3c04149894547d691cd93a6fd3ead19c602d385a55ae653847f812c071ca623b58cb4aeef98861a58432e499e991c33d61004b102443283018bb8ff7420a1e0a0bfd955e79fdaf57c438b6687a7c382a93a16f78147fb2087a20066d0cc3645e4a6c0a7b6fc3428af50826441e7bccbb84c92567935caca940479dbd78b569d9dae0d693d0c83ae597223bfe23024292c36d1e3bd9d755fb4d7d59db78e75d9ab5c06af0de5582791b223606790bbaa6169cf38fa2caa82a1e46d549938987a9ec3de7df22b693c620f3b885c37d2a604e78dc26796016ef5b81a3274cddff09cdf898d84f9e1e990026ffce732c37cb35fcbf8f8272c3613b9a2b7312caa9b7556e16bd7e8ca811c85d8d59d3e358c1b6f44fa9449687a01a8da8878ccd2b73697f225667ecbbfcd166958d2185041ce9b03b0908070f44e9827440c7aa87653f354fbdd4589ff4ddcb27cffe4a0755aa4b1fd51602dfb3c842dc1c0ab78b748c7afd08d1d5418d874921bd0da8b447839aee22371fa4c2ca4a182ad249704d86db449ed91422fda4311018c7da08645f46d7ed8eb207349a1cedf2e4bed7449c5cf5615c16b887f186aa44e69e0b52cace5e8948b190b19ddab7a7fa22a7778589d3e7e1964ad2fbc142063e0adde6750c238a40d39bd93e3c8087822c869c4cd8e12c6d075ed958fc7e06a0172d99bc4328fcc952c60069e14c70427a91c43d8bd5c650cc874836224f6157563aa8af9ab1e1536d1e6967a2d8409959ff1e03b6ec44f46ae70b6d48d1ce93c1b3d38e1466300a3ec8980e9551ecfc90299124b957dd5062cdf648786c70d8c6596e8b57d287eaa87aaa1116e406df1708a2a03396be27ef79338e1498a8e82c747b099b2a791827cf97bb4b70ee24d612db8f6862a8bdc9553d831114be17ba9a1223d6f919e952174802a755753337a7a7ad63e7a2d9e3a5d723a2d530bb703838b20567f34101fd1c40ba07e60ed212f1bb6b0c89f963bb1133d59dfac88f2eab5c7fc146f51d321f830de09760ed9d8afa6c4e50bc02bc560f6d2f026065cc14107471d3b40b4ca80b76a9697266e6a58b239236ee06ecc25cb4bc5e353bee892da74527310810cc6eb7ac3f1f40c3ed7cba8ddf8e270ed0c53966b98797d06c6e75d7b55014c315617ae4560af12e639aebf60232b7f852ec9d479010b3f328affea318075f5731d1f68f4066060977428b1cc935a8a9681b4b144c394f8719e80db9d01f23a18952387d513181ad082e87264ed2f6ed18a4dc1533d0a35997712718bedb972b873eee40a2a2df8de6739aa9e322bdbc4fb71601e03a5a5c05da08f179dd5c2a1eb3076383d052ba2790b19d992f1001eaa70f61f17adf456b6bccdf0aae90dabb80cb0bf303e5fc1ee1fd129f74198490dd877e7eebf9a2df0e6032432bd0699f0229803debc0da4e58ada9f4979551a51f5a9cac181db016d4dcf17090910000abfb5d7c89f35f803f2af27259ea6f8c3e8c2849e2332697a89d5020f46ef07cd770bf1540fea48ab0fd336905e9c347d3379fe41f248a388bc004a050d072f381513f64f7843802f865ff3fd9805a10e93685d59403122f68d2bd8871d5157867e9b7635842690f6532d70b4cbb22b930548640b9cdccbd0ff1e6928f70d2305472d6a13cd4513f6b46745ff86f54318eef2eb8a023ae06211e0f6923df53f7c36574664c1987ed1df5c5adc085e3e110ce91cb791d1fcfd9903b38d3d6615d3e90e75ef81b27de481e9b454dbc9b4994da8b4ce704616499645e019c21d90d0a3daa60760832019816978fda118ba67f67ea0f930fda00e275eef1c1b17d7973726cecd9b75308f9631508f0ec34f606cb92a5d1ec3dc747e44b22fa88827059ae67f32d7beb422ed85948e4bcfa0b9ae1b7ed355a3792101e67619c9f2cba9c440d7f1c51adf1c21acbd7c46982c09467c4463fad0175f16ad4b1130b9ab20671d412274338313d0cba4caf1202674d2144a9501991d4585c8ac48d00cbc0828bfb15149c7311e1210949f74beb65e81a49403401d6a669621b52ce362a8911f04a60ec415980b78fcfebff641e093465091403aa4206bdfc7767b97cc0c8e6da82e97226ffd6fd40644aefec499a666268996d2ee7f27f50c066d97d2118d118b5f754c83632a791765e500002121ba23234c49e17310ad04be4592f31221ea5faf4ccb80af8c14befea77e4d3e1f1e056111a19ba29bbf688736fcfd4a1f04cecbb170dcf51c542ff6a3df4610e173c2d79d0708f976a75f7e1e6d8476294a62af717c92afe490d6221f5d1cdff520681516f47161480fe89c043257c60ac8635a3c57db15fba1d3cd8d71b5af4b121fa3c30e27fd2562d953e22343c816317e90fcb18784bebf259a8a3705fb249c4a74f0e178190bbe24cd352775911b53f09467fbdb3de80c9424a1f73b15e82895886920ee8147b3d1498a4a123d3191e680cc0aaf7a3295bbc64eda3f32fc3aa08764c2492ec5d59ebf4a002b2f2f1d42a6308a00fda7fef23b5c892317b24b00abd135a58ce5701c5d868642238cf32969f264e28803ac71f5483212c94b66bb0b58a719a181025d17f1cc381b9cd7c3c877d236ab68be2e5ca94cb8a3847b7da3a55af18b0dd460742730c790bc19130f33f6ea11019865b1ec1937ebb98378a26a4085c04b00b21d1a62b6b8e116242c5c303bd0e5971eece4e54230ba9ca99cee962b2e89319da81566eaf50dde148327073f93e9a275a665e938342bfa3843675048d0ef8183ab4bc015775e11722490a02c399a29ba427133a25b618f164b496807784f5d8a5f6ac49349d467320e740c9eb6ea08604874f07b906293e8a71a855298917b7060a845e40401ab40ed74082a31a97080605ae7626e256d4e8ea3bf68987c2f0a7b5c653e6431261a0b3266307673cc330c8fc84441abca6d1a95707d621a2aaaee762b0e01cfc89bbad795fc71b5bfef138ed619cffef71b9d05e2c8d394954c5c21a07be021318035bd3f2dd890eedcdff3d024740c9441a4c228651ee48144a1610886d52f07d52f80046620d17dbf58830fa30d1e086cbdde0e8798379629693a9b107643fd51430f5c20e85f5f16084b0a5f5971dcdabe0696c0fe41e1de64eab245d2a2ccb4811b2b2a5de54b57357a9a80a6bca9a79e1193dd1a9a6098ecf8162ea7b2c26a21484f08d32daa41b3b1a1d9826e575bafb7eb5d74b28dd46ab98f57d2d3712fb55a5bd55b955b518b0fc68ac7b9878e61a3c69c629916a6e6aa084e4fc17d47f48e3f843c7e8010eb6c8a88d184400f1bc4198322c1aaf55863fddb0021d3b3c0cf4fee7b2c685617f49e64884b3014e836c0e02a6c59516affa8446bb119c87ffff6b2aaa2fe3cde9a54204eacc1e38d49f3dfd656dda91b5cafe586f5655de7e4658625b600c1dac54176c7b10e81a2dd75f2a25c9743ec394c8347e10a225c2e0e5c0c26a6015e6aef8bb078fa888329d40b450766d639c041d3fddc1048f99e847b0031f09ff9acd3d97455760c55cee5709ad1a40339f879af2509cd68290c6809d3d0182c4cbbd8f611a40eb62ec1c72557edefdcecdda00e3134b5b8e41fec0a003dd2c3506b4bb2dbcf588398ee49040bab7460f1bf2af4cd0d061dc7126e54988505e64f596be25fc828a0c9f1b62cb4f1c5973f0cf9ed439a4dbe68414db052caeefe64008b2ea722b080ff3d0fad241241999f9468ac3bacc28c2776644250268b7c3a4b3906b4b3350a8d141023797459f6c02ede1b74b98db06bf44e30822aca84daebd80d82c32291cce91ac304a80b4869dfebb7151493169da0c419e2d0edab5813aa2febddd1dcdde643e97ebc2ae881074762fceb1dd4ccf9a57a03ac831397509fb913f02663d6ed03c2e03a41aa387fbbc62ef16d214744bf9d96df55f78392a4d25ccc34c0aaa7ca7c4cf3dd47f508391df3e839db57f7b93838c3dddeb73e8e75cdb8898178c868e325028a86eeb271394e8ca2e9b12fb2f172405d6322ab678a404b091aa52cd18978cd32230fa2e4e6f04ebc34faf5bab8f35e4d11d6ebb2640094da629fae19de32868d75ed825f8864108873194c39ebdf25417c4020d0f721ecc4ef525f3d36e4dd63d62a0b878a91a1662315b440f3b1c0d04140012744991c2f3585dd68bf73bfdc804e394ce17c9801074e8b270c616d0160dfb2e0e6435d3020f45de64f1fd55e1b93dd17ba2e6e4a2592351b44598d732114a764c45c895546af728cc919bc4013ec5dc48094aebc1b477d396c4356aa4cd233dc3dcd322e69295e6e246af8bdbf50b410d86136e0e38c5d2ca1b887f07a99d610e5f6b8c4ce27793c1358ab34ddcf63f2b64b65c6ed06207810576fb591543600107e80e49ca619c14936c4c029fa50a4cc2034bc398da83ab6968452f451c833f45b3558207004dc060e77e437e06a17f2c93d4405316ec26c3066b6c828abeeb80ca85c52c88b8ceeb1012513dd2e298c5625a4edabbd1e8b2b495337085df65eb7f05d12e1d03e1234721541f85546141d233326dafdb85a93ab615864e96c46042f700e6b4e43bc65d454b7798df39359e2681b8b6fcdb223d2723449626f106fb9187e043e9aaea82be91247708ef1111f31a46db2788234ffe29800553e2d3a7e73ec9fdf41e6e95ed35c97a4e28513baadb0ddd952cddfa0b91002c46a7a82d802dc73f66522ad3639f886d7aa52f32bac2f1564b819049fd87d7960cba44dcbaa5453c9144df9d684a708056a596309922cae60b8c123b88fd951b0859816791cc1f7232d01ae4fd5d3ab3bc7e15dab9224dc799c934e89e06d231f5bc475a685d4053a9f3991434416fc83b103490cf4e1d882e64fccb6d4aa3d4d19cee4f91a11002ef25288c2c0085cf053b4e7a81fbd1df14ae177f66382c271f78c0f605635d6b53569ffe09b339fa90e3ba63c08a25eafa97f5c554f65373ad254c359e79ae98404b5570793d20f9a92a323aed1aab908769de5c0dfeb13a808b4a58b832f4c6e2e9d0c890e8aad48e063c1b82e04c83e67e34f67bbe963404148bdd8cf6cc0797ae998c84068f3bb3dfbc592af6268bb39cda9b9bc55513933ef62ea18d2b69b4bb5f9ae515f718a77fed7363393fa1097a126847bbc556df26932a3797968dfd63bc928f7c73575c72fcfcf38e70a93e80f9823096bf7b920c2e2cf69be33486e7c90f78c01a75a0770ff0ea613452340755cd0c83696f19beefa7988f5a0772eca56b3db6b450d829854867462465d88a5b278bdc5b75a2dab07cf2a47b4bfff10bce98576ba64bc72cdc12fbd7cf0e675ff41d002582fdcc5ff80d4bc476130ac8fab9729e746a2c9a23782bb57ee515d01f4036042df31593935ede2305d54eb2bfa4cb64aa752a952f60aca5fc8d4fac98175cd697206c7e0961674fcb1031c28b2c9ae9b2ba8a8e861a009cac598eca6a72c26541f219f2a074cc6b88040008d5234f704bb44fa1a28f8b1a4e0aba961da23eb93ec452e8b1ce6d450c01de456eacbedf8845c0ef1ec507aa684d572a6c6d510fa3569066482f40cbccb6d0046227e45264a74139d3a31106d13764b6562f82fe0673351facb4ffffbdfcfc85a30b99b3f2ceb38a6858a7d5006283ce8d2f9526f7eb942a8c886736df899e7c8c6388c0600b4479ff9751013380d0c640ef9445c2e8a9c8d86e75f4ab0a045b12cdaf1fd0d81171dc4396f2b88149f1d6a714e58857f04b954be2d48cd198cf244150c8431abfa02a551d16db246199ac36327142dfb42e57dd990aead33bf41764b8161274801148d3fd506baed5aa18a3c39ca078d08f8b1823c1e0ebf83af0c5a5697407857d580e32573f717dc8a0325c46a8782e7f10af319c230c422a5c6d4f23bcc18e016b09fe90e1a0ee05072fa07e799abc40b7ee9ebc2ce6d5d835b05c7e17db5c1c813d05ef2d3b9aca1d3388293edc512f0624b95a8ca8a15012abf54b67348462b4efa5ddfb56491804236ead4d9d2ec0c1dfbe85ba3a47ed59b12c675e19308b515132b2601bd62b2a10fdba37550f9451e2bf5c01bcf6e45fb66439bd2239f2773c38739eb5c119d26c9a38d6c7475726dc8f6db7acb1bb48d5cd055a7bbf87b22d3bbaab0937d306a408b289155f748d63683d464341118270e86b631c2cc6448e34abf3904d6b27104f80e8762c398e39db084559ae88c3309a52a999bc40be1c09b8ed0c9bc027fd753935ed3cfe4875ec0a2354aee2fab065e1dc10b9f428621cec5c23e4b9058701c4efcb1d81fa68f5a6cf5b87415cd1fea63d5e8b74bcbbc94593373e9aa8552754554da69cce451d28770459d622b7eaa0e057f5a5b2174ce039c40fde8eedee81339981f5116e4b27de56d4d42d1235897cce28375aa95508b14cccaad574859e1084d0b9d581a637c14aa8b132a66c03d1eadac01a2fae834b083c7f606d911c5fd496059bcab9ff82c12da259eaa2d115f395c2a91f91ed154e22e4aa1a8e05e4527c4a19943cfd1c42accd41525586a01fff8e66fa06c876b2e80be2c22f1aa9c2a57860e18f78704999a83257e5686b197feb97f9ebe47494586c34ff91b587b68ce05700b9b72b94f28f1522f0f08cd2a1be22a83fc826daaa20552baf3c9a9abfa88d7313d5c99767482814d9146cc431edaf7849c12ac1a6f7828737acded992383d8622847980e30d116b00e70eec3043c839259601e7378fab8cd9ccda075ba245fb6a1f0b62cbfa3a69b8c1ae753c677f517c8e52aa5e8f861e54264a2c43e524a8e36d2fbbb8b949adcc2ced9dcfd09e3d82f3fd703acc4077cb8292f5ab61cd830c6d43be9855461ab7e2da48f233d53df31c37a058045c76ea4c7a2046f572f54873bcd2db17e78bd488e4af2002949bd5f3969f7de5f7053dc844a28702de30b8b104411c2f8d6bd527ab3321efe83947ef3318732bcfcc6a74e43800240fb0f028e53de04540b80b7ec1bf15605707140b0c57eafc8efaff8182bffefa5627551462394cd8ff91c3f3e1e87fcedd3cb504cc49a93cded15f9e2eb0f0c27732a2cf846c6cc77da5b3383d3c2a50d9d87b4ed94472ea7b55ba2f2ec0fac5b98fba936aab4bea63e791b40bb270775d8497c078d046d3069d28dbda02aa3e6ae0663e83bd102dceb4464e80d0b8d4bd19f33568075f3d508c1bf060ef9bb8a4caa0d15aa6ea98a120a1b6a6ebf599ab1b74d526edf7c9e00851465f26843bac5df8a0a3f604aa6cca8b088ff5859141a66dc6c506be24347086309fb9f161cc2b035475a3424c0ef3eb0f70bce43c280698aeb960f58fc608e662f4cc046af85219b88f460786c5b78f97aa0fc8f3e34537ebf86a2c0b4f5618d042b5c99c428068c3e79a9c7997d35fbd35c0f93439e48f022875a432755d5cec569a6904097a1a99fc1348413bba428fd672553a40c595da1e721838e0a547b6ab1a1f1a08e8d4265f2f9273258f60379ac15bd15077b8656239310758b422ac3667d1b14f4c91c88f6075e742a98b5ce08d1ce57e2643333ce97e42a76083f8f2cbdc484a152ddf43f9b26368cea0cc58987dbc690527a80ea8cce61cd8db7774a6563a3cc92983ad3564bb0e83be9b52bdbd32aef41193da50cf1e1a4d755997a5ede7288e4d48f43876080bedd047309cf83d2f651054a42719f599343978dd444bc6d0f3ec99f30ea4c0cd2de5e2f642784efe7aa4d595e3d6e3c528d2c3cb1f184132500605e51c9e2642a5db48e116f650905e49ed81373d1e2ed86726604938149e5f33a7293a013e9bd0d43d29f594ca0536166e33987dc61db4e0917329cc93c2833391f398e6a4c0383fe4a1fa1f709d9176bdb92536ab646d751e59dd02db2d7a9e0108409e7170277d5f858dac385bd40bce6e0886a7b4b33bf4924bc1f2423e3cc5698ef272edaa02bca8cb9000e4120fe35b43e7e9c801c0cc5da4a93013dcfb665d05f5a954266e20a9705b8799582f8f8cbf0291e681740caadb6cbcdae5eddd814e49c080bce664cab1d8ba040713f0d3849e898d7e36ac411919fb56018b80d403dfe62d603ad6745769b60d0b6046e9d1b4a9c896ece6ce644c2f6b922273abf60e825b639a8034238450f93f822f4d96630af25b68db1b8be58a8316f2313c5f09c6ac8ececbfff4081a9a938da4e1efe57ab3cfe69115911afa49897f0eff48f450c962168644b1ce7796058c260570ba229b8df9f7e85286cf1d38d5ce78b4a9f82d4b448a0124b1dec0f47e0473a5d8d07d9c13f42734ffcd29c450538c8f6c640d56919fc7f230fdbc387130c9fc8eaf02ed16cb74cf7a4eb3816371ab3192f6d82ce8472e42653d22a5fae0ab296d935e647c5a1c5d9909ec6528cf83cf7a4d00b0f74b0e4355900ed127e64baf6836cb8c18985a0bb48b28e2cddd0c83c05ecf088f45fdc814fd915e9207075dd8303281660411f70733f50a661d57d2dfd5a2a296313ba43c7571ee5c46e464826ccbe1a6d8726b67d0a4e56fc2ee76bf0b85c36dff559c1ecf33d4a32b97f81ac0fb3a1ef5fc8db98723f4cc5d2aff315ce2e0a4010112fb97e9b527f41bd67b2a66d43dd3586207f1d654948151cd44ca321e756c5cba9d44b9e8f724344c4e94814d82314394c28733b4877013d1e6cc237e4d74101c84f49ba9a7d00dcdb668b3c3b507e900887d9115aa991fc797609217b6a3de8f7bcb078659a668ec21166c538fe894eb143b3df42cafec0b8a583182ba2c8ae314afcdff3b215ccc60a21dc18b730d59d0d47ec0245c60a65e5440acc76c0dafc93ae373f8b6f56274e079d995ea79ab561fb4c15a5c307b19a617510b3c20c215e3da04ae61b9036685c3b105026d02ab1278da66627f11990970f347d22e47170894f02c2769f5aa0d5f6db46cf3ee996c68ede1dea816bf49158eb9a3a68ea6f613d4c4edd46a9b295637a4c6b2c8c3fe690d61090ad3aa6ea10321e6b559d6a453f716bf19860ca76fe01e8d8e794643beaf0bf322a0771494a2645a95016531daaf5c7a21b4db01c558749e3e159d952b02652d5f81a59fccaf8ae3f280e727c965e1d3fe67ee427e1fe64f1aab09032d7a09f5aaee06c2d4a34a897c1134d9a220e8e0c9b7fb935ca4401aeb6942732c99b8401ff2aca2398249c590f0cfa0d5639e22ecf1aacee33491a5a4e2d78882659dc06d3f0186b09ff8f4bbec1b6e161d164c9a8e3cafa1ed2278a2c8b283a85988884acd6484b618395181c9ba38abe4f7c57aef001fff311fb36504a8b11e9ae46272f810111dcbb5a62478691b84eb9ecdbb514a69646b4ed801f3e8b78e913b89de9cd902244d9cddf12244db728227795977a1814d065e8752d885edf1b4d65d427ac0550bba5417281eb56c05753720dc997c56a08c44a1332f4b46569e13c0568187d8cd7ac97a158c5720167da760119e015bdf1db7d893e0e4a5e40bf0254db2ec91155413d9cfd912a0242e6d27bb974a01444d99436296944c4dee492cbc1a086f250db52ccd47cf478b501332138f086fd367ba991573affd6bc0382975ff0bd10eeba529c6d9dfc12d987ebc49b7954053fecd8d1725f77d75704fcb258c836faf56b7d1a04702903b5a0a7c4c217feaa9b2dcdda821d7eada0da9766cb4996ebeff3fcb283897ae568417b4bda3e3c4dc729a39ec3e4274184316e842adf06e6a528231d82d3c2ddbf9fefbd06f749602089161601e4093f67c4cfd1e8aca4167104346836752cce382ba0868226f0d9428dfce013ed1da11469c158678cd9c8fbed77cde8287702e8bcb3a5f0b12caeb141701747caf5a6d9e694dbb6c24295241a1aed81a7d7e49e22fc0e4a22756e4548e1a222f3da9d318a387db1ab0d8e54a62bc9d2d48a50e98d7db21c18322e3032dfa2d5df302015bcb687910ac3a23708fb32b3128b03f653dae55d9b7370de05305bf6d5e54ee9488f2e426ce857a5fa9b33c3863b5810a1dd8664aac0b703439ca0d038c18b2c63fa24ce3575b5c4f42430088b140e7fbbf1420712f8bf92043c01bc522774d50a33da91a2f22e476bc05dc5d8a308a9829357e1b15477e171c960dec328cd521dcc3c8330ccdf52910b11223069e672ef024fe761a618befd11814951b2015da51ed54193c22d1d6836a6d706f4a42af4ab275ddb9f6ded2339722c9f3fd029b5304c30b07b0fbc0dd092a386b502f802aafd202f554242caa1059f85c7e41fc1d1b866b4349facaba4255b0f849b225b10a513d496c6ce70ba6cbdf166992fb329cf1f5ceed998770d56174de6f724881cdac946eb34d1c506f8ba86cc69b97d90c8b2a0e4400b54debe16e69c6654d2b9f1d36b34f80272169cbcfeed61c5a22f146da42a9b3b9411cd790b2a8b569c7554557e55e555d10b0d0474d75ce281cd59fa3701545170407dc76070bc03e81f6367175d54da3f9dc3d10534fd8869fea87afb0c7f4c527066fb025c2ebed3f5d8bbae1082a2cb5acb1b7bc659ec2ce0f95ff10d8ba2cb1a3ffe56fcd2e4eac18b5216cad870c9b81f4c29acdf211990dff82d7ad422d52e7f8d8b097358a596dd3f19dad9315fb5c51f1f9ed9a0095a396d7ee36c07d1320aaaa3df05d120362dd8490ce469a55b89b0b1bed5fe317edfa1c0e19106046396ab0934af72be7be909835f651a153c2bf208269ee4270067ee0c6dc0e66a52c7340c6d86da2e5dda9dd30d8f7a34e931b7625a30efb196ea2b8b1a1fac2d3250791c79f3ac92a92684107218119ef83d5374e4d78538b497f7ccc8425ea5cd1b7512f0ee1ba2bd1c5981b9f7741164743808341b91cafa456038417a15c049f2169a44e87cc50fb549a62cdaf0cbe85a4bba4af70adb5d479dca07fc654ad1105120b877c4d66f979e6149a7ceb655888f4b51d4d4f5e6b3a82e00bd423b23d334856ed1997562cca85921dfcc512cd01bffa23b5b88053c7d279720057a0933029fdbc049f8ceef897411a919a624198bea23c89b3211c6c84fd77712c9de5b38cf2cd73423ed15de063ead87a817cb85bbbd8e58ac46a202ce112babb60f648eab22a3e9a71e702d8a5e01192136bc1ef4a619d4d0310ac9c14e8d0e80ff9dcaf887dce2795a48416f4e64ae0188a67cb9d1abc3f1e85157bf3aeb6dbd3f6ae40257f95ec3005d530def59031e6360f6468c30a4cd34514240e08a8cc08961bdbaab75590a5692043c17b8cc3d6780d955c4f1792b781a93f45612b932e221210f17429b00b4b35008145482f218abab9870c30e191d0871727ae944c6ed1571978477328fd986509f1276fa6adad31fc978fc5e96db5b7404db0e7086d5b373be097a1390c8a92e617be7848e0856f5a5e53d4376f12c3967fddfe04ff868cd428131ef2444b573d0e7e7899b2a5a869a2ed19da1b2b70453b883e74394feb55f53ccb510e5e0965e2828492022a8a7f88c6f31c5bc6d72f41dca8744a54c562b22401a5dc368d5ae15980f0da0554a0ec133d8bcc023abb40646344e6d17f486dde77ebb0fe3e49ce0acb6afb6e11cf70d874de6c7c2b484e57efde757ac154c4d53ac149bc8b77f414808b2a8b71a3091a81c3710e2a9d36de5747066a9b54cca337b10ea947944079de1791066e959b3192d15ea7959bc1bb39663dd9cef5dbd1f36f20d6fe7b0949c37b7ae135ef57e70de21042b54266ebe7a743089a783920aa537d88f09208d8b392a4fe77d24793fd3484bf6de780b65b2b3fcdcecaffc48000d252076a2d44fde6c283ac595e0f99f8f389780271ec6852f3f63608b47183942aa757f07421b718522199772b50f07580b7e4e98b848e6d5f6d1d784e7b8b8994d0f2b66bd1ea465724f6ab50fc4157215ed830be3e792b0c908a61ae01875698cef994dcf63b8447532893ef274cc25b7a8230840d1d442bc30f3eccce9485472ab1b3ae7a20a7d40089e7d7287048de485c6ade633549feb12cfec21f13e9b93877f32302dc77ebf0bd6f20325c6590236c9c0eaf156777b282724361d3099eb116948601a6f41f5abf30834ed32338f169e4002b3d026231a48a70bef6d6b72cf3df05dfba0b03e4a357ca678b885f3f542c8fc195b52b4ae1e34df456fc42d28021c8ee01c3cc9ec2b6612d17044c5ad99431c9dd7c65155c85b8e0e8760b300f60e4e41e141743820c73b011acbfeb514662c53121e0e8d5e752eb1e8c639dae88638e4ef0334e50374d508e8b31a74acd35801724e8be6f70cd5f0b3c67854283912626aa3d8f2d861a2813752bb55059354e09025da3184235f983808bc11dd8371668c39d49360a4e81ce740d03cf7a4926726b908468029eb280c08f6ab1f32fde9b9beab2ad2fd2217c8c0946e928e49d8e6f901478ab904994568bd4bcca65a92ea0ac847efaf359dcce8517cca9e42c62506ccd0e8732256e1b0250603d41223da7346b75962b6129b46665962307d9563b9813049b0c4d099ee2b31e19544cd33a34392f9a1db0ccd83c7c7ed9598f484247a2d591f0851bd728d13607891ad099345082e1592e7de18e938315063c05cb5cfda080aa52b2ef8e12134c8015dd4287f456aec4b3a842b858e4e7fe6ac348cb0c17360cc32910022ce688921394672bfa1017c757c0cbb871bd85206f64d3c4530c1c6eee1435f61b0356813951920a5626a4a1ba512eb232940c80ba154db09a4782075e87c5cd399bdf80f8a09358b22c0dc5a65f3af50db313913b5bfc6b70d93104f4ea4707ec5c6413e96a849bb9ce589060b725689d5b4ebba4b5306c0d795eb505495ff90675b2dbbf023381e3271c5631ce9be67ef2d838684d3178625ed2d5be716e72fc965c690602f36295f64baaa5507984d45e3250971d9c0f97211b6e67e44a431bf3e7c09566de3f59fd7289ca0dbe7dcaccc49b6e68d8ea5fe81d2b9f793848c2b35196ee684d15d026e802013ca54a2798ada5b29e4d5fba9398ebcd5ab3db9baad6ac6b702375e8d3dffbf6ed5ec7794ec8b28b88b5a5edf578858ec65deb1b6c4c2ee4bde05c8325f9d3ff17a72db12083265590da06ab3f875b0735971ebe7a0048d4767e330647796454572423045047011cfc903a82dde9bbd4338319785fd38c34e19014a2bd6a920f6480c39aa17de8790334c562cfb61494a90dc14a50a95f01a2a82185e63d9190f0caa75a3daeb79f8025848e472da38c13036ce84eb48a79d0b0d1267a7c5ad0733d0bb050603142edeb4a06044d17427b781b27039abe21b17024b3f273903c4a7401957c90709df19a4451e404221ab48f05ac0914e0556086e15447f7e90309edd83a96a7f9ec3bdd37c87e8970f10043441363f3f769bdc48e299662b229b781c53f7d00a7d39bd8eb771662932fddc90d40a2becfec6c0206fff2a6a8ba62f933111591fefb4367cbab6bcc840d8bdd7e052925a878bc1d1369f88629f75c4729e2c7036f652dea484396fd48124f4187d144429aa57e9106d214e7dc212db4365ac8f4e0b3d24134113d1250b3afd606ad1bf7a141affefcd99530f6640e9dde85108b04474ebd1ab8bd673b51ce328dd4e3cdb314f0c8f962e3106b68589df552e11e7903f87527778c3fef9f4fcef42f7822c7ba86ec3e69ab27316a8f96ee6b9ccca6ac3ab346815144563d07b9be14af51fc21cce51dca2aec0910a5d29a8703331df63198139f9004459a0d90638ef7534c9028ed620e2faca92fcecd3aa57cbaadecbc7a0a9159fefd2ee89f793007820d3418991d907e61baa1fc668ee4f8ddff5c77cf488059b9a9b0f5a277b28842588e75270c1e77fe0d9263e940809a7bf95224078a6804448f2c4ea20521cc7b2171de2603585228bbc91a398df4dd927f690972a8ad928167649d34b116bdb020574c04370ed6da5e7f928bfdf263cf1591a4fb63ec147d880d0555e40c022092959e0e7e9f86014334f7afc874940e1f9d15d61db7c8d45ad7698db4b495d238494df84f7074352761afc8f4dc48da95174cd84f9fc02c0f3da4d53e685159ebab0c2a6e2a7af29fb8cd5b555f091e9d20ac014d8e7a32e34b3a030ff6937ca54596ffa865199e49c4e5257b6a5a843ae49bb2c8a58789c4639fd6e769b086f174d0b1f96a187a41b0f5656b8b80237aa8066169d12eb690944835ef2f9160212ec62378a09d43153c9ef9fef570953dabec02a51439575079e680d23b5a8bfe370020ff32a5909aa828f3b5bdb6fcc8af6d75b9f8ae112eefe561f51602a97225b3580264d105ec6fba8dc052d6f9e2000be6ee3c077f6020aee3d52ab39069c4015d8d9355386e7566dbf237d00b0f9326de98cae0fe1c44c4bcf047ccde6a4baf9a7f8b8d533bab5f2dcbea68193da8289a5d068c162002e93047de2d35e4f07cc52b6a65cbf66f8b536b1aba664e41fa7f67e7823b70894dd5937649a7c0a199526f9928bdf722e8aa444c01c8e31e8882a80d5d7ecedffde4637795161d06d9be4960d40ee103a3ca9aba9ae5e4d9beaa8c18b415d7e790c966213f8dd29d4b54ee55cd580d06b99427ead75fed4d1b1ce42a4ba29a9f41039f542d130eb2a331c41ca853941393e9bd1f7596d963e66506c4e06371334b65b79cfb677d61b6bfce635894c06f9ae1d6b5e9144d0c10622a57a934cbca5f6df39240ddba8073ce6fdc8454b74e43fb229e9f7b5450aa98ba4b85c0b14415cdd4433a0ac0ce309c52d7ad733d845952cc7246bdb406ac822d95096e90d814baa71821cb4e39ec432163f6f305c4fb76c6561cb2923dde27c17e5339145b47fb9bfe450c052d893b99e4f7302364433932e4a5e26b0184387bdb403c6e26e646dcf3ea58269f083ee1911b759e9af8d141c0a6cd24a1473194c228bf562426ae37667ea055cd4fd8b7f6c91b77040e239189a79607acbfa7f1038e3187ac3f9f4eec9bf1ce4f04b67a4aeafff2ed629e6ee031d7679774afa270bbb784175cb0a7644fffacbf40438177bb03ee10ee53346403c1a284430bfdd0de66af05430fe8413a26d6bd791c7bf4ebd1acf637098711efa7eae8a6e73aff547a421587cbf508c9b5271e8a5057d136dff739a1fc05f45ef44d553e2b95ff1eccce39b7c5a8447ae1b78a4a6bdb4a09505a7d8f25280ce2a7cde2f6268062a07c8c3985a0136001bbdb602d5713543e8389debcac84df0f156f61dcf2c3e3e462e49b39d3f16c009f8cecfeab0ee65b2a5ef168a9f21ae25e4061a1c2df63a409ab85a4506a2eee736139612ff79044f62bab0a4750e56dde97248eaf9d745346f5a4d6173849ccc8d5f02c2bd55886162c8a795332c2673c7c857f5d689fd37cba093c0ee588926a1f7f5a071ea3452340d41597682663f39de020bcc3b60b0f2c2a3890a4c893d41f26c7097e679a1bc798c3d4bae849079048866861b2305b8f7e9a4a111607c9ba33fa594b7922cbb620de516aa172e6b0d41c033f890110644963578e61e6eaca32cd2e57caf1825fb93bc6f09705f06dbb88160168ac5fa76296042e17b5cccd9c3720032882ff476ff7000ed4dad02d3186dc25bf0b41b02fc53f5a292fe25a4fac97afe7965a377a9fd09779d3e5eed756bc10b6b61bcdd2d354b43ae5cbdc75a2bdeb3a18b6736ffb671d5d1ba2fd8ed4430fca2edd450aad22c253f88805e2bfb44dc8d4a617f37f49bfeadc8b8a97b69f40ed43003ca5166785b30ce424a07026d0563d3624b9e585045b675d6f88af2f2650b0a863ac375b916ef185a765479f0392e82b1fc2c59c513b167383d6704629dbda1392dda331023d02c5379d0573c7b3edcb730b3f3cff125217befbde59652ca246584074d07580746320713d115f6efcb79c4d8398c0a696811fb8f161b4ac638dc9672bb94c7de85d409ebb17320a5443207fb66451e29d163b74618e76c8d1efb8ff65890635e038243192e13aa3d09276358e289e88a8b89ea10c456bfd76b074de4f9b5d62ded9980c3d13770f4e72e98bdf41c30fbbef454a8e1a763b7d66f10cb8473497966a6492e0b6369e462ff0eea3dadad991765cfdf2457f233f7d6124e32dbe06da5c2c9189688a5114ac3d4c5ac13cf3a33c59dd1692fbdd3da7c9a8a9b96b3fd1de89cc9134f3ba7a5d576fe80ca2b355666f369aa8ca394a336b7a320bdd5e6ebc9c9e916576e9bb3d3c0dc3d719cbc76823033a5a1c8aa524ad90e020eed6e5b314867edeead0739daa7e368bd4a5a6d7733ac6d574a99d17a86a33da59436b576d4a7b596a3b46a1d05b1ecada3603d2339ed4caeb5d64a67d6d7959d2caed5522f5c4a29a574aa524a596badb5562ff294b56a980911194ac9504a260d194ac9504aa64c1a329492212aa30d7112c76a3808f57e64d8478fa60c671680016b43397f3e85644efb0b9e0b2db6c7b4cdb6e0b3b47155051438ceebd19cf34e68c9c26915f734d055630d6431a95c6834b4032171b43f7d0b21731ac914125a80c7a389ebaac469d13d9f4353680aa986c8546b8d6a427c35e31acf4f8b9e4bc920e9124fcf52fca4ac1c4824f1a33c82f59c488c9933e69c530236c4d0303ddd508689d6a444492899dfc4738e538ad1112c871fe7d2e4b2f9386363a6ecf264c9044a82708202d49a94499432b36676b3835c2e170fd31b520288899a49b09fde4b930b2945e68cd9657ece897482a04963ce3969d83c0d973f3c0da741430a134fc367783d34da490d92124dbec6b3d75393b3a7bc9e9c8a42c6a71ce5f5a45028f7bc1e54f6a204f15ee79cd7d3d56c79ce2513cff9e6f5709b4fc9b3d56836afa95ef3aa6945535e4b0204afcde035c75e8ff601d2d0e31b24b47cf655e1ba520550bebcc5625c3aa0043de5e95cf434262a86a1dc7b7dd8c205cd099cd0e204d6bad488bf4d90f99bfa7befbd4fb0ecf82d96780bf298fd090e7ffde27ba99080bbf7de7b594eae08c20cab595e13a323db164e5d132c48b426ae89971c300b6584b6262c38920135925ec91f71ee02043008426a1206d0cbc94f08582043e4c48720169a849c9400a8014c8c9c2001c4c216474e9e48c2020c8c6aceb09ab55a926d5e221991428430b088b20598dcbd443232832422224cf9090a80999c7a89f433f4c50f124ffc40e12c2a9c8ca1095119436528a1b12e7d0447d4aade9609218b3c4e8b2717dbc4e4d3bf2ef26c59b98133d6a2f530296b3e8ba40b94c773eb228bf254b756ecaaff2856cefa9defbdd8859e0be93e50d5a2f5e0c81224436d2d097eccf116477ceb2d5abff19166aef8c287232e578b3a8fc67d5db65b89a399ba09123298ca70e5600229685c689ac660da62362c571966dba25a9dcee974ceef7a67860d25b78f5c0d25198bdc9e5d467ad0d57458ab614f81984d6dbd6066a90e101062b94b5d91658b1d7e39fefbc27de1beb8900497f558fa419f66901018114c245dcff51ed02dcd39bb55c9e35ca22658bf49a1ca505b94d8dbfba99f30cef99b42736922993ba6d2c4d14adf48be5b1cee7a08390dd1272257d1cb08cc8fd4c83775b5d84a734787d163cc2a6aa3986c435a5a4899e8ca4b6e400daf81ef837c4f81c8344fe5ac431910276338c2c818466328b9b8202aa2a34498248941248653bf60cc9827a630929e8ee88f112e308ac0782ae3e933901f080864a466a5d3cf34c9a7e9edb125a963a3c2f17a86a8b5d62aa7d3d945e8104dd3d4dedf5376eaa686758cba6a0f5121fab2e16d1acda514a3445a795b25a34396070934d44343f410ee21cad44df488aeda312c2f1db986a8100da2afef1b1a1a72ad00c263a74cfd31313149a61a86b0d323fa7d97c7d3a1efa3b6bab223629eb9d6229e007044ca5b8b268f19a988230178eb9bd763712de18857099400838594297489985a6bbd7992479694357ec479eb7289b75e7126810adefab7e4ad7bef48a4129c1173344009a4a126ae2d4b6468112788626b0e2290c04494f1d5b3a326967873f563f7b58aaf4844dc60f4d56db64ddd0f752888afd8fab0be1889b1394ba7c77810be7eb92ba3648a122c3708c5944c716448496c042a00b1a4a40b20158496104999ae8c5e896d1a2a6fede4412a8900f6d6dbf5226491062644b691921d0905c5c893525a6b6d254a7d299ca199acd43b0d6b476186f9f5254df333f46b91390d93396d43961842501ef1df681c74fb0cfde3acf9d622736a97e9332db616c9a342af7a8c18305eacf826244c4628500dbb89f369516cba847de0640c4a9c80f102230999ba1565fbd2b7a2dc33295545b65e613926501f75524f1b4ed89c3c351967f2d48425f41c75b6a24c7f86da0364be01648e0d9fa3ab38796daba595565aab05a9137db24ecf3c51273379a430aa449774cc64eb29bf6ec1ceb90c95023d3f9239d4fdb90b6af2a88aa437a1fa388fde8b9f312fd87c7a2798900a1b70bdf819e382f1c7a3fa68a4443cf50e1ca90d638b9982872dc4f450bb9ae480c482a7def1a74e943a5198cca14e614e79a44ed4a99337757aea488410947b86dbde0d7db2734939e8ca488b64e486f5518bd4c71c96671ed1d65affb99ea7516647cd534debd6b954388b64ce9469349350c2f3ba0c0c4d7120ab03459c1651a107bfb528c5a8c529472ddaec5b53ae97bb20933cc11b2d5acf204eaf2c0b9438accf10640e94b7d979b48e0cb717e4c92473cd79e1640c565e62573aa350f2f376ceafe79cf34eebd65a2c28161c754ed6306b9a38a4903a66986d51253b76c5624bb228e72862619c33a543928aa2fbf7e55cf47d2e242a8cf260b7b021dade03ba859faed3d3cde92967b41919519eed888a1f679435c13823a7ad4ace9ae60eae0989630ba9837b42e650a7463267883c72464f7d33a23c0d83e5cf45f1c7cd6886238bba165444e22029112bc5eb2079b420ba72cd1d163671507769413e04c128b5520cd156bdce84a44a4891ba85cd1dd9d3c4419dba164479e813623cb530091be229bd22f494a67ecc96640ef5322dd2cc296b6a91d2316b921486f3e74d14e98970ab2bf2a6183386081afaaa62a4e90a11a22b36c03a06548a10ba62435191e6f055ede029f68b4e9eda524b8d24f258b52c5b142f8f88cb4a749f9883be0d67f3957105ebbf3aaf87528ea31dfe6810875112e9a56be0248f386585ebb42ee348c963ad49c04bf77e988180a41ab13c561a366080687fb8bbbf5fbd33b106ddc7820d3a8c73630fcce4117fddcbe604b9060f073b747043c2d286854a67c991f2583de8a42aab168ff0d966e70be797f5e086d27ce5072c9d7f0902019e6c96f2511e2b88036673251cc019d939620949494a4a5c66d69522a961ad1f783dd5034a716a98002080a7dc45041b2fdd032f64e3d54baf60371ba857edaa7cbb1a68b028c256de13364410800e00bc748e881bf39512411e7108f57573268fb547cf11bf9e50109b624c4fe711ab7d7a3ddc00c258c794478c03e7fc7deea2c89a2fdc83bff4400679c40408ea845445373627050802238fd58397ce8dd065d747c0f325c4f79da1fea42474b5836e5eeee0965db493457d960e0fba9a35a6aa481e717e52a73c6ea3ca54990dcdbd837fcb22675511271c47bbc3584addde7b25186bedbcf25e6b6dadaa5aa59492524a697777eb349d61ed30febeee9e362fa90447a9e5e5ea65d5ba9f86e30cdf614d15f93e8d410c2c92dfe418c460bc6169cf51fc35fb5a29a55d6fd42c7bea17dbea9cd7d3dd466bf52c08e69c93ca7b9db22e9d5d6bad1a94c9e0386fe0b0c2a6b47691a758bbc8bc5dd5a2740dcae4e9b8c5fc72529ab95a25adf5de7b6ba594d6ec95b9f6da5a6bd55cdab95d8b6515d265aaefd3b67a2de6bc32da56b39a6badf55acc755e190f4b9e35f33a6bd5b86dd3327bc95cbfb6d6cc6b9d30d8b56450489cc471ae69ad813797a20b558a9a735a87bb70a4e135d5f7691d963ac2b983a250e36bea8e976da28f4f18176a21e6b84d7bade332ceb3365ece53e2a01fe86eab92af732994ddb814d8e3b3010cb28794a7739b95a2a65d97a207e6a62d4d58a5ce759dd763dd9b3b54ee58e917d549a9a3276c09d6e459dab33a795af0c70a7a2ef584101c1753923c28805053acf84c8eb179db658c278ce0a919a454f514c7a9e32a9e7aa6fe35d1c55377249e22393186d1d3536f297982de6e915f473c15a47ed8a1b3e20955840f1c97208f092642b07561eab0e8a0f9a880897be12d4bdbd22babb8cb8bae2413311f7c52006302063f3419b97af0b1c2c8a8071e7cae10322a010f3e312123293bf87081195d09f2d9f2649368c0c5899c7a896483183a10c94174caf825121120a62042048e75f9d571c660a8a4d7e1f74d27b80a562f05196cd76e3f417e8741ec6fa0abcfcbf4585a2f05d902cf1b94cf49aeadd7c33927bf10c1010636e09f1d7e248fcf3df2f8fe2087782d244a86915d24151f19327f21b9a03c124c2ff50e75ecf61ed12e7287b467465be6b1cb1ef398cb637bc563dfbae49a9caab42937e7061b80372d7c426e1ed0adeb1cf806fe8542a60e2598e2490e5a1414b49e68524b94d74f4bc890ee86d613940fc95460a5f544f331075d217b89969c280f8bae700aa6d43b35eea36db2461f1ead11c67e9fc84c3d63dbaae48cebaa64ef477f295bd5ebf1b9a17e9d83b0c6e80a7b06de50df20ac4c4d7485bd82c92f649fe82d7a7c891edfa1c7d7f5f8be1edfa0c76e63168be4c9fce6b1db29bd73d43b358edd26491ded1f76492d938d8faa1fad91063e5a2a1ebb7d519e2cb446f87fb42fb03ac99c6a46aeb06357961ac6e3ba4457d89f62c9a37db5973cd6a5c7d8ab1592875597a48e49231c3f3259cc58bd7c3351235532b74774855d7a12b86e8de80a3b8fa64979a444449cd68d9eda22d3f0b19f28914d980ac74c54c3f1c35b953c5aa3948fd5db3b98e11b0df0468bd81bbc115bc42e9f01a9b0fac6254fecfd243eb5881bcd63dfb6e4544d78420eab13c83d57ad95c730db84d43c1af2680f92c85928e4490b995f0f85c8319e285af282c9d5ca42ecae9634616e3fbd94134d049916b5883d1552a21631f64b947d70f619e00cf37f481d9b63f7a13ccd4457d8714e61e750a0fc0d94df4cd825b6fdf4f98de6b9d449af3095d22bdc44e66007e50e7a84c48167cf6d4bb6b676addfdced582cd11a69e196ecdf1b68034d9489e9e808069bb1212712a71165fa8d62fc7dce8302a13fcee7b6701cc2f43ee61005b14f30887dab5129bd6ac72115cafe45dbd712722c91bb27f2f4ab9467488d90c917d47ec8d2c49205f038ba99d685deb1dffe02d0b7cf97440193058c7c177d3b0cbd93999424795b6951ef8cd40895d23bd4c9b77737bd14ea1b6997af42fef68e873c9d47d3a3ad67fcc0c918b87079bd5e499cecbd768bead5722057f0c909f2250cf2acc19bad1952f08547af107f5459a194822d4a90b6cc0029055470607008b01553fcde9b44149a8e3a73ac00fa5a3b89134014e32c35e1a46f7e578a7c2c588a319d398382f602054f38bc709072c3d367003f9014b5010542568ee0f2d2ca112fa0f19b19194315463f473724f919ea19d8ae497ec65b6fa30204215d41f2d665116f2d75ba02e5c72e7aebba42c58f3de5ad9d6d9bacf0f58ebdd6553b640fca4f90c67333e90529c8a0797b7611dedfc673d36341f3ee6aafbcdced5a0be19194a6e0f670d8e099107c830078db610f9b947d04e9951dc149cebc1b49061a7d967111d2a29d209216a36fb083f71d72032579eb1f2c6951e2c7b9f401985cbd4738416925e8a5b74292d46225cb4b6f85ab85b20048567cca793427bd9e9437889de835b0bb3661fc04717ce6e998c9de09f4a3b802835f7e823bcf496e6eb2ceaa859f731bd24f5083e7384e7a0270411e7da83e9b1883a3086b7ae9e998495af2d33914cc043f4104fcf474ccc078a8f1bd42167a6d3d2d4b969fa0cd679e0928ef10b7e63ce8cd747933e705718338bc3d7f6bae037163253f41033cc7693ec1d9d1e95d97cf35d6b4c7a1750c66ae81a38f769486a588c14f90009f8155e6d010843eaa03471f5fd8655d9662ca4fb0009f819dccf911a47e56c1f80902e039e9ad90b578a73441f319de4cef97f3a078f47143eb13ec6e28b5b002cac151a565cb4f90f519a881a30534d087eafb06eaa8052f85ccfd2f289194927c8633e585207e82e14b6f85cc259682c84ff07b892d853d75bfa0449a22f617df5c9748515cffe0550f84f31b02998f0a479b4779d722762e93b351362080f01287a30fd5639fe1383c77935ef0d24b013b0daf711e3dbb098af017f452b8a10ccea3db6380e633ac1ecab9eb61efc0f92660e7c0f91c9e586250b68892dfddb44ba4242b2f91b018f113bce990019acb1645781b3fbdae459473d43be1b62009a416bc94621291b493a246218f8465e92798e3bb934851bc7e821fbcf452981b9a414db24703a2b1209ffed2d7c4f7216617cc300df0a6ebba5c3b1478a36929f046736d626d0678c339e79b731c5803e2c61c28df03b78e4e303ec1b994042848f593531e9b60687cf1aa1db2e73304c14249e6f56991bc0d225a1332c7e1a87aec5cf7dc8979b4e4d1b863b11853ac29e6147bdad1f2e29238a80d1b8f026de85c81478c375c446346b1a3182cb684029d9317dc41e6e040cd97ab45eb63b55e8af0e2c48b142f53bc24e96879519239f2b9bbfae9ad1e05ae1ed7a6a6a332f248e56533fcd16203c55c73fe0cd1bc0ba2a7855c665353513657d03c3b613e9a3e4a41f389a4458d869f6e83fc741cf167467dd84c14d8403a5e720fd11f5d6c8ca39e29682ea4458dca167dd864e7d10d94f35cd609c9951cc244b9e833922bed0a2800f05acef3681498f318942a787a097b89d465cb5ff1fa0f5e227591f29cd669e06c0a9bba145104d1b4ce659d06cea7a32b623bb449d64dd488af8e99acb92c0a421fb502ca37405f86d94def84ce35ce51e31606a13f9d73ebf54c07e14a96e102d3fd65389d66538b5665258f3e6cc2116716678fa45fb12c5bd4326e03c7efb7e975285be6e8e94cf753bb94d0b491dea12678eb5369168591517e7d7a5a389f269a89e425c99c4eca8c9b4b8f85e94e7a678e38484b5497d50ba2c29135def0e969e1db67e6bd834275a89a02c709e4538836f1b4931b37a68b3635925e59b7363d28cff7a1c2cc7edf2f160a3d2a6c003fca2d131bb7804af5d35b6cd15a950d68a4c84cd37a32db87b72ee50863f3f0d6fb8824c13a0ec71f8fa7d69a57c3006a3a923a2e3d821e71c32ecd91d4a185fdd2e9925d0852c1ce688777ce39a7ca6f03e970c9b8f2a0181cc37b7de2b468e7b401279a5e596fcda7b7de320686d2f374cb7a27e91eb3e9ad6b7367be756d86b66d87dd3d7dc020dd42d5622e7030c08035d1c2d0a2b52fc0d0a2d5c01c39509895434bbece594785e3073e47f3cf557ee3c60be78652bede8937faa5853e3e8e428b3a54e47b820a3e2dda51e543fccce96d816a5909bda3eda0dcde70b4c05f9f5c4d2da0455b82064e47813e7eb468bd877c9518294f01f58e9d28b7fea3772447bd9e6906956ac187ea512ffc0cc7394e478152f3f1f3c17a1cba4079a63c62593bc1348f8d4fb7311bf035f6ab815ab41bfc04259252166f2d90ccb17e25bf28400515578a145d314274a548100541ca6597edb89c2ca1c6a57fde0898e1d2bb1a0464976e933397dfdc9185aaf98df91167ee58491c7646e8a1386d0d88e92a4bbab2b2f581972cadcfa2deb961c01c737c367f1cef4b691e969559e6371bb54ddbfcef78b9ab6930f40ee79b11a9a3bab5ae0f2ffcca34c47963b264075b953c30d0150c94a731ced7fbfbfa0556c03b08a88786fdea320fe319b628c5021c8a88690103072db67001c5481364c8c08829a264b1c1c9ac4c492c0bc5124058e9258ba6af8edd71b22c82b8588a135e9d91c5ebeb972f6fad95ec3858108de0d3996441c4054b5d50b9610cfa848932342c8ce044d1b26035ab0373c60757181c7c180a134410511813bcc244e941284cd21108588185b102041038620af365070854390ab3050f548ec28c910304a8307d354b61352bca8f1850641a2f917ed26071430f4d727d897403098c18d1e58627696e90f2c31d01ca4285e3acfc7047b63280b250e1b828595c2e233680968881c2868d0fc9880d20d7123150d8b00145cc754ea65259a5d539314c9a74680919c215910255a69794e9ced6789d3dafabf1e6161d949ca0256488a6248a2459e4eebcc65acf7377eebc1a8bf20e47cf6f4620ed27b40ca3e75c8327c8cf35ed1c38c2f039e49c07f57cc2c42c91f97bcdfcbdb79f832a79ec180338bf01e3faf5eb9cedbae92fd3df8ec9ce42f2d0eb5507c943c306d3abebb5c7f8f0372cf3d7c72ac46da1d650c8e4c23485a92564c846054a4b0317326446085ad587cc2f925a4f524ebd86d6061b803588aeae6b0056a126e13a05ebab48f63ce5637dd5787b69bf28cf34fcfb824638662eb0163f4ed88b0bc7d48c70acae26e1067dcd8bf2b417b9ba391c5bcc5fe75ef5f51de34290abd39ee1f811c9f56738ba9099b40488574bc8900d8a0fad27d387cc145cd17a9272ffa8e4b1632160c1b9b763134657d72f1ef353afc92e6174c6955e082687b94e5dbde3f9756aa4773abfde31a963fbeb0d46eab87fc3f1eb2ffee6e6e2efd85ab080f29b145232749e72947b9ed2209c4abdea6eead407369816af7b6037b578bd03fbcced588bb7c77419b09d5abcd733a516efd2bd1e02963aa4c2827389b1c1b9c46c6564e1b632b2282063b744327669e7c4d22b9808902035408310960e175abcb5928ab7d60f80c3ddd039af013318c4aa5a5ce13a0e715ab4dfa7815fd6b44e2a2053df52b9e67a0d28e50afc361c9c3983d8e7401c15c7398fc6a07dae3b2e03f33b9f5e0fc63d1e8a0b551d289f66dbd488641a9e401dd72fa13bb9a32345b9430089a50e96ccb1ae52b1b20b6bae098ec894295b1954a8e08cd475b5495bd21fab4d8b99579f4b9e04a84fd8e80e4a1ded46fc0cfd33f45b2d896cadcd42ae660244965afc2f43418380b250e1a86099b2f9b724872046bea68750648ae937edf480861afc1cbda0a14dca921d9c704438224b2ce162441811652b632b830922b62a990a9d9146738a06e40fa9c3c65b0f2275c8ef495e328738e21979b528640119968c028f164340ca4b4b34bcd1ac07c92fa985eb47ac85ebabedb14e85c821189169add685fe9ac81ab6529cf81a560a2583415ab4aedc2f5d79cb001089c37a0d7fc81ceb1c9c208ffe35ab2e843e43e41fd631ce4ed65a4b438bd67f380d3fc21fd4696302280b150e0cb7440c1436c2d8b8a19ebd06fbdc504f79f69b94d7f80cf73e2a2160e11a8950074dc941720688025d59af01adb5b65abfd5390faad6bab5d67a2a64512c99456dcedfe7f54bf6f10305f6a02b6b9d26e5ead662c0ba0fa9a3bf71fe7c9664787f41ef258ebd55b060fbe284c8921e63230c14ce35440c60c6bc9a7208ba612c81a523de709c4f6593f9d8f5681fcdc3d2116f388e6c1a6dbae9e9e441f274109d403c6da78e01c993e94aeae09eba0fa9a37ef3279341bd83b2b0837c64ce03e48a3a8bae288bf53d2da8d32b8aa3e4116f3fe69f8eb73272ff985fdab6211199f66811ca8f1e48799447d80c182eef4aac0d883c666fcf9e045269d2a449d3aa2d64978b490d6d5a3b22fbc8829247dcdd587032862f498a94c6a83f5e8620f535ef3a07727da401871ba8f116a494524a432099b7822c3d0c643e760e879e0aa31602b93ee2e93ed7418c7f8621902c6442bf7012a79b2a2ddc5c7aee398f6ea9bc0b8b741de6b6ceafd7aef39f1a5a5df893726f0b81648e352628cfc0142acca173da85120cdbb9e7cdeadd9c5e89d0ac67f7a4938657c88bb195d01b88b73072b0bc9e59adb5f3a66a5eb34c63d54bfdc3517553de58a73818cf6ffab8f1d3592de668517a074359ceb00653a6dead754dd7a0647052aee44803f5ea3fd64720c058c38fd22509928451c88fb2a6907f86e38f9febd47f6ca5610e5feb877aed1bfe50ff09c71f6f4306d4fc0ca524806cd51426fee9429e4caf610ea96d812438e2f086d9e29c7399b3b9901a5a5bbb0c41ea03c97cd47c03f4997460f3bb85456a70b58a081992a64a165d80310619695a9bffd4d0dac29fceb9300492b9740b32d9864cd7d150d0cb08111b5a45649ad6ab466b0b73d8fc670b2f38fe781b6e60e4f0b57e36e79c8639e0d60fa62be943648c888c1f2e63ba94f1a4f5f3a47d0ba9cb1b1287d21e8e887ecc4743eea4fd907d74169625260fec4157ed1d8893701044a6432d8a7d5d903af0b7bf30a50ecebb8af1dc4490a7cdb6853917b528851aa1c92315a2453b45429489cc69bf61ca54c85f680474deee0215ea9d9132f9f6a644dfde4e2813a9c33bf0463b42f57dde8114a8574d5f1f6c91c7a654322dea1d3a4a399dfab0348221db4969b13da66971a38ad3b7d6a12cd6b7731ca5aea72727a7a69cf4a8348d1656410b99220800000100c314000028100c08c5429148200fe464df0314000b85903a72549bcb836910a3200a32c0184208008000000800801087aaa60800c804c07847778a62af42045c3eefb1395633e29e034b5cdf2546325fbc9c514f576782761573019d19b546730653acc2cc978365d94273680b7ab0d6ba402a841a45626b2a7826cc0148433ad8c14b87bdb74671d85c2fc8e1cd5df4eff07fc2f3af20fe69ede617637829b6f1ac2acea81d7b731e23d615868225d8d30e4a2fd73a9ee00fdb3bb0379f2c623787d6ff0e60bde4e2429651c41054f1b8e5eb177d93487f1a85c27fffeb02c5ee47001de08d4d4e3da1a43b78d0cd36823dfcfd63ab1559e12971e51e16ad1d9aac40d1b8a1d5c36535fd152cdc1dd743a6d1e713dd022c657f81aa1b1ddbb6ffcae518ad2be036bceaf2921aa2705002f800c7774a43b0ce527d08b6496bed3e58b2761805597beb0c54416617d55f1b56af38d66223fbd0a748bfc1abad4d37eb1cb6c53d2572046012dbc8ad1bb71d254c3a3cb7c2e3dafb5f5a980f5c0bcf895fafada1b01c51473e5f878fa12557bf4d03819c452e6f12e2930139c8d49e428e443fa2428e924dc486bc24fa881878a5eb7e4cac4db4c33e138c559a01664d15c9de976c24c17b5706157cccb889fe8b74a68fdc3dc5d1e105186a265886585229a734336ddc1636a4af7ccaaca6ddc215b168432cb21f5cc0beff97ed10668377117741ea4e0f3bd6094655b7986652629084ecb289add5684280d798e06fe7c76f2dd87b0b80c6d881dede7223cf0df9aabd8beb883623568337f4eabd45978e1e8874268ec27d758f2532d17ba33b412f940e2c3aa0f4ddacc85d4d89299fdb772c99897e86f4d6737bd32d3df748eec647ee3edc273419315e634e5a6c633eb08a285b4d240cd05aab26cd03c1faa733e8e2ddf046250cc643a48e2f4b14500262a0095c55191d8b7e95851ca50daefed250b591c12e1f27cea70f3844a68eaa475d344ce97aef58357f5a422136c8d1fe0da71686bef4fecd995dd063a9faef2bda19214a5b53976c43765fec464fd51921955d1cb6be50b676617246b8478ca199345ed4fe1a90006ac71abdd7e67b3b1780ddfa7087d73d18fc125f72379742ea53aa3087501ed05505f77d03e141d17fdca58a194ae6d0c3040397839e50c2346a68db07d05c2dfa9d7f84c1cf3973f67a0f7a382238e01e438756988ad898382dec85da89415f9d93bad46179f09ec8ef6e037a8ac7145f753d6528ebfe58bb482feed01572e5f6413e4f7eb147d9e7570bc205523acbbe61a3cb0387a5b206768dc06055259084c297f7d579bb1dc111afb5defbbf1d15ee906a5e81033acca506cb4a6e9468ed0563273e2d88d221c33e56bdb1c7160e48a876ce33926373eaf2aa82588be50b23e6366c5704446ae843ca862cdfec095680aab539b47e3f445bdf47b92032a3487f5b76d1e2202c3282bc794d2f216d7b16bf4593d654868899018f277eae3f8faba52e7c31aeaae28fdd02f09d4032d3c3b7b30e9411460b3cab5d78d182d63484b6cb23b69315305a9d9a496b9899c4defdcca32ab49c06efa833c6e110e30e0e8acc1ba2ea4561595cef8a4bb8bc6a5520ef01a4ff440c6bfd79a6d175045316452ce210924922315e8d66b83a70966a8f2962788b7730a48439c0c57b50a3163d96adcaf00e8c58928bf5e783eee9f7b9533683224120d8c6fbce093b5cf4e17bd49cd8ec0dc92480420e5ea6fa84c455798b19cccaf848dce911cba782654134648acd0024ba76416ea60957934c9b2586926a42e08bcc6a3915093a968ed2eaf9561160d5b5a798c41377d03a62ebd9ea92c56e65eaa1e918bb67ad93c4d8c0b7e91209736a37da56e81c540a097037024cb036586efa74a4262ca2d657bba891bea062f9026b07ffcb72aaee241b57c1d563027cdfcda26064625d9adcb55825ca7cd8ab0de4595c62f72e236d5595f588094b439dd8b73177fafc8b8518787ffe52df8a56d030a1819e651fcdea99b504db92a225d1202c6c09f9a13c11231a443ff9b99efa069efd92979f4f702dc291b11f316fdc25965832d7605c31193a2947ff72dc8dd500b70802f66daea38bda1eb816f1d2eb0a28fc2411f77a7d5445cd181120e65663e9ec3d12b9b088f9a365f215c0ced12e609c478f0f8bd0fa58d2f5dfecff35d7e121921b90809b93198aa87ba951c80be1f90036629d5b15c67cebf3d496f120e9df73c60bb3b831906e7825194d91319d9ba2b65720eec3e7e3292168157621f2796903e8cb0cd5ad2b5f85f5a1fdcaa42772ee681b7c3a0209ed17218475fa3928b0401e2bad58841677bc944569126e3f1d148abec182d675042ec67a6f1be04dc4716bf184b398c903621717c280132166226e5f549901c16d963e80b4d295543bcb52fbd3e57f548ddfa59c460ddc5a1efce7908f3af2647087f57258507ea2661a66c937bb28509516795888da0695c34e116d433e305ec12cf9d6912e881c2f8a76b1e2e4ecf4742f3118656312552ce3da13a8f37b4e846503f51520ce9d76b10f2419ee8d88b5e4715bad2ddaf1ad1ae58436353cf49b1a719577186b4bd0c48403564039398b9bd6054b8bf13732349794951afcc2adc2265cc215a8e7c17a2516c9a325940469611fc5ea0aed01c03d8d035ddf7fde924dd6b32b8866256f35fca8886f5a4153c445366f61c0bb452a2ff470b0c4f1ed6dd9bd229998be2910743241261156fbb9feda06160c6201a02782ca826232e4f799922bec0f2794a16588fa930952dc4b3cde1ac6a174df06ff9eaf4e46c7caa56040a429ce1a79f15828970cf01a5c806fd636ead0e9df1953890bde4c8fa4639c05db3e0fc9bc0078c67e52683aba9d5528ec84864fbf4e42879d1ac22c28f0977d2c5cc565455db7c7a7fb5160ce50a67a58ad1e6ef4eae88de23df15a9043b9b5297179c238abd060b40798bca8731db0557b35b51c8304a9d7fb63017622a05e2b0ef967f29d1dda46d5b740d2b9f72b4b4f3ec7829eef860d9217b54045dce60b23d4bc8921e5f33caf44bbbe4c05b55fd24d3c00a7f2fff1bfc02e6c2ccd077a2cd8fffbdf1d54245da179e3a1269fee5b49c77123fea85bba483f55a507b8d50f512c4566c2787a59514b02af6c508fcb0082fed5dd2a26b356ba7ef692c9dd18b6e59500b7524c2cb0722b25d082593da662e301b0d6c39769bfaea7f3ab1244e95c9fce51f95c75b11e383cc210e55194832dc2c4b5bc9a977ff0e205beccea0a7bb4ebd82d1bc3a9fd819da5cd48f959ce2c7298ca44bfa02023e4de912c2ba61389de414c837c8ce7bd587017ae64da958b875084bb77c306b8a0c8520dfddce7e072cc0eed5e62364336c02a841efe26f0bfbc79ca321c8eb8ac8935678c599cc85c898673ca03fa93d052917a94364561bd32d3cefd43de8c5656b538d2e151e9bf018f170ebf7f2a8b5a31a79bf049a3fbc9b00e45dce6d81b8d9b4f45e4053b6c741a8a3e1bb364ec15b7718d488fc3c59449992aaf97a1e24d108166cc200a653607ba74325e1b8f0ec9cb25a87c15b4188aa8fd4673e0d68c56067ed2ea874065176af3ed165484b2fc8b0d2f78c80d7aba42ef9d66e3619d3da9d10bb6562604d5adc509b5dad6be2c0205cc915c8f099118c4d0b0bdec8dfda7d266da81ae89f8a6eb30c3e515b8bd846d985c463fad024185eef147a81aaa23b4b761955b027711d49655df8854ec2ccb62206a45f8763634ff0374b5e02737791f02bb47edfb037296d897de719e91d50b92b27ec7d44debbb2776cef3d762408c1466ccdd991d906cb0586f0947fab9987aba1ed5b7beb899f20401f53a79c084d4abeacd3777a60c137220248aeec16e8db96666627e3c4f1b8a5edaaac1535925a8b17ab9595336c800c368f078dd7c497526858b2f330c953a18d1f199550d5b13b709f66255c42c90748c4d884dd8934a82d7c832674990e2c530523a1d9b70f7dad0da3190be9e8486735baab7af0c6a39cbf1f98f67fecfd9fcd81dc4d9d396b7d5862fb0effae3052bb49f27c3c06e46b2bb92977d4be43a32d513c89ef0644447d1697a3ead73d57eaba307b29d884289744de4937cb65864650997a207f7ac5d11c3553e3ca3005e683cb74e79be7b787c31d6bc2bc6fe1025d57cb72623819ae8eca69232971d645c381841b72de279ee4e7bb7f543841c264b85501bc492424bf1ab2184b7d2f4fe1d48450bac1e91512e1e6e117069f66298d3debb42b8999a261bc135446fa74d27219a5fbe8f45696577c87f6f7096c059546712b1fe7156b03d4428cb242d2b56290caccd8927aa18ab3f7db81bd0a6efc765266b76b4090cb6420f68aab7c5db9a54d8c326602dc6a0c27aa7689e159a148f494829b82bd2ae450757536e95c89b6b4da68e897fa20d4e737aa559493b19ad5675a451d27c785f034d5f3151cba0305840c72ea9cf0c6c3369a9abc998f035696f40605549c942c8c26df2591d8eeaf429fffe619f4f9afb78a10e57cf8e12b4298b459565b6f2ab3f7d5c13cb07ca53ebecf431881471fd49b0a6e0371c7266f4bd1529b546855c5406713d2373ae3a294c82ec1034012c956c95889f36afe71b77ff65bb7c0b05071e5f398d55c13537015f0b2f2f4d3c72bdb337addd708a41eaed5b626d09b49ce479e5be7676bd72ecbaf154a11d448ce1571091657c91cf73dd66c58160b61510851c17d90a9ccd9ffc435888c1f364dba51b11f65404ec8bbcdc945cf7b3d3ca1e758a130681879002bd0332d1149fd31bc9d1f2611754cc59d788b2b4bb40215abd0ca033e579292ea907f6b0f30dcc8540fd0ac55475698fe9fc28286208ab0d0fa1bbf09493889ee0ab19d4f7902815334182359be35cce0ba28918a8dba75202a470349f3cf4a8d00b9b765ec78bbca9679179bc57008ad28b77119b8ae8f0889d582318fa6ac6df0924af10399ca8f6c8047a88b651e3892d22d76e0166603796fd69522a3cb88c59ce36312830d16a88e35a43aae866d58d4c78b4c6f116de4fde286a8d9f2d8eef7d70cf9b28633e3760f046d331d15cb4aaaa766d4ee566fd6e0b1c15b29a870f6c335b3de247e267cd5020fb3c365dab1309af01107d8d4d69ef6824ef12d4b3bc5aac83bef9c636a27113e5bd09531089f5e514c09cbe9d80f8544dcf7bb2fa0f4f65548c2a827812dd36c1f49f2a85ba0337b1e278c26358b274335a3f9e632a2f75accb2bff78f45d8f3c142d34746abde7fb592668e568db0224aa35522c4fe6291670f0e0c7ec1b4e829bda17edc6cca97df589ff45b0aea3e9a6f70bd088d6c0959741423f87f3ec210c7fb93f79e393337d8e59f68ac40b652ef684322aeaea11affcc733676310be2860d8aa0183562eb00b198ec628ecca18edc841e533fa1a31b7a98dae68d094a3396b319997e289ef389d09c251f23296332eb3750fbe3c0bc9ca3b30c10aac1af8a89140feb4560004e758844d71fc26693e5020a5d35da4648213283be0862223c3bacca945e27a0dbb90939ce7d91d5e2ce1e6d2097a28c9a3237d32580e3183187961661ff6771d74aecd538be3c0891d26f0bbd9693dabdb1ce18135f2d7db42833d7a390166c48968397abf9c058ce251b279ee9ffc4c7709ccb077c0d21d4c915ad87c9143300c3c36b277eac6c2929d903beb9d1ca6251aeee830fed76d63844d7b73805b8846ddc7be2d377dd8883064528f0d05219905a70b370113a01227cc8fd4463360be2c62f5093bd1f7881d51fa7b71c69fb1bb1f6ebf00504dd41594d168ee702d81b9c6441d31f97d587ed7abc3b70c382eda4e9d3f64e86010196b8613090d3ea64e7036fb9ab876d5390daada4c74c0dc4fe89e2ec0735d3cedc3754d7b922a6d40410e51a47022c6477f036564555ba430978216ea1681fcc3ea06efa7d32ce98ab73f4823771e2c9f022cc84143aa1bc3913f9b1867c4fd3a27c6eb1d9290cfd457907655d44addcd3ad2726dd351e98a0c2bc831745e3ddff79b9d228ad638ce92273290bdaf47eb54b2d457c6df2226981c5b41cddb291e14d48058de736720fa7151ea79a6bbdb90f3779159bbd577b011680c7a1fe3db4fb5bbcb2ca2b7008ea0d1c22970fd6bae591564070006488eb5cd0bdd12f3a477125293a1fc7515329b1c1be54f53999e874f522b4633c6276e5d27e02bcad0b75c2f4bca4529a44b8ad2231b608b280bb7d9d1771d1baffedc9dcd906edaa43dbf43bac2652cc1c78586e520da1574b3161e043e755680380a511748d8d6c7078d2cc0bb699d6b2ed7e2e4d6a2508536462894188f06f570c60f182a92882b643350c22b85eae96ec9cf1300cf7acb00e1aa2e29a3872975be0ad3f104a126e5d37e640e53bfe7aaae15e74393cbd9984c99b293e9ea4636423e811dcbc585e6a6be97db4f9e187887568ebe04ba8e47375044fe5fac39b7446dbb1b0b196530896fc00c0b012fdbe40d13e5f2172b2dc3af6cfbdd62acd0b13174e13cc126ca5b44c341cc43d9ffda0d0cafd4b8a54ca125724f653e4864d51a797b63037f48c261745311bf8d27c410b60228c13afb6c184965469f25ce033550bbb03ce70d5cf28a2f219f7a30ad2cd72ac3ee52dc9b56a0fb3e5d2bcd8120c1260649621968891b1f1de6a626e14d7bb2f8389faa8a9e97838cc2a67c23bdeb028f6862f1fde349915ac1e69d419e5740f5971f559a4be3a2da91338831fa8dda71568e160f06021dd75dcc772b6802c70aaa5588087ff01d5795baedace066395bf32e13dc7477559200d799c4c717f28a21b82945a1a4c4a077e89a149b94d891d2a377a66d6eeb3aa92dc1ecb576ed1241a96814a46da8ccafbcb081b5736d4e90a666c3368ba6792bef17b6e02e5840dafbbaef7df9df9d84fd950d4f0ab930e0d735d93dbc923f4f19341e447b2ce22fb27ceaeccc67dd6faba4550c78b61925cd7d2fd789e7e41fe6bdc7e451032a442f547a4e64ff4dcea090dfbe5eb2ed04f5427df0d8808ae5bb2e9fa79626f4e2c2a6ec2485e54f251424747308560e11a24343e02eff07ec4961221f799614b8713908596d8a400bf91e5d741db91bf1890c3856a7bba7876e1f6d3501850eaf899c0eb76b50fa51b65876989b8634215a663cc54439d5d27a4999d4fe8270a00a2b30046aec809dddd8368885324c129f3a3ecb8cec18db0f046de988643a34a533b52b5dd140b9df3897c8c0aea401f30ff0892df608b26c5e7eb3b17913026dbfe757a3e7fd88bef645700ce3947c6868e369e8e60eeaf4e746c6e3f409cd6fbb0beb404188aaa6f4c5eae5e8ff89312f6a7d8063c3e008fc34cd74f97e52431d42857dc5f7bf86e214f78389e2464658786b5889d33c91ab278d2add0122ec450ce51ec529e307fb46aa7f96e98f925119ef3bc7d836346338d18bf4859e9d67f907748675be65321a46f3312877a34ffeb3ae7500429de8bc423ea758a55279402155d106a446566f0d684d50b77cc97b4034ecfd11a059e4e91e5cd40a7a78276330ead47a3a32c7886b4e3ab94d2978ca64adde5453ebd46df2f766582a6ae39377da521439479d4e70f03bb70b101a21f8eaa988843762525236d4212d1d31785f3b7f16911f897a0b0d6c4acb63fe03feffdfbe821c0d908bdb83813558b9db6253abec82205adcfe71e401e0897f30f3fd192e534f26736359ab24a959baaee44c446eca96a1729e4b900624533c710c1a95314fb106f15729dd62b74b7345dc242ac46ad0114bff663fc011cc2c16dd093413758ad1246c435c796d434123d5798baff894a6c60626b60750c505840776e32000f44d18748ec3b38dc2a4ef87e1ee4f130e2768b38d45eee75eee9d7faa68889bf22295914c9b43eb80ca335ef4a09e841cb00b2ac34573b342d4722eaf837091d6b4220e1263290f006c2500534ca478a29504aecda8bc7e1090fd63d81a9815af311f338f49bffae5f206385e2bd2ab9d6ccea77fb1b1263ecb428dda194dd756b5fb13ce1ae19532d41669cca28711eb44c86718bfae91a382a1e8ca4e1e502e8686533c04aa4734cc189df5c12594c96eee18d21706858c350a3129a873f7c936755e8ab373a35d90b2ef271673359fba688050318a9644a66737e2b66603097e4005e783656d71eab1b5c79c7dd21453cecaf9e417534333e3c4953dec02c44da472495a0086e29a017e0c5fbdfaee1948d5e4ead29c78c52eaf14fafdf09ec09c7a53a6a8773cae0be90d2b75c3be34dc3c36b6df59dc148c0163f3480746fa027a32c953d04996d1c8beaa2fed6c835c9a56675d1f2a24e731d8cdfc809f20744cc0c56fb7e0139769bd057ae106d0487954bbe51579cc42b303df1f07e42ca58a41714cac5d669e43457c7c387d3fc83975088198b395fd3b4965c42c7b0d20e2d5b231d03ac30961d6b9fa1d12e73b7078799f8412ca3021b4045e3a6b34c976b281e327155f67e5d76489d4243eba0150d3fc9af300926debb7d394b6b121adcbc2a2351465ad06b497059430d46f970d0475cf3c8d605c16094316cdb2c6f7f6a6141f4d5ae01ea3f476502bb9fa2bc04fef37625d89614c480a3732cb6643b984549bf623d33b5ba9fd50a77e8f86edbbc83316810b0ce86f4cd2170aeb9d611ec3d8c718a83c7a20b79dde15dadb7530ded64d4b5dcf38fce242582329f9d6b2d70e7f78add99abfe700b3c0741d6ccd0cb5a8a5e913724fc3a89ba16547d2b3ee0c48e36c1a5dda14e740b8955e03debb344bfccb25c1888524de63c6804b546c419fecb95ea41ae7324275ace92a99695afd356abf5c32d432ae104654a61ceae1cb409c5ec0c6e13a513ea6e67de8101046365b749c25d29e4fb1e193c224dc03ec48d9aad7d9687478395062766f1964e7f75243c98db05269174f145149f816113382d8bf337d028b2ed03b98449e48f1c28f3dd3669d9c17a8a27fcd18d28abdbd3a5057f054a8746ee9fa172a9467a1e7941aefa9f38790b2878f2b85c4ac240b06d9019761ce37d8782db30fc6a6ed3094223a3b96efd290ccd85702a4ecb8dfe069aeee384281f705c1a1710fe9060439b05df3c3f7673f38b24fbb9cccb87ad2e5dc84a75dc77f2bb03a4bb700ffa82a017d09b48e6e1373015469c09357e0894aa22d3a0eb5ecfb078acb222d004e8e1b3f46652b419bedf149815b8cd143402f70220a76046c1c3cdfc8b28ed911a6ce754c718c20fed989007d07389648f2e4f85aad282f0ec26cfd5afdd8478320cdea21884a44e618d514eded2d18e5f51b7c7cbbbeac558751ea844d937d7f1c7664dd10408aa2b23bf87dc57f8f4cb64f04bb2108e6899ef2f7b2e449f3e429669dbd69c5ff705ec8d616781a512a602469f1880c6ac596237d602ce35fdc4d9021269a97fb8074c890fd117dbc587d5ac360906cc07f799d3f17abdd6496cc8a9ebaf5b8c2231097ceef6409e63f2a25cbe306f79b00ea9bab38bfaa9bae97b2a14f6a50fb2156c9331c6dfd2950524d1c0108dcf44aba1002ea6a1ea530eab216c731131b482f52ea75415fe8eabf4f11ada7036dd8081523a17b6010b5ea8ef0795bddeac1e7f42d710371f00d881eecc0d7e8e0900f02927764ca33070ebd12a841d6d3495b380a2fbc346423cc4b11a2fa1021bf567c3a8e3e9ac87f02cc16098bea6ede1074c527dadc29a80ed57ce3eb684659039462ceef603a9ec1dfcbc26832f5e3a27c3b7b8e02b297e8881d9a528a02d01fed9b3c1f8792a5f0570c8e261a5a29713bda9bc0fa4c9b5af332d0bc0988a883f9f1dd4b1e0238b7aa34aaee15f23a90849e7be6af8919888128abd00afa80e839852b88bfa0298f878e0a62a39af6140ea1cda4d37c8baabaf07498239a04deeeb59b8b7f8e43fac96c7e3e11ac7d6fb613d26643189e8c068cba9ac075ffbfd3ffefa4c8f26eb34bc914384b07aba06eb957a21a02402ec0b4ca122d3d00de6c16bd64b04d98ada1ca2c71bf3fda34c0cb603558337619a531f4e786224777da08fe0e54e083ea0f6a48c019fcce2edc4732b16aa203c2dc77eb7ff6b7047b524dd9bdb88b01fab841b4c3cad0ce22e7c8870d31bce93967f09583e635de14fbb8a10fe95aa6101dbc5c4c3b1a7a2722cee3b0e94bdf39ee8dd9608e6e22e92c6e2262907f72f0a5a2b7af8908ea9aa924e41d13cbba7cf1ed1841aec16051a2faed66cf96713f9b05e502dcc5722485ac11dbc3889a08112c5f6b8e72dd57905ecf8891d98ff4fa615b4fca0fe93f56a21e7831d0a3eb363d5ea20b2120942b434bf4c3586b3924d375442c59411d8f91790a16ba8f2bf8322b8631628b3cb201b08dc02eb2f54fc6721cb2beb47ff5f62d01ad019177dcf94bde373d58991cad74b0b37db45e97f03765eb7f06e8641305519801e46dd422aff8c65dd78ce8dc2ae80552e658876613ae24e1e082943fc6ec1f53ebf60bf8acde3e5f9ccba39f2e443c190286bb4b526e5fc38c69be2abd470f15e3505e9f9446dab80712ef019abbfdc16a3d5b818225313471c0b45314fd9706126bc85c3bae0b9f7aecfc80c7ab898fb4456797e9a748e94dd08ceff58f18441e8bd41df47a7022239ffacad6a79325f9421d08f4c81c621fdee3bd9185c78f1768aae42f9d6e74c5d4b33fe454a754ccbd5feae7efb687004e569d79af6cc538eda04341dcdc4c140e22ac17b5270cd37b712b6195f3c0c6c299984e78aaf3be5d8dbd785e18b0b58de4ec46038d545227615983a5ba217ab7a0d400b1624d9fa254b7d8e092f06646c9ea557de72b8dcecda8267603759dc58a7ee097566048cfa4580f790b0e9c2a8de1fc05b48ffaa20600a10388a77d44b4829569202fbe10e6e54dc0d4c39642b6b0f3253ef7dc764c896d897a0ac5ce077d7f2aecb22416ec44e3fcae0cf99f77ecf9e3aa85eb7a50a1bc5a279c40a45cd0732a99fa967fc870cde5cd9865a89362bd5af786349e737b70fe5c54f52bfdf90f829a78072007880b2df682906e611ddbab939104299c0bb78c182642f8909a93e58d3d56002a9242259e0a06a674af7854203f2ff8c55b8f3c911a140630ba6832e7ced3799fa6e2e4f7cb6b2efc26327e028aeb52865b8328bf2745145bd868b7b5fe7bb1c03bda037be8b13faaa9c9da5db6fcf055e7f0fd59ddf66006a1e2b33a815bfc0d1ee7df62545f359ae0a07e001ac56b59a019674b2e0edaf2567a35abb0b40c612f65c21af620c1a8783a09cda88c01c908f688c893cc0e90f70bafdb3a80c7dbfcc574e0a0eefa05637be9d9cfc8856527a829b0207d17ad486c881e0c8074e8e807734523d403e0c4e7dc0a0bb3eb84aaf01df34d2c00069a8d3646224a7f4bce96804ca74d02069812c538bc4772b01b63d1895fb7e7a0771ca22e6efa73d2516251da333310f095608b9b9c9a0f8d8b808268e3d710218289a1293df318ba543521561fb57ccd98eef73e7565c362319d07b57a5c67df699719a4ab70e51235c18d59dcc014df08b1d75653369dc16b7102f4cb534fa828efaef19eec0df9f10389cbb233c06631ff5eb4e25547b21bc5d25e09aefc978e98a5af91dd5a748431d774b0a1d38423d271da3a9e1731f858cfbb6286c152241a667b723024f135d2a9436a035c5633b420f38175f6ecffe8ad869a56c14c78f89712fd35c5357f71bfbdac3104642b5a62f134e7fc8e9f047dd925b4d0e9a709172ca6cd3c344dccf0b5d17f7f882e2b5c81c570bf855cda92d1d97bfe2f103ee264332660fa57807a58f9ab6530c7b6b984bbc3a7daacce621642513e85f37dbcd421e6adf5ae764b9b64c2fdc47187192c68f16f615ca7edf987d117739dc7920de9d2b7f917034b37444f488161133bcb609a6b586cb32d41817cb502f42c96ef625ef6ba7045cb4c8d1c10f8cee86805e63056848534e04b01889d5e7614c1c1d87f9194044906db2bbbcc96d88cbcac930bb02a56de121a107b51eb67c86d66db7b59879ed79faf887449a34573f4bd38525acd4a355852e0e6328aeff41343a7bd285a9515cccf7d27636e3a0f0e755eee1bf5d4c8a716e9212a7d36bd7250d6255d7868f75ceb2510d8a36a14d2abf7abc0bcf2e33585cc2bff3784b890f78fea584dbd84d886ceb93d8a1cf6829147f22daa19d85d5a006e01753f484a99461619a567f1729f286b51e8d3d4205be768d22ca07375905853e5cb8c5a4b3532625f0bb4a1563df02ad233fe0f1e3e88a791ec4e0c07e1d621a9f052c963aa6dde02df6722649340088c26c83ebeb53c49473d0822443767526aa422afce8852fac6080dd90ed81b0290d3f1d8b8e141ac258c26dc469736855636f63e0f251fa4184678bb039ce0aaf5247a5aec47d93d17344b0d701a1168df0926e7551c847111ea00f37ec79d0ab674b5c01a2762198df803b0998561ff956a8114ddeac273b53c808c5774c632e26a1344608e71cd720d901db9334eb6e36e4c27773d9cd0a40de072cf3bd71afef9b1bff0d01737a8dab3ef9dc8cfc89956dd50e5eea663b7e266ff042b22ce2add235ea5628469ad7b50eb988cf020d80fddf977df93f1031f74994cdb4d88c3310197406d0fc1379e3b91421596465040bd500e275b5ef1f77b4bb105afc2c4684e0c6d6abf6227f48e8057c184bf7313933141581e95489902f6f0ea86c643d9ba018febc98694093300f851d8ff52817f69c805c1fe3535bd9ddbbfc400e3c217543950a5c3bc99838e114fd55ea9200b228bac4e9d20d87c15564f00d143d1e00a45954053da15242bfdef7ca2cd69ff60fea8896ff9a4616d6ae84d9408ab8733a87a5e3d642e6bc92e16ef57243a359e83c51d5adf6cf5f51636c9fa8ecac699b2ce78669db8ebe04f43f38bb53adfece5ef666251bd4795bd689716086815ef76c0d8d228343c097efdd4632555de08c69e98e2f91738776ef88d203adf3552b503fd4381385f9f7e7340bc8381da712fb952709199bf570b45069903c77dcb608526e8882724dd1a459affae4d999a1267be00a1f2042ddd899a028be5331860f9b39d001ff509e243d9e636346ad4189c4fd9351d06d4ba128c1c4e91df7f96fd71859cd07c8d378927d0d1040a31184a141722cf8e96d72cadbec660c178944a7106cc3a1b97c824c741f33d137503c1e55575d538db5032717969c7fdcf89d5faa692fe9016f1c7b7477185a06ec6ed03a660b36ec115825628b22f8621fe895c04e36d6f97fb523295d70a2eb1ec2a1c5f8ec2fe9dcad70094b63b890b05bcd173407f092dc8373f25c1420ccde3bc5084c70d5eaf2b2b1995745e4cfec75fa6b882fd09c31e5d36e2a57056efa4d475bc18f007891f83337fd5a9cf262daefb57e56d830562622265b29067fcc42e64867fc71501cfad996841e60f10244b41ee01622fbdbc5615050b9be2b08b4fd7e4f6c06227f720a8d02c410595ffe8cc4aed707f022ecf917284a8d3e871c50cef30328f69c5c526138b14298070215994634fef1cc2213713e90bcda24767b84172513f066652b9074f34a0499a6cd0365769c1a3ff5fa10b3380c970adead64306c51cbfc2d4c44c8c6f2776028b49f11718466c3861e40cfc49a1860067629f36d52fcf1cb222958c8c65269a947067662bf24082adf5d0f3fd9d34938be4e22e1ecb8453df2dfdd0f81c3c52ef28270c1b08feada6f9ec6ddc177b2f24b515021dd74df595bcc35a7aa154bf6e770161d2969a54bee6c3dca42d7cc444372da1542581e840c4c729259e51fb6e753fea441b6c4197cc6d4d57d3b491d68e8e4ad2a8f4d10f99b930a28695aa80c109982d1540289cca45f7267699ac0ccdf594598d370b185a117ac3afa9764d9525b550d12dc6f2143d41137b21f1ed0b31fc430d934ea2a938fdd60ee85c742645f24c6770e3448b59e7344b6a561afc7a76fc1a2efa8da16fd3601b9a6843fc83990156f6746e81836fda5fadef4c52eb54da10792a8e6048592d0b5f7cabe31963ef48b4f0c68b0c4b6a729de7030fc0596904f1b0e25419a225f407768e8253a989fd4306fd71001408f80beb6d3e7bc30755cf9ed10f0a515cb8dac5d4a0939ae50fd5e7fbf71e0fff878bc88e040a46f7c47439f9dc6e9e8430572da2d4efebdbcb59a7df4473e9c6015a84b742c519a8b5b9933a58135dab4d0feea5f0efa413d57737b3dba0de981dfdf23aa51e08db8aa24a7d68ad2caa1283134045f444ce97473271c76572c90aff2b4f10d006149818047cf2a900ef0ef34a6406e1bb9f5e438040a6c27e2ec197c2357c8cec32e231abb48b20407994403688940c4b8d6a0f8470ad695d24aa00c083992857a00d5889d73265894a0307bbc546ba01bf17feb60e2dcf4123a721da5d59f5a47e0d08d949d19d20c5ac7d694b6417916501c89fb0518b0c5ab0be8b3d8f60f15eaadb2a65511273255853cce06e7616db6dc48e79c06e63492d5243690d52ec79a66a0f1ac65d5ea2737b324c0a8a1c72a12768e406d54f8fb5419387a270c6627bab9f3f1cb00774e639333d696ebf6666699a574a283270d17d05d68c8e2eca900eb5e72a7d0e6dbb5a7b23d4c2e99ed7808131b5b04cfa281fc0d38cc5677e55fa3eac13ba2b325f887698d59029138dd3afcec9f950c6578e573973e04e6302a33c7a0a0d10544ea43d5f7eb5b5badbeaf63d4fc2d636e19aecc54ec6a12048226a878b66ff7e35c114c438c0423982df94ada9f80506e3aafa4f90eee5220030d15b746d0ab45b37ed63bda7c0e7241a84a46d79a6c5bbffac788e9119845b83364aabd5e2c1fbb8909f23ffa56001db509ffa3ca57da35c7ccb14d1ad21f89c1735a016407d60518c5b6bbce4e79dadd126ae0f883d80723f9e2e8ccd75990b80529c04ff568059b527b5c82cbb2c14851e7b252464cde9531eddd886ba096c8a904b516ea01f06f80e682234a1071722cffcff7dfafefaa73b2431b31e88271bb7cb93a596e48470ef32d4bfa7486d904fdd7babd89e1756b850ba6318c68f05ef45c6b92ceb47833f2f81950a19ff39c0f1042be5a442ba6fdb738580713b0058618b4685e081a32c8208eed57d50fd0bf271d721eb5a0bec1e753066be82714a0b93aecbb729d0df8ea368741ebec11781c067a6d48821822b370186b2e1e6c20e7b2c4b0e55e7d6e1211a3fd6fa81adfd3a7fd114cee79fd75c7aea2dd2e2aa87632840b2c75d13a4631a87d73c7fed14ebc9f4f604d22c1408ff7d27504fe68e4d0e8860daff1b9cfcecb29a425a63e004b454deceaf5f6e94b49fc775400f1ae021c6b582774c18d280c7cf6732e455798c1f719a3c42e6adf011716a38deb6ca293a57a1d4a51f9412851db92d054f22edb91dfd62e6b52be3a64f92521238d6393565a46cf0fac72f38a3cdc2b60a6ebb3eff89b1b5db544941b46cf64d68ff555c8653cb86ba6753b3e3e87bfcf62aa140be722bc452cec56fc8647d8b01edc7071ba5a04aeb598a2eb5067dc4c375cc81f553a11d586f9bed470db9916d6431708ef4f3f162549b0d8192f36159f20235cad552e822d6f27fb9ca14b1bab94dee7cf81be67aaf913eff0e512b7904afe179466adf109bd74bc0c105251b91557f050b13ed4185b69292a9131b03298da5dfeffdd8be5dda7f65f838d0b6fec298c8c445dfe6421afffc3ab88207974af4deac3c9805243cbe41a85cecba93f8ab6d2ee0a7cf30b091fc739fb7850d190a7289a0c297207f87b159a0561d55400fc6de42bc18db19b0673d45d1fde93d6ad557011883186c0c99f01439e51a213fea6958e784b5d7a89b74a64910c758a38425b9b9e6891c32665313b825909ce7c5cc3498b061edb562b8da00b0d94e3112051023c63848087e41cb9e9d5ef30e6dc1c772c730e92c36a00fb5a76f3184113b3aa680459b4e4ecb6575644e27144f46c93e9c2bb359428dd05fac819963db353defac9ba605f6506ebdadf953895a60f23cf55c2ada02c20c16f4887385383602b23aa16a6b75940d19b404bbd5a2058905cc34b70dadc14519a119bbcabd533f47de6f4756944966a96aac379460aa55231692cbbbba35606d037561a4769f19962d01dd2de5ff4b17dfbc4a04cb20ec7e3ebcb0d8326e0d77e9bfb3ec0b17dec52dc2de60b47c1ec360e0162ddfc82018b50962a7a7efb97cc038347646b2ef453c6af4a9d3b7c9e0df8a5d9018dafeafae65d8b6022d0400ea512bb80f3a3dff9dbddd909c792d289fffd196ffcc3fdc3ed4597e182b1cacc9eeb6de434545066cbdb5fcfdf0b28205170da8032a104199b5451e6a65ea15c6898e681531dd096741dc3546f6fcac4cce11c429574065544d085c2bbc02807993f386b6060ee0b56caafba312fed026f524ceadfc55490d8f41160fb4ed3d702359b320c0ca62944a833e344a8d24079ade725b853b3ac979023504cda981810cfcd6b230540da59783ee0cd4cdd773c16b1aa68f52bccf825fc6bf701c73b73522efe067ae4762dfbaf4b6823c6cd7d522a9b84b597283cfe5ba748c42c1cf9227d8a28d37be1843c54e91e2a7fc5cbce2f689a1b79a4d88898f8afd619ee6883752eee43233b12570db76eb9fb8791bee3ff20c7b5e77fde9c64bd8e8c3146850cf0bb81d74f72ac26303a866811da35388113158a891cc2ed6746a5581aa163ba9c736031e37b54bfb6ff00b424e50102554109567aa16b814cb4ee905800c820287c1512bb241da79cb4f5eb276579a83746181a071f6215b3bcdc90cd057e17fb06e43e19d92ed01df4101d43306b60b4aabaf073e4d10a7844c0d47ccaa06b30fd437488921521de8d354da6d2af9ff5873e4ab190cdc9445e4d629b5bd56d866a7d292256d51804be07f35c336a2a53910aeb12ee3ca68221e00d3909a87a0cf76a55d4140d9c5701eaeb7d05c2475610268207ad0d674f56db3eb62d8e89d800655150174b8a4cf6c747124dc15c9798e5ba0dd62a04e8e67b82f7c950dbf8af6aa9197382704a911aff2e458ab934fd7fda4a5620dc02185e972c93cb2b8a8a8317fdef0a9e7ee03f1babaca7760a941114f43c96ea71bc00f532a6dd63fb497aa8a4421c63eac8ca722f636a27cbbf94ac3a81f000ceb3b97864acd43c2f07fcd2b55c30507b2ef1481f6387c33b5902175de5b8baca2be6f900af631c26ae1c93ad9404691d337188555b4aaf9a70820e53ee9caf1b2f284f62908287bc1abdb7d55357006326a6177890a79642b0a270e94cd629d65e0a1eed0e8d340e901c3d720bdc3a28f01a1876e26db30e0d0323111c7f8b0bfdda65e88a6da16b9af2938582a1a16e9f8eb054a01a50ecf05b2dc5a7619aa6249d865974dfa1f2c69c5524029eb3a05ff382b2573c30077485397975a9e6bfa649a4a8072b7ec42349991b30328d330c6e111aac471c664210ca01ca57db6ceb3b01d9c3196140459b42f70df7bd24d1bac7a753c014e3a407df854e157e11b833c19e613ab7e7da017e16c1ac9bb1df67236ab56c013f48504c3b2dd19931384cc055fddbe83351d074af7da1119538b4332be2ba8406ac94c7cbb2c7e98cb68f08265d17f94244c0dd88c957bc58cecd1313bc1e0f1e3b2361381f1b58920d6618890860db7a321c8724c41d826facc5c56f9705b41d3efda5fbe0f7ca3bdb93099250e495136d2f8211b88202684749f86f3d26820c6c7b0c367a1ca3dbfb31f80986b1c3389b4872593d31a84e6a25b131091974764e01452fb5270637e41bfcc5aaba6632e164e68a2811ec5d17f6b94cd79128a9512b3f2f7dff1f18132dc540b36f1f2ce798daff58ef873e1209e6e2ff9821f26101241e8f47ba58c52875d6ca85dcbd1b72238b540bc0a9c4c41ff33868aa0822c70a8870b08cb5d80914ef160a3378da4c388d1a7335363806bbaf1b0e9cd689327dddfdb327b894b091457748d3dc30e605d63abb2ab27606473b94801791e3d9d0692782546ec582337c490fe09943d3e99e46371c1f788810f32b94acdda5936304a585b3d8ebe64092d1b8f6249989785cf13c6ea70bbd94eba8f281e38bd796c424dbda62fd2f9801690e16b6ccd9b3ff9ae9897b245294ccb71f25effbe4f0256d3f514e532794e792e0fcd5b017a4a02e68b86b0d22a169a1d42b7e20da054ba4f8c4d65fb330f729231de9a258a44895c2f926e4b9b4d16befbb2ff1ae9147cafebbe32523788f504bdc1f95b9f0a5e87423867d9e2e3ee6a44211021d46db7cececa656ddf6338ea0c77719217f192881d7cec3f3a26eef04cf2b1937900bb38f79f45bc95777bbc11636232d8e198a9330be3ec4b4677afd2342b98a22d6285279b49b2f6372f259f84fc38536f3900a4d63351744894b4ae9825da6ef650e1dbde149230482f64abc1250aa1c51c4c304db7323de36c3e6a78de0a5fa496246ecefb657edd048221be03d15baec12e72e34a1727947a66acd961c35368361717ecf9177ea0f15bf4eeb7c60aa1a5baf6e1b4a2445842cc3f8b2078b62df2424e59ac2773075a749661cf085119f8a0d997c8ba1efd3b84aa090b4aeddc42c730500d295c1462e993c7c63b338402843a307e16b2409a6b4bab98505dcd4e53ce1b339ae071f938aacf44853dd9b66c17d5a85e81baead308543ee1e8a1b64badc316b1a0b250d36b5a8c992c45379fda70f3dac5382b687f470b91640b2aebc55cd681f9f24df4b9da3303a61fdb1fbfb1efb93f38193c6d08b48d0946a2a7190202d08b7f65eb7fdd1567da5541540bec7314a250e10a1b2d4b476cccb05764acd82858c857392f532b8eb1de95a82c9df013709342ece1a1371c210791ac5b45b70e0c3f0cd0ba6048e413dc458b593450e32c63edce10ac9ef21ad1b4dc825c1510c4aa3278bea3e8bf7b9893dc9fcdeb4a510b65679f608db85940bad7071b7f83bfcb61d08b211e05b255e8b022ee90812189a69873934cf8e94f469cfc7a7488d51132ab8ae55d90bff0d5f9370ea6dd847c4f2d4d54c8fb6825004dbc32d869a056e9cf3cf3d1e0967579520e3eac734eb2621576dd5ab1ceb9fbaedcb225468fd3df2b473abc7578dcc33786773c1da1ebfe2d2108018ae2f93d957f72016bd2fa30eb64c9b3b9df3046edb284a9e86523040beca619afbfa1fe873c786c0f4d1afbc71928f58fbd1bd3ee2f1ee929a5181c64fc24a351d58b5567b4cfbf0228ec373f0a15834f66191bb7ec622ba406f58ae6ce5637e79d7bc83c632350845dcb8fa14241ea1988f0c41ac20ed17d3ab20e5b721737417532e98891c164717f0ffa66b1f8473f8bb8a6d5d2933cf26b46420f794acdd8e904e22fa4cdb530d8c43be850c85ec143b21c3a6faa21bd41078a8e509e9fa09fc48d5747f37652790bc6f29b60adc9f0faebe7ccc21a69670c58023355c4da98852a2f9ed027db7ca2012bc6021ca6b6fea003423405a3c3330803e7f0debfdd0e7a568ea4e9ae51e930dda296f42ff213df04fd1a5420e567125d4f27dbe5adfc67f4e8544f78a1fc3c78507e5292bb970d1be158484d394607000656bcb5f27a830ff7cc4fdce386ab7ad67147cbc66fd57d56a909c3e850a4adbe8192bd1567310673579364780f5d7da7a17dd2ad247b35580961ee44d288d14f72c84167204f455490aa47a39f955b56be55068365f87bf1307b3fab238801fb59ca41283ad2c16f85ced17dec48590f925ee84396ce2ad70ac400381ca959ff1f4129840a932daab92112788bff75cbcf97abe50844bc4166fbe97b7922617b5dd81a91b9c0a8f46823cb168a75b5eb9aaac37e6260fc40fa3afaefaa5bce19e43d1575e4a0f9d332a29f123aab1a590182d7dc1c5624de05d4508acee1bf9ee36d6a33f3385f347f4a885be7b31e0d4a6bc8249a1641eb43f1c1e6994a2ea3b16eebdec04acde26a27d6aa9d7d0339968e7c8721729d85537e38118519fae8a41c965b23c0b7f5c65a38ef79dbef49cd8f975dc7f87759560ecbcc4026540d90a142e953e571f25927fffde1891b22e3c07c1861cf1f37759230586b499a8f4fe2fa31f5645eedf1841ba6527a492c42d6484b25b7e0c2dc4bea2a70e13459c34274e33def0535ff417a851539ee782ac5db3621073d814cb7acaadf1834c73bb36801f802b4b96acbfa4c5004fe59d2bd32a24576cda0f33b41fdce3ab5eeac4c47c8419b501e22c94532c1899f50743a4adb682ceced311479af705b43f718e08946112c486232f6de6ec16569d1da3ed57174bf973035b52fd4d780b3262a732c1001c35faedf21a1d691354bc3662ee43d9453e5d393070d32b7c62b9f14e0ffb845a6d0e1eb2618d2e1b91d20c36d601620d4c64fff067b9c54891e30824e5f77c1944e8eee66d624d69e5465d667c326a9a8ba9a2a3919ca3bcf9afa0d70300337a9a109c3b77e52e07420b161cb735f8a55dc7c695ac5cb8a2bcea0365560c74f8160b10e879693db13a131f9cb6094a16b4076ba397c4bdcbc011189a6dd73dc7e9483a42ddea5ac11a7b3c0aa9655150eba55a3ba56aba086b51585b9037283c6b65955417cc8a6b514fbce1da452ed2aa0a83fc019c85ce05de6900191589ed772623ad73283a92fbb9b07299c89dca21d452b6537a695a55b286fdfa2e37eb4dda913c7cdc96d8042659533c9707a72ddf0bdd652722739402817887bb96cd8ea77fedf9da12e51aeb58e837b41002d4b7f563ae1f07f355dca70179e36cc41e55f0fde64a823708ae088a69694d4cb5db5f756a26f21b99cd56fa04ed050dde746f06162869244a8605d766074d590e3b5d350f06b68d731be29532bd24979080d78aac31c207fe53614a9e74cb36e5f8b2e5a41bbfbe0783004c77a0a649e1ccdab450f1544688da6ddb016d10a819c2793158997924ecef636c34c36427c29f0648423a59aa0ba9860594c1629f69a5039731c898fda902e17f5ce62e541b56a84c6917cacf72cc67a137ff34927c58ff84b6c8584c68141b6d3fd3a7ab403ecbdd08dc1ca63d9ddb8c2de8e7a9fb6f625140dd123707110a326227ccbc7842bfd5aa9ed027fc155a2ef8da030a6386b3312270f548eefc6c88eb20f5c46663795dd9631dbfe45575d5fa9035af6546b47d679b02036cc01881feaaf032c5b23241b675b41801d8b37be5a8961849b9f56c79e0bda89d700f529926fa3eab15f7351ab8d67a5fae2f6a71630667ced0ad0f9d5a754ef5ec8045c8dc438aefe8c0795557b2db4a93ae0b410281acd793a37b0d66697e15c1ad2f244d537a554bf36d53e160aa8ee9a77eb2053a3ea6ef5d435bcaa77ea8c29e9a373862d17038b3f41b7e342cee7b9e180ce21ee0dbd5838e7e989153353138d77d4903631410ffb91777db7f5b9bebd5d66aec6594aae2ef16fbadf63cd0ed9af01dc57b02ed7f489ab03d5e2eba8caf5d04d511840dce48355be0da1c8c5f65caeb8149a6acb1b59b50a4d8903868729d148e8d4274d7e91cb16b59e82ab10c8c3d714f4f54926c3ac55eb97b72d4ba78b72815187fcebef017dbeeed57b062df85b7df8f28348760806fea24f8c1600b6e5c9ad7e17e32cff29d42cfcaec2457f856ab7f30cd1ae01d321914ab0733a8921566407954b9fba629c0448a6ccf3187fa62750b70c07d89db7702be336f1001b33360acc7a05f2cc374a4f70ad15ff34c52ded921bb5599e5b86ebbb1e41b3117c465946caabcd25666fd1d7edf75c0706e2ab513775f8c8a238c49eb3b0e9c6ae3aba42f60094b7c7cc8ec07834d272dd997f7f44183bab7f6f5178e20479b7216729750a18ebf5677e9a1319e0b0a1c22d9fe55adc259ffaaba8f34f3b131e006b8ffbf47e82d244a6804293a9139147953c8171e7b0be689c35ff633e54ac95e6719ea7ea5cfeaad03f31c63a8dfbe06578c1abc8569ce1f9a00d1ef61d165e0d3e3b347a0ce03d44f4335074d86ad6e6a40f692d9415a01dc76a88ebc9030d41118f33be2ac3146de9345858c0d06ae288f2a7b7ac75eef79d35c84d1a3fd42b5cb7faf16a2a9eab9dcb33059ab867ac513bca348e091af38ee6ed54de90dcac28c86168038b5f599e713240bda2c40402984ace1410fd9c8d4e8fc31570865c574290a98f5768761ed68258807aae184709bfa986db86fa690129e9305a74e884df6c5cd5b45bfdbcca3aa3dea13b9b8e982e1805d21044a969a370889cced618bb32ca38ee18efeab32246355104e21a51ade50290b3206c8cb419c844ea497bff09863dc0adb8f5c3a025dec5e51ea3eec5f3ab824a5955cf590db9a875f9dbb52e735b634d8cfe5f28615474c354f346a0bbc22ab5dae87da94742ea3e7bd28a3aa8f7b0cb9cba91401092aa77b608d3518b2b04a7f1e93e065be6ae931a0e7a6eceb93ea78e57788bfb59d3b2b45ddb286a513fd0a48103ce416d08dd331f771526473435079441ca0a060e40f393b4b3fe77e16b8d6bc1c94b0800756e852bc0ddffa73e8c897dfd3c332ba21c507aed811da3d0be39ff6597a0fe50135a74eddcb7c4f68c863cb1837e4a208af34d561e0d84a7a45fe854b961d0fb1492db9862ac80f5ee5eccac19583283524049dc578b0b8284daec6181e1d4b308b1500584e5ec0504563a1de8fc00ef25a685101547a2aff6ab62886ab5811f4fb00e2005dffd74a21dfbb8debd16188c701514c472d12ca0a93d5e1f575d02cbb6520077f997465f797a2527d4c6dd28f1d1e98419c45d76b78f2af5df5ed4ba5de31127e4f1056f075a72f716d77e2a8d3201b1dacb59d22a61ece1ffd3e3d8e1b87e08fc7890b850fadf1334853acd03b1feb2f824fbc771c050494fee381c7542730b597b5eca41af19d4f9b43c22cee22cb27ed6ae5e0606f772ff849918b7de30b08a57bf21a1b89dcaf66c999507d032610e45d5094d913e842a98144744ccfaca195bcf61b96f9a5b751ca651d0a4af77e835c3e09e0efaf6665efda482573842bfe235b0ea00437d914d93277f0d76c0c97a5fed00b014560b27cbaf94e8e2b343d8869d771c9baaa7963a4f769ec11ae617228b5fedf936d75b7fb9cfda1fd0228a066cddcfde670fef4749f7f3b5ca0133893db5839bb2f69c9cc42d0d9854259c05e179f466ca8f15d9ac52a0401c5d4dbfd1606268457b7af377bdef8524079ed339e267ae1a65478999821828a6fa57108ca3a780a382a55b0558c3136e3bd3fe451731eed7e855d713aab78e9ebec43e6310ea79c7a10ccd187c86d35e9deb96c5adb4826783d21840e3c36048b3f2f96ccef819d125ab0ea24d9807d0535f1c855753cfa7def4a2863a8be3d3d40cac6055abf27b738bdfdba734f729ddb8f894429c05ee3efe25bd1d030a8d5a8e78e0edabb5d667b9d2c5331727cf167c6d5058747388a59844f0157ca85c4730251dfe464324010691bf767e287b21337a01133f1230cfbbac12d43bb40967f3775306b13e6e4fd7097b8694287d46f1a8671fa20cf33d51665f89de15cd6b8d4362574c690ba57187839447c95f69f5120e51e4d95efb0760bfd2c4c8991e1a4a8c0b79d1d614ca444c928a56675ecdaa31aa90931451a4ea464984691d322041bd05ebc8635900f4447809e503a112068034374f2dd364e16a95b85ce610786446efa473d9a0e350be60208cce974a09bb991a6406227c92711c01c1106ceec16c7ef1b218d0285bfb34af34d7b8253083eecc5360a820daa4237e441f071fc464fefd4b27edb0f480ef192ae587fa99a805045574ad5a0dc5149808549b6bb7d73852040dce7cbf0ed5f0721bbdc5824f56bf3875bd756c258d104e1f36f94b1364aa26a2e49ce0a11c1fb9d5e8dcb886abe4f0f9d1f27c0716ed71b1342b3348a599e422f56858ed5a87093683a82fe03022a95e4aad209fcd48eb1059091fa0744853cd044e69ba6c29f460e9f4d8af0a10b7fafb4f5c9c70aaae6f688925618bbc27d09cad29bbd93c37dcf6a3c9ceb309efdd0dd21e25a83645fbbfb2b87a7e93407e31264f89f6af4ed3e4022f4640961cf9d098b56fcb129cf4971dc3b9b8fc70eccca2ef332252979afac760e20af6cf26c6d09b54b42290f17ff4a9eec01dab5aa5d463b5c55573b9c7290ee33b953cc781fe99c81154fbe121e5e66f1750d326827c263ea3a9681e5dc0256d2a52975d400fece0314c8335a32e59980537ba80cf416b433dd6b9df0314bebb17446d0646c629235c5c6393d1b0d157094a1cee84bb1aa393074dbe4f16852fbae8a09db910af7a3bd2adccfeaf013d98587c51c78e96653539b62d4c636398491758c1746ff273716d7e0d78e63aea748bf9a48237a589d9baffe2fb64244480a4014e341c969d8fe6077cff35c998149cea5bd1706c6cfc2de6531ad1aa84ecddc68ae1c37360b95ce355293b8295b9c804f72c761f3b57ef2471fc2e183e90d14afdc70c9ef4e98e0b46643596e995263606c3867f45daee83114e74e50c3149d69fc933c0ed990789aa0b71f54b1c5a01a8afca063e29f4152054595a21e101d395a491ee8c6d9bf1d91eae4913a09d90910ac0513b10b0fc6513e17f96584c7d9cfa6bc86ab1ed366df18e1b4abc30d0efe08f1d3680096bf9b376ff81c43d04dd4cc802601329b3b26b435d2ec04c12fe278c66d20979941b91ab1ac55ace047b55014c0ede4ee29d0d99086c2821556f4a91179d56cd5ec1feaf0054a9fc0ce0af4ec6c917f156a639d91629985b13542d569483751a3cc134e22d614e84dd2049aab3ec31297a79acfdd5b2e77fc3b287baccee5157fcdaa1a2cdd6614f9db583b6abd06e90d50885a23489e7a9857472fefc7a5c475352a3aa08ad5d2d18845d8f0cb2f8859f2d758f0f67af6116888b3c5ade1e2ee78ced3e5f0bfe25940940b99e7bf1e45fb87f843462f3fbb7dfd8eda26c8af81b4b4ac7160a2e7f887edaef3a81912b5cd859c81e11946c72f6ffd0168437131f03a5340e714066e67f66b2ab2f55ed676e84fb27ba9428905ced0a5f7a119ace3a840a9c9af0d903e399ca912505c12cc4f3e6cdaba7e11bbb3135b4b7e36677fd6859830084d8c4b0e74ccd02d03157c021dfd255ff3537e405e3f1d0fe836c2f1cb4deebb392cc02e6d4c05c2dd910d0ffd18e42f674647bf1440f5166266f5d52be6fd9539fc52d487b82459e73b5e0ca251216d76c69e0fb4c4019e9b4a501ccb53158a967955c81eeece059a5b0207fc28eda87de2470627f8af7185a818b9893a24c81f3920a25e196d668589492cc434bde85ba8926c5fcb23c57f3d301937d59731a0a3d2008c28a5324098b2bbd263c0f9a1074fdabe4a85121b72a74d0b1314385c757be1a86b50537998f3efb14999ab9c69afd4fad3badc61eed9499025a69283ac0bb55bdea481d09ad2569bde73c6f6927e76035ee3a7f80c49cde86b0cff1bdd4cd575391b271755e2eb54e6191c58bfec1961029f178aa74497bfdb42aa6e59bc16d58c95073ac95842b62b46fdcbc309d9ee4b424dcaa48bb17c5dc6240e5b6a2ef2c3dba724a79f4ef1490a8797fad94073897f428eb08cc76b86a6bfd465a694e3d7c33fd9efd540e9c72d2ca80743774e246d1c8d47e55be6853f5ae0029283a522f46f93fdac991513ff38b7471c802023738a479ebd9d38e638da04d557dfa8cd4573f8a3b2a13c19e6baf482e8d9bd0885a58cfbe4dc53c107ac456ecd7a087b3bea4276d52a1479441a00505c66377d6fe693682738494b3af989a84b6252287b2d78fccb585b410c90d849cfe568103712239c1704148bbda4b342fe07a46d7b0cec8046a04fa23ff468c009ca41c4565a93b432fe50b46ac56cfc0f4e1840c4894bd3357726ca7c36ac2625d48104b707e126dbac7bd7b49f8958d6af26797c3037fa6c6cc0346872f0c4ee63a8c76faf67cc06f3dc6800e99bd53c3bd80ab522e700c78b0b1e052220427042ab99e8d5920d0ba4a0789afab4ff41b19c0d004ede52fd750e36730b063c54713c06f4eefc3c7a3c396b6910303b55651867664b102a26208e9c012ec964a317dce1fb2c3685af643016533fbd608ac93ef43cd92bd09917b4b99524a018508f708df0842b10b283f09d80a7026ca1f6dd7c69db8c65251523dd29d47d943e3f628b548130a0df5cead0d2e413be2a33efa78247feaf4d5d928234d182baf073e507e2ab859430d7270a60d30747f770d48adeed3292b7b2c958783e3717b685c822653efb304b304b46ecfc9ee45001ea15f7a3cf855de4a51a5b75bca745945c0e3f13649f070910081b74942ebdcd3517785c242d5b059ceb033d592b5e373a64d15b43f643dff7cff1d9fa3faf8fd9ccaebaaeac358551feb78a3c171c1eb5ab8c9056b7596719c4179d75f1d44acf1679051bebfa68b4625dbcfa06d9a8cf125ef96338ceabe6bc7866dba76f917bb5ddd7c0119be7f9bbe84a9fd1d83c12a5f408698c43bcaca2085294354c608856d9763d1b58ed569669943c1e3510f87358ba2acedb185862e1e8623619eb03d98ba6a079d9373b04b3d974a3df34c116997b7b0b33b3fb118f34ef348275baf7cd8fc77cd196936b2f97d2e6a215ca8aed9a51b165073dd125ae01170707890e3f77fb6c7bcf1011097c054780447e22fdf3175d571aa70659bc756783539292635cfd6b8eb8a2fbd6e5df1d928321fc95a167fd398411d2ca9e5c0f11894443c90e190ede01c600237bcdf17ff8d07848448112335ad5a0384f11013edece710a09d1b1e37b5028e54dfd1ce06a3da72ac05b46b57b833f0c6e37df1db78abfdca95c7a0f6d5782ceacfab292f060d77e640abd6f6c531891e69da9176a41db5f66d47234790340fcfded2d89c9ae5ff3411ef91cfdf4d3be397489123acfa987635d4eab837f9cb27106b37d55022c94f2bf2973b41c39648d59be7a979f871b035a1fdcdbd65993bc0cbeadf1851485299b9b977c025008c9ab8b32c97eff29392bf5ddccccc1f9ddbdca4ca42757021703b46f624c68b538cc98a12121528474c1475868c19d4986804b7bbbbbbbbbbbb628290e0b3b31d37f1c8e9b0c8fa1387002f16e06aea6e29a39400309c6c3163e8b5acf164c46dddc8ed07caa072c3531151173750bac1e886a4309cfaece8b19391b9eba279970b2e0422caef33b2affb141b63d4589aa67dfbde55dfe2b66d31fa5744f66ee8d2dd37c61853bdec3451882863163251926127d34f9ca5b9dcd98948501c1276b056aecb65f4d9f136668ccdae038e893613edba4f868cc2704c945f3291f74800d8907af94154bf3d173fa005536c50f9db0f69514aed555f90f6b5e2fbf8cb83e4d78adf0882c8d7be2097bf3c09b87d12d027f555e9d00534e587bf9ab08419d22e873242640bf59fc925987224c3ca4e8c3136e9581500329a54f9a908c61893d0004510485f286d6962058c47c42f0c1369ac18c71655fe54c30555fe46b184991a0863c450e5cbb83748428818638cd10331c610c3a5c6d805e7504950e26a982c66d5c8a096a48005944c8c998c0d1d8ec814dd1023f38215349119a2c80260c82cc124ca0c2616706a22c3e5862f51646650a444068c1b88c898b1c102543c8911030e16f87284130401c058c2e40585872c4ba0b858da07644e4d929a8c692f64311b906c20c306a2346cf0c42436864912d4f2482d6a1e5f933146c9bc05b7756577a4fa737b715d712291cc51b8fd40184e2b706202bba1090c3064326a46d54c8ddf0bdb997aa46b0b488e7aa3c62f4c81f6c9ad9bf632ba103f5617e2e344fab1564434aca9fd610df46de07098a1494abb3f5a23bd758de1f60363c42c812d61d2637ca006514a9c94c8606d300e1cd0fd30d6b8ad4292daea1a6afc3589732fa979ae72724137c62825ff7e2dff50a0a9fd6d6533a4fc5ce88f31da3e8a7493730e628c51070be87ed27d77e516a594a1ac45bad8b030ae0eebf8816effec662835d3b959fb26d77df9752791dc5a382b92b342a3b78203da68a38d36826ccce58713638c5e39d2a7f281c7f766f6707804fed87275687751ca9e1da3267bf8a0b6ab1177706298b56be3152e80baa9fe3c9a67f7a34ea8bbbb7bb84cd9ddd7290046d058c3ae76cbfc3a64386e1fb79f31ca9f3f5b93114afafaf3c7285beef4246ec2f776c13f8747e09f3bf6c5dfa4b5bb7ffb87ee66f160f6ff68bbda8b3c61a41b54ddbbe3ae9432eeee8e4be3393f8489839cda6fcf693cc250ff9652fe87c03b48000c60445c84616262064668a0c90e34389343163b98e2454049f913ef24452bd0e287a41df84003154f8a4fc2d6eeee6167ecd27425873262ae8851014622ea01c64c51c516269808a20897c1961a30c1c1f184aaa0faf7f6e8da3121ae80820c8c95b07240f96ba5c0fe49aa2bb50bb4c0a28595ca7f02901061988490c2534480a2fddaf342c5ff218292b0bf886b5f0b3d2415db2e4998a95df73739b93a21fef869178ba084b6526817be166bc7c7441ab573e4b7eb5d3cdac5eb84a5490dd74989863e4d34b9be38e38aeedeb5cb9d992977c739a7cfe9cfc349a1daefcae572bc82c0bfc06da852deceeaf84f6efa967aeee9b19e3f8efbfdb39eb5e38fb48b3ea1fee1ec7cf8330bdc49c5384e0a0dbbba404fb3a62fbcd4dd528699caaabba50c3195ab91ff020afcdafb884976482843631bd53bc6ed07bc80925153a25423538dae3dafa426b58f5a8c5fa87d2e685c94518b316ada27bf7dc12b7f8575b1e3eaede12cd5df54fe4d6a1abf4ca5bcd5e9dac57146d6b6692b5e1dde38068573c518638c316ad23deeaed4b64ddb18ddbdbbbbb5f8b1bbffa8abd32cd69ccc3fdab5b4bb37d6c6d327b46b3f046ef7a04b4d4ac571aa94a66d8cabc9d9dc944a95da1c57f456673fceb66d4bb172ea4a7777df388c7126d95dc6a86952326fdba64929b79a252dae5edd7ca6acb15dedda326874cf9152935195d32eafc6e75d1fdecdae9bbda5e3563c68341937d50a38c6892915192783855e09796215d7b9bb0fe936329b18db2aa678a4562c16a5fe43687cb058354dc494a879bc86de44d58daaae8a53a53457a9542ae7544e44cf709b23e78ef628b56d5b75504043625c6e95d3a57efce5e3a3c2ea476a05e4bda254bb9a48232202f235eeab7e56af38a75d3f9b8771dac5dbca472af08fa69641798fea5543ed045381add68243bed6146e41d94588004155debc6264a4d2a2a6b9e611082866fdf191ca63236e83c2b33585e91e0f92a4b49556ea587be94d6b2828a82abfc734cf92a9f2f90c17b54bee88d1fed83ba8e03687cb21a3b3ca3258122c06c5240595bafdf6feb1d991aa9b31b5f1a91bd05aa183a13585e6190c62908bf852bb9b53e551cee11f23cb1145c366637b18ccbe787ba8b13c1d667b3aca5f1c420c34aace9fac0fbb29ab27ef612ff6c54fa64ce577352aff93f70ccabfb065bebd87937aefaf7e1a4ff5b1886b7afe2e5bf273dcf5d3190ab5b35379d67ef29eee992b6366820fd00f7ff1bc12e3591028a076f17fd0792cf3177f121495839bbb6b9aa6757c0f716aaf2ae020c7fd148750a2822d757e3fb51857c845705445fac5ef1fab7f44188a05f70a4490534a54881a6e540b322068b850a9c631228b585d1dd4c5e26949cb512c06ab61d80a29507e2d5f30ae82b4a6b0c0f717abc0055b53b45f9065441935dc99bb76a4e7e3af2b43b5178885ba92c52e3b10b4cb818a29a104ae288b448a18d515eb68294a110c3c298a13356428bb9483931a466e77a10122f01ef91de0bf998081e1ac6bc4909e86b1a268f547c2b0a2a51f70a8fe4466ad2f701b2ea31449f9236fc87e78cff4214d3274c5d03fb8e9a57e67474b7d3796d0709b90782472d73aaa8ad66906a2eee9fad5bfaa256e8041c3598dcc663bdb59ca7be6f7e41eeeb7c7c63daad4eaf403790ff7a9f8d5dffcd2bef0c6497ee107b53fb6b7363882c4c89c4dadbdccd45c3a6132543ba85ffd48bc8784f66242ec9e552d41bbf697e3c47b4eb0affe18a692271c90ac0e0fe12f88a328d155f79777797957d3de59ba74e9d2fd71982e6cc27c0cd61ad6aee62149049dc5269a18d2344dd38e905490180263831a59a4903dc1a4c687a218c8a198e44a524a29a5c6b47d318368484a29935c79028b35a6502286882e9c698a303da8be94012545b524a7abcbb483ac0cd72df93442b04147101d0307b34359ff392e1e06604206008b1504c8328500aaa05add25a62e71dd054b4ef0a07ddd25a62975abbbc474e44d96fa0a099ce1e405982b76f8618cff2b5b0f9a51d1126954839438bb03254ee567668900a4d0ad2e130f3708a3868d8728d5290ed30e666aaa2e130f5cd490fe5cc2b7d490f500335fa0aefcb0035292ebf0af7445ffd36c41f77763661cd89318f3182d95dd573e689e7bd54b6edd66bdd77d230e272326ef3d52aa714a793bb1976d979d9aa7bf9bff7d766a9efd7ed058a27fd050da11f6b9a95decd42eae5c436eaa1c26a9dbd51ecafbd347351f3d1b7e72eeb86df536de115f7d8d27a45d71e58366cacdf7cac7ea93acec0d47357925e811627737efcb18a5bbdc26f6d23c2958d38b81daba1f3fb1d2c7499c5457c5ad8c454e9abcb84daae3525d978ace3aeac14ac7a58a624d4c36f1db091bf911151db02751b5417e2e95e4b1cacf58f8dba9297e69721813466a29ed62362ac2b1030d39eae663682855ee1b8fc911af4ffc73fbc2f9313f0d214284610cf5ad80aabe85e6514d6905b9f1fbb552d829ad203537bf5f6b63128eea9e7801f2976cc98ebbc48393ea41e51e1ba39913a3213889872d356c2a957bd7c9b35476a2863c2602aea3024ab43d36080530dcfc0d0d409ce7e728efc1f982664802a200e7614801ced3c020ce1704821fc09b1b5f1008a2802b213734006f40d615fafc9579da5c000605fb2a0e28d4c5507352eecf63a80f7ca0fba9d4f37a5b395ef5735c149ff11a66039d1f721217e73782197dcad971a620c314685a6afbfdf678ac34cf7e0c2526da5c00f6648408d582862b2352a47b3e0097a3b8547e3ed3b05dda010a6e871f87057787a356879f9f78f093cbd5319bce4983f382168c17322881422c45d1f442b4040a0c1a018b2d305088c13c394206c65640abb7d0c0cc0cecd14314483118c845efe834b16558230b224e76ee05ad0da03043060a390d4ead15be209e728319a240a1550d33d03f4619b460e6040aad5e8004fac72f8865e0a48918284473c611e8df6eabb112276494c0f616148adc38f4182bc0785a2e509834711919506902395f42c31846a0d026a31b460a18249093ee04ca4a1328d49d39e268dab08596797483153230888198c129060af90e47a076460a1033b06938228a285003a306982890eb68342d6b1c29f10ed6698b2632e712f58453ff10454313c8f96ed114451228d400323d84891a0c6a98411328b4d383981844275c684004725ad79e27110326723003b9ad6b2f686540d4c00914ea34aa84818019c0cc402e654506284ea0d00e94334dc09c56407b4108c0818c245068aba0828015283102b9ae6b0f0135d8900472abaebd03b4414311c8d174ed711618cc10052e93922e512047bbf6dc8719c8000672365d7b41ae0519658a40a1950e4f14dd74ed79d10f349881dc8daebd20f985071a66a0d03a1501469caebd78650b2d92400e47d79e63a146124720373dd0d13550e982040a31bb1358cc38710472dcb5d76a982992815b85194dc840cebbf63887299e20818cc31145c8c0a03ea3062398b604092b92402166bec107eb7bfa98dc75cf751dcd8faf7e3e7b21d8597561f5f397b43871dead9ea5303333f3b6d1d4d43c57b3d56c5b951f4b69573f8dec35e856b93528576e0d2a2b173bd51a5a975aa1a0aadbef340f8b45a993eb3ff0e19b67fbfa1989f2cf9cb88455ad41b515ffae363ea2195237b903a49582fc14f091ea4377e276f2399dbc67c1e94a1ee522384143f752bbdfbdc8afb5fd5657bf54f28e6d338d9e3ef8f0114be1595dfdacabd5b3e72b2f7e77146bd84523e0da0a838645e2d6004abfbf95be161fb5cb632967d0bf12553525ba8572636957c76a33c5ca1ed7560ae189324ddf708184adc7713268e0fa4bbed7efde1159b1a0618b69a7586d294c5868377d1dfbacd0fdb063304683e3a464667ed9d139c4bfb065a21605f8b55f41fe7e30eccbd73e18aa04d967180cf2f96b2cabe3bffef2e7dcb3820ec94f0890cd0d686a5ffeae239c5e66476a0e7ad05251430e780085b62cd0007fb4a630ac700128b45d010350bef605ad164d4e4a80429b1210a0fcb61510f2a8fc49407f7fad207f7ba92465c497d60a9f267ffbb4179a33dc40e70e166d0591d383f6092e567801063cec2fe5e73c1454fbd9cd5782d5c310ef7922eeda1e5e0b44b6ede5a1fd7aa14fd55ee09e9db5d0fc0d51a29188d742bbfaa714dba30544fbf8da47262a667599a880aa05a8cb4485953a9b87a97e5da62f522a173b5f49b949606b94c0566d86b2b216b5fed82cab06a46b7f093c1026a9fd496a7f3f0da4df05ed350f4800aafcb65d75733c32e198be38a9367599bec0bedd1853af799b53a5b7af79aa8f5e00ea265dc6df3eae50e89f807cd9d5cda95acec6af43a22e4c76256e66228d33c47df3040d5766831ab342458a07b6c7cff668ee9f2d1e83a7d82f8f45fc34ff682e445aca5ad6b226d24da4894c2dd409112832994cf603886a319b1cbac848e7b0cd3245462277195f70cf0356cbf67cfbe2af41ab600b1d587186146210000a0454f61e95dd0b5e4f29a985763191fe3eb023f87f42768c2d4d2e040d295454932225d174515c03494a9467686790ea0f6dc30119cda4ddcc8e934f4c16ee0c8b152ad508926d9a91718f4b4c14ef88f11943c61828471e738fcd8cf88b998d301bd16464239a9c363a90329ba5543355145c1a45508c60b1b2b9fcc53db7d6a28be23aee3eea280dc4aa8b7240c39d4d1ab9e7169ba3a0b151236ca53a9bcd664a9369622370699f1e4858b8a3847009fc710c438cb00c5a40b9913468d8b00ebba836a9bc89bc67f51edf699a703cde11ba8eedf3dee6711e9fe20d2e768cf8f8f8e4482aa28b895ec0eb4eaed1ced9a60eb149678a494a95834f556a23cee1a870dd8d0edd0a071a32d18a0627079a9a9b266ae80d26166a08b5c942e30e269b9b3528efcd0d336ee044a191c331e273860f0e19d0f8fc383aefe5222226f282fafbac8f07396e80918395c5647573a3abe33f844be0cf6647b8f1c54cc756417dce9821c30a13319940820924101111f9fcf08f65e5d0f16388dbe112f8a70008b0d9016b87fba6053d77543bce83c71b5de2dc51ed481c208af8949a130d37c6f270a763b2e3a345dec0a0e12209194af59f1d1f7f2d2e0e1d380e070dcabbbbdddd3631a0fc5a7c5985f24edffdb40f8165357edddd0d44eceeeed8dd317677f4c254f566efd8da1641f9e3abee8dbadb366b65709b13c68e9ddca6cdeac4df1882d4be6c44b0994046d9695b472937d9cd8a6f33048d326a51eedd44d149bbfa7520456ece2dceda1efc5df9bb591d790304d555fbea7d495509ba3d761dcbdf5d6af365949299e76b9d9c40ac470da58ddae51f1849d13185c6a32e4654b99aee612727560b8d1144598c9115437efae019c939c9830f5929c7c7c8454382e2508d2f24d620699ed6c718a353c4e98f1f7fb6d8a02def9b7e1869887ff0852c1d5f485939be90e5c117521c319c2f9c4621f59b161b34ec66ee365f386521ad29f21dde3a79cb521f51f50ffac610aec99afb2c5839ff0eff863e55b00d4766662766e06ea2061f93962dae2899a8419558a65489455665134330f183ecc9a104462e4dfeb38625a6b8e2a5ba6a36c1344e57643a7fce7905cb15236a76708ff8f30aac4625246afcd6ca47a4341011e58b0e9e58d0448728b248d1344dfb20f5a44445893035be8e958f488bf83259719f60cae149e205498c5102a96a4890a9dae758f9d05c55601113638cd183950f197657e454eda3f6338caa3d3d628caa3dcb4a1355fb474287236ea8dae358f9d05c581c01e6468c31e270d951441a463451841155fb1b2b1f1aa54bc49002eae8090dba28e150182104b793ce8ede6c971a76496324c5a0c6b759f9883963681874e5438b677471b50668da965043126a6842d59629842a59aab021832664f005112d20a28baafd5639aadad3346591a166a90a518df157ed84937c4dd3344d8bb17972545966aea6254a142f4a4a645c3465c9c2c251e4da1e4ee5892acc1237a8a416638c93a67eb99c06d490c7135a96ac3040d57ed218aaf62ced9f49d5de25c41455fb9d1554ed7d8670aadaffb0a06a4b31b8220b6e4372a2c6d7b4170c41668d1fd6b8f2e505dec5883238b9f221674e036a5c42ea414c8d1fe94e943151d4700415596600e35c9460c0006003d452e3c777aa695786543896a65099223c99da26b7edc809903094acec6003a8288c80c8949682f8c208880d8a5831a4a52c456c6abc92e84ddda52c2f4882eea8bb9445869913b3073821bb517709872527742883f67b6fef2e37af7cf65ee8caa05dc39f6550aee1772d5710e83a3dafda1534741de99e4e721e924907d89ebef9f83bdbc3e6e9872b5b2f56b387f86b6adae86071f7ae0ebf8dd749de53a45ff1e36b5ff1a39918d3a871e38259286a7cd5174bc5b88076aa317e38239176bd14347424588def48716e7c1f6a16941a9dd438654c20f0c154606b05185ab45d314aeaaa3102404643972b27d2744a8b18a4356541d6ae363eefbbfcb5fc85eb64820f945251513c8a694d4949fc1c0d1b51c16691e324ef6125fca4f247a548c44944f10b3916e78cb18bab18e5aa536ddf7393316a1a5be917d7481cda3d8d6ba7fb58feab5fb0fb9045e4323281e8a7f37ef82b16c41be22f21575443463256412d05015b828192f61a0c90ea9a517749ca957f0a43bd1899c0af02f7778c8cdcc87dce55d1eaf0774882f00f274569cc7bf84914218ae0278e19ad0e3bed60b1b4546a4e6e7ee4542b1fa9e7150af3b7d7e616a3f69af69aa63113738e07e1bef3f9e13e97efa83e745556815540a010fe9091d888a1b831565081db17d16c38aa53b62f88c1d60adbcf9f1f0cf3b7af06d97efe377bfe825b7703e12f2e0b9847c130e03d2278012606b6806cbb0aa27dad0952d54fef705610ede517d49ab2e3affe7eed7b97bf3af60fa02b50fef953d4a10b19454c45f3e733c1b468991d390c894a0f35eca893665d44651cac0b0065a2f88b37f2392a95f21ae6af281c2ccfaefc56b24df4042b4b37015086527e9ab2d509829fae18b183862573445136b6879f6417557ed8f116dbc3515c832adb68abf69325a1629d7cf7f7afe352352b1fbefdc79523f1fc6ececa3554cb5a42495977547f61cf729e15030d218a2e5964e02165e84aaee44a4a3e49d876bee7a4dd51fb926f6482f4915be891595bfd496a557dd8505256fe9c50ac1c28c74aded34ff6253f4a1155be92944e6db43a12ca09a71ad20a15c4a0ea7f3809003464074d367e8c9fe302628107e530ed35951f877754aef1fd9f66a73efc9bac3e2028eddf811ea9d1a4055328b78ceeee21cc7c0758aabbbbcbb8d345530c607bf47b7f5d506e57bb583a50ce3bd512b4e917a309f1f311e10a6522a8b7093f3eed62614157c77b806145b1c58747102933dcb66a620201fafddc0e2fa85d60031318b8c30b0a126223643cc4c02af377bc083aa040b8974254ee93d4766a9e30cda3e359bff9c66a0f7ad6b0380fa85d1bf7add607df4c1e4ebb5aad0f85ae2dae6edf5468533bb598ed7b4cf77094eddb8a53dd24b87deb03ee08168668336a9eb0a554212a109ff1c2c40994ad35bb99460d0ef7d1766d34eaf01a69fbe875d20e19286c7b96c74349dbb3d3f639be90a56a1c8ff385cfbaf185ac8d05866e543620a5e6a1f9ed1b4bf3a8d0db37d3f6d07e93cf79e1576ec8eaa777f3d10b8b2c540739d2757e3fde4fa14fbd01e16d3cd5afbcd67caef341f05a292198d8526b1a69076b7b6e87b75d10310403819a67fe4685053210a680f03b3ca0e6f9eeb7e7be1049e57e7a21923a9fdd0be777c441f85af31764a15fdb775f6b7eacf313c2c445cd99f3fb8f80fcd5d378ad14668802a85d714f65e5f168d79684d4aeed456883ce57a179e647a45ddbeff0b81ccc62e0ae2ab06df377dab5bd099e4fbbb64fe5405fc906757e612bd52d6ca4bafdb46b73b6cf0587511568dd1fb076a054287f1bbfbd233ea5fb58e8178f61a24e89d95e917d4261bfdfbd10ec537561bf91585f682b050f859eb457a576f77bce20ede2ef3d3e94ca3ba5fbcd2bb24fb55d8b71a7985591e45af4199130fd19699e0d970cba83052fa85ffcdb218942fb1b22a45d5f147de2518195449178096a62183f50f3c8a3caaf42f3b0a050fe1fdc2d7911537b3581fd0e6218128e88902726e2e13a21baacccccac04c6520c5566662ade4cad1d12b444f146f9f8ec33d7354a7032071774ab5c41802b03d16a2b85cf058d9bdb24abbf0a5400474b5ebc8ce1a63db369cbd462ed3021a6ba6e897a73fc58bb1878ea2e49115565f4a8e6e100fd10a10dca83846ddad9d99e6caf71e1769ca191080b438eb4a66d5d1847f45059fb8aac530a5d18473cf199554e56c2bf9d26e8d6d8cf0e25bc20edeaa75cc352146264f4d6d7d6b25e987d90419a877f9be1e989334a0051c39e2d085150ee57cfadbc86f217b39ed0d404bb75da50298772198c363bcc7bbaafe53df39eedb74a46cbbff9dd07c30743151852afe27ece397ffe0043270aaa1224154ed91eb67d42f361f8d4b79cea22f53d09c181ea43156c1f02559db27d3020f1d747c45faa2e54dffa2bf53191bf70c044f3abe2dfbdea4356179d8fbf1884293445f35bcdb7622b7e53bad80c8a6ac84620704137075dc6a00106c230bf05443ff54940fa0555f1dfbe06a95d9cdac2cbb1652876aa4d5e08183014ab468a30602856a7c020b4c9c0d46f9fda425b260216da5fd84f7593810ba63ed82603b7afc5338ef217d450c38e70f217ffa6c9dfbe4e1ad3444c5a16726da6767592bfa648bad2a4863d6b275dc4db5a9750ba87953419542a379da91cbdc3e6d6b61766a6957ffb884af3eccf28109cbf12b4d5bfe0a6b630abfab0f40416232c2d20db02c2ad9fa2fa84546095fe24759ff793d424b50544abfdb552bfadedabac1b695af27342bf260155e3ee744ee8cece67478436e886446d6666d5582bc149521db3fc6c36cf458c9663a9e90cb7d8ab7f10edd931455f869cd849141f691d817e0489c2e15504ba87edd1411b336307513c81421cc59725c02afda0062435811f4ea369fd3fedfdf0819ef00389f70075511cd43024ebf403c9eab88deae7871bd5b56b7bdea889a30534649db0f2a1fdaea226a36c7d0ed777252809ed72c7a9db05091e6ac84426f8d4241dabbae05a40fd49407e76fe1610f3b7fe62b0fb19ec8fbef6fe24e0802e9fa04203b58be3d57e394ee809f6e5ef2f85913e3e8a3a8a95c1450551fb439b96c02a02ea360d9d51696da212e539417168a1336e67bc8b1815e18ef0c38ebf711ff990d632b1d2f7d43d4def8186ac1424a9306385cb11182454c3c3141780f4855a32a411036b825a01fe351e9256803390d404e47327c5867f0b5989abef121458aa4735cc4bf56f22265090a9feeda47b968b24180c16c32e4d61a63ae8cf6d6c85612dd7e2af6a8e1d1224341c551aa2ddb3d2d675bef2d1d1acc47450fcb44350f304bdabc29dca4afcd3dda7f23ba11060a15382ae334cb56a354143b6c25492c4a86ea00cc54fedf2ff9ad0a54fabe36fa3023a47c0f5e90857b9339f676ca679564b104c75fe74549a4154fde9a0e6d96fa2213fc57797a2fab399edb1b5bb9f6284220a29b5bf9c6f9783536cb49fb6f16a94bcd4137eac50212cc4232ebfbbe3f7d7fa515598693c01390e5de718e2a3d0709f7866c84c5c8e01161242991583630c50804eeddf1edb7136b553b59fb74788105f7d47646aeaa8f36dea4cd5f9d3c6f358db0b0ee0df55737bf7053c046739fd82a05c4f5804833e3319e23d3f29eb818474169403dcc37dfc211bd81ea98ff353de065627fe72805ff1e38c7b465c356a8c435627c6c8c31237cca0e14ecafa77ad53051888029302abd31598abc57eb1646a8e9ae372fa6643b5046d9edd1e110c6003fbf20f67eaeb6f00db83045c9989b9690af1971764684531c6d2594c7fe9981ce3588f0bac0e06f8e5afa37e21463885e4b0802ec736a6e5c0a996a04cc6b22064a1a87c44d096dde430146e98392965b11c025b7dceee2c88b4d0aed412f42b83f277165886b828d13c6100b8abe9ed129959939b9c526eb29b638c31ae4777d75ec02a6f5d3235b70c547fee8eac52b1b721d3344d8bd107ae6776a8a3ae4df476775f01e1182a4ebf2825c3a293d9bb70817243ebcfb5e3f3365f3379720ddbf0cd17b2ea46433a3f74edf8a4bc3db9bddbb67c21847803a75ffbad1415f46342d070ce36a2e669178f76c9ee62f7a87e555e0bed496de7495bfe9fde96507e2d885b80431950606090d08241620656892f5423464b1358a5bf0532644370a2a88b47f7a89e559a27ff0b1d0214a479b69701a6a8a8a42ef64435756646000000008314000020100a860462b1482c1a1236691e14000c7b9a427c56990a84519203310a21630c01000000000008608066c4120025949beb342a08da99c14bd40aed6e5ae059c18bece3e31c32031202481e301737c55a5b07996a4ef450ab8c2c9344c846b0b4ed9c39f2e3e8455d22c6257bcaade8167c40387c9bf12f38617fdf5e8a2ea2c7bab614bd54564dd3a17670f89de9fe9a112a22d00169d178fb531749f72dd5877d220f48ff91ab95c5b8268c8f25c178a7404d68694635be7478476851009fafed2039e96ab767e9e83ac46814d3d4ca2b497301e6338da96dea5e2729b3d48a6dc9a6d87dbc21cfb8d6f41ed4a8735b32a40039082e76c6040c40bc1a446ba2c5f59ca560a3c5451c72bd6bfb325a370f2c9d559ff0d6f893ab4fd1f12021e520069a0b14516b6e0305a22945032da57ff829965ede15325b2ab9320edd598e99f7b3e45d98eb05bf6f44c1bec7a7860ed09932b335007cc3d6f09de42cb657c656d9edf2369de1cd2eb564b865d9fe0321ce12d8312c8509375c4f2a62f0cdeeadbcbcc761d82f2f5b80e6ca90018b2a9e704d2c94fcd6a170ad44d4ffa4faf775322fa1579b46436aa18636555991c2c3a06467aa2d27554715e24a3d38b2aa1d61f45d7398236e5d57b35a4d3011bd71c6ca5d175f0d215d1be0ea7eb60eabdea5ebdff72ed14081ac7342bb16eb2a84f3643b2707906d419451504e2ab2460bd8267ba6abe7e26782a7d0550e3d1b826450ce28e53d3d325785889bb5f17648aaa8e011338940c4c03c2be6fa9427e5ada20d6ada7118b4f507f07d0990ce6c835a1d9ae8d8ad303a4cc1a7975b6ce2a9b378a1cab18bef6e11bd7db76dbecc43830b5d3737dee3e5f06013567dcda06c34d1438de4423fe6f985ea5ba9bcea516c58a060cd26846d2b9abe4bc1c98b08d69255f68221b9a75c9018be647c0e5de9f24a5ba6844ed731fba7e47ac6fdb12cd543dedbe1c3b10ff92d4219b935d7485d0b8bfc446c94d299a4f87b9af0a838b0978f3481cab9933c6cc36f4cb86d52f3c61d63d307c9b28680d1f364b9b1c8dab150383a7222ac62492a5c686a9835a0d513a08dda2463c144a490ed1dcd06dc77f16e3c9d0b94dcde994b0f13d5069433403a4834ae2c03f76ac35318415d3f208e3748e1ee9ff10a859fab119769aa2a63ba9a7823d9c72f4b1ef903730a7a46d9d2cdbd77ff8367e2e871594a6e75dd028f7b9086bad736b6247c859011fa399f401c43b8a742cd9ae6cdcac91ac54a1c9e7cd241bea75782ae3bc9e53f9b7ca7c8f0ad8edc40a297681b2d32f574b0ddd1eae80e0eedbdd61d69e3390e359ea48a393985c96d8397d570f74d7e6e9ed7872bdd8f299815a6d5721d05c17845597d8bf9e64c8ebc5d33126c9c35b5d7011ee389bb5e19b8808cfe9055e606eed1795297ca82966dc8ba3532dba779e7f91f14c0f25e8460c9a4ee4f238247a07f5d624d25548d8f0d15d6dfaa3bf4afced947f0ddad0d1d9ac8b9254dc21f769e44db7bba0f96354d7b45a7e0d89523a666da797c33b17572127faf0ff3ac99d0088b7e966765ee61590731521e813f07311b2251a5959c858f9601aa44d11f53fa49a8e62fa06a5efff21a07a2647b5bd85e31a465ec3b2be336f94ed4db158173fe8719450e01f99cdb3486540eb93edb6036baa5853fc5f8d312491a6cad9896d0271892f12dfa7b8f0388017beb01c3faaadfd32a4b189b72ab2daed67499490dd426de2a40d1f7ec5d56271ae571b680d48d341c3269ee8a96442280579123815fd02e97bddeabd35bb7257ea4ec1af879df3f74ae0c01c6f56c7076fe3ef7e05bf0d552ccd2c733c7a0cbe9546053c312a870ee00db5f3ee538a969fca0ce58e672824025a679ce5216e6eeacf3f505820175ed3be7a5bcba5460dbf1ebd60ef02d610f3c3f90cba9e7648b4187455f724c5f9c9f7aec75da96555116ecf3f3fdc218649260d406174def4f2e2fd267e81cfc8d7881d1c92dbf9ea3f5f154e81832cc46cf1cb0344b7962e31fbd5471f728928e93e69d692670a3c84259f220c66045f1cf5b75baaa7cb0e7ecd804c5afcdb5bfc7c4f8c8ed88d8eed88eda0a6629be786b8048da6d3a2a29f2aa7d965a1550cac60aa52bbbd72c665f54ca6a5d5b2a96f02790f000dea89a31fdf32a9091c6cff0c4eb1f6fc6781d349876f8e1ac2b23bdd70d43348a09c35e3b22bba9ac6486b4de48388afd0203ed374b0346ef63650a0c0dc33fbcd6e3d1f550526c252c313beee7f8815c809c0a0aa431bf552228eabf8864a558b2c1139bec6d35a49e2b7d9d3289cb40cb3832960e6ae2a903bbface4bb5a99fd5b1a8bb24e897e62cdaa3518a0424df95d2146611e29742899449e0927ee966cd051005f36cf42e0bbaf5ffab32b0e7b5e892a665351b2023232ae6f5e8a59da1ce9b54d67b4c6ff3b1810cae5b9a154514266a98cf040645efb3dfb63aa5270217648623142fec434f1bc7e85c4dff0c03f4375fc9cec82941e533bd73a889b932f829ce7b343e6be751fa1fc5b7e5f5bb99af0842199218465909134e78404490113e247b12328fd15b10e40b4a9e70ba961ca33ab1a8098923d29288f1ad6ae190497d2538c52748d3ca7c63276961871ed89e44d2d781b8272a8b89eb47f24007038b2fdac94fb49cd859854ac757cd192a8c4346a01c6f3f0e55f0bfaa33cc79463166a2e2d1fe7b623b52ef03e2560e813f1ee2f13c9f125a1f49f259abf95b4add92ed9b2ad2ec303c41789bb1cfb3c9cff949653f6f967f462b7175d4919e65f021189b2c40db4cb6012c6db9462b70690208ef7dd6070191f7d000dbb022c630093cd3257f81b2d2c2e9d2bac7194ea88f4228766636ca966cd997ec13b20c7fa672291090e7a370e3b5dbe826dbb9f546e4fbca1d20597c57c7ba254d4a3b5c6f625ec79561012156c77d581878412c89f76401ecf2e684804aaab91525138b7d42255a4069cdb5d2c4e54234282ea76b05d96b6772ce236068cef19c5b0438ac8c37895c8352cc0fda0bc3add46852950dc1164546f8b853f1099b9fa9ddd38cd922481aa35c12ea5e1bdca18b577f1567d391fc64b7d5d04361bfdaa5c6536772f6e5db87efc213fdca1b38f20bf81d2a7918c74a5e0c6d3fdd4dee3c6db28791d667823316ac4e01b4e407aaac34edc907d790cc1353c67accaa7380c9a937fb58ef3630662d90e7b39b38c0101b606183eb5d5da9267fcd6801bc20d79528a571e3cce59b3b2e8da18fdf55806a3cb16fea53e3728b07eebc2979e108f8d2d9b532423d231e506c0546b2a7793284d9a07aaea5d03ecd9446d6a27f8b551dc233b1d869e85f654fe929477169c237d13542ad3810ef416c39e0e4dec26d093682873d6d909dd8cee81c07f72add41da08950eb414712285b63d1fa6a0a99b1d2a80bcf4dcbd8f407f3492cb86b4901141ade321c9b7147c20ec43306cf6d8d72b2fb3c962a2e1b547d18e239f4b9c43d65fb58a181e09a0e43ecef88bf95cc7858a6ddc8c0e8c8a8d3b3fb407e37d2a17cc05832d064a4779f1d3f346b74ff69f0a5e88cc5b7a56d6113aa55ac246f96bae29a6cbd62131b56973b7bae3bf81fa0ccafbde42e1996212a081d6d47b6807ed3a5d9186d4afe6d31535b3a71dd6fc41cb83f1906ef84eb21afbc487d95f16dcbf9301f03dc10cd19ab81ad9be7bd9a68b4a4e5d70d8d7d77789302ac51db2bf43f53ca3647b4bf3064c51ec0f5f5dcd40dfdd28bc2d94d132cc829d13349c9e6a0571e3848b2b0228222491c2ac0d7b31e56c942f5ed68bea2724deac0271b0c2dd8677f707d4b0636408e0eb619c5e89def5ccec3304378e622ca32ea91fbbdeb97849da203b157a8951e1ea4bda398ff50195f042fa29a464c76126be7191fe2365e7bef6f5adc696f30c5ab448edc05019b47533efd2d1a8e9a98fe2d2f4f71da215cb33d6b5527132174d202ce7f46eed2682782c472200bc296330a43d6164f4a4c0e8841e907f3bae7b61a9f00deeda2385a7ee777a3bf1f67c65f55c81ccbec3e582f22f2897432d2dbd6e071d5bd68678bb4562d645c79950edd76dc7ce9a26712c3b788875f6b7daf8dee73f79737f314c2623a24acbdbb193958ffe8c3f834c659dad64901b437b736e823824d066221f9f296c4b07c961e8431238518c86e4a20ad19a8e14bd1b772234e0568b6c690bd31935380b6cc9f50b5ef9eed3af09fb477359a3f226e6087793d5e49ba0343cc5e6b8e41534c1a6015eeda31e3871306aa5075471542bd9b324417e10f09789e663bae8f6464847544fb56fde9f8810ece2aa1af6df348888352d3d2dcfc0c19efe4445b65721baa97730f665fe1e3dfdd9cae5c7281e553868b48c43cc863540a8eec6422cb36620147aa6a07e8df4865b62bf0336f71d99058aa51aa302fb2e3f26aa795233cce1adc34ea64029ba611fb03070bf8f5c3a619cf28f282efe9deed6ef22142bd61d9e15c360e4df2b90b3e25e590b9ba564e2944a4966e7e334c64c71ec10163ed9c9e45ebe08a3940066b96bb75cab2c3020cade315faa88964168ae278fe6ffece6898f92a4e4820a84fc04da65026092b58d522dda43c703d746f61f198300635f47dd5640f3d07c15de9c05c05bf87e463e11867141e6949cc905cd84de3175e64b8918fb9a60297b654e8828a4e5dc978c3208b52a14f34a234086da23ae5427fb012be53d3d5a260e45755659458c9624ad84813ef999b24c3c05a4f1ac88e0580b437f4f001f7df7c344cc226f07dd43cb0e8832b6a330c0d5b89160d968c8795b246065516f958c9faad7f64532ef0c20c72d393ca7a0a63afd936835c53836e3c4949708cca9bd452f24d2df384ad2fba0636872482b2c72ca73a8272d5dca3081bb49022b312925c717be76cd4b20ba54d6fde0ba3a34ec9f520e42634a59f83ece07341c16e490bd7cb0ee488705fce61b00ba28282f14fe49dada049e96d3ea7c5ee08bb984c8896d16a83aee3aeb7255296f21b01bc43a2dd4eb06ba5e208fc5c2b343b691b96aba210c06ce91439f09ad60ecdbb596d885999b6758b9ecdbf8f96e966fc3af177a1efd6fd9197f55050c0a93ae7f5a4a1c38e855b462930a7282f7008aeb9d694f6e4134dc359085fda9ca36c205db9fd3aebe8bbbd5bec90cdb3b005c809d8af3aa4c1024a2afaf5bddab8f94a50ae23b4b5bd00fb9edb99bcf1fb0f3deeb6cf16ee2cb310f4b679d9470be66b7b4fa11a845eb2acde4687d1e0b19128fdc2d8815c222041cf6282cc4f7e2dfeb3a3aa13890fe4c19e223788914aa52082578214a027dcd12ac9558d59bce8bb718ba3592a6df05eabe9e83256bcfe2a00c114f513ffa81d1064684b0c9f8d488f913d518c08a9634f09e6a0c8776bd68e7868808832a1300ed1db4ab2719cdc4c6e4f8e2bc55702d411c351c29d2643738ee67ed12ce5da1d099d57590eabf96ecea7ed375516973bc9234af21d3c0c197d0b45a662133912d18caafcb44a09a5a3cfff99748e07dd590c5fce43d50631be3ab47936ee1c4e43f171f2b865fab372a60d956cc4025d6c93bb8afc259439ed9cf38f7a7c95fa2d7f7e3afb63e43b904d6f2cd12090ba11dd3ab90d08eee8d49b8fee235238d8d3275a8ff44962c4d00eb1cd41d2dc54ab0a41d7d86d60c93152cfbef5c0ca3f803831d0f1c14100c64a9a260ed6fe43e2dd41788795cab5e373e1ade5f354f858ec509d2b6e59736cb4d25f37749703ce7f6664f47ba82c21f2386b55aa9b427218d1195ca79f8072e7f0dee8d09f0cf7b868d14061a2cfaeea8d67791bb916f7e8d2a87b05c112730a4b0a9c064ab8134c6cafebabf20156ca9840a38e7e53975f061c76e8335c021ef521f7554e8eadb7bc726ff20a4c4297221642e3a7c4923b854f6888a9985fe6e3f1ca48296385683c5b9372c609068569459c9d9ece3d452826ef245008c09814804fc097aa40a7e0db1dca621041bd08207ca708c3c03537af66d52f4608fbf49c0a56e5d87c734e39a451c7c975a07d5a65aaf63005548b6b82b9645db2d6e4133b46cec7067eb8bac33f2dcee9e22479ed878b866b68fc75e51439457c42aec219b0401884a6f8db72bcd0a662f4e275c520f663565a10610135f5f4924e9d54a0a03d2ffde49039c684b95741e0f7b35c173c8f915aff228137912fba39a768cd4575b788bff724102b929155b91d74001393cbe84af7d46552fb7a9c52b92d86500fd41e4d4cf7465372c8bad7d15db2043fc9b7ca2df98cbaa90d1df75b504a7b82a3705423a17d22acc5c8de3444edef7c41e47995091bbf47fa343924752e6e3b51e210f1248a5960a79c3590933410efcd04a52001a73ea87c9a461d9fb476859a4d64a28c651056b2c93ce99e7f422751d21738ad857212e2baea08158efd8f47ce8b74460d6c928136aba46bc3674d853601026ad5fdfb2d485780be8da5b0d82c98714b6cde9d72a2a747fe6eb29389c40fa75c127812ad3afd5a15622fb55022f8dd0bf5fdfb79adbf08ae2de79131d476b7216818d133fecb35f3bb4c5eab12efed4e125daf8f0ac0a48e6cec99c4225ae4d913c5730186a081236616611d094d3b7fea045756a779eeade5c2c38cf99e5555de212e3506614343492f7f178072b698d77c124eb990fa12f80143ea745a46ed73e8b667d6a9e072e3d5c99a821918b3615c7932c85874236e8590a7814a3b9d8f6fb2c018c5ed045f9c37885b5beab2e5b8cbb05c4af5965bbd6e21ffd0ee71dde62559804070273904a0699d07634d6f373743836c68a5c0d27fb5c9e87ee55f6408aac5ea7aecf5dd543218acee9ca3183041a7993b42da88179c1a657f3a43bb3ff16241b519e8aeee937e80d4b00f892ea09bdeb76f908cb0d81e3984e42e8dcc0df59bde0448e5e5bba48437c1cca8aa4cd69bfc138a9ae8ff0b3c352ed1a489dd720555deb55f05ad0bc8a62a5cde8a82746aca9da02342d18aafaa63fde1c98e7ac68a3f832adaa9ebc594f70aeafaac5157d6d9584ce11b5b130cc2dd872dbfff93d0977f91bebfab4ed7f92c13c8ea7b2bb6425a6e7a501c819b76864eb305b27e004786d71a2e9b0b85a64b2a2326c55e60a586adefaeb15aa6d9357b542755b45cb27431f53206ce52c11f46ee6f22641001d83e28b801e4bad813e7e83c6bbe1a6ab456384f19723c140319846d7353b6e4ca01ffb7e5aa88ce57bfb4af38781b2d388b03864df8bef400bff1517482428067bd2f285bf43ac8593f54788b404370c757647705a15ba1e5d940cdae74c7623905d6b5d3cb356ac38badeff3e899a34deb7dce17f9cfc173613dcc9b62b1cdb0672d64a954dd90370d22c6d65e89c77c72b462014370f9bd57b49938dd17e6c4464aea2d0e63124ab89c6ffe10468ce7b23c828bc51a3ba7cc28d1457fd50bddec21b738340b0b5e6b9c8ab8416d01f89e36b76a667160d9a0039dfd885d35ad84264c9525aa531ae66dcef1822f703e3e909141e29f26325a0830c7b4972be562788ac5e50af9dfb99749cb544e0b21c3ae1cb1cfb44254cb8b162973bc17279c94215d5f4479d86f94f8910b633d6797d8a16adeeff1b126d6707c99d073ce089ddf3c475fc2a328917169d7c614d649c541a659155f523e44858fac6a804a31bd1252950804e844a430f64e0a203890bab444fd84425209496c5fa43d5f5452064482029c6c6c018f069d30577d018ba006fb44e4a0635422efbca3586892c0e01d0b35bed3abf1d02d9e32d02c907e9e4f9dbed8e5bf60a28c955dbd51dafad029bbfb829da53a655c8c3673ded35b7901c98c56a904b8bc557acbc264f38771909f90b2a20f79d8f24e37e41fa898068686235cae85ba9fc32e243e234fc3995bfa3d27ff8520bb491c0f356193557716b353a0f65e5b46acbf4e4a14b7f341b9dcd6122f9aba0e6aea55d3db4def82787882021ed08665181b35084f519f86b4e720e159d04c9c9915281e135c3f2ac4a1a790a67f591b01779214bf9b7e6f9f2c0b6ed88c1c907eda0e9cf552c6448692ed9829c2dafa593b32e2f7f20f94c41ca6c8098ab43537adcb9637d4d2e3afbd12931e875882aabe67a1c034211b575c5725fbbe98e4ae1aaec5aa44f1a9bcdbae868366c43968525459198fe89d368482d8d6154c0314849580abc34bfed219f171d08173991342b2b9dd3ce1e298e3dd5c87f634ea72ac6ac5253062cc4418b5c03af73adf7319068415775135d19ca4dfaafcc4a1c5c81382f689458b144d2d5c857a4fe9a012ce69b6398cbb8979b4c177f6f4478bb92e09f033f032c1b817d99e0968ef9f95b8a3b600ff4850c4830c8f226cdb4ac9b8192a138a12d32453786e4be7eb4abe343063e6a6a64454aea7632ec613dc872b3858fa4b2d29b1de3b111d8c1f1121540970999c73821623ba927afb9abd090c65daf437e1760de8977cda703e043f7016a128c2b17c2fb5ae246408ab280827dbf5525565507bc02ca56089384d007cb9dc4e649c9a4f4870137dea2611fe7dc54f09e2d0e2e83b67ec873c64dfd44f7bd25bceb52d08662389cedba8f174db93c24b7a6721170eb804d6953da084a6454c61780a8c4cc9a0ec816d26c19f0cfd5edf20086e037fb3905d490114c107aa59a08a3e09642f8f8197b7a5f121a6c61a3f3d1a3aa7e1fb7dc2974485f021eb0064da66515b41b77e0b4503d6c6351629f55f7be94859f4620c6aef4d34e2730255574883f33b4de348e09fd3089be315e1e775506b75455c5acd7517256aceb4a9650d1a6990f713b44512526d3cfdb064df0b0ce8788ddb2a433a265c67a6bf5a5fac5a5ee633008cc4271d044ca40e994420cb1412dff0b2c65b479dd20679a6ea5268e8a0d33b48530ad1b822111b4f312a4322ae2e4b7b00c2b8c4f1094fa7dc55798f01141d6eed89f88089cdb288315db50f1477f64b48c6fa1819c38e03e52e5eb563ad94a729dcdb8916a4794fb78dfa9c28d182a0ea12e5a560bfd34be1c3c413f13c52106e604b814f23f18ad3826a0109fb14c1adce0345831d39700d6f4f9ef22e8ceb46855c3609b0cc5c34a5fc546a97b74c5f3bd84ebede1e798de74ad54d963625cc00fb45e7652481dceacbd7280c30786067bd7b7228a0cd0c3427087aad96ab11684e8b59865373102a628605471a476023c9e79ca1096d1ef01f9fbc1519c55e19286e4909ec13dc20318f434c047a6ed0887a1a973835ff0ac7b757ccadbf24febc63a53cf5add643da960a5ad78b12623637959940ca7185a5b314e5ca1a9e7d777cd5002f682e05d3fc21e1624774086d5451b9420ad8b3d042e38b90079d78565be5185a68c4b113da0abdf7a758c35cc636ee7dddd53e078d77b8cc54701536b979491600bab02832332def1bcd73b34a441b525ae77aae318aa2786532684dc5ee13f7fc52a0cade15b086cb861edbf21f0907b2e73f50fdd3509799bb117522d3a5cc643cff9d5b07ae50f188441bee420d8a2efc3bb013f582b22439a5d0464919944fd8816edd694d827541a5c8eaa3aa7bbadc27391b82d8f442b5487f7100a186818d67031ea3103db375899b1eba23b3c0f6d41fee2eb18cc795a8c2723a26145beb918792112cdc5f5dcb93e11f748f18cc525a3459f474c7744bd5ea5b1a251ca33f199bbc87ccef9c0a3a43e2b82dedd3102ab17f0dec9d281fe0969c5f175eb90dbeaf92e061b667cf5c3819e1e3d5a91eef7b6a4d5466fdf2091eed321ceb78bea8e395573066d8df8b650215771b9d3f2e4fcc354a4fda1bf4d7fe5901903be8bc7696fe436a72e2e8cdc1205e754af016edf187a8f2cd2a2da3b335ddb47bd83949000d9743dc04ad0621d42471455f2322331e744ce7246dcca279a5f9f30bfc72d4e7de8a02d24930240280457b0cf212f465b7ae951c7d7ba1a54bbd28aa579375d3f3161a89c3df9f1740356e578b1b364aba992121962e36f2b96d4178dc1142d1d4cc5174e9b11030f6fef82541da218bdc49b6b115f967ed929fb019f2df5f51ea9c0a59fc6beb7ea99c30d08093d31f49ea9856bdb17eb1a73fb953ce362203eb7d3cde1b8d1a55f81233dff4a54ca3f60bb856793a855571004363099abf71a092bf3ea3fbf7f5b7241379a3b1347c603b0489995f60fd279c973f6b9f9d8cace18f2b7991591bef90fdf5283c21e65ad024fabac0de9a61af0fb69f268e8d69b5b5e0ae4001907a8715eb5c7f5c2d8d95830bc02ac5bbf059791c0fd28d1d2e2f6ceae94de1767058dc86d82e7bad218af6ba59fb1dd951974c274a43de9236d7f5c60a4394104c85b024e99140ec6a5baaede28bfaa256336b4274ab905c6e8bee5e92c55e8dc917c966015c6315f07c1d8c822d5dd036180a5dd2db3f6508ed8ee32a6a0efb0a4d1b8c59f26981f70b811ed26818c7004fe0ccf44e758c8c28ef019448be469422514de3fe4603f0cbb8dcd405029c7a63ae74a886e4ed392f374f742d4cdaab4d326160d47d559b8ec21f725d1cb9827bbec15599ab7191ffd09b514b246b7b50404b68ae576ccf2fb6198ff0ea591a7f15355e43a11af4c61625ea302a805b39d7fd8fcd97ca915b53c989655b2ca666bce5d2fc384096bc3a55d4e0d9d79607e829a708e888f7960bd6ee06c2e4e11948c2d35afc04b88cd50ce4c06ebbd07bf54999018bf9b2fa092d1e9436b4c1f0947123b27e5137858ab55b1a9f8913f3667d1c588d362065cdeb656cb0dfc1b1fea4b7e2eefa2e38ef09126c9a39926a40db466bedf2df53dd0201e00c914bb4cefe797353039141de0269ab7719d9d477b184ff63bb7634274af6fc5169f78fc65d1aba9b8216107bbb67bdaa3bcda654722add7f2b32582e798f8d074c838ae7b8c34017e30c87f5764d82bd020bd72d544a4fb2170061c19ce40d10fe8d11d5892a4db3331f055a757e6b3a42ea973efdf1e1ea6436755027ee967a0499b762cba390a1923da2978706703f28e3fb01456f3d5352c18644f16ec55e38a3907a13f2f63ca41b75383a855119e5d22fd60bdf1809d7e30f4b62beb9cad5d2717d97d700fa14480cbb8d6053ed86b2b618c5b3f680a00518dfc4ad6236c9a4128c8187c71bfab5c0c7568b51b2aac54d62b9fd604dba152c7c2b27606c3f8091367de8d04b703d3c3a2800cbb8b3b1b0cc50561fe09059ab97233a827577a435192fe00e8f1917008723551ac688068fe5c75081e33c62a23786cfed5a5c10b1e9b763cf4b7f384e8a9f382882aaef4263e8d4ca32106eddab2f7c87f7f15ef114577e0f1e0e3d5aea118158415f930e6b0f3135a77016c65f3dc810d64d161a9bef1611b7308fa516d96747743f8bf9a60decb6dd4e9f7ad9df420c25084dad62257f963e49288ee0dd309c854f73cc34d4a53edf54d654c49047b23a59c6f13f65cedb3902a226b61bff68b3b6e64a6f8c5330da8e636e0b819c0e76fd426132dbb12436a4cd280afedaed90e772f3c5c46c76cdb6fe6e7b770a521270dd6eb1510e59713fedbaf874434bd78f297bdcc42cb4c2f4da9fa018003cbcdddfab79b432e77cb8972a130a8b4c689d23017dd1753f7dad7c48de8d85e3933f5c9d718897119891c38d4a3a93e7454abb7808c8e4fc4fa230ef4925d0339e92d1ada7b5cc5a482df4a054fd1603548234a7443bc9a2d7b664967c3b5b84b6d9825e27f0fe8f3626ac41985f54807237a95cb2a9af87b01a7462cf43556b902a33b335cd17153b08780528d56871402c5a3107b1f40f1d62548b38b53346b7434ac301d5218b2a5b1a02078a1dfd4d75a27499398d1584dae3a7627d2e53de5c3b6bbb8222ad23a904863d68982a4646b027e21f6a8d5574398bd6f30a6c913027faee3b880a4f5c038a0eb7d3af133f96273c64c408a4001870a93384474678001a88789795ef91a3f214823ddfe8b833f64f61344e9ef3c8923fa1d2ea35927e1030b0a70921842374fe8cfbe1379c0d23c06024954fd4b4b77c98c8ef93beb96c6b165aa1669d32a0897eb705a9031f9636fc9ed8e98610a24ea878b8349198945285005435485833e707b3a91bf6907506f119aa4da0503c5dc7baee6e855ba98c7cc33abae0e23dae57cb8654e1e90fcbaa1ca35697a25061d225ba2b626699b4802515fdf271f324a3af9dac3fceeab0339bfbbf00934912ab1c05f80cfbfae102cd39c978437c61b17d391788a0b0613b86b51d8f5079a32f8498224025e835077f57ff1f055af2846245427d4cb4fd97e6c526a9d7c417c0f6e051b2e1d3520a45b6865bf53b05dfacaddc4a39ab1ac06657ae2fa80ffd19003e2448de43cef866a44d59b0e211264338bca0bc480308fee2ff9950660a2813029a85836ebc758abecd548fc96c020eefd2ae1ef93435cd692b26b72e3ec803eefaa7b8a908bcfa74e939ba82f50a49a1c4e45ef0b6b610f37911f8d28d01f455cf17588d9db97c47780cefd4d32be7c9a4309d31fa2710d4d0bb3c847e8b43cbae682a2974c01ad8fc5563954ec75094bf3f4e55e28728bc425160f4e9621a3a41486dc4c641c08ba3bf170b715d486e355d5059277007297c7a8dda904aab666a411a92a8a88e7314819cda8089653c38ac789fa7e1dfa0bcae9a9aa3eacf03368ca0f59a47e94af0b09a564602734b3e768e48e6b05eaf7be03586a5fa03c73121085295397903994b3c0238fad942ffa17bca3a774abdddc278de187079b60e00a4c775409e3b61dbf5a59b02df8b77ed1fb2ed8041dbf88f9028e36c78b20037a5d2bf60b1d8f58638e3c743289260a5bfcae7946951cd640be6cb80612796f746cdd76977522c4126101d3f0bb0b1f94bcbc9728cab904397719205ed21ee1ac9409052ed54e3e46cf391009956f1884a89c7f0c2b4dce98a5419cb78067dd7a1822b46777dd07945d68d4d7d34698a1a3f7ca2c4998835212e4ad403fdae85a02c45e226b8318abcff5b791182b64c1c90b118d9c29d91dc147d5818b3681154d32d3b33ff8e56ac2192d4052527cf7e8566b489135c78286ae6ac87a295df5d6561a9eeb3038836b58f8a563643afa1680440925d5398883f10508741be320ac6c58d230f8eeaf63140d6c60ac900d24f5c6b5b60f6d813edb94c991f5676157320f3db6fd33e2a8ab87e92f7f7c7718fb507399a85adafe3942f8267216486910f6787ad1b455993c05fb075a0fb6f048d01a502d8b9da96b3752356a944339ceded31007ea022e0d4796471fe2661040587232758e46d6714f81fa53883bcf0ea5590a9ec9e7c4b94a6ec399aad3b81f60e8a2a07f924efc52701ac53eb8e25718c301e16a373b10cd997f7a2ecce6f270ec04dd4c27a2c5636b6b20889e4e6911108764a8e48c2739d83a4e8e66f95a9121899625efaba6cd348aba1fe5b60ec1d6bd2803cb5eac75efab6472a9bddfb6453bc98dadc6c246a1152484c31352cd7785baa371a8785cf59f64fb0e840acc2dd9de1a64d17903e5cc707fc986271dbdba632caf479829eeaa6708945d4003ced1017b4769ff7038f83f32d21b67a3ee778fa1a5d2ebd33776dd796da8466ee68d07f35ee4107b61f00bed982f94d8069451b9b042e78e5ac365fc4816c2c9923ed63c483c7d639aa16e7ad4fbcb8354f748bc3bb67a5bafe70cb48ac175ddd9f9c6d86d58e0911e9bb5f7e9d598012f3135733a0c8a9106358d429ad64603bbf6c57c5d0a3a391c591dda9168bd1feae8de23640a41f1d7d9cee48798e21d0fb4a8d7cd8d7652d991a246b6d57d338d7f965d7e4683f0ae48eccecf0a475245f9f33bad5ec4c688943553a0f94b496de195b5eea86adad1adc0afc65dda9f70e43d853a184df9eed774a322a97d8d1b82304263067b17a5d50928baa384fae2bc007929c22c05bb74e3c7435330aec68df4a40e9622462881a9fa160a6e9493aaf00fc665c2baf1eca494086ee05b59cc74e4cfd91dd0818fcea0f53dbb50b75965b402dbd1e82664a592af2089980799ac343ec0b70c36754b9f7c82d237008b46994e8be4c6a00b545bd1186e370dad3e398e61abf20f980dd4eedf53003f9d3307b30ea7105590a29d2fe55e02388339be7d0cb8a243fd572bb4197e5fc5f5b912a69f09b6a5294848bdd19a652da4fd5c638d9d7879c04bdd441cca7a25a80da135373b5febeaec2f36b2fa4a33d143679e4eac89f15e2cf2ef34550c590c40426a854a627bd9c5ffa2c85cd2e43423ae40c1764a6b07acfe6be5040cc3477250b9fa725f4382e57e0ee2babe440e36434ab19b0ec2f001cbcf821788c2a02e8b2a23b525a7a7f01cfced901640d87c3a48bac72169d92d2c178fbc4881c1d8e2a9f1f411bbb578950b6c5b34af6013cc16af496938044b983981a97ef8031371ae8f028eef7d649f4a0560e70153ff6ccbb72c807b1f39e473de24b6d27d7b6808376b7553223fdc63ed22eaaa595c26e9f3ecb30fc6c9e1586a14773bdeaf2da5c6003e783ec65dfc25bcf354afb64368e9c538d3708e5dc635e2b62ba7a9f62344331510b7652f60e04fa399fe5723935d44d6cb78be7ebe96b57e7dd384d61e2b3cbfcd739dd13ee46959a537091d60b373acef04a3889286789287b060ed76d189fee6708c5f8f1af9119ca241f6b934f0b9a78d487f72912d943ee74fdf7267f2670e6ecc8bee4c2ace3dc3d6f61e3de2e92d993450d10cd5e29ac7e91c0f47c4e6b142258e075356271a64b122348e072762ada3f11899d5b71c8c0680a6b61aa142de67025b57640e35c577d937953d1791e1d34ec1529e7ec01535b875f87417cf4194e36843f664d5c7f72aa31765900be30d760fdad5245d4696d35a6cc05ea853173e50fac202a4e2d903b3d876b34f6ba09ce6eda810b6e5e0d47a664072d09967c18f71f37917aeb9e47cd1c5d02f5da2c0618aeba171719a03ceac7f94aeac2f10363f09a5cb8a3240703d1b6afe0d3ea0d00a72bee9acff19cbac28be12012a37d55b79fba3705763b75d16aac8209bd164771411b3ec96c0e7bfaaf604074e71336e1b60d8bb53801ae258c2d9659d9780514b9319fb8eef09bae972ceed2bfe91f7ce41c861b3c186be4119306f94d9b0a183ab0e0a0c20dd5e217cdecac65113f8a7c320e177544e6eee8b3ff4eb76ca1196eec3b722bd0a16ebefe705ef777ff4e86ed751c6a7f80562f1419b9e7dd01f7f9c0f7b919407316d824964ee2c14663b3c3b0602565dae13059336dd9afcfd9042c4af74abf25b5ad9e4bd49795ef3e01371a5e84084494823b8f93191d14a1c2b9d059be8169866222ab532b233f7a0aaf1613517cada50f71057d6880e118bdca0d8f6265ba1f8582faf97b1d04d8d85e26b1b22f3a501ab930aca7129a05aa7e8f4ab2d68110d0f9684cdac3af5332c753213deaa98a7f079eefce267cb69f7c67634c74eada140b30b3ed83a0d2f8ccf65e73d3259942d1c3dd5de409608612869a198e21c51598cb5b07d674daceb0df4a58640716e2e139fcfedf43da2de3a64a4ce6e7a8f672f3590a1a2cda3c2c4edcb1a885b09343439a15c62b11b26b44f4ad05935722fb4c98cdae873c9be541c207437ffbe2b7a80227b064572552f878e39f838734fde73ba21d8466f8d62c83321d354a10c3a6dbc81ae53c57bf03dee816b7de38c4144b98983e71d9d05fec4c08c53622a70f80c9b268928b659aa6cfd95fe6fa451d021789a9630a71f7c2b1d20e73624d3e7892591d9cae0654052e5caa40aa689c66b111f6e70ef4d98382a0e3123192eedaeb23de64a2f22e68081e533cb840c42db55de4a3e5646c9e0d7b3fb842f7a640dca6fee3abcbedb40f6ab311494961ee2e823189bf6d8aa91f46c333d9f384d3cd43ffbabfadefdf7a7e9a6f7baebf73a483ce68c775af34e846ae009318e83646edb920a31ecd4ff3bb0eaa9badfe6a1d26c66b86ee69e23c67abe4eef8638a6abac625605dda1229853cfc2c31fcc562179a6078db6a82a38e22c3cab143ecf1866d9fc41d5ce8cfbf1cef0eb67d989dc40836246e5e88331b479959983f4ec91d24061c0c88cb7f03c78a1b76e4f9303a2690f0308542bef979959e06f78a4152eca5f9899424b086320ad320025b893310c4c36aa0be34532d9f025a88b5e11e2b4b986b90c4e0511aa0e2c65d06de49d85bd1d7823cc819504f80b6327913e2b8b5aaa491829ec66d9b75ba5ddf5a6bb6ababc950d1046004fb04ffca53a79d8673d695468bb6cee9eed83d101e0cabce36add74ba5730ed7f04876e862fd07a2998c14a0bfe2c9d6d25bc8bb8873707e97197eaf78390a080744790bd61d5dece8360f156da94a3a61d225f68c92e2b0da4a59817bf7f81ddcd16f3a20d649f82cbd38e18637da7306f8968aca7de2c16072626fed7cfff047607001a7bdafcdb52cda29897aea74c59402564d11e9ea0edae44872ee60a8011867cc53fa38401594a3d38a32e060d84c0329b53e1d9a8190a9358f4863544efc945a1d737cd77f5c6e598605956b7c9211e4d8f880b2d8053511601d6289cef348e1f9727598a21a57f99e830d030a2db74ca7e0d1cfc621fc81a05087dedc0b7a3f4a302b63e5799e50d3d9de36534afd1d5e209d6756923916010f94fa44f079fd8f6e6f27645bb0abecf1eec911e1204f529db990528d435293524904cc5362a533d278ca267085ddd44ffcc2a0a023425dd41764b719cbe5b5c8989b40def1417caf775738ae660db10b4982064272a70aadeb92dc7720ca6dddf8625ab312058ced1922592bacd722d17566d4d8ef5212210a86c8c5910aaa06b43de1ea53aa011450c12e84bc58a1acf17b2a014a92eee2b8505288b880fcf8ddbfe7da413467a0a29635d3a6e4a9141bffafa63cdfb21d124df06b2aa82585ee1f178722d4de0931e88aeb9b0823ef4a4ad0bc04c97d02358404c8075ccb9bb71364352ac4a9223a55e009f548037d98f8c6f0d53715938b3fc607983a7990531605ff47322a511a7b7507eecf4889acbe8f2957dd5a2a53137b4ef3e920a2769834e23931f45f70321dc7a425b6b131a229a8c4d7c1087699c1814d751c7c806eb22fa120e07a3f7a59fdbf51c00494d1d9cc947b14ef3103aacfd51a0268469c76a628182e6b170dd8ce36f52b329f89543d85cf0d0c5b87ea24384f2242bcc35317d53e0a91c15d1c921657c05e1098611d2fda349760ac815b7c61d2da030e67aacd20358f54c255add543f22e5afee28bbeb969a661934590ecc1c3d8cd66633ed6207c7d8605a2c9d72bbf8fd6cb6652f37b51120e634c0a438938dfd68ddc941519e8545fea41fbcb2e65e77158f7bbce6c561a951b4ee6bbab3cdbb36ff2ff8e1048422aad5099f9617438ede1979361032887ff2ce2c2f28aa01f692116994dc05450f572ab435778731277000f48ae60288cb01609ca1ca60dbb48e35c1a85824934c9a7b8eede5408e3714b88fead02c511c162502bc4d0c8f33da4166c16acc1884336e123675460d171c33f20955c894bf05737a68e3081b5882f7441a2625daeef79ec96b244423a4f992628be30db48815a9dae2eecdab262f1f9c54df3603a419ed5fd8dd7e0353181c3035dfda84a06270e3db5c4e2a3ee695b2bf5391bb2008094dc4bf417547e0785c17ea56c1e7abbf5cafb40f9c428f8cb35370ab5092b38bd2b33cc88dbe85f7cfaff06771e4fe664cd89bda8f8a9e4695f4fbaa5b0bf148c6373dc77cebc0d8009c05031722303e7ff6e4f49660202ec20d6d6924d8b716364cc8ff60c837ad1086f484fcf64cf71f747bd0a72ab48b7c8ff61fc403adde3253fe6b6f8a726b20c9ab2b8efe03e6a22dcfe30f004b2cf5219f79fb881931be2dd5a5236b3bb3413e02548b28ad729b6e263c444c41d42d4162cf4e3c83e1c6985e84939a8c4c9f5995613fb353ea5f49acb808fb872f2f5d2382f451541b6b0eaa46057fae52c9d7ad15b2d2034ca8f82444098cd644d68c4d5003622b41cff80eaba989a54f1d9ee1be8515cd41caa27c85bd30875ef752e2e27d934f9f74d2d4eb94637968ef5a420a63676c83c942fe03f1dbd1b2aa608faa1a1093d9fde94e3e835ae1c40e29251a85e4ed40c2f5b7a2fcf62768650af7634c8153203024dd6d63c3d085c0a8ab720b66f022d1b9674dfc98e0ea5fdd854d48270b796c935102cc32ed0a389e79cb3fe3261537e741cfcb5209c5d4725161d2f4cb199737debea6b7497d5883567c00c967fa432b1fd511822a907ab5019e2d0289ce79d25561c95064a3e73bd54470bae829825cf1278dee01931314fb3ab93e573807ed7df3f655050ad51597e4d494aa55c08775be61c6c62ac7336454bad1bc8b9dcef3f6b8a88107f8c87dd0ac3c0d5372513f5887335905743d39cd66f20abde60bc0b96623dfec7c1d6c1962fa06495d9723946b1318609cbb7c87c1e952fe8f61beb352ab1f0b4b6cb14e970f48a730b69ff7be4afd9000572c6a83bf45168cb9948bebece7098e2b02e89b0e00141ca8e9e7517c3804c3f1d2233509100b5fb01138f8e50cde1414cb5d33fdaff786acd6f64854ff0d635bacff49aee8a62db2afdd05736e4ccd26ead9b99086bb046250c0de2a53b12a29e81b8f8241c33f737b506823c7259e9eb37ce7c50783ec24d858cf5503b8b044c962af1be529c79f2e1de78d64a728d02ec4e9360d7d69d5bbdd9a13e2a865e9cb6f9bf2c09a5bf98e7345747df37c335dea394143d2fec9091d3d3d237fdabbb4d21429ac60a0b83fa9db382dda7f0d444ecd5ac1009aec380b5a7b6264b9c4ad50b67575dac4a28e96686004f2371267be1cac849ac5b900cc51370d5d6aa11aab3d73dc102d91f329a5e94a60cca5740a9e02531d35e7231558b28fc6455d11b6b3e88dd9b8a59160dd646746125cdae8f19ccb41a47d33083e93073e67ab23d4a04f5c2f76d4b02340183720f52439083195a2964f8b661b7fd05146c1c6f783896e3b5cbf64a24aca407f3791dcf76103bf47343720029dbe239d897bb2d66d766a8ab1710ce4a1ca111d11e17ab3f29168f315d41338845bbe3ed30f5c75a0406c1d3755155a9860511bb05e8b5410dbd6836f0429687d10ae29b2171d0c2b8be71c06322ddee6cad1b6b6b3593a77a724184499a59a00198b83e1ea944ae574f00753d64191bb00d69db13db487946f03d97a9aee4b3ec6e105a0c771062349ee4d32acb30cadac76d5c68b00b26e956528f2d474a188a03489aa88744fd630f0c889b512bc993046919a97480e96ba2dd6525bfd567f95c5588e14d5c2c540393d7e11c9438e07e00141700610229138e94f92980321ba75df15de13b17d10e4d5947122e217d488590ba802142d1069ba847f060bfd6de1bcf10cce23a22515b86c6ca7f037aae88cecb0e252c5d76c113b07eb5a463ca95028861a0890bc3bd228cb77efd30b68fc8b134492b42b5a16b0b292a3ba2247d457844ba775fcefb05bdd7771fb79f40bb60f48de308a953c093a5b3986c06e0f0ca3785e0060295a59529e69007c7a688d815deb50230adfc90c3ed1df4a9f65e27c05a7272ba58f5a9165cfdf07119fcc228e0f5a32eda758fc690ef6a65b7b887b584bfbf54e7fb559202c7a6fc628c82cba006ea866cf288c7d4990c4ad44b8242bbf80f3d13658f4f1f8397349b61ae4dd616dc24d0fb3fd0df0e267c2409806439d14807a0ac4ebfb84803c3cd0d92b0ba2495fa4f8489ce8057625be66fd40cc99539c98f7849193aab82767fd2b4badcdf70d57dd86b0f670d89c24a97da7eaf510b6a73a95592b287824eb7cf21563f0f8630f767e80c3b04c202ee36580fee19fa80abc78dd28017a134093722db8b5aa122173ed4d1eb0765605bda2e82347487c78e065a20c52862cab7d059dff69c5f01ee140330163df3fbc36f989f9dfb39868fa608cd0dcf17b9e3bbe44b4bb31b790bfdee40d8f62d1c6a9e8674ab6d0bf11c151d4dc4808ced08fc03094f0edf5f73123f877967921b0529148db8f49180049836fed2ff509ab28b58de46010ecd1603680f0a687626ff97a5ffc01f63081d6063f69385b5c8b40c0c68c1efd500410a4292106afc743ae5b054936ccab21c7946f899678d57c8ea324d84228c2ca0b24b7fbf3354bc8d5697571ce0c47744492a2e906aaefa9bd2ac2084e205dd58e25d5427ae63f65c905c2b7c3c6abe82e8380334204dbdb66c32722f645b8d0e054d27abcd5773280234feeb8c7fd907c568dedd247c2bed67d547dd6fc58faa6486f50f4da612bbd9cd68c4d0b24ce2df10a2eecd4183753131eb191859768ecef0c32a5f9e26c8e85b068c9a922bfa9e216304d37c2c49984d16450e0d2584440f91edaa6ae7e6e7abb661f436758f067a9f0f43ca9b82c4edb5583aef9da02a6d0f520c3655db6916cfd8a3d8de73cb6618ae56ffdc2e16de5e4b3c86881d48934b73db6b47f144e2d42659034479b1b398fa2ad90ecf6bdf22c923de9e304070793b4d32ba7f4f05535aeb3a0af4fe3c90442323b331a5416dcbea2edc590ea359fbaa8982e73e28485e86401edc51b72560afee7c4d79f87d7e6e1703d360707fc01f17f8a23bc24e98d19d9f37fe1d19ddc2754123e878ba26547402e9367359d40ef916bc289f36a5b63bdf336a63f4e23f211a3cd0afa6763ce09237066874ccc77ddcdde214e406275aec9eecc7c85ecd666d54ff08a508af33c958cb1086f0b63ad85815eab4617d34a71f486d835602504ab82ba172b559755e6a200fe09e25d55b12d49ab4db4f4f5d134688b22e755a7f75d6316f4edcd88f87dcb8a6bcc9eaddd31d9508289271d64c956743aff3f6666f80b7774d44f5d6b35f10c31f47f6a420450c0ba0f235c80f6b5078dc5ea1abce0cb0144cf60f5634e6c24cdea5f4140b581448b6c70950995fbb5d96499dec3c12dd1260f26c81e98ce7a6dcc40398b9d1efc62c46908768c6ce60b04be82c2510f5411ac9898bcc04f469e842ab79b2abfc0aa369e9d993f37457a2adaedfcd84f52a127b854b038b174e6fabd668ec33cd8540aff6c73381732d54b5bcb6ceb2ef10336390e0747247032da9db6b275f196bf65f80d0d1eb6d06713bbab48bcef4cf78011abaca99c0df1f237ddf34a5e09a75fe1563e09425e2e4291d50bfcf6b85dd25fdd9d0174f9e654440e991296c8c395ac6bdf03d54827a437cdf8e61b7995adb6f1d5cacfe2faeaa368be7d37036b4d40fd91900ad7ea668fc0e614417bb16e62111cf5be8ccfd95a17d877a6c900fae797fa3b6162824adedf38dd59cfa949e797cf8b8bc5369bd3ab017d2cbb95fd6637117c08582a0cbc17ffefb5307a512ac322d9888ba36bf4d8928241cf69e0f866146accac95aa59a7e06115f5db1c732e7198d5ee86186709000915a5c78030966bd95c6e53e079ebff20f65f7bdadae2348880900c1229433ec0c5ce1f22c7302a32cbe860549dbb89890f917ac4141fdcb2900eb0f840f1bc1d8e083e5d9dbd3b38a12338345581e53068a07be6a1bc605617b87986124952ced9c7d199b4eaccb366dd4338b70248db90936bada8a417ae357cf54bd41e70fdce12f05eb40b47bb8bb066a3e7b3bafe7aa82e1c32f14ec3876d9f5e0b54e66fc603929bafeaa0799547265e800859f28a0671ab0c8588b015dfc2a4149d09dc8ed197e74a58fbd597ce28b43d56d8a126e508db508dc28b8da17a6880368dd884c0d1276cb9fdfaa549ba4096d30b58c41ad1338387b3479b791627ffcd9c542a65ba49232d7f94ef54d18c3fc60c29d0187e228387598f15337b64bef3f3133e8bc367a01df3e65efd14c8373c245195380ac2cb2b8760b8278470c4b1bfb75fcd9e523f5a69d9d962b4695b5f659afe6d24dbb26a0b67b857083f7f0f718a0110eb879fff0c79a80e5f72c13b64e8e206a4b36259d14fa31cf01a80617e5deb4ef092503ee1a01ad90e7115ef89ba7a92c55196d0509b6c6c15918d738fc1326da169974f6b0da7b77da8ca462181b27d75157b757490457220a7c7e93d31862e1230c578f8f11538a54148ac72338db3c11c6e494345f7bbd3ba0a486f151bb72402f641e321251c08b82a2bccfbd4d8d93204752583dddc8fb36dea1a80fda6693d38b3489ac43440f55b8337d5b3d8412ea35480cab494dd2cc3a8bfd913492750a35ea78a25bae3221590a8d5a8e054e53c9e926120c63daed779ca354b86dbdd5d09ed5fcabdfce30c9a53329e8517715ffb89d3a89a331d37ce70673158cc04e5b75f43be68d78ddf9e63b8b35435bc3812844648c36b4a836601cbad9bd754cc0f875158a627e48f6f316538fb309532b7fbc1a3051b2bc7c9bad1889397415ebdf556be1c587513ad8b04aa66e5dccfb36bc57e03853f52e73bf1b4aeedafadf7756fe07ce66fcc8a14cd8af03069a0e5e6135045f0f8830b3cd3e2e5f23b91378af1b2a22c5b4340fac8db4456a1b165d76975caf3d4c263abeff92b6ee9dd9cc379e8321258ce4322bee5b7bee0ec05357568db17dbf4df684a239ad0b678c40147e73faf5ddf2440e92142682ba82b54297ff48f1a8839dc62cd524a62e932e39d0eb2cc7db4254f210a70f80640df0aabcea7beedc496baa5f87d2a3be20124f456a1262990e93d1e850e0568ed0354f4128424504d600334278146ffc052846424e6ebb233bdb1c561709b182ec7a67e371eaefc4a09c650d7785c588455d3e5c6f2f0cf70799278a685419eda16fa0adc03883ecb9d71f53d3a353038b29fb48fd6c4c804b09e8be4de9f0749e18fc80065694ec1662cf44de97f2fe4fa9fd0cc32b04279c3b1a3bbb18924c98b524a55a7c5f4053bb65713d07dbcf74182e8fa8a7cb1291209a58deb47997b5fb5f281f6028515af21904215cab456e90c004aceac3e2a1757b8a8963d9a271a80e1856533c3844253679cc8f495dda6addbc98d8d8f0b1903b797e6f8d6736902e535e5d7084de8b98a98a265d60f091a0ff8f0415c654877ded29c9eeb95b9aa26abb6c7a21076ac8db903f358e94ce38b0adbe7f61714fa8c028340bcf92b80126181f30a082d88ac0a07c42fa4435ee0dee6fc6917dc0a0ad0db573c024d1ab868d72e876b0e428624964c952ef79fef55f85355821db4fe1e1136dacd26825abeef7971ec42509da3370ea5ff31971d5590e03de35096ccad299602a55047c8ab3485d41563196c5b4d3880ab605c73eb5eb8165ff5ee5473820e93e46d42cc71f700982a32ecf64ff1a565e58ae1a4649dfab17096718e6ff5df6dc059e9c65c4538072336a6ee1ab29d9138d017da1971335e8a71a433f6d13781bea4c80279d2656c0fae2b011198cfa13b0989e228fe2a8c29061d85155d69b51814235b03427276ee228c79a9ff8a3005e3260a942392a9b62ac89181456c40e9665a906e6ea42ea99d4a632c67f6c7958b10662b01541fa53b2e865f3641515d2a685d408db977496d8a610f8977abfbdd27d941c2add24edb67d0d86a7304cdb9637b75f1a054d228c600ff5466a4df03cf5a2b53c367050e8e7179be9e76e8946b9c3917d146c43a78af0756011af07245aa3d74c84752f9b0d08024c532b077221ee8e695d66e572a66042e65d47a505dca98578c8adb02f7d1c2a94c83f459d58f5ed936a9274805dc4ec5d29788edb8b6818d3108f0b73f733a623b08c15e176e8a40cc179e8371f04a55418fc081e5a9e9d2dec90b69cfb0ede5be668284e337c7a6cbc3209698fa366c5c413e3bc0b199c31409c729abef337ee7073b9b1e529d3ae0418054371e9da6979973be3c56b36e12c85374fe238865cfcb55e5f30ba80ef00d2bfc2c79022c8fcc31cb137c6a878f9969921d604ae98899e9d519c75d95171073f12adf00a2ae17d0940407ba4cc0cee2bc82ef564a87d5b0701df35e417cb9a113ced67f0af049aa5953c3aaa3bd40a5a8d56c8280c0b12d4f0a3ffaafae3503637c889eda78e7faebe83bb2b7c353ac04ad8f36c3d4e587c5ec1e0d63c2484b0aab8b297ccddaa1987d96be1209facf100166d11a7d17203d6950cf1cb3bef2ef2d4039120464f7f828f3f7bb99bf82d170ffc320f5f5bda400fc6a7f300e446033bc5f7ebbd4217d853f379fe1b197a3e1b3e02166f4d54394fd3a014b1ef6f3eeaed1cf8a538051b192df38f161a1afda14768b792c609e0b612c2826995414413f65cd5c6f827e922e8b8d5cdf5016dc62db320a212aac3d02a4c3cbd86b6a4381d27be74b4b718502e89886aa485784f20d6eb07a878886e2ced02a9f34d42016b8114d55eb0ce2efe413d6f0336ad4294fa6683acfcdb79520688fd7a2db9fcb9f3e430a24b3ef359467b858b3ac4aae79ec836c62184c2d666d2b1dc3ccc21db6dfcf566689f87e5872e7938524312c563545c8c7c187124f3dd1d4bbcccb0cb654d32efe785d4afa96f5a6ff9879ad1f93bea579049e46edab020ab9e30a9e8e9be68f76e2bc02c51b24328eb2a6d0a3bcce9e4625b0a9bab52b203b50fceeb063d898cf3184f400447443eda016f1874631edd5311134d726608a4523e091b7b8b7eedb22d9826274cf4700aef3f177196bfc1f92e1042be2439c77b4bbc1dee8e5ca28a69448a9014a1a9fd2d5d14b3103bd7cee397fa9d4e34f097f3491a49d50a5fe66e00e92942740839994ff9a88db1c00b8e28102f61d2e0a37e228424a33e8cb64024d34a8de220cfd2c51ba0091c2a227dc84714a60f0f9e4a0fc04cc852542216c5a756e33c914e18e3a297556ac19ad2d796e633de97daa53ed0d66ebb8153f8cd2fd01b197f9c8f3bf89805c694edf192fd134eb942f37820971df1bf096eddbe609563e7637891ef1ffd8c1f557afbaadc7de1cf4545647ce41e51444591b072431c4ec6cf094c2716c365ed2498a81a44f4f10314b15927dfea8c012dc089549f11800b76680a4dd946003ade35ac309a4c420a7517cb1399d5f8cfd91ce8e8d92dcd680b66e6dde5902a4f86df016007d489413689c72c2d4088f5535aadd953295be45b2edf2282593b14f9e77cdd4af04c2d7473b1d3b02ddf76169695ba6320271a1e0d33a00f50c024622c7f6010ece88e03e0e238af667af9d72582dd973e84bc5477593c5611cde8d79285b41c7096313bdb1431520acdae2c1368a2fa5fc7e2012f1d23d355c2bbd319471b77a22844af1566f668bd54b52b4500bd8887a037a843b747bd46dc97689bb32b00fdc518add482328b30461954db7edd1b158a3a2d97caa11059a1bf397ff81b971bd24e8ad96067edffbfa3093d7e9f34639eb5551f3d6e9bc1743d8d6f98a66c9311a14a86f761171f931200ce45d62c34341ff4f677a24b563309b3441b799c2d66b755ed84c571ac1a1747a8e2d460ae239814c142b6ef7d0f1328e11b620b956b5c5996372b9305d001ff4bbf6197fbe40f62d19396234191ad09cd27dcfa0a1410ece3a7355b4e59a6ec71da467360f0a80b9a47fb212dda2a3b2823822511289a69f3a48f6b913207d55a2735a07333f283287b4177c55d1a309be5287b23b94b4f30597ae7a843797dfc04d9d32f3826138f772116631bcdc1f0f252214c0be07a269d9f92e09071221d12e2f4df8e846d6265f78dcf95a07a6a66b2e054cb1f401ad7abdf81bc410532741465850b06d00a282c81561daac2a7945894d2e9ddb80ec7e84dab9c9444ec9a48aeb0bee07eecfb87b305762aefe45e613a62b2e1b5cd2125b945bf346aedb4f1dcb01ff20a70b9d55d445464330a0365ca78ef64c280c25e0f2dfd1f90e9b3dfb8255db412b2793cf91a914d66ee574d8c5481275f2ffc0bd20907ed232e40cf572f650f3b9b20df3c1da05cc511eb1cafc01f3460520d59540608d83bee506c9d49c5dae91f91cd4bf6af4e7ba7ca1913e0e3d22f3fed6f9fba77096a4bfcd09b47f26f1ff64785634666c682e0a2113af42955a70d68095e9567d8d65a7af37ef9d705ad91428222b88276c01a82e425c044cceb2e4d950d3109d1d1f0497bfa5308782de55e93648329c06aa7c4d0216142a4371d0ca5e10e08afc4eda47d343c37b63dd056e5202e3d397c0d212e66a5f1d50406d8c0eb047a8727d7aa0a6f5c24f27e3be894a262862960318f1e3b8ba8a44433f13932945e0108d3ff43439f5743501b415c76d031acc351ca63299f8987ed37e74d7b5365d9057d7fc72a5f8baaaf0b107b854887b09cf2a1c25a684211017a66506fdcacdf4067505129a0c93cdf33143f0cc6615644217bf6c9e21138174877b948dfba3fbef1ab9e99d5a1fdd4493b98040f186aedfef02e1be02e6ee091b958ce8cb0165eaf629331622a5c9705475faced7e17483e220dfa71cf2ae6b04bcf9ba76ad7f2fd8a07d23a8dac6a99ba8bfc929b403f86c64991af57d8c68d8c820645189038691069634454286100704555d647db9828d0007fe4409c9c35e1cb0fa283519dbd3bed45025b60a8e83c487025fca91d8e3e3d828d9a182ff331ebf1bf5a7244fe1edbbe172ea0af4ffa4445a91d168896e42b9f108de91866970c31b6d4d496e00d6f321c933781981aab303bddd364c6ee14978f6dfb448cb4882843516417bbcb6abb0d800d812d2bbdea9d3863af8d9e6af982d0f4e95a1d53ea25534bf23080f6077ca0a2579a5a810dd8615d6ed065d0981a13d10e0215410049c4f949dfc343736edaad8a42d443d0b0ef5b0a342564da2959dcae5d02014c8de1b16f15c0c4db6129e6bc1c1ae74efc756d3d74aa2eadf1236ba95ac256450dcbd78111bc9e38c0aa0c989f6c0d11169ce76ad9f1603eda75de1a7994705748b07e2fe33f707576c80983a3ab82d9235e63dcee29eace753bd8d2e766cb8966be84d9350bc082cb4f71db2e50c1912acf8766193de087a5cb51ae7897a423429b350e314fb57d0fdf3b7419d72c257df3587c919b6dec98ef14278a6c0eecdaebf830875e591f4aa98d9b15c99aff07071b1a98938496a230159b9bcb091b064d44276ac168268246ec19bd67d56453181b12e453ce92666d5ec0b18008d0f925f8188354108fa508834cfec3f84fb836fd40b3b6ca1d7915beb26c88ea44fc9c7de840d8d65cb149ac6bc1655923cb48c449a36e94c256ab6baad13070991588e4e61aba968630df9cf5783a7a0991a8593f0fc7f9fa01769feebb28e8dcdcc77b10a795b0650b956a94597120825018daaab3023cf6091bf7a9cb98ac96078f008731512a3caacf61e5f764d8a57acf0ee61661527361ead048be13be85ad95733129ab05e4d521a1da81f08107e2bfe8bd92533c9d8a756ecdf5b6b9619430b0fb5e4684d0260048bba35ef5daf623938731956b3eacf37ddcd8e268e3bc5351aa6b85367d7da0c0cf37fef0cac309182b6571fdb08775d887e75489865b6380c599551204a0a21e51e7cec8299a31180f4158b573c5cb6d3a8a3bd61f668c36f7337443d231cc60778b249ed011f3c5ac38142cb3e46fc604d40d33084180a7e4b128d0b5c89e25c439179318c088359b3777d2c4443159057c6c5043471bdde99710b04c10999538670a290935cbabc7a2129441b426c046d33421a35e9168b8d4b1b1c6ced3adaecf038539611e5a92bb4657cb937e775325d2e0b5953b448e7b9cbe586af04d7c1aa4442e8813ee399c5fa3a9f58ba7fdc6865bd27df63692294d041a158343aa41f4686de6c3e92630fd906b4c3b16cceb174e2ea7e58ebd7447d3a3d11dc5cff66820d6a0c7364092aa0be5bf0f8d6923bab94fe830956799e47c1c430c9bb6b6dfc9a649ec90baa78b2b359b288af9334259a3bd8c3437ed7c884fb94a0e5eb7ac86471d57f865326cb15618681198e001ac8822833ea83b2095fea41c8af99be51ad2c97308e88facd973845286a98a592e86f5b93f2a6bbcb72ccbe03c7c21009ed392c86cb1f97b056bad56aede49fe6489ad9dff61d489f59571c88fb64a6d7c2019ae3e980265cb43a44e8da2111a8258140c31e93c5d14503913a705a1c1e81edfa348e06d9c28b4dda02d98185868145cc43d72187082c388ace7e19ee9e2b30f4f18f25c9545830235b46ed5838ed0b2b8193b8058cc0bf5abe9b3733a735e2e61ad6a11e435ea32f77530455aa65c06be6d1c74b9e9d385d4be1e41856f62df0cff507ef5f99717c8c98ee151f72a828472a17e73b66c303054cab0965aca620beb0a43996cd91427081d585376c4f04f58e5f74387aca95daaeb2130dbc08acb4d9b81a4f98eeeed61c050bbc0e59d0a18f9927bc5170e403da59663b295e98a1797e5434df7d8cc39f785b7492fb31a65b4ef8b791f26acc252111837b448fef81b9bf0e6d24b9fd718abc11dc1bbb103a5643d45d504b467364907c7186df40c585352abf72519e8c73abc055a8e44e4d0681cd89dcad907254e84ce83b718a1b643a6b564004b9eb36b7340e834a08ad0caecb1f2576c400be6034647b248d2bd3f8a7c6b037034edf8fbeff6c3bd04f3e952fa3d0bd93673bc332b1abaa31b2ac2792fb742fbfc6d477c02204423ea1dd55eb3a0e9acedbed6f182dc80747f488a4d9cccd280f6355226e6e0473f3805489e77c3ac8b832401011f97b6283996d347e97f98d8d639e1142626365a3f186eca5da5a39712ac1ff366e63f74e8f5c4e13f40915f3e1fee2add369bb880ea668564c2d1748035a13c14f42f65c88732a26859a8fcae53f0d84c593fc8d9754df6639d539cb612b90e9ebcb9b0909caf258aa70fccddcefdfb7e12bbe4d9662936922e31bb927817be35362efaafff252f493f97580725810213b3af048ed0b1089729f1705dc2c1572a9060e1314454b57bad6f3505cbbea99fd98490fb88dbaa56ff2221f6faee10835f6e4584e8152668d1715677ec9c70bac658c2dbae6a9a8f01e6ba59b85df1cc63c0c893e04faf53af156a76bf77c707478cc177b71e5f90f9cb422f1428467b6a7c812ac44e81a38c9cdf192c85cb74c727bb016f9e40385c5114e99bc48d5cc0fa09cd763a9d80b5647ba643b0d85d1e288954c35328f1647bae4a7915db438f2f8e3f6d2aa88718ffcaa62af6cad51d435dff35f2d98c61ed1ee68399e8afdbb60aec14c7baa63ef8c38b03110d8fb44b1c5e9b293cd10f5bb0c7c3973f7ca907fdbd72ff83ff35011d0d1029a63110d1702f9d7e61827adddc5b1068d4a3879c252e494d88c7c0e1a77a7df12934e405e00f4e2145990404c44e284bed917c65a083982e55463d73ee058051ed2b5260c501812236ed8137268cfddf25e5ec40b74cacb8c2684c0df7a19fdd7df1346813994b61fb52800d5cdc878571b448da9320894a8269813e96b19fd3ae5a76a4990fa817caff7b9521724243f889eaac25cc377d6df64c9e501d8d44b30f71aba685f85b1ae9857a23d133cb47196b807d4ebb8766936c28bd58d5acad1ceb31cdb59a6826f25cf866d430c3b34af96d174df7a6dfc252cbb0dcf5fc15946a3b3253380be242e3e40079cd26d11c9e730ed48043047f81bca6523027f88a364ecd66b2c083a3dc3139907225dc66263da3513e49bef5ae844c9e4ba4abd3a2ef82f0c31bbbdff516f9d879bba8a8ce59133464d5043e1b1101a552c9f29661e6cc3031b478bd4e1bf7fac6b79e6c09125ce59988a7d1c1b7c278ac13b79f275fe53c8675a7509e6bd4ab87674206cedde3e9af682da4c76bc8b33292013c4ec41e5cf0e71b5becfb528190b58832fdcdee718987cb6ab679bff3d31809e48628a7269abf99e4ec376cdba18aadb642c990f12d3a017e0d26c617db836d2d0296a36cd4fc189050713c7bd7963750bf1059b73b1614aafae80bd0c6e2552abbfb352a34f2639499d226177b22adfa30429c14dd992354800c4b451a374f55490bd6d02d03663f3f0da91fb52c671634ceafb7b7f3e7499c3699c130f75afedc1ddee42e5940f73ce5463f96b857f0073f31476dcc42929adeeacf672f9325ba53c189fe2ebc162efc1a8478fdcd805796455cedf8ed31e87b932b751b006a33246cb2beb94ebe44a9257a5983fd1a9d9f317d3dd10bda11438323283335bc746ed4bb74f4e3bb98d559d000d490ec843cfbdd7587557d462f09ed0620f52c5c6fff7c54e4d593c3341f68405791c1e9b01ca233f029263ce65ea386b180f1e7a9cc5eee69154479bd017484f03269e4cd7f60226e2801227012f713d6abea192cfa6089383c856b4ccbc3c3e3845a507a5051dd9be7c885138d7a1dee1dd6afda4d84aec3b7fbc31c6232af11234b3a0c95c4e4a4e5cad9b56b8b325d69c257a037f38d293feb77a59c1102504f5040612f6a96cd6bc5ea000a626249aa85d0b0fd854c68217e9db8b6e0b1fe833d13f5fbbd6b0788e64961dca7c6a9a362aaa58d508313cc5fb368dbb57f48d9921633a92256bf49a13e4c00369f7dc4566a66f46732945a49baa75198abc50e170373ce3a381cb3bad4b040285654572e6c8213e2d2b8b4407160d4c17695a5d5d9d653b16a12e39ba490ef49ca9c075f2e01c701f725a5198095803ef4601ec5432026c8ed9d33dc38ba021458c24323bfc2345e006b5b029b0434f28e04280ed1443058f53228aaa314cfd1918c2abe80c4aae3f5582bef8576e4ca7a78912fdf9be2ac9d690852cd504e07e59c8faf35bca2a785417339674292cb5a19659a8a98ce9641c48c35dc831bf61d24b09c78c2b67abfade50ef405c288b036d6e4cac9c1271411af959235f602dc3e4e7e882406110f4e47555b44d04e788956e33439d81f33e5c318e1c156e148c10e003d6008641c26d0593cee1282e5acf7dcc4eccee4ed4b36b48ab3ed1b274046a83a5f102f808aa17062dec3324a1e1e6d415ee1e2257f3f93400cb5a6efc1bcfc517024fef04e0a95b3da94d40aab810f24943854a10dfb89b9cf9d0d10fb68a61085800ba14581100af53c3c326fb103c3c9ff012d91db2d44c31579f29f522175a470c89e8adc62bc1a57113839711395c94188003edf748e477550387d636b3f04debf1d65c1974b39c75202235b2ce9e5c5743148224632df292b88bae45c77ccde542c9ca16864ebfae169e04da5a365b1714c72460d4d4203e9385ac86be04c99b090bd2a071e28570b2f71a360324c0357adbd7fcebc8d65c1693c74956ea85bf6e7d823c0268c84ce6a57c7b48e23205e15bd2a68f43606ef4e8d3fc2a1fce594df950c95717af73c00c845b10e3e2fd1d168bedd362759654d113902de61c25859292b152529cfa200dfdaf6161dd96585be5a6dd9ec6e5decfcbbc5f78b99b18b9481fc8db9327b1a384991109d01a804f38756aba10baa0324c6487e339fe2b0db6acdc1096c1051cb303af0c8278869ad1439702bca63293634ddac1856f0147b082fe6332ecad08829f34a72cbcf969c5a24cb1dca073bde74e0cfd183631dbdb1870c0ffaa61d82f80de0c6c4d616a3117574a82809c06a4883ca63e0314342550efc395355540dd8bb8e49c844818784274bfd86465350a8987586625e41bcff984f6edbb440f1ceb42edf8c759aa184f3ee9fd0f06fa6769f98062978f7438d36e72e55d9ab190ef09b27037e477193157ae7b8cf9e808c3bfab668ec1acaf224cf21a41ae7068a34c2bc22a518129f7794f966369dbaf0984c3b4f88d070ca32d4b988c3a18d7bef087233d6ec03cf20d768d41c5e1eca012e434aa1412d08026a5de46c24cc370f8d387030657ef46d4e6744f342070c77771be046210bda3e075d27a4626f16e6a87afb45c95c524aa536f00ae2782aa0915cf5e3bb038159038a58ba5d1824cb04a237d7a94a842d3bd075a37770c7edf0dd11b20a17fb12c05a8223278d57788109a721b8052b0d3cbed9eac8c48e4ffc83e97bff6a9b184118e2c09169e79e16881127df462fbb4f581099a6031e7d8380b9f5499640dbb1f1a445d02d3e9450f96f9c8a5b43eb4e3205527da9fbc799eb5597bd8c761808add79c2e59d0a2161e02f60bcb96d2013f78d97a519f5be94a7827ddae8f6af915671ae50716b64098a2d9b0e309d7158b269248dafcf3666c47cb08d52854803e6e20ad4173e1d7a683d63b9b487204bce22a2f18a2ab87f0a44fc846a3e4c728c2691caa226263b1fcd6a821e279269d0e38ffd30d852947008a180bd1ab7e431a8fc83585c8d8968ee6fb2d6daa3f695837eb558064ce81d3e4f23362c7a30b8def0e1cad6b527ada0df038ed347461d956e7fcd60a7c98bd36b3021513a403c8148f181c03d8fc3f04cdd2b8f8e4124121c408f9f8cc945ef9169c0c8bf072c6826823242e077f2325d6dd0f5de852dd2af1fcfe123cefd014de7237839ef4ae393752bfc43bc6ef06a2339046561c81a5026660293186a703631fe24a76b13323b1509dcd7be0ae1cf6c6922f8013756e8d71108f02ac42473f21f80d70e710e3953f5f1690e22bbb3b8594837409e3eb7519699ede13d5ca6b0aa33765c198d4c0180b2cfbd743afc36777a346276e9fd27c0fc58e10dbdadf3cd45540204d718cd52f8d87313d44fe9b6e9993e519127981878a32203437695f21a5d421d01a8a5c68de7c23042494758ef5d344ca8c3d063d4cb9a570e736ec3e824f575e5d59093de70b271359c5491b5997d2825a5af0112b89a96897d93dccb15ecfeb0488b83d0f731cda2e920e388728daea48b29a32b1adf517079f3345fb296e47365df70aa9598a735e317e060f8a9eeb5c2bdaa2372c3bf5bb2fec4059703a62a0185f0cfa94cf734cd26ed49c06f7a2149d0e7eaa628f588e5d5afc74815b24c04d3e0d306e0ee0a4954f2290d94e7163d5722252b18561f1f5c1476d6b1d75d000c0cf8de0aef25ba24d976d7a7d128d4e2f9b1b41e6d54d5d5bf9397ceef6c311ae8b3a08fad0dcb013a1424a22a65bf7de311aa487bbdd42e7d12797fb46016fd41de6effc87ea790049b86cd186e31c56c448b8554c416482c96d423bf7e449250ff8f1f35d52e07b3188ea7379df6ec42bf30129fdbe06e08eee3481d8888e43ee481bca4363aa6800f53f4877e2ead080625b3e0bd0c71f16640996830d79e5340e91ca80a94e565d94bf4c8134504c581b878cf64f3e87f979ebf9c6a8858786e028568580422ba525584c8b24ea4711b217034fbbe97b3aa73824ddb74df7baaea1fb54b7cc6659acd7c2df81ee5b88c1e7e6b93c82fb04af84b5d583e3e4cb2ebb9a32191397f13b648140cb165fd0803256269bfe1d4020e0c01cdab84f30c5d2b11d43a57c7c3ef5747814508607ec20ca4645a1a0a3e2445d96ef6dc5f7ec5c7c73a9caf42252370b34617b92974017f9924b66764b4e4ecd2fb5814afb2dd413a8a9b12183ec19fed07b5d3839a2643229051139805de8821b962e301161321b1823398e7c3ad40cf155bbbe254af605d610aa6b9f2635b5c065c443d515fd49594053ac6d54ef8875631679637d65f12cbd9542812b57722090da030df62683e30095887a65d7f4e28219f3ed27bfefdab21a31b1665fe59101154698ba9327ee232453eabc5cf943d7e14e33ef703e4b00f891b0e62579567ea8df6063588001fc8edadb34c76cc8f49fbbdaf152e5f60e11285d13358869156283211fb0dd002962200707290494e6a6d07fd22cf3888e40b44d7f8222df9eef51ad11a94117a706c241cbf573f44f6fd502fc345b68cd12ed202b8b89d1072dcd76855a410c889923400d1f68ab640c0ce55e27d8f1e5dee76480523b45abf216863e158ace23579ac4fdbf069fab8476a3afc580859d170050d2d39086df7be33bda9d9881e7a788de0dcf7bea40905a6bca36bc2d04dc81d692a5e11a7cc3a6a7777731c40651a2b5da7acbcd00680c5d476a74321c9fff4ff3085b7eb36103cb0bff1e9b38d0e398e1f9d67c22288c1257ceb910d0f5942b26aa0e31b08bff4c1aad1cf151a952ad91ac6889b2a79e076ac00df04183578208305475e7453d6abf66c03ede7bd3a9bcbe386ec8b3e56e5b3643d97164a06a4e1e04ea7c6b945071fd73c4e12275384f4fbee39271612add7343edcd19048e3dbc72cf78b90bb2927d989274122064d39691326317055439506bf101c5c763070f87fc5cd8233b1c229fdd02a64bbf2792b86d864eccddd7c21a133846ad737deacbba40342702d3ffc1e8b83dd2c273e0cd7bd2cc7691dd290118a64c3965e1615df8bda12fb1218f3b5a0c9f0f79153f4e4590436f6311a08ee66044bd8b8a534c674385771d0d513fcef14b43098489126497774c0ff59ddd5de28df632ccb1a353b40ffa1709a40a073b303ddb557532422aa850e31949a768b4e7603cde96d075c87e492d291418bed49b96cf69e3c651f33247a5e9400c698bfb665b3d5a4addecee71c0057c84847a65a4b0af2f42660d02ce4a8a8c907484038ac40e43092aa4d050bddcb00afbbd70b253bac8233b753990da2223c17f2f03354f4778c8fd6d8d8b1f43c2b7c02e809c0ad65822e5b1688c1f70f0685d0c31742c2886793bb122ab3cc047594d387930b10adfb88ce10d84703ddb75f393dfaa24bc903643b889611c7b03d9b88faf7060b5c43ff8464a42514c8237f1d8fb11bc6c44ddc952f56954350945a02a4fd537c9caad27f120bc8e3278f91bf2b68b998991b1955f374dfadf87a978aacf0fa253743b735678f36bf52b1ff1783f92589e1394568e5c7ea924048eb632facbb07aff3456fa96ce301c4904173ec82c728007a2e7b9402e3ae81b1fe51e980cd41b5b83e079181389507cff283a610c1d4b0aa06641344933bcadf5f6248acdba454bb054066aa3aac8f40a4701a20ad8594a6fdd14a6db03b961347f407058cce7c18cdb50661b842a081ccd7fdc0de7a0f4428b37fb09ff1da08e912d083ab20f3e53fbaad162aed0f8bbff263bcfd34978d2a78e08efca093ac15d8011337bd7617c001d4b5c45253fd83edf9151f59b9b280dd531b3a560b21d2aa37c77c9d25b83a343b993740bc5e568e49f22546a8599d622874e276aae802166b2583a5b5503cef5ae8f1af4c6e5e1314be8ffdaa512705cf7008f849a45cb4c473585e6f892c06f620954f76a077b3c92cc62ca368f2de1847a8b96d7eee47ec584bd8514a43f8ffab21bc07b41104daeb82995c30ccba9a0e251d2a102168e36481dce2c0d163f09bf18284e080c6488505424ba5c256ad2ca04381c9334548b60574387598b96fd7f1d76954156f4dfc445d8b88ed585ffc2104c7858e5cabde0b8da691496b7bb735b9a594322519d9095c094609453b64fad3484b9e93274b261268594af776caad6e49f5bc77ded7bfec7c4dcb4442510f0da81f5e8061ca0b9313198511605831005330a165cc172699116392e4f900f0e1872ac44801922d26808225082856386fd4336008c0194c9c0126d7c7e027063450810214966e505a413a0d71c39c73ce1e6f68ae7274ace8c24486972a5670c40a9acab0a18c33c4389921e50c1472fd1ede50ad2408a28647ec124446d1d413793e8f8e183c5480058a29a35c7f07930a78c091eb5f20450aa6b0c01baa1b971c1480494111b97eec36f9114956cc39e704bda109801e39cc914222d725505084822272fd1d6fa8ea3821b50206b9be0e6fa85a219ca0c97133986fc7c832c60a79be8e37346f5217343806500031a41003863c1fbf5e4c4a00c316585280c20a098510355b2b7e07bb5b8c10d4e4f99f373473c894084396411846e4fa9f4385eea28ee45adf460d91ebdff0866a17f50421b07202a65cdf863754b7271d308ec895e96b784375b3628a1f2576f80835608a57a2162f9074783145982861b6f862875cbf07e88b2e72fd1f4082e4784375bb225a10ee00a36403cc152610c204b55c1fe60d551d1474395dd472858a92ebbfc010e5fa34b0121266b821072eb40c219f20620515ce1417f8708145174170a143aeffa242b48af7755dafa09ba6e2eb17242e50f8c224d7b7f186aa1135d4787122cf7719d9e450e143835ca3960aab61b8d428c68a14acb0a28b5cffbeac3023d7ff2b9ac8f5412c72c8f57bb01893eb03d5b8e4fa3fb21022d707b294450a725dd2e2895c1f842d74c8f52d90812d98727d225e6878bd6aad482899894133edcaf34a9729baa45053830e1722b0105197b8c872ad5aaae821572c5e86115dbcfbbaae976b56c18214797ef73a620bee36518124cf5f7d3184956b9b9e92c8138bce9309b9d65a6badb5d65a6badb566b92087ae297c9862cb0979fedd52459e4f5f3f905133a3531679ce295158b5d65aeb4e9e45042db1f7058ba2498597164734a2c832bbe1128563b7486293b76d73bdb098820595d78d422a494d97292b6437d784992b8b231b1750a0a9c2a866861566b67072452992a935d14c79e1621135c3840b2d2e453258acc0d262ea66f922ca66191343b785118b89122e8b266f04ab2b689d9621544f9c653a62b718ad66d32ef1586cf2c4633187f7554bb2802a9cc25861015a142d69197364015434a9b0002b8ea4a02149920287a2055cf1248514240be082f4399a4c6dfdb295564aab8e272e8d1c9762b872e472392ec5c0c50a3184912403d113198a7ab85549d365d174b020430e3218b1e446278ea0e59d2519a05892a1cb7dffc273bd9c80b224d39f5132998c05195680a48b4ed470845ad0c2ad39c18223eeab091597660af874594a607155392e359122ff52932b4ca83a4930189d48622ad31c645cbb45cce8da1c979a7851c495c971a9c91832382162e2ae725c7292828e14eecc71c9c9121b392ecd30460fa782eef60ebcd0c20d2fc8eeeeeeee186eb6736d312846cfb12f6b73fe25c494835105827e3ac3c9184252b6a726b8ddb382843d665cebb13e2342dd07ab5f2b16c27a0e17693deb8b70dfbd11211ae74cfeb45e7ebc2dfce2aecc7bcf61ef693ecad8ccdf6dd24209667e437ab2bf63a97463c60d6d035ac8fb8ef5716db749eb240eb7928c612bb7f3be48eb65dec345baafc1600d4c9c47642d066daf3c49c8128757929125966164f9f3732207392ca5c615d785a5918cc999bf1f8258cc602040637ce0032d5c448a90d6771f65ec65f007baaeebbec320f88005eeb7f0c5edf4dd87f1098b16b64464cc7bcff3dec320f80057996e7fe8442d2ca50616f7bd0fbb080bcfc718dc772c25077fc95509799f0ad75f853530a5d3978bc3885b6bb88e8d3c87e0affaf9e1dce0aade5ff5dc6c99a3acfdc8300ee563c70e9dad8ba1edec6b2a064510f42efa916c21f9124a3a5296b827cfa2e8d2684a1c76b307190b5142f16f0ba7466beed3126ace6613ffc148618ca498299b4573891f492319258732cad1e752554297e240f553314b563df7f50bc17f72d063f2064b407dfa1c547f0e749e2a2712e33e2a1c420d679e218ce0b92ec0e248bf10fc371a427d7ffbd14b802a048b00bc7909880e4aa9fac54c9b62507de95f8b3c3f93c8634bc41f9985962b57644d8350d67cec78bd646454d39f1479d8978831f95934451ee9a59f6a2a2b8e43764327f269244a9e1ff3c4b52831b2d6535ee38c58ff1870f800e4a5c28d1ebee1fe7020b2d25aa794524a29a594725229250754f5616cfaad1be2c2ac94db263729e595745220b449bc575c07e2df06af136ef430941b46a60dbaa393d2de6c383d95f3757c839e5a5cfb405cdaeda3106c73f78a9baacb7be50c0264851b9970dd95ef6d822c4109b61792bace1b6a2d0e7abb3bf548bd9dce0c8c9cb41c4d1a35256530dbb918db5dab238f1affc3c01e5f7212931d6a7af48064d2069bff74cddbe994d14a14145d249ddd1435e53eb2a1c254713159bef5861c07894eb20271b3d70f241079e4ab96b81209cba317686e28f9e3a2f93c8aca55ad7c48f58ae72742a41f1a41c24074caa111a41cc2fce6def5c1fc6dde8810cd07f3a22330999f79966c72c1904fb27cf9c47d4287923469e4a054d17db9c47dbc972f84e65d2ff33580e65db2fcf120dfb12bf9fd9c8a741a6e3515717dcdfb27858585b8de0617b179d7d77c456a9ee6af1897bebf74288fa202459372b0dae028635d83a3941bcd93311eb974d93d329c51a8bfd0a964f93964dc501ee121aa57492877a92807a5fb181c675cff469247625c9d12ae7f9d5df9b11eb9f263457271686404528aecb8a37040b961877941b9f2b54c18910c4b40e71fc8c854ca96c1acb8321ca1e6f72f00cdcb775acf644c65853e31e2b8012021414145351d4509239dc8a14b1d4d41426a922f9f38b9d374b8f2639634ea94ce9671b21286caac84f2c88a54b7d42487b28b4c924c5dee510cdab23c8a729fbcf84f902c2e618162924eb24ba52d619dd454a46b4992f2a89564902ea16a209157dca71fe93aa883918ecff151e76b212ec77795acbd5729c7176b2c71e5bbcf741a89ce21c7e74daee40298b4d3f94c68a1300ecea8e9f704b7a1ba269b24b9928d25f746de799d0f811e082e4ebcc0c504a83184e6cbaf6b2e80f939e6ebf86291ceefe0225284e4f81cb888fc4d8a101daff345e4e7f8fb51fee8e022fe3a709431d6b33ec71765ecfe90b1f96ef3fae834609f63ff7e278536bce12b13c1f11dfed5f7aaff1b4f3f4aafc6b79e88fc71190e1cda0f87afc7e1dfc021986de01a3804ca3fe48f7b7197cdcfc1a187c9f36138b434f00b872e26cfbfc1e1cb06879228cfafc1e1bb300d0ec1192c83c39efc6ae110c89540599d5f2beee1121163f3ab402d912796dc4991677e9ddee4e0fc39abf48e945575be28e4440e4eaf1263f39700b1e449c5865d8989eb8e83882b8dde5949465d6ef8b1ff2a03c04028f7a7179e73832f8932461bc1eebb1122d87d47c4ebb82279f52dc580b2524e282eea6c51c6de5e4e1d392bddbe5b750772b95b712b1528bd0d883ba3cbfd2d3d9244942a35262644a13f29729f965522134d2abb90ea48460a555fc6c9eede906398fc2f7706024b0e5545d51bf24ee6606fde90e3d8e28676ca4e5931d6be5ecf7943931e1539d81d11d20d3b5957f41a81aabeaf2bea64f4ad980fcaf673fb8ec83b99fb548fe2b1d9b9937545ee13ab4a36e52086bae12dba45ee538418395415d12197dbff70ba750d1c2e4d8e5bb68c206ba0fd48ca7268a537646be470433f72cae176d4e3847b73e5aafeb574433b7593c4a54734949472d8c972ffd1a447b9df33923f5b918cf51fe5de68b93ff490727b49b99f4611eb4b0e3d2bb228748b84b8e1565494fbb7221bb7a2dc5fa162cc63ac50381c52a1324c7e14f2280e937f24e6fe94e4e1bae34e8a314a96c450b6ed3b6a2a777f03a6d086ed94dc8eecd496d4b84706e972016b2f2d6ba5a824d418e6452fd418d64d2e112b640a3586f513b95063291c44107463c08893a21cc470e1c315412c49117534a3a2d4b049c0095210484b556c01430b162b284e0006892701133932753ed0b8187f36b757c6a8c521fd4ae9eb65ed638b438c514afa93cef8515c8cd14b8eef4a3551b76337998a5a26b65de692f27cf9752698fd5eb38836ec47fa21e0d0beea6df521752d8675509f6e1d1ac9f439efbc0ebed0089df282b813417ff9e188608f18f3ffc99e43c38716f24608f3733831ac83cff53fd74975b044e83179e27f9593ab56d56e5ceb762c4f86c635f3381fbd211a35df3eab5d754e62065ef4688841d5d5e3a36bdd97f9f845dc87f5f17be623cdc7ef27add44c34c2d6f28adf556206eda57bd87cd84b3ff149e0c2cf0cc949f48f42d481e8df474070086c890ae81efea01733d8d13dfc77d830176af310503b281a384d5e5e37b89b6c70e85e831baa9110e0b9c6042e9a9e4599cd198f95813e12f552e6b6820c6179386c31de6db647013d3dcd75d4d7611c7429f7b73874a2ecbfe1b0c5647f2f76646fa8c8e30ffb0eaa280639ecbbbb63b7fc09c31d06aa4a4375e1331c9791eaf999423019ea8e0f2304514970a92d2185822c4d542c2b54289c4890274427011347d4b6265078188e7208eee8f172648261492da1d229636cc5e860fc5983129b5015a24253889b1dad1bcb0acc4686f5aacd93a492c478fc8ebaf225c7ee22c76f2f3108a78d9cdae829c6be32a5ca94a51cbf9562108d8f4528e49824472639badebf9fc87cd84744eda489688841351f9f7af6145bd64443c808139f480ceafe87178f31c6da1621518aece4b129c420c7171283bcf701a44190dc9175a2df9cebcaaf0ee7a3dfece2099c4fe626314a5d3c71c3062c49eaca97dcef44b98bdc8f63e3833dec6dfc8d1b30182ceac6d719e7eb6c03ca0b8d8f7ef3937949889c1a9fd3942a35a4a7a51a9f8dcdc33ee7b9ce1bcab1b1b1b992f375a6f175863129d1f862c6e9dc45ce247751e4a9f968cd376b3e995b0437af2f03dd4e723f95dc35af4fe665dee66f6e6464648e6ebece355f679b36ea2691a7ff8bd945a7ccb532c098a1f9641f74d110329a06d5b35a19341f8bc5adbca119160bcfc88821e27d747a9fcc718ad6931721518adc2fd55bb2773f554b019dbd272191a7df931ff50264a7ded413000d72a62a4f0146b2ca474f4b47d6513f2ff7fb8edcefad93376fa8d6ce5de4e98f3987e8f63bd9e818153b2bad95ee94e0cae4c8d40253d1f572646a61881c2a6801e97e0b32b8a0baafeb7a41c9335a700188abca91a98523605a20daa1dd9a239392339894444d2f48321633a53b3f5c1a53e8d002450e9fcab53932295122ef38a14409dc40491253922472f83d3d4877f98fcb63fd4aaab9b13c57c751a970707ab23eefeb56d64655b3727134b6bb92eb64951b9098251ec113d063c68c19d31eebb65a57a6a37165a51c9d3ca95743bd9a1ad652afa6c6b40102410bf6006d30326e38694c98bcd1572f8f4e2b99ed7dfda42c20dc6c09c620dfe13e1debc8838100727f3880ec1d1b87e6ffc69cb37538295dca28a594aa18a5a4966e73d6bad139638c314629e5cab9961de99cb3fb557fce3a65f458364c5c8cf12565534a698cf1467635b8bc26add1c53bf2dc2e8a09e46084d9703d3796db6fc3ed0cb3e1469b29433a5d730c4ae30ced628c118740e594b1975295ce6c49c97594524aa99452ca158beb28a59452cab1ba19b59aad6e46a9ec94895bcf50cab9bae8451c4ae0ca6ec76f88ce53eaea62e49194524a29a594524a6d7c8cbe2ddc7ef9b4bb439d1c256aa5b5ba1cc442d4248fe058667904efa93c82e777106f5b0e558ed5089ee387f5e72aabb6ca7539e2d75a6bac35c6aeb6fa7632b5d63a536ba5b17155cea69b33da5a9fbb795557df7412a0945219a3d71fa2e30dcdc773ce9b5965f64c719a4637a51ae6e4258fe0596a86f4e5770f05e7e33c75725e37382e53029d9bc5e95577f7a455ca2e5772b9b252dc45b3abb8928a2b7174b0b3a1a1abf1c2d0b470984564ae6cda9a6290dd2d251829c1483926090d5232f13061e84c1266d231b015b88a3b779e71b13dc33a885fe414814ead9bc579e5f8bde2b8ef5b71ddcb7d54acf8ed31c8fecafb4ef515c144ba2d534d42e4f1b7dd4d718f74d11204c82c71cfa43062510f37ad9b5e03a4d00a379216aeb3e96a3c8fe5b2400d04164d6bc6a99b76901ef03a9879cadc1cbf08526e26d6cacdd0b4726a60d5d874d14b6edc9187bacd0d2701073f887315243ae174919b9a9a542a2f9c4b94d3ac553d7d57c96d82e5745064efa6d844ec2cd97d065a4e8dce02c10a883c37861a366cdc90403d3d3df267c571dfcabfb8f118470caa407afac7693247cca0a3ba87bf183b56756b50345f254d164af4a7adc53baa33e825620f7f2f5d8c7237214613f7e1d078dde0ccc701135bc1cba8f20512313098925049929464ca28989220fd1b4d773a414b122c2fe2a27325994cb66405160a52b49294548832836486d73243c76ab574726b47abd5f25a1f8fc8ad9f2d26246372eb6f95dc6afdaf00456e3d8824b7be87052772eb8156c8ad99536e254912a3cf67cff33c4f0531d93be2c4a4c2112ecb9373652e27733f392e8527994ba18bcc7939ca036042a10935b273fb28c656837664ea23533a001aaf6090c3a8a50bcd804ad126f2c9611fc9b49768403f66c994bebd24a420d37f2165fa1f0231327db0042032fd9e12aec8f481984a1893e903214acaf48310a520d3ff000428993299e045a69f01fa44729089c08ba21e32653ae14ba64c011f975799f33af9a9b2cd5cab93df96b9dbc9af669ab9998e867375359d8d8b66a6e686151ac9b00e6e3a37f68091d92ea6a38e7bccb9e1c69f2a748c1d63eceed8dd91c6ee27dca42f99f8f4affc22209bd33d467713b8f84831469d3927954e1d989c2955b6fb72e5538a6d94f5ba125b1d816a256537b74fd2f9d58f66d5eab33182f4adfcb939f5bd5a6abf036bdf1b52596c75b0364c4509d9c4001de3733b5f1402bf22345000e3884c68e7b92e020267e14b91d0055f040400e0e2284a28f616c8b80fd991675ec6bf70479699f91fee9fcccc476f68c6a6c647cf068d4fc7fff0170a3766fcd6b5dd0be686b2c88fcc8e5a375afff26f73ffa68efc6cae09c1fdf79ca9c30d5f5eebe2e0d3d40d250ddf7cbbbe717c7b43aee75c2e3a66cc182c3947a5aea5399af33b1ff70dfe0e88fb776cb8709f06ced30f07e77f382725c5e108343ffd6cd89367ce174aa770484f479de04a263188fecb071d72c5a1acc1667b4614f9c4084bda279b3868cdb8345ff3f6551f4a1a77b3a972a85e7a43aa8ae36b8e987138def960f279fccecf0f0653bdfc0dfc602adc001ebff330893de081779ee7c1876dd8039e079f0783df12fcac8c71bf5357cfad6256e178ca89f023cf77bdcb254254ca12873ff2c421b85ec7ff70ff5cafc3e70f77bc4d11b6ed13c100746772b223e24ad294f6297d42975c7243b90ffdde41c096a964b1581deb6547955a0afcb61b9c100115b42652fe944e93d2734fda6c311996fb6553948a8a4c4952b925131130e4502a5dc9dd3fa52b2146892b5f02259a6c9c4d173d0e74bcebfd73fd8effe1396f9f03df88d0dc79f085ec3c08f3e78932362516b20373ac0121e0f3e0223fb003a2101019eb0fb283ed86a5c03e0af1f0ce87bcf20f5fcd6ff5f60b3fabb0857d21d4bff987b45f97f375dfe3e3b103fbf09837d46117eb69bca1d5bbbca1ee5d1feb7574cf7a6ef5dd2865afcd9a94a2ae92d39383c0fe90f31ba1f3dc70e0f78f7b9a83c3435e19c7db1c3d1cffc3c31c78484fc6f1f83f2917e7693c87f3859db717a5b1610cf4641d1adfde100dd8f7309d8fded01724e7619653b9761e076f3938b4301cde1756816190fcfaf971a0f3f7fd0f7f7da10e6e3d8daff307e5869396fb713c1ed293bf9f1dfe6cfe3e188eef93dfde3f27bbefc3f1850d73dc0135caf4bf8f59ca9c9e6a505153535150b5272737f223a424a5a626a524243f8a9a729917f98ce6349f4d452935393dd5a0a06a4f4e4d4a3d6b5a1bf511525212521fb551d37a166b112a2a6c595117b56c2aaa07282af5e0f1f100b953e6fe87b7de88833c3c7a7c3c3e1e108bb0e5b033067a3287c320f987e3577d18d85e7a43f8fffb42780cebc0cbfe5ef6778c819e4c7108ad973df95b2663fd4684769e87061c108544e0de0151087c1eb8481110708fdf791e1fde1e9fe411b66ce7a3d08e0f63144f186b418840bc835fd25a7eadf7aff53c1f2cc88e8771d8015168078e3226b4f3300f5a68e75b6807f74cc65a166b29b5fec6e79f94eb5fc36dd4a851a3468d1a356a7c9d6dd8f8ba461b19b9769ea3f9c2ceafb7f9866e705e62b007e855bf3dad6559a353df5ce539387cc1f04603d315b698c3385f3842cd37ef72798d95351f63cd4b0cf6b83e04ba71bd7f353fbff0e6dd1baab979aebb1b8c3d8cc76a5c51f2d1915f71b05fe67ede34d4c29ee47ddde746df852b4b9afc89427d5434739fb02ff87c890ba0df82afa75c00fdb12fba00e4e7448d50f392dcdfb289b4b966881b4db511c881bff33e80b2a4d5ecef3407dbc886eb4d6a9fdcf9bc04c42758c88edd6886f2481a6530cb270787b8b20a491483a2fc96e1953e2e254dd27c892bb32ca72021d9194c49c6fa618e3bc98ac4342d4edd4a2d3b9a328a6a1a54cf6a71aae73df6c41028dc3ae8595681d093e50f395718033d5985c320d27654023c3066cc18a7bce1213de0ce178566974b8b415dee974631a8c34cf9f7909e3ca427cfef28077b4ae9facff61026ee2929cfe17243497bb2f3f40bb0b3f30dfefc064123f7a118e66fb37fcfef89a11c543d216950547ac8b2cbeca79def0989bdd41cd4a1a5fcc7c378acbfa71c3bd40ac9fd9e42eb3092d6500ef63794910e9f8018545219e5766f6dec6926e647fc3b3c947712dd34504a95a69cd035ed0195e74feb2428e28c07a294522a71f28422cf773a060633c6488113279c7084a48288a93a43539e566a92ea4b511493932f96cc4878400b3424478c9824c961f60025494c3308a1e40149a03a147a3607bfdc558e4b4a4e782d2d51a2134ea5ec7ee3c5f599776f68e667e48cfc5519575a4e46e6391919ee7ee190b7ffc3657dcb71975e7ae9a5dc8febe387b688f8e3c231c65898091a6c25bbccf159cfd18ef51ce775ed7160bf22c929e57c6eca29e5949999796e662674654a714711417a1c788e52463e6c2e711f9783bd4d23ff79e43e51fce72c923f52d692fcc9bbc830eee332647feb0d61e9bc8aab57e6b8c8bd27399555197766d673fe0aba00c8d2822c71228e3f4e8b5f0c8ab97b80a4bfc45362a6a46c6aca5a6855c6ad1a90b28fa48f309e6864f23a80cd23da7d2865f3894c5a7bedfde849a4c8e3f208c71137743146fe75e6412ae54a2499342391ac375d262af5d1d7aa54ef17be72eb0b6d9e42ba1269db5e25b1f538f0fc23f2f8d323f789b2b5979e3295dda5cb29739f302acd22f70925929c9262e4530e27d13c92fdeb064c4d9eb237921e20b047de97b419fcc0b2a7c9ad1543a14940ac9227f6e13d34df061e73202986a43aef9da424e33a50dc6071c3e8247ffec445a450db42f2e9c4b097833b40f901f184b8501123424032d61d6b4e515f28c150c5dd9d521a630c928daf74f9caf366712b0e87b8f0063fb3e31fab14eee7f0a504be72f74b8544189d6adb10d50417471814700722bb39a7063a87ffeee3ca9f41087bfe3669ca91a949d2528e4c3248e56792c14bae3f9da4bcf1722703e2529ef89b4febcfa7923b32790cd8de4a0fa828e01404073fd672e22b7b7f54124d94a69c90bd8833b2632b59e847dbf445fbff8cecafe39fe3378cdb0f5edfc8c8b4bf2ed78d6e5b75291b241f5e3c76d92af5188a5290fd75bc658c42e215c52aa1d65aeb96335a485070220c192238b2811ba0c6a0a054c2962db63cbde045f17483122c6242d081394185e7cc781d95540ebfc722795b69ad7495040d546011a3c313a229b6b43013c5161c9a98f7755df7c6315a48b1f0c2d30c4e2c4df1658b628a3050ee65e264c3840b2624a0b92e262652324e8e4c4c96e43075d2ba59d58aeb58565e4111003916c522abba325f6c2266895c7e8b1cff00d18bfebb86a5e3a4322a6b9b71cd0a04fe903f351f7ffb2800426dc8c416a0ab4d8c4c36400ad16022644c7d2ec47577bfeebc8e2e57adcb39e9e0ae643890b96d0ab7a7cc8c4a2929a986a456cb1b627dcbe3c0b3ea672c919679e71ff88f17452872fc05b8064282282006a9b647723b9b4569b55adf2d3cbd157655dd6a48b547b2b328dbaccea2047902c2cd7433ded0f6331e079eebd7d86c1988535ea441d105397eacd66a5ddbac962405f84f276d76f65ed4b575c6acb596da95da14990fa88773b95c3536b55be5b420cad9500f4c1b1b9b9bd7ecc95ed4b5eee17f5f2f3abda8e633236a2de946fecc7cf8caf672f78b4232ab4c693fab85284ebfcc95f9eca521f18412391a2d9623b1fc6bb1d6760a0009285cbe2c51b3a20769c50f38d81e2b434c996925994c76245ec9f406a554504a63971fa464fa3f4801b104105053aabc10c409327d20415ec8f43f10022aceef07223b65afed0be48354cd0d510aa4207e90c2f85025d79ff186aa0f5b7c209190e75f6f68ced083095a35381080872ab2f42025d767d9d04981c20309b9bee70dd59a274c5290d0a8c9218a19b9d6e7bca16a8520aa5959e014254b14151130b02c8f284620c5084ac8f3b74b850b5b6badb56576108369075a9e4fef9c53096fce39e7bcb88acfa18f5cc15cebd10db91e89c9f51f9c814987292865e40a14047777a0687941060c0bbe9ed490d84cc9987df2850a355a9c6c9e4c417125d560c181862317682470410897a32892ccb658418896a3308a8e987020e30425990bd6056e8b5703926ddbb62a68b40aa3cbc311551551dc2b872232a5db539ae569cb52dbb2406d59a2b62c531edbc026b668a7bd82a6ea525d2f2b64326673f86205da258a902e53b61cca6032a5a02205d385b26426048b1294274a8438d5a008a144c8144d509a8e087932fa9e90b4525a2d78e1d21c979a5ce1056dc9c9931811b7cb71c9490f3b29383102cc618b135c1a26a42d3a90f0e1dae4b8e4c48a0b922c39215a7232c61126883c168fd825b7c9eb89c72213513c167308c68e80628cb991e3120d496a947d4efeb42f3fa39634c924c6ecab24cdeca2ea644e30fb8b946c5f1eb98c1283aa945f3b7ded25f2d8a75fd71cac12833afbdbb73548a61dd94a22b2f5215b1db27d570e97ba8e6e2869921655ef82726592fb6c336f5f1a49c9e1502a65fb5151dcaa5379181e1585fa03e2ceef1cca999cd99ff6673e6924690edadfbedc9837498b3cf6372eaea3107d5648a28f6a87f6993cb40fd744f4a150449feeedbb0939b81231a8b3fd767ab7eff5972cf1a7919a3a83bed26664db28c8b6bfc816894bb6d6beffd05092c49f0cb808da3e12d97eec22b2d521cfc0c47ef55c4f6e3f573d06d477e170ade522875deba4b559becc7be00f0b222303f3e02dcd5f07ed47a1d7a5c130efa310cd47a10bf360e6657e06c33c0ca5e6a390eb6530ac6228331f856476d4a18a4130dbaff97a64ccbeeb039231fb349f53b5efbd878138686393ccf7818cd9bfd5daaf6f0107ed4365fb8d74a53390b3ee61df43ba32abb556ce3bdac9aea37226674d29fdd6b4b3283db3cf51caf2b2773e27d79a3d25f79cf4eaacd6fca6b56fbf8f74068dd43da2676d876d1711b4bffa7a8b085a29eb1ef66d7b1163f64390eddb318c5a397497451e6b27b6ff61b92b4b439a6f71c8765af943b61c9e13e987a7dd502737533fe9eeee4e8105df9698d88beb3fbb890d377a584a13f7799913dc59420e6bf2fceb8a41dbcfe96097a6fe58002e72ecc902a4e2b1bc96c8516210e33fd83f7d45c7fc6b5051397ed857f48f3ba970c8c3e250878d1cf65383919d8bee6de4d067339f55e069979b504ca7f9e43ee184623a4d2db3cb84c2a7c824242f90b4f09991cf7cd61598451e7f3148536492ac85f19f98524c420b2d4d579cb2cba7ecd24b76da4e336fba22bbf8ac27a7450e25174dd28718f39759f4500162f9255e55b23b11f24be4e95a3fe1d87a67350e7f83fe69619914f2c861010ac0fa2ede4b4b77e3150ed491436fca8e7978412412f672c3396b2d1e94a0d2c4b484d64158ac8779e081f71b863540f5dcdb8779c0c1a4c530676158c51e744f571836b1072a98c450ba0dc31c43517d14da3ebef7592b1de3eb25f8515122bb0612c8c106fa2181787ceaea73082eea7034a600f7f11d3948ac9229b5d4e577c45de51824a3d71e02bc2c710da4d537fd0f885bbf33dd24f716e3d55bfc41883807e3aa704ffe0fe346196b9a8392ca98162eead4af8fe867420bb551c4c07f03e346198b42dcd32e6da3c8e3bf857139b74fffe949e23e52616b44b123893cfed1480a8beb53fe3886dbd88bdb180a7dbd7c4274dd1f470b37eca7a7277f9232e9754a8c31c87c70c782e848efc84d73374d36b1ed3845e48686eb665cffb069e0911b85a2500824611207110a6b8ac8589b715be68ec3042476c05e2491d2332497888346dce80de1143a02f57b9c6d447051e795dc28e3d634e36f3fed4f4e2623e2e07cee05c38d1edee186718a88aa7fc619e777b9b218b42306adf2acfba99247befba28cad6cb2dcf856c61f1b0011f20108ee038bf88bdb0f10199b1f8292a88b7e7090fac89c54c62ed9670e88423f646cc65509d1845b69fd721c9c8d03c98d320b064ce2da1c999e3ce5f056c182e40913201597e6c8f424891a25d01daed3ea3ae5d65deb477fabdfbd75779d34470259b9d19c6a5f39decf6ce395e3edd0696d9ea55c51fadaaebd76a3af1c6f874e6b524bbb4b819b52caa77f03f7e8f89c73ce493ff6f4a89aa136ede89cb3937246c5182395b56ba594527a2da5946e1b1254c61869ddac8a524a6b8c91d6788c2f393b2be5fcea54553a372e0a183060c0cc31130c183060c08099748699632818304761cee0a24ed8b5235b172d99cd365b8ba88848a9e46aca71f2f1a4211670d07f840c38e81fb59a12e03e90dd1054d77943abef9e257b8040ff97f781fe4a5468f2a7993ce6b6afb41114775292060e42791deba35252126773582a57917163ed86317078c891c9e315a6274732b54adc1085c6ebd4c2930d275ca61b54d0a5eaac40083a850d4972e4fa53e74a0d5276e4fa968a5ceb2da2883bbf062436d01ca851134b84bcd06484059329a3291784b880549bd87ccc923282b833487408716768b8e0890f31302e54d9e1b6725c72018a1d2ff7e6b8e4c21535725c9aa184292a318733c69c79811873ea2f7d6e34b640e44972fb093339790f3d8b41396250cc114714b3f944b325f46d8c71c39ecd9ad6b2af8b965c99d0d3f7f1f229a5b321b87e1a36b636b926bb66b24cbe99db3af9b532cbcb5de6b84e06a5d8a8248df745392ad19400000001004315000028100c088402814828cd835db10f14800c7292427c5c369708b324c661144286180288018400038801305354e3007682e79eee7040c7e23542471cab3e8a5010746afc592d0001442be9be613fda755f3bff06fc67ae8bc9ca997de96f1d991bfee11f78851670b5b4b95668efef23aa28d84cff32f9e73389ff847f590a00db04c296af65c491abe3239626006d70d79e1b50b2a8e531e915c542949b08c52a423b61c2fda524c05831051a9755895e1a838004331485d7366eea40ea1053646b76a6b3398ffa7bdf548259fbb75d0a2641fe4b53720ccb00a8e2a12e7265874ac9fe1c9598a0014341e72b10ad74c411e5592742c7d0d6560d6e2bbf532d6e3b93e5cf47dc076b5e091e66f6ebc986754743fd6af4aef6ee3a306529b3e65cb17656e46bdba337a7172f212c7dc14a71782b98036879eeceedf35b87e932858369f19ae72d42f10e70a33e4b73084ebd9d2541774ed8808b5d2434c37bda30b660efdfadf39df20e4b9134759d5195464f7fb9e90642fa50bcfeadd576406b94d4941d98490e3b8a18b89e601e2ed493990b7f6bffedf0b768360bc28de26d84ef4c2c1b9172118272f62bf53f842898cdd30bf1538cacebbc17da9c752b2af19a22e18b48ae093c0f38d82df097090c7ee2c06ebb421126d1c4266c9b584e3c7f902d10fe7e96eaa9665ede7e0556184ef9038e40695d5a9bee647059f5c304ffb41a0a73d6cc0dab4cf8e8360a629cfb0b172ee198e0fd13b5ec739f7986cba0f06980554f3cc2a3e4ce8d29a624ccef6d7e09c0c5ebbbe055339800b6ce564edabd1fe63ccffb6a773d2d6812470681e7aa4a32e34cbc41a0e63582ace32718f8bf1771e47685e7db024b98c5a8beaf54ac4ac370b5782cf42ce8c0c190ae653f34ad15f5188a6168b383498461a09652f82a8a1aa1f530afbd18776ff8850cc83b11315bd5bb196e62e3475875ea6f3047d5822bc946de632dd8cd6fca0e287071e47bd136ad41b10b8496a6ae3876c5d8e381bd6dbb1a94ced56d323cf21353bf045b32e525b0e326964b11344d8aeaf6cd8ef23836171e31b7f7181a9ba0ec6525215513c42d561f3f0827d887c190d0652c7d110d751f2ed6c67f011590d1e39c94531a937ed345eba0b992ce21a48d4ebb9d0de364478d859e0dbda75473f819729f61af4905bd86cabb1f27206f3be97e06d9d1a73187a168b7bd811eadd8953b27b00c5eaee05d885db156a8ef6c4a801525026cbac229c472aef2aaafce5ff7a8e79abd1b6ac827e7e458f481e0b791cdb5c7f5f950f5398db7a4ac5ee6ecd3bf9a2e4992188fc8ba142ef93b5a0a7c7e357dea81219fc92fad06e6605d5d4d80d86ad2b506e218a887b4fa9197525f82253494a9a1008b27403dd97f83a2a960c9c57308bcec5825f0250c6b865ee6cc2648aa84018432a72efcd72da302166301ea4f56e9f2fc80f0006b6507f724242c13f630a8cb1277843665c572e9161bda2a4a65e24c5e3a7ad532b5a171a3e3d87cbe23531d81d99a4173d6b28ff6c42bf6eac3fb72bb9e3f0af4d2a42c1e84a9a0d1d271a7a0a2820c7211ea675bb18b356681e60a28be3fcb0dd198b81c2c7e2e1a9237deb891f2eedf971cade6de3593c824b140b528b206f9efcba4738f2be492128ee5401d147f2401103782899c198323182f9deffd9181ebed7962c5bd5e3f9f34fbf6646fcde6b006d3cb342c8618f122078e02c77d27119ff066b4918c31fd57e2130e7400fee29e9010d144ddb296c9d0665c9e3de67ccd0f513362b26ab5abbdcfc31ce12a2a91e98b3314671fc95f9df63b3690ea1759b18b9beb2b84fac899206d6a80ff66d73863c79ea7f39021fc9c8496fc360d121079a2fedbe07955b2751aa6e1516b55bd982b283d37eb7f959c43c9ce3d7b94f494eec30ab16d60d0efbc2cffa157921afe127cfe10a146fa8484968cfa0eefe665107151aad7b6bff957f9f0ec3779c898698d4fca929b73074ea4faf5c8a6a7171bd3263cf97a169e1908adeac7b3d95cfe1802fa74270a3034694de89423dc548ff858e8f22388b915badc1b04d8457c32b64b9051960a5d4ad684b31c2d8543afa5672e85b633537b399a97485d4468f74985ad28b5b624dbe2c011bc1599cb1b98061bd21eec7b63b66924c3254f187d00232fafeee16f3ca502a79ae6c4fbb6e25592463f7ee7eb145dbaa4d7d32ebe4b4548db2520e3682c79a7ee34470ecbdfb4b6755443935f664bb4907bf10c5275e485cd70559b01953e147c477f91bd24db739898e47a03d6e9afa1cd9355437f3a3d2b083c3a44addb3f8613544a052804c2e75674fdbcf836c4d3755fcedc7f2488e7a9e99fe1cc82de48ad6ac17a0a9a2ad38b03d2c57bceb38484b1678aa278d574415bd3e6d355d12f02dca12677f77775506d0f844e3b3a0f4c3cce3ad081b09c3e394db22955bbe392310cc33bc5e76903c2c46541748969f6655e1986febd04cf474b1ea758dec9030fcecc1dc1a3e4d967545d7a00ef220e1a127b326d585dba2f30da5da00b4181abc7c1e3f67a9a30b085434fcca8d848267ba21a7b1a5b7634663975ce777d0892c1cd96672a6b1a646c7ab01d863c832c9b47fc7478a0b3f07bd39e11d8da08cbb2787c4e2e6f903d2721e5ef59a2811fa7065e19d64e69e1f9a1440147a8ee0650083dc729a4b0d3609e47f7f829fa1a9b59b9b06fb672f996d43780981c3e3e300d247841f76494956d40f9529c791dfac074537bf78efd8e017a8e05b986019ea70b521a24024e68b525b16986d6d2f8379c909608178633e390fea3617618e8ce5b833088c111f6d03156e9f1f4d3059f58598669a8eb0aa278eb07425e9348a17472bbe5c27f5a8051a853dc0ccfd5c3f685f13ccd4c7efd7c0d1bd3f30cfcd2c234fc5f4a29d24b5f0de189f6d67d5a7f0a77c48e1b9ca785d1c02c3ac557cd2538f11ac84f54fdc5c9644c2dd0dcec2dd598292c602d2549c45282c581096f4b4a00d08cdf503b70b33e37b54fbdaf4b987b72da3501da27b5656979f7f0420c11b354d47d34f86cb3aebf5aa992819b0fae6e8298e599d5534b776bb1fb69b56639ddd2f2aefee859ef4c5b631a772e7e416d168dd080816f4fd409a194df7faed7765a51b58218501608f5029f9714501e090a281889343c139186a783736bc48c699aa58307a278acbb86e5b1f66a05c6510922d111a0f480a0693a2251a2d0b98b75edf55113c98962c939d21cd9dd11df61ad460643519705930224aa3114acfee91f2d9232e9c8889f12ac2aee97fe262a7299b7c18236e7650740e0ae8889418646be6239c3650c8de14c6d503763dfffb5a45c0222af22c67151eb9627e2686df42edb06e6ed1ccd30c81ab17f10b428b7dc6eb066b5548744dbc33f10c037b9857b166eee6ed0cd9098c744cbb8398241b38253d37584776b7a5f479db366551e4b586f720b7d00ead598bb921c4548f49d9368273500ad01c914a8456dd005a4346cdb2057ce80cec123fbe5bb3d48520c69b367b8e6d864ab81193fa1555ccc08780686a0370be40cf22acc428360e24f018b180e2a27e9598631272b0bff68a6b02531fb6da3a61530c5aa804575c7573c8709557022f7456c2b33629a26c076c98a98a8452242558c13416ad78b4adb2bd2b972a4d3358abf44f088dbf9111c7ec6fc9212c729bc88767724d99ccae0891bde99eae80c2589ee2b3a033d301d63b22c5e209172ea6b02edfd11af599309227ee974f38d9b77ce70a4bd642ef160ffd76e853d9c1fc7a27858ccacb653af36aa478d9a6f9cbf904d437de6771b70b761da17701c138f5f1a1d2dd0930c9e5c7a4e0356f1bd0e429b2144dcc345511955bb471514771f22a53bb5ca1a178b9229cec2760c5cfe549c60fc54b0ddb8f484553cf035eafe0c508b0837671ee314c11f1dbef267fe402024b97b32b40b954080a3e7323f2eb8e58cb71652bab0c1b246bb912190ee56422e3831b6f3a6698d4051b311192485e565aa53f2eb292848669909823d1852be4142869a19752359346daf96e7e49f85f2e152cadd4259339af1658d6e457bf0fd7cced16c8e686434a2fc5c0f89c62d589da28a96b452660a78d87aa8711faae79d2732592b2bd0b3a560cad54c9a9b086b9046972729f17d53d04f9d32a9fbe5d9d0d908c1782bba71f3f0f9749abda0edb1edce33b191de79aeeeb9ab4f6b7c7dbbf1932d9ccca879c11ede04d96dfcc4994ac73d4d8f5e5701ed1038133feef02f4c01a2c8d3d5b4e767a9b512c33c16dd7dd359f04802fa2e9903f2486ce933a53a9b84348997508e10fa63c50dc57d0accadc6004dd37791cffe308d2ec05ce42c60dc60b4484ece62c7a24c495346cc8ddd71984877f02bf4c338d4ef0a2d4ce2746bfc5a212aea38545c1937008cd03e20b4e81887a20b2d0a6a8a96870bdef54f5e943587d33c9eeca1511962ec300aabdd9167a2c59048797045a4b002a626c624e4da50a2635de6b619b2af32e3e0351635b254d4870607f183290cecd3271a8835433d7d10d129b194928d6a5c06bd2e94e589e4ca8ae13c03d9183a63394e3cb220787b8289aad9c6236d35b496023a27e85ed60a14c75328b3ddb69c7cd0ee4c4def6f1b7289089795a029bafe62f7ce585bd3cd1814cfd090cb0c560f7d370d91184594cd06fbea69afccbf1f1c20c31e15c1783c4b3c144da257695487eb793d0041d88b8f60186bfc9b607f2a2446999673216bd2cc7060ac49b079ca05bbe83f83a41dce6fce9afc7b24af4d55481f59de189fff0535159aad329a44a05626ebdbf1d94d18b2657037dec74412c9c000fa5ade20e3e01f49376b6fda09b8b5de67fdf22bc3e040e1efca4a25ebf80f3d8e03da89ea107709c74a49082e39f7944784c2a29479a83c742be426d4c95779174ed814c5b3a66b151ae1a52ddb3355aa2a22cdbff22ae7695c30090c2ffb9b46e33a0b1bd500d69169831b46cb5b9673d57c01c481fef575d16dd22ff5b558de252620cd732e68421f18fbd2c2e9a3624a981e56fb684f0e296392b0ef94ef77a13cc5b4a2eac92d805d51f3011019024b492496b40ea0a2a8b318473fb9a6221970200b4311c39cdffe6832770f85569c58da0be34673e2388156f074aa42edd75f3e468273306993682db5767d3711a0d14ba75655a4c64b9061bb831b6e5c2d0c58872fdab87baed90ef512c184250ebafeae305c60f020fb802c6a169db66651ab9d677a2c971c9b71531809c1c1d0bb6b59a74c33f30e2b32200b2328513dba98e30a73f4d20c3c18193dc02cb46e52684d3f209ae0d801de4b70167bc98f5ddf0885aa2e28ab142cfbc01c99be142caf3b3bd8e8b5c202df8b1ed4fe24aeaefd6b0420ce74816c33135f48233dc4a011ab8dc4cc13fdf762bbedf24257875e2e2d15818a38cb6617283417a8aa6c6a6c36642298cc7f1a17b65ce4902eb64bf247cf84abe02942ec4cbeed68e0b9cdecb995a32ec72683c4029fe4b2d82e946d458721ffa229c887196ddddcce7e20f42f24fb7f012c40c24526581348d93aa66c09d96d1e908df8643270af9e9fd8fd613e256b8b7ff340eef5bdc6597eeaf034621d3137ce4684aeb817bc76a051dcebf2691a296732082ccb6120336e69948ee703f4c50062ec8392a5adb464c004ec477fb56f457a5ae661068608d04ecbb556b577da687a7e67c73627c4c47aae74210fea689cbca5da2f031b5e06d625c1430ac87df6533504dc9f0c5370b383172d82d93511b9d759c7bf935d5230c213962a52a49bcf748044e59be91433e2ee556ff6685ab8fe3b938be2d57db7285684e1e0eae17fb4a2d6ad272da5b729a7c2517ab1e0f550c977ae955c16cb20bbbbbc5a26a2798f5e302ead4183265370dfbeb229a4ecf2398fcdac89e9634f4c60978681e5712a064bb8e2b07a43ccacf7ee08b4af294d8f986bcb304ff82a3204a0a487b72a8f45bd8aba3f8a2333137420ecc71c2d1692e24dee4c63ffef09b67e1dfbcb222422bebb4e1009cb8e2d1463a353529bcdd97bcebd6da2f11c86089e3f20c4a63341ce245ce4ab3de841b081865ded615e8354b45a77bbd8704905a06d50c1c17bf0bb072fa79fa07617bdb52f5d68ae777e033d8ae8be6829de3a20183ee72485f73b921cd56b5a6a3ba036a1e1c4c89355856c4d4b69133ada1997ee7915b0e6e73677a1b48bbefb015595566054de1ea727e2d6513f74c7d52107fd901691a4019422bf1809938bfcf6ec19ab951431acb030ab3dc52a071498643d027a1d41adfdb31dec49acefd200401d66f30435fd0a757f15e7340f89aeee55f573e065bbffc9b3d275ee4ed7862f610d47edc0997caa88ef533a590fc52f082a472957c27cdc09651811966a5ae676a1250a11f912080ede317449c7c84ddfe6659d5d5933c22814764fce43e42cae02fdf3340f4d0a601843d8cae7219a9acf4314d4a5cb93c2eddba4f9bbc9bbcc7effb373a88f34a5bf444435f11eb76f3934a4f404add9282378e3dc15b06c008f766fed68d1e15bcb27a976bd9fa54ea0201d986bb5317f40c31cade6f4b4c203aa967d2871214ee5765e88c8b4b6401faba2b4b2302c0e529385d90b4430c657b15531b57f4c8e3373b01c225065c016998af985014e5c5e8fe99893b300b96ed219b6b5468e4ef9a1f0b960456e299e138695be55514f1e6ae3bc8ef5f525b9884aed0674da427341e50163e1da6e72a2a2674d8678cd01634473defc80520b38ba14dca438d0617ae9642afba9ad3834305f7fd74cacc9ebafac2f4c74d3bd68ee6e827179f52d9725e6599d2f0d79b5668c53cc76a502e1223c729f20893b2cbc85ed5c02ace565c9c6e2d7161e9c96a6eb1ecdb01c9f549f260cd4884599906444059193ea5b27495be531a64c60a375d1caf782b9c6e87deee7a2be5754434dfe11dd10ad41374608285e23ed834a44e2442f4e804e885b556e7a41a3684600e6bd80bc9a21aba2f51024dd1f6491dde1fa6f198ccd8f5ce8fc56d8af9c6fc798adcb52e96572e90a051e1bf94dd36e4bf40d851920eb87be3ed26ac19d32effd0d51947f1956cbfeb13b0fea0e74630915d1f79bb786363b3637f9f3709f894cc5513391db01cce56e827f34738c26fbb06043b3cfc08152ba04e20bc4bafcb94bcc791e7560f054820f3226c58715957015472b5aeaa6bd0fe0a0be6b328e14e95a1ec28928d1d3dea3d85b07d9f2a685333acfd0f4e4f9800a911d2b83accca03ee80bade8909cafa71bc4a738b05d56839f7681b365070707c19a06900a71851ab10e5454f3ca17c793b41cb38e1a70bd96a2c38d9d84c3172032436bf3e81030d26d35c2b1de54350d7f18f24fc4c70898a8ffebb14d378a256defdfec1fbfba3e5bc54472d344fc1ef7b392fda337fb208aa4acba81da0b9e03f9d71871cc1142e40f09f57a2afe442b077d05dd98921afa5289630a4f699afb81ac776a99dcdbb919728241c8b28701b5eddb2aef8e245b88407bea83b0ea893442c61370021a03e5048ea818f2e90f81ed46c7cd0e25827071b00f4a01223fa40171e1642ac94c184e212486ce299b2988515b187ca3ad1c9f45d85bea3fd4705443952de219720fac7e540a77ca02d466980e21dd140d2927d38979029180f10de1c8fed5d368ccc6f401978475de5e12091c62d0149f64c615150fd58f30407cc2bb3923d8da06da6a8b5f52d1529eb9929b32843ea11c5c8baeec819c8afc5848763657f84f6dfa63fbf050b3fd82485e49c30e29d917c29f5946fff9e6b80897fce88e0688ca7e2b878ca1e44fb4b4905502d0458041ce4cd42f948099266302ece1ed26d686d49881806021ce9e148021c6b21d0293424136d047df2ab35930927f1f41c73f42e9bea61765b54af114dde4b3e26234ebf42bd1108696765729a8927443bb53311537c043102fa466c854a4a4955ae5800c7d479abab134b365e59e9c72e83c8c8ab35a728248464794c4858ad14339ce8d4cc57b142dda3497775dca2c1ba3412840d623bf28f6448b4c2ea5d1f283948cb54924b2d423df8761c4f5782c3b12487582925c3a10153ea7bd91708e9196f57115ee4bb4f19708bd23d391a472b981285e486766209210e2c518ca341884bc22cc84267e004cdfe15cac0d7a1062ced52d1d44e1117ca4230a6fb57bc33300f36e9906b476c724b6c13c72ffaa5528c0b5b45764c747b46715688ca847a7153213de367f2b0c7eba016e299455b69d31e82bade1a677fbc3b702fae29a5689e2c90351cd1ce808b12257a0a81e02d7aa7e65f88953bf44ab5bdb6dff66251830ca3f25bf540dbac8dc7b78cdd7e29378071b040de96448ca954ebfe545842dc40a712887f35eb0cd32fdb6489e6cfe715c0e903e8b212b7ef048abd9d66053fe02d60f5ae16d1233a2cd5519050a92992ce98aefb72c163e35ba664a259f6c17ff66fe19891cfcf0254ce9853a8f6884c068031b553d9eb990ec723dc06ceb9419689a14aef187d74ef71675614fb9d753af8feec9d97c89abab3ef8f450f55e13ac0e480edd2f0fc0e53e256809d011cf6b854a84eed9c432a33f348725593419df15eb381a2e730121a881abf7b29e600d6419a008340565bd7c866e6e10a1ccb6a9049ee9a94d1fa35c5c19720b6e25f54c61821879078a03ceeaedc6362bcd0898557b693f587a70971581fd0518dd6a83d2bf9cf1f05f2b30a5f0ba290f83849587a3b795c2d1e350b25e273b5953d8ae5c8858743b5a09d0a2e9d5f772ec8f1226703dd47ef160622d3fd2b5787f17963393184a243ee6fe0861e8d48cd1f97505d6701512ef41da07bb277bf79bb973027fefc9c8a34ce27aa50a99e207e54bb40970cf63c88c8104068a675d515910d24b777619dac0b09b022b7f8e6caf8ef2c2d7c91f476f89de58c90d4c611143a7f772ca2955eb543ff0d7ef5bec1d40cd2b6d4ef97926ae1b98d709ae9a819389e26445727323fc7664bdb1c8f5bad2ef90f1dc82ce6a4682b7a9effaf169adbcc3db015b357fbfa8f9e773061c9d42eb22cd795192f4da985833de501e775f14cd58af70cd2a2c1e71849602cf265dc8a5c654411f73d1dce6997c1c6a02633edfb26da42c6a7006728ab1068f80141fa8d5f9630084026b2524186b34ccf9e3fea705dde4606a797e1c3435a1fbfe8764e4e5ee211e55cd368926eca0437fe0040fe3bf12861dc21bc736891b23112631099456512cba94706e56f50e175c1153d36ed93c85ce8ba194161efb5f9269bdf86ffa35e626f65655e0e1bbd9becbf1853d6bed5685f3fe1b2a08c3be820f2853b5c9e83c66f28530d135641343e3b06498fde7e68de70837ca49b801d8a91e9c8164e23f964979e99766431b86ab2fb4785dac439876afc34491ae029c7548401ee818d7bdda9e00a795c303b679c9ff49ea7d00f5587c8faa59e6744926d643ad35d84e2f8a67ade9c476dcc8c19d56ad6ed1456ae4f0284815427c49f2277f59fb1faa29c6500f1baeefe9cd0df345e1a66bacd6adfec55cf2a2d2383816b48b6efa53ba673f121e915511ebf3ce246deea71578581a904a5ebe1692a8b71ea8fd9635ac82084625148c9fe6698191dd9556b745f8214b257c41a3962df35058ee57b6dac70ad887e76b6dbb35515cdb62c320d3b8f284cf94ba2e53c8f8a6cb4ce4a49b607125112ae54105d918f8b80670e8ac050a41562c3c73436c8a928bba6694c99dd5d1bad666879203eaadd31cb33292999a40d16d26befc6fdb6bc931622ea8fa0333843a397118a10892309441a83b82f84ae0fca6987d56972dd553229fe2ae1e48a80b6370d030bb131fbdfdc1f63437bca62fd35c4790ed5ddf0f1b3079231a9926c135072c58740cefedf2ad536922e3012d7482fc2ed5ae6a401c11aebcb0dd28a0149095ca1f27a8c13722c782698351ae6f7819686799733555a5b22029891d732a365be636474ae59cd31dad8c2972e42c6ab1a04b0a43a9bdcf1e6f1edc8420f10b7c2b189e148c60f05ca77d8ab184e0ae977fc8ebca2c4ccd8d7d03e8f46a4f7797ade07877c1459732a0898f62f1dc0476fbbe4421c6e7dafd02c2b577a4753979b583072ac9739b79ee952aaa965e31bc34a7ce2441f7605457739c0ecf54e8cb11c9604679b01faa0191869a98bd942d11ab993285655dbe54e2e920ed5038c202d18cb7a9baba3dbe66e2dd025ec5685e2738e3c10001ee0f0f548a71e4b47890280b675a028de6f66a8082cdf4a539cbdcf2959c1a2dc148efd55218fce24d410d401b64e5a43a2bb4bb8876c75828931a1b86da756dc2ecae9c4c4d22396129a76274c92f0df2e88753bef5b4ab8fa9a8ced53e2352c16b9b005ee3b5dc14855520f2f59fe210e0b82351c0517c1d8d16927c681b2c7bd1d42a6962093373ae9294fb7cf176cc3eefca7eb2ada239f4609bbae5bbab837ef2156d40c830203efcd2f0e289aab0a138ff68540dc0712551149b4586f631ba07d6f85004ea84b28c1cda635af7c3b231733798faee680fb909cf1c6f9322da48d17072fe433b64c60b256950312dd51b932087bea40ff0ae20ea468cad25d79fc0ed37b3b9305f7864b111ba58cc4ff7d23fbab72170baa458590fde830231d98caf2be60abacfa9150243bb86c0db1504281c9fb9679f33eb505ed5204a9fb7e5c8b56b3dd3788d328e2a9d15b445f9ff60a133f4c6c319fc1dbf886d6c98a2097041870447cdd7738b7c81424106fa275153a68206ee7f21d92da4153cd83c944f827cb786538db0334224640a096050075a01044200eb135ea712472cf3fbf96a67d9180f6ef247f0f89939e90b159fe1f3786adfdd6aeca0e092c224b8006b17751584ee068b5f5695e2966b684aef5b11aeb8a8fd2044275161210d9acfc8998ee926e7ca16cf38eee05303f39a2bca2f8e081954032bb78bcc3ab956a5b2060648fff8b5177eabbb704f1b5555b5de8b80ab10947cf52c1909c7784b8239e60d25455f35de3fd4ad6f6614d6fad5e596c59cf48c98787491785c7725a7fae719da7e6bcf43499db4b14a3120bb794bd99f31404a139f93b8e9ffe6e401b7e200b3e4c9f6d32310473021aeb814e8916c3ada7a5e82ce39246b052eb9219e1ff4d5a00e37140b96dd9d18fde32874334ae6ce2a22db0e31318acf98f351ab5b0e4637282483576f3906ac7c90a40d2a7fac82d52e208be812eb4e05fbc939496122560a7be667e82763b7d60d6150c7f09e10c14ac9c62cf551c45ce322e62fade950371aef2f37cebcb8e1ff09d302d90e9b85ea974e892d929f383ade43a8d7738129fb5388e388ce8a429783d6602f1c1c6cdb7128cb14afaac30283d87f5745aae4a74e5a72feb93da962033d6f4f49400fbe0ecd5bb40adce3f8fe41abec029d5eedae924d0da2df33912e07e09f40d9f998872bb06deca410f84f025f99f02af712e86d3e5e800f7a80da30889e99d62f5887d0410931c807f70ae12790ff941721df1fc85f92a6917c4653c41dc00c7af993400209ecc4d0e8e3c3d743aa198220e45935903411f05e4a033024f88724ea8178fba0eda71999c2c00f2bf73c888875bf17f96c824604cc1688c602e13361145d9ddf11cd5f1edb9e71f5ee2def31510c1578593b75c86c6585b6ae3f2e89d822507a1f7af736133c8d1ff6c9f89d3a09cd2e1ad8dd53a91b9970430699a8da912a6efc3c19d82fa8091e28d703c37d8d2293a3d6baea2445212e8cb1dde0ca857e13257ea888071729b78a170b6b6a805335edc1fe09946f59fd029ef046003dcdf9b02b2272d82721cbecd40d0a8ac8ae0b4e9f4c71c63076a3faa191aafbf096b33ea760bc74d5d78f0826b7b03657aab5b67d9f2636ccfcfcea5d9fe9b312e155a8d0971a78288f78b6a0bbd1384f40366383733f59657cd3151592a4d7a6132cd704c3f025224170cb3172fd66f49efce417cac2ea4f2882d651d3824f9a0320b493df7b410a38ad2722032a9921d06c655cc0c2b5bc8a6476b27e132c237d22d5880275f6a48444be5584281c0d76afacbd2820a766209cdadbb523838535cc5f7f69be0f34e59ebc9bb6ef9327a24e79b60b0105382b5b7ba673ffe1251c2995cbef1ee3d6efe8251ca5e5deafb2c9df5904a401033dbd0f3fb4d09a24b9d5f28b29ae396b4fd7100b6eb4d50e62d1af29f018930e0f5809082b0abd17f1eb8baaa0211f2bbf6cf1e2a51528b71bcac670d6df28e3618c8419dc63d4d5bda899e4bd4c004f13e7bc6f6b88e287de654a32417a8e273a90c588404653687716d675302d3f58513fb6b293e9a9d0c6c868a99a129e3627bcf25cb531d7a79d5aab4413871c8a9ea543d5bd16dd3b811b6886772a65c3bebc39d4e59378f1d63a2f67d48c6dea1f6cfa455dd8fbc38e939e2406d4e7130095f732b307d98aa190a4a32a92510592198e817211b43bf640b8b795b262a9a6274227d840f7605b33181316faf3b49fab71ea06b846f07f4a95baa2ea6e24a28c514dfa730b88da2c698641005672ee338672213a88f17441710a9858c9c64d6c7755689596291866eaf2d7c09c76433cadc46400fc522429928a004ad3f748042adfd9513c207c0208048295808ce7992216693e00b57b8c4bd24614389fb2c86feeb60dff532bfdedb74da93f268e4dbffbe3c0db41aa8ac39399b7d3b0b60d8879bebff4edf4cbc52e84ff592521a3dfc3b01e98d42e1cb57d1fd6de43e9f77534d6b2922a8ca937a0a6bcfa4c70be0000da13c8dabd6777bcdc073e0e08b95f3a3efec6cef025145dd1fa7493930c8561e121457a653ff46c225f1a56edc767b0e61e236c3529f19beba65e2362ccd2715117aab698829e1af7ca222bc91bc101aa9b0a5012ad6c9d4a35dbb130eeadaab51978c5cd5b04f0a4494fc432b1e485fe3c4b8c0d42060d5018f79b3642e4bb017fa604a00a25016e62f72ad335a8ca08516f516201b7d116571092a6413bfd03e3b1714d83eb6f2aceff06eea44745634c4d44826fbef2f7f372da0ee6bbc34cea1033ff82d7fa2a831f0067ed02f0f1a0d79cb26b4d0521da7259f234b25b8b5532c12659de38f719861703dc9b4cd3083324e0478259e42483a61d6a44e84fc3285bfbeb65c2c8e4960dd0feb02655f7418d81ccc99288abf0486318c8fa04c0d82cdb46adc20600e841e4168baa44f5bdfe615c66395e141f76d45e31599ccd9189afb234564a1a787c5e1395ec8cdf4a3a863cd134f55e49409e6f4446d3c18058fafd1295b2e19d0666b4fa2a7268932d307ef6a9cc86e1ad21da32942b1593c2c3462f9d1ffb36b2d88683ba6d7bc918b34cd5f1d412cddcc2f8228b34e1d96933c6c39bea970472655c53f977348e1412f7d0e124b478cecbd58f4a5063ce2059e9536ea47b0e43172c2a7c76a8e7bfb3d84327cd7ca671c957cb5c8b8d14530791061faa95277e8410eb3bcbc6f38daf0d97399e6467bddaa5c55dbd309a32e6fce3ad2e8940f2360dfc8f77b194d2381e55a9a4823a2ea3238041a4238e8bba966123f548a933c8501b10bc6d8639be1053a756c20e46310cbd5bb056ac50edf1ec389f8ec1c041074590c964a2122ade63a3c7857efae06971a23a26a0b18a4cd9c2e94cb146434a928b73a7aa6f71001ae4f61d0884ab43299117bb1626ba9b503f81a302380eb1c9275de3002749e05f112d29f5d476e25b9f97b905787cb7c70ea14f39909099a739c17f7b532216e5dda5a7156e2d907722b66c54ab23a69e0506039a33a18a3abaf859e19e1609d7b3115a4a4bcb6e690e459150b416a587202d30bb5395677059bfda741626babedf072474110c7b8a843a17a216ac57a9925142b179f89e537d0cd57f3739f9ffd50a6f4c02ac5d8443fddc2aaf53bd9f0fdb018c53db11a97405ea87b44b59c85014fdf0a398caf91c670cdb0805bcdf1e741ec4d36ab77e48531bd6afffbb96e6218f79d358a84e313c7bf4805660c38f76e0aeb106fee5197976f2f9cb0e6dc90e1c35fd09f9c68e5f8e3f45d8115ec6f8fff05f772c8dbb5c0d44f4d90ce03336d579bd68d22101ef72a9805e9c7b152bfaac0ea15c8f3ac21b1420c820d9dd580163fdd743b0ebe9a26bd0d6d2197296225e7b18f3e55d8d26538c5728edc98dd85567797aef9298e00f13c8e9bb80a2d956c944b42de90731553906f8f41be77af8ad36e7cc4a58f165b262e9b30466e1f817175d3a1d9dfc36ff68a0da3121ebb820ef72888c0331d0f06b1326d76979d477ad0438ee97710cc1c86a03a21ec778c4bb7b18fa9e7c854df32ed9658c0734da9507b8e628f4f3aed61101d928b65bdcc84cd9c70ed896190f58bfb1be0d489a4b52dc003987a0b4689642758041032aa394fa7b8e04b3011a01c11d020944b2cdab16776f0de19e3fe91e0df5af3b067f760e97245383f4d217e44a815cac4131dc5fedd83e89302d9d38c2997ed03f868d997f3a0083ba568c8ec8cd91082f34175f74c9c9b37df2627262079eed831048b345613f15c2ba1b20bbe40549874805d1635716205574248f2001195a9bd87dde611de01cccf96932a3f51475930903145ed5a5c481416fce8ae0eeda25e966034254c8624db7a5376772e735476cbb0ae36264e044f4ff53f3870f21a7199cd1764918a0c628b054e915e41fdf34d9aec399197827917b2bba39c0471ee85ad4c56d1aad9f2aabf35eecf0240817f197d0ca5844acee815619c6afc4df5c393e8c306f5f26aad7528f80321577e391950e62d8679be6e43120e186df31a8091719dd077c32d82a2f7a90a2ee14eeacd131aa6dec47637b1ea59f52ec76e63a9cc1200f666325d107dcb41239f72f0ced12982d2b6cea4f16bb6f4fbd6aed01f661c877a80610ee1007f5e1cbc83c9507725a9068bd3f8136bfaef15da0f27966aa17cf9afe610771f678c5f70f79d0bb5bfb4b693b9ffd0928c0297ed92f60f06563a4fe924757622554f32d673493135cf3a9ca668e7ec46e23ab4b01735857d18a6bf06981958d7ce7829fe0c12c34c646732fa1ce96141a65e5b99ec6ac4b8c131eb053b459b91ab9b09cd1a223bd789ae6ed3e1cf17e0b2c76b90d34f1cbcd5a002d8354ef18c01cc9dec8dce67e989119841dc514f427ec2d505453fe1d4a932f46bb1f8e7d9a65cb9fecc307362a5d7eafc3e4605e7b2364673ba95043a78cce173ac38c710b2620e06c5370120c15869299bc88b48eefe98278a83d35c46168fbdea497c34c613b31d4e9cdedd4628c4639bf2526fe1121a1277b03dff90605746b735eaeaef73fe08ef8e7e333bdc8e9c00c245840db48aa3beadf5538b3ae43f098870d05125cea03bd43f6cd4c055eb8547bc74ca32d6378bd0af58a846ac0965870a49fc74a7ca9f4369cfad9c21870220d76c42fd4eab9ac029dd336c0b6afec4f3a48c58551d04c6d15b9bf18fb9c2c2890ada1f046b88fec1391e17c60ff0bb9bedc271d6fac69610f17e8ea37fe74a176c82702f4cbb1c1ed44071421a6e296a1945363ceff1ebdb3943e72452c35ccf7765f378c4103cca698204c23884cb6048f4576c7cfd9de75667441d29740018de41d9e68004915b9a715dcb142480469f44b298bcad5d7f50a110472c98efa412de53ca818e04066d57415b8ca81013cdb59a006c157ea511efbdfcdc58d86cd3b2d4b96b209a53591cc17e3cb00762d5f62255618be056110092945a09310fe890d789b2c106b8b6c8abd6b54066246732f7e5575628795bf7d4e503358f93505bf1c30f136a43740e99322ce49bf9fd6ab4181a0f1fbb2755d8d993d3827107d6d6f8cdfd7691de9d8ee7f96212cc5df2af3bf437a2663719d788c39bb36a1d9a59a7b5d7ed4428581c248863bc71c33f3f8a9064a504f41af47904373c583e04b971b4996907e236289a21265b375a329fd217223815c2182639a4c54c03f038f01f2cf302b8c1df57710c4e41e58a8dbc444ee2cdc05aa4c168ff056099f7d1a9626c762e9992b459eb28c3f7db9ef9d4b63160422801b711f0413e0bb555a08336aaccb2aeedd111bb913ca118319b0061ca2bde5d6bb509adcceeaf11d2ed69fc6874cf7fd4021d8d7c8d7da0c3db868499997379cb22c41b8a7a408e7e5c1c5450835fa9e10d3cfd2fc9740245f260d4a0d2bd85cf0292cc27e7fe4858cddebd82137957308175dc04811a349e7f85f2c1ca58dfb9e04cc843b66042e0b40443f01f505360e79d0c0d0d7493ce4b4e7c2e00192cfd717b0b39e5ac2e940012072d8772106cfa90d9bc180a1c6dbb3ee876a19952000e51dc6450c02caa5ca0a11a12014e4239947749683af4f55352056abb144395d9df4d8bf67d4526925451039bdda0d1c744da5e4575145989108407320efdfe34a1165aa3c4608c0bd1a333bc68ea071363b64f8e228a9734727b43eb87df8410c0c1b05ea3eaddbcd7f53bd179817454c7ad158667143be6f7c025410386475aa646816fe4d30e6510abe49c585a5e9fc61e6262a17ce2b153c192ed05ac637a34db89f52a7180f9e0022be561ff29bd901111b5f22a98fd0ffb698270bdc19718833fa847c615f253be815c2570c5c9f87fb061cc63cc50741a52160eb2f6154dd41a74658a480420a1ddcd214acfa5f54f2dc0f108c4753a11d7a9b8641e7c9fe3744ed3d183a6b888fda6417d1f27c53cac96ec2cbf62c6268b240234e4283f07323b1a7617f726151f2e16c668a78cfc22507b1a164f81e2b0746cdce2d0db3c63f04f82456189b9469d6768dd409c370526c6d3fbcaf1af7d8dc7675b6bd63e05444eea6d5e41628db2035349dc171e3af02be77f81a6822d85c29bd5dea00b6d9e45f2afcd18f0622fd179c0f05209da3435174bb789ccebe4a627f11a95692eda3d858310b7a036d4a0eef435c74a5c9fa344a9cb37983b97343b4d2f50a5a42bb88854055d14828fd99e672694f309aa168d63b7a1e5b8441d5f799ae4fafb4c7945d8cca24d40999fd8981889073c7dc3bbca9b060a0ca2ed5c130920b3b0c03893bb8fbd3b5b9a79d92bd31cff9a8fe53deca91d0f3f5c3f7deb1221d58a894e0ff93eeabe670a146b2f18ac119a02b2c74edce75900eb87b2573e091034eb1c8daf9c7a131de8429320e6d3e9116e789e4a53fc619cea1e670b48305bcfb27d8dc05452e1f851c3978d076bcee70dfb8620318b1fe7c9fe3ac3305d737f7f51a738a500a392e7c8e0f2fd2dd7930e5392daaae1ff131cdc3800f1bbd40978907523751d460f1df51c0e8c8b51d9a0dab61b7f580489eeeac852ff6e8ffc6f468e8f9d780a6a650e9ebc3abe5d797e021a0f7597f2c6346252b7e8861070c1159adf9955993bd1eeb7d0ac155864f4094f9ac658dc85f2f32cd9eea110fb58512ceb393c8ae90aa9e31012d08ece5927312938ad0669c0a1230408bf6bafc395ff6d965c0aa9b0687a66639093cba3c5e8251e5f1fce2502da951447c43d5d1acf9985260f7a092b7a5b3e929375e635bd6a8829a1a1ceb4768a912f6249f6ec062a0ba9c0334b4b0017de97017fd2a7c2de60ae95f3be46460010ee4bce35e1f7ef15fbc0ba6970f8dc202fc1c3937fa6771c8185e65fa062b7e1b7f9a2ba3e7cb829abe5f5c3a527f60fecd62d271dddf1b7ea1c4ff19dc0dce809f26476b9f37b55b8f74012f2352683abb408053415a89e912a48b399f0b7df5a15cfb7436c94ccbe6d7ea3c94e2464e51a7e438a5ddba6f93ad9369884be0034d000a401ecd5b43a68ae644e7761f535b081cc420ec76b50165d94ae85a8e6da6892538117e41ed23cd75272cd98b6ac35925b03a17492c23875231abfc0f16f7b90c3b58f4f92d8b361d31696d704bf459abd1cbbc3aea66baab105f7b49b8bc79e7193aa07e696442f3a327c5d097f0bfb2f6cec225cd137807a8f87cba1b9fedcc816e1a0bdd6e2948f07e2b6fb0b71e3cb8886f37e0bea940119a8208ebb4d06106338d04081291cdd753b1eecdaa2270c16b2093c71d53aeff1494867d0c4bd4606785e24b7ac400301901f4209c54a911466b494b4fb183f347178c0747ff1dc6432d6b1093dbb36e292cae9e35fdae32ca9486c3c0b15441ccc27a90c062c03766fd07d77ae2ba283ea85f829e46c0231099d836da229458d5c700d3aa092d510b2b4ceba1ec11650b985ba1709604ca8804c3d3c18a4811fc433980e7d99df65515c5790f10410b8052080ef208b145ab7ea40214168461ea56d93d45a8426c30cc2699e812ec620d71cddbf31eb3974c35025e7acde5dc0ef5ac054a6e30841c805986cc1a42d1a501c0abb8e6934e1b56a40d70d0499de386a66287de65e84962c86645ecad5379ea2882449035d512649a6f6c88a91085de595f4c3b2ebab803d7323aa00c0a7358a47d83f2bb9094955494fe6853495c4e52133840988ab8a72b948578afcb2b209c126a344d56cfe56b2ae33b5b89f96c7d6aa35b788bd06ef573fb71a06075868e4744af71a4aa0b665a4fe79576219e41f2ddb8c77c498ad2167f11aca8c9376a0a199cffa877ba059bf4f461a1373a93c450293c3300103d08642af2b8c1c1ccfbe3fe4442194786d3ce3ca22015bc59259a5ff83908dcbaf623efd2c0a908191fff58aa355d48b44b1a82dce31b36a3abf6837882daf5047d4f5d546677f894b956242799e3a525b7ec3e825f4e003055567cbcee91b265e040d82581a7c19f7952547b41f157e5752f88bf60c5fe62ba56d0de6f45d130007c4de68ffc66af75ea5e89235a5f4b90a00647e79a3acbc9a0e33691e4cb1f18d0a7810442b49bfba1eb77450bc27fca89d6c3f2e631e3c2d040cca1f5579891fe1752f493555ccfb29e675fb7d5ada7e02c6d026d049a3534b342196b075e135ddc6078dcfdf4422e62400d5830233ab6b24105ab164512913578343620f3713d31a6f014b4850811dbeaf506122feb2041250a77720f52e746a6002ff074c9ee00829ad2ddcfcb8abe4b1d6d9832f9427673e9b8bc63de25ceab83be3aae9778918a1b82d6549683187c900bbe43571c4dc3673c480a3de7c9a8fff20bb320c84f2d20ae2bd98dc9cbd220330e27a78bcb1ba279b35e39ee18806cdfe7d7f6e3af5bb03401362a78d994227fd90ae65a5d63996280d857a8999b02e215da8d623fa12f3444ac98a94831d38b07e90f2cef0ec21ef7edb0e575a855ebb0a5aa777093bcf435601b82bca2b22949166a751e5ff79b046b76d730b000dcc8d75f56e7380e810bee5775d244a05f5b8c9568504f39dedff95b53ce24e68fa1e98af8cb77e5631e6dbff8f3deb62620b04ae1561aec71c8df9ce27bb7b7d64bc0b8de3c2d8525778fcfa4252e51ee6f1f366889365494a0853aac874dcde127c9941911b8606f46a9cd6a85dc027b7bc9cda337d5bfb04fa7bc193d2da402cb1e9c3f3d053b6301360a3806692be13812076fb9bb56f519ce815cca7aad43300992772fbabc34a7c2a30dcb375080de4403dc5a109d0ecc2f8de6f19c8b263398b839708952cd354ce68dcf2c6561110235908d65ef5eb404f77f97fb948b8c82108e41d4337ca53dfbe15f31db3ad487386435507d773e59f90a5e5a1a3651cd45b02773d8f71e4f8064efa3a902e815e1a0fd98446a1491f84d8df6c8e384115fa6d1ffa3265a184d3b98ccb21e885831ecddd4ec90663367c0620ab7810a0dcb19f101baeec58e171e4713603e69ef69c946a041c7cc1ecf088ea2956b55c8a9ff8b619d52cd08da70aed2f47a20fdafcb5d4f8912fdb914b328670ad64da9b0d335190d3399de7d611b9c6256b3bb128914c3ce18b34abefb09db252f2107fcd82efc9bc30190853c512156166a03f52a45922e9892f7c017e58bb3e8a7f1f538840317ab8bd931dd20cf69c64b4ab6af0cc35c56e786ead61cc8ccc8bb3c3c6bca3a0808ac03b8822f4747141704e0a783b94aaf7b16327a9787226d4f90786a832c5f2ef2e6b64111d9015073f4c8d67687a45db95651307ee1df2974ca5ace5481e1f1ea2bd6e4e41cd4036b4097fc8ca3467e030e785833f87654bb53570c28f61d52ec5aa93e37dc9f72ad8a2a30058319f8abeee5846d454267c231c982bd9a760a09dfb7824dd7ffec872384b01efb78653f9d84baa3e492c22a741d1b90fce50e79a877a28b80eb23061ef2c3b623cfcc0cb8a13c819cfe049b0b0d376bd0ddc1b8d2df6f249735a5754b6d16b42607981549d74e0538d751a716192777bd23357bf88fc3141d404bae76ddf7fbea845d6c0ab2472301c1a6d12274f3d662d91f3cb94222f8cc10e161063d204f11cc2152ae5a6116fc294cf47811e202a8296874577f8aa65c7d838c4cd9169052fe26a6382fa9f4ce52e92a659d41b6312bd1b50d2860b1c7dee8375c43ec40900223d9e35bdae127c9b459ed75dbe4f9caba443d2926514b6440a11362a04ee0cf73e407280e6d607f3e5c0646148228296f92815124cfd761bf584c90ee09ba17ae0d0cb94f414a65808a15360559c408fd0cc8bbfce46765eaaed9a4e726de66914211222d901d6fe45ce9b8162f1f60d9a90b31dd0d49972673afb202fed1ef043630776898c49ef67adab577e509a0a1a6f28f7e3d12288332ed022898c6716206176d8c9a61024a9e442adc7adb34ec8046447b1d0af89e0853c9491e871012940af7d30558190e150fba91bafea662a298bc726de678e109046cdf7ca2beaa64534234650af2c3b3f5e39580f8c8288adc95090e0a7bcfb26a7f1d3cc0c815e96e2a1c24bb699ab000e8a08753cbb53d45367116130238a4daea5d766deab0cf1b75376b3e3790f21a524a274bd517334da91689bf73e3cdda52854175b0e0d9058bc99101266105f0a24f29c8ac91420af246a264fb2ba2e0ca20e361414424f9a4529d1b34ddb9ce7af76f6c977df90edf25fe1517815c1e021de8c90025f64a97a0722d9afad4ab8766758d2f4461bfd50c9a91f8ceb27952a466a7f01bf4aebb3ee739ec2fd7e2d0f1eab3336d22b5a8dbdbe802362b14496f6a6c747ac0ae1dd13c1d084eb33d7fc1acfb77623477a5acb3db14f36572abe60141fbd4b56ac608bd45462f44d28fbf432647e2bb105443529eeacc5fec45b665f5009d400c76dd6d24a99a7a4ff2fff533bf9e931085aa92fc5c9ed7875032bb3d523bf8851b154cd57fcedfe464e908c1e984fafeff246af3f8082094a92b8d10302f001af04abaea3892e90d9085a04ce7c686dc64c9bae933ebadf1c556abf84f6d6b9fbeed692fa12c6e906264ffce27a9be730150c76ac24735756313f79fd5693f399bf50c823d5fdd8d7230d389afa31f829183f079f5e68822f1d0e891fc03b0bc384550475718205b5f5b1ca2d4b5c15acb571dd3d99de1e346147958693b1945054ede4800f78c357974c4168ce71a78703d63ec9996fdd4e911cc6cf43a941c14e66f2fbd3c0433497b45546e9e244fe17ba133022791eac05f9ae3d27fbbac14e401ef94321f6e0129fd0b936f4f125978873d5d6931e6fb576a4cba0c7834c7a451d8baaa5eb7149cf7d86c43fd55e3a9d311ea3b297f54193d741dfa7b5d024499735d23e4ed0a810018b7437735935ab0d0162850f01b1be88f6f6124892448377a29ce8e4149cace7186409e9cf99d90090b3d007d3a83ff4b652280772fb9f3f4eb0ac5888c06fe1d7745769d312fdb9ed0186a13b03b13d2e241a1e91ff2371de143e982ca0b4d99b74296e47b9671e3b7d90bf9858be611a5f1d433e0fbb5be5000c03405ca82d8034ad2afe97b6ab6421cb6877e2a8000308f393007a7bf13403087068176e16a16ad61a4b5cd0546a601961a263f922adfda6950131b301632e0ea696c1921c32e654b658285a2c267501907930620641a2a028dac050e0d103627a2a6a154304de401721c3443c231988cecf63b6b853ab5ad4c32b4a1086b4c8b1e013ba52f26c96c8254ac201f85eb73d53a56eda2e4b2caf05ca4c90a9ba417e111b6d17c84082370b7e0a0951594cdc1e211d33c11eefd09653f4028ce32b8697b8837bd56e216e73d71669328718c2499b453ee458745c462c386b8f3f129382e3a4c54217bb2156cdc131286d9b68bcc7af32731a8f03d4bf602a4fbf9e14869f0aac5dbd281de986bcd23c2e00a91599f302ff39f6947aab6a329011f584191a58637c7a44f105d6b39b41947686418dd33a36df60e621c91e2ea9e0558073f7a20385eb359ee016a9c697a17ecb78ca760da0b1330a7de30694c6518311058a8502e3862e507779d14149c4409ae8b10be32d70ba038201102ba80e295da21db101ad32a508796f5e0597a49c03c04f33f9c108268c861275bbb0e12a9d57425832dc42b682d64e3c9af3e157aa4408cc48d4f16a59a7f4860950172077d2b4693275be446499064f113846ef55aa755b06cac23d2179e3a951b528866f2872a4b5b599367e0c9625babf1919b3891836321e74c30a7701b2cc68608ba2ffbd986139883a47e937ab0972719d0813605bde34bd62e2106baafa345c03d6a07b8c8181ec883bdea7d6e5aac78414ae6402e608477a9f3d5d2f190f817d8be1a80f78d2a304e01ec631400b92f577d585967ac41f03511ffc78bb54a33cfc21317011a46c1b076f84cc4f06b42fae1fcfaa409ad5b93e5f6be0f0a60b02ea5024162856e3c263758b91287a95b1ff7d6ef443b6df104560a3fcd454f76fa30a5bbf6aec7afed8950e5e899ceb586b5f7e4f112f5abb49705059d4f2339a709d226c4e8ecf57e300d060b4e753e7571a0a71d7262c974dbd14d16f4995241fa9b9f8abc9305b81022f8747fd0ebfd7d49c6700535909afa36bcdee8cf1f8f5e757f4fe51c4d37b2d23a58abe1027bf70c445d4fe540143f0dac1bdd65477e96679efb045119353e2d8bbb87ebef4ccba05460030dec2f105e4ec8cbdb6237badf6c66c009d4d9c048aad6cf8274b5789c809dc8bf4c5b48141010977d55ed8a5c1c6b1cef254fe8837b1d0617638e48474d70cf38724d6d5e7442e4cb0185415aa02b463002d052bd4ee3f92b7641c1a33e609262611486e3caa3a7671e275e84e803b408c408f922470b1129c58a563941e8d4eb1784a614805c5a56e547b2637062a1cda4e737ccc41f1487874e0309c8c081dabffb52347eef0de26a73abb341f976f82ea82297612051a4f8240150ea5fa0b07c6521572b4cb827e4657c57e9e8e08362e68612514b75efc86b805af9cff34cf78d74f7f808d471506be09d0488297c168917044de93c68c2776e578ca6b1108d79429a8ff8c721a520192bfd560ceca52390b16d06c8b649aca0bd9e9f3cce24d2bf1fc6353aca13f95b1a555740685bf7fd9400615e76b6f64221419a31d5f762466068051630aa8fb144f2f15024c36d239a2efba2522a7d8ab84d563805cb19ddcd91c716b476c0f1538cbd034ad0fa73f29ea898652f712d060cbc2717a50dee8a4f2fbb86a350796e8676ae1da0737a83736090944627c91775baffeeed78a33f8478fa68e3cb496e129e41da07bd6fb2c41f17c7c24f803372c542a0ad7e46a7e0d0c753d95e60e8913ce694113eec95d280ad4b55488db6b71350fc6de4d477aee70885b8a22964602ac0351fd7aaae7c3a0f414239d150aecb50c07754bdb8c7e566470a58f38ae4f6b4eab52ea4ee2b6cdf970e2ee609179338d5ff506d46a52621fd44f5cb1550d507443dd1044e7f22bfade45b97690906d19f6788ce2a4383b64a791dbf395d0b1cf9076b1cda679908ee4a7ddc45a14b725101b386b17e493b0ccfdf647a01f5f115273c2eb9eb9aff8e20c7c2708091262211eddc41434516ff09dbc28c36fc11b19c6e44181070af03b30f8bf4fe41e69b27bc186871d360d27b5775f93b7fe8721b28ac5d814875eade81f8b656c69e00ed7eb1819534d1248ab61d52f84f1e004a72caf5c8df0846beaa4e8e599823d78eb383bdaf47f70ff92ba6b4fe16b352a57b370777ddc87ae43f2b9f7b3a8f5c39a96f3ef7bc82ba51620f89561aeeb936e806e0f3b426a4ef0626813dcc52aaafa76fc47a5c2b943ae8594d04366b1672b3486073d7e298e802078e9464a56fe77548afa6d78f996245e623568888b98e57b1a016f3f15d1cb17a2bef10cc2089fbe5a2203f6c505886104be9b8c6c5e7b3c3b18404d5ee37d254851d495a77ab348f0ff4755e0a38081f1fb738cb5864735903ab0523cfe065236f1e6a206dd86effeb3c58565744e24d26f813aad283c6dca20283303724143ef81dbd25b625c47fb7cb478cbdbf53d6391e4a6d6df4cea26900b91062025a850b70b0feb918ff7d43dcd06e9ac72b0e7bcb43f5db7e8be0200c2df9156ef91f7aae0f97fb8463080cadce9d4507be5cad2ab54adc68bc22e64fb3e3ae2ba58f99e8639fad36371b889e7f899d214da0418dbc3c4470b87552d8508a14b7f7201090f522b13a64b765e2c42ba472b5e0395681c8fa2b272207738c4439377e2832a87bb14b6fbe7d90342e9dc69a3d8051c6fdd602dd5d1f197f862a4023426643e8f0b3361c5ec2fb76cf0e47838fed41ff25114f917fe9d96bcbee1dcb3ec976a9e2e55e8ab01abb7afb39eba50a9506845e5ae168b13b2f55f0d9347482ed87540484d3856f17b81f7bf0f1edbc3eef5b7723b06311d84617dd769000aff6c2305767740a4a44260d4408d5ee0fe6d867ac9080b378cf41c80f1cd3aaf18fe8fcd5b15f203da2df112c103d3c4083f9f184b6ad1f22425b1f188cdccc215f8e0311a8fa202ecef048fa9f97471db630271fa81ced5d8f4788d350c0f1d85832c9e7611a63ba30e31db103e2140cc352ee720e4d6201c01a96173a37e3478a59d6a046d5afa24b3473f368af8bf0dac0ed40cc1f7ce3c1647ae998804bb353ac7f65881feb846f681650c856ae1a2c6cbe71190bbe14c0a948ae24765407b168ed6f25d85c22b7f10051d8aead42d4d915b70599c57662a8d5fba727034a91af6d705d432a5c688a0389ff69164787251c00f9217ef9fa4cf00c2536ceb1c039db86ca2ba39f1b63921b941e1d42c7e98f0e290db381b42d7ada32fb6f4b07127ddcc992e2f178a610d5acc487934e0578d07d1b0a5d9bffb75972851df09b982e8340f18705f0af40143c3db451d0821600952638b05900c965a2ad665938d625123f9ac3673cdedc791d7704c3f318a08aed37e99f7eb27bafc2bc49f93446b28ebf749c27dd644f8fe245a0d21ad06b16b3f185ccabd017d1bfee04c4ca16d92a3c2f8fefe16819161cbdbbbde145c0dfd72491f31d25c6b9fc661a5904589eb84a1c48aff52a360ddb3ce0dcc9cf64740d1ea822a08b2145aae2a0119063906e4ecc3706571d595ebb63ea13034012f21fddadc68769823642b863f9d33bc241523b221ad37dd29893b8c5161422e46ffdbf0e78800eadb9da845c5d5321bf1534213fd2430dee2aaa31910b88427e2c9a42eba7ebc52dab082a09142ae109f9f5bc392a22e4574a880323c0132228988b0dcd98faf8eb8698bb6160aaf3c5322c010bf6e1688bca65d5f791f5236bc930cf7abe3dd00096f3efbcbf8ffab1f34b365ec1dabd2b1f859c7c9f062b49ed5ec2009bf90f50ea4db1f983d5fec538dc358a2ce630a96d0040a8af12bbc73b971fafe33d98a6985f5def9b6c8c9cff80b847f6e144d0ccc5f0073f57bec3432e0bc4d7de3c05290edbdec0777bd31e7a83466405a3dec93b3ca3f9a7ced23c5961574568d370293ffe64c7bf559302ea6bd0fc16c7f59d372fca6ef20e24d26a65efbf96721e4889cb4e610520543158643f43b18598499627fa4acc8632bf9e5317994a99918f8c654d4bec62411b76f68680ade5500215d49acb8331cf63018d51fee0f665d01bc3cec895d05bb6cf8f0603014c2a1eca7afa0a2e282b7fdc63b094f293a1b6ca80026526290d98197b521e2b5175ad6723ec71cece2e6f650dbeac74610154c7c1fce1f0dcc713a6a426afe73692097042f0c1b9b7bc4c4e61bbefe2818a979ceb0404fe60a730e8b8df770815465b5d7ec234ef8aeec66d14ad2f25102170c8efacccff3a93946f7350143368afa0bc65de027db0db117978c073317d4838c9a5b140abfd68d9f1b136937a1edd86604f095f1cb094709e6b6ff66212ff29c0ac106d161bccb4aa66f383263bc66c924793909b3ec7e6fca29f9fcbbb7ebedd1cd0d5102f4146359f1cc362905d0faf32a863bcfc016927c1f6486b31193dd5ca7f3de37561ed4e18f14f39343c148c978b5be431c4349b511fd220e726eee022de4cdddff171d956914f188382e5c83b2317ca21266bc761aae7648b2d7a3243c29d96e3df7bcfcee559dea2f52f31654561fbfccab1390e4c2c6a436a66f9a453f8c2af2e647b577788ee386ae6984d68ebb3227edc559781751ea0320e1626b75aff587289ce04a6a1fe04acd230ac85f9ab58b9994a8732bc22c2e25434e69f88b34f68cd3e09a383c228647930c903f88fa2ca6b8fc7f5ae2cf46b99da9e6efd7c3855406ecd3ab83abdf8edcfda9283ccd95d17b4e500ede81967fcd7798c2dc9759894ed46ae3ac9c1dbf228ad8f15742c2b2efbfdb287e574822c51140eae7983d9958e40ca8f689de5361685c20eff44f0cf0923d8f5b6de6d28c2e0239e15dc55ecd392dc68f1063679df00b8178502d7943780674dcf5dcfcabbcbb2853615c4130b5706aec20b074d2a6058565c0b7a12cd0e6880fcc221f9d6c184ad336ae21d71f187bb0014d600f2f7ae93a764722d60ed8c96e12105a8acc09ca0daa53269ab0da10827c5d8ba322b2943953bad198cbd714bd93c06f0e017104a2c08a56cf5121755040e68aafc11ca5d2e8308d62a4d761ff257a5119a63a485624ca89162a01abf7f0227d8ca07dac6e54fc06b236e672345f07a03828daf27705a77964ba15db181912376b9765ddf9a2a0f62ec03df15083d9931fed94972de4bbaf6ca45018aaeb49502ae6ab41461c6b50e512be7bb36d590068a55045c1753e0c41d92d11e096329a5642b273ea91f7042794928ba2d92398d9365aca43b40c99ce0b2868983fdbb5e3e4091bc516848fb6fa85f6f2700a287d93874069b8600d101529681fa52890e537f331a79ac32b1930a41f18503666875a87be7b3ffb93266f78c182cebde965b2b114b67b21ee8bfdc3486d1cf380d17c52788ddb06dce4c298834dd14a032f791edf2b096f83022fc0d5420b69ebb9d739239f424090556cc8139082419ac90fc030f91dcfef2df8cefae62c01c9631f1a7706681e1139c7d25a2e6541cad2507ceb3c088487e8de6a0d60124f07f32d518c14e9f35c322793b89c74d60b6ac7988061044eff19ab982d0070f5134d2e1d5176be0e189470c26bb94e465eaa37f5564fdd6f2b75fa8449b964adbf95efda31a0786ddbb54e6337fe6a6a0a8cd8b5ad81cdc83b9e42899eda552da5c0fbe43b7bd40430ca4db196904acd59fc9dd6d2d9a1fcd896416c28677ba6b741f49e36cce89abb946c8b658402d3e71673f0deda41bc7fb6b6487bf446e944f04d7cdd1fe35d8c11f1136e2238274e338fdb982477072d596b83f0a4c56bc1a294ab6c403d4e2c93beb83bb2afa51d50f603704486579fca1a56c6823972cf7886c78bd09b99251d1dfe0684bbc1415c309ff09a348ea73477cd24f1fd2a87a78f2cb1003fde4e3b9786600eb4976e066c3f6418e25dc6ee42f9e587de0d233524e872570d07162edfa3770a0049c1c792098b8807e3f23b04569b2e5383648e10fb93b0c8d790e1a0b5bd85a7ac29d15fc5d77ed867f1310cc37fe6e37ca687a518c88dd5535345fb8b4719f20719615a0db182cb74f9576b3b8f1f8a439c04172a293f0c4eb34759cf7cb302e6ad0ad0527e05891b90c3b5122cf06957b37846e12038225f01bf6dfbe94e31b675c36c9b0c65c9db294c0154cad324a36b72413ee68af50c5e8f7076af3628b2230fd72bf44a721bf4cf9cddf65c027d642a18db7dddc0dbf1212ee4327657149c8b0189933b3a83a5da495d9fd6cb0a1c2f4520419ba8a26d79528d715f10335a0d4101d4f6da509a3c2e3cd32c0efef852114644575a7ed150c66813c0b7511e9463182517aa608fbdcab48d152bb9ddcb0494171f5253c86f8ff85cb1c905e4780910708422172cacc0962edd2f9d7b08e56756ef9d0965228d5d7c128c278b456c403c5756467cf3764a5987e0fd0693cf5cc8e75bca9ad130782410cab4d51691bf04f3b4130cb514f4de8b4e1acfb85ef18c3e689b2bbc07cbdd64ccb88fab44ba4cb9d7d7312ae0d4ebf8015fa4f9842c83268f2444bac6cb057717048eda2907d68174555cfc1c5bdd6069ec460da69962490f44e20041f43c23ac04964388e08d1c2db030734c10e6e84b17ad86bda100f678967dc6a9c8523469f1f362c7c1def807f5914d1397b254a21ca9d98dab989fadad6fb853412dfc3f63168e9e253ba61b39b2e3ce0165c5fe2de1730d6028030b144c3b3db810f773ce4f98dcb3ee5084a62ad2d076a12515d790197eee0cb0dadcd55cad4614d7d13468234b78b4d29625faab6768dc806c139011752dd36d096c57a4d9e4086915bb9d019673286ae37b02506283f13f2e272a31dad8dfb9eec4e2b48541ab683441fd5854d498757c5e0b0d2b3e31dd9b58a129671243444a72bb75e92fe7f32779320b042e8e1a908fea768a3c292e09320b415865054d17da8168015f0721de685faae1564ee66900744c59ed23d2a839c6cbf582341f8eb41120661b5363188a5ee9431a8bc29caac697344b6abe260a5d304be621a9a00cf171446d6d1de576bbb97864c7792b05161c7c34f455397eba9c509cac949bf71399bdb9ea97fb38277204bd22964ed90a0c0612060c56f7106af32da9f387ffe107d9d099771e509554c1fde9c36a4b4ecd4358bcebae2e29ed99f953e910b5891b7269cc9067f2c06a842afd18d157f86eac1be24a29c9c436ded017fa41a3a4adf75d5bb1cd61b35b2545070086dfb96b246bee7424b3323f379e3e398a527611ea627fa2423ee559034f58e01c67c1573971e42675fb637bbd0f9490d8d8b0a05275651c73d0f6ef35656b58fcfc8a09ba244e2a820769e1316ef82788093076d1e342e595f2b663217e4d2f3260cc6b1c74d844440bba0e4feb2798c03a0a0d045af4a16f65038739c54ee840df2fb9561d32cc8ff709213191d6631e313b95fff0de876c058e23f9d1eba5ffc141640f445c520680c96e8bf7431062921c5a5eb5f402efa7db7efb7998497e7c0caabbc6bfa51e7311ef277185fec4d8e91e0c8d8438e9c651be58019da1fdcbe97d1a046b9c0114488dd928618f71202672c33234fce51cb15f4a6b2733eedc8590044a72aa83fe8a3f79eb1e1bbbdbeb00bab7b2282e801957a693a4f4f0e5954cf88326ca59fb19c002656c12b5dd22e710cc14e72a947050735a09f168582d782d459c5424944948151263cf65b3ae5271bf377e11f235e82966524b1e9aeed22dc3ae3544ae660aae370792182f07d7767b4cc861193b79adf7c8716ae767b1760f958be5290b6fd1b48b0a12bc79be3a6e2330038bf7268d478f83cfefa3baef16f279a6717e616d586e693846fc49462ee5936632e0aa65b05834ea6fa78e6d4a9384bb905a1fe1b5d4fb6788a109113d9be875cdb7e33350e15d038d44b485c55f637f4cf50b8b6ac9769e400d78ff8f8a3ae6c7eba2a4be0763fc70e6350c6a1a2a64a18fb9c64cdfbd52428255502e0858de1a04ee3297136e9c5e588b50cda1cdac118452315f3282082e86b0c4be17073913718bb8346dd8756a47e59845d9901718d53a7b58ded58f442d2a6f1fb1d35b07fdb0cc2cddc5f0e64eebfa18b0b5e6ce5fe687cf1f030bf7c5146dd74c83b1ab7e104cf47ec0bf01947660ca532a778c02772a1cf4d23827d2b9dd3c79e0b9409d0d91cadfaca5056eca7204ef42ed44eb1b1e9443d81d17aee5f0fcc95723961d6d5f6389e86a1ca0b1ee7a30f463e39954207a5049280d2beffa264e30192325a59caeb9573eae34741cc635bdd2322b11cf113ad00461732dfa3458d5bf81200a66f9f79779c844e20845b8a8b7b67a0e64edafa20858c3567d3fe433a7954287fee03240d983a7cb93b46c5fc80ea253a622866a994c01d4bdfc3e235e551392b064b4a434e40d45950006c38b448ab40ae852f9b52c45604235dec6145f6a66bcd709c71396c903a196258591d6cd9bcb7b7bf70b0240106b47b5949f02490c1450002bbf9e312d0fcda6ce5b27e8a6a82192700054155ccf1a118a0d84c91603ba9075492bc4d380275e43651228582481a1a7ea22c35f20be435a52b664b1bbfaa8bbc86861e077f48c84fc8df7b8eee2f522c5b0e756df61474d3e13a95c6fc96e92aaf5da158307abecace3ca29e5b7066b2db049290491380a641f3bf5a87f12ac448a27990676571ffc4a4d4d1446a7bc8f25f5c5bd609ddd79ac0120dfd0520f4f3382e28dfeab834166f4bb27af544399c117df06450565394917c364a517a7a10c310d18f3bf7ebec3605b704ca42242be2532b00166d6a3534d74dbf16085d493c6852eff9a4b002f6098923ea8707857e1f08087b0e69cab39090569ab59df8e5f1035e4e4d21673831592b446a05eba947988535ba06b3ba45bccd54845d26d36a4a8acf5b6782e12a55d90e55fede0fe5f443b57e811114263c668e91806da972a6f6d3b8e2c66237699a1c5a1ca4396a91b1531d458adee2592247d21fa938709647b1b428d7ec9e783b807ae1f835a8327aefc9f4b359364f9d6fcbcb1c4870c0034c53b7dbd09452e449bd224f1854843f7d54000a7d288613225a6c66381050261fa72a2f9d7912240201ac735ebf77e5210e5befb703ca4a6300d7c0424639ed8d09e06c41ea3a21a87b3950392a2f783faac210726220b492b38f90b45b46e671223379a6e606cbe98bf66488c5223c665151290838b8850524ef971ab8d918c70948a62be09aadea955b105ae642224c6762c520cfc44a86db2908536e7ac4782fd7d2f4c4a151aee54982a1b4485cf6b84f88ccc5ad420dba073aa574da294dcc89232b951f5cbcd89abb9eee2a80c5a3ed2114c21e24537f47c7e52b0555d7db24b300e5acb4375ed269673149d42a5e1e64bd778792ebe96445ed33c946f00b0b1182dfe1aa888605d893c398d48892d0fe6016fa3de9665a7422503d10995676f1b4991112141d832422f23ce245c08198b451c7bf9d64b9989e4b5575dc3f70d5b95746a1b8fb26c7ca9490670908d724c3708996af3b9d664b044f7e4950210a2896d13e54a8c1f7d0e6e72c37b53195b11f30d1a620462c02c65470738455bddff7ffb1cd289338ee9cf3bffd169a7650f9ee481544605c7ce19063a87777f180eb77f908f230738a822bfc675d2a4ec8efe0d24fe7fb14a0ea168af7e41bdc822cd1cb72f73e212f3f3d8cffa62197a2795d2857d0aad8af5771079c68935f2727d1930466652cce0dd947aac90e430b2a3bfcce0326298cd480b9a03f2f721eeb4506f5df67403669ae6c7688576cb9dc4aaa0f7f05a11db6c48af522f74a69b506f740c4ff115f2cea0c5d2a93d8d591175445daab3c24e17e0da5b6dda585683494afb3c7423874a235a89de6ea4dacc0a3c48d6e06d83687faff2fcea016a2822cc25d578c75ac9f9b68ebb531307f8ba97f3645361c921369f25656f9b38e547bae0685105b34d0d0e8cd3879973c2ee6f1d99e63a669534d9fa7baadbc97ff89fa9f161ae23dab1cf8e388d355433c816fd73404dcc6901c10c6cef13b9b5bd7fbd03dfab0c3100e6e3dd88187d78b3922eaa803e0ecbe3e6c374cb85dac51f0233f075337912e82e1f884e4018ae22005352d4d3d159d81bd40a5ae914f07f26926a2af720f373be19c36239f2e9b50cbda9dfc7533208a04eae2cc68431bfa0418a0b976d3a204f71c2820c4ce2db4dfa5f66d2e966114c59d143841bc7e82ce9a2347ba002a6d5777fa5f8588185503bd70362e15a845d103230c240cddcb4d0edada2be960d095aff43f20d68f34271cc69cb4d40260c368066823d03b837e0f44c57a602ca1b70703dfdc05bf56f0ef9acd46bad10b58aaae821f91b114da682e1ad3556f4c28875c2e5a3bee0378c12624825c4cc305d20b162ccf76502e3450747f0795210099606813a90863cea75133814bae7767698a76c016faa3ab21b61c5498633d55466f2d990760c00fe48e7d64417e3a431358598fc88f0b78fa200165b40e5ebd40e35decaee6fc696ba546c929c72813384f43923a4138742a443c24c5dbaaf6184b6badb6dd32450eb05ae99032bc5b1fd2204ee4f1d149f836b084573b97cfbba9bdf45b42f81f25223bd427fa528e3718e6baca056bc083b6f89994c838f910eb9b2ef60e2c3f59f9f05b1c6442df0844cb906aa7aff0291659954c1dd510d9dc99bcb9576e21e297124d771adeab31478adee2e34f27e5352d8a43e8499e2f3b07c51babeb5ae7491b4183a66bd84a1b6b4d124e87456ea612a4da147ad49b5fde21ac34ce49c8ac1e364fccf0bb099a75af914e1f60166008fdef134e3999488461f9bb227825df4ad75ca08ec27ed200cd0419131ba6335bbeb9bd623b4d9ee96dcb4126f427e8a458567b7d36f13487dc140bb2587fca48162adc67cd0769bcc09d309aa6d09b23650adcfe97652e00d1e24f1d8d2105e0523ce3deba68e3eab113c5aa633637cf7b1ee413dc288de57f0588ed27cf8ba0732e5a90bcfef8419f1acf73f6318f7610ab07902dddbd5bf84a4068f5249e6d5f6fb9fce44c661759ea3ccc76c031e814453d05cb71461b84aeb028b6143ea3e0dd4231e614650d452a423b5a601db29685d05370e369f4939aaef07c8c1f73f17a51b5e82296cd0299904a098a7c97025eee55d14b29519e75f12f5dc09f4baf55bb8e58c4e061c80dcee40b8cbdcb662a596e9daea7bb60c8ac2a08053ea37f2584c6a1ef5e2e02133d8abe25848e94e61af5381192c627f54a121934a703ca941684582056b24a07f26597e77e2fbd1946fd6760593e9d316307dd13c1cc5cd5030680fd9fbbe537813459e0f28c39d16d1f823a43ee45b6a9ce15d5c0480fb04a5f9178aeb1adec2563e0008b56d2882464efbdb7945bca94640a5b08c60743081ce4f6734b7e06e248c2862e84f373dbd21591dbec59f971fca3e6421e61422e452bdd18390e23bba217535a0907ee2d6e8112ba4e646253fc3b3ed9a64c791225174c1d9138454e59698ea223ae742e713764a6302ea9b9f1a8874b32b211cb9187e32db9f52475d1e32ff6f1e12e1ab1cb3f1d2c6b05298505a41591c202ca5e7e2133b9118c9175771e7e88a6cb11e7684493021bc62746401af40634583445baccf58f5a6a8818298b28ee91cb754cce90c4cbb821af31847361c368148d5ac8cb183e2c09643e3afed286a28ff69b0d3c1ae25127c05ffb0858edab6133faed63a282cff63dfda33de649d93e123009f2d15e7a524640030e358c407b157c827cb4eff12d763ea48c407b29db47821afa4be0c3dd8ff6d1107dbc411c7f09619deab2b1cdd67991b91c5efbacd142b14bc7a13a2939be3d1c1e7bebf4598eff7bc45f375eba14563e51617fc3a38149f439c206907fe3dba321faf41f21295d59fdfca8e58b928ba568f4c5a42f1e6151f2d45ccd7c03b13457ab29af944fa43c41698d2bbfe5af66e6929116a52ba59371e5473594ba7858572f041bc6a335a6b02c1fc6a75fcaaf76257db61928bffa9939e77cb2f20060836d8761793a9ebb16747c7b355ef4d1e1235e2935afc36379dad778ec53738477a6cc873a2e657b2b106ff968ec816032cf1e83fdcc175aec6bea65bc50478c97144384f1629037642615f6a9172f05ca97f259be7c50e25c2925273f8787c36b216fa1bc76d2445de3f5136fc9674d91bf153971e5ef68b234f453895d20d05f03096e3c0ed1e7c627a58c5db279e5c735983a87bbf27b4a3bd12f0008f5122d574a19a5a419364390cef1252197622e3197984bac8bcc6426a5c8921ca9df94321da386e79814cbe15c5bf7896126a0946294821527d6ba5a514a674b4ab9c8cc94524add23bf5ff756c3a5cce73c654f2ffce60c1bf39f93e38db367bd724e2b95e0eeee320773777777c7648c4ba639991963c6d8c3306c323327ed650c0929e7a44fe56cda22e5e7be45d62cab5ce4dc82512e1bc7338b8f25e900c93927bb2acd2a9d53c75f2f74ab29c0376d01be2264bac7cde71727e63b1a0431df3cbbaa7508114782b5f94a31ba84ad52003fd8d465242cb818c3dacb485850017e81050d70c02209ab821dfac1b7018b28f216635800d104c3304c054b2ea840cb009ec06207af08e78a0757b2ca6abff21855bca06b34acd8c1698d1b97a051458aada2835395266b650bee06537448582cc9ace4dcb0e6aa9e7170552a555293ab4ada82b7204aa56a6eea6d6eea53a92b7eb8a92bb0dcd40d82e801a8e57e0123515f918070516fad407151cf483c705284aa904191aae474485600a1564a6b2e0dc0a5b40a1f5c6a45511534e01e84418333785812f2c1aa38d21281d0c419480c61791c39515153ac649538f2e5eae80834260c1555ee2cc09d54a471670db09ce69c734e71842b6bffc089271ac663871459dcf9727e8d72e7dbd51457eefc0771a494524a1b3421a59472dae008cf0656a42062fe9cd3872f9cd8d003305a70848b31e79c938389020c1c512461f5824d8b5a6b553d11860f9688a2972788d0030a0a96d4134d442726cb830f9d1051504634e1a29c9218628342d4219d407b22c479e1244b41940d0a317aa84318695014e107fa6429b341070c668582a21ac50e3c4c178448a25140c941c2ac86bcc5350a24807061082d5140e1c4851428457185095c2062298a1cb8f0c4c82ba2310304cfb03097ab141145006a14e1c40e4554013a29420758952280e0a40726b4748b992a135dacd0ca8526869e0041145104af6856b1b10d10b12b82cd0013e19db8a2497d31c41bc6a42c66d56312bb20c03e31bfc5206ef99be0faf340c4bf566bc31587ffba212f6d552c0c6dc41bbb1e3f319f51c1b9acdb4b09e2e8a834f6d3b3bfb8b69f2aa5a1bef03b893e33fd98e4d2db3310fcae54e6d3a25beeed1ef81e84f8e27acc47c45b3ee3840d75e8e09d7ea2973e19b1c5dfee1a18c6d3088ecb1db8ae354ad17ee35a6b0ff6b1ead724d8ad0df382284563217e7dea15c9324ae9ccbe30d2c7aa473f529b6ed9e37b5c62536c395060b19f397eb0fcac060cc0a0728512582831f9c497b10138f2ebc962fd5b7d5f911217507ef09dd8b7d773a77f8fdb2db8ee188350843aa5ff832ffdb02f94f383b0aaed60bfb9234e82d54b3df6d9e2a89b882f1a88a3f3d957d4a9e3e637bfe370b4f9126befda59c72cd6e834de19b99b2f1fabe37f968b3407da4d2ccc6524a3265a2db0db6524a3237880646485910e6a58ae09891a24a108260840440d8a3080218bb5d16a52032d60036ab0342f23f5604526c5d32a0c16e2ad9dc9c308e01300b0e38fc9bef10a41ba57b4303100f35e6830e29c80009efbb12b7edff82c9b8bbf79949977ce9106e30bcd205906c18285b1f4910e8e4dc3505046df12843484b0d20eb604218d20323a16383b7078ecc03140eb1aa051a8020b50d244af95ab594dd178de110eb361aad1b204be846c327a1a42b00ca94228c01d19315b380de756ab93d0a3b16d31cae8b1b52933efda36d4dddd1b7377d7399239b20747c75fd8ecee7677f7d8e5deb1bbb7d34c0d5863c0c72efe2ea6408169107b49b1ae07f65e986d15fb9ec6b288bd0cd2458be130c7d2c9132a08bbf87980dc18262d8679956a84cc74b78de3ce89329f64661bba7f5766cccc9699ebe4103ca1583ff5a6645469c1a114aa4255e8052e7e55a494b40dda066dc3c6c7e8d3261b9f37ea853acc1fdfa56b524a29a594d99c2fa59452babb3b7f3dd2203fe52ed863d8d4a2820df2cca47429a5942ea59492c1adde60e3b39452b2942e8fe0a72da69c5272ec32659729bbc8c984c904c90425cc39e53bc628bb4da13ad8f82e6990a997ecc8c86808a329514d4d72367199b2a949ce262e534e2967939499724a2e7236bd787c9fcc2e19e717b99c3c2544e614fb28eb9cdfe3d393b3004e6cbc731ac166e34dfbacca4c6699967dd56483dbf7f4f6d17e9edf13fc8d7a717e766adadcb6d7e6c7e9fde0bb3df5f8c6d82c03468d0d573d9be296ffc74e0c7bbb1f7fe727d303ebcf752bf2965d8fbdf97d27869d9f7db6413965fd2f321fa6d3b25ff96fb3004e3c09bddac70273d3cdb0d9036773c28a0f4337895fcb567e58c18dac0323a594527ea1119c989898ee7e791a2ffcf9617eb5aa55af52a9bed008cecf4f4c4c0ceb5931ac2fe6865dad98c8bc3c8dca0b8de0e0dca059794c66647e62626038bbe2602a0eb7aa41b5adf2d26112192691292dd5b5bf2249e4f5b76ebdf0486b1d0a853a9d78e774ea3adee93a7669cff18ee4b4df78476e9ba6f18ea66519bbb4fad2abecd29ef2cee9b59fbcc33ba9d75ef24ecef61ec63c18df68df9ff23076f59f3cca3c926ffab5774fb24b7be94d76699f3ac9937fca637679cbe7387bfacedf7e117f2939a97a4ec5a99ef30fc9e993d244f5aa6fe6552a99998ff9f92b7fc1fcacdf9e6b2108baf6b9af5e9124f2da47755f68bf7e6ec69389f12c8cb73a72398ee338958ae35e5eec498a8d6deab680edd95b42a53e0eef43c5e3e4ec943f9fb9c8a30c9b7d6cba217d4d03927d614552e443fa49d9a40cbdcff695808a7c2acdaa57de8af960ed7d8006dd47639b5f04491874432925a0529fcab645ee7ab40ffaee7fd2b447c27d32d05cfb1aa7d99e6e6603c8741880dbf27b1c8dc3636e75fbf3553d9fbea755a7af764e11ecb3eeadfdf6c278bbdf5e3e36ddd46f1b6fcdc9ab39e7f9957d65fd4217279f7947fbd3b7abbf507b1b54a47941454d57e39a93af79bd3d12fae10cb79381e6729f7aee1e502f12fa2128a27df745b4efad3f24f44329f39bfc90d0f65cd62bf3fdf621e13e294d645ee6e96f350e78ee7e707c4fcb78d55b13c717840da07a99afab42ca7ccdcfaffeaac121f3f337d5b7b7a341557fdfa00ae6653c1c3532ab97f998d43ccd3391f91baa9f7926aabff1d65f333fbfc6b3dc52fdca5f377ebe8ca7fa1e87f1c2005cd557a47bbea87ff14223ac74431074bbdf842eb32bf585ddd7bf3d5feb6dcfbae1d1784c561f0dda0a8c98811041508183283e3cf3d9adfe0d1e68d8fadb56fd45c3126ea3c947e66f883e43d48749908fcca67dbff4b46f85fafd80faf2bd5b81ded63efec9930dbe62bee3623cebad292718563e8b85af97952ee60019e2cd3ed60af5d23742af0c7eabd2152e98ecfcdeb6ea890436f617951824109b7cba3de6965797df0af5fac73e415d82d82d3ce5d842561ffbfa19e6dc7caed7bbc9427dac3275006d6a6aea72b125d46fc1a873642b5df9d987f5a994a1f7d1be12b4920f957eacf3d15fdb9b9f451d77730ef3fafb01fd45b0fa2d18e9b863a0e2df6c1d4485c7d073e707f57cf71c9fe3f6e750419eece9f69f7430337318743d36ddeed9f568f693b3fcf9b2b080db31b05658c0ed5f0037dd3032bbead1c468cda6c635d87111d6294fb27315e8b8f543a2e3d69f3eec4512996e8d4b1c79e29491a79550ac6ea1fc0ef2e137ec5898efdc39a0629f8fed6bc7c2fc2abd96e26e5e91ecf96a5e91ec63617ddd0b5d855b3f242adc1a65bb3c85a0af0cd87d8a7d2cd82eb6f86c5314b1b4165d6a72f02407368842ce03d2164b785ec7288f36c6529c174497df89cbafbafc85245801d9380496b1ec807451dc391e6ebf6d918b6ddcf95d3ba7b2e06d08ddb0044aee6cbadb77b92f8caf6ddf378c9fbd772c047953d3edf19edee16a1e17a1cfb77a45e8a3629016fb045b3fdbcc96ed2dd333bd6a55c3744cdb4ef54bc746f5a9bba6f9d67a6bae6bd3c63a76bcf1fd95c586a561fec81ff957917f26c67ce10ae60b2dbfea88e872eab35fb862b141842516a13e2e62ed86c74ad1ebc7589c915fc6d58ddc754f0bd51f6859776466e62fbef65d2337333773a41f63a4941e493243e7546c6a571ac4d260fc8c1081e185af71aea051609b99397baf34f8168b62ccb237d2491dbb3b7667f1e5b6fdb66ddb16330f89c77844e784418f02db4410613771fd91ba09de6116e294ed88066583ee99d751fa8829ae431147252d0baef30be79c7372546c3f7fa1ac517af4b420ba31f7eb12b26460e33b958d19bb825d91f259baf7732fb179bb7bccbbbbe3f01a77f71befac777799777787797777777777777777f71fe2eeeeee38eeeed57d453383a326d3b04a3794e54e5d4a05f3728325a3847583663523a324060c18d58b92ee74ea524a2cead4714a68ad7453a26595e6f84e89ccd1a111d939e4155b70f4cc112d34976a15ba3e31724c3774a62e10601fd7c23e397450d9857dcbef3a439d4bdd85bbfb7b8f9618f6ad79365b11b91ec52676e4e3dec2cf7077af2291d8f86347b99b73dd845fb6871bb95c356a3e8c6b5cd6cfcbc894f8f2acfad4c7eae476dc5ba6d6128bbe88568b78426dcfcf21022e53c746452ef126bef64cde8a356b27f1e6f9c75f9e14562391c7cd8845456e9dc8976826262277125b49a9a8b97051f21797c8d35ac49bf85a70616a2791a7978837d1ad75a2d84eb468a9f9c215eb0bbfc64931ed84da3acebea852b3fb81dd1b344966acbea4994fe67333623a1b7c4b1a75094530315b542fee728975a225525cc7c4c4e44e2ceaa4c4a553e294b86c182dd2a2a8480bed732dcec4a5c1a8466f914b6e8cbec68d436057fcb05d0bbba2141cdfd960f943d7d2ccccccfdee9fbb96226c8cfc6125aae9192628fe4a713aa7c38814bbfe1b31c8db3caefcdd3d41b1f4b18fcffda6715bf65aad5ddb3bebd495479388669986f5b66958779fcd8dfbc2eefbe91cbed147c3beb0d2d45b54ca9e1e75d2ba8ab179f577e93289bd4831c62aabd58a777a48b768582b76d9558d0d965ab1974fc32f03649ad6f508b2e21dd495cf383f1f9006654c0f36642c38b458f98eb1a0c4963ddbb24cc5230a214123a5947ed635f6fe713e730dd2efe94a64bdf31174315a44f7a675cbe03124b1ec924f3d1aafa65bf235cfa65bf2376fff56ec929b7b2cff90afd86028aba1c807fdc21a8a2ef5519ffea84f7fe3066b8cb49212b726c1aefab1eafb576badf463cb4ddb5b6bc79ae6f0dad12d6eb5f8c64fa0975ff4f945bf1dddf2c7be70bb61bdf38b4166a928bd1d382028b9e8fdfd2bedea9d8d4de6784dc5309a2465e87d28f6a5d0a04c815d724a4c0576c95700dfc8df648f14748c6cc8615c39a473c2958e01704de45100dfe4e01d156e5060f0a5c32ef9f3637c92d1afaf7d3603a25f310cab7269cae0d421a961c69578d4f9e062d1d6f9d8ae4f28ba3f82f5892311b5eb9e4f1fa134189f28b1db0c341c894e78a76ff7f18412b2dda35efb6c72bc63bbbc46c0adce7e339c86387d7dfab1566befe9749ac15f40521f0ca8cf4883324a2cf758f730af7ad99dbeb3dffd0cfe02bdd57d4d755b87717d7aa95e4e24e097eaebbe1b724e9f0eb77b1450b7bae77ff18274ab63c1ef0a7cd371dc6f282f88f5f8caedfef49da058ec27e8af15b8d53d19b7ebba0f756ef7ec5de7eabea79fd8fef89143eef6e985ffe40569b0fb976e736ee66562663e2b1353ebdfeebbfb5902d3bdeafbf156f7b103d260f72727acfcd87d4c2452fda97b98d3cbab4e1f0bc54259d4dbd3a34ef6843afdca5bdd9f76b0a7eec3d5ed7e86ced1713becbbeed9a6fb8ac4a2d9a726b82d08cb0daa61c615ad8b51b4eb9f7591c84776fd6b17857cd4eb12099273b7813962a3bf69596c162bef64cca33d6fd66b40b7e847af278506290fbb280a7c43a906d84561f016cd00dfd06ae90b7449763d2aa5f4638c315a22fea2f1894486b0f6535f14fa58402fac98b7cf3e2f1fe423559f7ad5c7024ad1c09280ea6154413ed9cbcbfc4b4d7d2f1f7b2b4e919bac1cc795b7e8c378ff42e7d00869907e7b400d6adf4f8354c6041de01d19ec0698c79f3e911778277bfa30748ea66d377adacb08d9909788f00eeae96780794e4f5f039cd33dfd0e700ef7f48b70cef6f441c02f1d6fd19fd1e1ccaefa272ff24dfdce7306eb731e65b0fee66d0cd6d7f1178a932e7df6fada47fbeb117dbff42fdfd0fae9b08bfe098adddc7ba1418abaf523c22e4a9ffd6fb59f7ad587e32dfa2f40f653f56365f5b38f95696fa495b4ac6a35ab0f7a8bfe69079b42e760b9d90734a5c1faf1eb740e4d143af97067add507ea9e7cb0b171b0f10ec7925f5cb71ca65b1e39de9827e31b7faec1d6b2d8adb9ca2ed724d75ff4954817684a833cc5c636dd200873a3f6608b5f37cb7ad8254176a11a1004e3c0cee96f4757ae87777a08107f116100ef58805d3c14e01bf9d2524ecb62b51b72d6f9f00360b1f236734efdf60360b1f5fde7e9bbed39a0d367bb49e9c7a2d91bd9329a51a6239dd3577e922c56de21424e4416fb285bf7eb9efbd67efbee7b0e48fbad3f963b7d23ade44ddb9b8f72ecc43a23421ab1c929de6ae951640fb51091d785c9859c49cb1253176ff563515af2566b51aa4a995151d2512735166ff5917614c588e3a4d745de92d2eb28a827442dd44344714888a94b149ae1486bf196901f18881c252d49e9e9e000e9a95bcc13194e7a9168860501f601bde5ffdef228e4adf68e784b7a44bc253d21de92de4f0d273d203838e9f5e4e0a4a7a383931e8eb72427bdff38e9adbc253d6bc349af7a4b7a2c80959dc14a8f0501f6a9de72d90918f216c8498f05243f18bcd51fe4b371ebb4590103e946302e237df1837cc55c19666e7c18dee98f30ec8a32d4db57cb627d75e58d4fead7803d7d09843dfd3e1616560d45379c6fa495e6d785d2f53fed6081a68438389d1373c4079106fd67f7d3e0ec6910c7877f83cd4bb6f0c6652d872318bff0bbf1f9dbbfb0ef3718afea200aa101668c31c6c8aef81e5bf16f7c8c4a4a428ef4e0064764ecd84c8012853ef56cda61981c815235246717135309619c77c5894f66b0f20810b656cac4c474e4c81115143664a623a4e61df9354b42a6c1e460436682b2bd98c15c8cf47041709d92ee74c56e27948a092818daaa6cb02133f15175e94920423a8bd44b1362528aeb1893224f04d231e945b506962337f222214474705216757a51ca89b261d5ae62d738fdc2f9be756c5ec13d874d32738c07f0c2c2740eb78a1dc6b0c63f295629b4610392152cb0e189248c80c40dabd665a4329eb8a7cb483cc8610d185bd1e83064b208c21658ace08c2cbef0342a30450926306083871900c194c4134af8b0050d2c43284388223ce1c5510f16a5140013765eb69203130428b2f5b2951c90a04866108159c961e86e97ad3461a3d7702d6104932266a0841437306a1fb41449741835a805549a8cb6a8428910d478c2a70a2a866842858c13302142900c94a0820aa32fcc6062061a407409c3084e4c21c4141d7079820344d0c0062e6010c590920fc188043734f1448726286109679cc14df082cb900cb890b16404dfe25a18074c8c8104222ba46c9101ced72c965042b542c4e4486594016385480757bb6c85080b256af31bb513467d74e5092b188a201714c1a8054760b1c610429e250442f0392aa3890a9a60804614a38612436432a4022f24242424b4c589932daf4587036891afc396e82de4d19b9c6c1c5fd873830d13bfc8c3374c126f94427fbb51250ebd0f76e304966f84e996cb1b3e08aff2eb7e649c445edf912de994dd4a3d61e3cf2fda25fcf894131b8db055ece5639827035d210addfeab55e6d56fbb014e56b5c7b4ac22f19034d03863256cf62b599379d4c3784828babbbdddbbbbe79c18f6cec4564694324eb0c619647421c50bc808828c1b968ca0ba8cb434c6cc65a4a5a4251a2c4959ea610c36c640c21867c85c461ae34ad218518cf182315430c6500e4968a265088b09c4c8811855c49881182e10e30731726023e632d20fb460f9c11596062eb8302c38228816fc608805b76b821117264b142c2bc0a2888b824205b7a302e5724610714f3f5c19228b10f7e53252184a9edc4e8d2b29c88282ab9d11c44d8101c44565f1c3f51b5cf1214b0f17ab82e8a68a78b8f40527b8d5881d6e0784934b2f23f960071dae652387db3135b95996a1bb8561828bf10087bbe180c99d575c5992e5869b4971c5862c4aee160329743b175c69cad2c69546b071ab1057d6c8d2846b2f23f5a0c915266459c2dddab8d2258b126e97c695247041421635ee16c6e730c3fa11ae5f4602030c30ae706a051ea51777f2004540480bbe04549f521a238db45aa01f20ef6d9a4cc005e6f1e71d5a7fae1a9c5f6570b0212bfdb4108109580003fcd2a94a3ab5cef97702fdb06b2ae18029ac341f5c71346b28c5408ad534987d2c1ae96fb4522c64d51f33d6844666c4e6a45fa433624f2316e7b4737e2c6c3ef6b1300c9b139bd954025cd5ac583435362be660cc38b2e2332a3a02408d0d8b66b5a259ad6c914dcdaf56384c4c61f31d0489c5528079f855bf21f4931f0e24f586b4101d6cb8ba14c0b1d915c22effd313db92597eac39b1297f4a39a5bf5c213e46619198babbab7588191860977c29dc775ab86f488331604f7f089117302f89bd1660579d31e98b47f128c3c17182e3afa885192bf94f6ad147b153e2508348d90c6c4c3aba72a59d81893c1790e11d0cb08b89020cde0879626bad4cb1c8a4e9c0daa0209ffea98951b3ac9ed0f276340fb0f22bc3aa579dc60acb3ef533d495f5ce2484628c1c86b591235e926e1561977c0ff08d740ebc61977c29db73de06ee68d088c300faeb87d6c73a1fddfd61970c13ab02bf56de927f02efcc977fc32f06230ff6f209b023f2642fbf00bc739379ae1df6d26f1579b0afc53749270800c3b00108615c6a0a51877fe8b44efc8142ff40c17da0905d9f73fa9c523be9d0d9d9c8ee0737d8fdf8f958f7c39b92310c8b18d6da09094a763f5cca1fddfdf0ee47164baf96c56675326d6cc3c1649bc7d91b564d567bad734194514a83505c4249c02ef923881995523fab948619581d1d22f3669d8feee228b294526efab1d7e3587772c262f3d3316fd8d42b6a566b96d55a9bb677cd6ad0715cd771b33d1edbaf6aa66d9f0e8ef6e9e0b827b3a4db9e28875d591b1362dbb8b94d8fe0abc5add9fecdbf524952cfa32e62b14b3e0ddf14619eac12bb5babf5c3191b1c21754bbe94ec352fab300d629c7bf18838c58b4b744b7e0b8cc06a8c825df2e3137ce351a278378c464652fb19fcc57df1894fbe51f7b410e9c355dcd0fa0d1e6558aee2b27bad350bc08d4bd5ca0b53f10bfb6cb8cda673e263fcc2dea625a57c7e9e99e117b317bf5bf2d3b055e9a773429d2b5f2fa49342e7c897cf2e798212df0ba5d58a5d2ef4db2b1f8877fcca1701bf70b8255fca9608e057c8d3b15f401d060dbf70bcc53b4da441f92f6ec97fe1c89ffad4bb55e7006159527ab9e1eaa66eb7425fec5babdd0a7db5f7a858edb3a206811a940f34a48508b04bbe8f1f2a4a1e15cb376a58b20d468679b19734d2ce86108d146157e5f100dfd49ae5f0e82e07a7c1fa59e61969100625360ee1a0842c8f06eb6799bcfd5e03d8557f93c9c1cae01749bdfda83fbd4f57bff690c2699dd6f568b2213788a37b97a74e2bc2afd3179d74ab7efd803882f635e1d6df28277383fd10e7662feeebc7a1531c7a20feb2df0a25843d7ddfea22a95d8f9f25a8afbb38d460fd9313566bc2adfa462c0961939e685eb5ded250d93357351dd8556313bea99cb7e4861208f970acec51570af771675f1c8252638dde12ee71781feea3a269bf753d32da0509ba5aac7555ad91f9b1b28f393ef9e2a2938e43cd796c0486ce89482292be8dfad3671f89bacf501fe8adfaa78cfb2efb581a4bd37ed3b22dd3b2f756cdbefa30b06ecdadb1e885093892b20f549f94b08dc958794cff64171bdb586b51d7b24beee8168f6ea598a7a5e29d137ce686f64acb3b280cfb0dbba134bf08f65549c106a5ddd1a0b49db303a6b31b3b20a306ab538e51c29678c7256c138505ddd3a3b03f7d2c20fb27d59f9e7dec07f954d4a7b0477d2c20d4a73ef5d150c30bea837ca27d98b7dfc37c8ca1de3eca4e89ac18a3576f4d4c27059dce99f1e8d3c6e8a96e276f47b7e6470f64d7041d4ba1c1d9e3adf9123b256193db61d32d8f6fe6a901dd9acf7f9a73887d0cf08e0cf602cce33f5fc810dea13fbb1e18a555767d213abcd3fd7c149887fbf93cac02338073b297101d1b73dee63983d86b1e6510fbccdb18c45e88bf5013fbfeaa576de67c9fdf29609f0ebba6ce9d18b6f2d6c4308c6215a3d869074b3f7c1bfa014d9961a60e8abc314ab13232d94894813b40558a6f60bac6dadbcf2cff7eb4f6406fe1780b356def4aaded1c2d126141bc96659a963d517dd243dc72a795ba67350832ab35cbaa740fc889069f68f5b34dab9fd1da5d295b966173238e1b639aa6a27ca06e7fab2817a7ad88b26939750bbaa7362ccca79efd25e3431f27a394f60edaa53c3ab90da6e63198ba55ced2e7b1e3045a6586629847867a67784786d5b5abae5d8f0dcbbebb8a79dbad35dda230dd52a5f8867efd2cbbe8cbd86035201de407e41dfbf45bcc7302e7dc20e0456774548b3a751c10c60246ad2bede8f73418843a901d0e82dd0ad86b0ff3aa1798afaa52ffb2bd9156da364e92b9f483d0d73c5ee2a688b2aac926d53e97a27dd65e0c49e4bffc9e35bc722fa2b6a8546d58743de910d100000020004315000020100c884302a1503420c8b2de1b14000e7398486654170aa491280762140541c6186000200018628c31c814155501adb64ad121e68267de05dc66414b0192b2c99904d78b62811c63441cefdd086fa45d23c4ea2dfddcce1af0e3e2b9ddea3d2e65bba93f07f1c59389cdc74e88304acf3892d9bd7ed743c5fea13601808dedfdb5ee3a724f371604e9c3c41cdd767795a0debb90827bb90a030e1cc1dfd6227666abe0f2476168b85d92c8105e546b2f625141bc561002aaaf419ad79bce52906ea36db067f465719d7696e225044a49a1944f2cdfe99b65d335ff143e31df13fd157505f6c8d55161dfe7a963941dcf6f1784367056b8ac3af7f5e79d56a67d2f31b99adab1b456bcbb4c903d55af6a1b08d975cc1839f970c4cb19b8540775c70c497c8614df17d3c1c6d92d3c4d6a393e768969844f72dd9378672fe1767d6bacf8ad3187b109d62936792a4714f90f447c46d1e2d714ab200cd582025ecea6c41c44b72991bca4827d5eec13d91c86d14333279be7f2495e5cfe611bd1395a911d89829d4138382b157cd759061644b49a4e62f79a67d563ed009d4439372611ab04b89027da8ae8fc1ff9e26894452a0dbbe52e816fa154a9015b680808e3231f1967445fa0b6cade0e21f5af7a2a63c6f04da34723774ec0661b00eae40fa42b09e00adc0c738033ff5aa9da41b66d1628c3473c368cb861967c284e6ed6536b5c83e56f0afa8ef4f7cddc1a78472bb7cafdc0cd1ea4be39889d426dfec678ad6e36fe4714fb0764e72713109a3682a42799ba8702b186ad25858f05f5a92721cae4265b49c34890713baeea52c19ed0afc09751e5e6ef9a776299d9a453d27c28b6d2355b92920b120a556c08a7573e95b04b50e1768a299818d10d1b0c6c9094a98d6413960a1f7d66434bbaebd38f3365d2a4e280a540453a1f4223920964ead75e64f80f9c31489363b51bec9705cc492215a5821e42ff28aa40794a95ec20868a655ee4de7e1ef6aa196f3308396955d43125fe9c24ee23ccea8dc5fb48a9b02aa67ae73fc284c2609569dd126f259e793a6f130c229054df76fe23a5da284618ad2a2dff2317080f55553d41afaeaa8f31e88530de31d809fa84afaa4060733b7d1bbf0812ed7d9a4f721a0b43615996bf1a0bcc6c2c9be85ea43187100ad1db7a5cd23cf6d3b7237ea15d8920f8b6e0e4e44545daeab9aaa6a6ed7c4376879ae63d2a103dd7c5635ee02e00a1ba53d33c3261721a8cbb66166c7dabed3e7250b2a2a6ef6d24b56610f6ce4092ec34e08ea0665aa101b9c74981c65fd001986baac1f9dbe5571fee8f6c82a53d14e384038a60c7307d62d8b99de4e9fd119b6f92533eb4f10b70844a04b294dccdb7e86271bc4248c5c9bdc46104c2ad0a53bc49089f8ed65274b951adbe23bca97a17d3c55b2a3bfe96cea8ff886e2bdee6f48d59ac02cb337148f8447e94a314117c400081ef43b57446fd8ef046e1073101741cf7fbaa0f1a426cf4d4f6d3ce32478e9123d9a85d65b97488fb2b10ff4fb208463a19fef524dc6d95a7f517e1247a350b3c63ca17cc9225685af1777215bb009538521557088e156155fde15749a2fb1fda51ca913828e380c705dd90b1e1dfc973a3131b1fb72a9273e09dd2385222a2e495d4d3a53572a27eaa1238cd2ff51cac5ffcc2c02dee07d88becb4ad30ba7c4c04939deefa2503d75407a767ec217e38393a0d2ecf49581f5c84d31163c62fd866c581093f60b2fae4815d615ccc74ee1cab7492e25400f5556ac244f267636c9c4c5a21172f42a8d6d8eec256c4133059d5c53e682798c6086212a1c7d55774db521a0de1cbf3f0492386efe7d1829b3be6d50b1989f68af2264c77d78fb6a38d6a9c27006900141c17f7879b60a74e64ee56fdce02cd8d5c25722d2792c9aa1029170c2cc372bced2357f48696905c5b53955c7a659029067ae3531fc7d7743cfc82d23c48c4f99892ea7d184ebd733a70c2ddc33752b2931059f67e41a0075b4a3d17bd2ff0d11279a121c0060dfc30b1a449f612e33d5811f7c63a03f81b633dad03f9c8c43144ba623cf0f60698c9ffc860781e4b6f04f7cdb33ef6831aa06f4f6824798609e339957358a4ed42f6d777928c205fa88959fe9dec7f8532db336203713f4f21d6f6122f9eb016717b46bb9d8860ae03f2d212f52006a300f31944876959f48a5ee16d91baab620d705407c31ceb3a6b42f00c255d2f3e828625d3895b49675f695e8b66fb98b5d05afd4ad7ffb9888231160f42447bf7eff30819e938f6a52fb9c04363bf97f4c5414a13b208bacdc17ead0456093b7fb2369a244f849654e9cfc340c471993d1e3ab3f4915eb311a22d0cece2fa919be8a2597a4427954bb9076a0ae69b0469c6f4ba1c2e318db7fe076d243429592c90a360e2dc889d999d7816b9a63b122e48508aa84dddbc4d8426aeeca2bee81e187d8e2ec0b9b82e9a2c9180968426a6bfdc06cee6d17abac1dde03a9d6af0e0874d72e753e993263b2599500d08d944ab5564051a10a0e536a7a935297c985d2d09317920b5ea574b1c6c8bec7e6d7fdb98a68581de0e38630036c1409bae8df108a9707885b5cf0841d69cd09abf9996b5e475633d494e1796c700dcbd74d64ce9220c66c32b3318a4b1d38094d572a390f65320c24d4888c4645a8f34dc7b6a50fee352779e8d90e9d5cdac20e0515835cb03a819cd61724debd0383ec328abe6512ca6ca1d684b5b019cce4d17ce46e18a5a67051498bf3c42745579427c8cbd19fca8535393bf3c0c30d98f04bb8a1c99dc07da1bd04d135b11285200767ed4373f87768a660c91e51fdb1a3351b43537b613c1fb9897b4daf87bf6fa10f414709dd2eb20176c1b52428f071c987b563edd726f7db9bee413acee6ab92da64de4e204dcc74dee9719701c95c6e4a7dcfd5af771184a209a9e80673226882b136a71e609ded70c7293ad46c8ff9c02da7c12cb3a4bc537060ac28867731a823c30cb62de804a186026e937c80e8d8880ba0be97ba24805564deccf2c3189b4708e543a4c873322aff11800904e9f33992cb4e7d1ab04dd12cd9fdbedcad5d25ba2a1880fd567ea77c9c6fb1f2bd2f8e183f6e3661f61095d5e898811624806b71b7404e5dc74b1721e353576697b85e24374b78019f0682b25c779f32b527ad3ab93c88f129b3e91629438eb288db08a33af8d489679378eec838c52b407733003a8d84b998d7aefb39b1c8ff18a370f083f6387460aa09c7450bc0f9ccffad59784491efb640622727de772c5c53b83bfeee59482dfd0fe0fbd8df278a45fe95bbd3494825c2edcab25571d2ff195b756811c65ebd0ee80dd600de274489d0478a5be74fd39a8710e7f8883209e926300270effe1fec05672780d41612633cb6420debb15c6145af01e1cf8c6086f233dff5925dc97cd2a89d2737e74b0da8c0486db67243089c587de1bee42ec1977d1d457f9b75e6d988f6918108c7903495e191c21938a52ca0c9a9206bc47c4eba798be72f9126bea561470f21dcf76cae091812455de57f9ae30636ed4780e78c80b3a0b51ac20e4ff375b4ccc4461e33a8f9757b5442becc0ae8e6b5b44f0baa99036063b7a01449fc12f37561d1b4abffaf89c7c334fdb47ec4c8583da031303907e0c0ebf2822dd5a76606d278a1290fb30e62c38198f6223336d8d446d4a84f0bbd96ea93fc0d692e291744ef4a5abe72ecf1c701ae35ea15f7ce98282df4617edc6792a00342b698b3cdc68cc68811bb8c9834dbe9e0e80d0cd163845b9deb2f766c63b035027ca22d3f1f1dcfadadb8f41baf53035988f851911e8388cdf2e14ecd1836bc77cb2d42ec19e2fb8b618f8c753a78ba803d726d770eaed0d2abec200ae69c04841c15acf60477b213035f72181ab0df77b1950886d7508753c4fdb715f84de16f81a75e871e4c8eef68aa3afcbca306f854f66fea2058670914c556f22e4a605436e3c7711a6f46d5689f0857025c46f40d7dcb1690d86eb0ed6ef3fbe5e0f2e675455277bfe33b09faea9cdbd144a8ecc79184ae29cf48108699f0b4546079e4ae536a8ba24518ebd7590fff3d5acab0ee3fd99e4785c854bbc5fe7da3f5e51385d2e4cc359dc6c2b5c6007cfbf530e4f6badedda96bac0a8dc5e65acc9060fcd1e884af99d102840b2889fc592780161a9fc48c9ec92d1135bebaeab1e128bb0e2f5a2754031f01f99813b925df2c51916e2e5916f54534ad849b34878346003e9e8ccf0862e789ad4622e0f787d25ddaa0d32b567dccc81cebf28d4d01ceb64e80ff753e06a17c926f695e315c8eeb067b0aac0b1c17e279a274126463c1405028fd83ae65490e83d07acb41b2bba5c77791d0e30cac1fce9593115b6c3ab017f630febcbdeb4ab1c8f6d07a11303b00a2588377ca35d5e3249d05b7df5b3a7f4e9480bca93a37c5f3fedb1c13033cc30977e65451a3fe467460782ea48f33c064d1c205bea5ffa8c8062a29a2e099410c688dfa9a8bc4f5a2351bf3bef231a131067799eb8701bc28dc269b4d1ed39974520347759ec502f5f64da015297d3d44a061e3980b1382529b252f07a8a5250cea15aa665fb39567afdb3d572caf7f4dcaf12c9544ae24cfd6e58c1665ac9e7e1c2ad8d443dbc5bb11c29cccaeee8ac42ead27cad770c705b238b0194f77d1224f4ff98a3f5be76679f43e25fa36fac564ba76f7031e90c2e784569c8108926ff075cb8cf2724ae60015922a80725d5ca5e1643a09baad146efb7067e9775a7280d3018a3669f97a2df154d33d91e2ff7915a4a843e9101efc20aaa1a6aea475f8218eb02e890ad1c1cb35d3128ec83d9fc7bd90fe5a986c6357f2f5c8ca05a42dbfa326ab7abd56140040ee4b61880aeb680b262f26d892d77bb8201cb17fd3ea5f8856001f3fbc730d37871d2ce69bb586c81023668967136e0855989f92d9fe7e00fc4115af2a153ff6fc50dda5ef69cb5ca4449242229cdd65bea42e6b98b1fe19b5fd97e2cca219806b17e256a29dd21abf2c5a85aceca816ff5a0c047b9a61ac37eafb0745fed28bddf11e121364a1cb3bbbc25dbde661380e0e1b560fe8ac69bab1dfe152fd34065008520c9b786783b260a71f5cc0c2e2ea9181258ac2ed1a304f87482e43e6bbe10be1f62f503d9bbd6555b413880ac444e5950c55824043303e24b9a14e88e01f039367aa38829dc22721d41e9087c55132be348e63d79760ed90aea7594db9092374ff8bdffc17dfe3f900f918b50be49a3baeca61c67aa5ee82a44e4a4b03eaa10d417c9352f79377dc556e52fdab60fb7b7f6633243665d9cbc2a5241b08105b2cb54003d221bae9b613dc03494c0766d500442ded0e59de875a6c587ee0a74f2aa900d62133981d7054a017527e1f0f2a06c24b0d09d98d9974d8d5509d26f0d3c5afae09ac6de5252536db18b420ccc31649a76401ba124e338af97d71bed34ac4c443d3a945ce163c4a5626061cdccea9b9bc5257d612abdf0c8eee23157458c013cb859286cad6913651d62ac3d81248287f84b32b7467f315b964d1334658a30c4f14179e5026ec2c30e555529436899953c9042b8a196a30443e8928434c31bb0efa6f29c2f8be7108532c9c2b2b46c512afe309045c5c359a7787ef4fdc5a47e10f4a8b7cb995cef769a4287ea4bcc0cbf885d16451964d9a120287346f660b332662cc7b009228c2e8ea9f60038f4fe8609930924b6b08bd84ec56ef9cfc564d605c0cc00e265e7cfe14cae009cb6834f16d93eccdeacdac6e7badadff84e6c80581f20f8e006e0920d64bed46d7fae47a365d89ad71888580282957c19cc55afc347edefecd2522ea26e9562f84e8a0efec7f898c7f05b82743f8330556be75c0a83a32f0a3606e18b3ff9f21b94ee15ae92f9909564b4a664fa72d8ae413223ee34f5d5b3235e659f265839a27af614ffa38a62d4b7908e526cd4e302122709f68f32f74c44a55ba2c2801b66cb199a2515823dcc7436d4ffd033d5e1fa0cf433b2288df9a147dc9467920a29652fcdb29c7d717dc576943ea90ae9b5a393d6b8586d1fc1477b670ff67fd09b5be4022b7abac859474bd8f8f3d572cabb9051ca547247b43489d339d63655bc6d135e4da61ebabc149f9e78da150e02c0babf5038f0984c13ac07120f20ee09c6ddd03f0793a6e622558c994e7350bb00e8c2b5289e6e87320ffcfb3a3651291984486dca9ec8c2026bfbcb4d17507c28e255828ff01373c36d96c97cedecc0f218558981e52cc73e11745d12c98d7911f1c725cce10339321080c68a01c3e2e169e025ac61e52c0dd4e40ed7c9ebe735ef9c229d8ea7602e75bb6746c2147b735a8f6dab5a5cce634f36a737250853531be9023fd4d6412b2ea58c16d055735928677d97ef181c51d170a405c87bdbd0303e102542a9d9cc2bcf71b7ad1510d99a6e46652c3b8814a911bd16ed4a7d54e68bf20e3139ada9727a4e9a9c38266f73f25e37616b53baa7d3700fa4b8be61852ea87ac2866267e524a5f6ee3bb7850cf10c827bafc0e323f1eb2172333df3fac7db189cf11534610db4d6878f9488975c1f807ca7f89490b55688ee625de50dd8f723baa37d137d2cb7308955aef02a312aab1c241566c843bf93971b4a0c204b0368881ca0f66b5b9315e03b1c21b1b9099cc267dbae4c880810c1b6b327dcf250596c7ee5b245b8f5413cc7ec90a515690fb5ed3d481a4ae6f921227349940c5eab5055d3ee976c2df0f28f139d11f79e009ac4356c279cf2cea91f97cb5259350bf1d01e415490060ea217f56038b5eb9720beac1f0a1580333275cc8321a48f3f56cf51a4cde698c6ee246ea9720e33741ce4896eea7e1064be8e5f1af395463b9f5f6c897e46a50beffc65d9de65f9a2089e92ab7563fe32447a76dfdc327447f73c7768904d29ea15a8fb875b887ea37cd48faedccec84b239330201baba091952963db90c6b647284ff145022c78827f368bcfa805afcbd21dad9bb5038dd18a525d890d66dadc241f6f5f9db575cb72d7aadf9226ab13f21ebb5db2531b4ecd5c5128f533a23b6a0f316bcb43b1c1c9cc7f9942b4ca940591cb9e30593dba7c433808c4f8be55c8ae40d9d65665e5e62aad402a16067347e61199a6ea79cc66469f814d222d5ff2bb7c9b8c57abe74cfc6b28ec2ff16e5f25f651950b8030be98a3471a2526937a7861824678cf2ce12598826f90418662e0bc08f16b98634d494152d84ac034164541dbe4fb9cadbe4fee6b7cc78068379dc47ea9c254c405103b6043ec3fead90926710f3308ff84f1136f67c325046fb54929860fef5f78814810def2b736ecf4905408dfa1edd3b5de549bf3f1a4386ed588914572373e39f97624c928c7d70ce2163b877e832e42e37d95662462f1a151f92456c6b1376575d94a073e27e88926e56164c9e080932201e22870aec4f0c82d17db623ebae21e5737c31a6b9d2e8f7100f88439071749e7fe15ae9019e9ae42a0f1fde6566a86c70c401fa9ff88bc6c56ce0d1291dd59ca6af157694989109ab1135f55a0bf4a48848a84f530fd807566601257b5c69e65a6a604c1629fd592047719a9ad3a62a03329ed2cc44008eded2255f5788fe8b5aaee082198d2b9a1adeabb68c2653b8f97e223ff0504209cfcc68b282f391956f3119447462097f8f0ba3f829baa8a2e753b3998e04b19eb69768d834492eb6ab304eebc55f81fbbcb106dc30f6c73a519118cc5c727402f623799cddace960f82405c571733987fd652151a3e2dc672a6c82c8cf00fb5b90d120ea5bc07bf90052ded24bc664dc2ab48b011b8342029f269b27c25ad618cacd1bedbb6b08d15389380628fcca383855077c9f05240b84a5fe97bb1953970691b0e8d2390119a1fb73ea4e2a7ee2fc69a47de3be80ed10cd7bfdbdb14595a4812c1b73cb5d5a5ba1c22541ff01ddcc21637b4c16039b5ded8fc5898f0fb2a61f8d2f8d4e7997da2c1a87d294411c4841c895063d1b18d2bc9b0dc7622c8eb38e4b6eaf2ef320c2212517cb0355b225730078d29efd51fa19501929e8404d46243906e2e2130820ee00bd1d849608dbca4c3a9e8af6c44e94aa48cf5654545e9ad7dec1694481feb72680fdbdbf95c7b5ada979c17bafb3627669d6b9fd619aabf60454228a10a99049276403b5ef266d8eb8c6d72d4ec508fa46480706267d42db00390a997cb11ce81dbfc0f933c6269fce244e40d07b56c8f0044ec12f8a0b04f841f5bd44e0d78ca9ee0f15fbfe1f46c4afc03960b83c37d2f39cb0d72e32b1f8f4bf484e0860a68f0d8b3c41ddf909ac4d5b3d7c4efc8b43203dcf66091b18d51d5571c1cc96ad2d143b0af68bfab3e5d4ee37684807983a730fc53308f6defe48bb53c323e088b6577647305e24fef966301e90a8069f6baaa0b8f8dfc62ca6e549205fa498f73f5a072a63fb44b9a65c2c9671d4e2449d69e6152e8a55413f93f1d45fbe3807240fa2aeb6f1dd3b012952a8cdea136be7f017723423763dd2e089475f1cc07836e2257cfe8d6d87ecb14bd347803ad37dc04bd4b2373e530869e3987d28e0b90da2b6e8d11e6cd13e2624a0435dc5918eed3963801269036d9865a6fcf642e7879d00c41e3acd8c1eb2aec691f6f09175953d90e4ea56c95e12cf98f2223f98da000b884322cb57388bde3d7d37f2fbdb1546cc2a629a8fb19cba1c6e8096f901986ef2c866c542a7d55a36a6bc989714cebf4e431d9d4e22ff30446d7fbc0309b5031b1c02f9d325d223f547373c4ca349e14e85d4a1b3088d1c495b2f512eb8cd15c2b4ea598736625782d600b2ae7656bd9342e3daa030e11f6b920538960f0433605e6d4c429c58e5b5ed7bfb49d1eeeb626c5adb2a3bd190add64b6f9dc3ae55e2967fb870b36e23b7c15a9ef35868843a7040a0d0fe2c8c274b532400074cd3e7589ca6efe4e1090bb5e41edef21799337a627531afbcdf552abeac42877bbb8dc9d4676f5168d0bfaad782f8cfd708ac2ead7ad138cb686279f1fdf58c2adee4230e4922ff48ab7bc062f5c6918f6a5c6de614613e9845d2f0077fa24f9d1216161a06adcaff4a07ec9fe0bf3a2c5fedf35b591b95d4d828f73c0e7f59cb747b99dd3433e5e7ae32e0ade2052abe4e2f48e1b05c76d2499cfcef01427b00d67698b8c733dc2d75cd9d3409a95111c306b748692c9fc74350d6799be551adaa09f1ad6dcda31f5e460f67e06d768e40982e7c212b64c78ce98542022fd9d591bd1baf2af3a3509b3535fe31ec1534b6aed8d163f98515298ab2701dc47f1f8e09304514bca92271f6bc8602f2344424b6b410bb69a5d25195bb6d069b038e72e7dffe79f1a0291759d5af51869fbba2e0cb6557f1cfae22d5c38aed8f33da45e3d6bcd4fcd23789dd5f9f932c35b64723ef8a8190638c965735fcb400bbad5954a73a8c234c889bb84260ab13d138fc0263bedbbc479fc2d424ead3a735ec5b0801198ddb80f317dfbe84185ef5f797d5d72b4f71128e641cab789ee105cfb0926a4e1a3f9baaf81ef7204ac1ab00b46fbc9842e6bdd997b8a37df849ed4f629028c36dab6c4a0e27780273135f619abf468d8ea3a25814a8018c095d7dfc0a0172efb7c644cbbb14db5f8333d0a7bbd70a52ad448f0384cd77a3f94c31ec258a0ce37115eeaa6b62fed5c8123453809a1c9fc806db38a1541d04aecbd593c6b1e741868764c5a2be5aa9cced303dc9beeb68e7fc96a24806f4d2f280266d6441fc0224b8013194bd13672fc08ace2cb7e9d8980e600b48298cd5a82536396eeb9763cedf26a5ed9196bd43d8256c3b3137ce8115dc16aac3b3da26bc2ab9bda444d3e8dca5723d26fe0cfff259dfce3ed4e52f89d622c00da53bec616d0ebab2a57679a4a8b308dbaa51107220787df9fc594871e687d0bb91b84a09f0f852e130c5298ceeab1d2296b741008acc500d2860ce0915269fd47af8f2426765090f88f0aa002935b708a26a24d69c34cd679875cf46442ae65fb0b6b7e0c85f7784c7bb4f5a60ab94e4a36b8ec67b913e3d663357bc76370accd64011443fa9075a9ca02e057292f0212b3ca46c4623f62b16dae1310cca836227de1f3f0ba40ebb4eb0a4ab6602343222920b151e9c4011810a15a07891df8552bf72e6f46af2dfd45d79c959d1c436dc6b9462fb146636125915027582c380ebf73ff2b8b15c4b21f5b99c20f88ddb81a26f132129d80aa81fc55bf1f29a6f0e4e5c65bf4a1d4a0fa451f7ef43b950a357809a10c1ed1501fb92e447ab44f63d4280ad6a45825d233d36c5c670900d0800ae3e0a84454517d6bc1f0b675e01689ffc156ec75ddfda8eb165d41ec411210803abe492e5762f10b9a44d2105d304dbab22281535e5ff570c6d6c398506803328abbc52fbf5767e510813d60c0bd1d8880f6a88b0fe38c8435d6314374378d2ea937b345e32dec1a0cfb0c64638ff8ec2e832bc99eadfc949ec1a97b43bb51da987e301e73ffda8b2ecfb60ff0470255263069a9afefd7c75e269c8d53f0dd46d6ccbb46069ba65888e6badaac8978a31f6724276962195df087fc6bc8469a4ae1790419e2309b486b830f7fe6c287e366db1c398976a79c60c23b7c94ed66e92f54bb61a1a0ebf6a041d011c6cab0994fd80df84d6118e080f072715ee03402bdc9398f078c494144629728edfbc61e26d6c7beea2568c0fccba7712839197799683e359db3710b91ed5f2cbc9e562fc4e1a2d9bf82e69c065b3b29ac139f03ad191fabdb544755e606c59807b6ce4ad4051decf223d840e4f63b7d0a1a32a79de8f01280c02a9217855d88b7bfdcb0f8416432b3539da890547adf85fc5cd367d9db1189e6c79a1bddb73b701b47c89d971c8749d7ddfc708959b6991af53cf421c9d88a5ff1a8c041cc7e94b926f561a859dd417c8d7ce169ccd495447322793499b97668088d899696344ad964cd94c471f80f97ea5642249afbae784d8003a07ee8f588253271f1eed3bd520722eb4fa2eea55059ea65e34572c60fa52489a4e31c029a0f034a1d449eb87d3284abd77858bf7910ea8d0cc0b7827a976b3908cda0a84d632c7ee4a5397c9856ee019f8f93fc0dbf3f374b2434789796b181d99859d3e78045f0898bbabeac292c9a545a931df70e40d3cc108ae2ea732bde581ec67f91cd860cf94218ed63941b1bbbdc4fd443a5b62dee7ebbf1f00a35d1737488a096ca649d118a1b4d3b9498adf1a3d0a72afaa62821639eb7643eccb5934e8354cde6328608204703abd6c8d5c2d26e460381bfacfdea6ca2abd188b4f1a98a5e8431f228e4e82658cb6f2909c49ae72832e8ebd09c1c2a0a588bf490349614ba270fdb94388ce49c8ccca1e2b500804140f54409267342c105bea3c6c787eead27322e8ca09703b7413cdcf6296ffb438c6ae1a6c4620cefe2dd0b16dd6d017ddce8457134e2f89d58c06608bbe299be9dd91f77c028813b6cd53f6debf885c5d45685a42d035744bf77cb128c4b0fb85749000dd0ca4671b26a9648fd3c8fbfafc1bfab8be9ebaee200227bc4810dd6aacd9fb6609ca331e54b5303b58838f39784477c80e04aeb1a1fd63e7fa6568a434d675854cfc190e922ff5583d0e4cf56d8a50700a5b1f67300b8f8fef2acf72005a950f12153f194cbaaea80d5385e9236b0fc53260aa582e69b4c3f9f5b0e6a47e28e780b556eb6774b1f75697f0c45228a60bd608a3285395b9f5c9770e8a5c11c8afbf79196a854a92a0f3e007ca8bf14964495ec65eebdfe97c592c509f57fab9624a345ee8168e76a430992fc7925a4275aac61493bf12f7ced7cd3a14aa7c8dc29266086ad7aa7ab69713dd9fa418fd0e5a43525fb1f68ee103df4f52a6d29277d51feeeea86fa830366bf0b8c6fa5571d881a7e82d4b7f487a654152f6d6029d504dcd60514232d84fc790a245899364d944207c8cfad8b9481c41508e11432bbb4052abc4912e8c4fa20d487d1964bec0be49224d60508e5afc2ac903e6389431276c6cf4656be7cd5b53049747e5bfa2b47d50cf5b4756c87dc9af30459dab09fa931fc9c6362339ad3c729ae13189ad538c8097f53267fa52eea1cd7e6b8dc4427c36849da699955b4abd18d3b10ec3623922d495487fd38e540871a69719a77935618f66795442194fede38075d3600e6df797f38ff491e753bd31af6c0f3cacea884c0b62d2e308534f9baa53cf4f3e5230a1dc6ab00acf66bdc6a44760ee75fee62a1767184c852534d5f02e11faca1429800d2da226c42b82e5fac89218067bee9365942ca8f9693285aaa98290a7ccd55451b4b16d0fc17a9f6376cacda42282939115732d20dfdb177005c20e7852a4b161d6e606ae2f88288556c41dd19c2656b546a0e1af15f5368f63290e3f7530684c80f0a0d5cca8c20d0c64a6723f8375283355aecd0230444f6f2a3a5b156c0707b2635d948ffe2859410fcb05738007aa0e41cd060ff20c26e70688999e52c7b1dba716ccce36dea3d70b3e32e43a5cf047de3b057cdc1870e24f15294408c659de16cbd937e9fd7e20de08df9f7b9efa7f44dd9472a8b6a1fb9a3ad6e63eb28fa6d7a82af61245a5d9cc21d594eb670bc70a733c7edf70a37de7d861b0943417285ad6b0f7c87899235a892bcf25a37fbc12012fe0d24d2c019271832ab12589d0d0de81914ef9d89d32619862bd7cbc405bd0881e34267976cb18c62d7f6fe6a72609ee8c08d197f801e1b472b1b870ca0515125e4bc0247be43bb959925b41055db1eaa204d6529dcb4368c5d004ccf7a58a350d93a81a91b4f866489865e0e490cef54ffbecafd5e6ed8d3bcacc32a2c7d08c9bc9f98ce0ebc6b93518c87e66046b0290723c5047bc773cd7751259e35ece5c880b04f85d4ce873736e648efe11bc1b823a07a0ff8c6cbf15387b4dfa0fd0cd4568450cf468d17d01dd01b417d705b3ceb5d86f4809e7e944382e532d99288ebe023480bdc17ba8673146075ff3031ec93ee9516c2a5800de32ec7604bd311ff959320b7dd88de83bc20d850d3425eda31286533a02cd628228c8e90348bf749ec40b5d1716c7e6d63e3a0be77621d86bc3b3a3d3ac1620065ef4e25130215a49ea8312c4681a2c548d8d9bd093366d3c923ceb86320b56ef84d29fb1691ea673a311a883e16bab6cbc5d5005e5311fff76d61b68bb4a32bddd3f9fba7c509e04fba8aee29d02ba40ffbd2c4266443877cba9dc18c1a6324baca6a6b54cc41b42d11647d8917a260fdb911d5872dab819f72ae6f3576c00e3169ba0b7a2dd06765bb67df0ada8a1eb412527444d27d3f13f384249ed547b85a70d8e6f00196d3e19b44dce1f5b152463de577952cb1238023a973ea392ed895683a8ff364ca5ac37c06fe436ec91c7e91363dc4b0fa194012ccf166557804f9c12774e1dcb6907d2f262a4b0dbacb21e3d984bb725b3e48298103c97ead4dc958e5925bef578d69df4cc37b97869977947d3f49ba071cacc65159dc11837e50daf12e5969b9a52ea613769a65137ab11bc0d15eccc7d7eb98c71173f5cd548f06eb0e8507ae04d7993b34407d389b0a046f24e192c012306b9ab5b4c9497985185430ba511aada683db869352a37e93948b2a7d75a2bc72588d54f13ec7b886a558258208e4005e7a0317a721a57fd6d2c4ac6bae4f1ecb93fd1dfd72debb8f7da4b986d26aa055d2d9e9a1b15c89c62097166f2cca5b3a133abcdd152d69d1f13ca0b4708c264c5d7a298aa5cce299e281ec9c95755b33a1c3d7a046d78c7eaa14df33458b642a6636cdfc0f925561f68c1cc7e868d2d31b1e5d318e419e28d73ec1a206cd694ce0cd4637956caeb778630bee52691252958def97a88f4c3aad9b29133b3502c73de0622b8cfd9e6539decdb3f356040796bd8c9de8ce0360969877b531636694a48b063b8f350a503e60104c598f2d42d2b6ffefed4f83e4086a7fa7690b095f867784e99130efc98a39f8cd322714603e072f41cc2b49570722375e631a8691cb32fac31c84d7a81b490326246e5f6ee53ff2cd0cc62ccee594191a781e3d5336d7e62414c70fdce8119c04507bc741436c56eed8131be3bf04142815e29f05287bf5d88dd0c1ff041428adf0500f7145225d5811a6a8be261118c32af7549e53f4b10727da65702dc41aef0918cbc8d75e20ce7e46c2fd7e7145e2efba17a3fd5e865964119a2785102c1a4fba30e0cb8ba128ef9c7a3c105fac94e51d1a8c47c90c093a298eec3b4afea3144832ea58b6392476b2121a8ffa50ca8d8bb0670db8b8bf39f59d71c67b6c1908f997201f05d1dd5320ef3fa889c07809a87005eacd497a6beb9e40754d45411cece865cba7ce6cab1d0f5c2bcc6dd14e7cc8d0fbcda8f446893948924e8e4ada01d87f81fe586edeab3fc61c06a3fe889ed179c01d18d5d18d2ca2ebf4de4266f1487235dcbec04c382e67b7b96ef263cbcd0f5b8f5eee165a5e307294f35ca0b6a470ecb238880379efcd3e57479b64b06c7436450b6dd38353709ed7addc9e61dca4a69349350ec90158c7056d52fdcf2165e2cd8ea06c8159dc20fb1aab5358f186f8496864aa2fb7f005b0e68e5ea7d58ad596be96ddb6ffa8d03e968b2c599ff49bff40ffe4a100dab2e0a9af88c8853470c0b0be4eb3e44d03decaf0c2b3e77f3586658099743074546596ddaa0f76fda9c4576f061cfcaba691d20d34551d89838c9f287169bdf7a4bf6bab4d845f295b1759ddf06cb72e0349af25df4e61f83407bf273295f84e712fdcfad67d4700ee6cfba8da7c724e0280c0e8b0bd5e9d94ea5ebe3e17a537ba9c0e50d67bb3fb4e4c16f50ea8b649a343cbe72b77dbd59ec588bf915790250202dd10f3b3f5a50972bfce46145a844fce93e7fc3a39bb8f5f264b404e0ce551ca7db9000ac3d471939e1d78d29affeb6fccac41e45d7d96559b1735cae8cf7c7e32787ac64f1ee0e073c0db24b015ab3b2a040c13fb4192420401a03bd87f85ab8ccbf80c0f825328c1db39c105b8d2c7ddbefa6b69cd34d5e75f828f543c76043dab30ea62387e6e257fb20e6dcc2e0c8590fd3bc6422653a582abae4dd1377c1cd6bf4a2fbf9833b99e91e1780bda61e32a47450ddf17b06d347aff92d1002e27f177b97751520827491b639036dbb483a0260741e109786e48b8c1938126b895de91ee94f073103aac2a3a58a092880cb739c1c63990bbb160442a3ea3c62822c92e1bbcf5ca26b114a958abc8eb6545beb3e93e13811d69f52c6a3098a336a024881eda852369d6f069c73edb6142c63e1d67607007b6d37ba494603064488c2daea01d2b542de8252cc39514caad8a98241538c42d959de569c1d2043992ca71ed59de90b91da4276a68a9517336254b041d202d4f04a74d3667d95d91e101d0cacdd3355fe86abbe8f112a05b31216225b114f63ebc9204d051d2d54657c80e661124a008d546542d2876804db8da86114099b19ad230811972a196bbc76e1bff4075832ac084ce91367c1114663bdd207c10dcd7173d7a546cb41df09517639272d6252f3816b5df0fca75b5c4f20c91f11d27b70b9d6685b97b46dea073b67f373cef11aee84a07dfcfa75c162efce3b33b576f50e490717440fc336493572651ed9e11b947e382ba64f94f246d31b51f82b02feaa8bc90c19b6e19edf9263c972dca1a4cce2958cc9eb47ac4e5b1d3955b8509952b50c7206e1c58b711a3b1b681f110d3e6d5afe66c8b57ec6d4bdb581cb1e2d6a07081b6d004bc7562e5ae4ebd8b034407c6818a6f6dccf49d99c77e7b2e19908c76bcf3ec12b3376af1385165842115ca7d4162644fc0db3354e80124b5c291206763fa8c50a3a19a0ff051e0d46afdc5e8ce608ab25032d760a1582320769b439a3f958fa294c79177a4f57c85992e6f3436e23cb9017e935732528fa7661829afa83372d51a7c63e1e946cf4c9e62260743436ea102941ae82cba04a9ea739b550998cc385506db268a9455c911e0a1099f755b167af95ca0b468a8913e7f6bd90809aa429c7d68c7104577883f1c22743ef09ec7395f5b533a8095be91b7c9ab6884769131081dfbf48ef8bbc4076e824f3ec51b460b1911a8cf3eb1dbf14b696738203d5ce2bba17f45fe1b4f14d02061486500a292c46becc7a688168df040c9ab1ee8fc6d4030c3e6f06e851cc54c881c14a82fea782b1315b22c7e3f0a1da2e5db0942dd642a7c7c9940b4f47485651d9a6fbc6cb86ed4f5f1d8d99ff922828c2ea50270ee3ea4c864cecdda00a894bdebdcce2c3901ed0dc601830aa276ea90198204146accfa749a74ac40d5b82a7b648d8c36d9abfa31146cdb284a60288bfcaababadf938f67b1bb223a1bfa81f0fbcbebd24daf4ba41751fdb6e4265c5a50b07ce69c4f2f3d96c35863d4445e188acf83e5cf76bc841596f86ae16f47e8f8cb1f57579c38b976e7a7386e8e6850cf778585e553a3945e61e54050923ad7eea7639ef52f26ce0d6766887c1f62202a1b850ca3c3b44a77cb04563b30ba57dbaf2e29ff450ebf5d60f83379c5af0e7e4ac01de828db26c4c2f5c11d7591706c756f2b6d1098b852de236e555494090d706fc11a3f4f9a2d115702c72bf211b3cbd8f052044e28f4f2f71c27711916715ad96cf035d1ed588efd2d17b20b02ced01a87272c05cfc99b9fdae190b3b92357cd5e4051d5b2bec459428e4cb0ede41e848a0a31aa809208bb531e032aa797e4824596da07f99972ff6d6c1b72c911655b01530221bb10c2b953e7a1c9bc808e751fafb34db23cb349ca12bb9f2833ab1ab5b1a51c2da99cf600917e6264060e10d2db35099904f932622ed48360ac334c7788c3528e668b152e9262d802cacf413df119443727ec3effea4468662fa6c6994d02159159f0220b73496906732ec3c4ca4c9bac873dc90c479ace8f52b71ccb7e549494666658251ccf8556c7adfcfdb9655ee704514a262c1076cd70929dce25c836573b069cc26986c3c855824339d761e4357d482f5640c956a733fe214b6c0357bc247fd8e9246eb9a256a20d5a10bf7b0deab4b241a92618c793f688a1f36b0c2160ea2b2d41f66678881af4dd91058ef52f662ad0a49d75da4073814c7c601c230ea59d524fb8f911e0a6546af7d6c7288c3da58aeac4e1abfb894811e212a2f9f541864d249c4332429e0c0667e463279474f277789105b5ba03273f0f319c7185205b18b4f073144a1ed081c9162ef18d71c652f74befe7313d130941952cf4312338f095163075c91785af6c8229f2c609c6909e6bbf117892f9794b67514f2c8254fdfa5786d5bf042b9922ce2ede45dfb6bcc6e440e2aeed12788c349eaadbd22cefc184c663b1b99ede3681cc52ae0d81cb51eaa92636f966ccca8c7177fb0a21faf331ec03e29eb4c3edcdd5bc2e7db0f29f2972668872cddeb0ddc7983c7f851cb6636bc52acf62d283689e1e66284e079ee6d3604f18f8125ff92b0dad007677a43ae102dc6c21b4cc31599e26d03c5b9ca1f1596a631cc2d92c13d014259da4ad2e027bdd2cf25b72dd0dab9e41995cef1085c2e8e1846f3154a4943ce33f92ba6d1a07ce238606c1c4d415fa78a046d7e0df504df6fd099d112f6c0c1f19b231d8c628f450668f1e31a7f2c61646b6c63c3fdc39cd49cd21853a22d40c66a6e5378e82de2ab0b477d1bf8d50f0081e4bf415caf82e04b895aa342b9e4c0cdec3ebefca5da545faa162628888333b7e32c0bdde0c1343f62ec2f9a2fc23a456eea48de8cb3a9a2a4085821f2c7f749c27d2144afc426878d64829245fc75edaefaa2dd0ffb94809272fcb776b2568c433069df6a5c64d440f06516539e2630cd50282cfbd9151695da13950349541d22b29fbf936778ca390a27727165319701ea0b8b8418f0b4184b4725cd3eedafeaea12984cca61a44b77dde4195dfc8a2b3a9ab1133bc251204e8e5a24da39f82f2c64ec3ba41a7e5ec7bf828440be64073bfd17448438419f0b6399282f2a2d4f335f9ed7d9f748b379c2faf344abcbd42e3a08c648a4205fdb037ea9dc48708675685c539e9c2b48b9dbd38ddb1d9033fc41311c35b9ade22a86dfb93415cada5646b6c67c3aa017ab5942c744be4a33edc089d7bc163c224b0452f3b7dd495a10eb1d480b7428d6dbdca88a504d368f6125ac15350d6440b60f3a0a10450858ca80f93b44da4c27a10973cd323ef86199932585250a6a3e3ab408c035814190e76cf93da062b5f087c8bfc22fb91edddf66ead5450e2ef9130068d78f485c86be9802553e8e34a70ad2545eca03885633881b85507c65bca2ab747b2992bd03624b6a5933bde7fab0482b16282171c76f6fd013b2c3daa3e7d5174bf8726d2c3f402cae5f240f5be729d8b024a95fb49ae6245f6f02dd49fa511b5de45ea6b4f0d8ff5d402193912b3f96999b4a7fcbed572147e0b02f1d3a78f1cfdd6300f93b9c4b18a64efc1b649cdc0cf873692ab249306c87e27d39c136c828b94163fbed501f392989ddd99c817503616ba9c453b3b8e4326516407572dece4e4c04dbcfe9bd76face522671f1318415ad5cd38fc7c1b1972199ab7e90fdd6bab8d63d3613af408f6acc76b054415c06050726e684ada91064409aa081d145761ec27d891df81e195b0e08e8640b68e126acc23247508b79e7e9cadc730a3f451abd483f01cb6e938758216c0f6b1d6e7b67d8a99acd8c1ef1dab92d2d14c977ecec03b872a74f7632a5e1e318749d923b9f8ddf0c0ecee5b9f0b1774b7b81e91b5fb1d59fcc13c0f16993cdb78a2457e657edd9541476670d447538be79fefe945f0fedfaf24b79b030ebb1a16536bd66b87b23a3f4d763b8291db1cdbe4ba366ccaeeb324d91b78a2f533bed512a63ce35b5b9320b643214a6f2c69c45535c7fd1a3bd0b3495a59e1ae8b2f85bf3a39f3efac8e3503fe01ace8c5fd565ff5cf207620c2a1899148d9ed0816bcdbb2ab8574fd54c84d97cd4442c0ee14e3dffa83e65df4b17607ef01dddcbcac52c88363913dcc2efa57b03a6637ec44a8c1e252214e728d915c0a7184b632a3e4f1a92b520c34488a45b57a27c2e98c991743e0fd8f916ca874364abaee5744c61f4024966ccc69482af7d817c4cdd00369285a7debf869fe646fd0903753b1440995a3bab952f91393f1401d6392fc643e213146ba6cc79940cdbdb35310d4d85382a2c1205e528bb24263e850170540fc1d071c4223b441f1eb8d783220681329d1c25b35480311bfad007d8e9b85425956c67b19e2bb4e62b0f6ec495595b37a96aa053d0b7dc54a2ae2223e1227e8fc3a16229e4f9a904103e2376898c56a6f7a032fb17cce48c298faaf103b433e7edb7f4222a671a47800d25d0fe2f39f7db4aa0119b7166a9cbcf1abe35869c52f801b803a759266018ae3c349ca05756310a64203f48905146a81f8a3d9cd0091a8fa7cf378525e350aef1ee3876289b166c10187b9126d8af1ce95b482fc95d47b29b11bf70efaebc56ae3378d2f9b3160907c76f80ed08d5ae32628efbe6f216cab582a0f693e8bbed4236c06aea5d886c3d4f7195033546dfc22d731aa95b038fdcedc79f827b4567e0de2d7f86c79e4fd0d491165bef6b031f83e2078847b52d21fa6fa6975f37cd0e50f3e25e893f704b6f06cba4e4846580f8e70590cc30660c596bd291935361fa23f00803277514e5f585709a71b88be0d5a2b051cc41a5135402416e307d5081959e85af76050b453227611f6d9ddd028dad8805a3c286405eb92f010a8654a7c03183c1bee9173a43bafc2b0cd34f7018360fbec1d0bd46f215fff365159de3047f461830b66b6527eea31baa317a4b27b24ab6013d434467cef156bd3416aea227b5386c11a18768f51f45ef9fb511cfb92dc127a24336c6045d3788951c6fb2c2ea14a73206b7c69d03a2991f563a9eec1fae7d42f793b61295862a7028bafee1b9d5546ff60d8350e56ba071b7bec964b30f4e0008ec1849bd088e1cb28b17366a110a6b39796408140386ffb8d4603830dd32cb4117f70da94ddce89ff8cc0fe4ae0b3355fb90b1c620fa6d85c3b8416e8cad051825ba064cf27979bed061b0132ada91b9f19259f83e5f419918b2f05695e690b64343c382988ebc69bffae31fa57d1b713111465030aacea73174d4f0873094cbc96817ef66cd4eb81c1eae442ebe8792b388a68062c039d16071cf244c4f191a07aeb5a30019c2c8d6d40facb5538438d0c749e5dbfe78487138767b40b47f499790075b8a5dff57c70bd67f03dc5f73a18871de36aecfd292bcb0a89b6c0e33ddbe35e6a541904c0b8eea67145f9cdb4fa0a79d7a0ce50d812bf579259679360cff1398fce1dc06c4599a00332959a472a319a46141cd07805c010c58555e054c56ea14b6087e11af74c0f6b99c82e26cf88199b95e03e0cfb2cbb193dd27233fff25e5bbfe64f9863c1118beb13239fdbe3500f77e4e02606e9c7d3191b6cfef270462df39dedf9430cd093d0f85ed3d0f22b457186870c036cdf239b5d177d05d79dd4a761af2ea46b3a50409e56da306422f4b0162347a7e79e9468c192c3ef773fe6412629dd9b6b0ebb48335deeaccf31a17bbc45df14f123bbb6deb3dbf854a3fb0037f6c88f7c3482bf8b4da1b802ff1b8322f64cf455f2d0b10f9ed120f1c93dac20d0838de107eb9bd1318a61f2dfd8936104efbac5f6ffb673562329227240b2ad50f65441ee15ec930dc74b087552f254753f9ecebe2d63bd77ce6ba9a6cababa926796bdfd5652976455dc1da7ad0ff873349ef3dd10a1a5e0b92b3a6014df06d80dfa692cc8407d163b5c0c9a8ace50d1bcf164636ba49b92b7d49931405be577114347cf1c4d85c2609126025ce2080783f01737879249de7aeaad6f33e091d54feb4c45d2830f88efa01fb32f0fcf67dc66ba98b2060acf504d0ea5df09eecc5a501ca7ec9901871d044145cceec8277a8728ea34483fc480f6cca223019c9c7261427a4b418e1d0ac40dfa170603193598cea1359b3291ce8085318a7cb67548aa1f1243db75719da8f17135064b984b9e5fa96ff056f638837e169bc103dc360a284c06d3e68e79a91ee5dc14ca97ba4242d3b7e09ce531fef4582ef2383131ff5803a36ba05e260984eab61be17d5607d49ce5f6db11c50e90df29def9b44e9e48227c5a6c8a1dd37b5cd59da7f40644fbfe795e5712064042e259063b3b834aa169f3cecdbc2c2fe16ed9d588942a664f6d17a9869f6532680f3b09fb420a875c225fff1fa2e26754b84fb4cc1ae54e4101457dce3d4b2c9177c78f5caba7b5498756bd6345b18f2d3b9a9a7e56289a368f4893b362ea98799b4a76a89cf3261cc1909ba5470d3e078872f1b7287a36c986d2113a29a50964d5c80bf87f3ca481cd6748a91c31e94e8ee8cfda615ab9249eff787bc615e014a11e75cae53f9f9573e8604bff5b880ef8499703463db5a71b093adf60981bfbfd00fbaa8c6690d0fc27b2aa75d58570bf3c1fd77912aba09dbff32274e73c575865d5bc73f9f1cdce8066f925ccd31049c777be01dad7452349408566f4c2810c13b95805792513d0236b4ba7e142e5c8c7dc26e0a628396c45861b614c5f8d627587adb6574d276e68b0f25bf0e7f10e439e80db2c8370813b4d2b4a03c6a5817767d5b328d1092ce45033748f570d0ca32b19d25fb6ac12c6f8b484a8e2ea509f4a11b7996c9e6d3abfe2f1d89ce3a2705f2a1adfeef2ec141f1f894bd5d5fb9b605bec011c4753b25c4f2d4c5d35cecd409ca6d290eaa52e416cb0d601918098a9a9dfea46cbe6e4ef61e67094b313f04448a5e0706d49ecccaf23d083dc8f4c8eaaffb8451746ce85851894960e7df687bd24babc959bb71084e93a0b575db7897628675b9139ab6a9c31bddd58c014a860a64103053ed333214a4e8f928459e521ba4bc1f1936e7e2c0ad3a4f35f5545288345ed1072a302aaa4bb422d041ae5518deaf10d869d939ae43d6bde03b25085483e13311288a27ab6e211079d9141ef89664ce6289cb2dc18097b444a5268fc230a81bbf4e01aedd925ce2d1e73a809f5c1bc6a33e91b28059632d1c7feac77df453a38b5357cdffa0d234d2a86ed0fc34d019e7ded9d87cd6dbd537b474d448af3cb74aa45ec1c6bd7c59a7078820f11e8bd9e8e8edeacb24372e4dde9451ae6649bf4abd605cd6730703437a2f36916deb13b8e8d183bb4d7c32da9720e9f1c23850663bda3d8c268471de84d892fbc28e8ee22e3369c196fbda6124cfab2c54e15440c4e27e4429bce9c4297287f8ebe939dea95324eeb981a14897bece61e35701393eb3ab659a3159ecb19e6d09dc0d2a630a58bdbbac1e0c536f2b6e604eea740054e425bf34f8895719a7be3a4117580571087f49088652af6450ec20fd209020693e31fe58b18eacda49b3b245dfb0ae0aeb0d1c0f036de53c8096582b813db096f3df7aa38da5803fe591c14166bee99118e227b2c81149322489a56a696ae3e550e23f88224c8db8ca0f048d246c9507ce33f901b859235a225e26bd0f35a74a6a7d85d95745ff6d45ea5aae51ba42f5fafea5d64f7201f905155e743d561cab3f0dc8d03398852b8e24a1e27558266a7a868de044c72d3d1d064775bc9de806a8eb7d2d735d70e37f34c33e4c1a08828f333130106f69c60f5648d4f4419bd6cccd57188417521dbd1ea4f0ae2257032749fe196667ffecbb3497ed10ad35873c44db037ff18123195fe916afebf28a5fb90d91c91c702b4c4f23e4e9fc6badbf1b678fe76ebc11333a6db4340e9da126dc84c2ca815ebeda2f7ecb7654df3d1958a7778ee2678bf64578ccb93cca228d770494f0d59ec89f1b2800756690429060430e77c0b88fd7c2214c559d44474b39fe269ae6fee2ef6a35d70b219cea7f04bcd11706e2cd1f56fa8ba8d399c0cce55b18a3e995882733ff0c63c5cf184f3a38a91a902b433dd3c2d3a0dc4c50e30d5f3f9bfd7f60519ffeea0ac96d4ab84c8b8f329161f4622656f01f7252006f24ca1f23d8ce243c4d070a30183f5e4f1779703a65a48da90553b6e410738c84db270eb129c82a62c26f812d9628a15f45a8427f6f0c14100e398c488633d2ac86151388697db61992fc4948da136040ecbc0eb76aa7aa07908b72cb2bcb719a54414c3755229bed338306bd4b5491fa29ee3a16525db5c1007033db451d5cf0da302052fbb766de86f3569af6e46ff0945858f9dd52f2a72b2966d7c54ca7131aeab8b67266b94d3871c513d52e3b532b00feac4bc93fc6399237d0ee6d69665b3af154bfa646a3a578b9f98f7d858893507adf1221b073f2e4c50b274ab280e1b26a169886e2bcd4893c15548f11c7cd830505306779061add04b1e5734bc67df84980acd74574cc205543f991f118d7284ccb4c4d9f54d1871a00c6268a48f9b59dd4ddd4bf8f861a3cbbcb5748660a8182c6cb3e1d6bdecb54f56c6933817ba12afd74b8e8ff631203fa294aa2091f40e4914355da6c1f0bac085388d17345766808ae5abfa59218950dd369c6e256870bfb5789f5e1d4a97340f9a962e4937aeeb0defd980e20598bdd68425518b018d37067d1c365bbc247730db31695240b2e2883c58a8edf1d9e37108b7c5f576fa2ac269b26883f541a7dffb25146bbae4fe3900301fcadcb8bc0a00b0fa316ff8a04a6c55209fb127da406f9674009c2e20db614114fc5743383c2122c52f27daa70ead2d5e00ed2a50de4b67d8542b08675fb39539adaee2338e8fe19846d9a18e6d9682122c8a0a622a5b835db000d3d8318a87a76d769d872a8ccf01072f5f71058770d1b1dd5cfc5a5af457e62cd01da88297319668c5a8645c102158c5e7dfad2932711789a44979ad7e7337a69b7dcc29c8b1279b4704172adcadf81ae682647fc684351ae5da0ecf6ee9d900cf8d7d29e7ceda7385b98b2c05f069991061bfb00b1c7dc668886954bffb0ec5a198982e4ec77869fc79da7d95b92cd901d8c36f6771a64ed81afc8fd0c0d8d5f79d4f919ecb4506badedaf8fda5e3a9de7f8dea577def88c1e0f1b0e14e08a47ff85c2a928f95663d6e2f5d1e9dcff9f001c1306db2243ab0c34ceb26432c877597602bb2e8bf463d1f9afa8e39de67b3b43f54e80bae59896dfc7569b043319cb53e379215b0c8c8b8a7c67f2e6698d72a343f303e715db24d77ad2acfe83d3fa1a65d1f94d719c8d4516b021ae0a488cbc52b862b54cc3b2a858be86a9437856a978eeecc851c8b0c0845cb597ce6b093dcebe0c05b375a5c823aa03e0449c9772e35bcc145c1bd7e095afdec8396017017895285b31782509314209e3c79ad3a9d80b0f7f54390d54ba0699d23e53fc0eb266fa7d777fa244a7dd9dfd7d9313f8cd3980076e5ab1e62c6aefd049aecb887ddf2323fe90df38b2bf76a36f305ee2b430ceb0b2879c63800ca9dca94a5b0dd6ff768d516224ee7d9fbe04d42ae16f8967182d55155f0125526c8cbb1f651ff2867c8f301621f65dc3334fe96b5ef49f9d913c71420533ac86d769173c2e9401ab74c243696de8db47068b7e0de56b63be10cab5a6f09f7740021fb9be99a60307a90676a65c5578f9963a4cc256829811fb2b45cd13085e33c2390f21f9cce78ace23cf2788527024e1041bdc1a430f6cdc57f36b617c1a45267990addfc14380ddb3fff321b0eb61bae24af2ad33de982b0901cf760ec0bdc59cf2a1859e9f0e4269c3e82c06c354ac7552230d26f955da5df27b1957e9570eb687b724da2ea8a377bd068ab26ca9cad6d50abd1d87be51c5d15186b4e0c898c7db513b0bdaf74df89b18fc88770e32e0263df00adfa8afab90f160e7f96c33e89d3533fbe0dfbf6e1d1e0799638472e75e01a2dadec7ff6d3dabd5fa79f3d5d3d74f1ae2ed72793031290757dbbc7136a782db59ff8c85370b2c08025dfb768a8d487797c1fb3b0568af71ac2cf2ce91822fcbebae6b7b154747d6cc2855262fc201294547a187f5db21858930fc157c57f9721204018aeef0bd79ec5d93271325891eb61f06fb70e6d4618abc0efceae62c20310a9063371e5cac44185c78c67254f531638d9c61ee5fa2a4f02dd8b8327c40b271ecc475f411375ed945f2bce50803d41f84bba76bb3e48fa814d610b83136a0589682a57d852f601a757fc627000fbc4d2e2e9035492d7aef38f07aa0b2ab0e8d444d6ca9f2c5b1f92253de07ffb0a17c7990a05665d1cd97f57c089001d3e627598132e8b9e963589234398950076b0876b316eec96c8148b8a2ff3fabccc76c488cdd72a928f6a53ed3a95296833ab8fec8b77be7f10bb1c14ee36c17ebf3108468039b7fdb468bf2f0c6982bfa45e09d88356659a47e95f2fb4952ad29dbc046ad40ea9aed96027fd6243fa4b0d4e2927b06ef2cb77bbf1ca0d66055146aadf8c967858499ee6c85ec3cddf1155c4970cdad5eaedf0afd1c9e7425871e5a1f0d03aed0f042a96b81bb19772dff69f012dbe5d5ef90d2c5052b493fd9c2d0f032d9ebfbc648d5c887cf90b1fd5c93647b4628a8da8d0bfabfc0cb568faf2926d741670a2bb384b7884da13df42a20b91ba8da822951014bda239c58d4e16a4e7d046c7082e741a1510b98c376c596d71227b03550f4cc767bf3c414bc2219c7e2a1cf049bd21cab406de78576d9be0c7aa08b2c24dbc34c752a6466671dd05bb9d0ee2a35b3d5b5828f3e0ce7b48de3f4021657c997e98db2004a823b5e7f98e5fa7d010d6422a023d7850f982512a0248837c6eff2322fb7b77b6862b712b3d094eb835559d72a14689b014ad943bcd3d978942bd1c5059ead3f763339184e10a9303b6b117e2de1eb3003d7064ebabfe52136cb6c999065ecee0380588c7743c848580967695f6c8e67a51a1286565e2a01fb69b104d74be196c30e4270505ef4491e8c8d0103116093c84414cd8697484bb6357465350c180a4eefc6a8399ef384bb39ab2e52f8ac410f13741d8c52f0d467a5462e4852c208ec49f65635abc2251f3a9d7975774e076aaf7971790b78aa394f1587b377075ef14d6ef3acd7c03a7b805f3151bb09847b4045c0a2921ce4e448fc1e0dc2c7833bc5cd4b76de9187654f65e78de35e0c3db36a464fff70f295b04c0fa2c4b03f660a5e875f1acafe4333cc07706290abc7fbae88ae1fa8cd454ee1150b6833e437fc7cf59c28dcf99d07123860aebf1e36f1d25f5c7f4dc3fc578f615dc25340ec59fc27b0c0a5d2b229a3bc7446e313534d9156ccf28a2dd7366ce439da125c124aa8cce12f62f49b57b190c0efedee7d9f49ec8f91013f863474e2df0cd8782d978db791f84b9027bc804916bea310002f7ec933a7f00d10af21d1176aef1a78249ff41ca4603b67ded5bb46ecb6c3e084b465e733cba989d90a92c839bedf72b51108d7bba586494b95c5d41906474ca12e87a9f88e102f0ec7d9ccb23027534bd71218b224a5fa1f21b21679bbaae9094339aa79ca68e9ce5e4cfe626d7cc98484f35db7ba5bc1409044b5e3f6888dce2e8709efd2283327ea95f037c4cfb2082e526e713fb8ebda8417eeab48e9d8c78fbfe74e0bc08129ddc3895533a2926798009eb2f19c884e2256983882467d876d1f6ac0bbf5027e24ef0dacc9967895c09a803e858799a4ad6e5a458b7cc3f73d68527f36ef3f2659d96c945ab4137241ae4280559092d502d739c30917b3263e7321b53bc2e15fe5fa9065ddc2b81d2bc11822fff8ff012c384fdbef667b7a3e8aa276126810f2237fa9a7b1c96c32b20937963729eb527ea326982b5017234ce330a12ebd1c93d05fc06decd5abc694d046e0a517950fe005ef86dc66238610be6716b67e54d9f427c845c9965a3146553794fc236b2b050d7aecc440a00c3d46c8a5149dbd902256a1b4b8073bf68521e6bc186c392b6864311d21bbbd72684415e21f0428891655e96eeae276a1958c8fa7ee031e2bba2d75ab525ae2d3100a20741823747d892c46835803c1dd38ef419474d9d0573d303239b10fd6c104891cb98554459d2ba41382241d86db4049638b1e9eef17edc3332e9038f51b15123f95134c575d2ac7e8921a48d38f7e5a9ad6d25c0793498c25347c80cc92f6de08be9c5092506dbc9a1c9a1e1646cbf7d21f9bba110741ecf26d9ede1aba247b7fb02fb8e80f773c6af5dd4807de848e57fa0fef3595cdf71010152e67c0b4988a28d431faf8a0ba01dd423e3e3d1030f29643fe17bb72f29a1dd80324a5f92ae414d907655e1d97f688b0140738afa5d1ea610b5a8d7348a508cfaeaf2bb8924e462b6516cf15a5f882b1df813803c4cbc0f1b821ff974364e3e312ee21c2a6d3fd0854d8e2e086979292a2dbf43d3ae08a016cfc384680f66cb64c97e8fef67917d2d3e34228ee539f47ce0595825361a264187504b2920c1182013784d06d418b89dafc1469d6f4fab5d8386e940ef11e46fe685cce87337929155f15006687de0d1b1bfd9f9487c4e77d623bbcb9c96da745ffe477dd362e7f6bbb7f37690c388529cab9ccbc577ef96cd0d32ec9981730cf47b2753fcc26407e27aa5b32a229ca3613c02806859097b75cc96c46655fbfa208aa902232821c2402e780cf933608b98f0f3c52f79b15ec196283f481d006bd43fce075e5618be101a717c810b2e073914c711549fe22c39bcf25f1d0b4c636ef92c2fc97651011b59f99c6a05157c7f7aab0fa1645cba9e7395dff61e13e6552bfbb2ef415f46d5ae71f0f7cfe65f3c5b39b5d34db04c5f166702b2fdce5f04c487ed3028accbf3da510c05cf104bcf5633ab4a44ea32df7814acbd72fefaa3f1da9fff62974d833c0b732ba563634168a75cbabd4b4785c762393ca75efeff7bf5150478509df5f8709fd330df110ca2198b5e4ce92fc5c613e4d41c21e79029de18c01ba130972557153d76b21c04b50d6e1a013158f5c47e8a1c77b0aa5ed18ecedc4a523a5d6b0aee7ea0a75572a0b54ad2cf96489577c86edf4e906b1913dea529cd7e9dda1310019c6dc51b4641a038ffd7924b80b9af6a12dc7f8ab09770612152004efca8a65395dd248c96aa4845452b884ae48ac74d7eca51b40e9bbca282e14a265938706d6b101dd7f5337d4b725c61e1a79e46a29303b78d512adfefeb0b1e7540df32f7e513b51def3dc7ce29176722ebd991ab5acf9d7617403c6985cef3601ee5496c7582ae4ec98593a5b746586fde02aac4a2065be599adbe20edb135e9d8ab13ac00add4fa50eb592d5630bfc4c2d325598bb97ee38956233d1eda5602601bdeeaaa8d2904764322021c3a64a144cdc2e8b76ca3b9825144e9ef8a5b9cb2ad281db08caad09dc51d19670b975128d5832d4a44ecab2dd4e392396eadfd322f9479c637e4fc10b55b2afc66e6de7ea30ddfb56bfed8d3e05e0a4d2751f49310c4419262269bc9a2ebf4f8bba0bb94d452fc60a2ed6bb0e578e4916ebbe0ff95ce265a115d4be44b6bf650b5a4eb94fa77341969b3c0ebcb07bb0c7821bc0709a93b4f2478454b741087a35cd07a13a685675ccc2eabc25d8ad3c7f5af234e7241f623b133afa9489f8453227b0a7a259d43721100714d2857f9615cb846ba363ef789bdee76bd438c40c7fea960a8bd55513033348699b7961cad63f6f42d66cc431e660e48bfc1adf43aa0dccd01e4b1ef20decfb4d5cd47021fdceea9e16328a0de9e33187ba04011bf12683b2ff85e8602730da0eeb96e5e1f2ce64112bcf9258ca1ec60093077f690daf1f0b4e95233a4d87c092d8bb758a856be895afdedce82e5148085f7e1aa71e279b8609cc1f89c8f2dfe7201868e754b57eca92a074b05ec878cd5db88ef975ce4906255b3199ffd16caf0fdd4c9cab70ae3872cd807b8bf4a364babb7acd6a989c89eeec35172fc47e398a85490a272b8feb983e69ba725f66a4d10556db21599d82805f6b186bec99ae06d8c068dcca64cd4d34b339b5e9076ab1a4fbd8d93d0a378cece535fb0b6fa581f66561d14b99b374f18c63063e1e7b7d1bb02ce395772621fda74625592a1509bfb7476f1089809039b7c2a26c2d64c320a5252f91e4414ba9061109f2860c2df52966398af4e4c210b6b269869702a909a19ba3482e066d50f8860673122de6304c1e9f974482078faffbbd3a24d040a2498cde2b5b943e20e430a95b7f307517543042edd7efaf93c99abbf5337fa85bcb7c53361c8bcf45bd1df499767c06e6b73ca5a7d4e06d6ccd0628eb48813e87d6a4cf519c1022b4dc4c5bb33bd6f5ca7d45509dffd2e6e76fcc88325810881ff9d11147fbc6a2a1b97fcfb9b5426003eae371b2992d95c0190ebc3bd6ef09e792f93e061a6ea994b32d401febadd90de2a5a6af4658c78c6298fb31bdcce8148b972d98b7cf0d3731e6d91f840062b4afac78bfb64b56e65b2de22231bbb313dfa49704fbf7cb077598514e25e43409fbc3b4e65db3b0c0ce5b835402e66bb09dd55a86ea57be1e582366d67ea58d365943c4cca29101ce70af911d6cc3cc204eb2fbcd07079a098c6fb99d632db6ed099b602002ae7000c4231c70832c87bf8b916facb0016104069e0297a228e4f24b1ffc9e37e8e604403ce491e4469cd0592bce9a5fcd2c1a960d2a96176952e6e6c7c53c950e2cc3efe17f4f8c0215f7f4c9d81c615e7c112cf37234325a9c6a041abee4f2e1483525ed7ec6f864c25985ac92e2b098f6ae42ee429a451305383627096bcf95018cb22cd9a1140ec78319de29c8b5211874042a1a2b6b2005f714d3c5688ad364ebf96c59216c32d325bd66b4149e8acf9817483c9f7264dee0ee6c17252fab5f1afb4e41f5d513ba4cd18c818c557174f6142668932111ae8886235d28355e8ffca886470becade505fa99472c03cdb64e9c76d20e2fcf77d002c69b653060cc13920b703afa67b36190193abfae2edea2b75ba65a8a94f147cb10c388915d2e620c813591476b40526bb0487d18e28d882d588be8c1b6c01b8c92b4423a80279b31e14408086d27f1795adaaee62273c4a2c09674948107482445230d40c2d51200613e4a7801e2d09158503d1c63e1913580a22056a8523239fd8b5eb7ad4d6688b65dd946c63c5e0343e9e207b744fe28390bebe69ab19bce1671db644f5c4d706294bfcf23b1045c0dae24a1b548f832d704c1171d668e046a29055765f64cd122c83349280207f713ec6d7e3362320df75136a5305a49103ba72b27f5820cc524a0783fcc92540a636b56512542300ffde127ca48755ca33eaeb4a3fcad21b18b0a6c2379d0b877c96e7020070fc623abe006cc2c593f76252b6698f12d8255385b3bfd9974e5664117d49c8de9b6cb9a59429c914a5072608a0075147ff084d17cc60fd434a95744317dfa1ba4da541305656914d0db60632d8fed8b42a74adb921786955adb4caab6ed3afb7386cf5c686d996964d76f5943d656b3626b253d844a20f1a8cb25bf64b6db5fa6d255772255752ca8f88a505d7552ec431eea87bee91b6ef65b41db17e7ba46e7941a26cc8532ecf3661d3d8909f7eeb51b2e1dfe84d0d4697c2cac299764c0505b9504389c5a729a62b2f08cce0cb7f8a89415f6a3042b9fd852745cd08fb5d7563172737642a9f6bacff1642080db28ff94db5213e710038c4184fa85f0485a4bb7aeaf54fda0c6020d611c6ebd3f3b95556bd12b3f14fe85437723e47b1bbbbbbbbd65a8f1c8b952ae254413535e54d0daa9973e7fa57ab34cd397343ae9a33e6c63f8a4b110a0b8ff598d8138cd8eb62c0b08e68e958869283e5862e0575e39c7136cd836f9443e7862e0525e78d508cc5f735cdc3d930778cd1ca78dd3b07c1e7cf8f0760c6cacfe353f3a8f5b6b1215715b1d61381244b57d8ec271b3b35c8c15b8a032d754d70f76fd67529068acfba633da64de9857c879f7a46664f0492d0a9725d2a2e71749a6efca3168a11ca56e5912d2dc50bf0e0cebe6106ee3c2a21def9448e14462b979fbb1d57b08f69d085441063fc1a638c532ed56044622b2c53c9e8a166fcb1f62012740130c813b99c6c1524a61b72951179b9cf6c56242bc29572d42ff71e0d36acd9d31d2bb0f46764ee699023a458f71d21c5584158314887f41212e359ffa21f9f6ebf75de11ffa3d677cff25e42fc488c7b7aa4f5befa55fcd949a0e76dacdcd3a220dd778414eb7ea394fb20acef28c6aac32207e97edba851358af1acefa8f531e867b46d528f04fc59efe560c31a3bef48f7f6e30a859e6fcdcf0bdfc5747ef835fb59c429cdb49f45fcd2af48ac5f18b38c9f64025a5e52cf97a5df7e475adfbd7722b4be9751f7bd84b0de9f553b8ff5ac2772cab1e91971cecac609e89eebd35823042e223e25d80b7024d4d0831bbff5b343aa1cbd19bdd67b566c5867b6630536fbf8f463adcd7dfb4e57146375a4cbfacc7b01b14fff957df721d2cd4ca81fae3e3ef55e402a53ddd667b1fbb1fafac9ee595ef79af44224ae5ab95c3dd0faa61835b0c165282aae5031755b9f3da07b1a56f6da15458f487f186fd6fd583deb930dfa0784fb2cf3340ef403fceb7b25b02dd66bdd1722c9d80de95fc9d0e76637a3f4b3c9f28a6419fd2c760ff0cb755e9178b9af886f5fe85e96d198d4d967c46fbf5c791ce8d73e1328fd5e3fb2ef05a4be7f28bb1fdc60483fd2be6d3912f4110cc443ce1e0dcaafe39c2cb93010f7fb833d5b4ae9359b93cae539e753c96c3ca8536c910a7318b558f0d6a128050a150af9cd11055888d983f8c523ba5ce9e5f613c1e011285879310822bedcfe1f18944188b90d24defa452706923f2c61bd58a575c569ea7664ea9aaa24314c5a2614eedc6e40ebfa73d26d8fdedefe8d0245d29a52b1796cee98bd6d904e4a4106ca420a6d308f301eea98655946a3dc3e6e7960b0ee7e10e0fa34ccdd12b1be8492a684ceb9a3259973ceb92599f354c164712749994e09d5a6821455ca93357162369973cec9056dd2e4882964d07ab0a658a1e7888642082396cc07ffe75da87ea54049ec3084154ed04045455e6102059dc354032b3141f650dcb007d4144e6ec84f5041526fc258a3a429a19452eaa50a2a6a157652a8e20e8d32e79c93ce4922abd0228a0a3ee78a2e0d0b090834349440872aaeb0e2c9ffbc79f39455b14605695dd6c75a3071bca0f64d1a1c59bd0cf5a6cc0dedcb293e9b72ce3748ace077ce39c12ede68916f787012f98d0d4b2cc8374a5254ddd0be1072e4c869aefad81aaed8a4e887941bebf0c840459fc6a0c76e16f16def039d75d7009f1d9dd545fc4a59f4fa31affc79e52743eeba0fa25e451ded2c078a28a5947215853806350f8dbff0bbfc610ed7c7618ccb40714d0458a8c793c043f139c64e36f3478e1cb24ce33ea7fb941d7cffaa6a610ed787c1ed8ed1234ecd28986fb33a76374f9613d162aea05b30a160cc2c2920e924e0d0691ea2d0c18e17477899410c1776a40e52bc10a5704297b0cc610799e509a5945236db9299a539e79c5bb42496ce6001536689cc218a3c38bab80e021531a490c50b7660708a414561270a298c608edededebc00792363e08a715737ba96ed0410f884c8df3c98b71a3dc6e81ee8910ad12a1f4941fbd51fadbe97907aa4fdeab35d100d29cb8b525b836050a305954be3b21a2d92ee2ae9fa1663e762a0d690b02110b96e8df8ae27567e3abc8ce66fd33b92c27cfa47d9d3ef25847efdfa1dc93efb65e1587741e6571d5614841dd6e06dfe6929a557ab11af3134e2d78b8df1ce90b261e50924ebd95aedd71e840e8df8cdbe703aa5596c31db7caef40b91aee6bd7bfdd4cbe873d461f4fba83639cce46fad785d57fb8d3fb0d9d3cf3edba4c746b0f68528d4a75e18847ff5fcbd7ec4d79efbedbbedbd82dbb7f7fc85aeeab18725dc50fe10d7d5e86fabee39efc8eb47f6abd5e7dacb8c662f1becbc7e5f7df4b28f9da669da735e1d12224529dfdcec7fd0cf68a5af7df54ca0affd466b5d7daf9708fedd1bf5733f02c7942cf15fd2cf7decf50be97f202265b4289b6a98628c5c966dcd5572488332f3a10648a2c776231e1b729c127c931cc75b59997dd7de40a615bc3be7ee3e65dcb05e4966862eab276a758f05451837c6b8c48a4be365f3e07169bcab2ba2e1fa0bba22d7054b66b817bc055dd10516fc8caec88219cf65ee8cf7e98a66f8bc8caec8a70032a264e0b83264bc1d7365442941726524a9f2fc262a05237ccca9f3863560d77d6d73bb28244144252d0d453279b258cde76a3f57d3c0b8e26a618401834c0e28305c30c01765044085c31ad7816ef8737de8ba7781e7ba175dae7fd142175baeef7822e9e9d28832521084d405cf972f7440a2a44649621142c4192584b83367694af6f0f1adab8b2b61b8cda52fe9db00ac10b9aa252e7d59b9b8e1d26f592323ae9ca9a109942e26903c68b182e32ba59492c55dea83c10d6ba4d962882a2855415cfaac05144f292d028719435c5ca5d1428d16488ae48f1a353c74c31a2b9872a91aa815dc61228b2f97feaa2ba23f7628163c0061a1e6d2d7ba22ea0202aa8b3ca410183c58e0e1e14a2d5f5ab42b9a63ae78e2ca9f49288f2b942e6582cea5575cb9d44529a55d0d3b6899e109a8289cc81d82684329a551892b5fca6a0410ad035cd9a4c7d2a89366050bc2dc71d59942698618a70bead059c167aaca823a5eac20038cd30c3b4e96629471f2b1d342cf1a19766e7062a798a69a62d82c515a524f3d45b0c022f364c57462a85a76d840e1ca24b1ecc459dac254e9ecdc5995e1ec78a18599daa044a960a856539c645254da0d4fe8d454f58185d9942121472853459960c14798da32a558a14700c324a1acc013471853e577902cb198a5762d599f79394a69e986f63fa62a9d3063c4065466c2c0943063260c336f02800233564099c90206eec1ff018518d3303ec3e6cd0842d0f17721fb50679e38d9accbfab8a82e33c1b441155b5f0077b03d337050c6763ec048605746dc60b2aea81e2c8dcb5067daa839a3050726b0f632141a261c0461e56528343074b0049a18b8a0a90216292555283478aebc1cc504889a467ec040524af9335e4687c085667cd149c6e7b4f919b9c5c9bfa393537b216850dadb5e062cd8beaf7e19fff28ff148b157ff8c7ff97794c5fd339a71e413a570623346082f8208f326d6de14368c4edcd5b2854bf3882f1166bc8c1732e37bcd8f21e435bf2016bccf736c8637c5f09a5ef367fc8bbecf7c19ffa2f463cc789fef288606868d5ba2d30caf4e4f460c3b592d5bc442710aa7f0001cc56418cd16da5aadebbb19a760a16efa81857aca9d78a8e7ed6f5fc86fb80d0b0d198e3ac00da35310cc73f226060aa3d395641836e5423e45471b100d19eb4d55ea80815efdc2a7e14dd2c730907ce9f235505ae2d132a9f565c78ac54ce632475d3e40fd3008e65da6c15a7da21030900bc52c0c237ac3fa421d6d40344f66fb42171f400b0a75c0408f7e215755d9f8452c0cd4ffa6898d71a83450a2ba336b20e221edca0fe10703a434c240f2a50c6a50d24062c3a0fb2fc45588104519a5121a141465f5a15f0d5783f25d4f49e23031c5263c24b770b95a8c04312221c85410128884800d150fc9205808749893161ee2d897332e3251472465494957f8d2cf3e99cd7eea713569529b94b4c4431dbf081ceefcfe0a033592fe72fb6392152b6e686fff2775a1a2a27092ee002e434901c3dd5afc2359eeeeeeee524af9bc926337aebb197d38fd6ea8a8a44b68b0692029212669a064e9ef7822e9f6c73b3db8ef8f639a47f7fd318a7d90109f044025e9c647bafd118a87b4efef383da85a055f6e57cf9eabb56ea1e5cbf52f32d1225abb4da5795471a1d677670083657deb8dcc4b89da87442974f3c85483a51f910f095bff82276c1899989a877c252c12b21ecd636e3884c7c8cee306394f3210fdc85402fd76b99828c779803ffd6a784149f0af3f6bade4b1f2c75c60bb3c86f5bdfc39e641c3fae5d743d362ff06d1e686b1ca8e226c18745b4f36fed956726cebb21cdf1144801e02906c226080201ed22efd1e3c945d4a298d94ee6890067957580b368fb075e9d3a78fa379bc44982fdf68befc5e6e24ffe534c8ebe16058f0fb06a9f7848dcf2d1ef2a74fdfe5424eb15d8bd78fecf267998f23ff1b82af20b1cb135c945f12ebb098041737ecf1ce64c3ef6e23b6b8758d06df07b38e0b6e5cc1b11cfbf0501d29b788237f4c6a9fd78fbeb7430f5caf21bb600561c35aabec8af43512af4767f9137511bffef93050af56b4bfc6cbe95397b3bbb3ec9d66efd9f7aaaf5a332dabd98a66b4468334fb5c0c445d48946905875da8d6af66f139ca961d65ec2867d3bebe84c423d947a4d8ecd7be5f46dad14b483752cc575fbfc8c45ffdfce339992753c97d822596b0239528a5948af912a6c91c33658b3995d426d9145a9d25b78261c527fa7cf4c1ee75d655cd42326c3ef5a6cf902bbbd3b4164d8a1224a14a73ce3971e0acc89aa024c86850a299d214154c4f64c8d8d089939da1d366632e5aa89374450c5f5889f23fadcb5074cad0792242894f09cbb97a5c574baa25852403fbf23753f431bf768add020ff9d7276020f95576fe0555ac43d9f935d34ba766f26abd9db8a71c2669d59572cb93ed0fa55383528bbbbbbb3bcd6a56b39a65533a15f13c72cb4c63a58cc997f225a5d3952fe593749a5912175bcfc8ec2ebf38c34b66f6cf04feea00bcd8500ea08b0debe54827ba942edb3f966ea4bb7b411a74b11c638f066316fbf10586e5675d6139cbc62a39dde8aa11b5029b1b81e460f969ac60f9392e2c3f8d26cbcf6961f95759587ece0acbbfb962b0fff1fb698d952fbf23f225443b32ebcbef6524e94bffa691cf77ed031d16654357c631d72ae9e9c95aaa6ecf9e3cd2aae8c3bf6ea25df050fc3a06a9c36dd9e4591303655318d6df2c75f0ac04d3091bcaa62a4a45a9eacd92a20fff4ec2427d03c3fc5b0505ddb8a18106afd70d69950c1937a455d90978c83f1b32a7e8237e5d259eccb2afc618a43583e5a0fb65d7bf12c2c84005eb3f4370ffa0c12f96a5571692672453ca9c65f2e7c7ccccccb17f91735e13e6471dfe8573ce497d4e77671f43bf3f32f3836c57aeeceb17cea79ff48d29fff44c4aeab37e6c3e98b579d0d9834ab13dc3fa4dfef931d07c39db063bb3e7ccb3f7ccdd9d4ee7a4b75fa553122e9862fde51070052a3fd9a046e99c93524a69651b73596599ad2bfbfa8594d2f7d64aa394e9277f8d95ae7243db1c1c1b3fb4769b2fa5d632217b7bf9f20db3eff5c35efa56725b99e1b2496da756b3596687317fdfd1b9fb0423d90581afc6401c65fdd8ddac3e0b8a3f4ebf6d153ffa8842d661433e30069b7d17f13c79eefc000085ed9e7b18a5dfd4697baf9e3b23f1fec8600525a8103e2019aca084822bb39a7943828e6ef6e4759ed39698c47dafd5b31e2976f45a716fd4fd5196d567c4fd113bac23f24ceb07540e04095a7536a66672c505b9da576ff34222770baa755bfde6199137669ccc3167556b500fb0d6ef2a653a72b7a05b3b22dfbc217eb72d7ba2ae73ca5b2f145d8146e1c6f899c07a9e3c4c3d3f645580e3b2428aa156d13452cb45a105153e3b1df87abe0adc215fec351b27a06a14a87d6b833de4a7860fb6bdea853528e0dae28324c5dee1c6d42b77a2a0246c2a777efce2d2276a10dc3afdab3744bbd37f2efd420adc213f57360f198ba2b4dca960cbe001f0fc2e1a6c28a5dc7e0078ff1978367078ee0ee53ad3f5a5eb9ffca8e5d29f1edc3bd32bc2527e7d27a7ef1efd1e4abf5b2cfa1db73dffdd322e7695b6d25418a8df29d392cfa5c914e91a4ad5604f6c2a3ce4b7eb58b9dc2da0bbf30e03f5bf1abae6f627e08654eaf6bf7ec40fe79ddb318e8cef5a2d8871e89ae843aa79b00b517bc5e9125df2f61933aef4e61b0094b131261719a582944be372940a4e57724f13cac6383ca4cddbf3126183e7e085800febe46f4a80beefe037f080707836dec3f130cffb0e827cde14d1ffcf87fce4c6c67fff46dfff3ced5efe7d363ea39feffb8838ac8170bcc77770bcf737bc0e1ec8037a22df9aa311c777248b3f8ef77e03ef7bd0bbf1409e8defc0fbe7c0037a98d7c17bde919f07df3da39fcf3e0eef083b6c83204a6c7c47b218d978d81fa9ff1db1f1c19ea877b8c1f13fdfbfc38d8dff0fedcbdfc8c6e378a3ff9fcfba977f22e0781b6f64e38d7ebeff1d58d8ef6f3c070ffbf083e6f7e1f81b9ff73bb0b040dfc16ff0e0051f4409d077f03fde911bfff33872bc87c3fb1c38be1b379e633f39fe7ba31bfff3396e7c471e8eef891c47920601781168e0e1d0e003f044fd9a36bca58ed9f8f794304140ccc62f75ec7f7a416cbcf446e0988d774f88c7fe6f784772fc8d07f28eb218e9f80ebe23254c121003faa518ebe0757c2fff7f8e1d2dc518d0bfdc3b92c528c7f7f2cff11cbbf1475efebd44d0f138de28c7df781ddf5116a3ff1cdf5107ff7f04f4369e63389ec8813c8ebd67c36387edc0638b7018d703485787d7081cc3f147fc1413c18d17018ee7588c85910948098eefc637af743061de5cf22607de065e00bc977c8efd7cf18af7925facf27dec30cfe398e6c5022eaf25468cbf315c3786651692317e2e7dffe4c243f6dbc7e743ebf3af2f74f97cf8e0f599532e7480eaae9fe2823a6e28a76e5be0c509b91bd2a513a40c2fdc71c3b914ce23b8c1cc7e1e3050f6d26b58f63b82b2677d2178b3ef6453b67d2bd9247d4269b02753f6cd2522ac9cefcde33d8e6d36bc23b6a28a229262287448a05012cb223f86b2c98697c1bf07802506eaa5a8a464632ff150d75ab2f1ff05a87e8a4f36bc230e63878ba6180a1d12306462598808804ad27d01f1f94929cdc3bf5794ba52f70ca5734d1c7fd31fa9629517e3c8407a75065a9c4e4ae716d65e8e6a52e786d6095ba700f3d849b54113343770b074095818bb41c1e21811c3096ec860b5cb514d7668e2060ea6d8ec7254132a514d5450a1d1ac71185882a8264b3026b65e8e6a920456452d2dddb0c5883d3fa0952c00781d830e9391d3b48ca39ccb67b2b495c7ae39f8f3355c96ebef18db0220ba6ece07ce4fad2e17e8deeede2e996bdb6e29a59452cae972d5eadeeedeedeeee1e4677daddddddddddddddddddddcc1e6b5633dbdd168c891cbf7ee2cb96d3a7f469a5f4e8eeee3eddbdcacccd63dbb81827c7e1abde9e3be7b43d5c10e7838dcfb1e9996105671f9d9eb4eecc2d2959b29bdc26b4d2404f4ae9eeeeb23a33334797524aca75c58172cb28375db2b816e703c7c6f7766666890597c5c697cccc2c8362581968dce5486d4a275a9b34b35c6b955a46679eace59e676a92524a3549bfd612cb0d4a2d8fbb9c4efb0b7c95ae71ee56f6d0430f31e41472dce568529335a3938ed46a46670f313030e2c96378d0608f1e2c7b7a68cca0b2517a936696de217aa259cbcdb362b78a110c8a42b109cf2acb326e3e07a475b32b5b4a6c7ca2bea2803b1bb7e23a6d55a90780411804ae7b0ccee7ba1ff2d20910b9b856d6b2140ef89e8bc613cfa6553775537f37b5f74c4bd497c8870ab7327cba46833e3e5dd17c9f0e8478b7ef91351109e103063491e8e3b2eb2a8081180f118765868c18b56948d597b2baaafd2a41f974b716c72f906881a10446125c1e2a3d75f2741191b461a590c38c242e2851a25e71dac2c275289f0f5d6acc8d5467dec42dc6a51b5f32c9a6282638dc5056915602bf3557b533ae1aff036a727eae5ae7ac9e03f31712b9fcee69316ace9e11d97dabf5acdf9cc7cf5baf46c36495a42b5c4cda925445ca690b978e49639a4774aae1b6969854030f456b5f0cd419e5be90b3cd43d3be6d83fe5af36885ace7063b20ddb79e763f58dffac2ee877faf1fff99c07d7d13581ff7b1731edfcd0bebbdb776f6e372fd5416c45663cb6f296b6b5ab665f57385f2fac88fb7b0fd527619374565839d7d3472552e06a795317e1f2748ea10db25730d1777f4b136f2701e91fb6958fbc795a53733478dc50c245faae988d4d1842de4fa823556b0ab973cf4bacc1139ac351937cdbb526a14b8f5d3a17b2217b2600e192f49b1fe10788abb27c81bdaebc3403e633608d1076d14f2164720982fe70bf22708f65a2f7b0c9ad81882526280c5ceefad2b821297ec09f2b6d2f471811c59f6072d4eb23069c70d665d7da275355ab027c8195d51f3990f78a559502de058210a777b9f79675cfeee4090cf711fe76d2bad66744abf1bc771ab8de32c6bd3a17ba1eeb3b55ad75f30eb16602f064d408860ac50b9fe12c808ee7c39878c97a41b9f8ee04a2963dd04bf61816a4900b458d762fde517065961c0c4fafbac33ae3ee7e0baea75f66f48d06dd939a0748d6ec6bba29ef7aec8468dfb0171ece8211bbcdb13750cbff5930de82be3eb0848323821c1020625b2a071136386ad7ef3647c2b2f94778be1c5cd0b8feecb7ecfc70ddacf6708775b9f0d3595c16deb3ce95b08384f3e6fab2f3cbad525b38e63441a6563fa723e9dd3887b992165432458fce49c1f90ee8847bb62e3e253c5f6f21b48bf34322f064454adc72552c788878a14173684b1248822b0a041bac10b2a52f0c49aa617a03883a51ef1a5890b4b5bd4489971e20e9427636a70a18a34f38212197c50228a175e52e044132c984c0933450a253985a5bb301126490e5cac5461d102945c420e1a178620c10ada784953c606364ddacc3047094c1d32588a50f183152956cc14d1650c92152469b2f06108252b5188711c783042c30209dc2041c39a3261d88b28787e386229890c45c43c0a9326f06899414e5211601070c50a2a2559e84c8142aa480f767218020571b248e14b12121f78c0f24445c78d12333411461b20f0a8417243145216195878d374c4164c501af00186285190c0f3660a05484c48be809344c40b4c5978d12189282827a0a0c9d243122e28beb800c60b4b9078e1e9d5449326a29ea2c890844422ce1b26a0f2cc80e4c9982e3d749b33499871a24c0a787e807204961f5334c8f004551518d0482e0ee7688a9492921b92ec70c5882fb248c1c1ce114f9c48228bb02c3081a50c1e20bcd040440d5257527053039425e4c82db379b0001c12acd0c59c1380791a824a082849ba8c31c2890c42fccc2084933a2e8019834706b1c110456c21e70b0c4b3c915a6201e29c3b1828488cfd183dba7497d2047fcbf9b894f2db06e0c532736c61e39fed7fdbd1e08423e55a96a282caf5e8cd0a8faef605c99ecfb4af861b1b1a91d7ff33af2bb259966599b31cab7d4fd8ec897ca57d6683953fe78330f61101d6317b0cdd98414d82c3e6134008cb178479ab77b780ecb320acfab357f6b5c197f6f433ff97f63103655fa5fac2cc5282534018b22ccb3249b92b9f5969a35936e79c349392f9d9a564965688bc0cfb6ab55a497777e9e2ea5dc732b3e5724193f53959f21429a59430068a43eee04f8d70ce39259d35f32624b394cccc524a29a5945232b313ac2ab6c15d00fed81579db62a27f5a16fb63fdceb2efe88f8ef891621c97fa6d2cfb5ef30ba284484c7298fc1c6e2cc7b4cf92e52542f6ab37ca7e95511965af7d47447e81a7ec439ee25864a21aeadb58babeb1bde56ba706e57b66ac7f3f295929656520fe4660398a853b37690496a35a48ba1a0f55285151b4cc1fb0a85158f82259e79c73ce6f86a72c2988422a4e9dd804e2ce29ef9c73ce282876aeac320aedb3d5afe25ca0bbbb2b9a9991797d6a9a94ac56967d8b2f708d4c6f0f071b5dabff5c1f1176f55eb4aa736a9aa6d1baad3c49572bc642c677df3801514c4e709e3ace5add7cf7b1ddd9fc699817ff6a6dfe8b962459b65e45f5301c193b4607a37750501838e4f72ef97e411359d34829074d3a77528e41ae17eefc1a3be6fc1a656c92940bc5e8c7675895b65d9f552297d218437214644727e8e4b084ba5952479ea15382254f986e08e2887af2e4facf1326782403eaeac78316cab6678ea8041ea25f2debf983feae42ba27ee7cae85826a341577c670fd2368d3f0100b2399f0e1fa00b4a13b9fd9cb9d5db24b3f01309003a8940278c0f5e79e3ba9f3263b20ad1f0a6c2baa553a23730deb276aae824be0a1eab12bd2ec4ac4bc91835d71e1c1f6e02786e2a9356ce2dc59410855f47294933437fca02dcc45d5103e709102869730f2045b7871030c29b0810c1236fc8025c825c50a2edc2c718309a27832473acd3373a20cf15b94133237e427285e739dd9506597a39c28f1840b0c6a2995a9e4b201e76e6c86c0c00e65bab860064e17282658f26632b1444e0d486aa05343d2172820020b1f9e9023656e804a933356a058b303179985c9d28a09262d38993f9f6813a529b436dbea7294132e576cccee85ae382465fff42bd2baac8fb54feca65d8e7202844cc1c7449b945ad5b41ab34863f4e862ea8dee4aaec7a406659426868ac2f247270957be7b174cb1fc52724bf68e6eb60c54b0fc910121307f80d4b1973cc39841068a3f35a4e5cf66d44bb03def60201b622cf3d768707a4b2943ee5a8e6777fc9658304ba794ba9c9e0e4456b2c75ab2f27988cf8df23959e98c69985d0ce4534379e7bd7bd8f8e7b3cc595096654fc199516a5d73d6ca94259d328b9369fc9a3d675ea0eda8044e974435e9d0d4000000404000e314000020100a07042281301c1ed2e55dee14000d7992466e5c9ccc635190c32808216388210410000801060898a9a1210e00686d76025bc4ea29c66fddb6a2625ef32650a17d51929d62e56f757534b5b9e7b69a46ae0504606dd7041902b0ed88c9166c7edae2f917205454e88abc5ac38df461653ceac3153de72f6d48708df4bdc8f5494b6e6f0e589b8d05e1a32f599c0eb4703af805f5e7ba19063c3213553b890b1e3413f8104878e29d927f86f3302866c12b308e9971a5f0e562c1f5372fe18aaf8e2e40d0dbf772add0bb868d736f6fa555237dfae0d3b0d09a62de1bf91eb8496d23c5ea087cc370f1123ee8c4dd3f680660bf4b8ff0ee53012625341a6c7d3a262ef00e23d8b42b83ae8125ec0359d869361d26e8998536ce15c471e4ef808d8917825f6f8af2787bd0dea78a4cc528c7fa1ccb668f297dba1a2587c1d45e900e0e1a3020ba5062eee10cb5761b9ebed3d6a6d0672b8cf10a10ad077cb63340cf968c0f51a2c04565806f62d25b8e8db508a6099e4a810b9d053c74d86a66cec8875fddde71ff2ec76a5123d2803790b430886eec3d83b57e1dd3db0386ad98029a74eef4ad1fd92abbf0e77a4fb6aa8ac22bc1126c21b4315717640458ab3492e4d0679644ed8d371a52efccc24715b1d5a908ab0ba4bd7c94ae6032833ea11ccf7efa2c004ba4fe30ee2a1138e6c6868bb86721ae3d088a38a0e8c49e63b24a275a614fa83877dba3a46d7bc2abe565ac528244b10bee5e192a90248b978777b897ca8af3bc37313b80edf8696418bf91832ddad7aa5055822c6eacdf814f3f9f9f701fc49ee5b94b70642832cb9b883f994f2a0050fd767cb1d6a7618dd35b7f49a74726bc5303fdda29631a435b091c33f32810c0cdf439f1d1c71e520e206f798ef2713ae4502fd133463345999c6d44b54c9753a4b943d2c1c56e8cd6e248e01d70bb887a2bb224da2517a133f668b32dddd59f4438ffe030bc036072a3eba9ab97fe5a621d31ff371be3ff8f3cda7b6446c797ae9ff1a3c0dd77c0202b91eb36f6048e8b42033d1e9ec14d211a7d430a44e1c9956731f50156ea6d7b70d1140bd850de7c9e4e5409e4519fcfad5aa90cf606e1bd68e2c8f49a2db2e94a3cd7ed0a1e52790bca95181efaab69a04bc593b91ce64548bd3343ebb108e882c57cf4be98d06fcdce6aba45422417e8d4c8a8cd9fd09dc95ac0e273bbf35c6a92830b3daf1e96bd7448a6a9691c5377bf6d35ab30331450c9926b19468c9792ef4b554f52349020eb109f6ea8c8540457cf80334706f511ab5419a891c01b27f28bac0e8878f851d49142885f64ffbe325bffc7080865f3c8d1ae5391de18526bce8b43d3422a994182d73656537c21ed39cf4a578c435568bd8dcd4d1d0d4b8aa0c8cab19efc2c352b5157125c28f771c5eb7b36f7ac89eb8ae6fd25f3b9b8feb4ce8c9861a7ca6a4a6121de7eb91ffc4aceb45df6e58e185c55316ff4898059a018caed30ba1dff6e5e5d2bc7489a09d323a2cee41a363990e621e5ae9236bf1e9d04c747c1cf713ba3a6c59d23ccee2e929b1fcefdb7445e8f12382c344a3bc2bb8fd904dc6bf3d66c6924d4c746884e0300298393c069081b51d59ed0efa673ae13ac788742757d91846fffe312d22b0b064a9269be70c4f592c0c6c0de52d8ced45ef73c43a5beb5b2ea119b026b36a1effb37f5a12692677ca2c5541421b230b03791102770890cdc7c70a662f1e82aaadd35591c2b36d7013a371e49e4de7d03423f2dae50a3b90e9179cef4ccac2c355af7b1e8bda115ff7f73a32137f52a4f59eb8c6910e1a1193ef2084d82c9d356319c934e1fdc96888d0be44f164cb03cc48e12cf2cb060b0a25a9e54b91e06353967ab779355891c3dc4d5630fd838d8540f72d9e2e0a637784e68821893b91e26c441476473e3c5608e067d75ecc04043e73b800a7dec75044d97c73f0e933ce1b83430b4a851104e11e1a6b2069e4a1c1a262103ca332bca7b0e252e9c66c4dfdf2ae04954229363bea1f88c183b70ecc34a2b2302d3ba0bb9a111c06ec5a2dca278802217fb0855a3ec8070b1176240771efdec29d0b4880d4371392a170cdf200faa9804599f96c90c7dc90260072255633517ff0fb5095a771c7c1dc51dc867956f830a24485d39f37050231e5fcb01e0449c1a2c49b1e4c41481a94a700c177649de02bde910e27fa12161399dfc84bcac462f9142f5b20ac5b29a50cfa442a04ba756843f75e50becbe095baebe4b075a1e2dedb473f07352a268f32e322013f4ac1caec9e9796843fbf014747798d3180c661dd459b583abc0c72ffa2403f583034288187c83ee4262581cfb45a1e6eff1c18333dc76a1b123518cfc9219879c90dc6413baf3b142cd965ecc06d11508dbb941cdb956c18dc67141a85ae572d5e9e7e78289497fb28733aa74b38115f72453178729f537c645adc677481290f448b568a5e7734bc7e30ed2fdb19473908e08ef89f0e4f7324e7f1c9dbb86166edac1bf0225e2ce3801a1ff61ed21c025793a38f267ec88b38328e908ff60cdcb51542c8d424ef440efdbd7eab13d3dd9c8ee930882250051dc5fdeeb70b2ac9eb2ef950bd21cbd697f544aa562c5bdc5e1dba3a89c20da006ab3577c6090257b5ab837564a2eb0faf6063c6d3c8dc238054fabd9e346ee26029deb5232d786cbcb997eb9f237288aab003a534f990912bad043603937329654630adb6c17aa52727e42b9e776e716128f077f3333990953b6d51d344adff581943dceb93a3455d0b577294bc41bec01d431489a681f505c165eef26738811023a4f2a564dd7112fdff8d491e168d15e8f3501af80b5d1e19542ba325cbacb755d2b8af9717eca17680e11b6e5bbbc04bd11a8ab82dda34442adbcf5f4268d1d0adccebda03c2d016e87eb329efce80ba8b5c80addcc018a646550acf33944ce4a8c0a3a99038ccccaa050f73980bb598976e5920d47792da8ba2a7cd5e94a0c0a583de184e8f67ebe25b5d8c4c9c1daa61cc4dd4a2529296f5dcf99226e21b98ab904fe9253dc4fe610150284f374145d57f6d9334f104b7a92c2783915f6d230b1f5a9a1bed31536ed668cea09d414b6979e37ad5864ea0e712b725889622f2d616fe61611e03ea358e44e46af0981ccf3b25a462220d52f354dedcecd5d3f03a2169f892820944e343bb2c9455ae24665a05401e39b6f7867f7a178a544c27a1c51888c447f7710021309b1bfd87fcac3a9ce0babc7d84fde08063f1a8fec58de1666fe375287476adf88e8d03a83309f524de2674618c0ed83842607ac8ddd1bdc5326ee942db97e00be6c4d95042884d9363ab6d3128274de8e879d587779b72e62bb96127844eaa1f1eabfd65292cdf32cd2ab58d76b040ed1b39d738a4f154fdd0ff34a2dc6a1cc05a078814b075386993addf53cb2284628838aead645c15605ada73443d9b002004d930980570187ca6d7f22dcdac215541e626cb6888e985c4e0487d8e2286a221a3dba8987177bbb57b52163203ce118a1ba0a546844fa000b36aace6391cc654bbc9427b45ab9a484d59b48a9a16ceb9f3a1f81479393486371a2e6703064575dce91a832a90fdd323954a60820eca2fa9b24497b94651915cdc36438809cec30630136b7514f7169a381f181c4f93c2dd854806273e69b96b74da636c1af04d7539f3d9206487aba6d63eb9d8ae9f70d8499cba1750f5d4e032e3b8593eb412a36e382715c64f066c874f6970150148bf9182abd3ad5ae846b1ed687ccda5cd9b96800ab09087052ed6927c1c444a5fbf287ace9521cf27cd561892629188c58425f26258a2ef57351e5cb1955a56500e640e0e2c6df48a5dcd24d071482bef17d1899fd9f5630b3c036568aec8d0f6169bab3b695ee320130083f9f82d6ef2201de83da92fff4a66424813cdb2031f3da18ae33a7dae28d83102a9a3f3ee06c46f1d44f83b7824e2201297183c742391ef22a5b2de7472c4a7d4c6f47b809f68723112eea94036ea46fa763d8dcde494fc82f2e0606f80e583749591a2012c1d5a04f4b26d545a89ef91098c5cc8c3ca2dc80be25d28405725a46c9d1aca405028b1073ef6d2f94ce8a7368451c9490afecad731e617e682989c002f0d1d848f63340ee072ceb5767fb370596f4c182cf6a836d63757370a8320ee74cddd8ad0cc46927e8f9e64fa6c1c4587df416f96d9798aae74089c3ec5f0d5075c18c3763dd516627cfbc9b2e8df870996cc7a99d3e5631b9c90b64589ed12f1cae303f8d52ca09da7c26865a5a6f66fff17bd45245a315f5df46e7aea209535e5e30643bbf9388dd477456aa2a00ad4951520f4d115801f0be5e62670a9ae6fbece34b9f6cf672ee60ee0ead44152a26a3fae43e9f4588daa9010d97c7e7b0bf3c0551b55029443d6c9c00135f0d7830a266522780fa1cb1b79ae7ea0e8b14f0b3592de045824b857558e5cff771bfc9ed31ffa6b159fdee0964a6b7a534b6b0b159793b1d0c9a9c9c24bce3e66eb8cfc4bce036ecec3fa88b40706299a6698f4bcda375b51ad53854a0fa537ef266b37e9f2a718818cb075aa6d7703b5cbd5458bb027c58d54ef05f187c1799177ba2f7ad38c5de65bb4ab96a161f6e46dba55fa8d2908fdecb5a622ec76821400a23fd771735cee9dbae0df327f24846f426b84857d027f7b4ce3b6d9994f29466127cf1f4eb852f1509791d416975cc5576f68b2eb0813cc6cf025f77fca11b365f6688aee19c7e856055fa5202cd01dd05447bd22088f42d0d06e808588bd35394526e023e74e1eaea32b282610c7bf4fa4fde324a374b4cde461b7709ce3560abd8592aee09afd0d3fb4efb25bd9ed5a9e2a1fbf9fdba4bef0af6d5f74db0c0dad119684f9471bb57e5bc0df284472af5bffdb98623d08c45fb29d7b905ec28e353409cd8fbfc3c5e4fede3a8f2af098c073ffe6156539dd7c65fcf1e12c3410a7b69a5a24bb20af60b6c707b49b1d4bbb89c50eaa91c077ebf3c5b5db1ddfeb78d4e993807f1a34f62e6d9a8f2e9a5307703304f2787700504a8f61b467cafe2e9c80e10e9e351242c40da681931aa1736100cb7196ee7802ed58efcdb7dd41c76a54f01c2d94b38880324dd9686a0e087aa8efc647adfb53b21cbe24ea0a625ee140d4762277ba9f4affdadb938622f6a288f3206ed7b1c76ca34e9a1bd000a2dd53a424b96558974dd1eb75991e051dcccbfa83e81a22bc40a3bbd472c7f623d0d60b2bac20c48e9aa52720def41c406505c0cd064784d4ad74339ecb926ae4736ac33d5bb5c0b0bf833f0eb4feed4409b5793b879ac4f9da3938101215fc84739c4a78e81adb26dcd612959e08f19fa68928b55d36a715156f08e084733ce8c686fef5281e8d9f97fd146aa81a5a45aee9a72c426c479f4820db4dfb9a3122447dd75a4c7f69679991247902e80793237fb42853bad956f94c7ae5f2edb4638fd7b510c6b962026e3567eb26543b35f9789aaa5002ae5f311cb1a5798d42ce1f1e9d7a4d77da7705bcced0fb37af384891a470d2a63b2886cafd7d0930148e77e1200c207264232e931cc4935afe50e61bc5f8d38c09d1d85ef1994803de4517fd0601e40dfbf91030bc49e8fb818036d03ea29bd0135d20b90ca8d39077286dc7f90851a79b598cd5d5dc711f95496864ba1418173c3f0eb74a8cc7e130896e7b99b03f705f4ff8b4fdeb26c31f59806cdcc4f09d3084044554d1b052c0691e9ba0c6c1b4bfef820ce8d3f4e81411cf9d89e47575a8247302fde9bd864c628585df5918f07b270d202a938c58d1c4f70591d6887ed0c4b07916c66c71019e86dfd08831d08593892a41db5499d17345dde2f39aacf439213882ae02dbef297dc7fbb94ccda52a80ad4d5ddccf2dc73997545b6c39b1f29a105e5e10cccc06d5ff79954632ac034cc395db74b5271e0f1184209474cb4155c88a8d409082df84124cb5ce45af10656ef70b8cd49a67c5ce923ad14983ac3ab530a710638c66434738e03299f25be424011d4e2dfa94a71b63270f9bc0db460325e402953f1517ab84eb0ab628451eb0a474d4bd8d755298d670e14699611b4ae1454a0485728536c6ee46aae4bdc678e7c2f59e23fed3a6c86f87874045d571135e438fc35bbe4a12504ac96ed4309d64ddc2d021b80eca9b2c676bf9de37164d61ed2ff9ba205fb23d285d59ad5d0632b8e0c45942c17430e20559ffa7d8d69a9a5a46ab4506d0ac0147fb1e53431788e8dbbb44e9df60394c6e47c624a28ed0c1da21f97549357b16d4c998457170f0e82628b4f1733696143322f196f7d3f978825f3a0b14478e1c94de9cd0d961e82478223a705421a3a5d47ed49a0e8a57025e6c765bbd8d2cb193acd09492e6042cde10aaa1b6024e226123908891b69ac0f24205934c1bcac72d011103744640462dac81c4ab7404de9170d629d1edd2a95801a962c4d7934f10c127abcd8c21c91217ecf666a99f4f8b9bc421d4a8832618a7a1b503557f67add8e4edb6f8155d174ae0848c8800d4e411d847ab6b084f4b49daffeb5f9c7af769a887245ea40b55bb2e3be2c643771686fc5f6ca27f4a5af6b7a091f7890d36c0ac8761e8bc047864dd09cc59abf21c638f29ee78088d75de7979b759d3800363d57fd7a01a939974a912d71d2834f8c9ca82b942d0fca5d849fa3e9cf23c12611a355fa22ff3397a44a9e86b1ca6d5281d6a67f4a7bd706a7939c17cfa753910e99b730ea713ae976c5701ecabcf3323d01c0a6fc1e85e60fc82fcd4d9b4779eb4464e9f33914289d3dc5521d1f331025d7f3d1ab5f88c2ee2ec72b274583d01fa3dadbf73d4fcbd3beb3e38fa7b962748761c07d104a4a62ac9fb2442fb691d83ada38153f65164de908146378ac870ed904ab8aa0f6f6608293dea14f68a10288766f70accaaa3d66ad4ec19ff266b4427a240bca7d17b27e74f9bbd272930f9ac40aa9ddf0ad088fe16fc3f41196c10d4563c53991a27453b4aea9d1eeb37d52fe06ac2328e6382daf5c60610638b0032159d5caec79adf47e861cb439d60c8231cf0ea05edc48382dc62a836c49c24b34a285cc5783613501101f630d5b545d679918955cec7aa40cafccf208044306029cbf03bbeb2c9b7dfe2aa3102a9dde11859c45a5daea4f2c6cfc506b9e63319cb90c4c90c58de303071196b7d363f9bc82e6c4c5882bc661b472fce6c836c3cb6952192a3fe74aa3f0e516aa24655c579e052b9b45dc74da903df117e411ce32b2c94cfcfb11249990ba9e4312fd84f8e114ba6c184ac91ea88b692d09c01401802ced0c6b2718d83c95ca4f38fd4f00c08f8b8e30f019c2799df2b953995fd32a314d6ae03395ddbc732c60c7d66f428297e5d802dec21a26d4e9881016d34ab9b28ed0012e3302c10a9902f2d70d0e6b4ff4ff8beaace306931d093f5cad0cd0a1657a5331484e71fda0bf5d5287b0424f25187a7b0514ecdf6699ec5f85147475e4993eadf79ffb8016c9e1ef16362041c063dd373590d14caf8fb191410e62c23bc4b6cb04f3105d4c70858b2a41cfa0128b3c5899822cb79d047b1687834dd053a242d1687d2854f8e9273f8ced39e82d10d9c0d10399ff4d7aaa75d8f08a38c108a80731d31b792108ac21e09396d5dcf1f9606bff035113687fcbc695ba3d19110d3e9fe9307600126e0e0000e166ce053633df90058e0337d882c84ce184cfc8b9b1c6385556258e1de4031c653609f20949136ec5d639b1da4d100bb5c48d4f42b17be11bd3559aa1146c16cd2e160d42354eb84c150c1839708c646b064e06e04d085e3261e23c9fd105ac363000bc60441416a299970701609e3b541b6e5045b107b3619c4f496a725b6112e0cd5c4d6ea1fd55f9585981df823acf7939d974c98097d9608abefff5d29fe1c88519b20c652780b632683313624f1f36ef5575cdf6dab54cf6afa1b1301d5c0f8c0bc2196142b04c115748494c20d2c702d84c80d51c4560d0aa5f7b1bb10deba8833a06540f547582209eb3643c356a914661d811667cf2aef048b29ddb45a09a8eb2e6e12968b9bcf40d8bae67d89df437d41a0d063d912dafd639fb7c393fbb0bbcaf1720c09821c9316f36a36d0f0a663bb546dd98e51dd4ed65cbf240064737662d252742b994fcef1bac11060e9b1c290b8570915c623ffd5506cbf02b1e8671323ee0d7b0764d906442a240c7e6bbc147dde0c391e2147dc9cc9a916006d545daa04109458fd3e39803a85ef6ecb8b98982f7d3cd52cb34b0aafea94c562ce26e04b53006a7ad2f0c1937eb7d065eef0fcad34ff6ae80dce7c0e72cf471d69565fe5eebe158a1e95d8d6160abc4782328e5e9ca8438aaf43843dd70690b44f02e5bc894cecdcf8c4dcaffd72dc6287285aba75e03adccd9ccfea2782c302f64be619a09af731410f72614b85407f9bc9f1ac5728f8a38c8fa30bc1f33bc05476c1d4355e235f9b198760f0174120c32e400ea5a9bae1044194e79f42bc9dc6282d2e8e503f4afff1d222d027d2e80386c9521a4737d9f19d5857926cd8f45f99b84e3d5ac10883664f674bfd5d3bed864f302e2e503f3b038ae0974c2707c42fef15a8ac56aaef21b2cbcfa5658b2aef3ba27c27df53e9742cefbc741f42f3c644318201bae7540184792af7e95e87f6b27a94631543330ffb8cc2a062a366a7ade77c166490ae2e0206073933d7ec2a9dbf4e15be9e5a5a9ccab5d2c6cccfdc984f89970ed49577a9669247fde50920b31aaea972d25a7849b893cf16a0ef41b7c8977a2aa18e7588bb5242327db9008d12f5a2a593e14616c0a634fe6731741c04ace10c3754acdc06faa11d3a61381fcfdca365e41eaa37f516550589e91fb1fa34a7f591fc42270d1f85d3e69f297d5a76795436ecf6e9a8968ec686b575e703e3ea8fe10164f7bf587dc96c6f50a4a71efc3c9e070b0e98ef6a8c512edc3071ebe8d16fd89781ae45e010cf24eee2958dc61fa5c30699af775235f552f849676978bfbee5c752242596185527380f1cd40e18c5bef5e599aa335ee04d6c77ddaec1fdc1217c5c127374b3b69c139fa19b83c7998edb182dda062e757e5be1a2b6cb6d36b44968cf1dca232a3658fd299216342724067762365cff57e14bc4d6470e5cc75ec7a09fbaa49be4dd76f3f9626dd92b3755a2d11eae9089a8733630ab481a9e3d461943bbf1bcb5dc750292c1b5ec0f6113bfc9baa8d258a6c03bd29536f62691fa4a200ca6e24767e9dd9b1ad5aca15a251c57f7d615d0ebc2a8943d256095a28835d16ad3d6e60f26411beadd4ce208558abdd529f4c7ef29ac36f8e0726e5050ab329d6b041ee84db56cd83b9b95191aeaeb2a3592edf681721d5c45f001295e8a89e9446e78ddbe23f5f15bfbfdf1df1bf63dbeeb431c906279563457126b2a7481c6b7ba0fb4f8d8e30ebeb88e82f2b350d47f1bd243cb4bbe416b786ef6d193922cd16c5548f5b3b2d5acb3245019201f383d3047974cbc8f3160fa7e107f0cd0177ea67a79ffffd0e25e42138a03e0924702976104cca260c79f78c17a53800b2ca0c6603f2841649a411ceb6adabd228ea97622a2c3ad195cf9e8c029d218e3f3731bd741c018807db42b59a44885b40772b0488cfb0f3712803bec5f1afee58f6237aa9904c4abfdd09d24c22889d924754512b6e435b4ec22753ac1fbcbc8692001bbf386268436ba12afc57710584f4420e4dbc04a2716c5adf49a14a1dbe201107b737c88a07b91b0ceabdcdd53676d5104c3203a71eb93ba402e26a8764bb4bf069d957c795c62751614a91dd2003fc8f5b0af86174049e2867867c0ac114f1e40ade705abcdfc8e4e1458719d1e199c2f184527313cb0da23ec01afa53a2006f37ccaa3d50acfd8e8416aa705d49e058b2b82da0d7bcb3e0420c824d8136306e6b0301e501f00987c21c1b9173ab946e931638c9d56a794cc0b3351da7a604ef8d4b9bc3e8c2a1b004cbd60f58f72b0163e43b16a9b00e6eef7b3c3fd2b886ace554ee41ed11e31fb3816d1ab1a07165855057baaf5aa13f38d629f88b5d0901eca002e4d80357814a437357e0468924dae70ac5293bc734790a18c7910041f99a8efd39f673198574bed10744bfbc0ea5471f8c1efffb4556db3fb618d91d041eeb057f1d436456205315eb75469365dcfe1fdc22009c15d8515306c4fa61db008c9ffd70aebe56504c6c38c8414f00ff9a0084ae8f928824609b259beda0bad48d33b408adc1a10a51175919fbcbbe057ce4041c7be2c0bcaf9d772ae05b48523a962cb06070210d94a0b2822f3fb030e21a08226702a2870a9cc637f8c2b26660cb699dec04f55ae4b8814a27825f01dd3e8134d082f07371799664842184afea0442f00927eb038ad4018e760c4f0b746e19d21ef70a8400d8fc89230e151207de4e0c7d5b32fee2f775c3063238dc205b52c208a860d296bbcc2d67d03eab7e588b25f271c87e37a6bea86e05026acee08d694655c62f6c043209a868c632602271383ea3e6952b08c0ce28ec010f2d62ea4de050004451e460cd4c4121cc09caf28ecffb41d74ff0bd3ee48ea25d71748504112df0bc35a1d6e9d9382c069e63c60d88289e837638596f57fa22da3e7ce906fb85202efef24356e0ad964f6b0be5b2452678af4e6fea45d28b4f8e138c77d1f4321ede96b3bd0f21223a1520d7b74b1ac60c4d1cdde05d054e47f8e01d2e44d0e8ce86ae1bcc030af4d554eafca9cb325fb2af676aa3d125db7b4c5571daf742bc7f80be3b8ca1474324332a4db35cbf6ccc7bfef3a1a7c51a38bd02f494230ff4baf7a6693f9aedb5bd1ea6f80d9ce8a17b35f51b079bff1e76291297ac81bd95aa39a708940fd4ec86f2afbb97b4dcb4baecb008dfeabf9ca52f1b4dda758fe388ac68f6589f2b6dad34554db2b74860ec5526bed67b95dbdf3e8ff87a953c324a24efa7870cf3d73025020270207bf7c4be9bc8a09e3130473def0563ea4353304c5d4c3383458a0100fddca114f74e378fa06145f5faec7c772e9fb9c1e78cef7cfff22e844b02ae7457b07691fa49cd106e03b1b42956ffb91929e3d0f00f2e2dd6ed5db63974e18ae3cd459d9268d4e20bc9edfa95124920783bb1d06c5d35c8191e6d455ff0a3a90d309c7c25c9af449d5ba745fa10609621a9817393973bf4b4ea75958faa39eb0715c35a2a3de6d6976a82a841ef45afdc1f24b06a6003e0b3a7da9e5c1b87f054aa09efbad578037dbdfdd7d2133abe925be59f9e7fd683be7362ca46e37923f00bc8768110ad85c387c76ecebd8875e97ec47421e6093631d09ba734fecceb8af3614fe20eb778d06cf6bf4ec1bc1f02dd391ce80fa96cd7877c0f501bdccfe8487ebc87788acc1445bd3204323f871f3fe0a28f130fdce254200b3f1a36d71a1b6147143f4a430517688f82f7f4e40fbe7bd29f864964b3017ffed1bf2f69766afc7aa372dea1c021aacb624dc06b12227e0cf1600802573ffa4e113e27fc16569bce7616da9da64681e4acf896d45eab051c55cb3de88c2cb8e9d6282e5dee3fd25c88caf75eaaed1ffe75a7682d4b3558aad1a1520d7dea7ec1c1b879e099c0e5a185628abdc28035ff34867a855011efba09fe7ec1e080aa2ffd5d9f194a16552e7c57a9605076d50b79975130283755b4f25df301368536e93dd48669b2aa2e80a990952cf42a7ac1366c946a5bdd02671a495eda21a8dd1bd54c67042028a4ffdd5ec2e3a2d943d0cc8cf2cda0d608090898c939a828457a5ca01774cb12a1963c265f8777caa62b39042c8176de6d63ca2903c0b6982f45375a44f85fd942077aaa7564584259b29ace640b53609d67e0306e757699d01b30ddc2cbb6323427db79cd07c9dd2fa0ec56820e00d1012a2953ebaa1e751ddd44e378c2ce97cc6281162e64a8be58d6c59ff8bb73e862a6be3165103c5c1a845825b93f1921ab432ab021d3e095307f8b836ae77ad62e8d090134a48f2b3edb08f891c2c8ac3ce18492006d6e84cb725f1164b5827fd6caace9b0150f1462d25939f0e075439df17b71f53bb5036e0ff77547a3ac59f3da65ebfb673b8662e88a2722511fbcca8e191896f5804562b1b7e383952858b71ade6407b42ff952f9d7cc09411e84b1f2ab9a3c634cfd258366146ef8a883208307b6091aa6de65c7f5607b780093bb429429694e34ee6fb8bf64b1ab45274a1bd1b5a11615b20a4b3c175cdec3a376f4c04bdd7213b9ebfd14192fa8cdcbd7a3ea0d67c706d650558684fbc0284ad0d5566a75b2b315ade236f36c82709b561e59ffa63f6808137d157fa0ae4754ad479947fd47510a4972bbc5523b73c47b8f505d24eb84e77856cade1702aef08b9d115b99f1246d271f1a2abcfc6c0af38b51a7779c500d74353352c98e825e3c710b8c5ec26940e8ed90de734da7abe28fd5b132874c107198c9decee9626a57083a30d822218f9b781c3395761b903be931b19132748c4372b1ccdc487d56629fd775baa481a7aed10005d5b1f63a023854295e80dbeee46a99df02216fb6a22142622d363292953843f5c5eaca138205bd5a4654c37bac8865ba2584b4b79ecbcf456b6132120425d71650c2324532b982a988e5361c95e114dbf0a8897a312296fbdbd10762e466e0c8f45623356ee903c45420ba12d390ab8780f76c14b08c64839bdf1f9caea41756170bc82022834ffff51cb1fda1e00942a8dce1ecabfb7bfb4785795e5c05f4f1d1a9a144e404683d85653b758200b984a151aa9339324d48b5c3dd1588bab30e335e9cc0bddc6f27f226ec17aa8e9b92cf9ce5999b46ed016f40124f8ae8aef2b85f93ba8cccefb7b1e7742967abc134e5774fff2477b997b570d74571037b490ccdd4d1110ff28401731b2ffb680d28f80a0606ad8aee68c7d3c60ae79a015d5a1aae5df92c74f45211a1fc8070411e78df07ed0e9c27f4e98f9833df9d906d7f2f150391639cef8a3994f0e968096395d9f00e1a2f4f358bbe7ed22d657ea8fd9da9c5edf21440480b606840ded9be0b0d5a4db98dd9d650381c2f1147fffda3d51e13c124e4dae72d5b59c9f4456148e026157f4516f95dc1261488878fabfe755a65c644f11b78018bbbc429fe1a79d861051fe5aa38fd7fec7e653e1728cf6ce847b8643c770853f19741fca90de277315a9a23ea1843d6c44aba2b46d67de4fa5ec1b037fe37d59586305b1835ec0414f4f1c867778154831f8311806b2b0d29923e96a77d19284fbf5518976084b19f54ffde40508fc8a4ea41f27d6817defe93125e9d3035ad687f8f460b5b9dd0616885a4eb540f02792f93b2cf547646315633c8427b9b80401b807da220a671fe0aa22da59bac88d90a7e8a513c9f809e80c84338faeb66b52ea111be9daea01168c49af7fd67691055f1ab15c384d0104715430f32ba7ce080f5bfa05509a95d0328738b1dfd9dc6771515c19a3f4db04f9a24911081e722198753a510133a3c05ce5e30ba983ea7585905940c8202938bc0c6835127306b394f6fcf1e5836b1d9d6eba112badd6f08db63c7a706932098e312f4f200695bad3751011e8b5dfe0053fae8ff2d5c354f62ddae0bfe2158813dfbd4029c2f5fceb959824e2c7ab18f513e7f293a023c162119761e2cc1520075b2f7be552faaa70c1bd6318f3bd6cb6fa64224671ed6acdcb2e996661373b44f065350d0a2e56fea12bc6cfe326ccc1b64513f117fa47e0ca8c583eb25bac76dd47801cafa753f195dd99408ea4dc582564b228fc505ad6cadb22bd22fb5ad412163039aaafebbf07b00c8798034aa81159635892c737653b082b9d2a723dcd4b5260f0d43c41df65bef89c507b2fc3764eaae98e0bf6000cb36f503c8a584d84b7d8c42eff3d05d8331a3126846b390f198d249139448f86f07e50dba15ca7ea3a86622f4408d191cf0dc4f854fd1b52c50c5128c41ee071e37f714eddd1450a64ff8fc6988dbc3b848c4a8684d02b12d87e0d0d3185344e053c89f974a4694c47d54d76cc352d74f86502ff871974f3bbfc27cfc3aa303161ee9a84880953b275a7a759cb7ec9155ede82be28c3f182dd9cdbdf315969d52b6eeefa3a27336c255951e4ebf8556a04b4322eb431a3afc0ccd49508551c24d43a7e1f3895aa0d8e9d72c15da0f8103dfa1f9fb1bedf88d1bc1d7d3f34bcda9f41e26d44b864cc0c2895525f362cd7257d11aae8680d33f56cc98adc548b47bba82430f7d01bd0a50ad9bc9d586eee2ef3620f95f3f37d7e8cac4ccdc17f7e91486dd5018ad3f2257dc475594eb5e8dce5c5408195d052b4d92fae966fafd851e458143ba19bc4e5d9cd3ccd3fc89894b62d96e0de96b8000b760de82d7733c8bfa25f4f5ae0373cf9f8eb2fea7903be204931727066744d0f933e2b24a5e48c262367379d49000b65c968560233a851a4208bf2f89a2d7e11a37478f588c26a1072a446c2d7f46e6700aed9cb9a358505b60d88963dced832ef99dd989eb43cb4a5a69b00b49e02e00a618c63349140041a62acdea08c18c214f9dce10243d69850e5eacefeeca4e4f87396b6aac652b748d72064faa23c275d668c018a685b44e12637cc7f90c2ad8f3236c70ade26fc4310d4435d7514bc708e1e54757325d7d8aca953c0b6a7b2eac1e91152480bd3d3943dd95f636483302483fa22c4e691279907af25fcc833e1688731da7a85a8bcf2c7090a236b755cbb7085f446214e6b36c02d1b9a228769ec69b85f69f8a525e90a7f9b94aeb73d7834b2cf0f84fcc801078361d228138ac043d59e54c240c269d16584950f60a08ff46ccbb1b128cce20305d8a334d2a4a65b3e6d6e646a90c0d4c4abd7f5516f0c0f5fbd7caf1435063799d972904554fff0f5c7aa9ea8127fae8be4b3c112bd8a34ffb2547310d00466f706e10f1cc4b050260d320d1bda3f8124149a0a96243261a6cf78196aab0f7b08b536c16eb65ae7c7f97ada7c938aedd41a0d52b06224b348f505606e53179a1dd9bc540fecff4032f7d7102ec0fe345bcd7229611654587ed28f09bbb5dc032aa1526347af6eae3d9aeac9835213132ea3e3e71b86100aab66b817c7cf7b921560b354514aab3ebed138d8180fc004557a97be9015ac00ed49c3437f9019daef2e95cdc99133519b845ddaec5a02cc0d6e994ad5b33d50d393f0fe505808140852e8a6af9ebfd1db2d8f074ad29180305f87083f9e3fb77ededa663ae9531ce44074bea3e3bdf23d635a0102a5df6415caf4e1d780e3f2f2c0c1ff3494a1102458aa9c58979b554c3a71471f4d0d80c408468633d02c7f645716aa5d1959f1aaa51fbd377584f0daa34f2c6415bae4c2ed42a748b78f5ebc08a905a8a6ea5d1d7d791f236dd456cf52c8d30bd136435afa94df4689094ba1663622d6f737c1ac5202b315143175a7b26ba1dcdbb276246d10659255848206d10a3d87664fb557821a1515b368efe5b2263500d8895464677d7864e4d51b0d3a26821d214f94fb027aad69b1b35159600de727f7846f7a2ff3993d9386b56fa38a8cda76d909d45686216d8535e544bb8d3e6e9597d12ea42db5481b8b925e322359f1717dd83a2d6cebe47a94ad52e3ad9d322c69487e8b444020eb8f3a96e1daddef17b5ae478711141b3120c994371518ac72f9dd302e1395c5ee75b641eb05ec81b84e74d0829c202616050fe320d6f31d53b0fc9969912cc9c205a17fbb0c502e1245f91bfa91d0b0a1b0b042a2049240c6f0356f88fdf56efd83f4b32155d66943f92a8f5d1383a159f3ee1482232f1da96e83c77deec7e7947fa771f9596029c118dde3f9f76b3fe12ff52c5adca917cd59a9b95577e3e132750644803baa609ed0cc25122a20c14531d5cae26ff8c9c0b2a0772401563d5218725924e8b27a081814dc80bbc88a414d2546cd768fc937e857224e3b7d00fb22d82c788bd8998b8f79877c225ee130bcd6fd231fe95bdb48c883332a4284ae83483b2f83299de1780da1abcf41c8884d21667371b046eb4e98109b23eaf2715fbc2d206ff444fa664609340c28131627d622484d4f2824d9eb0534f63706043f1f03f66969121c524c269ee5c3f1970a86f61cec1e69d561c6add3182a252d333924c06ed692e22988e9adc9253e19f8ccc2ac2416c1f0fc947435083d20bb44f3572388405a1335403245a03249bf73b5419100278f563b92674a81462ee0251e942f60671bcf733733064733606070cd9b69ce6f35b785c480c341841251c33e2379a75c6e4fda1d91964c53fb1a1b68bddccee1f266e2c5394385d9c4baf082a281d304863410c3ef16cdcd45f20a6479df3f1bac6024e42a10316e1e58f14fdf56c274fb99fc20f0c1129d9a8670534cb271cadfc0fef4a7ee4eb1fe46e50ff4730050d689249336a46572156d09922a23b5fc30d2f1469d9dd9d33080455665b330d9a9f71bc7a7eb21bb191aa3f3eefd0537754dcde2d0ec4a33fdc75cbefedac2190d502db251bdcdc9b73dcbf9e76a54fe4cbfb707691c92bb2681fd5ef0c22899335eff3d41b0c0463f25dbd0faadfc31258de222b7d70570bc73bf828aee036cb2ac783ad29076daeabfe694ae8812aaa522db506ce3da6debb5b78ddcf357cb72ac488b47b517edb7acc80f8cce616d4c4c25b125e6a21ee741d2ade25fe7837e475a32669b30400c560c3f0cc412a78052f5f82d1d1eb1bdf5eda234ab55f26c7ec586f93c95154039e4eb248f0d8e3b72e1cf5ba208d01a4305c929d8b6b420a9a64542a39442cbb2990856e9e8b61669bf196eb528f9cb8ceb1a7d17021dd34eb15b9541e290609c44e436b99faa512b6cf606f6225e6ffab94db941818f03106f200d426ded1512a1d6b8d814337e8c636ed341e813e5507de6fb8e7508c9e2f8290de405734b3af784298853d9b07cbf098f32f153c70db2a14464c4854aadc45641c744f322d0a4d02bf608d7469fc88e0585acd1b3691f2887cc02840f8217016e9cc87bc205c113a689cbc641b8ce797c32153de0ec7ad75a0e89f251fbd415fcebf7e88a39166ed834e141c34dc861e06c3447484f8f51fbe67cf46a80a6e73a4301504aa7872ab32139d9536a9c1f8e0c584121b2e200f30ea6739813f008904035976f26bbad8af4e090258cdc7aefdf712b207ad71de30c07d127bdc8dd9cf713ef009834628a1c57d510209122f0e2f41199e01a6543e58d6416e8c49f768ffe8223ec834de81bfab71db97c01922025bcb7e1cd3fea60e752d25b4879cbbbe5a6dfa00e32adbc043da5c62a6c1e810f7072d7b42877a81e354b6b4bf13e65ecc804e507b41eacfce632feab55774216b9bdd40445eaf151c457a924e5449daa02640dcff2699c13bf9a96901c0c84c82e1224976475619999179a253f823a06ca6b8fe11f9445d4c995a7e82bede49db3422cbe2bf9c7e81154f07767b193a41908f079432d409f8ccfc964a49d9fda188de07244aa9627807332a6b99bce9e95f700553fbabb053a09f11ab3c1d073c6ae4f4b2da197e6a1754d0381bd9a5d4d4fe45b3d555d4012089aeb442fcf05b978c65f8aeddc6d82a879cc2cd24a7d5aa45742f635be976874fcfb62aa4ede08b7a27b75a3b1768bca69e8fcb1683fb083e069a48e369840199025b737408d365c45645e40f6bf8a3f39d09c758743ba5dc4916431758d7b468d451686402d9a81a6a602c18911732069ab8b2f22d0988bf0ba9a33f728cf3112abff76aea06e2ec4b744bed12d1e50b099583c89aa5941c38c4203a54ff10903cec4f18aa84884402f82cdb473283f91bc5e60f7bd319db11ffc74c4bd3e31b6149be4d12309420e967814f4fb3f5daab019a58ecf89244bbdc20b131c2468e7dfa2a33f7436eff65a8ca751bd3dad736ff04ad0e9fd8ca6dcce3d46c9ac185d7cf8cfb397c4888f043f2cc48260a190bf1e5a6d75ecf5b3f5a31e5b67a34fde1297a8ea7a3a9644d79b98ba856e2d9a9f3e9f62a1f144b022f995242a243cea676e0c1e20553c7af32bc847d0a4376811d688a8effd19f15deef6473dad972884460fab3a1454f4bc82305e80261fb92752baf4971dd19b49de6082e32602183902ad2975d63885a2a40010114a8c999fcc934724e7ec68117872c18c60e60d9e3a15911537a47b5520ea6a1915d0f2b73583ec805bbff55a38422c85d2c1f70951cb793b76412a8390f1478c98e24ee1861bbe9a48907143972a0a85f48e6ce0bb729f4647429869ff33003f649638e700988613419a95e5f48f4e553e8b811e79001c0bbc73c2d291beef22c48a3ba271c604d55a5874fc1b98ebc42f029c04f3d6b6a7223bd2a50bcbb470c6c7541f50c69de850413ba77a7fcd6cf539371277d38b4ef6374aac44e46658e3aca566394ff7e2733e6b6656cb025b71bd694d236a0516e7b3dc12dcde00696df3eca092fbbe3123b9747c93eb179d925bf536ae37c009f6e021281fb2303a168d2115686ee366004201ed70e2405af6d00ee2b0c1065118684297e24119130ae6df79671a71e5e101264114c407e157f3a7e30bfe2a89b4ae619ca3e10de20c843316111df289d508400d1d550fcaf2501da33bb43adce25c7154c4a843c582c29b0dbb9a863c35a94651acb822edd59b1f8bd09ed5778880374cf56999150e204ad46f7f4ee903d6f548dbe00177afbaacb8255664bfcf4c9d12148bbe14fd65070bfde24b1f1434facc9fae1593faccf316e5d3f75693fe51620a249db1f6e191ef0eef924980e94fecbc6a32f9f66f3cf510d66d8b0e531876799eda5d40eca97e9858e2637d258805de1e43b69f0ada8d46a29eccf0da07e517624705d085cc35da3a92d6d489d04af97e2d748793a19fead36dc40124763b8469520b36e9c6d8fd9186d24e6acc52bb791c25e8be971989ba84408437b0a2f0577fd27ecfdb38af4e67f9144e27e6f9aff7f9e282f0b5188014976934a655a1e2307b2edc3d81e74a8fcfe617279e6bb0a3e8526856270efbf2a781b0dd96e3a1d471bc4519c60109e5d216250dbf9905e7537eaf9acf8f71afa86535e08e511179f3ba0024e2305921d855d9295dd3df55ea384f678a55da3779a00d31d262434f2f4b682a33d0c319472dbf56e9abebfedcffb06233e689f9d0f014f0e885bb767a2b8536fb5d85a92b924e01c2cfca852212bd0bddb1ae3528b3c4175a02c590e484bbc8467e500cf6051a0bcbb315f0902cca3f4942a33e2a026a522234fbe3ca064d539d617da5ff1f1a59f15ea18a386159ea1d4668c93d58f45a4185b57ac191adea4ccd4f4378516276c84ecc59395461e0b740e6fb4325384a04a50f48fcd15dd1f69e0244851dba66db4120e14a3b3089281b13433f57abe60137e0c9fc6c52043f9bd76b90086aeb4dbe7b850b750b6bb53ba8e1e71a052b7f08da5b816b91d9122a9abbf2da561d5f3e6209f26915f60c1190af367478b2fe33735775bace397878f302c3742ace2dcee927901cb09d1123cb7372f419ba7970809ea25c6979607d37d402e64485843c47cbf5c952185f33be943d0701a9d7a0a1b3a665bf9570d3d4c7d372f5bc9443714dec33ecc847a1da94dd54bfb9ca4be2c1f195122d0cc042de68739e9fcfe2d045770800829006da2e1041b09f8fb11f577f10297a6bf55584f48dc777ce34a415d1d01f0e264499a0880634f5b1aee639208017038c4765b6a0da523c217d4a6b3bc59fb99818dc5d73f576583fe6fd6300af76371115c07fe007808732198eab5e66190cfcebb22340e64d1bcb555bb2ad0305a2e6f97535d1b7bc2149895044d2332714a09289a698849876ef651b181bd3a42b7b20c7a4c72fb65a8b933458822c85b141234d1f591489a4a7ab9e3c0b4312257ac29eec498ced58894ed8b4e11fabfd5339dfd9e952de5e7de42234654438f3a2830ae8a3029db266f50420b654a228e1c4bbf38fe863bc6d98402760eda3f949441387086947b15b05aecd7a24c33bf2d24e57e5db58bf89c1820ba54cd73919c28fa28246ce977178f818903f31c585e8490f09c483fcb962dd9c4c7203472f7664b1e6892e3b12b7ee06cc9bb18e0b53ad2ece96bbb9eab356cb3dfcf8ac35aed3b0dad5ade14a34c80c53218ccffb769bae236dd8d1199c7ec7511a493615f3e6b4d68f9aea112b5f97e437714dc555f03b084070c744a9b8316e3f2c1d5615de61a7f219559cc7fe17d58206ed80ea9b57340be35960c2c50b25d6ac1c35f579fb2b506c91a8acf130b7db23626b4c2a3ef959e7d691d5c9eba7de5ba65bf4f0cac19165365ea57e921e6ac30fb1fa381667f2d526a38667cdc94155b1f994fdc6662b2a4f3e11b1a4a4e256e819e3afa069824df70a003e161ea426e868b7f49fff155ef02531b13d39907bc000dbc72806374a8ee4e6838baeb39f4aeab34645e838cbef0189c5f97c6f68305b59f2dc7f4e126141ee36b9eee6da581df7a7f840b92b9c171c6e11747f8f2ec31799debd884c75856865c5ef7f75cfd9eb31ec7af0df66a1857eaea47f80973c025c4e456a0845bb004e87370bd76dc530b8de7dd85c862bccd7e730aa94ee87f5c825e93faf2b1d9a4e1dda35079a6b6a763748735cfa19057d94b664c46438d3c5899520d9c6d3e17734840724376ec7809e4270fe686803ea53b143789f9f21fe6aada26aaa3e136c23167a7027a04a9daafc6e7b62a1b07d2bc08d12781e5f83f6cda491f5aa31c23dba13f6273a97b6f780955dcc43d8dc6d23279c337d3562bd250d61b168969b1ecd1f2f90add949a96345c541bcdf1ed967a3b381dcbdfbc336d8dd35f14aed206300f5eb50e65be2a77c1c38b791e6e0839452ba0805231b5df19166df0b99e2e5f8ed5857429e433864ddb549f1725e9110ab1e0737a62ab476d153bf3174d3d2505f1567d2b5b0ea20dfa332893dec5881655ebe236b199de5ab4f412f92d192b0e352a4c211b0f23c2a17a8300c947fb2404fd65db5fd68173b43c99077bfe45bed7c7736b3943017a314369fe560322ec9210c1ee710fb3f8bc597b6819a64858b49f503174eb37065ee96a684ab58dcb7ce4562c80d2c20c78ec256431fa245c30981911ffeb78d659312172e73d17f4397c0a83167f1ee526cd5d12d2d48ffde9d94803956597a386eac8d66c4389797f7f93c53f5d9f4c7c71dc2693aba15d5b95d0ad4816e4304f1c6439b59cadca720fa365ca897bd73a4e133653d93332a110ca1d68b58dc98d26561b362c11dbcec605de270e6889f95b4efa159b8b1edf8982c2661eb11c77a2d1a0380a85fe761d053c8a894028374fe60094cd18a869d87f9903b81824596ef0f920871bb9e1a60c7ee860beb741a1d36b189dadc644bd0a0f95cde7c45e51023580f81e4245cbfc28b23968da0937696ba007e8cf7e404173e6882d027af461ce72092301dc90e71123dc5c70d24299de0cf7b26d3b38a36c6adf0a165f0653bea90f8ceb27e02a43cd541ca43371cf6308bc1b9d8bcc0b2f7889aabeaf138a610a6833a8245fdffdd656418d0327f5c322a3425b6a5c2e1fe1a8189e90e3f02ebf9a77f348b03a6235eef5443e8942df8d3f63ea33afc37d2784167613abea4fb1465e8aaab51f71c51d35cd726a5d5117784c314695aebccf967bd185747154ce9557b457969f490deca1a805117365c47f75a3e4cab87bd1b00064ce7c2d975f9768a545bf77691152c4aa4bb6bfee0eddd98e790d7ba913738e99726cf2f09b8495e3531cded6d96d5119f5da971579f4dda5102c27e563d174d0f12a098139f7c469a135f4b790f350c4036fb67e6224cdcccfb2e9ff1a41f939cc68dc4c0b24070c92a7b8c42a2ab216107c94e621a2c74d3059e3409403ca2c737acbb0d29fefc69c9ff99e06a12ad9888928e4a2a353855d4e171f0b3816973812edbc6f7cceb6ec2a63628dcb2409d5fc385c40e9e01dd1ba6b10935222e416665957baa754260ded401f2c0e11b69cd174799a2c5090358413fdc14ddc0bac60219001fa97322f5b1bbad5a7e1caa8220fec2b222bcf1aefd143e52ed8b353152322891fd153c8d8b6bc8d7e45e49dc89f0df7de23110fcd8b99b28f4edd1497b5d679c769f0fa8bd3b8cb92a035d6788d1dc8ff7f72454812fa6219192a4818b7420e2361e0caf4493aa2bc1b751847d818a08e3f59b29940cbba99a4e6fce60252c70bed88724dee30da6ebd9c4795076d17fc94e8f61a62d300867ef4a76cfe433c1087e66a4a1bbb81d1ad209b579c442db285c11a1e89c66604012f0f6e7e142b5942a5b40909b38805d1b3c762327012a89444cfd78000201753625c86f108f5d180218827ccc1e6bdd402fa96e80a32bfb2b720b85ddb168384d38b36bdb31044fc9119dda0482bf2a575878d8989e3f4a1dc93b693c754cc5b27e065bdca5deb7c254f83b21fcbe680f0e817bd9a800c7c150603f59acbf7aa5c76a3c7f0053cc7889868dc4aa5d54fa216067671fefc11fa04511ab513d65f2db00605248b974250806022f163d1e3bf385a80ed5d2c60a8f2814662a1300adf85ca39dfbba1771ab2b3e534fee7e51129b90cf92fce697219cb7e20a06371a09d1f64e21f54c2537a3c5a0f3ed5398429db3d1591f8c7a66a4a2502bf4d0702a24db41e9df2deeda38fc0101d5eb3654f75c474afab54e8296b60087598967c1bb8a0db4056163b4403ce6dfb68e721f6db933e606d9effba251e7d056513117031906aa79307857c029ccd87c719b32a80afe7c8e2ecf5e2f60a729f28e230cd75a377a641bacbc2221f397c9fb62b9632806e7e33db7a5e5e3ef7d96ba2b3980dca335ff4a50cf36b51c8c90ab8208ae8359d18a71e7bb190ea7fb40594252ffc1c2b1d6b86840725eeaef5da16ec0cc337888ec628e9bf8f1f5c5b381bf2a267c11bf6c634f1be8115b8d6be52ca1618e5906942fbb6a682e4171d849af3c973d414a26ea3d87c23999bb80619bed6c4d5a2906b80fbe8a41af1127b2034ca403e109b7453c73ab467fc7e472f2f6aed293c96f3f1b32fd713b298e060781d8b564541be9c5c79d1475835006174b448490bd65fd0fb1ae60d0ae4633d5cd17a4d0d44d5492394478b9bc9c9650cf4698cf795f64fd40f035d1b72d30762f245c1c8be85f76981758001a1b160a56a812d5df257a297b7e12d084440a8f111bdfbd081a1e320a2e3f0a9f099d032304f77f58d13991b8c6b8ff822977b20c66910606412b7c5d5e8978b2d5b75f7295524db7679b4331c5827f0f81692cb710e20c7f3e20e754b34118defe53fbea9c3a0a65134387bf3cc9810a6ac7b3b3b15f1c8e88e1d068cbcba076324d732c9f6ecfdedf19214f41f85a78039f63da2447e1a9e35a0d8cbd2819cb6ac6b46ad11fe87aeb2641e9814386dde74ee5667180c26371843b569c1103c13b119397a269318f1502761a5ae0c3fc89299a914d3faae9fc95c38e1a5b7ce9083a4fa5bffb963b2770b900e90d587096a9d33981b179291c9af15036b1f9d385c6c85980cf9580c7b898534d88c16ecf5ea245ca0587959c2fc791376a38abb575a8b9b05cc155ce4572d474d35e323942ed289403210f45396309878a57b54065877f3aaa59758924373b47ee929b0830ab75c6fd1fd855e3a4321afbce4b84d15e2f71f01ec0c1610b53b7b3460988a6d9534da8c385188d57c88973db4d5eb8e2007b00f53ca35ecf0ad19cf7bdad3b2aa68cd03fe58737a6cfd2c8b370a70e9d4b433953ad1040def61a9caf1367f02698c694b840df28e078a0a4f581886121f860fbef28995036edc9e4b9cb8ea3f83811f9c8ec5a28252cb80d7e3cced9c82389e410c36002ecf25842cc523a58f7d046c2092c63006d8205537e3aeda22ecf2f4c479226cadd47aadd4985ebcc11e1129845d53fa3023800b358ce38257275ab3c8095ad61f6aefd20ce441560804247c8a7d73591cb1412b22952a29bd18485a0058b9742f6feccfb86de074f1d19f498a16b65ed6cba8210787ca0b3a9201cf8de5541bd599a62d519a33c32c0f7fbf329578322c6ecbde3b92d1be8241e2146d691d29e970832189746f968ac3bd79ce43a5c5558b3a42a743f3127a329c90389fcfc22d60777210f3ab6be73ef8cdfc5ee4b8a90f026b4d2b462446ab5dcf9aa05e37f1e24b47aecb77b63541228f78115283a615d40c8ac4a9d51dcfb567945cb12bd9ce47d1a0e05781d9d351ce863065d12f7096ba11d5133a0f119f930d5f15ed14fbc152a24f5e9b10ec10a1165e3b747c7ff5de5c21603d24676c3f9ffed4048ebd002e5f5427f5e40912f5799587348ca28512a2e4ab012dc66d7ab9221a55a8aa12c977ede77e96f7c0a01aa21c0c9c937e13d8e4466adccc35b4525ff01ac17669a98e31cecf9df6bc825b68b86a27c922104f28c0cbf1a6fd312577ba7f27aa1e1ed80621cfae46ec385706a295bde402cdcb8c0c6247b6f81b1d4cf222908218cf8fa275b4ce29dce03e956052bd1b3a4ae1061095015079d2fbb5c8cbc3be96041e4b60a5a019c8d71a2402301e86d0f5c67190bbd013ea90d94dc4e297211be06015864ba75001be8cfbe78bdc2f73a12279798fd56f9ee918e2f3e65b8cf84208160cd3c113446f2a6894c5136dc033353e9a87b38fd160392cf724a5b591ce8818824415d6bc50b40643d2f61541ecdff9e62e46085683614d9849c3aa6b02ead05f8b7c001b409d1da3ca7954f1acb8281bf3f53f62e7e2ea324247941a97063a2588578ede81f46ce3f59e7e44ce42ee6dad846c8216d000ba5c0a711828bad9fd60ed399fd703c8e9f2f1cf7380807fa462187080b71658cd17c653b152c22cc1bda870e98d68996194894d0867fc7f57a9abcd496cd36b19fe0dd1c54300a55d5451d5b67ea969735de4fd6fc3f06ad07a307ece0074b0d80bcbfafb30a8656a9965ab4c2d8f911430b11472ee5ef1b3a2c053e48db3e82f1d4139aff10d56d5a8d46de6f3e960a806d7202375a272ee99114935c15bbf286a875a28eff62b3f3bec83b765d03e5c8d01eaf1853a380226b842dd18c453ee0720c9a70b1b53a681200b232bea0d2d4db5a1ffe3c65ab15200c8d6bd963422bca72f4541397575b8d61c291b2e4ea95c3784e75c663ecbc073720efd1e8556112c3a9ab2871c408d1df32ed653cd58411034800b897666ab7dc16846defaa9026eae1811785025a33f9d3b33b6b0181335194a82b99a6bc4dfbe0fa3bc6788df9cf8e9c7d1f8098d14c5f365ce355561bb4e0820aa3cd2d786cc44688d226a715456ddbf4e483a555b1683af231b32662d7a1061ad6ef1bd4a8e9024522d9534eb88ae5863afc33461eb6f0696a74762e4b8fb742536ea0a1e01d1ebdf94165c2547d8342d67bd8ca87191f7f071ea412153557fbf0580a723b420121e101b24cedfe97b6d897b9be8de8779c482538a8f4cb047b5fcca13aff715880e1211e7119d2457d3484440eaf0830b6f845363f5e63fe4abd50b301bd0bf746eec90ea03a36ae540b6cc5c125732c9b7daa7878a72ffb84113aa157cae408c9e9928600db33d91108e465e146488c95636715048b86a9155a5dc4328a990c6cadd4d01bd30427de3b4deaf3ae5f659689b5240209b61523210d0576b4362804a554ba98c9f31b39bdc19e56e8cf1611006df99f7edc9ca8e94c54c40e235710a42bc200249d377c3b183f596c60fc03ddbdae6bb4af1480eae36c59c0d11b3d6e5a8e5ae7506ccbb7f884eb6b1e72d84f9695e96d5b481a5d9a4991ea5976db9a926527121e96ad9afd23210350286a5b32cecb68870ff1b9d56a2acf6d8a71c610234ffae297d84125b182a4809f7c6ca9b00821d46ec0a2d6a59a1a805b9aaf57b72544f40d54cfaf36ab7d55d295bef11044015d675abcb831a4046d00d29e109405c01527528f0f5bc821b0722875e8664976d7deaee2ba2b58d6b70f8320895593a5673944e3fbd7e4040b5811df184e069928ff23e309d149381e5b25440902429a8ce5ea394eec643549fc0512a8477ba48df6d564af9ada1fea8155507ce1e45d30be966853cc2b0806c5a76ec92d7e710ba1c0b9f855a59cc094699788e2a747a0971d2ed9a321fc63a22ff5dd6c29bbe21901344665628c55001f998806dab99d9efa692bdd340de9e19c814f4577ae7745bf441344d92320a4dcf8494061470d25e1e26612336677018e4e439c870022214ab11d9e71a9b1491ac1d0b376f0e30218c7e48d497af6c62cf4e7722e56030c11d26b1ca51434e4fe8003cba95407ce1c6438a6b2c99cd33bfde34b2682b3d4c2f8e60dd11e6881b8414182ec2bc9bbd06e579158f0ffcafef3610ecf0d59d4ada78161b2d5fc99548d3a236436b2e38d47f21fe34dd9d240ac85a9ec54d1c4890ced77124d27ae3555cf47cd5dfb1f0a4b83984cfe51d53a56f2a6210620ac6f9c9923950f70bc4c5738d2e4e9767a37a91714d969ad66b7bcf52c9012f15dc602ca95798c59159cba69cd29b6a4232cabeafc8c87be24dd1f02842204cc1332b8afa3f9e09e6cd160704e1ca7d1332b890a2151a94387b675564c52bf662bd6119952be8150c8c4a245ccb22e6db18a05fa121b2b577a94c71b08d7d021a5e64d54438cefc5d2ac4867c10868d68d6d0a4cb48a43084a06f19fdcde7472a84d23abe8bcdd37980eeba6b9ec6a356949159187d4b2b9d8a874312b3b9983514787b102add531e6a640e8b8fd240484b80f3d1ccc95b649b6c2750f4a6397d33c59367685e5cd2530310aa9bbec18ecab748f7545c5ed8c746b34b0102780954347e5650c6c1bfc23e66d7d9f438c32d4903e8326b927d26088b1317c2e3c1aa6db9f1673bab5fd7fbc9d45425b9e413f24b886105edbd1d23ae511b45384614a5ee7710e7b784205456d861425a6382390a0f73fe10770c4f3cf23f8206b410e9639784e632d79fe439db98e46193784ff8ba338d434ced3382bbd790a85ea122dbb1dfc9d474a566b455f2be3fd6d2f9bc6d3d6432eb437accbb4db6dd83271f07828e0857b9fdc64eb88cdf2faccb7dc00be0a17353eb1b0bb6c0d7695e6037abdfca41b88004fd3ad06f7f07ee9c8a1b602c7d306d4e9cb8f75fbbc24c9da340f406ef9b1647524a88c356a14e78072535bcabca2006086b852c903032639bc6a285982625f0b36d3440798101c8d4c531be35db8e9311c43509c378999a52c6415d666c69ca58f6ad912ccf5d91a80a9dbd3c92988222965ae047f8982a412fa9f5aab07407419dd5d0d4fe961da0b013b9fd9f08eea991e4fca2edcca85d4f43bbdf6c3fdbd478cdc2e7f9f9f177569d536f94b7f36dcae2b9a7e59164259bb533f59cc22f97604e83cc41da5c4ec16e15cc6940177352f08fb5345e4da6ac2e2f695bbe694587aed814e117d3737154e07f59bbae3080afc2ff6beac6988862d3700b57b5bce295d8d46816cda8808c4855c1da25c99a205d0a9cc344b69165b1fa50c2d32803cffb399f0b0e94806dedc32864bf1b10178c014815f553a6be84a2953e57de36fbdd9989fec704ec9c0895c4472f90b501d35e95092af866019481205e60e4cddfb82880e5448b9afe51e9d2dd4099be398fb7fda61ddae8610542c683fb0d3750e97e37c055e629b47e4d4e1f268a5700f133d81aec8acd014280bada48a6371d198b3a5920a1b5b2b88ebdb9d4e0f1b972045c21d34e1b542a1923c0a2102d3321ecafee4494e0960c4d798602ae3af5ed1c681fb8e85d4a26fb8119acf774214e61517eabc537fbec3ddf5613264e5ea3f8413ba8d24f8482b94c0109c662e50f42da86da41a2ac34e38bb7991bd6b0038180802e4f9b709feab5b9c444d09473d458e5ac30a6f9bb0cc4b00c24d32f79910ab8e9b36826b73102aa83a331f7d1c0ca8433602ebf935c217dfd29aca8f8e9ef1e3e9f5acf9bc7fa003cb1fe4548b54ace0a4b619b2c3f207c7428ab1803ca56613098d859c885a93dbb01d7a222607e27e71a15a34a7d1d1efe0655b818f044ddd4ec4c91ab49ab18d58a7970021f0c92e99c3a95705a797a99a8b536baa6f6d31d2a74c4c3db08217a00bf8026555a6f869285d79d8a7f8db9a67db608dc994a3d21e07bb7b333c2f423a5b31471a39506bc823b6310441d9f6448c9c7c8aae1bc391fff94419da3e5a6b4c5edd87df9c3fa25b8d4a7da86c44c2406099bbe6e80789c942450d325a5c147f1961ca74b7e688be7ff322616cf4706a9149c9fa114dc80d704df620c8a9b4ce483085fdf63d3154c533b645729c3783c6f4a95537a230c492068e61091298b3cc70e90431e26b516ac8ae634910e1c17f9ee734165f88f366a0552890a246f7abefbbe6438d93b8896be71db18e964ae0f49e9adfbc1e1b987f212148ee5e2ea746909d8f857a17580237b41957ddb2c0036b0db4741cebe30e42b5983f4ffb452ffa9797b00d55fd33f52b3100a274c909c30c60c0907a2ae864b145ca41031eed91fe779141baf7d871b6bf351d82c415f00c7c848f937b98eef20768782670cc962bc4f51bea2c23e3539c6377464acd12eeb6ebbc623713a3b4a22cdaf4c312dc9b3c90d4c1603d54f738e6f889b445d8001709ab1db64c24f057a4350e9de7772d559638ce3456a3852f8bd5f94d6cef422c1f2c40c6892cddff12edbd983d4475fa59bae4dc9b9b1ab9d6b6c3fed4046559700c194b81bd7ddfbb16e7ca2b620a2541c1a7e946a6b6c86036862804e4596db4e4fa6619def02764163512278680fbf40bd6f44485f771cac100d379773d58d2a4d2f21f2eafbd306f26ad52ef2a8abc0ba39fbb9b985f4d9415ce937181466a0a24070956e562bb9d00549fff52aeaa4f4c6cab434d017588775cd0737b551d7b7979ee32c12361a7512a60083907a5e6b97f061a2920a210a89b35750fcbe355fd58d7211e986633101849b9ebf53912cab3d50a61069fd3f58aa08d9f9c5ed69e3ba31563316d25d7ee6c62b7b629cd0fcac976e9bb0dcef4f69eda5992f81ecc1d90af0b5189bb99072377c2239560b8a9df3ac9f9b36f86fd2dc9e7c7b2f2ba82b671d29f11f15777b30544fadb41b1620f2787975a02f0e64d208d2bd3f9e54a00dcff19ba6fd77963227c654c7e358042a7ab72c24c1db6842ab300091f3cd7b37611b94d732b2bca6703fa096d23540b5b1a80f80cf3a2af3b8530e85e388093464a98c3e30fccd48a5fec468d683dea74504f645446f0ce029575e879d855acc68cba782af074fd4ea41169c71cc488d861d31ff20918374900346222eb083da3251ba1ae7cac6d26ca1fdb3d0ad3595f4acb0679855f6535f8d0d954e898eaed73f65b62367857daa729c5d315f223cc7502bc90fd1ef70f73df55cdc04875b5f8e387f2c1efa73f090e4320f31d8fb62833c5a052b2405ae5886314b98d6330309c621862634a6879816a73d67302b6a1a57f10c2f3e627b5f1790dc3f8b9f4025aeb03fdc30744dfdc8c979985b3a6096abd32cde191087125e03b9878f431e0be8e353a1804bbeebaa6723c9832fd53ae5ae10cecf0356a1c8d0ab70e720a280e69bbdfae01b3c7cea347ae04cafbac9e9b3cd707c8c099db3526c06803063b427eb46e4116df13d33c5e5b7df524dd1cc5bba20036f02bae5968a1d00223444030a4c06795c308c4a4e07ebde33e77b6cb6e745b30d681b967e9329debee0e531201ed67bba102646712e7e606ab87e4441a758046cea5487196e5741601cfe3abe995ee48e7f0323a400aabed1d0da27f5fa5fe013c84b437bef2de5de524a99648107790758079c16a78b2a85b0f3c8e5cf38ca2f7f06da5b083b77dbb87da305b88dcbc8a8ac0a5917f7e5df3e201db41657dbebffbe22a128d15db509dd44af71dfe2083df76a5b6de30664e7f56bedb5cd3dfe4dd4e2aa4389a8d7dfbdd6bf3312d14f645656b9fdff1117f7ab1cb0a4b24e54517295d359c1c5aa11f7b54bfdc27dad155685dcc57d0ed8c9ca70dffda4a437e6ef5125395ddf5330ff97c7215403221ceead444037f7f641b8f17762a9f735da9bce155815a2cfbd0c532028a80c51c392132f5078808b65220e15158cac0eb54aeb1b870c93710a0e51462459776b3dccca00be6bb50fde71eeaa268a289568ca2043e9044c7630aa72c3ab7a400a6a0b0bb3872311966a40410a3166ec127084c8709ac4c0e9616b72ffde264b708a6e1370cf599631683a24db15b20fa626094e042e2099b1d6daad5a6badb5731583765d7d5a6badfbd0a696035f83b6f427cec974f1fbad368b4319e816ad2fede27764cb0798810e43ab83e723c4ee2da7d4bed16f92506a69a594d25aeba6744b736da873debb8f6cee63d4086142d209a6086302154bdb96ac80e3c25695d4eee33d6729a4a0046f06b950a7547fc8fa4cb3b9c0dee5d68bb6e2eec6070469427f34a7fc6e361d757e90afd91e382be34a0a5338144ba8084848418924610ab25d6a319ef7939294d2df58bb8f783badd537a5d4d234de0c0ab95615f10cb5487e145a47657150b9f8a8ac2898fc69d3a10a0524f404184e609182e504242758151698105984329e0866a0c061db4184378345c90e3fc867cfd995dad67bceaed076f9addbe4cd2077771daba78d49c5785f46e57cb9daa8ffc97914ea518f42bda638b647a13e9c17d8478d2c3aa0bbf2c7fb9cf113cb0af6b8f77239f851a811bf833be8bfcec9f970dac8c911eb8362f7d543594a5a1232c7b536c77dfe8d02ad9cb9f74422211cc0078feda3e7a1bca172d2bcd74151169871460fbcf780fbcd1bcb567671bb973a3cfe39cf23aa763e14e83df765ab14c29c88f23c07776c5fb6bccf62d9da1985aae1799e8ee7fdac42a9f7428a73c0ef537af4b1cccfe5926c096d9abbce3fbbe7ef44cf9efd3f686d6fed2ebb73b873efbed6aecb9ca69e145df7572cf5f61e7ff77df5ca233beba0ddb443ecee9ede21768805a1fe160b945f1ed9de885fecaed3e9c65201a58f7d7f47cc93e59f12bd8ca78dd6f6cfdb7bd4c7b2b5bbf7442c96be87f6edf0f85d52dcf7eaec1bdebf5fe78bed63a980dd3d1ecb17bb0c3bdf41b737e269c3bfe5e9d04a74d93a7bceb064b1f9f1db2be2cf6287e9d74477ffc1d0eebec478d30f81288e0f8676ee511ed95dfe8ea81b4bdf2b6f042102dc1fd9734f8ae37ee7fd043b2f7fedf2571022b0d2c037f7aded818fdfc6dbe650acc59b41d7ea11989a78282929d19413b4ee50a95695c4de9d1aee96f2b2713470b809e71d1472973aa1f376da789f0a4a8de15ad55dea91ecd35a6bad8558d1a5cea1b5d69a47cd51a291e8d1aed11aad512154d786425dd34f18292d618b794c25944e3da1b98d1b794c24362567d2e1b123839214159817dcafafb5d6dcf64c2237ea0a88d8b4b6422f09b1bf94a209d5e05dc0021e67d3771e4f56a1eef36fba89498f2e94e8efc1e71e7feec6559d5f470ede1357f37356b31b577304d2fd4804cc1c8178d77bfcf9c16f9c235e79231ea70e71c5adca32a2f46ef14e4812d3d528436b0d7df1f07ff93fd1878e203527a774070999a6e1121065f99626d910c9a3d5c444294d559175a94ee5a42555268fd28406793c86643e688e011d7f4c0bea73a38e334c581d4ce872d264474d827ca1d168349a75ef8046a3d160f8da2062f48deb94db6a8e011d7fbc0478db797344db82bfd0b8cd5ad5082dcaf2a12f5e130a4aa275afa3e6ea893e74705059ee44e3acdd39a20c1502a29ee45bba7c411ae2369ad39ce65b10ee3dc80c528530a69c2b15d3e5c442640d12547a6cca7854a19a0f893e5e95cea882873a1fb0d3940db496506daacb4d95b99baacac6a9d1e5d090fa55001d0cd19a001c03cbd1cd2fde412229cbbfa85abaf9cd2938960e0d6dcc6d37af5cf0b056edd85a6bb5b539ebcf596da57a1363551fa86a65532b1b7777fbc6f278a0aa950ab55aadbb6d7776956c7a7baaa93d675962b14dc986440f499cc95e9c6c4f9b52957befbd4b565051955c41432ec10d97b3e72ccb122c66294e94ba74c512ccea50abb4ae5966594698a5304496a5166dbd211363062b495274dd73666506194cac1c69d174cf99953056b47c332b55665644d8df9eb32a5434616940228592cb4847820c461449153ac45c46e69922a6334ad018d1118aaa78b9280e3218417379db5745fa324a62e48a4384acc8e5e1af8a5e53f2a6e69a66a0bc70e49aa1612a7279de57c5a12e5d602eeffb2a1123b336c399970bcc2a83fbfef78f6c22463e22a4bc5c608c7c415489b9c05491087d45b1c2e4226284f322cb4d60ae490990f355b1e55290400a25971114938ba404407d55f41f8c2863e49a52e0f08393cbd349d1265f684c2e3752692da2d29f9545691554da747111f13756b481e332429b2081ebfaa82ce79264cb152e231e1043dbd048e4c2c0260531b88818018f704d4a00235b9926ae23faf572557105a4522a684f4cae3af2c0d92908168ea8d72cad793ffc0961387fb8ede2546a47ab5cf5f1f418d90955433c61cf900ff5f1ab52a97878787a7a7a7c7cc8300c7f7e7e58b0f0e6d461dcddddbda7c72728fcf9f1f171afeed5abbb7f2b5fcdfaf3e3eeeed5ddddab7b75afeeeeeeeeee5eddbdba7b75777777afeed5bdba577777afeed5bdba57f7ea5edd3f16fad361dc5bad5640aa162e5c00bd78f17a6f8aa238864463059ffbd00d5518a4220ad23060c4881123045285402a55a8dd9d060d1a34aead9486cf1f202090a885aa45a802c2d385d3161f510b17ef22c8d2f0c58b202272877beeeeeea5915dc7175f75afeed5ff5f14c571ac00dce1a001e80763c6a0313cc6ada0023003bb71108c1ad467850123460c13741d65c890419224eb63b166cca001127d90bf0d90c823d23a8cc78821838824594d44feac1b435313a9767cee2e43860c70877b24a88106f60542f0489205ee98f139050dc07aaf5e4a396c67ad7a33543342151d67801af82e8f78343e1d46d7a861e3d361b407000058f059e0b5565b1ed1416b7c356cd898b5d6fadd7bef68810ab444d7b1fc2cb0a0d50a400004f0b93b6500166f660e7fafa7503771b890677f8229b29543984f341fde5459f47ba2f0d74b6cc0e7a0748608c1ba298bfe8092f43bf0b40e4a27b5a3fa3014150f17180c96278b3a9329e44dee4293afd0e42838acc98f9a7a1e1084e6c3000e9aa8177ede6b308339f3260e03e283a99bacdc8180f766479f362e3562594c1e3e9f0f48843f04ba3836ae088802a9a031ac49112c870687866cfe0949f029d96afd7879ebfce416b4d431720702721890e7e2d36174e9b04d5f7c1fc5e10e03896aeac54e8a851a6db1c65edb1eea032a17a4d8710383f765091e304ca0dc69fbb73d136cefadf758079dc55830fbc2011833177c8863a685daaeb5ed3997466b6f81661b102bc10f3398d1326506850d67542d8011807d6dad6a5b6badfdbcf4b0b7b75b0b5af63685fdba98f12245972b33b60d2a427f1097372c8badb5d642e00a9b1fc8a0a04413319765b32d0d4cb605b7b5d65a1e2ab6657078c2d21d2c1026b3ade58264db143e0a13ac5b4f5b1888bb1ca7a5cc931f2d4c2b2d67aa84492cb4b489f93cfdac80e449cf9657b80294253c1a2835f9ac80258a2a4bad6705189cec24f18c8192d2f2a4224267470450b42a5401565973b6c2d3955814a31e578e909e662724151183cdb68c800ac7719c15d9374978928d9a8c683a0a941e28247179d223cbd1079cf4b0525466498f2ab42094f44821294d093db6182561420f2cb4190b5158e9b102d3cc032454e9a1a5287c41abc228ed527f8c1b748bb6ae93302a5d62c0f4cf9e332a60643ce99e3d6754ccb06054d4e87f2209a8c3708a538f2935fbafa9b899f23df941a414a51e5298286b4609fa1b018906f79cc59eecf2ff63574cc83ad4aab047512c07bde365c60934169344e33232aed0dc120d11f477264691d64acc2881b652b068d076cf59ec0d0d2ab11390446164333054d4b0e2031812642976d0b7948ef5edb5e38a7a083cfa57a4b4eead1ce9d7bab2550b92962d974b7ed15a90c8bea5f6eface307dfdefeaa7c071bceecb2b563fe1ded9ca356fd4e52b2cb9615cb1a45cf2abc2c6b183da8bf71c97fb9e0af2217d8afa8fbaa66289a7ab922dbbe46cbf1533ceaa840dba8af0dda69fb07e5f83a6b503a526ecf1e7c28da75fc1e47d125de5bbc567d774cb75b3b3e25e78341344d8ee20ff4898b34321ab52719ada98b15b4bb01dccb297b3bd60d1b59a35aa62a55d9b441ff0160740794a4a2149a8cae5f6270532af49e6002aecb7e1551dbc50aba3ed2a6235cd7e746d7b1ac62362d67354252b3983a2255a34b0be26a9a5fface1914a4edbbd47b622d82d1f769e6fe0eb97b08e5fe7e1db978701f73f17e13571b16b9747fc5cde954d11757746cdda0acfa198abea3f883067b80e01e95687f6a995021216be7914db4da7e22816117fefc9c08c32e0e7f16930cb9b8bbda461fdccf0d44bb70b9fd2a836e6fa305501b8b738a46b4bf6f969d214b0b33a8acb2cd3daed3fb184a5c6d5a4727f53535a6bec8ac20155d525965794f521cde7bdeac792c3fe86077bf4d173dd8368f8ea56ff781c49f925ee78d1d45a1b4fe3a16015344f54f3425b7c75f71fd0d2afd6a77c6983e904a47226030ad78abb58ea8ed270af5aa71857fe7552b20faf10864e755757b4fa5bf52fa459efa984c4ab45e478b7efd22740c2264d2666d7374e5fddc65def26800bab3d7a2c4609bfbec5b6d0aea8d1ae0711b29121f4850afc1efc421746fafc5557efdd3851257795cfda88ffa0df4d3478df48ba86812c87d8e48912829345ddcf66da8df60e77f679c95f58d1ba08ae8df54e26ad33c4f44f528a1e9caafebeac77dd42fc03ecfeba0358f3c63113dae7ed457fd4a35aeb6a7f4f5d3d7aa5f6d23eaf5afc447893b44c00051bd1e8910019380e94252040c109ed73e5f84877bfde1ab463faa2cee9fe7555ffa9112e1e845af373ea31efd6f8c3b5f448f2efbd28d94e019551c87f281a24828c93d4adc3eab258a46a2421388990a6b36f7f3a94c61082ecf8ccaecb27ed9dc6fff65af29c198ae3421e18c36f72ba751927beead134fec922e39b14b8a4604b235bba46b36d7c42e699bcd716d7e3a5192e3e85115a2322aa301ac292481356ad4a041b3b4942307498ae2cf8f8e4ecebb3651b2be57b10826b7a8b188116ac4930bcc7d9e31b210f5f55fe7f5a833fea847b2b2eadb2094bcf2c54214bc2ad3022bd22b94b4f6099daf104ab5a314d54a631b17c58a2e6952514c6f493c288eaac63e07f382fcf6194071786f3ffb0a98187c6fed27828077fe3eca1431d91215eab9625fe9cbb67eb4ad97d93607fc666390b66d6d4b8bbc310a25adee9cf407d3c6486563280ed302fb58a462a60dfb3489929ead688f8d3ea6d1db584e37442440c59a2362bf0405169c5ca8c713d079fb7a5ec0bd5d0179d44864b5414fd24b8f458cd027925ea8df19573bf8f572a5c6490980f5d7d4eb4f8d9f7ad4a7c62761db79c5b6938a6d8b448f4d1bd60a5dd2188d6d238dd531a6472221bc5e2e8d1a894840e9ebebe5d2634fd2ebf5727914ec803783c017a818b9ea1f71856f74fd20eb33463086852663a490418c511263f6449ec9e10972891c9a72600aeb9a5aaf67d4bd2426c98e729abb2426c9ae6e1a773767eec720d22fbe24263bbf2426c9eeba777edd2f8949aeb31f750ca85be0bac6fdf246d0b3f6c67dfe1af7c6102b070d1af7ea7b6fd4a8d1ba31c4dafe9406ae5af537b4bb6edbb75ddfdbdc1bf723508c8d7b8da449920b8a111463cb01b7a018338ef03c4a291d29c514079d94529fb5d66ae9acb5d64a29a553b4d6d25a6bad94529aad78d85acedacd5a6b6dadd6564c71688a81b51587b556bfd65a7b496b2dbec1db2e75ce568a73cf58abae14d56590a8d2c7b456d4fb9cf306aa06fd26a5d6526b29ad1445524aa9a6d4da9be7eb18dce1b8c3718763afbd1b9c6b3738ee70e824b79fdbfb06b67de72ab7d56b647b1b277beddde05cbbc1b1d7ed7577270be78b3783ca5a349d668a2f77b76ddb360e5f8e26f99005ee84dcc959f4e79eef50388efa255d12b2d0a95dbad3c59f76af7b3e750caee52cb89f1d03ee7a1b77fa28491fc438dbcf74733a42a716751aa24eee64371da12c74faeea7efbb7dcffc29fbbee918383939dd29a84a958b76d80ce99625f56b991b1a74dcd480044de726072414103ee47ce3061876fe9c6f78da59cc6c671c9eec8c030876fe560e5e86f4dc81e382366739ae862336670396cdd9a0c4e666376ca9810a8ebc51f30cf7c3be4928ec7b3f6c61df59d2153430792fc4c84c21d3b219b57e20cdae3448997de0f5b29d3d53c133d46070c0aa66681234c311a784b540481c60010509e90ad212dbb2b132c8b6d5019b5073c0a187292430d44ba749939cbfaf634cc0129a5031acf03169ca89e18b134f098cc106269d2a6452f4cd4ac830981743104b7009455d0c4d4eb825b21c83131dd8f2f8c304d92c8627273f9c182529e18712a6274b7e3429aa5204f362c20f136a33193eb0e4078c89862f84474d1586155186d8fa67519678c2e950ab42a638af598d8928706a90d2c40629566238d1a83d67525c8891468a0d240b5278505531d3ba33cfb7879a73ce7b875c107cd3af7f64eba074ee0952588ba3dbddb62be309adb3e70c863755681f353386d03c3ccc4881fe6ea061a4c13036c070820a309040bed1e0130d3ae584084767bc1cf900e648461e25bda0b4cb6f591454c7b9f33e300744695027b5a38259dae313feb05801b570e1e2c58b6305412f60c49041b266d0a86103002ffcf9eb59a4d37c727ad51cf6e44a5e3accab05ad00086000376edc20000ea19616d779a13e2f7f1d06bd5287404f7a2890e8e6b80e41206d732caaea8fe2708da4718a32a13f4a5677b7d65a6badb5d65a6bb3b515d7ca430577ef56ebc5b5561e2ab4bfb5d6da5ab3b5d65a8bc9b7d65e5aa9b5d65a7b456badb5d65a6b3d6bedb7b364684fafcb5e9775a8ebfa4368fffb41d0aef5a2eabdf782f7de7befe675f7d68c3bee5e226cadde7be79c2048543f08c869bdb7de5a6bad76c35d9e5d9e9823efbd97db26b74d8a290e71daa8b372b7dedfeebd3af587ca9c73cea04aaf7fd0aedb7b76ab7bb31f04590fdf6badddbe8fdb3008125dfbd9fba6cd41699dd40eea9b14476a47c5d393da51599e7b6f8f4f55f1f4f46c9e9d3d3fb5afcfadd5faf60189eefb7cb527fc6ab5f75a8b83c577efd517e8de163e55bc66399cbb0704614363f2e14ad5d6cefb7418c0c109b0b64934101f600eaa2a1929c551ca41699d8fc90829d0493d06a6902b391425264a2328cd5a5532528aa394da5165150f16cab55aad2664b2e867803a95f089762578c6d9743472a7692384c27b7cd8b051a9787eec1552850c096148085a488e1a9bb0874d0f143d60abd5f3c3a27ab9f3bacc429c17bc601ab88ac87fd808a9d56a405688650394f2daaa039ebbbb7b0577d8bb836ece49575d5544f6c694bd70baaefcd448b5f6de6de3a6e83ababbb5eeeeeeeebe7118679c73477d568cf3e79e73eebacef3be1a443be89c9808ccc9b19bee54965277cff33ecfc999f6fb9ca26a543b83b46a72dbe501411d46a374ddf56da523ce41a1505a6b9d21a21c3b7cdf0853a9d40e49546307dd2110dd2a1e90082889ae63a9bdd65a6badb5d65a6badb5d65a6bad7574f7fc5d1e8968c085abd6eed5bdbabb57f7eaaea3a3934aa5767676542a1511518f4f1895554e1e4a1d746010310407b90811471fde7f4e854dfa449f6a94299bc640a21ac3a2c1112f81c928c42177538de85315aa5b6a14c7a0569916d047a2f5cba68fc2941acb5386e90b3124697dfea49422a184e6508ae4068922d66ceab02f94525a4413344529a54eec1d4a2b0e4478e0043e74608511580e6cfaaaaeebba9f212165776fbbaeeb2a120f605ea0bd5cf9f1e440a2bce9edc3ed081cf6f6b38aed618448a20ad9cb8531fe376208a618bbac6184525396a61a0864455071c66e7f99d43cc984465f950f46cc0050c43d7387b8730aa625fbbebd976969df2150d8778811ec4b44d2bedf3af364df1fd27106cdbecf030d07f645d3b46f1a12f64dd3b46f115e5eba0a5da6cb2484d3ae2f5ebabc340dc6defd68632c44d3bb80440a2e4079c900b36d70e802b6865440a4400041800922ceb68fdbdcb80104961940f0b06d8e7d69afd76bcacd21892b650389364bc6daa06d6bb0586d34e55463ade5b66ff9d93f6ccb83990e98e101cbb64ff200c5b6df1a62b2edeb506261dbe721dbf67d70a01467db0fd203d3b6df8107b69df960c5b61fc20f4c2f2db0a23073b634c3b63320901cddb9b570a40993315a509064042c2cd828a4783c4ba66bdb33d8be3b3051e605ca832e75ebc60e4580a006aa103ec6586bad7fcc9a272d2c86e2e9c598374d80546113b226949a6072118e8953b452d3444d143557d46c69f1b22725b050856e62405816bbf23302a3950ce94aa8e689858ca9c86789a61f198d4acf12b05076022a3c163bb1e4041a27d4f8844e4e5025e1d44326cbbdf75e36489435c59459fac1060d0f48c491648e8a52aa906644eb423ba2acb9552119d9131dda0e19214cd03fa0e89222a326ca1346984ccd494e125d34193831d06210348180a6759862429b241d567852c44b87189ca461d241c624044cf88726b8a933a20967c491114959ebd044d1e606ebf006ca9dd8e2354a3fd630717a87244eac2a8c628a1f51584159739758ef1025ca089c76e80213c10e47454d453bc8a614a114bef036806025a9e0c3942f58b4dd7336850c8c351aef399b3233010833539a76a99f86294db08af4ef399b52c5192a55c2300446e0cffc16e4a19c4b3ff3d72f73e89f96b2c0df11756c624bac6298432bea5c50ce337bea7c39d3f89773884e447d8ef8bd8b3954ec6ce888e564431ff42270a744d47ba2fe1cd17b1d31e7679b0d72306d80ef2dd9d068a858ce1e76a9cb09c410bbd47ba6d99a875c3b3aa2426a9ee7c9947833a8cc479b7b8ffb12dc9c36f7a56a03c1dd9a6cee37cf0a4a72db6b73af83b2d8a5dd774baa4275ac5b52cd3f9f6e4dd306f7155ca14b2e4efe42716cb5fbdc7369e615b93493c5855c9c79c1b46eaa0836c7856073f768ab2579e8ddc7cf81fd5c57f46f5265713f5dd8c73d72e12d147719b11125b91f63dac77293825ff7a80ae1e7c27ba4b967818db82ed8c7d78fce09bd7db9955b93d1e67eab71b5cd4dee5dd034978f9ce2ce6883ef91b5770a4121d0f2a042add6745971ba3c178f0e9a73ce39e755b5bf01f9f4ed58040c10f2e9577b7f0392fc4b7e9109ae7ed8afbf01f9f48afef68fb8aab8ca9ff30884becd39e7d7599c5b67189651127c2ae2a2ca0261c4788d9594d0df971c6c73471c8c039f2ba238ba073f3f75af0d76b00d96dd1a8a83e7c1cf4e1487eac1cf6d288e9d073fd7288ed4839fc1cf4854686baa2c30a8829e9f3497d96036aa4239ccb1581592f1e0734719e87111e61e7c0c23638ce573628ee12d542897a12cf08fd0a08131967329682c679959a682b1cc91e3c68d5d724fe44ff0c7aae7ef1f71ad7a80d4bf2311303d4f64044289904fff882bc7385865818fc7b1c45a1c4b1dfe58862fc6f2398e5659e0932ec6926c31963fae46163fe1586a9fb1958f36f89e7f3c222e8395f01266c26828093ef9d365c5551e2fe043c6a7385815c2f8e9712dc44e1ad3b00c912345fcaa2cf0afc81d7134b0e48eb8a3a31cd59554361a734c2cf118d3250e017e55a1eda8b2c0bf9ffa9e3127bf6e4ca1679b0cb41da58e8e36f8d3458ad3c523e63594045f2566274a82bf23e636b94649f075c43c0525c1e76855686be26038d35e18a68b3608eb621b7cd8069f3baa421989b2c0cf6a9ad0fc52584667311b3cda60ce98c71fd4254397d1dc13f75431e69e9e36f89efd5a059817cc0d3e90fcd2d9bfecdeeb44164c3ae7c11e3963d206df836ec494fcde52f27b1dd43352ceb10450d71d73acb2c0ef9cd0b3ccb1a6a6a6a60d7eab0a3960b2c007a3d8e0e7b8a0e94ec494ec5e8b9692dda3c41c31487e308319043b2316748506fc493e08165901195b3f8b606e95df77fe551ea7cbe6d873a2714adbe8a82c1087f7f33d2cd6dfc0f74c4524603cbfe713ecc6361c5416f818fc2c967a83ba07fd3d8ce679b40dbe3375e07b97fc20cd20cd20cd60fef2c17798831a0cc1f73e1104c1ff3eaf29e1cda0922bbaad2ae4faf7a2269f2d5ed0dd779e534ed90f77d1a78f7a1df451e07ba223117d54163864dbdfe8304a823f4170aa9ad0df7bcfbd40eeb5c1df68756eb40dfe26ab186fb20dbe0b9a2e72a3ca025d1ca1ed57071feb2ab43df8215985eea3c632c49b2be262568d7eeb256cfa7acd765a43700cfc0625c329f404260620e00d42d8c107f3821bf49dd20c5c844d472edbdb0ea60dbf42039feca8c48c9a6962e9d08c00004010002316002020100a87c442911c87f24c14dd0314800d65823e665c401f88435192c34008628c21c4004280310418620c62caaa0ce82a27d81a1ac6c4d01061b5d9edcef91f453135597b57896b298b5c3fed1607cb8201197f8f5f0b436057a8d99f0bf9df4b0982c9d8a91fb0b66e869a4f43fa1ddd75ec69db3caf7c264881990dc6a65fcde8b6eb2fd58728b77d373a70d78b6ab8db30c1258e45eaa8e9bf1378e20dd0f39bce6dc57d9ee720f1fd0bf4ec72b18683abeb89f8ecbbde6857bfd033626cd43430c9911a89c73558d1ade1cc59ecade19f68984a28de704b00c86e1033c924462667a000997ad9e6656fff6e3aa9e4c3221c21951df47598f989bfb3a747f91fdfadc6fb8a6910d74f90fdc7cb2040a317413834047e19b9d105e45e54c75b7a7c8de76a4a3cb8b2b970206acbcca66c79930d6e481c8615bfce2dec4810865abf6c19f6a0c1c2a98c2f23c3bacbca2dcf7f44cf630c6ec94b5026011c8f8f599dfcac8e5c73b2d5dd7c505ab97fb19c9ee6409494fa22491750fde0fd9467f535c948f53a394e0a3fb5a51439a474a43ffe0da2f0fb6225beeae4d2bf425289b3d7d24d1411cd89049d38e1905cb5c1f58c5a7282a2aebb4b01a7f3cfcf1e91334257e1c78ba5ef2af4f6591ce6e3da3c315dd24bef1d6226f74ba6169fd7c5f7107c2e78bd0bcdf326af270dc269fa5692034440a399b139884ea4386b2e6f1818c921af102f9a4d4776d6e1dacb78121feb114e2da06156ece0b1294d364a6f9a945644790f06d10b189394897602912627164d109876a7d104b94a02d963b04c98adfe403829338635d40289c7bf7ec49b1885578e65310819420c4340b0223899f025f244a068b79d492266c9fcff60100068c9cf3b66322c9a0e59f6c641e7810e1f95b821c769ddc56ee1acf5984945cb94453feeafde9aceda418d5068c6ddd8431a9b2431330886538fb0b5f29e2cfb904739c92981f50ba5a8a09900e1cbf7ce45b53a3412d2199c79f3d73279ce7bf8c76555c28536b3115e28e1cf42d426884fdfa5657aa83f4506f8f2c20a335085c96c98e8c841e481cdc5f8e789bce4f5fed95e47bb40a8f0d98c2bb2805ee504f04ea7f02d6119965c5fda975c2f4f89a25a6b61b4201ea3aaa0a9a9f0ebb8dcf3e12b9c10b0b18ed82b3cbd7e99bd98d85ffcc22551f2a8ddb51e579d1c2839cee2b99994c7ff68af798c5550d55ebe53f2fd9c7cd7fafe95ef8b372883c2fd75f738a45ae9d2835979ec2e8472f86e2e9dc91b3027eb487aaf74b275c9bb45fd7fb93b914fc20c0163e2556e6820d3e87f737c6b4167f9950cd460687eaeefb159345275223f0d26ebc0348d4feccdb3c955e74251d4956a1198835f2549e842e1725db120c2984255cb18ae10a0ab8cacc0ecdedfc96e82e6954497942952d6861f9b4d9927fbbd06b62bae756af2d71b39b2891f5676abde8076e883d075b9e6df8bcb3856d6e558bfae510b77bbe76aba13ebbe1c8ea3c63af59f36c84d316917d238164dedec159226a108c8ba947c9c62a0c03014eb9c8d509ffa5bc05e41607c6c1dd535b1a1aefd55f6db9f96d7a3b4266d2eb39f69bc491c6705170635417c76f54703283816e6819c50faf07ce909da0355d728e3cee04d1a8a8918516c52d4e508ab22291c139e499378066fa2098da96ecea3b20d632bee696da3f856c7114bc00c7c795d6c50aea4a5f77c8e8668e51dd5269c2ef02b1c48dd6419f6cbbce964b8875173e27282c87f2e351353154d91a39bf7f803d6d3d51d912d98309669d2010b52e5839308a2069b02be7d3627223b48889c6cb50d6cfe56f7bba647e6faeee75aa747dae0c3b80d82a1b20897a22569a1aee7de6dec850fe285470d4650fd7ed5bff265cf56e3e0b7aa584af25fbca77bc576d8f8e320a50a595325a07b4a7cc9fe66bbf2e1dfc3683c6a8f769f2645cf49f1961276f04f5a9bc0cb9380747d1075107a28e7a5b6d071242cab1cb1e0ea9e3f70a6e4bbeba8fce40b75d97b52356f987ab24fa187d438aa92fc23803271ffe4d658dd7f9d4b4fdc4ccb8e39ef21b13ac9f116ea22bf08059a1029821fbea8ce91694f634fe3e20670d28b1805ac5bad5c52de942e18e92dd1950384b594cf9ee9db5fda8399a017dc3204bd8ca37c8f9393edebcd9fd887d35a00d06b25c7481116d85c65c45232f6495ad569fb53fd2efa112bea7534b0cb2d399b4caee03b8d601c6618d213f97632f991829a2d23a0e988a01184ada7b7d6a20ab748f24b75b7acc32c90d74eae950073858dab1ae2a47d95f83d02dd2e42ba19c89c073e8394857ff25a567ae5be5d255ebee0367125100a3d1895a5c4794c0679555eaf33c0f7fc85480836be9d8a913631f4c1fcd008e5d0d9df2ebc2d77959d0417b9eb31165b5bea1430194084028e88c6f2955dc9b9bf641c3a6a718d1c0ae442a5378d747440564a055d57a5e6b40dbd02471728212291f7bcaf2a6ccce8b9c4c47b03330427cdf29f9263bdc8cf8021c8cce00b28bdbf0af40bd2d25e6b0476e5eb662ee0ef846570cfd469589934a62d5cb8eb8ead95dd475c37147410608873b81452f58247c2bf07c80f241789faf967072df51961e9fc4b31927fa71ce272e5c8be516e761f8754f05d74b9bc8074ff31ac4eaf56e8985bdbd9640b994fef6feba9e81defd161185527321d3ea19f3cf19275ea7135a42da5955200b2a990c4d2e6625f8cb513ba220f1d67fd3fe90b28eda00bdba9fa161133374b3d69d9663794b9d60e423bb4f92222e3c011f1367d71055c4f9e49f007cd48ef0c6b59517c8d34f9cc2895bae29adca51953b4d75035c7e7b437a5619d2e369b310823f197b2411afae924ac4111d40eeab670594b05482e41417a181c89128e3595a6d09c0db69a6f9d5693a3fa789ae4c1265e64768fb4ba30d5f41b7e896c5857a57722bb24c2dc61bd42f36f78b5d972703c07644f72c2b0486cdbf9042177938bd4194fc2564851ce6342ad4d864df71fcc4d3c6755480c9a1ae1eff08b461d3404ab9a28d109975dd48eb47b23a73dc73228d20e0d6981777c23b0be501a1084d4f5cca8b54773e8c85fd612003940f499e88862c0e7e0b4bcf235a960fc5e925701b59e568474ba462a9ba301524dfe5bfea76bf83959878a77611885cb2265578cefea64cc9a2456ff9436bb136ffc38633df479f5325a5bd0587342436c0a3ac35da5f019d2f536810e36076dc04219cfb3ba8fd1fb3987d7c4782e7440bdb1b8eff106a67e52948bba04147c8cf4191cee1aec8d2df88cefc3ff8cbf5b353e4566453b35be6d199fbe7d073f90b35a7833bebb682133595a7c04631904f560f184f8b8240c30dd5a0e449e2db9cb5127c5a7ac0f1a70f57da79237af81cd81088e977d097e61138949481a1137b4de92edf28df8bb787c9102ce7befce19e382e5b761ad2d03d3b71b0887c05029fc4f7497ee6aef1cfb1ec7172feb4fa09eff82041ef92c32ec5de519defc68c2736e9c3edeee16bd2f794eebb42bf65dea99b110037f29017aafdcd7d91d036569bf32e00d8b7da8925ad6fe4eb49316fed23372c42983cae806b82a4f7cc58597a8f01fa84db9aefd1e48f975b892764ad8b1c3a7a9fcc9a27aece21e5883c40bbe52821d8c02b40981d6b65fefd7922ab78966632ebbfa852d3d724b27093a6b47824b0a6b0d88d2fadff1f5901abc0959139faf3fe39d1873be45e5fcb7ed134990172dedcad8e998158b2bbb5327e5a404d95953e1f51ecac2561767e18e45e2d0aae56a8c471d7aa7140f8086112591d9cce551e38f0ebd2fcee6ca0cf604986e4d1e98527302a132d103a27077a31d525c88986c67cf4a82ebf0bec430cc8f1ffe8f92a88c69672cc364ea2b5ae017ba9d74188f0c75acf22dea894fc5a1cdbcfd916491f296fa19c755201e98a3a190cc5ea987afaf44006da82152eac9ca23e503729f814944a78a604891d0a8d0729dcfafb6d58e98603c8bc8eed584fe24c37ad1b7c09658f982fb7cc585f4f8e7e637b3be7c20dc89702920252588efbbbb8bc3537f892a44958ce2719a15f1a5ee67e5b42068d8efbc16bebe6dc98000aeeb5cc297310fb464df60bbd49aa5265cc59c4134a009487c1c97aa94f53c318170df2f91110acbc96d6a289bf75376ea0ec600c3e52c5cab8c0743e878335034ec53ea79c790e617ed5ca5c6066885f1ec090f3255dee96b256f02e8f7d36fb9c1a476cdbfc23e3d68d2a31ab99fd207e6c60e5a74b6cadfcee3072e9a551c4118f3e28faf0be5bdebae8015ca5a829732ad95e599a9348ed881a992c356381a5b5f0df5aab843e029e0f24ef7e5b5861a0291b8d5a124feabd0d0c8591c19ccf10578d813cd4809e55b18f625f879221052f514ea5629ae02e7e80ff21f9e0f680cfd0aff1d1b821be69b73d9a34fc08cf43260813c0ff7a646541136e4394c5c584ee40feb07ec8f1def6592c9b624f73e47dd7542ead4b43b22b47c40ec1b8243ce508114229a823c2d9a8c8679a0c7133a05be73b83765153decb64c12d25895ede4ff315904d593edac9a0bfe41d5d958ca9c999c775e619e2af9d6acb34d2c7f521e11ebef4dcae296c28e304d14410664e6cc9ae8edd0bc5eb6d2c68114745428a0c29a69a5f0546b2d3d2caff559c304e074f7e5c6727ec59edd35216adbd139e32bb199d5837ed303550a2b5cb739ba2f977aeb92a304c20481c9b834e5a2bfc25bb7d9e547f640821ba1a82c5526abb8014898b0b5d051d9cb5f28a445e19b3a2dd950c01204f1c7669ae2131694420c44ed42cbfae04978fa5c57548acc773861715ab9c7f047d72420fa8adde633d1156d5497a5329dd6da7c2b340897cc030917c67c974e145fe28b04d0fa082f6270fcd7443a1dc948c9c297f66b40da218fa736c8e30d469189d5fc6675bfc5f9b5aeb027c3dfbe5df94c11f74226ba670c628ede39fc2e76321503e2a61a02915b098f6ed2584d053360e58a7a6a9c24cf8b7704ed642d943cbc97d07a992a1f5ecaebc20401e7a0203729716ba6b31ce7ebe75c618f998644fd9a890b581586d596240c7626a19eaf11c116e401875c37f5c7d880b10f92237f941e269710c77c07a5acc91de1e4728c5c4d89f07a235634e62f219f18efb3616102006a12c9f03cfadba5514d5a52ee8ef3e3bbde7c2c413a2146ce87e934659d4504f71b763f423ae176e6af2a606a6170f834f82346d632448cda60f28f874541cce70ef4136548a07498c113394e64a250902b398edb23d3a2aa588830149328f483ac398405be16f72fa02b0c214c2d2564c4f7338899174d7277ab2e2e81cb2aabb7624ba23bcdccb7adf73836718044eb753229d835c634dd9e04f1ed9c1623006d9359f2159fcffe3e4f5acbfe2e0f4a815a080ad0735a752a6b2d7b378c6ebbb439450d7d475eaba29ee3a90314475edc8248f814f88aa0701cfda12108a323942e5ffc5446ab97457776a384d1e7073b85d9e8717a91b9ddc1298f4221817d378a7f2f0ab05d3dfafdcacf15462448839c82a2020495d44204bc49a8fbff7f19000d8393c670b92f5e28f051a6fd336f00651d094e25b23325c330a803c32d013db104b79129954d725bc94b807d5cac913c61b84696ce5574615d9d5f6b5ee87ef037c3ae921a7477cfffb77e9e76986055f79479bf16e1c572bc58ae94842233149a8845a279ba6c67a8e6fd357c1cc47baa6257fbf55bea7c025873bdc1ab3374a3ec4df449837d3e841ce9a90055f78f5c05e9f5217e1437c09c05135d35e3da575ea1c2ff3f90c11cd0816a01ef9790c159b19dad415457589181ae8b42bc4c9235981e0d61ef29e3ddd9747826c5f97aecb0063e132857176e11030b302c1d3ffde49776f3082c3d30f3ebb62ffa322861e5a88b238c78d965621ce69d1dbfb1a5462893067f99452f2cebb646401be4550fca1e268fac4efdc31b1f9876d55bb6f6dbfdeefa8428cd0bf3a71e3ec12ca2d341395aff4e314650fe31dae67184ed130bf2417a7a1cd577cd71b3c796e75a0fd6ce479565d2f24cc1ce97aa276b2b9381644c5bbba4168c7f81147e60d5f0874ad8409424d7db856373147d036c6b2eba5c3a042d146cfacb30ec4663701fd2a437f2f8d155f3b8cac7947f0b226d3e25891cc7a5f2f7815e9ee68245c23ab9ad76683f27532dfef21efeb63b4288e29d8365011a4335e2385aebb80d558e598400ab5be7e43cd49d1be351aff492523477b50c6fcfedc8092456d50e2aa89245a932feef1c48415f849ec4259165bcb2e7e2b3ad2782b9998ad1a8f4eb0e1f2a959a2634d643e5ab4b0bf48136b810d205173c7799a3ce7b4319821926feb0c756d78f8486ffc99c46ee5756e4fdbbf15c894814c98a1d5346e95875166b22bfc010c74936f74dee4a177b3fe1402f60540d13c36700a8b44f7fab7e4106601b1f9e70a03c7b262ad83a9f9516a01e7c7f9b4ea9b7871970f8c35e35f08387770dc88e32bd6ec2ba924b91af8830fd36a33d0837be85db1113766167f79bbe241969656f848299f88218757d2509141648a25db98bab04bfe79e5543ffaa492f823fdf4adff6369b37bb93f6a607d73e534dea327536dbd957edbf298da5d7d9afedd156f54f96fe52eea7e407536053cf7129c1e982b8eab2538206b3e0ee40f81582cd970efd5644fad9cf72a46be60c6f537f10a6f688ff4a152227c333d81bda8244522ed828692b3362e1e1489da72b95e14c402478922307856c981ce5cca51772a8712f661d441d5126f9d7cc9b5d821395c7cccc1774633c06a7874c1227bbe284b8a0695582c685817749f7219364335e07068e9264512fb0ea7156be482e076aab1ff85b059a16a99732343d0c3f01b56b381724dbde96093f716025f098329b9dd7449f02d00a1cbaf7582f49e89a2c6347477834cc210947bc3bf93adf364c0e52b95a1c2fad7d8d46345a87b2d83e0b0c2ac7e6817bf6befb6f4552c4356f3ce9bab94e91c835c372da1abdb896fd86e1587567f86506b25ff1cc8137402724630d1a6e6795f0b0b5fd4c94b9a31a81a40913a5d5251b0a82f77c0dbf6f4375eed7e34d7499c9d65fc75fcdd5f839678c6918b015882cb57c4c74d030fd5e06c60661c23b3cb3e30aaee8bb3c66948f776a705da9db7dc6c89728a0716a7058c7ae127dee1c63d95b75324ab28f68ade867531222cbfbbbc7426fa6b245e29c0ce08c05cac466e8d6067f216604e72bc4d0319c93c69282a8325ee3973d5a56ff521dc0a62e33379ed36108e069c38247f2b42b3a1edae6fc9bb45f2648a3557e4280ff6b9209ab9c60821233e81312b5f372fe9de589d205a773c8043d33c16f8ef38462ed9c434624c213aacda13eaf674c20d75d712b4e992fbb2b3188ec9776a319147de8dae1b8140c1f7dad7d16869105dad409a0dd0ca53244bcccb90a397302fd208d6fc4decf8a9c147a7fa33800f5de467238164ea008916557b9a8f8a19c00bddf4aea3cb139f5f0743a83641b764917b8fa07d047d83609ebcbcc9ccdd4f3a4677b7e7acc37467afab81def59a09b8960694d199d0b62debb85613acab89ee5859b41e6f6eb891fce67b290289c0b33419841a70978da9e711a023a9da6941d5122660c84844ebb2b087c8eef95eb0e0ce5a8a1b9494f16e57d05c1e3a0fe13730f9c9fd6e026d1e4e5b68870ad0f832f5b8d42a691bc36db8f459f36c84bcbade7d19d89fecda504c6e64ca2ab9c710456130918899ea439ffdfd4728e2593fc80354cac56a517c6d0010ac764dd6818380ced161d6a89fee0ed9afe545dd749b6006ca89220c69f8f39daf7bde019eac750a129e1612de1c5b8b6da9e438898d667645789e12cfffb0dc5a1759c98fc5b02b387f833aa559310f062db5adc550a04de4ad05e7ebe46c7544d822dafdfb8782273c8a95c0a707babe9438f76fe5ab46335979328f0bf3cae9b4757b7f3ae364efcfd06a83122f0e81bd71a0cc22ed62e9614124125af12cefaef02cd343550b8860c38fb8ad0cd2d5f7029c1180c00007cec855a43d54abddb4ca207660846fcbf12cc9834c97b2318e2706fbb8e75c9efd4a124f2608bce7b5172e7dee2b8dd24d9cf1717a505051eb659b7ac3b0ec6990e77e3411ec89a86d7c106b21373d4f5ec6aa034e24f29f9b40a1575932636256fe1c2007a5a95db515d54f2351db807713e3ab3e81f29a723348b6e0a1cbd158d36a676f3c5da9f85ba3094f7bd70dbc2f824f4640bf6f4b210923f64c061ff99447daa9fab2d10cc8eac73d8cb2a398670bda1eee8234f747aa1650d2657da29ff8ddbb3ab44ca2bf9097bcfa1138391a68482f49b86cf19f345f81916a819ca3b504ecf853840ae4d56599edd4cfe61095c9bd03b69c75921c6f4009d04da38357c226212467928af5885c8aae60b3ee956e7f96046165fcc7196b2667d276980c4f8c51c143685fac6243829f00e7c90e63a59fd993261a1ded0b202e58c4c076be600272a364d229c1c9139b3426271fa5d889eb6522142d589a0420323c1e53559b27e161d9fe67d28ca80855b3debc04c6c906072584ff6c051f6c4e997c74838fb9d157e725d55ef61ab258aac8a18d1042a5cce74833b4e1151d3ecb39d9aa6db8a0dea13bda5854d8196b41c2b61cb0ab2c1d673d280615e84e2311557d97e542a09b359beabbfc494d45b810e82761c3c049487cfc648b7a9bc27c42e68fe89f2e23f3e28e4958e3083356b54fc04d1e5d70fbf034e0db313192aa688bf60defaa81a0889793e68daad33179b924af7ede6fb6f97d6a51b018e3af64dd9aff4879816b728e800f3acd2f2ef99feb4fa6f9860be97b95e9b9efed7ca5d0d3594ff73ae50f64bff6036a92be0c1097e08c24d1525bb1f1047e60946366840bc0c559c0c47716a2c79dfd095fbb35f54a57d0f2822777bc5a6e6783981ce89a55999814a31b83a05ef1f54f99910a78fdb2202088a369fecf5209531f46acb16648c03232b24b9e0245266e3d9d08268a59c394f58acc75b5a47fb5088b5f8b3d5a9602b4d6040a999a29864a860a4cdf84b6c3d26499c6ed6e2f71a74d1a7370a1057a65d25fa7bd34120cce69e954d4f7ed3b510d6c3f6e99fd4d24509bc9ab57929b742609acf035507574b0f619a431dba47ab9b9a61cb8b09f79c694c392ea1bc3271042e2c835aaf211dc2798c58ebbe15fc4b66be58859b631949c78cb0c22b42aba140d28a50dc5c55a8fa56705028dc1c044576a9546c45ecae16666dd4a4c8d28937d66d89d54a5fe386d07c18e924ddf712dd59f4563434b14bc406def999c7e9358ffdba647b9420f4e3191ca553327665ee7f68b0f6525774899f1fc840a49f5de96a5775990a1f9c7caca4e6c55e4af053c36b95a597f5c6a262c44ba364a551f21dc6d275ec05cf7a7b95d24ee44a02627283ed6e3e28202bb5c70d86bc83a7d8f32e2d15be65d53926eb1ac2031b0ff2c860f0ed23dce8ef2dbdcc3d588fade57de8514b067c257800fd300fd1e51f3ad58691b4d0bcbb549600970cdddda5acbbecdcc277e8f01bdf693869a4234b9a6cd216812172d705c8b69a73dc97c31ba0635f8d0811ba7b118b9aa855dc0584a02d2e5941ec1b749750255b3a9bd418ac5117c0c2f4e3b52f4092dc915ecf99af53d2aaddb94ba2d41b3bacf405d47bf7886fd3b5b0c5cc0582700453fb0a906e214cd35247840a12f344939f78e7ca5adc366d90088c01223f66be5110460cbe00f1e84a9128436c299f045500ecfee680d69fe14b27cd3418b273001b43cb65b4daac709bd4b4aea000e3ca8aaf95e8f60fae327734d716aa8d80930aec558bcc424bd2030cbfbd3707de433ba43c6122c014d63e052c08d0118f14980b576591afbc204ba19b80dc5d047fa7f7a3ff92e8df5da75460d85d2282bc0840f9b9f78f043fffcd317206558920c8f5295d520d88779f75436c0171eab692af86fa0ddc7744fe435522cca42fbfd081fea78fd7f6b984222219da97851bcec481d7845ce2f55f1c33bf6ed7517d949e698221c74a21d3728b3748a1f7ef0a3bb1cc917e656b37b2f55bf3061983a21d25889e4ec34a8784f6af12ae3d909eec0d58f730c2ce008d5d5f72eb9427eebd4423c0c8b61a725bc0f9a121b5b3a73c551f71bc72fa0cc90d2a21713052277e2eba3b5c253a8eda809aa671964a7426afdcad8e76005b37d918ab051f27dd13faf625cc0686923c385d7fc1408aec4fb0edd4a9db18c3d1b1023c818597fe145a0be2fc2d1e77be16de7bdd51e1ec88d2b0d859f3a9a1b85d51cbeb90c3961dfdba70952ba444ffaec9c233604976c382678fdadae4a0bae5b971fd85f5c6c6f38a1d56db282ebe3ef698c7e44b47212b48159a00c102e4165aca1e4ba0f781068753f56835cf8eeb97c578a92d0c020c2df5d9d29c532814b7e66c02d5d5ed9201c07843c4d8df519ccebcf0fa05b091b7b60a1884bebc103bae7a71251632517c153f982862cd855b904f70108efc6951b7cac2855c2bdf3a0658552a3f4336f473ca5bd12088fa3becbc8f05c1189d01012faafe0471c262f1af7382ed398134c41ea6a16958a786677efeddc8b77240862b30d07af6ade53dad1adb8d01fac102ae29db97e1d6357926311ee8a712f5b7f23d4353790a988357e13dcc119c5d9eae3d6696cf81ae24748401fa270dc3d6c5280c4403eec3d35125e8a8d3154f84a04d6751e00788a62af714ce12244a61ae16e8779fb231a014c71005fb58df9fb37cd0a916f49fae00ba77641461967b2b493babbf9a9d544d66dea97c3015f2cf04cc93c8dc239557d8503a3824878c788da8f7196781894b402fd8e2d89d30dee8a13eea62bc8bc843193e519dd70627b56a10a09372ca7a609d589c31e755900b0e11033a624200deacd23d58d5a261dcd289b5fec7714cc15907b986fffc9f48ffdc041b6707fe507a3b91d9cd15d74176e6963e2caaf777e0555c0f22c0747b275eadcc03560548278bb0d6ffdf9ed91624299f8f070246267dfc85eb161c05f6cbd9445c2fe0e17e2bf3425050ef35ba3cc0d74a55fe8d73b52feac3fe2106c18b0a8bbf02b207170cc541b61b829e8b958897ec7caab7dc79a17a886b5c2d0b27f69c29f458c6c64e24fc87ed1eeddee1b0ad699ae2fb6f79c664fbd7fa7bc9fe62077c1b5a20289650fb9fb9427790cb786720234980d00a435a097d1b7709e40f0e33b6180f2c56fd3eee3c7ab131772f57afc39e9d735edef9b9ee0d1ab9519fff1e7f6b24f685f8ed0ac01f199585590588babfcf077a6dd39c7b37ed85da08c9a4d42ec6112877cd25e793a398b763075bd44cd6aeb8a6d040612a5c7197da9221a1fad69d837c84b8d08fffecd18799f13383375fad267803dccdc461f53c2f255b9bfa28227f182224abdb06c128548006d3ccb0442d88ee898f13fa88fff7edbced3f26c8ccd568afdb6e481c9af5b21e4e11f79abe4da39c4ccb8961891f5492e5fbf0fb81f8df23f9fb3709714e4fe55b218cd035e6cd0371a5344e4ceba07f3404e20f6a0dfcfd232202345a7bc185cda2331b4e6f38f18db2b1ee94514234d9a4a412911a383a3149400793b7d64e4d511ceec5899d5b7d483185f47ffab1f1ccc61f70165c0f68e842e60eef4014fcb0bcaf6870bb9258804b4a2179b8f372818e90ea2cc5dd208031583ae89fe3e012c818ccc361b26e7a6a67643d47d7a06788f04383c665a7d71e424d22f206a7ddbe0e06169dd0e9c900ac2edb6fd67da36ace681ad3dedaa02b6f7306816e22891715ef946ca29b12a6a2f6a43b1684697740a0ca56261073dc15941cf8cefcd7760ed44d676eb9f6590d52a7a6ee80814fc43593a492d39cc9e6e80e9f85fba34751ab426703d33dc85ec262c751ca69326e6d4104192fd9280a1982f32af1bc0f43201a773374788be3f39d12ec031e11b7008733521a20f15f38e87b0be1ce2394f568bac2b3aef576a8b641267ac81f41506af7bdadb5a75ff18dd1c801b84128f733284e4ab2b7db5601eeb191b98ce5a23107cd0c7a01500f194df7c2627fc52a2b73fc2d955d66e14e6560e88447587054b8ba6dcea50fd3ecfd184388f7c6a960569cd2a4da0be53568e41a72a6e7645e1e6c435ff92804e925857e9f06622170510743db2afde1a329dd0953f27f5344afcde33181b6f010adc49c8710961b92dfa7cd2f55f2b0781808638e209c4c5cf5aaf94166fb1824bdb3c956444aa32379b79743b438972941aa811a527378863190c31bad24304fa9e4059e8afc284b980587683a8f14628b0711709aba9cc5af570870e22e45d3e84beddbcfc382d864324d9eb0409558bd437ca2219ade60228ba6b4b4ad13bc4de71568e492f8ee78f4b8ed1e2228bfb20e17920d8924446efa5e1a4f5c343ea31e9c0db8870fad37e4a1dc86f1618aac9a91a103d4f17bf8baf70a1ee61672b3faca04535b49093a155e38361cf78521dac54b70575ea75915667da5acf9e7ed2a453b015125aad9a8679137e696c4c947beaef0e6e84fab616ef04d8b0549e835aac8ebd9c76dd01dcf1024f2fe320a171f318be32efbda1c7582048bff3ec7196799b5b76d8f97df001e7cf9ab8bd33bd45bcfb73e6ec840bff3abb3979e4d2012ee291e3bca107030f2ad2043f0601ab1ff1be9c7654bca225b14730f6792d315542c73aead0c78bbe4433758363a00dbb3418007195bc1707b0bbb00861909a70cf1d5f3e51ae57bd428e793b071c1bb1240a7e3999ca9e9f57eec805de1c6d99dccf0a345e8c1e26780f32be0f849a3390619a89222be8219617044219a5e20f6c99c2024ace24db1f5b1c10a597fe6583de0d2657ad9024e0c14a2757f0ccda2329a077313a60aa4707da658e6abaed10fe94b078c625cac3c0e75b1be553179c424866f6e8a86e924f6c365abb22f4bd80d0b52d774ad757c231fe5e461f46312f310a37534873ba75162f6febf89aeb0ee1304bcd2f63284d9ed04417df1f9b5785b39b317c565096a7318abb0da0e264e77f2a28b41093569cea1a7b6001e557a9f540a3f26b094a110d0b94687924fd1dda3ab59a3c0138beb014a2ce2a39e3a88d69d98ac567cf394e31205bbfd3a7b406a928adcc6a604f19a30c1b06dc464d514f68029c2c7296a10ad178e9caa7e3202f2b58e3488a643e67b505017df4d11b81647b126653963c701e645cc112bf9015789b4ad71e6eb450e30a957ca0bc1cc935682503a6d51c79a933fc8c11ba37a1ee0941236093081394ad414e3bac384846cb7a72cf9b92e4e102b6fcaa288de03ca052c1aba40282f219f41b43b95d643d2cf0c2c5cfdb704b3208408f3fa3b50332e06d16ef4444bda02edb258ccf0cb8577824c6537389b8c4d0db14aec3299b84ba2165ff4bc4a6b98efe2ea6a38bc84b31f6b3194816b6bf93fa543a2711504cfc41b1c165641e77a718f310967289107bc231444d3c921540aee9b7ac8e3e9aca9b72ec18c266812a69834141bb9c70b4c99d911961e7ad05e7f28085839026f4f780f808fa168b9e236638584209aaecdb0eda555debbf4253825fb0bc3cc63502dc854cbf4341b9fcde7f2faf67070ea4b4b017ff10a8f45052e50d416b58a5303fc6c74556936682952093f31f119ae24bc07e7ddf3a6c2d591a85d96a0fee331cf5ab0ee6e9a30abbd45814d9790cca5fda88f586fa09568205a7ce078d04c46356dc96865a1a15c3cc279794593521988d615582e0c3940a9dc9f37927f0fcdd1aaae0960d36df722dfcfb02ee7ae0485231ae9af86801ce4a7e35f3d3c6b668218668eea9419d2581f1e52a3bab9aa42680e4b8ce2f06a98d7cd92b42ab46410e58d2443064c60e81200b38016aac53148acfc9ba6a9272c8fec5d3e852d0af0eacd018582a007be737edf271901d1ae642f903e319af0ac8eaab754e55de24a56b338ef2fea6a20af7e808ada3c78eff9ab3193f11a4a138078c66531b0053b691b7c939357bf3bd7373e9bb316934e6f00d13a0e488ff57a4a3f68da70e302ac956ab45028908d716a3b98bde9e9444f4a13241afdc42a457cfaf7e4f00be92e45b5864d6785102881d525fcef67c7d7348eb8a0da8e415f6f22cfa9e398cff8780d12af751a08ea5ffb8dfe8e747f2d6b883347f8fc3c7a29b2d9b66a59f3d3a8cb3649456bc206d5e301c822b7be430de4ae6a7ff214d937cef4718477e252fe6bab45aac5d1872ba20a0aa53f171158852e3e1959f2ad3bc7ba5b63cb3622a8f996dc66b5b71cac32dff3c363e1c8ec309d586e5e6e8144894325ea63836d56882ba1553a1c13e153ada13b49d0adc49accecaa10370d5bb43357c8bfb8045d6c4d105b339f76746d297d07ad8f177dad9f23596a6ec75b74f6fd692bc95a29fb3139bb200c550b553a8e371f7cd1b06b33f5e308729eee3f417dd08d3129c9bfab52d32af84e57d117aac2d839422a813d7f68471cd87d322d69c729aeab06aa3f56512d8e11d093bb84ac765670b94740e85e656168a3a6717d3aa9d2d818bcab86abc2f3869f0c563b12b048054d8369f16a08ead9d75ca920c769cc6a7315bbb4094ec817622497ff1865c86224f04f6646f899a13e8da9717133ee6c6bf830c3ab4fa90f328f55d8faf5f445620a9ec07261c74b05d34e11b4ba631f5cc14d5b1d5def056d978ac35a7500be44962c22d25fb878d333f6c13c3c9c5c811c220b83fe976fb2deaa8d980535cbdb565aadcc907ace4f6121fd6075cacbe7ced5bcac5c7cdf1b6f1230ad67771ff749bb994dd91c1f19eec37d33355ecf6ca51b49ca0baa9906de2c4f2dab6704f74d9e1965f9aac5ac4659a5792b1cf6ca60e818e8d23de1a43e95e88c41a995c90ecc0ec22a676548ca6ee6230a153217bda9dabc71c1ccdf6aa967b62d7a8753cb0dc78c835b3df663ce7d700be6d90b55f4037eee03ea2a1a910f2e511c1da3342727af92d5fd7ad83b86fb6d5119d2eb6c9358ac765528273b18d831c370f8c3e626966a13679469b41d4ae427b930049649565a17186a368ea679e37c0fd74c5f55eac3641ca1f2a0c125c37cdd22f12dd3639b7674cca3d0edcef440ee648690a69e96c9018d3c41f19ee6e6ef68dd1fa71c7fa7fd6a99cd04e8e66172e282bcf9245f4a6a8c0d5840b26c57bb6e243b95e9395c79be7bbb75c47571bb83f8fec0de3e0b37c33db2188838ab67a4d388893d58b061aba9f0721ec167f248cb02873e77d59752682733eb3436343aff1a76ae51487accb15b2c6220a157b3538bf8048c8b1834e9ed50a6415ef771dfeca20241815efb838331e59f63fbd2efc3dcf618755b0e8b6d4d0d6441c5dbfd969bc3adf3e1b8bfbf5fd4e212fefb093474ae278e7e9e46eee3231394815e0e962ddc696417a9503d8399310c459f1b1eda2485717544a50418b3174954d5b3c0c30284bd8ec86055be15949821fa22fdf7bf1db0f24ab324ff74b4c9e92b623f8f7ccf1759a534ed63a88a8595530909456e571d3bd3d7c6505b28203ed41b341a5ac67fc4fd82c184ad88bf903cc33adc8d0339008c1f2b8121d908195d2569e4a81f601a0d123f1b215905a717c9d23cb568716b0b7761acb2603fc95d4eb45543e14b4c295836cb48ec97b15f2411d5e1e285dd057e3636def3bc225ad757c23362aeceae3f7e819172297f8073457bf8c4996e52790c0ae5e361b6d563b74efb22c153de1cf75cc075856c86c40ce71bdc9a3211d19654fb457f06c64bd34d5e0cf30ce0b224a22328d74505ef2590199fa8e894d3b285f81384428932b30a644411ee61626db9ca111369c172c6fb3cfd09372b6c884a8e8cdf6c3c8b6c80800a9c42cfd4600bc0817079b61f72312d5cb32ab465a5dd8df1e6f13e8455eea31992ea86041188507e92cc6e7ac90383a25c88741d19fee86760804340439e724b4736e90879cc26e3117b1b96bc78a91e9ee562a0c48012c6f38f0950f8f2797ae61acd7cadbfbda4dd651b4fcf2ba87fab9b751353ad772027847e67d033c4aaaccc05daf4f8a736776bd890c8e123ef3905d055d072426127a717829ea04fd0b62204f25e12d48c57b13a8e7463309c83cc3c6d620413e95dae059ce24692a98291891b102fe314f1352e0fd91499aa48f2e8b444edcdaf736277db2d09f80c98adae794d534de325101097ba05d739bd7cd2899583b67977487a7a6f3e0f13e25682760dfba50295dd0fc82ad3095a76292056a66a8c6cfc802019a73819e0407164aa60b27603e3653a45c93407c691a982c9da0d40902a3d0f683523fa6cffe235e56b3f2f92d4c7f77860437d64e30a09f490a5d7c70f39db4b23c8c5a7f37ad5935b9913e2e755e8dc18477a03ffdb931bea03535e136922b1e514bb0bc97bcc948a79c063e274a61cdd7cf4dc9bc1431de207f08d7cf75c938148886c47e9e988c100232ada72d6928c3530ffd85eb6eb0aeadf4a9d7be23039a88d5eb8aa6707c88b0f5a9067ce15cc62905875cf42859b1ba74c2ddb36dad5c8622c229ddd1e4174f239031037e9a7a4e0a3947d359292c092387804039cad6321936c9a8cdc17d993634817d95c1a5e4bea3bb728e60da7da5ad46f1f1f5986542c84eb55328971250cbd649408bfe9896314693c84d021bc7da0666b257ca0b1cfa811478e5948dfd1703746c30cf117f848b40f01682bbf7f3fc7b5c5c16919a57aeea9e124a45418e148ed721ba7c582ca6d14d560a9c7c71ef32f8e4f9c9b7bc9fb99d9174c45bb238a879c75bbc79fc76704ceba7258af664177211ebfd66e11c8dfd2953b87e01181a17658ed3576d572ae5b42b7df366755637108d4b431dafba62aacddb46efa2bf82d4c48559c9347305823cd5b8324c56c923b13bca18b6e1ba1ad6347ae221035b9a83a5f27b9bc1ba2c65b8aca4d36d644d22381c4baaa8d0c462439652df63e96449b96923e70c15e43254aa89baa549e784beaab4e9061671b648d24efe7b3b5ea49d21ef40eb5e5059612b820e0b89730db20ac5825057eefb25b86cd2792eb3275ccce960f8b10b0bec0020dcc93610bcba5a0acb5e135c67f3978570fdd739a0fa6343b5a43a14d26e4ebbae0ad93553dc7a6695cade9f034fa3b15ebc838b587f78217897327d8124da372bad0143fc0f063d3a02f4548343df13c5240ad4f0e0a6ccf2875f2b7a18a4c90c333aade36b3596af339b287e90f6ec749941718019b0b6dc4ae7ac0b968741d6783ecafec30b8a87e042a6ea9f53630606a1a3c4d6a9bee5aaf1d4a979f41f68c40efb236b0fcb172ba10fde5289ddff7ed50b763c35e5075ecf6449414a15bd606d616024ddbab3454f940a64b958acd85684b40cda3b6c5245b38422d7a3a54a08083271120e65fcacf4b782415c2d21ff034011a120db5783589acc177dc67694864bed5713e4516db58264657a600d2bea9fecce391912439e7b2fc3c3161094e8639b46214edfac6aa178b49550007611456b0a17bee73c1b55cdb1ef155fb7b5d9ed605964c543d286719ca4438f2071480450bc0c1cd44bad920313ecd3f70f6f8d78f2a1c5b7bf2c4b23bffcc05828a5489ea0a4b66e8190eec9120e7381d824cefdf9792495bf7fe1a6ebeef23c6af070b56b5e54cde44b7e507115a8e4f8d1d4197fd2ab7b8795bf701831f1bf0df21b3beddd2f470765a529a23aa8c4a755cb3d898d39031065f6e2bdc9c60894f12d1b79e4f13d23e79502775abfd15d54a42c59c48306ef79fec4ba76b191f4f43733fca00514d6267367a057c42e5578bffff741ffcd0c79201cbc0ce3045baa9f4241fd14809d5f32bc178bc709b6c7949394efce4b93448408059bd4204ed5cd48608d7287e692e5e8488765302fa504ccd65269f541c01086142f4a715b6a1f2fb1bbac3366d91a6900b3750e681f015256201e1173a2e6dce48bb83c114cef2bfff8c564b3836dbb0b59148274c24a041edbbfc4ce336e9eb51391ab30afa1e62d47dc11db58aca8e872fa126d13eba3729681e5cbc4b10e5faf32a7e84b8362d155a7a16f27af5750e5d223e4a004870409f02d4255973875c533f4a78b0795e813334319a7a3a4f36880a86d46f99b76b1814803f3279343814d8f980e5513038ea0f0461d9ad718afa5dfe8554e34711a00621ea67414797fc1898a3979297a8bf04e502e119fcc73353deacb4c6e910ef8ae2826767fdac30b9f4fb26fe93cc1512a0c1c0f055335f1d1026ab425e80edbe137c42759755ccde3a703fa7f8fcffe0eb0f9219bb9d2d571f9219b23711231eb48d6421e3e6cd57e0b1fb99473c415df767618026d58a73cf1f90054c681c31988ba9d4a013e1a1cf8eb9015a32c62d117db16f3e3c7424b52d8f75bd54b99d9ffe024772c10125658e814bd67e8db2075b7f663cbeca7b8b96573eec67ecc241c2c5c7f3c1e837c2685b5e733cb21201712ed0d9be67702c5f56371444fb792f10d8df6cf3b28b55b950f98123055f97c039883102a48760b25efe6c70c94ec7a020b252fe3ef5e5ceed9877973f1d7d17ae1e301dcd44822c72128ebcf149f57163901081c0e5a47a23556d88ebf51fec757f38b87fe6f68cc34bd29bb36fdc77c19e01feb061c8437bba8ff1c1c9cb8fe77d6b0bf9dd933064f2804c4635e6c7f36afa1aad138523e0e8c15d5bdeabcd68ece9fe4c06a4c98df6918dfd657e030838eca2e080443832b0703d44e454e09d0acf0d0df27e43e3f9df0a003f05d7b49102d63849de00803d2527b285d1f4f9f87d2000647663846af838b513824ab2576ec9d8e7100f1745eb3ed4fb4796142245105818d008429ce040c2376fada931a490f225c7297c58f0076a00f88a2f8c422eab67fa75cbfc4ca40be363d91df1f92d49b7bef20114aab86d3fb4c91852e833d73e64c489e44fd2bbe810f1d534e20bd7cf9fb276d0a896f5f3ae506a84d5f2831ed0c9de277079d310440f9cc564430e97a541df9188fe49b9abd8a203561e77022b6dd1ff96ed6aa883aee6f3ee00e132fdbc8c4c4ed23b5e7a1f052a803b2f052106d87bcd8940e7e687cbef6e19a72005b30762d84e37c17fe121a8846dd9325ee8df5e60bd5f30c0d3225306ff6227f06d84218debe3ee16fee70f24a9d0097a4913ac309f619832ded87858522f90ae60a84e01f592455ca38ae13ffcedcf3f14b3868fed29e7c405264d143e6704477c6824aeb2cee72d7cb8a22f56c9922b4552777833fe331cd917635534929f51768dd055ba8ab053eaff83c8265dcae994cf52b99478b471e97ebafad6f13ee52f677925e28c1742cd36baf0e61d85658e080cf5c26b86363a5002a4d535da0407a29ac5b5f8b4d730632f76e0c8bdaaa4873602bf275606813f53a82552aa44eac4bfd1a17d4639dfd3b8189643f464803781640a224b54bb3f0cecc8acca6c7196be52cd47bba012201af5a42e40d19e6f014617aa3f6306d8673ffcf12ecfc3146676103c33d41775b420e199f9a5ccd9e69f56532ad56d2f09da9dea36f59206d65e1277618b9f978836342374875ff278439766893276c298271612655093bf8df19fa8f5bea42e94337b39792813be84f84f6d91a7c22f52a86eb9605871f3d1a975ea41f42895826568bc51c4233e059792c3e9daabd2439c0e343543bef3afec0dada24458e63e369c6e42d14784b4d3d0f1a801d9c1f4d8d9d0f1ef112d1e96f5a188f9be74c55f00b8cc31466bbc07405d72e5f0907bf6f05a29c7c60e0f497f7ab2342f9d14dd82bfd0a7ac63767b27d7cada2f29aa7c7afd3e4a0745bc14863c4e973e39679bb1d016d8fabe7fcc47665810663c078ba646cd126b2824b5f2448f194d765f22bf6116073980a984ee51966eca29ddebdeb045b9d09198af0f4b427180960e4429870cbff7054e9ac0118d663e7d352393243698f55b613d8e00965438fafb4e9f2756e80caf90243a48d2b064ad4d9c443c77e05024cf84a68bbbf69ef0241d7f04fa566cb719ec6c99005a9ee89032eaa23d93f105b0c1f4ef96d83d85998efe6918bec970e158f387015843fcbe7d9fea1e748ed5ca08c06868f6649363d86100074b6865f508af811c94247fd87462fca1b5c35763e21410c705c4b1e07cb081d632943e7c1e3d4f2edc22d698e85ac112592740e03c469a7fa8875be4d92dfdd008549ff60408f9866ec4c6e9128ba031c18285686c5ef6fe31f3ae5dba8b746b7d0ad7b2f7c629fa0312155759620ef37f4bc6c349c6b46087f91fa31a4fe51583f1138c7908a344b937d0c900f058aac9b2dcc12c4e90c093b5630f462fd1a8ba4cd5251a9d91f5982a24bb3f9e8b42a6f1d01401625535d7afd9938fd84ad2701a86c81ad463c49b869012f2c9655a7a22d8a786a2c1748dd295fc289ca0ab2fc0f80e16956048c51de8d5e1720a6b4c2ed0a824b55c7f1bdae0cf278d490f0abdb350c848b88992a9e456793c853bec5d0b3623d693f65e9d12d0af4fc2519e90b5e978d3c9ef0a28649c16f6609169ddcc044bc877e50e9102a04c0570080bc99533890e0c2fee72fc7bd9f1d2ab90d079dec7fb12b43a4a0579c7cd26be8cc968659dec653c3132d026391bd139d9f9efb71baeda2200c77539cacafd6dbc9d3ff142a6940b87212ed03900e936498010f77580b62b52e6e22a2b74dbdf09535fc7e1b2c33d454b61f7fbbe9254b46b58924427e0e36464f0985de1b153adb9ecaf06b007a8dc6c5ab86e7d76c266a428b10ca65faaa1127bfbbb8566f29a697fc3178a3a9938d202ae7480f78dc79fd8eea2d261a56c17d609baf4fd5195443db72a9902abd4f488354b660eb722ceee9cd58ad881485ede5314cf48955a82d44392d8b511dcd5d7a6726b4bcae7825808c704e8a880c892f607543711c43a360c747b486899a22a731940e582c34c6746e476873e5d6ff2463a1ad7a4d266b7bc4a63843701e25d4ba789ec91073fc655f2e08ecbb91f32aeb746a37e1eefa5347ec160912223fcedeee3175728a220d08b2c314cf54569da8cf3f39032f5eb6b275c849b066f0e0ca120c41da2907fdaef2ef627e0d12834cd2756422aff55bd4bb116f5f0dca276489db87550b1e38ed98bdafecd72869bfab0eaf7d114eef5e337bd7c10b9f2c69d6d764bc7906e421edb6ed9c9ff06f58e34bc004901784489a71e00ec1d90b72819d3b55f47922a8ccd7d4c9d4f7f36fa2a196cae1998c99a9d123743b57110d0e3fb0c744bf894287a627230b00a5cce0c0db8add0b690d1862101b07e219f1e4ea5eaf4ce0cc89f65f88f078c974926819cd36804291b8cf62b69056c365ddf717f0864b46f3c7ed7e614af9f295c9fc7fe0eb3e2101412cd38fd9ebf95a7750c7ad60683a26f876e69e33a03ee7887e4e2e6e54dd5d048244aba73607e410c7ec899cd2b7b50d51f75672e90c143c63f575e644b1d6913df6930e21529778b35ec01743d95c099c76f14ed0ee6ba80b127a25697f5fc885cf6f260d299884730fdbe5e7f4b51c270b9699b5dc5f4f8eedbc5fc85d33cd343d455c3daf0300a6dced162ca522b157b3d90c82354a9778ba9445d89ded62704278e52beef9f95e7ddd25aba3afc7e47f3ee878de91ee837acab605771f4f5b72c1afa40b76bb8635310d56a2bb07a99820bf686a34e5c8ccc230c8b4a9b91e46a096dd85e16ecc40e97e19f0959846e621a4b72e5dd38104012da037c10d8c2993a94960c2d60b3bc8d8a09de0ea1e7d2b40b26c2f1446e7bfe41aaaa1878e1da14fee86d9fe51b35c719e1de5215d78868229575f5fa3b849c6fea86a2a04f9acfe106ef670e0459d044fb510424b82d3fa3ed586a052cba5356949103e945cb4da21c0ccb16b6542c2c382ef5a2935a1e9fda1451ad5907f10486f4060afca2aa4aa0aff201a49b403454d7cb4d29802884986baa3ab96280878763b51e197ca4c659d704327dd8a966c10e969ce02af81411f5968e58490de59e730ef83dab89a3a123fec9cfc8af360e27a961345dbcba8f78e322cee41079ea15628b1c382e9f765e17aade169694353d0956d87b0387bf9494f6c3881d58ca9b9558f0bbb18082d4539b747675368823213d496807fcce060c3efaa8b5b5f6abd204ff9edff6c6a1c0584908cf483165a98865e785fd0a96556c27d708bda67b057929d6d4d6913e9d64e90838b92a86addd526a9fc0135d4c162f216c22c0779bf7b0e0086e014258185b8c2ca2ddbc29af6c7bb2f3f39fc5e77680c6e0604467256477245307b8367ea480bec0c23b86a35c937717f30d3dee87a46283e75f5f3f78c74071ea2764f53f66b893f123412be41b12f8efcbfab0f48dbbbdfbba5f899d0a27ba656ab3d4f16532372806f5197b9ee60dc89b69711f88997c8c745e08fc4d9eccef93a7cc31576ea9cd0670e2e017ac84a8b2aff23b3b240e54e27046cd469a25cd2128838e8bb54a218ab7a09e0aa409576d8de1d68c30228151b86ae33a215674cd059defcde2abd498c71fb1a9a2a1319776391cbe97163fa15232e47d7c6508756b25eb81563c12b17a3477eed186bba073571c1e766e54bc79ec58a23b7a7f8d611ff75b081659b59a4486ff4518f571a8123c6545d17b200b75618a7948a703b46f375837b33f3c810b53758ccb5a76b2859709bc23da25cac032c4153fe1f3e1643018b41e733f285adfd6c392ae62d444f98100b6d22b8c3240d21ace2d1f71870eaad62cc139208548d7739920055a703de7bb49818faac984b8874c9dad3e61bd2414f95ea476e43a4f2236a65511b430345e4eefca155816af2bc16229f41cef905677a5e786d64a790bd1b2ed61698b4f92a040fcd5a896a2de9349739d5b6ad2595e028ab0ea570b21ca1c754ce95a6dab084b4a70bf18f2c1953d698770708b1c42def9becdcca4c06f3357205460bfcd901a1a0979c4dab3bebed5bdf4bfb2b7dbc968adfa08879f3cbfc96a285521c4d8fc553eb31dd84afdf382b4f5a86dcb40db0adf644affa4387b996601d657647be5d384801ef5d841da65c3fc065cec94b333d5ad8a03b89db3ec1c4c21232bfa899cc079ff59df4fd78d7216386b88e462fa40c8ba7b4a30e61f0f0fc8cc4b73cca3fa4eda9a84de6444ec58e6e338ec1747fb15ec40afe8643d325e3fd6073017f0855ab0d994ff728fe242112aff087133da467a437f29c96d0f5a9c7d5f3e158a7c9384d10f4900f015dfb1096500586da61f10183b49188971c27e24aa620a564c2128c828653981fc5e9f034e52d9cfe6c6e222d50c0cde28d2206d19f723a42f88524e7b98b9832c45bc4194ee070df3d9081639f5b91a6811e9cd52025d2d259720de8c4529f311111d911e2c0a6bf4d5294e2841b819e5d11b043d4b0844f5d6d4708901197b5804f4756917588b02d97a18616f43e1f88658cfd8a863a01ec49bc3c8c833290876039da4b4f7d48d68bfa6140a6e4c22f6503d5b15a03bde980d07cf2cf6a4c6cff391abbd24d494e7201feac8c3c4668fcf9565a18622682be0884ad162589b06f95c288ed290569cc527e5425e31d2a5bec58b53cd7ef507840a4162e3be4184a3f496f75049f55a3491cf8b1a1ca017699fa910125cf93eeba2bddde17604152f9d368bd8cc334130f94bbc70f88b8ef9178332b48f8a4c38f60c21778c08efaafc4850e0b819e68b84106e6b1fb2c99cecf181dad6aadc3db7ee7a84efe5d0c9d42dfcd1696a2b7d0eab3ebb258768ed961395576d5e84c958ca2112623875b7d998185b5844901b6a1609297410753f91e9a94361cb1617ed19b9f8e272710a1ed0981102a04540872ce7765c9db290be76af87d0efb2b0aa928e85a54be50626b6181b9ba7526a7d45e4ae8aa828d91dd917ad32c319e5a0850abff1c4c8f2d690a0fa46d98c299e91131279ad55fefd96a6031b728589c8df4c3e097568eddf76c40a6cad256d3447942e4b0218958d2363b3c38ce5b6020df4ccfa1ce2fae3892b343aa84251d1ac480f4d218dc481b3d23c49036408269c428eb5c399b8696bc079662b0c143bc562840b41829860738d3ecaa3092aa46b772cbebcf497101da277be91c042174423a6a7538368083044c27453a7469c5b2ca7c35001de8b6ad60d2abc0b3015a1a2aea46b71af2f0509e61201830f9aad4919e75c0e9aebefbf58ebb7605e942c6b210cf9129b434b999f4074a66249975cab3c23e9dfb30db820d7e629bd8d14adfb0c32bb144d2d2fa066ba613c699c469b90ace8e6d38040815ea69e575b1bc4de766023fe3b2b842a1a7f77532539d992f880725cf03767168c21ce1f4698e0cf5888c255a297731c9756795c5cdea96f97e6f28a741e310dd0e841eeef5debeabc71081ae5cc119b4484b5ac841bf61cb3da27b553f1db4968ef64379c46149ae56159243910f9c30b14c9cd1e7196a4d5bf18950333e8c7622a82d9293bb4e615aed431b40d7cb30132fcc8b4fbc68b361599fdadd228fd701ca3f44a8538487150b9a543190867d0c3b91bceedfb0156f4b020500a02125aa8a7766662a41a32fcdd3bb21a58d94fb69470f37f7e43585b0bb5450c0c9da0b88e40df21e3a12e1b11f17e223ef98829854290c5eb9fe265f860c3ec79ebf78a6921dd743daebbaf151922babb4d43fb80164937be03651dad2692c996fb81bd8ef6cc7b697d9dc47b3282a07dccc95014ebd3749bc4fbdeef468de8a5e9653a27464b4fdade2cf8daa1acf0df840266549205902376a65f295018b5aab2637a5362076aff10cedfd0d788b503bd09413b83b476e06510b422d825c62c3870dfa33aa514e4e791f3b64e293f3451900e98c5807c9f844cd57607d89eebbe71a70b85197b206ee6c68f243809488281bd00ee03758334d8d1736c74e7de7c46c1227f22c4273ab16a1f4423211550f8e96b7265af7359478ac550937c86cd2ef4f3cc2cd6618451f9c5e8c01a879223118ff7e499711cdd1f0731b70fdd7b5739cd9897498f716738b038863a50b25f5c6150c27c5536615ebf828578a29d23adcf516f836e14772f93ee6bc694f69a845f91b3bd81333c97c907c8c885822518e06fd035ac09e05a7a3706d62aad3466c923578a5746c79041029f45f99f04d4fbd003bb6805de9a8576002867b3d4d4a6af0197734baadd2ea3e903aa492167acc9259f227f84116e45d529279031316f794cd529db374cb3e59917da750ead0f3b8e9b68de0436595ec1a214ff3d37dafcf1789c65998c049722c5a4d95db7065f97b69a7e5dd57ad1e6ab7f8af21d4d5f5dc042aee323187c7e4f1d82ce11472fbdb1e2f978027dbd16940dbdff59a1eca22147fc79cf57a163a8e877d8723423e27e6c6eb13fd7f68a5ecd9902e38d0b9e6866cb01c3bf9ab89bf3160ad2dff4e9bace58f929a8676e509a2bdaf6ff9fc27a8b78971447af602f70e669ac636e62d715b541017ae194964ae5c2dd7157a8572f2417c9b89af50bb9370e87986bdf96b52e2ad0469dd3db86bea32df576404da3f3c1f5a085f7be512b24e0045e11393be74f98d2660cd5c94589360f152af1cd8a46e4320d1e885204200994515879d601eaaac3fe8c518bbad5b893b481fa43261a3cf89e14b9e3b8a928055b8b53ceb6b5e86bbb20c76ae3d9cdd002078952ecd4b89acfc3465320d6c75a7cf815dde49c3cab279fe8624f8253f98cee7519998059f6d514bac27adba9fa7b99ea998a6ee41b3631b906c532d7be0fac9f2ed29c31c99e9f30edd132f8df2650e7aaa162d21e2c1e4e2e9ea81c6c085394f7b9d706adbf5d3f99a0147e9ac7e4070624bc6add5b9f21eea422ecc48ae550b27ff94322d174b4e4ece165ba3c02b75775a746ebd046b870be555d1b636acf23b9ba4a5d7fcc7c297fb6c17356de085ba43c28208d1aef0af1488cbf65337715646a7f23381f54024f8bb9bfe387c422362ce92af0e2e2de5ac1a84f75137cd7c66ea4052981ce51a173afa843b8e7dae610622f50c51756e567645d189fdf3a5fe0fafe1d2c56b11d531d62679f10c61df024814dfd95524789ccb24469ce1280760a9bd26fc0754a477b498fee0a81c53ff1cb26ecb5f33ddc867d0fd12a41c787a5c5919e0f25cbf221d67be6a12a4b05adf4dd869befa1ea453723a4dde1e3796f2aeb3418d33208b9e8923bbd6a925ae94504a98c48b7d6127a84cc4141a5161136bc54d0dc5069af5416d383a8d12783016990d706720707f85e8b4aa178a726328e9d5b003468caf3b8cce020dae4c7196cea937cd1170f3a4049db8906257e6808ea8e0cf16051474aa6d5db0df643121c991cbfa7c0291f5591b572f3e8fe36df0a72cb4b6d9e69db7f32a1b5fa21f30a99e7742c2ccb4a1c850e19cea7e11c394c178d5055d15c0b490cd15980b97082a1026438dfdf962f14b49edc5654f3ab2a972dbbd0125e324691b711cc37b9de1445ae644f02e4a618a70248b3232afbb332b58508b7068734f523b6cf7a49211e2be59f1cf3bb2ca8b77f891d76fd3fdd820ff9193a7a5bf067e39d55814119920b19a3a8fdf5434fcd901b8565257e60e404ee02617f3d3565bfcd90f0f16a3538d20c002a7ca78580f645b75514ea4bb5076de34a1a8e05657a89830f40db422bf921d38aa287489a3250d922ec8e620ab0414d48cafa09e28f54a24ba82ba30d37174ef53ab0249f3759cf608797cc14c1ff88be8ab0580b8639eb8fccbe8d4eb298cdd5c6bb4d6473024af389685110280d6b3a39d3395132b120482b223f1040bef91ba9a51f9fa287a49ba5a13fd591f6bd88d3743d68a7b9300a984e0790aba471a66ffec552c23ca2fa118d6a5b987910706cbdd69a486b7bef9da44c291e06fc063b06313186d8f7c3c418d42cc5c499c730f39eb731a9598a7df8b11e91490d8d09bc813071e63dec391613675ecff33c94f0610fbbd94c883d6ce6f5d82eb4338fc77e3e3fdf6d5e4e9d836a937312a15ce0d7796b42a75befe89cec797cd338f43c7e3d3c1ff2bc4b64eaacef1199d42cf57c90c8d43dbdc5d455624f55cf5550f3fc27edecdbce46a82f7fe622942acefc9bc6d7ff0c0afd7e2ace5c54caf23df84da38b09161969e8c811f5f36a967c9e3ea55f7f897ecd51a7599b4f4599a37f934e3427f4d3c9c70728eba7be8f8f9028b77ca65396a8a5c71f91871db25ece66f5f4fc4d6e053d8f413e7f9b4eb29757b336e98ea74e198c424bf5652293ecd52c057d159964a20cba62da216ae95148ac0a9fc7f06fb24d28cebc6f1a6515cff3c823ce3c51290b4379393983d223fd1ee9f37cd0579149cd6c845a79ceaf6d96ea07894c136ad6dae480ac07e5e5666dbe8fe5599b50558c21776380bd3883127bd8c744263533a5fa24f0584528de5698383ef85085c33139c9317c2cf561e26c89be12cfc77efe9134421ee7135c94d8628b34c418b05411479f8a33a5faf4617f9b57777a5ea278ac17b35ed4accdf7aceefc9b0775a78735e57856334bd2e64472f3363c6b722a7cc970b3a6356b73fe043cdea69607d4e452480bca44dff305439995eefa7759647fdf161b0c7b4e203ae1ad714ddabf67ffd30fdcb3b945ee98bbb9bbe7c82f94f6b21074a3adf0e94d2ef2e9799ed771e9ba07ddbdfb29eeaed5f99c1eceb1621bd778e6bc5c18267415f8caddf89c2012286bfce0d75b1d7716ecba06251465a2972ebf2392329162cfe3b96e0c24047ad51b912bff25b6d0f7babeeff55d650c14bfd7ab07cc049e87895866507a847d8f30d1a98e3cefe46316d86b01c76623dfc76c8f12b6e4238fa885069e11f672f45eeffa91d9c8f779ef1788e27e1df0142d6575326d3623231aedffc5535cd77b52dcaf0396a222287a9ec8ffe01b0aca2370ceb682f2211441d99c70b6d4bd7f27fe84e2d177bd7bcfe36ce9fbee3fb1136750bed777e26ca96302bffb9ec7506acddad6ace1a6d3cc9a35cb238fa0e5f1850b5fce3557de239226614888898a614191b34979141027e02c9146e825411b13fe98f902ce0e428408792e4fc1c9f2469d2ac8d00a3206196974e9fe66f7c7f31596a5e5237b240a595a0d4ac1acae7a66387966e5b1362734ab2bf975df045dcaf3bcc5988d62939a6058c3d8e7dff74d30ac611873a344886be8c8a51131024274a402b18542624262f2f2e87a8c6c7f934878a40271a344488c687e3c5fa50dbdfcbe3b12abc2fa0eecb67d31900868439a529425b3d6555859ddf7816f5b625465456330269ecb23ea9ec2604cbaeffbe6ac9d6d09cdf57d0814ab955e61dda615c6e4fbe073a254ad8dbec21ac6c21a86b1ef0b6b18c65c9fb4739c9ddd765fbbbb7bceecce53745dd775b3737767263289a6cfe95ee7eeecd2dd6b6766767707634176a89c6efb6e1d13cda75fdfc9cc36afbbdfbbe77ddff7cd2c14fa73b9ac9cd057adeefef96466ee84be3dcf33a27d9e47f43d337722d3917ddeed664fe8e3c3fc7d9e6ce3fbf9ece705d5cfab554be8d03c2be4791e1da5363e77f7aeebdc3bae1a92a9999e85c215d84c347b78320fbdea6ee544ea935851bcd9f9fc1f9d4fcff33c22666666cff33c8fdff3c0392de3d073cff33c9b91e7defff03acf3dac28d2ea63a2d9c373cf9bdecf6fafba572d71b7799eb7867d8ee7795ef53c4fc9ddf0bcce465d22129d7be7eedea921474ee75e97eb72eee5d49023a7f39c1a72e47877c7ebbcceddddbdf3ee4cfa72a7b6ad7aec2a3933cac509b5867b97f32ea7061b723af7ba5c97732fa7061b723acfa9c1861cefeef8634de66e29bdf33ed0f5a2151663201893ee8576b88e3aa52831295a563c55575655c5b2b4d0482c8915e4f323036b4ce94a46c124546df3925268e41ab906284868c7acc7078ba1c059ce63636267cd28a50965a5d34be2244e268331f15e36c4c34b7229f06f422e3f90ee8582e72098211e5d7dd14a5f3c916a1f4d79db73b7aa575de5790ece32b14e43d2e4c7608d85c5a4f301c164566214b22614d4cccd35726b4b6e493bb8de9a503cb69f62ed641b06eba86e2385a6d7f41a1e3c66104827336a424da85966464da8324ab3165454b7fcc5a5eda6bae53797f65475cb5e5cda54d52d63e0d2aea2bae52e2eedaaea96ad2e6d2baa5be6e2d2bea2bae52d2e6d2caa5bd6e2d2cea2bae52c2e6d2daa5bc6e2d2dea2bae52b2e6d2eacb8b4adaa5baebab4bba86eb98a4b1b03d52d535dda5e54b73c7569bfa96ed9cda5fd4575cb545cda6054b77c814b3b8cea96a7b8b4afaa5b96bab4c5a86e33b8b4c7a86e31b8b4c9a86e2fb8b4e154b74a2eed32aadb2497b619d56dd2a57d46756bc1a58d55ddda2eed0c54b74897361ad5edd1a5ad81ea16c9a59d46757be4d2de40755bc1a5cd81ea96824b5b8dead6c8a59d55ddc62eed35aa5bd8a5cd46c7e90ed4366ad835f937effa34d28fa113dbd857fe38f2a3714d5862608241022f5c89800b10b0f28016aa5071000b2ba830e5968294063060010a4800020e8082010a70020106608200a204000a00964a20610425114200e183271e74e08483264c36d060bc4b32c0e0022549922cb0211d2139520105468cbabbbbf316a28798b28d36ba8d968ab9bfd79d06f6647ef77d84950662281379defcbee979a02cc2b48e91684bb848ca2ff2dde9b74adfb93fb826ff06263523c9bc2542cf13c3252c9b4598d6305b9df0f6dd298e725ab594cdb2a54b9fddec9cbae1b9d7759f473f57d7d53bdfc117ece592b4a63d5c84f2e7cd8a48dd6354bee47c5a292c84d5a758aca7613c62b33b9f863c3ddf13fa589f9e1ff1c7072802a09f20a2202021219a50d08e1db51d42329904b21d43434386643c7810e131349b15cd78f4e831418f990f1f457cf480000223087cfcf861e40704ff14fc0f6b2bb02f8a47441b410448221089888e88220002040908519020b620408408b14048101a2d8926a4564b52a349208112096a43865c304402cfc31e17ea2194ef44ba6ebe5b90c890a20c8a883c4d2075e70445628a4c51640228a30b1815f912ca77235d47c59d6f04340a75a0c0df29303255010554472aa802c991aa232456201d5d6143c2c2025b164916689124690b2549b8b8408915061774910106185892811777c99bf17ea1c108c6061a84c16483ab264cc4e0a0c9184e3820a30327703ce8a08c271e98f1c1933340f8002b041032204208682889a0811194d22061840d94400207964a5003004b595000b04600a0b0112500710410458e0902e8c0004c6883000370e304026815e084370c5000385030c09c03a0400701078823010890430109f0c00214b0c58005ccd10006d491d2003a529062e796c207a6dcea50610adf5941051c0b2bc8e0001666a0e2001aaa50c9d242951a1ed082162b0fd802012b4e2e40c08608b870c395087079e14a1709bce0050609e0c004430e31306189e1cb9d4f9bb0e8806bda41061c981964e0818619c264a1414c0d59a0b4d4d0c3162d639cb690b1c1a9cc0d36f8c0e506335db8fce0a54b140e5e80c80187209e7210e2cbd3103a7c39b3830e4480d9010d0f6072617828424c1823a0c41cd103549a313da82133660265c820e1439935667c48e207331488faa1024044b1090208258408c2024308b1c49921da107186093444349143e34411b9278c28028a238c88224de50976e823604de6953db8b0af144770cb59344111232314547004c91192cd82a4244a2ec020832577d46003264d3870d281074f3e00210411944620a18425004009401401983000029c500003a07000042440010b604003a4a4709ba2c20a2c38804a95161e6005022e44e0ca0b12808129062c4d8d6b197a86a6a1b3740dada5b7b453dbd0373497eed25e1a87cea19ffa4bebd03b3498e6a1c3b49886ea1e7a4c93e932ed439be91f3aaa81e8205a881ea2cf34118da6735d441bd147749a58db400748e5f3db7e5df03ba5ff7bf01381aed755a8dc29ddbbc0fefe16865ba1fc39e9eb6fe1ed34d7fbee4b6cc1656f54ae07de1c67b3d96c369b4d4a29a59457fe7dd3a960a482d17c158c5430f2e20ca83be4f294196c5ccae35364bfdedfacb838658a3f089dc856faca96b31bec9fe24dca7ee3ae053333b333b3333333773a5871d74d766766eebae7ae73f7ced9d9b99b13092396396d8eff9c57d8b123478e159e2a030e381f04255127250fa919d58f35c5c645b174834428aba494a449299e73cea9a933da14c599a2443690352997b8a8c2284a92f644d82f9334d9a0d1cb967064514654196ba8c018e2f6b84cf585d4a53c332597f7f425fffb66dfd366cd639a3f452699d734be8d041ea9c87493f9df6cddc86307fe1229edecfb28b3e67dd3e8b2b34f6c81041e95442627de38e37f5d89b3251c55c3429b20fff54bf3ebf357f92f91a9aac55907dff77f4fc599d2eb674bae7fbdabc78631f95cbf444a291ceed266ee1903c5f073d92bb3e671d67cba220c2eb25c0f4a1e71185b9491483d4e0e430b2fcd9def69bdfc4a61dfd4afc6c5a57e98c8c4d474a52a8a94ad2b27597c05fb259e87f53ccf7be21253d087df34de786be61f7b1ea59db9381b413eeca1f407f7d6746e3fe801d9858aa83454fcd0c595623b95e924ae1cc2ef6f2bb6e02e1839a693cc4ef2b054124d029f3c37d9fd6e61d79bb027733a7d2394ba231df71ae7b3ace5f4cefbc029394059baba653d20112e92df31618532d1cda9cbf61dea896aa8eb346957234e727d4f100c4399ec1f8b6fe7248df62f9365792e97cb45eb64e2ca2a9db0b0b0b01a8b7e7d02c13094b9aa8bbe948934f4f2a97c1e6b2f264549ffc65b208c8a4d66ee36f5584fd3794a79c8befc59a59bef6f9c45c5f924aba4d4d02f99435686269c35d9535de22cf62c4536e2a409e34002512130e8a78707f6469c247b17dd41bbbf4929100c4399ec9f8a4de49589b3cdcb29ec2c4993bf43149508c127e992469c249b8986aae20a893723d7f5af9732834420d187b3c450bcc9c498787b176751795d4fad1117b9c4998b612eb1c9bc3723f7c65946f6d64d5cf9df7472dd1b67dd8c48ad6bc4d7ec90426d384141444e6611071c4f23953858a08ed448679d39b8913a9809e046da51255181a7917a5a4f1880a30b2a46262c3ed6185922c122d4441d4ae046ea22838e0dcc31d217951719a81a29f522aa0aa79156aa3590801a29ac8a306f9c461a0be3ccd59b3284c88d3484b2c269a43d555a5983971bda8cd4a74a2b6f0033d566a43f55daf6a2c50a6aa440555a2639068e54165b231316a6630c183a46352278995822c1c27696787a625433457653278bab910a0505350b0d6141868badb1a9b1b49c5274de2a7ffe94190265a2e99dc8d414b03343d588e5cb1a418944ca0b8437f082b3366b73fe1499769041c3184ea38bb44e62ea08ac91ce9601ea8ca7715a1e5b76179f349ff2146fde688db4e1ecf0343a9189026a6434b49863cdc85ea8c1658db4ab9de53034f084d548bdda5926b6620b17592396971458d3ca664b1dcf160b6c8d1dd8d9231ba6781afdfb0ec8a00b041f9c48af07c16f4e127611f9a078035d6e6f4d13c6840a757710743d88f4025dfcb2409dc4254e9d51c575f166b3048d3450c1e1264c8479b1dcef13dfd288e6cb3a21e850d0f1191599e01675443ca1cb433e095c354a8309e1711ba4c72d901fb7444111ec1087ecec7dfcf80181f511410f2033213c6a6e8786b89515b9dd51c4ad9091ea3688e5d1e74a96cc9a5ba0fb592512897c7aa4bafd71eb73ddf6b80def74cb93d434a9b36c01172555b754092f91ed16bc605a2592e6d6ddce25d52de0a20d24136fe2512d0e40f75707b5031813ff396b375b22bcd96c4be4b741a844d6a407b127e107defd810f08402108892053e2e1a30704ffc3462012050122a4469380c890a22213185160a40224478e6c481624495282c10519dc25e3061a30e1a089130f3a7802c207212889304209242c410140000410c504020ce0040314a08b1214aaad8b94038049c182ae262500cc6d0164a634a08c0af24b8187156a2b619ab48069720aacc9df166d6156a86efb884b59a86edb884b1d50dd76119752a96e3b776995eab6d15cda4275db445cfa80eab6cf5c6aa5baed212e854075db425cea4275db415c1a81eab681b8f44a75db5197be50ddf60f974aa0ba6d3397c250ddb60f973255b75de6d218aadb26732996eab6c75cda54dd760f9736aeba6da84b5b86eab6c55cda3354b71de6d2a6a1ba6d1e2eed2cd56d83b9b46ba86e7b874b5b4b75db3a5cda5baadbfe72693b55b7fd7469db50dd760e97f60dd56de3706973a96edbcba5dda5baed2e97b697eab6b95cda3854b77dc3a59d4375db365cda4fd56d3b5dda5faadbde7269eb50ddb6964b7b87eab66bb8b4c154b79de5d2e6a1ba6d1a2eed30d56dcf70698ba96e5b864b1baaba6ddca5dd4375cb772eed31d52dd7716993a96ef903977699ea96ed5cda3e54b74cc7a56da6bae53a97f60fd52dcf71694755b7bc75690351ddb2072eed20aa5b96e3d216a2bae5382eed21aa5ba673699fa96e79cea54d4475cb705cda68aa5b7ee3d2ce55b7ac75691751ddb21b97b611d52db771691f51dd72072eed34d52dcbb9b4d554b71ce7d29e4075cb6c5cda4854b7bcc6a5bda6bae5ac4b3b89ea96d5b8b42950dd32072eed0a54b7bc814b9b4d75cb695cda4a54b7ac814bdb02d52da371692f51dd72062eed36d52d635dda4c54b77cc6a5dd4475cb665cda4e54b75cc6a5fd4475cb702e6d28aa5b26e3d28ea2bae5312e6d29aa5b16e3d296aa6ef9ead29ea2bae5302eed0b54b70cc6a51d51964a18810a19618a4c0385301207ccc1085c94c025acac586a49c90acb8c0fe8a787ddfaf77137fbfddc7d7252c7493ccfef7152ecf93f4e82d5245a39097c7e588c87cebff99ddd9dde9ddf9dae3befbcd13b937c7ebe9c9c14fefc0ae3a4eee7f78909bfefc702f9d820a11db2211eb31e3e20f8c145f6878be48716c8060971917c98ddc145f2ab95d9211e5c24df6567b6870f2e82808b7e70513847e8a325046f70ef7c6e3e746df5d33365403f3d56640f40a1191158055cffd9e38621c82008be3b7844d63e6ce3e9b072b281067707ef6024215c936f346b42180909c968225da6f20682408420d8b91e04c5255cc27ea3b9c112ab1c6067c8807e7abeef6fb0ef6f3c975fc9f79c844e9077f0e922f2db0235e9a16fc810280c7f5ad18822b04cb907082491be9f3d74a875228f1c4ff4ef867bcfa7dff7cdceeb3a6f4eb71fd0f7c942300462d9114a248df6830c30743a5dd7d3764f2783a083a1ac7560083e4f36e19ca1ec3c91e6855606e8b5e7303dd91e967a267c61044366c92c999925b364e6efe9f1f1f9f9010262212166e6f7616666c92c9965b62b0b7213e4e60aefce095f96b649abc08856011f3d61da74226936224fe4d195bec2e16433f7a4311294ae4d6f9c6d2d1c15a564b9137410fcc0cfddfd7ae715d40ae378c3f7e5ba9e573d8f525707e5d2939dfce4d7e5acec48a4be0265cf798393389136f4ec2b27b0cec2ae14abb4b4aa566b85a083134b6ba2f181adf9665e4d2bf06fd3ca65acca772b086a69b95c1de875567ee12227a943c3d045dac0a38cc2418eb9f3a5d60eac500d23358e6bf3d34469219bbaa184e2ee88229c5ef0d1f7f367183c31506792c1488d9bb54e72a58b4c99a881099b6df9ba6ed7755d57ab7ce224d95ab62f5b29054b279836ff4a27e9ac2e327f5291c4c69dbce5e562d157f24a369cc6126d17e1f7b7bee24ec6401cce09c411e1fe65681cae03c12f8cf5f490c964412ebfd86f8f6060da1ce2a32b9236e9874a12063e4ac2b4f936499b4fc5bebaca5aea22f33bf1939fccc9237927903b5f5ec934241288c5664a4581bbb2ea4e09e7ce29dddcf99fd7754f9ba58c755d8fd2446aad247cd44eb491b469158b6959595ddd97e5d13949def93fd2ba6e8f9ab07b29a5c4698562ccb0e6b66d20b8288876828fca740f4c9bdf4e5dc79d6dc4937438a14c82651a4e5ac349f226739cd473e7576935919eb8487e895ae2f670e7d49a35d87d59394eaab0b55aab2b623271678e8be6b3010317c544ea37e600e74f2d31c29bcce5e60cf3ebb84eebce032ef4c8c3febeaf6777cb29a79c5e85334ff7e979288fe6f7ed5726692e0508ca99c691c031c8e5a90e7820ce9bb0839801e68d335371d87ce1431d5f48b065482e6808301b000347ca0d38fe812b26cd89ef14bc9812238e1c3b5e9cb1f3459d26a82b78b89ac30cac2b92703a6850307903079c115b561c78c2ebd47e38a18a34e83c3103163f40f91cb20f813a1abaaeebba2ba400e38501e99b31a8cc5c5dd7652a33767290800b194d703953070b0d0c31856f8121c7240386902cd8042142881c5f1c088c1a0f12c82185a03d5138b2b429734689ab37ee8120564c2068524b1a566feea06163ab8c91d11b2a36535084e0652a3650c83ca1cb546cd0b02923ed0ce94172d18137f241f9619b3754312e6f5c5bc891f2b6bc19837e3d2e538959e2d2cb5462d208d1c1853b45a46933831923d6c861f485c75185c5962f6e8ce12285865167bbec4ebb42cb04be2d5f842133a9c4784165460dd7130d5da6d222cc7d5da6d202897b7ba32e0ca3967d6c847e792a8e5518278b2f0edbcae16a035dd6b0628d71d28983c5957d5371a6be08c3e9727dd3f5bee9d20f7ceec1e3846f078931263227c021ecdb5dec56e13bb7fb5825e2c19e4c97074d2d806fe5bb9ee73df1264d37d9c47bffe941d3ad12abdd7f6114c19dc738893b30dbdd93bedb2332a4e63fad4c3e99dfc4e7ac83babcce05ba3b0cfcacf5afeb5ca0f884ef5cff2a3ca5bb4feb60cba9efbf8f69a44d63bf27ce963cef9bc6177fb5209bf0065e998f2542975113e1105c1c2da5a858d162bab245e3d0927ac24a85b3a54fc9c927ce48e0d1d634468d4c3d766ed6feb6992e428544514d59dd7e6e28cf93603a2bd75abdb50667e6de9a4e63cdb937994576612c293d89bcac89227a0a2594952c2325a3726fa454d59a36b989c4e3d8df663a89ac52a68bf4f3982ed233694796813374fb659544aa61f5d41c3797cdcdb1e6c471a9141d32edb3c7749996c2658143ceed3702967ca8040c1d28a95388460000002011400083160000200c0a070422911c04e248177d0714000f65783a64523215082391381848510c84530c432110c22086102619320ca2191b5000fe119b2f79ec20e98583a718e11691fa39be5f84663d1e7d5568c5c2e90c46c61fc91f537bfc407132d6e8571cb37ea078d81a85a8fe08d532b182b5998d69013d9c71789771c5122b9c17527f21b526f5b4e6b465ac4ddf395a537c3198b9296b86b57126b6c05b3df56f9fd74c84817f9900714e928259802658f5a4ff6f9541ad2b84f154e13037523a695e9f2754a5deec90a13f335a901a3be75bd0f54a724f810c69536d4d04212658b9171312f131e35024d4432e96ee8ad01704a843c4b94703ab55e0588fa1e8a38756627c2b9605bb7c5a310961b7cc6c6e78494891b7c06226f1df093469c07ccec0b16e634ce30f42f44c659e1ddcde70e4e3946f8b495d6ca37752f85236b222e838da1db0239b2390acde82ba8f431446d84acb558c7d2889d50fa64209075818a604537fd45d2ebd4fb748845fe54049309847ada679d79a6003ddfe933419ef93dae1aa41667381343252e3fb92ce76e1491e6b7bacc8b7393f999f6259c70412ffe03d4f3515225a586a51d6feedcf6c36189bee722c5839181998b5a1102b6e411e603f7f0e7af2cdada2827c62e90268448bf44887012665473272323d353ad65e207044bff3b76984da6a5584a625ec990dad613f477212189e01be8c37d06c80662b6d2ae4e82c990bd296c850da2f6ebd3ee6b3229660410843389ce78222091d201fcbce0ae0a4e77d2e330c15cbf9babef1e4c62485c2818e097c08ae0b90b40c5a02d552c262f557b55b37ad1f6289b77dcc81ec3d8c4dabfe0870de6b9757b0a7cf1ad492d8001ea9ce71494afe960758a8ec0a4d180334b21db9e049b1be4dac63e01bac7ad1c96e2154ca89d4d63d0775dad7ea88266ddd9921ff03235860c870cf35dc2553f666e9f5a1a359c544021f178fb55e4fb2af9a357fb5049bfd32d771df33cf334f0fed50f2e765404037058271620e6312754c01d375a736cb9e2d193ea3fb8e1776a82a5f2f9bc248828593022cb73661060810d2b1ed123fe001af3340a59303ba729ce3c9ca6ae97c74964e9d87fbcdeedaf805999ba5a38d6a3507d9a0d81f747e7a67b1cb4309e6bd7709f4b39176940d24ef7bb9c43cc8c240fcab1be31190c652caecbd84b3ef5f8c071c7f4338422e878481383f05dc987019d0232ac0856628df9a39c756dfa50b696367b4da19a9c14636c2d64af06ef86828383b3810c10601af19e6e9e9a52e632edd6502a897339fe73e4ff7f794598e517d9a8980d3bbf67959b26054563f2c0a90fd2e6caba6eeac97811db36c4df002c306c30c50868753b90adf445a62d87c71b5df90056e6506f3fa22b9642237c7920c04f2ad66a1dd70e87efc0e440b2b37748938e61686ebcf81f62ec716c6a449420785d09109fcab8211d1932523a47fb19207ff60e606f1f0ab329a71b13a23da45c5472f9a860dc1320e71daa154cae3e1ed0c26f0cb99c080e91e746fa3f99c4781d35c713a4b8270a16b712e3424e1e4ac969caf2951c96bac26d3189f5db3db9b95d41d4b0d9c465954e5a5a369035256e239b3153a57238a030dd19885b3501f60d45fa02b4cf21e2c4079808dbb9515fd47f4894987c633d1ad70c06862f42decc13071533f2c63a1c685854cfd38493f6bc9e5349b871eedb7e815f5e1520a3f31f6edce2280bc18f5922a8a170b152a5624664c55f1bd2a8c718590d154b03d03371f2f34837e1a926e954fb68cdeddc55ad52aea3d67062c13655f44d7978a1483347967030a30163b86a010ec9a4da939b3b4cf66d5ccd293de65caf3be3f1e2343a37fe7fdf05125815cac8b55ce2a431633010d481c5df059d2be3de0718ec276d215b6321612428f87c7c4617cf6b56222519974dfbee97734e52b1a3890401833e45f2f9fe06046cf8b81ddf2be892545fb65119d7887e95a257dc4ea2640d781c59ffa767c1e10be6fe4da8f33798c84612ffcfe3548d501d4bf576bbdefdbf43fe1f77dd4c718c8f755b895c6365ed1dbad8381a20db3ce8325f4787dae2bd8298b08eeeb50c4b25ad4e44e2d97f771f81680b6ff3c468f26eb627d0fba81bf34dff129a0facfccf1b71d8bf35acc5a75775c4a98692999208fb8f27e6ac4337016a171b90f9466e4f8e9ff72e6f9e3907eb2f29c5b817f8c01a5e11bfd238ffda9aaf282e86f70e87f6e79fb036d285b5403785e019e3e9f019ece2a6c0e59f8bb2016025be3ee1e29940560bead25b3b381d3919cdd91103a32f03a6a3546e8bcd9115f960cbfe89ac14a099df3f3e7f5f3a005f4808a3d26d2c1cdb5f0fe3a6122687a55a1293b2d72b80ba563dd0b9bbd481d32572cff070b09c5adb6e4aa242db23c49688e19cf0c895b090a37c160276410ed5723ad5afa835b9f3d1eb8a3df8691871fe4795b9968dbbb4decd698d8726e398ddb84634e415354c3b88d2d3459d23bf03de538685e1807535aaf341b2fb70919a90adfd36d82e1a88a089da0996d824e814511a080054bb6b2d4ac78215e90654433bbb1b1fe4ee9c2064ade943968e0d4cb630296560a2c4fca83eab3560828230277eac1d61224ac55eee676f298149e6772b53266bf0d6b47359bd004df6a2c534fccafec66bb18a65988d6ac84f566e2a40121162c11310c0cdfdd645f69d3c7701947a82116e12a8a94ffb363bf0e9b30fef63c3acdd4615e567fc8c6939fd8e3950f0fcb341080306317c8d97d6a716da352a5de4ff3794eaac4a0343a42fd5db26c349bcd80bd0124260d57952ddad545980fea828cc28f0265267960d8f89ae3bcde8151e1812e8c5510a2c4fd21aecd6e6dd6234482f83a5c1c0cd7ba0f6d7a506b8a4ce3a609b4628c9e8a2383943995df99fef146ce42a104db1061e4677dcda006328ee7bc2771d29ece5f8971c56300fdf1d3242868c845974b551ff2151a8cb280f0cc2075b8dc2d8a5806c370d115a20a9c546f3e9d998b7c90fe3306f558c6454d207ae51b0a514e579f05553c259a83217f068c3997434c6a307195a4ec17f5dcf04f137ce10297df7114f4bfbea3baf0b8f25042b84670a94d90bce6dafec1318c481d7d25e4b155181af2aab2b8ffb1f4551544d5fa5e16c8141d30cb5fb5a9dd00fab5f9bb37bc658009b62bdc7b0bfaf34b4a4e8fe239ead0968fab92a73050ab64d521b0e0a4656ec944bb35138a1a3e33f369f70980feb26c69a124c407824ebc035965d114ef6258d81175d3ba17756db5d69e5a0b427f039c7640f8541b8e12123d012837a8ad7e6955bc2bc56bc5826a4538bdbeb66114e104cdb134b3e0e15d7f58978b85f5c5d556515b54b7f52c67b338e3ae502e93c3257c0babe0b1ddd8e2bf86fe995403c4d8de3a876b92a8821afe47f812138cf3252ec9be34b3e0a6e07f48f6d1b881316c97b81dab215dacac75b80e40552c586dd1f2ef997adccf62932415d645de4ae27ee25beddad8a34e707de5948c2d559fd4b974a0644da4b64b54da45f6288aac52d9704c38cd364e5a46a25252cba012a1c8c4fae605165e241df31d11be60f7f0d71e3c981f2298dde1ae60495fb5b2165a7580d8f3b32f35a587e4034709081a38ce88be45f34b31dd85232b2b3059b10b22f9c2c50468882d0ae025615cc473d4a14a61076380000701b35e8285fa602dea80850502bef6ae6535645d258bae7d3e269941d8126a813bd24bac76d018d041a6b7258413a49f6b8a6c3611da3c7547a575a2825942539373cf188d96a5e0852e9db4acf01b52c2c29ced8f9f71bd360416c4fdfa9d4b3c152d0fb220e2b12f1bc376a197a4093fd558d2adc3e839fd6050f637276a83d7758df9a3b784cf2492ed6b2eea56d769ecf287db1c2e9a0f453c65c746985501fd6ce3498275c2bd57d2aa3ed12517af954593c6169b794c812c29515866aa7465b4569bdf04a80da439d6e9f6ba7a21edaf63a7130b0474ad4a822d850f8d1553549038f049aec7ad9245b456e8abf8c9eed2c716794a016348594e0fd48f3bbfcfe84bf82f65e1503cecb947d8cc1654278ffa7237b67d4aa97853d04bc9a736629e693d794f6e43711d02220c05c2dcd5fafa8640181540f2f49453ce9419b8dee6cfa512466834ee9e7bb937d3102a504ea62803561aa2084f4ce4ce52010c1a6ccca3b54f5015773f530ea1537f5060370584242c1d845e41a20c709e905e87bde3b6935e3b32c46a951ae533ec7a01a1e2873ab8550d5801471ed35795dced4aaa8c1c312a83251d4a84f276d6a94b9aae182e0b7ea72b184eddd286488663154d12e1697b806e8b8a90ea150c392164183e32afc05733ed8292420c87173ce394774ecd0b032405bdb7abe30529106f868e3a146836661cf7615241912fd2b9f5bfa5c1852cb3aaee8b87023f1555d2832d6db526a460982282923be9d598603f25cf6acb03a71b0d9387f1d655a223b3c47261a677d1808fff37cfb8ff39e7734d73ac7a073a90060cf4447920822c10f4e11f196de8277df9d4e20e761508747cf8d63e62461a431135d9fc4f2770f54674b64a7b003c8bab13812d367173c5d96d8395aab241f10efa96109f9d3cf674dc3474556c461dac57f00cdce6678bc99d842ceea7fb5dc89a35e9a0570ff5d9c91d7b64213f6dc672c1656100a7b3223516add60839287c3e6946b40535ae799aaf0df1a5d88dd611a8e4f5684458be52b6e15917d98e8cd1eccc47ba0cba9f1972d348dfb07c5fe0646e88685b68868bfbf3dc36b261c560ff497e5ddc71ba757a1d060dd0d3e9d8b3c9bbfbf354c460cb8c33d1571b47f97c1de8a959e53f3410a8836d7de7b6d3ddc6aee4d57c1df53fac4ba00de3bbd88ebdd9909f36636db9ec74b7f90abb9935e7296dc51834185b663a0cedf69ad03d0540a951c639bff9f224b25f876a4cb6a7964acab129a6853a2b54eb72897925b5844f589a897fafa40238d3708ab591f467fa2b952bc0e56f31b07efa71851e80e2b47ba2ad49a63265faf344b014756878b8f5fc3c91c0a09954687a2d7896c4eef4bd18951a43253d6cd1dc3ddc8a0c764afa8b65a00087fe415b70926a3a995b113ade89b8a59aaa42fbab28302538926a648caaafff58e306434092d04c233c7ebe0e789a0f1d6d9eae46dd8a6325f383d36e48ef4a6131a4fa204ccefaab8b87d7bb1c91ea08ae86229f364a39b68a58729e0ff2d352393412a547b192f4a14cb6668ae8f380e12d19325182a15add83bab2099e09f3e2dd5275f26c8bda0baa5a28b81721463728ef7cf2c90101d540b12c276948413f0474905d5e7206a8215c8d8e559865a082bbadf0d2bb8500fcba31f8d5139548bff03045de92c42236892de493e813caccb82980b031dfde3ae48ef6bc49c5c6332468f4b2105689c55132e645c9c88ea186d809a54b5742d11c32ae7fc6a0d3038ed887ab7be650817ca585c100af89aa50e25fdd3b7765e7cdde70ff32ed3c32330504e7cf6f983f369018d24fe3f7013cef17c845e5d8dacfa9ba812a72b5d9a0fbe3d9a5d47bcbf67b43d2065587e33508108bd4c53a00046b63ba709e6ecaa32afe5b6c87e03aec259f716a45406bfe56adc8f5e329f1a4b80701c4e9f6ac2a881d6dc126891634a0b77ddc18f214b347d6c692916b5dfbc8414e7c64399628e65162618b1e88169e013c8815d6ba21f9790854513cbe568f00ae14ec9bfa2442ceca8c6ad5c8824ace7f569bdcf5f2abe63745ab65149bc3fbe6c0b5785c116ef208ef017d02f5aff1636cecaa05e09e5bb522e0dbe0d1ed924dcbd121262bc9ad2a6a8748165ba15c542cbea0d5fe81d826c4d536879d1f5fe8584108012736c235bdf7927a704d5bb62d9d947a81058701ae58433890a51cf8e217fc312e5b169ded94efe6b6481aae83cd820cba68c406d27f90f8891cf5c13594748a56c67e26d5fde3d11f37910e98890daa9d4306f84d6c0e983429a0a2f5819c677b2e65b0c472a7778341b25f7f42443d38e0736f00be78c809c5e7c8ef3de915ad25268be88e178ae67bb5da915005260b9c24daaa28b84b517ca3a55d0cba7e0b3c546451c25141474f0aecfc3d10c0b37087c20f050ef77ea44268241aefcbbed82ed3d95871d01df3ac4ac58122415b720ca3115305c31c708ee8df707fa8422a20e721eb102814b232586ed9b606b307e9beb259e7f1aee62038e737fe2b99697c188aa42a7620bbe2fb6c04501a51b233698b5e5f515f191774ec0e9c028ccf5562ee5c4a4fa0f64fa85c186e9867beadd179e8124f63f7b85212459b236622de6454180ac475b59109057721a0826b8d51adaf8866fc028aff5616480418e4ed45694462b7eb5e963666ca921b3e5418354a3bd6ea488282b83b5826c9bdd8e2848176d789afd4f7e62b9fd17e2375203e3fd26366b70fca43bacac9b7d0560c57d5fb5fa7314162be7fb4ec70386974d8e037d22f7fa70e2a7df0b885d1e9a9233508e3012c0d230dae0d2baceaa3be857f4576969d40e57daf6240f54d9f37bdbab66bed2300e6574b711c8b703c6856961c039da44a855cddd5c8e8a7bffc5deddf1c7523400ecca6bfb749aa214f524530011cc91e4422f1e8584c75967d9ef5b8f416ef16af03942ada14299c3d4d70a59bcb40b460a92ad0b239513e7d48f4ebd974a4e5479d1eeb4178d41ee417c1d011242c4e17eacd8249955a4aa9f7540bc5b8e430fa8d8974bd850cd48171e1f5024996bebff4f338f0a024d13262ab3fe56807bfa9d4d5979a5f0b42ab3b04d4f19c474e80cf1fb2e8d9e612723babb57e66d6a326a0db6a6e18b48351d6fa394a71ca174aab190c94ae5d589f04c8f2d9a12b18f53150f2899e89ccb27ff91ddce3345afded292707144e392b581e4849ed43bfc051babf6463d175bc994434edaf9c6789fb9850028b8d74f431a033c8e6763268b4027f1c9108f6f218414ae1e1b1b762841fb748891b8adb421803f11c2bdb12c6a0d42e5d5de84396f6cf6d407092c3bf5c406b1bc1cecd31dd990da0f075eca171d3f0ada99d16145efc1e7da565301de1ed10a915d77e2ac5efe45430a240046b0145f58b75ccb4d98960109ad9263cfbdb598f08694c1011ac47e0fe1290b203faef9bab3fe1f9f82f6461ae1304f4bdaf6e6f949130f250fa0123b910dee0e62d0d3e0dc91a2cbae33d0efcf4c053d16d1233bc2091764ca7b85f29e8e14d2747d8564829f99310d28009c8836e39e3af0ce757ce1bf85c7238f822f29137dbcc37d3f0342207516ba79c607eb919e97a013257772e171eb84da9212a364dd1bf54d7d4e106c0c0be94eed395d5aa682a1f8b8b3421c6b59bfbf11b8bc8536d05bd80da44fd002548db3d605608e0bd664241cf19744d676dc5125effb00810ef332c47d0cb9484fd46715e40f9eb6817686a3084a3a40070ef204b109a11b326294815931e4c86c9ffaf6d0a314788d92c93b3bfca1a1e1733270a194cd274a336678e8833e0bc51b77e792cf4c0e9dc5cf643f2f5d03a93b9dc4025ef80f9443763b77f8ca09c5c5d2380f3f05d29c8c0df2d5a6e49ca33613865edc8527eaed125f0af8cd92d5c0556385ee6ee189796afb64d8190dc57d4f4b8b5f93dfe4d7c07231967daf15e21827c85cac6a977058356ecce0d1cd92f60b0700bac30df9b560702215826dd6d86f07270bdccfd475a912f6e0ec02a5935dfefb1138efd8a745008b223b1886fc8015d5718d48b860db05955b1074d92bafe5823d51344650853d86f4ff773c46aab645fae90714743de5361d050e21d11f9c4a5509ef60eabb162a204d1fb1243bfabd86b7ea3a1da566e56ae370b83acbed768aed29b3b18a45d1a87e23fcf0c550dbd663f581f34b0fd8c8c6e296c0ead83186c62840143cfb76bf7d3f2a70b7cf35b61311760ca9bd6311befacd0281ea17d8a0a6aedccf4d9255c4f529685987d37918fb2e5504d174c4ab5ed72a75d7e4a2d60677214b58f653f960525addcd7a4eb9603793e4305f5cbf7bf91e8b57e498a70834cfde331112142f6e9e51101fae817b11ae2584a8f8aa06213fb39b55027257e7c801c87fee64ba66701d1cef47e7840ece7d085265252be04958ecefe3dce6e3c29c0147d778536f985b43f85f163575d5e2b783386b5e0aea373ad7d5e83c5202e9562ef0a4de9107aa50f164eacba26e784292ea16198d270a14ed60506af0566f77b3cbb48a4f75689ec8861823376d0f7873af70016988a536dec84c6533fa55ef49e277c01b5982332113856c41fb8cba8b2817ea879a3d2f34aafcf73255dcac858771cd324fe60458d3e60f29dccdac5c9a0753a2f7a60238f6bd422853cb438690c929191a91a85529bf1992bf750c630517988ef7400ab85d6d35119be8259496369008aaa0a8af84db509b1c38abdc6d813bfba97c3f62237dc27d85030c719cce17a9fe97eea3e0a3824c159450c19dab45b7a648ebafc68328c6ac55149e703da4d0bad530f4ba28ce731296b5182553000642a9bac31709a7e39f3580e94fecafee734d05d04e2982173771a08f99ddd85506839e176ab380135759333bd4fdbb9ecccfcb4a15d5aca3ded4ee24cc6d3362e39ff3a6d688796644ebb9238a3e0b48dcbceb04d1bda2d2366d3964d99b4f4e4ed42e0554a73bb584008c9ec0a8610080903287e10718edbe0c30e7e045be3af47a372784dfba8f18ac8f5ab2491b254386530108451d5902513953d47bdc9bbed179cc8e0f0b93fef2a6ff01183a8691e15096efba1fd99295c12ef159145b4420cad3f90943d4b5aa76a425496a63f05041667c8d9a59e89d50b24ccd53d85d4c6fbc03fe4575584f00aef5b9ca2362312ef0a3858e5a32d9d23bc5971596cdf3864e1c5fcd43d2fdff24eb2b3b63fe861cc75f2240de001c5ca56e1321ca4e467f3c2197100ab2592dcdb213e71cb2a0d177842ff98c70ad309d398573abf47994866c8007b79d2fbc1dd24da88b7d24ce411dc6a516bf169c8103d6429ebe638fd4cd24905bae87a8c3d743dc87d753ec43e5d1e635f1d1f739faec7b04ff783b85fc763eca1e321f7aafb31f6e9f210fb75fb98fb743d847dba1fe2de3a1e631f1d8fb9a7ae8fb14797c7d8afeb63eea1e321ecd1f918f7eab21f232b13018c0ff4d0eb1bd5488fd614f64951d4babec83d3f222295dd63765f9518d14ec01105716d40ace3659687e27f6b6aea84a772aac0727bec47100faecf492ea65d926ed5d5d34ed6a6db3c7d1035a16591f08f09cedf0abad4fcaf5086b546781f4dbd3278d4fcde8f531596b3b992efc5a7113a7369a14bdb26a8f1080b1e13a7e803776389eb96edb7a8d40177bc3be0f28bf2a64bb690ae190fba85b10021f482bfbb1c7d1e955c6cd6ee17caeb2e8b397c6e45c76cf8528db8f74cbde4d551cb164c9c1eba3d480f7058fc597998bdcc36f5b5f1f04a179d2a70f1edae5dcf3dd3bea8c0868f66d3e7be57de0ac46f77715ef7cd07d4c5a3c988b398862534689d06408389a270b6369a66a5378745b9f2aa86fcb9c6db3b3eed580dc6552f875da3ed11740af332fffbe3fe7098a4f219cb45c93561d1fea806100b8dcc67ba65413e3b905b9899ffa7e3eb495d46ce782831787da586aa8c3b5cc5bf58b77ddff7d039818060df2198e9858cd961199b31124b978dcf4f11589bf4a3888301a14e342ca4bbd5e6b89611b5c353753fc7ae0c413d416477c31805bc64138fb9247c8502644c0224b99c80fdea37828e1253b892658b9591fe010fed1f42e8a28b7ac14301b45b7d7e246cf046cd92c6084827360b411402a22547a78ea63a80962b2fc60c69c3391d7c0b2429b534e48206b9f2581d805544da231ba2a4d9f702a23627c70210f08e0af8dc9214ae9063c5afa96249cd14f94fcbe6325049f256da42e24c9220fb7be600219ee5c06c7ee57f59463b657e9bd50cb1cfdab457ce9eb3cc12995a887d5980bc65c1ac51f99810909ce80ae88e04da59d6476b8a644bab221aa502734575203b12c05e791f6d33322dac0ac1140b981b5581ec8800fbe5f5e00dc869655544575a682e7405304702ed2deb83352045ab7513ad7201b9d04ba01d0b69b7bc8ed600292dd795e80a85e48056817e50a8bdf23a9a2624b6b86a82291422075a07da4321f6cacac19a23b3e5ba88a6a490dc2835d0e3802d6459650171444955fa3a7d1615d18eac89c0f4447185740ade65d4e17a8c4c2ff015ca101846e8a6819660be959e65af6038f59e7f1b01ac2ce956fdd8ea06471127a6a88b80edcdda7bbef0027f71ebb0925024c4dbaad36cba3b58df4f1dcb06cb06c2b15063d00a0e8403cb450380767aebe024c6ab4735241ed1e28059b191ef07077961cc4c64c9f79389b8103023b0e6fbcb212b08981735f3fd71909503990bac5c7e58c49623662246fe7f7964a50033b131f71f0e9942cca8a895eb0f87bc34664860c8f5cb455c123122b273fde5212b88988bdaf97e701095838c05a67cfe78648b11732256fe9f3cb2420823b135f71f839452c8acd8caf78781b830642432e4f5cf445e0a1811b373fde79095440c8b9af97e18888aa3cc45562ebf49b42937212762e4ff9747560a30131b73ffe19029c48c8a5ab9fe70c84b638604865cbf5cc4251123223bd75f1eb28288f9132767dd46b245882d72780e6efd77aad265eedb4b84e8dda55723b69d2280c62ef2fab0e90942f5fa2557039b7e24a8c62d71f158ec2d0274dcd2ab8f854e2040eb2ebc7258e83501b5de920b876d6f13a2e12cb89e58761221747ec9cbc34e4f11aae9975c2c58f42b813ab384abc566bf08d131165e5c2c7a81107a73e9d560a1af09a8774bae1c167b35b1349fe414cff74d81cc5ed8c9b94cd2f00a3a4efecc826e73f4b7dcd74007c30dc37521bb78fc429fa85e2f633221b82062d220578d080a74e9963b505627145cd330a94ac03ae50f81a5bb055c3cc7f0b5c399ad7d31c3518ea81363acd0ed1e6b43403afc3caae17c382a1f4ea7127f8c7c2a6de48e7f54e9e96341feebf8a60ea3573054867aa4f0838be382b17bbaa49258a856e19b386677426b161529f0c858dd04997d417a6d471caf11dc094e0e72d8f18dc4f5e67a3449ecfbf89cc04939b7397ae1565534992f018fa675bacaa3d3d2102954e6eeee8a6f6b21f9a4738aee0c796ce9bf98727e73ffc772758621db8d34bc8db42bbda0567ace869a44dc142b048c7ee9a8bb6834880fc80796165d6822176e2acc124224701275b491160458d4917ba6ff1137ef0cab2a2bc6d013b84e7e1e29c3163c961da8921edd5784d84a0f9efa0432db155379f1266fbadb50cb7e0e083f878aed2f9b14cc17c782585087ad4d33457711e1729f6084f1887d42fd4644d6a7ec756a363654d63c8ecd94676ce0e4bd1067169fa6fab643d27d224cdef44a908f2715c3ebbe35adc470a532f021433382ccf21f2968b384f46825ef81aaa80c2d3339b5efbf6b44ccb07a596eb14670e09adfe230569e9b5a8d16b1b8357d966c8ca6dfdf7baaab977e4397553c99d4c5650c0c6f1ba113e1723ec0853073d33113d9e97cae7e9b6e11d093bf854f3f6391702bb13ed261bd4bb968eb0a9b736cfc69b186dd11f2d60d349226e25112ec0d278f5bdcebfedc39492420eb69c221d67ae5c5bc2ec8de209df94549534b745f9531d56441e1926e3709cf2e87dd61356f6a6027539e119df563d19f63a28ba7af9e9ec79e3ecda97d00bb694adaa66a9f55ec31705632f84ca7c7d07dc6075e7754df867dafb4e8b095372e3c6db295cab859bda9df10201f79f6120107b8adc98be26969ffeb21611dfd7e7794a884ba5c9fc7fa3c75734a6104cfb910fe75c748e1fb1e59569a5267d9e96f054bb3cbab20b38882825bde1df1f4f62d6f61710444c18716487014c517a058f70fefe79e0be48034f5524de6989b7d50b7b65457bde92ff58026f60c18a9cd8c3a11390f64eaca5db8f721d5e137403cd7adb664bf5833941d4e73023ec694802400d29c5603c065d92ba5176ec2eceeca28c5c4265f84007eac27c14eb80a1d4acf4bca5e6cb240b16510cec5a468e64b4f7b7cbca46b7656195eb83658d7b25f7f179e6122c3fcf88ded36270086c9e67c47caf7c66c96e84799d51f25747716da79bb600eef7539d6c8fc9bcf4ea7c8d40c7a06b40d20390144f8f8f54b65f1306b07341e2b935b88592092318267b14509eebb573b5bb439a0cff63a25feae606a0096c4761b67a0cc28dc5d77043b944e5aa279045c217a39c17f93e0b6eb2481ca89c2e5c2b9794690fe9a8e821ed412200eb7684de10e8fc44de51706fdfd8a75b326ba1b32c53e083709700719baf45b5f30a653bfb002002cf8b21310db1773bc429442bee053a8a2dcf438768002021315fe01d43c7b50f26d4ada50a2e5d066ba12e27712f076df2f15685955586f194189b8c005c5a22e0eaf5a114677c1052c12b9c9d752666d3b99418d5ed2972214a32eb4991308974b6e11085db7873389a8598a6bb5d72bd447fee13dceeaa09a8a96a51326abb4d9e9c608217e9e9b8e2c6915c2445f4df18f6b43452faa6b3d77596e34caa3cf92ae04fbfc0227c91e9c087611612e5541b93943b1d3cac13819d66aa9b0130b8a7c55b2bced8f63134cb6076c2443a918f5dbd52f16b1958410250f56b4a0639b2e7ff484ebbf8f41d76058c20f76d70a1469d3165c51da10067bcf77c485ced737cb06d4f94d8eac408d2235c2ad2cdd3f4526fb7cf44d6a0090ed7bfca0319af4b2144ba13806a764a4e1fe907bb8193a4b4e1cfb13e0c5b85013683ddc08bac6748345c19d04a1d515e11d55e39d4b6f0b79e6077f73823bd2a506e076b73a60728409d622d6b775db016fbfb6fbe56ea58e550a825323d8b552dce3e70657add147d15b1fd00159a2967242fefa37d8022d17a0112e373a3201fc1dd32cca4edd3dd9dd8eb20037d12545596dc1818bbf09b676abcc273ca9b8a08d7761a8515add6582f9c7249f8a3145a461ec83d8ea4aec5adbb7035d8e66e8e619e20b379d7ae071d4838234b7362f981f389dc18afb8299f4ccd6b4c5f308149f2fcd89e888f64d6bd44adad62f3c7a5eac3ace4a7521248976edcb06a44083741105aff0f7c2a6fa71f3dea9287372a81f17e29991e3bfde777668a19ec16648c4fb21c21853aca3c045f3ede91acf102aaabcfff8c6a8ad62c1e612f9e741c102f8ebf1c02ad66fc5af60902877f279094e312954adc70c1ef7d12b855c2333d14c68732ab73a8c93e00c94565b1e755ccf4113c88e8d47c432f6006c326d8359a3093b6ebeb9512414233e72f400a1934174c2d82b1cbb4df7cc3315e84a12b50de71b60605ba6ff780859cd2fe063eb05afcb6e383537566752976787a58db6be0eb88d1884912e51950740c1bdc948cdc01bc7da5a585398132b9dbccc96ecad097c85656481f4042b28b8cbb2013d07064bc1199c3f74968034c15a14781f8086f0df43389122ab3ece51ae1b83874d59c99802d05b34d4fd06e9ad58cbf487a4e78d23d6ed0b4427e1ff0f47c2247cb90eca4688ccc5629b10dc830dc255a72dd65c0f40a508b24deb0e5008183dc1061ca6d06408b30208cc00e0bb5978aa5ef7adb862434e8f2d5fe71aa0a57063f4333408ec128244d7c05d253c78de38249c12bec676f1ed2aa71e350178565646338fbe1e155fe52679d282a68e05be44483e463701174012fcce3af8e56e49b4697ffa7df43feb06ee718a7d6e1615169634f3b109599fd70fe49dc9d55215585d637297b086ca92faebf359e77dea47703bbecb70a607f44332795f64e5c267f33db1e44420ec4703d661692d9b6e88d0e4f4ab55d9c0631885b1f44f36a2be002ffc01c89524ce544486aa82e15ac9884a7ef6ce2e5640d3bd334eac12905426b2b771418a99d924c55859504643e828a40d69de91d013a2d62c61fd5a958ee518aba792ffe79813305fab11fe67f9cd2250efaeddd98264b3064ab3db1873b13a0d124fb6a171b504f9b624cac3c6082ade878d6632a4f07950cd4ba95366c1bd42bf96ffd2d1b56b5483c140c0187a37edb84df314d538f61d0b4433a04b174b8390f5b641b25aa159e81835f8832ab19d3e679fc4914938ab897158bc2e2b309112ce6f69a542c36bf861df3c06ebdc296a5189fc2dc2eb5748110a7e749a4622e8018020d22aeac517a42912d56471d784d669a7c4386cf52d072fe5113700806d77b59cb2089786d9439212740acc868e6f7a02fe30c8f6ebe06bf52fa5328503819945d970a0f970e4355dbd9464a31f90a689e7cb3c7c3435ab31656d667077cc1060f53a6aae3a6d2a767cd050bd367b101b0041ad2fe2bb23f76944051e6df5a0c49a329167b4728f7ac7ab2f0386e825b3381c4ac68048d0410f03c65b004cd2b8395cc66472fd3513a05913f8e3ad944c8d45fc5ab1d12fc6b94c6ee8234cb56ea083fd6e7142793418a253a032874bc0a2efbd0753e6345a4b53d95403c4d40a9ac3c034d539e661ed2ff06688789e6ac1b8e76a4a3af3b940cde3c5fcc5f41526002e6975a8123c3647b0e1475a5390bbfa7c6899056bccb9ea0695e38366003dc56a62c658b1b4d990cd95554f7b33c472aed4437dc505eda3487b4e57dc61f3d7e9dfac66715275fbb41a68f965a002f3c221442f3864d53cf10a1bf5318344b1decb3999b39e1c06a8738a439429f5d83f966573582f050754ca212366ddb19e5784ab41ce278c187a92bb2a24b2bef50dfd582f2624fa81ec1206bc7fa2cebe5f5b1b66b1a3c424dc7228d77ed211341f90d6a7932a5c5f0b1330eec3d2f1ebdc1d78e9f3f69c31f0b268bc545794a4a76b19df37ef42d987c74a19752915a78aa64fc5c016a683ae0ca14d1a4e6582ba079f862e9df0d5635283e04e7c839350b4c1c60978050ae78f13b08fdf37e155b36fc2cf5c7e5d72eaecf2c7573e56ada22f4fa491fcf05ec4f820ceb571cb817193dbc07ca75871439caf688fc846a10be9cc03620a1525b233e2282f2598dc616370626d4b537b7e9d43de831acecff895768e953f037fe2432ac3b1bfdfd55d2d476ee491ec11d6b6c7b8e9e5276b0cc7df4758636ec743d2abeeb797a8b46682a7a4c9a1d8e9393c1185e84ed1686f9e385ce4c0ed0ff7cb518917906229432f61dd48563cf3e3b94cad4487eb08b1758e3660e914b6f351479e57199c33b1bfe4b56248e89240455c245eaae2554a54de941bb958890d4af51c8986951950fcd12254d4ba78b5ee41c400327ec2eb37701c591987d91333942a980f327a70055954f220f4b826cc79c099550309816de8e3c814557d16a1a73f0f8e8139a2135f69f187f25cd5bdc971a912ed28d0af229bd207792310f7bc3a9732f70c187d0cc55ce5545ca726d53fc00a9f3aec619bfba0ec4b4852776d589cd315b43e07c13311258379308c11b975a438e38cc50a814edb18ecec3f8f33119ec7c0bcce20074ea60cc3750b05683cea2f486ee98eb26d17515525c3ed37cbb10a12411dd1566cf6eb8f3681a0e351b388dd8303ac60f8931fb3ca71f561e695113b976156e7e9dc11311c9c118734e5b92341199d10957bf496ad371c10fa947cb48fe2d6436828a5581dca2c7668a4afe42c3c1bb23fcb258ae3ec47ebb44ef07a73a6f4f24cb9289648162ea6b51bd85329006461e921428c310cde6125d914906222753416601d453c686078cc6a5237b78736811659927c43a2b245e5374f0a0788eb5d63541644471a390e4e62b27812b3e2b84f2f05b049b358b0546aa1c30d68854227a2343ee3293d8deaa9019047d9f5d50b172545d6e8000cbc29a6d1cde162c1f4b91429e394314a4a3f54fd87744ee82304bcdd1d55e0310c830602c74fc92e094a8b27fdea2b286b8b09ddd78a89012d66c01c6a84545727629ebd5cd96c950c8548ed4fa73981c7039064185e4f28f72fb60e115b93835df6938d8040194dc447dd971a76f5d1a85ccbfb05b2d60a38a8fb47f22d95821d1b53d82c79402b872db5984a55352a181ab3a5e38e45e8091fb015db034184637304b5eac0b1e9c0386be3cad265ca6c67d25209915c6bb0dddc0893cdddad9027c4178527ba705b8abe9a95a4138a84a7487e95651db272e7b8dc344966e58530362580f8061088174a6ebafb67646227f9a89ad0f82ab479fd8afcf063536e726451460561b635465adc3835a05cf612ea1e97e9f91fbf8be34d6b264de119ea7d1dafa4b3a76062c1643e22ec7ea17bb374a24a893d0018b73c1a0d42aa9721b42912532ec8fca885b59014935543f0149716dc72f86014e2bb74badceaa228d5537bf72b538a27e52bed4351a8a06ea638797869c25b065924344010b811eec5cd9f60455e81943189e473542b34d9cb2ffb05c5097dc2cca887be639ed42a2f8634f496d784d2020eca218bf249298b9a82f3e69355ca54a44b0ad3f4cae5eab74e4900ff7c8261c38be5d2d3e7a44b79512daf3acd599e7779522c0087711be71959aaa4ef741648cf059c60800bdb9b96001bca50c8d385a9b02cd46485c3958f5bc850d3491d61927b524424114be8660ee055559ee32c4a6e488c37272409b062c52059cfec17f6356ecdc22eed08112cd85772c0e469c1683b673d84eff8c8a82db8c3faec2e5c6b62726044c6a8deb90dae917dde4d0b93311a13ee12bd904f179c601b49e826b0070dde35039fbfce2d4976b4018a876641e1f348c50ced53db4216c4895dbc05ffbbb54cc74222b11514a533676ed04b2b50315eb5fb75c139c84e5301a0aa9f21666ced5b425a0008fbfe21a3b60957fb1779e379e8d00ee2a85a8dbc45422ab71def9b92a992bc638932ee17a85f0f425f3ffdebeb9fd607501f3d35233f9e40f1c6fea8c56491babf5a2a0f8c08d2f54a98eaeff37dd8fc574a9a60212bb74ee8c4650a9e8b7e14d2040becdddf171b23c5ba7189aebb14ea0d7bdc5496e316b2c74a9dbc235d0706bd92a2e0ea0bdf48c5e33ea053a9e283e4c67f94722cc757b392ae2123124f03c88a52a8dab26b38cbac4347e1f70a5ff08e892f397159e57cbdd15d86cdb918dae75630d32c6724bf9c2af8563dae3b8325dd138534984194867173e7d9e8b906ac9e97667cefea387ae4a997dda43f1afb857c220128fdd3f12bbaaeb7fe0d1bad7ceb4b532f1456ccd5d7af3b8d66a74706cfebe986c183f3ee77fc7e3730f487a51cd8770d4ce115ef8ab2156baa07912d3ea1822d6ba0c5be7777bbff161ec792de29f2940e10ca0ca162708978450a12f97c1c5f5a631841d3e05991e4dedb4eec91a8aa641ced9f0d01ca8c4f991b117541c19fb4e8c141d9c30f37c0378f03f10a26adb849eeb21a16e2c6576954490c41ab7a6363461e7396a5439d208e1b099c1f9850383a402f010eb8a8fa566df863af97f8301e8359466eafb6df57c36a0e3ff90f9b214b6d4ff2879eda8058e7b6b3ed7c88c636c7e588b0a72948fe10a84f23923d37f1c172e21f138f3d23e34391fe85bf90bd22742bcb86a7d20767d161acc8db632593d707745b7e38be07e745ddcd3ebcc1563b587f208930f5bfa0e641ca8939052eb71e6fd74be343818e68a311b680a058c6bc4af003fe3a21d5082b94a5b6bf4edcd6eef6de7ca35cdbc4bd7f88da7bd1efcac9c223e6ebaf08d17d883cff270c85c95b6060c6e66cc99f99e2f92ae58f5a9e798a8e6f3eeafb0c6a06f9f86c7c009d53c6585e1e8e9de8edcd4efd4128a7f046077e353afe90489ff612808368f4e0200f6334b8f38309d2a4df7541515a9d65e727e8acbfb85b02942e15c2578bfbccf676820298cb6901b4b7e03b8322fc15ab49a73f19d7361d84ae9a9947637aea0dd511ad61c1040d2297b8b0a9ea71c7803adecd828267e2ea43451b878d47578444b3faf416521de3205af9788d1bf64bc580e0b9c16c165608bc544e9b16e6a13225b4d8ea58f2425772497ccb8f8a8871de6d405fd746fc0b15af0dd4bf8042b8b07bc8c5e1a656456bd1646676fe0c560a6e067c5413a9459a88919765fd2dd0f58b50a48e958381130d881243bb127fceabea4fa5a112aa0fc5ed6bbfd638da931efb6a48e439191f010489cd32b0b31e6b4553b5a41471a85a90ed1355afa5b41c2dbd525bf1ff945dbfc3b205467a2b602fb65ebf4c09d254b2eb2ea694e2f3b5b239550db193ea969d62659e1a015f258e648189217544a0af6422b02f0e5db2a1af4aaef5c0287f9cca3ae03ddb46d3f402c52f36a4ad3675affcfa6bfff69b7689f181aca4acbb683e19facc9fee7ceb50e32536e9db29495a41c93e668ad33101dbf7cca098506f49db7c2e4f928212cef2ac534c7bf489166ba002ba738997489e770c76dc963667b8e5524e33039abb17a6bb6980a6948faa82fd97bf5cb25cd1004f3525ccefd5cb046f2396e3557c24e83e7e1c664042d3762bbfc3fb39778568fc67363696be9c8a01b580b35cb6be6b46ab4ac055f09de5ceaad881403b310c8d3d7104356d3cb109e1e141c1f75de703225d15801fa85784251b785996ca76f9884c5d5602ecb3568499fa1ce9b54dc7ec49f8482d41755fc20d89175a1b06d362265af4b2c3d07ea82c5657c6da0b660b37a66ebe6536dcd66297cc53f8d3fa6bff62fdadcbb21be3c3e63654eaa9a0e2b8977b80bdbcfe23cdf57ab952d2cb61635e5e445ebe31c9efbd1b6ae534ce7ed0e5043b13d9b6d1a09e8e81080624ba036aa12e8657205816a703f9819b4295991c26757055b82fe96e34a8125773129a97aae8feecfc88f8292ae25cdefbe214013b2845fc8cebfcfdeea32ed63c334d3907afbb01306e789d8d7d99b24cbe15ff2bbfeddd6d6fb9a54c29c922086e0865082017ca6ae58c133178d272c44b5dedfbda311848f6b6b9e8125d97df43cf35227288f41bf8da1645475da04ffddbd8e28c81c7d54298955b468e2e548531dcee55c49121da6ac86cf9a967385538ddf13744fac97bfe86742f3f9def71ba0325b889def3a61722f15e14f6d7bd28947e9aad71b26eab3e1d3827f4f20bc2395f28fa49863cd024647660284412ea54daea36385220eaba3d65a06f9bb5a512eb8e0c2473d49caee99205c9648e92393eb329cf992e3f7533500ef3d93fc99d2e3a1dd4665ab7ac0134c61d1b48ca88707bf410c5ff52a97dac3505e99c6dcbc2ca58266d247f75570d1b48025d1cdf8080569427e59658e0b4180d9b3c67cf6666e7d9546b588b81c3375ad82fa6f1d7f193180c44a5c59101004c654db7f5b7b8591c1e1ef73baa9b099259fd97959033a328ac0fec77646f2628b9dc023e71109c059e71e743105272cf6d5828ec868db01899359b713f577ef2d04f959f9c59fc04abafc819ff8ebb7f60c7ee59875325671c0b3b36ecfaab9fbfe3286baab46f335a0c3ef9cb8eb25a8d9e4dae61ad86ac51000e173e15a6f1279bb66d75ab9ad69a0264cd08a4e8353e388a59de023ef97b9be13280f5ccdc09ee197425e48cff085c49cfef1cff10d8391d14f65ce7409390d073cf21098544fce47f822acb09f17777fbc08259cc624d5517c0bf87a0ea1a1ffd4f9a7d66c82c1f66b399aac539552db6142ca9e73d3df349a93837666656a3a767f5faeb703269d1574eae4f958e97f5c6d2413d9be9c857b779dce3038f0f9d5729c4853aaf65daa9e3083c422b5ba7aaaa565df3829c4e2693d99a52266b56e17d1e15b57893999987300a08d6b13f1208f6c9019fbc99d5203fe1f2fdf82e87cc52c352a7325953256d4ed77fae1ce5393e5bf7f975706135cdfd4315d871aaa6ca513d5389c4b0e3545def3b551368aaa66aaaa6aa67ce6da31bb349811030856f0b4b58774ee6fa6fe0f51bd747d77face17a3f7b8ab9953842278f23ece839d5bac123f449b0e9d0e8f4ecc63147b58f4f0c34f5079a5af4dda110d193422426ed4dfd2ea24762d24c1d9a82c43ce987c0c03c2914220a212ea19531df27c91975ab5b2d92625e5efbef9afadaf3e81aefb570f469d15bda57d1ad1730941ee2f8c94d3a2f6fd2417b17d29b86700ee9d954811717d2cbfc8d1f42fad18f42215ec2286a68caa17ef8fda4d01444e66fc8fc0dd390d29bbef4a6973931a149fb984f920313923ee685903e26441285f7484cdb9be8c39042d37c93f6a497425e3ee6634224a62d3c22c4e5edeb2073621ee687c43c4c28441442460ff342d810498fd7109851a803f3129a667844079963d2483fc4e54921920f63432c29dc2149ce2881483ff6c851bf7f7c1c2f735ec2284c397491ae2b187a1238fa17b0e56340978701edf367d291791d648ecc0fd1f1a5979f497b2dd4b9f144748451f49b1e3469323a748451d452e961625e8852e803cccbbc8ea7610c1da9949f489fe36352314ffa0ac07c8ed0a443223de7bcbc3ce7bc3c4ecb8032c7049ab4cff149726e80262d34e9c8bce97384486ebc298c22f4329f244706bc11de78ebf242dc08b9c7becc9b9e86314ca1f493cce871b8fce82b601f47f89cd3d2f29cd3f2387d03e49c12c8399a4f8b3e5068ab35764a04b64fa7564f7c7c644099d34f80a200d150ca74b956ab2d86543d9897ce051c81cfa305b4626f5d3d11d82993cbf694b15351ba46037275cd4be698f875790a50bf1cc6b039e9cb6f6e73e3d015767e3868e12849a861b87f90a7d9da7713460b6b9bfbed473b3f7485cd71a917b344429d16a77dd5f4cf470d400a3712a5e327be3182056d237cc32d1d1fdc299bc0ac27ecc3eaf7a4117e59f97cc8a7d35ba485f245ca481716d3cc9f22c847c822a4b803d37012f2347f9271e78f3d1ee0ce25eeec959c9993888ef7ccea03e4e0ceaa317d7af9f3a1b3d385d2756ee897433f9d6c61097bea17bdefee169658ed76ef3d0c98384211d6c8d9e9de7b9c762f7485e52b67a3be97ec83c7117647e97f5c61fb8e7f04071df7fb0d748267cbf9befff3c01e72fee6be7121ffe6fcdb3770bbf2f3b0449234fd149469112cc2f38aebea4427794c665b62666ecf9ba51668a9856935d6261565a0a1659a69bb49e9943c7b761bc8540bafe4824ffe2bbed144e7825132f0c99fae98891517ec6ae6e94dea69301918f5834f387ef2e7e71f16c73217923022d2a6df9f0212c55b704e7cbfc3944bc4515f58e78f8460bf173dbb80ac0bc552fae431d72808b67e5faddf8878bbd435dbc4a1022bafbf1372060792c69f03d9899c59b1941d587eb1ab45b0087694414138ea4706f19c6c92a1243a57ddfec0b130af3b719557349860a7044836ed47190433b9baf910c1ecc82eaf0bbb4edc6a8f90a6813a57ce0401ca1901c10601393b87a378b99968326bd7684f1f8a7f09641037461c91156ce415ec46a97ad4b585dd4b0bb6c4795de53927c79e0ca2f785447d4690489035da1741daf0bfdc201cf585bcf213dfd090a3ac3e1b561ca579c5e148a3c8c031af021c05ff6eca633013a4e8cf51f846879de0c5758e12057649200e9233fe0b0082c32e094479355d937aa6eb32744d498afe23e82251a23cf977d334a78b5f1cb4c353a4b08cb3308ccbb8feb39999081fcfeb28a5f46f13e19b10c81f8c92fce272fd475748189d1f84a36cc84d644b18fa7f3fd7bfaf8bdfe56217bbd8c5ae3943eda3075a3061c5cc54f479feb651f6fd4bd226f4fe37a4cdf6fe38a44d871a8938d8e1f99c96fa2210880d087be97b20101d18430f3f75600c9a46e4b26844e48d9bdaf61cd76d60e8a927fe10c029009e486f0b08d3b6c5dace748a42e16f5b0edb739b6df916b0879f5a207ecd012116fc8af9916bc2d5d1adbe725fad56950833f4959cf1245656fae48f659b59ec0e55729d2e99939d15faaa45f00b3b83e6939e554c2833ca9472a9346ba5ea993b9fa584e5ba159d1d3b76ece0e131c82f06bfcbb5a5a48445c2bebcab40def0c034cea335e5206f8b47e70bd8c20bec894b811debeb4ea9b0ae196b8a47977074165c7f1b8ead44e32ee4c95f148ec2d191f08523b331ba8baf3c9fc1556a25c562b158ab98d02530c0207a278fc11a8bd5181bb24530df43dc2b4080c2ef7243d85a46d78c9a6ac7f5ea4a0339e33f5facd335db0e5d511fcaa230a02ea067d02b940daaa24be40c738b4271d8dce9e9a427939e4b945cd8b65381da448df18d16ce17d3f8aa36c1286f62f60c8b15292f17eb89931d9e949c093a03c69b985de79bc9869c50b88217d765333bd2d89c6958b4202d0b4c8bf1c8ae6b53d0903447980212aebf26a5fb32b42854a05c9fd2555c2368506c21699e7869ab96e6735de3b9ae29b9fed40945ec481b2b8d6a257d2a83ca681579d343481a9736fc4e1c713d4b2fc1727dd450705f9e3f1fa2679791fd3c1a8b89c0c6f202f6cc0ae87ac26a273c2939e33d5de32a12f4895f66c1b2934509ffe84abc65ee0d83bdfa497743e928a95e754ff3901e86926667812618e562f009039589baf2267cc531ee420c867115f6829df00a8fa031a9318e8ba9982891418679475f854db0a34f1e7fcf022ba36bb66f959f8266cfa56ec50b7b498b211556b6d84b666490e1f341bf82a14bc123950b6d95ebc2b179683e1f737acc614e65fa18de041a8e9cc5570e7398c31cf672a2b19ea8a2ac9c256de83777c48b515e78043bb24f87a3c68489b4610e7d481cb7558d4ea64e288b52262d1ee0009f8fc91d61433ffa6ade2e015e48861df9d53b3cf3b7679f57cd91fa24e02c65748ac935808d4dad5cb7558e7d6e6cb0e1f3d1cf60e83678849f04dba55ac8307eb53845cef85356829ca1f1974a47da009133fea1efbbafe1aef13e0583c1d8a04f5a6451271e48574c542d32fbb89c30100d704f550d527ca3853a4c235f2e2951666c763161976f6695e9c574c2f5b7a3d077b2fbae3f1fdef77cbde62be8e52beaba14e8d21e47558daa6e89f278c979781a7e871c666147a157ddc27aa5c4dd2d5fc7fda4c6449e0ffbb0cf086c292dbaa2c819568b4e562219aba6344aa74ffc332c32cd8a56c67509a3726da0311a1b698c871dd887ad982f15d3b0158caa66f049759965be1f5f35c363aa9894ec302fac1599a73ca3adaf1665420f43c684529ea6640f71abb9ea15afa68cb957afd7063a00368103e0ed517d98c6a7aebc89ce039eccf181d1993741653e7c43af5032a81a3b88d1181176ac31719e214ffe57aecbe810b329a3311aa3311ae338cef27a7158633e6ef8814303aa1a5418d000a64ce88aaae6773978dc11b6bf7b80c7da75bec2af51aa0deb5fd018743fa9938f862b592e8d491b1ac81b5781f32b083fe0178d4925211b96569127ff3358577c281badeb7fe3a331baa24ca84aced02554e52df77196af441d27ac5ee97c10f87c841e02524640488e1ca51b5336653077984781bbc9f5ff42dcf6a4d23a6b5795c7311a9bb18eb1b792334e5a6445e91a1f2c77a4b11834a0eb515cca48633cd2980d3406d3112224021190c01026d2a9dee12cda0426c051e056c023810e9b389ccae7c3615b583956f61013581ad53c74e77a96399b5168e3fa0d6341d2f8944dd99465e954ef4cd994f5aa9d28d19e684e3426da121aa3313a2de09140a7d2a73e8d5ec6f5d74020b64b4326c8197f0f43d290402718748247cc810981d880b0b75f03df8f8fa76400039f8fee31f0ddb0018ffd4a8df5180e8b8df575bdc586e52b55aa8c5f2e98273dcfd7ab6b48307436d3d9dc5635caa0e4b6aad10d6c60871d38e03d619a1a30aa82c1277fd235382f83f5761ff018e4eb32391306182f47f912a220850f460002860e63c18e1bcff5a70cf3ce2fef48205865ac52ae7fcdb8ed5c4f8244d529d2865bd5e77edafbe58f866167bd4348328fd33e4c41609ef442609e04c3313f6d57c381a53b20cf40e9a798977921312f43fa98f015f348603e26e4d776dd95c819ff900d4b5fe6c0901e66474ad79048a153d0838298af098b79524cccf277463ce92812cc8f3a607e748143be9937240260ba2ff423bfbecfebfb422b612a1cc4b3dee1d8e78542a1d00dc58032679e2167a0c034565a9cf5c412d4a27720df18b0731a7422e649608967cb89d1d1d35f82b5e854a695299b58ee94855d8c5336d615533932cb9036f35b546034467ec2f577987b8cbbce578b77d553e627ff6db3b6549a29e01ac92214182599f674cd9436678c1a112b285122ac15661ad7a76cca2efdd219b6ca3629d3989cf1a755349e23ddad29e9896d9bb53446631cce57d7cc0f78fd810f7c3ebaff0008b63bd61583b5ae384bd7b077936a4cfab6d2a8988ff99898d077b2602983ca94981f3b8acc8f0de5c7aea2144a5f72653cc6619ef4386dfa422a2c87ac228135e6ef1cbf58d5ea9ab1c6ba46dac4aa8c8eded47aae2fb9ae299133313b8a77a43123357684e51fc7cf47f70cf62df2dd50c4ab31695345a2b88b578d711581c7af66d2356c480e43b6206da412d71b09cdab73951d6458fa9d5281b45102f341ec63054b96eb3b17e554a6a07ca5a451358a85c25ec51226d743273cb4f892332e73c6ba3a5dfe422a2c83da75f7771813541aa5b1ac8cdaeafa87bae60b8d05b70b79a3a940d2bca4cdca511e863cf97b95cdcfb0ee57aeaf1c267ac1fac52f7ef14b5ba2f5809a1239c32f7eb1e6d335a394dd2a5efe74898c56719d3eb94e9d30b91e8edb168ed6964ae1f8e27c98077bf849bcb1f58cbaaf28a3933ca476e58b573edf78299924470ea1bf0d39f1c8b2a7743e4ee3a07dd3d9abee884d5dfed20a6c897e0ed96db914a56346b340234643166854817aa92ca44003caf4b59ef4e7d26f4f874f87d0735fa2ff8e12620b815be8eb735ad564619c115bc28b007a72cf7a8d6ec198c67f0d46f50b5a72bb7e5ec0285e83595bc88d615a14e1ba37aed4a28858aa0a3da0d73369d3fd836eadd1335e836f7a0bd93ef056b7357dfe7068118ce7dc601c8644f54f0bd6b29dc8db31c5f2fd5ad2a1fcc896b562abd5f37d3bb2f48c3e9d1d20477d2f7afe0ffcbee58788de8abee5452fc4e8bf9739dd8e2c9665bfc586a6feef47a3377528e4fb914988e85d5ef42eef1f1250f67d53421381f502dbf2f6e76b2d282dba11972ca4729065f4489b225ad883f66ec4ebb612d2a6732cb7815aa444b032685821a2d05e88ef5de67743cb14e47b9717f2bd4b28fa51c8834c14dbe2359d2eda5e04f6cc82b3949cf1300d5b05599386b4b902ab5544af5a37c802a87bbaa7c56ab15a2c16abd25ab5aa51510bfd91f7e295a4b063b77ab688b69e9033cc05df74e7a0597d65d69f8f1fb88dbba3063c76ec96dc9e55351cdefc6ef88122081895180cc6400ea4c308931968c643b8fe332698cf476b74bb188fc1d1ed969cf1d98807505c219bceeb7ab7ba55c33d55cd62188bc1e2a1e26ddbea562577b3b85b0d04ee1e69b3d5c7e91fee14ec15109ab48089eb9d7cb990009231c38e3d6b713ff6ec093264d81b6652ecd82d192b36f41df5b6ba79ceef1f04fa869e65ac60719ac17ab7cab354dd52a92d354b5134ecd8d3f3b41edbefd0c28e3debe16184e597a965a5164b5857de915d2ef04fcb823bb0520b1400ddb17be413aa80a15185185c91c62c0cfd58ed8edde380f9a67e4a04cb2e25ac2bfc1ce0e0c777013812a8d25ab5aad11d3cbc17c460144bc127e7b055cd7a0106183e1f4e7c36f5fdbd9bda0146f5ef868f8bf09c3de72401bd4070923b9fc386d2270ffdd8be5ad8add08f1d9f79ce2a8a9e288aa11fcbac198fc18f492ff9e9663e853fa1fd58d3ed5b9aa2ea9e16bbc759b552cd6d9b556301847e66251dd81e703c27ed66f0669861003bccf218740bc851a29fc29ff0264e5d57a4fdd0431f6286c4aa67c794596805c85d9a6f6bd1bb87fc6c8b53c219084083c720b37eece4ae8659dda2fe85507ce11276ec1fc80e82acf1810c2e1612d53d7e6af10dab68705d1ae1fa11d28b9022b73c099574150d96b8feceac59f7a8ba877e17a56f6e5bd54416acc106cf0862b00bd6b317fc4967712cdee34e3c359b990bc04a7413492345b7a07b4a4cd8b17b1a4b8fae449485f60fcf6aba35a78d0d37ddd35724d713fab17ec7eeb99f0fde69d19f49cfd89028265d17bd121689eb3e32024b9b204775cb51cd6275688a95e1c28eacba11b116728a79b6b023a7e61dbbe7867eec773f1aae4c19836312d5e5b05946a4ecb64f11be100a1b2eb1b31f79f2174217b36ecdba35eb59cf7a26fa3c26020b3ac943898f3bc2f695339bc82bde829f90db4adab470b7d9b6711777fb99e26e1c645bdc9e4118d16b71631e39b33dc8861d79b56d630d77abd94a77fbcd13a174cdc8473090a3a436f211d2a6eff63ad28657726607470591286e224fdb6fa328fe7669a8847b98270b368a104a88f9de6f510899efbd10f4bfefb1bdd8b1778fd4d46db0de6e52272d6e4fc1f9dd90e476340c7b2ba8a5aefcb8c7e96a5ff44346159ca9db51cf3f5310d1b7bc10d1b788420f85881ec9e845db57b053d7c74fdb083485defbd07f4f2916ebdf813ca5c50dc84f9beb075310fadf5760bef740d8a62267b66ddbde51dfaac4f2d3c6ab16472e0bc4767ff8812ffdf938ed59c9630b8b74ac4ba2abf527581fecbb759ad77d921c1387eefe48bad1e6749bc71d6119a4b7d3bc0ddcee9cb7e3a8e6b579e336916cb1d6e77a61a0b0f46768da3c3485deb4bdbff726eefd33857ed382ccef7e0385ccef42d3f6dd8f9e0385f87ba12948f7a3376da1902eecbcff5ef4a370fb91fd9d963762cbe9de9a3621ecbf84435c46ef12f6f0537d99d37d3ff0252267ea87be203307c74ff5394e081cc562fb6b0f03dcfadf016e7d2f01b77e07ce204ff5bb8fd19033f537905e6945ced4dfea16f2acc7ad0f7e613bc525994db36cb381b828a52efaaa556693728a5344e80c01c2375ae801a619c2a81e7a60141bc127244b64194b649650a74d168d603c70fe188e3c2ecc8f31301004b8b29329996acd41b59eb5ced704a3ebac569133dd61bd22692a19ddcdfa457d7d95bd9a70f7578b3ea5c50a83e88458adfca38913153ed58c1a0b408d5533d86755cd60546da2731f39d344cef8aa09f729a4374ffdd1573d66a852a4c8eaac56a932bea957244d25430d2e083003d50463be6898af09868a7d26188c622b9a99d90ae62a92b9260a3ca078e01b2ddc767adbe19bfe5965dbb92f03f0d03656f8f020a170fdbb1b7e3118b4c6180c465533eacb06ea041a03e3c5d5a736a9aceb7c53a7a837a0c20b16cdae691e3ab52f477ea1c346702af472f118a42f35764375428dd526eaca058f5f3870119caa818a01f38bf9622bd8278619fa01105080d73140cbc1ab2b087835562adda82bd3fc15f00df73b3ca61ce8f37328ef568382aecc342cece8ab1b8fe3475f1d69aab3b3c353430e0ce9635ee6774a6fc4d672e5e72af015308defdcb1797aa7ee58122467585602f92567f097e12401466e8294338c3c46e9d3a173605ee60b327360428ee1c0696cbea84aa632d5ef4c5e0eda646575683ab0cf310e9236f20acb292642cef8f3b4c3fce46d04c16032495f3eda89e89dee22a88d2b4197675c85c388d9b1c48ef5a519616b65b1c871b26d8992a674a76738b1a88650ad27a7d888909f18c128ae019f425a830a86a4f1e7d3c8fb42cc4f5aa34104fde08cb0e394c9ac2cc112648481b094167de4d55abf90370a7d558a0bdef49955cc2753c9ec993c2e782eb80045cef877313b5b09247a882a9a54859a8a6735a4c08ebe72e2acda64861cca7c144a94ebaf49b9fe74caf59f54ae3f3fe153fc78f3256dba90289ec267be7cec8ab26c8b673eee4dc63aab41be92994f9f41981f6f9002cd8af9005680966fced9f2cd1781324703e54d329bdc80697ef46a0d3b726c7a9f17e220bb90354d24123128354dd3b417cfda29f31fc9b1561704cbdd915bab21f00d18d5293fadf8462c2dc17a5184920fec0e3855468b31366c6ae58a327250e81322fa165260b9cf851f3b3207f14de8fd17206d385104248ab330031802b286539eead405e2a798eb0bb30089b95cb1de36b07b408514bd7bb87fd08276c92460b1ead70e4f6a95e2d20784526d631ad157fac28c574cd3346db52af57da1a93c69979306ea29edd350ba74c36b1c8dc3d3869033fefefd4835c159f886959044a4ba2e08b6cec08e9d1a6bf87e882834f177434c1ceae488582b53bfe84dfcdef726ee5ec8f748a2e0f09174ff0185dcead5f51a1a8003878ef21c85833cf9ab80ac56da6ab5ea55af7ab581dceda4b6da9ac80a3aefade94f10887ae5bb12dfaa26411a825b928d598cae6bee2b5be48ceceeb691524ae914083ca4db946529a73085124be1eeeed259d0f168517a73523a5dca3927d542295896c297668b7336a1352de81514d4461b1bc7416183823627f51707390703776f7ab3062efca6014cf3af1467111dd53b6c481aef56725bbc020705695b6d1804050505f115244a6706a5256c12b7bb881a9d3a8ac2fae63d68b70abe9fa2605f73e3e88b9d080a92335e586e5f6d35c00112ae48238b531a965e99451a4069b45cceec20290976f4eef5cbec2c6ab123971718528c4ce9060e530e1d4e9d3a75da820b0f863b78bc000018c453000410c38c0c343d661800010840001a0a50538029e058a0aee1ff12cbd2a88ae5a17d3eaae631ee75faf4a6f7c3b4ed98eba5522db164395e776e9bd329f55992a5f652e9fea88a9d2df29c1e02b960f657540186cb3ba70004ab8424765cb67405c8c25cb1c11ded43a1c42500645141b1f5ca2cae2821801558d29559ccb2fcc006f998cd9e30843bafcc62b6e2e1413453b18d84f4765c39df0339e5a720fc14b33cc5101205c44fd2467bd92c2e1cbb899c2133909f805c40409bc370470682e18ed2757b8a3b843c39c75c3e72c683662d863c48693ea8da7cbe99a10d4c23830d4b48a147e6d3cd559b3229ccf09946c65260d40fed7b34ad292067e6ff8fc7a1b3bfc5b0a39c89dc125b2fdc125b2d51e41b8e314d174186c859bca6c05e8e6225e4c9bfc9f5af1a9dda8e97956bedda2c999bf358c6329ea99c30162bcdd34c38884e4da353abb5d6aac1180ce697f6fe42b6d0c21f39e392335d7bda5639308084f00d6f2199e594e6275866999fa858af07d6c42f734cdc3304ebfe1c964a1206b20556dc1948eee11bae82892ae48c5bd2466b438a5790a2f3c05d84ecc1c24d8265adbac00e445af487f5c81997c9aa4c26639946a7cffb5081b35ccc1823fdedfa04d1f0c0eda79e3592e3f617a1e198e3f673620c321cfb678edb438e5b84fb51738c392e573b346cff37c71c957eec815b84fe46bb508f8ee98eb6695be5667353db26a5734ef6baca6bfc748e5230bff3b6e91d0d694d84bc9fa0474790e4b24ff6c071bb73765c881d8aba6d200e9cba53dbd8351f5b05c769396e2b21ca7130fd83eb01e616e1e877dd2247e9e4be4e2e1c616e11e66ab8bd12db3f964a258fe3429a86c4a6bd168e20c96d0e9caef1164a19c3fc19a2da6fcf6d1bf5aa51285da8fbdf363727d7bdfde0c3f5bed2ed470edf9b55b0fdf6e78fde9bda08641bb7e547ee47a1f6ddc0859e0da9e8bb341cf9ebe7c3d6c295e511f9beef3322de5ac11ec4aebdee46b1866a35f1f620de16517d7912fdf72ddf712e2010f5ba70b3d62de4e2f238ce85b4d9e32a47f2c7df1ada14d87e17d3a86954f3b4f9385dc11be4cb4b696302222fcc0f09b8f56b38822417e6c7fa9b3743a12d7c6f9cb743a18f646248a4972191b649c281e36ffca8fd86e36571bcf613c717d1b690391ce1d6a27ded06285bb45f02678bf66540af45fb31a06dd13e098469d13e0c7843c660ff05c42167ecbb8039a468df04be3cd93b0a4b72c6fe078ee2b5e13712b945be1789be2e044405e5d4b45a1fc7ab374bfd31999365287466cdb7ca3c9d8990962307ad959b93a3b4bb2bad5b87638e4b7bc871399ee198e3ceafcf6d2d8eea9e8e39c2ea8190b675b4f98bd4ef2ced7e4ab939394a9fd66deba17427b7fde55c58027d4f9b97f26079b845ea87359cda15d80bb9c06e4f9dfbfe0a8a5db3859b87251c7fed37edfdb5d7e86b4184ec7f2ccb6d93deee4e6bad557bd7b4f75a04a2c2890bc356e3d1a8d0f7e9c51e4fe4008a99b1c68a7ed7021a36d40ae3fa8f1d3709a280ca7db9520b1410e176ecd51848d44b1bd2a54eff8926977ee743c8438bf4c31e5827240ac74fb46b76685e42d67440320c24cad61f590797527f7b433c7440d6701252a4cf3cb4fbcd93903552d2e71ea72cc5fab47eedf1a894751e929b03aaecd60f8542a15028140a8542a1901129bb45ea6f1f0ad5e7ed4bb11a7a9ee7799ef71d0e1ad0b045425fc48894dd51f4f53d6feb72e87efb31f4a328d4ea9cd5d6fa3538aabf3e10593726ecb6ddf0fd180a4729bba1914d41ec8f7e88fd91e887b4bc281c43ef3d8e87a311ed3d2058bedbcb9003badf3c50fb7e6cf543a1ef2ae87de759db6243ef51d0dfe285a31129bb5d38562e046ecff9d85aae7492c7e851b8270301511a82bdeaaeba542cb93917171c857211046b11fa11f56496140c73314dbfc0056b6182143016b77beaca0b1825d987909d0617c172cf546a5404172957a5b56a55a3dcd4298bc1cac10c542e18524f868911330315b74bd9e1e8c92ad30c54936a52a47a443c29508af5973255b03258ac8c1a56260d2bb386959fcb75f1662335048f8c10ecd8ad1d50b07c7e72c0aa3c907881b504005708828b284be041446bc62d2fe9a0c2cadbf24f856d9d524604c1375aad35a238a8540dd65639eb140d0800000008a3140000200c088703e2e18040a20782a83b14800b7c8c407462381608932887619451c6186310218400010118819991ea00be231d829503017ee523f858000fe934e6bd14408e7c2f48bddc293628b7668cfbd82a34b80ff58d0de48ee977fe6222a58955f1a59754c38eebc5b7c60c4662a7a14ad62fdf93d6308ca6c658645293f2e1525337a4beddceaa9adb35a60284b6dc3cd149aea25d23877de2a0634845399c9e97f975dc4b0745e765e4350209449ec12970fff12ca61edf472a8dec65c563683a5663114f67f615ea3374324360f9b59f8b8f8e925bc3c78bb47c48c70514cb1321624a297052b30ab69e8bf9920771daf3e3d61741ddc2d6721ec3530dd113343ddcdc17c4418420bbc44d145f2d1019cdca430c21da2ec409670f01d9bc8f5e1862ff62a1efcde85604ccf36a60e41eefb1c51bd54c743670b1d093a14bab127131ae1be6bfe2fbe49c2faeb40d62dc18686b29292347407b046573618310d36dbf6379cc9a889a3e08101d814272c68e62035168fbea7086647677a35f461cc0120f0aaa2516b38a08a94216a1af50e83a53f990341392ac1eeb63824c8f11cb85e3a110dd3b03e72638ff878994f9a18c49c83dbd9980321eb172f4b02603f81b42c38679fd8607d6870fe780c11b9d4f18fc5b767d9abc51d2150cb39f0e3c8242a02517254c14a400a37b0614c03a2fb04499aff770a17c9e0235fc2a6df0f0525d6e2803c56774c8da1946e0a8bfe47899b04b441d37e92841480725543b64421e69531b6530a15ff2762652e0cb33294d41af9495978a48187c25bdc248fb47135de44f3435d4c227b7496bfb3b49f8b91b530f7f94fa60080fa9f42be88c1634fda7345939f0c5e0d08937a205b297654355e34881e49438c8c72b0fed9ab6c76bbb98742a8f925367419bd2a3db73d43cf59b8e80988191b498d19aa73082fbe54b07f2f9e0e32917a77b9631facc2bb9a24b39108ec8df7f477e994587acb973b682fa487aecc635b9b891811f41140f41867221a81c41df8aa24bb1c86e2ba8055bfdcc9293845829ffba1d3fecc63b2256d91b01e1abb6f6483807e418ec476c25f1b2571906044e2e19d8f54dba583a52724682627cb320d59133c676da2aa6b3a56eb81983768bdcb47e34a4f07f9fc972a2cf1906dd924583587851246d84704f0e746604fb1ad19ea2f9db8a4bf2dd6689d9b0ad1320be5b037fe0e4bbc09d7a659b83cdf2c05c770c60ffe2f8509e77cdef3e6564aad574f657199f75f8f4d06bb80f0f7d322f778591aff05e6fa7cae2503f6b22a3a0e979cd644c86443a9e245a7946d7f13731c82a53c04771922436f8a7fb7e591329f7d456afe2dc3d73b92412e8c614fbde13a0a3ad0a82a6b2733b21132876a7effe14027633bb54b183c822787f1eff91a9628b3c1faf5ab44a14c909145a0ed886ea90d8e2d7e89577a32bd6c2b3dcd543749d839a898fc15cd9b29f1c933a0a48f5b354977e01ff0d5d021e76991e152b354721490af95754fba1039494ce715b34f82e2bf47ca3fafbf11f202f481d7dd457547616e1d373975cdc5a018ba09234bc86dc91d1da138f0752cdc0e5bf83d1397266496b774657556d41b2362e86ead366b7783911866bb7c7f441133891c063be15ca86d977bf421fdb963426a2d7bc8179ce6a77eaa924c3ccef1ca2dce60a6d93915a0ed72ef1efddd737d6e1ff3527a644940c341db1af6fa9ab93676ec97a9f2038332ab555336888815155d9dba9a1b8e03f3dc4e68fa81003aea8afb2fdb9608e48f8454736078d0debbc0be16a9e7101c7e6559e1e2f6b9793794426c564a0ac2612d2842ab453974678475b2391e0b8d9aaa26e1cd46f96de73e3a94bc92ae5d0f17d7e18528db4d444f2837f33d93a3f75e2e7796ed4b8031ee25d3c8f84bdc11a8298c821630fec94e76e46821cb1f975c3351414a4f9c48379ae87d2088ebe8b9116f9bc358cf770e9d8b61a4248a16d2909acad65c2b08a6c0dc60d53d09c59e838c4f0f1c716aab44e1dfd114f2294f033cb843edc6006664473d262991c1be3f261817066fab854d64570e23cdb817da47be1f9dac4394f8aa231d200dfacfd960e0f5cdcf96ae9efb0b07f703ca50b2d3b8b3d3cc0cdf194e84c676f3eca501150378d63684fcf4613bb32837a106310c9ef63e227e5c33872ca6ac421cb9e7c7d864352192a90a146e0314e5bd9f84ef527678a609848592d523c7d2c612ed23509920303599cd4a0ed794b0a5064d734c39e33bcebf80baa1be98636d1787e1b678d532253523036f182587722876f240745b41c385634f575ba32efc70fc162a1ef248ae23f403f5aa0a443145a76b9bdeaea3f92279f9c57af7c0d39d169f7a40b7159b1f0fb7108cee3fde500e851f6e57f394bcf7520c3da842c7755b8fa9b7d9b31eb787d7a2f5867d0b87433608c164c8ae5edf1c00de6db67c984ee2c6ff6c1a894f2230f96bc71ff709924c2d2ad0fd001e2c9ccdc735697168cb56063b188b193380ff0411ec4b4d77385895e7253b2371e3e4bb17667bdc9f226647bf9d0a59b1ea296860d9fe57fd70f696998460a8220749f2b08d28599825099efc44266468207b8df5eb5591dd4a00ec167e27ae536ae8e337931542554fac246b6f5120e0fc359051c998840edc109fdd81e56ce4ebbf9eacdfab1947f453bc034b3d2c27dc0928bd417a07cf5c79e225639a2f792a028de6885f75fccf8f71f70cc0b46c5f1d539a30d5e812f34afd09510aaff8fa4dddc0822549cab8e74126dea9a89aaeefb4f0307a083617586a0e2c508ddcd706162e22daf2ab62b13ce3d99d1fcd678e058821f5ac770d208c5078fefed67aabb894323331d3fbeb9b07ecba64aeea4e47918f6afd2256903897277bb1dc319c9cbc8e2ff6b700a2f99a7a9e10e4664525d6a821b690f3b41afca6d4b504aef3129a3e020a499760829b0086651e0fc8262e80ad8d7e8bd501481a2599666bc9a91f7e84f5184216793e54f10c1ac7e7214092632e603a6fa6c75c77fca21451731fcea82a5eacf26a0e2a06731e8f74cbdb7a77ba73a716ccdbd220cee1d266657f9aa96d9d1b9ab6b9a63ca7e56faacd8a19900d2edaec3fd32bab0fdc2280a4613f46d66ee7fe8523be24189fc9a1569d4d3db08e9d673e4eec35e862586773f2126ed00cfa240926df00a4e6471533fce91396e116474c3c0106f85291e72f4dc2f28163a115bac0c8f82dac4d72b96ef6141bc6c84a0271cc8ff009c38bb6affb12ae4df714c8d16bd880ff41bdb235e4f4f3679ed375198ca3c417d03bca9d68a9dcc8721a004479092519428c9942a80cf2d1fea4bf1359a0abcce9bc687105667e614333327cdc79f46d82a75f2b106c65700bc7c2fe13e1b3db829f677692fe3bb93ec59d188c96b38ab8cb27be0098ae03ba17e35966e73ff587cb7872717d8423254ed537054f98497aec21238c0916e15568d0a4bb2d348f4bebff37cd0254a121ba9dc099f059d1e26e829567f7ba94892b2e6bec56ed354a7c435f4dda696e12322fe789508ff8d59abae962ddfdc1f6d07a0a792b6c2498e492f0fc2a9c0e071981da593743964466e5aa8519997f355ff202c5b53f53c0df38af0b94cbf1f5f1c0a490c4e1e82d56c69188a612045c218c8ffbaa50dec70d26672b44ffe742e19a7f6fdd2663c58256965e953d367e1b1feec4362c335c1f6f5be3f2e2678df5accab67144e5f1d8c7316aa5637ef939915997b923018a2dafbf67e4c00f1ee5b0052d57454b90c204eea5b349de4f8658b1529760d362f51cbbac81f275aa24258a1f6119395a41b059d16923bb865a86be5d9b31bab77e9b0319eed1e88ee80cad6f9eccec4e0450aab8881e3b932d2cec9bab0c695fb0ddba3a238df61978543e1bd7e8555dbc85163f63d42f58e2762dcf7d05fc1e48984130eb09c6df7aa6f8547901942b079802dd79efc0763aa40d4a1290a9061effaa39b6b0db3d38ba62b4ed2e24677e4b5995d588bdaa417a52dba137a069e954c0bf9d893e5887a87478da10a3e5b2d238343c8975932ef3149c139ce0e52d704ed288279dd4108868e0c5fd4d408541643466f25bc4307535ed3bd21224e36b2f0a9c44563e81765c487668acf99733ca5eeafbd6ec2f03f4a4ab0da67e70c0404928832843367f7dd8dfa3e798cc300f067e646e4cb039be3f0b9ee84e2253a2689b4b233434dc537e5285d1385b58062363ae6ec809231eff1f258cf4839f6488b753c6b796ba50da9ee60ea084c936764dca09493d382871997036073667513e39f7cf84daa19e440b18cec99959a85441435bfd08fdf62e51b895b0c17d91247681ca79ede288f1590a41a93f991ad39882360c5ae27cdba6aaf167260429c5793cd5ccd9b1adef5016e64d981bbc6e58f84290e594de303dd5c45f7fe94c4ec6308e1ebc34decc3c5bc0fb7047d05e465b311ead1066bef6f532394d299dbb8d7171522e1b5cb450bfc9b4f0b8cf4afe402cf115c2c3d56f9f7dcb4428341ef1760e68a058af0e807bf42a18adef36a6c8dd3f63957416e08f4fba4f40351eaf5a009c1f3d50d7f9ed3e95fbae627b30ee21495855a4e512850cd9360bdd803bdf8449ddb9ec73db4f2c283f2ca602cb662438f6a1e227c3c135bcda7d698db6360d4bce879e81e189dcbdbd124c04d95ca03d5dc274f0f5011c68a5791f7a6c817d95d2bef506274f3b788c44a69464f2cb0000f3d7139b9ade9ef87659cf299f977d66c2ff1009b7178054ca3fa7db27ab62178c73cb38639ad5ac4b4f9c90c09897a5626750823fa3cc05a2537fd78f294db47a1f3a4a3f0df45231440ddcda4061a57807b421ec3c018ed87cd8fe48770cffb8825350f0ad8861e7a64cfcad27a32ea9370d26e0182db8f2db2c6582717a315adb60f48c00d2a966becb3e52383ca89c8012698d30286eae20cc8eea74f4011bb78e021da309366e49d047d1418eb580ae9b41bf260f1017d2f3f22b04061a0890d9da9683f7cf16a23336ad5010d61563857c890b1e267f11647ab93899b5f62151757564adcbc5202809efb6230cd1d19947b9fe6c38af442929805a357f3c9a3603cfbb996721101a13c5b2617512b416e7dec41999db32e8088502681933ed74ca29c75fe1f1352b4b94ff99731e1e4e79938ecda428228f29f160430a8aafdd90692c71b0bb976d944d1653f3c5dc8e567154bd8b756253e0e7580c0e6fed26b12003a7a8a13ac5ad76f45f67413fa26671ed93c0385c6df61b39bd6faaa109a0829e07143604f4801e5720458188e52959a5d7d6baca94f853d4c7065bb0bc0a789b60892ef01a8d6a6651be0a5803cbb28b5f3c3891b107ee99424b8d6069313d2ebbbc35e62c5805f0c60992c5e090ba1c32fd17e4d684ba47b851809d60113180c84adafaa24b7ec3bf08299051f3980117945db3ce2fd775d91574b1e4b3cb607a488eadcb387fc028e347cedd67e5163b6a34ab912383e3726ee01b85dd017e3ff17a06040f0357e474958ff9aa76a7c45c289b5ff245589b4f06287be8aaec2ca4b1c9c8f18a68c1954cb195a915f8b4cd8edde3fec5a9ec30fbb5496450144f8e2479b68e1e1ddc156405f45e28d0581eb1779d25c272096a1e856c190bc399c0e0c0d4d1bab1388b8fcc69e1997b1397ee0080afac909e7c045b2b181e6c6591e4ad92ca8fb6ca2e1602ba3d5881090048e7cf52791a5acf6ef22e49d18cca55ed2041ce1844555aeedc6334ab92b724d2f8962b5c264750a3c11f111af0fa4befeca44aa2c441726bdd51de875962ee9d673d212577e0494b893dc9f1f2076ea2b3af4555c2499f13d27d358884d030984c59edb302313af9b802246fc50a9664702315ed2c0bed99864461bae88b3e40d254a131a20a7e6ec4cb8081b6282a7be3a6e64c3ad1a0134be3d5dbed2c6932403b629b448fb656fc6562b68bd51bb069e162e09cd03dab434501b48d40481cdfcb9daabd62da73ce2a8a3bf20fc615f166713a7fc8be1ff082195134ae95c96247a4ba918f19fac2c26c4d5523ac3691aa5a5c132a133ad894579c03b3da7628cb296ffbc0f1c02b26d2fc7944e67915601c2d5184b79ab07f6119d595eea475d0968bb2046fa9fd0275a0c9cea1a1ca459abd0e309f723f2d4fcda9fcbf35c0287cd846c27b58bfb2df41090a7cdda70a508c473e33e733ede6fe8faaf627228bffe8085ed2f40a6936244ab85aef85c5bca5d02e0240350d4b564f65d6f27d3b9097fdd8260179d0eb1fbf33905a9dd9b693abe278436450cd299399907fe14032b97261eeffdbb20785798ad16774c7499abc7565588beeab1d9b62c6090d89c31a437633e82b1c861d126619c0d2537069f7f30edc2a2b3f89c9c0ef202035d7fda3d44ed9e65cb9b50b349766205ea63e24fc764c26ee49702dc836b427413b6eab33a95f77e0eba02375da3544ec7ec50997d46808267f42baa67ab44ed7d28aed67c781f8849c86f18abe4ef4c52612525d225ad2aa9335e7a7b6da33585bf1d6f4b592e853ea40d67ac1eb14af71ddc3b482026049b7146318c5b95051158bdcbe53a46329280273f235588625a9e726ff33c793ee859d082bd3151694f0f89028945fed400869570905306138e668650bff26a7f1b02a89654f0db86780258bce146720f3a14a80fc0cc503cfd3265ed272291cba4651cbdc0e4c3d54233b67a994ec94071e17b10fc9ad959c6863de13a3509103ece71197154f810b28aac71b810b982c5f69555cb0561bb3ea3b50ab5ddde324b7c4c19d2fb1972fa2a3b74e4a10354df1de5d49e35a79a8291ebf9b2fee7f6c67fa79058ee19ce729c060131d2af4fd861b510db865088016e153b3050a407f3d8754ac56616cd460a130f98c50babc8e9d575658cbed9d1d221d8b00651cc208058afa0b8310e85cc80a7ddb6eefaffc2e24f7a9bb7d886f1ab89ea8cd108b770f5b4ae139cacdff4a5753a2cb2a986ecd8d1a5672ae03184621fe4e08e210fdd2d3253ed57408c8d9f8a1727bf22ff4810deba87d44c8ebb40a3d7b1bb00640567909b401aeef254306c34412933e4a83fa0f614c494617c85cbd19061f9e8f1cc778453a8f749ef7c45c2ed2a362a8a9333c781fde05dcffc47a7280b957c8e75dec96b78878f9f2eafd40486538f0dc8a9e39944c785d1369c52172e5804b865177c45ed0e44dccb5bf2f1a5a6ab004e73e5fea79926bd0cea3a79e3a93618e933c9c954fa3a37395753930b1fafda91895b12c721f475c1efdab64105c874c130a5755b2daa8d82f4e39a095d9fa488902783718ef9ad1bb24e65ad1c63d9567cce61e87f6b5065a3e2929eb8d70e20aafa251934ecdde984a68e2f1955c91ea19b4e72a7d97c4eb0f85d5cf6bedbd8b12760395cc5b1f55fd90b9dc34f130ea2afad88ab917a9e66a61aaeffbb2946c79c6b23b161440637c1e1b19d7a79d489f52d347dad34711c3dcbc2a220054907b8b7999ef97cd1fc1b298a2a2864974c11208252cfa11882f9bb40d678d9d05956cf293512ee9c19b81fd6469576f48e8d1ef735fa2adda5059227711937d7cd7fd1b4f82fbc2b83b198759043ed751758359cd6da4fe4951974b66fa6156f5200164607de9b8bfb0fcbb561625f65e683200c49793afb5cd2f7ae0a9d5b3e1aea03873e66b1d68336534a935e6574c593d589b44017bd5c1442d51c1377a1cf7a020e84c220038eb037822945d2066bf8bf94383348cafd4ec43f15f965eba005dfa38c5f94d79dd0173418361c2652c4ca4014c6d0cda75a790a6c3b6c77e75d0c172c28e944d97def7b9bf023278373652ac0cd40851f94470874ec892d80e4205840504dd402b76863e2303983f840333d48bfc470146927868b43caa0f9fbe56af036f96627567684cf90fb8bc94437a27313e898aaf71de55d93720a664894be15e04e6b0692eaf21fa7ed279f8ecee91c9fd8f467f3010c54e58b8c3ee3cf83588622120379851b4cd506724796c55f7c137466dd480ac5c23d954a913415362dc572455ae454a2fa6092439b9c6a5632d84ad71aa96dc8574cd10d4143870757fda0eaa43bb958222f8d4f7e664e680ee7214a31420da84cb1fb486fae544dce469705c01619d9c14777395b892979c8276f4e656f3ff1923bf5f7da8e5dc75a76dd63ed1027b3b2512661992528744afbcb8384dc81d9c1addc6d13ca3b4ac70f33e04fb5c09c61d7fd5514c3109453fba7f7376747d22356e95a6c70e4c2d30e43d4f8e52825e83f163451592793fb1c708164ec42cd069b40ef372faab79aeb5d08e02aba14c8f89772c5c113ad6d4c635d718db58157d815a4a540b357f6686b29886a4aea35b1704d1423e1ea514af9eff46b03f7e40c146befa2e4a082743a62e493c56a59388c72c3b78637e7bbff6969afd01bf16b2fd8b8e0759dd5281b2d690b5445a2600ba3bb5515997af3c8d70a40faa3c1b6087b63274a8b953c88c22225637f931d6317e1d340abfe51dce3c8dd119ce2ef6c68a957288fa3e424ecdeaf16857b9189727cf047ea352b7e922e6735381b1a3e739024cfd994f4354e97e3df4227f08e61f1badbf04485f10658a42871c8f3df3f360f35c3990876a23d97f40af8fcad37b82ed38419ad85d44b05b3792b69bbf0a538118210d56c9d4333fa67820e086f4e56ad466e606c84f4cc9462702153efcefb9738e769f499ead904a0a266ec8e39eae699386d3d1a7e69c01345e61371e855938d850fdc6fedb294ae41bac012c82413f3f2f3488bda9195b8929b8c64d9e603e042d3824816f551d775c02bd3e042014622d81ea1455d3d8680b9020ef09b143345d436b4465d050acaa6bdd20dce09b342c0965c976d7e9c25811478f4935897280789c09e052abb292513246b7292ef97b1517837dbf7584d7826355e0c4c82ef4bd88cbedad2485170a98539c7c72774d0b2540bc64188c89bd4c05e44be5e66bfae8ca6d1844ac0aa6cfafcdb2c7ea527bb247fb12b663922516994b220407241a8c15df45c6b444b39f42ed0caa334e947ecea01e0e01b4999fc8495211cd2f03f5342e3dfdb1f314381cdca1b12f74ff7cb04bc79ed7b1a33347745c388eb07c760114d84ca408d1c2c6eeeb920ddd7f4b89be9c9c319e6a46769846ad9ba88646391849671d1224732c42b43c5fb2675a15156caf76d5d332685408b87f92245e70db3c999e57f8ee08e4cb6b836568e291631cb5a634c018363113cd8b3cfb6bdb6e542bc74b74e574cbcda6fea681b1b81da88f32a6412873c804b49388c3e136da31179c529214288ebf626180cbb29ada0c0e92697a3809ee35d5750a928a5a01ea0ac8e4f3cb615b002bca4909acedda0f333409b6a8ed4e3245f99bef2a4fc43a73bef2fb7e0e3d0e7347db10beec567b7f6d1a0d95bd9ca1bec8a6c67c091fb30685e80d6f9df290de3f41b8bbb3a4fec9566cea4745b2db16939930ce3bd515f85d5b054d88475c0bda4162217b89aeb02acd805495fae0b5827ca969cdcf76bd89480d51970bf68df2eea4a53d0febb1f76761c0d640586cc66e62c8f85144b571096a6c834dd44bbf2ecbc343ceee97e0570b77cbd8194313241a8d6f814684919f26ca4f9db682b84a6d591f1627ef86871d79e8a3d83d84f62c0c77325bb241a1b45e6580df458b80d45efcf3ea95b322aa279a250de6927100e51c66d354e259170e4afd76033d9977cdc7e34b2846d1e69aa3ba28c12c3b476e67b7b868fa73353a5cb2b228ed5ef9e33f85869e1186e487e5fe96b16a9b5a272eeee82fbc525cd913baa6052c51345e9e75a87570bb2189594c749b3f56d395d3c95392e2f4efd9452f95615b5ba1cb1786d18f655fb0ce96ea9525d003f817b37329f8c345bf4eddef37d1cf1bd719028622cfc2b325821db19f7ba70ca00ae07fb9e6ff0df889c884134f86796a680473bc76ad9a9b8b79ee7ce6b782d652615554de6fed04bc06d4c5f3bce8afa8171c83943ccd4938b296410aa9cd437b9fe052d0d9d2c078716da054ad7b430e9c20ed62cc48f3b0b12857949afb94e68e2d7779447ce82038a4fa8b21276704162160b5ae71a9a9836070e28496a2df502a8c404f5a13b6880185794ac46de8f1e1450c069cef43213e6d7d067b47545ed0a2bfaff20f11d798c13cb7c0ea1a29814602aca5d6a7d1116f97fb6bb8928afe32fc443b7e03448dcf4874939d2fb9dc54ec2be43f11509cc9bfc49e80cf4552cee392d321a1e4529a54b904ac7a88097663d64d949d90f9df9482f866cd027d9394816b029639427f392b781a70971c310ae20e3591e59c76dec0c768c1d3184d78891321861333118b865d15b14f08487316573211b30fe70bd8cf11715acd5278cf10a3bea32221d5269fefbda5878ebf5e45ddf2f580b1e0a1f19e3bceae34a3ca7159d3fbb125fee3b28405df5d8e0ae8d9c9cb25ea15711ee33faed09b2d18771b047053ee9db5f54c8451d475a20e5a17b14d88d1c8301264099a13358d0639bf96f600c542a812424348cb027f0497f9fe7b13e5732f99a389429bc1f11394787aa361f293dab8b93b52a80a819256b34183c7a99e35c1017c6de0eeb1da011d07809e703394b3ec37148ca8fea80e8692c19ee376cb7c6ed665c16753b526e43c32ef1f1bd40ace941cb2aaa1e66452427fea2ba8a75fab091612876a1e38d134474b6dc3ad6b9fd9b3f94809387112a9dd0ef897e794285fb66e4ac3eb393087579e873d8b645ca62407f0ab9d8095e7d9cbf75008d63c3906ddd2f69b194ad87279b308c445cc5a508f8a2c0227180d483053a945664be07935c3d10bb00bf16f8b34444fb3566a0bf04d0df57bae4bdaedb39497190f3556c51d19fd7353f41971cd0b7ecf145af628b364c841c6d99ded3d8eeaf3d12bedc1288585c112809dad72c3a1141ef622ca7cdcec4ad074305f961212c497d5e3da196ea4fa4b87e00ba79012d0914e225461a172ebf1c89cb49baccb27c31383893d463c2ebecbc5d4e4a2c3b54d0e38ac21b90c5e8a7dfd820d074d70f2dbc5bb1c3cf01c3d8153fcfe8e7768d801dc8904f5f2a77d0b8c91dea52209aec560413126372ae7adc81f0b6ae0d884be4298a59524ff80cadf0ed8b13804f9ee9a5376cc241d093b5d04bb43d01633c1c95082b975a7bd22f27878793d7bb7ab12a665cfc727bb4b30bceff3740683a3d17ab1a07db3e5aafece1ade5cbd1c6506e4cadcbf36a82c44c8714899b699bf1a88637b66f2c9a529b2c3875bf03b4d20e451bb4411dabaca8a03dc5cf031028da62da85bc971de37975f9f4d787cf24de9f236f7fa543f59c33b8da97a6c43227be219de69717263d78605fd8a262ef3bd56c1264c03834d1dff8cfd00fa49b9a18e46bb76633bb89227e609978cd67678572dcfab9405093fc8f92fa9fe8ea643ea110080bd1bb65c107c6d1516b5d8ec820abfb7948d8a91bccedd2219c6f6cb123ae369adf1cdaf44512d425acb64e3229acd232da5259af0681efec2a944ffefeb1cf80774e41f96e488f2f4e3d9e5252364cbefc358e8a3603e4eab29bb9362d37c3a0d0da615934e2d83c51fcd725a16454ca4389ea59efefb34277ab9ec678acd1c8bb2bd39db618a5816098fa94d3fd1207fd74b547ba1db55ae113048074599f588083968a4b4b85c0c84248c2454c3560c5910b455b2a3c58afd21f71767247e475082ab953b7e45f5524e9582465da05eebfbd6997e4f992b2f4f5a4db881c06c0a4d7d67bc1f89ea57781af84669ae280a0b005cb07592305274b13c07cd274cf89909791e90d7ba5677cbc703b3ac5b6a2bbc0458d9430b0f4e52040706b70b28e0a3d51edd8c334f4659e53ce3ea64c5818b52cf7a23b852634ae66282fed75974027c7a2fde03d72f33a0405017752da647fcc6586db16759d20ccd138705eb10887dc2b1bb9f8dde688f2e05b4cb06bf1f171dbcbd80c00711a3b064f5078878e0587d35072b00350cc416c71bffc577ba38cfe9e967af0126ee13f70d83e033a285c5d09334bca6c27ba71d4e8e328cd8a3824c3210daa9f7d9a57878468ee0bca12ef01190798b1a3ffc4228f214d449333111590d5e9085957caec71d2b76522de183abce98e283929bb0c3c32741a628e284cf4c42337dd292702d28e9a063b65193aa756b9b1eda37e107a249721fa66e0f566e236b042477cc24498bb8e115ecfca982a118f28991640a8502217a6d9af9a44964c5451f78eacb86ed401f0986db768170609ef253a239de19d036e78063c364888868eb4f10c2f1111fc102250502d7c51fe605aa6002b85e909bc48b02bcf7759d2e4d8c4208ae03b9c850bfd5234c496ca985aaeb6efd7a03c2916e8861f80379887ace64a8e5f198dbcc28c6d44d9c4ce7e529bc0ca89ee8dd376702f2b4a8b5c505884c3894d7888b7a620bd351be945398c0a85df348a5c5e1e617938bd8799b804ffcfcfb56b9466af445b4c140b745c255f69a6c79349a4c32a1cfd44aca486ff290fa160413f9fd7e16088e5304ff2428d209c36ddd3b0f651d636f423e24e3320371b8b03a12f390054ccade002aae2422e84fda2f007b3e7f929ceb911de67daabeded28e3995939401ab1ccfed6cb211e1fb8e9c187518c63524fef89127360f20a76c851bd7c98df9980922f9671015a120dd825ce4a4e670314d0d5923d733f64cbb2ae0954e47e2e5c9cdcb05f3f7a0d2b91111e5c1d641c654b3f12f543fbef36f58b32b80270d27e48eeb3d44c9987368972cd5938890eee583a4528daa243cb9d2ade01318176a1ec83400551d746c05257377d79dafe0e0d5e1dd9e0445983c947223a40ab65dcef9f373b469a651da47e74725e73d077ec8e6965439cee220736b156d504384abb47256734552ea69b7e3c8c6aefdfd39f684beedfd5addfe6a32c8563234d1c9b611a3e59682de7efc3f9cc9523a56e9d1beae5aacf5140103989c2fc295ad7a234caef29f09fb5e6c8108683702b27debefec2078b7bd8f30d63b3dbbe5a09ecc83aeafad2f8a7bca3eb97811049ac0b7062fe9bcfa42ee160a889461a9d8480ec0e816c7beda7fd032f960be7adeab3b9c8caec1322938b0c99fb87ac18e95726d3589a2bd914ee15614c8e2878ced75a91ccc2b267971f6206033d6c40842659c1870f6f464d0c4966ca4eafb8389cc5c979f83f208c3a8d5ea6a5ecf2902a3fdbdbe7d55b5e16bcd1e2d120c58a4eed2ff44c5a23af32a21eafe5274ae675bd202b1781b7b977bc458f31341cfd3a5fcdcfe4d16fcb1bbc71d36bb536bc0b41860ddba15cd57ac95a4ee5a80c2ac4628206b616561048263bf22c5ff297ba0589ea6596df46e90b8098d1606bbc0d8cb5c1374f38568380e479d9d93ec01835b218b3ed3b6017d4f146672bb16272407914d98677cbb03d85075738d915435a98ee133ada2bb344c77f03229762d1a06247fe9559683c493fbb80a63901fd4f30c9ced26ef9665f39a0cb7827a2303ac124d2cab1ad8efc8815588641a00990e4063113cc3ce6e48e056335808fff5bb61c61091b26e2409cc591941127f89df7548fd6e0a8fdbe87e72265b03bff47b848ce41d279cb386505bcb86e1512a82682e08f039accaaa3f1d821f8b8ea833e666c2bedb0bb1f41ce8b1f41b25704321c5dc7982e73cbee39979d9c8b07a7c1ad72f2455de5e6079621ff4397c95624d4c4e44f563a56fb85ce99d6693187bfcdbc7ef206e312f597f6ff9b4fd2ff8f234c3c873d66afc7ed2093f3fa336ca02f5d93830634cf50cec09e5dd3433f6de986aeab6a67dc425b6d72fd445846b305e31347b76ec7c9e7d26b0228e50bc1cadbb018cc32c211f40973cdf5a195e6c31f891c26d75cca0749b4b01b4d02309819702979098e58cca06f06ab16a7ed5b09ad5a57cb942e6bcc010428c38bce727881b00cfeeee52de91335e62b9b31c3c7e1ecf528d05502ba54c4e92d902da8bf41db79a83351565998c25dbedd2dd05c068fb2d08325c480095ba9da00320370fe0cdbbd9672169adeb1c5c013deb0c6f7824e796a75f927ba961c7da8c82de7a2a60552eb63cc2e7273ae33caa3e8c15def0aa967dab2c1235d47204ef60e8ac14ec39c36dc66272a09d368693d64e1a7d8548b501b9d64436f578cc0a91d7fa1ebcc0711a8a396a00f098dfc105b8fc4450ffc77fc1bcbfba6881b0130f04f78fa6199ca3e2ade1e464b2d54c3d9d36f3eb5f6c814e08db0ccc8a76b8fe0aeb85e22cc28c6b76c48ebc9e4c936c8cbfde80d50067932a70488eda1cc5418fdf0c1161aaa3389b47e3568e02efc6a8476a7a1c95edaf4cebc1693e46c57d739fe01def2e988f36c9a2d86089a8205a8f66a017ecd373c5fcf5c9a7677e5bb2564ef4187fd61ef230d5bedb92d1f3376296d6a1f738f8037c5425e256e2d54a054a277593a3698de56f2b439364c9a8ff736e74e993a741df893fd7fe589cb2097de9d4892cd0fcc27df14b77d7d6e2a4e32781d442a1e5c3ff5a487038e8bfe5c3aa06a8b44c53c4e3fea58e58c9d6d59e43f9c455e633b397bf3547d611b6e0fe3263b90fd73e503155d8135139d6ea9bceb09dfcbee6b68d518ef4833102308f05bdd9bf5e872d11da13a5cea7090c6215cac0eab1a07306d73731c952939fe242c1b2898b4ddc289d37ffe24a95ae4157389dc9d49c8b8f6244b2b55150a2b45e149a04005988b148c8820015d5117284e9fb3b9a927bfdbf90611f5345564eac866f1a22c833b2af3582bdbd6aaab9d683f4e45240ff7aa142329b53ecbe889501b987441c07c799f30585fe236fa0e10660b4c4bb9bc5daef4d047f0d4b9e69de3d5198d97343f303090520fd3832df14cf52cb583e3a6ae78a3e313981ecd011150c5f52546ab710b1d5064abd2d6e1a250b1e325e8dfd948e9b4635af7f821fb0f95e8ae8cdfdedee00b85f71430b41905ce800b2fd544a4f19afa98c9ba5019845343640308146e5ba8ddbe8db12775e516ccfaeef95d2ca8eb6b4b7c1fac90cb34a6f0fe87649fc06acc9d45139c4b2d0f4447a9589fca8468efd3465d36e01ae6c6a556df1417ce4da61366f3b4359e082c43f7832b46c64f52da8cd249d3c30163eb948199532daba5c35013f8ff5c0f246adba9cf79a03f0ef80038feb71211ee59bab93d725d11efff58b77a708bca225c6b40eb87bd468051d9028d183025c67c6b9b8e7c1907b8ed204326cc6ec953a385a8b13b532a145d74d78808b17360117c68bef7be55f3d8f9f1910d46be16b86c3f8d810235cee45e0945e111541407b8f3898c8ba21d73806765582bb4928b726323381f05acceeb205f0f65fe50fc70b016cdee488d459c4f6215b24f8e0f5e5dd2c0bab0a1b2adadddafbf6e10a9ff2ecb0478da5d73ee4691874bbf53af8dad139cfb2a97cc9f3b5be8edaf5602ae0f6b76fb911353420ad352d76693d5b827e4604f7d6ccc57556f35a9dd8a62b4676f062a3f9e7f764ca50b4bf98e15c5fed57208ec61e6aa52410365a32a65e31a3e93dede1b81ac0b921612618fcaf5137f0316924cb2ba91afbc3f088b3412f0ee0ea5c0f05c771a6c00f637c2ff4dae3abb303c073a4860960403e720c204e7f1fad39709caa27d337b3d8f572b435cdfee518661a1fab8e64c7aac1586b56135d92d04ee9f4d63bd516c0b8373841cfbc5d25c7e808eab1e4561e0a7a93ef7c731dabbdf6405a5f8b1bdd92a736942ca38c1eb349ee051910a27e10fa7b91ca5c36b8823aabef1560e81e719523f575bd954e8e7339e6bf5a9e8898e34a5044c255519bda83282a5114250c62d9ee4ddffa2f527888c3ac010c8901da01f4464842662a07192298eb8ceac5f06aacd9ec8c095d83b6fc4750ef763061710191f7f4c928bf0213922e17cfd6536e7b33fff955b81169749f1a24fb6bf3cfdf9b97156092585e526e78c3784ac03e78a6972122ec1f555c61ad2cff36ba604390421589e045a8d8b84c40507adf6880059aa38f437afa672929e0c3aab215180009ec6aac1beee8a69193f681eba3c8191780fbf1e20b8c2f1f62a7a115b98eb1e41499b8844d362555183c6e3eb8d203c692595ddf8712006d00f7be4fdc6b42c90b9d761a1a391f2804a517fbd31befa9c2c66238b965d8aaa705457bf331492926aa7fa412072f2a55d43b667c3572a716943480992cfbab67cba785ec4599643d24691e11e90ef8a5fe71226254ed1578e01342370d100a0b908d55a319bd39f03b5e4f8ef37e08f08132b861af9d7cfa2472173224eb4b1c38bccc3248538457c8053a530a8ae51adb598f00526cbfccc4c04a98af0306c82a11749d0aabbd1b6b792271985770eca1f4997a4ab0c6d8d5338515f50a40d8c8459d845a8b275a4ef9042e753d4f5db404563f4b071639572520742d9187634997d189dbfa0de42ef91b8763fbbb5b317d6ae28543b9d112125506f9e16be829ca297f0c1b3df5090a63763051609219350dfcf5fa94678abcd5be8ca8339671a17cd1c03ff374ae99f51bd1603a2fd9322b3e8e4cec10fa41f4cc756bc46f3a1ec5d0f301ed8ec67339f317579e66fb081581c28588ae07f415013c91c18fba3b17708d838dd92f789e061d1356d24ac02c0dd0d8d3ba44f89d5c8068e967ceb94889e3e9e87064450dbffd478324cf4270e13f38285755964f537853fc403042b298e68b8368f58259cd3b0ce9bb468b55bbcde7aa59f90b3b4629364c128dd11106a82541c474d47441defa9a7f9938c439b8a2997211d64c9642a607c27432e8c6ad1ddf089a30ec1f4509bc0c26b922cb9fd16c68cfa4cb6db18fe540352eaead0413a5469fbe9a65cda02c7ee85ee788a1fce28727b3a4e2eb0d320e1b568b040b8c4bb85aec536a096d12d0c2ad7adb391190e3a986aad53d1cc8640f6f42e1375e6a17673b6af547e90ec9d18f0c7e447f8109d111f3446b3c72ffbd4e54d4e95daf9d7b1e57a0a8dd50c5395789b2d50e58a0598d51e682997d6239a6235c1e3c1d0415cd0226df024a5d5a4c27010ab4488784b62d83eb2d66ff073183d34b028a101ff8c223eac5731199bdbb907c02cb845d3abd65008a26b44b5ac8195b12931140e5271483179949ecdbc3599abef333c0305bd4f7005d9bf6366428191c05f3399ce9027f82b5f5812e71a14ed8a77c4d0cd7a8b9084e4b95c997e3b4041a64a454ff9410ceba45f069ec5ac8f434dc2172e147c05c3c255a094cd68609be864c7187b95aa7c5ea772e295581975fdc8624c10bbb847b41986a1a18f6385930a229bda2ed9acf82e043662dbfb357c6bdc288f4f2f1dd9f77ca03ff6f0466b223fdd86e13ab702b56faa9a1d2124363f76b2e59dd73d62910cf27ca79b55bcd0c179e0a1eaaee09b3109ccfa525ba8aeb28c5c329b5aa16eb2b00aed95bf1f3d53ea74f7af1c0e152137d7690c7e59a8a7442e6505a20e556a8c6d0361215711ab69d2ecf02ca479a40cf4479b4d47c8e082d13e4a78a1fb250f3a00e2a7b03470a6e790f266847048d73c388ebbe0576a69a21867b50a56d3240b84eeb1050ce30f51df03facf240fc2737b75f20f8c1f0bfc00d985ab818a44c9c3b43c214af8684d774b88823520d9986bdc0030b48be3261e90744ad06447b62123fca6aea5c073ab635d7de7d15104668d5471c72af988a05676de3d14e2ff8b2dc947626ce4987912034bb469ec6d324f24d2e0ee99d784db08fe7cecf5b1a85aa0558531a752b115c0f2902828ced5ae075662a5715beb97eccaeccc5e2204c011cfcd0ff0a73b3f79512a78d65da5f2c448e41ef030c2b793a33b53233d8ca4caaed376b14f1439904c84c6a534eae9459c69948654fbe1094bcd09848c0bacbcc65289c9ad8b5acb7253c9e63d59047c13374ef98a28495f3dda9c917b0174726125df9f9242e258eb46ea183b467b38bd29773a06ae66edc46e5d3ebb7c30b5c5ba2d6980648505cb5769e37af64ecffc9c9fba4c3e1236ca722b7740ceb09f8f65017f45029694eb6ee9366a50715d36e507b1462eee151948956beb9ab25824611e58059e24bb288efb57bc0ae052fc7184c732962b75c3f599088e0b2145dee4b46cd260e50296eb3c4334b7da4757d30da6ee8a3dc04250ca2ec6158c4b39c02e002a30545b021a93569152362e60a4fce5e2b0adc835fb1fbc91e79c5d32e3bc4491944abefef218349fefe0615bb64ec6086ed398ab56074b98787878650a5d84ad8688c1a4815f5be54c546513d381a6e744de59086391621abc8062f4523f4a3ffe4e9355cbc8ba6455ca6044d64691c215b44bef2ef281d8a2074969fc411ce749b3f8de30346694764432f467d152053262610252f89f67f47204e3152dffa2b00d39b122377c1906cc63ad40f38e4bc1dc49a3606060517cb5453d0434545ea8e02870b859d2797991933fa02d40022fb9f4ec487b812a6b2c551656b6162d6ab1759e212cf2d42872a43e0e3ec372d24f37d0f7a0e6daf41a95c80bbff0e0bebe6488af7971bdee534414e3251f37d3ac799860e7f5fd4b5a093b152940a8b4bfd6a2994eeefb0eba935904531738fa657f40969208c7f7f2994a5ea02f7a8ec9d0dbc9c4cc21d7bdef28a753fb66440fd19f869495b0254b3fb5a76310280719d06aa424d6c656db36ca44013692b63648166333396415c843628f94abe19067717ddea9b9b8f4ec0f5173844da8ddb29f5b633229295c741d50b64d846a6919f798061e383158e3dcb2dc83e171a1a0db89c16000c92fb1e903789fbd75ee15ffdf1e465c35fff4364afbfaf0d82d4a5c1b64c31369c2a72b2f484b7b5c773234f066760f09a3b486519ec1804b14f5ff005528f40c6c140be2b27d7a87ad1cefee41d59701c540c5fe38cb3f408a28ae60fb1f489c352821e5f3eec3b983c7e84f070902cf36a5f0329dea20ce823e7d52cdd341faf293e4d3fca3b6b4f59a01d18d4fb3f0c8ecfbf3645782d48937c02f98d68dc1790220554f573186f890bc1748a4597574a351d09bbe7cbbb13eea38a36032b7520b900d31dfa05b628ef1c880c30eede5673e8ef87be4c7e1eb3e55b866e0a79dadd40aabd51e921593fb3eabad598bcd788bf04b2c9ab31c7e75d4e10c224a11e9cd4ba65f08e3cc21b01dc220f0f6f5ed04294f40b74bd946c45b5dcd841042204f87a0c9717aed7ab3d2a7e0cebbb3119690915dc9aca0012a7ef3130b7536e2e6ee58f192d5b0ac29fc0b596748b9540714395b971c789a720136ea2fa8be33155595b6d6d6772a90b580180f8ce6841253249b30222e85683a470d91e0ab8f4b70bc75d09e98134fd31aea8ec283a8f09de0a7ee68f366764003e7f76ae6ad0b9d7cd06599c9ef408b1dc97c52c82833c5317b09a78b3d65a375e56e4778f4b56e9b52f5b88efcba089e1a16d9a76bde1d1a2b4cbd5482a26a1aad7a7c7943776cf268f8881cfb7c09d80e120685fea9d962354b9b78278d0108992b8e7119a2e11882358e84b6a0ca60e7f372ea5a4288b6d51fb7484338e9e5e9c055cb4eb64f71eb6fa4a97ac46df0ef065bfd2fbc7191135d0314496d5d6f6d0d4ea9d15c51499160462b4659f6f67cb5066df22d47c1472e245c4bd146381a3aa6a735dc80d6eb96ee6631cd488ef3e049664085221c92cc74329a41edc4081a040d95204220ac4b61e7d42aa30e2a0e28860eaada6da05f6e0679e86e822c548782637334fabbe432b30e7dc3e7d8b0a66d3f8fb007fb6a188bf7533a02dd17b61429582066fa45ea122d13a8f2f60397ee7b184d750926b9fc28f8c4a6d27e452aa3b6a52f239f446ba9eb5507c1f3ab679afd9efd684f1845eed7a9da8cfdbba0bb96f3a2cac22efcad9e5dbf43cd628cc9c14b5ca529d572770bdd9507b3de01fc7ce78bd3b4d4fb9ca8ef177eb6d58ddd0812329467668e28bf966fb571cf5643c7faea3059afbc912ced37bbf97b964c2784b009f2928709a1825dcaf8ec062162887248ccd996342aec5b84102d5a6808ab3063cc6f35572a62e1d60575b5670401b140f2f797353a151969c240abcb8a20228c53ecca4065eb49f49c471e4955b3b000f70e0a4be99a45fd90938b70e66deacf1b407386deaf54dc40afcda5a6fc1ef220c125caa2b68bf22ebd66b1a2b164d048e9b91f043cd90b1eed4d2ef84b7a24dd553fc67acccf4008e53f6b294901957b12f5931b6ac2b113317a808dd0198c10ac51bce247a1bc793b8d6e96222823580bcf9d5e2f028cf6116b88784fa1477a281d1478ca9f35bcc636c3f7c5a281d85d147496f99f93eb35db15e8cc61b4d7efc7d2b79128fb569443dc1a64dc61fff640d6f6c766e0d12215657bfc6f62c4750b4505f78ac4e10a64a32fe686b7615b69c5c0ae92c0a22700f846c218276444d40cbb17ee03299ae07c477e25768117b896aad7714be3377a34a3d45c14dcb5d9f716d6a977369d902cbfce970841ffc4f5af51501f3884f3e731b1a35867322e79ccf47e886d3b51a4a280833144b7a5474a04d89b0964cd6901b48ca40eb973c2bf394752dc574425f982846bd873182f02d91024493f710e6c14c9b46c4a1c08594c76df400da0f2e01a8857bfb5a898582d00ae02214b6e6ef2c3454378e5c21489225b05db4ca9352e449d2f2eee4e5bdda8cc85296e8ac50286eae97a543630f61db0d222c49d757cc95473c494f063da26680a3b9513ee5830a644aad338cc6feaa84f8582bed672ae3304b0598e44f3afd3aeafce0814fcebc18e38b4355e87072329138114b99cbc3556467c8619dc2c96843a39cf5423fe3c5f823b705ca74b8e12b46a32ad5bb82ab18456b044bd7f221badef67c1bfa5b8b8486a96f32ee7604e8136b2d3b1463569c224fd5081938db3842338759a1e62d8975b51cb035efb896ecd57b988c9f98db4b8094598883b5774d6e1dee0ee66a529f4138a8b523d5f4f2ba775c60f15d6eae4df50db6d3903c251f32f6e456bfd982dc5d33e1a89a497b79b9dd5ab2b5bd0f546a63e5fd02c775124834fc825ca88a773ed052fb968884c1f2d86d71db0831c29fb86fc8f1f562babc4a55819fdc726bb5025497ff15f070fa2081c07cc1041d733fc712687c483b40499f62515e8b23b4cd6136430e1f8114dcf68937942d3cd88069bf34d093fd49edb71ae438b505b0db13f7fa85fc3c3f90a70a73c1eca04b893d396d5ce548a608b56aac3f461f3e1883c6b6145afade6c7d47486aff547ffa1e309464cd51cc8abe60b32dee670bf29f10c5d6c2f7b35403ccd563006149c698f491129f04805ab7acbd67fab2c9f2bbfe74ad21faa31db21bd92974f4ce58600d52c957c734a6dcfc42d1043c1063cac03d47808d022b21bcae03ecc905fab4299a5ea87db60ca89c75f3d0d2d6df536c884a9d4de24943b1010180183ff4cdecfdd7ff9241fd9a3f61ec02c3eec0649c7ef1927276019a35cc76d40bbae92d2ad134498f5c8291206df0f47f7da3b3add1c53e52f71b8b45a48358c0baf7b80207945d21a5a14b029f29c6c70cd2d0a7bdd7701ae00ec42ed4f9ca8876dbd0f5a4a714e3329225f7429d8bef3b3c99d5804b695a2a18d2241c265321802d0ca5994d49fd05fbc192997f3035d7f355d2f03040518916a39b8fff20832233f1f635301b10479b9428b107196bd671ad3c79b062bfbda63a66242763aea0c90d8f195331cf40e55788661425ecec129d767ab7dc62db50a9c6a84f3822163ddd55f8aaa6f9070b4fe71b9257f7fe4279840e06a57414ff1fd6f14506cb6ae73d3e82b04d2cf3a883b16f3c95d1a56046b6b242048c0990072ed398f2284a98ede53d156c3e4e8476ff4f68ec85cde5dca377c65af6f9b4c88d5821179841d8db743c4295d300d020c28541c4b5389179e5c20b3989843763fcc75f9d857f5e82e163c75dfe661eb532b4e5578532764f12ea9714994ca643d5d1029edc9baaf7000df0d511dac74852796846c1140f720ba2c0b81615470467bc1fbf81af2b421fa74f0a7b3097fa2f612a1c85999e5e965986774b936cebb08a1615d8f89af748212b572a633b99807a0de10d7eed93b476685f9203cf8e17dee0cb5b3badecc917645e8fe4fa6bfb31a59689760ed39378155441df9f182902d7939b78b6dc8a6cd193829dd2599a328ae56e931a69485f2420d909b73d9da4d84d927462421efa566b53b5228a0107d2fced97c73bee3e59fa9b712dd61f4a8197531e9224f95e5559bad5b270a3965b34fdf71ee4cb7b007dddc6e84e02a8610ddba6924b7a9ea6912e07d494c8523827b1894ba6bdb50e17f14c40cf92aa43dbd6a21fd9b01eb48157b87166b72d1c59ca7d6eb591d4bdb5a9bf96433a7e90c7bd05156dbb39fe5f73f3cea106fa4e084904765faae98450b1e28076b2fe166cc501fc13e348389cc00953170fb69d8d17ba463bd930a6b2fac7a720f214b0c0800f6303326f030a2d08d7d76b8d8702a916a057510362d2b2dd0484e9762b938f4b76836b77c4f7883706d9d1414ecff5c94e9cb8cf875985b3e26fa47e7ca633fcd83da2d6d97df527ce3ebc575aa9aef2890aa645f1ee506b4524da4930761a56a4536f3090473a97474df0f1ad17b5b879d385ba251ac5f9a5c64b7d929518719896832d579e0052db554ab831fff57550b9c2cbb03ab063933e05b1c0293f43044f9dbb623825ac23e12b1fc4e674f0098f1acfab472b1594b522515a416917106e990b8ce03c3c34091291c4e8a813ae3685f0ef1a98500f94308a1d756dae7cb2a5f6e658950c04e4c85a4be542a479914dc310bf9975cf4f322f5b52379eb11037ed306ebfa3655f630ce5fcc01e9f9c98166db4f5fe5e623db08419def7fa089d080841320d70aefef0bf2a4509736d4381f81925b79554291f956d85ec7962c30373e2240361958d5fedfd12f05eff5a5d06742e4678de72102b8c0549b00b2d21fe392bad65083ecc6012a327240bbb1ea6a11677274c30acb7e1e5af74a3b836b195388c735e1b1f97a0a6962a55d1d9f5c813896a7c0b1d1625af4bad9f9cd41c8c43d778dd373bf0f9e755d83c2a86a444a63c997ad0447c40f54632fd0670905deb60dba56a574d4649c51f7a314de94b19759f6c873753408ae49f71aa7b714329dc36bc202a6e976d140ff3529492b5c87246bd7fdf145c56e8408bde28f1f9d5e9feda39d0c5b952a073dff8627b7ea805f9d57b96121966ae616751879a27bc0cd9e7671d894aeb0148c3f6c6b94d53e09bc35b44753a9e4d775fb5eec89dd14b66cce6f65938355d55c0c5a3ed5d2d6ba02bf1defc8d29f330871c5200e9ff49c4ab5f0ff17159cc96ecfbca8520672cf8c917a4b5f3c632e862609f695b774ef219ff7bda407a08f15b0f75b81247dba1dc1dec5cb247d8dfebc17f17520556ada65aa06d490ad59fb8e6c49a7d9f7736fa4af0afe222686b141fa0158aea41ad1e8706f3fc1692bc32e2157c2a4e200350c06651d176e9f0fa304d0cc72a4931a550b6587f31c7c54ed61ce0e010efa047a58c50b2a57fe8b70e481b387e37da9976ac9850bf24c901ffce85072cf5865dac2a908f8b882047795b8bb78919c2607f8dc3c5a718887f70d08520dec343fb623efcb9f448c1550f07c1ba075b910c8f916b65450faaec150dc6c2d3cfa2b56776082c831e885cdcb5b69235d4497e65fab67bf4ff8839ed58004fdae901f09aa887e147bdfbf5d65c65b1999084ba0f27058139ea1e60c0d37cd68948194b7c0e8be9f585c64bc6c5100ce9b7a840c1b06714eb6f7f4e2cacf54326a33a49d6480b3742d5e3554f47ff171e187c51eb6aa0976ed496cdd87ed71aa3598c8c8691360e181bb2247e3dc863f5cad877b7a5eb97135b53dd7176d7dd3006d41744b58b861f889eb4468750ee73278ef2b21ca1d5950073c1e926da58250b7aa7d6478c4c784f0bed51d158f0ebe6fe26330b56c7d07eb6809de72265587175e8cb17e3ce22a05ba4500e543f3fce8e5685017928857d4793454fc5166c922f2cc327b8faa5825437b6d4addab460aee7116537f3cc418d47155f41b21132578edc403ea7f62d4e58567f007ff4c61ab1cb90d0cfaa09a8277a97e45a8b6e78b162a717221af6fb13d515431aaa4a5f1ae85296165a6ac3363d61740b3ab36e1edc34e8e73a022d724bdcd3a980ffab6e1de5e3e8e1ffa931f263d5af061e1e56a83d503791bfaf1c2711d1ee8280d94c371afa5baff85b174653d6c875dc2a9e609f4484b3cb16bf99bf630eea650ee31b31e9bac271579a3eca32efc7bf5eb044ea4589c080ec20ee8aadb75cb7bceb7cc6890a3647ab4a28236f08a7d7fd1d82f40b82a5c231143f6261e17307c6095423d57bbca23bcbc7c95d3a72d2c35b76f67af91ebff4e8dba568c277e13978078944ba48ed8b8e1758a17236f7c5dc809936a37e564f8c8d9d732019dc49802a5ac3cc039dc8c795acf1523141dce6eb6e9aa19fb4f72852806595ad795a88ecb557e5e7d3ec0b85d692981b1d577d4c1668b822efd5c3fadd2f4e82fa47e701e65100a11d776c292f27656edecd981e89245be302bfa8e5e81f18bdd1cba40a5ec19656b02e502fc18be709cc1699f1afc16ca9353829eadd98066242e4f88382bb879148e9da0dbe338fb7d083b6fbe66f3c816a3b20ff266889bec9a43932dc638867f85e655f1384c923de503f4c1af2afc68a0a1fbc2297da0d7ea3587929a9d2838c8e09a535aa4b76d6a054e267e3d9132bbcc60447606306dd0ced5c386721e0403edb3d8dc2b64d09f9a239d512b04e0d6b3814196502292a118021364eced07821573f4cf3da7d6ba94ac75a1087c6e7a78dcfe2f8b87741cf156de9d449a58e552df95b6cef5716428b37354f98f62023887376ab4824a55d27b8852181028d24bb517f0fcf60695aa465575b7d16adc11954f650496f52d24cdc67593ac11ca4291676f48fd23a342dd4b685da3332ab5f4991be8a6c6e89c9df6ca31467d49139b90cce8c4d4c06ea3b35ce854f143f1c03bb7596f7462b25f9c8262d49ad7dec663ab49a4ae0fb0991d0a35b6dccb1f2e7dd5be6ab4a33f302331fc2b2798cdde9b71596d2319478362bf842471b7ff025bed5e28ee6c509cf363e15bc4a846241b62a212c39e895aa38478592d1516ee7b5b95c1be73ec1f5a1285a9a09879cfb76eada1f960f23f59eafc89555a69a21babf1e5978eec61b5c6a626d0c22865e14d30c6b72ccfb049de909c0e5893bad84ba0b090495ebb2e3f0ab28a5ca4d2ca62b40030a16c9dffa9136916adea9c9d1ceae7038e2ad8d831a2734b87f0d7b2f6f4358785e9723027b308fb39385b8e4763e6e67fc9b5c8ab22928039684407cc98a5e7d37803e6f4c1acfed4bb1c37e5cc1963d3bf4c743c06633c68fc7dec89c9e05e61073b5a5d4e9398ddc8c7e0bddd5f35923c931b3d44372de55da5b9506a1ce657a24645f93b58010077e1688aa9cd85404b7c4c61971ca5ed1277364535c2de422f01e082a74240677c8e6289f66e51350561b86de8f2aa2441913567d00c7aefb18b124e53ebf057edda8d7f188b653e06ca313c8ad9d723b8fb32f1a27bedf5cbfb6e1186c367a54d0fd303d7bf0f4898164f49652ac71e0b38f0052b202d93218592a76a96372ce426b1b60e2959267c59fb08dacb26e24d24627e63b7bcf632f6d3d75a08efa32707fb9a2bced37b22e81c2d9d97434ce3a6a7b0ba434fcfd6017949e25e117db16365681a49d5cc4fd7363f520380e6a37518eed6759fa062b811c833dda6528674c0ab7c2be5159a62e8c2abede6270149c965c03a01456f581803ae4773547491a52c8b295504bf3492ffe5bb220a43e1cb6001fbc75948f49ce875b3e055c1fa2d496914d7f49e98e7a1678b2351aba528ff14a2252a6c753bffb0a044f76e813b84b0538fa1060144887e98976c9eebc5f89bd03a3b4e04b68088230889623d728f9096b1b29f97066974153456f15f5fe6aa040ad4df7ea73fe6d737acb29cd20e0b87b158d053836670a23b31c6fb27fc13df39f906dc7a7289fba17c1e3b5d0de847b97058c6799d409d78a93f441be76eb8d0719639cbe3bedabba07ed830c55704aa1054e6c08b7b26be44bf6345fd8bac2094d383bb1863e625c538050df18cdc375352f06e6665313d6789299d5692393fd1d468ffa8889a866fe5a6f9aab8288b89f68889896e146a7427c5037697a0eda944a3f4cdd0d98c308fa41d397ca52fbc7d653a02f5b2ea7f08e00831546719dd025a379c9fb87fa5f1eada8d64c1c3c8e43ff861a331588160a9cbf19027d095e9d4d98f8aa358f23ddd8b598aa89ae982d8431b853aaeb7ef0d859cc9d62c7e864e4f771efb18144d34e1df75abc740e2f84820a387f1042f21e3985d25cf354388f0b6632d949cb9caac901631b9318d1e92e7f5caa3842bb485ad398d724f584b910b4b985c743128953147c49ed9329acf4cecbc7ce2673590d9263be40a25f640c19d3df2d27d04cf07aa2b37eeb8a6cc08ca470b6385b85ba5be7a19702608ea502acddcd01486ffbfdfcd5de33045c3656954c9ba1be85f4f2060fc9faf57042bebbb7633e167f2eb34e47e293714a51a3341ad46252a6f6cd9ef476d3de991030cee72ddffcbc953b68367e287373fcdd7cbf2ac1b5a22d8847abe6ff29a7577d09f8bb8c0becb6fbb2220726fdf21c3deafb67ff65fe7ce1f4e3867c8a6a818eadc00965592df155e94bac654d4c3acc5cc779abc3dfac21c553dab8f72515a061bfde0dc546817b04189831efcb38affc2f17725eb6c234247ef9672a1e89c83791321e0852e196ae8094afa8fa1f5152949fa0f8bf1f9f465ca3a994d33f7b8c825872c8dd086d3b38f8d1f7874ed0166668a903049ff5ae76fd66343d5d093fbeea8e8036d7688ea6cac5bef200826943caed7f0811df30412c11fbca212782af7d19c8e913e45b6b7b46888e1997ba42e8592dc03d6e03f03078b42aedffd213bfcb1f592e4dc31725c33e68b7bf48057fea93548e7bc4f65debc9936efbbdd883e40e025bf7441c6e357b4669b008202f61ded44344c7d0c8b5e9c9068beb6537a4c2b2c3a7b49ecaed3414fc8d9a9609b38f623b0d14f1533e27264ffacff7aeea69e0339abde8a9b82e4564bcb9d90a9251a35217dce79afea1f3f4a311340915afa33a7d4a5bcf6d2feb0c2437cfe7d4a5f0d938dc078240d38a3d9b7fed5124ccac30d29f4b09ee7c0ce7ca317a3e1cc91623755f112d9fb510669083a3f20341fa0ea2ba4857485f7ebc7069755aa734ca69c14360906d9164d84c5fa62029db6416cf029f0e7862ad9d025cfb6d1f3f11bdda828310ce5ac863dadcb615b3b931a364b0d34d101d9134bababbbb8273b3e7f2b9d411f2702aa5b6208df89b9317e2d9541c42e2ee339f4988a49fd10310c3b3562775608f19145b66cb5c34046054878edecde7831cf2d8ba59f37467a525620f6c728434484dbbb32cca6cca8fafcda45078c2d3f2b3f27bba120fecf4dc575610d4229a0acc7f9498cca52a28105ceb7817f358f7db4582d9aaccddd98f5638ec5b1e45cbc7a86ba177178e9ac0d22d536df35e5d983e29fd24e654a1e196ccb60ea7c46efc720b94b39d0f86a0fe526a68b8cfb085d8c81f5f8dca0aa9efadc06858e3460e8e18cfd92f6dd29037017899a9b7cbe2a88f623383910d92d5c36579180ebdc884f95ca153a81e0e27eebfdb6315bf4bd2e9fe78202ef21cd02d1de1283fa8b8f07b76dd4012f09cf85d141978e4c8b0ca5c1ed57f5097f1e580b71a9ebd63bc907d847a4f233f60ec5aebfb7d059840d6d6ce2ecda2975ae2459ad4765098b69d0040c23db036a54ec11ff7cd04a06d50dfa6fe90dba93b3a37e47d1dc3feaa34047122dc329d769ecd06878ae8c1e912f0b9773e1fd2138ae19c70d3dcae23265eb67005e042d415aac143326cdb63c3e510632e5ad72a23fc46b8806810b02c1ae90c6054cd09b4521e61b7a606ce456d8ecea77d1064835b88ae6eeba25c81c943a21b365d98dcf830b070d590f74d5c20098ad43b984220bba0196bdfb4bc9beeaa1088ba4d307ce6675b8f1f3b96d9b940b82cab9f7f592673bcd4b6b4291ad1269c710d9b8b0abc45ec7ac7a85a2560a8f3494432a8bcec00a73fd92046ec9f35b22df7c065b2843bd1a0c3284c47b7c1d47437a70136e0f2040bfcb761f6f148eca114cc925b37fac8ec002a44d804f0c470fa8498ade2733158ab1b913c037c87cfb4b92292f790281b4609bdadee8b8c8fc23ebc390870bc157e6cf8e17303148b2a60591679d76f096378cba85a15f07bf357a085b825fae9737804adf64e537426242861c1eafc08e3eac8380ea3898d9d0a553f53374270a4be45a7fdc088d3f8923ff4f1779cdd4c2ee98926b855985b13d1fbcbfa42eacbfefcbdefcc464e88f56aefafd74314526e408b3b23a434c741706dbd60926e0db4f99b7d8b4b8b5e2e2e2757c9bef8567be60500096dd4ddd53b0be674f347f5d224f569a8cfeccaf9e80dc5125931b737873682cfc43a62704b91964ed8096c527255283c3fd0a6b8f6bcb963380a91e2b085e8dacb81e6577e54288f8be899b6b1f0c2a21672ff176dd1574d6bdc98ecc1848b122994e7a6edfc8d29d62d160c796fd3e5fe91772476be0d676724f5a27007862e0764ef792c8e8598a79ff4157d57e80756e57e29a5cd64ddc68ebd43255e6f8c3cdf60f548f9f98c719bd7d8cace6fb37df13903322e538eb19a8ce3e30a37e7341e7e8c511a27ef302814aff8ff40aa7f1e8d96f10cb4991815fa9ab3bcf7cfda0c03adb5e878ecd99f3f40d31812b34e8034a5bdb6dddee350734a9f6ca88648f63aea30722ba410a8cac1f7a58ba319b1c3b04887e23a85c2ac01397ccab62f1102c705ee10bb878d86b66198d5550233ff8f2ed7f3e22d48bd800cbb600a97fd1bc4adc162050330f7b1942b6f0b499d8e423d03e8faba442407dd8ee0872cdcbfc15e2733dbdbcfcf033160c6c9f6384915ddbc2284d5aa34f025ec1658b221e9efb94240b3ab170e633ad0eae39ee9ea6cc1898fc0ddc662319c322ef2d0cd714b8131420ea6c8cbb1c94a49cc877d88913a9a084567aec4fdc0138b601a8a7db0d8190964b867da451ad845da51ff99fa41493aa927000cd5132b0ab93bad88a3e68cb42430c0e3d5ec93bd91f43b260f983936f65cd1a9b4fb1a87ec8ba3b1ca85166cb9e1a4ed2a5d15690d94e798e1ed24f433dcae76d72e5537f6563046e38ce709ee8b2f600e89583feb492df6f42aa17bc3cebb99cf97832c72602813a5067296e434506ae063fd5fb0b731de2e367a8d130615c9ae86f884fc60e89ec8c8191740f861cbe56dcdf5c21256106951f651ecf6f1f34b57ff1171b763c1ad4ce936068752926c5a4845f048c35a9ed64adce76fb7a34ecb35d5a12c05987cb24718576a6f9b78268f6090c4e1a85c954b504bef34f75227f67b8b06801201887692945936b93851fae203fd54d1e11f7c24334c5c50e5f79cbc3d0dfe7a8be447031e4d00526ee6903409191faaf0e4cabe006547bb64060fb846a21a120d926fe4744941e8034d318e46087b91129173cd765d36917878797c0d15837fbda0fe2206d8ec71b265ddbe4bce9bbbe9387475ec2f2ef1302f060c48db264394fa80ef270c2c09da2d995d8a00a4a500051ecfd06d6ee59f16cf4c4308562021ba1091b63506e4d2496cb0f8274e49b96b4d120e815bd508efe975fc988638e3717a514a238e8b95ec5d6ccf0abeaaac310015763c49e49f7b1886b81f46e1534fbc28ca796b233e820b4fc0e6724bd8614055de6ec312dcd1760164ba2690ff3b61785755c603f7e8b15ccc2d7a5585124895786f69755437f6aa29c3eac0666c1699376c0b467a1e1ebf175c07b3ba2a2cd3f78910b9bb6a564d84c1e2782c73a5422c980b68d1e6dc016f0ef1156bcb41782453e4ca77b2ad3bc2bcc1596fd3ed4b0d6f16243c14186b4ca764df572edf2c3115afb12f730666ca0071549d07a2ca3ad2c20a1fbcccfdd1a6641edb2d294d819b292a5e40404a11af20b65ef638eefe150b9bf5bcc73317a6d60e410417724113a629a94f231d15aff1caf940f023b08456a3b4e3f780d08d93bdc58144dd3a3afc3df3f96adaa68d6a4a0005c1ccdf1163fceed06346eb3e622bf2d62388561442d825d597af6ae31726c156a8121ac9dd171d390e74603481852042909bf596f7187b76cf6666da36c899ba466965e802722751f6997754bc2f372a032a09985ad2428bbaaf6d81ee99c9bef3019c6582974926721629d4321dd289fa89383fca693a5d4bdc60555225f11566392ee259c6546bef9ac1e26b8241ad9846efcda391e160b99160b5157407f2e396e97bd163c9baf30a45c887cd6a4e1735a675374dcfd364c1ad5eb078d511a9bf493f7d54089d36915d74a6bbeda99c742e9f034b5e5340b4f5e791b6c987368b5ca6c019733258df6f9f3159d2a298a5c1f76e51f152558c1e5da90deaa4de403f20ee8f1ca479ad61394fc810817d97f9cf52eff06c2e037e3cf147f783ca5a20399350d48e50ed349958706f4bebe6b9db4175efa1016997b88b4b7f7628c6a42c62377d4ebe88c84f9401474afd9b490b760096ecd5d7fe9038a3eaebe08913395cad829669cfe05120df11339d3ffa978aed2e7ef211f05e2d26e420b6ca07f01322c7052a441b5aa24f1223c9a8def535b541e61b3f160ad3494afcd2f092de90a929eb9bab47a078009c9a53da0a2bd6527e73d000cc5431020f15bdd85ad5f5d2129ced3eb02d40804faa7fe885720d8dda80369d5edb5b5d45d553aaab4b34857914e13829bf64654c9261966fd63dbb691494363e6017c3f98d1b15e5edeece10d8040b4c6778c09a43c6e7e1fa7aaf3628aceed347072e5ff219fbbdb6eb9a59432a514520879087c087eea9ce0a6a445c1f6adb646981096deed8f665b8584a6f16f42d5c27611b2c216bab86d04f903a6f17fa24a61a908314125b1e812854419e1524b1eeca0422f5819fe42dc702e41d29420694f6cc892c6b54ad2685325699226699246a9a449daf4991e52b22e30d8d662adb6baaaab6d1549b5aeeacae3f16c9e0d06f33cdf30b7f1ab43678b1677f7f73c1b0cb66d2fe29a2f01a102583a37ae7a3e9dd753708dff9848645c86f4b819bddcb8eaf974de83de4396fd96224c11c66d2d13c6a50dd63a302947f877115edf3dabd94aa705defbafc0fb929c9070c9f361618844d28dccdec85a4bc39ab061c3fca3542ad7612b58d36030180834ea713344448406079124e9d30e188c460d56b163e4c8dd1d6bbfdad5adae358abcdbad180a75b1eb6a5723778cddeeeddddeddd55ae337e21a04704d02c09273e7849db9e1c80bda3a49b86646847b708c3f68731eaef3628c317a3778191ff24e172758c162dc7edfaaac51322b4c74efdf5418879947f7856cc5ed77cf732d2e75ad2e4d66e0df4bbe3086cbc46d3c149740385c86351249b09d4885091eb3f6cecfc8097b03267e2d73900ad3f803a15e71e71a7f990c060624ea71e3a00f0789d0502409d79c741c1cc956359e2063c7c8919bdb4837ec155dd1155d5b6f5bdc6273fb8e91232a2837d880ea27351d39778cd0aeebbaaeebba91c7e3f178b66ddb647c61258dab854bdbfb47572475ef1f5f481cece872c51797e8f58f57b024e152bf0cf3d35cb3b9a060d9c4262cae7b32f8ddbe245ce31f4534ae112e11e13ddce0bad7180cd40ea9ee1fe216a554a107a771b1ca42e5613c798d0ab1f5459683f20b232b028169fca7a822ba8ca476767676768cec189131992756d7bf8b1c63c766ee1be6888a27af79cd6bb4298d3436b7cf9b799363e40608f8602f1836e98d83a20c6d05d7f8b37f77715d8beb322e39b3d74d298d1ea5f1f361c2865e9bdfb2ce433d2c8049fe8ab02b768aeb2fb6c277380be622ca261e06cc654e664544b93e856bfc5532559b1ec60e5f1897d81f423737b55a4be9cd4d942b1959a462c7c8919b6541aaa591d28d6e3146598c41e246dbb62348dc464712f7bfa1530da54f5bfd12e0b569c252080a2023043861fb23c035fe096892049ac63f2626f46cdbb66dfd59c28a98b01bd3606ef464700ae4806b74b0b0bdd1205ce347e2916d6b7074c453b64ac739d8bde5e06f44b02d16f58a25c44a2592a12896bd8f8a0de5f57fc5183932f39c71048140111465deea6696f10517da8936ce628db19014f6891a0fae472aaec71d5c7fa70293dce5059760de7594f418a62937de755037a61b0f836ab2f12124ec0daedb8087507c018b715d72b1509c146b4770c913ad78ace2510947177089bebf6bd13b3c0b2ecd8f43c47c1881b81e6770ddb770ddade05db8ac068daf26f385f5da982fb432be6abfb0ba565416492d93c9643299cc23eaaed55c2a95ab93459290982c268bc9e88b40a2be5d8ba423227655aaa642f5e3944512334f8f3fd0c1ee641de8eab8fe11159b38a97a17772e1e995cef40d1e7274e0ff42010687aa0771b50bc71e32b358dff87f6c37ae383e223c2f5f7a468015ce3ae831376def0e6d33961411fde88e6ed3e9f8e54804471072deb9aace6aa2e14eabaeafdb82e8b3c445a27eae1b2b26871e102e3bafb8c2d01d11ea66c4597c4e80ed7fdc3d053d09c5630cdcca24e2eba2f9c604c19d7b84c76c5f0316ebb7a4b1458b82d8bb55a3b57aa4872ad56b550c85a97aa5659fc0212c51d8822155ce36f43f4825445528c4552e401d3f8fbcb5452ace213abf88395cb7cc7bd10f90b2e85eb1f12312b20f4285c7f1b9ec5f597ae488a3d341598c61f89d00d6c105f1012030b4078e0b0b0f2146b2e03c92c16f1e43b91343defef5dfc0ac699a0f7772bb8e4bdbf37a171b870a973a7fde876f7bc9bb255e34857f3983299ecce952c9298a5cb5ee9f23dd0099826922ec034fdcc85aac4f60c9a50b5e84700d3e8d802f37e25ca0f3d97305f38616044de4724eb47048e6630c10e07db656e13c618ae749ec700f7f1c3217ec4c1f3ce3870384cc1c1f3f1dbc46e33677ab673eff992f873df4cbf2989e7e337d3df8d0ea6d932a1feacc5c19f7b8f28b6e787c4f73cfdbcfe84e8bc203ee7118db866bec80b2b67cd01ba27830eb74e2bec0cf1bbc7803ff73fba796edbf462bf0621edcdccd03df743bae7be2453b64f12bffbb66f48f749fcbbfeda0bae9913fc4449b0f2c38f1f2b9d5e417e118b11c6cccc393723b0935fd8f62f5ac618ed17b20893524ae78c94ce58a3284e4ae383925239279d944e49279d91718a413f4797e3e278afdeff289fd2b05e19075d7a3f64cbfa23ca3869d41fffe3231cf4c3f81f3f5aa07f04618eebf30bdf47a5df0d78e76de639a2dfccfce49df7521d599df6ec4bb7377d79530e02731888d1859629877e620b2b35d394fe20b46ea279bcac38d8d14fc77d3892405ef711b5c79670a471fc8340f3f8b07c68cbba4262e66a24a46be63595758544fdbad63ce23b124dea4d6e5bddaa9452d64e344d94f2bb691e1df7e99eb0db13f673fd76338a10c491f02f1d9d73e33e54e4ad22b8a6ce561e0e085f5a1f99f191c6e9562f41eb86c25a1de9a6c56677773a2708052466abd5aa6e72dbea5665e5a4a7fb745252295b5cd33070358e5361239ae8ee09dbdd2f36ec58fdd04f9d0bf11c36b0f2b7207caba856d8a6545ee148ec0bf300c24a2965f7f1401f2ae26e75a249bd45d3cc20d038fd650b246efcb8ea2f34004dac5fd07b272f3fb8c2085b708107ea09d1017da148131f86289c564ed8b0b31076166ef4d30d0f3c73c2e9e674bae9d837ce830eeab43ac9205c43e794f5930506b0894dde924dfc1fef47e5368e9bdcdc56ab6debb62ae20b12b1e9745af9670389dce48992f4922378809972682780f083cbe4bd114d0a1203a05bb17d4d206f2b92dc89477151e1aaa8135127073f2cb6d5dddd5d02a6f130da861162300e8ee6e18fa3c7781fdedf112c4edb5fc138f1f4a526340ec7a5fa56d5ee9faead8a8d53a479f8cf4e32ff22dea73fedf1ccd37d8ee3681c1dccc37b1cf7f3f7e339734d7b4baea91f19e3c74353b85d889c71ce3a6b8c31566baddbb6515a2bf56a6dea0109bdc0355d802fd4c5ce90f7fe5c158d22c9fb66601a7fcf62b409a92159d56ab55a0d0912d0ac999bc66ddbe846bbd25ab7ba511a29cb91ec1163947d7a60437f5db7c1e23630b7992f63acb53d5c953b2cf921e435aeb919f5b8d9116385abc562514ae98e118ee3385624b1228d1cc755aed46bdc7024bf27d890778cd8e047dc66bee7312e51fdb07212259627386d8a5415ab2b602f07a5d36f918dcb5e047c87209114a35061d5eae08dcc11b13833839b629e394cc0e502b00da54c30e81fe2b83ce399bf654cb04d2bc1b4e536cd9af14516ad3355eb9c73ce39e79cb3d2a9044bb94b348dcf280cfafb84c2ce26521e45b3454534b138a8258c1dfdd01a2362138d11b949cbf5a781f58471e6a6985f718ca84d51c4b7e3e68d11b1a9ebbacf526b4c5f4f65c399e2b2d5ba6d33156933254f0e42e192d499a82e369c29192a6eb7613bd89952c2b2f763a6666a862849dc828242cd9443ecc1cb04c31022e86d94810fa8dbac3a6d0dd1ad6198a908fa60449115599755ad0dd56835b06e54b061b35256dcc609931a9592af48aaf1345054505166111316036b2ad11525b27c60c39992f9195fe39b9941e667fc4c7f43647ec6cc901a1ffa1a1f7adaece74b13c988362eac77e04c7f8dee97097d8d2f898d0f7d1200fc8cd7c144433403fa175e07538c6806d4d9108db62b581a2ff322206c979a9981c6c73c0664bec6338e1a49313ff318a8f1386afcccd7781c684c1c1f80c7c0cc0be0c3c1c6cf7c003e1ca60cb1f1338f03001e47674394d3e30a36e66bfcccf63a98a82bd208d1a1b0176d459a0304615de69dc6e733f38ee3dd0380884d315f030038be991a2aba7d3313a8bfbd0e37462aa22219dfa21bfccaf8220d9a074c970bf3531416b9309f13ad28aa60bef8648698bff14362fe068d2fe6852f89ccc739d113cd10b1292462538c884d34ba4fc83fb1a794dbd0bcc45a9c39e82e51110cae710114d7b7309b8856e825b8cf0d67ab8b619022184cd3c91b9b0a60cc142db2680e7adcf9c2ced4e748e31aff2e78c76bf1e435afc51d445664c52cd189e8839899a2551c74eaa22d185e60e387d479e0128dc6cac2c1808511f31d644b58a99adb8491b5a2d1bca4669309e54b644d9f59668a6be60ff38a0c08312ab028b10897933ba33839588b446898a9ae61a68a843cf3d08ce7be980f41b7f14d554ccb66b4ac4616685441e6eb2d66cc142d66be68b3fbccd46471892fbde16c4d29b11559363eb40c7470816052a4451a6f9cc8126388248e60d03fb23c92a612ce510c26aebfcf17d7b87baa65911669916524922218318c9d1d76967891365373ced93595a231900ed663f0325fccddd2255b9265ebd6db16b7d8deea768264b15eac178b158233078d98e233b789dff216d7fa28e30b1bca4e4996cb6da4152e6ddf754ad45056556ca122595226a7b82eafc89914b11536942c09939fef1e1472ff96b0de9a7ddff711c99688e5921549202859208b6e3af849bb9ab41acb8a8291d4bd7f1a003bb0d3e2d545f4642092011aa41467c9c0dac2b66ab74593ec275b9dcf7c06f35d0085b2e059afc2071cc00de34b1ee086f1d53188e8729b3006115bad2a31462b3706c125d6d7856507a713969382d6ba6ddbb67d88648049f1ca4bf67ac5dc30be5876854932ca8bf5928105856be2a64567b9fe339e39a145b9e2379e20595c23a3482b5255a0a638edc82bb8c6d5b1497f506cc8b4193edf3d0628066ca481c27e8e965198c65f52b92e81705d5eb9ee4956a758ed4a75aa53f3c5f9278339e7fc7c3e1f4ae9a4f3f3f97c4694d239e7ece1a4fe7c54bbd13c1ff77d2fc4396984b1c562b0d7bffe35e7dce6165f91f4953a6ccb84f29a5aaecf2ad79fce6df3bef9482a116167fdaad5da5048b6c00b03171b53602b08cbde6784f55fd5d5b6dabef0b7554c4d1516b799b05904977670295eff199bb348ea3e04044ba5ce28dcdc895ed8ed89839b152cf7d2003eb0fe7c398a2e5c6edb4c96db843175533eb5d84272d30da7943bc60d638b4b7de327aa41c77d463f380f88df6d9b1f3d2022bf51e55dc04d311505dbf160d914bf7faedc26fecbd5625d8f22d912c9c086b235a16cb096dbc46f7be2a02792810db727dbebfa6f5ad8fe30a656a9a852a55253958ae08d2c95c72a5315695cc776cb411f4f1c74c6e2e9e964aa3a6f015c5322029ddee7864bf1e30f31753363aa4a3855b2255b32bb4d617bf27d7860a76a968a3207a74a0a9646beb6205d30933298491acca4103369c42c0bd7bfb1c0a54d62c134fe52b8fef10bab85eb63cc18bcfcfb0726c9163321f55442515a45b43ad58598daa61853750256019b80d4af2879c0530906e36a3261c4759eaf364210aea726cc55515485a52fd9ba79d5dc6e5dffbe3245ac8a9815b1d754bda66aaaa6aad61d23071dec566db1cd0710a5b3810c0b103b302b56acc41839b2a7eb4fcf6284c42e0a892410308dff16d73fecb8e6b8c8c58e8989d93eb5562bf7484ecdea2aad9344d55250fe95db6a48786b8ee3aac771713aa83f346a95c2073a34a4c43123140242103233ac9db36eb14306084a2b5be48832bc1ff17bda281f3737a36ddb1a4581202f24923acfbbbf17b93d90cc2259d56a35e7768c7adcf8e01a121b4ab89b993bb2562a5b69531a69ec6ddbb656b54a35a9bb8d0eb791e2a43afb32bdcc39e7a451b66d71dba20cafb25d6bed6d1b218049120c491bdd91478475976b676727ba7622084a54241941a15ed2a6132e3d719b3058d2e4f6a11f782e993b4c9611ff18bf21dc9784fbeee3fe685c03055b7feb264dd6228df770e9c541ff3837340f5f010b1a87abbf936af73e2f22918424d2344e4ef390bdbc20c9f97c5efdf9ee4f0dc9e713424237d16914922f36d08a741922631ef5c8018670442dbad3f5e8d445b1d026940965512b5445a15c7f19455068c1429fd0551435a1729b761b896a169394db44978c0f36152342511445538d436920002736a42852acd5da900f360036a0a9bafa01846f7f32e5a05314d7f8e7bdbfd1c38b75d74db90dcb1bb24c004278661e4fcd43f3ec7864d7ff46b760352600950d23ab968a39d8b558cc16c164c5c513a594527631bbdd2dd7bbbb259df3935d8ff1c186a35b639ea73dd03be84b9283a9c240a02f097d2501fde73b8f6846f4cdf4c3b4e787783c0ff32561df9e7b1d4c3a7414f5c2151b6759708d47591436ac308a1a82dbc022699afc6bcc6d7a78b15dbb2145f96f35b7691a4579fd627ab0ed9a32a47bef4bd2d5ee874d53c21ed7e455589483ce84a6fa0b47280d8091c635f091c68d60c31fc51b273676fdab169817fb1702312708174ba5891bd22154081136e458ade2fa6701a3281445511445515477b2f1454a29fd7a924b112ee1b8fe466c9032923a402bc235fe9f13a4eccd49acc52d77cdbc702b553ce65dfcc51b07c1d2206ce855dc4626817a13ccfc2458c42e65e35227650ae34423e020ecd410d7047d4dd0b7e33c34f85e60e9875e60528ed320e0728ebf935a44a790d0a42291c697e8aecfbd39952291e44b348d37e1f3854e8450fd4287c29bb88d045fa2b71697a870a9fa1242446887a2bd096fb9b7ea87a2703b91edf5b75a9ed06f7b68ba66eb7113631e16e8c8c7a787a5dc9467e592dba8597fbe7ce504c4650f24b3fe39ce0c84d58a15e3220506e5b5a56585ae56d5bd7635eec9c27237fcee6bad5f3f97bc15144d226244af1a87da20d48496218108a126ec12fe7586374d7bd5ae48530433c7107694ebcf79b7f2e0fa3f5769d9f951fa021bb26c031cd000976ef00126f5e949f3f0f76853f801130c869a4707e1c67558f33084ebb18fad0ed6533fa127da4f6606b80083880cb65aad56abd5a8c7ca52e166a64c9bfb65737222a94a493b0f1555aef9175a96d69430c963c34858d029cf97e3a371b88f86e6e1fffcf2726898afd7e49253abf461060cfad3d0384780602b705919610818d7662c2b66f3dde3e68185a5b55a6ddbba3098f993827262f22122ab44b8f35c91b922658e48294084694d7a1b69dc00d37dc05988d0b972743dcb105ea24966334f3794b957ec8d1bb24cd6cfe7f3f9eae0e73381e8f92244081b322dbc61de22fd34f847e446caf20d43a0474185d828fecc32c4ebe9d787610a1b72145f50b9a22996fbeebbb9f9978076846bfc6d11d6238a5ef480f483b040c041e7bbcd7c60e10d13029e28fc206ed3d94c520cb20797e4fb1549001def36954b5bc771de8fcd0697526069304e7f29a856864b9e77cf15eb5d7bdd779fcfc7fbe1f916c944e172f6084bbb1f1a8d46a31df1bc1d0e8e1cece1e08d833e722010c4c16e193e88a1dc85a5091396955635143a1a7532274f9cf8cb10979c8e4236c0208dfafb236bbdf4a768042d9271ce398af3e5acdf10a7e98cb07ec31010d6e6c086f6ba7c8fef38fe7cc51084d840dfbdb0262463e380c1216c689c3e1de1022f5a57282143316d368aa25028140ab56d3b463d3a06338399ebe82736d4d0a76ec234fe12a3f333ccbbfba5773d3cb0a31b3f9e15e1d9ac8894348cb98a2d66d7218bb1d825bea2966d4606ef3ed7f87ff7c726f3b76ddbb61a5aafadc6c5a5261ac7f3fd963eccc370c586b1359f348ee7065c62e2243fbd22c953339aacc99d4892f1fe13758a246fd249999c359ba44bb6e42aca28cc87f2142a854aa15cb3fae578626722107ffe8caf03150eb5d08a40709a4e49711b260e63058b5a82e212f3c7631173f6d5da50282e81b9f10718d10cb771116f5785f58f556e186bddb6214245d87645527479a660ebfdcfe1a4c8c4458c1397300c5c8a33f8dcf0bdcb7db515bae185b0d8b88469fc7fa84e228a6bfc0a1bc6566c6d1f7a1f4ed38f058b6bf12d22601c04308f7e5983112e4d0528a0fbc25a3d5f6cc556addba8c7cd5cd950d2ac6256ad184abf9eb4165655a9ba9b9b1bbad55a6b7d52f7616dff4251b061e84a5291a8c4f5ef2118076c33df85e052ff4da4691ccf97a479f88d77439e7d5f6e92d4f79bfa85355f6e68641e709266c25f51dc2074872269014ce37fa35255954aa552a938ae0a19e260ff27369bcd763ce54fbc7054173f7913dae46a4339399184a4f6e068462c51a06c9f56713991e43f1a816008d6b39e71e9b3a104dbb7ebba6e3ebd61ab26f390e17ddfcfcb077d731e902888839e811d52a20474615b3509543525e9314cec31f48f4056a6e9ff421b2af7db047a04bd6d40e87b6c60d8ddb8efeeba0f924e61b1b5630efabb604abf0ecc2b895d389950e0f6e57432a14226985702533b9d4e261d1d2502a05513cc2b71c02c6482791d253cc6eb64820168827918dc98604c30cfbd6c900f0b9d05d3cc9eb0ef1a62d6a63b3d836189ddbe9909f408e6f7ac023341d0c2ed1cffe00e6f5a8f59382a41dfee5974d9f006c4041bf6cc51b3d96c369b51ea33cf65b67065d65167a08f500eeaddb6b1043b9271123b5713e7873bc21cd7a9cff67ecc2f6caddb3665a432da3ccd79d2d15698344b67d55552934fa78e0c82b147a3ffda5f47c4dddddd3d09e80bd8ca94c388c90f5ca629fd21c36230fcc0facf990830974b9fb95cea3a7dca9175ea0607a9128be408f5e00006232ceda0b0f23671d053ad1c2acb7c3a9d4ea73ef58952a7755268ec34b7711dfec5dfbdb8bbec642097fc9238ee03eb573b8f16d6efec9e5e3708d391449fa6c37d7d5a2455ee0b400dac90d98d1e5e2ccfaea36ed846c0208495c16934da9c3b68758c8e99274f99acc7b03559173f317a778a42987843d75b75606a24b5153bd7df690d6cd8ad4869b2586beb38a9487f09781e611fa0f72f82821b9c04fa680d0025712793ebfcc53b2b1e366458ea156b1efe138b834da4b0adfa9ed8119020ec1d9c808df81371555c9062080c3ad83c8a500029322292a06a8566383ed40aa5a4a452527630d26ad156abd5ad6e756bdb463d5a33a4b85caf1d2f586656645ec0b65497ab7dfb500f48e7e1b863c3762921c68a3cd142609c2456669f54deccfbf629926efa497ca2a2a208dd4a4214ed84b80385b5723da9f2ba5cd5e572b95c9c886fbb869cbc2e4e2754cb0a1396ceaa4aeac9e90482b20623c95a2e798de35dfffac562c1e5367d1b50b047e889f66f4fe9f6fdfddbf71ba91ff24e7df0648db06d65db28a5b6e3a55e05180a77fb3ed5ea606f2fbd1f5b1525c1bd0d6ea4af9123f2044b7d4ed70dc0a300bc8502c0c6a9410938416aa05d6c100c02c1a07f0d8d83a479f8105d584a382276da69d970c4c869e774629d4ea7d3e964b1405f1cc7c5da49b264151df9454a296badb5e6c076dfc1a049978508dafdcc5924e6863cabaf5a3b092781b5849429490e323b28d3e773e8b8b032791f6b50dc660726758d4b325c9a21272c7f58721d06256c18dbd5318fc13f0dfaa6312fd61cac5dc023c39b6133d948e30f33051b46d749a2b8a71c05b2dd30db33dff3f15c1679a28f8863acd185edbeb0b7442ef10a26512298c67fca941ef4e086edb272c376f911b1567bc2054ec80df4d6e73e569cc6fbebedaf5d4caccb89d30d252ad6ac58ff6e2bc27d72885061b91bf2dca813d7db65a579b812d207066740ad4820e42a0a39c42bd624ab5dd48adfd4502b4822a96b55d45c35b9721bae166bb1166b1e0fc735421c1c4284be6c00c1ccb4b1d056df4412dfb0870a0b739d524aa9bb870a6b61c842686665b15a739cac5c00b3b826a6c541eeebd4ed20ae7f6c988f9c9b90671fe010b007901841e33414be02140ac54385a5fc04834180328486122b024bc6daa4d06655615d094d11aa227473c38ab1582cd6b6c154890921726242c310a6e9f08cbd906ebd05724c08970470fd89c0000a283d19a6582a73847dfba9967e433ad50d79f6b2b6880d2152b013f0dcfe402e794c888cc562b198903977787c60e6a992826a321b89b551eff40cc1728c49705f9f37fa7f798aafe2adc899354a7b38cde69b1662778cb17687c57a37ac4dba35c6186387c5c65e71e9bbee8574b0729b9614a61ff6eae670e5d50e3329a3bf6f6d6795811d503db0d36bf0067430dbbd6ff5e7ffe5571539ab55575fb93c7592a97f90684929e58e9119dcc43dc3803e1eee330203f27ca4b0ec604ebfbe70f46166f678a011e89b3ba31d5be5975365fde837bf1d233b3827288b52564bd6a54aac61cda55d946bb53614fad128ca6ab5f61f0447a366f58b4b7c7d764faf1fc6a5fe1fa6b84634a10b76b3a351a86d121c3721063d58c294433c220c93e7bf54ca32d7d8c993274f8ff60cfdbef4abe7a39f1107dddfeebcad4bd8203b18b1b65a6b592c101073ceba4dea24c65837fff13f291d758a76c157b0204290e80ca100eff0175917589066120d1a39187683cfc042b854e3bae806e192288bdb42827cda415110075d6efd520bcc11fc4990ab7ad2c38b95715e95759356791031ec7c820dc1eba22dd81094f2fb85041171b121087acb240c0683c182ccb9c3888e8fd8100e7f99c383cc9e93ba8e3adbe9597be9d8a45cf274308d3febe8f1ea973c5dff26820d2e729a5ffdc9d51722ac97cb59a8e8b2e58637314358ce4205961bde64a982c9cd424595cb598ef0e2e2f6eb543f1e1ffad55bc4729dbda4384bac4a9f9acb7c65893de186bdf369653942ec86ed456e348c56a415aef7f0aa3199ae80df5aad0d85fe417074634508eb1e1020ec20783ae108c5d3cb4ece628425d8bc765eafd7ebf5dab6978582e338e68e7c24e9288119638c2e9c4c32af2383fb9890679f1f8c2304300ed83cdc13b14946c4261939ce711cc7fd370e17f27e8608f41f519bac884d9c2889cfc788941c9111c910292972fa3cd853dc225cffb000d73f2236f5dd3e326e9a216a1367454a723899bcef603ec7258ce805bb9e08072433433eefbdf7f97038d271a2d6e260f7f2e19182c5e16a975feed362a5b07cbd9f7201192118a3c56f00e8fd6788580121cef5070bc0a53700f3601b4a039530e8df34d063b8eeee340ee42ddce71f49344ce38f802b15641a0eee73d41d5686877624e420d708f1b8c5c2e3f1b0876745aac7e3f1783ea311087ebe1a699cd890675abc97306157b9eede00506fb9a410278512383f9847949b273a52ba05e5ca78fb31f67432b90c5ba4eb72201084020e1ab1e1c80d48224d7f441ee794d45ab972ed20b88542455253a9b5d6eac9c0846b9c874a7bd23a6e93059372228d8eeb6134185c0069d9c0862db3f12f12699630e908e7c3c3033bcaf3f5ab50a47893277de7dcaa7c00036193152690538324f4175360d05fcdc3fb0a4c03c5f5530db8d0b296a3aab85a2d6ba18e5454ff509d340a2593c96432d9a8879021a998d5687453c4061f3db8cb4b0b6d853a236c7f884bdea871280fd73fe4031b8eee0cb9949147233a1a8d46a3d1b66db5be55881c63c766668e0fc3e50771649a077fbfa00a1760a61c1820c41096609acf1f120117f1174435780cccd26336123bc03cfcdd3fac2132820d6faed74abf9b1b29c1ea25c618afb07d638c3146902cd65a6bad52f610620e7d90213970dcf80c001036e4fd33925e003f2f2b43d7fd8642a15088527a84945246dbfaadeb6eb08a31c65879d63ff817e19201a4c93ecc69f3d8a8a24b72e474bad1830ad606f0869f3f810e97fb7e90c83ad8fd9d534f06f91fbbddf2f35d07deeed37d1495a0c7f8bce78a9d119f8b9df48000e10bfaf682f0057d33de8f803ee8bdaf0718a0a75f1f06e663be1a693ceed99bc17ecc10fb319ff7cd44a0043dc609e483bee71aef0b6d002fa7c3fd70a28f8c7ad9ebb82f6c6c62fd7360439ef12039e06bf57ca1e8f6733f2bc27156c435d25899108ee71a219e837630a71466446415a6d66a63ce39a70e9348245598da9da304db452f3a78716fcf8b2ad61491b8754422e97dbc17aee99085ebefa8482272d2c18103a777a8748db805356534020000000033150000200c0a860322e17848260a728d0f14800c70884082583e1a48b32088611ca4903106210300060404400433ac14053a62ebe1d49c3cda53fe7eae98e3e643a94226bf60417b85a91e3e638bffe5089ea7e763537b32c3cd1b038c3ed906023efb9e63f336e064a8a5567cffe1dbc0c094a9331d30f3b69c1fa8766c68dcdec5dbf79c271ee0c74b7ffa91677432bea0e7760a7cc1827b9935fc8bf91b5072e98c86924426c89c405bcd9ec76dbe2abf8b798d697cbdc896c50bd10f35b60d3eeee2e3a9e6833d8c3fdc9099ab586de87e245e3dd53f5a77d96d350a46ee4a20ec638faca8d75b58722f4c9d5bf121a79728d4dbff51812d25abf793941e0c2a3e16ace0527081eb1399986398e835311a9d843c292e10d193638c719ef7cfd7f6db872fb15176b6af55a7c41259774b743e7789008dcd33fdb5aeee4c0821d8133f78bf84d086cce763fd2975d25249e98900256f18c87ec3ec65ba3796c66396f3d40cb3e4c9235fbd9c386e20e511a6494adf8484fec0ac303cc9fd5ce9de955f3b8c3d890d84fc9f49851918390692050b930aa0579e9ad95d4f67abac99a2156e8e93dccbeff8726d19dbe1f738d5e6ed7c81f89e00e560d99582d3511fd4eae2c29a878ccd80c50717ab9af4827868365075a7a67f4f981646cae036e7d550443e5b091d11a8dbb68935740a15ed5daab9b4b9c564bedf47b8c41e2b26eb9f4fab1ebcac8d42f858421a2789cb6abeafa8603cd6dc3ae1df90ee6c4ac2ee834dd2688f12d65da7c2fb57c0b5720d571f17e5b89b64333557a8403c519ee0153a81296d23cb115ec9cc8faeced45f44fabdbb023c37503c1bda0f244dd058a0871e98bbd4e82b4b63b49ad2739856ea36ca901473eb0b125b68361cadce9e8fb4c36654b25830f9d53498c9060d377291e29da82124d2f2f2b081a8f4863e004b0616448ec2caf20752c8ec48e23aab98bd5aa73d6e853ece07c8aa7c44562ff00118bb279768075bf267ac182846526963eace6824eb4f159bc13b95b78e24f09182615f1f6c8da9cedecf86c906d856644d1778143198c830b1d57beb955188d86a275864d4f5fa80a4c72e30164540087cc42ff9727c32262ea5fc500adfbdc04c1a29e92a9f226a78adad762c357c9c06f4635c001d00ce22e486d8041ce8b8063ddf6937531de8bfaac2e6631107123727a9dd72003ae25618b18b7d7895e442553a98a6bd0b626aaf43ebaf5713efdde821caccb1fc37d15039cdd5081133f990cdbd4572ba8199fae0fd85cb60836e247223e06cd98b1a2fa39f743322774f5ba60978abce004c9f467bb2bcd1b1d1f16bc0c0b1bfe4380594a60e8c292610bca3f87e4b333474b25b02f8c15541743895ff0d42318117dd915595f6cdc4236582b62383e04de142221d853474510a33e68c682aba033e40b58ebc76bbc6290c30773b02cf76fcd1178b3a2ee7f8e8f0fc7390ab6e209eaf8cda14e00a8d0df50fb9901c367b8d55d2671cb402de4f72c2e7e2287ffdb07044884a22902a1b17269804e76d75db1de3187ae9943411682352fa2fa673fb0b818702808f2048681c5785b1afda62f312e6b7b34085bd8e3327cd5a3516ea969af67a2efb5fa660a86b841d56073fecdc848b0ab4820cf1ba6a0518546fddc3aa69f5022edec05965ae0c3dc47e8a6e85fc73ac1b4e09da48ed3d53a56bc3688a032d9ee5c8a52c55e44998a3c187ff1d5957efcbe0dd644cfb9adfe76930432b7015d19ac16f64b416e9a0b4d35431c27fa157c4d6546b94469717208a9ef5e444089ea933e9cc3c016aa0d2d87cbb90bd340d5d291e694d283f019bfc4f428959d736f5b64ec3e26bd24ca3c5f47394d134b17a824e181534f7c4c7016c5975e862d77f7c17203f98155dc4bc3dde2706189ca8a0f30cdb6ff0b7ac52c187aacf776aca195613a013c29d387817a57895e7df921f24384c56e9bc980f61534848c2bf683912224128644ca8599eb24a5afe099b80a72846470d30e9667628615161a4e182ca3ecc012a5f463a792f424412cb371d5289c610963613d2c89bf147ab590b596ad168d09f959ef77dcd554a927e8557c038723f857f9a6fdf08cc80a557b738a86981da9b15998db868ef528d12ae19edf7e79192f43b0030a00dd35ae6422ac970c657fc6f05d16c62d285b56ae153ba5ebf61882126f6416070e6d6caafc044f1410cafcbec35560083280eb41ae14101b312a1f906d0803adeca8d56e3b55c8b7d59082f6f0967ca9c3013ee94d68236909f3592ba01c801f3066d9e8f53db3ee9917d641c7afabdcef143a35918ff1e0b3ee042966632845372cb10a3d3d7165f0781b38fc300e1a6855ff14a54d9e0b85da30c8e917554f58acb08ce62b3b4d0f0cc431fe514351b0dcfa6ee4a38048fa8e95ccc4ac6a6bf7187a708329cbbfb45a20400f766dc5fbe3f8bd6c01c11363d1d5403eb63a2e564ca500c7c5ab9e57b63b842a4ca541f88c27623994bd1223e82a53e4ffd467bf353255ec48c98d1304d65a0bc0bdafa55e8ddf9fa060cf497c2745543ad5855612761105814e8c8dfe28965282f1121502ac17f9e23fd242b5509870abb0cfc3cea02d28700aae84c53c47ee4bf9f48611b8c30af99f36881d16a91b2626e9fa5b2fe34126128a51b518ff14868931744b9cefdf7d89295be661474a494f2305e25a17568dc11611278160b9ea49ac7aa0c4f9d1ae59aebd032ee838a6fe11299727b97cb6f0f3891bbd69cb48535d2f68b8e28d7a7e27b8cf0b8d8e20ffa142478c06d8a0bc22ac0d7ba8b3afc491980c809b0eceec3fd899fc402108979470025ebe8a8a222f98194fb3e9316e16ef9effd147df3da0eba96289ae5ca9e362b9fedc74695958a965df4dad6b72fff8d05d4a4be04e5dcb923077c745526bae38d9d6774e4e7e63afd4922fb947b0572807c84f889a32f90fb771a682a9bdf5155a31e0986d469b0e69181d19624d0ae384985681c49ffcb2e141ea8440f30b0d206d9815d7ce97d04067f1001a7f9aa4cea198e2bc91f6310bbd35cb4658d06a1e560182dce36c20e3ce539d4aae733fbc4a2edb6a1cbf13e18d3c52332047fd2f87bb177025aaecd21a3d78b3f859ad953338f7d710c9944a348921805137c51cee1ebf3b7abd2bd2eff48bc6c2f9f3bdd0b32de2ab613313936e325cbe3749ffa7a6377a01532bf8303a282701f102eb21647f7cd7fe6703cf7f5a0f1fbb0a0ecce432b02d948eb1bb99f850eca8db8a04a2a42df4ae6d8640c26f51a6926fbbd67a5c6f408c0d2229665949e909f22b189f71e1b69207e6e162b7c085dc9b1f84c419878845a611d6c7e1500a61d132064056bb5329615241cd71aa62ee67df9700cf1ef5725fad2508f59f41c94cb7ab6362247b7d9b9914c94602e602c81e1e69b2746dfbcfa05eecd43af1277f83745bf2a2bcc8105fbea6e82656bc44a25427fafd91311c34049fbd38599b17536390b654c662572d6180f070a5e1a5eefbaee7b186f2a51d0f94eb86423f7049c09867a6ba0e8e831c963a0895b087d0a72382505fd857e22f100695c6b2db6d500b563e0d93810de15bc602be8ef3e3e953f6f5071a3cca42145469abf001a1d644e6470733ab6f9153268eb85fcedc950150ede8e01fb480db574c85a9a2f49e5df326c5bedc8ad6e28ef29d8fcf5f0188892809f680888a9dc93c51f3f66d98713b45e19ce33b05c4f11d7bb1fb015bdaf0629ffc8633b1a0fa3aa3800fa003a7f72e4a60588ec8743207b6f21cf9f96b0fe20cb33d3e5361989f0cfa05ee8ac497760cb21e4e253876ea6c690fc812946908b79e8a354dd2665f3415cfa23420fee8b62d1743447aab966c99df93050992cda4ba6125f713a111191a8220b177f575b71426f3c25aea18ea52b6e24be13f90de47ccec53fc53d328697ffa8601d6f804022c3cb68e97f047cc83abf819d3218d36ec4d9951ade708a04561c7eba07edc995ed404c7c1b7f174246a2509c5aaf325d3ab9e467377de354d7d1802a79804da159f2fbe2af88adc376df0046f15a7c6bd109475608da1dabd3043aaa2d9fd190f62e131fabe00eb1487c39431aff841da124546423ce668fe09ee5500fd5abaacf527d06e5dcc128e77c0f530ccaed2e9c9d4b0461c8cf5af3bbefff458dc6aa2eefefc4f69e522bff8463d0343815021966c9f5aee60e025d943f37baeca3e0421500081742a80c14d9ee95d07f88d88e62e88640803219da46a860f1d8aa905b12356aa842f2d8e4bd536e625d3488720018d8663186c8cad165e9f3e44f6b6ca5da5329850b9332056d0ecc5c1cc7eb691c14d2aa9344cae648988be775ed2a5a3767493f9ceebfb7e54268d5c133addbd8c83e93504f758d452df4d7387168061150bf8d1c2e562078c4ceb31eb453672d4e18c45a5c7d50b3d76f27351715f300aa0507b2293d88489abbce4edea2a30b1295927f983f4e9fce7b547a49b1f2dfa38a0bb207e1a3a12d89eac800d15deb523fcc44cedc16afbc04e160e26662b2da8f05d238d6b81fb8abbc5c40e5c7ab175242d54e20fa0f839d54b32ec3ba87ef63e407746998e6536fa169dfd074af8a30a42996c6bc6f155698dfcc3ae14b76c556f0c2e790ac3ed65101d3f746a62e45d12556afc0841c038a7f9226ac88bff4c9e13eaa2ced3719a7a6cdf72771d3d1420cf79af1945e6299988d9630305f06c1643bc4a42d090e97a460602988dd09d55a0f3338ddb4f6898290dc1bb69701dd35b1457e1a0170b56380b06e82a7e86aa2ad2dae523308089e49c7b499da12a5826b44556984b4ce04b44412848a638881b2275c58d00ccce7200eeb5771b9895f0ed4d841fda00b28ca8cfc8f9a3249ecdfc74398fcabc720b8d458b3557ed9fc641f213abf5a7856f49394d2cb8b1a3196f55fba01a9691fe8d5c96701cb0d89f20245c76fc4ca49b6467f2a233142aad5ea75b0b4599ee4a86bf48f546db9f59396f73a836c176ea6544b4a640d6c5cb5135c29dc7ca942ef01f1e9c93e1520c961a1333f1625e04057ffdd71386530417f1a5d7a7b6c91ca2c870f23eb8cce3d44f66492c44a8f353f836afba51fc3d64c372c2e8b473a721254bcf0bfceff3867966954f999a814c4a5d0b0b154b6a3aa5f83770e14de14c8e9c390d8410ff361d5f0838dfe306959254f62e48adc6112ae26527bb0062c12ba5efc99a6fa8fd341bca9730ca51a730e8086ddc4bfda344f91bda9685e9867f16964af46d2da38c4fa40aa814aa99d13749bf4ee6d155d113be71763d80333ccbe9ad85090b228552db7b5bc3851cca82e80705b740df45251a2b3321d7c5ddb0fc8e064c802ad6907067bfb6d3ea8bef3726c87bdbef9f5cca7f30d644a1f5919df5ca9f58d02dc53007b2c001b05008efd46bff4948e11197283f84526e333ea5949f592a79c9a487ee2deaf5aa02d976a25db0710717faf8b196f6df9939ea8f409defac02ec7e97fad3500286567a1fb4178d785b85619f23ef685ce551434af46516459e00fb1c5a1b88c1ed57300fec042a57f70f91aed1093ecc1f4af0d1e34f494adc503a0a40739769cc95808f2f1e88520ae5b3f5940995ba243a12576a917d1beee263657207e7ad94cd2b06b3068c011c60fb1ff9dfd2c07386d0aa3c7f461d382f9ebb705aa3db04f03b651ff004c518e63f7c65baeb517b0845d83523f57feb52cd31a0dc803ebcc521b34e3c58081033b77650efa62e9187d2291b314604b21df488e64f4990c8990a6f36a9367bc838d6719d2ac2d1a2d7d667b56511b37271a94e6ca3caac8e3a1d013a16037807ebcdfe18bfb9e0f6521cb87e4fe087283a3875e9e60b550a0ddaf9eb2b672bc3d3a708b915eb573e4eb36cd2b7774b21f8a3504794586673342f0e8b13d13e46855f2aae9493fb020bdb826bdef0cb42a5aba683fbe60c48146a1a77da9187a73b833550c8bb91060d970ac3d2ec5757b6353eac66c81f4a8e488fe6eb69e88086ca3633b5b3655a07c8dd2ce7cbbb26589b4b8f21d43d723f80f0c7cd8535217eae639934e30caa982bfab4a6c3b38fdf4e163110414168ae9a527a6605160885dc7199f8cc3d9afdf7a369f26742ea7df8486badc6bd765a2fccd717800d46c36962271b06b00dbcfe576984c58b5e7deebc5b0d24608a87799298632ef373118d225bed47cd647e298643587c0a430b01ca837c52e0788df4030c6b52b278bf8b5847f8498a9496aac1b54815cfb50c33e5f0581ddda77c7d95c38ef4d9ff0268aecdd02d7b164bdd7267b66e91f0cb5533ba3cd65840ae0303838d390668185f0f8b6235ce490134eaa7e76ee062c82999e666f30ad251cde26fa4aa5746ea2acbbc55ea1dd785d357099c6b0ee1686d9d4942aa96081d29bab3545acbbd2430500971ed86b1f0b2482530ed2ebf14f7bd4ad3ff94eca7831fb70062ce6731ed80454ba3bdf7475c4b919f13c491ccdf5669416d170e0c5793df76518e18c3772e91b5ef1c6095fd9d4bfe0d973b3666042df85b6e02f1973eceead3aa3502498508f7c082d764a1926122900a2c20f4366592563d1b55f972488987214d63853a6036339fc387248f9da2ef7214e7991c23a16b04431468d795e3c7b2da99257f678d231d8b89cc96a26a68c4b8d82a451fd8ad2c79546402bfa365c58f8bc31137fafdd03be7cef9c594a4b7f1ab17fbe233a665c1f071e5a3073c1cfea76b9b1252409bfb16ace86d006880d08f0a035f26e689f27a77e7430d41b77785b56d31c307d2c0b4b1a33d8ad0dcb042a2330947513140aae52d98ca629b717ece28ebc04fcd85c549ec66f63ed8dd952f1aeffc971f5469330250336e774f057afb15b224c07716bc2b2b33d1c490a67ac82f84147c54181cccd0fa76f5d3cac128c8dd781158ffb581ad87c8e0abda6771283d6995cc2e27a78bc28f9dcb6ab478a95f01047a55321a3ba8b0eda1db2d9e8eeef611a0e0501a83cd3b17567dd1888a1f0aa7b72c48fcdde05c13e5c909eed65b6fdaf0ffe305445d988476f4d518566aa03dde53ea7c45cd1d63cc700457b20e7999b1b04eec640c4e03c0250477b4c24b34513fbd7a58eae9ca9daa3edc905d52069886e01351a9d344404b52337532253dc27b3685bd71cc26f8626e9b1b1f8f0d51fcc83cabc8592099d3241cb7af063e03d71f688938becf2efc9160494a2ac78d5074e928382d6412719339a6e7b07234699d5147c1b8a985495bed6f49926844b2300a0c9f7aab8445de6796253f54205e446f2cd0113a8c3ebb7d3e57361f03cd71a21c2319efa7da6c0f3c417ae916fbacef331ca8196f8d104e594b55be7f9a9a11cea92feb65579f2faeb5d2d2895044ca2979969e3b65d790a0d0765aeeaf254e1370465677b6a2366602d1328664f23693de008ff39441030f1150733fadfeb6c38cff28519b02a145a4c6364d05a756b1e78670fbddedc947e13b6ae175fefd15a10564252275495f6b34c996bcfbb743644cbf89a69b252966f9f4047f5f21011a90f85bab824dd2974a5125f8bc6ad6b4a80090105e6f8342649fcd4da0d86ecd4984e72783f6d1e657e3da8b9cb43194c59fc429709e4e5023e8bb5c50e864d27a11a6d3742b5acadc4f23ae21456b9020ee694b7de5663a7a86670f34d5217f72564eae30bc40f510c2c60b081230adc5c2aacafd1e66f9568b5703f6446c504756ee69733fad92e9aa689823d0a23b97d46b99612182c95bafc9819ff1067cb41922db2dbd3ad5bfe33b48767a688aa33f393abf4933263989a7a564345d7c83d0548487b0e09649f112201c3ed470109dec0296820e1505b76575d44d4befff5dfd01c1fc49b010593470761108bde3a441c7c4fdaafb190b564170de9ab9df051e7bb0adcd9908e391dbad9f0ebf0477675ecdf311799e69b02ee8318bbd2a025c3c0edaac4a3592b79f62a4837314c11201a84f31e9e6d958e57866040a5f2bb06982cce859b06162e7a040a5b33f2be5623200756880a328c9a19ae924fb7c896f5496a60340abc3125eec47590fb92dd03ca44299e8716bea1d047d06acc421483b6e41fc46a4a745e158aca19797068758b833d51a5179d53d42138f6381735cbbb0c2b54426754a62afaa6fa98d0cb4625e0b03ca0a3d371cd2e6dd1ad6da6d2bdb297f5f13f597d5b7077ad97108d0e98ef8ad3321cb4370e8bf374dc67e3e00030171ee1601d2f95086414f8c70209dc1716a50219e35992df51d221d1fdc9a18a45e8b29ac81e5ca93d30d428216c45440b8cd926add5519b0054bb86a61b307c22323015401c2eb728da840ef047d4c2abf2996a60944aae607e0e052139c6d12df55f4e28505a16c0e7ac134af49afc298e4f7493270bfa502282bf2bd621c1aa9383e0a92d5858523b198cc46a14067c1e00d8de0b32ed1c531761786b9e130d373eb9fccc6eeb2eda5d8f75785b906bc1c05906e0097234487c6f9c1bce308eafa1615256edc6b6b87a2e70d81c86576634bba14ef1b2daf37a283a5f4cb18ae78e59b20362d53afe4710bcf560be1b0bd378dc7d95accdcd00d0c880634eeca564b4796895b914c7c506238ae3c395a68137a2195e000451995588909204a746379ac80f54b7755f9c430f7dac534b39ad28c28b99e8015638307e72450b8cb6d56c68b791582e86757a7cb90d014c783178b14b8bfe53fb1abf2a9111591961bd0131261c82275d1628a06024cd36e44e0e4fd5204894b6e17086a8c8ba36d0aeab3737556bc35642082d351adfa2270bc1faf0ba09d661ab6cf443caca1997093d787a97413cae68482221254ca6ad099580274db1646fc195b4b105cfed9fba2d3ccabff992b2e05a6aebb5d6ebc7ae40ddde56c86763007485ae72adbc1375be6925b889e3e02259bf24b1aa12b76f9ad65306490fd405938953c69b71f50d702e82e4c451a537200e3cc349f342daf3a4c3c7ccb0f15e616383124ba5de8ac5d60764c040ff56c415220aea6222300c018f7ca2ea3dc57d508c677b779fdfb326d77d64b7cc573d08f2d8d48e79cecd62f080f04b96580534a807432fe4e4f0433472e7030652a9a146b463f83bc36b46c41ffb48b1325c11a3538a845639d98c970e1445658a013a8d9a72ba36aedb034b621b89d757e460e32d771eb95782d6fc4a726c9accb93774b04d23430bc9e39b9c2181878fe1ceb632adbbf2df4fb39fc55a73fe78cf0a50a40791b2f94d84e756b7c29e6f7f8f0f4c44a87775423b21980066231bd3cb306d03a86ebfc70a38aeecec325b7f9e8c4ac1494ee261f2a283ad8a2970450d2cd5254dbefa371d98ba1b27bfa0284bfb1e4d069735b724225ad6d93912466c1a74f07cd9843d4c411fc05540c4777283635a8ba7322b10910fba436c84809e0c1cb773f53860351cace24da7f26f1aa05ae4c0a1a1cfca141c8d28c05a16ac2cb83404860d2702cccb54f37aa462a600e70546cd3e426f7ced4f257c8a47f406b1a0696ba3af516dd6e02e3d55df110ee1ad2539d3d21f7fdda85ead65d32d69791e0ab6b3be2b2a3f158a38b2d8a25ca8ceae350e29a573a3e1c28310a92bfd4cccaa5ca4602788c2936196e7b694c31001029e7e9131abc4e57be60c8d60d90dcb73f084ff7735d9b6b40e357f528f934cc700c8d873c4018b91b15293e280528bc1abbc95f361e5aa23a6df9f4c3ff3a5c6be857892e384b0889b5c844f5f0c63a698c04bff8571655ba39c0d6d98bb355d39b4eb75e43715665d93f7d840aac0539d367298834087915c53105f9282082bf20629b93072355d70ab1772d0069349560a1901db72e359a81848280cbeaaa41a6255212fc3c9d2c035f185fb6c3f0a95daac8bbc6b7baeb449199ca6e671f1116ff046fc4d2fe77d654cba12b157f2f217f4c9d24de8e021b95fc4bfea89bda26b27e2dff3956947cd72fe88c34e647c24f80a64f157eb3537a44f4560089e81ce39f4814c7c921a1fa0c5e85666555bdb78b272bde309a023bb70ec66ca3005144d6de55edea7ec7394d1b2eed9087eff331eb5bc5f92efde73c5b1449dfb5f8d822094a12624a6de71d2efba4699d16baf0571eeab785a885669f7a64c1b5cd34d43a2e27d12e5a726b993525c633796837224003c7b3602469c8e509304f21905f743b88340ed228bb1ec4ad54bbeb07e8216d08e31b295c69dc52ef205e8ebf038bed90be5f70c60bcda7782207f3db2650d2154d7d774ee622bc31ae36232a1563d1067b4eb0e46aac2fb174a39c0b066de4ad7ff88b6625f7d7db6823b3c919769223f5971942dd7d3c9ccfa912f38f6096ada99838387799883324dbd265f55e9f8b5d34c3cdc699464517ac47a02a9939a82aa997f3a37696f4fbd9555e4189f787f9f71d3d290864aac4a1cb046a33875f5b32e9096f6969c4948b49ef670d0c8add2dd394568bd98985bc772598d18c3eed9327befa440387134671d89c27a04348f8210988b37304870ae817268ea4b03bdab17d757423f12a239eab66631fbc9b8ab917fb0d2dc0b89ea17114f80e01006014f1608233a4fb1f11c9d1b76e4ec072518d98848fb2373b034060fe6b635dd7af23d1188d3873b11a5eefbc847ab0c8308b41eee2d3bcc5fb3cfffef4a800eeb7a48b65d6991fb630aa53788d49e3abe8faa94d78b2c4f9bbb2769d9501e8c5303be66cb20046b5d82acbe1496501670b2e05439b70e57ac25fb3f018d4d37cb45bf7c42f62aa5e1e221c6b9b28407e6e79f9cf6d1b358d8461b9ffa992b0d40fbb18c5de6aab2aa76e3808fac00e780342c661ad75270afe59adf06d299d15461ef5e081cd4e32aff98ba8f7e200124bb361f1b0116e66e6595819e6eafba9af907db765da91d61dda9a00156948626da81e037589f371aab04fdbe959b4f1fe0d267b311dc59689b8ced5e175a1906f194b21712770f3b31c4ef87a826ae9515df000e88dac119c99004266fc18303621595fb33b04b0b8f6306103924ff5d26540b087aa20df6d04adbb9c265cfb6d23e1de3c43204f48533b6d6a5e7df1827e8f8152c75f7bad60c0c4d3deb6b3de5392798ba377cf6824017190849b04e2e14d774ad42480797d80817db91e36a5f26841809fc418d6695c867d0464db2d4390f4260b4f1bbdde97802cae777bb192f8b093b3ebba2a865458d262b1a1ee4d826bed829bfb52369e4a13307990bffc22269b41963c938b646935bf28b90ab1cb32fb8f5ea03229c8ec4610733b4b09eb5997aecad42b68e119bff37536d9c6fc0e240892d488c8f4e26757f640d94d07fd7a4b49c7042f7aef009a8495af1b9aabaa32b69bfb611c4bb6f53958ee3812cf95c091b0f55220cd3c6d8539e3682de051b36c348243bb6f5636ccb51d3bb4ffdf525e36ca342d7c45c5e112ac40b02af57da520e2ff87c06fd575aa8bd9a2128b9902fe131d9c39a9c7fbf496b50aed58cea85b516ecd60996ff961d073b42bb01ea4b14b6b8608ed3901a7f29302bd825fb74f5054bd1660ecc654e76eaffa4cd88fa28caf6256ec32ceb2c60bc50c1544c0fad34d0a51effc2ed614630e777d126164013d729701fffa0cebd3f6ae55644dc6a0798e2a068fae33840a03f6468b5b22b60db75c6faf8c97e0f069fcbf8fdb60c9cc5879357f0188b68376da4d6a0cdeca36e729a63e0ce5f59de37e3017deb575791c57e9620fb2de96a7d8f21be0a7301939ec61819b8ae52abc17fac40ad022fb06304f71a40d20d7784408a4cfb10636de17817ff6fd862d7ac0bb7c2b640b5751078c4885f4fc28b803ce31b20267443e1251f6f248e0607299a9d912e73a18dda523911c36f840c7fd7064a245478505d30994d090c2291627f44552ce0bbc8a37008de2a018a38a4c55ec085301b5dd89d51ef0981523d72f9697d8158d3d030a48ca9aae08ac397545e443675925f75cf51cda139d3cf07e73397fb8dc520884214c292b43d343258314c471f4068682a463877f12c8581681ae56116198752e6735176004d5934c99e2f84f9072ee8d9d153a340fe80906c95d55a8c9cecc6d502255823e95d971ded6d2d6a1cea2f0496c37e609195b0d0e500bc15228be89f59c4d5599a4c5bc19e816d4f6067aff643c5edafa203832bb50cb18980704e560ad70f57546496b34f2d535c779a2a51596e8c7855c05c0e7cd9a8b916782abc2430131ffc773837f1e26bb650ebb846377daa39324f298956c08ff5cf0fbdf2a3307ce0213b375696e2be34ded5835a6a2d73825f79c92e74add5ab94393066d3821526a7c720e83f80a44abf231a3222f0dc7a4538d2f9141f7d5ca2be517827943108279dbb22385046c5ee71ddf7ea41e16b077016028f0a18f000f821cd83ed20afb1638be0296efb9865c816e6292d4416e165d8f4974c87aa9a1f9a49620494694ffb742a5ebe486c5777243355ccc4d942ee5aa512d80452427b384eb5f8dbfb2a53814d19ac1bb310b8e47e243e615d68d9bb18f33b6c59e6ea4cc0bc61a2a24672f23d9b1430d8953f7be0dba7805714cd2984c13f8a7f55932ecfb1ba008738515170f305854a408f2f25b2780a915575309959024221d8d7d3501a3538b604d2472a73282228eb7ab5f1f23ace15cd85aa28581173b847650731cad92b488f04a9cf1bddb329051e1c411aaca34467f5d1c6105c5cfc059d78f33ea865c8f3787b531c0603bb1c6374ef72adc8106690f86de4806481b7a199ffff55106eadf8e6a2349d3025e9c4d6bacad5b6c569f519f2e85771d601c0014c28c570c17659b9ea605010700789703e086fa669d91ca726bab52998ec221c9bc9bdb144304adff22d3738dd7328b4c19f76c16be3f76833fab29afaa5b0c0b15135d7c3a80421a150c48fa4f65792d9ecd9e14e7cbf07530f0122f58a1159e1bebabdc375861850d77449bbeb5ecdcad20f2b6b6619bb9e57520d187f8eee371a0f01c784d1491746686ce3415520922ff10b49cc4aeabb185a9f41c449129b99c51658acd5ee7418027c7feb40ba420ebbfa2e759895257576d9adae4119ca5949d7ca113a18a1e7aaa4a0f5574b0128fda51ac7f91453424e4550ec0b7f3643fc4f7ac1900803085384deb4e016f21bccc1007cebd66d52ecd217adfcc785d857f162877d41016f197b4e2f916689bc7d4b205625c4d348165d917dbb981816180bc59afeca4184c842973693b6568f36e477a801a8b4e6d6c81710167cffd5929afb761c2101acbf754f7a08583f33dde4978af1af3510046f0db6756684ebe3e1401d81c00e20f3185a863e216efba675453b202d28c62e3491d6eb63c7d37aa10035c85a7517795a330b154c7cb2f6083c136e9fbb25c36e6fb192d8fd5d55c7d99f40dcc6518a419cbe4e4bc143aa301705733a263402ace984fb039ceae69907c022f7219788edf9c91d30281ea6026149c39e2c208d6337e76289c62d7febb1dd5101338d03c489b6adc2a94708a556c6b3558e49ac548eb29cb428c0b584cdbb554f3473f478d86a071e67cb2857ac6331c1a99c89537623d4ade22a5b8bb3f58c066cdd5a78245b54d1b46c5508e9aa5ca480d6c0197c30ef4ec078d86c7c72b9b43f53201f6bcd62b5ab8d7b67b01078e005fb58ddf52c091c11fc63a04db4d4f5ba97598ba81cf668ca917e6bf1b021779ac9acc81b2ff42fb06b2cefd491adb7d616bac7d314212a8966e5c79f95bedf02304968fbb040c76d423533b96402fe7407535ae831ae5cc893342eaa58a7052658c43ccdf677c5b9a0a729ce66716d1e0e7138fd5713c02d3d3aaeaaf2430543c12610caceb5e667c3eefb43e9c4dde55220ecaf3df2d3e55fc660fdfd6d8f4a399394c1fad386e3a30945c406ddb95cce3faa541aa011b4fceddf4f4fa5eb8491ad0598cb7f35dab27f8f5d0179ee5c3ff96d970c92dbd67826be8b92a1012207fd80ccf0df4f7663abe11e21717fb20a130a4b7cc3f2a4ad0909836f3255c844d43e9eec2e91a5683962f89c0b8c5c7818e376b0dad205bdcce83f18f207c2e7fc4ea3f106ce02ae803ceefd8611c8b708b335f8c2fd637200cb678123037135e0f237e6f9f18b04e30947bc0f0ca60895407b3e65dbb7720ab08f8fa46332dfd0e26a4dece89b67229f4a44ce1228e404b179442133e9a6cf90af982dc87c8495ed2f55e69c3641533bb5c644f8dcb161f8373a87f8d90984853151252daf616c94e0576a0df0d7d8c8ac2c6df90eb70af87ba0ce497d35a1b0b9941beaa5f6f17d3866a3bf3eba92347c56e7195483a6b66dc4d504da7b010674f4197340b44bb4cdd871c20502fd1caea9b820fcd47c828afa01021027e538b49239b9a990ef86730c82a4a9372e956c04a92b2ad355c1b423d487c3cbc112a990e72f755b721057880a4690a8d1f92099757ba174d7d887f1d9db36756d051ededd04c9b5b5020f15eeda6e02d5bea38696fc277177cca7dafadfb0184ed207ad0f840e0d27bfa626e48ade790a78f6f0cd5a127e283a93ada77af832706bc1a66d87f73f7f70b26859093f05ca7baa3432cafd5a42981ace66c4bcec1404856bef94b15c0af397bada8e30fed61f41681050cf98c9bafc5f6b94d8e9adc8551a31608eb43ff9754dc6d389eb6c7eec194c6234735aaeb5ed3740c5712e0a2c4d550bbbd3820d8353c12a80089856d01d1f559bb8c3d85d141e571c7351aa84001f802004f06e06e0ee4f9418253194a80cae1f68f3ea80186a35893eac6c32be4dfe0731b4322014d8b666a58081ba67c209afea223cf0750746672e268094cb4b1464c4b47a6b3c00476b645250105717a8ed7b42809e35ba86b264e7fac5d704493bde4bcbea7f7852649929b2eb3f1633f1f9fbf8d7a208dbc9b3ab3dfb9b2449c00afcd03ba03660811f9b6bda0d92003dcef87b32e1856e5d1cabe9568beb8ca647d0d32f9e2b040f0c30ae8ba71c02914658d6b47e31d620e7e85d4c6e32acaa125dce72acaf3c3af1770bf1ec9a2c88cf20ab6be60c9a44b0a092432f54e4d31abd701d5515cad6f30f9a62f20a5b983f39fbc3aa7997b9e60fae514f7ca3a18312f396ea699b7362b25e2132c34c1657adbeed960afbb0aac991742f204aaccd7f80432ad058ac4062b68d5d16e8ff8953dc32adc059dc572baa1b7495a0cab58ea3eb14e0103ad282a56b91ed5d43d6e0f18f175c98e02eda980b864ce32368c60381a9912a4494a376d874de059734e878e1fe264c61451161c4d303c98339c530d2a5329245ee2f081964883cfe76601fecbd0e9cb22033e74cadb3dc5857a37c64b5e01c1d6f809f810563b38d000c7557613475297eafb8e2587192fb9cb048869ac64a48737d4971363c80a054806df784cc5ef30e083e9ac6eb8c1701b08495a832340270a4b604a9f2deedeadbf50a16f12aa03dfb2d8009028f3e9baf68732fc24a95b65feb3fd0c25e7b52b021a50c85c02830f7dd0729bfcb440fa7a471cd5ed864487bd068a0a766b5e15305934d2ab6caa449ebee6c51869a064dcdd418306763257289ca32e0a7be9a93e866f388cbd85fadb7d68f55e346b6f7fd5837b3a71ac6e245b39c1f1bf48b0937dcc0045d32a2c8f9ce0f4a29deccffb65d35af6994a24b743137efda26c028afc0482ca9034ef0005a8ba5ec7c450f486b84c65deab89d00acbcaffd3191026b01017b56bad2969c35f79fab7d7e6e555015ea9872557a551cf7636fa579cbaa67e1867991c93db45ec52ed559819a3701d6daf9c104dff2647451dcbdd51ce1f837a86dce8a7e6708abce62b85fd8d8130c8834c7446c571139b3df6a375b97a55556f7199c74787303703de9ceafc1880179a61a075f80761836b98ae5502c1dc9d860a244328d1a33229c3fd7b61fea92b8bac334cd36b971071f38aa87670dd178417e4ef29bab34e4a22685f57e1cb12c899605bef84494cb058b1458fd683b86517dfc6e142c603e48c6cdfe3813a65b8c8fec9fe86a0a80a20deeca116178e5ae71cbf4226aadb7098aa9a87265437d62583528de7ffb1d26c887e855de6befacfa6ad6ba55b26dd1dd27c238589144a2080d8a1dfb3979aa1c8e0e1691ad3911ba66b1ff705856e0d451f8720d2b05964fc6a11509ca76b3060107cadcb45fa3785c418348321caf7470dd5e52f756d89ef4642e241e06cc8626af2d0db5da0d76ba074c59a0f8496f45a1d55b61dc9abe52e250a34f6ec79cf353998e712c62e9e7782c24b68676813113269263bd5a36801f88c39dde6f7dfef6ea4c3972c4958fb0fe63b268dff39f7b3df2481ea4acf1bb5db76fba5c4981b7eab77db2c23de2b11e2ead7db601cd1b6f5e86b5e6c37418763555bc8458eff7e802b18335c72ce12fff68ee581e3e230af6a56bc0c9dc99921ebcbd1674bee1b902237f9ab70edb6b655e82cd7cba88b8e2849e2f15dd206721ad142984f65ef13f3f143e5d95c25e37c4672f3efd4393c0f26b5280dc330e74a704fd6421505f65a923a4b21c40668102f7b15dcd0f82938fad13c4747c591a3ee84725634186877219dbdebbbcb83b98118a4640fe93305b571e7e912112e63e1aab96867e438c612ff5b32b828b09dddc147db76cffe1dc8b6542d388948222c1956118a203456e37ba6178300fbf711de38c758531b004a227f1fdab53a826adf3e6329dbc6cc72f3ae57e566c502fce9aaaf7d8bd42dcbbcded253e6478429bf846db7c0185e590d391a1da5eadfcadfec21aabbbe9c8e97706c6eced6f8b1960f41e6086baa9c2f4385195b124df5825dab2e57afce2ce59628ef6df2f5c644de08071db5a1ffb3d061c3ba083c4c874bd9d040c87dce6d7039550afd7ba98da24f7fd96a07f44040639452d1e8407272a137c28233a650706cd554d37c5f44466dde0777c801ca7af1b3e29d38e2b32321cdf8f26d269a8c1dac3f5e95f0393d2fd0c1911bfcce84da0112d556df7b06748c14c66b1b2910840991a75184b669b0a83bbd65a4267d8cd65400e4adc7ec4c706a478ed4d5a7923e8bf68941a6f397b914aa2137daaf543c73f8415329a5277aa90f6a632d1bb41ba4a9da1bf741b9e640dea902c906f510af80843fb59f17dc8dee8f27c4b255c0338ae75918311eab7100518f536fc3f1927bb56e3b186a9526748c61f7cd768fa1ad1e4376c6dd8ae91391a8a7671ec8b446b47d8d92a27ae5aca8d20368870a731aa411a2ae493fd133ddfb2a2ddcee5a8b6ac3665a6fee0c64124f07339b24d4ae9ddcf0f46ec28c636ac7fa209fa4c8cfac5c4c0171df05e4d8c69b8516816b0df2b05862471f65a7612da344c479270a78cbbb54d6f496a2333024b818b0d21910658e6aad69ab2c816a8d9af76b2576b1447f613039a5757d131b2bfc37351642e3ae6a2b8b262d4160225f937190bc7bd8b774edd8eb2d12108597a1e5cb05213fdb0cf0e1458f16c74c71105ad80a14ed1680dad776e6213c2f7a65cfdca20cb7517802c7d30d25ced7df83a0dbce5212f427989db4edad7622bd731d9d74b62a318858e0586547395d772f5f7d0ab376bd6839b9c15be9c111181d0d5c3cd460a0d1273bbb818d07bb0ed2a9dba9cb59b0e839bc040bed2809aca1b069a83dfe6da1b1b800bce62747dd66a3d270991335d0a80f1fc555a6c52b458369db029071183296ed98990f888ae7240bf8ba8609111b01f64dd4c7f9df805b81a58abb8ef49be421820093b54efa715f42dafa6e71a205c7252caf80b72d2ae51c0c017d40218932150304b2bd548e4bb009aa5a968d182f9d4702f4141208695d230ae6f4c8f7cc28698d3b0672acf0df2c36e57500429b460cc89eec2846e14ccbb2c2d569121dbd8fac0f8f291c02e152e0f51889b02e88b8469ef16e37354f3f63fd038696aeb8ae5574334845ee23ab2ec48cd066aabfee7ba85ce307242abf794d2128608510bc60a4774da2c9074ca44623460ed6da1c958aa10a88deba50b1df4d783618d2a30186845edb4d44a24cf3aee719f0db34cba41ad30430db935c2f30d276f11e35b47b6315e82534d07f8b1696cfba72581e5fa3cba2e7befa8c8350d68315c7f758d87da0ca0bae484b910babc2f0153255da145dee6546d8431fe487998facc1e8a18b4b2017c0f8a993b08a4f853d645cfdd7f12294f6e65057717656971d2bdaf8846350e6a7b4db5565bb91a6f13eb8421f1bcdaba61f5da99fef77b9b8b6ab5dfdb0a1fcbd2624146e6c54efe99002a7d1ccef3a6a049aa79b3ac7a082c9a9f6702df0e8f1fd1c3e0907d13ca2d5c9943be4b5465b0a5922f69f1514bea4cee8368afdb09264d20a92b4b0d54a917b8554efaf87062f2e7c1441b8a6a44eea9fb61fa5d28b2dd1fd20e88281f1ff52d248786693efa499ebd7464b3738aced1f499222af7caebdc4e21c5893461621afffc7edb52f2f928747875a10593dc114836349b219122553d8acb0eccbb105349265538ff196a8cfe7293dfa81ba58ca7b7979ee3300d90c5393ac4a82c6276c57f930346deb7721b993b1bae09e47cd6272867e5b236920ac3efb9b9d6b41e29ec033a586071e5e53cb11e1a8293e1b49673624225597c49a63755c2f53f95e7c5d0857afb31ad163362c4f8535e2b2df837d64c0b6adaf017851baa167877f63733b6715993e3105d6b1a8f6202388fd5d6ce021ed6bd30f7c2145977e786dbbe968e032ee5929e65bb5f1f17ecbba8a587c29d69fe430780d30434db3f205e13022675a75dbb582c0ec8bbf00b37e157934cd16864af98080ce4789b24c40dde2d45692e51726f42e5f5c406deaf27b33c2e268dc7ae03f8d466f5a6043b814fe0a23cc85b7f6e69b6750e3b9352b34e78471f628ddee680be61a2cb8b371d324451181e54b00468eb1edd149feb6bd8b65621b6908b9d90dd1d76da5d212bb6afd6094a2398b2c54f41650082aa65511cbc89f8dd6b8ba81a187e288d75f120fc6581583d6502bb0b22bfa99cd1ee45bf31a3b9039587081cf28a91496152901d9fc965c954cc71dba5c4dafee67f7c0b2b62a1d7616999b27bcea58bcbbd55d7956ba41793854e4d2c59b51d6a9114142edcbe9a6e95cd0a1733b4c2ef80dfbe56c5e92d516edc68646f89ef271cd3667e0c3278c8f968e8020bbe7f51b65fe82cba0ba3104c48716d03d3975ff1046e6644b528c89f10624c1f99b4cc2936f268cb7defa05d49f15d5a82946c98a634d9004a315d50364ad980915a758b35ce3e91962e96199ede91d2cddd212f2f3b1efa465e0ed0626a5fea7652b4fd2aaec1183db649ee9504d5cc415a0f92aeac9a4afc1288341d8cf74a711984beb31a82fb605cbe77599fac0c08ab17929c6367ac54c9c547385518ce3a20ac03f700d97b38167f15e8011d92526a9d6391a57e297222d6a00a9be584d59ee91449bea91c52a80087942c66ef1ac5bbe7f38a3060b444552cc58a6b92fe4dc679542f84061ab27264ede6aafbfcbfc1d506da2b43970db032dafc7056419c003e7614b154482077ca1ddc54a0a446a8116a70f0c6c241ce2b43567bd8416fd29471544ae581740ce95a52983ec0963aa073755b73f0e5c12d796b05c6a7542d9e4e4d092fb8ee0dc89a8f5465a43e0a92c927bb32d16bd6055d2e2abe860eb4bbd652ef090dfbc52ec9fb3e86a069ea63fe3390ffba165177cb3768e7bc5e45d0b86b0aac27d6660426af993da77b80794d1532c1e20d8c52e89fdc370f8f1b087ab689df216285ad668f1a39985fdb8dae8e226e54ad723ac96f8fc4a731e0c4116c93fb97c2857ee985a8f60bfadbd82bf2b1d97387c0cfaba64beac91e72d525beff87935115581ab9afd1812f1e61b46d99ab2e9016caa2b6b11a6959d1212e80aadc5c1210bfca8c00d8ed767012d4cf8101a2b4654e10cac7342fee7fd869e8fc83ab7ae0caf55189511f266375b4aa66227e9f3b1f0fd37cf9ec2cd64d27e4c4eab78490d0cbd03ff96237872959b6b64e2893c80512470794b1855e63b1077d40bf835c93b11675d24ad6396a5327321c19543d11bec71cbb802aabfc55b9d09c7d83fca03ee3af414fda88a4eeaccbb3f4717e9aa7d07a0d19f38bfb3ef445c3f6a5d0c1d9d89a2caf7812fc36d1b1e10bc5a3a5435af6e2087c34e770c1d73fabc8f0fa908aa4e487a8d2f11887952008622ab8b8d9db8d981829c54e1a5de3eb3766d0f5955ab74aa2486067cc75f11b74d400329c23c07210bb1bbc39204f83c445de9875f9dcf94e0415271b5925eb32813035122555500f78f0c4a108d7e0a1b119c278920e1f3ba344c1fe250e56a577710377b4d08dbd7dc3491f4c3414bb9fc995fcbd34d7b408f36f3b10d8af513d3a85a62428f949586babd70c15b0630afe1db956d05ec8fd7ee4d4250df08ddf254e1c27ca192accafad9bf4c9301b62b7fab614d0667351334c92a6bf8d2db855b9d2031d371059e1569b4e3df408b4e5613642a6ed26e65c7aec3c2a86cb2533e29e80c08a3d03d0e653c927032393602a02797119d62c678870a7a13b6420bda1889804c73e930f65179fe8023f3fb1661e64d9e5479e247f7c123e9666c19e89b634c322d4d1b3fcc45c61c4b4574822967601096a83d870ac9ef98e82cec79c008de2e0b9c7afc95e86b226dfa81932ba175268f0d7e390951e40af0b057beeeb756f7983496ddf18228bef4b3a8549f943e88946ba49381da02aa1bd67d0d737194cf1dfbb93e36b5ed54887dbf908a353b65092afdda2d4021b575f5ea1d4f9cdd6e968a96ac3dd6a442343d90b1a28ba19d955bcfe338f40f59e53812f5be502e2a082e501c3a356200b47e7f0575bea4bdae77a9e385ea9c2b71817fb942971cd659b2c3b0f80b0342c7c3bba06adc8d75caa5d44209a8bfc55000053d43868041d71065ca61939017c00d16f9398704c052eba7e4869d72369334f29fc432587c5608ddb47bf5e6c08c3ce58bb1257b12973a89b3640110accf4f26a7fd0ae57ac5db02b7709a27f811117bb33669f1139e2043ac9d1286f288cae9696a75522e8f4177ff0b7456f6170892c7865a92ad49af6a85d11ad4bf6cee3d3e80c7388eb3666ebf4997812fe14e795f7515979f5f1ba3de1592c79288408862985bfe5c33a360dc963397a809ebdb21c20d9b681dec0590f8d98ed8d959ef9fc95de6adf19ba01d9049128f3f9f0e087f4c68d201c36b8aea07a3c7577aab068f79f64cd709551beb2165a277d2a2dbf89e653e512f0f4d905c6a5ec25242e220cf838f5382262481b6b298e32438221effd31cf0a49688e574e65e8c081fbf6a680fef754cd9135a16a4f932d23b9524dcb4831b9fc01e52c454a451759a82e776faea3a6f81cfb8373859bef442ed3dea358bafea3501b6b72a0b2886ab83a210b5378bd9563a7908d4d33622dc3e026d79e58f16a22bb7d46adc2a982cede2fcf5ce5ce7c5ab567c4b60d646a762345473296141bf0833e797eefe35713af32669b1cf9617f75c785300e2a092645bb62f23887c13089796a40954bae6426e1898b3c683bf623cc6ccc138445c5c52d1166cec802b0b6b51d52163e6d0c55989cda9f8d68270f9924a52e197cd38c0bba515d2a69a2002162dafbb5258a61581e9cda65163040cf55f7aff0117d6c2587ff5b3fa9660d53cd50b8880ee0ed3153ae91c591e6cc5d16243c1e06d45e827b377e988ad5d617af7f3f2686acf249ec0e5790615d0079dec7f9339106d3fc44463cac394108fc86c83fba3b85fa4c78aadf5b4d9ac8eb78d0c7291239e65a784091e77eaae8ba450a0a17daebee902daf1d1e460c992f8e5624583c8c651a130c14c188c585cdde36c00442dc29f50e5d3e0e88f6729336366920956986592ffc25e42d4fdd76fa9ef2b8475ec56471226869ee8be0e6bb0624db6c7808647cc9bd88740bfa19d9cd43c061ba4139afb3e22d814d546f9e82d338119bb9875a19294c034e881ab51a072e2888fe8f7a911a0f5dcd830bf4d6edec76b0ae66524519092b7ebda85eb38b432247f3874bfc0023f6c0876dd1476d29ea17c71804a813e80544fd0a3755dc2e37e8d951c8cf95d65192fc80bd21441814bfc249bc4d8802e361d36b86184da2697f3856c3dc4f0b86f1fcb8a33ba285d0a3acef6a23b7074aed1ed15a967d94339086ecdf896a7318f7fb32b864631b18d5761e2fdb6c79a1fb5c043d70de28d5f0e69dd533afac3b3d2d9cfbcdebb309b46388d649d0ed32d30d3dfc918eda088fa39f84c5694b88b6655ece8980b654ec3d47c0a0ec7b7797c0614011f7cf57f9c46cd8d2e90d9125404f92b9dbb36bd3d9f6a3abe9edd2a62e0e595a2fee7a2f67a344090120056b3023ae6a6991d7d20ffb0f38d673498f4cc5cf022c7565a716845f054fbf1573a6a733f54c324376112fc507c329feb837c31f671bd5ef970c28519b66b9fe09e83a5110bc14c031cdfbd4e39ff38a552342f369220e9cdd623f4143b3a4caa2b2a87c499f3fee9744d5d2cc85171825d988dc5bac0b26d8e7f43c25378d8827053bd88b5f06efa3854b530963439d108d92d87088a853e0a63b9743b495fa2d4ef797dd9f2cc3e6c1641d40f112b2d020c13da59676a122afbf6b6d50355ba901ed3384d743202178c557deca94dd20aa16223155b93e7a59eaa0416b6dc4ac8cacb3d39d1c28bb6b73638628266a42753149e3c30ab7f33b01daecd2bbf566f8aaf5a35892c3c9de83f20b90284115ad4f46b9913d9985f1e76757abd9e9c288cf1e45364a6d2623c0a04d031ed2017393f9f34923d5e79a5714ad7cb7404e3fa0a90ac881ee08f39967e6a5da7866d6b2075c293eebe7f4fcfc80c22599d12bc15f574955d7f49e75234d2dfc0536849a19d6f419eafd336789679cb96fb57ac9a6698539694b197593403daae72c162baad2a1988df8343b146402ae6e2a5f30e544cf5511fcf075ae834741acf68cd298ab3a07e7d8b53f040c677542af1221e261de84cd62d6c0956db0d92ef7830ccdc7928124ed20488644300a99f7f0cbf41513a84178b710afd5b47102ca794a3b267a01623308ae01d60f124d88c8af3695bbe8637250fe46f53ebf359ab6e501aaea643d3d597babc437b243ad1bed7c096d2b6e2f0308708c0dead206f7d6092974f0c23d10966b4dc501a03dfe0e842dd0d2418d35dfa0b7237ec43698110e8329a6b2777711535eb53dc2677383c901724df564a01939bdd9456b93aca7c0eb6117341533a9335a10e2d587c11d9916d7c4890c1537a439fbee851b0824b1f523bbff93b580126677f6ce02a9a5034fc9341b8fdc790f9ca2a24820ecffdd7f6036e4cb06bc0301a0f264d46e84621649ad65c7f24917f6dfead5d9385362a829d54c14829e16d559547f288d5a59081f4c9c6f511af5e94804f10d1fa4690ace573b82f10726297953db7c7d38523658c9d4546548acea36cc8d11238a88d8501462131b9d0010cbe488048b0f83d203107bad3d777c587608b6173c8c1d58dc88dcd2069ecd981f87cd9498196c40940ddb85601c467ddda3cd0ff014c7f779cdea0f039f28d37821ce4db6669195cf5f28741341cfdd84718b4d573dc633c42030ff1e7b8d11837ef70b52fa62d2b3c6a8df64e0cbddd91e5ca87173c32a531eb6a6215f9ac61d48bfda398750ff039ce903561f62ee75e1410b8c884f889bfd4ead3621b1dca902637cf3b4d54800eb58155c8869b7a5e1ac823c3ac40a191c894253979d0a7140ecde4f6c412ae707fdf858ca6c6de95db80205d1946460242d8887b9219c6eb1d67d94589dae015e2cf4f4709b5c0317b9513044a389110d22f70840aca7c8c6fbc81846e2a486b27304e1504033e9805bc41194f1b04a56cddaac691f9d612a6c95ab3d2b7dc4f25df31f5aa9349fae70ce2226f121556872a1c1c6333ce81a47de02dc5adf68e2973399991810d14dbdc2fbc6c022921383df5c03ad371fbd00b9bbb7e1ca6c63bb9205aef492813f654c2fe128c1e98c3c2843400218efcd34adce90f64614e752556d77eca1c9232ed2d7cadb928e330c1ed0f88ed9834ad62de3bd00eadc32e5b79aae44e1331b15ac08356eedf0e8e6132e820b28990b837246cb03f54e073feeda6a8ec4f9ecdbdae07921c6f0b06edb399f77895b33c843d434a86d538e0e8e37700c88110fd54dc2fc82c686866cd1c29ed427050751b2966acb056818da3e79b84c4e37b1779da3a101f812af231f792285c789f087941431225bfaa2512af3f4121791b987a83c5c46d2cea321ae16813056e4ffb6c9c6c346d79f5e9b9a7fa70368af5a7ce4f6b3feafa57d1e61684634e07221012e4a03787c7f8f3da6d3107bcf03eeaa47fa8d6b09b2e7549644bad5974b374dcc1da11221f81c22f9343cd58e43f229a3b188163606d4a0fe1826f6eb66d1b6d8a3ecb8e3c434d419af53681c842521ef7f29a3660489543b66d80a1370600e2ad5316f7d3278d376ed39d377a076e01b9e95d65da55c2cadd3a2b6a3ff7d40a3cb14545d08550b967e48da7a903fa632b90b5667ce5048ecf42957ab53b8b712f0dd68004351e2c5d89bbfc2261bbf76795d1388b034514ad4a335a4dfbc17b9f736232a470d5d6b9957d9f7abafc020523c74bdafa9b82f2d48554d56db16a04d0b26938d2d3d13e34cc3a1dcd9a0f138f7471973e050bbe26f6813ae1fed03ef91daea1cab3490a37d432f1af4dfa4304d1131ff4f30cacf53153142f348f7b51a2fc83e58279f0e8603393321d86b97ffa7cf21c8a1d198bb9a8ee3b51c65e4a4e0ab69b62f084410f38d9039920556751fe3391bf6560e2acb3151700311331b02fa54e44bfd4ba103afe621cf8fd1fa83d8c30184a15f6ad48fa9c29059867fbd5caf143a40282e1d819bf3c371bf31f62df1d80d9fbbc5cfb4a18db255c51b6d55a912bb0465a175c291ab13f838789ba549214caca259192ea38bffe43c84a87e4cd5d6498ae94ee3a0f99656d3a825b7172e9bb28150ccedecb77aca715c441b45772fe2ce4e7635ee4c8258274f3eaa94c482d097232a66b7611c8efbd80e5fa315218ab857ff5ae03ff33976c4ff92f1c4cebe43e993f7a5a9b8b2a132e1fda7dec957b3b9e98d36911829909a284ed6ef1240e02171b323e922212c78cf84ccd2453b092e928c9a04c22f7825300f5345c3dce8e5967856b084b851921a6257a68d933b101b9cd135fb12a159c190dd0a212960e72c8a0fe64bbe958025dd845d296a509a760702692575aad8f0bcdcd9eeb7c83c5557b134d999cf01ad47c7c1cd1ac7406af0a44d5fbdb9eda198aef9c41e77061506445e4813239e41dee6cadccaa221fc66f6ad87cb421821fbc9172d04793c0c2e044ec1be5d81e006e2016ce7339022b7d52b37b36e1e648a02f4400902e9d8ca229565d9d3ac04c1dd6a8d4368f302b789915aef24b76d1859947b9a551be34ef9b4386ecd5cba2712d3f4a9afb50bd2f2575a8d98e75b065c8e29328d89a1fc74f2aa6174ddb527eeed80e5fe83475d9a78fa525901e582a05e88f8ffb558438e32d68a341de6e95e6944d10ff97abf89cc5c4d4abb6a55898b09a9c46810b54548556ba7296aa31a80e5c4e2cec5dc58b0c8edfef3e41541b79bb844ca925901533c7c0ab303f9ca371879cb68ed6fb9b900476dfc175be1803f14848ebd88d6af69bfe28be8d0da3896e07d8b8d89f40f348b5ebf010698e92d44d4c2976962d9b576fe6f9bff1ba382a4a3da6a85c7f087df812800e3939c26b4c44de3a2bb4d0d5e5e6c5c09d76524318c2116037afd338985499b26049e7eab7853d6a773c3ebea01f73d010159351c9a303e11c1d5bb9970f18c4ff54d4b690a7107664d73770cf628b8606d13ebd6e4fe80549fd336e5c6808033a8e60d693f5dd3a339fb38a39654188a539d984cbee76662ed9d5d28a5f1a9a28120487f888d825f7c3541851a6220a2eb06c7380cb6733978ea5e41f0ce2abed93029a376c66fa7eeefa056d6f2fa00f025be678e5b4a25ecbbbef826495f01101205991592a7fb231f5e0726c00a4b618206d9a14843f4c30473b4e091d92f41f05ecc1269559fe17fa2bd7b881791513551312b058be92b229f7454c153776162f92579b10ca2b35ef37dc95e504b6d92a235462325f312a95953174a3c4bf8a9599ed4f44f49dafb0fbc49a3b2330b5db7588a792ec00d68677addcebf77680831cc74302c40f2b0268144b5f1970ab4839cf8d466ab3ab00547a45e1eb272519ce0a613866863b69f3e5d9f7b79eb9313dc04a09462c354c2845fad52e5406cc412b77a32c071caac2c8032840a4dac3fd01a6b4133c16e438ecf28812432b51ba02a939892bc84c087b54be99705e77a344021f2b70964c2dd445120323c85b4a2a16334c682fcb0869ac0503cced5b51fbc5abba6b528ab0bf139685f9b09f313c0e9db38cb3955d49eb5d72885d694d8ddd9e42531c6f11297e1f15ee92be370a967092a09eac04759681d0eae33e5043cdf7d2d4129f9c9fbb227270c4ad69db3b3e119002a3726783f273bc1abbcd469278ada4c7ff8acbc5a839aa52a33a8223b3a03bc80eda648a6584a220e504d435a9c014f2ec135faf78cbc7f488b532a868baa0f4536bd4323e7e27c1951e72c65d2b8563c311b676f7c2f7c6eeefa176085a6f08b62e03a23c131739e87bb9dac05c0448093a22dcb491b8389fe4c6c962ff8843ad0e76baa23a6ad6aaf29048e3174d3f71b5e1109852cce9b92a8c0b34a065d5b761f9baa13b335e95e8927483c95c7ae2baf97f59dd50d397c6714e0a5f1e3cfe4544057ede6ee94bd4e21b483ea50917d1aee469701008d0baade1b55e707eab23e929cce9f730ec14831c9be24dc7e071839714ea095568881caa5dadd42a370032a289fc0094731ba4946d479788ecfaaee55b4cd3466a5b4b2446b04a30d5a5503e8523d958afbd1ed1fc70f487a579d11d0816073daeaeddcf85cdb54b54f177e1bf3ddec7075ca8ef32f9735cf82658a145586bcda4a06ae26d61b84a59a0baec5ac897dc5663c81b3b54976e73c92d07f26fc98c78c733eabafb9559e843598ad76cbea68336c70786cdd7e7e0d680e7d9e73caaabc8b4f8d35dc60a19dff7373017d59b4106c569a2839c7b7b274308711c58e658dfc9ca9756cdff2c1716010df4eca49e2d1c2c7fa17ea110a979d7d046788ff86f57ee164fa2491787dd64a5e13a745eb60638c20017e013e04f3572fcd247b0d71abbea295dc36134b4c238b963a08b00e1a690a8374bb12be81ab11026a27aaeb533d117223a35d4ae0467a7dbbd0d5830d6917290a5870e6dc46f9d9398b5173b4dfecaef3bf7ec096ac4253961925d592ed75d9579b574a129bd1025492c08aa835ae96cbb461271215ad48cf5b208816e7cd0c847473feecf1d419cb6bba5d77fa4225a20288f5274846ae94f5987bdced38d756bd8c396fb245a9e2b4c1326cce16a120d8c30d3b086a2e8e6245a358ffdee715c32baff63fa01a32659414a0e24f2db0e2afaec89365f7c45e22b662f31240e7969723e008876479cada45ae650743cb4411d80eb74ade9202275304e624eb0fb12fa93f1586f671633907e4b713d4c05b5f2b1e70454916e45d71ac2cd380764527240489901ee3a00cea6088faa2c5c9a799ba93adc666e41ca3ab4839a53321a33195854748128a1596b4982f223b41f48d514b6a484eb9bfa92d5af769bed16671f625442b5b0f289d39e8449cbd8bf01226429c5f4407af4a07e75618135067374d6e9a2b37e064ed786e6c7dc20cd45bb73b95b794250689e8a557168277439e4bba35c842c1ede78a1f7944d74f4ff9ae151b6051612891b53a3d9f224672f8744d6d09f81d5308fb7ff59654588084f44158214eca054eedab94d6930b15f1452c727c5868f14e02c9d9945ac048439c393af89ab61a422ba67e4d8c07326c463a2c5712ed5caf34420296a3749ebc694fbff47f69753195e2489d98261da76dab7831f5e660aa1e21961104954140165593b5b0b6ec9525a337ac3d0722d0252cb0b1c9b958a0edff3471ef0d509ecb6ad68d5e602a17b00ea99fc3057236d18676cbb8bc5b6988a8d213d1d31634f94a952510fb1ee1b66ea3117cf65463fa42b44b96d303829acfb26b791b30780b87c1c7cbca3afcb97f18adf3176b79f003933d671d5cd48d57f049d8759b5475a5805373d53b003bd004790bb1a6403ac35a6fde7e9aa250ac2dcbb0f9872181ca2f6f1c11070a53a37cb88e2c4ceef08b0dcead10ed26f90dc3594b7d2b1089c4caad77fb6c505c9a141dabac72e3ca17234e5567c08f86138fd871a104dcc34b0bbae329470851487f16acba4b6da1f4f19e239a6d68dd7c7819706a2aa67e77a778db72d911a77801c443b404e6e7a1e91664bbfce3ea8562cc8ffce7700244308983df19e007043dd66d86cebf257cba8227f0993ae355c4c6a1e0dbd5552350495524e5bf594fa653073ca5a38b4ad6e20d5e1f4a4b44d54b95582d74da101c06625259ffc2020662b1738dde95a6c67301f8d887c32793101f74408a92a83c199492de55223dfca478067406586faf309c2ac2a15c450fb60265b27fb83df96ced792663d61f8eebfbf827e939bd0031499083c8e5274b13e6ace4991cf85dbd35621fe46219477bc996b6dd7163c85cd84c8f05ae9c7604e19a8b2cda641afe1a20db79a5b2d2c937c9f31686694670805cbd7f4251f99568fc1b9afbc6ca0fa401221a5e3bab4365240d75b84f64be0195a44da6d2e0ffb1cfa8416ddd994e15307f86225c777d8257ae54bde5e6c5ff8b89ef5e225f4b6c7f4c3bb50851cda62154d0081d34b91344ac33d72b0faeb2605e8bcb69a9135cafade1a1c540ac9e10193e95de6d58591a202918c7044bbf0bc59186736553289cb3397189df8a1b09dcab9378de24dd0434d46b2261e76f2173112026dde1483186ef7268294e8b91e649b36e83f3c92570b334e662233c272b9284a6c9a0da34bb670ab02f519863a3b50f874eb95648b740397870bcdce75b0d66e7d9ab763b04ef06cf5434c1b02c54c51e83a41d7cb7a9d1d3c516cff1fd371737211128e46a2a865fe1ed3aac76d689d9cf22711e879b8d76f1b889f61aa1df3b03dae0c35d49ce3027182ed32ff993444c8f63e4f4a8065c91ab8b0944e24e74cd1f1a244a05068b5a43b1497df6ebcc3a59956cd10b903fa5620b949dae2a184dd589154ac609f1aa9ef3fd0c3e687556e6c943a1975df244d8786240c59a2e490d50aa785bb0eb33545ad00aef11fc1db7b1a674874b5f89dda6e307a6eaac1cbe471c6dc279745dba6e8a982ad94f5e26ee00542ac96cded164bbc9b3539e4343606f84d19a41f76a3ad681a343eb32f7a67978a496b15f4914625ae662a173d536ee6f8a7ba9347d1131d7b96a3caa44533f5038ea67e9993a874bae31966bfbc794a1f35b9efc249a6076e639bee04c1ae6234f66cc53342b9c5983ec68e165797054adb636ae71c6ab6973b63997012747b504ee426a46230710528245f271b0b4b120e46e731cb9f978abf4be721391d0915c46a302ddf7b61c23fe34e0b7988840c8b06b22ae586443a2623be6a79cc08940bf004ef733a5b7a559fc8128986c71170c5e461334b812d87dc9ef3c46bc0bd667a144bc0dd7c26522db94ff204d942a10408f3107b8d3478f51018d0d7afad1116121361260f785beb5185b3a4a91fccd66e982ca89b438865f0d60913eeeb9df77b36e3e79738ea1517c888b6dd26d8fdecd1153dc527187c9a98d984552102752e695bc2c5ae18fe5ce73dc0f050e0d2db7c69fcc8c30b878821a3d9df2a4214869075ad75c1f6e5e0ba980e07f91e53ce10a5e8c18fba754a722f28a369765561456974c0dca108bb1f420f833acf526301b018564d33e1aede0335b000757192324e7df4f80e4c11e5b8d806e2040425b926c26f9be6b1e0ef5dfc70bd993339bd39033abca0237dbe6b2073d7327f314883b052f3831052c2626ed92561d50b1be74c5c423ea7df697540c6ed4e6f2737870ad91d6c80554a17ad37ab9727dbdb821662bfd23a2f8c3e8687e299c8a7125a75db559d9b4518a2b1003186fcd9838303260186ab2b0e44b35de5c8354a68ea69d174b7c33c10f3879709c5fee8c1dc22f6b0c07527011b0cbf6c4352b391f162e8c7424be55e855b27d3ff613db56e85525af830dd0233d1312a63e52be6f8946afc365f9e6903b23bee323535c3321f4124a404496318f6a1f94230d8452456d53ed43f322d04928d02ac565e5d5481699de8b7efa0ff5d9718a89e64d14f05716e3819b67ff4bc5548cd8d8ea9a94c313cd733c803f15c1bd8ae962af3a4d5c491f590f2b3b0ba26c925e48b1b9bcf8e7ca281091b0f5d9ad2f45b655a2e5ae9739edb51658c7a7cc788fda2c833646811f9fcb2792b89de42156a3c34c07a808879bf0abbd9b08343b8e08adee2a3795d5f24196e719dee7b220dca49eac557a741b2bf9512b46e665ae7061f0c9f4421f8ef5d9ffd215ccbd837fa15ac05195b6ee4699740a5d835912aa1d8ca58246b465e9462ba9de0f9fd555288f8e61863697560a366fb0d694f1a03c78ec79130a2bed12f4deb851f40d4eb27fd5c69b885484e8243138a5279c4547084ca1d9f1c6b56ca0d4e4e3c0b616485bd8fe6e5b8c237f8676ece24102ae885238456e04d8cf72437ec20acc47b707dd0d1c8338ddccce6a67f1e135eacb57e4515deac7cb2705b1352a16bbc9de10c2a059f1ac7a2156ae841cb41f6f0ed1af73cd166daba0c5d5fa8382a8fc877b746478b2564aae4ce2a998b097bc527b44b00ee4bbfa0a14c7b807adb4d31f070594c494fe1404537c644290abf3174fae852800e6502c6c04a0d00cdecb84e291c225fa40ddffd53f28bbf2bde3015acc0a03b4e6636ade4f4ed88909ec9f51b2c1028dc74fe40664a989f69b774ed56388b6cf2d7a3f5b657dc816b08766bc3c21724284400931a7a1d8fce0fb947cb0935985338ae90ba30e407b2bd5f5e85751f6be259a01b3fe64bfac0f2f96e92898496c51af5580638e45890a8b17957278a474adaf90835c9bbca65c39d6a5677425eebcbbf7d32c5eecc1c495440f1abaf550ab0347431c9b24ddf0f50ce24a2af3d964039cf782a7bb6ab822b85d6587576596251728953d92f6843d14c207528386942df47109f9d0a405a392e427f1f34b93d83490048db38bb81766e35cdccf2fb903cef71e4c9228559dd1aac0de7fd7658409169c468d382eeb512f87d7bd8e50015f74f207b1044e89644b87db3e0097a7ce2436cf90de5f043157bc942683d0f66c535623ff162b3ce598af3943f27d1114f9e67a466c5a08bea0d97c2cda582aee94e3f8a7f7c4802b7df4fa798b0da5b8378b03cb1927acd376467d1e78b860096683a713e7d3cd8416fda734ece30b6dd376644f1ce3f4dc0f77eba11b913ffcd52335d61891c368ce76e63454937007b63a96ac57e330687ddd2ae8a9fcaa6014849e70e9c0f981447e28d08eebac4c3b5838af4a321a535911f6c539b109705c06b051edcf5c4203a3c628891e741ec7285163099f07f471b47588adf898aba0b7189b80f525841d9f3e1093824b4372fbe738316a43342829b7b1e7374978610bba6d961b3ba4a74d5a504284693bc9d1ebb69854370d0b3a8771bc71dc02077982b8bb03338f600a3d2ebd98a57bf3d46ee7225c618f7ca9071c6a958740202610ea0282252df5d2c62a6651640c83fa8e37691165b359a786ec6858480678b62b8ab6f3431fe743cb023d9b1b8223acd86b169a164e2a62e3626b780cefe4a4088432df4a244be431ae422f1d586faa7bd221433e88866ce7aa7b42a71cb263301a120691d4b5ffcdfb6b8e3209762b3edff6286823aebc5451670792aaff5247b313378042c427aa37816efa2a06a0424f27254ac85ce13a04cc641403b8da44ae5ffabd82e7dcc195fc8ca23cb085482957119db777e14c787d28f82d83b243518e0dbe28ffa5eef745405e37b4973bb43c563124854b494ef58af000c2c182fd76f58a8743bd360478432d4b0ee97ce1c581aa660ff111e65f390cdee20420d8fa4d8d692076167e6b2ef772695fde4c3fd420b94ec04761bb129598ee707397da0518c054ce178a646ce0e9db289fc301f2b432acf1e1cc9ef5eb56448f598c72586fbf008c08e07fb047bb70de34e85f5dfa9706bdace478a0be5a82420becef94a4f1d94263de507bd21dac40648c4a681dbf628f8707d2d2c6dd401904ee01680ebe823304928cb0239193076fcb5efca1cdeb12fb1e109e8491e5207322adf4a044037f4a02818fe52abd813bb931c2509640afb1aa2cbbf218b08f98472092cf7fe0842444e10df19061e34523bfb51038ef29cf29ed18fac3f290d2f211e228a219e0ac384d3ee01cb628b6e210a684ec13b15ee16ff5c9e7c51e1d83657f30d74951381a2cf0f8e4bc458290ba4b340d7e659294937c05ab75c5ae3aa4a38f4a4a0fe0dd2497877a83702c83724a24de7152d459239ef472afe5ea9ef091b66012237412cca772d7b391d89aa8512c21ae54d3dd91f2bcb46691dd9d955ab171df60d861860137a5a5dfdd6fb4780b2ded6017d0b663bd29a4010cab8fd38eec114a37d01aff11406605486fb8ebd155f275015e2e3d893ad5220178f97addcfe06dad81826225888604530d0a16571cceb45635fb0c69f60ede6ff091074722a3d749cc99eaf08c522433b2a75c12532437de9053666968d66dbbfa4d54683e1635404e12b975997243d9012bf523ae51be174232da9065ed45c4886165434e87a136943bd4ccfb9c5e62aa2bb41ec270296fb4a2eb76f1091f79a2af8729b675caea7774babeef5a5b1dcbd7b88c31d83847edadc280a4e02942a1419c4f8511fff75e4ea13d3d40737ed88ba62cde622fab19725a98e018b5d51281eae636a7b547ea4941c26a8b7b5916fb648e274040c6ae13c35fdddd2f49874ddacda922a0ea56eaccaf1a2170c18847246c8feece050b4a1511da13d151f30e331880db300d0d58cef821c90d02df1e817e68b9bad148242f4e016169eedcf00ed03054e24275de95f013ff591ceafbc27a9beadda8c0f1adc4106a00e37b9f8c1d2334f097b9ef6602cfcb10f8c1347717a563c92f2ccc44654df86a0a25d84d364da7ec0d2008f677fdce7e454211244da0baedf597cd5a641a82bab1e959d71eee131a0b05682917d427db195b42fe63b504cd1fa98b8011218f17891852788d1763abc05c7980a2d88f1102a42db1d38804c9d72d7bf4f909c1ff1dd4cb3d2aa543927385e0c89624aaa6c6399ac10f597c568b01612dcc3a981d10989c4042141611b5fa3c7fa67b70b2e8e8016c41abe720ab3eef1ce57c2723de3a48133ab87f047f894f2cec8b5e4c5ad1d0dca54a8315f4e82f1f2d0d7c0c5f60f5c51ebd70bc013ff448b596848de3c2bbe96a42941b86466d643978dfc82667b19df25b491ac04907d66cb73498242f88c54871da6d1c592eb8b9d6d7b3f83276cc4df65ea541ce82d7b84cf2bd3e6a62a8631e3c9c48488183639399ff3e7a980ca4a0fa9f41b6ab69923725f33603a0d8bde144a4a5cd10b8ac21344be6d7045e58b680fa5fe684f3199361f5dec7ac2a331327f4fca6615ec591818d8a8af43a8c92436c72d8a884f11b9e414298e191192cfb6641ba2cf6f1a5f494e5207e14137e16e6d1f78a2c38e6d1cb44e36a214e0587323816448068b04e22538c1f68e712c42311904426712dc5c50e89908ca93707a60126b6e79cc09ece4992cab2288e226656ee3c83530971ea6196aab06bf41e4ba08ab1423559e22b009c4238335a44f64e6f68281d98762c296c8f5c0813904243140db2a3db11d191432cefd034dfd335ece71dde2303a9446d9339ac36e59e4a31af53722e19a8ea36dc0c34dee2912a276f1658ad823e42aab286e1273a11d804aaaa3c4be2dc36e8e5fc2378c64d1edd9f26d245bb1c0f7d9e3413eabdd20e0b171275eb208c94307a5320a9604b32af250a38ed1c1c7d103ab0051d1c0e781888440b77d1af5d99c32ae8ff3418677b3dc7ce24327f9a934f8c02843181090123229bf2c463f75bfba55dbad63689cba2df98a203017c8a03da1e8a6e5920da15a903d9abd27f458ea7769d7c31cc9d5666cf13012eb38c2e4c5d4817d6c9680af1660be02e4427ed4b600ce01cd600702076e890f040c95d081e7d3bf0c3b271a7f28ca15b4b4222a8027941dc6def2df79652a69402d206c606e40623d80c9ff1a2a4c1f519df2f6962824dedc334da87b3ff89c940c791b8153e3e05916bc120a89953cbb7a09e6680a26779fb32c0202da8a7960641508752097452ac766fa01f10380871b9efa47077e53d6fcd65480a19af7d3cf849c67becf96466762dd44df0c5869e665c0e5c79ef3ab9a28cf244ca64109d4376219bc005394a981692149200512e71fd59240d98013d246cf4b22ed64a47739f59f8f33ea3588b5d064856404f829dadc9f290460c262b7c6245d7d171978e8e8e8eebb8cee7222a78d286bbf58a80cd521bb2da9881804bfb47a24e6e57e089629ea8999aadc93387cc23e66a2a993ab3c8f567c9cc2559ab944f230a2b6a2f47d0abdbf990f1392f36a26f7911588410a719dff2334432b04922e1924abed8885a5ef4a3a9e049c97ae6e34d230adbaf434a6004bdba3db4a6bd4c617d786eeb5e0629e78712b0f839c958dd9ea823660be965c6b7bc10a7fa5dc04f31bc88f46223fad18fc09cd18b5e889337832451a4171b979ff12ea0444998ef67bccb8f482f3632fce8650047e0cbf72ee0cb07eee0a7183e0650aa402dbeaf3526634cac48592c2f56fba25d79d65c8245a14260ec86fe7850b7012d131b70bf1f31d109a0d440766a29419354e28f188f9458f16f0bed6f037de8d5953ab012a808c5668809569ca86e990c2543c9503294f6a22b64133551ddd665c4609c73b240f30769fae91af3266886283373ce39c70bf8a987840192127203c60f128689cd2143eee0c8144c4345e7a84cb3bd8c0178200b143b234d4088f18425cc9546bba7e3eaf63d5bf50dc8f340b16dd53d9de366b58a75cf0dc8f34031ae9331f2c701f246de0887e7755cdd34dab205700956b67a70fdb9d3a4681c5ce7182acc47f86ebbb7043e5066451ec23210827f304d739288fbd2f4da4cb60a010f9c59955158bf75369bcd4a386a6c6a7b3ee0669e3c7bc6672882952fbeb681de337366d4629dacaaaaca65bcc2ea936aa44875d59eca9acdcc524ad7bb58ba4206b7608204ec94f36385253b7dffa3a508d7a90ba7e0aa629a15d3f068095724565c7f1a46ac58955c7f8fe723c2ca97cbc31e3f1a94b0defb007def49972b7485ae303564479d02099575fd4d9508c35415c7f8fb083d28641a661a174161e57bccdc1dc182eefc5e76083de879f0fefbd16b94a88d22286c836255d2a2bf4d3925d80357afd65ac11e82a017879b99b99b6a929341d0db83f6cdddddac854421c0fecaea09b2bb3b6ba129d65b591eb6a42bc4a7461df1fe03736a4769d2885362eb0adc99a982179a68e11a4f7ceac0235e71a4492e61187f9974a9aaaabe5c66565555555555555555516aa393cd5062eceeeeeeeed6f89b58e107a8536c14628930c1211858d0dbcf612134b9623ce5fc5881bdd7e81c7c7f4e3188abf56f93f492c3143bf6583640840cecce2311f1ea71fa00baa28b2802907f38a658973bc198115eb8fee5e072ebd7e47ae86dec5b30476af1841e273be37802fdcafb57635f23d9db24d6a20848ee46e26b493d4a18d44702033b03c2bb01283361cc4c99b97182157bdcb6d0460947e720293839729c1c512c2547ac82a8e48e4c713299176b99ccca703c742c2cd3f8f4004e8f3aa43be372de6b37a42947ee69a0426a82650f6d3cacf2c2c94cb0672f9cf721ef43a00fd07f209f38506c1f4e0621c994370ab115e4389415e528479709e226ef1df40a446f973f0938b39d1ed6670f3be5212705ecc2b287b54acb98a60ad370d30939cae44892a3cf26784029bc4e89b1e29b92a6940c076d6a9694dfbd1ca24dede27ed324101c348c1ca261bc03454985acc17599c4f5e7da88ebae2a71a049204cb3bd8c42d6402661c428a1f0d6624c09639b9aa6699a8d871330409bb86bdc03304cb3b111b817390b1a5101e3c8710d23a76a46cf8a56b5f95a47032b8eae7f7f5add3628e69cf5980e12616549ca4d1bd5c0e66c369b513aa56bdba9b5568ed5e7176ddc7e1a2014d45bc11078c8347c2587ce128707d3c80bfad58e0ef49fa67d0fea3ad07fdd7b3c80fe034b2e60f0f1bdb7f2a1d7b4eaf2848f2336a15f791f1ece4bf7f7d2200f3cac84409046c312b603bd9f76d48034baf1e7750ffa1c30c7035d442f6cdb01345260020e6ffa060bbc600710217ba53886022c2b712dc9706432994c86c3712b51586245a68a8c47c8d76b072baca7dfe1322f9d16e395e08b7cbef385f8a10b560c7b8734596b297592cbf526055d602d8bc5816dd1c76d5bc48ae10da5290786f187b2e347cef9e3bd58dddddddddd1a7b5d8963dc9320b650ec77c55207c57a572c953a87a39690da154ba551693492a65269541a953a28d6eb4ab26989c545370fdac443c2748eaac48b0a2f287891058d2456641f70fc72a84f3f1de697c3b6b5ab3492168a5de176668b039bf5846b48eba458012feb3ad0c7f7476c3e90c197e9e3653e9f3a1a9858ffce8ea4cdc20633f3a862c16ed788d1bf09863bd6a5f88ffb78e83eac924fc9673e33b39dfea261fcfb5be7755ee7e7013257ecd8f6bd063e17ae30852f2440ab44f791b9a2ab1e7045dfe19058d9627948c308cb2c27e22a1f1f1f1f1f1ff7711f4a6d4891125aef689675234ddc7332c90bdd3a311cfaded8a0092638874ddff0da840a7ce246e65070a64acfbc9182cc27e8262716ab321addc4b46dfb949873f2e439e79c737a366a74873d86f4a9128bb2a3720c6c62e53fc7bc5eafd78e275c2e53b581654c8561fc64fa77b519b6b05f415ec781c03ae76c1b7c474cc704c3f7d0e50b567ee7c0ea70b95c2e970e4aeb1394520aaba1d2b44d6a018ef1f7c14d1501579ab6efda4198ca6d928d4d0678e81bfe1b49233961abc84710d989059886effb0e1ce3308e03d65ca06fd8d0bef1b0524d2bdda0d6ca951bd6b18e553b44126fc4f51ddf683d0449221c7e2ccb1c33478d7eece29a63099f1d2178bda28462b59b03e9a43ca5e372d2446b088b476584fbf9f9690ee4714c41946a744a3baf683d10685d292edab4c30b870215ae37ca9398be8567e1499c0aeb38a85e83ebaf5d61454fc16029580af6ad48b1e00fc8c30e8aedeed63fb27fec0f140bbaa2ad3d52a0fee43df7d607568914de37cc0391c026e714c7b1384f718caf9048adb8221e4ed95cf4aa6157a86c20e7ac54ba87e826ae607d0304a5e01c70e863150ce33f04ac75450f58a9fe7151e9d98fa760ab15acbbbb57a9558a4ba552a91df8467f123ce5291c351c637323831593b55ab162517660465e4f5a3c158562d91512984a07ba4e225defe2fa92eb9d27a58c59e9ee4ce34b347163b8ac8512ad4b3f20fa5623ddd717a7914bf295af6444f9bada532b5c7f2986bb46a3781595693a762cbc07bee21831d8e453ace46bc54dae285f2bf95ac9d7eab5922ff95ac917378bccd554ada68a065484693628388764b24295a039c6ef064a9ed56baa54413c0832e64260182f5e1edb9cc0e4ab5153c5327649596513922402c748270ee3bc85273df5b56af1fe0b710faa3e05c738e854348c7fa0e85c5c7f0f149b0572c370a0e85b340c2849c334283a0fdab7a002e63275c534dd73a01b218b24207f5fc95713962fa6e1a0742191c079b5d65a3f0f9c71988ee11bfd376a709027c31352c662b5645294c47660515cee84a65229562ae52c16d3905a002f4bbf45f9e4fab33c6c79d87ec475e2933e85c19a34119dd5800684218924830c2c2e1343abc2ca9f48b0288be52c96a649901315a534caf86476840f95580c0683c118c635d2d4fd5fea1fd9339773f68c695cab2995c23006a3c104eb75a100ae07be50d0f75ee841341861c546813c1fdc7befa37bd088abb31aefb9f701faee6342b0f48680e831ee4b9022bce7be08d0772fc4f51c071cc3c2728e7020112f35dd5f804f1df8e5d0af69df0d25d0c097991a5e72a0e2cbe6328515676ca0c252c043972aacc8aff9e9606f835270df2869b2a222b1a8158c4a4d0b6d947c73fb82f6b17b44b1941cb10aa2da49496696b254b2121c8114c0915c9f0234763e722b608f122c7dad6218e92cf447a91ab97188d82ad625aed1d5ae518ee338fae823a5212d1c368e23eb937294b526b19386173616a341c48aeca2410496b5d6da0edc073dfa4ec3a0513b49ac5fb1562c7058859dcee1afd1b7f01d18a094b8cb437f6f314d7771794a8c0a1c240a2bfe0522040926c6518bc562b1586cdb3e2ade88840ee69c7394b2f267a9d65a6b85511a6cdbc61bd76aed68c4b6246bb576349261e871746adbb66ddbf64d60bd84c3a07e7ad997b5f6e572d2398cd008b8b3c72f9670fd6b04b1628ffd55607b50cc61db8090638cb1c9a003db9f433f10728c31a64b5932bd2c2c10d26bb05d1c9345dff0b79e85f5cb333995ed970b4c59970b4c76066b2da53c76e0ece0d14ce03009ad262499210a2bfdc331eebed2beab2e97cbe572b96a0d39c6c56264345d78508494ac9e73cab64cf30dd1a6b053a206334918c169bf7de55eba7b0725a4d324edfad73f728cff04c230cc800d06d75f93c1047bfc306261457e694e58314442b550c21da3fc5ae7f49e98218e391acdf9df7279083db0e28ae17c71e4ee4d50a9ab80cbaf99948a85bd21f4c51c51ea9a0b344dd364386de29ee7f34fa93d3f0b81c9cbe7f423e485cf890bfb86bf0c0654775a9a0d8648c2ad9f6ea00d35e4b421e461406986366861e89a0c67db4036d05ad358638fc5ae7c2c76f43e3e432c7b48a5f4402bf60b5970a5863e10e775dad4b8bad53ac339f7858e8eead553c4e52d77e22bdf9931f7c9e33293089b5a8700d7df554ce357c63b274df64587d1a0c28aae13facb2eaacb50a699b22575244a0a6153cb078d04c380c050b6c9681e92249d837bef76fffcb5a3d572994f6b47abf59ab5c637411554bf1aad1608342b28b45102b9cb16bc6913d464f496d3371c023e30d23afdf07666a7ae93d137ea26b51a7434806fbce66888c6d1c98139559b54677c05418d3a3339335f135e33a3191d978e8e8e8e8e4e8dcc93f2ffebd7afd555841498b0a95500609af6de821558e50425d07859b15dcde3aa6258da4bbade76e530720414a0508da7feee9fbd916c38a6c64350b4a06c5718566cd503c18aed5251c0c3510f8ef177cd5c3eee72b98b028d637bed29f8737e3e33357da8cc586c4ad122d31fa4053327d1a3eaa9e5f9991f80aa27d18bdc1589fa7b5e791d4e830afb329faf769a3e3486478931c72933442d2d2f12b55811c9cef8185e943f35325e87c7a0b049fec8dbf2f2478c1faf63a377f99834b98c4a2ea492e85b5e9425ede98f07913f31d0ad21c00d3d2af46a446143ef695cb062c76231f9c3f2f67fa68c22653226757cfa0649362161a18fa7482c6154521cc6bf3562ad5432406fa9b10473c728188bc5c299b2ce82c5c62ed7eba78a131f1e1915d893e972b19cbd8df64cd65a0150afb02f3bf8a9e7edd7130b4a62e9e778ffe4e9974b1cf5cbc562695f353027477bef2b98537fe33ee783e11f0eccd940ff32419b8fbe8fe7fec5c67b1f9587dcbe971db4dfde4603e76bcf270ada54f0067c9960cd69eeb4abd52c579425ede258bb38d62e8eb58b631c6b17c75c1c3332d359348c7f17302e9a6ce18a6d00ca288cd194d18d6bb2d060cea94d6dd643f6e8a17953aea1693dfc9b2013baa78734795f396f7605fb89c350c07b7c13ecd8f53138c6ff658c9bf3a20f35c6e8e798264c2ae8f9cb53430d38703ccf66cfdc0d4f9a617e369bcdb6ad34da18a8b657cfd66a6d206f03792330ece5d3886f9de252ba09d7bf91f413b197741324987a4818d8900b6040032c532a75c9927a48538d8419d239980e81d5004b804bd3488ee6aa860a27c45aadd3adadd699d010b899678ca5bcb8675afbb57e53fa4cf3b9e8c0b287b7bf1b660d13895aad9da174d5755dd76a750e6460f7ce816a6534912c79691ed8ad195d8189bb89d40b266559135a2a9f222b554b65237beac669df01fe0007543d5a35fba902a98fc044e0d0f6105d9715d184b1a5ea3a15f75dabd59ab1999921f96db53c2fb451c251637313c4689b9b3948376b5ead6fc009c3d22bfe126c0f4bb84c831081dc9e2bcfea8bec73e3a107403058917d4413338f1e48600296916f5d70fdf3e1d90d0d7a3ac56efe36ee15146be07a6afd826cdbb681402216bb12fa40228fa5b3dc4a0d7d54d3346ddbb66d037d9625b4c20256cbad84be0ee46d9bd771356439c161ccb0d878c4939e9f202d6b2923d1ed92d87abb24768eba2476e4a387fe4305c463c58685ba4ad7c934130e5552878763b8ea412a18561c09c089ed7fd1a18ddcee1b49c10a366c94a6aebed8bc67bab9f4a582363f9a1246aca3c1081721d896151b562a51d8f852c31246f6c460ad82e5400a969955b0a947bb8ab83d706db3cd25af381a81110557e708a5a9abe09a15a18511d63ec2465bedd980c49088f580cd601b0c06b37198a60283e1a8117501d3509a864ab57886b08e5829d1d15028ed09b11a56a56106564a6dc60cd804d130c47ad81c48c52e20d4a4848dda3698f7844c715c5754adda0c2ce781225c6f2de8a80247e17ec181a4d62899ca63e9152b2af460b3fe8b1ce143e4ec2ae75447b35c34daf6038b6528160ac51282041344505c2c168bc5623729ce2d9526a289182580c39134351305d0a1936f7eaac05f7d05418d3a23e76c1a680bd8cb07f0e33e5ec563b399599624ab540a435913aad4101c1e33b8420aa8d38f298428a7232f3a740fae33abd5dad1c86b50bba669db65e7256150723d8c22bae8557cbabb3f3d42830e9bf564fb555f355eff9476b7bf49e7eb8ad7742758b00e7b85a26f996911bd7cc5341bd3d02b7a57182d87c2f22e5e1c9fba24f67b1dee45bcfe1436318df73c3b5e8d5c77306c42dff22ca496b724d13749868ccf01fd8c0fbd88b4f220d207e67c2ffa1cd0b71cb111bd8cf7d102ce781f22d0876d7087d0b7fc4de85bc09c2336325ef4392c3f03bc59791198635f460b89e54524fb73b290f83449dd8b3caea8bd0fa3db4998d10d1de83f1c159702865771186fc2add611fd0ae23e6da45ff7670ac3f8bbcecfebe7355ffef297bf5e2f4a619dbb38d15ad358e3e6315f5b2101d1b70438b4461a898063fc7de0186718ff2a5be0c1857dd19e6f09da6df01d2e235fbb3c62d7885d231d34287169db569dd8b68d37d6d1d9b0e083c372c79126eebad23182c5e101019a3044804d38339d23878930298e157c28ce26936dda56ab27f3dcc7758a389594942e9b996bb52ad5ab54b2566bb5eb54ba4a9afce42ad548baaa8e8690a1320abfbeccff022e13c40557ecd4a80512d515bb894de4281ca5e7f3930d1031ab0047b9f3c9ede7516b10ef4917061e848007490bd5e3aeb7bbcc640b516eb77f9352cd063318e18b91e3d8fac6711cc78dd2b46975d3ea07e27134053b63c269391648b6eeebcc04b94edb368eab756686eb487cbbd5753536375cf0388ee338862c47ecfc9186a156ad473dd28bd78139317401060f4e393fbe24a723f47ff40f923875dfbdf47b1ffa482ffd20b05bd50097ca94202b021359ebf3beeb041d232684cc9692d075d09282f3465b5f0c2bc060b7baeb5958b1a90ed977a3608f1d845220429060626cb55aad568be588bd92e79c94523ac1be9225537a75b80f0971ccd1684ed115ec775166bb5361a43f2158ff2aa511b3d9b8da09a2d2318262aac39fd020866d596c8918aa7e384cb1f28a55d37a36c36d7626ae5b212e45d899f67db9569487de1c116c8361d858adf2ab42c7cc35a3b3d96c369b699a3785d6fec31a0fd8a8e1ea2971bfe64282b1251afe5326d8fffbb55afbbf6d4e34959479aa092925ca9c5276777f1886f839e5fc98a1c4ec14fa1f9c173af6a52c0c36f528933e4c334720a314639453aeff94b210cf9c734e1114566c253bdf0e7d0abd46aa170c825ed10442dceebdf73ee47954649f293b1db8a78f4347677f3754903ddc260f13366945c85432954c25234919c704e118bf230f1ddcb1752453c9502e336532994ccaa48c521baa101566e6f97acd58c591a639271039ba48008462a76d28dc0588331ab94cd7754d0242ad10002c7c0d52781d417bdaae57932d3a47659acd077c75bb374fdfa82feff55ce7813ccff32a28b4d1d203d555c0652db450e57a2b9452daff9765e877f7d73c48e2ce27acbf46a2b4524d2b694a24a574d229c7719423cb15e5a85d51b21cb1e28f9e102bf68b254b96a2ab821b720c33b934338a5b02bfe24b77d0093b8ee3467f0325d0af51272f0d3e3703db301211ecf793d2eec8d6db4637ca1a1de0824eeeb4bb9bfea6c3f348d20abbc35d94d00ed4d11be86803450f78a0f73c1f40d77b1d1e690711ebbdc82e1bc01d38a858fade83409482a8b7c47a339ebd1e0741c3191b58fa6209071c331dd75f6d14b62389f5fa50e36a4fa5699e4a330c050c0683c16a361b25263caec1cd5c7b7e9cf8548945a9d5ebea0652a954dae488a86cf7ebadf5946cd2d4e329b1f28acf63b52bfef5ba4f88edeaa655971efbc2bd1097a3a105db2abe53f5e2513529b26a7d31b0948617581f47fa7d74efbd8f9707da8040ae46ecd82caa28d2b19b580f7f504f471949f97e19f1d281deca75001af66262d943ee786c93b4ef6feb1cfcc8a5dfa3722c2d4a6538ac97794a29a5da87615d00b022c452f0653e0b71bbd520cf65b48edb36baa2a0495ff30f87bebda2a4ed7a3f60130e2887f7aec97432dcff0c21081d8676fbab8f53a7a0a26f386b27d55af56a4541d106e0a35960c20bb60409cfc85a511e826046ca04a081384cacd8abd65e003f92c1b2700e467abb4e8ef19c458939e7a4829d1e7ee1c4b6cdd9715b2761484ab05c00f017b06d9536cbb65adb9b42a552ad60fec4c8ab88ab87a544a51a8d46230e65a92459a552188e46fc725273c3329834f95879d0b6f9b0ef3912b7c2bef73cac3c2805969910197299896aa70897993c3185eb29573292a61a2961ae699ad63f05abc4271a66e02a8e718d44a43ead907a95d349f002aa75fa315b4a749195ab52aaed4557a9422f690a7244abbff2dbb63dfd2ca001b9f31bec41fbf99ed7a058128d443fdfba4cd7812f3bd8173d0f2bcf028a56de87e86d079244dc8f6ef7deacd665e66b2ba4976949deaf3c0fa067017dd807fd0ae8c3c7ca7bcf27fe74a0afad9034ed7b04a3db81228fcb813e8c6ec3be9df4388ccb4d6e727b52c3c3fb95d0adedf3335bad34a67195f3381157f5ca55bd72550d35e0c06163a55ab9cb086aa55aa95e2a954ae594da50712e0315b8d979641e7329fef21ead824fac8fcbd09722f4a28c22633b5ab7c33457700ea984964e4bc75b5d41d933f668d1df0183892540d6006d8709f4df7b9236f5f03a4792040ad71fe481a27331db62e65968ee45928a846936ff828b2d3c0b6fe9788b894ec78a2988709cb7bcd571a18d128e9f6f8ac7de0aa594524a295da976f480d087422f0ac0d42d8771d7102e9f28a5945a92e85948f657487d0a919eb8fe4e5c06f837164d84437f569f4224543d8942274bb2608e039c70c13aadbc10276f85c4e30709b342e2615f447a11813f802ffd166c70073f853e04f62861502e43b94c119c63fa4801430ade5728740ea6f95e7419cf2079ac7c917d388ee338707379a8846392f40d241cd3e2987602dff07f3510f8868bdd9a7139c61b089b7634bfa783d7921a74d139ba7796b72f826edf986003692101a2eba8648eb87456b2110100000001131500001808060583e190583c2e9c27d51e14000c61804084643c1a09a4410cc350c820638c610600620000000c0c91a8005bc4b75540a5a7c72b1deac50145f8dc4928dd364c074088a269ee6dfe486a1253dfae4a91eb83683c7be2abe30ad51f973c7c268c732e8ff712c14d2b6159b51439e66fbb7210af987b982a00826bcbf7e28eb27efa429df022e047c4271939921063dd42feddf0f2719645a76fc4a962a073a7af70baa8efb54d55a27d93719c641f8c33029f90d5e58d35719c62d7755351f582d2e269d3d628a6a751ed31a34f8240329c070e9648c5802a045db863d9cf40445b0c278df7d0fdf26edd62eb90caf0a8a0a1d69d84882dfb62ffad8faa54d3307de15dd3a4cade71fc11a4c9fe03c21e02fac399b2997cc8a7581f30db8a441934184df0eba87bfd4c734b0a3500e2cabe6d7e2587073cea4c712c021a900e439abe8a36df876321bd5e1dd189f53fdb99d07b13dd5be66c12e3107a6e1fb13d2e9aaaa80a707b64848797408927c17d4278565c732853861a9b5652083c50acb269abb8d77f5325231858e3bc3604e0cc020993c41205628091b626e07eb718fa43c37cb4e2d484f935d82269a29d0c2698a6213032ec325c24380ceeee5160a8f8307a02a297966fc2f63df573a80452eec54da143bfcdeeaee51ec6f06c1c04c9b27c675ce3ce96b1300961209fab8aae6c6968d96a2ef24ed067633fb5349caf52c366b82f5361003c7d5dc4f209b46aec54ceae2bc361ea71d77f6779559c9b30548c205520b84d0c6c00b953d273ccface5a88ff49f5320dc4cf82f7e966b2d97d82ea59e90de3eb2284f69e12fd4aa8b8f3b63a290a242f139a2bb71e7fdaa2dde223820750fbce770f88ce7ffa4963bbdccd1923811cb1a3310872841489428b57cd37e8bca7095840ec583dc08bcfe2a9259390a06bf59c1972f6db1ef75c123888d24db519f82c9223ec9311750ca9039825b68a01cd4888bd54a844d70eb0c32e7366dc4dc32fa794fe4ffcb78259a2e16d2c1397a38ba90c9bf56a2f4060c24048bfb2304d1612f8b233594f77fc494f62a29c14623721828a1e4b5264090272e3efb2145450631bba11192cc5da390cab66c8041590d50a9bb19390378271977000321aa13ec11b9c6b5ef849f56990610c2891094cc57ed207da0b58ff2630cd3030a2343b72fbaf7863d5c02ef0fcce269c574fb398d5f37922212a71037e680942eaeabafaca5f8d22e00672ccf690b3efb177ede1c8e0241ea5f6cce84181921802f9e88ac7db43133771e6ffe87c5078b9880fab08ef7f586d6c305f763c9753bdc537bc200d22a1b3552a06463d1c1ecbc7b1418fef7470020eca9b44e47dd34f56179f4d3979cfc99ae87c3d50a586b4e45b9f38162737f84268c7f031aeef6deac37571ab87ffec269b6622c4b8ebe1bd9bcca9ecfc587f01d74ae4205fa715b832ff7a18ccd52caa79ffe0bf8ba31fa94da79c386099d32273c4b492d095d0dfad08c5dda8ec265996925e12f3dc56165fde30179e24c75ebb34ad4d869ea5e7d04d122e6278686dd34d01192f098e5f11178f25da24ebc534943b0c54da911116a0225c41a7bc2b1ddc80969369c512d042a0983f92fc084a8ba29eeb386d4fb08afa396330a5009b14ab80775aea993744276dcfe0824b6c90a3c105ed2385304f95525c3c7316f5e508b3e4d48265a737cc2b2427e2d809572cf6190871215ddb9b526e68599f27ca8c7e9acf43f30f9180aee798c64a33295cd17b24a643b62ea6ae59d78f71369b67de7a77c0fe88eeba008439a19e32ef7b88b2095c2187ed8a5bba01de81222a89bf6167a78184d1e358988615b41bf88485c56ab78871c2f25a76443eb9efef0bcbaf66041011f07b8b71797d5d82c0d326c4edb90a633f4dae21cfe522bce3b749ae2a19ea31fe08ea8cce9ca9d4c17157ee00b22931e61f68d277b4ef9a623f4cd7ec43c2958fa53a43b50fd4a3fc47bfe7a05a39e5be281b6f58110248ac2606f7c1e7848cb2b5a0e3ed9875d048c9e8e69af173ea71ff6910b7d4dcf9fadbf1661c5db3115cb9cb1aed85079706255abdc40c69d0d2810a2a1ab821f4dc5d2a141f3c4a74ffb7dc1fa3337a8e53db2777235f1bd902d7165f482f30ef08313bc4d8e827f8abf1df92fb57482ad4f85ccb67ff6254990853988f8e34c1ff7c7c2cc1a8553ceb6f714dced694df8c12b789fc51c671a3d56e358cc4ed05c3c08be80b4322d7fbb964c450acd41f24390420649b61876ca9e84b4dae0b44ec88662bcbd6627f1f9cb43fb4406e7a4231e6686635002426c5c5cbdc10157e2e0d03896c2b2a85d91c7ea3a2388270c6de417c82f0296b6ee7ad0a33c5175fe4bcf5c0488d85c42924c9f66caaa4b7cb5c3c486ce6c1e4f736f27c42c10810ea7e52b86ca09826317c1f4e791ffa7f970d753bde5b1d8890e2110aae3e960ae47bb62b05c7dce68304d4478e444d0b0021a16dc5c09e560d108b55f9a83fe4ca4263c25bfd1ba7a8cac88314099149e8b8a3302525ad21e6e171c4857023c0d22425e956613687fb84caf0e1085f04a5dcebd05aa14149bc9000f40ae7d0a979eac196b3ea77cc1e900472d196d9dc10322a43a4b63824b1a73cfcef9544ad41a9f541500cdd601ccdcb55239616fe2cf20805af10064c9a2c103eab785fb5afcaa0288287402fb8881a11ce68d4acd689fc170f0dd4df4605deb214bf82b78db0c5dab8a95077a0c43e074b61820de2d5b9a3d319331124705fb27d4dcb192e0403cc241667f512595d84bd36f1fffa60f0455f9ac022e3402552c38da214794ab8f1f925952569403a2769c7dcc4290de6d76a71702b2d5b8c26662793abadf79337f21efd7293cb1d57f27c43e1643278f7014493a6eadebec9eadca9c8c8337e69fa88b81601253b10fad222b24f717d93155181b51cca11ba3a945fb686b5e81fd95feb5aae1d18036c9d58c781f997df3afd81d4c32b8fd02498cbaaf172d0ee81b76bd4d4e8d6f2edfdabf747de81b5f0a0ee42841b7f50dd2e6ca5f682e69211372f3bd5ed3101ad0c3415cf89f4fa0b43f7049528721df18c30e6bee31e41b7dbd12ab574ed3128f7bf85a1e0603cc1611690fa946e93cd34c0464626e8f1875a506b2264317cb3a1d54fbadbd5b0b2117bb166dacf872c6f910da40765a58474ec680cd3a095990db68c06cce2be4490b31c7c2e5c63a1a61a95f9a026ffed3669fd2ff1cd5b14cd2c97b97c05d12208576bbb3aaab596342dd5653ba3892f73943305d99ed76676ab49765defd56c6444a20d36059d73a3467917a7462baaf8c7f5864bcc84a436553d58061691eb013920b0ff338f4af469f67cd8fc77dc77b15a3cc7abf038185113104ba82059b8b47076ee02b7c3a8a02af80e0917107c765d0a9a602cb280d28b8a1f1e37e678b1d6d1dffd1347b2433322eb500ac5c669a3f595cefd6e21c7fb2cec274ae8e60854636543912d940011857b03cb3c9e40071656d41a7ffa2b2c27ba5e45e73e406acb1722fd0611a45d56117ab5793c0b41d7b8e0cf58a768ba160db3ae9670ad342aac065a4e48b12a8648c3b2b0c52498e3aeff2091cb30f630f9f360f533113f92ddc8d77f4c7184a3950b9960661865dc046af7fd502e451a2c1ef5d02ee69f95a2810789004dd525e386936d41afd48aefc038aad78adb8fd03b3b28580a296c543deb10f79af3a1cb06670df1cd083434d9e1baaa7105aa1b1d3c737064b21ba962fbdea89fbb4af8d4d1ca8045700b6411cda7b616d1b7a5269eea20001de27a1d306c87eeef553e34df3cd071d078ea81ef12f9b34ada1905a9bef9e589e60554abb265bb1315d20c238760207929536f6e2ba2769cba4c786d75f9f3475e1b14ea60bb0ff131d7599c205b8dbfd92acb7325ccc4b069d0563f30ab50c54812c66f0a7b0eb7555c3105677d10c2d6fa795b06c9a2b6e73c23be86dbb3ba01fa702162eaeb905cba71a18041a138899b7efff68b82245aa071c00a3f2af2cf5a4f01fafb2a3b6ae0202394cf177e37d1c739a6998d2d3ec9e60706782ff3ff22d4de1f2133e0b22c6c04eb6085217a07002426f234f7207ca3bb5afcb0cfd66c61c8770aa7ccc0608c53c43e753cb300cbe0d3a1c2319b96fb9c510afea4040e9285c320bab877d9d0af1580c3498e6a16fb58566dbe542cd0fa7d945d8194518520194d2f26278ba18b76b31a4a74088c9c3c35060c85d9007a4707b6ee0bed053c580d2efcf5911213e2300b0b510058f2d040c9ddc2ce13f8e26063b40f862245ad3920a320fa5012ae625435b878fe65e367265e5e35bee89b3f612ba3fa1465a463c141c99e6da0250c96a9c2ff6ea8871bcdb4ae49448a0f033d9ed696bf24981cf9efe568edfda34912c0e3ffa3df8fffda3b699910c4d5c183d98d05bd8129e1f3d1e0fe7fc0d5c813375dcd1b51e0f4f8ef2ce5234a35051cc4c0c93ee922e7645c121ac28e2c7728129633860f383211aeb1c8311f3b9633dc0e506ec87ab243dc6acc4f05ed9f2da9423f54791deb92ee12e698f3857b4b0f7afb5e33307655cee87cf1c5757db9c25cce8c40aa0a45331790844606dc4d40a696465c4bf79c7d10dcab3f7b8425cf62826480cf5e108686b6f85d1f626e12a8107026d1d48d56b2407b22b34d4807efe83e83782bc1468dd24ca44f1aaa2856140929b19a24885d06161de4802df2f01c2f932fe726068cbf3dad0baf78b193bd59c0923acc2590b53ae4f915fc0a22d3657d085139dd3d52c45feb687c9a03392cf530bf92095889bc942763396398baf7a754b0e2539a16db4cc63adcf983900d2f5cf077192ea85ce7c3f94b202f32648055b102a69b500501ba4cf025ba411714cfe7fda756d812543b31f7920efd20968bc0911faa7c23a24ad8ee628eeee220337093e246d31362a87d746bdadba15ea2625f769d93753775056fa3cbdd5bc36b1d4198e8984b67a31d8727720d3f1351916ec303c58efe0a0e0bf235296b3c8fda15d69f8270263d26de3ce55556cb61a3c2829c4241695c6874c0e6700334c567df1a25fd379579364e3d563ce9375ea227f13f027e6332152580f80a6dcdce6bc34e17331ad311e9d76f43a1dd64e1bf8402b6066e5f9bc2ff61cc4e27e1469e01f9c3cba70112ee9a4fbaf73a47445e9913963d3c6846c16d3307af07dfb56d9d416324d3e933bc4644b67a61d4a1e4e9dc3d66a002207672bc3b66b8cdcb0e09af3d3b97ca754019f934b61541cbe73d7c109f3f9535cb97a5f75d5c086fc2b4ea0cbcea4bd2284b609d4a5718201e069000ddcec080ca97f8f7fee1dbd005cc8527250d8a4bc1179ac1d74aac425093c162aff0f22605059b7994783f3232f4dd96c5bb1fb3fd522d2da87bc2a28d94e5ae2ddb2a6c6004f2a51dd7c0c3e79640de48147ef7a0f70c3272916d86e3939c8d83e88328bd11127d56b487089a977093b4e2b676cad27f44dc3f4d28139a4d6d81f5a91342974a1ae1b8634396d64c634708e28e48d39df050ec23d228cdb2d45ba753eae3f81b3282838d9c1ebea26a5d07deaf56f2fdef6d014b4d7621d7c2797c1532378df8d1815ef922536e52b1305979a9a64bd3544a486f45c39afe07a8d4201407dc16d2407cc31b247babe960952c56986ee75c5c1ba142facd46615372e9e88a360f0165fbe01e8ea572300c86cbf3e8fd1499d999163cd8f620e21433a520b80fd80e1557214b7a644f09f897091a362adaba63c5071896bebd27e1c9268f425239540699e6807a2c23136c082aafc4c29502628f4bfdf396e852a62522538c0780d812d3fcff8991528c5ecc10800607df981879205463d8e9e2bcd776c3db3ea0bbfae2b431f324fa3d1636b51e554f219273ece699f8f8088bd9757390e4dcf481fd97414486aecc9ced42c6db6c2d68303366e8d51194e7c443f5a8d62783c4b7b21db259b9b52b777db591cca8e2bab424ef7abea063244517d78ac424b1466e8cabacdae2d665388a6f811e69abd342e1e9c55516ffb7cc5924670db1c26c9932a7316a88a4b515fd8e2ffbc378d2465811f892c80d743e5c6206b1c0c5b6cc23f0bc020d695d64582781fec69c308f352e89d3fc132cf19f0951766d7875d656172dfded480a15532c3c5c741836c39f99ab258fc55774a35042a3dc04b5c1d89fda1f0da289f1296ed453795248dd9542bb27281048bcd6aa8f192f41bb39c9ed3fcfcb65a3c28b4f09ea79940efb07de19203573248c986c7746c95a1574a9eec60078c0f6dbe5a4b7611390671d38d5f3181facbe02a09e7a3f2bf1c276aa60be6d1fba3124c272ca8c67701db7168dfe3f3f5f7faca407b43cfdca7d442b390eb595404e51726c8733da3fe70154f7a671bfa23d03c286b8aba37efb31977c4d3a4d6405463e2b504a896cfd76ba0f754f3e801bfe5a18633422fd50ba93c24302eda7f820584210c54ee037d37db88b24cc733511d1711e5530b02101f3fe70cc297d1f2977103e3cc33f7f50c7b830bfd2e485d5645ef17fa1e98d5dd430a7c3fcab0f546238c6c6003c2c48af161ceab17973e96f58e256782d8deee55172021c039455d71af78f6f4a9b93e73d8e665b94e993710bb710854c20aebdd021e6964d1909a875df30fc3755fa9b61e29443157998c09c1fa8546cf1202d8c01520d3e9a63a1c538de76203d87ad2f673fe4d0ad34d90d04fe7d4ccb14759e339d1e886cbe9c59c05f73c478dc5d6d05d822fd26e9b137b42a97756507811d77b89daebf9b18e7c6bcf0e0f08e1c4152bbe7860af7515db364fc86436f315ec87215318ad64aa9751d0ed9286bb5a9f1ba25b42cfdc8d62a58655d82f200e27269f6a43c8eed9a7483e24ab1c62b45ca509e9cb0b0f84819cd8c7556ed2b8ec83faaac3949d56c3a2a197c9f53970f2c6c37af0272c8839b2017316b4d38ace2151e9f3f47893dee1c6d61c31d24449c1bbe9a5d667f0f70ac9159b9171bf2e221524b470c24ea40bc16341e0fc172b6d3172488ff911e9b5875a0b2626029b8419d76aca1031f60e323054b5eb0e0c350642731f88030ad1faf64a6a4076f1f40e9ced772881da70437f16168fa5c3fe4c36cb3245a04e56b0d195c6b8760308052cf8931f62fe34ff28210bb876abad9210731bcb1e40f6e126a82ef504461f14788de7870662695b53b2b0f75b58e7c20f6ffdc1fe66e78fcbf6390f5c76d10b89b7fff00d43cc1e0ca9167c82522cb7a5e1c3b0b052235d5e96fc6c87f58310fd0873bd2e551b8a5e198cb2a27600f5057b94a474fda69a6dd8f10837b6ba578f561e94f135aa25d0b508a58bf7afd30cfdbdfa5544192f6c7adc0055db1bbc95499e227fd40b1ce63c443fa438ea2b72d7ba454c6f6120de5f48a79049f4a4426c5253981a4e0d382a4a965d3d0fb769ef5a5d6d3d6bdd28577a3499ae518c3f3dcfafb4ae3b2011dfda41d042bdc10b643f1b231d11659e6d8cc8ac395bcd948932e81da32772c416ad932f0db8c4ee1aec87cb988c880a31167c56777e7851648a451d7690089a01ae253995c2511792f4adf9ed67b40e60bc179c7b8f2bd51afc0c80f7631628cd6a126fa6c5d1c66d568db8d32f7f6e39da066f5c62b9c49389d1c9ce6a70c6a41293dafeb7d726cf24bf0d9240b0231d628690802d50238fb5d01a1958150c601a9821fcce1c9aa2593fc3f5ec53ec007c1cf1c7bf2fee13bf71a34e04a4ded34dee000cdcc9f7b51166e4a9a640c97ebd2d4b287525fc226a5e1959851825639227f7948b6e1cf3cdbea9398373f86c8cae16429426c462331cbbef3a338a57375479af28b6078e1aea62909b4dc30fc2bbc50843dec6f7f28942283bce03c0ea1e7992ee34982e713d0c6b11ffd5e5ca23296f27e97ad7714c8fa414dd3bae9c205fab2d077e6349da1e40f620ac725f145565b231df862fc9405c58b2d507a2b699935287b860ec7da0150b3bb93092925c232729ccc1251a0737b6a272b82a21a65cdee1f15974490e8eb826a6a9b57f0940895824659a0fd44fe73be6101b7ca86aa235dd3984a65b72cdb6d801499f1f4e14fbeb22827f4eaaa5327e2af6d472faf5ebd9c9d672d221c251d89fe619951cded6cec9788680e5ea9b617f5e667670adc80ebc230f4bb9b1aa1e26a73fa787c3699b244dffc88053cae09c51622d0954d96ca725a7f1f196d7e7c5af4da93afb134c6336dc4d471fe287701d580986d5e2f9e7ab6413380dba9aaa6b469e4f86bc82affec94353ef1344244873851ef8ff96aa537a6cda05c3f9dc0faadd387c0dfe1c07fc775a0f32dde5c4bdbec0c6e454a172de29f596ca138aa27f77549b24a193707289be392fb54524394f158abfccbf0920ae379963689ef1a3819932ece9c585de74d697bf0b5757cce238c27f5aa7c015500fc27b751339eac4655158f8029a87ee2dd524fb7cf48371d437d7507a664e835ea064c0183bf90ed0d504f11952aeb149d4405f6bb08594b491c4b891adc52251c800a6631b2f458bd3e2fffb06ad5b7ab5739deeaf65f9ca59d8fe8a1d5ce5c62a378036d148ccea23351231951cbb37e52f153997274782f33a1bff0120698706e508348484cd6ade31e378ee644040cf4b1e94a062cd992696a782938ac494395e597356e521cdee2aefe7b2915e2168411d38dd3ac38c72f4aec8651b5faa50c5d0ea5417b75fc5a042a38c5b3306c7ca817f50fadf12602d0cc1b904e747fe73ee15ca4f31d0ab20911ee0fbd66c972844050aadb1ed586fb23b6beeaeb80353f31dbe00c9f654189568ab15beb542b692d4c60d17a8c01b1a4df9440e41abcd118d3c27b627b78192eb976effc09f3f911fd4d55c4e0296fdd250d4dde80ded3991d61704414efc5de9a403852b6c4c42c6f015c8e75a6fdf09bc45070e70d189d42eda5b20aa431a3dd036e894e60523c20091c0696aa367fde0fe6e8011381c49b84a0a050c3c200f997b00248f1ee8dbb7c26d7c0a0928128f3aa103d40d548bb5bddd4b873a1a799e942d4e4d4fe9080804574149f75ec757915984aa798b75522da221fff0e37269123ced35d12b78ca6782db74e630458df7f4942fa7b910ebacb38ab4f45b572cb43322d9305d409c737b6929d0cd6fc84469134c3f432dc1f420e092a2b1e613a948f502a5165f781d7cb447d97c82a9ef0a94e57d827e051ead65655265a167b8eb4ba198fa2372913af11f12b88db454dee48893c4be33b40347ad01a57e2b2345dd483e1871a34e6c57d36af4b4dd15651891bfb71450902334c1fcf33e97c749e07cde87cd8adfe233f02b5ca7cf9746660fce1b5c0f09653979fec34b3bdbb86e56df7663cceb82c65b75bc31233df99d32ab520f4ac9154a587ea42f7fadc824479061fc095476e384c73722962c88c394968af26b1189abf3724bc4bfa296f4245741f68ecb71ec5325171fcaf44cb1fff56ba063234ad465741a2a11e6e5ea1818898bdb7d37517f6f16da61623641a4e26bd1d5588ab6a9c6129d5ca3a4259b943d295427dfa0b9baf551f6a42618c906118511675b49378daedf12abd77de1975a091e6a8ce98a170a3205b749710175d879859b457ec988bd89f2100eed0a9c02e95a0ce7bea68d5a18dc223b08d0fcbdc4eea3438e9cb310f72464992be3f5fd45ec6b3cbcc3a282cb0455f91d6e350169ea9045aae6e0b8c5dc190511845507f105caecd0092e6430c512dcdad69d622a6af8373511dc027a65af7e8f3d3f52f6ed97416f8717938837aad82dc000b797f739bdbfefc1e0c740a49b2e53df5339af86aba1bf116d34094ee24db37a0cb16eb06f6edbd451c7a5122d1688702a56c18352d5ea017838d9e8df9f33d8e51e9c80e7cd84253991de7f31b5990e44c210199b5066ec89b61d12af912333a253f76615b7eb899b29c8df7b591740f7c9162b20038a6342796fe99a66ec397519e602f352dad809548bb3a70403101c069c3cce76b40a202af446ef9145de16e0d33c646e9e36258f9a4ffdde85c3155603e59c6a07296a3b93e0003e552f96a6734f6e42742cf55cc1d425ca2de539ec2c4c9c7e123a77e40791534e0697e3d4482716dbb5963a051ee7e6e381d443ef62e132092387350e3cff79c22e028cd4dbd70b150cceaa2cf7449caa20c679576d15135eb22bed8a36f893c6c1848d96b89fada8850c29640b639fe6368975bfcf863c5d27b59422b181ab0ac18e04c57a1bdb2a98a9653d16f6e651853137c7a1b546088cf06530e1f0e17c0fa75bcb8f2f4ab6c29fc3dd81e5dea0a4492573e6c0a29f8c090ee7cb10eee41c28c7f79dfac954d95b8e7ba9302d7fa57f2698b0a6c496c77b483767e423778200c2fbb5615ea53b751e20daaf9964bd37bc787f61374cc20dd36482840401de24097d9610e2cebc2273eb99c866134a25ad804b24152d751a8596914c2c01c5dd76bd388121d2171205614445f8166625ff79ed11b425bb4f50de399f3fbc3011c78da96439c0a85db5ead0dbc568fad5763c127c3be6b2a8c2f0ca463acb8969fe8480f289acac064b8ce5c024abe6abe476391f258a051486d35ca14ed4988a94ad0285dfb60772d62a2611a811fd30002cc86a296752d1dbb7bb4c6a88cdd9a5c90e99d02d6cbfc97c64dbcba749028e38fa7fc33030f7f6e21ae7e680600cf4b2a765fcc4b740ab6229776e1561eaf196adb281bedc3f8d10efd1df336468af4f04438d94987b88993cbdf7f143143dc6636a7efdcc838e65213a1dd11adaaa4fe2810ea161a1d2cc154c3c5c28d8898a7b8b70344edcb82ba762bc9c8b35cde31d785c59a2122860b117b3078339018d3c176b6f07c8a5b2b41fbda86c63a48f74cafc3d0d99819debd46a724e17656abfb21d20355cd0572a5f85612ec6f2b58486c5ba80811a90b9c69ccc90cd754844a53e49a3f507ccd51bd2d8952de78ca474df3543913422312024012c670e880450cb97a18033a464d5356d57d2f51f2bfcda01e5368d8db7c89916c773d4341f75c51a447d420089b5e6d23bd5eff3f439e7471418c0d8b68deedaded2d4ba2dda0d0c995856196d7766ac0a1473f5cfd9ef411ae7ddffe3fb2e76633c5d17d9eef36a420a236e6ab7159dc573b5156b91d4ac6687978703fe02861ab9b808f7aac5c5bbdb137e334e4a046f370c4ff51088ace0bac5c232a250bdd29ac26e8d7db9fa65f93a12203996726986cd1c0a1458aa42b16e43ac1321a4a31a3964e5e0486aace2bdf936f2bda43402b080b083eb1200b0894a64820c37b312138815e59abd319d121456276f22973290f406c61c489fa920d75dc084cfd5c1aaf7660f238f0329f8132369431b5e48eb67c612a3e336cec069afd52994048045ac69c7065c410d6278171e99e096a04e2bd23213532b970656c5a06b75906b73b52f51c277d5d63e70c7a2e8ecaf58c89ddaeaad68e40855ddf76e04d3f1edbc88e4093d84b3cd0fe67e88b983fe444bbcd88ccef64c2930e1b7aaa5be2cc90122816d0cbf48f0fae630ff71d621fda69d62042e006ad96a3bbd0588a19e65d1c8712ac8b587909209bbf5f009fbcd2e0935628a4e999635aa1deac96b4abf7272905cca58102d8aa9a8f80943d735ac52faf6b816aa35e868306b9d1fa2b56249fd644a23f49c73f10cd6f089bffaa859ebd3a1694b8b21cb5b0ae9f9adc17c23db222d00e04afeb2b980db309fa90700bea810a590d23f809b03eff7d30962bda5fc942057595f79e2879df7eba0df55ca77453e84a7115b1dc9427e9c6dcf20c99dec66e6cc34962dfb81a60498a40b84aa7b3cc04b973cd63b323ed1a16121d826c572db5bf4e7cd8a8dc5748741eda69685280d8c3c416cc87a983181a29a292b201e32f40ac3aa6d035c82543e2955ba01d0f1cd355b3035a18b72bcaa9a3ef6544de4a3729542ab11aa9590ff1d2f1895159cd3d46c008c608b0c940abc6f6492ae342c7e8c19072e896e93516d749b646de09cc355385753472a71310e4e5627d4bcd9455855c3ce353cc0efeefc5f318af3f731d0d26f7dfa9f308f0fa942c003c2fa7217dde59b746926d44e33031d1ecff9574d0b9e7f2e13537b0d167e903fd5dbe050e1da40618e7382a709666bff057b39b5373a96c1d6aff5a10546234cf6eb08289cbe8606cf75eb41eeca09184bbbbe27c334ee08f0401505812346546cb03b08fb6affb5378624228be5211f1904987d4c6376b8191e58634fe8294ae97ac9091dbc67018bbe695492668c02dfc01819d98a25e3b26be8c11891250211e19d80764f69c64d241c49a7f5b5700efb0e0218dbeae2ab0d41c6959ec1f7eddafb5c19221e0e57944a892b6580b8de6eda32c49fae0e944e8d7adf8bd841afa058aa9c69b1a44988ca0aa1f2e2a4804334c581c96274917e99f3098ec0cc8ec29ab4709aac9ea68a7e9a5cace3f1725010ff310979cb3cbfd06e3de92119c9f3831fae082e3879909c50c02c71dfb2e83233e1b6f43c0cadb38f62cee202963846ceaf67fb202cb1e9674b19abb2ee12a57e757bd8707f150350b4a52988de0ff06ecbd83561cac68454511ee69cad9b752aaa851cd63787db35e6ea54122436a4c3564c2058640dafdb67a0202c522dc68d26233e1f0702e8150cf955c7fc1557cc1e90fe3bc52a5750d85ca24f9f83a0576994a75a300aec370eb29877b107c8e656df2e7b990534b0c1292b3c4f5037f08d9a7e265fabb8c0296534b59b1b364f8e6203173d67ac9805d1011661750192f3907cd633db59a5673125d4f7c323590187c9b0e0f043a307e83fb9b22722334912263c16177a9bb3dcdedfed2bcdf53c5d4c32c8522d75f76d74208fac5f80259d1300bb2730c86b93a029db926ea0f0ce83f45347923ba25ff2727ae66971c9c2941ad5dc4025428db6afc1e7b72d7befcc6db16976584a2c66ae1ad676f6245334bf4712074155800dc048cd340c0dfdce0585128d1d53e0fae1d68229c6d70542413b1f4e5a4b9815be942c537ebf901d98158dc970a00ef63e77de541172f7da53678bda02c0aecf2c121a40bb9a91bde2e84442177e397264971689c0240adbdeb4e83aa18eb0b9cf6b3986c8a39865e6949231710c6e720cd05a5d7dcba28e2ed5f934069ee0b70bbdde8c7fce7d2ea26825bd40b5b3a04d3b62c8708898637e613a22e4e351377c95e0851ea25d85b9276850852e80b2c69ace512cd2463493a0eb80b91f2532cbfd3f910c1b2357a468dba2e7dac6414ce295f36b5bce993ea757d450f78950c1040ae921e1838a881fa99ddb27b8de1647364cb323cc77febac0c4d9d400313027c21d205b02820e85a0942e9e4047d65b9597dc26e14b95e3ea1586740e113e218772e28c21cb8042bb68fad17caa1536f8c7f54d816a02ece6e7b0bd09d1c487f32e55d7c200e0d036b473f45ace576a1de4007b639f3fe2d7e8d09e63e6c04a0bb682cb80ca0918b71ff16ae4e94bd4b2aa600975ba444477c55798d321a177506d5861c9617458a73d153b67857c541f84aafe698cced7e09c6600205f03ee14646461c63527d70843c690844eb7178b591122f849cf1a5fec5bc0f07275d5d102a440e5912f2f75b8ac5c11e65328970e9fd410e55cbf4ee0850daa696581b943869be35e431a472951d7c145b5d6df832c61e5f1fb95428764f2f1f1b13582570f19f7f16b1c275a33a04b370ff5e202e7755483fa0db6bc41b142a431a7ce87cd09d41154022c7e36581e3cdcfb81cc9c20aa2f6a6e362c766f4aead5719f2c3fa95ef972bd1fe7a500acce6c360455cc1535692a8d34f030aabd67b52ce855d67e3457b2089e8d12f3468c05403f414f580b41a0e302c1b8894a695b939564858c5c7b7b7425e1f8eab981acd58be6d2094cc98668ceba21168e6b6bc94ff870de594f041490ac3cc09e5fc80c818c95563361e5fc42656ec689cf182e15e4ce3fd8dee70c89afde7c072f5dce544652145e04c2c9f1e31c02299390224b68c4b44c3a1bb5342cb491900d0983b70594c132176b9dcaa69271799715a01ccfd72b9e058d9c991578fa81aa50f541a55db386a327fa6af400548ce9c2fbf495b9ba520b5df6b4fcb5369862a0d4f43464379c3fad7a6802f75782c5bcc9863c5354536f0a4c090951511415cb22d7d20e8152576efd513260582c2a1d8754d61515fd25b0d4e9ed72380b9e2683e62a3a92c5efe570b8995fcc9d620c46f2c1578f3c7bb5ca4805b3fb7984e87ebd06062b5b5a68fa3ab60a0dae27c1b5851e337d0f9e01a1f2d2eee0d74e092ab282bd7ebfe2bdbf0d419a8e61c615fb8a819ec759d4c0d114f17306584c9ef46b16f7761a1f0ad8973714897e3ff8632595af32aa4839d6d7901e103a5f1ea6a5153602d2d416128e927fd978eec93a40d438e5bf6bfd535dd8a13673f5b880a9f5ca5734526a4118b2b53fe96f8779ee452b36d3b98b08cddc18e2ff0fa1366003ea20ad894b4bfc2d6d3c73f7d4ecf32850085c4b6a0d97e17ec7e2fbe12269bb3de3d8c8d0d135de8e9f97a5ba007f91399e1b30457beb9e1ed01d2c9dd9903ca645f022d28b1c29c4c80bf65b404c16531f3ef30cf5297c8cc81e1907bbf29c463fbd4b997fce4a5c21aea9c78e732ec67c3f551734bcd1388ddf7a5a7bb1c10878359805e605fb4fa3bb28aac12ebf267927fa7e776656d325f74ba29da5c2bf3e97413234efabcdb51d309c362bae4cb685612ba04ee50e7e9fac94df9445490117765325d9d9cc2536f9576f79e0b607495e3e5a75285a0adee504b1a78e65edca0862f2852d1fafa4888d098df513802120c26800c93d2d729a0722ac8b1d43bbdc9c61b8b0d61551c6b3ba6d9c76844f1da1399d459cad53f660a5b08f37bd7b5c60f60a85597d7f9bca4a7928ffe83e1faed5b40776eb974403f42477c91c664ab12a5b8625cd0605719f1cc82b9d18a2f100b279901ab9f66eca211f23d9c51155bb0d67bf434fb9a5e52bdb13c148a4b4f5068124bbb1fe18d3efb69612cc1b021d7e7859da69f8af25084406f289bee11e19bce8fcda2beaa94e02b552dc890cbd8068f04d6d759d916c1048bdef77a5fc3f3c1df687a8592b0246f0b476c820d7a01546fe5a2f0fe1d450eb551a492b65eba8840174351856bc4b4b1af8062263f8685cb81ecfcf3adc661ca2f34dc6089d3d173092c634266b9df1a8650e8912545984129363f4db3caebdc130a758209dc38777ad5e759d4039ac2e68a3149b1fedf082deb1b436284a6c557a6ea1b0a3ac7a10206e4d477efeccbfc3004ae888dc3eaff9ee62b8248c68e66b66701c0da40151b2c41fb02b3a19dd0c40b30199bb13db63e566fd6af3e3812f469ed23341e3c0972cc6e1ac0868ce0043cee79f89922b14d4b9d40a7b4c5ce184f5850d4a91de0e6b0497598062604245d60b27a37a27eb37faf6e801a04e89b12b080f74925705cc9107f29085bae3a8c5d368ac4e1a76bffd6169eb1f314100acfc4923303f72a1425e9643ffba82c3da63b90ed822eb405711f21ae1915f8816051ea837bd335bc10c6a3aee24e0fa4c1323cbfee3062e1b00516f60e50ea2758f725fef3a27ad16fbf95d7958cdc20b5e81a44aec8935f4d17116ab8f59a24c74a55746075848b991017651d3d1a6b9e6185e591c0bc206856988f2f522d132cf7428c2b45b678aaa38ca5d2e99a80303b95381b8d51450ee7d40c4f18cf6428a07aebaf22533ff86f8c43c192df3e659320c71826e4060e945c449d008113db777a856e9c89050adc8a96765a74fb13ff8853936d1d60d98d764d2d07c0dab6f795719c8283d048424295effe0711e12214489a970351b55644541beffaefc7da8c1a86fdde7deb735ca5fe3123ee03034be9bccd4ff3df460a9e8f31be0dfb49116a5c3dde10d9c955479994d3fbbdf7051aa94da6ab5c7391dcfd2903cdb350e40a2bde5710bf582eeef32128e3dbedd2b20204bccfdf0b57754169b31d72825dcfe0493f17206e6b06103c3091bcf693e0868183eb34f80f00763e06f04e2e60abf92f5f8103e288ab431266ec594e0d80c68dba450c6ecbdf7a0a84d4dcbb9bc5b21866364e0cbb6426993cfe5dc03a5e61a6d62805d8c2d8cc44f04b4e07fe2b97f0f608bf43d47b1678e0ba9f5095e5340d492a795a0d9de9c398a79a9caf105763ad6f0c56d492989fa088729fc1d62b2a31070f3a3e7c7926761884194ef95076370ec4ed8bb2abe0fffd4d1e8fdc7bbff8a912e552d42e44e91bc82fdf8878098f5eaf1bdd0d8e3f4684e13a778d0c5fc33ed7f048ca2f9a82e9460767949f6c0ee7fef146590ecc664b28e28c21e309a0b004974d44447fd1ff477ed9403e08f27864e4d354aafe3bd8152a89610276fb71342a507220493e94da9266d2e0ee186e0a492695111dd17793594b90709daecf592826fa480300293785fab87ad630c430163dd2871eeb1ca218d6d84d52d58e8ddd4a6d510444b90db32b562d4a5e76a84c281630cd80a3c41468757100ddde4d28bbcf1282038984171203c268c697741218ba0bcabdcd5f82fd377a1eac1e09f9524ff0d72a8d43e5265767cb79ee7b25946abde2ce090bd38f907ab823cbb3ae3255e9c1bd27c8f4173cfcd6ce1136e908828d1199cd6553dcbaa45cdbbddfae2ae13270a5e15b11dcfd28c9f040b76e1d189879138b807a116b00abbd1850f56db94a9b5cdfa1c294ac24811992e510c463a31d8dba010494d8b77700b186677e94fae402bb9f69ce396320c1412f65641314b73280580872468d9671b0c546ddb8b585ff76210e0e028a98132a098d1127b4bfd7b3488a129bf3111144fe1ad63e085f9e63c6b6022b35a557a34cbe8f8d82c58d6f015ad29d46d4eb607fcb4bc102e3cc726d153d3c0657d4171dfc39f3ad31962629769fb432aa010e43a5c30b4e71c0d8ba124355c5b2a111280037569a63eac424322c432758f7a007f0962720ecf5915ccfe1c01eaeaa75969ec2fe588e808da49ce8135f7d4c51d58ccf37a9b8538576afe6218bc020731ffbbbfd76160d546f570d58bb2a9131090dd2c31967d66a471c1ff64f939e38dc7b4df8150bf4be18b58721ad96a177f577c3b5eae7a398e30dc8297b476aca74ca8234b076a5afdf339381200b8279e92e98bdb4cf4c0aa48af634ed738210497e6d000eb99cbf1ae704071a6c431c9abc8997c23749070d53fe4fd53838acb06aaaa79aa46af9c564305718235a758add978bc65d315bc0d01e5a2511b4bb03c3715973a4666b9cea3cd9b783e86ac224443eb948c2baec8c99d18300410cc1713b92202ca86f88a2f877128a81abd3b08057c7c25ea57f2a1f8d9bb974ac05c7ab0aa100df66600ffbd3330ce099be1dcc11f846ba69ec08b0c96b6649ad5fd96e11634260ddfccbffc49665abc458943444d0b339c4c445e16e114a3b6ac5c498107ffca4cf541b30c684729c16adaa0dc2460b8aea248bf7e19843503b9fec3bf7f1c6284944f6fc63016e6890f07fe630427eb0cb471f191e238a43f194941738a0d19930e8da9a553d3c681673a832e013911cf85407f0c8dea55c91b47c01179f94cafa55f19480ca240c7b5b1f372b6e405bae9495d32e36b698dc2ecc60353d114f89ccf724414c2d28fe8cc36308a5e6d4116da7f59aed50d38ba103fad4bbdd6f183ebef044732439fe0963305ea5485022c199eb4241ebc6f89dfce44bcae8f927d67ee80467dd20e4ce5955bd51f62dddcb617d399c43ce46621f6e5dd0a94c8c1ad655b532a43bd8cfbfb783eeba32618e662ab00c0b80952688a45423558401a1bf07c8f67ccba199db609c3c1d31db6879fb919e477ed6e940020665062a84ccada77f96af76587e404ef4bf562ffeafc45a14dc8b18a4129dbdde07655c940c27cdbfac313d04e80b032574a434c66bf19f9017e715220ee28f478f748c72190e61638fd5e763b5fef74318115a0d85c9264f6708e002a50fb158144a4cfc23658848771d8fcebc522942405345dfe00f9b6e8c19f387b13470d6ee6907606300300008382d4686ef3de62517c93837f2f60fa9347d211f5b166fe4d7e531c05c57210b88b29e56c1405cd6c9b153e3f1bb5c5703329037b2b254be23223e68746dab50bc1f25ea87020f2d95c818f21b63f386f41c0fb0dd8254155b81dee18cad39426ca90e4a535cb9e76a27a089b2c3ae6cf104e69ab3a99e937f4ae18940efae603b8817676e4d600c46d4e427dccbfc714dd5589f65b645eb9ff71c70f9c0374304ab21d76e386d628081d98f0b3ba608ede102340af0e9b9ef8226a8a72730635b0921a25b3a0578a813cd9db37dfae130e929edbd48b44d6453c29f2bea4c53dc358e8ec9a1fab04808ac103f8cb8fd59aa9992f8c241449b5efd1852f7bf1c9eaa003074815f9bba43fbef249973c30fcd29e5d0de69a4f6b6ec6cc12950ebc85d7ace1d0ce29d7095a3ca01db64cf02123814f82fc5bcd5dec1eb06582886a34249bfca144872ce269aaf50ea4b7e71ece906d7ebafa2a2bf81646f4b66a203e1c8b44f7dc48f2b90f5e7f728b3ae5fb89b6b4bfe90c0d3fac21ce81545abfc3f0d7bbe37e209b71310c9f53bbf4236ca4acc586a8a70341397f12344cc97bcd25f6c3ceee685eb9a35c0fad93837ca52af8ea92d03221df9eed6ef563b23941f87a4fcdca2dbba87a8c2b9cbd05a106cbbca20e16f93d3c26415e84d970bc54ffe830c866ab4549a12c23ff84645817219f91fdc101048256ece05958c0ef86eb38eca2b55a28e397904a0f8e0b9f94d39d49c689367610fed215e50d17a051fc26f14b07743aba98a218a1434f2ef82cbc168d72bd658550cb8c2acd8f3fb02ef70a9367ab085d91a51e8e5c4f2424ab56f0f25382d4c11903956da35da763f89e4da7bf91a9cdfc7a54ba3cda529b7c04ad2bd23410288075ef88b13a9cc07e5c8ff4cdd79d476666c049753515aea4c54fbd2bbf28020b6935e6b3b93a106d310cf407818ef8aa6b31df4d6d190dc20094924513cf488e1610899310ae60cf9946737833a074822250cde9288cbacaba54b3e124c00da42ec163955197ddb58e9375c0907220c93d4113ee729e8d98f6a34ef8c6713609972666b4f84e10c7f575742e1f6f8d641d99524446eba86e9b3e9ccc180ff0ec3cb40c8f2d8ef8e520e180c289d3c4ef298d6f86e257cfecadd1e4638fd72f611339af20bcc7b98b2d71b55a6c2c468412487946907f476278c10500512a6bd8386e0ef261d9b9d3f4010487bc45823b1f36ea63f71a06bb1a772f14a09d9b8c40d250b6b8ebe87d0c7292b8890da226011b96addfd8a75a04621a851d368a0a1879e22436408d11e66e984338db2662e48130ed18ab9670d824c80b189bbb74fe25b90258a03ac816cd00a59566ed2e7149ddd341bed866deb076fa4d0ddc32c0952815a633eada34deda23925d3949eefd2c296d2b2b801d502933445214d79399fc2df95b7d6a311add180500d0eb98a965cdad919edcfb2b456c832560370607c0ea605330a6a25c63a700760279cc1f650df6bc8b7f85776dc6ecdce55b4bc62eeca940663ec638412300d0fea94ca33064cb8f4e022a5fc8ff9b1a71f15227ebfd770a511be21f2aed815b9d27814f88f35cd51a197ee29273714c2ac5ad8f75a898bb44cd8571aab8f69cb2af4db6676db7b2f530e362b1c3bd0fb67caa48cf5df5607e56f78083e7137aa97bd7da13e3824bd3c5e292c81d26f7d1078a29935e05f7503659aa56271c5262391d6c8e2a08fff86c22f6bab3f3c1efebbfe42cebd00433f555e517ed822fdbd34de4240b79b5c2dff9aac290c3857463180f21591ac197e218244125fde54dfe404420bae25f8d781e28c9ea74a8c2f746d428ceb70243577eb03f8321ff9abd41e8e6e7a8ba6b4a3bdee9168d2ccfa499303d53df271a15245f58e0ba28b94377ad046138e287479d9ff58721587043af7c89b03210cc1e8249f3dc5f45cec07861b08d7f8ae5bc094b0a52c2dff86cb1bcce9644477114ee9b257e4446ec63de1b488b155a8bd9955425f6be3699c5d2be7ee10a4ad426d2a693d7e0ffc0e38d2623cab55f28f05c5557c1da59896b38c07f89f141a4336c304cee5c289e9a05581b0ef813fa1cab7026978b74413d261b75f6114aa1d5124e8cea8cc4dacf091128675bad07d6f2b6b55ba182d57cb5eaecec5a39c6479873e0e37587fccb6d07bb0544437e2aa8f2e89a548e87d3329626438df0f8f8becba8e0c41f45a1e4fb5a5444eadab86d8156b6319654cd1feebb1289a09664828afeb4adf9a5839d01c85a238ee5be9a24569d7146f5c5a9678908c3c4941c72b6666e42a3e6f4db434198645b9686ecafe52a100316169ef4fed55e036ccdc099afcf298d73bea505df608abc60225504566aae2b83d2a221de7657579748efccb0a7c70ba4a6d0837cab4d58e46f9a48a07756b53a1a5ea0f7635516b907bb64881c5731e8fff60097fe4335b275e56df9d80d97a7739606a23efe4fa7fb2dcde63ea992acb3491851c1f94bcb67a42ef5f7844d293388b315223cf205409cb9680103af2b223dcded5b2fadbd0d339c75bf63b19042aa77869f1ce4d54932f4e9b7a864a1ad8fe889077cc0c885ab105d6b4ea87eadc70793f21aea5e5418915951d3e7f59783e9a48007b1dd3ef033c6140a6b41ec4c64f715c6343507d05b88110e024350867ce3f6ed080e90e6d7f9a480556a5a70c5d17ae4ffef9011f769c763cb0941087965d3ce4b4cecfa81dc37f6359e4dd370bbebdb1cc895dd53a3b36fec10320f4b16bb39f2204210ab0ed1d5fc01cd489023914de7aca27c8891dd700cf07bd28c9278511f3fc2b9da833aef11cfc46f4b3cfa147b2977b99930c98f359eab14c71b750b8efeef8265c868c0d15d5175e1f77dd22ec47efb08c44930ce860d12497ea7b9ee5b6354be91e6d0cd85ac4110cf0d84e60855c5cf5c3a60bf42c1034209c8508d516a49e360014f62be407adb5165fe7e6d215f9a21ca0f1957a92d3bf40bc6687b37e8b90347d3e854fc3d06146acc42bc6e512bbcc7b90fa3fb627d5e5a70a3048dad8ac721f5f3e11112cbdcee5c1afd6d1a31d0a81c91ac1d6a50eeefb966737e3ba4728275dd0a300573c37a22470f859ff5db3a31ba6fdf2e5522b143ed2283e5e8d29ae429c6b6b81b843118e67509bdb87739b1527c63491df3cd2916c69c5f7e09c7a7e6cca493eea08c77144706ab7e5f3e1aa8525d3cbcf2ee1111ceef895f16818b06901c588cb4f71680c411c0a6e7a811ee6e71b0f5096304e6b2469cb131c4ab174fbfdb82d0d9755612428bdb0f78f85fb7dc4565580a61ab107fd4cc0b9ac381a859a8dac21d182c00efc11d842834289f2c3f487b761447d55fc6732427612a66dcfc6af7321812de5277a3c681f7200016c0574a107f1c133dd68d1ce966ca0a5d99fe1ea1a77e61b0aecccfa1273a46036a1563639926abd89d323eac27de61ce714c9b840849937535767dbc79925dece58c574bf4244707e91aa2fb9f26c01bad21602bdc064682a30e3f5e5a48c978d2c0faccef90cb904fd1e7ff7b13b67adcd221e6fa6ba7aa63d05190598dcc8e0a1b60cf58ba335aeda1d983b6ebedf045d4e77d11c2270ebb158c2655ef7fce3cc45f39c0a83f3d0e4104d0c88b71cc45dc235aabfcc9cfa71c115a9161fa08a8f946c2d205c023740cf063e0041d98a91684f080c5fdb00cf4defd83cf92a813f93ea01e1e91e33d8fc60769c8274b254dca39fbc8c2f2aaea89d0225eecad34d1886bde1d9066959e853474a71ac6fbb44714026c3b5af802c9b977aeb83338d5479c9d7ec01c86bd357d04c80e4eeed0564ede4b2444a99d9121b8a823934c270906b48ba2d1b35e0057ec2608338c70db90b3c77e5548a002d88fca8b68d07136a647de9d2b94a0dd8f2323c60ff2185237ba07efd8d49b4bd809bcd0b22a864ab8a279cef7cbdb22e0ecacd8cddeb6fc8fe24d94f2788d91eae144874a53abca9e1c019351654663f5ecf40e1b256d13a3012fff19af4c119a5d0a3d256c87e05dff323f3d89af38b8b6975abc69d3a5cfd70a78bda5488d353a97bb20805262c3884eec00c098c9472a9c17661c273e05d409c1d7dd569a25d0f8e85859751609e6805a8079169517dbb8cf82671034c8ccdaf73f8107d191a524d23bf0853acc1ebc400305425371bddbc230e35675770b0c5c27e0d59e294db4032b0fac21c83bb971c4a57242b40c14d088f9b0b3f6fd422a951da18b66a38752273df0419a74579e1d18a82bb8d21628ae1dfc1744deef83163062281099fba4840177acb4f68e4bc97c249f4a98c1e778eb63309528785e6ab1bbf9f48f1f155b0fa44a76e764e2b678c4e3282e9d386ee6d5e844981fc0d068ce827e092c66d7016f28260cae6966b6f343a2721489a3113fc9cb5a7b18044a2b3c883c4a076c01cdc6853036d4eec04ad9737bd327a350df1fbda99a86da8c321057903c15f54c82eb040daf29d310666013fc8c473b3242f8643d1fea179e1a3539d4bbbeec7579da5f2d0b4a0057639d682b1cfb7fca089c02b9ff52a68242802b71292926a7c2206572a1903acb4f705704de9f6be532ceac4a4b30014691d0a94c12096d7d4659a86061fb91228c073ea4b0ac2364351573000dd3ae49964dbbd915341d3c548430916af268b05883b15a0cc851bb7e755a0325a0b12fbe7b2c725484e50ee3087ff80c2ab5730b91b5e5e2bea2d2823a40a68745e75d0810cc1a5e9bb5b35c1c13af83ed9a1dd43984659e4acb80bac93f55b2efd6721635a0b3713048288f2a61c5082af585a61c621046c37133df6877d84e79f9d1fac2490de14c798440701c6d41a00ea2996e1288467cf08a7825e88ae82358fe05293ae71f91ab4ec498c3a157c01910a31cc017e27af57f926f1b4a11273342924f7a0d08a48b707560adb1ce9ae81fe0cbca97900b771bb5619a88b133157fb585ebcf264f26e0246a29126c18cb7692456abdfb48c1a102aa54ebfd5ba3ad107faac1bbe07c8ac8c4fd217e29bf142ae7d386cb0ab4e560a9db9bbc25effbcbfb8f35df51ab5e76fb81790176a6b84331800015895b09e8d8caaf5a2fcdfc518a2bf8a31ab50ca30fd6a28ab11f96ffd8a1be471c34613e29ec673cbe802e17373373d5b069f4d8a8531066ce2687f0c32e0056c1c5fdebdf3d163b32da327c74d45f97d1cb31e73596d0f18a3a0622914df5d2716788b3831cdc3bc4459bb9943150ef090bfdd1742ac89b472388cf746ce7c6e6115e31964d4d22849c1e50edc4c42fe91cc4d7f2ef3f0f66898183514e2b07b72b73ef9a63313466878209f0b51901ed12442924d60512bd10562b500965b18e8487c73564df6a393e1ee64099c13b880d3004e31cd1d3bf0043a9d2bc52f6875d7bb22efb00e01bd10256817ee8c7d02935cdfb4925868c2e556ff0a0252c6f80b41e3ae221a845b2e0d07188a6b1f22f533a02f2f13bf2fb06b317577764c40f057808b3138e21f7b430cb79f800f16f899372296268643d6c8aa884beef196ac118b2355181c687341856628a9fbda1222b327c99420912bf62b838599195d1763c1f7be40aec21581be1a12b2d7e267811a8dc4e0cc3242973a15308c24732306a05da8320926255fec276050ae29782f8eb2aa510f1d55d30682edef929e6ccb5d0342f4411187407021b5b11b61a4922ef93e94ad1abda2fe548c4a81b79c3ff4dca1db0984345ee5a064d070d09c51b7a89a423e97e198c75d99d0363112df24cc35c051bd577e3e6f1c4dd0b8d66a5ced9ab0648c8dc6ee700d445c3c3e5f0368168ffcb0a13e21202bfd678a94891c7be25fbc7f8b9645fe645c8e2de4060a0e496f2e1627673064fcef19ce19e313c1fb3384740fe77dd6155804e46fac78b905d906ea28b7771ddfe2cfaba204eb48d65c1c33e2c93830940ae44e5abf50e0c50e67c7b6500dc981f7831cc7d421a9cad4119787c1bee501df5b3e419006a21ab5cfaec44c6b28bf082ac31865784d732ad407974a6b9cb3fc788702400bb233c8250dd636e4cfa559e73dfdff531f7d151aba75b13c93d007702759d4a0d5c7053d3c1f84a46dfeab5f1782e766fcf738eaeb2bce8edee1a08431aa0a2c5743ed412a0d68208398d503d0104080c86bc3cb4901448a1224f9d4a57e49cc5b06a2357ca97f13fc3067a72dbb559af7f347983854a28597e0640619c0faefe4e306aca40c6c836b92aa3935154a7d2387994c9eb371374eaa0f64c651ca76eed4d2683286ec2a6c648e9e4b1f69aa91fac2c083824a1381c583f369b8069c1df44e799f0ea0af8fafadcc2c0804db33a7fcb5e324d55f4271a63d70ba7ad9ddbc59e440316f1ea85ec74e62d1d5a9200d965145f1480d93791ab88bdc71cffb508d587e6636dbd7c447f5416f087196abf41e65823eb988cb9341a9c84549ce4856d4d35545fb1936c8003f2a637751f408daef9dca9bc63121197e57c1133520e770a5c19795d9019c9668a1546f7a318b4ce74a0c49e0f6363ea597e60c77db1c54e20c758c58ca1e30c27a22e4304be0207c5d18d246253521d122c008222248bdae69217f5bed647a6b6df7b43ed3740c8f2cb7d8239e0b0f2fd82253956b92ef29f123b034040c8c841b013f1cd23f3bb0b2e595d5862b560d52fc24342b656393e7fd5ec1220d0b97ace46011d61c31b2cbdc87626858552362dead4bb43feef46d346d8133c72f9f09786356bef5354ae1d1720be9e0e382cccb9215f514d52783d63749d5bcaf56d9287cd287230339627380ea20a0850b5cdc3c4cb413dbfb493f34c827670404e281f5d34b80e1cc129f2e0c99c6f3bcd475a38c10e261d22460f6c68e59c50c328ebc3e069d1bc1860c69d3bc3f7682eae08874ce7f8a7022e130158eb8488c5af85590e35a53dd5fdf54d716e3e7713a331151b25386de025b0eba5362f4b8297d66ad5e6f152e9808c7e921145ec445cc0712379bc324936161c6f5cc4cd0c353c12683aa6a424a502f3d78c42cad6a5f4b7db57d0c364e32b3e8d8cad4d01c6472a33f002257cfd7585af45a41084f932c2dfe8acb5b8822b79861729ee055ba89b96fb025d7a6de8bd9e6297dd89fd206e4fcc209c29ea187d8e496333d2789a8a6dc5e20ad045363805188fd2d43aaaf9aa99d066429916e81e1227977e065a6ae7f3b85ca5069a59dba92d96ab00fd17203a110f5b9892251fa731b8a8494c2818734315e364e8366f66f69170672ed93283a445207fc617244e11ce338ebd22d5d7bbc5b4138e2b9075055f91b5a28741a71c22d857e07865504197f63c5c58d9b4556aa6b742fd0109fef09250c4c4cbd037a2cf9a96dd8f731ac821c863a5130bf5e0f86f498f5d22554bf1552200f753ec72111150b412f80e2f55aacb764a9234525c2410545c445efff46ce2f2fba6d58c3fec874e694563b8350820d4af9fbbe6ba6d14c983b3b6716b8f26cf73457fc576ed54206e8eba3ba6b25b9cecf347d9a06edd2a3dae8ce97035fc246050206568ec815dede61d503cff6e9b7753604cc70bcf80404082eaed037f629d3fbbec371e7a5a077ca0d9b50c9d38ba11bb4ae6f28032af931d3e183e4421c39c91acf01a99d6236755b914b8655d29fb86c0e543569ffa995eefe52d2342bd951147cb1a4bcb4cd4d69d9d080aa7bd07b57e15a0e0ffd8f96dddb49381bd0ed88defc964af041207569e67777a449d6934dbbd359bbc45a4b8d218a8e9e6729fcb26169f74204145ab9e2e67f9ac7569aa9e70471d0c367925e9932c564828a2ea5c91f7aab2415285edd2d224671d34e54961a5b1200a25754824a3fb596b699cf108b538040bf2f00d43e8e158f36ce6a77079cf78978d94735332300a5c663e441ca07c7415f7582d52cc565fe08186c0939a0a53e596b62a424cc454683919280a218f8e21d8fca2e0a0b609bb035413167006be16a1cb9eae2f76893444efe8fa26e0bde54e54cf682a6f91a0d2faf7c4f31d9567972467452d2524982c6706b242d35989285902e7503c14fabe5aa442fef51a200eb495490e6a397dbfc4d594ab7fae388774a3a775a3da383e650521fb5936b40b0beb12c1b87bc088328785b80981f3510da3114697643df3d280fb6608b84ef69a7a5904d489334ef150a74ceae6ee6d704ee2e9baa7f4281fcb16f4bf315774f49ebca369678186912d871e9cd21f8dcf28eed11284eec6be42140e551dd3ec59e9344758468dde9e9ad00caef1f03e4827aec27e46586a51de2d26fc2e17c470ea67463130669f0c6d34224acc32458e2747edb44ed167f33fc2984ae8d0e75019673cce3130e6d4f549055ae941a0c6c464519221f73c728bf376bf0ee4e680da75e910f0f618b0a3c599f425f67acf2c31f6fdb95b38206ff8eab309ef755f3c2c31965131f290fa771851352125e7a795c08159c6dce4894d046aa1b6a2af7c19d8e8431c5ebf29997fcc22b7841d2039e5ea8c01195103574b2800ea16fd15388780eb1bfb2bb052062be6adf61884f043f871f9179681b40f2edfb9ae04d4f09fc1df56daf2a5c651f6c1655666822177b1f6c27b3a2bc5d5bb46476eac65e2be24e6095e162c138b6d46112c54c97c18cddd5069b836aadd18c1112eafc6ba8a044e07fec0b57f67cdcdd9cfa478890ddf61ac7b04c5abb47bb8525cdac4776185a100e74d6e95b92c1e8872adb07a329c9a7442f5ce4895dd1cfede15d6898a54b063d8d87274fe88b3149274b56f75f5f6bf5a6ca9999611bfb2e114742f96c52600b11a4a4491b09f046f5dd3a3e546f39d177f561aa35d884e49af9c0e2edf900849213edba22e252d5767ce0404f8bcc4f6c8d974214efd982463a94e769bc95ca00bdc88a5f62f5257e62f2f5f9f5d2faf8af85073b11a176cadae0c413e57cfdd23803405502679c8ce929c3fa88cdc3e0db896d470480b1cb1b4b47be284049fb79e04ed2d7396e927fd383716a55d6a9a1443fad25ae320a87ae51c06ff44a683636ef354d841ce451b79e8b5e896684c22ac6e54bbe6f73a01c8613cc80d52437bace8c0ff8b7576550ad2043223bf59fa7a000983d56c3a9eaa428b73e498832606a1cb8f3f7fc3825548527004fa224cd934c06a8d82ab3809418f8adaa2892395419acd0338386b6d1f99754625ce03630924dc74575cb37ea3b4151951fa9b6c1d3ae4bf689489fed48e86078b3827d37421ae1d146c4e9569bb0274419b72661c39b43376b9814ca79f2fa7b28ed9e04a3d498529413af3b51373c16d0ce9450d6b74137e12043045b530713d5106fabc45b8767b30c11ec4c51aa224aa6baaebd9950afe32c82ea597765fc020b567f681c7247275e748ef440dcc1c3463105d35b2ff94c83e1a73d2ce7d1fa0246bd20bbe58a97835d2830278bb9406767c80d8db5d849a0fa73d95e06636009b583e7a712e7627a64cfe5866efe2176890413af4637fa870f6340b501b0393a8c5e4a71c4e71f22a594f6eff9c74f26393e865cde5313fcb432bc99f000f1c1bc69b32aaa99c3fe0f1113f83ecd5a65915bc41db9799eb6b1b03d0fad3c6be77919ab232e9b6947d02ca6e3350f57b46f4d0068c0e319de44b7823b5cafc24385408f55a95057109fe411d2d77421af97c490198168677da6e59d8c469ec699bf93040b851a50d8f57923a2b36b25c5024b84f7225fd6a9c4c76f389dca07c64fc1987d8ced0694e106d58ebe39a001e471f1552b831b5f050da9dc19fb44171265e8f0e1696166579104b09bbd4ae41efde8ce8cf49f4f0a987f9120962c6123d25008387c6383b252b2d89435dc002017675f5efc51b486213c6608dc104da9ba66fb31cc044229fe9ac5b3db9efd0de219e511893b408d3798bb57215137641565d5ffd5095841b7a3ba6c4502fcea53910159284c2ff910612f2fdd2802d1441b242a0fab9d74a3fce6137ba649677933de48ab67d9ac2ccd62a31844db8db2016fe6753f2708e37237d8a9beb85c71e2d981327c33823a8d4207df0b0121a4c38badcc72f8f650ad8a3f1c964d61410a553c7fd5350e43063a438adfff5fc929b5e6e1d0215fb11cda94fd962a69645bfb0397f2dfd9c1a2267a56cf6c14234184b7365e5b880c9ee6fbd5f5e300502344afef7ff8add0203ca4c7e021f0901f5b79f2c99745496a16dffaf962d4bfe02aa3b4fbde7af311ada018384652168fea2579738ba3daec9a2a614fc1bc6bf633c5e4b5e9c4c29437885f927690cc55887aff87bfb58dfbe18f087a0d0789d4a454be9c37e733f6a39b1a14ddf0acc8c2d4c1db96b3a42511a01b3ab80dc2c50265493cbeab9534c8fd878902b7846b72cfb4434a63b67bc3ceba0ff42bb8c552572a560c04e9c8b76cbda952e23031faa0c39db5b158833d958451a9a6e320729f0b40c69dac259afac3ecfc852d05dc22c71425d543951a6f592337fa9c4d51b0306ecda6d23c7a6086fb5d96564dc0f717cac82b7679fda27bedb4d79c118f66cf64873e374023a55e29389186a0e1b8f64e5baa7f0894646129fe468ea9e0b39ca15be2343988e5a85344edd1fab58be7d8add79eb726a5d0544c836029d6374dbc85f93636cdd0fe783485e42d708c13344d208a9eb57a0a2bf368f9f1978efb3fd57501e5818debc2d3281d176a029379b0ef90b29adeeda8249654530ab16f489d43a6f8b04fca74d48d42d44752e2206c64e5185b3f8ef31667ab347b0f4908c8e963fe49d5cb246904ec6bdd574d016e0034701acc1c75c86c1c0435b9306473cf8a413794fb46840fa559adf12dcd7c3e09f86b7b17c912afeb705c395eddf457d125bc23d745674d3b7be5ba4ce3b9464b93095ca11bdc6a65e3e3470f2c834caf76ebb588c3fc654af43cfde26a0e0ff79626de3cd93f5f8f3ba5fc462c6a9928914ab0f2ba7ccd50d14d4e567e2e9b4e1e50f60c8151d11f962ec175609bab069b70f93b158618d416064138b4eae630bade7ca82bbbff0f54180b654ccde3528a950eb43bcd0cd30d5bc488fd5123ddb8b5dec0f395d73e67ea618a501f0a3d9a31d04332b92e9af355373c1913dd5a98013cf8f2637beff06462c9c5ccbec42e3237bdd7347374d9b3b16940be20ff8ca6119368087edb207bdcd6b00cd245d9447f9e92e19548e9fcf72ea2a8a6e1ecfce44af6864a9758b5eccae389e33e742f235ca10007ac79942f4cfd1e200320af1c6c6938516268d3823bb20f53b8a0282c6ef2d9a5dc3f0c9926685c3ec93d6a488a6de61b2b57271f7b05a997c20a87b080fdd8c8980c4e600c37845a4db55de43b023e646074816fb68e431660bdb72db70c661cee0888a9db65fe98b8a1d574b7950b5e9e51b24146007a2afb9a1a7c8352a10edd1fed170c93753848c0f70e708c21b552fbd9255ce646b2ea69e1fed9110a015633d987ca8fb6b99fec50402a5dc40d8a349a4800272867b9ae501fe9a94fcec2e7e86a209210d9bc2aab338720f9e28612ba1ecddd5cefb91c7dd5902f24937365028a879e11c17a227b2b38cbc6d2f79794ad52eab5d1a98ef13aaa3e22eab5db0c753e1ed856349e3a07ce6389722be9fb40077ecae38bc3b619617e61450d276646e5879c70c1d9ee90206960e470fe5da9fe925e8adb5672f3a7526665807f031d960c749d6cbc73a0ee040252e87ffaf36703e1bd29e1d540a824631f2418e7ffc8f7dd35c9327d0fe1373d08755ba1f290771fb65ea28bfa1d1ce24551743ea2f5f9e4f2aae934d870afae0dd1273bef0c2d6e85de10d9b59b601d7e3d0b1933de33ae204da73b335c366dc9b5188eeb059f7a5c6eb2228d41903c0859b0ead3d901868274fa4068e3c813d00033741ea73c915dc548822d584e368c0afb9c8fff7d4650ae2c2051dc60ee3eacb4e37afa2d870529cadb159d725835f05dcd2e56e16c2a14855a8ab285d8cc94af527e35605952cb29ed045ce53ce96d3012d2b87cb5dc9c5940688b2ca999417e43f13d350ccf33f13a8c24599a177032b13fb0a9828bef842959b645bb4be9843ce7bacfd24360f686807e329afd84902dcc15c93da620e0216276e80ad7e32891c526510d878fb53da51ef66f25e457e971c56158744e306d30ded17ba8cc9703f94bc2c663ca5456c99988df30cba8a9cee778d8051fa62589b34b0a5bfed80a7ac5e9f8b8067c0676581436a7046a87e95aa70532b8a9e64899a4a1d79d4598b914dad5df0276cbf5a0c0e6bf643dd2fb9ef53ea8e356417cbe71d05b1b81a51ae3ddb78995c1490f492ead7046b19c5fa0ce2c89175d9010c59bf2695a926bcf96ae79d347fbbb8319e9c2adb28752a6b9c1fcadad91d8d95b286b34326808aa6903dbd806fe6e7f1c1e899571b0bb4e22296cfd7412783b127b1c84d762e11ce0ff1d7a75752e198641454cba8d94192cda93586a6988c8ef74d97f6d083ff746376eaeb14ec5a1d6dda6ef4f261a08acc46032a2bf9b970e7aa8f6a6c4d7857d1fd2290477ee669400ed6f746a3e5572b849367d029632653ab6106db9fd2e639531b9e1098218a4f53473e2bb3d165b365b04f09cfcff0ca8b42ad7dbc66e93900b90020d984e76b5260a7658d0826120c8087850a135f7fe5fd8a30b2ae7b8c3d9fbcff4558b267097dc8eba576a2270ce990030638b75b7d462729830b5b57fa46638c6c00d6dcab8381c768a80131ec9b059b39beb66a77973a406c9339b06c4f376df92b49ef6904e741bbd04417a93b388909ab029f1c5db8a19525995b328138b99748ea71456e7a413241b33241d030ac8dd5d5c4014163707b1cd0e9bc5f1b25d7fbb7c3b7ccc80b57226f47da9cd3aa090ce9aed9b97c99f4b96b177130434f5f044b6c3c5a68bca0835bcf0b8df831fbb12c7e6b41f4dc96f61b6636cd2d67b4a5f804ff482464b9b244922654a29bf05cb05c2056384cf83cb4f3f94103246cb4b5d903f84b0582e44878a344992244992d5e52095e2a2bc4ea7d3898ad39f2845013eddcb896047740d85c169fcd3f79c565229a8405788ce7890f1adf0991b0aa3846bf6fa243ae6f35be130df666a2714bf82f37a2b5e892b89a6b1bfe4a7782856f0a753105bc4901fac7be61d03d608a5ba1d90130cc33014eade7befbda11008a6bcde542873280cc3300cebb1d1aaa27d62fed80fe5f90976a821b06359bcf7db7e58adddba17bb376443947da7c5d5c2d9b4f628ccab04d134bbd429ddb44dbb30f6bc1cba3f346ddab4bb5bebeead9b366ddaddadddebcffa4157b0caa7e3b615acf2e938ae082c8a6cbeb24c4921c6b53056f988e83be8de2c5f9cdb40a390f320366299ea609867bfee7eddb59b356a35ab59cd6a5ab679b125d42efd9ae6477d352d13d9bc5cd1ddb4e9fdffd13b2a84ebbaaed369752ff5bc9c413014baaeebba7c34cdd7ce78c576180dc57ea2e9780ff1835df5a0c0758566d14f7ea233a09675cd3753500582601af4e4613860f04070030e5f5ae6b305b5744c0aafe0eb743a9dacfd0f183a6763a6f9add6b71690795afe7c26d3667295b7bee5262c302569134d9224fdd60a0fa6be050c3de33770d3fb81ca0b5306372440cbf400402652355e04920973349fb80933796e3299a6699ae6bd366e4c9527582854ea89142567cf2a8a8a8b8a429521efba2e123c9dd05ff6b9f8d59b0f9a977edbe72821b0d85c847f9120830d5b506e830a19a03df4aa4fa1de7c93d237e99b660875a25028140a55832bad8ef58c45e061be011df33561cbd0ee017bae39d3ec206ce489f59145318e23a9ec1142ea9c929488d47154a94a6e855dacb550f073b57a900b374de747b221af72d2b1dddc60bfe1bad15123d040086b0e1e3a22d034ae23819e711e1ae673d7f9a85a6185518676e27ed241142fc2ebb9ab1fe4018badd27185d7573f198ce3388ee3385e570d1528a59229c584086aa754723a7215e148bc896badf59215c287b8f9f1136ec4061a7a16fb8b8ed263033e680002dbaf827e72afdb0e158197c475a7c6832ac0a107ff93826b16c130003d2a5da552a9542a595b23f4b182529369753b462514ef755d2c2ca15333b78897e4f2b067b25c696a0b1fa92762a75eb2104ff53cb8036aea181e5c3f2f91c254c634454d2693a99e40d44a92e5ebb85bb783cb5ade9ecea853601d554ca1d28131de386d0a3c23145b955facc0627ec9c2c6831d8e500a8ba1971a60f1caf0b2048b311c80d6af069a3d50433b096faeb986fb7da09d84f55bc15361d1eb3e22f067838733c24c099c4307f4491e29a295003f797af0d64b02f2b390b72b14c81b9ddc2852a6e83c89e61ee7799224499224795d35700f1126241126b2bbb3ceb22ccbb24c0a07ba6bc2e17b9b841d8e8cd20f94153e9ee79ea184a29b5ab2acd600411908d10297f375bde0fe8944958a2442d14d36b250c846e0ea50c500080eb836290cdb68e0b1ca5bfe1da41b6e735296d910bd6063ae80715374a4d48ea4b247888e3dd924b66489849fa91d59cdda56f762ec7939836028f494d2cb0bd15014fdf0421e0b13d833cbcb711f98a8cc510e904d896ad4ef420e908da734e2c9329090115594463c58f644e3687f9891bd241adb22ec108b72c933f2f7a8568764c707ed4841375c21e602cae1d9b1b292735cf2ca97b3925b720e4b9651bd3acda1147ace096b761790e6dcf6e9724e0ecf0e973ce3cb99915d3e1a38f728c725d3c026954fcce1f4c901d57da20dc78386f64da0472ea01ecd9872b30cd4061ad6cf0606b8645f0be8078519594dd33444f40c2dcb233a0b7a648950a435605d526849672e130df3f9f244d1636b60c78eb9453aa67e57eb6299acd0eebc35d99114beafd81213987e383f6c18586cf3e6871d473a8ee368473b86f5a654bec5c465cce639cebe8481c57e02e4ad00e28811977dd019f046017bc6403cb8669b5da39a96fd014a53f46819759a8d701f298fb68f86e71e61370f9af77bd22cc0f75e1f3548911162f5125493f07307de65027f7ed087b756268c18b65ae5ce977b2f4bafe15c86e3388ee39274ccbb736e39950e24e2bcc6008d002e947580451f3fa1180a49ce43d770dce751b4cce71b8ea4c1ef3e97a26368a87d5e96b4c440f9ef5d89810b748d972e43c3e5cf16f09a2d7fa6a169b416ab9de01a2e53eab8da0758995d1e1db76929cfeeffae95e3f8abf1d3e273d9e6bb5ce3931d3bfed4f87c3a6ed340b563ee83dc83e30a40d45a315b310b002af08cfdec9b409b66c8b699e301d05371aeab063686b5f6b2172e71e05e620232c4b2e7a74df3ee8e5d1d0e232b39fe23f41bc21a7a156ab889562d485ce9f02af40097452c671983720b9feeea64c0fc13b90e33500ee1e59f58f3f6ddf061be40349c7b98cf5912d8e66be19b45d1a783a11fccb24face177307c7819592982455178896c3c0c58233472411882e3382ee7cf4745c64ade01c8387ac99d5d724bd6998157be729917508f3619a097fc0179cba7e3e35df8cc92678058be1ef28887cbbef21a11b4cc679719f9472f2b36bfad805eb20c900a885f5436caadf4c8c572d957befa924701957000298c4acee7c301c85683114f96731875c7ccf8d1c67d7806b843140f057a84734b969157f2966f68596d2e777b6e9101bab7e5e215efa2c16081d24858ad3c2e832151ce9d8d037444e066078fea590574298c73ff29dd2772b350bc95c9dff01f7a8696a4a6e9c65155852af543dc756ef62cd2abddb19a200ca267e8fbd03768e5618817f40dc2a6f1ec45150d856ed131d46c9a6adaf19a9ac4445b49764c74a6a292784d6de2325d9324e19fa087a84dde888ac52f51533fd22fefada82615559b5cd7a97bc61d46afd174681ace344410f4d4343f6ed1338fe4838ca7919ec60424000441a01452f8f154d69e9aaaa8d1666c4ad3383d62ecf3c7d17fc450972601a24b744c915a83f0082a3c8d271dc6204174580149891105a110405c25741883a800054200319ec6244e2f40d2848d0ba66a661cb78e11bd70aaa083b516afb0788deb0842a967169ec01f09bc0061d82a40c2046038c2e03ab88ceb8c54e772d2785d1876eb652d86a9986853ead4bbbbbb3f4702ee8cfbc3cf0a8f7cd499d6ca82ec89946cb56a619c1287cef4c595d65aff71b390c2a2af2ed18d274ca9b121464bd42d9e26e76a85d918f4f0d0d3c3c3e8299c9e6ef5e0ac56ab9567c3f3562b4ddbc14385094f7cd05a6b075e7c20c1627e5a6b39841449962b2749cc23aa26282524e9799ee7d119aab3e309c93478244a0025144956b4472b27d414249df1d6553eab758d17293c57d4ac2a3ad3de2354499e4ca5195a928eab91349246d2485a95ab7255ae4ad34fd2248f409e48484574828c438a189d8c41c62145ac56abd5494de7399a3facc6d509c6d8349d3a72498ebc7704d8cb28f8ca66a8cea7d0353448cbd0d01d466ff452892c91259205631ae487d2905211a5911c499324c91a42a10c8436e083070d3d42a150284492a927caeb254ae45484f49ef968d7f38f86f9ac7d62163e97826635ab594dd334da1d734ba552e95dc1cab2fbddeef77341462095600123e89a175c4648d35c3d3c55ae3b991052a74898f530cc285f28c153e04678145fc251a46b4631cd9b8186f92c468f934422e517722691346d070f179c4a77777777f7aede1ca5949abc887690144c24f426ed0799fbf943b52ccbb22caf4b8b5ad6b2a2ce28b5274935ab939aaa4c52a9542a954aa572ee546aa351c4094a52a32fe2c4893412c1100b5f60b1969563a10a7cb5b004ae496a595b50026399c6f5ff6421dcd6a2ad90b5907a98cf57fb52a48ff42454288a42b196f553dfe2add042287eaafc944d7d2af5292f371312944ca3ebab9ed37c7d34bad68f8528b85d86e690f3c341f4aba74e0b267c7d622d3b500e38a168f30d34cc58ca06a7b0c32e7767013c8ee3986b78d5fa7d8afb5ec9c37cd674c01555cb0759080277e832b496652dcbb2ac652d65144192e5ca4912f388aa094a094692368796e18ed13e5c75d0198c1f80379017587452c454872ac791cb95640c2d43438004e1cffca030ef425ce603ed76bb9f9bf513310c046088816878ae76c7e7a6af78d4ef668a1b5409b502149193c934dda04c138599a6699aa679af8d1b53860e7ad5cda3c70668e8a6d775b917b829752170a61fcd1887563ce86ab55aad78d47aba529038d01ff61867173dd0a104477eb0d65a104c65daf54e5afeb30603b30985301b1d5c8a7a201f6d1c8805284001c228078866c5c84d9e032a48ce491afe7d3e2f290c0cf7f9690c8c41e1ccf12948be388d72806c4c588dfa5d28401023ee5df80ce47918c268bb3ee0365d7cb5b68f9447da47c39a2c86ad5adb9349a8ce94a73bdb7d9bdfb66ddbb6bcdda6792c14efed981c83f79d7b3d3f315a5a71ba7165813fbb3cc1a2ef34cd969f07fc7da287bfe5a7b67d94480fa639e557f48d2cfa86155e6891c2c165ada67d626bd9d5b0ec6adfaf5ce673876a012d4183bfa24318117eeba4a413cfb2e8e797bfdabe5c6ddfafb45c7e6bcbb9d5e556abdad0228b89f9b39853df2a0974bed9b42ca3f289f77e3e11e3eee33e31b75a1c07d6e898908d9b8ed9c1e3069cfaf9171f4c96144b88c565064b904abd7492f4141c71c4e98b68bef32e84e5092c9fd862884159348bfd84e513fb0cc72c7379cb2fb0e4cf083080ca27e3dcd2322d9fd8397896ccf26d94a394858585858525b3b8cc7099f1c98d9f252443c60aa8c683a18eb121dac183860771721e7427722ae2a907959832be33a2d66aabbd31cd9badffa7c09e6f9ae69fc98366c7d4d4fc0c5a86e6b57833090ad5738305169dc6cdd987606b6cd3b80adc0c30962fe87234b016b4125e1f17e13379f0632c0ec2cfbf45cba85208038b7ebeea513553b106d488f5390163d96607c9086db6f92b963021e2a6693eabd7da0e862bd3c00f7e06b984b7090f839d5074d62545665d4e9e60dfd9d1988096b33c03368388c27c773842e7953dcfbccec3bc83713ae974d2e9a4d349a7934e279d7daef499fdc8e4fb890f8f74b9bb63185823e482c4464130c46303363616134ada41d0dddd6ff0d07bf0114f8e0ffdeb4f131004c15a59250a957a2245c9d9b38aa2e2426b8cbff4b07bf66299a6699af61d0e2c7f56bbcc65b15bee99cacd8cf33a508f34500db31e7da77d8ecaa080b32f14ca26ca35bfd84d09bb37a29f348d4816ba41a15028146adb68183b1b60ac29d87996251d3a9aa63b555452809df4b913bf441be91bb507e572a6046dd206ba59f4f30ec1dd24539c43601d55879f5ace3e1a375aa641811e693466c83ce20c00b0e234d241013aa91110da8339caf2075a4223d9870348619ef6608eb6ac65d1f3c126fac66e6c422ba1c15f3dc10b25241fc10ea7ea4b4c4cd5a952a2a4c7799ed8799ee779de7b73aed06064b15aa723534c52be54e4c717c2627dba4fd77517cbaac0a2b35827d64a7edc7d3eb9eb3e9f87f38ae7173d29fd0cf9e17c92c56ab1582d91889e8e3a4f2ae564b59a8613f2319a46628d45cf9375b2ce2d735974161774c5e4c1a74d5c8687929e22ab7f1485d1314d2a53ca4404f53bf74fceea4c2c16cbc462b1582cd655a38edbaf149165fe2b58e5d371db0a56f9749c870516a909cb70b295560aadeeee6b93650765d9b5f9db319fafc96432994c9a76a2678f55e7b8accd19e833c34d7df4394ef843d163a1891e9f50f44e9c448e1a7ae17b87492c7a5ae81e9d494015de0cbc2d3cd149abf644777787e82a1402c19cdbfd5d6afb1158f4540a0473f6ae86e323cd5d9645279908d08d1e0b23984b8c48b14003dc581c0109967b7a1eb4f91b7d39b67d46ba8fcb9a566d1c908d38fbbcc44ce025f0767531d40bac7181dfc5d00fd21c4225a1b761437ed5cf895d951281205523b50245adb56bfb05fab073dc0812518c2320da1045463c9e37202ea8afcb36713a91669323aa22292eca9e7b3a7912272fc36ac7dd8ed3a8f0b8ae0b39bf3714047a825fd0a61c271dfcf9860ff866b7375eb361b96e9f13d1beee98eb52b400bb0ccb1758ee220446084ae8c6bca75396ed18adb5d65a8b596b2db6c1808a2a701676a1e88516eb70703178775805d8731294babf2021438c9aa6691a160aa5f22766cffb7080bb58a5a0ca543e1df7659fdb5d16168c3d2f6710bcda6adb6a846c885eb0710087459bedde2d9ceeacd2dddd38c0526ec011515102a8e85bd7759f8822c5eade7bfb2f765d1fe63baff3c511a81110059cb45062b4b9d0e2240fd2329f7750e94174538ecbbc7773c4eedbb13bf7ee6022d1cd329ed389349b1c5115497151f69c4e2b1b9b3055390cc36c9aa63ba92801b2d1d3eb7ef423d2ab4c0394427802cbf7c222a27f813c9d5ab4568e0a6b4dd3344dd334e94c2804821e78c19013312851a31c200ad0190269c4e3194808053838473c5a1645d67e8f553162cff1bd9c7212e6eeee5cb6a00fb492d0039eb9bc7508702f412215f61224ca5026ec25488ce193e4c665ff9c84611223b9ce45b6c8d8ba2772022c3ee9650042dba3cb2d1fa8613cbb69e24fc5cd2fecbedc315e2a7925f16710be8b5baed7855d6e5a1b1bebeeeeee9fb5d7755dd7957178c92e19072fcfc88fe401a4977170c92f198719d9cba4fd8e86e7195eb24b9ec1cb335e5cf2f5edf0f20cda61cfe4cd57758c0a26f6e5931be80554432b096dcf0f7cb8c16867809e04b9cc7814280c7bc44bf2c12dba00038a49924f3ec992f1019062b3eeee16ffaabb6d60791865fd70d68f1387fe1d8e6a2ba537887af402ce0f51005a851911dd116a02d0ea23882602167fa2a1070fd66a87b53f4c2c168bc5fa11b2f1e1a1564abfd5067cd46bafa555cb5b7655bb691976dd5aedadf6baf7da22863ce6ee8e5dcc8235b831fcffde7b5d49ca2ccbb2b274f7a157d7d5ba4a4f728328fa0676c3d6ec701922f80f2e0dbab0fb6291893c51c64cc6fa86a57d03cb9e9b66a84a7778749e0daf2357b0539e1efef59fcb4d5c64714583249779d702085307a1cfb235e2943c4cd96a95996e19966559869ab68347c912c4da16ceea455d6932f03ea30116166d1b823ddb8cd3575f7d5191c5b0ac0a1004310631884bd6087a4813d137b24c81f01f7c6479211c08acc9215d7f307a66253fdda125238b0f454616df0832726733686615460d819587fc900a9272313e2b327056c99fccb29245af594dcea8edf0b18a505dcb5a11f075752c2cdb2643fb8cc8f872808cbabc8525217564393b060c7c84f0b38a11c2cf1f28210dd2cfa23b40216475cc93a592e82caf94eabe3f39f102d327e7833db0582c168b755d66ad6fadbd027fbc2458ec966a478808870b85df753c5b48bbce092c86b4f0e66f5c81b3f01ec1622806ec490cfebd3871d3c239b55aad560b27f582eeae5d5b2ab5f4a2f4ba905094124a92a5cd46391b6b6da8c03603010720ec254a9284b69b408f74ae6cb3d8ad1728e0ed72047001fe2e5aa1a396ece0e43d95dba8a0ff1f23def702fc9f93f02181c56ed510a769bc898ea9a23405141d128ca309383bea055224a2244992f43728176bca759ef8576e93fa5c8434112962e3505e08bd2e6e09ced12a702a7c65d246d3b4ce33d6c960f34b16d8412fa105d56e0277dd6bad09ca186a6e7930ec0e077e50088c57f0bc9bb13cc3fdb04c02338e89c88ba05bad6e75abd53af2048f154eeb3ccfd3da8eb91e93acadd553700267d75ed9fd687099bf9db59496e06cb55aad160e86854129a553f0f6ff5448ad6507b81a241403096fadfd2ec77605c6e1f770db82f3dcaec09e4bdcc39bf252447e9ee779f6b8ae2c0aa6b5d65a6badb5ed3838f7629c7316e1d0999c5bb9955bb9955bb975b3ad954195123aa71c209c12e48887cb40424490608d78b454a9d4342dd664537466465e59242bdb4412d65e3bd6644ba59bada6597b5df6ba2856b14aaf6bdbecc57da41691eb889ea12814132a1e1b2459b52c8acedc286090c242c5c406255bea9824d7674976b4452c59b2da05f9fdecc97e3ee29456ddaa944e415114652d2a8bac9106515e439f582788405116c5836dc1684b2b9bea9826e7ca96e8ca96ac2dd9922dd9922dd91286995e13ce28986952cfaf188f42dd7b31db11d1fd4cf4f32c014785f0ff47f03c8ce1192108660e1411423734b4dc619685e84cf9284eb4ccbce9cb0b9ffda8042e3b5ce9900000000001c31500001808088442a17048342295b7b23b14000d537442825e3e1b4a849124c9d114a30c328621028801408000c150892c2ddcd8ab999bd4543d9452a28be475855e6441efdf869a9c7eed04c8b24feead4d784bb5e98b0eb34645472f2c0aa6a5cb1e45c9525fbb94b0cb7f78143c9c394150da8d0fb07dd83214b014cbdbc732b77ac29132d9d931009fcd1a086ecfd58179be1a213dc83a3c45775a5bed482df17138484987626691f016730dcdd1047c6aaf9a6b54421a328c5e79562cbae5dd98150d7d18fea05a2d2282bd9da99e3b53515262afbb684310daadc2e33b5bc08160d9c1027a6e280a71d70e120f70c43c48f97d58de2761878cdd226f85980c9a9e93cd6f7ac287d8fa75c023f002e713c5b76ffd48b5ffd85062a200daaaf1e0711042b3a8126bc2c5640cf13778af074eaa29f81fd4e241a49165a50e9f539d751e5c906d684d935cf592db0d35020ed627c712ad834431c04ac64a13f7a72aebb6809974d250527c7c41f7f427597b5cab489f7c2631f34e88cf3ae4f42baf87af76ece5576c5bf0b49233e4484a6fcbc4d814942b2a9c99f313cd00d97a5482901a68aba5dcd569425b9da6c8512bda8a04f531448d64143806f621a0b7ea653ebb21fd1296bf63551cb58412662de6bc64232558eab703222b9166339d28217a538498d8c55f451fd8d1af76ed151e5d86b2ff932ffe56c4c59b4e0610aa12840804debdf5af4577aec948eb8fa239b7f47fc6f92f4f9f5753b41d7a0a1d653f6c4625c01e609eb15af69727ed58b9a14b2cf2b0ef42e4cfc1312b79cc6a86359867f18b96bee4cca441a7ba31888c4c3ca6784cd22a999a54e6700f6238f43715d7c03c7c9345e2eda3e80047325f9ecb2c8e083dc48427a206966e39142e75cc1cc5a3263331e9ca51639ae5996b82cc04e58f19ea44f3245cccf0ed4bf25b31ba3103ad980316cb264fe8bcc08934ceac860f64eefba4d5969aa5c18c1d7948e8424d9199def6ab0d9a1152cc7d11fc038e70364293e7f79e80d20d7d2f823710d1549f325459250e8157debd11b931e82c9662e4fd850176a1b6be3b6c7d3bdd29ac108fd47ef07dbf639aa9fb076792061d28b6dd82aa88d417f2c7bfd63498e3a1a9818731ccbb2b967def42f8bdac8fdd6c19703c113ab6ce9e2e2236205166a3a77f4f01d4239b635650920adc89154b0d635a23c631fe10436de96ce08af2ca3065bfa1789a704e79d6c8cde9cd1a1923d65fa01e373bf629356c1448bb36329877ad885d023c5b4dcac57a10659764699d3e2f7c2c3b128553b6913ac4f039d903de3a342227c0212916db8893c904313ff3b5a92336f6b21242afb37af5c72bfe908db124646186a3fb597694b6930f12dff4a139fbeebd09a57638f42aa3d5c33258f8565a29fa0915866561aa8e2da28c3761ad2884407cef8e13bbf490ecd17d5fb1be6bb9366b8fcf79418540bb930dae190e431c90dc9d81a97ff9f5328331a95eef4b243f6efc1e13c8af4d453ac47c1cad32f35a98afbdb4f5303d54434b73a45991f9ea0be154d7fe48a9634fc5f5104fba3e8209aa723ade8f9ca96ca9c2bb4515f1128312160e910cb9249ee7b93b105d91834d27c25afd9ec80ca7d056b381a4309e6d30d258f92cf6059eefefa98d76324424840a08b839113193246ca59d296b6819e6765a3480dd053fa0bfa54a876a85bb1bbe512c7c105c9499d51b7c7bffb46680060d06dfc18a9dd4b735a6366b41a07c84124ea9415ba8dbfc6fd31553f857b0423e67d215f3b52a113bf8348f4c407199978f5ceb1a625dfbbd65e570d5485b6eaf5a58597b2103a2b9092ac094289327835c09a18acdb282964aad6e6e65be42ab39e767c9349b9fc89f96a4599b857c6ccb6f70d3b8f260017f8b9bc50ffaaaf705bec76082e2d52cf42ce46832193772ed946c0d51f87d935ec9517a2a1dd450760926bd0cf24167426b79cab2e456a44583a3a89de85bada3cb5f48f567504b26db24e66c26e00e01529e90cb19c29375688e776d1f7397e4739dbe1ca563ad4db46de9be29db682dc5068e5d8b1f1c944094d5fbfc52d08e9886a38b2983efb848a4ba6dd9e4ab1a3c6b5bbb713cc4bb07a21f13f378c9546447b40b9d5c3764295d85368a96637e3cab8bdab6fbe0f8bec7eda54bc205bc2d75953d535cf8a21d3b812a47eb8c76f51bfea362c45f6c87640d79d2bdbe392530fd0d22233d802a058b8040a129f1b7f229457e0ed2aee6a385afdf7cb0fe457e1d320bb0a90068c6b9f39cddd8cb0c7740ce68d61e094cd3358ed99fd5293a661d13250147381caf90ac58f5bb87ef6cbb67aab2e7156537593eab8f1db81a2d33f5d87d3d1046075ac7858f336c9e4f54b03065585d57298ea3d6a206b5db8de10eaf2ea6159684182c1bd447c407aa4024149f67dc69612c511fe0413d63cafbe347419a88e88922a901567780a0174a07ed577dd760886414ad95eab06d2f1b01adc55728ba22793c45c155e69bd6a40fdec8068107cb9e9e97518ffaec2545a5c3074c384f3bf7e14c80a691c69f272ff146ad861432a21a8cda43a420e1f26bd1357e29e1bd50630cda39d6c6d58ae035c4ad6120430a39c3d2d08b882463e094073fab43fb2905a94cf4a50e6eca31c4b0493857b59174a84afff3f07af2e9371857c2c53c523a93d180eb59cfc3e1b56f35a5ae0e377840be332dcf11f26041cd29ca979a20e84c27b2ed612a9d4bc3f00f5c4fdd6e8fd801bfa3c0ebf2f7e28c4f406a5f472558a880c2568dc266fe86f51c9b9e22e62df55e1b0ed003f5ab3533641e6f0d7842bd1b0776a6cdd7d63b21185e4f96ef84ccff8611ee89aca01daff09e941101c89de345514507acf9635494e88e928b08ee93bd14951b00416b84d0eb61b10c1d2f73087724c45d8cdb374b85bb35c2dc3fecd85a230860b1093419bfd64dbf293284571adfb27bf951c70ac945e9a5f6b54e7917e025f16b1204595ea3fedae44f196ee001af608028511be53e9f613e9c844dda4741ef94333cdbef91f0f16ba810baa132ae82c70597166c28dcfe3f0d9f3bc01f78f62ea20a0d6358d00e15e32783a88277903fd06f672cfbd3acecf5d7f29bab88ea85b3498e12827d984e489f360583fbdaaecfa6a6714aa7d21c8f23334f281ba678af6733400fe9d11e5e25d0d1ad1497716a3587a749076624f81178015bf47cf0106e6818b828ba65a2a287ab12398b605e17f4e97576db31c709d88e8a5585b6a1bb512e628e73731fa8d754677cf6ccd9e9950874337f880ad364826df075a46ee444ec74cea06b678132e273041644d8966a8f6368390a121b8528966239f2ec58e798a9fa2b0a8b5e04d9488fce37bce285e27b803237a5c45d382ffafbb3a0be967a2b126917e219cb090a06de48a5adfd84f623b681742e860197dabc1f004109972f51651c495bb32c0c4a9b93eb99a331cfe8cfdcd4df2eb753ba9c34715886ea2f07814b2a7e633e0bf1fd49e6585e0e07e68dfd1051ac0d928acc8a21dfc91331f8472792227d6d9102c800f8f1fa35dacf9cf3a57122b5ccfb86489c049f2c6d27908adbdc1d3aaa36f1d4157d311ff0003f7c2baa78e4f4864161eef5ca101c97eee9caebae37532cbc6b034f320ee1780e3c626cab2df674bc978ddeb801cf5232133ff18bd52044ccd9ff0912177a1cb610924c1ba15a2d31a35b428223c89d55a2227e2dbcc2afe5c4f835d8e658dd92403a8730d87b9f851d70f8a6668efb1aa091b3ae5b9cb75b99173432730ce5e2e6ed66c972bd3085200b8bcfc257aa77cc964f483df88c311b89b2d19606fa6dc3b7953ecfdca90afcb81924870dfba42edeabda6b7898530583e060c6f27164cb67b094a2e3f60838c84afd8e95a5af628822719b919b1f0eca7a68046ae16bc17940aba218da2401ef4ae03d0ccd018e2808d15a6b5a0718b24e6d4014e303f3826ced880eff2f206ebfbaabfaf8588c3c2e623f2f51bf1cea41e7e4c7a13974921a5f42b346b01759346773c6e704e313999fc3e198dabd2bfc8935e5307991f1253156dc2a2c9c516f3b0d8e8871bac88740b3f477356c2160cdfa29863121b5d6dcb917415dd70bf50691224a16809f09b104b0ffaa0e0652c28484274c198be2d0e36a948f873f36c03133caf074bab48916619934d17319b20367ace9ced6e2505ceee5aacaba9241ac2fa4d5a228ce9a7192fa2b7b2de3581f858b11ee84746dc640b9d31403ccbc34194c1d59d2360cd937da21bf0e4267503cdb2e8872c9554f209116b6c60c7d0b15f0e2c2f854088734cf646a874709f241d82ca9c0e6c1ec9d90be5d7cfba4761d64520719a94ead7fed8f17e085c0dd17115862d334067be0b9b8e4242daf953f16b8c9cf1108a940b2788d7138ce0e281b20a4353b231744df56a1cb8c97af32eece387a3340096528af1d160b6bc4d2a1354adc74e520ccf3cac1841c0662c122b12ae26ace04351ca9657dffd66dbc59bc0434e5e4ea63b1a0a49fc7bc3034b8c780fe46a50c7f8c90dd1794df8c3233b61750f470c31005a899268ac887146ad8c11e16df532592c70cab5459eb768ac26a80808ad4d0e3711c2acfdb21a80982b5ee83354b2846450aa51cf16c798327094c5ffa98a28266571992ee3929c06432fe51fa14ef291452e77c8c32e18de83a195d1cedcb151281454849890fb730ab7642ea139bcd3c9a329a11fc002aef36f923ecb0c664112d8a557dfda6eb513d98fb5b6e2254d1364a788197055c422ca8fc1fc917d038c170dd88d7a7bd2d9a1909e1dff0695f854635fc37cf9f03a066a6f8674b48ec80253b1b33eee4cdbc32e8cf5c7663b06942f0103495ef4181f79c00b83240b5d7fb635d31a19db5ad1533d78ad5eb7f5031e779ffbfd13b46aa49088b8004b6d7ae3a15b8644931ba55e535998fc83cc252b1d1ae62eb713e6f94c492a2d9fd6103a2b9d77e78fa7588ca6c6b4c91b26a3ec974954fcdbd4d362ec644b2bd68a7bd4ac95343f73d898f26ee3c1c358fa5bc574b24ba47094304be79cb4da72e345b8f33678a04129f6652e3971ff22047e77706ed21b38e44113a1f8a347582dbc64bc4dcdab25067118a38c438ed952a323a9f83a3c375d5c5d75544f0432c7d416fa6d0919403ca69756272566d0fe9052e013dbc2b5287add033ac768518eeeadcb7faf3ec4b9abeb7538e2b836f5530a2fe436a1314ba486c41bbebebc2fe6ac95e0f6d7e9ad1065c1793100f255eafbc923186230c96ba9f2afe0f8555935a54a542bc54c457755002bd6c969ae0006003a0f2b73782b98681d45941b3c5d1f512126f253e1a1a03f249e0a9b59d8c169ba8ce5caf66cb16c74fec5e74c46097c3baf86302acaf298b6434926e9d337b30e5247364e981e2250fc4d6f2a4e5af3a59ebc51bd6382e86f35831ad7ca7ba4b6a95c1cfe746325ab5569f2561fe53156622ebf91d08a3c377fb6425bd6b710613937c0436c4ec796cc1c23c032cb9fd4d8ceaf6122abc18169e34e098331872e81a7caddb273a6af965b56efa1bed756313a8f8ee8647f24909599c4a2196542a0f96685b840e6daf1848b4b1fd9393409d76229d402340a325f6b1ce00297cc4680b79fbdad7c8bbd341cae7c95b92c1024ec2eb6f4976f669099f0a4177828589554a1e6dc8d9f47b9164aff79661a1e11fdd1e310d2933b224bb08ff5a86250b04c7f6653a0ab6ac9b1e93b9fea3ed7b3ac9c76112fc240ca3b78319fc140efdf24770d3f4306d6a33b1a49bba76db61c478be52fa4cf948fc51a6a587b9a27288a5ce44d857c3f047db005c13235bb79019d1fc894db43914083c9c90a2cbe950491fc22a5fee2805ca40da169e83fc1e6b82f5e459abb1dd35e1d6600c3b4d00f973c77325b9405b270ff2f55ebf047aacd26df7c2139698ec5bebb31c9037c183f299d70e35e8340072f4256dfa56d93a14b9c851f40e9b94b89790533a4a808beae3c3b83d08d105656073183c34f863b8f48768bebe057e55cb5be67a04f0e2d7ea5a99725de18ccb1477a74fc87ccba2915a16a593d49cc52687254b5ada3b15f61f9cb721bf1cf4bad678c2cc2b343893f9f0cdfb6566b0a14623f601185b809f957855b7a6f7a6a6544aa9456d3e85da043b47521f0b60e7505b0c335a73b5fe20d9301c668a083dcc442d65dedcd77386ef481be2c844d4ae8cda706627c9598a6854c3c77a6e04647e320dd7e887a1b8466f188c363fc31f9fc94170fe55b210d6b80741c1fc746c954dd99d836399066470e0fd938428a7e1780e1f4be40426d1f529d7626584d6934be930bb74393fe6801716ea34919cd327c5849e2da71ee143b1b134cfbf12ba1cb60ad5a49a9d80e72c4de474537bb21d27e0612532e872e90de18a426b08ead20b64bb0086325754a02e74b95cb9a45dba963f10b630d5a15a6e4c09581100aa30b33093c4098fa8214362fb676e06ea4cff1310b4d694b05b760519e5570fb1e522ff088cd2aa1cb3731797f6df1503a4bc0a7857f9086747f6de797278dc203b5f463c6b8133217dde9d1fa50e6cb98ae2b6902e727512fa332c0735b6dcefb3e6144c3756e2c69835c79b29fc05a15140271d86d973cbbd5005eaee72d9724048ca0b05bf6839488fa1e5002d715a943d2820a65f1a58e2352b55fb99f9b5f4e492a12e4c3b0ba06648350b0f240e0ac455abecb750644ec9064f7ce55073192d2ece691d217c3507705d6c7c61524719e9ca3222f1b8475912e4ee159ceb3b798abe032330945a539458135c6ab713e67c7184f0260702683d2a8e4c0b13ec223d61b9bd01823603a25724e2d174eb60681b8bde11de521de241c8dff470f782bf55abf5128ee0d3902cb002c74c5cae10e76271d6d81fd0475ecf48e551628ac9485143393589e85878c1374c6f24e2247285330b599a56670381222b54e57d3c1f38eb00e8dbe5e7046f808477978bf0ada4a7bb7be62b1c9aae02bb7934731c3be8c964805f3287b46a2ee216e66d914b916b130d063616a6eb1fa44d004bdabbe70860859c9675f89fd5978a6a7d601a8a0c6c1fae93419903aa3839e24ed43ecd44a80df420364e7ebe333a295f95328ae6f9a3fcd908345ad595069bd72be9058b281f33e45bf519c5f1714fd39b82e473a66ae4098982c6b7cbbfb7b30d949e94624affc426e449b924d16cb8827a640bc76e18b170fa8cb6548eba488d5fcd4de90ebf8437427ecb2906e65b061d303a29e66dc3fb44902e69ab1836a86207e35841309926d3dcf3a3e6b5908c1f1521f4fb9c34bcdc203d796a8b0be8a385b92addd0a36b247beeb210c0eb8ebc2f48770fd299055864fcc5fed0f37d0b0c8992b6c29d2c3af021779503ed1aa89ed2c3095c43e2860e50491439c463b290a7138035f51df94be4576dfed226544362c6aba12f8b37837952208bb260300e83525abbcba683344af6f7c164c19a472ebe85f68c54264fa30114a9f12395e88ef9966dd6f0ab5d1d3bfea1e8f8e36196769a885f841a27980dd7f47c0ccadf58434f82ca748728cb91a525f466290c34993462d9a71e7a47f0e5bc3b2303be19588d96e1b89b8ce24a114da4334ece8466647034c093855ac8539f141cfd72e89a0de523cd72f2cc65bc1ce9997dcb7291c4424ac7c4e6c2e1a5982d36c6279fc3cf437dd149b5971db863aa414fcd673c84b159828a1e9fc66412c90a70036c181425d6697b84515b11df40700f9d857f1026f711c71ee06e94e86c476ce1cc6cd1b81cb8c69ff05a416933e06d6d3cd18761cee8060dac5cbdde9d9f067b4d622f39e8d3f4c221f343f8c1ecaf2c6d5b9287ce4dd85e43a99148aadbcba7ad20fcbca2908c27a0742b821aa2fa84ba5df63795b17ab7a7598b87fb9b728bac19576f6d9a940b44b964924d82e765fa33ad33924e0db10393f5c19985a36f3c0faa42717072f9e2d9a34e048004167c9dd0ed4f679cc12158d91466e08be8b694994c934acd82e7d452a9cc2b4408b084341a74443863cb6713d2d378627414eeac776fbb3cd793d76ab71abfefdfca86eda324276ce779afd6bb02eb8a6a8f232c0452273f73bad5729877460ebdf9a663ccc4f27e7f559375d252d37a0519b1fff036b77863480d83f0a2b529506d045422c94951b18b221a269be1d92846dc607d0da70589fcbe88f9785c6e60c62f37a940f889d7875266054b07a596cab30915957ea5f201e44ac5595279d2cc7e1565572481f395b24b2bb880e722e3d738a166a4f213a06ba7dd128e1580a5893eab2614b3fbf6d6db963071358cd20bb2547aadf04537d228fc6d1a72baaf4ec38c905c04a770f0b236433df01584455731321862ca75d60ee4b5fd7f5ac9ed4380ac7d113bfda8f65de0d5918109bcf810a3b401340879b4f4e9571b2f5c1c9fb1a71fec99ee75747f6b6efe9a9460c001ecdd2a5ea819ac85a6e5dd8886937de53d55d81ee982bb5d682b3c0e921d8ddc94d7122499950407d112d03d8c9310e6cb3f58e7d31a90e47a6d7a729fbc425871ab26da749446f36b70c8838088a34c3dbf02748996daf5b45adcf85e57a88049c85b9e71f2147ca5dc3a8d2e6a1f84b68bea956fa149ecbd97b822d50913f41f6902d4c58823d9e3ffd03a911d04ea493690bd0d4065028fddd9c3088edd487b5887f8588cbf8b70d88a160cb90aa62536b6334c5dc5001b3e4485dfd4b8de407b1537299bcf6c36492d7b03762e3122d59d2fa0a610e8d4067a0bcb816417b52b34ef41807b65fbe7545ad51f11a82b4a395f498bd87b90915b19d7e1ecba217de937d3f68f85b0e23ca03438a623811b25505499286c3d6bce49b3bb4fc701d5f45d9cbe229b17ec6b901214eea6c5bc2b28e8695a111e9c8e25360b9dd536b29193ee9683ec8101c3d02276b85d7bedc25022a0ee8a5feebe209e568e868b66ab75febe44352b82e8b6155517c89c4442f265a25c38466a0fcba093ca29c4779b4a8886083a39ce39c6d6c836476ca3d497a43c7fc9621e5eee377f5b295b9aa40c0592f460388ba129eb18683a861b447f8085f42df80a4e58f068ed7df32af9078671d953e839581a456cca4d034aa923db9bd42b0723c46198a237c0d18cd6a6481e08edab6fa438b4743cb2474486e4b8035ad6fcc4530c03068da1c04d62c472b823f2f11d7a5e6007c84b2a93c9699e6696c29ae5d0a4937b17d0f4344053f481183087c2bab8fdc5b87fa62873cd53811d911e598ef194408376707b8946030aaf60689f790ee014b8de67dee1ddccfd149e469a9644a4a996b2f8a7a8d8ac4437209bc8df37ecf054c9fdcf2eb5c7cf87d2e477a9a540286e6d821e898f2ff22d5bf63bdf879db340f9dab9ddcf984a0d53f1bdae520ce76cbd19d5efcdf1ed36dfc1259aa6c202494bc4e02f60db1e8cac542162ad04efc1b77b4db45a73604514e3519e65224ac4ca4fcc4156680bc0a7804ba455c8f673070a4c3fe00b02d5ebf47598a635a18099c18da48e3c5fea6421b6711e9d211b437ac2ad60ada11d3968a7e729f6850e60a06c13cf2db1d17cbb4ffe5905a41f877bf454a24909238447cb2ff6f60497aec953c884b35fa82c4496896c765fecfce8a2e94f8d4fa7160d356a1538a0d87e80538f9f0185c38342c8e0b5a7553432ef4185b06dbde434887f6b2f9dee6d0e8bc59a458d226ed979d86a342b2b331133b72d4e89dcc152da2a6952ca3f67ca0b678d34b77dfca91654d5b45e3177b9f2888c8760ad99e99bf2a21a05dec8a82e574b1cb8aec136f8d9c58e1d921cbed385fd5ca04cd98b20440415916e30f2d38c211a2d4bb96e82191f7085c495f65fc599f30628ed0426078bb8fc2a81eb485213d6b9b8e3ef5ebe8d3dd2d2575a11597e50e26f7d32a4c50a9fc762a95f55d07b189f4039af12e4f3afb5d1bf642568007b70d96e9e93433b306dbf826f8340fe257444366729197fca98c1422e64943d46fa4f36db1e819c3096b59e9b24ac4e0e4940943f6599fabeefebdc6d14eb9165edb05f330ac5b6c0e27d17fa953c96a2fe53908b8d88c4cf76a18a8fac1641b9172768f611a7d3c904c7d0dd0a0f7f732dcf78983d1f7debefca4b0695f1c3955a3ea6bd61561a01286eaa89249ce4329ddcdb6bc11835d5b09b4072d14d2b1f75addb4a908b39fc3ba179c6c23d89688d4a374e8fc4a44bd846400cd0e57fe0ac52c3da024e82b94c3cdb084685e028256418cd8d57430617c9c14884bf877dd871c74ae9498bcbfb9173d38722f84602a18575e2f4185f5bdf44c44ae305019471ea44061d52c08564f9259d3d73d328a636ebe6132ccb7e8d6b6841c1aa00c93f177c4a270b52e3579bacb8c37d4badaaabfaa7758afdc594a2d09cdc02f66d89f03c780e3a001b8847aaa2831d97c6cffdefaff8eecde42659dce336870af544a12a0b1d58af12e5886ea048a275e4a25cc01c98d8b66f2fa2b5c774aa18528259788466897d323c54ad109d97f05763c8e2e1c2ccb7bf7fc0ce200cf596c6b8e28ba55666e0eab2e3fdfb6d5ad00dbd1ea6773fc56cea76d806a02ee0d8cdb632039137e56347d69e18b46715a5f4809f6200ebeeb8dff6f6838acfeb260657f58ecc0e0c5e6a6884bba4126c68485ba31f37343ac04e89e863c893f129f3e92a14acb844976f6175c01472b24c56d270116c7a72306c070b99b18822656006d40253b1a7428fc5b990b717c568bd05cc7b11f1c13b9c2907ce224bd32ec89aa9c891999dd2526d9addf0734c78465186b42accea6778b5f06dbc507b27886c515172a13e991a915e7c7f95d181b30d20a864f7b7c3d8614c6dda8e1475be097025355c8a49d671d9b46723200eb0a9658b803676ffd2d575841afd2336ebfc1f53ef211d4043bcb34fe88c06aa0c446706b8b3b2283671eb71f9568e39e1215ff4372088d534564fd3322fd25554710dc387b47f44bc4fab8e1b6c707e9980d9ff268ea72f0e2afb2f0bb70090cd1b0c94b3d61031d64e7d23110b6a846b26cec0b5560eba1d02c03e54320f19aecf6aac4aac952585b8601800acb40271a67fe84c7c317b3214d8ab36dc2728a8135a780278e48de7475467bb39e9b7343ec8f8d08ae9532e8800400c6089778d57e0a12a7cacd0a7dc5b5f880e7854073ff2109118c9dc04445ac2f0e7ff78b4a559008c6ee1b841a88c8d906b00ee5acf97466ec723495241af1ecaa9fe5b87a7427bb9356bf05137f80345092d3fc339b623a826e6d2f28213c83dd1b95032fe22bc7f2687b2c88380ac3ec67ef491b7dc6013b1ed877371b72028ab0a506ee4d36250438335c1f7f3cef52435f7f7ec7495431a1644f5863e4d1a4250d60aa2b5536cfaf7de04c51abd4de05ab98d7869d64df4242174ccda7d22ac7322379e4d19305697244e5124495030241406573cd425cc4ee9bd4d57c033f277ffaae35fa1096f3d96e4eaf36dd302bbcb80f64ea5c4a7978dcb8de06b1824c9cef5a7c72d741f6609c0c572b2a65953f24f71cd42bfc7d29a019767b7b5885e1485bc31a8ae30148020032cf944c79cfd3b100d76ff7c99ad6641b161f3432ca1d70c5db91064f52f86f977e71b5b5f489167e5ec635081fe9584180a5dd21855e35b95e53ad4f8d6b372ab4a9a39a6abfa482a2d19256d5f63b837c4f3188bad3785f4514d00a699850f37fcf53708d2a0c06915286d87adf1f5bf8d355063c7d605860e73e537f15f4806dc6bc08d1093b77a6025beb459624ed64e539ed31e95e8ca5ca440c5c5193455a43012b7885cad713249cb47ce2846c0283a0c490e6880c57beaeecdd5103e99851790f4011afa5f325e235877a5a0bfa96d38f535810f688019782d41a36f358e4265466a0468721eecd40f8193352c4f6aa20432475984255634430b6663022534997844970e1ef01bc69f4f63f2814369d2f745cd6dbb6089657f6eec3d081850cd36827b73b8fc911951ad2b761d81dad57462aedb1102365ad864f5b7559b924e0c086b05d425cf2bf8d36d99cb56add289899f8a7153e27c6a266128fbb88abbb8ee24c4f8f455645177cb1c9fafb5a549f95cfe69970c3f9771e732adce75ec10b16acb8b716e0f22481889b92b846525942a72ba408a11c751b59aa81c7504123e09a4162c554dfc0911ba01c62e4434b542c78fbc35f576520ec9d2115e4e4d5a7369eb72326276a29a5856c96ce2a86635025b70f0ae0d84f92d5a8442bd4d8c797b71d9f2df80ec33f2f8f36823d38a39bf37b77ad434e09704aab409291dfda2a8c01775820ab32aa38020b453c68d7bf2b9dca0401d51182d56bae2b78bfb411ec771ef526ed0323de1777690c47c9a20566f74d9e86f03b33a4613e80c45f1e0c341fa127e0e68d36d3a2846c5b4e944a2da195f784658acea1e9134be42dbea2206f4555bf142020aa876930b272764283095da7fe21ff07c27489516d9dd280c12ab7184c3c55df743977c669580e6703b0f98bf269730b4036ffd27bb32df59e6c8f996f539c046f880a99f85b2602917da7059fe718875de643ffce75a9400f7363574b9cbd3223d7d718cb7d2ec3f3e9fd3582dc4180ea186ede1831c07fe295a4c5288239fbae18ed1d11deab78d40c1217e6bb663fb742dbfd620eb36950a025045a1296f1c8cc58d69f6e99aa882101be12048017edc87860a4a9e53dfab05ab783ae6ea58b237d364f0e1e9c5871484c94ec394d6cbf4da1d54ddf72c08ddfb9f4f0ff393c5ad830534777bb1d4f4cde55f3659a8837f459e5d729ae3184105352b3e69d8fe44131ce64e0cec3808685f7ac4fcd40684646025b97caefd5464f295e8f4e682a74202773e3b15dc9c2cd7eee918a94fc7c454ec9b789291769d0d32ead9070df8284ecf81f0cf91b56f2e79871bb100839c550e1cae97a346dd6c62afdf4edd7e810bd910e48f717c159f6765a5bd2f3d601cf63427009544f0fa6abed4c316d45f10e50afdd501d33afa9e105a6e4a01e5d6c9dcdf274e015b7f9f008a259974f18b9e4d54aab50c16ad33831590e00c96f9d6af6e3c016f14a652b44a327787dbe7d3ac986e84da957cb4aff994b940a922e81ba2eac0b8f4be962e3ba8d554dff58e8b897ec40d0c8f4a680cb11a228bf3105e32617b096bf67b319b64cac1d4c2f74445371329a21c6d403f65529de61419a800c9b0247fcd3cd8f96dbbdcafd730657e651519359cc2bb5b08d98f819158ca983629e2239cc82d13e46631162cfbe46262b1c7dada16f2c36d9b0c520ba9059e92a496226f9736c94c39d266c98530f51b2ae9cc0f3a633011e2d730a6a22563b272306dc398d5e52ac580310883bb690595d3957542b4ed3a711dd780585f5982df60fa42d3aece90db5fadd375f12e988d65ee80b90083614da7298a8bc39ff1d9d918a65f16ddfe890ee74db420f8964ac240c120e59d942b0eff6f9271b56b23cba943efd4d439fc41da041294b8f263f3ecfc14298cce3b6b22fc6365067143721287443c2b33ecc42ac551b30a3f5f00a75410a94698a6f9a87829e8de2d9c6b2564e118ada4c223d8f44b0cbf3f934942d02a4d4d0511a99c530618cf69b5c9359f826644addd9270d0675e06fc5d1ec8bc2e480762caf181a47ab0dc13a95462d5cfb93c3150bce59c9231b7ed5034e647ef9d4b21b960d0d6a898bc528551ce0fc3a027ffbc48bb6de3167f2a0a4e9b34498774b8f03c032f46591f1e5b8e8900d1bc41b404b1b756afce3c3136dfda82d4cc1a5cd7b319a2b314c33790d4b9ac47c22083743da1428b803910891909bc200536fc5ce2b45df325e0facb0864356634716975bbaa784408a06219900948d87d54e7208ae128e29792e4ea8fd560097330308a7e8ef08225629fd84ca6f0a92e96c2178e5184aba21dcf7669ea49a2722e93145ea34e90816ca4306fbc759641a882854e50d0a4173a06cb1d40bbb4af82e278933a5030d220bbb944100b3824a05507ad6dae71861c8d38cd42d68c62c7ec37be50611861950bf32661865fba32df5c787b951a86f8d775ca81cf594534503a4d36b76e495251a8855801b0d734579b0f8bf4725a16508503bd16f46afbbfd8a31fad25ee017ce43b32651569f5b26d3bd9e4db1354910b8cf51e40040709681115b9a05d8c582ada63aa48b8ad53f186f716852eddd94ca08a40aaceefb10a4515d9930277a5f10a19cadad1eb3e9f5930cbcb2879ce29c67a6e08fffc77968e454646ceac21dfa2704590027552259af8edfbf5c4bba74853c5abea7f7b512872d2c338a0bed9bd85de5a6b982f51d10903e204afdd090ac23e4391db273bfa630750ce748308c5428873b92858a481e771b90ace55c5de1c6ecd36def60e73e43491c9f4c787889a619d90a82298e3b0969a88a03ac0cedc5344acbfae1d3d1b2313084a2da8f87ba1d6f82dc2de50c66cb43c0291c5c8cc0e7ec135534e3e26ed040915622d22c39f7dcc0a26f137b6daf65acb96aa95ff2b50a6c7ffe7f2ab0954ed6e923f1809f872857f44e54c264ed7732d28376d9d4a1a055007fa10fb923b28d259eafc47a89e9756ed4357708067e0f6de7c969dd6200818def3bf5c421dab786992512a3939f467494737d48d0c0d9c79a78b7af3c2252418475ee41573d6fc47c9a1801ec50ca36862b1fe984b313fc083b0d0f9be92476e760416115bbd4bd87da197e1cd83874cda87c0797136c5e0a578e55d7e71d8aab97ffaf2286a834db791270e217c0d9fd5f706db36e8f24d481e821f17ef33dd99797e3674fa560b28a1f38af89d1312020f17f146a36c1d23dad75c23992c613a9124d3e5545cfbd3051b91e55db54b1b40bd43a3f8fd9493dd1e3d5f6e48ed5a29bf429a614671f9bdf410479363bf5e4a7ffeb86d3e013628fcf8baba271c94e1bf6e1f16da3d772b39d75304b746201a950052c08f9e7d04828e86847d186aa1335601ad0204e836bd51adb0345e22508484b6cd3cdc9c0950916e318c33b0e74e7f0de57678c8e712b1c49ba01e7238a15686ecc70963a38636c5631ec7df0b59b85d593f2817ecd8a432bf6cc6caf9a9729d7ec93af35ea781b68ae94b550133c35b7da0c8e0f8f4b0b2ea4eea7dba7d39568f2acbf999916ef77f3d9de4ed73c38969bd3675a10c04c9c8902210671f88711973785f216f81b6be9043ca3144faa6767232edb5f6bfa7963ca3d1c9f3d5d81b28ae4d5cef5e22275433f5b4ad917a7f211bd0cb08b0ca7663a2153329423139edd4443597871300b00019ab45225fcc210cff1104660cf48339124969758af975e8a5e7cda4d37e4603270c6985d5facb53334a215b520a61802926db529552da0df2c0a1d2463628b36857e1e1d94813e212d98c984013b66246fff8bb094a59fe4bab6ae159bdc900ad4268d2cc7465d74fa49cbe73cf8261180d1c5b71f0ed938ae74eeba71cdc19a4a5dc0028ec16553fba0bedba34897f73a25aac2a8b7c79fe2a7e287395812d434c3bdbab6b0a81441d6495ff76dfbb55319af7c93cb4b6e9257b095d2c008844dacb0825f6022fde172b29b9cafb5e2b7e622c789d22eb73eb78461043a173e2b933e28fa50ab224578da1dbd6fba8d219dcb0fc7d15a2c1acefdc32a07dae30f0177b15265ec84bf153da268cc814640642cf9224341849e9cdae095a95328ca43743242924f9c1c61e924c9b38e117ad34c2d78e90c5fef223119947ffae2460a98ffda68add68482ef2a462689a320894dc1ca21505b993ede407aa849cda1d073298c966dcbfd935170382c4d38eb7a72f533645919c6a71a48628a91a831da57ec9c9b76225a00a47dd99ff7b93046e2f6240cddbba497e997091b103c0e144aa447641422b238adde70758c94311ed098c55ea92b407569cb365a8563e40474d7fa959dab10cf06a34392bab28821b43e00614fed85356c3a1aaa55bcf61260f3bb43e93d97394845a885e55a0be27988c2c48ae0737fd175fb38598c3463c62018ea43c5272098b73249ef7c4befe1448e86384c893accd48514f76da6e391d2a91e7cf669eeed8971b22cf808d0e20213299cff0f6f5860071ef14a431ca3c91dcbd96acf168933efaceee2b411c3a05215e3f23725e70a63ca02945f908726579ca97a85d468d75945e883d9106a53dd93265564431b5747abe0e48d0cf96782189dd99e06ae73e4fd26982f595c6ecb4dbf3507304c1a5511a345be9049f10fe5390c22dd52d2aacef0235a87d1c5cd7a8da2825b12d2e9bc54b91b6dd1857f9c7963d8b58f6c18e05c073a3224ca1d117885691f9458d3f292e54dc6fbe542aa982b9746f1788e8e0a318e7b0e24c458a7d2389646df1fa468e8a4f0c275e5949e5535237c57a8ba7699316ceb1d407f199ac0893679398916ef827ee280f3b6e8c027bc8029ae130d35de8f4ea640802cbb44baf51c8c9ad262720902dd02424ff5abf0ae738b83fc0df9eb46d4e17ea60b3b887a273aab899a30a0827ca0f79e0b8bc65829edfe9119cc504a7c2a691d102e74efc41000a039c7ffd13d6267262f82b4c85cd8986f274dee642e56e0009e97e887ca37137e0213be7c5c6d16f771ecd40f15f69e95ecfa5234cfee5a426aae4cacba826f1fd7bff17633cd826251768fb6b06f0dd44f50c599497a60015dee1f1ba9c3c16d5e3b7cdbed23ad6d7bac65004cf4f9613977563f6aca206135003781de7617aa53590432a14a841c10fa17d3b7009dd31b0150058d569b0d735430ca428c4a00e98d7fcda98d9afad85c07966b9d0374b0c38453bbc5c36c331a3337a0bbf23730783a31f860fd166eeec27db2eb80834f5b84625e345207427fc3d84633141c661b4489054fe0969d61408c6162f6f513c8160516b1aea89ed26516407d5605e6ecf9d77044c1da1e63ba72d49aa19b49f1e4844c70e0e212ff9467ea48b4a5d0760521d03af1081b83fb61ff05c664034c70e4a230ef8236b00ae89c80e62a7051c911d088c2abd88ec8033522a68fb87db47dbb1d03ea16cf1c1c9273d99ee14c80ed27da91d1d341b0c78d00e1e36723b956a09d4ee7f2eaf586707aa9b7e44ba615d7763ddc85fb3dea804fda11ffe45b0703aae2efd40b27e5fd01f7096f3dd9575d2325397c3e0e09bfc5308ac41b21ed448b10a32823f2614ec147dd003f97857224a761bfd7c87fc01271dbefd6b8b63831746132883b6c432b878881d462f8c64b907fe23e234ae8611747aac8dbed0dad83849d648f99cd6b6ea21ce5483bfa8c6a4504021b72de308264694001579647cb42e6a66a07277a56b8ee3a4c50e6cd4a65961d14a67a7b84fe0c7313e5fa2c4c43d738380d8ae5e23938b361a3eeb4d770fe657e9a198e0c4a623c17e337d63e9961024365682ca5634ae910e8e0d2d495300ef162c670b78368f3027a87398e2d36f36948c8313008f4e062b85f7bdc560c9a66e1c91ca9de004f7b1cb38ac571f9a81c587204b47bda16e60b7d644c7fee79f66f2eab53edcd93b3bcfeae6db6dbbb63c21704fb048c8723129d2c40539d862e6f37db337df49d1412695eaf3ed515111b2a4aa0fec3dd429d127b449eb60a25a9100f1466ddf30d9c76611a89e3672b56fffc605839890635541cfa5362da2ea532a34eba9b10c9629fa14ef1bc0be4dada92d00906f811ae3028297e1fd156f84fe4f0303bc77217be53897629b1142cd96c9601f57e6725472c0b3716c2110e1b20824cdce5ec02640fe2bedafaad274dad4bf6aa8d662b45ac47cacd2d74ba53d8bfcf92957966010e825a1826df349107d95feec3cff04a335d96639134e7dba1606dde82c2ae0dd9b81d1651c37ff369601587a6c53fd5cc8c38adadfa2ba43c934c129e653658372f6ddb0df3e33544caf26268642839cec97119ea1bf82efad609ffc42b8dd46d474136a7986eae95973f7acc1acb8195a70d0b3596d931c24857839abe40c452e390bcf33e975a4e4255d487f5f173e56bc05db85fb98a7c8069d4bae97a950ad51fa6cdd788a20e4d2afa788191c2303977955ba1939e5c8594670690a369f956d10cd266b1409f0ef1b30592a01fa2a6b777e25149d24de86446102c11584e61e26f9d37b09f735eeaf68607831bbb16075211d896c5d27cdba5f99482edd822f44042ae570fa249e19f50563e056e41cb4f019935c04ce1f478ad260569b721afe497856c61af92923c2edf16028cf65477fce56724b13ffc3d30991e89b29f101831d715e00ef4a304bcfa1a5277a94de16cddf5eae3c5fd9ff562312777e04f4ed4ea5243179fe5f44fa3e64f26df2d1df59d4f73bf14b82f2cde5bb9c5109faf9eef0893137224a2066a6f9aea3358f664f383d1b8b8cf3856f80334d3958283f2d7bd74902b28f1c888b74948448ca1be95efef9a2ad0a18c57fc9759c6fb907c41c89d2672f12fc26b90b376562288e5549e95aa1ca447a245d842f19fcd5197fc771bef00cdb6c4a56854b006f6448cddc84be01382325e85930ceb74c852ffe206421747bc45ec856dee7e67c952a78c255b9e6a0f2bf3248e97935a65cabbeda869884bc533a94c7dfad72406aa24c37c80c23419fee28364b0837c7d2156c3a50b051e2d1d49cef66b9d7152509b126bbc7d7801b27c515311175deaa8384a0ec2e3e715aaaac39ed95d7de7ad128ff1273bee0d7cb3fcee70f3819dbdaa1339b41e995efaeeb5a6a65e7015e6ba1becf7bdff67973b606b5c936b6245d26d0af47fc746b53a9b4fb3b30ee36fe48970febe382db3d734ece3f7d43d0c59299686871cec6cf7e09401317d21087284f384c9d9ce30092db0c5fff2bed078e0343c35b3011fd138de43dd35567822f7a422476a558a381c231bed794f72028b43eafe664ae5394d4db411e5203c5da6a32658a444b4fc0ef4f3c6f661e73f1cb09048b1557c8fe6fd5885c8b7122b8ab494329495597b1e504df7e399e50ab21de2ff8e0f6b6c60d792816273432c029b431e8b17a111a7a3c1e759903671cb8e1ab0d924d294be502495e23b5efc941ca720e1e0bbf2f56352ef8262f0a62f6ed87d4629e4fe09893b676221de295afca56bc3247eef64e262c9377cceafec2ca688dd873c4be3db2abdc246a28c7cba2de78675d7361d76c840a651eecc0a2db9ab4e2244c53ed942c3e2a3ac6910a710b39cddca4ea2e5c52b2bc660c2568a3c7583060b5a38bf4c7f3ea190ba8dbfd33db917b13c1bb45217b54019f53085be7e1de821d500a90c64173c43782a49adf5f5181c80dbb7f41c1f9c9e13468140635d8cad9f0486bd0a10b1ff21bbdae377caa8d3e764b8b2439b38708578e672382de17b17a20b7a7fbae90e62080a143073a48098fe0e26727a84741ecfc5bb473b59c71fdb84f3caf7b6d1ccd13c68f599f8fe40efe26871f641fd3c2ebda29736131809387d833420d65c2360541096242876668f6344351d469ddd307640f6d2f58d48586c90cfc69340d7758d3ce9a0d9f2775e0835a6781b6806871a5ab7151f2190168919d21b95ef3ae8bdfb28251d50d6650cb079bc6e248c427e34a7366e71cf048584a90a9f7d185180076d3325f4f2c30c1be23a48385e12c2b3af8196e47a183e085eb1f02237317a52f875576d062d2f0e9b0603350312819bb6bf690ceb789319728b7c045ceac783437796f38b75bda27b9a3d581a34c3c5d6f41b982b017a991b3147c019656e02af822f1b05843ba721b4ab531ac04c383c3385c0a76160c84901a579db7bf4604a20da31ba8ef88886a123fdcf95048fc3a184234c59a17da25ede799bfaf9fa3b7e6687dcd87048d5e92ff39a229655c0d55aac3bcc07fa3684e2a357854d0e4bb529d7af08128fab5def92e858b01e2dfe27552b3cfd03c25cff80c77490782cb0d657141537ce0da170c5315a42671bad21b472d2c6ecebf0deca0596b2af5111695b398143c4c717b1bebb7ecdffdb65c62a81d5af918cf6f0d58cbd655da5c82effdb54960ff63364658aace409f922f2671e66358953347a58481570d3c0edd9a9e0a52174873424555dc29ddf8b9a5594e1751004d016ca8570be745feb7ec6b0a47cb2cc79e63af02d06865af1ffe14576f562e536f7437cb70010b23ffe718649584d0507b4f63714be9047529e808aafb75de0441980c5035a980530c3e38886fe823c110e0b10f54a8cccbae674f1126abe51666a91d97814a6970a32d39ad5f76d83a3319d1865bd14fa2fae908edff19564b2f6d5632d9de0e7c0cd10471a0196629a5d61e99b09c4664f07a8320faba24164460e1fb4e263a4d2c8cc356f51a08189f95e2589db59ce086e884e30f5dd3e3902ef04d632fc530cc4479f8f166a3b8d6634c17c6684b2b1ee3a6c5b7eea07082fa4c2199d5279de8567161f48145f7de3af54e94f47ebf4c066ad4a57abcac1730896e23cad79aa8b5f8b57e4aca258fe438d6495649024f0e308b376744b5c662a6d1ee95c2bfdfff2197d486988608a2aba9efd1733342e704ec0c42c80ca78f4b6a4572106ead8947bcc8c01735d465d4c4b77ed1974cff9f3e28a04137b0144b52a7efbcd81192855b8c5f3b9ad29f195de871c4926d4a1aea5c176ebb4abc54bcbaf0563bdcc26bba15a58f9adf699d4e5d53c500d6f55aaff687dc70b78e0e3f762e240385cdd1521f13bf5c2d2ebcce37baf8b5118e905d15180be43f3d831c7c91ba7674ead6eaef5a18be999e09bd51f94156683f40afe48e87b1d1a77b02247268374ceef84bd1cbb8313c75d3819655e66fc6f8d522b94a518cf068e4c9f76d72ecd5910c8354f7d71bb194007723d16be13bf81c37961c4f67cfe9b853ca7d350806a6f1c758c47573fac9da52d46d6675e361f698d66588260358a4d918f59edc01488f30e8ac6ed7b5af8951aaa062771fd4dea41deca000c2eade0a404df79f19a2427905b1cde9fc72b0ada361dd9147a168e2fa1aa46304affa74a4e6cb3a68d3b9db3d248189a350a6735677869ca4783bd1ac7663545ce792b1dca963bca87db8578b52405837412154a84929027719f8f84c62a2933f452f0ea85131a970369b24df26211f74cbcf37f263ac32a22e128d80981151c435e4a24bda86b105873e3d8e660a8cc23e1698e8a146a5005f2054e9db911faa763fcbbc0205c86ddd23e47e91a76895bdf3f63192ce712ecf12c6d714cba02ad6b7c3810066ceac7da83c1ca30b34386e61e18797161fc774163e909b6252152b557bf6bc036f319dd7537f88b4358a241754aade0d866bf689c6749151dd9ebef34216107da9ae61a0ddeca5d3eba7ae18e4c9653d14865a645973e5546bb530b430039486bf4b420373355953677a5f0500acc856c816a874d831f3ed858e9c1e7d3e2a00f06b475f363a053e6b846945b6b53e8f0de71eb37a10d49252acf174a529d4298db602619e057e041044331ad64caadc7b737898a93849bcd1ddd96e9f81bc6d207dca8e6f1f187a0437101c8d9175d6ad37057a3fe6a7346500126370d06b8c1ec92aa651ea3b7cd17ec37912f542132d448c3024f53e8d6d47ea321e98914b0a7c394be700125276e155e7256f3c532c0fd5d1a10ac14401137a776be45ab08127d4b805f9c83506636f4bd64732f9875ff0bf5a69e0fd42935c062cbbb816107e9ec3ec6bd5688e4a9b414ce28fb04b31f0be7b5fc48b80d194ed333673a6b9a938a8260dbda2567726e1664fdf581fa5c24a0ac561909f5f2f03d204133b2a38548f56e1d750368dbd4dc1cf3dbe246384de6122e22e2e022202fc7b060ab5494bdd6a67f48383b21941f18d376fb4099998f7139dd6aa271573919b47466c16d0cad8580d00cbfbe55fcbe13a0efef82ecf1bec2592070cd366d9f721db3d9b48315ec9205aa262e35f2868c4e33b21a0f1dd016ca436160d6690116086294f17ac4c9e3f402dc04c940d509be40d54e10893d8e96a77eccd6ffe7a6b268d4a1a22a34d1d939fd67f525cb21b8d4c60a09a22470112fedfcaf8deed7e963597e885c8b099843db0a8bcb386dda43c9f9961da5e68b1582d985830e6bb5fc285a07c92c27c4a4c537983cf5d6e10c1dec23d657b5d612ef17650efa05711ef6c6f124bf152e856edd78b2a0f1f0a43c88f71e1f15f40102d9bde3a49a798fc85eb214e8a0f72cbd3b256d3b5180a832cd500359f97edc354cdb90466611ac6418ecc6e40c4f40df5eb56f5052e000346f7505e3fce4d5d18ee27e30114a96b17d02b1dac569fb06f4cb33b85f8352438b93d9d4116ac376a3d92d93ea66c69c5440945f74a43ee38cbc3a5c2dc35f2632d6ec78ef6479916d47f768b0fdf3715e402be01bb07b85e62bb1d8b466868a89e6a83a8f1bfaa8a2775453530e4122c9f16df2ef24f77b7a986ec2975ddda3678406e06d0ba7c525d6610e773c83d623979fe9cd23b00d67f9ce87f1cf2dabe327792bd225d9b3ee225fe9de7427f6c3651910958ffd13cde55eb05d90af8af11211745872a595e0ad787b6837055ff53b5881ffba8833a332ae57b13721815a47540549e03a9d38b6b89aa6a0071439a390c3414399cc49d0a27e33259696df06ad09fecf329718eae36f58219823d8f816a0764efde7542999aed9ece46319b876ec8219c4bc8a79750b6e87d02623e293a63b038c50656abf90098de7d1667f0569a36a5cb19f7f2baa481ea8f53570bb0d744bf5ec6716f07c0a00ee32d835a428ef30e3071c9b278fc19c4089c1fd1abda374c939dab7ef38083315b8ad9676fc40765a22c727640fb24635b86da0e5b9ee8faeaa1811c5152154195d1808354ad9da2a5ef80348786b0c482c7aa44d81f39781ac2e9e87616504ab229033de9bbd63ae5ae105b9f282ac1e82a3251e03b2955191efed4060db9455710c618f92f4f57f512e5eb8aed02d74d71bcb11c0ec2e9c4e299a8ca72c600954829c32ea7f67f7bd1e1e1f9a9844d9614cd8f5b78da4bc455638707a299050ccdab95ad4d2a91bd9f81288f09225871a358af4ae09ddee54edb7801bd51ee01350924555abd312590b106755314e86b4c6e4daf14fef4d4cc60e7f21827bb45d5612456206a2bc5059010ab52ba3ab568fe9a8e1ff303c4ad6a6ab38de4887af7107b9cd2408d83e154295cf57da5500f0beea88d89854d180389837902504e11ecb1f53270de9d5811ac4224c074463702917194b2c822b8149a4293c1f02c82a688b49a1eb55594927b0d051c06893720d4749e07a417403918c18c2becad3010a9badc01605b18c1e5e37b22c4f508af01ab719701eabc0a7489c5bdd0ad4e9e55a01bdfd295ad85128f288092325df61963020247e7816491842902553f9e4b05668a367639fc7cef98cc6afd0164891bdea9c9c25d386c084dfd13651c7ea16022db893f873e5072e599b55d627f513aa95bd8b1bea372c32893199219199753993a484ef18e8af7930c893b91c5206f254dbd28514a14ff14064365eb1449bfd23165e47cc87593a6a84134292963c87a0bbc8f3e0c12a3ea649bf499b87ec60845c44adea44009bdb273fc21d236ab7e01e0ddc267def96c6474096a8afe1a49f55a2da00a0f30a3fee65047db0d4da64ab1153a01b7c9f7943c0b8e30df564b149b7685a617388d5e2fe1564ab3733c899ab642e91da185d424122d84bf410f2e9e79064e70497869ef50fb9b9d8f463114c403296c93cdcef97415ce4c0a0c5a635d388547f47043c623f3abff46f9c14ab9b5f1c3357198c456d2019a69f448e52f532d8ed2dc474a96522ca1656f0a770f6626abb5384c437ee3857b212b3b88aad59e6b565d8d47b6b79543ad7e0716d3cab2907f512b9069d5c7de3785e068ce7b312d1cdab4765348d658fa6f539a5d8a7306517c8d37113868461bdad4b1f32a7919ad25eec686b1f8f84cea836856a94a07456a51ab56fc96a91be026c15dc5d9c07521a50582f99244e8750f9b6d575e83373dfc4e2605ab5812c920b9a643133ebb282cea0334f71e5437d98da1eddc0f50f36ee7cc78966c6aed662be312c8b1ea311f8ecbd349051c66e0229b54b499a77402f6a3a3f4149e629eb977c58ef0c0ff87f14c8a904ba219f297141efddad5617102021c61a5053ebae4d9c9e40123ca730744ca68a357114b0661da17092f2491aae12c8b9c8aa72d3327723554fa5f75c7a5be608e7a5674ff534e9e82607355abfed7b234eda1a6d6ab9ad3c35814553acb070dc85d0ceb806dcb0f69f71ceb8ce3878d708cc6b848e8319275b90b83a1a72790c117f7ccca65503c5ca178121a89eb47cbf575a7b7388b6143e8d551cf57c085590ad40f9ef56f84945457140875b882166d4a9d22e92a5779fc880595cdb47265f5ed1241bed76eeda69e00eb5d61b272bf792ca393bf73cf5b3a51646851fd5af9f3937981de9abfc75a7aee959e9e2eaebabb5dcd0316e0a7b13ec0a24e67e94cac4375acfccc01cc7496e80738c5d8f5fdc40381d05b8bda1e770541f9630ba1907cce783756c9803efd43f977c8903f59cddec74cd972bea9de860aa5c18db6e4b47e591b265d91ec7d476950bb3fdfd64c8022746c7366a060b451c0b502c9a9e3df5d74035bccfc9d16058f2ef1ec2f5c15c3f966850826cd7aef05814aa51a7918285702938a996dd0c643647b384d4f9bbfb85f70209d4bc1cb9a7b4100c31d220203b88d597acc1d6060e7b986c1b111f9d22a211640b5b8c0e4bb40482e09242ad3c80d6435d2445decffc44d03d8053028147f33ceab88dcab9b78592cf697893df46af231629a8c8b6436090e95ef88b66167b75c7b6fe7ee52edfe56fe2c97e78aaf11c57d9dde7d9c52627399313d27427df2885488164dbbd231b56761df171e81648c14f158de379333e83f9b7e1501e67ae5bdc9330f4d46fe320cb49d2b055d2a18ebbc4dcb008b9e41f1a72d54027cba7687e4419b658e4049b5726eb240e060cf599b58bc06966d5941c8ba904ff337ae8fbfe85fa838065b99e0a049a0b38d3bc5086095ee0d5a298d364eeddb1cd93fc380ae6764d2e8503201393b6284ad90ab557367dae61bd08b604d2bcf81979fd4a643b68764d4c387022799fc7be21083eedc7134f643312578f9fb2d2e6fb1598eca608ff3cf9a49ffd41ed1e525077a9b4f889692d4310515a4cf2c3b2379fd533fb12cd74ed248703ebd74bd544da6b8bfb83f97f39236b916760f5df44423479df36bc6c53c5d4f03c054ac0a85d9076444e85026ef7c4888c483b2c46c010350563f5381bc58b5af76f2698b0f52702a805f1a3cb9a7c5e423186f93532c686d54d9f39c0122c357dc5b01cf2b88b2eb8bc7e18576a30d46308c46075267bf043ad3aa4606f8ecdb15f860c69d4133c03e42c1775ee5ce4c748640e859a20502e97df08009733f5f1e93a8a8a959bacf20cd4b46ce47768cfb268248e00873d8e7e0ec1380948c087419910717c2a385fbe93b5e206d8106729c2b7e6e74896a472c953f9a2f80c82f2f285d1725c272ea735aa949244fc9f7005d2a43d23faac8e788dbe840436f21df1a5c0e11e16159ffeeeb6ecd8850d21ea0187c41cf27aec5783b2c379a04cb65a6c209337ecfcc5433d6df6ee600156b2043b2536eaf00aceb28ccd3a6b86ac0f73e8c9f407950221f1f77768339590766c967c617fc651e0ba92e2dd006d0818e1cd3df05a29d5cb5a5e5da07c69a3617f4bd035874718f4e7b437e20ed2904258405d2d3b1addd8f0c3e92507970281cff5b1618db7ad3a6405a868fa739c2969ea9864d8f1081d203b6628d50f6ceb2c26422fd5920974cb92dc8153227eb4e482bf12802fc626fba616b9cb30cf3f087ebec37f8033ab4bce2cd1e0c5e5886cbdf6fbff038784f9179ac2800608f0175a8ff5745361ba60d3835273e0d1eee2d1437e2f7f8fff57be2baf823d78bf19be36b1a485b84031c8075097e19a71e8ae80882dd92b507b67152011f2d3c737bda76db5d1d316f01efaf9e0ed0fa11738f5e8808e08adeca6ef235aad17838e0bd7cbf4b15c53ec793286025f6fff9fe46ec95637e1e095e5dbb8f8a115ca14baa15e373c5816d386c00acc88dd1a3e472e4692b1960d082ad5e8a062a953ae6d220529e4ca67f17df9bc69cc2903db8e41ee9d7ae41d63d56bc0dfe076790456f18bb160b7fce44df852d73d6067791eae69d6e9b06c0d8739433d988f0fc769f31e2c298b9ad0db0dfc0aff0a22f6b3c008d09c906b081c7131a886c5941c2d9e79c7db5303ec6e504c7b7e3cf24d28bfec4aa12247af47f3d5171d5d9dac0fec0387de709201f235138832da48a3432ed961ea72a140420a48a820c8676a9449b62e2cad85f63f64e779ae341898cb722d6b5242a1cbc49b43c43022c895d864a772881ac87423db7a94fff7df2d763957156e1b0dc2431f6545b9603ae4ab2838e0a5d7e42780ed6121e4548ff02959e8ac6581eb102060fc1bf5738c7321d4e5477cc73ca51388e1603e00fd6580b4064561c004a4796ce7c0f0d561e416a1a48ba26a5542456b4f46a38490c4cc5dc4f826fef82c8eeab2aee892b78dc7de1363c86b019d5d4817f067eb7a8722575ded07e5397b727081a1c00e90388dc9ba09c21fd16b23ff72a1fdaddb012e174579ea4290d4709511fe0572de5df6f1beba6054d3e8dddd03342e817ca82384b9c487db5ca88a4e1b73fdf500dcde5d47a419419212a025ed51b6e64cb18310994d6c36a95b7b8e1cdcfa4a27d917ac8f10247e40a03f56497894bc86cb3345863c7ff0dacc3f602c0275e46e4c58d126a59e171544622cdf587776645ce89df8007a086d9f1b786b7c50040e4bceab847c2d9fac05bea40a6848f6ffebee3fd053e30aa6803d0e9136b22639d1bca08785ae8fda927a81959ea3b13c84b7081afe73e1215c97bfee0458580d59453c853ccdab3447149d260a9f93f960aca9e5949f7a2ca6f7aeec4c8769a2f4738d79c632bcc2ea737ef4482cffd457f0658d4ca8874a7140ff6e76d9dc05616ca4ce82bd05b7402c3e18103f7e21b1db179a121a823043777d7ac698a8fda28be778df475629d4e64572b4ca5061656040ba3ba79cc3299c14aabe35baa2b457232c12d150a4e9e0d3b7a4fefea3e3815fe300a090e6c6be04e8fa511f7d9a65112d3a48e35fb97a03077500ca39f10dc249dfaa7ce67edd05501135aaf30cd2935eb06de6f204149e60d41099dc619a236b7d20634209c318138f3216a69a1c9770e4c3bc0999b33f23c2be1ac6cc98e1f48b4da194ca9106f257c8449dcbbdc525b7023261ba145fc4e616b1f0094559b7942176c7824f3969be8c09eba3fe4310ff76dd5ef39b018990db75217b3ed7577815e1b96ec5c271f1bb8d6ff53d859ea0c980335217e24324d4ac1fd5581b6483f199990c6dff014f0a6c7b46ffd0fdc1d035ab33d595930dad53607e5c8dc585e72aa45b8863fd60f0e78af06e43efed81b58131b6b27d4b4fbc55899a3031d56ec65d89c91a1060a27c1604690d718705a8e83f9457e7f9e6c1d0803e0fe7bf2e049fe9f8fd2464b9b249152ca94646205860574053e45755a29469c4cbd47d662f9567a29a59ebd3806eb9ab8f7d251278aab64431b924e4c8200b14aac6889946559966559965f7ef9e5975f3ecd975f7ef9e5975fbe17923165d08636b440acf811c9164869436bc3907c7d98ef67aa4aaee4743a9d4e65792a4fe5a93c95211b96655896362c4b1af35f9665f9e597effd7f59e2adafa0c39e96b021b640ca29eee28fe1644bb2a17b5d156c68c37074981a86a10d6d68c397ab34030c2349154e766fce7064dba8497cfed7a84d4eca904206bb94fdc514a394d20bf3b277af4ab9d9a3fb18dbae05c7fcf0eb303fdcd590922dfe8b81b2cf2ac8bf0b5444d3ba4e52fb730139ae6c67cf9bab0a5384385d40eb77398b4c8395bc3ce62ddc2bf71572104eee63c67ac4324692363732aca6871e3ae9c4c483003129119d084729c7711cb771383f080cfcd1673961ba143e7fd6e74a702cda86ff681adc4731c5077a0ffc89b6d1393c98a61a8073f5351318cd976841b37eb40d9f4247ac29dfe3f09e3db9f3e03931beb66aa7b40d1ad2144c01838ebc851df3cefd4ee5b40d6fa552ad9c0b7b8bd56a1b1ca6651bf66d4a350d7fae33a59c06d399985eb7ba065ef87c4c42071eb23c4aa93dd8ac1437e23ab57d380ab930f470348249c3075238bda0280f3dec74b84dcbb0e63167f4f0416524b9234a29a594524a299d18e7fcf9fc87a80ae35528346766df20d8a30898a04b8f7895af4d05640a2a910f2158562511f742784c2d51e76f673b140d8ad22d681628ea0485eae137fcf862b22ccb2e1a97c025a2a64b494b391d3a0c8d6a5d0b0fdadfd741cb287d8c7eefc0ec077af8eb073ebdd8fe3862c6d829a0e60a35572857425128cce650da36f8b9cea6c53eadb97ef02b07ca3f1c4551144551144551144551d4bda19110c2d0462770220bd4a3380c3a800043eebf66cb081530c678bb19085317f1da22d9f5393add17395618c3b21a343964e4755dd73499ae1d95da1db9acd4e693bfbd817df695ce15ad533401840483115a26922a884832917600294b20330048e43967dc073d938934994c26934966fb81c1efee340a72fab6ab967620d6e1f9f953dad54c8d408de3691545892a0999836a728de3d829cf7d918c580a96923d675b1ea198353899550c804963219988ef68d2c4a2f965d883e1513c67005a64fa9d8f233e4670a6625471f538f2e0466c15c2e73bda862b691ade4614610a57620425aa2528811c57230e57e24a708cd738625ca372857d52366181a1cab1a9944629f574321319ec548c4aff1472a5c9b142ad344dd33c1d4f87b1bdae9661d85e375585154d581bb76d1cdeb86de3f0c66d1b87b7546adb36ef25b4790c1bd0cb5ace89dc14881e33f84fc76b0ba2584a3d218212726a624a8245b1568cf1171983583948a886babc94fcda637d755d0dc5ba0ed234b80e420a1264073a08d28320a828c49448ae3872ce5967d5461a83c5b410af61ced42fb848824344c6a1f8ca552a8ce17f956a6555f831ecf157ac93a12efecd64013e84593d0a93cf875059b6e322759d7380ab542a95b52fab8d8806843585aa6e0200838cdd8729ba6e7713864c43eee59c73d79b5a2f16dcebe14904217e3deddbddb79b826677d3a7d76317c83eb6f4de7befe6850c7eea67738cfd3f14b04891bd2f640a81ac83c5f5ae8b8b32e79cd66698bd40c8321b17727d50a60273e5f3b7995d4c61b6ecf0813cec1235c3de5a6b6d6685ec9915727337441081ee8af495d1227fdb9b9a1f993e58e307ac0f9c2b1afcf3214992bcf7254496aebeae797154a4722453cdf615b95ab739b8901ebc5f6b9cf93db6eceb532f5d7fbb52069adb83738b1c201ea20e39508b38ec8b21438e5c6ee370d4dc9426ea9b3d67164eaaf03172a2078d691199fbcbe15199938cfa9426fea02e8c658a1013dc6863e17ae374fc9024cbb4d30fee614964ee734b877bfe3fb8e7bf83a344d091e70fc2f3f9c10683e32ce0f9dcd22a2a313a1ff957de07d7e5ce07d739c863f437b017f58ac6ac742ddac7985ad72201ee57de022a1fa30bc2a3d279ae9ba20e688a3ca029ea96c3b4683fc4a7817f611886611a913a52977aea247d726fac25ed63b8df3aedb5ecbb3522d5544b602d655ced50cb6853ac9a6a69eb8a700fd6d2a804aa715243b4711c4712d7d295611a892d79d552b6d512564b9ab6615ab66d9bb665dbb665188661d80f2e9381190c06ff055367b2a9c5bc625ad1812ec568b46dde8bbbd490c18126071ca81986d4596bd79e329ece26e3b99bcdba2b32fdb985429a0efed3fbb7d66b1c845a6bad1d155e593aacdd42097b10dc6a6152eb6412932426afebbaae2773c64a53355902164d7247c3224f56aba80da60daec89ce93cd7f512260d876927d3f3f7c6a2499324258720ddbb45b65ae410414c1b4d360de736ad5bd98f16d96a915ce7d2c1c241692b8c1285c17a7466bcd036b6566bed5cabd4225b64a9d52a795a2d4f89eb783cad96c78343c7699082b5d68a22c639ff6b1fcd8de7a8a190e7e5bef7da720b916ba9c1307cc21fc6e00cb75dc015007cce8217e459679d2dfdf88710cdcf067bfc36d8e3164c9ba29aadc51275c1c0206a218af7be84481d23cc39efbc5bb4966d91e99555f22c45d0319e0c2928c20b9fff006cd04ff17ded9b86c5b6cec7111f5b37b51d884ba6a0b4b71c8ef97518688b4ceb4f6e87ecc33bf4e31bb82ba239e77d5eeeb82ead7c42a7d3e9e42cc34a0c337c5e064b0c510534452b20950c6a510cdd8f23d8b3fc87a5e333c8685106b98805f42023842812e3697c72376a10f9597e05d4b2a2f247f011ed8710cd009aa24f86719b8e180ed01a484706c845193445db16e33d5088ca5017acab9d9597e163f818cf926198eb1ccc029a2dd218191eb33c986374169dc7d1438dcd8d0f397ed001844aee782787ec743a9dd99d4ea7d3c99f19c3097905bf4a1325a81edab74c974c6d24c98925460c31805838cee3a1c901877b3dd4d8b877d33fe800c2bdc65ea094524a29a594d29e349c93e5edd7183f6bf8a60058e0a35a648a669195b7b1a295ce8710a2958f010ab1688a3416509f20758396c89770210c51a4f9114c9c208a348a8223986089b47a04a9092d91664f80d30529d2ee14486a8012691793205c4125d230145054220d2b021454a148cb84ec201469dac602ea2751842b91b66d2ca036c2881ba4441ab7b180ba0826544889b44eee84c0f3d5074d26478c1889b4012cc94f54bee24c1bfea4690871184c9c3397e7b36a25cb790b3b4f2912d3e355b5c49c73deaeb6e68c2fe68c279f4a075622a52ac4fd49dba8389346eec0ca8433e173fb2bee7d6c2892413b6ab9401a4259d1987ca3380c062fcb8e62bc2562ce99edc5061a3a7634b16ca29e8ec807da519de29eab3a1d8b4bf2d90e94d9280d69d8aa3046476d10af87e1741ad2b08661188634b4f6e596d955be18eff5ec23ce0ec018a6d9bdb53692318f5266cccffe721ce013350b8f34d4c54e549da84a1b06398274a152428ebb5add253587aa0b25b0c6d5683bc085942f56f77a09d5f03c29c158ad30cef93fc7531ca190e7652e2efe8f13f185141c0018e48f98c15ead1ca673accd716f6e3169f48a0aab1386e9c8844194e3c175e05f57dd884bbe21efb460ce894321defa8155b9bac77814dfb0cd5952664c06006cafac7316f690738693e9e2bff2e273af24968f72fe7c7c544953e54bc8988b9e9488d9b91467b9776d6dc14d0dc3bf303d475123a68bbf14244aa22a70161593b88f95847125a9703e82290916c5b6d65a6e7bae7beae2e07f18ee66c2b611ad1e6dc3a604d75eab65afaa3db40e773219c6183f6e1b3a7a4c7c84c76ed6a6a6ea7a11258aa2288aa11a353659d45ae76ceca2fa824c5f730fab9cd18b0cce32026ee4ebef20d41b5399c1df8ee3388ee3bda1910bafebbae6e4ba0f253f9e4fae992e2e8009865c43155ef3e347f6d8ffd87ad42175116f6ac81a92478fa68bff689251c85f230ab98507017cfdb4fb40ff7f5dcb0eff5d8fb300041924d1852d82a08552047687795c2928a145175f37a7838c530627596373e303d7d1e2aa21a37531e7acb356ecf3c7d35a7b85464411a191a99a53b5aa610d925347505a1508ebaa54dddd1da2636fdb5328582ba20926910f219a481729d191d9796780e763541ea4513e5a2ad1122d8d4a9a66b79e344e04db69d756b56dabda76752ad59c69fab967ebfcf643883815ee8710691d100da94b8b4dfecee78e862d990a25659fb3ced3d11235512a326847d9db133dd9d169644fa3d3a87b85655bd6cd3963b37fb9fb58afb88d82f4823aaaac7553d5c861ee4a4557aa95ea5af14156a9ee6d194f5cd7cde5836a03d7755d97733756e4f999f63df86fa0ff5cef85643006d1e4e01e8e1e40a522c66661f39bd5d92ecf59af8b5bde139ff4095bdec4a1987ecac950fc496a625fd2232715e0d3beb62dd01b8dba4755f491f8d51a02716f840251263455494dc345da8d843811235ae7237519cd1944883ef2d168f4987a4569d6a2c874a6711e001dd3316811fc64568b22bb1645ee0ffc7c9f6cfbcc19ef743a38e2e7b3849a2a52f173823cb96e063d3a4b02eb01d7389c0e2bc8af850cce164e0cdac59190728044132d22c960e8a3223645418aa2288a62ad9d1f4c1ba0c8f33b5a9669dfb1d66e3ee6143e602214f9b85e080f293a72fb7998f6825a76b83f5da5bad7407ee0c7ba2258868b4075f48218d4757e1d9b0ef795abe97c77b8ac6e71f30495fdd168341addfb121a6952e8a9892909a694528a67eba3df4adc05479c2871a2c497cf3452d20ca5826b65328daa9c24a4911494131393c9f484c94d3e254ac95af156cbd432511c984c485a2d8bb24b9a4c319551587346e5e20a5df8dc3e685354455d4ca696a9656ab54c36c8df72fdfcaed4d5c42f158d59b99e78a916148fe9b28a19e3a4542a954a792e219fd4674fd4c55b4e52d99469cea04adc85e2c0549a4a53d932b5544b98584c399b4ca4c96432994cd70a0c20b40199265babaad86d0cc3b02539866f080df15f7f6d13a9a1e44dc6f2f939038446413748327d709236ee79dfc74fe96dadc66168cc0f3537b4cb51ae7a24ee28cbb2eceeeed6b29a39a736b5d63410f7f5c7075bde344dd3b4a7716d730fc7d542d74a69571965c6d7b5d61e31abfdda3d8d5f208caf8b3a6a9cac3975ec1089f0002214d262e9506121d77b6f8dc145fe0ffcd0f4efc075bf7ecdbd5173df723740e045188d829e73ceee401503584b336248dc7b2fbeeebdf7d2eb567bafb5b8de8de534978c4c4a46ec88030799d2c8ac7d77c39165a426c284c9e19ef5c04c5d92df3bfa7e942cfe74b807f381e9f9f370ef0324989e5b92ed20006814a0a8708232423a31b15fe9052253831ee10371f83a1a2c0f6f71407f1ef26bd9c1437efd1ef2ebaebf1607f4d7b2c34f2490beeeecf7a41225914824128944ba3744ea187177afdd3d8634a626c9c964c4f675f12b810411a2dd6ab28cb465abbf6f4eeedf98e47104e2030022b93ef83a34c78300be3a031872f6f87176cf823a3e903e109faf3e8d8fa036b9974b2cd94734943503b5d4faf9d86cdf22feb40de4b5d85246c6fbe914db2abb2bc5ad467bb04b353fb00efbabcbba161bfc6204feebd1bd5a06711797d265d865d865d865d865f8a2a2827d9354f6aac3322ccbb22c4b6b5fca184ca04e27146b0a9395125594d493d309632ce5ca329f33442efc099281c4b4f8449c928373c8669c7d76b91b7d5a32636a6af83e594c27a793a8042b419d5a6082214af04dd2de93b34e18630cabb141dd40ca1778d049e183dab60ddbb0ee31fe1504e6fe911a615b66b047d5da17952f68d6da69a7c51d1b5bd3384204492484d664145d3f2f900f7e4377b70f5b6be0e694c1900acc21b7f75e5c20bd7365ec7018eb27db699526398d27c8f56ac2ca8a528a1208655fc103d58884095648018491342a41c2c1109c71f45e42b4c385765d2fb9862d642b10d7556bbd735a4f167d5517c624d684d32a8a1255123207d5e48ea3aa474a2bbd51a96846158db9c944594959b8062bf2a42e2fc83a8fba786800a50cf6489be8aa010e64e0a655f6e80a3d5aad3b8ee3385e17e785cbc0b6dee762528fc6e76f593e9a61b08690b135c3bec4f45cc084a906a37164afeb3611482881d3a3ab464db9412142134f89d290bbd3a0b134e744067b341aed20f7e0e19edf7882f60ba533d4d3c57638c820a6251d6cdbb6b57a6cdbb66d1dcffbcf4a6470b63e70b2b2fd56aba58282eadce4a03a76c86053065b01711c4d0e387aa8b1b9f121c70f9ece6a73ec8566ad9d765ed8cf8bf1cda670041654221f42d0a0c24a1465ef43081a56c84288487b2166167250240aa2ad6fb801c4e1f3cfe14f83835540a72b420efd10419d3316490f69daadea97698c942fb81ba150180a3b0c851348c04d08019309d38a9950088970088e1234eebd84b073a75a6f46a50b46f7de1fe4fc00ca144d9053349102711f3781918c93e8fa16283214597c6837eeeea57a363e3428a24b850fc0f8c0a9f201111d50aedbc950971c2e0d122a3e70b27a3055d5da9266e4de712ccb1d9f4ff9293f234ea271eebdf7ca9052d3552c91b14506272902df8164361473890c2394423bc4aa6d35ddddf1a9187bf083e149624badb5f45a0ce49f18a3753cdcc5ffab3b505fcdb99da3c0052600030d683b546050426b5c8d754790107c11da71af2b546305061a8b00df9c12c5dd2f56b7680c0de70c28c6d7a45a0330258bd9635bafebba2e989c6f5c1de8e3bb78f8879f86ee91420a84843b0a7d5c3a4ce91e48451cdbcf4e87fbad0b627b6e7bae1b421404f79d0c743e3f7d95ce67117e5af2803a201ca2f6da6f8f3d2b88edb5b7400bee2ca0fdd65151744ca7d0162d411a8496301948e4e11fedeffa9a6538e6873b1ede3474984ab32830bfe811cd4a352bc5eae80f2125d13d275e16de161e0ed6c562b1582c16c65e8e62db5a6a69cb58eb323273a63ffc7692572783657e166152978f0a191742768cfd6554f6de1a342a5582d184c5643585848275a94bd376bd2297ba346738b144c74fcba7a2fd8794431f7dca074d29b207f1cdaec8a539d3ff83bbb80fee6203039386ff8c06e60c77ee060ff7ae07bb74030cec9b9c0e334aa67d373bae86325513bb8175ad2a92c12ea14aa55229c707f740aa9b39c33327d5cea6811f43a1b2ac860c0e3452604c92d9c74c4336b96d5c6419b68d66ce601f27e348c6e29250f03fee36f206c69d4291ddc6fd9cdd3daebfd129cd094992645ed180a13a94a8c5c0d62776d0597d630c04cfd71d0e3232d78533a4858316929648e2e93c264a85802924896173860c0ea4e6311821b5bb975d204e51d92d2832385b94bed8da897da23f421f6d3320cd39ebac5a5649b4da11574b29a55893b06fd29ce990c6ef0fac94c126913e0f88b130580eb30a50c06c8a0893c6942839547cce240559cbb08d524924128944b2f6a563857befbc531445ea7934a48d628be258924183eca1b73c9bf8b1ff74596eac2124113853b7033ff5ebae676022b78c26641f0d046708a70cb7484b5ad2520cdd7075a077832dcb39430cb2add124947a61e2a16c5032039939ef17e2de776df45b88d77879b1c1061a3eb16c510740684d42b69f13294d454585eb171d667ef4c39cc8ff953cc0f96cb0fff8b3b7d1402dfdddca402dddd574495dfc4b20ccdba1bbea5e0b71af4527f93ff1092a7ca08fa6286f5996652903671cc7d32a8a1255123207d5641ce99c18ff77163295a9e99691e971cefcf56559d6cf910cf6785d374a669fcaa8840e7a64c968040008405000831500001800068442a16040302094cdc37a14000d577a3e805e401c48644916c46008a2903186190288018000019299425500c62fcfd202af25a3cede476926b63f2a54c0fc9206d818fc040159cf0a4f6aefc8f07baa91e60ed749d43d2b2075d1742bcd3bb80fa7945c6b03d62f00a582e2d7e383ff660afdfb19659cc6015385c8a50af437bcd7837524f7e494b6b04eac50e64b6d2bfa44c81c8133c6b6b6e73ced05c1a6c24ed55d67c4e793a6a61b9a093193f59769678b8a9688a82c81b1de893b294755e589a146de29e630e9526c64172833fec060d2124d7fa25cf39990a45895a744f0967917d7c338afacc4d92b9f99e2f1427963fb6d07bbcace34e5bdacc0d7fa2d28aa0865e6ecdeb93f5f49cd395c52ea42f19c6a8e88b23f8427b54f294d5953230599815eff254d31dc54b89aec8180f0f077c75465fd946cec4cf1462a94c23935156412b78c13bc3b0c5dceab9ada90ac8ab60db5aefa194ea07c7797fe8537843952fd2c2fcfa626275d37e31da9e4ccf61327d44dabe18340429de298001def786b431a7ce3484191777928e9314ced8158c3ea8e836b83a3ac51886c4e8d470523b04b12c0e8dc2eeecde12a9cc60f7b6ebff74d1b80f0527e7c2677df060728f3455f7a41ec225d68c8fd8579603fa9d283b0b1c37a7e5568a19c1b3586e2830b848d02e99c4dddaca53fc844f1a25075c611859fc4e19206d7511e6e3c024201e88d02ca61076ff5210056b04017c2c22a71ee401e494bd4f7f985fefd0eaa0e459f1b64a5c723c562ea632c58793adabfded5ef5542a57da5716045e64bec5801589356b54dd105eae52abd44ac0d454f65a70cfcdc7553f8844295d833232334965459bcb2bb59dc359b221cc1e6541b33ba8bdd2994ec0e1b34f1aef368c5baf83d472599f6467bc44adc24ae290a6d0b8a8ac76bf3d42a0fc9f668b18bc958f481124b044e07f00618073b1925e58c15c162a9b830bd28f0e61c41b2629abac63472c652f087b0676e3b2d85f830ffd62ac5e22d87846f368b9a357c2249ce95e10fb9080af3a98176a217ff4d3d00a6e4bbc6cb81877c78e0356ccfb560260c3eac23fa2d9664fd88a11e08fdedd7cb6ec92ccd8b522a1d41008cc3c232bb64545679de519890597285d53b2671ffdbcb0dea41897c74d49caf1341b38640217cdb816821984cd168191389176c94cfeb9e17e068949687149e541f57a3f69ca67466f159c142a3af050b1549b8978345f8029501125fd07cc395a18741557f54496a191439f69def98e4ebd420bd64219404b58f3c91af362336cffa5c9eb0e42640bec22829b772c9eede40fd4903d2869df7778f7ecedd5774f4b100e746776a2fdde95ca10a3feb74a75ed01bccbd4516c332926999679fa8951155178a92b9c692a0ff1e3bb012689f538ffd11e70539114f90a13b0da116f6e3c87c8860ea453c91c4518a98921d5c6162d4972b74900ae45fcd8753cc61c5370c9d9e11ded5ad755fe3d0732817759f78221afb637ec7c57e3993e30fd67becbf4ae2db726811d0ddede8ec02734a435f2b192e4c8217c0ec681c956644890b25453d4b6bb720b1302676c43213334d24ad2b627409b327d1bec1ee3f06fcf0cf2811089ca9eb4326473277dc27d2523161c5617e954bca0df6c2a9654d1c3c4ac6719087917a382dc680231256c87b822c5a9e22c8c20d0035e542af3649632d6a533983ce8842a5e13b6482689a6641792c004890c1f19842737664dcdc43b4dc79fe6452dad542b3c48a7ddbf4fd26ec1b3b4be258c89f982de888620b28d7aefb09c469da0dda58e9282b58092d48f7e06fb59753701b436c87777b513159b43ce6aa785751a5b7a13fda5703f485c159a418ef0c1cb98b569e23eb32ad5bd151c5a4f75409c3e966de62d24c66c405825a5caf780d4868827bbb2efe6ef83e3543fada09ee8acd91b92a9b0a426799ed9a2b40bab7a9abc3c5db38cf3fe312c2424237a6ed5cd106d07b71e64f297a4626c30f4afbe78e2325258c0087b639dc9683ef76edc4dde00a1a83b73fcea0e18651830b82d60940785535eb302f5506faa736f3df332b86579a9a462e8880934aefc18270b8aa317628cbd245e60eadf848b366b064eceb7d199d023bf3f16100a7b4247af47512ca48b29a84359047501d7014628363ab2d0c0942d7f851b8cfc5375d3a63dad817a3b8aea4733952284530a9b16fab7827aa40cb3a437d74f5925b64dc5c9ea6ebba9a5c47bc79474b1cbaac42e3d8e96c8eac84225f706d16e113eed66a1b265f84ee753c6521a063f4b09ca749bb03cf7caa3a76c7f69e8b1f1fcfb99dcedbb67f5d3ad68d2390b39759ea25be59ba325308a46b3023a49c08630957c34f3ae33cb446b0b5c9b5e9526978bf55862dcc9afef56b072f2ead393efa23f8971793aca9c6213419acf51fad0cb2b6c17993ac0a27d94827d9e38e3a8725b527595ca7014cc4496c734fe964eddba4eec1b5bc25595712997d68405793ecb08b2cbaaf88c396dc02201d1baad3daa4ceaf59775714fa3cbd06802c95878d0f3431633bf964fe213e9cf56e1cbea79aff2313b56781c3b8dbf7e13aaa0849bfba71b82643208a9f129918a03d868e86987b589aa90fcfec0b7c3c4e4bb58691cb1b64593e2d5d923d4ad3175c5cc0f5173beb928e59f8bb6840abb9f8eafc30ed483b8fdd9d245afff0c2ae7cefa90b6d35de87e1e1ee29d862cd3885499143fb27d970e85722c5c52cbb3ebf78ad6d0e58a9cc5f238cb86d06ddc69ee718b9286c15cb7108c70aba2b3e70a0a23568e62a0943c745060c106e314443933b9a5e18adcfb1ad909891b11eb136071dc8c5507267982866d613a0ad7388ab6c2bc329d5ed826cfc012a76f19c9a3988218e8294067e7c5dbed236ceeb30619a490a95906d44546fb7fd59222729df91a7a510eebbdd71ac0972b124012f970c39b4159582f8f0850e028d6fb234f1244a00d7d4bc171e21ce81ca925d2e2afbd23d4a56eb6a5023d7193fb1546da43da033abc5fb0f2f2bc3f54290fa6d20c8bf6047381407fad8c58c7a92af6d5b0514ae1e97e74670e750a1d0d976830681fcc6e292f87305515ba69d0a87b0f01dd8436d5a65b0d7dddd1c1a4353ac00f33e38446398d9f5744f1deaeeb4e2e164462740eb0d351137a8b3e5d63c9362a538e21928fed3076071d05c96d070ceac4705076eed0a1f266c64a22826c8cd4769cee50b3a53303fc4a5bbd4e210c0d2645487d0fcbd224d63d8a5eb6be5ea590c1893c18a1f5a3c2c68d287343f743bd6d904ea00c0804893ecf34395237e5372b59889ba0c9d1fa2e302d13c2e94a021aa63df3faa3e80bf1eba8f27120e25845ae8358c62998a84a232c5b43d11a4f275bf5aea2ec8c1bab9842ea2614ec2ee030530a52ba9101eab409698f939c7e1206d1aa3199288e860906bf12451fb6a486c9a6c6bbf9bd75fc25246bb6136bbcf4719ebd4212226e7b97ec531c84c31f66904e631171ed4d55c2d0380c682eb5f7b8a837f3b0ccc8dca8ee36381b7f5cc9267ddc4051203afcde2315f9d4f4612538025cee70a924a19ca6620035decde70fbf2ccede068b1ddb27b9edb09e66d03ed5aece4938ac49a8edee848260b224bfd6e7962d97ee60f805d230c8d1dd279911c49c01ba0f7a87b04075784ed76de05730e121c45a9043a483b9a235152f0964b3a2878527cb45ebce69eac7dbb2ad2021d8d3e9178189e9f73a0b671b28a2384421a7aaad69ed778b30e8e077e63a7173e756f25240fbe40ad1e69156ef56843d75efa0742a11efea63ae4d076295fbe6fa481a0417f63b7b1e5eed1b5628f40e3c78686b2a31587c1be4a591bfa28626150f583d0bde714e8ab8c753552a4f6ab55f77010a542cba9d000980deb78a603befa003f74ba29b677d53a72da7eff92310c0428693d5ee7fbe99b32f5d4b6fe01c78a5563afef4336d82e1e2214e2db9389226a958270abe5b7264cf60315f5925058e87bef5637502b2313265f7a7d268c1bb5ada9008fd6c01da67c69980ee4761022d52020a4e2eea3a905fc41783f12068291f85803b834847ab62adc49313ed6f52c87ae37eb8f5204fdb9699cbcd6887dba04511866690ac16199ab8cc8c7b0827dd10608367e664cd177b3758d2d1d3a2bb8e7ae8e62175da57d71b007a244438b459b49ebd2aa139882d373b52acb6852b1bf4fe480a6e351d3a6847ecc255e889ab30701322702ac1f31cbfaa16fdf60526665a88cd1ba9414600720906d97969b2ec9cc8dbea16bb005cdd17ffaa4b2eca181e279fabd82e3734013b7c862760ce382162675d95269bc90612924f1fab6e883ac02697a89a58d4e89f567a4373ebd3bd0bbd279d5d20bde63ff24dc10cb2fe235f7a5c3735f09c3529571ca80b6c9dd9b078fa726bf31555992765c38c5c6480a32da180196656575e9bc1044b9758bce811411fcf7d2f79b2632ba4bb46e4f9c1a949e19f07684770459bc3546a743fc4daed6874e254238b7ec78120514ad4e40858343c960ac18ba84ba168b793da5daa2748615689ed5e1f8d6b3a669b61bb2c0755e472892b60e97f16e0e08557544c43e12ebeff854cdf4a867343e8c32c570b8549879b5f3e323d5efce881b44d5298a23f8d1ad7e026c2df0c58fdbad2a1d1f57286163fd8faf0414fbd9f38be581b686316684b50c2a5fa6a54e2b41462f21a7d503f3aac04aac67c142060662c32aa1273d0dc0f8fb4499947ea15c2d629b125694007e3aabaaad95c1c475def01edc2243c1529e16f86c6bee1cbbcb233b38414f8f800c2ed772f81ea9a89a67405e8db86dce67ac1e266818a31a1dae67ae4f0053697d01f3190302d1de03d40a878cd722ffaaa693647f36581f2b4427c7070a17948e194be98e3eee1b62663f5c03944cd88462c01711e99d943610a93f2351147d0e02f2633a9074efd3295c7f0fb9b3c6c1994c911950e2c2e8170e98f0c85656dcbf80bcda19af36be7951e1d634b7c154a5861e3df779586ad4ac54c34c42e00323b66e1c3f6ce7ae6688a4b7aea13d433bbc017a036ec43ceb13e264e04141a93ddb719f9b3c41cce03eccdadfb9e8ba4ab95dfbd3712054ee8c846cab5f936aab94c202c0a2949f90c9bbb9937ddca230fbdfb10a35fd5b6082487f18eadaa173926a8324017ccf81574eaad92f8ddc70d4585b75e34e82c643d70dae5a300e26ab120bebb5a83c12917324849b9b8f1c5bdf154af4ac99435cb445eb02128417149b91c116081bda59aaf18140ef2bc55207ae028835fa038ca06210bbfb11ac43c50a7657c687a24508b74ed3a693f1a174261006d245692616a5fa3618ef21138a308bc0b946efdd1d8fda64d15e9256b637ad0ef58f0bd7e7a0982f7ef138555a04b57c695924fbc242f4c9acb15afa8416d5284f21424517312199d119dde35c73bd8625e7a54d7d266eeedbadf38b837c9fee88fda35690429069b43fea9282e84d47117a465160878ac87ac67df5bbfa8345a3f86fee172bfff0c0a2184e9914a09b02dc3d5e5f9aca70c70c4db170e68cfa030975008de8a28e2e9b124792d0606fcce338d5e11dc1121afcb516011f4167a9f56430654665c78ce470fa902e53ae49807a477eb9e6fb4e03beea5c03eaa5423744e0ac17d1abc548ce8989854726e764ac4b1c109c490064d77c6ab5d3f9302370a9143a13824f53e13288f9d5b1da91cef3031d3074afd2dbb3cf4a6d7e9c13bae16a0e108297d07e69e248354e6d527f76d9a617475cb14085ac564085c80276dc57d4b6a41031a3feab429dc45e61b3d19abc7582622174e7f81d6337aa97ca672a64d5562679c80d9dccfcb8abb6397cd7f8527c7fbeb5af40ae8e64b4a278b23dfcd0bbb6030ae95940ed9d30f21281fb21abed9ee79ef14c78dceda006d7b6100514d9da46ca952809d4d42f8ae722c9dcbec8f9365eaf22820ac3b907dd7ccff00b164bb74fc3fb8e26ce70e49d8fbd5289cbc4e3198515d2e80ec75eb1f728a6cee7a557ac117f0cd8f189c55134ffe12cd95da9976b9dc750c1b48cbb805f6e6a0e8e928d4cb407eb2da462aa9deb1c0ea86a0a5fbdf9528b5af05241d8519c745ebf80d00271df256a2969e7c6a0be9c8ee8b8bba52ae4f9b12b2c1f7e1f6c6cce1241beec981d945d15d3557a61078c11cf3f229e81f670ab09f7aad3bbc055fb5d2d3d16912d8ab7013d1db96cfcea00e5d10f5c5201aea9dd38d4823f563839eb0e60c862e46d7f228f75acde2270c01685e8994854fe83ee3fbfe42350f4bec63245bdddc83de2640a841670c1e67965d181850347ce1118bc8e69f630e7036f374b6f382e7a6f5d065098bc505d3bf725c4128a4ef7e2a06facb1878d8d2db970ba5d807040a4a4e7d5ebfaf993092dc170719ebfe63cea2f025a64dba471b110192343732696ddef6f38e5fa7e8eac7115758fb971745998cf4e0736073a719a537b3e16d89e999ee0f0f244052adff6fdf2cb6a84b37b71ced93c9915bcaa99f23b01f674cea1600da4f57ed62664d4f120e8da4a1843612b108688b5938086ef15b7e460a15bbc0978e60c7a087725c212cdbb0a062b5d93e5d12792641c4f3bbcc128c8e6ed5ccc0851778ba5861aa36a35bc8fbc4caf891a2fbba244a7d76994c7e7fd1f2cf449613c71b72f16ba0029fb0191e93b45261e64a74832ae3c1ffd1982e5ecb7157024bafd75c1e5812ddc30591b09fd2e72e95fcf45b060c5a2ce914234cb65d1acf974629f98f274ed0903602a73a6391f4f6bf702b8cbd9a18a4ac92b075260403941e4fd136500848f702375294b3b47ef6e78e0499b33e4deb9cb658714d2219cbb93f422d78fa87f17553eba3224871548bf275b646056b6514009fb8a6032fc0e9409750f177df7f303987bdd75cccbab3789b56c794ec7f85e6fb232c4de00a4cd6e03d8ea308b25dc3dee58fa5762708185c82bf88278b96d8e305c9453c5b830103dcee14fd87d1f76da413cb7a8cd30f2e878fa02eae90bac34967f7120a7379d0e0f528db0382a694bfeec64f772e546346ff0170137718ec7d2a33bb4acf155a03f18eac426612784d1ef466f4a258081482589ad54204e5997f3e92c2c1b08190ac78fd80aff472a37ba9731cf50f6c9f56afe1109ad1af84d10bf5ce63ff9c609860912d3b6c06ee193d855de9ef3b41049b757f5ab942cdc0df858e16139267780795e100e04503cf320a1fe06e3a451719a441e40cb9d0e78dad4095f62094a27b7b437232895bc338f5ba0b4938f4cdc406942722940c851e5cfdfc4b93691bd718fd4eaddb71d050fb1c37cce18dc3617782509c7175bd3625fd4b0d9e89606eb7fb2b00a0ed54839804260142eb72a4477fa1c331734e13798affb63729d209edbf4a50c4ca900a98bb4a0f358291ab785632966ba14b57b92ad73e04fcb49e963d07fa266dd8a050cb1d6a95eaa7c18a8c225502e5cf8d4bcccf453f5998aa177e5a5a53130ebfce7c7d7e76ee4c6668412a52a044d6fc987dcc133df96880185254081c738184688e7dfa69fade9376b03d5929143d3e480eb9d3d79c42865384e3f24eca2294d5a8dd6947442cd3ee8c2400cf18127261846273c3362956c65b11a2ad147e658006d611c68fd564d557e73e988ed819ad84c9b5454455adb63458d31bb7d121ecbde3e5e98476d89485bf05aea48ac27112c4c6e1dc68435c69467617ef027f76b7f65ea0cbb34b5c44ca0d8096aeae18832b541f515cb59bb64f6a08f7d8b69314824368fd2f081db48c7ef890c3b7799afa9d2c18201ab1b2202f2e42dc8f672e13f0c9a2be755776c3772181490b98ebe09baaca3d6f4b3a64e93c74803dd2084e34369709fb7f5949c739727af81c1707ff4cdb8dadfc8c00814ae121090c48a9af2bc882e73eb046c1e26b042c46dc3143ad20a78110a0704374546e3884b8640a5b06b57ae60e9600b574d4838281571522703b89a54526930c68a26c3c23f53946535c1d93cb7dc2e21bc772fdb4ab067aa14da4b2719be6416b92c707a27622c55e204b34085a743f77148d6a88972d6c7c3d7b4ba2600a1f59f2b959927ced9917331e3b8e5cf5fb76bf1b2cb3108bee4ff0d0a7d01a882d87e30140c61af2d3212c971f7ce678084e8eef547e0bc65ca54431a0534cff6a4826982847f2b6a8662669b9e48064c6a7e7ae0cc52ae6655518ba5765a7d2c57f4a7c3850dbdb2e5b8f657820f72dc215e34dd75d49c42454afa42b118ba87e195d562e56c346d57d4c2da3f5b094fd492da6b96b41737a2e632500f8d0f67f53414132b3bbf1f17b861de0dbad2b0f1299f402e538ac08b200b901d054222e08f4828b6e9062094cb11f3578de02b4a15db227bd9a111416762043725c2d7a533a518608a0a00ed3608a1cef5b5b0cada9dd7f4474236a6561362710bf3350565a1d7dcef49c17775e161c3a720fdadeb4f45696ab530aad3fd4e190227d0cab95f0ef8553b98f6875b514696f119c0a18c7083336aa63912d980b351313ecc3f66c27a4e61462ee23a0a7303be455d81a6b5140fafcc1a71acb192b30a80b3dbb29d737b67a2238e9c7d8fe553028ebc9726f6391c81a88f33a83dc9e372dae6cfd756ac34336d1cec50485f887843086f90d11b187d6fe9e68062a59a86e14f646e01156911e652cf54cce7ec15d98bcb68b0402c29ef3f8b2ae24669698192896d29aea2beaed1fff9c63aab186ebd93b4557db92ba813bdc8edddcbec07112583da2333f62e6bb075bc12c88f7c87366230b7ee84a3351ffe7952f8c03a0affd90a56745a28dd8f3cabd53a33b7d0e5029fc6af0a8f8168b1fd4364b1c5e2ab7fc0a94a2b4bcc7904e3bb3f58d139c2dc8c5e92a334222ec27a10a1cee06c18a2bdefbde33645c916d10ecef3e38994ec8a8494c2aabe934a70cda2b8f31e1649082252aebc457394d42cbfd0983ff21625ae9a7004aea66aa6c3b6b70817d1bffa9e810ea5599461276c1afc51694fb9357da37fd556fd96de313731a7e92ae2446715380694f9f8f3a652b8f5cda16db33442f575c54c7f42ef0da60bbc456c8a5323a8c410d10b8a134a49954a0c1a6d7cbebe91463756f0a526aa7b369438a8a6f9c8110a68433f6c35097176ffa01fb59786f85ef4b2694518afa5813668c5222faffad826b97ec92c8b0739989096e970b366a2b2fefde632f3e199cf492833be9a54411d9d78c536022ce502ac1deeabbd86a49682275b51ba0e797c18fe92708457230ce35cac66d4701dd7ffcdeb316fe4522f27a3e099653808749ad7d87c7518fa02fee83c10e1067057961f5a4725127e11a210ff99d0f9065629632f4fc0e82ca94107886a2f40a37731c45cf22c160962f3d59129142d642263f280a9571fd1127679786cfc51b9ff4b9f25f0d3da7b2294c84f3024376cc0932069de82f3141823447403e555fa6e04d6511272cf0d2228c98a2749be9ccd2c0292d060e4f2012278271f012e2c32b652360bf6e4701fe2b84adce4a3078dcafc8cb8474215346293afe42439bf02cc3d0da7d92979283d6c8f1370c68f286441858c61fb266776eac6f8dcf2c36755a16f7801bdbc9bac2d4492e6ebf76efe88df38f0d3b87e8c4a3999236902fe525b2db33e36e666635380697508fb3aea391b8978c6aa6585a3b3201beed8a582167e97a90ac9dbc75a6513902f9cc9c80216ab400eaf1e7433c306129641faec246b2826fb711a2b0f5a0d7da4bf0a249e5c8ebdec98ba026563e0b81ee30ba846e42d01be1374026089fa1e58a7f3900c1d04e11d15307900b4c784a3fda73cc3bd8ea1eb81bb8b232613c6fe6344627336b5431e11041e9b5dcfca3955c858101333642a04fb71b99172035d8070b5315a918c639043305f214c083388abd9900203e62c52c9c8c3382c276492b971746b4427865414beca5f1e2610ed5a27e9aa4b453083c5652ef161cc04f1d49c3b6ff5f40444af49ebc71e15de033589e68c5b982e1beab107b85793864a084eb38182c94d0ca268cb4d59c54d93be162f6fa4025baf51eca72dade4d00684ccb84fdee4d5d6ee3e7c85cdf13bc1ec699dfa0018a6e3bced9868757a34e860bb38475586ccb3177fda5b6fdc859b5600580b531706db503f2bf55a7416289fed1c5e877baa0f37871be7c09c0d0ef7b7ceb1301920bd49902f834f0ffabaa2611f08230fb4d2e7fe6e075c0a1765e753b899b6bb6a5c5a779754369f7e4ed93ba8bb5bd4cf7194b9580d8ddb60ce85da4e0bfb63faccb5d4778750f2eedb84bf80c3616f1f8542bea8fdbc22eb978e4a030819d8d705c0c4aaf12ba3f1abe4ea7316bb8a3f94d0e694fce11cf6c935530474e099db288d3fe924b72e99f64aefc04314e637a57454e930b43060d314e992b58148d3fea48cf94663b07f71ab7f1255924d261158c472bf0dcc1630a642afbd931ab7d19d340c9344aa8f4daa86be9bb031a1ba52f730573028c50dd95fe8e7447d39832e3cc2d5aa740196573a802b4b9b70313b173f0d503bad24f0fbd689e06a401fb7771ef79d80d88dc4bd36bd243a4dc198646261176094746ad89fa779a74dbfd518c23d95335cc6b5299e0d6467788452cd09106a3bf62e537faca88892f228851266b1c6343248853388634e9a733005a145c6d46ce45f1921a120864c79a9e5c4ff0a26603e681341c3bb25bbc16fcce7fd242a904b81271a8b07c4c75da1fc39925d9baaaa8575286035fe5d24571ae28c0af6abb6c96171e6bfd9c4ab18527bb2d018c6efac2764855d70044cc800b9ede4b6b7ec38ef28738a21933bcaa25d105dedc687e8b8189650eec4f5d1db1dd32ff0ecaaabcd16caf445bf47d88261c2f869394c525e10a758e30999ea6eae752dc4917c6d1deec71265482f4626aff6845f47be3527caceb76c1153b235776be5e6d2a4a4ae63c21000d750c548477260fe0891eb1b9e9f1bff3bd9de9ad952f1b4fc3cb47d12d2dd4da2e585fa095755e56e2c9b6aa40573bfbbc6f1a0a34871e358454c5c9faa2908d4b50bb10f403f1e381b35c9ebb39d00aaf58374b4917498563dd488e341b7c0aea43de8f160de4cb5c2a2883998f6668a48e9e21d96d04f8f07311f34efa84c37040e92591d9feb84c23f32a7d7ec04f35872b51a8438a9753ce82171e73e0000f2d7beb6f236f2ccac0f548b1b06b4a254df3508dbf3e37aad35604118eb601c0f4a2296ed132268a9b805be5a5851cb76970ee3385bcffde98f07bd7a968552abe772ed5dcbd45946dcc5f6cd302ed6b8570a31f7d356e323f12f77e24141f7fe9c76d60dbaac3683013e17af1318282172ea45f93eda84fb338432f4cc5d488ccfaac24c6eb676c8be18f9a2ddad0c7c02bd7f118d7d49c669fad6fae566fca49f9d9adb279d4b1e6333ff0610e1e253d632e83437d359ecec21d3de502f2fe217923327761663d93a7c80ca6c2ce5993b71088ad7652650605e8d982beb012c9159c317839d61d64a9be669f10e85d98d582c2c36af66b5bdcadf66ea4de334682d559be1555348dfe01e8ca584793797476d32eba446061bc900a050bbd3676c3974934f974a10d3dafe8630fec658cb812e00bf7b81586474b0e25f3309bb501781506e676da8086f2924888cbb7ffbbbb9df2333ae069acbc92f069e56e916ba901b6e9d82067a262d6700f085dc5a802dbe0e99697723cccc2e77526c26f15b34efd455aa20374acc9b6114c6a64e36809af56de7f30e72e3c1b27f92f1ffa46ab97bd003f0ea39ee3e75263c072aa9b567572814d68a0671fe698c82ec6003f6dee5943232214b76d49e39151f3069e13c8a378baf3b4d1d08e0fcd63e09b8c333703669bb65250270f60642dcc63b0eb78bec38955cac4db336834fdda5a419e9352c371372cec4f59928b60ee5fa87080c7458df60f82162acd52c531970f0e3a8394d1fd6ad860397afc96c67c400ca3f73f869f892af4b1a046ee5ab321e1f65b650a76e2ab4ef6ad459b23600150b76b800d6d88d3b36ef11dbb710024165580b33fbc125f073b4e6462a4d2b1a58f4ac0315a3b5709f7624e63a3dd1ba468739dc167c3887b3a9ddbc456e12853aaf91cfc9e2a2259cacf0c5794b6ed9f3962840f5418c6b772cf0724b6d6e3c3da2ac764d404d5e308313cd56ee1f455c5f79738b885cd5da77ad4a3e8e2b33995aef7c456d0a7f5792f19c840e0fd9b67810e2f52d7f503870003c3cf4d7508d50e2b6c55e5b93849ec62b24bc929aa822e139c9b57a6df12b4818a15622cf075f32e9eb4952e6bb9510c109e4608ff6931025cd02bd96d534175587fc4d3e281ec845f68dc2aa060e94465c30bac79c2f8bab7cd2b096e3b2ba66c8f9b18ea34813e2e172bd55d47ef937194cef571262da86eb9ab5b32d1a317e196499a093181a8ffea317296b928df806c3f6b39d64ad6fb8fc8a78b16b1da3275f280f95b13021ea4740c91bc8dad97ad2fbb7b6b2787745aa5a46106c7edae4f062cf1254e8435b535f477dc9f150e5488c20d88f0473199146c83405bc8b5507814d8811dd049c4430bdffba1dc7727fd5a25d5cc547b4b36d52a4b4cb2354dce4100ccad5b59eeb53617671a9c6bedb62c6ebd901743dd9061a73286ca38b830deffa0166562a5b61fccbba29db1056722ee328bc16b77912e85b3d807c41b0d4956d295c6698e070645823240216abce102d212b3ce13a24ba87c5ddd6ccbcf6238743943edcecfd462828d7c2ebd3be4af91e738c60686a334beae5266079160d4aaea3cf278132342a6909cec0090eac12b2eb41bace7b602b7f4e23a7eef8ced7ce0996b3b9891bb51ad6f799985d6850c0225452228c159eec8056261ef2ad00d85bd12ae2b9c5e2642bb2606f092c714ee3c9cf04ae1e4af59d0e0213975ff9c2de2281884701a08c2806e3e876851db50256794bbe278afce23a36d95b7474a3dc80a0f7b6f64ba8d3e82f15fe2ed04432f147e9180561ee837ffec21a1a13bf5e304d39bfbcc6b0c4aaa71b315a4a0f7cd437b090cc280ec7d860fc7e6ee35315ebb906138ec05457f98b36530933e1d391c424943dec3701995ac57221b8a2fcc90063d8a8d12402561abfe833083b300c6bef70d9d53d1b79eef8ad7a91b95e7f1d810071fc6dc24d44f18e345bd4882f30d4d186a09aa3cc945293c33cdd60448b93432aaf85651dade7d436ba4f0e77a8bd038eddbabe862f7818be49d9816b3316eb08e47aaa6ad756fcda54138663c37475ef6184ac38125863b4066babe67e3759b7523fd551df3073cdaa10e6aac83c075303947d746e0bbe7c0d73ff5844b7d15a45e834601395651ff71c1fc2da244af3131809795685e3d11297b38f7b5ccb9b5663cc2aeea5664959d8d65bf9daddb1b2ddcdd87b2895b241a80e22b326d3563c80e56a769087346bbb94a9fd96c989f158fbe28377ea9f6b55684b4fbabbd525399ee01a086e08ff5483f33ecd062dc32b54220315d99098901ca28b3403e0f89a07a893d67278a02bd865366f915f1dda5a7b2c71227c5314a1bc59e8dfb2aafcf87e07433d25c54e9b95a526067e95fc40b6a6fe4bdfeb78f4606c5ac4ce2d1becc716dc2c987fb919d7cdc25d395f2b73d54c4cb6fae1351b928086be2694bbb87e244bfbfe15362386db0016d7ab02864a3ca2aacce0e98015cbefeb3a773e7ffeacc296df5c579b3d0f07052a1b9f48aee5f12ebda73f79b95031bd48f223c4b638f8d4eee87fb1ff9cfb295f2977cf8f269f9f93109573ff27ce7e99b8bb31d79d9ed602181829515d135df8744601e8179f043a86fd6cc057b06fef9af34ba30168e46e553c5b3e0fcdf9921db8a1a419f6c7babd0edad46408b9b270e863a32cf896b3a1ac7f25992fdde4579bf7e95ee1cb161aeaff8af849c32ef86009005829537f0a521ca54ca16886c3fba55476b23068d7a24bff95c6660dacea458e1006fcc4197d6b8bbd20b77f6b14bdfa37c5c495a6c5b0374f8bab7622b56039fdab072030eda1ce03d6a1330e0d33e0046d4a70667c273a5c61af4f0b193b896c5fb99a68b26f0a7b442001ab48c9e5fc04464eeb386d3947db3e14a2c38c7a25186e75330c5a816c210b3c65b43a6001f358bc0c6d8406832c32ad5a3002fc53b65f49ba405240e31b314f5aa1fa4dc9ee366fa7e0c4b4c5680672a4b709da37d2c9448ac1b8a317428590dc47429ae841e25d718682497dadc2044cdc57540a0c67e6c0f96033ad7ed71b48bc524a129c0a4e0735a397cf0e51e5765f56279c2a72d0dd1d59247f8abc64ca5d0519a691b710c8d5516f27b1cc6930e99243c1971c65d27414a9c34579269eb13b7ebc4e999ee7cdc39dcd3ba037af9eda42ddbcd9d882d2e816f85b6e7bea388e452b75b7841dd859f25219d08f479dde74cec802e86c81624cc7229137d0979b3ee3342fb7f949b9ae9fe467489b7b756bed08764e7221da1abec729c513bd42693470f36f84c8205b9e793515d70b8618bd0398b6ec7599ecd8c4995e481770d848d81b6a1d1384646521155f28833fba10cef0e603ab91a2ee3e0e0116b3a7685f474d41122cc947b33199d6262ad28b06047715a68ef2c94b329b38ce8d9e428e894c0197cc66e05ef783eaece0221a2437bf60084749f82e3fccf9e779e129c49f8ec1624134fae6852f8bebb967691ab790385e6c3aa4a35b88b9fb1c6d167b26a43e6d10c3ead4a79a5eaf8fb68903bfc5165311637b894a16a9c34eb438170f69ca781d6885d6a09bbf8bf0dab88a38a34f75d0f427d33b3d2a796156bc3929b30efbc1c1e06e226cebf61795a52104f5f95d470534bd0bc28bd19457a79a6649c7625820554d2ab695f80ca0c708f0cfd0e7d59515b81bfd9b0758fbd2b9d7bc1b59e764466416c7ac1cfa87320eafb891d73ac579d984a3a6d41d82e671ffff9221b7c57edcf2187bb0b2db16e0e445722a1dca40c78154dbcf7536cb2527d87f4d3b56604b63640b6b3978bd10af4ce70d0608c4c66c8d6260c8c802e26c4df85291528d6a0c5097424aa31a680df5ec9a41070144f342d30c5d8a4148283cfe5fd74a4a5be354baba5e725078d7d563fb4939b36681cba48a2ff5ba201ae93347547f696b5820b66e436c0c2731d895458878eda0d6d6e440d60ae1dd3a5d34e824b9cfa96dcd69e8329237df73cc6d8be2becee34b5d7edc53c9503a44138031a9be24f935b8e3defe95a8abb6540499a91385d55545dee69321fc1272d08e8ff0b8fe0a17e653f0254aa1f7fa368c6d4d5de4f29dfa8ff4eb976df7b8f554a571b34aa371be258ac0bd21078f044ab5154c9aa10ed56668627ce492905a42feedbcf234443820730740fb1ca9993869643364dbf4b4c6ff4d92bee72e44fcbeccb7f731f85d23195fe8015f0b5816b8290fb37505751b8868c5365152005b97705289c65e7315b5b69f76193c4f6dbb69fec77be5f305bf426917c0249982589d14a620c0685b22191c4a6365d17b8f92b7d3ca72c35f42ce9af50f627b0029ade625b103523a367a696014f20ded1862fe0e33ccb19092868b48ebb4ad43969951db46390c6940d8c8e80d74367915a7780044ac04df259b3db4c7dbeba6e6f56dc61edc215b69b283639aa5981de21d14b8a62599a0e59538442442b2235b090a1c5989d4687fcc93b9eb0c22ce8207fb6a0389ba0870738319a125d6326332756fe54bfd33f9973c0c35e91490469c317536ad3d848c878711dc1e52952ee89b32f939596fadcbd27145407313520dbb32e13c5229e35f9b857cd3d4604a8bbe63cd4cfe9838774a5d3a72063812d1b66e9fbf1591ea449964d4fd451e92f5daa1a5fd6e6e48a21a4814247ee3ed4e763511169e06f9c197fe00ab271b234f27f993c0c8011d1401b3c3db4754ce7a3ec6be141f91efc5a2de8ddbba7804f99987ac9cc8da33607dc479de58405843f2ae6ebc8533efd97282c32de3de3e835afa38d634d1aa87d76a9ebb0801e421959959cc34efa54b3cca73927fcf653b56de764a20564f4feea9a7a7c2603fb351a5934b33c0a278a49cf94a7822a52b35c4d70899e6d1a0e7b384553f4416387808b62bf3766ce0eedf077fa364347b031024044b52034989abc811bf4126830bd443ef833e5d92f47b1ba082a6232e46cd3ed6dde994c71ab76827e18550cee24921d0f157683a711cd58ef8afd3b27bca1f97afdec1eeb2ee009d895ea9dcbbc99c3657c7328ddb9258c1a347edf58200739425ab30d9c1ae1ff84bf291e616f5b16198da5f74ef9c1aaf881ab447b549e7ab1486cbefe1ca097e79ef0b868d7a501c64c178a7756f7547286aa0dedad17b2bf1c4d8608588dea2b765f6074d57e54dc95030e1a8601650ac749c9395b254de1a79833ee153339322bf006b01e7a43a4b15441857e808593d775c7a85587b56937194434a089469f741a236258cb04a3d5dfea4079e9fcb2711a1dfe68c3bc22d150fb499aaf431056d65079029454728b086999864e2e7fd1f968f72d37ce77601a727dd182715de56e0b79fbc661e66c289b0ad74037a5e536958fc95eaf2c36ea6504917550966164b5ebe2e668ce265135ac4b5c949f9fccaddee62f3d9e5905a91abf536bcc029b51dbd38f8e01cdd3c414975086a2124e23ccbb19818680b2d896a750999a9b34b826e45b95977c74981cd0fa9a64bda3fcd5ca96042f914493b8c8172f4e6558594275025dbc90509b84c5580809d22cbc017b9f923bd1c71b845a928bd91ebe31a50af6e3a9f38d24086e0f3d00688c88cf8b4ad315b6202ee7cb25674e5823ee5f269c7c281bcb207ac90438a56ec79a5cdbce21861819b798c98d326da3c06644a4870ed890150fa72fc24067cc40d02d856ce689b315b63d1c92a1619fbd9022bee6a94e88c25209fe68446a40b229005f70a4e45b509bc78fcabf4b0995ccd9e46d9058ee6e0acf26349a9dc36324903bfc6001880736541f402c5d40350d0e331b822d84ecf43295e28bc7ccebd75d1542a6b137bee79bf053816251ce6ce89883b1918e6f879f1a51324801c53b3edfeb759a41730f928ce53d70eb3a01608931723075b9030503eb38297d38f3b20a444952e7c4054a0971ba4cf911ccc8f3abfa0dff23fd170e0cf0ddab25f5ce308178be9678a6f7aaee4b1ff45bbffd4e1fd85d9fe92cbebb576bf28851cff3924e5ebff27c1fd184c37d64fe767f71f492abaaf7fc96ac23cb479ad16c5bdb4019f4c84fdf17fd2ef546278f4c27f937a7c1bf053772a53be0e7886572a930ba9a9cc55be9190a61a23b51486c4e6c901dc17a6eb4e7626fa93a7051e22163f8d34ff8cb2f151fe5879fc8ec3f09fffd50510b52cdad8cad8f5d317614a36048f3391ce800c49bd09bb91e90f47091f96fd59c1a5a7dbf47ef884e14bcc756f59815555016fa8cc0dc3fdf9de32af5f64ee14ff57aee0a26cefd51abfea360c8984add837d82b450da5cb2cea355f7fe47b63fb196b8bfec78be2756ce9eec2cae5802662eca7f98303388efdb864fd1640f6273d59cf1f32e1d81fcdfeb30e66b9cd800f5a33eb1f75849a41fe574d2c5f0d4e0cfbbbd35186c238f2a7f064367c10594038be2e51cc942037a7c5f2b1a6866239920277ba1a65e7a60c4a23912883c430c41a09d8e62aa53795cea2cfb61624c836fb879a9574ac9ef68bb7fd00b5f3ca7f94766e9c9a7e225502fab91b99e0b8ed631c1ceb84ddb012b8e93836fbf77fbd56001b1f8b18b61a43872df64e6a94bb90c13e32541878b96ffcad4a8ea41924ef319c0a65e6e068b7317be246a2d1744682bed142da46dfcf04fc1656829a733f092bec40124f0027eea838a5409fb4e1fc1b8e1fc245973fa6c53fb9a9661b0c0f9e1ff7536a92488d09ffa3c1b5a1f0a4cc7fe88ab0960d04b17b4d8f79bde38f0b2b24f1ddf30a3fd75b853651b4e73da1c840a1f0fee536fbabb213292ae7b1ed40dad312024338167b60528609f15457ae7b6941e8ab01302c72f6db288ce77f7161eb35dcf89bc84d70d36ee6cdd0ebf1c6ed077bf5caba58ea497aff1d9b3bc4cc9802a7b4ccf2f125482d6e0d1c6c4cd9b43fcae01f82c0562a8fc3be3fc2e534e939fcf2aeaf4aff5b0cb7aaea70a5c1480de76e00c2b35b3a205851ff1265490d126f0df0614250de7dd3bee49b0b39e673f2e4a62cbd0dea0e1f0421cc345f63afc80dbc51d1901135342f71aa1d2d5862118c869d050726d2ee09fef3e1384078a916accdbdc7fac1bc9e4042fa26fb9fd80551a75c67bc8b28c6db6072d070f54dbbfcf7bc826fd172fb42ca356cb4c4a9761107e0214e95cc482d756a342d66b4b6618d976349b25b263d2ec79b53c7d439cb1bbf8a68d0bb0ad484246f111a908c2be6adf43360fc50e093c311deeaec42e0c5818aafccc6c815d3244d88999daa4257510c34b43eeebb2a608b674e2b3bc4c38ccf2659fd923c0ebda89cb2d767b7eb9dc727a4899a605b7f5722bb8882b280ae252dfe0a925dd002ea5db098bdc349b2d9a57d21210eb44c4f9961c7f89d136fb095f9e0cf685788fed0e2202cf27780eeac7aedecbd2568d63627683ace9f5b6c69d8391a6a2b61d18c967a9c050ebc93950dbff161e59cd6f843de895d14f302161659c0018c49e36cb7bd39bb81a8eeabbc06540c5933db06a557a904a3f9c56d9d0786e4118e1b4b53eca846ae0212f930d863b8738af580067a3ee5b6c6ef1a64c1c27215324817ae8ae9edd62d0af33f031de707c06431e6e2de6f00edd47958444e5e7e7de3da0349f4670a6aa1f38ed2300ac7aa606d111080b2695042cc0f434870bd3bf710cb5255fb557f71ac6957f04684ad49ac63ae19987e04fd0981f4930dfafa236c39610edfc18040e8fbd7afe72dfe70a04597c197fb41d998c8449dfef34e650562586b6d09a1cf9610559311b157de674834e0b051f0faa74b196d14074e5d78b5ac6fb2286efa45a9a1d1189ed4573fec3323dd514af5d0f5de4e4affc147d2af527a69fce7b5376a90a4d86678ca62e56f5cb250fe3796fe02ae90c4865677b9874c40ace6bc288daf987dea8c841964cc37dabac6b5885e52234433dd6b00525f3dfea2beebc068bff9f6fba915231bc603b87d7a227dece951b89e2c2057babef5c57559efa59b2f7677e183d53e718e978ca1df9137daf4359a884937b40596392364a48fa217255d2180817fea2d3eee3352533e66b8c561aac40a0fb33c0044280c7059dc11cd783222a481a0cc3cd85d985b13ac204b790a357a845fd1502e9ff07ad4c1b51885e1a2a374748c00af687576219f57b49e8521f7e46055b6d1ca53111570d217560686c50c58615b78c04c1e217d69cf5d5966d6a6fc20a0b5ad2d5c541750704a9a072628af962b36de467b563026438d740341e4d359759609402c1935ad60eaf6f99d06b02f8781af16b0cd381e06f58745309c882490170d5f546aa9221348173440a0a8f755f335ddfb2680a1b6975d95fee57ae0990c4714abcf53f2bf79bd03e8a8e8b09489dc474a958b10e62c9992caa0a5e96853d7f2c490eff718273224720119c453ae3cf13bb8b151dae622a1406ec6d2b00913c26423f6d3ad5f16ea1f1940363aaae7c989742b8530d7ebfc07c6cbee8dfb1d7911c91f1b18e570dec5182dde7846af6ffd200231b46629dc0b791cc674c0568c9e4ea6b8f86fe1ec81ef7ce5dfd505b78d36764fbd5d17cc2e357f95e38e885c71d3c954f17dd6209ca7d83975b9fbeed37dfc13966708922ff9e13ceed8baf7881c543790cb87f5d2f80643703c35c84351cec52905dffe9d645f08bede8eac7b3377119700dcbecfe8850b0d07b1a710a90190b66965916bace8ed1d34855886ae2e0b0ec88e0f50f61730a87d8a062fcd810156c26a3611373454756110286255659fe2515023ac282c454b70f80fe0629c2a5353b1802d35e33e619e4e4c06ff81420ba10bb08d31ba1ba20e252ee90ae239cbeed027d4af5f06cb7482ccf30bc254b19ebcacad8b580c44206ed0ececa6682e8f7ad65e77a43c663103b3dc23cfdcda54e48de000473fe9d6cecec9bf20dcd05e7b32b3ac8b71d522029809e537f61b796e185dc8d63e700f03c07e997dda89672a6e4f6eaf9058f0fb884ad6a6d3b8bef13f6fb76da64c2c90233b4455769bb06b6f3b7a91dfd753c986ff6157f6a7e653d96fd135e32b39aadab067499268eb8650fec8dc0261412928500763aaab80224dd009827262106a2c900a6273845a42bd3d07c5cf9f21138a82eb3b7b2be3b7c264ce752edaa35d423eb374da021dc2b617f189aaec1a368202bf297fbb6011ff5c0157e65cda8750b7e3adf2536720b8cb94419bca4a4ac02de87fc9cc95c1f64df8f02ea3a05e8fc19f85d63cfda3c9257231064f9979553bf202ed6582d1dcf75d8ab168ecaa3860cbc08f1f188a72fc24754cbd51fb5fac4f5bda78107b25d034480fa370074ce14c2f98e31a6340372b6a85b2dd7d1c10b65872871a8c89bb5b6d6291f1ee8c83118fcf4c6876d2cf246139e3c829f00c64132065c272dd26f5ac72cece4568586c93564d70375fc7d510ddb0e60f86a1f0adf11ff636dc17f622a87faa8226278d1085022421aaee77122a234588227dc00dbbe8c6066c38cee9bda5a9e93c8593b917ca05a114fc24e03e5775ec6095f9036aadd1e386bb00e4272617657d12658342e3426bed1b2278c556ded8d22ac052084371a8558bc01933caa1188ad95843ae00892f1479aca1f8e0c1f94654fe6a8e966fb04ad38c19ae7398c83f0b65d8d28d656215ab5ec576a3b6082e9125ca956472edcd6a12502db97b0bba51b225cbfc2e490961f3f3fed7880fa08b59aa3175cb616083a360c89279efbf5166a5c151d8d7993aa16adc259eaaef8c919bb1881ac1a2c0896bcaa74d5b72bb06706a6ecabaf198a65b58b72209d2378b9bea7a78b779289c2ec7254d75c3544a945e6d79cb32f42bb8a4f0b00434151163a3a4d593cbbc6426d369380a067151dc55c3c44113fe7b1e8da9612806087161ec3c75d206ea41feefa987d925e7de71b401fa6bbade669e311a6bbcef828393d468030486ad9d006611fa4aabdbb8abe9ba4aaeb9847216303cda8076fbd851cb33055574b202204a0c3c2c487b8dcd06b37c294674a88fc99b45c6469ab17d8585d2d106407b08eda019babdd79f360aab765d93f407d2f46c367854779e40c571bb6e430fe9930201960b2bfc186d20616637db5bc8be8be444fb7c952140884398ca66b1e00319a88c4f6b36451b2c899e79d3f4a8c5d5eafd4156c28b2ea970200342957ad083f86c10fb690b3b74464bbdfee0b301fbe685ddd420971c29401349a7a5e61a7472f3e2e6d676ef9ebbe86ee1cb50fde19a33ea892cc59b4222cad73022a4a917b128a7bd6b60622979bb85b2556ad77a382574afbcf15e4265c35577811ee9148a5989c3870370ef610b364f21914145a5122ddeb6f87950dd87e3c3ab69dc869e68481ae43b4fd0b36868e06a391770e823e6ba442b8b8453d80d2c7088bd6aa039971a91da348582c4e51fa7eaaa558a09d72d0cb232b291826038f626a44e4d0463751c787c021f6f0ad2dae04ca9cd1aa4d2466026c8622499ef7346d7fccbe7490f2d9df3442051dac959c7d784330b081fd3736317d2cb69ccfaa5f43e554e348a07c7a095eb4101278aae78b6991289f71e3a2357e21c2fc2e0e793a206011848c528fb79c64f53f219d9a6c5b81a1650908ffaa9dc7e9d7ac07c647aa10b15a8fd9c31be18ce4aca22f00499341521cf195c24a79cd18a2afb1a332650ab7802d8d1fe5baf5f42471019d50091b5ff0592954c789db462c19ac469a16ee40393b308b58e6f35104913ac56f5bf340e7a4d0dbae945c56cb7e0e1d9566febe127029447e204513d76f5fdc4a470be7917d9e972f0e2afd2430052b0a9f4a2dd4669f739f8edf1917bcea9c4ed0079fc420fc25f83879e54cfe90781411004cc33676ef018a598ccd600acbe051a3e1093ea39ee4d1fef0718bf9540164a5be16a1d48fb887b09f902676f91636cc4d9ee83a4ce38032c88dfa74628a7b1251732d4ccee2cd4ccb1ccdd36111bcee342406ea787c79ce397508e5fb2503af2b040a824356724e30a502179bb8c6a336c3371d4fc658935d4181f5c1a793c8f89eb10cf53ba5385894efc739781f1cc15a12f910dd0cb5fe0430a9ad4ad9e4569ac71aef71079484e34082b2df19e760f2a821145f0f7048d6f4146aa939984803a547d77255fac21e1c2ac6665f153400335f81a60630f396225f3e2c7465cfd14e6760b20e9d6edaf1bc6705f4cc8cf575e2c511dcfb48c8297d7e946c67bdbdffa73a0207c97c0ab0e262cb5a7c0b733a4bd8f326439cd44a81de72989a25a3d10853f3fbfdd1650b725039e2c57eac1650f9b10cc4473dc3a04ae8f4c4dfbb087ea1c1308b2e0fd02625aa1b514395d709b3aecae19c0c31c5d4c0283126e959efa474bac198aec8a1a6c53052b04857520e8bdbce80c7f34beab607e660bca8bb97ff423e8d1dc7537b1ffb2fe2a115d15c5bdd556cb94fe4475856c94c9e296ec990a240a0d331fd0536d0722cebe172aac5afaf47f25e366b9718e26bf79987f9202a9c829c20745c35d6c2e852c984ab202a6d556dcbc04de62c74ea6ab2212241bafdce3345136362a721c1c5c2019b6718b0a7e736e5acc00333d014d7ad6a56d040afde47d361f19c93947b37c97e24d47655da3327a9f594e46c9f43c58991718232130a546c03cc0c81ac3b12e2361222ec87ae6b40b951a126ee409e849cf57c5d66555399ebe38e0b95e8b2020b79363c5fbdf73e0ddf2d0f86165ed56acad1c83ffb6a1192ce5941e28d3270113c5100fa50a1ce683430c4301531c6e7b1de339a102f4b0e6b6db4f23b16b3fae68f4426b151783312d294e22f330dcedba593582e6af622e1fa298f97de5d2f9be1593b7786e33ecdc2a6ea96b036d7e882fd37e39681fef2b7c0ca90f464bff5e2a1933be6d8547859e972b94957afd0d0695ed206fe0b75fab9f04cc21ec242fb26c8c09024949feba9f5daf4012e25b6deeb4f25ef105f223b0c7d71fbfca6d43f5663f25c5ccf86c15670b0434c33bd77cf31563bbc19106981a6557d2e29088d67c468b07edd397aa99b1a6424687092c6ae79045722b4215280d7ac5f07cb1180fa0c91404b1ffd0c0dfcf0b41d1dfbdb1dc6e2575ad61f401f1f71827f541f9cac859a20b6e699450c1813eea20903b01bb8c29c003e2a4fee05091ca637f9e1fad0ed0227512a2a36bd7e63aa3f66b388bb52611d2e246c9cb591142f0373b06edf2c9fd78b7978f6783a1a7f090bf18bc5fad13bccfdc237bbf7cf2512431cc7c5430f313f0fd7d4884598b9cb2f8632099dfa4836a4a99296f0b8a347754e78c3e08ca9216a0423366b4e3067e76da5298f5aca1827f1d4bad6f03fa2db26c1c2349f32c0ba210bbcf835823c8c420880a0c8ab1b4824158d21b1cccb65b6167bd85c21dda6e3e50bdbccd0888b10144041e8674e3036d6a178b31d18ec327ee9a943954383479c93fc21a8fb543065b21654a118c13cc0f2c34c7889a633f4904931d5ae0d2405b973605be9cd9fadd91536d990f5974d7970239065addd0db7ac20f966b58c0cdc9f814d94e6ad31580f27424b7189e1d3b7976e03d52238ff767396e1c4f92966747657b04611fd9d63fe2e0811485ce948c095fa66ae95417786cb8a647c6074dde996e4f96d5200fa995f495de60bbd321bfd2ae379cda28fc82506666f15e7672fcf57298bd7c4b90f62d4ff8c2c8ba5ff6d285714264c6a6821324f29d794f9c40a74abb0bad2045c327a35cac25c12a6f60f64e035be2b0b92fa2ba60f9e53e183229f99d0b399168174bee85f673526349e43440e568724b72eb475515c35feecc644627f181723da4c27aea1a9d9eac2474b71bd45675dc744506bfab468cf8a0dca0b2b01c517c37ccef474b744b3baf5cc8658444a1c87c849f550b08a2612abaacbfee646a1bfb6a41759b1a0b44c0de52b38311ac897d613c277d5efcd100404515274294d4e93d9c1da388c9def1ba4b5fb66c18451f11eff5a5e4b25f62257a84f12aca9a08de493aadde18408532f7646c6bc75071a17773b2963e8863a8ad04f10f1cbb87670858c9773ef6195aadc4062e7f996f310e0f8a4d4aec1a157e4fba89a2646b5ecd292a75c1106a549dd58f3835089d5b00e074a822f49b00a10753b5bfff2b12d574d4e31daa9faf8a9c348e65b610a61d3f22769962ab6d4a853f17c532a59a29e36f93ad5c9db2ecae4ecb64e59a838b57e599d04719246a41ccf12cd3995bc7766229488946189c972b15ce6cc5924798dd989f05db20731dd2d2cd1f20a94c1063bb75b9e4832d7e84d6a1a4de7573e5673f217bab3320e470ad88db461ef4a5d85e6f00d782b8db003be0c420cccb532a782b8608a898f451c96fb7b92f3129d7a458547f8a928e373db2134f70a36f491a42164b162ccf162496645d1d8d9c4158ff59da588825aede81c172a59ac534ddf4a873793b168c1aecc059d8b5dabe17a2b865b1d32d0dd6ff646195ce9e5f07f684ff2394ce5f6e7f449b19574bf66df92abb02ace7520c1a4444789ee12abb63d8116024c62c7abb87e640e79ef8f18d96462fb8dd631a940e300c2ca9ade500ba0aae6152183d96bb6403537878613454272ed7867e19cf02678358373aecf4b66571b0f83f850b5a7c652e674ec8269e56348e02be54ccb12db18cd69b23767e7269993eeb8d8c5279645ca11ccccd3d2fd1da18d5afcb718d96750f6bc590184d1854c8ed27ae2798207ab7c2a3ae29907e1eff4235f7ebe8040cb990a7051891757bbc9593d08699c76d50ea016a7aaad68870448f34eefd45660204fa03d463e1c6409860edebcc3a27cb4b508ae45cf2d2acfec0d91f51c4fbee0c1bfa261c1c47d152ea3a7aff3a8f065a3e6b192892faf85a03efc5b5d6336941fdf590607ef8acec096c22f39fba11a00f6672fb08ddd888788025d740039f11758817a72c055ec1889daaadd3e73baf9df1625a0891e750604b302069619fc0036ed6c53ee25bacf4ca31e1fadd68c77ae542f70dab8826b00ed10106a541f99b5f54a5fbabebd0d991ffaa927fa78d560add28fe08fbd66145349c2e2591ee4aeb1dc256fd4ab7352f44310240b89fd3bfdb9d289fc9d437379c36058bf256ac3a63483b4e20bef9252c8484766c03d68ae5acc436ba65662a80b8ccb08de04fdb449cae5ce49c4319e60f5ce8fb4972ab858ad2e602af963f92054348b38249379e1ffabb2df5b9c220cb702f92a7062177efe5bcab725c5e53943dfba69f310f71d429d497d96ce300ff1bb5f551f305fb3492fca17de04273f2bac0194baeb838bb000d2556aebe7d40c31255ac6536af19b34a8a3a040718dc58f167d3d16551c87a017f87647a27562ef4830a5c0430b673508dd90c55260248731939ebc4bdd7abbfe6e5e081fe0009e79371a580ddf7e0717cb251225f42b267a87b675ddad92aaa3753463bfd230b8ca0421a22e61f57bc33b0d0fa1a2524643ea262cf51251f016a331f29ddb3d8749606f57fb6584b77cf6b90f742b7c7b4bd0c0161db3b173bc0ba93a8f554e5f09caef6ac7e5139112a92528ea04e0be8099047c3e640f55db57bd8969c0b7b5a99feefff4d60fb8fad07eb142c21c519129a669825994fcd0acec5602c9d0bd3b59470f8b43d8c0b730eb4b5dfdef619b2c01729bf2d596bc9125db0774e08a742d1a6cbc53f436bc485b1ba429198ba7cb428f9bb216e6efd17b20676218157afef3f81ed0734e471f72d90250c17a8dd75614ed910756f64d01f59be57060ab23c484d8f196327c48346d1929ad0cea5c8ef4e918a2584c625ad33ceff46f8952f4d7607562ffeeeee633de6d7a2fa421ef27a980da427cff4d45f5962c1a70d6b89b8ad58852aab47af230092d01cd60c98321b4aeddf0027da7273549306515d914fbc4ce5cd25c43ccb5ed24379381801557f19e1d7d2e14ee0e256d89ab0a422915727d16cde6dd128d9d03d11b51d5c69d7135534ca6aeed8e5b05881fadbeadafa458af811c91757f29e1cff2a0c5e12ee76c5f5ad9e80c4d7798fea8bee7b8a3dca2e66e4ae3980c203378dcd52172416d9855a0d0038099755298a1ae0f0b86acc3392c5eaf17c71bde76a3e32f3963e470ae263c00438661afe371977a22442d9b837b99251b354b08784bfbc3e21cfc5134a2c68a94bfc1b8027819581db89aa3763b775864d27c978fdc8746b1ea82581d063026a2ca293561a8b1c0decf1076a18aa4fcbe73837f959b7ca8216874b03103fe1a43ec22340878ea697d5d770bb87ecabf7d56bace48c11aff6a9b08309cb341b7539e3c707fde42f72c2166a044824360e24638c31065ad1b82692c0521a8871ed51ac032dcce313f6510e0a4160ce97a3deaa8e68eb900d87b7c2726ef86962376a7e36186fb9175607a6aacd97b7c406c367e85bf8f9a6355da3e167b538bec7bd541f191b1d2a0176dc2c4832138bd293b54c93dededf8410af2f72e0e37c4e033f3f8980617a9e2f4341798a5ab15a798d1660d4028dee75adee4d0af74649470a228571e9d94b594981a70a84916add37da6026c110e9bfda93072314f35a18f956a49698bb5fd8d12cb481e51ae5dbef7b5e53222c570be1f9955b4fc03d825b4061e195b5ffb07b9eeb3a750f40e848b817fdf24694282d0e17fd0fb860811cbc7565c19fb4592545b8fd971aaaa25aa548479b6a5babdaab57ac836201179f129a1333f085388eb3986fefd370dc56b88265e303ed6c0c0c53fdf443d9502d28835768ec33cb110f7d9dd9ad3f01c39d6585f8cf0b5d2aafd279c421edad415dc82ca599c8ac29caf5d6435e8cc7f9a52ed4cf5ec25372c543812469789f28fd8d8d96072da1262fc9b892ca149acd93dc58f18fdcfdf45728238554a64821c356a1ec56461efa9926f4a5e509b7715c341f4eb15237c60eb4c7e2b41340a0450b4d1c0173e7dec2bf4c0a7248206192cc37916e860be965b151587766cdd785fa005d0b20b2357bf7717ef8e240c619e8aa01c627b16de979b3d56cb8191983cdddac1893911d6b4dddee1591f6a01126d65a492b11b074415e2c07590dc3f015c1182b92323d2ef456a1abe24fdcbc12cc4f17b7734be358be389844cb19537b0527a42cc7a685c4bef8e4fa2991f0bebb45d38ba4f3f44cb51b3cead60c764fb02760c51dee1e32a3bb671f67585322e23e86173630c0413383e7335d77df0a96d0ad6a6161aa14a4d4815a3d7f6cb74c4337da781761fa92a77e06934966e735eee1f9340410151d5de5f0247908ac95e60d67ecd78b9e0794afda2c47ccf319ba1389eddd974eb73c23cc763b884de374cefb9060dfa5ffd031ecee0b1119600ce1d2d069986bb1f099c0b036b1962c54a5ab693fe44675bd83850079da9fab5f3a073af9cbc2154779793ab22e7225a272f7dc599386f61ea1a2c148142d37150ace6786b2ce67caf2fb90ff46b99a616fe544088d99d43549b818211980f5e374d0aadc7b38ba7162aea7e785548cbda4ae85fffdbf7afbbba4384c634bdf9f97d2f1f5bd540689501364980a0e47b9e9985154f91ff9407dc2437901b9ae648fa30021fc638ec2af60846bf3123027f2bd07e508da449c3a90701a4536e0781313defe21cb11482933251afbc50b9164c01b75f9327e7ba850d458f7c5c27632f825c9c4585885ba9f735b8ba78c2b56740d6abd9460069c5d02aa71814c5e4010424e079c48509fbd9d87254ec77dc26891177202d14e2a3955c91b46bf28b6354fcc4f99f5ea70983f81cd73b51d11e662407fa4dede007b5248697cfc3e000c01690dfe98597fe37b1b3714289b67ac7dc86f7b77db724b99929429b704f104a80477766dec707148a66463078f7b677776efbd3317a14c9d973017b219ac07180960383c2d2ae2869033e9d3592ae188e082f2c4154c18d8d431ddba278a3c9564aa2ae6d9e83bf2672af98ee9c7dab1c88b8a6e2fbae8e26c36b3b163cb8cc717fa640bed2189fab0042d82c160303aa444049986408623f758866c48b52dd2e7ad20b1e5615e248aa2488b6614082ba5052a5a24d222f145175d74d1451769a92864a2289b55516294a468ca501351f48fc5542a95ab602caed2297acc251689f090cc61be63c23277e46c478e335a98f9656eb1b9154571c8771e3063642fcb2de2d0c762624c8c4df1b38781cdd0bfc83136c4846886bea585c5863445c533994c9c899fcca0cc4cac391363be3391c4c498288aa29128c3c58484a702134a2975efee9eb5d65a6b952d1a5488ff7f57ffcc1f49a3aa2bc4fa081b0c8e87367c17a539b42d2f586bdbb61582a769e34c6c7928d03b27744ff70a3f9a2a5dc75f69cbdaa75572b6eb68784ab8ee5adf29ae11030c8c90439c40ee20ab136c249bcc1df9d32f2cb37665eb8f9b95c8de9de04116a315118ac9623c82c631a8729c4c867f51fc9ab5be93a5a4f87f7f1434e0ac22ee50074ef0f6f696e0cd04df91220a5246ad76fb82c2ad0341e4d7a13e35a48c897bba19a48f7529a791283d294ad143a186784513bc6bed6b04293d51fcc21c9b0a10701cc7b54c06050f1ebe834307997ee5e13bd68e76a45f47aa82ab64085f69c4b2d609a5b4d24a7311f1f0f0601ef9f1d42aab9492561a004a29a53cdd0326b96bd624ed56332cb72ddf0e494e8e0b735a9f0b3826332546b20ad1134e26eb3b6b36c8646fefd4913b3566f774cd09b87ae2ca2cfdaae47e7e5923fa407804d594a83c0de2314390134ab2224231598c870cea710cca525a60c4590b8ad6de60b797b5d676b693373b4d34786a08811ea0943efd1e57e62a3105d2fd218b92d2ffff27219aa064d908c857a8f29ee5d7e56971dc45e9b04baa586d569bcd66b3d96c369a1a96bc49cfa3fc87abc96469562b666a561af8f1bcf6214d9d37ddf6530d431d3434185ce9a8c1290f955aa1c306a3b00dcb632b3e8cc23658e8c3365f0aa750df89357540d64b524cc3bd3c13cde42c57ebdb8fde99424cb57dffcb9891dbade5184b7932cb32c7fc566b6db5542adab79a41a81431f43385101942fce1808f98ec47ce600508db8f47a94f4a653fa5f724b11050f020f4336f3a1f23ab905c1784c8f94ad22709e9c3e15aa4c6aa8ff69161a45cda409eb8d29ab5dd51a5846f79625aa4a2294dd38fb5f7ce94e40d759bb7a1a10a0299705da247f754fc61be4bcb98d84bc798a69fd7bcbd8cb1623725a48c892b8845ca903f73e63b3f676f4428d631a69096f144f20ce336d80de6dc57a5acfa7f251ffa2e3ea890ffdbed769bb79c6ab3b1c1c3906e45c62f5fab1175cd03305d92268d0680182e872b8f2d1fc4b1a4945f721314aad631a495ae8d58c669abd97258695d6925b55cb45aad56abd57a28c116a19f0c988e1065fe020c068b113d293214246b2294e46130a2144e5c180e3da59340c81e2409ba2f1216ac1949605316a1425c6bffe9ffd75abf4787bd300c433725d9bbeab24dee2a56fd731c676bc51c0854bbd51213ee31752c36b1660fdf913f9d65e1e8b85c978d2f9c0dcae1ce22011934f0be1328e528e59842a5505c9696c6a5a571694ca152282e4b634d0a75023f8f86e6d6d0d0ccb05e1ac8174b9c425dd673014f2770e9f34ee0d2d2d228e5f875266b39eec32fb3349868e84629471a6818979696c6a551ca51ca71695c1a53a8148acbd2d29842a5505c96c6142a85e2b234a650291497a531854aa1b82c8d5746fb2914ed5228da9530b3657574e9c7142a855a1a1dd3cc9f203dddfde481cd719eed4cde079e64ee0c4d0dea53a9e04085940d7e1256b9111752a9542a582c52ccdb54e23a2bab54e645dc572b10a8c32b160b9b3b02949cb9f3e2967164b1484d2c361b0b162c6e5aa06646d3e8c511a9765373a52865b1c614681fc78202064ee81e19cc005be31cede346264c1daf7b4c4832d913a427376496127b0002cdac58b0bebf333317df197c71cd6a0e8140175c32651f8805fc64bc930dfc6c349b5846486ee44648b22732d993f9a4a8a8850b9a24e24c9e96a32f5e80408fa977b893f867d8b13a09674448e845786791196bd10204aad8c50743465e94aa03b9924996ed6028896c68064dd88b172fc2ee9e53b646463264b676db368b5c33cc0dc607e01750e9839c6fcb38e6c4f87c25b1cc70da6208c08454abc9c4298aa128abd0aa003819df0c10acab6b309e369231dec4681f37cae91e0efb282b5a2289aa11677d947d93f1998cb229b359abd59a0102673b292e91424c868666cc980142081505a51e4ab2888c8100020821d0a0b63361894b450821844063004ff3311c36680cc05fc9279938138b339c414e3880afbb71efeaecec804016ef002db15baea44fdfd626423718ebe880401dd6010f309be7abe1c9dd417e98e3cc3b753adcb58f8fb64da69b4df6954c9c297d1ec98bff0f7b0ef8f89db4f371a0e2effc8162ffda7bed94d96030189030317c12872d2e32cc185923e50e294676982c5b0ac9a59a8d1c6292a584c1602afc4813c84c79132365bf66912ca51c132583f8a70e8f0e08b3ece15e62c29a3a17e46e8988dc81e92a625ef85a9029b661bc84f1c0b54982041b488211207b2d7bdb9eb20ccaae8a8d62d692373f4431029bfcf8bd10f48061c10d6eb8410c90c01811213f9e3539263ffea993b22c14a16acdd60c144262160a304240226c322aacf049999d5a8879451481320c31898e636d20d2d13c2676ca6ce2346de2f494dac4e9fcba2a13b0400465488d881f375800a302e48614252b416644b622455b84dc18628c727362c80d22642a03c06e298068cd56b843162a4a64b1f242873b933b4a96248cc8d2c48b24ae4cd08b1bdc0bc307395c9a1b865c9413183029306e23123e8c4938398c4e44318a995d530b3831dc0fc90c1fb8dd8a830b19ee69042c48fac105946b734749a221d55e80b99f3b4a12521049361843dc2f7794a42c2ec4242fb0580e6aeac8562a779425885a4bb557acc8d1e10f733f2b28ae3ff247822b747c0a8e2dfe562958560a8f6b4dc04b695ae155c5dc63ffa16354faf3f3d8621d8f2d4b87e31af3a79f748c8a6b4caeca99d18aca95b439dd87f45e36b7784c3127574aa10a787dc34287fb0aadb53fdc0659426e63990f4ecab55163864bdc76f7fb7d79369e9826a960f1be6e60b8af36aae1ee3e6407dbf4e1f50d0b22aec4ed3f6e83aca1dbb8c674406a8c104c62c07de34d164bc96d2ca7c441e99dd6ce1e8e54a526b9a2f55818cf6a59ed58c2ccb087013e4bdca3d216441b524a2965ad392d5aa7848b2eca66559424299a32d464766777766777164700c8159f26122560820387d8d0223ffeec0e47bcd793c58911a70991217f8b204fe495ad159f6007140c65b9c188177e2af5916badb5d65aeb10b533042830a29fbfa3180c29c84e72e068f2eb60554858d48f2d41669828aaf9e1e57a31a2f92166888c6d26489153134a170621b00922991b867cb4930e413c116c126412bf22221d0e2f364f052d58946ac871da8816645758883511c3d145e9080814457028156d40c85864051c369821c1d104ed28880788e0606244e11544a31caad150b8d9b25feb2c094c98e4aa88b1706d6cb872051e82d89e1283a231bb700205930683c18e44d1a202203da50363a6307eb860ee285aa49440cb0b5c50b95cee285a6090e40a102d4ad0aee78ea265091b19b4b828cd224c6389e90ac79de30548dcb152e852d0414787254ee1c76311e6be46c8d415e4ad706cf10a67e998d8aed0f1987ad8b9cab231438a9d5563b278b82f55b70a5f61a68e5f2d17a5dcd13da92c318feee964171e93b58345140fa878078bc96dec49a1e93d4154eb110cf4e8b0ffb77c3c010d645abf8ae90a02f36b4fffc71d6b8489232d0f0eadf4516b25eaf6705f570292a7016d93ba8bdce188dc12db2c16af6fa4cf8ce57eefb4923f3468cc90051357e220b7cbafcf7d5af54f25e276585610d79faf62ae9a2a06575cfd5692c94a12cdb062d34a369961ed1d8e533b9b7cb2c4e7cf4be6563672a1262e4dee23159a6489714c706b721fa9600308ee4cee2315845ad0eecd7da4028c862bd325044209181db81f0c421e6e97fbc8470b4224d73b7231c68710889323372a37dc0f071832a8618ae8c3f5721ff958c104b7e63ef211a44596cbe53ef201a3b9a37499511bb8a74295c245a3e570d16834174d872b878b46a3f9d72e1a2d878b46a3b9683abe3f4551dfd5c7db88aa48d009aeb9e3a2d1683453cb90728a0aca08e1c4613b2146feb8bd132de68477174d872b872b29c9f522486fe58438e10c1180c879e9fd2d9ba391ed235bc68cc9d45d8a31ae5f07a8073febb2b56b1b756e34da08a12bfc2b8e42152b57925cef2e9a0e570e575be92b9df4d2c33027c4e9300c3f10fc4cb7939886735c2fbdd58a31001f12bfa40b395c345a0e178d4673d174b872b868341a0d575351f46decc499aa2f9c2a3c2fec7a2fbd7be68781a9232fd05d5e49ac42a680219f913c94deddfdffff9d524a29a50fb8930419ffd34b7777772ce54bf9ff4effab1e67b2de75d6c479edeeeff56b777fa7a07cc09ffeffc6656c58ab52d15a2b5d514a4998f7b3dc8dbbbb4b4ce9af7000e4631266f84e030306954c316d3c95f3a8fceaee6e4b6baabf97af1cbeb057ba12bfbefca29452fa2ffbcaa189dc8ca59452eaf8e5b793c194524b29a59452ea81df077a4aaf97e9a8dbeeb7335fb9ee6a739a46536b28eabdc8eefbfa724f2f956259777ac78425ab9b6567284daba69452fa1ed8e0e1779f3add3dfd294f6d7116f5594ae9d3cad98e524aebed0429d64c1d8952eae269e5a03ecbd9f99da9ffd27f7de03bd269becc75758cc63cad0f3cc9dc194a29d8dd327786a60675bf199aff477dcdff7f8f4acd7c3b5d4decdda2391da331a594524a2b4d0d8a529a9ad286e2d777b516d72a3357ffdf4bf1fd972b255dbd5ab955df2b85faff5e2bebaee28a1072ba7b6581edb66ece4963ce3973e6f4e9d3e7df64efeeeeeec972ef6a55f2bc39a7e339fd954657ed7dce9f52cee67467bde69c73ce39a75fd895787e375783faffff9cf596ad7f73fa4c25c5e0e7513c29ab398eda315f393a865677ec4febe931f8d9dbe3563a660cc5e17dead0ee6581ec983eeddaf5ed9873bc9646e7bd3e98d8c3691f1242fbf4c6f3f0347926fbada6d723db9b2debbb9084d0860b870e04341696bda9b9412c83db08374f4b75c3803bab9532bae72439cb8194b21e012d63e21bd646a57d35dbf8367aeac84a95bca3bf338060a6cad10c3c7490bf07c9165b9e34501d2141fa37412808216a803283211b55e194ffffc3c712875454ca01c8145b8aa4859b2e2f9e40e7883f715552c5c95083235fc28f5a95e106a2039951f10521b38420e28b1c3822dbbe8d1995109bdd2391680890a932c00c63d783aa735a29ad1fc470054a7e61a32b5492ae8c30aa5c8162063e821a1331519d1626ae787de3b5c91b00305c4e04dcea9e1499c33cddd399c31cc7610018b935b738dc608bbb2cf0e3e66648cb6a750cae95396bf220777409c575b524667f28e7ab1a8ec3e15fcd9793c3129ce1309e3a26dce18a2f873d0f3768b2d85911086fa898a24409b2ad768616638badef38b6f8face636bb15d7140826bb1c53756646c599cfde1b0b5788696e369cd90c3ab2188ec0e5ead153f9ee1062270936db7188fb0a0851147a0c0d8e182b98f8ef03074bfdc4747720899dccf7d7464098e0bae29f7d1111a5ccce0080b2e5e7069c2e080e0aab0d4702dd20b1a2ee782704603c2881035301244d1f5dc47465210c28c14d9c8600829bd69fa899a4f2557396a6f3a4085bee3d66788ec58eeffff2d27f32f4ff3ffffffffddddbfcf1de3ffffffdf29a51eedee6e53edb8eeb6ffffefee9cbbc9762050e37777f76aa25e77ffd7dd0efa9ffeffdf72efee52e6ffbfbbbbfddd5be604de53072e78b2bbbbbbbbbbbbdb57afeeb2ad34cf39a7bbcf5ebd26276d87e7ffeac5a2cf9a33ecd56b26b7cb4e8b27bbddddfd3bb7dddddd4d83a3ddeeee4ebbdf7ac773ff5957a652777759a9bbbbf707fa40ebfca4ac5fdf7274e94afcd57274cc3fada6af6368fda1e72a1dc3d9aecafaf5e95793f7b4f6f7e0385a9fe3f073958e01673f06fe7e4f9ececffda9d71e88b912d3ff80f5ffb49a68db5775d8a1b5d60567bbdad3e451295d5c29c1126696ac3779ef792b5f1779deac6eb735752bef0329066fc870ac578ffc2c1a13ca4df8815352d938373ff89dba6350fa2c21acb5f7fe0dc2ca580b42ae500d342ee46082792f147102222345e6c8080c34b2966bf04f1d1f138d23188e589c2c13832c834f2090cc494b11f80211ca046c054e6ae311413c61e445952317828e8488744cf95b1c872d132d20c95c01321d8283231686402ff2a53c62416c2d31edac90447eccc18d122b1ce5aaca15ab00816a132b5635638523f9710a10e8392b5768e48a6d40a07a332b12829d5c71aad66a73ad15dffa43ae18d72752a6a88043814095e21a2247e4a7921fd38040bf82232235cc1459f98b45e6a60643029938a8d4ec5de88e1136400013170000180c0886c3218118071339cebb0f14000f4c783e5c5c2ea48bc3a1481003290a63200662180620c410630c610632a8ea08003bb571b1b5d28e6ab92538f456f188d0a93bc2db4e411b91dfb7b4856b84d6e480282c8c87b213b860ecba34d473f9b735bbfbba91cb070e27583551eb3da938d2af070a9dea78e31d45ae15bdbc4b472bb0e231cad3c4b1669cb35b5de25156c939cf179ee56638e10ccfecb6a85f71ca3d35163060397332c2b945e7be8b899d412132c255c1f44537de41fec2f8aa318cf66b4d8990abdc9bc6ec35b76dde7ac80fdc36a53e9d587abf2f40e01e3970815631636c60ab0a1156e1d4f90f3bb46b4f06b1e5cd616eefa50cb268764122a6fa3d35d117befc737f84ea8b99db2c2b047e2f1df8604004e03229edcb7c70a7f661750314339dbff564fcc0e9c9a593a0df6f6882278635bc7ad7f242e6bc7fc8b650b4fe4b03d8bbb5a6a20cca8cfb705ff2d320d58f8250d4e15356a630b331527f21d78f0b09784f078618b31f88b506c5d3532bf9d045cc023420f54490e05374bdc7cf38d30032a38b8a40b693497c3e92b0198836f00edbe47f10128bc16a040f0755a466aa3360164d6d76a313e9451b5ccb67e7a33897cb09c30f710a3d73ad16548444cb207e87903444ee736dbef78077cd2f9adc6e9d6d3ed530e1a06a5634c4d4df1e24d7ea482951f4d033d2e2eddd15e64dead564dc9fccfab1fb39bc2e9c18b095510f64e817100070a66a3277ae0f11241a121fcb9dae7e9388d17891a97f1a180b4c38bd1126224e5b5f1888cf60c1c7c3f6c8dc5c77bfd82b912b1b53194cbb4a049af1ed9f20d4ed3bb4663028c538739f5839151ced87d66d92105c67058f6ac9c9f2c29ff0bdaeac1800e4455c7948ca6556a6abf7ff36e1a195a095bbf4daa9614e0733785d569c6900a7456c9b1520e50b3485d0470d4c4ffc09715281b1227c1a850f98634100e43b1cb279f1ef91e2a0a7458833734d31443a01cf2af6409bd49ccda11d47271ae8d5ea0e2b1df7e0d5b9e358ec19838921dcbd474a9b967b9494b4fd6918deead420956a79bbc567fa0f0f1736d0a0c00ab61bdd61fb4dae7c1c1dd7fc32c05bbc67e5e4884425336fc30b1fd3be75c93ed4f1222ea65960f253ca2846d2c0f4646142dee13f2dd0a4587877bb31b64186d40d1983b70503c40c61f9fc363133d3bacfb6e5a6d6eb386ba0c6d09ed88f1daf1222abdd5a1fc352bcd6c50ff4dc9dd38c2c09b5f1fe02413f3673684382a1dd44ecf827e7fcc956669913b75a0ae217bc764f8efb0a243667170f49b01417109bedef089cab7c89c627a9f7a7cd11493dd61ad6b4764e46300cc5ac8eb08f3b448148dd44a212f5437073bf71efff21b519d91fcd1729f4fc7684d2824d965102782691e37a21667a4a99c44e0950d4c7229be3e1faf9d1031a03029070b454a7e32543bef3069c915bac9b164dfd320658d64a7573dd8875b1376feb28e972e1266fee6bc5c75bfb808279c340a64e7c16e01d88954b8a5e38e6411fe04adcb71e5b9b20d20001d2c3b3489378b067930d9d171d2166ce7b6059692dbc6b14fdcd90ab2ada6cbdb63c0177a94aa6ddeb62a3139d49bfbca036d955ca5d145d29616274e6074620e8250891af575cbf83f6842ecb19b97a1e8c4e684d010dde9685cccdc21916e103fb0570e37e309a892693f9af27a698227b21cf152c854629ca0b34cc9a11a5b82278cab805ef2a2fb4aef2a3de8f203ab31848683d4360d87393e574bdef9e349ee0a42f7c1e13f0e620d005ee4364af3269467a237b46bda1e525da1d3df2495a4cea457a4b00acf0597da411502a56c7e9d3cc79a3f1d3096b2ee52a95aee1640880977a17450e8546d5ea6f0808b0c8f95c8815b50ab034236e2203c299503373d5acb9164df38d7cf932b14842ef4986b174a9b2e4b87f125d2a8ffd96d5517aecdc05c5158177925257489e9d90bc2cd2d0a534717bd0b2e8f6d4444f5464642f883294c9468ce820cab0c1d66012be6bdc7e47b871e7ee9bd53748e9f69a75a1895a1ead7aaf550686e75ceb529576945f464141c587a4cb3204891a18e16122232c485208b71c93edd5ec52daa140c96dd4f0b30dc7845f615e34a5a515e7cdbca068b8b1767bd0a3711205ba86ee9d3466d51622022cf2c34f7df617bf6e2ff800f9fe85e708b8417cc4e8943b75ab91e2f0117867ceb8c38142b34a2ceb90167101b8de441a66b77fd6e96f6f826d3006654bd33989cc79ed8582d574a764fff390e2e84a2aaecc89409f8dd638dbc1c3b482b9ef0f0c0505acaa620c53473345c9b22df075a3130245c7c962263f3b1911645aacfab545a1874317034359eccc515a07d2021d340647c1d7cb00555ec111cf988773c93042087c75c7cc67b354c5d2b3325c5cc260cf05280f81744499cb1bbf2556b89e3866e94f2fdcd9a112cffc07d51feccca81b3640ba1224109303432c4625229f5e8d87c620118894ce78261509d979c5a7b1285229d5c3cef4e688978c40558fd2b6350d0c15359c7e58d328a8326c6eca1802fce969b51ac6fea73488359b3c192ff8a0ad9862a79f2cc9463e5957bc0008058878fb6f122f4dbf4b649f0e61cfa6520f9df547ed9cece0d4cdfc2ca233347ec2337e9d0bb503c31b3c221c7080c828dd2b5439409105a0ebf1bfce1bc31032d85921c6443319c7b75c39cbd2729c9d510ddd074fcf1c422cd6adf9c80a7c3f4b091a699d1e5bec8e3bfab5201c630048b68043c31f3b66df91beae21889687aed006a7d745e82c50943cdbdeac4f3ebbb56b81c14922723d8f1e163ab24604b350a78632168fc3e30a1ff41d0073f52684cb9f089405181267286c475c016b33f306eda46ac0481d4fb529ed3c348860a38e373818b30e32f97b8bb124a366264276c5c5dd345b9b1fbede1ee200dcac8e02e2fee8dc9537f0c9e715fd6f6554e15ff007cbcee52bc1cc1e088283179a5adc121dc5e240b593518c8defdc1a41a12ab8ca33f19833ad77a39d0d80c2326f993ad123838a40757650782cd4660d175a2ec5195c84a008d94d24a6c4280f6eaee278807d2de44401291366e1ffb067dce109852b637b10695bd1226258241652a93be4959341cb5131f29e57c7ff4410f8551044860963b1130428e467c38a12858bd45a9504565d01f6ba0c901a2b90acd357d4e0094e1bc5e08ee580141088ea9d41bfd321ee81d8b055e759ea417e1ef71aa9f3eaa2a9d730b028a003cb997062e0cce01c6842ca64c94693d1a10ef3d0ced97afc87991acf5cff9fc785f2a13632caa1976a054221de0d73272465f2ca3eaf7f2be160f23a6a61b8a24b5b6b2283ea1ea3bf40f20c75d8de09753543dc80730bb09e6df2515280c52e3a4d0861da1ccf871f04f18a15cd8b00ed03fa5da1a527bf617a5d1e071bcb33e5f66559a8dd31801770a34e0acd35cc1882befbfb885f41bac8ce8e1bb42b18c16b5d28ac308b12d90a1c20f01c405c8e8f5c38a8e3b09bb614d92bfa3cd07b5f55ee47073e6601423ae0d1cf349a2eb1a6c3bd4043e8b156d764571a3b1eba08519a686bc0ba4ec4af54ade220078b463b1cfa3f5051854869fce246e841b834ec0683c589fb5bec071f3642bb2188dae89042bb2cae7c6f76cd42d1054316ae824c36750f883dd77d3341c56f9837ffa0c86500de8a297ab5621bc4162ac042093f2349de0dbabe6e93cc8a00978113b173012111db42b857dd4c08cadcf8a9f89443f87e9a8e5f46a5a5ea26e805729e8b8fd2053a2b84de1f9794b99dbc9c076c166d61b321b68ac2ebae1343e839d7436e9b27873c26988b3b56eed102b978223ede406d382c081d5458164edaab6c6da1407a417eb380dee5721459c8e641d68a30319bd2ab71c5487b42b07d183e763c98001f6d913e2f1a2aa269bbf0a462c8c10ac7825ded2b39c74d3e2f344cb2922bc3f61506bff128bbbab4e6a70257b0a5b5cfe7ca82c838bcdd291a078233da2638400e2b1a1a1e592ca09c584dcda74a0fd30ed18dc5121838921208750de5ebb6442a13e42127b3881d997329bc0223bcdfa30a29430c59b430f5731578275dc7a8b4e50e2e77d0838cf293122a9a680197c2e03cb49b35d70cccfc043cb5876e4176adb22f4905d8bdc2cef495263851d456c36deeb236c50b70cf770b28380ec20c2f6b9f9e4108759127261bf535613e42e2a3767e140bbbfc703f919427277591623c6141a4f50583eefd812f158edd7841af0d01316d1bc3e8631a501883b7328caf40244e9f005bf83c6a7512a4f51ee94de344602d96f05140fd769a3c351ed80d9bd7030dce6b9c0e913988a4f0b2db1dcc8feed0dd28253b91e57d19330738ee82f9cc5890617a47ad0bd3d229c701749d200d2eb8063867707fb3466ae9a72e7bec7df4e2baf69bf5f6ea0de4072a8c3280e008afe7617cf388fded2bc9411892cf9532963c4d4f0a888f743a98f44ecb7fffba61941e9989f0002fc604a06a4c00562c8462ae47d433040f0d1c90891ce0491294c4c5c985bca61919ba3127adfa366db86b6ef2433397c862ede49572217db7d3b21596af8996ab62446dd79eee7239097707ae3610d7deb6435c9bff8e6d565eb652904d46badbc1f11e393ad78ecd64033bb1594921301dc629dc529fa815df6601c1eb1fcd4439dd9a409a59c8bfba4990940a014137357311a94a5e73ee3ff18abe813048a9e0d483926f9bd68e3d9e5490b35140b0bb5e31ceba77ff8396bca321f38b385b902f493c3a5b5bf7e9afcbce86fa1e7cc3e297270f6a68952e9fabd6377b0e946901ad59895ef6c34dc4aa56a899aedf3fdc0d14d616fb08a5ecc89d2b333764c38a07faa87460d064f557512717902b37029eba00d92a44844a117b8374d5153c65346b3e22ebdfd1c20bcdf030ae244c1770ddeea3a86995bebcc219107f897339b5269ec8e7cd46c53fc1b0521b36f3d7c94db3e2675aa9ff644b4d8ec76b75d84f9f4ac72cde4a7c4e034b2107a7081866484a7da76656423629593a7ca81c1e9481d0d41967e3cfe00b44451936e111ce5ac1c2c64bffe56c05688cbd1a1be7a025db666b0d717ceac7e7f6dd15347ba1ea26f8d3221e68764904a5d1ac3792eec48b8d652a0e3fa21a4eb727717638d83d3043b3e7f4f32560439dd21b809d36ec81af37ed0b55d1b89a757f790d1a397846d84d5b46696a3bd6a6d12bd68ff7851486b0db7e628759e7e297239afcd881d99ed3234e4a13de9a74441b28c7691985d35ef3d06ea8b388adcfb0ceec20831ada9eb4e3f7e7e6dd1af5c29b9897ae57dba4e4714a3a5d391bb49c7672602934d403e6b483f49099910ee98983ab6eb252ba4267ebe742cd6cbde53de7b04cce4cfbb227c4dfe72f2d82c7d65eae4a7e3ec8cbe9afd0f97d1a2f56a1130635012ae1222b38d216204882ca83aa80131625dff0abc2feef24b82846646a9ea9ab2af577da7a720dec7a8afc11a70798c9fcd702503e217f133a1557a6aeaad46f3f2ddab59050e300515f8e4c9bb06a4644579f066dff9407293003862807bcb2caa5d618349f7bd81299fdfde77c1043f7777e7fd5a0ced70cadf7cbce5588020a266fc1fd8f6c8ecd0f50d3d056eced0e95c5e6c00d8b4dd0448adacaf0e69b5c067607177c61748bb37c4ad6f02eb6560146352417555edb29d5d1616a799ee5c9fd5c092ef97f9bc92646a9ccae6bd7324de5812d5d5ab96a29b07aaf86a66ff0b7e4dee6fc8d26a1e92e2e317991507a1bd22201fd552177d1e7addfcac2d686330095d4be520e15e94cd0903b5b9b1bbfa03edd82dc1871c9d12e8ca1d6a4e6fd337b3a64db7fe896f2bd2a525899bbd62b6770816c21cf0389502280194cd9f91c39083da68306f8567e6f70adfe37e4097225d8a57b8edafce75be8cc88dfb0c4118ddc5df05c32d406edc8777dd0e459e4995d5d1a5020e38fcc2c3047f134023aed8328e7293dd1658bee72a3771b40f9036cf06c8c644b5e5334dea15f3e991bcf92ed441ed4081e5a1c1fb9396dc9da999c6caa5bf237ad0468633090dadcd9b6eb53a635d3d92e8f572c9cedf4076e34601040c3797fd1b619c115b48003698612dd274322a0ba5e6385c499cdcd04d7d96aa41bcc5d958f03677d18e9e0c858c7925b4147a189c9909f24b62f1855db48278587d726238e474971208fd2f23102564415f1621c31b5ae7020799b151f659769a7e71f01baaed61567404a65dd1c2ea7adc9550aeffff50292fc1161f0b104cb161ea6a704aad0f460b244c109e476304daa3c2b3898c466e574bb6b08a5308e64c2e194f3d050d85b81ab4219fb074758b2bfb847047d8dd29fa7ae882752bc52570e8990732144fc371222dc249cc9acbcd1613cdba85355700d5243166ae8c798de09341d44041bfc8e87e8087af7ba75aa7d51eafb78e09bd1740d58138b81f0242c2cb2db38fa7da17951fa94523bdada8a641129395ab908721a50721ef5482c106fae070630c3e84126f2e7026e2cac916608e2c9cde19bd584076d4e58ebaf2fa0e416a30058348322c48336798a719bb8ef477d4d5a8106d437baca5adcfb22ef9486b7ed95a21fd11f5de0d52d56ef777b0f86faff9bd024772878758fe0ecd4b4906ba855af06d2cf03f74d715a82999b355edca070660d5f4ffc81d5cab272f1f3f803edb52dc222d207bef40e0751e28314f23996faf2f444c7ae53d6193bb016f9082fe5f724f903710fef65f740aebd792c13a7a45a1fa03e6da6f334c5258f63d4cc66950ff56003518be09529c1f3f94197486ea0ff39e67c4cac99904fc4d0baab43c29e2546c9c013d50cae6f2c49f67a528cf309083eb0c44671c5fe34541f08090dfbbc6544a650d1c8db8d30eca03e0eae5f27e2cacd570311733551af20eb8701fb885d50e9838f154f1daae4482deaa00119cfd741fa0953135681e38c633b0c35c4b419830863958d5e895f8f14616d5c7565d4fb6404727bc2606092825728b4865a8bbc548f55954552e1aa0a4f03930a48f64f8bbf242355c8c5f7a288b81d4ca01020f1799afa9cbd4f76d8d52651e10956d0aa1720528924bcad9e97446a1dcc2ecccd12493477e6994fcd031647126bcba93b6d09f80ef115d1b8f5652778a10ac4639454dfabc77057ac09f3d69b3e2998a63d0b5baa4fd16cb1d8cfb8f9f8fc496ed431aa7a5748605d6f74eb7c71aa5eac94662cd0a61da51a3eb3240a173821c467965f81154a185713cc1d94427a9284467750a918345fd158c7e1b30910b84dc5b65d2f8053252b006cc75785abd70b4263d62a80233ab8922ae393216a9d8a5674c12ba44111b3ccddf2a7b02e22f6ca7e5ac943ad686f0a4cd76c5a826fe61fc45a676c129b8383021bc4396917a802602b4271f407ab4978046c92c1ff39692fc6bee0e29c46987074c60de4820260195e75091838e8dec05f427593b0dac948a1d76c265f0489d4f68ceea602d18ce71506212d51f864e60c1ce9f77eda39433b7bbf1a0b2f280cd9d524392b4ff0222fe8a62acdd6b36c2c2a64c07b946ad2567cc2ced2d0d9e1e3d6a56184c10712988631762b92f137d3fced2037807fe6d21ec72827813d073f828a6c3b5bc573dd7a60d265e64dfb7476ccc961827600a891e58027bb7b8f044dc299d4bb0435902ef03b31fe65845581c192be887c17cbaf7e9ca897c250127141ba4c5f76c0a3c422999b39b7b52a923d0870078d55058891277ca6b3504582dafc146418a77c22c0dd1cf99741164506a70169f1855135760b3494832766a53947b33bb40d7f656b8caa6138c4e628ed40169c036c4e3e2386ee31e0ae55852b5a769c78a6e2a9f7dbb6141765b01f0502955608a78a7098ae16e75b19590c20a47359c6a144545628fc390d1c8596b8eef54ebf11ec2ed84b0fcf34e784a65d72f7a592c16cc4b693e6e14f0868417130192a5cf2323aae6c51d7cfe710678f8c87cd61d4e2be5c98af5311809b45be29f67eb5e30d6c9c6a02c5b5b6f09395b5510454600f6b673a21b2a9c50f177cafc02a20c63e23d06e898f8fab8fe0a693c8d3eeb800d390efedeed045a871110b5cdd158c8f0a0b82adc973fbf98096d0ac01dd8183ac7572251fbdf2f2c71a8306ecccba9b430027e74ad1f5eb755152d5bfbfd4ca1aed3e11d7b10e117f51da6662015f828b08a8c16f1168356d79a7a3d2611fe5bc0f0876129fa873f06c5dd54c6776ce2060883d41e41ca63c08141eae13a884e2059ff6a73ad63e01c127a0da3a4587e5b54ba8ba97465b216b997b6dc1bba316196c69d9352b10bdd0f94684bb6e95670ccaf6d5002d915ec185c8a6def1dd1194dbb7cf828ab5f0ac445b23a6a9e87e407069a6a5a8b06eb13084c5ba02448556f6680497be2e7fcac45743a4c492b69bf053a5aea7e28ca77b1cbb7a63c40ff29d5230f1470f22c315df38e99a6556ae4e8b6e8c39c366a8a96fb8bb7a8a264ba12d7e3d0bd689b4d5c3e2267adf52fed6ac145b50640ea6ce06b3e63245a4fe4cdba64454b0e182a5e640d50f39cfbe1e064a5e0d24fb759b7741350c8eedf6a4f64bfa7007bcec918f2b203c8dd2c7f4285f9a37b3e49a604ae703eaff2c1c59de380583e815a07585faa489448890bca0092ca8ac6fd9f9b93a9ce647b864f8213447ae2d045cef5568e5fe7c0229e33a56bff2d42bb75d1fd3acd9cf60ea464fa8aeacbcac788d094219caa9bdaa04904b148401fe2f010c0b5698a438ce50c7861b0096fca4aa3f871702dfae180c8249f25abacb8655612d1449efb10dc98bc1665c2fe33ee7f92500c2ddc59418083a4343a996525c044ee8edc0be298bd13f28be8561fa401dd0ad150530afd1108238889e9f5fa64f25a71bdb08e8d108e82888683d8ff8baf82b4f1709109e927612d95719e402c2ba0b1b9fcd1fc5bd9fd9cdb18600a626bbce6dcd9653a84b08eec2191420524f6678dcba412d422656b898eeedea9d2f2748d57c88b655cc3c31ed054a4dace0a71d7b4fd51bae7752b81311d65d42b7ede5e3c477845f7a06bffbca4b41e4305ae1e4c428ab7341e03af9a0b6ce8ee438b39ce09edf48025528c338b8c807b737080003a0884764b972dbac5fd8a1d196b480f6d5f1d9356a206a25ef7dd5504b46973418090c0265c30072b3ee3344a6f18d3d19cab8df175db8b3890d88d12cf097ea8e2f1543c1a0c06946f556b3c23781df1af9ac3fe2dbf781e09c614a10697c1096444f7e0da43015471de4d2bad04eae4493ca8a56f6cb8a4cb78c10fa4b138451702ef10394d19d2319a05412bb045efbe89a76e72b7dd9a4c0de56367ed8b2fd1605c9e5a4b7b5291a8cc992d2e2810246c8f747b0de7f7992395cf66dc180ea9e23cc14f5a55945c28e822cf1b58e4c7240b78b22e4e0973cd5726ce60fe5d20eba9fb791a036c29aeb8dfb13e22ea42418b06fbd28566c9746891fa8b388e8791c48c000b868181b06d06376ab1824ab776fc08c60a26c537d49d1f65d2d4f6830af29ef5b1672d0ef57c33f3fe19588efa84b41b71ebcdc6c474af7db3907f989235fe93297d39a50c528769dca711ea614a4f773951a3d3f6e1040ee7df39d6e922ccde0e0a8ca9aa25e29e03e8601a4956f4eb518588b727f21bae53405946812e8c89a32e8abbf7452a6697e78132994a47d69f6901f05dca76e278121f5dc4ab2f9228fa2865b47e93564094e39546ba2dcfa9920b84e2c40ce523f8f5dcfd91b25729b4fdae63ea89c7b241e1c596999fcfc03575cbd39fb0695d55d8e5152a58a1597eb72981311e4b9dfa368b8ca33c78977b54d9d3fb7525162866409962bd7ea34e201131f8f6c21e9a518e98fa4668f1dbe156cca4771886439bb43d4567ddfb34cb9dc318f3731c24f82df80305d1be941461806a6670859c3fbd984d197d53f253b32045021f40091dda44c0175408d80b235f82b40d708bf5420b6e1612c43bbc614c394a8056e818b82a0fb0645e94fc71411c6067aba2cb208c3b420e1cad140f112112a978947b8202353855158fca35bb8a2c201fa1ad233f64e8891cf0cdcf6a73b12da81546f188eab38bc602850d241a538514f839d01ca624d5a7b05496136a5a4a80fbf105a3303ded484e83f2e380605eb4162826e800fba03e24ee8082a33e003748787b10d426d980a89f21af41144c7d85cdb6af8d15a60a5819d31658226128875c0aed86a401109c64a37565b310a4306ba89614ad0d895cc682a52dbc0663ee9845e66e46c5ee09542140406e70a9c80b40bc92905961153b742fd27cc0358f9d22044411da85bc8dc264052b8d13e3be0bb9fff5be8dac7006c4165f30f349692ce70d6723161e0a716c2bdd6c29cfeac2468d3c8e81bec420dbc1f82849155b98a6500cb1db90c2a13fb8237578424368653da4bcde9f95bbae556858a874b739ae2ad6631a0955ca9247614b59e083784a6d777e5f555f9b1a0490f623a95dc651ff8f81ad093c29d208a832dd5def508bc040bb41d2775fc1bb80365efcc7c14911094c1865c6b9ebb71b58c02552149d21db10dc93f09043d9186996c0af98f3ad3a06713c45bc3abab2590e318aee9e0db39a807566fab1a0e17d8a0062d935d08d59882462120599e6eb945e714a131af453fa70f40584ae71d703197676c62b09afc5bec59786a72db2657265298f89d7f3d5d029461480913ed70caf81d9f31cae1495513ba0b39451a8591dfa0ceadb989d6036971f24c2f75d36ace8b8f298413dc459b9a7c74ec1f372833b21cf0f88500d4d61d930d0de98472abf6859082f9beab109e7b9aa24f80f67e2d273ff3660ac2ac265a037409cf83bb723840be1dd83a47b5946a12a07a3128448876cd0d456554e4a2c6d211009aceb63e86c0137ce21cbccc84c23d59131265004aade2336d2fedc26a1c2a9cc5aa272fe0cf5f33d27a067eba590e0b719e646292547faab164bd0c24d5a85bbeeae1d4ad72155f40cd2c72248bb0a10bcc284379c751a96a5acb54b027bdadb032b2ca0a54aca352b6b0921913fa0e7a0618c5602ebd6ccae333feb8fdc343f2d42f3aba3f411d69d26c3c5004bf99b3bf535877cb58f101d43d93daa296a94bbc8820a61569671d65e61979eac9f2a86a2ddaeb501fab41dd543c742da0e4527f04000a1c48feb4d10bccc079c4b36344416ea0948dd4bd7f0fdbd682094910ff468616913c01b2b07850e81eb873128683e889d785589c3c0dafbe61b2661f1415db244c18cfac9e30e86774b2b19e0508f3d687b4ca86613442315c42f1244817a7eb07aebadb654b3433e886534dd3839a6da9a58dda0e68b37dce520c9ee66b8fcb8ce6361c8bdf81d950821ff46cc7b40f97ea5d537e578859378357420f722a3420676ad204a8d619948677d93085936cf314a8f5bf93fe690c4740af777268f6ec35f0427b45f3cfa6da2374ca57a03ccf6df6b1103388cddb623884acdc4de051515d958878757e1125044ef03c9ae121ed95b353b00efcad93c6dde70bf12a077e7e227f01e2b5ebc00d0e0bb59617434cd40503490e9ac80f32265cfd297efbe64712357d5027a021f05a6c62081a890012bdad8a8b123b1a38ff706c0caaa50290c5bab95294c4c5c1731831ce932ee11a59f9ef712a080343d08c527263286cbc0975a4965e23d37c4b519cc4a05873e0376443fbfdb0e5d645fab842e6dfd6950389cd7cafb99818b709ba10eab352f3946bdfbf381cfa0e644df698a535ebbb98124d42d12d2b86dc702eb21902186cc0ff88688cbe46f1be0263ca1762029b85414ded2ff7010dfad105920f77cab0d7f4cda2c2630fda6d469ec3b904dd1ac5de0e623cf6a8cb46c709016d0dac2e5bebf3c0e458bd6203578dd9ee112a57b4915149866d828525105ba01ceb9f21da4d9c828f28eb8e0f5f877eb362c0bda0c6d117727344c2367b10ee3951aac6dd98d2759328f0ca6a99e7ac7d20f361fca569d8982d4044a028dce1d28bcf18d548cbccd50900298914726dd6b47200331cb7cc8b519061206db8b39a0ff8b8e6a261f9134f23cdd44adfa5e30b2c7fff9da6e6c6bcf86996a6535df054f3b58029f557e624d0d08bb1a8ddc1f195a23f4ec51c69cd7ff81d4257ee3d52abd59dbf4e6233611d14d001dd26cd1b077ee3c5f24f278b34e8fe201b830da21be340fcfa2d17f39924e569830e31f6d2239f7a09e3b9ee2990148656787baab78b42418742346653ee38dae9da3e2d363052ff6d704c7f667852f25862069e583fadbb1690df6e4be619764b1ae7202e9b583683ddec99b2fa1395e3271676b68df627c67d35d2774a0cbd91f65a021fa06aa6aa0059e3d9407e79ec8fa2941acaa6cf0ff4af99226a0dec8ebf9f3cdd36b099eebc434b9b235a519367d2d220fc2b96e065d4a348fea9e6cd2523c3a56c2721aaf8f51bc270345bae13c2da86b3838b8e2c7d708473d1f2729958c95aa65143a597c9d2e4b74eb82a6ed184147de7dc465c2e2a8a84ff5a0003d1e1fdf17d1458932a442ad009a2719a2bb145b3baf82c39858b5ec5ce8674599fff3828a48a3ceab0df7e9d86ff04d6fa7cb6e6bc031c2aca0b7310d090d812372faad95c09b55f28162f13835933c3b46a998600e87588ede951b513b77a1f43af5ffb1eef6801f4b93aa00e362310a02ba26d2dced2754a19156d7d7c246cbc939a6aca78ace58983c035390836758af77463f8f9fc349cfcc27964549dac7778a658361d84137ffa7d46c4518caa2dfbe738f7629abf505936121feb49babd1ac44ce3275a63fcba3c4c6b0d3fa99a5baa69dea226ee5b6d4fc5a92af6a5e52e97b135e54dc89b7cbb690a93b5dfe92df775bcceec12e88bd322e63e7200d213a0a9f3c4e92d950d63051b65ed3f42132fba7ccb62d39d5800f28158c2eed121b3a17fa7d1326584537390aeaae48f5d97cf95d3f584fa274acfbbae2a5ecfaf0ba6748afcfbedefc419b62b55e2efb49dbaa3770d25ff99d2aa31c67ddc7d5ecd8f38f42369502c3874e2d7beddc255163b98374571302598979ad8b2ff1524934dcd8f226717a37680e0765d434671d730f546be0b3f91a17a78e6f5c7c707297950a768ab7014d39b0986a31bb9feb2d403567f2fe252cfb926c1d6a20eb6f6e74ff8c11c7a06dc871c0fbae4c48bf59aab81557ea515661f236a4e8dbb07b38f824ffd068b786666002b7fb9b477d457a063a059f9a0e0110363897dac74d98adc34b3fd1d8621b28f992117bf00979eb09749c50e2774db1efe390935726f1a32da030e7f717da7b12b3c375490a6741e9edb81045d994a0a677bb87afaa66c4446bf55d68a1a11fa55249e671dcf97cd664ae851cef4552332eb1c76c1af25d796f495ea10cd49ca740a95dcc4e6e3b49e899053d542bc8ffb8441d335228fa17ed3b5251a8fc3590ce1fbdbe02135e831b30becb6438614d5fda70e74e730777331f43efc9a63348eb8fd7662b0d97386d002d8e06cac2354ce136bb82b5619ccc9f85df17f630c783912085bd1e259c69657249d72835db4005ce694427d4f0d5be59491c8ec4cf0112acdbb5b8b60da1ebafdb377af7097684703747f45f63db5f62e0c5403b497349d457a7dfc1f1d72dca54b40d38fc69f86c24f35f13891fee5b466f6821b4a0472dee3333a8c5d5ca5d1f0c18ade7cdb6932d9c75eb56ba342911760349dbcaf84a98dff196a9ddafc2b8ad6d784da52b1461198fcb2e318f71580bd217b628e8a119fba34b2219504d3b0ae0d39a41da448a85f2474f35462498f85321aee754e204d2e05bbc1e0d4fb167c85dd27583ac18f7ef81268bd220bf2b682b4e41fab524c55a78048aafc06934f9c83d641afa8c4e42ce80445762e5b3db843cc681229fe5b7330b50797105598237cac3a4235c397d81e0b6d22f4cb7c9c9cb341c1e7b494b9cd48a263b27f1cf1945ef0b44f4fc8c95ebe4fa0e6dbcf663b1693d8cb636dc7d2c4ad5ebef3c35b861db3d257c945e2ae536ac32de15ecd5369b8f1a254ebc5f18df7026cd7913706734a377ccf79617bf81b85f0e36776db11cb956dba76101a033d42e33945ad70fb7f1c6be0b9af58444c7f1943c54b3d485ea095feec24b208885e10dc260a5050c889fb21b68280aa67910063523b8ef200ffb1397296039e22b5c9b46cf1f48a88ee9c9200de0e1b98b8733922c72f7dc615f62d6456927a7517836f64c98143990bba0905980acd21df42b0658eef1e6b7c8602fb0ae65f72397c0b0b47f8474aa43fb564808c64df422d25e81d93bea0e04b646d644ff8161af25227172ae54ae674649a25f30a5ff42a92536c7c678a1df5e1ecc35700fda37599f7ac4afe7c2b81062b6a375f4e224d3764e1cb93812caf44508c5b4a2eb3eff02245f3803acc018e2ea94da9d17afe89b067f96b5195943c3392b8816f3b08e9e1c0b7ae7669409062000491bd344303f805133b314417c91969a181a339cda45a721404d16ded7dec0ae7e9bd9cd9ea9810c70a2ca6267fd602c27e4119779102d1e3cf98c9188111f8f60b4a85c14be980a14f31873567713f6821f3c5d52c5c9779472fbc0cf6374a3a5bc44d91f8ca6c85e8d6d7afb5f9bf7d65302460a01790d50f644db96bb809cac62b42952e0d7917983166df5396d739d6e871045e369403c518413586d8b27c3d7f350b24a83100c70dc3859455671e3679a5c9c092e15cba6012882170131a7022fcc1b739cd1051c018e1975274a46664e82583d57798dcd4183ee2fa6080dcc7de6f987979db612c6ff4cf1d89b76100b7abafa91a42d19151886ce07ffc557a49f9dc49229a889725da0bd10d60dd5246977b581e74772a33774b06ab9dc8e941efe114ed7581c616b66f0ba3a4dc05ddf48aa372d0cbb53c1c44596bcb14637f5e1121a48b14b569e6b86bca70bd01fb4a3a7277eeec368450d309fbe98ca9ff87b2c237d25d5a4149de38a5be1bb17e7fe666a068ff156d7b5b0cad2fef355fc14fce04e2496317f82db4727209120c0f3a2fd8be93e0775cc3c6a6761b8b75e37f99d4be23496e5708b92267735723443da89f0f96ce450360b9d31d1dfddf48055efd76941f07f9413e86d71c5d1df2e1324cd89dfe84028ff0c4be4a36d4b16eeb364f7efc2af51be8d1d7eb080bbe41c20a01be827d098f00f0bd1c52add0b82dee12b137753a71baaf8c30fd14ab81f33402690723e747e894b0f4a3c1d3b3050ef9f669c3d1da11215de238dcdc12381d8c65b2eddca014bea6d73dedbf0c232ec5e8ef5e4e786cb44a6d4631a99322d9ffe0c3495c196a35df44d56506448f1f1739d5dca53b8fccb3819e7f17f7673368c8b8048ecd4e3a6daa1072d75ed32d8bebc5c49199163c3394d926e24feb7106fdcfcea91599fefdef18d524e90337a92d9ad1586545c1dae1c3df6e040dce7f55a9f488e0011a36fe9460f8528fbb3e177127de898afd0beb6927c13fbb4dfaa78617b8ea234574b7b905bdb0f974feacf00be10cc7e0cc0f803c0e1e94031d30b37793cf72027675505ce053c3d537ce5b74c9b55aa9a2fade9faefd027c2c60d293d13ef0d7728680a70fc8f419041c9470b558396ecd2ceb572221bb3a7598339d2abcf1001bb59edba032a8446954d5f42db8fb5485f68c626c60feeb555da8df251182fd708ea05b834582f7de84012ceb40dd15bddf0ad3f86fe4de17585fdc5d952832b995316fc396fbaea639da06c606029311fd9251797a4ae870d137d329d2ee8f33bc59fa6c755f87be7e3382409c479c7889bbbb6760040889297f1a065469ebd96313e988aea3372293bd89b626fdd375a25b1fceecae324cdcd6a708b53ec4574252eda425044b255c78d5e21a3a1c29daeb68605c8be2fa4dee0a026d1f80ee24e01bda2eded0d8e1c07c0a3ee8e80784dc22b846d7be67f81b618a4ce7e186beb9f5fa6c8daefe87c2fdf58691319f0850ba2df97e62411f732b3e714a85c46dda776c869ac65caf1a74d493f55c7b1d8ee15f0be33e784fe7174b34ed3beeafd92026445b84eb7979050c0b2d16733cab7a2e6202459d61f9053746283a111294e593fa454c66749a7254c150bf507565f0ebea91417d6d20187ec42f5fb7ccd77290f46294acbfc67564d0242569c3090c90deb09200ec87d86ae83b83830960f96b5248e930bf753a9d5c19f59a135b686b42df5bcbe7ee9a9ef299b086c72ac82829e8ebbf5620d777324a5f94cb1cd57afcdb4fa9e3c3c4a1432aa1a3d826d92a3671cec4262104b8d070bb7e7a515061383133f906604a072141fc965bf98de1ff341069658013977dff786461b3b13621f27d4b181adde0072d163b1572d8ea08d1529612230a3b9d39a8c5d83ffafc6e30576b7796377da74a31a985dae10b0c7b4dc9954b3f7ec3313325c60ac4920dc5d19d93e5798189f7575938d7a4f2635e635e7220fbedf9f0356e053f4bb4866636ddab29d13b2eb767d71fa6115cc85b492ef5d7452ec4399c670f00f9b453dfac690d1ec00080b69305949de57acc2a1326e66a0078191fa68ea255b76a1357456f5a125187b6831afda8209ca31716a06d782e4ad4f3988e0dd2202ac6e31c3916edb999be0a17fd97a38e4e61c7348bdae9dc7102de2b788bbcaa36ba7221d3bf5a2d1afef867a39a1f64d59218628dcf9f8048c942aea766a318d86c902d31226baf33cfeef09248a0a4998054edb0e98c3a98b87d8f3abeac04db5751e6d1cb6ec93d4d36d65553700c782fbe25bf44f9dbfea94ac227ce586521aba6ade6c4a9c9be4b4f467ecd151f997c7c6255b09abb95098f0fc4f56233168f9a833ecfe0c7faa7aabfbd7573ca46f6c23d2d11dc0c51c61b56557cfbc10501d05e19c860f34f810ed214e774dc3c2be45e1a44f2c7e9538a622f821861c4c92fdf5281a7d0377a7e139d3cb9584b921176745999a5aa9a9e465fddec800fbc3e54c417d6402f525e9e157cfcdb6e864f83c8e0e96dbe54efb2ee0434485c96aa3d5fa1420cf0ad78ecd2943af11bf5f72269e5a64c879bd9c4f005dd5465c47dc4d13c66428042f9dfcfff61865a926a5032501cc4853f90b9a23ac75a23a943e7d85c51330a2585b43077489602a60a3fa82bd0edf6f46811adb5ae829102279f4b526ea99bf0796b48bc5902521da50b95aa89dd91b9288d9e00dfd2b804f6cdc9b08394273464b033bb8b2013b6cb7e47f8807f129bde855d2b7242c147e66dba936f735c1123a79efc6c44c03a0470310fc0497e2e17f857cc340802095bb10fb857ff1057868c6239c054f1d058889b50cee6fdcca11aae53a6f454c2d15ab7a16039702a2e43539b60ca68e562c13d4ecb565d95fae5c29e3e669565dfaea37b7c5b4b84de44580c17af18278e7a6d9b564c406857746e4d42560c0a1102d2eb069cdc01d2ef5330a2bed9bff252b9e887d284d57c89b52b6633969511723e48d627ecdf26279c93d6cf263bbe7370aad25d10db31d38beecc824152bfe11d6a713da9df7eab0f1b4c452e8d0e8a320efaa6d49947fd82dc34b389601d0f8aca9db686f6c8ac376f4445b705330038ab7efe3b3a9714812b6b242b2d6a22eb23bfe6e3a613f33d4ce3f3be2ee00e02662aad313031e3f790969fa4276d7329de32355f77a9ca9b50061391b232cf0782c946aa684b99c7170e367e1a72a3284ac33751d8c95f28a4081fee4c86a0d97a094c73947a6e435ccc81e3ec3d0e3498ea5ae586069f8193e63aeed1282f523b0bd5f0c93c7fe16aeb05f70100d4789a3fb2b036ed7f7f602abb478e5d63bd3381b612b61ef7fc1bfb3589f88bdf40dcbcc6bc95aafba8ed05296e40080ba6b79d4664630a21b62934cebac5fc73a197b0eab7b3976cc8d5674d457b5109bd70c71089cdbed50f0490628bd5c47bb45effb36341cb17bb19b7ba3986e3966b0207411479311b02189672e33c4148e5bb06593f37659d196eaf9b2142ca8dd5bba539dc77131e50dc29426f873db21e1f0e15c8e35fa2eefea8f6dc979c0e09cd9d7272c8ae678b90411c97e9d6b004e12a37adf668e349f52189c83554c356ba386542ab7ab81651ca45e6afb8c3453819b252625e595c5e317f2aeca3133081de114e370c3322baa1fed60877745f37d21382fa7a0f95641d60570eaf0f9930cd14ae03840c1caa08d3a07b4cf0a9a0d34770daa393c75bd769a76580d35d2e68fddc7404d4b65c3dda54a7b7e3854c1fa3fb9aa0b7eb14f9979e8aa4d0f7c1a16b1d6cff434f2c52382ba795289d40f41c3c2f31b977e86fae8310e71fb58672871e92bad782850aa25dbed375eebc901dd0bd9e9273c087d2de24a51434bdcc92629f2ae19aa69d0bce0fbdae98c03ee5e261950b4afd1c7215b119783a68bad0fd1dee23391f8dcb35394899a352832d2754275e99746677801ee5c2cf3329fe89f3123193ce52efd31056cb003d2743615bf3e7515b3013cef3f388569f47bbd5a0b6862bd3530ec34707f4fa14360337feae21899e100355deb735777fad88089ba3b921627a53d82ab89795e033ed0ef0e879598a3163d4229eb86145e8dba7db6b9e4e05069928cebc7cc49d2b02f4b2793d0a6da10c5945366e2aede6a1639678e3ed7f2a4ec1da5b8c26a78124960b70b461f82419ab75ec0703ac0286f14549c844e937920c94347d20e4582e45057d2b3e5baa3a51c9a8fc05407ebc2c5d420ff8823ee160f294323bd0005052d25ac938e05f4ec0eed7d3b4c9e087c834c02433fbb084f2531c414bac8920b45ea75f52a61698ce6e747bd2e018a7d3c1cd1b42f96f3dece717295958d84b46d8d75a4952ea4a176ee9a87696e369ecc53d7465e4d3c759aed2957f5303b0db25675c0d4b889ccfc4f9150b5d96eb16b49f61794aa2a97dfb397fd3b6662766a209ac593ed08b00d88eb0131bc97179612d911ef00fa49e646b6152a13ef69f3fdb0d424df27496b44cbc3dedc3ccc7e25c96d8aa710bdf2bc45e85182e202c5b0d23dd65820dd6a65506376152d389a5e282c8b898527b317256bdaa3be98da98527c510afd369920d9b616058b2377b9e361af7dd85bca3d35331dc9d373fce60bff7e704678fa1e3737c79383e8c19f8760554dbf43148110a6068817e9c8ac81272e3fd2acf50bc1e0320018bdecf258d48852e9ecad58cc3faee4befc393bbfa76b18d66c07621dadcc78002ef3a9180594bc2267664547444fbbceaf8a019d7c22080086c4748b5a020d90209b3acc2686b1fe14c1b02518bf891fec37823f95658a15cd83ccc8a023c71c5e8fb9021d9a3cce4aa48622bf9793f56e2b3f7f9a6dd006e803ff2d534bddefcc3b24b60f90a508330be8390941d8cac27a1ff39bdddb2dca07253eb8ff74d3db78837cc02e3d3faa41e01012153f2b15df2423cb48332bd4c7625ed2436a61d91f1a0389906dd6a74a40193f4d051fa7a61472c5e709eef74f16f307e42fae827197d22412ad6fb9c9a40d09a9c7d49495b5ce2836ae9f82ff8dd452bd35b004e658a2818f1c32e2bbc345f80ebc54afd32aeb33708444fd8fc6c9b43f312991b83a8c4c7d1189bbc83fa131559bbcb69c8415099c3b2a14737596183e465433ee60189fc42c772a1175990792aaf00c7cad7ce604002ecadc5f73c650910570eaa49a7d602c6ab799a87a256888310fa8ae2ece0fbe026a68c2ac6fb40bdeec8a921ed3dcd3d9af03528a866778a11da18b06f8f85a2596f2170f572a6f939559cadd9e7ed33c225c55e4ba9aef80072a550f0d85931ac021f68703657f73e8925f81cd779fdf4184bb4cccdf667bf03cf4eeea24c54f08f4d158faa2574ddbb9edee98cea195ab7460685eec506f6df97d14d5e5989c054ef428c2b462661433cc2c7be41a546b09c3636792310c300da66e4776a4848b3a3ea6ffa0ac9896aa4d0f77bcfc15eff57bbe5ea37a0981d1d07131ef6c333740e199a41d0e12ff0c49f0f7117b31c49ac91ee9d33b161bba92904026b665d63083c07905ee95d9ffb49b1df8e4f7ee3b92280ed13a3084bd324e3dc161787a73ad8b36eea42d90f332cd30c8d10c34e65790d59095946f013a3f630b81ada24c075bc00b0837c9c54bb275ccf57a2ec947789d0b1c6595bb7f79399f1e9dc68d804a486c19be164a450b431381d82331abccbcd0cafa1934206e502f76478904c492be848b6559c3e8b2fe65f947c2edd8f245bd6115afd0974873134f6730b0cc74f359f06047671ffc500f65432ead4bea9f1fa6ebd86604267d1e5b5766e3d77d3c526e3cc2ec9c21425b53390a0398d49fb9a3775f4b65039932a8a6d3673ac46ebe94706b4c004eadf4bc158309a55493ab94997836fa9ad91e698ae1372c7228d282db805765cd2d761d81debd680de4b9ec23d23381fc5fe2f6017c49a453a361590a574c1ef05349642d9d65a687eb19753a73634726d6c6b9f10b21bd984ecbdb70c2d0cfd0bff0b3f6032f4832df2bc5c22ca9f792d6543552d8bb86a6d1131a33c3f7f1dc5196c49f4381bac5505fb655f2f419221d6ca13758d257b20ab394964a711b8081c64bf7894e7446113c6a978ec29d3b19ba2299ae26d748d797a244489f2a42d5a94679c731e80c7bd899e2623571368557cd441d7a0af8936284ed163294cbb32201e8e38a45cafdd20e92c8955927b49ee222d6f56eafdcc7643b416d073f373d3c40dd0cd913893dafe9ba01b2b1a47e92d858f5047a12877ad75b38158c2c0b65c2b55f5a9db49557d2604fb5a0f6bf58c72dfe3c9df25942b568fd1a071c05c8fd5a0716cafd86b3d35d2ab520684a650d028aa0b88c419fb7ada13674eafa74bc41994d7d37aca449c49793dfd8933a8d7d3261a87ca1571a519712d1b34f683c69ee819eef518111a23922b17afc75a72f5f22c0b8c091de2d124b25167d80e723da6b31d4da07924ceacbcebb118cf27933ca317752d4b94eba7075a264d9dc6c1f2fa0b49ae3256fd9514672ea1ebe7899fd3a07b814dc1374790eb6554d4ca95e8df0594ebb54efdef01f38b85dcc3fcf73017f2a7606eaafb7d0e2b75531d4e0d913acc6f52877977188c63a4c33730bf18e71ee6387fcac2dcd4bdb7e56f4bd5a5c373f9c815cceb67d2ced52357a9771db6a96ba54a3eae5aee928a4172d5826512963128855baaea4d295526a91c72404a8734e381e9ba2c48aaea3defaf35283b3aca3cefef3a6b934a317e7e7e689665493229294b4a4a2a259592ea4fa9a816957e4a3fa59f52515151517dc62357f54866414212a6eb8e783cefef2c4f2614399b954f9d23d95913922bad2555f55b140d9d904d91ab1572ddae1081c6a3b53423882bd792ab3aa426916bab12b1db85b91615e5fa7ad4bd5e13925bc0745dd7e10f3a212857a05c3b5bbf6942b9a6d8934c922b6d8bc6d1597ac1d28de56a465da36e3d5255b52cb4aa5ec80b3a50f793ebe6936b85c2e681a7a1d322570d0bcec684371e93a954043724106f411b904c6a1cdbd1651a7a26d1383a5756b5495a4faeda0c727df58255c97832dbc18c27d7dbbb3511bdfad3dd80a2578f72b723770b8a5e7dcadd9044af1e7537a1e8d5abdc2d49d7a8cf82e44a631255f543b2242c916e893311942b52bd8bab194955fdcbd58e90e4aafe48557d96594b91727de947ae341ea9aaef4ea59f5c9f25c915e72355f54036a8133a51fdcae596e091ab0d8b56d5d77a14fc65f5167fd603b98e20d713fe626496bb1d758daa823fee27d7734cc499ce75abe79a88ab529254d5734b74492c92a423b9bee3366ec95614bd7a0d73ade8d59f56ae2f25d52ecbb623d376546f326d474f6c59fc9492eaa611895ed57aa257bf618d277af52f4ab09fc693ebb72ce20ca713673eee4ce2ccc9ebb7a3380373fd8614678eb6d8a2d892e2ccb77121d7d7ed9f6694eb2bd251d5c9b51ee57a4d6e2cb7ef8d24b9aaaf3ff0465ed15b1d912d25e55aa170dfd29d6ccb1fd3552e54d235e051f0291726814217228141f0db91cc326bbbeef73c996d3bcaf5a5a25a2acaf5a62b03af1387dcb8c18a7d7048a6b883121fe80452de8e51146c7300948323792b8294b7225b446f834582608ebe59165b5f6c31814724c9f0ddf83b62a7a79094b767f77bfe6011a0e86dd656275a52b5bdef44125d230bf6834ef01849e2d99ce0c9db9dd0525a0e84f2f6147cdcc95f4e90a64dc1246f5f53a19337888b00e56d4950be4e04925c4123494418c915f6ed441cc915fd56d2a610ca17fe9a8a9dbc61970823a9da0e8d24c915114852b57d7b864eece40d7f3d4552de9cd0c91bc5441c49d57623db59833b20cadbbf9ec2c8897fd9edbf0e3601245792b51d36112457a9d3210b07b250be1d1a218a33a56f4694e4ed42793bcab552b5fd74b72b5bfcd9bc39d1ca1beea2b71d1a6999f0971519e5ed2da191a3bcbd6336ec033a81a49de8641a59a963293c91a604c237c2f0235ee396586e0a0bf3b557ed55833c1fe409ca54889ef6348e93d3d31750251a473d7d71faac7519c995fca4cf6ed02b2d336233204091b32430394b22ce9c4e9ff1c41994d36744e24ccae9b39e6c8938833a55397dc644e358393db5226657d82cba2df2b6c3247a43323d6dc995d6d276d094073d633a3dfd41af5a4e4f85e4cac5e929915cbd9c9ec2a0bba90d323d9624579c516986e5dd3791ec0ed5f18aded1cf34f4449a498da33b3d768421c5192c08f3912bec545382cf5fd0a5c08ea0b3cb039916b58830a1be0ef31ed8535848ead853c72e04e6d79b958a4f3d8775dd54bcb98e3d1ec39ec238a963c781f9f51cd6062455dbafa0bc3d75b7c36cd7eabace0ec643afa41b34be974c5199a6be09c10ef3ed02362c8f5a7336da6ba2f6c286e5baf066458457645b1692730086533cb06387390cbeb9708ac7f5eba9a7369b882fb072202758019295fa0f9d5b7295d5d20e4cd7791e1090d692ab52c9f3feaeab317c7c7c7cb22c3b3a7a719b554292484825a4125245aa48b59515c995d6aa3ed5a7b68a327d6947ae342359020a92463b3b3b9ef7779db519cb679291dc82e46a23922aca41d12afa188513b82932e5ac68b2ed6c44db5644e4026f45529564bbe58ce4aa32d18670465a129c1167945ddcd45fae4b0b22b532bd6674fa2d081555f4305d672dfea0138c720065fa43a3db82327da32e391bed84324464a5b62c1a47e76c2bda582ed7ddada86b703c5245b72a5a451fe401fda7f3c994ebc95453421aae458745a65b1632e5764a2520d8526dcd23997240dc4fa6af8913a971d04f2d7a55ea6b080624579155da7822fe361764faea851717b24a3b59666d0793e33f98fc957632fde9724c448f1ee5723fd1a34fb95c1397038a1e3dea7247a247af72b9a0e8d1af5c0e49d7a02f01c9d5b64554d16f4cb22136898ec8b9254a4672b51d19657a17772b922afa97bb191dc9959665d61e65faea2357db4ed6551f94ea93e94b48f42d5bd419dd5b2921657a969b237af4db8e5c955a454fe92dfe32fad3b6f375cf317277b3ae4157e80b10673ad31f20ae2a9254d1d3d3e4e8aea0d47b6735ee8aca1d61ce287af4970afb71464831227596957a95654f6c3ed4e5f45b12d1a33cd1a3af78db891efd8b12ecb693e9b738637a8933dc29bd8d33df29fe3828ba38f37156c8f4b4fedb8a32bd762457f49a915cb55c6a49996a4699debe3790e48a266a3e72055b156fe415bdd511d98a94a912ee5bba93f5c974e542251712a1842012940b83e0912cb3b6eba4cc3e9a5c5b729565d6766d65fad295b9f9891e7c0a17e1728d883a436edc913756a44adfb8ff88adaf93bec8f3f2bd04630b26f9a0501e42b22e5c845461f9cb4af7061f58a49964753a9e7afaab8958ffeef3ae234a72fd1556d46f22d57fad848672d77e51aa1d20a7eeb4aa9ea7a7d24a3fe34fd7a89f9c022a4ed56f18d65bba76bfeb80c9254e074cae18967047a1954f7450628e1f151376cb3d04b404871f9be51e025242f412af99bd64d90b98652fb21798bd642fb2972c7b41b199bd64d98b245a96d1f6608430d2a04993096343d4b3ac258c11c6a15894936453f41941932200810a2ec880154190239011723c2ace7017908e8ece0e58f15d5c75cb1700e42f86c68daf93c896596cd14cb27c7f7088849192892920921bf9834994c025566401990c49a20a199790b1892311494cf2452553c85f5ce26345969734e0c97288065ac8f2afc110b2bc375483a3dc4336384296af714196078207135ac8f20c18628249962f020a59de88a11b504107073ad8c10119788a14a1c7a788157e868a8021cba11f21211ea2560e9214191d21dd20cbc3241da441e7063b3b60034f1347e85122cb1e3282f4e30411509010114f963dc483a32c1f731667be4d28cbc34d28b7d014497913da8c907dc82dce40a20cb7242cb825c9cdd9c4d2155d37e4a36404435f68f101419e9fddec253ea8424a9e73ce39b119f97a2791628a198c60ce20075d0a2613544d6610021990010c43621c010c2be8cce0838ef95aa8eb1c1d637a65a52ac295f686456e4455bc8c19ac4cd7d10091e55b75bd74bb7c1591e5bdabaf0d64e95d38124b298cb6157d4cb4020c482527d80069044d8fb410c1bdc71ccfa41fcc16d0132da0f1424b0648f9eba22cdf56c877f2323159ee2119b4e8921944accd3da4441bb2b027b987944022a2b50f52061209d1d09841a38b4ee491349a9877727970b62f8aca646ed0d050e5c8724ead7236d8c466092bcd8e863703001e958d9a7925bb2eecba2edaa815b9494faa68eebc24362f99f3a4f39a5794534e39a5fc94726612ce89ea1848e3ec0bc503adbbe17c9c53e2ec0abfb0e7f40ff62cf19ac8c3cd715baa240f7c81b9b806b9d3ed9cd23f8c2c78c9d95ca39b86e250a877af22ea5a09439e9724f6933c197ef630e529a89f6e6f0afe687c3437b9beca7a6f78cbfd6ec03f68e496dfdbfbdde4fb12f7433ce18f473edddecf3ee5f56a29d7e68616f615e67a697fc8a0ee77bacb4b9c8dc51d3d18bcfde28e5e0bee6ba50d5fd421d75d43dd0f66ad391d50e59eeef77cd2ecfda1b37dca9b4b4067abf2cbdaffd0d9e21b5a5815fcd5bb1c723aea5b6eba2aaf9129d74f56b939b906c1320a63d086cb6b644dcca2075d60df6398eb05e622c22c05c71f8b4ff01dccaced3aea792cff6458fed1d44896bbf2973b391b95a7ee4bf4506f7977bf9cdcb1e49614fce5e494dbfb5d057f30ab1cd67acf9391913c9247aae0abca57aea9ace0c0aafcebb2ca6ba2e491f0baaed35df0e9d8e926fc7557777b597e6a39ca9b1302f5165c6fe7eea2ce72bf6794157bb8726d4565e5d637a75281e8ac828360d93e7241c03469d26447ccf51980b9e21fa8af5c9827b74326a75ce5167f5008eafc24f920f51c411e2323a12322a496fdd745349efd2793abfd47a3723fd34f6f6e07e4c9292af88b4056b9bd9f4cb6aff77b9675d7fa1aa972835c59e5cdd9a86020327f30a3700564720afe78d87b7abd28879c0dca4fb723109d2d0e7205d181264d9ab4b209ff90c9278f3b72b5b5aa1ec6e4faac56fc6df8078ddec997e7933c196f71d5aca933800891e8d1ba71487b6534cb7ace47c80361e7c060c4e090d135e2bf1b06e0411bf1dff38c4cf4228acbcd43015d63e60d442f7f32594787862a80479228a3a5101262e180d8409c8155682f62a199340a3212ba060c401b2cbc7681c007a00d5647d7f824ccf276864d58e8c3920f9093e1a14fcb962c0c90abb74adecba48c5d7d5d04d334e4e7f5a169c09ad2101861bc380c6491bbade8259d64cbba3b2667de0b68b210ca0c4050a28b88a8c602b2bc5ac5e50b0359decba65c49d69793eb9039148221b9331c02c18ea9e5fdc6e98ed3f22a6a8e38c8954ddaf12100ca2fb987424064fefa25244bce46bab80c41cadf3cda8288792ec10940c81f3542434b6e2e2e93682a89392ac87e14c800f2a674c43cbf247a51069616d1d60c269e3f716662d1aaf8a905518e474747aaa0e17137d6c5c54546a665c4564427c3eeeaa0582d5707c5822b6fce86e535918888517ec94d44e40845355607ca53de33af93cde97dc234283b02731345afe584cab18b7abd29775ead6be5a812cab5e6b0cb9b8118c4f591a2c750ee970198a27807cae5738d440902e445c6404ea6c03cccb31586951c3434f9c80704a6264d9a346175d7b0ad7427d09d4dcc9fe8c5cec7757aac00353f727af2751ff39d2f98fb28a78460e5698b0201d1a0d40e7a79fa2eebb2dc51a0959be5a02a0e3081d8586ee7959b659cda51b37ccd12a78290f312a778dcb4a8d103666b12b576928841d18b4838ed2d1807e3f0d8812c97df3c858720e103cb05a7e40e64a5a4cb7ba4eee272212d4fe11e2e7ff90b16d2dd05a724e6f17297964b2002f448f42e6db95c5a44e5b4fd2146b9a7907b68c808326d512671c6f4f82c1b621f4fab50c9f1b4886a91291639d22ce47829ff6c892691bce48f59447d81fd2890c4418c381267604bc21389bff664689e9d1e3b6dc9a352504e6f59a76d207996154c5530968251f00957fc7979074dde2890c9740a34b31c2dae004dc6f00784e9a6933b91442f4a1ce40a424893264d88323689b6162acbbfe4eddf34ca4e232f4faa745c789e6e9f1fc53f68b2f60dcfa049247a1113faf901029a447312116597372bf566c9899d3ebbe6d2b9d6d27579777a7bb43c75ec0ed1f2141662e4c6e5dd85a4de22790c4961173c892065f9d91afa409119904a1b9d5402b59800922bdaa29802490a84bd33a53ea4c4a91d9ffd494c7fa80f6542ca679c8da42d7903135b391e43527739057249e13b7bee1c123df9895dacc17e3979ee64996d55bce46c36708420fc60c8a5933ab21f6d115d7174b493450f529cf926912de2cc377f72fce6901c5b4b620f2ed48a38f3fdf801eaf191ab26b2f3f95da7adc6e1e3c215b82e9168651a85c6d157e44f6e91618b1a5d17863c9047082ef77161d85272e991a872b9cd921253a02a02daa2401f355a82f6f4c096cb5b6e4abe59ddb1a3388321c955cbe3b124aa4377e4cac5e3290fedd1828d3ab9b38b7be94855fccb9d4952159fba13e9ce23a98a7771646dee2110a4217ff3c8e5c2ee9690000422f3088910bacbeea624a62dba641ec5792404ce884b0c3a310afbc122b8127df041073b20db927be80936e427bcf044d14f4b99a3dcba054e2a3430d04498c92e92ba89acf8c88a184708aba50a3b02464c0a24403188e1f3a29c72ce396717a44ca459a994d1186126e79c534a1b39e9906c49447461d817ae2fcc78c10848ac0470de0c6d2e51d367ad22a3226dbbce5a795df68ca7dcd825239c48d7135910b66801d0132420b2001e9f2764d08382a427828082999d4048aa3a7b228a152c00053a3a80b0a311bb30ec8261041b2377145d10438c28788105387cc1b2e48ec20b4e14c10b51743d48b62e22cecc13cef4dba355d76d77215f4ac0130e6e1a84105a6b6d2dc1ec1f4d861d764cabb2cfd4d8ededd10768b3961ac34abf6e91d28fcd2eb863348d3078cdeb9a9e91adb9878e78e10a360bf9fbbc47433b524516062928967be8881443ae9f9c88a717b439693721bd539e2c90a3ac79e2c800cdd81ba50239c6d32cdf37058165898174938c6118e711391ecec72c6e51d7755d5729f7d01126e4cf7ee640eb188de330d5fe936b13b91ee59a45f42a508c9f628b5c638c3046182352aeef187f72358254df874690ea8d8f317e12212455f1f144141101e39d58bb76ec12512455da8910922b228e2e2b9e42286b4652a5d5973eb803a1acfdeb298ab276680429b3b68d2065edb0891fb98a2c4d3bdc01529ce922ed2db5778cc61323cd82968a5a9cf893ff41e24b9992513e428886ec59ae509f90c77e599e2f8a6ce7963458e9237bb06338a2feb514ada20ca5100a6aa01f9f9d3c44d1bd018a1ef4bab33cbe6b39cae52b7749a9682a97e5a8fb37be69c2450a1d54d20a5286c75f4be1c828432914ada0e46c22c65e2335ecf60d2df02704e8f04280ae8bb3b988446fb6cb8d30d83eca31c60bd2a3e84d9a459eb185099bfde0cc277a970a3b1f77ae9e222bdfff681010504f0aeb89de757474a4f21ea9428332dd30d91367a60cf2bcf4996ad0e9c1ce90680434d48321ac83f29c8941974b0cf58027cf5324712615e7e74ff23cecb1fd8ede8ec9d9348ef826287a2a1772f488521a74a9fc3aba7cf2853f382b6f79c461b9cba3cbcf4fea86e5a9b33ce5027de42a75d31df5eea86bdd6de95a30cf9d4279c68e3a73fe221267523e3f8be40a7578048d60512b7fb2a7855a9ff168ca783f0a75a1905431498a1e44f28e1e3475324fe2ef47ec9c1cdf728593c3ea4caa7eba46aa8fbd71aa69d668d30873f744c513eea993933ae79c73ce39e7fc49e5b84f8e3b0fb99a5a51a61742a4492f26d19bd717a06a7e9221cfa9863c4faedd0c64393e1edd0b8bae31df42996af205b2a767c87eb2470ae105b5679d73ca25c823a0b460e1b116b6445bc1c2a2b460338de62963906da52c3be1cf5a3c4dcfb2ad44b169858db95e42d1ab6e1983691b0796a79c22cfd951fc93373092a704c2fcaccf354543d14e9ae998e9167f59663793e9d7e46caa50d64a375561adb5e22f55aa37dd1f4c2653ad37d592092b99ea4b2b7d714a3b764dbb66d26ebda95ec3b2c725639e0c8f7a8f05746f298058de52106917666ddb36ce86fe6272ed3a6a1c58f40a8b42abe667e93acaf39ad46e56deb9a0def21edd5db09095776fc1428cd40b5139eacdeade2a1d16d2bdfbca85a0aef2d4102a47fd46e5a8577cb3f2ee3571720a6816cb4d5514eadd6f50ef5edf756fc1382bef8ea302391b1e2c3db98347b10465f815a10caf72a5206299577951854df140bdf3d7513092e208a7490194e18b6047c1285f4771267efecae2428a3312338a1e93c696604558ab8fe2104552055f449cf95a8a534ebba6dd5a51b8130c046257748d79b1d6c5965cac08b3e2c87e368af81167e8e7a4415235b9cfedf3725e6e1167b417f5b4788876bea983b5bac6445dc594325d339d6ebad8d7a9d33b0b01caa6db37a7c3def49a78ba3f98ac35996e4d266b712a6551ac111a8a351d25eaa06b74b6a65b5392d5546852ca8961589bd2de9673ce0bc34e4bd74412e38c104278b718e3c4d98cd7fdb2aef15d2288914a794929e3c4536230cee092f18a18931ec4b0c65f863b5ed7bc660e8573083b646a88fb983300ff86cf9be1af8d72f6989b828f390ebfe1a68688390e4f41dc23e638a47adc7018bfe1301e00690a6cf6d835b128893d429484a0241c654882dc43486802094b202189dc4354d8dc43541cc9dcfd66e64e4caf91abd4498c13ec611cef2a5c93c9958753a51838558a8153252144259309008f817164ee6537ca30e336fe9d9c7236275807b762e3a6e065bc5933ae77d57bc4b80c2c44c663c8c0292e47c815d0ac4b55ec72581e4ec19b19f70eefd5780c8ce3bdc671627c460a4b46885291540ade06be078dabaec238399a164fbc9be262dc1477ee9e7715c6b171ef3800788cd410337ad4788af3aeba9018329ec3eaa1bacc65b0100f5fe0467519188706d748553c1052156be29b65037f4d44031b816f1600b0e44ede31b2779b756760bf4e7a76f29314134e0d112386eade853c06eee10951e14b95097bb8a5ea6ba19cce1a0e17c6ad81fb74b38cba7d1d9e0809477213292122520224747294fbc18c029fe12c86848a868ec024cbe41e12fac94976b60d951ae21e873be01e079c72003e8c18f77e13e31ec63172729c141703a7e05537321ee331304e8ac3a92166dc7b8f19f7b0102337315ee342bccfc03d6a7cc6676021315e03374b069671151662e466c655172203f7505dc6656021dc55b8a5ea44939c0da732e3a64c4fa5a49868524c29de4a0af7d44a8a938153284f7137329e4aa1c898b1825354b65b141977064ea53cb57273192bf886c655dc4da5527a7087d67ec6950144e66a514ad69eb0acfc2b87f98ba7522e9ef297a79e4ab9dc9452397794afd0a4c0bcc09f8c8b14cff47217930aa7b8d368c12915942fc8cc283fa9bc26e664538a3bb9a9d4cab9a71cfee4326e6a050f41e3aaa738dc8306567dc6653c95827bccb88ccfc0324e375d2032a79c64dc96aad355b7a5ca05d2dda4499336649413cae995b34139eafe885ebc4518c1c28cf21f7e1cc2c37b82bf994d87af917106e5b18838739a97717892c15dd51c96891ec763c82f55dc077540c8e16f66eed7e1551d3e3b39bceac2132c13bdb73d577ac3ebba258883cc2026c7711cc75d1cfe70327778af77b7ccf418387572d5735826ece1d4094e0de13dc66fbcc7f8c963601c2327f826c65518e75275f21827b89fc3aa91f0367781d0264d9a30d921b3c680dbac184064def007b38681c8128e000eb759306eb35ea260bf1f5d84b3ec628fb9cdbae136ab46cedb196313b78ecd81892fa630e79cf2f04a29a5d426ca35ed1aca0f9a0c3921b0b6fde446cee6243e27cbfb3d4720c39fee372f67da6e6f4e8637c8b55ddeef46deb8fb6d599b3ae8350c51d77e733e85c59cf3f31e0d19334fe25544eb984d1e420861a4810d3112610bc96b0def4723c39b60609b551f5f83c87c437e850afb6d25d4077f75ce68640cbf9382fd3cf983468e9797c9e2cc87cab285a609e0ef11ec0735001c28cfc3b8d6dc8e79183fb9dfc9eb8366a4e4ec7508c04bb502086c9251ac853fd6da1b376e683a04e03afc6ace2687d7c4d5ccea5773363ba04ea893a6556b6db53f9c6c3c8a1eacb54a1e0cbb2857351b7c92c706361ee5ebd5daa4dcde949b6e54123d28f385630bc79947f8d3456022ef50842345189277f80e45207245cee11fcca72da0489273780e876289c66dd8c9c9c93cb9e289cc41871c0e374e07cc395cb3a75faf185669d0e9302c2c29296f8e8525e584c36e6861535236cbd9d4aae3f4eeb5c26a391da7eff0eb62ab9f6ee7541030ef70987738ccfd72f20edf2108017c00ef68accc8e9765f6b7efe674c01ff071bc26621be5ea75b8343434a75c3dca8534a7f9e9d809e6155fd7f59caf9ee535b2068919f52d25057f39574acad53511b25cabbf2e7b5d36d6b68c8a5a45464618923b77468216b2c88d043128b1b9912006241ba783dec5bbeb020a26906c81040a22499664fa08c5904c1fa13852842d327d11aec8f4ddcda27797d45de28c193366cc10d23366cc98819343e35c0aa72cea299f05a203e6ec33628d15eb5cb81cc31f8d8cc538eb23516b0591282a6971f6cab37036b57e72db9bd38e72533a520ee328efcc72181e5eca711e5e13b59ae73c95c2373cbc06e3f4701e8ee3c3733c87d5dc3d0f37957a7eb372dc54aaa62663213d9c87d7f4e003e4ee9b7b711eee759d2e9657cc741a4f0162937d06d681e3dd4df7b3f93fdd171708ccdd258763ec4edffd59fddf1d1e77f45e70b76121e8bbcb7b81c03c00fc65c771940b738c9d0a6773e10f275f3511757a146743af410e08cc28f745cab19b8284c728d357242208657a8c08addc435464d1e51ea2624946a293e9afe48911830346a9e6c3cdf11e2e0f7f716146b930972ecc382ef67b61fc8147cf72dc87332007f6e10c38bd876bcd5d3cecadf7874cb6f774c19a68aff77ae5250f0e31317e612ef0310c8ea84b4e08fa8a534160c791a88b44b65a8b5142501f6e0e0bbb9d5fdcce289defeddcc3cd61e1fbe5644a2477eeac71a86b184cb9306f712665666b32bd394a4da68bcba2579f72ba66ef1724460e01f51988d9877dc7fdd0ddbe539e723acca89bb2efe13039ce728be4c029fb1ce7e1ddfd307cc2457ac0298b83d8e1399c073cc4880e01780e3cc4c8ea489c656426b56387e7f01d9ec335952d09b98790f864c8518cba30290b36559f9383d8e102b800b00fd4777867980a2287d757ec03f51cde7905f3950e872ff8fb75b82e8e934f98b529b76731d9145b537016bddabde2d3399b0be6a77b17f7833987a37678773f9cbc3abd1f4ed621871b24e61c0e7383c4bc03e4ecb31baf34cfe24c3dcd2f997ce3f6ded0c2d2fcb3f906cd339a67375ee284a04d9a3469922bcea277e3cde9a0c137be9ad921e8c6953a5c49240057e670e51237b01ffcc99a83c9723dfd84bf99ed3526ecb79ddeb9721c67632d863f1ccc9b433dce543c3b16da75428d03e61bb096aea32c375a8efd861baedf7043938b93afb7d88b0178fa0933a5e4a4d4c81b302cbbc7c0313860f853adc51fcc57095bfffff3bedb5e3140aa2aabd61b99a80651db80af7129b4c4ca4f39fe753cfcb331efb8f2e1313e6058d403e601b754c9e0962ad5ed8cba9d61b4beae0ffbd34fa7afac5cc3b69595affe74235ff57e1727db5f29c71abb3f6e4ec10180364eaf91315f077361c6a48fcab1a75c4d6e30299ccd75dd0f02d95ee56ad7c500cc11c8f55f677a733627db25194bb92b1a2a25db265945454545e55f17d9fb5d08e4facb9aae1f379b7000a00decf67e3a646c0543a213ee681a07ecf0977df52cf8eb360065fc05fe3299bbc0aadfc62127848d9fbc466600dc0f66188745366ee3326c5c067fd606fe7ed0c83030004ee3aad74800dcce32ee97a9eed7e51af79347c8f0312ef793f8078d3c4fe3defd6e320da824d2b81dbdfe2582fd32ad844f5698c8f525ab72ad7f78390bcb3597bb84fde2d191f77cdd775c1d2673c1b227c76500c49e823fef84bfabe0afc38a60dc895e123d70080b49f9e61ec2c292ecb3454fa6711817dac9306e3fb3761921a9878c4044fa40266c66b6ec277af51867637116bd8a82ae016fed0a13ec2751903f591467ba43974395c34b14340ed36947bc9049103077f466ae4fb95ffde99033611df51626058939eaa864e070cfb396d6fbf066e5780fefc1c37dc0427c380fef010b3172e3c379b8901e9ee3cd8ab906b7a813756024459d24265107e64f0dd1c373bc470f38a6870f98077c1ef9e3917fc8641818dcd13b86f119340e23c62d0ccfbbaad398110307d59bb39171a1920b7188f1c3e06f66986b37f9f47a0de35a6eba761e9ec3aa16a786c8711e7e93e33c601c23f638f526c779380ff039700ecbe2efd69eee07f329e5d5d6cd743f1ab962d36ba4e9dea7dccf7b7342c0b88df9e9de70c983533b6246ddc56b24ccc5e1302e048231f7cbf2fd2f0e312e447299d4e8a35e666badf5516f2d13ad96256a1129c100ccf65048e8542f54ffc12024156340668b81402660abc2d60b201344ad97291c11b95ca2be1e5efa1ce5b0208c98b75cc1bce52ae532390ebb28d79f52ea4d3030f04793eb636230c69e973fc92393e30e19e1486e79e9da4ffe82c48cba8b766df3af18ee9cae35077d603e1df6f02ff3e19fcdf65f97ed3f2fdb5fae78b87dcd6da972711f6e0fb7e50f997cfaaf9d2ef409900bf330fd29817a0c63c8266c0893b040c35aa3721ffa68783519da099aca18ae0bbbae09afa0417a45a88529b33c23af2967f462cf75daae9479e9631e3bdc6e68c1a68248f1318fca9d3b7f13a776a0327654c660cf77ce1d67e4f624547ca09480b00d4dc02e7a51ecca4209dc381ad6de9c19c811a3f89a1cc8f130cec8432886ace5a5564d9c6530c3160d34b863769baeac35ccdd3967420dccc8b25d2a6345d60c4347168c11b200e7ea406bb96261d89583102c56ce3c0246b80520682c0d6e57abe6c90296456fb3b0db2c0d76bc6eb396d0b03967841ed0e68457072694110e41c37266a075a9bd920660074e3ae7829009373c10d4829d12a020091f104187e107f69a584e11248c0cdda00966e831ba90a022092d4ef043a63bc3fe6e83fc793468aa60227f2dd44986aaa8414f14296862086a1882c492b28972cf1b720f1535c9a6dc434548f688d6cf826d2e421e493e45d306441b0eb48ef920cfbcaeebca2ad69bede6dcf29cef0b4462b7c8764d6e14723371a66aa5f78138409c89327af2317a387048f476a8dd400b11fbc9e46db2c06e7126420ce9135ac764119569e24a9b8176552a22ee207f4d09c87798d422077104b4b09f0c16f693c9376b15bde806f2754920aa906692269d60e155b4b0f0f29b110b85748dbe0a182c3c8c314231681d53935b080c36fe9a71c618048b54d0b41c67e39c0c71ebe8d93d67f7ecd9b3bbc140318c6254ca8961584b2963f2bca83c867b46b694f328e8c7a6402b652f3dbbc41fbc32eca39f5d83bd59edf89af304cbf097fda2b77ebb27d72ef7c9c38c524c7f7439fba4d8857f1421ef8f2ec74b25d06fdae18d2da4e672230c9b768880f8fe341c44faa83888ec472d621ffdc1893fd87de1ce4060ee5f37b5e37afdf5fad227f6d19fcfae5d3aebb33b2b9e1b86951e5f7a8d2c5d98afc38abfaa5dfaed66af77be5ed330bd2d61fc75af8f2032777fe384886fec235ed334fc553c4bf7a15dc336cf4db5cd73977ec22032633e801c41af8f2012bb3ee23b5f1708fce4769c726ae21df1fdb8a3cb5fd32a4a7d9230768650681d330fa1fc25040b1f2f2bb0e53819e9a8699a8f2247c8b08cfcba20b88edd4706642ec281eb9d254e0eeb7ae471e1ebf04e213a595e0f8194980611ade116b90f9108a069dd0ddf57b0dd4162ec9eda15ec372584337a57b0d9a78410c2ac218470369411e9ef8285ffbaecf22f71e66edddd36ebeedeb2190498bd0f2184597e9ba8f932e7dc8106000fc06bb0514353386ae5aeb1d316bd993b0a3028c95df41aff784772fccb148260458e570840a0d1488185ef4d87488370caee6e8bd45300e5eeee9e32c6c4c4995496b7eeee9630b08d7d3492fc804681902a78db51d84290b2a09021514da7e4869c0228ab846b5860371067e2e171e20c4df4e05519e64f468706f302da8364d9342746310cf380c019bdc982655858f089d82b04bb5261ad15ab87174837418a335be0479ef9b94d21996cc43c4bf70d7f7f07b18d9d8795e422205b44f4e6514e60e790a833758032c59148e4c178628c31c6083725b496f029f2018fbd11208d0862fb4e6cc27e91076a10a7b2c76738882d0e49d1cad8e3cc1cce66346275a2146c7cfd23ce00cc1f95d8b586339e60df6e77967f453a1669640552d0c91057405a0106223a39620dbb189cf9ab3ee283cc8c1dc38c88de3c8d94c2d94a944c1d29298c3a3b3c30893c672a08cc47846fae07cb3b8c8343852776585d77712012419041100bc7e5382fc7717178533b4acfb961b99188bb474e47841c8f96d36b5a844f5d23f4dbdd3175c4eb031ede5410a5c797bea3744af107e3212704c70096a7ae414e01cd6a79730e60790ae31c216f4094c44abd7b0660ce5e23e32d3dbba597ba8b0341c03385100bc7053ea2a7904410cb883cce0b3ee286198258296ca474177c04968424969193b7b038c1ce97ae4c5db973c89d3bd12b510cd57d6641e6cc6cef446f422b8c66963ac212267e8aec767b7a9a379623715647ab112caba8e8cd883f1a18362961bf78abc3be747abf0c578046f6615fbabd56baf1f4f06218a5cfb0434b33faef26c30ad0c8df4df69e9f3a53c7b4448c31e66843b1c89361fbed1661f9d54165b97de441a1c1da4f163c87b07c0e89de1cd29de52831c218233c1dde53778dc0b35c24ce32f2d2b19c8bdc351695b7ca63562a7dbb5f4ede340cfb0f9db1e76478bfe7084c085f57de5c94a5d39b93e30d72e5151c0068e3462ebd466eb7a3b7650ee51c8eaf9147dd6fe6146c44f47ed0c8273c77a6ce144a7189fad947457cde99608b4e9e7df6dcc4990b70df80c8d8558185cfb2d935127e592ec272ecfea0c93106b119fb01224d9cc93e9fa3c6932b16dcd1cb6663a16b58a16dcc6b175ad135e6e98557942e3cca227a33ab6d141fe329463f9a4c6113585932eca92c8bf391888b900e3e4b92f2bc4f134079c6a03ce77c4667a6ac429e3a7205ad88aaf979052c8ade8482fda68ecffc9ccd3242cb9167b24e0dd041823e72c5806cde8839fff2010bff02027b09a5441b628071f61704cb7d7923ebb79d114e4a31ce112cfa2b23555146aa6472c7c3932a1739b0f0510a1ce4f8971cb0e2e5fce7498f860b27d44352d0c9b1832c2329f0e4af5b9c8e148a90bfb6425eb38b332f71669281c6cb08905808641e73ef319fa20530b862152e256cc8c109ae147477cbeeee8edd0db1abb1eb6aec9a92045a1c4084534a29a794524a6d421bb023b431e5001ada90d25a137607703d8bd08694529a8080958680ad602963ec18e337f3978ad0463fe6993b69638ccc119ff2d76519638e97dd0def17f3c92c718cf29ab223c45840712e8c5ed725e31111bb9a482831d8a4dbc69cb31fe1bcb00bfb81c5ae26f3921884524278c2a08497d863298310c3221614e3a6e85637567adfa3efcee240b32ba6db867ca984bf23f2d5860cc32efafe840328c5b671c1d8309e408c4e194f5e34db221c006cfa2a4b598c56c26a29533cc4c2d7c489d9b8a49098e7b5d2f6755b561bc7d4b87b6a95fc76a53c59205fb133407326af439a4ba73b2c964b1848d79047e44b7275bb22044e402206186c29f7901236d0ec25bbae086722f4e0fb82d73c84104208af39bd6c622f110ee03ac5b2972c6799e72c4d6cd2db7962d9cb8bab94c15206e11bb3557cce2cc9946491bf4e52a4a40a29e418e42b265f57138e902f254ae4ebc615745032f97bc9c1841e26846109567ceacc107476094755c8df96278aa80479526188880b4b90420c2588c00a4ab8c2da2fcbb009f644470be2764a5089f800cfb682522b49ab415675404b4f604e10ca86884c70cdcc4e91822ea080080f04996147676768880d44e814a5d44026cac490813de58e420c6c802164b5dc518ce104558ce1055f18c30c66f4d82c771463c88137033ba99079ee28c850c5fcc001e2cc67a3a60040a0ae6ba27e20c08413af28818040a402851f9ca025a60d489aa8ec0401c8058c249028a11205105c40052888a09288a0029311b2eeeef6011172f7690ac0a33f1b675266314fb0f0fd3883e7212b7a727fbe5c97854b50824496f88978868e872965747663d735a38c538832c2d2a905c20b4613b412b029ffcd39273c651f6d62fd9a98d1eb98bcaed933a31836e7ecee19e48ad3057d2161e1e375cd6be294c472c4a2db66d9b265777777675052011e368700982057a4b4616268c30b754ddc3171e144cd84104a3803f003fb6519a8a58456286163bc1a9b33b330c88e3dc3b28cca2ca318c33d6397638c1d73288c4dc4d87dec7336f6c67e659916331a23ce6a60d1314a6cbbc61170ce6641291cc9f663c71c081f20e535e735fb03ddfd5386724af99a78c1fce564f9a923c2a3c81d68b2bb5bcaeeeeee8e51cad9b108730c5d843093ff72329c17964062d89c58b7a9d492177627463367dfae715d18c5e6293ebc2e2f6bd8d735fb7a4d2c7537be2044b141264f39a544a26577c309610732ece779fd82311a6918bb21ceb07c733912c227c42cce5ca62ccec0381ba722ee5cca16e83296d1f79db3c212cce095e1a71c81d4eaadf5b262b54a292fe7155a8c51da07d5a880200806913065f6f929bb67e4bff92cc64b39e79c73ceb89aac289b905168cef63c19191a1aa12c7dc83e64d3eeabbb9f050dbeb24bce970cd3c83db3d2bf790c675225e72f0c772b20a96ca8a46d15753d8d3a4533224000008314002030140c8804a3d1682ccc13416e3e14000e839a4878569cc9b32c88614a19630c30400400404000406466da00c0c436764055e2e393cb7f7b1169696b44dc3d53a14306f060f1015863a2d2a8e5843b9ffb1ffa8beda4fb023d1822bb81e7dbad20d60725548b59eca7d708e201e3b7810fef2df099633a29698dbd2f1ced3defba012367169b549e4d97c89dfa747367248fa832b38c5672abb70631dd62fb7c83312f247bb3001a6313212385d857242d53ca162676cccbb2253d5c5e75268c23f738cc0ed896aff9c3a49f7b4211fea5dd17ebcc4092a25af46e284d62ad80824a16614b6585ce602bf3971b0c8d51f74d0ae44034f3aea9ecf41d62ad7d8108397e3277bb31d0a1a1c8771c6c2e2776520bd4328b64ca5ef0d7aa8ffc40782d4e095f26371739baa153e4cfb722c8e14744f4cdca76cbb26eb4068f060f03935dc6e692010fe6aeb8bd090278383d7c603c47eaefa506271e63afa1838ed54ae28f32a6b9064e12c10b0b4488bc7adead5c92720472bc2420b75c37d19f2ffee648bed2445cf523c8b70c463f768135a76089b243a87348f645980f14e377a9cea930fc076a81638f0d0d90086e1d54713a8721f80ec81b7ef4c39bda043b160e3243110d5424069a3480936c7a4d954cd512e0642e15543b42337a6cbdbd8b8d281116e2510fd134f9c9f57848ecf632a45b81b40d5be89fc85854397205ee5d25fad1ae49424ceda8258c431a9d380e047c84615b261da9fd3d61af153243bf0aaeacf3c6b18225e8c690dcbe4416ffce18c230257e1d8cb20e0c3e1fe18fcd421986c2399fa401b3eca1ef13d0293c667ddf4869e7858bd67ef8bded878b01c03731c2ff9be456fff7694ddff5f69e73e8a185cc91e73b8fe6a044ca8a7ca55efd7ea8f8961e72e36431c4611d3fada9655befdc3426b1c299cb0487195a16511d77fe3b83ac56a9502e95d8a00ccdb971c23c1dd65823ac470d3418a6fba0523b28c099062a9e98893b143d5a8e1e9b0f2478495e81b84ac1722cf92302aa9269b36de546705a4bd228249def296ff7fad39edfa4317049cde183030ff9e1a30389330ed683ca5bf18a1f1c5d1c51b32529375d164e4ff80208ecc4ac8f2b3bb7c4420fe3904d931f937293c371d5466e0aa0e34b00d6acfb4e0c58f7f476a28e13f9884e0cdee4b5eb55c5564bcfcb3edad5367a6a5797caf0956978b41005a2bba3275d275c5d210e7f919a800383ae15989db5bb8c2f32433a440bc8ecf88a61e53b75b7ed8a01c2e4df9c4062b1c2b6fc48f701d70a8a87e34aa2014adbc13e7245a93bb0c2a6f41108779272ec56c733252b48e88ecfc0c57e7b989db3a5ccef273b165d5394961537143bd85c1bef0447647df647a9ddb3eccdf51f021bd69a5c4814db14a2df1b3986e44abc4dd8c2e9efc10bad6e0edc875bbff776c47ef0070354dec4310362cd23194b7037e939e3c6dcfda97aec58aeadeccc3afdc97f380e9a284383367c04da44e6f14a2f6f6046bf80c9598f35331f1a0e5113ba8603c2f863028743239e6fb643fff67e8948545b549626777658a5a50cc544b4e1639e4888859c598a9279f210a81dcaa528ceb010399ad36a9dcb4dbe86e2dfb9b1ba3c9169a3ca4ff1c4d288165573338e200b8e6140be97975c0a4a01d11b881ba1b0688513c657481b947a58c256a855e657015c8437fe54329753b0f14ca5dc2466031d3003d348ac380c969c5bb6fb579cc23582874b87202068b76b906831396ed9352a33632cb81dccef939a2960823a5a8714fcf13ef3f4521445ad7fa4d496d3dc4efb1c7837a2f9ce1089147a7b683113975e80d235164f2c02992f69340182eee9aea434f4c5b3f53f804bc98b2c1e60c6d0c98471c064e711a9cfcb5111fe990de1f10265f67d28cd21a74a4a6384d49e53e43b191a7e781f1d301129f523d964b37957d8e146ac0e673fcd126e69718fd540016b8314dee79fbe432bc35daa3f3078388aad066ec691bd0709840ed1d930e67738a2b355b4cfda2a494a9cfd26c6463e17aafcb5815b5b48ac8445e24d5f1cfda0b9ef3777c0f24a2f58cab0e4e63fade0cb9d2cb593caa285d84c4125bd80a1c6aa230d2c06e34a2c78fd74dac4733a1287122223f3ce7351cdb88d925b0edf02711ad3fa38f264d2f039299df95d04dcc0b17dcd11f1149f079538689e70eee6257ba8ba85532a9afb879e765bf9c64522a7f5aec4cbd9d8bfb1689f41dea405ad318c868aa5391754a78f8d35b47db53e8ecf87fec02ea293550fef24dc6e0cfc11e93b502d626c3afb2e1600409277155fd28a69bfbf18f2a09f67cdf609f61f8a3c890673951edb4f23d78920cdb9e08b157b1c168f45ad2f8cd73931a232c2b62d5c4cc108516dce83a4bb3260006e8848136064b63b69c5e8fcb9e3afbd61d9fc4623bd2487b5ab41c337246d643af851320faeae845109fdc4600f216fe429290eddaf6aeb6a8648754188c8b3ecd379e96ded7132c80288aec874cd785721725ca353b4903ba297d656f76292b5fa5f4f9be561c4de639a6aa0054f89af41cb7b338048ac33e7d8ba371515f93c4badaaa7d9222ab3d6dd2906da792a2769d17164a3ee090c88c545a3694bceecf4ab1e484acc4d232c63fcee98c29cb492f40352662cc0147d07b2580a19392e91a0dbe45ca52a0252f0d1fe4c976749a875e91a9824a4ad32df1acb490a2958b2b571c5061bb57b32665108f383c4a7d463fe69469322de535b6436ec0d31348b52283e2ac868bebdecc72e517c662ea1420e2ea0be47f8df233a9dac41e771df965e986cd3557f8ccfc73defadacb0c835c53fdd2f0fd4b802e585a67f29d292d08f49912853080132ccac600496561df98a1fdb943f1a53bbf403c907e392a3125bcba002b1581853775d46ad8a84d89b9d0c527f885ff7a1bed4a09bbae225512e8eaf4bac07d6eaf3db807dfa8edbe84036738d189bbb8e0b83da99150ec914475556ce094223ddfa764366ea61d81ccf668c9a81564ad7c843654ef76b2ed5bd8407d61621d86023f2d32b1d5b38784d4179f1db676e9f6f96f97882a70cd33e84d51da044ce43897a29e8010191dd76e3020d94cd3bd912696a4b2cbf873a099050f5050e1ed2443331784cd4da9d0dd116b5681b20de4ce509416829d191ad8f178d8b6a168a1a68f7a0a9d509b59d6cd9d732b57451ba7d59caa22d1c723552f4246b63fd06a5267695481dfad90f4a1646f68917cb45692155f4558c59cb9e6f1612902f88593d046c10915ce832aa5a74a0cf22c141fd5a75c91e608260d02db438b5ae0c2d453b39ad74716da369e58239773c59fabd7cd27ba89d90a52ffa0c3b4624ae55a9d99aa145307dc6f5675e79e3558f1f8cb09086e9e61f976c3f7f9de8331061585d02b49e0961dc181c4d8e048c0529375f4f8395255be020b88ef7e248a757fbddd76ee806ed79c8533fb2f1f8b00f0b42b8e62e22726a128239fbe2fe73ffad1d0478714e044a519fdaf4e4706b801dc16332d2184bc824e9041b6a6734ce7585cf52fdeaaa9498aa3fa449102819f0005b45b9f6667f4fdc400bdeb3c8d4f96a8144484ac9b8192bc7c2446cc3f370c42559c58fd2304f901cbc2cccd89bd5c4db98ccf407e05db64ab4c2176dc67ff2738b667f9706aaf55578e3980512f3c94e1c83fdfc096ca7b00ada08c4b9a7f2981dd8c3f3f323baa278672bc14f3d8d8db265e2b4c21815a78f7d19a500fc55762e262930f4b3128e2a7327b23dfb944c190fd25da2a7a6c2f28809f1e7390bb4a77614e8d9dd4d11a9c4412a6b06f6829beb8d73898743c877264b60ec764d5fda11561eb330f0fa6fc9e29f3c61444838a18f3b7b598987bf87f83cf8a0c707d900fdb815b7b5302e2e0a0eeb5c011cfe26a6475f8608b5ece79af3ea01222d31b9b3853f20b4569878eb9b01778bb180136b8917c6130551a2ff655fc189b32c56875b63e8277465b8259b2dc8a724bfdcb9645eecdb04da3c7ff11aabfe6a5f52026c4cf1978ef96c9f31a56c230882b9a2feeca8b39a187e28e1294e2f79aae36e05dd3865255b32214d4ec03e3f435724c100194febe1452bdf276310313add860c512a98e9de30fcd174571a482cbf73c78e5c08b4f9c49db2bd84bae61967dc7b7e7e807d9ebcf9af37e5c1af22459ebc14c8b2108d54b7fc92f0e415b25d293d9c98c921088d0726366e4762d5c16b62a72d3e058764ec60809aa67c49937576038955367aac259476368557b563c9b418ccb7055523bb40ce828e8ce4ae77d8b8e9acaf4cca4f081361b3b084f4f935099791bfd4b1751eec0aa0d1a604816ccb54923ba5798186c0690090ad100ccab762315eb4d0ee2fa776a9d09933c891169770441c83ec869ed7745f9ddb91d665069cce12176d12dbcca8b1048224a5119d499cd0082e0b24f74a6d6cc4640ef820b6ab6836cd6d374099f74421d39336dd554ac6c59a6328d5c4ebfddf7e5a1aa4db59b44912b25d2b1637e8a185ac0fbbb455a2cc51c3d06059d4d3bc9b72b419c3527e85cfd0ea43c1963f023d279efb094fa4a962a75a8812a24bf50fd36234b848566b364e135b53b81e8ac88f11e3898cccc3ce692e2bad8a36dde9b7d61a6aee17a0ad9ee49284a283424f4d9130023ed4858813e0347fb41d54f96f7986dfbf09875b67ab3ed2a2c0b4e485391f37334b7280ca971cc8638e572d60e46b5fe4ba501c40d5b777741f316c6fd5c56704405ea6bc294616ff95d3ebfbed3fdcb256d56946b6c04e058d732bdcbbf14c4b2b5465581d70a26202dc5d50b49f321dbb18bdfa69a0c0de8227873ee9b67647f8a3a7bf381295f219414cf7021d7b633b7f95b04f43857ce6998beab7ed66e02ce435f378ca9afc2d9c97267c9289dc9ab53f92b4fe7b2b506ce9f49b073d8bde4c82496ea32c16c043674bd820f5acb061b56b0edb407cfc93423bd161eebcc7be83b4127e1fd4609651aef10343abe834f1f164a3c949275cbd854ab9e294e231946bf9d5bf170a3ee72466d9a6562d7656d0525d3209ec8d839fa8834a3af685010b97a062ff3ae0c1a80a111424f8828620829497fef4953551fe52ee21f884a3fd53dee6fa17644471f1c59f7f7e01f228baeba95416b67d24cc975394a85685ec21e576c7446fbe1a4a701dea87f7381a10a929fe6a751e80f5d7a679b56dcd61db6553bd133de15a585c1cfc32babc38e429df36b9cb1b3e93c10911a0ac7665edbb2de33cfa3b101312a0c8b11e14b129197ff0eb9f121a617c44a805c17b44943f5cbcf4c288a5aa32ee2a5080ff8b943be8d6e0a68ab835a78f68c279e43712e350c34c502ccadbb24419da5c3bf22bad29696e0f3854772d50f7968b9ca069a2728d3905fa00329552a684e4e9e5f82d55121c1604db0ee006f1e0de516ab1d70bc0ea68472480b58334b11f2ad7a5ccb5a4032ba260cb212eaef0be6ddf4c95e11c346772740989e9faadc8f8c11876f861e512b894d47a39921ab4c6460c6e8bebc09354fc804cf9b59bdad3cb94ce9085005eac5cf49533945096844f8a1113b7b4af69ee9e75f7d0099d6e75bbdd39c240ebbd0213f73a4df4cbee7052df8dc2cc845f49324955886d000e51c89c8bd9a78c043fd1e48941fa253a1d8fdf06e00d28860ba268e24d049d96a813972283575024338d4c151e95c2a4510653434596a7d1d305581dfb7be6c5115b9a93152c70f647244f735a9298faddff763b70bbfa4d5901bea34bef9f4219f634fa35a93533000336dd0d99116e4d3a23880084464052a2ec469d321ece80db6bab330ab185b32a876637306004978b49bb01081d3a58ec5c3b2f9b3b5db17a1a4d2e9c9236631b8624cd2862fa1c324217ef737e0e46cd79c08f67b5f39db24580b8716bfb096bc790fe1b02ac658c8a3c33cf064d2ccb50905963826c6850e3a4117db24ee9b2bcd77171dab1bb4aaf63ca9847a0e70cdfdf3baeebb801c617eb6e7dee919eeebb194b238fc8fb64705eaf05ca0e8fc4f56510939759682aa7d5277b968c89e172ec3aeb851a16f05bc67c4a6715cd10a8db04dc5deb3457c757a65c8a3c667c5e3ba3c81ceb5036cc17bae2a9324c055af9e7234664c3a306f5450f3162a074bc5048b6fd7663501951c48015fc300a7a97dd7ceb05a8045ad549414d086536d6ba4fb877585d07e99f7106a36e009c422fb77d27df07a1e93137268b1bc8a23be72272f76ffb3a32bac5248c7ff8fc7ad3d146e27950700e3c2c59aa1f5c4a0d083d68187521a83e36b473cd5005f19b35e6edc23ccf897a4c3fb93f859dfcd1f0f26cc45a40859488c8c4a11ed9aad3d6cac4c0c156f8332cd24c01b1bde76017e945da6bd1e13db405e8aa020319a69b4826017a36a4afa4a00d51b3705cd4f3022e88353c8a5d0dd1fff6dfe234ac3abf1e9156411e34def8a982a74b9911909931e5338cedc5342f31e5e251b9739911c2954798b5140edcdbc72c2db3d9802807395a921921326292c6bbef0c4572a97bb5d7cdd5049a2294788648820a1fc9bf143429fb3379fd88c2ca5be114100b2711ae057f598cf75df8ef1c38865325177b55648a1d15b7a5252d04c2edfb49079b9a3b4046b1e1f87ce526545a018a071aeee55747c87919e11237180b5ec6e02e41a2e5f77de1d43155514b9942ebbbcb2ed59a8105e89fafcd38858f8ae336a7afce90c14e8eaa874e40b64c03afca87c1cdedb4261c9ee486e88f09527e4c24feb0924caaa40831326cb457a85856eb55d282780f5b939baf9264cedbcc435326cbbc3b661ee33848592d6acd4d983c34e06a7b5bbdb4af61f1caf746cca12648d9da68786846bbd6e645615496d98242df15a44904dbc2e4721600338967605d57fa23233cd0d4af629f0ec9e6ab90fd4a7412817a33467402b8be0161a62288bb95c135cd23402a11918fd250f3d6d0904f1569af6a54cbe389600542e2fe0b3707eba68556a9c522e8fdfbb31b6c46212d765977a0286045fafb3918d38c38267b0e3a972d811264401cdf3586844982dd59af7e0058031992c77450b0250bd7e5764320797d48a0f3f36030e45c1a21e8be1cf44814d080a7b15e267236f4740a927d028e4ed0c97bfecee88272bd827341c703b1d4c857cca9fbd3d10a96b3e6f9fb1421e1eeec91d1cb30cca8506c120dc7a6c616e370138a02f2ded6940db5c1e92941c416c2f2af7d50ae5381fa970c8a0a44edc0fabaafba29f38c902a34f9f523050d944688ac0dc001df3ae96a435fa621cd81a601965f2985b798ad3243c70765eb68f7f67e1584400b5d9e2729315e714ac75b0a0b32c194a75a3e9c0f0ee1acbdaedd40214324409db721cbff86ca6887b90b800e7860b9ada5e3cc499096a954134f4e765f6a58b33abc4dfa1e0221b46fdcd08adfe3953393f16a8a2a117cc52bf1d0f428209ba78b10481c55803e95cd3ec79099771ed3507e7b5f6551fad4b49f0f7a32c71a052187ee35c347df512ebc40bb7ae94a2389137dc510b694233b731af2a00bd1507e07c441d9c2f219b02e923ed5e5b7a1bd0b544e226474274ec8f35a85130468320076bc9ce0c26dd033b154356d9bb33d46c556988a5ec27b97de18f4915751cd18aba8dee4a73eb172742819871c40f9495d1121f4becdffbdb6617d1abc3152254489d6236309efce375519506ab2fb31c2448b9b32d91efeaf93b80251915292cfbd573dd5ad75726989e843cf9e3934eab3bbd7adc7087be75d787647cd70a5b69ca3337b327dfc7ad5569e23663ca5ee844b7480054b31fe72b96387aca843c0b59334d599441dd664685b56bb9f4db46997cd731d2da3b0089ff13c11b09f98e135666da5306a248611337788444c59ac0aa5c614035ff50f8272cf339acba389309006f8c477867590bf080bddf6bfa523027ab143c68498b11728afac88f684ccd8e04806c91d9312fe8411b6a4937d8102715a0bc838a49f1d0e0b9e27c047a1cbda06fefe380392fa1fbfedc21a0651d93b20c81a1111a7ed0c44cbcb8247cb703e575646a5241a663350e5ee0191bb9167a60cb71321cd7211ea634b735db159bb5b420b343d4073a333091046c703e45a5e43fb48b98fbfba7761d74205c68f733cc25bd16db1a4d633a9cc89d0cbcf3058f4b58e231da5fe8de53672689e03de0ea79afc6538a62d36d729c33c58ae66712493a44c9799d4016ca6e249e2dded55ee119f8d43ad1be5920f725668c8f96465db3a1c9ae67468b8fa006363d6d2fee85ed9eef9a113896a08d35bcf3783d121589757eee278b94e71e4e94e41bac9c0e7bb844740e3abcb211ad2060947948086da401d702af6dbdbbb18bee1375ac4b2f088909309677193aa468fc3125f3d6170a1afd7fb1e551afbbfde8f61d0b71d00ac1fe932c08d62382c1f97af39417f7cea6981b125f2f3b5f7369060f67adf4dfabd5ef3da7d1eaffc64e3178c0df4958c132b673b7e24dcff797937f72567034de94f3318ba0f66c241df9003c2f09f9f71b71f7974fcfb6e2459dafe8f2135090fc1cc1468b449dfc2e5b67d926c0af2be9a478da0005d53f3fe8fa8356d2470d01185b0e45067293aa82fae2ce8445117af79631f84375d7b4f9f4e7855a9457d3181c3d0a6c13dab0a1a41c8aac32bf5c41864cb436c97e7c739d749b124941dd404c9af42f60f4da322fa05dc5aac283f9fa612567b80a664763787b9f1761fa06ba811147deac1207d0c6ef943c33d29e9a031bc144b10b32e30cef6b7d5c7ee4a1762825590e05f6b3afd1212f95458bbc1a545cd66ba2adc3b9a55a2aa3557770c610c6d051239da83d277001dbbf035b77c7ce6da840f04d43030a3f065eb5f74a0f70b78f2bdc7bc9785c5b1369c9115d790cbbd8cad3d8a23d1efc6db23b8faeeec31c15489bee096ec7381f8729e6886be1837658b80a135c4ee7ffa6d06c6fa304994bf8ba9c4e7edc8f50836ce1e1c3d386a1c6edfb9ee95e5b1bb52dafa58f7be9ce5b0e882195125a53c4e33e795eefb3352da1c20872bec804997f96659f111ad109435b95773eb88bea1c124c4516ee559e7c581d9b1143ec5ee10f32c519e3227882d82c4e74250d429c23b044616e0a70cdfb63b616562f6231c37bb53a4e4206c21ff4d9d1c431a65963fdd765f068daaa97d009778b37dbe92fb13bb0e3ebab4821769b56b7347a32d1f0631672ecdadb753719d6a17949fade60ec0f1d942bf35eb5fdef580bbda9218bdde66519d8fadae2c4f36ff389b5e8bc79e67846aa4faaad24854e95a55e654cc4c4da3720feec8dca98950ba6598e9ccacaa09a404d52945f55248e082d366abd210594afaf5101cbda6b4ea4abf6e3efbece722946f79c2de62772118514a3e5dbff9af6a22b5ddd7b152eec6709d74341278a99637a94e297d4cfb40c8e954064fc3810ab0ea6e5a2b8d77f6fafbadcbf05385f82396fd07a0441b857f752c696a469414dc1f63fc4589df6a018d5cb6a54bdb3c59219ffb3570172b02fdd65bddba677814fb1dd29ae243a7f060bcb25b7725286bb3745eb7dd95be95bd7c47c1aac839153f2e480b0b1ff021e8f4a4cf3b34e5978093a48691fc83150f2e875c0cecbb37f6381de797e0ef00dc8b883d25f9dc24a2a034e05e45682bdd7fb3c865a501f63e52af077a3ba2501270af23b49502945e25c95c44e2a72753a338155f4aa2825b35ff71efd112e499212e3b7a81d00693c768c07a13e736bff9b4e35dc5accc57a344bdbb776326d4fc8e870aba582bb7f1ce91ec7993d40247a9e4491a9ef95a5853dd4551a860f1c5b5611e2d6adbc2aa5c6d152e5a546a87f6a3e5a5e0221b658e30cfdcd11b9d873690b833c345182c771b0a14f357ec53a0d611649b93af066f6ee3a460943cdb21f3724219771f1977b5f3846750f6424112a885cb10b10f48ae93756d470ee3ed54ed81ce8cae6c3877db6641b0643689973367125ef406f696eb58c67dac6f1c1767d4eaa82d0f4d35236c998b3c0bbec8301ef4871eac90dd66739b2c73936dd6eec169479eff6d8632302955ef3e01e20193c49115aa31773c625a1eab0d69c01fdbddcf56b6f6a5a799d34d86438af30624bee30d6aa1498514d436a73927182302d2d4fa426634492cdff758548690817c85aedda916b44073f881d0e1ce6aab2e7aeda4cbf24cc324c61569186dad962ec6de7bd095ff7b0c8d52f1b64c9686f70c73a2e3c6e0e29c283811b93e76f4579878bf19a1a65cac5cbf1dfbd53ce1621dcac6b4bf1b5143a90661d14ea2287de3c97d1066a4d405e76c20e8d9ce6a622ac9ee42d232c60d2ea1f672a24414458366e6e12abcdd3918c01d7e70aaf05ae487994a5b84fb97becabc2e6a564d1c0638516c384cb27f148d497f208142b358366adeaaaf229e360b28779999395849d5fafcd6d89d96b05267ada1ed91f9bfac8985d396d38f464407d46017dcb4867d7c5d1ec491d235a0d1c65233840b9f8bdbd237097aae9ada2618c883db74dffb7b2f6d0adb19c76492332b6e8c80d8f3aa6c582595464cc0ec84dbab790bfb1de86cb54bbe24e0ad25b19ea57cac39504a65daa8791c17b2d3479dd373ea8e9f0b7ae0388da35b29953c9d46cf08c263d24e66a91195dc748a67ab3ddc1d1b565acd2a55109b199c553d040501ec9c3c101470bcf49e45f9b40088dd22a0a40c2895f8e28d58871779e145562689e9ba8893931faad1ef3b13fbe728d11f0dbdab3d898ca387ad000b817166914a4dc89800c81c1b526ffc2901db2bfc615a645ea6d5d49ef7728900978c9ea1a02ff31545255ee28100e4ec7053a2631e946ea050df4559fdda37ba1b8ede8ceb446ee7e24ef41a7d0c7caf81b65b67262f7842ac705fe36f803b11032c3f4eabd191de8bbddecc64624c49bb0c098b73095799d5c69b0394f3f884c4be4bad81d892de9e56b8562be2ef4d20ef440d028a9b13a11cd8fa6fb9661524895dd322739c762bc7c13ab66d7912566709ab1f522c406dc6e3b54549b86a7b29fea9bc4604bde5d1b4330817d0d7647be40bfd5030cc6601df002854190fd186ec7ceb90976503dc76238653577055a4ad1034198b32d30302fc9bb6560af0705596ca06b4b6107c5003c225bccd708edb6cfb9e84defdef90357990be679485cb9f112cbbad0c9513d166aa8184818749807b2665e0a08234a81b8d6ae0558c251e684d3c0897d532f09a40b1eedf699639a1558f6c75e3761350465114369edecdb9e04f2304527a68183230327280e61d2ca7b0619efa07e98b133fa0b860a735a04619e2002e9e9a71732bc51bde299beb151d4d5b692711a827bbddd1e43592bfe844ef243065056e7f40ab7760504c6adb9d899c2a601eb2e44dbd635c1b051a8ffbfb1dd8e9029c9d15a4fea5b74c905cd615ad9f8643a9af046d59dd90121092022c0aabacf2a7dbcc82250f451e008646d51f0c655a6c86796016fd266ff7b2ce86f13fe6154a4665c7333fb049d6f7f9198ebfc7936e74340d74c3e745e6149eb31988b046f38e522b2422a6bd154ae0fe6e8beb7aa4c816bd11436a59956eb134426ec501ea9e631aca105dc86c151c0aefac881e0009149a496091be97713360f935337768040b217d9c407828882dd48091779884a834ca2999c031ff13681a1884d3a90819ede08e4b07c8fc5747144c598106e02d7064fe5207613864ab49276eb27a370b197348bd556d9881174626102866a2f862d6d6c10004f2ca0887d7f17f17343074c401d78ac8fd3f47ab55cb19f757a18b1e33b324dc8894f0307fae4575108d37cd7a08aa9c157df624a116a225a1aebb0fa04b38009a9cecdb28d20df2629a4346f2b48fca22bb65573bd28652d02e4709b663d7923586ff586f131a1c22f29f5303db8e5828011dab99bfeab744e816123123b66bc96e9e64e758f805bb202dfda12395c902566c5f506626f0e2cb038a9c7676817dc72e1bf196942893112c3468e306cfe1c0ed432497c921c6b7db911b823b7ccf7becaf0d1dfa618accec50ac6fcbf48b2e01bd3d781a7a8d21bdbe54c612ed8c8e433ca4b7f8a5328d1dd9098ccc63801d171a0f131db61dc46878a0923693c19f599dbb418fc85c7c73b7e04e3ccf5786dce0e06e084541d9e1db27adddf10bade7a791511e0481bcbf048da90aa09bc7bd019eeb51748644e9e6a923a363e1bf5c6b537775d5e722058fe6402a725e61fcc89a6ff6e379864cafcac0c03a844438d9aab5a97792ef193d7d5023d706b9a5b96c865dd4873b350e3322886d3a512bab9f27c9fa91b3b870e26647d52626ba26b332c17a22be9d4add760e3375d028fd10e7a6df2c416119c56830b8e0fc91c6235d39a162a047cb692e56eddf63d7138b0e26aa3fc693d7562be780c432dd54fdd8e18a57146bda6c30623b846f82737d685b2f42141c03edea0f4924e55a45bbbb07031c9778047e62463849dc3a2d25f5666a2b502a1d3593ff07f04bed875ce1105562492876d59193e79ca4135c387d005cc5e758faf234c8128f740c35ddb4903e5cbd69150b9e5e145019b7448c24b12aa0b60c1c0461fd0db1ba51eb4a1b81aced55864b569fe754dc6418de827663bffe0b38aab8cb0b75ffba296d84bb6ee7a90d16ff3ec936fe547877db655672288790f5b9290ed4f9285947453ee85522da2e033a6f5ccd52c828803d458c84647e09ca9e66c564d46b10c85666900bc5149bc5c6468341b3f737987aa0b7dddd2804e9f5d1f0318d910a14dfc9202141cfd79a95aed2fbe82631584c8a44af2584d8ffb2a56c90fc9f1d97abd66fb02bbe384d339fb7baa271dd04cd23f7ffb3faaa7bc34843f0f4353f21d3748eb401ce0e795831e0db60024f47884def0f5cc6054fd99906ef4c46fb872ddf55d3043f4e6c23b3ad847f8232f7555efc0fe5232d7dc7c5b3dac37be54f9781e030b2d2cc1f41ca1674b116127a7ddc50febe8eb00f1d14298791c65381eba2fb49474523e2ec5307a31bc65171ce3f098087a030a79a70cb844e88d1213cfa58e54904d86d2e0222075148152a7d1a2efa27041789aa4f8eabfcb5a43f2f905a6b01200967a61d15f0ab11cc558d388fd40ed4206662ee52f41930ecf87a0680223f8ee0b1f197e21e1666d19f6f4d5b871c07a92ffb8b8e90e30c16213d6a8d2a4367b5d207fbcebec1842e5dd7ce59a9a3f330ace7e29428cb660a06b3436b169ec66b92bff32f7368608a25a3ed7f16ec4ae410111a226c0194e7aa3a98e7fcd3ac238f6f34f5fa5711c37b6081281de0ab688ee667448fdad44ee54da9cf6a0f6f94cd0ed114f019b5bf2f9e6ed21622f3699a4437136159275c437736875adc7654931be3bb41d2e753407be0984e923fca1b4b086a5912c24b104e922c7ab58fbc374a12d75be1bd2a48285b00365bc3692314369eb1d71b85c42f09d747ee0054c0d9eece12f11596e86443013058c81843033b96f2031e8c2c39611d1f6fb4d384109fed2869b4f5313da0b9800b41ec60907fc9894170486fcdeb5835960ee31fe63a0d21e3f8b1539e938f775b1fed43ca09b0d6f9056384ce40d992008ab0bc44696cdcb99d24ab7bc031b40ef7ad59c7bc93c47bbdfcee8f5643c0504dfa659d794fe8f8643a0bc2f3ac9bb99091af3b0ae2784e23489f71d22f42a09e46b4de865befa2a346de0bc882642231c1f76cbf6094c23002be31429d12222de7450de501cd8b2af9202750593bd38b6c35e2cd25fe67819bd523ca87e5c24b7e517b746a23016f645ec988393a89f1122b62fe4862bceb1dea888c825bd5960d4029831af2b9aa1075c647291690fba5f82dfaf332ed2540c9bf3471b8744ff79882d22b5ae7d318d70192b5a12c4460d46cf1af641a69975b7ff07d41ef2a65ff1e51f36512af357c16c414055e5b3eef7b5268ad64650e4fd8c19f4f2fa3a842d1f2cdf0a49005f5d0350141f9490a5e2061dd03eda013346af81468b1855f1b9718020d0d158973a41b38b270e3ced6b50c4ff42bb78b4a3361b121ccfef2472d4c32592a2a3f4155dc202a8e784b661a1a28d224714853636900f10c37a31deb824732a3d56aa2daf861ed337d7cc89e54b648a78666279d903d475f7d0520561a4a2e1c25ca1a11ee59543d90ee4b80aefbd9d776187edf7bc35b3df1efd2f0c8410d5bca2536c75bbf08f976efdbebdef84cbcdc40916b9d38f1a13f32ce1f679fddd7c24f5f926c1a2c0a5ff8f7a657eb0bd21f1a10a0adf82e62abd75d057b0960a08773cdd04168a40ea6b9c8cb1bce3f101b1fd1fffa4dfcb610905f8279b9d2ab87f2db75757ec60c93937bba28a78d31753e536f04f9e84d6c7411adf693c26ded1a4451d08afb978bbbb2bc12591f520a5d2bbf1aefba606285c479ebe5acecba1f008bc9b4afb3503739bf1e6bec461d55dfda827fb3195dab61702d48c505b88925e2cea0fd0bc86eb7bafd2f480562bfed37fbc92b2e2e3904b07100f8da40494087a968425c85bc743e011b137129fedd7752a66f1dcbbd975e6fb14a047ebad528168f98d9491fa140717bc20dbeeda0c0aa4ee2d0498b2e017e21fcc06c5a8dd63dd56c7d93ac939832189bb20e7816c0e0b3d93e7dd3cd51c79cc27397565fc31cdb4ee34ef9365c2812c341c70e4d312e0076d0154dcee2682a1ae2aa9db1881acd181954a2e1743661cb7a3f524a855c6f05e4629578c357612aad2b23bf8b8e9151b14a008d4cdf7d5574d330706ef158b04f941249c139d7b2aea6e5bfa16d649055a7706e8b883c0d64a3331d08a65e56dac6fd367ea257f84ae464b3fcef0555aacfddd6f6fe9dc5a2c28f2b0382069deaf7cae4c14dde2a4af2540967ab8fed78d2d377d70084c2266d135b61410e1463f212360c290d1c7c4792f721b046033d6ed7acf193405b973818af0ec7e026c80d0a28b9fdc09ea73bfb0d0fecdc347d193d107513115d520c0739fd34ae7525dd795d0a4d6a8bd189042303c3944dc2c3bb913d40a918722ad5f08777bfa45e90125afe3160a9cbc067918fff1847147324879610249f643f88086295a6d7ef1b1ba0c6999f4fe41f2ff9b88d54445b94f58b066d56d405b452b3b38c8f51fea981f4a21da56426c1cbd71cba4dcf362e432481e4bcd317b5bd0a67db67b0a559dcc252b459ea1847dced7c8c8b153e3abe034f70e2b29f708783ac9c8dc073240f49a7609662801c9f89c48d55772ba037be420b47a473329e21e033021ae4da13729695a7bb563f6c277ced9bc63e305ea3bc2b1f9c0e7227099230376bbad2091e51edec9e4dbf0d2854f8e75aaadf13a5adb51a95bc19cf53f1d13716084390d1e765f3d4b296079700bfd7647086e9e01d4e35223a303b9a10fc061962bb29667f31261e7d6d00ab8b044ca292b91ddedfbe6877d260096660e23c6b8c41e883763b636c71d787c019b3eee8665c401178af18a6403dcba1c8b6fdbeec3a0fee6b2878bc03f30a82ea62d2cd60c46524e445205c68cce4a49f145e2aea07be1e7e38e41ccf7e091cddc2ab0f708b9d210c8bfc2af7b4d9b7ab67205b53667c8e7f9274e2eaa3c5e4cff1b6d637b802f189ab81b1528f912e0f398a6e9b6dcfbf2cf968822d95a69b1bb98f6bec02f8b2d4dd4e5ea78dd4648d4e9835c2c5d6ea6e57a633033fef44eb478a056a485c7523348583bfc549673c39768c9e0c51649f6792be29a213655f54ee2df44610776c42223ebf6eccc4fa6eb7f122fab17d82b85941859e556ec947e5af5ed293382485a5dd2e8fe0e34edb3e6a0804e92f23a4bf9892102abd65310a2d65b1fb7147d5a29155deae468fb8e470296c6a9c55f04b2dc6d42ebf8d65e6ceafbb42cdb526f7b1af844b7185234b687b6fdb64a530c5d63b60b062db1a9b2445b6d424f563f784e0ec58c70ccfc6c6ce04c70d2d7e48767ce7ac6989679918446171e50791dcaa69a6125c580e5dcc4ca1bce6eda84dc3539c95f658c37075b16f6843b3f5d306cbeacd5ee5c14906f58afd327cde5c43d5cbf7530ac0d510b206ff85da670d5ccd1b4c40365287bd48fd8ea07d33241f7da4b68fb0b4a4c55f481f24118143c7a52c5ffb219cfdab489303321cd0dda1232eea3ad777538a4a7ceefe8b01e7e10681d51bbb283ced841ed0d0df633d40fb174de1397c9b193c0e638828e82e2c9a20f59329ca4287d61feddd39fc3e476e4d5800cf9fe1f2ec61ee4313409af24d344c38c57c74b3ca3c0d0dab0ae4e8b91c5266605797626ebad7ab3238d4a7411d554c2c233d6c96f0cd15fff9c548cb6d38a7633359294a4c2d203297e0fe8dbb2392385632e915ae5d230d9eaa57ae5ab014b4519fa4aaa953795f9385ff9459b05b7f88f98cce6821e3532f27edf388d9d98fceb5b92c3276c4cd6567375a29dabb52a75da242b7a314809d267959b263df1e6f373b9c77d8861c95569c9e9797aa02b7883e0027637e1051995b20aa1e33db0bfa6a0c679088da269cde95258d64874164f02fe2a716bc6805bb2b5ae2e85f77508f28d09e5a493fc7c4b4ff811d0b205399221532c678a4fa0b95df74ac3c736a31654306a9dcb4e9465a15adc26c57442449a8c83319efdecf6d74592421c0860b68aaf60728912ece1ab8daa507e32caa501484fed83c9a5689c2de2ec0af973caf23d907b403a64b6b1f3c21c2e12fb07afb69b89aa6b81718dd20eb03e086e3cd27a9b64ae9b033b693fc4e1592387b1aaf070269e2f716cc694246582a7a7056c2ff46985a397770620a0b33c81ca8c908f889cefde81ab7830d7162800443649c13961076ba66bf3ceb306c45cd5848f8b6bcb6495f7013fd3e84baad8350d369f53c105739851238a9f0c3bf7e03cde451595445093100e63c376aff60a216a5d51c43ec80bf1fce647237a7f22bf19c83199388be072c3982af0259066fe01afaff41a285f6d990bf365f5546d455ef7ee8aa0c71fc95033068d0fb35e36278a00701525151b92729f20716ebca2a2a91aa73b8b3d7cf1095874df4b74ecbbc19523818c603877fec492228aaabcb49cb0c5f8256267b76647002d288a0d23591f620067e987c241bcd08ce276a073e21b3acf61331edbec6bd129c2e7ea3df45be5808109dde59d1baa6456912390779193ef5177f0ff4e977552ad603758a1373dd6b5094a626b55de0f336a058e390abd183a49cca8a965afc770cd8279be614b1ab9d1e3cf458490030411c2e1f2f04edaf1ff1a33d3e08961988b2ce49c2b0636a076cec93e6b2c90520cdedac14c4a87443ac5cdb189a42223ee196d21483486df2a64820c35ebd7b680b1b7f6a3d5dbb5756a7ae7d79a82ff82ff440b4ca9afcc1ed44dab63bffc93a3ec0d87697d2290374b472749fc19a42ea1db1dabfc41cd085fe6d52a1a557e8ba08e9d01c7db50515c2a32e3c5891a7ddae9223edb98edaedaa01915330d2b84e2e27a2b90ab1098c149a81b60b522e094923e158d9fee0f9b099a281d6ab3e9445ef4f4fd062624736cc9e620d256743c62c0d387c348c2fb60453d74f1a8a6164cc68b81077cb0d29d4d2846ae974afff20a6eb3df9e464f66c47b4bea18301c2eac14adcd9bc56eb6a12c7b6bf45c0acffab7a7b1fe70d69f6ae5093143d7dd900ca021ae1c97700ffd1b16617b151e8fcb7ed40af480580c9cb4a4c92c69b383cb88edf652feebd84bcf52b30df8dc58f485d0e74a8b2fc908bb69f2271a9412c9077331f537765b857be7d6ff48e0601b03755eaf7e5d2434077215131d55aa3a361ced31dd9f7d055e6cd589a5a48a2d43b0121f94b6a8bcb8353526b8c16ad83f7501a2df9bb237f25fd05bd8449b295775fbb8b6abe34f0ea66038f385c2451ea912db50134c77dd904a41ab0c54c1173434742c690ed384ad073ddc05144870c08ce31fdfb5b86ac5fee2f9e49a276613da33d682a862fa272236ec96c36015446e356d7adf5fdc197d757b7d7258eac95d90481973785b6471ac802f726e17dc824a5860dfd60f98f253aa6bc8376c71bbf88e14fcff5f1b0f473a03229308410fec36fd004946a8b6808219e95c75fc36e9dea6cc242d4d2f076e3c17bb0e7602a8012afe9450778acec6ecbe39d865b8e73ae85f9f3c448e0d7d5ca2bba4fadaed67cba29b985e22a2442daad690380f751dadc931ac9285a6054fd05e01a8ed801b0db90749644673383fb808a8adbdda51000bb08c522fc5768e8566b4280b0408c36d9a6d12ef4bc0a31095babf53c64793a3b794eac375708c3769ca46786bcc2d90d8b9e2f8dfe18453cd24f1a495fab30be5130fa2e4a5b1d22256f43176c4a58028ff12eaeec070eb35abc8cbb5beea7a0d3e390864b13ccf18d74debecb0f12e4db6b1b2608da8bcf3c4a6c85eef8db244b691d5732cf20f0d8aab1f5b8aedbf4777b4f4801a491f40ac7f5735ad60c42689138cb2d648ca60fd67548933c869d5f640aa29fc533c928911e99d375fd8a7ebe28309376500c48970cd28c020c7f3a338fe889e1766b276c6d175e090263edb794ac371a1a22b9adda656a7d3e3712cf20dd1413999b0ac37f0ffd3227c40d136a78c74592ad3d91e89becd842ab08a3d0b16d0ea230c5994ac0bc829477fc6e8891778006c50533b83a68542d30c36aa914408f9190ee72b73379b1ee6cdb9d8db26cb50233137ab3cbaacd0736f5ac3995804fe4949bc0dad0e1108f96f39c07e1b63081908ebbf9576235bfddb489460bfb94217d09d176947e8d50dbf4dca0fff975254a3b275b297b6930b2d04d9115e6865208cf1097a0cd1c41df0f8ab22434398a976fe8872c37d4171202fdd969cd66959ff487001c41dc62dbabef24b40a14e733f824bd4bc401cf0961aee662ce2c08e7e71dde9da5e7fcb0464ecd7c7b652403d712bb9200dc6c4b9dc80308b91101febeeb9d0ee049af0670d0205307a09d386e1016ff3e0247e563addfe562bf8f1b589a605cc713459c887111c1a6bded18b0a33eb3db58dec051796312261028fd66af69e9dfb822439c9a0274162d61a1a4c72cf0b2208404114838055e53ff0fdb86856d3c6e4a28365056c9d28b19ae8fcdbad74e631bfe053aad406170f9692583f09452b3f298dc7cf2158b4429cedcf38619e620dd60723a056213103904f39505fe4b956ac0e7e4b4ce3735d2db55e2400d27d5201fd2bc24cf45d2bd8878a0838383450e6d2826565c180a2cfc76cce131ca61a05bbb11fbdcb8bbd67e40d668ad90fd0a11ac827a5d07cfa0555d2b59b8f2f2b4f90e833ff119da56c87108581c2d9b5a7a03c70c39e1005f18f72845be647e7cb63c6bdd8d58bced3ed7df99f355492a32ebe824ffe90b33e8bf8eea189c64038f7870ef9bd1aa9fee79a43dfb806d11e55e24610dd3e0a635a2d039fc55e449d1b62f22c1662f619891f0ab0ea2ff76653c17985fd1b25881be516a66449f1832ee84562b63bf104f8d327b1e56bab6d6e14ee347a64b5bdcb23cf1695d7c85ea181e875c570ab971cdf2c80a15fb49758caf03da703063f19abdb6ce6e4356fd1c131efc9b2cf1d3dedf968608391ced7b96ee6d071c6a8e38ae76cafc922c3dd99b7eb5c25da32c8892435d119e8533fc3bf65ebd02015b7013b82996ec98d18793a6c43625f0ff004762ab4df9c04e83b4768ba6df27a8b407f5149907819b5344f0e4a76c433ef88880293866ff353ff4f4b5f35789694ea52008808e815026fa225f0cd3636f65846fed129935f410b495045dedc4e2a706cdc292203e0e4188a27690bea5f86f22b7b5a857cee935cafb9dd50ab51b32c6ab96a104271a12afacbd795976718602098b257abaed5d77d1eef63650f2db3e2f815b83a359f31a74486571335467c4640d5257d731515bb0ded783e589fb8559e3d7f17f455115860d679930fd5984411c39c2df51e320acfb8c2b8249f0f80501558bc9d97e4edc268de6f98b60905f169ead6517061521999f68d1e38c251ebca319e222f8e48f084eacc6ce695f847925a83d2db6b75ac221d6e092e7338a703e66f5ec3a3a4930e1ec40a7805b167b1256af10622fcf44b11dd191f4f145ec0ac5fec7c99845beed924138ae664b56fe112ca3ff0a2212a043651ad8b579f32710de1f11856dfc12c6be0f817fc81a0e9e22ebc75806103faf3bc26ab1854291ba3ac0649a8aadb04452e18456af98617a3fd3538f315e060fd875bef2fd0f58f8c2bc0d134e14f71637cf880c955edad8e8b611258b9d0895cf2304e46380b28b1c598043e82dd57e44ad06bc617f78ad02b205c9a0d292e0ccb903a834989365267713e54690647ea678a0e30f8545f43420a700b965204ef96330855644eee547351a9153ddae1175c5c3a49615261002a89a3c7d28061d6870254bbfcf8c4d3f232c3b458bbdf452b4ee34f22b3848515cbb8621ae96977019660a2a566dd107b2e69d8f88b8b63a3a3db4c384833cb5dec81772ed77ad64ba5d2f574c2cd0f344976ed58deba32a0351fd15b151547da3ee939f239e01c7243e77da80e84b77ec27a9ade9e837aece030d51662288da86781348da2cf9e4d91fb1cf94d77fa9d82927fd506624718b8cb4168d64f1be9d785abca0fae1fe967e8bece4a59e416fe8fcb06e2a6bf560d9025878d4ec80b8a1a000f3460ca67d4d0f389276b674c70b4222c1c22c5bfbde3e51faf73e1d4e1457d17d911bd02e2e9d96571a739353a1a39d22247711eb86f688155a2726035b1db07adfebdec94af9755e8a48273d18c61d81e6f03afe27cf96adcada8b8e2422475af05eacefd52e17a3dda8c655a41d9b8300f1e6f94d59a743ec7ba5245af0517981f8d9e6f8baf8b86a0c82fbff35b84fc993861b390bdae49f3c4c73768f4106be0437f20d00e5b95a3cf611821aafbafa8c73e48c18a7012c4d20f6cbe87e71f5c6fab6e44556e79f75b643915068073f7a1d94604f7226ad60633ed37bd4ab16e4415a7b80d7903b448f9031760807a180d55a7f1854579b5272b11957aaf1612d02750c1b0ed4a59f6a0260da01bdc294e39416814845ccda753801cba9e02968325471d550cc2b2ef8c1fa0fc8700126355ab49b98e12c2b160ad383e59a00692599dc3a35e8b9b4467ad4f78591a0b8fae470077f55f1cc14fa24a682c61762b12d9f60de3c89110c2408f3a83c4a2a9c87d0f3f111a71d5a3c35fcd49da62b08414d6d34a28878cb2b1a625dae9d88dbb12b6385b1ce48e25584b561963cc230d98d1c2b6e31505279a1f0bf4dd9f44a5b50108abce5b4903110cb5afcd61c89c91f2ac4be423f7de443819a9b38cef2b501ad2a42123a943856ca3e66f327b4030242bd9639c4901443a99f54c2c08d768bd4bf755ebeca478b2aeae56c936ac081d81c97b3081a4a48d49978870f31f7f774a63f0102348cd06621a8465bc756d11f7edafaee277d33e7f2c35ac543f025e1db35138430a298f796cb30bf208294ef18e18ed8286233e477bd1e21438a8088e5b88fc664bdfefad96158f5f8db305babc207f361aa787711edcd0040de5d2b60d38652981e2f1346fcb1af0412113ce3b1340489010c7f373f1b4218e146858c017ebd9305f3524de2fcaeccdaa814c7dc88b7202fcdf6aa417745bc1ed88fe3e2bbbffdfeae08fc3196641dbc86d76238e96d608cc0444359d7de34765505d899cc0d538bf10ebcdeb8d945abe5a1ce710b676394190b80a76b7f6aa56ba74f2a7c86a6157ce8890a5dfbe0a62ae28ae7347f0bd44d3b67461b7d85a6739215ee65c9f304f1d64d34baed53a40b135f1080c599e30fd504f462631e69f743e766f7a8514ded78feabb6ca781789b2eb83ebe056286d212175c9e08c0a5f1991b14825c501f3e7b8b59e242a11768ce43902711722b383c7e61e150d4eb1dc3d7b99dd14b1565b2f98f16e59e3f6d3506d1ae3c1e4f6b310da49462744bf307a6b1d361ab45835316aa96ba83fe8e2e5d5e2d0b836b396ea62de9b5f83e1f76cc1fb7adc9c30983ee0fed148a50489cbd1435bb0d69d2d8ee98754690fdec4ad02506ebc30f255bb96c281e1dad74ed2a0ac3a477f597d961b2c7bd0627a42fc11d00d04e5b59c950ca94d00b64bc0945fb3dc5e58241b4c3c13b846b61424c6c86c751c55749fbc48a2545b6375a0b09f5ad8927359de381f0c4b1294a50d8cc73ba487915775640afe2c3cc45a7f060cb1ae44b2931ac78a2e5539b3ba79184d775a5fae5df3d433e32c312df49171bb3c7ff1206a515562446b7a5a0b399d22247ef327a5487927fccb78aee4d40fa26f7c0757bccb233d8e2af61d588da5a51f5a00f32ca59af193844e11787f86d1fc968412c1af469bc8cccbfd775580dd646523d2fb63ba43e608908e372216bac21f61bf3a359da80ccc9fb3689d5fb058f793d2bbde05e6f1339677b48a606868818db2ed04fea2c00fc730f03586e116eba4642c404df12f6a09879ecd5d620c7af27ddd8e5b72a3790c48239ab4155e147d0c26085b1068686cf17b89e8f62156670e25f1d1b0234a2c8c2dd532606c3f2b8940066deadf66f56a922b8c9cf60da212194af4316cd4536a0de98198bfc9388cc1b7c5cbdeda337e1ba003451175a7b390a11d9e4040894ad34eadf3117b6b3861d7ce0de1be0a2404a40f7de0cad44410e0f892868a392ec0090cfa482ffe87de1dba5402550fa24fb045ed2efbc9461e05b52ae48b35f65185464cf6b462e063f4f2c6063dffeb4848b50b52a0a14105f89f0aad3dac2c35466ca7af93e8723ffdf0271dfc73506cdfdd8320a28137221b7fcd608d32ac486c2909c1ac125b05ae3f11281019adde1c1329cb3df59849f502c88f1bf3b9dbe218cad2299ee2b5cdb14715068dd52809b001e98740673798fcbb4569e6b557a9f6daf4cd90b4b55f6e151cc2fd4b9646e97136b108fde318263696076ee49074466211ef7c49c13ae075e9d83845ead3cc005304d81fb57cdfe489f2594235f94478622c8bf8383ff6074a8daa64024811500fc192f8c1a925a5db63022e2821d52dc8c53e41c5134433693b7f67e0429f6d0a93422a684846bfe3e797c3dab31cbd0e6dbe76f6788711d335c3bdc070c8ad0cb4ab20c22102d82989e9baed187e4e21df4b23ad043d91383869311668ebba68721586a097fa504823f94abf8bee2c60787b4e58ed29486b2290f005ea5b32ab0df41b648a4b8a214457f8d006b68db587d26a474d55acfe7bc8bb9a795e2c101aa468001dccf1271148b7818fd7728108d3e94ab8d42ce7ea4e38e1e8429e985c08a5b5e2112f514f35ba2f6efcbc52b672a1a6a1d8bb31a3353bbd89267469059d30207dde74a498105c20be18992bc0304053b1c45aecb1e82d652fd88a57e6d875f16ef84f3e627ec84d1179fa9cf46e212ecb9728c4938b398fa82b1517b33f1940bb31e13ee69adc6d9b1ac1c4de8c40caeb788364dc5bdef3805cb6e2ceef695627b21b443c45613a8bb2f2ed5a0f2efbfc2aa0d428179a308318c8c7e5daabbcc30e7849bfcc11c8db56ea1583f0de3d322cba806c9249c5542b2c9877ede25c23475ab5727d3543e7cb7a2037b9356ac95ce4e7ba518385a5bb1a752e9abc41d73b3f36286c2f0599d3e9f23895ad4c5c4b442811bb430c470e634d0751a5c5eb0b4eba30f482f35b67acb748c7a7df179c043f661a2a1531e30fa6a7ce50f9c2162097b0b3d168abbec56b36d2889ab4a8af033097c9aa15182f3f3baf6508bb669e14dc0fc26055f4699522b318cb6fed27025105446dd3c9e62d3d796934d0fca083ef3e54123992cd5be88cb6aa4acb41ef6c20e394e220d368258ebcac7cde12b2a3231441db814d82110e9a078cd9c3afa8e7cb06bbecff84ddaba5e21d0a20f66938dbe31edf9d6f0b28b8bb04167eca3b2ffe703a230e8ddbd4bcbe576903cb061a907e2d01feb3220be336bf9640965e64a2d71ab29ed35b0bbd0db739a0c3a686f44b2d3c4538836f9bd32c4921b8867036bf9e0df731b46458c0b24100ab9daba55026c39d8ea78eab8951f7248d77b119191f91efa5d7b698de7e209089d1b452f538762a8b6936a7da646460e43d49d78424a3848790bb9c2b9bf641b1dfcdd9ab695301333bec634e610165af8860cff21e80f301cc0053cb26351fb4160aca6e99fc9c1717d635396a8052fa97029219c6570642c519ca55d40883f1a49b1b94e42d44da967bd7983474dae43a0d9c106ab6957f7bd7e98f919cd87e29f46b4394ae40724246f783dde38bf5b286fdaeca31981fc047567e7f6e353833e548ba1ee51ecb2cc6f575737568f203bbd412c8642d36a14c10347b3843afe9079b67adf8bfbd888633c531ce524aa8c423e4c106a287a733c2dc49892493e29a394ca38c289136c34fc730d6400d66e56f5befb615a3cf83910b1a35f704e7aa114a843f0bcd23fad81276504b8f31298046e11e91332dca33890239c82d924439f258e00e3f4e621b6ea4a645fa1c451a0383913cf7b9f070861a92b4b935b6a513803dd7e65ccb44ae88611f7af66ec68ce1afc575f9241afb39943550afd4e8cb67ca4e6c5cecb86de427b290579a207cc7d8252b27062dffab384ba338d4cd6fc2573f02d4a0421a51ed218b19f2f0fe3d81eb819f81b4c6b735a31edbc59ebe5eba4b081cd151ea943052f72e036b76b07a70455ea383f291b6904f1f9eab6c793b645c73635108abf378a9571fa6a505de763ec58f9195c4264ba895c09c3be0bee4644b65b029d48f3c48c16859f04251fd2bc24d5d83fede56fb05d8ea311abfb620e56b13fba59fef5f22c98189d3a94cbed22b0bf73396d9ed71a986d07bb75e56f6eb4955ac218b1243c205ddc5b6085da66fec5fbc41953b27b7b151e7317c3e6f9fa9006f0f2f89cb53092486577244abfa99065e705a39e4ae5e2f9182626c9c67fb0c3c17870e6a3a9514a789e90dfdf977865d22ce65218a910214de41a7894766e9d41b80aed92573c0c12e1da0fd1592a78bcf60f9f4fb0c5fa1cdfbc792f78f9714ce6cdd692c76e05684158b827c2fa26f03a9dcace322b61a76180d8e91063a8807731bf46b5a4f05db19373b88d85e5ca06893277c57bf2c1d781aadafe2256b599f2103d19a9ebc7c75c42aba47e25e31883f138f7e5b214a3bd32ac84c41ea1c60dd43cf2aa7402729e7f6cd68bbd47e26426a839c8aac6faef6552267d0d7894bf5e95618a6d7bdffe5c5ede31515e1b4ed325f5f1550f8886138ca405ef357bdc79bc0115462404d615762d78913c8f9292bc007c9f9abde4ff78a6cb6f0d2640ad4407602afd3825f50af05fa65db34e8c8ebe1460f776ec01e512e4b64f62b81b3367c1572b7489416368859071baafbce97d325940304d6f58029294e354f9e03f4d03a42e4cd0e30b88c61d9399fa25f076f9bf896f4733a986d1d9a63d17e26705f1a681a36bf5b9452383fa018bc48d01a3f9d8344204c989ad191c1b6ab65993d57ffca0e9e931f34883821825e8378a74e824e48ac94607602f5f2659d35d41682c275c861afa189b898101bec6e1470a82a16ace3c95a03e878d8b76c6dad9578668fea2d0952778403f082a683c5df519c0a2580eb9dde228e0284cf84c2936d3777395d49a13dc50d38bacacdf6cf2003d309196c92c17983a179777451abc874331d342e02c115ea9147a565968cd52749918105793517e9ca35af49a18626843b6f1a63fb087e3b4133f55cf2ff79ad6b113f40e04420aa1cdc447c6b3700b6041acbc2a17fa81712445a07f070db66f4edb4408a8e499fa7cd821908bab367cdbe5f235e3023c588d872f3f415ffe0c461d2faec735a339303c63e74f57088cb89775dee600eaf9a53e6c9608dc9a8467d8bb5b4eebd69c2ed440927c45337184dbc906963f627a13f13185898faf4443dd558ba30fdcdc4a6144333206c945d7db4d5d1460596c31b2c00e435d6326e95e239394fd8e9bf411cdadcf6f9899195b0898ae37cc25720ad74042788885fd66da309c6b13a0d73bc0678f0afc6b0a71fd7414e880da125f5158d23fb53567db4a42141a121e7b2326c50d3ab3ba34bcd2032ebd41237c056575d26c85c426a8ffb575054ea3173f1c6833fe8582a10a269bbaca3d082ca1a52e5553c871f0f82522deb356c416e88538dad8e1b4b912c176413573507db238d1a725533db557c2285d9304e2b7d19ff4c4d24fdb48cbd9b6f19d9194ce5c3424431c0fdd583ab25305ae6cf6b25811edf0f01f7224df67873b293930dade3e3672055224dd0f9ed455cfdaf041268c8f49a7beb51de0aff27365b215a241d71f41174257eeaafa0a68beab5a9ddab171a9db0721ac17aaa90242b6943c394feda96730f8f85312d12c27a7a88e8049486f162b3ce5b02111db0fe360ca416d27796f25d9d2e78ed1e5ebbc0a20b4083120865fe96daf9125256bcc530a291541fe87c72eab57e15c9643d2a61e4db5cebaca8f52f9a85a0c78a40ecafd1526a927f18039af82075cf1bc0bba98f7a00402c1b803f4c574f6d40db76cee91506d0da21402298b2bef6187aee3b85f7e153386580b82914a4b3c69cecdbf1a108c70174d933c9db0f54bdf8f546b514fafbf0512de6d20d780a002bda80a5726055bf8a28603219d862fd92910297e4ed0227a3437e42ae3f78e8e6e22345dcd87ea404d0e29f6818bc82dd1da4109e030465210fca758bf462a474af16fab51128c5cdd66808b9e038eed7cc7ef9956a00bb082b1c4685bd314aa0ba2492cbd7d10bea7099d18d1d6a377bbf1ea4db13656f600611c12a84cbbed41d571aeb9934036ed40536fcf813125b2ebd953e25bbd2a45cb7a24ee5f6622e8ab37465619bd178175df9b7c95ac64367378c3cd0140069f1a771f53c1aee04e1f055038c566b91b95c7ca22655c860f06904f68b7e18261c129e2dc1066f3675361e66e7d2ab46b72a4c2a377378da04199aff21e80ab70b35db6770582ba46656d2137222a01a683821b72e589c8aa7f49217a74c628dd2017a48bdf83b2f3462487b2606f2f47b1eadd7abaa23616f5adebf77a39d3d323d14938ee88ceaeae23e1b4c9b3e3ce1f472632f5b5f39d76c946a67980a135458b3ccb1c9509dad37b522981d514b41b4c131642b50067fcc118d524317d9e9bb442ce396a86e5b428b6a40b0e6e9e857065be7c103a77ddd2532889c1354383e1f9c160afe5590bf756109964587b7c9f3d92666eb9783551511848096b8d8fd30f17c9642c58cee5c0d6de55c522906e7c45d0939454bb44fbb47348db92fb76d51b2e1d7b32abbbea0d179d49ee3913f8165dd8456d2ba61a5000ca6596b3b9f3723523e0a7d82bfd26912cdcd8870dafa7bdf5b480290a8a735d157012a965415686d529745418d21602241402b778291d72f7fc183896d77ee248d3fb8b61648c9c9a8e19492e106ae93b0cfc4306970a53bdf9059f151b3001eea9ef41e1eb894adaaf54a13bc734fa0e6f6112685be9f080717db0122d99faa1fe97e05fc1c57e6cc110280d9ab0dbd8ca86243f9fbcd6dc56ad9e77625902dcbfd7b5a172cda669cae253cbb95c3c97c18ec3584f70c4491f6d34a2c55bca6d25d7c99801f94e7661c0a03320031466d9e9adba4e1981b7261dd844d109016712db57388c1d35d1b999928634f84d5ca611cac5e53d2e2039b2d2c38a0d3ca438a9502964a21ed1ea5ed8c044b3e022a4aa02858f29d365559f77471675ef0755b25c5bf04c2f9f3b1f39d920e1b498a3f92020833c2755565baf15e96b2b266a118d40b39653c63033d31ba1db30d33b5f2e9237b2156a46bbb2c74619f06619a53ea93bd56ff1fe58669fe7511c7a990ecc1a5ed2bc9e6d45f87e5196d40abc44772e37ff7f101988e8a9ebb9ad25949d694f124c02153cc6970290d864c9fc72aeff8e522298c4cd489ce25e2789c1921c1422806bb805c617c8981f9af5fe0e4e9b95e6e60fa69beb19c5fca08a0bea187eed957d3893e77b59a91fc97d7290f6c23b4e17520f9430e3a898c7259cf76caa23d06ccf16d36e0c7900dcf3f1c0c6916d425e20f7bba9b45a1d09dd87e58bb85a621ba8d74406a767ab59f97334fb7bcfe113e966f57ea87b90f6ee7bf4ab3660f2436c764f87e32bd6a4a5f978fc6e9ca350260a4c1d4d1dcbcc7c059ff8de670c2a5faf08f5cea1d9ad4f931ad45fceaab8ca38719bf8ae152e302a7e03c453bb3338d02c226c1776fbe8e696def33cc9a8c9000c6b680a5d20055aeb5f01948480f2206be62f668247ddf0c7424ca4916f324aeea057e551b0629edc70cbb75059d714fa3f5d707c4602e27bae0361062da7c6e503e62ff3c30b0d6ea39534d6c23d2f89dc49d6488392305f499865b2e861f20775641888c38bac092a1338f422c4e159c1e1473ff24bd214cd639a5fbf5823bbf3537745755101814a4cde63c0db6511d4390fce353cfa12700aeef529f39da47d3d78b77d7ffc08871e5061d166580596586a33022568e0a95cf7736f611b39b315357615d4a3f6f86211409cb0cc64ffb35760123cffa28be2fd724596afd020fd0606d159ef9d5720fefe5273afe00cc8b7ed5865a5d488980d67ef2092d5bf331f2fe24071b68d51254e57c1881dbef8b4bcddfb4553081196965fffc1b05b39562a191b41e6ad1551f9afb575c21efbe8616e516d9092005a6084a09459996d80416e9ceed1877dec58fb910045aa73407dda5e58104366d3712aa903d766c352b84e78676f30cbfd99547d47ca08c2c8728e5f2ae3df8a8312186375af03aa99dba2af73c21f87ad675dd8798a7c997a65a3ae958d01b217cc4b98bb08a3abbcb77237092036d9bc43092367d4d0aaa905cc39e28e11a72a5045123d211ca54d98e669240dff4883fa2de45daf38c752977fa811c1b55609c8309b3550a367079c1f6fc8ed12bbe2dc4c9553470a59d54d323420762f84022764669e2bc16e67d0bfbf723c270ade8cbae829256ae252aae31387d096eeb18989067ff40ecf6d9be0342960df95780ef81a84951b907fcdbd61bb4d88492c590411462e5e1639a5fa251c03212ab94e4778ebcd48ad5df206b2fb4fc4033833b9034bd6ead0673578d551691020256fac43fb95aa6ae497134ca08e7d3518057f3261387cbddbc1bbffe402c25564a7f2af46154124ac783318364a6f22f293e3a82528bf3c284babc3d064f142758ea9d291de32f62ce0008ade2de0a150a61c86b011430a144588b7ddee8ac29f9fc767a89615593c7cef9a3e02db71efb96210ffc816057bdfab5fd9edfed807ffb3cd84a99ed564ecd5acbf159a7662b9e83f401c9489b65f88d28c97b3be308c3119a80eb23877cf281eb11a6be5e765cefa15ac4bcc8dacf47d8e483877609393d19f95c9a51932adea06a1ae4cb3c0ca4867dcd8dc487acf0cc0296852ec641da9d7c90adc81ef02981c82e33da89718949f34877cbe0787bd80b8a88a08b0d6c8e100a911a79aabc524e257890db7cb927f4305ab2683ec9d378019880afa570ae15f6a52e8e170567c9a91092fbc294a7bf71f5278c5f99b46b78713fcf3b9810f421acdb2b014059e9cc5627e96660bb8ceb2dd172f412e4f6c614bbded915c71ce29d7d6eea3da7cd166caf4ce413a5f66002edf6b1d496bde3823c26117940b9bf5f4949d6ec4df19310a57bc43a6ca03b020a28f1bebdeb251d164edd02169a57247af1122ca37431883469aa901e50aee0b69745fa977c45a9477c1f45acba96be8bf42a68e4a48ac6ea275dc87d5647e2e4bb616ba6f4586aa3a8fb3deaa7b8f082cc90e104a1611654166541f14826d253082135ead870a659606b596b8adf85934b0b079d1e7a348209359f8d168b15d0ef918bb3dafe822f91a9131008bf9bc199f3a422af1388d5291f23219001a3f3d5c5e109fc8d4ad62a06c63db3ec3d1f1c59bd61ca52b8e4f8c4840570a2e9e26665b3d8541ce32b34a5b12d9c425857fa1bec75d78721537a4ef452ddc253b79c087a28c5bf338978dc89be8f76cd64a252ef0e7d46944b1d89efa1889ca5c81d67d660f50610fbe71ad304d29f313fdfd898071a4e0562cc3b3a65c72a4341a59bfd92fe192d481032e53482eff4d94565562c8f75638a1ba60594a8156699ae300377c18afbfb4f302ea6b3963704a0410b565f7c971d249255883432743e5001523f663eed6660591eaf966200fc61e1b87911d4c7522d50ec5ec51c15578cf50f497b113e1da18444d50dc7e723f0363c352ed6ca3406f959e0f064827e72f9c80f923804a3555826927e11609a0eb522669404843073b098ae0603a2041c38a2f4214289217cef2c63ae05beaa00c4b77f7620750c01f1003331775706336f448ad32d03974ea0ed155c22e2c0b50284ac48930d58be043c9628b8faf8661d782ea9437cf7dc50820019faa5d8c33e845ac65b064d007cdf0aef93ccf25126d3827b7c60497cbfaccd4530e981976044008879c184324b2281f396bea0b15df5aef0a80ab4a74398e3110515c98a8de0caba4a43eb33607c9a1bd0776134292c039741b8e986de6cb8a66aac1ae7bb9472fd97d61c6d8b84070b1ff7096d4fdc52e66d17ea857ec064a1b77821eaba5c7cf25dfe8dd9188c7a70f327a4386953898c50515c5e07b0c8d6e20e0c40e749b414ca0dc4d78f302122a0d60d41c0d7fca4c5f851b06e55b183f78e629b3fd93c1677a707fec77251ee896bc52d6e13432c95e54ac7eedab5a6d4f4bf009343e6a283a80128dc03b60d32c47e69ffbe15c3cf1539a46079ebd954b9b07ca34564f3051b25957b3fd9c146a43835ec85a59bdbece417978db00e2d86ecd767eb9db491a3f74740fa159f871790ca84094bfe32f747885cd831b693d2e63e75e963254a313fd01e86d5d29436397bf7d69a7825a8084a5d17d7fa6f130b642e0e61f86b346e15fcbdc868f4409d046959b16662eb78ad806784ba3bd0f467acc909bef00a7acd467eadebe651ced6543c8d98538731381fd0a23cf0ee97170830e471309294933439d001954d21c72ce443210703b0805e073ab3bba107a02a78b87e77fc3c2384222163c35a4c46582b2448b3c808c48c862f1a2b4ccec42968704a2a951d320da2c846537b0fa1b5d854da779109d7dff4dc555ae775322a750112438bc976a3628945153369e17c1264478f227c0020a773c6437c7999e6764911aa5d8527567ff4cbdf0143e23842f5ad3c06050cd6c4de29450a9f2e0c9d248992872fcc9ed18dff47fc32527d0b6fe889e000d54e71ce5cee2188dbf37fc98f2e3d34873d09982e4011564bac12adb29f0e5790b47d2812800808aeb89821365525dcbf8bab4ff7737a89f634a93bc80acda41e358e611a024f02399520cdcd11d4486c0908e134c2f3c7c18f93a5bda9d6c5e54118598f93131d9bf4631b0cc424b11f043741ed6204a8c51808115b9e4b4dee2d50a31608f1414c3fc4de83a5c7f1687cea2eba3b92782603bfa73a54bc78fdcc752537c60b0f5f1fbfb4e05140588636e9918dad3f48d75ce931a02f39d4fe0b39a7d0eaa3e224ef825cb7d94d25380e1fb87fc36c760f3f6e6b62e2d52d4d1682f8e6684f49df629902262fd646ba2a011e70d14f3ac26fd3767c10709ee101153500b44e422a69cf21b5381c6f4b15f724317092d9fd7af23e6e97258ee7220020fde3f01c465d26bd888663966848540372608437fcb966a8d309a7d75858d131e72f173b6b85f1a27c80a88328a1577b68d201f1a77bd0dc113b061d544978f06dfb4fe840c2d8981148d625c85dd069744b55b65908bc32a4211568bbb20af3525d106d0ac97a0ec3f7f27349087e89dc5ed7d33f3bbfb5711904b085b6cb3e3346e0c901a641874a6de568564285939a19e317c7b4aef66b744d7ab0163911b1e911d7bd2f5ccefd9fb12a298240ef6a837f32714e3709c6e08ca9216c981c9b1a582984dcf0059310c09c55cda92ef77a329a8e86fcf0f744767a6c4616726bab748c5a6fc32f1a05e45a1d84bcd20c2f0275849aa97ad4d3f0451d0ce73a04a45016f760d36643afb9eba6d021ecb6e53b912cbef11d1f590bac099b3e98e8fecf332bc009c7ce15185796d3d2f8acdcbff84a3b11cc89eec9296df8fed6a231a8f41651a673f14540c1190baf6382354de66ea56ab686d7361281573ff327442f7a085429844b800364a662ebf996a6a3b21769b9cfcbaf41806d7cadc138b57b44a2abdc60a731d9c54a6c8323fcf279c2fa13c5c8e8b97896cf3c54be90ed130ec753757511ae6917b772dafe94f521461d63cedba8242e1105f28a261632a30db863d7e29e7835f3b71168cc8405ae199b538d9e3a5d89d16fcb1a87dada4f29fbb52b717efa0930a636924b530aa4958d20941a66ef0564d55ac8f667807bee96e083e2d6bdeff0d73807fb2e08a6df6154fdc05ebf09dd2603a9a387f5d6f0d146676f5274409f10e064f8d88f54a6cfffe2e69b994d5d69757d57c921983d16a7d0806cbef21ebad0b1f139466ad8b0c0cb8a54e53c3080c616b026149cf39c3acc29e759d0fd6b54dd428ccd182614944a9b71adcdfbd3e8a95944f79b1337050feed6ce72dcd4fc6b36bac51a05083d62406d0d4e83041632a9e84d3d0ac4ff393059f7224bf0ad5a4cfcffba0ae9660ae3f350354522aa3394da4ce1383faa6723b8063c93262a593a590d76d00f38c149e69925b9ce9ab15c3b5e88f94a3980050ba82eea1d90ff8530787e72564125ad5d6c9a2347d4d1b1bf6fb712fb96bcf2c20116c762b69449118546829be48b8d980e1e04712d4c90136832f2fc03bb9ace910446bde292d37e0ba2e228b80ab527406c460004db2e108a23374d737147b1cbc22532b8cac84b1bfa9a55ad8cf29fb11e04b18f9834763279aacc000b88650c893678a5d1f4ffd844f7ae79e04a33a1db7b89e7a4cded60883703d4c430ba44c7990f59b5e0e1537afb6caadc2d649b18b19c4b236314192e3ab8c5c62f007341ce35a86d809756859fa14afa6184296f65a4c262b14b9bfef9795860986eee85d52d25ce6ad99cd48be425b91d3b6a18236b5a6b327532a26d2c2d8387a338169fb882cf145b7e8434bcb7d829f22f5e954caa9e86a1d7bf1240feced94f80e00eef078feb402f008ff05ccb20eb1a74bd61089d92b519064ff5c2176cf5be544a2bfa705ba62bafda1c7b1551cb4460bf0cc233e2570b2068cad2dbcf92b112521ee8eec2d9703da3b49fc33fab217ffbe97573271b867b7e6649fcfeab4d359ac0e8b3d37b2eb1bdf4fc38e5a8e7734bc6e282b34fd6d292528a9d92740468988f9a2be8e47a838d538a0cb08b914e8dacb50c9e996e91cd9e63aa1a8df0533a60289ac23c577340e6bb490676a1f1c23fc8ca6f918049f05425f7d0d240f1562f8e05ab891bff85ce6fe67b7f265e1903d2e44d3c9a030cf1b61d62ac6cb6ea29283319b65cd3d1ed99ee9b00fa0bcef7f83076494857a1aabb73d8c8dab2bc97452e2a10a1d158fec1bd1babf8a836dbc0924759b67a1168ddea7ad06b73e05390e8c92b79703e6def143f28365b62e3c1e0416281da2b8f3c9b3adcc2398b0a7a4a75d9617a8fa5a27a5e9123056b1adf2fee36342c98329970c01b0e9271b4012653d4355ee0552f0809c288fc352b8b71bb2b2adfb224fe3c3fee3f6c9c236781fa8f452c1a3da1aa50fd8072aec2af1fc479ead2505224c0e7cdb00cf9712e282d964a6202fb6732c77bc425620b1a36a5f60bdcab24b99a5a453c5882783a1fd8aeaab85865842dd03ee87b3b4b7713b105ea4618ac3563234e2c2d2a249f7bc63e75ab93663b324ebca3775ce4bd3c11e40754d45fa24be8fecf73240d0208a446324c7f5e86c2a00a735a9c8e21dacfa4acc9673f33bdab6cd97cae66492989a4cd1f0a2431e58098515a1068a1bb703539672337e9b7b25ec0747737630c6e2b259967efd4b77d44d2a92621a25865b3900657cab83bd399557bbe6711c0fb0acadeb930f7a42feefb9e21efded7a2329fb1a00fb0288e463824882efc21cbcf93f671aa687e990f23191ce25f9a4d0d5f7eee8292bcd4fc031a1b9cbb0774cd2b8a792bb8d81fb55485873b875183e5f91ebfe9f1de1d8da605fa615e3b372b6d5dda3e70451c252c39d4605fed1b0f3bcd993005a2c398c6d0efb2ffb421cc4424563dfb530c7aef1292627ee24226c6bdfd1ace879a94f379bce15e2bc50071bda35c0beed005b269478aa892aa8f605c5556668fa685f7212ba0523881d261005b245b6301cbb132a45b636bc5c8d50876738073908aef2e92dbe881853e0b9785630679571d900bce84b8fb6459efe8c6d6227a2f5be9b8a0e274e6a57b143f3e52a8a3a1b36916575a00c0a35e238e3ff4bedd51fc1a80c7fb01e11d04d4898ca07fa9d641695cbfc0b7bb94595b05fe9fec182ab259ed771f4027a3a892bef38142c92eff302e5b4a3ac9c1a95d339ccc253766ebb29b6595d32d1190e23cebc5338cf91b4f4dd9c92bcc677d392690519712713cac72f3df2161f4e22e4c153ec8dee26b4918bf30b507460a93cc3d6cad0c40eadf6808ba37e80d93e31904f568edde2130984a123d19d58b59f02915942a54364e8540560fa6d9aa95025d3adcad447d05a09b665f02d8c2e319ed1f66f8b2e2b11392574e8d83405cff9a54b74fd2da9ed6e0497a530078d8d7832c59e37c813f6f4da8da2cabe89ed55647de9f912af9cad9100f4f1321cb856191e57051196aa9b54c0061c834be101a4d700ec16528155c16388913860ded7c62500b6098be0589ae1ceae8de53123dae708cbd9c8a88e96472e009737a1ec6464fcc28fe1983d8abc58f5fdd9353065bdc79ff750beee71b2cd45fdd3251b223a95403726ce4635c5fd20764ebee9e2b7e725afa457513bddae2d8468a907ebe1cddf204c831422bcb07c36d046cc0512e1861adfe67af02477513763bc8bb4de4f2ae3e04a201c9af37c4b8bed3e8200297795510a0f166b4bf301b8020615120a8ea242ee1da6ab60bc6373cb32da51fb3ce051013a7e20c519cf821b7d1c36ca1a0f9854d52f799b0454b5da006bf3b83c0853995887f6443a7e545b4c29495ee0ba8bb50f403ca75b35f61bfc0948c9e033afba4edbeb576322d49035e4cb60d113b40370cc87a35328e1f26f8dc18cd70cfbbe0abf6a81f1b0ec1760e683c2bdfcfa11bd40c2eca814f4b4195819a985203b41fbc98377f1a11fe498e21485ef200af052d2d8b7c40c87c8784e0799bbbdeab5de79328f8803f8d942a24e83e190ea1a0912fc950220ec17daf0d5928d2e8e2de07f2e076f778b1ff6a955f2d1602aa5cc1dfd30c3b70d0a7f74d2826c6792a6e211535bf946a4f50c684ffa188600acf10f00886014d881610f3c6b3df2c8a5a265dd2c45a7ff7482790ad62542af58fb8b339b82fdc171b28269acb4108e886842f7121ae47cc9fc472f4536506478e182201dc3e246496513c05920a3cdf6a8c3b47d794420671e592b93cc258b73e9a5d6901607523af77118d2b7e2294e2d6ab989cc80754359177bff28ea4341483e3b57779c4b80f5a041ff07ce5fcd9bb9a2ae1b624f6aa544e11c5c55f7dd8aaf1321fd9aa92e7640038545b24f0240d7257de4f2f4b45a08cb26eac54fbe52e2a0267256c1be98f6e7a6eaa3eaa5794d21e19b3c6341bab8871dcbaa5ad1b32916f152f7d5baea0c0a9feb50745a268ddd70a3c1f73e4bd7ff1362d55147c2a3926f92a4815db9c9eb1610fd357702d3e74cfa28889a6f3f38caa7962f5670a3fecaf725d0048036cc1b83b6f84aaaf44d5e9cf6ca300d393b03c517c4c08aef9924e26e7d02e9386fcef14c4ae018c91982f1944a7e5127acb6681bf4401d975fc666314642efbb7793b047d45b3dace5cbae92cf46b1e97428653ec23c06f208f1a4ef13cf8aab69e3bbd257e4e27dba671f5e128a4b47c1e876d192209c353f721ce48a55374b98a697036105457ce1e8ff732d5d74b10d1e68235647a86ad785262ecbeac5342b20025229dc4e2735552f37da064f36a573e0913993afbb98938dd4c7473cf71b0384a630c3d4ec85d486b69525095815f4797375f97a045fdefb535c683e5ad08cfe3c47a0b75792b35b6ad427f71e0106e2229a3d83aa9f22ae155bd75f84151f5e24a0c2352dab48a3d577cf0bdeda6d7cb8712e48a1d3e25b677ea3742f15953e39ab5621f869ea1896f6536c472d79b2369e70f98ceff2065cec129d1b389417b2deb536bfb04dcd088d04189d9765182e11e4354930af9a80361d397c6cf92f6d7427f2bff27f8ba94accfaa5e84384e45954d02ddec3a6504ef07a1c45f4268660d2645b258d2734d885acde6e204a8412f7d7fe25a0c3ae57bcaa747e6c8aa9225a71fecde5da8cb98ae17192df28ae7a6db30ba2bb1fa92bc051a1995e8d1c3d98c474af51a6ef010fc9ec1956400d1b6908a5c5dcd5c408d9b3e20807497ca37247f17e1cfdcb7d8e44556b32a898eb0d2782bfbb90d68e41147ba2170536329f531930daaecd543012cc48752177aaec84110dad6809c969a0ab6968e323e658b64538ff43c5af121e4f66399092acf200a25d932ff59a43dcd2da420c5ee72d4f52ec56e1904afdd7a87efe2431635a7ebd7d81ec5cb836eff8d4b22634ebf11d1438f91bee07fb1c30031d8da24c10b1f6b66d48c638d48e67af9887f7e59985698c2c1bfe48ef0281115a153d84c6e21bcff24231662374f7202c00ac6bff57307432222bcde5d86c73597deb83cdfd73bf2f3961308d2f4eb625b46d16b88ab83264a2861f3291a4929636885286d79bf9f45395462169ff6bd53e898f54509b38cf24570c6dd89601a5028cbe528a85639bf8ff0a53995cdbf18bb8fb9d9c9abf96699cdb4e7b067f82b8e34fbb7f095c98ffca8afd10c29b1b217a6d91e8417c1f5fba6725bbe3895db33948763429a69526454262779520cf05ffd78a07fa8a8997174a8d7b2fc34d6b39c6cafed1a6032546b2f1de727b0385932851a133acbf694ec0fc4ec9565958f480b698c81431924924c8075e56a52d00327c80ec2e2193cabcc2810b7bbf0b46e5bf39b1ddf653195a5aefa3ee4081a218e582349bec13c5b46ad910a7d036f0d2c608d9ac8feab9b1ce781818404bfba61f81394d4367bc8bc61157d70ec7d878e63982905418ab0692e4c5f7b3ab76fd588231ed030e1003665fce7c9c2440c421d28381098730341048d10df3dabf079eaa304eace1e3fe012408a8f29a844371f2546350d8787b435ccd2d014aca1c78bc6cbad243829972abe2acdcea7b9a88b50a90f0c9204ca3a3f9b54305e15251d2f4e10ee00105140cae798342b731c20e6cc34bb3318e4204cdc37d1219c52bc53e32e6bf45c1d6ef7bbe8e72ef9c5aedf5f175380a7e0a7b76ee2daf2633ffb1fb5d61a2184904df6de7b932de50e8b09f50879093a76447829c34abad4df71a1b6bdfbee7c3ce553cb49a485c4d6ac23a5dd58e7d27295dfa695d2c26b52db287b55a0c24b4ba11dd5d3c70a1cc147820fcf43e0a5edcdf3f8a95d5611f2d05a92c2c753e9b1d4e381b492f4159e02b9b582f156cddd0ade4a83cd3945c05f9af5a7813e699f4b2d3ed3a8c33c092df3e47aa6b33aad33061fe11a186637994da6042b5ad57ec587a7dae4c7f311ae41a789aad475d94d66b2b48d89dcf86815c12f55871612d5e5f391119c3a0fe91647e95ca93918ef7602eebeb614c00ba73b8fa8575a3ec233e28e9eb1dae384946766867c0821bcbbce92df380d65b80bb84e8b340839c2853cf2e31ae03a2dd2904492a4ddaa77fd94ff68521ef41ed2a4bc89963d1569b187b4ec65d8652d8d8692acb29b0cfcd46828c9aa8ddb0c15a9cd4458c729d650e41ee03a2dd600c59d9556dae2df774cd354a7572c4a7e529cbeea58ad187dadf49556a230abd66318f68a5ea66f6573bc5bbfe396aa53f7fcd6b7ec2c036f33e8cc269c52b1d38b321057a71bcbb4c7caf4ad761bc1cccdac4cdfead22c3be9938267503b49bb89b2963ca8b53a6b8297e9da5bdb6dd2b6acab8defecc79cc8f7d24a3974dc7877658e77a5fc7437b66f46c7d5c48dd79f0faeb1a9e05171b7fee38a7dd837c5ddfa327d9fcdf16e05dee1906dd3759795e9cb402e7cce909c1ed7c791325c2347a8b8f559d7d5707349d769a1869a4bc475b6aa26b95f5a084228d3577e93e9cb3a7c63bfbec9f46415518a76abe227c8ca742389ff1c141fd2b2a712edc4ac4cdfea17fc68eea97832bb595606deca6e3355738d845a276d899f145c637ad73bd98dff7ae2a0be67a18c7d302f2d3ce941b6bdbcbc88ee494d569a0e8fa8eec6777b52f00c2992e12c2cc2dde9687821bd6071fb431851069a961868a8b91de35e2e5b4f0a9e01df96b48e67c4ce69125b13908267f061ded4076ea82dc136431863a4674ae5bb80e82b5031c59cbe7022909997dff42d93d12a2290c9ee00dc0cd856c6ab38d3fa2e0878ed0f190c048ce816f8800b8580b77e93b9eb2e743193e670e640518afde1e6707f78404c11ea6762a445448e4a55ee0cf9012f2f0a50c0010e308001c48861125304f8aa995c3145a0947efa1543692da0ee021953044ae9d4640ca515614a51b9d6cfdc3a2b40a51501b7e4e670b2a29fa1b9d2222287b3b9d4258199cbf67240f44dec6572e9756bfdd3b6573f5dde1a44ad94b224105d19d17d175e5a674d60fa344331c4c1b932af00557eb25d4d32c249dba619c82a98a6699ace9adc80fbc31f62f8128a6086c69a8991f605326603ee0f31fc1c55f0f1509d132287fb0333f363d4f813ac9ad42298a1b9cc7f98b9932581bc3cf19df5f6304d30e7348114dce95369c9b315cfa14e878756470d2d24c12666fa4c8c8c26b1bb5bd6701241f79ecbf4cce384702217c4cb229b9ac47d4575ce654ed932f574df6ff52ad05da7e6e9f5e445b7b0186eaebb035527a33a2250b00ffec13554d00f3815fa1938157a47b121bb56e85486acef3c2fa106d9a5e71f4e08be94b570e9c656b8945a0c844b7dcc39abae4d75cb38c508e1d48c641068157a4a9b5ec80f1f4da2d7c09079c005419dceb52e4ccfd1b44960bfee62fa7152f641698f26d14fed0c593cd38be890517aec331f41cb8e20fc657514015a0d5cc7ac8ecbea704f65ce79aa59f3d59a16a5d6034d7a344ec79a34dd12a71dd1cb534a27ba750ffa48e50fe7b4b07bdcd114fb08d5c9d8200edf11f56a1e47e34c6a524da2f4f5d9da55280d1910da40b67fcb6cd3d849e99be6d1679405f254e8619a690cfd43424fb18bf89029b9747b492e3d1cf2bc30d22dd4693dbd4e4d4e29f54c5804de5c3ae9bbb9f4959a4f85fe69d953a1879ae8a9d09b6893ce3a7f69f31f8fe65e367f63de8b59866c13510ca3306ad679012fe478417331152cb954dd668a1c7ba5300c135d27041704355f313bb56da6c8a5aa3bab88eb54a5aeb345c465ad4d245ae9167a4ba3a7d194de3d7af7281de2d2b7109c10f323ea1555a94af5e9b3e7f24e2f7a2ef0f47f2ef1f44e06b5258863d5dc210f4a2ec24316830484281a31b5a007d388424c13f2a185ea64e4dc290bb91eefd655ef66f77d7242c0fb4ec47bef04702e0e36e03e06dc17c47dcfe43e00dc67d94d64a4b216c6bdf36f9959f408e77c56e0684632f89c17979f2bc3e5e7905cbf1e5f9048111ed2e35ed60ed1c2903dcb86121d7041bc1787bcf7624e6deb89ba392e989979729fd84ddccccc3c396747fdda3dd78e63cd9d5cbb5caf2ebbb3a364a2995a109a967d4b4269c85ae7e160d527cc364e9c7a629ce959b4dbeca94367c85c8c8b111dc62b08974018df45f4e36b8c81a3edb586302699a6254d4c44da857d94c18b57d32d930a215674a4792e289f40d773c13e659f4ea6e863127dbe9160684ca0d893394db2ccc2e920ede3d1324ccbd8c7ebee49e9e3b6acb6a69ad8497ac7b6ce4e770f19dff10238d954dd69c954d9b7d397b6a72aa38c30d65c33b3331dc08b9664d32184104238279c304208219c7114a58c324231c421977a9d46a0915330890b823adc91a7e4cea55eaca9e91ecf051a792ad4df42ec64390423b46f48b432a091e7f26c0bb13513031d136d87ce90bd9f5f0cf509c873a999a7ac8881c5a50e874cf7e1034845f5782a14f55aeb057074700c768e611733a9ed15b9d4331f59e50ae31ecf856b322ac9dd5e1697fa16e3526f0875f7843c15eaa3e995ad4ebde7ac5665555cc08943aa1d911db2fe4549447ee4f832ed443b32329ae071340e9c5ef7112adfc9d82e0136c943f63ee7cbdee31ed5c99833cb442492dd92b8eeeebe1cf05b13d79500c68ddf5c892fa59452da1cf1d0be491619b2bbdd5996adb339e0379e9fe0f9f33a37d9e688b68a79685d57ce4d2a6a0c1940844e15709de8ba3bcb9672d46f73babb140bde75ccc4bc4f1a0ade567dfe5944c8cbbff7ce6326e6591ef1d2da1cf5f3b4d2dcad135a27de794c3c9dc77be76179ccc41db0a110133f644c34f15c98a0a1a1a18979114e27b92625e14cfa906dcee630ce750faa33f143b6b91dd73aba855d66bfbfc88405f8466bd287ccc5af34c93d3a19d3734316930bd1104e854f9dc91eb2cdd9189102c3f770ced7a811b1125ff39f4d7d1238566eb4a51c2578b78a79772716c8eb9889919f1a0a24b449b0c0051c439d92f23c6662a4e5414f599bc31d6aeeba24aa90a7d23a213fe57c2a6e9e873c0fcbc3b91dd30cec6906dcb35b9a5b022679c8a66f434c5f70823a0f4a5178eaee53c678ea4eccf39053ca3f1727ea79cc57ea939eb24e886278501e4578a74e9d1664a8b9eea4151ad75d67053920e16e435cf739499fece49e6bd2fbbddbb19c991a3a4146172f8b5b6badd5a2281af593e607e3ffcb06e09515c02d0c158089dd4401b01f0b00eb9e8ac766189db46bd7ae15acb0768b6aadd5568b1ebe52971b393639363936d5fa5551d70d9753b1b0bc1f2c34301ae5480d75cb54bd4a2dbb5375486aad20842548d1ee18a7b690d8fa130d2bfebaec46e34ea7d1f2cacaca8a5cc12c16cac2ac4c7737cbb402a5bc68c83f4b5978c67c979597646141b2524f69b362e9ee66e996eea9592696ee696261a1c162b195841f4e55732be6ee943912102b9f78c6f4e97d0a22247ab5a294ba8bd2aa02d1ead4c5c235e8998256f56a2e33d50d1942082194333a569e15a5ab57b8465f3e2a5e0d0bd790f45bf56a6efc3b535b5919aa31335fd75ba33159d0b2406dc3a151978f26a14f771faef07b7cb565e1191264a93de1834ea8ddd8e2d6361ad5b23c9c5b2baaaa2aeab22c2bcfd2eaa726312d7b1af5e0a4b3e724bd748ba7b2ac58c896524ae9a5692c5ca3521c1a0e8d998f43a301594633099128cb58b06fd395daadbee1d0ee75eb553b66a75544f5d2559d890987c6c2352a16295fcda558409c5285ac8644f594361dd36af66aa5babb4bcf61dd1485d123161234ce4718db96a8bfc768ab943951e6449913658d3ddd58cf3955c6c6be31927a49cd292fd337cef909e7fc46cd39678cf36c23f5b6a32cc6c738e3678c51d6cc2a227bb4a5f83e96d58f8da00fe89ad70a8e6a8abf2a05e37d9abb549c2ea5c5f864acaf4eb5eb53939f346a8a320b75cbe4b9982d8651ec5b758f700de9b196aae766ca96e267e5395f238561169bf198465f2fe1bcccaaf5ebba6c7579dd3a52bd562ad218638c54468871c80f92758a846e57d2d2ba3e4a2995e9a795b049e97ba04b3ab1293d10fb7cda0f175981507ea319258910c9a244dd234261212917a136acc88d9752f2b425b8527d2845dbce0a60f26c41d28eb0538f171149e9067aa4de4da9ea7c85c9b7950bb2156832993604a2eac330cdddf71e469908fc68d63d1a251bc61378720506af8c5eb172e14bb5ad5c4a29ccf215977abc62e5621486612b37567cc5153ca3c8159f06d9fc6024cea2cfce9a7557df9cf3692549cdf9de8cefdd94e731921bef1a47d5f3ea9ed11161dc79cc3d5807c6c94868b41b23b91047157b8a71be15aaa3cc8bc798df8fe71e71ce0dd25b9667de5aa93a1ef4899e950944d98f87d2fe71eb93ef69dddcc33ad43ad3e8439ac9611e47abedf989ca62769b17cbdb52dffae4272c8eeace3ead4c7b3a97d0273ff1e8e1ff04d79887559502c5a58fd6ca86a3baf3950a14179e9fe02778063cbd9b2c222823b9b1bbbb9b9f704ea5415ed47e40b8755ce6f279153f6ba55af5eaacc167d7ab95ce39674b47cd4967654a62d562947e7b8fdf7bd396e8e51f333b66c7dc4a4ab33bc64e7237c8dd3af190b6e74d6f9a3d379eb302d2f617fde8a7cdae6e9e33b38aa87f9885446631bb351fe33a59cc6e1311f101b9954af9de7befc9091ff7ab43ed7d4e69f110be5bfabaaff4ade273d17359992bcf4e2cbb2d5755256de97d1e5a7093794d6de93d9ecf5c8138cdd9afaab375c49c56e6e153aa533844d36d954de66d0dc5859fd4a51193dda69b792a1211752e8557c62be77465b453934ec2c046ea145267855aa5966559f3b22c4ad9baae43eb0cfa654153c8e51a78e3704056dddabebbbbbb9b7ebea76a62a25b9e8c333afa6eeaf3247237cf77dc86efd04dd38ae6e79942e014d28e7294f51ebfc7eff17bfc1ebfc7efb1c5a798628a233333b3075a5df3de0512cd996522d14f72d3c6d6ac7704d7e8b365091172e555ea7ba07cd7bc3f51762be75c1ecdf6b242bac86e22510d8c5ff6358f40d5428206008f26867d34a314bb89ee0d18769ba2074fec76131bb2b05f1ef72fcac8ad1446dadd3d3d0cfb2c0ff3207f7336cfe5a4b81c0bb3a869514a29a59452b6045fa78d4c4c9c764d9b9999395e1a2b3373f3cacacb8b356796894494d23b1a798675782db9754d4ecd9b2e5a727be7e565658544fa45229b1a7ac578ad57913a7422086fe6cc3291e82791acc9a2afec4be419f1f24eca29e4f24b615b040f4f1a89f3c96c2871a35b26750fd5e6a9d4e2c3acf79e2c83f51e175c43deb2ae495e58cfca64175ce3559627f3489c0b99f93db6cf96ac1765195e5bf2467221bd90d68bf4d1923837de4d69a5945276216f2417f23d89433fa7e71df3c82e7806851e2a2f4b4a0fac26cdad966559f559d985e42274bdd2ea5bfbc81b97853b6597142e0b7c4ce329a595d6bb801b0e87830387c3d970f0bb56b4acec42be3e8ae14ed3651738ac57d5d25092c9bccbd6e329ae5bdc8d8a419b2e08cb6e382afb8feca25ad985bca1288973a9eca24172e8864b2abcb9151b028563a577ef9d53cf7f5a7d6b111412bd6b464723e9c3bc2e59eec15ffd0b5eb7b80696754f697d5ef0e6c250bbb08ff7deb39856dfeb7e481a7a51c2bee3c2aef53d245ce39d21172d6d0936f6076fe235e1cd8defeeee8df6d5dfe8db625c7e2a2d9e73378cf3b9b1270fbf7ddc9cd9f4ae5b7fdf3e13b0e0af3f6d93168376649d1fbf02f35c9800d96d9e844cde7b87dc5262c72c24aafbdefc09d9130bb26d652008e5256937b62c24aa176f621f5bd0c776651141e1925b2fcbd2dcbdaecbc2de2bccf368d4533494c3d044cf34ebafdee83757bac5b554a77ee34dd2c248278293c4aacbebba2e6c9bbfbe4d7b7d5155d7b7fa78c77cbd32b3a8522b032fd49933cbaeeb882a0f7f695beb5c6923136f92dbf578fa94cbcac06bbdfad63a5993ae8b50b46915515fb2ecc6d242a2bab555ae4fd1c774fd621f978cef2fb846a56c7fc133e2a9bb14de5c9652cafe62023500d45063bdfb55dd4d0821105d920de19ca0fcfc24c3b76d094aadebb3db34a3e3c94f0f08a6df711ff5b7756f93a16ca94f29d8ef51946b50b24fa98d3c039ee7a7f7fedee127aef13e515611d79fa557e419f3c15fd78476bb7cafb1e3a59abbad3ded96364f69f5308fe12b16ea96e90ece73ad9555bdb37cbc0c12d2469e5155761423d7909ff8f23719bed4e9ab0c4f94ddf84579fa39e37defef4d37421b79c6342bb676706e75e51b0890cb80ebb4c8c9b93936b7eadc8a91ba05bbdb2a4dc675cfe5130f92daa354422a0ff3a44cb756aadf21733c87b4b2a5ea155ea67abdce5bdf7a2bd6b9f0cc966fe5d2062d8d3301a4096ed7a195ff3c5db9efce3585bdedb6322d66335b6a8b9d5af6b273a26c891e7bc4a2b3327dafd3697339aeaad44ed465c1486f455885444d621d76d25c0ecc8370e6e2ea08960d25982eb163b343a90d256c2c6103f3a866d95882f9d948b6a1848d259ecddbb96c6309e78212ddce8d9bcb8930220d455bc2c689c634547d137a31e13c2efa862fb4f1369488dbb38194cd8d87d82314dd0b8675228b6233fb44300eba732e29f7c08f34f75234e754606822cd3914cd0a7dece6965c07e5e3355919081d7fbad1561978a91c78e797e01ad596a8c74b59c953b6c46c97e01953daedd95cf825780684f444e3188e71391386a6a16827f555279a8b715611f2c6a47ab495c4c99cf37f11908f274368517b79efbd373fedb3598287801ab486eaaa63c69899e185e4b2484c2df2138ca45b26f64bc3ecf604126624d331f313dd62c53be62835772d4dfebd62f05570c9a4e4ed7412bed142cb489a04374612cf4822c0976f51f17d6e59b6da9c4b76cbdae2c7ca2c1a4a32ca6e38aa63f4932ca2343f59eaeebab3d8af63f05ab6749d9a0065f9090b09689f885cd578a8c51810c2d09d8f318220744bf1f4f58134cfabb35be8734b93af22c300e89e3f90e6aa568920ed5611743275a94d6d0bddea52543c11dc7f8c849f58b13abbc29c3a538b43f8c89c9375260fe123131fe1217c44c431d6737933097c8475f888cc3c5acde465f62eb3bfc73a7c8412429f01c9fd755a980188b49b8e2b0fb5f8c8333339de9544c8770e6691982c22a2140fe63d8b88eb9876317f72374277e11f64cd4d47d4fbaa3c41111101e1291bd23806f4f164d6eb890fb2d23cbcef482e8cebb458c3cdad5db17504bc59b74c0babd0ab96c6a734ca5611f49174a389365b251e4513b54afc8926d2d88a003d4c8bb4ec28dae7279ae7261ae8ceb2d131a1c3f46348737385c6cb1059bf5d43cdc23c07e3676e9cecadae2d783ee29bc23361159655c73ec7b0eb309d61d9371010184d4e5044175f8472628279387461d7f99e0c7b523c299e1493a7e5116c460708f41110100602496c4405c8032b9383b42dbb333a3010f611100c34b2c204948140d64d4037b138039d848e594f9126d831cc9a3c115e9e5899be26761bc10cc86eecf9c763b70cb33e0a320a320a320a22bb90145a369bd1615d24fa645d348964f33bae1545a2ec5366d15b728a2815616589b42dbb333a325196890ef344d63d5ae9ba1361229147748fe5c13cbf2eca3c22eb338540d84766a27fa6d004fa605384817272d2cacb8591797e896c36a14c2793c9149a40d3679a98dd5ea8cb5f5ae419565529bbc5d339e374c2940b90f0e1f20caed3420d3ad4e62a7b7daa7f3e9f4ff5cfa7faa7b4e3560e7e3e55755dd54c223f339b62ad5ebdcfe792f968db435ac9fa609f4ff5d0e7a1ea0a1da631cbfac7e43af60df4ab7a8acc747d3e17945f36f4ead7517e7255199cbe5d329a5899be21bb8d6086b37b32bb615745f908cfa86c35817aa9dde0a71df5e564a54d77b7a7adf3118fa7c23cd83dec394c57fca9be65af144eef1a7af560a7af0f81348b89d48f87eb2dcb6e15d3f3113ec247f888a7631fde7bef82d2c4e4105af09649e419cfc48462138a4d2836a1d8e430cf84faa595aa4965627299fca2aeea323953186326c7ce33a35ec913c72106f1873d9c31c6159f5cafb71bf35d87401fbe2c1b6334615a85b6b9fdde7befa395765cceb24358c157d91c0539f53ecfaa2aabaaec302fa3fec9ac2ca3fec9fea1b8faf0abe715f594f8f9565596c2aa8fdd463093d9cdb215351f84675074daedd94cc2a036ec6eabab99032dcbb2ce3956b52cceb12ccbb2a6c9aaa6eb569d769379599c1b13c9344cb3a65b293ae3115166b504c37b5d4d3a51e9289da6191dce4d229452eaa615ce393ae77fcad2fe7f68c54e3c16c824bb2cfaf19c602093cca2a28732d18927f33cfbc75e009fd089282546004e3240010820630056d3ec05100000c418a5c010a19c9884401f4f865d96a2368ab2b72506ebbdf8de93efddb27bce49ca7e9772644589f608c89b2494721bbda845f958db6e4cad572debfddad7dbc29e61575b95a5941565184b25d5c9d8e4902b1fe37c71aa26a7e88c804c37cd382335aa99736e9bb555dddab4d3dd2625575e29491a4717e9faf74edb6e2949a6c72f489051107931c403849275a0942d25948f75ec1631ebd5f58fe6c91c13b12a2b33ddf8884c131fe1237c848fbc19aca118aa93e15c7c6e92da96f5ad264739237411c6cb4ff67db20bba6137ecd449e6a4ddac539b8fed198a1180ca6e2f77fb6d945025cf360fe65c7913bbb1911bb21b34c23817e7cad0419f76e301dcde39171937b9732e0438ca9d7329c061dc3917037c74e75c4807c09d7351b900b4ab68cea99034e7540ca039a752008d009a0c6d009a732a34d66af6767b11800d80dd56006063d88d34b229763b8c13bb65d26e32f186401fdbf3a2a124c36ca52c2b13af7ca5a56a29ea4dd196f897d9271b79c6cbd1baea4839c2a9463574e74eafee46b4cd0df5a699eaa9d4e254e465afaa5274aa8f8054232b4a9647a6e88c80700d792aee163aac3c9e438b3d20bb356466666666b615f4bc5b551c5951bd149d1190917cd53b8f82c05797e90ac05752db463537ba2ce6cc3291e834f2a50504692a7a0fad5292409af7f2b2b24222fd2251c35190471fa722293a232055b5c518d55c8ad1ed2585741439650c1b2ab194524a91ddfef8c44a28e508e7d6f7deabec28c808c8950c318ddea35d5bd36c538a4e671195d018d12d0e833459641195641acf4b69a594a320ef103eca51104ea9ee24f940e33215792ad3776e74725e8cace0dce91b691a05c1d145ba089592e4522c95f0744c8329f25c5e5e565648a4ffbd225de4cac72925c98d1f05e11ad528488a0e458d6a2e9552ca51109e11290c16c01ce86f301a2826d7096b17a5924a2aa9a4dba36207a554bee9bb3e293e94e2c6243f7b554aacda9275aa4abb4d333ae4e994a7534e17a573cae953b7eb74bea24c594a299595a5205ba51d51af9f522291234fa594a1cffaeba297b624dfb4d69005514aa90455b55237b75a1425a594525217a6657f9ae89386726872aacd7fb4ea308fe935a5e0cb96e4add75f405c29b8c6f478b2e702efb1f3b624e9abb4e4ab86843feb67c5d54528da89963d15eb269a7b139b8f508a7aebd53ba7fa641151d15bab9452fe52534e33577f70d059d41fb7625d31106fad9ab5a664a1d40a83a2a09cd45b2214eba2fa030546b5aab3a5faaea1ae3e205cfbe4dbfbf17edc780ba556ebd937bde94daf288e5267c16a5d1e26fbfcb81b8c1f0c639232ba07868d012346c5f5c634b2392976cb60882c4bd3b585ee81a45d920042870ff7e528e124348ce4e86c6ec7ed0c41e3c25c8065a016641e22783e63f880a8f02613a010e80f211316989c7caa38f9c4a3bc8080bc6051018145cb20d231ace8101513a572cf855ff88557483b4c8456906d2f1df8cb4530be906d6e679b2d5b63314563d144da8aa6e2c19051c6944f18b2cded4c266c5e919d9d9d1d6793813354d72d20e09a5b724dca0c10226d0c847b308d119c1b9b259d835f6c08c1a02c6c707ffa30a9f74932a4c87381e767c43c827a99b21092f38a02dc8c68ffe04351649b33f2e8f38820c988b647b819efcfbe7c608d2fa09b1797ac5578850ad214fce31a3152396803ca03a47f16869bf1a89d3da2c27d771f9d6c7337324dd818c1373733f4630a79136fe0cd0d0d7838a10d372419cc822ce00c8921babce3bdd7ec5ebcb6995b430b49b08999e11ddcac04fe64c1c60b1b0e831736d188112336e69c73259b73ce25d9e68c349c18e6b9c8bf1bf15ce2d4a47849e106373827cab83b50b58103b5d908597643348d72908958d0e366a11930b89febb4888318ee969dfd40732bd6f39660222db9a19384910a2fe0bcd8438f1d3b9c010b254062e00fee0a10ee26a2e26ea41fdcedc5077773373db89b335273210fe690e40863f0811a7e78010c7007406c01270a353c74e2202466c60a19c4600d72c8c210a2c08798feca737140164cb8828a9c1a306108317d98e7e2b2480213867421061af0200e31fd249e4b0370e690072c6001061e57c4f46f3c9713242982199450410728d82066016668c10ac0608517841c89699a1ab0a1f298020b7d40430de620071b0401ea8006150f78140951c105e6023f5c4970411772a0c8208410562c8021b0e10311f480033a08d98153bc81055317d04007287ee7c590374494ebb61892852147ac232c794ec417fc0b23a0ebb470c313575eb7c50ad0206326c0096e3e8639b8a49e89a20f3588c3139840042531dd5ce4478c3ba02e60430b824c3d842e4c95138e0061f0890f52204245c1092c48a18ae9c4c4872d64b006eaf270dfdb62055fd09b2d64a0c5c5aedb420660b8db23139c1093c7f3aafb1e1a7e6be59efddea3a6a99d13629a64047ed93a17c47b6bbf273778af708a3312018f609a3bc5799eb2ceca591096005238e9a4df22c7c8fc4967e4182b8cd2cd2b34855ae184fc4acfb175ee21a122a5749a788a16ceaef4add14fd3ca95f255ad1ee35df50d58d6bd95a90bd051d43c45e79dfb085ce8357c6fea8f60e6be379d9a93faa43ea94f869714457d4ed4e690f023988980a31cab505db760539fa51342462744844e08f89c10af9d101d3fd996e2dfe361bad497af5193324608a7e93d7e87dd7756e92398b96da72907b67b4208fbd49b7a85da564d337bf6ebdbbbccfede2fbd57e122c699e57869638c18dba955e62d6db38aa8eeb42e68bdad0850b768ada89de27c73be4f32c6279af46467154c4f359e29cd2eb5f2360601949055eeef2eda8f217bef34de9ce83451ca73b6caf44b736fabcf2c3b3569a23e69f212c6e8966a3759750b94d24ef2512b8114627ea377b3275875eca2ce3cb4e009363195b7d0831076626a7b010b3cecc4d477e30220f888a953d59a13030e919c980a6f728cc4d4a8e343484c95556bfc041688a013536790214284c4545ab5c641a6f0e326a65278d0c3196a626abd830c68626af5052700e126a65a794092b3862038e811533124b44127a6665a0cb1424e4cf564810b3631f553b5e6bcb8998226a6829c165f6c01276687b3f9820b45980d40d440c36f48034d4d4c3da95ae32d7440849d988a52b5e69a015b75793603f85554b5e6eca0879d9a980a0346ca1e84a0849a981dcc6f8b2f906c2949dc9ce634cda9e15ffca4c1c7865372dbd81c86c1e54c935d420c48e6bc1b433127cb4f0069244f0a32f01132b4ce9c93aad7ab463dad3e0b4cd32f7b91ea75bd08774bd7e3294b630ed9e888ebf157a5286de6520d87e8f69f83da4ce5ce030d29e504a6cf1731cddca76def0ddfe3cc7d7de13403998d70b4e69c73e64a6d939fe4ccb52c3ca30ff366203318a4e4ee9b514d93e4a8a649324e31c2a74c2949ea08488ace2808cf98a0803e608f2689609a373759f328c84dd60f2699baba4b5578aa82b7e0f3d139345e562aad52578081c015229c627c36a1132f25949406a9c944f808e49c0b2f2584d7263dd122eb4ffc28a1d40236dc82d4c403d224f98034493eca4ea2fae9956c244f8aa86dccfda2ad502756b0818140b7307c40ac90f5b739ab2cc2806ff0049b98429a24af9c429ac472c736032b1c3bdd542ada6d42f17c5e2bebceb998fcc2ee5c16f26837dee46c5e5e565648a45f14e5e434e6076f6c9a34591a4a3297a3c3c2c833a669c7754d3ad922eb6f2ee746073c70f5c443ce0322815427c34db74e2554f284099d9311c94af5b07aa5dea2d349ba05b6924afe5d1a914664196495a253ed280864db5e344e1b699cf6c2088744312e83d4469450a7510d16190e918c6f1612c5b80cd228c8888a0b3b67cb7a07270bdd8b6e89d148b2ce190599e01458c029eefb2848fdd64fe1ad73ee1b05494972273bc99caa868a846d86847aca66b148b68944a225504de8609ac82df154f6f7eecea8e9188b2615b1e1226cd32d946d4e90c09f70daf8848cde15814bc838068cd38a1bb94811510c1263d1840e915bc233a285d0081769e281de3645951136f2399f8b3cebe122f7c5ccf29b78d9465a42e592385d5a6861861e1701b7623b3144acd396641bcab22454d5215b4a9b4dc88cb879cf72f78aac240fef46ba150908ea43740b5579c0e9e0a828bee421314417c5385320090dd850e2c69350272718418124346043891b57647c8da040121ab0a1c40dd2151941011b3148403c7743e2233ce4c8345d73e2234ca4d6a16e40dc6a52cc7242f0090f323e5b19275d46b790ba25f2890fea542dc39f40218b775d9dd4647cdf7b7ffc77f73ec4fbdf65bc9055ada4ec66f654445374d2da39391bda11093f587eb0fc60f9c192fd6081d60f4a29b590702b8ee507d532c7f2c3ad38961f593896898bba0d7199c66516c9c233e02bbe86442864a2e2d5f4147ca75d99f6fdb83c979fd8677dcfe9a39068cec3d0685c886252cd53ebf3232d0586283bc9e2c287404d1dfc74ab2dd17a59c712cf52ab65b12cb52508a939f9d637ba0846ca484bd1606432226522f8dca3bb65dcd8dda218f7bdf7bae70f961f2c3f587eb0fc6031695018429f8f941f2ba5b41b12d30eac91b2a1e828a69dd0a5168a62da9976604d4781c1f816822de4ce77145d73e79d9bd36e32b0c77bc6ce06c87e3c8f6e240cb66082348f0fbd6452d2504c3b4d82dbb46355d5b403806f5900be4d013cda8dfa27c6e33633d03d02b0ae55b2bf56e918768e2c8c771a31bb85328c3ee512dd3997d14f465a8ae61c0ccd39156a1d907b75cdbd6e62b7ac85dc4b64e35d6d431fd1bdac876828c940f29ecb5eff7c3cf71105d7b82edb51cc40bb73a3e019f1991619098470aebcf08c2078b9a568b32a605437a25ba205e214689715d22f12c5ea155622238ad0b8c7c76e248f15b1c52eadded2a8b3cdebaaaad8f5155fe306c4b672e38b6dd3366dd336f3d166a20e35e93d74abb6b91baa19b96feedc28764e1a060ce0a4653370c22e5dce74cc22e1727c480d2ae16e748b3ccc8e69999439ef6e9a7ea35ba08f2b35c7d3b4d24b4cb6d25f58ad3393929d243ad38d0eae11a8a42d98643dc9d4880000800001011315000030100c07c482e18838d2242da40f1480108ca24c6e5219e86192e49032c6184200c00000008000a0499800d2c3730312345a41b15206bdacb84e2b1f029f9d8e502d16e8f9e56813233a05d7e6f9c8d82ba6c3e017cb304a39141e336b391e3ddd9753d16ac99b135d53d35460e5c9d4d87b49be59f3cf10ed73be8c02e28ca0009158e6ca59f306c35e552500df3a93e1c977f46aa097b1a5348ae8a5e15e4a59949d7195efba0dd2cb502fe35239603ae269b8975ed2594ab2ef2d008884cd6708c21b7349537e83bd1c95ea4ef8508c587121c40d06bda614777b35ece57c29eb573b2c5e39897c65f0be5698e40cf11f4ba729757a4f707b57fe60cc5f42ac8155b70a1bcd4f752e784364612e9dbd2ee8d85b85346723e0c502221ecd1a6545dcc4740916040c75e432cc1fa2a228b470daca363049e2b5eda6fe879a78d3d6a3fbc1f772b2e3fb96440008a3a1e05798919dfc836ec0dbf9099c5f7304ccd142332e09710fbe421ee299b6b2a787e60fe0b62745cd66ded1553cf41f83ead56b0085dc86fccbe95a63f976d03e45f5507290051ea7a0d17d6f510b7137c179850bcf9744392e16f609f4f113e7141b2825be0f6e829c0e67d2815a1fb71f4c3ee57ef1363fec21af9ee9d7a7b6d93a30e144dd6a10435c921a13e479a70816f50b96d948fbfdd0cad29629c63fbb808a064ddbdf5f285252857c0103cf4bee02e3e05b67950c87a2b964cfebb9679fe16ae67807ac185d35eb265023b73ee520530cd95a3631b4bd85714d8561ca9b12607418649635443037306056badf3fc80a1d5e3c3c0078ba0e3d15fd830d039a2fcbbf9e7d065dc1c5f025fbb4045110b3b2e64faf077a995daa30a2f52860410493caf1dcf1a4b24c0f2fd148402567e9d823f9f392cb5db961b7ba388d1db9ca20289d2acb5e88b4ca0a881d2991ae4af7049156f359edf613591c5a28c7bec4d3b288a4d61a952cf63fda3c8104abe4893c2ceb4fc686df7cb84eca5422aee0c8fa1c05d50f2fceab26e40f8b6377951a2cb9e685760ffde5b4acf2fe30e3b506f89273b1dfdb8b2cfc03ce8bca3411943aba21d2045e22d41b7e5aa0722241431ca49a19f0a838fe78f4e4f0bf36fcacb4c416a46d7dfde6f65da9eeda75dceb65207ac21f8f8bfa61fe3b77e0a7493eb84190b88db1c52d340a04e0e25ac283a97f2c1b7da38d628323c35b96800c3baebe1380615ee94a0fc25f33e4b11332a53a01cb821c571da192c18775f599c7ac55dc161352378efe0869e2e10cffa43352cd755a583d4dd4188519a1f0495b647eed4bc186d94c371dfa188a1eb1a270d48c9c74efb4d43c21abfd81c3e981af146730ad2f8cb3bed16782e0f6608bc291bf6e8a58f35953fff4a149032b1aabd3688b405e0e5c3fa4bf3eb96b82f11fdef11189bc4e1331c4feef2b1ef1f467307b6fe095ae9b2755e5699579148032accc1eace3054df08fb56ec6b645ca7969382e45667f8d4372954896f0597ea72e32fe50145e8e18510798543664576976520555ccf44354df9154622a337427fa80c5e87a45350a18341ab2c459d9ddc171639e7d8f68c5d270a4a383210ea2eba3920708022f04a45507e3ce61341110aa9f30bb3707b0574b77bd27ac4c45ebd2c8b61a3a38b619e9b341faf3aaf399c3a9f212d899f9b7e2f534d9add4469b2d4397f9fcc2df99f8d799f5fac7bf69492a66143b80fb9616bd314cba11f48afed0edba3232e68e8d2654e0df4516a7563708b9ebbd10d82c95c8c6fb9498461f3d2788b6c8ad74f0991dece840e90c8ca46a2b7ff8d68d1d677ba7b2a66d72254b86cb1a32085e0569978c770c00683ea85c39c16c55ee0a3515d9205d1235f2e3ba75020a4da072d90618259b4d7a1e890e422efb3347f49c5e8e8239361b2477cd28fdb5f587d166b5266edd8212a32799f223b098268f14b9b7200cb1a85daa48ac8a3a71b9a75bcdd01f440feb3e3782f5ce66033418ff16bac6d312e97451f4747c996334c916b367156090431c4b8c2b2fb195f87f1e6cdc62e9c61122cecea36d525a24918ca0b7343756ba003ed99fafb9fe3cbefef7e92577c8e7a8c85d4733942deaee85588154a31fab1ab585f3c21115af0370eccc6c6fc6e146ebfb2b1f9a5e4737741cf39488af3744a43f4195bd5f81751919f4f66e505253d3e04db13c7ff0d63c163f94ba0517bbb3e38763a508fb4cadb14016e28a617072b3ae29b6a9bccb0f60f24370d93b3a0b6ee37ccbc89e3cafe9d451b4c7e7605930f74fbadc11f612e7d37f5a0db49dce6412738859d31f05f8209661263e7e54025df2030ecee406a058066334f82125c5802d9205d7354af750c9c109bfa4dc64e19751268b37bf527bc1906bfe9bc3d06bf3d8b14bf785554b3e46d68062de684c403f4adb71fe0bd69a27507af91a600a1ec38dccfae80295a8f3bfe4f707e300e7885c37ece307b775ce7f38d6a42e998411f4422ab2b2bd8c39ea86368432b41ef1e6c3b0aa2a6442b76a8afea7ff39ec1c3cb3f81e24c3ee05b46c55850828a1a8e269139d5fcf2d0ee87eadb8cbcaa3e9c67218c33bd048a66c2a3cb318ad97befab4cc05f10ee07f709c54c9f8782aafe31c65ebc5e590c4437cedec9a31d59afcec40f02ccd9f9e29125d747ed2cb669d3d5ba2414e19583b4854aaed797e51e6a543ab7fc63cb80897c30c4961ff42ca5df99d769fb69106937cf32018654bb3d24a3a8e2671fa130fa8d3ea44ee706f2f85d1319f93a5f075510c5d11793b9c88596802c48532cccc51abc5db62f942d97a18f20428fb7dd7fc9b44f85f3e026beae560246c11571579f0cb7da5dece975c8bd20fba98bd6cea45ab3e31a6abf5fd59a4f3fbae4108c0720d99b3e6b399e42d3ac95e2e52eff661b8905a17c150ba6e1f359edc0b2b2ef6e98ce0b7808329e33797f4562ba2cb85f3424afa7a1be43903d96a54700df5880870ccd76b970c9b06ae137ad74e4156fd40b53aae42cf87e9b7b1365d510b5a0b735d151e08ec28ab9c30378235f119eb2437b09e932d4e016ab76908d933da0aec442c204e436a8d48ff3521fa9a2bf3021ca717e0b019ec7fad46b3207bffa64cee6d83064633ebd431ab94adf8b14717dc2086faaf831bb0e6f25c05c811e53d1087f85c97bf250422572a9efe9fae2a2af9b709db20eec9f498f344422a77bb7f2fd0595e966f64609892e1880d675f0a0ba59006d55eb64600bdae4e503ae2a45ca9a196806256def0213130050c4d15e5a8823b9b5bc4509cef0f39c2e74cdfb5a953038f3bff437e456f8119ac619d45af52abfd48fbfc27497c1c2d73feb9c7edba0173ab8e2b47cd9665cda557b0dfacebbc4ea7032f2bf57f69694c91d64d787dfd0991956ee2be1a645e5f0b4b30148b3b01bc406b8551784a18c2efb3dc86af943fa3b40f78e046a6cecf5e0355a4ebfb90fa7b14244316d28f43c3b3ba143123281a61f822a484f79769dcbd1bd6c76e1ac8f4b5d8e2d439528d707f395c1ecc1a7715a6b431a0f6fd89b8aa0285801ac875a99989f3e2e7630c6914e8b082b4233a3636039949dc5c6cb574d3c5847f4590c821897d207a116f7e4f5c14846aa8ff8f186e47bd9a49c3d44c43515eb3f34ddbfa99bf462ed95f17a3496673bd525367fa8b70bf479ebe4b8847c4af3c799001a4304c0eb826607120e46d61bc52f1275161e2cc84fe91f48bb50ee3dee807373d20fa3a6c5a5a4b755fcf8f031d34c5af19905c962426b0f99072ac3fcaffd9b390335e242adac4fe9f60981daa5f3921fb0c8761169d05782e3343b4ab290f4289ea918a6f512f9b020e804f3a64b13b4c64db384924f591d52b773d28ac046a4b81df9d24d3ca3a23cb7499db77b4e339174cbfc628b6b46ece7eda2b026adaae926031f03d30dd64b475fa820c29cebf8f4c75bb0d94a73b0c96f8c40d15247f7491a7be9162c0aade681b0f2675951e43f1e496cca6e8ce236e1eeb535a58fc1075a399e692e36eea60eed8880765871c2b78697a233f7aa17a975df36dcb7c5bab1e905893c32a41dad72b8f09152d65e20bab56584448164c2478015161904c0191d7cced300c98b438b6f5c857c2207e066a3f5fc04fa07aff49c18e77e59248211845faaccea9263f58edfefaa4b511f98d2ac3e502315d39d0d6d67f72ccbca371c88e5f429ca63ec39548e20325d98951df6eae992fa9adc8037347c20c2aecf5dfd0f06a1f653a3fa82e318e7760eef521a67816050212cc15852623b4964d531e1318c4d4411d2468aedea76da63ed7f4a1f7dcd03028917654f9edc46e39a778ebae52991488043cfff9b716e5ae7b0a0218a41fc1d4329bc5f32af06dd2ce15ec3f1c3e6f541139986693891042874d6ad25bf9525e41d2273b1006e84514238141b1074775a74b98abdc71490c0c96f0ce7e8a938a355502dc7c29f206ee7461b7c847a87e4b5b77d77d88d1e0828f312522104725f0f311b662f0c176668966fd7c82d3ac63cb53f82902e16d3a3195e8fe41337e651e58b285ba66ad358dc4ed77a68e2ce34a06b09875abb4be97c3ef01b0e5536b8648f90d6d0081614c4328a988772313eb8ff5612170f15480b0fd826f0723aa141902173dde1128721aa7cf33453a5cfbc6ed941cd8f0b5c5d7410d76ee17a8d5112bd03bef2bb716f59bf27374d171192df29fdc65ae70874c5df4adeb7fa87f625f569c996b84e04faee6c017b8e0d927b7bf127c728aa2a6060755cb5d0e930e4350dc0fc21408da19b7130075f2a5419b86dcebdd1b1382d89b4a943bd46f0640e8d17ab7d0168b277a3d3aaa453fc3aa47c7e31a92de240718a50670e3fb01824386c019a4a04684f448b01de0901da054a557027f3851d17924a53b73edc52ad55493505e017320f83e6e57eb514b2a72cdf470d0e8ee173875194acd0ed91d65770e2172c6312a4cd7d15b20a3eab600bd928077d55aaf086caca49a0dd68a6d5b2d564aa0c38dbdb28815c3402e313f96ac8f40316b28e9d428aad7c7e44807800269b2435f3da5ec446610ae5eb39051838018fb9a7e8ec0a74bb6381171fd99de482c8e8bb5e3edb65d8f157c01e2f2965cd70c164611664a6d01d43afd9b4a1b5469c90645ea739e132281ceb3308508b039ed6e2db4f9e7e97bbd36599010c313f36c18a1bd3518489fe8ae1e28b16e980a8f786260ea37dc95c889fb59f58230482a16d738cd50b009efe79ab0b5fc2212502000e8bad67b3fcdd3926a04ada27444ae69dbc4debeff9758405f25504dc685f2a69b28b6e0050b62e6667c0c114a18acd5e0d830f3493f35ea05fccb27b7cd8332be79d87868df6fe6d6ac5f255f3a69107ccb28143ec2f2213025fb087a74412df4024e4c2fe0901f01148d6d84d96a9d4b03fd8654db33bdb15d77236ebd135b254aa86f529fc3372977d447afaf24377da1134b8a58d8a6a52c69b20f7c2c2182fba4414587e05a7cd21cd26518a018a9f7ea2a78d789abdad06c7b9bcb2a845863b23bf39b82d4ffaf616022fc3ed961f46d62ff0a575f32a915ed9f7705c22b5227ced444d5d1758c7c52f870cb6e65dee78d959aa5aa40d87bb33abf9cbdf601aad9a8336b7e922e0c3dfad325ce257842ccba8f26dab31312ea462abb91594b73595ca7bca129d9958710a7ac3f3fd121a9cb53f69c913c4876fb3f2fe92f17addbe494252198f2fdf09767feb85353ebccb79f67ad39910fc6fbe93e0c7cb73ee5500a3c81db5f208430f95512820f053ac814f2cab2cf7aae262a89db970da58d807d0d5cf5a287cabc1d4b7f3769383c4cddb6a314b69ecc2be9f35d7d305a4bd94b887dfdd121abaa897616f7e5a537461ef11b979c2823349b10db0361c86c0d0ac92ea4489b2ccc7c1522dd42463179151fbeb184ad8263283acebecc87c8f58833c1ede47913be93583a57755fd16edc611a4075f16d029b7af9e4af2550022b33236145d0ecd5aaddd409a5097626aad88a2133bf1f3ef6272979fda28c3ceb9a14919e78d9028b79e444bf07b3f615309a7d4cac2406ca7daacb996461a54f06f959d153cc60c25e46d3d09170276baf4b39d37d9a18f092b8c1ab2f99cfe9dae28c4534d36eb1b953354bc992ef2c4b501ad0512c372a0b89d3382340043118f43e502913c247a3cf02982b2ad82d1876d31edcd3fa09f9905b283119a088f0ac4ba4a5b5fe53bfefc108693d132be8234385feebff6ed6bda88ef6d1a4a4710fb9a6798240d3e33f1b385c20a221ecd9edae3e407547d2181987e22587dc4e1f6a8a4d7cef68dcaf04b0b697fd8a1068bbe667c56d10e9141ee5974215e6a08c1083546377ba5f7228f6b5121e54b7862f9af677897cd92ba8de74677a39f26b6cc83a8479e39f644258a1f808fb8ba7aad54dc90eeaaf9cc9213cd13a6c09f443e83c19bc43e82c197443e83c191c331d30524d2bf03efb7937f4afea8216701096a422c5f4cd105e286bf982bfaf0a454f1755f80653392c82371c7ba7c163418f4616ca4fd7c8d2b5e0b8d5cfab4e83d27389b3651acb6766d21b20530166f91033bf316e71779152568b555c6c4a4d0a6aa75c9cd7dcc8bde3a8c09949d0b95c2849b6c13ed9a560c7f62e04456389952d5576bd5e11ed6609a8bd8f3ebf647e19f1fce29182be444f0dec69fcfa249a98338194d9f2d5f14aa70d6df21b9d74d01a3b1e11c71368282949ac53352cd82d2a43dd679e8694edd19b5b1b77940b9c9d0bb321b8ecc01a3768b365d814848465def84783350d6ec3a1073279a687e3a01a63e6933206489a3bfb9ec7326d28dbe684ada197e82d452a984ae58ca7eae62510f0508735743adafe18d4077144cfd6957f9176ff49d8023fcdfc2b28b14cede2c456cb06787f55ec16d74c3876cac91c13bab853545e13781d1fa4130e689905739b0becc649365f083e5cbe9bd255bc3ed4b005b17ff569d6ba7dada8bd8cc6ba005737e80f5df14c4a282d7757648a3b07e40af85c732cf4b3ab5b4a2ee2d5c46c74e06bddb50dfcf5be7de0133dc7e565b21d68e8e23560f59ceed05acec5735a5950adc4ecdfabb0b2b1d1f468aed0427ce672d3e0a5c6ae31c1329ca09e4e4e6b0c50ca2135a1f30e2d5083b96c20d74d77755e20cdb04b62fdc48ae20cd2bf7307ed21f7bdf0e9602ded2cc6899dcf376b526c40e159f60ad2109f435256876f564766bb38ac6dc0446e6fc5cf83e2ff6918286461c95aa67e7dabf5ba979ddfd96338af4e739c29a2be051a7b05991e25049c9c7d155318e9c421fcec1fac42d5f971767e8f6cc39fcbe5b00620136ef80f94511af7751eb228d2e00202856f4d2913df71c2abf2b02cbabaebbe4108a4da91f1ac506d9728768ff47c0a59a735c1afab2b85b4d6ffeb4d96eb6de8349c4848a83ee7a0eeda83c12f9a0e51a6d5955295552e0688c3e5655502162c54bcb685f156777a7f095f5b0ed9a5aba2e4966ec49b6ed9329c7dd1bd33adefc20ebb6d174d9ed86126aca5162e8861ea7f21b43a53cd64c12935286c1a6d3a0edf584b278e91165c2af27c4d5cfe13247cef088fa19ebb9b50ed04c225fddc2bafa4012e7a1e30530cd95ca51d52f6513d54ee1838a5069839b2625d84043f5649f3a6af7d8def5442e3f22a6f41c1d776ce8f259e206ae69d5327c537abd30eb971eb7479f3e754f42b0b31c2710e382856b6af1c9987e3caa24a75a08d8af8799ad2882e0931abde72cd90bf8f0d4eddb138e6ca4c0de55121e1da4eae8bb616ae1ad94dc3a00de1989e995d837d5d67b839b6a0bc13384460bd7c06b0a3eaa00030fa81d8d27b4d2b617068aa1291a557f7750b6e626459caec50c25ba8b9c96f5beecc4a30bd570029621e0bb26f52245b513efc320b1ede1ac634f2ae668b9a175cde54ebbe1209ddffe70ff52d1f9cb14290b645f21799ade1c7a018eebf2e330562a6726949a215d2a532bbf5b918b52ab648cce52337f403998e82438cd2040e92dc85f363d977e8dcf2c958b263bee7dd0fe6b3cd9728c423e79388aa498be4665a7256f2bb8323143ff55532a6e9073900daea1255a6ec75a12a3a072d8bb05b311dfccb10859eda8be5868e18340c3c3846dc6cce73215a131b95602d3c3a1a7fcdd0d9129a8a396657908bff311b4d940e36e603b18eae4733e61430aff35ce431e5000456d0da32073dbd3a5c5b9a402b9a515d99291b1843edc6cc49c9e8e6cd232b8242361dd65002f0941254297863bd19a8cf32e2035559444a3dd0838f8c6585f31eb0f67fd5cc9c0f7bdc0f264bda06ffa52e00c5345309fbc5065e26b3fe190a74f106886807dca3963c0d84da793e31d630c16cdbf49b53495f996dd68e5e5d11f2027b73ae3dc8cdd33b191786b9dd4b84e4471eb4fcae60b347a0ad9ff1ba45e3e02ba8301a445724e772d51e7d5459d2538650ae414561f0a6d1f8e5eaf03ef2bad5ab0d8566e45287f81fcd9fc78c065a27a8a05000224e2dea7515e42cd053402c2fa2ed74762cc48e02b2568f24ac15ab297f4a0f5fbb2580507678b903f571e2315b450626fe4f28795c2143739e7c61a54cdc714a9a82d5f4187ff3154612a522ca7bbcd2649d92723d1141d2ab115ea2f4492ac6210e05100d510c05a18507f983ffa91c8bbd63e898d70e87d5f7f97f90c44a345339f319d56df9611eb4e7e915c893a88af4295817fe6db3c8d33f4c327dacc2c08b8ec1b9cbd3c8ed079cf6388aa815d269dc144770194a4ac0f91a2eeb59ae1caad7033151ce527bc4ac6a28834283ed82dd8fcbcc656121bbcb6e1b5aeb92188ca9adb400ca769b23485c65545ed95a55bb81561d316c1eb9f6cc5315e935defe7ae12dc33fa1495d6c01cd52bfd77c78fc681b67613be429ce6d53116922bc3d0234328b792563a74b2a614fb2421f43f3c5ffa356963199ef295415cbdf9a2811d60e93c105ed23dd070420e4b6e667409a3184532b622d27ac28498080e418835a30b5479b8fb0de499b1fc80e3f42e4b54d0bf3fd1851ec1fe92ead42d50c6ab54e781de310568ed41399df2d478643c5aa11249371596d77a86b31124ac6c944dd0a9145cd2b67ec0cfdf8e3b69a7bfdcc66512ddb7e657df1683888331d44e65ab17fddafaf5cfbb3e0362cce8bc66dfbcab67eba0536e88d5a0abdb266d2347b029cfc273afb498cf8954bd3f210acbedaf9a21ebdf72103b52a7b7102504d52dd0d20cf7944082bca52a74ff4b55907c48927b79e1e5f38d70b9de48bf0181ec28ac1b95139a3cd13dc57faaacd3c18eb45598612ae8e36153699b1b528ac8c5665b3e397c84137afbf5b479dc22d6ae84770f1b67c6c3262596178cb709cc26667f1d2caac1608772b6930cd23c3e800e084f019ddbb0d8de12532b1bc08406077a32bc451f22406e59fb055cf7dc0a16861d9dc680db19d93ac1ac0d1c74272821a1a6a53cad80c6c8e223f45b2f1e09ea79bc24b2ba4b56c8a7ea8213e341884445b15c6bfcf7e8166684a94f80b0ebdb59dae8faa5222aa6812877da3c7f4790375901c5ed0d1b152f42422e581ee58ca20c0ffddcb60c7b3795d5c989e6c647983237cddfca4fbd6f5c94fe79ac2633d15c057018713766cc4e3dc64048fe79894a30b3c0221f92d95477994c32ab724a9e1c66fa68e73433a2a89e1d08c712d56da68ff1512b5e5a36dd0c2414dbb39750751c7ab3b59902dfdde7664544d0fdb8d02d002d4917b4c39a0ff0301b600f2e0d501ec6111a7be9a7ec61bfbd5af0b8a9e9e28ac8c3d508d174a21b74f80f24708a9ce52aa104caa2e4fa38827c09908589d607e2928d8716b9675f6ff2efa00eeb1ce04719a4e7d834dd37edc8709f84aecdfe374250a82d3b488273a633f390a38a0c51f1e7d5d515b04d8095d866b8ef06e96691cd690a6825ae92dcfdda05cd5354d49f2a01c6ea20e0f28dd50b4c118fb1cf2957e00608d7ea0839ba8c27fef304fb29f36ca40695c98defae48e8ae7467566a2233fab24ad5df834bae363d6bce1b4639b3abe7e984a9a687dcc63a7987ac4d0506a516f41b2cd84bbe7c66d942f650e936242f191d79ba72cab6c7e970524c73d63ee116fad4d8b1f8658c3c48871bbbaec31d1e4059be678d3f4c8b40ef9d0e3e17776068636b7a39dbec899ced2a8773a28e91210b236b4f2be6c5368a730c016eb8cf649561b694aa72bf5f58ae1c63c798027938e3dab525819e7f44c609e1c5fe0a32f6069ce9982c973e5224f921f25388760d4ca0d8ce0386266351ca0e3c4222db7e72ea55638ad22c74a57d53ce6ba3a5f5e1a46005932785d0851ea1a6f1e537d145eaa609d0ca03530981532fd0a04a6b4309b85281156c6e700e536682fb7daa26e40533394de5fb501527aa918671ce1e3a1227b975064bf41ee59a31bcdbc37082012d470e5ebf79d9586f6a2274acf5bf8b24ce15e78395740a66f87024500d82048beeb7e720f354cbcf8941be0cc2c609d510e0ad3157120ca590ebaa437218e8dc088c4a431911caf014226ed4ee2ae1836329a9c0905cf736a96e72532009a9e612dea2f3a501a9c2064d6e1ed02464a7382bea98ad208a8193a2360aa30fadb820fc416fcff7f4782dca64ce1ea177968d1c20d0276ee573dd98f8e2528b313efb26a0c05f7df49b4229ce9dca97766166abbc567ca1ff8c73a75c54dcc3f231ca8eb99049fedb3a21a9d00ca4dc0fac401105520cf6c3364a5e223e46f7343e8e27f8f8016607185a54d8e957af3a3732c018026fb0522dbd01913cef0f0c9cd6e0a53fb63e2417420d97210f664d205e212860b38e7c8d58a8bda31226d781812307822ed8546bdb7870333d9c2383a7d624b704f3ebac798e364dd5cfed960d770fd34088628fef15362ed32bfe6dbf53d62052300c9ab35b1d73fd6aa19888d212f6aa1012eef5624e31c69c387c6be3154fe218c5903586961eeaa296f170b295e23317a1503d4adfcf20348f2317c32469765476976644e05e2a9b63be363aeda872c73205c90b7a8d312dd8fa2439ad0c4c04c77239dfbbb5fa6f311327c6d241dbbd428bc707c72e41f77ad2907c2351fd02f47029f6eba31e737d182f8f46fee73aa2f7db0e6d130745d3dcc2576e6c8bd9c37eff853a285e36d41ec7dc7f7964311f80cebcb5266db0a48a9bf2e7632aecdc86e6a04124e890d03647c9b029fb3cf4a5fcffd2e4fd379a34bcc5e2cc52f392ea8a7620acd8f4c548ed52e5d9bbf4ab4794117c60c38a30022fe932861f62a3cc432d0cea07f8c5e2524a84d37a232e870a81cc3522f29df0b94de6c83547a34f7182069419fcc6e8c5b0718dba8d8e1eecba729f4b29b58d198854d8db401cfea8905fb30883efab5863cd17430d61c3807cf4e03cd75f5cc39705436e1139a0509401349ef7e2a3560a585d8e0fde8733fc16dd98163e834cf2b4e34f151dad2f09e25fcff4439469ae678e730f2c6402762e4d184804b07c88d7df017e47957423064aef54ce6a30d2577917cca79c116997f237c82e34c1c91f152cb25e6cd8dc38fed27922ef985ac604065c5ae5bd2dbbb0513ae2b6c80f001d71ab882d24e294f55abd4b4c4fd31c8960b97cf4226d1531baa897cc01584aabbb7a85c5ec55703922db3fdd7f5dae9480501d8b66ddf6c81bb8e81be69387c1c85d61221685b82db91822d8e8532b2c77bb4bad02760bca09a9ea341e8699b22c8d1986bf1813ee90c1029613c5bc3462e42a47102a7ebe14f4100c7815f4aa70290e683a88d9f4c1040ce706487ffdfa86210373d926256ccb3cc506d44b9bfaf77d0a81ec20f87c744691588ee7ef1c42f3bd44c755d4661369b6c45f7c2cf8812bca8e69aa0d7d3f817efe793e07bf904109af190f093bfffeaba66b6f0f3b51867ed1af86f649b7eec5fd7861e1acb9660b422d91bdad796afeb441837f9d7182c8b670c4b546031591220706ca905003592156d8afa63f8c1dc1fac676ba257bd55bd3212643bb95a1162f9143c9c436be3701ab6d8bc496e0fbb9dc94828c5885e8d045aeb3884cd08a1ef822224387d02a8960d33eb872668ff53e340d99ba243ebf8db5726dfa52f3b9521d1451daeaa2cef858c1a27b5c092c2f22ef74091d58ec1ffa1968b316d5b597cf909e5a5c9b1d9eab2aaae491ad87cbeabbabe42eeaef7a48a3762abe8f13d63867405ae6ff25d6f6ef0dd729be01391a8b52f16cdacd4a5d24e9f798a5db48eae76435583b5d7e44bee70b68eaa78631fb0cdf66e21e510721bf7918d8b85c944c4746b6b4688cda0da913201f1302df90623809ec4d2e64fd50d71124f4a04e420da47b44a02ed2e1d723c0f9c7a960426cbe15662b15219f88ef463b5359f0394580d1ad666442bcc4c69d3fad2939eae3bd6ec245157118d53c6c845caac80d328412355e1c33bb8f66e4b7dfb549773cb76a260f36505222af4d58cb58b3ac47295096a29d644526b538c819a148cf6464c5d3d54e2209e5b4b688f62a8fb3a0b3922e1d3b945a5eedb3369d76d731f536107d0402f9d5f60d11ae067bd0a6df04ed9f8f8d216cd290a7b23f43e2d6524f4d17e94f7bedf803c2497fa202ddfd76b2271e9ef3b791ba4a014330465f6d9be68b70560a3c4a5c7a19d45f8c2782d61a5cdfd738eb4fa202ef37737d0c1ec1ac51afbe203940c978aba6dec1832918074ac7289bec5573ab937697f42af6cf25065fc532d983f61034dcdc45b5543cf1345f472090e212ba49f2e82ffc54f442d2629f02eef88b44c48bf18702dd69fbc61621fea404615f888584f6f007afda443d564245029d55c8ec31f9409fad5a27c2c54e8666bf571209f3f532becabe16b7ca0fb34f48ef9c36ab7d5ca3a1ef4eb5abdbf41da1351d1b39b7d3f16807995a501eda3bf6b110a5bec5739615df0078663d3e53a73efec50a1519f015b315be005f9ae2474be305a4bb1d2eef89c83c4280d5b7aa87eff4c36459684c37a1bd4a66659a5da343dd9cd9dda9507b917c3b11ed9c4411d299675e9b27134570a92b9b68ebac8c3fa0f8f166dc68193da21f3780464fd6267b634982ca6da1513fe03021b4c6eb1237235489af974a600430d3706a45c3b0e34199961d209e5442c85ac62802b516d9734571ac34c5d6afc40db8a7b88f156c329647d4d0ea01ad1d4b166cdbc04fb8de59e43e4f25577c05b6fbd28cefcaef16dab5645fe08ac572f7068ad2359fc9c3bb51886b640782344e7921bad8f9922001cf0a751fe15f7caa441948b870e2ce9fd6d6c803ff7892bffabb0c0f48854287916cbb0ae71890aceb0d73cf0b1a03af6ce96363e9ec46959a53869cb954d2fc5d068a90359cfd7fdc86c278b1d574657e0ca4685661fa81d58744301358e60c3a228626c4ac8894569892d2a8f1c71cde57a94b2a8a88cb9a2c06822539e1aad35d062096f816e3384b92b5f5433af902a2bfd7f97b02c7733c8f8f8af1e5f8d773326fc20d775ce34e9047c4915a725607157aff08f514d1184ce6928abb6b0d39fb6b569d1391fb68c83ecab34a7ebb76438db59d2ff6e567a48af888f60c27b70c4067b20f75bc7a07b5cbd1655a768de92ee5b2f5476bdd815a9736158c7c757bf4618d1d18d2efc32fda7f3d083354ccef84b7a4d1c457e9c5e9ff01fc0c2e7cab690277c5cc5e72d4ba03bae321472a89d2c54ae3cda7195a51b6168718c23ee689d4cef1d765eae266bf5426386a6af8486e9ed0b79bd66577de2b69bcf3a6b7ba12fd672773a6b6986d7fed0724e3862ce34c2ff2239903a2498ebe2e652b172a2e8a6314608ab7d5ea9137fa3223efbe7c04a4f23f0cd36a6f0529952c25951c458a83ba0b9de9f4b178258286bca029108e013362bf2312ecaa5b12a5a5c3b6a1f1f774d3dd4e54072f2f65d0e5945ff792e05173e191624b230da7a20aaaa514f8e0df5c213766980d38ed5102568916a877417dd5041c950fc5c88ee898473a10a0a342f74fa4e832326caa2a8f16a200dabd671098a36a9091d5f269ea23c23cd26702cfeab76dd86335730682f54d146dfde1c2ae92cd4863e4301edc51afa9e8d7190e5fbca1580053e714542b7248f632153d4954d3aa1c597c923b4252aa841bc45d124dc4c8d54bb48e89f3d48c649d31a1a988146fa72f4cbd7253f081336d624b14fc2b62b9cde8696bf36d480e1cf62a30424946c06aa51d93d0953aaaf543db15766020e4888014e6aed9eb87084cf80596cd3aeaaa910baf60ff55cb086c1a1a5ee91961627cc45889c3990fa842c6c08c76dcb2b9115bf0dd4c34f420ef6d927f971df43817d7dfaa2a75679756ab9a990e22f7054d1915b6ace483c12ae09b4e09964cb7724e92c928c988ceb063b1c6da6ca599e3aa1c064a6f00d6c3f39d6837e5b787400ed8fae4067552115681e3ed505d4c7fec01b0cc4aac186c962d010ba1a5c972e7c57430a228a4487497f6759152bcac87570e4644657bb559898d272fb04c9cd314c8700ad6c4917290cb58d34ba989896b5164291dba324f5af2339d7d9b825f4748446e6680f0db4e3a7d83f3175ee6a077c94801272c3452e7c679b2bc9e28a87560ed884f349675409aec70d5c53fec3f980bba6dc8e681d8d05b8c42ccae51a204e7b7cd8cf38542abe43fcd733cbc172a0473edf11aebf7be106b8c0f9e5bf52f14ff80f83a164a677c2cfb016ac30ae28eb4fc8a7a5b2401a50ac882b223f300e0b22f5fed4d99b887805e581814265d7e730bf1e57f41d3865bf842b4ae80632e004b1b8a21bde42c776efe64be3ac68d5aa043283e1390b21aa759d57d89e817e7454f95ed76bebbad9426114963eb162c92344b3041bf729bdbdcacac07e714d16b775d8839cb432bd9541e6873ee7236e47ee27bf6dd0c43cd01b40703b0b03bb243323aa34df40d213a0c3fa8caf5fbb6d3d04bec6e5ed2f1b2754e5be961b5e98c658fdea053561f7358a5367fc9f73f93161d0d49807b20100dca7da6ddde64a9e0f15e92b523f687a8745b8f11ece51d37dbd11a094008ef235c8326c7bf09e262759ce755f7936878ed6b82fa57367a53e243977509a0602b59b14786bd0f2ee2b1c909cd7bbf1f597e9fd55a8d5b6d87f07b8602006c55dc2cb3c3c03c1ada255117dadf5064f43401ece3c8c2eb69684aaf34914793ee5dbe7bf3a5875349daa6264b55f9e3f88ccfe567b68d3220942e3e3d54327fbc9329de1bde43c4f4fda2f5045f51ae7528ea79fc7be871c32a01da368e929bf31b7756ca174b7203fffbdc1cc0fa5eb7ff71f066530c5b8154af1960e66db0514d0cc0734bc5e7ff0d94ce19b97f4441d793e9eb496f480c4b29d7d2e4efb862c5ef4d877e6795e77cc39e6314a42e160ef51d3f16e90f75a9648c8a4e075135e78eb9de38db2fbff5cd203ffd4ae2304fd3777117fd4154d618579dfd2955f5c88beae3f5c26b892f6bdfd811c974c7210b4dc83260a5d4fea4566b5d6371b1fc2fea5a15c801a16fdf275e17014ba65113c77d79f7ca0ec170507da136006220a24dbc23949bd644c8a1b7d26fd40c507a0a328d8454b55596046ed3305bfc22f81ed4bc3cd88fe8b0c00265f7d2d83979bba4f33be987f2af6e6d2201521a06d3e805e1c7147237b309d9eb7ac0e9e93f0b833146d6798f3c8f2c5ec742b43a2413de78b9051f8aa22b1608f247d979663670a3e2ca54d187ece2734413d79c79e2e74bdaa9dfedfe2b9304bf46d5d3830a99edb9f9ef76a086cb06816d66abbe79bf711dff5bdb72d2fd4dd7dc2de0fe88b06dcbfb614d035904d50cc3ad799f7ddde0a75c7e081c8165c29b608d816840a5ff49e66aeb68a6f482b429358a8e00ead8364a78a441074e3183a9da92466674210cf93093c7ae62a175530abe7337c0cc21b152b199ff471071dbc1fe31d150089ff7338206fd9954711fcdfaeffdb37242fa757fbb192430e1559069b8f39dcab3945eb75b5cafc46c88fdb865366efe5fa516581bdf7301817f3f55e68c47ffa60a4ab336aa57e114bfb83d2e6fbddc5a1d9dc9e67f16a2fa66886cfb6a1b5ebb5ae8abd8a1e6824b08b3a98f9e9f8f2c2c20c8264f0a24334cf3380909082e4e9df7df4f387f4137cad1aefa28da7f78bcfe3964005225450bc522464aa646cb295ec863c1b06645cf590de5b344612639d96b73c30250e6ad691eb214b07b5859f253456c9fe757bc9f38b6d63a7d5341774dffc1d004359e88987ece05989ee9ec2b33dbd732a7ad35a267fecec16de07d321e16241ded0ba67d34b99a11bcafc577cb49ecc3d241f57eff58ee8059e57afeecfd766232a2c18cb06cf22d5323ad3708c77bc7fcabaeaf94a2ab3ef4f58d7626dd513931f69379479b74f081543ffbed38db4a61bca6c9c1cab30e5e6c07833f8067b3c92e216c23318d7cf677662da646b1ec91e9459d7367c03a59ca7f5abf317cdb67840fbb78ae39ea6920d49aa93449568a431686c9c8028ce29489ef977c7b90fd78fc58f09b7403f4c0430075998a41b7aa7d18dd335c3ca0a47d74f109bb9524aab6a57cc019ccc563bdbdc5d00ca097cda449f2e92f0459271939484aee83fd1d51f6a7519fc03945818aaf835a1ab726faed994b6b223a8341ef1d09085513872a2055b86d2eb9d20e986cc9a2724309838967271942bc78c68c6fcdb55953fd9da2e6c97d3791d3c1942967fd82424b6f3fd4a8db88c4f948f385fcc69934d1a195091a518b0c7e8fb35c60ced3fcc545edc9929c1a8ca165f59cfffd509ca85ee81d6aa3ecfda056b69b9defd0a19795dfd83c0498831763c29c8316912a55e45495cfd1d2118a2b6efc117b744ee1f29711a1c754660e570429c1829a5f8869344634a9d6b05b6c9644b61aa8e94985ea5ef59ef5a67b54f60a4c450b850a1b22391df37626ba5c8e2c0f2e9ffa14055513b47266fcbc83b94153b366864662646f9068d32575fdd73bf699ae90a7b20723672180492b2ea3525861ca0e6014cf98a8c9040a470aece911cf3192737d042ec851c9665b7f8bcd830040162c594b354234f1a1604ddf8c3105712f4703310f4bf5efed90af739c85e4bb8f55328f4cef5f9fc3bd2c11b6a751bdc96705af171f228c473e2bed244103ebc02682c633b3188389cf8b8896f0c847b2e3e460dc3aa4ca80f52812517fd9375231178dc73c78a44ba8873b038d030154c9faaecebd50f1da10f1eb7f69729554025e88dfe9c1cbd137ca9e1ea4aba164863ae4b34dce136292abb78c072ad94a57dc5beed0dd8d6401f7b527722b7175316165f47b75c0b072f16ccd768e90c8c45278e3a91000192abcffb4d21e8189852f8a3f949282b618cb34ad5253d7342799692c3daa5ad070bc006508fe1af4b74ae7bdeb856141f93e514cabc3c834c5ca1b8755e0b7d5ce1c6ad6b07df4c2a0e8982fe91c5c2a67643c3c3dd2549a573bc14c6b22f87631dc01d4d3a049bb68de86f5a04339d5a7c9b8ccd68c7013629a2f850cecfeecdda5f4ea36449785c0c2a5bf95b437e873a5ee7fe6eba6436eca1ae50c1b03f47d49325d2dc40efe8592cddb7b3e1b45e3026aed7aaf5e48da524b0ecc9ae23bdaf29edb767f5a26a331bbff04ddb492f8a64e2a83836d9ce136910aa436c85b94161d95e43e1658323f45ee2229960d7e7dbcdb3c42ca206850f93c62a62295a7c638900b107c37de0811c8840042eb0a412ebf9ddcd37589a3303a31c373e45d79aea6dc1f39aa54dea88066f3fc6dd96fdbfb359b780441d6cc55042f562ca2bfae51fc854271595351e4b8f33ff5676e362a6125ae6948933698b9b1a720353fa6efb4b1b62b3edf9da12240a9a401b47de63744d0c05f070c83f0246c98b92ba58facce6bdc873f1e23817988da1232887cb26115f65fdf03f32a551faae98d1beb2bcff64390b57d82b671887820715b043cf87728889ea8040e0cbc17f8e1f03d6c2eac5d8c1de7ef8d98e645d383be6c835f03bb300d58f102d629c47a85f8777999ce2c34da9fbeefd3659993b93fca6d8013323d4b37ef0934e7a53bed3251e78b36af1fc4d48fe3b09f6747c1cb5d60336e998aa2fc593a0a9041593b79d419f394d8eaeb4cc6981c2c7d80660134120b7091decfa710bc3ba99cb92b8f0a090e39aedfbdfd6ddef42ac24c5027b50a1c4a8c2720a8e51ef90518832ed4de913b6375c3306b80a7c065e1844f8faecb5ea5f55ff1e08977741f0e9e2fde7be3c0108e5afa93a3c70ad72163d4ea97027c3ff2aea2f120837f41f616b48473b79df8cdd0eb8892adc2f1b17f37980e326e1ddd21085693bde25b9a3ddedc0c0551af368b0b88f98893468708738500c1b15f5ace015796b38cba948e7f533bf719c3ae414f95c39a3841e5430f93524c3e38f2996fbe93ade8dee9fefe89b8e1e2576d135137f33e5d669ee9a56b9c61e05e97e61da3db18ae7bdf239fa96c8b4e114b97f02f430d02f87ff370f51fb3890ce9ffc9a58242d990a93e9584d2e98e2d9a473ea70b91fe43818552c6c2cc5c1a2b02ea354b27cf2f990ab36b0da8b51076e7c3b1639c7e81852c255b705b96df329941dc49ab8fd475f2549125ed27d70f306edd9a4eff8b79109506d9ba3709bea94fd03fa4b7924dfe3399aa09bc7342eae1109cbb5bbe4002ce11e2b38fad73f2abc6c86a7c521a1ee8cea929789d39ef76624e300ccbf422325fe99b69efb38c3fd420881c02eb3e4d43d3ccd6814721fbfdcd914a02f2de106320e7ada640e9668a54b5e32480f1a9da13411272aafcf202d6f3c96578c111cd4acc894319b27b94ae244d70ac21740f12432251071ffde208ba19e4986e01066f70ea7f67d8c8cc78c34f0378884362379fd124ce5d979152fc22b2cf4aa630d5bec3020204574dc975f7a1df3fbd243b0e934c6e535231434304ac4a291f5a2f4e725b0648b40ba8d9843cbd87c4f471980dcd35b18bf4e09c9e21852be7de289303183e7575f38444f058ecc4cc6a491cbb3bc0c2b875da9c8c05d66ddb09e4c2d8b5cf6efb1dd3dfef0768ebed33a9c4bc832b2239d0f10062cda84041b8882da16a23d1237cd4f70288638cd85330e97aaa90800b84f05eda706f012cc442f3dc3beaf8088b1f3145ab54c3f9a9558b23bd2f1ea4883bb64e8ee5f38cd25f566ff570988b7fedcf25c69701b1f48c7d96c2518754996f0fee2ea6f9971363fcf3cb7378add722801b5fb731e0a197e04203720dff274eb5ae75a8b91be936d5c2e0d1d78acc6c16dca9174097a85ec3108a03f1034f1aa45e0022651d678d0cd18a04a84d43d068ee2566f452325662d274c2e67900a85ecc0476f1f052f9fb2913a393f3f2c0a6118939084c9b9936134881acf77de67f3cc4b41210d4c984aaa7c0b5384c8ed97d9e61be5ad2df0e889c072f84ce64a5b875e32a7ee0403d843dd2f56613555f9919d3078cbad61f059770655b5644dfe3c05bbaab56b21c2a20bd15dc85fa56e6517bd343097f6bef4bf8e710adeeef020051eeeba7c10983d8e82d474774b052cc0484504a1a831a1a9888c3f7128251b95363f4b4c07d5a7e89ee555e1bf2b1c4e9c9b030715e849369e8c3956d9c654779ac06f07c1ec3879fc76a401a7f8aead108521dea63a252fc0a453387c2b2e8a5d9c267c538ace8fb66dfa9b21c6dcfce0f9cad69f2f56c2e15c35ada0937078fa86d689bf132f599c3ca34e4256875ce3745cc8bc7434581f9e66683e999369f5c75930980e367d99dc0340184c6771f4d0e5a3f9c7fa2d382716d2298c3e6029208c50b3e73b32dd4a0af8dc71ae9e85fa03c8ec81c56cf369eeb60faf7f9c04f8a053511dc943332018372729fd368840b925e73777a7f177018ae09ca095ac19eb84cc52153fb4a61384cc11059f62a2728a827c5ce390b280cce72ced14df6eb3bf2edd9892b42a384dab92a9e47f84ada74a2588d73a0e0d645885a81a08881bc6da7b89c48a16f042e18b07c12069ac97be7bd49740a5e61e918843d7ccdb41b41073670b798a61e7ec5126b60bf443b768dec77cea7f0ee89f921f4e20807f58037d0a9bacda27c10c385889bac0a0838a6ee245f69be64b956a368963d4ee034bae244579a5023b7f34a1c9eb63416204ea38a52d240a0d89d6e9ecfe38661209181a88109daf73e3e0d1107921c9f235e0c34f12db0134e090bb0b7c3f579e3e05caf931f31d3ce2b905ecb39131737f3facf5b26f4fe7e6b8c04c84a014864cac690f9189fcfd25db6f85b133717b483263b4d36e59f34b3a3d9103922c5cea5349db183e881c3ba97d0e5091b27a9eea32c62ff8bde0d526c633fd08dfe2a581d9f764ea896c77acdf4e0790d942b9aa8993ddb8e923e2d6f5c4109361aa00579472ddada7bb82390c0b8eb651ff5b1bd2604fdfe5acb6c4767ed8e057c01f34ae6772e8e8b23fab3cfc661474624fe477f4960cfeb884fa353983725b2b2b4e94af1a2c939f8f24ab8ee7ff36adcaf33b46eaeb29427c57c49ee3431a027b635433ee893538a2054db5641063858146a0f7f1ef039f70c0ecff47e31ffc53da337a302aec793ec52a2c510cbd57f2521645fb87a4fde6ec2af2958d13d462747a9a5a86fa9fa0b99fef00f829820fb3a38f2a23c4e38a468be9683ea87429b9abadc38c4427cbeff6b5ce6db791fb633f888a2ce1501360d121a3529f1e5e54070a837c9ca44efdf4667d6a7f2f235001345ca372c6eae26857ebe89973aff7b17edaa29d05af280ef3bc3bcd378f90d5cf7ada6955dc5ea75070af06b4b788d39f9b05668e3413db5eb15073d03f8afbf43871f6e0214f9b525d374b9f72c3bdeb6266c88c5c92779b2a27397014158985ccaa84069a064347df1c1846fac4d170318f5be1e5eb56cc61985bf5243c3885e1cc1449ab69f31c9c261a61dd8a2f0559c7bcf9fad0cb5ec185b3c944aeba2a9dd3b8cd83d838d3ac641599a72c89034ed58d113348ab64adb0d26554cfdd40986c7bf7e1f8ba2db85d7d5d3cdc49ac9e2f989ed13136a3f01a7ae460786347a082a347a9454141c718000c458a4c5febaa45a8ee4bc9eac82f31602a47c8c13d94be9e9cd3e741c71a6e2a90687082ff2ab3fbb5cfb09d95ed954fc2b02dbfe41ea90b06cac6a69dc218ce6c6193eabe4af365c0271ebde7746d47474c385541a698baff630a7e91322a6e425241a5686d6f0a21333fe0a7e87e1dcae29fac9545859b7e91c23ad042df0ffec48b03290a4f78f080e59e3011f13c1325dcb1af514eb19cf4159741b4befe620486377f5f8b0994d19991199a327825d5ffa319f852522c45e21683e32bae8e1304b46964562f0944755d64b45b8e8ada1ae86993fc95d9aa179bef28e74c30e2983628a85a36f4796315f514894bc0fa33971c25bc3fdef25ce4c605d72fce41993991b62f35b74d2c6c9d91c3463a35b3f384a57b6468f05c63e06b711cb34ce621d7e989ed212026c83a9d71d8fe6a211d7205f428ec50ae048e60651cb8b776b75a160b2ec371b34fca664348b5151b1b52a8fcb352f4dd2c264aa13c0f973c62a28d39e031ca875c1f0413cb27369a495baf622b519082946dd111f3256a5a4b316768a9d8da1b9e6606e279436b4db6781f676e2e51f0035944b83b796c4f4150cbd94664161873cfe8a8be4d6443f0aa7e048a08ce2f736e23df47550245c63c91bf0c590b3832c9acab6dae5ee7bf3f210175e4c9461f75c4ab93d425fc63387697c7d70ee5d9a38abbe986a676bed2fe4d2750fec5607418ebd0cd82e36d93108b9a8e55c6ae0fe34dc6bda482e31799fc2b095e332279b7dae068c8af9b01069cc3d1bcd928c1e3c815fe98e4077aefb810e66aa40c471f68375e60f8a496ba81edb5692b8575d7abc8c0b5a955dbe6ed69c7781343a891a59671f48287f466ec02e3bfdf9527290d00b46bdd9f84dbf3b703e55b97b9f72bde3b1dae0f419fa40c0468fb727e090600ed503a0162b711f23daab2d8027c75801e12355686594cb943441b088dce43c582f53177a4f119e97c02e9a3e6155204199c80832fef00b046fafc8b1bf4f56088ee6077f6e73981ad5a235adc22d79ca70b5bb6c3918956e8d27aa39cfa1876680302a58584627516896c36a2666db867f12074276f985ba1267a696603ab7aa25b2920b204c621ae740d77a143b0a95a6d264aacc87014a0610c1e92a695daedc44192b7c893b4c16aacbbb9e12c9c3f3e722d617f70f4a5af6df88003aa8f037645b70c9ad9802e788223153dbc3b115ef5ebc6eb1f2536bc8c9fc190fd565150ef4b2f46b79c4ff7aa256d8943c626631a738fa1eb6e7327a281b7a4bbb53fc340ffd8ab47298b52547a04aaee5d1106c81a9e9fb1b8ffc16d8a40d0bc83650e42485daeccdf108f363a983322a55c7a5133483af8609d56860e1ef5c78fb75e05636a90a3641366dfa081d836a88e440416cef8875504a3c5147ce98cbe05528a1e8e229b611e3bb1a28341e47a196931ae1fbdbba9a92ceca542caf4db7ad4a7dc99a58ab8aa0d24bc1429162bccdeb9cb30530b9e5cd3ad4d1618cb29fe3ac0726c71ffd4b19cbf61e1c8e3d0867340e6ba57340502207589c7dc237a0409bf1b1fc6520b372e4e6965bd5def18342a8e8c907d2abffe08e5860ba01de9a2edfed52cf2432975a3eff07bf3679b34e872138993a4e5310a2b1fe5bd48bdcc481a8bb4143389bd73a7e7816290b33b9b609301ea29380fe44ce498a671954ee342e55ddaddf8d2cb15c4a3ed82ba5c5165854dac4f7fc82f82c37cd77022438a517fd01628f515e4c872ae25d8af1d07310ae848c36651d834fe4d1fb8f68fdcd2acc2bb2fdc9bead38713e9668b520900f531cdfd272ccbbb1b72e6e677aa66bd538c4f82eb3a1d5d349febd312dc577458ff8d397c3d4883e21c8f6a30cc0918db0f457900cd49523b067973d599de240ec2cc72c0b7ecf83c1ec4e1daeae01773b839fbfa7a38d521d75e18d08799eb645917a6aa95e548e0d19e0fc516b1f962da368b9dc33585f4c6243334d721d31ec8e8066cc924152fb52297aa3099da70d27aea79f482559c47d273d07673e0be0178d90800bd57e979095688ce5380d063713cbdbcc91afd044aa169e49483034fa0b83effb162071b9575b18da5aa792310210cacd5f06b5431d8392813aaeff41b4b52c0d1b8a0fea18b84e0ef542aee8dcb2272744eb6d44849e0a1724120f39c9ce3f5e92ce72f78cd9ded2eb0368dd331e215a619e55ba41ba651779ad324bd55b3eec020df8b3c5bb073854edc765d2cb7b8626506cdec7ceaa61338df51e137d69575a91e9d3f9a3a1bec997cea751080ca195b19483ebe8ed1ecfc2c7af3ac0b33693f105a12def795cfe64f0adaf2c2a8cc04194d6c88351fe077f0d10c8af5cbe57d912203632bdbce89cba418dfe6a2876b287bc5fa8dbb21ea4bc167b19c92973eca612694972d2f9321ab8b50269c3ebef7b3310204942ab828a2087744b445c042eb69383b451454232fca11d333426ee9d234af604529e7899048f6a2490ed8a78faae832d20ce3f3b31cd1c08eb816c8654822aa6a7e53bae05db4ce2894667a07189ece585c684b0d66ea7f3ee24a565012eb132af3686c9cd777fc9deae96c5347e292e239509e9a0943ee7e2a677d0bede172fa9ecc2f940e8038c7e04583c1887021f6a8910b9bd40bc557f6c729dc6df6b170075f0e2df1a62225ee0ea55fcad3aefe7c68a56f73408fc718f0d5a28aa3ddb8252e50fbd6986788d8015e365dedb90db8873317fc472f6530aac84d869974a0cc69be77959a3529836ab2cd5ad13be0b7b99949ccdbc320cc3b07df37f784c5e57f4a1fe5f38e3758cde0743e07c7e419d97a26c9f2d0503eb98aba575e723ab0c22f97c7320c950f9f2ca8af1208814f391d1beb29463fa68e3e5fbfd035b745477ec012c51cc8269d638689392a2ba7e658bc84c5bc8d0a0841843e79795bd323fbf68259b0fdda0c5c952736c6f6ac133f5ae4d5472c9e3893ff81473ba53904506a34640e3f6b5cf32719923eb8200607aacbb821d97fc6bc2abe0956773d1f6c6713ae40cc0a806360e838d5bd9d515ad6424a6ff3fd04618fe36bbe06ff8ea461fa7589abaff81ee8d4507eb1abbaeb771043d2989acebad62c6be310eba069e57f0269b5dae895e26498b4b14bae39fab4625f31739611f7b6024a43316c223fb158db6b13b87b21166b7d5e6f7606c61a433d7d64a173c696a39ee79f5b3b777e20ee67e9f01fd73e2ce587bf0f6d52c77e4ec22b69481134d07dbd952217d3e835dd220d595cfa7c24768dd74c8a79e63391d055e1aa9e8ef04d0291fc594d8cbaa596df39fceb4bed1ea6a474f4550e15e377f9c21a6eb31a97c682377ecaa5882fee86de1b854dca73b0d9233923796d3364fc3c743ff62d94201cf0f30c5cd2370a7454d73489db1c13c76c5c0ba8d18984cc1515e005d13aa83f23a670fb62650a576f4c9c298357085dd8d321660a689aaef300024440ed6206be6c034dd1b63f2bfd5e192e592d1793308e2d64096bc57736e9b4433424fcea1120f7b0f90cc1c30d507e6215a81913301e22eb1cea93af7fee4621a287a00c2588208ec024d5196ad82f34a8317457292fda110b7fa235a7525e758365f56738fd180d5e1b48a784203e0554f30521a834e837f2bbf44a7db6b275be2e2d185d9dc7ed7cde7478ea523ec1b987edacea7de36a9728a8642729adaa35c093f22ea7aee4427e7afaefdbc27487d06fb836ca7c7944ee6d0041cfbfc9634ab6e2ade2c13a823cf00d603569a3d0c8d8b251688860e9e225e300ee3b5699d0fc69afd6e6a95292304ac4152311359429853824dc5703824eb29309d5781aba626ed73337dbe189629248a99f28482f4157be885429c89292ba5ab7b718c098b47bbd57928c8c0a1261602ea3e866d3113354b00127b2d4d123dba66bbc728f7902440a3d89e9c4a0ce39b2aadf6df50dca410d5ef42e3c19fba01650c2b1c3be5c5ada3aacaa78f06c4f06d6b4bb887818dba24ef35e48df618b74d70cd5f32216b07d68eb88c621a148fca0df027b9234fd6a8dfdd5c31ad44d622353730af211761c518058c379ee52fe5e48250e885ae5d70175d768f9b13e40e4067bd75632c2ac3dded4587d9575b98bca7506061b4d270827ac7fd859cb75b3ace21890ba35a4d0a69e4738beb255d10192f64bc13ca2042393fba8398b28c59ef80245036699da8fb95228e29f682fa549c4637b8f2276250e923faa944e10f947d7a4a821be89943fb9f1911fdc38b430a3f3077a4bbf5a8617e34f2299886a9441466cb2af85765f404c837861ddacaca14c32e31e5e5bdcaefa9186fd774bba26863fb2b8becf7253ab7ba019541520c81b154fc9fadbda940f61cf42169cb27ce500d9f0edb6f3dd8217e0af71b662e4426d2b3b0d7f37e935a94d17b8a4186ed544d6879ed22edabf946bc3a5f4535807f7670c007d52bd4f466468d947138ed1a847187adeec84108a1ece2b01e184840a2a24b07fe60cb0de83dc76a4cf99e3f4fa5b4a34b340fe9312bf305363bb8d97ed4973302585c773d97e4374d0e0d5fbf208d716a77d44d31497f5e80893fc2d044d48f91821264968f2d9f6f19a2a3be8421f4acaf6459b455e5d76610e443ca66f9fcc659b4304133d5414a8bb875452984ebbc5e703328864bea78478a5ed3897a296b0037d90d151db3f79c19c64f14adfe8539a5463e2548236085075002cfdc6a543719dcab52f9c71a67015aa0a0a295e5838965a109e79b2975158e2567c0cfd11e51fa9d3ae9aadf2e1f9bfc76a0d4968ae2ca1a2f90fcea9689578b8db443086fc17ac09e411eb0c25aca4ea9c58fbe81ae7c62763d02026f1c53048fae4135e7c500b5ebee3e599e29a735abcf5e8ae43be4878be066f9c37f96c727c65f7d525ddd273555e0abdaad4a84dde0f3c27ef099b872421b1dd1dc53879270dadb699adf06ad37c533aba059963a73dba4ac9517ee9e526a47282ce14e9de4fb2195fcdbafd5cd7be8fc008c198ea2f2c02536cbfa0c7d9a80280ac6fdf6743a28956477bdd874a1ab2ddc4a6b850ae75d5eb9a10a5a891562f62eb6d888b38cfe879a45efce135cf1397d004fc36a1a1809255c85c55140a610900de2a9898dc490df6e01c189d5dcf7338e2851455dbab25d94fe88def9aabef3334ee4a1abef1bd011b49c733da7bf1cb1111038889c82039cacea16ce858002eeed57ab682055cb78a514846c29a8387c863e49e31bc7c0aa4e1b83e52e1e40de5e3eb52fa43d61756022e82b26091c2c5171746ff28b227f119080392384a55764e35f50f1518384cdde3844d90da4b99eb4541679e6d063eebd9b7d75885fa6d73442a94be876ff3c8c45e67a70e9947993a756a445589a46a3e06bad3434a89519f71d3ea63c8694c583420b4d498e899637102b137e0e30f6c2ee779584a9655a31bbfb3838ed5f0184bcc8e1d74282245bf4eeca888ed708ecd35316a74bb29979996000f90a6e2e68d6bc75d689453be5b9d13ee6d87bc647f52fe98c51c1950dbbc015e70be8b4f80bcc82da7d5bd0dd9d29f4726a793bd6735c9e56c7f3b233e490325c5ee23a66441abc2bf3968f4e712f115a154576090055a53250d52f0d16536cedeb34e389112a25b1a0cdd0cde0eb101a37dec22546157704f411a7ed00175555aead7f0da932532adf7e8512a3dd3f5bd911eec74a1a2acf8fc699c43cbe7c54490b88d3ec4f4cfd08759d58c27b380d05f28b6d215afdc7f79a745dbe3553145e300bb017dd2f0a1d8bca99b2a939229c68cae867de88d8a17dc0d26ffd6440fb183516b384fcfdbacf27e2d0e6fd05822c886f872764ede37ac1005405f918b590dcc916089fbdbfe3266f7d0e8c453fb74308a736ca14e46e04e1645ada74309ea90cdf9e45fcc2b6b80fc9e420dc8cb90ab4f4f83655345fee478cd8b020f500be19eaa8ee3e741fadc57a06f81caa08204d5f98356eb94bfe786eec711683f89a047d04a6ea3217566f3f25efc9ffc39362e0dd5e37260139f13dceb699153cb33a16bb246ae99c2cc2ff6223b309ce204384bb946a06ff82c4ecdcf5b5ab0e8cef268af51d8d4b9a1a46565785c5095071e48fafa3875e2c297a01b04b6b8e2bb56a7bde31d60462e1e4e28e4dd360b762b694e17c96ea150339b417c6dc70166bca55cc2639a71105366537b56d93a81d1594215b46fd0d13c12b099813f5a176849660b686f5464995050581da69763eae0871cee2dd0576b62808af46b46120d2d572d049c2cc2cb90cad13860adc57c5160bf3c1265ec28f1741a5631ade49c354cb05fb8bcc2bda74e625c93a4e5a35d52f48de12b4475bd4da1e824207d520942d1a684f4ed9e6ae958faac307fcc16013c9075bdc351d7daab10d728efef4dd1675b94c4d0aab920afcf7b86461da940a8856be0485a6dc2ea3d33e246d8003948d2f0a5d439b7a8727988d3471fe89616c69bdd9ed831eb19ed9a95be1d2d77d6970ced3557cc0ccb5a0def14171f84d2e50cbd4d6c0f36782089041fbe7af430408d1579ee94a443aed3cc782a96dd1e8e6c6460b261026f4d41bba4f93a14a18af6ffe9830f2cfc341330626685c17b10c592e7e4df47027db918bfbfebbbfacccce51177392acc77ff964e1698a88166408d18600a6220f3b47a97665e2d451a2e6a65eefb6826fe9fe88d7585177357aa4cc9e27d7791bd1763f26ca6db1fb0d1b837a3304ab5965ecb647f706d71f6272977bcb7ceb8e2354db9ed5bdde25f2ae531848fd707f8f0ba7adf7f099c7a454dee7f856ea1c31b06d606ff97d6e2454cd366cd78bf04c6f22c8b29e440f9017c2d9181253d76ad9017c0c7c9f233f404c97081e913b8310e937c9eafa57d53b85d07447a81866fb17855c8ab2b8781466df59733d46a4cdb4472d77cc675bd2f074d9dc80d7b06319f14f4462c48cb6ae27dc625ea8f2e8ec99e9fa95c14a7b0619f82a1da97092b2b1527b77aaa7bf222358e4012f0cf65def2a460ce3213e77513c405587614418f68e66e824874803311df3f999ab7f404f03c9230cbb6773e8c8c4cac9ca0c603ad1c453633f902161170f784ba0f3313e311d89620cfd1fe5c73967012b81de8d1860266bc739139895e911f38ad04664f7ced96d4394630d4d28d23e40a6acfad442ef3044ea219504bf1380b1202b044e85027ba2f150b832165e90958ca59940ccd552aa7a092cc85eedf8077c908482494faa30d0da37ba05d8f12d69a0e0d1da25a451dd4720f0d25ac863a3d486be908a1d5a17e35a8aa0c89a0903af060da1efa8ec99c4065d726a22766620feebe9e9e74d7fb2ff917a279ab3e45ba2f5906f8d55d518fc00370f112a370edbf3f8713fae71fb2b2621786c335d14a49f338e75b99d6e514616244ec244a66d9e25dc3794f4b5bb52f92e42a309af3aab04ee66987a8391e746df02c286aa1005ffc7c1371e1cafc120eff56494869567b6502166b0293b089f3066603b042679cf92fffae2ac317fe16bf4b87841b23a1767558bc9ccc70c8d050ec6ddded14b9683fd28a783198366175befd99302c25a4e886b5f2de63122df975a704e1bfbf5b97696f6905cdd1b2b2035814663c59039b23ad60a8788b6816a7891e68bf12f2e299deb4b401d151425bbb06b4005d4f8c6d187399adf053163131fbd744851aa9deb41bf1b199cb9db9051d13350d9f75daf35e52bcd8a79fe505fafc960f09e54f554b3c2c55f68eeee845e9c28506c543c7fdbd95211e55300f1aa41c2f45dfbf337b2167c36313e879aa8ba21ea14e38da60284fb37e68eb58fd5b57a2ac205976344fb91e0bcf15d446bb32d85f4f70dbb6df52428289a5172134c28f8cadebe84984a4a6c82017f34a780611531e3e1a491fea603c54cac59924069ef6cfb800d201266c45eccd40e93adca972449c8a6672337b2c254f6e1e1adb857845b4d3322c6376406da41e0c174a002a13a5f0738123ea8218a1ca670d87f1658d0ac263764c48e23c3065d564619e05a68632052688c552a6f15e77cfc9f0652cd214f9c0044463460fd4b562031d842da2e40f58584614e896d0cedec8a69f4021aab53b942b259b39e8c42ee3782165f4dc43acb1332fc580fa39df89b55ea0f931238a557c5b6d88ec93291ef0eb721ac7d7bb33c74443644606699822e74b32c1de3fdf2530cf44cf1d12cdf76460be0cf8877a50c075648b7303eb9d911e959511b026ef40f213b1cf5f56fb3bdc44b66a49e4d627ce35e7e52704db1a19fac9350fdaf64c6acfde2c9b0633e8ae8b6be2ff36b27ac43cac1cb2515220e5a87738972f325824fd22e6b7f8885c69e3042b7191d61b004364d89ed3ea65a1ae340944628a3e6f90c4aa194bb33730354d7711b16ac8cd7fc94c1b6589b151e3e0d00d25346654c9103b9de31166288828e105e0ee7b56dd7121542ec7c0345e9014309f9e5f86dcf932b7892805d856171551ab8840559f3e7f0d24c63d900163cce1f65a5873bdcc6546902a1957a68bc1407b7e52e90cf120ca87e05d41831339834858ef80db09fac0f7ac672761bc048554d8f1f9d4a03020d27b1af27e3b2b2f981af778ed674edc8165745239177d9613f72d6e5d65875ad5085121fa920b6769a6824485b8a73352f602ebb4ba36c452beb37c52f0f6a8d9fef3778f531d8ca712100bd19d36bf71ba14dcf2c63060af9c3d73e58dd67da15029d97a6cbbc746a84e8600913b1320f4c86dcbf278dde947f9052c4a865af96426c0ab3629ea190de96cddf59552e86e151a200c5ce043535fe10adaee7a537a9cb3ebfeefcd0befee356719664f43f6fce44de17865fa44b430739caea90d49129b841e6b9840faaf7bf319c6b0ae631c28764c719196f3454a2619ff5db129616ccd6ea684491e83e2ecaf26d1a0c00203de21af9cef4509b79961b0c3836889ffaaa7eba7fe8588d691276461612240477e115add24f036438bbfa9d2aea987000cde69bb6a72fb2dadf4aa66ebe3892cd88c34840f1e11f6d92a55d90306dc44d5f2fa5810f5f76c848d2d07ad793b66137a1a9026e338aa0c29d87e1efa095773fc58f4324c506bcad8c3401bffab14a606f67dc5bcebe14af28a5d94c2cc2a112a4ff156a2a901394fed2889d0b1f2474792900dc0ce619cb9fc681d01065484a8e21402476a1cbb48ba9e7ff611d969f839b9259aad21b3cf08f6522a2a72fe6e246a9c41bb2c6a20f28341712ac448b9ff69a352bf0331921932c4be73e90d063f543644a96f76724abb6fc1c6ccb2a141a03b506fcb8ac4cf929ed51c084ef662903b9704100540b55a488356dc7f082e1f0975556658e008b1b15f165c7619778e5c9d8b582468fbedf8b4473b4b4f175aa128ac47f7ed8b81530b81123820f09c5524d56b03ac7826fa3df532f89b110c4fd818382b1dc74dfb5421dc351e03231a3ae21aa500a68583a769dc4c29e6254e13616fbb41c9315f02c13eaece9710cef714357ae4ae8ea14a27adb6332847ac19a906a97fe12f91d367911a4c470d6c7ab1e4778b3d915a93454a7e4e59bedee0e5e5a14dfff5a3cb6208798fe22ae54a128867ac81f9a4f452808111459881a02789f266b838cc1fe7be3ce8569d2d8385fa19449c9884342249dc2d6985199a74dfeded4ba3ad0724308d5bded47e74ddf8cb78c1d4ef631c1fb143cc168d1df724e697bb7da3b8bd3afd3dceaa3cb29d1c2aeaaea024ae9b9f529628010f8afc4130f8e3287688b8d9f2a823af8a18cdb4819bff816ed0fa95048cb5c6ea13fe848b468883c41a09f17e37cd1d018437d1df080f507c0c9822cec49734568e78bdd684bef6b8df10cde6d803aa8e45593e8bec39a1e80127a239975046f1b19c6c6702a0e8070eae103cfbd5515faca38f097102d22b09525c7a8aff0054f77eebf5fce9ba00a226cff44384d256d2cbf646760b0a421ecc25aa96d1647649435ce747df8fe1933272f44139f2d2f37cc721e013015885add011d0208d0795c3607bba3fe1127e3a603539c272d62708d52d2f37d880e3726b0ac55b7406c1aca5038d450eaffcb31c88b71e91104bfe90190e03c50dc485131f160bcf75811115f3f57a3c12c12fbcad9a25685004f81b3e4e422a6101282afc7c3028b86197dd7dea1a61b5cf1575e243dca003a50930cbc517e7d8538606233c32ba37f7d8928aeeb5d7320c237255054409c105c2f75c3c60a36d7cb7a1632b3353cfdab53d43d73773e9c36c5efc847e0a819f2a340fc9e49907797d535e31c8a651ba480af015c98600346e04a2a97aaddcc2aa47af70d8f828b86f11e1cd4712dc4c46edaada701d62dd9924d7bccdef6d304be2a85656e12e175b76a6f353d8f4c6b0a941f2351f619c5e5740e5d9aa1dccf99a2b68c5d50f3ba8d167840e3faaf3b1dc4d0ff979d8e2b090ec916845229d18725b06f597b2f2359fd06593c9057f1e8a8cc475c0e4a3fe745919b721ccca99b888e444423c3a1494559e9345a2a901ed7096db378b5127447a31c518acb7fccb20ea53b613575a3b078b9b5eaf24b045f4ab110d996eeda9ec15d1b7bf89f4d548347849549ef480ef0ce0bf7ccab20411531220a20d3d77d876e105e02cebf2f129e906106912fa1be7f020c99e30d35fcba4a8b5ad342a228531d257ee47b67bc45398437b6826913abd58048399c490e033b07a917075800359e6f8949060e180a35b7d82574152a1e9e7998391f6ddb5b157003f17ad50c40d580ae3fd5a320b30da6a9d5213ecae2fe8215f7d0a26acb85f0c772d5603438a9d0edc7cf420c67bdac978d75ae132a08e518c77315800db2fa4c52871450a2f44eb94d70eb3eba47c7a28e910077db28a2ce404a29a9130c61bdd24cfa06ab6df2d688d7bf5a5a8859098313a4f057165e8dfb73fb9abe802cc8690a9141a6e5dffb2f508720ba006915f471ec2acdce5aaac040438f094b0ac947786e4360e5135cd229fe811520863d45128bccb41413d17d32f97689a1189964a009e0caedd78e264a2341b0481e5ac9414665501bc386e657c79b371a736205b770a67ef25174176893a0c9f2709e14363252a92ec2e10918a8bdda5dd8db433e0241a3cf1062f064b534a8c2668dd5b7dd4b2c1878a9f9c510b55d2c990f819d43e438d8e03c75ad39ddab498ca308bada6d51537826ca755870444b49bda83c51b4edf6283850d3465a46b7a5918f296c0b5040934dd76874f376a83ac3bb74860ba07ac7a00b267edf2638dbb85cf293a281fe73d058af830aef9d87c0170fa790c7bec95eee2595f64471993171aba06dc0180a89a2e29ddb6674d1054186e82d20d4f8164e164b078ed49772b78080cd5b955ae49f7bcdae20e45320a4be59874e7f591a37b46303563e99274777271316c9006d44737d20811ad68ff462d7cab94318d33e936fa4cb07d1a5c3d490c72e7e411e18f0647400decf95bc540b27702313aaa60c21c28c608930ebf40d629b7608a4fdd962fe78017f0fb0bd367ff2b258af13bc4d1e0b7d625c90d0213cfeaa9331ca72a1bc70c910deb150c0f5574d10324b6c5b09156eca40582bec81027ca271e4b21d1af2a4585b337042a3ca8b8cc7da9d808051db1ee8aa1c938894e54e2d9e2563d4a59d467e2a8a357293884617148c947c58a7464ccc57470228e7deef8e70146530069aa49fa23975f9055aa6b735a27ce4bdb0783afa24a4adfa493e1543ce6a567aff2226ff3b6541860ca091171a33b7ca9f4df459e8903ff845a9fa4d87243810d57d7ffada6bb8f24d247cbb36db877df7bda28ead8721b3ddfe147185140a8e9980631625bcfd8e55893d103a32e0adbc6877e28a3aac50bc0e86c65378cd44e0d240f4b78566d92f83eb0992e984cbc4f286aaacca4d6dfae22dfbc0f543425fbc903478dbab3343fdff9a94336f154c06127f43db2c87d3b0aa52e3b20639132b56bf01d871ef98df05966afe3cb60c99d0b4c785c53480e5c6d5bd3ed563525cab0e6ef924a158f2eff7a27323fe8def7763762a41d9b92c8f5eece23cb596efb5683a44bd490cabeed49e87ffac64e245a3e310e50547fa21a2922e67ea2dcbb9df44828a9af319771338945b16816bc0cc70a2d8ebc166d4ede75ed2028af56841e943da9e4d0d5dbc7520bae4c0de828773fb53cfa4ac80d920e1ef9db2216fbe7dfd15777833e24c35e9f8a8d13bf9e11e8427e5d2c791662e4c930a6f22f54e68538cb310bf2f85de14b76f7d2072a4af3fb17c5f4d2184ab904ffaf6353615e06ecf0c4c83efa8fbf4bcc6e40328abaf1403c7885a5dab800f2083f4e7a0d415bcb8101e82050a2f3329c82a3ea96e98888330d5e9dad3926189c03e8cea2f5283ef6a17c8dd2e40c8b328a12981b867596143b095abb6203141e85c623d48a67ca8107ddb7b3278d4aa0d9e2618f7d9edcfebc594d5c8045e8e49668895f1b1f54feb519a6d3d2cccc4e8238bdc354c92db4078995de9c5ce02d49f608516c7c4b4537a2986db55369f12b72b4a5114139829fcbf10f08b777b494fbe7b5fc6c8c11f4758cec291b9905d25ed3863514fc80470f0f82f129bfe88c28fcec4333686526f389f26cea3a525fe887cea7cd5d4a70d44d076711067639138539097b5af5161f67cde416e75ce085285474e485d1d59e2d003bd3c778a78b023c7b1387097dfdbcfd6625f16e435748c521ea2a4f452de0dcc18bde63533bb837fd213265c38f953ff8fdee911abbbfdaef2df8f5de6bd9f76f56fd72f1f2398b9aecac4e32e2f79541ffdef3105fd5b296705b925af93376a68972bd882ee81e3f4ffbf60c1aeca6743664f0ee5133fb38472a6c39f6317835e28ace65e7474e99465bc0c235819ab61ae6445fffd0159f2bf11da187ed9c9cc87fe10b67319fa6bfdf630602860985ad4784a18c9a36ff3f52a61ae28b21c9feb6a81e05085eee3d8c6cb9cf893636e5d1fc44664b55f1005f35b4eb9ec3ab93c4a6c01926c85899d17a437b7c7bd745fa2d36775c80597d43845884747f52720bbd4d9ab2129b120fb5d222908af7c17c68453bef0544646bc9b52492b6d7851837ddb1982d42c6a8a0a735b8a6ad9ee4e346bec0143619dfc1194860ad9861a8d5a477558952781b84481085e6be1765160240e26137f9fc3ab7fa7f745cbd8e9f97561953a9c02f9fc2d6a3c264e2096479106d956a69088c54d11655246cd93e12d4b810c33d930d9524926309874200a913b1c2755119f3461b39fdafd86d726887a8b0218c84cd78b716a55e10ff5764990d0870a58df4a8ac99ce847e9d9b5a61d1eace785f2280f460481a9501aff644c28660c685ed057d65f7465504273d4eaa5b3864439f23b1cad7489e5dff0cd567244eb0e49c23141047e6336dd1046bef4ff17e949168a21df1453a62a2101b179e2fa1acbd5474548fab837d4704d8328ac181b4b37f4e491b9d6c6821578fab7807c8d78642eb09535ddf778dbf7e3c1a8174a7fd3c86f90547da5004f371dc794a1f6cbae88effca0a6dc590d4c3f4b31c245e40e4d401aeb20609b41528bb8af929ba5bc4003972594b65571548e264a9af1f6eeb5c8722654d6d81b4a61aca5af2c42d5db597b8126a1276dc860342662f8228c1a0cd2f13c0709c6b8ec68e46f894ef28c775ee049d4daa253d8c78c2c2f77adaa869f68bf5c2b83826c181ae59b73954f131f4c3651d7ed0bb09d51f5893565574741a1c9e64394510d9c233b5128a06a76382daca3e18b778f8be8b2febfe94ed782f5baf445c41acb8a73a65ea98d8820823beac0a50afd1252a8641fcb8800c2e0694e185069929b9f8366450920591506b440b95ff6d931b818f6c8539c125a3032e493343c194fd5a506e7de9717fe8b43888d657d63bdfcee3bd19c3d021238c803899fa60d24e33b5c8263c434c44336a63a5b11713e9d748be5db1de927c7603757e127e912abd8fd42d3f9b6ddcb4ad2327462d1964cca8bbaa28ebc296a5de7746bdf516e82bf3065dc0c165457d3845258a6d819350495b2d3e3c303961eb8ff2460d9794845e5494f731c49940134a64fd5dd0a92958eb91ca13814d0c4ed78ec0004a581231438b66aa117291228abe2f585ccbf634e63516db435671f803ac3157005de9908284cf932fe373d18a8f0e0277312d5c806b4ab5f665153399fa7e1278f3d5a8eea451ed8c5d7d85fd4da9d70af5762b763caf15a1c0e7dae15779c285ceda55081391b4e35e224862593d219ec2d1835022a713958b709ccebbef3bd89e9d6111c6fe3a2e5c8d04e9485227396fe34fbacc317cb738451562f292a12ae42b106f7cccc1369990b95e5a84dad998e1c953177a40076759502d224128c2b9ea43c984ed1dfc09b6693dc2b4f1b8e399cb3dc1ceac3dbfad642a883023cea85913966618ae1648a35d4f4b292833e63449e42401fde88ccfb66100d462c9cee7ff211da2c09d26e453b499919936ee3493627ad430b2d9667016a6e94a65cc4c46a7d90235cf4a585bd552abcc841925b3b8b30b46e3cb7649c738f38228efd0747e7ebac029992b97c52654b26fd0cccae9e896c936025c1ccb9c4005ad5213ad1afcb13e97a60681bc50c0519bcf70a1c1dd77590a2b86788459a47f16a97909f78dc73770ae5de15a8364bcbc3e35b84a64e5e26d857daf71dbdfb5a55985579027e7a793593e393a33e22aa6959641305eb1227f43937b592886c52abd4eb294dfd22475b98e3a5b431ac678a2bb10f9967a02625250431087e5d13e4333f6c00add16799dd0f2943a1a68b032e7804d4ba4cdca1c2df58d927e122987c62091c633e33f5b133dda892b25ce8bfbfbb7520e77b4b6205a5cb0e79342f928f65420329477b4eb85c1d876368726573bd84d7d16c08351f793f935eb6fcc615d6d4472e7f6285f9d1727c6ef889301f3839c179a7da1159cf1ad7d3d4d576215e8152ec6fba631113dc69c03dcb95e9f8a06ea97f596dc9ce39658803a35eeda7880deda2eca4d81560dc0b80f943842fa54e81d78b2eb8285ee472368c3908e6c29a822421d6e434c8dac773a62e8237d5a99d2dff0fb1a805a08bc23bf9c737d53199a02e7f9ab6728433720fdefef05a79659f9798e8436fc634998a6bf77a0921268dec01a29e0ad821600066705cda322b0942b6a5fde571a61e0678d80ebd0908230757f6142129ac318509f59d04041249c505055e7d62698c7006d610f7572f6cb1a025124cff694152481f4a062a7435eb76759c4c8c60b0906bb8230e1addc5c45fa645e1b0543e1711ffbbec4468b207ac1ab1a20b54ff0e79a9412044469ed2fb5e1179d92e24be3dca770398f794f6f5ede03d79a7108771b1d886fa7a997b41cfddf52237610ebe1c029a8f89bb211554a488387298a3c21fb0d40c96909558920b2d0339e9ba249019ae390ffeb99b7cdab6d33a392de967400f7f024888ecbf1115b3033c948c52663a79e840bcb3cfbb1d20d631fd4ff50db0f3a745bf8a98c6edf330c72eae6f61b93ac97b93d6f55359ddaf76d3eda3906ae0e6ce2465a0818cb55ef155389602bc8e4757075e18b7269a264b321c00ef58f274f599a77127041754133c5891c58ca66c9e671e7f465a4bf7c027dd1f34182d9fb153816570f6f40e602cb2250039e5999424c738698471cde073df46a8173569c6db0076323ee137b5164db77c1a7acc560d77c9177401520fafa9413bac9e23154b274c6023399fcb301cf901099bfe0dda78f8fc8db75765d3a857e4bfc5cb79295cb13a7a8c654250f9d6cdbc7a326bc416eca002cbceb30f4529d9dc36d7ca90788174e5ff26af9a45764c0a9655f8d8dc8458c4b2af0a92d75f33a511554ad465cb3ecdfbd45eb2a5e91a2b74f51cd9983bf92bc2d32b3d4e034bab0479304e559e908305fa7add04b986404372cb39033d9a164695ddcabc884f72108b6d30239d4f8434e53527a7aa8a0c6536b86029bffb9228473df97462d41de9d5838d02f364d2240f2ff5046d4c611860c8bffecc35ba2550a2c447d14185bc09ae28bd59f2cd1969ae4d8ae010feab22a71f5dc4d3cdc5d424ef1393799ed5ba1f23e33cc93cece99bea6fb93f950b377abee6c80505f0cfd23acbaf5117fd54e5634e5bfa0a1f1208eee8dcd096706ac748005d7c64ae940dc7d72fcb849f142ca3fe936e72c84d4d521aea97dcbba3a74a099a8a8cffe0f45b52b09391413883eb161da7c38efe86989974d059c9f842a7b144f0e168349fc571ec2553d549f0de50ff478fe5ea0a24a0f106700e8f56ce22daeed89574087f7fa6b634673eb54980022c68aed03209c423a4cb53a81baec9e4b44f91bdae3006fcf61c9d661e4d9b342cb5a614a10a2d8fefd473c3ad56da07179083be44aca65bd15d999173aa933c1daa50258991f1cab2efa04cbaaa273c5584b6113f6016b8bdf79b8ce3e62fd28d540fcee28bdc640725b7ca1448d8fcb7571e30e91f5a6ba0b23fdded28858400f370178722f5fb70538ccf202e6beb26d81293227c3b651650ba9d8f2f3d61acade1fea2463b38971bae63298a6cb2ef4e84d9c8f21b2680d495cf2dae338cfcebcb3150ca238e2fa34173d5c6409bacf91eae00dc8c4a906e06f86a41ba571961e79634d0ddf4887f9f96d291e3da9aeac649266762213a347c88db941d3519249f661915bc24e82fcb0faabb0bb5ac30f83ca7f1e826e9828e7cc1bf480e710d66cdaf124e1bf8a214556ee67518131e4e7bd54527d50c3e1535cfc449e8f5a45768845093c60e9b9628c233c92bfc01747eb181a64d165776d0b22ee13418fbb1a172986b3a20a24dbe1165a637ad3e990f32a50ca8818493c062e1eb4c40a562ace5e5657cbe31424ec248815330ea675cc0a291ccdca40fcb5831a5b7fe5f2af6a52bad90ec2113d19569fdcc3ab1f045427462610610cc211b83e8cc62a3274dda7c07faecfe5a94a41686afca89513f265207470495e741b9aeae82690ea82c3c57d854766f0b825037652e87902eb676a0cff77cce229bbf0f5f9fed23aad95b55c13677ded6cf1be087137880e06bd0cf71b8ed39ea289a2329a98f48bc4c44d4c54061da9f21dbcb5776ae3bb7a4b7c0baae9ec94ece7ec8a7a8b80a19afea7da117b641964c94b9667717175754ac80d26002f3736e1482db3fc840a5da348cffe13308c22a43f4a11dcb9d0800af0b7c20d4640ec0b6cc2342af6490cf3017a6e518a198f1f2290b11ec50db7512961467c6fa9ec01e841a5b84fd1ae0abfa5e6992eff181899e142a1662e529f7a4b96c2aa121b97540aba5ef9cdd14346ad3c166c7bd18946a2fd8a2e6feea7e5238a2821dc0059b6078120b2f8cc6dfb65de819224593a4dd40cfa811a210f8073836ae4e1da694e72e342718e7dd355256323c11ba386bacc59ca502e401e3257f9c2e060ae047dcc4ab0325a6088708a6433a7fc00e2f0beb063b7578b381001a8a711a98a05dd2b591ecb05b464a073482db1fa11b49d2c68cf71825668a3ad87e2521673128cb306a815548d5e1ecbe66c0f74e426c55e1ecb0e12b48ad5e5b1a44b4280f10aea59d290e27059595e92088cd523fa2db62275624fff44773993fcd116cbde923274c58b0ab45e32c1546c034a158e6a5b30145ea503da7996d0e7ad34be5c6d5bb8cb595a4b27a6ce13003b19ce0bd01fe258834645ce122ae22511c5161d628bdcf0f801e33eb7bbde4ff37afda35e0ad72ffe8f269670e1bee17d834a7ffce22d3bc8de64cbbda54c29a5cd0683068306346421ef166a21168a21c68f6b70842ab696953f9439628c514a295329a47260be0ec373c498715877c55239b8fa67a91cecbf37dbdc5870dc8cb9c17f3e5755d908abfdb6b586bca687e8526ef69c150041507e45a66d69c2f9f29fdc04bed56ab558469eb59b80f06b3748e56b3fd3600ac71c2a9a48434b46488db33538f252fbe79459651a354e3885a8475388adc110f08f5262526ea80f3b15b4dfde533b50bf7d9cdae19f6ac76c55ffd9aafefd981fff07aa92406307744a6e668750ca47fde6eebb6973325bb1ea550c72a8e1004328575709872f0870021cb2f0828315e011c5ea2ae1d0831516ae6931238cc023acfc35e933c3a44fac4a9f137b29a7c4a4f499c9a86931238cc02b50c6cb74333191b24c37f33134326464cfbf71291c8ce2994c866518f3fa67c2180e4de09fd96233d8a20eafd96e2fc60c931ebb3119dbdd1d6bd9b1bbbdbb1ba63bef86114497c8ed5162324ab92b252633e93353aec6a1c2f82ea5e4dc93acb56024c7c86566d8cc30cf231789612d774a96f24377f795bbcdf5203d62188661f10a0cc364c4aec062160cc33029b12f24e65fb29c207ac430b98aa9ebc36b5ac76b5631468c433df699e3ac0ef73634d98732aa8e4dfe7ecaeb788b07c4f3693048bbc03630b02768ed058bfc30293b66e6f828c6e9be7df8f00192c2e19f0f12d02984da3239ce2eb2931455c8b0218a183728e151d49095e090430d798897542e7ac9e0f0030350a81728dde0440d99b5a2640316a6a2c5450e95f9aad790c3912d9d53dd38eb423ba523575653829c4471648601c81083f8d188961aa7a89186276a0cdaa1a3e1ec2a73d5abc94436654a1c894804612938e245415eb34a35b4acdcf080238c948ce0e086071021a186b0ea55cd902a90f88113c8c30fb6a042b3ba493ff052032b66c8c28a1c9470c08245d27ca6a25543a6a255b51857a8ff8186f3851c5c23d001ae1c1274d21a657cda3851a671c08fdfa790a08cfa55fd313f7bd487ab1b9c4a617ef6d9e4388e7bcfe9e7487051ae598eece79c9aa6693eab99fdcc661735962dd89666052e622b9b73c3c9d628616b74cd987b394aedd63e7b02c2809a00cdd7be0423ba757e3f4d7ae6633f7f9a842a28a002592cf505ffe2a5fac854f91a90f50522a06e7ed38b64585307f303bbc5c2d23ef38f88e6a9fce5664212babdf64a4680e021b2ad2781f918ca53f9d7333f95fcf9cbc23e55f62c60d9639f4a3ef6cb6221fbf9f3fbc1c01030f0e243abc5ca3e955c96f6bdd7f8d70196401419b1921c3c3d0a68c8454c1e1134ec22958bee927f0c8df3d3386110f971510a09aac373baaee1efd81917a7d59d3776c7766e5eed0760c188d3eddedcedd47d77fb6777f7c605c70884b8bbb179cec8cc3122f18845cfc89c25c6e8ede8e87883ab78459432fa17af702eb6a5a9dba0968d3916a4ec97de8e8ed7fc40c71b5cc5ff188966dcd238f1080c74a87119290284225b106088224e45b21079d2220376a40b1aaca06c60ca860021635ad18e6e51036ab5c56be3820a27451732c0be90a2b58ae08ea4b80a2353617e4f5061607e12a930325ca9300f238503a62b402af51bced4144d4d7d4c7d11414da5beb86a4aa9e5434dfdae004449b16d3475b3a9dbc7eda79724eaf67448ddbedbbc58aadb838db3495f0c31c56e4e0c153930e20b220b787531c4c58bae4ccd9ea8d9cf8c0b126c7183c5f12e1543610b2432cb22801a54fff954c593106d26af0ac39c161796640386618cdd4036d920a59472092c5a920829a1c54b1750aca0b224d960050d590d65862c0d01ac494fad17528d3f6fc4f5828b11473380410e929c205a22882d3ecf2cae1ae4e83a0d72185feaac68e8344eccbe307e3a4cb5205269542f6848690c61894ee188af56ab55e428c9155c38f1e2cac11169440a58b0558c5695115de934ceb2fc38c3801ad2744982290b23598a6accc2881a93862003e84ee6933927457129129465d1b8e0500336b9f81024776c119471118286a804e362c411d762cb0e2dba48cae504397486147772692207def1d4e4353bb9b84068c7109c3a224e4a337c914a32801758d440802050545da519ba0ce0896e759566d0a244b5ba4a3334e598814969062230f0efcf565d6f6babaea7daefbad5c398e83ed7908584d846ccaf8c671e388732f3f22fe77c42f40b79a96e128c2fe4275c2ca5eaf093da8c04887d3c8277016d905543a061ece91ccec2d33898098e3cb1836e6d79c2b21fa76c19f6d987e9c4784171c207c21996a19ef63bbd2bd49199b7f21ac6da6582262ac60082d228652c21b1262645998c22d98c61034f4e46f2d46234d1260a45050d5d028409456d44201ddd8004885ed24c9c4a07b93fb953739566299aaf30169723b99117c98d932104c4d0122a538e9870a9182ba80161f63c0df2c8fefb917d3c7aaef037ab071acefa537ff007e9d8c91a769e4a61fe8e6facc5afa381b6a22520e2487b47b96b8ff25ef02f3a2f1470a0d03930dfbfc5878109b30f39f662e488607edbfcd9f3ce87931f11a5edccac82f13ffcb587e1af3dc752f3b28f44f40b7a16cc47157fdd4cd7f46b2ba09d1419541745426713db3eaf4725102f3e225ea1eb6d6d6173767936085a4c4822b3f79af92808ec6f0efe52330cc3b22fdcefc06f7ce9c110eb8ed8bf2c22d4af07a3baa7ea9fb5bf393d100790e62b4b284ab08c208a96111c69ea8fd9dfb93144897bf8de434b69410d57df030dbb97122d980d70659a8ef10f7908480fb53044c92eaf0024862f08d78486eb14841fc837d72de58361c762a93868832cd4eaba2a46432ca12449c9fd8341dad81bfe06ec092ff8172f3bba55e5d780bde1da5e07ba4a4f05fff2e5cb97da5f03168c2ab8cb4f676f646dd6a921585986d2b0d3b0659f61588c40acd1b1280463be61e9004850595789071c146009edba4a3cdca0c30250578987293c18d5f07b8ba416282dedb3e4ea4a1e1ed7d5de4041c36deae17352da750f32ce32b8cfcfcf21013a122833aaf23659a0c7d688cf41a8dd3132a7a47b60d82cb4649bf99918638c3ed1fda36ec4b634616caaf2b7ce3e9084adc19f01fa518bd2b2d758d3b44c7bceb0d8621b581c32c5e2f45377b1a07c192f624af582f2851a477bf911091071282e699cf9dd854ccbf862c47c5e44bf229814d71f7b0b68b8efad103d1d373c14741a94361290e0cc1cf584f9974dcd999cc9005b835f3ec83632b7c1179996b49961a856a2cdec51dacc50dacc309436330cb54ccb0ff3a9df1ec59307745d4f4f4f4f4f4f4f99cc27e38bf18594c27ca1cdc77ddb3741d000314954326d8d661b315a557e7cb23596ee8dcb9f93d2ae7bf94bd953f9924a83724a95ccbb9bcdcfbc179c911a1c82ae8dec896d645f346a2eb6067ff1c9de7c91696fe44b25745a098c14c6bd029aa0303fe3e5c72316274eb1a07c39e38b465acc17dad0afd5cd2902a500e8ba19f12bcc179960d080c6f7efcf8be44fda715e94050909090909098983268a6addfc4c3ec641937e554013348c46ad2a3f1a21b9965e4c325b63a590b115e4394258f2a390e74496fca8240e7d2c8a4d362858edc7dffd5412908f3d0b8e7d404d7a16c85f7eaafd88b25f96fc653dfb11ed9837a605195e0bfa91f7145846c0c2753ab51ba10723f480668b369a9d95820842d0d09f78dcc96b4ad8010dbb656f1844a914e60ed8c5485cb4af255751d1f217c3021abad04e7b933b6571269dd76aa99b406f2667a55ec8012b21d085804cda096d8dd49c9476dd3fd8af55bffa1583d7c407e235d1998aa6a061bfac6c4e347a6d0dfe4e0ba5c2688a1a7f33f21c9a45a3ae24ac3cc799bc26fe9c9476dd3f08ae564c948a100410cfe9d7cbc90926323de938adb2803abfea406aa30353e3529eb3d8a1a01da0159b6c036324f6263e17f109ce4a7ddc44ddc87368c450a1fe5da917a35517fbe411f5efcf3e9992c0b252bf291eee1909fb908b7060518a28d3aa5cb492de6bf7b51d0150824d6e1ba7fa63f4f7e132fe7cb84ac21094fbc17ddcc17d5c887dfc2020e5730a07c7d40a42eac6defc622a05d48ed3e9612e770648ccc004b57db8da334002864bf5a76385d7c2b362df2f5f074f8fd4549ae6c3473e906725bc447e10b94d44aa0c2212878e704b57ba90daccbc165a537056290456aafc1b8db33ea8f25dd8c1098b949ec2812282c68a83bd0c8e2ca502f6330d764464fe3958056eb509c12a69c815133190f27584a046d91648849478108251015d25212521185816ba94e2b81e68ff2a0931a9d8af6f18c6428da3d2fe3114e771d8dca67c2e224a3db37e98c5bd4c0ac7fc28edbec33e1b50b56a50feb2745637b06f6713e1075a7fa0d8739dcf2d240d2a69500a3528352bf46bc8462b603a66a6d0551212aad86fbcc92859888d3c466a50be00aa501551ea97c53dcae3e9d1625640e3b1044d793dbc463ee7f98842c36daa12ca12757e412410277655f9233f062168b84ffb1d7d7808fb9529283666a6d99b1eb21f7d4e4add6d36a45bb338dcddbf0f40b32bd95a93d2676262626abd8c3c92e80ae1fcffff9f3c74f0c0e44f791a696664907037604c1d9fe051860e51c60892cd33e3d91926a349a49991e1646a68e641c9b0e2bb86a780523495d93c681f3a7662f849229c4f413334b403ddb523c4483bce42317ef3056f194e345c97cf8ecbe572b9a490cf8da741973b0d6e41c3e9e2a01df6666f76d9fc4960760d13dbb922ac18f4536d1f4f8ca7458f025ac40202e35371d1def4c3c0dc97d0033ae39391c105c5d88a3e1e0eaa28d58e50fbed53ede0df9e5f48155277baeba672506fcbc2c9c582f196a5793cd4200a6c834bb027f433d1fcb888461ba59a4341d3aa54f854fecc04658287ca5f68233343433a8310ff1ef9df4f93fd7afce3f7f32384a948912d32d4a7715a1c0edebdc0daa06117b64610ae2964ebc2deecd3b08d0bec09fbfb855bc57ef1eb582816317fa78f7eaacf1f3e5ba54a75ff1117ebae52e5a8ca67cfbe3b85a3b32cee0fecb97e347aae8ee8578e4a49daf863588f9f3f9583ab0f4c642a476318b61206dd1b8975330deeeeeeee763b4de7d90467409b06411bcf46468ee338ce9b7783a1eae158f2632592df0f0858d46b38994a01e3662a076bac699a37350fb5715b2a7aa738b5198cf0054fe3540ecea3810395ca81550e47f584ea0ed55d9f7dbdbe70a91c5db9bd49e5f0caed8d4771c0487130606052746fd893c1d1e58895c66c31a8989898182d26262666c6c46431588c8c311ed3311c7302bfd8c50cf38446514336e2a1d496cd07206088edb3623cab8028a80ba7a7713819266e18b8f2689c6f4229527f884151a4d07c94204f9e2821c5b69cb9a0092b4840b97b70c5513061b27df49db3bbce93a06d65a3fb1d25879928534cf041fb2c15666ef6d2ddfbab06757a1ba73b7e389d7a7737b66f9ba0057dbd48e04e9d3a75ead4977a0f9c301a5a52d42038a345431eda6716d72747c4a7c9556471c2a589cb15c58997902926f880fa2c158ef254c3a74bd35788c0fbeb4a297d77e3faee7e3dfb294a09ba27ed966977386b0e58e065e7c60c1d68b82e1d3a74789d0e28ee2e82b8bbbbbb5f5ca675ce3f7ae156d9dd940b3c4629dbc4141d9d0f596989a61a3e85120528dddddd1d73772cce06fdf7c6bb2c8d954d83fbdd206f3bb3733132d6e43b8e8a7083b92ba0fc73ce39a70735f161cb8a4667db2fbf95ced3689075a46c273c8912585c477614bfbb45a8abe4a40b126c9c34dc3e3831738f06f97d70f5f1e17e0f1f3e5cd0d91b7eae09ede183db6edab4695d274772024ce5e70f003f9290cd86ab2c450a17b91e9888a0438cbcb8ffc18ccf04e59e8d836dd7e5f4fef7864a7bd8a250d73d46667e0c8b8286ab1d5f89c2737431f624185058517612d0fdd5f2036b4728818222e2729520690853e4c95a8aa281aeb866239818824a08945c69024915282aa65eb3cfde8c42775775f7bb068ba06b43164e51fc553d9fe09947d2753c14c5a1788009e7c46c2b3498f1a8c094ca39ee72a171f6092447955f5d7a340eadccad2a4f20d95243bea18519ba204de1691c6e41e5dff53929f51b0d12cd5fc5b430c405f2573ea2418dd3534087a2108edc5d623724e6ee2ee5638ca57030f67247e28e64ce22a8ff7f838d6152a83f867dc488e66373ce1857f06a7a31755d47b4f1f4c47f148ac79c3c3c5e3d0db644794124cfc67ddb1666af6def1e797ad9164476332fc398962512ebe1c2d7e8f9e8ae9bf3eb71a3c5850665d6c37d9cab2138d3a0fc3ace5eca28d4ff553bfcb3cf9a48fbe8691a57d983cb85246bec065b92b610996982020a8dd31f3d09e5e6666460cd38a9410d6d666823115aad5641336040436e794f31826469fe6ab55aedcdaaae68cc0f5ce980ab07e90c82814fc4cb781a3df6b71f44dd403f05ada599a56e0a0dbb89441123468e8a1c0d79e9ffd93ec8d6e0efe7c0720ed0a2096d203e9e0f8fc70edbe8a0da3bd9cf148e2835ef9be1ec695a8a086ac842362d90866090bd41816d70604fe86f4d0b7a544316a2c12d579cdc9091274f505f3c61c26408131f5e0d2ecc0be8d72a3289155ee136c5cdc1beae03f766569bc69993c77baffb81c61ccf1e11f68bbd7fcd7a57b520e857285f549957a50d7612342b92e4430d509200a19ad0cb01326308fd979ca67d7326314b46d33c63b5d7467be34e360b1115435328b122d4519efc3d07e6b51ffddb6bbfed0dba7dabd0bf793d1af427a18924a954654b65a52a5dbad544b0df9e7a305ebb521e6aa2e69ca86ddb8c3a339a935277327ad0c948a7ce18427b66764e7376dd3f08ae56298f480af56d3427a55df7afad3414aa7bd25ce9289bb398b795ea0d45f57602c6f64e1fc6c873603c877eeb35309e4e08528db37d1e6e40088c944783609bf6dded2814aa67f6bd4429c95dbaa687e74c963b35e8de46d597696ffadd488605fdfcdb8c21df0f9056cb63f3c72bbc6373de6b74f0146b65bef6bc537fec07c16ac45e9b3888b26d93d8172e5663cc767fdf3518d03ae3ea5cd1073dcca3c10e2af47ba401bf0f08743ffcb8bfa908ec77e353edf874b8c2d54cbc22290906f47f65a48c0da5734257980ebf12164b4cc2201ec64fa741ef874c413ea603f641bc4af9d9476fbf5583197ff9f2e54b10af1c0601f9e964afe3ada47f343a67fe8d95ce8e4605c90674ca84fcdd395b4d7ff71678b6c68ceacf23dc205477ff95e76c1f2b995f94b287c7c7f341a1fd27a8d28b51a5b74b489654e96d7553bb37b2ab52feacf263ca5ddce3c6dcf3afb6c68ccaafb33524144e705f0cdbb75e83fa580814a2a4fee8f7d98c6be6bf59669dab95484a438ab817b2f5fc0889939b3b78da41465da52737d84149294992ec411ba4f7424370b9719669869716297a9c148df3ae55f73abc867f7d76097c2574a7174e15fc4b5d50872ff9cb2964ca2ed5ddddf1812f35fc69d5fdb80abae8d75daa1493d1578809932f5f5adedddddd9ff6a8466d956e8f8d5a4dfbeeb92f1eca300c23e6a373c2501a44560d45436b9e0685a0daf7a980a23e5c0939aa3fb42851da2729d79e5909b51feb2fd4deb5cdb25578f36db291826a2d8b14b8fa2f14285d52529ea4a43cd12289249ee8d2c4d2d258c9501aee2bba0e349c759bb33f206ba571c23929dd710ffc81f21361cfafcad1771f6c20e857a41454f9cde840c30eabc293199c407a6bcca8b1f6f311b5e75c7d50fa7df40616e7c7829da385ac038a66a95dcd7c41ff8e42b9621f0cf10b7d364b8dcf9a4fa4b1eb86b74383d0b75016640213c8c8ec1eb19732945232b38c531e716c7759d37380809a00654f81eca380fcaa3032fae7de70f4ecb47f2b30b30068a0fb11e8df0f05546a0876529c862a55765f3c7834b83c1adce769707757fe569b06b7f31aafd9d75e40bfbf705d2b2846825acccc2c9955df2da9115d59798286da5f1bb1f7d0f323a4e74748ef7e1c04ef0a614dec8b086145212cd5673df1e5f7133beff66e2a5c5b2af69bc4e54a9dbfbf836b2583515ad92589b667ec53fdf601a558d83ef5a90f889b5fa722807d60830cce5feda7170aa9a1f6a86deaeaeeee0b3f2108e67ae033f13fb29fff237b08ec6826557e33a9f2db3ef3683a677b17ba66f6d042c37dcd6c57270e7a784a32425d2514e4b0bcdb02ca7533b804e599066bd720af409edf1f00196cc006a7084f34039bd3c2fad81a5cf931b038d10651962455dea6ba5d2a7f0536c747f658d095e734c19e2bf77eac2d53d897419ca05ca5122ace2dd719f639b22f7bc9adfcdc23f27cba867b40df091535d4910197989d6de1bdd2c44e287f051a87824ddc6ecb8f908406a8fda1571b209f90f168b0f7b5e2b1e113da3d1a0dead8b08d04ec09fd08c09e5731a0a83a27a5fc3d8f5461bfac9edec67e56ece3b9c1b59253583e494a8202a5698b1042114350ba326504fdbbbbaca40b13264aaa50a7d6feb033298defef1f90d7ac8a05195f7ecbda9517d2ee419d9d16dd8dceb4caa2a32d550175a13852523718fe905570a4a4822e5e18cc0b6630fe19ce9959b675f78f20723d7cecb7e6b01f52ca7010ab7f22848c0f50647c80a2a4944489a5244bfe5c8f80c2748416a10a0ae84f038b653f9ffd1f3e8ba5fafbecfba781c552fb53450985727f74f78695800285092682824aa8abb484117fc1822d4f9858efa44b19dd37c77f7fd0cdd05ed6c90cea1ae999f891e5ade195df8ddce539f15f04959f1da9b22fb514d82f5569d506d45daa61a8ee60e4853f7b8b880921a0404dfa81e2cf0f9bc90b1afafcecbde51ee439254041819af4641f1f0828eb57f64c2a16a26abf9f263dd8c7e79ef8fdfc3451f1c49fc0b2a2b601c58f5bcf3df60179150bfef1e30784bdefa77e59d293f1531fd0fc38bf75a075e2b2f1901050931eedb1073202d23e36f21a1ed201ea63232ed8a7da4f4581f9d8f764af7d3f4df6b517c2eaaf67fea878522f84c57d13150f50931ed473a5c04f10b3b09f8159d803a154fbc1d0335ffb7e7a780dff0496e5e3e535ec427db84da9cfc96bb2af5b5e93cd07dabe16c21ea5f1872d5419fb80fce7a7daeccb1e7b1632ec81e4671f0b1890d7ecd74b610fa528e0ef4abc865b3ee42da45ef29ceea55e1687def21a969605fd1a7aab72f7521f35c84b6dd420ff26a49b0a4d71bd76f77f47c78d0697bf30e2a8fa57c6f622e8462d647e75ec34b87fa5f2f7f2224992224746a4808179b98290b06dc9d6d86609d6060a3bbf79a8a75e5f714531c462c2a47154dc6fddfe432ec291eacd9be12f64241aff16c2c9698855a4c4941a32d2875cc4b193cd0940d3efa618bf947ecca7da3ee637a0dba8440ff6243154340300000aa314000020100c064422b150389e29d2247b14000a73864c805234944643591224318c428818420c308400600c101a1ada2600cfb45151019851a3f4ca9642e3cbc9e9e230c410bddca5922151eb6290133dc8040710390dfa9d5f2ee64468b80d7bbbf9b50c6a5f8db9db7bc1bcdb5b99a8ab1417d21efb8839dd7eef530afce31d0b0d48aba7fd31c98afc201dd4ad87cf68586ae87da0b73c0051f036bce1c9f10bb9d9ca75d0a548cfc2f04b21e143bb30cbabc158702965b9984b789d054b0fe099a6802f25f61e62abbcaea765bbdc3e6cbcc26b135de1d173f2bf57e8fc0fd30dfe28c902297d465cd2c6071cc1711a58b54da2af8dcd35eff98c8983a40eba74339db4b835795e46ed6de5bf7680a20161c46f356cd46ec6ace0e307005ee094ef35939c959e05e7502ed346a00d948eb664b84ea0fd76602d2c4df7c0c0e85432409a2e4ff07d3efac79862deae4ae6633d0f8980bedf9e1d6d4f3f185b9bec6e75b0a20ac2292149b94301ff592d1152560019f0896466a9bc403f9a3a599624420d5414ebcbb4642be8297680a4394efa251dbb909bfb856a465519e302c1d58c73c26f1cd072508acb8e4f6c0de5976b654bc022c0bf059154ec50115f6a43a7fe5d5c351cc885a1c8a568492fc6688f56678ff62d926b0cd78a9db13e0437b320f81ae1533d5d9f233600ba074ebb18800db48727f031e718641a090c8c3051827e9e649f29567b897d1d03dbb5b1bda355624c9becb19a793a07af76844b36b903f3eed7d13bc65189837eb28f5a6ff06a5ae00af533206d9a0b10e636db6ea0df0585da3706480490c8821838ff5b65cac4af862f75ab69fb17df951268f7ace8eca935978cab224883c18b96d60c48f77c51cbd60b0d162becee62040fe7e8f281813cd569aee986fa4a2abdcd66322ea8891ed04b10f5ace5e7bdad198ddafd2634dac9fcbd12c25e01de377a1280ad60b6d78717668c492518025b6363f5666e28537bc547ce8f0b61814684452c48ad1b77e60a60f81578d9710730185fcd868486b2977a5b38bab058db322207ff6c23a064ce0472356f9fb72e5d0769ce2d49b3690636f2adb9e9937e03fbeef0207049a13003c28153d0762e5eb25e380af784f8966daf63e9870d52d2787c02fac858b4c47d6105379ae144801d963e187d1cddfca6730e8bdc4a816e28752552286f7d182c57429cfdc376ef3d673a9e8e43080a275dba9512541f6c2c8bdb9bc08e030479e366609660917d9dc516f60c1694faba7be3b49eed38f89322139d6bbf14204b46ed3c8c0477000be3d3e3a8529c1983019e5b87b7362baee849a4e7bc9e5798c2979f3909288113db26d78ad91258c30585b7fd390efa1a9ae0ca5af938e648e1a06021a961ea51a796e5c29a0eda16a72c8b298aad7af5badfb3dba5fd94f5da8ee00ea751e8675a6180e552e03d9f01cd087876a7bcaa3266fc40f652ff305dc5cb87b22b7f6f32c7d0a69ed5d56baf6924935c72733ec42e7a5342072a5e0c7977645060151b4ebf484ef608807c17baae0cce493f20bd65f20f3d00cd5857f5584a05863760897937d0b04f8ea5d85cf263fe26341e0d0896fcd69d58dbb6ff00514d4cb0ad7cdeaa005bde134efe0862e7ae15dfab73e63d81905206e6363ba1a3475e15bc721bc90e92568481d88b641266488435d6d3dde216eed4fdf199359e04c5ae0dbdf5c3a50de72f2f452cba382b003b584abaab53659757b51f6ccebe345a9ee57ac148f806c0f7a4b386e32a765651a45d14b7405708a8d8c7114db2b1e13cca7e9ed21d465256c6c1a6d0143bbdb3600287fac95b9d13b4cc504ab3e4e5d97d5fd028ae8a92557592f2012afe7990db1b9ee1bca96ede4d3c4bbdec8c979ce08569112729833c93d108d91b7e0212ff9f2e484f03d297edf234fbb4f1833a5628b9a1add0ce938bf5b50b1399b8341c17ef00520c6a10bcdb878826bac303a286e00be168961dcc83115f5d1eff3521c85569ea590cb4da5eff5c2ccff80546487f15e8d6dedf2a81c60aa8e103466dc75bf52c691f731dbbeb9044ffe12da857b36d23007136e7b24f1d3db28db579c0470ca200692ac2a3bbb79abf16aa53d97c3d4b2dcff097bf68563d9dd21be546e641da3c60689db8417fa5fc6aead8d4484fea1c55ab3a2b24b851752fcd4e74ce7473d036ef03a3df503c2947de0983e82648e7c9685b37f8d246ec786157689df0362f91b6887737efb7f4acea4707cae198add6e9e176aae46c956fd416bdf44e8d4ef0c1415bd8e305e8c3b52603186061dac74f078d86f0cefad81b6524dc9e89cde71bcf73ad0db24c805349958a17922452adefce8cdddaa0eb1f553b006e6d8825a41760241c8f45e6805cf5aebb45000187fc99f2c91879aedafd7a8eaeab9db19ae57a65fb9ace508b8253a279d96fdd3dfdcc9ddfa85e0a7fb57112417d9e741625f337ce2a6569362e8f87e159952ccf799783c830d5199443e66c30e0fc95acb1b431a30ae451a56c94e98039899d9f2ea24598cc7b3f6d363a5b6248425be3c213165574a24b8c867a3dc4b43643410a826568a0e1891131b22f42006136368ad666e5d429a28e46473f157e98374559d29223b4a5314c4072e1a8b0080c1c1073a484f09504e8f30264ab5c5c1edc05d8e2f9fbcd4b86be5b6774dbf3bf3c10c51705cde0ccfe45f19c056288801e5768da31fb4d112fb4a0a827164d33526bad5c4a38d966731f36d792f3636c50267a092c5f52150b665896f1941f2d2a6aea15033805ea2465fafdfa94d2450d4acfb45e6c91bc48c2807b50da164cca7d848e8211656ab39d15febff3678c214ae11201b4beb9ae8b5f075b4e17a0b08f1ecef2dc53624743e20eaf33da156f216532f64a4dfda7e2f98be5241c96426e9a4dfc500dce2f202e276d59ed82002528555407d9a8b216d7db0e4c79621cc76579e6cc7ac2e8ddbdf2c1aaf8f263f0002b0410a50cdda8eaee3fe413c1d5ff6c8b55666e6de9947c21b952d650f112abb16af715c9b3525a59415724ac4fd808fdef64de05d91f43a10a36da60d2e847e3694f82686c174a00c84de0207f9ba02d20b1e73dd60fd645372245041c0be35f37a46cc77b83240f882950a6912e1be9de86b355c99d87d880cbeea3426c06ec937927c65f4edf5ed52dc224a3d280714ecb67490569c92db668bb78c7ce42e41e16f28089611362e5ae459d1f105d11947dee239fcc91350de0e42946e0f202308a80445749decebaa4a7c13f634acf318b3b0a74327ef2f7890a40162969c29ed09152804966498ada0e7cc6c2d3c6345647c6f8ec41093c7e30b0022ae3111e80efeae238fd5eb426c3c2cf35f81fcf370fb93155754fe8763d7d32880ce330beefeacc904feb219491e1845e96a950e2523a9e6f5229aa90132d071b8b1e9cba1e29d56fdaca15c0b940731a31176ffcf6f9c3ace50877b5f3e2eead764a2b447442af776799df1092c83f7bf9b561783321e18ff9c82fa043b7067a06a1a7cbeb3a534bf9424a8cd89ebfd375ddab26c0a932800dd0000d53d4ccafc649d8ebcce4a54fad78fbed1f4616ca5b16100def77b8107b14ab05fcfac65f23d81abd3e9a2ce180e3c10bf60352d6b1b460857c52c3210baee9715b94b39ecd3c97e95f5e3dd2d7babb1e6c4eec7fed7c6fa55d5c8b5d615314ef9e36c6c34427e5a7e8fafbc99343030489ba20af84c7c3fae2cff247a234afa1f9592ded8203578b1f80eff5c3a07be6d3c0a94131fb4c10571c8379d0d422eb743a993848abd36accd3ed0629e262279b3950f20061cf3d99d8afb7c0918cf1a045cbb793b1608205c52ab32cb6a89361319f3bbd6b1fb330595552ae19954b7fca5433bc9e413ef398e41ac00e08c220f8b58eea709e4b90f8829b4287a2c770dedff1278a6ec97d1900e3c3e84e35db91841e11c3693f44e867f51c2188968a1a79d24aa8e41ea4ec0b9e6c9080922e1b75d8d3f00dd21cb468cc23204180659cfe07812fa7b171800367e00fae60590120ffba117dbaff94556f5f7dbdf5fd126e3cb1fef00c8893c4f60138f6863fc4278f089e247add297f86dcf4aa5fb0156196639901e183074eda75efe1c40b5a87f289f2e6a21c6213a8083369a1f835b74d6c8741eff024e7f1852c0ed554881327236c7b04e18d495a8e99cb22289207518d8d36e1b0f98522f4b376f0b30cdb1bb326f77ebd949bf354d052a1e52dabb3d0846d2f12ec85e44b32afdc50b8ef43e4661ee4f8189009517b98033f8fba3e58155fa77605fef0a0a04d5ae9224236d0c5228c695a48a67eb09d0c5a998bd281da0115c50d438f19331b42e51210506418e64064d11d10700c5bf87aed1e270e2b65052e98ddb6caa101c20b1a9f57c880435a6cf0a3ffea5c83694f2bdf6caf32e183a2b344ed92d9a54fbbc2d605a78edbc3bfa02b57da010fd9725b69f3863d0a28fa9f17ae66acfe5240d072e48bef1426f375c6d6875d0ce3c044eec0daf61dcab54aa04cd44f97fba40d4d88f30ccd08f26d24db57050c640687a9a199ccb1c2fe058325a4b9b43b3860c6abb49a6f85d4f6751f25fde8eef2241c31844c4bc36a2fa1f3e5867929f37684c1d14abf247ff53b1edc8507c0ff76464b68db3c12c3b5889fcfec2a47d0a35185a9615f8c8be63c95a7aff06f8f3318e5a2141746d8d41363251c386f09f4daa7a391f2e4c1a82583f4cbc73e9d5de5271786e73b2e277bb63d4a27633c902c7810eca6c2db134463b2ef38b21749c708e2d949157d97a645b792db50f23e0969064bba67dcb2ceb7d5aae4dbd60aa3097d979d361341146a7d343b42e51dbbebaa4eadbc21ce0f2815097cb0508c9e3ed6d8fb692d466bfc1edf1b2758e11f00acb397041d9f910aa401c476738145d8e2da15821c87acc3d95589fd293beca5bb9fcd1eea4cbec0db7de335e5fb5249b89a1688d9c40dd884bda315a1e55bfcc5bfb9370a17476765596d25dda2f889b8bc66868d209fc8638e415f0cada750ea232c6a793aa64e38c0d49a7412fe9948f31f867a0e98c026ba719eecd328b73c1f954f0b63085971cc1823be1ef9148c41c38777fa21b1ed374064aac6778a8a9e3dab4755928af5025237ff98b89661366bd702e2f70be7d67a4608828d86154271f9349b02751e0030a4711abdb4799d80bc9b34527baa6a58de8a1bff5e7fcbb71c505560c6e70bcf5c58642045794b7e85fccf924caf469f2e83dbd4dce90588ead3606c12afd46c1b6587ac8aecef66136370eaac6fbf9142d344448c9fa7f29a44320d8f3655847c06feef6d65a2a26bdc25cb2081eb7f98bb3f9feab89c6bee2c457c315e5d4b0c80c5e94b94ce295a31990d6a18b9b4fa550c82f1490a437ce3c90f3ddaca51e892411f7a4eb3648cd332b2f81a68b7a60a87879997d748887d5dd3a6a6578a98e8bc3eeb78b9e40544a4dfbbe2903ec7bc879f51b00e33e5b59defa5adc3aa39e668aadfc08b42daa5209dab4b9dba5d98c6a3f12e00a3c5b455d1506e110050a15f135e06790fb49cc5259a9eb616e600c4d27a279d6ec272f4b73b5a4f8165c2350523a1e0aa69ffff57e54147216c7ee780a0072513c430a29a1ec5ca7cf4ebb8e4595162380a0f77861316828ca47374cd61e3393b36e40f7c9e5111ac710ccf0bd6b0815061820adee301768752f0a759cb219343416fabc042357fd143dda81774a865dba41904349eda712121c5ded7ef5fcd131952c3d016775cb5b61593625aba23d041568d31cc7d4132f8fd644770a4a5fc9deb28d073f225a8ee7534701ba3d240c7a6605cbfd8155b27fc6799a4e1239e29cf110db55ce5e20b38c33b3adb49987dac8a5b877f7d067cbf721d7073879347270a528733971e87ef318d3386de7a77a87a212648f2fd6778de2988508bd9f4f2d99ef9a3f461229aa1d3aeb46581ec0f2ffe2ceb08878dd9c599a5b25fd13a57e698c332135f3707b5b9d64a0da08eae159bc9d605b683f6802bcfef7fab771cad584cae63fdbf9521db0e066432d8e7f17685e5f6fe92abe10fdde2151d0d2321c2a8148d10ff4138f63fb9b1c862c5f2afa6221472d14db06f9770028c9007c426e18658c24f6f4cbd06fbd1a5182c920c6cc4a2a2631fa4ddabd21e786ccb3215e87f24dc2c3159c693afca6416cb3168fb200029b728a23549635c8a8943b69ea89a113f57a448ac548c1dfbc747c8b75d888451a660a47e1c9278fbc5dbab6e843918d788c66ec634af895925d9522e9a060463197d5d80613841827bcc22d714c8643ddd12991da40d766314511d420743b59187815e1b06e63caacb6f673a944b781ae9d95cce0a684611d70e86428c421fa6134e00efab882b4e6e468b2018f6d59be986a198225ad01d20ae21a42d6006f5cd7ae06f67edd443201c274e99e0099bbc47c022ba01c6d8969872a5183c58397558e008ada6ee4ea3e4b80d9285eb390111fbd2a773d5e487d08a0748b5848240edae13de2db1dd3f0a7d01d8a962217a92003db2046e706ad27962f9f8fbc141aef1caaad7de40778b8b757bca3c4d340befdd50aed43b7ac2e1613bb337982884b47f75ba9ea8fdcb1968f939b2ab90f8ddedbbe17d3f345dca2921695425eba9d61b48702f17395e32d24263299ea9a35de8c49fd6796ce5342f1a2d26300d90dc789e3679f4109e7d0fa9963be5cb048786ff5559c5596e040290f1eb6ad1f4df3f93a01dbcf4855514919c2cfb174cc4f03a1aa3dc2a1dede485b16ac3a9749b9420761dd2d70ceaf04f92daff4be6f03834cc0eff37b38177a171804000d5573e2b4ce5998fb296070879f9f4571e61c2ed78598559c5b217c3c7866ce52e5998655c679f43ecfbcd055ac48a81af2ba7d151d295eeb933caa58c9f508c9f86ed675ba20b5cc9e7352208f939a103ca2f164e658dd01fcca7524e5e963ec9ae2517be1f69ba3ccbe8df1f65e565197ff9552f1428b0ee1445f01177f28af03ca6f3434c120f04154990a0f91f1090e9a323f0bae498b91dca3f14eeca78f210d96303343ef4235037418a9f7fdd72cccfe850a6e4c47ca23e4eeb9b6cee1f83647781cce9277b4f41dc6b7793e2b27c4c8c186688da8d4ee1f81f44245a10577440406ed496edfb96ca23c636f75489334a81ea58c438270d60dc8b61b5fa2f0dc756fe9593e623bfcb8ccd5516c906f9672c51cd31cc452606ac662ac1fe2d65c18798f40895d1016b98bad17745099d8645c16016153c11673d1cc2d05d083b08061e66a5a25ca6c07bf782200aa82f36d6e282f4d6bb036938e819df0247060f27a08e80b0fb048c7aea39ef25874af96b7cca606731d2315ef4ffae78280016124b092bf0e00c6d94c98ffc9a9ee11b02bfa403c2a9896375a501464eefe342d519541cb33d807b0ac8036d5f6ccf85f09cd8f79ade7570b7bce9641edd35654c38c3cec3b67022c40152d6d00e8d340025f95bd64b0132ab2925c7929cc692b5fec458a2fdc3817b24876958cfcac8cd4d3afcf79de99652ae9719763e3c4ca6947711581a25062f8bab47dfc0b20c171db507f67df9a22f28ac5ef24552535891fe7fbea4ef15242b2c4ef31df3494dcd720c088bd2cca466198a44f03c2f4dcd9a782b3434cb044e5aaa0f7512ef3dd32d9537e098b55dd33c18de4f24f73f7af927bba3c7915e1fc93a38a5b9f9e993c1c9a17b257b86bf3077a547bdc40fc9474384b0b50d912523add5ecb54ab1fc1e48b7154a381f5203b700616d3a34796103d0c49eaa2864ec9e4b7203bb0a3a100bba733d18e1155619b09619ce756db14e6384d23c2b4764a401285b2cf1bfb32888a1077d0de9f047a9cad26f6fdda22c65b947c521f247367586ba46ce3a5c1ca6091c677e56a5e0b9af919179a6cf9366722dc779ad4458d5adf40f6f0671a3f78d54a2631a6abaa489f9603a82f4b31bf70738f1e64bace59ceae66640f46b6e3f25dc051177594cddb84063883d6c6e3ab2aa3e2f5bddb894a16b25c95970a630e6f2fe42b5c1f11901273876310693ca6e19ed77602a3842f1b2069c01bcb13b16ed80d0342bf3de0b05662dcd10da1f5092a38c5894639a0db6a0e62058b00c53abd56811f7cecf3927fbaac1804853a478ee0d1b52121110e52ab8f2ba79771c864de8a3526f5430ba4ee8decdb81d60bdea0181b56d91a6ffbbb4bf0442f1926b3e8e1e15e71005e8f1a20e27e35ea76cc162497604dfd9d0ed3b542ba8ead33dcd7b830e3ce1b12fd1f0353f1f45eea6d62a423502b9b364ffa6b92dc05bfd3ab1e0deaa79a2e42ecffc9d57647f1f3e01ff4a3a7499f8d863ec7a0593a0ea4d94efdfc5fbc38c996df201f174f0b32ff6e8af22446eb9c2002d4a7b30ac8c6c5d77052bba7ca078af639a39f8a470870e57bacdf51018363cff4233633e5490930d98ae9471750e915d0a456e7f60a3f6c646933333c5eec11aa345457c8517bbd13acadd4bc2773c03ec7652e80425c68e8ab97a357ee35312ed0474bdb5a1539cb22d8e10a87c70eefd8b9f26994e8b3a14fadf39450459e4ad2136e58c5bdd44a861db1d8892c10e1523774f8321dca50264f6fb5fc4578418546975e68332dc42d884e5965be52bc45272020dde40fa65a0f67add422dd70d25d3ed54a14c5618b7ad30beaeaf6d54b9cc6631ba176a3e7ae4c6d4f70a8e92f2b40493da63b7c37a98861d90f29a462a30f5e2c4a7ab9699b0d104b1aa8279e87831e51ee3bfafc1d3358cb9ea7e3694269954ec3e8705d42703d664722059c47c1bf837894ed15e247e23dd745e3d8397cb728204482bdb5c614de4692adef7110af2958dde7144e0d5fa696fed12354895d931765794e2e4c16eb89b5b2265444bd152914f62cea7c9330dcb37f9a0e32aa0a9ff651562924fee39bc24eef1e5189f7bf3efb3fa6ff27c0009890f2db33c298a22c0cf419e576a058afefc0a8fb3f9078cf344c58f8b063a683f833d2d2fbb057f0982b88a87d2b3155cc32223d1893dda8a207f46777e33bae1f58b6973325fb613fe57e8001bff08f219cdb20a9314de5bbea6225b1e781aaf796cef47c3e826c414ca71f0f85da08b7fdce7fcd7613823103f6a17f4a38a87e144163fd8aa5bfb6230ee684210bd70f3867ee4154505b74f00c62aba397d81e42bb492dbbe697de556dd1d33df7de63ad51e02ef888121854a850f93d9a222629591e19ffe309bdb1b9b9fd3eb25dc1df0e8491c19cd6ff40f2b2da332896c368eaaf581c83e8bffbe8416c86c6a6c34de30966865e927895d4b46b931f826cc11b94828737435dafa4f9558dd97b6fb0dbdeb7b71397c106de0b04edc022cf3dafde623e9f5481a6b7502697268fd49fbaa4fdce873991b553d36616614ad0a0ed37805522e4af6a952c397cb54294f4480fd3a06655c15d88f1f8c2612bc696f874a128f4ff25468d726ece0a80468e08a2bb16f9ec681365690b7461db8ffb4445adddfe973b19bad28fef28d812069e3c9a07c36698ac665c9a4f77c57fb7670f9279a8b6fb030739b53fadd4622d9323fe0254f06bb74c23982b0e2525db8b8d0a370cbb062570a2aa64c15210ba0bf5a19052dcb86ec6cd2936e927a013a45fb6914a3318c59041ef1d5ac6aa08b39c0d5bfb5cbc28ac0e7da844b0ccf03db957900f1952c60ccb413f53d801c15bec5d7678fc9f496bbf36cd20cd8068dba111307d93428b1ce410b3e2cdfdf5493d43a0b3a6881b0ee411a0b16e3a4e65350cdbbec972903ef25d18c8470b3b594044766593d887b211aebff1cfe9e2f022a56ec4fd6573a04938c9cc554569f3e8e8d391a8defc44bb3098a63dcc9595f43d73da9e0f41554fc9d7ddc23f1ca6bdfc60cd411ba7d8bc2c4ad05beb66e6eac530df71d59287b7ab247e52d74d27a61ce98a4aed40ade9eaafdc282a8e967e24043f299b5ef2705b5ca5c1b34707c75976d2b0a18b785b3388f8b6ca340a7d3d8a5f7ca1e40e7a370d48066eb8a0a36ec4fd854aabe6bdc8f7431bf22cf31fdc79192a4003ef0bf40c2c3f4bea46609293d7b0e3eb8065a5d3cef62c4dcf053f12c1a857e65bd9458605bbaf99a93b9d987accd003841a32cb60351735979967cfade3c2a8a69aea7e9a0788b2e779272ce4e359d2e5359086f79aa56417b722f375b3477af4d2fa2df811a15ca84e2a2bb0445a452e70df980a8746d658a442415ade9985ee34159d30fbe95817cd58b9b27c87a077b011e5e8b68602533556d20e4d9d057a46a697d79882911c99949fb1d659f521dc3263bcf4453dab3ff94c7d8b12bd81d17e22a144ddfa6b250d6efd11fc906b511fb5541083bff7c71929575ecd4d830a8eebf03a136ece40351c6b89c2ad14dd6413031c7ec8c5407604f4c3821b032b280914ee9be88a57ca953ba77e3c83884e912425ad2d8a15a73b8307a72e696634bfc6b74c8da6498bc9153e8aa15383694d045f325b0765c1ab48ee88558366e18d46010a3bfd5d7595f9944e2e0f39b2e02a2190069f3396bc04d66ea8ee1aa719047a175048150cc4ed6b8745d147f1b6dd266e896c5ea1e93b357087837864f3e88fdc98d4ece64b14a19736483e664f945cb0e38eaf0cb50af122620833064ff7fb307b6f06a494eb6056b4ab3ab84dd8698672deb25c390b0171d19ee6623e4f47b0a9e64b8e36fb3b1abc2210fdba6f3c94138f66720a85be5e025eeacfcb80d75eaa9918bbebd914f998b9c3ef581b465445cec8541b96ec4d9299156730a0bca221fb38421ad31a90bdee4b4a215fe8171f531900830a7209a245b3a6b8d02854410b06289263718fc6d08a492ee5b6a506985ed8138b7e00000c6f4b7ded35e6fcea4f614b8916161a588355a063061c242c0a5cac779cf927a3f88ded44efd55f142eb8be316649e3b7fdb029a23d638abb0f68358877423c6caed110e57a76a051c287f51b87000acad0344270991de63991ab3ade4738ecdf6bbf48eac914086397b7032f61f483d83f535ec19a4e4a5eb3bf6dcd1efc4ac50de291e9a8d2d3f99f6b812b855ef641ad9ac86a9ac6336929de869c9ca0b6e2bbccd1204dbcdbc8dfa470f4742d783a92513f4a0cfd22731ef3b0afd14fbf05b5329be949ee4e3fd5d76c59b5804127cc1ef2c7ddeba106b33858f2f62305dc5b75951c395f3bf0f1cd4d54251db70a39fc6b631065f70d83454f6b5517ea49055b491cb0ca561b16d0ad241057f02007426e8148d9d4669cc47f38e1948816e8457152d3b59a74b315772f5a11ae842ecd978b150c20f336f6226bf0367513ac98201ba2465b9e4745740f3e46a920a75cc052b69d0d41a42c46695c76210d748f57e889dd77c0706ccb7d629a946a12c7c21d560b273618333411114ac4e933bae43c063e86672463710b8b57b155f96b2a8fe0b7614e0f6cc8bc9d76a268328a94b5afdfd134d42c35e6e35c506cf7fecd518e311063c929cee93f701844925b80503fd58513058e7308ba981b98fe5e23ded26918d81137923b5dda76430e5eb6e7cbf53161a160770f28601873fc0c73dd7b843142ca56ea388d8673a8ce160f4908c60ef0b49d2489f225c84f3c208c0a8e719e201801c19205156fbcf6926a8d60cf69d1bd28f65f80893a0535b4023c25d713ce9be17e4c839505320c18c2835237fdb6cc5e124c766e659a17637c6dad1bac49ad6919c8b7a1318c687513f876386da7e77a99c001be4499642d9922ebd3a302cbaee4cf7f5a9bd322e5c5ac58ab0fd250d4ce4987bb213ab5c3e75f07fe0d540b6ebaa8b0f92bc6d84770def2ce2c1c905e4e545118fd15383b8c7ace311869db2e6d3ea488509ac157328547c8cd2e50c88fccc0340c00948899be0306ee576999e31c0607ce173cea4853fb765f444a0d753e47f63d7ea6be648c1bfcc60308abe7d862c68a1a90a87bec1b8b15ebe16128d346b6dfb03a1a7ba90477a3d81a3bf434a4790a5137e1c7ed64304d75e026467be2423121e955a87dfe82fedce59aa263baa83a1da5f83c2dcb51292e5fad1cf24a93472c58160964f139e3242db3f75ffe4eda4825c1bde6ebd7aa2b503bbaad18072ef1aee2932cb7c7d854b2f4499ecac1a921e40c8ffb8e6fff2450d2e3430eb9018f8c69f2dc707513cf522d5734d2acb91f150a9ea542e5daed3449809f8e76723154e3d0c76ee4a656d07df3bb452bfd872a270db53e5439706fb6ff2dd88c435bb113ca57f2ffe70d9fdcfdc41340ad89803bbaec959dfe9a32d8138f176793b6040cd4c54aea0a34525f18efc6523faa6b3ec7e4b39eb491441f6ca53e69613d3418002d92f9ece907b50f1a8e3fe1c77368d05887293770bc692b02640d9e6f36d47c00217f4d199fadf75066f2fac4bd3a836de016d9b669cbb31c41d05a5c8a00b9d69dd8d1c94ac1092b891b7aaaf62c2e7d22766841a3bebdf390fa669791f24559dedff72c32fcc9c97bb9b8b13445a2d4f76c6971daa55c2284c41851629b88fb113f138a6a5ff521b34a845eed5b2904e8f5ee2a2fffa07007ad637fa7519ca5a315b536c909aced28a720d6f2ad62ea4c7b48399d27a32a20bce288e8ea3228ce97967043e7e1e06295159ab85d7d805e01e86f312834bbdffa02a5ff2601a7b2459ea9f030eff49df6d3962580917863f2c89e32c66d68b940c424f894113aeebb6d3e857c71540ae5c9a0dd96c491c43295946ad467902f196103d54a33523529cbabb8b82c04a875546749a7a975320d0c201ee704dcb30e91890573fe6348a0d0f37f79badebef3cd1306fc4dbb7db1744aa045eceb66fa66bb2e171efacb4e1f0758fc77b6aadc819b1a7d94d389600384b3eb4946870b5f9680c28e6734d8111ab4dcab7e56511d375aec6001fa7dcea48c3236dbbb80836ab9b6b5b75f4ec4eebe3d2e8d64c5ead9e6c0e6d98c89f911de90ff118bb6e2039f0dbb55bc820fbf9b436071ae80ae64edf5d8cb85fdb7b7a0e21f02d24df941da8c5010b5a27db34681e704391d3b4d771d7ccb471a303a258955cf4cca0146459c903d21854a91373d06101419ee3b52976496710448db0ed5f4b557f670ed2cf5a763b790e18ee88a8e2aa86e03a07d564a394ca4d8c98bcb2f2c48b9903d9344c4432a9dca485a15277155bd38a0aa3dd34f3b5ec24580b8cea5c45b2469ab8ba6cfefe3e7e639082aec95ca0ecd616ab9774b83a099c0632b4fdc2a23210486dd1b6889c4825e3285e0672f88f93a3481ed4e0545b85fc4ca31a2c584a2b4b0fc27dafdc337ef604c5dccebf69acfd0763c6d1b26c665c0616dee4dee5d2d7b80cd332cf84586382824072d7c3a9a71cf02f3406b7f11cc2004822701108c4636aebf80d2f07e55b38331b4e496fc05eb00ae9370d33720da213a1dde48dc65c94eab29da2268a1eee83c5d6801fbf24152fec6033c4fc55bd14b56223d5c48da0e78559c6f6bb31bd2fed400bfd6da3311e96839a62a3527a9e1f616124751451bf8e77561693f0da1f0bd30dc005aadeec77d4070778f469ea4ba277d38c871a2b8312f4100bdc2dd7831bff46ad639741fb1eeb69bd2130c3a20afc0ea4867f04c80d112909834799749b25333a238a434fe1b9a947110d260bcbd01e80b69dfd408101180aa984e0a5f99f2f6e240e3e8584ab53766170d13100b7c95960d0cd37ba3c85cf48055414c57ff8f94df64caa0d624d36eac6d059f11ef76cff51755531ae9dc235fe0b3a55e3a852e73481159dfb1471ef6ea06f97cdbf859045ff4dd7a89c2014b4d4925b96179739f0724fcb445bc3296afdb13024f9eb54be0712671d94acbddd88a4d27850b90c1ac76a4c255a2aa611ca2d16c58a383f73f86c62b61ef2be35864f9bcaf1a08b9b89a7605b93e6edd011875e7ca6587ef6cd2305199a5c4030c6341e559ff7d4cc87a87085e69dc70c230ca46327e718189dcdee089f7f72581b61e314c3b376c3072d8e75de464420a86f7d64d8245916e3d71fa7b1021f1bb1815baf4f4ceb1eb87a8dc136f17a8130228f559f4637a94295e9d951f1e3ac48c1a9cdd9c26bd407b6ca7efb78206285b7b76eaf6518d2decee7d6895b3d28e6e2873a896b0bdb5b18aa822e68aa9d91f1f5a70c489d5e3b7dd6815adb6482a3e8861cfc9610c1569f967607e0b4685861e6cab162d4ccc78072c72fc86e6325a66168442461eb5dabe01979f07bfaf80db00b0109274506f0476588f7c150d3c6a377c2aff2e08a7b316efc89ddde2b8bbdf26ed0876f478fe224aaf9ff74e094834deb59bcd3bea1e64c7bffd439d85ba11a930c5d53843701821a772254eca30a85cd43052341e72d19c7ce1a6fb91ca23fd3001ab526c1b9c0ed518857d18bbc1e2caa0b0b3a35e6a7853ef283f2ae9a2572d1ceca57b3169313aab34cd6a8d920c2625458cac4d57df04e48bfc16f8b974e178909535e26b965ae2ca251c881a995c6fb6206cee30a49dfb6e91ef822780527430c5ade57c0572e37f43d6a86d6a62211061c1b27cfd824320963cea0bfdc0e6123ef780afe27f4c0b5a3472cae09a9d1bfd5855ca6c6b0e214f2a2dd0104b027b518356adfb12dbfda7772f26ce6f9c98f0e9d8ef19fa4ff34677a3d233c41c0fa424bfa7e34261c39156d7b7328100db7fd1f3242db62172e3371b2735ca7d4e67d2f3b98e04a0fd74b9fc3f555e3ccbd3d024bb482758fd9acf44c8d88bf73105031e162bdb9ef7c2f9c08ae7f771c32bd945a0550e17c00f8c66835e9d7970f9850eafd31107efc955143254bcc9a67ba36013176080185504228c705d0a4e6c7c8f2c1792c79163206efa5deab2ab97b2986c4d8248e0b1368ef585981b11045edb837d014d0110c64d9eb5d79cde7192ad70d86c1460063f80abbd69c944ec1ac1758e2bd239bc49429300054f4bb0368d0cb30213b36d14c4386892fe4d10f19d30e075074f12a507714a853bbadf4f633ee90dfe85fd7939185afc14ce7621cc87e178ac6b9622e61fc09d29554bb5186f23447d8a35e9d36f64b2a0390381677a4dabc577b6dfcd942772eec29d51e1ff351e4cb792a234694da0a8fa4804d0892f4ef24cfadcb93c767484cb52b912a7d4eb8417e19406fa99414cdb410836a53841fe26ef0fc68933af2a73170c7fed35108f01157df71dd1156ccaf6f7540613e8af39196dda838705d60f1ed1a1bd8ad7178cdfe6e9ddbafc2e61650aaec18fcec6193ef860ba31bc6af99761f5dcde3972e45ac3efb17952a1d7be1792b06dc11928f60b54d856538f41ddb6d57e24f53c19983b8518c97e321720cbacda5702f6cb194e83d0a5a3d2342d262767bb78535b96134196546d064c927bb91b50e7e708f01948ba39158744333d441b68cbcb14416788596ce5a2307638d3b4ee925298dfac9d96475727a8e26a7b950ca53242e88bef7dc34be4461c703953cc3c2fece071e8d8bd5a74ede4b271735394725c28f45a3671dfc136fbbd19b37e834663a272b8421fbfc15fbcef3d18a2cc8bb4e9d9e8cad0f9cc75450148377a698bb949a43fa5067270e6c3f55a5f79da08b0c4a9d0fe4445f82b37497837ead2dece261244d4535e765c6f9ba336fdecbd48c75966d0ebd207289dd62fbd4f0e531fa24bfc4791d8ed5174367a2e16a43840c6aad41e3b93e09691f9923283d1115a2b451efe8a527e8f89b1401dde5161eb0a87f676894ba5145f7bc8b2a2a08e69b940d3b9ddafa9659ff272874f1562a2619bd04f93fde11c9648779c592dea291be88ae8da90c6cba989d911d0ab05250118e56e56395f634c2e4d45bd78d936dbd70100252e56966554caa6e51021d605bd76edffd8f61fcd03606f2318f9a408d03a2605117e2591a326f317dff9872b30104391a0a4ad3f54cfa769f4974168cba0f82ba17041a8135633708a68b665e357e0ad0cd7b1caf45e84ab0f1736336d08a7808109210fc5ad9814c1796bd82db351a3e704b5f123fe9f8f9d30d5685d16f01ea9ad21ca79c214d0bccc97cd9556e2e8d94295bee1131524afcd01346b482f17e3be3be5a9d02c7d4dd9b9fbfd6edd86f65da6905c3f45425b8582ae89049297d46363b7f0a544f80f14905fb306bc7fee6ac69ae40e1b24d9811f9661cec821e7df5ef5110f88d312ac5339a50a1c4e35251d94e0befb8967fa2b906744b832845ece13c1f8e630e1c281789b60ef09e9c5fcdef4e543f042d3c058b5a066772b240b5d1506d45adb3e8293d7b247ef76b1372fcb1ae35a16e24884204d62882f78d7bff054301027a5c6bf0cede50987f0b8e7b1fd76fcf72a8055e76bc52bc814310eb2c9f999e1aedb3766178cb05e81ca38dec64576cc80228e00f1422688ae1e7f56c4f6718692f1d7309f99cb2215b997012bed94b2f08d6a9f4b47e77452d50f50557b6e63d4f524439d35f7a054332857595f77b1ef290b42d4c31c1d2d039c69592b8c671bf57275e5bd72fdb56129954bd5fffedbd64402d9cf0e23060656f70b0d0a31e8ffaed2aa6c2a1482662c8f46b11d682a1835811d0095f85b0f3d30bac7b6784c122056d0058ef4406852339d8141a44eb7a01e4b50240b0b16812758d7e2ebf621afd8508bf8f427f4deb467574e1e9faea1cfb38ad45f19932eea0d97cfe312ba4295a37efdd62152ac47677754d0fd71ca9f355274246f366a1e88cbca7970d74e65d9b7ab5c1aa2ee4e950486a4f71ef0f992546bd326236bd1ef11a692f364788936bbd5a039b8e11df8b082a80737d102d88a92b79a8a151c155a0ca04d2baecdc0102699bb10e6b6d978714ad7d07e092e3a5768598071c76e04e187e285c6fc08caf8563864e91b4cfc884e532966049efb50323ebc8984d8a1170f37ff312af579f545ead37cc8eef25a52796100ada781da94c7b4d5a0a8bfdc1d6f7d0abebf4af09c70a1f9e22c4953a05fcfde3b16e7394e2a0ceca462ced744272ebf47d16d6063e87f730a673312fe1f10412eeb2a74f33410c6302bb4c1b86c2ff362fec2ba113538167cef340bf120a35ca65f74bb98ccc92f6e60efaaadd78fd5ac41432769266e7d7591269e4da2aec889a4a51cfb69ed5f66dab4d38ce39d8b380f7d09d17aaf2d36f0b264225e733581848528bd415474cf066a03503ce3e72bdacd10bb94a5ca304b455c1f0317c3fdb9ef75d7857cc4797b1b37cb05a32d05b4a75bf579ff595025390933fba4df0c9c4e6f3e9aaa423a7233167d7d7037cdab0f6a872c4cca02e35669bb252485dc0fc066d5d13b038ea9a4eab91cc5cd1db21615d00ff7f742a6b8a0df1712a3a74eeb38da4dea4a9104f95f3fe8291e355ac9f4355d4426fa57ac340ec7860043d027ce62a152d54d94e5ed143590344f664f1c0dbdc7b9ad532c277d76fabd94ff85b7f5feecfc3ff9fbcc84c294b073903ed3d098c2cdff1b0f2ee17f474af20bbca5084ddfe2301f0b7152df30e6ed3d7f2bd1c49bb320050c40f7c4edf9666fa385b458bf0a6a55b34d45f03fef9f72c2dfba39890428084c51a675c2507dbd760ac82d69119bda9fb7a35d321ee3bf12c589ec01ed324e05f8fb22f0271660972e363313a355f469b380e495de7dd510fc099ad40ebb169dc1a2112be88a0693cf86dbf47e9b81d2444dd845ebcd236e35e9833c08ea364c4c96456e44108264cba85fed342afc882eec2a273e9b83c65c97a8bba1f51ee2f4aef6f07a96c79933ca373ad08592b8f3f8fae7dc427b363bd8974e287cfc41c8aa62f666bb993d92da350fc1a0284524364fec375f98b9a757959ec0934a34bcedac2181d2ce390f79635b6fe0d3a2f65e471f65e1a99a702a5572b3ed3bb71cccea078c5aa020ca489d505e833c853dd155989f9dbd5619f621c579412d7641ebee51c2c548886a8a9ad18a9b4d4eb102e780effe4f8c28ee094a08a60fe4b35be16eb9c17dddfa30c24e98124429bdc06a4ed71919ffecdec856cba0ab2130739d9ae3267be008f4189a38a1d5370496e39c27d8ba01e975b55e9cc7518654c1867193d074a24b9416df456504780acafaf9a033ead10aa18bbc673d4a562199d32c08f0932fec0c81b941d8dbca840abe1babc68698ca2456953b45abbf823aa18a85a35e66eb7307c9cd4f29c29c4ca55f7f9588a885b963415adb22d0f033fb980398171b15afd2c52a8aab933c2805e32837eef01dba94012a18901e9ab0bdcca10eec7da348bd220fdafd8f35ff27f4a41deb57d04cf8b7fc12b4492f401b96724808ac44f263c40bdd650e945862a2ee90f556bfdfc540c4d43e49581460b48ec146ee9676156feda2a23390a03ec5afc990409e48bde24d00e1167e04f8a2c204211599d378c41cf0dcab8364ea75885520ab190cff3b324c7deaf16b367c17862338a1a4955f87da0a1b5da4ec1cb545d060458dd60fce281012f13e719dbc4dac4ca7f052881123ad6d4136d22e2a4225d85bb8333e9d1d124eb6b15870f57f63664961bb2ec86cc7967940f8c92d04191f2f9ea3ec4f963038bb4c36245e089815874517aa53cb20c050d6cbe57380a65d74b3ed83778602f3e53190c7b21819cb1f2168aaf869a5c57a997d9d7cb2b4df98b2cdba73d1d7742bcecb5beb234b00b6a79415ac596378e61a5953c801c87f467669b355b31bd347aadd7f4f1984ddf9d1de95bab69f2393dc4526db9d8feb911a9dfa805b462cdd825a8eb15864bed323e516fa2581880094463fca5e5f43467cbf4102874c0f228bcd3009dd05c77860c34767e7b038b35034bd705967ea781efa816e9aa97c7e93b4bc933ae9d418ceae0cf2cf42e9ca82b4a8b87045d11dd2c244d9eac00ad4897b9b83cbffaf46f91ee00092e0e6cc7cb533ff384374e05609e9192176f7665f938007fefa9750ecc4ec186d6fbb355a974dda7d9d97d1e9d7ae666b5020951f2d56f9885b9cdffb2f1b59d39743aca9ca6cf1988369e5aa6a0f065b1b7b9a1a81e4f0b77c88a87d709f94af9f15ee23b1c25a28cfc944f4b3dbab1f336883d86380bceef246126f0228e6ea8aa1be83992b91d59e2188a3c0ff1ea6a68b0b12480bd52720e6f2e681cae1ad9b98fcd03eb5d2eeac5888d50a71aee9f0387e09b1467ac24b69ff0364f3ee7e531d0f846cf37a4e36d98e1a7b608feaadce873cb6ef24852cb88043934c3bcf28c6488edee100de2c38af1f8b795f207a57fc5be0f8f81bb0326b8c3f738bed181126f103f20dc8c0f4a7a796fe89858e1da184e7676a2a38f639eddfb9b628e8cca1eb313b10946cd78b4c102aeef53e503119cd142093924846a51e32adf82e51019d4b27598c28b9fad71e743d7d2356dc984a544a7e32a79f4664a7a367933fcc25e818369f672734d7083dc68c3ce667afc8f179fc3876d49948142ce28a279a32a48241ee59ef957c14ddb92d327130f14c315945690c21021db1b571411cd8ae6ae61b042c046020301e89080f673ee0eaf721152d4386ec1de5f08ff8893f0b6bf3a665050703231bbbb9e516f057b56040e1e68e139d38c7c00321b648ee97ea8cd62c2263cef0f4da533140f399631fe3b8b081252414d8a7af9ee09989d1845f4c719c0f031a18f96ec086c1b0383b143e7336a910ca8183b112cca18f2f0e35da8d8382f89ef22a47070cf204c7a981b4288f697d4be99e7e6658652ea6ce4d0f91b2827e0ef18fa6531fb66ed5991218f0fae7fc27967abef1868c4aba354227d4cd408b1fa01921f6650983ea133ebe354c19e694450ae93f9b2ca7297bb4e736d8fc3b50868eaef9bd86ee2ef58ccee62917978b3d4d00dda33a215dfba9328c029b31f5f4e8df522ad3cc211e7e0a988c803ffbc812ea5f0173a2a4f907742e408498191b5a6c767cb377870df4755281d5a3ff99ecac9841baf88b09b45ed6ce5c976e4ef7c7f56c162b9098620b922a20c464d1cbe20d34e637f8624deb2269184e9bcd345b88c40dfa5918a5e4798206cb82739e0b1c4e9cb4106039e3b1017129288eb15a09aa50cc0375c12e31fe941cb6918121a2a1fa188ee45caa997066e256c02c333b3edaaac90b8199ce11c06dc62f18a3a51042957146f2cdeb179c8171f73f41a2694d6e65a79c41a2333e3686486137b1906099395164c3d845c06a30d2d3ea12eff1a6da440f7dd34ff895753bccf3130122cfd22873a4daeeb90732cb568ef8771f321d1c6086049765efe875f10bb7839d43b7dc974a4e3ea6b063d171a9128e4e983633dd20f04e2cd64584654b45e938d7ea7f08e527e2bf0f0a5b462db45d89adb7fc61c553ace880d2ca49fd869164402117ac28dc87c5868bab71fc203b84f8210798e72de57ea7de9585ee7f910f4e9ad053bde203cf43640496f3c73443fe4a8915d2196053ac175500e940f8e8dd487e84b5bd9e107b8ab4ad30ef8d69632cdf039e433032622b0c835fefafa45d4f0c41b2233e474107d20b50485da81339fbd20911d59cc7d9dd4bc2e0b47f3b1b3ad42374c0ad08d40626c076a1ab66491377d3627a17b984ac04d13aeab1bd4e43040060903d391c4fef60a458438d7c2fe63ae70b38fb8840c2329f2fa43aa03e562df0e1629abe281f63cc7c2d8a5ac7b075a3c2f162aeb086d9e54b0c5ef6134a5b4db468dc77fc1103a92570c44e648ed4131cc630c4f03e4b2f9b7511420cb4c00a0689964a070dfde5cf9a82357cd17fd6f574e4a26db6d8d8a78142fd45b5575a21447925d7a6256415202a0ccec04bac5a174a843b202522cbaf25dd125310a691bf6c04f83ae6c306b34e697b8337761eb6eff4347c62e9d035e1aa30be9b033ba311bf85cb1494fb70c6f23fe780f72db9c6c8b4f8c8093c516fb6ccb982db2eef75239e5579868dd55643c2ebe773d84b4c3b53feecd86b8ae70ed562cd9e7b4339fda497f2dd35cc8c30014654864a1f5c7568bb31f1c20ed38c947d63a1b34706d01dca23543b96eecd5038aec014d893afdb0179a73e5d7ce0287213013b71d6a2b2d3d3329482c9903bfb397f17d6b511895c0311840c6a055b445ea38c1154184fc64d8596a1db590d56b5b888fb9ddff83c083977a57560821c66414ec6de11f15a98a0b3d853df49d1c8a56026226e7e1e9bb3c3b716dfb864773c06cbd39c5009d5abaf5509955651b9f246d50f64f422887de398f92aa79f5428d4be9006bca81856210b7781ae9bc5ac9cf2de3a22b4197e57a2fe3619569283b606b446cf0422d314058f148917e9dad43265a326e590a0451a8a35dd9443269d858a0666f34150da644c64d8e4745211d013009fe4f04dfecfd7447e695f12454ef5b7c9f3350ff8ed0761ad73cb4871e2d22e6e749ceedd5321ce6012cb316ebaa05c9dbf9d5234a75315ed5df280c1ca916e121cdc236871361097716fa3b35a660fd5729bedbd139ce34db8ab29c177fc656fcff5af6d21c7c4995cbe4e99c75a567332bd842c339971b63faca21959943f7d2ce2e374286bb8d06a5582151850c71fcb441b50bbd256f34a23fa2283909e6f34559605293d39015f52c82df23ed39f8c37e6c15c94554f3a5e7d4c593e806aea1ebbcdd266584dd9148645c521261dd70a108b051d936a9207bb082cad684bcf30d9f36355c13169c3c38a279e2e257dce65d7f8c60ea11daedbbec5ef894adf4044260f15a2a9e4a725805d866121f171f384e666ac0169d0e0d5afa616e58f48c693263559aabfe6ab7dcd9632b481c40770b702346b6148b74b6324cad32b362398b7dafbdbc8633364186bdc20d0881ad338f73b1644a663a7f3c290a1f93f7e0adfeaa1ffb3efcc3c20006b3a4b31cd1f5c3c01db6d2ad1f418e6e78a400cc1e7b2cca06f8a391b1dd1d9bd35de692a06888d1dfab601c37808991d79a6cc5e87bf936bfc090865ec7afd4dd335e745523f8803abb9623d54a3a666d00d9b0353910b30f8afcb836ff7c5ec5247425984460b62f64caa234755d85970bed17782fc7c089a19a544a880b1eebc14c363ee50a9114844eb83cbc19fa662c39d58ef1bd82f1ac7ec5b29feaa1ccd3fcf197647048c8c9791f38d39c58d454cd7b694fe84eb67c3357336af946ea23b48f154c5512c21b227e63bcfeaaa04ae87e6027a380a5b706a22cf853a51cee12fe72e7ca7ec50de09676fd36926998d16d33f539dc1fb59e43a824411497b2ceecd1aef0615a597ccf57709ed27e7ae885e49a9ae992c9b5aa05165db4b1315bb997b4906519bddf1c8976ecfa6af7c9b7895272c2c0972203eb4d96247568634aaa85fa93e304e375341dad0e19d94eba0e1774f4095f3fd82a187049ed8a52ab1ad9422dbf3d9b6a70ff0dc527b19dce49b7ec49a0b0ccdee5d529a4062de19ee1bbd980e6adf3122d599344ee2371b4d7f15435a527b09d4ea3a1f8ac5d5b2df9a01390486a5df421a7405f806e4de1de8f46cc9e137a1b0b7c83ac53e4205ce2e7206cc2bdf39b2164c3734dadcbf2b669fc5b15bdcf4ddba31871963fe457857ddbb8ff884d7b0399ef0c604df356decc4cd68717bc29fb78fc66a11b367c1efdbca11f4bae259a1da674f5be6580650ed7b5455aa49f3ff325f9b370acd31bd359165fdbeaa13f31a64340ae631efcad27eda700bb479aada4654d2a88d7884547ed4fdb5849e2e5974fd7a768d6a740140efb3b52115675ed730c5f8110a6ddb6b884370eff78261cf9ff8ea048b47e2765d21126777f38f549c67b10e06cd870b4475aa9394c50913435a7bbde803d26413ba908cec5550b3f0e1d341e7bc88c15eb715925e66b3840b8d2dfa65045699c60b7c4265fcfe59e7868e6958174d90177620f6e7429744d95f4310320332dde683bc5576d9917c72a4441db07827895c9a80f83b5c9bcdddf1529cad3d7b6d385da6ced6ca54c41058c45fd624ca45acea8d4e8d397a9a743ec6b38943659431c2204d7d180684136a4a3d61b446400d9de162ad632f6cd01b48ee56e0e3b8043fc1a37f38115268ec2e3712c7a263e27853b6bcf28006b4b2f05d8e945242de1f9ac69dc96b5ecb6a9b6cce2cb9e61f4647f9065079f8eeb26b1842f4f26ff31aec8c9d601e2f3d42346b2e39ea550ac438a2292fc4b852f1ae43c67b25e30f101f8baf9b6004e0604e3dd88f067c0fc3f2f39d960f1f20ed173674409b6597102a9f6e14363f963d7ba694e21e574b397d501c89d7cdc1f17017300a9605e662759916c8c513243f786bdc6c5204578db07ca09f7a6e7ddb5418a5838a4d07a3f3b98d9a127cb75865edced017030ccf23633533455c63ca68b6dc2b046797c117199f4e8bcb78bf24c970e1d95f25bb29436478e14b1d6f353603f5a1c09302dc040ec7051fd5d2b67b6cd6a2ce3404f7c8cbb61b1a4a4fb27722638ac0de2f52f20839cd40b3de6c194cfda7bd0927c9e03beaf13d8912f0ebd7323831102f814646ae0df83f72b5f92ca8b0a7d021975bba41e1a6d6aed817e976c5c7f1409fff3f569fd91be85c415e1233be46844f648ade9e60a445b7c6d9819d9272ba4547a88299e87fc0ca23f61050bfabc553cab042091b71d813459328534bdea20cf55de19499be78a1febd20ca5220d90ba80724205c2c79ed0648b31e4cb357f3083fa2d40baba705261d07e24f0bd49c01862379b867cab68c5e68189aca39acaa01de8a864375e2b4d643b1dd73f92a55d94232e36b7525cd921f989896137314a742c402658590ca1f0a0e8233745b5e90ce628aa07c5a839a1ea6cf5dcc0191129022a06384e9852b5d289094baad6e35af4bc7a79237e26b34095e11491c9dae86468baaeb2026433efa38bb1f884db536bfb337e3fb9c42bbf53653fd3fabb9a3a1192f0ddfb08c1dc13283062428c3a3acd7921d1bfe0b6f3680bbd727feea3a06b1d00fbfd81df8670de150805510ccee254adaddb9eeec820375158e95d349fcdb57d77e37e4bf8f220cc7789e8532f33a24195e72af28cb4dfcdc7f96ae906317410faa957a77335271f67a11f06c64853ae19f0eeffd284e11a3f514a12ba681028b22825913816cdf8eb59b488ef06bcb118444a79a668ec6d396171eb9ef03adc121b9cd3436c92c4334e4d811fa59e2882eee1264f48c86a20db05fe693b61a38a0f410cef60bee734978f2bf38972c021f04e14b240ac9fde60399aa406a1245f39b5ebdf993fb3bb137f2c3941327e7b91b54d9ed6b1c59c95eb0d8dbb473b1442af4afa8689b7c958dc4579ecb2cf36253635fac682f28801f37312373147c8e7779b52d9f63bbb70ba58372cbe43411137285a3e783f150ed9b68ad4ecca9123cdb5c1e59551637ef484616d76ddc85151c5a912a0bbfe7e7c98e98b0293f86c5b4709fd1db455d6afd9aaf89c8b1fee09ccfea4daa25df9816a3a06ce1f80a24bfd1eb9f039112771467575622a342819afa2460a1b0d6f80d6ec42ca711d76cefea5fedef7727f85ccc09486a58b542f52e823ac2f34922bcb3135cae97bf69cda06853935ad638d55046894c0dad57c8f44807ea144a074e2fea4a0b8c8cc2dd3ebaf9f4fb863c1de4cb0dd7203adfab18cda6e65c0da14d9b9d0e1b0e6b7e483c19aae9ebdc9caced6937cebd1e2e512479c062a11acf774e7bb8a379535eb9505f4b5e16e2ada1ce92a2e8927067448e958180bc76652dcd4975ed48bb37d425d0811d8f41b25fa6ea00c45dddd20db14b7cf3c0d10b38a6ffcfa429bde32419a6bb69fbcb70fe5f800ed529241314479b428dd0549fafdf3a55ddce521ec03939955a18cb8cda2f3550b4f3d9b53d8e8a9c22150335973beb48fd8d26a367290cabee0094be097d3410a44fb28c9a21b164bad8ebfc8045bd09eec244d3ca8e49cf60f0d8a9e8d05811d07b2cffd7533e5e0e8f2c4631802dd9cdcee2736a142c7198337cb6e919eaf5b8337efc1449a1266d3369992436fb8ab8225c76594dd5e5ebdb0b5962bd9ef4f9e3718ecc1cdeb9f53b494b5497188efd2aadd2dd8fb192bc5bf14b1de22dc4341ad54312fb0eed0f902fce205d55055fefa45cdff123d7e2bade04c8853db7f4195c8c10804eb691d704b96dc6cb93259a23ae23e1c5f1a76ae9fa9de69996040c94646b9c9579f414b935d84d6bc0f70ff037780dbf987c23faa0535b898b4642d5145ae1b472ed5b9f57ed04ad3bdbceb2665a8a3fe6bd527d34913685aa5640361f52e00364de62be7c500b1adcaa92310b880306f5c376d7ae82f1b050342f28a2b54e28e491142604a43c98ab360ff070e6f457e51a37de4537e097b0e3ea2ac501a63f8cf97f3d6db198f673c10e29d21c688c2898b4488903c6f5ac3c4737b1d5004d137a86bb15c0fcd090ba5e42219d026f8d8f2848d31d0f90dac423cb75ba7ecd3700d6065c7b81d237c277d8062459df83d1eab50ba865b15c117983f8e9c40212d6de1e76b189b0ee108691d763d20229c0051247c30dddbdb3a14e4d69e09f914384fd5550b55de90a502db8f81df3d0bf33e8148e0a265373f93b1af792de3b69363f11912d170b07665bc849aba574dafeaed60a471255597ea544f6d5172aa43d3333d9f1bb68f9d8eedad3b741a2bd21f0ce6ab06e6c947b91a090b85c764231a898e7c315a9e1768b9eca83827b92aae43a771b7d1d66c8e844d36540d67adb50e19a89c9184ce7c7ecf955e7caf1f454d75044957d54d498daeeb0dcaa3ab0a5e6f103f6027b0c8e21e30b7279f06c19cc071b98746b8d2c0e149461372b430b0d3286262156154ed6916f0c8a4820dc8562399e971d4a12e89690dab4c8d28b30be170f9c8a534cd91d4277492fa45996083b9333e9078508c3ccb690c3fd423d7fe2bf594c8489e44fc929831bc199a219406885ed5f00b362aa15cc7604a17a38e85dc3dfd092c68038516f208fc452fb4fa88c9176d2af8557dd242c7682faa8da1e730168afdfcce77760de5780615726b025590d92da3051193d013699a5203571153e4be4ef16717c6367b61fba8014a301210526258d14ed6b73d60a365c5338bc60486c92a44ce103f55260c9896a069dcbfeb0e3834e41e494cc4870481e025d732e05faf0936884af1e69632bc16adc7ab70a7f955f7f82adccdf3e84e4249cb3559a1ea8dab4f732a3ead954279720de66a152dd7e6ac718381f84c28b42e64625a040b6de681fa543084d732d64a774653e33588cc9c8e92788725bc928bf4a90d122c4fda2046def513f6aed96d24c363b31deeaa2cd0bbc2167315301aea8a320778ac59a6a9a866a0638f6b2c8192d2d19a5d957bf8cf51036553ac474634416e14bd66324d9e6db380c7b057ba5813acc65b48ce8abcbff74ad0e233938cfcab854af10e0873a8710a5924ba4bcd07b5f1b90a7f8608608215062251e48cdd1f3eddcbb7280ee1bbb873418a12688109dd342dca4a07739e5999988e8883d13f5fc8d3b1dd2203092a449ba500cb1e25a554558d81b0393fc46d260452ee645fdd18eb3c7b0c68dbb87034c38feb61d85b762e9f87362208afec3748291114f64d3fe7a06b7608a0668c95249a704ce32d88c3886c76b025e4e3b11aafc2c40fabe81eeaa142cbfc79506bf292848d26c5e3b8c034e9af8980fe60761cba49c8d53c8c5f3d691a35178c40929a58c0d32889ad674f36d3234154e44f33907290c90e67076c4e8ca7e7dd1250c9e2e1eb010840bd276c6ee25e3da6eae7d8e1910a4ac7a42841ac1545b3d5c144488e3277f99fc201f129bd3aae73bd3c85c32a327f013e3b6ce40ade0819eb831147800b5745047a04b2cb07ea5e461e95d7dae88c499aed0488a1e563fab5da784f92fb4751da51349df5320a9b459125efa30e5ebe0efa55e7152583ab3dfee44685da5a8cc04cb91cb817cf3ee65e22762dbb152cf4dac949c56d4857616d74877b790f203f576995f85e31eb8c94910113758fb0bf671002fff176e06c4a3e2a58bcadb903932b727ab31e3482a386a774d6af6b778b552e07c6d9660d3b416e1c9134f9441b6e1b43a30ccf40a611b868808bb9c5447720081ed9a43df1485b5182e9071175e05cd65352936e2eb53ed2267e83b7e964d6eabeeec399c6432f30104b1e09bfee48ca514cb383164318ef063c8b881b35921c0135a310ca4f22284b9d0aeae16b1c9ee16094eb5e5e827442296f7c533e65235b1e511b31dda7646a4fd2cc1d1b67aa716c32bd896979f4d1fac53426d34d45a756ca25c1b518fda847a511fc3c9ecb3a9b42e2eadacc210eb8599e19f4f7b71e05d21e576a73ab0fdb4b829ea4a3853ccbcaa897b277cb0bca209963dd77517e430be48aaf020228cbc70d6c42e926bc850bd313ba0f424619ec67d990cb5442a7a206aabad19580e64ae12a219e0ca366872c991e41b408d628ef858c208d6796989061538f736ea05dd600ef095cb8007e170176a6e3edb78b7df27f077cfaf778e219d27712610e2151542d873817cf377b25d266fd765de3b05891f83808c194bad871ff5d45514c4fa0db8cc5d87d5c6402e4c2c163e2709475783a8056e3182549847f899c41c6ff5f3d442a536488b12f76e84bfcd1ec95405c08a73c7183189d17a1f125915473b3a9998480d7256d0298de110854bdc8a498258f9a03fba0c802ca2ba1e8e3501c871c4a4a950314006d923ab12a39c5178bc049f02283dd1035382e900d8adc81581cfbe1b4dfb75853c010a30c3257eae070c0979180961061806d0918cf31643ec2d77a29679caaef3ea9854ea33fd34426e8abde615240e4cc01a3e8d4800837f290f31def003304643b8642447915c5a66adc13263b727f2a8b82eb516d0a4f4d16cc305648d9cdaba7e3a5a1d3e9a96e5bad58275cd3bf81d1f91f8c35bc1813e8a94531dfb3aef671bc5624212697c1d25ead2da6e586968fcbf5b9d7fb3337a9cee9400a5732ab2e353e42438e4a44e818b7c48891aad87199c76e57b38213e1739a0d46ee5987504810d96eb5a42a589e717cf832e2a675aa776471aa3e4d6625c12affdb37eeb0711babcceef5a72e38f4848e6b650e7eb20dbe6197bd18eb2def3e16d0ceeb0bdca7cefe194f6884e907172b2f1eac18ac62970b06f62d56a2e169cf025c13ca1c27dbbd109cb2f0862b9394a981ea112c46d054a8ac48587dd59b92c145da9d122203ee412871598332254ce4300794d219981f13db341aef8c36167da1fb862583088ed70d89e03c38e4e65fb44ebd12046ba4e5df539b5c887801f22c47e611b477d61c55b2ddd94557ec9fc865137c2b0fa1959d6e2ad0cfe4213932858a6cc4941509f2f20193f7a940768f59e400f4231657471762e4217a1253a47bb7ba45e0859c082553995305ea5937d36047e1040e5be54c21c578315b553fb39729932c57ec87abb44a538dd2e9a14229a96f0c866eba8a520e0c84ed6cfa1e57e8f81a8db4a70b4bdaa495dfa1c976e8b5c92f2e59ed30d0bcf266809abc7857e795951c06d80deec776d4067d1553fbb6a4c696e46ef9b54b54bde4e9bf90bb68a952c89d99cc7cfcb00b050be0c9a476993c2c49e4ae5a54505ac4c3104e6fb995cdaa591658c4ce02b5921d121247224a14591598328279848a05daefc1a5290e0741df15efeca455b86bd5e615f233006b94086960c088b3c70bd6f972c89f3bc2e79fb93368a3e7579bb074880d0b51cba2a4658cf83c6a6fdd6d3fd54974297738b2d58be18c9e120174661d656a45fc2ef974def5c93a7b2db5e24481fb46771bdb1b8c1e1d858b84bbd984ac13cab19dd8846c14c643a83721093c112dacbaf87a74ab723909423cbff584dc07fbad16f981dd60d81178bd76d23566bbf766e77518cdd350a0199ebb6bc32dfc695e379843f0dd301d3d046e35a51fd7ed9ba4fe1e9b9bb5689899ebff137120af01a2d1dc68e08bf4e179c9418883ab82112a553cd506e339a1b48782c8891071796755dc713eea0c20a3855a69a2cd55aeb93ef5d442b139f8e69dd1f2dc78a4ceee2b0c9cf0df3ae1e9bb61ec21ffaa567fcb8d50dc174e343eb0ca3718312bf16888edd414a3ddb1d644087ed395d10767031ed792e0cd591a55028828a257d4abc7656ca2fe3ea0dc6ac609176ceb92fd629c28ee0179723ab8d174c821cda48a91a6c317e178626e53f16fb20b2742b8dd73800df074756eadda83af3009abcc19eff36b80488a527ae8bf5719a12c3b0bd4e5a98b5dfc04ccc31c23df32888ec1fc197d26f2e484c5519114dee59529425b481906e0cf3239858a986c0d9e93cbf28773a4e1f133444ca12b9b934ba6515239551f4dca89652285c2993d0f4360547b30f20e64548a4ebf2ca44dc0b481faeb59ea5a6111907b4ed2d1fe84148189c8b1a8d84a4cee667e06b1e2d2ff677de30e70923ef554f175e9011a373be6e99d8a8299c13db923e3f2f234d8477eacd8ac47a9c56b97478431c0f7993065177a1a1522cfb1c88c1e47b9a0d8b4eea8b9a75d35432957c5fc4f9a5b15d6b68d0af483c50d3e97809f782f9bdfc025c575ad7759546656dd39357d050de280852c6a4d3f57e037866f9838ae595f637d4bb5fed90a38fee1c4fc12baf6db24e83f6b11756a203904db334b6df046451ff267de3bf2138b61bdc5269b538a7e9895e59411a84bf147ae9e98cfd0cd221f1c40e9fa7383372a6f3ca5f88d43eba34290879dc7a9f69cfe3cc2459b819b61c627243bf58aa5c6a7267ac78cf042f46853d9b06c963057574fc01a8db60a3dd886596705cd280d543274e3b8f8e96623c1ac5c866ee533667f6497c312ad9ea725ab6f53478579fd871235a96181e1193637de84e80dbfc105e7572cee58b0188d7f1f6ef51f24e8dbcacc0232833af1324339273ae3eec10f8b0cde8cdeffc02c572ec49010786319d463ef2513f320146103ba3b82745c308eba9a0ea58266fa7dc08955740b5c605360b57c5f66d484a679b773ec9080c49501be08c87ebe00cd3cc310ec0ae14caa4340134e3a5eef9b4c21c36e17e94fcf1adce9e476981795bd72a191e668c416d2f6eeb6e59652a62465070740072e07dc0bd93a300572e1e675c7820a9d5bdeadd42b485ba43cdd82ee47b89784eea7d7fdf723755048f7938988119095cc0947cf74aae15538971cd6420eeb7b2794d3ef9813d40cf8a98b8a5cd9d6a71df5baec791c28a43eed7674617361f251c3c6b2a4c54e9a2e29b0ea59df48848afc5bb693c3dac9c9a9072ff221284f5072e64bba27a8b09d5af4204a1d095585448c88a8fed5bd9cadbe71f8ea42229a9733ecb416815aac34208f1f0e7b5195eaf10761fd2afc593deb71c8fa9fd56af5abb0c8ccaf1e874054cf0a8918adc21f11bf2a0c419553b0e3708ad11ef49d195d56a864e2985505c6de6254ff2510cb8d64b26e92a6d3ac67b319d5e32d79227dface5c25c03b64c6913bf325173c36d2152cc1489f1476c8dc60e44e3f09f43da99346bb81bda5b33ff6960fec2d43e099bd1f7b4be88386df8e077c3b663e410acc7ad58f8dd43497a8dd36afbf11bc67f2d175a9cf7e273bcff3b13d15f2fd043b157a4beef7b8e46e2cb9bf91c03413ad7f0a5d216f2473cea80b55d4471794b885d39e9528da09a8ad74522389c136a42e22f0d8484923914ab57aeba386af1f8d444b809b16cea816bbdffe8065142bc98f51921f230f4722d60799628c688236fb2912b29e1516f99945b4223faa67fdcccf204da4a22b27122ba4edc17cfcab1f659415385ce118831d366b4d4b93c98fbcc621817d24d67e8eb65a92a4cff6d652912d14965a1acea4a31a064f30004699fd14c8811df772468374cf853f463ff73b4ecefc7e2a1cef0d2507ba30806176286228b8be9cd95a6e6ad16e16c98643e05196152061f6adb5d6edbfdc9398f80226db2ddb9f5062748fcd91fdb9c5beb4d6328151629dca23fb938afd293f13e48e0d9f6a9db485912dd26802bfe8b3dec88c035fd47bfa9ef7ac9008ebbdf0e7fbd41399f93ef53faa13f2ffb4de7b16f8d33debbb1939e03a0626a2f91fef67be051a01e99ef53cbc87267cf92b9933a3d77d2034effdf673d6fe3fadeffe8608f09ee681784ff3fe3f461e02e9bef53fded3fc8fd116026985f77f68ae7d1a5ab017befc573ff3ddccea675e4030eba9ea59e05773813a2ad44c1fc7182c6746f4f3fee52110eebdd4e3f881c493c91cd61cf8833a288158f6a7e028ba9864b2679e91ad2b145d4b29e58b0a9e7276695a7eb100a7e020a5e38c1aea9e9f4535e35c629ab59e13706ebeca27305db8508a23539dce01ff7ff53466cc7819353443381c314e38ba38d77fe128aac21a8e327f854953fa1196118eef5f138e622b1c63b5a69921d6100e41f07e27794f083812e64f461613bb7c275d1b7a0e0040d9b4ec34da2686aebb4d7bb282c060b87bf794ee02edee6edadd9476373872b9a7cf321f8539d9d32d09dc6b4b8f05842be12f5dadeeb59dbadcab7d4aeb04ed579a6f485d2d23309db2c55a3f2d787e8e9672a72f0d3fe70d2cc051eb53aef56f0872ad4a3674c9f5ab7cc09b7190476f8a1a92100293e96fb8a3a8354a84926ca5b243aade106292e9d35aab8e1836685143982a5c706156eb0fb9d62f5799ab0cb629d36f117ed46a24268628a2706109125866b516e54ac549ae55860f4383951c198431e7c40cb6e97aa93db208da9466004388f67042b24c5a70a62a044393a002212a65c9dcbe6cf9c2a54eab4403112f6c36c460c06022d7748928c05e9659b278829100e36499258ba83c62f10ba727b4e5cab20516368f3fa5dca19fa3ed14789c436456b42642f6bceabb4f2993974c2514322d273c00859fe0cca950f6e7a3e33ef5db4b0fb73c9ceaa1bba2543887b660224666aa4fed806b1e9f0b7fa8c2c0e31ca20d557082a13a4818ad4d010593964c8fc8f4471911f4e7049a4095fe03ba47cab7639280c9c2e9697ecef5ad222929bb97dd6f985ce9095276e9495b949e38653adbc79c20384cf2a0603b09da4cbe6829207bf27c7f14b05fcfc969d1715accd101d71f71b2879fd3a23f8665ff6d0478944e3eba7e8c752e830a5dfea20c4a64f7d9b783c69716dbdb3e2549292500b2a5d6565ba96f1b121dc8a38b07198490ed1e065078c4221358059afb45e802dcefcfe19fe2c8602f13ebedaf17bba1a45f0fbad1c740fba04438ff948729d057e1e62977eaf75824fbb70d652cf4b721d1fd5a6b7783a0088f3733d92a53a6d054c184a60a2636d890840d33ccf032a74ed1841f1434814e2174ce06cc16a5218ec5feb5041e63fff37380346cfe30014ea5607c4808f12121440baa0d50903aca1160a2d86dabb556bbd99e5270dd68583efd1b06aee1ab7fe60e63e10d392738f64474cace19043583dc45e089007beae7e7108147093f80cc94edbad40c21070f1083ad0dc4116d282be18710f865503850ae6c99504a41c19f9b5639a7a4f425f09dcb90c8becde958770cbb2b05430d47fc426db7dd22d28be12f29ed6ed99422e1eea8975d38b4c56e2a84a951151b266fc3e4cbbe9b531a7ad98244f75e4b3d69690949949f63ca29a7cc3165eb88f6e30d30bfeed4dda5b4a981c17db395baa49c51c3454e96b5c67a6d6d12d34b73299de15adea52cdcd195a7faa8089f8a8ae0addcdd6ba5b5d64a3b9c929293f24ab939b53555069d73f21081ce10bd6d72a6f794524a29a5f2f502e1480d1b192175e10eb9dcefdee1f8fa1173987c569eb456bbdd71ec57e5afcb0e4af9d4e5e3ebe6da79524a29274d4a19a502a594524aa9d7b5524a29a5d4fb542b3cf37d18a86cac5c18a75836683c0ef42eee928b044770aca19452997f83b97524a594524aed6d5fdde01aacd68c67696ad4dc8a5975061c5399db6a64cc70d9bc6478121c0130c3456dbaecdfdd6c90fd3b9c9ef18d5073879edc49659f8181cb868deb06a76ce4fe8e86c7b97eec1feb3bed9ae9775d336db029a5e1b5b9a95123fb77e1cdcdab064e8b8667737f0700ef29695455cd8df355708ac320a536b36bbe8865595d4d4777772ef07c1fa59452ca9aeab5e54949b3497a299da192b2384aa9ace102bb7baae54eb5dbbdabcdd6ceabb4aabcefb374deacc32465e7eea56ef348c9b1ee8c47371a8f4a4a6dabd64cf95eb3943b94565aa90c8f4aea140a6af4dae5dde6a975ba3ba6b9bb53bfb91100986aab9d9133f65f5f0f6c29ad332d1a302d9a992ff6267405405691810c6a6bdd2a4e8d960694564ab3b0f645ed97d60be31b3b43ab9db9c27ea9f7d28e56cb62b1baae7bd985b24c9932b6be36d059bd6e7476543796565ba68cad3602b8e1d9dc8875ee9303ae034a847670894c892385060e0f2c0d1c0f78aaad0183f3e2e9a1d5bfbe2c0daf96563b64da4a3ff09922c5cde3a4fb767476a7d56e38346eb27c7a656d819c84d940a062cefaf007c3968c97326a70c277587f4d173c7ffc57e80a4000bcdb354d19c8c820834f47fd1a35d4abb5bfd91a2d0dea8b34d4bab442e3d3e12ab0228c7e58b45e18c33cd8a7637b1b1b78392d977f5eac4c242c66789b6c6021a12934a9e0a821f349cd04d54766470644f4be173f1daa176ddcc0deeabf1e7d801956d779988ad7f94af50d994fbcce0415c8c88070a9af0d7456af1b9d1dd58d8ea7a323bb4957d66e98306f34ce104e269b4835cfa46945c804a1c9ad5e304436b9e4709c5b643602b8e1d9dc8875310e3a0eb80e3af0a4f4b9dd003c297d068063436a1107081a383cb034703ce0a9b6c609e7c5e3d1ec49ad25266ff5822ac5faea9161b9483497c93e1df46545b2cb200cd9b639adb488a58f9037fa93903bf5034f4a1f1f4f4a9f248c5d5eeb8dcfeb66a63978824e0eb23f75f798f489c91d9f14088cf1c54e0bb3c316960d3c44d1f4d0d492e202950f543a1fb2b84b5d23aa218fddd460f21cfb293799281fb8c8aca7cd63e38a79f5d28725eeeb28f900743be83a294de48e0c2e410f2f5c2994789062edd74f8725c00e284852da61092d1b614daf88be3a8871b5e8a04408997e875d2efa2e7a058728a40ce145174e66f4c5e6a9405cb152e562af66091e4516f20eb976453a28c1c9f4ef3645173599fe96938229327d6a37a5211e32a55fb9e4e420e50465327ddafda083031513e4e042a6ef395ea26891691352e0f18a3a50d8cc8cc04d578c1607585b68a0c4e0021e9a8122f4c28a5e160f4c544d2c612a4e3e033411b5520af29c545328e94690f44141810ba9273c2859b8c07550bab80618c1500a4a18306c475c1420254c51624862002786a2387161a916258a0b062041541422036ca145a1c2845e2e3480134b51987819c53aa6650b316cb8803924b028304cc1ad2cb33cf9a08114d826cb2c4f48884cf08c2cb33c49914197272d32e0e2290ae604af90d4a8823f2736ca60d6908d21f08a080d76c038a9c613be4c3570c03335510b5e6599258c164c61c0a8410553174416b08d013606e69e9c00df285b4809e307518c510d1bb097651631546a1c65119374a41613b3c5d6a493392924302bcbaf5f18065f292fe82370bf510a5aa048ee14787bfbeaf7d519039d4722790b715a746f5197c5c4609fc205c4eda2058a5db885f108c214b1618c714be90616dcf09447fcb48ad32d98eb965d0577376f5c33601fa9c733a6e011a7bebf9b9e6cd93e02cdfea927f8738e965212a9beb08884a285312420a168610c5af6fb94e3387ffad465a8c54240e58e87f52be55e8242dc3bd9bd48909ffa1da9972ab8a42f4122cf41dfee0d456858e7f841ca0f600b12794f411cdde37d7f2ce6b21c6070151ef2289b7498b8269d2b0afcae16a58bc0c3257379cffd9bb70db4a0dc3102cb5047eec8afdd5feacd5d0098b08ef4997912f1a72111fa5eb885dfe22482df3f4ad5a9c019e5b04afb81c4b1c3eae3f7503aacfaff784f7f23a13ff5fd2922aaf0e77bff2dcc6971ae5ef58f55ac577d10d6ab56ff839f151209b2fa51fd785618fb9574588ed81830f4ab53a039a32c14a1e14f051c169ee0b0eafd98d7f6347c6d21fd1ffc1ed2573da534a4d1b0c8cf1c72587dffafbe9c85627b30df7b2b68ad8f630c7d7f2449e87b9fc4ffa3ef3d10ffef5b416daaf0b5d5d716fec0db130caec0090536cd61f53f1003e5fa9c18dc42f5c330b8fe6c9a4935e9db42da6227bfaefb0de43e9532d21f391b7881c7f76a10264196c9aa26ecca4d690946269d4128773f16c99386eb8144e40b8018439b11790551153902055ea2663fdeab422233cb0e3800cd8a7020050c41b38e6a0ffae5ac88e442862a42332fec0f9433d79125a425ba24c70b4573b2d2626f791d61e9deed515e774322ef91bcc76ba4f99130f34c016d246107da88c2374273e98ffb7602c3a979c6761abdc8a19a67742427538b1a3b6a49f38ccd25b7182ec678ffd5c3bff63bd27b91910374a11f8563913cbfa1644079826d942f28c3d85244cb0e1a41e28129cae40df49745cd33bfc7b778911fcdcde57228177605d1bc47ce80f2903bbd8ed80277c2118b39798f87c31ffc1f0e5ff3677e5e53f541583346e16bb258af7a396b16e84e0ee5b0ef3d509643d603112322ac377afdf03e0172a6fa9aa74335e0091f58019e54cdab7e944d56d0680eebd5ff1801c1ef7dff83c339e4b0a079e4b0315ff89a0b50bdf740beaf098918f9f41088eabdf766dec88c45f35f8df747e6ccfb1f9a703239ac5f334ce187745802e4cc0487f51fa9be6936318da999504d5fcdffb0bcc7615007d15ef3ab79ef83d4d484aff935ac67853fdf7be16b862f04785ff341bcaf097f8c80cc7ccdffbcfc695eb23e48cd4cf872ef83cc3ccd4cf8f29ff19ee669bcd6d3d474d00254bea505ba934371636067f2a5169de64beee454d4475d94db432ceed44950ee1464f5a3fad53b943b2d60155220a73477f2aa38aacd3ea7e9984b290f94339af43ad2d1dc21e9eebed7e5925e28a5f5012dbabbb7839fc3eea639e48efc98ecc529bb3bec965da48d7877347436c7032692e6a18f3f2665b247ce205ad417292515593e0a0e90208490a70e52ac40210cd5202ba58aec3fa5587fea604576b17e92303ec78657c8b54c762bddddaa6e7882dca92fbde46a240716f8a3c97348183dfac0989412e63547f697b0fa29b0eb8fecdd7fc20b914db7392f40261ab4e840c68b306ea8412cb14d7aa82f7ece5b31b48527bc58b550c33cc1b48277d1c2e54038c3ad6d58704ba48262b663b3d25a690d16f097a59210458c21c4942d4244b13428e91c2658760068be27440bb93eed5ae9bf8e00aa1845193d512962d43f2f9411982deef9a51941e132bb7928eddcfd7a97a500168a64f76e760a159986f386e3ddc2117b8bbea82c042656b64d22348f540a6229cf20bce45492d29424733ad7c4a9e3155869bd7a3dfabfb3877bf94f2499c8ad9e5ee656cfd4864cee06b2c78625348c3e0d65c3c601f08c2040691ecf80a4995640fa804e7d053a54c20f1e4bc6abc210155aa443c20a04812f7d2f2e2a32a514082fd1a73fc42954ade17e377b7bf9e9f0d1dbc66ba7bd96c6451e71be933623df9f136886938684472fdfd4bd9f0af1a4f590835d54ffd6d0fefd8e227de41d7bc98ffdc40b7b68389f72bd3fadf4fd09a57f7669f55d5cb66071519953eea7eed3200273299003abc0f38fa84dbe3f6fdfa121fcf23bf768173cb7344f33d5ecbd6f5fcb3ce21291efbd6f8ff09422af0b04d8887b276dfbbbddedd29f9f2c5f51facc21b973ffbe0264cf8442c29898b46891573ef8401441d0c686c5baf77edf7b7f9cb4fcd7730d6dddb5928142fa90c3a40fcd15cc60aeb5d65a9fbb628bc0435ee7dd6ae55ef0e762c04745cde3ea82bd86a5fe0643f64c2aa496fa4c4c5ab4c82b1f7c208a20686353b93c674deed4af453e44471f9252e4ceec41faf4d76642dea85f8b724861ca9d8aa536538bf53beca5166b95d4932e0bba1916a64c64cf0974932dcd5b30ff205b876cbb06dc2b8041a579f05bd6db6f26b2c785ba903ddee430e943b34dd9af35acfe3e0b9c605ab48f417b05db22b037794f7dfb2e54e59d496a81d2619b17712f7031e0f9d43c76c4f387a25412b875381572c73a90f441923e7e8473c081b43890088236360e2404044e026f368923913bf6534dc224789c4dfdf3de24202bdb5a3b9de40e7d9aef4f02a3e030fbf762ecae1702ead30f529f86488064b3995772672d18c038bfc8f6bbc8f683d0a709914c27c9817d25773613a2e0d65a2640b98588b2fdb63fc14481ddc99b869ab2c5d247faf474923bf6b3ece91a562061f69998b468b922af7cf0812882a08d0d8b85b36dfb6058fb36083c7ad9be0365fbd6eb99a00cae0041d320041843d90801f6c068f0846590400c836fa8d0f0430f5e7e1012bbf80106b10abc7a0116633420c236592a159d40dc01d764a954c484175434d001b3b2542ae2c1865091932745405ac4d8a0c953161867a944d4e5044426d8801605080606930649b863a286126c97304289e8034c4440d8d082b72c958878f0614eff6eab57473a6520696459abc9f293e5947f6c88dcc98084f573b1828c269cbdae7379333a9547af87adfd6ca5ab16f67ce5ad4a2ddeb6b0042379ba2a75f9f43a4ecea7a33e6bce1c8b43591c48a704e1d69aa0a6bc413d29592d55cd274ef73c2a6578d2a3299b1befbe365b43c16d9b7f73f391306987636978423a413940381d9d8e3f59432303261e0600e87e8f36a98c192e9b9b215907fe8694fef0b1e6914a4a185dc9743f980274c515474041c152a58244169dd36ab7f196b0b91893f993c78e7443cafbde5bc311d370e6de5bfc28b7f42479073ef83043972fb490c169e61ea81285cdeeee2d031e316e9c7657f3c8dcb31ebabd79db7bd2f3878c6a356d4e9f41d3c1f1a64079f8903d43648f321b903d3c96e691251a1275df605765e50196d0b0f9dc93710ee540bda039e49ec354c90c85f69caf21dcca5269862a799c41b98416271641997beefdab7fb7c999021d227de66637ba6ddb6fdbc681258077ca56cda0a01fd913812119909e0464cf1087bd181ce571b3d611ab40f9b5825c0a747a9dfb5bc2b7433e51f70d689ed8090d6891c70c2b37067fc63a416207d528d149efe92b5f94116a7532bbbabb7177775f8735a6d9eb6eefeeeef65abcdeddded6058da4694de48efc9512980cd49353d214ea204a29add45b4a995c1aa294e21a9e2f7f8eb329cba7b44b8bf273b4982b78caaf1183e5d734a5d49b524a699d492df250f711e0299b5221f49fe60ddb2f3b245264e645ba6750e041b55aedffbf56abd5fe3f6989e9ffbf56abfdff77d004a189f4b964ba073b3d413575116e72393d54510bcdf0ffff1f4c172e5b269625115ca97708171dfd44ba40ddd3b55aade8a8a8a88b7e740d045dab0975a935d56ab55aad56abd56a35ef367501438518649eaaa8d56ab55aad56ab79d01fe9ec745aed76b9546767f267e77d95e33e15bd57b5f26da3ab5837f32cd9e4a2d39680986a28788f283a2c0578662061f55960fd16f22ad21b8a0cc8f6eb513beccda709824b9ffbf26717f9134b6c224d2bcdc3bdfc7ea6a79b9ac9752fc62ed72ff912153ca548ce225a4fa12cb97f9c4eb2fcc9448230b1cc1bfd92e674c57c856aaadb50ba85baa4165241518193502fa95a28053912d63d0b94123697963a550bf92a945d03f2fd2976affa7a7c4e85aacf87ab64119e3fd4505aeceea1bb86b6e22aea1bb078ae610bf50bf5ea1b81fa1337fc277b0f9617f39e6d06b56a0cb0102247510b5ce00596284f3851c4154e30e960adb5b6061f5cf08219c22ca104083ac9cb096e1212a37ac55092263b34f1a4cb17274e6c5189b842cabdc208870eb2b8e00b185b64698111f5083741e1c15eb1c24cd312375ce1845382c3115a94184af08014461d02045c962748ee155090d45a6b2d81184b0606ebe58a1a85972c668a349822040690c00287114c11a6c9163329a7796e9e33c9262182cad01412601ebae01b9e10a203415d82a3329f3d8284e65176c90e45a61ae571d226d05c32859c8825398fd34af6a67214953d004d8628ba72e5ca0c2cccfc633c4e9072e4055f4039e1441033ff19348b3cc9aa8e58248bad73e0459dd8d6850a76d8c24b91951cb4f8a18bebc08154134a6e70128515485e70e1160890baf9f385807bbbe97dbf79de77537f5f08d86c98fa1b522e05e688b5d31008f75dd87e432e1c63a1c3a6ffcf7dfbc3fd06e4be0d8170bf85f8b3c02c937f8ce8ffd84ffd6cdfbd7cff5e08b09f7a20f653a10864fb2e7c8771e06bfe1b995d30f5f7132067ae90080e2be46cfbf153b65333fbdbd726a6a47207676fc0097247be6784e7c75a942f71748fe01987dc915fbfc0217da8b4b96a0007e562381a70824c862079b6cfb593390c662061dcadc9a59e2c3dc81c09997ad0352a1a19302053ee3db04648a63f45ee7b0399faf07cbfbf03784e4d231407acc608ee4d11ab570f87f4a13e3bd596872cb616ac68e10bfd23a4ca6502b422b43801921034e952a72c81258621ea0b2e822f5c1430d45a6b350192db4215a0285a40e22f7c0ece52e9a8288f1fbb5e0800093cbefccf1175ac064af866a97434248e81b72c958e6a68131c31b9329924b11c1df132c6568778ca5d964a4378916189b5d6da301f688d59d244eb8b314b527004e83b526bad958b0e1c145c8078a116610598302ab8428c099284f1c3064518474a66b8ae219686b052a543681e2ee575aa6f05f290b0fb52ca5b94650f7658d3af3209bb72c9089228e3910273ae091cf852bc2fbf1ed4f3f6f8debb59db63ae902b5117b61ad65a74a28eccfed441c47aa7bf43e6eda6783856ddbece3cae3ccf48f6c231a65219c92a8cf11bc9d88570bf92592564f51cf72bafae563be4abbe7d16a8d330fb1514b9d48b62f35831d63cdc5bee6e7fef9c77daaeed169dfd252592f288979440ca7666bd68cac9f62f879f7e3a2c70819953bf43666ebbb5077f5c0a9c92b2147024a9a3af7a5538aa8c641a8e3ade774672178eb1affbcf48fe7aacc6ef57a191bc0a475927a4be4a0a517d55a55eb5a382ae56ef90d95efbd95a6b3710079939ef9d3766a1aab413cf5a67752ab3ba2783a58023b516a50bc7f2c764217c9db34e20e89c73fad359ebac4dab774e3178fc1ca7230e32b5d6d818f27ee02bc834ba3fdf2bad94d254caa6524f53a930265bede05d1f62caa72395024900755cf04542cd1ee851fb77bbee479c5a4cfdbdf47e4e419939b0befcb617f5177d9a690c31269c20bc796013d162313451327b05f929229d88528299117d2f7c059929303935cde67b2ee6a6eb240a542a0bdccaf2bbf995febf101aa02fa8b46df844b5643403000010042315000028100c87442271402498e8c22a7b14000b778e3e76582c1a089324c7511404418c318618400820001162184254441c0020516c50695ce0c5a843790fb716cc6ea340f88e8727bec67ff44a591a7d4a03d016515bb9882701a944cf604088a9ac816dfba7aebf6559b1951f11acd87833f99578132e8b05894b0396bc3c14fda0d81c251ae4becb11b87d6df5b3b22abcb0321eda997ccf0553aecfa2271e5203fbbb049c307d2ddd77ffdd1754039b8b1d2194851b34e639d94b16d7181c34417a142328fc0043766f574ed165c011b932275e5aa5044c2139dae091585a8e578a2d1336986dcef41d8a343a2909289e66c6fb733806b46ba64a4123c90e2d87cd49fc6e03bb9a0322f89e04b7144b6a4664b0e235b373cc9dbcc5d5e9d5fdb4c8ed074022da12347a37f75f2637d809ff5aaa49c1207e4dc0ff36febd6f733da9323a466254a02390fdc1ab8de241832d2227f81dc8894000d566a6afda11e08d31ac4a34960b097c22b653a056ec1c9659af2a2c92d5f952168d6d5986da6a861728ed695f7c6c98bcca5dc585b20d0518e6d7556507c6ccb4a8aa2567ab12d6b5f718f3e062835b4ed068940d137ff25650e8471bd865f927fa139ddf988d7bf7af073e58f322439d70bf6c7bf81e675361d6008a9efe03c9fedd952df8c548de5ae9927cff1c0ede0e57e01cc7b5c0299081af12e7d99a239d46af049179cd0789f2245cb38d45bf2015786f07f8e1a444d1c025635f92dbaa09a50a1de1fdeaf02ea3ad1850150a7045f6e050e9a2af0c47432503e80f843ffd477f8bce44b7a47a9ec4daced89ff4d5e0b1d45d5fc0c678f68eacf4b061d677700538d4a1cf10b87e09d69bf802f9217aecc4edf23d0ace0ceaaac108501a41eb2d5ddc178b53990499e3bd7b804cf315ddc373618138c396eb1b57f2049a2483ff4f90f0322dd830fd256ff00c58a483c6fca47dc0dd3bae6e76f484a42bfe1f7a8d396f725d1c9a65527795a846f3d77abd5516e4b1c1648c87d555170d21316494f28c21cc8b32eba08697c5b3e01b72b4be9a80c61682a1861b4266e0a026a09947b0c78eed58bd7b674232d34f3ee7f09b099ec69e57efc7cd1c6a0907d1d0b3299df18240ac9ed79905926e52d70c2b08e8326c3dfcc503b8f21d7e589eb1260be009d1fce33223a67972f8dac80c55953eb04bfdd6b53088b008f77a3471df79b12c164b189474cf3efd82833d3db6ed2baccfd79e45b364011f2ad740de9a8407745e2a8d7de6218527b48a82ad9e5979aadf0ad542059db4e4eb07f06d3b5a0f0311f719d8e85d7f1080d21523f8b68c310950d4300d1814d8d7b32127e42d4b5553eac0874ad205acbfd234958e4a54458423f57cba213eea0326806bfd7a5852a4fbbad310b100e89ac16834a27c0019f7406e91b94b91acd056b1e086f0326a5e1fb51a64bbeaa56bafaed72b597588ecc825c9f9f1d18b473276ebdea571e43284a417ffad8d58c788d207cdded3c885732d27e8ba41f2c5a5d03f1765913064f5e9dbd73d28da823dbdf12dc756b1106e6793d369c239adfb7dd33f786536e4189798ec9f9ca3cc61a638e4a5ca04083d6548ef7bb3e1bab03d208abb117d6662c2e16ed826661bd35e3aae3426342d13bb8e7c569d7d719931ec6d173374fb16bcecf9b05870168fe1508c6eda0ae5867260ed3cbeaa26c4815302c657c4915a5af1328cdcde240804e073031cba83425810c6b8013a379c53b30b17e3527a427b35937213b184d4132e9948f5438601f71afc250e2c874f691eafb9a1a88252063870888bc49ccd9e60c85ba3651afc0b875d9e0f69f5910d01be54d96a5bc92d9dbe7c20450de810987c49b1ec4a39c71e988f3981762514d65a19446c0ed02a648abf4b43e7910c4ee677dba24382c020ccfe9f8c90c81c12fb4c9a675a66fe31cda40caf4f4698734d3d8d1041ab89e910b5c700634d049f665aeb12d6fe1c771995dd38518b11a01f0fa0a3ebd4437b8733e2628aff07aca3fa00d3b69c9fbcd178bae094903a04265bbc15b8b67701065c920096c17a21aa166da90b79884decf2d5da173f54201b7919997b71bb9ab38089fdfebe4cf5c88ad97802c2ca559d966c49b1caa2065e3bd18cc909659a7da867a78ab4566445521db5e200f5698186f40151831a1404ba072a1cdf1ba4319e93458fa4db89c9679a2b4bbd895ba381cf36372b3dc9bb3500e6dd863033007b6874ab93f0e2d795e650d0d768e9eb827b654bc44a5cd6b404ad7d646d3ca8917eb37868c8174fff3eb4372d147d9d1ff188e24667fa9ee0968a7366c10e2c4cbef1adc26085982e28947bbb1c907cbf8363e5a3c4a5daddcf20f8e96edd4c5060ce4b4d5102f4dbe2cfdc6b523f559a4b7b4df7592db24bb0fe1038d4813adcaa8b42055120979520b5ca66ce2dfb229f4be442cd08941a1591ad89622a79db854716fe4a94c5faf8e129cf94de03152c15338c9c68a0790bde558927e4fb6f28b26fd68c55a61a1a8906bd6302deedc17b2b996b196186e54a13cd3d7c2c407a9e284ec8dc8add9b6fd1049892eaa0451f25be43898ef8d567697653862cc6bc1628fa5672906520457d2bc90a4df8c8ba0d041aad13904562a33b797b1bf06b63a33bb5d9602cab57fa57b4c9c729ec3691d09be1f09415dad8cf364190135a7898d270a88c1c200671b8e1c767971b892a02dca774301a69c277232c08c7739d1a0ea04b05e44f67a84c08d1900afa40c3b704c9b44bbef45b57eec3fe374b339c86451ce7300f0d58c0c92cfc22850e9c33d3806099e4dea1b02589b7d8a2713799084703ca7f4e5ac476d70fdc7a6979f264d810747871fca9237808392b5bb4ca721f4c99a7a82070c65e7794c4f35bc4bd1aa66fe42e76a6de91544f5e6a63d7d77c9e190d0f5c00c91a5bfe856dd3770c5e8b44cc5a6b145eb348b578e9e2c74c6b9abf4e4c67c473c8e91b57f595d54aa527c8cf69020f5c195dc4f3cb351a8ff6c5aa761bc46aa706c7a7d915363791a760476223edf30a6ce021b82aa8a7c3aa20603d009d37640a3d91e0e26b0c0eac4d5165ac679aa2884cec34761f38dbdd1dd2ec38dc3a31b4fb88812546426777cd3f8d24dd4840b301bd1f0f7945cdc8efbe6fbaf30fcb3f6033def57b0520255f1126e4605fb55d2544a1d3df0f77c64eef6a49dc46d89373c6989547b44d06925186815edd9cfb0197be2352f67b36f602d480af3c620ed5a206320a36b1529ce2d9b5038061bf04e5de27b0eda846f6623c4a221fd76652cd83572c9f2391b4600e92d9e3729e0c005af50d79013f851d7c98144ec7d9733a329861b046ae76e4d228129d8d46fcfeeea1580586971509264008285f2bf81c6dff8e9b3efba76dfd97bfa8fa2400e1b00a77a75e2278d42852a52d3037e8897d437e1afad513ba13b24821b0f604640821f003706f93e6f1936c0802995ec54d54ed25b18e5a9e4877c72b7e3f9b2e61f8041f3cdbdb019f7f89a0e1af3fbbf76140ce2bd03b89e16b36e0d52b1704d020a129bb7339b01ac4398c614162c0be8b55792b8cba87f93bb602ef2ae0f499b9191132c82edaf336c43a81e142947d037e217cbd06c9256fb496e75d4cb0a48cedd2cd3ce05691a418996e99ef4734b59626ff43a8677616ff544f830985dc9ff8e4668a5ccda95efe497fce8b890172f6ed0d254119ae31f69affe67fe8251055c84bcc7c1cefdfc6a007dc9049518ae28c4e559c733f96acb5e5ce305cff268f0e234be81045a5e9ec4530f2ebd060c813ccc892bf88d395782fcbbea4ecf2f9e95f91d090f47b2c9d1ca48058de4fdcf60ce8ade0916b2cfe757f6feb9d2bbd9f2f66990ff89d46eb16f31827665765909e4c5d2dc21d2706cc273b9e69fca00db21273ed7c06effd3a3de8ebe8506f5c5626f40927f7b3061172ea62c176c449fcbd5c9f41e30c4f8818017b9ef54531cf731415c7e875f283e601d9d3234f4fec46018ab325e6e9fb0dd8bd58f741a7f7832f8bdb81eff1b8e30bb2d955ac7c7643ea6d1a99779963d6a4d811629cc1975b20f9af9eac32c67eb9b67ee3e18d48ba7c6d8cf7ffdfeee7fba579caf0ccaa756587dd14e6aa8e49e8d79062aefa82e723228a2aac0da806056f60346e1502c376fbc55e1c7223245e9af5b09312f819981dacfbc1105996e88f27b6d2a260f2b6ab12d9b3386f80d78b0951874f8cf63133dc63bb2ebbcd76fc2e8805d8592c5685ca52edbd920df6a4b53718ed2d791f9005e00d1ef679edcd3ebf1719f808bc9c700ec06ace9efbc31d32fe3d033560c3a88cef583e0e2ca13b574c13fb9b297b9d74effd5a4640313abc947bcb48235e330b49da7720cf9fcccd159616af63ab41f5bd0478a8a602d9bc9345c76a1f2c768d0070bc2df3b9762e401c97e8bb2f1d1c6d19058897f729c16fc1cd33a788d110cef8c3e94e29b425e7496b49b33c89321d1774aed8e672925c966d7903d63a11b64323fd284267a03a1d5fa3925e58e785e51b5fd4f6fdad90eb72e7815b31d30f266b8c2f81da0d6983ab8c9e22618eadae426de7031deda7ca17804ef99e46544911d6a769f6ac7b23e441bc96319da1c8323726704782029267afd29635a373c2f97ff12136392efd0528bd44f635503d2b6a7aa3dcb7de011973d9547c7339209d46e40af776701ef86499c7628ba36146d1e12433b552fe630ac42bbe30669a6e871ef3d47e93023ee883ff5300c865707eec9ee9a041f818cd4188046798c741828b83c06ba351ac3a22b6c5d6e905d38ae6e37c40f0eab05871c69e0fcd2a190eb4311cc53219b458caef1b33cf7a71a8e80fba422cc9bf201ee431f7a0b6e77f411ca25b0cb22cdec8c9042bf84d26ef4de0256ec37278ac8722e894c203f5feb8ca2797a02f9d3845afbc130b3d9ec75f427cdd27f7d0449b07dd2a95f73c79ce9038fb03d2af94f4745114b63693ed184d4443adc1c26e7d5f5dc574b4ad1ef626146834229e5c9ed63185b7ee020c950d1ca715589b0a95cb61a2637b8bda10120a0335f616e821e4c2882b6a2bd8fa25bfa88924d14d7e2292e54eb4f7233ace3da17fa6f32ecdf3bf3a4794438f3b9f832e73723d0d393d5596eb48501bfcd3280e11c7b70a73b08927a43c4f28ae722771f07780a46e16bab5c3c937e23d8b55397514cb3a5cce89459f55b72b4088b91caab967ce8fb007747b3f38a3377c599d1fbfda1d4a7ae65002face8fdaca2b083553e87de3f5896e02805156e0d71ee5944fcc450d3938016013a8d0d709d97fa9948ef9207cf2e620eb3f2bedb7529e3901a75719cc88517f5102c4614d6253d2bd9d7f3ef1a96687742503a0360a71dc85094c76be8cda0590c17f0f5856b6c8e9c04d9816f8fa53b6c8394a6c2933e093dfc453042707d7f22f6aa79bc4e0d6fe2cdb17eef233ebdeb8570bbf30a952a69d90df002c1a0480005cb8a6a12713e7de42142ff5848b3fb7ca268e3e2a3b68876b6393064d894b7326f428824b0042c324be77ff4145704f90978a4a6277695ee7ac18805e2ed13220491286fd1039bf11f3b1610a83beb79f175b014af4ffe380c305f36abd6dad40e8e3339f4190bad78145bff7d0ab424c4e3724da2d3e20512c82eeb3075a5f26fed40f12974b1644aafa62b1e97558fc072255533367b0746defebbaf63cd091f31e5b1f0a80e5c22c4c34e1ad68eb0da9b6e09e9df2e4b0e440f8f10812b210395bc14e20474f06d54d54ad78ff27565432b1ac53dd1d64e3d7e9ab7f50875a3c330e759e76a60d351619070e8a1437715316f07157f0333351c899deb20820ea568cb675b71c669325247b479216461feabc23f2797848c42651ab3f4976d9de701e71d5df03180524ae6cb38a5c900f8924638d9271e1d4aee733217a2220062ef1ac5a6bbc00a09b7bcef4cb41146fd734fe0021f35c9287fadb76cde9ecbf00a4f8639982f1e20e837f12e970b55d1111850b10aa575306cc6c88937e41ec789a0f81da85df593a2c7ee0d7185a37efc0d726ef8a8daaa73a9f1b88eda2da7a2624a503349499692a1686c99990affad100801a63f31e2500cb32ed3edd8d85746625b5d94d4225971d6647cdbe4bd87d8bee7d788c2e16218e7a432810dcd67bc6a09266c149f3522282231aa885afc0dc742dbf2a0a645f40e10621d709016b6dc03aa38218ff47f8449dac78300e3abdc899cc161122be8f82e7d86395571c8db99ddfd8a92c2efcd3c0e9c084420cc8b2aa7d4846800d08002259b3ac371590cf50b80d50abae4dadc004c6fc387daf60d0f73e51a4ebbdebd725381e06c13d8afaad461d4bdac6dfb347e95fed32dd84707d07f32ca6244b938a2df10461f6158af9b71d3a2c966fd4e73dea272950b851a9846c02d36ca02d0b4c621e92e8d7300e05c198977b57e34aa1f504a2cca1f7609b776c55828c90c35a604d1f1af9e1e7815fd1dc88852026cd817d3d94a7aae6155ff30f6903703fc50f9ff9eb9f32fe84aae19c40179be7c0e0d927fcceee2312394cab7500696461cd20543469c71922e4c15f3a2840d5407946cb9c13cca6667b9bba34ef5563a2fd26b26adcee9eaad40c506deb068c87c28a25ce4ac7193fb1981c7e03c56ccd12bf8caafe96371002092766ba901f13c105ddae20b71281e304e62c78ef5ff360869eb60b84e979baf76ded16721e89990fef9757c959cf270fdc9007a92d0fe5860f744b21dede2b55f9f9facbed30acb4f27b4623add5a6a1bd44b4074fd531a3e8219129ecc41d81e185dc3b0467fb2b3193cbf141a8f30baccbd51f155ca065344ce171ace7d4a80585a11a6c073a9e3282a338de6fd909d7a9acd2c9685806d11f6b7a7ec843690d08de4758ca4c016eba7dc9475158dd36f00990189bd5b07a54f0256b2b59f1f41a361447127df7aa29af93fbbb1ca757b2b221c4ff0b4c464656ba560250a491a1fddf9344815e6eb19820539aeb0d3aa57ad05424a6be231b5624c67f5a3d28fc18442dd08512d909714dc8874a1c284a204882677679e184128b933d9e96c3a196bc83fc902ed313405ad257de8eaf0c1ef734314afa34d22b70319cdc419cebc698275ad5a7e0f7d0e3ea6634d65714e8183f24c12e8eed247cc5246843acba50287daac8dca394037d93e7e675890364fade86dcf4d2f603b7ed025608e698181ade8fe74a183a460f203a03301d1b6d687b5cd9af18f1266299f29bbebd3d393958679948eff17f5d158dd1457c15827d625e69fb0d0994f255bec67998c9ed902f3154110514b6f2984cf68f5cb7832b6808238148056ba51412fb86afb38d65140d111bf3e1a0d6b5febb1cf09dee7ff98f06b893b65b05a6871d696b1708848668c8621a0858a0aea2316c3a20e1e9346114f45f2c7ab3ba6529b167b7dcbb1f478316de045103127f2830ecd763d92e2372dc5be9d1daba5e0b5dbec18763e8256adcd88c32cf1623a6f54e8bcb99bad1a52ad75c164fdde84c114f6257022b386c038193941422130a3cfdfeb95c416c53b25ebe54777de417e7a79865af4a207329b3f84f366d0a115a3919490b917ef14941df2c6f27cd04f0aa8106e628e92c76b386abf9a35580c325f239808d13633d2359c95f935634f16862110ff3dbb64eda2e78e8b3408b41df9a142ab8e066798910c42a2e2c86f778a7c4c39fe0536876d398fb901f780516ee6f9ef91c001a22391747873aa6dd654e70d66690494da4be7e5a218b911f7c3464ffff6ab5c1ab906105991e9bedc147b01a25e2358f3e3eaa9f7e2cc1d9d06870495f6b00a236a19e17dc205baece553bc2f94b87286bdb113a4d907e11fb802b7fe0dc3748c6ec3ad468e4b3ed691b59714e2f8d78834f7b986706e245d9c5cb9c345d7bb1f6a1137232585459feff0a33b540bbe0f55bb801b70a63ee3423c03db16171fb19821ea326dfe2b6b058de401699069f75d3126a97a81111305bd5b336deb48c95a6c1d60130176523c1a6c1cc658912e047c54912e0da4c0514ba39f9e0cc0d06cb97dd6c367b37d6e4b20fd160b7ab8bf4bdd8fd4ac9920bc6742307d7814a0d64e44f9b0270d492111e8cfc43606b7f509b96ef2e9b1afea5e5b380a4cdbac54b35c5d77e0a53649601884b4e9dcc7265c8e498f944bd43268364c9c57306939b6bc52edec8054d740555c151c6b366a55014353356c4151efe858e441b2afb29f095e4aeeca0a9ac9c91e50b5616c75e515fb0bf67b528f3938124b02d10729b82cb0f88bec6836f3e3548a278eaaf5e6adce52bb018bc2404dcdbe27e4ffbebb16e9d44cbeeddea399ee4662674a28a2ed795576d3dcabc62044de2618792823058d130f0f1509dba8dc43108731970f7dbd05fa5ff17b93b6ce01e5141f63c36b34d11cc29939564804b9cf98fa249f296e16bbef9e1a791500b98c12d3713c4ac9a4cc2366519616a1fa155cd1146e33d8d35c111406c1e900cdfeda1e2bda1602fdb3479910d1254cce02482bdac45fe2188feecdf23492ab460f7765237debf4fa8f7440004671866716f439c3939aee079ae57790828fa349bb9d263a6fc53de1aa65f7c8343b6522fc59a19dea1efc54fd92e99485c3eaa8bc392d5adbe0d2c742cc64d08d007bdd0274dfbd7e4e16846dd8fbc017e984929526eda1fe97c23e71d8381d45648df37bf40dc991d9685a022fcb2430f73a8d1b755e18dc7a335c21f25552c127023ff180623d74fb8dd498c7c0c53986b17384ca4e0b1a67b96217030aa7a24d6c39dc41cb2103491bc06e0cbf638e0967e4d8961d5c5371bf354eb9a6a7529db08ae3ecd5bf60a94215cac55d92a107263f92e2aa3d2f82b120e70737471560f7b132f5d6195b82ceb476ec9a9f86afcdde12742402a5c9b227e582e934e83f8e04cc31d5072c195b491a00ec454738a82b297e36e1b334539516d6f86356708a0ad91bd17a3e2861af30ca145f18c7c98b646ad40de9478993f9918c256e14240ec424ff2200c2c2e9ee77c057e3cedbc9139e2b92032df6e4764cfc00cb65aae672077e2949452beb6341536ef657f79690eaac86aa564a4ee53279d7d0d1bed754bcbc7a245f24a7af98b0d3441b6a1916bf360ebf583cb3968289a564e3bee2055ff209388f81058b852e52243c1c49d7bb9553d1a7b649ce25e6c4a9c335932c39808f37026ea32410be16d7f918bf9d65221268f8996c39bfde4374b02342db7ac237feef2f9ce33994f69f633361f40cd70a9e6550e6c6c6336706df0950c26c55525a9f44bab34ea4a8afd1217c9e9d685badc00a47e5b009e6b15417f3c4591815b1640ce00f2774ba163c94449cef009505adc4ba48b53c434ba1431f1f818916286484b6ccdeb4f76c9259676a760d0f2e9c4695fecdbcd208b0e41e48ed125ea7a28d9be7c7e9565f5e8c921f2bce7c1fd8b03702d2831c039864015159fe7ea8654fde8f5fbce48815bf8955762b616da05f0e0887f2bb9f543611ccf635d94c3a751da38183f71316d079c35b84d7a9e628466c05a04bdc88d3979fdc3fd67c08e578541e6bade0e3161a7a8670a9d294c18f38dff319506a02f9bc8ad80b10d6cce1fb2e68f083b03d83cc02ed8640bd439808fa0e902e9b1bdb51c9db84a41534b246d4e5c3ca981264787129b1164a8d6456cd57d4187f155311b785b7f2de477dd1147a6c114e445221a6ce380101048e1501d44f5898136505f6841ce181730c0e68bda980f9804f9de6be6d8c04235a470124c35c3275b6b78017d61b3f6b8d436161f09091c9ae7db61feec1a27c02bbef8b141dfb41c8e1e268841a225e1fdc6237f6fc61461c18aa4161d06920ffe6744c87bb25d75a6308343d378e13eb44ee71f45f81b16a12a7f16725efc8cb585028e814547180d708f0a2c98d102e0f5a93cd99ac08949ecfc28accfe672a8b9dc0b44fcbad8fd1d461c76a4785d57f3b04ad5f994c4f8a3f60829484df216ec4399961eedee8111bb59b041e9232cb2e5993bd508f2dd3f02caedecf428c0189316ba87f4fa5819c0a9da6a8396dcf9874c9bc4455af3a5263274cea2697faf1f10784c703a3a8079ccc0f26eba12497080e1e73aeb9a8f995a63cfe5a93ead4e1d7ed9921c0c21b78af7ed9d9d516ac8d00726dc9d5c7922829ff2654d64ac3df22dc3e9f27f78b38f3f6a80d63e1ddfeeb59c42768c893168edc5435f85e6a135ca7173c5eb892df138fe7099c7c8829fe128ef49ab75ebc582d3fec530e87b688670d2b3f51a59b437289555cd744da04f10a7100f8080d8d13915d5029a6771b63da6340bc2c2b6cf1e7d87b1df146480e60fd6c53be531c02d7f31a4c50820e5319c61b4931c81b57f89064d8a1f5351c85386f431286892426ea9e95c099215f68c23817d38315e580e39936975036569855f2024f0f339652b4c51e85c75740ae3d9fcb882437dcec022489ba24b4e6993678fd4c85cb6493e69b4ac192fd4f77afdd3e09c51749d9b93a75d90c5ece0c6bd9eaa3a37a5612c74ba301f3eff94add6417bd2204c220f90dfd1c927d606604f87ca2dea73556214ddea13d917414d96099315a11c3d302b2b70961aa432ee50dc165bbba49cf4481907e71258e3e5a0734d19c2f008206abe48c8ba99067c19fadaae9a0899c96abd2ba3ab69162c91a215d5da5881e614f751c69a74c5d8ec0541a44321a03bf1bd64ee391915cd5038d361e37ab2792ac553080363067d2aca54e2722fc544d63423332d8bf308cc08e3d08c33f425ce8e346d51f7e7d94c3cc1d1b7fa20bc3b0b457824f69f89454ab1e1384c73e0e64fd7801919cef697dd5c24df6385aa71062d7e3a04952949e71af3804bd0b3d400cd8cf99a4d4460f3a05c4942d15477e4143f86439ee2be46286be9d90229b1d7881036e0aa80270a7e47164d5b8fea73ffa9d7657d06ce2b364414c833e08604ae54943f49c1c4f7c89eb0bad3a643f4a7bbbd4814726d02b7bc29f6731ed9445a2060d0938178914b0beae8f7e099838356247ea574a3f9f003858424155aa5ec5f318ac715bd218531d2626e1eae94eb99eeb1660916db862ed52f8fbcb132f1c00e3c1376729e78b6e1d22f022392c56cb67974b5fb413a1cb33ca5dad651c35be0ac24951fbaf1c6a8b0e93eb9714428b36af1a3c5f6995523ff86ca18ada0e1b6cff976b0cbbdae3162c284d0474c76219d3142c86f1a0f83351ba91fc487d863d747aaf3b0da2d72cec230043712e2913822629c2d91c62a5338c173fd7228d4769866bf789bc1e85307bc81fa78b8c26c24921b415ef83f2ab4875353c289c387a9e613003ceca0ce96edc0430c8f7db88a81a27067ae909a2b2cd2c8b292459df237653802698c8097552afb80ca8ce6c782812248c4bba259aed93063395176eba28cc17072f5e74c42e4ea9081ee104b169026353b9b976470f4c72e6fddd8f1e26616b5677e805d3d2ac71d51f895544efb86f0793ff0c8b699ea4626fbb2336039e2fc34ca11fbf1aea1ff22461fd60bf7d86bcd6f8f9ae30059de7583b8205e240f05a6f43b61d1a23545c3d531801e60f5c0794345072ea829a7f5084003caa1404b90c9ed84876b9c9a7499308a3e0241a4715f779a33cd5f302756b22df7357fb1a26bab7bf02d2aeea1db427a784fe1a9d878806a85b1fa13fb44416ebdd04746a4245ac7b06423ad9b21e193d5bb0ebd73db5fe8db522014398110173f5bb90341e0d9d38ac4f0990d553be5215d6da88cc15fb5145562bd38466a40dc320aa757493a26e4bd8cc12c5200f4c601ec99795c9210c916bb8941452bfca5eab46cfa7f1f174f4044db3d25c38b3349c5675e004c4d29afccbaf0a363e9610678b55dff82947071db794d94d186aedb80f6ae695c2194f3c7cae24d635670899d996977f0b4e3d4ef54190f2e9eabecb611d8e7836551dbc35009415cbba97e50b5a864094a55b5f20bb49b14d7e15f64cdb496bd219f8267b205aa024299fc8a5df6a7f3f7e94a12bb25854e64b6e281aa943854dc3c31a41a6450c3e1207acf8af9259f792fa99350769d58b6df6dbd1522e7596b6677b66a3f76be6f030e06acecf5f68d8a40c61d20a2bb01c22d8006f467573cc7b600f9bf859aadcf1efbaf2efe1590c3541f316428d05647046be359a52d6328fecd3f17c93f8f6847b2314e552497b4d47dfa1d5c91966a806d1636ae7df95be10bb5dc3d0c5b3aa1157770cd26017947593dd2910fbee83996c68d2ae693c959c7a732c8f3d5e9298123b66665c4cc6e24cf14022179dca80aa8292124653762758480566c448f9079840b2df1d0b4a2b50f644264db1291326804cd95baa7bd0cfa24e649777d366b895cafd16a72b0208812025fa3752c8e5bc6818f5c8ebda7fdd367d7bcf3558e3c7e05de9430f1e5672e579c507279ade88a4b255c3e593f410732bdacd11f0d6ee8464b71c0023ef79ea2a7a406dd5e1be32e97c074e302f73b5d99661b0c36efeb5c721d8297b8b55f92ffe75640d633ccd3a44a2c29f639a6361e462db691cf6b32444d6fbb6c88dc21d63b8db2cda2f012b7b46bbe2b253f4a63e8d0f5c2f637fad48f901167ef8aed89c56b4e7bd5f515c605b809ff0f41fa93b1eb003b85f02ae24deb775aff054ae1a8ef034aded829c7a1f7ccb718d58ff522da9f9393dbd1f130bb1dd5cdb6ee61ac3822826f9f61a678d6f207f3edf9538b5b9014848674b5071b07307b715b5b6f93c871ff56b835457f63366df690e1f806609675b9b6db0af3571b0f04420ca7bff53cb0fb062a0c609fc715ebcad55fcd9497e4e898693c690d7153509f252df84b7e9df9533c8d022876f93c39e017aaf07be45c268241c50b613a830b550dd77e7c9180ee43bdaa5916cd223c1566e96044b96e8053556bcdbe2a5c3b903eea33055eb817d7c36aae87d795f168247f29f19c195617b2e40cd6179ec4bbc577f86cd74d46fc1dea01a4f31f0cf07a7851a87fe99d472bf65330d376ea7cd3a0fe1071380d19a87dfe20e16e7399a10ef84f1560b71b9edc08d4e2d22a6f78a89e383b1edec4140b84191317eeb39055ebe31782fec44a591466b45583cec81642b3a89a6c32881be04c743bd5483b7d9757e0cbc73c3eea1d1155f35bef6af62a5a15b48e58589cf7502dc6432c0da755dbb264a596e9ff0ea95e14e0b0562b6367b27442107acd36a6b2ada732efbb8346349a3cc2b148f8e5894cddd2dd0fa54087e800e8bcb067228008870660f41e9614fc98335cbaf334c659e3fc72b442c32f9f9e23840b860f11fa5bdc2bc99beeecb108f33be8fc359cfb807a56b5b661fa08b1cfd2ad182b3eb3d0f32cf68dc0ba23bff5e92fbcb72b133c1497be6a76886014ef1fdd09dcdd1d58094a7ca599d2c0fd99e351d9695d3dc6462e97fce7b823665d7c94140b893c51efc054de99e2fbd28fdd14b80515a91c98254199a9724b94c61a4d07c3cb19c8ebabe8e3d1fe79488b4652dfe9c0a491f67094c6b0602ac27d3e8e59a6bae0f71147c1d6da1bdbf6cb046d5f7d33d07d225e9cde1d3c43c479ec8428192e2563bee28ff769ab87badaea5a9cb2478527cca698fae8bbf59ac49fb63b13e712d1bc2591f2ab0abdaa9d3e11d44521deb07cd5705d453de9339dc37128e7ed3a52a8e8f8ae270ff56b3e9aa27b596aad85546b9f393cd7e05cf82d89f46848855f0d46a375b08c35fa8b37023f32bb39202bc853543d2b26be7e00dc077438d16d4adb5ca5d8cc13ebc0edabedeaab6fb9229a9cb80e6a4ca9af6df21142f93cd4773821d122a916530cc504f05a0e789dc6b5c4d45c0c3c587944c4178e3685b2c496e4f523d2499a8ae5741501b48646f4bc853c7d6ea48356c717311763a3b16e1e8119f78e78835681cfcc4a1d88308e58659ced19cdcaf467c6383ed4f522cd1292b6d920e4a3e8890df8d0a0beb3729cb54ff02580747172ed7e1a816d35123e32e336c26cb58e608705a78c6346d54f105dd93b8849f1a13da4733d8a46a65b54d2af3399994de7fdd3a6f05446c6a8ddc0e9908c15dc15cacfe11061ac56d0501bd066dd121a212dbc5dc880b641977c325fdfc57cc020f8ca1555e45de688208b5d3533425e706c52bed8dc4a47d5dd7c4bdab9348f25d3cc78f00d0dd9dcc4eba2c731b3f2a7f822858930eb8f8a5b24c8ae664f3b736fa65a9d7cb44e9d7f287492555acfd877544a9b8e83dfd1c2c53a7eb1f48fdb7adf90333a803b247492f5212cb69552b7c4e185fe58c45a12eeb2975309a4cebbad6fdcbe1b25d57aefe23ac25cf7464591e8abb495b4a31bb4ba73d06e290a70055cbda55a452ad41dd15add8b1ce9f8b1158bbf5a5d183bd5280393ccd0e3a42d1779d5113d01cb1539dad3aa061b9e30093babc42a2127fe57d97063f7798610b747f02c495b55f1f4a03a38c706466cdaf789eebf82cca093071bea8499e16fa2c9b57c964415419fa240267b33a50031f358b83de58360e209e0bfb43fc69979a47a799f8a5ba91165129a9f4f59e2d30d61fd6787640ae1cead847455f7d5bc35eb7f29ca7441ad3964ea300e5ef3ebba2bac00ad87d1886c8cc178bf4a13493b29332a54fd01f60405551afc63ec6f9fdff2b4a75c95d80d8d12210192192c6ba568b2d93069b8a8956c10b867d5e442e179426a2b88b213bba8cc037687aa499e0aece384522a29388718309f40d5f82942e2a0f337296f3328f75551eb46ae97225411cba07b7e4892d3331b9a570f154ee6cd99293d4e7d8525187915f47af3c6b395a6270a009b0b258fe00cb0dad6f668d1b71a335a551ec3530321c3ab8a04085574af56c120880866cb76a6587993ef5350a9642e810d2f4f32cd927575943b6834ea1785424080958a12a918d49d2a6be5c1a84d987a5fb3aaf54d8c51aa439b29aeb7d901c9d0107f42bfd1833a87713aaa22570a4f5f96103419c0771f667c33e5c4d444c38406c5562f7b2c145ef83ed86bf8913f5f070f3e0d047c5fd9106249524af2ce9f384926023a33fdf978a4c6df9a03533b524166c5c83334bf89bf4937ff87a76981b750070583c7919014c5835284a422a9cb317cc2fd629746718f3726df44b1c9198542d805a578327e6f1fd548ec43063922866ab83303c1ff9275319f10729824c1fc63a4a9d9b0c89040c238079202a7d0ffb2b69250761152e280c439a2248a70ea2cf3a5a03139a7509e1e3f7f59b602039686a616b4f5f9205e13084a0715fc243b0b8f36239c78bcb3f5fa7867569fc3fdf250e8246dfd16d9601105480788348641dbda7250e6dd392e8bace96ae0ec21c21ed4497eea5da02408dc13a9481db8e0f166cf55f9f01bdea053be32c85d1fa2fe860ee6aa0b9eebb58d8812cff4b624c8a3c1dd43d41e7dae38e94ff6df8298a7fc060102b0fc378415461f26c79721b8faa27f2bffc059f603501228034c3430c865ca3def301c5462462777aaaecb279418d7a7b7d688cc9574cc3ca50094ce3e4393100c51ba8d026eb1888cc988c6d6cf36d056b4e181798d92b630d43b25cf3f02195aa0d4883828a997c9616601e8cceecbff89af12881a496fce5ca5c218c76cd7511add428eba094f587f0fd928198e559c1583e3cff159b1f98af8d2851ee7191ed3bcbabf45348451c26d16910c2932fed577670a07b4308c53ea14ccda7d415d5498c8ace6a6460bad15ac5dcf1967edd2f14610e57630a089742f8a9b13e549ede8ec60dcc72d5360c1dcb25d3ebca23e3467b8830cb08ebfdc9d125fa27c2e588d08f20d2a06632d94224626f56c524e9368bac3a26b52c9a6855d47d72bf04ec0044f52131a431468949f7251b3589fc7549a89b931e9df73ca42375802ee658763eeb567e0698187ebe5f7c15843b7ef6c2f9b375341ef43cf77afd621ba74be86555d996fe834d8c11c1c753d0789ba37669a0996e68b59e35ddf31edf2b04c571cf2433c5727a0b32b1d159f77c60e29e556bb81bdfa3b6b3346f88a0d55a532364d5fecba74da018e715d91c9128acae6558a70269fc85e1d904b20b0aef87fb5b1566f1123053c9dbe3db0d4933a239d53170007ee0119558b90cf63d961f5c15c6992ef22c95b022134317106c7d0c56a1036ac8e167b40d2a44a4c62cdadd5d3c77b74a513b7401f98c682b8b020215be21cd5111ef0ae699946c75f7bd5577ae152761ad8ba03fc9f2f097e265a379b954e2fca6575a2e60391e2e84fd160447724e743ba2571b85126a1c76fe514a1c3de9a781b2da681954eb25662ac8715f2e5069ee3752e78185ef019f9cdd6da7c7dc8a6723ec04ff8f543f441d2661d9a808dd914b8cf7530e1d6de2d74c6a9de31cc5036250388ee29851f0e85112066f01a04fe1ee405592049484b0793105390ab6a5dc7168210d89269914eca8fbfea500c077f28a69ce1a366a38fad2093d0cb276f721ffe4c59c1ba6126fa8ee071af515b3de22bc96b8dcf6a4ade847a01d7e4135292718a2d2e0add0384d7a79d3e56cfd25428d885e55ffae1f5556d0ee2f5587346c220e8003bf1a7916dc3ca915a4c8e71b2bc18b5edb5e934e8625bd7c7c29189d842c36baca0a7c06b4c1ba8f1a3579306f4caf559f016df8a5c5ae96a902a7c040f91e3c5fb9848df1702bf09e365c663061b02fd199f3d162d24164533affc4c8f6f8bd8bdf3b6c901e2178e43a27301a1c5902a1eaf1fb4f85e50cb5a2c85b4c02d20a4a5bb47b118072765f140e32963e40f5557b9222666ce8641b8bba8e5c592efdf3d38c801c5aaeba71183ee74c05d48de3da28b21bf531eac910008b6a7c3baba9e60560f036c32c16e6bfd7deb9d16896f5369d2579dea22aa2186a3869be52b3f636f34ce97c0de6d9601f8bc195c59288260b8228852f382aee59d7b668a1b763ddc3134f99113ba7afaeeefaf674025afb1db183dce84c915782a9228ca94834e4cc1f265b5fedb66504aa60d1cd82d548a830e8dea02aca52ec47fed7cd5d296e693c9f7ecfc67a80cb721aa7419db0ecdc2c08d6ec1401428972bdccc593043a5aac9bf824b70ca074d7f63aacf9ba6e72c9a248f78753b509971f0aaf4e79f386e7c1811e8699d46217d87a31d101becc98f8f8c757e510dcf7826f05b43f969dc401b814051845c36cff8c00fd1331ef31efb95bfa324c0cca391282cf75258585e3346cd91b21fe5da95ab2caf814a6784396b7469f4acbcb3603d5af5bcfb15c84f3bf4c6754d404feae786d2f176fe7783effc714a0f7910cba6f00bf6bc4ca2da359ed3734c5f28aa257b84e3a0776281ce2d7902a65c96457c311c89041abf41fc61ecf7647f0712bed908daa0021b0700b1b0c68bd720bef443c118f0baf120fe7c5fa213b5d23c017cff4692b9dd95df857295628c29cdad5c08cba7ce5ba53514834d74a4b660f9f1fbccca1e83e10e89ec0578c0959668fb436e51189053dc331d42a1607c679e4090c6017192103872cfb02f300d47343d7ea10117fea905532dd6b61630d189c501325e06b64d53602cad5aa31e1fbc82c2c8682fa16dc798b0c73216b402a849b564a524e27e620e0855102f3b91be8434700030511c12e84a21d75dd77f95f2f05e1de40da2578d4875106cc53a0864cd573bdac96f65b36950b00ab1cb04bb2e6edeb1f6c4ba90ee0cf09bc347dd955379566a24c742f3ce626edf6fb38ef185be73ece603ca1d3466676a39d692c74f04436c495d269b866c09281724f914bfcf6d0d5be93159e8abc18a72206403c0b50e5f271d7d66a047584f1039157516e222941ec506620025c6981f4a6585424d87751a7eb762dce3a2ea1207608e229a3c72abdfeb845a2660b28ad6393c294f5bdd3ba0527022580a06847c71c7d98f16454a88799e90a43006d69ddcbafdc6a5eca74524bff1002a2ca910682fcf5d991e3173ef3fe1fdbbdde64fe6b2a70ceacfccfde4aae81e146ae88426669d7a754ef29fb52315b25c48e2d84d65d9bc3109bf3c852af1a87189891c9e3260989ce8920dec1fcc835c959d088fa1b5483dec5a5fb397cd273d77942f7389a656c00fec3284ca0fddedb3ad337e8476c8b0eddcef591187079ba00a7a14e1405ffce9f50580e6aae652b7f12c1fc4d514c239bf2a95559663cc0fc85be6c58b023bac754404064b778205e52d894c70d6b31377ad734e5081d885060aca23e4dccd3403c9d535b8557279fed82c690aa12818c3edbb64742ad8f092b6046be6148ccaf2e0363c7d85330eee4afa7237802a6820221863e51e3fd6f9f5c3989db6ebebad5017e3490e1b5a9cba19b40dc91b49f9e914a4ee728e6a3213f33e1c94be3eaa61781603e32ba41ad8a4c5afd5cb9a9f3579e4eccb60e4f8a7739b1432a81a63fc3b5258f0e791d65c7cc97c94bbece688256fe0bfcca66596bc717d75338d89925da126fc4b43e28b0c02d6999af0c197f7ad3d15c4738aba0092ae1952f60891813147fc45c8589f74aecbba9a0827c72bf14fc06253b1971f276c75eb4c1536cc634eb220177d8035cca3cab29519b34cb2d55100f7498bc1f79da8533100e7cb7e9a87b35b5099955e5b47300d6a5fbc880aa020b7096a66bfd34ec19ac5467fdb43552b501ff4a4de5548a9385aa40b3edbcddd0c6fe3702c6137d40cc2dc28974692ea53048e60ba53e777e7ef3f4ab010c57b996431925994d498b6d43c15960162296a1ccd0a4499506644b98dec60f25e7e3ddf029ff067f1b499d4537ee4627537e3b3adc02a3f46cb0588341f116ab5d428cfcd860aa4c1e0d8ab668e0e01471d9597e7e0c7674e242dff7bf02a161d79303d0267d6ffe279dae4e8d0a9be9d9e6c057c8678b79b8afa40e9ea24387e2a217f6c2c4a1e94933567a43242d3a9856c3eb5a175d445abc9a8d09a7b5c586b22d8d0f535a88b6c64b46b4c2f7206ae474fe843962056d41c58a70fa86dbc83c875a6ec6f9cd9a879084ed19a3999aff795a996c9c084b75b33e88f5f374fa92e1e03193c6e45a02ffac065d5ae1bd7d62232c4dca862914b2aeb724f14f498f11c528cdb68b16bc46482c5e5b3d13634d3ec8e67c3e552b4664fbc3cfc123082dab5e560c1aff0aebcb9f4b6ec8dcf5b1b231baa59c32b5578ccc54b109e43e7160ea7207805dd334c63cf758e04362c69d093c1b68c6ac2de3bd707cfcd8da8066765ea5bdea941139c0db092dfffea54808cef8a232694177ab17d7f5c97289389347b83cb33dc72ef157b298766295c4111f8ff25f8f1b38ba00af6074eaee86b17e192db2932c3165eddaa1ee46d355232ee844456497ba8e103a5f6e611e7fe72f900798b31747a88eb6800d09bbf09d34bad628dc7a1b00e1f81ad874619b5f1a8852aa0aef05fbb5b5990e672ab6332d7a0fa638c14a0a0ee024549459dad99a125d15af537c977802974e4944d1000633b8fb48cff0945154ee69047c5c1050e0aac8a581f89c3447aa458d114fb42239cfbd132abdffb87b08e1e15f3354e4944f12f4e85037394897ca3d0a512183ffca8cbf1092e98d3abcff28f118a3a72a0c4f6ee83db674a0647e513684846c39db1c6d4f061eb3b6a147be006d31a3eae30bd86082595a0f136d6993e0cc071c81c9b9112528383107648ce3aaddb6e7be075ba1f4012c601a514368008dd85b2ea506d8719b805112227ff171b2a6c4aeb290d42437939b2442592cdfe67a48ea5227388026a0b21283a8f870281d2fe97973738efb8c499aaf3ded77fb2819a82efade8eba95330e93e2405fb3b11cb012bbbe3a2197220eb55d9de7d63af674dbc1064eb63ea6facc21cb214a1fdf9d8e96f05c7946005ff67294a825168fc654335ba99bb381fcc4216b76da9ecf19989e7097df11dd7e6a4915717d7f8b2d924c35506e02318ee603c74061c9fcc813ca58c1af09d21c4ba754f020bc4609b728edcf2d7c2e4a3248dd5405719c9e98df80bbb63c40c8e8bb99c233688a6dda36e873189e228c9574d37099dbe2dbb8f318b86af32aae615e67e46d290b256fd26a398d4fca71691f8ca390b9c7af221f079b2e02e1072bea6b05be4bcf656704ff2a980bef27498ebccfe51e289a86fb44a365419be647ebd08c180e2d256aadab69c3080a499f9030dd9b96f0779117d964c0c8d0936c88f132cfeee15365592e46daa6f1f5c884264af51f876c169010a69dae6fbc3382f048de9bf61338b73f4ab5f02d2ca32f84f91c45a7ef25a34a9d4daf98d36a26a1592cfc366999369f75d1fda2262695fff49a071a14afa7bbbe72385e9be60a9b21df9e09f435e88c09b615185c564375cb2d1433dda29d0a9cd5eca59376dbe4ee6b4f467e2296a18aa4f81ac02213296990b283a1d36c579e8dfb8f846e4330d139c598fd94cfa777f3081f2bfca1cda029e63da1b946f213f9da70cc6e29afe479444673a73ba945a1802fd87f7f299165abd1499c79da2684f26c901677ea1e453cf7a39e774b128905eee31cc996dbcc17c040c9359a9f1bac8dd063436c783b225e722f0312bf93730a1f5cfe16de425ed030b6065e85f8fdd6d7734ec1981d52205fffe8daf6d5224b8137bc05981ea3109d4fca1be0c810e99307cfb8a4e131f1ab357b785ae0425e8868d71724b79f5a71cfe61b8cfdd9327de5a1431b1bc77fdc804339982b96e026d4ce8ad1f53cc98001121e2f5225b4fb84a22469deab4fd2780d8e76b3703d467a465634aa08f79f01e34000bcf3f011b009c28b42c75a45111ca824441c147a89a7cdde1b242cac3e6443f8c2dbe8a20151f4962d6f62364420d65fff06d5f034d2da4b2746818b286b09ea7bed83fc13b256318e407c81384a7063382ca1f8bf6bc4e48517fe08c6297b06d0cbd6019414690a29fd30cd9c4342854e4b67f347c861beedf4b02b3d424cc0ac0a4b78410952cf11b4f2166f90f053cbf38fd104af7161ee364fefd5211423bbab5449cc5e7f035f2a2b1bbb313e110d0ee4d1b6b58d44c1c3de90c0fd0beb54ad1dc064b6b787c8ecce420137a3ed3417039de9765813397e3cd8bdb4d0ff0a2b7d9a6ca0031f1950fd96f9012f35f4973175c656443217d9fc8dabcbb458d9f112ec68a7987a40ca812b17fc5bd67f6ca70d89df2fd88d6cbe9f44f2f924f355860541ae6f936a94a6fc65b636c0516b10c5029573b44d9a529926d1ee84abaf68daacb8d4af046de4cb1747fb7a8b9d23052118b534a81f5bf6078bac85b7666cdd3e3f5294c198a43cf0e9edc3279d288bbafca0caa7ba44c50d432ffa00869c0d3e1a859c73bef7c9142888e02a6188e5aef0f762b117949480a72aef49fd642f2a7a2bcccd4a20a0080b249aa1608392fdcb81c6249d32d21e83c2d04c65f5542243e052756976bf7243471efcbace1a614f4ea7ed4de64a7ccf7a5900212a51db03b34be2f41b563ddd989fd079a732d01569dbf802727ab65aec2fcac2df7a1b7cfd05749930a77644d4d55c136fe5aa47a2dee5d9004a373c0136c9e2385c666fd415dc1a4e4d3f0061d313db364f6294f60f2f0ee974bb3662bf87ed336634c4531f8b3d051a9fce19790eb924b833ebe8c045ad312ee7825df5b41d45516708d2f9ed2831f2ca1739cdccffa17a318e66b94011c975c1721d8b63593596450b23d0e9b6cfcbb9ea1c1285abb561b1cfbb96417c8b4f922f6ab7f2b0ebd44b9c3ea59178d252b384387f44bbe22e05b00ca713dc5e67367f98fb8cea641c7e803d7493737022d1ac1da6b41f48839342eabb19687401211ce6f77d45871e878f9d2c18b1b837d4611640dba82e3fcb827ea1bbc432541546c2bda81a01879bb2fcff748711895c0ce8d47338c150faec01c85fd8f7b8707f37707474b9fc378479f3f5b93e593102acce44de8a84fb2c62c350716904f1ebe596ff6874ce5cc800a16f6af99dde74494af689128fa7b4b0ea2d2b986504cdc4f64ee8a74462ac3b51824b59751aa3191bbb0e70af3a16a865604df4356e8b3157aa03b55f192b45f72d95fc552c96e033a827c6f5937da44d6b16c78c5d43824603f495ce7d309ac420e9061dab768eafa78c0f7bc4cf3e57ef391bfdbf7e74aaeabaa204e8152e0061a6c2a71be0e8aefa0fc6aade9e994bb5439b7ba8de53456d61a84d1d59c867e50ea969df1cebd011d801e9a3139ed3bc2d0524f99c2234461e22545a408d539650b381defaa4f9a35106aaf89c038acce3623a0e9d0eeb3d3471246e03720a60b6c748f3368de922502319eb716bd260d74cd03a364c97f76bcb97c70018dfe9e26f6982703eb3e3ce831deb0a2dacc92b5d8576e358da850fb49e084a202fdf5d97f57dd4d145e48068c85a0fa46ab1836e560827aa32802c61544700fb0e0a97206ee0dfbd650645e99c0a686fc7b5f2d9fd95f693ff61dd34ff208cd4f3c26eed4a6267dbf574c3f60e4aa680e741271bdc522d21eaa5ac46fdce781b6c9a380766e3ec3372c75f2c57014a42735d20ebdc007bc41dcbcc3a808ddbdd24f99af727c1e42b24d9d9505b3973164e6068ffdd8d172f8b1204a558a34d38a743e5cb88797a53bc4de440feec468754caf0e2c341679e6840dcb677103d87f343db996a5996a20e60af6355c6392af3b5c90ab0fb180c9a20960d0e07efe1df80c242382306ef787514f4c186bdb9a514f76cb587dd556e793f36878c9c6e725db870ec5e7c5d06244cc3e4e6d1c64bde84779756cddd44f66391dd7077618d51985ca45cb8010681b75d7112f4e423a217bbc403c3e4432225afb5356ab59f57109fb3ebdcc919dba08b8e073123a789de7669b91a50dbdbc5b866b23c783198f4ba3b555c71f2ec457c5974f358a687724f111532c3d9ecf3c947ba5c1476720ff0fcea5ee031a0f282ef3e319450b873705f0a12d108442166e4494f4d82f2d89c3288c7b7ac5177037682bf9d0e0f404071f1f2dd1848fc8df11f88a1f5be4b4fc098161b2233d17c92acb861e5e78b83d2add5c58dfe591193fcf52413ef7bc7fc3102feb4c87d8f0ccdf64177626125f357470ee2766f9f806e8ca4bd79e2311136ccc045bad10ab2d691de1cc6399433e4b1f77b2eb47f3f39d32a98f2c96a93b0303c96fd8a2d8ac0a37825f07da91a8d6a7a270f0d43717402620713050032c60267abfd294e53a0a9150eb65445455e32e6ed4dbbae7858be4d8841e28ae254101843e3f887e369e7668ac383c38924ea08a1eea05051ac7d754e87324c60e805bc12766e826a6c7082d65a9e4be20c7ebb4511f6a642345129e55156d5d57442846aa5c83387d82cbcd64664cb737a171cb1b6ce97b174e37166aaded1ef2358695be1c94ccdb91495f6692e1114ea21bc920e6380fd997057788767c30cfbef53b81a9f2289eca0a4804b048f7150b844cc93e49c3911e6257f9a3ac2ffbd669a9064ff28556c04215c11ee35d110c7b555b0ddddf12078f2ec44d6d95e3d0686098a6848f3c6a78b55845443ba6b16ddfeef16f8c6015328ed8d5c29ec088ecca5dea9d0cd9b68fa4200671e553c2955620e651ed6fb4efef1846a70878639ca22622116f5fb8b7617b348dd54b60fe3901027444abc18337eec0936a3a880b01a74cd97ee2be11d8972df3af7b2f2d384b22fc6ff64264f698a3d0ead5aa4e63d913c93f13bedb0ba8a5f7af021e9db01fc76c5e4fe944ab6b7964baeebdb6dd3c056e20b70615296a5061126ee1c6f4947ce69e08c4b99c4aeaed95e91b99aa0336c2ead865cd1e507aba16d2f88fc695a47ddf946fe0c19f511602d98ffe48b51ffd11f3353dcd139bedd76969ce674cc201d681c2ebb7fc5ca21e4bc53864de4ef0f96c8c1513cd01e26982aea0bec34c8791f0677bad5ef617643321e164506ee4c16cea4a2070bf64b42002c34866ab19360ddc3557576f9add31d6feff031b49eb6e490922dca732e7a368e6b131910092f574b5573760ec0cf788a16a40dcb9bcb91e2e1bf455e3e310563d0fc8997bf67b76f03b109e46e862bc27da116018ca32887896bda74a05ea5c111daee99100b11665670fa740cddd8278ca3f9eaa110385b60f11db22479dc7c6cc85421681278dd2200b23cbfa8fe618d275137688d335111b2823082cb66c37f76104be175c918f9fdcd86cfc34cd8065524ddc8e741195f7a9785b8b791d996dde34e1ca109887ee18def52ecfb4df4b759483442f4d0112a357e35321dd1f325e5e30eb3c97d8230d1e84c5ac2295f54f12608c78391ae7a69f18c647cafbc20832684d3c06f12e8443291b8072c4c99e1b8cfc1720bd5e19beaff324ae5f874cd0af84ce694d00dd84bf894122bf6a53199d2ea8057db37e14e9a057be7a7dc82a36a8b50bb9243e9c61b9843cb8867c50ef273781088640da142595f80997db8b485275eae9ca772ded5f9fd685ff701d2ed3314de89634274ffb921639ae2b3b2e6dffd395ba0d77c0722060bd2d94ca323b937e2b8056ac6dcf2afa5ff00be75fb102e9e7c947066001e80c7a519c3503a727a3df72ca339f8db338a7a6e2b974d68b5e4a2f75cd283571ed90916b2c619b09e3c9f4102e74fc9b479171f05676c35ee8b2dcac462c8c223fa371d7b3c1fdbe4b04d20ec20075bf13ce68a7d1fe73526ea8cd829f32d79e0b1eea0ec7b7afa64fc135f9c8cc002d2e2a90351102231ec9a2962fb96d8d8f4891e2246ff9130197047cad5adca757c74437d21bc9c805a837a4b62636b5149e15c02e26ebf6ac42383ca48cb489a5c08820deb1bf9a309e0111b3d42ea3cdf09b581346ea12c69a80cf47e7b427fe0d5c641ed1e23538b315cd23d267931875064a8f537965db436f47269a60d6b6e1464596d9179e3c82ef4851c9738c34062613ded7d4cb8298c60c9f7a96f4b109bd75dbb9e2620a1a9e8954c3c68034ff67fedb3adcea225a5d96a5e03dbc81934f53406b997f454af585772711a7b3cc9d3535f66c80d2c12cc3e3d1813975321fde4493058b784769d137e9ce2a4a66e511f2c327e93334e40cc3ea1fc6f03c2aea330ceb0dc3e340073948f5d991cbdb0d2715dde35a11949f013bbf3d4d90749db3b2849907eb584edf1cbd951787be304de7989053b9e384ef79278f749267ab4c62c946a260eb9e66fa223992b44e564ec5c45edc0355c3c0370a9524e4429ed68c90cc30d123bf40994bd14c25a754510940cf2ee9c14630de2b52efb7a3b8c7781f2ec77c2193a8a0941e37eca682b2fd337c74a4bb12a0f1477758d9759f3f07424488568e1ae9c706c6b08ba1b8b868a9146b9667f85e41b9b7664fb433d04d67ff32bcc966df0d2044ffe35ef26bc05ce25917c1b492822e9d4de0064696d9df6bd8b280e1dfb7610715349ed3ff83da7639edb2896ddb0ac3be364a6369e6449a0ec7fa322a11b6d66a83c205378391d746bf7e12bbb1c7aa988fe8c08be9a0d793ef08a8f3ba56f32589d7a2303d665c4568616a7e477a2975a1fecc8ae785e61ef148056da1dcbaae4f2bdb96d37bbe87894292dde0eec39c426a342190168a17698ca7ad319cee9ee5f26a0c174174588ba1b61959206ed371367f505759d6481572db2376a285d09ad2f92378797e10881072dc8463f4a2e00d85778c46642a0895f65b071b1803995420fbc871ad2a698552a936d99e7ee844b306c450cb021fd073532159225a4ce29179c47c506b9429cb28dca138eed324291084cbabc2c4b3c724d1977d463dcfdd439435132eff08401140358b5e7abcf00decccd5df4012ac2530a2990c6455664eb910c589bd951c91a8c30c7eeddd785993d835d1000f87fa1f046c26fe7a034b14f9beb1b1e89d68662092e629c149e423a359f7659696f27457496e3e2289c1d84321e371dcad42e5ea4cef279ab217b78dd2df8eaa6586f08b01a9ac77b200206e079f6ce107464f3568d586e9375f2d383a182132f99ac15ed8c2d15b75cc4e6c8c3148e6e3699c12251a83eea859cbb988ae03ddadcbce8b49d04372a319a446eefa6ee2da51c6342519363918aa982b18bc5700a4a5f8a5c1a77f38bdfc67fdb089df5380de99ad73fd168234569e22957c80e214b52f698cc912a0fa817c4ac45cf732251e4ac8180c015ddf2728f271a0bb63b40ede29c23487e5dd5d7f3b75836693ac86ce070aa6def697a6b13062f5e6d6a0822a5143a14b28e60ad60ac30236ef71e96dcde405d68b3071941b79c0f70cae1905a78e7ef9c73c4c167743621afff5112adb2488ab866e35af5acbd6bb9e0fd2f8174feb0e3e3dca055ba9429705d6c668d8ed95c88561c50b84e8fe5c69720d7eed3a83237963f461e8627a0b1ff92d492842afb7a14eb436686ce71e43df5b7fbe7c4948ceefd6dda4509c836d46d619f25690c2b8cc1f2a69a20456607c8da030ae6f9508d85508c22eebec9e79505504022674a2a9ffa6bb1e54724326aa91d41883c53648b077be2e9e5864a4d5b5bf29bbb283db8a055020c877aa42b08a957206b8b547f34b5b692aeed043340a3332b229d6824575088f84851072afbb648f8a0ed3ab031f3134107ca614880eab57acb8ff718a2d23b6b9b0354f76a1479fe00fc676a4659bbb04e03bebc62c60ad9f56b6d4b5e4c959e430947d35a1f75638c200c71644cb4485941e2756dc00f9df4ea80f8ab3f86af5a7eba9481116bca9b7d24b74cebae16955fd8ec94c1d3a2d957684188824674aada8da4f87a5d10683a8860a50e1e9834c6ff5544dae0ab7be4280a713ace8cf28b405f8ec4269767a74649e12ef07b5a19050d218c530d6c29ea1b18d2133cdab7f0fa43661851b6da737116e2dbc401d208b2453be61488c657218efc64e520466f1c21892710ebad3dd9b8983ae22c92ab7004ecfbd06933ad5d31d3094b0131825b10499aac357cf4908b374efd10c81b5fc939b6c5a3107a2ad3b5f4084ba4cdc24d13e43c57e2ede44e60a3bab70e71f709c4c0a8dabd805adc12c73a9b01e9ba9f4aebbfb478677b6f6460bb135297dce487435f47bea5e4532e3182be4d2ddd3f2f06440a93005e4abd6009eaf521242c6fdcd1f2eebb3d5dc853f591835907b414ad9b16287f084e8fb174dc7a696d70fcf195d4a511c921dc79e00659595b6550edff40083121a4c8ab8ab7875be3813e1c34e63877092b656882cc976f995a34cf117cc30e30844707e4164eb91bdff4c166e262b7dc128b2e87620fe26d3fca32a9bad41a95d1df3ce2881bf832416b5d6692a128c3dfa0a1b31136f669b4dee3ecd1a7363749172cffe0787cb6870a47e700f2259d43515406836181ad5776a8ff3cf5915910f586ad919cf875cfc3d35a3f814e21c9f4d921956a29a1ecbcb9033b54a817eb0725fb3931db55a027a8fadd840dd7e0e0c691a67e4c1adb61efacca5ce07ea28bfcfe5112d0e6c896e5687b236ae1f0c949f0c89ed968f07fe49297b2680fe27428de7411d3932f50a040d2dd4bd89d172d49ff3fbf993857eb30d0e19763662ee4f6add3b37e273ce65ca70b2693b88e508b53031ac7e5290d114abdd77432c2f8a7636ea85a2061337365374d623ce9812dea8d0fafc9a660aed715a386562846ed94a55f3868e0a151c186032f68fe65d038118f1b94e1f8fc3ce80f73af3ea65834d8556f459e9929086e65b19a44cd97081fd46071e82c841a3dcf2d76c1b23160f54ab5cd0912bfa3a23af989069580d7429db033ccbd7d5a3f4fb66f258b8dfabf16d52cbf992472b16cb8a193456e3c322d5f736984f7daa2fd5b0e63d3c191796954326321b8e94766e9644a5f79b3ca394bc1801a8abbf45241e6a3b0c36dc59030af7e385591bff1a54e6b622f888d034051a56c7c3d650ae8431f405021ab8949c8e750bfcfed5b3f1bf58e174e9e43f295198121a2fafe3eef746207baa44d77e3eac97d47a901e7cdb769e9144942a282cb7682351a744af2b8ed865d21ac51a3c331b63ea5ea00b35610ca36a66e9cfaa87dcb546d6e31684bf197221d16141a81455d64e628a8677efd0479cc0c47ba845def81d7e79d86864652099ac6b02ea28c40d10aa366aec23a5326b71b5e1fd66d78b813324008538efe2fff289e51c461a7cb218a7c80f1ba0869f89334564c112251219d7d849c944d57614ae5bb442268e24c9bc069058122b911e703b2c24c3e24dd65bc8bb350eaa8aadfeada52920d779f13e11b2687d73ab80044965e09268789a6c090969da3b0cada66c38bbf1995368660b35a83d7ae06a7b843ce2bece287ff51a02abdc6b378b9d65199ef0a72d20219495fad061224d241165a544a7d7df22322786e74f59199b682bb014a98c170b1a39e52e9ee645184637613838b0bcee7f792d0e03dbf492390f1790c107a2174864ccc009e34995b029074e0da5cb58f52282adbb03e9028c0abd48f6d5b7c9f01f98617ada1e93d0d45a79a2718f3630cb1e3c51846d0612e8c08560b304fcf4031ae96694572056b24a07159d088bb37ab4d38d0835da51aa8c37e30f5a145d4c1f95f6dc3df41cdc7f89ef4d0f2b5a280998d1ba9eb8412d2862063671b8617458bcf0b2f0f1ec2812f7f2761e7dfffffffd4ff6265bee2d654a29052f0909092809ce0c050a43f9ccf8d1c44ddcf4352971539307e1f0516742ac3d6a5dbd42724b7dd9fc3ca8fbeffba17383d983d887bd51c70d75eab85023759a5d17e2f0e1e0416ce54aa7ea1eb041aa30871d390e0a6a3f053d67ffcb2891992425e1cde6264dd3b4ef4971d4cb90a3529b73e0d8337e4ca0107165e241dd771772538bad43863772541f018ddcc568d62eb1ee9ba29a9aa2a2fa888df6a14bd045f40aa494b2e3af518110203cedf9c9987f64f899305e3d5445e1ad90c4a9cb4c9849163281ea611f1c877084a96cd42d1ac2b6d57449ed1f4965186973936ef5373b912d6cd01622691af600e23853bc71998a780884890e15deb8501cf3e9130927c0a30f5b1c72802465044a9850b932f11828bc02ff0e063434a82b266aefa0f6e43250672797b75f9ed05f000b51a52376c09efe3eea3e2266ef9fb94e0cade383c7beb277cfe33a23d5afff0e9d11eb80e13430e71b9c4c46dc83ad48791ba31fbd1a43e37c37bffbe272409de73136a845b01d436aa2d322d890b29d76f2203e8a2151a49c6e9edff9ca2a223b5fa444f3f0ecfc0fcfb42cdbf99dffd1debefa1d2794f27213c2d884decb6f0731d3afbff7dc04695e32135be11edc85d9c94a759b1f3d1e48ddc426ec02d6bc0b1b74816df917e9d80eac2316557301998f79ffde52cb473794783c3ff2110f0fe223a46ec23d3ac63aba466a529d06dc15c720d6b907af8e7ef758cb239a221ec4aabdfd349ff0003ecf67df4478be48892cdc164130ccbec33103b59f871ef96ad7d91d3ee1e19fc7860f79c2a29eff4109d80b75e67b106aa05977f5fbde2a88664f5bf43e87178a586887e71b7cc2f319f8c4033c3c3c3cdfe11310f0b0f33c08ad6a084f58d4423b3fb3aa31e11111c3802fe048a3e24153537c446b67db59366512de8a65124edf18b1947e32cc69f2be7e75de56bf9cfd59fb6ff8851e73ee5e1385c73e4516575cb982a972303844fce910c77149781c87f38437e79cf3bd07daf371e1ae8be33ec5fdc671e17844acdc770dc4f5d4719d3490882b8d3571dded5f778f66d6b1dddd9e725f9d205efbbd7638f650a9171cd7dd3dbbbbbbbb7fdcdd6def6e6fdeedac05dc7577777757ce4ca3a9996974cb34ba750bd26dbec875edb7c1d1aca7af48a5964d2a25d5b2d9867b1bee6db8b7118458d6d3e7ba66f681d9febb1b11397f58477f90ae1b4d6faba3b5acb8f087cae933ebfef17136862e071151e1bbe1e9f413e9d40bb4ce6696cd9612bc5977c90a2c5450c192153c5802133db0024a18fe194b4e9bee54ae7a93744529cfa49487aee88af2d015a53c5c4ab2945366736bee91fdbae473727e952bf0ef6b85ea95ab0ca0ca5f06d23ced3dee91bd7c0d7cb1454dd334eda56a487b5074e2699ffd1845f65ef5e4d4fe47b714c3355442fa7f34ab8064ffeb929f8121eb604de1f5e414eb90bf2579628b5286485e5213545ac1e447e218c21be9d10976000589082780810410d60b2a595260858923a27cb1031e1891a9209531690172d5a985b15a9af2059309aad49e9e7c8a55952750a8f2fbc91be9aaab02085594f09c78fc19674870ce3a42c2ca61d3ce5e526609ca30c489976551781e645dfefead0d2a00b7fc671886ef0faa3f0c3cfe1838d411c22f9f439db9350b695a74cf62e08d2c030c91610daf9f25a5f8f9fea19c3635ad8a25740828a92a8c84d08670da88c888d0429b9060c6b42a6210845400115332294700e19222796b992081028a60f2a2601a9c24555125081a58f0e4ada50ff3c34fffb444e07575ab40614104d4173e8881020ea0b4a0700694127c48c38725218c98c263eed147abf6be1d3e2cd981ded7a2949ffd942c9d78f2b746e1c9ae6357bbe31eeb7d2357395d7ede1a9ef410c90c8e81100294cabf2f50d58f2ac74ea344a5cb4a6e97fe3a92fde55355551f1d5413eb9c90a830421dc594142a3fd4714775679f3ae006f81085038fdd3d03def2e7a4e598f66662726a402ca5c494b4af557b47b5796ef1cbbbcccbbbee2f594a29a53fbbcbe94bf8944b48ba03954ae876ce5156ded1d7dd7d6ed7ed673ea1a2f639e62d89f1111bcd1a780cfeb64422146a9af1f33da97ec8321f7461fc90c4053318021b48b0f1c4162ef025234820fc208d0dc30a2c54502e62204608360c2a94e820a2a80111413461c51629e613543cc992bc20aac9921c3861841c2009c9d45da2e2045418415997ec52aeaffb0fbbfbe24ccdc9a5e694bed3478b3b7d939967ef99d30f86393316acf4f9b548a9d47c6a99bb53f7fc05e27f546366667a84d37eaa25993d70f70b7082f0f8a1b668f16056ee53cdd9c185bd9d7c7f22d520c1db976afcd775b787fc662224b23e89e92c8085e6b3d00c8f3aa1f93a4160aa3f4cf5704c529f7c6086d45beeee04b1723034cbb22ca39452174cf1831a34955fa3495514c10a57f9b31774107e90aafc13092a5e9040c2a0326f7142e5a5f27753073989caef7d4a4cb85229156b4e9516540e42f570fc9a9fd54032955fb008c112a1a5e2a3eed2882bdd3d0c222485a12eb8a89d85d3c3f1abac22bcad445cc765ea2534163ff6c5aafc3204d9170aebe2e7df262a767fc0b053f97128eaa0258201c870aa2cb20462142af38e0dc76d5a29a1b0af7d16703b65f33c4de129970bed7aa8bd7358973fcbe51ea52c5072994b1135449f2975dc2ce28e9fce615ffcfe1c730846731e86d7bf54c695daaa20371e185eff4ef94d4260d2fd532e9722597cab8ff53378fde1f91cfe04d90d77f8ec87496818d2a2ff0c59a101dc86212d36ebb4dca1c8779ae8209ea45dca12abeeee51aaf7cb65225c8a649101240da4e3d3891cd471b354c7411d774bf528ef70e4a3f61f4a0668a0558281d2376178232321212121f506161529215f7e92da034c93d0f65c4759ddacdab1fa4383194461243662a7f6b3d20a414a93d52285c6af528e924003a1f954cb32b044a7a713b51f072ee30ac99be1c849d38974007054e0c9dfd1416c44b776ecf0f161b1562b24a4f1e767859eb61a74eb679b81f7c3492218346852e43b25fa026fa49e5786a7d33a5078d5078f1778238fca38108166566c70813ea7d2c7f3993eddd215e73b28579cd3bb5d91f967bef2ce8afcddb6f85795c70fc2aabf6ae367086e7f59e342559875f9b30e73577f1fa52ed5ff874850007649698b231dc5a4388247f5e75e985e411d3b987ded7bdf60e99ccbcc54db750791cc5dba31f306aeb7e6fc49837431b8658d3f9472f85e1adeaf385948f0ba21b4940fb2094b5a1c5551a3cb4c428225253021e1042dda50c284c2092d2fe20c1b6981b0c61426a2a8c0093880811a501c21460649218f5220b865ddb4c06b4e22c47df645a9df3e891038c45beea4d39fd2e94f7d12a1a26d2bcab62442dbe72d29bc19c6accbe927e4de7b19702a9e0c9d0af94984f8a5b7fc930811f156f69fb7fc95b0818b94b0617e1616cd90c32cd4b1613eff0c89784b4847fefc2a3cf0c75b2ea512549f413f713390992a85711b55d5811ca8937d12213ff256160e31ea286fd14f228484236909a698d00a29c14f7f8557c286feedc322ef3bea578876a863c3f6fd423a94071dbd6a8067ba4c7e5405a5a19199c42d7370e3c3dfeff6d53bdfbcaf9d97cf6a480fd3d81e9cc43ae4b7e49dffd13796ec8093665b37b887f6f2c66fa0b7e28d1b52c78d1bcf205df1c68760b7e28d1b3f321255bebcf1db3be8db167e6f7f23e4a31691963012d3be364a299ddbb67d2f1fe6c79eeafe3d4339ccaf6b1f78836907eccaf2c6cbf0e5f7dc06eebce83fc6e0f871ab39defd7380384016c89f55bef1db86cfe0b8559877d5d08d23620dbf55423c90c5194c2085cf71770394350c290cd34ef4f1ce55439de893fd8f097ec4e1286dce29a17ce328979a1af33b6683c6872aa79cd27307bddef847b51d1e77779e2b4c13e4df9161864fa337f0805ba90c2e77c04feb181cc51df0d33cb06b71d5373031adfe7b8e763facba626228bf116e9449fc49c2d37e14abfc61256cd00c0bc5c43d6e60daca5032dcc03d90b00ef9854c4c5ac73c2a21abffe8af7e5534d0ff543330c8460cf5c37a16615ee4466b78e34679686407362ada818d36b063207701398a8bfc22483c1b703ceb7f3497c4f484373253124331ed0b2ccaf13afcac67a1acbb01f67c08fe6f20f845907096653e335343f33b7f464ce13371fc80be1fbfc7ce8fac9aa5006edbf2df0177758caeeaffb5aa8b200aa0d370870682edd0ff5441e8f3f71f1ba578c0aeeef473be2807eb7960d1ff582c168bc562e560e5c0f139fc7b5efe4bf0250f0c4ec334790dfcf9687a402f07b8dee209e98a86b09d704c5257211bb528657e5d270cc7233caa7f4ec838e11716edd0a227026f6428661e3e70f0f8f1791f8e276fe48e7117495ff33c1c373734a43720f736e098a3662111d780e357679e061cbfce844c0c9594c450ab4ff4f91199f5e327036f6c26947a1eeba9b34050a6004419b2775d53aa5c2c90b048da97d6473eb4230dcf816c6c5f3eb89192edc147ac43be6cb922d3d03de297c2470e76c7806ce5a4265a9453fee769cf494ef695bdfc1e9c6f633ceba16a39384cbf37fb1f9e038e3d95be0d387e5b48c4ffa37b3ea9276435a7a38537a5140f62b54f95b3d2df2143d1fd354d63f99016ddb5a11d2dca9faeb9bb873f5be53bd287513d3a3b365fd26cd3380c9a492dd39848c76ab93e4052feffac06daf9d5cbf769209d97dbd39ac7f9554991b23ae44f1b2d6782f46dc0ec73b80de4ca03eee2e01c58ad9353d37eaa86e6c3681c27b32c530dd1988c66dc38e0c8aa33f593079cbfaa4dc3c18356dd62a9fd9864f5dca986769e53694f44fe88e3959f06e7573c5b0f76621d47583943783684445a944f1f07dc791e50e7370e6c8b9df8e504ae727670f1564fe5ea6f562b1cd8487e28b32ccbb44cd3f833d6f8358d5552ee93012a0fa932540efd351b671bed1d84edaa866cfe47f37378e4a7fa3bc80fa312e2cf6f03f2fb88dfc762411d83693f323bf1b8789a114e72a285fc1ba83dceaf6a933a60afc0de01fba88d5a94eb922fd286ff9ee7a438e1f4c0e3183bedcb5f7e0fd8f32cb474c594aa42dda5154851b9addb01717e05faeb8039dc64555936e7bbf365b2cf62f3733ef54c56cee7fce855999c9f116bced36cdbca79991cd8cd4b1b4e4543f60cdafcaa82646ff33f5a03190a47d1ba09a640afad0292fab9deca09c7ef8bc0d7e12f4a22d4f33cf43c0b656fd3036adf420c0ad13e87172a7fcf73cf3bf8c4033d3d3d3dcf604f58d442e0ab6af8079f9be0290d84f3f2198a9ced2585e12a6f8f6d75f07b9f037e20b860e76d215d1787e31766fc37515a942f6d42761272528bf23d203cd6d802aa1afe8bacec9798bf87bfba813776ac911a481ef991d956edc11ab0e61d1c8754c93d0d38f654999f01c7afca844e440c038e34f5a563dc3b0c3f5a943fa481fc191c7f5b4d49234be5a74758425653d230a332cb9a00af0784e28d0dc55b3f2dca90478b92478bf25755030bf5bc149ddea1c435cf6c0cdef632b353daa66c383938211b754e185bc22276c596ca2a205d659ea1b8ff088e58aafeebb4c9cc99f7fe6ba06d669b993321cf99f7dfb6779006fc544333cfcd8032328fa45dc667405957b56d1f64fef632a091e9acc463a175550ca9f79e9b41e6b7e75a45c3cccb84d1a5cafccc732fdd107dc9fe12a4f9560991f9992a622ca937ea56f1a24b65150d313133e10e560dd53cf7a3e5fcf6b481669e478b3099df3126a93ed4f0c69f6a0426138e49aacc1bf991097db4e8dcecb6f7a09c9cf047ba8536e07c4ef8ab67214ed6e0502465e35024bbe4c436b0e655aa20335ff332a08f167f1a0816c3ccd73ce772e7737e2392b3b393f3ae1ada5435c83af3379f6364e66b5e82453aaf63130a89f91c5ea8db1725115a3d0fab3066cbf92de765c0271ec8c9c9c9f94d27272cc2791d24b26e7f13fe34d04c081b3949a68aa126dcf1f38337728c97c87cccc77ccdc7bc3fd79c7fdf8facbaad827e7ce647afdbd374d00f6ff96fbf3d6f0f1c5887ff168e5e8bdfe69f8dcd8dccff6822fe3fef8f03ccfbab54bfc950c65f158587f3dc736c5f32ef3ddf0703859301b932946d731970ebb675db16ea6c32bf2dfe688ec96ca11099f0090f398ff31b119c2f52629bf99c9c997094f96d7b9c4d666395ccacab4200ceefb66270de655ee61b88261cb91ad95edac8af79ce8dd8fcf7d90e329ffd28f3313fee506dfe03479bcf6a6ade553170ddb6c604a9091db0dec27919d026ac0147991f699d792eeb6a40f93423d79b99979151e2c1e3e74746e6c7af9bcc8f5fdddcabf9ec6dfe47df803a78bd9101475a657edbfe876b5566bf81317f038e3bd49ab789a9b951d1c01ced6ac0ad34b44e70e498ffe13bd418702b0ee88123ad5be8fd0f9fdac3c4469a3a3214aa316d3101de7a8f92670403f2bf6eb8aa21bbad9543926d1a94825b16b7a5a0042f539c52cffb3ef932e54ab7e422b74899e5eb0ca5d3944e9eb73a54cd19c6d055a98e1fe52d8b7d71d9987642e08d1b535454038d2f53b234d0f86969a07163aa3d76571a287b62f251c4a819aa8de8981326df82249bd857ffec0bcac95bfd947adef7fd8fe2d6a5c5dea2dadbd868a1eef3e8a0d4c684d5d1bf5bd4133ce9d44057f665d4405b7770f124d4cf23f7a02dca5bfd0fe54bf2984c244a3deffbfe9d6a3fb7eafe76344de8b180fc37c5bf0522bc19760eb620024f470759b587c1544d8ba241be16eac0d57584f0ccc0a548b8ca306aebe2a481b693500dd42e7582c8ea2fab87230f955f9e6c946852a71195e792cad3a8b2ec52f925970ef22950b349f5291ea4925d5cc988698937d59e46ccde5289246d4a9bbcd5b4c9839e9a9a68136daa4dab872a25dad48637f2539353652b4e3c51a88164f7d41bdf206da5b3ca999fa90a4a5b825b964ef6fe498424a89365ae436937dfb351aaf245529d3fb27cd449b5ec4a9d2f756ae8976f43bf0c8b9490df9f8536f06f61913f7fd315ae5ff66c9dce699cfefaa66dbaa6bb1ba669beb3de3ad55c77adea97e6df51dba7368bbf797e67e6fb69ea841dc30947efe36791b986959861f8a90bc78f0bc74f85a398312b51de58d2ea8423ddcf09470f271cbffd2f1cff261cc51fa7ba5f53d4e2fe0ca8e44f1ee4635b1b138e9e172ac184235585e3b79f0a9fb670e45179763c6969387e9b71d4e7ad56d5aed439e182b4a7bf7150aa53bfaa2156b7b4dfc06596377abd55b603c1f9737dc415c5d868a4557214b7bb9ee4634be14029a17400bc99a4c2913a73a92c95a5b2549651aa75777777a7f8658adbb66da3f9946af324ea4d5a8c62448b1eb6931671a078631f31a9de40485bab9e38e19653e0ad15509c547f19c340befa56d92d10e13943e1b6527fee2e4005b8adce5e554f5587ee45d60eaac2b4aa838caa7b8191b158e5cd6181e7deb5db17112b551db2ca441cabb0172ad3e0c52a7f17846395b35851c6165354e134c594de6f75ccf046f1f3544e58562d761005a255baf2c21bc5da3cc43a859452765048291bc8a594325c4e825b393993383314fe2c41b946b8ed9b167838bb5c6a531651a0c8236994e549090a6fe24ca2b858699212a597f491962c549438899b7489aaeb5477fcf0f30e6d28a9d4556a719f1966c7cfba606ab4f0ba37088e1a2dbcfda902c2e14ae9d239ced65b9bfcb232548bfb315ab89549b2499728272b4d4871245fb2450b1315279dd4b12e579ca634c1463012d491cd42061c33bc6d91856386275b5cf6177e0e351970db6266f9d2259581d7ff5503b9bae4cf26540cbefa28a954964aa354aa4fbc9c107851bc7eaef25bdc178cab873eab7e1fe22a5fd65042cda50b78231542142a8b5027242317eafabd1ed491a6f60f03e1858bc39d91b4e2806cdd17d755128208f56b71eb2a095184fac1248cdba83bd7c5ebe290430242d65d1a820f940d982d57aa4a8bd1db252d4cf503de2e699952f7bdee929626aa6a5ffb75a3b1e2cfebeeee761590cca0d2dedd2e8174b8b29a823e5a641e73abd7f3b36d7bf6766f21799bb144b62a866c6edbf6ccdffdd9d63c5ae4267125b81567055e566f3450fbd75715e466e4d4151ce3e12d5ecac3a5cf9e3b3f6564c183673b319596c9679095131b4827487728d6fd4f12fa78a27d87eff3f2c9d127a43d4df7ff4085b4e7ae8f635d387a14d6c7d18f90f6fce00e407b6625d57d1819fde009bdb000e077615be0ffe11352c2c31f2db6774b2e8389b68294272ddf500401aaf2b3b80ca4ca3e95df3d26f73625b8e94ae4b2ac331f16173ed78c460b3d18161b48cc5695b3a7bf0dd45ef7aa81565e85611fd5a3f9eaaeb81f9f25d6293baa1ae232eeb79c4c35a48519a53506ae0dd31da65823c193a31f5cc8074d48891c64edd8910f42b481bcbbb329a56caedcdd9bfdc0c1ecacb265f6655916ee77077252ba37e7a3d56ce53ebbfdb33a5d35b47582dad66db3f74bcf54190fa6bed4ee70eb56372584558b528aedc3ca2ab7fb6ae7491b48ae9cd23d7bd726336bd9d7dd8d18522ed7ace1f1eec32491695cf71b854152a5675a8aeb568479f985d9a1c2bcbc84635195a9aeadeac027319c16e92fa970d795fa1457e9ceaa2031af814f62429a6eb1af74b986cfcc27959abb160f975da35a66c8eb9a5f7d672699596acb9ae653669a9639e179443eb9be2b3aa774399dd022ad780c6e2baa72c8b60ef0949ad4b215674a07b0579c9916b2104443f2533b32cd69449f9fde8d61607efb1770577c81d9647d79f9ed25942d6ee1762ad949e66457aebb751aa4924abd279ec6592853d02e8986fce7d3ba99f4a9fbacee4e93bdee2fdbff684d0b97abd3cee2f187da04b9669dacfb72594e4a29cd6896895e5716b981e68622abefa3ccda4b3976ab59e972911b5a24227be0655cb783ebc6d5cb8f3430d91371a7f09f488b383fc8324ddb3939aacd15a57ce75f51be0682caef330bbb06da90dae0fab90685c00ced48c36306c2758802631ca1e145e5f746fab4051043489a4ab324e5fbf134ead9ccb299c2104f4d68e1d2930b6a963dcdb3b2503c42cc5b9b83079e5677e989c9138fd65d7a427a3afaa8189c94babf340426754324fdb520ad90a1c4b63e4aeb05174d57f895eacb65471db70b0b7564231e3275e4265a38195577271b388d01060bc05063290c2a6218218695165c811a03690c294b6364c182022c3ec0f224d9f8f934279c0f599665d90a7c985d202105d2873356f0124402b6d8c1144b68d962898dd9832ed030a2ebe20c1904f1a403277cc185ca954bc8c1199feb8b20787c51459defb3088d104fa4c106133c28411421c9832526b2a480f036005ec0a0cef9d40ba73abd061a797ecbc593359c40a50d17b0e08a286e708457c45bfced130b31d3acbaf081a6caa75e0aaafcaf8b23bcb6041e1f7fd44a0e9614a1c9833cf6ac5071842c82948c045e84a869e58a10bd058a9c568850e7e4a57286940851bab54d50283c2a5f166fa55b5b47b16a44b8d2add57858e16202056c69e298f8f85341044870e2815753b70a12889043081e4ddd2a4868238527783275ab4015b1c5f3ea56814a4205243c9bba55a09c48c251168e36d0ee4eb99276f777f713ac245169beb06e953482f018143985952080becaf9ca853ab27cc61d3ebc1b9b65b700403a2f6123b46052fd084b5a3061c907598c60698b2b517680c552d3117c588ad20265898b2e4b3f687a028436765f9303759f7a0e7e021bae00c2084f0841064ba060022107180801064f28d9c11231777767ef27ea589cb999b9a04e46537706132a68a209f729f5f424babb3bbf3b3716777777ee31a4bbbbbb73636131199e497777777632ba63edeeeece3f72952419eeeeeecefd947999bbbbbbb337167777e777e726a3c570f666777777eedaa18e907ef9cd8e458ed14c6e021f00d14c58b25041d1b4250b2c47685a38220b348ed020d1a8e623e6880a0c8ef8b842fd8a91f6d405c9080b946c09131b40c1b263c6c90766ecb822fbcacfcf2b9c94317184169c2406d44684932ba0b04829a744c2fc058371449447c42f852e66e0c591ef8a966dcb931b68c142fd4877a4f3b94182cb123e57322fbb728575e8a93924e12da8c00041451954904c0ef2138cb043243d91f4184c2f4da62481090b1289448ef15333832e68f073659d382e74c0649db0f0a05e83c838b1a2081e481c898fb16259414412ab7d67e993f3baf63cc2922112e62b417e0ae9e124dc9ff3eeb7ba5b802b929e01d7aa96cf2a24bebe2a863252eaee5ab7ad92322cafc1254a149410c75d837c4512672409ed165cb4408a10e74a9a100613a11e609a8a580444f08249a8879ea4c98458194a423d30b310dc72309d8163513582a4ab94a10e5d8d64e1760db8658dac04a9f6732fa04fb73e160aab56fd4b0f1cabe3a543d104de56191aa13c84b755d0b852fd99634cb1260fe21897e618972eefda208e3df9a0b168f4732c8d6d6d9555352cd30f269efc6d823128a02835d2902a20502b14e1414dfe4c6e4a8e9a5889518ca981baef29b6f34fe6a7b1ca1c638a516951c95127c18561e49852ed576a208d4a03f9c7a05a037d939c83f3e52526a67350a3a99c0de7600ac7c14ec74155652d1ccbd262c782b0313354313cf1782f61b8dd8aea493918199b1c1e8e3d79100cdc77dd4f57a7027df625bf5f876b7b541874e8f87170fbf96129030c04e851a7eca01fdeea1ce4aafb9299191a9a2536526c6c6e6e8e7096c0c1c9c901627583d5cece8e6a28e5cf4d9e4c535982fcf3532ee5d6e01f0487b891831b2c160b05265010455185292a743e5a3ca8475d1d66703e9d8f6a48ea00e2ef9896da9307937442878e9f9f12b0a003163a1654433eb1206c10c7a0bcf5145bc22e618376ebb65a50d2826a8895ac88f0465612eb3a72ec8963593a8895c4941cc5b6d46625310f3aaafd635d4d04c1108e5d1d57c92b22a80b520d718c4b8b354835432a1c532f3ff32d16c531a8a6e71897ee59462584fbee635441e677e1287f863a466648b7452da8a35ab64ab1a8065a185aecef5440becad0a6053eba3ae3820bfbdaea23e48dab34e4070c36c4a0fa09a87d71c7a55e542f324625c47fbe2743ca4a90b8f6d105c7ffb5b8a4c509f3b79e9c224afdbae0bc1b5329ed53dfa9972afa23f7dbcf7129493f05d2163b74da1d1a91df8554be67dbcb37229fa6a47cfa0deaa0d5961ae552dd214db19462b917eea6b6712a9898999aa6a01ab685648716611f0e4131fce392bf2135ec36e5e8403118a98eeb86e873373743eccbbb2fc78a1ac87f6a6fa4a808c9b64313c996524a0f2606a42faa0e4c894016c80631605b41439c01433c08b62d1cc6f0a0dc45a08c064e4c7184ca7fa31ae2a5eeb9a8a3e361705ab75a655a7c299e9d8eeb7878523ed85628a26763aafece5907ad76b4c52692d57f2553d9fdbf00814603c1182e641686345fccafbb71e3c68b239dd4e958ac1c2b48da71e0d869121bec720c29c263ff1cacc5c3e15540629cbc71a1c623ab9a3d677cb4c41f899452ce0e0520bc8eb1f68cc4466ccc190d278aaaa199f14b0ec7917f59cb40e92ffd0325bb8208542891dee7d1789e2b498c2580a18329a260d22cc836c0860b90886289255af083904b41a35377498b1234b8c815aca0026ffcea2fec0bf6420cef3f807dc10600c3fbbbb02f980b42efef635f301f3fdebfc7be603d06f0feaf7dc15e3ede5f00fb8209e005f4f283f6050b5a97ff8ef707da170c685dfe2cbc7f00f6050bc0bafc7fde7fc7be603bd6e5bfc20bd682cffbb3b02f180b29bc3f00f6050380389ff5f375ec0ba6635dfee1fbafb02fd80aebf2fff777ed0be65a973fcffbfbec0be6b32effd5fbabb02f980aebf2cf79ff14f6054b615dfedffbb7f6056bedbab49779ed51d8170c8575f97bef9f635fb01cebf27f797f1cfb82e158977ff7feac7dc158ebfa1bfb82dd58973f7dff705fb0705dfed9fb83fb8281ebf2eff7ff7dc19e58e02bf016086770fc0c7af9821101e97dc18864f8ecf705230af2f4f705232ac0a77e7bc188847cf7dcfb67fb821119e05f7e5f30a219de7b98178c88e6b77dc1880ef0365ff3fea97dc18868f8ef6f5e30a2219ff338efdfed0b4654c3af5e07468480e7f99df77fd9178c2801ffdff3fe30fb8211d9f0e183efefed0b4694e3597fe3fd63f6052352c08b8fc2fbcbec0b46b4804fe15bef3fb32f181103dee755787f9a7dc18888fc0aef7aff9a7dc1881af03fafe3fd6df6052372c0b3f00078ff9b7dc1881ef03bbe0518118f07fa00bc3fcebe604437fceb05f0fe39fb821141e07d7c8ff7d7d9178c28023f8077e1fd57fb821149e07ffc0befbfb32f18519117fafafe3cfb82114de0617802bc7fcfbe604414f8187ee861bf2e7ea20a843f2800f6ac8b7f0220cfbaf88b803bebe29700180150675dfc100073d6c57f0388b32efe078037ebe2770068b32efe068035ebe22702d2ac8b9f01e0ccbaf81700caac8b5f0160ccbaf86d0061d6c59f00f0655dfc080055ebe2af011c0272ebe2a7014cad8bff00e0b62efe19406d5dfc0600b375f10b010bf041405f17bf0c60af8b1f08180319957fe885ca0f0396ca4f8001547ea1312a7f75a1f2ffb852f95f18801895df851e95df471895bfc7abf2bfc0a8fc021040e5e701eeba824220a7ca1f0070d7b5036c21a8f2b3e045e5070050e5ffe9a2f2eb00775d2b80bb2e17b8ebf2015500f953f841e56fb150f9452e2a3f0ae0ae2b07b8ebc2118e9eeb06b8eb0ac15d1708be0f2a7f0fc8cfa345e5df59e9e46051f971c0ef8aca7f9342e5b7b1a2f2d7b4765d33618cb7c4ff52a5f2ab72ecba381c1b48a9a8fcda8dca9f4dc1df2b0558d1c8525b485ba95c79090d2a756bff04fae5e98c2c6a4edda53396a8bce1d45709e9a91c7e8ff3e4350b96089113cb51f2a4d440dafbacfe924a3765e164e5e94af54d4b6d0f37264a3def7b9ffe3e4aa78731f4fcaf4b675ca9feefc4240a977538aa746a71eba26d51393b24f8be2d6a6e514d9452598ea234715c9840d13d1941c9625f502f46e0d07fa1b28b67f4ed6f514c4c4c4c4c01a3daa884cdf66441ec10d1080000004100c3140020200c0a084422a16028186ac2b07d14000b869e4876589889c32088519431061942080284106008010081a99a1a00f9eefc6488e4606f630c03b257007b312e2ae872714fe80b28e7b11eb8ee7de9fb51e6850079288c27a492b5b8cc4e0ca9bb0b089bf9989a40cb37aedd12c2b831f3c51c25944241c49080b87349c3b3196f2756f4dcb3d198e2ca92cdcb0142ec2e6d9a85122e32f3b3add43d7208e66a346218d43b459036438066a326c6bac0197ec1a6520c2e8177586b9871c38a360c139b33ce1da8864f61120b5b3b2150ee3873c08193f2949d54853ac1095ba41d9b08498ec8f5c1727ac9b53ed393922d0d19372d94e093d1a003614dee8426b5a2ee7a151f27bbd18d3abe4f18e3775fdab7e6c3dc5ab68d610427098dfca8290f6bf87df1fcb8c19f3f5470c50ab5092b3b91e26fa60887da360a52be693d1415a9a9b4578876e59f20d6152da1bb68e17b847b02ea233e1e05fc33147ad4899561697016d0ae5421736d6450c4788038dbb671df1df7d0d45864706ea12ba9637766a89a6a626c072680ae5847f7d2207541c40690e54b32c3cc0b56d824ac5852bb0c6dd0736b673ff1903c942b182afb33ac6d1d7227518eaec7d4f2b6ab2111680e17dbaf76c521d58dc44ed52898414bc34162d8b886d5c17be1d1913a10845f76c69d02de0d37eaddc0b966968e51ece602eb2b6e5dbff1c89d1626cbc02416219ac459e80dff86eeb4ea4f6f02732c4450bb31ad8aa620a833d6f18fc5c2978f15c36c5d7352b7a285ca6c824933d01bdbc28bafe835b5eaee12535a7d930c75ec6812c69bad96de61e4e0e1b876a6dc03d3df6eca4951ba959ebc6004dbdd9e79529d42d151f3ea4da13185da3ededf38b31a153b2c55a8484415f44dea024194b51e77933876df34bd09b06f0266e5f9cd888db8d8d18c699f7cef8b5f12a243ab83e1628118d96012cbac3b7782f5f40b66e9ce58a3252305acb9042a757bac77fcb6d75c5614eebb15e9259538483d592525bd64ca04f641689c43cfe2d1bf972a108a94a555e3fce690c34696ead7ea767bcd61f08ca4236318919832d3828f02b1e4949dfab3a0afaff772198230a1883356505b8c45802ffe1a54d5ec1362a726f07c98c54585572940f8c54fec247823cea4e16379e0e25f19ac40c7eb86c431d1572332914274e5def29ca91e70cbfd20513ca6683ad34c2ab64ada6bc3620a8784f67158cb47fc9a3f3aecc7bfdb47d4d2c5644e5225f7222dedf70bae09f1c2fc1432f051c83cc8c3dfad0f45f5387988768efa311aa88f10c9fc5a2ef726851c20bc7d2e4405d39d057c3428967017d04d98284bb7992f1d85ca071555b65112092d52c7015e4ea5d53aa95f27498b5e20bc9be0d88f82633bbe908aab84ec82d91f496ca4ab16bcd68b6f144e1c46158a7a2d738b6dd9b98489e7b655454444b1f9b044b46977e7d1ad5f477e067e20dd9a6c3d0e364303e33c65a092e9b6f6ebec860a55f0f9de0ce7ad3c54d0f9513bbc754574b23e9f157b04780733720161060a77eef886c4380d5a3f33540ecc2dec2015f41035ce00ceef0460bacb043f6b0f7c27b84403513f0761dab0b0231a8b42dc3889983274a0b525c4c89a73b6982dc600d5be0f354aee607f9493b4f784887eae02474533726db297d12ea77290102158c9c490613faf2a861e75309ed024bbe9b9c708a79da204ef695ff0df6a74b70c0871ffd65672ac0b7eb68920e9c031a3f461bb613aba7b1a2fa8b41d178002e5b3ccedca14dd865f281f9078b7f50a41029688ea389303ba059932d58a0663e663b275a8e13b1df3f734a14bb94ba7c33799d75beaca92a1d490897e38b2cfd64b4c0b788475362577926fe0921033a0949b9a22bd037894db162657dae80072abbe851d93bfc3e781b07cbc2a50271165bfc27848db09f3f223c43227d07a412d214578360a672b0f9b31c2d5ff4f74c88baa2ab6f141d1521525f4e08e9bbfa201c89bbcdaf1495af381bf3069f145271671a8191b17422b12292a9a961087402df67bf614660199c9896d6f5775e7c567213d4c8ae730cc42221055ff0f402c902a7e6c875859e566414a9f56b5a1745a81122f0dc94265205b401c0ad2b8ecbe818f4854ef8ab42a0b53f3cdb4a84f755b75126cad72242d20e5c6337928e939902c24af9872da09704a499f320f751f0b2fbd832427214c3cc2118de8bc28425fe1f2d1690077c6a9a7f59ca0a2bf3172667840627f53dfea699579ff59f7928f3cb946c22cea9afbb0032008baa6b79ff8a00c3667ccbd3fa1c8282c180202ae064f858e3156109c5c79c3778102f78806289ae434d4485e0b5f18a4f82bfb40c60191411f01d0631d3dc190ece090fae56035c442ead1f6edd0803ee7b953be3077b134dd02c65c163b7cfabe11b0569d68b37dcfe6a7e7699d667d91793561df202c12728d18db0161e2bcf0e4dbdc8ad74542cd6c3f0811f2b1a6f2a40ff9c8073ef5299ff98cf1b1b468aa088745c1f8ce38da69915dd4134eefef453338ede853eef7f2941f48609b454c5cfbef3eaf2ea21db2db879d8f3c39f2b4c2cde497c9b1e84f28535a747aad42ebb249aa31c0cf213141734a510a31e002355e1d03902fae08c22ec0859df5a90c8073145ce05762c85fc8c7cde1aa96b76eb26fd81eb773abd2523acb6dfce923ec8f9bd96a727931cdb5b724e6266825226795d48c2d19d543270c2ce777f91524644dc32433de2f6153f60fcde82e95c01c379056fd61f34ca02cffa4a67381aa0f09d244b816e08168f404fc930f2c1f9783abf0d22a948bdeb9b8376189f24e6331993837c1b232eb140589a9429fa5e4928e627a964c2c97ef85d6d8a3dba18156d06b42cf0345ee8e120062bbe6888c552adce5bd291efc0618875532201727df082ca2faa11dd46262c9a2070ee5de89189b5fa9a6d55bdad20d79369f620b1da05ccb366b3a37aa27dedf55a4b4c6b25305015b29b0323438fa08b07666eff1ce21d398e0e83e00cd09196ccd0ee46de74a5f1cb01059ac03a3c9a4a082b65a3c8988b9eda1108ec9403b9c5de265d8efcf13a387866484fac43407a92385077f9b643d9a386149b17b7a477750ba42c7c2a9a77b3e4b79e61569902ed7d4173cdfe2b54a31dd6b819805667954e5a4751965ac08bf9e713af8aa85f2d6f8ac1b78bb0b1ba07cd5bf08527f1a4d294733337e618f0bb259f96bd7f2ee4a32a4e4295146287d4664c82e39a09588b403a7178b9aa8b91e14ba3511707660c2c703e306c29d199f0d9d953e5ff625c53fc03eda24dc81d0b30d537178b1908e52b171b9009f3652a26dafc8a5cad5ef8a7f1be640c8037b92294ce3a51dee1eba66188313b5ce45d8c357697b607e24e153a4d91788afda8fcbc09c134498c4e589928bec3770c5a6ecdfdb99bc73cdf0a911f4ecb0e75e5338b93557f2f16b1987ac160e414943238aafd7bfd936b1792adb65449ad6ac6bac2bd8fd289a0211dd0b4ad78ce3258a55d24560973b48cf55e5051b32432411b9d0d4b0e67e4ed9f9937aff6861c7d2d0352edd2cdd760ccabce0e70198442eca8df812948d8481bc978264c5aa9f26f5c01f5aac7d9cc563c09d4e1b70bce7c3b1dd66e1c26163b609890aa0f800ee322bc22f85875be551597deb6eb7094ec0a4eeb1945136be237bd1e009d463c8ee43488352c73cdd96773a7dac0f8bea55cba42d0794b64a73d2e980816cfbaed781c6aa06b51f659dae1c81ed85d36e153b57da9885a525ee9120489b23c276bea0e895b697f72c31ed88575475858a9e42afa2afa1d7d053e8d442676106e7c8ce4888eeb66149ed97d5def5d62b09c077714ab6dfacad816f1a1af166b6b2014583d5bd93f5339524035472d1d75871a9e68b6a83a67598284b1a2d176ccd7d9f5456268e12e4a6adc6789792ca3b01f29e3dc857202a600d6d55de5c07273a86788e8ee1edf582cb9fbde07caa546e9005ac7f1c9138edd6cde523194bb7fe258c6fd7f4a6ea0d409ddf62d6a53ff0b4c264b89dd520ebb6dcb16594959b863d38ae118b060b7cf4c1e62949e437cfc78e46c6ef89393f728459fa8ae08e4acbe62651f2c31c513b49db553df2185d9f12e23d6127341507a0a3dfe6e74889c072681955c5cbd2e4b0ea8e0430ba57e159d157ed6a156f3ea0d2edbbb2ad3181b4dcdbaddc3870acb39f0cd9c57024c4870ce01f883ca9b2315b980860476fd4dd4cdc5284bec02e60e95ac48fbd56ba5e71c16b9364bab8ff688f16d61625e28b77db4f7f17612f7b76e3798f95c03e7fdb8a4cad466a36e2f0a3f52cd2251e51432f6a69521846afa678f18f0b8e9b6923b4bb1188d79885401e82fa8090cd7d53d2a6144687172a51e6572f10cd5d1b0a13c8b9e2be11aed72f650471983eba2f1535dc0b3d3841947673bebc42caf1a57723072c3f0a6fb4e8ca8ead49941efa7f452b5128c1d8a4bd58be2174a2349c0b0d4811bc5c51b1898b932ec9d5e91f43e6be20130cdd2a1a675084e75c10e0ab6b8c2c1f6320bed5bc0ca2ae320472303e345f7d0639511a2df7f264cbe7d245bcbc99f16ba304817cb57daeaf0d8508a4e8f431f7b351465902aa68fa5c8c919d158e6a1410bcc3cc8ff50773182a89cf92e5dad4bd7ef09b1b875d11bd1dcff16f2c3b5907dc0918b1a86e341d3cbd05ee0ada485d2cae7e3a288b879e77c1db3cd04210bb2c88f55864b6304f44879f79473446bfcbdb62ecf68020e12d51b7e2398502e8f3f006454534f913778b33cfb280ff6af11da4a0190a74ff92c27e8a93da8379e5c5c9a0b9c617aa27d7590946cef564bffffd3df3daf8689e29810456a6243810e2f2421cf3c708223711eb42710fbdad89b38cf2ebdc78dc3d188c833fe8b4626611c9c373a4b3c08bbc0b51e2bc13a76047a8f26bee0332f72d3889a34d1969809c242d351106c2b97b1b23cc816693fbff5e52b49ddbe2abc5793a96f369318ac083a04b383fa7148e83e71a0fe972a368d910649f01642683b900a7d4abb50013c72ac97b46d3611471f6a87d3ed7b7204c68729557d883469f62a96e911e89752c798a0f2853ea596b982b4ae8dd6d92cf90ad3cfc796d05965b52a91f2e65a1167079043ea34ee9ddd40a19d7e7dfdef008e5a3b0745bbe6439af15b14b07872aed34d68bad17eb2c3f4fe27223222870c5f48a7f0066cbf9136387d53d7f6ce32b8afe50e4fad9a09c812ab3f0770e1e01fd465b212956ad9325abdcf3278a81633b8fdef3841db66daa5d6eb4a26a418697355f3cc448bbe0bb88c6d37b2c31f0aeae963eb307395c065d7321c459dc167b20b9882f47e5c56b8b84f6a8659c993b13b5a5c0bf7cf641ebdfe3a0fafbbc07bc76636ea1c0579078bb17eec81cf79402e009d68279e7506d4d13dc0556c98dfb0ccf3c855cf16ac55626658f47055e77125a488234a347f862ac785f936de0c2b22459cf21cb8b26d8da80ab62aebbaeffa78a291f15562c46bcf813fd75ec18f7a7db6044e4f70b4eb3707de20844f64408e98b385adb9a131800987ecda89bcecaa57ce810c9e6aad1575fc8296bab0e82e36b5ce272f8a36288a8b36603e951befa3c4578390ba6dedc086f83a2fd7181c8c3b3f17384b050b49a0ee78f606c83280616e6a0e7d01e8ed0d48312662f6a6933e2ff3bf89b2d7fb194ee0f1c374ab69334e65ef795d9d483ae21a57115084892259cfaa7a995e7ce72d8869667ca217b9399047bee81d797f5f5b4d657372620d8ea2f08460e0c1f57c4c78c182b517e6ac1fca82f6f5e736feae807622129a7f861df57a09c9b5bcd35a866bf7ba81f2080f8db1456d397d0ece0d0cd29825a5c344ca7ae9436abd65e2f0c290580ffde2ac9a7339faef3a930fa94703e1df9b91f4708eb086f1e44fdef492ea567e4f360596f88547a110caf8be7614b347c9f11a1b503794bb29ba52cf13e4094075ab0609e0922a7a35540baf0fc774517278eb801e7616336123d375bc427dca20a6673344a030dad468aae6260323a6ba75065b192d897c8049da355bae2c6e72a98c6d6a637c26009113c63a9390fd61cec4f583d2141a9654b2f176a6c257885d3a3d0044db333eb8f8a5f60f680fdce7e72e702ac750ce9b221047c73de797910218ca882e3a21c5b78fdbf7254d489a291d089a001e171d6e1fbc2897b33f193e3463ccbfef423bbc8cc2156d37e6fc46577a1132a1bc2147c55d8b320fb3c9093a92af11a55370945e2168345c6173c748868676e4f359c901e68214bb43c883d94cd7e793cabf9469c024c5ce585c0085f6734adc0eac894f07303377bf4a1fb731db83346691a8e100eaae3ff91a7862f5805ec70a94f268f6c4b4b942e933ecbf6406988f7acb525320cbb83f08dd27df781403de7095d192e9833f77f49ef347b4e57d79862a600c790a5ee528edb0dcd28be1b930e9aa98a96e3527adf0afbcaf029dd8d9909650ffff17a6ed426861c53d0901ca0f56fd995fc04008a7eb5a290c5e235a4de9f5cc5a7767743eaebc0b36cec8ccb52c71ef68625c43253dfd6cd2a12170cca252f22b3ea541cb23bddf0db0065a3fbf3527d97e009a4d3f4693b3e5afeca161e0b8dca863691ac7364ff9bdbef4820134278bdb1287da0da96987f3028e000bd93145b071a3582fb980d2d11b57b5a7f063523dc6dc418188916a990f023b01ec20d1ab4d1a31d2be8c791276c027eebaebfc6e8c83154e4e34618e63e71bf851bd8091b8e20f6aacbf9031069ea5ba6e9fb3574ab74a3c760d72340d2004040516f60e1c4fe96b7b61dc0a665013c2259e69954130e24a600814d502fccf0656d7d697d818afd17ab08558deeb858a242f58851649c3644b12144d55cd3cbec6a5cf4a6098aefcdbcd0bb6df5252a9a5e5faf3e9695d7cebf410327438924e63f3670631bdd0e432434e0959037c2f8a085447e563b3bc141bfc14b3d95f66cc0cf1ac0f1d7658426e743742504d482462496d63d8c567a5ca3473b1ae488ac243d002540ca44d1c8817fd53b41231731fbd8f1c36eca96727aa78b6c256dc5182638b420e7787dbc626d2b03493a9d27ff280718d0f376bbf4ac6e576101885938487dd9a3be01d7b92e1559aa9e2c2d53f02f91cbfa691a0009618a2297326c819b2c350636d6938ef01404a53c90b4a13d05a548a402c87d8b4d4aeed19f0405989cadf35f52538fb08f31e29f30a1f2e17a226628b4c57a0fcece4bb0caca823db2ea24306f25a54cb41831502f5d94c510dfb8c1313ba0063b85282bc10edbb50401ddc3b3a3b78799412f20d3af55ff7e300c06d37a8469944c8c79f4187411f24dae4ea3736ce0ce41049476a877264d28e853add467063c518011a45e89baa3d09ebb847059b9a0c68148071253fd7a0844b3bc830f27b3a937e3ac187cd8e8f3d9b3fc559d6105d540dacfd4c69bdce8180a8ef7211e3c2731cf0a6ea0d29f3df8ce2089551465a32a1fec8e9724caf9f6b5960f9729b56d51c26c0e3e64321589bd428e8c7338b346e4ac22bb360fcb9b89cca0be226ba870e6c32146304991433a06a222bba8e49882772dfe9541997fcfaff30468faadef75533e3845f7cdc7970e458855567e68bbd289b5349ab79cd19567fc0baa93894b2d18c4188e445c66d1d323de802cb1a11a251acd0d9498e2dd446fc4d0c3032b15ff8c1301fa474c37f7a646c9fb12883b3450af86a2132bc6de7f53fb7c01f90797ee618ec40642e1386c2a33ae710d2ed616c613b77393be485e45a6bd065a55ba4b0bd7febacafa65477fafc0855ce0cb18124666cae0b747b40243f07f6c4b6b26e82563d7528a60fb4158d90d82cb7f13fa94e5c4c7a7f3fbf7ee5ca1bb43f4aefae641446f00a160fe3a54671802e122e632010f52208b5529271b60780c328eaa1e11dcba426f9abef358139aadad7193bcbaf2216e9a8679489d75c6ccb5766e7355a5144c388eeb661d3a1b138623075a7ee66800709e73bbcb430d2ba48830cd610c225f002e4bba40621c78b67dbce47bb925eb7d9258d548bb593c4a2cb1d0d1034e53d4e79f0979b90b795defe507eaf8a6c6f9347a97a86c1fa5035042ac1abacba4341db92d34b8b80cd509ad49feb9c9bd6e4bab7db0086288d704be611d42ec8b1db752cb0b84fcb012f0080f68cbd8b8fd6c008c7aaab58195b592725b2bdf0faa4fec9a63ba0bd26d171deac847696d21ebfab550aca17c8c3b5f64982c980c5cb230a0ffa18bd6e545e63dbe763b1f8a748a9676e61565b1e0870538a29d9a8bfa545879e246441969c4b8935e6614b1bdbf9b2d45e388413cfaea829489c4b3c8b83462c5c2e2b6d4d35aa9e8bc5baa7436fa5e8a9e88637e4022c06f06bc5106e48834a5f8b07400c5ebbec14d4817d86add15679174dc482a01463ad6387765bc3b23d5dac8b73578e6f88714638316d26c6c540c8eee972d4a22acd04483ed7d9ece3c62fb5b26596004fda624c29ea860bb85ebc04677dd4b37b3e9befb1c8bad691081b349b2695c2d6ccf483824651b259604bebfebaef1b5710226c97dcf9e0803fcec037709fd757545eef2ebc770698043b3bb7fb08b120876bb88e4cd6d678dafb77e31f606a0dec0b4d71635500deb1650f55eca1baac3961b0a85cb556d80466369c2952ab1d9af45676986df38c404ab0304d4950f0e7469758ea3f4ecae494704e07f55ee1c0e5f74ed884d1a6020efddf5ada633448315490f69801958faffd25bc17e1d8e00702d1909e01b6e929a79626b5e0f25d62b3b4a41ecaace592cd78b07d17c818d903e64d50ff820dcf75528e8773b7f77c27c2feb6fd4937be255664ed8e79cdc1e4d50de3ad3a456356b6b550d66c17bf9a01a5cc836b08dd355efd7914c136a56b960754f56021268a710b282c072a260f5cc2c506b3d223465acaf051036f1962ca6ecd3b769c40233ea1388c8e27e6fbff44390389a7af60c7c71f252f993f11aab8b1e74818753eff1c0966c55a6fcf94ac237d3469258e753b08f6de14361d6ce50e58d27634ed840f71496cea0793b80a128414c4fbbfdde27ffa2897c94d63edf2fff9d097c4cb3bddeb5ef7bccff66824fd3b6d7fbe6ff34d9f83038ed2b5c8e81d8156c1687d78e18db2f055087f08043287082b4b061b5bd211d224a1d4eedd93f867b88c25fff88dccf87bdc74cc690d08fa162d9b86ab650cd8a6ae295561a750aa2a13070de131b7a55913ec3dff0f4188bf5748954bea5c7e4eacf81bc17a6a184ac632bea9420901a2d108d1a380d6cbfae33d0342e108d1928512e9f7469a0695c20180df06dcf58d73d1080327a3e3291d77ed418a963466fabe6b6d758370e63f6fe3dec28ad829ebac279bd8c6d838de95e91f98e020ecee5719a5246ba97b8f7572dae58fd0b6993affcdd6a43e983f20c54533237d132dc12ee4f8c8838502e70080346b24d697d433ef0b55d11624f2e4cb651eab2c1fc2896ef6ec0010ba55a8e820383439e3c5f42c6a43dd4362c87a3cf1e50bd6bcb3e9194e6f164c1642129d684a497584ad71ba09d1dd0635a7260ee724078c2b558bc5be82d2b4fbd86175717a993dd06fd12db08085ed7467c0bcd872cdadab301ff6e27b9101f2a6ff4d8ba8704312e2095f504569e87822476261e61e809778629cdb5dc55219a2946ea6374db0376b3f2904cc5dd2b501d07ab80087841334518dfc75f985c4a834ba4dd6e863e4345e3ed98341e5fa42f858b3294dcb80bad954b8aa8c0fe13c8c8f704239f5d4df293ea6c28240240bc637b9070d9bc2d7d02e32cd697d1d8521d3d2e34ce46e7003c6ab88e7a6af2a4021ee0c984c62ed3b927ffbfb26e8c8d6971193d2f1c5c01adc17e631cb359c73015735a3eae6f2c519198ad9f42f9a1217a964898cf6f7ce9c45534497db944d5e99358580c2d5b566e2cec050a3c48bbb12c1a8ca3e9235e13d1444a80031b9d362b287a3143e6c86eeff4eebf207160a949dfbf273bb6a794cc701077326da9c3e2fbc208d63348daea79e08a8a040b10d38cc7da4ac492b6e893325bc6b0d534dcc3a4a6188c6eb580b53f505fdd798893acffd0b1deab8767c53cda342641ebf82986382ab531eeb875fac03c1e8f4418d170eeaa7df3247727f04c7c3dfb3598a3c33e50ded0bfeeda9c0b0f87a0bf7d06ef03c474ba2048c0a2353b7c85b00ea7937bfc48d442c7b85f3e65037fcf2415c7d38d447983fde0323c115b45020b2800c2f1b14df26f9f93c250f0fee7c367c9fa13984509933d653f685a040d3ebbd8f0f91e6ab89c003b579254c758270fb2e7984c0d1c0239059a8e74dfadef16ef2864d250b6d7e33c902b11491d77ca0ae35b33e0a07762ad06037a1244103429a3c19c023c42c5c0412101076d6988d04ae24d6129fc7301cb7021fda98d6733f9d6d968d4ef1c53554ed63959b5c0dbbc4f4430a9a1a288bfd6a98319824ea338414b42bebb84a2a42dedba3793234f828336d83c8c991d386084a60598a4ef671d412e5343367a5daadbf539272c0c67f323e6aab78d833b378144ccce6264d4ba0f5f65343588ad626f51f6360087e93cc8e82986456f20173ab4fe75cfe6ee70c9178ed24c21561a7415c89cecbf6e3d16a51063a45aef0cf534dc7ce32ac8de356cc528a5aa0fb6ee16542842adb549669c141a50ab2d4008777827f1cb8a4c106e3e4a37eac07689cc40192e910d71d5d96b911abb75033b6b91a8ad824ce7c6331af35805076d3fb0aeb20da0432deaa61779b3fa0d5eada633e1ab410bc4e8ac05a809e4e4b90f3005ac1fc6e0d34e9154ebb6bfa300022b28ed9be72e3105bc3640b19595810076f3aab0314817979526feb6eebf7868aca4ad49b1649a85f228a1a7804f22551fe9da5510095888600f7d6abc7303420398f1682242ce20f2b7dfbffd5eb6c215bafa7ba553f71866b0eb4e47d257a1810166960450917f769c6582443126c0241185f7372e1cdb77ee061c6c2ac43a0344b65f6387e83084712137e20fc2a233360ddb18b0cfd10acbcd5ad41080985d9b5cab7965c2ab27a3f0529d9dd6d07c1d6bf0d0be707b5d69c683b6eeb6e6a9e8515e42a6efb75a62fab2361f235fde9080fc7d07895a7d65edf77d9f1fe52ce12c9de1a0570ad7716088da90b9fe7a8527999325dc9bfaa9078197efa95af252bd39ef924e96d1ca8e0fe7cff1d12270d396d09d1b160e9560181973cc70561c65eb6cf8ffe3ad236ee7061c4f02cc90089e10906300fe4c173cca890436a8ae6899cb0eeaa6c99a0fab25716e367ea814df9f2ab2ca5abadf652d70cc591416564165e9860da457d370fbe2f69d219ba14f6d74e2c4cb42892c0853e1dbb028cb49694f4f633eebfc65a14fd4374d5a34733e288e3ab314e922e33104f9bce6d137edf119de8ad5fe4bfcc22b3dbe2d78f515b9f098a768d2c032bb5041026579e46e422dd6640d27d802f2b92bc125b9df5b2bb9fa36a640290f1d4caf2fac484cc06236dd14edc48ae1c028f7a0513cb8c233a0b153021607eaca4c94290d816884008f728fa85c6a321b595b8b4fee7701465e0a887b34ce401ba93d93866cd9ba41c12c99b1ad32d7919df403ee2cd9e4d40491a4c55eefaf5108299b0ccba5c24e16eff6cd88c545eb8166c8374c73588d8104aef40806354900dbbf26c25ab866665f424995a0fd5cc1b83ea7ed4b9c24426875f90e66e8763a71a01e15c60261a70648579dc3bc55228bc8c31903350a34c1fb31e389824bdde9e6fd45e876931f54e988aadb434e8553a6fec51d1d14df848f5b39525bbffeb45ff408293a6fe090607702248804fb3b8400f2ea2ca89af7211fcae41bf2676c57a254770fc9db0cfdb4551fd382cc2628738f898aca16996fbcc76380bfa17438fc9bbe21123c81d5e0fef80c11398cf91c94905d6a8a2a1ded801294f22383fff60e2556c549845dd1848b96539a212f87941a02d6e15c16f6ebf063f91ba840c4372152220b171057ca18ac6e01805915087965ec6c621196193a9a1e285012e516de7da1591166c516f4d79e720d1fb2578fcf25941304843cec79647009dfafdcd3be4d29b1b2ea47c4b8181d8a641f01297f052c66c56f9dc7a0ae8a8547dd9efbf6ad1c9f356986143b7ed6504582b7010423805e114f7142bf1351a616184518425104a67591dc9a5b04de73d42d29021b34230f542f38442d10a1fd4b8b9c080290bb801f7a4689d90cd6d851aebd95457c39e807a13caf6ded826a85a815ddbec8100fc9228e3ee8588126510eaf84bad0015083c719c3956636e2d921b4f2df56f48b029de0b48ac5b236228fe083e031fe0f925b77bd26c6a6053d0077be8c6658728823a3c2b925ad82a628f658fa5f44b3ef8b478b8d51c85152c9e2587ac7f9a7be4b101a953900cbe45b246b0e34cb082187843a752793cb002710253fb2f7aa45e8da27edcb3ddb313f7b094c9f54055d2b61f501351a5ab2aadb0b61cc80ef314ff4ab783a0ae16ec626265eadf8c5d71f89a7b2a936209dd8a3e5779903480b159f6ab0451580983fd2e747f12d1c00943483d09296da2690cd5bc545f152fbcc022861901a4da55b5c74bf25bb09feea946bb3bf94c7b7a96c5e554963638e40e088649163bd41b05988490131af951b80ac287f9aec86ca7a8faaaf0e88ee6ae090972ab5d8b3134aed521416ff4fd5d64871494439f1009b53c67e7f9181dbd68d047b05e64c0b5a89446eb7471a00abc6c6db9c0cd4f8c10b8d1fe93c5da0d2f0c9a59ce4f5bacb0a6840fa2a669ce1425d6b7f3577b6fdbdf667a98581e89de94c9cac8139eda2ef1d769421fc202d869e6edfbe74a0629158034f404437731a2144f4e03293122851c5941a96f9da3a57e59aaada82cf5ae4e13266b0db0b2704ce674a03cc99b0829bd35d88577db9ffa83b2d461955140624d8cee3723c44ec857eafce821e9d5585f6c414d0f90103cd1aac26e5b0b08c69d0068e5b59df96efb50fe27f9ea3aaf8ef4366f8c884d573b9e7dc819239dafc88a3911cd3294966490a404cfea21b803953fa5398b60796bbd86a070dbf95b2b32b75d43485c8c0b8e7cc67cc4d6ba6cc4ff5989701e00d5968a4856bcac825b8b51e9533d53f583990c3ebdbc70f0404a5c05fc604ab73b245eefc092023d94a49998255c4c165313985e2651f1d8cd9789b77cd9ec772ff2e047c46aa9819c5ab461cb052f1e04f5e8764b08dc882b70d2c90241527f53de8520f1b451df0a5de2b1ac3fc70d58d9de121a887ed0be9f4181363c6ed3d346a863cc3faec6b19e476d29e134b7485430c7bbec1949173d0dc1500c2c8df96c029a073ffbc2e9654b9785beb439d203f0b96abd44a63c551a581acc088cf3d18d8e010e72c18a0a8a238a865b74fd47940afeb524338775c8ad9f0bc41c15d5fc473d6331dc94462db9443c20eada804fa2dc046ab03c1d8a7472e72574f924b621099fcd72407464f46100c1aaf40ef39ae23eb92ce237d2ec071ae441c2c7f43e8cf9dc4cdfa1b16336c57a53d474cffb718e75941df08670953fbeb05dddf38fcc6432f2dff5ac80f736077746014b75f77f1188a117bc5c42a69d59b33f76761e6bd636ac5467b723eaddae97917767a9b4764afd5ae239f9d65e9a5ce982e6357564dc40fae15b92764b568aca946ec6685957f99140b098d067c8149877d329fed61511c444c684c67664ff362fa85b76b99fa97cd155e3e94e0ebcf8b22805e28cbdd8b3c8da2d47106e2cda75a6fae759f71e6b6c33dbae16a6f3c947123311dfa6717883eb2e38f24867825917cc6aab32c8a65881e22c628a0d51d2f6aa66897b70e4afa400389ad59c31c530f7153e5a69a6fe296117d8d9d60775020f4234d1be5f5fb11ad42fd944ada0be201e1c1f9d32d42c4c9c496f5d3e10afc540f02913590433038fff6f909f74ef61af49719e4e273a0cfed51127490d9c8831cf2e251ae621c9b3cc53e8192f969047d187e9225b439058ef584b3ec937d948644022d099179b862fcacdbf88cb4c385baec8d5470ae8a43e8b2d04f843cb829c759f153ff2f2962ce4b48d0ca6f8c3187436daaac1f8e763b3acb93c5d36b28ed82571a1dc23e18d28a75fbbd163c5ae51e9ab74736fede2b11c86ea792d4b8efef8d806ed0723ba9b9471a527a34ab574044a22ae4e5e23d36a213f221ae8f0f7c3993b5c3999c2b7b859e0386e4065195d9a1816ad0905950254be89e7b597604c60b385e1d40832e8b90d5782d6bd600de17050476f1492aaad58c33d5c34686b9fc297aef57d8d7a29affcd6801e8539980ab61dfc8cd6474e18ac0123c6794459210dc763d8d939564974fdc4e1e48de9e6a72059717bfdf76939bc52c2ce104d519e4be91691e8377f29ef45c7d4ffe8edd2d9673cb86eb25619bbc9e40df2d2dd678427283b4e69b4c43ac9c8905b8ba26113031ff381999cd07eef14b27e39cdb7c614bb39a7e1e2a7e831f4af16da5dd432424bf35aad0a28da8de7039738c735a39c71f0d3a02a754b3501563311d701d5224692fb40fd43466b81d53748a6f55ae58cd1165ae2016523d31a5a7242e8ed5a11f162ae0ebd0f94940eee4a909620d4154121c507b01d38a9093cbfc3d1324407c5eb5927f4b349ace513f906fa2af708d88f9dff4ce2e78e4fbd4a9d7ec3e2510e63eaa1227e220f6b9ecf112188bd95d213b5e19e6d9fdf6be208c62a989a31dce9c06cfe66e2db644597fca6763d424ee4896f7d69772295ce5413d14525c0b9929e7f8c39b3c742f8d2bc5796080dce4187661fbe67215c35a0a610fb03da8374b0ee051102b9a3b72ec66798750f3c7bd6c874da0eeb750085235baf4a645800c479a2347ac2db015a27e236485496027de882f1a8b8a32150bcc60280231d6522e1d20651d591f0d4cc1c0ce23bb0194a414f4186120d5bc6de6d8140c1e2a8b297624fe124c18056b02c346988291be19e089615a37e2a1b21b1ca01e6c1694345f49196f3dde3785cfd9876f8bd8b5566bf0dc185cd26a5b1faaa41d8e248cf76aa3ab737bd5d1d83182d7456b747cbead6c4494aaaf93848c4d7a80695d5ef46ce766a58fc5ab40b44f5ed5d46d83a280a243f1a93bd0938acb7c0a5b2d1e26770c65bfd2e2a149c30e4fed0ae649fc5fbe306a77fb243e2b01a399639eaa23922e23ea13990daa8922522c6c3e94ac880d8707606971fccdd7aff6bc30fec947b141df86c838c9c2392b68d30ac6d8d3bb8e0a86b319d0d2502ba6832efcc8a5600cd1586d31bcba10ee66080482abd4fb46ea4d3678279c018a7399db99f81233c39e5f0723cd8897ccf467c89260c326b9c41e77136af26a3b972cc61874bf8c4fa6cf02c11df424022a0f00776400c49c1b0ff8c630361b9e3067239549e250dad5be14361bc20242bc0c7886190eddaf7e3e3a9d63ce6734457035d02ca859beb04cd0841361c4b39a754a9d33376287d90647e625951b1eac1c5e64b520509b9dac34e5fd657322142fa119fe1e7eaa9dac1a44e9daf93cfee98e6398c1f4366f82c4899f97c3d4f1b8b627244bcf13c62399a1387a8bdb82c350258edcb5509b7db00ef35082bc9c1cebfcba4d5aa3ef6c79442b4ba809915b16bd346708c16a02a95b220dea6abd819ef265d0e83cef9ecfca8e5b6a6467c9b167d18524e2bbd37ae05fb700aeb5a7f74f5d9bda2f1d686b3a54a254926db7b17427f85de99e442425fd723a0d5f8359d604533f0bbf99a0762767fd89941ddd922539469150aa4753110acd9bd52c35672de04d291c1dd17a0c4d01086ac0afd947be46c289eb8480c0f9ce12f16b9ee07b50d135fb404270aab9db50cb3a73bbbc1df7f4b29db6b432dcb6e3c1b1d261f091e5eb83ad5fa6703565567b9143a2d0fcb79a1835801ca29764144a769da946381d69d642d555e26c064ece57ecd1d6c11f049a8215fe35545e453868bfb9158f693c03f737840bda1e72d66fbbababfc4a3b0280634c47279a531fed08030e50186f01b0d37590781ac41eedf8c50ed160954606e26334f8bb34f8afb3e953390b213b55e6c436f557667f7e87d0e53f09d0a51a2efe167df0b362f9ecf0b4587864b594739c805c61428054fc40127b4a89661979808036c7a8794548fcf7ba76c9d6dea1990fcc159177ce34ce0fa9ec2b6598cfbb2c8325a2c49321714be67ace643539e70efa3998992c2f235c4de5c6e6be17dc873345f5ab9f75d6891de7dea3e3c7d89dd2d13d6d03ddf6ee1fd6763cb8a4014623ca256af7e7f9dcaecaa487e82cf163191d5d54322ac0673119351ca4380ea6d909dcdc5e6953246b0bcdae7a38a2ccb5ecba7521fc310656e6359d155cd6d976689036dad860a40a57f2be2c6e1928871182acb859667c3edc337d3a1a25ffb5f5f0a732c4a2f0adeded62abe871816273726c26d89226a3fe4c612ba633c329a9f491ca92faacfbe3d5a5d399a7e0dbc03af97d0408725fe74458e2a2db05d05c96b03e33d064ee358ba03e3df399962640acb927cfdeffe993716d7e125269755ab1bf500ae9624dd1c881bd8b74bf0b0c49959460af1adc7da2206d70dd8dfdac74415e3fd1011d9dae8b89ff0e04ff1344b303aad860aa2d248b78749548d467b78509e4f92c3e61a2480a36486c41fc9c3491cf10418d6fc9e82c97ea2e9819bd63c79b0614c82a4c1ff79746ceb4b65fea2baa6f7686a7b9389dd0ec2647332a50de73ac11c459aea451b949579cef6fe9af50ff37c36fc8f61ab484d6907c34fb994e3f918e54264e03064761fa1e317abd33d2b74684a310fa876e97630a6667f9e23ea211e4b1c6a494d5a74aee9a7bba607d657d74f96b735e3b0f5e21f920bbffe78866833c079e538ed7f96624d4bf98b94a9c9b549321ebf313e745555bb4d53b4e7cb48fee313b72e64b6acd240d2277fa2e695b538e76ce6cfbcddd61ffec232977ccbabe80df1c229ce2189856afee5741cd37dc6b6df01599f1ae6fb789f14e9ea2b3871271f96141b69cf7aa061dcc0d2b46eb76eb46e71980f9f0d53484a1fe71f77dbc9a09476abec4e3ca089196f10850298cb63502ae7878718503bb50bac7ce8586a7ce6e712e63f225a52cb6e6012da9a3aa43b4c30ad819c30d789abcb9177a902bc9a40c9c079ce4db71c2dc429f3196468a3a7f13570ac5b7e7d63cb1992d602c7822ce274d23c17de3656245b06c6e4733f265ed5f361a9431d276f45f8dfa79953be544377398733a8b3e8f2904452a6b159cc54082a3907786326d1eb864b0bc618e5ba79ea8df84e37a42ca9aaad10ee11249b1a759817247da7351d3c9c7b640560c619f23b30ff08e68b9b18ae2d94053f5e9309478f00a222c973ec9279ab53c7bdc16eecb89f53e3aa9cb38444403ef52d35c69be5a828417190d2fc315e30299b6991193736754659db25f16763ed5e8c37b0c0ceff456c5570a2a578741565b825d17486694306f2b6848069c7f3c19ffae0ae87664bb0bc9c22c23257741b33c5b8186fa8a03125861777e034ddb2e8b2424f73cc9725b118dcfb0065ab64f47061b7d7f45323b8d55aaf60e193cce5c104249b33513480b0f65bb87803a4131f839917c738295de37cfa3b1548e584f4198c055ecf23b2c837321d9c861d1ec439d0a0b9b85d8a268251248f1c329dccbc1c2f0272abc01f145e784d1ac05c1461688a5e2ca8a14ae494fbd187f847c62446fa52a20c97be9415c4beaa69a7b8d17f145fceb25db941fa401173bf618cfa47366b00249b193202eab9f1e80339d2159859333634f1c1a667265a6653b75356c8cb6f4400a6b884e60ec1dafb7aaa79f09320b3053e8d3559b0d68e7cc4d785febb8c0cf02eb979aac9e07f12566fcc2a9cc8423c1bb77f95c4af60bb1fe945222d1207a64a44c07bf8561c7122faf80dc0c12d1dcd9d99beb7b2cf80dce237424df2f13e63f1671430d224003877c21cc7b4e25e5501c36fa1d11056b5b866a958f3b9e20b43f03d5047c11547958962f6e96447e5d1308d720fa774ff67314f8cf7c973667e5c673fa08f6960d3f243d74f777ad2036253e2d492ade5322851df4407180a00189368b1b858417c7207a728befefdae6bed13226e41506232d28e1bfceeefa4949b4dadb720cc85424259ad5e858d8f267c43c23c660fdfe4566745b6addb15be8c03240ccf353dcf0fabf7b7947200e9a52dd02fec5a454a152f00b10e24aa89810ea6707ee057d41c883a5893dc933a704e1134cfdb2768f3131234582a2a0975357c0e1a5c058a6114e0ae5b06ae7c1267ec5da3da86ff8ac861ccc7791ae7cd5fba1fea287c2137456a51030fd60f62db750358c84bb708195afb69116ed09ae13f963bccda18a2dbc52403ee6fd48f4f3403619a30305de273ee783dcf033d69b5d2daa58fb56832d3f28ac9d869357489602e0e52dc5804bc5dc684abd43efd682e71759858a0020c05c8b5188538817cba910d721867af7dde666e9a1b6209a54fb5d8c3f4656a96c96ae3830ef2a2c41b8da17e75e60a8745f52bc5934eeff30685508be9ac185c7d9c4979de4b33cfb266993eb579f21eaa0018725473368a422f0272d8f090c677c8099493c16915ab8f45e7f88370afa20bc714c21b6d028e51b34b3607ebbb00005c5d4157a7b1f4908a9487937e2de75b33805eeb6817b144d4c3b9626f313cacff3f7971a439a41df490b29e3ecb84461b3b8fed352aef0880cb1b16cafd3d618d5e63fa4f09e7cab2f5399cdabadaee92e29e144bb0b62416b958cc0ac4dfa72dfcac18c97cbb75069d0f38149f81a7be1a98a713ab792b4eaacdbc7d6ecfd19d6f722386246f1e08d84b97fe53724865afd5408f2248b721480a9663fa88a55418b77df3e1cf26d4f9cc126fbc937992084745797e5a44d326d393dae0e221bb09a19c4aa23cf8a30a8d30b54e4fdf678cb82df834773af527fdeaa13df84fa2308fd1196985623f755911e1e0853ea2d9abd7d469d82a8cb63836592715f5d8520755b9832430a508fb476aca2d9da8c1bb0c30fa3981b39e7834a456e13de0f19d37c91a241125f35a34077f4b328638098294d7303092435529df441595886c160ff2f558b5e0c342b514f32736a6079c11eaec23e986f50ec9ac4d70f91a71c5587758089e17ca857412b5832f899641d6aedf3209cba44b3082a7ed574b3a5dfbf5369ba002554fdcdffc5b1f1507e686fe3d06d6271f780781a386f472400fdd5abbe9ba9747e9322c562b18333406326806f2dd31636407a19246d2f219e56435c7a72bd52d4ce3aef8002f82e000e5ba7694a17744ace5c107913036adfe8237d697354714d5519b848ef6e39b13a9886f333fc674d44ca5f130d57c2798dd83a30c5f3336d995cfeb58a4af7570a735fea9d66e846693ea2c75a102b63a0ae7b953c51cadb05fcabdf84d4520b692a74b840d10b099f327fd283559775c30cdb82fa93f2762f95ab04584ed72f7d829971a3cb955de0a06046020828b9d32d6de7130ba5068031eb9f055ecb91fee8c58eed8e9f9cb88356450c620ae8eda543c53666c267d839389c32b7caf1e9dff661cd3b842b6e8b64af819de752954e643369b669861a0d29bc5d8242a9caa64d9ffe1bea94687fb2169b6d3a82219d95652f8e78f95ac2b41a57b2c9a5512e7322b526640345b9200ee8f54ea0a91278ab849e943ebb390e30b95f1c6ab3f0c3a9eb7df16b3d6d570e1f99c7e10ec65fb2edf08a97cfe6acfdf911ce92127d0eb97d7050100cbc2a853b91281f56da2a38b8ea14f4f9fc3439ede7d2c1dfec4cc9e5320c4ef15aa351b02bdca1831248d2042bff9656cd2dcd4e619fd11a66586a88d9fc3447f437094efaba76577e1eab4e17c4a56860c9f989925b8d6e052f294a2c8e4a0d4bb535b82aaebd60e5f55279a1d314ad4b18d9b10387bc3694eba406d60f2085258c387575991f709dfba278ec8db674d2e9ea12fc2bd0c30d742977bfbee9920c24e452f4d45169ad7996779d2b2a956a3caa932b94452f3894a59da1c15c3bcf77ec6353ca6e3381eb121492cabe9156b8586d8b5582b33bc53b03c8c6821626f0185873fbc58bbdfb31072a9e4f410fe1dd8d542f735eadd3981eaf29d6ac3dd1323010c1b94e258d27c215c088933f81352bac5decdbafeb3abb243100f18c609e140d776682e93b57efc5db13c1df64417fe89c6b7704b08fb51eeaaf66830c823e02938845456ec538a1c0ebf8f91e6fb31596c57c49140c6370d7c153563b69f935d05ac705b60ffac7108d45f33ba436f4beb6f436563d80341fcfc3cac5e266cf8d564b9a1d1c897947115b09968a23d4e30b707d0f195c3060d6b71d4b367bfb7656258a767185f9f7f69d5bd825384d7132cb5b87fbfe28bffae397fe5c4ef46051e00dd07a9b72cd06f573dacc0b426b42981049a287dd7bd0b1d41988cc027699e6ab550e8fcb445759a09890773e4fc8541236f1bdeedcc7932b8944e19235aa3c65956fbcc78ec85c6b0fafc92d61fab74eb0b2d2ddce333f4289e91791a55070cb537a64b55f53cd558af5dcce24ae30b68b73e6429842836f4b35f9eec1f0df48beeb6fdf5ff79508e830683c8007c230a51dcbce0ce2c22291080850ae5a9a1349436b0ee3ecfea689bd1b3c16993fafe59a850a2c034f02a9a71f66873529b74ca318c8834986125f6795bff498e8a91e726fff3ef0aa3ef3b5fd028d23ccbf3e07a125f8537812b694e828edfd95878b0606db73339a4979422b5d64f42a01a68e1b8a16641203f01443b33fbac2a062a9f0b65270cb3e106c84f502b823cbaec2dc26ed0a8b698afb39c685ecea60e51c35794af2092ef085c1df74ccc3cfe188c4466b7a37e0f1d310e1b438e10b2c7eac248594d3a8adf9c1a68796375ce682d452d32f7091dbdad105a5581c8364013d542e0b3a0e528987c3c8d1d8fdb4693f216eb4ffd5db84e4be09f79b95f1d6bf87b529fbeb3d1327ee4560823ff7fa6c4b1202ba1e4e4794ec472e7bac40a610c451814a77b2d950146816617410804133272a09902bdc75aca7378202e100fe28eedcf19d1d13477206a85dec5cb72b95bea22189ce04608a39f02a6b45dfd3e68b8532076d7e7f6a90de6fbb242999b890612b057398dc0271a9d0be9c0ef2c88129d0fdfaecaa383f197bd731ba37ea5738ced3abe820f9e804b1b588368dbed309e1a62c0a5a3c71af07cc2039b7f183fe40351d6d82a0785e085ad31593ef885a53358b990c4cc2c650462a05a3e963a63ff2b5decd164022e07046205611a485f3704ad821078410afa13af1205963767094a23233c585473f1002b79e8c1f22d12f241c48078826c36a492b0438a81c414541668aabc1c3066eb36da4a77bf7234336dddc5402a03bf0fe3503de1faacbbedc358ce719212712d5dae67c294508a4cf7092648e738be41a9c4a48eda2e4f386c187c851255390630029e21a92caad7d54c9cf048138355a38408d1397e6eb4e35e259c95e271b815d682e7f2afe741052d1b70c0876809277e067c62211a0f3a2921b2312e4bcf4f7aa44d0b57ec3e1c8fdad372e13a94aa9366747c52554bf7427f72c586b8191145480a7cbafa2c47862783a41a0fb2ccb1f0036d0e9faf5e5631a35668beab75c36fd5d6e827f05a6a1e5c714f3c493870194d35993218a55790d5af757520d484c97bd9640bd7422bb1d42cb2bbace5c6f5fda69840d95b4d4e097e657fcded22a9d297fd92507d8c0ec7cd9371b704133acd1db8bc6c3e1ab79f15e985a12349ed035bd02ea14fb539fe51233565156a9bd6df98626cedfbc934b9257554472cb75e6b35c986a20b89d41e4039d0f2615345015fd335187337d48d43a2b32094087f2466356aa54b0099104f0a95f92591cae96be5761dacc8c28909ea7b0296ee4dd651d9557177c6fbac2b549f9904303f652d8e808b85051b3078e68c524dcb64f4b61805f697948f24076667af59af26696e0e4cb59581497f9828fe61a48e547c60f782a4fc67e84fc9ac9784d42beb0881345060d544fe5fc3cb0d2846e732b3240caffcc60ea17429cfc9277e6515170afc4b9ac4b4f9c93f81b8e556af197bd5bb16186b690bc9f1cba7d2a683ea5deab15d10ba4d09c66fbea91a03c2242a4e1a0733c2e029695a8fd10b18ae74ef255c72a1a9ee9fd161d3677f3bc4a2ce9afb6233e0b9f9aa8b98325776be92498eebf9b2e4e443bca3af48c4c57ec280a68872e52edc9e76caffbc2d55b7033161617880cebb31241eeac80211643066b0cc04e1724e48dbb60d545db168a55e778f902971ec6de93db1eb56600532ac31f28fe4133ee902d2a88c2947907d036080d4da0d35ec811ea84148a98645f7ff9716672dae14c0c0561d895b5c17f13ca97eb0120987c4c9dc08d0e10bc86194f71e7ff8b5df8b82253d08de99f58bde72b765908d4ba5cf493dc15783cc46e435e4bd14a02de3bb1425861674c903a3e884e8d703294f68ed54e7e3ea95038b2cde679e91d7b25c33007a41acaf75ea2f0dd5f75ff8393fdfde6bbe300d66a95618ee036f975ac47e8c9f4313544e0f3d2a4287b82b1473368304d21d1914f5a92e2a94a3382fb9d29008950c7f70a5106f36c910d7d2acda31404a656d92f8186f27fea35910a43e22fb2377254bef888ad473091d7b51150ac99efba4b1b6c0c7889c86c27c9cead524481344710a20e5beb252cc380479677690bd9d633141a8dcb3b9285304f43d390b62e37018900e3b512871303f60e8d9cd1fb6c054b902417934e01f3660b0cc8886ceeba4d13cd7b6bc7951553ae520068b110bc1cce3711aeb01750c8c1f31de6ac7280320135f0fb5197c40f603a46648e7325d45e3df7e21cfda9d63226d3d5cc2d810556150fcd89d32747e1913d0237eafa57ab7646a15e1d0f7e928f19cdabaf10c089226bf661f41da524553c29379b763949f8585561392d604de93a0194701a7ad4824779aab316b452c3d61245832b28f67b7116d684d5ee495a49b4676028abb3cd18a0d1a44946aa0764ab0d592f2967c8090f4c7b3ea737598e7771a59d6fb5527eede2bbccab8231304b8eece0870966648aae87450c12a457ca021e76a7c0419551e9a6da4b6cb07fa53cebfab1d381b577207849e829fc85b26aef139d3f02ff6a55276b53ff6826125340c15fddf869757b7585e72b217e43af610c81729876da5020a81615e65d4b392e02228d2d498c301d7be3350919efc6283a51ec580136abd7373844676835c2acb575b4de25ea6cbc245bb31f394a93e39cb53c4cb9312431f58c4b12cf24b3e399844f02935c1b5cf0747ef74256084628427e5dacd6a29898b1d746b20bdb7e6cbd32a00d5f02139d3b679195c22f74a63dae4774b4def34752af12978848b33aa92f47632375db472f05732adfbb2ae4520e6246081dc2c79275daee00d32d8bb1176d7ddff20700b2ce913e8df552e4c8610ccaf03bcc734c04bc3888264fddad1985a9cf389d56df72e3335e08b265773dbb273742697d6ca04f3c1e7411aebe8d56b428ef06e3324026ef17147e11dc17f68635cde19596806996c501f4b60b3f6fcdf898db9086ccbcc8e37d87040534d3ce3276956c96184a04f2026327c26ac9b083ad4fa37749affce8c434f65de20c83ef62926750628674c9c2d8d32fc49e3bb0461f0486580582636ca890fa84f202e097926584d4e496a7f3da8f5a34dfa565df0236b5a8aaa117f773d2dc3899d9382e9bf5cf07c429431fc1392ff3460ea28353cf8b53ae210911b72b0f70ae623fcfda213b4d5ec7de833dd1b9c8af60948a422b7a9c1ced2a3151c3a4ecf657f91ecf41bf5a825611c50f691d1ad49444dc6a8496de21b2568062f6dc6f7dc9662eb9d3302d316282b22483012d595be867f40f69feb582b32339b2b97590a509722cee918e409e8daa367d5851d12e23264d3f6d073d81c25bca2c2f94993046b571b3a636ca93cee0db21a27a90836831d103b22f772a06ff5b61e4e074f00c0cfb8fb15f108585960cff591eb750f91365622f60a6788b460b253117e2a5055228272f06c436e470d56ba961789dbd2ace13c127e3ab9e600728ed4acc51c0e04ac2dce67312a7cc8903b5c0eb3da16b12a7f1dc40d53f6242491a940f0990cf035cf4113c12edeaa9533426627fa8207a78af9751f09e4c9c6fd8bb039bff2382a027b890b7ca3dae0ed1755c202088e88e1ce8384a66e6a9a4b46261e0de6f02b91e7e38a373aad6ec7dc9b08cd31b0bca184963eccfdc0f5f321c9a6760b933a73cc00cd59c16ef1b35506899fe830f02f00a2894948c36f934d6a7ce046558d0fc992182c9ef8322cf96d38da0e2cb9561306a7b8c48ac0f55a54d48aca0ef32a8dfbde94b278398bc645e2379dd76ac6981b2a4dcbb994c313d167d6468a27a8aec462031529d543d7be62aac314d036c2dc252b905344a8e278ee4ee181f3097f7edc64d289b148e67b3e3593ba59eb2adb7ed728d464a9cd06de9a410c2d2fc9bf31dd4897ebc9ead42ae4a8d201cbb50d207a7429acfa30347616bca4f497715a2523bbe2f1cc1ec0631885ee1352fd4e5885a511f85674a423598de4df2edc6b9e956f1ed77426b83825d444e461ec128b58d25176648b07f82e6269aade0b346da6781fde324a19c029e543fdc5382f8557046ec60be8e9fce64b36d20f9180f1ffb07bd2878f522628e6fe996ebd7cae35a713813d0b2a6e49b4b0d2fada5f9a6645342ac876b2aca5ea064fd13d9652b007a365370ff13f0bbbe7dd010fd7b294d091ef0de48e30193faf6d0c55e54d3b9adc1310ca826e64261755e4d5034e56a1f0d1aa13fe38c5af61105430fb29a09188e6bd23ab2b66819a5c20155f7d1fa011de8d6240e76808a8888ceac6e5bd67035e9711a26a117d67c5c14762f3f94c1e0ded36adadf680b3a5b28325331c9ffde477699d0f03dfb813176b8c4e7627959d1d877e474a738993f46137ba1a297b2534e75e4f908256ceb87792aff2a1f11ffe99ec0eff0e2aa0e4262715de4b79833d3eaf5226abc5846bd6cf061bfd9583b216cf248abaf1fd6070913a3f707ebb26ab86cb0b130871b2f616e8f5141378eaee594765b8cf649f80af3fab7be17aeeb753aa64ef8ec49cd32fc20dd5d1dd96c27d3cdbb581712da6fce8f987986f0deb441f3ee751339d439cfefff96560b11842f861d5354ef28079106adf7eb8088560e4a6b22074a849a588d5c75042203972e32b2da77bac9585fb23d7db17d42a57bc60b7d08054d953e64554de39a04b9c24d7945ef22d7cad9ddb5856b03aa400feed5aabf09d1bd60d06f089516383c311f7f78ac4c6acdb68c419e039a6150bec2e09046c2e4995f5bce65dd36209c3f4e2cc8054292f9f009e5f2288da554c560d8d024430d22d8b762a16d92cc457243442adf25d219a0fc89b78a293fdefeccc77ebd918629a947aceb601de8258fd35ac83b5fe228a0f328dad21b3e75efaade1081ec3b5a89e615f2489d72261356f43faeb0c0e02484623fae1d293cf55210752c0ddc40265ec0bf90613c142577b0c4e5faac573d715287bd2c21454401ceecb45722f1c144530374ea460de1e6fe0c3c3f2b3c9af1ecae2f2cbc3f5ecc10060a080a26bbeb23e1aed0ddea806df98cfb8fca05e9257e1139cbe7210e427d6af98b5ff0494bd4edffa01ce8d848efc1e34498b8a9e38e8c0d05e87fdecd368ef87d9845d2b0b34706cbd67c2331d22548aa410e88f2a7596d4e2df9d59d165b2bf4fa973386d8a6a7d15144cccc38a436554e0399a74a854e375d2faae9c987d99cb436e7da3ba0bba64821e390098571d8c2fa65af64681e570432bcee2003ca1c0b2d0115e87648948fd30b6ec6edc1c05bceb6d4154fca13da8b4df9208be4c1f33933efb2556f88715ff7facd00044defd8cb25a65c1abbeeb4656146fab35f054ce56ec50f1ba0c512c52aa02e5688c5069e12fd97d802895d459cdfa4c06c71552f75c1fef78f1b2e5911ec819a004ce2ad3c5548b49d52e09e9dba0907351bc4ba62911eff30bd56a95358cd3fa08f3e9201e85069855657eaf5834d5d52544248e08d387d6f75c58d4c02e2c021044fdacbe06eb5750c4fa1d18631af2d6ed49d79098774d4f6ce2a6e44d3d27709e05331b8de89c57a76cc1c0336b35a70cc4ccf58047d204dc7a456bfba0041eaa8e35992ece03f2982f97fd0c5d640d1c550c4f8b8ca071dab771364b32407a967741b9ad744972005361f29fad3d36a36e7b7f476bb8b6a6db48e02beba9fd4b2415b71216ce091ec825515da0251456ca44f4a2cfbc00edd6507a2f44890ddfa91d96c234117f87014388b171ada3bbec39e8109a96cb0a1bbd6c9e2bb6223b64762e0be0961b7e1805e82993ff9dd181f5d13e5ecf52d67a763cea9859603f27b97bc54ce62abdd9d1e18a107147be07c8b53ef2488c208ba23abd504c51ee8796b24ccda856bcdc24cd2a82524bf032d74b502d14588dd3b4ff3b7e1bba334393ed6984406714eb0a67192dbee2ba5783f6b2c20ccc7f4d0f6651059c548f99e65287da537d0a7ef056d5be81031ccc2229290053dd106232a517d40013143ed9c40a191dd8dcacdbcd7a85c0ff0342ec32f8e2f65a8ad45ae53bbe4500cb9ff783cee8bef7060d1c202354082fc8ef0e8fda0b09f29144210ab08386d30d85872c603442a19fcea13d58b25af1abc43e1440c2c1671eaee9c9b8fdfcfe78e896a0d3a08917826db2d815eaf9751caee6230466f25fe00ec3f7aa2ea033698f68b830e702c170068b51c3b80270ed68831eafe352a5bc4d5f0608808bf2300d4517f620976234e846852c629bf5c1f0e836280f836d336e0e674de2d8e953ca58ec744fa4ce0f6166a6519d8881c37d3ad4babda1f1f06dc81746a0ba281d85ff7815c1d35d417fc7a2997f8120d1df0ef67dd5ad22ad6668aec5ad5a2d240254a74faf79d9f90ddec61d0f426bb1828868af387edf13a3e87e0409092e6564f80370591b80a078a2479aa6024a7223417141dfe94ac6b0ba87632773762db9676db70b390f0a2df2f63501c39195c3ac463f1aaeb0e3c05111217505fe3d4077b33904d06fdf348aabef16d160fe25bec9db8b6501ae4cd50fc9d038904b932fba76e68eac89a9e675226da5bf35e16426a86ba2398cdb5df39730c6697d5b0062cc12f256bd78e83b295be22181ec09280621f256113204f8e34c49acb713f850b5649eeb55d9580aca660db1ce28743ca196f7b26afc5b7b6b6a67ed140e4713c37b3197010166d05a53d27f5ad16b86491753d3e2f391a48359c400a1fb9a7403735323392e539aaca2e5cebb545a5a32017433245e5de1248a1d6955e09edd3114a9a459482f356280aa2bb98fae329aa57f85ab969fc55c11798291d3cf59b994dc555557b5795c9b32ca1b9442d99c19210aeec001daa39d94893d6a1e29a831f34a613c8da73600255999931d4c7390e64ad457f9b602e980400572e39cd1b88e5c9f052fd930db7b13e5016718384b370cf7edd755ea75a73c736436a19d03215fca359f663c7af0f16818115b9033cecb7072ea4560f21de6d44a0ec1abd6d9f3af81404a78d6bb666b5912105d921fc65febcc9f272db2d30002b616d477eb18e714866b6e41890aee1f3b4061dfe4b3d23905a67a98a882833acf6261ae426d0b4344795e1748248bc3e89ad48af708e13caba08cdee3d3b94dbdface923b309005973861868e7c9295c34521e0906ad854e2a1419a4e5b10278da3345fe65ee728c81a61dd348e2e3604680285d2402085b52009a98e1d4e61f75e17eef53aaf407bff9bed5b07b891a7030d7eec01a3c3289d749a6adec6f78b930b702fbd3a8bb0c081cb2e11cefa88c0c0c3e7bf036aaa59cfe626990dfd3e85ecff37a0786e25060b91933a266451ca90d03c73b174c7f00641e2999a7034344cee08fa7d44043dc7db3676a00a5dd586c4e6fddaaef302db3694e511aaf3302ab443525587ead793bf474c7d3b6e4a3192351e83275319fa6cd042f962cf82aadfded240c0aa2dd9da2a41d60c8ae75441575a7d1e638a797aa512c20ec2acd380c3e77d321660ef8eacfa32a4514a28fb601e8f87f357eb7d82cd167c45c4969a3af2a0b6055d046d866c5d9ad8920eb90e64d7a2d4734713c0915f12444d9782e768aadebabe43373fc139fbd605c4dcc64ed934c2e1130b2ee25bba24fcdb1d1f5559a55543bec4c60fa68ca079ddc53e9dd7e4f447052dcefc61ac20f8c0da7de6dffd62328740522d9e5e7e8cfb119f86009c0a0c72dec3a757ca64c64495d9d16a1550a3d74bfac7aab8221bfb6163d45b0a53009fba81f259d09fcff4a9ee3f30b4303afd87a23789bf1a63ecaae08578d09190ba5f68de5efe8c920a922c40373c139ad601506b2f4bc60e2129b78826b17ac5d954de1ac14f899a603bcfa2ca18742b3d84a66e23da145b4a3c42ff5c773a62226c8d6a8caeb50a208908222b2f601ef3c37599a48fd505bab6b90436c5cb2189641dc542603de80c1bee938e68a0c28b48e6857c5daa05ce25c4c84b589b3137b280c1df8adb5f4417a497947f05217dc888f684f6873793d12caf19dbed38cc967e408b900d239694a982ec62b7abccaefeed39feeab13aff90550e70e6e5b97c2f664e8b09d49df95b3729ac67ae5086f03261c99ce9893e7b7c1972822bb50a06395a4319405ec18a632b53ba958dc67ede821bb0ab7d7b36afc78a9722eb3cf92ce6619701f55333e845b22969d4a896b8fc739ff61ab78b66242f3041400e8045eabfbc66ef5c4082b2c0990b31073c1332480aad092714d30d082c5ca6a74b9128c413c873726cd010ca3ad4dccd442fb8551afc2fae2ddb82a5622677245814dd6c37342af69c895da809f94c4db3ebe4232ee2198ff218b17b8fb9cfb36747aafddcc32a02d91ce5baac5fec92107d7f2a891baa738867a0987a92f8c2407c8f54d74a05e5310a2da05643be465f374e90f8324638d86e7aad04f8e78e58532eb0b1baa849183849482f33c2660a9de2f5e50b245b417ba2ea706a8ce83c55543fecfaa8816301d98f187670088c9d9566cacc2941a490b470867085ee2161786d1177d07f673e2c0a8651d868a4ba2b976e0f2f8dd06f2281c2291b6a92844ac498f929687965d36d896adb294ce9c643d0435c05979d56d159ada4a441f6101b69b8bdbc114102f63bac7ab7ae99d62f3237d4fc4fefa46e8e44b0f64c847cde1ccd209f135b8c391c4a441bd2c2813888f62b903e46e6d6ea1f835818cbef94196323d420f5a89ba871b54982115415735db870d14297cf51d844e6c059e8fe85d6edeb533217611da6b19487b3aa91d41a006447654a4eac0a0f286982eaa3f11d1ef4c4309ab532bdd7202a4fe76543a2c481d450055fceb279621e445a4324b4a30cb73bdc817d6e160dcd84ce914226b992d106e291267e4824eee77c0a9d465bcc8caddcacc50b1b2642c8448e5a8a0f826ee8300e2e0890ba7c84500c22a0380a81c759852983bc24683ab87be4814ef38e2ed55a3e00400c3b505dd96238d178af20e18b40a622bf6974d7a3a95c01157dff989f8d2e2c9e75312064cbb8963ef7f34ecc400730d482c3e4a9aea1ba95ac8dfd0a264c43694b03542e04e9034f85736c5a14a6741115453c244c33d87d9829f102fd9f2db3546e166b3fdb1ac0d4e7f49e0e7cdc3e97e9b0a9d2b968ebc04edb20bfba1da7b56e33d8a51345864119e91be84653069dd51201cf312abf895271e2a37311dfb3a9d16df93f669992c6dc4b208a62254e84a5b65377632bf89ff7083db0ff0c332e9064eaa61b39512645774d0e229333b48aa845b4f4eb8f93b8e69b360db8639100db2b50ea1d4b0c76b8b33c4b620cb528162665dbb716581c7759d6c9d2cd8d631b594a474a9e21bc65c048c9f6716cd4b9aaae4472329f49a7b9bf8c5b7dabb606cf6e47930f0df472f604a2a62e03118d07ddc31746b9aed06d79387de62e286343f00bb5fd56bb02373d25c62eb8b9cd082689b50bcd40aae1b9782406b789695b073c271d4ee38b94de5c7d178b8ffeff91d46eea483089603f37804bf83962e656543c2324689a71d63423f88fc2dca29e319045b90c6050f19b74da2b9845723bbf2924208d8b65874a13aab6805db757a398497e9a31ce5f011d3076e49c6a271ae7dd147418b061602753ca51e6a2f7f4e366c2ff4b992719d174bf3c21dc1b286800a6724b51b1097d1912d3ca829da55ea9850e2fc19aab11bd571fb743fed9285790b98402741110da9e3899321f0647c243d5cc2c7605286a4475108446b0d46c2aa985409b083117aaec0fad22d080401735358cd4554decc2d09f7640b8ca7a719db6b129f72d298b6381d24f5ec83e4e9e861300fb2d6c00f34fd4d78b619383106c3aa5093274bebdfc230b8255bf44c49c6952e1414594f66af4361cf24e1734a3e36553297e296496af7d8db57c5af27243b959d51f20c7eb4654a0ea2593852adb900b5c90c17d03aa8bd8e6b9954ed47653882157d694853eea42c8cf59535e1a81f7c0567c45441d5a9b4fdd7bcc2ffee32106a88bf1921d66970313ee34652c7b2db0c41fdeae14d3c0b93832d497bb572bc004cbccbbbe704d10f2c7018fbc2aa4b7ff151e6eebd78d87c010c88c11c2e799e9273ecebcd3b2b4d7eb3be350bc15a8ee8d648cc49115a99c775ad63349caca8e261316b716a94b99dcc9b00a72dcb9cd8448e470cf5d90e9c5a6883390eaa4bdd84baa353b949145c98e6ec8b979ae700ebb7c70b0a2f9a86cd3d94bc6188fe4719afcd7394afae850b8b8a57c1ed6ae883a520084b317667408b69296bf68a92c51e0b00910f11c1a066361ab7cc40d01d83cdcfbad8efa6400c7b2b7df9cb84b6049808a74d860d18fa8f347274977067aac57790114c6ab32bc74e8039b06ef158cc5ab529e8b57b9147575f9885846d0b365ebd0e54b3d60171f0bfe7ffc2445f5c610b8d00cbce00e62b43e14dc55d2a32d63f795746c0d9c84a09d19b0720b6522e490447cb42b4619c3fc12d125e0484836180364b16ef6dea3403c74d9f92d93028102134dbfecc0f17c46a4d6317c5cfa69ff395aa84bef9d4ca8e4a81fe5b9e387e8663083d098f69e666294620842b804e0b10d7e5f0fdb2c30e7b19c5d7ce9b0bd54f5f5c4ef25fd8e83d22dd6201cf5008a0957ef1610e8868eff4b34382ffd76a5ad167718a0970451fba13a108728a21e040e8ddb9159e2a4d66990f6de00e9f4a49da729bc994f32fd21ad4379c602b13edc5ece29cd88c161fb53e7b5bf221fbfd1544b408cdfb9b69738c0f444c38af947f04eef7224ae440e85ce81132ed20fd6a08b7e7c7a22d5d731145bc1af3cba061f15d7ae04e76aa435bbf6d5a20cd051450cb00d054926f86e832992c800f82a449879454bf11d111e40907e146d6827956a0d0b635c054e844b43b8b8155af0a47b7c1b92f9c177f588afa6a15e7f2c318bea4268bbc11af70604ec9be9f6165d827ad68d513cfdeb919beebfa6f2b92d8692d4abd2c7e1c109e6c2513504cbbb6cadb2dd4f45504b77f8fa26581d6a7f5d18250f8289d705dc1d8bc2d46c8c8b56a3b6ec5ba60bfe37b8cfdab5e744706f4fadc4814ebcca050dce2a784d8fcc6c994d4854f977394212aaa46f915d9825b331f921ec956e6e5a679d0b0e4a4a8e3b80ba385d93016fcb835f415f4ae21fa8685c8df21ccd8c4ad0d20dc4cebad442240f415d6839c597d10f8117d059e0533017288bd86258f90a03710924b1558970333af678dce4bf782cddc68e6c849612a8cf84d7ee199579676266a383fa729b69c1bb3fcc99e42506f55293193accfea1ca602199655b13b20cea5849144a48da0d2bb7bee180f0043134c7496603a65a4863ee49c0d77b724096229b309eb6101274202e2accda05f0c0c3b034b533330c6ce3b3149bec663e2ff0ae78e2264739ed3f79bd4c06cfc0f54cd25f655cc5b857b92be8cc846f037fc398a656843de93789529a672d354ef5053ca722c71a628119cdbc89539adbc011256f4ef4013751bf94622331b18755b188e32079e0059158dbf2fca29fa918ef5096a93e27ea1f9e7b9586fb0db0e4ce103fa71927c5a30523a4a1b557ba611d5181049f87b5d3578efeb15ed62555c45c95e739dc48d5d89b1a19346eee9649720ce20be71ddf7cecec471e3790bac553678cbb848f0a2321d57063ac65bad11fd0fea13d44d12222989482291bd690760084e07b0073203ca3f72503621eac4f840c0f5af379d7e867b4ecfa8437fe6d613874d1a6b4a8fcc7d55fa56383125ac63d7755dd5d0dbaf32f63663d6630880bbbaf247949a2e65159675adb56fb19bdc7f89497bcdbe0848763d92f65fe7eeb57addae6bd332eb177fd8d192f0b2d30b76e207f8e362e211f4b1711fe311d1043bc62b95abdcd33c8d5ee2499df89c0d2c184a1d4b7b9e3427b566fea491a86661463b9256423ac16234e0e803a683e455310fd8ea0f9fa828ca96ef590587e2cfeaa3ac2af0a5a2c71b04499ae9ef859d197961cbaf681bb1b634e92f866dfa6d03024aa53e6f67db7fbfb36ddb7e1b4a42b76cda4c992933fdd7ed4c675baddb5002bcaa3c0b226902acb7d62f86bdb5d6643299be6867d96fdbdffc75fb9a724f19f8b587d956b4b79c846e0dfb2cdffc25d998cdd56399fe35bf7e90846e5d61e79c55aa6acecf3dbab027dc39d20eb955b9cf97347b8e30aebbb95ba77c2eb54a1527f6c42e480487e4c79f28a0860c410d77ce96b342183d9797c72eacdcf4da2aab8fd10cb3f7fbea150e81e14f5da137037d78402f7e0761849ed72a6bf4aa2a75304429c03ef62d60df02b744ca92eb97d4c72e0da50e108c5eaa8a1504160a61bb7d485eeae89fba62c04203e0eda6674c8c7388e34044fa56ab351d0825c4e8b3aa755befd65b5e1c41ce96357abfb3054bfd59f875cb4737d473c884518694f51656cbb2f4071f47f4e1d5e73edcc1e8b6657dc51b96bb68647d9dd6b2acafea4c22ddc15495e538ea43fdc1b774a53f77aaa30a28a594d2ea734faf023a84d0e974a702858218ba6c8f12dfa330c07a9475fa8c925616ad547644e05aa5cec49565d518e3ccb9d785510cc32686490cc3302c6298631886c11a42955583449905b99910d72a8d6adad4344d46d7340de20bc3988d0eaf0b5bb7d6420cb3f6664259a669dbb64d6bc7971046cf9ac3abf9b6c19979c41056964bd5d0b48728c8cf77fc32b05d6f189b4c27df3dddcc8c27b42324ee1cc8d309e108899b833cf06b788c31c618b5bbfc19a7749f4b61be54b992f4c481982fb0d003949a77ce2b39135ed9baeb6c6c6c6c6ca2436d03521fbb00906a3acddc1e39a7ac8935355e032fed83e1749a99e1381a9a1a35f0c6aa689de130e73457484d07d40175b1734a4353a3464d4dd779363637372854aa67e762685574deb821a35f35375046ef6cf00dbe12dab0216dd88836bcda6442379910148ee3407983729c6843dec09104ae40638ef9835be24ef5ecd41c570e1682bd317f292171dbab23f3349d6d07e6c163c29b96f15c1e8b5d3c3cd5e27158a37d45fb5e871107077338703e5b08b5ce9183f32204f403c210421041870ecfe33a211d6ec70e1e3bdbcece8eb6b3b3b3b363632313ba2184c3a3f615ddb89109898f234772dfc91ca1fc5c177de7e0703964f41c392aed33a7391c73721cd29cf5a633a11c5cce0de17a16e48a0075441dae83e66428cc9d5474284f803d4f4767c70e1e3b3f42266421beaa954a553435654c792a958226ed2bd2e1e9e87411da910989bb0708f2b83c78ec509e29a3f3c0aa7d4b3c2f13e256277ed43a3b78ecf08c20a343c8b343661d3dc6e831422b7ff59bd0dda7363f222866f3d8b163270bc22313a23c3221d72828f8bb0e631129401581e107459e11a4ec4164fbc748d4790a0001c884049009c11eefa9da5734c2087284e8b0070a85d4beb1a3fe260081262c8c6e44c6996c77aa69a414d248e98c926a0de91473ce49941373a0110906d260a7f657043f3772a31d03f6f73d938804c03be0f8dfc78813638c313a86151cb2ed1923b7a5ac01f5e855abf5b562dc75305715dd441ec444d8092184dc7dea5cdcaa28a5d4a97b2c62d239e5c3af43f2ab6ac99773da9b1e2f289d93cea9ef3c83fec420c5bf0ef94f2d44df7277cb5d4f49abdc3306ab307f5214a8be728931a4958ba4f690fc1bebc72b095b0f777c5a7754e2db7591d4aef4d07c9737d88ffe0d135809dd951ea25aeaa1f83ec3d2972caa940942861bb24c1720e1e1080e2e3e40022f5d0081cb126362161d30e388279acc3082262418244a62e0a5035998a84103369c71045a31a241135f9e30592209337e904598264884e942c90c2906121b4c0cd185164590994195320a10850c252652c2fcd0c5bc922305195e6c20081f34d1032ae6480f61c0600b285ad0031371cb912d3e948004484835f8820c19908104298d1ea028230c2c494954073598628a256a80d2039931908821a3054300010aa32f35d030530922c8a032c4132c64446024c34042811684e940131fc22c9d012684230f0021cb18198ac082e6e0c8ac02c9092ef0618b3159a0e10130a81847ca78312687107421811552fcc0831eca50d9e28b333e3066098914400105151a7ca1e18b1c03893efa000f9618d3449829611cb1028e61860e70b86203165ba8902408c3064e0091a481249070010e8a8408c1126472c032441857c0e8c10f860801164258018510f308119668a207625809410c6e9853e091a9a50b078a30438a1f68918418f40bdc12850cb4b84203661c81c313934a1a5794a0063878f24412497c8104822993c609c68ce0cb1667502fb48031c313204ce0050751ba4092c2165d6cd081862852ac50a5235420819409242d30b1850a25c48069a265a6801a01c41622e822461844d01b1c992f80687c6982e54910aabc400772043f88c00654b4c00a0e5ba2e002890c63c268228827be58c2872d907c51c20834c290c18a3368a05e60900ca2f040822bccc0e1055a403252762042074fdca0c50cb309241698e2041fd042891b82b0c2060f38e38805629630a3075e680d669214e3e3012caa4841175e84d1046a11812aaca46183204ee00507ba1c296201106980b105193a5cc981d200491454ac30da010f1ae08013740631d00004305ca0000733a2805e661648341bcc20450b30a688810697b802314a3ce921cc0d42d02d47240f31474c3027619eecf81188f8e323c6075a01e365c7773137a72c29fa7895e84379b0e3fb951c36ddc1beb82cd378043525c09f2bf952f46ef08071fc3ff635f237778d370229c6ecbbebe6ed7e6642366f6176f3a7fca5f6e96f7296bf157676cadd679928b5b38f9910f69f27d5f8a4d3d1c912f87327950cb8c6bf67416abec607c90aa3973d8ef74eff383e6234faab1be37e467f7e0c247f6ee898e1682875362db5335dbddf6c31a569ab54e9d93769ff883ab08a8d118b91d43f5ec7bf7127db7abfb9827dc79bea3f586503f9d20fff127d28fd1ca3edc41dc7cc97c2c09f4cf912944792ab9faa554b4a86061a68f0bfe63412e44646bea05de92fc85a7de7db9e31188707f8835a64f6e3ba6ac5b8ebfe33b8af8d999023f1439628367d0c6a195221f14396a44d6b75749d4201eae931e14dcb2e10166310474675fb58f153138cdb6b6fb529b0efeddefb4375fb6aefb5d785b3bd32cc6a1b5c98fe946127d3fd7ab7ec3bc3aa1635acfd479fa86947f7de7befbc990d2e2c135a68616484e52f67635fa3cf497f7557bc4df0f49346e3199a65cf68d9333371e6bf222af42b38a33fece929fb36e5df387f38f6fd4dcb593ee2a9093108adb5461b5fa6ea4e297dabb2acaa48ce105007faa81fdfc6c6042f6c19718e990026ed6cdbf3e3c76967d3b2aba4b28ab01859b08108b344f73697aac9356832cc33d955057d4929a592beeb9ee8590f923a99f0965d8b51ea4facfcf564dde34fa24f7d8933b5397fecd9137f8252330aa5d78362a27814291d8a01dad388cbf9fe010155203cf9032552f4a9a46c229bc826724acf8532f341d18b3ef2639229e22cd0d81f8dae2a897434f6855536d4017fd5dbc7feabd087c7587f75d39aceb47fb00aa55a89dcf46da5844aecf38954cece0edeb4eca6a20d49db6e94e6bb1b98053f2adf649bef724d9e791aeeb5c76ff115b072fac32793ddeae55996657fbb1aefbad310d6e81aba66dbe38f3f61968d31bc7dbf313621faf8e3a4fdf2a7fef7fb7b47bad8b24a4846f5dd49f4e2e32ff873244792187c17945c3fd951cc4cbc5d2cccb9aeeba29452eb9a3e57a67f5dd7755d9665ed58182db263557fe5b96bbe95b66103feeac4138a65f1a665106e1d1d1cdda6bf0eebecf8f6b2177677f6ad738b9d1ccfc39b96edd8186d88db9b18d9d37f75c67f382fc1f4f4b993def8b7b75b166d599f3fddb608ecb2bfa2287b28fb216b6b96bdbdaeebd22eec56edf433f1badfeb2f7bfb417263d7ea0f76b96e3fbcdf4bf06d6b6233b7aca75996595d62972e996bf9da7a5d6da30b2875826203287655a16f3f888691b5828454a7acb08e38dbb9ed9d9bde5d7f443b1bff7d7b73c5827d63ec462f76545bfbd6d3fc153931e9aa318d556ce6b4693965d921eb33df9b56e464574af5e6dc78fde7f4f70259a0ce71883afe34436aed3b86d94c04bb14814a50c9a1d276a0ee081503fcb90f108d1d7d9cd817e4cf49fe489de851fa0d903f3fe857ab8ad3afc3315be2aad6f710faf5c3080c922a92dadf0ad8dbafd25fead2f067ef5bce74fe746cacba2e4d94b3aba34d8ba436d54377a691fd4d5dde4e4eb5d65afb35887dec83e2951fab3999f6d95c4e4311100c981e860c98be060762d24b1c88e9fd6bc41bccde94ddca4bdb2d7fddf79f8e1dbf7e50bc377b98ddec7abfd7fb755defba48ce1eb2bad3385a89dc4355d71b3d9ca26558014365432b631ced6e432b6178b095c43d4497ecfa18e68e25895b49c5f2f5156696c6dfc470ccc61ec3bece8de9fa7e6928a7d4fa44a20fce1ce74ddbb7b6be045e637c35a6ab43d7f9f0671ff5634d4718c40509680fa5cecf20cb940122e5f31fe265caec21a222ae89fca1c0102475744aeac82aedf7dc00266d7a85942c530648a6c542f7a3eba856bde97b0f8aa345c5b3735b6b71b6cdc9d976d3b2ebcd222cfa0e8a78d82da59f43297efa3350fe70dc9f3ecb50d9cf3c0472d24b5099462960db6666def4309cf457f73dfdf60d98d1a687d9111666fea497c02a75502b68da3b10fca8161c087e07f2612d053564c8fed5307a1d04a2d5e8ddaff9734ef4b0d4a9aaf937ce237eecf40001459d1f55918df10808298c5fa94fe833dfbfca775da55f5c8ae042c49e1f87442e457079b267915b5d8e31613552814dbfd60af557814df557813d047fd2eb3fa81dd312de2118e052041727732b997beaa8efe5520a5ba38f125a2bfdfdf6b1d0a36f037d6af4a27dfa1df4713d7d6bb3fc18f6f13be8436eecafdc411e0c67571fa1577dfc0cea602c75aabf740779aaf9357fdcd657578da315ee64dbcddbf53fe2d88ef9176dd75f7d0a03ecfb8ab8225225e697ce96f988efcf8fe60f196387434d9dcda638e83bfc0972273b48fed4a50fe370ff00d4891f97e24ffd751b092edd80392a9f1f595d58e8357f3dbbdebb2fb72fcebe39fbeeecfbd04b80dee36a9b4d99c6efd94353c61868918d3108ea55911d2058d29e32fbaa7ddc5cfb8b3dcdfe16524a7736f6f52bac6aec87b2afb6b705c06f59c11e33219f655b5dcf8454ffed6c0f8abe594b29a5d4dddd35f6d907492dfba699fe7636fdc135fee0bfd4c24cc80ef601d285ca9a73caf8517a9c310a71c2aededddd7166c09f57e9cf4a0404747a82458716649f69ee37cbde5ffe9c2a9abfd4dea6eb6ffbfb35b9060dd6327ab5ab65d909706b7a9e4cb46e5a6541e4cf24d5964f935465ca94a95ba45160d93ef6f7d29b7d633e5950fd97fa56d8b362d8c2ae6a55f267554d19b140daf32bfbf153a832feb9422985a8953f98a4e5e200891fb69450e290b976717dd79f7cfa36cbd7d72cf74df6dadb2b13d22eedf2781dd92ef616dbaedd58f6f5c8d5b2b77f3d561fbb6c9642d1ce78e2ae1f5f72ee9c007ec88203cd2ba41894b6f555cf18eceed42184103e9c4257fe9ec89db8932ddd0996f9d39a724a6e4ba93f4b3ef6d8755ddcf5f2edcc84a4f4cafa2a3e5137777443767029824b94524cd70594caf17672e4ad79a6653ae5ae6fe5c5393b2998049403276e3bef964d6ffaed31beb2148ab6696b307ad7d34a7bc8331fee9f3fafbd30fa571577974f63956d0352749154b1d839abdcaeb1733bcb72db78b1b86fb2bfd7da6bb32cfbbe70df6cafefb7d033a1cb923f6fb8bb7c1a7386e05029e38b0a0afd59299d4bd38bd8bcdc9f385d010da3870202fee6290575fc973adc45cb6e129654df924f89e694ef50cca5c3132cf214e914f1e33b3440922d9fce4dbf4ef74ca88a2f33d1dd3152ea35fac49f918a20ec0ef4240584b7c3e3e04c20993157aa16dc450a47f33635ffe10db91f1f38ffbd0f8eff727c6efce7f9d8f0f15f6a93f01fd01f798f12508ff2d13dd41f4dbe79541ec0771967d764283e5fc3fee4018c1166cb975c0daacb10cbb6e1aedb6578c5e608cc4a972115b562dc75ff51ee141809fcd5db6558a52607e049c841de4716f2353200fe270b3d4e4efd08f9c6f7641c2f808cfa2e432936978f709fa4ee1e6f6fe4111e47ee795416001553173813a2b12e244319244779030000a1548690077a3d2cea863702576f97e10b6480058d11f8abf8d264eebb0ca3e09ee66d6cb8e7381bee761926e54cc1dfecb20178e872016cba7499009c179adbe51fdb5e81bfd9e5126ac5b8ebbedf9e974a755efc6420df651fbb264339c0d3fc7c8d03bc09f9e7ed4f36e10f90a3bc0700d2d5f0b0cb24d828e3f4f183628c31c6184f32292949fb1a244934c4f8f8a2143d2f38d9bb401e2d5227cb95ec4e64a70279b4d871e6e3cc7f914b0277f9a72607d4edb20f764597078071d1e59eec5f5023f3fc4fde8f93771e95773c8eacf35d16c0b6c947509fa46e1e6f3d5e2e43086b32843b43b8c3c3eab143271f8190c7480c465be7adbc34b9a6e66dd4bc083535b3cb01202133f1307100f149f857c2dfec3200382df876394526ea24e16feadbe51e9c14396e974718d3651e202575e37cd0c3e8e1b88142039b508f7a9ae7dea9a03ebebd910971a8f7501c0ad3649bdce51d9312feaa08b7cb3c1e6254f6c9f931972eefb071464dd6f135b2f73f39e8bbacb3ad4d969b8b3128bba703d3641b32b5cbdeded2c58bd29718268e893a34206335c1dfdc71bbac236b419745e87208d6043cb7cb395b086a72085f23e7fc4f2ec0e3e41c7f23e74765111e47d60f9409f05dceb1b90cc5000678287f88483fc238e9e8e82893f025641f06c84c7ebe8607f2a3a5c02772f44bd857a91c513942bdcd8b40f3dc5b2f13b2d129146d08211a9506f60821e7e402641873e89c6d641f99840ca30e01725cea94701712f28ff7914b781bf9df06d5657d9552b7cbb9ea80bf0a80dbe5d7b2a58b8f4c4206ca2ec665b07bc40f923f36cca872254bd4898f83237b97e879c9aed4651c1b33a2cb37503de8b95db6b19fcb507c7c7e7072cf002e0e6a7b54ced91598f3b95d46d964a75293bd4af42a19e06f76f96673198acfd7644fca5e253b8d8fa692e2fec6e6f43701f93354e213aff245208e4c2327b3e35f2f351379141fcb1f66d4a926f2285be2e003d296a7a29ea8821166694ce1a5ac17766528d80f134e889ec49e524a31aa6d76c01fc678d04257b042ca0b51ca082c44ba1c5ea864a4e3f0822c2ebc07c2d09903936de32f5982e1143938b1bfbba39414fa70337607b168f8ef5f1915c4fef5715f9f659402f0df4761ba05540bdbbfb5305b80c6850cae040474420a2c044d89492bafcca4262fa015b000da3ffe05f9037f85e853450cfa1416b629d1c7faf8275c81572ad00f79cd8b5ed575bd705d4a1ba752de77152e2d0002712a4878bbf4bd9db0c5f8180f49f71ee194c14058941fa720825dd522123dba2fe56cc72943e528c658f557d5917429ef9d4424104fa6e094c147181416bacf0b6b8555b6a29765458b69d9a11069d179a5624aa6a495722c4e2eb6edb2b0edb3b7d9b6592793c5f055ad4bd334ad5a18ce9f3fc9b4ecca6a666536bb19ceb62ccbb2ccd2d6c3fa4b6dfe24ea443762c7d732a49457bbced2d5aa1615d2487fbe67fec6dbf64b6dfb0169f64d883f2e7cd5277bfb37b20d1c8ee66d7297617d5b6766ac9a1a341cde5c309994f0df87d643ed743a65990e7aabeb8e968e8e96e2d1921b19c9997884d5ac565c6b05dab5d628d68575524a5f51ae2cde188f8ee2516675448a4947b5bad157603086611886bab1e930a3a5a4384d3e20a57af294d5ac2e549fbfddc88d6a8862845305555512f6769c28874a49a717c9d94352d7eb2e830d4af287685403e6a287f990b2f43fbc292a7fc6915ffefcd31e3b7a07218ebf6f3f3b8e6cca1e7573e2a287bab9c16167ef4a5fc6ec48b323102612c986a92a33cd859d6938af945856e997bc6a8555b6cd43f2e7e7568c16b6ac9a1f7af531a62f3d87c86da94091c4c0202c9fbe3771a320729bc0ba419c49b5a6c41f0752ab13d1a3bec5b7446f8a11d047dc4044ef6807ccd5ffb0172f4b4a5e941cc90b4e5735aa732324952b55934ac2a95143662643af8c3f85d4a0017620f3514ea267e56ac99c713a207a2c78730758e6d0e03ed4d0e2f5442fce1d60a951190b90e7caf6db4490092bd4f0823fa8e4829c3ef4ff5fce6a42f4cac0df4bcf8464cc9965e01863ec2612d6d34bb8fe8b615bab3fab8a12bc8f5c9f046fe83dbef70b277afed8855595aed14b5082f711ff24d84bf0aff9bd878c1173c1f2adafe40c5275c35bd66412d630849694f2f3f0756537d72a3a05014e10f0e747f15f70ab7a3742637f750355f94a4a5dba402db54a596b4de29bbe53aa5128e8214b13d144d1f34ff544cfdf03d890f9c5b0e5c3f0dd0f03177861cbff70f67cf9f2cadff5f5ad4f6eebb3b6f51f8e6519b176d543d6e70f495165af28f0bd37a386dcecefc38dfd25effd7bfd7529662de6ee1935c4fffa4b0f5dae3fd410b92f6d7da67fd56b7d51b9ed3f5fc2e8535541719b3b16e176d17477f23bc659ab1860df9dd481690499b3aa26c8137fa681e15bb9304cd74b88dcf5bfd63a2bc9559dc6950a70bc4c948e3ccf842b4c9ec0401bfb947b54b06f1b23d0864040de8ed6dfff07bb482995e613f80baf9eb63f99b2c72eec8d0a78e5aa441e992d5fd62c5a556cd2c2209b69ff75d8572630aa7ed1ae4bb0ab2a1c24ed6f2b2f1d117affabfaea11df56ad2c9d84eeaad2a82173573f77a551d517ed4a9aa8c636f08728eac80f6242068e91df754bd004a5c90ae2334e8d023ff6d2eaa21731fb1447c88d5e9cd782f46de5740aa13f67177db069adfe7ca3866c77ecad22387b08c782546afa714e3b5fc87ca1ca55747ab155f96bfcd7c33b495984bac936b9abc10eb05d7f5516d837edb1e7d7d05f0f0e68467fdda95613ceaec5a84bd9337f3ec6b5fde7799ef6f171601830b6d01e422bb6a6e1145ad52c4dd31e4aed09007f807e401ffe9aa601c91f1f03ea646000fde748408e84bbee3d0f2905b4c3401e1b4db0fc48136d0c7270c54a1949fb53fa7120622cd5d002fff5d6d78f5fef95b1871b7ec4aca1f9f3ba3c436168be1cf26c5af353520790528efef75fb73b1b9a69b4faad0aecbbb24c58cbaec5ae8a54c99f52dbb6ec2d8b94dbb66d407b4b6d58fef89498923f15f0b2457eb0e2aed3df7b29280668cb16ec5db4681460ff20e9ef4a385e680cf9c79f6f59b7aa1c8582fc0f921615e3c4b6d9d08a182d56651109817b88481691f38a9842d42e54a99e05384c7221b53dd79e9f702935addf58ef4f5d000442c48958fda0777d1b46ee6e79162fc1dd5d471b46d4a9ae286d1245208417e12cf01e368cac1feac3a969fa23c2b099da1ff6433a1b811afb548a2815c4faaaf5148498fe52d0339dec9fb2b7699e55d70ad999a960952953a68b3a7115020ba10f9a65fb4b27b6bf10b7f24892fa4aac4f808c53d704500d210fa5b9fa2b53c15f3e66c4dad588b52f25c3cb7677f9f43d53c13315dc359e720bf74be812eb2d4705630f3314b09dc1c03d0462ca309c9e72798994164e6ffad44e459f4ca36af4a2ebfa033b03957ddf042e34157d3ea20b81cc3c0ca6e79e9e7ee6e90ba9fe7a9aaf8710d2ba29b5374c600ceb88ecac8361060629dbc3c0bd897bd3b3c069d36f9a85199d653bef299bae7d135054a72e30f884a01c3a60cc5941c41bebadeabcbc04140ab24c19e9310cd6706e8771155777568fd07b58d1670583af84e0b437e2eed6ebbaae58aff40266072f607630da514341b1b0952923b7f5371b71abadb9bd4e6d0c2c25be5bbf7080ba14e7e1bf1dbeac2afb002a239611e99e87c059b763d1726256915f6613e93edfca34c3cc1a328dc8c801998618dba4628819620b104cb144c548ee6049054488913421bc4288a5a32962f4306f589268c0a008b7d86cbde3b0fde368e5555565966559395525bbeaa165d5b7189df5a77f16a4c26e5996cc558e87392bc3ac5b68699f910f87cb84dc5dad2bf3b72324a4da15f2f8756596f541715a9635bfaa2a2d334f4fc86642e49e9047e6af0add29f3778570853c75b31bb66ddb766ddbb6d56db3b66aa373935bdc7ceba12589515828a79c724a09a3124cacc0ee417624ac2884b0a3049a907ad47a208f9d99901f417c4ba9a1f65279d4244621843da7860a42bfb9e1a441023838314e4a679269c54208218410429f16662d66ede4ec09fd5a95fb5b1e71a2ac2aab56abaa2a286755559555ab5511e14c5ab9af555b4eab5955ab56abf20a7ea5616559b55e17d600cfbb989d93e60f0bd19cd13c2177ed866ddbd44429eba729ee13ce39a7432ef037b53cb21ea594525ed100cf23d275d67e73cf39bdf2ceb2e6acaa5a41f841b128494cbab88b5d183666f81ca574469c1c58777777d71046f85083b156021b67430821c4d9fe9002a6d40fd8e3eda43e1d5c08db2bae77c7d66cb14ce796dbdbe9e142a8a263621633995278f372204ffd4c77367794dbca9b6977c7dfdeacbdf6f7b34c639a96f9be7342c8536145afc82b433420a89431b32102a4e2a8f44e164435656648002000000043140000200c08868442c168381c1266557714800b7e8a4280661fc99328885118a48c31c6184200000000006064a6888300b99eb317ce9b79d38f19cad04833b1c8ff42131b0f32e2999964f16c2d046d4001a38a3cc705b6129d10be10723156099b1938d7682629f39bb180e7a4e2d2c460f8679ab9eb21c7e75aa9be2a3f29444e4abc12c4357b7388ca019d6f0536016a4a6b6a2df0c952d5a04727c83bca2fd4a46791d9583fc0bef459748f5aad60cbd08f630ecd1bf3e78deb71fdb9b88a488d7e56a2c31190e808912d857b89b2e5e7d88d13b607671d0055a047d0112ab65471546478f726fce304b44115771db376c2d161300de24a17c947635f8a08372eea69f7d63874235ba36f11928c8102e2d83a0b319f9605352a11ff330506663565ea2b0683e34b8480c03cc22410f2d752dffdc6a6e75f2e6f0acaa709710f641e7ac302d9b58d64e7809009f169525f499a0da11d9b2ebb1ed9804287635a3f1c7fd481be2d9f546e5f1eeed2beb031d6df1e17c534c4397884520f796cefa41de72489ac8634ded1b5de383636fb96fdb0e943039b398741ec865e9bab63873014c78a6c603fdca883ac74969aa6a9d9aa8ecc840eb18fc64f4cf1ca82469952bc2518cb80b12c5570c69b39e85843c18d4e585596eed365c90fe498579799d9993620c0be9121b5367b38a0d0c3cb5acd341f42a2ac1ce50681c68b60529cea113c53de7244aa31abf5f90f9768e2fee773a0046135783a1854059838adfb0205d481ef69461b784496b4b469c571a4a847451729075da4a38519b77ef07792f65f062481d79fcd0e6703ef3f37c09551b96d0539db6e832cb1a875d2e681078783515811b70ad77d8d1c89cf7c22937c662279d179915282dfd73d2a3b7cf2202943bbb2cb2d4b13f2c5c28ea5780ec033a514246f39863c5c889e1318a98d2dafadfde32a76da48dc84f0bcc13cb4493feb4847a22f2efba30b6cc1a396d9d191460f314011d98a13f76eeff5602776c6f393fe2e448e64b5a75daf31342dc435ad5cf831aedcc2d644f924464787187b896bf375023fc83fde3f1ac645db2f41ffbf09793fb3cfa13b42e9ab0613846b824c7fe87e11b8dc976e4e808d1f310cb5cc9e4bd099dc2dd6c06940dc3c1135fe64fd42cc3d414af1711f4c34796904ed35fbdcfa61bfc93bfea10bfce4db3894c6441230c26656b60c249f3234bae73084f2544aa2db933c51a9e337513258dfa1885f5b5bed36ffbbc3a1a7e7016dcbddc085219ad490efb794af754e34e9ad505975b89d5fac7fdd887ab1b4f8c858c755db5901678ca35840a0b4119e2298d90d5393773172fbb46fd5a961e0d688d0cec930db2eca6a999b6e071aff0beb04c9ee8c0c95f3c12e13583607e022c73030038396d0e61a889e38bd82727b4a2abf82ac1534fa47d426f855a50ec8e4e2f12a1be4f82ce814035c0d9b00139bb218e4da797e182b160f42a3f7fb8c20078fba474de297aace375ceb374e32a84ac996179336d731afd90a967f98c835f1e143de1950dd86014171af2ede66eca02362cc1ea2846a090c39b9403360a76b24283074e9a305f78815c42882e18fe63cd3603647af0bcc5c1e49ce8af8cf5e9cc29fb524a9fb6e77d5ad42601d58caeee6a8a032ce33af7fc2af9e3ff3aad83fbeec2a253ae6dd00c5a444f39b125891f9f81be0596e0ca29a5e9e95435912a4390fc43289bf5c651cc768ebcac84453f2e569ce56dca979aa0c914f794878f3a62793b09037c8f0658015a81bdbd83e4578e37efbf969f1f71b770750dbb8f8b92c23d1226c15ce474955c8a92c7717c31513180820ecd1ec0d0ab7877d414dea391fa0aa6571ddb028d2725bdbc5958877aa48b31983b30f7d51d3057e84db622004103688962f0acebc063ea55b806c152345e113a8fd096f542a52b1960f9c9f573a08aa1d73c2656778a9c46df9ef4924c5241a6f9575a5929fa0c09dce942cc689dd8712d33a3dcecd4a6294e70a0b718872d5d055c893ace9e74008cc0ed83dfb78020b32bec9ef40f9312bc424b0cd0772891755d5a5f789cfa31d18a39210624270c0857d85b2d561c35eced9e04186a19499dca5c2f7cee1b4ce2c1aa34269bb43f8872143c18010635beec9acb090f30051de30754d3f0e70bda9b70e090dbf10d02a1c7f87089890d07b41056c2e479760010c25e9d9e62725b9cbd0dce946b56b63a577e44c0c64f7206fdc814cea47594d266ab37e84946bf68585542299070162c63e4509677e0c98a657df302f302e024c32be17f36483ff47a3c53f933550398108b945cc74b75abaa3cbf72c5a99a5a29c1d57a49246667e07d462b05820099f7d848fa7df70dfb4ef5a8f4a5a3dfdeeb72041b424d620f94a2146e79f187527959348c3c09d41d7521253eb3ccdf8b1a7fd8197393eb51e5d3ac04c6f35a66a584b3a33edb06bb365e1d271761049e28a04105ba24588ee70c2501b55507d45dd9361ed1cd26738746092115dbc9e52783e22590543ef18ab2b15ba1038bb0da8329f99b7f505a6ca8c99f0774f1ed00ad4a120a05295abd4408bab8c22a04956d845c58de8fcb3e42d46657d10a96026dee86c581157c78ce6fe1af30ccc2c4209d449ca8ed025b0b2a8828a945d3b900da61609c544e00af4a0bc2fd827862831347c7983c0b6acb92d0a1a6badf0ed93b7fb35a9a54c916bac9767a5bb71088229472fef590d51dcf300154363d3e6f33a833838d8c0c5e05866571441ba315915654d5a51374998c18d2ded47066e692b6ec8aa9c6226f6b9effe8709b402ef81f9251552bc7f7d59498d17df6c8642fa5422ef28569e8909afc4484b1ee3c83149ffc643cf156f24e1662a998da5dbd83b63a15ff86e8dae5e0785f67c39c0daf205cbcbdab1ee3ad37ae23eb915083bcb36e4ab4add7f87fbd8b71946f600a6d4c15037a06bbf43c00b6813888eaf5af34d9372e6578394ba6a64ea6bef3f9acabd656a7ca6f238775e2895965412c414f7b75fc8790ab7a9f3ed5a2c8945523b866653396dcec6bced98392eedef3e3cd05bdec2b655577d1c431e6061be6cf25fa43591aed0a4db74db8fce72deeb19d48a7d12eaf49db8f5f983d23369a8fa23a3231fd638dc21f2d2fe3ec882b6a660085d3bf9810e5573212b061a03d0dd510882336cf1c57474cb50d0b29e912cf67edf09817affeba1cf1349cd885e5bebea78c52b8fabdb94173621213cd04802a45466a12d5c880f21365115fa914a46d68ecbe500aa537b818d82ba52567b1693ff9af1e5e152645a3131b42bbe5bb9eddba2dbcb67c62df50caa35210c1946c439ba983a79b2a947d5481b646ac4e25ffbdf552f94a9a67d78d9012e7c2489e89d861a81362ce9832a7315f1c17cc2154816d4c606d58538f178d0f528d3f70c47c9654b586895304d42c6d77a800d2e0734b0b9d184b89328d207056a4aa52828b35f72b626fe6e626331b166665148dcea3e85f6721e9206d083212db6773841ca4fb34a442cae70e4927d3053187a3761842005ece952c91b224f74399dc3895b2e7cc32079b63a73d256b987a4001df2606a269115481a06b8286947efe218a7940cf896e017c2c8eca100f805dbe6afb6962205fbc03ed798c61f8a42f0d423bf2145f8c70f32b3bae9e46735e195a4327cfd05712b6221138d9cf86a76bae042b4a5960e389bede0d80d5341f6c129fc9318b13308a012c77fc6ad0f0d95853e0a77b262c970e43631ba11465658b176e0e6450d70a08754bbd8b4c17396aa1f0d25ec1fa5d591a37d72fd9eca151a8d4b8801c78ac45912942d8c9e5a4b46f030f055fde15f343d7d1e6fe103e639254b342ecba69e5048ab0d605b88f7d32df24ef3869de4cb0268a0e4fc9b544e651846934d8703235f9d604e4cdfd15e6b4552e15f44265cf4229449ca9430523fd125da087ebbacfce07959863acb9a9f946c4f5b91106167cb1f4aed74661a4d46c48d5da407058b6b02e64568fe1cc45433f51a7a74615a83ca4ff58e4f070796cb4ce4c553b88a59205c1517d1c72e607e47e09a4d009ad335a5bb846d843e41ea5c4f0cb9f1c36de3dad3c67b9fc335a37e9a711222997e0d20c6e13b19f04a08718b8bb8c77da05e25088d777661c588beebaa10ebbf6e49807b008215a6aee5031f8613a160f99f6310140c9b29794b6b8ce91b8d4cff4ade7a970193267470b55853777f6fdd953d74ecff7d8a001f26bca7761041c83f35ce36697f865811ac6b5aca776b035307a75432d9a3b72a17fafe854d44aba7fd5243203faea55ad071e492b27403a554d725bcf3aaa2905dcb9d1bef3cf64685d80fce310de97b92be5bc2c3d55a51d4973fd60e5e9c3600f6cae970c2f58830511fd5ceb40ba50a0e270286e6067a65d21e7638e193afe5b3a99b59f42a9546245ae2dc99773b291b7d85fc537bdc3ccb8c9ce9825ad4f8a18c2eccf386f476d9702e623ba28083251ef712fa083ed3598b4c90182d71612d14465182f8b0fd49048a27a5e091747e47682cd8e6197fe0366e25378ff345d531e34ea3b761aa39b545cab93d7d040c2a1e254e1d9e3a68906140dc237eca1aeba020c6ab7ead9295ba8509164571b5ffb10c1fb6e3aa333140f870f647125b07c5d17a18e801c8aa3d6044ebe3718f2c41daed1568968ca540a3d78733678246244a2b841949669e0d2751322adda0e6a0ab14785bbccd4151e89dc61111695fbd254b1d5a33b146c9742f811e2e30ae5e63b370ac12a2f51aea517b17c23adfd0b20c0bf6911b6dfc23b3709d2f3a59c59f1b6dbf40920d05432013844032d413c07543425033e30ee4551583b62f611913e2e1de56c4cf1f6ed9f5aef7bfe7bbdfff3d3b25de134d3e1bf7e79df8433831ca605975b997e295c38692004043d0c0fda08e9269abd52aad7ae03256eb66053fee125cfabb04131bc56aa00ebe350d23629807ab4e9e93e5afcb42fcb72f5c0c545e2935ef17d650ddca3b1719cc9118fcfd62dfac7664cdfb0dfcf43403b69de86320102014c4fb0391134d6463c8045df4c8f118411a308a2fb4fcb97190a35d6a83c199195ee22dfa342ba317817db3e4c6595828065c4c700e9e3d37fcfc888d7ad85a30108e776347a70386a9281160f82c1faaecabd40d6c02a81b2345c122dc7644cadbc3cf8a23114216312da2e0a3a3274f0d942a73e553cef868a0dab8a4cb1795d54ad5aeea151b603f65af270c2ce2dfba6725056b667f2e2745661415e6a5a26b69037f9527bf9e5da708e688c5be8a6cece7e94ae555095ea2dad49c0f30628ff1c6edc840b1c5a4b3f857b8a573e35de19717efc83796a945825b099d376eac2cb9dcf76a4c687396ad4fe18d260db60a976ab88ef6080b33941433723fb3d94971571a61804115efae603ae575b619e005e72f04722f589b30c64777dcf4d79763fe9c06500464a26aedefd2075f0c007e64fd8b3200c634b369cd22a3dc916e7f2ee4791474a33106c0c8fca1b4d70fa81e42ff989e520362f7b0ea08bc9a0ac1f420e0ed93f06b2a99efaee2893e45452fdb27d1c8df09ae6daf40936a894bd4880d933b9648ddc14084b5a4b3c3845c1b9381b831329ef1445e1b13bf46df20888263197b88666f2c0443e08aa31ef3289e3764efa6ffd91ccfb9abb5e4ceac0a71ff0637368a71e6d315c7260f435dead76b200ee3db34d02c05a8c01a231d4833b4800748787a364938383374a19c602ebffe0e4c8d497e682708440d0c114aa444f93c83e03b2a3ddb3d387319482fc62a35bb93242726aea90882c53aebf01fe8191d93280eb6ca556aa07b20e088b78a880c24bafede68da0b3f9da7e5e91b32f19b32d839d2036f1373512b90e7d20384f1300c8d23835382d70ab7a1b49b048f96c62fce14e5caba34df71d8591580454c4931acc9e1019b6f512848ba03fac040fa15eb0fb372369828e71b5e5763dc6921b32904060ae63f7c2032d783465e2c1ce4d013c10d5c4ca996033c374527560dc0981bf81a2688abda9421d62e30c371a99871544cd46fbb822c2c444b5f10a8096e92f74d12bc56c28eec9fa581c4e97062e0de451bd807edfd68f5b234f880a90b46841b08fc2cc4924204e8eeb1015df476961d99cc607b1cb1271f2c55f1c3d22208306cf99f3bbbdf8c29cf04e3c57cb047346c9273645e07e726be99d0f7206bca2a0ba926f227573628e295b2dbb725d939932429412b5d9868c73579eb1f24e3da71b8a47baa6cff968723b0c330ec95019cf7c1268c658d2975af238653650ca84f80dc5c86969ce1fce802c5f84e63158ce087ac4053b31d11374fccdbcfc6b0a4693293693908683faf26ee7f000ba79551fdcb208adb2be718f16ea802b1845462cadc7be00c8905a4cbdf8b07f2a8b900e0b9807660e760b25fbaf890b772cca97150b3b518616ccb0d02361d86341226fc53a51787348aa1d75771a7de437cca05c38f75608b73c71f1112d81e90b457a3b61544d7a928310091871ba15ce31815084dd0e590bd1d192b1a29bc187623768576eac95178635e9ebe757c92518a368fe143d9bb6920278dc3360568a352359977ccd59112072c3a91857464c4952a885f30ad5cae12a4100173cb1600b552a63dc0883f5422e26cd4ac6bd044d1e63b1ca9c6d1471c60bc40040771e74fb11a4b23f2d4988069c9bd276e7773b437f4f69fdeefae14a5a9924e28a063d97b42fd843e81ae8c34557a988ec6a210719cf8ffdb5a9f9e918d6694e64fccdb915fcf98b62af8b40b79c6cbc2bdaaa6e4fb1c8a957c0efc09c61ba19093b07a1516a96e858fba65a05e7cf16a70f117cb6487704a865c6bf6edd606cb5eb6344be7f72a2ccfe9fae24ec93b1b3e5810146af75e0653b343b2a8897fd398041c9eb9f2f537a96e27446ce9efe98e1bd72439299cfc46d5da6bd520aecb4bbae01212b0c7672a600ea6295f4db58a5b9c363d3ff7349a0317f5986a70e9bc52f0edfadc2a0f61c0596d3c50413f50f56c4e4c51849ef403496a1f22c474d0812a73b586921840095c093351bfd29d4bdaaa840c94052670729b7b40064a28609ce26f3362c4b603d6360be79ec1b67847b69510db70378f9230d845b106f5550753ec23b87c8591766494d8fb0552a5e4a437bc62cea06ad937d72aed82a790a9d03a589ced49829fa30dab9a35e96e6ad6fa1e9f8f9f021fc7ccb921ea6ee43700092038f24a1e337dba370d90b869ff2ae9d307f92d1fb7be35ba88efb60f0bc7b32986fae188ae5c990c747092ac447850645950ff40acf7b93f4210d0090f33b9e946821a1d5c3fa50f20d2e443d8933ba42b6be7d9b8a6d3858467c05e47570f207ffe1546bb581f7fb3e790d838adca144639bbed26a8e629ba878ced081b9aca610b25a2f001626ebc0eef8823620ef356405cb6ef2dda04dcbb9968dfde6a8d82d50ae1b6d153c28bd3d4580ee532e802c3ff26f42013bad61da5c54ab3ba5a6d42ca5e482813c52473c6913d35f3e376ec87015947394d749c4b9c952ec50a00d13668b62656a7cf703b2a5ed0e628dc196e80e35b317e8d1b07edf7cc1f17f6403319c6115b3a28e01c6757dd4509495c6d60b61d83fe3e921ba351caf987b34bbdc5eddadc457f8dc06de9f2a19f8971bb7517f2459166947dcc8d516e5897956f5bb0b02d13686d46bc44459cd770a20d7e7c120ef074212e6a1b6d41d62af94aeb428f4f4659960c88ecabe4ce91cc9744b8caa596e6808e89c9264577dedc235dfc2e66b8ded6c14aac8e166e0a37ecfd4b9b83b12a52256a4322b04359070c7b87ec62bbf0153ae810ff32777f3e6fc552af48fe6da06b8ab2ec8370322dcd5bfced48497122a8462e0d97c7d401267cc8fa43df07e3c35bd7d7db9afe734bae24029ee0f27a69cc7dd5b41dd0904c73dd33898f49ce93ce0985b73cc1db77e66f112ac2db6c3cca9b49dbeb188fbf2c66ce01665839d984c87793e28c1199f2ce136b82f3af6e4de777e1e3600ee06ef1b56497220ecd0edf2ee279fc5bf24ec9dc835c4d55adbac878ad7485e442dc44776bb797ad79ff97aa0b763a72cd57f766af9ff69ebff227ef453661417b9d33c53f39f7265c8db667a99ce3c5bfb46e3df1fc0bf70b88cf2fdb59950ecd9eb1b7d0043be8a7d956d175e6116aed345f9ed2ca638f9d27bf2558aa7d8a7b840ad65f87d4d5c0481553dc9f81ba16ed72fbd7d053a7b5897a6f46d1f94e27a675be71ebd5635f1962c2a6027a97c44fc68488a1c14dc378bd1cc3d1b43757f4ae40b2c9bb5853f0a0efacb75b13c8aa0400672655c46f05012db3faeebfd2e088db1b738af8d0bf1fffeb628fc38a694b0fcb91cc544b7c32a4f60e024dc5540bbfb81024ef48f48392ad571e17da4eb69201c47cf5c37b87df77f9865eabdcb2d44c70049b4faf25d220b5eb80ec617041750e855f4e6687628bcfbb9e2d741d68b61ec99b0101206dbaac3821073092c0e1e00ddc3457048335214471d16b07da708ccd965efd74ae15c5135d172c4d36f9b1be0c47b9698abfe904614cf3a451c92d1ae2b0d5a405c8a86f2ffc54b82689b2b0bc7f06df474055da040295a87235304419a86fc42f93c77d8fa26f1913df8d8885a5ccda66f2a322958d80fea2a472f6a333c8ab66761b5e7d776527224c0185361e0ff97d92a8c89641190a0d6e2bf100e1d733154fefc33f8e0ceb84d06c8d5388c831a512508c03593a29fc360c5332222cb47d3f76395a54c96585b46014d66816d6302c31f03888f08e6fef60e99c347083d686c53e66014b2d7f3aa6a40faa7066cb0941e9fb0fc1e45105d6661cff1df877487dd0405b62e07650c704de170a2c4350780848148270b78d4ee5dbaccfb8a3239655fc7b1f97c5e4d79314af7156063ed6abd8eb567db3d7bc64e0efecb94ee6bd6a8da21c8824d6a8199b6c3d3043b27e8322ccf665126cf77e56be0f99b3e618cc69211fe20144a515b5f5aa9f992b7ffb08b36fd95e7aa3948024d7d424042529062b4fa592370b355b3a743591f9916b06aab3c03760093de1c6d4aa12e17cbded4f4ad9969d1eac0f06d09fb04e4c3868323b3d3b247a144d795a936f5a9fd5ef8e0cdce71d4b68891fe4ae046f192f3a241aaaf4ac6a8c16624679701a439ccd1c58a24fb31045d3f84914bc5aed122851dc2ec9874e6d3c0f0ce4a1a4bc05a9b532161dffb13fe440406735406507259db663d2d1fbed42a564a445eacf62a7cbebe791c0723e718177c0eba5d032e1e7a681ef1293f6f9f9f9fb9e74bbbc24eb88a70576d1a05913d5606564a3214d94198050946bb09dfb8657a872c2274d67b2b9446c74a6e9932d4f91a1ae45108d83d450ee37037e0413f360a6660bfb34fbc11f74b4cb2c08007cb5f64975889cdd83df3af1c046ca98eeee5a6d61757272902b513c50c2660b4522956a22c7ca859b1f2f19563ebcca604d34ca5a279fe6fb14338d2cebaa445b95c36a16132f750a5b38c7119fa504d877dc61f228076e56deb965cd3c1e0a119211cd4046c72f6467375d0697a549ca60617b29d60f5f5492e6d24b1dfc7659ac44e24f69f49758507994ee1cd5c3203c2ef441026c3e04a4e54c4bd04c8b18c8f294d41142f20a1372e27e07c48897ec7b87c69ad28608c46eab274141075611c9d38140c4c60f4567a4a086028eb46c3780ae886344e649a076edea083c1ea3f66a7a9bdb8e21aaeba4947bd3cbc2dde0764b28a744d622873cda3f88b65a454288633935a1addb590eda51d04548d0cfe976f2a8bab00c66f16775034b13ed9e9aa509a3ab4524c5fb58b305782cd345a4eaebd31076fb6fdace4916229def1c7cb8029da8eb939d63f4fad2000152b351edf71249f0b2d17eaa263f137a89ad82c5a94a9a388441bbf20f4f2a40694d54b500853cfb16d1982e2c94ba1e7b2e1c0365cf71c696b4d6c848b5e3240fb7a071f52a9ed934c56d2479fe0abd077eacd60bd4dbf16d451b6842411c9fdd3374184ea5215e4ad16c20da9cff2a005f3036617eeb33b50718bbccb46648ba5e2f6a16914d6f9ad2867f612b81d50cb9e5d63acc04891900a0e311ca91a9ea5d606838622777f96688a41a97c7fd095d36030ea05c5840a13ac48c9a6d45dcea7a1af0349f8981ac4b6e17c616e70d19f8a5e73454c56f498c8f2a29552c826c0066228a5008ad43bcf2395da2980ab23dcd8b49732ffbc7773004e1466c8b189040c3e7f24bcdf8ab8452df50699f1457bd4988ce941aa1e09d2cc8d30c99d8cf6ac6554f2a53f00842131021c14ba6ad314ddd5c912f12d7173401e16f04c0580875b3e2f45851d03f7296ca22ac7a4aefe6e919b5ae5c49f7c0d394b66b17f73ef2ca732b269e4c17324fad68ce4e6d4cf5339f92c9ec33a61afc76a573073b9c661845a32b661e746474c17fa574f194da3a76733f944acb529b7d0255ca7ae62d01b9b7405cf08e6d87f48277b60830e4fc70f893a247a080211ebe3f12e8e3465f4970f8a25adfd4531368b847d81a59200693ab4bf6bba2157ea81f2fa4a4aa8b672282035ff49e7511867a59b150da0cdd51e9ff4f52d4efbfd24b85086ef4994d6f0a495c1493bf36e8bc3a1a818f0cfdee61b623c248884acbfdf6c4500c074121a98e1682b0f7a1b366a72e5ba45101bbe0175e32e8b134bc5ed847435a7d06ce14023d7dcd0bbf2cb716b88404a286476b8419e888ee6beb0df853519b89ca7ff6c0366936caf064b1c5f1b2f8c09457d92ae1a8146142001bc60dfc05023f9127aba0f7a2b8dfe5e64ee53f29c31e3893a12ada442423e190911514cd040f2493563837a0aba541012651739564d2cc57b86a75661aac4a202eda38991f8e126cf74099a4222ed67d22b3e8a06baaac3b294d91379deb6fb5ec77c179b72631cd62460902ac8f34eaff4c40c199c0f6e75e68638724bded50f8aecd1183f4ff6d92455a4009857d2b41778faea65b53a570489eecf07d94b68013c3b296a59ccc39d12e420e02668a4873157e32de3645bfcd77663916e80bb8c92e8751f4a03a071f14efa11c01e42332838c8bd8d3c3aa7f10fa705f2ed537867f7101c6f82257a0b7552da28b4473ce54408706adc18fbbf7049ca5b4b511f4d1bd43438c1d6abb963db66cc378caad73431b1e2de595eda73bcaf5e2ff872fa6313c2bf673621b85ea366e315ca38520d318445b05b7c4585f40dd4beda6ff7847d50b6cc0b575d391bf8f083c291d288568bbccc0da89a001d5038900a4ca35f3978b4dfd4e064cc0945b2532c3e799ce52e36b46ee4cbd6f36b1a1a6da315d56a3b8948e87b6340333117ba62e80db55389517e5eff846210f3b77159c687b3f68bceb817181695fd23fe7470d719566c0c62e5cd69141c97c4f538d56420bda604900f48525179c7d4cd514206515d5722697c14c80674af95f37f6acffa2317ac376533e787db1009c49bb48f6acee3ac2370b2780630aa56862cec984b12d12abff05637521266f7da6ff97781e1c869f7298e320c31c30b296c064aeb5356b6d7d5ffec855bf7eea41e4bf1936b5de845e2975dd16a0dbfd44d16e8354ec76341f35ed6d7f795e4739b9eb7c8a8864d390286deedb7ebf8f97fa790713599f9890a2034044a77dbed0aa84b375589e644650632983e7a4e5d035c56ff29f2ce79181ef32bb67c888c23d85c9c360328cf5126c309aaa97f041f04bdd4c3be3efce04eba510afd55f7e9c2293300cbcf32d1d082dfbb7953b114517b3d2d16fb6f3a4b31295a96fef3606c1468a376fe36ec12cd93771112feb1a81588e040faced0ce8f08f3b3931211b40556d5e4b279831a0c0db6d3f612cb82e252c0487c6a115aa42983a06b41c2e8d05c44b5943163e80b2cfe5e70fbba3aa8633cdf268bc435cc422be60673819c46d75897712e1bf83ae2fe7c282eabc82e3a3588ff984eb3ee7afd448e789758a6f6776c4a27eb335c529d164741b4cd6a2a4c669fb64b7be6a7b83684be167ce376914fbeccbcc322577810241b0aae424b64580d86e1632be5d05d3a6b7ddecf61649b06b3ca4e44b0126fd6d1b87882acc47b88a7f95748efa7480c80c0a2f11a03d19d5e34b9d4aa29e482164df30021f1e272f7972b44aadaf7b9297af02f96a4eaf303a743829c675c4b71d777f6f0f4632914e31edef7a3226fc32af38816dd7e971f5c4a32170517f4941d766176a1014161807efc3a8a23e5e42a1d6eb8b1714835eed4de404eeca1349e3f077e09da66f80edfa9d8b82b15acc897ca200ec1d68948387bfbdc01e44b4e13a768dbb7e3102b7aaf6369f5f280a2d45e14bc35638d994c44c7c71b0006ab9097a1db7ce419150debfe9798ba93364c2dcfb0f909f71855f232360e6be38bc597790cda887e00278f5792fb53cc61773040782e728d0be49021ff68ba4b69f574b9d7d4c6184564d08850dc2788a90d14755538412278b9fc8b340a11ca64ab3edb14d95701c206ae1ee36d5d621e744d4394a99eb0002bc498d67e81faed6dc91c69f8f5089a68c8b01551edd80acf0437a7e2b6936387179b38e1fcc1d4ea94515abe0d3fded7b171ba5a72fea1fe1a1201947383f525cd41639ef787c5bcd22bff0982949d6ea7c152a990b94ba60c4fa0ea054102d1ebcae1d0da2af52b94424e229e2a69ccef43a11ce71ce7f8b19e05eeb1e03438afff407d122c93d430d8d15a5dc3c8d269fe104ffa09d0c7d6a1640ffd7aadcba9e5897d966f91efd580ee2a3757ea53955a5509b3d65bae22210e0c0bf9520f11295a53a4f573197218f5cb167b5cbc71b8ea2a3c3e3103dea21c81f6c0237150b7b75db481321fa39c116886ef957f7b328ae5f74bbddca7b6f5344fd09b1db1c69f820d503f49e6a7cb8810ea6ad87ff290511670a4738b6a0203b9eecdb116d4d80646f747c8d97ba311c0764581fdf98ac28c76210d4593d81b3d23be4a37ddbddee67e5470bacff2761551f00ef5d47aca184cbcecf6296137e0e37df8b38bb9187a6345336572a1cc34096771ae6a8698a68e5d18ae3d965cb178f347f606939b260e2acede0644bbee10189ef89abe5b0d7fca0d4020ee4dc8338d09b4d6e17ed2aa611683e6f5420f1da711cc5f5c9c86423e28253eda9832dd8db6233bd6e4e7c468f6cd7c1c03f8d53889e816f44629373553a1cdab5fdc48851c0d0b5c778784fa7e5c85a3e7e72d91815f6ae51423bb985ba596b1dd28ea32d9a9d344300bf54e75bd76bcc1d3762b57bd9ea6b90afc445764abd8fa4f3adeac6a892ccc91b7ae8b56ef599b0df8bb4e384470be7ca10f866194b55b90d12451406af1d447b14c8762f36b13e5ed937500a9463462e16ee2be628df16d1ff7855a8274010fc8e577c65a7e8cd6f2b66a4a2c848b5b6ef99ca7967ad81ebbb46ac16fffb7b235b008b1f89e20e396955e050c60086021833c3fce2d4e36b95a4d8faa574d76c6fd147a1e04702d3da269938fbc92185de559ee53dd0db0fb96eac950f01b39454317cf454fbc75ebd1d7190f5bdb394bf997386fe177aabb6f60b4d9a5b99d464f8c8b10fadd7fd029483e1562dd22da7874694d392103f92dd7ddbd4d89e804e6133495d48b0a240c97b9978362fcdb18ceeb8f39c64d4bfe4c58e6f7c7b69d73ca406102966e160743cd8be15649d6408e4aef42162eac6fffc0de44425cf5debe7de5534a3154e50e3a6a789d965242217c8b464480a4ac41050e96404913441f9b13611192773423fafdbaf6885252aa3b019bf35f325d3a5ee30295fa524e52ceb100b5df4bdc087e6ee439b2b2186581e0c7049abbd701e89fe00bda5c7c2795d30026b24a464b5e654bdb507e9c9c482a6654e759c998c8206b71f0a9627f59b0344f532792b55cb50f4f796c2b345b33940be328a27e1bccd1298d3ea569848652542a314acd926cc951e4229d1ddc4b2f728c58248f6258b153986ab68417fb008fd6d3a58e3a8d47249d5b055cac118afd30adba1a9e04107d04b5534c5cb77565ae04958ad52a709af8af0cff5ee8b715ce97c08f821627b17537d6008684f31de2a6c09c05655ed87d315a36394669f10dfb07d09f1008fd87721af0aaec924d82c8d246d20ef3f158aea12687d5c5f4d6cc1e4ecfab57b42e610cf870a9433781468f94fe50171b35da3fa1cf93e5a3ab3e8faebddfb1d566becaa841e0980581981fa32c9f8e6db4dd169d66052cb9d4925373727953a7fb8f19b14d0bbe703c93588e3ff35054398b27302b087d03fae6d92bcd29596840ce942a8edab1fcf4be58f3e3db8b52d91b243a8620390ae971908242bf7fbd5360faeb19c70baca3e96f3a8497acc08cf6df4992888edc6c67244a065169c118df4dcc6be1d44068c39e26693fb64f8df61f56c6c079e551f4ba93fe60842be5f61e015a21e43884f6caee37f962d3540c8d0bba43112d012f6d567f98d9fccdf602d123a249270ce2f59eae36b2a1f6bfcfbca9d9f7f44b13f70612366125fd13472b1a63708cd7477e3eea693d7e4eab06f3b971e2e519b2220189c406680668f9e4be10558ff819b58bc65fdc7587de86440f1623c3bc5baee3efed42207283b67a2e2f0f4f705de34ffdcff4fc5903d9aa358c3af4ded11743fbe071db7bd98bb9ce40f9d18300be2af0bc2341437e4b240728bfc42d66fea9e9ca77024c2bb671dd142047885293192ff78f48fa582763f3428cab6d6fe9770e90833b1480c914f88d0d77ed73aa3cabd85e101a9d2e8f109ef134893b4c840c15c06298c97d590831b28be4cf20710f89d3bbb012ac1459616d50b2b4c221b7f363283ddaecc9690e66a419c52fd5e84c228681300844ba7925655bf98d010006feb986361864ac1cbedc63a4139ad3a031f8181a0981e6a182dc7ab6cff79496b8aa4aaecb2b209f2ade21197413dbe7c7fb9a5eff83807657af64416300935704677b44408a6415d523fd027dcdee8a19bf969c0cebb8a776348c7bb627022a84d873bda054c5a23c1ecf3224ab2719fbb9740e6fda9626cf229d4ee323809d66c30e1fc9a3bb683c0494ef7f95fb2b060258a7218056d589be600bd8fe28a151581751915c782674e6ffb623294023b30bfe1d5f9ed3ea15c0d94fe2527148a4b1fc5458522480363b82d0aa9334a239eaebffa5eee83c0175c09fadf69180ebbda91cfb6d3c67effd3a7db74d6f53fac42699e8ed4024b1e85e3ec528ce53c772d9e483b249c64757696a3a389ab7562028a671ec60ec8329305ec4a2456d9eed294f0146aece6a59b79713c3db73ea49bcf0722ff33eb034147ffc5a175387e5032a4451d9947ed8652fc01f44e7f967de58c7c94f525712e92286d57397a9b19f63419089c836b68ae9e0004c2eda55dd4c82c4859d3ece3e6ade01a78b614ac3fa4ce12fefb52a0f552221b57a08184f021f71456ce7cb3371d6d94cb69e04f2ade483c7091360807caeff8e204a482e4181d2011410c78ebbeff126703844f5ad32e4aeca8b4eb4e3f305b8106bda8bc873773b81e7941168834604a42571596ea245852fab2bb293819247f52353bd9ab2450510f710eb540cfee3b50952eac8f0ccd3ded4089d4e2603691e8658832932946beb7c4a02d4db161cb8752858a2ef236c78f807a5cebc38b05435b6b3c5616304469a9c9fd245612bdd066308232e09a94485708497472ef2498e0e875d6707a68e35ab7f4a22633cd4b8f69f1128ffdca5c0624375e6e8003c0191e48d08f0cb659b0d08f7ab0950aa1e20c897c561a85630a3e2b18f8d37bb1f2a756ff8c927198d2d24584099fbbdaabfaac20274306087bc629269af20666dd7f3524c1bdfb8a1e49541d1df30b53459ce64e6cff92050837fd4fd93cab47c80e3b431b941267eb4cec6720534528d3628a6360f53144610fc4aed0fe1f931a7ecc9a39c2cb7ca603651d14c1c2aca9bf0c61069486d708ae2882f931f39ce619a5e70cc87e6368cf38ed97131c1145c8492ddef5676bd56a0cf659716638c7e7e8df1f1ea5047a45f8e5bb1b6045085504f13f518d410c7892e1a36909c9034fbaf63db1e0896337418c11c686d71d142bf4b445ceea2daaa91fc95fa69610f6a1950f02ac5db4582b9e472fc78f5eb896880b4a74e762342b0145927d6b5f9a6e43c6683226958b02e0fbbec4f0f3c96353da961fcfd1c39f9c368c2b0cc4797cca794037f9bc06da7db7bac34d203a9c06788649db16d1bff2077ecc6220bca84de9b2c183159f0ee2b5280ba525bfff3df986157965284d1890b3287ddbc664736a5ca7eb25e2afee50a940fb7e3a882586f6677914fa48ed865154753c7c524d63b785d374d4f53bac436b9c1760f55723be6d3f9d46604cdf32bf76160427b338587d8c0f46e06d367530f2ab4bf0b2e69b446f177bc75da7185d47f5dcf6ddee7350275e65fe0d8470bc5623a3ad6a0d0902bc21b06dd8e2a3abf905cd410de32925bc716a3d86267c4c04115a21a0d20dbaa7d3e96df04d8c7598f0e8fa15d2b742657e1b6fcd4fe14d2fc39f9aa6219ded46e4d3fd876e02e4aa7e41f148cb7181b6168123b44401b1188c7ebe7271d44ecf7c42c8b6eb529970e9557c202b4a553411367ddc656f85a06cb8214a4b20f7e934128af6dba4fcb8c23dd2a5bb15385262aee30602d13390e5f7af58d0bdb01366b3675cdde503164b9a75975b1d96addf1bf02bf2be712c259b7f3c498e77cf011663fe9e65bc98eed0a458490d2e621fe1cd87008a190b09c2f50e68e5167de078331734608aa5a3efe994d0b832370f99bf3e3a67a894707f98a2faec0dd8cd48a24d98f059a23774f793bd33bb9f79972a0059bb340a6489185a0db6c74e76dfc0e08e0621e56143b0e0f1a6c2298c1d76a3114510528f2e08d901b68d07772067170a05718fde10d2476743bc06d8e34a317ab2f4bfa927a1507e1ea18ac89de1e33d2c3f6da054d2c3ffe0291dda8851f1019d864128ced7bada9239d9f0afcd9b753e2c442eca4bd223bdcc490b42dee88b6f63edf4c94a4505bf8da54c080402746b217832c831e3d587e0256be3a82a3a9c2906f22298e1e395d5cb4131c5ba91657135918464e1e18386f3cac20591d5f9b8d1f0e89904fd163f3fcb631a1cd77bc082e6599a3f2a4f4c8e26954c7600a3c504fc05f7d167290b1774faaf86c05394b553805b7c4d70865c09230a43aafecfb1272fd4284419521b5319b03a598629a005e26c8fae3a9eeea510c3d761b0f53cfe1b4061d42431f48c474b70475b4abff4b99820163596fb38a4d8af197ba6832b606c1c939608cf1db118e3cea5670e4d1e0fb2471cdae58a626f4038a684686c68ae64a9f2bd74759f0f6f91ae0add030864421f0afc8def56f58f3131ebb02e99bd18327ceb0c3e7ca22c08296a5318ba31a0868a3e80bd4ef9ef8f5a63f2951efc71bce656b1f891b766f0adf619698aff31d5d11f02ce4e93022296c7abba33da3e83aecd24d791d24642ce0f88fb6e8c8286ffb887d22452b4fc262d5a6e915c72cd94c424cc98771194ba74587d8984f42dd0f5d2cc1a7e4b32d7ab0893de63ba3a20e54b266352b800dc2de80fbdf33598a68cb54ab9f38722c78ae0b425ea6ff031fd51e7fd0b27dab233ebe41e1b892f606ceabe49ba1cbc6edc9d2fb98f7b57e78297d3d6e086af4466bedacb4ca09776a12ec2b6949265a49bd4b6ddce37d9bb20aaf44b7e1284f9c4f5276ff8aacb3453fc2d2ba51c9a8e0c50e4fdc278ea5d839140e527de30726e8089e3c0c5c9f7d4b3887ecc5618b53da00b078a5e2bcb0c50884356eeb5594a1c595c8f74fcce6632446fab8dbd306c6d2aa59f99a01a35126919bcae6cd7a825a2cda0b3c2e542f41155747998f13e54c38f75d9e281205c4796e2ed31a08154c99653bafaf9d7502c69dbd0d3c3a740f3ddcd3b3e5f2786ce0c42f10d8e951c2d6e255c02157a94093cf4c4619b6651c44f3046cd0a2bd31ce0bd40f8cb2151dab3e13ff7acf1d2c3b82198abfbb861422461d3066cafbfe77cc489a52d3981f62a5c766ff6c2e29f3349c48c1c0ce748e2255e85d70c4161cad2c8acd3528889158ca05248b5e30d933badb774cc585c0a187a4b5424c9b15a322e0c5a6320ddd445eab8881fc7e34a7d751bf20a0a4f8fa6c05b55ac0e7eba2cfea298f5b3939383c24ead1a2c83bb5346958a5fce57c0e299b4fa4fa5601c06b96cba86185dd0bc115e215c7c7c9fc1d78d242f5cba099283619e7cf8aff8ee5f82ddcbbca6d33b869528fa4e3e598ca5d14b6251ae4ee0dfdab080d825abd6d08b91c28cc34cad010a3e6867c87c0cd14d00f2546d75e027765f88ac9e3dbde2858920ec6c6575ea103006f19955c3ac3cb5a8d41d33b8475bf17f05853d1b8c09a1b25784a66307fe7289388ab84bc438a46262f1aece39e3ca57bb1b2abf550d063334a1546812ea9d6c8a205e0e45b6ed2f6e115819a419c9578b1f2d1afe888c4b79b666937ec56d2b3144bd26adf100e41172bdaa1eedb2df12ad8006a66659574c006c344702e24b54fe09a3fd7d2a8a87ee3c55161467c80e26554455d2a0f0e4a4910c4bdecca2485707658734a6fd64483de1a901caa2984be1d108d66a9b5d04f6c2326b6cf8511ffd7a049959e3383604068a3e375f950850e356f5d2573e5f77a4ba2c04d04ea1b20eda36b88ea044f3706abbd37840b5f3787ef14094179129b54c283393fac80db3fd317a2b8f553f6459a7419d8b158589f04c5c70260255a1425be6a2de5dacd88961fd5ce8f49f278627b4831eeb3a6d735688b7a34124f935e03c60714db3ae3fcfdad8c8dc6ba4ac3cb206fbb7c4cd9310bfc0786f1b5e815b5360c49ee7e8d26f933823f05675343d7b9d53e90602b2aac9034a94c55c2e3210a6a9b6344e6d2ee78dc77e31fe38ce639f862654488cf0bb548eb32fc4be9631583c6440edc3327843cd80c96d27cca7cce4094cb60e3a701f845b02e9c91fd189dd9ea29c9e1e832d15084b59fb9bb9b213a02b70cd81c4328748b9a8893cd0bb1f845845ee25b9c1854f0166512cad266bf874687e298b8f42785c2ea1014d25e3b6565a9116941be22b8cf919327970bd956cdcd3dfd226c80e573079116ca1b223adca1264ab3962ddb96d0693942c0f33dedb2c9a662b9e3d0577c2f5b220892cf439be7c91b9fc89c270bd4f781bda9c1b97a8d5e650afa681abd0bbbd8c4c49641c0912a1a558a51243ff8a13fd7a1e7d0090ecca7eca19726b082de1cbf65a747b14a77889e1e998d769fa068f6341dfc433f85a41a086898f67007a9579ba3c29b5a899892221078faae6fcea923cf067a7d4484c1e2a412fd7ca898cb1eac519c3e00cbd8721b4ebb99dee40857a36c4db9ca470f830d13b5893788356ad0da70be61b0cee21197c6e74555fb5dfda90320a4284ab13daf28b1517552f50773421aaea469b2233b54bb2e7a78f526cfcc56c4d6040394b9ff8fdd1640d3b2bdfa797e66c22d2b29a155a2c25037ca0961dde875ee5f547602c66c609e8f6e53138cf986d80c78d0a5e8117ac743617797dd99970920daf81ab550f6e0a4f1caa0fbe1ac3f52733169a8c3a4bb8d684958a8c5029be4e821443a8f4145a04993ac4e20948642a2f35b6bd54d477f704a8ff3c7417b142b2b2e8591a6c0cec5c2de996ccb2c042d81e137e5b8c945e4cc536e678b11cd5c32be80e86d2f1ef04c897dca657ab54e4e4defdc425742c0dfef9383cb34c07b4ee36c5bdbeea8b84b0d25f58a3593b61d9a80eac846d89e50d9518ceec09ebfe11ac102547149125790c512d72ad759a36de382e7843f62758ea980317358daccb191184678632b5b5f1bac28e31ba1ac35605bdecbd9940ef1c7f252e73736057c43dc3cf543f284a4252f5fec770561443c5da8fe24e2481dca7fd0d38770cdc8299ea63a3066033626d8ad96b5393541a5b873aab6b5d53f8e911d02469ffa36e8c19df658716d0bf2500f3513811b7613eeb49488d02bb490858e2e017b17c4156be46083bb2b4e77d57cd1a716d0c249cc14ee368cc830c5698020ba66d958a59d0c1ace285f2072852158d12a856e9f31df085ba114c9a721e81447a0e2b93744e94117352b29283f8b541a1bd92f38221b339b3cefe0855819315b104d4cce7cc5881ba176991c26f5b3fb845416b30e7a3b2bdc139da18904c0161c42ee339cddaed9e88933bbf4c101925da4cad0ff333ee312e0decd57242d5f2e6655aa4b6afbe36b2ac9914e7bec2dbe0f8cc107113b5576f3c8a4ff7431110e59b26352e81c378118fbd9f70c1da569b62c64c8c1fe47da2deb45d10192a234d5089fc44406ad98596d915e87864573f2ff3f8484888c8fc5bda034b998a2b71450891b70c2257aff1a81f5ccc61aed5099702ec7b60f12985228763492c18322534ab3afb11105febb0a3f394a5b1e19540ec401127a76b16707273e39e80888231e373ec35a71c711626beb21d2bb07e413926454ad3d4cd8dc9381fff122a73fdb05d54b0b02e4aacf22321e2ff19a7e6bb9015f6293708a953d7c16b245a55e17c946cf08476fe4a0899f6dab3c14f7a6b284cea90375b9f3b7724dc781498297a398cbe274eebb29077002e863af2cba0c82e31562ac05ad5dc2c86331251ed000a1c830984e3c777df04c6dc178ad935e7683a4ad43294d01f6edb9e1797fa15c9191f88f6185992dec6ba7ff961be0c6400014790b17d50850406bcb019b0d0eb628f40a3b4366d68d7fb4d0cc4aa706bfc3c8f4030915b645af3957f1b469189de2cecb86f5236e225db0696937b7d3d56216548358530a994fa7fdf2276ecbebdcc42493b4fcd2fa5c71d9d6f166aa0b225b37e8031f67da4fc222164e2ba52deba42aba3566fe4a6105214376d70d1751f284ca131d213cd879792fd7ff1f2e9b1aa9f896b8924ef7a8e45dcd8fd97b9e92032850cbc3ff76d330dc40b45d46bb3543bf69f051c598e303b568a0e1e53a2c5542e8ca32f4336011e36a9805ea5fd446744a4e5ea5f55bb7a773899e43ea13aaedc9b53bc1a1073c3fa01dd01da8830228726146c8de594f386a4c920009602807bce027bbab820c95335269406bf82e703fac04638089b38fb446ea734d1d178fde7f1c4e940d2b52a8e68145445cc38fd55968e9fa3d8feb9b676d080750fa7b698947971088f12aad99ddcf41f1a5c93ab9ac679edfe8850c6ea425ac39c72ce2b5b814bb3adfb2f347c3e54fe9adccb4411f083338eddfde64ba2012d45a5058ff1255163dd71e4fa4ae4da46faaba14297ea9efd2e6baa41a1edb9508e3b67e3bc6e8975c0a29a2fb28fba630cad14773154d2b1abba50cbf7ea2108d8e0a8ed1593cb19c506dcb42ee260114e6bdf8821146933cf7f5e3272b13dafda40c0169a98218d85eb79672bb1b2e1cd0853262e944ebd01d21602514a05e342248d4b08e22eb43f8546b4dc430cf8a8450393ecb1a31b9d0dd8a2a61da570f94897f5beba7a462c9f5367805e043f235782e7e537c70eb4531f3d3c3f1a39be4fdaed6ead26b1ed761e539c2230655b14eebc7541b234a14370994e7d6c78af4d41ba467807ce2218c4d82fc1087a332d35d99b1176ef3696835e2e40cb4c6b7ebe60edb414cc331e8be095a3ded7e6bf81c5d0dcedda76d04c2aa7a1a0688db4fa6aa98f3c45d61210d974c0046fcb5d11904094c6700b73d1c48cc20eef16ca8dbbc0181e88d532d18ce1a2f74b5296c1c58ce32491535290fe453d41413d9449d0cc5fcaa79b88d8423569cccfbafa3f502d44b056b689911612580699422ccc95022fd7ab5919c285284bfecbff3a04e50b7614d971b542b4c4dff36a5de5de251090899c8a99b8b2ae10121dc2224a5ae9e0e84338545802c060681e0ce5893465ee1d2f38a883f85865d4b43c2a240dde6857ed476803c60dbf578d8dd1fd2f32172a9d02b3f94c95ae5f2cdf2b065452615b8d343d91a915516b930730a58147428dfa48064e4a99fe91d550bdd03812a92333e4b3a78649d1f69b484fcca9a5371c6367682e864194a4ca01d90eb79ceb9a35e34e9a58adbc528268d2e1580fc197a89b6b03086588fd187cc073898f437bbc669cb128e7b7cdfff8544cf517f2b833cbe1233a9aedc78a7b9f446d3530d1decceb6e3c1e8f5d6419cf025d289d75badd0f3e18987558f50b526cafbaf35a6d913aea65b16db180a0cde4c0ba6b463730267efd591483f515730fdd8c224950870f1049d3a0e0f1a4c4d2efc3f125466c1b318c394d0f134d919c289fb21801438fb85ee4eac5a561d20cddb2c176733a4b502370d1ea802202948f44349da347a7280f466c96c5242756b710a85d2e88f0251ef70031e3e85342a0a960badb1a693dedda6da76e02d2c0993235a9367a14e38902903663f6b3bc7033108de9c170f68418c40a3f3b9c90254f7f4372858715776d3905f7e2cc4db9dc83f2c9242f4d73e5cca68273ea8a5e9048cfb50091944f7987974b0d8d9a89fa6c8e81456c4f5e1240e889f36a26f526b753ff549a7b483c486407d719eee4855cf8e3d6da9b7c4ad92e2cac7612ef1ff41f5264711a8a797d6d424921319638aa1652a77a4c109a607182f9a0b22b2baff5bde75c20b990697cd60068bedf5463181ca2f820fba50599e12eaa09f97cea7f7768f1526c4dd39c5158167182c1fe9b82373865a29ae35e1d76956ba68ee21428da18121c268ddc9d38a2364d695a13250d139ac47f5619fb8afcf04fda0ad034cd5971e1d06038e18f431e4c07c3953f792d40e26c10cdfa523be712bbb263cf089c353df708a60d1e13ca5ad964ddc07e979b15b208471676a0bccce2238b2d5e6710a175d31eec4688a80c66056ff03fcd10fc64244551556fc2059a7c5058d4124fd39a2cb493a13309f1e49d3200f6e0436e0fca00fab147443b7fde8158bff75a24eb7c0acfb4cd047acbab1735b61a0eb6d61fd81f9e606a0cbf94a624f30649adacf1c742fafc048c25c8e1c08543b105bd7f576b6d38834673d34abd69007f76c311c4e902bf80464f914ae5acea4a4fdf20c1a67a41e6153e3c87ce422ad85c3595663c108bbac3323f791d275387bcfab21666c357078436d9a9f9ed2208320f0cb6322c32125ea1673579a3eaa76a8f0e726f9bf2c0bea7abf25aeef491fe22e674ecbce9a7831453771a1614cb67187d419a1ecbf8ffb5c108b085d29867d7e9846d4eb6653d4d99dffe46352533ea85e793fd39386e312ce8fb5cfda468903db37e52c3f3281d889acd0f2df8afcd19bc29b4d8aec5f156941432d679804700c38d9c07941fd17d5b43139f192effe95247eba61647b77caac4fa21584ef124b0bc24dbcac1adb18bbbe264dabaf339650dfd09f5c0f647915c15be98b165a8007e345274b0ae5a72883141e56722762750415c47d6f36ce0b0da24ceb7274ca6e1be5ce260322b2a698ba737bf7050fbebabf344a09f1cbdce722e7f566af567dccb030fcd51c9f667ce744f900b22ff84fbd3e87dac73e0035517eb2668a14726758cbd9710c944b9d51502442be1db150591dbe1b078e3d7dc020030b32feeb27c281600c928b3a36fb04ed2d077d4dab56e97e9c2707a14553b158d1692640ee8345c3fb2fea77d25e4a10ff8c2cf10df133e888d6e9f23f14d0aaa2bb7731cd578bc5bf541232736022dd9d0c7530b13059465556cdd0e5a4fcbf2bb92021e21ce9f4da86dc3a93f3eaca39dec791e11a7e6ca4f37594f36b1619221e90b7df84ddc509b920a610b61095788677c95f09b4867f988e7e3b10405f19ec6f21aa120c26cba98f05faa090a50d14288d5c6542fedc914db46f093dd0df6c61bdcfc5dea94ec72e647af7951e8e884701024296417074d71daf1f269bb7f6f077f76a3bd82f272c6849719cf20ef8b0bf9bbf56f7ce92ca2c17f0a217082387668bcfb0cf272312155d8a28a45d3fc9edd1e733fdfe1168a96657cce44b4f891be357f75dc98f826b4d4590925efaac589ded1edde8a25c4021928b612cbfd7c1bf46a7ac8f8813818112eee90017cd8a2d46436b6ff39e169a8869f69773f653ecc2032f57f0725745c9b986ee452a7f064284628f32599d3a88c429bd34edd4a489b5334f1f4dcfea84badfdf5311ed0cfb48d2bf4a9535b3c4a5b648e8085896783845bcd0f53bb3eee625082e383883a4d0ea9b3912c088eebde91def124e4cc76f808787156a62fd041cccd82c79c2d1ba2401661d22787125542e19655782b635b1a6f99cf2503d7f5fda5ea6e2a73b6bd5d291fd5e916418aa11fa78c2c68cb6036805224e562df0ac5ea32d3972450f5bddde9f68b7087328f846fb8b6f81b2ffc41fa3e1ff6e3e52a2ba4fc56eb8904b832a4dd51a31799e4aed56acde29f080e65f6388dafc04e0929ef018234fe9183c41b0d41694070ee547e18e77758a574b98518e1b5fc037d11a307ffc2af06c03dd84d68cafd7129c1dc855b0d829fc163d15bfa82fb13a929e3223e52b0a8b46e29e0a57618064d62d5bb301258ff190132728490fbb4aa5a45e741eead75352ad2bce7dcce531e20b9e5cd2c3390f1d2517139fff5d6b422e383ce9457571c8a1732fc160e02aa97816230adae105acac57345bb50959dc3f1635194c467068c4c05d4aee649594727181f8d8492e73862f5cd477f5e1823532ea548c301e85d372a72c968620546494e902e25d7922ba2029b7177cb8296b58e8dfcd16662e0d878c5b33c769df460822a6dc6e9a63612c2d439aee9bcb48bd332f99d1df7314a01f25e35cde0d85e89150e2039b0ad69fda9642c5095cc09f7d8ed98bd01caaac4bdbdb18e4c8deb0ad1b632198053546057cacdeee19b503e455d424c111852c65b1cd87dc726b9c5e6218ce5340d446150fd3e2317479120f978ee9bf60420033c040dc3d667e92885c6ddf33763c4dd15164c7803158194ce2194e88e94be3548225ddc1bf29625cc0eaf498d97ea822cf1dd7e31e67ba4d51a94dc327d85c4cfbf17340b8d99b73248d3c3cdc82442b338271a0fa01897b4489cc5a2defc5b8bcc00842c9cb252a60a03588e1294016b3da55fe866df3509cc94dccf0a410ce99e40afa883971bef29944c619217975196ac4a78166343d899bc0e76f87842695320178999c0ebd8a241f39fefafc583f2255973ce4c27776c36dd1bd7d78d1105686950561e9dca5d172ef96908c6ad7ec6f563fe314eead35309ccc54f983a0b06aa39f68ff588a982c3e1b23b03d4a7732a8324e2ee50ff43f98b3158373e9b470794c9b9bc1704340c05ed490fd03050e0a1f91a2d4831d4db04ae16db5b0117f6e5d81a463f52230ff8bf52e6797281089b4015a381fcdf019783c291b55965fee711f1437089a28d338722e070e8e3e71909b1196ace829e45fad7365dd8270f4d4e6a327725a1635b33b8c4a6734da08322cd7397cc6749342883c7ff136f0932286e41a5120fb12c2d1d18b23500c608bda0029e41bc0d6a038452a12d34641c28c6d42193ba12bebea464eb1fc5a00ba6df921f415ada821f2c65d87a254dda1f4a0fb3c9448e3e8fc4fa2e8f39ad8d20a91f7bb65f7c4ef62417feb761913fd68860b20978da8e4133a3ceb95e2388ad1a5bd10388a795d9ae8ed3cb979763f42b912a411cbaf22842607bd27417fb7a200e9f61133d1b4402183267f99bc0369f42580d9e90819d762e5d5b5ad0182cc1acd4f243f5fa1de20bcb921d5845667c453ad3649be0316e54d17adc98bea1bd4fc46a303c2ad18d1a81f721512be64fbadd6ae367c52d6c91f663cbc41ff79aef786ca552ba820e01280617a83059db9430f2cf0e9550dbc890f0af1309cead5e0f209b0a329b5f315a0c8df0408780d40f1c876dd6d7d973ad67818a0734da102ac34aea624e3bd6a54815e895cfe6f32a9f460d07b186c59cbe7b0ffa7b91aad31ba977733b4f2fc3bdb758fcb9c31eda20f69c346368bf1713100dad1932d0cbea5cd8ec141e68b5dd5e8c5d1205eb830dc4a78fabc0b80ab1698ce5fbc7e96abbb2a629b74db6488ff4559050c79b54da564e5305e21b10f799cf54b5e347b432ac60021ba63e53d0ada9e384dc2cac71afc203e2f180773c5a510030765143a7319a2bcd86513238227c10ab23ad11fa8f5628e27a555d548309017f61a685ba17ea7f5add012607a1e9ba3ce8f4999a6f12526628f7ae8ce0e709867e7c550d026ba9728a9d71a31cc110cc202d9dd4a61f091cb7852730fcb24b491e079198a4913b26c2b0f32deba055cbaba8b184b8f4f5a90900e8942e464ae1e00b52ac29f3e40b7704d9d074ed8dc368e08d46954a53ce64e0f3d99daeecf4af88acbfccb9a7441958494d18cd0e3f3f2bb704815b1c595937852a7a26c058665297d195f41b1cf3fa17a3e7f66213741450116e043025b6a56c1fb837c641b00cfc259b17f47b367be1fb6949582a0a0f8631f2bb1fa63f3b6f089b3fae8acf289451ec8bc2f7c832b5c29e415efe905d3aa3527b5761b4473b480e00e244d990100e3e88632491ee5d7bbdfcd69adc481a15098e42cf36694f5efe0882b005c5a41903f0f7f905296c1d3787e00282f164c2aaab966a788770263f095adfb748fc416d63043e45fe3aebf159352364de4c8e6275039b1d6a2e124280a03f5e6d26529d855f7aec10f8ce40afa49054606028dc465c9af853b3145dd61d875a0958a521a18a55f6d286e60d160b83f2cdc27b4235e650714ad9c7d00e0c347e8071a1927b880596e745354b28e82ffacfffc3a59a006e236586cbc74f1fe1d3cbece560e7ed8fd1fbf98f0313d3c1c0d9d34115e38d07e831a8f87f01b695cfa39ec8c3ca4908de6abad71b9e3b9c9c24e05358589708d413934ab1bac654ed9e05c96f3ee89b8070c022d6d61a6f7c55592e8c7565323c1bb0fc3e30781b485090d0757decc9ac2b3d09a1894aa213b74d18b588cf2f935528e8053a94f940fed7a03042a109eb702513fd9b57d467c1a27f27d9586d09c337e34fff214cd8cdc6449dc220d581ae25e2990d8e407a66026338b64a1842d57c292d466e305ecbb87580584136b28b3b8b95f573e723498e2a4b4313e0fc3754fc9b31bdbe7e1237f30aba8b6c72b66f3cd4bcbe2e01ed602c88bf20da00410fee28c37def869f5d06563cb232bd8d245f06db57deed11d1f59849f6b2ec8cb075e4b9c76c48b8ed47a1818884d306f2734aa8389c5cd28fa0dde97c13cec3c18cfad30cccb11ed9e213c79b95124ff1297b308cde9ab4ca097a0fad72e480b95d06784e572752ec1d31e0297326dad5725a8c0de32ccb4ba5d6f2af6f0e0aad26e0df52a25eb01b054c8e62e68081bb606633821f73d84c2d02df1dbbe98a22d453113448873f34e875d329e502a743acdd0e6f3f492f5874dab25d3c9a13b9237ffcaafbed1e071443c3b9eaee983586663964538018b2e12053a147584fb5fdbf5e51bea540c912f75cc332acb2884c1a3cd192b5026abe19e01724d8c9429b6450c14f4dbe59556c33d4e324345c14af86cf84c17bc26d1971752687f1f535065cdca38b7ca3a9b9ff6986b4f4335f0d1bdcaf6bba96482bb56384b727f5ea82b01ab96f86ce556012c03f06e4fac0e551a417dd43e9488869d55929df97404c29da98ac4c1d4952b0b25294a3ad89faad5438026399620ce36103497885a595b3bd4a0d526a04480dddcb233f07464ccd0b1e362a01365516deecde5ee9e28b329e2179504515b1930b6107a437a3d65a866f206708c879d88682c74b673f2f1dd99d24908c68604ffd81056a82a2b315b8abdc828a735b3e5a6e3dfe66e1917a628017a0f2856fe3002574b3c5d46d5f5b48a971a9063f1ae592d4f456f7411544c103d578b3d82be3a40c90fabead4c326b2e359ef86d07bcb7fa31ffa43b6bc96dc750aa05c4e7b3b4a4448457d806f9c8df1a5b0f53833425ae384e48bf565ebb45d119414456350dc8bf033dcc31663b2e0fdf523d8406bafa2010b2002b82823f15af74a3ad7c4c3e87fa4e03b63ba54465d5af2ee74988cbb32ee29365ff2083e21d85da37efc84024e6b51b541f8103a3f4eab92172f527d12360c74691acd3e77f1106849b51ff7f19a932900b531201875b719acc448b6b792741020ab055262581e78213a028d13c3d901123aa2c8ab098271374096ce0cd3ce108ee55f5e145c1f2a60157851359b7e5308ef576f08e3e9227233e868220ccfdf6ede96b6344f3541a141d1044791d8f08c30773a50df496cd3c4ef93e014870475091b88e36373e984e89994c5641430ba57bd7553582bc42ab21b88e179354b733c2e6ccac454b283ef2f350e02b0cd887fcb8bd9e8cdc70ccbe8024598fc03ead9a6019e866a41590211ea6a1efedbb79433e6020d83d6f690624e7ed401d6e90384a1e85d993cea9f83c199e16e462be0f383150186cb789dbe08f7999985d028b0b328708fb49bac9309f99266a1977b450abf80e5e59990f0690ebe02916cb5b2817982e40bb403afa0cba3a58f81ec7827f61484fdcf27d1169e597f2252c2188ddb984c8f4f0e8514f1fd90aff02e878401efe45b92dfb6ad4a317454776067fba0ed215a01e9238790280f33bc782272746de898dcdd85436a30814318ea9410618f35cc4877c7cad245548eee207d8225919594a024b8afba397e6d689bf4c15e87501e923e810d234799b415bc869a13fe4b1fa4deb99234ac7f561894783a90e447654df6faf1d98a9877f61a148aa1b2ba37d2624babcc86cd63497393681e70c67bcc959407ccc0600dc1f20f8770953a4f87a539206941ca30f24cb7e9d6062f8ebac08d840688818dc5ca9f98054a25af61310817e05765198eeb76e7c86487bca056f582fd1a39671f70657f1f59ba5622000e5443f6a3c442eb4315b6787451321f0e5efca5d19bdf9d0897b2e71d4c2a7095c2a13bd7591e1f55e7614d9deda69170ed7d1111f2c6216d41e8ed050bee96c7cfdac1318086c2915b955bec2821441269a2ed0cb5b114a82a416a5e61e2a3aac6a16af8a4854c242cde70c27ac553f4e939288e5e85c7a1ff319e5ad040750a69ecd917cc87418fea409359f757f46a28160fa2b457e99fdfdfa8ea7070adfac3eb5edd733c55e929ac8e364470da2ce336b8db6f55f3276d9da172c8a1f397bf59640307c2679060b7a183a6c1f4f1a5ecd19bc74c82cb7883ac9baad7a4c11cae903186766c33632bd780681f34bc6991c0233310b9e8ef70f6a946bd1186ad330b1668bebdd19cf5861fb06f4078f5fdc8df7d4893f208ed8be7a0050a5fd52f76337581ad61b9a967105e5cea8336efb52cdb3127e0d3152d4d1df52a94cf12a23076da06c5f63c9e725a5c23fdbced24fc4c8af680a56196dac59d8f2095124c0ee825b54ffc3348b5587e075a6fd6aad72b19a40aee821deb17be888fb4c0b3eedc467dc76481e01a506422bc1f2d977a98160923d3a75300934132e2184b80ba5d93b93fa5fac96db9eb4e43057bed1654203c2f3f2baf095fd335e970772e52e69418d363974d82829674ba0a3c064fa407695fcf82f1e691b6297df41d5312b8e67adbf4b2404e9b66e747cd3aa25abb9243111ee1f82fe560dbb4bbce29d9689f5f6da7e59f96dc046a7f7d85633b7210e684a767bfadc5ccd200f5649d0985229296971d5acad8fffdc2c1afe5b8627a8437e16f754dcda395d1f49ab7189988e3bd9fd26618659a50ac43b1bae60fc304e0c02ae1868cf7834bdaee9a5c7fd0cc6096eea06d17e85ec997dab35352eb77af98236451ca72018a5aab42ae11b02fe99ed0bab03222c82022e1bc0b2b0267f7572e3f8c4f6038e82642b023feafb046d7fd3c116be8fd7da587881c0ffc5ee8796613ddf4f82df91398587a629961ffd65da28963ed2eb25fe33962bb4b86b97849f434d415a21b473e6f0c9257ece9bd99ccc9cbc2c04da63a093a1cd6840617407ee5ad5a84dd4296d09ed2c52ac376e4de4303a4e3bc4aed34aa1aab836386f7a6658c3494b9f2dced9d9a96186b89c889d20a985266bb8aeed13de92a03e903cf33d54597003e49fb427172f988ce4aefff334f84f213eb76a2ca398b8c1135fa2d70f74f5e52a695f9d974c3dd69f8c473f5094dad7fc92e092cb212374182639e71cf99ad2fd4c9b97dacfe3e367ac6c5438de6169c7cd4dec5551bfb1e06be18cfa45b146b08bd3f47a6f105e54496f5301cc358aebb03d6ea5f7919a293cc41fa6c4305a75379eeee9080c2b402cfdeded5802e1c7d0e3dae484279350e1fadb6206e12b8c2be0041666ccfa3a927bc0267371cc849cacefc73b5ad89295708113ec15cf83efc0e76ee14d252ce68b2072b25b8814c2533c9b387e344dbaa3aed98fa6e886061ba3afaa42c566ea84e61d7ee0a9e1c3dc5eb74a5d818ac0356675715d48b9492ea2f7f18be5317227d7e0bd8163eb2cd7cf018379712ba3e23d47afb61c270c7c4cd25321da3669df270526dcff1a489fe1db9f313f8abf0e3dec5e7ebf5b01693499b011fa95eee93e3b471506597d4f4ff37e0d2bc9f1dcfe9b259baacc350f4d6ed4bf7b891f6d5500441bb3aa3a9fe7c8ba49faece7be1489c463664797ce8e279a4464162c22706888345828fe810774e4f6b38885810a1146e84e845bdac08a3eb5f35fb9916c73b0b1ef4e3e4f4948d3272169977558048fd795f11c6519b8b63e2d05d354d24fed29f7be3fe302cda5e24c7a52ea7d27b4f7988375d48b66d4dd0fa5da3efc27b562ac95d895ce51ffa7715566af1cd69f7336572ba4a7c5280a15f3373635aae65f5201b6b676c86dc124d85f164dc759da2d5fa4efbbbc5dd1c4f91413854a15876e3f748d2715f98068581421b25f8ae29ad78c69c4416895bdca8c46e03aca97be88e2ae480449c2640df963708162b07b6200297c07c29f051de67d817d3988db1a879ac6167ddadc78b4e61b831095e4e309a7082784d6afff3ea16ae3f35cfd7ff1288067ebfcb284b4f07c61e6feb52750c79a069a27398f4759838e6117290eb37fdce596cce00814bdf6fbdcce3af8466de3fb9da66b9d2cf9e09bc2983c0071f28ce3c67513f8ce561ac395ae40a1d7740c6545c667f94ab2301b361dd6925445b4c558d02a2b7503d6b185a5026001f7ea6fcde53a88e6f9be701b5280b5fa57a98abbc6578cbbbbfe9183ffa71d3de546698ff0a3dd8c85e19de7ec210443d5e84c0f774fb699c25ee8c20210c51c28f001037289f6d27f312f5f45fea8006b110f44c100fed60034a299e4b9b35f216d905418041a35b26140e196fd72a06c77f61cfce704164598b54f27b9959723aba4b8b2205a086141877b223f1cdbaf25f172565ff9b7cf077cad9163b10a1b68809ffa3fde074fe796546bdd39fd8138c5c8ebb503d69595cd968995113450f87beac4c6fe2b66251029a43adc74ccb5d5fe21993315e3434ed13f2d8e81ed7dd60e76fe52f347feb704f036470c720c28b965fc656808c2393c0b6a1b517977d54d17dadf34befb4fa25ea6c7cc0a12a4cc00aae7a174b443e483ea686f414049286f627a3aca5589e935fee235c3518f8f0c7c20d2319e8667dabdac051178d4a4cbfe77ae67cd2ab45aee7dd200ea90920efd30717f8bc367b01ffaa0a6bd3c0d8b8bf8550dd81ecd80ab3d1f4a248d2a527386223317471fca78cf6b619ce7e36f052882ec1dcd68b212727de8dbf39bc9c3ed0226a910bbc6ffe5097b28a229220a6382841d653707fbe69e03f6bbf280dc353d887b88a093c403629fbebf695022c720887bfa65772233ba09f782c8942a90cb1dfbd635c59390297111e4e646334a669c5e573f2d1ea120eceadc5da012b584acd9237927a702ea2f97d172d4f8fd0f900e6a1874800bed1ddfd771d644e99ee54c58c5e32b500b8787e6fde59eca28b8c114d14f834c74a1f8546fc3d3bc745ab9b423b369353d0b73a2b9c9c1ba3839b3b91a557fa7173fd8ee029698c59f0de3bfdd4fe0f70714aad4d743b6657f1ef7fe7f1e794d2b33d068a89a04d8051c858f90b14f647c5b1214e25ee8b68ebc1ca8edb6e386dd18ce9b45fae10e1111317114aebf4051acc57b53fb8812c68a8d00deb63f130f05896aaa38bbcf6f563aae9004a3eacf21874f74a4120aee8380ad2e459c28a3ada04ca520391d832e2d83e5de943b110679f3a096407dd3de0ddf802b0d98d3c1d82ddfbff4e7f3dfaf23a888e3b917ec717028395ce7372a8f05382201ba57d1fdc37126be791e2f22feb0777d4663a940561a2c457d575fa57cd5596c99abb3825d187dcc7e42cce4e7f2f644b6636cefb479f7f9012b7f0622ce5fc033c7fe846f076808a11918afb3e4355d223abb820c741f03375303b94613a16f926beb660ff832f46db3677982ac8967af136b65a8f5dad46a506485e3cf24ba69791961704161eed3413c376975940a190d2152e5b7f3cc7660bd0667adb8063a90d72da36ea8017647547bf07ae857f5b36d55e23656493ce74b4059a409a71b054a8bed97acc3966334cac1f98706240204f14b433e3d261a7b1d08a6d73309bc9fae4a3451991395ba6e565816f8ce4e752c7072d440a41fe121295398de1760865b178e10515e3cc3608139eb711df2fc9543a2287791342a4ee66ce97d4967d1b200f549fdb3a43479195541896cb4bf5aee709e8116c93d40eb0ff3b53519bdd9818bdecf69e7ce0013a4115715ea341b746a4c0260d3faedca6b0b89a3a55c7080054764d4e7147c5193e900b7400735e040c24e0f2023266b9f33d4d9d4a037b742a07ed223ff4640d512125c2484caf71e5439097ec2555377a3780e788f266d9058c33919017843aec43710e98f204fceafa42f6c1d528df1e2ce2084958060c6f078a4db164b9a4eb7c3e2ca2bb35ffdf49b0df7740f21f0c80e5ec59367c2d524524d09f32529eb4d3af8dc0f08e65b2277c3f2fabe23f3d347d8e3598a110d1c66860b2147e1e851a07270c4b052460c32cf4a3381f13e79b39ffe91962da126af94c9bff80196f0fef0a525eb4ec9f2b63b76bc2ebd3df1e4a3467fc88c12cdb62a24ff01b80eed8303564a02463c0989b52f669f70c37045823d470b8602fad1a40681e7b23effc6241df80b61be2369bf1580f260a414b5c87343b26e8c16fd510187904bf8fad3f5b1bc2ce905416e0aee0f64988f6269250882cf9dc832ef83b4cd21e035f7ed89c11d351c9a2971f5517c515e88eefa5aa76d65b90c5752550bf9bdfd0e3ba634129c3c5af487f11fcd480d82db932caf0fe43defa070a5a4a099ee2ee033054002cf5a4cfa7c97ee8eb9afddfc0dcbefe3a8f56a9ca3027669060524e79a6ba13c3eedc87cfb051346b8146fda85329ff6765a983fe848ddeae3048aa8911f322580e5a7dc36fec224d47f15a324e43fd4a091c691c28f79828c20461c14040ad48a9059305816a503f2460d49daa6f7c11696a91b2ace1fdec5ca0e4acd0c517debf1827a4a560c79d233ee01188823eb83f6e31fbf2120e805054e012fb5b9acd453c1ec3e0a9eb42c2fd3a71e37b3d6882464efbdb7dc524a99520a8b082f0924096ce3f2fc31b04de9b7ff0e70f90bc03f7adcd45c8699a91835a697edb1593aed47abe99f085a208c03472317d2f3921b3f15395a4d0f84505115284d8458b2fabc6b6a22c4922ba4be4b57eada51f1539ef76f32d5486986d5ee5372499fe3ee84d25a4da67fcf4947619af8a4e824eb2d7f01763cc4ee6b14dcf859eb8b17b232277cd1aca2254a04ab387b6444a21b185525ba0437c227c2aa91c58151d3464ebb1fb7286732a83097871899263e864512f5e3160fdd4d24953f3b69647b0bb0ca83a898c528dcf848fa870f3407c6f1c18403e3c88f5f01b6a11fff48ffd070ae8f6f3da83a0263e81f9aa5ed237299fdb88b25da48025e82bdf8f448fc4863afe0466ec59f338051a7d5712fc608551bd3f931c79d71fef5eccd39d342340c596760589504a2f8474ffb4892823dda477c2c7ef4e6523c299aeaab3577592d05553d3c444444695c807dc48f11034c13ffe32624619a780315d5488f7bf157c840cd3ec5d33f7ada477c9389bbe809e34699e44d5a4e44a41425da673dd9fb50b9381ecdcacfdeb9202de9921d4c7630e91d4baabfe60e37e8313a6c814629c76fe6523691e88d3e3f66dac7052ea55fdac1a4b27b2ef6f3b9f4b5b8757d7dc7924a5feba6ef14c228e3c31bede773c568dd7a2f97872e9699a664bf24977eff88c1ab24fbd5113733837b300693bbf7fd70778037da1c6d54fe90cc5c223272965984069fe5535aab49723ef25316f56b2b577e3de54a2b526c2f91d85bfaeda5cbcbef2aa5ce887bf2b7aea7bb0148922c27b9674e015c6c270de49efc1b3ba8d98fbe81b6e81e67d93dadc76db8bff131ff5118d5cb5fcc46476d2fb76deb71373bbfeb46b40d712eb9d0d8f60ff9b1c42a0a51f1a9cdbb17fbfd42ec42edc267c906e055fff0cbb4bb18e5d1f81ee338d3f4e7a1d806e2a061fe75d94fba8feb2fdb3ea4c52105a5683cc331fe57af9cec45469960a49561e662988d8e9a636818e39c6aa8cf3d03483ffafed6ba5652259d6a7079ee8bc0fce874aac1e5b9e781f9d1f3fdb970dbece95443e9b9e789f9d1dbc02b2641949efb20627ed45c90530da577f922257bdabe74d28ac4d8d3668b909494eabf3c4ffd17eb43457b1f97afaf591e5289b91d262ed6870a8fcb97de06ae2fcf3e80eb5dbef4fe3563b8d8afdf6342e8676fe4eb217e3d3414961196e632073d7a7818bd26f486a2853806b7213dbfce0c6e537a664e7d8c35f22fcf8d9cd47594daf5144a6bcdf8923aee8ede2c7bbea2b615292addec575df8650d5cc76dfae9477b3ad5b03df745467f03b3ff6e341eb7f93ed3b4ec6f80c0cfe93182047e0faeba2114037c1d0dcb201c753f2bee7f5640dc8395079eed39bbd9c02b1db8d91c1f007c5e610e2d1595dda3d67fba64cca5131a1fa065646ea497c43ecbaeebea2e4a4d1ea40db1c3184e5b2adbf90c2fef27949ea394de5c8a7d89d48d3a4dcbb22cf34dcbbe3b2dc3fec22c4b8f269899f9e740154a6b894f4eea4e3e7a9ed1e85fac0fcc8fdee7e549ffb3d26a77f25277727f97fa31d607e6ebfbbc7ce98847edec8e1849a24e08388126a1ee94591e785e1ee679b081573cd8007f87ec6de095cbc3581f9f9f950e1456cd66f918cb2b98b7a71d983f65d6065ec1d8d4cac57ed7e7c08924759dbe5f3ebdd4f1aa76bc2219711b6ae3cf41c85e45738a452a85d16b4af786c20a2b806c5a86d16b426f247c8c1bcbc8fc78771037373032333d6a6a328c5e53baf715db651b8625faa70ca334cba80ccc81af33037c1ef833f0bd0ca3b445c506ee132efccdaf0c5719d79ff20cd72c62422b92a71d86fea477f9d38ecb9f6ce855e94f455625fb3fab51fd6a3fd2e8e75e2fb3a4d27f7e8c310c7b86b0ca0863f04415517c981bcb9847be6919f642ae2d5bb6b461c31f39055c9ba9d248230e3448c37d1b3532a1c243df1d601bac2bf935eea8fd66bebfac0bed3c11f981757ba0173e7f462e7cc242725e14cb8000c9b0ebc7bdc1000244757343afd93df03c39af99197a4d197fdc3b8ad643d492c633d767d9c32c756fe0f82ccb328f8bd13c26bdc6dce8bb23d92fb5731996f83f6ff4fdf57af8a774a07f8fc949cdcda8f99db94392bab687a8eb2b0ba1761bb98ca2d55c9e7fa9a82a7bff1e32c398dd8b3fc81fe87dc557493f320e7c5a03d9356b3e1b172e818728855dfd7ab8d1e7c69883da3f82bf74bbaedf5ca575596cfb23a8d35205f81a1ae754524ba7bb41a51fd4b1419dc1a57db40f7f26ea217aa21d9d19dca6a18ef6e1ef704bce0d4ced238afafdf7a0dec0f3c1ee3bbb8da8c76d3ec67283c9543dc6de41c9ad37c4a836fe31b84d9b4c2c1d45d4af9a58cbb2c630da5996cdcf4e32649f39d76599f6cc651af69d61df18f69de6f33dc1e73bbf7f7e6f9bd6652719605b1ffc9da35b859164c4fe90c48e59ea4efba56e64c991be1b6354fc517c2ec6974c13396b993ac22b47fa909b3b8e2285a8332ea4d18778e10ffe23bd8928d643ac228a262e57a106d1355dae420da1abcd8d8aad52b799736a327e47db9f034f50a532cb94aa3019a6653d1cd146a4116544ac1e5f613a355373a660ed69222d510888a2101951374ac9d0b40c4208bfd4d58e348241240bf58854fffa7e97eeeb9503b9209ac6715cf771cc6d9ab669ad75d3ab75f7f5fb302f0e3ecc8bc3f51a65ce24e3dee6d20b8eefdb2503b45f920b3fd2adc298e6d53db7e95cbfd60da7c5410608c60584fa994c8f6ddd551847f56bf412aa9af6d95fdda7b19643ea6acfdca5659ed1ab65dd977d0ea98b437c987539a4e86557517825a8661442088f5c11218cdf18c42086c53859e8daaea750c5fdf526a822fd75913a18ca6d5e8d4bd858857d9c5807e328f818db4a837a59ca2b2c5169d462a4f3e1351f9e88f80cfca2664f214c72a1fde80ce0d7f06f866118b6759122b9f39b5252f4895009245ae7cba9e5f2155f984194032713b58c101a11bdce06f5bbb9fe566aaabbbb7b8ada2374990bf2566ebc1ed7ad855951112c9229698b8c7c84ddd9a0fa5ba9fe1f17b5cdf7503c0f591f640955a1d5242474bf2b0b64614ea06ab2202a42b9110b9a72b5645e7c980b6efcefcab2a36981a80883fa4d4dcb8d3f599355194ed68dbf234ac52edfc089d01d627141f108dd3ca8a87ff9d2c0f7cfcb57d608e2c6e7314585cf438a28acd13dd078e693555a1746eea018d48f85fa892a04b1b4206c412bb55fc0838aca97af44410dac9abcd48dac0285a75c58c19310b0d0a47a603e6149994058e124f017ac2c454d60c284279a587914ae7f8de222faa9824514222d2d289cb8c2440635c0019117b3ce14c040e3410aaa002209fa53646967a235c512ba5e6e4d31c6c52eb7a638632ee1964401cae2074638e2889567e00b368a5a555650831c1011456bb68c52469413aabcdc12a2410b51849c702688105b422a9861e880460f5cc084222ba2285d6e0941112a020241ce979fb4d5e553f9358b269c70a5fc198f16492a09130d88e81a0c31c485156674b9e58328acc009723425891478a1c5d009b24c2088b450e2074b10f14bb2c052ad27435c78b9f5a404330373085f620330890c942e7c53ca035888f0f324063e40620c278e085263b25670834b0bf9de9c5860190209126230c61a5b8c20011663e0e00acb77b0022e8eb82e27818b9607d0b8dae5561223b8dfa7a4179ab713ef543a33ec2469263ced7ce3369f0a08dc72bf4dc53852de7a250a625c1cb77a97ddee76e8eb4c033f36a1ea406666da1d8bb40bcb5ef38dcab95ddedc15aa5cb4bf6ee6d2c138ea9ad736394d9bdc77525cdea53341d4f59adc3431aa76dd8cb445bddc26fbeb395bddbbae87a155e15ff1da6a37ca344d7bcda52bfda8ab245bca3ea3ddd7d787783f1dae666d0ff1cacf58e8d22b73c9a28114d757dcc69d57d362db42125d8fb7ba0d13d10008d7b3d0d80b26975b5d10e072ab0b2b3709f44117f785cb2d1f44b9def6d98cc63b2e8344bd5e931886595ae5c605e1614acba8f32737445eec35312a256dc184228e0b82618df110ef11243dbc9ef934db360c8b379bd0b351f6b48cfad55c49ad8431044693fbe3728b4807d7c3b2e36661e53211164358586935717d5c6ef580755b5f64b9dcd222a8a585932bc513222b54b4b0b4a6bc6cda18350ca1fbc2e556184eee4d182c30b4c46ced3736a216308a89a2a0445554a22b626eefb8deed002304444caec96db8d583347a6006902cba3352ccffa2890b80cbad2f987891c665e172cb0b2d2ebb4d0a5b771fc52e04eec428655a7344cd6e6efa0271ef86c76fb0ed65b820482ec65650d3e5bacb7a7c3b172b3d89e3b867ae318c7bf7b8cff127759fcc2565309051b1efdf3ccfbd1e34602f93511257847d003e54faa998d83d17b82018666a1c9c69078b5aff8b97f437489f034725faa4cced4d7f4f8f7b2cc3dd998c2646cd300c4686de7284edb84d66638744cd7ec4da9e3ef6c17041280b580f0cc7eef180e168c85e875b3d381a6e68b820a4ef3b391ab2b7372f7041483fbb9fcb6e43b296723464efbd4cfb7976db60ed788897c3be2dcf65a6c1be2fb533f0509da7dcc51e062c286b815ddc90ecdb520cc37e623c37dc10eceed434e99e59f36c2b526e3c2da37e3757cec76c534a7fa326f784f808a1769895916f4fa0d27bfd8672f98bcb2d2eaab804b8182764be96795e4d0dd6a3e6eb713d0ec37e731b18c69118751bd2f76f15a62717a473903ad2b7979e392f35fd18a71f439b922aa97e8d89e962ca9db9dce24204976296ed377aca29a0ca50a737eb4edcf315261405d1ec4906ece963f6c4bd3d8d9eef0e90f41a471fa3db69f4a3cf3a24a30eb39799863ed67d29ecfb3199d49d76c6bd1bdde584c56245b1cababe64308acda069d42dd63031f9268ce2abc3c51346f1fd523a5c848069f83601aed61aa715f5b071d7a02f5fab8fd9cfbb18d0165d5c9acbad212d9752a1e532110d9e98d6b032a58563ebcea75926c72c05d2217194fcee8eb8279f0764c02b81189151b8f275a070bfed7e3c04733f1ef28e6ef176908cfe00714fbee7d5d4f4a87949d57817e769cdcdefb6c0b443e2cdecc634da0f89b7ed28fbfeaf9b1bb245f7346d76231b8d44b20f8485961c0dfdec5e4c74d3cc8ccc0ccccf984c2d34c60d696cbbb98921062031b8e4c47013b99b1e82ddccc29045fd642ec66dabca588692b80db786547025bf9becf4e830ce842ac85e3ee16adaa6a3c3c3f333f04851fb4bcfdc901dcbe39eff484ec7bdc805e9b1359765432c3704dee6283b8e4c4c83bd10ee694cf7c120e9993d86eddcfee6b9d9f76b5927432404e532d11466dc7a99688a1f5cc62244e6621b0c523037a4da9feb0f611827db8128f9dd3b5095044ec93458866118cfed1bae7342faa74c872475373bd37ddb4bf7f5f880dcbc97bac9d1d951f18ab254cc758ee55e8d769ecb9739a2cadcdeb62d320efb371df9b8a75ddb75514a63865858a8c609d13ef3ba947bf27574a0b6b4a9aede6064324ee9fd4d2c73b7d7816930f5291629a5305968a42f94d2178a75497cba6b56a963a6d9dc2ba27e48646ea5dab6e1c802d4dcce713a9c2c09e2b849c905e976db4cdc93929503ca57596e531b4afb111d90b88d3b71c20549c283ea0f01b7d97a6e30e2dbb68dbe63b8197e6ee7b8cde8e5c7e03693dbb01386b59452a68a6c6580e8ca211fb7e116104eae7c20a8dcaf9bf8fac9958fb5c7dbf2c1930bc3e5561845578b1c91fad4a9b3cbb847b226a6c9b2ecb70e89877141bacb76ae7fc605f1a75dbc3cd63b24a9cb29ba318e0fc72a258c922fdb7e321c1723ff8b49e29efcce89ea2f547207cc40cb1642b707781b0890107045a5b2986480b52a314e015a6700310d544df93e3ff0184e3061ade2fbfc302d15f83e3fec006a22c54a5a2afe3f9c90e0240aab68a9f4ff00bba7bbbbbb9bbb25d3305b33d0284263e85ebe8246153097afa041e52a216a30714a64326e702ff6304dfc1e8269e23ccd06729b18372b56b86a004f3aca57a144acb287b8f163931bb5dc6fbb3d04e3cc797ba02ad54050c580f9f282ed610c685517d1a8f8b451f1dbfbacd5a1c3e57e0de4d240d9fd98a853b8299864ab6a1c151f4866858b8a1df5e9b86dc3eed9fbd11437451d5a82151d2c97c8029b3aba74a3971df71adc5c84b809aabc99fe3143fb881fdd541fa6bc51c9ce10493656fbf9e5712fba1ced304d7c6e8afaf2a4d7a24296444a4d6a924f44462f474f6464a52881f997973d2fef43455a986abfd14bfb1d692ec8e8e50b67bf929c82c0ca932f6af6f1055a7c0d08e3909e5f875f98e8729c139e7bf0fb53504260c6174330e2076aace07f12f5a331a298c62f147d9900d195f642dcaca85ccfa50845bdfea3345c598681a88078afeb3dcb32bfae8797e501cbb21f825c9d0f7e31c62c8c9b7b1d8ca3b668cd6235fb88b3df79c8fc877b79f7d34b86a88078331ffc660c337b2f8e645cc805d9a1b708f99f7b7549ee9675356754aa79ffdcee7a80dde44b72e35f5434fefe1d30a8dcddcfedab76221dff41a02a56b447f85b33619c7e93cc9bd6e034cc30fda076c15ad498f821c0aa9fe123ee39048c98a0f6efc06afc68e0be76b5fbe8b23a308d3c03890b8d647152effc9ca2a09f73e67c966b8822212834212673ce391909ac1b4ca9c22ac210583810ac882d253cb04407a49452b2e042621221a594920821823099fc1586c604a65d6e2da16289152d084153de4c1ce932839bab73d30e4302872e5fc07ae372134b5b7ad069b55a2d1aa79cf26504f5e316141d776fb54c5e8eec3c881a39a1b5d3cbe436476f416186f0d84eafe8b4af1ea259d0dec1851f04a1402743bd03cd6196805e58e1f5c743bd1399a81f0f0545c9d181aaeb31acbbb9baa11eeaa1dee954efd01d541fdf990981cc936ec26468c883a8388b70b0019310a310810842601d6c00160d018628832068af92f04fd22ff767ff588beb115a71dd9db280b852807e35ad8ca3dcb4c5c4ee43d0428b085fe8dbbf75ed4c4878c1002ffc0a9a8fb84b957697339c5e466e1eb033840bffc3b94270e749c5d2156239c2de11a8a233720eaa2a1ed94280050b96200e64a1290e409287c1e9bb3c2149bbcb091c1a01bd2f6aa47fb4b310ee13d158a224d1f2b11653d5125f9878423e8d523fd6f24510be0c909a9afbb1961b8ce4403a618cd02e1731b61e333230148608cce5089cc9d832f68b0e3e2ebaf0a111f814c6ce2463cbd84d90b15fa8162ddc6be92088824f9b35a596244ed4efdf29a5f0af7f9d2450e55df65dac549ac4b3e2a5303d519bd0a2458b162d579a802549171742f8b109beac8d10cd43a935fd27a07f6054a856415a523fd306eaaa53b7673810b921f4d239a590decd795d7f79b2ebe109cd34a99fc908f5335d77db6148d4bf9f77eb90c4620713a66a6194f34a82d218e5bc28966914ab584629866159a66d1bc78d46a49ac154227db58d1bf568b4916238eeb71189546ba9e4e2f2f2020313c3059111a2a670828a0387c9044d2693a9965c60626e4478c36fdce81ba5928bcbcb0b0c4ccc8d1b26538e6b4aea5293ea1b3f986e4c381c070c4c4ccc8d1b3870984c3972e8d0b163c78d1c384c394c39749cfa9443c74966470a9d5d6106002cb4e0a15ce0d1a3c7d643cbb01e3d7a6c3aea0623733ac9ec484185ffaeb3768515666600c0020b2db4e07928940b2ef020f1e0c163c483070f1e3c78c8ec4861c78e1454f8ef3a0bbdad9d2315989dd9f9bfeb989979054e86a8020b2d78330480112c1851ddb6d082e7a1502ef0e841e303a3970f1f53fa88d07db40f1f3e5868c1f35028175c7081078f1eb2478f165af03c940b3c7ad0a0e49cd2615c30419927d5ad0b1c91be3d54b0525fa83406a18931c2b8bd20534475eb23150001c0d030d0d0d0f464a1a57604d0c44e53ea2f4e48b576f0f3217c1d05b043085d4c103d14fbb8ac89c7b46cda0183eaf282faf1d0ced0d0d05016cda1472882ee7403bc4cd47ccf347acdb75150cc8d989f4153b02a49146c23ffc6cbcf1903f3da283ee98b8c1e3e09be125237e1dec9dfad40d4dcf120889a2e7467cfefc4a8cdf1475f04fe8b55427af823ab840a0fc9d257c2308524ea07d52fbd074155a985588539d1f532ae1a9182b05041198c93cd3bdfb340d5280860f0c0abf028a8b7c0b55c9aa983e3a70e5425390255386c433171769b1ed3311c754d0451f349dd7cd9589ce5ded472a73371d4f4a02677ce6c0605050505ddb933fa2015044d79a9228a4934499fe32f5d5771b1429a329af34b9dd441fd3cc8a3b8cd97bae236e1361f5fa9122528ca6a742364481097c6c3863e83e80d44314ae97f24034c21dcdda1b7684d027ff83b3d146015cc04d826fe02d440b1d70fb91a78355f8b3fa80b80377e0ff6a633b88ce8232957bcaccfcfea212a7632399dcc41a5514606be3ff48f1f87a40fe66b0f5f4a7dcd1d0c5631f7847f869771e79c139226e9739c3422b19063c1e17090a036fc18db4ec76243afea9b60ec72523b5055faf93f02aa71554f9973d6e0ab6a5b0b44cdce594f1c08aabcca8c325f9b92cd06a276e55560155877ea8477be5b619c22a88a6fe241c5825671a7c6927d24a53404898afcacba055156b8379f347fd4cd975bd4cfabdc6e5d2b6ef3e1b8f3e7d756dcf9f3bd8a3fb7c324cec7c13393bad684c65544612da6ba4d216610f793b935f08a096ac70b2adff95feac6eb239f986f7c24442e50a2b8aa003db46125b2da38c2fdda89e6644b116df3c16c3d4666701b6825063789fbc9780aaa4ca6f89aa9b6a03244c123d0623fffea4e6e79307bf213cff51462d863cf2b2a4fa8ee04edce1188e215c686ecc4a81db12098213333d727b5bb9b075a4e0c53d2bf28d54107a8468d393ab80d5f2918041c85d99c2c4e90a81bbdd839295e161887e03e10830b4c8c1f18218740c500aa720835a057d890c17db97c850d297774f90a1b4a18418b9bec4c321d17449d7115fd7adcf8f165fe8377dac89e64f624c3bb83cf9d94ba0d845235339e4926422168d7f5542c503108e96bbfbd4eab590db400d6d095fa555335fdbbfdbc5a83c6f0bb9b7b98377b0cc3be31cf7e0713f54b5d8ca35c71ef9cf5f961c57d8e675d0f06395035ceea78a0726bda689d00d1d9d318994da5eb73520b600da5628c99fde0cbd3c8fa6ccdd1906d4fe9e8475d6454fc4c067a3f9f9b3d5b0fc69a5e4a0b0002e6e3a108bbcc651513ae818529a7f90f4fcb8fefe3a7d89dda9e6a80ef5f24beb44aac1225fed002271afa29e9a1dd81a8f927cdbb93664f0c900f5fd3ac0f0bfe0ff195a4a43d69f37f569b3d6996071ef9dbfc9fd5cf8acad0cb27fd977a5e916c0e0e2719fae989483ffdb6bc92160d2a27227de9f7a5f644447bfad4e2405fb35709159ef8a45772d2de2a89f674fd4923d9d365315b44c6f7374285f6c045d7536b011f08e143fbc3e8e147ab0344cd6738e1977d0ff05e492ef673aa21f28c3ebeb4cd8a3edba44ada096cdb411035e7d7a021834ef4e5a9066a79e49f78e25fb6ab448e75bf168aa27e9095e33a6a8450b975f97e70680a54f52a0668c40e75997250bfd8795abc15523cb1c216bb16b819cc6cb16301005bec00a095a07e94852d7633a4245ad862b74266a57e3176b6f542282b958b6e527f1b680713ea4763a782f6248a4381414d1cd58437c1638bdd8e2b3b29177d618b9d8c1604510d3482fa511f5bec4edd35907b4fdc6b92da62a7e3ceae9d74fdc45103a0976d2088f214aeb4295cc805811c6f95d413d032cd4308614321681042c834d43d18a78410324fe9ef90f414fecd5950598a00ca08a10cf54233cac0fae95fe1cd1ea39cd7d636878e085c18c39ecc21810bbf3df93206870bbf2b506fec16a31c07cc3108eb978fd3598860ea7672351216da404848a1ad0d40b91f674983d7b8bddd0b060927eef5f17a0ac4bd9c105da6a93a228b4d76a3e988a10bb3d48f7d84509531704be2800563a8e1a40652ca78c14a422c57c600ca957fd9082f74d03ae204373ebd62239ab1e2c65cf9b4827165cb881604910f85145bdbcc98429314dcf8728bfad53bd345577e943b50a144171f8001129240c51cc2054f5c90c78d50dc184d26d642064a6c37625f98da848171c42cc2093542965611683c2122cb101ae04887208a39d064060d40d1c0086628424803538c98818829401b116f6ad305e594725e39c38b39e7dc1202477114da84a3e496275cba90e58c222967248104356bc2fd6a3555982b50d0407d31a668c1779b1391f9e3c49dcf949a482e9f753a5c10051fcb16edf7e180848beecbe700affc972e076c2bba97d5b1a4c2fbc5e81c14a8327dcc8dff2a0e1badd501deecbf1b1c94dea875c441b9f061daa81f5774e18f9ec3c238d9c3e7cc701b9787cf157164b88d6ba5aebe465f7244b08ff2230dd84986f8d8c7c7e1e5a37cb12719220ef24b2f5febad748a5648e9e5cba7f44b5db51f0feea8e3a12f673fbad9af9ab6a2cb5a6f10420cc67252380a72562e8c10890a3f76f386b6606e6ae5b2501ac08c4a9d97e7cb37995e4e8c820f63fc669c1e1a4aa9fe1fe58860d76d756bea72300d7cd9e948d598dca66e9c05f5fbd44d0e8cd2f6d0d9f5cf201bb186eec052fd53eeeeee5f5cf525821604868a6a6aa3eae0bfa30815a3d79411fa476b819fab83ef284265efafd4abc0a1bf01f601ff45d32e3f64557740882ea264546a5ffe6b630cbb54aa948c6114fc43328e0a17c20ba1055282cbead800023f16b2018a0f3fe38244185a2be300c13832e3867037da8c4a85973929d9cbeb7229d910fa57f7f98df2e3d55bb48b034c03bfb92119957a5d08c4ae99465a23eec5ef537c5e65ef2ca86e84280650b2930cf179e2cf3dfd4cc3256a0ee318b98171e2c36f00ff507259f500154ca6528961b43e4c036b9ca480b88d3b61038cbae3dfe3957d270b1620687606b59f4f1e1f5a254a564aa215b2e255bf9351bb655ba8e3a2b2ad1d79a87340c6500ef291c02d5baeb4523cb2582b0821dcb265e55bb6a8608d1ca4c86732ae14fe359aebe118e0459ac96032c84083e4af792785452507ffa692833fbb3d11e9ebfdec3fdd16883aa51b5f23c9e719165c22e5b4532d7d7ada81d60451713eb5a79db9a24fbf57d4e12ba1d683a808df2f7b0351d1e1f717f16739e40eab10c10c6a53aa5258f2990196158b48cb8af6546415fbfbfbe10f90f084751b0a1ad30cd1a8db44d88d80160eb2dc1c97afb0c1ba4360528426975b4320e372d1e5161945b74504a13b4b77be469acf3ebda2fed12dad19a36234da229ee7d8bb5dd2abeca36522c40156d803f52a7b13f6d967ba41035a1d889ad9d78c7105d9a11f29fc48bf5f89126a7b6ac66022fafe45a875ab258916fad7f350eb4385c7bfffb2ed478022d03750901decb52c5a9f5e65dc8e0645a3cfd9688b5809a201f58abe6619a278a0f56122c40156f4817a757db44b7a757d0d1995fef5f1a137478fa31ddabbd5a27fd9d30eed55967daf32eb43c5065e3151424549665b6360581a0b44c167ff22bd62615da06e50e7e5161144440c0115911842689d9999bd2111124a184550462a0b8d67be54b4ff10de80c6348a20d283a296106d04418408c804d41aa24882c0d426178470c6d0d51982e8679ec0c48d975b432cb9dfa7588fb385c6333836f84acbae8ecbb0e6d0f12e36bbbd020f6a578710be91d9f5ecb8c745468ada4a670f59da9caf75bde209ffe32e43adf3558a21b7a062d6870a8ff6d9fb68f2a177d2c8e415e43c2baa7dbfd8d14752b677ae48af36ebf3c34ab3b36b2b3d05a2e0639d110aa9b568d4af592c0a37eb2c6d0438b6ff622ebffc41ff9b5c4b9bbd69cde2308dffe7c275fe991856997ef20fb9b10d86b33d7f896db4cc740056298027c09effd55120870ab00f7f78861ad79f70dbfb180ad75f07721bd75b88eb708b3567d4ecd93d6e48f6dab5c50ede03f00eaeeb34ca3921432e4ec80e8d456e988d8614512087f6e17f791a5a9e70fd75988debef5bb2e06b00ce0895c2fdeca400d115f7b2930254571ceb466b290bea47a9e6970d349ee12e8fa3e27677e20a4854f8adc58f85e4e7b88c3d76c73d2e6af721349ef99ca734b3ec295da59b7094f7138ef215a8807d785b7fbe5c109bebdbe569e116f5f3a12952aef721efc26da277e143dd41f01f541e5a87fee14a149181eebef19477468eb837c56de077fcfe243a40d5cc525d4d5a0a520a1da6aab8d7c409fecf8516f62a767de7f714f7fa79056d80ab695700aa2d5d8ad1ec2b01b48a95c8821b072251e5f54fa42083fab5909523f0fd752000a7e00d3318eef90d91bed31eb9611a2f2280d70057974d419415586ab75a0868470e2a7f771087304608234c615829478e48c1a85f4f99d21e1dbe13582ea0ae7b8eeb5fe93a659c78994bdcd59c91011e3a08104ce3ef4c7383f3fd9b4c371815f5bbbb3bfe8fec2b0dcd538c43baf33dc639ed29cae799ab537c25d7f34b5b43ff7c1e2554a2e5e1bf5e49ffbc94cc1d58d47e36991c06acb5e646a0ea9a454a8c1cb9809309b08a7610377e43a14d8b2660e4889306e2099742f1208a7d84d11c88da99445ad48f8b8cb8cd478f40c06dba280235bfe61bc7385ff64def97fd67d967178bf1bd0dc6a4c5987dcc3629a1d45ed3ec69085fcdd69c51a9f63f37a319ed7a80f7b25d8415282cb8b204145ba4b18a9e8a25d0e0ddfa87774b54e9efb90725848e43fc1901bca07aeec1a4b5a834ae9574410c15d1000000004314000020100a86c421b1602c1e95cbc2de0114000a8ba0447e529849a32008529842c610600c2080803100032033325b05e52e2b6ac05478bf273b1cc876a547901d81ba146452eef7bc0a948c6ed2dea62f4c9784d52eed030910924114fa59e0de1db03f7be46813a14b0483308478a33da0abdd88f57483bd0929767d894aa9d6a74997a1d1efdf20adb8322ff4b9f2db32957ea26f2727881446ec4a0366981f409e52a16cba27c834a97f45c2e8d2266ddfe35961756aafff73427e714d0be498bc34156c2712b34a8c19376272f61ccbb04846d1069abe353cffe41950d37bd97b971f906e73df893077e4af3278a08a15d69543ee8a40d25557e39c1447ae6f27d6fa8623ded381c5db8e2645ed5362123465a0da19a66d735cd0901b33250d21d3a40c601e869e3a9b7e400274800cf624a71aa248b5af2ddda3104e8262d332a7d4534f1d695510b5435dfecd623eec499ca60a19a64b673854e7e8b8351a8c1ecb49f3ec57b9cfcf6218b3142dc652067ee3018ee3f99e4bef8a6bd3149fd698085d9b26191563177429c4204ba735ae485996d66c534f02d8bea5a5f99ebf4df263bed1a7ea3db6ddcb779e5035886f68f9ad01e7e6a411591c11a285e9d386e9b95fe3849b3b131296689b60c7047fd6af67300e35afd4afdc8b1af0cc57d479aaa5bcc3b0495a6ebb1a4dee9fbba915a5e6b9a7b7a83e7ca942115f6a4c7636452c6cce9b2d3121d0873852869c1acea97138132297234ad9f71a7036ed93dce4a3d06876107bdddea8a2497b7a103032e60360b535ed44e2f434a3f286c8db3040a7724415e7855431fd9d2550691537de0b6b9ac00cf6060fe1dd1914837aff900d09e14cbf9b34ce17ad80f44f4cc1c7bfecd97eb4ccf1e734863287b6749e0a597b3217d375eea163f35075453223b0ad0463ef194305c5e3ae9d5d9bfb431a0b34fc277c567413af7ad0516f20f7526b81b41c14f0285746e9244f91818bdf417f1fd299aaa46dce45ec861de8b6ecc22c1f9bb604676a3429910131b10bb7fb15b3b27f806bcdd4dc9918ab7e5c3bcc653d35625686ca8a00dae6407f0e3abf8444079703b0dc69b0aebec2138ed0e46f218f23ed8fe9337ccc1d3174d3f22d25120b373ebfb55aaa7927d9e457a984be67937bd4400b158c16a7582a3285187737220644d1674744542e2491a3f12e3e2c208b0c3e6a31cdfdb8db67d6d421b0db3c3561a3deaa9b3300382a6375739025324c9f99e14007fa8255f8a775a6cd7b7ba1ed1430fd3e025ffae9914960d95dc21732ccbe6af91a7d969d7422103823d92b876a54989366723d29155b1b652a4d0713868417e99da2230a84b62b9ffa95df646bf920c6f5a5a209df264518f62e82fd04b877ec21c699d05a8fedd529a529a45777e211905de71d67dad532308ec29c450f9704cfef7205cc1d5b01fabdb8235f93c6b229c1b0ecd0316a9a37c2b468962deb93a00266bd779b973fb622e9455b014f10e126fde906222f62ed50787f916944f8b3c326ebb16f97c21ef00c3a881b683c196137cd1dd2181a9b61d00cade4d67256ab6c36811520dc8e8f598eac6b96bfa24807d0a526715456ad9dd5392e45d278fa52db44729ca53d27f8c746fdd628e7680b1ac639c0b4479ea1832dddffe9310f7cafcde26b1ce83ac0aba9fefde4f20bdd4a697e5ad76b4658292129e9aa3cf3a3c5e64808cd35d65d1ff1831043dfbf4e30da8f62e853e320e2ebaf6b4074bdadb306c5de1c6450baf472f59d1f579acf9cb60c940737e52f9529d9d54980e634f15b3732c56dc00204014a399d294e26a748e514f939650c25c9e4833f71bd3294c0602053a530d90abefd540f85f5e707211f476e865f51315c05ff6706376ac6b493cfbca1cd613bb8704c1c043003fc100f0b0c98d6ebde89a300ac9ff3cb4d9e179da4e307e3564725bfa5470c94d164049b5828ff385689b94f3f892c0f8a4de70594968634ea62f95b603392e10f934458131cc2829fb71b91d5ab7cc5ba8fdb090bcd6462d6d6b7112c209022d00c703b61ca3f70769d25dd7ec93c91aa1a3aa08b1fc2618dcf4bfcc7614dd6968549b6da939444e589d17260dca0d9defb984bd573771752bbdcbdeb245fa129d25aabf4e755a6d2ffe4a6070ead45120df5eb2ecee3b1116a37fd61d0bde355392efaed4f917cc8029f80aca4a44bab6f04824e7de31648a6a7f1bf33665d0fc8547a8d0cd6d5ce61e82974da717122f615cef89cda9cd04100a3f4fa2fc88e870b2d10d7a4ae535e15adaf48b6941a754789547fa6a793c16fcf49acc54866c396dd637c756f06d458caaf97b08192b89a957564ace6fff982c7a17a2e31c0e4393eaa2db87b007be308595948fcc286d4990731ef073d9cb7a3785dc08ee79f883b352a2f98d000978449cf4f78fd59966e09315f00af3fc7f9b408bbfd74fc03ae091c8e1ac83859f9efa1d1f78f1e10db9accba489de6a94231165a627439d5e81455eb98cfd404f86fe605e103c650133029087cbd2aef653dce4d82f41264787f5bc94d02006231e10dfb31802e9d52fb3d96277c0add8219480b9ec5f6b7a21d674f51b46d88d0354a802d758d6d430bdc4d9050da6b49b7f4b30ac0b552c13985651d3339aa0c309281050b4ac8cfea394236cc0da609e7e904b2159195e69959fe560b265d7682d212ed3065409136028c1381a0a6296e0b1c7c812f55d46b07b0fea6a3c346c3c451c03b24b260f8fef63aa97325c0246fd5ef1209533ef63d32cfcb5606d063cbed33632929786041d91eb23c1b6ce4f8538f013c0cd045ac3a21e793ff965ec171bd0a0537e42b9642b34c221238dac2a9bb72073ef45cf5f82a757abd14608ea9922b491ad78ba3bb9fc7405c6077e5c40193d65d9d5ff7e750ee19d2e361655c4e5dcdc4e5f09357e400891556e5ecb61c11823acb329a7ae7e864e5c6c8c23d75f74b9b5ab47844fd31d2aa0307b2dbee95a1d4c53cd2df7de0159c3283ed866c9232018ee686577dd0adadac3724742074a9a5f37a41fab171400a989cfd0c878270414f62927f78d20875e2028ce5acd0a66db899a666ba5aa361de96b9da3f26c5baa4cecb276a4e5b79978f005b3c25b44f3cb2edaca9b53fb08fc9e1084eab2d037ceca42956fec090a18a154383bed00d6a7d03ccde11317107e09c2351e99af5eea103af304365ec0f94b65a30f7d228c5bf72a36afd4c24c1efc99419f3a0c0fe5db33dd2358f60f78a87c52402324e1dac9722d94b5dc62f7543d5a09e03dc74cb3ddabe0228c297a720f54a740a663202a68d0e04d1367602598a391c92ff047c8d34f4446f95dc3bb60e0e5b86a49ce615ff5df72bb576a04f11d13b706aac6f23f4c81e540d31e5c0cbed861ed42e1b2a948a2111fe46a8535d1f168f9de235ca0c1807d8cc2dd870b0705520a0fc511a2fe5d442972e5d88a1ff98e7965ac31ca22d3ad1ab59b99b12703389017d6c1ccfe2df1abfa3da2c94e9e106b9bd9b64d112e9a703b389c8b3c9170ffd7ba022d5255ba58b040b37b066a79a934e97b8c14e99cc02c64d5de8051d715edc14114f4821039c4a7103750fab7d994471a32b9934018ed0c73b1637cbdbfa5ac8276e26179f5a8826018534ef1b93aaf04b00ea485c9d93accbeb24b6854fa6703077bfafdc655c67cc7565c94a39ce94922c5d64e5ba933bbdc1727df3818fda7d1cca32445f04abcf1be64a10f3d70a47026c02201fa35cec8c5692b88ea2ebcb178a51568d406e51b3a418c592a246fad460028ac0519be451405a592bdd065125d37818f459c1679adefb20963759cda88b6f52afdc628c9f1bdda3471d5b02344d492da4a48a83befa10ef1b8944782701b3c16360662ebbdaa6564130847ac848941251c5b41301c42a43d12e0c6f3defb328aaf8287fc051846758c866c5420f50325ce3a81b8c038780f6f81f11b83250b1ed750f0d2732f332abab1f854f780c34ec4af3db42b048ad3377828785e680d43e4da611d579e97de4b8b2c7c7f8e4caefea89e321b5fe868c617e68dc3ad178bacdac9c04a71a9f4f6e0005d1755752d04bb84a239b5ff2cd50865596899ca1cf3e5fe2238ad0d87e60f9316e150c8d873b08f7a08cc86576b2c79d5acc09b8adb4009c6528a54041815ad12a0042d1a7f5e3dda474554576152339e9ad1faf866494b9dadb37ced17c7c4d0ed7c8ada71d3202246697637015ce7c71d3bd6f1325abf119eaf2fef79e2c15c9fa7325a1a638fbd5028136684fc7e76092aa31c3f3550255fc22c9f1c89817236b743bfb573262098a462b22a4596de23e096f79956d744e9026aecdd18fe05af37ca753c6136534ab3de739f19054798923a4bedc1984f5e92e18a090ade04e7c8e8d41171e32d38e41514000bf47d3b57a52a07405eda8a9ae0bb5f2f329467fb89c10164176e2df92ac84c578c384f9bed282e0b07e3e5a46505e2d0f8e6ef0afda3d054e7e86908b1be913253285f1115b4e9931aa0f7c11823936d2cac2d05857e0b4bc0f558f2523a93f02dca963fb21a3eac080c54cda404946b72f727cc8fc6990d624b86f2d92ebc50d73eff95e6f3d6b9774a943e9c42f027669b6198a80fac4bcbb12b6df2fa333fa408dcbaef4016c3860b18274903728e23079b04d026968e5a3a07282190b052f0fcfc130e0d433a8eb485c318bf20e6d88ab6205521991bbe3adb22fe3c67eb88676c5fad8b9b3eb4a4fd405bdeade12df9fe364edc2114449d2620257ae4c46d534e2a41e5d09707e814995c550c7038d47c7249db13c408c308f782bf85f55d97f897e37a61e813f28e73824720d7517e9a17cd5320f8edb31ed5980ce787d3bc4c490b1067caf6c20448176731f37f323cc8a1457c04f7f26043a3f9d1b8d814e3c62b7c454b36d158da504addd16639b109602714fa48cbd1059970e4b7a2d4cd4e07ea37dfdf7373e1a18fc6a9d5b31497adb38cdf641a8837ae31fa397d79a303731f4ead154cc48aca45f0bffcd6d64684dd7dbaf5c7b87b6a04aaf049400d48c1a297bdf2621252653aa9e6638a24d39c06fbcf75ec2f87d72b15614142d422db44cfeeb8a15c73890a5b597664220c451cb0524579543bff334149951337c918623c4bd5a4b4f2327843ce48cfd78e24b716f18e2dea98361256ef990714f5db2f767dc5343ffb88ebe8f7861d07c9bbcdb843b66bc696174c421a27bb6e98b1b114fb515bec98854ac57d9040de57e57130816135731b67295d3923796e16aad075132da0947464dd314b4b2646d4e2ff48089b4fea90f0461d6b4cbfd8100e64523a02773ce0a3fab64e6955b2dc76ed4eb52e7231cb328c714bbe4ffc9caec215593343167eca95d80de326b113b0f1352add7b31d634103b7100469be7264a03e31a9e18a44eb0432510b6ebc53bad80323f531a8108c7accc67da2c573fce609ee4bd78cce03f17c6e24a31f37f2594b5d1ba0d4b573b1a4341635da765363f2840c748850c44c5abe535e0cafafa284cdd83facf9ea77ab4312dcfbe7079430c314c669efc11fa9730d3cafdb5a700bf5c1dc58443b76d2f1ef700f9935a57321f382e44e6b92c3b700ccfa43e6b9c4caafe48b19672062a126e26f3092168983a888cceb61799fdcf46b207075d13fdce31ac66a0905b6bc7fe3626d19a51b461b3a6887be4c55ef37f25a431daaedbdba49a0b14e9bc0ce4314c2dde4a2f7e8db506d6655a851ee2f2c350a78a5046b25dbfc326643802370ece24a4e445d7deb158c71a9bcbb02e6e180c00fb9eb3859c676d9bfb5e6415e93505454adaed082eb2810f364a619b37a69daad3431e0cc185d5fd28294b4e01ceda81d819f527f032771e97324cc8c94387aa6b67617ad4cfacf611eca215866d6355b14a6013cb2dea0c203d685bb19a6ee84517863e21c9c4ffbe2eada1ddad0430cffc8b49a6f118ebc3cf73bf846dca495129d3be32f45be73d2b126c500fd6e4fac65e5f9c7ae21d922970e43fdb2c32d507c99e60b2d67a5efcc1125302bf2dfc6217123bfe65005d9055ca9659c0fe162ac480015502b28d1fa26fa605e6a1c409096c70e0027cd9d214c8d5c82b8ebcb06cc80c05ad7e8e18cef5974e9f07032f889f8656e7a8187146f73911058b549f4d673f378e07be6dcf456db0f6168fd51fb2916d6081703634833e860f601737315c6ba830b14a3212b7e30d3b7d9b7dd7ab340037b2a9a60715e175acd103c6067dce1cb6e65127357410a9f6bc4dab2980c3bb30a911623d193d1be1162243e4447ad47455db0e3eb7e036f1ee08bc825ff2f43deed1791a4c9484525e3f4feeb73cf85a3cab289544c588f452e74beb10ab51bde1d8cdf162cbe246fd0a4958dd75713cccb3ccf6027f71144df0263c46fd652f25a15c81fec0739798a593dcdddd56db573a0aebc1556b45da8f826de5bcbf40b3760f6c8ae86c870c034fd72dc27333da0c62e04b858c1b0bc2e04896a7edb1bc9716f065f681e97724d7b653f8952b3ef9dab0fcdc95709064aa66041c19153ddb10183132ef5700c1068ec7669da674b56f3ee2111fb33e8d02ee44f8fa49353011cb0ecb865e52d0116480b9673d063f9ca93d33cc429259b33dc6ceac1d09e8bd113e80957871b327b9da37c9f1a6eb120b46ff416836669400c587eb62c3762c35744c22494c6c97c0447ca67b6e60c7ce7aa7444046e40849b290bc8b37208c395251a26e843977eb2fdf64a9cff1aad991be60d5a17d1f74248813c77863f37420065dc4886ff338bd69cdb46346e2d5107b014f6ab990e7169760cb9b9aa42a19f6428ec8fc640a8978b1564427dfae96f63602dd2646a14efb2b1bc191d364bb0c8ef68f1301de8e2edd98260a2a98034a2606dc383fb36e208524e19d799c18a913ab05ddce6e89915e29a26df4be867b87379d22af9b0b60d54a7799782ca38a1f390f5da577087def7a70b9b501729ca66a08e7770fa695aa0e0789415d7e6dc901ca6b75d769a52a86bb42d8de711fb3b83c4931f07638bccbc113c2b5de1126a45d0ef455427a22d79c5c22876cec885b88e80e40f6dbe3cb852057e0610bee421d5b02ff0f956a1a027ce331d581190187118a7988e594c16429df372c76704bd81951bcbc5e109fc56336b71d4caf960808092b06d3bf7301b4839954998e16f5924996e79cb5290c81b96a34d6e067f894cadafcbd2e2ca672cf96352e6064ab72cd3c7be6aaf35a9896b76ce81ec1afa927a30c2562bf7982aae4fde3ee893ae1b137d9c01cf19621788ceda0073592ea93b9dbcd4eb9f8697bd6716c6b3a9cb9efe994f1924f8306c34680f71042b0804f4dc0f600721efdea709803520bb08bea44d79e0aae25534d2e58ab3e564ed356b5a7c4bae03fb3e8683e0e507b37f7e9f1008ff0384017ea1ff45f2d46b725c10ac1b457e8c0dbc245d3b630eeaa26e7177c92c0d3b02c7a364e3ff33bb0db938f51de7e8e5933ad8ccb64613246d12899651599b2d35dda96e99a179bb4b15acb1a3508d1f7b556408691c5f169123abd9c66237443d96f9d4d148bf5c199cf283b5db45b0e7183e884c43865c7f3567d2f7e937198ef87a6266697e3daee88a68e2d374eb7b4636acc77b9e7a8f3cdb7a42fb43b1d531b2011d8aab383c5ed3def1059c01245a681efb10486e94570191376bdc20d663188519153dd063dfab66bbd551373c0672a3d9487d029634cabc5876413b4c7785c51e8ae70dc11f050e3b1a64d02a683094124bf966628b8e068390a815f7f79358729a59ce44697a9c11d2a43a5cf1572287d3835614391608cbefedccfcc730b17c489ce03c5d9954f2f7a24a11236a346feb1d3f3250204fa0eed4e8e8f45bc8e8ba9b10aaf9cb8c086137a75589328d3657bcd94055b85de9971b430508f1f824e7b8fd1e969caa6acc22aa23fb2e904044239d1779a0bccc0f6525acb21e760b624ffe5a645388865b7c5db599d6096723f1e0a11a8109a734ee1f21e84058bce70a939426bee69a1026111c802593595c890746b195c18cd42acf43986405f82389520df7eb85605b81c3d5b4516d771f22a6a89824fb651eba0a60b624c77ccd50a1249b6ad692183f25917c96e447cb60122b5b911c774692130347d8deddf74d9281a088b929047ffd07fddc94f6f59c8a249a7d0137f038bc0c7ddb825a6351636ab377a54217c148ea145fc2545f779b4181b8403fa22a92389685c9a8542682534c26bf4a1847962bfddd31fabba703c94619ad48e4c982d5e71643cef7e1259a7109d9e5a7d281a0ebc4347120a4244192985f3a5ca245e0f8ae86700ed946f00a02599e9bdd1d5dd3be72c471b0f3074a15461616ad8f8048508354b727220b2959104d84b80185b159302858c7a139d2b17d0a32c9594f4207ade5b51ca0e30eb67400cc8e85b50a5f28feef9b5be983bb277e40c09fa40520957205cbd7f3e993383b518d2eac89c107aa03299086ab82c94002590122d423526b08d0e6fdae4b4b2c7ed2b83da3428fcd8984030eb5bfa2a093a9203b6954ea25cc151d73c182564d38022c89a43f236e86995f82b923dc5ebdb0402826c969d42fca782b95fe01ed3379a50239446922317e67563af0033351bf28416815746cebc787ba436d66ba23a3d0308a2346ee384b94bb48ba865127928b9d220b48c97efdca93fae75e1433df6f9802bcd50becb760302e69177285054448c61ee5f76b9d570f9066220534a11d86deeb35f7ee18b9d82a82e06721c1dff1fe039cf0faad120edb8aeddaae051777bf11aa57be06d74615d0772cd1783234d8fdadb3743057f6422e6ad6125ed2292834d149219f63e05f7cf258f0c8f5e5148409116ab83d7f731cf02a553f81887b3903eb4fab00aeebeca8cd29366ecb3c91580ea15adb83aa02e02e07184df61ef5f15985e1ac6db9d976616ac85673fb471c2eab814a2d23c4f83549c1ce7c0d8dfbe67789fa2b0b09ddbb01ec673e709059306244e9db32a7cd0f4f9f2cd4658c68a1fdd8e6010e1d026bce66ab451045e18f861c0735c3a60d6f2bb220111e90223f5125166e66282b72db65c4f4f581eaaa7f2b79fa23e0a33bfb27f561346031fb0812a2a1c6155af99e406a80c33baaff903441c69d96f0a3904c56c7e35ea3901fe440d13c6716121fa25d7e49448a88157eba6f650d50e02ad89d0e8dc02ab765488e049a1e701afb1061de9b4390aa12428020f21bd9a0a23f1b73bcd8de32a4d076c4ed6d0edc60c52fbc1cb0c4cc7850f1d10755faed489edc0b925868d0981540afbe5ba5487bc28d6ded347b0d0a0137d4732e5cf996161685018e3c7d2b900330f2667e9a82bbd074b4ce64bb85e6f2f3e28785e6b0e2b99a4785c3bf403eca880bc787965b5079e63f5025e4c4b3cb3ca4d7dd53b4c30c0322b1370ce06fcf188aa477bdda064c09cd63ccca775558d45c9d127542f3b63134b80f82a53b75091b826dd0d446feaf9e97eafbdff7b7eabd33366b5310103c652141d439f577892f5d0eb154eecc3ade4eb8ad9c26eb314d8ea205e12d17077b752e21292bd69a9e3a5ba9b2a786956328eac0d35432dcab5b009d03d35f7a34fe39c42fa9e49d5763a734e8b0d3f9539d1bd0c3288bd6c26c4d6a7c202286ccf43145d921d206c7206234557603067703d32c5257bef912083ccfbaac09bb3846417adb8dd823a047e19bb001633d6591ff6565caea25db2121e10ab7a7b25ce6b28b05b821eb41b5d1ad819fe036fa53e8817df628b4b7681810fa8dd9f2eeb6197ee37f12dabe44791c2063ce607c874e79683fd441243d54144fd2a40475b772154dbb2be2330df1fff6db04ffb82c39c8bce50ccead992c56c6f09dc36197221b7fef7ea2bea65b7206237d32430578188a4ca203f7b1ba94b012d16bcb1485d754912f53749c8d760aecc70fd7f8a35b346a6efb530aca2d1a7bfafc3404170650429b07f09f72140ae078798680edd8071c8995d0cb9796a691907975b6ba8168d7e9973c287397dfa401e8ad47bade0eeab76fa47a102e707c147d960aa870f99f494c4143e571ccbdf32f79cf6134187b3170f5618ce44d5be290d31d9a19738319a00e66d451987c1acb5bf2445fb02b5771193aecdcb086e1281e6c15c8c13c7f8b9bddf936d8ba73c41335b3807f493a4e581e8b7f8b066c6405e0562d0f9737014be10faf2b3f36dd0fac95ff0022083e00425cb96bef9b6477dca946fe1466c367662aac4e83c2708b9ebc283e4de28d92316d62d335ea005fd531c96dc34d10e36af8e8b3d8b6a7912a30377c8ef8d0b7fa914b95ade0855ef8457a313ad35bac31ad48059abda2ffb4895598d1ebc2bf805627f193a4b2bc61f2280fb75aa655b0e427a14a0e79abd5ff2344c24478885eedfffd461216c5627c268089e8b5a16a0e5a41027543e0fa31480c212ec46cda9dd4797edad82c9fbf385825214d9331362824742a45970dfe90b3a21d9ea124ec478f86011689493cfec428f9e78477c42340c207ccfd9088861f9897815185850117b8fa94e9ca4b8684746816948d47485dd40708bba1c218e0da74801c05b190e0412c20eded8216d4871d6a4b869e65a1ae2462f1ff983a71b757c8c42a8dd375130c6a32121d22bda395dceadca9d2bbbf0677efb43fa0ded84bb0f40aba920317f0436b35f96c0d76ac9be17bb87886d4c745cfd416c4e1b10aa370ee30174a760ea796a2d265af60eae5f6a6245bf28a8c3be279d4a1781e7e1893158f133ebf1d0d7460817f465765a0e545c8d61b0d2547cc023e62ad2ee741798cdaa218bd753b6595c6076c8d1f0da89589ec7b07f3671d098a0479b70040fbf3437cbbb81b60433434f2795328a0e15f58aa42a61654e29332cfe10d6f25efc1b5d40c0520b94344d9e463a501b9393e6cec1fef15a55807dc181bd0b75faf9d0324c9c216ff41813fd617de51c93583ec0123982bf6c1749db84152357d2ea545087d48b89a033f4f54a8372d4ab56ce3b1ac450d81f69053ef372d379a1c7a0540ac7a24114711e08f85ead3870bd92d92db746df7cd7ba24bc6ac19eb8e1a08caffdeca19502f4c90337077113f211db1055bc0dde8fbd8d5be02aed29fc06962e91aac9dd3d8858374f40dc06db90f9a9e588e6f6fd90e20b9063e57183cb544e726ec5a94a02839308859f2cc3a609639647c80e81b0ce86376bb8b1085080f705295010f1d3e3912634f6b603d158acba7abf7a9f815e919988e16aa9020e927da69bd4adeea9afc705d5735e81e5adbf47643e88f9629a46b3971299bedbf2e05d1c0ec7d4e7c3219b256500df450d9042c2b2db7fbcaca9fbf282514d673b03514b03c706504d281c1fb9af02419aae94e1dae558341596867ad56a2e0d3a98169499b61e9c095be1ca01b09be153adc014935b2ad29b40ccb45f52c2aa089d9288f5409038acb2094078045267b96bc6596e498ff730a34f6a4fa6e2c3828de795c649a2866029e009382fec8a0d92e90da0cda6c2b84992ff75dc7be6b8e5f39be7c1ad5c4fd4ac5704bde5a2a0ed77edb3cc47779770ff44ac4f7be53e739bd0799a420f46217d1e6a9fcf876111c796708b2a508b37088aaa3975ca087a05ae7c259fcec9d83c3153d1f8f5eea9f17a8d6412950c45c04e91c8738793e8e21832d7a2a2b52755452dd17b53b1520d6868a7119f94b56ec3bf9ec27754e1f8ec30ee56eca4bdc4009a60f05d3618ebec78d266e4da293bbec28b05999fa9cbc8abf8c2a95634d1996c1745d8654e0580d41d48765eef94679790861f22f428872c64180283038dc0c741573e28686907140df7d5e299e6c5b8a2ef05ac1ffd1950ec858bf4780ccca2bdf06b42c20c51df415976a08fdb1dedb0fd7d021e3e1c4b2dcc5d5b5d77a24e671260a4237b29981e0a5c43558a1b56e636f97ff5169966a2ef2282a1ee075b6e00431a936e130e9a820a8d9ae34191240e7102eb753c8263f83afcfe1624b4065d3cdebf60c476c1b852155f6f8fcc3b2bafc64d9382d1cbd11d6e59c36f1272adc52ce743aa3c3d9c96b99be2f071e2704b32291bd74a80c2ca9ea9a26e25475cd658f864678efffe1ff456d9276370dc58315333e6096c1f3ffc30a1c4159a64c8591a4b997c24c3a32ce7c1bdfe84eaec3a07d0b7b6fbb8e374864cb49bfc3ade10d9babc5fafe88279ba5ddb805325d88d7bda0e4f229cf694e2a2187f894df0fe1465bfa997d8e10c66a35ccac58dedf0d3a0010b24e6a2c12867e83edcad13cf7663ce119bb8d48c0c977e3319fce73a6d3fb6e9b10a7fd9893e3d5d236c9cb03b0b0ed3680404075212903fbb664189ab5b9d3c5489349dd64a81dba502dffb2f9ffe2e171b36f98eabe52934f7d58d4a893da075e9cfb61d7f80d53668f764bbdbb2a4b0822df2df6beb583810601d36bc0c180e3683e3cbee52cb4ded0e4587c4e86d9237709c9e2c93c93e133136c4e3188bf25b8665368e489bd87c0e407faf38ed0f8f526d25d073aee60fd01071defb843bc933eaa99d4c1a5bff5a650ec5143ecd050a360f9e75cddb7f711fbba8ffbd2df4e509f0d2614d0ef85602262ee633725de6d102101ef6d8080c0fcbea500ea1fee0f981b53ffd6f77b735b2a5522b212d201f8a7fbd79081ce748a4f95779db0aef77eedc3afe6fba12fe1a6414c2f0ee5133726827bd1dd2b788f759cddf5b215878a2cb3aad2d420a6574352d733d389c02d19788e4bb9958bde5cb86dfcad33c24d195d56728b15614ea4a4553e290606bc8f0103ff3eef8b7dabbf1cdeb0db1273f37de761261bd966393628017534dccc4f3204588bfbc37760dc4a263944fc2b35a787acc4f6c6e912c458a08ce238ca2e104b6f8d7e7d43dc03bf26e3ace8ea7170e18a55256cd694ab3f32a3d838351ec47add1443284f26f0f13656efdeb73ebb211cb726b28c5f1c6519193212b8dbc8042873525d136da06596a3f4cfed931766ee502e6a1968b5ad5fae3e23f41aa4eb59ddbdaf57b75606eac5d2d8cc14adc5be57b75738d49248e2e611e8e5d88034b2aff775df9f7d36f132dc2cd385089ac4e61c331d30d995144211ff08eb37b85f8aba618c6d3102971f07c0dda6646de24e3f92fa323a029611f0b4f9a5ccd6e14c1429e4e10948eeae99f1b40e460a17e29cad00a11d88f1a4fe7055e0131a7b2091cebd4d2cf1e0c08264fe128cfa2f95a2910b37d4ac2c86ea313e45e02bd49226c3ca7c0e8e3573b788deb087f94337b62c134b12a3291de3d35848974f950ec4d77822c8d0fbacfb3f814104fae5c3c46bdf0907617a07deb27bafb0cf0e82f2a103c0daa6897e9e017d988b103842dd3c258b4b5e7a99f77ce3da4985507132212e56558983ea53e23c52ddb4fb149daf24cdee054df3e3f3863e40450f2ff1d892306f934d98e029fa929fbc799010883e7f5968d932bae83613f008043a3abee220b67315e0bb8c6a89941de6d4b90e1664d88cbbf4c9a78eabe9ee1809fcd8b87cd61e8caa50b663e6b308921fe509f29bde6deeabf577cff906883ec57eddca4d29d5bc4ac010ac5ce2a14ece0fb834e5e18b7b26ac6bd475119cf9f0421625071817b146c5a0e751b952fac022192f78050370ea198513055291067c37b37dc3b51042815482f41dd007a5b7c80fff57c941e1d7b1f01f0b196257e536541f3a29a0723e718a19a188aabe6a20d630a466cac365d1f95be9484035d100b48b29e141afa16df78d8e3f0f1c9e534489be19d2ee6389811e86207e601fe5afa1824d730b7665c0ba55958d68f7af6a7eab9ed802cbc32163a2418fef7276d2eed8210729d0829d63b1e5a5222f55dd2b392a8da58b34754f3606cc2b723a5a3ece8f6389baf21c95d91d4743e1666643ccc15969fd5141714b30a9a73d647f7dd4b4b6ea2380b9b2a33cfe202e2ce94f615782dfe4f4a61c0868be12d6debaf37318f32d3c59812542576e32ce58b4aab773f2d24ea282acd03fed7e727bb407b2da611f8c1f59ab4ac8cb515a1cd96a39871e5bf0cd7237665f2b6e7e3a805839e3bbf2aac6808e8b0434eea516d7255366e13754cd3cb6439b6dd03a5d1f62aec269ac1cf670d4bfcbc297d4418e823e8d63f2a256a142a31c327f3e6ee40368f465e07255484f8068a1a46f5401c78a17b8a4c0c39402de3cbd71cb294f91c5a3d578fbed0207a363d35a8bf7fd5ebee5f7f3f5737adcd4c7d390e04a24b87137b36a74dd91ec62d197570a677cb4bf4b626056b51ac28632302761c27f6e8f4814ba7f88ff15fabd97bb8a4f9872cacc1e970f12b118f235aabd43fa8d5a5fcd509abb03d46c26b300ad24488c9291aa43a086e0180947840f0f5775e8c9b4e5af33e4897857875e22c35de80b0d249c0faa929f73ab4541fffa518549d436de8caf339b1f3a6456b35eb199cb6a05c82fa9e96b09a68f930e635e204ee9038e280094a783348feba6158fd8b41e3f8c66ea32e071e066c0b9d048caeccf5be097367484985fc5a843d5b0f001cec072df05745d47957a68a1121b0a7f94ff3d732f865b7789400641ff9a545f2cff2a750601a287c880f6b7276af38c4c7582acf5f41461df3fd5d2295e864e97a1533bd725654f94291737eeab7629ba4750f9118e8b131fd0682a253097fd78fe4267b9662cd7acbeebc82318abb7886688a835b18fc85b4ec91ab0207a4afa13f6ad192c09808fa5ceda217b17b0c8d5e7e20ccc7088ded78678f66300a2a982ea80f0534290694b16ca53e9b8e389480e7c2e2d733dc9e8a2378b7a3157a0bae8233885003ad7ebbd501fc96aa7cfdc08fe688c06dd261dac840704b43542b9e5389422846d5d27d1950c6a40e800f03b07900fd9c6564cd312480bc880d428ba8fe4812475a41c3f301b4af8f19ac43d371687a11cda8fdc87d4868f43c9991e94a9b53c51fd67b82d559c24451933eb22e9dede2e0946d9c61cebf2bfe09d94eee6f6e410c595d2e770fab529b2a2f9607b9b2280e320d7d6b5ca1cd6dcf9850aa300c5714f4dfcb6320332552bb45667b9aaad4118faad946cb3bfa1c3daee34b99756c7eb681d116e418fc697e0eda2d872b2962701caba7942467c097f3bba2068860181e3f935d04292c19816a4d46bb1dbeccede72b1b00474b1de160731dbb3029763efaf1dc8c5c6a2ea43e15118896686563705eb7c364d9d800912f1447dbe0a5ffd5fd92234eeb1e312132d7f1c7cbc80065252137e7f842598d870d800fe2c540285449058c09ed2f1b7f5171e8ad80d18000caf9840ed78eef4e07914efc0b3829fac53f21ce40d17bbd8c2ffc9ace978909d5dc244d55fe03bdc9e1844696b4f4d801ae426b0ce8a86ad3e16ad7fb324039be10bd8162d933b09ae8d9520be283a500dc9353fe8898b70bde56d449fc091389ae4cbe96d2c5ca8aa791f838d40dcce19b56ef6c92d88d79b0c9e7ae87de26d47cb540487b80ec513c7793d904038891068f0cf1698819376fa8b352ce56adbec09293568bdb4e099a58c716ae617b69c78c731a7038166a43fca05c2eaef19caa4c425053f957a47826175372a125220fdd58ab6f0d02b12da8b56926e04ec4a8edfe9fed0321aadbdd501a94019c2bb96fdea3ba2645d1197841b2add2fc5d5c837b3334714ebfdd60ea9b6d021fe7fd468cf58edd8c6ed1a90222c9874f3de69a26b74d322bbc8942abdd1fa622934526a0746b69b2483032bc7a789fb33bc94d826ae63769222b50a0a67be7f804ed819eb556fb35bd260cb2857a50cef32164bc6c414a78a1504bf3bd08059109cf57e9611f55934e1179387266f1ec47477506e326f7dab99261d568f659379fbee0cf38ae81c0cf988e250466cd033a70de8dcfbefa0c58c2ef707448cf1aef0b7be9415b08e1df101fcbe2b49d1ba5e1c22db2983ed9aae7a6502af143a479cad1c3221750fe03ebc24057c111f856b36dcc3b01f127bc283c69a54ea4b423767d06d7a535f4c51d648eaaf655343005c03e4713733f39715467c129436c627b526306527dc8d965421ee4921310441ebcf07dcee60d92a87e0f3c11f1d436681e176f8e81a56f78b20e07608a114653800c8241194c14217bedb270d0a85e61eb993a29576cf77cdaa2c79a4c9b5026e1172d0a30a9c57bd3236a770190846d0be519b60d058300a18481c07cc0d342691179e2ca010aead2ea8dabbb103a2a14b3fc8aea0f9944f75cc2bc48cecbcd0d254f89fd473f2f19ba1c40cd0e2d26a1b6d98fc92e3d585aab68d2b38ff988f7a16c9064f9bc968137ed1c73452c009a228b8ac0d224352ca052617734cd24c610cb1492250854adcf81469a4701f8d0d02efc3e944dff76e86efeedb3d8c8e9124b42fe6c81a946841abc3490341ba4ddebc39dde83466e3918398f393d66f256664bd89cb8b57eb423e425035bcbb8486a8715445c80fcd6c8dbd335465fd4530abb41f6105525ab9d83cfe30324fece74f59123eee3fef4f25fb25a9189124b55256fabe9365ef435e16b48bb78e1b75fa6a0ee1e4c383514446b4d72e95c2e36555a3cad7001210e4fe7a67c36cd58cde12a657b1402ead77dcc32db34c1dd34a3628c9b518e5c2695c437d9d3e60792960a7ed673411feaa3cd07209dde7e6c0156283eef6dda6bb9aad4c57dd05c1792c6b607825ab0b47e4a9e0c267748328477920056abde478941f12b0a8a38fe9bb5f695b84b82e80f24a74f13e96b1a8e0b255022170b2eafe70d3ce53f65c9afc4fb8348b90598a9617b66591634b525657e3e24b08710c06c5969bfc6ce0d24ade764b4c2d857ef0db3e50b5196f1c5f1a827ceb5c7cfbce58ab28d37ab1dc9ef3a0c8ecf252b806c684fd4f75b18279bf812e51e4350b4069c9e2ae22dd8f181cad06258a8c4543d88f35bcb540c95e13347d560a0ab67a5a1c135ccc23c490c7fa3c3e934020ab6b3652fb1c6b5c819c514b582ad5a66c4194ee2a5f4edde7d824fb48e8371ca629667b84219cc30b0fff6759aac367349d83ef960ab6865acb24a6a7cc7eca1e8452012f01dd20d2b467ad84f033c7881c262fbdf4e60c071c112a9962102c8002d3aee0bf2378ca56f129da8bbc9c049330010936b92dc63e9f5a21b998630eb5882e2b8bd01517c0daaea8af9aa2b2e54dfb53ad7852c95c3b32a3a46cfb7cae9fd5340afb0171f63ae53744da451796bc30f3aba41f2bb99bcca0099fad28ab7a813f54677c639b4bc962b5a9b77b24e0852a29e4a0b720a926bae75202b9f2a44d811e7c823b77d8219fab97015e10d8e549aec085aa7927df32b558c02fc4db9c5c7b81f5f3d9a29663c3cdaac81f0f1c167405ef2e8e2abba60a463ddf80d1337c55d133038429ab6217a81908f5b9b9b23517b964a37fe090ef1efec62ea9bf2a14fc7e18ef3165dedd63d3f1bb2c64b925b6bbf51fadd04de5836e74ceb5cd57e2cc8a741b6d6e24145e159d1a852235366816b938492f085d98bedfa8a955d58c7cd73d9ae548a7e5ce6d0c8b7291548280e3263408800231299049872da1e42116a7bfb7afe14097301e2d0926116728eef9db938d209d888921b8aaa12993f6570e728081aeb50bda2c6ffb5fe9e9d98e33bc7df9d952a43e140d6a3b06e76220b769733d9b81bc6c2c7b74e81c33fa1b31e0dede5df22b7c189e1848f704dc7051eb83334187b2112a43bc0628f802356719b0186d1caf84238b2af6cf719e61a27f640b3ecb06d33611f929f6145050c43ef8718cb099ee9ce4ce008bdfaeac68b59ebf36024393e5cf679ed5271f8d53539eb40c316ede5009962324cb1fd7a8beefc1ed507d97174cd7e7cc5a839f133dc90d0fb171a8200c3fb463651dd033dab012b34415ed13a3afcfc25ddaa462d1420c6a86410be35776359938bf3ba99cd195eaaef4709754cd6000c7f0e0ab62f49a92117f2ba9c603ea143f24ddf45069b263db0fdfa2f09697ecdcb2da448f9d53e0c029e068e539b8c2dfaf76d382f9ea8d95304f57c5f0171224e85262052032ea7c2f1a0083bc4822480eb55e2e09b504a5a8bff361e3378c38fe8c20151cc774a8af9558cfcde866f858e6459fd3608b1e13db70ad36cce5298769b27a8bbece2c99dc99f91089a506e36e42d6baa71d396735f3cb2abb0b3d6250b83c0528c2b412ba00be3c95ce0c83e50ef944f05dcb454bbf7c60ab8ecc2ae452d0beb89693385bda25e7f87e19a0cade78ebc2ccc1416076092a42edc1b52ad8f1bfeea5ffc8f91a245cfba7bc607184bdfee0033361d118fe7371b061395de9c712bcc649b4a95dbec8a29ed3339f83d5418484730916d243f7a3237476e588dc8a5f6c72e2d4aa88b29159d5fef08291ef07444d588221a63af7992fac83ca35409e09c5bc23a72ad641221eaaa098c90cf6383dd0219c6fa8a6efc24cead13fe4999642619c61f7858b484264fa17ae8da2ad05e86f1a50b537f1fc47ed14579342f1db00b1b85d2cb9cb5b53590a0878cd7423866961ad5b776c6828fb819d78f5a2ff62792a53e8ce6d2ecc94a3a1cfa635b8bf9a5a3fb9e61888299662ae648047151c46e303264c517b5447c3a095479edcb64c65b76cc7c5d98b6d191797d9e9605b5b4606f379761fc669ecb196aa76c9165a8e80e2c021b36605729d9243c2b6f0419fb9ee1a905cf82adee5bf298d297156f1e6d943dc70a3fc40c0e07c59e9a9866f6b3119c7549b05bfc0c1bd3e652f4751b8d56cdd52060976b4db19fa827e895efb7698ecabbd038c7456e29de81e1e061f65075f4c8244b8d4c004943b266402deab8b2921e55c63c5fd751782cd0201c78070b68a5ae6a2b21d9fcfe3ec6ed896f4f3386c4365fefde1b6de95fd9c185238b206ef6e10ea6dbeb4e1f9ec4686d6c5270dbcdef08ed73bd33053e2f84df5ce6bbe5d4678c07df817f9e0f9a9baf629483209dfda20577bc5192c09c89238e8c98437e22a4b46692f003028a86f8fbd06f251d6ffc0e9207daa01de51c1563843888744a73d8b61a505fc576d26265e4c5b5d232b2308676189173f20d26127276e98d40b9a3ede0050b2d7c381b7c157555bb16cb36a9498630a6aea33564bb99bee57596f0a92de5f3da3f8801801161375ac220c96acd41537540fc6397098681da7fc45d7b1cb940959f229320d70ac517ead4c59077e46e9abc8acb386008f2474e8adfc9162cce5f7375c3e001e84f69498b4c7b67b64e62996e033e9ab04d7b439a04e8ede2510431b08729ece639c07ec3c9e5d7dc4ec82668e08e1b7f5d6489bd065e8fba125f505301951b0a985c7f66cff44cb49c7b62346c0301fad1a61c6db6f5b09ef16ecabb60a83a24398412f43843ca833f1f363f847155d5daa59c17728f8146b315d12ca8c238eed165b0fb01141b9bd65f0e6730a32b3b6aef82aeb4be9f14b993e7041b327fe9f6142ac7fd3654c271005873a6a41d4a404bfbe05b77c3d94abb1003e7a9daa5f6e52bbdba3eadc26aaa4fa43be755a6634d5cbbc6bcc87668b4245d8076af5defee1593d2e71e0ae0b269b18ce6051a6758669b4eb5a6276d280d7f870245c3b185c92166d43d6f026050714332d109fac8ffd3ea3ca511740b6d1d0e4d47ca048761a79946aaf5177c8335c3a622133500d192f412973a8160e464548a00e3261c8ab390fb2474ea18dd716bd9b062261e7e8f6e99249642e9aa618289a3fd9f6d1b925067b0580ef27587ef3fb9f23db0bd91b3c166d1be5e962b9320261cdb07a8f9df29fc698078a46b9c200ad9cfa94077537d8b1aba332f3c361bd0f8fed83762cec4838dfb2d861f48f1dc41636994641975336f0a5e667964951c40aa070a4812bf1fdbb01d8d0b73b37c3886837a06522a61d8f396e4509eeb0d238bfacf05ee7afec6b713a22be268a8944d7f0f0a44e3480e922bc0dadf40caa44542c5a2759e4331a975ab10f9094f1b56bf23cbf8d15386ff9d0c5c47c6e0cae4ffe5046c4da0ed542ebd3f8869fc872b1b71a866add2f050d7eab7d293eca5a86b072db2db7283091c218eb969220fd5a3f3d18253a23c0852fba7520593d00fbb7b03a783bbfacfea0b50c41d4549a5c3582f0299f0d5bfd0f8724f06fee71eaacc90724271b09b482a3ac4ab3f14b5c4b356a0b87bb83c55bb812130ac77fff131eed246bbb5575c355c241787232eb2c85c09079d01d20f1dc3f04f58df90becabe2ae8e4dcbb450b3e207d64be969a4fd136a2f8a051240f38a6f65210a14e3ce9eb575fb0774b838a8341fe90959a29a80a892f5e86a819bcc41120162f2248a13da26ef90785f240bd398039063e7d748fd124885cd07ba3536280ba47baff810a84a828e146b5219bfd08dd867ac61d67a3a85ae181f3be78e15d4eb74737bf7f79c168cd836de2c8bfb2e21d4fcb049bfcc594607c425de3ac4bb1459e07dc1e28f1e02e547007825fa1328034e7c2e18d03be8b713b4f21a24cd132e14ed7cce02537fcfe7696eb7b95b8ae96c0b6a8e003c9948517fb617be3ea21f5678336078c62c68b460a88541e235890a90b7282ebeac89c44b700d3f1513da84e1c9b8fa5819f5e6dc916acca2723db81fb1557659c8ccbe2b9e35b997347c4b5dd168d0ef4113a60c1e1216114d7d60585ad20f651c76abaf908d6da96c20017f26f6702ae133d2cc70bc65c43bf1e65f697d2e916007cc0c68de275055c71b0b4a35dfd21fb7d64633a04db23f49d20bc194fa4f72c4a5e08be701d0f325a0b1340e3ace5c979606571cfe042cffa80ca1eb922d362d1b968f8750f1b95d200c45e9ddf396b9f5563d7b47a1f1fe7db27d31bb6f415b9de9f32950ff0b443e35bb8d974d1fbe2029657c4334db586e8c440021b1119a8c87a3430e6e8d05978a21ffbb56347c176834fb1eec0da0a6807743e814e575f3a1173d6e11409af62e7ed7d160ea76499b3849dd551ba9ebab0a1e4f7e89da279e443c112569c9ef0848e9b88ff4b72ffef58c9eebbf0073fa80e4f38892c6fddf1e9ed68a44ec631e06fbc12cc8106d7ce3c89172f5fc37e65608550fbee699a7e788cb95e0fae5c8a36ac4f47a6207fd557fdaf3cf465ddf79da157652a67562f66683668990200c75138a4a210e439aa8a249e804423807e69890ac91c33febcbb36a947dd85a2106f22361e9d93bdf7a259a9c8f9b4e0818e432ebf4ff1290b31e282237ccf5cb17f42b8cc57b9e2d73db46c8d8175dcac384283f3d841c802af8ab43051b9c9ffac2148e8da667ca6a2b10ba1ff67ee4062bfc5fa66ae5d7a542dc197bd3bac25055683d719bbec07689aaa7099c3c00558745e7c1cfa938e05ceba3d5ee9cf2e0b7048750045011b9133d8d63ab2fcc076c41fa26bce3caabfcb5949af058951d9ac53c22c838d68a4221c28b3180d38f1c8b46f3cd4d9f3eac2b941dc718d40916f8311380703518ed721c1f042d7d18268f6e2239166001ad003339fbea7c3fe9c9a203a50e3433c8fe633879918975a8cc8a5774411bd959f69d573b791a2360bdb8c1ec23f7d5e0427b7e6780199c81530dc8d21c12f14a024f03e220a49b4204c88012c48397306736c16394d090c096fc0d75f5f1347e128077abdc0002016900d5fd6ff70e360b6ffcc1f2bf3c03b6d5e1496cc58e8ad0d6e162847c1eb282b5909620187e6800a636038096b4d4cd9f097b8d2903e531bf674e9fb159e34b1b1050521639f9d50f083fa5128c1ea11cff78f022f2b9c6729a1732e93258cab6f88502f6d7a222ca9ff41cb81703726a7f250193ce455ca70f3f918388562e19ae35e374d6aebd4763d226caa9bb28915577eafecde1ba5f28b47caeff0fa4ac42608066a6ecf646ea4231001d0386743d6462769f81f71967deba1117282c90958d42bc335215a451f3fda094e5c6a927a10c10312188944cf17a4706c05ed4e344c37d3f3e0b50e6f3abf3138f3b5e2401c84e10de31f09754988793241dbc580e656837604d156e3d5abd96dbd549e9d31c04b4ec33de7418904545294910ed2f60c70d3aaf74325f38e853b9a4beb41ee442ba49525fee31c2d4e4f2acd9913a7d584a13e6d793818b80202ed4571a626e7bc3e4e9fdcd3f44521049f63bad551b6c733f37545abb4dc07668a2f51e99f35d4338de4638588c64d0a17619c96f6920884441bf7d563c744681108fa96223862ae7bdc4dbf46eb1c4adaa31a40ec489ebed66921e3d51de1a31dc6d9aab594dcf94eedee1ec71ca4196edc8a7674ec33129bd56a616339bb502113e16c4e888b5ea4aba1c5520051dba1b438f691deacf598c3c9151c28df5961fb637feea239dd576582a441787b5f364c864fca9c4aa1679fef747ae3f488fc032921a30be9ec244585a2564eb7065fc6150d1b621b4026013e5abf5d057b53190f08bf10723373487a637355cecb13dfb6e29313157f248c62d3dc2308daf3f254f06f3f70238e671e7d9440d80e6a8da5ab67db447d51c519121fa412fa23d011afff5f8c5c0be0fab2b2da751d0d16adaa32cad97e7b753a7ba0111ce340114b38145c66af14b10f34d600a5782e15790f72b7abe4b214d040f843e9472679fdc9df40679c7da2177a6b9cbd087dac25433e9e7e549df68eda3221fea3f30d081914b7c9a204986c846db6ee2941661e60874f8b752afa147b6440c53965c1aa75d3dd457c9afd7dc687829e85c384efce6a6b0988789320372eddad3e957c20b7c03ea4e777219d0b636442f2477f060dd6385946d2df75bb47cf4f7afaeecf1e57b74ed179e9aa025a29e435fe1e7f7b7c3e8aad1e88c6d608bbb49bf0c07457f9820d8c9efde01ef6e8e72a8441f6f4b98e02c9a527ba270bb0f922788b11bfdf93fae5645dac0a6352bf39ef36729244a0245acf3ebedaa4089bef9a624ab56d18f03e602f773d8e6280ba3635f55db76e6a00fe2bf95e564bd954f1403dd3be0cd9ec81f185298d9ca704de1ea97f7694a973b1f5899bd67f12efe210fdc0a670cd4689cd43ed8e56383b01b84074205f22f47b8933f5954018ac8d98e61c6573372978f177938c1e446a80284e0c28d23103adfaff4b27d24329d1d685ad791b957dbfb0fdce9d208adeb927d9874aef367c0004c13ae0a86fc3fa18497c5fd8ef2d92efc176feb21ddddb02510e9888070ae8a517ddbc7742bee4b3a1a03a03caffdea17fb3c886de783adbd0750e388d207babb1e7de82bd80ce0bed9e949fae977dabbfe6614a4e881d0a51289672a5ead9a75dd32238660e11b59c81e48df6a45407582d593f8b3f34f79fe26aa040c5ce6849287c31384326c94edbb2744472929b3412b4b084b996b987afcb18c24b8ae4e0550b5c0eda1110111a011ea270c18852e70fbc38b29722e43fb0db79bd7736b1f0fc519e3ce6da2acb6f297bf610f9a7bdc60bc318ca762af290043af03e799962b1018f497b132476b87515dbebb7eb14cb1c28e587c58cbce3d33d66e9c90ed6b768795c83542308246582d4333971824364a40ec7c3990e73bc0b9f5d4ae59145dec0809fadc3e0160475703aeca8a9088530bb7c95d4aff4b6ed6c9d421240b7b815248c823f03397c85e2a41c29a94eb3eae0232027c3d82c9265dc480afa612fd78159eff068e81da3acd5a3aecc341431e9d86a610f2bb8e056707cb3b9f044aea4178e78bc7f0d062b51a77b41e6932f133d11075b4861ec78b9c2ed8994e2921597a07a488468ce35fa15ee4a5115a5197f62a66329a7aed8962d0e4fca1e4e3e7f92286fb70cc29f96fe414f43975e9f1379323f2cdabd545c5e6b6391afd1f2b30ea39c5affb62ee9f89ef15277f7dfa2ad35921f0b3d2b7b87df6922f8dc7c4524ed7bf955a554bd5ab27b7e761078daed1dc56bff2b50643c44ee6a54dfb705469fcc90078438e330365e89996268fa47d9792841c7b09f9df2ec14074af02cb26b708c85943cd94364167e06231e4ba6c31e46213787ccb67e6fe47cc5e3b6bdae95d6741660898ca966bfdc8b434b673385ee702dc321c93e04563cf5cf29e95e190411f7f1519b0a3ce6339759d0753b56028f702dd83be8c7db0893ab19dd503967060607b7425838271edb2cd2dc74dc530760483186771ffd0c9bec7bb086c4f420bed030b5424c1f781f3f9582156f54cd54a8eea0371bf2a39fbb647a9be623314c706390d2f1cf636b883c543c08ac7ba16aa77ad9a4667b93cbd15769a0cea2c7e92d600cce287f8b73c11497ae1f04b54a482e9a7573cf022c468a2a8b5b02a714cff14ac4c7bbf127c0fcfd47f23f367226806faaf7682b73b178e13429154edb5e544c88fe63f4305ff4baf5e7b95d0e53c4885053be32053ae00db3f4f052d4a30b05486a1dba7c1ae2aab3bf215078dc9a632442f09d8b08e9b7f5106eb72db85f72d7c493624505abd09c32e6cd49689cd0273510ff736057bb1d80471be62c7fc1507c11ffe57ee1147eb8d3e2cc2dfb8a3b6006d9fdf8bf67270535d3ea01fbc055c7c3640ffdce3a9cf878b0b057517d7fa73ce7f752a731676979663b6321f93e6c32cb615ef3c3b2892e16a83b1dc250f8902d28ff9163647a1b2531d843be84368ddd9ae942aa1e1a912462172cca85e91c173703a90ac2d0a65266a1828639a47313bc239eabe79412b44e96743a004299cc418c7a733d5c1d5940475d0898c96274632f5811cdcefdf03ec5b1b852b89a350eee2b0eba0ba749e872bcee48b8991781ed4cc5cdc4c5c7942ff8429f3cb818307b3e9e359cd3dadcc8dbcb3e0de0dc05b0bb814d065ceda06f2d07149510131107202279bdc7e3bd2677d51211f5865da3c003ba4948e5160db9404d879ef3d19f6b420c1613f10a2dd068d0424b18b7dcc36535aebf215aba4ec8246fb4c833dce17c83a06d4a1d00960bb1c51af5d1c57e5fe237a8d665197b2e42c956f8a1b262871ca2e791d1a93918ac3450284f2b143197a36e303a9bf624a6d445384457a4cd8bcbecc86e83af04a31bc05723f1e6cc7728360f2905e2586fe02952dc6489e33859abb869df56b6d6a46ed518a7bc9d221e58ee918444c0168e74ba8ea96415cd1390a56837a2b41a6a975af0c830bfca70a4f25c644a5c83016fc3b945f40b67c40d4328fba9aa4e6b26acfb27bc3c9ebcd8efa820d133cfb260101ea5b83ae634200bec90366eab172bb63cf01838b26d2004aee5829c1fcc1269863bf9ac7836d1f74f9e9ec631a9513d2012752c610043966be300618ed5aaae82b05e2ab33c1e0297fec247169bce5b62ffac3614721f4818abd7943eb6e6064fe2eddaf09c2f31572e26ae93bb008b7ae3518346548de1db3676bacd119f3c2d2c9d35e3794bc0d95d788b785627f69534b48c82b073d39ec9621821f0221cfb998d3fd1329e0586fa1909553da42c83af706365a35db5cffaad4e830bb5c71f77ce9920a4c7029a406f6bc022fd1a3faf7784e6987b8927d4e5e382254cb38320fc2b8f2a7491b29a5f33eca1e84fc073936b6b53356a808934396c738ba00034b8786e6a8868512d614efe9b33c8682ae3e56efc4832a1b4cdc178b0f865e3eba0e0721ce80209ee56f076ea7b622c39981a0243e5cd7e378d8832637f13891a76ab7fe9d8a5774e5bae530dc96bb60eb81ca340177e51a562a3657b6d51286eaf050dffa9845889ec3a9bed78fae9c0dca40e52b31e04cd752aa97c6779f0990afc40e679fa3d10ede239c3203bf17464b0366172fcc7647c72ac7097f79a822194c0e52fec351e9664096ab892be59ef697786a5d9e1d91c768037d13b4a289767bd53f241c499a13f13baed4b7a09f44ae5b8f2d4c74f1e259f9fcfb987e33772e1f0424e9d0470486df547e10617e8a08f1fdc641a83eb4aedbff2a2f9f4aadf9f6d1503719b862958c42b4f1218674b47929b136aaf84cff9de88cd10954e2ef9481715f941bc38a8db262635971e359a3b1acdd6856d148d63696151bcdaa1bc39a8d67e546b0cac659531b07b152091549c06cac0213b78e07aef383d4f5e0753e409d1e5cd783d6f9c07572d0ba1fbc0e7cc05be707af7bf8ecd479e30e1231514c69cada36dbfd902c8f19a6143d8bea66a014fd10a01debdd63e222e0f2b33930c137ba7be763440d00c7b83d756c89cc02a6060450c696804245d50ea43794cf10b03db03f21ea3c7a1b122e464cadf9ff1400fdbcdf1c9e4f7f043b4da142a898c56af9454af79d857782f7636e58b4c8b5d41536c325002a5be2f4f864bfccf4ca293b152b5c1a72cc1344e64996d167ff1cd4d774134e2176a01ea4f9f678f3e5ccbd83e3343782d9f1c87dd193828aca06ad874e712f65d9629f929ca9d8fbb16ef6b4d4cf2b12e84e91ba20281cc94adfe7db2bbd21509e6e482e004853fbe03f5a0e422173e95133eaca3d979fa0336f0477d478651a9a9011f48aa8b053e1a00a1cb6cade011b03225cee9cc0227675e31d3e16e0fa102c2568f577d0a1613cc4643c24d0417a7e0b52f1d038a361f0722c10271326eebcde6236144bd1f5518c3dea46eedc3869e90942de91ca9bc2ed7ff2428c6e79380a3b1abfeae5dc9a358887f90cb10188e164e4148d8b97594a01b85f6815e2a483f19577335e4d91bf6f784e9e0ed0d97dad7bcd7f0ea53afb6be6717f8e79b6e86161245a8be2811a339dfcac83db3d8e4720baff9e0d5936b79c75713ce2c68b5ef389cfe8fd9d683dc112fbfeb2fa5415c74e265e4e9fee8663093eb4b48bd4f681800a6d6191d17351c52af7ffc8d2164001a9c4b20d9be4781ccfcb0a8ef2a54725d3b9e00568bc4a818cd38dd5005abf2ddc3ea2b79378aa0f48424ad9e0e7a09c8064d2a20c111afa95d31ba7113aaccc9067e6c8549d640dd307d79c53727e6e1ba9b854a3204901ec76db04eee47e17540c092c4eb500ad60e228b8a0c6d5c8c0ee9b59526b2128e1c33253624181c06b51f0a09fad74efdba1c2121eea0239cc40e9130028bedc45ec61d975ec288fd0e7d2eb5af9274a0d6f91227d9b1ccab9d0154845b639b524ee5b5a91b2eaedfba29c82af83a616b9d31e6d8efc9dfa4d2513e8ded4da8b17248e2e08687ba6189f3a96ad847a26de7f3659b89c77fb972868e1fb547e080edb9c42edbbec1f422f7d46eab45d1ab5713b516ad95a22875906ee8c2857806c4ee33823fefcd92df0cb8658ebd950de6b58be2a1cf4fe9aa827f06622307924c1bb4b1b3b59e7b8d5ddfec7322387820884cfd860174813567db4bd4027a91a49a7801504782f37806426f0e19f74a4f59c2004627c1df0ee635b2fa6b20f3a82dd761ebad1272e58cb1d82f7965c320a0306b3d767ece37077d5cbba293078d32f357f0eb0b78ed9cdcd921b5346ed56fbc43e18918e8c772875ac17d3b30658a5c90c0621b22d2e4ae82b8648c146bcf836673f5eea9ba5896051416d84268f7c3a5f941d615f3107d763a26d914c1b6f04e59fd8b3e88967ad9f94fd6f455cb8b571ef473f5ac9a1e44b760e4f1ff15ad2ade6ee0104a53a98af813119d4aac13624fd6a466195bf6505f6941f25d7730bcc2e08bd0c15343665c2fb2fbcefedeb848994b6b0a927819873583a27c61a18cf353aadd06d2426825469a1b4c5fa3851e66d82aaa6783efd75b88738e2ca7156e209f8d75355572d5a65dcc617122f112493ed94f263033ca4e908ae38046c3d8f2bcce0ff1ae2c1b26db62f4db4e2dfe08cfde841dfd2ded1a96b6c15ba2ddd00ec5f49d6ae60496bb8b36806469ed07a2391d2d692bf3bafe08aaa1b2a5053eddd499dcdc9b323ce93997db5123135a8bde95285883f3e3d0c5ed3856a52fb79ef0cdd06914d52fc9c1c00bfc16a9e9248b2ee7f85ef7a1c1775a02010043139f828239b722178474a97876c431302dd573bc85f357eedbe6d71a89c2d07ff155c62688582d18cd591e351b3faa04b17b142f16ade4a93bc6c1f01c2b542baa8d92b59e11a88d34d0b6f47a7665e9174f7bce57e62ef90f7c939f2a87266f01b400788defaffd5aa46631ef391bcfa234ed8179a9a4b8a74d19bfbfb87a122abee14fc047e65700e2a3c0c3c3185edcbe20c65318278bc1b90824ab1de9a32e1f805afb2c00c0a156c5fed2dc98601534e145903518c896071d02e65a9f7e9453e39d1914a78d11dc2ff8390272e0225a32f75dfc239f938ca5ca29e568e99ab18a301071436ed07f672e29ea893fc1aa78368964a99b69a4820fa1ecd2b5e983c4b1685dce83d01b301c3a146ba672a763dcaacc96bc7be4ee0d54dbb35bb0c4a23f5be655dbc8e61ab15f9cce82e750673df208d78ac87fe3a149802951309f5e7b247ac1eae45d263e8905bba61a51ab771d43c2d23ffc00bb0a4fe9a8b39083b31dae12da68c408b61a00328687fa847cd8afb8eacd465fbf054acb2c674c2c244ad50b4af5afc9c1f666eb836545297a7060bfa7da8bb58300e76e4d31e5224361e4b5e45ea3b3ea172586f46a95901462ee15ba77bbcaa867aebb39b656523f6ddeaa9b6a9dcff8c12433380fa617996c1774ee499986c7e6b141e37f1d095f2e102cbdc4b06b655d5e03de7990250d3f478879ed20eaf74d9285be921c1f3472befd87120eb9a968e5c6c3bb772ec329a369376795351a89aa0d294f16eebf4bb50418448a7156dc385a5d5f5f8abdbea74f13ab2681ad49d4a7bb4d4d406c0f2fc3f0993b498cefd1991b1f75c0858f96c2e49d0124aa0e2ddbfd5b0c5995db19e23d02a222db6978cd045304c266c623fb5e4311df671f70dbacc03fa16ba58007701f6374fce0ca1d8772065779e287442a30ee2bad4e088c503d85d2a4e71d2d666d170dfeaa851a38188c399344ff04fc168f902e9bb9237e159d3b48b5c5f609f147826967f05526b550f06d5c2cdb200126a350ea6b54c84bb185876399602e85fe9a3124f04dedc454e2e8ffdac819505c6d02ac0949ef4f739ddc36733a6f7520846d4dd4aa8e618977a2343b2253d0f7e617bddc79f12b0404b6f6ff839bfcb00498ba49afc0b3f7c4001da0e7556418c0bb4d5cb3771c88573a6a4c8457abfeccec09215eea152c4831c1a024f20897660fad3ea0d2f678e9dd897f73fe8ce398babf8a87a00650a148de1e07dd59ca1433c15ce95cc18e65dd55a26f0776e51225ab8584abf80752f44ee6e67c046a10e37360e196fede0fe1038b5d2b6d1243d8a5a6a5b8168deeb0204172cd553ff26861d5187dd0b1848a192f7efc1e73453ba348e7f788f76449696fba56f674bf9d59818f58251325a4c5f10aa2812544c2fc806a14b370b9c446abf86adc2c98dd83ece888a78a8ec7407895cdd33d8cea1b9cae92e7f9f4e8fec81232064bb7ad8c37f6258d6dfd0a760ea4f4a695d734fb841b760789b1ad3c8e7934e5b36cca5bdd53dfacd927a3abad36fd7122722d0c614e4d282b711281a1ea444275157265c6b7714f6276876c5d34c8ff3ee5243f800eef3a1132cd46067b39caffaea48409536fdf4b09acc148472185d6ce77904be2a7f25e24f500527b43beb0f0efa1a4bfacc3c92bfc63a8b3f9c06759b2fca2297b65984dfd4ea47c62db8a08395a99193686375e2f4ab81257828e1069e95f4fa12261ae6dfe55896bf1c4321eb401a6945c98e234b312fddbc527e367ec353fa9facefaa4af46d8d4eb4376dcb97dbb74f90efdac7656938555eb49b47ee78eb81456501ca11d6df07c29f19acf71c75d9868d3f6a346642aee4d1701963eefec5ca446370d11d7eccdc098220779e359418cde4527a0115c1b0b9d3d22800da87bca60184d04a21ca40015b01a21813115420377200e3284805600befbbf0506e61c9408ecac7873d75c36d222463fed21a0935694e159c31293b6adac5e28375b6e8d8f8ddfdd317467251da698b8429c019584e7e1e3c7b62b590d1ef9396658ea5ce3080697b2d0352da18366454938e8e7b6967489d75e70628bf7e02cc134956693a4e575156549ba2d2607108bb34fe78186fe4723941d11132a799e7b6a6e3042dbd6070a80ee9d048e7ddaf19ac4bccc37984909e4801772b7cd1491def5bbbe905e4424bd8e6bcc19a2d7e7cedb793d75efdf173b0b17ab4944fd7cd7143fb786b67a3d1cf298177c0cb21e82c95fd0ed039786c5240eb9f2b504e5262eac612f9872fd781eab41004a72efe87ea9dd45fdc17085569afdae8fa4fdd1cecb5e8685b544831171aa89cdfe478ecf517f6e464fde1987cb019fa3ef4e83f6a9909f7f879723085aea16a374a2f0ffac47c5980711b12f8676fea2e752ae33252f626df3419e7e358a62054335d447329bc43860836af0f8b7154d2c5dc0ad05d2af46092d0959208cdb6d5bd24554fb94bc2a9dc4960d70bdd673d6e03d6d1d4964735fec078158822b7cfe44e99ff5e8249854b11a047c18971a49cce6b061069b02de621dd49060e9d8ef2749dfbc1a3d10ae775dc7d9ace45612950fff995d29b26de8c6bf1196d4bb52e9126201d4878155131f45d15c2d58207387d6fa28ab1772a5aed866f4bb46bc1f16894589191d423379b27b37a5ab4f389a49a72f728264c92eefd8c04afa85e8d1ceca4eebd7a1664b48ba68ae99cf01ad4b861cc533b83bf6d4d679bf2e113030fb2be0079832fcd115a8324bd1a7fc6a9b45723520371f3595b21c95c067040465a69e7387bf96265d710d6cdb4e089e35add86284b09d46b6f3a5d4f7c7aca86ec6913dac00b17b00975ad8b34c07a2deba83bd630542f280b22d768e9fcf7c2a4a3a8b86da35da3e3836a0b71281fb687de0e6abb54440b77b599e58f4eb163433985b5543dc9dd784d428a667a5787a3f0a11c931011e137c607dc3fa9f04ad95f6279ba63957cd576add37bb27cc52c0c127e25f7ad67ea4db2bd43fa52ac3582e159d726c0d432201ddee8e36eee44a53ffac797a95d683a9b42488f2c1896a773af7aed21c287b678045a99f16f724b3dcbbed1ea075726b40069a31a8bccf178e12cdb11dc3aa47f494ec00015095e3b0c586b79c46f0ad7ce1dc362f518d8ec4c628270417c565b6d3f996acb7fbfad6f81739681280f7d3f2e1ab93fad83c74e070dc4e099c6db654e9a0f7811ffbac96e853990481c833092b788cc624b0ecc0557a529b771573f664216a4462a5af7e7fe9f904ea42112e75f4fbab958a2439ae0b624141d1eb5a4e5cee7a38934fc4b9483c8a1adbe2bb51933a21adc42b1b0245cb42825fb5c6000574f7d0f86d41695d05aec3f6308fbd3b3de47f17e23446f2914cb83c462437a373c8522be3422a96532bb254e3fb80dc74cfa5f5af7075db85e8868f85b72e5a9c114e8bcc5af3d9680992312a0cb90fef5e29c0faa58fc72c973c56e8e24169171399cee3359587e7ca71a225d0932131587174f4419ad995d433e24abb8b156eeb38de9515448ca6a820aa9beca337b53cd666b6503e5b01b08925dae3d91ed9f878895ec6097885c2e795acb11913d93a80ad2ac4e2fa2a3ca209197db4887a4909664feddd79f97454ed22c4a02d9ce0181c4d466acb828b794773819e80f5837f6fb957202ab6410559a32a97643e40b927981b7578af8f4799f19178353ed0a3b41067743e46ce76ce3befb6bee86c7d80f32595c76e7ea33d4ec87d8b19c6fa9b1a2d3f69858db9490e2400ccb71d7fa66cff7c1e669711abb1bdfde74c14fac9d04a126caf9bb5ab5a84110d5ae16007d46b15fcdb46c0046a1cd50048dbed5effe502b5858fce71fb8d55686e6e59ae21f0477f687e6f33a4df7e6805a1e4176049bc7f297544ea8aa4915b5a6730e8b2c3b2d200ff0b2054baa6d26cb46cf87ddae15aaab8cadd5c1e2d835adc7c0fcd81e42a6a72698d10d889395e4d6deba38a0bc77ff9442122033e0e247bfdb225b825f2e1891dc57b958e57a83b61083da7d1829d235e5983cdb253ae86b32bc4998c9b00a664e471163d80cd352c8066528ff34c1943a4a07322bc8176b3a9946988d3f494fe5769b9d97ebb447a4b5f60ca80073ddb6e324b8fc73c959131f1b5823bfbb85c27c4ec7a25e4f846b7e09afc532386c77ef36a5ec108e9a999c0c768acb0b653be3451f989dc2b83e0dff812bb86fcdd4050be19bf70b5ea9553e10b134f642f1b6ef2fc1ef0aae8dd16782ccec29588fb37b4fcc3c58b6ca06a948dcd88198ded0ad67cb45410e06554f9856e51880f1911bf3abe0c4c27663c7f8480754587990f23e01ff25920c8996177d652a2b8900a8c28d61f7ec89caadbd843d1ba7792b878a7dd119ecf37845ec9267988c0f3947af2ff6e118355ec3aa62bf6878c5bb41015b3491e361c151fe2bd4ba6162b93872f4cbacc439507509a418f1fd05a9aa2e77d5fecab00554874638061349471f2a0b9bf4058dadf5fdc8aa236e62641a90c2e5ee315c377f9f52d83811a97721bda5ea6a326d397cdbd17be3a81e4371ab8e59dcadbbc9ac94da1c50e4b605d5431338ce34ed9aefe851cf15f8e029c702dc1ba355f5deb0068dba91eb2c3054b42ded2ac2ba15bdb3baa42259ee1cc50844f020022deb1c72c3e7233dae06c19eb4dc0623c3b9fc9b05e6c4cb1f4cdaa33bfd033fd46904275c5bb873064f6cee7a422bc8569699f39adb506341c6f0fee328f35d9a966e9320e4ecdecb3045ad2ae246714b103951e55031a610bd89be241bd8921cec4307d29da4e6e03e89087a28d7af8a104ec1c0795db59ed657c459ad73a005ef9759977a213b95ccf20959895148d969c988825a75e0da30e990573797d1a16adbc6372ba1ea149dd10078a1cf817db91b32639e9b7e4e0d3d8080818c1dc44ac37572aa5308ebbbb9f804c85136290c71bbb7c17123bd4e8c8922294f4a664ab15241ca9dbc1fb0e06850c7d4208f48d1b3b3baef8bc2a6cab91ee60a7a8e9424968532d1af40e6c872afcc7ab75fc08e27784f13dd4f729502566a138a723137cf026ccf275cbd4c05bd7f5ec14e24ea7fc0679e5acaa1d7b01a783325b9b1c5cdc12e30045a1c4a8b5328376b252d93c700544bf93c224d4a29661e074e05b80c997ccc3f869b27287a575ff300205abf720dda05442179b15cc62f4c1e7099b664b095743ac5d4e0953298ff7526950c1a3c728750fb93a77abf94e66defd6d214ae0bdb7a0fd7085bfb850bee5407f3c9dc1a973cd8a0607edc5e042939c59c49009bd84e2e5886427c7b26864e1e51e53b7a2be111be3855370a067c22f7a65af10c5c7307db899944755676ea0fc52a3511c8c302bf6c2342369bef5b265b11fec35b850233673cd70a0491b91a777a3ef3d634db61532158695964da4958c9b01b66e08b0dd44eb26c744535939c9865445c80b2f6421efe5d75299afd016c8bc60aa1783bfc0a356ac17477b2a85da4622d3cbbd496feb5089a7ec7b81db171f97277dc24ba4fd3fc464d603c1f49ec032d08e742accd7542671d5914c163af8208d1aabc614d264623ee8ca4c44359921a77f9ba92928d607815b8c6461f983db426d1d0616b5b333ae1dcd392977ecf181d5258d5550d4b6b39bfdf14596b19bb7b6d77283fcae385eb5f1e2363cd66987f2774e6a3daa64230328d1a8ad6a8accc6095110dc05d4a52b4cf7d8d6aa7e849c51ba043e0a823f57295f66caf769555c3e24df49850f388912941b94648012d5be687e576d3f5bb586c56654f748b48b26195e3f52f18088fb0beb82affb87d7aa0df53fa49ca086edaa16b4614b543d3d6652bfec05f654725d0b9124c03d278efbee4e6ecb80875e511a58ecdfd7128ce61744963c6e8f07ac783cea320dadf749066dbcc391fac9a9bdb651ff26838c9747b7cd4876ee717610ee7865ffb4f6cc853bbb5f6db5fc7f0b89d4af15500f2db06518de6939a10af925da60cd3b235f128bd1aab5e070d1b7643cc7e2b885be673d3c39ef359c6bac70c3104a3b5f03f3121537c78fd7a8aa6a4cb3fa77af704301b0c87f2fa5224f87711772e62e2e9747e52b7edbed1d8849e03facdde91592090ba9216032cb8aa12f76621d24bcbe42f40247e91562ede15ca60e0e73cf36e34eeec7d0b972db486382914e00c06b540a96a4a1a15754213f8e9aeafbf78ae17fca807ffbad584ce691ddd116db74608a126b4b2bb7b07280925093009878f64c89faf29e986c70870a36f874d293c75f83515bdc9e1e9000e7f0570780e85c363130e2fc4e4f0480270f82543874761c9e189821c8270d8a1cf811c5e861f87aff201d209494a9492f0806489c861cf7d1c7af097971e58f038fcfce8613db487df083f720880f31c3ea6913f5fbe3efc76aee3d0bbcee12597095485c69c1c5ecbd20978890471e4a60568a5c75a784e6e5280bec94d50b4d2634f7e23372140b372d301b4d2632a7c959b0aa0b9dc64a4951e23facd4d457a2be0262ce040501e04010f3ac08914e0468c7e24173d96b50d4977412731403bb9f4177b082edc85ddc48501e80fc8052231fd0de0db85105cb811222e0429e0420b88b5a0939c72dc8fc845d82100fdedc75010daa1a9e0a024a7adbf1d990206a03f146e08f73bbef7d69f0917da424f7242417fae8b1082fe727e11427892d30efded0bc004fd091d85c75c3872895c2341416e420b408f692a5c0b26c472dc480b381ed482b621c9e94f720aa23f13de447fb10fe024402181059d9400edd4d2dffd072c18394c53b92c10799213131602a03f120ec402d01116989c080b1f0480c883b0a0bf20076ae1421040c2139de484a33fd881682af73bf2c308d049582204c87fe0273f9ee404a43f58d6c2d07f682a9789fe7edc25b0030101e92fe84234150e48c8939c86f4d7fa124d05ffd0df8d7fa0a9e01f1f007d48c8979c04168280e80ff600682af7c87d0284c89320fa0b3a094f8290f0242798fe700ee4c9cd8d3c810179921311fd053913fd91f0007cc80186aca0930ca09db0feeec7e33e3495bbc29127399db082fe863c4853e1562012e463051efae37e64051e4a8e9cc80afa23f2a027ff29c010157492938dfe4ef85ed74712fd057d08921f1f9a0a7ee9cfc77b682af8f524a720fd21c99ef4d0542ea7bf1e370992070505fd04fde027e9a1bfd579f4e0f1242724fa0b7a929f23f990158c9c707d5c252a10d19f910f5181c89027399da03f9b2b51c187fe587fa9e0e3f524a723fa23f213f437e44a5e82510929e8240268274d7ff73a9acadd4d295c9e148ca460444b21058d3ba2a96429e8efc88da8f022994ab69b8a4a20d29fbe0e4de5f2e828c11629c2a3a960ad3f9eebd054b036a2bf9aa97075ae692ad7d61bd1543823468a1829f224271d3afabbb73a749ee454f567e4b5c8ed4bd054b2dd9402bd3c97a3c21dd11f7d099a0a77a4842739a9f4a73a47c4a33fee5a53c1db8624271efd24a7a9bf239ffa2be1f442b3c90004800293000c2d394149122426e4111ecb247c67a00b65213f9247780999841bc9402f92859c481ee14332095af2205ff0411948c3ff64215a02215ff041f2085a2ac917bc0879e72164efb00c0290ec13634efe23effc83ecdd47ee79650f64ccc97be49df3c8de79320074ce5566cc894e72ba863bb47422efe826a2eb648f4877398ebcdd9553cfc9d97172f7d46fe48c95b7e39cfa2a6757e50ecba6a5969466cab4dc225fd066bb021ab648b36bce48a0c4022936cd330b0d5034d833db1d408006061269861b2b0390fa059b1095741312923f14683bec0bbab7d6c3251f30952f68067fd08c9671eade9b5f73f6744d3f037fd04c14970b6321f9032bb53686242fc8577dde00a65f50845d1152cceaba6378010afc052dc52520848290148989813c3546f8bdb0a504a955fe1092af0d52f943deec801ffb87760ff5845b9b457bcacc9eca1e94e5a0fa2053b21d81b9a98439828881bfd4a68f6bb6fc96af6ce71e10d1ec18e26e9ac0b65dca6ddb9036ddb659bfd42715e035e814358928d6180a5f767d9124b33f986606f8bb512aa828a5690618459f484a67a500d296b3d62921851b9452eb5c00471d0586cfb2419ecf428966d494d97996edc44bc9a4e4de235fe9710f7a1ceeec42d2831ee7b81e3d1ef34e8f2cdbe9d123fb0ef723eea8c175e7316731c6b8f3e57ce736eeec1c764a72ce390046edcf4a972d25e731ea2931c61863ddf9dc3bfaab42b9d89d9093f3c5ed8212235f59b7f32c6f3b99ae54c897dca94b70c8ce65a6eb17f9c2227f2a14cf79e83800bcebe438941cbeea3bba3e411f8946be7ee0b2736c789e9d9d9d9d9d9d9dd73452e0fdd5331b03816f7cdffa3bfeb9f60ede3bf9dfdd3bfad3baaa4103f757d15435f2e78cfc992ad04e908a334e789eebb8771c5dec7b2ef00936fa3b9975a83594af9defe84a867cc119a94a3fc121fa3baf3c348ffe5c00d03af487f74a477f7773ab1c38f42757aae3ad755dca75eb82bf8894f445fe7c53693fc91ff8e40509b67c85923fdff2144afee0b83c15237f762e4fa326508fcb53a50924cbdcdcb8f987f78d9b9bdfc854e97a87fe5cad7f5309c7639764e7b0a34ad04747850257285d01b0843f59e6c975f91e19caec3b5996c1b98efe2ece3dfd619ce728f345de8bb1cbf5bf5e30d817b423ec7068fde5dcba32dc391fc5c91fbd915a608837b2120c9407d7a78f93576518625797b8fdd5a5a56f9a994a53c96acda30bfea81255923f4b6ab63c851b045ac86c18bb376960798bc42375aec02f36ba2ecd6a96d5d71398db10ca026178d8c00221d8df6f012b78883ca899b7c0123d7c07353c3019ac70c8384f63e424a464245314d04d0c7e8b2d180c16020c0683c160416021c0603098bc71ef4ddd7befbd5ca4f04e209b9818f8a548908bb1fcf9512395d3470a31126675030c03fd91baf7a6eebdf75eeea6eebdf7b2388ec25b44ead01d1e3e71fe7407f2f011a2037de25d96c3ab584b1583e7689c18771004304c1783d3255f31062790168313281583f7d4c01d776f90345832cd73624ccdb4ffba344e182c082c04181c026130d85dd96b56579140aceaa81d63d448afb592dea803d35257e75e1daf6b5ecccad5f8aaf47256522ee3a0bea01fb0204499e783abf38ce7d2ecf5c5f3ea51af65b97368b7f66a2909fba0c72bfbd537bbbeb4529adddfab8704cdd4eba5c15ef5be226dddea7a65daccd125a95aa5b5d2d77dbd347d656e9787069db2fe7eb384d43f1d7c09947d2645ed6618a31986d938a29860a8992a023c85fd9285a065032d6e9cc0dfcd1004db4b93e1533ed205914bc041261ba1b9c88aa399881accd13c643765d764d37da6f458762d27ddf058a6951ebbba6a164733097bc7061996c803f4d1b265cb1c76803ef2ad2a7006caf121ff08c1e1c6bc82ec1c8ee61176d0c01fcd22d01c420e8e66187ef2389a4168858066203b8dcf179b067f540747f30f56991d1ccd1f442e5aced1ece30648981182b504d30d24da28022bd910a1b45a228a85c40d2a2598f0129d1250ab2d565880e34246b505aa025b5354b7050515d09ad0705bc4e021c504d4b685064b978bb6a58d1e889a404a82071fca1041c46529892474205ac24c1250e84094849a24ae50524a02044a444c984922cc0f444d5c72d0783f2c1de3964b2703d2019e293c2df98a3aa49981926ad75a5b2e18b561176994f100e9062f2c69d6e841039cddd0a305b8ab800722c02c0cf808036b4df4e0a00a2270b621183442e0031a5bd88059649090907e40a38c1eec5cdab08b36c6ecd71768a4410234d668c9c10e5128a17936c4062184104208218410420821841042324284f1a201df15f830836dc07c8044163d5650851558db100a8926a640c28331f0dd100a09227ac4e06c43282480f0629352ca29a58c5766526ee84329fda69c73d25aa994724a29ad94126fb9240a4a4965a694ca2ba794320535958b0a0c2184104269ed9c41a6a5f605a370a296ffece79cf39bb79452fa694b27a573ce7fd99cb37ed63ae7dc2a47d3e06c2aa7def47b0d01ebfee69c733e421ff8cd39a79caf5965a5130758d21aebbdf495c4a5524e6ae9cd6c5d73e9a51ad2bbe6d24b335bcfd09bd9bac6d6ec525bb333d5da9aada1d7d635975e7ae60cbd6b2ebd34b3f50cbd99ad6b6e5cc9ae94935abc532f6c5a6d16630d5b461abbd45a6d4699905e88823489b42012e88b16a01fb01e286f8f84e5095165d2c2c46491b0543da318242c99ec329753a9a65f28e87649ee6f778284d9ddeea2180245a6881441905ad3bd1913d2182631910b8d484abc540ba1cfbc4d9a8b71b4914b47648184d2768408761602117e80f6c7ed6a64d7236e30220c1641881140ec29718c1016f4579669b892704a08e12319f8c988a495b5d6c2664f7cace2880d5ce18123a8382266add2b6d65a6b6d50d06b7f2da62c76e02f36e5590113103d6bf0878384d9456c20db6a8004f3bb94527a420c3050031a41d040882e4a88c97410812f6c43c51a5bdbf2fc8837ec2f4811f8655b11ec0f8eb19ab59dfd6177aca5d6c62d2dd8918a6db394d9568b6d7fb1eb2f180cb67d90d01222226eb0ed9f403962db4779c1896d2f0306ae40d262859219db42282268c0a4650c9722b874b9b22d84ca0017f6622f62b6b50fb2d65a6b7b64e1c0bd9d076012a679f1210363260566071ba6cbf562881a0629c352460e148bc572831fe6089e6a96a40bc826504f7488206213305db238819b8c008d7429fd8075288049d8186a18e1011835baa8a106163d30c0aa0dc1a8d1850f23f0b6211835c078f980ef8660d4308303141217c8d9100c1b5b94b0fd6bc5bb6950a2440d0b54755cc76198109109a2cc182595627e3b929b3eca5e77b6b4cdf96d9bd56e75d65a6bfdab6e72665de04fa7428922034483f47a990934ed0f50505faa8e1ff0847042a8a5c45077f698c2b4f6846b179a98ce16a4b2473e35c67ce268ac8184a54b9d99cd7296d15c245f2ca4745c8a4af0009882aa81e16397c472306315a0062ffa090cb56f179217f38040ad0c7fec06c47d7e3e19c357e5bed12f587be27927962e775838252ff504f89387eae2cb9697f67572437461c134a286e002239a2070902a03268d96c833bb21b9ab974a5d0e490b16c102a1845862df6cb92447d8f2d5a60ea14fe5eeb32cd24aebebddb093ef5e9044c70f986e4be40fd556432d44f312263045a26b75419f3a035c796409f3f5d556faeb512d1443227bea5363e827b00b0ef194c46d2b19ae0e6838d82e1b0eb5d65a71b85d34e104c5e102693629a5843e74d2092f6574c176e50f84b0a0bf30b51267905286b1d18927d0937618a38f59529b669a3e92f747f38b503bc618e352f67b6917a3d0de69aa539a462c942e118d80116ac9eca187b14d6608a554c9cec84a4ce84911282fd4280c0485444949f7d99388b6db0c6348287dead2141b78098cc92529ef0b6212c6e6375967ada78f59c4e244c6a6ebb387c296b4826c7d1ae36a4d2a8416586ed8794eece78de636bfcd6f9e91fc7699394f49dc5edc72c3edc566f6e2535e6ccb5ebcd985a49682cd9eec3113ddec37cb32884642b1411e2fc2a889ea679452a289346c90e766cf3aedc5ec475ed41e91ea29c098eadd8faa38191d6557fdc8a9283beabaa77495edddab7057dd4a0cc660ec1ec6b6d82591303c8049dc148624f644a90bc978b3176b517ee23951a9b25ffb5de9a3ecde8bda48fbf58c52d9bbd76d4bcdab5c5a50c6068e422505c1a691524a29ad144a144a29a5dacca44501a5748b0d0689b4a1b673d8c01149860914af1ad883da73729f7ad17d4a577182af72e474a43a3db2bf87faa83ef5953e9a3b5be0d5aba84e6f57ba4ad59e13d5e9bd4d17a9b4b73dd1d7a752afaa2b94fad41ebc7609460536f8f0840e19f822765f349f7dce5bed44b347fb4b0d342640230c24ccd02296a9741558ff647595a96151474e45a9cf1fd17b2d2a0663993e4a69cf89fdbd077591fd7d51fdfc07d33ebb14622c3b9c324e95071f4351f6d4bbc77db3077fe4b4fd28f5ec474e9d2ea2bf3fca9efacc1ed41ea73df84d17ddd31f51ed412d03d2ecd17428616ff336ed39493dbb51ea993efa117dea463706b5a6ec4252bbd7525a5cb249d4ad84edda29942812804bb5ca5a291492b5d6babdd65a5fb3a7ea084d69eb6b985a19207f3eefcbf142945a6bbd078740b873c021f465e8195bd40287c82a1026f100a39658041c120f213c03a11816ece18bc0a86311d0876660533172cc025f458cb1650c228b0cb6bc05e08b7e0661c6968f715f1d97a00fb5400db67c84102ecdb02712d22c6385495a3a2595b27e61938254920542e3820637a8ae6c61c5997a450d2ee98cae0733d6e4d0829a43adb5561dd81c542c11a8ba484d81820c18d134031bd460072796a05e10517be0806a731b4205f1441a323d5833704825692b488091c314293893431850c82eaeb85c9c01020b986146cd813e08a61fa99b1d90b698316306f26c6e674ebeb07cb9cac03c32e6e00d4d087da2a69312d9aefc81504a2965bdf9fbb561841d84a2505c00cdea05a00b019248427290fcf9a07c8970f856ecf0ae7d781da1c3bf051e067c012f177e2800f6c307d97148857cc18770f822120eff04e8f02c08393c94270c48c0a144913f5f130b4f1d3621e0d961910f3924f2a0c320ff6152618b017e806f874d2b3c75f83515e0d9e157a484c34732f2e723a2e5927cc11b397cfc42fe7c418a1c3611bd0bb596912f49867cd517409f7a9d31f017a3caecfa28a64c7d952f1813c9c817c021364731d58ab59672d9edb35b2dc3feee69d7823e57c7a5ae49a6a5dcdb674357dbfbec6aef664deceff1afc6f28573fce14f71ed7b3b2538f8114b37021438fb1797602a95c588c56adae52e6ec121705b6db16427e4ec387f566f5b8ae3ba221ccfa1ab38d9c3fd45d9df1457a577ca989a65bc21fb794d4a8fe178130e3d0395426892147243adec35529ccd53cde56c9e69e4eb862ad51b7942654185c6d96dfbc23d51a8ce091597d516ccc4d26283e50610ada51b1e709472925c9ccd1509c71a39d4786974bcec50a1a3cb0e343f93cd6832005086e70b1e647a8cf120ea25a6078b0f9ca05c7e9cf1e16c9e6640d802630a418b085846e06ca64004e16c9e68e4ebe69b10cee6f9245f37f7d10dd93cfb06c4470f10204080bc80dcb46ed8701b10203e3e5aea0201726f06044896d90a8290114408418810988f8f8f90880195a6bfc9ad9c314b6391af8a5bae1db18c9005c3583d527d646aed2cbb37cb62a09bde52aca97c6dd9cd0f80adadfa223457f4aac8d55b6a7596c5b8713b460d73b4e02f46c52f7ef922ab8f59764fafbecf3ebba1d68e5f84dd907d2a73406b47fd4dd9574f69ed98e9f845fe7cb41b8a5fa895765a0a63a6fa64d0da3bfad1fd4531bbe6c8f214d8bef1cb06a486fa4a757d9623d1ce6e65c36e5edd85eae805880f187f3a9773bd76762ecb2df9aacf9104cefe71bb56224bb2f80241807b491623803e707f5b48de7b513856ca6eefe918357beaeb925e8a51f255731481618cd5323beacfb5a18f1af88b513baa4645b5a40757789c00771b42618145191f5c808a170a7085c203344d6460c134051630b0580a8389ef2d9376564a2b9d954a2979a49411afe6953f334a29a994f272369093569b5ff313c279b3219c509b32c29b26ab66361a279a29291a0821a438986dc468a6d2362a3d234633319aa9b48d4acfa06a6cb322118295ceee55ede479e6b287e59bbb2648d7b8eebd37621a35b95811850ffb834f104a0c0a9ca298d00006d03cc1c36cf292e68a2536231ac8ac5146cd0d67ac985cae5043857ca0a905300853060c282618b7032ce056adbde280167b75ba5a750087bdbaaa4bb282647457acb1bb735d920e7eb9820a1d5a3069a82b7088612079e1e588e8851559d02ff78c0d60993744696ddc0d285dc08b316b54c181304e40c5ec54625b0e6cb16d6a5b6badad628b12363de5a1034f154d6c7b2d151cb0d65a6be9611535dcab04864958e67401cac53e09319d18a14622c91eb8bf8ba948c1929323a27898c1131531d062861717164a2a8049188f1164a0870bae1b82d98193193b90c247961d6851811d98000736c2e031c271411457ccac59139b37aab7d393a79e8c41d86403c71c5faf18c5e002671b424df18507434031850a5c504a0821a432d628bb9871ce99d93a29a5349b76d639699c73427875d8a69c137eca0c3999e79748e78c311ecacb28c116e99c93b26084c1e61ad8a54c770a241ec86092228d1cc6589a820725319ea600a20230589ac2081ec6809ac2e90632a26a193268c0e4400d17186f08260d1df6771cd2c08018692cb1031ce016b918bb18a59c52c6edf5028128683e79f5f888446e76fd5dd3734a2112ba604bf92412612182208fef16391a6f2bc7c2b3a8c50d053b5c601965193c378c0c782106195e908f686478216628398a9297d4a7f6b844b36060cfc33875f001dfc727e910e2834f332249b821d004726965308d724e55d376d919c9d8762dc7a739b9cc1c9880f69cb71b45b24408004a48d769bba9018ea773de9c118b04c9d79c954a092f9c3d70aad9828a405953546ed5d4da2a9b3ec218dbb2d67cec7a043cb6ba2b48fe84005fa99ccaf52134c15be60440583369a780ba014e6d0825451a3e8690e28c1460ec6e432829a2aeb665f4a9d4a65d0c8120dc5259769ba57eb56b7a48ee2f6e6fbb67543f9f42d5d333aaa74fa16a7b6f964d2b76862967187b6b96e1cc663c5b4afc7876566bfd3785a7d6ecf6fe8b99f6ae1e82f2f54de1d936d6db5cab151ba70e5bab556374b58838216a2bf5dda44024983e9e9eba4610a3f6b25bed65ba08ce9e59290f4f4f4f7018f18293524a338dab9e93ca182319b576a952d62e55c71438be4a69350c744f3d05b6e52c82ca1b1b3480e1c3e0cb426b0d1c2fa7f0ec18e3149e3dcf13a714f16903f7e9be60eb42afb843b463522960e9b63293598aabf976d92929678c12069b3adff13cf2e7b6648fdc1c2e93590d60f9ec35f37cc600d77f98eeda35a148481084792a9b64b2ce6d730432ae7602d011bee6ab6c4277f6fbabb1968f99eeb867e4991ab73c805fd76d60082505d37e9a3fd58b33a4e8210db659e3c504c6673e4872c1fefec396367cd0805b5b6489c2cb52144cecef4544e103de36848a62a9e5a262a622a5f44a09e79c73ce39e79494d26cd23969add44e29e5945266f2be6094c6ef7b5dae9b35b0f8e037ac5f26ad36bba9596bb5f225ef8f311827ca7fb5555fabdef5663745b53937eebe6ed00666760c7233b17bea267bfaddd45aebeb9ba7347f5987ba5258bbd93247a98b7694d65af5a5db96c6255f50c5adba24f05072f3aa99bfc9755be0c8d9dca8ad16a594bb9956df0843d549c9cd0be16d3229dc340a21b4787230c0f1355575f637e7cce8cdaebdf207de4a7180a5a473ceade3b0d8b009f8e5527265e008e19cab2cd35524105b21b1c6524b2b0dd4d635965a5a69a0b6ae5943abad960c5bd7d0325450c69a32ce9401633c53c6cc4119136a4d171c37395a5bb5569bdda036752e417e7435501d2c9ab05bb2cbe2a214a4c496ff766cf81d48246e8920c821104875a82ec378263b60e7248ba57494d9338613714b4c8a4848a94deb5210c5002865b48debd2f2a203c5a170bb255b077b71af1712a15be7352d15bb244d97e7aa150eee82b9588129dcb0eebee068c375e1c2850b17c8850b9c40383155c76d5a54266f78c117632c9960192424a41b9aa0816b820ce73406eb092b5450a4e0c6179dc4b277ec8fdbdd6119bb3bedba64815b74832203504f8800a7f9b89db556e044164e423441868b04504d54e00699a14698113c098162424c1c038a1928818118bc98c0024b21934503496819620359d81c3c80a4451f3a5cd26c7afabb04984d8f97b0c1a63c6c8051118c0ecfa64d6b36e5e2b4e95d9fafcd8383314a9c804c53139b5eea005320586bd3245ab029941248b82e165603aee86a0527581981034427040e2f749cb1c9a085458e0dba2daea441a3b855dc242db57ad84a80a30dac04ce96ae0d17746d58e1eac1b526cbb6869a6e0d3170769093a56bc30cbb83141b2758ad41828b46b5668bba0136d4746bba986bd4c099a00d1b562658b3858574c5f502098acc0b1acae03594e8aee83ac688d41536c4d8aea051c65e69b9726c08e5010f4499800607f07737f528de7e105949795c3b50603829fe04d20e537fb2e93fd134edddbfdea5bdab6f2c51460aae6042aae2a4e9abedb38bb9632e45027be8efdd6c96dd669aa76a29b019b5411e3c81644c27661ef9caced26480716c18e80e627d09910bbf68d3de3dbd8c3ff29c5c6de419d9cf6b8fba48fb165347927b11eb9cb6124be922ed5d113ed71dffeaa26df39cb05e5fc47ad5de2dd2eeddec292df0b32cfbcd32d6b58d9b167792ce98bd5eead888754d7b29dd2435fe91bdda357d548fb5778db6b3b41f79f746dab973fa086bef6a8f88c5fa1136d2479c3ed2ced2de2d621deb2a4ef7ea22acd266cabbe7aef69cb058f89c3eda8eb7eddebd11fe9177b551f7edddb7145665a20c65f664d7f20bac55f62ecb328c6941b3278b58e42b68674b4c536a4d1be4d956abcbaf3a1b1b9bd56ae5c47b77239823078e635d25e7385ec57b8e5b8949d8c91f79efa0777ca39cab728e737ed4ddf3debdc87b77a98b72367c2bab17b5be7afceac6b1ae62f31bafd2bd752b31a9d25558c7afb2baca4a0c77c72fea8e2f8f6daed255726ef32adebb5b896115cc717c231c57e9a39ce3c8398e1f79cf7118935d124f7b91ebaa17e9b46ef491cd6f9ca5bbb7eea55e74f3d58bd4c70c7a4ca27dbcbf70cb6faae7dc087f471fe91c3f47e7f847aeab72b2c77de730e6658fd39e13d7736ea4f31d9de7e8fc4875d7a63d4d3b715d7503b8b4a7dd4aec06d0d19e86bde39cbbeed2559c8a5cf77415a873e81ced11b9726238349e3d32277b9a2b7b5afcedbf6718cb89da8b5bd7dd888573d63b9cb37e74e369ddcdbb1be1b08ef38e759c1fad7e93d24e6ebeba016eb497ba95d50d80a359bfd15560dd9c1e91cdbda2ee30c624de7eebb2973a8cd9642f05e4053d4ef51f8c2a923d267adb2cc53ebf90a1e46c639927ba70810e9e32ed31a1b7b75a4ad534c6b2a2c9951a2222e882572f3902cf675789dcf544f2e7a2205ff0dbf69b67fe22929ddbf6cd6e5151db3fd8e6dab66ddb52598bb0bd7d9e955d13c8357bb61c047decef9c73cb36752d9522ca02a77e9ba4e007a1b8772b9b1cb77803db1cdf86e3baaee362ace3ce3a8c6d94734d208eebba23d6b9c318c775b7d968c7499b89595fddc8c6e62b7de4347fb4ba11be8d66d91cff88f5d5eaac17adcefad445f8361792b24b01c66e646f7e35e75cadceba951b87bf916d329c3dacbca93a4e952f9e3d54c70af0fcf743bfbbc10e4ac2a8e9a106259a6a30c40e492d08030653982fa830636fb03a2d68c286304a6394400aab0318558c1b5610b5c54c0d586ae982dbc2cb952bb6060f2805f50086085090051a25184115b11578e0863ddf72cdc3a0b2508305582e13e6e2ea722faf27a8a079844e912ff839e18c9762ec72fd305850107d3a3229a5b4a5c33329a57386286f1adbd4b822f88b4bccc7bcbe809171e67e3a1066308319dc6aadb5d65a2d7de40e63174e7f3344cd3066b395da0f8aa182c6d7b64f368535b395521d635652334869b3c43441676064bcbef818971809effa8179a0b4caa0517391b09274c5a5a02818547c8a5d2297c804d1ecbab4e76193d8658628a6e8c40c63b643910f0a92d0ce9066cf25f055efc248544c970be309e565cf29e1ebc99e8f51863d9fb62836388120661d679bbc719f6bab609324ffa26cd5b56c73b86995feb46df3450922e7375025e0b259cff1b2332a809be7bce626dc59df62d62eb3bd0e13e09bef759800cfdb6b9afeac703902d31b8ad175d80920eaefe611a05b4a8edbfbcb62e521eddc6db04d86d0475bb1ec6a65594aa46c36e3d8617baa57aced3677dc37eedd6137b45dcbdf0c43da59f66a18ae24d25c71336c284aa4ac0eb7262db4812f6c7889a4bfbb39dd1d4b24782eaf20d02449ebddeaac434fc926a5dedac36f96bd4dc45ad4f4070314a41d03dd10b0f138373404ac705e8e81f5ce1b92c27dbbd552585f5d062dcb2d7f43aac3a8bf21d576a1b9cdb0a36c2599d35f448236f90171d35f44da753b772119f12a07cd9774c1107713d5211c426f1f5065775f6596a6b79a9eb03a2b4b4969ebc5572fde3ea5691886b6738f7a6875d6ed3f2b48dbea08d06df5d097b6d552bac32ee7782a47a4cdda3547a42de5e639cfa199b09e73d90ddd3ca789eada6dd6f2eab06372f39c9c9c7d31d055f68658bf39eb25c002c505991d332e764d6e76d4526c0452dde0ec7532de2a8abfc16e88fbea36774d589f8da68756d71a2b472fb3dee5cff5c9b0216641c882c75c406d94bbc9ac1bfd459b3f6ce1d6c9707299953f2b4838ee23d2bc4b37c9defde6f84ede6e471638daa7e2eebac76fac5fad752931d0ddfa77e3f0f6563f40eeb8d29fdcab6f5cfea06c2e8a2a43f1b27795cd0b5bbbbd97a1fc91e190b5ba71564b47206e9ae48b9bdbdc856412ee5df6ecf190ea9e3debabcf72df70b657e5d50ae7eeaa5577782e7fac7faa73d7b2c7d24338f7549e6a75f89caf3cd5f16d6eb377e3ddedb79c7c739cdc3ac769f9e639593bce8da6a9f4d0cd3d8ebbea387b9c1e627d75789ce377d95bbd3bf7cd266fc7695d95bfb8556f1d276fbfb1d19f95bd1d6e57e5ef861eb2b9b7fa567a8875acfad665acca71af6e337e97ed6d32ebb01b6261fd5959e91828d7e5edb06312c28e31c429735b1d01b9777400efba430b1c0fe7032c7c96e385663774b3e373e40e33738bdcfe5a0f889b76f837e32ea5303563fc1253293d3f9d9de97ba189e92facdcec4ed8ae6961da94ac54a7dd085d707c2a03c2f12c098eacc304584a03b27fc39de9b8458b7c55fa6d76f84d38eeb5c7b93d0ece715c38872e1d97628775131c1db1e4fc669c692109378e2cc9903d395a96e1e814570bfa581d976aa10ea894ec98a972182a44230000000000d315002018100c09450271300e26b2aae90e14000e7796406c5099cc634990c4300a82206300208600630820840064942aa20301946a70aa9e4126bc9c963159da9b7e6a1782514880c1f32f774369bf5052c700b13e82cb399fa52af277b9f0d0be18b0876bd0d1747de2522fd6b50b1a412694da9fa8f606ba690ea60c289d1859eb9757a711b4702dc182bd32a8bf5bd29f58d408607197163c02efa19be661da82597e4de90c15f52dd204b4dccbb155ba44abc55220889d5250d440e75fd6a27da565ef7305e2b31502c2c19f7d8e10781857526cbfaac8d603e3898e6577258a12a014bf51ec1e95ca69561c00a6ddc5a608be431d301860c8ed0e9787ed2406c2825bd58d10a623630f58985a1801676ad2893ee0aa3da594a1d5b4b63cb02e826708cd6cc5497ba94dd1aca2a9dd5dc3dd3ebba452329d7322174473a262d4a6f510c7818802106581ca7f830da512e18d059778e5591a15aaba37ea057c195b8ab37314dfd9e7993adb4ab593cd51fa3c57d402a5b839d5d9a2492cc4404247883acc4420601484f3c3e32509d7f4d2c15b8db31be32fde779d62291ad12f7c08e24d5c84601ac8688684c6819f30fa0b6392a7619a5db3e8078d97710c0c3f517aaa1510eb405bf551329e288bc2ff9056fa88ca11fb7dab724506fdd8fe764cae53dbd5447e6898da82e3324e87191b76b3fc09ad65d42f271fab29f0b484c439502f24c003fc647a0bcd03911591df42bd02406a38b8924d50c05a00f190840ea00711de30518268952e84556ec3413eb6469482923289a966e568a7dc7aeeefdf159baad3f4b8d5e50bde370db8674310eb77e59379d9a708bb8de482ce0fe90e0eb41e9f366bb18a15b55730320d591aada7180f4708bae3668f6e0678307549de09f455d8c0b6cf12b9aef5a36b5c8e461425e7cbc1261836083b22a328e9ccd70fe11aa5da44b57014ebf535d503372bfe085f122aa26f168e462e048cae005da3d801e6ecdc0fb443e894dad8b204ee41b52f491bf611459364f61598c5ed6f56646f12232159dd37a3f51e093754c77ff125fb62f8a9a21c86073ed636a8306528554bca2a25db1278d603e83e8a7aec0f352028a6792710d15705a2807129821033548d75ec52cbbf0c7ccb466dd056e40db05d28c9066c9710da27c56ab21b26747771cb5fd6ec1d4afd5824a310322a27c516079ad0322ba7f33d30d6d017b8c47e0c635085a7904eef619e2333c063995a1f648d4af8bfed8937aadd61cfc061820cffc6434bb763c34a9469f74464d9b11014c0d82b88f6c3275a18af3fa2b053eccbc81f34f059cf05e5fa10286f6b4eb64fc53d442c55ac87a72a648b153e835fb66d132b61ad1adae757066402db534052afde3751c88106a10cadcb854350d5eb2d0a31d335feffcc303e46f324740124ff816f40f4aa2d945578ddda388c22a4bde6fe2942a09285cfac04877883264e0de93c8f505097a28be9c0ff28e7fc4ac6c8de4b23292e46474a3888090fa88f0a431e962ca8fc4829dff3d90755f0dba504acb0ff256e4643d7c8a090b63591f5d81e4bfd6b04b0041be29c93317113bbcfbb55815384933a3291b2f08297ed41297e88123c8732329ddbfc545915e56a7550fe97e658ced39b28d4099f935b00b0f5e443b20b0a2cc3f68fb1b4e3f42936b35be4836c0877ab9486a0f5081f347c59d72f0940ec17b1deb8107098a7392149972c8dacab1655b33e7f99a6adb094374b432c0d9298a45e82d9906443b380d9063ac1eb9a80363b5814adcbca7232f47d5cc19b98fc726f8ae8f807244683456a59b43994f645e2bd28e0f4ad7926517f646f4998c70d332c7a56300922c1a5e3797e0729fb9d1f8aff46695713a835c773c1451123e07a2a04b04f943c88c9ee0b687c1d6aeef18e71e4a3338505bf8109201099ad46bbf7c2837dda08a6ab02508bf0b3d5a1ae930a8ef2c208a23340ed3ad630e46967a73cb17c45e148f5c1c9a9cf4065f9ec912ac3f9ee6d11830f61eef026e2365957a02f820415dafe6ae30738c188b31204a109a36d95b03b2215fab322183f36f5934ba754137d1b0ef3c4afa1758f90fde37819d434b84c74011bf0d6f5883406a5742946e507d3c0e5bf204f09860bd9d2f2ce7326f982be1383b0d8438443745c9eaf514c7ac95db1d521151327b6c8d50063ba8a5882fc7372186824a45a886b788000e2db420d801a31c8fa1d76bdf45f84ed82478a347920e89bf93e1e4fd84ae03e90aa43c32a7c4da37295fdb19269b69b50c0fd179dfbb1f403f33e297b3bb1df44318c470ba591bb154592d76eef54e5b91e54aca063f1505188fefac26c045bd6d53a82b32c5d48e6995950a0a5161dc71ae261c9772400637b1f6bd1d3a8c2c58516d98523e787c62e072c7f421e206552147ba2a8286f120fc768f8504ddd869b109e1929ce61a2c7315011398dc6b07cf5f9f80647806d0d56fc90fcbd6967940dee1e67a841c703847d26dfc27babc58244805092230346d4b6c81c9086625d49577f793a64fda86db5fabc144d5e47de5513b60eeccdee0159c5786939a7224193acaebdcdb915b3ee50f2c71720b3158c7fd940343018f99931b24577086451b9856323104308868701b0ea87945cba099cb6e789a1fe861cb7a2336cef279581d2e13c1b889714b908074e2028857e04be0ba074e77f7edfc0d4022476e3c2034199af049d206ea9da807521d3741495685d4d77ce4dea8ce1854cfa64592bbce8da72af921d075f4fae73a15beb57742f29773af7c84e298ce4496ff7ad524ad47b96d3d46057b4db5d3de2bdcfae76123ad6456fe4feff92161ec38e7d4374d572448732fdc518acc302e148ce9b98951f47d092036369e59f3264b60ee3423cdba8bd1c846425ba95cbeea80b7e3e296b0badd524bb8dc4152fc7fa8e9f95434e31c54367177a2960930e2259e490e9b3b03298787912c0303d3b43585bd119e2686ab6899081d3b6bfcf5bd4d23a10d760879f7d574848956e50e411c831b2e5e698828b9b6171471dbbcc1f9f03ab5c84d9d5f7760b13797d82e5755b71f7017e7d60118f914b1926e8ef11c59286b602ac20fadb597cd132fc4c40c4594d3b7acc7e809402db5066463e7e5d48c3d8bc678e8519807a0a8bce6ad127a1e24d452d4ca096b373390265b2954b8ccc8d4b974fc361668f8b47580d2ea00c879dc83e700c917592d8b91167bb59981a29817f69b9ee6a806ff97ca8c821180d09468c0106221275b05042773577f7eb8fef0f3fbf7d489b68645de51e027a1a9b1c9ccf2616f613e654ecc0082bc844467a52a42f2c00c1ca99479ca6fc297dc4a235140cf204ed843676cac14cc7e770000d6fdc65404f03142fc37d715e945950341ad1c755fbbbff3702e311cb9450f23aef20dcedde5e52e6f02e4bd2fbe7fb0c6882ae633e0626e0f7838fee265aba10dae4817d1eb425c0d77b1a57846c2cb6c15bc93833a7cc250ee94debe58db9a8c0a6d83a014bac2555eef64801b548eb46f7ba60d2993688d86fa79cabecaa0721be4eb4f521df625cf7fc864c188afe2baafcd7e99e3e17730515795485e99253cb35f7b10075c878086ea5b58931bc33e6260535fcf1cea904697353ee7a66969854768685b721c4c67e97f950891cf6631f34016c8004ffa45ff2561350747fec1604d219e3b26e26de4a9882b55494af9706cad4a88f73e1f9574cfcb85db1e183137ccafa14d378701222c9be12f621639bc9480cdea0707a13208a91ac6b208c9d1f20981a3163c3da617b87db3a526af0625acd3331a73e0960c6110ac8fa81d80baa82b6b5480ca1353523f79f5f314ea0a8334e2814371860230a1ed33d3a98efb10b4a7211e67aa1c5b9908ba1ca54c57c877c42d66992ca5e601bb3ad8c34c9d8305b6554552cf3de2f6f15a1ade069c88f83355cf4a839a04d83c11e395888b6275f71518ff1a0679768233cf483ddb2bb3d3e326e6166defd884c6c16b208ed2eeb989469529213ce01b111826905af023fb7fd6146df1277b309dc28e102203045ce2080d9cd81677fe30b1731997effb4fe988f0b34f96c8920c117e18485cd32eaaa74c1c1f84dbeea2cf5096d66ab9cfde0e65cb24c82554e9165476e9d4b935570cb0adf7fe7c15951bc03c26e12295d8da204220424782647902575b6560e172535669f034f5664e8d9389e9d93f58bfeb290c4b5d39084f924bdb2456a75b7dd6a568be9531f0a69d372011842c20567a6f1ac496c63ae4f9b48bb1d285a412afc67284a350d5bfe18eb049f43268b998e6980155e8f231c49a5bd4e8d4e8aea4b2ea83d252c156b08c973bffc8b4498bc9ab33bd5b0fdd317e160b031bc5753b6950367b082867da2d11a5d34c5355dd642993c54b5feacc3b1448cc72f0ad4df1159ea12335115e7bafb71bb0d76af44c9bedc2070fcbbfb36fcb88ab86684929e1053925736ad2e88011c731b293e0fa73c202fab60adec36dae4cbf0252d6c46ea76cbf8d2f59122ba5c01057595955ae2d9acc87ab821c423460fb5be1034fe9aeec9561adc80d95387d82b0e924c6ac4af58f31a20541537ea762b2fab57422b684ca95204188d823d2f7c9c900e0ea445863343847e43520938bab887d81538e8eb936bc4aae9b8a9be5f18cec1ad2cf1a767b2030d5f1d85bdcfce8bb6d21806c9e7f0b9f77b86be6f633d91ae2ece2e826ac4c4e31b875e25e476b2ea89894b6805d349bb99d41c1108cc84af010bea728dc5768a9dc8a3d8f977299e0f76b3ee3bb3d4bd727c569fbd855e410b93475dab51d61e42a40753011e3190d58b53e4f93b6d64fc384e2ecd106f16fc0afcdfdd70849d953a037b60e9eafaed1768446fb468287d11f4bb42601f8e3e41841ac58826c6189acda3fd0a70c9d7792f368791418c8e39e4e26eefadf0ed092784ceef4799be02370b075032c3179aa66558db0a2397d5c8a87b50ac49661d149e32ebeda5b0edc419afa4c63ba19e6f71eb3a1c2d2b41d5a4e357eca4c3974bf00fd300ff66722210ebaa53fc0bbb239ebc3b778e603c36337ef5deba04ca0c9d388a917907ef7539abd1cc32f9cc4f364449ba01e3b7c11dec29590ead6254c078bc35cc368b88a9074775575c4b084718b99af999e57599e1c1f619a740200aa6caadff73508544da8729054cda08f6c93ec723ef55e7a737fc8d35c10d6d8ba7930755c01014d1a930faf638b151c41a4d93a982645264c9c6d1a5dbe08b4d937bb900e7acb4ed2560731fe6bda0f946cadcbf4708fc2e0a2b097b0f259ccbe97460416baf5dae28bce08d04050bfa6cf886cd577e3604a42af3c3507587519e0ba5dc98eae3c1e5e95925a5de75320d65ddf7163de8d203d00d12cb197c4e1093638564893641620fb3bffdefc88119cb59b7a4790a5cfaa07e76f1d71716da62bd8c250e082ea9470df3d462259532917fc00b5fa8d9f9eefc917de2483cdf2fb5f6a34c0fcc3bd0030b7fb0661486fb452f6c508376b55ea3c0512aabe3cd9e37676dad4f1119aa4cb12574eaddb5ab31a4f0caa7bb268493cbdaa9e4ccca2e1082565e55b6a3d7cb33282a6a14e64b95a7c4272c5a6e43b1213e360e6ed236d447082d97eafa04a58645371a6990a78a2fda40f12ad972e1e5d6aa9f0cd3498b93096ac25c89594dd6f262e006f185e3a0e811ce53433dc0cdfb887b3856044e7f3e105b0f046f564fb1c9cd8820c381dc287e714e0cf0e14289fa7db38944ac40bb9a15b285aff73643e5a83edceb5cbeda46b44503638bd7fdced406e75a00f1012f6742c4395dbb78d0b62073c117525475de6c41a9979a659ff6062790c6cc20101e43f59026320631cc26855fdd56bcfb43692f9e85e9390b9e10d720b74c523304a049f6d5a25595cbf820c52a41c5b683af0081a627181712e3597b6d002a123d6a054bfa532eaddaa1f9c2fa43297d1db09da529ba77277c7fec848d095121bcc1fe0ea2e4d71b7804deeb1194f65b3a3defbdeb6ba0e8d7be27454f985105883d9f19c009c25ed2f558c8552055d4fc4e7beb8673e5feb4354df06238859f31b5cd5ca2c1985e9d7dfd6ea5e4cc78b32783196a30052813c453d402707c9dd481d22d66a6c454cd65959d106b3961c1fc04838219b66f3a9c0d745895f849a2d68e8bdd2768ab90099289e4ff875b174dd9d0aab3844220aed91f4ce8c8165a5cdf54cdd40ff0b4b683708b18ea4264ec849a159cf2500a62320c49be9d0908afc423d8ccf40f6f16927c7c9e029ca1e27ca8963c20a8f15eb27cdc542102bde92dc18bcab89fd3cd6689f698741cb659681d73beef9a44d50cabcd6ebdb92a88f164b6352d93b05d236848089ee5f1a07598f33279907e2c1b9fc55bb73df30945321dad79a141916b23296d07b9d2170dddccf9fa146534333a9985739dd620fb3bb3c88c2822f7bf4133e9fcb6cb960605fcc06cde5e5b94186d045bdccd248845f7298358e49832b4a3ce2c0238747aca0e883ae39af6f4963ab029ef3d78814e6dff8220f5ba41be765470fecd3209ba44955d00eccd9fb924ac175967c264c6a445f8fc5ef76651d571fc7e4ff731f0a564b408835144d87b883d7aa3f24750404c06d78c9f065b57a7033331883a26fa1d3de69aa65f453f6f732b623b23a21d6cf1fd9a35ed77b144ccc2cb0ae39a7b744f8eb4856303818e5c82d2018bf22a3cf078e359753930dea267f48e4e9d3db1d5002706c724e494e462ad471f7eccc734b7dd02a384c4f402b662ff33c35be93c06889897d57657e7977dfce32a0f6d02ce3adc77b34af9f22263ab404f88d1d9573e6a1f1b1607927e81fd79a4d1e8ddbf3a2c8e1a92f8141a22c1a22554bc88ba5be93af5a54ab608d1fd8cf2ef04404b5f8aff50c82779c3e0e68150535ce4e04bd97aa28541bee0e214e14a204708356bc113cda25fee0b1e50b9c00645de6cf6ae8c113225a3274a6303b34aa7408b8e5c5e35c5cc80f10f24cdaa6c87f18b4774405a24e301b712408287d9e48a72daa726d863790fb46dc3543c8b7cb7a3a1394b70afe84867141a6594d2d36040908abb65d6eb539929de81e27217e49450411fba87c8a175df0beb3f81c64559f45532bae17626adfa837056872bc8f51628726817274d0c17b6703aa0c559397133aed1a7b12bb1d6029112b79cf5a26529069098aef22f0331c814159d4bae0cc91db603c5bb0e3481b479f951c67a06f075937d19a4e2d4cfc7fc2e604f59c383a88f1775fbae93a4c22c529a4581a0ceec498a782cd6bc6991f4c08133f7b14a866a7b13861ca448d738ab9a8e60a2015dbc2db192097bb1d87df887f85cfc2d462cb6e1c54ca4090374bb12e91d331c83da119cc96c8dabdd859546c3c69be55a6dd44924ddc6941e219f2880595749d9d70f9ead23a6838d09a5c48cfb800aefa1d9978105d344d13eab180a0e578018e103145a6445950fa86728cdc7c59ad19a7030f34b25f27f7fa0651f8b667db49140dc1596c6fb969a6fd2b99d1ca04e3b380172b77aa7262d428127937d0d8dee9f40ca82450a11a197bf7c4b5db0b1bac56f7f28d629cde4694893d7ae88b29a01bd2a2944a8afd05fbc0adcd3c32e58047433ac6449c48f360bd922d28f180b8c88629b92a95bb77501769136a98b3f2a12eeee8e53804cd74351a6b2264c2444a240b25c9330580d820ef0cbd726f6e1749f6faf279e37d1663976312a4b485f1e18abe117d2ecdf162a1d116b18975bc27b6e806df24cbc0618574485beab41b8dabcfa9e0530fe93d20147ea837038e13072a496be7c23ef60a074574888d979b6a690a4cdd5b0f67921f20177ad9b782d86ac95c2b4acd297fd34d84e81be44750f0503ae406e6d909e9d0f46a9009484942124af377600b4a3037f68948f14240406a38f501aa1257f4936d3a0736288938b80a2110c6a2ad1ffe29445959a62ccfa95f719235e4cd94c83a863f75098cfee97cf6c7d5b0dad3759b35db5ed8128cd0322919e2fab0b7d08ecc302708b99df12232d1c824344fe3670a0c21534f89e0bdd2f7740dc2ec794de2728657cf141e0456cbe33026be29b8e544f6a4e655bc6506cf9e9540d80a3b92bfc78729e5523c8f06d4a942d72fb1bf7cd3451a01c0904e7980ee45956d23cfae32144941d336cd397e37d509e6124216742ec8548210b9a6c9cece18671639c6d704f63bb6565f7690f7678721a690af9fc2987d0548595fe30dcecabf6192d83c78f8189260caee6bb691d9e5e1c388a1a4089baf06861450ecbcfb02efdf7cbf0a8ceca30eb394388959f2f2375cf46470a9dd6671e306563d697e89c7b427bfa7897273292062565a4b0a3f85fe76a015cf2ed6e4e33417aec98284e41dd54f517c69324cd5892b9cf478a8440b876e37d2b6bdf2d6833e91cc56071aff6dd82038f0a88bc643f7a64bc074518f8e200719813b7a096f4e435f632ac612c6657a4ebe74d23aadc5b5134dd160a474a1a0034352b1daedddd909917d152ceb277cfa11a74973f15c2803abc6d71fe45cf1a879adc8824246f99a8c3e00db7b29c5e1b3058b7878fa9db805fe1da0f2aab3e50f687b5aac7023f69c779d41110cdfb54beaad3db9b7e139be161eb7b381debd203c96d3b71dd5820e229067e67bc44cee6f5416fe2043f70a46a9ce7a88a4a41b037f501374cb9968144aa8606ab69096c65d3b6a6d6d9f9bc845e2d09011a0961b64011f35a737b46b4679b68599013b56e54b5e277eaa384b819ffdebce902a64b8d002c094124e91e1f17d4b2bc8c20d23510b6c9817e45ba782a94284683fd4dc18e474dbb636981adead3251354106dfa25c1ce77da0c0130ad39f1977d592629e1125846d6a56336a105d8fb58d1ceb641ae013772cd3ecaf0b48acbc4bd3ff9b70565709f5989960397a587c4812e8cee5d01e27ece34f5b16bc86c37312ef8cd7307aef4e6b6b66ba1fed527dfd5ae2d9c77f3ae61c6378422f422e9ccc85541904d391dc4fb7a0153baf24700fb94965adf575e1596c694a3d3a381c6d2db755f630c490017e9a4ddbc505b0bae695a6d42dd2a492782cb59c5d5bf5922af9b5f3202120c53b3eea8c9f2021b0dcc3c943e1ddd0e843a7d9a8ee0ced8dc87a668f6deebfa164db991e1b032fb462585933b6751032b651960d0f2d026eaf07565ffa40cb8b25ed15fe84544923eb111e29d2efaffdbabfee193a5dcbcc5c30def70bd7f585d37cadf6f2a8897b0a5ace33f8302b64b284f547a59ea976592065a23280b35f2780231becc3198b035913e200e6e78f38a3ef9ae646877463bb09c326537937639be1320652dbbc72cf2b645055171bc9601cbdcbaa70eadbf64c54fde5f78c42f17d03351f529b2f3cc55b1bb9466889013c6074210694ba8c3944ddfa8722929e668ab163625f7cf03d3a61078fa779879d71879d9f35c1829c26e55e83adf9cb255ff4bb0ff7fa237899ddbeb2b71fdf93fe59de5f6418793464477730cf1faeff90781cd1ae17df7ed625dc71e3b4256547fd8586a819b0f26dc7f49adbe7f09fd7260259d5845b50c43071a2b2346410b054df91ca0b1ef371adba99a9d556be71a95ad49980d26185a8c6ae7808a999a34bb9375b423557648d6ec92d1a68e8aeb3152257fd3573477ef62471562ccc4474707c056d612e2f1863fffd44a0685990876b1a7c1a6c68fe27a1127102413b432700ea794187c6f042718ff6f6c0d5a532514fb5c83aeae80856d64f0d5c169e4119e56cff1e2f878855bf37df1a5fc22cc0c6c98a933efb111054a7538bc1c32976eaff63040876a34e60eb67e442f4c126442abdbc764ca1673e9a8a45a766e22c30224a2c41bc9a86b10d6d741837914eadb275ada129bf185b0b9c46eb35afaa91f133d5428d1fc0d251ea7e8e1e9db869301e22078810d9a459a8974cb822724f588298a4b0b25c69fd6888c80b94df1086714c726af358b756f1fc6360b469571aea4556fd16e8a2760a2507d92a05d2eb7f6e35e9ff1ded52175d7b163de694a05307c59ab70071fc791c81f0b8ff979e164e3d0e1bd3fae6d44677e4024273174119f23bc87abf1189d5a34ce780d754415e295301f711fdb51c80dac45cbb17f40095220a97a113c50aea2e979e044aa17161b2ae9289f408cea251fc0a36f84174c70dac9d7d4aadc4c3ed722e7c2ab3362e7e02751cc9f7145af7821fa032d5b3aba9e7fc3fa4e358501eda77ef6138ae9ff0e0d1cf1bfa184a350a85b5fe1e75293357819acdd3afd62137e1ff59077f0301d32eb45ce0f98d46a4d46727b091a64f9a798093b97b92eab9c249b00ad3674e842c58fa9329f1378297a8a75f1f41961ba3d9ebaa2ac65354d92af723edb1140eeb2b557117f04bff12fee3807f9545998edb4cd24ae37ffddda6a15eb750be48630bf0147a7c0f44ed909d96bddf04658fe009600344284124d14327f0724732cd16d26d9c4271653faf0646318bd4c9198fd8a7014341a0a8bb02aca93268aac4b99da82c7e5587e2cd51c45214cb7229cf9b43ebd20c72bfb14f73978d1a42c23e4a19434d1052cfadd44c3b45122ae519d2023d8bc19f61fed2f1cae851b94ee122aed9c09884b283524967ef9e0f80fda203827de0562e198c2e1f0936a1d0dc14c53e4a64e2de08e5cd384e32caf568e4954579c32a2fc83b6aad4adaa702b0e8d64ff2ba18973ee6d49a35f3c805393b71a1c8a3429d2ffdb623b166801409c82f00374482053462dd309db084a50b73f5ee42de462c1d4faa12d3fac9ea167dcc4b7803e2315bcca7a75154f5fe1802291b5eeb94647c580b297d485e8cf17d47b74dc55632fe149cc098dafa4a8c577c0d713db689610726ef5bb95f3e4ab1efff63516dd143f51ae6766f91c826df31f9a80e75b5ee97bea1e04d80677ea5ab55e08fe736d5854746185d1adc0ad50f3867058a3439d6d38618d85018251831d37007818056263c73993f21dad787ed20e203e3673dff800071902fdcc2089529557c86a5b842e7ef5c7f84022a1149122a8e17a059c551802f07cc64bfb93b69b116c247f26b3e6bc5107af75af33383b87313d3ebe6753b6d0682f12a4ad0b79b4e23a8760a8bf7d03fb4cc6e65c954fd578471313115ce7e2d22898892ea363828f9f1a5980509bc78ce5d32e048a0d86533c881edb05847e2e922fb12283e738f69c17d79229f848e923062247ab94b8d17ed6012d258695917cbcdd64a1913aace0b10a61c6c947798f42ec81d84f2860390d48ae9bcc269998f2c79e66ec5bea917a849283c3c705851b90043dc9c784b8e5762c99b03c4696258c194991e64ea43ae20dc996f1f86f9db8e670e56054d126a679c15eb911fc048700299b6ef609c9719e946381850d8129079a058ceb6252aa2322b2dc797415e196663f7cd40c5edb42583769dd8a547a4a6cf0a1d7f169796506bb6cc9eb1e6ab4badeb91d4335e6a9f680cdc4060b9e2fbdb87fe950ccb19928ca1742f99aacbb63c2c0a64d7698f654745d34155ccfa44c18c3a841390b6d38c97c0c2cd0510582ecc6bc3ad17b26ca34a2fb215b1a6e112ed79508be134e09ecf97a84ea5fd9eea2c610e4aa977da1cd9011207630af99bc0ebfb13da475e51a8b92bd80ca80017c1adb0b53d66d009cf97e8598139cc072c423441a75501f6f45ad4c1afdc6b7c18ede322a5adecca571632a7ca23e259d0b3aa7f207305f23a17e45d4a20deb6e684c9dde60ed83b6e121ce158c704ac6ee642644befb05667a4b5fc4c01dd37e4d476adfb6ebaa138e93648f17f90c963a989aae13e793d29e1488050d44ad528692c5ef8444193c4687d984ea17efedf49cd452264ff6916c5c33a5306323adc1f4859fc30df9c4a09dff6eae7240a7ed4d6885fcb63ee56e975eb90915dbe883501308aa36b0eaefed2da7d5f5e7f10e37c544df6f643a7611c9947346b59d71cc60c46a1d5d6c41d450dbb410cbf79f17e202c43788d89b275d838352962450fad12b2348404315c347c994688b95544b9f85be0cb3ebea3d961b99681a5b9bd13c329aa23d0a6d2ca80551323394e1fc76ef27787d0eb4b89606161cdb68e5f538a41c7528bd9b525624db2efa1dd18be7f14e7e858cab45b2306e726789d1776b30347fe90d023495b923b74d674739702c9b9901cbcb9a4e7d3fbde930d6ef6c1775597df630baaf859171dc51d1d93fad28e8a452ff234801a9ed7d2cc2b1684453bb99527263b9a8c11d654ebaa5c4d098099e49332a29dfb6113293932dc50d822bd19af295c1fa8265262dfa0a5973e750e33ecd037f8c76538ad373ad9f63b9e40e4dff4b85e67f79660e27ed1e45d10d710ff4b92e0e0a887bc72c915e5fdbe6a5f2648ac95f163a8edd061bad1be3234b27308c611b91043d99acb0f64ef6f6ad04d56bbc4e779248775e1bc128fe0118e33d3d6a44c0efa759e7d857a77b3436f6f03d455a29286c20e6d9162cab9a5a0d24d1c31fc7db8964be9f4fb6d7435a0f2d165ba0f50010af81e0527a6170e738ac0d3f3c1ffc77b2cd750627a768cd1200c86597fc8d7671a41f1fe151ea7437534874612c25cbe5a29bf7192c5670b807de735659a91990d10938e0cb80e9a3ec6d5f53401f3670b9f3c2cc31ed0e6cc1311a0eea6989f92c9e8ce89ae97073a0e84194827076ed2e7e2e540485e5c5cd3c68ba16aab9b28346116a97cf101c815257cb0012250658c798a256a8e8144d3eb0da89423721cb0a25132217968207a076f8e0d40dc0607358a35963e6e74ca502187012cd8405efe5070064d9f403f79cf56f66a0c0225a7c7a1fa97d0ef6563bb6a42564e43539fc60006a717829a05547a3b5af02c43cfbd40f196ccd5c9e4f037042c46439e805dbeffaa7ad0b5d3018f2f3dc72ec8521e1c5fb974b90503d5c76b1a80404695f710028f69e1f87d34deda7b7b28058a70ad53a5f74eb429c44a52f046500f5fc9eba780256c6961d14835dfaab413b21fde04a2800dfe89096bbc878648bb6880680d9047479687fceb201b1d57c0fba429aa967c96bef8e6f0ad7136670656078e3ee3fbb4d65cb0af1d4f2a0a1b85fe8e0862267f748390d8d45eb1d16e0fa3631fbe0933de0894d3c9697e5ada267cb8c050bf80906ee0cf5fafe4517cb801a1951b17088ec2512afa0f4be5ace3ae61c343c627f78e354bb97cd0629d1a6e924571008a63440fad7d5f69cb6378a2f3f456d2ec4f617f5e8ba8504dd783b650c988e5b49585048602970a1b5642a00089405d71ca4f7b40f617bbf36185784fe04ec4d9b5a83ec0fc96e1c76868e8ffae0e7532d6b7402e5864dc77eadbe9275e403bbea8ada205f2550c50880e9b0342851c5c53007b7d8520847fa489c60b3541aa4c35a7856af6496392486cb14bf83a271a3b693f742bf102c2635b03c601cd23efa33646f5fd9b46fa5e44204727ccbb221934309c111ff8758719693b6ba2e89d12a3ab6dbc7b243f4bf6c8cbbb5d257d00e40f3e1fa92a9b8e9e46493256de71d1c9163922ab0b2a7d0a9f5cc9a8ae335d000918099ca029229a66de2aa651815c8428bfa1b94782f799057549f606fb8ad3d58cf1a37065da603094eea4653bc593ba402fbd7b20a3366c246981378dd291aa7b44442e78bfc2084ffdf38ee82b8d612c7f020babeac14ce5e3ba1fb707dc997652417564188382db5c25be645a6d41b16e817488c1a5120fd866885048788d075226599c81c1df626c59c5add1e5fc1962baf239237f6430c0fcbf97ca33111ab99144d798e18e664d5f8e852eb48d85396620b0f19cbfd12e0d867aec51d53cb01a81382e184fe12b8e90f7ba568dde8721f7abfc30ff322cf097b48b8eb1ebfd004fa5aa9600184ba35118a8cad1620626be68c7bb9592970a2785759d6e86b80a0d39ba9ae6823d4c810a286bc913df00452d023c6e0eb2f04453fd514b413683505c662c005bfdd9be192be185add7af4524807145492000d2ba8426b0bfd8f5de09834e0ea1f36cc59e79388f0c9b695fc273858ae101d3bfd2464bb53854f9a82418dc01f374dbdfbc5655b938c3da8dd6a0a0ef05a0bdf496a7d24a919181709c5ea58313e4f5aa1c1cdfcc38d146b4d784bc92e95c47a132b7023b613795646873fdbce42803e05d0cd01a9456a3144b18020e76e185d232c6edac45aa67b135c050526101ef051fbfca73b21c0a02cc5a9516dd0e04ea10ba00e3fa2e674c251450122b9f63a24cd1f262344f9350647719dd8fa4c24eccbaef7c4768a043cae22a5bf7a659198f14ad7cb7533818cac48bb6fab60a25723aae79572e14d3ce7bb56f96c38ccd7074a86c5743ee6ce79036e66c7dcf7e119d5cb789e85bb10dcab84b35900e4d40d66c1c34c4f2f821968b3923fd314bdeb55be17aca04245380daf4d6624866311133b40e4993951ab5630f9940e8ae0502f8d62678ed5278773c3faf6fdf7721aa02af6bd7a7f8cf2f71adf29087aa8b6b77715765826b9f7cfa73934d1c16c50e8f9101de132a073a7b3fdb97ba216314bef4a53bb8dd17bb72050d5e4a7951a176a57d6a9b4eb16bf4aa854210b7496ab3a461c29ca6bed739e81f59e071b53447c40be7ac99bb6d166de1f99e073f392a193bdaa7eba1ef3f7f5bbe1c9e92e063a8a816e8ea3f3ff2e70ae67c4dedde7c332d6b01fa00b3e8c7b168791d82b8be9a15d6118cee92786ac1743914515100db77d168a298b3034ea20e4a4d5d024a470048598a83695829585f56d995eaf536ee0dd0089fb9c28184563dc83f1436837b83d7cc3729c3e9e10f26fab415d501835712bc23eda7a28c49a63a5d07d202aa2f6fdb1da32dc38bd24110eb63c8102e11d5ed1280b7ec3f741b7da61e7eddd1b044a973750132aee7b96c2d839e0d3d41d506bc4e2cac0d001170cfab6e2aa593b166b19b9140a4f472f02a51d0b38e31165294dc7a274ea029eec584048b2332d551be042a60c59cc91149f59b46162de580a2dd2e2e7d225f60a215f7b96b89968390c1496c075d1015fd598842b8612607d07212a77294fcb0a3ff122eff95e06a5a208bfd4a6a91622d34518b43f5c869335d82009033422fa0383c9a47c21a2f00a80dd96aa3545e1928fc0e47935e2305da3e61e48ca4d281fbb197c0b91c43cc1696ad70d51197847dad972cf9238f10ae36552ea649d176f99f987554654a6b24eeb74515a2e909a2718594f4a3b47b385aadc00ea8c6ea49e2c2f67233f66e14014592f92cb2851836052b393df3df7690ff668a34144b2fe60917fd8ac04d177c3669d12cff0be796aec9e94ccac0f0e024803def499f42c8edcca491055984141164ad60c442a9e344b62ed9d559095745ba141602fad45d1b0562d185e6bb8421ea34106620010d574da18ccfae55d55f6a596afff2b474b8ad57793be1d888fe579e4eb6047f7356e68ee30c442403bba346bcb94d66620b8d24ab0382e818fc5de51b503c6f8485959aef311a511dccb861f546a9f074dc0ed2028b02a44805efd094051c4a1e01d221b7bbac524a60cac58667888073bf6c4803e037cacbd4736bb1759db6fe3ba8d48298e8adee76750e04a2a4cc2c3bb2292f3122468a9b4774e4e91d088fb524ebfd01d29e094cde2009fc7ad0ea755dc1048f53dedb49bcb3d8a128f61c8f6ee56d8ec2355bc5af5e0672a9a0f41349dc3a8abea87c0d9deb8693180736adcdd35e07e75c98941db24d6fcf50bfa9a76055313fd48a8b6f5e2ff3312b9c492c18ce7a02f6cae990e7705512441fd1ce32c511127be3b5c6041b76d3bdb196affeb68a85dd6ae813cfc7ffdd8488ca98227914a2bfd21edd4e80e091bc8c3258540f3a9055edc0321476f940732778d9108ed69971c0c79a603cc46a5530199d638aacf3edd41c8d3714e6d4489f31aaabf52fa0a0d64743e87ee2e5d8f9b1b56365dda61731c39f528f477c2d232d62c25ea7bca7eff94333e9cc22a9c127b9d5e46fda01fe421fe41d7fa742c5a847bd351e9681830a2cfc31ef7dfda2d8583bfa70189164754ed51e284893471c2c27277a98016d5a330930fa3247ceddd90474f273a09f331eb38d09bd3152b1c44f5fba780c90be1682f4315836691597fb9f43e8b3b35240b80bee139034eaf42672b3b19014954e1f04ce9552d915dff0a9492a37f6f5337d4df34fe112d808bdf25ebc349c6f39ecc1cb74af5d09c193d11b3c798f07254258fa60231e6994b609c0a8688d707ed82bbc1f2c86ccfe380785bab3864d9de6eecb703f2119491ac75ece3b445323b0eb24c81b6890d5212664a8eebf31639d2250ba96994685805762541f83e458e8f92d603c08ca8c17ed410f4807b06a68ca6243052dba3d3e6a6e4d7ac1160f9e83a6c4a9653e718fd8a0d5d0200db4f5695ed3ce9fe5d74f104b509e917a9f537191e36ed33b7b42100bf2eea794d8289967b95e7e37d79be102ad82ae718160f1afa88c76ae2b6a617f7e93bc7db88e16793d2ae0b400860a8fc6eda1952c21931799da4d7475828ac4e29daef9c261d69c4e04aecb4340959db8705445ec0069dec6130f1d18a097102dab338325abc82800d14818e9924d351f44f95773d04f1646dbffc889a88bcd28467d6eff739443b8823d9a4cfee693a96fdc15da5a0c17566ff6dd7400ef44e48088d52ffca79ce68e2e23d73458f65bf9467956c74bd504377b207b4e605bbda5c8e6750d7b5d7dff79339e0895e314a3b7bf063d8aed54dbac394b6efdaf477768559e5241082529a7a1208e2fd5ba55d85e992ce90d1c5e44a2b47a97ee4887b4ca778d408fe721d0f9354bd53cf17c969f398a76e721a2f92e0b68e4fb10891dcf060102b484532149295345eefbd4759c0db7d8cf3dc88c6fc34e8193e93abba1622f89840f2d21f72ba4ca447e0b6f73222a32e56b5193ae4f2d2771120d0228072d7218ce77ee8197fc01397ed084346eac458ede2413e411fbc95b91e78da772091de8592d8b4356d43e81d1aa8651e463c219a120e154abab04ae4568b463f104b57296a9bfb39100d49c28cf1c719806fe0d79ee3d5e32619b9fb41c510fe83ec729f218884e7bd181eea68f415fa688c4bb37316878ac5c4c0d666a5d8135a3d6c827a00e2b9433325ceb6d7c0696d8feb1c950fb150ed54a0dda88a563a84df2b5e37ea0b678cab460c84411f1538d0dd65a3ec5de4cf0c3ca8b487da1445c6e1a02b97982a719828c486b34c59ec0c16f140e44813e2c38e1da7f54dcc7c878281ab1492167021ffe40a9b5c56715f051bf525becc89bd97e543a5120f916aed56d69019d8c1d703d1a19ae38f1791c4da632f9d0632d000ebae327488bf46391d0abc3c1e98131e95823c083dae1a30860761062cd2d3cb9c60463cbcb67953f019077f52419e385f410119636220194d6d1c48cdbb04d933a1e591ee8f3df70d33a92841a57383610298606a421e121aec7e35f1222585328614fadf7674414e635b36459bac721c5660a70d9293f4fd64d9ab6265e7a4de49c205353c8f20327dfc910d531231da5a562a7e28ae1192545238bfad2e616d6892532dbc09034984b5905956b2f2794bbeedfc3678764ec104f8507feffc79df90c00d614914a394954f45575f67fe4d6a2f823bd476d5ce8d252b55175f698d725bada9424d08b47413abf077ec37c03dcb1da1303b8d97e9f1a1c227a51101f6d75921294074fd37370a0d65541fb9fa4977de1d542b98d94742d08211b97a483ff63e4976a36f51ddd197a4e865ec7c3bece84d88fb3659873e5a2cb75a18288204276614bf7b516fefc2300761dbf29007e1dd84db6a51d5d02dd5ffe26010f2ccf569eef88e331d4d6e9b1b6d3be695215ab6540b5335691721decb8bc1301c0e4eb547d008dfb916c49debf5e3d5c77a5b97cf756459c5bcde33af75a1c9f5b432ee3a79e77d36bc140971d256e6a211d5fa17644a06cbd00e7ab791aeb804920d8410b5b79b4e90cb72a6b29aca3cef5576e268f812d75bc973f604e2b6b4e5327194ce84fb7b284d560589a67898df7d06f950f1300de90fd34dc1d247abc374610ae63c971482350d986ce88f111571a4165661b91800b72be620aad9fefc82310034053811a08f0f0aed56a4d8f9206f11514d1f0ac16db842515c04fc15be54b047ff9dcad7be144dc765ff566908f0044293ae69f991733cbe38652dc66fcc9413af71f4924e36add19a907756c38b3b5b801a561953994a3befbc082d13941a26ccd8e97b8fbe9d9edc7f1e827b0ae786657d97e9fd106d8f91e6897ce945c81932437b85ad516698b6b1447bd8a5298cb87cbe8616e69017a2314f53ba2af6c6ecc00fcf9a0da605a1dd220f483d14593ff533bb2e92cee4746b4a833330c9cd3bc648982e176d41d0e965ec1318ea6809e1c64c63417f87983714d25950d26e0e56fdbb8550baade8448fa485cb2d804b12016be1d9af962fc6f715af9cd141fc0b58f3912f599ee1f8de42053688b0274cfdc207c413296a3a768088e1f4e0bf6e45a89133932e978dbf5e3a42f71781a845be8b484f40114be285a63da57b6e9815bfb9062dd707f8e1716f7b527550b807bf6285b2707e9df9de14134906eaa0e7409bf4043f20671926abfc3d6b417d748df1cc1be5c688fcc91349a224196e9421aaeea1bc67845c58843e1a92e37fc903ef76e52f1b59018f1e4b1178ca28170a622bad08664350191cf3f90500244dd754327407f8ed1b3629dc3e8c7a2ef525899a8ce551972cb290ce4b0006b9d45e44375039b0c194d1ae29381500e3e8c51d3fa971bf48daf18c8e8b9d0763b8f141961e80aa2f1ca4ea20fafba97909c669fa4fa9db27cece60092e3ac5c7349985d925baf86db82c86295973d183cea0611eb57b4f9170d6a4a8f066230dbbe15ef97d14f22308496b62b16423af6c4e3d32d97539c01735a25548d0ddb49119a6989196bc81f372e2ede51187d0f1d1c7789f744de4a87de6d0112206268057e7fb982681acdeb6511bf2da70ec3a391f1542228c3a23b9025c158b83e00f03da1bb9e3ec6c2fe0989c519a9e9e21b4f0d8e07d2367d1d5aedafb38e87be4f808da21ff13417f8be908181af67ab3b51c8c121e8174e13af04fe85b93d4651f541f6db745b3718883726a25cf9a0d9283d1e1e8d598d121859e8b509da3e64aa798ad086e29028806c2de4438d3775a060943d0af375bab9284e3c3a131d981c8cc3785faeae24622e5f87b06fc83119f3f728400fc7d790e70572dfe909d11013218ec3e5ba52884bed9803797f11496292f73d795ee0206ed23225b5af1a9e8c722cb081cbc97a68a450d455e382fd2755aff05da5bab498c90abba44b3f03fe9257a4cbbee1291429d986f105d3d8aa736bdc624444740e3c744576994fbdbc7a1bf949ba99eb113cb3d90ecada91d6b758fbf07fe79c56ced06962a3d51181d8e47ff0a66bea5d4fa7f3d4d9a7681b99b497e57af3c437def6360a44f3ab9c8b7d3ba0f21d73eb093336846324a120e47f6537f532a8e7a328f53a9a8be269318f31ceaa25304a0c4db6e0ceda2d2dbc504cd174ba6f864510e628557f13643afd593c2e382339ce3c6fa24c00221250cf1a9e441a35af53ea6de4d014e37a7cf5484ac45156453a4c5565e74369115fd505e2ff7fe00a296712612d3e9714a6a38dc4bef3c308f0a62f5095588d2957f362fe5f440d820d94040e628174b28450f781771ab234b03a282a0b93b325fb5ab4456a32e071ed83b539efc35413e5734fb527a73e4e094407fb8e1dfe2cb5d7e6e1e4335291f5fce22afd1661185211a5fb0f6497f331f7ae3b061313dc274763de4ed1e7b9feee9adc1d319fb2874ac162d99cb4ca56852017cdff765021a388689ce8ac35b771b5acedc6f12e8d377a3fb10c126e1277a503af594d6976c6d010158ab9d8023ad011742b7e035bf9c29d113912b514ac01eef3d90a27845a4094ccf63c8cce7c3abd5aea13aa45a18bdc4aeb6fb72e489b2285cb736f556e712a6e1088f977bd27c953385a4f1db7cb1a9dfe14774f3b4dde20bae242d388c90b4ea63fd515330ada29a4b0968873d14cd98d0cc88d20a67f0444dd8e9486b0a957cad909885705deb791089b40e5e8dc4f21d830e9aac746c093d2f1923db53ee725f22da3ed90e0121ccd0a42e169586e0fca06c3e4e9fe7dea2c232496c625f6011b3b6bf8e21d2bb61aaf28f7fa3afc03b7e15e5bc40f858d723d1367e65871d8b25b8b917d8009084e69032c0a618e7b5b218928b01027b4cc8786dd2f4d6a846cd8e22f585d985e0b8300710396beeaad4cf252a27576f1459bbc3e4eb7c5f48cc44c1d5c1adc721c538c18a432293a310e9eaea5a1d0736bef4bb64c6dec56fcc2a0d75ea141722fd2f8f9ef1e15b70ba4d678fdb167356613e4e264181fef776b60a605a39629ba7c8675c456fcb211203b34ea72deba70129d399bc749c0411c7722cffaf43359c113454c07c5dbfe846660e374bdf84f022919ac66f9b73c3defb6db5849235548dbd857cea9e3005a31a13ec81c7a08e14398ee23f54beff73d8a8eaa0d7a658ea1142b219033070b373bfab879f5e5ee9a9dbdee9060d68f5e04742a65365c23685db4d5ada6785ccf70c96c185eaa177e407236e27bb4d29b011a76be2f323601103524a6678d4f88df32e5855b3fbe59f0b24ec285e85576fc6538a7e9cc75534e70816766729c05198fddb6e9d6c248d4cbb5492f10f8df502029027823f808dbe6b42df07953648d789633607a5f1d9eb5e97c54abb1c8f74f1fc14279eedf9fa96a2090083751e866af3c9ee394fbc464bb5a5922e65722ab1523502c0e88077f7700861148da0410fabbaf00ada3c88eec1de7667cf5be321f77838ba587be1414e9ff540ee4b1829d38d06930369fe3b3cb206157aacdbc26e446bc21a14d49034627bb476c9b620091431ea590dda99280725277e81532655e7f1e910470eb26b33373e3ea08d0c76b4424ecb0d79d78734df5934b548574b5944310697556b7bac23071ad838482192c44f7cf829c1a449d4d4661ca3a6862350ba1078e63619c5198378cc83fc1df7168f3d4b775a923c1287dccb4b8dd6280c5294ba3e59dc04adb14f461c1e5b7de9ea9aecd4550b85b681b66c6b637d8a607142f2d69ed1c25d6ae0c5525b48a63a13ad597303b451be63ba66eedc75ccccd40765fd9fa853a81e63e83292c2de8c6d6f415d8e6bb7d6c4bc070eb9a456a2cb5a6f59c532aab890a2f9dba868a1125817231eaff7e59268376eb51a2dc920d182d176897d5847b49c217f0322e22c0aa6ce63d67110bd3944a982125e1216505da7bd61cf036a548197034a7cc58612ea387a6a9dc9fbe14908908f40c06775da13e384ac2ad72e404435b387fe52237082e8e708d87f29def0e6f44f89e9eb85f3560d5661139281699a8f970408881320c1402bff78c3569c9484e13398030a464d8d764f6f70d137c341d5fd111397a9cc0deb4fff2a253a6148fe01ee9676ff1ad3db52c073537e72b869c4d247ee53461987b433d50c176b1b26bf032b8384944290d5fd8f6c7e9c1e90b91b1c15bda0eaec5dd6aa08b9ec32852c60ad47c4a7c846d6954e88da3586bcc26f1271e90888266f54b54e3bfe31c02a88a50aecdca378cd81c02189c8d46436ebb4cc9695347d33536bacb80d6666b0cef3f3a3a16a4b631d197ba1212aa92164d61aaf3bfafa3bf7e691dc2363f121db81e95c49c8f84ba8e26f54ebb543bc7fcc78bfd3e83d550b30b7e55f90b1864aea21c4babebeb3a09013c37a02b193d15697104f8bc56fe431f655eff81170712f0f269812600215c68cc1ea446548186c3c86c43504cbec79a8a53aece6c9d683f5de3c5fd588ae52096e3d9c1efab578fa0aa902257546d73420bf6b84954d7b8d9997e9f204279dca44742bdbe9e2ec542e69ea41927bea276dc091dc6409ce3dbcc514944961ca08e5be73918f6431acbedbbe3ee1443345a5142eac0cd457fa51671150092f3f9137f83866abe5e8a28079b36e8cf042c122d723f56d7808ecf26b1e2c3ac53a12c3247b13a13d5c0790baaa883e8e696b799b23ba58ead308890676b35c466106442e3201418618589c805b7fc2fc2a6b023d8471dcd6c083c3627c90964ef5313771e414cf48cf4afe6b6508a99202bc95eae717769e52ed24452c267b6a789329e351aade4756027b14949a248aedc23aebc17afea089924e913c6830cceff3a670460ba0fd0d1cc6b96e0cb33ea64ceb5b3ade67303547b7330c0d9ceeb6b2f71e6d60cdb2081982483567da1a1a7f0a413b4c6e720035550eaf902f34594addac78826b09b7196952eb72d924782296790d6734e0e3c29b414224564ecf307fbc8466b70ff638238977e6b2b1bd0b60dd0f1949adbaedce51d778e3a92296f96cbc047007c457de78093d0c6072d4e61430cc89167fc073d2dec81923acec6e5a896ece6307b7c4a62c542b4995f3e16a81c6fcc70b58c596c3e1879fed05c1e3639ae61504c48ecaea18e2f255ff09ce0568f1ad9ed298022b27980fa9da7b5d2a84e4be56dbc6f3813bb443892bfb698da902a9d7b3f85a86b9e6f34172e6be038704ad825e8636cf341e9a5b1c34d53b7636be62e2cc3168fdcf99c6d84544fc280918134a5a6b35fc3b817da4dd28711ccba44864cc4f74445278c841be91d4f8f8a6594a5104199e97575938dfe086bfa4616b742409f06f7df7da00ca54b986fbd20bed4bc881050d7b5c62a9633a778d15ff959b2832aa5c5565a55c5d456193ff6befde5f7be58d0054210fd9579ca64ab835cb1784ef6028df3a65c236c56ab5e960e1d8b1c7f2503f5cc5ac4b25e58ad55b452917a9f62d98e94d1fd58e2eb2a52f9269c14826cfd2e983657f83c1536b25cffe5e5c753aaf6a6ceea7c94302949ed7fdaee5feacc2f5d4a5659dd673d9fb45b948e8c36a65b1aa1f2b90c94a973938bc185a87d8563f9a9b3beceef98d3b4013b31f4fd9c92c6cb61bc65617aaecd4f5ad3dbd49bf93520a77cd506e41c28226aa6dc16f4c25bacd16bc889161b9ec39446b1e88e9d65b1dec8d575c568511d748d1b2e3e977b3fc91f2fc1190f0473601628284d2814dd681197b9a5244f379ef286722203997978cf5f830391ad1acaca6b910b28a3a894f807d02b30bdbc8a2bfa649b1a0b10956c055311facdd3d5ade6339834c085543ca553d7008103f43b58cc96a4211f35f0de33033d0e73d8c490e83334d4e7c8b0a8dd8bf686f4cd26e79d191a6675ed85f72c52b4a86ebda19cd6ed01692fa9263ae453462e331961b2a862ddb0b79a3341cc727fa27d4202a0bc98cbbe698848b58a0ea195ebcbcd2b58df7e628b69615ccde5aaa14f8eb9869769614c64e55355e7a64fccd48cedfa2076831a0c0420d736ad59ed31a65e55e15255729e2eacf88ec62f0cb69476ecec16a814f705452c5ad6902f72f8e3559a838fafb4acf35d5edb502b9e5f2c5c1517b616a1eb76c0f9d6240b76bdc5ebb0ea3b40145eae000fa9d42412fd3788d9e7817185b930a6eef4895c61c37fe7cc2e3f8c71e5575cd44662e08381f314e3251e35a24a680b97af984818d3eb8871967ff84c0409c89a1c70511bc3455379204aa6f2764eef76652335ad9a6d1632d782d3b955081dc72f9e2e0a8bdc2a42c95954d9f7935d0598f104aac431b09d73b58cac47e2a36e4e207fab3773390cd83e50fd37c0bcfb587ac99b6f30375e980a840260b203b79a7afa81823cf02287609d4fcfa146e6ac642b4158149f7a4cca0557a69d3ff5f733edf3e06849a0845742e0e11432d494b6bd65f3689b2a67d531ab7c5e82fb70ad2340e30f2c49a264496d0759224323f63a1895a43fa3c44c83073d943648fd414b3f74f10e46f770adb19f5470b7da00abf5ced32b191e3decac62d7a97463ca5244b40f915955df7fb20f662431676038156331062ee94e1347c5ca0f181a65049218917bc12405e33cd2fe3ee1f468e0726b0c409af029bf214d61dc0c0cdc26955765397c77a12336224854e61959e735b0be7b501e4271f0f19b2d6b570a8cfed4093062293ec7c2c18e22c7cadfb4e2fd62f5179b32e60a376cab08319b6a348108d2a9deabbfc07b9526d75a32ad05085d9c3a9b9f47e6e0410948793a11c96bfad2820c6dbf540a60620bc0efc338dc9522be3e8574c422f7b0f4bc128fcd30dc95fda6a4a73a5c2887620e5192a54339703d79b369117d603c9e1a83d924215c7aa3eb12bed2a3bab202ec14067168507376f9fa2dc4cd435fe57559a934d0d50e8574f5b811ea881ab579de04b4d46a55539326847741eb13dc4b400b5cdc55367a0dbd46060ace696a280f638c7956480fda1a8bd91dc95607f2bc00c2247b9a5eaf478eca8d1d8bbb312f9de172b5b6f120ff914c48eb7de349a497f4461a02f9b5e5eb43457bd2240ba523ca04570121b817d007aeeba11c17e756ddf3364bff5da359806c705dbdf8cee8b7e48dd417426de632d27fd140a53aeaa62293c5dccc2d8b6f4a9ac9b0734216294d209a58a788fa18c75ebfdee7a92268f108b12f4c1b83c9d5be8fa4e346877075b41d51a7c6c5e9c548b83740995a87fca255ee89ace12a6493c9486eb7dccc9b02d67f53b846bb05afc56b1a064d86080258d6175492516995a19a634c37707721209125d6362cdd600adfea90bad40b0eb3ec7f8d9eae2488f5a86915a29d3447e7597478530a2f086ceb2d4f582cd676467804fe98e280c381dcb2932889578ce6a8990d57710ad256a6c8398ee412649c14fc7fdd1a0f3a848d482d2e3b770e00d5eed8f26a12f044b8e57578687d4c93bfb88df125fc104de081b3a5b801e26e2edfb4da4e3257fd7d10515a2ef164ff78c627ba5380f704c3bc0c093d9b32cf024487e491f4d2beb110b8aeb8ce70db4006c240088f4d1a60e414a84d851501418b21eb542bee74d24fd3a6b7524b19491ca8724ecee9ba9b96b3f26d3e4776ffb93148c45d493a789d83de6bebee24461de41e017039d1980b67eca5c8489f14a4a75d2221bdb6d479b6bc9814e5b312d2aa485700190a83e0df213fafff6e158e50cb05c570f29026ad700ab9508df1c1c10abd505952ca0e6c0c6bfe4ae3b9ad7d5110f11325650a41cc050c28e90ce815c0ef7fb4b1e327a5cc2fe24afdf46e4db41517350372b77381c69b8d00a98b4ccc451814feefa516035f0b2a91bde09db77ca8057d4266b2951775955dd0541cb34d74a4db39d35de5f9291f4655c29a7babac2dacdad8cd37033b9cae554f05da38a321b205ec0a0805b85edf40966b9acf362ebb585c58bf467e4d5025f30dc1d52b997acaf80358711f41c4ee3da5c7df582e4d87029229471c5d06ac69cb5f138558ad1a91b2c7e5d5308856642827eb4799233ac8a58048dd2ee3a254a5a13250328a35ad75c505aa6ed342d53d0ae11b2e91b32f97aab90b0318a6be6742987eae3fda663b44812b8c924db6c539a63e74c1573b22b4b52dbb1d3a6e64c2a07248e0af5c7f446470615049e9f6cfadb2989eca66c4bd6877cdc4286f4d0eee92ec82a8185af5203ee8368730dbb0b9257afeca0a34aeed888672ca74b2900ff8204b8cad939d07df4c215732b11d4fddbf0fcecd2f41bc3028674bad903e4b0e2e362dbfbcbe471771de895363937a63cb5086678e3594e7c09cc29ae4bfaf2137e086d5d4c28a20aff0e24777f5c5aa0587a5a3e82fc009a9a873a1f3a06fba77772716228f1c7c5abd2a1cf38de455ae8bc2c5b08e9fd2e469c4ed41bc27de3caa3f82ce00d8f2d76089ba66d4f00d13d0c5c57287aa6b9fa1f758f8b76caa09b662964fbd719488ef500197caff04c751384a5a83e4efc7693bc727862c04231f9d1ae15b38e70cc710ce6d4521bf6e4e7b89c0b369aeb0c8c6afe240b22d814b5738936b6495f33b5f5cd4327e264a1acc9f7d2080038694af34dfeb4a69146e8b872917c6b5ad755e4338b3a191fd6ab53f465e571d18f5e8cc22f4633afb92d01a8408247e5449f3a41eb66c959bbb9ef416a0a790503f534801a95e41dcf8284b2ed1d91f2a4bf174d264a33ac7d82b188006c8510b0e394fe60b84f352c8f67029bdd15829bb65413f0a650ce13170c7a52d61ce26cb36679ddcecbfd34ca9a934bc5a801ffaa8b62f78a2add22ce17015ad01b06cfbd1c5c1c00ee4b7129ed0a142394784535ebb24f2028d9632d3743c63429e5aa5ec2f0bf5939632a569cc31faec9c0f962678c64615f7eede107911a7feec98884f94160e2527541c728e620f708b647d54d96e3c4e55e85807783df46bf7b5a9640f71c8ca1b7f35d369817625ec824efb6f64aaeb98a11f3d5197ceaf3f2129720536761d3ef4e0aa6e9cd6201b5393e55ea6570849cef792461ea65303edd41e202d279555107e2a8a81e135be8acef324c421d19335d1f63f7b612623b46a182a1d38e9f8e0475800e010f586ced1dc8dbb49751023ba70c27e4a7ac8c6cfc045b65fe54d7842b9eec6768d024670413c49eda57d780e3a745bf8fed7490fe974737a943cdbb9a1c7e309fc31148f1bd0aab135e5adf6e856af3383e1d7113491751638caf37f2ea9de3917e680c77fd255c9d938a0080bc9560bd889ffdecaaaffe432e4bc8adf53b0f99015756ce4c5e435094c5742e751526a59c212e9042967502a53cac0e541ac50fef424e7b19bdfde79c4d13d53e467892c91edf86c69446a5940ce242a0bdb726ca17945544e3979aa8591a090c27534cffe9a5aae4bf50b39ce66468bdfc7601e2ef9d47ea32f63e3a91c22fa4960332565401c977c98674d675c281ad91842aade990dd7325360aba6a77b60ccdf76beea285c15a22233906ce039b524d730af213b3c5139355e8572ec045d2392c05f0a1c82440b3df97b515d912de448646f8bc63a710dd7c05481eae14e120a25ce9490f7000d134fa9cf3e5904c7203137e5c6b7999d073950166a931c06454014f521c3c5280395cdf99786d0877f51f800b92774853c0f30059c8423771ea84e06bfba1610257ca8c989aa7ecd5e73def82b538d2986bacb6b0f458c067934cd29ad551ea422742c3e12924a7fbcf1165beaaa039cb5fbf55eb05c819ce95f3f4ec4b11d2c3655b856b53e106607f9e9c8cdefdcc88cece54b01c5f81b46146cd146b7826c7d9ad93fb9c186cb46bb7e258e5e83a905348171b0b0824e7aa121c53384844e542dbca334b7310436c0fe4d1365a2301e78f79c900881e124fe20130319dbce3d4c68b73290677495eedba5caa53f8ce246a400412f5f1f4be8b6f13f6e575c1571d5ff6c274a8064591eec224ca81146ad772d3603b10db186d22c6839597d89e6436fb28c4d8677010e7458a65651f928567d4dad0d28e1c4728f056dcdf30cea688d929f439986247e173c685394b07bf4b8d26e916874af3e0a6e650a39e2a3fe4a9816016d5aef84e3cd99ce6c1e93d7d56238f53ad78dc0f4c386a5c21d45b243902607a9cf730e4183518bd2d968ac6ca82b2fb67dfb2f46bde8478e5c10a5cd7167221e392f8478ffac9787408f35c64a3009e904186b1179b94d571a5e01d790dc684eec09828914f9c05facc660b003d1b98b9301d722f6198d040377f0b3e8000081676ccc0add35383e5b2adf3d3f8a461109e678e97697666712eac072090eb94511f3f97e905186cd32eaae0e6f196db5c1123437884480b2ccdbb95694bdc0feaf1f2391f020c9457b02d1939c83b386759c47316d2cdbe8c765f2e25df05995f8a3eae348d3c5609642417015d966aa991974ea66ff3176d08d00849d88808a21028a8b6ea396daa24d99330cd1d3f390db7ca46c0b810be0420ac4957a0e14a453225320501ca580345cb71b3b567b3e487cd764cf441fec6246e89b129004182b374ea4df53bdd15f4227dc88ae00c8216c184d75ea8aa4a5d604b0c4403ef80f42c7152bff9ba9a22d30e34487bf0033c21a29d6407154ad64e87e13cd4e2c0c6d0ee0d59421f678252840cc19723ab54803f1adb66eb9aa56465c079887d09101e62b23c4e513242dba9994dbeb241ca16fa8888617b6cac2258d507a4bbd8e428dbb8ec71d341c186257cc8c0a657392a239c9e2c15771d14e83fb8818757704d07e07887e106b37587cdf9dc269a007a31d5fab398ccd4a09549ab9718156a892aa82a26327347da40a065ea5838f4b208fcaa462f29f718d981253f769071ded21064702f49697ecee70965466d56f6c4e961b2317f379f657ef561a6d86b05535726e79cb89a6582ba228f29402913164dea1580003ea5c17e0bcf44a26d21dc189f1b5996351ebe9a9ba9eb08675d167208e1f7b8f3c655b05a67468ea6c7d8612ba0b7a7cdbcecf735568394b404c0266f480d1800e7935342272d346405ed2077d4b16529302cf50be2c4150a112bf770068914ed6ee2cb73b4ce68c80e087a31dcf01f53857ee3f04bd3d6385bb3fe4eb47aa682a9633f299ab45504fa30bba25a20181ea50365fee81889443650d29450a0329046b6fd2852c97fd42a8d6288a74733fb5daa8a5734901a1e8b0e40602a430d721efe6d486786ce9b85da93d80e8c0c12dcc87f72017ed466d1482344eebdb72444ee2da54c3205c10a8a091d0a1308cba1b64dc68eb0d714614bf5ab5e0e1d6dc5835a870e09fab0e97dfbee9de3d9e45bc132489ce3d1114e7ff1e30f3cbf6f228fe7348ed55471ba8b0716decca75e101c250c8f1d613e9bf0c40b7a03968518443cc142842221b0603efca00584161fb21bb020818926c876c08204ce5dd4576ee07e61b1015bdcaf971280d00de1d323134b99ea51a7582855d0475d3ae9bb4164e7c60e2ca3b1ffe43ff91f6a471dbd02d4e69c6d4347af002f4ee3a04038effb86fee6e104b1aa94ac815299e4df8c73f6c0b1c8e284216459c214ed20adcaa6ac3d928512848a7670430dbe60507c5005113ae860adb5292f70b6b8b1e8a2c5931f9e40825112580f561c618c0c0c1d72d87a10460cb8f8c1890d37f01026c9078717d20b0b24271886611804a6c082071f2051f485123e8412b0c801ab825a11461068b0c10b0f7c40a58b2864c000dbc1042fa31f54f811f358688ac30eb04ad3a04783fb25c50e1842083d5ea14165ce89655224ad70bfa4d062d24aa552c954a158cf81af570babfc8395d3b66d474cc22affe2b61991b84b8da37fdb5880f13b8f368ebe24b0fd7a15d5c0fd7a49c14f8750bd94e2c704710047588afb2545ab251936e84816fc19c5129cec203d4631466683fb15450fa2c892443d5284a31d18010544c85206abb528acb8200b31b4a0610c1aa81811a910e560ce395357c06c81c208cbb75108a9748840c83be79499084dc909657b944c53652050d1875e06fbe1959e11986300810ae718700f7c7989a832c5aec1fbf4522b36abf2e71bd65885e3c5994e5e3a70b53419a3d795a42cda0ca0d71357b61cbd9ef882014df11b29425ec54aabd5e1e4e81568e9538161bb10c202a0e8af4087e025136ec0b1044b107e94525a81a7115172f4e6681cf355c0b3051c6dfa663ee7cd1c3f5234d5e444707cf8cd99b95e20220752be1062092928c0747882f900290618866158bca1e70d3ef002888d0745d002872776488253ce2909a0c3133e5a580cf7cb892710c087971361d897135f946007a9c54910aa1356387105899a52428c51ba7faa7eea2e31eca252cf11720501fdc4169824a4a32d46af22a221215710d08fb7c024211d6d317a15110d09b982807e602b499118601812a407cf0ecef72a4be30d6d9f2224c51525080ad0931f9fd90a03e64b9217a42e475cb66831caf2ba526485a8cad0142129ae284150809ec81fe9235b6130982f495e90ba1ce1c8c5bf2d5a8cb2bcae442b18be4cac2273641cf20f36a055a9e7c0c7b056a95494cec7eed481339940972b68d950f6370ea861d80fb3a8ab2ab61fd288f147e3801826bf3bdfc02adbdd0dbd3b5651a9e774e350bbe9dd6982edf78657409fc6d1bf42c2c6306cfc9294f26569963efb5aea52e931997d2c956ec81c52874ddff44b69a5c280b319638c47266e2fc678638c5147e3d0c2c647c2aeaad8f89d819f4ffdc78170673103b2f1e96331fbf9547ed693bd7c2a367751cc30ece6ecbd2ccbaebb32170aea9bbe34c677ea39100ad1385429f78edd1da571c0d9ded0c334170cdfc6dbf48dce417333f5af1b626424f12fb61552cae8d0217c6c4305dc10e78831c6d88ee35f3f0d42ad34424f7637f41a6608a3c396d808c4f16626d82f74e853d8c611e3f412c4be144208a97cf83146195d89fa594a8fa671cc19259533f60d7a851b8d634e2d621fb10845504d1822125eb1ddf276479af50eeef9a7083d6b658c56222cd5186354417728638cd325ab0eee170f5e30f5dec6bdf8589884e49f8dbb5f292a65b15008ba7ed502d4bef49ce784fb2ecbb86f4c9534617141b8cb7de699ae474d5ce9b94c268bf52007f227d8ff86e14ffcc77390fc5d2e21fef96b5e10ff6acd1238ceb3d38b306dfd80f1561218a4a4a38c3e7dfaddf46b2398443d4aa9c948c42068235cbab9c91026d246f46256544158f82ecd4d3ba8f33bde28638c32668865308319cc604e49cc331235ffba6191c7de4e187032e45f3b0cfe3915eb5ce94df533cee6f937717f1edba1e4246e9e38afbc99480a639e39a9fd6da3b54b395b7677cbee38e38c33ce39e7752fa2e085ad31d41b05a41217f221d991e5ae78033f85969d0f1f7ef11c5984096a7002777f1912496929ff2004821204e4aef81e04545d5268201272f9073f432ad65d10097ae9241c5da631e2cca49765524a8a69190644624d85b9749ffdc5a750662944c77cc8d938e263790458becbc611fd739904991cdc638cd15d42f7ee6e82c148c559d3e590869e02f78b065ce0eaf0ab77a418ca17f2414b4a8fbdbc13a09fbd054a8ffd122a42b02ffd92ece92fb9b01597d09ba16083758c29814ce800c40f2bfb2aa9bfcf9f71f698b3747bbc9218af0a089b2110108540f1e6aa58603304a28fbdd35f82fd5c42450866fa55fc25f4aee21582bde9b1a75fba4bec53ec210a4eb858a5a75fa262601727de380b99a784092c3a4a428845456585092c42c207894505aa9480503c080bbd4277bd826b627705e75dc1f916c03e7b0bcca793e54a661006146fbc95c4bfde02817a2b02b56861f8ace935cb814c4bb877b7673de7a440d8ecda60118a63d21b8391a3fe61de0e367f37b20da689db8e4c857d8ac2ed471388336c8ada36d555f686e794aae9bbe3f4ad058861961dd91eb44ac76d9af7e8b0e96df60d91fdd1f7cc945d29318d086dc77322c690a27cdf7c4079537e63a39277020725580d840314d6b6040e9660d5504103ab9e208955e32809563f4ed4a971031a585dc50962c0eae7893a359a3062d598020c568d2935b0fa87449d1a47f8b0da280545ac0a861358fd45a2ce0c0e5ab07a0c560f01074fb03a0b568b210410c2b0fae11735b01a0e5181c2ea87425147c715376cc16aec0a56aad503ab1f16451d069c008a17ac6e2e4760351080c06ae824071eb4b01640469820b0ba817004563f4c8a3adb1090b8c2ea8760a2ce0c2bac2d095b7c60f5fb4fd4b1f185d50cd0a18b1eb0bab9d081d5efaea8d34f6869620b963ff1a18b18b01a5e8185cb15ac7e278a3afdc4d018276075562507ac7e7f459d28041a7c7e585dc760758d82d5375a2005ab511083d5ef495127e78814b0fa1d4cd4a1b185d5363becf06383430c58fd3128ea94acb04e5a94f8c26acd05464060592b395ec1dd6ad5d062e598c5b672d412434551abd58223b072ec82f918b5688062c4cad1cb5cc2a8d5e202042bc72f9468a8d54a4207568e61729c50d46ab5845859fa401a865a3e43706165f964fad06ab55e50042b4b2825318c5a2d22a22cc1a8d5ba8207569652a018b2610b2c7260653905cb51ab25e50656965588306ab55e70042b4b2b520747add6105958595e916206ac2cb35001d46a4d798295a5162cad566b4a1656965c8060d46a4d9982956517295cadd6942fac2cbd4cd751ab65840f2bcb2f9507ad56ab0824585986d14ad06ab582d0032b4f9f1db45aad2d64b0f27c5284abd532e28795271428865a2d2a62b0f28c82671449ad16951e58794ac15d049ce794c8c59b121105064ab8683084137e68a1e086ee07a024474a10a3862dc2d0a2450e48c440e1435f09e20b134e98f8011440604f4a0003ac8a124cb181e27e31618299c54998cc09866118564312a4644e5c590d4a603e3870e2653a6902f37182c5886c87ac86221f319ca8c009941a56e083854fd0124e843003ccc70a4c8ae924cb747202d30ab61ab0d87c98e0848b520d5e309f273024d42838273d30dd60d2a20626947cbe2825ed207d8c40392182fa184d2758780d48d2490d309f32680d5a322735d48004adc2e704196a092c2b4a90c29ad86ea0e2414703550fba329ea072123334c1dd2ae6e177f7f5bbdb737aedebed89790ecb486c68da69d358d0fe64e266688257a8efb1df3dc779317772777eccf7982e1288ebd7fa266f65bfbe49061f9a0fee63bed63aa36e35dee4c1168ed15a78f3f29199af41e36df733347e06024d5adb68fccccc8c47bf763450dbf7a3be7e4dea6b6f3dba4a205dcc57cd43691705adcd3694d679784b79a798467d95b79bdc6bfdf579220daf717b9ef5aa97a1501268bcd2ea6bf5b91b33540e50a8dafde9f439a6c66bd7decb4570e5acbdb948cd6ff6e65ae365319f9d22865dd73dcab35ce5b6cf9eabd63eea3b7b5731319d8dd96e8fc6797b24367077572894e5663c279379ab1e8d536f3fe6372f23b181eb5d71cfd53ae3ae667cf6b5a3a152a95434ee6a46ad3277d575d90ad5dce937191999e7644ed9766580486c60ae7bae7b8ecb2bd423b1814fbfea90d8c0a9bbdab2df32eeb355f7dc67dff6ae50b747e355ea7b621ef5a998477d4ccca3503116d5bfdd1e8d4fd77e67bf7b6bbfb3dde59ef372132b57546ee308198d1da9ccb22c9b32fbeac9995189bdc96b20d208c43e661018f612a9c2cd07166594df110806047b1963bcd9b1863bf8c1f027180c1f8b3ee6bb40b38b4120d35b09e978e3f21e8138462410c326d4593ff328eef0b67137f372924c71a642666e8d6c7bcdeb18176e5ea279a8d7bc7e2de6ceb83083aa713bde7030cb31cca83f83665e04647ec6631e90eeb7afd0ab368a4a6fa3c8bfd69b9b208998fee6ad7cdc9e52c43d343e2b7de5beeb7adbb29ff1ead665decc0cdd4cf79907b9ef381fdd73d9e28c898ffa5a7df8dbc60477db37ae5f2fc775377fb769db6b703b3dfc158faec77ee32311c2c6a1799ce7318ec5dc9c3df7ad3dfc2c4391163e126b66840946b1e038f38c408ccab8ef47fd8c77243e5cf9b83ddc779fdd1eedb7245d9793601822f5aebb5948d73d4fecbc0c5bd87ef5320cb82d77336cd9af50832dcbd16c07ea65f5f2aba2f5ecb79b5da8f1db6f31a713fccdd3eefc2ce2d376a7e6f59c2e1288b35fa14ede0af5d99fbe5e197c74cf3deafad85efb2cbb4822ceec0fce6e0ffc7ed8c21a677b647eab3f63860b333366cc98e1d1cf4af565bed2e7b22cbb19e2da5e861477ab9ff92cfb1a5e6f40b6ea75f576bf09e12ae4bcecfb67b84a5da8b1c9788d6be94b5fc38b1b10fadc975ca871b99bc84526b2373d8f73dcc3af35e67b8e445ce37af5b2ee6b78b546eddf8a6054cc968f64db8eed396f957d97f1787685d4d8be765ec6715cee3ea37efbeaad3ad40af5fd32df7d7dce5b718ffa98cfbcd5e9ed675f65bcd4b6552ff5325e4dd5cc6ddb738ff2561beafb538f7a6b7ffb1ae3699ff2627ee5cda43c2d06e5c9004f57c8ea57ddd7f899cfdd1552e36736eb75bff2666a78339f79dd5b2feb4d488deee6263337dbb4ed884724e2ec22716c4309ac09eb0fdf48f64fb1d62a4ae501bff4b5e4d54e48295b21f6d27853aa9f6d6ff2b8bb7d7ccdeb29bde94f57156f4cda735ef6dc9b5cb0b7238d3726edf6946af7b5a4752e9cdebee6753727c10f79e2f6d27ee769dfdd476d092e7d73df516e2e9c6ec79b8ebb99892dddedf4ad952a8f92e7037ec97a27ea82fd936f3c4a3f6b12acbdbda5ef2fd19c04e7fe23910eb14bb0212a0ff826887de6955694529e689ade95b4a7268ee39ef332cd4df0f63909debc9ef9be65bf651a7dd373f44d4f4ddac5b6db33bf6eb908cef47b66dbb671a026d99163c0d8e72218bb997e73df83bde9b96bfa8e01675fbf1d7bb941a0095e75a6ef4ccf5d53fbb7dd9b99e04bc4e9a58e3d5d7afb21967510f7b6a374794cf8990ff8f3963c8857a65ff9b8d8c49e2d51b7a75f79401ff4e13b2e79f9c31a863f4d25ada4693717f91efaf135edb5dbfed5eea10fff74fa7af2b20a9fe8d7a89dbc06d2bdfd9277bab9082e55d5e312f7f2e310acbdfdb8eda8df7d8c77ba9989bd72f3e19876d7f431a51ae371f5e2ca83be0ff854f3aac903a27dcd9007fd69fa7ab3e91e91a5928f1e4cf001302feeeedeb50df6ad7910620d279401e2f852cacffec88633d99836bf62a68961d83542b33b03f63360d894917a0c43a876dd104a2803c4fef1b13fb2612cd29f5e9c7f8d6417890772130c679833cc4772c2f3ce00ffc826af1107c3c33ef6d682ec913e9f05bf0d53c8472046e23fbd8629e0e8829a24a043f718a59c13c3324a4bfe512ad15dde4ca394d11d4aad524a391ffacc4d5a18c2f70f2787841f3ddec0813b50d4b699c1ca145c7ab9054a165cfad209c3557c8927865b32188768290e15c5a1a11987e250f63568b08da314fffca97fdefed92d72cb9d9fe116eca85780d86112eec691a11658bef4f6a48704627a73fba77dd98d4798946a8306b604553318d2b6adca703fd5fc53f506e5b7bb175092a8e76834bd83fb5337b04fffc3c154985723088bfdbc99f6883a4d55f87495746f6f4b2e36f76b02bd820c1070fc20bd02f522bea3e0c5f2f817ff42b1f187449d8e415e9166c8e67e0d7905c1b4927743a757a08ec10d48f6f2d634c1e62638cb6872608564d96d9b1e4651d5793bb17ae9e75f5954c1a67f6c2ad53719cd943e9f4aa58770276e3b7947339db49d9d5ec171e95f88c173e2973e01ad43e34de96d13a552a9542addf0aff4d0abf793a7496347ed665aa2115e161e9bea4308e3f6a3093679d2bf4ea202de6067bc7400d4ada3d34d5c83de0f65613f3d21de6261df5e66821b89c4f3573ea00b4f29c4b2b039e52502c3bc8e37f1a64b8c3addf166d88addb171b401ac804f98e8934e13db13bf33ee221d8630c49006dcb73d24b2850ef767f92b1f262caf912b300ece5d06ceb1210bacabc0426323b00cdc6d44766f2c50ed8533cd6b074838ab6854dac9f60a2aff3aa8de48c10e58c01becc45db443165f149c35ec7d053eb1f0e59d510bc0c58d1e0a40040bbfb5da36392bc231c26d488e4038027928f0f78490d2c60f16c3cfaa9fa803595a8df30a8e39d8c679fecca9ddf9439b5a193f3e1d22a9a492528993c373b2a7b452fa254c353b7fe68fcd8ab227f03d258000d0c5ca79058531ec7c41f8f13dc720a04f02277e4ae5396129009ed8f70fca1f2fc31ffb36b039fec420cff1279e13dfdf15853c67e58de1ff60f8ffe339fefd8a51081a57d81efdaf69349988afa5accd9b70b08fbb0847881a7c7181e784dde9d18f43a343759fc63fcf47bc4a1370de91b2fd5f08ebb9ecbcaf9ac2e66f35bf1ff03b6e780eec07ecdf63becb2fdaf9f58d63c9e2c252088c8b0984e5f4a1819d3f77b600f0c4629fa7f7640a24dc2f2c493970bfb02881bd28ea74f424cff9e239d8536aad4af59f7dc99330c6f82c60eed1344deef14449e341b192c6e873ba43b1be333d27fbb983f30c4df24ee6e520b2133774d8c05624e227bd817d9c77200b6cb6d8230f2a9511a4607f9a96299bf96d039bba0afe190faa3f4d0a435e09c8a6704bf1830d70c0f862849f1d0ca8c7173b3a3a0b3684fd69686cbadbc6a87245a11f8233b0425f7441cc2dc1660c0828eac496c4801a03c2802612306582c568c0fed15f13a971fc7847d88c8393031ba24540571c1afa420bf64f55e9621176e872211f7215fcbd1b6c76210b7d0862e853a80c611f5a41c83f77a1298dc387a20f6c8e4371c8e3908d2245684a169b5bb168b6aa0f95f9363c0bfbb611b28408c75fc5c07a44fc359fc8c23b44deffc1c691cd2aa3e789371907e70b2bd83f878a46472aeae0dcffc1661cac81f7c17616341ae8151a0f11e239f05a213635a968a9c0b8b0bf121ff9363c8b3e0621ccd8c4300cc3ee4ce22a804912755a9c183653087443f5b1e16790abe02fbde97215fceb0d6c76232ec95aac1575e43bd21637b253c8735e5f68f11c0f8a32c5b93061734cc2fed5b760376a1cfe52e6f862e1169cdd08c98de4c55aa61cd86c53d95114b66dca46f3a1225f95020c6cee97e5c2661ba5b0d94ee1fd1042082184dd72f6ecd9b33b1e51c28521e7c3a3961747d83f55e408f491574629a38c52ce38b18a6118065d49112fc93dd247b08beb7ceba936212da24256db7047b0340cce30c8837e9e508d0642894285f5f716ce306805bfbf0a2f84b03fcf8e0bfbebf0e207b3dc85c0b9afc8ff6c3a1fd82d7ed34714c926a97a00e65b7ed33c55fcf80d069c80f19c24f8e0238e6790b874c2400d40b5f2c40a352712c28d31d0b2e2397d8597271870f2c573561870f225eaa0be7bd95ff2eb8eac8b78a20e8e6f363552d8fc7f6505406c38be6f3e6a188c79c4255fb00e143086cd4712c2fd42e27271bf9088f0c72094e765e9674b64e1e72560b07fe45183b1db8d63debc2409e725449888bfe21005fc3a0d540034c2a25aa9c23305431d104ac110429d4fde07f0d44461db891b965094420bb500c718a54c410a9e7640eba85a075509f46bb0bc9988bf70bcb4461296c61b252c8da276d47126e8c0e5d55852f033c452d2647c91c31616930d08b6a0f809623181b003b56d4cc0840c8e581546814511ab8d78a084114b053c60e16209c065049722569d5ddc40882156c54cb04412ab662ae04110ab9b8002c688d542b0c16788d55f04e1082256ad5af4025084a41b92584a04d022a208442c260bf029c20fabb1f0c20623d6f7050a767f1bcfa1c1fed45ff3af2d27e5552202564361042d7e586de3d1871a1920060f492c252a5811c6118b09aab5c5ae8448251e049630462c29fd8bb025bc42861118575094167c253d7a83a10130a4b67130411404ce1667095f46081d32a1b60d2d515a8247248636efe0ece8f01f9e03b1a79023855ec133d3f7a75cb31ff4e4767568b7fdc6e10374f88d27a015d0381e4feb04ec65af5083fbb71da58f1efd92e7a3e1675007bc3ba723acebf09b1d1a50b025d4b6f96edadd6472ffee99be898ffb73e933897dfaac61449f4253e9a6fc939a855f189ba9dfc08fa988fdaa1a47b4c266faddf0bfb468e2a07ae907ce340e7fb8b1007deb4ef9d7051715f42256b547d7a9ef697ed3ad00c8650c9c1d6741f8b0858ba3219c298e9716a17295ab5ce54fe3153aec57173dc0ac975b64caed11f6039d8a4aa148e44352e89314abe1353affef31f9ec43ef51a9f9f69c9a87b0a606974a5a95534c2e29bd42728a7f9e9442fec1cb43c2d2974a39353fdf8f681d2ba7749caa79a5506e304afc9b9fc4bf195f06c1d02b34d6817d53f3b34b566a3ea7bce6b367993e64e3fd08147eba3fbd816d024f14bae0599ace05db76d8a8f16abeb71d36fed53cf4e4973c16e04b1ef03188829721aeb936fed53c8fd7ac6116b96e1c352fb51a221f721b5658d3ffc0ade636163ff38691c34ed6c6dbf879e239415127c99c70e298b88753382821b5ee39350fe1eae1b683e6874005603fdf850c748ee9e767ea7db618d5f0516ff2627ff0318f0686ff1d84355e8e2f74d212c6e3317daac18d855a9a621a1212f2a12a442f37f22d6ec5b3b8162f9a9e93b10fe2dfec998209492121cc83b8cbc67536de8643b75274c58750f81a358ff6d8781920aef9209e93e10fcfa1475a2ad745f1cf6a5306c9201b33b0335ef5331f5f0a094921cfc15ec7fbf9b268d69f2fab78ce7605cfcf320b9e443d1febac149242728a1c62c1b124a2c9a7f1d987e8cb8b04d2fbc33f1b354f1040838d5d3cc7c6cf8f4851e73f3718e9aa79d37ccf931b0268b05906f504f16ffe11887ff4c8284151c75d320837f42af3a14729b1e9e62518fb98e4dffcf7e217bf99d9e7f6dcf322cfadf837df5d13859b29ae71570d2f435ce3b18d4786b11bc348b1f0572ff333de87b46cf19c159793ed52cfe334980fcda743f2ae543ff3b9c1dc0008d702f73e047f760b1c1288e5cdda97bed478c653d1f088f89fe1c9789e0c30c6cb5ae643783eca93211b1267d723eafc9ddca659f8df377de502c8416d1b79b2fe4de95311b083cd90c8debe90c8b30f3de939ab7879c4b76f79649915a845eb582f30169180319965df798d136fb0a7168b5f33af6b11cdf4321eec9bf8292fc683561a75ca2ea47a94274f39822296619909c7bfcce413630cb55608f405679969ca2eaf2c528be422bb74af2b451c07adbd48208fcc73b02dba544aab86f2a015ffb0c77995ca62367c605ffbcc7f8eecc582fc27eac43cf60ec573a2788efcec841d798e7dd4634018f3208c611fe36547d4b60c83b3f7417a82b39f5070f676fbd104a3ecad5de7446cf0ca08c4a74722717c231d8ea887017591407cba19da7bc3bf18fcc39e03fe61db860027367b286ce5348c728d655f3b9e7c3c27d3bab6297af705ffb0a71a3d71dfafa32f3843220989b85849ca6d74c57330ac888655cc84758fa5fc9b10a848d4517552c47060c0bef4190da1b044cbaaba5ff58924f19cf8f57dd4afb5d65ac3e0fa4d1fd6d7d115dc5e70bfb2d8822bdce6170c3f460d7a595ec1b008e248875863187d2638bb32a9be464fa9571657f0fc1dcf51f1788e7ffd1e5555359aaa5458efe15fedbe81945ef93d6afdb6a9b707b6b0252e300327607051c51554848912813862055bbad8628b11c48041104198c11170f02148881daaf051c1ccc28814203184215cc9d283186300318f3065052a3f4f4822cc183208c2420339ace04b0f2508eaa10a96021370f92268e04cb1e822bfd287d269d432460361c4a8ff0c4db089b5d05af0bcab161cf3386e8241cf72e79c73ce3c21c5f36146fbaee4cb246cc00afb3766d89c73ce09348e7e991c6c8c3d5b7ad1b7146d79d11d5e5b68c1bd4516dc2d01937c93d79b04a8cc62fc58a2b494655966929b04fc8bab52896634e062bcaa69b6b5afdad7faa79b93606fab45f0f6f6330ff59d1773aa7faa9f699bb6755e6e125304f7ccd3e87e86c6cf68cf3df184c6411a35be964a5f4fbf51ede6ed2bd7695fbdda6d0fe16b5f3da871a7aafd8909e65ef37c701f03bfbb99d6705caddc37d6b6ef3cce9ba1098ef99819dcc77c6f5a0ff68dbf4298bfc678272fd73fc9a03a542a95abed6eae1f83656ca5b1b57e198665d8845de68427e88261199c451815a51a9e0076d12ab53f60aa2382e1cdf32b0438ede38cf7d4335ed75d8d4b693210aa64361a3366d7fd065f06de4c24055393d31ece7ad2b4874422707af8dc77deeaf4f5bb6fd7b4d5e9725fbf3e470477b0a630f7f0747bb6ef52b8bb4452d86e3eb6db2a1a57ce9832a914d4b40e7615c22e057f42a85d6ec26e42082184282f13c1288a632c8e89f91a73baa70ff51c17f3a76fcad9989f93a6f0bc99480ae56522a98efb69396ea6344efbe9715caac3f3bbc97199480a6b29f88021449a0834006207a926020d80a08208462919341428385ec16928500e10a1409161a0a86cae58e9bfa3809e9ed669321675b279a1fbc8c5a44cf6a22e774f73ce79bbdae1a8a2a15aea53aa97b1aa4f69dfbda6c99c7ed6ee352436b47a35cd7efdd879b9ebba17509db742fde93b4a354d5ba16efdd39fbe3ef7272fbff0029e9afdaebb446cb8db23a379446cba4bc4065b1999542ad5a53aad6adfa53aadaafe55afa2e9ba17e87ff5476783e21ef539aa5da5ba99ce90b9a993bdf99ffb19af370834e11ede6c83b99b89d8745df7bd751de7e5176c1e431a0c6930f7f6db7354d86bff50a9d4ccc39f79eba1663e26e6a2ec678feaba1770ccc7c8e7bc8c7acdcb2f74977be8698ff24e27cfb166d3a3bd041a732fd8f080386b3df51df7d6a3b14d2662038548f53b48e0e265b383042ea4a0368bcddff78551a1e70fdba1cc44d052e7b7077fe51f83707c611eaf3202e1f6a3f8ddb862db8e9ed3ddfdca7ee9d0fd219c4d6210c4ad1939b09926486e2d10a778800a683ca1d7dc10ac651b9a54d6f0b77f98b3f67f088637737f02623f88d6533ffec7496562a6bdfd55894ff1e5576dc710863fc385e1cb7cad70d6c80186cd45f0f63602333ef5aab740e055f5d4b75f3dece373430061ee51588668e1f9337cc4fcecde7e05f290831ce42007b99f0fb98ff172fd917aed2377737cb1f36bb511e87ebef6a7b7945abbeaae8fd3d56e1e82e773f5b31e10a7b2fd989be38be5b8db937aedf6a09e7b1eafdef4b2bd443e9c7a5444cd78f8dccd7d258d7b2462998733785cc6cb4cf0b4d23f0e73af453c2390ebdbe7aef4efe625986adbb6c3f44022de2260aff48ffb7ab59be11f893be66b0fad7fde839dd087faa64fc2404c587beb0dc1311fb71da6b6c11c4d4e61eedb5f7a2af5b6dbe9db3d4f4c7d90edff69a0642490d46dffe03545c0f4d56463eccb08944c9ec5e202171ce1fa36428ff3f210cc7d47934c8cea3feaccd030c9a86e7eccd1b83350375b999b8ab9f99f279e3c2410c73ce765d467eff6ebd7efcd879579ce47cabe7c6e0886da43eff4315ef78e4f5e465d5a737dedf49c37c487c675cf133b2f33c1f56a57fe87b7979b29fee4264343b0840800220b128edf48208e3e64acb0f99f86d34082111536f70bfe8e0e1e8feeaf84a3ce6df1bbd83d957aebedae92be4d58a62bb59b8fc4a01804c4bb441e2250e4e19b51a21882168c833b8a214809426afb90d5316f9f55a800ee4d5b3ee2700b6c6bc184bbede7c642f7f4e186e439d86f2fb71d5b103679361fe79c318495dc4ff9dbb7a4bf3ddc1e6e011500f1b67ddc766c4d7694baae7b16fcbbcdabcf794db0c435cb3cacfa54a27e663fc76664b1b4c78f209e331fbe0e16f59aeb344b7a2688e49f8ccf04671e12962859706309a20b5e006e2c41bc009f1e7af9886f9edc76188165e0550bf1edb310dfcaac04fb5b8ffbdebc0976ef8863eec22d600a5a15ac3d4fdcfc88ac127fde8629cc9743fe491f700b9882fcb943b5b63d932acdbe09ae52cb3e635a9db89a30186b0eff6edc10e0868773d338fc336f003005ff8a6d3c20748f374e4f320cfb52c55a0bf1b3cf10630fe3bde11f8df76b1c3c7c45b388aa695aadb53ed5a6cc5efb1a3dcd93d9c758327daeaf51fab546198e64b8745be832307d235d06ceb2c46e8271082c3070cdd77cb09f0f1f43081bba3c1b9e05855e76c8c6095df1ca30f11109b1d80c5d2f03c42e1d58f80cf879d67cfff7b781d3e61bba54345909be242fd8ff864dd9e4584db12f9b2d24427e5e6343a737a85654060e4e5216ec9f2388902e3aea9bde2524e47209b9a440178ecbe58a49415651d8243c858868ad120c12f2cf8d8ca04ba607d005849424c465250616167e4c7a127bbc7afc78c0d10fd5878af419b5ee1e416c606310608f30ba60ff1f3f640f56f3cfa6781e8025684a1ff578ede8c83255a881cd36017de34f593b8dc38da4c80115acc900230e6ca62d486db05118f44d5f4d1e863ffefdfc98624d0aac114fbc811f05fb13ec57608741a28e6d1fb48ee91d628161d185ad7ec1332c77c9a8a5fa968c116cc1a4cc08368ca01bd9435711ccb3e159548a24b1f1163902049b3ba9086c9e8f3aa55799262cd18bdd8e37f9db51a4099a8b0a55183e54a3a13bfe2561338d5b6cf7079f8c2a5d38fb910c024202fdd01f22ea47447e9421911ff99117ecef5ddc0b9574c88f2891fcf123223ff2a3272da5ab8bfa72c7e3c934efb8c7d71be1fc38f39ab08ab2ec2ae97893a3500c6ac28a40334dd878e54b62c1ae2c8a3744576cde21a23f06e5080494654747961865099b77e27b32409c77faeb5ec2365204f2276ca6389a3472c7be4082a14a10215d62908b0ceb4f630516c628d115831ac74c1376826142e3f0998414dd592e5bf18a85374b2224dc464141f3c8bf56bffc7bfcc05a3d5430ae42eb09d6679eb0f0711cccab83b0bfc4c971251e6d61f3e73f5bd5874abf0dcf2abde69f7b3c5e0f256ca6168a221838c00323f6b1deff82fc117cb0bf0dcf03b4dc20826a7ea38ab7fba879e2d314451f30700073ec042d4ac148c2fe5acb070a1582dda14f6c862df8b303ed1476b6eabbe969bd41a2e9be406fbb7fd65f94f0cc9dbb53bbb0721a1164084c0f2ed8ff07929730ad658b43a65716a424239b61bcc2e608b47df7a7ec43d14571910a84bd077424ec434343eefae2d50822253dc6c1acb77e1cc883a0f52050bc29e2b697ab8bcd146b911221e43f2fa129561c0a7c1b9e657a77a1a12c363798f8039bfd487beeb3bfb68fe1155f18c78289ade8f0667be1960c07c38144b6e1e6258937fe9a67823ff1860b9b29a65a12f58c09306058e9a29ce8f57062b7c4de1277b06048699982fec91dd8577545f6937039d0904b4a15a3e8452b6c7697bba45004fac1591205cd90416404042a8c3081135b8001f4431345c020c51006fb13f9b2a323862265d84cb514582f5d5aa6a0f4b420db02a42d43bcbcb0ff0b54a3e932c43f57c11f853036d3a8c5669ad48497216fad228c9708ec9b35b10d88ee8e2a15fc197498e7f3b90afe363c8b4a868fe3dfd71e4e7ffefae2dcc0f95c857e1eafd16b6bbd0461ff94a4f24694c1c1e6ef7e9fc5e68ff6f7e9b8b9af7cd8480b0fca947ec1fe5a9047f129290bbff2d830f66a1cfe364a80b9a20e46146fdca3640f92ed4921a2a82387a4101196539e0c2baf0c722914848786a43c9248f4775446b082fd69bea688a894ad7585452d11d10c0000003314000020140c094422c168241a536565fb14000c93a248745418894990c32084900100100208000400000088c8dccc00bcbdf5763e6c71bb01c0cee3087158de58af47fafc668d52d7008b50c11dcace6ef541765362c9b20775709e16b79d1e2c8ca5fd113d585aec72495f95a9b562d016689e6e6d922c58f60627a7e5170064bc88a92bc017595dde71fa0805c6b5fb5338e888b1ce8242a363b4dae59a0cfe25656837fa81860b6dd383116b0544ae81af24ce2a5bafdc4a8308f5741483cc46319365a504c6be0e5bc65d12d3daf2fef471af7f1d91f59de9ef45639e56ab34d38417e9494cb508995c9744f9449a6a3909af86e09a94982a0690e6e8c28aecbde3bebd5e8a9f54cf5e83dd01c61ec3403c0ffb3dd6b1f750f5ee416ece557ddd8b94243f0ce583c9acad7be96f3249ed9cde7e4707c222cec723d0bb89738586c6904206add0bd82ba833c64027d57388382da5eaa8340c150adb0b3b07b53699df40684ea7d299eabbe986c4f7d87a0c0d05cfd008b8dfd5d85f6025c6f6ceec522e21b48633100332bdbe1040cc59c693db8a589a7dde0c756affd0bc1a6fe293560497f05b6f2870427302c2298b9c9dff58a90c1563f85691b21146af1fb6b6c2f7efd8b5ffc321fdbef62171035ff6cc51c694ac1af619b8a96c0c9d84000fe920376504d4acee79413ba024f8d9cb34fbcf2da288c33154ff8e28d18176376dd4c91a0c3e4969c85ceb9476e2574164263d7395f3a9fa3a7686eb5a79cada1dfdb82fffc84143d670e47677262eaff857ff6532badcede4f8f3ebc0f8aff899d6f4b46d11c8a819d0b96ed2a7898ad8b98a6f6965b06fe988f04efaa17a1520d020ef7cd69d983ee35621a4ae0d0f997742e366d3ec9c6179193ee51c54aff24ad0479472076105a47773dce41488748fb927472b8eeb82ceb988796236ab76dd152ce500cf95dd060a41556d6e03ff9323729cca2f563c671790b4c4335e868ba18d520c042d23214509e5718dd5e9a6a6b566be52c1852624b4e9a721df7cf094106ed7919aff9f1f071f06bc886188a6388081bdeec4f752ebeb2879cff93dc511e1fc92ad38a3511a483f971918cde9ce732846bc7cfb927631b868a5571f61539dbb0e13f71470ae4ccf9b0769b06edf3311b561bd0f337c9982c39a77680f6fd7483b10eaf55a387369f519d6ea5769b0fa9a5b6b0216d737e565404e89a7a8625a9343e25f753b87941f2bf64f38148b0bc512cafd94440e136ff4c6901e8a8ee9e1fa149503e02fb40d9b1476046497a64fea740bf5c9bffb48fa9756d1e32328ccf4af0be8cae66c24fe16e3ec865fc28df801d155298633e82815a526e2f779ffa687a0ee25a9f2f15c9ac3c0e7a65266f3467a6292e638f1ed0745895ba109b088a6074749acffad589c30ac95b854add954e3dd31e384c874ce359f09ea159a19feac963e71c660c392a1873510eea586f5504ccbb0b53fa2c2ab43d3cfd85a7aaeeab5785cf7715c6534b1c23af9b221e53910aa53b475a07810bb32476b1e6001b5817cb5c9b17c719a6736118962623323c10e32a486a24fb9cffd444c3397fca3a52cd70f0bea66e38cd39b1fbb6e22acfabcc9ba169e7e45f97be0e9711d0337f89ef6340cd72ab1e21e29e81a0feeda5064feb16dfb9bd6b128c405ac79fa01c6955df03f79cfea36f52f7079ee5b4d1ec9d50f149f1c0f6dd86658f832d60e088d234e3860a66423b3b9be9cb60d3d3a2451371c8bcbd32bde333731b619d906a8d341f009362dab908ec4980607b93d3a94001305c7d0bd5822e959bbcd2868fb30ff3b0dc88b74dc559a8f328fec37a1f39bbd06da88a34b31fb030b1e5cffe26e22af74b5d1e45a689c9811d4c58aec15de935c61d40463f52c8bf9b1330fd0eac0cdcb096a69c0766b745a810a546f79e91cb3ec8fcdebc8985e2f7bd05cfd34ffa1b62dd312df30fdaebddefe3d495d032dfc4496398498b61ae80bc23e89e1fcb58aee1052ad20d5aa1cbd0993abb70fb21fbb735605ade496bc58b80d1963aa41803105e44a49e782b48602fb8a26697874799b3c4a71bcd2988d8187643241c341a6166f07156f5b41303f713d488e69abe29b2d413bf940df1e7f56c14a7959dacb56df8c9b85dfd5e4b14cee8cf8a565d3f9fa11d3bb9457a3a782f12227d3ecec7b87b706c9135bad7415c47a48bfc682326992b439349301585ac1023033cbaf14586a7dffa9d1d17bdb975cd7517aa8c37410cde23c208f28783a0972997a22f00fea8051609f5ad58e1d8b47ad8ddfe1c64ecd3a6a119e75e2a1004b24f15a613991bf90411eb3461a34ee642dd4a4b9ed255e4ba05c64ae9c8368c2ab8c2c39bc6c44bca8aade4cce4235c2391de27b35db5d113c27251a382e4336fe64804d8ad5b13f161233d29a034d2257cea0ea8664e0d4b7662530a2d4a582a7de90239e8486faf5dd8453ef9911ba36eaad8631a5131319769c4b0473e57bb92252b6490c1cac908bb23adc8a9e830e91abf3a24576d7ebe5d8213d8ff942ac1c5c074a675942782b2ddaa1cd08605b3952af210c2069706d119893499d79bcdf9018dc59d72754d0e398e86f3015909e70d13423543ef2782ac923817c9059df621323f33ea39e7e5b3c4c1f614dceb990ca6ba30722ad6a7e183dff41f72ada08cb49426c0531f8c37a211b13d1b5ce424212267ab333a4fd7c9819b40bcda9d15516624df0a46ad4ce98e0e5eb5c8dc636fd0d2d58ca86c3ed73cae0d307d72b8d703922c848148d41040c6e4e7a1f48192f34f5ae45f79215c30df061682a07c3fe089f2b3b6754cf4635c5d0cc6c70501098278e8de5d29c8f0c6381827bdca12bbf22d84217eff3f7404ba81ae8afdcb818c64d9bcdcadd521281e284adbf2cfd9904696189b8e11a370e9c2fcdec7b08287d4a26ebb8f0b349121f2b9165ab0602a2a0ddd4bea3ba918c5381042bbba75d0cab849d66b1851677f2d80ec9ddb9d3ea4980451ca5baf77e003fb8a0177d2a4505e439f5cafd53ff5dd2073e1150bbf84366d79bde689588fee9ac52ce67a67446aadf09bc379cb106d1ad60b902956fbcdf3537e9309dab6be41b135e86034955f0a108bc753fdb584fbe2dc2fda70029cada1a8dea300b986ab35f26a03ca6853829c84cc864ca023c3d26752c1a2db0ad89a52ad9e3932a3f0a7bcfb5faf5c7b9a7772b708dbc86b2f6a66e626975a836d85f676f12e4c2227ed68311f29d812191224f0517526739bbd30cbef7de5570093dded20bfa76daef648e194abccde1b8f0eeb6ca48371f62f25929023190d0981f7dfa946767405ac0cd840bef0dff841cbfec4fbee1913b65405b751e6c103957595c9b2024437de8685632aefd073825c6127d4bfabebb3fd24dd3337302a9e1d7e48a7968fefa6b015bea15f37216868eccb46c37faa5b790bcad875b6c98d3dbd9fea891a711a50f77f2399c0d73ec528490bc1894b0eef3582d5f9f12c76f80e10ace64b4fb189b09d1f3f8b397d0ba0dcdad2f84c257ebe2313d3b7e9b9d2e98cb80ab06d8a60738f2ac258a52747b5fd0050167f5efb745223e512fa089e6d2736205c34939f8592a478e94feeddae146de36c96159713b85f8fe6eb75611f3a376884071362c27414d16bce21c536c7b2d54e2cb5d5c94401091f497d088d88202bf9409590b3f67545145e7816932e7e7afe262efa42c874d4c136b94fd46ec2d565ca8acea621ed3843e4d59bc831c4d1d554254fcd417ea6d0224f7ae40fc02d4fa587f37bfc605eccd990f8d1f80e95a4f83a15f4d466f92c87b1372befcf7ff9bc278038f2aa00aef575bd28045660ed57fa98d93bada5a14562397179cbbb048769f7bf888d8a8b7fc6266551d8c396b35b82a09c8514edb8854076b8b7c82f29a46b59812da87560ea2b934f9cb062b0390be579df51869a11aed68f06cf40fefb0d1e9db875a9edf413178213c8e717a8967780e5fad8be9c27926ad3438e85bf8d98780fbdb35937a0b571d0b755f010c483c97a16fa67730cff49e55b38bd615560da418c0c73fde0cd06657b1b78e2b86ac45efe18ac892bfe01d0b2829039f75b80f66c172ed913235c221dd7b2ce73546a9adbad89667b466603168f529acb08d2b6b12bef714af6437797072a58277e402ea2c9eb7a64c4ae5912053ecde75f5497957eb98f90a0fde91251e4dcc12f089d4366610ceb8178baa6ed38ee129f83955949ff37ea7dae43456ae2d875a9b26a37ee2f69a4c97c3fd42873c5ab026d9dac78af3337a77ea0b9a094913b0ebb9c840379795e061cd88b5ad0229745c40b9cd824967801d4b75f53b1c6574b57fddee2d9209c9646391f643c939b48fc4c2ed03753fae15da873183239cc943d60dd7e61e1446f4b66b653b7cff29f481b0398b82c434e919aab04f2fd21f67c097f71fc3651b5cf772545614f3860ef8251b76da66e435a68c1a913b511d39a9c2f141d4c9f44dade3c4f0cfd2c4bba2443248d45bf242836440dace00c92c106c5597cede299364e5248cda8a02c2179dfe03365ece914bb80090b7e3367a80c1b9452014cf7dc5a1171cc0af17df33f618557aeb01ef14a7d529cf190da28fddd1270d7f1bc4773cfe665b1f1d9020c4a35e32c55df1d934b98c8879ac9d51943632a67b0b84c77791f813833f906deabee4894c1793655dda5fdb72ff2778aa0828ffad5c6b2d03eab0210fc18f385bd319d0b8a4df5d6af1907a2030e497c9e104110740d0423410c5c126983222aee559ca093b5063894843abf799b46d943b2018431edf113a6e6b9d47c30aab91e2760ef7be455040c9596e9637a9d061dc1bef7ac06a4bf5c0c05155a5bc5532863557ba890bdd350f3b81406a042de67f8b320cfd50d4a1f6e1c478ec2ddfe7e48f3e1f222d4ca2313b09b39b4cc57256056d8e760bee7cab961b9f4ca7fcb20148cd7dc0e39a87e6169ccfab6b10537702ecd7e60c503edaf671d5796319db236c3b9432b92b621053912bf51fae699800d6045c8a5c0569c5664c6959a02cd172dc55e5e0a7c29fcdb450d10658528b28e9089972695584dee4c89f1602616bc765c57aae40662de3f6a216e8218678c9c6f90718cbfb40625b2f377c262e862a71af1afb431405ffee10f17d790b14c686fde64bca4455eb755a360353a81c1c3f3700b7c40bcea213a0a2aadad071fe16a37ad5e8aa28295b4aeaac4891f26fb2d1f2266da1f73181df6ad8cd76c2d89512e12cd2a498dfb0539f8146072f58376138006177472f901a3a5e885b5da22c7798e0f82b50fc3ecf53486e84f3a499d3444211220ddf027e64418f8b1d603227ab351e564a486f436cfc6e5f4ca98c73670dacea3042df1a217343a6d97d8693a6b115b9a7810af3b4432b8b167804a005135895d1bbace946ba8bbc199f6b0dc2c333ecd2e054db3b4bccb5f0a380a776c05ca1dfd8bcf55984a9785581c2bfd0ea79666325038ad436b5a627dac2281defd6a352ea7bf1848033b59653e9986eeb4b173e72edaf015fe94d1406bed8af9b3185a865c34005460c67463b42ba4143181da0d584219a0fb6d0c2b44d3a469deb7e3e45793663c837ab29514723eed0c88d734ed1f3960a04536a3b023b5021db3f3b05acc76b3194242a157414c37920258153cc9aa3cb1a9209224ae19f7d222015d37313c76662a8ded9bbfcdd564ded0c693d2b7f637ec601481ab1bd8a30158782528c3ee190db110d5244089ea11d5b34e3fb196a644ec97acf61598ff7e57dbae3ad27c79be08f85e0b4add6e2d845863c3a4e5e361ce03f3f60b32d08d97d19efb6f12aa4b6608aa2bde3353591ea0e855429ce829d50d9fe7dd02c5d4544472976b9db3b89073241d899236e1c7f021f2a31f5b1bb927d6097b502c62ddbe9f438f32302f572774ecdcf25a5e62bb7f72762781c8e28f32d056642de8fe2168be17e77b96c26bb44da5088487794177ec8fd1e3fb03ae797705db034ddaa6c421e090be3f82f805f5a721520e54922cfc4584c2da675761f0b26c800dce8528ef89ab60d8e6c962edc2e8ad3b455051ac350795f55b49e896243569540e38620f58ae9318c82513425a4e5a0b00c880c8df865bdcdabec578c65d31a7766013a319adcd5e08a7c393744c04124ec55506e093e8a10bc81a1022c500660c2b6e11372a852aaa75eec54f694ca101136df74a591fd3076d63eb7068186711e3fa62100f8cd583044dff7717b4382a46fa60ec84ebd6de0e5ab58759a5dae8e6dd82be47991b72e33195b76a49ce5549be04329ce0a5edb4f4a441f481a1fb6630befcddb44646bc7ceeb49e0c1051c04fbf9d1afa108e789b22ab61284549c6d3b43fc8abdb64d5ebdfd64b1e2239513ffbe136deea5e41cb046ce5bcceb09d949d60cb224562673e000e60f28f86ff0f64a4eddcce9b1a63e58a0d2dcb24f89df13202f5baadf62964d6fa3a6bd092b9b516efc9c2361d403355beb7a7e7606420f968f991fb279cf536cdab4310324fe01685f5cddf0882e10a6b5d463668a61ab986bf8d5cd9876a11f6f290dea7f2980ce94485ab250dabe997c02a473e399000cfabe4ae5eff783f6d281e4f57e909983c250cd3d1722b0d6c915d326b4ad57744ab6fa07adb81b578de5fb8d3cbaefaa4525a8e84a9900f2ee7a4ac2f2fea36137964de3ef2a524a30aea830f4680ac29618ec860567873e82c30bb54cda869e676758b27a360bfc99bba472b505dacae2a0c2b882413f8d737fc882b57f46e09950adec77578cbfc8c4a9facc280644d60b5d49be8ffe70479d610f50422f813aff62050c56b53f3dd860dc6ee6d37aca382b673f09aacb9a195ff80ccf6fabf93b6ea79212a0dc37c4c7db5cf95978d429977b152adf80ca9956d07cf80fd6fd3a69762ae4fd39d382e540e837d5d019ce8299178db971b7dbadf2b5a39fa342607eee133fd1ed9dd0414efe3c47acadee50ba6205f69ef82524c4cbe793cd73bfc6628b010a9344d626f85076b62e41afa88b7811101f6bc02d89171c79145ed83bc87328ae8886ef772a31fa4270d487c97f6290dce582056b4e3da0b60e666a9f9251ae843591c79cf7f4d519e76baf6b7171a90326ded473e6465785bb40eaec41834773adfc90ce8ae00d76ab1da3f16433b84799c26d1b9090e65ec19bc7dfae3d403b1a8f3592b02196102399580887b4117cf8a324fcc894e4fa4adbb83737a66e5157d0e130254fc2c0d673bc48b34fe46af4cfcd35f8ea6f8981a7afc32f3c592dd2a37cb879a89a1b5a54d112b29fa26e5ebc95d10bf443a691e3c1d91040fb3e5477f8a8559acd64c14d970bb17bf02b04184d426a068df17a5e31605307bdd85f1542510732b20ff8dcf39427563d9bd147c5b2e0acb2e8535a6ffeb11680671d62126e5baf9784993ad0f50d23f98aa56755585898e16d2623230f584acee1b1ce551b3e32e007a2124c4afca4970c48f646725aa770f7976c07d0a817a2d7d778fc4f5261374483b5cb6eb46ce340b68cbed4ad9ad300a86d5ae59da4132340a3514911f7deb56f4fcbfc88c940eae3893ddac04d0990c616f49d262b7bee75c2269121d9ff9bed49af63703d6238d4263f59163e2fdac8cf598e628f80b320517ed7ef93036e27b3526daa65530063bb707cb7eb5a018f28151b090f053804486272ac002764ca34e2a907dd091755b4823136a525b5c78e90f95b171cf8890524394912bcf068447ad868f0d4444d1474e4e3bcae03968dbd503c16797d0542aafcbdfc5201e26465560c2bdcebd33d0eff34536670327786342855c6c64e7d224eb00091a5fe8f9631c4f575754657f51eb2a4ef2ee780a0c2ffb13400af9484d3b86642649d00740a26fd0c0ad8d9c26f56f9b83bafa44f4fb7e0f6d93bd4b7d034f95636ca01566e60fd584c4fd6676afb592e8cc86f6c016c4b6d2c31ebb4d99a524dd063a7791de64f796854799a825ebeb537c10c91b49023c77594625d2d36d3e06365977e2863f29f8f1e6254879550f54a9b90a64650716bebadc514d06e3384380c9003b5290e42989d4f28ccb4bd733a0e5dd88e08edaf1aabb02aa09ad3ac24835b8043bc7c580bb9d061971e4fb334402ac542b17b54a641c47696988f3ebcf9c33980bb39c73d005b3b78619454ff35e1ca763443958441a1153820de26035086c0c012e787e797f40351738703850a22f1cc198a37ecb3a07e2b310ae52b57db03ee03fb27602d6530dcc1955b696b2ff0c27646af7e21fdcc14589c2f3caadfc98b273c9574b1931991549cff4dc5b657a51419e2b19135b07caba82a574c092313188015574fe605c3e05a275603f3ad7a0d50955e3e29df7ad8d91a28372297fa11a1f45249fd7e173d467f7fed9aa699621c1509875e2096c5ba815507c32d33a99ed598f5a14830fb4d4ab9fc1392cf97043e6ee82adc5a8eaa91af973b7dd19381a2fa81957b4f921144d9ddd6bd61cc4f18f432e932fff65d4088f85827cb1c5e2d34ba0267f52593aba9deb026229772971d928ca843aa407f027137dff4b13eba0ebedd147e23ba8a02c03eb65a3dada1bb84205450a7a9aa25d92ef5854d54e783fc2fc445dbd04c1fcb8bc73c85579c12bb271be3861fe027c39fe5b1cf080a4d79cc7c5eac2e896aca823fd8eb09e6b0704c1a086b54d9f463540e0191e000b74442d695a1799a4e3b955ebabca6b3034eca7b6c2b3bec138022a5b25c8011c6f5646c81c3fa844b9891597dc6539987ee13ba184238f0f2857348218eb79455fbdd88e500d5ddd53a9ba62c881504abe4cae3303daf32d9113bdd196a02077b24c919c2015beaab82960ec3b37578aa4de809a62bf3e8f7c63ba898bf0c9f3cc26914bfa0479830785cd17578ddf70306b4422bdc151047fa90386e8089386adb24b6b8d15572c7fbf01026c5af2de7eb0c2b5adb36c25b9c74dcdbb061b131e38e0bef894f90c3a36634e02851212fbbbf8ec840a06893e00d5fecd986cb7f6fd24c5c473fe7f5f66fe582c52e2b7f23935f19bd81dd0961016839db5f21991a58d70f893517121404f8a5622d4c0a074c7bf6f150d3b373626a8c88f27d5308e6d48b7594147a1f16f88f3c8f173a5c8e4390190d6cbeadac1e8cacf980becd5e9ba39d3568cd8381cecfab96dfa91b10b7b58bc89da82659afc7990b1e3e97f1e035e92449c97c5f6e7acbde920b652f89f785207e0b56b92c8db69d80064817bf5ba94a32227b959755ed526e7e05e98581bf23b9e3a8368b03508ca034e49005c802cd4490aeffa99db98a33bb15fbe8f836ef5752b14eb7078a1c43225c3d2fff9882b6895c4a3bab235804e6cde26d6bc41bcc6bf0cd72d33aabf709645b3829428d9a39512b1e76570af0822f8d8f878203b8346174a61638943c54c4a2ead1b40e4320211ab1d5bf0a0868346d582dac8986ca3b9011243c7f85a851a72cefc6d019c5a82893f5b84222c512f5763c73473ff3577a9274791eb64f101b1953e0c22ee1e30b918d815690c3836e779d011d1bce269ba653c4985b5b3e2ef479d2418b081064647d19b84aae48b889e39c943316fbfcf47ae349b2417dcc27eefc2be900cdf9719d693be3695664a53771fef8654bdcea05cc41004c378fa12a2cddf50ac98f43265e3e29328cd8a2222dedd8cb2d0a96563ba029b66468c7b8a56c1f02579af90519a0d2ba936922a254094ca8edd7ca4a7ea9f0807a074ad8dd9aa03098d469fb5df074d6da54fb92968572c024cb923006c87a22fd81fa59c499a3d0e773b4e68bebcc2455756380fe895e78b014f0545d3af69778e40ae15ddd4532fd3460808262ac9d30ea1994c422785cca3e629e9867ecc1855d80d799056ec73326366399e8656c693811c8ce653f1c07756c8ef1097d3b9496f1196e0a00eb7924743b2b8152a4953d11e42ad9abfd39499f4be64a833dd70daddab9d88e0ea1d46c50d83da768497574e74563eca8bf5777be0ac635f584cd65b9e9cdd064778df888e18d70f92a1574a904ba7209a61ec8e9ea2db350b2b764bbb78114e8c4c40d7828399a097ceda9615b2177c239981cc333a1eb5e75b14eee591eb486f87e41559658fbc9f3a83840a72f79dc19c5f30544c80212c36cd7c633c6064d527e3144907f87083da6c76fef47c49d85837bf7872fb5a3fb68ffce50649e11ff3632f2130de24fcd2029101c40a517b8de2ad59ac9dc7b5e85b514e8b47b281ee310278a5a4085633c5b16905ddea50fdbc8009913260e8065655320de44257f6bb86c6424acbbac0fe8839895d4fafaac62234d33125b83082864c40749d805fe81e70d4e9f6b67c1574e82d0ae40a8a829adfbe0100cf122ab347a56239a0052a5d1c1734141c1667fe9ec8817d2f6d7c62db5e3b1726eb44de3624e9d25907093d8080c56b1dc81858b6a36d8fe49cbba0291713b03cf99ee70030e00f3468eb2a1231d51f18abea950ded7b3a59c28714476b38e7f8507281315cced5d2130ed5ce20b5bd82004b3836f98b6e3172d971ffc5ea0b3276e6ca3bf135c9dcf49da0fa7336b68ba399708c3bb89836b104fb69aab8a9e3c431f21453c013b37a21d25ed2f3aade04b71e1133b36184bafe1d4c119642d280d81677c5867ac4d418fe2358ba8296ee4a8f0f2cfc9e9226823c2a5b36b1558fa19723d5f3723dd3cb2a57ac4cf185e93a7d91bfc4d4833c9b0cef64222965c9577134b3f5399c2e4bf5a6d3b74143bb20a04530371fa8612cc16e2c26a279553eb061504b860e838d85807a4fe685fb0b8ebf112014bee891d7786eed29ae0d6ce127cda968be7faab74a86761d727fbbbfe483630b54e1771a59fcfe7076762c00f27475f9d9bccd1456e65f64c9f7952f3b8cf5a61025961ab9c2f28f9322e95daf5de131c27f026755bee9f136230595c0e9302a85d1115ac6a8e785b4db2cc06b5e55282b81c720ccd3a5c6a4aa2a7c3661de3428b94782e36cf5e2dfee4b58777f38496da8ffa05483c22cc126d4c74af752cb35d22981a3147767685e515267b275320877ab5d69c66c8240274233c04771b59d4a9faf952ffd8b48a894e59087d8609285a738dd3faa752c2ac53a195dccddc5e6d4c9089507e2a2bcce59310c2b7ca15aad2e35b2f302936a0207ccf1da58143e4705601ee50c6919e430d6b039d4d79805614ee1db5ac9f2e5e0efc603a3e9b17fe90b60f11a781038b1eba91949c04bd49e4ac62d60a8fd374d287c649abe7780482399d05147a29113b7fe23bd5d3f9723fcd6adf25d5771480b111e7cdc95e4f538d7d6b66a95fd994256aa795bdd59e7f3d59990a36392c19baa6b0f77280f13c45eb0d73dcf1da213e1883256b7c71a00e8480605c0241f5e8065ce15200203d55bd87f360ad5b640e84aa34120614a0a5e456fa942aadab667848337d5cc9a117f10897d8cff7164300889796776de4267586dc7f647be27308af6aaa74147b31955c9ed5d6d528db089511ee643ee422b8c68ba8daa06c463f175a3639439fea3f1eb5a9422d6da4430b93bc9ccfd78c1868216c745cc6a865a148185d86a13040cf8f4029e99fe8511e69d52d974ced5d8737f24b5410529c3de2ef4221231098eb8fd4f42dc92ab85b027a300803647f805bd1838a707658a76f8955a7300dcd55539970dac5466345b9b697397dfe73dd8a9c33b6ddc8d7c5a0e74c6964fd7bfca9ecf1da92efeae0fc0c31f741c1ee1771a9ffd78f0c66d009e1e0e7260029fad0b242cb3417ddb607f20b204b8b8396f25249e18c6839e4e9a76d36fecbc7f813ade0ac4b68074a615c0c2d47d98bf12b1824e6187dd0a27bef1b0ba43e257624aed64c7ebb66f6539246cde441526fbcea52afa6485049cdb7901db46aabb57e6862af9bc93c51a4e104384a9e8f41c5b49dd40afbdda07daf023f8fd1dcc294bbbb709b8a42dfb07e46a6696e7f6cfcbff343aa54e471e2ebbac8a2144f74fc6b1e3cc56a71f2f34c48193d6c9fdb8d6b1f21c27ca74adfb502a81c0916ac79861090cf068b4a77cc07dafd7b65d18973d3b414b658d644a66ceeb914b1502de40dbc9e8d4fec7f214c11a8bc0c940fb79fb2b3bec90e0bd644d0b0510df7e7c26e759e8e867d657bdddc42a5b3b713154b64b94e0037a05f18e46afc587760a6c5bdd26b50d74253749ca59afbaf37c90bb74a37bf2ea46b37a9b0418f7bdead514d04fef50eb1159b99dc9e881869e071350f4fc21ab915a0da775ae5f61d4c7e2c5b3bd94cd5d39678b511b3c546af275cbf2691c692c7d48fc04ea632842c16549e632d3f907199d84f9caaad40bca46b809f3482870ffbea262fdac543f19d0fb176238dd863018a7a4ba2bb6b025eda03a8561e7b3f54ef0520ab683e32ed13c4e085d00845bc5580747a032c29db7e65d5e65dee425cbfa1a170810b5d1b0bd6b21ec90bb9f60c6b2e1653dc07df8b1205419eb7d174dc09d8b0a76111db1d50996385d3605e85885d6464ce1a0136eab729452b5adebae5addf0e1aa1a8bd61388ebf57a69f3a1d59fd4a2305cef3d814beb1dfc705656c003a0fba8b0ccb9e49e5bc2ce10dd2c0289b9509bc925e431229628ac0f26e2a95f59aaa7e188a2ab64b8a4114a8212c8caa7032220c07f5ea13a4e4870f92f2f35083443bacc68ee1c94b5f9f0ce784b5b2b6673be54a913ef889be364e1e2313464cab6738f7a797714894c3f48a1374212714a6ba2cef2251871ddae1abc1196146178b10a6eeb7fcd5a0186cd9475960133ec2e0e235c485ccf1672f6b4d0c9869979a50bd02574c77e36da2eb2c85cce22f3a4cd6eb00d1191c93b3c1c0af0be5965158e153c873ff8086b5a05a2d06a3a59502a2b98b7f7f12025e72fe85cc511f0396fef2053f9875a4752e429c7a11097edb0c56e0b0cf8eeca88ca796bb13311fc6cdf3a198697e5aabe7192e1f666cc86c08cfdaec702a506d8c46e03ee9f3513c9a8002f3786cb5b4fa83234bf2671c32b65745007c99c02a8827da804deaabc33ff29c39a25aaf6e7ce24510e7c0522cf222ecf793d018e19b4aa639e930b9df07879c1b9891306daf1eacd6b0eb9164df44d6e2e033de5e70173815c310626679f2b20bba7f03d0f1830856d970acc922a04f4147456881ca0116703379429663df745db1ec3c4bf370390bb00a9d8df5317f1f0dbf458629d0ae7ebd3c1632f39fde2ac412eda147d296acbf6f681de73b78c47ccd037090f51511208eb6d026e499af8196f6467ab17c0ede3c3f50b8e01f1d626d49e354c5e4d8ff9ee839061b92079a77b9d6f0372be558dc652c0f9e6a788591f64aa93abb59cbc014459c423250e06835f90e624b73f5f5d1a1e84c37852edb3c26c1f4abd664981f2d5852c9e377039bf01de7918687c8d901eb3a1ce1984db8f968303ee066b6a912c51c046fa7832df2b660ab588bba9737dd33d6c15a9bb5da75246c86520a8a0490148e078ce25f25b674cc05fdd1514ba073408252f414eb4d3c791845aec4424770b5a4513cac9d416a67be8e075b3dc5925ce50d663e6108c4eba29144adc2b08eba0becd5a3d2f5e36683e7aac4f453150863669c5072472bd230db33d06bcbe0e6a8eb602257c4f10cfe03e3f712c238125c587ab72bcab0cba1f21a2ece27431d3eb12c760eeddca04f41bc741179c3f211619fccd0ae50379275b4cbfc4ba6570262bdd8ba3face03a6e65d2fc6bd9c1fc4856a279de8a0c5e2ea58304b7af1b95a5ba6c2098a0debe67315acf99def2bd16adf079cc9532fe3f50be04123445ad2cf72e855eb36ee3ee3af5c958ea6d4436f397bf106727bb8dacaa0a0a044cb31f456a3eaa7e2c96800a3c59b6c3255ee8326545d956c9119c2a0a697168e06acf621abc8f4b81b49d40f25a1df010bbb1c423a37e0425cad5b2012ca5d4e3a0a33809535c4a730221ab583f478be52edc5f740adda94558c02a05cb0b56c88690e729bc549b94abcd6c2c8625ad95f31bcb22ecbcc88543bec00ab75aa7dcb1060bbb0577317bd8cdfd0a967d2654543e5eaa9f33aae3e901b2e4f1a97f7d374918f86ed083bd42c5a4b996d2739b7b038bdb46bcacaaf79bec7578ab39d64ad25f73f65773e859e2256f225d23fd74ee4ba350e12455b79330890dca9b7f42e8415bcf418991255b2df27434257b5f79831b7f2c19d930405c1f06b5e75a503e0e68398b1b0023e21f1923b34a75a1abc787cab4f2f71cef7d63915d4f5603d508159e12379ec711291f68b16399504dd2b1467a97397febe16770c0f2be84e1070bd7fe1e8e1e5ed91ad8d01ff3d9fda9380a4549d1ff03ee8e7199adaa900de48ba7e9716dbc5037dfe3dfcdf8287e58d41ba0b0974b342d201c991870db7aa1025987f13d1684998c2349877e37d0870fe0afc7187a0cfd23a91313c4e80ca78d029708da936e8b639735f06ff3dfa3dd4c0b88b836295347dbfe18db44f88f48083edcb1bf8d9b6e631c8c024199ec4a742276a570b12d7f6d9817a641605708c51d556f44f2410425b799f17c9d0e5598c89c75c86465e1a7c2fa137e45e7eead8a23058afcbe34ae1faa1797524ea3d5ba8cff0d807ddd6186280c5d452a60ba9286dafaac4d5462a6ce0accb9c7f2d9a2dff6f8e655d24213e46593ae40cbf59ba930203b0494d8590ceb027611ec73cb4af2da26f59d3158d51b921011e0513376b951babe06657128980117b3236b8a07e1b6339518c4bcf802621f2935e2541ea1510604ed5568a79db93029ed547322b7f491d814cc97b3dd98e957eb595f210c2a6291a01afd7f7322ca4547445fdbf605986ebdf5c1737dac4e0a070ba15efcddb901c24df73ee1cabaec7fdabbea8dbb7a21962ba70d042eb7eaec4d3d6a4b2c4ee8f17a12b7ae6057ae1d8b7f5bc74eec9501c25193300e1281f59df0099b98d44595c0d89e54c7ca284127fd416fabe89988564e4b669135d83f9ffc5c8b83049e2f0e8bbc813640e5953558df94f3dc627e1da26a1230f6caa37681bf48c951748b61e686c7fe2737a89680c6356ea4ab9fe392bcebd71d6439764467b3cb33758bdb38ed7e5dcd9d5ec9826a81febe0f5160696ee01bd105f2d693e5b3607a3e60b370fc8213065ff51080ab42c1bde746d3be6cf51ff385a9cc6b6a5ebc25eb4f82265ad6debfa04af85cc0433e6bd81dc9b841c618844604312de794c2c35a40b00d44f295f7fefc42d6245c853c9700dfccabaa12921e732e3bdc3316ae6d2288b5229ab0994ae45208d8106fc81be67429b16e51b58c2526a201e87b0c3b592b449df3c577d71f8a04539b6db1bfadd365e8e1ea1f857b310a7269f8ffca013ce0040e0a94402d721d2dcb7144842230d8ae5ba6096a0ef0e385442a06cc3a4fc189cb29ba7c73f01bcbe4578f2220fa8e9d8eaf2b3b30e44bd345fec1f4465cd4174d36df8286691f7de610c68036a1da277f4f4b6f0dbb9af096e28143741fab33a66dd42986d0325d7db58f8f3f1aec37532b5fe98f4f6712b05132edbd7a267ed2b61497fc5326fba562c135c5e3a7cf6e69b5c79d986fdeb5b5cc4dbd2f2feb682ffaf7b3db72c769a910c38a84479df4e6f44c7d965313fdfec9d38de5ab865afc6bc2f54d61391c793408189158dfa73e1326506638c269a3432c8a6a5e419617a7703406c8ecfd28090fa106b6fcd4aa0b694e2fbd71660f3c158f1ed1a71dc6308ce5e20e554460b5b6aa556be16f32fe045605dad9f9284a2bed96c0b38a5d4e3dbfe65669253d5ab09fe7c3f11499a8fa8946ecd4a614920d903daf0240cc858b286627860772bca0fe65cebf983a77b7e30b505f9f441a956f3a6dcdcff57d8185c2a02b625ac154d9a0c6bff61ae24d1e922c4356b5ee11a261034ab120f1c0d57b0e0ff17637de91264cbe05dd5bfba08aa52305499d3d066024c992e30ead93c16a2518dfa4021fb0642e0840e5b278d7b83130246640a831e05218332971a8f3a54f534eb50d421b7d53b055a6bd8278b46dfe7e5815cdeb6246eed85dd5fd7f696b988dd8e956345175dd20d87a952fa740653813bf5d6b61fe75d4f22cf02fe8b6f174f40e3fc6f5bffb2c390a69b8d8d4c2b57eceb9ff0cd485ef96ba1806728d714ecfaea3ae799b20a9005f3097fc71a5a35e225b8ac8732a79ccf701472f36e3f4e4eea47516d88cc64c1392908e19247c44fb364024b8d423a8f38c2fe59c47dfa238253a0e6d79301d9d776320b921936acfba6ca962596d9dd78b0988a802556666f5433b3e2f6eac21af4ca7913798aca6e28fc208aa14527d3073a77d12624deb7b20815ab75e1813c3519c1c5c37520a20b6aca1725d068671cb5ad166759d49905853a92e6c2490f2178feb5e8e7a215abdd4c4bffc239804416b105be934b40e1541934858416ea4cdddfa126f4038608496fe05cc14880c9686f4cd2e5c720282f44893c8b1ce3d65a78dc57b40bdaaaa452873b9cfdf65f872bc031a2c0c70191469a362e29b856639a90f17f131393ffeaed7f7d5e60bc82c8f7b1aee3fb798511eabb05e370cace1a987e43fda50243f5f5e7af26244a28e05f3d530fe25feb942c82d3d846b453a21f02f8003ea688a09eb4cda85f5db4a84b92a203adb2b91fcc1e838beeda0a61bd634bb4d7f3e07d81e70ae5ec0bc7e19f46d14da93fc3aac6270c213b42de1dfcc2214826946a151df09f67e61465d77b315040663a254059eaa2b2f7442217898c44e916ff6930ae8632d576d72680681391edc4aa1070d28a6984ffdb07fae5fe720a84e655682fccca14b3b95fe45e3534d2dfc9a8c33af0f85e9efbeea970d7ea6cd67615b3cbd1ae6fa268b3e944a1b257542308ecb256693482c425a72058f851080a90de600d140c17db9529c5f1ebf25624bcc4fdf21632702463ad80557089eb12bb31f885231372294c6b89be502b9fb67970b0e1342eec0f2e79a978e3ece3da45e3710375d4574a7d37b7ea180012f55c028287d3f196292b8f15cc730148c01b945c159079253081b0469f3f173969d10373e8fa3e1551be375b6c7130257dd0f0c64454faae33038fc283da2728131ddf19092ed4cca205bf64b58efde89a5f2588c80813b57c5eb62935436ab33317d14326d6d1a8ea568fdc2b6ed08ac46ac01a7c6947b5bf12d025d82b0d09a51d51b3706b8029b2db32204e8c14c5419f7277aa22177da15b9548ef6a1a1021c546c0a7ac5a55624793ba578bd21dc25a704f71dfbb7e00f0bd3a4d66f2052810cc522e9e6e2fd1fba9b82b60aee239697fb49c3c5d70552d7f5d19bea8bfabc0fc2b0ddfc9af698f200d9eb9c36c24743ffa456f09b23e9e5ed53aad1d7fd0580d173ec03e6ffc819e846c1b48e11ab6f5affda2359252d08c1d6e85e3b1ad4d54b987a3972609006169090f3a2ecd76e36025e1a63e586f9e7e3ac7056dee318a69c14d43dc3e8d10b3979b0a1ea2d5d295e1158f018553ae51bfdc0dce2773b4b5b40dccc626ecfa4315d5ceff2a04fc9bc5cd17155260dbbfb6aa4d8464d7290cc72a8b6dcbedff33af42ced74343d79ea8b0ccceb708278046f390b0e4de0174542c8b348f49e974dcc7fd668a3b60584681de095c4bb2459a0b4137e64a3c14254d453902b02a538db34632bfe1b01ce2aa901669e666a5a729a3418750525523195c1a880397813006ad911821c16b8a8036775d650b3b4171eeab7e2bb31cab766b05f649c881a2ed1e7c75c14f31b14128c4612a88809e212672cebd6e33722be749fc0802a2327d7cc5754ca6c4ae7da09a891c1f0fe58f9b454bd4e0a51af5e2ecef75f772b497423c4c649c12251070f9ca16cfa0738aa38968f569de57e21d23ca41e19f2575b819719b570ba228fd43bdef991de75303c8ba5293209598e9ff6b0f526ef6fa43060f12746dc9a07c8b2a5280506d2d499218a00488ce0e065ad8863dfed034bec077bfafc3161ae11163f774c9ec139cb2d5645518a76590f1bce60bbdac2d1cc4fda17e58ddb79968b07490841ff343cedf3ac1a30457350b99fdbc68e947c76eb6f11f1a6e0a5b5ae848e1bffe2dd4089d334657116ca14ffe2eb60d124ad10c009a9bb07005b3bf789ff688a22326909cefa80538a43198460683a9e4471b1a53bbd8866e349b387703335543677d9a4a54b02491062ca06643ad4a2f7f24b43dff7cf10b6143ad67cb1b94057efa53d0176317d56de1f6e281d8f69de842ac03dabc5548a7c980f8c8a21f6b3078814fee14aefba6045c5be1901993d17487fc98217755fbb946c6c411329b65a23f1beaa30c486814c43435bb9c359369b3f51b18f1a93f5dda68888037f42830fad7cd6950c6a76caa3eb0aa1553ec0154a844d5500273429f0f5099cf157084e086401591b370bbb965798bbedcf959deb54a07e91ed9a85943f7859369dedd6d94f3d6544386eebbd81189de3d5d7e804ecb2743fc9e2b1f55d390ecbf8923ef407b8891b187cad86a4859bbad945a5bd79d6a2c3dc5ea744dfea26af63501160e57cdb707b757c2b6f7aacad8fa76e36279837d4b118865a31125bf98e4772b2bbb74a397d1cd0ff53edfd81498facdab178efc1abe1d446f8d81074f6ed8e0e4011c36de9f15ea607049fe08e1a3d5e9edc7474ad2407c1d239ff4b0bc3678446e9122070ce4adeac8f87b5959189db3099b04c8eae02728c87591119273e30f7a02d5666093552ff32f35887b66daf533ab82c2988d4c1c6a5beea8a25a66d08982e842b471793713aa60b48e69c0a2a0e8e3d844e287e928afad1e0182897b98cd191355c60525231682082aec10d9edbf30243d076d89a3a9b10b9852f603b6d3bf65bddfc6dc7a9759f11715cca376b9d9d5e6fcc3b32da6b6e8e06ee65eca0102b82ff39f059c6891caab193a428729acd9d4bfc23b7c215c7358ca0f72994cad2a3636f244bd555399c8fc738cd689127fc465ae80fb0c14a23cffe05e490e4b2a671236d64b7f8bff6dc556664665174097238b61ba621725dfd58a6fa1c5b75df1d7ae3a10174c558603399f5c3ae3c0f5bf15a307d5c0cda1fee964db22b8f89768254c97efc8142d324820a856b1a00ab6aa4cea9bf90a75c5fd2f4e896c198a65b3b502722d5f5f333c066deeaf55da4814831026585a4bc27922c3f4b2b3c3ebad9fee018d5c454a7f491b09093edc15283e58d3f1f864030d00374f745f38ddfe4c28dca9943c9f5b9c3c368f8cfefd411a186a12862e4cc28f79b594c44b30f5b3dc42bfda773ee74147176acf1a2b1589a03243cda07a9508a02c9fa7d1b3b9b79c96b5c9f2d3f5ca7f88896a7f1f652eb43708d58a65b5b9db09456f17639dda832f0996f46c15450a8c404dad293f53a5b51b5201d72fd818bb8cd000d4da8c724eedbe4c84fa14f136676a679252d945d2c7e3f3349f7a94f9beea5afb334d341079e415b691620f70f04e0dd33a974800f6a81b68fec66b060fb7b80f2a6be16d0c484d78c2c88a129cb2caa3d7324d82d42a70328bf8262d72271a79dbdca2c1827292b4bf4c19cac9dd90b150d1179c4299c13a65226bf94e2a25cb5e0a44f2739f49c932539721a425806efac7923b20e85931eb52ebe109ff57261b7e026e0ed79eb54fba47504a94089da386ee0975c206cd5335497ded0352ee7b17aabefd6c059277c127397212d0a2619d6a3ac15409bf529a1bd7708ac51218b7ba7a4385c83bef7c2e2c74c0d823e220c930507d243a2b9a5c2bb944ce17ea5a0bac841d96af901769472de5ceb2dcea0230b7cdb19d76207f06815eaf8a6e9cb98ff004b23bd05db6ccebb87bcce47052c18104589be143e2523e7c3231874ab8ebe862ef4aa39405b87d512e4a113588aa315e72a3ca3ff692951a38e7532738c4f7de9f903bcf4b49ec12115caa2bbc765a706b32d9c3a7fda899315ac053a1b9f0882519ae659be9325bcbdcb0a5e8f781b88442d7cf0515fd7350887d2243e28e51352adac496b8d3f80a11d5de5f029b6c847d5929c985d20ba849ec6b29ff50af08b7f8936806281d2142383a45c1193efeb21f025b3581d5c3e2c2a025cb32e862812469bbe785cc8f4c9f5f33e0bf19827380f193fa5b4149fd2cd0c3da989d7130f4090fdb16813f460681c915ddec339f0ba91b75e50556fec47a8f3ff98d20132a371b23747458c783c76b3cbb991d5b0d65124b21711f927a5ad4ec04092a709b53c5057dc5d2996b50ec75a134e08ea11372f79ff577607c973cc4f8ae6a659d700b81d517a2e4c8ae86ae58e270cfd8730007945a36e2a961a9ad62e910a2f49302f72e37b5da2b96509ed24e34108def9699c60d764a048f4b15bd8c6dc5929832bbc255281f0d1b565b3437d8d5f79c38daa64e202f1e2486b6a225d84b6fc8cd10c6a1cfda57615c56b56493c513528e1db1f698336880c37dc6f28f003734293ec044363692ae938aacb95063b6e836df1a150ae99e4b620500ffc6f02d3c2c5ab76eca4e4f5f49be4b62b9d8429f7b119dbbe8f5eaf32378c6c974d08dfc816a3adebea48ef26c87f6a5a31ef4baa4ad2c5711bd842fc4f35b5b6bef928bc034772e29d7d12fd3b3b61cc39288ce02fa2aac3f5384d7795d09e161981bdd706ac5975169f5564fcde8730c8e9e333aac2f6b34c82a265896aa1f0cffa2c3922661c287dc70d38775a6102b0362580cf630bead344a7151c89a78b38b32e14e69e7e9225651d4d5e029c1e3ca3dcf644d57ba33a68bfeaa1a0774624230c57310576a5763e20461afe83d0aa7633b40abe05035e1227f91f23e20b2d2fb35738ee96a9b25cc1f2b4d5fe9e0b721c03c2658362cced80d794c73fe4987831793fe54fd9e8ceec69cc7f42d1ce401f9ff3ffc46a6b4a3def35dde3169f11afe2f511bd129bd3b98cb50a044d759978ccf24a5b2c36735f4a8d1ee949d3a7d2b2e6fa6e04c773cd9a9095188c777ba2faf365212be1a127917c8890e51b967bffb5d795ea2530742b83ebcaef03f0583b5a4b25dacaa5b0ec576bc8c8d130cb625a00fbdb9280863228a6175d163175dc7bfdad5c8e0f0d3bbda73b69623b29362c63783b428f3d7922a5199dde691332522cc5aef067f2f08f5a50081e761c4f2913036f95efd24994adbcbcfcc7b67f2e954c773e824d3d95f8aca04cf5e52bc671387778f56ceb445f671dd88f421e7c434b4977ab40ee5f5608f9b7ea08b23f2d870dc6266c3605194e09a9d6b9501d488008e1395ded04f2c8d0d744e23bfa87052621fedd6fbaaaca5ae1b386dcd2261468c7f76b2c289ea6e72743e3fb43f8019dbdf0b4504878d7b69528f44718ae4cc75d8038a4c2327acdeb3c6a6c59245c59c82f2120b46149093f23a21709d6c33e8c9df6fd25c110e7e4e248f7e96b1f914a6a53c431b0aee78db8ee06874dd6367473594005f6165249a87e8d5393cc1e1ea229a97170b82a5690513ded5b63712d0ce5d205d0024198f17a228d8f22bcec62a047a6fcbda1963d5d21832ed074457f62a30bd8f21aa1aad4284515117ff9607538eb51d51cc531d0fcf88ca9900bd28a07ef11551a114a2e691d76822e62a6c6274c8a57a33513f4f08d815fa6d6c4e69cb8c0fab17a8f8ddfe12c19a92aa13223213437ab2c1a8d60f4445a4017f2939598dd3a66ec29b695e89d79a5856594134095eca45f19823022a4c667b5791d28359c317c523090091f4f931db7c78421370ea8a7db22efe62cf1d571faad191899379ede566f02ca7d0c66215a9af4e8d8eaee682e4107545233283eb5fce62ce0149a554abaaf182ce649a4127df77911efb59e15b5ae5a98f481bb0ef1c99a95952def60ed376b73996903c459aaccae7f91011a30d6f7012136000dab754e0069367732339d2facc095341c57c88862ad0834fe7ac044dadd64adac246ff99569a120d11ade2f87666c8f801278075d0789038a7f70966c77d3e2eca2ddfb93524ba5b7b7fcfe082e6f3d6886b3b42137225509d7239e61520e98c0231562b6c1a48bfaa595b97eae369d9fb867b9d2b518b5ad89d95010aa1603afb5131a64f2c77524ef052659fb2d28398a995494ced22d049a22e76ea742391895acdd52ad57392c0b5295ea0f3188329614e748262de426f468b782a8be5fb653de30e49a986083863d93a004bce83179b28551d2d637f9ac90c28eeb637138b582491f55ebae4caf8fb76fc4614bfa141f62bb84b3e2ebef9aa8cd8b3479500e4b8c90ee94c49e8568d48f70a97f810b3f92a302e475bd530d5287bed51551d208922e93ae7dff3826546786d01ed0187a239ec9b8ad563622c4d849a7e5f74b7e1f2d1d13eecc1f5eab5ec6931d34ae1cf0649b4cf3086e85c48e6af65d3a2c97ce4b90c21c1048dbd9f76d47f3d77303a7d4d4228ed7329207655185cbd133a401dd27d6dd8936dae049bc6fb4a43a661700d94cd8ff9fd2a72a5a1037d5388662543abbf6855c2bcce3ff48a120208fa26491d12899d0c65882f715ee6e93f28bed2679a5aa7559b3ff172a82a96b1282f642d40fe5ed612e91680c93aad62000baf15bde39069cea3150173aef8acdd9c97784c6adcf93b5dfff574021eea110f85e88b446ac170a5293dd211ab2b12ed2aaec3114f309c2b4c13e883d91327ff45e8421ea22af943ddb9c214dc95a94a7624dc40faa378d1ec3c755e25c30329de3398ebe0327ee892ceff16b5adee16afc3806f8b6bd25739f23907521c06e90320bee22d3f754551f31555653323a9220070efa5242b183fb3365a7d8fdfbf8a95a3138cc71673b2432bb2b54ff07c12656c1bc10066a6a0120fd437e91ded602f30e13510dc192d657d4e6244189caeba892edda033d490732f8fd562c1f85dbe9310cd7df7b12cec8c21cdd4c9995de536055cabe1913b4d1d991e154b977a19512cdd7427b68c9d53bb59be4fca63a8b4d4fe9ea2714ca07cebbe733bf3550b1a9f62105ed08e7e1b329fb0a9c4cb7ff26a9470a29cbfb283543aef326aae261555569bc0efac348f9677f67df59455ac5755720b9d611d1b571db4b1086d59b8ca443fd1eda4197616bc8657e180ac710c3d8f21ba56cbecdbdfc4336755fc215f552fd1693e37cced71a8f242d3328456d0ad64f2ced4c33dcb08fe1dfb71fac591a99c151c8fc9017b175a21a04aea05ce380dcf14aab1ecf42e4487a57329b73f176c9b87ec17108fecd0480ede99343ca5caad7826f11d8903cf63b10a1b5c2b917ce04001eee1a7fe8aea78e1c32d0cee443b16e6d785111ea8813960469687e1eddc4d8b979be86295df22e6918045cf3e533e9f93a100ac582e3bab559e8bec866405f9d55369ed8768448232a148336d1253f6d3debffa81da1069eb1de59a8d955f8e00ea8168ea8658c16fd9ed04892e7af2f523cefff25de209e56e9c3b4c448e7e32afb5718778d306a9bcf61e6677aadfd604f15d433a567671d63f43019e94204a550f4b356273e5133f0aa468623bd8944236aab1c5e19c449aeee9c620bd057218a9c6cab1e1bf80d0e8a6ebe48a0eb35204d2e951bb9c752c71acc3259d5567c8f82babdeff387965e59caf39c86c53ef1f400480067edb79b70f388417f09ee989d306f35f8297908629f13459d2094d4c45f252fe6eb9212cb8d77960191d71191c03fdd7aad5d5aa7afa696e89c99d120179732aa8a3e6ac933abfae0606fa0e078f761c1f09f6b0cc64f0f8e167545bb22232e773fd268bf9695837f8ff3fc90e0741b4fa71a50cff68d9e460e851089ca1cf66640038782fd8c80738ec6dc1855f74d0cccabb4d84e5f2af83a98a44f2075759b5c23745d0e33b730cebb73ab9ed8c8c6e0bdeb4996982b13694d66d6bd341074e5b7e56a1466e559807ba23c1a2e2373b6540f3facc01aba690805205a8f11bfc74d4b2701688baabf495d5b87938f0baa45fbac3736f024880386b85009edba18285e07a8b46d7355d246a1bf846934a464a611e3a230512fff853999127e3ef347f88b0c563627502fc3de9b11a4a80e01e14fa6f1673c824eefc0b7d3f1aa1a8549365a63a95ce8bf166b8c8ad282a1d9a5b06f0132059517569a5a8a2f7b534f822c7315536b0a88a930a3137892a6a06c86d2522e013a4eac9832fa08ac24e462417e40a005208eb86b691d58f4c8bc82b1b75fc6d07b48f56854db1fe061ea5617dc1cdf3417179056abf928eef12563a60360d563c9daf969cb9737a525cd4d974592f16594a4375480c2eb41978b41e03fb48a88c0f2daecb9376ef900d4d47a7dbf7d1e3f7e917f889a3b2b4710e595d386b1e1a0680de56021a9487e3f9c613075d839febf48c5c3744ec44fe6552b11a6fd6fc485290145bd831a9497570557013b7067486df6ac1862cdca39fef15d500b7e28c2595923735bcf4e3ab95509bd45e52a4bc3b9ffc38d25d3e27854a3ca8e4e26a4866eed9c6e3604fba0db65a6c91029707e0067163fb52f72abf86deda90c7de18237fd17660ba92fc427806ed598d4a3359729750abf70645f8d3cdc5634d60eb338bc2281bd3710fbccab1247cd3eb7963c9c46820da15cf66e1fd5cefd9ff7f562f4a72aaa15abda7be8dfda8435662052e36ce1d1f4fef6c1111650267f682402ef3f9b97737c5af86db8c0c246ac0fc99c43995eb8cb5b4353079463af2a90b865c2041a111916ce0830b195f0a00874912f3b771f39631836bd29057b5ad4dc71ab517c396cad82e9d31d86a691e82afabab71340dfdab0b2677ae437ce823723902a3015b00edd6639b1d36f669c67934554ed04e7beacdb6372fcccea641ca77779ebebdd308ef4c764ab61f71b27caf467fdcadb2d36bee49f103c4df75571b4257c2cea459c15a2bd52f2c2bd7df629ae20c9ab853f25890be9dae831087d2161291cccc48d6bfd4143d19bad2922a20ac0316f29b277dac55017002327b050ba836131257ab0db76aad90d2a17183901b325c6cab9861d6b593aa447dd3ca07ad9e4658af4c51d782308b1f83e892b04c749ecfae959d68f12150cf309f90e8247eaa7234b68025fa40728422af00ce7d27ae78c646ddb0083eff09f72450b0cafac998427f618cd1715ff8c18ce3205cc47652c2c993568a40345f5eb72779b0004fd86eb2c1764525afe3d44d1e5ef3add97eb3ace00e9347afae4cd5f9511c33f807362e6f855098d3aa38bd3d26128dbd8df44bd80fd95ebc643f328a62e1a2f2421642a0c95a7eac4e85ebc41002fa5cfd2f7b40de7aac2c749dc7b65400625748c463add68c337ea116fe396e13ee1ab6ca65108bc8427dc1ee73983942f75538651245b4b6ec931413bb4c13a6bd514943fd65dbd27171183f6aa2127c8449369d30b6f87c8142f7be3fbcf1ead38ddf0c6157b0df3f852c1172663c8de5823db9b351429a6b176687428203e0315bfde28dec6596b15ed03be9c8b32fa4616dc8424a332aa680f9b53a1502df5ddb13bee822c83ae4fcc2f332e1d3a57fd18a5892b6d5b8639bb5f1813560d19240c3b4810faa1d8bcabeae02916d83b83474920a261d51bb09a8b871359647d173a61cecc81336c525edb5dc713e8d37046da3dc58687a93811c13bc4c0ebaedc5868ae89f85b59da4b02d751af3e7986556a75119e41753d10ba14a1116a127c62bb841a668642b763eaf92c03386436e1be91e3d10e6f83106a446e96a338e2ea698738bf6b8b34349e56c0dbd9d4994f4633ba2962f0cafa978140ad480dd24c8a521004c373f3797faeb90e1e9ca4b3e4b5c470a39ceff250c59248714e0d0d6e8381986fce4c510c3008725e6c1e6b04fa9dfcf572e5f1a120721472dc512c74d2ae082a4942fcb8dca9d6b3ee1764a0f3c4c212a8e30260f3d098575b04fae84a67f97e5fe89ea784a0279fe26f784848a2e4212b492bd6e24bd4cd5c14d0cc2a3616202fadbc1622e94bdd5d7c85f9b88c9a0e8ad273f0591c67ed80e626bb1e9135e137a0a49ecf77ff6cd310973c6500ff9bad5b5787b15e49179987fa88f077fd12e32e9c04cc217b587fbec7ec833d02a131e705868ae52eaa64d83aab95dd497c681b0d2c7e502d371e776cb27038fa7b094286daafbadb96429dea74f4d8e8f8e3df30e72dc6120509f172383d77d235c20373565d566be43eb966f8121fe23cfa3824e1ced9bb1091631be68f79f7a0670446479b462817c02eb3c32172d057557dc3172b12dd868099eebafcea2e6e738d213108a4faa0a7c30d39f5e9552e42477fc0704b9314b14cfdfdbfd6854d00c2d4b08cf33c52caea7c264433c68c41c6e80c51911c70e93f9c6d338f50d19965bbbb6e6a37167c0d70f2669d5d2feb413f7245f90ab387378d8bee0dc4a55fcb5760f235d0687b51b9e2a66cdb9a2b76520dadc3b58b101da6092bdefd940ede63791edcdd93bc71e82ba79c579e631e0760cba65f32417d977cd339660b4ad3698cba07bf385b0235fe192739f05167bc26f23b33cb891db00ab20dda7aae49d8eafb080829705033f324db6eeed74e327b98c736e8d91ee9c98ada6c686ac3e406771b287264a3d0e53095b835c723a4dade439d8e51682676ff8860b94499e1407dc1d523e8640b7751b2a0fd376cc50730cdb65551bd5f64dec28f7179538337346787c68e0ee50a240d563758714b06ec483e2486885d943d65ed65292434b69ad965271caf1f97d62380345602075bc3a41419cfebd0d88a681c4342b9b7753a3634fc19d561ec449598621227c032591e40ca818edcc5dfb3aa86450c4416c3c92a20f48bfd1421a9b208f56ca8cf8e58278c6077a3f10ba37413eb63783aaa089b217e755692f1b0d1e6d7bc4455153b60d3e8bb420968181183967b4b942fe0db86b1de6a7c1ac63dc9c4227a5ce1001950b6bd1c65cc8ad1e67e3d664a06bdbcf820e3b473cb09567a9d6f93bd24be0880165ecfbe206fcc5fa3e2affa5b682337a7c16c377e9c65500a7119f621220c68d46d55e57975a25b5ed45184d7c6e1cd95432db77667cf31cc57f6f2600494c1fe51be80184222db904ed2861a59e36fb1ace1ae02c068250ef9f4e51c2c235fb2f94b3b00f7f1802f962578723dcede3ef035980bccb6d38133c7936b2e3eb49ce18c9f2c0965ea153260e59136ab627c154b84c9403d45cc58e882e1cddc92add480a26ce86b8372848c3ac8aaa2e1c320220b52a8eb08eae20ae68aac994e2a88824a5eb791afe1447d443447c15852a16dac0f102f6ec6cc8832924983f4070cd22551e7ebee86646707b7e3b1d7fb08b816a7f77a68d9e28ff43d3264efe0497057676198446de33f15baecce729ccf3cbc77415a5d64af8d3a0dfac6d0c042ec1c811d7ec4e973049dc6a0eb9e0b04c91ad08fc7e0f4c08df76e33986c8da0c7a97eabb891fd996ff3f02e104b5dbdf9b7831c0326b8c48956b200d8b95ea7fb30d3f345a0447c39a3a5db56a664420fbd6e4896346f4888653f7d72e813cf8174b385feb65679c62f0f95d0fd3f88c4601165cc71f47d43f3b801a4ead5876e08903b2f523ac97733e25e5f5e74b757406165397a0045ee3b3eccf8513ad704a08c732c921aa775c7e36c469d20e97947026abd1778493790367dae22b9d70e04cc6ccb76b5faca3e5d6844e0bc50b7c2c910c53cc872cc5c010874379875a83cf0abfc92e2c4a57b644fa0ab02ee43c7e8cc328c8ef1cdc04bba8a29c0ead76d08963d5d089c0dc31aa4968d634f6dc803b7f7ca42fe10656ecbfef6f7f98faf7024a6d5f5049d3d16a97e23f366243806c58119d2b20188d0a9a209512ecde8fb4d6a1cc3b3c12ea4980a19eb3ccb7b53ad52209856cb5ccf01b73e420ec7e213f24e47bd9198f4509f9548ed496250749f49dad347e4043f6dce0b9735826d4a554fc043be7dd4d722b61aa64c7ecb3fca0eb59da5ebec9664b5c3dc4755d2647e4d41aaa9aebe9753804e38b5028096f964fed9a5c86c68c642a3b04a10df45d79cdc1a4641170e84b07d7067b07efd713c11c3c08bf401cb185ac46b4d4f50d69c5426f180f5ea342d7cc38e214d112c21a5b2affcaab8970480308cd3289c468b83a4f5b8ed822e2c2bdadb072aa5e8e3c1f399ca90d1de3f4cd9a00d474ac42e05295c43e51cf4320db89f78a8a59caef7f688d9a20f42d20065d9a19d3db3c9555da4680ae3562a7e2b612b7d7df47d5e447ba40e166d365a9a4b61cadbf99f16c3b75793b43751df1fd5547fe2fe44ee3824e85a54f30d0fc0f0fbaabd656a87a197625e1724737c18017109960a68f042148cf554615361fb46909140dd9ba5e0165279211b909a8d0eae444f9a099751d0cd60cdfe4b604c26a05850d247587165af630eb2688a9bb0e86a23aa7370408c4fe739bae2f1a63ac329eb81d076a8ea3f57c124d6355b44f35a2875cf390cf4f62a8bd1ddc14b825e4bb18a4fa236a949cd991efbd6651885f9b0caccf96c8e504be8cd53c722ab890870816744bd8ba37b25b59503a92ea64c13b296168c9d25de7104601d726e6559e9eb466d1777e1f79945b63eabf6ea511694d22d915b4313b9fdcb34ad9c2d9d5d450fcccbf82d1431bd991f9dfc05cd95d4fd877473e8b5614859ece1d79584ee30ded1e5676c76802679b69fd6cf9c9413feeeec8fff29c5b3dda9972977bd7c096cfc83ea76475790f04a3de4657ae229b7c225facc13ff83a6599aac01e25a8697d487febba0df9bff4339440462996045cff0245aa5c7d69b0dd04af41d0e238f92be64bfb4624970907077d2029330b864ea99315d9811858d58ab58a404bbf5485161a1612bc47e6a0676e451fbd209cfd024146d456f39139b50cb5f7df726be05da8b039bb246307542316fdea80fd80ceea02d0657ce2028021626f9abe05757bc020cd009a7a764ae70e82a917ad45cd24a193cb048c8d14be9445b63b7dd5f2fc084f309d1bd9b19d093e7b09b5cc927894594ab1a683e0d2ff510e7c414e30036c95d308c5a04f88036606ade109e013e48019612b30097e425c282368b5db048b031f201798095b0193f00be24099410b7002fe0638206686e358edf16bec1afd8d4ee3b7f16df4373a8dddc66ee3dfd869f48dbe46af1adb0dfa763665178128689b75b0dde187220af485a14dd085f09939e78cc17a9c3c7e66ce21635a4e93d39722d798395b0f13e3e7c89d330d967372fa9cb863c6d1324f18be47ee9861b60c13e677e2983246cb71d2fc19b8c6ccd162e6e4287d2e73206724d8f2a17f52f89a38c6ccd1629e18fee1e0486e091b4853770f65f1f97be0ce8c9375aa895121d573ef05cd9e76df3799ba14a82dfc5053b97d38009eacdad67af1c8c53e1d92883a5ffad380b420cbf229f56115f427e85bc3d2c87f7d1f293b507bbccd5667587ee23b807c1d60933f0325954c18f2ef11e725acc54a522370da8206f7435630a88d778e2b60aab653263f866d7211eb82031e018b8231098cdc8962bf5d82a539c7ddaf7494f2972a24d1c04eb3012101a0f3043e2959d42764987ee2f5d1e11afa4ed1dece78d48118c83b8991810f822692371e713fe66b6b2912e3e04a4fadeb90544590d3e7d18581f773e1e56f61641acc0573de12d6af6a0d78a59f4037767d25e33606496cdad5a83d215993fc27270dd6d22ba7927499afe0f3aa77af935be6fa7680965757c7cbc57c42cee0ae6c7833cc01d6b72eaaae5180aa3e852b02c973a85c017094b6d0f05bea797a0247fefa4cc50a5dce370471b0d9f6d465b6d002af78089e6aaba1dd5c56279b79c0357350f8a2eee06d2084140c4b1d805eb670f6d3bc43f1e54d8b391898aae102146e2d10e5e1cea833c895fff409fab2b184d9802e5cee2483544d2aa06975b483180a0f4fcb2928ee5ab0c1c775182f8ba15a882bed8c18f54483fac31f9bfd65d67c7d3c56f49194a88e742f9a92bb641c829a6608558975106ddbb6dda87a00ac68a70d12e5e061d2ee0674031d836b29db95eaf35676312dae63eab2f5d48c9ab1840e06969e395d80ab766927e3475ee314249585a80749d980c51c2e0f1d74d63b9e6835859f47ede59bb2c80814173d427d94d84741945cbb4f7d1a2a3bfd01fa4b512d40e1e36dd8c0c05554378ca76f78865f39458902a6f3071bb5fdbe7cd5f86e2511f5b77b2efe85eff72f5f65ac020091516dd31002f052b539222fa2f84127c6ad675d7b505b1621173952d648942805f969d7e4a3f8bd9cdf338b5f42f5f39a80e50345f3dc5504707b78ba7328379374be3c4344101f7b24e78ca78f6002977546776606c0e46db31b84757f95e10959184830e28ce5ab43250401e3b022f7340dda7db83bbd4d4e81456f6f82d1240da1cb35d077cc185d141b1c7ceb204581407cc6a52c813b618a04c7f806caa8df3d09b04a1d1ba57154867fe95318446e12aafb1b0d77cdc0236af234f7724a65454ab80c144f3775c92cc15006975936124b1c7cd40cd6c4ee3013195452dfa1341cb50228cfae44bd87812e15a0e514f5ca09eaef397dbcb84a35220d686f59b634be8810cc306c03170223c95054b99b8f33c1b14b20233cb3df430a868cb390c1ec34d3644fbd6bdfaa555697d7cb5cb24726dee2f5ada3c4da530ee15a693ed31aea1bf3a5e937adcfb1d68ee301ef9e76773c0674bad3d45a00adafc360214523581fecdf8464a40481cb22d541abd2e40b8ef0c6b2c64f2bd60ac3953522a148321ec7ff786a5cbdda9b39a791e09dce1fdcefbc08bd787c5aaaa79ca9602cd6e0f78b959163bef69198ac99e8cd7f9a8db0ac46df5df67960829408e2fd72ab370d786214cd223374d57cddaa898df01f7dcab64767004b9bc907a697cf090f10447c46b41506910d18ba78b4920dc3924dceff96b412bf23688150348a0d51cffd1d413b1aca1f142394e3afcb46b02a8682fdc88b15ac753d5b6f2163a9e5b1c492861478723700fab7aef7f9c3c7859627491a888feef4943067df6c42040a9ba8c93acdbde4bd03921b6278d39fa69e13dad6ecba0b7464c6b70ec34b93451b05f4c4600098e8b600b4681109a2c7340ebed12e62b301a936349fb7dbf7b0e4e7cd1ba284a71797a4dec830c731b37cb65adfc25e8fe8b27221b9debbc7084b026a1d9f53b0cdfa5fbc066d5d2d97311b27c8ae715085a4cd42080cee17c742163be37a9c00495978f9124df0075a2d8d77b3b575c96568a64a454c20c733bdaa3108d771c809e8d4a577d566f6e071f2e68ce086978f01af5eb88f80c990bd1154f98c607d6944bf6ca5984a8f4298491569d55942a62734836f07b17303723ceb98880cd87f3e0a82094cab9e73f7973ce217cff33510839860ea318856af9d58f16ad101c2a22d722e456f77c5b5dd27c5e22230a384496832e095297502587130b11645065f821443d336a74f310b4add2b779c18afe515f513abb14f1aef373d4f20532f612bce97183c56da0fddb77ece6313092d8fa1fc45bed5fdef6f0dd3b68b82024aaf760625dcff38a9a49c8c74d0cf8e1e574ec4e614a12a01905863b599398275b16f12e3d997c5049550196a893bb4a2ec5f5b6eff2bdea83b986d1e7a94145cc256979b5f956bcd9767498fa281c368248c8ec512a762d76aaef4ce388c4527d7c7b7fef2f5ca4de219be1f66189ec17409a0818efec1e3b1dd77c15a05bc63d0031041439487a46bd48e9d05a352734f3ba923d262d0af8a69ba2b4c1cc58055932742516311aba55c8b8196837e8622e1fabcf89002496e234019ed7deb3440a910209f8917e2ed152aaa86ed67618de87795fbfa3cc32e15aef20c1c46cd599cff0b030dabd2daef1df37ad186a75e2ce2addce2ae876876c3c0b823b30515f434243ce88baa3b9b881a669ab4a75630a774227a03a866ecd04f178be1122d2e99b5e00d5e0d343620347ad070e341209ea49d52914ce47111c809b802aacb43b88bfbb9a568211df44629f642ab2401623ba348d3ca60ed8e619005e1b9290b08e04b2ac7213aa7440a30e903847d6eecd39f7580eda3ee9dce0ec220c05fb2c51dd34725acc8ce054226c6426e942f7f53f24efc8b1a4605fb4e6b86cb4d6adcaa8bf53a68512b1814773b77557d8f6f32caa4370198910a00f99e9382967342e214d981edbdd03d83b91513fdf576152a2e7e70500c63f1ee95962dfded85fa3047526fd03398c5abcf3a3e1f02dcee7dd60d1d2d0884dd6631de69037414374dc5667e1180790e46449e10b637610e78e4600cfcfd6c7e1207300b0e1dd01c7a1923269269c866f8b6f075f3d5ac56904516f9ee9c5937a2002e66a0ff7c9c4c18bc9950c9a489974581e781d2779628435592d6f4b6b998259e910b67df459514a19f9445601155232449e94d723a6f9b92ab9d6727430c99c6282bc79944a43f2aa476efabe79332e9baff489d26676a4ef05f07964008361b60cfb10114efd31a910886d93d72ec3605762f722b55f26eb894e91db206d060ee4ea8e9238b974c465cea1c14a6fb06543629ee1165a34ce39bb1ebb617e96d80219105c3d35e3ddd246e2357a1c893e4f660cea2398632d567c28883d2e87d99baba04af7bf04542c24b2058ce767cc05232b48ab9d61eece5868b05533401dc2ec8bd7682de66ab711e89848bad04f56732803b2c3fd76080f299e7224e05b0a9fad8fc250c608b29be452ed8d8b6306556acf9f389a1270836a04413609a1d1ab6e1dd5d9d235057235390fad6faf8e21fa6fa9fabaff3fe86ae8e16ede74fbbaa32f73ad664d9c495ac98eea0e279ae266b9be1be102fd47c6f91570a91938ee7d3b926e76de3f3d7ac2ace80d4cb2d12a735769c2113368f28b44ffce9649faedaa6b98b7469a2fd3b5664608d66d6154ce85e4330bbcf3abf9d513c40d3d9da9801482019abb7fcef4e749ca616b0978a982d3e9c866bc8dd77f93f510422bbf4a5d47502761436d0d6e951822e396c3ea2f8e02b8c2b14d00bbae9f9cfb97c9d4492166458be0e3ca2e31a663b048bafc4cab50015039f67ffc3ebab48fd1ad68fc7106b4f36dd6f69e6b75264fc11c5b0c791de3ce77f9ba2b7239feaf4a87f7afc0bcced94842ff29d82192cf7daf49dcb93c2028b56ca886177fd293591807e18384558ddb900316b04ec3d623754250071fb8b6af2a4d87d18fedfdffb807cd408cc80f380030762e57a05d375b465a73f5fc798c68f54b4e809a4cc519618f7af1a468e126ba73d1a07906addcbfac2296f0d03de079189249d13c7377b9968a38ee2e0a2f6413a0c8df57327b2ba920f7595cafdb8fa79b58ec9a0ab4f5604d95ad1f697ff02e33c5f76e615fe588546fe0645ba6d1af5b6ca803184912f778b0db503c8e9b44ab8f98089b7294ef0ac01a60a4f1187a34fe4262909f561fde3d3ed1e6a5283c15b9964b198444d106e50998092d80a547d492e12f41a0c023fdc80ee111c946dc629081a3cda10a3b1e85c424ad107a4f6dcb99cd9811e6b225721990f41add00ea8b35b85387e09132f7e05e3a0ac49c9362a2a56b63d10f7c511b4c20250e9cde6d876114608e5d05eef5fef43caa203487dc81f6b805f97c80a0569e57b159e399600614a1ecb84c013930e49a7f4a9294f5c0b51e682cdb43676ce46f299b344ff2a8ec0b8dea68df35a3b10d5a5498a561a9f73f8679c7ad9fbf213321144d11ce971fdb9001581a8274a7003bb88259a7079903779b33dfc77dd5e2c4e247448261498158c4a6e2cb858a29cffdf2449b5f66584447d9a0381680f490accacac57bcf6c0ea0815357ef47bf7427a59d0de069675a8c7772d4ca9b6f6489b1efec5849c33ab7fc125cb50656e7ebecf740ba9ce542581c42a27bb853517d283e0160e445096a44577905f4b75056f4f86ee24e71e7a26fcd67309053f7a27cfd25d5e25cb7e152b2593e52db08390b96e867ab683cb6bdd64de1fe0f3d226486d5260e21c98a3c1fdecc460aa4589c9c7e2fe5c773c307d0a126c0ac11a4eb59e36214f7d9cf588b5da94fb963e3ac5e1690bfb9e794fa207e2a37bb1c92da3e0c611e02c73c9800c8abb6e3e96e9914e449d4ef6a1f531cb9c04b8bb0254dc6b99b33726e85d243dbe6afe96bddbb7364db8f90ddc2c55c56b7a8787cec8f99c2fb3016637cce6cd02d4c8edc45dab90e92470757516ab626ba967a81fd753c543e85630b70d7af61653abef4c880877201e7686d60c24773bc15c9a8fd5b4a2539bf3570ed1794069d31a044eaf39408a99bed0502aa6de4356809527399936eb60edc68b1be4921f5bbbd45c5ed17540886310de573e9024bcd290724386bf95602391dbf5c2a3b3c232d9d38a67422c80dd2a46f04b2baacd4b89c52986a90a5bb3a5e41740331f57e28f4acf81b60769c1e4302319c427dd1856f10704a8457ea09a50d7dad41ea1b7cbfbd428f3c7c2baffe07804800bcf8aa33785bcc42c8c910bb16217f466c237eeb8c9650d606240dd641329c2c4a641807a5cf4af5c070b261e4e3b3db17af687e2f946db01cef665837df1cb5ae982815b0e072ccc5eb6ea4820a553460be7344177a439c41d4eff30d84d8c69b360cf1dcc3c571b4b37b685ad6af7e7f30a7cdd4bedbac884bbd3b2d6eb4dc4d68779abbd387eba064596bba0c1765171b336d0e6c69a4be90223d0bb6f287b517b76b7e1ab65690b6e9cb6c2a71722ee3be095a78b3d4187e205c97e13b2f9212549ad7ff06a72ff5d0c7755feefe737097489ec6006b38a3414c8a8993f9f10bf5a5a0e9904edfc24584a06992e6de2c6738370cce0ee463df57aa4b77a59aff5ac9ed54fe137e5c6bd996ee8e6546481d5baf16fce1b74e3bdb6f7ee656f0aba21de6b1c017d88b85367f14f656a5b0bffda996dd180b98fd1d16854290a47847a04939bc1f9f6081828da7351104faf120eb2338274de14f873d7a7a969857b31957f1e323c82184b50b6abafc0b446889e2712db8579f42dbc752eec51e7a1bec5de6a4b7a27f678dceb3128d7b4a897e49e75b84352cf4e3d9374aba3be893def7c9f20fddde25ec7a05edd92f6b385b3eee562c585c2df2cdf2f41fed0d2abe7c2e2fab2e297e15907cbc50aa3f4e3d27d89c21f593eae1bf0acf657c5ab7a710dc14a736771e5cdaf90c060a5ce37dc5c518c66dec5952957538a577ba599cfd2cc4bb43206654af16aacd442b19a798b2bb9a8a614efed95373ea3999768259a942dc5bbb1727b60cd0e45375756db89b7f24a54fcbff2e8e8028d9f433f905edb8b0363fd5fffb90dddfe47466656dcf036f171a95ec15a377913e0e325eb8a5517b4dfeb54330b3c9e039aa3aa855b3052aa9a74ea14ae59b46ba470d6de23dbb6e9045638eb56919daa4b16edde55cadd2669b5a2c429a0621a8c1a841fc2100400529608e28a8c5c5e1ea20781e27fafd7eef55e12c6bc4fe8b1caae37b3b6d612a2d636217b6fb977e508e4071a08d3d5c93063a6f70428304134ade323c3ab90c4aa726154ac90fd26ee31c4ca02051e68c07c56a746a353a650a1d2f05a5792fd581347f922b613726c3134193e653493647590c28e0c9f2309f6abadec35b9d845c49f179b712d57aab7c34b21c37755ccc8d0c464f8ed03351226c3a334f003a10e0a199e7b7951c67824938ee24ffc9155bef803039213421d9ce10f6764bf0afbf1726e86af49d8afaa60049d3c8112447342863745f9a123c3bbd6b0e172d4ab65b75981ab11486402f6e8d33bd12cdbddc0cad938f1c795e1332e70b82a71e28fd59125fe1870f3848f8ee943391ec77aa932f48c92c68606f6822a00e00a226fb644596baae596ba6a3031352bc4d4acd082878367430cac5981082d980183e3f52b9b34934930482f47469c0d334a22986143110e36dc60030c830866942237ff2cacd79ea4b36389b2560abb59aa5a666a1f1d4c6c73de4c2980f6726d75777777b79431a3b3bb71f79d73c6ee8ec51e514a306c7c3f4208514db8bdadd37bbc72856d430c55518ecfa109413e44987ca802473ccaf111c9a7a5813a56ee5e72779883dcbdeb7e1022773f80e1451047b0c1858f4f8cdb5879dba8e46dbb0d236f3ea4206f3e4d70d00417b090b5c336d0c828ed912965824fa64cb041a66d84e00a0ebc9a1fb478811442190abde4243cc9f2564a964b4862038d2ce5490a1940b104a38d04d5b26125890c18174c36583093e784a922724ae8000e9450865d2204f2473a401cea92e59328813ab03f293e225ff211952f0db046fe88c421007cc93560f2d540470d24a5b5ad96ecb70e2c0cac819747f2104e2c7b0b14d8efc740a687e99b4803b38940e4696d8f1e666eb6daa3ad4ce7040206eac82f85dcba17038170b1c7bc95f1e6c09a590f03759460a58c929bff4e799e7042ab65ed5773e2ec0e869929868135b1f4ec26f172b64d579c2c5cd77ca90d3b7f8900b9d820cc566126550b2c0e7d13719ba065467b1ece0c4f3ce95c99613fd86bb5b6d592b03c3529365894bf24b0cab550a7b521ad8a7603ad8a5625571f6d48aba255f1628311484720df92675865fed9dbfb0f8349b0b6d24674a8854025a5437428d3a436a24374482bc106fb86cea6d995f436195ac928d7734a49a59452ca7e46339a6536349b369d4d2af31349da858c8c12d205ec66dfd992ba9c4497a3f6baeb4f292b97cd3eec322a3749adc8ee6e39a7fcbc72ba9e645795bcd3f2ba1c7541a6eb8926a59cb3bd98156d104688124883d50f5e6dfd633769ab924e94ecd47c581626d8278cd504ec8985524694230e803a992764e8c29ae8cd63aa0242424242a236dc0013e20398902a3f5202a56f909090909022ac616541ac0c3c071c5720f08aa214a1a13caf0cb1c168a9a252b56aba9d97e23830fd8a515830b231a2318ab245571e08a2427a91e50d07884068769a8e3d22cd545f1401348f4304d234d3b2c841ab2a14d4920cbc52d5aa66da81fda051a402eacca01ca240b1816ed92dbb65b76c198dae1a72c2e0c0e0ab6f61366258179113904498bf885d432ebd7bde943833d6dd46466b7777d3ae5bb7d464679dcdaa6514d367df289d31993541d5ea49fcd25efc8095313c0476ce395bad5ae984dddcc056fbe6dd314653de24d7a5bc4d4e526ec21a9ae54de3b2ca69336f25aecabc99b8d2c699386eeb60e84f53a96ea7086be067d10661a6076b20aedac4301bcdfe699aa6497a654728259bb3c8890decc0892644232072e287a8893432972191134300b52a154750031809694058102106900d8608030968074700418a15238080046486116140e9170c324018525a5fb4b42108815404243c1a08f10321bc60d2da322412628bb90358cb22592003322db0801416f0895181dd32240a228d9717b6cb902888a3208c0e932bb89665190f8ca094d23190fa05c748aa3efd823ffd82325158ae06444dc0c0082b55e4cb5b020bae341124234413506cab89272e2840c05a9adc618433a0384a810704bbca70e88c19c83439a307af32ce08e3c76e190e9d518433d238425249ea17f4f9017232001b3ca12f1f9200449524606087164970923d20609905329a65b406233489126589295714418a200769e4e00a1499cd3ab0840c5c800552e4600b1870f144e3828b2856605944404de45386444045e4cf7e8600a21184d08f1292f82162090330f1092288688827800c1044510928853434308411c4f8c072190ea521254a1a53764c61b30c87d2c8c11a6914e5c0b41ae3bd980426d7971a6918e1215c202221a55f5068a84a919101c038a23979280d339a20c1450f9080381a52034a9e191201c144fe9e63d6c46b85268d6a9a0788d08630541a011199107caa0a8aa05682b42b8698568a321a1021855045be604dd2c18f5012183f0308824f52108418c0109eb4981cb1321c4ae3072220903a0ed4564ece6896d11d32b02c19121921450b234600c508275e51ac29432223909899c2d60c898c18228527b6942191113e438a48aa7d038980e0402bc321352c906986444c9068b083ec8b21542a08c328096900d10408d90b8260d37082524a29f5a10645449c0f42d0807641240411911055e45586444240c9c0061be76bd958637422e67863582d43a21f1f3c614b39466984221aa29f2d887e84b2cd90e82708099d26c020065460618231b6b002762101318020c6154a88220650aae813642ea0598d28d410418449b135c321353a60a5e529cc73d639e9a42d3bc3f0cacf4b7b764398bb7be291a452ca86f204310a6a6db568b4c9df12aa840f980fa9048da22961e3db4a53ebc369b610c6186b8510c28cd65a82b07ea74bf7eb2157ac69a734f6a8a7771a654a9f4d082b841aaeb7f488187494db89510c3a3a12231e5589c10e9c32d4ca964a14231e9dec91ccc596b5167f47e8e930ebd262eded6157e4845b495aadc3c0e9dd5bdd3bddfe74b256d5a24552743b9db6abeec7ad4edf4eaadbedf6ba52e75028570a0f3992ed37fc1dc991db56aa956d657bc2495a79d5b276b3276b397bb2f69e77ef301175d90531ad5e254e8bea36a53aac3dfad445fd645d4e27a96ab5be242d7b249fbe42a14ef4747a94cac4fae9aeceba4356ad2399a6ae32e1242d4a8f504a69abd59242c3913c7f4f4669e960043a20410ebe324116ade4562283f84bc2e5c943f6194f5e6997b48361e2af475e6d6e938bf2ae3e6f5744c5624d6b97b4ecbcfac7d2e4ed3798b5c7169c211e8b1aebdca7655d6a3bcad5e567afaaf638777ade263a224a86441e18ca5ff421f2405046d939ef1019a1c6d98b8a1135c48b11e3af872c53af29db4b7872fd112526539b5a08cc8d75e0c94b622e9d967209efe4d4c07ef028d325ddf23e7d9276a1e5f44794f0b0b9b0d8b05fcd137a347449cb9123fb459fe8d2e28297b476a54a9c167c8408fb4558e4431bdb108158ad830748d954aaa1d6fa392b2cbd5edbd0b0255c85fd603089e3daaee5489caae10a68e7b473d8b51d265fa68a2319b0c6749369337da7ab15ebe1b767fae5c242261cd668d8e9d4116ce9dbe72b761160bedeb56123f334ccbb4c97788a02c0189379790ee7c897e93058637a16b604435ac24876d305c2f4cd74984dcf3293e9f14a1384d2643242c34ddba0098394601f83ba54a511cf8305b5621739d6b05f0705b9b8b05f0cb22252d12e98b029c3a69214b2aec0d22089bf28f412d4d2500029cd32186986a70eb209547b2624871cd8c6a15a39270b8311c2881f10a3917cc9d2e3c53da55f42edc94fb902cba47fe44b66b87ddab30200f892bf425a6e47ca1848338c0e2437f87a81a82fc5580f733d84b53edeac529afd19968f6cd8cf47218993235ff252ca8db2b0618d5a48ee0c657767a8a83d9823cb1af68b463627e7cb89460be897bcec97b4f25808b6d7b0972b38326219adc07eb625676715daa8264cc861613f2e77e9f51c9c0a308a9beab36f56577d536587dc94df917d6b3abdda7b755557a6306c0f6733645f222f12ed11ef40b3499b37562b1c93a53a0baa57f2f3f26ed9252b6a3ad4bcc34b86404fd62e85c0ace1782a6fbab2934175d3a5c49bfdbc29752d85e54d513b2755df698be52546a2ba09236149bc446615ebf5dd11c95818ce4b16d4ea73b58a744523356997a7ab29f134e16fd219e349c618a3f693fcbc277b59f1d7d3b7f6a68baacd5a5d1586556ada94f3b0a39485e55feaf5a6b7ee57b36bda670c167f3d64fb1bf47e4a3255f19055acc3c669b1f0973afdeaadab24abf08704667b61961d0c31b3e01d2646328964d7aeb14e57afa7f67e3c6493bce9daab6eaa3e753b6b37c99bba260cafd99fbe25d2528c7a4569d9e3915ccfdd8f875c67d681874c7db2e9d9e9ac37ddd2dd81568c645ec21bbd7a02deb8c2de6897da391b141081c01ca3ea281c2916d1135572e9b36bd7ab7a765195e5d46ae138b1a42a4b6618c95ccd194a574d24594eaedf2267fa2667e3c0588643eb829c2e0fbb19703cdedc48bd85e5b55e53ffc63c0ed527fe9278a8cf241eea15856754c9d093f56c62d7eaf328d5b3ba425d7595eaa2eab74e6567611b346c868ba48ec2486ebc9378291c6f1029ddc02d38585866df49eb1b3559e6e3a90b72fa9ca8393f3360513f1d09d667f774d6955d90d33728a5f4b2d56a7559575d5befa26ae16869c1d1ab54b7565917ee7476d865a5a350cf6cc8cdc27acbadc471b93cb1d81676d9e17ea96f6f8c2423523a0a6543669d85bf245e5f55cd70afaeaa73bd5f0a73a89f90d4a3bad6faac7ad945827ae7c6daed4e579851f7f452a705d990b598a9e6d26737a41a3520a7744bae971cf339ee4b75f984e4093d221460828a10a0e4d96f400e8e6ef96122216501e3d1e4c05e2cab8f40caf4ce6d6b1df6e7e4e453a491461a69a43021763ba158261c2d2d2d1c374c2cac154a754ae570ddd01423aba5595690f59de6b8b3dc387545b673f61c8d34d24823a5f6f4598e7e3b6d1cc77d5ea69c7d8a3e753f2179bbbd9f907cb2dc763f7a14b641c352ccb19c4b92f3519c2427af72b8961ba7e75a386e64f6593764ce701a2267e04ef614638ca79310976ef58d863de72454876c9556d1234eddbea45870b4b80ea5cb057fb505e3b8815930cbf330ea2f3939a7d3e92424c7c60606a3a1f13c1898974c5329fcb5562f2f17b645a55eae4afd2585ba769b3a9d8464d555f84b92934f9fa7f77e51084d5d6b734e54488ea739a79c534ea6393d14010911410e0c511221c892e505dd7769d71064e8eeb6e96e9a39a5940d9bedcdf92d838778d2b477f9c93cbbbba59415ce43082184b0b1b0f15edf05c3cc9d638edddd52ca150864a073ce49e3e1acad496e42fc13b249a79c3383c910692279341952da40e69473ce09e19c734ee9cd39672c452a71b43e73ce6932ad86a8539bb46693d60c0b4d8cacd6ac0d3a6bd6c69c342b514a33adce4cab6d64339b5ae50e4b39d59229a514cf9969b50d9ad579941dd92c7bbc966571ceda4696c11e95873933b9711c47b336b6d66446a306bd5a67d775259ab55192198d1995117758946a7d9c8f5aa4996cc3e462b29964367358b0df4c6c3dda68464a6fd9c41efdee121482d58ce4c4d2cc5a3768d846ce49b312a534d36a96d1c09bec309842f7ade3b49c1cac65da2cc5eea62cd8a314a7a6695d106d562a618fd852cbb21964ce88c879ad0b5232c98de3b8ada78cad96a6698f734ec945d3a4997c74c969c51efdd3a90b92fd3425ee6460e3b78823ac291d962e21ac29cd5caa9ac45940df007bf47510d0b2a1c8b4997c5c6c6cd94b86bff0a646afff132b371b6736246a398116db0c7e3a289c0c32ece0940c5b9e6d6db0f863b9521619ce3bb3ec5ad66d935ca9656545412c323c4b140875e0155d90599a32058532540520c3774d562e4c6929b2df64e9b490210bbc01c4494b0cfb554d27c7aaed08800c9fc30cfbd5b354605d707060c07593e1cb0a554c3fc86153e558c0bef999f4c7cca6f853653287f98e0bbb212fece1af872cf3ff5b22730a7fcc85d94b017f3d5906c73ce6dec3dc2f49fe51b81f0ff99f401267c624fe4e6f18dfcb7b7859f2c539173604fb4da01374c49e03c809bdaec7ae4b629a14a357fad52f2161a7933b86cdfe4da01a76dec265574300ee32e2c2f333e6891828238a50cc85f7c476e4cb85b9850b63aedb933f28d4ba9f975db838e251cb40c3e2a359dd8fa5fab4271348ca513cfab8fcc5a389c50368fe68527f60ca03a894dffa7ad2480b6d5c402816007c172e8cb57061acb5b0df4b3e19a2d003d703a45f58e2b90f757ae4fcfd55582925cc95dc3832347d03899c90c102bcf92a111368e43e0b5e041998729321511257f2869af09008102726c199675c02c4c185fd9a8ceda6331d8d3c3d2aed75dffee263589c21911256e4cdf428c4952ec5e50a4bcf4deed18af6e6e9277b6dd0b0d9b9974ea58e08fd40760de17014eac9aaabcd60061f108aad2e8cd13c69c8d917d608eaf4c82854de2e045ff35ba954aa37a7944da1de57ec65b5e74a61183aa7acf4913f4aacf0a489932c63f3a97b031068dc1b7ca4dc1b7cac189aae2954faa6bbe89b2c0bdbbdd59948891f64d8d1c0e43a3460fbaa734176dee83edf4e248eca9a7092770343c982f1178b2e5ff47da13cb5d0679b08590e91e74e9f2ebbec27eec6a1f66646e9bbcacc0a2091124ff2cc3f4646454748502091123e793e5e699c199b2c325857a816167633c8dc425c5724fa904df1ca7663924b8cafbf7081f5fa2f096c521c457fd13730cf2efa665af1a34a1256a41c8a55da9b309b88058c859cf626dea13312fbeef371a86fece72395be41f53773f7ee1bdc9a333d93c25dee54a8bd69cf5dfb93b53826a16ebcd2836c833a3023319dfbec21cfdce1ac339dbe9ba1c3a58b8496cec52f2ea1444edd3324f45c9472b3675be4b8c89db647a510d93e01a3bc3d0bb97604b0c66422c385c0a13cdfa44a864419a0424786444d8272ed23230b54f90132f1404a224a1bcdd9423e453f5434d013560bf58d8b0623edcd33c9f3f0eb22f2bc227f2ff98b4938cc17cd204b398b57fac5a47f7a3b71d95dd4549a79bead50c9f33d7718f9f8f8f8008990b022e94a9e9ffcc9f3891a59e44f2a416f2a6531a96fbe5894e75d70664279beae31b90d76a54b848abec97a32ddaced8264575dd9d1771d91e893296e9f7825265161a54fdf449f3c332b4d46dfc8f94eea9b2c0679beaf40ae0b925123f8ea8250a23272868d1660cac1a8e298c48124141fa9c2da2e86ce3ac4256425b0665e754b5ff0f0d0de844935f47970a804c10ba1580f2a2d84388a4d91447b16a970451f1f2aa21441e30fa7ba5b1a484231d8d1eff4eac258a4a26f287629311b294f3aa393f6e6a3933cfb531e8711c2f089b5d1eb0914d4c9269d51e66b03e3d1c06ce8945067c6676159edc5576d6641676c1b9d53ceee081f4307598cd0dded75c37477b794db0fdb766d64f2e7f23e578d5b6c9b9492b694b3bb2184d0e64e09d31ebc9452ce9b29e74d7777378b1933c6d8ddd9c60454d671db35a5a8a9b4954cdbc695b614544d2ab1a026163060177a3108c8b22cbb1a8dc0d4b030418ffef480d2cd4c3b64f938e98dd09b593725b69c34d36ac984ca3a6ecbc1d40d39caa6a8a9b4954cdbc699784add90996ab5d412947153c1958eb449b5504a0f4367162fa66cd8700ef98a93cd9291c5524bd544e965e9565abb212518fb5431a52c5a76ba32bdeede012b7f704a6b0651b4a1812a489841132bb17eeddb1f7253a2223090e5a7a4d99338ad28899092270df294b80cfbb5e2df3712a7c2e25b0bdb928d484404144ae1b4b48b4c7f8fa8064e64d99c19064174812c88886022cf4b0ba02053fa6eb528a5525079decce844885ad9204c865289f8eef21b0a36b0dde3eb86c21636c3b300e35ea49cf234f9949d7e3a9d8ef4cd119a4ef58f85b3faaabbb0bdee50da0c7f47724881adffea4dff2250ed2b9111488c3f59266529e31131b4296fb0a87d72761c72b0a1872f720f4639fb7a28ca59b7d3ed451fedddd50195d39d7d3be12fbba6e57acd27d767328ad4eb5d40e3a4b425fd2acd9c83c499b1aaa484848d4eee18361e0730723f8d1f2107e1d45bd256354dabb5d67af85a6bad75d62adf46d0d7d80a81e54037c9357badf3d5f45a7acd6a56b39a55ad6ab5e5663a91984b47b0116eb29eca6aba34d55a6bbdec82546bbaa9be845bedd563262c4ccdc0d0b22c05b046fb27a59c00f6d00e1b6a34b0466b6523ed69dfe917d92f067511500766ed3d05d499d71ead0415c52fa25133c9da95aca19135326ab536d33ad6ab430c30974e24e61aa98841b046bbe90856e62f0611a9efbeae7e4fee21f55ddf93af4bf3b2a6bd6a1046c3483a886eb141984f46d3112c15ed49813a11eab4f27c4ba9711e28fe54b15f0775901179be89140ee4393b0479ce22604d0e1bd8f8af6310ac99e768e267add606750e1227fecc39e747137fe6eb5733fc593a23eea22b869d8f41918ac681735a213527991af66bb5e47560fb72f6105bced6b8cb69ca696fe65285cdcc46515f7e1ac9043ca49f33c2181ff19c734a29613361d30eafd596f059649b854b1a47083d7d292332893fdae96dc0a16ff2b6c939bb66edb65cd23b3932c86e4913994c91357cdf896ac27e1d254e429327a641c80de050922349bcf6280d0f4f90c6dfe4c951f69671a5ef745f54910cc7d64aaf9f37498b7cf759fa2cdadd8dbf1b3fd21569ccca6296eab3342e229f1599d73eb34f9361f5794de2c8c5db1fcf0ca8f75177a1f010ab952c863cb95fe5b56f99bc0adba061255ed2a60c23493deb159e384bb57cd62d9bd5b1e3e4ba23ab2fb9ee2c4efcc943daada4edbb7fa4af927e92f6e83b3db26b181b84b19fcc9f39334a5bbe4f46c8cb1b833cfdb431c3fe30899bd5b2b5c4818e4a803929aab0cedbb9ca93ce3927b637d0c70b0ff207f3923f1a14963841a66f7d8c4c899cb8608923583c60bf7a030d00654a89342094e9bb05b1408a52831f2b404145d91414f06056cbe5d01c019b1865589eb9c670c6457c10d30ea14f64d84e296c1499cfcf1623955fcd0da5644d395bc258fb2666b03dd93489ad5619bbb9da77e609a314aadf44ba34e37433510961686c5e28945f6cf4924a29a59cb2b1946163d19523c8404198ad8b36f1944a7db04e75ab92f1b46948d8fa79170cac2aa652e7696197a7700bf3a45218d2ae95da5c6e4fac757b622e41628ed7aab575f26a0efc822d8cb52e8c9d7e52dd0f16a9345cbd7e49a011068a98f205ebdc65bdf6cde95bbc2c1dfe7aa06caad4bd9cfa25cedf72ed0ac75d375c5c386e6017015a7f790d2ecf812bd07297bfe00a4c61a4e52eaf80ebade85dbe4e77b956be4e6fb956be526fddd6679363927853a943a39cc22cf5f67eb08b7c8268a4bed35beaaa3ebb20aa14fe6656d9afaeebf4d5a395eb3adde52f6f5dd7e9ade7b8ebba4e775dc75baeeb8461e051866df9098f462f9f393e1fab481c1d9fad4f97d5a7eab3e5fafc093a72bcdc54aae59eee725bf7e3c9dde95d27bb225a0ad7f6ba4fd995ce42dde20f1a65fb6d83028bf2e9f5d6bbbc27d6faea56e2b854980626aeb7bc75971b69a9cee3c2aeee3d312117ccd3825ddd7c4f2c5691afd9c29607106c8ebffc84f3205ff3e799c288cb5d7739cf144674bc75285f2d98670a232d3f01f3b4dc8579a630e27a0be639825d304f118f10f99ad7818f84fec12328a70bb6f2650f632d2acde578e9c9b09c041659d4d5eae95b6cb53cde8a0c893cf0247f3143220f00e59e58cbbcebb6bcf59e584fcce5f6c4b6e65cb727d6727b622e37c65a2db885e3c9f4ee96be23bfea1a1291588dc3044c78518426a18c13e209e50d7cae0fd7cac9adcbe43241800f251f175a38fc76f9eac462219cbc850b633344171197eb30bb9eb9767cde35249b3962279c4a29a594524a4c23941c3972e4b8cc711d394eaf0e281ddf6989c216f69b4a344eec32c05c73d8ed38cd611784c7bb570c8cca9c1e7917c9eb3043188cb91f4da6df646ee797fb45a21f2b59c7656afa08befab5f6511fa150a878b4d91c7641fe83dbd1d65a9965be513222520c71f3ae87e311ac690e8af63428da13584393b2271914f40ad499aad3a45bbb6dcf41c57eda2aa35264bd7bf8f3be09e4e32426665d0c32cb7ca35b0e1bd8d3e351f7f2ed41b01f4d0282afbecd5b2d2929a4d0accbdc06aa3505e1514ac66ea35c03f50d8c3906b79356a2bd0934a5f44d6645df08411deffd7905d489691c9f4050a7f51f38fe1d078e7f15c7eb61c4a142f2d527cfe5e3f92ddc85ebf2811f50c3ce33761969c1c7835c88cb078e22860be02f3cbf2796b1eb0139a74236f807feeab1900bc3bdab09c19a7eccd5ae006279e1c2f018ee0b177235ef76197605e8580c587bf2c2d5a0c070352903fbd52a4faa6d5581817d92dbc763de9f494420548dd803ea7c22017500a09d51b54308849e71d8d5b07397911682e0d9c27b62d06524ff85bf8079048067c62ecf054304c0231b30108a452658098af5c4a6d88f266dde8579fb71e58f1f3e6e43711bca1be7eb5a46284ffda4f336b95f16eee30279ccd5b97763a645126702c9d71911084da26a4420da13ed45b4e88cdcdf00c0c2ed27b0a60fe43614edf575f2044aea6b4f2290ee40ecd11a4d6a0ec09a06c085f9476fa081daeb9e026b1abbbce7bb30f3a556f40afd88a9942dec179de0098499b03782e0a4f0afa270085bf986cbbf13f28df714a813f3be975957e15f0bb30efb887cf559ef22fac6c7bdb7cdfb50e7c76ffed9dc7d857f35775d8f7f9d4f873918763504e02e1862f69ecfb34d198a65ecc289793e0f2c0c1c14c5f25d784fcce64ed81eec5bbe3cf18735520014eba19e119be2df7e7d7c8b3f5a602294f3a54b10e113f37161daa38771fda211c80d5e017f35f7c03117079c041c913834fda277a187c1f4f42908d15f8c8f54c05fabf56da3dc0b7f31bfa4e7c93cc7635744c765300c33af8bc47bcc3bb286e63cbcdb93775c9867ee47e3c275d510801674f02314e371e13db06640149b42e29c980b329f919efcc743963bbc1999dfefb4f43c997fe6c2bce3fe97b95f4fbebfdf2287a5bc0f791e314efa464a1e972a7c02f9b8845d7eda5ce2efc72790c4d389777aefe27bcf3b4cde07cde58ecbd3ae08bd5764e63318c21a19f997779a5f7632d47ce6927aafe3d79534a7f7bcd72576edb8bccce975edf8cce90e3c44e6339f91c1de77a4773f99a3e0d57ca729cdf13d8ca4e6331809ecde775ae62e91d9bbbc5f0d7ec1fe7747e4de7bec86c03054012f91d9c7e93dfcd97c3ff01299799cfae0c1437a7f7d7b5def255f3352e6de5f3ce469cca5f45e9799c11f95afe9c48977893f27f2530999c71c097aa737862686493e8f6fb18361067f3d7966077ee11d352c9acfdc14bcef348ffbd5fc7afdf5172eec155ecf778a9ac3ae480d7efd15f37b1849cc656264be2369ee4e7ba7a7f9eb13eaecf8ebf599d35cd8deccebf51e3dfef1f83ff31d77c29a99d7ef7d7b5d24b07b19995318fe7ac8b0abf099fbd93c739afb29c934df71d83731f7b1037f4bf28ebf5e7321ac79e18f27bf7ce04f490c0ff975d8373f6e73087562eec3067f3ce41daff98f0bdbabc19f92fcf2813f9ebc037f3c4ef39ac75c086b6af0b724bff0c7e333df9134f757a1e630c37ae01d62e621e36124f432f732f432ff8efbc55c739afbf19067bccf5c9ad7dc1d34f7df71fb93b907bb22afcfdcbb1f0fd9fbeb4258e37de6e55d99ef38cc01a13ba8846d979435eb149140000000000315000020100a064462a140249808bbae7614000e7a9c466a509c0bc44112c328ca20640c308410020800c6001821a21901b02068fa44c7b603af965f4e0776b3e92439e6ee0df3f9043d0ba2916888a315e6157695466e2f4a16c7177c6a1cc7c508d3950d20e02481be892c2660f0d4ef419fdcc044cbfececdc2511a38f95a2efe2825a2e2ed5e42266650b9a123184c883a5985dc84eabce2305f065d9498a27bbbecd7322f50b349a2c92f2e591998dae67ebbb9fb5a98498346369818f17daa06af4ea3b9e2e3ee3d1b2f9240adec3664146f8bd6d5695ba63485d14ca530f552cb4c6fd15505d5be01c3bc03cfcb9d94e9788e729dc460dc8fa174560f28a237f4f44b96f716055e376589a1544f00059fc8abca1c349aba8ee5ec02610197c6f217aa1735a350b00aaec080e719a366ddabdaa7ae547d03a1419b5dbbe2c0c01dbe09070e1549ecf5f3cb5f819cfee76ae6d199e2757e38286671c5e0f6022810b3f32a86e6c3fc6a4e144ec95162ec4bb6bf2f85ef10518b454c17488d565d4221ff5f65c52cacfc016970e7b3140ee3e25f4865c7613e5397cdeb5c4db0ada37f9bc309934cb518f52ed3ff0146e557ae35776bd7e3deb7018a63c34eb7b4c1ac7d263d249e85fd60c762948d33bbcb8ce8946607312a51685b29f83b344c73b300da18ef91478956b4fd6377205d8c0a72dfca52cdc7fe47a5e80415542a9c802c4f94d679a9716dc78ae3f102c1653b2adea0e183061f3752ed685a1d88e2bc25dcdd565f0f2a1b81964c5adaeb4266dbe492c2269614ed8c80b0fae7642654bd006fefae302f749c2c96a2d873b9cc1786fc2e482c6326fd0c2e36e18618dda6b4aca0597a408a3f78815d2e9a00590a481de70484cb6f8d6ba4d0023d6b0c22a14d5876ee92f73c7b703c28d6ba62c4a9beeee1ec4a3e06d529de1c31e19c342dd879ccda2ff965a389b5c5ca79d834cb5fff56df25967095f1ff54a70d53b8983f5dd55de7cadaa146e8916d286eb4833f1d1a123bf24e39e5db4936262573fc28fad5369a46bc26dec02a0621ee02b1e13f7fa5896ecf3609c4c8ca5fa93695324f7e2d138916cf3f7d57d070ff0a99d71ada9e80ac8b9cb366cc399dbf0b8ceab1f55c7befb385a686eec46363e992967f1ea8416963410bf4f09ca5601112f1a0fa208e779d3f869a4493b048be70835bd1f6d6480cdbf0f75a27dfd58dc3f32ada23a9bd1c5b1ef15fa442cf400bedf203dd468bcb41c911a33837d941f71a418a2a96d3daa7e235fd29e71ed169f77381e86b1b2a5cd05fdc0896966360e1c621ea85e291ed2810410e98916b25f054327e2d7a5ed50d5fe8f5f3b5a93e52d6a6ae004b79c272918756ecef181daeb60355d748f975a7bad227bcb252f700e5cfaf9ecdb6d44b17144c155e2ef25f6eefd6fa166ab5fbec9900b17b4a9ac4313f0ef70c1dbe26a7469db161806c76f41e4f67550a101151da22ceac33fdfacc80fa9db3da808ad6479a05af102851e1e1b840c572ebee8f06eae4a6fc0eb4ac65f7c93144d98fec669b216d1b140b1f974ab36eac82fd0e1247b03bf2492b7237e6b7412b64f566d79c3ea4ddcd0e41013ee3a51d10af92f9a2771245d1d39a4c4a1b8858dbd38402f77427f1fdaeec5575d6dd6c5fca8f9a092f760863dd6e2b4af47e5f8e6050396de8972cd01d24d2bf9aaf82f4b1f9b9df5f217a21f4a22244b7f4f0745a3d5250e36ba70c5a592832e39960c15793debebce9dbd577826d60755aad603239865e8e4cf58851cc09ba5c8e6a2581ae77dfc27739f94d0cefd8e5c96bc4e10c3b253c4881138c0f4baf9f441e5c16a46130a90125618ecbb923494a6c27ad25e0d7c683706c3b9fb186370fb4c813e580ab3da85243d3b67d57b34da8f1b473b214806209dd225ecb78840b1c15cc7bffc78cdaaa108af8ed90e48e9fd1c7e6184bd1d328bc8153ca03bdbf3c2de2c50b60b5d06ec36080295bdf9c1c01fba71ffc84c06f67102f109780e0aa37f88b7c4e105db150b328c4fb0daaad6fad8368cc0b38a96dec46ec059bafcf0c56faf5d683a41226754a5ea094c6e05dd889b59bbd0a39aa8f870af1af6c19575a83f98d013097e00f1dd8c1745a6588e4b5c8fe8cda2b5d1e092a7923c62308bb7b14e8c8de31908216d89caf7a5524a030100143944549212aef0b9a0dfbbd7503f78003bde88f82d2ab8b55c555989d7efbf6b3ffbeeb98e8cb23644c0b5b9bcd2baddf06f1798d07b484cc6a6ea7f38099f162393b6867c91dc844cf7ab68e200dda96fa22b835aee20a135a349fc91522e4939b0a2248fff9b982f7720d0c4a1ba5a004eafa3c4f48776cb6027ad64715d879259c02660d2cc768cc4157d78e33a7c460b270cc8e5f372459b094dd6f9e36dd99101d1a3ad0370806813ea517d860dbd89995a2ef3aabafcaebcb0b56e293ced9d4aeddeec9d84856c52779acc58e39ee0d223debf7141e440ea059713e20bccb8e292bc0f0b51252ec61ca8663581f1280f81c245ec1cc7977418b4216fc57e90596fd21f8ea9c76d72921bf110a570a7d5aeeca8678de1425c72a6fefc3c7d526a557aec32801de6effab5d326c49950e16a56915182b2bb77ae37a2995ba27d7a5e7dc4cebf07804ca590e512e6f0497cbc8bddf992f8351c5013befde93cf3ce1ec75530b77946a453ba6882e26f13fd280c6d2c2a9b941e8ece17a4150f12d0a7861796e4461283eb77ceccfff0c3e4119dedc9785e19bb5b232c3f750967d825c20509f3090bd2b8d5592d298de1bcaba35a86998f366f484e85c9f790aa64e1161b65e314c551255ee1cc975f91cce014173bf4f6393e67b681cfee8571c3c82fbe7287665489203ede7879c856ac0ff738e169c68c47ae597811fc1a97fdc31c8ecbe470604d8c944003875809ad1f07001d117d4bf41857a92e9257b229b5f0e3318f1ec45b2ac903f3a4572d2136d37d2e0ba93bed7949f719b95d5fc55e45163092bd1fb729e78a9157299862fccb460d12b24c9edd78512a725aaafaeac63dec0cb282bd0e7fac500d7a9d9357058482800c6f5de20d0034bcb860b7e178165ecd39d90e1765bb39e3f82694a29ea30589469ee19a8a3af6d06a1edcdb574b8238b7d1b60a1ee3b0b02a37db4bd5f068d36cb2bc070cba265c377010af6c8669addee3d1d16a836e666a2a1e439307d036be7ed505033db9dbb60918a99360b296529bf9fff472ff87dd20283145cb3452e47d540833cb244291429029c3e71855ee3cbce409e16553e1baed26a875957b7270910a90ec1e021015e6b8836af1e01bcf6db986d23800d2c0b5edd2f9467b2e5fee8fbfc4393f15b763e8d2d9b0d1c5d9d9223cbdf06ca6dfaba08dfae1b9bda5d35eef451dd920383a6190570c17d03d64a1362ade067b8e975165d3825983264cca8a17eaba7dddc8a3b0b63bf1cd0cfd4e28f2b275a0ca6650d1f999e4bd822715c4148cbec4da862377a0679ecc77bb38b5ca3082c4446d5af019ad54a74526c3de0b0d1d637f3ea900bd0f1e776e66b57f97a80a3eff39d57c45393bd6a2ced250544e518cf086299b6b5f296d4130c9d9e80b9ec55a27cbc8680cf4eb0b55512489908ad637368b41bcf4ca700ee22c84696a5b73ab419913e9b3b64d6ec5603fa793f7fb4d24cbc5ada6f707b029f8e87f8f574cd1590b0880296d27446cbd45a38f532e4abb51621b40aefe864adc4ca0be1ec84581f2b0aaaa036e86ca1876bba5a30556e50981cc483375721f0149ca674291607e98ef668094e200ac068fa3bad6e6d046d1ea357ff37f743fbd16408c3e68d238162ad19d0b4273742a2c842520815cc3954bb9b2e0eee5ec8ff8a2eb86463dff758d25182754e764cbac00124b950667135b4e9a5f1b66eccf693dc8e3cc8ba6709a8ff8c5668af6bd15ad455dfb8b1cdcd295c4ca9937db9b1215cc07faf0660a4d0e9ab56fc481a6482e17492508167ca0041b812cd62b4eb015061120f2f775a1fca969af74d37da81a5bae7b8a318a6260329924495bc617cab2942392823ef4bfecb5de493a6162049225133400d3c10c815a0824a8b937de7fe7e836878d9a13bc5cce7a15dd2228e04148aae1b38382cfd7fe21a922fbf24e79515d01fedc6d677c81caf82c76976e8a55cdc40054dec6a240019cb5180393b207e357076f05cde25057d3fffb7181a273dc280cbc4260b7cc1356b76e249b759197ef93f1e3638f7488af8b46adf11bcc19887e8fddf322673de1c7bec2eedf12f31b9ad0a3003836452c572b3202562c8e82cde5071ce422396c10ebb4a6168742ac850a430f8affab0182c4130484d95e7d199a629c8c8cd73062c2661c4d143bd218c32e2cfe99f07923d6adced813c0afb41d836ef6d6e6acc09d375a63a1607f0340feaee97def24ed69acacfecde6dedae6eaed93b15677143ae87da89da0792582d9437a7c23be25ffdcaab5985ae65e26fdc262683c3c0fb892519ac27549a32d5271919e4676313224ac2755b6132e280956ccf6c6d6a6ebf2072cde802a3b5b0008372c4b6edd349408e74106f5b222d6136f5d6add4cab9350698107c1e026f8ffba6c4e75f070fa84cdc2ddb1bfcefe156932bddcda48abb79370f3b92079d35c9c4fa50d24a344705b227ff5a50d2e83c26088526e5f36745e30d1200a407a0147b889d7f05cf5825fcfb53c4c60e3388327a471fe42f91dc4441349dbe205e76e9c993feffc43864c591212b019558eac49692fb46949e6242d63bc8cd57b5e14d0170c27c569abd1cf025bf65a62b86f5a6340b4f03e265fe14ea937e51715f4314ab830239220c504c15615a643da015781eee3cea4a943c7f57b05a409245b93a1985ba856c0b50ec4779fb3e55425d4fa3defd0c5bddac73977a50543c5913b672ee039fc54e3dea3524caf3b7373dd9a4aabb657a603293b800b6e87d7b38dfabb00eeff5f6b28af5907621c89e5d82b6401403aef75a7de21a7538cd39dbb3c69b81cd452e8bb1e510025d04e7358296edad4e258137a2146c36a58731a9a9bfffaa915b4cf3cd06329012428317524330812978d47acfdc3359eb2400a5898668ce2807413fc3ee2570359c260d4c487debdd38bf9f07174f7206f49e23dbf6fd5a8490f8bb90ebb97af23ba7373ca85e8fe1ef1c3ea5b5df1b44952b850b67d9f68b83fbfc760b40357cd3eec28f634b25ab5c358176170cbb1c00bf74d4bd3f7f3e1ddee2417c77bcb0267d55db500e398c3cf6a05407ef0d03c9b04243cae235c4d319a76cb26e007aa40bf2122abe7e70c1a1d3c308a2c523a7fb4d1a351664e9106cc2674255f7df56e8256ce2dfb03e8079dd127b5c9c36502a9562f163dc76840d594785978433128b9b3eb835c2992650d156763670139fcc2768e9c2cc7056c7cdc09d8928f7b26ce7904024cd3a34c558df59368c563f7c917235182931c448d523f278dda44f0a3712a8a5ddb87809d2d72478bf5d1b466ae39f83c648959e191173d04e6f42705d6a281a6bfaba156598f58034359d6746261e1439e3865130eb07452cf218b39cc5334857ceb5bbd33c2e35e7090149de3bfa9c5340b9b646e817ed0c5bcd0f36a3cf1650b2490ffe9ac2ff05cacd54208e80ad08e9dec17358093dc7eed1192173e62b593286525b865a646b09266633336c06bcc7ca48504094d935cbb6290e1436ef075fa26db2902265f3d46b92937d2c7e1474cc8a4b5771279cc7a595153baf967ea9a8b50c84b2eb41e30e1dc1d4d99da4a5a8ad4c1caaebcd144ccb6b3846a04079b56e73e02e8b15d7d334d8f40a4aceade42e3333d32de4a2310b14f1a3b91cc6007b42f46b25a11f4839db46db88075cf5c01dae1af370580c601577ba06bdca77e43b2059a15269ab2c48f70d7d137361cdfaa5fa53c8e6292006722b63822fa0ca3b6be7dadf4b1d3600c70a77fbd24867202940b735c04813dbee21bb1b94d696eff9d7b9bf0168938580eabd7b2ad8911de8949511bd92071db1d0dd4c80f95b09e78f637f06d112a11ec9fae82a42150d667b55a4c03d8d61cca31ec1899993ae5a66bde19ed685e210fbdadfabde97ff5e01991a81661a227ba94641bf9da21095867aa1579a468f3fc187dc2c7023a7074548ac090f68cd1926d27aaad2ba709d2ecaf13d015787526ca3e474016e9aae3c5950c2d581805a1202cf5ff54e16a601d422065c4baba8ded193d825f3e9ed84230d7643e5b94505a732336ca7756ad47549f7cd06185dbf17312c0a285cc36d290c8e545dd9f63d9a7ee87b7f3d761b781cdb58abae61ddc99c5202d804353ba22c53cfb79066e2b4efa603fa5edce43bb5f4beafd3f0469f996ba161a78c893b2c28f5da804f84c0fd615941028714f3133c6692220fef1436ce0fce5d98a6aa38c16cc18a850f2680326aee68ba3f8d9d53b6cbd69167b98b7bd35e992d88e27813980f32218a3a66a0ecbcbc959db9661bb004c98596bfb91a61358d87a099b3aed0c4551a5cb42041149f101aa2e471818f793feef44f1174d7555b69179b7571af375ab28ac8f8f1a33e31c41335a8a18d8cfee8373c7845d5cdd3975e7350c6224ccebd87c3e70a81ddcc184c8ad6114159be29ce518285bdeb5808fde507751b31807335727d4fe4cd95cdfc384f6a4d002ec60278dd209405be92d4259a7e38229f3d50980c40e8e9141d44e2592c092d11d63f0360fc83232b6c074b7fafa265ea498d337ae6ff9349807e688668b5399d690292931c86fa51e33ca3202a9a77d68a9cb326945c967376a97c3d3938ddeb0952a492eb3b16652d2d473af01a4b0027858bcf837a424f989081634bbf7a11b2aac11f86eb03d31526ffac2b82dce9352e8b5ba1f26aa6d477b641a59ae62d7af011feb251191a627382a4c3e2ae2d8c05c1279439ec1793e4081db183ff46569500a9157f3970f642a37dc79bef4ad142533d43a0a24d75ebf7fca1d8ea65b1438dac006a74e6d7a8b238c64e000e846e63f7bd08eeb1f1d3e4ed812c710205c106fbf6a7e2d29d03ee7cbfbbbf11415fa5430fcddc99a95bb947153dfb373db0c0723c299d7cb3673fc7db6e4ce7a3d0076f7044b6c39667bf435dc5cc346d94bcbb05960045cb5ecd32d12a29dc4f984ab8c199ab97e51f77203b22bec7795071792321d3603af129574be29994e96186e7df2f5c57c9cf9d4cafa34e47054261e2bcc6069f094e5c1e1b1e2cde17e780ba90d113b305d8d9bb5913f7f3e489c0ba1d9868f3b816b835bf242ae9be4818099c2c8e6dc6b17e31235949ca12b9242b1a05323da125b2816710255280f0cfa6b768463bc4017b82305bb6815095324ccf5750c2d829552d0c38527c00874bbb6d6a6a4ddc8a65392d3bfb1eb6418be3c7ef0b464bb3d42bd982cefba7cbef003e4cb4c0e1ee01cdda7a0298854012a826b4c9b61cd1d4d0351a0415a8d810ac275c3e365563d8004ee64455b13e044e1c8951f8b3d8f37b0fd057da759ecfbac0a724e6abe63d01c662df91d42b8d1ca2bebc0b9b601fbc0194f49a7ad2fe5fe1a9136b0abc104bf2a2056b15ac89bfa2ad91e0ea53b116dadc4b4467d3b6bfbeca01e9172618f2654c615f4c61523f7e0a7ef9ac5b0430cec126d63c7af3ef0e0173d0c333437380175f68f096ede2f42b81672d3fe4156ee26a6c8dd4f241eae5b2f2a2f7cd8e544cde8813cf45fb96031970ce7632bd0820f2bc77deb00477a490eb47e2701d83456b2a08c4cf3158c455c8e217301ad11101fca9c80a1ae0da80ce68928b70d70a6caf878bdad5736d36a9793d0c8f605101aa4818caeb61806dc6ccae7bfef71affe90c02583e6873a1e1ea05319952a6561f8631750ba03c55f83698dce94ae5a8c7cadc299fac95d54e738e22b0e88ce40a330619c44a720c1ba2a844a07d6655dbe62e5f40fac450ec50d9f22404c3b624275373288065db41ee54921d27e4be57e1c0d8bb01471d7149a452a8d0d5a731ad11eaa1c37652203c88d2bb84f393f3f59898e48518f0ef98d9d6e260fcc29323efacd3cd5c17d137939c20b20040f1328dd98e33579f201d04339ff4017c95d243df3aef5e566f25224311cc6cb073d92f584e4ed94d0265b53a1e0208a6a4c996a3b8fea42134c42a6bbe74b4545c31142fc9ff13a08b0c0535486eb5928b4681b92482015c14ee9ff7d10791b55cb8725a024ae8c38d0f449205d38a198195d0fe63bd72f6f408b626126c93dc5353752e1a3c5c591e9efcd33efc937b4f128f48f9228457932695c3cd7f27004fab7508d0b2d3d539684e268f4f5906eb96337fb7aed9a89eb2c1537f7471053b9bc4a0bfcbe488d6f75fea79d30dd1793b00480d8e8c3da3e32acb1269a1c0f7930e89043dff22ce348f45a3d783b239c8e22967a544f998fc0b06275fdd92a0ea1a06e1f21bcdb68dd1f2f782f8db3df79af89214f2aaf20ac040f0f7cd3389357ed953df2767015479284956ff6900536feb77524a738ff418aea4c04cab2bd0d7ee14d356ebbc9ec07f2a7dd0a7e1ab7a65bc64d1bb2b0863835b08420669ea0407c0e3d37ce99d460e0030475e0ba4a470a07903d82981787ed991c565652e4c4ed6c156852f305a749e46c241e848fcde89608f68b823d08013dfb81342acf7ddba874dcc144c10d8257d24a3bcc8d2a936d7978bf89f6efc4db972e6321b9060a8a59c671348d3d9a2fb6b1a6a7da31c5a58bf38e01245e297108d0db23e060e19538eaeafdaaf8cee62f1acde682e041baad57d55b2f4f10773af3bc098c0772e45f4e15f8f4aa3a7714cc5c6b3ab22fb5bbaa1b16c11549421803cbd486009e5bc2734f3059c39479b6e7a9cee54d42fa56b67af70513dc55fd823c2b29111ac96247c4b531478a82d7102555114ad92185ac0b1cced4b084bcb20c5cb8f27bf85738d7d99ec2da8f5596cb5f5c5d250148adbc8634a17e68fef426b25f9797a85c2c6d9e175e96258af56656bff9e820110769060218a383f7f02a9cb56a5200b0b11893dac17a4d84dd2de42143ed0807201cc328d97c1645d4a0c6ea9ab7b8f7e9c09d3f13b00ea9c812a860af5fa1641b171e032aff3c8755b956a38a8f074a79a3d3571a1dcf10450f997c4c3a46c4485dfc52ab59b1216b5428e5322824b24012066cf2c857f044744156537ee79ed3fc9a2f94a8b18b1e160bab61e43df306368d30594f25867e4b220ea4640e11a64fad3fc3f94b537fd1dfc1ce268d1ebc5be5762a03de9a10058c137f913ace1121e1d11de1c1139693aff947e1fe9d734244b0459dfa2efc19e1fdae752d6c53c2fbb945cee06b882210c5db15c132d2f1f619bab4a734b56319aaaa1ff10bc0821d6634c969b0b29fa06432f2422d1dfd82edb74e482df624d0721a88b846d28d9296402eab19d0ad6f0a9ddedba7221dad00c84c33f1d16715f9842b007c8dd7231cf75310cabd2ce5d3dfda69daa7ffa79ca9f23c1a64eb1b66c070b6f1c7b9a909d4cb830c9582c6169dc100b188f1fbae69450c80a319533d4f2efa2e1803250bfbc6ffa61216af8dda157763ea727ef9b7a5173e8a884f39ed250ffb64153316130021725882b3752a37169df64b16c88ffa1b9cf1b784302eff90f006f02beb80e0bbd760fca8a2cd6a235d85d9dae54e384484f1220ae12851b8514e69d9e6bf1a475a8adca139b8fd7443aeec2dfab20ff7c1aee889e572817ded39fdc9229e66cddd4fa8cff1c7bdc5e58c43f37f9b6b7ccc79831451c53b3e7a17a810a42d1b8322da0bd8df1aa3e12ef8f305b1dbf8fc5a4c54c7b360b3de04785e97f1e9202b361949b3c8aefb3f1da0ed894a45e254bf20d0fe716ad321ef782fd02bdbebf3f25b27b1a66fcaae62683f6c8cb951222c03274dfa0736ed5a7e117b321e3fe16a034c40517aa4386d4e1898d8b725f298a99cc4eac79074bc99c1ec31a638c52eeb8ac6f48ccfb245831c612e81b733585c6c0cca2be6507d9f05e52e7087c64e004a065c845a7d724e786a5f7528abd56808b91b04f644d54aa09e1e5970ccbc44a36616af429b902b2c0e3e461a6cd492c69f0367446c9da40c3b09370b00f9c72048bae54d2b5300c5753c87389a2b65f81d636b5f9836751b7e34be400bc29df146bf35e8f78be6ef5219699d05886a315acd0c828cc63de998ca30c6fcdb285d05322c03e7d7f7a2a33ac2d7f53d2f063ab9a360511e721d47aec7e6ecd3ca3ffe28ed76bc7ddb89e0a64d3be9073b22654564acd9f9505e75c2728533a9671a127113cc9256b1557a26b7173d614d5144f6f66157bc2ec287672b10b1d3122f1f028a79bf6d4e74c7d426d2dca4e086de05401b0a9c8ad7f15202132b1761682ec6ab4a0264ad49e5c74146d40d4b92880173d9576243f578c641d63289eeeb22eb9e12eea32552d3ec026e0e7d89035155b8d5e47d7b607eb2fb2bfca7fea2c81ec52f1182cb1421d057a9079a420ea274a93c7b6fafdd1d7dcc886e4c8c3479515faf485a07082d5780992f524a3a674ff01523ac6010c453978eeb06417df9c72f486cfe88e826ff24ba2738c39d218b395ee884b772e14aef9bd615bee5cc1e9e8cfa7b4b627367733e755c44ed69e2321107fb97c68b39bbd40e54bced37b16655271c9a6d575e433156ab80f9e2be2d1d1f55ad959d87dd4bbb1c33140088f927382363dfa681710517d850a1171589da3b5df4b691404f733070420c7e9bce730cedbec68f032d352d868a815ed7ac43ee5b26e0189f62aa67989423d8c0bb8240398fef46469b9d016e3642f6a976ebacc63a2b6de541638d8ee5ee16777f78a7b62ceee5e71277752faf85a78c82f9b38a0274678964e9f056eb843e9bd5b06c50c8236c71f19ee0dccb07b2cd311affb8b83b2e4bd9a8ca6385a1494726986aaa51c2959e791f1720263a2e3e1fa9b26be238ebcd524fef1443a5874a3bf36369b7dca90f3969d70b869a6bd68374844880e5fb849704073d16c0877b35539f94e6cde74b351828d87eb4ad8dcda85cb84bdf3d8623fc6f8ec2a623c2df5025c666ef5c637f70b8ea471bad36d909d54676cfe99e56e500bd3c984463082ce1c58dc80aa7e577ec9ca3f9c73a0582f13ab5a86cef34fadd02fe0935667515a2a17bd6146f0fe878faf163c0172ff17f46eecc87192d23e961fb4b711da473a2166ffb21d49cb647a42bcb09d98cad42f628f4bddd12d09fc8731322b9f45c7700ca2897761e81f98d03823e4344bae104143574ca3ecef34f0d048f48ccf5889e0898df0527f9032b0a4d62c094f23fe38c78c9d0b9ff6a31c6a73cbb06f09e16d81b28e34703d869cd234532a4f90a91968560edf633de1ef7edfdc02157632debf0c71108713b30e143dac30d5ba72a55027b9721b7b04818d46dbacd8c6c9b2c53e3ab73f1fb2232118f5e5e35353bcf59647de5e41347aa9da68356a6df0ea20a50f236bbafc3eeb0421e2832e6de699a4287569517aab185b5dfa1502a5ddf6324e3428c90e97cc5c69f8ada10252c49671b277a116af7666f6c649570e6933f58211d8d7f50b91fbcdc36b0b84c89f42a7e47d68d612920c454053d4b48bea5f94481fe43476c61add25f8ea9ac634726360dba16e49f002fa64b70db2232dff0e020c940c441e659b9eaca5478fbe3345b2afc961b1418f01f84c61c24fff478abc556c8cf9182e7421ed7d5ba3e353770f60fe5d15c4839f671ed2c816194d64a588a24871a59e6a168a314b9d714db9310d6f99573a27c7a17be654ac317ecc9fd6ef11cf828a71c7b4e7f62d3398a759ea00f9dd82d94928da72cb5fab68da11c2d21e64d23f96d1834e0d0ce8f97aea3f24cd735903bbeae0cbc36d66e3ea96e7f028d066361c306aa914119015c316ab6617c0f932d881a518cc22c708cdb77157b96dea6e8935dd7243c271045fbee044ff88336d1059092067ea51342678ba9ad0c285de1165632fda90d50e1b7209c69d3c275404d3ba2177f6eb63e3fd5daa5fee0a7bc8ee9a1a54ba4d7eb2358a2048f8019c16bcd7578bbfa48488b59b8b87a188a0ced4358bcec8d86599d973899c02c7e16357dcee2d54f7aeeedef295685a3d2aa2bdd8dbb4eb3293755c3f02b6f76166dfa9d94157874a8c48243785c590303d3334a8841abb29f287841b2fa7cbc9ba280de3883246a91ddedd47c67b9d013424a055c0c24f28cfe6cdcaeccd56c5c744b812cc1ca50a6c27086ca610830def270da47468cbfb4c4d1f4260f208d36324787cdbf27a666009f760f4d36de1d9466dfec6052f80508e3fd17981a349b40e06ef05400250df235f6a9134a257937875bc11bd55f52dea1ccd927c51489ed4e8948ca5b86a8315e913a95b2492e725a029d69a13cb646b044006c93233672c9a586a803109b6d0d208cbf8def49d2897b03ed20428c4e2b803fa0cfa37d435d31aecb57737e76e4bb76679e4c7435d2302f77eac817650f735f069730d6cf2cc64c052ece401cd22eb4e24f2f122a6f0c16f56b95802d516a68a017cfe9d50d00fe396885d529006ccb32864d1a8b3041c149d3514a1800609f430caa7e3775e45f629b8a8b882a0a627b9a791ddd3376b499bc5edd20c2f73b3963876665434767afa375e1535699096bd9b63b31e43a846fccc5a99446c9259ae26cd2ab6d046f1b40f136ad4c9085c20323959c775c575ff12a1a7f3ea338f991e65822458955ac38f9bba68e34235e02db4c68dc73a70ccf4cff33636b02f34ac21025084bf42048332e1641a4c6b4b11caf4187808d510174c997261fdd06a5a8a0443051edcfa0428f94c32db3e7f89fb140aaaec66e2d2af45d4f7ef224d488cc488d17a16615d986c76682840f6b08bc44e66c60e8b0c75e4710ac75354783c554631a8a3e0607e090157e3a476069d920ce3440351e175b960f5d542362d11cc6f10be071d1b4ea4de1bc554402dd9c9af70e7265479ddee7aa94c8b97b7c424e666ce5235b519c478fb450819519c2f1f1054351eaf23edb19092dc5b96b674fe8ea22622481730f3d955183b5b66d663753c19d3182b72cb8344e63ddf0d4da719d3cbe513d6f13ca766982648ac48b669072157753abd61ff11ccaca0922c0fb28790db39378143cde2983d44479fb9c2fe50e87e83f11078ddd623f0694bd13708784bbfbfc46b46c17e0b5fe87c210bf3034dc3d1a9439ce9004019c138be7d6f8ec5bc010b4aa7cf01ecadcde2477964810d87c52c609a25bcc1001c0af10525f9654138dbdaf25b24a58a22219bcb2640f26cc4a507aa8024ab04de3a07f34032307e1b8d11224080724be7bf4cf855ae2a95e5a6701ad534149e920bff64a31043b415cbfa7470091a8105091065a4af8c7dcbe489b2de24858aaa9245d8b287309ef17f86b1e570cdcfb01c7ec82a2f61767d1c94e47c5f0bb2c7510063b63298a1e8457e5ac23ba3726d85015ae83ecbd60b1415e9c94dc46db990325e022cca6de063ea9215a053389d7b49b35276a49325269d0f94e96862821ca4c655977251fcd7fdf6ba895842c782c2c89addc2f89a5026bdbb9f48e23d942273621210fc2d5046a07c156120e6b04926d83b593e53469c61cb736e6259f95fc6576fc78722a05a1382c7be2df1fbc8bbf7f7237d0c775af540046d53ec7247c0de200c70150f7e7fd5127390442da085bf0367af3ee2f89142a561ea05d4775c4463d821d92ddcf3bdbe60cc776d97339e25dee77bbed116f4da22da6a26e30bdfaf36318b528263d71a2d07f1db31e18421c5d6a1f02c6ae4c4ee723489cee042e21ceae0c3b1da6acf9b2d3298ddb0335d2f75bd9593006f22131c6fcd30f57411c00f4fb95a6665edf27979c6e911387be4322767c88844b431f1120b5fcc595fcff81e5c92a3d1f8a1a64df3e82722c2530a8f817d481d231590ffacd4420607df6ca37fad9196846ea5b51d62f8a9637c40ad852b5eabc1aaabe12a23988161c0ff30bb25851089d8641f11efd7e8e7146030800a750badb7e4ae18910b9c796c1039d656c806fb38b0a3477da4940519c800c473b1dabf5a9957cf236f97eee1fdc002700779783379cb577c7cb3b030cb9e56dc00fb7e7c265317d7e96533ba78c01b4544c1e7171b9758e2a465950559ac6e902574571b553e8c0033933e7750bab6e785ad66290e0699cecd744f86cc1e3a28a2a3f6e6abb557cec7613cc49c33ff13a82b127e2865005563a44dce0a2a114d523f24f03f4b372ca2c40f5203f5858a9d3bc6e97b31600ec94898bd3bbc39d76dc8ee513aa7588ee3b152790822963a341285685c9c8cd095020c74ff3d1378ff9ec6e52d80947f723b438012d01590c2d897dfd5cb778ee793dc5ca7d7e6e44da4c0d9eb2f5a5d6f376081cff9ba45175677dab13255a6c0498c3320b53353ad4c9a4e18972ab2831e9ad7b4608657b1add140a8aafa3d4c923c04558e1e30e362219faa771a5592e01c68b0aa4149cd86873a8805a38f69008f1747e6ca3b6589d5ca524ae4ab40971520ad293c96e01ef592188f2ab977f674cd1917d30e911411ef7aeddd3732fe53c5bc49b72d90cbc09f3fd116e11438e061500c0abf121c5926f3b7f209d86f4dea6553c5692fa0b903074b9829b1ba0d1261ce7a7bd9fbcfe69521f1208d3d313130b21bb95cd5965dbbf549d39079973a237cc393218359cac66a14eb71c414d47587a4d8ee6930bdad911a3a2e72beba01293ae3781f4fa442d440edaf36a75999aa8373e565d65488e42e2f536031caf9e90a05aff63a621e4ae4e7c41aa42561db13cc50b353bc08d8b1625d33e46e6325b3da2058a3b98eee5e0566518a793842f2665cac31f32e523728a45c62cd19012c11b8877d84a0a6cdb0e74dafb450ae330a2317d174bfccfeae03fd09aa4e264f31df64d28dda21578ca331bf8738682faea06b7d45fc36bad03f6d4f0dbfd44d0697933e5577d1ba6e4537a7e6b7a89979c155b01bd8dce5867e287c4c988ea7d748e11df60c9c40e5bca48794f546268fa8ed0b068b197badd674c75db7d335694736869e557a6591859039cf1bcdb35a2f3239c29c3818457d8308a623260e56370861c5d1f91b7cffb07648ed4b3b5d51c3115e4771725986c33512f16735a5d6da85a040cacb2e84147c8af0e3c800fc722864991ad49259432d75e0d729a9587a681ef98d242b4db20bd95df1f3c079d4c98c05958f809cb3fe9d9e487c68edece4c489b6f2aa1887976fade781c44236e1d71de5cf59a64bc8f483384264f9ca1697dc5454c027811d29ae28618af915b62b2ac280d8ae5705d879103afbf99e0a86bf24f0ce7798d61d7efe5ec7a26cc95d0264e6f24300c491c89cbb52b144d873072fa34270c1aa25d3d7b4e2c4520587d9ed06126198fbe09fc6d32ff3f786ad29a4094c015270f10fb78cd4c4646cf851f903162e8608b69dad535a02040e933b1676c64d675c64f21e70428cbe12c06be37838bca025caf060850b217c46efc0f86c9a8478af759f71cd7ec9d5b51060d755c63e8e1761fc1feeff4ef3c93108d3666900ca89856d0c8170045850dda988b1122a50e50e5dd94cf39a98d28dc133457a230414d86c91824a4423498512fa1e9dbfb1dd1467eafcee2078e5189c4c2c131d3c7046eb1777f574ca7660a84a895625edcd856bf7adc61de7ee5806d28a399d54310f33a8acfd6ffcaa719fe13949f2b2af71f2df36043920a3abe327558193ae4022f196e26dd89ba84ca78d7b29e2487bed123cf01f32e9b392731cd0af8bc7735e481f670ee52c263362a687f60ec00dcf561020bc3fccb073de519e08e5c297242d6bf7f9ee3fa434ed0269f7ebab64e0a69c72e693e48204ff1f3e55ad59cacaa88f7cbd226fe11796217ea9eeceb06205cce67c2d12bb05ca7c6eb97d46c743d4a6bb44e4b891c5c32144610dff67612ead7ba95aa5e9f25d5b32b3c55197abb85bae026bf2a252ac28b79eecfe6096b08acf263def8fae9e39902b6412e5bcb3d5026d78d6c28a9823fea6f3b4c30f3b862c6c9ff50686b06c23d6f72f17a17d3735a0a602976856b086f53ca34353ae9e4bb0cc4e4a153e318ff55ca27c7219f7ac44db6f2906d88f3fdc382f4711c6f40dcf25a4e4dac4d6f6b1c809546c234352bd805bd5cb222e031824e07913aadccfb5737630d89c8c78d0ff87abdca010fa12ef0bfb431563d8f582bcb6c3a809af0d6f8a492e84056787288dc7f5f1c3e50b0ed1847cb7ae2ac003027e04d88047720076c46f32e11259137838f68bfc98c55637617a6f6b4aa570c0f182852f01be59242f525a1eb54f922e38695a99fef75a40c7f1140b6eb9665d30c3dff2a948882ac700c83669d8c2cfea21fda7fc2582829ebe923a810a8627b7cc7962eacb7048f2051344e2e656e357d4992d095e60ea0a52e7b4039e535bece44a7b42830b45468752db46c0ffc7250a71b8c26581bc3c89f9f4ede2b8843847a8e64e504352f117f026a5561340765a7901a71221d02bb3fd4c64a65c6200c408ae71e751b924bb92d5482375264e8ef531ae536cffc09c4d2fb3bdd1a2d727e8aa5c428ff47f69eeeb22b65820d1980ea8acf7b479e20747cb207c2a3b64ee49982346200461b8280b5bd1b0f9510214348582ad93b821f6dd69451c41356c323e9b75ea2b891071e1a858beb05e6e7658101b743013801297888ff787758c0adf91a5c3b4767ae292d5673c75a418c07ad272457b4f4740e103e9778bd15bd741511526fe62e28f6e0965b50a829bda3d69a6d4bdf318987a8fa66c76cd228d2e540dd5c4741a095d5b02a417fb22d7ca4292f544243fea08c42567772c28485b514a16c2077a4b9c81df7a8c57497e01cc5291fe29e05f2a640a03262920b5f2870432dde660c4d99f10a2f94b640c972c8c5cf27d4053062884958f496638de088513398203964fe12b51a08ead32600d9e02e4f50b177073b25152e53c876add683812f6ba6cc44c87807939f048baa221d200735c02acdd02c58579a01e5e3bef97306c4b79bc58eab3cb12b513791822ef92b84211318c1566f553f41fd7108b495d87a9eac0817ab9a34f3fd7f1bf94f14ee0a834d0c01340af85086367af9b47d4f0b0c8a784edf9dd8de2e697a7363d4d925402b43ad4ab08a619f6317e666d504fe06a2622f3fe449cb6cff387e49f59c641d7aae56cd5025246d896958951e4ff1ac80e83f35623d37ed0c517612be47d96f1005b21e4b680a6d6dd17492587add0c634f0e67488e10c5edb30abf2eb7015daa3fbccb94d8d81973174ff86760dd78b47bfc3a957977c3a7b39ce558e2353183a50bf9eb72802f3de1c06a7504608a4cdc8f8bedc3291ec6152cbb71603d0155684e29a02d218925086c97ea100e5c280458e9193dd949230f5d4d081fac95e9d0d62a7916e8e271dca11e41485e6aead38da1b65766d3d312fdceeb28c6fcda1142a1f7025697f436fe71919bc47b9e6e91723b6096b4833510431143cabbbc579500ac15ac664ab0d6cf3b43ca2a8d4c086d50b9ac8ba65b5caa0300aa23851c8498471038afa8eed0f78acc1dcae0ff851e530ae22cd32580d46c1d26a3e09deb6ec72aef402e643f63fe0e6054d0c8f413c9ba1a209ce7cac41a742244785f58f30f40edc3180cd98d8136d3e816aa4209d2d46d9edaf44736f1bee359fc8ad2f47913fa4c76dbe689f5d301211b528c0e8b364a790039c228828df3eb460a982b5093f1f47e5f4090a0dd1150440a2f26b63562c8da0f0dfaf186c8b7f7868189726584eb56f0171e1d4556d209b84360e97fd7240caf04885e2746215c7a09b157a0cc8cee307bd4db08ddb649dc1e8f27e3b81bf5d42865ff07fe31f1f4230c11f4d1bd065f1f9f2de940594cebae04412500906897d400312b36f1145f372e23175646693bfede6891f9816c10c2cc122219fa35877b28bf9b92db5f4d77f1639cd12fe69dab78f3b7c52b83b6131daddbf204978b220001590833aa0744408b3b1092c12aec207b35fb49b5dd9eab616093d709a4280510b3bd5b3eb02d8b5d5d75507a33d981cee236ded3df00a67e0bb2b56512b5e0e8b848a81e34547675a0bc88bde54bacd38062981339358f5d3b43e02a5e6bc004813b2c5baedf4449b2f7ccaa56c40889d1656f214b62d79feb3638b936315857dc31aeb6f794a93765dbe470179e4f1e17f0f452540dff1538b0409bdfa08197c51a92418c91c86c097f50b3b4981e293893b82a8fcd4c1e3a693c057f480f40ebbb8e0e5bbe72e07cf8d70d1966672560c79b9362312ac623b859f7c7e6fc3c680808d344c82946e1390c3f94d234451a936954db84095cad206d7a781a89c8fd6b49dba45fc32e09d5705717a8d1970f22cf3b772f4e87bcf483af6f25200a0b6e6bb250ccff9fc4c03aba70351910fd5b42dd293e999c0d3d514a698b27fbd689a62411a68d10255931f0bf940fbb62746ff45ee238a300d02fb11e2b85266122237119c0c4b37f18021f015eb2d6fbd6e58cd3de1ad5d8156c4692fd01132389a3df001b6200eee64b43dadb077fc8b0f8ce3d714cc26a764f8b7a3d8c30ea04bef18ab8f6189687f6e589ecab22b9f0349a61ff695555571a8de1eb2cc07ee3729e393f83c4171030d7321b65e80ea3cf71a1c7740b20400ba51c1ad3b3f122a4f83cbb1021d1846ca5c059477d89feb81d55dc74d389b4b7abd76d56cae32a9506c1198a8fe2a168ce27069d16a0105b19b226404ca39010dfa5da48e4b2ee27545c288d96ed643118a6b0916e459889d14a2105bd6ee75c65dc7c80b072f989e913ee159625eb230b2b30bdcf153092654f06693475ff7bb51d5906b3f9ecb74cc67f46047f98baa8b44a7542ddf776988762a6d66abfbc8dbeff6c3314eaeb9ac9d12971d92a689d58e8fdb0f93b395008433ffc876fa4ab638b874e8d404867da41955b068b59f990f265bfce2466899584d147bb16b96aa568e3ff2efec3ca73a8d27db14142d66577e4a0cf79dd634281bdbc9199e303b374ec928beae8d162c9c81ee96ddd9e5ac6ab35f88c46fb0753e7658b17253ad62039c6f843b0dad17eccc6b7bdbe6e7b8e5ed9a717b9c8c673e9370d21903f4921b85e982afe49396e5bc35686eb499d99cedb4becbfab9442baa14d200f6e8e7977a6db458b86eb143a55772a9a13856371a73b8fc846622ddd61d4cb4fb18d4546665692c91697b9719f22e9ee7d08119f76dd3267b8b9337e836e31894a07bc41ff9a84739a00f8cf91b51504ce4d6e538a214566a8ff2dfd355433fb7f1732c358a4409d01441dca68362e22a257ba5d723f7cd04669c09b47633c8b25ba49d3bb5f0b8f233ebb875999759aa1908368a33d068415394fa2e3481119c00506dd26e8b4e1c6d3177e4c3e75e14193bf933887d798a02219676bd71429bc1d10e176765f71cadd8e0fa549daab12193139a263aba7f24beb642d7b1002c13a759c30840978c4ba097c62331d61b281db82f2eeb29b92c0992cab28bfa9be1d52ce87ec06ef848f6943b6d2b7f872d19753adfbbbe95037d2d4d057872be6993884a612d24eac7fd854ea7e87548e05b595085942e0281cde4194c39d88d7f681dab247acf6d412885346f4707ccf2c5dcdf7bedf5dd002c03001d3bb957538db3ea7fbc793ba2cd37482bbbc3466aaf1344226fa3799515777dc0225e1fbb54e22d921ec33654102ac1e8a2db9b7bb4f745c317ea8bb296889d75e19692f86b76ee90bb266d89a2c09fb02520a1c581378226878b1474f50660f78c3eeaf3c260a4b3f30c2c23f38a1ae8a8ac7ca9222b417a796a021582890c817ef97ab63fbe5466255a0c3f1b684f8fccc7e6eb3c47a435fb8d1cc817421557bd5331a2862134aa7dabdf5e72c4f595aaba36d8447ba617722ec28f9484738ce3f3ff8c3543c9df0120c37f9d303181550530b6d36cd7ba0b719dc0eb47ad0c4c9f2cbfc1aef7b96e80d215f4426b34f6b2ffe33bc2a1ec878d5cedbca4060e06db58c129fb3798ca7ee07dee4914667374f93813afff3f772b6249bd649b781d2941f049832e3771fda8c5fe1d0c891c991778f63a7747cb88b3e05b8b884828885440f2cb7ab021d330bc4d4d0d96ba6e470bf7318e6e6157e1b3addeb2eab7e6b2299743fad1cfcf03fdf026213ce48fac7f91693d229e64f103702f3b1b62a033a274b08c765d8c3791dd4db8f04022f28f57ef4cd9bc71616db93d1d07d7207d3cfa3c83a873491095ba3acbe5da1a05d3cc29f254508ceb6476a4a1bdceeff6ae9f9f31450afa97f31667e1004329f9a9666ede9e806caa4ca1efb2351f7a1af6b378ba37507111c56c2e4d76b5aedcf944b9b6bb6fb793aeb088513836d475a20fc2ef361a1280e1079d5747027a5efc5d623941d4fd8d3579cb17dc42f13e538f5645608cf85ee5895c195325e247e5824e31ec5f83fd6d5b868036bcbf4f2c24be4100cde8178eaa66a034a357c9a1920bc1d70b238ed62e33cf0e37f42a49b8b2f9752433711d94a3e6ecf9dcea9b7c8d4ddb7a7c0058ae04bc61bfbf7a05bc7acfc1823d559be4dd06428cae8cd392eacb5896f2a6a4100b3012a8ae9f4f400cd1c88a02c68eb916021891d882afe5e623dc27fe1abd55d1c30f901e40019d65bc9325c10ada4dfddf4b59dc19731f2a0aae1385ac302c8f5f65aa73bf7a4582881b3d27b467d367ca2530b40864f471b57d13809a7dbeee4461033bc99819a926a084b735c70369f9e61dd347c97a931fa5167c3d51700d7bd79ad25681cf152ab9668dc982309076927a1f85e08e6f551a3f89c10add3602bb2f5e19a12321a0f204f7bb8d8ac5a3be4eabaf01cee1f687a29b7fe33e84436926005e4dc311ab8a44e581cef9c88638d5fb11274d8b1ef1e6e9064f409ac0b992d31e99d324031e09a1cd0f82855921d2d2881f0f5a4207748d10a403a04d465c008856251c91b0f3af112b6afba0332f621c6d25934a273234057948019dad33947af6d962e226857644bba37e0c03151cd3aa38293aa3ace9e2a9bdd16469e5634a4fd987f30612ae45d6a067edf7e51e56f10016a4752208096722e8fe6dcac78f34a975250869359c87ca8eca7d230b01e659769afe11d4fcbe4c964269734cd7da3598e3fa6f42303b19c450f983d1b973ecf774aff043864df2a2d2b31d160b93824443e4907bd8ca5c3f07c7912101510bf13b734a58d86887ea95b5b9baa27c38c487151b07d3381db4c56fe65b49abc9cc76db119fca588c8ece62a6aa28b00273867918bffb8796bcf3f0884287d8d7830e4c3662ac45c1823f34c4e5bfe6a98184e378fa9153b1665be9e9f0fbc610e34754aaf5c86a9f03798e2487d0c61a53413e0dc849a0080dce9ec665a04b63152adf34737d9d3e6d4c582d593dfe9c2d3ace9634555f339d3ee17ae4e295224c6f1643bd99d04eb33ac7416d041e9a496491c241ea668a806534e925a33f199a5cbf83392f4deffa37239ca8e07c7f171358415640ea4683fb80cfde05c6f30f3e8f9d2f15b8c3a0e0ca3b73f95bda3705858bcb4947686fc51c2fae87bee5726642c8b1a8154990961250b6cee87f9eb1a32b3657cb5ceff8048d9bfdd0a502ca5271c0c56e3b237a782496ba620809eb15efa34e0afe524a1a0b56db7c58d066974df6c1dd24a23b4a0a48bff6a10592abc339644316129611fe9c49c0f751c44f88195fff0353d69731c0a444e4aa0f7ee350e1fa18f12e575978e25beee04c2b042a0ea206ef51fbf0cc707e40a904a83e2a19c8904d3d8bea774934f138f720bd88871ced7fe8a1811a68d8df742a608849aab7fd90b95eb8a6970698430a3c720e05a2fd3b174cb6345ccbff282d7da3356d364ea437f859c959b9d10639221c6133c94dd357d45080d9645b1e804ac5fc24e751e624dd233eafd9a4bd46e45faac314e108ec77b940bca00be9caad4671107c91883dc79078ed9d242214bd5696484d8786fa7bb4b303263b8953a8686a2c1f07f9e306d844a4afe6c245fac954f8d667a09b1026cd8d67af985fbc8f969efa19f0b666fca97553a335a06e12df3b583f21b8583a9a79e8372e1a40c805c70fa402573beb132faae42ca492d80fc1257952c24ff524025716a9dd5461c89af73c9bbcec7ecdb7b990a85489c9d9960c7bccd8e745b880cc709e7687027cbf02702dab7260000df6df86ca3314693964a7147de667560bb3db2656ccb2cd1b7493220a9488305617330ccad252db6eb094b581c2a69c06cd773c3c611a33ce5bfbda061378a657d1f6c31a2bd1f6092ee403156ffbb3334cd49a67e47a5ac9b8b751f2592ebe512c3da705d99840d246dae7bce7d8154c2f35f9483d0e0939d1b4ced99b6a47afbd99a0d3c4a6036e7af1de05b4f4d2d1b32cb7c45d198aad21d3fc484e2c0307b89b8628dee366ba2e96b0c2a1f580a38255c17192792aba80badf7e978e30e42b346e8cc93474df35e2d0319199c0200e2f0c168ad9803aa83408ffd9c458802d226956c41913c17490fc5003e00e67925de798b0cda8d5eed7431f7535d0f1d0f052c5841f13396998c49a48a37dd00a4dd03a4d29561f9b311f436fa1e5740ec6ba106f1631d0e652278cac462e6afe78082a2d18d0109b926633c410153e54eb9beb1a1ad23cf6f1e577ac8f1b3546bea0c6d0d01cdb98cde4e356ca1cc2d0d0f897978c6d1a91fd319ed55d914169d32c343406945bf228ba2ffe2c0c7ca5f888b19f9742435946d01731c45944dc6d2c665625f0d6587ad2de39716aa244fccb73369412bcad4ccec3237ad9d0aa63009eee0c9b5a0f334eb31d73e415be6455d70917d28b6dd632fa973a1a9c63df2d45ecf2c4a921ffbd9b4235e441a568c8abe79927889bcf7e7ee417b2f23d3c98eaf770ea9cae755ab006cfada004af056026f401e18ab5b5937f0034641c92b417f59c627ccf2539f2bf5c4064767ab39ed6c01dcdf8594085856064481b430f8b2cc1c3d167ec61f22cbba8890d5f17baf63bcbdc505776797c635953dfb126624cc7a9ddffd784963de0f4f3b300ae5728085a8e8f2c2ef9618598eeb1b8daf5b31e6eb67eaa46f1521e250257b1e3188758b78a21f7f1144943b7e4aee978bfb1dc28a95ea03b6321a0a0e6b5f53cd1d10527d4176cf93525085e97427478cb5ee6abb5d6238462df3a2041b9aec01d99f20219a8f00b011409ca22a7909f239b1da1580b6edf8571af32ef8874c0a3780302b83c41f7ed57e30c5828bcf4bd04b8d9b293a31cbdf05516803134eecbc0df37d697382baaf8c66f9cb06621c23da3ccd14edd41428af45302d0a0ca353fd16f30f8f318c0fce43a6bdfee2c330f8ff0a80b91f3273e37b6484baf67a1a3945a394b944f3d165931ea5a4858c560800af2eedd82e9c3812977377c6c6339bad9351e3877cb5864743b44befb2a1a98708016247f8174b1413d82efe76f887630f660ac3039f4101458cd25b5c6a05e7bf31024c78d36f3ca53b5c91f672a964956960c775e80228c81e73171e5ca34c2cfb15d98f78b270a93b82191a0ac5482d882884c4eab21ee7f5a3f3158fcf6df191a93ce10bab165b5cd33eef7b3675ff2b2262ac5f2fc9dfaa9f5846e0a1c8eb23ffda8e459860426f1ee2c49a5f4d14b62d80d48d6400e6a42fef3c77862148924258fdb7fa4b0be1dffcf25cc8ba475c7d3a78f051c20350c4be802608ca1d4fe8afa390bf45e03bb94846786e42e03ccc7b7f842cca21545df417eba1e7469273ae38c4e2117f81f772d1acb24c4acf0c707a600654b21d96f9ee1cd82577d650c46b2fc243fc8a92e9c4377f25c8256b981afc17281a2d977578fd6e7e5ad2d5567b2464996508dea7544578541efe250c95fddbf958a373b80c57eb1d04fcb13b14cfb3b5b8bdf76e83713d1a4c320406af41fff1ee23e906deaa6c0041f1d9adf5fb1bb56237f607866b7345c6557bc119774f7dddd676aa0b1efa4a5ba8f10d7b6741c67311991d239e2318db93651af27e587d3f5604f5a0675d24b71e931b531c7245fe27d248d5d5ae8a9a64d62b341b039f90ad395a99f7f014a3daf22f6b0d24c1a38686a055dcf94b2d8572cf6d382444cd31ea8af32c1bb011a98b8b69df8cd243511310e481bfdffdf59dc9b4013ce32b72a29497f527c0be9b2393813e7b55cc0f5a1d3f9037950fbc53af8b0c185c411f5f880e0deaa51287a719fa18b82bfec6be3c1af461ac16f981cfe7ca86c60f8110e3ea286fc0da5dcf294058f73e5e3620cf552eb074a766e2b054493d12341c299afac1e4037213af44a8eb785b2b4bcf3e081c49b9685d3e7e0c0b7d9f4bb50861e4e97a83216cd1ead54f12f894667136d05abcaf09dbab318ff0904bc0368e3805ac82d7df57b57a76ad048f8a5c11c11c23048cb810c0515f63d8e3b960a64fc4d09f8a491301f0eab4cfcc505a86df794c892c095af8148d84b48d4635bf7405dd5ae9f35fba1de27fc18209f8b924e0d9be53e172ae94aca3bb26dc07f650c12614c479b1163dda2d08625c1881272be2a36c6e63b6412a67d85d9452e5a126c1f46d699b1b1753ea684cdc30a4777a4e520ff0610cfc484ff24f4d8c29219f33f660737182befa6e623963890ff53ca1e3689e9a0509311ac7ad383a17f95a6343234573f5c62970c9c3fb948fea27f995fffc4e162b55896ed0526e9fe392c077da2082c68fef00e433168ae3ae8fb6109908f0ac9b6fcd409d415e45375f0e6213e16533d626911fb7b5360c10e328c04423a2ab6c106f94ae59e35bea3903e235a29f4f10cd642ba33b09bc7a88e4903ab6157cac5b255e161c43f252ea6d26453128a18f4cfdf3b68e8e7cd61abba085f7c9d99c20f4b9116992f3eb36331f599f6845c4a8825e3d8002c33164799075bc1f9f3373ff49771179ab89fc7aa56cc60af0d474390761114c38d71870fed3fb9462bd63c736966c78b45263d7d26e17981df2e1baaba9dda2b24d2bd5591fcf2892f9984d128084fca1475467d2d1da996848948c52f8e7de949b9e03cc46612ed03d1dae1c704d17998771ce7af4ef8fd1188882497323dae7136732c6332217bea2bf2481ea3b4e8a7cc0596333c5a5a274e3f9e29096d3ab72b3fa231d8415b2d65cf362ea20bf43e3141e62f7c3312b119d79d365a93cde83494ef914afe180b7178864592e3fb6dfbeec3fac5b8bf680ab6edf411335a55e939597d0692c0bee89402384896516361ed06470a3e325e9d9a4279a1cfaf0652067a2d413f0471c4220c5cf8e8291fe8369f6ec633c9f7d9477b07aa6a7a10bd1da89565df506f25718716080a2a123678bd00e1557fce34d72793f8d1885c05f00ced1cea309cc8f0c69e8003675230a0ff32a552f8270cf5dc81afbb35ecb5274655790030677e8dc96474a0ba38e6661b573a873f4b0d7d4f75b9cca52cf29005222cc8211e194710899691afbc33017e9d5948c1cad5592f100ef1c603d7aab6c80e486f191795922c5cd3ba61dfe254adb74e76fff95c03f6d2e423a9c62298941ba8c1a2a42a1411005f574783983b6fb1ec8758318f35588fa83e8dcb112ad1558838ee0693c06bcbb1a7ee5461f882c292bc6f415ef068a64a889c1802f195fb3db1526494436142a5d3d894e606c4c33917721928001a5ec743fd55714cd366a71774b0df8211fde296c86eb9d174b1347cd51ed7fa73309e72edd4a93e3502cf31b1bd00a71e6a0af65dc8e4030e7d4a6ee469a0c67a9bcb2e24873e972ddbea021d65ee11a67cd296a4e365a0fd13e1ded90f219181ad20ea7d3ee2b6e773fee709439beefd52efff063776bf24e57f1cb9e92edb54a8bf904b46f70efacf844c4415ecc7413bf5711a41c1e12f9044b6a882f900facd184f0abae86dfd84de4169f4c508162492d16d858ffee2df7f7c4bc6ab0b45874c700c4636e706a283db902128d610e55e1dd3c41c694bdc988cdbb592f6445495c64cff52e3e37235c3de85204f6775c82a0810f39b0968993e4b7b70480754cccf08ce92770d60062cd4fd68c0dda4472beaf89fb2cbae928892146d4643b8fa367f503ccbc0301a83c190aca98f5c878fac41bd25c9149e0cb4c2b6247dcf99f859d307ed7bd2af9f3988b1079b751967558c42ef424eeeee43e5439a00d16aa98f9a727c699f033a7cb2618be02738c043186eea545597050865c060f5b0a154e494974daaaf0daa8ac4c2cfe1dda1074565c41412902e8546d9e752d4c352a0b4b5d1f4ac3292b687153ad9fcc93b2c3035532c26a96b2a7e69c5f982dbfdc2655cb3cd1f889a2a08bbf883980fc41b454b33572fdbd6d9ef24cb080a03f8bb92a150f9a53c12f4b393051e0516cf233cb9583abe0d26385acbd5bc1e9c67755112a739b9534f4c00c9a55c6aef0621824767528b11e3c066c9adb185efe676fb347c2a860ebe8e58af54d300a9b304d17b38fa486ba36bb7b61cdd655091451bf55d2143e1ec897cb62a5d4a3456361824e428517f5af97a77f69e580dfe6b82842fb89d0c49bd3c5f36922ea7c890c55de4faf2e7c02282c159d5734bdc4c45a84f292c721f2f36461b9d5ef6c107663cf30426d4d1f3160d3f86e101dc7f1642b7b092e4c2ad91c7b8408935282197bf974c975d201e95b79634e5c33864eb958273f781cbc5c6a11fccbd9a306e048c6d425338965f9728ef992a969720747325af16b48884f3a87aaf8d438ac9bd906e97b82954ace7e2ba378db35179f949bb09854e7705fa1fda630ce122e880b457c68670172050ea4ca02f2be8743135c77d9e740bd26194ea78885476dd6ee42125b30eea87102aeb10c3841073436a7d1402c69206f4f0802f9baa8bd67f39d0c27de9db3a5089818a9d2fddb2c348a2232dbf7daab43bf5cfe4d2f73f32a2ed5c5fd29e4a36a25c8eb6d07421c6de2a7f485b98f9baa861050cd7ccbb541368f73668e93208312138a528bb2336d5671a429747517c712e452e0cac4c18d9503b5718c8d97d6eb3a5b8e5923ba106039bf4dde3ebf2a01879ee3b668d9e11ca3851ae06bbcc74802c2393c0c7996907342b4ef20606cb52a39cf591b3fe72d67a34fb3f681de528ed701f8a40e0359db72be58f12c337f8bc7135ad3f3f15385a6148d2255d7a1e5af3c5387d494c6b97772bc9a7b974c46576719db46d5e8ba12e6c15fb3e4294428170d9e4866331eca07f2872ae69ecccc33456ac6855200a7173fb0aa4fa828066652ac1827ea4810e6d5daa94aa30e134cb9c841e6d85d961c2d86c38019dac91487936f77e5658c3234b54addab6502b8870e91df3b38a00b3e41417f55f49b9a956ebc265b5722dd684eeadb3ba279d0222b78964d9e685846ea4a80ef7d10f575c8ce21b51a29e81aed1a935341ad84cf4ea799281e035fb2f6e81ea599950509d224b8ff372d1997cef86eae563bb0a3d887a737045930675553f9200e48c9dac89d21c1a154bbbf54cb9703f29899032d6516e9dcaaca79c75d2dc761816fbb6875ab6c22fb79b9917451dd6bf9ebf0ca8ed822489056a3befa110cd8f5c95225395cbf0157bead8683939f48131e5e76ee3528a20d8323ae619288b8d77dea8b9964b1c1b92d2c49c459614ad50190616339b8281391a5b6bee82f2f8d098c9bbbcd9947caf711366e345c126f6a2ed9852eea45175ce0c0c07d089e70b7d8ccd3fba09f3363311ed55904aeeddef3f00dc3352bd18e24c433ec658dbd02f3a013893885adf7b96b4e1d899bcc91e0806790dd4978d8c59db5d075f40e5744f576255bd7816d8217cfb58c35e4a16f4b1018d528fb3468b5f4163969c78f45a0d2d5a32a281fe9c492870eea5cbc3d9d5f151380e46a383add0c5cf1ea679fd026ee68f42dbbc53d973cdcd530cb381aaa910daee7822e423564a6a757f0160745033b92854ed4133523be8d1683d369b6d980fc590606b3ec3a3b201e6fa64b4b1e02d3d2097291e0f54b4a059519a7b1a4347a3cb4e288f8125d357dae726638b95d4136e5222ed1cfd3fd5c62329f48a0fea5a1553a2b14cba21f55dc969ad86f1d28246d2945c719acf5c590412df332ee4e4fa1dbf6075c46b058f1cd5d873c67333c12c91662062fe879d6aa0e4fe330ef1ed06c92e7a9ed6f74d8d704b79fd37f9343e76962267ce9b014d51604557c3cf429fb43690f4891801fbb738a2901c86a64fbbb08825c7986052786786dd5d414c32861f2ae4ec2e0d0438c6a146764632a3dd25e4e3791f9b3d1e35ae7f4ad6cd17f0e004475781549a9c971954390f3ef0b7d310ded069e6896381ee5dd8183f9d69adce7f222380d918fd70435e5088df77150ac73d820c7d353b6a9f9a8d2a53793063242643a17385555e0eb9163b147fc9be7e208fbed7406b155c4336afc7dcc7a671a89b7daebb6a8574a95e3af8d73b7ddd688df10d0c284a0afe6a64299ffca6beda704ccbd12b24b6176eb888cecf2219c7b0c04b495b334cbb7fb2d82648229856f71419bc62f494d51b6dc9937caa690394fe598f3182d11fbb527e12b1a8017aa004f64ad4dd2f9721d88a2493abf35f94b65d025107d0d1c7a466a08e90ceac13eabee18337a8869507fd1146680ae5c66162aaf64134957c7592c485eec09a15fb31a56a6ce48c54daaf542b2878383b7687b2e63a7f411eb805d1700bfc56d072c9a651448073615590c70eaacdfe158067512cc79e6e3261eb13d55663b82b65b18282c8508dadc1b36776b196890e47cda38bd521ef61fbcaf201f432218df35bbdca3be2280dca04fbc575b5fec3bfb4e45505e6f4e03dc5a2295f2cfdd929619c3a80a92d3ca9e799cdcc6ddc2bba412c43c568aefe0909857824b6176f8728627b898e99b1683b124c65c82bed4cf8e5f177a87ad263861a0ace1efa56d171ec5c5bab5a7d70b4b1e609e70733ff1a72eaf1516202ebbb2517c1ca2a5c44f9f7e72282127882a977cf64faec89a235592698c73bf6dd6afda36cc6f5a9f31220518e956b3d3ced3f35157854c4925006d22bb394e17ac656609acf1f69b0e8c6ca12d63b580cf1336f733e34ce992a713ecfa3184e506c80be221e500c383112008750e509a883d70e0875aefb2029db9689a9048ab9bd9a1cf5955682669f85e164ece85ea1b3296e62edd4f22654fb26bb4758339b66f242faf49621dbb644b5a6399ca344099d9fa48e17aa0bbabc6f9f2c6dd1147dbfc777f53df961eed49ddf126583585efe9023743f14232b1347a183dd76f3a45c5b0afd89896bb12d5b702ebd31061572c10f894cde200b654171027b610c193ebd95e82565b5538bc00f69769f409b40709f969a6530d984e5ea22e0f689912b09cd6f796954e15e4e91fe09a862fb2d35fc38a34dbaa978511e74d0a26011b121c07ff2dc1172a23ddbb6303233f2ab7cd7749f54ff2723673d173225d4daaa092af0b4158830397061b2b27565e1ea7fe2dd456994f32f5690afee26390ebdf8dd67776d0b53b4634bf81e2fe734580efaf1b8e96d5dfcfc51862e12273270167a2c6a8ddf808f4f8459eeb8c0dabf70f39e347a38a943e073375aa435a8b6e69bfbee85320a82952e32d3839f56d31d647bde2c52422dbbcafd0d416c3a80956b1a946dee704085f4266b0a1ba43d043a1a1f9a5a305c15351d9981a263f758ddd46dd4f5f7dad545b35ba6d52a844a7eed36a439734fa8ac5fbd02c2071e99211c00030b60ca0084d1bdee9c330ad85c00f4001e6d6bf884261f632ffa08f661bf35db96969a889051237bcbbd777309f508dd0914239d623b3a15fde41487a563d4bbbd77637b775defcdfd60c3180cb3d664fa51287aaf77d7bb1b932fd5c5342a7805bf53d74d267b8750f94ad783e8dbe5556f5dfeba3eba4eba56377bbb6b92e3e17615c3ac35997e14eabadbbbed9aecee8750c117c7a651c138f6e7d5d464abf295df2136bc826d64fb9b7cddb03b664366d1adf683e817ee21fa867b8c7ebdbb3e62f2752ac2a347f96b4423a625d2e57997bd2eefca7e5d5e67afeb9862ec2a81bdbe1bdac8df65c3dc1f3f44895e5f595c9c9edecaf920f27e9663ef2af8266fdfede554e075f1a86511fd3159723ea8264ab668717c1aec42e52d4ec3f2abb46039b6d1295a5bb438cdca555ae0d8a92156b00a8ee91475717f69bcbe2a6f7ae9d977baa961ee53b2c6a12a571c62217682435b42e17bbded1db9fbb7b82c5fb9f82ad7050f5c02eacaf18750b98b3777cab1727c1a95bb68f17b9a16bf2dee7f4fc3f216bf1f82a5850b7c67963ec48902c22e30feca695c541bfe62081bf00b5c6f8bdfe4ebe2aa1cdf95c764adebb29925d75d931c0faa99f9af7c0896ab5c72a71cffca698e574ec382af72161617c72c180fe102636c3b557f9323e7ddff342dce72f1f1102d70c4bfc9337366aea8dcc7c8d0468ec72ca52da9948f3e28d38629603fd891ac795506512a67c823396229bbf664a98a41a9a44962cbc21695d4c28ecc17f9932f4b620a841ab139383ed6c7e463c24c39312726873227f644ccc7fed4253144512cc2d86861478290c8217246fd15521b65117246edc6b2882145f4758f75aa5fdc920c6c1879ec44a15e8c883076a6e2651147f0a1961563376e1cfab8f9aa17e56a5cafdd5267bef4adeb32311cf3b22ade262a66091c8da1666248bba34b84b13145fb6e188e9457cf7c8142cea0aff5f2c93ee8a504ebbf7e4171f9cc970b27d72b93e0e8d4fcb513031b4a9e70e664b90509836921ca5c4a228c4a7ece0de4190653155450c8533221cfcf9c1a8f1d003aa6145812c8224c66b060c8510b39c6cb0d48184c6a000231d65c3df345093e3972b561244f8ee461e1c99949266a5e20b64c0c3420a6e6656a0a24301561e506e6bc0c19b173c74513368463a7a475b16da2304f368526b5276b9e4dbdac96b4256d29a93c6273e1505a7d35166874935c6f0f36543860202f8bc82132070859e3001ea6c6b14d727cfc04b2a625130bb547faf03411190a9b086661d60ed9b2e843968caa92216710892a18a88e3d2e35b0d1464b53c5228df1891d72bc8b0c1adabc0559289040598749fbd8a64c122986c35196d8ba381eb24ce32dae064663a634d6fbe2a519d85035b34d548c14065bc91c311f1a04ad5eabd7b5ee9e3cf29440a84b72d7b48f8d3eefe8e3a3ca99528b3e78a6009d74e80f5d45ff4c54979460c3b884dcc74153f3c3290575c91591bb7265b3edb4ab8b4c14bdbcb1f796bb2524d8f0cafdf71160e3b2648dfa0dcf5ba169337368d533a07553c919d9eb89e4199fc81816976057765d5886165556bd33131533511876591aa31ad81e206a7834cc77611bf3a5071c9fbdb65374eef0d2325ce24be8b3ba648c7b56ef4dce64c81821cdbae488645765a2228d5844cd5bf333da8ae1409bf8bbd7b78b75915c37ec93899cf1913e1fd2d19641d2bff9e678c832094f2cd4209d7b64428166e9922e0ac644d1e310e110f349c0cca523368c3d618c0d1c34350ee01181eddee9b7399a30a589053943e659ba71a6b267573681bc11e95abce88626f0d68899043e720ba8f524d2eb4938147dfb453a463a7612965c0244b71fdd2f8b6eb2f5b66fdc76356d6241a289f96419a536537b943342df5ef1862d19437be56af4e9294743db4626194389ac6a9a96b56b59bd1addb6ed35e837bc4d99b357ad46f6d0bdc9968c512d2a35496f1039ecd3c890af44af9b8659c7cea4f36e44f6b0d570e863b368bc62be2293f9729d0b5dd355f944d5dce1512ed1c0d277cc0e13e67b3daa5e1527cc37fb56c819327296e87eefac6bd866e4bbe876e02b26422126f23562f6f0c9be07760f63b7b7b8b83d729c8f2d6f585a2163843eaff8a25e28f039e964cddb7028a42787dbad87b887369abb6fe7ba6fddf6cad5e87e3d05e85444ce88b9eacc977a9f1cba538a89a2efeef49928ea44a697c3514262c319c47ddbeef6942be6cbfcf614a0f912f3f6530ae40c99b7538ec66671b766d775af31dfede4add3e6c6d5d8cedd9bec63eee40c9f522063580fdd30e58a6c552443e89e2c57b161ac6a6dde2bc6236f8fa21bfec81b0ebd87a4b6d96fdebf7ffde1d0a6e6efdeb4d8fbbc57aec6e71d7be7c8193163de2947c3ebc9db75514dd4f579fbd25b6fec920dacf53a7f5d47c06579de64e27d2ef1de24f0bc7b21fbd0354dfbbeef35e6bfdf84cf1ef7cea6660e6fa11a44262e59f34298bc4acea00fa9f6cc85661a96216364af9d3bcb4e391a19932caf092b31f19c3d7b942167c89cb964a793f220afbd86ccb2d06916bac936335f58868c41e911edba76dd38b1df647ac3f3c8b15e77562c63a63b4ed98436fb864172bce24d8eb74920634c26b9df37979439a031a714b0886152461f9b2c420e298249e3585da04523489c884a62f013951811224f6c3373054cd9c694b3bc917202bf028d2db438b5162da24c8b162c2c518685656525caacaca8a844191595d329ca9c4e2929512625050525caa0a0984c51c6643a3989322727a55294299548a42843228d4623108c32202812451991e8fb3e6ba38cb59e17653cafeba24cd7715c94e1b8d8b26db165ca685a9645992c0b85a24c28145b30ecbaa2cc75595694b1ac5aa34cad94764799ee39a3cc9cb145467e5ede486909c104e8a70a287c789e48b2736489247472884821b26c92c515414b9848f12325ce1563d12bd30341a91461bce28a44b04215991e063d55ec9e2aadd78609c33353071a4329c5e982166d3062c3f853310cc37eb09f8e91e590962c8324905c226be426251356e630027b2387c8481f1313132fb52ceb9a40b5704c471965bcf53246a5ca22d7371614f3d496b1ce6add1c88b0b5946d620e43582343b055080707e41a56a1cf4c17d4bf19b1218dd9b558b3cc14c7999219111acd71c26c745249295529820d9f290a063da57f31bd2813e7fc8dd6f5a17b93fbdad48c61193246fdbc8dcd46422ddaaa181e949cd5a2966559169667a439d0faf29a942b298388af51e6ccce224f6b725f0338808359b81034777a16d19158c43c859846e44924cf2b7c4cd49c3c988e649922c655cb25661892a3e4287e01e3666640cec9040b47004a120435ec4451038b0832d87440822c18c18a220b491822054cb010638cb2bb37dad87c99b13b7637a594524a29a5ddb17b069452ee1b1762f63eceabf21095efbd76ef09bd61e9cd25a0fb09c342144d0e4bf701239f4e3b03418ce9ef3d39dd996949890a9ec8f5f4c5fbe4f4c43be9520b96d2574a573979a9f4caed78711baed9303f14141b504c9fe92b5d7b71633295dc0fd4647aca0d6f72cab5de5ea484348b5cc0604fdebdc9f4dad47cc232640cd3eb0d5db2e9338d82e3448d6ebadf090e61e412e9c689d2bed1b649ee878d3b0fa1dc9de3be594b0303857af1827a1e087ae1e87b41a905bd172f6e9c29cf761a0d8c9b0dd7d36b2fb237fcf0c5855c476fefa581a59f3032f7d0bd4b031bfa80912b07235399b78d865b16343747727cc46e2002d01460dc4004202964f93b6d3802f7892c49c581a3ac54ca48230b8a3e8d52cef328776f87ca4f1aa651c19ee6554e3bc7d1c44e698f9daa9a17d6ea795ead9ee9a4e4795da779ef3c4eeb3c1c59f4d1e93c3a55ff712a1de90453b92715fbbaee386155a72a27e26ab5a2d368441ad9fa5315590e3c5591e5b8d355c141a3824fafb59eab1d47e34315444db3548612c98aa84a011d38ca4e4e4a99157db5d6d1886447b556558761d69a4c3f0ab579efea3f6b2b0571d0cdf36a15e1eddfbfaf6a15f7b0b5b31da992ba3a1a8d46231044a12794aabe4ff483eaeea24f54323d364c4a8aa9d4892cc5a12a77e0c88a4ea3118ac99e946c6647d64a1c22eb6d9b8a7b941908c2714284aef34cf5dc8e2ef33653ceb28c4412812392c7ed40b9a97298060577f7c07b60e76d998769baaeeb700ff01e281a91482452d7913acfb3342654d7ed309d8b3b4c184b795e77af13bd870dcda277dde8ddb59ee79148249287c3eff624d2f72e7e64459fe9a298ce75dbbbebdd5e2e9ecb36d3fd4183824d9c0da5d96a48f32b83165f70a2ce3ee3911b87d9bdec72cf3e10147d190e4dd144b1567bab918636b0db87ad4ba4087e66a6b86061b32cfb68a3413c5b20e5a1e5ded9ad9769efd7d6b2eeee5dcbb2cc46f4ce3dd3a8956937d432dc63c4d1daa36c949548e006825a9659dc0dea43c85d7b86411f344cbdacaf69a73c3051df1eb8043c466c27e7dd4d33ddb3a311062d16711d531c87439baa51aa510f8737dcbd1ab0dcdb02325b9f5a9665f778e4d6de97bbb5a91aa59a46b9db542eb4a959c371cba1909ce1117978641b7a808b92c06176a2b089e298f0de81af4cd64e940ef41e078410e00d6d3278d1fbd8d75bee3a3777cab2efa60b66a2ce70e33851deb6813eb64d2385b4921dcd9ef49d466f9525adb7eed4022d32053cef74020fe2eddfd6ed7d8fe0d69d4de313f813f8ed21963f7c02b18d981dcc0e3ec3e8f7ed8636fd6dddf67e05718fd2777d6cb97bdfd062afd495e8bb114923913a52e77d218fd49fd733f4ee3b9d2fa47fdf356aff99b87bdb4874b2ef814dddb9ab8936d2a5fdafffbdf187c1cdebbc5028cb361105414a3abde1e85696652f1da4b7fb4e0f7e7be9f6f840cabdbba29344371c611f5bceb230fbbe7df47636d93b78698f0ed35b1f9ba5f7e8bd631f9b8fad1d00848d9cc1143370828f2d5b40ce608a194c71b0061a8eac659444414ae9290ebb6f9556db3d76c39470889146f560b5f5ab187b2aaf44aa28f444d64fbb77dabee3f495ef60b94a47e9874f1b5ec1342cf766da0bb7c74feb28d52a3e59ed9eecbf6b9dc9844f169f729cbe729a130d8eace1d0541fee2152a9448f128552cff3a84769ad59adb56ef68638b2cd40100c5119040f5ef35431df907f1cf81e7d2822d2e9f41da313dea182a3cf36adb7793872d7fd2405e524238128267b52b299c892ac5da17693f1047e74d2cabfbb912ecde923f0e65059b122ec43a5cdaddb56aeca4f9765bb3954f0cabd4bc382e35576e52aa759c12a98e684bdae533e545127c7f88855953c8f69a284e0bb2190fc715c08a4e32cb5f6d64e6d3be9edb449a7a5531c8a9a36f77a8ee34eda28e57ef8fe59ee5e73f6961702c99cd55eefa9c3373e0d73d7b8ca719d394cb9136cd35c49b471b7d72c672d77bb71da6739daf566efbacce4c9effb6e770bea903d72a14dc665dfd7894c9dac36fc914db7131c3de68ee3344dcbce5dd2b37b83c4ddeb6e3df07e3814619bf6ba73b7bb373ecc7157f36c9ac33e7e009196069ab76d17512cdbcff4774578b30dfe7b87b189a216f7681bd2bc61edde64f086417253d228c3dad4186b1c961e47f4deadb2ebd63fd87ff8068edea3f5bebd36959c0fdb1b9fb4f749c3372cb5d76ebbcff2287e05efe11ee06ddf90721ee79d50d268e4f5d6dbd6ed7d1bf5d6bd511c1beb9e7dc320b96d08247b07ad873b7a20f9fb4c77789b280f7cf70f6313e5dd7bf779d47adf4bd2edfb3cba7db4f33c9499eebede28d5b6cdebee9dd2eddaefdeb0946a1dd5a6b6d13e958f2d1f6fc1d0df39cd0b92696d8be93bea7d97dcbd5b9a17cf8536f3f346948eecebedb52e37ca9d62fa10f743fda9fb0e949fbe43e529b7f76e48b377eaf0a7f23d05d7efd486dde3f70bb4debd4b6b101fbc537cea4ecfbdd60e9f72a0fc741a144ca375df431a3dd605c9b5b35564b75b7ac38aed462da5d45afa7978d451da7d1ea51ca59bd5a4773311a5d7d2c7a3ece88f6ed6729f9974fbe928df7142d9918225f8a8a23693bb386b6d7c7d77b96bf6ca0e7ff5745b7fba33fd598cbbaddeb54fedc41dfcc87e23909bd67ea6439b69efccc2bba1c69dba7fb728f7f41a84e68463a3fcbbddcd91627f7a6bd7c65d8dcbc20c64edf494d39c3c1a149c929e6ac319b50182591a24bf344fa8d0dcd5b0de369bfd13b5bd5eee9e69db7ec8b09da82d7236d43b098d28c64a1ae91193747bf60377efd96bd753876f70d8c391defb7743eef16ddf1eaeb7eaf71f3ed4537cb2a7f7bedd933df72db3f806777a79db876da8e5e11ea25bdca3f4ed3393bb9496b651a4a40a8259b6d18df39e7d0343d9768fc361dd6a287ba8de1f39d4358cc966fa0478b8628ab9eef7ae7613b5a139f49885425b88f36e2fc7891eefdd74b14e79f8a10dcd75bbc6dd1ee063ce32108719c8e049f76e77431eb9b321eea6100e79944e4a38fc91edbf874c3814dd8b273547ebb32c3bf8ed8a0ede1ba21fd9e3eed9789b6d34ecb7cbfdb8c16d59e761198e1385c30cd02c7328c3a1cf4c798ae3478e8f41fcb0a4f949f1d988c9d7f7e9d58ae5f0d73729babeebf2baaeeb3c7c5dc44d527a123d985db71dd2932befdde34a7ea661bccbdb6818ee339d92ef6e4da77870d8466c628a4159ca08b4e19015b6626ca27866628c266dd22ba48dd094c5b044aed6afc6a185758e8480340c860384a988cde9db68982cd8503ee1c08ee1207285fd66c523ca707986308f4ecd03e9d4bc69e60cb1c252175fb0615cd2d6112bc051a2042272e844d949a58ff53a64be504bbb8f9462be08315fb29989f326a6200b64976098b526535c92b5deb488fd0822c2480f84423f3a4513c0c5a01f5186cbf4fa44a04e94b1995e2a1165ae402f8970090399864c1fca3164fa5076215329852ca74842a65c963ac814479fa892a9f5b09deb126fd7bc3f36943a2af43b3586c416fafb043b846297f499424829268afee8a09a3cc844a9a53a211d580b63132575e4a9951b1882944c21043948304308da27b70fd044054d54c7051b4aa06eaeaf4929e62402a353856c222ccd3e5186abc2a2204e27664e9461c9fdd93d6530719d3913d55fc9819539081334dcb507d98e8368b72692b9c444293175e6763bae260f620b1aacfcb952d83851f28a896a30581994fb73620924a1882d7d202020a03ec6e44661dbe78a4109a494b25b36edee96e10e748724ace1880db15c84d6311912369446480dc417cb23c8f4024654c7c49656c2368e4e755eb9810d634c0d13638d189638606b20a22e53080af632c1cae7d0215afc0e98e4013be325cfcf2000888619000160dca0ba005a1ee3383cf5500eb18e43df7ed8f8882d3387088a066c3873a65c71df68e623ca649f8fc9e1f34088ac8cb758394bca63343d4610dfc5637f8fb1616450a772b827ed3a3cae64dc93864f3964dce53a72b80e39dc25870bb1e1321e5777795c692ff029870e77b90e1deee2722101b80e38764ac33a5caec375c0425077390521b3f65006659f993208c705c6f8c696f95f20266a3e07193776aa050e51319d9a2c388c91658c1cca1d142a0587bf099770682d883fdce1cc0396c31b96475c1061b55010190efb584e177ca8b0c72bb30a071c7050a954383cae04704f9dbaa7c6a71ca994000420800bb1e1a947ec12464b4b0b0cd461a00ee34202f096c7d50df7249fc3e32ac63d497cca11e332aee386e7808500e0375c0616c2040d007ec385d8f0183711a0c88c1d260a35800be3dae8d4fc0d57755b6e8c8bc3cd38dcb852ddb88a71e3ea861b572d37ae60dcb8ba6ecc03a83153b7621bc6c400f4c53200ae0dd7c5ec7a9eb042cf135638810f0c0cc330152a8cb1d1c34f8c12248001a358ec819d748a9e3040a6101335491e2801b69a31cadcc0fb94353632c6943f0d037e8a5aca020cf96a7b289bc8f31207d200db470fe5111964c5555d49ae069781c4969969c17af77bbd46c05bd7c8106c057ebb427440b5fa3ec4aec003a1848a9f6c3373c5272c6f39c87ca9a71cdbed4fa1930e4ff4791e0d730a611ddbedb7db875227f450e684b045c2d67b8b74f7547fb3e2eea9e209d07057756abec34150d8e3805cc38a09eb71b53d443d5b6df71e9aac0d441932e4c981f842447cc9260b268e9c6123a708220c378fc8b3a661e28a1447b2c995a27bade65db9d3a91bc496f9eb4a2457267165114964a2e63c42c3b29133e4084a105b72e8ca5c8361d95a12a2c2528cc3c6445d2558f9309b1a0c8a80c4bbf6ffdc4a7c7a1082247890a80286945236866158cba6dd2d553ba07aa28ffccf44c5989999989923e4e4d0443125f24420030e7549b17a58d775cd5f3c72c7eb560f375986cfd20b368c3e34354772297354a2842a72d330810d314a4513ba20a2020c83a80917801f20428250980daaa0e9a805d49452411c74c5c1c1c189a886b1d13895cab91a89c086126789d9b4e79c162a478e20c6e80b4b1c598279491c216cf8bf982d67cf77b71665a62414d8a9c4199ee059459410d8b9842a46a0b3924300421474565189108ec0596975a3777ae0034728b2babaf0269f6e5839cc40c630264a7e07497a70566d25923f471ffa5b3fc1d573f55cb5d65a6bad97cfce5cd26dcd25b5a7f6486176b7a58a735e2eb55eb556975a65b89c40c7d2c9eda3840db71c755a4746ebb44ef5913b5902c9242a974deec82676e4ce04ca5d8449c4c2049a4016106850ae3ad3886d64a241330434880659249e39ada83ca8a1cd933ba886a7791ed03ccd9306ec48c67ea8851db17ab6755380381ab3bbad6e7aeb5eef3bdb6a2b05a84522c8735a279d2b03d9c2575b97b6e0a433516dd5478aa38c98b47a685c92650e8fb8e4013c2a0f2be877af29b6cc6b328a177cc0a7872592f8acb4ee001337f05969549ec00849f05969b5e7a70547569ae5042c663064a55d5bcf112772561ab60149c1b3d2b0adde134d0d129940e4089e55454d948cd911988004243b44622044d5348a61d8abc51e0a65c65e6f45f7fb41cb189edb7ca83ececc8a6d990b43f7369bd1639ac5a4155c8dcad19076648a17ddce46928c5d912790b442c6980f61184603bbee0eac0402ca92abd41a4111180cc13ccc091802e8ad6953656b94a996dd588f6d974e1486d5502814ba7693af4b2e4e1476b2b01d65d942a0efeef3406fccd7e79b9614b8ac895dd69453f6b02c7cbaf1d97362cbb22c8c7aa19a2fd3b22ccb0aaf8ba27f81cd2dcfda018cca4a9bd2534a69a5b23695b9be6fadb5ce1ad82badb4d25a2b0cb6a2d9a78956276dd95d67d3ee39273eddb8c2be2c8cfe4d9b36a530daaa1f9bca6682165f8419a5216d02413fe9a7920833833a456fd109058c760eae4b42b752a0dc9f411d6d6d7a051b5e38b92b9389eaba24b6583d9dea3fd7ead3934319106c587d8e4c597daa143f5950cb8699ab89335f84c064bd62a6ba02a9c0ca26dd6448ee954ca9414d727f0275aa59a2b0a16c02947b7234b02c9bcc972c70e68bfcb5a467db208727d8303619126402992ff4dd6f988a598093a392152891c3d81395a8e08a091357f3a1b5d1b9c646c300d17303096c189bf467a6cc01d23038ab6e15489181f851d3ef1f551d42a8923a3c35353535353535353a74e8d0515353535353a343870e1d3a746056a5d9d1a91361d69af00e150cc334b15335db6aad12c73376fb7d1688873db1a7fba14caa4e81a3930eb2a87ce5a39b43e58461262ae4a715dee4ec212b6485db0f1277214da35aadb5fe264b59bf6119f2862ed946c3ad6eb20cccd95e10dd90268baec53967ca34cddb9626839fe91f7b4513a5eb94bf5e1a581819c60c7dc0f0ace63616154a555cb0bc45fccc2469dcb56ea41c05ff403ab7e3bb218cfc7ddff77ddc51fe5d7b7139eb9e4e180573971edf1e46b724fadda2f42b2cd7acedbb28f8a44bce87ef28f8548f727bd23dd57b2761584a4a4acaa9621a1bfe22936e714893519e82439a9c72edc5a9742747a3f4931394d3afd3c9c9bbaee34eb89393128e13757f724d076fc82393aec9cd0613a613755fdcb89ae97b4f9484618c4e718fd12deeb18272c38a7dc0f856e88a0b96d7d3b75061c1a1cc2a57b1d7ac8ab5a00f16ab60dc8df644a09d74eb0257fd66e572c36962fc86cbdf80c3553808ea383c48001ee3372b19f7242fe337ab1c6e8e1bae3acd0d575d5ea5ba0c1c0400573d880dbfe13738a860c4b8a1c58a2013c523771afb25777cb082dc30bfcafb53672a315fb61e1934711ae6f44e61d189325c6619819d79f495539ffebd61b0563daade84ca4c54131657465ae982275dd19da09b8e8e4e5ca5c4d549461d2327df3c651fddf4947bcab08ed14d271d2b4ff9ca532eef094bee58197c7a2ec98e53ee12ecfc699fb9a46156c209c40903e28a470d5e7918814ee4e36af430fed8187de561ecc98d250f228c5e4294913bb12507730711e6e43d97903170d00521c288c087272b57f248cec8c953ae3c5d693252fae476581c9c21fd8e28ebbf574c599749b4f46918d23b943ff2d3a7979033641216b7b85e4c5967b12e77a24c8bd8622d911b473c7ba6ce9da73b713ad54fb9132574d3a87f72a576a513dd133b05fad0c82e87b49cd149e4feaa74e38a74e36a74e30abc713564a56558eec49639244485c5b0c4012277e2e6dd78d343a2c51761c5e9e6e9d69945bc775c983af3257a98c5a2a9105b0a39c345c628437c41437ce9236223117b07b17d109f105f342a2219e48cedfd1e4394e1de2d3a0bd974c58b1332cb3b0849e40c1a19830511a6a65344fa501841471379896cc402b1a53fd7106180c89cb9634413816147c4549f67e6d24397f4eb82b7aee8d45ef2ecec441996fce5fe7c22a50925a223cad01314f9294293d026624b9feea89cbb31b69cde82e5ca23220c7d424c519f4e5135649ac54579764dff9158fcfc5891a3613ab9d65ba649148c541a5deb596777727a826e42a49b944824d98488dc44a0373a6dc22b92441699454091682659913c512672356acfd979a73b0d439774aa0a3983662163ace02574872ed9c9134f21f7357be71222aaffdd898488f291319634cc8c22a65a362137cd625291db9b40b1a53f9f0841c1ca1e9eef4b1a66a3594cda853c0aa91ae47da88fcc51395d79651228a66b335140666a1ee7e7e4fa285d1ca4db0316728604628cd9303444be9025164d64938804223662cb3c7861c8ef456c51cdd4fc8c99491a8bd8d2e76e8f21b6f4b7db6490319e1051fdec3615b1a910532e72464bf1e284dcef20c4543f0ba62b4c468022a67710db07b19188a8be75fb8888eaeb6822d3c8199d8405d146ce6822b7409f202ff1851cce1d34c4598688eab7b8f3e72ec9730d3175c41772bf81763ad56f2372bf89c8fd9d9db91345c5595983145738d13384123d4284a1064e044d9c23e008e28c789f997693b10a9ad812438018bb042b63da0c7194fbbac194410b42ad71b307c7449d64287778b7a7e9fe5dfef3b0e9662531695d550c8aa14924cf1c2c3bc2863268c917ecc4456822163f57f830a9a24891bec4b00c8aab89716856c8162a08c68499420499a4496654c3c8d5270e0cbc3083b4287a767777239948827690c8254c41f2874221c2483004fd04fdfc502c836415f45dfb72466155da54042919423e620a9f385f26206f83e509d8d82c7d105bfa920731c684913b9bcd0f28acf56a447bc368414131413287f1c746187d76421782854e8f248b7c801c95d820284b4e869e5d8876ec4242cf4e7368c7ae23f4ec9403bb761dd835eda1ec210d9be46dc8277cc427b2fc4c1256eed022cb5f3631280605d13c658eb56a1017689d97143a4a7c8ee8d66182c57efdc77cc18c881a4684636a9a0830b84294a1292da74882fc81d40167a36144efc7663981053fba10d149affff9a9a9694084912d883f3a37b042981042bae8f5a7799ad1c1d3902e7ae44e13e718611007618206bce83a48d8060e0262535c31a1cdcc17d90f0390e56d8833a40a628c3e6647a4cbbf8832f4f2a4fec804da9823d8981d6acc6067cd34733eb4c8da8fb78ef4a4adb15d5e9e6e5ce217b1e593f235629638a4f9b352fbd4dedd6f363314ea50167746091595914e8e99b19161a973d56031ac424dd4d502454d1d6f762fc8c15982176ee0830023da6d4c549f6a60c3c86363c665c26857990608f20307a771e41ef33e54f9d2b02f582c54354723b47d08eeb153563643eb4395352c6b59166ca4481c59e28989ead9d34f744ff360938707db393251488e44196ed607f1aa77337faad66bc534df411ce47b909b5588cad67462727227b6f4e3ec79e4889c3187e496526b91687411e95e0983251c4464799774633ad5a3eb7913d38c46d6da8b623ef06a7434127d640a32ba27bf5b9ff634e02df80f07b1074728d14d28d3e88ab0195baae4ce13d4fd79c57ce18932a1dcda73b6b68d63aa8285827c820aa89f9bb9e9c3710f4598c9d3a966429e3b1665b673aaccf950a5f05899b54f80f61139033322cf6f9916ac7422893cbf5db3b6d8309e05bfef8237766f573e617907af63748b858c22f81dbc8eef2016c2040de9e085c44e7d3ac07fffb01012963dab4943ca9f3cb17c42c3fa137d9f083cf7378c45babd90d2c15ba4dbd3906e71e920b60d630fdea29cc803ef8db090efa35b17f54b570eb10dde3b0de85d748969be8fb010fb9177d169bc8b70ec14f8efa11c228b8097c6298777f034de413c318dfd085f744ff3403ad51360405c7d380810f866f5b8b28f40a25be3ddcad8192957ce876885acb5d44f9e7a2ae4fe09a70f0ff3dcb7abcd356459a3bb7c8dce872a6fdbb34b6dd2d0b013b7cb5f903b3b4d828096fcf8c81596f1e4892d54d81096488e4c54b73c92fb579ddb4ce9014e963b71623151f44d66d0bc42c76727f3c1ce8e8f4f94b93f55e820622193cc9c91800a9c30740089945276cba6ddddd285ba58392af14952440335c6ce52e4f0b109108ddd48f639e79c73ce89a53c92e7e90d6dae4c7ffdba82f0ba2f735e71e412ec2573a80ce51902a28930f597e71ab2c441c835e41313d8d02501d488f6992977e6cbd430dd7246392a392f68864fb28fd91158ab4a9e248c01a358b52eed9a9846bb8957d42bb6a0601cb1e13699ac0d7d62d544c584aaec32511d635355a1abc246faaa186ddb3ab3b6b7296742b034dfd0acd6758955666aab1709565e073c2d833e7264a29640f54347e20c2901349b0911466aa18166048a2d68b0611fc97d7aa49768249d2476f7916f8fab1cddb7ebe8be5d88761d9c90ed9926638c38fc68ecec9eb28796cb30131ba23cd61128a04082fe749289a2bd83a491ec20a1d612b1859a7e620b7d88084b7f58320dbd4c2189f4ed2c456ca1a71963622d1c62cd23c40ca080a20a3aa0a2044248a1831c244890f8f4b060618dd0914148924c89058e13990faccca14492f9c0ce1c4a2448649034431259be590645999bfb210f6820f73128260a934155d8cbe201425225164d8276ac8462a2ba39196465108c9e257a7a7a7a321250613be7f280165f348f5944eacc588247a684953953c26648d896417c8999a8b89a1151fdda84c7090b6c189b0c6131c1ac41c87a6b96481aeb03e9543f74b1192d83886aab890ad5c407045fa062b0d288c61796437070e490a6e8a8740d97b4450b158d0000000083140000180c0a874342b170409ce7e2201f14000d8ba64a7e4c18c9a32087510819440c21860000000019001860b48d00628607bdae1afb40ffb997e327352707c5c08a31b0c6489061496de9c085263ce1ee420974353c2c846dddaa2970138d3b18366d0fbc58a44e6f2755c2a99ec67717316a3968f5c2933e9d4a07a9509afff7b4d8c0072a1b06556ee68ca99b16357f77514715f4bfcec3981594865e7c74ef684e03124c027f2215aada7ad1c71c1d48158e77b03cd4fc2c5f47fca94f3a3b503a6f068dc3a14d770f61384a75e19e8350a5c96202734b3c1e23cd2563cc4858b4615c368ac40e99074db6073aff19db91e526668a4a7072c223bd6307be64872dc40879a83d1ef899ce4bfb6b618c07a9be7434516b19268ca6a26f768c7541a9fac9b1395b16992975874c8297f399d93b2bc8546075c5dbb88b3094877b48c6ce5ebea85d175ac86f32b60086657cb4dcd95ba2c0381608813623b9345baa6bd30eb626d18c83cbb42ec939fb0fc90d535306a2a58205c5c511a1a5091ca9ab75e852704458f038fae6d9bf35f610fee3ae4ea846008f79f9c09d96d92200c10fc09486385854f58036b3fb8e650b2e1ed5cad70fd2614b82dbc82c225195a5c037425d75298ec532e34b3dac180fb07c17d37d9907ced04282a239fb43ab9e2727a1fd3026154f51b048ac9ef95c035f76782d4c597402d3a9d849ae540749b0f83a42a8d6d90c57e6d61464600f2a1f95574651e19dcef569e2995595c1efee95463d23adb4e1dc57d1a2de6e3917041a4677841e0d66b28ba49bc5175b51c8543c4b9f85fe166ed878dea8ab12655e8557bcb1afac9ea702558d69e64262721add1b9c861405efbf33ff7f7cd13d4cfeb2c795ac646914ad58a8ccfb8d15c581c7a7d40f073cfec2318cba85327ba13f730c068da5b202a9aaedfd3268591242487227c417d30b10c7591f0ac52c27b329bf3c217d124c148ae91b67433e3bc51c1ed8744d2289ab68817f53249a9e0e9ac40a71fd9266f51df2eee8a13697d6c8a226179a17e5640b9319b345329d930945838988a6d2b1c567ec232cec72f6ac0c7b9341589517e5ae624c635207b53de01dee30683cff6824f9fd8cb44cc91d345bed990a0c8dc0dd2545aece2162ac058f5990a5906c64d92d397ac8303eb0409117a34282b1c09f12035caa5027c31cfcc875681038f0e955ea9954fa93db312722d52529df8292fbf3ffac215e7c5615f635306ccabe11c97c65045162946e63c9057a3898b4e1b6782efa7c93a4ec95be695438ab73b740398d623f8d223a59820819336974526c021c28877a57bd7797f39353d1fff4350d8e1cae2164946f6acf09304d23b83869f0d0486503b7be90e812aecb82af5ca668363cd0a569900275cfce2ab009d49336b63c6a101e24932b70b82e239e16bfb2795cf7261e54dc7b53e49cced8d0e171a252640fcef3768e04be57755ddf9627e0143dcf5d536e1254271380209a0b18a602e8cf3f9c4d1efe12272acd42c954ed60825dca15a191e53d4a3a7385ba96ff26766a173d0794cc660df0fe26156fc029fab5ccb1262bedae6bde670e071cc74896c7f38fac9d5682547ace9172d764fed0504e834d9629ca27d0201d5c920e42c882c6485eba7d9224c6940e44220959dabb4a007a6eafea42f4b7b83cbf27bfc8705919388248198133531ffadcdcbcd56f9abc1822647196122029a7be49bc44c70f27d12df41546118e97af53939bf11e1cebe8340b1782d65e3b5875633abf152357bd10787073e6740d6ec3974ff5b4e4dc5fbab4a08ad7b963ee6b44f8f9e2fab6e2a120ac1ee66b8079d50d8bbeecea329d7f8f4cb4abcc816d77d9a3a407f0c786f636303394212d41cb90aab2a242cbebac4f6fb8b68f862c64f8995485fb4d4c566c09c6c928cbf6f4f4f775522e4f0671122003f418dfadeb5849d0ce0d775d16b852b500ceea511325f59d408aac02c3eaa75fdcd034ee001821539ffc9d73c79918ed6f981176616bd19494521bdc5834977e4466b16a8493e390eb3dfc251ff5ba78d2f1fed70467b114f50dfeb7969c8561238d03f4af733406d58a33b385cdba9062060e76790c65d4e4a652e92536c0249c3bbdf6cf9bcfbeb8a2317257cf0f0bf72bf651548189d29d586198623adbdb8329db4b4102da44fc92c9101fa8d40734f338817a3873031052d18e4e31cc6ed614822e4ee1fd7330e85259e1f6bbc3a49d534e4ab8b95882641385884e24e4cbf0f57a1551935c6c313910e4d24d957e54cd17522035c54238519f022732cf265b1fdbba166561e8f75912cc26d2389e762fc476b5eba6aaefb2cc6d87fb7742ab16807a8024882462a0b81f5f003e853a8af3760165530ca366954ac30601bb138321b6091c7ab1771b82736818a41113157ac72e446cdc877a21884d9e049dcf0a1c8ec227d75518a4baf78bfe9c60c8a51da32312b2bd00247b101c3a0c83b8677373f1b5cb4c527dce9df333139d690971ba4d263c570d21d7e14e22f70ad95a12d3710215d0c4ee0bcd3f475c2aa0550934d93feafd5052ab294d3885f34e0a33c1aff9f8442fcde8b8288da1144f2dc59cbd148f0ec47199e49684cc99fbf0f9d34cb47e86d0b42124188a2a9608fc1412ea4dfdcaad5a170a62428036542499f762a7368ea7b4ef9929636000e27ab13cde83b4c686b35f60d700d9b92b8c81684a068730b64dc00007587f7651d9316341b6707be0d78ca87c031bc46f60ff0a6a3feb8fb1b15d0a8b3024a0c20cfa818ffd458f5f386dd84e71df6b8561f86bfa9162384394a0fa5191dad7fa402ceb7eaee813d7e708a166012100651a13c761f4fa95355414d5b00e99116730ed2ec688d398b195c8691212905c3604e4b3fc171aa9098f86281bb1f2fcc8b79bbeb33a876a292bd1615ffe92f6875e6bd4e92e30350bdb859a6a6c30ed5ba14932b74540e29e3393735ca1805634b22e24f749396948c614e402f7221eb8341db72904d642b8e90f9d81b4c19e7dc8c6b9044f37755eaf65836cb796b7d5b2f7a57e79e95bbf458694503e43010ecb7e15194e2e5e8abc69d410e9bdeb47da050e3cfebed7bb28d6a0eda9dab852211e3f1c8aa61d4a6b87ecc2c0cc3d96200e086cb06a057355030262593a3aa3aaf06dcc05c091e4115da068d87211e456e48e8670f61537cffda54792aaa078bdb8a58f804948875811c155f0c5c6bf021162b14b78f017ac709d942374e81675084201990bc04711fa700eae9bb4139622beb02511e0368077aeed34718113eebaf255c0cd9e84897a0216f8f0d80439c42ce08b641eb4609550c1a8dc839c583a72b46c259c364135cbf95519ba2e6c07bb1126cdebd02c29e35c413bc09f3d2ab7192bd49dd8322d8c41e4246273c63db828c8c4a871590115d0c47233742654423fc0565dd3f745f59ad2800020eba82f74049a69fbd2ae31f4719b8744594a360c7053e621819262fee971119ecaee6417c5a2e40c984f8ba0511ce55283841a48ffdadde6034f69a0481da5356d607128adf1239e86c8060ae2ff24a230a3cf6869e0c7a1dacf47a5d7b523542d17349c9f5512b4ed8d9273d23684e6c953651c35a4aec9ad9d232fb29ec33f26213e242950131f49b21870cf5d13e943f498db245856e3e20631ef9e438027d07f35b8f216871591b2498410ff4cc5c2a49fd6cf44928ecd20a970d1716e4e060066dbe4465c5475512cac110eaa9ccaee36bcce727f7571b18b702ffcbf630e2d839008d363dbbb8c04113077513cfb21d616b9e8a57975615e217b90194a05f6e20959125dcc43562ac889ef8f15d87f61d35acbce8484a008f1b3addbec08bafcf7c5252c390ea0102a4d8ad9286f1c33b23890c77628a1f1ede59e88e41df705e8c7800435e2a33026f0c481eb8fe318112365407d4361c47c2fbc6afc9ff2a0eab5312528a3a090eb894341c9e9a56c496620f617703bd1dcd92d05b2eafc65caabc42ce362a121fd3c8fbe59c3263abf8dd979c0a25ae772e1bfb55a153566093f4dede7ecceeb347b07d90ffa5c990a1226ef0398666faea318efe3bed2be149e85db476684276718c4247e04f7970af61adecefbf5d971c639af891e5e079eb98e8e3eb27a8d1f540e37fb815a27205661236db8425d2c749e1a7fb1edad2cd9a9ce07ef05633e0be4c8018196f2f738e1f1db99e8a3f21655858e9309016c50007f9f38593bb32b81286d4ee4771a64bbc1b59e259b467a845383acd5d51a285d68e63e56ad0c58c1819459aca1af798c53cf05bf7bbea429fb01759ecf44521394c9f69b1c1edab754c8f752eb80942976c1f2ab15ba9f956d347d036d9fe6b1674dadfdf48c127bb2807d227612c209d8c370eb07c5297abfb93d671c7969004f132f4c01a378483b45fbe74bc9dede740bbc3a04be43c19e2f6baa03f662661e28360803f26592a234abb6c8852f19dbb10db288c75f89ced5494a66da9eb9e44d4bfde85244d64702f1182a9b867d22b0cd8690b37ecc1ea0532650ffcc3a03556e49cb0ebd03d5851b10fa199244231dff624088c4a9f6d8f622b14646a672e4c6fba9ea28bb27e6734922b49398f15d37ec9b6ef7f94916abb4df63e5c802d0ef67289a5d157aab46832c5f281bebba26b1228b94baf9bf8f8240c3088c86c6f089da104c7106f78a3d13aa6918e5811cc74508c82ee0b472d6e55421d64ac22350535c4465ee37cb3d1d062ad3bd5e960ccfd89905b62684f9f063c239536c8f370964f866e7715ad2dde7f03729dfb203a4849d3320dfe406bada3363f2fe0e9de3d9a1928d06932471682d598db0abd0e28bff96ffa41b966c8b162e335c1ffafe241bedbdcaceee3f695c9bfe9381f35cac15b0c38a578a0da2760fbf93f4eabd2d1ed969caa04709f57dc274de1b35120e30cc68825660a31e2a5134f749b2c25fa4273d21a51c7a8aec8987a9780c1a4c69440a37745bf360220bd646fd06a710c3f9be977b793ed9a10a89372cfcbca3175001505b4f2dfdb4dd6c00fdfc623299202b95e1492935e4eef5241c75919cbe1d62ef7d49dcd22beda0da22c26db1a98c3250207254f40e2ca469788abe28e60541c6219357e7cb6058521b352756f68d28c883f70310fd94e01178ca2925848cc952f7b55fe3f5b2e00592b4a3e900032d46d1bbd40262c05a78ba3619e26aed24bc4b681ff97e0515e909e26fbb8270a4c9d97829df39d22f1036834d31a7b06a9a398f6018cca5a04df981a30ebc332ee016527a101bf9f537ac8ef50cb5bdf83d409fb1a96d72608da24b9993687560c33879029266a53b397bd6621856e510280ae19da8dffb1da775a51857979aee9c1b2812f7287873e8fe6b8fb3f95dbb15d233a1f3ed0a818ff671c3a395ffd9f954674800c3af45f2d94b8443dcc1f3104766083b71082aeef22f40e8abab5208af1f79ebcc19fb841b0f3c0ebe5ca636a3edf111e79404ff15cdb62c9cfc5a3d39d76d5f8297a13fc11d8da2e40ddacdb6f4ec0b52bcf098d0b544405b1b243131c23c0d48e9fc7e7c5febaa2a2875a8e5c421045d6dadf5b904944468f5a0fa93a71b5c41dad3fe19fda92723bb4dbd86e4f7f3429e66fb326470daa4d047c3eb23c1abdeb3bf91a16b67e0fe3ec023f76fc99c329c2ba05d75812b313250beb0c05a049c04dd74f9222db0bc29c14a2fddf76a60012114f913498285289cf7f96149c1e66bf8ec66201a80ba7b479d478ac6fe18aeaeb96a692bf36547c78ba32e97f59eb52fdcdc7f1cbfcd9677cb896fac05b718cdd3492336468dac9da2705b63d08ebb5cc8a9e52983358621c5c3ab6701d80e7480fb10966b6a3624d1a1bf94f7862477df7abf62af5965f984398216d8f4930e3c6160c0b9c9bbb771c5306be56a5a10b07973207dbb42afdca03c045241077a37151104085067f980f54cc70544b16187d45231a718018fc8131182f3c429908e426e7b8ead2439d1d4761b4d516dc89a71b6cee25ca89b3083944b19268bb4b51a2c3d49c020d9b1d1592297553a38cca8644e2231983fc526bd7f9a15cb36888f5f08a6a8e21df4c959b1f6b6784d8dbf7479821c47c27917dd804b79cfc96986ec1df61b8bd04d7637ab6b39469a773acce47ac4d34f072c54466c978692a1e3c85a7975f90fbba33cc38b257638f1069cca3b47ca15406fba6af7e8ed127de7f3074331f232fdb18f12a86e29e7f86ed692c710c6ff74e07ee390268572264eb0df42e504801827821136c2c20b0cd670e9e92b5fb730ecf6c6abe183253916875f1c37c40f035befa1050afda8adb3fc28458aa113810f2922229e229f08c299d4a8a8ce0ce1866d1a0dcfe7bb27f21acf24c43033d295ea8fa097b94c83f3816eb19045e6b1b39ea906d251993d53d55480db661563b1ec6b0cb36d03e55a016cdb89292da34e08e179e2eb28818d95ef5b881cd035c3dc559934b9d8bafe4bde69b865cbd9be2ad4ca7fb234274d95a2b7325618d106e54d8b4ee736132f0e0854727c15be2794b37c0414a54d89e60cda5c7189f213a28025646c555f2640759771a6526538db1c2a41c3f95e6e231ec59e6e0c64a3f9d590bd703af29e7546f8c8a4d680e8bc4a756e0557bd719aa0a885a4583d9b1653f6e01fc9e65b225c12333a3709809e431f8327cca9efb862253c64ca2683773eb78eaacfc1c07bbf07cb0b987f0bd82f2ae3ed7ccd3493b4151d7748fb640b8998478008edc8ea9c746ffa54703f235349a9f040e6866b1989113d064d0bafea15a88625ea7d09c923a8940b74944c73bbbdc9ca18a3ce4ca53102436e24a8bdbcbf7e2b9ebe3a9db201bacfee7a7fc532af8e73a1d7f5917f63b52bf9c36cb5da2c5f4c8d90218b390ad98579f7f661c2afc818015eefd707c9386629e8f4147ceef50e4a4a9de77a574980947bd891146c0f88fb6636c1025c3491ad48395fc1104b4f819124354c26347a5b03230cf0c0eaf54269bfbfbc7cf3ec23480a6a9909c1727db3c0392993c332c9efef8565624840dfcdfef80681c5d803009cd2abc50e0d33a5c120ef1b93ae73756945ecc203967f25598a90c845c2049f5fb8da3bb952187946c820faaa7bdd84f24bcf7d6b3cb630d2302aaf334651025875b762363f3f0d896c0fa43bca885c1725411b32619c47927d7cbecd6e16e4bc216bb0c6e8fd85fcbd9786abfa4fad9f0803ec11dada9a971a319c17e5f4266ac96251ee9a30beb28ce8d6cdfbf7c25596a48ed12112499580306b3425989eb52ac3439b96916467af337b6d6831de854af6e81884c80e187b9975ae6ad9cb9779fb310ffe17c9b2efdca7a835cc3532883e36c444b9909910108a65e033abbb7b050431f5ce27049108b97f4a3d8b5efe5e2fdaaf340429b8e4c548468f1bb312b12832c1b8dae39db1a438b51bb4ef492594664aee7e694c278b8a7b77de51fabd9fd938265dd22289ad49c5d340939f9e950a7e0d14473c7448eb6bc8ad2131223cdce37689592259ed4e6dd0e32e8a6344f88928ff66a1f5136c9c4b980693be0de0af7fa5cb0919523d55078a17eb8efe8f6b5b1965d35f5ef237eb8e46e2336cd437c57c892393259f241705b7bee0dca7b7a80cd073ae8aaea5d8a6dc89dde5109be94a2ed11b35b4d8cda6f8d61c055492e92517aaaec534ed527c0fefb482c8a2288de0330d6ea5094ad2838aede9c554859fa0c22623d18fd120166e49ecf970e63a1357ef70a7c830a8ca64cba4009d94639b29e6c95e3925f522bcac6b91b4d5ca75ed383f4dfb5063cb3bef9ca551454c044d29f618100a7ec1a78ab22582ee6472829230fbfde79cd54fbe284d893b5e5e2742b60f43b91528f91a1da137d64a4a9585be30b30e8f77eb1be799d8097a8990c6ec04c9d6f7f1f99e8678cc4f21a26f519aa3c3a16091fb9470f882a95957ef828c85c6415925cdb80b4b08b706e25dfacac1748d2cf3d77f96db445be5aacfd4ca5e755606e2601f042c45787794452f91d7a91bb4f4c5e42861d542b75ec6a10017436a247dcaaffaf751cc0389bbe19a40991c3c33ae166f0617d0ee1a013c49d5c4159f1f068f1456acbf894413f8330b027bc5845d93c84a5666e2943cd39b0f4dca5e87e38cbc53aa5e904d6ef70bb21f0b6b2b3244161b990d808a66826d04eb60f50da8d071d7f47e4a5c3fd2d9f7b4e1e0d8c0bf8a96dd7bf4b0d6c10ec1fd0aa18f524d97939b2749e4be3edd4a603afbd8be4312467102d1c5ef0f2107d514bfe681f5d5b64702bf0d4aa00643d1e13b30512ab8e61400949639ce12063e6dd402666e3ec437a24aae3e864835d4fc6fb38542625f60d5ab26bda6d1806e4b70f85b872819906c3a43f5a23c084962958adfdc1eb9a84ac70d4ad690306ac0c33ca56a76d1bad5bae88feec72256ce13578550e1a6b895ad964073ea0c2d571aced296e48c92e1fb358af3f810656a0da77c47a681eabe1c36069b4c7b0299b0faef33ff828eb1761f7f75e2a9cfe921d882ee73d262050d383335e924e0588ec6265f1b380b7b3957ef0c9ba0af2a51729a0d16484c9263d7c2a8e960707416ace6a1f31450c8263c3531beb2ceade9f05737180cc2723685368ae1302cd054111ad9e82bfb0ac0054c1946e81c720c8f83345d749d29562debdc520d595dff094aecaa3b71307017e3665c50f5044747a4116feeb6af777ac391d60735d04739d6b6ffe42fe970f01aedf0d308d965cd4bcae1083d6b1fe7428e8fe6e6003702571e299da69044f30f6547cc7565be556c517e9680ad87fbd339b48bdd93afa66873ca2f0e3355801d64d7659a050b7704fe37acbb43a237bafa8f573facad95cd93aeb74e850ef383f866db75ea8672014e23d2a1f217e984d2e8c1ccf85dfcd9837ad3143d3931867fd56d91f118d5888c04267a79cc408890d8739bafd490bc3021d5738497ebb59952fb28d18627692b51125a36858dd7f121ba7b8e2533fc70e9959c0188057b24c853c5597cbc484fcc741d16d30d35a69abf55471ec44cef6a7c28e04134105488fa66a503d20253310828d89aedd00137d1c24a6b311603104696dfce1ab0d69729d676acc8613b8c2e718e601debcec66092ee4727784e94355b6701d42de6e0605d90a983c6635a74dd9027bc5f57b969863efc1f6328fbbb1c8f2f1237382bdf13c01b1a68729fddb928b73a23e579b9d60d9f6f6a13348218f7bd20819e9a9293ff7c2489e4a69f98f77b12eea61bb57df466960334794f41589fc96261f28e7cb3c807808f18adf09c4fd3e6dde7500590712400b0d3cdf905a24b1c5bcf9a63134aeb1827d71debd7cc6dab84187c7e3c379847de41a796567144b00893d94b39df68efb733746b0f8028fa83640f158ed8b40bda609cb7f53436cd55f9499a6daf7662cdcad645e721b0813e3f4bdcb57fbeee427ae10ad2e9ac1e852588cc261603e8b984f5e4e94f3e97f9d8b4f6bb44d2b0ff7e9f93468a8612a24f0da13b94874f1a0096eb23763961a99116ce80cd3cd1ffcefc8ca8b33100cdca2f4b0091a4c05800a4a60914debae28d5707451154a325447d4cdfd6eebb9488225ec69cdc962f93b7e1f952ef5c6ae8f8326df8e362d6c1ea2efffd7579681734c23b637824883943b588a757eef5de1181081c07495c7c3ac01092c0baf4d648a54adf7ae347ff9c6359c213b49a81a795f64a14400b5a8fbdca5333b80122195d96709f8c9e3042c2063c8587e3ce9fcd1c3ad0527144b2d99c95cb1966b8c2648c9c11c1a30ad7c5bc46dd168aca9d4527466b2862991613f10fc96b8b225b8bf5a0c941e0a7a47ac3b19fa0f02b888ae93c6afb0729b52c1a3bb038a8daa25b73695d8ca4a960331a65267c0c13ccfa0f234134ae8696bc7846e37c744859718411a7658fecebf6c371d1ba114dc6d7e19e92e2bc772bbcf076fefa78ed5bf916c7431490e0c49801d2eeacf3d8e9f6bbbd2673c7836c4db574eaa25fa0626b82085ebeb8721e98dada40716b49bc47c77ceb46a40c6ed8e575e75c3f96c3fc186e328050d687e57fea9586bdefb1f29b32fba775fd5f7b2bff3f5f109d243b5f45516ea67de051c45719003d14b7940c4f5ae016faeaa00e7d9cf900309370f48f76973a6d41817cee190c4377c18e37639673936e865ca289b498a64f1457e8ad064151e87ddbea0268786fb15624ff1b5027fcedb9a1c7919856653a2fcd76f5286965c6b5c284691e94edbc98fd19cb81d92b1f11f9202464084cd3a645814e0d0568396e02ca72e64709c0fe891678b2a280d78ec435b5e65cf80faf27b67b31ac960098bc9f1539f5ddd76829adc8c84f529230d97a601ff8831dadf23a927826b169b4fa450678ae6876a81b05168381c21ead4a65a8475b657e12fed4eb040ce8e4358621e61cbfd79762478f948c4c98d90867d244b10dd3dd917c844f111f683a39922a2ed0c5665b1f40c17c21c4f5e34d4ec1202892fd68cdc390336fc7635f067121eeff5894d696bb22615b9ba04b08aaae208e70056b5cfb3c7f037176951f0b42719a1871ae12635ec3faa2740cdf1022a6c7597d0d09f243a19b2320c4e4d94d6e1bde4af0e310ec4796b178af415b80ba4780f045db65a3b8484f65556d88be28624466a675d6ed55844afc335a9b6a35c14d5218257b5bdb2bb28f481e5055307a4792da78ebfa5e5bb1b8aa77c55aeb27c515ce57739dd690ed3b77348150467808aeb64dc2252d8a8cd83222b599a173363ae9f40c1a48ec84e93c0009f2acad20fbf9295d03cc597e28ccb27022f861b8e0d895b28d597ead89ad120a269cfcf71567f984c1e29071bd6e4a46f00bf793a16770f899f2c5080287495df92945972b825897c96237b2d42beffe64621e9068ea3d83d6b75930d57d40ea0fc88dd22e5d0571ad8c181ebc05d0ffd8c7aaea29eadd323c57b405ca2c5045ff53aa3b12870b42ad5af5c69376ed4c128213ae66dbd9ec3d4444fad85a7075513bd444e0f8a7250dc0a3741f2b4af687ca3251e9acea3a5687e4748f00a06e4e490e088e40ce20b732a3e7ebeafec9a6711db1fcec9333660171aab313aabd25696dbdc6443e820a5f1ae43a3a9f411b321e0ce47ed072aed688ba36cc6052fc231427974a93e83d91d25ae8d9322abfbec95a875df97fcf56bc679ac7f062584d3f244d6e28bfaaecdd78c8674e88b55c2c97730906c3ed27d1cb97a1566b9f0f00ebdaec9019df914719de311e1a98010012b04db445539417487928dda744d5a72daa1986921f625d0282e94fb8e671d8bcb76380a8d475df23d3d60e7bc83e2361d860be83427592e15864c454eafee81397d5a601ec49a5fb5e79ba18722bdfd556f7978c0afc7bd15d0b01b2c0bea72af2383dafdb9f2729b2d976b71f28e8ba86b8c6e0bac7febf26b6e2550aa2810f2efb39781981ce990dcae355caef5f80f62824cf324f901c8011b404c708997a1ae19864e3f11e050959ec6b15aca471b17fd62a46ea7625f4e1b01cbe02b3a511a185960a715306f3b6658e3fb2fec74a1da54ae2a8132977bcf40759617e3094457ad059f36a2446e1f4745ca015cec3ad6f1af4c7c899d258af398b07c484b9040e249e0ec07d0b7cc1a4a405824a1e440cec3814da7af763aa0c42854161e3979b5d74de5a4449886ff8c36e22859072351901993ca87422fe7ffe4193164b185346dd82b89a2f7ccf60237c3bc52241cf475fa2c073fd639869f07a89406f75bf97f1d6a2726f1f6e065e382f700c4b13977b02e26542bf9608668310175ed9f69ef3004ab41a3994319a9fceb397b3eded87c3942df923a102e913e92d9ade92d6e39c7a95b3de92eb6192d5d3e2a9e81df30a9b807a51a4ee4e89afef2438bd146341b5b0c21b863b821b0a6ef4c36d104ea08f9d294e93059400bc9e9fa5387ec31f9f1b81a21e331fa0b96054e9c554f867dc40223af5cba662018930334467196fa3ff599e0dab1522c9beacf43387b0cc8b34f033627e81439d3f8fa5ee3729c3f57ff6e937d0952150ef75c728b3e6d67bd9843482cf48f9aa1d004c24977b56aa024f7518ec7d283e83ba8f7e511f9c0f50baf1368d791f805f52e6b8822f98d9bf91bee8832ec104233cc007700b6cd8d8852a9efcc9ff5bc8fef8d4041207a7795af176472fb0da6aa9a85f8502b70b41c2fb70ea286a1424e1c84537da386753c3c2a96666c521defd8be2082768e90f1109e677c4c836819cc88d2ae85cf5431a0872ecba05c421d0c3ab473c0e2c0f7c63a9fc55839a70b0b93e8e51c25432ef1032f8eac30e43e3aeb7df872e8a87feb378637f7104746ba3b77e1a6b3304ce5aa88ba42d8532bf064a911589b8eb8436b988a4bcf4174a2066e714d105a6cc8ece993df3a6d91551d858603c853e88fe1ad59cb64540e0ff0cf53da6258c87e5862b8d8edd13fc1e4713fd16f2aba3bbd356af62574d3c0139fc55559a6066d908551a34bbc576e5cb688cbff6acd00cf49cbe1adb5c4397335d40b0071e247c903eacc0e4a68ca3afb62e4c4a650d775fd5e4a4dab5ee27883ddaab2a1c0b5dd7d1998270e37ffed63f220eb1c6d9915a78c5cd2b3954c3bf0bfae030874e8fa17b5bb59c141046e4c724c2e20daef4c82e1306484923990bf7185a4bb8c2ec5595accc2e99605b865ba8dd15e0891b57da8264a71ab3fc267e1a32d2054d1817993d6b596656c65eb635a8cd0c2bd255b381dd6ca1d73753f20b59178cd1bda4d6a612fa15fa6f62419f5ca5947a5f666d32d790e8d60cd064373654ad147a47f401cc37d800311dbbd2ae7dcfddd1f2f8d95de384d6efdefc55e3dfff87a111195be01a1b59166d8016ac40695e8b50e30e34f1ab02338901ae5f101f011bea97f90386dffbef87a6de33b64b6a6db42cdb134d1505cea1aba117bff7927b6d32c4d5720c8182f699c1d3cd073a68e6ceeac122c96d1eff180ece1303b0ed8c254501da78a1c2f1abebf8e9124fe81bfb08c84469c200b715eef0d7ffc7871ef4ead83eaeb961d9602769c104f6d37284f4a7a5a9cf13596bb34fde37151e8df0f21970a3be913f52fcf9fffed0943e4fc59275d2291a87cbf3e71738b359d5b7230754b68a4ce85709ebcdc98f4e6f52e66a02f01daaf1d512a416a375982d138696206c89f31568c8fad663078d804bd53f657de6c7287effff7de84aa063fbb8e646cb808da45d12384e6b84d0adef87febcf70c9891195d08d4e6bf58d1a21ae983a01ff8a0c4b1a59970aa892722f4976139dd51304fd15b291e05178d4a63ac3655845f23bcce9e1ed9eec8026ec74da1fc3cc12fdf59df342160e1829fe90286226758fdf284e4d6e286b1201e2161c1a7534bfee7885062c1960d390de077d0ac3d5895d8b43af33c4287b34e5fa7841ba73722972d566db4d9fd28276ae28c3bef3236fcb4c6c7466057fcbb73ab9b2ff250df546101e259bef6b91b9bf6fe354b45660c5b05c36bf9e78c7a9c7269cd1ffc7648b285d729240b1c183bfe36c9dd348def7b44bceaff1f1b43ba1e94878722fd1744e24097a2bd67a760ecb8f31b1d506085028f63562b716581ccce300ed36f9b87d78498bce9cc63ad17c58cc6da32bda4a63132ea3cec0de5534c770c4facdccfb73f97245a2700929129aa3e774656b18ce47f44f5ab4a89ca086265493e1f45abdce1cb727cbdfe9dcf90da5484788a7b330c3d97d01c7bb8d4e051b6a87159079599b4f04b15e7f08ca4bc7cb2128d018c2ef5ddf4517ae5f35f05bfee049eff138a9bb8a717997c62ceb77d91cb9b1f517c0a5aee084af9f7e22b586e210597d33a5d392217f97e95cbf30337dba09ff5555631668a87ece94740ed49f475b82647209a400fba51baa9e12efa475ad5a456359be11f2f9e7180a61dc9943d5ca236b5f9b4cbf7fae8be445cb1d189c310ae8275e6b24696d1ba5a9b2c12ea22bb10d80438bc79af361c4066492b3d4ee12ae3b1d03dad55f78803a395e30573ccaa678c54cc6aa92cceb5d90d5a90d4063f7794f3d111c8a413178bbe4bdec5937e668268f2b3dc8fd5065313795b6a25167e3aec9de7c9bd1d1b10b817bc2c34c375fc71f479d3051bf6b562e013f9b0f99c2f67a2278e4cb75a7d2be0c2075fc8b5f33857a54ff423922f4acd89f8ce79e3ba4fdceed7719ab91fc361b647b79dd671175dac08b2e50f0968619bac5659c591e35c8f6d3e9a935b8ab8d5d82e0f57bdf9fef91b9fd6c0ed88a20571c619c9e5eaeb955db03e94eb2b1a435876d38f8f767c4d0366ffe8963e8154ab042fc94f4001a5397150b12e169d154930ca42980c41945b31025369fc40b839c275517cf4268e84104cbb83a5e85478d22181537209e56d0d37fe4af4d162ae371aaf6f63991f8233d77dd2a9d2d66c9391cf7f2af6f972b82237780303ff0acd31be0bd5eb1f37711868d430f000d4a338330d917ddbc8f059abdb0581005e13fb645f1af29088ddb3457d2259898c1fc54c83b94bf2faeec7ccb34f40df3511c88549703c0b361a7b0c3261dadd19f960e093f01abc235983152a9e14ca00e06d9cd19220170d90b8fad7e87b68a6b64611dce2ecf05d54ad871dd4684cb57330e5c0a8b0350e1610fbc593125a338fe97949ab427fb3ae97f33d08e12e4d3b74302481691c06fdd3ef1ea631b3cd7ad9ea1dc2689081e4f609959359d9c5c4ce268ec23f967cb2ef53af6f9d04029f05f7fda2d4a22646cc26cdafe5c0892012fa0a6753407fd671c1a59d73890f6481300c04121e5ab354448bb34d9870c1dc3d69c75abe124010becf4b456b444d0921ce64463ab12e933c971a930ccfa1678c86b9f7ed2eec857214f463b43989008a5c165b0c24cdfeb7e1860990b7135fb8319a7ccfd9a1104ff3ad6b5d1aa3ad51a734781d1e33dfa5cdd0bdbee9b26999a3f776fac94cd39ae19914e0aaa0744eb422e9b98d84ad5fc7b47da148c88926c916331a1d51c616352cd4111ba3f3d77949347b844432210af0d53efeb1ffa78d30b3820a08ec9913c171207c56a86a4e3ff364a4e8774fcb1c30c85fcab65f4ee540469e1e85b4f03a167940cb6099cbcd566e6197dd6f7110bf087ba164479c5fc203fd6c4661836b4dec8808a7597d8ccd43dc086d3c0fc87885546b21b1c58df4b1409267f82b4c196d93924b4bc5885fcd17d97b2b751791fe64fa21c1044c9b905737769917efcaf510a2b257a2ed5d197f536a009bebfd82c5a3c754fa5f365daf2a075875d92c9df63dad3f2c8dd977803a46c7363eb45dffeeedd59bd2fab8dea7a949aec59f3fcdb58610d1ea35957e249b3ffcf39491e4cf50b9fcb75815cfa3a6d7b6eebfc61e8b226b054f1347bff07d3c681fda6709ebb1f54b5a2eaa087c7a48ae7bacdd8a6012b8e866ad8e25b5d271d11a369462582a686938b79162ca33b8581242c40f8e623d274b6b030808daddf556787808c28148457a3f4195d5bdd4c60d8ab9d2add4fb49c1d5ee8630813ddd8d4ccac2bcb5d479db2f8d0756acac1e4b84db705d3fc54d0f78c16d343ea84d8e4f6dbfe64bd6ef6982dc2814e19dea1e8b442784e86bccf37118343ae302e95a26005381d43b4846e5873e1c815c18f456270f1c5ea4fb9601d01bffe4718745561397f3e132f14df213d42bae99ed8b13c4bea4fdbe026ab82c345d19429aaae2c00f78dafa8a9799486c4faf4f487c91b1f4f0de324b9f580989d0631f4f74cf6d63f9dd727a94a94db30029a06770f11be353ff5e71d3635d47592fdfb1bed6d1cb940eebca73c01c0ae17d7b9b803c7f9ed8b1e333aa6deb53a72b804843a31d10fb74375d378843ede6186da44ee83be5e8de78db31e58a1180f0f7957d4e21e9c7e5ef046f6e2bb291205ca674ea22915aa36ce9faf73a856b63e010be1d8e9f5924f6668d2f144c3f3f35614dc808101c0793877b3f53a7f8b96c29d2c7281f45450c27a3b6f62ff30bc51d3667f1aaccd18179dabeff0746117c47247a905a4b564c4bd5d1e5cfd2b9667fe657498026ac77dfc22df02398351d82f4982f7741a6fc9fc790bd3116b210c020d7941f7404a4733e950453dd04a8e9bbe48f3c2eb3ed7def4be2f172fc69eb551431ab0e9b530c4eefa7b5d5e42f7f26c7973f3eee7dd5c65becfe7387d9b2ee3f6fa907d19c2df3ec01401debfecb1d266eec8283ab30401d17d462a667df3e920ffe9af30e2259ed8967a65921988c96850e4786da3f083449086d50c02b9593441bb72ba7c1b66455dfeecaa1c79f021e3ec84c1b580d928a2e3901fcc05c2f43eca28fbc12c3c8a33a0ab94ea3e53f52e270c024494b9010c2fc945c5e11b3641c7112420be99459fdc2cc9fdb7336bd5e13882d6c2954819a04a05861710c4eef55992a978acbef0e040a0408c836dbdbe4061a366c36fc6068e8bfd9c7ec889af00e72a81109b0482ccf257b660ee7b5d20f85fa8abc3333ad29e1a70f8d2221f6989fed0a4951e3d663374e388ce0dff6fe171507e53cf8a8fd3c85db761ed251fb599d7d7515a657a0e2400f20497fe7f51fbd8ff9b1b8c67c145738ca58c57b2cf38506a243370a3c71fa9d5637a337855a8b78cf610613c94c419447526ffe84d9226c102d2f29daba57a780f1831d10264baac003bf984b3f47f18e37c37cd455781d7b3a6de687af9dcf18ba8086f1228f9c49dd73818793ff97715ba3dc67693fde399a8c6f0ba498ba420cf2420135214cfdd89011f710fdd80af0f288f4061b62dd24175967fc9045203f01e7ef298092ee97d64b8db07fbc335acde38ea0e201f83185a3efa0d87aece6dc907365070ee5dc5e0e7c5034e9fea5a804ef7eece687d6f088e7adee2275b2b888bcf0d510b3ca98d550fcfb7811306d8c9bacdbe6109c66355965bcf819a678996009a8e8a10b41176a1e368bbef54ff0a128b2e8c2d4a52b31243704101d71beac519ac3f10aead0e9ec6a5e4550fad8c54151f35e5e4b5bba53fcb20abc57c413a2607db266d6b5be8511dd1ee54bf7c83313acfa2c606305f0c701fafd50b58188ffbe11c71f50875c5e9201f520aa7f0b6a9dada402fbf6dc3548b15317fed91cbea69c8fa3a1f426e206c5bbb3f7506002824bbc2b834f28bbbc6689fedb14d6e14ecafa532d10b8f328a1cecb28402affe93b5664f5302a76bd085d124d656b6ccab8b85d1ba21c287d68a1284777de096be4ca8f89e98e4ed65404f5293f966d179300708f97c7c2ab961d5e1202afb389445add2318ae66b554b8d91332a782e4e49e6a473fb79e8466b34e16d8f3e4864a31e53b98840a65cb50c01c8030c7952966618d8a530cfbeb29764056f2c168efc00774512338169e582347617ba91bebdf60ac71b8371066e1b3f5573d3c5df5641f25b57fcd4b572f8a5a9c9b5fcc57ba58778653173d5fdf71aa87e8a8e7e8a4baa0002246c176efbc41d425ba12db094b8e64c706865931268c3330fad6effc93ae9e662d2b99ce5b51c1fa265005f25f15346528ba902fd30a0e3066b24608d677a850a14373b904e1c38412ac7fe332266b245e166301a26db75baff4a675aacfea15b9c64cb9add13b2ceb5b588cb3e7732a8546d53321002a384013319da24ae808d02b761033a6ee1fc57d430c54b4a0f8689c344e9ee9e5a383a832c54ae5e65dab3a16fc56f200970aef5687587c055e35a41d4af49dca9425950c7b03fa04eb8a665c34c1802e257ef3df5b002ee01a709584ce6e7c230ddade4691b50622da9d0f65cb4bcaba29b902a2da60eae7a467a9e71ce51632795416d279872e267b26bbe98396b9ea6760459fe23eb1af443f024f4b47fa5a0b4ec2766ba9e5ac8701ab033b536335917aa21024947d324c04057eb812753f8b77fcb0b0d490cbdd5c487ff0c1b916fb1620e4d6353873bc7775b755626f827352dd3dfcca7057d05e3db356f8519708239e63ed51035742498451878dc444eccd3ab5775b6450cda8742de5f380548f5e769fdab294ab3b4356fd91fbf0a8bc10c2e7ad3e2e55c92156d046af0571d9da3b28d460074e35478c0df8d7902e12012f8c61454b8399232538206deefedf20b0ef564a4eb504bc379ff4fbf80e38d5fd03f37a8cfc3b853f7546c879aaa6d21c99c9962555dddca49cb2715cc86f28fc868ee023dfc724bc89f075d7af1d81ee88bf4fada419e2e6c016fcc5073369c186f4427417e150e2879c86112c13f61bcb9a97368832af2a9e06f182ad3556bd93b434f03e8bc507dd231d7d56de8a0de4474318f9b7a613ddb4357ee4b37be0333d0f2c8d747ec185dfe7f69b9084d5b6b53910b01a74caedcddf79bffd3f035cb1d900a38739d7f45b29e9f7418fa07353f7a3ff07025d3fbdba2621b6c7fa0569e0a74292fa6d792af2b25f804176651387b73b181ef324aae94168a8f4f81d318f06f9ffd617de22821bd28d1b9017c6e7bdf0ececfbf18fdfd7bcffaf2bbadb522714c3d67e7aa12bd20299c20507abc7e2867ca6b39d0c253ab94ad8ccc02688fc7a887f802fe5f5a8c284a3be640362fa8af2c55a9ab38e923c4246603c39521a751d04930b043ad947b5022617dd64ffd8982c3dc153abce2937d5c544994cd69a2d54302e69e97a99e9f42ee2003dee33c67545c6b4e57b6284fff0344c7dea9bad1f014b335d7d39e2a240b6183e17dc9a0db7c17ba5cdfce15eb1f0733d059251e390353211db06071e909907af6ffec9e52e02eba2def6e40e340cdd5cf4dbdb1aa9c3c257cb22930936376b16ef0507963a54570e8f02c7e0525e83430889f33ecfb024ac44cca9937a9bb746a8ccf279e5d7f748d8558a774aa7e3f2803f86b0715d49345fb36724d06de20f8b0606a18451c662bd35601dce441b86ef1907022ae11a7c87341f62d063e5dfd6be5dd1225101f5412d340003248945c9fb9df7fa265e84679e600a1abb15c0dfbf45c050331f43675d8ba296ff00530754fe991a46137c216298df5706588bfa80fb779ba20a3f1f94c14f5832e6ee1afe190a1708c773796878f9cfd4b5a6f6ef531a31ce784f5d531c9ae1cee7c6b611d17f328e69953199c48cf902f5a206865b5ebff55090c66710084e8f0372f80c51419a77d12b388c00cc840428809a6b83050a2a660e3e5367badc8572db4ee333beeedb0139d72e103c9d9a03ed7bbdca9d9a06f9a17d4eb714cee7ed62df778772e8a81896454a1cc8f58c34e3fb74a60b19691bbfa238691c624279862ce434b8ac9e786734e2fcdd8acfc085860cf992eef37b5def6085accdf6f284a824984cfa1600ea710114949735afee0951e9fde04f09761c5a8a6e9064ab8f69bbeebecc5ceb070af858e9837c0747e4511542e21cdfc99556051ac94fa44ec01cb2e14b5641e5e33a229dc858246dce5339f74ec46d44a5e1dc8b45cb5b51e075c6b40d395126c5883bb87a4c62cb13c2b7d9a25a47afd0de4122c6d15cb4578539fa51a43f1cf6721c770f8fa4e41db134df9fd1af59a4b74cadc5c3420aadf2e02024780ddd1e320a1af632b002aac3635e75000feaf41b5758cf62eba81783bb7a3dae55af842964ef46d1747390d3f1c80e774e42f53fc760e7da7f097fc231942e06a91deaa8b8d18316e7d610a1aa27a73a58cd04381e30222c033c3205769b4be4de8545371a9fc4b2626b4b165fa08a7d0262ef024a1724e06077f1b54c6c4ee5dd9dc6f3e6a22b17df717326f689cd014fbf1e14800f14e1d4b04225288265d303ad3a167951599b43ae2d0b0a111cbebefd654926a4774eec0d3b97288167f6bb27e0b96a0f82faa8b2e13d0d4b8301b16aada9478cb8539d3da5797ecd60206f6295dac05a809b266ee39965116d346fc8aa4e2ea0964d18336412a14d1fefc763590d972acfd70e39900602942324b7ffb2142a1abc461dd50717125d06b953373f88bb64c6f72c4d5ba14a740d68733a11c9a22f386979ceeed2653c5d5b13b61b8fb3c67560a0a187b443e4fe5aadf7dd9dac47390c4437569894e779df2b5a7f57d6a4ba449ffd8ac9438e11fd3c88bd327378b4dc410fd3c2358455f1a9bec3241dae84b3ad5b6e847c370b47fe2d82feb88387887595ed99bbc1ce21dea7b189e98eee403315b48fdc1dbbeae94f72c9cce4d8a6bcf420c57bcc13265fdc9ab4954f52aedab343de063298f3ae6d2cdfb5ddba3ea6e27dfbc07cd807f2f2b817e6cea1f9be30dc53ed779730973c903925c69df96ee75ad45c9e01bebddd27b72995eaf50f70be3c6eaa85dfaa490ec1aed418531475c64231c2eb5fbb9b070da55a27191703502c632eff3fb6e8fdea0fbd0866568105b609b9806587af021b0e1f2f827354369587d78b5e7a7db95e2146887f4d4ce1022c670f269a2abead3b17199fbaf0ceed703e06d6e56891d6ab642782e7708917fc252d0aa663a8c3e63d8b5deb91f1b548e56c0aa7192e82826544aba0bc698e10cb4e9d1c0eaf9bbdea40ceef248bf896f25b40c7fa8b762d7572d197f4ee686e018bbd064f29f2dbffa32ed90726d183e05cfd02a84767336a1fd7c23663815093f2ead7620cb68f0760f0c2d736c9fa79322dd66f5068770fd7eaff4da3a96c887ab32f2d00454efd616e464a4f3518491fc0c24d2dbe0acca9aed5fdec2becd6910dde915dd61956685374929a46573a2dc0beeb81cf90f799a1adcd1324f547d5650978a904bc17270f8dfe584f6d3e8c67a959eb2ab7b952bab14511e45922a05547d128d1ec686145c53c3ddeea28a36bf219e18a95800f6231f833e113c0c832e21bd480e6a906eae3cfa060f8831e3856be25caacc7f8e24f9d68a18cc001d85722fa9463ac83eb58945d778c474bc1713df6a0b7a00877ca660ce3842b31f2540288ecd9f263d6d4c5d7739a968edb4aa81f7b945079434c09050ccfb2052492239d0e509590c731dc1ed1596780c94cbce128954f3ed4b5f2f16a280d1c5a0ed3ef01dd9ca46cd0d9930076c4a36f95d15e4734f7473e9918935b63e9529d79562f4fd9876127d95bb6c3400fa97d2b756856e6ca37a645c25da54aa1d785afad3c78f5763e4af2e1b038c02e3e62dfa549d230206f6db499367703bd96645701b1b82f2dfbb5fedad839168767f3ccde49841f8d901be51c2369ffc9b86a7b57b58ea47aae7996c80ac16beb51ec75a8fbe390a5f1d566c03947540a3ab66f7c0578ab3c5cb3d1b599cdc572d6e425665c1122b3cb52f82073c679d6f8ba987c3c56c3aa3d9258e10eb988f595fadaf7a8fb714486cc032fb53824922ec3d72f13613dec139e19c86297f5b1b80066a3e7c6b3d875ce6bdd0a5e4f59512ae4fb5a830971e8ac84609f2ebb0a9ac0c1dfd7d7e475497d42c11a7040ecb5b9e4f9087bcdf643fadce4ed61e6c17aca59ea785bd7f4f6f9dc3eb675bda3269cbffc212d62b0920a4a947815ba31b22a7068032609208024fd1420b86fe928dcfc91cdd7b306f70a6c75397da793aa2eb240ac0499aaba8ed640acf6ca08ba70110fda1c68839b2796014ca340555d0ea0bff51a555d06b2453cecfd1c3fe040457be16ebc0d967fcd158437846a4e39a6d094294b018a2e3ac7d59e105ce86035f05c938f245ee1d730298cdbd17c55a4213fa39ea93efaaf8e0212750ebd525b97b5eb24dbaee862cc7de73d9020c85bc78cacd74e6aaf500ccbb657a9aeeee9819824ef74f6558fb850570dba49f38a33510ed58d40eb5ed181a347e8815abf4e7caf5707b9257554d49f0f950c76b047664e448687285da13d0eb8850b5fde767208872ab4b66770be68a5594929f497c64a65d2658f007b70c17ad8e28ca3949400a8b369b57b595bd78a5a56e12c58fe22ab7b8a15bfbc2cb33c4fc03beb67cf206bd86809d09b7d98e669c3eb26ba485f8d5f794d0046fc360aa4bfab02a50c129b7b390b56414eea376526659e01b9f1b923965c25b1404c98bec2b654576aa70b30214b4c6070acb71ff7e8dbf145b0a912a829940c6ce1cb2e8da003060d50118ba6de5946039661342c445000c91f4bdaa7a343befae0498e685e8c4be658eea3c939322d3177452eb0c1c2b39a13045d07f336216b33435c79aba815469009191840ffb406c6fb583434b3643d5d921c4fc5408de8e16430590a4e6681532cc1690ca642ddfc79104b053e859b4645a9f9a1fe4b27c7f07532d8588b512e0124326405eecd1c5377b22619c6e24f29877f6f36a0fcac1a7a3f8eca614067a55ef421497d32506443d5b1052f479eb164e908172796206286dd576049671a6ace25607663c262a0a2c06cc0246b4a1853f26e53f00c5ee4e3cbf2940560545c9ffdfb9c60f2daa22d0b2ac7977676e6ce159411b00147a51a42c7f7b4c9e12cb0109921cac212b9ccabb2e7b10e17f570e5f2b2d95a9e511a246461eea60dd847b70645d1eb8536d01bc0816dfbe3317f74785ced5409624fbd81c53c49520c4f0ac13555498f97c38c1eeea51ebd20fb2c126875911478662a22565d50071a8b85e560781b0b50a49783212c8c65af3650693129bafbab400a3790e71d65a16d62a00cb3e64cc0b36f22d665a666f73e28f8accc080cb490b026795f3ac4a49995f6f364a2c1c8e4d2ab97c1d2faf12f4ab92d8e6b6e35e2512f70c67ea236a05c55a67ce2e34ba708f324a21ef50609567d910cf2d0079b6418a758138f755a1e848d198b9c1a763f244436aa7305272fc5a708df17fd982ea707dc08045b9a2cbbf2a8a9f3adad3bae3046e42ac0654b468366e2e88943cf33a363f29e51c17639f5cfecd9916623415abfc58928428978cfcdffac16600477796885a2e3eb75ede17cbd1ee4d2923df5be3e94dea46e47261ff987827c74050368e6acd15aeaf17b8301f60905ecbf50274d27dcfd40cec0fd189d9ec6fbc1c61d593ca8701bc32de304eea365189ad683195fb42b7c62562c4391b33eb960df11aacd957d11955671a741af1fcd1834ba832506110a51453387c7d68f049905550120684db6093fc2e376ab92726e944272f92c54ed9f108de09ee8b8fc8762bb926c04e459b476d88fb4b9304216b5c2f738def7589368849250026f14ba30e2073c2b83d8f75f702318a42ee8aff18fc6306c6f73e39f63671bdba214045c8c508936db83d8ef349b7b12aff222a08295618f1222b40a2f30b3626fb3930ec2c8445f902d689761d7b71bf445006e3c723c1a40a505198e6285807898478a5d12763015ba061bea3341ab38faf0fabc9b8b1232c2ac4c5a37da047491907e910ff3d82c66e3320283ade7b87a0fe48aca078952b4af222fa48e8a59577c7a9d49e0a814ea0b82d1db792e2a218c9a7dd92f69d556eac2a221d430443c53dfb9e766a07821edd4bb66400be005511986dc2ded50aa9fa4f5a4c466ed5ab0ae34a944f40a6c06d4862b848df4b893deabd4920a8f9a0dd99345a665923bf33790b35ce07b64b2e8f3f6d2aba5f7e75345fec4630164643cdc5f41fdbfeef62384947023cc67375febb2cc75e5c83c21424a5fe24a15b511f98f2981306628ee197baf77d7830c298e7df2744913a80056b9d040aff9af96896fdaa437b7bb82f64e0ce61aa06c4b6634c180a6b0da2d68caf2c1e633ee9cf704655f48721eaf962494d7cae0e7fe1cb00eb4d298c873bc6d761568e661fee4fa06638fc86d5cf25a607ed1d53a40109cfad398325e70afdc48ce9bbb6f093890f3967cc2f6d9b111b4689651dc209879d00e4e68538da47a9f067d0a11f1a0ea353cb93a4d182e363d673b0d3a59ef13ec08ab6c4898f8496a8a09f49e9cb728284b1844df4629c47d09c90991d20069dedf75f889fba4704c0963e27c7f9a4f6a7d06162dc6ac10cbc07f4fd0e0200f34cf26bc24d782d0a026e0e30e8445e9390da239ff4f00486f162c45b86da762ba40fa36896bd03b190a50a06b04d0a05ecc379014f4937e6c98429938084b45ef3bd2efe03d19879148692429ee40dc9bb4e476511231e930bf054e5474032daef52d61adde609f9a84973890783277862188dbb69a8613969f551f6228e2714fdc8df000ec92a988d1882d865c8ccf1ec69b034d2cef704ec510890e845d099d999060f0e96b5a10e88d556060745c338533eb7d0b838116e555818cf009735b56cbaa26ee2cf2b4a897de93cbdb0d1453af75f5abd20e2619e15369dee064b555ea1113a1e28c6e516ef465823c781c9b073600539376c9db1a829b1b0e4db98fea241a1d81857194f9f0e6e52a1b9b09c49f46c8b08623865ac8042a58eb62ad996032f86fa38c95a5951aaa39674f83f82cdae16468429e2c3282c63ddac98c38666b076d704dcb4bb72bbdaed64356a8c56000b5453fc80ad84021dea26fbc9483b0bbb0f993408918de67402877a453224672508dd36972c00a78adb2004df56ecef3139d80ea9c2c4099563738dc152b7eede3413f938d53a7c22acd1db359070d4795498c8cb2330a5ae21e56ec9d6d66dc590ff49c0441879826cdf5d3f5d89c8e8710f178e135bc1ac8cb24de7fd23d350c2eda84b01a6214a746efcf0dae462686219c3805ff66494ec4d69cfeb7e608d87619f9f3d5ccbf019e5d228c6a1d9a15d902b60dd4a6d72ebd7a0c0eb6710e5ab013f0613faa090afa930898c25cc09528b44030d2af60de0c8834a51370f849cfded966dbaa61bf04d1b1d4fe485f1122b3e6252513bddbbc5a3b5264c759a49941f7d7e214586ca401cc9d4d4dd1bfaaf32350fc6486bb0d22d0e8851afa22dcd0dba8f3d0aa60190169b0980216f34252187a5bad08b7b19e2a2f8e59233f69cdbe925a2e8bbfa635071575e30fffd6d2ad0dfc864ee86d9bb14513cc8202aaad7f82120d525b00626a906b7d852c41a6df1c17bf1073e109232e30f3db957d7e7566b7de694d0c673754298e8765a9d97976f44cb0773e0566740a1e0489d405219a1ba19fc5cc9f8abef8b7423862d2779b8e9abb19b109dec7b5079a253609afbbaba7879a03da8612221f0c8a2c4c3d204cc7ab3a8f1965374388a9f7a94c1f2cf022b3fb5cff8c0a35d7ff0a51d2f902a295714621d819aa7fa60c1ed787dea6ccb3961541a26769039be9e9ee6b7c0f1469ed8030f9d64f63094c4ef0502b20f1fa9c513e65e66829b1e7936b18e9eb9f7c180c80b025c96d49c22feae016a16650a5b099f2c0ce4db4bf5b86c97467cd37345403060825cd333909978d93e57a066ad6899acd09c5c517565202812342cda186889f80391cd41a0799d657388749462d9ce25138161b505fee4938ba17770d04c3b689eecd51159dc0c02d0962a71e14e0426f04eef5ff5b22d4d1cb5546b1a58b26c0e2c2b5bfdbe0992c51cbd7767600fbad66e6c5dd182681fe9c613d68f31fc00bb00b39c681e411b2396d125b852c2e0adc29c04541354499feedd46329229b3ffd412ebc37646075fae66368eba2e237ba646c61e11b8e14e1fcf9abb1495bb614d1d45390ae4414ccc2c991e6b0a1c6fc20eb4e2c3dce8db1998ceeb607321183e4ddab3ec49bd2e94de4965f43aa0de3b6eb7632f8ec3d8ccfeaa33a502f7a015d0b79681ca9caaba5ad6d182d27101bf14b5b0786cca9a3ba025ef9e5ff4df7598d0462ed92cd46a0bab22793148cca27b85b1ccb470b05261f0c3a39c4406de6fef7f6386116ff5b0b5b56b752fc8ef18194ec4d799fcd0c0c6f61ba22ebb374a01783dee533df1095cb6e91d775bf1442c8ad7ac447768f39eafd2058ab8e91e2604e0bf82e4405b386e92bff7bbc11f1dcfeccb2ba3470ee5fb8b9ef2f550dec104b991c325075686ae4284589c69a07ff948f9d9e4ca544022a7f6279ccb2ed352ad4bae9e6e65e9bf34e6de1941209e93bd3507acfdab285d961d473b7b16d9d76fa0a5adb04373962582c83098551d512a6baddfd23ea4181e401647b799c38dbb9604072d617edb9601cd7bfb6dc912f96f8f19de6a01e4f61806d986737a7983be290e3b417a45dbabc81dd355f38084812ee0e2fb66159fa67aa63efbbf157044ea181062b9a85d29d26de6301ede0d1c096a9ac16141850e834bc6905c6ce17e12c0096a28514463fc576be070ac037da5e30454d24369620b5dbd3b4ed6829d3060bd02b5a9fbe10b18e49eb926d1f2f6cbc714cf49c2a0046c6da30713d62f44dd7d71e53bd98a6a86e1f446c325bcbe1290d598476aa1a3426b62a7e248559bfa573d03268f9d2a8fda8138efdf7b7276ec25a51ed1567265414af8631dca963e38631e93df9e6a5be373a672760ac6cc6d5f30662dd7de7dc7a75784fc02bb9fb157bc3b76d9027bdd5e195905163149d795bbe36538c00287f67406191a462c6db3b3d62740d181fb6a7697ddce33c50bbe574df0c624085791db6a8fc3a482f651fb613f562eae59d23f3dab0dd2cca8ceae4cdfead67e6bd9b05a2c82b832e1bfd75c1cad825e7d2550b274276740889b18e5819529a98047cf3e73cced1232151afda058c6cfe5bdbcd6a230c3ec0a63b332769a30124806b1ab73b7945091b308a3c8c7c452a6ee2526d2d1d043518282cd1dece5b1a778d978ae3a1eab2b96352fb124704ff7a6e20f3da9a1a6123f4e984d33e9517949eb17da46825c5a83e4215446dae239a015512a7851632a3a202f0ea8f8b186f4356c6bfbdd05a87e0e67e78f713334998990ddedf2000d18093088372202e96f22ce482ac68c11d239c5076952be9548dfe642824905b24ceb58d49995ae0214b655630b44473c0db8b6f4f15160d936cb6179b43ddf380acaef00875f0de106c747a3c88d419fba00135e3dd579a71346f4ce33cc2d7a9dc1f1c88d2d585d74a98a63945003fc6f9ff471db7ca582098327f2217c099843bf4ad2f82e12542fd4b2900289a3aadf1e81c745db4f50aea27a196057d68c0e7d450f4ff72a460a512ca60a06bfbb4ebfd1d844c5a9c1c5180177d86d40efd6ffdb47310cd96230babd22ba62e5fcb879e39193a1abfafbab906f6b0c14fe2ed9f2f15e76bd84d2e078da2b61cb13023e941725d6ca63446eb370ef99098d3ebc9c6b2e5605a3aa24434ba202be22bfc9c10ab01f110e0c7dec7ee0673a087703cda24e68b33df6592c62b3aa55013a49306423b269b8db14ea2ed051c839ac3c5b57bd01d717cc04aadee10dd53e30040728e723185b9bc9c9b813fca7b9d8f0e06b665d1add0390f369e31f0034e6b7f93746407abddd81e54e05c8167e6ee2c21a5751680d6d64ce0925647a50ae00c9434c80bc34224273bd40722b3680fe26ed73a990f20bdfadd20612340a0f8dec82262bdd910175c53c457f4534a14351a4134c213965c8c5fbe9e776fc1abb9c9072af9616d2e934928cc6b4d46ce86f6bfeeeaf059e3c6c67b726f3ec960a74dea364ef2e607e276bc10512b6add49da43e47de84f6a1686cae93442a740109a251e70463d79bff20f6a8eb31238b7ad0fcb0f425a1bcbe6a83e1afd11173e365ab8b9191c1b70eb3fb979fe8a4f0c959993c44e68789a89f52b2bd3cf4d5a19bf85575a9c97f5f66adcdd24416185ee936c340738f68e3b4cf3b06ffa69a74a4d62b966b18387311fb786d6361b53a2d4ecb7e759011afa0b6ee86103548f48017d5d3028df992e21bd264b033edbb0a1f2f70f6323eca4a85fc15e5fac1d3d047fc5e762490255ebd8c0683976a6f2e6451325d6e08bbb8340a3cb871b26693c6796e268d926e5d54fa1a8ed277989e1fd86b892e152a106b2d6417e4566540040ab1ed099818015dcee788d7ffa55610d63a31507e66397adddcc35d9f9a82ba9ba4b5b1e0731d63fb1126b521fa7d758c329226f029ef6df9ea5ef787b25ffd3843cebec7b7111714e06501f4740d5ca2e61a24ea7f7b42d9ea8b1b38a8e001d706326a6015e3dd6f77604c0a19c532661406c4905a5cd5d616c483c7d1363dcbc505463f97652e08ba17326a1e807e3055e7b2d1ec775d54f668799a9523cdf8d2590f9bfeea4de6c2cf8c3a17334da1891d57a9c42d8185e425343f41a0ba3b98ab9a4d003e5d0a4f0109c5f04c6dc48a289cd85078539ef429297428f5061c65325528335a7b20c867f0ff38dc455b583bf1f4d83815e2a96eb34c966af1677e36d9bd6dc5ffa9314df9a1c9e5963ff85f431f4734ce22d3a8be55e9ac810016573ac31dee82810be687d8c0d45d439ff32c7eee9c34a55f6f20d116701b08a3d48aa2b99feb410a90abcfb328ee655b6f6f2de5335e95069c10613c8bdd392d08e77f629cf6d068b19e4146e5d443b48153285d633f9d1f1484c2dc75e62c4923b74f392afe401f215d81d285dc9aa5b8bfb6f43eb2633613a4539e1e5dccab933bd410f11c14853c60d2f73537a9821d230d7ea0c52f75ec64ce11d51cd4f19a5509c462d18f153d5a56a8f9d867827d80eceb02e7d439177a5d3071049762228f7d6d6af60f1ed7b4829a2d053e1e683cb2ba12ab57227f894ead70204618ebe08d246c52d11cb70f15e698302ef7b87ce31c5aad0a9090aad6589160caaceb93e8299f27e5715459967f98e577a20052c2bc96f5e5a4df606b05dbe961d90a68a71a55c31d8903d489d7078f8a9c683ed70d4352430478fc095c57ef58fb322560a1501ad71b809046a763b8c70a43cb983ff2a7a1415c6b07e991cbbc1a7445e0798aa6859735428ef049363016f4d988105cd61e3c9908c4676badc587b6bd1a26105057fdbd1e699b9a9b1f2b12c526c2ee279ca7dacaa990049e7ad63f0c53a9914b010164382c2f9687fef7b7af337077beb9d640a1c9d9cade1a972b1ab129efcb9fc912a52078d03f98cf330c7afb64cadfab2b93477788b52f3184fdb6bb6f712f86982c7c1eb2803a4362f3cd218e2a7ee80c7633ddb64b087092351ae700b38b5465a057e2e8efdddfd47a2e367af903a313d9a8df4dfe203169e7c0df1f881c4ad6ffe63d2a1610ab2b147b47bb9af58d3deac4771d64a9eb6e89e0b2cf20e683958653a18e49dcd69c16b36cd39034700d28eae67b15f05356c3f3d701ba69e71bbd9ce66395f1915f92039c0135790dcd492719bde78cfaecde9c6a93803e4116c52c67bae250e605796c7b9cb141cdbb8c85aea434e8388f9a84357182de00297eb62e88917fe1b4b5bab71fd839918ef48d6022a5cecbb706b92b56e1c9fbe49b9405a88a2584340c594bdc492908ba41e7479c479df6d3f6b75ff88a4b86ea6976868d66378587596ce93faa25c66a837795c27511c4cb3f6fde6091614f4cd567bab274c4993448de70f80044f008c76ce7174d4f85625fb4dea6f5b45a28eee96122f2d3fcc4ab02663687036bc3d9608e9ccbdb0773dade8cf4e911884d9f1572870cb913caa319ab42c45804a468414f3d40113d1bb04950bbe93bf4ad809274c76ca502b3c0e5db2172b3e172e239b5d163c60f578dd934100b62fbf009bc3d78bb31b4673d7213a46da687271ecac2d04d388653094dad14c81c147f4a49ee060f38b5173b4128b3474eb3a81bfb1f5846c48801ac068f0e3225a38184c1cba33f91a0a09c61160974ed849622312589a5c7da85de78be4768e1363ed1fe5218a26ba0905f6dd7fc7b111f050e9408adf80bd00f8deafae2bac60f19ea04b664fdfd9a24b9ffeadb0ce78db4a043b8f05a8f178adb10ba2232e30bd5d7cd80999be2cdb89ae1b18450a5a40a13373c2f232e3774c9166dca8eeff625504c8d4d5458d2da0db043a5cb190829cf5d090b3a5262a181075bd071610f1a3febc70b38e6858714508a25c712b8ca430709e191e5605c79c82abe3f5dcd156b99dfd7c53c0da886e979373e141cf8977ef2fd280df6c977a83838d08558e78546c3d0a93c57338aeac138c06c26172fc4fe4b38497eec5f834caa65fe4d5145b3048fec4f812c0f66b37ea11d201dd0029783b900fb21c0327cdd166a1e1c307c84364d012ee39fe04059112dde1ddf05454a7871238e45e69645dd649bdc921f060a2de7b68a8d7015350333450a3e5cd57187e5228cc9b7de5ca5d428bd61c9fe64abcf1b43bc9e335a76f3885a0ad906476904b1dac781fa9db05a3d1391be2daaad449cabdc483a79350e909847990eca042c538c4c83b74ea1063a47112b6af25ecc3add7cc6dfa563adbbadfc63e619d9b063a8098a819cdc45194f70bfbdf7901696fc0daf5e407784c158506d370564b1a814a4a7182e2509ea139beac8e44beaccfbde739b6cb3ecc6019af8ac6d115095cb56f039bc2202868f644755abc9c21e60cf48b503e853d535f417c9171757d716ebfc30520cb4648437f9ca3963b04c7da77e5fbf4f7b63ebe14bd113afee73dad00557547482ba7a5e0c46efd5af86e44ddc5332bb1403684b537f1ad9d7da06d00ce803b1934548378d1d06cec777b0befe9257e14d327260ff3201fafdc7444f5b15c546e9d55363a75302ef6b184358c678c7f6afea592d017abff6a67ae1df8083e75667a423cf2033b83678f2051d98edd63f56d3c5953351871486e5bca5df552b7f888f53e2d087ef1457f5813ee8529386587a762adf2c802f0767cda402916ed9586f5f8bceee5f433adfe7ac1119f656aa0ccc4cb046a18348c61471f7986b2e84af3353c60215037d5b1386b6cd95c5ab37d215353bdd321fda85c6637626f86294838f21b3bcd6bab439a592784fb83247345c51894b8fc83f39b5db053107132ee40090799cdc41900f577d627062243fb0f6ac2fdd021a828b48402c46ecf090dd94978fe11bde4d40d0f00405340280df5cde43f1ed2a025657a744e71c22d25e04bc201ddd20beb8eaf32b30f690d6fa9a1a02cc626704e8b32138ddbda631c9e9620d70a3a3e83280dfb1487bcb16c3ce81a810e1611dbe675f6555d123ae87217a27095f18b47b8cb58dd44e551eb4b54623c4282a69b88d54fc6e04e0a13d51dc9461a938f931f7fde18031bef785aa16e3278e13cf3dcb712a447432570cd78707ac98661033c6fb22fd44e6adce7fe30a1e308020506c5c73d25e0fe75814dd831155cd7dde542a6a4f1287dbf9e1ea79ea3dea1e78fc8d4f20c79ba0747d187d5a132024535fe86334aa388f762eca0e4ce498d978576f0307419e74c45998ae3e73ddefb84de251dd37bcfebb579b95ce8664d7056260f5bca0e3768d01b607c11321a2cf2187c2ee4f318c7ccf4dcde900b3c659727747d2ec528f3c9c13e76208f4020778d0a3c0c51e16dbe653346ec71d8cee71630ed69b4097b9f78cbabd0bb05581b8956dc853cb9a3707edc49227656060c34fe3f60b994f6e487e1b1047f105487e8898b30f3ea1cc2bc8e78922f2ae82126b7d7af5596316c4180f1e0a1bedcda9be7e82dec06e8db6f148030b832239c6b5c629afa53225ef50b4f02cd8bc965270fc814b67f08b76dccac8d8f2650da286d6845e603a608a455455ce66a02919faa01612c9f7535ba7fef713309fad078f2e157740116d02f17f14be0f4677fc5931c5d9de49b251811fa03ddcc4c5165136e41bae56a1d3ffe83bfc800a263dc6082fe2ecfe15ef5353567a824dc3703a6afa96dd0fa395758603a064dcfc72d8c4149eded1841efe314a01e9914faec47084272cade2bcefb0ef7b4d30ea927be12b1551d2849b4664d955a381db40757e530d7b4a3f6f86d33073ba4333bdb907fa2a3a63568b217bcd641b8fe6ced657055b31fb9f037f706094d1df567f60f39850a936d0ca4c81aa4532e987c72d30f9e59ba57406f7dcd1b84017affe2f9af56ceeb8fd45a3d9bbc98545a65bbe48712be9fe960c63a25ab6a6999b54bbac29e8f1f6315dc302541a060a3715bb2f91a949cb510e48ea8bcf4cc1c21768bd3d2a12d40d01489c910140c869bb9897594601820ed3f3feccd57b7b3c503c0d930f1182b1b1a38aefe13ac206cf910035ee7e4df6755cd09454b5b642d3a21a09040d6a0c42cb6721cd91a8c894b148c232ac224a41f697940ecb4aa220f73b001efddeacbb642d4f56053e67b2e4c560e7377047809fb85ac622c794c212b85f435ad6c4884e132f22c474768b73fa5ca69d763c78ae74192ab88f7c8f67f8df8ae381ced2769d67e23f6ed00d86473c003609de6d07a3d884a32f9ccf8684652eabb3dc08e0b99f7e7f5b31b83d2aadc707f536eb9e97f682e46509262337d1e5e17c627f8ded0148b15a6764708b00601e4615de3027212e4321abfa73c622d85317c88e5d9584614f4cf23680892c1c506c11a0908e7e6b793ca49191ac00038a7775e6ef0cd5f3e3c7314ebb16ea6698dba5e947cc808b48b300d7462956f6a3aa1a49db126d2a612b3022592ca24638010569d2e69d43843621e8ab09f4cbbb66b8734fe2d8df62807f20e17b21502f9052a101e44c87e5263a40021faf533bfbe313974b7661dc2598055c55c0c83a660f9b1417aeafd372fed6a202344e15e4c8e87fb0cca3869165ef0f36ad7170f57c09cfe824b671be17166e360dd040317fa65b6bbba50083b3d782d8eb48692d646700f431793e29d38ae8df0238a4f5625113e79b98e672130b4b8a0196464627e1edfda6146ec714f906083b54bfdecccd65223ccbd07fd86870cb4656acb541007021a7bea23027c6be2f6e0d4f91d98766f042fef26998b50f52a2674205d22396a59eaf2b8c71649a8e056189c0deebcc5f405355333ae3419941c74c0561774b0b14007ba9079ff9f40c4df4d788a094bac77f5fadb24aab7074d76622e47f28370887aea4c6d1dc87d523b365252d9efb86fc16fa321900616046ad41515e26c6f49d3dd3f560ccf85aefc5c48a04320019bb596fb3c901c766bfc86757f4725176382b301b2d360d9d120c16180ec60b07436b371757f4e824d53132653417600e15775de6f1c8e6f36dd5f1e21f71d0f50dd116a059edb803cb789d03c7b431c0b003ee483bcaaeb971b072382b703b2d761d9d331c1d67a3577078b18789a7b940f17a643429b7192d3c649b89951286f1275db9475d55cd21a6796a68ecb0fb5776e0e1eaf9f2a76d808360ef6b3c51f76bf1d768c7e56df7d677018c76ff10aaec414d58fd882dda02c230ea249ae1e0d1b886cf1cd93d5318c4d7607b577164c8b95a819e4487e99da2763e6a6d55f4159f66f186092d80f93a8dd4e9d8022f075cc01b56d424518bf05fed964fd8423cae7dc25478968f5ae8448bf6134b1d89731a69c3ba730d505987a8fae1ee1759272f6c5fd112b33a4ebca4e122ff67475f659e562a66c84ef9a6de37436a4acd1aeb5725f8c6831416cabcf8c4ca3aaf2814fb5a7a10e6f94a77789d01d2b71fc9396b3b6d38003be261f7290be1ca2c1018f432c0951a0f1f2a9e1208558e4563227be3c332da12d26bdac7ce02edc29c34da7344600448b04c3ba059dddacf0be424eab0ef2cab9e4800eddd247571cb18ff6d07d1d4a2c01363d6a8d19872d748e29cf9f26b3800310769dda6ac68319c5263ab0711c9a0fbba4d271334baa9739e4ce4450e38b4517d572498585b54613a9b5ff94ddc35c1ce11d13f3eb60332962022318de3141c39d000b03d84039d9c00ba60b676d997d99223eaeb3fda3f2ff36f3e0df25c58e4976536b8b3771073a59215f4aba9c2e3e1713bf6a659c9a06ae6220794de25fde6555341e00aadbc806e442260faac721d9bacdd710e887402d99dde28284ac60dc583f0d36f1fb2aa43b8dba23581ddcda33e26dc5ae09ad356da98940681fe519bcec25aef6132e54087f437ab9d941695d9c92adf9d8d904e15246bf2d9cca2146a29b7738f71bbbaf0f9a44aa8564d0e717afefe421fae29a841dd9b1b7f6baf1c1e688d7ed23f47c0c8ce5189acdef3422ce7c58b01177494da04dd31ce7ad3ccb9f78ee1e125d2db4414f5d15c7f09ef036ef9f2e94a0f80c402f0264d44fd9226a56f229ca6c576e2ff71cb86441f1c689b06b8ceb0dd7caf85b82e3a9efbafacf34591dd73d689fec463a1f11f2a85349c7294bc99a6585c1032db728cc08691d99dc5888f081601243ef02484e938af4ed38bbd6bf0d349e425800a2e424b602088d67c8a9970b158dadbbd2779026fe1e877e036eeef79ed82f258ad63cfe5006174ec9da4fe9d22c0883be069b9d20eb127308d31a363b7844aa5c3c3e405bfa6ac2dc5ffa74be0c58ed62f1650208b0cde362cb9708578904628c80315bb0d521f79dcbafd177527cc690c702d9a16a193d0b655f8c3ab92bb22843650dc74167205404713f6ea64fa2d0b70e8a0098af23d6ede4dbe26fd38a02189654ed8c523fb3d12bcd3665345a071c6159594a84044726ca62012d9547fd9c5be115c85b1b8984ce0713415773c0a51b8e135aa4dfa95568959eddaa3266dacbd5fd106935e285a894a9d7d0a9e5ac28d63aa3a4ab7470b29b6e1cadb0a3111127f96ded162420edb795c13991dcbd3971ada597a0a4f0e895dfe518776e1e9b61939fddb0123ba5d75501ba1983b5711894ad4a4ed17edcf5fa9a442930c2630f23d80068ef6645b7724e9c3b0f1318a0ae8bc3a7c02672281edc9b16d630fd4b1d84de422a783b7ffcd758d0b04c684b4854a09b2f0a39470f2555c858ad088f6d57cd03a9e676896510c15cbb44f2aed2ac5138c3522b54cba4dd5a53bd5a02f34d40d61f254723b05557b0e291faae9aa6fc056b6473601f8a882a261567979df3b08421dffb10ca6296e84fea9f1c5bd3ec6d011bbb6f4924a73f39c3ad1cdb011847ae3e9b9842aa654f4edcdff8a63e17280597e2b2aa5ffc7a0d8ba7b45c68dff41ecc6fd99c4a75f56b616d9109c7b86978b11ac9d8c1a4e4ae280b9712024aabab8b22f5f56304ea6ab78e6a3b029d5c0a2e61234463fe89506b44a4af04fa3874c86f6ebd0ca96fabb25ad8fa0311906e00fdc65c0785d9e9a3bd053c9952e5a34ffcc5d298a35cec3cb9562123a026e8f1e4e0c3839cb042afd09d35ecfb25c61f332521359aa7f6c9240f9cf03e82d731f9f5f487c6352aac0314d3021adc555f5d30522a9b0ef1e28426524ca8ab663d160dba674e3ce9ae2b07ef3299aa251505685066cfd96aac86c2e88aebf742986220d1c260a817bd5a040af1300a49a1878ac3a36ee8c6b98ea1cfd6ec45363dc2c3881006697befbdf79629a514f205ec05b305bcc1aa6f321d9658d2df45ec244bd23699d3b4134d6c46b5ed88924d4868a64454341372f992679b6c33da8e6c421b0c969c6626d995bf139e127a45f589e44e9cc9694e482152cb9d546772a6ea3f7da6cc6936b02bff15c3f3292bb72935e47b20a7acfa2f973306ed4f6304a095181512d28c9413261f274c4cfe32605e5c5a586241b11382fc6867fca9e850f00d7f15d19fd819234b125144900aaa3f92ea7f1a8d6a5852044be2b02bff203e1dc6ae8010fa41142f96e462497f1fee7994a652ff2c9a5ab650a5a9e536096911c36215344755152ad86847a5763763a2ad7e63d0d94d6b9f20744b4edcbd930e688082c61c6b7287059e1d9511d485c9c3d3625848335f3e561f17cc916e8ed067128428c8d177baf9afb95bdce11102ed6f74706c1e4f3c7ade77ba59c0d25800696767fc4b7e17d072a1b8ff8e1dde9722eed0817a17e6a7fc875ae1e32aef8cb747d5c3538b5bed10d4b7f1503c3d288ebb33de7fe20b5c5346158d0951a211954f51e93fb15869a7917d5040594dfae7657ff81e3e2bfc920c59dd0a47f73c4a6b18ee0afcf04330f47ed206cbc349b2bc479c26fd6f9af45edaf116bad5dedddd9ca404a9cafcd73e511f9c73776fef2697d58ac024454535a31e5a8c2c94b6265ca9d53c218618328218b80bde82c80b3943414008f1d9284dd6090e2d6029bd89113257152aa8cf76581097299c4d66a276c9486c1f765de735c88a60f275953b13a9b00d3336628193daeda4b6f3a6b03577cae4c632c54293debec6a063f7919055a8a0fdfb251b19ed380dbf7896aacc7369ce1d168e2a3f4fb7542a03d134bc03ad856e6dd211231fbe823f5ad2911ad42621a63a7b5ddcca335fb10de81ed5ad658afff58d41474fa401dd2f3d5a0c18f5ccdcf4fd295dd0929b18caacc9229f752b759310e8696fbeff6e44108340552b8c0c60dfe6994273543e4785a69df1dfc6f042cef33cefdbd7f721d8034e15f0555a54a15248814853535393d89432a2787ae2a94997265331bf339f128e5fa94923b1318d59bd99a8de43781f48d44bda08e56d14f6964975eeb899c29c4fb8ac03dda4a127d5b9981e4dce9f58932a1650fe79b58ca4d2f78b240ecdefdffa8790eacfea968f9e4769ec4b560a9e47e79093ba4944c84ea89b34645439e6349e47692af54fd24a52c7d6f4cf3f000fa9738917069dd58529764cf56b117b8ee4bc8c2edfd3f2348a501dd7e1f710ec979f2c3465748a1a9f54c00a1d17957548175dbe4c81638f60046d7997f7173ba6ba89fdfcf21268f99751022ebfbeea98eacbdbb467e4e56d34cdcb4f16d2ab493a6be46efc948b4aa37e98e73c75ddc19973ce39e79c5d4bd7c9a5630a99f3873961384ea3e226a7a2f2a8ef49993eb5e5e72e94da32ba5646fe11631c63ffc6719a14d88523c37666e280f3e7fc9df96541b7295a4165a6d71c0d7474c7409949e8349acd8ececef8cb0826b0d32c74eb7bcfa18367a88e584644cd41d5391acdc66667fcc313db6c0daa04c28279192fe3431aa2ea05044710550fa8f1345ef532f2a8f134543cfe47f8df9d5919550b68797e7e525fe8ba81ae726056fe960752b728288bbd33a597e2400a1be0cad230ff29fa80c9e543661a7f5ffe357e5ffd32aa1ef05fe379fcd7a8f13d22fcd7f8ff1f7b667c8dadf1e2f3f81fc71ed5ff8b63cf911cd5ffd813f335c67df1c85166c840cb55a25e8aa6c02e28aa964b5bf958f8de4029632c4fd1b2352c5ff2104e78e28c0354dd405751dfa807bba0a7ca309f82498daa1552fff22aa4c66d52060ccc7bfff240eaf730e2e732f234b9b38526b75a001c3bd37f125d402cc460e0892181681d4ebaffd00474541ae2be4610f71523ee4bf579b5db978e163398a63fe1cab8b8870c031428309cbeffb3719ae7fe24daf8f046da7b11d2041b279430734300374455f8ac07f21280a80a6f7c8e00fec6877fe3c6b36ea0f040588fc2e7b01e85f1c71199ff71c2b364c61cd6a3f0288c3fc86701b9210001bc0922eb4f106f3c29a2f0366666666cbc09e30ff26dfc8f137ee68198f0404af89cd597f0fe2500e04d187f98f000f81f25fcea81bcc22e4124c09b200ee04f10713c2916e00b20aa38a44d0735e941429b6c9b55ffada85ba51fcdba45f4bd1f756bcaa6d256444b9739cc5d4602ba7de92815168a0afb44856dd2fb243b653dc6e6e019ec0d7f0fdfbfa3fcb04b363be34db6a66b939d014717ab9e8630b963d89533d9b08e01f1a7a880d5324505cc886398f7d33086a1612a1eafc2f97124e75ba972def3bcb1c7cb540dc0717df58d2e5f398f8b391e4beea1fa566bb8bdcb33a5eca9dcc8403be33f846e23ce78d3e4d65b1647449894c44ec0036cc9107c9061a526fe61d09295941aa502d7fd2a003c9abc05ac96bc05ac763e36af79881562613db4ccc51b610d1bb94993fecb83eacff15619a5c29c356c14f79d08564f754c0bb5ec09a526bd95fa951c1c42a78f4749c29559d7d1a36b7be609db85fe685ee84f6ca157fe9c98819df1f7440cec0d1783765defa679c2eff9fef43de02f9367e4ebf7449d1ebdf2f0f4dff784a7ff9e47f8fde9797c7f3a7d189efa1576037a5c5512b45c261e4ea77b50605b0758d27fd4b133fe9b8b72bd35e91f9c1c96252519aaaeba494900a102cb8e81205210c3d49834e121d03b2684fbc42488ea34c94c63e11a93a6a1cf29292a2a2caf32aafa577e5f3d2e9f32aabae579a47ccbcaab7c4fcba7742ce3ae8cb4855d46d95c79069ffdb949b7fc9be55bbee507cb188295f108f840640da482a3a3de1f48ff27d3e4c3ac44600625163908d5e2096419d3f1855ef17b3bbe62cec72783944f797e1ce620670939978ce4a4b20e8bc5c2c961d96091a806a3bc4e932c43b8bea27aa139ae7d7aa9c7acf2ebec740ba6f2c340e303d68c80a23207618450e5e7e1b6f6a1f2f3ac80b29af4b1355bb97befbd6edc1718841a89fdabfb7e1b4dd37127f6e895b7d3640fd761b58d6e7d651f652eb8011353122d60814cc935a51a55e2d7f62f5f4197669064ca508ffc31095ab23c2f06ceccecceeeeeccccececec3f4d9ef8c1120c8911c90d03bcd9d9bddb1b8b203e3423f18a27962cf919829f109205121a9ccc40d4440a2366109a2205480cad00c80a211560b14b8ea2348164288a228de44807283baa7852e4480bb890a17a90c44fcd071b92340144d4440e4ba408c202206a53d8c086fe6a30248aa1708a2234253f0005315bf2e467c8cf2c92439325419014418208dd6700ad0ea9adf833ede73add15ad6eec93d965504f3407da64044db5251d74380ac2c2892896242931028a2555bc000914330025d54cb08276e2892f7a7bb777bbb7677bf7328e6ea5e65094a41cfcd0474562dbdbbbbddbbdddddbbbbdbbb35318a6c3e0b850c507a77b4df6cbfa3cd26de6c37dddac6f279e38dc51bb6d971c3db363b37f34df3f6f6762729a9010fa1fc2bc3738c7065ca19e379a9909190883890ff78fe333dd2c53db72ef315f820f8a7ef091fd503fe49f56d2dda6256dd8af1c7798977b12b7f1e5487e24cdc97ce44c55951b36e0d6d6b386762695a881d52ab25252d13063000498ae28c192b2bfec38d2de33e3128d7909a74ee3bd4f729323561df09c249b757211cc1ef1b4bf0bdd1d5a40df8a50b649b19edefe19272cf7395bf837ade7bef5ef7fffda2bb54f7dee55a66eeef7b15b67e63f879cfdf89464eefd234a7e79ebacb5bd79237c30a8ca458b2e1081b64d58b8a8a8a3847c7b89bba514ea44612edbe8845ff6920224affd91a21b666bb695f9b118d8b84d0b29b98748be35105ee69547d5fe2201d107eb79db8686b9886add815c91dbb2b716d0c42b92fb9569980231379230d328fe6b1c744b4d3149a327e9616626139da1a2eb6e5c5b638116cebabc1c8b652dedf89587f626b54dedfa1e01cf4fdbd880dc261dd8773e4185547a2820a040f41aa7f87d151fa07953573691167fc27a69e13617e135f9e672d24d4b3ad49a9eecf21a12b5f6e34baf2e55caa48ec846f30f9ca7ffaf00d26a698524c89c608ad168b3565b2297317b896dbb4c9362396d191c21431e651a2ea19899db0f44c8414a1991251d14c28e64b9ecd52336488f0cec4d433522966f2e11bfe2c4c3ea713cf58624eb3c9b4d81c9b11cb268bc5e60c605e5e3ad641ddf4662e2d2cbf4b61be9a49aaff36c36e22d84d86b186a5d964be82718ecd886ff8a302375f10a8d731d833099529e6e8ecd6a07e64e2d6a854ffee616bb83fd6e4b83bd3429a746ff6a91ca549e6906833b1c307f2f2e7ffbe0fc71fdd7f3fc0f776290a98042cf749d79f9f213fddf7ec13efc1b11b7f80db0528dbe709a862f04fcf237cd4d8e385370c68d7bebc574ee7ec8c3f4369928beaf705dd4616e99afdd5e0ce35aeb112d7d6a64316d25ce3a52e7f546ee4d919ff79946a22a209e7740bf8fe5493ffdc6ca265ea26f5a38afbd2b5286e544057766d0d379ebe24ba8d3adea6d3f188a3d3e9743a4de634e93839364dbab7747af8f42ec8118de3d435a2a0dd77834968d7349bad112b5d9f5f14fc83782f7f478d3a76e6fb8276638a8e59501f62b6851cc303cafd4682ef32ddeacacd61836ff89f3e9c4d22c0726d8db73cd82e7c7d5d8532154b20d57b70c7b9abea6f8373acf646006ad7502453314dcae040b9ed8659d8db5077aed2d5bc28540a503420f1135b33674a093e12c40e218bdfebe8967faab7a6605229a430bbcbc36c9ee3f2309ff3f2a95f9787791e2e0f33aa1ae665bc7c6a54f5ef4b064c932c1fb67c384fa78d85d296959516951696efb422d2d08517683d3d7f8f2728941304ec8c3f8b07d81b2fe28dab6b580f964e53fc0441c50e3f4d3c7952cbf4459d7329e5f5c8d3e4e4f131392e683fe9abb94caf81e5d91a5ae7b7b035f3a7d75d6f403dbf471e2ca83fe934fb9aaedaa3aa7ef5b301e5c61f996c3184a157feac49a2a29e3957f967673ac811184d5b88f301d1b32e6a1943018202e463c856bed334bfb8891d08317bbd66b32e6a23f07fb6860b4f10083f3c8da2e72b70f4888a7ad69dc0cee76ce65238773559d433577fd9b36de49f9db9b1a9cd3c31361c20f8295ed0a288ac269bec221a6d224d21f307e6d3640a3893b6046d9395dea4f96a095a4ed884398d7bde37c392aa3fe581bc548d5219fba76ca31a34977a3661d2644d9cb48954fd5fcc1535bbe8710a9593c6cfbf094d19bf50b7d8f368bb029f859a94cda029e38d43a5c0db269b42e537e9a22f35e94bdd2a276c0a75ab74da1c72a739ad5b4bb37103fda269a949f70eb717e107da2f739a09e3718eb359396130d50ae1cf9f4d544e581b9934186dc2605ddd7fc07ca1c6d904035afa12adbad3684bb425da52f5e762b4745a1735e9bf421335d9335a1bd168b4179a2bb139788cbde17f7a7f37da1a5e62094eb21d25cace84e015d33b5117b05998000a190cdaed395bc35da38c9c9e51356c666666661e4b162ac1064110fcd0719af410f652056511fc0ec3adb9707442b25b5d99b9bb9b6178a1f3b156734078cae9953f07e27c238b6cb21b6348b7626b38eecb0e22e18ca3d3834611fabdf7fdd327f4f91ec461f38bc27c4f0ce2bdbc07c520decb27c8bf7c82d01b042867eafcdd0294ab98ebe58de2aee602c6948ff499d0d92dc5e41ca8baefeebe49cb5630123ca33d763847dbe0c2f6dd871cc74d1f581141dcdcedc4af9ab3dddd45207377779fcd9b37770af72278639962eab123b2d0a47f221d83065a0c4124690a307c50aa0205330cc1233aeb3e0f5fdd75980ff90816b63531b1ad99df0b09e14043aa7b91128e6d0dd7fd37c28c72dd976a1b550ff01e7c1ede83e1e63d0f301c55db6824e5f7857af067b5cd27e6b0263b51b571ddf6df7be1d8037aafdac69c6f546d1f760f82dda8da461cd49f3ce63029e8fcd261dd7ffd4593ee305fc5be316837313549035af64c24a2a5c3981cd6ad6d8288a0ea5dfd55a40d87910e837143ecca1f89fe61a2a9899734a9c32322adaf4e25082ac776c67f08e5d1c685e49afdc1a07bb7fbe60d04b76d034fa80de4f0b481fc1bd8830a4f1f828f7a1ee0a3c653f827149fb6499511dd9ef3d8fbf80b41af1b59a4cb0b9237293e1cdf0a9acc24740393d0fe44564fd9944da139d4db9753c6c44253c6513e1aa8ff2e69d26bfe7dcfa32379edfb5ab7befdbe5df9f721287aad919a5ce2481f7f1c92d71ca95bb56e95dbac2ee99697be4b886aea085aa66ec881fa6fdd7ea8032c00aaccac270d9b51032d1bd6b186354109429747fe1f304292c5308ed6675d9e688114a5f881996b35a41d983908a9492d46c3a0297ada2f29cecfdd5d13d0fd263a8201121c363b6e6ca80eb45c9a0dcb85c4ee76b1a9269ba363aac95e124ed0316c32202de1e8baaeeb7e7b9bf6bc6e75dec6799bd76ddce62c1da5efaf29d5f28774ccccbfd3e4bfd840cb55e57fb18167078784176c8d8778f8197a9be69a060e9479773218364d34238872111045b3a259110c4533a2d98ca8685624039a01cd8488848a8c8478a1fc30d18edab9e4ff264926654eef6f83ecd6d25411ba35cd02e367cf903fb5710cf364a2fbada496293545f4f62be02a2a189ffcd80e0aca485d32d2f6cc48ed791cdb5533d2116db78924c4b4a36ef5126666e6187b50d8083f0943b48f5033d0466ada8f44747fc4f184d6401032d2cea800a41af1cfd95e3efe08c1cbe5aba01951cf84d0b2675dd4b396b5d00d347eb2240041f702e1ab66f469aa49268e8a08b978d3e4eeee6e775721039224e1323bb7cf8deb3ce5846e935bf3e6ed9f8668ca555325fc50c20f5984ac9202ea620141f73dcf474f8905eaa72eebbd238e4e4d87524a757056cca9f5eb34b7e1e8f8ceea0f4b70bbbb2c8fba76b89c481d22bf9c39915f8baaf9208a154504a55c43d4c7225e607676677766676676afb150e369a106456c8a2390581f77a03d7a23120b78109e7f1e8f3c9367a7c9de259eff7f1e5fda6181679b3b7ec33bcdd3c26c6b1ff3a9d41441d496b400fa82871f9808a5bea281f2c840b3f907887fd88128a514e88789fc004d77ff719afe2939c63ecc3eb13f516f7e6143bb45a98bb5a36f5650a9dcbbf8a09df84d6e2e624c933d95e09fbf7371b04df7418fdece30b703fdcbf4b82bc474ebd4a44d7b0cc29529d746b7b6da58afd5bf2fd336627ab5a586a0278f8996d45bd24fb57ca1ceb9a47f7b759630d4fe90674bddfee6474656b7df19cd48a86eaebad18c92d4cd6773fb6fefd2adf9dbafcc06841b76288285926b89134860f1ecb25ed014093950fe0ee830ab22072fe020ddddcccdcceb62c540ad20e2c4122d6214394110314c6f6b31e0d06464440f458ab868a2429644142a9210516406126858f213daa0ee7b1c6b1e19c6318eb14f73cd6db1e6d9692a22abc74393a7d960fe556c51cb57826e1ee7799dd771dbb6b9bb4fe6cda793208313473b14b5348184431bbe4e23d34bee73415dac19ebc00721eeeeccce1b4f66f776253da91d014612417c3cd07dcf4ba57e64f0191181388c37784ec42b8a9408519188a00454f480c81731081a628914454a569820091a9e7c5794a0464407198d99d99d7dbabb7378c40a21b57caf1ee1dbf438cfebbc8edbb66d7edfdc260f68b948373898210521995008a1b933cfc9734e9f93594da8b8412d7fb21b75ed535a9951f76f7cd53a9aec6e1860e4d3344ecbe9d636418488466d76f473bd719a6daf69a71a8711ef594f4bc5a880f21351e0088d2882848e5e30272087a39a0d6666f73ccf73f6e9ee9b3405915aa650e09344b4248908a8d5b56c752d5b2dce61b444cc0aa35aa66642c4c2f6be267a33bdfbbbd605922ddc87de6cc9bd8f364d36c77936dd363b96f3fe9bee5f990e4258eb13ed0889d6b414122d6c9e328aa0f375b68679bb14de4057b98b421c3d7030b033fe2a4ae8f6b3396cf20183073eb035cba1c0564bcaf3a8bcd3dffa79bf4223639b9a7cc8f89e948c6779fe1e984f7d8f8c7f7916984f7d0ecc987a1e735ed8c5260533aef7b7fc0b035bd39e4baa49199514d1d5e46260c579a2a48d20d06d3261b174f7245c19274c4b5b33756bbde7b8aedbbca02ed70a3a4d2ccc1d1a45481a8dc6756291d3eccbc325a7f17cc543cb223cedd74bbdb494fa9c7bdd9d4be19e6b7323f3cfcec0bc1bb613ed0889464b21d174b6c6bddfddb1fb1c705c5fa57ce5cb5b4a1982da8ddce6b51729c272eef771db6cd431f55b3be543433ea55c4019b56c847bda743f25e81c3d1fb706749f3584ced5a4ab28a1deced20f1ffefe3b3c5b73aafe18d89aad66becbd4251c4d93d35b4d3f2a45a69629d269fee43852622d656a7f7f9abca8142e3745b9746846020000d3140000180c06058321915840281c2d7a7c14000d77984c724c98c9c37112e3484a29638821860000000000002a008188010df3fbc11416fc68e1939ba6d428385c039439c70c73e9987a22a438b8b27cbd3f0ec0bd2f1f22d8870c8ec036211322c125d046ffcdb2a9682ecfd7848c359941eb62eef31ea41a0e9b0f22ecc16e6be837be6b49fb4794791d7be959424e05a7ff7975cca5eda5be88d77d379a1029b74aa3b986c2e6ab6052ce5e6d389b260c3852d523674af5e37e735140f685ce331425c46ef50458db95b84efe0fd76345e183d6e036bb9725c2e9d85b0a114569fb336e135508a236340e3d4f9a84c68fbdd4043d39cba62339f6697f30b53d7440adc6af45b42a9ef1c7c420053c20e4b87035ae92f842a1980ca84a01b4146da423fa5704e52259f53c57affb6d941f5ca24f58482a051301dc8b753579501af73808271fa9c0c101de25bb1341a86e21ba0df56907a5f7602ee0ca6f61158c2e1171b889bbbf67d5decbf929e574fd363e6f34f6f033bbe9d0ce6ae59df543f4b5ad0f5cd38eacd8882e9400b8ca96134338d0060ed4598b28d11be4b90407759965c2031640a104adb086765c590900c830007eaff2eb4dc9aeebf581a4dffdbfdee4d2df10eac3c7f2dfd6ff44e8faa60729746b02a1964910da4b533abb72d90939ff7afb5f288cbc1bb2c8744846e69967ea7750d08d87093ea4586b234ac576fb484b9a2b67f5000dc66bcd8d11629fbb0868d2861964711ed1c7088495f57397de8d4a309629a1d60c37c9111f46aaa07df2f60a789a99d601eb52b2b87eaf928d464531cc7e616f056b63c4425681df837349e18ffe0665ae9fb253da2fd7f7ebedaa7053793adc4433f30d94d30558bcc756befd89445c16753f59b64fa10fed62d23c4cbcca728eb1fe505c37a1dc8238ce0b6547026e71310fe90e73d0c730e421eabe4ca58f290e85bfc7207c840ef50cf28491560f6d9d8b4b19799f6d4d1cbf5296b7227dec1b4af47bf42b52f3b52852821db91d977c65dbb011e82fbb65e80d1b6b753668d8185d961abc42463504faf64a8ccd40d40da7a643e0f953cf77738fae3b8450dc3f88744e504222eaa0c036d13661f55d427d44c2b46cbcc2279e9fe2d9e92494a6bbe651ccd1d5af1906c83f25a542fbbecf013867219334dfd11a35417be63b4c2bf85e68ec4c21eacfdefc7902456f12be23e185e177779c3f78d9a0803cfbd8dcace043d3c748d10c6cd1fd9f34b0f55003326deb343fe8dae37e632b0803713f5b0473dcfe09f2d421053924c2eb654f1ef0897079a1909bec637fee543fec201de7c8caa3ee2046af66d309015204a001c4ea0f83865337b95722c98f149e227d09154853184e3657e2f15662ebeb3477047081690e22c62b91c12207ffbd4acc6a948974686815598c5a787fb28dac43ee0d361bbb0d3e945ac7c283e46ad40634900dc1350ff6f9fac9c285b9595ad7f4c281831772578369256fdbae12c7c01f0a86554d72faead2dc2d584589a82fd6b3739ae140685a093398e39ab6da2d3aef3bdac73a219bce352b3ed8a71a64741e8d500f011dd18ea3b2a211737d0d6b9ceeec07f7f58ab2a8bfd17484cf7484d9f9edc399df64d1d8329e6ee816adedde4596aa0ed2ce129ee8ddda18fd757f64023078535d1c109bf4eace3aba2b11e824656104e1bbbc0ad1c7206f3255041dcac6317b8cb230a81ad5ad58c196afa96b160506dc04acec05d3350029c34483d9b8990c9d32aa309adc08f7b491adcf3e47a45ad764f6024d1ec84dc78dfcf17038cd800167c74bd155f586ee9a626db3ec90c8a89cc5695601388dc52059cdb936c6c1281642042e301eb352ddb5d6a7af88ca9bd6fe37567816108c9eab58f80525ddec093759e7e9ed9d5f14954a5b9ff4cb93ecea763485445cd3ea8ca0ae5853ba7ef3fef741627d1fde17d3ebdcbf5f48bf031a2b2f27bd360a4b536e4efe4ddae0ee84e3b314c11f98ae123c429195f4fdede52e9e6a7f7c0d867ae158eeda51c704bb242a5548f92743812c2124edcae58c59b47cb3a6eb33ae1aa8f309153c7bfdc3c07f5f9129f16ecca4e9616d0ae86298611aaf0939b63e3e16cc5811e971dd290654c5506ea473c3c5a1a21434f1e1dd52a42951a9923228637f30edce85fb6e42209967c60848484b5e8db2a00c53ab31863cece850edf8ca16109583c72b0dab416c0f9bda585e091ca3829c40c0b9432203828fc4b3c3db08ff4093bc61e8b02a22a75de6e7e51fe8a4ebc88b6217ca056c90ba61ac70fa9372bfad57a9b937d3aa3fd8088df73cc272f4bd6b96fc5aaa1dbe4a61720dc781225d90b673814afa0ce53140d51ef58cdf15e7533dac44f8d8388fa25a89b94f235a44935f5e75ab342908252fe5c5c0ce5700a8009cb8061de7a99d0d6a56df6dc767e725ef29978d1e62294b940a6fe088b1b9f29f3097127957996fdc654a89a6e4bfbcd04593f2ff565b9e794030d3d9d95ed54703e7a0e4762f4a05f10174f4889fe5126645622b1e311eeef268d62ed3555e1c38529359b29cde014619720c59c0d2e8f7a17493a140ac916335708ba24eaaddf103ad728f2e7a10b77b5c9a737b76026b17acfe11e6f6779852dbf661d56762db623cbf2b8050ffa974d53dad7aaf9566b919b7774c0efb0212a41dfa65e84c27bd2b5ca9ae31ad02a34c7a00db57b5b2d81f113350a10b5fbe747f8a51f74e02ab8b3a6238e47a8b877c9c63a66219e6b0e440e35ef9379467501042493ab185098993d052fb57bc502c01e9f2110c4618c72c4678947ffaf2022cc0d86cc64634f68bbefd1b0fe8a74ebadeb1013db6b19a730a24f0409a85c80e5759d0f8d225288e0430afb41c6f48c8d9bcc1d6acee1673388346128589a3eb01e6be135d13eb4c042ad5b1fee5fc7b8407ad6a8ac11778a785105e0da8ccf8b86155908791f15f11c93e4dfc2c9617e4a0b246a3cdaf7d7c8e31800d588090eaaabc54490705670e4f726ad1caacb41120cf8062cbf3e00433aa2855a9cd4c72aaaaf9d85c6f015d7001194346ce6a9411a74fc147068890c2715d6fcd06e5d36cdb157f6e206062edce0499fc2468dad53d73bce1016f06a5d534cb4b9b227ef86445db74de10271c7a88a014c344e6911240ee78b4c1621e1b1f7a87964034a6f5bb9a7b5e8d3a7931a1f53a748209e099b771964db42dfa653315290639f3503b06347def8d35d579c9e0a6fbb0978615f728d1eeae36e6da27f945cc05c8b29d2b0752b68c04880232cef1f964e66818f6d1a2a044030d23928af467772af42de8023e2f503a37bc2972e2ebbe8cbabb05f130a2f4db22b6f4452ba201ea3c16d9737a898de8413056b292d1e93e18b393624f1b6af4982db65dc955ed442d92fb2d4c44295480a50f4a6763c960f656ab6d82737c5b4764317905846e2967fd1fa144fe84e828ef904740b2d3509a15568fce0733469a0af51749040467c9d8abdf3ec86678da489a86c51ccdf20d9bba9c9a10a21493acefb89f4124a01ae9b5c36f2a21321b192b18c7910a134bbcb8a326d3a6ce1a65a4385aaf1b0b5c1a8130b925c92fdf42c98eacce4d8930dfd0459bac17a15c2275d1f0e214bb9edd2b674fb403bc41598286f41ec868fb086ebf84341617d1c820cd5301caa7eaa34906278e4d4f4011aff783948690480b6e30b670a58955b24a82f8e8a940a2cb59dd548066e16a04ba71cb36f78394bfcd1453f49415dc2855ecfdb4f42d28849ed44c9f51e23a53a25ee003a6d933cd0781ef91d7573db0f63ccf87cf0ca26be8495eb1e06d104eea5a87fab87cd974c1e626a745ef4685de7261b4496e5a49462d3b67568ca821d8f2f65c9577f6fd594ef10a414bcfaab2d96d556a4f8fffd00cf0b3fe662de8b9d178203e0c6d861d95f4c70e8913a75b38f60ab00e3abb0aaf7b5de3629a8d448297982a21e20a019fac1db5e10a33ba3c00cc301a40af6cc506deaccb982b981ffb64f97a769b91b4de11acc8ffd8694e505899da04900f87f65d37986004c1222a81ef06be634aef422a700bf783c7b3500b2398d3ebd6024a70cd67e3ed21f1c2c27668981d293d9b0ad3c9b59fa1a2b38b32c5e18ce0e5b9ea9491807c5caf9b7405f5e6a292ab53334be0f03f8d750f7f82848de80519b34628e62fbdd9585c772fc459802705df60fe0831dc399ac70db73c6a3e542e320c9fcbb80dc4a3e29a010ba6b5bf5f4cebccc06ac54f1c33407e39a45507e2cfb3bd5dc2e451e36d7e1b5950cc3640840e89bc45c0174c59fe31a22486cf2b62dec2fe1a9ac65ee04c82ae9c3946d6ddac1a8053ec01a19a5cfab8afca6f3e0a7f9bfdc03c568a5f12d166e503659993e619d3b145f11c7254b8497961848cc62c47714d43cf7f7b84e643dd1c2c363b73383393b10324bad722fc410b60c6d38b44f009ac425500636acf2d180b34acb4c72b3b0a31f2be2eada2c785284742f21b81938ca1a52f7e3dd27412434d316947f9c2457ba69b9c5ac75cbb81ced1dbd0fa701a19c76d3942fa5e381f2c0c4f274cec4458c4987c3d8903458e47314903657956fa29af88a22cc49cc08ac33a9678c5f318d4074689d12b56c90daa79cb65e40025946822e6103e18c8e9b8910e7a59fd788c31fc30d51a9734eab0f25e9090e6a26eecbe8da317d7d8a8b99a60e2dbf698ef4bb406d391976a69f7478027dd3d5db0ca93dfcddee1b8892a4ec8eb8ec66fcfee2593efa570ee13fa7d26b7d7b6145899bb7c0ee822460ab2aeda0b219cbe3d678f6e3de043e3d76d1fd1d233497dabeaf31cc47d48591677c3033e7b0fde8047fcfd1d12415b3dee8d6f06199ec55c04904dee665234f66f59ebf7ba840220fe5cbab3637f4ffa9e8a9c59da675b25001136619807f7a5acd1319ff2ce814bcbb01c3928bbc425c40caa166eafb78278b116879c98756018b8bc8a94922f4a8eeddcc4c5c9c3de741deb995dcd50da11232bf78e242916cba97ea1fcb7ef479d55209e6c48913ad83c8f110446f7a1166c44bf180f1bbaaa104158ebbad2ea2a4236f44e658f9821884ff8f90cfee783d4a161c9a0d12386d3e27fd98a27448748ec9612ba99a66258300558863ae49d1ee342b9be15b06d4a4de1246d8adebb57ab312861647ed5ba9034fd49c4971346cddb1b47501dca38fd799ac04c0cf62a765cf339815d62915197eba18fc5959dba18e731419e55eb081613cb29db10f4769ed8c796a4fa5a2f6df7708aa7ad6b831efadc91b9013ad3c4c976ac2c3894096a117aba338b63d1c61ab4e049606b054989c751eb89c4bbff00a5aff4339b6c29e421e330014253f3358bc34926ada2b54bd483e12a9800e9297e91bff59abe75cf90fa2c53779cb012fd061b25e5ce26370ea529c42a5ee0bb88961a61f4d3dfeefee4c03480c6870bcc18e42830b5bf7028eaca7d9f6c3d50378d47c0f7b354ddd9a260e9ea118e411b644082e9a92994e94e665bca2d0670db440672c70b0027a8ac42ac6437f400cd99dccb6c74089f382f314dc486a2f5e3af36915360642600f87070e3bba4c06c6840b2179d1a1003ee9842fecaabe753511835db8df110998418100b370cb6921e37949d9771b3111c2dc74a86fe276d68619a752f332201ecbf315138f377eef90c7761d78c6e268ac2b2b9a9299ca316065f6a1b75defab79ff4aaa3d1722a406b0fae6686b6ba8ec1a621f58644ac702182bf5d9b274b863c83c7c608df188a437eb6823b2049135837851a590c1c728e5b745788eb0f4b5808975b31701f4941b40ec6e8133b80ee02a69e14e7bfc1149fdfd10a62a70fed82cce1e707e32ac6a11f59ba9ded4e25796024b1c729b0e9eb1a9e5f28f7e29ea2a7f2c37474df742470a44ddf75e180414b8a10290cfde0d97237c67395e942d233be269c6410554e2dcc5ab313af66b608c2aeb861556b383ae4629ce308778595f389b974b24f5dfb9cb8ac9019650f80ed15f94c67dd048a858f6ebbfd8551b393bbfd275495eaf6c4229bdc9bc885bad1a13312a8c6e73cfb003b18d924c02af490f4e6c86d3b8cc83b8f493a2f89a22380a5d9dea0e47a68d950b697ea7bb8f1a69878b6d870f14b99c446cc67265c2c78152dd674e4ad9ecb4c76b62b77c0d0f58655eb1b1a0144150a7926bad4a49c39b6ef8af0218c05affa96b0e31ef895f9ea0a684c072c18cdb7c3a6d833230eb9a91712fee75167242de473aa6e5b35e6782982ab068a5984aa944c7e9c85bb1ed8cbb05e5d140e0736fe3b4b774fb72428d714a7dadcc9b5779e9b7ac2c22d0e35471af7d2a3ec91bc49b5b58ed3c85e415407df96cf8fb67634b8b35901f299d421f8d7da1041f09580b2babb23fb6e8c93b16c1ce6eae2c60720211843db7a5f857c7b1ac0a4a00515a138934bbf88774314ade4b2beb1ed3f14dbbe19792a026dadd2c3451881689e228cd57800950e378647520f372b9d0b866d953312e1b8e9248cc12951b4cfe3e32940a3911efe1773dc191f220a154fef99848803cb8784cb8d8c882c8bc7c15244251553d13167e196446b554053df7da43d06042e5ccb7a30b12a6e9eaa6a988c2f6748dadea5c6ee8313657fe6ec84d5567cce4b24ccd760fe080f4f465aad8147d8fe1a317803c6d2aaa841f9e8e85983d9dd9ef13ea14b104248559a6d4a790ec178f57fbbeb14601983daeaef49c06b9658d34599b596b548d7d161482392eec030769aea81d1efc9b2a77fe0ce54394775e9b9fd4aafbd44db4cc79e8787c862e9e8b3c794e9200521abc41c4952d3ce651949685340ffa65219bfdb6d9801c26f58c9eb53353e5d4d085720e2d445b17d90551572648b6941544171101571e88216b74b077384a465568801c5e6ff331bdb352f2e97a7539c446949560dd1516b092caa3603a946218a40b8d9fe36957196de6869564abf3f47aa19e833ef78e90ab46e1590a113ee67c415576651f3e91e76481e1919c35b12d2a56755b8e5a44127162cc2abddb09e09052529cc6cdeb3e58cc03cd0e14fab33d0afa33a93e170c6a0466fa51114a1f5f3768c1f23e4815cec692d8662a0bcf136a623067a60f1c9093d6ef8cec51d4b3f65217b9a9b6f8a5ae6598004943279803464c95fcad3a3a000fc1f9fbf002f3d26873b4406d6224c261085d7fc4c1ba9088031e5b0e5f1f483d7a1a4ea80da9083a8d0bd1e397ac591886f855b2de7c375f0703b5398e0b0a3440b19f3cbfae6e09f492f4328067205035224b6a4fbc44233d78f18cb43a13970949f5834c4f40b1495b8e548efa78bfaf29955bdf5746e76aca1ac9f4b15e4184ecff0a35fede4c1649c6993bb28136b88929f0dc17260419ded7ec09d8d1e19b4037e48f57d2de6ca730eef147de7ee11336b3594356a2ab2657f2b1e720e69663d3fe36882c5ce9daa39a988880b0d1ad0fb73f660e15f6ee0e6cabbf6624669964f2d1207bbca2bedc8997697472588cfb9bf14f993adec19cd118909c29f31416200e89b843e74d79d0df5c610ac3c5f6ee48889c7e1fb01490cb1a8256ff117f837ed28fc761e81049eea7c45f6d130b29c52a065645100c4b000bd424249490a1d37b6443dd88601288d22f39b894501d4c1c8b64495c2df3d39d7efb21540f646cd9be060fc7c389e023752955d64bf53cf5da8b7fdf5552194bde3925aec7d23d1b46b814bd0ab50e82da3e777a1d6b278b71ae994a0ab2e140e14b0659979a56c2d45149dc04231f9b1dfd1942fc36a95864d4fd4da580e187c3b36e400fa8a70f193fdf727ffad0d95248bc1e2ce03ec11d5d8d3e1e32f331c047cbcf737da00bc35460330e473ef7166fbfc75dbcf387be533b00e9615d86a430fba7663af55690463d2f715a8715333b1ef6aa2e0170c4d2e3e912df3221e861128efbc10eea160079bd593ec5bf4af22eb648c8b45bee1b2da6796d50512177a8bf1025f1a4da4a144a5d8341bc40d4d8837327f36fed53eb1eb9e690396539f699cf9ac483cecec692175d619371b974e3ae5de58e2dc082219fcf1f033664986f15bfdf4941b48686c549143012e42f6123f4d8be8c19c510f3b506a1b68c1eb5437dba20277c11d94bd94a671b2f0f071c5b43c3c1dc2005007022e4c1b5c45564005f5bbf67b8a09eb06ef25b36b38945730f1d903fa8445295c71b9a706212cd02cc04c9a7ba73025dfcab49faa1776fd64cc2419501071d20d37c7b001b5b0a4b21955be26d966eb4a731ad37a0b9c8cddc0cc27def34a06a00cc8edc2d982c4eed931cc894cbb3f4cff3933b7151b71dd7f132a195ab05f9e420f3f6ee5a6bd2a189231887b9bd3b46f3a7b8864df31537c50ca7500f13692fd427ddb1453dbf872dc35c36a7f88bb69668d8672b9b48c3bef9e99e9a5e1e4d2101ae32bd079e144039325070725f0609aef3c552d03e5fa17041e3825db33711064a59eb06c2f9b7e36834bc715a4dde151641832f11efee1219db1419c1000fd6f221b4ba9f31cbad579905c6ea7dbf142c9da8950065a69819f99dc4862146bd2ce2d48c2a83d5ce0b1ba64d7baac7fc7a87254fd1ee0f762e0aa608338393eec2424f6fc169a6a6969a6a682f07a08006a03c797c0ec2392813cf6e75fda81bf6c3c93e844b61747a1c5d72b3bcc9982ef8af861e5299fca2ad589ec227ca8b1030b63a8e83e4bfdecc7abcd1864be4b3b45267731dcbe4e8d9752413689f2e1c50f009f438fb9ceb0e39296c816c124d44caa09bd2161db0f8911a094c1b487471575d552dbe1272e996a0660d2daa49fb03dff9b1a1252ecaa70971217b4533a0e7e59d8f07871c69f8ffc3399cd04af434440a8c30ffade43a287eb3117bc9116626f4c1005652d28f5468ffbf4f4a3f17290e27b06c1a0f4a37760122d4c283be28dcb9febd4b063c1a5343f134177e152e99bfda3fa150d25c15b6a18c69b8a46c953026731f4721853fceac236415266e898b105db0a3121b4d682d90f44770eee7901096b539863155e3e28b8fe235e5d474b4b0529f0611f060379a3e4f37d8e0eb397c932a01ed678d9018242fe6eb4b5d36be482b957c0d11e7ac0cd842261417289430d12c5d081227d207facc291cf02d22a75087ec0d9cbce192600c32fc62c5ed331a8fc5e463dba0d4a0711a1545b4a50acb31a43f95991d9b746d162c099f7fd8f1221224a8c416fb84a589056def4002369655ae7708909b982b4e7487b6d6089d9d0a9f7bf113468af5364ff749831a6c407cf782f2f99927150d93ca91b8587ef3223f2693fcba2074ac93fcdcadb7e89ac564c4d16a83975526e813790aef8851ac4b6adff1e1c41f84ba7bdfafa026da3e291802810610d78c34329825710724dd9a5367515d5813ed59b5c8959392ed4c462537da136ee3695e2495a737e5ebb0508d569ef820045d693719f549346aa410975f73a1b2f062bdb21da90df7b420a55a0b5948b63133ca6bc586d5c4117d8f1877f3f13832b0ed040127ab0873a05d20fc06e857fd5d43400a8e6623e5253e0a8ef4d85087bde4fd177122448e6abcf6803832ea731aa1c95fdc574f60328eee7304754f625f27681a37264897c84df8cdcdff3eccaeb95051646187ef0b716d64b5043189928a3710ff9e2763b91841ce42b10489414382b319a65ceb0a66571213ca6d2f546df4fe7d8668188389035e5b435d5d719a83d8c44079dfabd196f61fc60c26fddf345c7214cb6cdc80050a7a1212e9cf3032be97285421af45af006c4a28bf674e487d13653d141eaec1b729fc085faf2d6c6f3dd8769078bbe3aa86fb8b4258f6a344a2cec17070dfc698413a5db57ab9ed6ae9850e6b8e460b6d6c08853d287950af928d296fe4bdc7ef793f811a326f74a23eee7166fdb83971e174f140f2d243c9f98a33cb8edbc18faf98fe2637196898be92a3c94aed3de3b5a30d233ff5b4a22600a5b91174c649e5e956cf66becf2f9b741132ee7f8391ca5ef43d3f45f96f64a00b50b9e087589e5c15c2f42d57e0a95e1ccfb449a032b6f75a196323eaddcc37f24cb75a1060dffbec358a00b0fcecea97d04d09a50a578f14c92c71ae60ea816c4b8daa0e43a61c9ecb19c2b557b2637445416e91b1ac0d7c6bedf4cf8298e1d57dbbeb25a25e3321c2af5803a4d1a14e3921e4dd681ce948d9ac27b82a43f6f23119b0de4ba31108cf02ec93c53038a7163f2539588f0262eaee92e66ed030cf299fa03dd74a3f0571c66b5e76f95ba204de9d3b955354f53bc7509dad7f8e7169de94c534c0cbc3bca43e853482439b71d5c67a01bd0d036d65d76e5fe1854d0e923985cc151abed7e4ae614cb4f20aa988924f0b0bd7ec597629640001583632bd388419db9e27947ba6e93427fc3082de2dd24a2546cf3b7024f9eed1b42df7a56b588c888e88816a1dcd43df2b0793856693bcf97abd227ed703653ece68694f8d2c07495ec490c722d02331b960d59c9c0fc7ae2b55c4da7ed976918924dbef442795c2cc922f031c995bdc79173a291c0e13663f964288efb98d839289a615f8ca700101a22c7ba52934bec4f54fac46b11f955469bc14bed644e40184d12a353945c624a4c04f2f8ec36ba18b1024f4b01698c1e5f644983216ce2e3af9a85e2206a5c683c013c1e9c06ef95eff5ae4180e3c9c923eaeb40e7b57180702cefb6d368de9b81f2f6cea761bc7a4f55fa60eacb19229e5026e68e0892a7dff4183db1ba46ce0bcc19e0fb994accd11e87915984c1a508e2c3487fcf240e721b0cf35b1439a51757118b1c1481c0014e1c9d78d7303623d9ee86291ff9589d9a82c7e2d28b14955a7e526b096a8b96df6bd71e7dfdbe6a0968bd9d283bc7b347c39854eff2d18407e77e6d4365230ae1fe5e3e35ed5f49ee1e0b8465004dc2d0a3a559615b511ecb0c0d88487908ad1b29f9969cbe2935093c030dfebaca2454ee37322224fde714d23e4262e08f87f0e063a0bc9fb98fc9e2aae10812e2202da38311851983a9d9c901408159b6ddd435b87e4d29698496557762d9e16bef2b71260ea3d507a08db74187c1e8270dcda32bd8a543a47b1705df594dc0d1cff4e0e3146a0fc3b0778d912e4c8e34b56ce63e880558e2fe6263a4f5a80e963e5b0ddabd64c5bb73a6cdfac1bc260447d243aeada03a64d8dd5f094a2636bf62421f8c25d20b4b26d913508c9591420143211f55929e5b539882047029dd47d7fecd7809fc434b1c3fb8a4a940e9115d2081023f38bc76faf1dcfa48b46b1e20e6915c18ebf4328ca5f54858fc2f4816df280569903e81e6f68db31796c12d24223487aa2a178297a14e4ea390fe483bb8660f24e962dcf05687402390042d30a2c35818fa9de9316b3c79627400688daccb7d23d96e6fff42d7f63dc560675861cc35f5260f6236c922dad351e69ccc0756f8ad67b6e323a13faed0408200a0fbc0dc3780b22e7677cd3b232237aac64f862f33f64084ae221348546aa298c789a0d17c1caf968d3a262a08ee9bdd7653747dcdedddc3dfbd79be29c625f919f786811dd8ea280a060b0631b69941e50b0085f1dedd87ba954b097f5cf7304b2cf63160351c78fa4ad3396b4e58de021136df7c042e51440bf92556677cd630be115e14070e272fa0ae6a6f9fec24bca37cda4a40ddc37c9c204abfa6af193787b6718eaff64c0ebe362171dceaaddc6cdb3b88d92613cecb7c832ab7ce503aee2a0a64ded8c213b91ef35556b84f542792f9b5321002197392f180ee9a78cd21cd98333c305eb1f53372745721af6deb742a1aa622e7dc1964e377dbb9d319ce33e94d11a5d211964bfccaa969003e1d533537ea2e52d46f98bf8917f57247a4fea49c91f6711361f04bcbb320dcc97ccc81c84eccf956111de122cf40fed5e855841a1b4546af842fcf0a4d1645c3fb9505e887ccaa61389e4825dbb23ba77335633c895b41279e46279e02b18e96f566753825a7fe98c2c62fb9527edde51e43ae85263a1ba44096ee8135f2030c7efaf90720e8a7cf44a58953d3d6903d7390dd5dabd20ee242877b680de21fb206a75bf68834759d4a87d31dc2719b513ef806da4519b6271411bfe9afc5b8f7b1b6a0cb0ff02895ef908066ef2609a9730be939a87ce91cbb273e7c442f724593e24b06a9ed26d1ab4a009e67cb218ca5798f35c26ca5b71a2b065c7f52070d5f5f6ce7389f3654b49e888bc081df70334bf20e2c7b2276c07dfc2dd78e0fe6f260f2205c60f882f14180ff33400f5b9badac39d18f13ae12cb7654028ba0d88209d560d02dece6ca161f31249b7282b149b84d973de88b45044d236c23861fd6bc3884989f8a667dd7226a65b7419a1be57b9f50d40c73006ea32745945deaa4a7cd2cbbcddfe101ca46c72129a295db4c91f21895fd63dd4bb9cdaabecd500475633b252144fc64b93ccd6815bbfa47e73833511ac69fd38559a9a08fe6bf67e6197f2fffe35d51b0dca43059e8e54d206b7ff5fed050e71462428f233764f9cd883067ff7477984140b0acdcabc8ed97b6c001a6bb506571f5989e750145cd7182f8217b1e786469987e171b8dfb6007d39873a0c2088b278a1957d20d06073cf723b09c01008c52f118d5886749f0625dd612e5681f8ffe209a0124e6d0df07a9aca39029feb3de5840e3e61754e319a7628628ecc7312b19ab64cba12aa665c25348be574315432a751907eee057ccb1655b97718795713db1a76ae05bbeccb77395c9318e8fb539bc6790098a7190775ebfeec78ad4fca06954db4a18275fda419023f85bfd0a2fa705d335333ade35d661170fc0898a8f0759d3b2bd097a2080119db3d99493a626e3d0c5e23e797225824442b5935c28e2223020639764006eef088eb8f57a9d129859025f2e1d5cf16ecb8a6bc6141866192d813765ec3c215f2cad6c0de3cf190d94da301551af1847db2e0796aad32049ac830c25a10fe15fabe4fc74af39f9285fc19d6be8a76e55b190609581c8d070d0f708b8230bd269ea6c1f2d7e9681009511c0c9d4394a90b6548963b35399633bbb9b054a6b36c44f28cbb1860b1fcf65998b991c981b528b27147e7000001ef66a784360cf301a1bea9274bd7ca70baa9ecd245bf84fc825de6e579c629aee8f7ec0e867b30f742cdc2e45a9edc8c890b5075a8bb4e7c2df6c7e4a4159c989d941d59451bb67695a00dc60474134656936efaeaff697739af4a57f9272a9a6aeb2507b4b536be4643ec2189681bde910fe99dca4479c6681937a77e4f1432261a064efdde8819d950b5b00a4bcb1a4eb5b1a696ea43aca006ae917eb0ff5922430eb1f772f6b97ca30a578b4ec97585ba188025fa12ada180e563e3387a2e2d875e6db425555f31b79dccb1475a24fed96d52316aaf6a5cd932f85cb107c7f9824835859b396ce9302b104951c9c736befb0704ce8f5947894f4bd204065d4faa47f212dedf21149a602d261954d7cc52a896e81d7b578b381f9c0bd7694ccc7bbe1806537cd04354c002680976308d4f637af2d4d988beee962611a905c8319e3d360445f3741e7977eda96c0678465a7e08f367be9924f75bfbdafcf078b89221532a0bf145e6b5b9454498d4b35c2f993a346b39bfe603c57969a17083a49d724b09b6e2b92adf050c6e40aa8f90d38b5bfe7a3385764c05096cec3adb24e6e29fed5199b2966911bb70dfd6801ba3288ad9728f00ebc8aa431ee24fcde9f0457780e88a57a7872734befd65c282c5385c13cf1b7e20dea9f92ea843e015f2553c27a8697e0de286f011d7de2e5f185bba452553ee65bf820a04309bd75dcfd79eae5366060f09a9836a0723c4e9beaafd9f59ef4c2adcafaf8d0446cb7f84699a7efff1d32411d807e771e2e36b7156613f36246b20cc94ab67013d613b6b38cc7799445b435f1f8c0ad3e8d2a051575de7f44e10f00f320e664aeff8d9fc5f4ef2eac3b64a6db536b18d5e135d0dcd30746fd57fbbfd3c5c26fd1062e76e9594cb2dcc424cc8145025b79eff727ddfc86b24e3bce3161eb5a3471a1a60a12333c7c49496ea072ebee09659f78f7ad3dcc29bb7dabd0b1a4233f623519f32b6604c9feb7391181b2f6d304024dab983b833dccafd795e83f1817a87d00618d12008456ff77f440214ba82fc88143e5ff403c07a82a3fb39ddc2544d7d45ed2ffc267034b3a60291be53480a266152a8a30c16789d4f90217a19f7e5b4fcbbed992bc6b064bf494888e01b2b91d04d362478b4f6a653f4b7bba916655cbbebc8bac47745b9a16e34e4c709b8b05ecc39eadb585c847a02bcc593d964e63c423e414ead3113cada04b6fd6db9fec86f951f3a7b51193ffd63c8f81dc27106535c05c26c0efa52303114f43ac43a16f757a8a9e67f4d85f1f5cddbc190dc4f58f6f6333e0fc847ae275addf512e75c638f9bbef4461a0be4eece9566d315e9aca6265c8ae288fdfcf474c3e4fe3023cf1d4fb04e1222aabb1920cc118b7f489da1a1994649d644482b00764d04064ba7d23f054957b666d8012eae22e413485bc2a8d3ee75fe0a8bb80582f50ddd3f5d6751d44c63f76344f6d220aa133df4de18d86b5df2fe00c6a2fdd0233b1849b5a644dd3fd3b3d137f1a4597402c6faa9fac072a9f9c55106cfa8f4a36d3be334585445be77da1e8c072b20d8da1d464ec5053cd0b562f183cc8d8f1a1363aac40acef5dac70985f2842507870bf9dda91dced1a5c2c9a74eb0be67ae46e4ef49945208933da97b2a177ba5525859524f4c394295cf25fde937e1b4c02441d128a4345dfc4eab765004af4a97e88343dfd3e93521815972bacb25ca5b7226feaa98986cb2a1d4fa6634f04232adfc92cebb9f66b7bd5373c4a37c323f3301fd88708c52a01201ea30e6194ff2109128b318dae1af48bf420f4afa8e5b18236acd8717fbb265a7a72bfe1c631906c4b794e707b5ba2f94d243709a599da6e28724bf5a080b193315f9bb3f268f3f0a2980aadeceb715d091d83b5f048556b8c65adebea09ce19c6a526c00f44f18cd92a7ddb288bde3c681a513c099031b9af5da8f94388e36d31097f1dd3c128b3a88d941841c5afeb9cd295752766d3e85353ca02e3fada6f6c785d63f715bbc51cf480b4861a3feb90280b8b1276aab953290e8c30654f6fd3d11a6dcd1891dc51e6a51e5859a49c7e1fff56aa0fe80d9eb4d97cfca6490ba583f388702a3a41b23787d1b4d6aa81546e6eff9cb013a3fcbcb115e3fe7e068d8b21c420dd364283e4f1a36bc68e9139476546dfda5982cf3aa138181aaeb04f7d2b2c49276e90ed4d438214bd8d471df05f61c706ceae72ce548023919a98f7fa3169d0d467f982154a0f714c1f7eb547a58e98b57f43c4c5f33f6ca381024499232988d1b58b565ab2435e6cb9c35f25b1209669968f2f587d4a73aad5eb9144dcce87c224f6e78cc906b9525cb50775048c6a36263452d3af46260b8f72a15036431a1e6830fec2f8393935609f21f119798baa429fc4a201fd789dbc597fdc1691e8114849d2451cf3772b9178fe2712b59c9745ea4b8cb103924d3b7db400e3d9ca1bfb912daa478008c21c2345ef9aface9f66000388bfadf97ac2bdd523d7da6f48f88e828bd30a5bf9e5751a096e5de821a194d30a48c430c34da648eaa5bcd34ea197d40854be0e927de87d5e3a93a8519f5b56e7a978271d207eca08f90e0197bff84adb1db5c48c1c899540f2066795462ab2d86a01870eebea1f67cf280b03ba5ba14b0ef7cc42ee7083aa1f373386abc9160c50262d10f93556daca5a180bd1213564d6bac95973d0c9519c0d8559b38a2b334645a554f2d563069e7b72e3d3bb89a89ddda15b31c30c07c373e39b5e674863b72ee4e1fdb42265febc6c16a9df5f2f8819fbf7666f967007effc78408f46fe50f619187349984d3f59c7ed3b46f27bce1d9711ce83e43a6f657d05a47f3f5f4ca39da20a6a947ebeae524270ef6fa44fa952dce8f527eb6bc8818319e73b05a063723d673108e2820b30285d8f83eb689e2eccf6ebcf2ddd63e313bcfb3e9497f814993a251420e79efef3004cd65f44cd16ee16c4777dd44abd9eb8301342b3d53ff223973471d2ec5d2720810eb5e1da51ff9d583e1deac8d97aa84da47e315f31942480d10b8e3f7aecbd0b160a11084df7b12259a0d99ddb6e606f1439551202b33c5bec2016815ed70de6b3009901855c7a3e90c515a8662bdf4827a25ee665ca178c151ab0ef90f464e42b9cfc00fe404e2629087cdb0b57210d77238fbba36f7d53bf5d302580c34805f77a32ffaaa06df248fcd36edf08567e5c99286b0ada10138bb8db9ec1e7917e5303eac1d3b7165aac99d97095718f43d1e1e21f961c8604360639657878cb8d2a988cc6fe14b4838471e93d9b5f4000d6bd16096b047656f0a3c4a6fca24b4ecfc37a1e300fa3b13b437eb3db4112ae99913a82eb91ef2dcebc719aaefc0e0301a1d18c76b31ac25d20d8837c504df01834f6a7a03d248e4bef6deb4e409a82fdbf2cc780073f4c748503d9a881cec4005eac9951d46c53b792d3c6c732168496899510370765aaa9ab611210a35bd7bfe0938d4a685ed62e1ac8a09346973a91a5a8c939eb7243388edb0db00673a351b1733beaef82776b4b567812666fe0114ee0617e2340b0d4f0d4358080c7a09a961f25cfdcc539ef61621ad90036cc9e15c009aeb6b252452f3e5d3f5d3094ef5c23e793a22fe130e3898f7632c0278ad9cf005ac99510a95d48a03afdc33be9ff03cc32c40af01b2832ea1f51d181c14b186f5d155afefd093e31f94be008be92bc005260751aa4d83009b20357749053ec65d5aaf98f595c1f185807ea0ef0ae10572e683284cf7f4dbd88b4def0249eb4f946a578153bd4866ff0ffd085d7d6768c37c65732b9355e67356034f17a9079541f243c462b031951cae285944be967cb6148781a62b03fa70a7d4dbc7a1a755c2b4d1e90b0d47d97c14c3272af5edfa3a6fa87f3c0a80879883c2a4cdc96c406b3e461c7281a6c26a1ea040428e70d2e74caa11eebbac4639f8decc0edcb82ce7b68c590a9b4dda57744bde3d7cdc9e3c274ec5b73db9642d10e3f47cccb4614017154daaa39991191e2f27352180cb10faf3cceab4dcfb10e5234038d9f61c4e06106ec690af1cec6921170f0c623e4e04337a7be0ef7a0ee1230da2734211c5da6a171237cee84686c0ce14fc6553531cacd0e40bf13ab6a12841f6833d39481fde961702522b84588f44be52b874fe68e5fbb461d716d7a9b49a923f02208ab0f55920afcede5c53f3ee39e083c9e01b997d9a6e0f04021e8678dc8f6a3648f8783e7734c6cdc9b8d7dd10a4e79435b3fe402733bdbd137db27667a7266538da8747be52d6c9909721f9b9a13bbeae1c7b014423a14f18913403b0b1bbd2ec02f1485641a9286ebafd37018471432318e0871b29d78683042d07c6bac0a083c06014dee087606b92c2e9219759d7bf85673c7a398e72682dcf681f29cb410db429081be670285e91eb4ac28c70d5a9504eb9a502f6382b9f6f77c250808b97d1f5071b1015d55002acf2f9f3a09681050c58f9b70deefb7addfc0d6b02057f60426e21f6236cedf3d9f54eba4a743f5e29d1139ea8ab6681c02bc728848c03e290bbca49dd959b82ad7defebb7c9d789696dc215215cd533684f108c8d24b2016cf0f39e0636645258475393cad28f784371b83c5c3f7772a4a9f7dab0d241694cafde3a086230b668b27391220a6af86bd93c4264d9a1b676c320626ab14187f51caf9a374a9961ad5064400834365d01f6f43405128d12353200506d6d3c3bcbc184c7defe8346c67f45a8fb83b1b679cec59a613f762c992583b577be8082fca01b3b230b4546301e02e3b389326ca9eac9abcec968451540b68171a2ec2b6751f8218e2063df99b88ef45c76447dc1c6a6bdc886ee0fb7322578d10acb78ed89f2a9a06890b80ad54e0b48a6dc8ac41c04c35019f06a57bda24a7866e461ccf5055832ca556880bd87a418065eabbd111f1f6006dce20aa55efcda4387ba4ab633d31679eed833ea693f82c6c6fb7a9b826fea1b3d3d1655b442cc4fc08eed39567688d5a10178a766d115b21a1f2e59dd32e0f7c6a0d7c4f06de1659aa683b09962e31a863dc582b2946a1de2fbf5c5aa4d01df379e4a7b78ada380cdd52ada2fd737e043546c941d1407e156953a217cf7f7711aee380bf4a8c6bdd176efec9010a614074131beec2b52718696f623212a6c01d18ed0e23c6b8bbd3fd63e531999baf804e971e1de1e4dbb439446c59f9da1b097a2a95ee30bd0b2c7bde9a7d03c46d8e6ab01d7a59e5267704fe8d4668b5c82fac7192d91a60d547b123dc8a8255ab43672412f15b0f1db95f0479fc2297017f4336fcbd9faf54bc5495a22de5b0d359c6c33e872ce0fac226d0a1fd042d0c6448282955b92cbefe9844d7cca12b4a19167461109b20552387d25d3a7ade56ebb79441d50497b923651be1551c5eac20100e88492a54bbcf211861b0e41204c5336671b5123d2317e45489b45abc79fe55e0b5b9972d21f0199994d979e8111caf33ae07d13a15853f88aee26a0460522a3f9615954e35aa7a3d9fd064951b960a9a15914e2965286d56639043f5d4dd29a364dd73414d0643a9550dbdc940e351ede8c5bb304db3158c28dec2445cb016896227985d7588fb225afad8707771f0d78967d2eb09f6efe21c8c648cc8867914ce68e5590d396c74bfdfd20fe8aa53cffa8b14b3091d466139a97c82b6caefc0ff078818a18f8ec208c20c84fb214b2fae3a80d2ca189b181d6f2a9850b5d79920069086930a0298df90a71ab052d52fb2507164f3c1b7518c71fbaf4ed5e12d4dfdbee5b0199f4b7d0cf1e237352891439c9aab3852ddd268f52ce00464f03b6443aa40e4fef5838f2f5e90f3dc05d52d8a9e2d7d279615e5eb321260fd19105023763005ca06728d2bbb5620abdd05a5cf0cc8c0c24d8ff86d5ad0223b3b243bb50ca3fab25bcdc39760c04d8f2a0bf814f19c68119b5c8f0fdaa0bf7aa75274cfc30b1672c1810a7c42a0f9ecb7c8db58786ee6a34b91f792ae2f7a19085890aa653f182c844819aeb445b387341bfeb21129731307fafed2e5177b3664611e9b805e242207a2090498f8d3b41f7b4f03083e21dcb35713fc0759fa9ff6f67319c2f6377a7a95895e2fa699737cc390bf02d15be435e2ef4eb4678aec76e69264b880090eb241c04488c94ee9beaaa43e3f6c40d6a8d637a048477170818d598394c88540d07c155a3b1baed30fd878edf0828862e5dfc9147aebb178beaedc8e3919e2b33e5493cfb79f8c39267c8a8ed757a6bbdf93bd0d2ba6e643d076fe1fbb5746bdbe755cb2a665cdfad65fc150f7058cb38e7190095fa859f9d51abddc858cd2c86330b585d53f80d717af937454e00f735ecadfc0ceff89c2a0d9e196ce794d25e8d72a55f18bdde7fc8ce1943b08721bf63789929805d48a3ab52276c320006f6ac1e0db86b8703ba61986ee8950a2ed1be38a44defb2db55393de7aa1486a1e02cfacec5d1465a63007fffc92c5af01fab2c09451eee72fdea689806842475a2a518a982df3aa8fe691cab893add33330d7e8a17e1f3223a4b0c414303b7415d90fcad51693565eb4b3fe26812a25befeef5f5b73fbdfe182f12bd73c77061949c82517d30cc1e22a49dc6198c4211af38838ea5b622e5515568b297eb1eeb2639e09582b1a3704b2d636335d85e916e08a53b1f8f175155a098cc6330e6307c7466f8e790833be31ad2bda23d935b7fa5f68d74062a8f1a18c9fb7b0f80392ad1f78cb5b40f61a7220fb79caf4b80eee42b0f6c17df375e0b4fc9a7100af0c9c976cd33a37189c9ae39d853e4e9603537be8c69a6eeff1522f4238208c0beb20ff3d474a47196b0433ff0bbe60ec47e1157bda2b753de0dd8e0784761f146a80949dd0bbf526b87879ad9320635b3bd9df280018b3dc1c65f7c848dde78b2eb20e7981a9ae7ff7a91f2a8f5ba347680408afa6b659749bb26c9c48f72665d097445d2e7e4dff201c0ff010f48fdc207837713eea25af7f158f73eb610e53462024c2c9fbe75ccea90d13bc7f1e448c4b36cfdea86c11641f7e1922d00f2f9e1d4864c91d40607c97ac8e2d8031ebc7f5ba288f5e1337dfcfeaf0d3d5a12019c0fe4c76371811ca54069801aba595d32d7538ae73707f3612655ff26c88d4cb4d8831d5afc0833563d4ac2039d2ea97363434801717a8769013c11ac0ed6ae54b034d4eb059503c60106a7e21fc60c36b599fc90ef24603d84dafd0c4176e38c3ce392f7fc0060960cda47953c2990e57ae671ee8378368294ee13b3d59439897668c106385d9decae81d59278fad64d85ca62f08228ceecdb38bdb70f3f1197f809e9a9a30a6234447e6526f07bb7d535471cc348e7012623b308df1ac4816a19b529cc81bbba2c438872b0da2afca4d3496a304c56ad403a6070ffbad1d02dca4c3b05d90f54f1d82f20c09a1e05c7bb094bbe282e06ff6fb91bd5801229eaba3c1d71676d787b026f485785e9c17993d7ee3a27d53736e86c814a754cd144ffe2283c1359bdbb09422b45c6d29f592cb46da5285927d6546b4554da13cc65ee1fa22740161bdfedea00c7466b2643f0c3005eaa968856b49ad193fdd639bfa7d1e3674c91c92b9aac2bb01bb26b0a6225e6da9ee4f4ba6dd4d75d593ce761abf0998d6bd6cd2d9d54eaced69b7423d572862cb204970875912faaf2350f53e0a0d36e159c77a6f91603a4902b2519dd0d93b259571604dbf3d55765335dc752fc94b23599b08b050c2ae0b5448f0f97dba61425e89fe7d4f692c3e57d0838fca8777e9b514e9af1ea5b4e804608a616539000d469c7d6b33ae34f0f729c360f204f912944639c82ad312c4f31eedbfee0e00b7834297eed56e23388fe37b328d8ae927b4a8efe216611d8d97d8b835619f899c9581c2e427ec6915b2d2a4ebcfeeb0bfe9f9801f4c0275d10144548d8bd19c13e712d93349e3141c881a715d76259441ce4a2195ef70f99707f86991fe35b0a36561d9b11ca3fc497f68c613581ac83b8cdcc3dd9d1bc6eeffe13dddf0f6b95c135c8fbae10b46ba6fd8b91b427cbf79dce92b382b5142dc4469d28a65ec97e83913bea81ead74abf065ad254eb6d3bebeef60a89f5a25cf5d00bbd09ad583fdd17e7a6f186f8179df9d91919469b5c82e9045c8dcc59aca244253ace5f99963aa04ec1b91588041aa28566a89a220a3da54eeaeb5f889d87c1d75796bd00f5437b901c80da7cceefa3254802e8e2d62050984cf78fad896c8178049d84be4b4e1d6a1960795bec6df3e9be32b2c7ae6d80041627b398600d9eb6b7d3a25f718d40b5f18f5384d27782b4de90bc418b5c232b1614e4520b9fa6b47f5700806530b95a170921e1a53c4fdcba30f9aad59ac8b28710208d5860a529e1a1ae1208dac52ccc0dacdba22230d71b63b32c857fb1ebfe939d5fad572ae0828836a8d9fbfee7b880cd3a4278e5a3463b394849e731c6ddc8387ab43e443f6beac6971730dc49f700632d089cdc7e00deb0593caf0ec76d05df7b192f73f23184d42b4f7ecff851adc419d75c077eeac863014de8a58f9fb325ca546421fbad6c62aeebb8959f51e7a1ac9d29b9910ada085c85d5f1837e1b57ae24b4b93f5df9997cc73e04aa36d6a07e0d550ae270cdb3be37da01e4af63c3931343b912cb7debbabadb7b522d5541c335ef0a5d0c712d1e5d38de53f40df5585322467df7845f810c68c76dda9da9fb5a6b7d92fd5b00e9019dd88f5579c552ff95aa491df6dd2fc09cad9ee085f17ec652a4a385ee91732c0557620bde0b8b1a71d7e6103a8e90330d7f82aa9872d9202a630e76ae9c1737d1b658b124a124bb19e866afe9ccc25ee99b0e00a8214fc37ddd4600b27354bb58b332c9d6d78e690052955f4abb8cd7492714c59e1f1a848db44fc601834a812196c18189c36c1fa60299c464e1b246264be61436c4dbe08be8f782c1d1383b32b84e6fdcb922d348c2f6273c4c8ee0524989d1646388fabdbdc56fda910ed365a5cc8694d6bb314956ae4b39dbf999381cd7623de15b9becbede367f99c1db1d373769d30db38909b162e4339603e18e8fbb08d1b416463454ba419d9045a350749ce859abc5cfa94364b688a6939f88b325fb96301319cdaf405354b9cd62f8dd2c2fb9b90189a60bf9ab11f3108cdb9bf0fb5d7537f67aeead166028662ca07aac57fb86704e0d83217d64bd7fad12acf24dfecd197e25ac6bf9cbf0cc65c9bf148ec0cf7fbfd71dd6ab89358a7510a4f014879568fbc7aa6c6391c19f026879578348a59c7d35786fccac19f0bcc5a7d790080459e0b63d50606a551bce726cbcae2c01949aa3d35d47a5aa461d5301fd0b5069c03439c8304e5e76258283ffaa5b01f32505105f740db868ff561dbb0a45b2e2b72362250481d05083b10862da728fb926bb0b8ddc35de8cf87d4169562febd1a524e9b533ad75b41e59e1c8a7c1cba1c9fdcd16eada51cd5d86769b9073a9c442e7acff625a7dd10ade5c05fd17f1079c86334459d97ef4ba29007a5b4a64d804ce84b38bdcd8e02c61d1f793d50c60c7578cdcef582ae4dcca74625ab6eba6a2828937c2f9e6ea9a56ada503ae4d900b0d4ff84f7b01c51972891285f8676c659227ae3861b0efac63ca07668524c3264ca2d3ae502a0a342f60856bdc840d4a0d81f4018378b36c0cf7805f6b52405f25a29b75417622f25eff1ea2337f286acbae0bfe368d0c4580b941eb97328ad4623d743de60613f6cc48f248905479e7467abc63b1d0d232c3cbdd3cc0b05a7d93b49cb47e1bc20b05e4be2c807df9dcc11ce60e8f85c6d8b2cad1e9fd424b5e65078c778c41de4972bb1136dd8acd57fcc7f5f62d57585eb39d43d807705ddf6e0b25bbbf0ad35e417c713aaa90d1e75a3e9e411b583137f019b9453bf00d948ec7e9b88bf6e193e0dd3f8286bec8f32ef8ac2c8588858bab1c984295b7a44a0f43be0a3bdd44cca25f2c6e344304047e94ca94bef7d4567f71e1cf7660284223276374c01ac173b543217e095f77ed05cacff9b88752b540c300f6ab1612f8c8009e470f8e2b7f3853244fe9342640b5705949f58279d57d5a41e2b73ed2942981cbd13e6aaedcb0cb56dfdac427700bfabe36698f757af72b8ad9ba5a25eed143c1bfddaf0f0a1ad613d3857212e6a152a0bd13934a7f9fd567a5230516468f2deb78fac82a90909ce81073f2ec935291c3f09b3279609283f490fc758819e09d92de5f3ebce545a35d564e576f67f45158da1d4646f8701bca2063db25cb02a087817da464a2a48102e3877e02aeea535fd4da1651a1dd565618dbda9c8de4c4fd77c41818a9050688b2578ccfd1b4e23c17de61ac40ed2d61167afcbae548a807fb67c010eb26b9fbb4ce3791f228e70e06b48e8bb44086dc5f4072352bdcd1456582f206bb3c078d09787ab047ef547eb688f07e30c7dc30870156bbe07a2cb6f716758274632606f0089d4ecf3d73658cb392a0528a80f19779e538d600323ecab97a0e33e9a25d1817902306e131759c315b6857453287c0c46930b4e80f0a7fe4ee082359b21a222a1bc1d4566762e9dec8f5dae24eec8ce4ae9b51d492a20e4f923aeec1b74660d4b5afa370eeadd288e63943c6c25806f60a77137546ffba9091b0ccaf2093b6ea353abbb5cd03c56ca06b08a4743232cebe01817d8f75aba377972b0c7386814b35c940b5b1243e75dbe67d8f434ec204223092f4630adc1ebce4f276c2604c0b9785106138d63df3fe69681d790d1a054d1c18d4ecc2583cf7fcb087d5311404e5a8a51613f932174ff93e1bce5580b80abc9a025281091d46340a90c63a0ae926344f531487a6dcd78a6df4dd7fb8b419a6c9d2ca3031aa8c28b5d30ccba9a0ec5922617dcc1ebb501475a21a6bc70491b98de1303dedf668a235f05dc25451a34654439ef38be72d3c3d1e6cea9a2f3a7aa3040a48afb45665745254483e64dd3bf0f21a021ef8af767beef6fd2dade7b6fb9b794324919670867084508159ce241391f8a15cce82573d99e4721215b0e69f32116492f872d7b82b1e7130e23ec1d8a6c5761cfa71cc4d0c721fdf555917376396f38e47c05a91b08220404bba6b0ebcd3b8edbf88d0d39a72b67a753994e4d3913131393eaad16325f2b538dd5e9baf47495313131c9549ccd76739bdf820809827f88030df156557df97d9021df97f3f6e921425c3349fa97ced70f5299aa4e22e71f80ccd720383f3ecda87134b665dbbfdb6c1accd7f82017e69036af43dedc5811799099f7b75a8c968b5aa53a3950c5189732ba36d197ffcca9413a362f833ada88be74727490ea2269527551261a5d8e32bac4b54a91677454ce5fd6589783973dc3ecf944a508ce133991d3245a8489ced3292f60a638207b782bcc2115e044b3ba847e7e5aadff71ccb97e2ee70d290781726f8abb6a1512fa11125acaf4b9a319cf01e3e75a2232d7653ae21163cc43a61b7f0d32027feaefbcc7737e9f66e1b0ff8d7bead2e777d8b1483211bfc683c4af9f45b2c75d78f44e63f14642f0e78526267470ba56561a0511b267ed7ee62df339dd6920d3b6e72cf2965bcd04ffc45fe441d8b1952157ad80f1ea3ce6398e35dc98c70935720005f53eb814972e5251f2a42f4f33c98125792b47d3189d51fd64cf9f547bcbee40d2d122cd9921cb38214f5697e9aa22fe39ef794e0aeef0f01dcd2ae2f99de7016f686e6e6e685c2c0ae1b5f3532ce2f91d6dc4d22c9adf791e2328453ccf7a239da74639cfa3270d196408c9d344a6bb88e76368232834cf13e38f5e34ba88f53bbfa3ffe8455af03b3f027ded3c110bf45797b3a6ce4011eb6368a30de60b5797ebdc6258f05acfea22f5cfbfe6d14444a014fdf3b09ec86b9e8fa17d54d78e26b2f33c12d8d19345b2a69e3734f3e666ded0cc247b3e157948223188fc5bc062c578124a510ccda32d2089b0b4479f8764d17c8c9faf1d9245a3591aec3ceb79f07c0ccdd2af2745f67cfa379466521a1a4a3b3a6f665ee88d66d2190d79c81d92488c67e9fcce4b20e7799ec863901a5717cdb348223abfa369e88d2e799e88cec77831e7795e7422a6b5e753932e36bdd5a0185fb67462b030d68941d2a51f37dd79fa19c88393a44b3436714c2239cffa1d92f544747ee7a994148ed40d95da8941ea3c0f99f3536469a0f33bcf43e777348f9c67fda4d134a665c89c8369ce5325a7b11c927271973f5905cce2d0db796fb5bc2585e3230da494c65458d08fd14af3294c1b3594066b01be699ea563ee3987687e262fd190b5c8f4a15f436dd414260dfa744697350434d3a7359cc77ffab331975c75d618095c69a8a555afb5d65a6bad4cc250e7ea129fc5037cf1411edf8f19c4efb94ed0ddedc67a02196f501a9235dc55b1cba02293d60aa91a214170e74136220265e6dd841944542f3083beba6acab905de4e65a02eac204e2f5e359ab56386e6c397919973cefcf44b9a65e67c99cf794e994c43ffc7ff0f22c4c8c78cd498a5b254760e09aa770c31761e78cf3d11d5ab5eb45b728e4934876ab63f03e690b7c73999f0a5cd73439e7bbe549ab5237c9f2a529470c4fc11e44021777b4fc1a713739cc8fd383a753a6e6f15f520f248407ec99c95166a6cde62e17f244b0310d4b3ba42fdbdf72c1edf7bffe9210ca82ec7f97ecfe25ef5472f4fb32e0f56f7e37bd5177dafc29d2e12fffb4f1b893a08a82f77b923a77dc31d44e5ac95dcd37d1fecc8f287d57d24abd33c42cdc21f3eab7bf18f5e1e8b8766618d9fd5e9a2f0456d04a57ba30ed447af8f7ef0b3af2e77f4e81de09da20ed6dcf66a16fd72d6e8d482fecfa169abd17e708cb9734f054a5d8f53e720f27c23a55b7da54c1f865cce5a8f1e07b0f9b2c70e4bb78dced555675ceefb9cc39f9a6c2197bf417f7fa10c727e19199907694d4d4d4dcd1fed1a7286863cdaf4ee194d004a23d778aba7ccf8f14f31973d1867f0bd05eaef896a06d2336d8fbbfcfd26230579bed338e7654ed81caa2d6ff5a81c9e400298600c24597cd5ff84b5a6227790020075eba706f9f8eabcfdfcfcd4e3fc580522c6d179297871dc79a794cd49085b4af0e18a06e8a65fedfb73d0cd2f69be317dfc9843d5fd68535dd20c4c1acd8714752a66d55bf365a871a0f11de87bef6b70e06e0f480edc8d835f4562ee31891f879c791539f3204896cf7a500764913a640e39a74b66becdd3901eccb77970d2d8d0d0d0dc7d43f33536244d8d98f34a8be2ab4abcc3f99ffe911cc99ed68c1a42b46cab8c29b91cc739c739de382e019c3f7b621ea3b573a649ce9ded4fbb4c707eaffb3c4f5928b6dd976ad26cc81cf222ef3feff1732c0dc0ff5e02a09680a785b86f85dce99f96c692e7972d1c5626cb0586a6249854d75a16955cfefc30115fd4f993a2b69ad0aa7c9a55b40d0ed9355c7df82a92a5c1eac3950e593c444a021977ad1f8c1bd4e58e0d64dc5de7e9ec2debdb3748c351fcbeea12c8b824cf5de6397acbdb75531aa30375da03efe9db0781fcd8ded34969800f9640c6fd7df71fdda08f93d2a8ef7df7def4967f4c545fe341aaef6ab8cbe61a845ff6c7834106152239bd14402e5d6c5ba06a332c539c644f9230c59468d294182f37292e5136da6ccf396d92284e2f66d25470d3443c6923793e408a0c14e61bc9656b0aa1e5219583214186ccdb10212121a1214184dc820819626b90213ecac965bb73e9600a5187c900ce9eee098b11d410eae004f9870f4c6f4a18e7dc026343cd98261f64c4f063e70e358c7bbed39eb40c310224ea8fa48f15b9be9d35deca795e1921c8f4e73741f10ceafe665fe5eaa2df91a3eb31d32c3cc9db3be77c3badb5f6ae6ec77d3727be42ba7d6fc79153dc2f338932c05bb5ce5ae7acf34e3be79c13055b6bcdd95b638db7eaf8f3738d07e15725725d9b75d639c588961662a081d6724d87f1e8f3bb3927ee640c81a95bd1b39221b79eb4e2c7176cc894882cc3c8c4fe018de145a64bb116688c2679e09772d9836589d326632b4c1a2cd86c537559186c069b59d8ccc26616366b22d3a99bb764907053ed404377bd12b99cb01ed56dfb615b9876a5f6a9f745f7056e194d7269c19e2419e791abd5a095e6a654535c4d9ce26ae11457fba6b8da9411d989da2e51b9be6572a0259b85b1a5551f32dd5cbc55bb484d9fca79315dd56a6e0a964beb54dbdcd4ae5c6d3b3950978a85ab511bb689d2a8514c1b1d501af5837e385057a5e610f7775251a718b7e428efc2843113a5b3aa5845f705fedc4cc06d39240e26666afad8bc55bf036ae37a3169d4af5bdc755740c5ae17cce865d7e7b22b4db25daaab3ebdddacd3cd3addacd3cd3add5ce64cd68969774c9cf8476fad2e52a95e0cc53ff2de282c0a8f9ea8c2c96892cb7a67170bd4add52099b7b65ddf3a554bab41aa9fd9da76a95b0dfabeb6987e698ce524298c731ec77f0ec95bb5e438981279979cffd1e66033651e3919b5b134673427cb7a756ddcb57132991179cee6d75dd65b9d554e565df53137e33e094e46c1e92d3b9bb1e8ab9e65ad18beea45ad7a2222c521cbfb30b47615eaf9b29a45f59c3ef44b9f85abaff9c51aab41add68f63ceadd6ff38ca623333dae803afef3fbae5ce2e964b232f945f6bcba49591d689b4b4a66d6dbd55579daa4cada58f8d49bb3e0ce39cc7f16b9d7948642a65f3960c156c5cadf39514f58605164eb3d96c369b952e639a61ecb719bdcde8cd6b22d74a4295aa37f0e7f392e99e52f5bb881b8cb01a3366cc181ef665b5d1075eb53e91db29de72a95d7acd69d5e518e73c8e4bbee42191ad936df296bf0c156c939d551a387b26b561bf14aa957e65a25f659b665b6bd3a60f54ad2e511a54575d0a3975ea692157cfa272d6d65a39ae723adb8c33ce18678ec6808ceb679cbdf5b80616ca00d32c0d6f418328eae1ada794524a73b05f605c6606549c39cb71d776ff5383ba9f5151c85f98c277b2eb2182a00782df78f366f8148681873bfa8f45b6df3d7d20de83e39ceb541ffe286c485211a50e7e08f93c1c9233dcf579b88b6cfd430e7c70e01fd698607ad8aebbbb5f5b0f9bb5e500ce1e5b6f489caf64f717e4549d4af5e148a9be8eeb4221e28d215ef27df1c3f70fe242fcc12eab9e95f3ea698c6e0cb627f1f126c47f08927f5ea998e03ce87ddd6c776fb5c01dfcea5578ab5ea5cb957ebd77e28dcee66b74996b3eab9e136fa85636dd156f745e87f3385ff3e5940b7a5651ceeb60b104ccec959375f6911cc9eff90d828f7d71c89f19def2bf194c1f7f2297e55b3b20eef27a83780b4847d627aa371e791dd7dae5c774f95b5bf30c360fda58a82120f84bb9fb297aff1b74a321b025d9932948494aa0f55fcadc7758b2f7436ebee36ede717e14ed88f3f6e7fc71fb569348320e79430e7120f0e983460e3491863890ccd33772a0fcf4296cf5d4ea00bfe671805fa3774de99f679ee68866c65b2b585efd78ab355d572586de83159c02998c86d050197d42a750249a4495c0ea59b0bdcf14e73c8e38eff842c89e0d91db904614667443da10551b4cf66c8e9c1a3284088aef518daf9cc0492bb520644a0477bb373724ce0be15485c1781b57c8be3343e2663dd7e49d913aab1625a34dac69a9537aef0d0a83cb65655df5bfbdb07bcaaa7f854f5f2b4bf3d5caeb05b32390ea8bfeca3aad766ddf03b5c5813820de739ef5dccee37c0f9d1f9fc82f4b039ccf791ee3b334119d1f3f47138152a4f3a376223b8fa367d5e58ebd7a276985cda119384f593c5fe218ef896f693528869ea00ec9b279d61fbd7648968d6669b0f3395fb4f3396f63a38b749ea58d705ee78dc6dff9a3978d4c4d6263e3394c55a66b4f4a28bd0c8dcd8ddd25072a2f9102aed24d427fd6d97c5961369a01f4d26a9095c9b0954d1ffa443e3ece4f7107d2f8384f6b8ca624b0d826270762fdd4a035879f0c84223082e390d7e62f17072aadcc81eca67fa11c683e1d9164d3bf3507cae9726f5436fd3b75c5781012387b3ac2894d9f43f2200b6637ca81e653d4d4a67f6d35887bd1a7b1b19c549303952ec6c9814abb64e640e58dd1689c9403b176143d7120aeb669cd61534e0b962807e28ad8f471988ca903eaf6bf4b3568d4383fab0b07e779d02f548680e16818cee3e80fb09e48901fb50f0dc57ece8f5f4e2928464a694eb39ae7894c7ffc9c37c27919231aab2efaf9f3e3905df2ac2e1afd95ca1c9279fa76c981689efe172b6f2c77311b2edea22fc5066fac065d8cc7f1ffc67c767963565f30a60fd78593f2168da64f38313b2b12c86772c76d2ca7ef359ce791f3e3f3c0799636ba800c45886961d444a014e16896e76896eb1d398ff3b24f72c891ac49d5451f87f4c0c8b6c9ca2a8c3e7943f6a79756832617382449a18b2d7ca952993e14ca8322df9a7e21e72faf8d78634647fed5e3c8bffaa36d146e9ab7214bba6d7e454e9fa2dbd4c8bc2569c8b267cb4cd7add9ba4f9f1317d0da20186dd583dd8ab55a55195285d5a4ca549ba6d42ab5484db2b2dea9de82adda5161d5b54556ddfc7d7b4356a4ebb72679ab223d0e79539d36fd90bc01c91268979706e4d1c7974683705d6115e6f75eec15565dd32515c67947362e002720931927f1cf880f6230dea6cc271bc46cfbf84bbaa452894856eae9862a9b520c367dea54836848e0cd061836c5917a9a12934da1af12718c2fd972308740a03bffe775b853ad38ac9736fe6d2d7e2297799aa791c9e48aecd103f45820f87d0ffa3528cda6bfc34707f48178902a03fa440da00f7e5ec5f11b8421db3e91ab2cd8f38efe434bb69a49d2bf66de897c86ac71ab500d2b43de0c6a58fde32d2a02ede77afda9d57fc22f403c5b38f006c1687b886badb5d65a23300218a72a3e052cc24c728f1d38640ce8272b70a9a21e357aece851eb9173ce3d7614d57614f5b876470f216fd11d0ed48383a639a3d4a9d42541869111b8121a62d304304c774ab3830e5ee825a4160cc8c129a54e67b0369b0d2ac80bb974a6ed4c381f26a4b0810a909cb0c194131352174b4b92a49e9cb04198272b389cb04117b35188bbe7930964bbcc2f83821fff01402dcfecf954430e4872def3a9862700ec90ed9e4f3530d16252c30930b89271f67caa610a0cb8c8377b3ed5f005064932b7e753939809983e882376d9da4118f1f3d4e4896df77c0a22cb2effc72211c2fe8d6e416f357e684de6533f326a432693c96432994c269b426cfb348a6ec102de2aeab8dc17725c48e61a2e871c076ad61742d1eebd31bac51cba975cedcff3eea55b68b227f7094b8a9555d9cf8fec3ec634aaa3356a1b41d4dfafb26bf316a63525b9fcd9f6e7caa2b2f7fe6595714f3c8846d9264ed31ad6b449466bd40ba5516b5fac179096a907f8c1efc41cf8efddab2c32f7fed88696cb9ffd8910d0811ffc4f977401f8131d007e1962f2febda4ebf89e7b1c9fd6e57d0ed08d3f141fff10f086d8032f28d6f01f070aeb1377d9fd5383ec4bacb24f844c65a0906f8da38597546dcfd21a9555998ccb94d04daac3b4265bf27e6e8cb36c2cab7d8c7f7e644b41e66d6aea66696dde682d28e7f5bd87dfc3182fc59498c61d5a1bdf5bf6b7a53177d55fc232d90f77d5bfe1f903ab3f4e5e1559a65ee89615d4cae742d16899e63d7eec698ae57b0c7edf7bdf73ef69968efd7d9a45e49f8f92ec3dfe3cefaff7f83d7ddfbb98c5d95a17f97e496b58bc55033ffa6546a35e6acd05067df095a0bbdc4235c87b8abb77a1246a63ca31c65dcedc385eed49d3870a2565406dcca7424d55897d1afad21cca40d51cc7dd0feac05df62decde3fda97e671a636a6aeb6193d6748dc7f1f57bf7a5939be520412fc05e5fe07f7ce9996dabea44f92cc913c4f644ee7b195efbd77ca5bd6ae7e7a6f6b49dd9747ae7e5457fd624e306bbdc7d883e9a0df7d9df2d6b4b86e6135551bfeb2da7c78ec8703d9c718df171f3f381590c59fa28efb62102bd47c78cb86399bb6e9be242bc7fdeeaf76240c2359de6dbc7b64c873a685a9fe7b5f6dd8615ee891d5b38fbfa55c4e29cf61db83d5a095d6512191579fdfbfac369b03ddb78e64ab5230aca914b539aca43fdcc81ca298f3481c7acb72da6132b070da5e68f394a907f7bfefc41cf7f183dfd1ac412b30c4a2f844fe7da28ec9e56e100c6d9e72a981a3fdbd0881fbf8a9a8e33ed6e2026e0e6ecbbca72120fef7a07843f51e693748c57b498f043db2a45946836086035446fc4b8a1f79ffc7c6ef91e5b83d2aaab4e7912009641499e417c9efc03359b7b8cb3ede3e6a107e85d5e642f6245d4596b97924b8b915595f1ea9da5ecbc95671b54d1ffb9f44c67fdf6e9b44436de88420b5648bcd1f35e847a806e159fe1ab3dfb5843cfbfd2f91ab6ddb47807d960eeef1c330fe74b5551bd374d9c738e7d1be85652772e96050cecb3e2659dfe3cb912cee3bf10698b3bdc061298b124eb25011c5cbcea72a4fb6ad71e40f3773577d1aae65dbe8f597dc559f09cb72d3e8447ad9f57b68c81ea334be8d1d40c5ecea91de86c1e61006495ec4811c68d33fda251583e9944c88c3ede202e866e5c07fff6a0a06a4625e3dd645f9655e461be53f7aad7e54d74c4bd39ee20d16d644afd5e7bf1ac80cf3020a609b95c36efc7663cdd241a996dabe02fb2939932b301e2b8703e87b9a95833bdaa0b8017dfdd08dddc8f4194012d89edebada6394467d0b033d00571ce6489e54679ee4451ce6b0fb778b035d2ae5405cbcd6a25d5a752ad77f3a356d2dda6ad1a9d61cb25ce89649a5f6dc6293e026f0290d0acbcd974c706ebeefb857fdd7618efbef31c73ddd9c7deebf27a737ad0762fc16bff79da8c33ed656b3ec7bbf7aef891c7b7777f0c3813e6ff5f777d4a05c5d36e5b4edfb7bda68511a57e61be040f9ef9713887dff670ef9ecfb42431910cda1f0a7456dcca8d1337cd34c99e11bffcccbc8e819a51fa6192b34cd4aa1cdc29739343708923e4a72f8f8c507c3f0c110fc50b374ec30fc4007a859e0afb417053e7e9508be07fe07824f37087a9e66853f37793189c36421fde3adabbbc8dc7f24ad79ab7b16dd5ed73dc61df54269d06f927151497775e8fa56037463fae007a0d8179f7b20d6f34992bd0faa4f926c27deb9e3c8f34466d9b7f9a317cedb7c11cedb682328f68d6c6eb4d1cd8fac1cb583a37df7557220d5dff1ef5359cddf2f2993cd25aa2e990761dae821c481c4eeef1b7d39b9d818ecfb3fe690b53113640e797f7f86f418a5e1e37ed09c5b5cc5c53dd277d7819c7843fc2b36e0886e8fa43ba434fa3e6a1c94f4874d5f6a5fbf403cb12f9d4d1fea4630893fe78f5e2c5c84f339361ae7b12e1a6ff4f8472f1cfd63247fd8903e4a32cf13f95fadeabadd83fa4afefbde5ba129b92626eae0bec43177900f381fdeb24fa5541e328194feec1e634d044a91c703130175d6ef1d49ceeab2d406f63ecffbc00982a27e0f5561a87aac33febe7b173ff171f7de73f841a29f5951f75e0b3f58ce19f73d66e9a2efb1ce2208740c8bfbf74816a73350e4fde769efe70b7b9df6e93345d007d0079606dd7bcff2c7f8e3f19e03651d8a1070cdcae16fdf6e513adaac1d451cf4b01ab841a78f156ff8f4b15fc5397dacb621fd942c9313cda93ab5e122581da6ab5aa71ea65c72b53974041735c5944b677272a6ebe4f489495cc935683aae39bcb7de516881426f81d3a77ed9ed59bfbc78bbb73440434f674b52f04aee3607e806627549b707f641a863c64c4ac3f334b65ef747bbd3737bdace21ea85d38ec95032379dd2b0356ec67536fc219716466f30ff0a951f67cd894bf7062edddb126c093687a610484df5a32a54857258ccdf22b92d525d04a424d8f4a9e1835f86f75683426d911cd4585bd86d5b98087259a796a6e6d017d446ddc22d714b4a21207912ae23389dd93974c31e11e492dee88dda006361b0593dfc341310cc5d7299bc75932c29792b367d02fe2ab29b2ddffe73d2f007a56a10385dfe17cc8266fbe3f8dd89053092bbf7bfa26692f42f03fcfd02a0904b260678efbda73a039656010510720e4a5597006c752a80ab0a352b87dde1db1dea92c89ef2d6fd21d2c5b8ebfee7449dbc75df0024ade2aefbb8bbe0ad063d2875bf8252fbeeaa2b92b7eed7f70fc37a54c369094b407f70b5e78d1a5bcc9e9e16a5e0ea468d2db2f59608d62099caa4b6cba0613a08e298f3fd0390867bcea8135c89392ed8ab8a63ce39e7cc60cf05503de7a474ce39ab1017b470410b75bb2e8d4400674f896f168c07e125eef2b762ac1824a4224536bd4a5769d3db2eeb33b164cf2b7b3ed9a43678410bb509492e31d4f6c7500e549b1c33d5251f6e870ab515e32d5f926d937bc923b67a1e554a4df8be7e5fbfafa0934cbf76b5ab5df7714fff821af205dfbbaeebba0f042b58a93bfeeebdeefbeec16f00bb7bf0ebc00ffcbefff48c06e85abf0026f4743c20d9b2c17724501b7c47e26583efcf3de824d39f18e76c671096c9d9b30024e4fb17d490edf7e0b76a1087f3c61bfc48b2bcdec23fb14c8fb7bee79eee398740a0377fd101fee0ddf4afce7101cde10f3e48410a6a0ed00dea06685b0013aaeee1ee131c0c91448230823852041058182145f45b1533850eb31d5e68f2058a2ec9085937ed0e6f29ed700205296870d2430f598410a22b2106ef488f274640a2c5114d767842c2b64f63bac0965841142f4628cd89050c2b4788e08624685c3a101851041fb1e285d203591246872637dca0e48a0ea966457ea56cff61c8fe5697970b058630010f5d58a01dd1a41ba126e5dd0bc05050124b0285a8147422d46c58cbec06a428aec49a88a10ba196053c62830d2928a288305844d0a183d576a0a1476a0f15a69890984a32c6c68da94de198e4a815ac0842052b5d48490aa31685b3b956259a8070fbe2851794623a7814b518564990a00b1451b4c46ee0c0f0e891da0bb7c9044249102980e1e94b1556c4d490d85a922a27a93e4e8044851121d030821b56501be132a9553bc50aaec4906a21c4f0851630d65afb46f28eb1ba8ce45aa9d0ca83521213145844b0a289175abe702e7b1b8a5411831329a418a946b4508195b4446103432e47ccc930048e0d159640291155c44a186e4acbecbb4942a0a549971f6eb089208c161cbe7b24532d33d0e4249e444b0ba1529416116c8ae06265e566518497ceb3057ab86551c11547c2e8418a1364594060c20aa618020bd74511537858977e6b0a9e84cd051b0951bc38c20ba78222b6747ea4c90b51b531379cb083162338304520e1719574627b62427241072e382e94ace005081f76f832858a6fe96e96215172052d0460a2102326054530e52bf32506206e43d41053b205e74b59e856d17a1223c4174d285061845b1125a86ef55202272a2588218c089c1663b02b390b3cf4c0c50909214449ca62e64802bef80085890995159c705fa400b9903282929426b65ca14316599210a960295964b952801e9414e1f4830a9880e15464a1225ac942823c44eb10173c48d990c20f27c8e2258b920c9309446df1c4c6b43404150e6a0c9e4018148288d5848872e3ae80020372d34a1434ae64950081ec3df244834c0aa72b2a4ca9370c111ea1800e26e410a50a132454b1026aca4a890424a258c941845b9410705da0986aee110a85e403b27e641a51220cd314314f5e64a9022ac67147fede7baf9523271494e0e10729da123a380aa0eebd7763d764cdf4f1b7b73c87ae8bf92c3f846003942861603b7054101106c621635cab942423584871e10a264b8480438117d78fd401200166892c4e8cc0040e5c88d862ccd3c7c6841a5875a18b2b218922060726aaf8a2045db829a0f08e14e96207134819610a14332998e8c00c332c524ed084165d4411757d3a81029715580821ea85239c1411b4d06a21e20a771d8718931980b08202a530382888a8c2390d242c9488e24452d416dc13449400ac4cb630c97828e10712e08965b6f260d10483ad8a2a49ccc09d40866dddda975f212289c68a063688a0092648c022b6026e0b11307ca9fb8c0bf188148d5b6a654631d101d97be413620431b0c005942c60a858640939772b26e894acb5d6e71347381183a2e9052a489c280178a402575491c2298523312e4d2c11876841c458487001092e464040e3981822d6b9d2bdf37ebe3fdeff5b45b02f09dfbdf7823268c073885e24c0ccb09e5c266b7d66a1457d7757cade840acfe7e47499afb676de5c75b02a7cc102172938114105596c4fe0287984791de167937a6489ceda24e53273bf4302b660e2842b5d84601ab344ad6b22e2e7a8290c122eac70c10a09342580105725c83e5f2da8d5cc5aa11a84adb5b26de8c49624820f25f060c5cb72496cfbd4c3b65fc381eeb6ba0432330bb9c4e37629e0cc1864e1436b86002c11802f0090426b842727d70bd99312002926188491710c00a892710b4764156a7882b9a2a4208a36050094c8aa3d9f68494cd17ab8e04bb6d9f38956c3055eb2b7e7138d89b62484ecaab0f29f3dd9b7df696387d2a0efd5bebfbfcf397d7be9e307d874cef93bd4460694067d9ae9fc0ce8d379c3891c4fdd8e727eabb575fe4cbc13a3d571f7bd960e28dee8eecd1cd97117efe018db6d0f95ecf70904573dac7a08c1cfc3d539bfe00ff7feb8add53bceddbde3bcd65abdd66a2bb5ee6ea79d6228aa9c521a1c9deeee95d269c15a6badd6ef9c40f54bbc7184506a963cdddd67786b3e56d27577da8eebf0c59ef5be0a86d37edf773f50bc4f2c8ded8fc505d8aa050c7113f3fbf9de5d3a5b5dc6a1f50f745eede52e77b9ce76b8ce983fc36e5a71f8f8b10801bb3d2ff41e04c3190ee4aeba4419e41aa48090da30402b4a559d70b57abb7aa562ae4106982e7f4fa62b69585d6b9986331ca8c39d9d1ef550208e16dfde67163fa420b3fdc71f9670cec7ec72e5cb9e60268df98c12c1fd73eab4e79411255d3869f20313a957d41662d3a84d8308c116df3a90d0161f146f882a104cdae18be2e73065faa26a47fc4fbcb152893a0376871ac89cdaa01e91f87e9635fbbb32667fdf13104aec0f0b94fd3d166f7ce3f6be136f7806c0f80a958da5367e4ebc8127d00092c00cf083086a96d96c5b5cf36dafa8b7432b0a12c25851e40606edd2d0848f4000c60e2e3c4d75310b02091fb6503a6bcab3f594a504b1fbc41bdd986d1f639ff2230863892b6ea0e104501c314495afc3d16996945cfeb7ae053b3ac4b6fd6c9f7c90b22dce6073dce7a80d04051412dca0786284941767c4e6fec781b8afc1bd02e6e68e0ccddd75dba78722db5a2156d7ca0c3be9e8e704166d267c2a98855114f1ba9802b338018371fac29410ab12c6065cdc02a103a8942df6553d0b11d90800000023150000201008054462a160349846caae7614000c7f9e487c54968ac324c861148490310410420801000000034668688a036d8f710c200871e6e8a3c2fd99197feb07902cce524cafefd92f2272bcd65401e29fd44a851cbb690287d35105a34ced90c269de87d3e0be909d91bb5fa76f679e3117fbba73089e70420eb9c6e748c104ff861eb8ca2b4f51f3746c329ef600837f76a8b554fa6763110b7f4471eb75b4a8843c73b2372d6fdd865942867896a2d7345abc89abcce20d52a29b6128bcd81db8c86442338ec234cbcb83b6365398fedf854fbe56c2e36f1919cbee65ed49651a84b2d2021950d80245c84933fb059f494e33b854c2b17733857119ffdc11fbc0a82805171c16ef79e67f9e508bcab21dab9bd39fdd34e89117ceffcda36a55d60a51af47ead2570ff91d6970548457d049f538d49fe984f55a7448217630bbba23ee863dafa605f916929aa8c9556831477fd2d67fdf87a78a645e24d71f83fecb1ac1c4fba479b8a441b2ac63d25686ba86877030a0368225201cc865e5de05230a1a5068326f85ae1db86da83a1b84dd5ac66478224ce7c46b31354232fc493dd4a20283fbc2611d6b827ceac5992aaec1f014a6f3c4fac1a279c44aa76864b811808fe53ba7669060cb5a591fdaa5d1593f25a4afaa50e077acc90d1386c54e71e81d4c865a2e3e2766196e6a177c2e6d2aaf5f70402d7349561510db41f2151cf10e2a10b00f33e25c212184dd76d121bf4b8884e12590f16df0aefe8a6304f006d9693b9f6a73f5e80ae38a013717e144eefb77d3705dc29d984dc27a6cec0ee48796056bfceaedec36043ca5fb045d17d472061b98c4feb21138944c98a089c2cbababfa11c4827a16999e6a3b28b1b1342e0f87680392c503abef768825b451e818765757622b81ab5e217f49e4da8db92182f14121fd66bca5ac8726f3ef89b8b271097bb930e24d9eef729921c195378342661f36e92d849eecd130e7c7bc327653beaeae6f6845db752730f65a72a78fc49768ce0112f6225a100578128f489e79d1885b9f7bb00c1b0dd565cc633936e97440197f426c243ffb76c482e9826d733c0e3646f34fc6c67222cd93bfca368aac23def846c5728ec3b129774bec3e2e4d0b649c49368dda9644eb1b9b48bab135c1de477c18ee7221620335ab8a53350ca6867735764d98a5c238056f043fb133de1817074fa4834fa1297161212ad602aa122bd622b67531cce05f4db869de9249d103eff160a216b67be296351a73c72c2a1db5fd7291fd89b5a4b3db780b28a22dd354c8dd48c5db792cd964413b400e6d521bedb08fa8aaa006b988ed2eeb0ce3d13c48f88270cdf57794d4a4a5b0d35288332432c4e6de9dd37e9323f52637ea01d43b4b4eb213b224211288d915d5192c82341d15eb23c94591665a3b6007d41f901e3af918fd4be2e548e833b5c30ab5d456b8b90d58a1b11e01e170cbf870024d1e774975734acc1670c4f50496653161b7488c5c799244005f420b4e0585e7466a0e51aa980f59e468eb3f42eb36006b50aa93726482f5569b95312cd5489087d340e3b00d339839f8f88fdad053e7ea13d8c9031b388dc5256f34874541a37b04672d2944331b4eb190e0f665ffe24aba897b774ab1170dd37eb49c12b83ebee61887d905bca2fee42a7b5dd869d9725bc5f8cb96d3af5258c4e73e9759806f80bfeb254a4e61cac8551876fba88335ab9cac5c2ff0bf3d0910cb132763f313fe432b2d06c76b958cc9398e9a4694c911cb32c6168567e2874c415115d534da8e3d836bf9cfd92f7521fbe09297a3dea4465612352a76cbabc51d4e78925eda8a98a86291416b539ad401209a7864744a5a3013003c65e2ff738b6528d7b8c404ff0637ab0bb45f3b8a9e4cc9f0593981256370007c416025a8ca3f3a329754d015ea4ddc946922488b0ad28efa94a8f453a8f6657241b86640952350a862d412d01c35369833306f0889643f44a46a468659483a5d84ef7f2aa297eb72a8aa46c5f7b63215e395ed2948e3d05cd5e3f2a5ef6bc28208d2186b29fe9fd4dc77494f40476dfa33314401025e02da5111fe31baf7155acc08219680ddb1a54409f1b2510cc6ee9d202e3322841bf706824106fd43652eb3dcb47c204d3ec8b905d7b1b2f2031b13439eb7f887acf40d21a70fb149fa59c93cdf295a897643186806b32be00f7cf31ce2bc369c9d4f35356bb187f51c289e4b6474b5e2062c6114f8d95e69919c89b352f09514d282bc828404c2ca8e753cc7b705dc7b2471c693b62e9420a6b981402c1aba62eaf8b115d1f53d468bfafb6d517d1d9d6a2501e571d509a3eff881e11de5b7463775a0002d7093b55b24ca71acdc3be4b8f474a6fa64bd24b98a5aaf99027aec3e0ef6c4b7833c81ab30b7edea79ecc071c2ea37038870a228971b9311b9ea2ee7910f26f5bcf29655e4b85e89031b5f81381fb279dcaf80242a0bee71db5506125d5285062f242725ef1e2c30c78abdd8e7ee8b2d374a91e0243d59c7acd54f46d2be44c0b7b27cdf1ac684158ab40c58e6df6a2a3ead8469e3163be4178ecfbb53a6a43b7a4c895246d9109f0e0e58dbb7e596217ab5804742e86c292728964f7de04dacde186db7f09d2522751f7e021596fb0d4f8da8e5df75449f170178618fb34b60a24c43586d6217183e275d9325f509aa248e94c9cdfd6c1c2bd2cd3ed692ff0da7f923146fdb2b39ed7a835aa9d174a672adec0d8936cd7222935e0cf19db4465f0c99efc30418fe5b15f8eaee5f9021154af5e8e330ee0c2983fb1c0d811c7a2bf6f744ba0d54b9108a13630dac02bab1af867a87a5d53402da985c12b9dc7c25b8eb96024a864b3988bd2f87b917d19737f8f2a2ef98a492d7085fcb34a90e9e09657061d901522b85e4c391ed0c8f083c7774841bf96ef6b9fbd4aa248e42c3b4cc206d5d55040124989029dfa364c8432141044e462f9f74329e06031bc263f792c4d88203bb0841ddbe2c6815fe09d01c2ddc6de133771c4a536bb97abc1efe29c7b970dbeb30e7e6d6a9d2a88b8419afa7c9d33be8092e32fbe897cb11a2308360a465724d24b35cb3e7cc167193fd0383b9144214092eb5964e8ab220d5c4385d6a15620befc840c3f1b6035aba29d32d11e33a14a7dff61bb931429c3931f29a994b444999a4e25a0114ae58f5e406f947acf1e494796846c1c816dda64d6729874de08856120e43a2db6120af832ead6bc970323e358fa5358b5cd50e8f194f9e7af149fa7be620ed466a74607c66621292f0adfe88aa038abad0086538bc9038ac66c41fd1fa31be8901988b219a5bbe18615a36fd6940097221161d7a7175c87f99b85e48026aa096c8454404da8972d8bacc0ca388c5d64e5ebfc9d16b448c68be0e1d2ba9ba2e3080a23f41623edfe3af551659af70b9524380efdce306a16f46e3c409195f195e23ed018fada946f30f6e871461c0b732d16f356898f072022ead6b864ec4b721944d809c6ad3728e469e0f375b4ebe0d1ac2e1f8b82f02de4f023fb37ca2466ebb0a0c5c7da2603bb893e566dfd6dfdc1d79dc6d2f4e07e197703dc5501e476e68ce57bf2a323faf2f08a6f86933d638ade6fd8b8b7e6e78b81f78169ed0ce8a3578a6676e518006674c169481a8b30be9c541519ae1972961e2bd8b729810dcafab18b580cccde253f6bf5386fc86c44e95071b47f632f19fda19f2e805858b8973bb426539dabc414195394169b693549c9c2074ac903f0245e0da0ccbe553bf07821208bd1f823940bb08e175d42a68ab2e4faa8588291332694c31cd210ee6e3a96ddd2c4d5ab7384009e6ad5a6c93ac577593037626fa88e7cf92672d52d324c5d6c96088c37a6f5fb5bf00b9543cbcced90e4f84904da2de0d46f60ed4415fcd54b8fdcd0435a8d16d5d4010808fafaf9cccbb657014bdfd651e5adc7c5cd75d514c1ef36529c6844ae9b31ccf9a7c4b6efb3670e11f2b53307f0923963de024dd8fb8180deead008069c27b10d299a84d9ed1be6d545e560681688a0bfa8a030a1995f838ad76724519024bb1c4a5f9af344f037cc6f48859c9c2f44d5925e65f0d48aadede6812dd5f3b77e6f90d6a38c5fd0cf474da55c7b768a6b0673454eb32731f17f4f8140ca2846a640c6d2855876d4fcf9b4df27197b167e251837b7e175aeb37d945980bcbcfbb3ab07b350ee533fa234d0c4bb22ba140fd9458b1fb63029c5ea1f7a37416250e553d6b7eac8f53d4c79154134c91088c5c19ea7276df25e519326bcbcff9c10e93a2a7ae5d11b3d7a2bfed0ab03cbd130a10391f87b1e8562519ef4f5a46be5e5f2ec1af93ecd8ec786104230bf4db371927ab3b0323c7cc853adbdd7bdc025f08887230ad5144f855e8afa121cf0a919b6ed61a1ca4d66ee6ad03a9374ae0b46a0d7932b700191a815394efcebea5e5ab7b783845ed7a72fd88c9d95d35b9fecb0080d36a5f92c8102a6182c0380aa1d61f3d956818174caf9f764c8d22b1e5039bf27844b9d4ae4d8a808e08a984a384dd3c99ab9a21b4bb9ca29dbd2fb3aefaf0ed3e4117221cb8d9a42c72da1640e6a6667c0195d92b54d14b802c961e4f31e7b3138245b85f9872d36624cc29f254d617616ffb5dc348850184f162305622343c7b1061ca69db8baaba312471aa376df5d78327dc650704987df93577c0fe832e32dd2a6cd5b60208433173a7d41bfc98947a727c0c726d2d70278b9899ca3be51271d4a9eea132d2b7be91693bf8d17347ca2a34ce481958b9c06589e7329b3192160634a420ae91a14d62b01c01622994da47ac829b4159762d5a45c456d9f5984fe08070a2136323d20831b3f76c492176975158148989f1064b25d2e6c660a7f8d6fc1c8d2cf8986483a2963671cf3b628752e265acbd42669eecbb6217dc5acc344920aeae4ebcaf63252835efca55c6054d883699aab499087d42c14f46c96f0f94825e0519e47aa38d7816db244346fd4cff28e9ddf5fcdd81cb525e7457deb5f4de4af15bf410d113111ac6b87b493ea43948c2422d4417143680a5f56073cec1b177d12aef3381a84079785f35c8b02da768ef2673233a18baf719a00f6b6049e897a377604f01b510a3d668df8e7ee6952464396a451223ca0429eaf7efa3d25e267ca04e83dcf350563cac94046e59a8e3679fab9f16b02813ae0d4e98d5f65743389611621f6051afdec4f697f6fae3367c7fdce313fa19100c6d596c33937d06ad2a875b2a60d3bcc90433ee06e44162ac5ac41c02f6f96e2ca1e12958893104793125b10c0d891577ff0c18c6c4a21573dc159cb788c67d8862f73604cb5d50e75421a14a4147d62f6e2f0f92bf7051aa4721a58e208e31c49037979472d1557514b7483534a21550498bcc95d88d3f813d5127d82d786263e77939904e550d76f72e8b74aab3607942d9eed3e7317b1e98e5ab5cc178e1f1d01757f49bc3c20cb1ebc546d66004f303a981333ab505889b7320a029cc63fc3a337750a876c65bac26e82976778493a943deec4bc73c1ebec2c284e57a6ac0cddfa6c3c5ea55ac1c7dfcce9b7a5780e535be8331b323dd7286d8ee090ba4c6c9cde7d2996a38a0698cfe9813f3cab6610d4f974c964e41d85233a6c8b8c05b673fe67eb04fc31f19fb36f503d51f3679933c137fa0d0290590c18b32620155b1023c388808b9de48df91d1dd87780b6c70426da691d7834550a2016158e3256354f58a082b0afa78671a0423808744059d32990555fa91b6b6cb80be5d9a7b599c764450ac90a4608ab145f80308809adf3dbec8c2d6146286d9c7dcbaf1b07da8e11384f603eba4859326d156ff6ece92da8c6e406bd3456bfb315eeb386146708298679951248c8caa31dc0370559407c32e899673b52922a7dce31d52d7d35f0291768461d326722c9074c9b64618b4f26f1c57f17bc0a5607e0294850ce26dad78e7820a866f2973e5852f79bf3cc5d1449a39beba67408b5a42c50c91d054e8ac9df40b01e2d20e212a97d4259f0a88808cd0defa879ef11c3e4ec28e9acdf3667fdb86658a08cd11da9e81610f86ec02125e81c733a6b3491dbc0eae111b6050e594da4dc28310bc0875902ec4e1b692ad73e984bbe83a601910115b6cb3a4ac1dcd080d3951b941d55914e9293b33aa02730b2c232694da072e341105a699575cf523ab14044927cc8c714c0e0c26da6352e627c76670cb35b876cdb04c24ab7584d07cf6041830cd0578f380df3d9e0e0586d2fa8a1c029703d6429317e6cf0dd08ebba8cf243c9646fb3b6969c97a233816686b72088732ab2044209b1550a309dce7722289f3bf8aef8a248de09c7fbacc20e7fb775ec535b86bc58565426e5df5ecefd09d29564aa41a5f707f28be0d1531fa17c41e87dbe76a74b2ce9627eb190a5a8a62f6bc2c3aedb778378f18b5593477a45942b6da568eb2615c47f417cd0a954b3bcd884f680e96754dd20e0b0577dbdf039682875c0c6ebe801c5821a776197d26f9f5337b4a9c217155afe6708ac80d55f9c155915b68ab8730983025824f3d712fb8d787780d6b4f7219c21b77e2e5e32579e63026066d29e68d3baf8e919e54e1800edbcd8e104662f69437f217d768c58e7d09e35a09c23748251392646e1b56183cedf2b3a44ed73d74c160e6f473f2f002757b0d4a79527641cf89fac7b4202e9c9b4ef1f1e0cfc59b3ce9d87cb3fddb6c8be1ee52c5b2166d063fa64b8913abe39e4e27288cece83d183dd9fc8a1c6150dc0045f2eef76a206b60c154580e39f4c5ae5bed93c282a60795905a2aab3c9fad55e4960a30db96ab82d4d91c3f93a36168d8b5c703c2abfc37c69a455de463d2c31596cdbd768bab16d060810665c9df288da236319d763910b5cbc549f4a88e04ba39041d55be33d1490bec296e9bd74f3d27f90f8c8a7e595693367a8ab7cd19bafa03a9e0b1b1072df9014ff2d91874516160e8035439da747e4e3a1de180509e3660d077dba87dfc185a2a0d8d4b01d84ffc279123ee7fd619cd553baeb6348341f391c6431515367cbfba8a4f9abfe1d345a283880dd26cc29bfb4e76e2fa68c3eca4518f1d4594a1e6d2edd7c8245ca90735dfac80dbacf99f58d063a23f884913f47516a157106a122cc9de5d63460ecf0f6565380e9610da6117378590ac4ae726d276a69beaf2fde81b8b0c2326492769a6fa57af0a62ab5105bdbe3a765b8dfdde93f5f89c762a933463b412497cb0c4659c673050e12bbea44ddc5e50432b690c37801dba76c973f096484723726ea2c1d3e1730f2ce7a06631a4b0f7083a5261888fc691d3843f29f631781f6d4e475490e8111fa08a3c28963a52ced91484441c16a5a5c1e1abd0a7254b621fc7c7c847e975947de3318d52667add960d7c1a659e347eddcf6d36a3c27edc22a853d734311198959d471b20d6ac00148c48828c90ea6cd7142b83a520e522fb7f72c89722581cc1de63af0b058ff6dcb86ee09f0237fffd486cdbd1e4ee818f93c1f8c99b44632beb11f998a9d16e79930cba43d691729bee0379dbaa8058d4dbcf45eb7500e267dd3e88bc696bbfb1e2feb6c60a022a1d7826ed24ea77de0038578e82809238578e88b5a93720dca22235a9134919e0ea949a0f3db03283b7b0bd468f07b143f56f1e0073ea7fdba5d85088ba210db497ab80fd7c68dbe409c4c1853467d0acbb5cc21a442d49cfd634d1118a251884becd7c27f63b002b979b1939cd9ca0937248ca431020190e2fe7b3d10090ec1a88b3117c7a1b0ea28bb3a391fd641c980ca5d0fe5c4c90ad02a7915a9758d28d42538e3fccbe117adc740e3acad8caeba6a4a6d3414a39850c749b4d2703bc6b244b5d830c4ac647e4b6ad74d7a785acc28ae0d5d85e1e90d589e64755ba6b9c6ede53ab4a89b84b358cb82a794bc2f8faed871e0a7685e059ecf1618de400afa4526b43ed5de41d767c6b827cca2792d3112f5b5481cf86527919ff69b064935feede3e023882b2361c2548e8a9c66ba34e0975bbdf2a5285366762239fc725335b4cbc2412d1018e336c0a484834e7598d1eb147cd7c46257178b34012aa80f1a9c306c6d63d4ab613357f47090fd42844e596a824340b3680489457bf366085cae375733d30b61e4c64f4ec6d833d1050e120badd0259df9f1154de9865955b733738c8996aaa1cbe091966e68cbf13be8d9ca71ce17606a9738bffebd651c38ba6b23410425d1bb2b8eb91db957a96409c33729636345d9281c1b320651f8427e4a8a97282cdc9d57a2d5ad34e1e579622e9e48504aced3c1bb9c804e5d513cceebf69c67b6e6efb63c9ab0bde412b46a6e884a53f98cc2d817215302c7f5e804bbb9d7434f551f287c419635faec5497de2bb7fd319265ea31cf8bcac5f4b9fc52d5c4c60dbac2cc244045cad802b64d0310881ae4b811c7d70e70a167a31275e12185fb901f18dd254b79863a352ed85dc4a1dada9c7143b189710bf845c32f5685f872cc34921775abfb74f17a32f85fa7ad99a78e0d9f502dc5b479043d531d84060c454ee33697f3fb87785225091e6460b48997a89bde974e202e57caf7a6e4d84b555de206508655deaecb02956bc52a50b9dbd102b73a2818ce8d5b24fe28e77c10969539505d5c5a9571139882a2d2b9697496914335120c26fc917c3ccbdb1d4fa08a19f9755be20e44409fd7fa6a699198aae6314c2be68c8d17bfcd156043347c335804541a288e0ed573177f9fe336755b2394de9bd9a6046ad8fffc825de8b6507774001fa222dc46ca404ee0f9ee05b032bd900183d587158c4aa81c80c5be47099911e36dd6e1ff21e6cb36c258895fd616744426461f9c441e03bc8920a1df2034eff5de2a8f6b554c61a437f4cdb552a04d6f62b2672f23dfec82c71e57c5c2ac5d60812d353b92df92b41877bc289423a6485b3cfdad755210248ab7324ecffae6f0a30feb9b26d0a4f1749dbe10464de05c20fe8e58861585010b50c6ef69d84438265a80005aa960ea610d425c433f4fe86dafa281860e27b5921346eef35596eed0a3372324e98a3620e684096b49b32cfddddd03423b14ec50847c12480153070b4923fedebe2e9e74e29af29fab189b643ddd67b3af9915286c13e69bd5c8da852425db90ef02af3eff628d3513b8b90203de9c28b7e4a2f191b4bfafc65efa0db26fe78dc60ed5a95403f28f231fb05006b75ceac5f1cdde6d47c73058480bb8dd6ea5d0527854994cb35d99842b634249b01e9360aad971fb54123f267a2cb78c90bc9394f516543d0fe79d5bcb447dee6d13ceee72470dff088ec66e67981b40b50bd90f499452480d9be1220c53d80eae6d5b1c362f4bb8e3efcfecedb5fd621671e7c32dadc987abc3a51eeeff0b86c8097eedc06210d4177a959c6aabaf0ade1332c7abc33e267d1f9cdf0af150d87347b4804e15fee3bde26bb4760f58f5efd6733b47b7e21b781886eda52f2d20914c871bc9aed6842218a47ecaad0932cdc6f4a71a44166db01f873b5db97ec511448ae13d7a18bea9c14ba4a004400d9b9f4bcd59110ed1b8ce6c0ecd195dab4ec9fa98da84adc0c37dcd0ed9cf2f82625d90449a78d34d09bc7346f579e981ba7d21c29aa748f7815a5aa8c7ff6a16fd90ea4169237690982119dffdc63bc501fa4095650e8f6590e6c34fdded79eabf797beaa983ad183515369235cae4312ca01e3920db2a510c17c298fee689afb94f7f54fd79f05a8a46f8ff3364549f1a21af4224c9bad5faee050c4fbcccb16b4c832243f7a493e8a71c5c26e910bfe08dd322572a85ea26b5efa2d630fcabc8b54bbe817a72fc6981e0ba285f55524ba2113cb19a009b68905cfbcd6757fb75f569f14f297cb6ead4c7402c301262282a644081a97b35e0305febc42eb70e132c9c7e2c6e9fe1db2865f796e8c4fab8062c16a3e8ac69a2749359f68c465a1a42dd3de2de2af20e473c0d85f6df729b69cda455f6784f4eeda12e1f8008b436405e5877b2d2b2cc2f71e1822049cd117660f86032783d892b040bc52111dee68b8fd05950adb710b8dacf4b0f3a732622a22d18eb841f0df15a70365c4242142dd0670cf257db043cd878cfb6898d3a49bc27fe859db052d47840f8e4f406bd7ecc599a93533928910dbcd45f871475cf839fc643b470fc8b1c89805e226b100ac2fa986710e1720266d7148d2a55bdc0e70f8a2f10c19320f05a9ece04d13631599749bd954b9813ab11960385a9e55e04090c57b4a4a0e4318aed26a947aeee94e360a72ed4eecee06e7b04b24722d5c4808e647bc6e8e1dbeb3d5c5b7a4d842c4b7c2e0ec7ebe99137fb0c238238fd34aee8b21c45a280055da9204c670a5df10901c8fb228b38ec71427dabc1e54c8b2601ca0d9e4fb6198b08385011c97e4f74d6f9811b17237cf0d2db135a188c99ad81736fbcfffccfefe6771f2a60e98ee426292b92543abb636b1a2a8244106f2ad7721fcd19ca66171c6ed70322bf162a705ce8eb7a95a2d0494881ce5907cc328df0a155cfc453c0057f405c10240ed393e898e8e507e2e443f663fb4508a9679e70984d6dc598c4f1d603b1e5e8605d70a05849059e6dd6caeedcd5dbb051008a81fac4513f74891331e5bb94150bd0dc55a87e6d5f33f7740e051604109564b8b49c4b9c518b726aa45f460c9aa33efc2335ac8573edeb3ddceab85a4a604684ea15248d4ac273359b83f45032c7ebfc7d0d568557d261ac2ff01a42f0f3467583837a6011a62634323b59b107957daf7f68fe3fe947fa2ce34e591dd3491890c1ee75aebb9ba3d90c1674814bf8a5af169e4bf4e00f1e732a78c9b0cbe05bd01b8a704d76777bee7c267219ecc7b5affe90b02bc7e09dac7f4d1975c9a8e7f6e66351112cd80bf16e44ba13011d2a0f5d011badb03789366574cc8f0e60d29ad93cc40f58360eaaf619adb6df42c4d4e0e6639b429647c9f0c4672a5ddcf7c7204dbb1b0d568e08ca0dee4b5acf3ad746a0a13f6f1600d64216c34e69a920616891de81e515d884b80f49f9f44aca97859e79b42d3535a1f2007e83cb70d247be91eb3aab89ca9b357b0ee84f90c9fe3717480185bfb7da6c27256c1fef6607b6346257df31eb705155d27bd341647421e26667dc98482ecaa88ec4c50c84451a0e4952df50c7c540a09bb490ed13b0fd6686bc1e92833c1806c67007f1fba87f10c49a20604eb996cf479a8543bb003111baf87b8c4316620f360d492dc26f11c4101cc274653dc155cb045f9f9bb90f17b9bdc54aa84ede78f9837e4816ba654c213634e5c55b8e5a0538baa4a51584f98b4b14186a70563ae4965a812a6d290fe2d6b02b933d012e6e06d53a259777a86a5c8d40c496c8b6851db7a7be7505d74193d4e86cfde7b5b4b147634eacbd96f0ecf8373e702119357b6dbe10e43a51887a52d75007cf1ac203c162f802f77465d6ff9257339231577b7e4388390b6a2bcd42aa2a7b27d1462df3dffd00f92cb372ee8592cde9fc4db6ab044308a4709dd38d85bf319b090fb53011ddea6dd4d703322f8014f7dfd7c9e42de6a98490dc36919be84b09625ff99593a81607a21ff99d80ac5de1086828d5e10a45d500f5de27d91c041e03dd348c7adeb04aa11efa968eebae1012c79cea5ea6de996c4f8b2038dd579f4afc71873c4fd9dc4302854a26e5557b5e2cbc0047f9249f269fdfae83388af2e5909f79b1b2df13b2f104f998009dd206140519f8267f284c80fb535634f289f81a81d49e7c2713afdbbc5ecee769c2e26919a5142cee8669879c467d6fee0089960d84af82489f0878742b61a9ecf9de3201609bf453f482a6171d10d7516f0e4c93aa75d629435b71a352f47e9f08e2d6c29838e9e23ffcae87cd3b70886581210558242de111134bb7584a2ab3f9d168f18af167059eb2a2af2a461f300c7518b33c56159d0d978a51a1a096389fda3df65dfaf59488c862d2be5762e1a34bbd652ef43a7355b50fa7e47f5b306c6c6816d98fe1b0f0c6f2e12f981850268419ed92ae5ef29308c7377ebb7d1c9ccc2cac28edd3cebed585c3fdffaad14f085b43e78ec5b1274e910dd72e11720a054e4c117d8c4954d120703aab5f42ec2c8fa5ae455e170f61d2e59e288d21721822ba9a6d0684f015e36a60cdf80ec50d28b6dde4d572dcc6263cdf015e40d50374952f8f8adcb41e8760b9de7213825123db2978483f9d22c1106894c9e850c4759a8dd4d592cf8e3d2b964b1ae1a2caf9571701cc2eac65e1130bea9d9dabec0c4498f4300c721491b3aaf95f3d54cd2a2342750c8beb5c35c289d96e61ecdf84d482237a4c233eb4c9bdc5005b92afd41fe9d2bbf6fafbf3b38cce7250f592fbc52c90adfedd5fc4a2ad5d734c3858a0a06d553a0de4f8586b8655321dd980652a9bfb8f1586fa61d3332d3948e1b5738ec7a2a73542aeb36efd8ce806025c2a29fc21db88138ab40109526f1514ff1ab0d35d9f323265f4bb09d59769acaa6288da21b3f188e0c62f4c7307ab466a6daa1518cf375a9b037de6743700142c23d9f1f11a01a78ed735104ce10a45f78ded08cee6d4e0cfe7d5d8af32e258b43c82de6ec22cb43aaf3ec33ba4b19752d4f8e5c04245623e415e17b55149b63f5db00889d8a451e158ba3e867290d6816f33ea5f10d54bbfdce0a6cef939db5c694646f85b0752aa6428a2d05d2ed8395e3d3d476692809a7b044f0d4fc417fa741c5f837c609934722c0bdf518599a7509ca75b4ab4539c6cafe484a9e9610bcaee2d9c17fb872aa0c23d26b1fce5c043a0d174a5c90c33e3e50fcbc34438f15fe7c3b95b637922d2cd4448680ba54a3407d3827765301f7a00b8b15280a3a4fe5327a6579c31b81c737b192c0d0eed19486bbdf532d4adc63d10e6e79683d98583213522c0c08c1528b88f51dc9529eaa5fc2e1959a28385a5d6a48d25e891d8b033f378695c0eb15523f02267cdd728b3fd08bb42fa3d8f07df9cb5aefceca2cdd1a106ec25185b75891e00761a78160dddbe03e88d7597fe0613a6e3486c341343f789d68f7f2e372aa7688e9bae12136183f6f7a92bdeb67e881bcc38582ae26fac4f8a9329fd751e93331d5fec6c7ac725098341daaf34b37480f8e9cec1f59c9095d9fd1354461578aaccf2843249973c4c9ddc9bafb33ce3e0c4d098bd079ea8861a7f15a019aebe7c62b0d4e242679592eafc949b84f04d7e16b89b3da40c83d607c218d2c374e74023a7f44bea6810e14126926710e5929b84f8cac7fd6b59fe2c936915d7f633cab9d400fe0cb3d2a1b57a5b34e332395453172e9e05708d5e5b5bcc39c1321df7f071236380fde011dd26270500aa519b2731c398a384696c81d06a3022a6293b5f7587d5ef3112ecd748bb950237f4937be3b3eb206aff085485e5dba38446925ef4ba835a196b0cc0126f1aabd4b4c07823a12ce845452d334582f6bfcb6a1ba5ba612b9175990eef9606d6f47ae4661e97868a89b4c845f1bf950d4f98fbb51b1ce3305a5f893dffb315c4cf95900a0c2567a19913708405c0042e8dff254dfa600fd76c4a242dbdfd08cc06eee27fc3a2f10048996755b18b67ff419c1fdc04abe3c3341c06922e83da7997058857f7e79cc50b16018f309056fb7118caf53fa5061bffd8bfb35e9dc2ee93e73f235c1ed48742350619c3e99fe321c4f96731288234f801a076e7ad65a7944519f70dd3d4314b5a5c41c1113889da04f23db4c87915e0124e066ff9ece35104f7217cd2ae131abd9d335ee583b9abd66b0b56719e0bfc242c98ce6cb8ec78bbea43f6a8667b20ec84037fc787dfadc9c0d986f8d9c4d4339d0ed4bf86fe7e543297569c08a71e928705bee168d2412a016dad6c2b5345a51df60f9288080b07b844ffd9cd41998a9c7c7ee05d5e44d0807880acab4b39cfaa44157fac4a0e6ed29938a01fc586b3cb3a32de53117aaf55b650441a8b4bc2eb179fcc87e1f50105c177cacd33b9751a96315a4869ea779257f4cc9a4865b53ae60249db0242ac9d83e408940675e22347357426d14a74b68d1a18c788e30f35c0706a322bda97f2069b571e51f28e3c3c59588d3dd24a8de4c11af3a939e9a0e60248eb9b323fd064f08e88cec5647d2b14dbf99473c914cf2952982388d60b3dec2124b78d2119210d326fae7e2e4988ee40ea7f138925e3e3ae884849fa290f00b62965ae31db3c2bf13d05daf792a7f51302da1e2719613bee873331678720367c6ef152b7b34243a406848074f16ec6a3eb40a7588a6c8e1f4de399b899eb807402fcda1fff38b1580eed0f5fc0b47da9d526e8a4031939f4801d10a3ae242a67e66c24116065849233e116d74c9d8033354908aae13a73cf137c6ec0b40fe464836345c17628dd7f586bdb45a4d6c2c86e67286234e548e46628595d2e87ea12ede97cf2c652e54d99da85b20c150309211c38717f31e3517a0ed4f294d9055bd3459e755e2bd1bbc1cc462fe1198a287a27165ba3c6c10a59050f91b319454f80e72f39cde84183979a6102333f9c403b698f9d3fc01c2449bc8a46d3a469210553b227898ae1036e5ce814b4cc73c8a0d6b412a79d769b31f7a1fc869570f75c4212e5dbb6be6b4dee99c5b4b656376f925d079fcb70605cb936096d0beb93639e115ee4810b271ca59cd55edd4737e761eaa7ed90a1118621542011abbd9e36ff4a9964eee76ce62b6b17f7b1dff4eec31a7bbcb40c497ec175a81dce25e7008932facbd713030ce1f75030ddf17db37a56af37c0ff28ca8c1503f526384ee4a2e04fb1081efa6fa34d1586de26c6d6f43a99b08e0737523f9d47a0bbe20070cb23cf04eff3294f8c88df955c18ea2cc91b263a9fc7026c568a586b4c1ae78e6482ee154d1d10c95170db63f19dae95cf08871d959dc56f2837cfa66a9c8b1d61f012480822d831165960c4ff9b9681c566472bc60f5fa520199de14d2bdedb624cca0a9c8d24ea21c26832b9353a48729affc205c5fe039b9b1ef52f305038bd97bd4b13cd7b3a247be40148927f1ed4c194408965c0927b7a2966d17a4a178459b16c01ebfc4fd4ae043cf7754bba6a131c080c9a2151799a1870da1b79da09a2583f4b3147255ee66c6e23ff9454b20ea6726b97f6614c139a376a49cb8fee32ed2441c0b4154da16ad885eeb4e2631b5da6c40d44ad475baeac7f2ace1e7901f2c465957f8fd929f2df134c6ec3b0b7e953e5d0ca45a1a2a43480033b8811c3bee2f2b29f62ba5f36f4c293299c9bedf24fde4b11b4ea9e83001976ddf4b760a07f4097bebe0a562f666018eecc31bf67823dce1c02d7ac28096283a0d6342a8f4a237a3e154bc52d98c381082ebe1fc17aa6169ebe3af05d0aa35b2cfb4efbc6a88c006471847dd72bc4c3057498b1c79f5da2db6386586ea2451bcd500983385aa7233440fb126f352068b06e1b50b477579e7e81743a56f2398a65494fbfe15409f4bdb829b69e255c26102675c3ddb8c3d1cf0805ce6f86251602252c366eb4d3397767b4a0a2279118b4a1e9b34336dd679666ae3ad9f98ce959b3ee4180904ee9a40c511b808025b18f71c55d43457b8340358e3e8aeaf2a28093633020d404780d89b28eb12bb999098cd4091f2cc2dca0bbc39e5bb07be190c7bb2889264dba7bd013601dca77ed76debcb6039a9be329c2257d709fa004095c8666ba67aafc0e63f8e0f0efea3718ce2a1c7255f20f8e4bbb7459f480e4b1c9e7e910f99625da242c64180a8a3c153519882b1b836ba19244e1170eb94c5b3145507bbef996412b10a206c648b716e1fe9c085d9f7e660f2e21b1d1fb58ecdf8721cc9bb318067f9468a91efaeed88462584c340ccfbd9608ff46fe2ce7f6b39030bb6ab2f1ed2dd3fb61794d48131a17e09b664753e3f60bfe441597d0125773e75ebcde6f526b98c0e0ec3d59a406d51da3d1222ddb3940f674c98bece6fc8d38531f23f876e598b65307b66eb3fc1d23f21eaf406b6467dedc07dfd10ff36d0849b4262dbb95a172c39251b2c00ba2d109e0e603eb0addaa1a21dcbec670d05917ebb2ac95195d35d0008fffbbc0047fdf8cec334e9df575d3ce6cda5ead503da56e489d90255e0e872d8b0db0635adec800fbcef58138c39c353144012007337fc63f38dfe4e82723ed0b09287ea2ba6bedbe05ddd4257429aa3304fd764c3b47282fe00bdcadf3f37b730193c343da06c80b9015536be084d3e341ce2b225e037c9a0bea2ddb76ef97d57cec9d7f2601802571fcf5b4143aa35183cab80c6b7ce62fa25c557e61009e72ce9fa5898c6578572fbbeb6591cdf5de9bbbd48ce89f1d0389d5ae22d465b6759d17258453577aeaafb9c6750bc155a29f144b6cb68d014c39ec1e4099d201726271e95ef2e811eb047bb971c1688fa4e8d6eae1350c50dd60c3e296c1a2287e4aa14e3de4c5de840284a9638806f3d0206871856b14f8bd48747bf1ebb7cd5283b09c94208b37a71c4cd38144230744ff9d15054e5484f795c05c7d25774bcc89fee821d095070db7592ddf18a84aded3b59169696daf60c997a2a8ad2847cf72bbdbd0232f73882f8ccabe44aa102d2fc61efda093fd21e7b57180796032d3c35e0d684fa1b1e0bf83fe84eab8d3f865ca56b54128c8328f77cc936bcb65cef8ae279fa62085d34877578e0c5837b374dd106fbfa35f955c40bb5a5f87ac93d3c1ede77b8ed85368e9c14ada827a898b2b900ccb1c7876884e3d3f5186c5f31ddb8d2e9393e277034bff8a0f91dccdb00047d80aa1feacccf1e1749e5940c5c99f85eb4ac1c0256abbfb4264d07a77bb1f7f3d7ec6a6883b937fdee1f027cbaeb4220d814e06b66373768c580f988796132ff93b7e9f2f318133d286e78773f058d0a8d5b46fab4ce94720adc581fde2927fe0ce443577c50a7aedf8fe75e21d98eeed93567833bf8c878b5b088131128a7456b593c21c7f0b8c80dd0012cd65dbbcf6d3f132e097081f1cb04c9385e1444cdd836e2f019702fc856a3ed1ad0188af8637f830320670f0b331342fead9091f1edc33c5128bd259d9a8ba89b95afd984e6411f7a2ff19440657edf17c8fd071a119901de9faccd44b07bc9197b5e8d72bf587a583cbcfc096054f0f78f0f43686ff9e7e95457fded4ae03359cf0db5a98844e7a5b563096f92f0c96c463209a51cde59c5ad4e3180628b7a2912e50362801433629dea3d3a9e41438301fecdb9150bed31b03751d5861f604f33697378c396867988f925953a2994b93cad955f42f8f07048a81f58d47f3ed931cdccd80ae8ad54d063ea0a0c5d3d19edfc72d777276cb652d90b307f2d1021edf9212542e54b1dd7c3d2efd90f81831d8801b68850b3471536298481492ed68d2940a140f8a2b4796cf91d151eef277e2eb0302c64212eba6fa5c0b38a1570f309a2f79e4372d09dff4ca193339f9686c635a7cac4929764d1fbd1a1d09b29416b72a7d3bd0e82567842730562cdc7e6ea759d79eed85b0ef9591761af20ca076700e276985e25fb12ec662f0db86c6e801504857202d6b50facb149a6f445449ce14f62480ae455eafac6bd218873b10daaf77fedf387a71751418bd7a9df80501829ebf41b4edbac835a7a602b1cb334798d0bc7f30eff00acd3502fbf153a91bd66e37a372ed3e58ba073d2a06dd1fb539cffa98ba07cfeee901e1ec28e121069922a5152793c5cf9fc180804a0e726a8a308167989cc9654b3805762c194a693acf66c3c0e34e7dbad11850f1bb6fe1d408364c4cb10f4f3760b686adabb460bf486844bd2e67eb69a10eeed5599f1bfe41e11a59110451a1e914d6dd4e0832ccada086a36bf620eecec50993f63be23304cf04a0cbe725a35afd39abc971d049b65e0c4fb18f285d382256260eccfe056b839b8fdd70b2237f7b060b32932aecfa2600452425b2009bcff687be3814dfee877b012bafcd10b851a9e44fc1fb135408e9b1f9f3a910bd0c1dd88c9496b45fad4dfdd97bc51e86265d863cbc328b8ed8c18e511264f894d4c668d178b5d86811e6bb726677296265f5e494fa9a15fe058628c06f87eaf3bf88e0c2036eac63e0c91ef34f50b0595bbf4072f7224f83664695867ae1bb678015bab4035e2e109b949ecc6d66a341839dc7a25d8fc84bd3c739b90a1be9e3ff519571d624952e46bafff3ef676debc25ecaf377055694cacbfe9acfa7703c946da7a0383ea2eea88cef330c855f7dd8a107b31e45619a4a9c5b15cdadfdd01a5891c289b70372b6837a44517e56066bfaa205928739260e66cd3fa8e6925b1b1fbce097d3e0aa33eab0b7c5ea4c07e422449081da0cf1771b30515bc63cdbe82635e3025713ffc0f56d6d1900748c3244887d7c68d9b94da5cea781599621673046ff43f8ecbb14e53ea300921b16e5b03deec222193f52b3b325dd9ad631c6e933cb147d83cbb355ced395242260f66e87059cb03568922dd0c4d4b20ddd90f3594e823af705800bc4b4ca4b46ed4544e9f3ec5dd01fcf74e28426042237b53c373fb7ab2ba08d7784b2ee8dd6548c3a4f1234ae6b8e3d630b52e61ab4f8b031c349f124caea74ad91ba16e1ce341bda6abde7b1ddddcbad2762666762cca329da72292876967ee170366736cda2a40e9e3c2b3cb523d29a7c4bdab1b8e130d5b493ec3d7dea6a920dbbeb0e51a5c55a6605b7125c8d0ce45db87ed89582803e338efff9c748e30ba310384fcfe1af1f7268c5fc5f7d3cc280d6c903cfeed9d66110a02af41a2661128815f02498b1d48b0d8a9eea79a54ddea152b552b4e566889b5003f6069e273e49ae9437ae5d59ec71ec0cb865a135693202bc8c646a88256a0cf712a8b1d3bd57345b148cd4e53171af122dcda5d0af1529621a0edb20baad2accbde7b45ed1f02433195802c0af09bd866e6fa8fdf9e2ad2690dac35c5dda13f24f37e2b91a3b890bb53814b40e32a963771978f5264235dc7f63fa82be5645ec084dfd211f57c5693ddd32ef309ce0526e2d226a56f498962c4b7bbc054e8170d8f8855dcff4ac4245d64811a2e580dd662575bb33a2d72973736a41bf55830ad71148335787eec433525e068093e8cfb2bafc5b9691c3ce2397dec4b1402682a8103b420be13475ad71ba9f8a9aed8d94f7f7f5061dcf987eb2d3c592253378fc14d0a3aa0d10ca2cbc59fc1345ede6b5e8b9aec74194974712a33a46c853cdb52d61c6343c784ac5e6f77be5263de5ee219e9bc670346edf8677756635c386ab22913393c9fc2ee7916b130897a55e2b9d322a1185212556c16b92e45ca748e0eb0b0422e27503822524a7c9d23db635a49ddca2b07864f2ab00c0cc0c97e212e2d35db65102fb97fbfbf135a6cd391078f7fb81c85cf2b7f7c9e36b0d39161ce7f4b5ec9a63392126d2f3b1085a10500c2cc860c8b24ab5c14b996467aa3c1a45cb8f48e3d9935ec51df6973fbbeae3ff0bd2bd1f2d42386d183c2ae4d966796a6773e4da07b73b34881c627ecac67a7bf3ed229ed927582558d1c75fbe91588ab00b2c160de0a456df45981f73dc98e95be68899d8d13c7acf6017f02802fcb034e168560d1404c5ff9eec40adcd935180b9c33ffce7eadbf6e571d741dfd3c0e92403a109ff6ec9b7f70535c6df2c1e60537fb3fafe6c99ca6c8b0acd6c2b6756b410630d3b060b3a58d0937a9b042b6daace8bc39a0f87d122c38209d96553ca6c745d74c6ea889b7dfc20508033b81c9aa083a0c93874038905878fbd84463427651a32acda86d16cd58f92e2bdd0d97a46866ebd28cf428accd2463049144cff229dbf3368a6867c3c2b90efd2dd5199fa10f547bbbe1e50e0951c1bfd086d5947976d04c2fe4977fe644319cfea2112622176327f4e129714d5dbe33cf8bcb95237a7e510e1668fb7f5c51023ae3db2b8ba49ddf9f0eca1efec402cda3c2d054fd682187693578281022468b3a6a604adfcb66b6a718344fd0d5a1ae03173449ab78a1cc829980e0f6dc5d91f8a07d1ea32c31b1ad785205e776638523f788c314347c11957bbbd80b374ef397e5d3a31a105daf920493b9bb3beb701ac738bf906b4fd03ccdbe4b09f923e5551f7241f43381cb5a27602af570624c14db3774dbf9747fd800249c192e67e9e63aac9cac9e48057fdf155a577fc35bf9134317099b64b85a8a5744ba9b440872ef8e6d7abf35acbd04861c2d59b53496632119b0007a89312cfb97cff6d4f57b2fe35793677261abe12b459edeb996f74c30650a0792119ef9700adf973c00b3537aaafe3c9b448707c100b30a24d3f012d414f36cc291b6af2ff94cdb0f76cb6ea6b129f466b702ccad0fd6d8b99835ed8e6cb3b481426c2bb11e57e117fe590091c4229924c34ef030c1144dacab32ef4fa807afda534eafe958be8892b6e843f0deeba39d2f711851a4aa693feea33fc437744459e105712a2160bc5eb054c35c35b424fe6c8760c4bc8f925ff452b7913b4e416749ee48386d36e3e6e9af29d9feafe3ccf9cf42194b2d24774e9da182a59e14268bc9eb81cc2dc0cfc232d5362afd0da1862d12b0264a62c0a9ccce61648967759e0359ca7f0ddc99e25682de13876c551f23cf4336f5d88716008f9526af3f14a99e1514872ca14569d290c9d9f36f655040820b1255fa0e97b3f80e17417959aac383f8ff197638a47624a058f704e1439c13fdab94e900836fa3911a13328a2347507b0cb4ff63c686a122e23b8ba0ee8cc21966aa22db1b92d58c913aa876ca8a9dd60853a4dcfb760ccc9e50e710b4339eb01bdd9344f2a30cefa95317b017965bf447100b703a07451085657c8df483679788121d675c2820ae1070248b46284036925edb7a06132ce2a943e111b585123be604d8ecc0b1777af93a540bc5f9e1e7cdc5799c65d7423fc518a862fdc698c5be32bac20fbb1d0f2dc41d011d034319fe02c2154e064cbd204fc0860cfed60aae55a8ba9230780f31f8a9631c9acf94ee20730242f7b695fca20b002086a4e04a300166947cb6d7812f754e5a83d5c76faff07a0072b7500c7b125e2e2ef15f6bf2498f4b7812d2e83149ea24a50185e09ffe5078f9da944a60a391365c0ffa96e6055388fdcda03eba851ac03e5d736651ade4aa54529d0612cbadc5c4351d28a5b7dcdd890d0dcaeb5ad2d8b048e1cc8a4466c149b577aaed0a357792bb1c26419fc750c681e2b5024b1392ddbbc84b1c501fa5c622ca68a4ecbd62740e5f96c65387846bee10b14382e177af167c12bbd6756a15e64826bcd3df531406022af9e179ac496343dbedd3cb7532cd23c6f3f429a5ed1d0400f42eafddcd34a6776372416486b5009cba5ff45a70c3104aa7eb6a54d66ac272bb83c786e4e3364e1e786f57083013d89721fa7e3a192e1b8633c40cdde621615498ff3c5f1793b704a27bc6f36580e6a2a5c1799ecf3b2fb1c6a516ac4a12c45c7ef87f19bfc750cfffea3b64c34e9d7fa75c8b7219b70d92c6cab6c13311850d18eefceae8df35d00642f3a7f79a8de06605c93fc23a9ac45a419e4308a89382675c9e79aa7833d9f52f895b26b0309938a7af24520e061c984d3276a136b5d094532d36d452537325942e7e7ff4c6ceaafa25ffebdcfe1b5b0cd7e1fa084ab3d18713cc8295edb83c64abe890725728f5459c01f9d46595013c41fa752db2c6aa6653bdcd0552384ccf118ab95d9d232c06df5ef249132161791026c1500853755faf0fa6caaf099d90526e7859863de08dcca5a5139b1ee568ae9d9e7f0093971d883122b9900b382b612094d05ab9746b332212b5aa40d02003f66694b1a77f52af97420a43f2df22bb29a4111a4912bac8fc8bbc4251de925f96561df87e38875e6b9fe69c1053c7c3019993f1ee0ee11504cc0f19810b0a43ab4fc2b76e71bd1fac498cec8a12509e856d6011e9881304cb23cbae4f84b5aab03de24141a7fea7da0389e61e37497a878addc42b5c8dfff061727bf557c580472b3351ace57e162b1d731f1125c5ffef82e93bf7bf6b7b4de5491f39cf1de74aae13d6e1f1fe30235a49080046aef913925db858efa3012f9244bac90106393713e26cb871b5f27171c1dea719074323faa6a5d900409e28500b0f057a3b576d045196118a634446f23802d29acb8dba93922543e846f905a3e5b1470d30c9d95b808c913a6ae0178d0cf0d8481e2cc478250ca4b44e333e3d6c0dfd7bb8cdbf49be5833198708041afa67e2bab4ab2779fe9c34c4b5f5f3be759a5eb9d9ba8d50671bb81231317858daf82ded9663245d1dfcb4164ce8d738f02ac146cc7d008c1fdb7f54c0f4803a0dbe5f8c3e605f2c547b89fe3339864ed1b2da0bd991ced317c40376c5f2a354e4627881315db417eb20a85c08d1bd5c4c6955273084307a62b9e42af0f55262e54c5981a6e110df34e8e1fa0b9904628adecf83e4fbb2866f491c85f8106aa1030aa96146296543ec21e02945003fba134e46f6e25f393dd0a6612aa102cc58965e9550e48c389c1c04a326470cebedb427e442f8b848df82a8c5d55eed0d1446c6e5d6e0ccdfa2d219019ad3d400fde350d690cf04d083844adefe5069c7066b0ea24854ef3f5853328d7bb2ea735b370eccec5f0f777a467c98f040c423fc4c3df237ee8b1e9cee6c859c860c0297667809ffc0b73af9815b01384834fcb56d3e782ce11ac9124345a3d34fc22ff7e0c3149d66f7bc8feb9743bb54405ea88902011cfd4ed07ee19c6b8e6de6dcb08e2e86427e5e675dff052652af14d7af936f032bbbe508c54fd4dfbd16921e7b1c1471e96f3a521b911e32a5888b5a4083be97a3ab843a1dacc19e60f161fd84c10fe94c9952829da6979a83ff25faea14df6f6d5c876f3103a8a93deb51a3834c9da185355a8b189585f7c71ca082295ba29e326e60b9d08ec5386deca533a03b903541380cdf616135e348c6b09a5cd4a074d7c2e3d794e44a0c4ab8537f3f53b12ad2c2a996c5ec0a1b6d9a25d920a782bbf2120262a71f816a66ffdfedf5e5dbb868d37517607e880d697720a0119077b19df4e9e8709a177bd25508b00c6c79d4b1c1ca7f607aa7b18e6f93e40c8ac9d8705bd9deec9626cd4aa06491416430f1e204177b62d1bd18e9fefa0da4d6e032f785851dcfdd3e2a2058b1811aaa976c30a067d9accbe4504abb7c2a39492889fe518dc529cfb481320dc05a785cdac3fd225936716b149620ce252d079b0f14a947bd7efa17868935b6483516f7653fe108e5c1da91db5a58a3aaf920ecfacdaec9cb997d80860e966fbc4c2cdc52f41fd3dcf8bfd70fc4a28f99128b1b5e0d412c91fd59a9deea1d9b5170e92e1ba12064847d72f9ed9a58874ce906252c6679851b735cdd5f3f17e35e0ec6117e83b9718e85bcfb608428bf03df02e2950a07e80844403f21b8b0e6ce349c5ca2c260aaa780949050d2d9fb90f890e0d33b4a8263b0f3ff72d06ad34072f3567c85a6e301d5b374d9a78a94e5a3523735e3f9c2db0734aa7c7c5787879687b485f1fce35966c742b896aee8f0361d98ff221b58f0746a0bb4ff1443b1f21eb26e1503187f52903a842a278d3cccffe3328876cada9acb5f109f1679265c39ff58a2f5f63162117f63556389d00b7ddb9cfe0346c62344ac0c9f130294d0178425920cf8c5623e09bd387d8f1d1bc4a7df18f8f38f20680ce2734505fccf2d7e13a0fa68ae5f7f949346bce6896c992cff605197740913534fc38ab50d679c92bdd04e6682ffb8581c3de476b13bed9e72cc7807e6ae6a0f0fca5cd9a03086c1a5971991a7e0a074c128727a4fb8e63240df8d4e87ba2077b50ca0c1de5ca6b4a09fd2d16022aad1342b0dfcdf706d13d433db3f592bb467f911fdd09969d1fcb4fbe4ac156a4227dfba8999642bbb7239cc6bc02d4e1cc5ffa47642171b9807bc2e62027befda4cf5d0b994e36b110580f40ae0b8505bac989738219bc3deefb4fb85037482687f8f196ceed78ef556907987d952b042016046c57e36e47e9d5e4c71d5fb7bd2327809e4663d75a402c9b6d89857d2d07375273e3142dbfbd1c4c658fc64e2436ad5d8a714d9a626b8c6a26c3ca5cd8b7bc75162e5ea63a1644e4365ed6b16107b8462e7186586b0b2c43f526f0656c544b70f5e59e809462b1e00853cae8bb57e39c55abe0e2435c53bf68c0dd39e3bcf6da3250f4ad1d47f1e9813b22b109c9f2ca6b06b362f8a0c11774cd90321561ea5633ae94828698a5b87a338a0a1ee58aa9e3759a68ebce835ab5bffab1cb564a704c220e8f451d02ca511d3a61071e59d7a638c6eba218fd186a9abe7144e21dc862d71cc14fbe19898710ec7321917cb26df10994c2d4980eae0c9c512cfaa4068fed52d0c57c9dc3fe75b51f333210839a37ff90e8508bbe215d7fd50cc4c90daa00e10194fb660fb38b9a85be80afd5232edba10ab7c98dd8e5ca4eaa6fb7828b529711682b92e5c980bc877a83b9d7f0b848181110e370bee7ad434463f90c954705032d56c0b86305b83f61642daec190941c8b687f46d70c0c0cb4d627c0af930844189d3df40c1ac2c5e0f19e598bea0d6405cbb41e35fd850f26bec7aae8873c883ba0fe69c268839681796ad11c090e891f6cedb944fb4118092d8b4397dce87fb4755b1ac74217d12597496c41370c4653df24c3df308c2c9605efcaa3e8fb55250eef97ba85bac046d6aa82d249fdd348bae7b1f6e658b8072a2aae3dc22920e419e656810cf8f80398bd4dbabc4df89b4b46328524ca43edc03677156dc05a215d2c504db8b28e876a1797ae0b57de85f634151a8bde6002948ae1f540fe4d5f53186fd979992d4bd95c2fffdaa0d02596e17b439ab392ae0f50e6bec0af1ca9668890801d5dd1c9fa69c06ef9fb04b9b0260e8279bf93f1fb0de27d60b0c0d07329f986aa78e6660a8d0785903e7bd71fa74fa1ad87a952a22ca0c215d035817ef038624b5445a326d84ca96a7486058add15801596906b1d78381b9092f504db0008628d32fbca6471359d445a248c0019ff3b8f6157b7b45c14c76ef673a927ac5e425c0a2cb71cabda5b2f323aa037543ffe1c84c1833ac61c016bbcda50b219bca8b2d210914e2e6aaf5483c943fd4e7c68228b26bf751cb466667a66529cc4c19812a8306a25776f5ceb24a601baca327cbaf470a61955474f3d9ae0aa8fedef83fd62d1d1e843a835c3b993a00f09faeadf015cb28d01b01fe5ca49864b667ba0cf0ceea8439d39cb2a9ce71f7b3a5a9b2774141bfd68baacae775d48ba40cfdeb1d1018f77ec090a44ca5f4672f8a1b6110421edbf5014dac6469e980d3e207f43e25353c1a7d4d010974e145a7cb8a5e05d7d79c7f4eeaacd410dab582adff9b9ef8ffadda3682651dbd8ee69d60464070908bec020c622cc00cee15aed981698ca7d413b83b78fc1a2e6c85bc11787374342b243093d26301476c94e671d7008c7f076dfc7d5ea5d765cc4e82b0fc85ffc8c6637909142f4f3fc943170002ee6e4ffb8a3807970aad74a2aa0faa7a3bdfe4c925757497aee9bd3c1ed174e3aa9ef62d6c8df963d0272545e3a19aca824d7ebb9e22d1818f67e98d5dc3e1b3c45fbbaf8a5e053db3fa77af51d975a22ab70321bfc40af2e3828542f4236adb4755552c9437ce84d39332588d33eae8fe5119eccca99d74962a3c9f09ee67eea15f24e58fdeb5536db348f335c67ddcf19dfe848cb1bf5f2be87f5641032816376f9dd3a983822463898a9ac4fa1c88294747715251561bed2933c08be3c006f05a7b3fce71c179e9fc1bb1de53392ba96d0080179c058c441b9e370714526fe5a01dd1ceb43fdbd75efa6324d799955a4cf9441f50c25e456c6436f95fb183851782552a4e3ba51d2597225b8f2b84dbd01ab4bebb18a49712ea84e86297c4be4e394a3d88646bc8da23d09373a2534fdec05540253bb9435ce0f9c1ee444de9557f880d3bc81ae16dee47085dec4022057b0d3cba15569f542939f58609cdacadf9d5055a9b123be4fdde7985a8a4eee0d37032769527587fa1e09cc7122c8323d1c7ca23a98dd63e970031d8545288d6224c9cc034e60731a9212a89fc6704e67f4ff3638366168abe7c5300fa1dc6b95f56e079cc9b97595750031d8d346244a5619031e924c5eaa8ab82200032737621f4e5684fa19c40de1ac18cc6d416ca42dc59e52b07e1a69f3dca3ce63ba55a4c1a3cc761148f83808c62b840b9252ec3fbb2060b9e7c75f6d94891722056d24771bdc8806d3c5124153b2e07ccbb16b02987c0e0ad70a29b48ddba6a3201ed15f4c055ce2b9e3feb5a7ff082215587c9d891c9c02c2eae1c5efd8625c6535ec57be13465f5d4b5acff1945f0a7a11b0e41546b1e8f3a3ae85fff4ec1c89c2dd44398d04e7689464ce2c631929b4652c9e7645684a0857d6c2cbbe2363496c88a5d05050fc76d488ba7f953959cccb5ce8e062c203df001a542cd5e3ec4fe97eb15619a9149022c9ad71b9de36a3a5d257a0d3ccca684666a703ded560df69a53ba546dbade63093831c306d04bf0ab91ef00f96e22edc0e9745ee374693ea38e7c9a66f766d395be678036af3520d65e817f05c7a9e4b5ee15decfdd2c40e6a75789c112a2cd02da7e7aaa27b57b50626a8f989630b47550d39efbdf17d08da5e066039e2be80c51a0221853d0d840fea4e5d0a818de468b455d1a99b98b69ba89c118ff0bdcb250fbfaef760e3eb3098b92512e0cbf2cd32052281727ce17a1d55824fe953029190dab087eb179c5981c1e785a2400bcacfb5fd63025983d3841b2123e21b529bcae8f9162068db42e1280053dae8de583b3b713f2f78738df67188b7a01f40f0918fa1e51ddf85757ce251e903bb996d87ae4c845a420e6333e0a3c292521190d1318d4840446166d1241f4a837b47179ea554e144991857037225cbcb44e782a9c08d58f166da0e7dddd3b05ff2f7cb5ca53e445a3e6c06a1e3e03c7912619a8418606b4b5a6d8df274ce2aad313d5ac4305024352e9219046a0ec8ff68f6d7ce075490b9bd41fc9940f8a73fadf6577a4742f08d0524f72500d944e950ec1a7b45d2bdd46df4bedae251dbfd53c97a4d3c746de80214c46675522ca77fcbb13500597ad629d5625f9c2ea4c38d1334225b00ec20b9127dc4a15d65f129f4f95668768b51b02341df16c8430c163878ea13ed24b683b993732cc35b987c78e2bd25f1fc6ee4e152bd489baebe997a247076d380c092acecb79c91213a29ab370776cd2c3b3871204cd156e2ce3ff091fd31b65cfb824f14f400f6d9bea7894b8e2744e60b68cc0c05084c024e1cf64867a132f7429c9411fd0c9e225f4828bd9f523bdf3f5a8c21b09dbb8f4770bde3a488928ebdf0ff3d2c300bf6f4eccc94c5b1e4551ef25d144cdf78fbab3fbf37f01160ecaf91b153e6a9322575c082c4eefcfcb41f606eacbc87e9ad7022a0916ca782ba8a2bf4f408d135a1605c85ba1e211a78747ffbd1ba7c36589bb7cd801166efcf55a8e2e9e24bc6cbcfbf1ede191a777fb4a6a67a39bb92498b8d06b287882c859d668a7757716572334aa19f4624fbd7dfb3cd42a34f6f12da60c850a21a2e9998bf4256b961200e57621dff71ff89860ab8f1388b889e6836fd22f120d9f42e08f4999454c0523038e056404d989a3dbee88cb59a57efd7c5bd3827bc85a0bc8c02953ed0d7dcaa108c115a48ebe00c19ac6a0b7daac1b1468d6d8252e93f061bc381523fbea0f248d4de1945c704fd01510d54aceebfe791ff1a44852613dbeddecf2e7fdff1e981cfad3c615f65ec413546c787497f2dadcb2022a6a2aa463bdef07ce1f303b06c8413357261f8d662a71d344737504ba69b8be1ea8252e6838ca8936dcd7041dfd6a646d1cc0b12436f3c89a7feaf8f57fcd34f860017798b1cfb22395d2f2836dd02988ac37178f82e5c543a98b8982e59a0729168c866526ce53173da0b9300e6c17ce85a74032f052a82142b290911a0edb93bade04baa6e061678107143823fbfdbf3c06c0dd0de671ab6567cc3ee3a657e7ecf6d10acfe4ecb89f9698307623643468e0ecb86d9d9b18db9ebd3272d674b43d42784367f2454b3759ca6bfdb30a9001d8b0ec48ed1378d40a33524c3a81de9f331833c8a3e9cee970f651dbfce88b26ed8f6a4240fa2907529e11a44d4b35483310d25e3c006f2d7d51432acc216d43a4de48db275262f925ac1669a7e6e9317fac48f5a8c60620767062e78bc4d93c3fbd5dd47a332512d2fda7447f76a7badc77f862f290ee4b89804280f591a6badc290d3e128c46b681e69d71c3ed2a3b6cc4c530e0479309d6287b692e08529de31d830126afb4a4652a8aeb3303d3547d00b93b661edc1b226d6d79a7761fd1e43264a090a0d8e9cca3454ff74b8257714e299ed3c6f5b6648b9c26bc78ff09121b9a485282e4c5c2b240129ac0819c8532b0b9cca4472c180836f7285d09386581375779cb546d4c8ac6043b3255ab1035c1d6e07647f453130bbe2aaf04e5b7bf49d0cd6474c25a75c67901a23870ae77c32e61af3ffea207f8749100649c3cc054c36691d4127bfc7ad18e1f018ed75f0609001dd83e41d6e2ac66964c248eccb2802c378c9252146c8674ac23b81fc13b0089add0152a1141a6472370df94ae57e54ab1c3a26c55f24a1dd0ccd360e794f0a63987a08d50ffb84a76d3689ac1211ea5d8917dedd6abf81476dd0ac1c7017aee6abc9ee1a41e6f5edd0b89b9d99983857dc32914abc1e20c29c2c2882c21923c947c980e43393500716ba97ec56ce33fd4d01240988636baaf5aca649f87fe606606fecb888b6a7c62dc99688774d648982ce1cbaaa3282467050963b31d95c29f55d427d4166b142f767a695ee5be116bfc9455f405c12a1c3e7dbb14564f94c73dc0a7af0aba2b89c172b2fe5f9c059c0a51fa792481ba1fb6f97faed51fa1e1857eafa818290875f34d876e2a17e5adcc7bebc7b01b941b9934c2e4942e9064d836f976444ebff2dd6c52f44fd9132f4a4a0ab659f052f5b80e6696d217568dea33b7a90302d011384961f7809b0238ed7e26a28492676e4368ee5548a3f5be6b7c3f4342ade03db48e82bb247dc95b52638fc38802881d0c2691f2801d0be3a66700ca06e22070d3987ff4d44db8f952832f0a74e43f77b7874bb68fa67435fffb3a5d98b034ae7766999e8c9563366a70d86110deff01dc7cfae0391be8ebad2fe2d816a06daa82ad16587e43c91dcad74b672541420d12c50f82f737de005ad7235436f404e87ae5b3ac732a92a34bfa3c20f267fd4c7ab07947232044ed716b52a0eee6bbd8388d7e4d15c904a4ac17bc8a7c57032a9e8e8a5c30ceba4a078e335cf0db5a938e3233d9e16a503d741755da53cb2b848c86c25199e1245000f93043ed0b8ca80200a4d1cd64118869789d5e90f2b393c38faf9492f91051c29563e737b8d7c5c704dd199696ecbdf796524a299394015b080f081b083dddfbbb0e92e54cac171d082fc24500c43d3192e533573280171d8acfb0e33fc3cc2ba48f17e79700bc38bdd079718ab17b78f8e26c5abd38b570f0e2740200fef30889f313080d369831481685caef5a062fcea0a9e47b518a91645422baa2362f4ad98e17e5171e456408b2077fcd8b52a900dbc50e7436cd8b9f6366bba86dff1cc9aa4168760028e60680a22e0104c59bad251901c5cc0050d40b004700c51b8d480450cc0a00455dc4a5116dfa2180e2cdce50208062fe0014b50730a84d3f01a078b3f3880050cc4440516f10146f68363a0028660380a22e402b1b6dfa4240f106cf7c4031f780a226c06bb6e9077961261628661e50d41d30316dfa406694857f80621e00286a01f88cfe8ecf70cb0728e60080a2d631c2ad4dbf87d175ba30baa20f0050cc1c80a25e81a2ca69d30fc7bc012866ad0128ea1c5054c1367d1c50bcb92ebaa26f3300c51b15088a2afd81a2a6ff44f90614b3e6018a7a0798b46d40f16657998cb26c0d28dea87480a24ae70045adaa59e300e9cd162d28de6c51dbe055ba1615499d99a40227a67136b3e19bd31a5112b09766d4d42475269426457369ad198cc2742a8f5dc49c9868100d923ad9680924d86ba63edf5c37cb3564a1ecca2d2525a9c314862ce6e4464652c777b7e1177e022761240c0b1386c32d5c05136121ec72fa7c6f4e6540c96257264c8a3109690ae5ebba3f5ca32b044605a9336363665032398620757cdfcf375791ac601a93449c2d933a54db5c446c2fbccc10238707fbf9ae9f6f4d4657f445215949636df91d8d4d8fa40eb67c20b2c73f67b1ba7b752315f46e7bce0eda5fb6a9267b2d49007b326dad71b66912d4a63ff67c516362e747142005d8b283098a40f6fc1f76fec654c294404ca94bd3d6db9f7ef69c2a5a7a983d147776a84a2582ccf6f7917252ea5cabe420875486568656665b9e200fb1b0b267ce13a6e7d3393fb9bb3d6d0e91aef9405461026da74892ec49bd6c31f7b03939e80955ab5beab9d30f7e53eae1299cc4113ba16def4bf92738cb47bf50d65aa5fa705321fa725aedc559dbb8ce4bc9e899ba6bd2e66cd0dcc081812a878e1a9b1d3c6efec3ff9bcba0cbc02b92b327160f2d0e4e475f3467ad73cc3407e3ae38a741e7f3714c74e57405e6a17d24586ca645cec5b99c27c8593e6f61b287522ec63ddd7baf067f2f0777f5f7de7bc3bf37c8fdbff7de7bf3f7b22ef8f7de7bbfbf97e7dafcbdf7de9abfb783cbe3efbdf7eef87b815cd5df7befc5e0effd7175fcbdf7de1c7fef002ecddf7befb5f1f70ae0e2f87befbd37fede9d5be3efbdf76e7faf8ffbf3cabd7706e0de7befd5b95368e6affe7befbd3deebdf75eeeeffd1000f7de8b736feaefbdf73e8de7c1cd206783202c9e0e80fc188000767c0440a7070034c0d10087831b2b1dc20d34c8c1c9c0c6df70cfdd703540efdbb8edb79b8d9bb1e96ab66db3d96ab64df3e0766cdb66b3d56c9b8c6ac360db3ea523874c25c340e6d1641be3138d8d0e870e372e8d8d17a7c376d452b9361db455c964797399ccc7a7f18e3e6ee08ca6b5f6cbe59a1dd49f6f0ee394cdeedd14f7b6e7eddf896526f9d898eca1201c398bd26a85d62b58b687f3de572ad2a702ad5eac55b6f7b548f684ef7d6d39ab6697e76d6086f4a9473c2f5234b677f35e7dbd9e5e605e514ecec3a30ae953953a78915ad1247b3e2467d5714c1ac791e98af37c11d2a73e0179911a01933d35ef3d1d725695c968d191f754c87974bcf7148af4b1403f5ea452b6b703ca59d6356b79ef609cc7e6bd772fa48f3d7ad1c1d81e064bceb2af57d3cbcbeb69741e1c4e481fab248017fd0925d993e3e52c3b8eb011c953bdf7ae83f4b14f3b2f3a0fdbb3f19e9579900f156d2fbff7538cf4b940d3879d63c2c89e1b31675d974be68272cdb6477385f4b94701f0debbafd7547a2dbd9ab647dffb7984f4b94ad387d5797126b1bd1aeffd2472d61dc76934bebc991e2fce29dbbb4fb23000785186b1bdcf80f4c140f3bddf80f36cefbd0ab207bb64ae984882b3b0cbfb22d2071f4d1ff6a5922702d9de6b04e7d1defb10644f7def43e749bd062f6eb0bd773c7ae08b747b9f237db0128eec71161ee9cabee7fd943ef869fab0ef79af81e78197b4ab8bb2b8eaca711d4d1fce0acf1165715cd5ae97d2f4e15e1d286dbbc964a36c94d5a7e9c30101a94fdb7e9551d6368e553656d9586540d3677bfa01e4a2acedf572bd5c2fd7d1f4d9940670f4a2accdf57abd94a6cf762400a56d35996c948db2a7e9b301edd8a76ddfca284b1b472b1bad6cb432a0e9a33df900725196f67ab95eae97eb68fa684a01387a5196e67abd5e4ad3473bd2511a292bcb64a36c948ddbfe7d9a3e1a508ffbb4ed5f1965e571bcb2f1cac62b039a3ef90900402ecacaaf97ebe57ab98ea64f56e2e0e84559d9e57abdb2ebb5ed63a5e9938fa6064a948573d65886c76d1fe7e39e9ea64f069a3e641508c8b7889ff653d9531995ad40fb3494d98083715634c801713200410ec659d9f6736e523c38ee75f3dc6bdbc7f9bc97714037321e321907b4ed6750d3e9189f6a461de3f8b4ed833b389beda554b3bd746c2fa56dffc360c3b1b9b6230c36178ecde56daeed68dbff1c9a4ab6016120c321f3641bd0b67f6323e7f1c9c6e88d797cdaf679dcc034da4ba96ba954faa5b4edefb8976aae23cda5b934d7d1b66f53c3ce649906d4b564b22cd380b6fd1a239dc7a73c8ee3530d9ed68b872fa5acc197d2b6cf693a2a9d4cbeb3ebc8b52d78b4eda738a11c3e95641968fa6c2328aa545a63d9ce40db2ae98f7b926de3f4e1be481ff66d4bc5c5b4903a761bb77d95f7816f1930a78aae9b6cbb93f3881369c79c47ecfcf3ef590478fb53698e7329ecaa8baeecbb5c1f3817fbb8274ee6a22c0e8cafec87d996737151dbbab898d4b13ba78a1637d9b6bfc99c07cc06c5c168ce5a4b0ec90d50b995742e666dd6aae7643e2ac3e2dc323f559a0c78019c1054903deeeeeebec3f3c0531f0a1e62145cd91c6c990505aecde974f373ceba757fcf885377b73216dbf5f3a79d6ea79b1e50fb1944e1c62b32c116e6b6e005a48cba165fb88eb65402e8aa3fc5acd0b10279c57568e31ab4f15331d2474a1fdbe3a761644ff7acc9346663c7130a8cea098bb429f519ff6cd2a09851e0e1d2fbe0c88f15ea7419e5219612fcd1cd8fee681af7daa6713bb6d7669ba79b1fcd5aab7e0cf7dfdc600acae7e119a9ef3b3c112a131393b7349d4c934903b9209d134dcc06e3c73b4c745535d734cdb70f3450771ee6fc6108c4cbc60fa429c706cd01e92efe1adffcaa5d8105bd2b2075f05340fac05545592af80abf93e8318fd9e0094e210cbc22149c4473c83d83f7834c1fb9e3e1bcdbf4a9efb258de728c93e1f08a5cb07a78856cb3baedfa2777cd5da76d910034dcf950f594898eae83c81eb977360d695efc1b3830f091db878ebec2ab1b9a46e5ab95d672784634217494d19ebe9812e9c8b4f1774f71784552600b73cb8062eabbd75ee519d1de035b981ef3108b1e63fad1ea400decb4ea7d0b75e74722b3f3dfe764073e7d8e7e3a609a82f0f45e58464270b8f3a1ca5b9476ef19a1413ce4412226991327041584ae38cd30464a2e0b8235d1592daae17970f347e319c9e01c0245ff4964348de88bf7690b48c82b72535c900e7ff8af52693de60ca1ef4feeb989bf7b7102b16b7846f2fbcf18394f77f49af144c8294febf09b4393a8a3e338e6ef5e14f2c022fe4da26f0ee550c18f82d4c1eeae4e88b350a02bac04b524674d58ca1fc0182d4e214b97a40e7efad151882f31fc9f23c7cc0c550167d7b450b73f1299edf9b387ce231ae1c04ef4d745b6f7231c38893238877c0a4d21222e7bceb30905ffa43c6a26a78c02a5ed15f1dec116e607f953ef9e7f4e7d2ccced81297846dd0764fbc40eb60bf18cbc4f9c401c89418c266c638c9fc39db79c07c85d1a7822e4f7bf224773d65a2ce4be14e877812d878aa64b7404e188068f70e0053cc4cfc2dc1b98c28f17f0a3e03cdb63cca47ddcf6e579c5c6184856d24baa9f4c94557de5df650d631ce2e778ecd3af7e8d4f888c64eefc3b94e54fbec20f66e3a8240fb33106daf88336fe1f4fb4e87f57a8fee4f8bd22146c61ee0c6ab0fb68cd15c6390b37701247ac42bbfefd797fbed350d09eef5836fd1c22cd45a9e09df781ddf9a5f529377c737cd022654d222faa26bd9484ecc9811e217dbce88acf5c70e127e8338a44dff31630ffda22f3535e91f917949bc23aafc8b49bca7bc11e1e52b08e30412959142657f591b4a45de98823750059813ee2ffbb3ae82fe93fc41dcc41e8191235729ea35a93f66d39cc75643ed2f695fbfaee84ece9be7e37df03c5e9b2bd790b98bf7945e63b9483f1996c86690c6afa741a8bf5a0459fedd8b3524f531f7df21585499a7a5f39d59aaae87f28f34b1ff19887f55998dbbd7828ba93c3809c4774a75dab4bf6c8fa4960c6a830bbfe0f18b4e84eeee43c1e73e9d291a8bb23d125aa44b160f19c4daf7858fdb9499f3cac150884e915c8c34a6352a7be10fa087d16a62355094495c89eedb9dfb6bf9fc881e274d9e6b0e8ef3207e361fd9c1e747d975587c252a9087675905e79ba3f63333663dda657a897c7b111298cc2fcc859da8d5ce25abffead4857a44ea558bc68fad023a48ffa957af926d592a64a49489dfaa2e7b0eb733f5c5aa43198f388f4efd72fb2c78f50ff90c8587fa7a1a23ddf7d3ea5e01cba9da8556eae503757bd4e596d8a7a719e1e3416be4ad39f4f9f648fa493562ed5f99e9e8775856a77f6d01271a0ed3b149c3c48ee0fd164687c04c9058f50f07ead427f86eab306ab874c3879438b9656cb3af3429cc77e0c170ce11b2104e7a9b1e007b66efb41926d2b0d61841c9f5c51f76ad4ae4f6badb2d65a6b7561df2c575cd9a21ce5df0fc179ee8fa0a239abaefc6ab0fe21839e2d0fa5644a638271cf33342e4a29e5e74c8f3e2769473f107ce30fa2895cad0e4a991227845215826c0d04d96208fb88fc4e0c617bd769da431b5fe34f903df9ad9e2f93f26eec39ffbe8d1a9fd42627f3a53e51a5f70557989f0a415436dc092dd0b267befdd944f638cf7dfb53c8ce2b2205c50f6c79c54e20e731c1431baa54f2e7bb6690ec9992fbb7765224e9c3bea863b59c55f3d321849e20d878686d9289f4f22d9d394fed0312a5f3d39f4f73e6e867bf15ac7d77495fcd7befbdf7de9ad4791ff8bef7de7b6ff579e9bda9fb61ce5a7b185e9bc569698ba1d427482badb4f2f39772b6b4f33895f1192dd55a6babadb5d61c1974adb5d65aadad44b22db35811dbf6a5d7df62be9fdcd509cb96599cae6cf7a6b8ed59634f1d53f64c4daeecdb6cc73c45db97dbbf8ad98413ee0ff10bde90e9743138b9e5146999c50a2b5b66b1e26873dea9bce8a6a524d1a7a391d9bc907c2041640f1a6364687fe44abcb1e9933da93742d40ccac3a54d43038af5b52bd0ae11db63173127262c5b6b50a4443bca630a4316734aa540d199f6eb8924249895dd75a0e8aeed5406942cf6b461528c4948dbc6e1d89819942c67242b98c6a42b9bb625dad93b5b4be36850dba62f725bbe4f9e3ee8ac51482964382b1572456b8c8c8a85d64d4f0149f6bd56a98e7bd22dbd9a4445b28238e0c5da43035eac4294f0623d8204aff1fed40cc942c1c88bf50506bc589b2ce0c51ac3086ea30ac99a2e115ea42950c08b748b222f521684e0ba08c99a30105ea422f8e0456a020f5ea45912f02285512892359d10f0229d81c88b94ca7e91f630c4535e4896b70ef0a28b618017dd8c02bc485f1022e38464f9cbe745d7d2f3a2574180173d05415ef42725193209c7599208be3a68d0f225b883657b9c33d775dc10cfa2de19c43f846e1e601ad504a7f6947e62b735aa499f6e339d765ad5d1e049aba6b1d91857156caad56854a1a6654da3d99a06567b6f9d9fa837e6b4ac69793e0627c6396bda764268a9bdd652fa73ce3927a53f2db5d75a6bafb5d7da69a7b5d65ad05f033bfb48926ed68871d2d68a55e8c40e23a163bad79b820e4ed061462bd44de3e10d2d7a6aa973bf86ff2a95be5ef40929489d8b8287f77384d0a2def763f7fe910d50d6101530207d24307ddcbf7f5fcf21b13dafd8f367128b9b4ff82183963d74df9f462fd0dfee6f1c0625dd91308d9fa6e0f7526b41fc9c6704532a653b9b42e5e94634d28b1bdb8dcfc627e5782754eeb49c2ad5dc4013385054a924b881db089a90672c386b8cb2868c4e20fd46e0e40f710a66106824db390f96c9f9358953923d9e13b22725f3a91428cefaf2b8fa929d95ef7747cd987bb31b38db665af5219ded189d51564542ca39d248cee37bfe48c791ce2315e6e1b45291ea8bce26fe5918a82807b3e7ff8041d797f36cf4079a1fe22c1af071e813f5329b3c9c4b37b468fa1cfd56a8938629da602df270cea4ce3c729f85b96945aa583aea3cb282a92c903d5eeabdedbd979f98023d707b2a6e4f917eeefb5cf7fdc61487c1b2ed3737fe56f02d526a86ec997b3e3d63b26a8caee6cb6098d5c99e55863d5bf8452057f34db0e767d9136a4f2e629dedf99c5791a4cefc9c299a22c5f6fcf91628569f8a64aeb9fde63c582e6da24e1e4eca654fba14c659f3e9cc79f03f8eca662676f3e992cfa7239d383634b469be3365cf033ac58abf89e59b41334916c6de2966e447328ac8cac67fb7ed3e12996d04ff055b98437cfb8ed0df6610c8c29c51b2a788b3985a8ae9a455fe10a775d3bf20dd860ce930eec08b69e8af02de2dd01e73ccaef4936e7ff6f0d07bbafdfc193567d307c8f4d1e56c247828e5061bbf9633b246eee654fd9c01458d6303c59f3efa3529545f8e5c6dafa596bd3d069f137b7b1c05d8dbdfe8607b379201c59c02b78de6dbecdbf87e6c3ccd097b1349d81b68e3e5a64988d8b06103c4913a1b48f372d31f9a772109119ab79686e6b7ef7aa0b5294d0992880d319c2158c1eefb8979cb9ff4ab88b3e55b210090b187b0fce9729e2b7fb65c30611b412a09d9b549ea95c8a46472a8294b6b194957a9d4cb4c29864bcf820553f5c019811f28394ad1b4ebcb3ae794b5f370669a5b3fda39f6c22581edfa72f7d8f291d81739b03d10891cb37fb0f162fdfca1f31cf13ef450a652a9542a053ee8396947322b985f4ad943aca037f39904afbef74368fdf29e013d1089f6168362b69e0732bf713232325aa60192c8e55effc63da765b4d6325afb8ef33eb1f380842593c88dbff1338f648ed95ab6f748e698a5ed3da62fa33f2d23da2da3c1f7d0f33c24f6c5d4b740f70f1dc0f172d71a8fe3fb99791792903003fe2469251909b9806078a145e4c7850f8c59420561948186983144665e49122233a0129abf910291d8f7b81f66de7e343640570e22336093999f81ed0cce7c3333df05e8ca312801a9e3afe399408b322684fd99b742ea27765063066ca222a264e66b804d32112599aee42b513203bab055d1e1081b6658220a23221f904e2f314a9a9eaa4843082292aee42ba9f14a667e03945503d47425df41155dc997719926ae8a2a3bdd25655df79a4384ae4fc2f431926082ac596bf7604a1d9f2931498d8273ed39b779f9dccd6bda8df69b767301674d28bac23f299eb3e6757c8e573d063c387edea0791b357ece6821431210c20824384f9680b3fee7a7e03c746aee19d1344d48065050380370c240700a7da0e6f1353cbea6be6351b4555b66c1026873b5dbf1dd3cfdb4ffeffbfafdf0f6ef979ffbee771ff7ded77dead3fa6bd4781a9ac7f1dd507d187c8e4ff53abe1cef9f8eaff9fc6d3eb96f7e884f580db6d9f1e1afde0778dffc64a2fff8e70ed0a6061473ed6abe9b9f3b87082d4ea809f5a263d9f8455762e3175d48083fb7e39b9b47cddb7cf58cf0f89aa73cbee639ef7688c0e36b7e88efa8f95a987bc7cfa8300e14f443fcc6774dfd0bc8953f940cc5d9b2e1f1edf8b2873b3ebb6d3e0fb4afc1afe39b613cc49fe3f39687f8559f0379881f83cf5d9f077988ffc6e79fdbf89cc88b3ed79fcb7cfec2ef7d0ef32b8e743fc792e44a1e8efff9927b53f61975721eed77fdaeee5aed27b5cd1e11623577affed683ec5aa767a4babbdb26772ffee4b328143c6d99a5cb95dde5685b6b6f68d1d803c1e737a3b0bfcf3c0cc63b34e7bc71536e5cbf9a9c358c71ee7276d0339d87136a688a21595a9ab131c638632fc8e59e833b7586fb09e53cf9797c267bccf846b0a0c433aa89640322d84c318de5f01d408420a58a27050900e931e29e160eb0852440f2e0dfbc6eeff0fb9187dc73dcbddeb4b7f7b6efb64f4db1b2e4bd8cf6a7d3fbd4adb53a6ded3ded53e3ce4fff62b132b494df6508b33508abe831d163a2c75a942ed5d73b897414a2ae1e3836236da21e1803c18c93e331ee7307e278453658d5caa55efcce73ca4459381ed3590d6d882a1ca03f81220d0a6f809906f428edab0ef41507e617f3c679de7beab74d6fdb96da5e664b6daa6ddb3ec8b66ddbb66ddb96e319d9ba6ddb64b6ef3aaf03c189e319d9c0143cc45ffe21ce851dfdb66f6e0dcc86e99c4c9db75c4dbed7a14a148baf9cbe90ee47a9481ff8c8431c16491dfcda4789fcc96555360633141415a39449f6d0ad514da323dd9af653fad071fac0afbd967a24323bf5be395013b2a54880edfd8e8cf7da93f1bcd17b21cec3bde7b3bd2780f43e88ece9def33ccf7bcff3641ef48c78329ee7698fcd3c967951bfcc8d5764060cad56eb094d4113aebce5091213bef6de7b2f045c509a26fbb95694ac3c011440464b3c26d65a6b9178f295041365021261804c482208ef689a1a3f4b96905ba8c0b0d87105587111490912ca4c7ea680090a98c8518a1f7cedbdf7de8b63df7befd52266b6efbd59b4e82c29a8416ef1824836114608cacb154ecc96f0e0f262975c5faacca62934686826f304370dc99e5cb9f7de19165f49a5a526ed01332f610d1dc0884571c117504d88dc1df67dfd65df961833049530c43873d7f5a2a8cac507345cd5015c185da24a45174552b80294305151f282285230a94c38456152b493f1c516638ccf10a22b99f3cf0d32dae414443023308808dab6018c600c125f9c44b0022074706d3238e9321be221bee00756748318980f485ca1a105dc1623c238d9a10902a8254304c929c080c26310e957d1146ce402261915d43003bef6de7baf962186f6bdf706cd24b0d8333a202bc5ce40492042a889097624c3740415453a218b714eb0b04e8860ad566b0a26da320a588bc849511dfaf071feef903bd18c4411bb4e6890c517638c3186a2096a639cc31014add2345adf5087cea801430e5880d1058a9f31c65011c20816dc07ec300baaa207275c15474f3efc4802821611484cbc10b1c5cf84c2618c1fba128ee0a18624ae1841144ae6932e320419618c711090af649091a021adea7e5250c49210c8926a80a24395a11b4034f9f071fea160cce42e859f31c61896e42b393239d905c062a110205c3c18e1258b2b58680f5d8af0ba94c0a5559a46eba5314362965c308c31660213b431eea1cb82461951b41f262e6ac03180382f78428b2d404c61e50b26921859c0822c323198145d2c90c08c20ca920ce30e328da32516482d58985c18635ce5c3c7f9b7415aba5cb10d6d0da0220811784d00e921a78d68cc9596eb0b580e38074b74022a122a87555e2b4843a9e80730309528f785289632e00a59138ca5d8bb64ee501c7c1e91341fe7c3c7f9af42450bed89b5d63e31f2957c6598465225fd183ee009d34e102fb90aa127202a85dd42d3b8269a2685144d4dbeb811205e55a986a46ee9873a8009d7bdf732f1d68e945454996d8cb355420b0d8c1d722ca850c2894b8a6108638c9d6839c00917187ff2f4848a1374618124c61833f9f0713ea84b0a0aa32219c688fa82a50c5c44654c92a6699af653e42b7964e50a16a5127e9670184230f1e104569c0cc1840c430a1745d65abb84155fc92b198b56522dbd91259ac29d2ad689fe9a74efbd5a64f0b2ef3dc2044a206901c58c9f228c83982c9a946c0892df5a6bc388f94acaa08a84316bb98a4009e12064c87eb44ad3688d6fd0966d015ddc34848238e8d1c245d40ba2a2c002862e36fc28a1699aa66521e42b4964f482212519c9624ceac249ebe2cb931fe20e5cc64c7162cc099e98627471e24a54f5408c28ad20664c5c60a96734a518d074efbdef23048d9a664ad012941d6ed0678c3176f94a0a11d9225b18fd1845c8b0a488a84b1337bc649210d22a4da3f505bf20995165a8082943d8862dc61a59b640810e5f77982e8b2f166ab55a31608c31aeb131c618bbb6dc2283d0c6d8b593c060a225017df83817e3ba25cb0d395ca37ad444ca3d62ce643269c8702706891d8b2fc618638c316e32c2cac6d80a4d0ba4705ca0c829622fbc6028081fc4bc8892b840c92243030e5aa4f03065054a44f105d7d02445152f0a0d5cb23c63a4186717bcc08698983fc6788c2669204dbc61fb846b63998d31187a581b20c62593f029484c1c146f26c5698b202fb27851a362c0d7de7bef55c0102d4dd3d2c3089a3811c2e8c7059806241f2a52102e269911cc7849914c235dc96cbb9c819dcc2636bc144394b404132a4ba4ac00cb11627cc1642597a525268c317e828bf6908d1248100514315aa0d81002a3218c5a60b92c1947284a10dba161009391d5b20570400206298a20818bc98aa19264c91353d3981fbe98155130b6502e387cf838ff4d59c420858849c489549c1882660b4b2d529c5ab70a30568c2a3b425b6a88a2822f4870c49319943c29f1a24a9221588b0a0e60ca408a61280bce0b4d0372460f49d0e0c44a165e10c153367e5db497e8a00417b2041e8ceebd178acc86dc321446b68778b652f45333a8035e18b5ec4d4fb49c8a1f2daec75c98e84ae6265aa569b4963286a6699a56e42b7964e50a16a5a5052cd19414dbf7feb8039a8062b2538788f94a0e21cb4340e921662a225a4f842bf42efb4ef184114245f98bcc842f505a0b0b70d0863e7c9c7f210fdf7bef76b7eb5234dd1054a150b282a12a6ff1c518638ca950a2b531c63570d1fd6895a6d11a1301652230553af8c08f1645428c71c4c513938c222b5eb884a317141c143f0049e1d2c36c630c055f7b535130ba925bbb4b2d8021480a1aed892c964cd932cbe2880722a2789112810a2334ae931ff287f7091a829aa2e81283c18910d5034baf2d34887105891db00c398c51daa116162be2e1c3c7f9bf181812a30727c0b852051522b7a6b12f0e44eec5185b0d4fa182102c696202511469e143154fb4cc10021aa6e4f0650fedc841e34806335e512ef8c20823820033b524b19480a21ec000d3da320b8356d1524516a9a0d1e28b855aad56138c31c63936c618e32d474c1be36cc7259a949d291cb64f348d8a29464f90f8ac598c313ec3e52b299489f403ce3052bd6be609eed2e2a29950303ea93c542e4442331d232ccab862044c284144858b0e2e4e8a1aa880e2046bb55a4fae6482b2e2c485c9101eea92a4699a06f395444a1a999c620f1843e62bb9c52049617297178a6820818c66354dd3b4fb9ab7354dd3b42366be922d971091d16d00122f8ac3fdd162888240f518638c957c2597624dbe9256ab2110415aa569b4c68106dc84039525fa6b0c3a1830851394fd7b31de72451a1bdf8dc128c4c4ec96518a14a37ad444886dcb134948f91d7c826af1c594a9d56a51c118638c319eb22d9bc288da188b2562d8b62d4cd0821ae38b26a204e1189ad208639bc64499819e41b110143f685439da4952e4840f3f28e170839527a6174c70d102a858abd58a6225153324410521021fa298587c31c61863df18638cb36c1ac18f56691a4d0375103e4041b1a40b204d9f08f239676cadcdf9adb5d6da28a85c42d4ace51222ca259061a47d9a267fce5a105cd62a1a560933d8943a672e64bc76cef96d9ca7dbf91f27eb336625a0d17a2c72b6399909d56ab5a4dc2bb534d1b4ef6c37b9768d2c6440fd7815a3195e4489bd60c51437c81dc408e386fb2f7b780e60c6921b6078418b491573563486071b3235b2e4a22b99996427185ba9513c11e48442b9f77eb7afdf7b6b2d4307269e68594195344a40e46229fb76a1b20315306b5dc539bfdbb8fe9481914559ed7b1cbff2c5108d0e3f186f50687124b3c86634bc38bf7d7db981bf2ffe8ca1f8e2858d9f461546c9c66fe3aca0c5a864cc184a7b9aa1a90100000000c3160000380c0a064442599ea6499cf5f614800e6596526c50369d86b224485214c510a3000000000000208800829073b4a3001789589a955a9b67b75d52f2f90cb9b4157bcdd2c16ce3e00a990a31292226c739bbbd9835c20adcc6afa81012339a8037382fdd96c7f08b065c974661e27fbe4b6b2600cee951ed6d1c1c96205aba8556c83643ff8511e10c604d7a368661f77c56de01b4617dc87331da1eb9a09829d58134a28a237f74e4ca32aae8855cf3505a7cdce072f6b98838a5d6a375f2bcd63d2c995f60756cdabdf3d30f62ae806482f2e47fd2d0745d633cb442a43114e0ec4bcc81e0860d4f474b978ff8c71f480d3364e88b3bd2e3bab5e32faf69da18b2cec5c44bcde9d49c5e95099b68a5a701e4e6baa1272bbd14fd1e7692dd4b3bc99b8fba5a9c3c8ef5ec7a01abc045be1013800ec5369816f763a72e882d5cfc32bef807ff526d70d39601b99b926465357582a9a4acccd80c1d7c0992d1a68bfeae692239d12300edae46f6ab7ca0bb8d1ee94cc9925dc131abc92cd9dec37e20944b2766e17a123882e69f99e7e34aec1c67275835854084012c2b051d2f3360ef867c98be957e8668364aea0a8a4054494ac64b56fa0f73e6a633ffda7d13a6344c142b028d257aab535d8cb8d4842da4457587a87159ef481344ed96963c519c67e13addafd15397b633a8a08a34b8f0ee2193806ba69aa9f7974550bfd34c867623b14251abaf7165845690ee8d4aafecc1a9c3d4cd2b5efef7c82a8e9adb37d6935613b7d97c1ec4c8d7f0a486aca200fb12e3a03bdf243d0cdf6b57e274dfbed096f8dcbef9150e58292f0d7dbc28fd5854239db3400c10d241b4e16e47881bf28b7815201a36e38c706f89ee09557e7df2edca497860a1da903fe008c478d59a620c59a6ba01f05cdb7e18c0433643bd3feed737260631c9e07d006b5bf63808adbc7b45b7ef99aa0e5083a693e85183120e430db11e3e40907ea4618c467097b8074336ebf41d69d1874b8927312a54df0b10ad126090f2f62175a70ecad31d6ac2c30535e3e16a8ddc8948978012eaa875417b41318f703dd749607b67573e026a9e06665b282c4fcf8e299fcdc5c45993af3108d9f7046db141719d84240fcfdd6f09f3a1a9efe7603bb0744354e9c20019d4e9f5e7bbd596b9fc885e9e5e36f9fc8a9ab77be6c6a20d05a692df0b1253154b6dd6d245696b2afc72accb89cbd07d6ff1f4797a35be9f69ef5debc61b848a4c37341738aa729631219d35f0b839edb3b0d2e07523ea99bcfbd208cffd0ea2b9bbc9596451aa0dfebd42dc888495b4cf1db9a9ad6a0e38963ac28bc74e88861bd68a7ff8fdefaa4de013b5af3d5f2a02ba7e43255b2022065fa05515dbfce106f54db4f28bb7552e39881a4cd65865cf8fb0c5a1b38338633248e159842ba32e12268214f8a898b87fe3865ee5ce60ae80503f560080caf3abfc94ba346cc56d73435b2a66abcc7a44d1a1cead361b9838097d26b0ae0d8c8740f7ee85655c34356d631faccad21663422484ed4a4f5fde07582a2273f61178228dcaaca68055963f8e756ca37296d4b64cd06f6f05d172a7ed8de872a3081d11de94aa91798c980f1db1d6cada53246d0cfb194a6f62a0241bc0ed903f193288c7ca587c734b5be99d57619649cbe0f4c3333ece7b34b58c9b4e27f03f5b974ab95e9c89218d10b1ec4939bd4884953396d851d368ddfb7f13f340bf227dfd1741bb8fe5af4f3ff34e5bc49884ab6eabc5254af84399184029c3e5f463426b2c7c695e5542f3876a1597d79e0ffdff15a0a423cfd07b6eaa2756eb4bff2e7696b6fcd01092b9f5ecfa9e43cfed87ea1b0cacaf0b63910f719b5b5424e60ef026281698ffadf90c95bd336d7509676ee0250887152e543fdf4d0ce9b2835c2d8cd087e5b6e6f6c4aec81e1da1d356a58ede46d3f906226a0e856db6ae22c73f686e3f4bef09d476619aa291edf112a6db9eee92f22dd96cbfd36e35c315f161f0b46d324b0f879bcf98adfd8eafdeedccf22c164249ad8ac917983e181f9f3915ee441bfb6ad680c9b45468589bec364fc56c0eba51a864602bb0cc7161784c4224ae9089b7914eac4ac63d78e58190f1d462b80638e0bda7f4b5021af785c2d7805526776e6f60c979ce3d52ab4432dd815e35e4a0c4f94a25c16741d6911b6896fa3168042e74e8193560fbee3803a5716ef90d40c94fa423e994f9704d4563e9c484af9c5410bd89c4d94e3b1fb3f4e0493d562533e9b8a33f7032a42b646c56afb7b85d5e98267d4435a07e53b1f84a77321bca95925b94017437c005b39a486aa3415ab3194553288c478e017678604c213751d05da19359bc4f7ace368bbda50b60392e5b505e63b35aa39bd0d7fb811f2ee6a0c232cabdff2f178969e5c7fb3bcc63d0a5266cc2af47b925b1fb997088f34e21bfdd7ad8fbe7c0d518a52d68a54158b8e57d8d853c9d7b41062a71f60a10af8796db6cf4f0a7be6c8f36d4c199cdead3c01f747b2f2b830947dd087a8940e63b820f4ce65f5fc8b2e2d0bee4bdf30ab550cee9425a937136018405d5ff245d7ad8c077f4018cddfffab03b49e78750b570a49f50eafc38f9a12d526bcc88b46059a4c234ad28fdc13291b2e6cc106f6b4f5aaab4a50201a6842fb2bb6ded57dd6ee06b5567a8dcec04917816a71c1be608e44bc836ebe3958ce016c3f9857777952765a778f18874585ff4b64e6cd430e319939db0887f30c11ff5528158b08e1792ea4cca196046a792fddd925973b6012e7c3441355007fdabc21890579fc706e18737901ff960b62c22d05b65ccaba1d3d969ead8a4af0cb4bf12d6815562c66d6f3e13f2c54fb4b6ed0eb74c3e5a099abf3f3833b79d176563c9530bb040f2cc04db2c351e6f998d0e69b4396c79639d498a5b2dd351e306d8dc62280b9547fb6615e3cd399f5be9f2f5b9f7dacaa9699a7068a0361a48466a4c4cb17476da2f5f47ea44a089e4849c94e3d0d3597d7afce5193179f4ebbbb45296fb3e1e059b747c7340866b8e310673e1d5fb4ba63b2911115dbfdc595574b2fe99dd5e26680acdceb8e799a95c836ab0d95ad4b2b908c03427d96985045c49a4cab93d0f609765b4210d4aac2933e935c8d6fdefbff8a8f753c03b457ea60173cf748bafc448e1b4ebc7fd64d839dd7e7d5143dd05c1b32ee9e004b6c6aa99d00dab977667a1bbfb1ea856257b7c49ebf00824f1aaaabdf5c31433ff30f503f9635521c3bb9f506bac5431512b0520d378e0aaf4d90fd8022f72d806b13fb283189e59191a3e6c091c75543cd6cc87466b42842c45c1c1e8d0e71e93536a3fdb4d1b8b998dba6df603ce243cf117eeb6817d587d830e262b6721cd541856c8a0347fd4edc940436c308b33634fb4e99ac15d2d5f6931fd3c1c26026f0389838850355c373e04e41188ef2f9f49cbb6951ebca41ed52f8cccb902750158c937424795facc0867281b3268eea29f3f3addad0ebbc8840512141a9eeead73452003ab6759f4d68225221076ec90ec1668c69650907f7fd8ee3af136ebf9e2b6681b7dc42191c1b33dc6e669eaff2a3ed0897a3808ae34541d35f771594ed5b8ee6fb618a21cd6c3ea4006d6783b9f9a58fe76802bc45df94f7f5b16767e193a3a9af43cd6f0968d75e8a554bc605cb00399ff6365158bfead1b489b280ebcd5ed20869684e1de3128354aea070461f9c7c2c9634ce70001e97bce1f355eaf9948ac0330701751cbe76efb18859098b1b79ed39d974a016a58dde34f0e0c39ddf12b8ecbf8d7b40d7697e1a5424b94d7f062f46e184889e7d4be6b0fcf064bceb37c45909a679d3826a0cb8936ac8b26a0e45bfb0a4d22689f3ba237fdc72e41bfa32b6346ee399f6e9bc1350b6a9ab827f80fd3cb6f2004a13f6e02d567ced5c13344306bbdc43686c24447436d390603ebdac40a0a44c8f375e1f30a5d02be287f97b02fddc2aaf64b879c398ed31eac6f900ba8ab2528816cc480fb4799602d3fdd8caad6684898ecd63211cbee13733b51ce5fa9c21b97bcbf4ab59b7497cc855e666d904deab169136a81c1b34a455218a8a74388eaa106eb05050d23cd599c0b1b91e4e39464527a120f8fe91a612f693794c90321131a6bd42e4f0c08955e7f4d9a2db9112b83faa8317cd39fac2cb94910b282f74cb23dce4143925841abad3ca5f1dfc098e2165c3b5abd46d07339e8b1737cd4f7ab84d3250058e04982db947a6231d2ba7698b342020aac7fae284ddbffd43d9e816a87a3de6dcd0aff6ce0db0546392b5fa8b0e9542b6e5fd3c944ef5eb794f6aaa5a3589b13d059de1d2c71b6ac6cf0c0c5d72449d795f81883f62dd32c97bd8ee704a7d4367a014b589bed95bab6110b91a8cf39d23635d994c7c8780437ffbd4de259f678358f3e0e2738adeb753e3396dafd4ae5a3b16f2f30894027dff081cbe640300bf93240ec925b0bf86a6efac326311762adb8167f316cc358293a39821bfe952bbd81b4b6c2dbb51619cd0d6106261c7323a41ca0dd5667c1d9c7f535caab2da27f06787de384f4ecfba96b6fdf15f4ab0e08eac7fa3f6cc713b323c7361bac2e96280bec301cea58518c880e4db1cb61e9ab1488abf04ca7c0920c8aa3bd7984ce1587e6660f2b0dfa42bb0c5fb48eb78037d22bf0aece3dbd3f15c8e073605e04e427f4de09dea961ea93b2a98966c2607436d0a554619bc09bd9de262669ced06e1a2b0cc061ee782dd2e0f851c74df6467246127020c73703a1ea980fef963cbb9048867fd464892f49cec9a1f5ff783117af870030c73c4c37f5d99daae862c3cfa322734c74e760c8ee0c65b4ea7fa5e74934166754317c63ea0746c6d434b585eebf15dc4697ed53f178dbdc65a672853f4a6ac12e7745b94e53429f3bfae444d989a450304f4a46ebc9c491fe7c812dd6c941342b3196dc54fdcc9385e2939da9fd842a90cdd0fbd9348eece2503f9592ab468a8f864f6d41ef735e0380ac00e84e11d9ffc7ccbb16b35a83b6cf030a042873c97dea4a22394a1ea657ccff9d20b2515e133c75741df6091256d2c206b8510ac14ede483a066513e26213128eb84d4a4ca4d9442134063bdfeb22e64e774ed8f77b9be1d70e9bf37454037eeb53ad91c6bc1df58342348ce0ded737d76df5a3976edf231b2df75e38dd26e397f2634bd9acec8cad7dfdb84fe4ba971430111f13619fcc9344e55fcd7619dcfb4b427a1da24e10cab86da1785560eb19d8fee95ea9766f3e71c0b87c4b20ecc1f8e572973cb560d5d3920b951670218f17694b82b30506aa73890abcc8b7300384bf6b258932d1f9205c1494e44d981b7922db02a1742397cd3d8f66379bca28a990a2f9e387fb25e16daebe96fed5a79e729851c9eec0ddb79f4b673b6a9f4ad2239a17ffb39897185b4c266d39778f7bfd4d4ca694d5c2c3b4fc2dad44465aea4297525e633446c6a57e5f781983ee1021776ae690926950c4d6095ab7620b78ebc894d4f8a1339f109a79956ea64caa05acfddfd52c5b2af1488ecdcb0b9982297219c97846e9c14f7c6b2d561059da05febffc313935ab09b6e3d3e6fa69bfd06cb36ca4add2df7e66cd8d5bcb0a6f1801d39b5eae9b1bb218558193518f763a38c698a702df231f8ead8bc9d6ac55cb495488b18386c6ae39b58433ab9114de31ff5d1f4b7a727aa9979e19c75de1cd68f2e01e3e4f3f3fcc104e5361fb654c0c2c0aae4c202f308f370da17e580750c075e1c2cbcaf86101a7eeb99380aca3a15c0465b9375b20b912bf46c4ce9dc691f34cb057d28f458be7b3b25956b8b0669d234d2497ed1122ec3cb84aca600a4111ddd0d13073647b901ffa5becb4a8e354435a900668c127176ca3d40301cfbef411a268e7218f7cf23e50af1e0e4e3a2b2c323d3a4312265cae7a124d426a09dfc6099eb50a25099703c7da69b261dea18cbb6455e2a6cb76d283ddaab5328afa244588b52ad98df7ae3200e1558b00b1cc95fe3fd5ea8b94ac8b1f98ddc17581c780394bd45db415e705914c22efecce660f107bdb2ddbe618168781ddd0142890026c3ce6f55278c0c5911d3e6f9a371e5332f3c5d8c707217a9529d742266b51f8cf069f3471b78feb66cd8cd56ad1e78a873e44ebacae533e0ebbdd7e118d785a67286133ca6023264953a19ad6a215bb961b7b1350058e43a35e6b22619893a16e45c8e0575ecc3cdc1aff031900e37c9b8fca8b1265fe15bddfdeaca365ace8cf540189f30de1ac62cf4688007a52a0ca3199eb76b6180ec718053d6cf00b116c20b9203de1ad8cec04d0b8dffd63b28aa32f945bf6703b0140272cf50939a40f93d342d2cf143c3c1d38d573d0599cf963fafafbe1672d7587ab6cd9b7ee641f038dd12cb9b93f94cf7541290d1ddb0258159ec7105697facfea65202212d3f4c6549731712c6186ddd32888562aae5a3aabc151fdb64ca73b84b9180b1a753e9da5ae2eec31adc1440d814ac76b75d0510f7251a633234d0801f812dfb00b73bf1608c6471e0a127edb5fd6cc403d0c30cccb13f2a7918a6428428e11f40c90b3bd7121d717a5032e5791c714fa966e258c99c8c529489ff5606aa729cbd7f865836680a8edcd0ff887766e65ebaf81f215009b466ca1295afd3626468d7bddff5af49e8840da54e7901691308b91e6619afbac60f621595c6c7ac3ec7ddb00343c1e4824653b9c6aab38b30c052236b0a39910517957c391bc801fbbd8505b9294fc0c9682c53537112b056537dbf7bf2e6d752d349a679f0a021585863183dc88d5f02faed84cfeeda1fcbbe2899e2cb38098b5d815d408bb03d3b8b5a6052841f0eac59b9914e783ad42ca8577caed35c3eb485be09b41c43d08fe53acc92b763a1fed1f8a453de2556860c3b521adf769252364068ed6b730789fa7a0a66fdc475a61e1a93c0b8046e4b6bd11aa54726faa50ad02f00936eea76063a81c2a22e2350dea6d6d595fa30916d7f1e80ab7fe82c21336cbc289e3c5e08a6c3f2e0d7426ab58e2b6b953040a60bd8376710b639f5408dcbcdd1ecdb3501a3564ff3beee3a5d7ba0a6758bca2dc81231e0233217306e6283071a93875903b49955ecead296480b233d18fd9e90dc1c06dc621c1e1e37c8f6d7bea717f5a48cebeec09a7cf974ad3eebdf259f9731ffcfc732855afe4217b9190d7473185ec11bcb2e56a42cf4d57932b7a5fbe4fe0900e4e1c0afd7ddd3886e4564d801d9bc023ac63181ee9f913a0c6e013c317474340e8fce98d6e10837a197e636f782fed760c1d21bcbc473f8a18e12243a15aa9bc69124080c97095f74544a121e55fcf38c4de25e97d7f9ac047f3927910d770dcf00d0df614e5d3aa0537dc4b695525805eb702025228c0cadd5f7bec55e0aa4b6b64d4ab14c6e41ed9771f07b6fa135764ab2585988bcee7ff00f6d4451ff7f4ea4578244f5a848d496cd4ee1dc9d14d4b6109be34551b7d781d92058c43b8f700ce53611df569fcc1f615479b6b31dac4a62899897dbd3d066095a32aefaea928bbd9ba5e367406dd8359b9ed0c1a8c15ace934c229b0e8f0281671b316184261549211124506650e851c03036b1ea8c858c428de10ae205115a1cee0a593d4e37ef14eef1582caf7a8a96c52291772ba28a51b5df6ed897527aa45ee514a6641fd3afeb29a390247d9ff9a3b79599ec9b38301b50ca505f8e5bc9db5a69397e36a663db6524bfe555e9ee726bffce6352a8877ee90a17ed44da4f4028892ddb5b9ac9073635a79c7a04a62ba8d3a196654e07ee37fecd2d94a4bcc10c81923b420d8bb30aa0cab28f384d2e4433214219d123c72474c1e8cf8203d9ae303a22a5d0c7c8a29cccd9e357e8711dce9d01628d59a5f1019a24c518c02865ae754996d5877c66ee5b9b8128314485706ce39a8a59f62198088ff674c9db5304feadefddc6a53ff5753855e1743124bae4215dc1df5786896e80330cd8205ba3921a1f7800b16049dd546ba937b7b1b06e0d92f4e496c2e5cfe16eb2de57032cdaa0c92840d04e98c5c58a05821d4d29b6370000bc76c7bc9a303d4aa336b6798b0dd11480d6916f8c164502c38a598bec0a4560a6b7ed4dd5fe37343951320dced3e2af9c44665ab358d9dd4466d9abc90e06b32119e3ef818a82536be931c2c1bee502b4ec8d0293c78c5e78707d370b2495f52c60149a5de65c05897e1db3aa52fae888a47bea337539644803957c5ecc7969473270fe7ca7022678b75e6447e7753b296166e8c0c0288aa5dcbae9718ef1003f5b850bc0e09af26ace3b98d6c94e5e6c3b31724f87091d8f9ff2d1892afdcf6f28f44b0a4fb1cb96e8f9671c840c20a00eabf249c1b2e4719f03d3ff9216616e617eee4eeea27dad466666b181fbd87a26a0b9acfb943b803a80ca30125506721cabfe288e8defa16688228a8e977273afbeb419d400ce206614c5052b257976b522809d31aad04771a44ef1235c3eb4022135ba7393fb944ee74f767f899b392605a93a7b2c1d6ed32ab85699afa22194e6c840b680acd09170a72357f7716cd9ea73dfe565a6146de9384834c24d60a176df7ff0e7b1fd2a2d7272a7bbb47936f108cf377e0c157eb8ae1a27278d613ae701dca901e1a567bbf152845744d0c5df4e370013e3dff3c91aa8d91088d25a3adff19d341e0423d33117bacd8ac2d3b7c5ec8576c8e6008227ca1bc9c645bfb190970d69b54b11993041dfefeaaba69ef6f988e71f4512502626b07201d364c84d56c90fc3f619a9b24b00f2d19eef175fb6c7c9db3703019e000c10c5ea0be93c3699fc5b94a283ba89e13f2b5a8afb2a3af5853d5070ffe843a1e9caabd8f2e3509da9316711ce0d398dcc19c3ad271ad5cc3475b5c11107f739ef604550391d957d662fe4a50e34726a73fbe47120a1e247b545e8def59e39976046985750e79abf9b4c5477cd508286e1011c309539850ba6c9520bc109b265b6302a0b170a0bc35f4f59ac0244cd82370abafd888d4ec14f56e502d53ef24c03f30793c010daaada864dc5aa204bd4a30b7b243ff1152533a945bc4836f89cf813e10fef31c07b5b7d0dacd43ccbea61880c8bc35c5f0b4f5e59630a8f1aeb822febd9320285119d72f15ffbaeb11a4324331e2ce0a9347af1e9101209f680e00fabaa0b4645a4e04ceab5e373e54acaff45d57717d929c69cc0c14fa55abbbe0312b563e829e464aaf3d6635ca1cd3b2d2de4a39e79efe3f55b847fd947c36a13447afd162213f1edc32e61caed08ba90a20b5e6da074b74a2621a0eb29e6541db16ab48534b772cad16738898bdfd3e842b890a6369c79b399f730a6507b4087d1c5eaffa76078fa59623b9aa813db321c290032deab6718561743f2eeb1853ed0315344a00ab4a423c8cecd8d146b1535ed25c0a9ac2d15cc31142e7ed4cb4151a6dee7a89c36cdc3dda901a771b5d23654f2fb767d2819d72d20c37795e493fbef4f9add9c6aaaf9103a6c179633a0c10d7b176b265ad039a53e0e4cc37057a2aec74f6061e2b3ec963f18aa9b0c74327c9c80a1afbf5cc133c2e890ade8ec574fe1001752d77b49e83ae1982e88f0516961b742e0d5044a4aa62db5eee43b47da06be9839efbb397d0bdd8a174e4ddd364e5a42d54b15dab354199c7058f06817686f30a907385fbb0ae55d72e44564ae994bf3d9782d1483d2180633772d4bc2d742488b5eaaa7fba0027c3460ad5b487be964988395d633cc33a7f3f94eeefb22db89413618f0502b875abe51a563b8950aefb3f57c4bd270ef316d762b7d7ab329e93a19a5dfd506ec63d200ae5a63d6e02d985611481c64ba2613238deddfe28f1eb0b2956934395b06c5a61c1bdfeb857736a3fefab01756d581a4cd30b136f763f6cdf2569456f4e04439f20fe90c1485031132a9552fcad82a3899445923a5edee0307867e96ec2e7541d3b5897b0de141b01703a312e0c2a543d9e50df7434fde4857117dd54a436845d57a7ead81f89e54ed113903277db3bdc2a233deda93ad255f118748b2ff4c9b8e190aeec224a0b0ec9c8e3aca01beca1f3435584fcb9dc421c808410f17601c3c4622cc40e481dcbedd3a18f464794159791bfd98168fcf5e7c9a2fe2a88cd955f853d0a690e4b53095c1b83fe1f72d918431b218f9f94f900bc624bf65f6e2a5180f95bc259802aabbf352c83a2a2cf586b3d4cd2a5282cbc2c96aa5f402954d7db7224c611a442429c39d33b0b6c4f57f077afb388b46d666d8a9290cddf9df890856b65c71ef967e03d316ba7301edeb98276a745b202e45e1eecc6ca12e68804626431a4de55328eae00dc317887a8d28a234beb74a7cd19650fd06da3ae4d006c0e850f09eec6d2d5549e46f0180a21e6ce0c8d997e327787723caf2e3e346b23a9d309f0f16e370ff47e43580429d0888ba247ea44a034f1a7a9588982170130c0c03edc250f928f669734fb7c1e90bebab943662ee26c2344357632e7aacd0cfa5d47c512edbdfb70cdd173aac1e70427c81f74970889e79110b91d80c3d6440f49bae8b98afa20a27ca8fefa46baa837ff42a94f952f15342798e8ff3f9fc773899dc29a00336144d71bf7854ba10142ee4060303af38e77a3e5d3b0832ee792228e2c707b03edb572382678c336979426834a5d1b55298f91296e9cdec3e6cefecd6c0f43d9308b54ab9c5719fc0d9062eca721844d4f6eb6fea7e959d720a06d48100c4620a3274615178b1b4a4d7b53d713f0139b51a02cb46c1488b587051cbcd70cad1674047382e9234828ff8b460d5e15e194498abe6e51143f6516eb11859e6c8e8e8dbee3c976ec28e408d81c9a5d390a75e5a5e2b06fbfee77d4d380ece5015ff9e0d4b9154d3160f627fe2bd847fd1298ec42eefb6d029e91cd7f2060f08270a56b6c04bcac807ea68e3537b2c4d0f1d4ae41d0370089554c840b586e59cadc9594dfe893119d0acaf1bfc1f65b83392ccdf8f1b847644c04b4d6ad7fd5d4ce17989dac28253b6e2f3232883f2d8ccc30581a68a5c21c1b10bb1c93a8936a55fbea790fb8aa7a1b8a5f31c1e39e040d2c5b457b67c3bf7e4870f4677f4a19c58fdd3a6c82da9929b4ad5484d34d8219db0c9a4cbf5a606232c40a137fb50e0c2c85488b1430c5b39f72674c12276e356a270cdfbec9fa705fa874653a611ed8e245c7ccf69f9d1454faa1c3dd1d6a94397de4c79d2f0902f3a5262a16274edffcc87b631b3948cd4cc2947542cae2104d86ac5f896115c782a00ee4a89177da304ea6ee50ba0aad21c80c5c34f787ca23e1003fba884d2625b3a4bee767a0f10b2747ca10dc81777d797312079718ec227476d6550449152b3daa840d252f6f5b10e82f25bc9c17ed61e1bce605eb46ce8758abe9f0dd3911b66b212f1390d0506d2c11857bab27525b5272a5a4b95a0357ae5f0d2c4a8350b2e8042d740519fbc09de395c010ee6b4e22755e694ad5df71b09b033b765aa3b22d527eecec48cfb47e39097770a09141e36e45d12736344e32ad630361134448d3b126e990337d485f2279f0fca461c0fad128f530fc15f8b923ce006407785fdfe2a06d5f4194e016d6f3c57cd5ac661ec10a9a6a8f7ed9f69272d136376b182fdf60abc24f497116f4d572a1b636f9eb7e026ef184484e35a07eab254173a83fbe147312c6106a646d9ece9d448e440045e1def6f90b74466721029b409240a849e98ae9646342e3ad809641e74ff6c92eab02023255043d1f0e0e67168acb766272c1506bc14e2164b4ca7101ca09d33b6c3361ce6c2592526bd50990ee93235853096f573040e6daa11fe543f02558e453fee17af8c669890778e7b2c887b3ca9af3f419347050bdd07088063703ba12c100239ed2e9d56c1ee7d00a832a0b5713e5c0f2f45fd227757aafdd15938fde3bc5b417880b7e49c89eeb35a46a68d94468f7249077eb55d1b9a39db78d86de774aed3e3e7b574e61363daffb5bbfcc7dbb1f049b3aa9e1949dd566bf9d31c9ebfecf8b1c2fd5a66253f62d554c874cddf04a4e879f30f0428b6b9990b36d68f1314dbf3d1070c1ea71745330e60fbeb19ce7f9583de72b7cbb76d79b00991072505162a4c4eb6d70444ca030b88416de653057f9f1c6e1df800e13ef3d456c6ce9eaf825faaad51d7031f2a06f51d23f475e89a6621ed9c2d6a9c38998ac10d1fe344e90a106e41843d1176883a62d35dd119102fc7428eb9baccfe4a786dc0364c5920501a97e176d7316969f876f6739c4cbfab26e1251cf021cb1dc48bfaebc7c2a1661e27221c05315d1f41220f8c2835dd4bcc4b78567bea10c8ba4090021bc650db5232ac295337e7d40d43896e5d733f5fd8d95117c707a8d5c662681f4f3bb9bfc143d06a2d248108fef9506536d4cd3980881ca12035c8604f2f32161027ce85c4f7507f0873e2e7ae53bef9467828504d4e3675b22909502c79bc87394d48cb7bb209d60dfa89234ebd8eb3772631f80f01c85790db234ef58808313f398ae307c6f045a3f1ebab74bc9d09339e7770b569e744937bc2763cc4d6636d3bc682573ef2b996d96fd699dc7cda1c7c6ee590c6366666636cca774c5156e6813420e5816906a7a41701fa0dca1419b42d543b2695d649ff95f67ba61807f370200635939b47dd3c23f4ce54b1e5c2e155e9496418e240f31c7b2462efbb7579e897432e4a1664e357374a246216ab4426f97827616306dff2c7153692b3a8f433e40dd47ac317836e98ab48158b0daf241273c5b1998eff9c2728ba6575a8de0d4e5506ed77fa35c0cb61e4f899c3888eb247b615ef28ad104820a97474f8d5b2c430c2560f68b9e27b8411fe0fb85496d3c5b508c7828d3c3a536412607372ee4ff630671c31047b250640e72ed825d012aacabc7950998774a54156f78dafe42781fb9a8ba666fb8c4ae8a4f6de0e43508321dbb0e0a243669528246c8cfe34f41c9e1f11295c46ed444e1825b8a076b0ef8376b6d321ae0bae95d83ee51f95336304fe008fd93f82b58b36cbd5f822dff0c78d63cf1eb2d40e9d4aa7f365aa688f6072bb28f2643fa25816012b3d328a1f24e638e4c016f43e31856744d88586d60ab2c6072f897fdc64f9f3bb1850bf400f4a378dc6bc46833dc661b1e586a0a869c826b54d5dfb1d7c2c9f2a21bdc44792ae0dbfd8ac8095f69b919d4f58060a2e88f988ab14871c0cd63f0efd42403d717cdac51f26443a69e1933386744ec296d79562831dddbcfa541b5726ce8eb1b64cf3ad9b35cce735e90ee36865fd75c97e4abe6aec350fd9e043835ab4b026857d392d8b09cb41d5a4cc9a35346f52abd1d989a9bb0d62829e6cc4ae43ad77095de51a73fdb46afae55203c86bc182cf1e1f22981e93851ee4e88e1b9a7ca2ca8d1faf6a9576bf6547b6e63d40f188b1c52c48ac51d7c215ba3fc77c5070790c41a409a2541979493c9320b851a44767df89a11912e661a85acc95f226283ae522b6ae63592fb868b6b74a622d80e80e96d4d9663eb78ed2a40b2d824a4acd9540db9a81c3831b0a06aaef679994d5f2e10c4d71264b7d41e3d9c67035789034f91c479d5410df09ac25deab0238987124a67770e26ce4a54e42352334fb10c9ccf3a7d0b00c34f3a2e75fcf1e00e52678fc3210c6228fb8e510a0318075a6c0082fa8b8ce72ed2a54fd8904734f199c77ec18d217a34d1a225c2e8c682a60599f0aa0af2649974306992da04e251559a4e7382f1fd3d8a4ac6370e46c20abaf6099d2d84016e9f2e7ad6b5cff332fbf7abeed81798cfefdf44f2cc700e6f62ccd5a2006922ff8461dd0d892630f3709aae03f3b36daa95e53b4b196ceb21ad33f81ef200c2e57b83664e44279bc9f4fdfeb5e6fc92f408298ebfc144551ef4304019ba7b583111f9c30ec66082de8bc081b90ac28d273857f285e61aa311ee13b676c4961a28d3f102b41be004d188ebbd6ff37feafa90bec272ceb2e1ec33a0099770c744416d9e5341c1ccfc1a588b6a8ed54fa65e78466ec6995df8db07a0d1e44a801adf1a85fb14b19d30befa0cd0bda14357ce81536c29445604f3775831e43504717de0ae52972832c8820d74611b1a2bf0ea6483dcad463f2d0adb56d6a45b6c4281e32c715e9709edbfa7089629dc2dcf70b4949632ef32dd77f1245a60c9c48b161fad4c855ede1c7ac0604324da651c362a776bde28fabcdbd30c5108855420f776d40b10c9d5dae25c1ba3889f8cdcd54dac626df8064bdf56e765519d82faf2bd9124f804a58b2fb0fec80bda3bc0ec798848dae2621a1339a1bc2802a628f5259cf00ac225f6ab086b6786278532562970502f380d49b3954da170581d96b3bd1f79d34afe3886eb49d9ff2287f1b5f94691089d46fa9587799e8718ee1789515ea918f42f8b11bbed6a10451ebda1d12be87cc40b3582971c9596df7827b1a32fd45f3d479967ddc34d3370f8e12b0c43f5e6d49a87b2596c20a6f47a4612bee31ac43da2f96ec073ac1da3bc56b731fd774d3f822008ed3969df670b48d7223108c3451d193ff1dfc9de0cb000642a8f188b5550118ea17c95b21f68507e705d6d125a078929fbccef65f63d16e3516e1cbc4e80aa894dd00c2afd388199ab9de1d1e7352d889c8b6d3a637453d0ed844ee3a01ba52fa16a147783217a2029cbe4680d14fa0b5ed0d8058073c18ae9851a603d9fd02b8912ccee92526e75f0c42d89309de25c7a3dcf6c3801de6550e908c58537a9e41864310661c61e94672375efcee09389dcdc5f66717c86c744ee8d50940f54c85f2fc9a8ee2824d22b362c507ca4e9b7dbaeb0c80864c58a0d3358310b769153eb580d47913127db0287d75c1e84dda7f1e8adb3c457e010231e23be631a2b806724ca20ed9581920fd857b32ecaeb0a1006774e1816b983bbb29cd0351c6d1373aa10e8923ae9fc94ed108a52fabc4b0c5f1544c59c2e0d4447e50e5db7d8d07024d204d597e0e7ff9a4fc7a9e5b64c171939c21005819fd344ed80529addbcd97083213b8783a0d35328a51954c085bd1fb7416e21e4ec2218a2423634bdcd969cf5a593beb36ce4cb7b0354c6c42d0e4a870332fb0a4b6da29f5fc4bb5ff2a6c355ba6825addfeb60bc0c287e97e6c951cb19be1371a419e5bac0b9bfc3f28690afc62aefd0e9f18b04dfad528291efee35fb8b4c66fb9bf954b9118f2ce1e1276385855ae0a2267e9f8e665b2c6cee23a5d7b4b9a7d82409c1b1cd2fb1af8f0ca03442e0761c8f4e3ea25e86a46174ee1ebbe84613534f50e4e1ad2b01645d9122082cf84d589198c717c228fff447c95be7b5e558a85e52a2e94c55eea20ead7fb64e565d32b50b7c110bf4b8505bc2f1e07d76b363472db05391359fb902cb97dc265c6cd52727704e6134297bcd346f58d4218dda55f9da213796d347867a569c5105a40ec6f7ccf046aee230a361082874e115264bc25a270cfde7a198052a3c24a6e8e4f40cdfa66e9cc0abc9410fe492b4cf60af66437d5897896d8e5592e86cfc651ba058f8c87d90d4cbf6270f1e46aeeb1c4a3e77847b169b27c339a87b91d66507156f3e87a6331ad5e4e22bc89e3b6416739dff4813680a8d0fd9bf9ff9b52191dd985754f271d4cd9f21becb512408d8531304d380c80da54ab02291326d27c6defc6aa9ed1cbdc51c05cce30238fe112e2f3cc326877d6aeb472b3bea01b9909edf4fc2c16a54d9bde746590652bc643185dc07f3f15347bb2acda8dfe1cae8b9c914d4a3c8e767840c7ffbf0381df9c55ede8ab9298aa18428d5feb46410f388b846ab63da3c946309471f5b0a982686a5988502d6e8f1dc74c08e7ff1bd320bb46e1780776109c2208eb1417dffb95a487597740497726180bbda7dbb831979ea8a51b44d70800022a8b4223fc942327e7c5754739388a7f76d4c397805dd72887c8738756ad7ee74939376a8d49d7cacf858bf0a08a5aa64ca0caf348114b309066c67a6868255465d31554efb2bc42748dd9e69484573a032d9a0c880a90e3e12ad2dcef8ad970d8b04e3eb8bd48e347a658a892c73dca1c9748488ad029173fb7d58b753ba7dc33005f4e8d3e5f3e9e442da81be733bebc9733b95d55ece240f71e891c79a64bb23a8647f0778a845858ff85ea61aa4a926cd5bbbb9d924e76017843c0e35186f0aeb8ae12098c4caf06b2a5331d83006b47d39f6bb84f5add049e7b46c744ead670ffd58a2ccf22a618671783c387bb810662f1957d4e079e2de68f1c421a6ee779019008a2e39814b144a6578d579e121819799201ae4679499b01213c686037a6c28c35d5a1b686f1a623c89191a19358ec71bef62f6a04c4fb52b9e1399aeca00d993a5677e3d460200cc2372ef0dfb911543e44165453f1f23f6b787dd77772c9734a80443aee6a300da711e271c9d70960df3ba5f5817321da3d434d6c1313365f709340946ebd6b458a061b6eb73eb91459b00ffdc300bcbca89a16068d22d3e910624543c395fa9b28416518f4acb060ecf8cda51427c5f15b8a63f1c0262cee1e8a7ed95d7264b5f43170ada9ef062fa6a3f3bbe428ac9b42bab5bb8c6fdff66310611422fb262f6c5e1c9bea9a2b3a45c6b1dd8ebaab36ccca1a99d75f82fe1d1bce7c1c283ccc3db84842ccaa34245d895d7f67fb379cfd6613226ee557a368cd37974f8eed68e8be29321ec737d5b524c1e73a25f64f1589679b2ad1318d6dd2d825d27e5abf1dfb89b8587bc288d5015315f5a54e28041e73749d522a92db017d75e1475979b91da947d821b21723f3db9295671fae647e0309611ebea3620bb31d7f0aebd4655df43ac39515daa521dc14f926a59a5177e338b6f2a38a4459581af11b73f58b9cb2e7b05797343ed813bab7d56b4576d41f3bde6e27f6b9ebcbad079f650b66dda0518f4b2c86db180d81e8b5eaac61da76509846def8b79d8b64b12a4e735c16af521cec3ad27b15cf44e82c46012ead88bf4485c5b60fa94110f14b54f12c21c3ad3e7114782a589e79025562d2ef3a5d33cdaf40ced8c094d900824663e18ae84263c07840536c220a17d5c43a6e85fd2cc1462bf1bc690f48c273bb01b4505a8da50464523e594c34734edd07e31e8f93163955c7ca056a1f223d174272c59725bf2a6ca33084abbb765355a19f9839c3d6d87f7ff2acc55a79552b52211d1acc5017429875516336307e3fa8fbbe2cee7a817f2c1aae411eeef09ac0a4ef27b4ffa4cf3a58ddf9037fe984af5d78ada657a779e3eb3ee20aa910e1ab38681b03e1ec76e7613af7ef9ba47350265158fb494687f2cc55bb6a2d67e0b53a334bf585243e13af5c2452c5e0d2eb6aea38cd91c4275ac567f8ac729d47c61335cdb6bbc4317e9679436e5bba709654e49d96763063ffc58282a4fe1883e4a7046913bd508344e2e4a2bf6f6b62f6ab44c099d8948988d3c214179389f9bf2d43a42c5ac20ebba0d56865a292f1ff3c93d178df2ad6b311021af1c2d871aeaf2ea40b1768c0ff3cab3da038b08a45e1019ff77699096470c044a48d727bcb7182193401574558fe58b61b56c7ba3585a3f4400c4720206ab3b0570e881637a0ecb05885458c5cfd7929e13ca5a14951b18982e92945e1579a6ae36884547c38e0ce353195ec03e374e07f65dbde85b2e8f174a0603a579e2132496c52466d1125b30e68afe2d96b546135cfedb8adf98e8e882f2d5245939ca446df3985394ef080dc324ab9eb061d30873734f572e922d3abb2faa370f4fa27d59b1362fe09a9494d1c1f015120e0219a610c8a582b160178c142eda3d49e2f3e44eda428ffdb546b7af3b13aae2e80822c3752c041a3932aa0bf2e94492939a6cf95961328a6450beae94aa1bf0b5effb754c98cc1cf492edca4859c5f4b26fea5cabc9692c8dab6308091691426542c378737db809e28da8cc34a699b75427a76e2f2e6493c1958a35fb75665b9efa57297b107468c987c12031b34fd6b47084b59f553e9833bd42c957faa1125fd1981e644fb2e738d30dad10c473949dcbfe1d3855c3f0a32a2268b990c7443ce0c3817ffe1d0df8c74428ef154f0f904af5799954bcf60d85137fccf076e31124610f80cfc1131cf42225945f469c878573509c0702920cbd0e1ee56ea69a7d490580e0aee677ef78eb05020282e97c7b2548856e825c67f0c35fb6185c23da3777acc48636401519f28c93c93b875e8c09ca28d092315189624c1deebe190746df0fe88082551b308c6303a3417ed682c9f1716b94adc72b80787f0697a4062e6f891b0701a7a1ea5e5bd66c9baeac354de33ac65e0d995e98d91fc98d79c350e29659dd93c7c1ffaa83c0dd5e70312da0137d228abc1f074fdc606caea84071a0d1cb0869d705137135746e68c05260471ee501b31bdb490e6cb7d6a170a87274cf30003d1262642c2372fde55b048486d2dcacaecf8cb280fcb530a3074bfba8b8e823ba41600428cf91605641879aa3d1622b5be95b98751166a27011f6debb0803dda2305dc5c3120986da95839ed014d2fbbbc92466991ab207ffea54f17231cb2fac40d9682c2e1df2f48417e11feb2679f20465b474202cba751a60afe8651da7f84d118e50b4d38f275aecdf2ef7fd89022e3968074dbd00d14e23ac3c533a82c1daeec2ad0a729c0ab65c5c0375c0234fa9d0cfe4b4a89c8e3e20cc522b18c73c56d62638b19cbc7f3a0b5d03b108fd1b912e0c5458b14f3cb6bc49cf6158a035a77cd38af323618f5c08311d77298ea4324f08266a6c561c0a0188136c4f47b16ea3603648432f45764eec0b090b0ba6fe03bdb057e1474e6cb369fa78a2ee484a13aa2bcb88452d7977b4fdca0d28829ed07f09d3177fba494240d11bf0433cbaded6ace02fd2d0e7303f0634a00ed92a6377e48b14a0483d560bb94ab55a4adaf5a34e2338483cb14440e9f8c9b172d52d59f31aee3f7b73f1f714048fe511e496c8550e06a700ade3b983a0b426d5cf4f6e29746893c8717946c88f5249005a271637ead003df1b2cd41f41b08dae54c00d2d4d8f42a3b100aed136485b260844d9927126265f7a1f05d301499df38d4a003d27a22e4ab0f382b559f66a87624ded8aa84e7e623730f26da39f20075f6231852f8f1004b1cc032395bfc362aa9c067209ff305ef02d2c6644579a9664781a903c2a45621d8ed70839ab84f3e9a952293fa5e82915dabf83f07de1ce2652e0b5506cfb20f1d0648ea33180f477c69e451a7b58856312409bea0f6e2274e65dae8420d8bdc060adceb745251edc9fa068ae23006276eb161b7098a5432fc9d81e81b0ca498b24820e5b53704462a4a655c0146540ca16009db6b9c5af9b52d23b05752d548596c60834878fe92e070fbb5daac7ada19a6564d4fcde160b013f20ab5786d29ccb5d05ec4d1a10368c2ca362b935d5b2aeb19ca10120f34403efbf78b6f425070ecfe16ddbb993dcb5519adc999da7da9a7e3dde8c2cb9dea2fe843377c538dac473e6c06f812ec5314376ce44fd69b872ce849ae27273c392a5965a03674da7580a229b73263d4b7f48bbff652cbb78b6e69cf9e0ccc71363af5a23a084c6effd28e59ed35dd98ecca00e2c3f866a7a692665d3f89899d95e8ec7657a7955f4498dc06e62a4687655cd99c119b468e804b0307ac311e44aa3b007e680098e1f1f24d4c8dd9fafb3676a45212d7986a5e2cd3310c09ec7daaccac3590c8a3677ce9c10e20801d47294dc0d74da03b6fc0bf6bc22e6cf576d1ce6d25c9cff9c2369dcbc99732c72dfbeb7fe361fbfe4b2c4a11f8fc51ff74f4e4cb51c428c0133020a005bc4e94807c27f921a0c8e82b8154fb2df29c56aa6ced8abfa6439b8d02d55d3fb5b4f381eba5f3f536573c7060849301f96ab71dd6cb24f59ee5103ecb2c426803595d3ede6979f9161a9d7c2aee61463857b7f79da891926eda4b73b87d794c9c6be9f449ff19141cf65b29d4e93b39c77cd4358dbc4cf6b4d517cc52b61382f91ab660195aa7a87a4a28926b3237ac437c7b9502c91e17bcde2a847e4d19b0a63f603da66dbd57ac7c11c74ae130db409f89e336cc4d86bfcb63bb3f062b255c54cd7d6356656dbb3c77997c32b36b126343eebcf0ebe2762ddcbfa9ed03166a55144d630970207dbacdc3d072172b9feac02046e8ee44ad24d3caccd7fe2491cf998c16061c78819e45952a040e1d1a17e56e8661cdd292a7b6ca1c27a475d1e0850512388f29063d46ac41f2347ad28ca1f4129104685b2703c07dbe18553a8225655971bf1fa2185b414fd12ab568ea40af9831639ac47532a31c62e9f2c967eeb4290c44de9ceb868fac83a15e4b8e5125163c4bcf6fb7ef57554d65dac7da1c15a03a4a981c476086c201919aadb3931f35609cafd067ca20fbf98879713a0c87fcb299d710060c274cd3da7f0a4f16611cfd6873c429e504474b25c65cee202c2779de260b7c42d202609125f4a9b6ffff35b97f2c3c21fc08ad1523dbdf64bbf65a937ae8729371c039b59a97c0ece0c438c2efecfcfaa941f96e0802a464ab1f4fa931d03ce0c07040e0c03f33da93132116f6ecc5dfb9fdf9a94272ce8802a9414324f47e6c14617fea724e5cad009c310fa03073f5e46c3d218a9c7cd5f5c94adf2d12f26023c70f70131e2c2be3e2a3b8f73a62123ff1f9871f9e7be742747d5f8825d5c29868c6a5745ba28a55d7aba30fe2caab02f4ab7638107e4cd629aca00a87abe0b5b81a86ee00b7f5d577a38b2581b1ef34ab46c47e3c62a4fef2cc02977549bb691b55619ea0d80c6ec46814a159aae992d400ad34ca3f5d719ce9b97f61a0186be9ac02700494bf4e0acb11ab2cb4d833b76060475e49600c3a30df85d221107f8c3ab0e485e02f41907a1be6cc627e90974060c54c7928dc3b5b07c040823864549c52d100acd95263c0f78405389802256be0f66d36d0a78a608d909b4236a5f59ff1382fbd2b7fd5c5bb6d1586dd9399ec46b415f6330b2bd9b83c2ee55dc045759223f394a1974dcca9bf72ce36ab44f7f0671f894c47b836c4819b6fc47916d9d20de9a727d8342682d80d22e2ec2ef56afef612ccd31eaff59cb6c451c5c2985c50e836b65d1e22e05513bcf83be4f9d9cb44fa54859d38007174068f305513f2e00d43cab5abfb108c16e39c41f6cd19d2ac91970867433db8e17be369ee72671a052ae556f8466aae55ae132d5b939b7c2848a6c884fc50cba5ff01a7e942355f825d8340bf000b202c2be17de0cf0bebac8b3f6dedd69c0640a7a8118a823210440739526302cb9c47706f50dce50934dcf4e5cff93c5e8b9043c6d9d9c18ee15e8431b4f12753f2557882fa29fb4e80d72d8db86877e4e17bb135f62fbb3fcf9539b0307ba32d1fdb14d561a464dde926e626261c9c63608303157b68143136213dbb413fb2d347e396f2f048c2be045b059c60dbb255171dce29e764bf8e961d12c4efd4d83365eeee69ca83635d7bdf185ca86af01fe972df4ee0ebf7fe2c84a98cd2d52994131ffbd34b39d8e5beb60312312743946e10dbfbd44c0aec1412fe265fd0a65743c52366c4989bdde2dba576777ce939bd132a6128cba211076a45c070b5f918942b7d5e0b9cfec2695eb6f8ef4cb36f98ffc4faef6a661a64787d9a9f2299d0f4003d375a29d527259a539292337adf7e389415ba9f73135e8416c589ce0477dd9bc5bfa92d3808fb5bcef1284ee3082c53efd4b3bfd2feeb99817637b8857f14a80dab7840ed30ab4584c087887806940d1e3d8e86201e9e97112cc9c7c110ccfda590bd825742733f437b9888f068a70fc23efbdb950930ab81f9992c341c47b73638827e0ee4cece8e3a1ad1a63414e0e854143102ea69dfd75ca1741496ef2bc9408541e1ad6f6e58b93217a3ca8541dbf4585e282b4b277e7154b9b805c43b33bee0468a650914f324feffca65063107d770b5f3e87fc931550b2918af665cc91d180b2f51910b969b2ac50562c16996c9fa0a160c22a19ad734759747afe6cce98b9ce9807b07601fd8fb05c51f4c55f46f2fc31bff122e712e51f4d5e25cf58b52d07e6a9e51cf1c1c28803d4a330bbc883a08d3840fbedbad55a1f0e4a89c25f42cdc8cf3a4a862eda5c0cdea2ba741e00c31f218c94231c64d475ff24038b85a09dbab0692342cb30685a5618a3eb5fa322e613b896aa3b90c9a57ac0ed2adcf4ac64a71132223222e5904a8cb391f1e1f297da3287cc276a054a4fa0cb2e24a1166f2be2ead1d03a55b84e49dd283c387f91c0528166dacc5231263173c48c6ddadc01f0e8aaa79dd00a2ac9c05ba432c2057ca72b9d51fda11038fbaf546d558ef17465bd32fa4dc1484e63006ae48b113c60c6a5f0a440af934349506a7b57e6c002493214713ef762b9b0c4dbe15f63115aaef3af893abb55591063996f41fce58167b74a303b0d5df7780d12d558ddd0ea7696b8bcb509b78e1bd8fa9302a5ba3943fa28d9ed46234e8c621174829e22c835e3fd34515e5e55d2b65a4075235543d58028c4c74a64f28491cb38ee45617fee85984c42776829f537c0be85b234974f6a3e8e7d613c0015b817eabf2ba2fdb93262bcd16f443c0ede0078550b362e849f31c4d7a3fe6420b6182177634c1dd57f3aa998a01651bfe33b0b81fc7a18c48515870c1a1ae88b4158b41b5244f89dd9b5159237a8123be905a36e8b40e5a1705ce35fb74df9f8919e1132b2fcef2458f05171082a0327818affad2fa20d0bce082b0305728a008c03a5990a1ba9b6bcea0792889c1d62c2890f4042330bc71a81c19be930b9faae1356287928f2351867c811ec40c82fcfe44ab8e5f94901edab3889cdeea6c9aeecfd5506af9e849d2f79cc765952fd6cbe79d9588ae3bb33b1ad6df653e0e9086d6a3dcb84fb6f2dc9a8637996684518f43e2672995b6424c0936a95b3e3dde2669353de7a2d140923018a452efc8e2f4c1fb4b6bfbea0150c701788c07600cc1442f73586dda14054a97bc2fa5b881d9014d8aa4971fa487da281e617020c0b68d4e2c48bb381965b63c5e0a695d5c58d0671cc496e430c787104e6fba2fe6f29d34f3b1fde236579f52ff44ce57f7149d8bdb7ed3f7870428ada5055c921dbb3b466adb907ec6a1b6a990aab0d7ac04e6e6ce6df49eabdaf7ca43b7b1913ca94e8dd1b9401205aa90c4b36822b391329320c9539478c1e071d77e8d011071c3becd8a10e1c39e668393038d7adef08be63c71d39748443c71d3be8808372e0d6a1fc3bccf22a388987f307072ede4a5f8e4df8e2cf5ee527baad4a855f9b59b98f7a82d4cf1756ae2955f16756096d056c75e1f012c1cb93e7d6e271044171d4e2a96d09c04545d23084a3152c267480532930ccaeac78766da09b0aa9159733ed4c092e7bc4e6c2054a1d9f2aca981eee39afa134596875af74774bb8d4ce720b594e5a73d6ac07eeca4a08adcd9a61915b49bb949519663cf0165b85b26ad61963ccd6d451d69d31cb8cbbb1325a2bb366bae456d22e656586190fbcc556a1ac9a75c618b33575947567cc32e36eac8cd6caac992eb95525a83c1a7048b33a1bcc50f975c53ea2710484f4fac26b5b69d5943d2a3f105ecc467fb9e913c3669e39254a7be09664257a951e954720ca3c00de277ae9b976411645e567df59ff5acd045eda356aacd8969bedb64b6c9a756dc5b4ee968bb56cd1ac552bd6fa719451d959f12542f0dae8d7a73b4ae59b87b22701e66a075f90242c2ec653ae791a9d224235fa72ca738273ee7261339b12c2afd6d63092bc9806aee44e00356d86b3772f6569b2e05219310f0872115a38928b10d4dae0e17ef053494dc4c5886c94901ec8213a50ba90a0b39afb1aca722edb1c801b9daa513fce47ab708f90c2aed1380f51b362a19c408cef9e9874b45376036ec1a2f11288c07ebde8948b57a4d2de8c5c019e18db290e1cd28e50123eb0fc2364b962b8745071da645ccc002b69a070c48e080d49601f1cefeff5fac933fcef1073cbb7b33b9a77ed0a83d1eaa8b6316622d4bde0cb1f03153adb0b1f4cf6cfc55d3e9c019112e55b38ac7e79ad21a95f930bcb651c0bbb24528c474aeb49eb00b2ec22fa981d676968a07b14c55cb54728d31e6d130142b838df9ffe0773354ea5816e40c96f5bddb6d0eacab6daa465ec3e911d378ef8d33a746ba2439badbf72dc0dfd020e980ef23496df2a0345b899921f73fe8cd7604be6751d89ece9a2f97bc57929c985633c7c3203f1b5fa81a056f8b952d0cfa80fb73c93a50e626335b61c70c40fc813ac5c1b1b8e68552e05e2e974b36c32add18447b2d2e177b1d14f05f3ed31042e8eb8dd186027b4ac3e2e4edf0d7bb2b2b84f45a5b51d9d1b0f0511bdecb33a88fca40ccf9bd601d2772319555e43858ae9794786a41c85f1ace26db60e4a73da45eca6d70ec50188855603818ee005100c3cef92308b8db5b70f11eb1e0f0ca0dc758992a783c8119affe8b87871040649c5902be2e2e4c860ff47b3f0e1e63bd38d9c40720139bcde1ded593f2bff48333edd8895abc437d7825be87b1976c0d15a813d4f22055293035db3e895038c1c31e143361404714eb59e27aa7813d3d2085f61e18c174c2260689f317ab3d912e5f0dda6e9bbd8985d3401a4059e4e5ba0f496c36008773ef3e4d3e2d298947882372b6b5cba7ee2a2709ee1b1a3672fb4a5a1bb124d4240fc64afbaaca3f0365acc1f8b03ffb723ddf4431bf3e7430b97092c2f7dc31876c101f114c3abc90f4d2f6252ce98149ecc5ed8acd140defa71dd636ca1455be13cb5e9cababc4def79878e231e33ff1d7fa33cdf18befab12f3191839a49dc568e4f3883ebf7b90d9b0b1d63a8b95c5b5b20afb6fa3b0cec9e160773cad9030412343bfb00b5ef33206a03e5d03b661e7ed88613431b2040eed0aefc126997e7336ee124fcdc86cd858e31d45caeadd590575bfd5d0b764fcb8839e56c0c02099a9dcdc16e83f6c40b35061946a6290149643b4578388b4ecfcba63701696bd947ea762ee6861bde1a765ad8f5272463887f756cb8b3e67dd97a5715df29a0e0c5d339a223f3d9d26af0b3b6bdfc5cf5be095eba5a84dd27928140ca026cfdb1065040138038fcc890b0cfb159dff8d76385cef2e880b7091d06da2810da3b9d68e30f4be18b8deb236b5d16918c458422d83c68bd878e9410a2fe3a4a76ca4709e7c62febdd8608748864c5e6a8c87f49e25193061881e7701527d99d4083633f1749b4a6d86baa84ce8bb79a48577b58b8f866b283c566230a3840b26a7150ace4181b8320e06c07bfc1b181cc8439aa33ab0cb9a890238d60a96bab9e0a1d157a152a09f17e4ea331a96ed1e031046450025809b16a26ec3c780a4eb9485aee49549e7a9d2bc505cd06de08b3dd0ee7d9a474bbead9791b69b68b64d0a23dde3b17d9a16bacf56ba96d857b561310c53ac43dae331958f2b2476ba0e0428ce6f3417c19b8258a512175b58fe9c75f79909bbd4ecbf0033479461f63dd19fe943dc395a0d6e5ca99c2b98f5ce3ce4f9f3a60da3ac0696bc84f04634c159501c5515f4eb2b7ec8b0e3091a739a0b8259673959de6cced29d11c561575e34588dba84c7a76665f90decdbc1f9d8d841705ff4a688e0d231ad4ecd6a1e8466744b1b4240a1c2f1fc4cb86e19a0ee2943d448a0a297ea7b27a9e96da16edb608246a4d5d3c1fc8a7a5349aa46163423eb0e15fa8554454d60846a3cf767a340fcd2f0b35b456c44282894150461685fea1cef0ea0f316fdadb6373b7e882e835b7025a236544b84e753d6a8c1abf1a60940dbf970be16f8cf7b5a67139d8adec08bf3dc1d4afdcce654b21a3ddc8fc4a9741cf9c29322507b176991554ef53a71ba7c6068f1acad74da87a6a47856174631ed7e5a20bb122055ba38eaf43fd69856bbe98d2fba8cb8cf45e649a08c3f767101cc014c46aceb07561c4c04a67a4017995aba4c3790325af2b52cddb4fd990aed8464981ccbe9c4483ffc9f121c579047ae82c9282ab67f83394ca0b2b013c5d010af4dc355770ce61750acc7240ae50e5c6eed0e64552951712ddec19e28f9907ee30612477136af386f61118d7dfb570de7c4c681f1a17cbcbe442e5640ae7627934cce10ecae6a60ee50db66f3adb8ae077af16e826774a726fff1d310353034603bbd91abffc38f9013491ad3faddd27ebb42e0a815ab25104e6c8c69b1841e3436badaf84d45b4a84c494f20daea8dca3b05a62389b43522d3ea7e8c72edbeceeee454bf596369d4f280845d13751c939e77c216eb5eb2cdcbae49c732e06d55b3a241a8fc8f7504cfeeb160114632a525e623a322358a5206f51e99218d7dbbfd8b1ddb54dab893df7fe5ddbb45a4b654282836539f671ec9680792cbb1a42d13ccf6ac2076868beef8e919022393c2e4f366b46f1e60d14026e7c26b97d77f7a757bda5c121d108e2e9f84074adebb60994b4ee09aead75dbaf623173aa4ac22c2feb68df5f4d0a526fa9101152fe208959b2b4c64d388e3c5e3d40215b8df242415b3846476f06a7d06050573713ac8cdad0ca2006f3ffbf4b918434501865e6bddb3e0b93c403bb9510dd21c32b47a7a9882964f4a5e4a4fa78d7366def7ffd9b2ddf61fcd4bebfceffff1fa0cd9cdb2521c396bd01f5c13313beaa6214a198f8ca5131817ccfeeee6e347c71eebcb603b1a123693161a59c734671aab7f409fd0f28d1dc1bfc0f29c3e4c7bc20cbf250396041e15ddbb4bd8bf07b767777a42c249c7b4fe7eebe33a1213a24472867e3c50b628e0b0a510dbe6727e672391c77777777f7202e45a2f1c4b907714076e7f9406f79efd96b3877770722aab7d4a839001db5f6271c9c3bace52ac6d58f7a25963688745f6cd88d301d399ad1e5ee633f50398ee4cca880445afa1191437d91c15ddbb4bd995eb6e9459a59bbd62517311185a42a2c9f2a1f8f9755c60739b2e433f4734b5c9beb2ae97a9a58aca666347d718506a31f2490e5a91f8447166fd9658097845112381fedd004dd4d582da26b83dd12d7e6ba0e5cd15a6b2049f5962a974de7f30408d42b70cf2f7067edc0427304deb54ddbfb573282918f530b41bc1c434b30a6b2dcfcfeffffcc1d1edc7fd631710861884168bdce05efdaa6edbdc232a237e3e07b76b5c5dddddddd3d884b959ac4e02f75bab2345592daad2e40b28ebc5ddbb49deeffbc5c89b95c4e664d9734904b66d48b5fce90231f4515d8e8124b2fbb62964400843a939503ab36b304cd8a22b49195861d58402c79027ee1220691e97892e1f3b58b8699392504b24d5b62ef481ccdf07bee6469ebdaa22accc2ad8fdd1a6e11b78c5bc72de456d24ddc8133eeee24c434ce4ee3c01a27d6383425232e30d6955b3ac4c6c7552583a9b5d33484daf9704319c673e7fdb825aecd759943ddcb4fadb5f6edd45b0ac734451e10bea09c73ce334cf5964a5165759dcc889dd0ec5ae5114f1844e697ecc17a1159660c3073d0d3c00a9c94183c3830ef4e366ab1b5c23291c31eafdfb3bbbb3ff5732765815dd05299624083d05411244c4d5490cce869986293dfffffff6f2cc5b890915b41d972c29b8246997fe55aa429168b3cc5a0a25091a88854646a560928eb55aa9135dbd1b0f1003272411f71244e73ec4312791ec1c4258466bc51878ff7eceeee4c285e9c7bf03dbbbbbbd18c13e7ce33519fef7a4bdb15b7c4b5b9ee9531c32c1c81abec98e80549015271e532637be0947307823005757757712084ef7d72090af311c3062a2689e297fdff3fb9ded20c9c7573ce43e0213bdffb493e7c21592e930b38764ca86b6b63e085e6d18326b2851d764b5c9beb12d9620f98bec1f596b659a78265310192e20aa9eae7ad1a3e65bc8899c96514a2ac788ebef0aa6924516e4c315b286dc9744f392ec664f411926819ffabbef5c4c9b80e69261ed30a0cd06ddf3f5725d55baa5c660e554dd7b9e00c9390fd40babbf3dc6cb5536f291ceb132b1aad81447cc35313fefff7b9998318d0dcfef37c81102dc6863a44468071d9d440aeb04a61ec040f32c566e728c4696cd8d5530ca291330386870ab6e20945e5e55f07f724393c1e8ec35ff332a5ab088bd34d915a109d56bf3361c38eac6b6bc788ebbfecdf2d716d25399bb43d77f7a41a1a9c3b2cab81758ddc32153b7ef944249d6822a1313d323306486fa6f4815f1519083da22dd39d791585553c4392a8de5263e6903cd60280ea322cd3911bea04800a0bf2518304588f1d3771115186020d4ec0e44a70d960690153ae40116080686c5ac134d9fc40be2c19309bd1110ad205f463e1844b8b1b0818f05a19723c423da990fd789249326aad354b53bda5ce27d4034b34e701f8aeed0666d2bdf5e9a6640a366af6fbffefad37c6a06cd8cd1ab6407ae4e55cf9cdb8d0ca11c118cd84181ab934c1a69c463f6c58cb2b513d97ee3f7548f4dd5f49885c386106754b9cedf45a1ea9c771a8b523f366b311ddc731eb04a3f9822175aa01cf02459c197ebb756678d7366d6fd7efd95b9d5b92ea2d55b61d5a96bb16c248840550aa0b860dd205fe2970fe42585860435081e637b10e25730f28c011fc6cd7a312523e7777f7b8c697c117ad91c5c1f596b62f3976b76b9bb61d8ed16affff4f51aab774d9747e90f2f4921b37d3188b6ac75a66c2ac20502df4cceccc3499c68c18728c6e896b735d1d31b3fcffbf2a12a45e51ad183b6ac4dc58a135c3bc514fa6920afc98a4bcb4442075df33d5e399a6ac66b4d65af7bcde13f49ea1f710bdc7e83d47ef417a4f32c984738f73ebeefe434abda554595d1d7e88ed3a54c15fc10a6cddf663fdcb56eb0bf4c05ddbb4bd31ac00b0ccf994002061c7468526a08f538c98b8c5c56d75feff0fa2516f699127731014e4debc0ea9e248584700f4065207e44a41e8e05ddbb4bde1155c7777e5abded2e0507fa0246a1d858348486444c72b16d1b2820aa8a753cc8a698d94a8962bbbb6697bc7231d4c0c77aa663a1440129dd24e13834ec693526f29555617089e18887717ab42761d08817db4708a95814b24b0495334e9da7819feb9b2a45c87a477fb1e4e617f20dd3cd98e3094268aac64ec70295dd860b1462c60a5bb3b8f8010402eaa601848979ca1e342e28576f4d3f56c555fee9085d46dfea924274bc6ffff1ed3d38e16ce3de21bbbdefbff07aecc2fa432e92b6c967da0146559d98b09d22763cf2f6719e6d3028d4c0c7725aa9bb66b9b5693edfd2b091203014530203a3e2b462ec213575f31173cd08d207aabb0686c5878666830069deeeeb323142b091316954284104aa68965450015cdf32034eeee4094989669c8e9be6bdf1febc50a6ea74eb3ac36dca25f1a172e71906a5e1362553f532b869e47096a6473584efcff2fd930e2fe338fe5a9649885d906a7d74bc3221ca524c1403183a973f4a29725fbffb96877241ca872ea0f1ff9c99261bd8481129f2d0f832e25a70b9c17e371a5015de6b480493acbd199cbe55ed4232e352221750c03ba25aecd75571ebc382ebe50311383d34c8704616c0af0a0e9d803babb2fed1071eebed4a38cdbf7d7f9ff7fb9ded256657bff40adb536a2516f6991274808841191bb3bef3dbbbb7b8ee77a4b5bf6cbab60a092fb3c1c5945474bae1b37b61e05ebdc1ded162c2a63d3966dd7a089caa45c6f01adbb7b902cf596767d0822b683e30c7e84e4eb5d5b12a77b5cdfa3891584172873f88efc766dd3f6ce3f150709a2a88c651485081d9c98c705ef02f72fc40264bde00b3c7ce01da11a3122d6236b66246548887ae755ed150b295750e7b925aecd7575bcff7f9f32c33107e36628e377241bf13462e7844c0ac2c5b8c2ed8861924437a42899c2ffff41f70e46a83becb2cb215459c3eeb8c6cc96505fce395329d55bba6c3a9fd00da8a239126954acec11ab2073a28627a6451126299e8f4ccc8acc8e64d218f62ca2a43453d48f180e50345b9ed25b2533072be5762e38c32939e79c6984d45b4a84c494a2cada40d38562b66b9bb6b78f75e69fce9945a2e085988ddde9ce5b89ab556ec5d7dbb54ddb7b85317410b582cc9325684515c49a31a26cd95d31c3da646d7a01bbb65d5e6979b1c97b4871746df091c8c26e896b737d85b58e987a4b77704c53f413238fbb5e79afd65ab740546fa9f1884c9eb4a074770756d07ece39db20a9b794294595d505828dd8575044f8ffaf9273ce5f39f596bec121d178f4f08564c36e9e96d4647c75199e81f550656042dac84e988830861eeba64caf67be20d9a35733f6a3455cabd81234bbb6697b8f2d6742d7bfde0ebe829bc54ce8738189e853b3719622f524d51d0a115b2a502d18797e85d602ebad0fa452503174f0f8111183215b412648cc1fb690d1e77f001b2e7d252f7cceaba98feeeebe96242aa6ded21ddc012cceee6e8d3578f0d414ba2619a880089d1c3b7ec2c246a4d0a79b212c95f79edddd1deb897307aaaf6b6389818ac26f23e9aea991109adc340d64793430674eef6c802e6bccffbf12972a091571ff4a9c056a9bb36fd7366d6f1a361e324052d21328b97b81ba7e5804edc080250cd103244aa80495a36a840a6631035385d09d64ace4ae6351d82e8851c70fa8488015b7c4b5b9ee53f0c52d716d6ed4f94e09470c39edfc8f58002f5b6eba444cc6bbb6697b67e07b76777727a025cebdc689c84aa70ed912aa3ac4a54ba1e7cf4ce5bde02a0b6c05a99899a13fc2c8604442a849e83e29022c5feecacbab97e37d6c6624651b881cddf3d1901808804a1e42b2b0cc6617785cbf614909b7bef7ecad9635b5866bd820789221634a450c142c1b303f6a52b462ffff19dec761e2d803b61d8ca2be357d6a0d7b5390f2a8342d9e46c5009d00331a041c41c3401cca12b9a6031480070d8890bc7888d02c1286c6c180480c0086024100180c0602018140202c8a817096ca62b805e646dbf3bd2e64f64fe4f004eb23ff0e699e3247d24b954b5088a40ecaa685d8258c2a3eb4ecfe165df5168aaf83b3641af522ff11f7da40c0a2cca02c46d2efcdcc6a1175a1daa9d70e2a750166303407f0b645b3fc83a82b1e4899184fb508d9357cefb368f6496662150a6f7e785018b411225e0e15f5890e2d8d344d1149d7f438da024305fadde9c440f6f31737f3568755bb2fe44eb98682b9ed86ba66f98ab4db8a862750ed262b4417862278d552ef5a1ee7874ac9ff53c3143d4951a8845e4981874b338fdb6644167f70da9070c9695afbc2886b3fb9fd8c545bb6e2da3c96ac914c53d3127a343d6fafc05c2dd69c4ce918a410957a367bd3c9241d7c1218cba1ccb4637b47115544336634360960ff0568b26be93a44a1a2d9f59b24d4d66695674084fdbd875a244b6e018a06c2095e2dd4ab8dc170c6fe37ba6bdbdbc1e8b152458909ab6d0d8a7ecbca1261aef5c8f04b1c3068a2b35b45a74db7b089e3dd78d2b48c6259262ccc5d1dad46da316394643eedd95a6410cd1e4fcd54fca74e1f6da5b8bb3250970d8d5cf4a4a195d4643556a2188b7bfd5559311193eef6871797c02bc2de8bc8834292b0731e924411129b9ca537a6ceae2e270dec2c56a22b96e463f562dd90156539a401cfda7ebb33e130c2b32ef4653f2413e0940f5b53b2c237b31677e5fd1a5ba367da9a8f52f3ba211cd0a86acd14aa4534574928ada454c5c91726a7a4cca5c9e68a194a25bdd2e1ff64f5ce58c21b4eaffe332f7dd0630929ead5abf96f88b98f4712bb4d25861070fa396f6c3f228aa769d1bef21e9e5f3ddee813d442ae61f6e8103da1331e1fa9e78d1736369bc1bb1251fb2176cbdf28b32e55ade7e471266c81a4dd06282c44d1aff58c1627dfb68302d90a51f44d311893b313a8307cd6fb1475788acc3457c7b4fd399f0880683d5c650b11cd9d249aff68132935cc4ed966f320996adad48ae4546194780947df9a4e180080b6741118468028346c2867ff5c8cb30a14e029c09e75d282ea573c268928293a1f81872649162790292cfc5167a458b89fc6f0fd6686b2a058e8390076939b60b212624324df61daca31cfee89ab31cb4570f2e01b2296c28f8a721385c653b853610477395dfa84c8bd4a47210579b988cb39a3a2c755a18cc1bd73f346275a053857a265e82b441021e8be4a6224d4d03359ca241f3d7c14887a47646ca2c411139ff02fd8d3318ad02125e321b6237dee5811d423c8a9a8510786e2f6c731a10a01da3d9a5796898a7ca49222908098242196da2adf276c85713d91c840af479be33dd44a5eb0e00c6ea0f66ace750ee1db88d1ed6f050d177a8d4d6c6088a44ce2b2a490949a94b4b2a527de01514f2f3a3301a46b8f2609de770961ca6bc649fd8aa25cdac6883f60893904bfeddb91fe918bdfef655f3c8e517069c457ef5e66a650f89c7757ddf4bd252eb8bdd1c0613bdade3b21caf239f0030c93d7aa99a04305b4a17589908f2b2fac28b7981b3ae9e762258d3f881e1aec599b58884cf5cc63bdb190a6736247b98d5cb9fcd2610614e180a3298dde507fbebd8deb27dc403ec12cd41cf3fd70695f9192f71dfbf654235c6e90353490315fd6c832bde9802d0853ba985356e9db8af0566a27858c95138b2db3035d7c7a3a75dba3b647d4c995ce53d2c5b4d91dc8ada94cac2660ae2d76e22ba90317ed99b94c64fd6e32287beb800bfca12f1d2a2218ad7d1db5ca5d3b15a28269a39f7cad6b19a4b66f7e239af7f89607a8a796e0afd971daf7767d82898e207218b3bc828092d7b227d770933e0ce683636435391513bab68dad1389cd709cfd3c40e78d02454f3c51050c97d335cb8a9278364abbbcaba81e076ad8261218b934eccc8c43dff240fab4aabaa8d5c6efdba7c461f7be65bb39cdccadab8549a5b52571d0cb81fd05257f52bc54670ca95a3f890155712e5ed711a3a30a6ddb7ff721dc7d60c33917ccde9916c22a0b4b04d0af2cf4d33c4e6e10b9e3dce44cc35e553ab56df458700e79afb0220d95858da2acac25d9fec14943b4a5a1fff0bfb26a4dd03fd1d0b18b36fe593955a56e6c0b044fb29e7ae1b62415fe0edb3738f03ddadf16285f195300a2f2ee76deb793c71105df2539ba939f5340d31ede2c94a4d025862142884f01f8b598b61adddd5408ab29283531086f384921340b5dd1eb61b37b68394340723ded2dae6516f96f14f7a417ab1907ef8f3d8d002807e59119c18490349de164614cf2a4d018c482df8a54fadff007d1eb27bd59e53fb0f0af55089995afded158869ab33264e0d9ec7bf7a2abfb5b2d0686615895ea0b03f339048da25177b97eb715f87d1b76e542097067eb609b821735cd01863e577b6046e6f6ab46eeb5e81bd192f6d9586dbe510289c53f0e68887b0360b42f22b057fc969c9d4526900a413ef5d1d03f08bfb46d36078b080c9db4de95ca92f557d53820708327b4cadc8b2892f67e0abd2f158e8c14f38877a6bc6b9c4f3276af85a56859bc1a55a67fd2bec14f8b438d341d5082006a530ba240c0df3f9c5422ddddca3933d61c22138dde9184ceb36a9cbf6fb9b5fef5e3ad28aea8c716ac000560b91113db931cc3057892624067762b3a6a9b0941a5a9c4c7ef8dc2f56ac24df912b4161ccd44b5ed0e896a88f89219c826ce8f87bde318ea29d098ca286bce340d0a3ea2b03a4dc786543814d0d7e91bbd61729a3651746d1fa26c0c61c4f34605d342b5c3ac9f66ac3c78bad3d11a88b7ddb2cd19c17b8dce701d600e729e31978ed283e17bd13975471a3cc41380f61b06e6398572c969e0a97c8f0e0e1ffc1e75de3e8ad321dc86edf9aa0ae222941c5ad99472e7b497fce170223b142e1d9d710f84883ec8f038cf50403ac8bfa5be213df902c8c309038fd2b8b108378a2f35bfbd9111e646f33569271d6b03fb15ccd2e646434a6bd7d12267fb3cff5d27d2e98334a71d985bcbabddebd1423a96cd10e7887b26343f81de4cabc0c072afa62e8c7cb05c6aeed6bd1769bf89179a93f1a6cc33976e5b49095f86a79dc57f7cd358d583071d03968b122cb8d09a05fc47adec2af778011f7c542ec21fc2ac4299c316b9b112b064e15331e6cac305901a167eefdd1defcaf6816b685ba73f8b3cbecee1f82bdd2b89654323073de92f0279361ddc40b851462f2bef68bf7c6c788e0b05565c089e13c681f12679ab7ef9ba9ff896d673ef47529ac26095eec0fe4123407ab6faa661484aebaa842b7201eb6dfb528c06d760a637fbae62f1d3bc14d90c54b814df5806b6921652d24ab8e6143eada637b0cd72fa85511925f5d25b5019bc983960a35c72aef5d1235a162eea205db3afa039ad0d2e604bf6e5f0aa5b5d8b602d54635bd41d408a472636a64855314e8282d9b4bbf573350423b6d42693728633f2df5fdea4fc962764d5f80192fe48a89bfd148273cb239add4821e82f9643abd542ec7632e379c8cea7bebd05e38fb9e072b7da4c52bf436734d31fba1ec750e77db919b597124bdfa5214b2c8ecdf37ee72fc8b79da76f87306ec947a989a549238b1e6af86b9577b39aa4d7f14d3acf0d74b922082611b0eba19c2f31d3580b2505c2c15283ef06b9132264df40f716c2c541561bac5bf141f24d724920545cceede2df3f42b39d5aa37946d4b5ed98f05e1fb0e30bee5a504e93f4498f0e111d342b496ad2f4e1f4ff849c982949182dbad8a5fa4c9801369e0f9fc5680685ac05030ad4c4241faf9eb0a0e17b0b25f92004ccf3f3f5ac6bc5d61ab9e36c80a5b3397a18d538253934ee2c38bc13353534c1106bfafb9dd6d6cb96c74f050444df427c6c0ae8fd0b2952172f5f981c4cd6d23cbd4789c704e0d6f09bc12e080065c7516174ac9d4a35b5035767f959234c16fa345d631204cd16fc04323b557bc95c8ccc5953e3abab2b23c449f7f2660da91a9d322a49ce4fb65751590f6623eef1398865d64680c9156e7910a949b7f4048c7010441292de7129ce5036b030541da3d701c3fce1c711ef2e44b0e8046bca4094dea630ed38264db66adaafdbbaa81a47cc44616ce544e1419ac089e82c1be936dd76769eece46f515713c1f02649320b810a4062230def881095b3f4937fe3b0e8c6dbe3ca7818253db8ed10c6d2eedaeeb1e1ab8f3be1ff8f77209a1a6e5c21860d572e8f0300173fc6c2a2347e456ba045efc66b1abf12b2d76760aba0ec363e19c1a04e44733a3ea7bc8ad605d8e9725d0d49fc0c25d494e0344c50b616f398b342edb8a1894229c75ecd67eb20a2d7687cae4c330d13435ee91c21c74aa81054cfd8170ac3306e3fb097327717c6a0cbdc5de3d921fd7ef7a56c2e839d01a4b883fe558446cf79df45115ae624eb16c1960813dd326f3cbf8594aa969d497a53f2030e1964eae09908068ffb047e7ffa76a9d4564c424e87b4d7e412f2dad17699342f204022683428ec9295c3ca27e0ddb0c2f6e11701e9cd20969fd2f6c41a10902704f0ac8769bd1a50d1832c23d4aa888bf3c5d6bcda86761f92709fcb0c60c26f20e1ab9a0955c7a446dc5a28e9e1e371b81126b7c9588b349d0642927c3c733ce462d4b41fa86eddb5f655e5ae883ce7799b4156466c33b15f4e0f4cdd142eae599fabe121b1cd09c5fbf759726074cb015a22dc7dd33f7e1dd1ee44b9b9999cf6b7afe8b95e1331cbc12822a14a6b76411b37f65ffbff06f45ad9a19d4f7b3dc8c2ab945aed68f4d6a80bdddb98040e8fabf9ea2e33939ed1f67f68f7711d1ba6b4090d8e1ad131584f88aa1b87b0d1794ae4e9eeffae272335d065c65885e150a41a0983350131a91f648dd8ed9750e39c62b72e532def6ea17e0bffd88aaa70451cede72200c471d3a5002c5e0f6fa24180d1471824492dbdde688bfa41fb4029e138da56dfeb755a3dc949d459cbbc5a31c0aaebfade577cb36c49acf1af887f6679dee08e0e36bfa2d64938bd418cebe8c1067b011ea30f7dbd88d884d65e340493895c03c835bc0ba48e1c402839721a7e20a414691b12ef4ca1ba04fa31f71ea6a357967a29919bc7e7fe5edb61ba0eb613ccec12d7779d4cf61a6380d3dec324e84529b72deeb6bf2ae9b31323744956ab86e8d7bc0a41493c245c0ca0ad88cfea98bf6a97582645ff908de9a238ceb9c1415b68eadeb2f8ab10624f72c6559612ba7fc1323dfeb15bea4a857a0f56ec1353ced24deb1172eefe871e56575a0bc12c3d50b90bca175f125b9a3da0bf442cd46a68e06a86a547ffe5c17cfa11b977d968e4a02fbd41d07ff9e4d54d866965af5736f497b826c02f6d9d3e1e9cbd13fab1286ad5c4965502d99cf32622d97a200ac8f446cd0a477a938c0c13c9703a4dd57eecbcbc742fa1944608a93744ce7051996ee05a4239cfda769080fa6744df4ff541f1d08e784b07876778caeb692bb9e788673d9b17bf49fc5dac918d70377f1c6c587b8ba233cc12320a303b55b31d2b34a115e96a5eafc5da000152a60c3294c4817b3077df6cf4f3b60db39983e05f13e7c66e084105d287db7ba5328224be105f81cf482361c6d34632366b58484e8d25ec257da93ff08871708b6dd9ea121730964a1b8ca3e88d1063efb192853e840942130a0669a653da7d2df75522648aa574bd3a29257594a111c53b7421b60b088916063356ccf5d84fd6432eebe295c3552803800da55593b9f378fc8ffe76e2371bd072d3193c91b24adf9ec7b751630309762c578eec13a747e353128e64daa4a423933ef1e90a451973330c923cdfee5d7712d0ac9426173e69ed3e21c4b2cbc82d5fda3292b2d9a5799380030ab75cc9f823bcabdfd466e66a4f8ef611c1c7583d93470ed5c1d64217769222423cf278a34bffe5e1c513f0fcd84146f85880f415c520cab65967690184994116c5216fc10793b5c5c415896083570e317e7d7ddeb3719e333f36ca82805985976c9e4b50f355f9f194840ac79abd232f7d7d32f9a6efbedbc36b661bb782ecabbfd9ce877b745b38e77ce3e681d601763490bacf0a99d8c177aee097ed7eec233aea98077c7ac2b979e385d474805fab5aa88bcd8a964ecd4957841b07361c04408e03909bdb6cf698070725ba56209131b194cb54404694c68f6c36a071ecc559dc54e5b87c7c05264aa022c965107a3ae4cb2f0c72bd56eb113534f7590d4dcfb928264ebfa28f548becd638e42fdd4cd72429abde6d3bf20c95220a5c6a481da5ea48ed54da96b1e8577c332d98bc5a6b6d73267ca80bce40cd021d4447ae98300aa46b93c2d31a2d2246d8c45411993f7cf9215b7624817d8779a3c2db8328d10db2204bbc787500fdbc5ebc9bcd71e28038a7da15324eedd453fb6a54e921c908e3694405019695788ecca1f3b46b20bf381b859732ddd868edd1a7237ade96a05a5cf12e093438f1ef7f3b33b5cc7436835a6db765cbb14643b682b0ff9dcd4e4ef8dbf1af4097881b93880b6456dad962ab116944774b732b3f1c45a0520ab8514a0e5700cf36510c31584b061f1836b699c521ffdce1e99c0e89b5dcfea76c532f34f0f92d811440128a9bdfe03e2f4d24683d7fe8f183977ea8f2d944bf544358e0918041d55223dc07b43685381e118c6a3ba1a4fa713d1c2a4a3a97839c994f20c3013ebdddb59b65bb0011f6051f586c24eaf547bac67197cbfb47e939d5e9b7dcde3c5d4ea20b1f7c060741c76b732e4bda7ff60d96ed4821e2b971b86bba909b6939b71f8608eb662e62914c0d4b538c147a086beee2d3dafe979001300568cf821027573870356c330c6e036badeb53df3d357b97f1c7f9d7d370119e77913b12bcd79dd62c0785216292327e3a6880af7b6d7807929cd3342eba9283427020456e980d1d643f21d73522a0cb0ad4482931688409d813baeeb6ee34f654c2cf8cbe81eab8dfbae134ec60deb1b3ead5e5eecfc8cf8c804c49a988d5bffa77054d3b6fbe58bd941948de3e200e1fc316a70edbb85925d469c5e2897465d7c3e5c010646c36e09f1593e3f51735adc6bee6f9fa557169481a8695dbadd30c6f2dee99e6513c54376ede961d573c1f3cb16db9bb8185c3b908e91bb54be0225aa6d51efe24857de5891a7709bc9eee680c756461af9753bbfb475daf342e6ebcc6fb748536c58fd5b7dae3d2d8abdae2af7f8a116bdad5cb00d4a8215a349bd917ff1d450cae6d3b975f40630270d820fb983a30d602c66dad4f0c1cad0ec3e58a3315bfe59bba5018e46b956bbba8c77281aa25360bc431f499e549e8f928ba59527ac5cdcf39c07d3042e86e39d6a6ae8ef0f70a08d1fde3f7ec1bf6f66b9dad0cf8ae90428b8444168a90c0580156220318e5bf2e8b5e70e2bc6ece9cb04fa0bbfae26f607b804aa5736168509658c609c86a0cce70ae5daa08b14feab81e48c9bb3c59c1b0f62ddf690d91db364ea3286cf219e29f0f005579897d1bd9a8a1c97a41b800825c44be6c736fe3bd7047d0a2bf3124d921b7254bfb9d5993a440c0954d4c6ec53301b96e1735344e1c425a189ef90c7293dca0312772189f5c57ca07e950dd954a766d5779a191922e19966174075facb6308c5726174b9510075770f7915f3b06f658ce2a5c7b60d86ebd88574fc55cc1c02b4ac3b4320748eeea6132dca3dc6f5ac179fe71d6bec523be767cd55a9f31f6289966041c98313d957871d67fd236e24cb549ee258f7fe3171f1b09ce4b8f4d696fea15fcd087c75248bc919c76e974643797a90056c9b6398a340bacebab26a790fac76ceec942170938318fd9cc51d85817315db8580f5e34d1a00c1af6d05a5cf14e76f8e84477425ec910a3dac1e6c098c1f147c127e95b3f4bad2e01dec8c35931dce2c7bee53598b6bde7973071a0a6955d9cb9972566a80cec26f0e8ed81e7951a4efbb575ad6610a864e58422045f40d1f252564ec548b5546695e831bfa1fde8b6c5f919eeb6c8ac9e52753d0a6c678609984a35f7b19cad9d965d343a2b71f34dc84040834cc3d4e2fcce21788c995a6662684ed2a4be0e04f9acac09651a0754727b7dbd694d2a53536b13af58c89bc8f73397012d16edaf370a3bdcf4a5328e898a1626611c9f10af07b53c1deda04033e1b81101daadf8ff6df92ee534e5c8c3bbaa20b44253fabea55b28d22d2391346911816d0d8cc248a2140fbfcd8f2d0fe273d0e462acfff6244408d2c5b54e63afe35b07bf388cf2d7daa7fdc18785549b578d659486d0fb1a18d1809526af40485a1a19d2139346285d54edaf80860de4d4ccaf17529a48a69c4e4122edc0994dcfb1a90fc88ee511332d5337d4508933a67a95d0dd4a23250ba18c0c1235783de853b9011daf25daaafb7eb80b34e1f5a26cc4d3512b453fa11825a5bebc5a20d0910fe038ad381bcfdd14243566610fb1b5a3352cfa6b5be72c1704e45c9c956ee598be33456ae20458f125abc95b84b80240f89842a3138b5ccc9822bf3179799844872390fb597743cd1aa9d2b44d4759fd48e2d162ed7fb41c0bc62122f892364cd6b72927fc6061d4cf26958e1ce168a1919b6d894173dc8d85412268b0d379eba4528ce085e30955786f12d57962fe451c2d523d51cb9baca878322bb7e297b4bd87e43b7f6801cc12245a7bb8d7cfd9ac8ccc44795035eed38ad0ed080afb4c3c5485a52ee4f5e620ba11240addda1868e97c3bdcd8a83282330f2597b97030d425ff6092396afb002591b82fd07892c47c68bf3f62e4081783b7a4d67486693a735b34f2eee3b1746714ed4125aceacc82d19c9b343f54535b23619509c2cd0420c1cb025183376bac82afa30eea09ab0c9ed51a644b4ae5e5a863a63f7654adb046b295240b0e88616e53cf40aa602bb033d908a5444e5a8b78adc19930591c01946db369fc3f6850c874119197ed6d45624fb2a56890498be906d1ce405ab12ff4ac82ce1e23002c7a366128a2f758c59bb3d6bd306e7f4e8efbbd3d244b555c0a5192564390d69a9711fafb7b379ee72889f1f74cf58806bdfde655bc93d6b07831bf75cb4c71033198f2e8058f188a297a486a32835104968cf14f3d755d9bdecec0f94035c8679618a245f22d81a0461ad0e024054dbe3016f1fcf2a879ac891fd5106608ffbdcf3d11f45ccee091dda2cb13f2aa44f20f1ab83914b7b0aa2ba97b88d928a4b8cc0290f25af77e643422aae968415e4bce91a313487745c8d3c0505cef3be10c1f036a336c9eecdb3d4a6cc3d0e51cc8d0cd274f0e7242fe5f3139b383ff3f9515d9c97c000128f1522679070c725ee9fc00736a3c7441915bbe9c3c6ea7bc38e42b1d2d6f17717519c1b81961ffe69773e700549e494b90ff1e010340a9d813f2eb6df8887acda12fb90000e0e505db744670a3208f4c0e7e920f7ce35834657f4ab8c0184cab5bf9f0232a88ac0051e5798174988806eeea46858b5ed68cae539ea970199c98b3207671c4c270452761cfdc2c7119139629d19215776be4531642195195a6abfe50b50abe36bd26ac4e9b72536890598f4ccea5b5bb026c21ba3eef3f14875f10b37d783f7120bfae425dce01f2323a04515a6c9ee957f91dea4811d11b7f188ff5a272d89bc507bc2eee213e03917cd2c8c8fc27cf6ac5fc6c89dd8b629ece1f6a754feb15d595bf71bd6efc3947040427ae02fdada3d6579900ad5d668c16804ea9309ec56a54bd70502cd7a8a787833923604a3565d7b5fe2ff4e17e53cae04ec8f7a783b4fff7744826a42f38d87fc31c88239e828ea71d96cec115c0fd62a611daf325c5b310ee38c6d306358bfd6c1c6943b37aa6463083c843acf5a56c29e8ad8a2b92972d33d2ad507858986e49f9d4b578d2d02bfd5bdf320bb32fca19adcfdf3a1ceb49f3b1066b5af0165e8d449fe64a3e206270fbea7495ee99a4abc3eed2d591e4067a1a5a47655eadf13388bdf7305abf9385585130b1136a61b853b6e18118905c18629862ef04ce1f9139aeec31c2b763aacea6371067789a8f58c305fef29f4f6f8cdc789e5d7755120169e858363d8ea82ed17da2381a03ba9a4d94a8ec3bad452f278bfffb40a2879205aef144deaaebe4bcf2ca13d15911cc682f0a0cbe43c023f742dad5ea478ab83d98aeb6ec983b57c0011f22db7a8cb99f2782e7d055ec5ee8288f62d240627c95521277bfe3d2e121ceb296baed42a2fbc8819e343492a39730a110977e7d1d8054f6fad40ed6dac8c31eddda1205b087243335b323b969591237811282f7e83e6639672f9ad9fc553c37d93d946de542851b058b3020664141533e76557d75ca8fc5b0ef810ec596079e81d1460f3091bbda7a7c1efa3aed6003185ca144617f87e3a7ede9f743e6e977786f6fe53b4fea9a3619261d783f946a13c3fb9114856aa06f18b8c3be73ed7e2866370ab06f7979a58c16f7af20ed76d2d6f91b0af738cc5264d6f2c6a786aafc1c01d598bb8fa84f6a7e454d0348b8bcd41f3ae1f7b028337faf664209272fc7ec0611a8172dcc269acd9f607e26acfa24ff16d8e772dfda4283a63a73a372ef55226ad58d19144a526ecbc8419646485e042106076b482d87c9648963d2368ade1b834caa97552b417043cb900136df1c242e3f7eb56d79ebaf56bdeb6e235090f971905b7f2e182548929e025697e2edb295f3bc57b63a16f9efa707c277dccbe9ba94087596c46f533dbbd05ce3a6d605f37f1d3358776ffa50d7228d4a5237d2ed02d77a834fcfa7fc44c1102aad4e244a6cf26724aeb15dda5981cf8177623f249b8b763ba4edad621d119c4b017ada842f58708e25a503f6a3b75858eda21f429f7aa0d80f9444ec0bf5ab0cac03d0c682caa3257748598db2963fb767ee8393d7c5f631bbd4b858b236b4ce4599c576b9d8801cc9dff2af3ee5d67be05e4a5137c263b04d64f6278490f802c202f70230305157835e2d6174702ea87ecc213b267e7070ca091e77e6726d5951d6937555e6f6ff3bb8c59c9f73ce990712a59949a5071e4b9b07a42e674ae95cb0544f6722bdc59c1e8e471d4986c04cced04526e48825672ccb4430a78fffff4d2ebe953f97b541d6065a98a7aaaaaaaaed8ffaaaae1106d0e6eb05aa295befc88f891210a6745865536c5cac54244229692549abb2964c2477944a301972b960cdb411c2216c8a563645f5c99868533389a46555d814b635eae3ff3f972e83e0eaad3f9a6be0040fae9a96872786232aa3a3af1ac618bfb428cd7c717a8084bad60e4d702bca7ab2ae555b582d0d8d20451897f91ad2605eee91f9d329019cf1d8da8367b0bbbb3dd1bec88a61e179c191fa6c01ecf88211c312e300ab0cc74156db5b51d693751dfbd1fdf021d5c2939c2140d61b74621372a222a25122e1c2ebe3c6a6a6f6bbbbbb3ba010629cfea829943526f115326b5dd30865d5b2a2ac27ebfab076002a143a70eb122f898b369b6dc5995c318b5043c9169d5bd489546fac0a9bc2b2972003ab13461ea28c32ae13c8140d63580153dddd352bca7ab2aeed29b5b505c4465c3f13292ea09e8fe3865b7777d48aa42e2b63570dae271ab8da08a9c4058e4b77b7cb6229182d3696dc9278dceec32e5ab66c5ddbffbb2af84ed830fd9284c0d29a5e52841d2fe5ad47940f175dd45392f4c678ac7954ddeef64c8110774337f6ffb18e28cd44263d60298b584b9c333fb843b537e79d4bce39b6d6387d0504f3ce30012e3039f4aa0ce994450301de8ab29eac2b0f2de608012128bbaaa1a94645950c4de4d443b49112e0032a9d4bb76b8ac061bb9935c3929715653d5957fc12d6c7ffff9e77e57fa744f0007d88ab592308930ddf970d163234323864f87f14c39c7d5a5c162e276fd99aa41bcc38b6c0a2cd669b494da72041e0180faebbdb4ddf0c052676400b30785cb07462109da8ce14c12dafeeee0f3d1dc61b5a93b6ff33862494663e19ad368861eb1f72b1f2e7bc588c802220b960ed9011290a6a1933b8009821769ab090d8de7f96ccb53bac509ab9d5e56187d82c67360d4d76dddd6d18aa4c69a6fabf10d562fbff4c4294660e3308a662ce6fc953b2f7df4ca621b6a47a6b8d6cb8f16289dd97354f0e8ec063d0e45804b3a2ac27ebca7b9b73ce594594661e91496587aca5ad8396eea58fffff3860702bbf0e1b2d8b8cd40c59fa4b793897125d379272c920998f1b215217f15694f5645d77217cb6a6b6e4a5bbbbc99029cd549f32fd60e175bfacf8733ea91411e3f0ff8150261ac4feff0dc00986d588592e07dd750c09142f70090d21239a351853b06c77f7900fa5993f6088a160568f6aae45edbe6aa4436966cff7fb6004bc0ac618639c5bbabbd95a46a1f63be3ee6e2b94666ee10e325d286ce35815368565310c4ecdb1350cb41a5be3bbb229dffd4a5ab56555d81496c5ed77523d9f6d5d328258b2c26b7ef9ffe70280e9f6ec51eeb8c4136d58fdffcbb91473d3b7b19aff1fcb86d24c5d4f032cdf8f76769e865c923bd2610fb2fb6079fbf8ff0f2534b4f2b7b8d6ddad944c69a69abee4803cb37703c09b84ec171b390caf16c22ba89996a797946606cf30ee8131c637cabe59368ead71748dd36b1c5fe3fc1a0728ecf7ee09fc727158f7d41dc7b52a97aed89d7b61cf20dd7ad2cbba36f310b6a42d8ec8e7f032e7bf55f3ff2be9509ad9f3fd3c5002fe3f6f841a5b6245239c747c332335f5cffdff3d6c28cdd4f57cbf103d805db37a8b31c61877dbf296addd880132ba8e242ec618d718a234b378442695226a2c557c9382e2c17b51067892b62bca7ab2aebc921b43160c94d01325b613b2947104caf7bb3141614609163bac5e7e3ace760ad8fbea1b3b4598c7aab0292c5b03005e77378ec40b39dc4995245b7c97430a9cab1897c5fdeeee6ea916dd4a37c61d6731631fbe106be707a29e9a33bb73e6f1ed8992b1f4f1ff9f461289e4089b9e8eb6d7474b12a511bba99c730e16519a794426952182cb1aa7deeec52da705590b8104494f46ab7bf06efd3d4f91c32c901b784f8b218e9a8c68a05c0cd13a8f3b7eb83a154c62329634f4248f43ad087684305ce398f0f471146488cd022bc8f811923b2292c3e3a846850efbff6f3184d24ce1f0438be2ff322b9ab44769113c76e1fcffc16a5cdc92654a33d5d95bb25c4f36e89eeabc227470569fab730855da6cb69a99596c912872dd66deff77e8c043aaeb5f1e6753532f898a2bc8c66206f9b1e85249810848d68b209e196228fa884ecc540437f0d2d5e9e888712372bb3efeff5f97338e8cad29221a6c36ba860d163d97a5006ecc38ba526c94f08731cf3d41f410b6d8a4694811efc61e308dfc5a862472445a384ee494d0f755c345219b825d5cd50659dc11917839a71042af8e28cd4482b84afe38ae942b3760e5baf45dced852300f0613cd6870bb181508993671ec97ec7e79250930206408955717d111e70c4eb930f2faffaa224a338f1eaa9039dc345ce668055f1ebeb12a6c0acb0a91f4b4d7dad16f7a8325af407a5891347700cdaaa189d1825a6e93156528cdc4b52f4e4f0816406d8117071a8c31c638aa09001a7528aba5458f251c48bd4444aa5154342d3ad478a4fd7f18d44be97be9eec6f86d0b3f2576ba96c8ae545c8105d970c09df8cd7a5cb09afbff9584509a5994f464eca0648577aaaaaaaa8a337bdf5a95daff1f86446966324cb9862d51c46cac984e45ac57b3402522449e488f9501820792373d2db723c1125a472d406ee648ea5815368565956adb4ef0eed4d0b8015b21c319b60454b26abfbbbb7b92509af96414d16385c2b6dd3e3b2990a2ce8ab29eac6b1490b21cd54562e66c81a7d301f3824caba8c914d21b3143c0d6d4955113d412a8e753c4cb811398b2b46010f278f05801416163fe08fe3fcf645194c143bedc691221bbe15b427edd30b6d2afd8c7477d39c77004df6e47621cb16952ca51559574238a2498d24cf56f4dafa4f9012a996b915d581536856571cbaab029ecdb4c5d6663d1c7ffff1cb61c22872e6723e4520c1d442f1518bc69acdc7835e49d36ec9e2716d030a88fffff01ef8fcecc06d23d4368853c3e4470158cbb0257e002a6c88b5b8fedc724e34176cd7a39d7c7ffffa82572e5ffdbffff3bf5509ae9fb013308a7a0caff12e0e4c379f14ceec9399b90455ecbaab029acfae69cb38f10a59943b5b81e51902c083e49959a8bae2ca6254b6e68d316f5e043974b956a50ef58153685655b75c74077edbcf08562c44c52d4901f27b058b28bc2b12a6c0acbe217dd993986b86555d814961debd66505807a594f742bca7ab29a6bdb8404d4ddad43820bb025b29b2043390da51563657adf740b57c3d5fad121ca41e4f6c562654a33d5decdff5fc48d62ce3fbefdbf4c12a5994a0f64966f115343195239bcd8755dbabbdd54f9b7c45bb0375bc21155228eea85ffffff15302436214a3387c52332790f6cca9fe4869f7ae07e1cd0bcf58aff8c4ca78fffffc5b0b295ffdd4035030fd44c6f85f24d81f5758e7530b662d724fd09d6201fe3a2635a35e6fc254df00e05feae0257316163238af8308a0103ceab86fa529aa97eb744db59dbc7ff7f61cea80957336e37398ad408eaa7e12e9733054d3e2762f070a167c609d70425263c7182f39bf5b8bcb5d4f8432cd5b5efb74f27889baf1baf28ebc9bace786b075e60415c42e38e19352a88cbb3bb73a8cb8b0b7c90a674c4909161a49b8080b93881bf9b09d9ef37c36abf33eeeefe4262115fc995ac8acc07b79393d14cfd55d653dec0dadb060e54b5fdff1fb72c0df81e9596924f3227118d12274a4b48079f8527231f1c28ca48109934f460d0c1579ffbff91921ae9a9918c8d64d5485b8dd4d548628d54968998ec54555555754bdda563099408c20092540449662868464cc786d5ddff3f0a08a5994220a28a5694af92165e50f514b946388854a72ea6c80cfa04b595ba6ef75b53fb9d7177b71630a599eadbeeee96b7cfee99931cc298d8e8b101b4aa6deb1a65a4ca5bce2df43ae59c734e12a599ca10394b9baee7fbff16530a08885b1c331bb639e79c5f21946616059020a8946ddee6c40079131a68040d0371248cd31863001400070c6a94b4787808311687c5c1a0480c0484026130180c040040a140182c0a82d068aeaad17800a9362d9b755087dcf8d252e1468564365bc5a23186ea284aae53a43daa469d13895e5178dc5b2b30f6db8c5b8ee015ec4a8f461befdb5090b46549080152a5f5c6c1719314fdc262e01b2f7cb846499bac1e5a5c8b5520cd8497002e3e611b62c8d6356057eee490bdaea48a573a2d93e28830caef4f278d631235b561e51fce0ed32674e53f5140a552cb7c0d081c6388e0e53a5effafcadb1e9bb7b2e6da0865e6d8d3fa48fdd8523785e51f71ea1a27128cee1c5d7b313a04ba1da2b55f9be41aedc5ca165f290751cf0590cd0d4fda27e79761ae35b87b26687011cf31c28ad9d213cb6344da3e3f74b2b3537c3c235bd069f7683ed20d21d4b088ed678cb5fa2a8b5490f1b7bf61818323e03ed030f223019ad1775bb4d2eb1c7b0de8168040063925f1d163b92332dc60a11e8fa243ab93c61fa4c3ddd46864a2d2308e8fc72fba05207a5cff261d3ce57fd7f153a8add024690786bf3c69bd9e960280f148bfdd347b2c4e8917a4c69317fbdbe47b65fe1897ca90aaf0343c7295c6066ae25db25a775eb1efc34f746a1c8bcbd876ca1a2cda61554b1aa040360a9311f60f9eb859eb6db7cc115a2a1a8a6941cbebcaf6f168f51d1ad31f04589a44a940b87979d0107e60ec29246a8ccc420d8fcb4e3ea5c9ad027bd880c3948e6b7159b4a8a37f4cd55e4911a95427b5d31f4d2e256e27bced380dd8d246cc8829b585e8f429a07f12dd81c90e4aef2cc53877cd856996c1478ea4231f03dbb9cde6d8de7297ec59b50b45e032049ebd53d24e41279dbfbc974d67b9938564044581bd86a8ef7d6cdc08a29870510420372809173a9fafcedcec4568d34eab4f895b5024e18176a716b453bba8d17c4aa98641e0ade052f9272f7b879a028af2df79c3a056ba73b0dcc0ab1dbfbb3ecf2a45e574a9214208b332241ef642a9b3a700c8f059c4882a07b51c53c0c4c948530ddf491f68f199e39d885c90506d27e3097393314eaf300cd5dc2bdd5d2f3e57a48999a80f83cbf9c362786b75587cc2c110b6df4957d4e698db840b57f3990871489c67d1bb9709db69cb1d53706044b9c4beb1b1adb6a704c44f90b01ba8672f30afb5ce0a199edd47bcb8e111e93344e453b4d2244f262a824b6193cf528a7639103ac8b8f2a9bf48c2343523120f50b2cd953e8adc09dcbbc14975bd51999a584ada2ca8feb61edad30207495f2dceb01a900e462e6039dc910c907c662c6d15f58cd2e8df6e596b650c42f533dd0d81d1c710855ed25db4128e89420b34545bcd5aa3e8d1c07cf9370547599d25c9fc3535068d70d49bf3178596ab1957e640d3c1c9ec30ab08cf814acf3bb05ca64ff945703c097977487372036f25de21d993cf004ee36e30c75fe07c8e237a9a01dbb35788df885ddc18fa956f48bfe02d9850367135038276ad7ac5cfdd5aeaa97facc69751b681d13c3fcf0f0452f8018b861cc8eb837bdb995d8d04681627cc7ad38588b3024e671d9ad1941ac2b52ff4a94ff9ec9119c77e26f4f16b2da84947bae7c04807e6d7896a4eb000169b8967d635e87bccbb421fdf28d726084833494e7f3dd1f6aa5243fb3ac63ed839d08a4bcdc162b3595e9d5ebf4459d602799f8bfbd5586690b47ed354eab043c80b429f3b4ca1c0e42edb66179c066fac66bde8536217815d0c77fee1a07f688191d7f3b54a0584cb0b21db23e415fe7ad635084a5e405de7c966d880a6746f69be38a57145cbc3f38f131b5b21e5bdf0498a9e2bb907d5aa73183bbd5e33089b4311958b675a65fc285b577710993c27a5231644a4e96ae90a487ee4b5f25548fd8b6d66f546e5ebf31b5b22d90630e8e9505e9479a09a0b589aeb9267946fb14fe12e4b5bf927e8662b339ca794bcebe7924a432b6b215078fc811dd261095648c9f765445061abd52791a68bd1ae7496b0272b2185476bc1989a6dba82cd1e6595ba632c3c2539e2cc4490fddc1983701b68a2790f7ff8a7b6f3504497669a34a6b5df26ac7103b1be2d273be43d06cfe8503da2511ac3b9093abf2e5a23c034eb8629158e83605bf704cea275cba29d285a1868e5d6848115adca25851956892766d702a8f8df05f238a80c2a402072804596d9116cd5da5f2fe3f834001ac6bb2609735f829a9729c75aace0d836b8065dbf5c8df4e036076bdbc0eec5596eb839aa9f283ab945c837d4e89aec18423f40e74d8cf50c31ff70db8457a528c77a3e540551713c65e776e3272224a12720a9b9e434ddd663f81bf7a6ee289d5fc5c00297698a96aba2e380fea4cb7fcbfc438db3b037c9112df4f081eff2c5bf86c1c8ca5e279d4970ce10ac5b53260a9c2fefd849d37021d84db480268086fe18e2e5b029c72a3852341224da2635397b4231b8fbd5efb58bf18e9920bae9463a4980e06a20cf274249c6005bbcfe7ce8dd18c24732cdb4ac1bf83d11b657c55bf551d7b85cc81352d7a7c53e89bb842e069f8b2c124a6af601f9b69bcef5e6740a0ce981c6c7714b376ac1ed6ca411b2609a0d4efddf50162a9a18c4213803c0ed22e26c04dce7b9032a2229a2c083b04df26a7f4c657e471792b80fb7e08dcdd5298ea718e1805344b41e197f95e6edea21c20a06b24c5f28922d3d784a3db550c565354db5df30631d0935751bcf76da87e0e9a011f121f4da51412404c9d533ea8f1b47c2a766ba97b8751079d3abc46d9e1afb396038767c27d5737cd76cfd19027c2517ace2a75d1f2d7da2387c4a568d9c5904311c9fef21808ab53b5830728ccff0c1a15829d66e8dc39a93d514b76b89e25e9d555cb043cb9d3a0e67a77c8ef637ae9e59c1be788c702cc609d62950454a5d9c578b09ceda25e6bf646822edea84c8e59816c400a69df0178f8bda50a373bfb87b442a100764cf27fa86762ddb6f1c5aa225543fb481039a155063cef8bb3ff2e592becc16f12b8f93d10ca7bd85a644beaf8ce26b7b20a3ca57a6780188e2f69f9d7eab8449aa11e447e81c35a2a2c7771cdb03c1d4f793c81db60088efa7525a972757d5d2eb1776feba731f8830be46903f5f1411464cfc60e10d96c79d2503bd6befe426afa55f50d91c298ecb41f2cc0f06dd7fb4a868b05a8a9ef77b074e8fba84274b104ce035f24e70b17b13a5dddc4b3ae4afb24ae106e84657b1ff6c49fa936154f1752f996f6ea52be089cb271a71c6f783c5997e91a0552fac57f96413a7df75af1f4f8a66abe2e4135ccbc3d8d8d6fca963f9f533e50307e01cc56d5bdf4feacc7a481144a30d3c7c55c6ab2a5c9ac38d13b0cb04ecc556f816d52db834b498546e7824764d532fc61e67023e4d178d2707147b0092326e06550ccb01985b2a541513973be2ddf77c2c98099f8990cf5b973b5286c9544566989fb38bc5247f2d5a1236d6beb0cb0f494e67b19d4dac0e73700df4781b55eaba76e47bf70066d446295b25417f50d0814e4b3530c7024fddb0944d737fced13c0d7468f2a1cae92ba079f3a212f1c0875d95c9f86399f8bc530c36c8a3da191668369fd1b569cb210f73b09820cf233bbe24d37d370caad446009b2e668b8ebf147e6fee3cac7025d0a2ead12c4e9e4d048658313f79ad5a630264c542096ffffcafc920a94d3ded10ef4a19a576f6e80444ec71712de5894aaf9d467b4a712365766e2347beb00c4b98017a2fd4955a3ab7285639dd392b77110c9c1c1b2d12b20a6db882c00473798ffe2d7b3ab67acdf9581ac9484a5000817f0b57a48b9ece8473f75d62ed4be91653391c90280e4be7b125992693464a0a244222174232851f3db684db69d822b1b8c75f36af99cd6babc646e9796a2a2e1551f9862c5df57abbcc8b6873a900b24ce7abea3c9078941bc4807f073d624a9514c8b2146fb8ed92221633ea1b5444cd927035792ae8e2c22a206cac941f7da4616aa0e32cb533bcfc704b421a5a676a2e93b0505c95b550d4c544e00267dbb6f72c08576e2350e1f469f3e98483749111862081de8772d4b56e7a49e96a234abe8eeea3e116b5c24746bdaef6b7d3493275a86ddaff53e254618fb4a19fb07b06e30ae735850e508df75c9f19de0ef29821309f3215956c124129bf0e4098b807229ce8086074b272accd3281655a57a501733a1da0399981da2ec635447792f9e548724a19f09c3fdbb2b78e747385b38d78a995c203d80254b4994420fdd4e01a32d812921ecc8b9c7d183ddad7d23d1f49477977a961f6ed52ee658fc49db2bead3b00d4445d8cb97b6af667936aac950647d04f7dec399d5bb2afa1d386b5c29a41583892242fac073acee0c7740470225faea9d56a87c6215b60c2c7ca9734afe6bf501ef2b16a25b8c64276475862d9a795aa5e5e334442f9a253d1aa5a930b88a83970585559b7ee75ca8a2fe119d85d7b8249c9ca40a079b1b873568e1b5551ca752b629be3e06ff7eb0faa4b490e11f169d15fc97c4dfa13f10fa031ae24e8080137e5b3690ed6ab8a7ecf87c7577fc2d8ad055c8214e103cc8920ec43fadb5e332b4e05261adaa0a2413b37b1ff24c2b81ef63b9bdad754cd1737d28904bb5670779d624f5bc1068cd0801e6001b8f0306d27a5957f15f60d1f3b443ec1b2d9802710178009518133e01a4fa23257e2302ff1ddff9750f6fc024a837c6af43b46a17aecf7bcc0a5d980bf7e91c36b631cab928e7652a3e5395289179e82399b02c978398c4e4796c2efa5a6cf4fd704ede56334970e33d447d6146bdbcdfeef36d319c0d40d3cadfe267a4bc688acbc30c9fc52689aaf22b132504da6328d3d259c692c8614c6f114c2136c651b2849ed57681cbce5d7ec868975d13f3b22e2bcb18c369a150158f43c588f848518a1c3503f525491444e881a8696f16b519af71ccdd9780c76e973e452fa293057a143030a0b4e6bd895823cf05a6dc82cb945740fa2e2e85dd61fcea1f0fa746c15674086a9839964f7382b9a0ffe83fa03816808fe035a21d6a7ca3675d7b1bb7c16eadd24b159d2d42ac8cfdc552389d1980bfda9ecf64ea08426a51851b7d24f05511f813af01fb2d15ec806d423e72ed88249a22b5c3428e0e51b9d1d6b3b180430513c2b90157403a533edc59300a243854217afd93138c291a9d91c861a66597f1c0a75708ce831bfe516e8a23f9eead92a0086d518d7da90b5e096652efffb956a443fa022a07dfd5aca652255b4bbfa4d6e7bb38778a0ecf9441718c9fd6e352c12b38112bb9575bfd5bafbfcc2bee0b8d36cbdaf4d8a279fb2f2c4688d7900602553a9d939afb7bded4c3c37a5d2fb7bd02ea964bd9a69a5c263234759936adf5f51f07cd2cdaeb75dd5ff76b4902adfc34dfa2ba87d1eb5bf0bb7d3aa9ea8308dc0156b5ee68c85c67cb39352aa13391e126a2308ca6a4d75e5110b0e9ae17cb0c50de55f41dc61f0cd5ca6e79715841d7bc10692cd9881858bc51c94e9229bf1992361e2e2bf02015ba3a9b1cb2f04f2ec93a44956c4af931d28f597f0c6ca20278ea4d5888d53971a147aea2cfa9aba84a0e82fed663cc3f65ee777e3e125eddc757ae872a6b7dc2560d07201882badc1fd2affe4b7775ef80d45ff2feb7cb12a9121ddd54807c1587bea92c8ec3bb40d154828071b6e417fbd5511957577aacf68db03863d4776bac2cafffeb84b7b9182131aabddc536355432bcf0f696a9aa126619489e1c2f837e56090a568740e2d036e1ad58ddc669f3eaeb25d781b0ca4a2309e5ffb034be64faccff6797b8a4fc845ba4f183033f1ab983220670ffc2231999ae83ffadb834c048dbb4d7fa5ccc3bd941084927cabb0c7ae5e10f7fdcd441232723b42a53c91c716cfd60bd1371d858f58b717353649911cd818916db570b2c071169ebb7653c9c590d438783eaab595ea2702f0ce7b618fb342fd2e44324ab75a30a4e6d5d41dd8d926328e96f99d871e4a368dbdd0b747bb8532b48be47f39a153c69b843532a8e93d7af5d643312d8e5b5a0c4a25f42219acb58f2a70185476e6e08384c5c6f49b77819579789c11ad80cc72568b6c9e9ca2dce874dabd6bba4de1b94886a49fec7cc5493534bee914bb968949d4e9831174104147cb09ecb22bc02aa12f5f38d0b5f26f0053046901c43f244c279943ba89b11e1f1c79b935d56d06f6bef29bb9aceaebb31884f5044cf3a013a91e663af156b02a26eb6f83c8cfabb0ba9646523a610d6fc98009973a394195fe11da460de87f866fe5573402d801d4f263ff9965a7280e28bbac1fb3a91532b116666f1014580a361bcd554368c3ca907f8255487d14c049ee329f36d1c965f0fb871c65390ce44bb2842a5678922df7aadef656b933226b0e5f49f1a87934e662483344f5b90192273be59a78d50521104002e0bb4d70665d566e48f7448cc15fea67bc89905dd64d560c9edc3772d7fd0fe79f04e1e16e153b4c198788d4958a48c5bf6907e77553abddebc4d936111042d296b4a8cc2094514829e441437056cd6627d8e24d3402595c750e0d6bdaccf61142b9eb40d792fc1263427c75c4804ff7a085386eb563553020d5a2d91f2b938c451d0e1e46a5e477f6fdf6230c4eafbddeb1e129692601de45a6c59a2902133e5f6a230745579e1ee33275b7949954beb877d6213b8f9e936bb6029697b62096eca3b90903a67767f7171721fad61db7398a629fc90e9e847224950390feb0d01424edb4a4e35b638e838aa595cb525d25225e5b021ec60f55019655ea536c72983be55d13bd4e96587c7ed40f3b4f505f0768d27f3233e3826a779b6da96ea128905ab30ae2dd9a9274f0d2b6d99e1d25bba5b08dce4414451e17b3fa4c6859ba8c4afc647dbedc69b6fc8b76d45f0224eba4fd5c40dba0b542bf719df330757f504b21a1aad7f1d401e2a5f83d2c6d2def10155855e5956be4409a483234b7c34f32756ffc36f090c50992fe760a384fe8b8b759e16c0e65b8ce2469aad7cc75aa3126b186eb7be7f494dac0d612e66872435f5ae50ab6971f21e6e8e22a4029135a61b7984c9f5f7c4e18a0410c3badf31e95fac7cfa3d154312c3a4682813c11462febbe9dab5402b434a4f05e49f052ff85a0d4f45bb7192106f45466f5b20c3c70847587331ac70b6d0f4bb56230fa6e66c50038cfb4624fac635162f6fb87cc1cec3726c00722b670a1efea68938df478446285c70505ffceb73aa508ecd914b96c4918556a269d38f495a8251b2b0be5adb91bfec46f849b060967363139e2d45f127b22b0f8439cea55ae51766bb3b92cfca3f4180bc8a1ef7f548bd86c4cc348b8544cb3db6ee5cffaf1929356d9288cb80407e847082711ea1d233184ae64a78a6a46ae59a4510ca760ab19d7d4e0ca3059ec005c0e864e5589b654150b015d2d314b519eafcc0b80c768df4e54836a95ea3ba878b035b0a05ac8826c5306e3659bd8126f5a261dae5b3851472b3cb8e118dab83603a556232584de2ab5d5cfac6d967120e469e0a249c2a84e7c2aa22391db067a3a275dc2a092b81d30f0fdcbc34faaf08bda5adca3346ec6454a80d366e899c2f7cadb8f4033ef6801f4ce7505fb9f5e9297932d4b73ff34b69074d344473edea2d1c4925f5c2b53c8436839466313c99b431c4a191275219dcca464842fd4a8352f4bc28ca6816e5564428a218d1396eb5f4fb77fd978bb38af36fb6e95a205e34cd60cfdc31d8d3139427e3707d7c278e09dc9b8a779e465269b1a008776d0858f259f86cb188578370b958c4bb8b76a169daeffc32533e6dd1c2de30d379e0bfb66a448b0f3060859cf1e061ee028af35bf19db4166d67846564c600ee1b32ed8ce2f2804d5646aad46f6f8777af521c4dd6a0bb77abcdb88c74ed3e9aa987517d220108b1a922ebe9bdd0598967c5d22003d678dfb92172a40a02c641e9346e75e2312cd96e7ac7691062d74ed5b2011007f14b9d6efae4e95b3ac039efac873f07191ce29a3a77aac664ae8246c66268b102f78c60330563d7a56c026214a8af6f2dab6207bcfa4f7edba740107d51fc2eb52afa264c2ddfe1827d1a1d7748cb4445b2f45b4bf953239bf7e60864399f74f5d24c1561c1176b8b564bfe086fe44fe158da0ec3a66ebcda0345bf73b5dc84a4698bc1c3b5bf5181f49cf3c818972d1d5b58802a4b7314b83be9d99ec89bb4015c386d96e87e99b3ced7eee25b9a7a22986e0843d77aef9caca912b5d0c88f55061380ea1529cdf84a222eff2e5864596c8cd9124646384f0cff8ce257aa2eee2dea3c3845c968e7b1c794963ab7e0908141a0d262886a99bb5fb9cc2ecd67c5574ffb4e7cef3e257c8aacc503f343ca9f02380b6e2726d982d1591818417dfa0ecca45fde0ed31a94b84e858415e52e22f5b9766a6daa8ec656da88c25c5c79700a6b9a107647fbfc45bd95232a2bdf60db1fb6bdf309bdb0ccccad1f11efb5dc1711d7cc3edc0caf0ca1909cc8283cf2a0042aec2a386cf7460c95d20944ab34213b702d777f31df7d266c3b12e63de1627802154a13eca949db37729d8d5ea9638b3e2706bcfdc5f20f2f822940ccc657083040464a9f93aba30924406880913b6f50cc7c28ca331d8d1d02f0e1def8a485517c0419fc11c39e23914fad2699e57923472d7145fd0f06afc16b379d8bb8a69cd0273254d470cf70030ce3fa02f1baa7213f2c34953515ac2e0ec98348f36fca03d91e8697cfd74614cfccd74c7e4798cb3d28bfc961136e2ac71ea2aebacb81bbb0829a0c07f672be14b67c03d8d9f31f0e2f079bc71de86b8b96a0d04e057fda6d35a7bdb49db820fd89817a7a9a28a5521eaa2d59858b96cb65a380b589ad04836f715661cd76a7eb5fa6c9f6d0a2d59634a960fc11538d24812af0cd6afc0d4b093f1801b6d001c24ce443e21590c524d303000805b45bdbb0e03447da1360ac21ad213a6027bc06c3e10587b4e26967b33564b96b530a58e6a5a8051ca179fbb5547e2e57a0d43287cd018565b6b75ee05ae07b8016948de2c4ca919a920991e025149b093a8c2fdc9ff78c7cc9406c25da988d7193b2bbe45cd379fed3a6ca7c322b05e4bbe017f1f2fdd3b2dff9d641e99a3d566d6134550196467e4326a20f8d1b090b8009c3633d80e776b2179d52854d461e1a8929d1e5096dc8743cdd1cfe7ca31ae14ad046ca127e58a3097e81c1dc164bf8e17d4829cd8de665a551a0b1de6c4d5e094ea71ee568863068de987841de2327e4b70d7b87d846fc1e05d1939bca72c93146344659f71332aa2166e1ff3417077cb28429b10d1c22da1a2ffe7c673ce6ce8fa1e66f22b1e28fbe63a915a507b095a8aab9bd16244cd369d39451dbb5db4145a583f48c2d2a7365424c4e77ad4999163905a029b4ae74f9a8720f310a7d4012a44aec6af7f92c71f53f5e9a9d92bb8329157068338468af607b2e87c5e3a455459dc62ecd7a00fc3a18cfc04b5e46c352bd863720b26a9369ca080274574e2766041555b8cc21515907e700c78a89e0f619a757e999b034773ba04951e3f7b70ddb668d91c8c0698815e16abb03d03ca9813aabf069f6ea2a1583eb4ef5288d43257e704ae86f80404db7822f605e894c5997382d6adf78ad1d86fec29589e76e887142ca7caf53df09fd1390b84365b0ba89bebaa1aca0fc5510538954961b137296bcfa152db73535223a74a4ebbf9d25eb30c726e450229ec2bf5a7d06026856c6281c0a62e534a486ea8f80fd2ccf5356a8e50f54fd2677db304d5220fbfcd29548d41b91a9971e84594ee5bef6577bec7127915eb0d24ac0c82b0d207e565d5b130d4bf2f1b50230b381934c79ef5cea9f8ec62c7344b17c91b3fbbf0f85753f70ebdd44d7629623304549ba870cb87bac1b9343d114855e38c4d9ada3d145541990aeb857eab77e2f70e400ff1a8bb12a429b3647749339e20a044d26bd685974d10be43e38266dc96e9c543670040e9443eda9b180d4a8a7d95f7d05ead92a4ac3d23723de7658e57e3d5693a945dac2d5962852c65fe9eb597ea9b06b3395f5d1132bc756c03a1b5da16d1e87705053bd9ce85a9d73412ee9aab365298c5cc7b0dc456282424934ed9746e084c088c62ce9467c5b0b06338b6dd9215b763372b481fafbabba955234d57fb24d9e93bd9e06afca8855a6b057f998b3e58f3d5902dd95cca4b81591a7bd3c8ce56b2915d27dcd51679cf75d43925efb841a040bf357f0d0cc86abcafe2456937483f7d5b58ddd0dac538fa3fe2342ae65669f760a288f9f523bbfd1e24dbc76b196aa82164a287a63a2970b881454a346aaa0dec14f963cc01bf266e801828d44584e73d3b94320fcaa79691c947539aca8a24bf6d9c9c693876e5f9cf7cc807051bb4d4c21b53bd5da722bf7f58a36b964d03786e4f165e04faf96b68a74e0f09a628f297cd9c348275c32d1dfe014aedbd76714faef4d670835d13d71bc14a868a5249d5c94c8f9a698afdca73b3a0b8808c4ed165f9a5552a9774963112457136bc5be16f2c70510dacccbe8a8dae3b917518f6af4a772d573e18b947a8af60a601823eb85ca0d83d429d7ef7cd186b6f555203a9729c067e422178ac293c12158962c6c03842f021ac12960562090d1930e50943f6b202ede345de177ed4ed3b36f485cc931ca5eb7bb0efe1be5bfa857a41381c089f7c31ab085328e55aaff6455cd76bdf74cec0ad2a706c47222ff2aaa7de08e034f88fdb6c9265b4a29a59452060f064f05e8056fe9929f4ff23cb951a8526506cdb77ea32d50a8e2350d30dfd61da62ebc4e6eb2a432f6d8715dc1376b49e5eba796c7d66bcfadaed88e55d08d22ac42d349a0c736271980c342bbea6cad5334dfac3fef37eb37fdeb60db21ea53fca9befb767e4c807dfa1011ccc62113037aede8fa0875db05e091c8f49f3a6680e9c8fa10127c18e2c310128c48301f307d82286c1c8eeed8b4b3761405c2911d7958a2322a53b59487274e4960c4a06f735d8ad7a4d2086b243e3b0ce86bff94e8db98f08baaa331e85f578200d37ba309f37712d276eb49d5f1f873c276eb2e36055d40a03abee3766fbe0c76bbddf62bc6a027d0d7fee3f9f5f99e6f9f3fde68c2f6ebb5ea288c18291ee79194c18cbf30e6d66ef7495777dd5eaf1e23e98e3f4a736b0783578192086b6b558cf17d0d773a9fafa3752c924915063d12104186e973249201a62318d62740ffdb19323d86b5adb5adddee2b1d79b0c9a0153fcd39270913ac3e4511767392f0ed38518281528abf5efdc784f9b583bd734ad5ed18e38e247debdfce6ece4942f50e6e9500d46f55013c6ab09b9384e954ed2f65e1ef18c3c4d7516b521b7c2c4c9f63d57427a4d2d26eb77bd2a25d8f419fc4fea3a4a9ff589faf02d3579faf441f8fa41d2140abbd38574defaedbbba1edbb51706e551d7a77ea2675e10d476ce709c9b945e2276047d269cfdcc20ea356af7834c13a75183a9f9f801d61d09fec30ee6e97f4934713b05787f143fdb6dbed7e97f809e01146dded766fc71feab8dd6ef7e16eb7fb3a9223d8ed76afa34ffed011c9d365afab4f479d12fd3b924c33fec77a0c134f3da9baf730ee6eb75b7bdd8f1d91ee6e8e2aa04e794cb79a3e7d822e9474da6eb77b3a6a65ea79a14a7053880b7bc2f0525532bc33be513c69664aa03ca7f9d9c0565a6b6dc38dbe23377e7829a648c1a1e6879427301a3b8ae8e0338315192bb12d3562778ee7799e1785a40a4d1db4a2744520ea4bc8961874e4889385871a58a21c3132b342738351394dd92f1b5821f6c2b2318354a13903121c7632c49adb9c1ee004e3032d8d0b61d6c4a0e5c0522bd346cc6c5d34ba72be72846c25192a6709c207f69ef09495f6d219e79c73c6b203c9e76c85735416d09c78a05f727659da861cb6160491fa9a210c980db46e121b1ee440eed54a6b1cd3ca87d5102bac2dc46bba57ceb060396d3569af1abb26298a95f31496016d870796730e2ffbb53515f62009db4c59e51ea2c072ce5987a5b185c5c985fc14e2c29e708642e4d01e58df7703dfd05c36ec9448648e95225934cc98c1e2a4c79490106c8cf1d8820108a719dcbc91e2c3cd072288e3a508950f1fd28cdca0851b865c2a62419a3cc881dca93cc881bccae9172cb2b04748539c1c3abc6e13d61286858700a283e389d5cd063872ce19890ecfcb996a4e7d4d894d8d4d954d9d4da5e170ca0ab03a6269c8c25b6bad776455a1b9c585e5c50eb01c84f7de7bef1d984ae692cab173e50712ec39799003b9df9cd6749855c656396e6c9db5d65aeb2f3055689299e10c7ca179d72d87f94e799ee7a1d1aa42334ad797d818129ab29c6f50ac0de5fb0a2cecd13da692d868c0f2c2ce9a929c73b6a17b6435e51db308980f6b15e2c29e30d4509e3170669f51f3a4425cd813864fb58a191f39e79c438be79c330e1daad0d48ae2bdc0d1e520543583f2eaaaf185c52c3b612a32990a4f210085302d64de10b1b1a6254d142968b059ce535e235a588295c52a889919179048299b52662fa4d0bc6c28d953daa3d20526c4ca856bb5ad9688588098f51045446dcdeac992303435ed2b2aecb1c156b69293af88e11757c6c23651c07ec0e94aeb41447b29e1f182f274b5d65aefc0aad004436676811d5a0ec218638cb1a8d010c5a13144091324374c512f4faed8b8e0799e6725aa0a4d1d3e866029c9ca19b0b2b51583b132ca0e0d8d0894a3acaf7cc656b87a54b3a979430e0f7220c7e15b67adb5d63e7455a1f9855ff820860b71614f185a5d1e39e73cc40acd9d33946faf365f61cf5c43c32c076160a69cb9b141a8a992b3508554716ab86b1ae7d9b5eb8aead2f1f365ea862e555e806839d124376429bb6d74641bb6daf03ccff3920ca942134b49d6169705926091e2f9408b0c8e140e4da684d1209f3d0ce41d75f5ef08f28497f0eff2b8bf8bb3847ff4e6e23cba5f0924eb493dbe9d82483dbe470bbe5081e98d88befd13fd8ea4ad033109e7b89194f1382fe15714a3fc48bc263cca8f4437218e4b23584186fbac215c17dde623d82b562775fc7a093149c9fe2091257cc745d1667331898fff884a1d8ce4895157bfc7af9b709b97487ee867a965f7624fdfc7c7250fdcdd472499dec74571e90317dd821d9081c293f8b8530a177d042b8a4f7ee45e41f71e9164fa1eff7c4423a2bbb8820c0f5c1c771eb8e8e2e89404b799dec5a524db93e0760a1fbf8e134d8ce4f5126f93d1236adf587cf2230fc62437e711939464bc55a2494936075d474c02475dd55510c484369f7f9de66c5e08a4aede4692c9366d22dee24cb28ee9cbc84cb8aad3e6b3bba7064d1ffa219c4fde7e7efed56fd4d5cf9f4f1029467decd99132fe3ce72ae2cff3a8ab3bfee9781ec9251df1c98f76becc32bd9e5d0b923ff1b3fcd2f2dffc6c37193b62f6273f5a41860374c61de83ba3d3ac21507ff2a31d9f479febaaf6efbbe988f3288b641593643d2e25a5907dfb1e5d909d8e3094ac2efca414b26bd7a30bb2ef11468cf0a92e7c3a82a54bffadade9eacf1a34f7d6596bd1a2e0a6aec1f036ab8a15412b705668c807ea4655450e22fa6e5a67d7d1c93fd6ab1d9a12e2b04854837c070d4109f5a894e2b5ef3197dd8eb80d4d09adcd37ef8f7e2ac8a3cd75f5ef6d86b7f91fcfed5655648cb348a9125dfbc93e9f29b7b5bbd8a31e993e8be4d267d72299fdf6e59b8bebd86d48b7ce4db36f6dc2fc3cdee8cf1984abcfb086b5d65a6b69a5420ce5a0eabed65df53beae8db71522f59ca1e849f6596acf7448d5d5749ecd5f55d7a6facd61393741583fe2dd9e6f644281156f0a044b0ad306b089e7b62f5db6f9deff883649dcaa84cbbd6b16fd4d5ab49fa4e3576edd397e8d2d31208aea75e7dfbd6d37c5bd259cf2fd0e9acdb3c46f53ccae0698ceab6915cca696f73bc455db535ebea6b9cd3da27282655a78e41a48ce9d674c4baaac017d709d66cc23c81aedda7a01e93aae7d18278d7a01f3cce5183f926d0f4eb79c612b02f62d4c7a3b52246ca4bd8b5679164fa3c7f89f41c8fba6ab361512242e8ddee0f21f6bb2f98cb9ec5189e5f18d975da2df644a5f95a544af176d4d5af172ca12255c7e30573d9b32761d7d5cfe3985d571ffb1ec9ea7be9eb579c382425ac0ebea83d385bebf883547dfcc17e6fd97707209ce59b45cf27b8f1c6f72798a95ff10af200f8595ea97aadb7f92dbd90bcf5ebdfce0ffd10da2add493afbd775f5c9eda0ef7182255ca4ebb691b479f5adab6ff36f484a9874c78b048a4950d8595b5b5bc339bb4dc4f7e623ec55242fb9f4365b92aeeaea83180841ffaa67723bde23597fbb57a3fc0824ef7f1ee547d701e0b8346b08365f9a3584ea37af3e82ad22769b98dd139564bc9d3f95c4a9777cd30066429bd5818b5e502e2d67470146418e0b6fd43eb2d38d58bfe3dd7fefbd3731d6628c2fa698e28bf1a423a65c18638c31c634bfd9b1d65a6b6dc5855f3dc6feea2754b7e35093903ecf4f33326d8ad0a8b1153c61da396647d2da91720de120fc7e9657a27e3a53a5b71cbe09e4d488d953aeb20a98a75c4fd1beb4a2e4c96dc5aca472f6d689e8eeff05e5fae9942ad13525a0a74e9d9e5ed15987b2c2595ad1a4a6547ebaf59b751c96b78ec2ab8a59768179eb406fb73c9559a4442d28012ae5afd73bd67a6bf5112a9d32595c914e9945601d95f653b7930575ccc23781b8688b4a43389d1a992c54a04e4f8dcca2e92c54a05366d1747a5576ed9e725d3de59a2c5498b3684af93b2a5d9172cda239d4249ccfc34565b2983f47af348474050a55b24c21aa02852a5c66d07cb2443f4b32459e0ca7e0286e4d787f966488fc0b7808cdfd2213e47159645ad0f2659f40b4524b2bad14db4aebc5bbde6a2badd4d24a2bfd284833ddd4a3975e5ae9a596567aa9a5955a5a69a5d8565a2fdef5aee096c5695500e66c0ac0dc5cc19caf259c787bcbb9bd53800230972911270073db04604e8f71a19edb24a802fded2498b3360198f35a94a08e718d4004604ed7b1253c2200735e084ebc70020463521f70d3e38131617a3ae0c5c381314e466c80c4cf72cc11129ea701132898f8598eb132918131347830b07381bdd366a72ab7b0402de1a54405c05c1633a5870245ec1056e5cd981a54da1ccd29b4ab5e7c5759c504ae18279f04c05cae62b04a44404c90db096272801e04c09cb63c7378906e6b6e1e3601cc691f311f17602ed7305478aa4ac881396db5741e400298cb340c92f0280c91efc3f4b079de083a57228491d2a9724003be2b068039af0518c209ab588039afc502324f199e2a05b0b02bb6f7c5236d2ac09ca76d08604e7bde170f84045c30595870002330a72f98ad112c30402d401198cb3e477c88866e7845000d064810cf95e709008c140fa90390d33784131e01c008e6740827bc126d0827243da7c9f4785ed61f8039ed0198cb148c44f103e6b415a2cab6b967f34e8039af0af1e46301e8f916e96b1325c09cae42e0f020096a16b807869e9e1c2484d8f1d8353b79841d03c32f60b71d9d9fe5172a3a399d45ca93c57305f2fc2cbf64f1dc2e7804ac9a5305b6d9b6ed67f98588cdfba263c4fe3263a785ae56cd56a9c837a3e52b15f866b47c47941961c190a0ae6739fc4892033956a094399a5368d35ba5955a5a6da5957e14a4996eead14b2fadf4524b2bbdb4e8467b80436442ec57af303ac28e9b2cf06ba2a220be7a5151d50f2222fdb3f4d2f57a0f81391d6a855a679de990171bb6b641606e5b2f572ee8bda900c0dca640800ca06616f20bdad620fbd9f8de3aad12a2ebd7165e6ab8c06f9de2aa21604ed32d04e6b4cf522c2dbff53a03055dd41643d54bf3be14b616f583efbbddbecf368bf22cca0e7af0ad9847da5180df9a2fff5c151de4b107abe63ec102b7efd58fbdb5ceb3487b9e45791669c7b328cfa2ec9e0952bf76b7534509d0451e730394313f67d0fde1d303e6b405261b1cb85c59d2a6c6d8d9d19c42db00604eff6774805b058180b9ed731655d0057d17d6d6eab9972fb5950073b69c776f60b75b09f8a9d7122d7c6ac8155ef580b94d02cce9902be41971afc29cb61f0f5fd501c19caea012f08ade28a8048401cccda2ecf7bb4734053df75e679db5cf599447bbb5beaab3287b9d457a1665a7b328fb9c457ab4d9abb61f90efa330dcc03c6e16dd3cfecf52ccc757c73f4bb12a1a0474819f7a16e70b600e8435e1ed672906f533df9eba531f6bbe17d605eda12092756c2faeb859441d378ba6634ad388cd781223e769ff2cc3da8461664d62c29cc48499691213d6252c882c61c2a4a6be84b130f5258c888d2f6147a4bedc301e5e07a91b0bb69f651891c79561476a7801ea92c5a52bec8bd70416c407e6a50bd7ee82a509acece2e6757e965dca3ce946f889cb962d624358b0167bbc25eda98aa5a23df8597249c24506babf608489ddb834e9b02a3a5c747e965c5830c285446e7b5c452969e28252a48b930b45ea7a9003b933c1ee41976aa77af47ba9950b632ebca1f1264d7339a27180727707b23f4b2e3c9e74231c85b9e8a0c1858a06d63f4b2e505a3603669415fba8dc5256966a4358f0254be811e40895314ca444d16052394790148c703831c61ed2788c4bb0a7c74d47f88e55762ec1d6bcf7b30423b36686accc6d8354e0b2f9da7bed9b28cbc6a986383acb9e565c7aefed962599bf77a82b9ca11df3cecfb22cdff6b32cbb7096212a5f52004291b5660c884a0a463e346839928291d84d6bbf9e97b35d6d133ded83745d7b76d6a09bf6fc529c8fe3dcc7e636dbbdf4ba09b789267c489be3fc2ee96a7d1f138e73138e53e1a3a5ebe95f2d5baec7b7b82392f7775c4724975ec74391a42a489453412848823ce15e0e020c10609ff6db7bb494bdcd7b2ee882e9716e13afcf6bc9d0b7dbdc8adfc5b93b6e0cd96755412fd5d9b75e7dee7105ed19037a9c56c80a51eab75e2919ec2d3390d82d631f080a7806ec50ef06fa8e488fbe0956a082db77443aadd075901e55318b7e459be79b45ed37f18a3de3d4592c5b763e2470bf7c73c6b85c732ac0569a53bbd3715352ae613d39c5f0b55bc7dbbf4058fdbb4048ddfaa66ef6d55c830098945d19fb414a199b1c46787864d4a2e6b8409416465504d60f31305c3655a9e6e3ef258a23809fa5da1335264ee4c08173f3195182e7629c091d520f4ee40e7676b5811fa4f8f974ac93f0504c5b7b6830a76a3787aac6d69c1d95cba91116e1b4d3ce9aae579a9a1a358d0cca2b2dcceb428b2a02088e0808341f3888aecc1e7eccc131258e952c376c1c695d706940e0f8a8d1dc1ac104fc00132210e44035688407a469a5657d0e923c693425f4668892064395b42a1fa8421ca449ed90e694b5c624ce12375c663a1041c31054c2d42096c3161c80e8c1ca13ae1bf8a0c4890d9868e98065c30d34fc10e222368478089220497c34b1dad2c1c3d4912828729ca4c8d975a53d6944e4240edacf6aadb571cede5a3b9f9c5b2b6e1dbd1de28c11051152a15cf587195fa3ccf8ea1fbe5dbf275010c484d6ad6b3047b30e9b3c59648c9da4d41bafabc0f4d7317d4ae10c29e3383db9b3d0b6beda6aadcef4aa6489b2d8fc6d60cedb1ef69c8e6412f6ebf9d314c479dcb388fabcde2c7a018b152b40568cea0aac2535d850264c0d607b6ac43d6dbd600398dd0b6bcedce00104b5e3e7aa488d16d09c9419b3c58685001421bcdcdc20062e3548dd70e81143181c9c68b88216150000881b6ac7d5e981c90e438c64e192b59f7a44e07186eccc17133332ec1aba0612235fa4685185d94e24ce3491e18c5a94263a84d84d3ce8931f3eb2667003856ac8a6915d20a64717acb118ca7cd93376806ca95135264a8d72ef78ec10e04401b91a0325e4c99a138979099b51840d5f566a1e600992034c4790afb1393c3e48116707355b7478128395b41461b45a984104d85a0c7276a000f2c4860f1d48ba1479128707cfd65690355a3b9098ed008747070d086288ac356072680305ad040a2e4dc2d8a80147899c227cde802468c264cc4a0e6590b81971f6a19064ca922142e03809d2c684561a1498304b98e4c06687b766876d6681c34406316084f8f2658699587821082a24438ad090a5e644106b80f08222c30d333748c3234cd3c30b674d5ac072068d0e9117998eb4af1b67dea8e932a22b4195cbd75a271065b26d88737c31c645583dbe3d38b28a7111548f2fc618bbc9222a52c4eebe41b3d68d9bc73f4b37664f863e2767a218c29c513833f33c22ced0c0d24d0d1c4432e833448c8800c10043d566ce72d04424c428c4b90715a0c9bd2900110539d33ad3218a5e7b56c313d190eb40672c9cdd78d28d6adc13fe555ab3ac01332b239a5aa39bf4106bc8f29a34529b524aa9d2b54e73e02caa3e8baa4fb1cdee6910ce928dd9d7323f59cc59e267c926cbe38a588326c566061b29363b9ed8f48022b2c126091b18b2d7b7066dc6962ad9ecd03f4b363d2e9ee19b75d61e280be41ac1b71cbe9f659b27f98631c6e2cc5d2bb6016b436593f859b621a36de46c9d1fa4fdd6ebdb919cc1dfa68fa8ca66d1c5b4379e9f659a1920ee6799a64a47fc59a639b293a6eb71651a227c843f4b35509ee7d93e355b267e966ab04010d4d9517306809fa51a2c5fcf8d8afeb334737adc8d8a297e966633f4dc48902041a2c7a73413c34d16277e96663e3cce6ff3fbdebe1d4915be7a6abe59777e6e21b3f138141f02ba6e10451901114519a1f1a25243d3c44a0d8d112b35ff59a2817af0675916a70c08b5322a6a6550d4ca70a05686835a190d6a65576a287e966536ca769ad2595429d2dded763b8cabcd741a00dfb7f43f7cbb31ea67a46b2bb53adaf588ddd65a9f1819ed8c88661035116146040d22a7b5126564b839738ce600cda13866bec8ccc0b9beefbdf7cd073fcb3354fefe2ccffcc0e5242fc1676a88ba6ece5c455937e31918a2dc9c6921cacd191e4e6e7269268d99312b381c1aae88331ceeececccec86eb41650ee4d8882dc847960324ab01e776ef55632b23d3579aeebd60ca64b995f172a30c9781722b73a5ac24f3fafcb3249bf2a41b8140d839555427edb573ce592b8cfabafab5c5bdf5ad935557bf7eb55043656988208208a3216ae08166082238d00c71e3bf9fe5103b3321ca6895917143e68ccc1632568e944132c496d9c5f7de2f7fc9b4fede92cc87bf40d59691d1e17702949ba8c4eb9a2a6a1022c50810000000c3170000200c0608244194244110835cf8011400095a924e543228a10444a130140c8581280a621808821004621004a3108603599e4379006f08f625a52f948835d9a91cf4e87e805b4d6f4df601d52d4ec33bcf3d2d3cb2ef4fa9b91f13e453a7286cfd7e8fdac537da566343a7491b1cc373e4b609d88932d64caf92684f9c1034e1d0a249b244afb01cd0faaf5e890543d89466a24a107bf452882f2f7655c21e63184f5a1211b5b7854fde71975188f7dfe82e7626de93b73ab7205a3e88db850b9ed2700fe052e8227d43892d0f9e0a890df5a8292dfcdd9c319a368becad0b221fe3d33c420a543c767b20ddfe5c764e092255a42feed35312f4bf3144d892cb770951a74d32648585e0da50e8ab43760ca2e7ce409b4da4706f4b8b06731862c939f45b5a5aa71b3e8867c6f5ac641db00cd6ce4e1b222e12dfebf302f45ee3e2d9ac0cc6ad6d7d4ab823b4b06a5fdef9ad22c8adee66d72d36d8ad786c782661414b245898c148db51440d011450f010ee8398131faff942ec5208f7e5ef2d1ccc21a262a20cb37a500841a3031097ad9f31483a2882124a7d18101198160045036a53e505710e7a3168e594c5dd7f64d1398afcdb0fdc23f5ba786357702997c9c5ddcd6d5dcffdded81ddeca7bbaf9bbbd6df7bfdf1bbb83b7724f377f376eeb7ef77b63eef0566e626a3f0e16c337fbaf1ffa39f18cee60f6c5246bbd2b22f01f85bfecebee5079eafebd571fff9aad298321a14848d670ec65890022d8cf7d4f62be8c0b3618661945fbb2a405c71d2c938fe25d95ba286e9d4f2331374906c68f5be2daa789e8528d054e053941107c14d5c678e05c3ead5a18ec07b3ec040230766313faa8069b20c3fa51d5e9eb27931cdba7796860e2f58cbbe8ecf560470f7310e3cdeb508a3d87de9a87aeca0e102834ab3e11b9296e0a3a9b298010e095f65f4ba53c2c2cf8600b69d2458dc159b07a96aba364a935308e1d0268d2e6f9bf189eb43cb4d61926a1c0073c3823cb6b7d376abd199cb3532de9876240c4c7401d9f8193c9b93ddd927f3807637c0cb07eb8e2639ddfd99c5bd22df986b29663626a20a30ec9ce7826e278953010f7f2300f5556f619473fcf97638470f9d64532c1b2e142876991e660667e5105037cfacab5670b835c418e009bd1fea3aadbc60b0118995b0b90fcd06d804e1eaa2005c4baa5e0ec0a7ea697e289f063f44252ae61e92d5069a44c3f3c0f2c192f8fa8edb0c10b20be72a73b5ef8c765af2c9941fc0a8db7d2d321d8214fe2c548ba653ec3cf7c25dba3ce1155eb54748f790bec9e87d2d11f41e83414c1a35d1a17c99e47ac3bac0a1b3757a0258a3aad9b1f0551b16ddf8498b0eb2715daee53d45e4772fb3dd9fee4368de2ea00fd45bf955bd2b4dca24bbd71975b113df686187fad43635358bf0fe976cb36f3cf86a3de28fc03cc35f141da38c9e6450a1f4081578f3f04301d68b7d5a2800960bb15471668714417bdb2039d7b2d2789f11ef588a2381ec7f122d7eebb1c3157087cf1e884ef48f14b7a032a4e607fb04706330273e0dabb033e68fa6725ebf0962426a4d04df6f55eab0db04f1c406dfefe849aba0c61ea22ffb307c79d75940ece2f8cea004b9826b80a72533d1a795a3244c3fcfe326120233d650a87a3b4900d8ee18e7b59a8f7ad35e513acafcdf96cc1a5283cea440c46a326f85bc4d489b05d0de1db35b54b76e4b31bc76b159c3f7ff51e1660e9e326cfea4e88e5e376b2152df47b7386967e694e57f1775a680f416f8bb63f83ae6219b423a1f5739e91e0f645fb4b84a2fba1039459fea0e70a618044bd52f66be2a7c6b2e2f8b9adf6b2a3fe8a3f2f3a7ed93d59eb3fa9eb137a246f69f18415f05ff76397fecb955367a248a54519099e6bbd81a0b21fa5270b0b85ff6e7d993e6f75b7f67aabd8f9ed41485f237278ade530d445bff18c75b85ff7fc2f9de27be68f78e665fae71601be0dccdb7ee91117f18fc46ee142690239f18177ad42eb53847210a930bff3a0d56d72547cd9fc03a30dbfb49dabf82fc7bed842ea0f92e9d0f90d41b320c2e329d4690cf682e8ae47866d63c0c00bcb07237ebe1a216ed20cd2e9570d3efa86ff968e2f962fa923e2b15671157ab70c8fdbaf07bb229e33c2d132922d035f529dfe292dfb8956c26c632bbc66fcb21e435e7409d3d27da04ed2aa043ab300a267fedcf7a96ee874bdf6ab1125ef22a33c8a36cdfaee5bc0305c94604e52f2a4da592a6a59c1f4ca2c583f0c87459c07c344b4a48de1dcfd77d0f08c464f42ae4e62002637cf83a0eccf104d644ec545c9582047d19b027738d00f2ed5510b93c27be604146f3d95e207f8dca8eed6cee43786779a57831fd86de207a99c683182ee11bb6e1acff97e521abdf913497f063ca2e616dddb6a2bfac013dc1a982ee576bf4565af01f4cefe7412c19ad9dd912fe737913110040c4de2d85ab80db42ccab34779d582a09e8522a70104c8d88d12751c020224d481dc7651f0bec65e745638835c539c06a90165d6def00526e1a641277fe3d17aad37c3229f345c2deee09107fd449ff066d17201a95e194cfcbed970359ecbd949f8a39a83fcebfc10b75d046603bbf8b83f6dade6e002116f63d82f71f9c3784abc1c3f2a252faeff43631d7818bfc486e057c117587713b4b5b11c6989e10ae4f565520ef49d5811721a5e2dc8033c90f31299b78b83721a3a39dff6dd94a441374635b66b3ca41fa23fc105447415c0e561e45bc2755ea714402b7e2e1bb4dd55a6866781b6dcf21d705221bc764621fdc95844111d660191010ae80eb3170c3a47aefae9de817d421010892f9af0af0086fe30884891fce2f9f14f4f8cea0edc00bc96bf4a3e32704131b6aba03055e1135c25687890a19cca4b8b63f20e7842048daa4534863b80e3d39a73c03d12f49e8f265262a256f36651730e8c4872ff782a1200097d92203e24e1156ff35937922443dfac89d4b6ec80164959c4373830417aaf5db1ad5df4b2561695b89b5dae157857c1f0b69635107800919e869959546152853edc074579282773d03043e8f9ae5d1e5f4163700e5441bb6fe4c9de9a663dd70d03e7b0915db4a6fa5c582c71db6b0a0948c4ab3b4bdf01d249a5cb5b38dec3da6f88c9e2186f95c3ad0425ffece3e04e380fcc166865285e67d20f4c6e4c4addf7c05fc1061f13841a2982ea494a8354d27827790d5589d111516ae393bd6087192577c8d57dc9969cb9825debdfdb12fe70b5134ea01b85b7f14ac0bdacc11adfefd5baa661de989898fc06e6592c00e29700e0b32ed9bde950fc166dda832ad7ba4331239a281e25a61337fd5feb61900e036470920aca9e2d67c2aad8cf4727f4e613dd3f02c7f802c19318df719d543fe6d3517ac181a6a347b4ebb2f9507367149ff3895d96740aedadbdbd2f44066c564a8036f731457f571b4c0fc706b476c29b772ab2aba1e8f62f9d43a716fc497b602f17cb4708555721f80ca5a46a001f17dde0fdb01c7b771e1f02d3cb73b833f601f8d5d108c43fc9479017dcf36f242a7c4ff8639b13585c9cff49e3d24fab2e47253d7f39cc9a57ad2546d5c53fc6f9516a2b14f1c31f832dee4196f1edc98d6402c949e3a1e7cee8bde2880bce3a582f209ff609c7f1e285ba2c60c6886b82d9b8558c6120451aeb7bc254adc7afa8ea87ac48a52f2b949173130f1eb32d208a10671872194d3cfd8d79fec66015f1ac3f384426c6396eb9eef3144e459c539b68e9fe79d8f0295c504e78d58a5e0377d513000b0d28dc92b67c765a906168544ce77bcdc3b5ccf06758c27c1641103c5b86f0f5483424d44cf614894a71e02801eb2fa757bbd5c0a661d40047c8752ad9087c3aa2e42ea5990d41a63efe3f40e15f44b2258e3adca0c7beb74b35873a70395eebb7b138ceef7e8c02f9e26536f1c4ee7234bf51034ce338f65c04fdc1c57f08f0a72a884b225e09833430f5d2565566edbf0f28f8d7a16097e31711f9859e7c9815c63f17e6f5e4c8b3ba1ffa74e64f602ce27fd408967b8d11264c8b0f283fbcaf3a4751981e45d2ede514808974f1599df6516e71ad2c8a0ede32a0350d1abdd6d238d537594124f384f6dc7bad8172ea026a376b5d4ce47b144f6b861249c80af9949c9807850ac769d6c7d57bb00960185c899fb79acd3dcd896756d5842fbd2937c437d3413d517f06d79df13d9d0a82a310577f76115cb7ce8f183a0488c29acfbb2270c5dbb873d63e651fc08a0a2ea50b9300430fa204f4d527c93bc13a78f8b181254304aec9919c15a1b27cf16e80fb954c301857b01e7f438effe7bd7d9f1d9b77dc9d3fe6ff58269d59e5df21f3bcf57f2cdbc4cc43bba61feaec9b6e5e360ecd3baec94f689ca7ff694bae5b1042127e91897e3842438bfb517b16cb48c9194b7d7785cd6354bc336d879323a2355751bf1d66eff21d7393752a040f2103d5635c1a8ae0c790ac8de30878b64ef22a5bbdc5fe652e9668de6c7744b258d21e2e7e9bcd199effd4858c2956fb182175e66c579809dc0b0abeac765d1b637818b6f4f32510c672220788b7a25b4e2bdd2e430f69d893881d4ca51d274e36514a3550436939f2a9c0bd90ec3c53fc63664a4c3038714a5ef0667cbf5b318b15ca28eca3c3c5cf206da3273f211cbf2e9f8dbf5bfc651ef5021145594a72cda05965ba0d5800692a8b220f104db55839af75c0ceaf16f4d499025f029762a8276271c3413a21ced80f784aed850c286ed166c69744c0bec04b0088202dd3f3cbe6a7ddab11bd9e4919eb08510d48d32638a3c97d01eccf7aff0d902d7935616a35392fd9ff1ff6c3d0b05bc362c63d466f0f087015abe01b838d07bb5ccda1a6c653a6d3d912098b8414c63a9bc263260a889259724a895f4623008181bee3bb060e97fb40e9a1c45f92876d28281e855352949800f2f41410638338aed668bff597401d05a4b7132d88b4494adea600b8e511fa8103bc62143fffc39ba50b69a32f1811fd4f05c3fb3f45e312e8aa374494acbdd5ebed202d3e5ad841e35568e081091c1ecca26a4fe73c74c644301117a3faf662b3dd8dd49055d05b1691958eef1a7cb3e95455d8712745743d274070b67654a0f242ba1e3c5b7d94333aeb1886256290e8b0383326fac8cf4d4f6855316046979c9c705c4f6d8f85dcae983952f8a5a37466220985a8db6c9c79c81308fb1603f8afa5f631d01bb6b1ed0910498fe369f44cfad48fa7338dbecfff4aacf5b4af05bb3ab2bd779c46c139175c39b00d03844580f37bbd0c3974170a42ff3a77781003b754ffcd2c21e82f7461f0522396e0d3592ed83ab75a7ddabd88ed66f08e5b48c6124963897a829c8792771e13b8ae9eb53f7d2d3b05188705678a5f4a432cb55a7674f5cf23d34994b377aea71cb9c5b570cdb2c60fd22103c79908875410eda70aa732f0b9f997feb18761c70c9362f0d8ba5294b580f534d3925f35b0e7d3d9a1250d7f05830894ef2e45d06db64355b1fe17b0a388429ad61e864c93b72a1ee94bb5c48c02941a578ef17a81c0c965375f333dce1d7af1b58a1899265dfd8d866268ed80ddb500f320475d38a06459d4879be976e8fda7f657846a8e822293dedb4e89a93c7a965e48e21b58df6d4f019480120112204db01082eadea8d3587279845f21e9fca1ff6ce0425adda94afe106f2b3089ef95e088eff329b3d69b1e68ae5c78836af78e2af38f7bf3cebbffc7ec138bb4cba69fb5fc3354438a394d721b5b2bb9218d98409ca79adeb7a8ad271abdc95e036a34de06410d5187e480ef7719a17902fdcc970e27903b58d10171efdb31067d98f72605021ca9ba6fe8316d59588e410edc4e21a5fd58687113823b94f49b6f8e67d06391640dde45ece52890794aeef96927d9c6f826c584b880d8b25c0702b888558a8896dbad6135035c70c2826bdce0f8aaee34beba7df23a229628c9487c9b814fbb34384bc14e0f9d1a8b25519c376017ea0522201a9002ec2f0ba8b1d98903c7ce8387106e0485fc0bf9a25dc0c3028ee35e65d53e7a0348892393e599761292b3b4589d231998ce01d7d70813711dd4e8543bdd9c631aa84d51462dd4c85dece81a6baf4791c0f0c74fd7673827b6e8068f4313b96f4006b7061fbd7e7bba679b3c6cf1a3984d9d318b2faeadc4db92dbda621a0f8fec3b8887fb4332ab5dc64aac7d0e9521cd3a3370c6867b3cc5846a21a1649a76734af2ba22a2852ce15b0ab53b6022d3f6f5c2c5d52f6d20299302e737ab6aa4f788b785c19fdf6284ab9bdec3d55ca22c9039e83a809b2cae9ca098013dbf489fc3b7e8a3fd68ad92a2a47ba26e478d49f9c55c0427a9e2bc970e8c80465b30ae794be41c338289ab6102a4d108059e03500fc88a65b5307f4efff528134fc3bf3ed0b3f6dda14faa9a5218e194d6d2beeef229795c8534313b9be8a29e56f3d0363cef8814a31a13b873615f56cc4c4ca0cca8013ea56a1632e52de396aa9dab565b15538221aeabdd3094e22f9554fb6d84e3e2d39fbefd30adc835b8d0b9b7b96ac0ae194b4e2612a466f1078bcc59e50bf17330882382284735daf404e55a5e710cb2f92e8e21269efacbfc9171798ed1a39ad5bc23a59613ede5be283750d64b3eb62cc2b49e8201a62a2a3f255668d4f75585913144c832becdccf64a1dba7494d94716e6f695e73185f0529457e7c967493cfa6fb365c50df115c33aef0eee52c07ffe50384a208a9662347cce083e28c48bd4ba36a9f185f4ef91a3bd85fbf97b6e1c96b10f9f59ce03468035899bd61f9753503a4d74105935ea8c2cbd206ddb97d5a1fc1f4d4558041f427a0c8219aef47a1e05109dceb79e3eccf4090d4520f599ed31346247c5aee8e09fcfdf8b4d84cbce98bf32def5a5c2c455c672ce30c1f31f2d3fdc21e5be3bd85555052d991f125e4509826ab9ff190ed51c7b959d636456f20111a569fa29075d44c58df552227a5bc2815abbca36f535b5ef380d14ac95826688542774e5b7bdd7f8675e6a0e4e9ba85368164a4f508023811c835df08c85fdf908c4f5f5c099ea6225c7a1380914a33c65c5287e392993afc3eab4a91baf82c4947ce631d09648998f534f2d2780d4f4e8b2464cdabdc7a5ad5995735a44b080ab6b82ddab0f4f36466665929a9ff34565ff06159becd0f696d7ac246c750e36d7a6f7854b9df58ca295dad97a2066af1ca4c706b341b8cd5d90c5c5dd3f85042707b66e47405c19ec9a37a7e9fce015207a761c932f11cc6aad441341f29dd6b6833d490d4c6437cd36947fabf40cf55ca5888498d774033adab5d92e766807896948cb1dd4029d3278370a24e8e28c8884117195254238d531f6ddf04d634f8239745707938c581eb95658582266563928be82482a1f22c86c4994a14c3c12a01d70d827703e090b0caabe13f34cee6e1bf6ce3747ed3835589e7b1a0e4d0207e3bf03baee1a4f88b1cd9b9f229ba0f47be70e85258a6759d36da31e27c1f017480295217f2a5f6af7b026246696c99a7f8bf49122ceaed3c258514ee00fba085f6a2bee10d69f2574c27be352b5389b1f7e1232c055d8fc5ecba40e36785dba784f59696f39dfaeb18fe6e738f2896b3849a3122cf36292fb9ffa108ee0a140b0a5ed177c06939de4ef1db3b6708707d16b094ef7ec3059a454d8d443da37d1ab0fee2bf4c0cd2c31cc6a667840df26d690dc65c78e14d956605ba29beef803b87e2bd550e101b0706cacf77832b56674d5bc429d5b9fea85a919e12f74d64ab2851f54821b9f84789b187dafcd813a4d73f9bb7a869ae048d031eacb48bee13485b910d88268bf068d753ed9b9bf62d2d2bbe9229186e82b3a24a3aa10cdf4045484ba4fd0b0c96119535c5835fbe17d821fa3e76e016d5a67755f9cf9d98010b50c95ebda505f2754c3ee2d7b38bc398dfa81e9d4b0dbb3a38c0cf2659db4ac786a216fabb604639ca7833e7d39011c742a12c7dee8cc14a3faf8b43d2a29a69c6bc3e1eeba9ac3469e4dc672b360dab155c84db6df08ef16b263f2ef264bc56092583431252e1bcd0c7e4b8b689535d6cfebadd0eb04998ab505d93e3c2713d4f74ba7fa12f429b674c3f3fd2b11369df79667840c09d0c53259edb1b9e99ed7c9da418b9ce3346b03b80d8d5ed68d36745c12339eb03bfa0f9f47581dcc67393091525429b08842a16d53c57211e606cfc9d2c64923932bb2560885f8ed8149b09ffc2837ac7f654ea49ea2a03fc457fa3c98e78cb4113763aa6cf85a6559f4842269fa96b19026a33e0a93f7fc4f42405eaae74f2f9b3de7582af42db3ad747c5ee6a72b28e36ad50bdb5ce98d2f9043b6e42de9954e15c8f4f1686ee2652273b9ec7527b800e4b2279dc242d4c653b7b8934d6bad3cb56fedfe5ff560f2328160d4ea4f30704026f3974125939392d595cc7624476ae9f66ee1997cf0d3e395e67d5baa43af7dbf596bb3380341314081a3d82a0726006ccc1f4c5ab85f70585d7eb402f2a13535776807fde8cec59141882cb347633c198cd31e6a60664c4e749f18443fcfcdbedd0e52c4d1276440c47d8ab9dfba245bce3681f83f552db95d4e9e95883d007032b2638ac1cc972e6a796f4852c5f3b69b7eaa6ebb26ca62b54bb181533fd6ee5ad331cdb711227589ad63b43254284f79fe478acdef813cd26b0f86b3b093325f2412e1bf68589c401080d833fb97113e741d0e427dda0af9721742e2ee89badd512d9effdb9cf8bbccc1db77103974f07ac4512ff07e39473de93d8593be55cdf78c88fc91575aca8e387dd5c46f152ea3fd14ca040e65e1d7e48e74716ec3a4df6ea7604b5dba0eabf15017cf221eb846a7e9545953906e3d868f366017f08f76d53dbdc550363c6ac6f57e19cb34d19acaa6e8adf510967a1ecfcfc00bfa2667a78103d3be1fccef7d0a61a66ebe4294c7563633f99eb50c38c4dee1f1fb9558e67478e072efbc257a454a716cb1fb7bb1b9905c2c55a9ce7e0f0110fd853793a1c8082feed4e65462e3b9e49eec511e0da82171b0baec5ec8073600c5abec0d3e1d482a71f73c42cfafa8f1dd0d63fa3ed483dc1b8a87698eee95e6b9323dbdb1f2bbde05f48d0d9c7e4e596e30da07422f458b3cdb8827b41d9c9d3089bd1cf1e9dcfa429c6dd5c2f8fe5f20d151761a73267e07ae3df15aa6ec951b0f65d69db94139fb9c76ac6ca00db0893dc880b8fe81e8e1f900787f90596aa97dd72acdcb00ef67438046e38096398c53349fb95a6919efac8d03d14c41b183205d5568cf86f7e36ad2ae17ebdd3abe6ddb00ab775047d3cc8807c21cff016025ff9f145ea3b2352e975cddd8bae00f08a0c123ec9cf2f31ac75f45d30ffcf9b5d65d7e7e338ff5f400e80b71ba45eda3f60be08d71c484c8268b26ebeef92ffb3baeccbbdbe0355bd5fab1220f29c08eaa40c96a8aeb53fcdf4ac84585dc372e95eb1e6060ab8c6730b4ec04d05690966679167e79862304a8fb717f4d05432a9ab6082f7d35e8646cdb3eb69a31bba7868870b7871ed44826d4fe400f1c5c43537f80173a49a1088f8abdbf171f16e41368d3dfbb8c7b1cce0a85232440e33dbae5f61fd7ddd17ebaafef2e5e06617880c0054e000b2030fbb5ba4a02073aca13eab276c1e874c376e2a2b76dc7d4923d6905b65245297165d41a55e95c30e623c0b2d8815b5c9986bcd801706f6b9261fa9b0d26c1ccdb8e283639600a9d283cc8e4bbc4b9564ef7df332bc4f9905797a26e05e5cd7af38fd655260c32ff83a26ef1746433d23dc61259ec835af1322767f06703f2e6548d858321e4ac4939f8c2c77bba97c91677b3607b231d0c774fcaeb9394dfdf96c9a899341421c90f4e14758c8a9a048d125aff20669fed7b0d474bd44caf74b52a336a671c493db06c7c92a8c1f379fbe2a8382bfac44d244fec0e84cc0d61a7c30798093b78c538158017f884aa3347092aa17ea04a0e3151fc40fa48543b01e00b85d8a71f6aefba7a299a49827fbe147f9ade3a0f052cec21a0b5de196599f4fda1f050e6633fbf267be3c63d997e12c00f9c84e322d22c6b94a226a31dff4823267a748cc81eb9ed25589685e524f629c5c69ea8a3fde99e60f68bc92739b5c6e76c6dc1adb3bbd7ecab4897e753241a8098f1c2b97dba8bdb0adca96f9ea5e608509c4d44dfcb60eb73f40254aa577c1bcec7eb270f9d07b4e5dde04b9cfb41df49120dac2efeddf431725c44bcabc887a98bc5d5bfb7e873e442bb1dee089a00b955970bcec608d2851637fa5d0c11c88b5727c11fd2becd04cbd493c666b77eef24949390b5df72ce0fadc30eccd3027f67a2363fecbd4285becabbba57688e361fc1822ab6d1046d67ec5c44ee785a1eeac309296fcfe39b33c275e7e502372bea67d7e4b8899a573198e0194ff835b19bdfc91ed42687dff87fcce6997338d735b1c019194e72f9efc8aa4a2141f45371790d2a6a4c9b5b9dfddd693f556cf28ebf758ea235268d712fd9a9f1ee0e7efbc51f7ea49e15ff3cc3a138c00ddd0559e6c9d93f649937516b4d630667a2fdc345c1bb1c1d218e5bb96f924271bfc2c359e6089f136c68330eec2d46c3afdea2ef18aaf9c35f5b12281635f88c8a6ba24b62dba60682027f826b3117365b3ac7b37da680a707a9f955f98fa417fdb1589e36a471c4b7c7f66f9cf73a619885618466a4db06782bacf095a564ee030959ea4a0c4e18f861e0a61c657c2afa8ee3a97b98e67bcca8bff16d76769cfddc16d37d163f74691e65e79b790ba4d3624cd1f3afa601b50cd72a52067077d31a24145638b9269ffae4ff9564d2388d3f63f917a95d3407850b3cc464737060a4bc6bd79937ce2498fc21a0f56963bcc95b34e578621b9246604a6eab683367bde78ecb4edb56aff1e3f11b71cc3d5bc75279babf9bf726c96ee469eb290793d075066e2142fe4d03c09f9e4da606077404f91b0382baebe1513a7c9e78fbdc9fe4d53bdd50ba2e3d8e2ad7039e61d23928247b29ed788c7fbbbf2748197c4dd173c5576c6443d630ba44f702429924ff2751666fe2d34e266eb3234fe3e9714c66aa2bfc16cd54bf02b827a6f16e41a67bb87c8a87ffe9233faaf8c79274eb1ba74fe85fbeb8c2619975e415e60df508bfe7e8c8f4cc26e34f0367aa1070505f414fd9897f828378f7993f380e0f7b2d672dd2fc5df4cf200607f63d5a4b0caf05a001a9932a53b00a8370802fa03830a95e4ce2578f304746103c5d9b605f0d6bc60793165b214dc65e507c31dee160af1f207ca541d98cc67776368152f50ca6fb84ab326283d00f220a93e7c931e615feff41bdc56f73a73be4ee12531407f25887fbe693b0a4b6aab279ee25858e139838c1ab0404cd9407597d45c833aefaa2771760946c16f1e3879a9b4f29dd8c95d8e713f11a3a49406bbd7d6d828e0bfc98bd62cf1d1bf8e36c4725fe19941dc9937e89e32f0cdba3b8946c7da54063260ed9df879c827c92a529796c412ab0c889999c50729d28f042e0112978e7811e2a5c42fffec9c68668d577d89fb78229fdd5d97238cb33259b33c700f8ca52a25209ec3e10c742618e219105eb9bb6735cf6f1fddbab1bfd0c8b05c6e9484ce5599a819779a6b81c386730a87e39ff12023df3427bb02522f80456bb8e2c7bb6d948b8810d8a80acba3a34ccfeff4e31bd1c2671b0e555abbe6b498deb0a0d7d07ea096fef8ce84e4986eb8b7004141642c85faae28193616c2fe7b76b9de48db86600b8981c5f6ef747df083382c2f47aef577cb4346547b7f43ac0f41a7372332f2f3234289daea64c95c769769895c7340c38596cc9f5e31bdb5526d9bb24917b5ce6d354c4186632a9d6299e0c8618b5a2fe36eec5e37f2801fd6d84e7ca462385a1ac58f486fc1c9d1832ebbbadc41a3fd0f82503eccf798388548c348210cf69f4dabcb6f3e70c332acdf7a5b54a022e98a81fadca535bc7440f4a6e2aa361d68e3cfc733f679cfb2120f07f63cdadf67f5bf748a71d19d664e555f76a3c7e4614c97555f232439625ab73c0d8feab4f534fa91354acc90dccfa886b3e71e3454a0ad183c0a486c219122dad0c7488d17c88f88f53d65ceab9834eaf8166a982539b69b8bb82bf0c3b30e9a2e61ca91202752277e207319a35691a4f347bf1d6fc56190a3e43cb59e447c41e2aaa2054d3fffcff323a42789e3f6218a4c4162bd1e574121b69294acb375c5da3b70b8b010bd8a629ae64054ed83d63802813bc8af9782146efca9565d7d32ef466cce972964afc1b6e1190708292ed48ba12085844f6b3a9d5a31b0b2641271378b5e5d216568db0e19c735932d15ddf7ec63e91a59de4e3797dcc628ddbbffa20af29563e64e78313e4f2656c6f57ac414730df464ff451e603e5bd2d2b8bc6ba62eb3b2e1e710f20faf2a0c232f4f4c2053dafdb14bd6e4fac6b212e81d23f510a4755e8dab7e8f543303a1494be1ed505b366f28eb0a93c476f02605e0ca082c928a91057112c11d02a602c7a37623cbd4d599da03434f1884fba8701b9323c642f0dcf983e39b5f682e014eca3ab06d1734aeb415a714dca15188dd88b473b5b06c985cc481f4e96ffc4d54f1774d75ffa9a7d58fa7bc53d5bc7fc4e465a9d8e105900ad074a46ad711521a3d4d5bf278acea9a887ef789d962b17d91dc082783d0314f67e4952dc5e0cd507af0d98cc92ad91f6e2d1b14b395c70f22494713ae3cb38ed9e6028e859bb379fddde512295d8220cd7d16968dc3d7db1e81f6575a7a63988839cca6ad3857f1198b2054c4a775f756d2c3fd60b922ab2b34fd3065cb487ca5b0f19a0ec198a45fb2b4b9efaf8dc82a260a741c148f22acb2aa7b6ef0909eed5f7292bdba20195ed81014e2582511b88c7c30b7a0334216555d712149fa73c7cf034a6363c3fe1e18687ccc22fa64160ea2165933a4a7a09033a2a4f71945ac18e70aa68be25493f37e19d9e2adbda64a9b3db6314c47461ef63c69d024d5d1c9bf5ed32a350ef6787b722bd483e131a1eee097f49508e45fc519b2c0780bc95f0caab77379de21097aeab9e2cfc5720f47fca642370e17de94b0830632b1ad3a28c98c76776a019d3708d0a6cf276777330385716cc014e04894fdf4c0b52cee7d30bda21a1dd22d4756847447b57975ad120205f30ccc1900a5a0b9b439e46428b168c2c05350ee1c4061e7c4de9284aaca9b0e2ad5f19fa3314c26ee93a79b560a91645ed7a6774a2af802865dcd6eb6ed4621f96ede841c6434803764c3bcd27cbf92ff7ea5b76d77a40246c274cd83f37d7f3ed70481a387e1fd6deb790004dea14dcb062f3f5975943ea801e12887f364a76a8a0ece689b2c1d589ad60fbf6b1e3105bcf3b111cbfa39f6b01af73e4cc51f2162631e79202452c805423938ff5c1685e26ba5e0882f6d9e1eff0c465a5f571f3a181a20dcaacb49078dfdb9bc9aaf63d25d46c9cc683c352e40d1e19a929bccdc4a6b5125d2a7929477d57756cbdc1e9a3e72655b5029aede61c395a29f566ee33bbe66b0217b04c2597e4cd0218b436abbbe6d024238d08e4cecda778d6e3e50a5754689d3bb4aa8668f1bfa0a101dcec9edbeb730c6dbc1e83264ab96b6ee75f7ca748c876f72e3bb75f053c879497bde09092dd653237a79515b4d856563482a13e969ccc9d37a8627d7227fa78a7f8a17939bf92574aede9e7658a80dae2439228f95b2e3e2d26e29583da6b80d3cdd3d23f025729a2322dcea557d531583ba9112dc0e061bda12a9dc07b420d6f7d9ed44e0f2eb8eef8fe34a96180e4ff7a3d51a365a2cdf8add5a7569f0e01a2398c1413d3bce43134b0a43db1dc09133ca6b7b4813b7bbe553aee80265f375a0e8b0219bc710255e9c52199b9de6547aa4da874aea2d5ed1552e3cd13102ec625861fd9c0d25c9b7908440c582613b4a061d8b19611b0b25eb7f1623a2584ee9f5a64fb9165047756f7edfdefb841b41844546f918e694e2c46b278f30801e370da56434239909ede42d6f5b61276759949c9f9ba347ac972de480de83d49d55b2c10749f41da528f1750508b263a956a5d3d3b35417881bd9044a97dbca8c956d3719e38f34a9767082a2eb3a299381ee90cb65485f76c76848bf3f47ba156fb9f9f2f0c869f163b54f84583fc84e74c1df5f0e5c708afaf324d24dc20ab3f8d0516f30df92f869c4a4100e318abba7540d5ca3bac2424cca56c053f0a5837810712f9462fa8ae765a5139f4005d0b460f318aabff72a651fd6b4700946804265eac12461b7703386c04fc3e4904925df87d8d7e35e9bebd192d8fc1c04854d81f9b94d4c3d2196e4498f85067fb1f97fe7030262991fbefd912909e6041cb7def18c7e8ae85aece40418ccee42cb1f1843327d60f1ff419316584a2a67771480e89334cbd1a6b33fafe419f10d55dc34c597003f2ba75043be6a725f83aed41ca91c8d709fe780145f4201a76a54bda0cbd22030350e89a3116da16a6a6ea7b763eee767206d057dd10216c39bc1a51dba4d007b23dbf2cd6325c8ad3aa82d6cae6a5287806447dc143273f500998b85400cc27b350c27c262e0e38f0a50033e5e4a9cc95587d6098fb1d2bcc104df3f1f5e8989c8dae1a48540532045e742987591e2bad48df05036d30f35ef3aee01c10d983dbeaa944ce5f3406a141ed59d5fcb1561397129c48323a965dcabd89127ee444b01ecc83aef5a2466dd2fdc4b59a5ca3abe50477f42bd881bb9abef562a7761f9eab54c04f6af33eeef4bf240d158b0488c4c19376ddad59c4c01e8d59bb022824539e7a00c67a8ebc97a3aa9f582c3ddfede0fb47db07f297a6340f0a8e9651bf416fd3ccabfc12f69ffa81ab0cb04817cb566ea7c6f2e98109d278cc6552492bbc8b6aa67b885e9f38694f970f7504cc35091f20a97ec324b8e912aa3af3d03701c0137826aac74c548dd55a05c75323a0f950efd6d29717d2ee7414725c5da0660791248fee222cd0b0c02dfb61597e0ee9e51b809586e01c1390c60564554f1b9d0f1ac86a74fa59834d0ccbf386a0cc6cf644fd97b4e795990e53a5cca75f7a86dff1ef33b8deb8be9290a7da49805921d3ad50db89d1a7b3ad1c7ae03e2ce9642f69993c144cd8e5965c9ada5c5360098dcb008d84bfb33e10002b73616e34cfc076ec826d8cc02879b42f6fc94e501723797dbb816627ad5c48f7e352794feda0cf77fc1c65e4dd6e4010efa061c09d56e7ed6e8e114676b50a14abbad14cf2a664127b9199d42c543e5ef4692b9ff5821da9f9b6891bc74880d07a0953d504ea3b5d27fcf6d062d1ecd58f495a60458a4061ee440dfb8713b34cb5065eb18392851c69c52420a5b0615ec80c0ad1e54b7297504273aae6a4c434b2b83ebca82f80870862959315e11292a5a8414c99d6b1bdbc7ae66ac0468a39ac90342357159307b1580b2883b6ff98b4e0caf6f8816f94e94a0390493629de113ee80cc56670866aba0ff70c43057b0921eaaa3a313cd090d8862b60ac688c16f2731051c1844eaa168335b6e884fbe093f1ddc0c707b714d750aa4909a91523a8cd9504a2e3a20c0bbffb753ba4212cbd3c3e0e0ebdb6a6be818a149e114c5fbaa9831ed830d80196a00c4be9ab8d4e2f3c75266288936cfd0b27fe1adfcf500f4d2cd736165e80b765598297a57f28ae75e54480c96d3b4a39206f9f900f993909c28697b553601a150d33fd921d36425483618e00d07b953ca7a5eec7b9e0cbf187b6be811a159d0d30bf94e3e03f209d3066dabc90a71c92ab37bf6c8b1726ebf32adaa58b8a9ec1ae9d3b0d5df3a504f2df55f72c2c4c7d24405b55f81430a339b74e40e4ba5adb599ac60b1934a785ddd2b7a8140896571ad23c2038464c8f087d4d3c81902a14b282695f3027ca72add8388c5d21b8257243d666eee44ddb1b36afb76c05361bbba9087ec58f3a9f5a993fe467d2b8fd674a66cf05264c09a52ed99342145c9615b3b6e2eb85a6e2ef96fbff37f0286fe2189325627e8d9338f4805d089edf52626d7be864964406fbd39ac2ba5e3125592a7a338d4a5808e9b3961de474701222ed554ad18bea31b4286b9d2f2f2a19e34f0f71ce6136cfa5849f05032660014660e830cd012dc1445ffe19ff4c158de1216496446ded1793c296578baebe6c4d2e07faf117cb0a52250589914f2da356311186b53bb6bc2a36f2e43cdbec8114489f9e1e128f0eaeed7b59a531fd45e91f423b7a26e3960ce64cdff14e48898f806366b1ffb6a00468e6095034103464d86b589ff2bca59d92467f245fdfc69b034df08ef5f56445abd9f50cbdc19e80f0e55c6dcfc6d19ac5bb598e5183ec69d7767f5666599eb295c1ac3bdf2e735d86f094955746592928aad4b2ef59cf815107248a3cb00d62141aaae8f9c3a84322e25f1802030ad5114f6b4c7f20ae4d70e1ca57b2725e2ea060e5a49fca82bad1a209e6508bbfe56607cd1ea35ceba58d02c45c036ab4ae8e5710400b398d01e149323e741ce94282775c1cbe664cd0cf78bc3d3e3038041707c220e96dc40f08e2196ce00e3a9c734bb965461c169cfc91795d7063c9ad56944c24484b530c129166c027bda4edbdf7de7b4b29a59401be0976083808ac9353cd9e9740ed11037f37087ed23e38a1f688859f341d4faa3d62e2ef1663e2276d76729eb1573e727cdea8f6b0f7d159a07a778e3c69201557b7b97570cbac0320ffb02ecb3f9975200bde9083fcf31d1dd6330e1c30182c76e3062c0683e1c071a29a33396e1c7ae7ac4c26dd9df31da24a61e10db7cf5d2e3dabcc759ac970bb7c5cb7d9e7f52a16b9ceba158b62076db893797ec5a29d83532c729da8c6ec9c7356ba52d9f890509c89e26c0bc5ccfa4c0c75e48c0306c3913fc5a29c43aa830bc3ccba8ed0d20c7e9073ce3860301c19fc3399e40330b3fe41fef9160efe65d669fe60b00ff67ddf7798e5e0cbac73907f7e7078457b9bb778f0d3e79c33ec200c070c8623e74c2679107a99750fb2d65cb805688bec9e58c4fd070cc5a22d003828166dffb1c71d2091615907aa1067d63bc0f63f99836fc9b1bacdb1caace7c85ae726a918ece02a1c6b0f1c27ed66c57cceb3a393734a4feb653528ca681f168002a954e32880cdadb3f278904e4ac18f7aad95ea8626996c1bda27cf99e78c757bbef29c2e9d3d653cf94746ea107aed613faeb85015ce5d69f5e34f0d975e6350e0ac330093a513b0b4e795bccc4f9a5417327016c648bffa9cb3e452250a971780a85d239aea140e58a26d57e2eec46927416c192597a62d658ce145470f863e51b1b0ac3d4b2c2eb858cec04e9b0cdc0e9d6a082f54e28b022c431688aa3d4b1cc850b5b09a325e61853eb488c81197d031b353f278d153e61003570e3678814eb0a8180d3e586cf070830b8e4d887360f297847e224727c50f7705076b3ad8ba0000f8464606101a1ee810e703271d51661b0c415c0d3bbe1c84b804a0fb22002ecc00c6f0d89e00c14c8f2a7c64f183734300170c6d6200c16414603bc30059d608c1298814224e866d032dcb01b61f10e079293242842d09214c8c5066081509e0b020c28502362f16805fc0806d8c226518d9c106475c20817bd28028231a1cb0617980c743095d906c4440e00813c444800909909980190aa0a9c01516d0e2026d30f045065ea0013cc606c8e0001a1de021ce094e1e8842c2705443920d870ff48002e60202292525588204d298149e4832130215a8508a60e362052f580869ee61043d8841821ed4e8818cae5645ca55f2a20564e28416319b3e5c4ac3e446dcb3d402a7052d3770e173d2c483a1e9b3c1c9d3f224e5c40828259e744f4091224a29650553c0a062c60b3eac11e504860f86186e90c1d352456a06303424514315ae89ce4a1457bc2a6cd8e2062fb0747b963f8081c30f64e4f0031a3a401967a9c5cd9ee50f37e8b2dc273b6c5378d8828593a187eb458b962a5f36a53ed8227eb8466ca94870b967800869a64fc6596e11b3c970d72d68367d1844b9e58a2e21cd5bd4d02e34080a04e542b7d01fa80f540bed81f24077a059a80e34078a03c5426fa036d02bd40aad81d24067a055a80c34060a038da22f502a740a9542a35028f40985a24ee81375a24db4097581b64099969828d5483002165610810a21484a0169891210a0f0812447a4074ee8000736a0810c60e00216a800052620810898000124253cc001460d20e18891220c588002882460c80842442842c001689b284808062800902102fcf0d103041e03104000847604cd747ce001908c7ae1e1059c75f686da4a3fc51e33d35d457a2a7a818728b168993f188b0ba071e88efa5b430a640b412eecb20a75c80debcc8bf16e3224aa219e43ddab8cdcce11118990606fc799c443ee3eda6e0f762156a1ee6e88bdd4aa30d64becee463bd61280d4623dafee7acc5927903a91e81eaaefe69c75d634f0efbd07f1ad9a5cdad75e9188266dfd148be6d0b5b4d2004e2a83fd5662a9b2377c70ac3db66bbf7dd364bd1e527f74496ae935d3e6c7062a6e6c90e2829b2b6b5ca141b7512d464bc616639581b5026705576220b45d79c10ee32fe3eaf1c5f89663b86779858b2cae5841668a1d5dae33ee4721acd4cba8ac041ab88ce5952c54289c999a2b51b212ae4071569e5869e25aa8426f996ddb368ee3b819a2700933581967e08267909a82c50c59f00c3e34c1a2099e5d51420d6f3a2c35c0296ba001951916698466694a19d29431b86056451a5f182a2aba1b64f8029732bc6046c5ce9e659518ca2a4d68b629a680e14dd40da228226c6226862e3786219a988941871007331886336270010733314811c312294881d099281bb80045d40c9e405146a9894243e687bc67f608c65946899965d4112fa0a1d2c5940b9a28f1829b5bbef0c54c89d59e651497282d4d4b44e5f0b4448e3dcb176cb0c73dcb17c0a863c488f91123342ba2a4c2460b9b4549c58a8dca1927a0d4134ebe259c7861ba22382fdb0f984a96a74bc586272a559ea85079a2d2c2940e0d318a31a24c61c113a9295c40494db1028a14b76739e54c9d22834ba3a9062e70cad2a40627dc7456baf8c270b20418181833c41a6160d0c50c42d4104319058fb809d700d54df9d24319a58c32ca9319988e8627700aa6e012b426103540e9f095529e3c990921658d2dee594ea161fb01bc1dbdb7c746ea78fa88fb778bf591fd7634bf4ca4de9b9b7ea9a3f489d9974a67523321b66a032f332f5e84bc04f113a5890da0b0186f9cbc3650d438e902a58aa72e50cc38e952425162df3d4b284868f9d12234fb014a540950ac64114b285252663ef4f024ea095409e504ca05a129a2c062b6eb02ca666bc289a7c56dc249699b70c255819b70e2546736a431830e0a0264bc18a18316694c896206275f6ca5131840cd6ed061fcf62c9d14b1c96719597b964e76d8e438db611cf72c9dc0d093c6c66620b15a40fdbcaec92c90fdb474d746210b641f8b19e14ec2a43560d2b8739ac802d96fd6dace02cd1891796d2fa5df178469f12908f668fede7655f6c5fd7473e380f6a5145cf66bcfd2ccd49c7a0b1313a918fd3c08f3415f8c731fdd237a3c841eeb9008fdd535b479fbbcdeb269265228cc4b5da1d8fcdcb121b7f4a1ae22117a1bda9c635b6246dbe79ea209760d18555aa06d5a69b440f3320b546f81de8c732bb92cd06c02aa8fc58c6c2761d236dd8049dbbee96981e683da4c9a1bdce68ad0951fa1d1f5cbf0b57736c30c66348c76cff22906fff9f62c9f58507d289fb4944e47ccaadcfb11cc0ed33483a17c9262877b964f4ccc62289fc438cd6098c9308bfa89aa325b69207419bef85219b93d4ba72f9bfc65253871f9716ab2f19e65d31a9bbcd0396e0665e4b8321568a229a149cd78abbce9a87432b8b965d3174db328a3d093262eb4000b16512e3811830b61a4b890830d38f62c5b88b3557b962dc8c00550dc38712a5b58d33473ead9b36ce189eded59b6204605b3a69f0a52f108f7edf786650b58c0883922617ba76bdd9ca25d1dadeb1ed3bad7365a775288a375277f4cd188a3795bb6dbbc853b087ebab644fbdee51aed4e8d7cba0947eb6a4e4b340e09f77a63f2aa71c47326db66d26efc4ae90de396b137af88771dee1b99549f54ad97c9ba79e0ec8d966ec62ca60a764ece324a28c7594c0fd2a9a9da23e73c94a3534aee47b0d336932fede9efdc3724d6078d7a3da6c91e982647f1ae1ead8647df05e05b4d0ec1c7b714883dd59eb524ec1bf73a1ed9f37c251609373ee5a2c6bf34d9b3d2a2ee71e9284bef82e915be4a14427fe469f122c523eef44bdbbb7af48ada8b21ceb2c1106fa1b5cff67787d9de7e3c6108c1675d27733959759ab7d71efb23aac7bb73a86bbd63fd870d7f58efc7eed9e48fa8f0944671e948a1ed79da1bb577f26e6f0c0a8414dab85672bae101c27888814f4feb022e3dbe97c9a4290b747b7ac6118ef72d098f1d9e4cc2638f5f9d14da5c7832a9b2b26bcee83b5148f8a35193747b07cf8945c21dbe262d816ebd3cb6f79516f51d8302093599c2d2f60e7e78db1d0b1b1f9cb4623c04dc9cbe63d01d9b5e72d17341c20b12511b5c81734271c76f1229081e6311c4182b31d97e1f625dfb8e7f2f88cfc4fbbde045503f714a4cbe5fcdf43d7ca89b9eb8dfc7eca1ba8334226bb311fc2f7bb9c9aac39f342e370942c3bf796efa096b16ee2d65f2d11a46100e73da16f62ca90ebfa1b3377416c71c42c281e3c61c42ba71c3c61c42b261c3670e21f9f8c4e610522c069b434830d86b0e21bd5eae39abef9943483d3d3c73088967ce26d2ce8ece1c42d299b339849493d39a4348ad166b0e21b190c639ab5fcd21a4d54a358790542a710e218962388790c2212410fce610d2f7797308c9f3ba39abdfcecd21248edbe610d2b6e1398484e76c22dd399b48d6d6398454e7acbeced91c42a273ceeab7d85b3d972c135a2f1990f6501adbb40c23a53c224b50963065182c5041584a1388d977cff2082c6ae89a103b6dca54bb9174ed490b9f73257c235a6dfb146b58d76ad3027137028fb7df1b8ddffe4d7d17f5953252bde36e24fe1ee37f376a1d1ffcb273f0463adf3e6a1ae57d3c4b8fbab675bac6b9f97eefc11b71bf1775cd5e4aa5299a9a94d178d55bbac6b4bdf51d4dbfe0e7e85a4bd754ba268affde690bd4a48cba83e7748dbbea2c4db35820fb51ff7ea56baa4fd76a9f91dab4405246dd435d0375add3a3127b0bc46481acb54016ce54944bc8cd97f11d1a8e66d9e074a3cb0da74734347c995a4bb4764d5c3f46a130b2ae9b6166ad79c86d7aa2d56eba6bb69bc8d24cf72b3709427b95814dc50e956fc38656a25fda75b777b0c87b2b9374b7be4cae003ba973925a391232b7f7bbc57b393956ef02e77e8864f4c76ea4e32f5d938addc675bc6643d79ad0383429fc987efdfb0d55dfe1519de7b121aa87573d3c19d3aebb32a94335c904c9e8f51b37fa5f52484636fefaf5d44a2f5d7bdd86a66a5e474b82ec7c09dd54c78680e739781eddfaf89dbc84b28680d7d1b24dc5a2159c39be79e99abd05b24216c88e87d16c82a6af9b60e33cda8c9306804f1accd69e4e833df65786caf1d89b6c5091083d08c66207ab88a4c9462cf69812130e0efb8d14f05eda266042f2d2359fbf0ecbb5251aec20169134bdcea483c360afacc4c4e730cde4f31bbfa19b9e72fcf598911c87fa39ec93168bdd464c3fe5386c72f0bbab26b98b26e8e72cd1a658046faa49d53d4d2f8e5a05bb49d93eaa43b62dfe836cc402d97b909158207ba06c010b642fcb2758207b00acb0c90e72931507fa29c7f57f72932034a51c9a05ad270dcc643da23ac96eee5527596ac58a15fa653fe5c75eb7b0db5328ebe3c6ed6fafcae48d5cbbf1a77c92aad9b406fb537eedf5a77c1baf0cf5bacf6119ea751bbf91a15e875dcc47cf50af4f0bf43c693e36b2a7c9240bd32a6c9bfe95a5ae5e1264537dd47d4e6daac6fa88b9b946d0a8b0ed7ab049109acf6d1c6bf0b0dff807e5a39570fce1b43e9e9a04a1e1b88f37e79c739ae08c09ae6cf086b73e9458a0d1fed833688791a46194582ce46e4f937649907dfd84e3361e821aa9eefa271c879df44e52355b3fe1f8eb9f263d9d6477d52a6cbbd35b7068166e5c93dde8d22a6ce44403b393898d87607da48fb6c07eb7bc8ef1abbe2ad3066f9e531b9659989985d7412a1a79e94e24616a4fb1c8c84b57a65d7596782a2c0a905ee602b3eb7dd4d8f53f3a8ed8f561ddc048bab6cb045e76bd8fcc882abb5ec79d4dc0596957e3f515895dbf6202d273f182a67a7963a5a0ae141a2c55c6568513d309f1c6abf20d21a682437c117e613262d75fcca22ab3fa0267acc222224ccb4d0e1167e858d929228c104f11687a8a28c38505cccb8912c08ad8f58f95e04c47c4aebf4f09c2a835f4e9421b3f6a0f72b442c75a6537ca6c602465bb04f366d7eba8a51729bbe6791e26b8d689ea14774e547b6253f43951c5b1e553b1e8a7a27ef7916635f9b32b185234c1449b4cfbf5a0a89174fdbcdee6f8eb53467afb23fbf0a7f6f8d1640e9d446853fd7ad594295f8b5a8d4d93aaacca6ed8c011e28073239f60238c18cce7f3d1590255460fcb6ebcfdfa2b1bf5f0b83a179a9e3c02cf199d9c1d6e47ebe49ccc1a5b5b4b68e4a1125778a563d31f51067ee10d35fd7c3aceb3455e38e293f786db8eb3cb41555e8461776b10942028425a64e0ac207532762fb08b19651735e6ec83336fc410420f82b5522b82dd5593b2a2dae96b6fc539a76d0a620d4ae9bd58b62ad65a8bf1ec02a68b178a8f29bddd5c24e8e244e57400679d73d24fd102f1660d1067765dc2da0fcc998228c38c2f3679d7ec3341a02008306a04a125082c4148d9358816bc33d000c128206e00820b07486a054a0a65a24db5246befbdae15949cc0711cd759dbdd7bb9241aa8b2eedafbce765df729165924dd08f75a6befbd5cc6c70aa8b28a801f171299cc474703fbfa24f1193b34ac74a3eb32a11f96c88e60c422b11a489254abb4494a558d098261245dbbf688e1df8df127ad8393e3f6bb37009cf4d931ee7773dc274d567bc4badfdd019de4b163deeff6bc4f9a071fa1f6887dbffbfb3e691c042a9fd5b1988f5c958d7cf46bf57195c4354e98365a693289cbba88f6bc975e3af2d49c12a441900983cc1764d69464d4b852261921c818b15d5546a689edaa32b1c85a7b2f1932656243ec26992ccdaff1043ece4beea990797baa91867c46363ed212da66e38b30db10d96a4fd28d978cd9b0bda4c3be22cc36334c2e3d41c6cbd681e76da6db6791abc95a4c84f94d54afb8648526175a60fad1bcd54b6a9bb47bda1e829c18a3904481c1519b4e61242b6c1c45a144d1a8bb46a98413a5182e3c6e18bbde314a3258ca27a22e1c7a4b409b435caaf0eb36a702d44981602057870c757e18bd93a110581098f1de2704a8d36a08f5aeeff8e0b66d0fa8174f42bda897b6973fef987ba7667b79d6183cc1b4b977f4c87e567104a23d750a74177520f8caf6ae6c9f936fde41b3b9c788dc73bf9af41e3b5704e3e9ba91bcf79c80b3b95b27dcecf017f69b7b6ef34a2ce285178570dfb99777deca4721197e7c4e0cf6b95d1deb5d8ec1fefa3c7830c788848f3d7c4cc7605a84a5adf31891d7592cfbed3ef73cefafac7357d6794f2655f7ce938f5a9fdc773419de7b8efef169e523eff9cb3fc2107bfa7b9753a0db1efcee0782ffe07c48df93b60dbaf9bc10b87692eb66701ba3c3fb262ea03b772b825095ddcfa9ee0a38c1dfed6e9be5acb55673f4cecae3c7be97ead4dfe625d4356773da30f15d749b4353cabbb5dafbf42ac5f976d786f0dde25ff6203123f93d29f528f5b890e46e3f02026a8feef63aacb5a30b88917e7a5d9559fb201fc6b9ef9c33341c131a384ab0eec2a9156a0f4ad636f7a9497b255c469a5465f5e1deb24e95e12b49f2a1da5565415323793457034ea2f10b51982f15e3cd23d41e56d7eef3642b1079199520203c3d39d11059fb638739d4138dcb5569d78dae5fb68530bef435c90f5a65ceea83881875aaac5231922ed797129cf48571962880736febb69dfb100410cd213a87e8a6dc11d7e31289454b689ceb537be053fced604eeede7ab77db1f16344ba6fd779eb5b26bb93db5597ecbed3d444191b0c37b1a8f52e8ff7597d3b9d7346ce59158b6c45c0779a5c0a7f445184a5cdba4fed71bbdf1355f137c75acff9d4f94efe740e5e47c75a8f11112fd2a0e60c00d9dd9e2727b3deca222c6dd6988f56faaa7c24ea4d35a867956ddbc34dc7865c2626bbbb734328d3eee8c6224c279898c02e2fa17190964c384c4c3ba9b5bfdba4707f4a7687b424c84edab687e43d692b6281dd1dc792209b8a0958d2c16972bbdd0e7ae208447b4e1de417525184edf76ee19cd15f1e73ce48d52e1a3267f44ce8924eed986e410f0c2d78ee734f8fbcf7265dfc39758380b43a317e155e0cedb55693dcf157994719e3eade571f3fc5d57857f7aeaeaa0b37f86111b8d77349b8d6a515b55c942870a3ea3ad5491d7cef05bf5d95799431aa1e923faaab4ab27baaf4e78c3eecf2b418d3d1b600ac32da755dd7755cd775f73ecf3b97bd9fcd6df73c6fdbb67b9bee964cf0cb28fce08cc24fd0970dcacf4f10f7feb85c5d5c231365302106136b9a687ae1327166cb6a8f0e0926c4f8a8341b54c558c97ba918708a609c251352f62ca7b26c01ec598e19635b4003dd2d0aaa629c5546492a72b4e6a02de3fded829a18f161468c6a8f4b373ebd32268c7d5f05382b7ee7bd83733749adb5f66a926a926e22916f7376ee3bc7b845b4cb0a1861eb98b36a64e69187919c6fc8a9a6ebc6f122b993562a543fef18368b9a33f6f72c91107382375b68cff20447ec316bf6077b964ba0d92092da63e277dd3924f748a2ba3c7af7529d1e46fa2934d74c09d41e36ebd833828cab7707df913e36fe23d341f270ed1177e1a827d7a9ee6a65ad95816098b9306fdbc3fbb56dde0eebc422efa0e775a0d779777361b661ae9b2a1106d9a031e3fdc765cfda5a67fd06054f2541bd7d77c73a3cdd778e431d34c448ca36d639c639cf39fe8f90475fb14887874727e11dde8a444810274e1c347bdcc93af9ee9cf0adf0ac1c7ecc2178fb2ed424f80d1cab6cb4e1528bda34c0ef344f3a3339dd6cfab3a9fdbe8368d22c99710eea2f1f71ef4e43f2d3a4d0feeaf45d587d8c3e58b2fa31cfbcaa3a1eea805f69f23b47bac60dea2fcf4d392d748500ed838c18c77b9ff60ad9b9432b1689a08eeb6777dbb98fe3b88dd3dd9220e3eebafcd34d9ab78d9261789ac9ef902e0972ebbd7462d5f689d0ed4de669f267671f8ed3a40edde8ddbe713f8fef62c662d1d6d11fe4ea0ebf1fd60785a25142412818e7c711bad1e5e2b237c5bbe81673901023495baff5ad30d41d9875aa6cc35e4ee2dadb7de80873733ae9120912274e9ced537bdc5d6b5556c7aeca683767219971aca2111c0d1262acf73e394c8ff8d1d212850c3f5c497eb424e19b8483b4586a6d9b5b83b4586a2bbddba7a236b80255d9674feba3155ec79539906afbed765b47df6da758f2d177269b66d2ee0da476bb1dbb23d0de6f47e03f91ac7583a326936ad781dbbdf86a122fd536ba6d14cb26f1bb7c64cf64df7c91d07724adb249bc7145c8baadcef656e049efdba6491a3541bd6992d3db266ef6dda59bce57c786d0df22f4f74828140572bf697b49d6712764fb15b7eeb2f4d86d611e3539d708e93eb1c803c13cf7ddc07cafddc11db72ee67095bd1359ba21494aaa6412ed3e7d74c9ac43a15020780d39d71cdd6fa7dfde515c414a528dbbe3cf7b2b4f0b744cce351b7f03bb7fc7502810aac9ef9eb7e1cd6df7debbb94d53287407be4ce892aa8e2640b3c34d4f8fb388b1b241d8b34cc24d125fb66ccf3209a89dc4d4067778fa338758dc75f66c82b067013a0ea60ff0cbf5f54862309705c1d0f33c2fcc47dfec3c2f0c5fa75f62f751f8af087da7c9babf8727aa96ce2cacb53f569aee8fb4567bfa2824bd935693176f4b35262b6cbc052c30e24c9318b65c41850aa2a8ae6c19d326aa0d531a4be8a06123031b19b059019b2deebd3b76c0dacc0e1a54e082cb1316fc0046091a3a2a90ec1a356bdc4cb1a9114cdc7174d924467aed9a3454054e382976c884146c9a9cac0973860b35d600b1c11cf6bc55765411da820b7c31be343466b0823245b0f1024a67868d102d3653556ce0650d2d35f0618935d6e852c0e6068e0d0f52ba30b808830ba61d3e44c1268d931d336cb1c69a1748b005182da0d831650b279aec88d2dab3dcc2cc1650ec90b203ca0e2818632c05638ca1f0ec596a41841634dc90051a38642186942cd66481e60325c66ffa510b5b4ab1e73f5862ac65137bfe0331e5127b7e0e81dc86b76ddbb66ddbb66d4bb3831b1a7cd12587285eca8889aa200c4e64740146142d5aa03853c375bcb8811733dabc81c1541764ca266219258506db0a153da8c1e50657b0a07b028b3328166840b14135c801c6932e6caca81203369d1358783143100d9ac61a039d2d60d8d1640cf72cd350b1c3290d133b9ed29c200d1120ad61677de0d1de90ce3bbbe9cd29ce1f0f4ca0fa273218b6d0aef5549f80c6483fc27d9d3540cc780e11374e614f7b2bb52a72697f01ebd7b4b36799064b53cf9e651a2718c400c60e4e51bcf083161460d1c5c3020cd4fd7f8ebb26ac7c3c3ce1eeb550601175b1a8d2744518ab2b6c3083156058b105973328b5e18a356964a046898506563c61c598d91560e4809ced79f2677b9003888ceea827b3d783f4117f58a07a12ef793a8118a13bea4998b38a4fde15c8790653b7da24655a9190c3364281502cdd28f3e06eb25b6d72b4fa225183825bbac5943161a140e814dd515fdba841ad78a18939ab27690ebb0a608d917e09bd00d61845a05e689b393465b95aeb69166b7b90581f9f40f6554d0f8ea9c3fee620538725daf653db32794d6698f16346694596b20a2382c8b0e2cb0b3228abb0a18a2a33801304a78a261ce26af18558bdb43359497a7f846f871c71f7fee17f07bf4ce3eced1fdd2038456b6b772ea9ba6ad326d58da92882e0e7ed4f18aa549fafaa9cc71849a14d647d048931f250a9c2f0f334488cff541f736aae3e7e3eac218c9ff3a178f04eaad811f1e08d446da4a2713658c322234da29126279553a8418dc6ab1d0cc02ff6f6895590666fc74b58c80d0fce1ac2ea24f74d2cb27d92f6e2b7af32d4694b35b216c24ad76aab33991584fa5941507de299c32e5bf1f75ec81d4caa966e5cee5ec5a2ee134f1d23b22f96520565ec1558ef9e3cca18aba55badf5081fbfca2024c4a6eb84c04e889b29352bbaea446e953b0be4ddb31b05d7de7412d70ec573a73a488b91fcc1719947191dd771b6be8a4482bcb12a166b6419b13ebe356aaa5b44c273b1d811d77b1ee3deddf66425969411eb3a571a5f93325a5d47d75a5fbd9673d57b726c7b4f6cd3b123e3ed1fc07a8f566a29f5dc7ed2d46cf19c5256ea79ec48cec79bd0eac95259c9953b0be4fde6696f6cb2a302873dbb14c447815ca8d2b5255a4d8aae9668abe9810ef62cd164d968ca6c3176c47ebc093d67bdb33e4656cc84d65937caf99863d43a4bd728ad4524dc44234daaaf94d493747347ec5937a1e7741cb7d7723e6a23d6afaeb5ced25624121ad9f9dc463cd7e9b119dfb36e643f3e288b31545a29f55ce52adaa4c0abb292ea3b42c4779abc9be3b873bb23855c737a625e42396f87ef9680d968751dae735920bc6d22110fae08e20a9ee7c87890314e1a8f96aadfd14a5246aaafae94f3d675b492eaab9332234d4e393ad6b5748c7352e9d8f758a78d8c629f3ec2fa65fdc61e30de7ebc655d95c757d15b8dbac611d9952ae9824b5e650d31c5384193b7674945952e69446931861a4c6a58d03101a6c9146fa6704393b2076b56aa9f349b4948816eac5370c0a435717772128456cf9da8727702c598fdf6bd1a71ffea3d13ea3d5da3b4dad43d8c1df13414a5c58e78ba064569debb1b7d6288892cd07d988dcc32e211a11ad4867b585f754d2a76a49ebb513da76b52f635ababeef4b440429b6bca75db0dd27a410c8149030f52bc55cede493b9513fd6afd1ac0e518be9320340feb23f49e56a29fb42526daa7d8804933526feb9644c5720488c65a29a6aa684489c93df7cdbaf0d138cd74bfbd8e31fa983edaa69598e0dfd18ed955335d3d2d90c5126693e3cd6ca9519aa7c4a4bbf70028136a5094d6bd09a57577a13b372f53a7a5ee39cd8426556b914d934b8e92e0578d023ebd127c7a229b56825f7f330a98da59af6a098d8302be1a85fa7a2676c9d6aa86d01938e0f77df105f7867b33a788b271e61451db942cdb942c47490cd034b5efed99333a4abe8d82019aa6b635f3e628c9ed42aa33b366571a7669146e17524c5b8893c14c83022e87a926db9ea51456ca28b49465c204855146b1840b416bca3371ce9c31069c3f9df5517f4fba40fa39c1b97acd3529a31004b591ea56d7a858f538f220e3fed34d55d7a48c787acef3daceeb29fdbd11fdbda7f7b491eb56d7ec5dda8805e24e754dc802713cba46a46bb740dc7534f855a86b52de6be1bf7bda687515f7d5e9a90e754d8905aaba46413d2d10ada7f5352923faaa6b4c54d72cf0da78d6d428c4faa44d375ceb9346395ab8cac9352923f02d5da334f0abb3b252f8ef635692320a35cd6295c2f368b3d29a7eb1403cc818b5524d8a8449c3df3e699f56c237d2544f53c0250553fb0fa0344c9b3fdc6ac9560e88a02dd86cb185150f82f7de7befbda0787aef1559e238de0b8aa2a8fa15c14f111441711445d678a20a8ee3388ee338b258add63bebe3f5d6c156265da35095b56eebf82f5d65e32852718e5a3cce2c16164f1031c6d8a51297c2f054960f2af1b67e652bacc9d541bccae291ead4b5319e26c05658a54ae2529565b8ecfb9db28c15d74ed8c3b3dae8576519a8bd7a584271c6bedf61a9be8a81ab71c43ac6d23150c7b491cf61f778cca408ae34fec6fa8db10eae56ac1b815ad4e409fb7e458ae756392a955e81fa28fcea44555cfd86e1d5a46ba7876747b55aa956ab202edebc11bf3a61b36e3beb03f6f1e098b15ea9ce3acea1e8da57f599335bfaa56577257189b48442cd06bf7a3de7ad1c4d8e2f55a71abf164bcce40946ad7c04a65de3a793b8c4d545708a4531f1ac079cf4a8542cb7953d4d32a56844000080048315002028140c88c40181482c4dc32c647e14800c8b904c6244154a22418ee32088814806a1184388318600630840082169ca46001418201158a2d577ecb846043cf14c7c438620918a066b84dc99b810adb5b4fd522608dab7562a9c3434482543684e2ae184f7720053e0fa25bbb099c630e86ea9e253d24e22cf2a5520fb06205a3b3072bea38bdff101383d761ce609962d3c15cb319fbe29163cfd34a72b841244ec1567e48281e58e78dedd6962e25c31f5d174f9984e107ef44b6d9597dfa579430bb81e119fd5e5ca611fb0048bdd20c01136cd6520cd1d5d2f7680965d00fc0dfb2ea7be4641e0fde1537a128c00e5a801cf37a823355a3366cfdfa1373c326ca6440f74b9ecdb7a7fa4cff0adf64c808f8d8e820dea28595f6a786a5019bdef8f85b0dd0b91d8ad6f2c15b117104d2e9800f1e4f54331d4ee7fb973f5dc16bb608988c721082dcb6c09157725a4d5ada288a1613cfad6864e2b49e5e6d61884974da39bb45d670f293140fde30e14e353c9c228dc34b30adb9e86469172b7108f28f01d92d6ad27832cf6c4bd1e7f026f380318cfa1f1ea6857111a25e84f96a5eb799640d1836f89bda1c3b99c4b4a188072fd52e4225eb2eebb54dba0bb4e5771a738717151e011e3e7822503212650da0f504e75b55b6d0672bf9b9e38684aa5d5780923fc4ffda11e942e141755b0d4c3db57c73aff42cbf65bddf4d9ea6226e14a93d5401862af123730a1d581ab5ab4540e6fa0a46e2ba4cf3e1ae5568aef82369a1505e04df7939b6f3a3a9ddcf5bba07370867aabb44bf228e799f37739456c8c5472c455441d03e73192f4679c9155d22dbad5bdc11690208bc3a31a55c2672d0bda8157957f8dbb8e178c961c6e803e4b1fa72f35a52243dfba9e6142873785c9643631bd9acd931d0598658d2f025e1ae4e36e6c6bf4afe3e3c0b4654e3361da24632834b6c04764095429bbad47d91ab1e92b163266d15577fb439948d46f0e6b55dce9a6c32dcde79c6521aed209409fe2bcdefc98b4cbdbc5b23c4cdadc6d1c3b8faa7ba3e387c6b1bf7f1193d675f9479417aca3d35c84145139815c5943950309f8b5767069cf5a6c828a2cfe29f5dec48261ed07d416bbb18931b4a70c3b98aa20924623461b92225dc71330e809ec9e420a6cc45abab3d36c9055b31d17ce2e59a1ec4f3fef3fdcddfbe8e784dc7a03318a3bc16f6965cebcabadc0f45734ba6c0a7828239a31d0d5e29b2c83ca48cbdf03a5c1c0dcc573cb47f073baec4a8579203466d78788264cdb333e353061ef40b0976bcf502fc2a95a18cd877b695c574000df50501315e9905e2a0e0d0eea9d868795231005a79b337d7e4c7bfc50de8315579b2ef2cf93c9feea000cf22632f0a3bdd2f7e7db25ac11a9f2b9520e7561eb6794217968bd43d754cae53266c9ba7a84cbe3e823e2d4ef9df0afa1d6b7fc9dc719a6933bc89a3ea6075dd69131473f3a15c54f8a59726ac4cd86ab6833b4c77f4a57ddd59ccacd97f8e81f52dae0a6feb685684bd4f798dd99eb0b492d364b22304da8f2fd6a6f342a3ee8cf2ce8959f6078cc9615537dae85888671579d11596cd552a32ee40982e86110cdbbd534333e5b4b0d4dd821d83fdb99434342e0d6a4220a5d991cd6ed3f1bd32355552cf0455d48161ec5eca4394e0d91c76b41c0f5e86cc5cc808471854f70a0e83bbc80176579824aaa1c05a121d56bbc80abfd80d42829f246270492f334d6590c0213fc29e1630bb7ae9d2169dca6a4e62624281c0c7cf88ab8d0c95b4e12ddcf76474c59a4cd54918fd262a38a67a4ff30278d39a4cc396b0773f2845a70d8dc884a7a4e94ab1f1699e044458b466b8f7926b6762e5cd44647bc7977d9600407386f4764cdd8d3fc5a6141246a6c1916c75713d117a8088d5c0911d5589e13a9f905d9691728878f3716430500992e97c55ecf3aaf48426eadf3816bd7015f66d469fc836fa6dbc8bc9763f9b34929ee790370359082575303bedae2ef7100ea15307c9124af2b487f4c36988dce6dc4c1110ff6cae36a44dfab582f39bae77ed0bffda5875a43d70b39df6e266c190b6664732cd8a59dd5cf99af8d22c50550ded7e01e467aec7174e46f0eb511706ec5bbc1dda545b963ae2be154d4867522a3ff6c4bde7ef707051ab4777b96d2e3796cc529c578f57007023492e112defce4105e17836e5dd9faf2392c9e152b364d24f29196bb3eadb04e26c8b120eb458e02d5570e745c8989a860cf2bae2d7c527fcd78fffa2a0ae4a0cbcc3e5dd689b4b15e4395bc90a990fe72c06c49d8d57a74a838c16f50a422c023201350c8e2eac4c65ee0b6ea579a611859be6da66b3a8ebe99366857c2cac83d6303b83a1beb989b578e79c505a0896315688a114a406c372fd4a36d40ad32c24d29f665b90db211a8b7311484049be543d6035c27f10754b1bfe2ef3dcc57923dab2819ce3c2de0002208ccce3a89c81f3ee8d88645bc2c3bfaefddb1c286269d6aaba2966de2f305a97b90c64bb67ac0e0933cc4cdd861d27f8c54df2e4d775d8d5ab7e48b825ac5aed491819c0a74168230109b7220a1ce231a59dc2c77149997806544932a2f59d4eeaeb15bbb1d4f064949f863e4ee640babec0d969ed3c9f51a1721015759d104e9b6f83bdd3f2f4eb557ccb8e9ed8afa8e211a48defde0c42e55bc44ad102611e5104370eca4a2b28bd1216debc0a0bb659fe6a8d4b40f2813c9aea27cf7c006386f049395bd50c77a0a83fcafbfc79600953a9626dd3ddf0e30ae36e7827ce8aa93aec9a146e04ce289177cb2acd8d38aa80d2e7da2f6e6bc688c46ff53b5494260bc9ac10ae3b9ad4bbdc0c2ee156e737dbead3861741e58f12b03402c1bda38ac4b9ae58b312b468cf7e03e7a3d0769724fd7a24c2b6c37026158e80ff0fcb65a31cb1031f471dce4f2719bd4cb56773b013326b18cc40e1b982a374ecf29673c75364da7445a747e6e2bdf2428c8e7137bc5ee923c60526eaac1d7d89e77c983a9469a43299272fa4662f8786957720f988e1e49071002f79c4536547ab25f50cd969ff643cb502b64b0a7e70668926d1b86d0193416498134febbeb97d571d89e79fcaf044908a129f82e9b0e8911ec39bb08061abe4e224f8487ff0394b22f2f46de9619bcb45042bdcd3396b0be0d337dfd1433444775e6c17be52892cd9d65428db381c5879bbcd9699cc0f16190c1ecdf217d3761136ca413878bb2a874f2c5a5ede8c4c1940aaa66946eac4789163c02dfa94e3245aad9b124897c8a9098e444e66e1aa93990f1437d62b2d95c62fbaca8615e7c0ee5ac76887f2eb9865b3dd9b837adf70c69bc516efa27db985e04bfc04944d5f1d81d6b270ad73cd80b2a72c4f96c243ad7c57014fced287e3055560118a88f8c4f07c266528686030f458f58dad06d2e6e5040b411213eaccd3a820bf7d82fb109b8af28b7b86361445f0488940b6f7ca48fb0fe93c716b6c3eb253888830e42681674514552f80242fb5d08dd0752374e9eae6ac68387d7296c62ad4340909c900f0c25bc84b6fa74884b502787256d75a6a74d780ea423fe456ae079f0da730ab43b0970d0e55514f9acadb6596ce46841effc8a0494421cd83d84da3d50952ddb4e9f3dd2cd4f7d13def6a6960b3948dfad36577137c589cf2240a95f60928676ac26b6f03c1a0771839728595c2bcd42e0c4b0d205f38d120e534a69e4dc4df04eab0a3160a6b81b598f620b8313bd4c660ca0480f4a5313b02c324a169b45a5bbf506fbd36b269bccfca182c9edd56139f1bb574c15569ffee7097b54de6cd526308db0392cdb9dcbe6586a013d4d54b0d800c1143cda812d4014206724322e23089c2cbb3dae362557b0d5fbe0db21a4b8cd069a6bb435313c514b6cf1bc984758b9054a5b741be6a67da1e3f13d3b2657633b216297ee20db866a7ca34ad6c9a011286b180d5e89d450854d21e6e26f06008ed6b486bd635e50f6a71a04467871806996965195405b05586ca45337cc5245210597b0770d6c9fb087f0841c896650604d4a5be54db55b682d726e0045e34888c6cb3f44ed21b78e5b7583dfabcf1ebc46138f6b59a30f816ce2ec9288f7d129591f422e1264018696828b2e5498d2738403ed8f280b071c74dafeb0ab27a5bc22b70c1214301cd0abe059225c572581aebe581c7b71ecf2cc7481f0acbdcd3e8ca0f02c829f2a9312c5bbf4573783cdee6df8aa512db5e418c11b9840b975859a9ac3bb962c74f92abac648af97556b435159b6f83a4cd98651fcf45633b749aaefe26ad15ba565d3b922c927538524f2e0686e6be7e3879f6a88436a4b798bdebaf461c335563335d7ec4d4ef810b524d4c883cddd8c1656fe480be8f63bb03569ddddfaf0c2880dc1d17530d9a832a5bef9ff729aa5cbe59c75372846a79ba3102d47cba719215c25652ee3ac264fc1b496ae668d85cb7083d4ddd77c79280f4f5cbc19c5c1dd39b1f92d3acb8d83d865927e873aea288941e04f51946ccce313c62eee9cfc26130ee18bfcc5a02f4ea19eb3c0f2f4f740366abb1fc199d0a603c90fef13c3b3ede3d4422b714dbc150ca278f50a2f7132e0b6c3d68dabcb3af5e2bd93ddd8c013ccb24e3e36cb483ab1f5fad65ae8a24a135aeb4516cc29349de02b2334fc42e92ad9e106674ce3d4d0287d80293b2897382b954f8f040e67279e4c1f116b6b5b777b51e2a0bc80438dd2406c2da00cb04dbaa2c3e9ea9cb7315022fe5bb03025fc85e4b853e5fd49f7ae0f83f83addf427630dafd03c5ab391734f255510e166c3adec2325989a51810d715e031979de12e289ec574c04536aa56cac1a1bbab7de94b918738cf103b427c5751e95da33b2a760d41148c411674cf6a0542954a44307ebd4bdc65a653af4f80165e60df92850dec7a84588959b929f99fc9432ea48df5a593fce625d3e2ef433243ece4230cc3d015d578b41f183e8d07f1e999aa09e8beaf6827df7cd003e430b11a8a89b2097b84662b77b1a24840537f1906c183a34f7e997689597db11e924fbe94c22e443fafcdf2050040fad4d9d8ff043643a136fadb908f8edede1bd265b7cfbd621eb9676d934917726cbad248a53a33caa5bcbede8cc2901136bcd575940e08b076b0ce328b516f9d496a21ec416c93249275e8db92d267eddf462c26b36caff620ec9ca86b48fdb624a6fa65c2b86b59345be98ef171ddc0927b6c6e009c42d0a32b06721b798e82b8ae916435f93fd95bcee28a8b64cbf8602d11f48bb5bf78f10e331701629ec2117bf278912667d8c628fbde47f0ded3068d6a5c4c575e7b581e920ab8341bd7c0d6c424059a490321185c70336757bdfe1df9c4ff85f4e2d9cc6dcd82c54375667da9f20bac3464386d65da88e5a709231f7115be4eec5059ae911adb158b5084448aa5fe3426e4a2e492af50ab050a146e7b89ded71c1d5938fe3fef170b84c08ddf2648905bd214df6dd94398980d2c6ef7ca0e8f35a3b4d2c78dd6b95fa31a7d9fabb35f215dfadcdef395905b1389aa782d163e49626fcbb8b8187ad981b3800d331f2a384198b98d4c6e095db5e76c31e0949667014c98efdc882d184551cc1af8f608d2c18aab8063491f0aa27206ddc796aa0891218c583e67588164e6ab23f3c18160c143ff67638d85bdfca873ea2b7a95262648cdb8a3b2cf64c0db22fb8c848d455c6f575d2e9af63795b44b10eb773e293757b14c4ed552517f9baacfe780932df19c18251201ef67d5a56666e4fe7e06c3d622fcf2c6331fbbe5790353ad622191c3145436e43e8b33b8c45c09db93f80b77b23ec31f25f6148c466f41e4d270b04d4c0beba7f6a7788f79c9e7f1b4ebcb06634dbdb20ca283ca8a8596b28053e56bdd4723943562e542c2c88d73689e50b096d78c74f04390e3eb10f54097a91ec29928a9207902b73b037408594195ae0b9658f3cac217002e5ab71e5b448a32175e4cd164e355f11ccd26441964dbc3db7eccfb27bbb65679789a10ec109edbc60a2e8793c842d7b0c0a2219ec550c8d9d04381a431a41e1d4e5c7f9f9f192be4b2f188a223bf0f9f109396eaf57f0c55a5e063b34114cc9df22d8ae2ddb49e0c360079a10bcbe59624c96bb6202a50bf6428c4363d516ca8b33e750614ca58e1bb72717060220fa2d2cf3a2d4e72de9173a9eab61f8f464a1e56edc1e1d0280a2f7594edd1abe3c6ee2c8ed41938d4feb4d50574d49b1168e2bff7d74d76e790016faba103c30900278d58d5ec2327bd980dca03c7211585f13d78f06df3a7f54beac95a8fed34d49db5a080ef5d4242236ef2208d0fa9e731b29c10e500972d776aa751db54ed50a79e232b253bc4652656eb74386e08c5931e016adbb3d46d735d1172eeec6ce23b15a4de1c318861f5621cefd514f798118b52766f7245f93bf269f7a6eb501837f38134c470a4fc591c54d0fcaad7984f767351bafcf222cc1916d1dec2bfa0f188b2e62586309ee71268d6e4a2c8307f44485419bd5e3e36a4737425d4ffa2078ec0366bc60bfa4e0d5179b05de949651af3ff17f593a07442d2f407353f0dea9154f620deb7927b5854cacb40566bf67c592d5896012f2b8395ee4cee2f65a723ed0c776a90c2c24ca457be678511ec67cd7a19410112c472848eac9d020e5bf6c0d88b2606806722dafcb323325703efb9b44ce6045132c3a5cf93b355d1d4762dd8cfb590df85e192b8d675d8e54b99446e915ab480321634036277003cbe49fe2606f5366955787a23ab085a59306b1f3d3aff61b5ea80a2095ba25936e8b6822253b0155ae797262ebbbf49253568035cf625925c07087d8494088f983d8a3b5ce31749d8e42ea0a01b4892c48a6224a17904ca21798c4ccb9f12b3cc39b9d8f756701c0d66aba6c60043a012b81f6bfe850ed993211a5df900b6a8f473d762b778680b7a049ff91ab97d520cf4924d5b01d6bb42c4466d4d2c63725f83ade648f3bea9aab74f96b58812ba31876f8d054f32d07ceb63c4127955087ed1b53b5f6b4d753d274d1790d3795b994a860002f97f369ce6042a8c434111caf0ec191b8b171e505abe32883419ca136ed99d77e3429cab897d5b2a46f77dddcf15e81e4c292fb8130e094a1b13158b4d315fac1cb56784f8bfa8cc4bac21793adfeaf43e3b72f3b458d8d81066fd9d636d490f4b733ef160cadc8d890592727e5fa6a393977b0c57696511bcb776ebd7f976f322db442186ce6fdded6097697a686535d09cd98c0f6a95f6885d761fc7f1f105d377f85584261f750591f1f94249139367836d1387dd25ec235c1d700ecfe4fadf44e911faf1df6bc5e12eae2961050a609f99fa4c3f66239bb980a2a492b5a64eae164324b5d7761b49aea69c8adb37d832e7032d0a041d402201e718e29fbfe3eb633185995e1e848da250b7686500c132733b40c41605077dece7c5fcebf10c1b83976f9dc912cba624a08b64cecf20df211a3490bed2f093edde5fc6d7e4957d9c74f09dc88626a6136bc3cc55f607909a1e9c5af38d4d9ef16ed6d92e2600ee55d130872db418fcbbe23a8d37bd4bac0e688f2d669858b4f5c258a5af97b26e5440b13f7ce517a9eedb4d6ad897403979644596a1d306f02a277e1c9c76d89e9353c1d7045ab90ab6197a0647a433a6c21218795b57bd0d2427962d057c1b013c2b03772ed100242fe40818444c4398293ffd87422fa2c9f83548d9169e9e7b578569a05c89b245e22f59f4c55758e942fee57c42db33d874993d496263fdd146162674343e5852e65136b23b98a46ab0c7a907e3c8d175e76fadf384bc60993bdd784fe919f585f6d105c39b299b80f39cf4a4b44decc421371c1db23d7cc5ba70043f73b4501a47e6e43e9cdd6853c182e69d57b657a370a80ce30ec4d81dba877bf005bade09d84f4e4ce24c3d47d180b4a1551b4eadab3ca8c0bcd111501c5ef9ffceb915adf368f364c0f4abc48e0e32325eda3e139b904a2b01293a88c8bf8da8b50b2bfe4da64433c66b50a7ba47d56882b81ebb733b8a4aa5d16ae8de623485ada78d5c87b2e001c783b8b84cb4b0c2b8964e985f04e0218c4e8da8fd5576ad25735fe70371e065101982f061e9197b75a5fb87bcf7871479166c1eb420f96985aec42e9f56c01acb10d7c091a188caaa7758449fef068c420ab9fa7299618899fc4d3a0dcd00b8d7537f400839e8e28408d55f9a99fe6d0050a5de6dcba337544c108e2ae71e883e3aee780b812f88edddf472073c377c5452969952a537e5de6372da1c2689c18fe038a472ab5e742ad61c7d4606b30d98d7ed0843d7ad4690f489d901fc333a893a3e8fa676dfb51494a94665d6e2f3f213b8c04f516704a216dd47c6cf2162085dacf9c06376fe60f9e688d35e4c97c8d20386185cc48f556f1cd395c7f3a492cc2e136959a4f05cb0be84708ac56e1aba75129f1456d874b74f1788db8c8d1da72183a5b24519d0264eb7a8ea863d96b2603c76e592c25a71cc0d22b7d0c142d047a867e43d4fe21b39216dd2a2d4ca4c8cba9f5a6bffb1799bcfbe3e6e5e41dab005d285e6a744d39e0425250b4528244b80eda2ddc4d2686dcdf4120d9027b14bb70ea2e03c32a68d71cb586feb421fb806ff089b90a9eb5a809b96ad9aa8ece3166c7f415c2dad714fa14c6f344155b567ebfeba835b82bbb06578a17959ec13189e44807354fd6eac811dc674ac748c28b3b6b20eec3a97d42d948f8456814512f440eb16344d79c5dacc02f9e5859afe90e051e8cfaca03218c6695845968181991f5869fd9d57fe7ecd53f5cb2c7141dd5ce9d9646954306d07efea29fce502535de8953d5ed681b1872241eb7589ca5c79f0d42ceb08794c56b7ddb869f75fcc8a28245ce3198d4875b4739b02ad28384c65b8c2740e43914d591d6eb064ce622f95feb007592082472c02a5b44ac2da580f5a4ca73485803f4e814ce40b65b71586231de1829694535980c02ba85566b9e54bfc34a81277f0bbef96e4df60546382f8a1dad379549136133da853646684e36bd9993cb6692668313700ebdedd683a65babf356e9436bcc67e513221dcafe34a092d113bb55223644eca266129da8990c3140bae2af9f6a452e28b04298d988139225646683112c64be939c2f7e5335eb328e265744103723aa3f30c0c4e1e1c929a6c96290177cd4e06d2b44a671c0d8b45357cd1134d57d81acd39bd0ebf62f3765038bf621448d10b0bdbd858b1073cab64a6c1bf7c39ed10ec1ad36c946bb09c71a66fae7a9fb5a013aa2f45e4c18d3a3e76d9ca9c381eac3325ec67f2eaadff6c01ce2fc0ee08744a34d447fd0a52467a8382d2ec745f8bc75cc57ccf53196000aa4f6da565cd8faa726d0f6dee6264bbe46400bdfd2f6ec23f1972ecdafe860d76f397bd135d3a74349767d5d7155dba54c409c15e6e3c71212225a1b0f2039acbaf8883a7d6bc0e09903a2b2bf518ea391e897e4426c454dc570946fa7440bb3ccb62e9225eed0ba25b35508f137627d46114fe3afb1091d85f7e5c1a2d50ea3d4993aeaeee101d7289e74b8b40716756b27ae4c9aa5e3519d059e303878a9cf7054222af30afdbe743ad99f53058152c24586b06133f836c6e16c0cadcb9ef41fe50ad84f7829f216e08a0aa25a3828c992d92da3c72a1eac348f9a136935711fc83913dbef91e4121f4037749868819045d4c97e9c8df1b348e8ad724dc0f160f7e9ac50b7546b45fe6d72cd91b88b1180b80e7e87b261c17cb4c3fd172dbf078f71cf1cd60114342dae02810f2c390f9cb920451438b811c93b68fb0d8dc2878833930d27172ab53ed1f6176e1bb20513727b5ae557f3adc57edf1b7800238aa988699de524570809d18397ba7ce4b30944a91490846d550d0ae8a762cdce2df65f7915191bd2f275245026867150a18a51223585513afafcf13481921fb3f61dddc35b4e5454d6d11762f2306e4c7e0838f05542207a1254bba376137115c24bb7a4399ee50e2f7dcc668fb888ae82f37e2d594ed567387abdaf284d7ae0e4e1c56fd75d8f5b24eadd3a94f107b02f02d37c226f679348cf3d3c0d7a42491d21d3f98171e75e0c208a47ab4b4a32050c3317757a4cca29fd0d8c7c672e94eb02c85696f8d985d79c8b21f624c31febab3153aabe275b1729248435e6438b9f7a8e2e424d5754d69b44fc73afa6b1d23a7f19617c1b5a7130a902a267740a5f7e5da973969ca48afa4516e34ce2e1ad9b4f52a6ef197030bf27663a34d673fa6ced37fc82a044af5f214149c2dcf99b10834866512b16db42ea2f93ed44376f88b0844583791ca04057545e66cbad13d2384b5ee738c47546b64c9c765ac6cbb626e52401da95f315a172a284a8e4eca5aaab700d9fbe90101144068ca09940837a1a5ab9f3f494801776bf5a9750230c98be899d98b6d8587f7e5e2915a161287170c9689b7da15d99a01a9a3eee6422deaefdc265cd65504531114fd30d800225efd3311195d0975b448cbf4928931ff70f1fc1fbfffb33f8937e2c85c0a241868329d434182959e123b420dc5004580d120fcd3c8eda29a1e98ce03e780881d06124c559fe0ba64058d82ebb831732dca707e54ee41bedf0d2f02823877d015d998818a3a63cc845f6afc6c82023ed95d8b90925c6f7a18edd906da0a5cab62c85ae9c04c209225948b3c4bcc5c53ebbd872fb3bf281e5b00721f9dd2344f0c0b5a344f0916d02e4ed0ce40a38e6af79f156083b35e1116223d5eadc98ccc9b3816b88257e6187a0372709f26f9f2256fe744b7a49885e41b434e0264b441aa1a98f0e4d915d89856d1af9179298a7654851da3b642d9cc4131c9a52efba9e1683e772a793e4d2edea95b20eeb2883d212fa42b4795be85e1580f71ee2eff8458e3ff2a1b49fcc1a0b4da76e04ea6ca9b90507104d5bcbcf62318b2877c62c24cc11eda5c1dc9c1179412a4054b4f2028193a67096d2095256e9589791fbe1edd128ecb805beb82a37639c6b0c243b351f93b0fb0a892061eeaace2fc0256c84ef0032e3a8951d27d1550897b07a21f5e2ed31e671fa198c76d5bf12ce1ff6f109c79cc48f8015af107f77f2b862a9a3a12e48e4a6b4bcb74968be534688958bf6cbf2f694aba2c0e50068d2dbc9978acaf21e33c2534a48ed044735b1a57fb75a2abc68a317f0beb8e799e3aecccc5198f7b39cfc1f330c66583ffa7c3f66122d40c11cdbe53818a97856daa051e6e2b03d221f9fec210822bc8705fe26e20c0433a41ea1082d8dcd79e0adb1b623c78257aeeb6c79abdfa428b436ed940c64f0e40ce61e20dcf14895f1c0cdd80a7ee22a09d3fa91316219b1ac3725c7559b18873be6c730d65e7e2ac1c2ea6c228920531adcd85e66daa411384fc76f780ed06837b331607c8d0d1e18d6363e6e5075eeba2212e985b6af168ecd439794c183d38cfa6b4142e04a877886f80a578642a1a55ee1573d5ffd61d682ab2cc57dbfeb234915dcd13bd5ed6a2d50a8022a2eabfb118135086a627c27016b1ca17475ec31fab5c73188e67bd9c1b540984bd4a70e46a62917a4500f0b5d058c995c74d5ff2676f897d837e0cfc11fa8a408061feac5a8724dce74cc41c91eab62a48e2be25195d66a7f841ab135a56a5bc9e64ce161c3c156cd9bf707055bde6cb889c28afab349a93832303c08b6f82b7a7572d80a0c0efb6edf9123a3c5a9513b53b13eebc8bfa5da07b2a5a72f7391849e472820bae446d0808d5bbe4613d4d8b1c98adc4e6206d90840ee460170a9cd28ebf41cc126b54227adda5dd26adba8fd874dde316852a6f27d7441a2a3221fe46ebd5f780f21d77abe0916a086e4968c964efa937f2f2486e014c3094dfaf186054babc7864af938623ed3c0be3602dd20e37b11bf5ec588c1e1e82707d9bdc922baab90d8ba78c96e0e45556a40425d639e3e4550ef3c0698e541046c47b85917b521ebc18c8398516c0da2ad35f0ffda6fb9abaf0b8b6f5ff2636e5b5086537a6f512a2137c5b209bb94f7b092102067e52426d02d87622c3a86d81fdcaa9b571fae25c5f50aa7f2111859b9bb6b200f838fe36486b935eaf20611f27381665a97afa43920ce3013b62f0160dbb52e64dc9bd31675567b4c8b97419fbcc1bbd80e342847de462911897583dc57898ddf4fe3f9d2fe6fb75187b1021ac35c2c10e4dcb3a5cc2b15911e1812b921d79b3e9d1f39d5833c9de929d0d06ac6c9b71bb0caea6ba90cec9f5b3977d83fcd0412289c800703161cf40b7c89740f7fe1f03e226d97a30474f851d402a88cbad3e16de4079f22e0baef28003cd11a8a82b8f489fd9df0c9c713fbc348202e48f3e24bfd4e8094701159a97f35d378c4f926f535a11c251c7372b0bc6b527fded5c4f3de11d6a120bc44f0525858d99ee036aa3062ef140ab6355000098c37c14e167713f485c28ed1be2e35df98fccc84805f15b74c262beb35c9c148656086a540e2b027f491b6e08ba409b070ca0386940c1cace44f2b4e4a81e4d38b404506adc094402b6beb329c24e578844e0b0913398bfa3741f64e371abf3bc30b737e6cdf1da88eae298f859b5d5937d55cd680bda55811f9f24731b4997168de5e896c1dc83032712044ce90294a54a5d703d40ba73523021214e29292fe4217c53ef313c286c0861ad0b424b76606c183cbfb0af1cfe945b0d117e58ad30bde837887171dd11801ec082574f8331e29ca3bd752582cf4e6559644af3808580304f0c2fd5343b69c9807705fc98db600d52c9cee43af5de176495ac7ee9abb7886f31a1ec5ee60321c4096bd7fa513d82d4de573ad6d91fb1dc8a57ca4d24509d20997618879a585f0a06ee639ca66ffa8a78e5fabed09cfc2042f5ab71e2960df79936d1346a4a1631ce44993bcc6fb53bd2efd5770853b081dfa6944879d822abc8984a6bf1d8b4b190663a001dfbb4dbd2379ec5c21a0b1309713c0a63ce8e0db91079c46525d0f27434e3be2dd52b9dbac8d9dbc5a0dd613d5a3fbf8bd279679fb019ba519fc7704766bc44d997eb98efce58bf02a2481eb83ddd23259b14a9a92bcfa0af23e4739264df77238e2c25a0a26c3fb564b2a6aafdbb514917559c7376c07c62c5aa3da013b9a001b7f19b0db3e6d8fc0727cfcd26be6929f721f204e40dbddfa2ffa45797b08f870f6a3f0ca2738507d98be8a80c2ffe0b8a07cfd80dabbb48b9b9ff9b7eb8ef113973307e8e2c5a50f261097d54c0e435f6418148c733281cc31bfc9ea53484ead400d4462927cc812c5bf2aa664bee315ee6b409900cc7e71baa640079768b7aeed6f41f22efed0792493dba054f7e43088ee9332c1887af7d4e2f5edb9511294f70c4a1f4ff82e3b5fdd0bb3666d92fb93b65590c7b068cfa378dfe5e653f8be329e0f86d60775bbe4fb665c6a20be4d0c995f0e1fa060d1328802fb0846baaaa88fc736bc6d73986c94f9234ec521ddf2fd9fc32aa851b38adcb575cca8b61bede1e81bc531ef2f194972bd712e8a3b807bda5175799b2f9693261316525a824f99b7b0bb95483213ad8c153ed0da04c353399c26f23cf90aaa2c0da4db07c1272c4db047acb8e39636a9dc0d61e5d2bb3b4ce8321146e823a6692c3609fc0b23ad060024c7c8301d99a05f7c418fd2202aeb1724ad969fa5ac66761b1a4e0dc0bdca8d5133f2a5275c4f6fa6362f428a18149a8e551fd49a90263665d82c88363c201e451f79906f5047ecdd1409f959c288f19a5170cd15a8265ae0e43a8c27f52811da31f5a4292ae01acb9e990e333976597e3324061ae3c258069a8bc1696b102014b27dc607222621c7c2c37d3a0185c555903dfcd69c12cf7768ca6643a59887417ff0cd9bf90fe8d3cdf14ae074e56cec4eabc51e723c51a35008124d0a4234a4240003701b3ea2d9639847f2b468a3324650f5a537071f70f05c3ade0bb071beb12c6cb7ca73b24bf4d5e6f4910a8225e62eafe155730cede643cd362247d42b5a200e23f7b6fe46492f911b01f910c05456c0b210c0e697e4a4ad432094599e1268a7088cc5ba9a6ef48b039e418ae512d86e96e86e7e50608d3bda774984e2faa22e2703fb2d1991c2a48c4da7b80dc28d722d83c3369a57ebd8a96c5d88deb65e40812872d43cdbc2707d0f70c67063f06c878010e11b7bb58f863cf545b81818dcb14d6171edb7e4a2f48ebc81d9d1113d95ac78be7aa964b53b0630e680307c42bc2c1fefe16b8e0e748685d9719368dd1b7ae53774e14bc11cb22e6152ceff88ec343e56462344d79785e60bad0a081ff058caac14814e8596b977c7f924260b502170e58d0a3c387b50861e4c615735f69da69301e48159cc60fb238ee2b378e51c2537781bc32d492a0f57aed8e12f296e20da5a001e9094b0e312dec8d0bcba0a60a0efe6044ad3a94553266559d86c1a3a8e4b451fc065aa24995ae40c5ee381ed82a580d983d865d83b9997bdd02c570f0a9879d1158ec059c0010569831e78eb3c482a77f2c1c8fcf227f0d7128a0ac460fa1c634e4e1d84cea337ae915392ca23d252d320cb611511d0c9febd06795c54e744f2c00227959a67029f340f8e8bc51837478f2c4aa5503a03774e03926419530cc3c372fb8249a7a2e5370b22cef2110712c2ba151dd6279a91a8386cbb435bd9392f22c508304b79fc0ee10b5497b4a28594bb697f01c4caedb62fc3f3be271b1c092dab0a4b8a3d9ef890bae7284a0a562b115c5ae8d86bb508878059ab170ac245ac291c1406a79c1edc7d233d20298fba9837868a42848540f6ebd8a06b04a1e91b07f4900a619d8012c4d1145edad88f1c07d49214dc5b75b516aff81fb237d2849890b5b3a711bc7c661e9635d44cb550ea8b883289ae737bcdc871e76dce438d2c415080d4eb8841c9ea3d72ba0d5a493f81574e256bffa7ae6848ac0e75aa0e0248ff4a28af4b49396290600a29a8dc88f4f47ebe2cfe06a2e2049a02f4e45dc4bb1801dc005347cb83ee469e32bd301f2144978a5a9018a0b6494e7cb6bc4918437cc82fdbde1139989cf7856ffa11e400901b009f45d150d020f5e74c15a2fd1a4f830e650225c31604b74afe17d662a568173590ba710edf45edd4769a5f42a709901a0d9132789c77a19069ae3f5e19aa37ab47cb5ee3a3047a6c36059a88e5012621737dd004639218ebb134c45bcf09da211e6dd592972bf3f44894be9ce4607014e4536dfb343898762436cc712947905cd7e8e725151bad273cc7e134bb53544855bd903e19b4e200cfbe4527594d5733937b02e171e311b2e2cdb5bc0989af370095f9cd03221dd0bbbc9933ac862f377dda023ebbe4d1e940875814da93074d84437018cad2abc1a484a26a187d5c126c2fdfe460b46c89976b02857e086aea2e61fba5eed0e4c4c0f1e843524aad3723f5d55180701bb94b87229e9753fee6d56b03e8966697e69b605b941574ecf0a733941d86861c16cf935a2a514f88ef40a870088789e811a43462a81e5c85208021086f6ca5fda9837051ecf0a337cb68ea3c136762b654279c8c54e590041f968e371b802038e36d8c5df3570141671b5cfeadbaffd7fb269b428db56d31174064b119508b971e7917ce6fb5497195a05ce5ac8975bdc266732b280638fe83968a65c7e88e62e97e0a9a17fa728824ca35084c55d88da80d7872caa71d091774707b2a8d3e93a2292db0151f5734402f0008db4a08b7c2d8be43859c006a62f0e7fb6537f6ac8fc43d09b88f122d7c5432d06460b30c2001e340fbb4a0f323c02b8b412a447181a116844e1e24e11887971cfba6638ed6d1bb13062e85f8623e6f6936415eea6fd264d9a8e3551712ef325d48560567a96c6ffe962d00f5a059d7bf33da7fe2279eeebde8433b00ad5f810d7fb625e6b8ff205ecc732434406f51a5b86a62a33b3c35a974df0d0e128f47e5d49c0d2b856718bc9a30451d148c5f51e77425fd6a1c37b0d797cd6cc029a8ddedc020518f7c2c102a34a8b416dd85aa7bfeeea400ec3eb47405c0d611547925780f6a67cf6ec26464b70d8927a20d1078cdc01909d1be1d52a77707355b61ade20b1177861d8ccd01c435d3910b85906c78e6879c02288d5921ee560d7906f18223ac797160110207082dbf5ba5faa0203332d3eac7534ef46162a25742a440b13a882838b091e2ef1eaa0ec1c6286eb15f18c57b346dcb058d93a085ca04d7b24460d148395efeb08993bb5a67c800752d4f2067a00798f67453a921e5672101ac6f0b3dcc15e6cbd97f3dbfefbe76e5e2768d2272ce7782ed67188bb5158f769771b323e4fe838e566a508e3f8bdc84d1475b449da6266a665c098e195ed38c7d54408c954e59b78ae1c0f2528d779380f6a502cac503f89c02f5d1f46a8c56867e5526b0e604dbc1a2195c980d61831ff9831b8647e20130c5f3c900259e15d1da5695fc89aa2a0b1f3302c3adb87f068f868465af72d2c264a28dea23538cbfdacae66038d525c9e6f5b4b1dcae87ae93635308431adb0f887b8494c650b89f5b33d25ce5f5604dcd87cfc4448ec077ce6a152d0c954489c8be4909575b0052fd516c5305cdd9e01d9294878a4e01ed1cc185dcd43f318c79cbce8d09f47e57e1da7fb1741035de0dd0e2f4fe8dcc184da5b4977dcb84f94bf6e3c5c1ad2850e413d075c1f59b376cb0bf9c3ba1aad0fb4870945c70a4f376f67e24b04a640d0c4504fe5f13a292a32e54df1e396046768c641766cd5bff9ba508fec52e54ae1b05a46090004a69995b01d1a754d3c2e4a5b686f413b5a92e2b62130f37f1dff12d29e9861366a1d379a08bcafe3b7665457c56508e642bce2c202256dcf200cd7488f3348fddfd88529b0ab754fa9dc12a5b545355fbfbc65dd206635f5f44009a1a6a4bfb99b0d5990f33dd67207c2f14b220012cebec72616ae02f60420ca6a6b861e9613d4413977f618590e4f5849a82a09657ecb51477076b1826a6861c21755b9e25111417c13aff1d109f3611102f514487b92700d19115c9d0a24593dea658c53a061cdebcc2f93445565d83a1eb2d8fb8e5a300a98af15b30618237416ea8f41902f6f9b496d31e8d6c24cd8f5e9e305e0141dba80c835802e8fd4a86ce0517b2b90ead1103ddf455a75e664aa3c13046eb53eae20d1f0ec2171e531245e571c25da123dc77e1b06063bc2d890c870fb227839556505a418331498820de7f84d0a7eadfc689f63095fcd0a9b96d80e20a96e04d79f109f59daa0dc831b4f31667a84feca68d2c9bcd0ec2df902f0232e05dfd8f80668f0d8863105171586d83e878d3ae9e87562e2e0be0df4a7540bb1f62d22b28975dcb143384c9ffb7051a7377fa848816a1a6165216f299ac9f0eb3c13379a9a65a37c29a08f7b5ca60e703388040ab2e0f9f9edecac72f4450fa95024c13532a6b7679e1444e62fff8a9f4382d198aa1c0e4e7d0913fd01dcaaeacec8411fe98e9772d2690ea211e8733b68e596295fe0bd30851e067f3d5df139d10e04f95182923dbc7a04d6c17de6a5f6c18103cb4ba19d0a5262f85faba3e9aca6cb5fd9b4d3ffb29ab2b45afad0a6d0124b57629d0c0b1e2b71e859fe745e9254dc898a282beed28c409adc68705812561e10ff93b62177f3a71620b2aebec38c32ef21cc0a76591b5d1a22674d002a87203ea46e237119404ed6ce8ae1b39b961bb33f6eea42d498ace063f1a1f2bc32a123d865c1ba36d0234e472b9a5f7bc7d37d40cd10b08742de7d0923ddad89ea3a503b838009acc9561881044293aae5cbbd4a19190f23c064e97eed720669da61f7c0752ac2a2cc7886e6ab17453299409a888059330ee742b6322734b89791f550bb40bb6cd9998ad51508bf2f47e660dc2b3f922d45e58b98c0528ede4515d416b711c7f4a12d30532aab07aed285075441aca0b029060f93b363fdd34e704ff392c5d88ebbdd9c93f34a06842252d65b63b1ec5ae10c3b6d76c35bd25596fe83515d2423c979cb01c199d2c657ffa60acd52b6dbbb5b5cd6a560155c79efee534d6b158c0a41811e292878cb2f01e257b200730a05c943054e2ae1726ab063ea6780f3838782f41d8cae302566cfe669a47ee88af71320e551e06332a6bd73038e08f24f55b0a01425b1a2ef917f3217846ef50b2dfc6ebfbd9f105c66568c5e5c7551da47065e5d659cd92415b739257a668c958701491ec3bb4266a9061dfbe8be448852f25d525debec0316cba2cb325d1fe09dadcbed33122953fed9b0fed4bf6319f810f45f6b1f58a5ab2dee38b6e777161af5b8ea60008d75154d7d7354ecbbb6b7d4de39877797def1affd8b7ed4d9f0fbf43e43c7bfb116b76ac33932fc27d4107fbc987e42fb8597d8c4bf8cb26af6418f2102cb245a9792760bbdecab359e43905034e646a4affada4f844e4536d3c411e9623ab415aee61f215922b004d98c18e71b74ec2cd92d58433287efbb9700ad523cf24aece6b30d8965c4aef6cc41972859d0be6473f5ed05f476295ee252b5ce5fceb6c932d3e2bf695ba16716b8507a87db37545359747b77426a969d7f10f2ca4d06fbc73bd752949be25b6a56f1829087827b2d715ae272b90d5bc20adf6475fe1aaec9cd74790df01e540f8fd3e93ed9441a09eaeb52c73dff7b71b3849b84ff893a0391c9f0085702b11f16aaba8ff0e3604fb50835b140af2a742b352179c89bfc0d4e013a98bc0d816f7d9c93f37b40b68d3b12835b3d1a759f50c8fece6258b5b11e2bf0bd0f9cf160c5d162b51755ee79d26218120c03909aee1633c3757a3eb91cb3a401a387ff8b24c18f6d31f6c92abff1b7969bbc4ad2d5b7d45c2cea1cfa1e622935c00539f6475204b12173b017887401e4be0ae67061c874d90b05495e68ea178adfcd1328ff7c08f01d61e4c389f1efbb1b462ff8e205bfe74f3c75362fdb5626e9f389455ae4caf39b00088fed13b1c3d43644eeb04f070d57e6b620a6c7cfebb6016c0897f4bd7568dc50cf105fbc9311391ed6bc3f9a93467a151c353986e030228e5d69068b9111dec876a91f4afc5c1c13ad3b90537f38bd235e915eb0b85168199f58b4c6474504bc562771f0833b41a632658b5bee28f371ca848f1636b73fd8dbe0fa1bcd66814b7843ed042d6743ebdd707dcdcd39bcb330774a616614f698a01f2617d236e2c8891d4860373f1917d3d4de40dbaa2076d69394033d8dfdb6caf37d1f53a030955cec1be6fc131cbe153cae0df6cc8646e5cf289d96c4e7f07bf035d10702e39742cb724f55299ab3509009c42934188929030682a837e984135e84bb8b08a481a948e63016477d93a377adc2a804cb3278fac40387bd6677205f9b3221b2ae8cbbd43ea3965b58c78be4f09c71ebaffc76e524aff609021074ef9b09a274b7ba62d601d05a50c31869fb23315d6c5d195aeee1171e15d20454eb4da390970222290fe81b0c9c795ab15a48da09ec80edf7067dcd1e488677b3546db280fac43a7d1cf00af8e7ba02538e711329d1623d925bff89b63829990a1e878c38994d687d46700e2417f18d087ea7ea9698c432e3101b16a0a4377a356ff10838e9c358a38ffae21e36865b199a215b9b2332bd7c920603e27367724c6c2df1292a9b13160282cfdda2518838b1098ab036b4f3b0b1a2fedb939fb6f3e4e5f01317da779f0e780538334fca2ea1bac5821f8385ec1f2ec32b19140c1c6b02860fdde082e5e446c2c08060bda3223c2e8b8d5d2648744dc435d2287c97e31d4ecc088fc2ce16bf4c05a8acd1d59071494793b80ee41d44432de6b8480b664df153a8020e6c140d182561b8dff0edae34acd750c18336bf9edbabff981c2ab4ef9b67d6e16ec5975b93575221e1a8054c811da5dda424dcb9a37c873d6d48c7b3c885fb395892390fb84e3a38fa142fe24f0ac0d434ab14c25072d2de9cad4943718fe1b228592bdd69964c789abf7390c69c1842ae08ec325b6422017d5d23bc69484b70815219f3077b966253dcf87cb17250b4ef00c621b25e1f5cd123c30f04a99516a831e3ade53cb3f224cefcb900d5207e26797d4a44844451c0d9b067485f68ac6fcc03db623dc99bd6395cde143f0d2a3744eeb1597435ff1ad5bd2b50e8a5ed591b170b35415414ce271129aabfe8fa9558876ee508f92e94eabcd2d755986d5793dbe36ef83b1117a7264cc4d741aa6135894c5f5cf751d4965fd55e3b2e17060d33f45a91583d9f08278e4adb71e0e26e864e4e079a064d3583d96871cb60053f611c0284eea9bbaae7202df7cb3bb10e8565aa827c05b307209c890f73dcb4ea156dce923d578fa16fd5db779597454264772701fe9e9f858758750102f7da75791a8a1294e206e0658efd6c26e8965652d4892b7514c70ac83f0b998d7024ea34d515ab93f85c82ee17e43d01f5b7c48cb13b687d1ca54b1640141200800a2f56911a8b8aa82853069ddaf66012cc3f6c1f8a340bff67ecccf45bfd6a9f031f6f37f87d6d963e7f2e93c557fd3f7b3b28f4a672c4ea00829584abfacc4efc1c1ff78574e5b02a8bf9ff229bf1e50bcdde0603e3cafdddb374f19a5dbf4cdc7ec994745951d71ef4f39946dedf04b483c4e8d9e39da357bfef40ee0914dafe5369b2ebef0cf18d4535cf0ee296ee3bfc6bbe9040f71cc361bb368b68e1f3b38a5d0f35b357d1f3e7a54792d9b1af5a84f94d3616e5b9c577d42072adf36e96d8ce1f56151f7845991e93cd2a5f023c42e254cad1be990a36396d0200a21116a7afbf10c308dcb202fe115a264f12084b31b32e1988e892556aa14b68c83d657cb9fd74d80fac6266c19b17aeccd579c48551421065f59f90b0eed6e51a8d381e3ebd2a5fac1e93edcc52ba959fe687dd0bf15a62d271691236bfa5614a2d4bd80a91900b91bce59b227ef8b8fbc2bb3c221b1c9d4afe1926d7fcb90a5193671d2c0bc7f0f9fade4a8c742d8e9a8252056f937a771d53cc75ae83824c404fdefb0dd6dd4ba93acb1c6fcce3b7e0770705d6cbf30c9cdd9a02a6158afa4d92043ac6a2b05dae97856fd0008e417d6345036829d8cd37be6322a20bca1cff5ae6fd08c525c8fda31a151fb1661080cdea5858a99f3a5e25552b194d025048441370bfd12bd187aea4f08d8d340512e61a7823723b48770c7fda02cd45101b1c276799180bc375a6910383f93b60e62789c3407e587322ff0258d8c25b5ca3800a59d5d61655c919dc3ec1d2cc3de6da90a483b23c0587dd8060f586c72d02525b67f6d3857eae8e80ff881660026376734314003ea52e3a3654ea6b3c8b0877266d6239421926fbd2d53dd87ab40df0c19e466c623534acfcdd593eb5f72af43b400712ab7799aadb6f6da7e95c97310aa43d9451097f077dd6cb601b6a4724410864696511d90ae181b71b23af5bb7a2d0129da6d43ab643a93748c6768b5f5e91128106a363e5e020342a7661e8455dacf528d5b876b59a711597cd26110a0175b8daecfc4c646b395342debe32b4028e4567b4d7533b4a5bd22a7eb48187b1257b53e49356e85058dbe0f02a1d4fd1508319bf588ad3e4bc77a04565a3e27353784a3469f0752ed1bc76b49bae667e9d6edc955c53ddca6e9bae21e56dd0f4128f38ce76875ebe3238044eb5668d0e0f730a5b9e1bc2ea5d57e226dba3dbbaedd866cb4ae57aec32633d5fd150cb1ddb84aa5b77d4a686f0a071abf1ea6b5b74e579274ed0fcf408150d359f55be735298df6b3274069c3edd1752e7d732bad8f8f808110b3d94fe1aae62789d6edc95522bdede3293020746ab6eef674ad7219d6738b9e31a7cfe01564f314eda535a6bd02c2d161d4a8d18df93344becfbec845f89fd4a3acb91f32e5f7ebdc5e2709f29f0cadf0bc7dfc0759f5707a7bf03fd90a0cd1dfdef8db5bcfff255bd090fee84dd827c9da6ed737f704e010c4e42ec41f7b77e82f320b1ea2d33fc92a70487f7ba7fff4be1f8028cdbe30b103431fbaa0ab7fbd88c6004fb9fd4af5e0c1be917cc85d73fc4163f909542ba244883507167566c96021699e0754e8d9fc0f5edac2c2d4046b4a192a2681e1430b18d11d2454965df7dbebe52e9c90fa5e0de7efa61f5576fc316a36a17166d84f674080348781eae1d840772156751734d28d90cfd8bdc2cc791f874dfd7afcb572f7bfa39b94fefa9aacbeb2e6d8b11fed667f56b07329463e306c5efff263ac4fe08deb47c963970032bb1160c1d422119b9ad2497ed8a37e040fb983ff5af2b1fb7f80bfabed6dc251e13015dd984f99769bbaed1ec83c941d7e880834c29eee585be12f8bab6978e8f5ee0ea216f27e9daff5079901da399756d327c192f6a48365d869880322e18c572370fe3a0f724bf22fb7abc157fefada15473cf55fca1653a56a0464150784821d6fba4b0b0cad77b38815423bde72eaa24b5eb38a67eb1549061309d134405e7b9fd1d8a27af697beebc6dd580c624a21d7acc42a5624a22ce972f16a4a7c9c401b73501a611e07f285f42747c157ae801b8a2de289924794f86779ce4725a62d91aead5948dccbdd752219682119b45bba2d0c6854b04919639c40074ab1907f894662c258b4c6268f2ce49acc42c9cd23a5c674591dcb8bf0476481d205f8dcc8e8d0f3c89f0c2b5fd1619be27f8accff0745c3f9525a6865b10885b359a4d42f1ad2ad821a1a64818cd3109047398d50be4a96e37b6f5e9262853ee67371d1f8fbfa4e4d0ea4c31cfe6bc85dee47fc7439fa2b78ce2803172d9c5b5962665b162b28422cb943cf1b5b9e78b5baef3a517a9a7dfb372b6a7b8685c5ef8fbfbb21e8000d7be14c738ccb66a631ef7584aaaf4860d0740bfe0fc21dde115d4374e8d5da5d58e96d319179a91168d93c79f1d621bae6d1b792bd9f90812053ca4ed4a90502cc2536cb80008f171fddf736df8a7a62986899c8fd7cad17028b0ba10d08dab614602261ae2b98f31d3f4c47d68de2abc3eb6a4656437eca6b205bea11d53e8142ae95be95b3da8cd18ef76ddec7cb851b7622d506a87aee324bf452277d932e4b7f795e41d434ef7058459d3d0eb7ec64ee8d4954ea0c4ac23a448a20d5794dc2c380d9bb3cd28561104a0bffa92c15436b516a7d459e265472d9540c1c849657fea4b25db5f08d377f8b0a1dda891a8f582d5a585bac33aef7026b17b73e43d8e1f540d990ebb9fdaa4399a9aa65fd4b406bef88025aa7a191dd2554c88ab39a93b696307d3656fa01474cdaa63fa00e04ef19ca1d428e60e2daaafec19b7b505fef43dc6731a6c9e3b8bde6953f40b7678c6970b825e62efd77987ac940706b21f5bc8b4e69a19b717a4bfc659f88d2579cf97781dbb9134bb82dd5ff48752606c331234c1a71bf3adb953b59c563fc752e0fb1e3982f83d01845e654fca040e700e69b193ec82fe3e38eb87f456078e88d5390f0b20cdee94b3ec55c343ff114e57efe2fc35ef73a7d62848ff7dd405f6c6b769349df166b12aea1338054674c358903cf8d8b48bf737394b7f744544d2feac34c37e72c9f5a59bc2d557d23962623bc62fd3efb72b6140e3abf81fb865ca7368ed6d46a7a85f224ee5e9f6884aa0d9164302b3f80510360bf169168ec1a5d8b38bcf19e32d84fcea3be09d1bfc7d701b3fb9ed1d0fd27d9286928501bfca543ef61ed20a1d4bb7631c925b9ac320c5830d2cd81df5f8e8e0bedbcee622a6ffd305a70de82a53b876859b3abebc5c901de69fea666d7e609a0891b7ff40f467483b87bd967f0c6cdab30795e5d715d559c9fb8fd95b789651ab5318a1b92cdd0db88b63736c3f12e009631799c125d08ea60d12ea03e806a438a3557d2fecc8dd28524555f863638676a8df56ec46e602e7122d517ab4cc876155f1fd07a70f50f71cf09a230f5c8864f3f8cd2325a822734953e5bd85aa3ed48d4772516d543e691a7c759ffbbc39d0375e4972e4a8173d7edb990a66e54fc1212888ba79c1581d7bd47e255084917dbf56f8d26058f929534ffb48ac8c558bfa9a8b9db2722c52df3085e1ac2a87660af55c4d5685d8c849c8634ea0cffda4d91ee1674e2018cab89a554a6f8a7d974ecb45ac30513631651af6660f9f45c7b1919bdcbe29fe62980ea659c28e58ef0f6440d2a59b764c30901cbf4afa9d72b9ed69d275310f02fecc99548619ba50de5d1252ceae54035be7437774dbeb7799901171b54ad0d6540098b1667e450fff2ab2e125998ee843e44e9a6ccbaf69aa42a7108ca0ad3db02fd1ce0ee376ed3d0300b7fcb421f11af3330032b4d9a7f22415f3cfc5761776e880566d7ebb32956d0d9a33534d1c3e326b9faa744da12c1a491fcaa50fb5271250a65ea70eb7a5d67523797dc0ac05b7593602a46634c29781b6325e36949c508e8af3e76d84f534a897ab4ec3c124abaa0e367cdf1d06b97780efac5528e477e88ba1b87ff8cc8901babf44e0b19d6f2f0e551212d12a7c995638ed8f86457e555586b1d89ded3506731853815a27fe195ab9dd25788de93121aeed1eb4bf8172ee91990d8b7c9b3dcc48e6ae6456b68386e3c91761d6bd0d43371515b4134bd8a59886633ffac12576c5f3a09d7424de3ffbbbf4793efc90446aaf3684ce09a50e73430aab60a5e6b588c99da6fbe825c7c9ff45449df600b20bf77ee9d039497d61e2d8ab6ed6ba045828635d4907ec5c7f580701c3049b80284817bcca4506eb12cc7b54e97e483c21ebacd67e2ca1b565e119d49c6e84813ffe9da21faddc3c4099a151cbc04f76f22472703e6ec03f218c3e5722c66d3e0988b2f49108a13f32f5445de7e68b10373eba433ddda86816c6bf2acdd40bc07d9cc31f4fb93e4f2c4c0c41d57daaa55b40b8eda685bfa3be43ef755d875e4150870f48268eeffa84e9f725ac38360fe6c036d711cd0d67cbf85522a2c3788fa84d802e485ecf7b241858c48097f055432227d19ad9b1d8a0046ff16f668c50a9961e4d69fe24f2eb0f0d8a215c99e104c785c4f26970e14a788c8ae84f3b3cf111f016610b17805e6bfc7509dbe5111a3f69f7281235e1e91ec8acd47d273ceb0b05740cde61c2c8120f0f110808bd24ac59d11dc3821aca83849cbf868118bf0d7d3f98633f4a407cc4ed7a43d3ead57bdaff4eb2e5bfeb932fba6af2f7bdd0bd4c60deb887a738fcc0dca647b4959d1ec76ed97f1e0b72edd5a63924e0119a1e0bda7706e1122d0d72c3b7e0802876cfca8714a0dd5fde04bdc655a8b8a984e063bb256ea33c6caf8017a2d3b6193a868f6494b506c944c51740c6e1fbc69be9c859daf3f16d2584e374f35fe6b8521828f6023f939c68842198291ec47d82d13c9355a837cb49d75475a6af0c81b1bdeb81c42ddd4b186ccea18a89ee699bf8c0bf77c626501dadd9e59c4ed5aa4d9b03b8e89121bc67dd8dd84ba0f3c18014b75d6a7d5f0eb0981546063bceb4fce36e1d4a869a4d35e10d9cf3b03a7ffce7e8dd94c45f83688e1fe1a4f8f0b3712865e2ebf17064cdc3dec5709d3a1a1b2b2426f4846fe4c19e7791b9b3116a2cdc3cd84cafc528a3bdd167a63b372f9721a46aef15663c7e7615d6023ec6f3a368c1c24661a128d0fb5f5ef0a34fb7a68339d0ad5a78bd3a1fcf0561291ada4fd1269709e02076abe9eb848fffce711b73ddd557f01aab18e773dd45825174035165107bdaba788abae04bd3b2bd56fe1b4107deff3e2e1eea6bfbbfac25e1a277c02d4eaa3f9788a02750468e6b09a77083a6a047e7945c50f979a82f21c49b4c537359682549599251ce618b011554411cfb1b244d6980da2a69a45ef3d1c0a708003e96e4de7e4796bc52ab1ea4a2104a50955d5cb989469db0f2d83230a7024c2be5108e72a04fdeefeddf883ebd6abbd52f757d6d7f25e51b7bf181ed348a838d86c4a54d208a2944326018cbb01fa3b254459404c31930e92f708f42ca7254892a7b48a3d650cda9c609b016bd8103ecf350f35795247f6966aa65ff1929d68ec07e65df15ee9a609331e46676e78508e2bf29a6564abb910a462d88c01fb43d329d436d964efbda59432c9e20370049f04f603021aca40426d32bede257ec8f48ab60a81aa4157d2ccdd0d10cb4ceff566b5e6b9905716cad83dc0e0d21ad9839858a2bf436640a637cf6a0d93600bf996dbeb02ac4405742d234975e5402412c50464504480cc5a6b2d50ad592f7119888307d50e90fb8e186480ec430681206dc82fa0404005f88024401e12db5af08548ab2e0d13bae60908b556fd839229dfe8960a7c7001103ac0554bca21df9c3dafcec16bb797dd25d28a446b06b6edec1b570f6cb01561db85a264ebe11066b6b62052a135b97a259feab4d43c2500fec1ed5e85cc64ece02c6b00aaf7822ea2d60a921c3292946f690ae2fa976908fae1af59e2065204c1592e69e41bf8a0830efa0c04414b53d15e10ec85e400f2e74852d8735fb200638c31c618037170dbf75a7b814a24510014cc8081174a5a59df2f94958562c837bfcdca0ae2b6c13718d61e5435e811fdb7a1efa5ea1544b523093b8ec837f06df50ac2da0dd5a94e6bf7f42fcdda06e1738c3fecded841f7f97dd8bf8afdd6b63e0bafab9318804c6f05d885dc640d35087f4023e4a96e8bea3178aadb92915dc8f549be799341ac576f1200f9067ead20da0b05d666da4276a8d6acd76acd0a69c9e550adb5bbde0cb97a45412cd19f33fdc412fd3fd95620529f8c2485c9183e02a86660cba50c456c2e324f7568bc7ee8a90e0dd5d3f184f74563165169108d8038d3695175104559a64e3d3104aad72b8ba73d05b22003183ef5b61d54b7ee8d2558fcf55bab5bc763071b209ff644d7eb4ff5c1edd55adbc482f6f5c8ca245f5a85aaf20c8492db6fa05fcf17935c2298e905bfc51f13f4afd3a00dd7e96f28d17fc90bbe4978d0cafdb70bbec1bf8086d000742f19e47311155ffb915f4692aa640c1f416b0637f0bb56514abdec81d8b5efaed59a50967cabd5a8b5f65e8bb3d50bf16624297b9d00e2aca621f25497060a83270106d5da750e252e3b10870aa2faad59c1187b4c53d1df1ec473ab1848ba3456df34aae3f27a3a5692b41949aa5a37d1dfe51ef770a5b49a91a4aec7f01152d891a4c09a81e79e974b39c8a3217646926a135da29f66fa095d095d39096146bfa4f0252a84995013dc2b70184c82de0a21279e8cb434835e07fefab58d2ff83cd208ff256f69895c8b73a5dd80fedeea1863bf98620dbe1066d62a5fb71a84e2e4b6d6f6f5be77f6445f3fb982f06eb55ab93a7decb5d6ea4454441a7433dc5a9b0999c94f240a29c9ed336befe7e16bab9610bf21e857129156db7d868b16d2ebce84fd6df6f5ccd6d75ab5745a37bc445aa5f840d2e5caaa2b57c78b935c560a4ecef4c89a5241770296d41a158ebc11d3e58c1126a9ac5c162e86317cabdd2ed06d696eadc5350bb0a4990293142142c40319c4636a6510ac54e30585cb26c34c149d39c296d284174a2d28a6aeea6f6e53a273e46f6559eae810512acb058cd1a93107690e4ec69c11c2847861533170d812dc0d9382b3615c706594b892c2bc4018be5e589a7d61cd10bfccc890993ab2b9954b1232ee4165c303abb284bd345d1b52eeac031b9351c360e0c8b026187276883aaef7f585f565c65a7bf157d8979a6fe6799ef7816036c090c2300c65229810b01e198c0aac0a98979f9f9f9f9cc1bcc0d0808dc1d0a04183860a464adb86e9086b12755f3f92bea270412878aafb52c266cd1bdb13dc8604dc068f0fdc26076e03f5c2060449f925c3502e99626392e304cb41222748154521ded49299941997b032615c1efeb4441b95af1f5f510f546b12f8baf1851bfb1b18f65427078d9c3272ba7cfbac922410c3e8cc419a830b81ad6a8a4d08d5234629cf17374ecc4c098788e001cdd5e71b449f398b111b3e18dd8782e0504dd0af510f35eaa1c120d9c7212888839d7d08b3f73c030db924914762cba5ab0a98fc817cab0501790909faf1d5f38826623fbdb42bab6bd745064806441b946c6b926f05b8304010e95714ba2e23d6b69567344457ab37f26c9c2ffade888271f6edb55b7c5104dec8fb69916948445addaf83f5da10883626b97d66abb61f41a5add65a35bcf55aed07272c6a42d040c66b3d14eb060b55cee6d14d74535a67ae0d9493ba99727572907b01038f4a8e474e890c3b27d8f9e5ac9c2470b016c02a1255c74a8f330e948f25a7184e30e70372755e9c7abaebca19811c97ad3337766e39c99cb95c97b37339b293f8e4a29c5f7250289e3a6387c971a08d0b4d6294f92145eca90d1593932cd725b40e387dd4545184349533399aa74d2873684ecac6022f098a4e812125e5f4713a97b301b90cb9761246bfb8fa044aa795a8988db38d20c06a03a60db927670b66fa85b3079133b73586926918b4502f37627a085503e6dc71622585c8751634e700725761de50aede42d784625f504c60319090ece82221e754e46c3a676ec9d94072d4ca996b1c58ce3267063406addd99cb79d13bfd8467860a678e3e69ab14ec60da0585734c379d39386067aeb3c6ce386797e91044a95c600024272dcc7d9d09c869c9d19d9cce33078637540addd3317427fdd24b754c8f8c335752acb042a72e1b3bba8a9e51e3e53c72fe6893739c233820c849bb7214a4f172774e30c7845ea15927f5b2878d99d30590294cce496cce49ab206970d234f77e3afe63932729cca163e3d52442209783a2d12ed66439c3a8983387651627eacc39e1ce38556270985c4c9933c2c3f19ee73645de9b31c2db21a7458d156c4128141b9053a4ae9433945983f554b726ca8f4adaaf9a286974e50d3b1998e2844c580dd6a8e60c53995b03e4c7a7ba354ed5b6ad55e55936954d69aadcbb01351580dd76c0c2097df29708e3ae569e7a74f0a07a49f5d587a27c78fe8d627d6dcf6f50ad559f40b68e1b9344d7f189ebd80357670f63a9b57660bdbaadb492ade5d75dbcddd7fb3a514731c1370dc4175f4cded103f286ffda296289fef60c3654d043105c41677fbdd28a0278b4c88ee8e08c5b688a02ee9ab01cd1d9d938c106d49c393638f8032fbabaec50129ba366840d97bcdd7a20fb74c794f5796a58d1c082038569c9c834e5851bcc0404000e2822c606cc489a1f7242aaa75b421213d3d10c0b4e06a61647f7de3434dc5c11588d45dd71fa121287ea6a6c097735c2d0b0b9710fda3181799fa73ba62a7ff35274022956a8844a035a98e244513903c74992375e5ebba5b1dd52938d4d8804a703e378e06c06e2ca1a720e8fe07078876b4ab271ed70562f80a73bdc1010bced374afd5a15d501df5ffdf12561bb9ba4fd2c6e5737698ea041a3956fb91a5df022b0d0a0dbc988b3938164cb1af2435503638cf1ed70ea94f1c0b5f8763392703632bb195ffee7e96ec694a4322cd8c6d8c6ec94bcc031afafcea12d50e37e754aeb0fdfda1fa291ad1be991d65a6dd0c7ba881abe25e9102e5bbb530af3e2d39d52162b0fa8c96262430718205be10a6d90feb651f29eee94aadceeeeeeeeeea63a6a8d3e25bbd80a6206d415a8167d6fbd679f375a073fafe14802246bed4d4713f5ad8bdfccd2ec539b01032e7a3cdd291d79513692189293c3d184b54e7a60146cf28215db7bdb12b5c57e6ba7b576f3a8607baddd293d398db0d65a6bed968c9fee9470947894722b28c9f091f7fcc5bb24342f7bba4b129382dbb2dc005b0ecaa15d1294b74f77494efe56ba90e46fa5ed04a932861f729ecca35c799524c3b694d4428d18d51b130757a9848c102fb61956d23ce14155fa50a19c03048a470a37cc183196cc3c315e64b1c3244e0a6aca2e664a295faeb0983daeecb460735ac1dc09f92ac17684a3ac8241030e0ca43978ca3a5f43d8985c593274e52e0b10296617931f53259714be4c305fd0b10389a9dc428a619a90472aac44a16b4c2b29cc912d245009d3c47603898985c8181fb67387c9e6a849c99152a9678f39858e0dca4d0b68ca27634aac2e495e306f58915162a351c47c8342c906aadc72be98612be1858b72471d17e0b84893a38c090396c9c295f20428659e25a610236282bc4082798e50da71812bb5b838ba72078a9c2f6bcca918cc2c30b61830d8784429a5aa4c24165018d2a3470c39b0d43099762d605c19b3f5009b6a23e74c29b6339b6831974c797281c891b284a812cc092f9c6cb83d364cab3d493ef4849993c5ab44b265961163eee11255a58472528a49a2470acc0fb127734dce84a1474639a6a785ad8598e9e4cd132e3364a47809b3624679526651c551c13403a424c3c336c20d332acf525925cf0b5b0e3b5de2984e6a82982959f8f294432c5e7278651aa932674c955ea24a273e969e909c34c696cc2263472ae0090266f2e82acf6cd99ec6bcf0a2bb6233e1aa6c5255de99ba1365d2f16112792a879c65f02cd5c073545ae1319bc06c4d5d65922daf315abc9463ae985e57260955361c53e59e28b3ca8789e7a954e1b4b9b8b364cbdd392aade03901ccacd2d5c25679648cb98217dc9512cd559baa335368a24c2c1f2d9e6c36ce387696ca37768ecc1c1e9b0e302a5d495b25d718938917b3ce95d2cd559b2a38536ba24c2b3ecaaea71a67589d251b8c3a475478cc12c04c2e5d2590ad126c8c69c38ba974a5c85549a76aca1495a812061f604fa69bd34c23b654fe103b3212ed9e5bdae798835aabe5bf0736509d12580d3a005aa7510fd5ab530fd53fccc822ec065f39f8aa0297b556bbc90e94be1d010d61bd7a394443d0c7b7471b4c82bcbae184e71774a72d4f773ad63c039eee743071acf7a7bb1d475ebc333be219fe661eed5e0ad0f71cf44b43d06f4f71ab8ba8200e7aef44fdea462060f1f445d4149e57cfbda741f6e2f0edba672f066b2de8b1cc2fedfb482b0b41ecd73dff2ee897e679d05f32c85aaa3abbbf5eabfcf5ddd31a11cf9a7641152b8a3eeb4645df5b3ca2c0d6abd75eff76704c7167753c71ab4822530fedf4b675f2b9f7f50718d93a55cad741bfde3444e8177c9987b4a29f6fda4d067afd79f8b6980e281db86ff7c6beddf37afa2c76fcf8023cdded40fa158d45b0bd968d24ba7be620f8854dde46bf79ee5303123978947a18fda3c93c9016f41f088e34702cd16e5d846d1c1a5ddc0dfa6d44e1b9d7f5236ab7fe91e2877b3cd1ee919e75fa91e8d0e4adc353a71f60e4a29f6feaa1dbc11c93173d0791a72f6281c23d7d1c632ff3d0739079d143bff9f82d8721a9211465b4998fa1e8216de6e38c06bdcc43da8d05d8e1cdfb79a3fb335f711f03cd380061fc83431f1f692038a290b948fed06e78863d4f45d1087e74a3eb9ee823f369998ba3e8230d4d84a4e83ea2288e331765b4cf7de8480b7a198dbacf38862842b0d6c21926c70e2e7bc1040791a7cfe28b3ace53fc2376a03416df23099ae74d54bdfd03699edfebb74a3159d46f9d08457bb56c70407d88a7bb11b27ee714e694f51d3aa8e8dbe79ed7cfbb794ec7122568d1a2858bf7c8d9075ceea7ee7d14d3a0ef403d50f77639afbf4ec35aefb8c147269bb94fb563079ecf3ae4b16d588915fd9f7f7091653ec296ff5c7683cc5ff1861ddc121b464a650ecedce83ea52e8e764421238dfa3b45ff8cbcb5254bb47b200d6560fd3c046927bc15fdb3b65cd7ed05afcfb07b8e6d4561dd5e9a11ee6641b463ef89e0f5d89b4c1396af1e3279bb3b897cf5d0c51fd0fb1b4d84dd32df50d44fdde87e7bd1cf37e9e2471a759346fd94bc591abd61577122bf08d543ff42af5eff0b7d457fe8962422896827784abb854e43af2e86e058f4f32250eae1665358f2d63145f5108734a3fefa3d82e486131f1149547d453f2eeabf41441a74fdc3f5757077425d10cc65592b55dcbf95290ef04d0e0de0c38d6cade592df62aa00a7d4baf776f616c4758f8487e997a2c5ea15df4a5e3a14f68d1eb0f803807e1d743c9e188bdaa81a358aea449804bd2c22ad208aaedf0bfe54500687d935cdb94d5d1f3edd35698979156a674349d3111b53029023a804cc983162e8146d800093160000180c08060422912446a250dba90f1480076ba22a604026a74a0261280a83180662188461000040300060100041188ac11854fc696ae111e10cd10d4adfbc73855d6c5157cacdaeffab8fd83d5225acdcdc68de077071832af5d2cdfabc90ca8e2f7f8c1279d154a6e33d9d7558cb590c132fc61a6a10901aa598ce0cc1f20c0ccb2640a9b6728ea42ba70bcbbf03fe651d285140cc105c091dacb07029941d5b2f1e33e25c8b669a1dfc76c6e6ac9840555cf00274f7292556e0b781ee185bca54e5e5559c2475ee2120161b6c648dd381deb760b75ee8d7b9eb6ad3e9a0d46f6f4b2f1cdee79429846ae5f5beaf9532df5bc74d7d3181fd89326ed2c0238d99ba2300cf3b1c8729d8563f61c925b8630918259a2b756a1069717ea2177a486599dad36d5b4743f8d45b02eccf814f269d4916990b8615c0150c1805a6a9cbe9367557b336dc615b3773ee07ec408d282987cdd98a249f89508a3bed15e2d030f1b7c65196289326d671f83f4c878ac08855dd3d15145450e449dcc2e46af93e83280e881ac1020d2cc3a45c96ef1714c1c9b4ce3e988238eb9141308294b8486afc40e39761217f810a6ce77e0eb6bd62d73bb0bb5e9de13343551cfaf0293203fc8ed9a3d3179c0fceae403a7d1ed6aba382889dd9c365da81c119667005bb2a6264678abb08f9c4f86c8377f47c0c10759f5adbf434f2d7a12ac4ba24b2c88528832468a6dd6d7603127a32bc643541a8053100f150193110540072110aa43d4d604e40eb86f280a677056eea8d98a8091b66bf68ac3d5bbfce958c2bc68ddf448399cb0e2736b27cbf2c090e7c3447f81609b8fa5236dd012b3b2e7092ec10984d1d100d3e4cbdfacc0a81f6b55b82fa622ad9fc8283971daacc47ac8a602cd2167804472ce35b200b78f860d56d07c8bf43cc5c36226dfe2e8603a3e007e1fd3ddf6f00b8a51595b6d6bcc8f6586c39f7f950014c6acf1d7ee5dfc5b21e7639f2faca85c490d85232a757185e1379443f4766b451b3978dcf28afe121259f5a428cfb9b8a05fd9dfa241b6f91df05bff4a848e24d692ed71484f1d701dbb6240c88174a71a434aad0b97aa508af2a69839902773466c15aa40a7e8ca38ec26fb4e9a88d3ef3543582d0950342440f1d07de537c36772a18692039a61e08724eca09b2e20a6bfe040f4c0cd8cc82f0e68cb5b8cb10f300857a0de483f3e358fafb7ca02f03c68657034be02aaf97dc25cbe11021142143908d6ff1517bbb0380726303058f17ea7a30baba110dafee98c9a78d0289b6ab0c425e5b131539ea8010898a0ccfda467de2acc708de1b9305bed8fee4859cc9b998872d7c3d40427dc96ccc69cd5f37ea15ab0c19ba41203c47439b7dca07b3e5849fd63221580870aa7f1b82d297dd3be103b97117fe3305da99aaa26500d855c84a1bd93cf9264cf7434dea47152942bc4684482632cc0d2a8da1d03804eb8638036b6985d590f6dc058877b64e9487a434499188dbbc8fcb1a8e226da167e70e075fbdf7c048916f998a9f18a96f32da0bf692e218396ae83dc27fa11a79077bb774e01c0526fdeb10ac2d3c9d01d230d23de224ab256f81d95cae2704eb805268241aef58b49834cfce937034b68750c284ef428d3655ebf60466ff44253edeae876ef04a7308533c65f3a2191604fe675815ef8ad254ae12403751020103a396798a16f409de6c177c113fb874b652893761f5aa8c06d4372431fc9c64b4394024a02263f7e842c4a28b36ec22ea43c877f561526c6d4223e0ccaaf6eab4b6d5a12e11af82674ebcdb3e5889b5ee4eb65b828ceb40c77c219825f6613dcff4ea2a0e0d16d1664db8be1aac149300db70f56bd3b7d8406a156b11107e30d626d10ad5fbb75bcca7bcd41f140fb3421d85e5103ea54945bd62d5749a7a8423c7360205160497a5d01cf00bbbb96cf0a03812aefa0931a6d6917321ea4591dd0b0511ecbff0c3d2f7b4c230ffb2ffff626608b94c6fa52a698bdb39feb55787a42fef2ae9f537adb7d501c308a5bdb9b989a9fe6b57f3b49ae23be0e1cf1cb01ddfce3921218a2dc91280dbd7b89357640a411a0b9f52a181364e7790298afa9213bde4ea2c53f71d4bec974d3e234dc72a791404ec71b1136e8c7613bdad0a6905f138d70b201d85633374c3f9731ef882e7a96f0939c5238d25c881cd8050ea74cf1a34c6df452c976e59fd4e40d99066c1ae90d6dd1352bc401759f0e42a8abf4adf5b6a0631ad27b030c6507a22a05c8971705026832d817aac4ea137775eebf5199d576358929b989bd6673f3287903d8509ff64299b3ef273ef634a9e55c20e7dc0bc7199779071513d208746ea4342d61b51297f052a79c589f141f6b48fb5885a62609d4de4aba808de60b2bea5497b2599df07bd949890766321d1fd058489cf8c6007b19694f57d25fcdb1a1742cb12875d87a381db63700d6f236b9dc7a2cee5c5e7f93ff13bb92852ce48c39ae53f3c1440ce67f81a7744082950d5d7e2a51a26fc946437189e0e40de978a6ab75ee422d02036efbb1b301b35b071867907547f39288f674ea7a324062ae8cd21a2f510d52a46d6ffa945b3991c109be2ec2d87bf52471c8f25b4c44964ac3864e66c12b6cc4b21198f8ddf31b33da55434e883a41ac67fa30a872049cd9cd3d8845b4de12aa4f25ff08c414f9e142d4bf7ccb32ec6b4830a392ee26f58b33cfd46426017271918797bed8d8f4bdd09569ce95cd8224c843345b67e4d1bc6643d39e1813bfeb1d249249c56e445d599ba67895a07c43fa7164723078dd1d15c1e9a6bdb2759666c06d0a48b9cd36ebcc7aaf844dbe2783cbcbaf3826f36b7bd63331829a9e5a261044adf67f1cc81a01331cc06ee82b106540203e234cc3e20d36c6c69d5ac98c930b87f633efcf8945b08d4a0c9a8a43c37d30eb00a4dbd7b61a925a5ac77bd835c4cd7e3ed79bf85bafc44ec9d609af201db1c6bccc60ce906ad489d9e9674a526cab6d1c23321b4c097054f62f65244e6c0c7b559d85a45a8030ea72505a4fdb5ad856177eaa9005d99a8b42a9885af4d202eb0bd029488a5019b0f31abac32b9376389d784f8d4375dec91a61cba3fda995a65e3d32adacb5ad33e1819f843c288e2cbc0dda463c69b0653cd530da60a1c59792b1ecf899bfa7a9d8fedbca79893e047a31e925855e70ef875be3d1eb4294eefcc6d1b38b092d854eb75036bc24bb5475a066ae517b0c869eb91caa8a24442f68899ac572c3a81c16eb4921d276afb4ce383f741f8086f2210e3f8797928702898b743a53c5b4d59d8141c420e221db033f651634ecf23cd438eddd1b3d9517f1ad3301b7d514b68d7876e6fb230092a1b5eab1f8c9dc942364eee66e1732b188514d13dfde661ae15713916075a818e245c694e46fbad8a73e80f074caee4ec23398a30f83b0e76731f2524a8e1893fbbb38cee05a0f159ff844817bb5e22801c6eb222bdd7b528476a6c1920008cdabace58c39f5035be4f5afcd1a294a801a6f74d42b20aea1440aad492cfe492a60c503f4eff54473b9a1bc1aededc5249cdc72c7d5bfa1440ab67ca8f334ea48c93f7616a9d4b9514357a2e55b32c4f63e698d22d754b10bfb81c97966f138222445ae6959923db6693ccd474dfa64767cdc863f20f2cd1682b1a82f03e652a9c5f080e660ff75e4549610143e1e35dfa75d5bdb1c1bd982873057734dbb6530894b52e6c9912c8b9d45182d89d03208974d0b8749a1099cd4a3c3317a5c8bed30eebaedb7dac9ef639f070642bd6013df7b5cd1e3b71685bb1297cc5853610912173779da50f3f5dc400d1b30f55208ef98e7e401fc5044421fefff76913d8779e11e93bfa38059a96cb755ef7878214bfa9d04526be9866ec0d1c136fdad2da0d20b60e4d5c5d73f35dd8684354afb2b4a44994f63846f3a0d3b5222caa64010772638ce33f271a7f03b649bd8ae339b5a2c18fa4f87398839c87ec7cb41dcda1fece1a80ef23c340593706486b07b1e18d80f827ceda83351477e8ed76d2375135df7626abda085130034f22880e054d6f84f18528d81c5adb32cd85275d11758c30ae049c7225ee1e0311d04db57dd4af396edd1bbd36be9ed649f12c82e1065393afe5f314c8db69cc2b4f8811ca4e63115843018ebdd64a6879c86fd4db45b5e452dd8c3b58490081cd7b08c9d02482c9c20c3d9bcdd15723bdef419732b5c417dbb7f9f63d471a287a80b8563e2c19692e596e5038abe631affae8b8866e02085530f33dc65ef6031ba69c318ee631cbc0515c723d82113835ef1d998c264b4909698caf265a53630897a2a495c5c716d5d8c542e4233ad5d542eb18eb04f0d00791e082b988b574bc3f128f9704ead41cd77a9426844103a98167d44d97ace544a52243e87c04e2d94d18cb89f0754e6b9a69b19b7c7bf4c58b3a37589bae0e8c8ac3e927a4b25190d030b0bed72c0ba734409e3b68097504ae3b1f8a48ae31e323b0fe4e2a4d7027d0ac60acda63a2df71d58b61c418ba08b0ae987e774c204c8ec405126d35e30b300a838fb01444b75f7fda0e2838a3c749c6b9c8cf04dd644420a278bd85a41d38b81376fd08300f263e09622509dde9e1d751835efe0d7d56559986d160d432021dd8df83f3e41e32a9058c54e60994f8cb24978289123316b9679a738c056994a4ca0b0aef3fac7013f7057a4bcedc14765d0ef7dc85013dec130b174e3c13e266cfe592d74496f1decd8598c8db4763abcf863c878c6cf804f4642f306171163a8ee22ac2d1ccbc1474467f20f508bdd7098f732c60c8f41b303fc6113cc74afdb0d8a8af79ca06ded9c1497f6b439bef2e08d0d36a6a03fc0888bd6574017c5c9bb845aa2723878d0857f7ad68bb4a9695c7ad8f94695d6d7e4a38e520ac37b7c7c1862419144a37df5c014bf1a6af88d38b2293b0b2792c52a82f7c90081a0dc47cb1760521b1e52259aa8452a46de052d92140987b1349d1c58dd979e0254d7f54ce0c772c3dc9f5364f3fdb2c89de47b390fe3c268438b06a516647b3aba8e9959401ed982bb16b901f496afa453e5d6b32bf9171c93f48cbb3a2acb7c85c2ff7989c71b011db0e9b6d61b62acf96b3f08619e84fb1a0a5cc13ce9aac1bbddef4f8ce4f285c1b975271cb9c422f93cd869019817d34a5eaa920faf2d4b24df84e4a0bfa8670911c6f3a2c42d6d46c198a021dbbde9d046e1451c5dd60c5b5bd27344f4a80799f54c7526c7f4b2746ce44bd45cbeeac757c26fb9660a3587353c0aad0633aee0e4964d08e25def8072bfe54b420b050d282a0c3aa32fb2b721e96d09bd1f9c48d66cf325de169cda579b32f3ce64c525c773d0f79d54b7e17e0b17eeb4ab505d72114f250d61c5645b96e7f612524deeeab54c6a0bd71bd661864fb08baa6e2a078df09d9c683f13249f2655f4d018a83bdf4562e57874e1e34323d47a49e67cfd546deda6ff61d1130b1da5694c65723f416081d3b6d89f2a7cfb4b0adcb46f6e4fff19877ae73cad32226ed0458479ac746d41a3c22b45f1dd622856eb457ea1e4a0d283276fa9d91131b4e4e02072a17cf9c2b6e5d4953de16e98e34052b61c3edc5efdd4a22989aef84692c3eec2171efac1a43d46c4804b506a4cc3f20efd2e1a8383cd313bdecb2840899b0c49d74f753eacd82fc3f1cb1ee71cc385a84837be940b9a5b16da816af903ffcece73d13f6e993c40d7e9b9190d917046adddec151a39315bc2f9550c75f0c34d67d42321da1b751fcdac4c4de99b907358a19584069f280ed63ae55f3dc88eb41bc1a75abc9490c5a8227dbd6a79ee2d481c4fdc1989d3c4f751a0ae5e14b9dbf4ed15de08ef136c73e517c36a28ff34f6b5e3a4c940e6f5c07990eaab578b23c8faf347eb4acc01177534c20596a8792fa5661ee71b96d0dc71419a2fa94b71f0641058859fc6273452ecaaae827f53be886484806f7d5764fe0c38ced1bec1763a8c6390b2563ab10bd05a245b66c9af386e6ca65d23ca45d8f8ace2fd12423e62e9152fee9079d7cae11ee0c46404c63f16ba36d3269c5da10f215e23e5cc3bb1bc26bedc6c97e77903caa6f4933c07629f00943aa6f11a79c443bef83a0bb521de7439a2e061cc09ba5d8739a15a5196e7d58c9a45f178c59dd9162efa08e0837dd0d3ffdb3f8dc0755158a8ebd9e7d482e1221b461966a1536855eb9333e1abc4a5ad08e5771fbab8389c10e5d13fe08f5502abc93735d579031df138cfd4655067855640cd072c7ac4b62673cfed9288feaa01a539c6e1c2d0783946eae08666b6efcf5ec235a83213855303ca62777f8a70dbd9588bd7b2c55f4702e113a1442f600ebf58410a41a685c4d8a99dcf81693aeb1d7fe9647aac1cc74fcd4f9d3a40047c4d99f562a720041283d6325943605fd7c171ddfa2bc8c82cb737beeb172c02b4ceb2bc618e63a86bd1c3d95cfc93ace95110ba10286d1830410fd85efc91f18a9cad9363b419e3a28f62fbedd09c648f5bd30095a7ac99ec7fe4e9ff83502a40a6581eedcf45a2d591bb0bfdba27f6b2f27486ce5a095102841bca9e1c09043f23b71d2aaec20dff05c63c222536acb6efa65c672062b23fb3f3f334108f6d36e2ec5fe0df601ebc87ec3a22a4944b6e0f34256bd081cb00673e0c6fbb9f47ef25965bb915629560cad0a42028f607b5905aff98c05a7e2ae8f57249a5040da96205f343ce035a89809c780b81e47aa17243d11083460aef2f99e399fca13aca616b53b2f895e37aa65efbf75a30277b8834fc5e873149fd7c666d2a6fa281806736265093ef5ee44c3ac18a198bd0e7b582d253388ec7a630ec1ee924b60721f0b48eec1851c2826900b68815eda050274b4f6dcc7c6dfd4f1e0cea735a12bddbab9a9b3d977907889782200a117f75b1b8778b816075e543571dbe5c96d11384bce3f971772bab81c616dbee9f29a78acfa3c5848b5837bad7bf192660a403dc88ac997c4e941c812dd4889402a349e02ee3f56ad1108e8c824c58f2b8ec01582ec8239e720f0ad16f10b5e14249364631e181e626ab5b04dfba6caec86a3f05f5027171c62acf2e1c2246e4487d39655f218faf1519a4b6aac9eeb5a2b1de13c2a8591c234a89fe2e04891ede138eb07296704451920370205497dab2db1055167210c6345eee3aef8045d2997921ef2a240d9fa8540b8c183c1ca36f44d5e8dee48a79a20a5a314609e767159808b47a4c2e2c0389ac983be28ada68a5be3db009d2e233058a0e9eb887203061f5b0b1a567ae91bebb30cd7a3dcc9b86782b838fc2509ad9ad6cec539bacb0970f19ee0d66d95ff0a3e7de0ac74037b8f9e73046e59f95bdb146499a176687bbc6f582dcfa49013d47a66a0a1a393c10cc2efe68854a1e66d3a25c4cf8854409dac16c0d82a44de006faf8133b9c1bf2ac77aacc6809707416b037a94ace98895a81e7f3b815a2d03bf08f6be3cb2a5799fe1d46fea7c61dbf9f74fd86549e24c686199fef9275c49ecae94726cc59238b2ada8beca99b882ed9c6b0b6ae9829ff8401b8d28edc4d3996bb17f209fb07f446e0821b00f1dd3b00c78c214c09d2aa3d769ee8539a846b1dce63d83e93ff6ef37b4e932b9fbdf5c5c807d02bb9f9e26ce61c44a3184f2754d61a5e791cf609813e68d498541ccac3e5a4fdc134e8fd5062fc075cecfead1b846be30f65e15a95619fdd85a11fff33eb5866150176209bb004aa0070190cb867409e6b01e969569b10aa9d9846f32209423de08368ec038fdd46d29217c11b408c08b003499c526c21eb776ae72370830e2c7ca05178141f819de12234413218bdf0fb2ede2e903ee0610af440143f41b30411f18e7609abf9dcdbec32dfaeed8cced654efe54bb2e828a2330709f3d3816703eab66bd880b27ac724df5108de342f9d13936c40a84de311a120854373bc648049c15579f3dbaf3e13ebcd62e703e6de78f8816e64f1a9712e2fd08ca699f1a6a17899f9a438b78ef5b01c1672e762ef253aa0e43f7332c07ade707610e2808fd8b66c29c115f81fa6a47418e0effaef627bf0e43fc33b5250594d6bb759fdde53eab960702882158e43f747456e07faedc73417faeedeadde2fcc039822196112f840888310501c1a7b97370d11fc372d02e458c7c2ca89bdd92d667b0bd25e8020d2ef19e789ff5ad0f4231021f041b44244255841e842322c5113f0df3cf9a2d0dcad266854014e4f35e0e63f629ddce20d4053a8ebb6875e9afbafbb2959bb2deb13039ee79d52811bb11e088c0207c76e05820f8d49aa54400fd7f5cdb2e9e3e076b2c849fa4db59c43bc4388269884d107f10e940203e0283fdd96c592128a09a7411a6407022d409c102e1134327b4f8437351237e1055bb5e7e6a49ebd6880b7d29979b870bdf02cbe7c78d22744238431c8b3081d08cf823d485c00f016c0486c8cf789d15621f89a344ac4e88a0cf4f7b4b4704a04f3e436f17a84f96ab4680475c422884f808210e61265c248dcfbf8b17741c250cc048264bd21dc6c2874edbf6574b3446a74892fd915f8731fa99de9e0262d16d5c68ffb88f352df89f8a70319da245d6c7f706a31118bacf263a16909f55e383501881f808b598fd17ec2673f70e2de957be63c06e932b281f8c5383c010e88a37ed6c8422e21191e35f3721fce4c2816a7fbeb462207420441719e14054a1502c84b70d32a2c5c347e39e42d4e9074dc999136707f904ba154658f14aff68b140cbb5ef2bfcd06e2915d1e2ff09b6abe2f919b7092116205e208e20cc204c1b01d4f7c96afb84a0c2f4415a3739ea936d6d1174b1baabd20bfbc7eb680c4a1f49bb5b5fe573afc98b70401446e023b622a0405040ec8350cf8816a34fcc5608840294d4900db0df68a55fbafc8c65cc02f5e43cc54d5b118213f14e0446d18706ce0a854fad43477c10aa362268fe73e0e221c48df093f823b841019416a6b9e1c4533e99561501200816970f953a6a9d3e15d92e923f2bd70da13804e0d715c924b9f94598223623a6b7be0844f976408d98a1dd828db8618c9cdfd743e1db1d73004ead119cc5fad16eac880ac4dd0807083128be19027a4b71258e1ff68759f0d66c994b3d18a323dcd18cd3fd406a67b04d11f9a6ba33f81fe1004676014597d65c88155df8aa582d9ccbe104f904bbc208e5106e448a44b460fad41c6a08f17db5444ceec813217e562e078218818f48d60f8a7db20ea351f273e5ba1157fc73551fef001839445f18f8bcd0e4a3d14d5431848ef013f80fd7883081ce1ad144b06810c67adc093bca4985829345bda9710f90e7d9e0b721cb61c9668aeb3366c6c2656071dfc0de396942d496aa8534524d91816a37785ea7b69e1632d42c2a8082f6c12f6023922e74ba70508c6c3d8dad4b0feabbd3855e720de3e7c033df67e219269e088187828f76292525dba9f2f02273c4fa3e72acaeb1f17d5d06ac51f942519e752883cc8c104a31ca6dbfb0d0ad27056cce2c74281dbabf04b164849eea78bb0d563a40e03af63efddf22790ec5ae19baeae5f51c9ac1cae8a9668937d4fa622593724a7cb20ba44965d7a2e73f0a75174dc61806c13c60756e02f90537bc085b4b5bc2f02329b9850037f6e4f22f9af210dde652fa91af1d5f35a972d2c2f29b3ff152ca6208cd670a662f7f9ce18c40877aab9f5a23f04a4b4e3013263b42d0be41490b6735c105bb62f59e221a3f7835e5a12cf6781d742643e8c94c4581d6ed1df6022d46aa8a570c44372f61d8473c759e464480cca582c34cab1a7341215aa45f418e9bd52486a3e347a6ead63944e7dac11010cc17783a52b2d843d0c56cc17d75cbf045e3773eb550c54a4d7b3ce7ca5f0c3b308e821abed32e312b104f1977cb2ae372e25ac8bb2bab65c1bfb128b14497321398e3de11c120044641a31b42fef43dff86cfe76fd9cebd7f39cb4d455496019d4b289f5da96e04d061397a11243a1cef3080f5e1a9c1e15da744691101c4795341f017cbe057837d3978085c2387a53d0c06528895e1e428fbea0f59518a7c0d26fb2674c41453445fe7e7beff06ea43a92e791cf61584c5adecaae6922ff22125a0eefe3fd6b102809473f59ee10b63178a7b177b358d86db064f65b867ca6e8bb5002a921841ead9742607aa4d03f7a8aa58b66c18066cb0e22572294f6ee02d45289e277b0ec81e36d3d36863c9566473e18689a202f15a576003f8ac00f240d1b0fdb6bcd0857a6e7b86eaa8d277b99e50c9399fd48a1cdaa10b63c57506a039eef84e4e922c267376159c66abaaffdbb186b6d4f691e88e01096f081af7add35a6ab5d5bd259549e9672d48f7b1c8be26f6de0cd6fd3eba1220dac1b416752d3a4b46ac7713fa55b3ee3f300c2df0f08eb5992ed682098e77128e86de69978032b80a0f26b909b04c3b546eef6e727836a12daea981ff85d0f6d3e385c7668be1d2e422a859ec0e921e7dd6bccf144ec4fa805fdd037905708732b7f5560810661d6678496bbdc706201ecd62c2b1a02302605dad60517727a20679aadc708d1023db52dac037851174654d5aee99c8c1c633e150c39a0cf06aa4dc5e2cb630f4d492616b288f3ba90cb38dbae6ccbdf9e038dee09d196ee63df81b309f644277cac67154cf54da4eb71fcd3c1f5789e73a8f9eb08d579e2b5bef842f0330ccaf29662ffa74787ce4fd8f1e29dc46133088960ec5cc62528f4dd0109f5720d5fb88d13a3415c1be9241085cc1bbb6c5e7e13cbcc1d5e340e91037b99f62001dc4288ca577e6586e5fc4861e3290fbc9baf51d78ef7f46720e16bd840c451e99ddcf172f27a7b35c6fef2e3c82535c9aa6f9d92384ecd130a49f6454c16060525529f68ee21c439ea9b1193f8a5cf7af1d0a09f4516a905b138283c05ec1c03aa4ed05d274155bbf5d5b7fad5b1ad1218788d6646543b7cf5d2b85cd366c53ce0e4fd7287047c7b2bf1d2a79e956f0af1d99ae73c92dbdee061f71e4f661646b1c8003c4cb356b5f25524ea1fe5ea07196b40c2221dd2abc4158059b9122be16b618c64d05a763106bc07882ddd768ce7bc0650ae0baacdb227a7514bffb8336b7783c048603927abc8201cc87214e24a7b0cffba678726b8d4dbbd590124811b1427c05fc205d37730a9914140ddf0cbf8573b05753da8b48dff27b6f7c7dd5679db2f1dddae9c7af267c218c62fb9a7729c846e2cf29a0f11140ecd658b5ac6e36b8ae8490ddb84a07214e22824bc1da031cb9fe4549ea348434b81c43c153a70ce1cbd08a8bab1c8cfe4b0c052d17ea21f209e1118525c287ae01a8dda41e658d16e8f4c015ba3fe94002a376311e901a18d15a199ab6e16c874089284775ce7594970a56836ca23ce68963c9fec58e96590a81b41b37f17486065e0e3f472549d33683d2ed59d6f968e08e311ed075b19590760400b20c23aca3d19ce1aeb9e844a68602b4515855e5f1b24ecb1c2d9aba5dae071fe50b4863e3e9723be9fcdcb60da082c68f3d7758b48333eff20fa89bc0aa46db3fe58df6a19f7d1d46ed781522c7cc0abfeed35736572dbb640fdb980e604b4ae5c6aedd02051adae4d77c9e3ee6985cd7542c50bed2aa89658e9f3522d7f47baa55e9f13ef23cd98b79447f27f1192ef038aa2bd2cbb70ff4c05e27dd8c645dea92bd070675cda7d7ad8bc0c2e3ce6193428815ebd698c6700de565f4ce8adb9812373582755924d124f5a8dcb9d81b2f44eb2acbb6d73c2b272bf310bb9e67acbdc84f8a6c260a85344ae80e3850c9a0cd28d2225f0bee6bb3023adf19fe1c224c16d3ad0c238b5472fe0cd50963c0140e592e9a25ae7489ac89c109492c885595f80b538264b2b04b96e74b57b9fade342c1c9b6b18c9149665edd7698c8e446493459060e618d80a9b8d6619a0b3c8b2d621f75c598de46004895960b53f09fa9d8cfc9d3d110f0deb8ec5521d51953ef6f5be2b1a2dcda9a5c4cd3452bf3f13190916eb4a5e1d104f1506bdc8e8cf770ae7a2bc2d6ac5b79eacbf4c6c05c45bae4f447058d4e1fc6e79769f0624ce03b8d267841ac2d2fa3bc7c7c62e1a634660ca15eacf306932c5462a6005e08aaacdb4fa24818b911629ce0294f3d5026c1f53a640ce2ecf177011235d0b119c3f957e07f1b41189a265c89d11c904ea69bf9c3ca62ad86a17d9ca1adac34d2da70756712e90dad7a4a66fd6bebd694088b53e77b6ac51a9396af2356a77c5e67a6c53abec0a6f8a0526332dd61942a4cad5bf7a9a8ab88aa5e5fdd9bec59f9a216d90162e1d64b5742ecff9ec71695a1ce4067978eecdfbe9e02a47137370bf21b931963b21002dcd74eb6d227419154b8ef69a70eaf013eeda25eae5e2137cb7e56337b32615bea5c5745d20da9013f264ee084af59f841b34cd65228fd7226611f2827be14ed1b0f5c84c56f3af448be1e6facb0a9dbfe1dd1c8160d56824dc12f5177861c7496cf06868e4106d7e14eedad125f216b6712818fe4ce48606fcb79d6f31a56606384d57d5429394dcde3da5c62259d35262b5c5e6f89c7694e03dff1adbd75687d829a46809679488135536786406d6dc269d4c0734f04f1478fbb1cf39facdc42bf87cb10450acd1c9fed1f5a10e56be65eeb4ccb19f4036de83023047dcc2de521a38ab690c6499c113c0751a8b09c73539c16030e9689d52bdbd0cd8c4e96cef17b8b7fbfed1f6bcbf61f9384aa415394febcc05b1522051710e4647fc027e8be625a2133c691e48a309e6f03fd81af657d13a0b243f5a37715b31d9af8d0e45d98122c0d1cc3f5371bcf25ab655a3ba0aafe770f0ea8d463f18220a522b0827f52685695ffb9d470335e896d8501313ed174b78bf98b3ca6bf0a0f1bd34a814c4153ecbc4db6f4835aa1302b2e41f15cf1d5604b730cc687f502f73dd15a84d490b298c8e9d77cf0d3e78199f63084760959e1ec7fe0158ce978e22e99714840f1f425ca2e3fadcd58b268eba294b89f5a6e799b71dc4a42b47376527678ec25558a98ce88fa1d0db7341bfcfcbb94e1c520e5c608e6417a4ac1dd03d6c6143097460de87e9c5a3d880b770a294140ccd9b4fd4ab73b3b4b31833a4350974b438378614420676ed08f09d0db01b8360f6d51a721ceb74d91bbadccd14c122612c3388942f7272515262179a08aa4d9ce0353c46ea7aa09c4609b7d4704106941a5687148bba795e1ffb2cf3e922ac1f3fcc448131cf3f9cb21b157d88fd6bdb633b8e216e4b3f3e6680d689f11124a8fdf78506f78682978c367354e234dc8dba6ac475e7ee6fb3c9878e62f9bf09bed28b7899423c99758fa49ef322b0851fbe24ebfd2314095c9ef755895b25439a5f7db90a99521d1e7947db30efe84c51b5983329e62f99dfac60327fea0790031d69e1f3fcbbd2b0598b9c6f2d318f26476e15627e26b0d6b27ad027a50a832a892f1abb7cf21d4bf9a6fcfa05a62fd4da6aad5ded61ddddf405196a55fc552a782d2ed840a065d0a925a1b626cc83f3d737e9d09f6af0f678609f301efd750755af7efdf383003f0d10df0322547aaa1cd2c0c19598951da7d35d1abeb3ad4b720f1dac250075b6fa5010573fb8efd79ce826e9c97cd73d78f088f4a13efca13751095d35d816235ac5ec0a324277032bc9034422e354cfb62c12218546c9896316b456f2473f0647aeb29aed0463389d1d98c92518d3081c49116005ed6d9011d45049c448fd8bcb6fdcdf94545df8683984a5c762654b391d629b68ab236b62d1c3a00e42eb673a2ffb48b0b36bba70dd2b1789431130b0bf3837e302d1dcc45c5bab0aac1204fa193ba45410380b4d3a958292b819245d14f8bac8c1917fc8f55059c341d6c367a511eee873a983b4bf2a3ed17923ad32d6439de64465637772e31287f89281863798f56d40659be0800f7dd3d79b10b9e5de726f296592329909670ac40937dba261d3d9a871dbdaf463fa7ed51fb5404a80e39c9a0a95e63eca79fa33cb856439389ee6e070a19c108643c7d400c7c775e792b0bf5973a1d152ed32d7856e48ef175e172d154887a8a492baaaeb615a6e1ced3beb51c93796f6c1b723576553ae0acd48f92dc65866abef77a16743997db9c71fe21be771f4bcd13734a8c72633aeca0bfff74fcb3876b1ab5cf66ef7d5a6a676f797d3b2ee3babf1d55ed85d3b2ae1b2749c032fb0fcec72bdcc433c39dd75e5b58069f4fa4e00ef9c57ca4efeb679dfcdb0e3244fd7fd94fa765dd8fda5434a1d97e4f518d49cbe2e7aafa79267be9cdfcddf5b379299aba352959f8bdecbdc79b7bbf7c7bb3fdfb230b54a2ec27200e923c92453503b842d6b59d66cec1fb54ab6b72114fb5b28af8b339425a994f2503a36896dfaf82505cc7621ce7b99658a6b997d0eb69549d9f7bd135bd68e58b3b3d0b6fc62cb9a14135b695f7de9f75866297dc251dc7648f7f73f5d44bfb189b8dddd9dda9724fa729571cfbd7beeee491c4f8b85116be6951bf1d453a5d0b55472e4fae34de2deea3185238a084ae26e085a0d8b02fd79eccfc3f982d18e76958523a02240ae6ee0b6dbc6e3658c87de997d12e028ad8aa82b1c7fb6cb8ff8228791fc9c1cdf2d6d8cf3321fc14ec04fea66521f078efbdee3f81aeaf891d2211e5248cf04627300ed6b0f6bdf56ac4039394d71266772da9a356ace9c3143864cd69831565bb64c59b102e5e43465324da64953523ac104139628519204638c43115ca445d2470810fc187e8b35d00fe06b6323aecd0487a00892c867cf2417381bdfb81096443e42a08b509268680ab94c336b9a914478d31d379bfe5ce342f8a9cfa6ef4c2e347bfa3e85be4349229c4d71a8f3de4b99d6f94ee31d7aa6af8b5d8ed7d1b2c739f04bb13e0f7d25cf9440ead7d7d1b3e994da5f28a54ff534ce773ae7b117a4c726df0f0e7e9806f1fbe3e8cf458cb5f7327bb77ab5de2d7313d7b6619023c0515a1d7121efe90dcceb91eb73817af4a94dffa547579edea6672e6e3a08c8082af777e40757bc53eb48c2c65ff147edc45f7bb0be17e4a005506e22225025bb3e09bb86586afcd3d34d7ef6fd9824badbb669201dc0ad7abf69ece9b1674cb26baddb05e201dc9eabffd551c9c63e5b126ddb5699cf86c02f7fc7f8af27a1c0b93d97f52bcd37942ee2f00ea15dbcafe0ed019c7b0e000fe0bb726f38d2edddafc3b3da1b5ec18fc318e5a143d208080bb83dbd1fb5c2dddb755dd775f75eaeebbadbddaeab33ee76dde5e4b66db7ebae54aab5c9acca29a59cdf757a84edae0b9dd039b76ddb6ed7dd6dab72e3b83be6a36e0451f472c582e50ea516fb47abb848ab1938366a6b9b61cbbbc3964584d9f793b90817e2efb3fab571feac9e3a838da9576aeb66b9ed726fa7784526c6e9c938c40fe7f85c39477ef0f1ec9bde6f3bdfd41fd6f9808800a5e8e6429ede42a4ba9dcc36738a0daff4f164432892f77263f19b1a96419e6fead92b16f3f14dbdf33c3f32d2f7d5c551a9aed9536fb0373dd6bdbd72527e309481cfc4beeb651bf77c5617b1a16ce328f97472d1a56fe4a31c7a6175d1f33104785dfcf14d1d04fbc13ff473f2910d83f4641b4e282b59407f11007065cb9c645db4e19c62c322cffbedc73905cc36248239f8a65602802418c8373509f9c88623d44c70912e01ba027a930c3030b5d28e137000bea9a1b8487f837c64c314c40db0074c216d0a7df4779aae80738f730aeef931978e8436f87c88b988ef219eef878f259f7ca423c88faf271ff5841ce8f80048073f40be00007d2b74908bf806e1e7f3f2277dbcc701f8bc2ccb49de6fa1ccfb9c2d807ce4e120200fbe39c585f2910df1feac96b522cad838d90bab6be3a16f4e11ca453ca33cc4f7379fe81be5232f9c4f2ed6a2a6eca9736c1ce483b2c7a27c64c3f9f461cff3ba7cefbd2e6eb337ea0d0e85e1f01c311d3ab2f9c18ed9ec0339a55c5b28a54f372a39256d3f43d9f6397be72967cb8ca4fbcfc52bb95bef379d7400e586dd0db65724833d36996d5b6d682483edf5f3e873ba0bc79fb16773494625db86b231ec579bc1a65af6499ffab216b5c496fbb5a996b5a82eb675b18636c97e8eac1151266733813fafdbbfbafe74004309e0323b8ab69d8816ec9752ddf5939c86b2ed9fb3e9d109e1092ed207c12631919ef084e65f7e1550ca70e3a8d4512ff67ece106807d0e5d2b15d86e30cd39ce459eff364cedbdfb8017e4cfadc07f5cbf5f77efaf3eccbbc05491f294baf69d57cdf7d1bbfc077bf7428632a298fddb8db79f8cbae1778e30607862327474c878e6cb6a3c7eb10003b1f978106df75218efbc73df9e8761f11b9bbf0473632dbb46953e41e4fdd7803f1e3348f8f1fdfa6710f8fb8810619ec0020d4dfd3c36d3db6d29e1e9fb2a7a703977db9c61e93a4fc15e692e75d15419c01222a0832fb67cb5a10426c22b0f68f2d6b4358ed4aa368a896a5965a6aa9a569aca5340dd572217a75110896ba58b508404080a3acb9bb13b9aa56abeac90ad3f660cb9a1058423c6d71cb5a106bb610521bef4f6be317de91b01b2fbfc78774bc0b71372fed4bbb727264fa755dd7510976ddf7e1f8d98121930fa46946f052ad3ddf8ef2ea7b6b434b6d38564aada59b7dca86e65f615b6ae948d5d8d1777e3a522dcefbd1c30f36a433431a8e124be7836c33e7b7e1927b414bd350ab471c618e5c84bea568a6106badd61e73502dfb99fee4be28165a5d2b1ca19ddde7e40871507a63c9a537cc09c710c78d90a6a94fd65a6badb539a4692690ede96fda7e1185e91b389a7bfbb582e04534cd8759a25813699a2c5114459aa6880e2da13cf563348d28ce5c9caf43bff32c916662a2199a86a6a15a340d0ed7314505c22116fb99b9bb3b9d651ce642561508876a95ea17f5b19444cf66cf9768b6dcb20675b5e57355f6ac01d1b4e78fdcf7c409b767524e09640338fedeef42236c4774a17dbf3a827ae4be43c23df732042592a64a6f3b241989fc2d23a13fff0b6b0d61341fc90956fbd3e624fa3017a23f5f3cef3bcffb8e8aca0a4b92d9f275bacb5926dd7b45bad0b3dd7f437c6fdbb99fb9c8e52e0ef7b9396673dbe6c2a03520f76e2b13ee6f112ebca18ccb479c6f6ba3ecdf2a5137d0e770b8dadcdf1a7dfb03d5b6bfe16cddd6c1703a9c9b0a62b910dd32270f99569b0bc7efd6fb7e7383c97dfb37b2915ce4de2bb77411fbfef417dbf901818892254d52609af214e5bb3ece61f317f5753776df9fc97dceb7ff26960bd56c64d67ea8dd5ce4825f918d7a9d925ad7b47a5599f2016acb5a0f637aa8b2ab13285c9b366dd66c7f2272bb162ceb102c1dcdf61f97760f4ddbff89cd7623f2e73be1b6943e54c909b7bbcd3db513c9f61e72db943f7fc2c07bb276ae7cabba03399807529a10a6cdc659898d4327af36fbca073dded21ff57b68199e5f0ffddfa34708f5df8308fde043207abc0cc77ad41e3ab1f04b1554b024152ba2bcb2658a45318abdcc0890463a51ae0bb1904a4ec223c849d8564145159f638d2063abf3bb15d8aff81c8b4cc2ec672f33093b7e470826ff949c646dc8491667e160430d5938d54083163748f7e123d320a50454a4f80c4ea6ea471650ba0ffbf6addea26ac76730339a9492006168b31f4880b39f99843034991f10022d480d58440218275537f0f8d9f3d060709e879ee160d72f6daecd0eed248dc81dbfe3f10e4d250c4d4a0250e1f13ba8ecf8998f2410e677682a3c2210829492003cc21b763c952aa49404a062444a49801da14ccaec67dfc6c63cf4ec77e85908267361b513fb1d58da198cfd6a3f87b222b2cd76fd93d1dbf997b62b63133871bd077a6cfb733a11c196d7f0678c35dda2d1b0c676db77854fb0abc853a0d16834fb3a44dc477d223323b28d8d671a8cb5386cec0a9fe4d8f604d73de882a33c3e831732cc204399186488e18ba6189ac080a10986305e80e105332ebce082184c2e30e5246cf318519cc9a3d88c8216d044692127657c06c7340bd3d34c775dd179aceb8e6969a413429946ce42b664d0622f298fb3e0b49c9471194bb1d7797b060296684b46b12f721dac6b2ccc4ecbd8a66085366da05161b6c1861950d8d84a23823342a005822d47432a85ad355c05521f58430d5f81d4133562e06aa43c100336ce022925363068810b3048c3054c69bc604d9417acb1f90527a8b1066317e4a46c711aaecf2ecd819b972e6e4d778d73dfe04c1758db829c84b385c1065c9fed962bbc925b7057c06ca43490df6e99915258dad98575dd32e7f08aa43c210b7252b63929631b831524e5c9af66056aa8b00215ac01c31bbdf04650548086ddca001b18f0362e205d44c3db54000d2d9a05fe7b54e0c31ea1a43fb472923d232759cc0205ce48d3820969cc8852821968982620e98ffc92fe40930217249082325ef8644b76fcec6558864309ec0867a1741f2e970be1327292252327590c0304c838d314813328888104148c21c303a4fbc82fddc71862cce00031cc48698099306818210c306a6000185fd8b0802fca4c5140192f46a0c48b2ea824a08b13dc808013d49c0e20290fe5a99900872492f2982087241370a18301b8d8a20a922dc890e0089912ec60a4045af050002db2782a9245560f44b2b0f001098b2b7e18225d0cafb0c24261399a5600414410578488b212d3d583ec635ac410f6b1cb155abdb4b17f33898b5c4ee262953792b8583f3f969e8b888bf57318640338b3c84778661181e509b847daa6cdb67f84cc45f0cc9a581c1185c511565c215584155255606131a20a24b0b2646b8ff86a7051918f6eb25c4d8184540d381f7531b3f1e3e029e4141629a6a28022892c502431e6092590b84f28e18418a025c0515e0de990479ccc540d60ddae2b464b2e62df158eaeb7a1554eca3fdfa56b189cbc25090fc2e423bb05cc124a80c94776892f390967259af8c2449516aaaa26bce4249ca996e8c00b972e3929632e4cfc74e9c2252765cc0490172ef9e8a60b5513df9d01a832c02472640ae926101da101260d47c9c5ae9ffde64e2154f9e8c64b133909e72a2e1d34f185899c9431123924529efa92a80322457d44fad4072285a414698844f2d42e57fecc3dde2b8998c049782e919332ee126609305bbc7860b5258c962aca23e6d69f5aac94f8e2123de8eb111b1209a201ac5b9c4a88c945ece770cc8f13ce2472120693434cc37c3a74acc8330637ae7141b3658dcbcf96352e519b880bd95dff48123a54d5d068b42b46b54af2c831170b242379e4bec20bc923f7d863d39f4ae423bac19619ebf81cfa4a8c0b9badc196352a339b4b95edd4a963225ba2327d22d3c79aa34bf9a955c66fb5efa598c662635aca5e17f3c774900f4486985319091124f21056b224b1fc9d452227d9c7e1a8c2c63fb34c2c5336768242f1053d05fd008ee2ae37378f6f6ebec8a16c8c839e408bb5d537373fd68d83c3e69ddf7600a9ee1c7ed207f64875db10c7fe9c19c97503f637b42ce7717cce37a166ef6c596b628a7d5d283fd012201d123de7cfd13623c1be1f2fd6370bcee320995bae8b593e9f8b29d68735ed410178e3c3cdd7b7f928e79b89251f49e558943dc2da27827c005f145db48fc371ee6f1e9191e0178dc8491c11172a221fe530c4633eabed7e72f71756176995d207052570d3ef2410fad3888cc4ed22425991fcf4732829a51308293eab7d06f181fa4aec5fb1cf3199b18ee9ab6ca372127e1b32718d4bdb85e9148fafe424fc396492dffe242227616bb3ae547c56fb967428f6ddc7f2db70d6a8a030cdfab0e6f6cc45ece330874cb6d436912d59bbfe91fa236c41b3b7ffbe9f511909fd2f1c71759ac5949b9d572af519e552aa45946a7b39bd7d150a5581ae50976075ae20065886a1dab2f6456b6f59fb5266d620a0a67489d6aacaec9b2d6b5557bb56455535a5a5caf6a3a5cd05cbd98ec82389ec960db1db7fe3426b61dbfbab412fa007023501facf5bb70fc93c8c19e1b7fafb5c8cb9582b8db65ddf4ecd8b43eefbdd9eb761e15e8a73595db57b8abda7f4066dfaa6b0c7ed95e81eb9f7be53a2bbf33617c445a0312067eff6e4f442ee6efaeb026a27773f99edab9da4b0bde7f413babdedfd7571ebac68b4cde94ba3ed4ddffd4387ae91bd4c8e65e3fe93443226f37dcf876d39cebacd761b4b1fefaaae9bfede76a48f2d22bb33dc913e1ee4a27fa7f78f2b70bcdd7cfaf631ddec36b739e76c739e73dd7bd76dd37a0145b5767d92e1d844d4a25a55d48698aa597112291a9aa6a6a5a996c416d5a25a5ab82ca022c0ed81b4803a404180e38c7dcee7bc0e3438723cfdb94676adec1817ea1e470eec6b3ef26ecd431cf6f6efbdcf7d3afefe876327e771fc38db76ecd9361cbde7381d1d9d7abf3ed2fd1a5a3dd6d9cb8c64ff5bda9e92ef998ea635176948cbb8e8e1c08123680d98f3f5bb2e27279cdbd373e7a836775716def8aa618fb7afd356eb6c998ddc8761acc70aa4051c41a70ac79f8df3e07f2106bf778c3d1fe5d70b17d1ac713cd6399f8b1f0dc7d9867d125a5354ec211374100c5f5f445f300b1ba2f3301b8ebfeda8e4f53daf8eb36d4358ce17b98e7d986b79ff3dd6361f61dc853223dc778fc47df74bfb8af9f3b7bfaf7adcc11ac77ff5084966d55c04847deda7759ac0b685ed1b8e4db6cd099bc070be623ba630e2502a0e6c00c759b3db47abaaa8a4a4a29e9eaa5029540a6ddada62a3a585a64c991a16d6555515959454d4d3531597e252bc696b8b8d96169a32d686b34c6de642937b202be0c855e1aa38f7e442e0d3e7a05ce8f5f4392b2e14c549f9d08ea7cf6d71aeca85acb8312e247bfadc1587e5423a4fffdeb7d6eb3acf52ab54b74c532c2b058d8bb4aaa96bea194f5b9a65b2525ca48fa3ed14eba46d156d9fb485d2d68ab65156ca4e511e5ab35476ca46d9a91b3b65a5ac0e930b8df639269db1fb6dcb458ec907d07ef73a9e4917724cb4b9e51c937352c66c66e88666d35243e96f6c249113a5592e44b35cb45496ca5a55b9500efbf629968b54774fb35cc866bde895d534cb458a44b13ab9eda5575859b6b3d862706ab9d06d92443852aaf8539453f995a37136be459ba8942af48946512a498463775c0ca0ff5d402d0c3261a009238c23aa6a5848dd1a16524e566a5838cd1c2cb91ba08b332b5844050d415f5a3b6b5830edda021a3a0c7c7a16f5c349a3dffd5e6e8519acac8dadadf2256baed7ebf57aab9dd03b34b73b739ab5da61ae2d9c5b538d9a352019e7a91fc6983d4edafdda69b1c3a8daf527533e723dc2c0dd645ba7ae5f7fb5cb0b5fa112359cf6a68a4fd87604f3169e3102c7993545d6aeb0b287a851a5bb3e91aa242ed465b1eb2b39c1ae3fcd58b9c806f4e6a472201880f42f1d22522489fcc798f8b3a590696602a93f694276f8ba726d210ec71f3353881751858cb1ebbbf628e953a79a1f57388aff0a69369c520ebd201a45996d8cb070415580726fdc1a1c7e21d32b1c63e36fe12882e1f853db4cb5a16a63d5e6ca6ad74b27d977e9fb8552896e1cd2bba51ac923ad607369924736491ee9ffb968b9ac8dc071aa715aad6d31edfa738d0fb9118dc9df3fc7d992726a8f5bd6b0ac6c9d1080b286e5b41d8b861a16d38e6d55b165cbda14517b0cb2eb1455f608ee3973af428bc27adc6546eccfa5cf6b54646d599b226b0aaa8d5fdf77b511388a9bca5a154f43d4883e08b4d61a7e77cbedefb63d2ce643f7b77fdfd95617b9589fe621419840b9e70701c185ec66b939e75f0bfe136c848282762af5f7e2a12cc0192c1d6389a574f7395f4ae91ece2c5f414fe058eb9cd405c614b425352cab3b9d56bb71f7ebe494f73a4d9973765d54b54229a59e67a9acb516e3acefe3388efbbe8d8bfc755dd7e56ccbb83e8c3176b9ae18af2fe79c5fafda9519afd70b046b5756b5ab346ee7f2170bae685bd6a4b032b4652d0aad8d5ff2af5700ac4541668f5f83c114ef9cd86e345f7e10bb85a00dafd89f3a0853d31bd970c779fc03c179fc7d0c326100e957bda38348008e4182b87b6d02120314e6fbc25550068dac7966bbd33403f40538cea63d2ad15d5fbefb9979668c33f30c972a141403388a206c2db0cf19fe7d5bb775e307acd8b4eb2cedbe7694d6bdc56d928edaabc5dabc7da79bdea8fb4d2fe0d5c58a28cd493a7bb56cfa553bf1dd81a57da5690046f73b2da3f7a3bcda307a611add67ba51b8f04b9ba512b828befaf241d8cc797e5c4cb3ebff0405b9d2f446f7cafd2d518c19b3062881ac00679248a604bc4f7feefbfe600dc7d8f62dc4740efdfc70027c62b713dac6cc9e396c10e6b37eb1988d7d92886e0973ebb9c8cc61d7a7da89ef273c7607969ee4d8f49d706ddab4b195e6a68f42a561559b072cbdcc24cc9fef5b14dc753da514767fdbb6bad5eae0cc1d080b1cc59f2049c4fdac2ff6d46a7d73f73bf7fcd86ff6b9cce51acaea2f6da4397fec21449440e68f3baa3f28615b76bfbe33f1eeca9a5f5e6e47fa6c9bbd57ec09b29bb538a410bfe36b6ff7b7c7d4e3aaacbb6a99fdedeb6452dff7116cd372dbdfd76df58ef4d9dccbbc50d43d4175c666dfcf07619228ffec7e736baf75ab5d2e5babb4dea7e7acc6661e7e0745d49834dbfb3eff700204bd2f3ba0d2c097f9e8fa3bf7d51f77daead82ff2a3ee6dd697bb1bf7f6feacefdfe9edafcecfe9fbdee7eebdef5d7bf937ddbdebfa786edbf6485ce8bf415142ba9ff3ff1803e6f979168b6dddcfffe12eb75dfc713636abb7ded8ec9f009df4d8575e7fa5c91abdbee7c7a9f72f50cb94bcfe755f19ca12a3d7cf4c41ad02f85830205dcc21942546e0cfec7f5d1a757afcc2d07bcf3dbf9e87c1ba3b5d77d01aef7bbff7f3ffb6cafdccfe557a2d0a2b1bdcb20605d5c6fe79cc4519c39b8fdf96b1ed5560100b402547ba1eba9c471658ee602969bd2ed211047dfb21e667d69d0f7fceeb2e0491793fb7bd3f2ee49bf7d4eb3acfebbcce9b92a86e32fc7333b1ef9f93b9f187d508feedc96b7f8939d7f7957c63efbbcf7fe622fe4b7b7ad37f8c01f1df4fd7a357de5e7e9288e32a955523db738fb47d0d47285fb5b908c65daef5b1add4529713baeb7363de4e5d36fca4cffc4ffa383ed38d9956b3d2799f60da9452f167df1e637b661b561ab0dca9d1f98db5c89da87242ca2e722149eba54377da5cebf4af19c9d29ebae62217fdc56c51316b36a55fca88d932375be9f41eae710321dd02cb2ac64a90f9b9e3ce29a55dd7751ded3a988b414f200a75dbcf5ad84be8c7c5faf25f624cccd39cbbfecc56ead405ba58ab0c226b566a86dca8fe111772d0b6b1c3ecf1ab5f3f4912dce5234abd7c4429ce479466bc6d5c7e24b97328733d931cc402902eed51696357e7d1a58d75936f7be11c832949fd0ffb7da2b6bdd6c07cb1a75fdac5bb74a1944efaa4c7eec0d2ddf32f165de817b098569a26e8f2055017d8bc617bfa056bd33bdee77ebc746f5eaf745456570da7d432f9db1f3901de97db6545c227a3127d3752e48677055fdadcc9c0f8e5e3a01ec0b1eeca84993d6bd8b2b685cdde9ed2bff47195d6c68fe3ea9edea7f46fa6d8d3f9257e9c70ecc01275590abed2ddafc79c4fc9ad808293d9667faf74f78dc7292022bd2ac80c084686f3f6f38391e184b58c04c80d7f0952011846963ff63a1f46e7eb62ffc2b139e76c6dce16678cb1cd365b6bede36cbd4c11e369cb9a99293355b6179a1a8b93858333b6cab8cbd4d660cb5a97a68d7f83dd54fb22b5ede32f4fdb7e96b2edbbd850d176065bd69ab0b263574e4ca8d9221a34b52f5b1bcb28282d5adbd2aaad9da9b2367efba5ca6ae3cf531bbfc501bb954f63fc1e95876cfb3106f595181157a28a30c28b741f477491e222290f16aa2c4d4817916042d21f534b24b145521e25b4685142bac8c316aa2a2e5c7838420a4b961f9000337dca9503ebd20587892e436cce63ea60e4a4d585f3765b2d613739385ebcb876c8593e243e15745e1a61397d4ae743269da598c69ec467b502965cef3e6424dff9259e5f7e25745c3ada6aba16595db0776b5d39195655758343e501972e60c48409e3250c145658803dac26d0e36f70aa5cd92a1f59d88d0d9580b09d93f3312ddd0358cc9f90d3ab0be775b434b25ac26e7270c488717db9e9dec5e423d71739d6d13257a8048412d32ac87eba4c014b46b247802c64922ded9856c092512cacee817d9a91dcf390b9f3c7ea7477e96c9996ee8195696984a54b31abac2ed74b23aced0e02421de18804172b4c1f49a295489ffa405bee85015d01ceb0deb6cc0f98dde0389820128459920990463a0a582241152e545c3eef522527611d7212b631adf3ee057bd5e75f72093dfeffc3303ab8870ee33ae4e0841039e0f0441038388d0142d21f3fb2d30d5040f90d4e258a0f7e4c8192fe90e2ff6325488944f645fe2309b0c7cf5c421835324f20043541628045b2843051be00a1b5d63d5ee6231d5991bf0e424a22f4837fa8306af43f54086a663eaa40987f0da5ff5f66134230a343203e94edd0e37b7c91b761a4a3230b7bfcebab305162efc29291ce13a11f40219d90244aec75429912ae8d91ec9ba064239d5f3292329d708afc61d404fe1e8e75bb7b38e7f436f0fc9f17631fbb41412e607777f79d9e0f8c92b57b827e071673ecee2478232c71f1e8494a915b6badb5d6a7136d322961c0c5265068d4cc336e45e4c80ee0085e38ceb6f759793e9a735a2f66f3519d765aaf42d1683423b46a5a66b4d00819414b8d04729565b1f5e1c393d9291380df0c7b5b5a4ea0d6534c8b494b4a9bfb094d2c52f4979edda6d068b422d068010d19d0a04234021a3b481fb94751ab055a6a481eb9399e3d33cff65c25a536d3b96d8865e7b6e196e88564382bcee30e05e55330169ee246bc9f4ebe23d2cf0a8fd70eb97ebc9e8fd9a69d52f9c80b4f00facc50f4846ba7f62b1fe3ad61e546bc87e2a27b3e6545a1fa6ccc7d77737ee5629a315b5e6d5933c3873464368f2d6b66d036fe3e97669a3fb5008d3389ed3fb148b712f233ac7462dc6fe68f227948e83fa19b89fd8c94df4ece1bbf90fb201d402617b0ff5bda198e998100fec044cff3685704841446d8534f2bd1ed791b80ed26b0ddbdd5f94bb3c6a6d9b26730d93362c860db4f73c6a6d1923cd2676357d46bcf252490d7e77aeb0a7d0ae509a758a1e16e755535c6cc1ebfed55533e45737733cdd2c52d33aa064a1771b76409a766842556b5ed242c51c3850e5506e8fdfc51a281ca5ce8563e46cb6ace3d4e2d2b9f34b5340a75e70f77958e4a3292b5f6b367ea0e2561560922c58726564f0f0dcdd0dc02bb7704c31915f533f18e985f31900235e5d12268115e28a5cfe7539268066d012671d15fa96a2ef4e69c33045d7a4a398ffb7bd46ef2cd4d697b3fe73767c6a15bb9e86fe4542e84b587dcc87dbb4f8d0ee5504d5c68eec7e1940b4df7749369bd30888b6eed2cd2b6ce992409c544927c01bd1fe5d591efb116c5fc9ee7fd8b5380dedf1dd145ff3078c10f9ccd84c6ebc16658a0f75d6ce66fa3820459017aef85452e42d9f6c799883dabe9ecf909fa71d1843ddf5a1be4a2f778fa0407aa021ce7cf2817921a251a6b59b027d6533799f9d4389c9eae7b84fdcf1e61890b49179241c41fe95947326c596accd4d04c810ad22148871a1a5a2d055653413904e11054058a4a5a535881f3524bc194329acaa8613f399dc97232d85032d46c4a51b0b5291952bbfed46345e228a594ba4615b6529d61a5563018e953ca29ba65ad0c2c9bb3e252ce329c8ef02d6b655839ad428e81e5639469e26063bad96f62ac2579e49a2bc616c814932279e4185434d8755a33341a2d8b917c9b8f26077bf470b4ef36dcdcbe2f06bccfc43ecd48740d9540a1fa371bf1df68341acde650060b4b8951b5b777a92d6b669a6c186cb4dca37fe6be0ea003c1796c102d37b2db7eec8d4017b228a8b2ed1ff1a16a44b7fd98b51f34b3f63d23b9e1f6b022efffb9906ff14f6efb757ff5eb827800ef57ed142b5502c980f49164fd5bad24b25512552a89a84b22aff5c8927c77a79bc317c6188763936f672028c0b933d52f7757f8737bf5c35f6c02f1ffbeef8b4d21b319def63b0912e19a91e8c63fbb8ee7f7481f7fa035c0ed69917b7abc3edb9fd317e62edfb66cdba6e461918f1ede6aa5a5096c4d1318f6a7be54270a58eecc2fe809b41873e198c2fe0b8e31eb2485cd8d2bece984dbdcb67163fd5a819e00e757f965297db52bce34f92e8dd66ddbb6edb73265f6b66dffdb6f1fb4d5f6c664fc1932b15f5fd8c9acf4058fbbde538ee3386e72f3bfc97d94523ddf6afad16f7ebb8eb0c96d8ee3b86ddb40342ca5da7e2b18d097f6f69b06b29a77537d7bc0f3fd3fd8fc7009969503e36ad39f4d341a7403385429f79de6ae7451d226b00f89d79cbeb052466b8b6d6cbfea4274e24e02d938fab8bae4b63d92dc8ad89f219322f3392ebc2bec51896e2e8d335bd6d638eded83b6aca531b5a50bc9dfe8f66c48916c3849369e646cab4d60347db1820d5650c8c64e2551ec2deea4101d1248fd106c01942e521ffa55fa50243982520a906e7a933e4b9b7e5b248fac926324962423cbc82fce482934c217670c7153341acd8b9114b265b6954a81c1a80206141851604c491ec964fecc74d2bf014ba01580b2e6c5d31ec52dfa9549840f41ad54216c101b101cd4fda1f3c1eb013f7d3ce41d5c2478550175b891c30d0e384eb01b7050c919418e29311b74d4a043834cca6c861d32f088a147d3c3a05f085d0000d34e940c5ad060b2b0c1a4896d78daf0c1c68fad9e357cd4e0200640d8fcc0a0833402f002a035412ef0a005422c18521364051fa880080d215a209c21803403302304344529d865189141803322a0e0688c2162209921124611300af085913247bc40d285014e90544b6282037081802d124046490914a0c502b26040d6085834e00a0758f1002c12aa80001511984202574ba49840142540418131263c5101272c802f6085811032308051004c4068224403441bf88003414e1872228482071d085202f240009e74f0819f14808080835d1f87c067d7c722e881f243051fbbfe0f5e816749dcb40d360b1ab49041941d2600b810bea061f8a61e31f09061c70c3329321a746ad061436c4a8e11e450c17103cc0907879b1c6ee800567991c06577701ebeb99f640fd9872f88cab77fc0501e107606918fb60f62012cb28209f105d1bedeb007a80d38deda15185bd6b8300387a53976fd118888ef471275df105d6c15c5ba58b3ebf704a92f42ad9dc069d75aaf50fbf381da502fa4587ae5036aa3678b3d3f364a04da026908c406387f02bd001cc51e203640a02d10280d50ea88202a178b67a9486c53d7fb6c46a2405be07c117ce886d579b65742895a6dcb176c59db62cdc69e91eaa661934fa422901ae0267d828c00fdcca7e59b5abebb059979b5658d8c947de9508fbbf291e8a2ddf26d81f948144ba02575d8b2a605995d14debac45767be5214a108680d90fb1da02cc051dc3bd37ead61b5e18e0b855a8cd9b2a6c5963db5d8b2966566772085dc90407a7e2491c51bef0f943e1f13f9888614480d900958133954312e3a5d66db66a9171e55559f8f6c28f6c400b4f38bf82504b353c36860258af1e144cf131c8cf9812200510449217415640a222a40a86200584556185d21021643b2886451002d8e94c00064926c8180cb8512132ca036c2091cd00509d38b08dc324bbe28010c13c2b080190c88318ed104051b387302192894a1948227685230230469a09cb182160d8d1654c0b48217d434b14086164871410d6ba6bc804a1a4e30c8814d9518eca0c6d31a3e6c41b111441b56661b2268512c18d18254942c4c532e28f1c216189868a28aa18b0c5533809162458313358cb1218a295723a0820ad60d573865e1a0450e6474e0a24a8d045dec508607309eccf430860f677e28030a0d106982d012420556d40cd10222d65c49238a4d116a18b175c46c438a86a5852c4c48bc30d594840c4a48d152c396294b5061c2a9891ca8aa70d9a1cb93171faaa0be0401c64a1822aca2c418e184d41359c64c41a144145ba460e28a6a8a2e5454550106cbca0a27ae1883451459575950a1055609ae2093b585165c90e9e1221fd1508c02e93bad76e36ee7e12fbb5ee08d1b1c188e9cd90e1e3d5e8700d8c940830d441e1f3f7a7c3800f2d3410080823c101a0af201911010043080108ab6110144381a8244a448018c1c416280a42407404002942860010c18a1010e78000910888004964ca0040a9850010b5c000319189934d1c00638708213143aa0e481271f480104211001141556589ab4c9c26c6146994cd385f9c2846136cd18a60c73862965d2306b9836cc29730493cabc613a4d1c660e538759659260ee3079984fb387e9c3fc61424d206610538869650e3189985766d42c621a21e71153cae5c40719fb0b03f2024a3046a9ad3e04969f9535b140b3e79c73ca39017caf5b05a4eca854ecd8e992562a9a110000001a5315000020140c088542a1509806622ee61e14800d86963e6644950844511aa3389261209a310600838c013023403052c200e2bc81b72899f9e7cd6fd94238a6202ef7316b79e56720c2df59f15d4193a3422d7f5c7fd6e72626066d5eae68c65d70846f165ad570db2644f984d2952ba1f4e0e586ca8c371cdb51c4f6f77d77b6616085a60f624cdc9e0dc6c06f929dc35e5b3213203a3748268a061ebb5924a00487d941f763060fc7d3ba613e0a555fbdfda1f2bd8633d15304cf0398122568d56bd3afce8293915f1dd891b9ec8eb639b13be4a9e945db66fa17a9b3bf4a9e6e04f2513a4d8b368716b6dc3fe600652f29387dbfab43bdd8c698d5a0cb29b303139af69d500d30ed69d5a0f3cc21a78306b43c8ee9eb42301d35d3f111b422b84340c03e52ce0800c03c5d1aadd1103ca840326ad89d14edae928aeddf06655fd8054580bf7fab038a354b85f296a9918481b5f28945d9dffa1c53f85bee953d5863a4601803ee49643661d45e041ff98531af7f5613b878f8d5d52e46a3e2865da20efa1102ca37fa4a4e02cec7d743f9475a8dcaf0e14e6fc3f4db09727d561b4b742c5a77bbacda1dc07866b5a3a32988de12b71c0b9b48dea7830b802e65f00dfc029ad1f82f5f7feda24371e01287d1db568c0255e39d00983baff1e7269ddd2618c5bb79c63a748679a82debd2c32c79b9ac3f2f755277b8fc2ef4a11311a5c8c0e2a0560a138217524d607c503ee1a4d9efd70ebc87c96655eb7040837e8ab04919e28a6c623b96b0b54313a53227d26357a8ceeaf5450a9699dc13a7d5bc691205c0716e5b6d42ba580d86ab6232670c5c8d1a06b48a0d346af5be24a4a5440b3e93278e1f1e152bdd4b198efd6f8cf45f53ad1aa69852b31c8d4881c38146c0b028b21603bf50a8f0cab564026c09f369ab3b91f7c962e517675f7c23f9f3c44b7c1574b2e6799a58d462330eab8c25dc34d6a9b2698575f9c379eccea95d9b3ee5c14cc0d3cdc078604a30c0aa075d0437c5c5d3c50504ef991ea190c5ee833435e538c176c606662cd193aacf527ee6cf4fe6a2852ff3d025d218a75801f149a5484cc8d703f25ccad9a19947fc4b56dc33cc3a60a2d88f42a0375cb49e7f4a18c5f6ddcde3c3b479fb9832bbde149554f6f0d7f1ebe1f3a32f3d722c90bfbfc9f25d95ee9fae61af2f68cf847731a078558e5f9858d84fc4628356dab389a8d38cb6d26c8fcf6311a43a8de227c46dba0d34b1daec67cb564618ecf124c93eff025b4955a2d3f738915c805796a65e3a6e0a7674ea6a89bcadd5a89b3be58fcd3d69de8f59370814fb7ea02cf7f1b00694e9b31fd00fa807b07d10fa4e9f0447df7e93033f2e0c3c36365993e1da49fba9173ab4eec947c54e6f0f2c184d855e9725ebf48be60afa19053011a43a0353fabd99c4b43676c5610a55ea1bfa35ba5325a750f315f2f13d06b113cc67a18a0d547a5e85b02a76b01b1da7c35eb0871af840d7b91f2c60b1ad80e5351a6a526f49115c3726f0ede861559fc900d65b5c675bd0e548220760d68d41e127c26a11e1aebe2c9628fb2735676dcd6e423d1303d46a2bcee761964ca712c3ef1b58f8b12b74fe0bbec74da5bfeef9416f90c34d028ddbef4c31a6a5a39e36fc311c9eebc68dc756398c1eac625070c1acfa8dfbd737ca4d600064b03ade029a51040f6d7efb1ad94241d662dca5776f80f9518c19b154c8b064b1b87fba8981f0bb3ba40fae8dd4c0c74c2c4c2baccd0d9c97446dc773b4d53cc9a60d72383a78acc78d4e598702bccc80dbe41e740e60ade3c209b57cfcee2a097d661a57f9788353118e2e6944f81a68a750c34635025b81047c3433d011b8ff9a7c262bc1f383761486ba3ad7cee4ffbac6ce04e405e454e9695045dcf28706c5fbfca4e6948cf41cb353b9d15b983130a1099f708e693f8e1add347df153023559984cee54ec537866262c8088731f39283370ef6c9cc245d2e4962e3f09646518c53bc3b61188f5c044e45e91260fcf9b7bcf6a06df0c35902601bbbcba0a0da24986afbd612de7f7720a8f1cd5145cc91358ddb0bef95df19f6dbeb02135836a1f405dcf40b85aa04e6ed39e907429dec5e1cdea3472e0b7ce4938b47012a8d0755857b8e80ad7632944e3f322ab2a7fb2d56160a9f3e1358f8584c399bdd8b103afc04ef958704f4eb73bc1ff53b89a2782dcf13efebe0ca17bf3957df2466148761880605472c82f24f3dc662575c9cd8dca3e65f68a713321d67177de77e55a965644712ee600d17a760e724c5da0da5d41a5a799449b9370c1281ff496e14dde1f5069be1799405be2554b72d4bbb836a9e5b06d31288b464ebc5a6c76569269ff06e52a409b6dca59a37fc7a102e8d9c359d447614a880409e8c5fbc5bc7c3c46536103e650ea0e0856a5aac4a5e1147c4fa46e9d7eec862e76ba00664cd79aa1944130162196065f914d019bcd1b55a00d5cc12efc0b9f1fbcbf48790ecd4c5ac4ebe89ad469c4bfa4479794b8114f1cd04db45ac61aece26bd43c51e1156b4c3c499faecec5349a97c9304edb9dfb44140dce5b07cbdfa8abe5fa7869ff93e38e09b24467a9970d43c77e62aa7d2020c6e613183d3ef7a630ef56446851267735e272af9fee95ec17c39b3e589b41ae20461847f342c8d22c4b3c28d6d1d723fc7d3c8d9ea04365266ca2f6dfaeeba9662e91c82d820bc157e222f70abe265dd3ffbb236990c8fe485e66860d81286a402ab310950e700f60b1f4ac262a068b292b3e3cd558bdf128a0643590b7aee983c538408edc7dccb1a8ca5791f9ba5212e63b6a3bf20e51151184497ada94a07f3c1c2b4d0aaa2422b4217cc9e1cf4eaa66a8bce14cd267bd6e60d13fc343f221852206855b9f71d7428936b37c0411d29eb12fe61da96cc93b5c4bfee701c875e6e79f4629f42ed817c38abfdeb87d6be6d82af3a342e3ed8b8b341776b23c5edc42fc1e9db4de12ce3d93c9159b9f6b6465e2de74a3d496662d0290d8d11efbc0a94a7da4b84d63838671389ae4aee356740782152d9565383ea3a22288649ef2b7045c9c5db760e1b05e9e112b6e4b50e0e9fdfa2cb9e79d7204a42778af7b0fbc061e16aa4ff9ec28dd39a248feb2d4dea6e84cb2b5c6d4ce19a453c1dc51d0f40c3065f7913f7323b0e79122243e8f6e481cc5058fbcaad7960870327cf722ff0947a260c8e5f71c7f72670f7883d64ec1a2fc45c88a2199f84e7c5f49be80d1c1392259b7580268f38fd5c41b06d0202454ba5e79d5f6a98bb412b6639ff57020da4b30d7a13a7b6d0d86685a55a629e10c940a8d2f58ba06403abafdb4e916c697dec40ad9b6c2c336a1676e88c0f00c65e445ba53614c3064658fe9c261781e36afccd7884808c97604bf4d485be8198d19e4ba3134092864bcaeb80f29cea2973c17e3d7873cdbfe54dd48ad7d311002e1c9365e0cd7bf4ed9d94620f6528c4c2cf3ffdc6dc82efc1a9a1cedcdfc230ca473f5fd7e83ff62834d36791115cba1e96a503af9d223eeca1c8ecc9f830348963098ab221fadf84c87c2a765a45570d4eb50d7f830a65ba0157e842a23a8f9abd0c9ff73348735d3ec253cac949a5eb40bb5ff23568191d0b6c02e2c8925eb976758de3e6fa4d73c2b409207bdcd096c1f76a6e06b30217eb22772b8ad39bcc819f97f91124240384ed84733141a4b54d5b96759bc4e90b3312c9b7771e8f535c8986d931a0a9b365b101920956af64c19f449ebcd678bcc7efc5c73a92197f5fa5629227d883c4dced4b2fbeb1ae49de71f6d6ff052c815d537f8b087b7c6b0cdd914b88cc104a10355ac69f383d3e3d0456c1cb22d3772a750b3c1626011eb3e36191baf8de2c459599cefecf5b8602917f15c8eb3596847b2f1f21b58b882995023a5e7cac2767dce1a8f9f16a5e8d95b8445b4e949ba84932f0b90cd15320fe3d237dfde415e6ab17d9f3a3afce9cca17b5ae3a2e706c0faecee3750f125cc104d5e95a16e6e481da1c7991cb9127801e43c3e0ee0280ed0e1f276d93da76783df2d360f54962d0ca421812e4269b2fe3b43f86debc6bbda8179326201011e62e6fc5fcf48ff268e83ec4cb3b1f44a6e0e4080bb7c3f1bea8720e7620f45f87cf35dd3e05e80f357f87f70db8b095b917b38df685a4bcf59a4686a3847828a571d019550116edcb2812f7e9a04f0d6267380542503804048a6ffd2b3b8f38c05db4ae9f462cc0da1a963ba847b0df8a0ec775f7817b3a7a24b86c7e57a0a4a10f19d9509415089557846623d1ddf938e1d72242743114aeb0e4c23afe0d7e56638747dea688a4431ae834284bda82f6cd161c620f6601ddff296d6c65c4a754e09f5ca02692d57705c944924b46aef351ee4bc2ca11bfae85e06c1dc4c59de534875e42a14c499a5a0a55f213adf2d4da62c1ecd55e0dafe9756133e86b3a038b7ecd0db0f32de7e3af94eeaa0d57653adf62e131b085c757585a7e0ba0be4a25a8a23df3de50d8dad786cef7142b2bdfb24d4b1fc205f8a450ed9e858d3f8240ae1972f3e906080f852a926bf25315031950d0f1f66720499f819ff31da02143f676a5318a04470038a9f3288bbadff3e00e028cbc9d1077b201bbe547be96ff810736205ce889171f2749ad182003d0ec8c8ee2a82b395a41b3e8c90b48a937605a0d90a3b8da2b575fc5496e2a24e04a4c2c8465d34c99ee11cd1c7d09b3b97dc65837547222c25eb5f8a9b87095da22870a2b1475c9306f7134a6a23e3893a42f69249cbdd3bbf97a0cd4bda7b64a8366971b6c215494d6fb841a4116a5b0f9c7c68cea28f1c973ff276566544fef557c389b13846d89d572094f8786e6d19858c4538697eed2dd0be18d2a14d581137ac04a21fef59a7697c6b37abdfd733a1c7f5c9aaa69d9e1e69b6b494ed95eb4f1a577683e94b9bb1631cb101284c2c4c9bc394824e1c3354a8215b9f512147e5bfdb71c723a7bdc60361c0aa41c676d00a2b7db66e93eaedc344839167dcbae76bb076d3d1beb383d8b5406233dcf0439af87f7e86bd73d42bd63bd86d47c2c4d8c7eb223f86c400b902ec0d55e3bb744eb2fbf8da782a49dced8137292f34623b034ed6c9da3588b1ec938cdd0b894407e1f811d5ad5d61b84ce5f9bdb8007cfb3520d857f9765f62d8ddda5f0973a9ac2cd0839190a434e5a62c7f67ac52560c47e2a2edbe56f6fa0660d8652691841966f69d88856ac048b93d1538e7ec7012eaf9d3af9cb716a1c13c9e20caf1c152ca5465a1be6df36b7b05d738c009f4dd60d720526d772375b058457cee3825413b021663aeb17fcc26b7759bd0f5e1f1022d7623bc47ef50c86ea07c5453cc44fb9452deb8c11ee8c535b52901513b031101c28efa7dd0fe62b3d53bb53f5a6a8a5ed680413c2e722bea9e935c6919fdbda6d5ed4bb8f9b891f8f045b60e77ad31dce4fd096011ec46a95f1ac1b7ffcf39184ddd4eb7bd82e49af45c054f568bc5f22626c512e397ddc93e023e7379d357ceb73a6447e5bea952f206553409643bc7bf357ff60860de76e6716306127e580df9e25ce2524115b0681bb4344bbeb76f49f7591f842b1ed698e26b480a78f6f0c5eee593ff2c5a8114018755abcfc5bbd4f11b3bbc5590882f8cb82c1e00f614db9e6b7773ffe1cb84d0141a6fcb85cd7101dddf7c211de38c05756ebd0b378884e28de1ee3101cf398010e5242a1f2d58fc81bdb937e76c28689e0c743ed976bf23de71ecdd6f501adf74ba9f0e4f00849b98371b3e330e49506bc13a37c5520a5bd2c3b78c3c9ff1ece4dbb7c87c99747627de3941dd0703a1c4c19c42503ecf6edabe189d8f2ba864fa9f052585fbd82fb9d863217421de006d2200b4377880232a199ba26e7c39627cb2fd2d1e16c81f96a5b044878a8319ec215b2182df011612e3bd1e3283997fd82725181bad0e48d7867d3ebf3312aaffc0fc9b8d48f61afbb590b197aec69df6c0968b90ccd11e45a560ec4aec522bd5440cd43d3542b37aac71db94355e8cea6583edeb465684b99178d30e2de6de19a45224584c49cd531e2d81d3bb95fa97569d2a56c39e38c9e89e46ce130e6de1867ffb2e5803f9e8805734a705a699666bcc0ade326b6236cbbb056289950494bdd34f0d2f6ec26f88ad67fcfe028954557a8a939c42484bfde452b644e63fd2dd404e6e172088810431525f89f7026e8f6bea92a27af34032955d78060083fd40e44bdd507c011c4e68eecf9a13ff40031b102d60a7abee8bba18a57076e3a3c9b070b03a6ca59684ef810ade6638bde1bb863bedc0a1da6a8278429f41e138a6766ae122f2ff014864d3d6ca0e17293d5baf400209a633227e9e824737576cace05089c6daba68a0600d23d4d72150bcedd66a158e2265a85445830b5532a67e9f000436edf6ec90a8d2a3554a1426c38ffc750418dcdcb5db40c1241bab2a1181c2b5cc243f4740e146aba55d3856f2a44a050928486596fa3f0a0ed9b058b242e1a54eab6b910102148cc87f67d0d0ed55ab050444d2bcae8e142a58c948f07100176f5bdb5a8522250e2aead060c1744689df83c0c0369b9d351c5ae2b0b212092344638cbedfe67840e0551151c5ee111b76faca9262327e697e398f59fe54fe1c3e196f39bf24df2cef2cff0c9f14bf9ca7bcf0c709e9d4a03d30f960487ac69389d2e20bb9cb21c9f288f2346fc273096c34f946438d861c0d3f183e26cc20b47168e390034347c38f84180a371c6e18e260f8d8f0815046a18d430d861c0d7f53031fbb670c01afa0760822d2aae28824b125904b23b04874faa18979ddf2aa5a31b7b392c7c9f1d406517e9ed0ca538ed43bd82b53a4e23010c6a8ed15ac7b5abdd874b0f7fa61cf9a1d267dc9025c633c5bc5855a93cb13c5bfbed84e9eb51c0ebb85fcb41ba980c40457629d764d09904b9800ddd7060ec6456c11384b3c06f4d4da0a22b942d551fabc8ebb6e6d0e7accd4168b6449114bfcab358eecdb0c0ab0a07af0e4c840a755152d8af1cc9fa9fafbe5040d191a1d04ee13664c132867aa8f079898dcfdc1db1e0f60d73aa542b75e860d72dc2df1020cd8652a6ec310cb6f143ee63b848df5ab40b254ffad4f3f2a33bfe7d88a3251630d93be51cb333c6ddf6edcc6a862c3e450da8ac972a306e23b74e8275117fad9d89b00420337c66ad01104f15bbb5824a4c4c608089730b4b0c9228075365139fcd0b9bedb38704fe1c7c28c4e80c7965d3751e6746038fc9409cbf32ee2f0d3fc911bc6da33ed04c7155800a800929c3763ea3f2deed7fc97fdd3f61686b14126a995f074949e622156fca4c88333ae414d1fc8e6b0ef9b1cafa978458d0174dadb79805743ad61ae0c068c5d1e7ed40f1767232ed7067f004ea14575b20ca0f04898a73b789e1301394b4b8b91989f38d36f6bf33725890bae0ee3994de5f87c60b6b68fc5df2999055468af7e00003c1a99682e2bf05b6ebb6815f67f27ad51976159dadeb8de690cf2635a9f8ea67d5ce848369a1941e00e2f815c8bc6199effc3c70b000b79917fb1a6107ee7e2489cf11d8446fa1ce223eb29698b484d47468e3f4a828ef49aa9277dbde84b6f0fe436f6d95bffaf40d592a58887b1c746a660df8a694d0ac050a9d01e1b38cc73e80b7ddf7aceac7c0139de9883ffbd9ed2ed57bcd4b91e6f24b0aaf15a6dc124b271a91371c862575ab3fe10f4b963211fbe877e7f6f09ee3d72fc000ee43370d138c5291ed3cbe4c73a4c3acb9c75145916cc3fa9ae775443c177584949c0c7940090525dda2343e937ddda34467563d703d0e30d8ee3a0b80e8af320380c80d360dc0dc671a0b8078a7b001c0cc06d70dc06e274509c07c539001c06e16e304e03e33a50dc03e2a807556c9ee940dead9fbb2b051206fc950220a85b2067c91b5b9d3e5fd100384de83a9aab7509608f2a5b54479e5d0aa28d47495720adc03482d00844151c5da0b402290aa6100c45306ac1a805a4149032055cf4c2921dab2f2af9fb202f833649ceaa9749ff7cc89351331927b5c5e4bf3df264a899d079cd12a97f8fb655fd42c9ff4ff9996849e4a8ba90f4e7b3fcac9a9338525924f9eb915f56ed449dab2c90fcf4c88b5d6b52c7b58b257e3ce0c5d42ed969d565a9bf0f7860684aeeacbea8ecef87bc0c342438575f26fdf7515e468d091cd42d93fff6cc2ba306d20a26e0a4b298fcb7679e0c35933aaf5920f5ef313fa686099deb2e4bfcf2c41b5b534287b5cb657f1fe1c3a42dd1a1ea52b9ff0f79b36892e4a87291fcdfa7bc4cb51371525948faef395f46cd491dd72c90f8f5cc1f5b63a2ce5597b5b487f05f3957a2e2bc3a19115fb4094434904e5513d1fcc07e9720f58bce8c56f56f9a127a3291a103a03fa19da6a481d1b667639227cb94274dcc3f9200ff85a5f316e5e2547fc8d7a281cadb2300401732b8b42a4f28d77d30731258b5b647e1639700835fd4683b59d99a50a28e5a8506e2133753073b8654689ed0dddd208f95f159f51caf8abda5cbad49180528bb7ff87bbe4df882a563ce084310b3b3e8b85d559ae817785064dfb9bee6ccc6f8b3965aac4f4fc5ffacc6b04bf82d5949d24ddc836a211d4a8bc5d6aefb50f9e3c058a910a429a5a5ebee014e60014fd62ca0e52b2657c051464d83270715eff06f62ed35be36f0d5b534eea3217368f4729b88ab505f70d821e26754b37f5e46241b30bceed67a401bacd48bbb2eab814d5601040e0123b3b23009e84f17a6931a59688cc6b20992d08210e88561646c34968f540c471894321444c60e53ff66f4caee184ed262684ae6ecb0bb45065b056c77c16eba925a13b11b582562521fbf94873d619eeab70531e24714acbe94356bb91915c0fac77c542a93b488724726e8d6fd9e1a49216a7631e54a89d4da83b200cc283bd4d5731180441606e3d7cc53ed285a6580eb22dc7c814bb801b0fd45c3a95f1d881aeb23c85cbb818bdc1267304b300fa1931a04c97265ced83100e11f14e58db4695f7c1c8f9154906181106d9835d501370c59e9948660ad847152050f176cf790761b770943a707586b658461134187b090bc5d141d0b490e01861f715c3c5723190abfe31685d8a2f60e098b82359419927ef08cfa9f1257c6a0c43e8a1e375b7a460c2084c5c8c69dc9315dc12a80a46e5eafe083b67a826015c0ad9d26a66fbdbc2035ae9cfb0c37387c1bf329c9827c7fe557029b6add91d76d70298e123ac84fcb22ea6ba6504c237bb872d875024238bcaffdc7da628e79d15d5b93620315093de0b9da45ab349c77125e0025d3e14192ffdddbd78c992ea16c449f177c70db36dc6ba90540e44ad7eaec08310b4eed30a3df91ac1d72625c5f80f1e1c68b700c63bc1472d7fac01e7b1e1e1d5cab15ea14c89bb6cd3f14a7e2074df41270dad480aecb3004e0041681fd598297d441085ee3104b634c22c2b123744afdcc0a9ad4e782f5e7edf042f138c6300dbcac674bcb1c1aea0445cdeaf7af129f5d9a11807c3999068be878336933957d889cd239c8a5d84869ac317676cb639f552d1ce6872a78a7c307e1282e4992e07d906961041e389fb11d767dc59235451f269a33781a175ca40d697112c4019f772636dbc157e396be82e5d36fd8ce34036fc3d0e34f1824c5206f6c0f7ad4623cff513d1ae8b997598678ee300ce48f30125de34e5ec7ffe71ad0a71b18c0b9a297fe0db5c3cd66c66b940823ca88e66194138a1c93d979f5c5497187c71a826d3789886a1e6723ba6f82a1c11cef5893ca3373868fe4625ca454c482d179f2d961b4724a0d372e84e8e47f24c2c08c32569dc1d69dc6e9f000d4939d93d25b814ed3b709af4f6e2132bbf7ee55157c27c9fe51f9bc8efea51a8bb93aec27ab903a9c277db20b8dde60a96d149e539fade01961f450c9521889251468649401d99e3538308dcd721a4092ff426d1dc4e52de7a05a902bb29c8e6cb4c6b400021a4be749c5117954894d4bc38d041c2e025eb89df769703c125d2fb449d3b9f825e20e0aa4cf309d77cbdef8d99d7d19fc8be3c44b942beab9e2dacc55fe5dcaa3cbe4402a6a29edeb54433a59c542172be559018c2b2cb972441f3078cf0f478c4b3ea98573cc54b9d39c7a69c7eb702ecd5ba52deaa59da39c4e6db914b92693c743facf9cab8481815aac13f7d9bd8cd655aaccf55654a1fa188a5167a1dd5c7da4214970dd09aeb67dbd7e6de7b9cc72a491c6d0e443f655c03fb3c9d27585162f326ca2bea75cba0676aaa1f7ec5661c3f898862cba4d0d6390992b98d475930ad4219128f516753fdec5e9f9a3261f88c3d61bf3ad11795fa5fd8d13bbed798f3ae5c2ab572aade07c861c7199fe5de3e246d6bcd7685c0c16cbee624bf8358efe934a0443d68be4c9be174e730b76c0261e92439a23dd8562f1e627c3a72067ace8fcc744fa54ffcf29a98ac765225a52e5c64f165bd3171e2256103ea07815e661cafc66621aafb037eb88be171d14db7b3fbf322f2ee8ccfc69e40cbb637fa6716fa5601922da82231017411fd955f291ff5b60f9e6aca056464fbc8ec546f582eca333af1de4f8be44004f5f49e37d8629824a304d5736822ee25d045c4a955c42cc154e267ae73830f73fb4400ca8662a96ccac90561a3651a6c19723c0b279ec9a6b10c600ffcf6f08802846d2358ec19624f369fe6c05a4f5c5fc70f1737911e444edfa7d1b5c79630f852ee8593381c1572ce2a01bfcca1b7d0d2760d39e25463f917a216217f95b7480f8c35d1ea78fcf2399c6e8cc74486bd29a4ec7aab838a5ddd2da8336f85dcdca54ef3e71ad737f8dfb02eb7cd92a0bd07e861bf766d8a1f898cfba50b5f9da3215224b78b2073b94e35e81557b6a420bec86ac754f18d25a279c6753a20e9cd8619cec2ed7c5e40f3fd0d91deb6d5b695c30839cef5afe5694ee893bd8c98ee16837e97ff8619d76678fae59038a343171f6e48881a14ded0777b8f31d467ddf88c7396e3c28b5a0c0b1130bdd357d4f57543cd76bce087367ddb90aac059bb9f7ad5b7b7864e05dcc0912e5e001fbb32cdae097e6f7dcb8f8ee8abc40d111d336e43d78600ceb1654c6ee7a2cf58a117111ee599ca301f8e51d390694c6852b1258436e3b04ae4dc61b19948414e7769919d74d76466c0c5f085272b4aa891b5615a2158fe04e2c0bcf9947c9d22d1e7c08a194ed6516285f5b22743f1b3219755b0ef53d2de56c62207b9865319c97aa71205eb1a538f1dcc31bf7d1acd549d4316199187d44f553d8f4ca4b7b37148ab57383e182e2fb1df4660fc5acf0218b81df436baee404be7a864e0456bec5e71e16de4a6da1e46a3db9692ae2cf9b3eef3be15c99c5d270273c2822b3fa32a769a55b1bcfe708df6e2bbf6b0da0711953c2b8f0c994d21a2b6a0141ecbdb3461eed3f8ec0d40fc4cd5f41728ed510676822062f80bd7b6b3303fc0b6abd4c540ebe99cbf3cae1c2406285d4d2d8e196fe5e32471e96ad92874b4617179ffb70175fc3faab89ba677b890e7b54eecd7b940de69829815257d0d18828705ecee8d1e1ada10e3c4ca96662d1987e879c69c5fa8ea3006da4a3acc9ad13b02cf6c9d79cb094ebcfd47826f4afcdbc443e6cba6e952acd52dcb85b5600fed6f06139ad32680b4552d272c4125d6f87e8d6a10aa2aeaaf64b83f21fbd4bf11b7135ae9e7160db71e7c092d171641ddd2210aeb44428167e1b1f474942481d646991391424788d606f8a12e0544bb11edf5e53413b556bda8acf173b43bf0a80d59a65678c5435a356746fe56990bdab94a57142e3d472623cfc1d71cbf21da931ac49dc89c53c667928155a945770d529bf1335a7869bc80588461ff00e7a4b7be008851b841f29c2050a0aed7bf5d9c8fafcc42baa72df290ad1460150a57c55699ea612977c7200c375657df1acdef3a79437858f541ac3d2dc8702ede5f19fab9913ab0983f77e0f4c5c0a7842fe316c6094f303cc84707f018ddb5fab080a201762fe80d824b7be5e314a8c0d071e20ea23f470162765fb29875637c24725d919eb3c9748025432e9d100f2ff89c44757c2511ec3fa40c4f2fd3f78bb6640696eddff515e7e79e9d2d2877505dc676e6d8f20375f7c126739b5d634082f53d68a29b1929f526bf701604dca66981f86a23af3e80e264f2750cb38731807453791178c54456fca431418662feddc54784cc29a18e5942485f609b4250c7a439553b91b4ac79397712b8c711e8dce38a6243495c741de7f4ee93b3022dd89e03c0ea25463854c1c6c11c6be59a07833e5b21d671838420c4a23d66dec9149024d0425e86718e431fa799261669ae56685a03c2b8c21199162637f1effbd81bc538df7cb13e204bd2470b042f2371b542231ff1db1437efbb1a7fa53dcb25a1213c96ce28db42568cca10984c75a1a8a2c27176572da05cf340fff011c729c307ce33bfdbde6d7b315393024c2282bc5ddfc46814a12d41760ec5f96df39c397d54adac182132eb666aa8766ae9f5f680128105f99410ec7f50859c95f61c5269a63cde2bdd02361958a9f1ba3bbdbe5197113579560252aff0a57119a638af448cdc2ea2fb021e9dd586c6b519b73d974044fc3d1619f30f3e28219e3efa78f54990ab470b95bb035c8e01a31421766157e5544f5c5d615890fa801adda41379d19b1c5a3cfcbe92128644abd19ba41779d93590e6492c8e906e7454805da0cd2679ebeaff1f941a278e3e34cd2cb76918dd238faf48b943d4eec898381394a41bc3328518124d8b3a954089d52c9088ae045065fd54058d9bb60516b11a76bc3c24389a0901f80747210278c631e381384edd8308b1c7f866b30852a49bcb74411cf8fb2c1901729206b55b077c3ea573a6ff8d26e6c808942ccb88c0222670bf09b3df601cd76e344a20d53feb9f016cd34d9394412dabbd1bd7fecc750dc6aef2a40230633318f76019b0e4c89b19a17d3c63b6c73b3ef5532f67942bb4a7f4a16c16a0d60c412b311501d0d51f3a5a0aa8d692539b87eceaded56ac132e2acf2d9738ec4944a45a44c40a1eabf38f1149be81277190664186be65eb12f61b027c3d3a0c842819830d212ab7635d58c976c14784e414aae792c9d283302a792809b2c02e5db13afd385c2e6625d9f79c07d58f6093bb4653d3d0c172a51c94a49c0756a9b7f8533499bbf3384a925b153d06169c6e02367f8d4ae0facbc659ffd89c3121efbee219445f61dd6eb9a057e199a973627288034013206dafa58b194eaf76090d801219e77cd01df6a1504d5f57ea58d351fdc20be8a9ad5ed4f2ec78320c47a754ee8b0ec4617a3935ac5139d188a575c3fc01f52334350e14d65891dfdd2615658da107bb3b5ef1bd177828c96c3d9df2cafd10487eca304507ef4ef022b157d4e2830eaab088f6e5151082f7f43b0dd0a983acd8d50862058db0c3fcc3fd5863bd0c7578144eb4e42431c2c4d6f435ce6f795adf34e919c367bae02b5241a32e451c8db62e7a1bf275780b85e7e0b8996a0127d920398a6ba60531d7ce9cab62e3d12c634f9cfb015cf027364827718d40891abec56e83e4ab53bcdd1da577583d8b2ead4380bba0ac41e8b817b310254a56957e14255320257693c97fa87266b1aaca70d561cb397bfda00dee61f0488c7e01295375aec4fa7483532aef4c6d1750f8b9e2f56d1816fb3aa83ec428485c02f2170249b52d0c24bd5854c8e3a46a92ba5410b709952e55c3673f58c7d166d5bc0bd547b7a17347ae9cae38e121b5c4f182a955e286be5ffec09f1032a063c7d48784518df844fbf46cda52aa51b1591514f4ebc0e1260219c372d5cde8c922ef99c5e5f5517c62d73d0591626287b34cd1ccaa6d35159c0ffa71b16e8eb13bc702168e33ba90185c946dde7a7a08c46f79d731d7a6a0ed0c1201094fba0f53faa6155be8053aa1b1a7dd85cf350332a20084b86c4482af597e17e3b3920fa2cce942185c9721636dec466f6f93660b7464c04f861d9aeea848617792ccaa7c5d520381bb1d360d38b2794b1ec9d9aaa44094ca90593e9ef3d7f15a0601477cb852a8294bcd4545727e98fa5d138ecf05f86c6f8723e886985c09fa9d6491975fa00577529f7b638f6d086ad051e3d952f215771cb4abab01758fa1711ee5313270165c8bcfdeb63c8317068d9268b0f7f6f22108a16bf38f02697b873309489b038c6c40280bd28bbaca0486a5adfc90dd0017ae736ab3bb0bdd306b8003c5d413fa2809168bc451b6b61c310af53f64b4d784bb43c532ee440d5409dd25c0303b4402ed7b67b94231a0a1d86afbf5398a48a2c024ce33238e93e27673f3526e87da6bcf9a16e991ad0d13c81611f4d5650d77366a17de0462de76d02b82db9357e23171c269c65dc92b215864b5b4e91ae6dc23e0bc3643a90103b06dc0c450083bf1767b2875fa0c7c3e264b91e3a5c0bd58727282493c2f87f4af126172e39992b8c331ed13e5048e8fb5eaa3efb74032fdd44e007273274d3662ab306bf8bebdff987815ab0156a6b8ffa0da1c7b79b86ab5192fd30972b1c2032eb2db38e0809c44c76538fe910e1cd1a4e785ac2f5150a0752d584b2bc658c8a01b524d339a4bb970bb5b6ed43e82e986a1fc048f9e2a491cd9bf2c78b08ef486aa02e3917217c8b671c7b45f8c8ba700299ed127c3d0fd3f12e8bffb7c03647876fa96552241c9eed3782df6315a43252a4508f12aa200cc080c7e3bb8ee8b8810b8def132f395fecee287250f6e7bef415ff10119afcbfa5ecd1be4add1ab234fa30b8fe5350c13d8c17908e6728bae1ba4fc1e1c072b8c94f42faf58efbbee59de4348271fac73e1dfe7d33ee46b7558f5c4d20bdfbcee3e82cb9f1618256d501a2e0e9a81b8d8f0d23c04dd23fb6990c884b9e026590f985b7b1d31d6cad366394c811a88fc52544147dafcf8a57bc068a26949fc0c26256b9fbc7c3f503fb9630a2dad9f2802495eb3b898cdc6aaf95c1c70bf3630edd9352a5faafdd8b59c78aa4de6a33af874ed960854ddad1495940564679810673f13cae7f9cf014664823e5d40ffd8fd6cf0f053f6d4fdb8a938c9b6784c72659ae660422036e822910a608c50087de16aa0243f3dc44511681a42bb82d9d608ec7b59f56da555af749f0f1a524d28e4610ecc15817b9f4da8370a5f98e3ae3911b0fb12bb3fb1ceb70323214537a74f0516aa8726468636e5302645dbec7b1fbec1f0006efc71af65f4c54d84bcf7b33f71ce6e233ee13c743f169279595000270ca94757f4f6a3f2f23f636b40bd317fecec2243fbad6db8ffb3dbf1a50eaba69872cfe5c2e5eeb6c29d2637faaf37aed8639fd19f8bdc51f9b1341b98ea34baeab3ea9689dbb02572dcfefea6efe9eba3ef0eee9d9c569472deca19cd46b1040753a4967e43b4e22243ace19a2c03e5d295f28df8435253d1f85abfd4dee5736a31ab10e155d39544596d82845fdf3aff5fd01e9a4ab2d3409ee730406192df3f389f53caed958614f1bc1e69361012689030b0ee149b52d508ffd7c21905d1a9050709f6efb9c53884318428c4858d1e84bfd64d10f1d6a601f320ef75dc27ef429e329a90884e58fba1f772fc0f5dd7c210f3bbdc3ef860851841fb59f2a26d249150129dffdcc5ba1fefeb7fa19dbc64b08bd8e4410b456ddc15b59862bfec4086dcafdf66f97f538585d9ade8b4735f8d084c9407525491555cc01a798c5cfd8d6915b653ba1421e095f9f36d36d9d54314e842dfd3e4845af1670a8b444320281f2100b47dcaa3cd6e88f414716585a23bcabe91afdc83aa9fbb4d781f7cf4a93931f424cf7ad41d3f7e9f84dc064ce7c3166bee18272e8d234196161b5f3700aa67c2cfc2473bf94adbbaca9a9a5e6d2768fa521fb6359db929bbe74eff0906b27e5654c0aa82ce381dfde34df49cb993be982fd633df33106db0ea409144e9d8af5099a657d6b3e7048111ef0a8856b7028255e375a118f55aa4c75ac2b912aa09fc79e8ffc4b9ec686b2b7c5022ba457fb392bab81e9ddf9cf7919a07dbda1f41c7ee671f4473deafdcfb01f24ec3d74992d38883508a31784d8eb87d995275d791bf8975626935584fb06f55c3fee2769115e970228f6b7f4d1c2c6428dcdee9083a82026346f49d6f21927895cdea9b7d85d8e79b9e044d38d72e1c925f6e1fbd26958299c4a6c2c84205cbd03a12a57526383052cc0c24c90f62dbacbcad10c44de686572c99702552f8b1b37a9bee72d7f2e7e20aecdd73046c95c818e66b66e6142a8523679822434c4221076fb208746202dc2f8abe131d096881c366668de033d150164ad7ba27ba1a3ae5eaaff0b994323413ab7198536fcbedf2ff627a7cac37bc1dbf624eae3f8b7e8a8805fd163144ff5b9356c87e379eec00102d365a4fe0fbfa650f0708340a39020d484505342dddb0f04658d637f106642c9b55fc6f26933468a51049b8ad3e59b05efe56c047357d553e9f428c4b44dac044f4485e5c85f42a394f96532c795071021e297290f51724e578b741882ca0d4832bbb48dc05ff6f542601d9414462538b97e3df592c901a4e754b7e4a4a76ffce0dfefcff0d54264302a83fff43d7ebade7d0930f5fb038945503c360d5bc206ff5ee18369bc7aed8c57d61fd12f04fe29c8a97c14bf6b434223105a7694cc71d795c315f3e37c936a20cfcc42600d05e0d0b936a2059ad9eab76815c6a938bba286fad6544e463b660065cf476d600ff0fe641cf3e1ecab36ab16e30892ee8ad8c18a724b8759a7b718ce9ae94728b2dbdad7198cc3ad36fbd4eeb8a1855e14d989888b6d65b34be223d6a152d3757723621886ba44e380f2ed0082086126310996e82ec742d3d52045bea78dbd8dc37c5303e583f18db09f8e075586237f08860662393fadc0fbc06afc49a57ad50a7fe9e7e9163566ff93850b988f75a1294bc1ac150be1f449883bc9590124193dd51410463aa68afe6c1b29f4509c660f86e75dffdaacb14f93188543f695f0ac49d11380853c84e2edf88bd83ed99dbf9012f91cc251a6856a240eabc5755dedbb71e30b8330b80b41a75f5c40bbf3929b7e99a8ed341cbe01bc1f824b8c0701e3c00795581cfc9bfd4b5f7de1ce533f9e60106009a1748f5e1798be5b3184dfd696dbd4249aa32e6846cb5817da8280d221e03288b93eadeafd768f4b0d2055ef2a32369e6f71eff7d8db951a88c2c2cec294842de1a62ac0a7c47ecc6f3c1f9eb1337935dab2fbb8e63637cfe067084ef586d862e2e9a48d1875f9b2df6bafa846d10810d6ed6422d8e3f3115f8168597f6f0d7d87bdbc378da3db6a32d2d162502a0f9eb7940ddcf532ab6182f57b7bb62317ec7cdb6ec463d6c802747482951a55bb7842247aa2e847af215ea81e93afb1095cd315b839e4073a97f717f9cf251374fc192ac190390c66451f1769f2b895a63fe6092ef8f8d9ec09a793857ac85684e0df92bfcb6a8fe11b69577b23b0addf2a6cb3806c7c643397de7228e16ff1b4fd8f3722d5450027b652fc7c48804c71ed239b773c48b72594db00576172d345b50f287abc1284ab52c28b818b1906429594439344c6a4e5585a229b40c51565751d52e659851fa1ab908d237e649808be24ea99b0405e8ababe1ca765307343531db4187335b096c689d668d582edac7047878825840ed90a00f8ef6681dd759f34462992265498c09e99f4f779829895e02041b45d43b525bcafaf8e600b33fa5b4f8012059284992b1bc86bbbea350597a498abdf3effd8d31ec6852fed4bde085665bef81ba98b8c9777450c473bc033efc8b7ce275868d1ab9517abbd105b9fc2504db4476eb44203a62aa451ff06f8c38697b7aebc416cf000bf6c17772f27122ab280afed2a2a81705c7fa12754d087973f7011c960e17fa3cf4df062a10882a923b035edc3893ba9d2a77126bf1ceab18b383c53e3f0f81b0caca25b0ec797312a8d57c1e02c096979b40d9e7e625a06c2b6884f990776698c2a391b8cdc50feb8773050fe4c8112f919d25b08647e972010000d2fe751f230b254e1c2e7162f552154ee96b0376523227ae1e8f3602405e3d0d0769043b35c76ec6ca95d9603ba2f8214038b98df3d3e65502f5f3105616d003b5d22e35a91563fd0b2630fbe67a14cc1c130240859c88d04e194c0db43c3cf40cb408ac76ee7e8a761c38c3e90272c712d1254a4f63d9dbb663c7e4b6b7c6ddcb6f9b45779f73fb6b748f1469e55c5970d2fe586e601b75ade37bebdae9fcde5cff7ed381d00f5c40d1876f5b79051c8c040aca7324ca7f83646348f48c1467e15e19cc18e4470b2d4c73acf9d72df9e3c8a329b951ae0da3d18da13229b40197f94e5aac6a58577c7be682b66955bec4f2a0c8aafa07ddf5efcdaec4f35b793f17395d791780630cbf6fc5fa5f1e5d15bc7baacac304111f49b7140c2733d98166e027945feae464ab690e085f60a729981d8975e68c2cdd5fec1ce27e964d8f7b5d8a0a9c23eea98c323b36287297a4bf55a67a6133a7ca4dfdb90d42c8b54f4a11f9e76e4ab3858a3828a9bddcdaa6552b7b64c2571f0464898c05b6f6a6b747b4b5d30c156e5abf1f956f6e26914dd8bb0f42cd8eee6e9c5f2529d9e66e27a61d76e4e0ed4a0196af29ba99ea099453bc7f5529d9676ed2d80f9f270feffd5505c99fbb99627f78de6cf8f75728257fd66d9ab2878c7c52597a1a983d52152027aabe702fde2ee6f65f1539d9e5b7a5da9dabb705fe7c1489e497bf9568f7bc9e1d78f3a12493bffc4652fb734d6fd84d8111480a44b634bf8ba2c214061c08c5c742db378beef95f8636321fff326c5b249c0efa1d682aff0dd9557bfac0739484e920afce4f1c01147ed3661e81413e6fc4c584a48ac7a54e9d3986cc87a81ae2edde442ea4632ce4d0a6929f5856a6af0f56eddbcd9ae7b8a668129fcd2d23a8c9bb8da47d4d16ae987099d1db582c719f7b87d02c20cce0ee19113ca715f61e08b0510174da6ff7d18f7956db67fb09d7987d98aad837189535117a8637c0f15d67009477cb2d6ae2c22e01c5d8d892456885dd30340a6e327eb032138d28c4fe50594e6c164419638a1d74c7afd4132b53b7772d8aeea61ce16159c97867544ace78921f2c1b4168eaf6506cd9514622a98eed4cd1ed3ad55269e2382448742a1c7689484db4c011bafad42dc73d5d64f93b03097a0f9ae5886745283616a789d2f1e5e0d88852acdfbb920581066f3d28336ba02dd0887a79f7ef3b2b055f9bada3d5541f4fc7cb708a3a03c112c19c3d868c525e4f9063946c7740195b7ca0a9e2ae213f4d720ea413b9a2e3abaae397ab33b06eaace27b8c3dadd840cbf5ba6d0dd6f19d8038ca627b818e3fb9d4951c7da80ed3bcfbc046910776a87389f367dfcf3b24c0c1312f8973796161ee298349cd2b5175cbab35f89372a179fcf2ddb5b798ec6f9f4f6f389c69bfe99a1394020321916afa277a4bbdf2486bd5f17d1babf8ebd59f4f2f8bb3bb7719ea973d7edf2d2871e6c796df39fa54cb17aa50e6a6872d4eb9eb8e8e8be4a6a24cb590ab1c5e517c7b18625a022387c174d22b6618d2f582ba289852224c9fc69cc3207ea084305cf5fc1301672e2a809331fa7ffefa04523a67b6fc43bd5b5319c4ec73d10cf44d74efacaf7939a755aa0a683a1aa5db6388174242194fb1bbc69602a23241a81cfe574e5245c556dbda03eac64ece5a5b19461225e3006aed1ea401a5137c07a50dde03604889e7880917cd7da84df57e9e70b41bb5e2007180489fa8bc11e4e8b5a407ed72ae35b15c0df7a0d3ae4a532504696e61ba6f9bda0166b2b8d7fa49ffdde1eb2414418e1df07ccba396dca45d2cbdcfd72ad66c54a74f9c87d2d8fa006e1ced177a8645d7b171f1ca95789a8413de4536d70eaa16e1c24cb1066947de1f78a3bc61c60d43a7a259c3fac2c88ab1acd05b89d7fca604c872103ecd34120ade48c48ec79b0f934c07e47b167163ea3fd0e07587cac6b01923b6ab899ad380eef4221f5b25d736e590f5e6754b8b526b3f3ef2b0f3607c3ff3e8ce465b32826e98132d27039d605b9dd9879f12692667763020c2f10976797c03cd1d17181f0966b1c28e3ecc02f21e5ed3c5e06af70544eb89ad87c4528a41142a17f64ebf53c37b596fe249c24c05a82089e627cfd0833878b6f0e42fa30154bad0e8e60d86d917d300a5813967eede2371672ac81cecfedb7fb665c905b4b82749747712bae563e28afd0464039f17d232d581f42e2d11d6fbb86ecd97e88c260eed466455c4509de45dff9b147036af7b13f2224bc02d95d399279ac5e4be329a76bbef6cacf5135988aad925d772a87af5a5edb0b4afd1250ad4a816ddfb33502d620cdf8af3cd12a99bac594440b70b449a5b9cc554a2d346a41f6a66573fddd506da59e98bcda9f3fdfa4f2e0f296c427f320db8f664ea695a14c39e5fc6ac557e06d6082f62a185e6b46028ca4cd3f5bfead0113ad9f5c5481ded52605c2253d698e7ea006260b63377ee59c46c62e8f88c628c09bbe306fe2d2976946b51eb0c6ff710e08db721f1385101ac163a52149970892eea45666c2b78e941ee62e6ec7d9a66828620fe053b607fb5bb1634a5f4a4890028f14b8b4a835ab988ccf2159ce73eea956810dcc221f6c88cc43f70a8724c6c748123940cc95ab39ad8d70e47aed04d303f3aa07d87e83528fa008618157ef03ed4dda648927cadc3ffcc0407f0b8d66c80a6b158115659586a5ecd8b68814d246a9fc4674578da4299a27eb1618fdb5bd4fa8d188b84116d4e4df7fad24b449f54d696d5344f4a3230b29e5db91af1d6f2c6249146b1f09444db30add7f8e88ff56644e834ca313fb7cb25e394af3bce32102f9b362d73aaa16b9cde0d4357fb3e5161b0b4ddb7c351321cd904626be85561da98739397c20339ec68289b5e58b83e0467a0ce8274e6832eb6e43650224bd2974c867ffcdad9440dca8c9fddbdc8b6fa701206ae776e55908691fd9a2842dd136482f139e1afbb4272de27e0b43df896a91e0fe088a4b2c2bf2d33f11c30c68a19e196cd3ca97331f742249d85e8a35c6fd685f28fa3e66afd842b8e28865035e071ccb12f62dc7100ef6952c032e1178f8db0958fd2b20fdce1b5ad8c04d65410646bef32a6b28709b5d8166e302a6e8e97742e158b353e26b0e9adbd6c951dcb4fb6155f24c93f5eccc17bf9f20b8751ada81f2a1d1d2489ecc3df5e8bb7c288fe91be75c22d6a4b3a33e58de84f6bc2b01a637ce05cab51484ed0a166bb966cc23ee56431200c1366c6f18f4fe64a382aeb357c7c9647c9340881f6ad95b6fb66b2d3e33e6aa1cb041ae66024b0e03ddb2fb17ee287be38977d06c267ec9025bdfcf9f347bb9f1490f2e492c788910cbf486a1b5e87588f4b4d6c31d4f140be49b8d0c689adb3adee6a82e89e9ef1b96b3f00a4b3a81853186140aa4cc599f61882a55ab5cb8a818acdb15a6e6037f85eb0e411a85ab26da0f994c16cacddbd562dd5d9c11b64e4d297bc70cf39c32c39e5b514f30442637573a2d5d5bc45367c74168e68a45e830e72b165b66288af8e19d8d2465a255c7d966a3ae693f92f20269ca9588f4ee5130c91f8cdb4820d022723fdf40b916b2d1c06cb2c9e5708e35c726644dfa2b90fe627befbb83b30a5a59cb119d0f6c663d7b69dd5b4bc410ce5050685387610f70f983f45e5d798b0bc6845c6998d7888412bf77967103b6e399099a41feb3166a887ae81b1b4e649341c9c9e51e6d6108f3bf4ad754598ff0821673ab777f87f861a09fa27096be0ee0b098377719fc331bce8bbfe02ce9e2b24f767a56402ab456f37e0eb21200575135286288306fc9c9dd4a10ef4572a7341cbeabf61d6d5ddaad70eaee1a23ddab6ef09b9c4d1d61807439282c37c798894d692030d16e8e98b9e18e1e7a28934b626b4d105e22494ce31642600badea37e18b34866762aba2c8f9dc4fe641e99c38045b426d6e40069e08378cdeb32d0abdaebe8851edf018661d4da4f875ba70ca42fe75b48cb0edb58e8952f04d181e5ab76413902e26fd1a0e93382b2e87da7a5aa1402b94ff02cc9d2a13d9b56b65feca5f5089f74598e42a5c91869c25c432482fa14f218b60dabb5f6bdfdec9cd2df10ad2d750570728fb69e244ef6734612630215ea29ae0c0c02fade927e1fd177ef2892b95fe9392f13550ffbe0900c9a6f7603e2cb13a77f70ff1fed2b4f4efc2396cd00dcc344809d8ac9f9b0517ef6b9839430a1ee307687a72e588fe8a926da4aff893636ca2f8ce337c7d8e30e7650868e440edf1e1f1a0efa9810626673372228e1350ab8179ea03b9dfa94e9995b3a3b6121418b48af77a4a2c087fdb014601fe736ae80cc26181978f466b221967a2ef7351d60c7878c2353c8141a334c6ce5521b8efc5a15a0b31e6152ebffb9dd5c3ccd35a5cc4d39979a1db6c296a171b5b4e62a97000ddc05b6f0a9e93590eaf8d09468900a2ba254a9dc21c8579009c427b485e96406b5ec6fe0d6ddfb165eb5714aa64036b1d99db667b8e66cc196c64827d6d967c693c8bbc9015506b93b05b317b76ec0eed64889fe618dff9aecbda004915fe88aaea7d9d06b4332245e660571f4fafe4da9e84d32261fb3216bf3c2355cfb18396844186eb8f55827beec0530812aed470a68ab3fb9442c9de9ef26b3a405bca2ad5e97e4c352b7c45cb32e890c498bf870804eb68013a0b3f8ee810182e4aad47d1d65213d3ce905b966726392ce69cf3955198bada521cdaebd77d538b3659c6ea428ad96d7918ee5b3d5d50289add16e33378f28653fda087a527ea08f33e8a1b7241a3e6770f32f0d9b78acab098f8eb1529553e88daa6d68619337a1651ec27659ee9683f36db19086fa73be70e04548dc10235a9a29c18c0fa48d6c04dc134dede492089619a1824587f1a9526397483f13dabae8f2b2172496b66b8c5d860d940216313742f3323a9e3c2b03e59dc7ececc679c49407b056d6c3806b9c8d0123913b6510314e2de36953533ae63e76a5d125dea4da9c5ea42e9f3a9e25599d958b216c2e035c13f04b2615aec119dcc812a6b17b1ee4a09340acb1846521fd056a366c9c7479b49c20731f886a56c21e0796d5ee19c0b6fa4547fd89d653c56e0cb5f3847c15b29eb1b9863982d94f20be6507823e57ac3e92ce3b10a5f7ec1398200a1fb9555ac267625f9868d5301a25969ae2a8d7bc0d19fe4fd8730eb7923e30c06e8fdacf345d2bfda7adfa2cc5652b8abd4ebef29f3190c3dc36f85248876fa2a3387d544ff00f64df30534458aa0381028baed1fda57a5b329ca2a628a30e834c6f7e09af9178fa2eaf2fc49348dceed4f9417717142be3019b94ea5a9feb4b2fd082e1b099ff8350ccbb653b8370b4f9ea4ee77cc01a4c9f4894453645944cd7019e4a09f647024e843e4a0a06f1b639470944c3e9b5f40e28d49858f86dbebc5db762bea9cddafd721e09b8762adbc1eb3f8c0a026636e1a943874b406804ade017f5fdf223a380321c5c98618afb3364209ac28d130f3471e4628473d2a3b23d6329bb11e2da10068d1d6b8374bb4f740919bd7f8cfd9a5de82236dd38332acc8e4440060f8be477c7209a745a4665b8bef4d7629a18813d7bd24ccbfdfed9021c0227a7fd1ac755f644eb46bc9d18c8ee4da56d2abe4595594fa68b54c09502fd59694cbae8dd33929c59fdf546020954bc63472b26f28b3e321f306c91256be8c02a7cdc99e6b43d350fba9d24df29fc8a93030f93776590a357e49ae0d03c40b5b300e499e90a2022cb8743b9e1af3834b633c8a8a6320f34c5d9ca0f298c6a17738ced89c2b4a1f826a3aaa76fa93303a979e3a04250ae7b211cebd2d262fb4533c9796e56d465e1a4f4db56c5027ecfec255186b21e31b5991f615164b2682d3706374d6caa680423159fea37b475770ec849f0534c9a516922989aeb2e61bd965ded4210a2b28e7fb21effe49ce119ac426e181f848bdf3fe6435bcdc9e114b5a6b0576adc87231ba064798107f311f292bde1e62a0f6f79c33bc7f61820d90d4ad01180a4a7096845f8ac9c2dd09c941843688cf3168216ea6e8bd5203853f6f6b5ab978950258a90b2bcb637ec844f9a96e8a0dc4ef08e4327e8e4a2ad493e1560b2da6645792b08d316c40bcc6c2f442727679eefd8fad4c19adb18e07f8bd74537f06eb9530330c0b992a91e0d95d6e62b3acb7be3bfa50ea9d83ad1d00a0b594a813ff505bd01f55381d386c0978bc589cb4028ecd7519d91144ca24b8b7e699c1975c5d5193d697d0240a382051943c2444c1a58f5867f364cb8927cb55b475c0b445f5a91821b175456bad3a4617d4e09ef4ef756179c06611eb4a49cdc0be82efeaaf5cdac56d3fa1507e285155d40212bb8af207b8bfde03c4956795f187a121cef8ae1750865d4e1914bca7710927441933b80c68ed16cd388ec6c8a132573a1e7abba1ad17e9f8e0b9a93c9d0db11e406c7983c42e394f500bf20bed9cfd781c9d57c2c3798e3b52722cbf8e603cd82c3b7692b38a02f42ad838a2ff4930ca63b8fe6cf37a56d9a48cf5878d23ef04178bab4855283bde449035a147bb4d108017f1aa777a72272aa7c389fc5a8db2170fd820991d8c5070834a17edf818828da398614b6aafc9629e4bab6c1547801a826dccdb79f78ccb38b8eec2872c5bc7d6a605831bb2c67a8c8052a65a19eb049a63606a0c1c2b67d82685dbfa6a9b3ab76dacf611c516c62fcfc8de84825393a6fb9d42ee38d3fc3c53da8557769b5a98c6528c5a50146c61927cea5089e9c4d596b529e74ddd3d9d13cee41bb744db68b753894486c6e897c2f5392e1baf303290dd72a530b8192e81c25c66cce8dbb0ba02196aa855bab08ab92774f8cd8262c3ef04f0658f30bf56142999d0f75997a18ace4045b5d1da4716ec64a3b3725e6f252df4134b2e405b41a06d669ed010ad204fb250861bddffe08f5486b81a01d95c5e5dbb01022cb05094c981e73a5c9cb5e9e5d03df8d04cb8129731b93d2f8f9916c2303010f75a17ba8f54f05a5508380159ff21084cda8d5a55e31ea9784b666c4306e82a2115d19f9ed4979b3774acdabfe5bfaff6874fb5c24e1053b42fd5892a9bffe38901c8ba110319cfeb39a03f769b67aca52710c7e88fd75738e1aaf37ed04b2b295326cadaaa6dd7346e530ef88484b1bfa769f50f672b3b82feb7d11e946dbe8c050cecb6ae9a441109ea7a17d7ca98694e4dd149d1e292123e28b31055f320b0f4dfee8d3e6e2520ff74245e1bfe344a8572c5b441172adc12a8f33b393bbeed8c0f7e2624b7bcb57b7da8a1f53fa5c8b599b7778bd85cb1e8b90cd987dea1170cc900c5e80db6450acc99fa4c8dabb159ceb1140a9d2aac75468400494e733781294e93b38273324cd3b9260fc7053b0ba0c69d78bcd230467a9a4ddc5d8c06fba4da7e2e4983aa63498dd69c04a5feae7a93f49c8d25bf83205a2cc0f6fd176d32656387f33c83ce4eb96275f532358b9e45bf6a2acfedf0147f17a310f8549884c3bfd80eb110ec8ce29cf41272220fe960ab2c59964e20a9d4d2186b84b560c40167412c0758c51503fd0ba4d3ba864308742c75b05dde782ef0432ac37deb30add13dac0e6021705649e82d2cb8e30b23143e04c643738ac69cdda9cd97f97cbfa1baae2b076fa78c3feccd32962bf2e9339893301b94f30fcb31e8564afb067320608bf2fc177624ceb4a1612a5ded969beec3a10e00b84db5e8180579da0abd40dcace57de8705d80ba468a365ccd0c8c29397fc10a58101a0b71c4524f8b8e3e85d6b720f08507542e71b29501daea58601a2f8c9ec9971cd07b38a18f3f2bc68ff3b6c7532d9de6c7f0a9a69637f427f2bc787eb8ff8e40bdcc9bf18ffad53c3610eba57a53abff388e44db0da5db1367e80b51fa709a30323c59ea2e0c4bb7c9b4ab335648d49149bd827e9d13fc7e7c977aa5d38dda79c7b9cb600b73a115989527e80f9759ce975fc544bf5e00454763bdbe29c47f2cc7d97aea1368fc44c3fc5d9115372a9e429188985911900c62fb737308e290cec5dd26a37a1d835414d620f17167cd15dfaf2c91c911c26ad604b79195bf96023745a32cff21320bd862cd4b8c382d92e8d1bd75e120e27905ee7e1748507fcd0fbd8cc395c46c641b4d881e1f4a7380a7abf9d64528ae1a0bd256c41baab928948172a5ea1c50862454782b70148575c771211488a495cc77e969c74b4fafe09711c6d7093ce993e1f190e4bc9645352354517c34bb8ca173ac6b7f6e91e56d16a6ed899020cdf524af9e93dd333b09b48764117ce6eceafa4a4a13702538e667f8b04e99ada0b28902161f7edd4f0aa5d13be4582d4553e409425091f71ea261820277a1f3b392e5e7bf6857c3aa5ea07f07211f31203572012654e67223fa74f351475492bfca950119b4a456c0d9a1938a56181b6ece68e5cb76509a6ff4ed0a797d5b55536190baab4be3855014104c153e9e00853e9596f5ba6e5fb6ba70a6c279c878609faa35744aeffcbcf3e230a0f945db6c042ca2fec4ba59e8eec387f50a2dbf815c10a229a659ec44b63b3f866979d17c97ab4d34f0e0819ae8f627bc5a03216b7c1738513aa8905c8763ea82fbf15d4a5b2e543a30a913880f81702e8531d9f9e3ba5a2aba1cc21a1c1201f9d6d3984d6be271c24567791a708e638ec311843eaa32c93b89971d0d0b948d414899597b7808d7360cd5cb10eac20be53dbfa3ccf25984240e3accb26ef25a55a3d4e40f3f83b978032d24a33a07c78b3973eb5ef8f7dd4c63c8c2fcad8cead4589323cdd8ad1a4ad21b9d087f2154d954c959ecf3377c2e3665e9adda15310fc12d38cc20ab519f7ae365737c9b6ff33512a8f82efc44c9b171fa73f85b7fb8241ad0a4d545ddd6c606cc18e70006e4e0d534815d66d7911161ba83add966935550e28e1d90841a64e494143b21c5ce32e664a6487df95e2aa585fc49fb8cbf32bc2be86957dab37855bd4c99c45799a1d39835a02f47f4bacb97aaaf3b6f19a82816636a2f80bea9e4942e18087dbe52b1ec92a8663ac03fecb21747e7b0d2da2cd2e9bb80cb5840c0c27960a577b4cda60e26dd948b112d9ae621d81e2a56f2ee0aae1a270146179a6593246baad2a5fe5e65d097c66e90eef4d04a0c2d4ca9f9863fcc54ac54d9065758b8609d958a5c65b7c49de60847170dce5e6edd6590943189853c27ea5d049dbb21ec523d46b5e0d14a8f528ad5c750ce35580c3a61b4a6e6ff68a6326b9677178fa67e84c60b15998e339492af73ad20005e7b0ae34c7e1146d7ecaf4874fa4ce97dc541b26aac593349b32020a8a6ba57cf188cf3607170fb101f86b4310221b0c20fa290d96e9c42111a286e64490c3dc45f2e8dbe1546fbede92aef6a51fa8480fa5b21785f59571792ad4ca1d7d6b3a5117b5d20c728eaf627ddaa20034a08e10b6538096375847427270c646ea1a797ba6880a0dd36e5d00490904022f9643f0b8fffb53ccc01546726428cfde3313d66d98468914c75230fbd51e112d38cc50a9c27e6da079282c651f9eacf760e907890bdd26f1838a9ff1915e20fd357008b0a166934f8bc4f83d8a71adb96ec23c6c25d95812a28d8924e8981bad767ae1e8e426b1af0dcb24f7306a4617d25598e3188525caef981c4dada077696cb01c2d3edaa301844ab3270a22addf3e2a8b59927e4faefe39db21ea7c8973ffe32ccfa1a245895c513d8f329c6a5d25126eb5e215f53554dfe601e5032be3b7725907d4c5b9c3f96995f5970c6a2e353535626c7e3d8a60b4f402efd6183a6cfee9139c5724dfe2bd5ea8e9c70c3f52b2e91a23bdea04675ff7651c06dcbc35215e797ab1df2a2ca2fd6f0c9aeed0700e01f5127578e807c3cc1d86d41f79f355b0124e0af71bef97f0b3bcbd17cb0078548b656eee0daa5cff37c2298827e7bd3b03050798b2517c069ca36c644bc8816d6c0875cab47d22fe0549d0bf73fbcfc44bd25020e502b0ddd32022b065a4b9f7daf4964d86fd3d8584856001e6c480cbb400da434149dc4b71f6b0d234497f840b36ff8c1da4638dad478c276773ce83ec65074ffc67ff750c22b449b4c40c040cb4966e9b7e56456f3cff643a34a5a135f976773473fdc3e159be69b6b87604e4b04385f9abe759f4b7a5859ce79531880c78018b2277113bec70c9fe48693c53402fd4c1f8cb8c4a371be0c46cb074312b2a2a1f601608bc56d09eb47c9010a0a0cb428865d521ff17b757f6c9cd25a9cfb45d0cd751bb4676869d73aced65105a1606d94c9a023731cf4c01e9dcfabb27a059678697ffd48937d81dad0bfa98590f977e248b39d17aa2d9fe2edabf51a2283f8583e17bdb0241992fd89a9007f0a923ba675320a45daf41b7f0b00490a107115362aa16f1570b9acefbf06645a41a3c868774c7249ae2b77375c94e93c4e9e2a29d8c43a60af2c1f9c3dfaa6a234810105db3795ede906dfc19b7e9eda26225e4eed4ce43e4a4e9d41a71556f507e78b55c018e6a6f6997e3051bda142d4b84c530181b93920c8e258c4991ecbcc8a06eea8408184b88def4fa906f59d2eb096532ea2ebac20f4cb79efae1814086516486f35de3459bdeeb8d9f12d5e95a08141638128c063bf2b52d044773427ef5dee7360270b4a507bc36d37c8881f5a86a99ef3abf51594c9bf079f391b59464c96fc2319644a5be30a1c009ef9c205b86ac903c21c11092daba944714d2d997e18b2e3502a7ab56661501c4c7cd210678f42b6ede3005168d7b55e3c5e70f8770243f9e1be5d489b090f30d9ec24a31eba25be0524fbe5b710306395bb930f7bd3ed4ffe0e2091be6495f4a40ed063bb2bd5ee21193836273069e9a82744d37c9d31b8d10d8b9eb4a87d6c8fa47b579519c85ff500f592df69984d18d40ecf2f3f593aae4493f84c69a6f3b6f09b4dd9bd81d3ea079234cf6ee08281cb5de7c6f1894c5d35757d598535a83aacf5352f447abbb3ed109c1d3601122ef7f6645bee1426f1039aebefb95737363a73999fde4655c093872dbfded9053c4752d364edc0a1be8668eb8278004bc7fada6e1f286512219da67f59ed3ee4562b4c3ebeed8c9522d32db4374feeb79dd4f9256ab82104d13267d0d5d05ad4de6c21ee569f310158116189063624cf8f687d8da80d2ecfcfb5390b568c8c941bd30b7d7d2ff1899dd792138601cda5046576ce52b82a112745d6948cde41b28493571dfa3b80b0ee792468bb009e9c9ea63c6397242dce0cc71666c25deb59e1b4f54ce16c610670b4343bdc5acf74c36b32b5a06f3e6cee020e8493935cadda985761b567cd3b394ea7a1a9c19cc3aa64fcf817e4a96a7e7fb7c81f6860d66213cf187bbc0dcacb429deaafdda5757a41d02918a122103cdaf0aa6558747fa4c32569e9ae490913828e10be0e6956c7e1317ce5e46823f9df6f275cd7eddde90f2ecc1ad638928e4f89d38beb5d7d661d44c3c099e22d5af1cacb7ceb3584d095a579600af5e8dcbe0aa166024377debdf49cc82cf03e2b786fea659f3e58c55917ee649b530caa93a3dc78abca9d0addce4d17bf5e74f34719e58249863107751ab8e964acc9749b568e811bc71c35d67faa6e904397d57165c09491ffb2bc69f7394c9923e83cd39337bdf7982a9ddb7adc1603da7e9b98b91a98d0f960386fe0dee54f01f3e8ff3af17690af8728ecbf7ad2baff247d9c9cedb8e07e04c7663cebdfe8f47d200e119d7a1b43d2e482ea8d9425f27fa32746a3a5cdf86fdb034d182e5ed8d6de535a8a16f27f361ffc852287fc1f8ea312737d35a0dac8ffbdd4b044ca5b84f3299c900854576290dbc266c830baa9966ae14b4f81260163ca8e9d0020bae9b32ee93aa93fbbb7a628e23782bc002c1846b87ccee32199a208c6bd33bc004c92a42a56640fafb6ddd2f34567dc5d606f117c5a6895aaa5708cc2909a761bf988c6e033be00accc897f2f0000c5a326d0771ec4008c649b4f25501305f7e2e6312c142ee4b47615bbd649479bc2be7d8572f091acf1358309109d61e47651738a4ff4d5d619cf0e6ae30989833ef2377ef907159caf89663eff8703c112fe00f10e93fcfe834addce21061a032aee988c762ecf6cc2a1014b9bdda2f7739425e0bc25a0818b2860b16ea7377aef064ad52e85f7ea3398ab808374d3e4efd9028028085ab7be4002b38a09266691bd868718505c36c11e13478ddc35c7b5691b09300c92ba25368fbe11030a2bb832adc916840d5069d92514c3cf50ca1b6083100c88e92b7cbf84051a7877033a754c4391a4d0316dc0f41308a79af4606db8bfa7aa8b00ee274b2b149cae04722bb7e0c701a088bff2d44399191901c69a394b2988f32b7e0e20fd1d0fa8c3772ea557c39c9e8fb553327e8bda430fa2aa3be8334156dbdddf01ad0ea21eb0b9a107e84070f1be01080394058be145811efe5a5d1502fd37c9082b369c40dccae3244282c08241d092872f204ae3aaf7b21fec48530f7b981f29875cf7d4a0ad91ed091ccd8266c4e45b93acfc37d34e81965d356ed50aa22bc7de55b26f49642248bdb744605deb38162d30fc2a0b24502df0c95d031fb3455f60964987088fc992d80bcc52f55c66421d3603ff9eb1555ee0e9ca4117ebff8adea3c2959c1ced5f0cb049613168fedb8aeead139b57284a1e5a62b56fa88ccdc54ca34fe7675d0bafb6831fac4f96869a717b688fe82f71f4117b846d1fd80eb692cff378cd599ddd4a3445fb898502a00abca687187461f2d34d8fc08ab5449785e395947e2ea5d6a817860afba6cfbf0723d100163adac3282cbbddde96d95cfeff4e85da9b4b6965bccdc1ce203c10f64a5fe6dc33a09439cbc5eafaf7d104c26d36912fbe55a7eb02aa0f260e9dd0f763d44753836033309bff29aab095be0fc70d944f494f170621abf4184f908d78fd945d44df28171fe43d50bbfc9cbfe7a7b45478e3d8c0712c9e6f8e509a5610cda471e6dbc1ebda75aa44ba0821262b16f9fe71f2a616940556b7d116ec7c0bbcb560be6c24add594b559094e0234e9302a6cfe8e38954615a3195ea7cdea8b36929506b793e50df0d3b98a89a6d823d0ea8123815e8f297250d33ac85ce0df2e55f01c338c547450abd85542382cec31a165241a29098ddae78129196488981e1b5e9995df3699f264e3470feab7656598ca52ae1ea71c6cd1c3f60491026bc4dc2bab9bd929fa5bfd00c1c893f6b7b4f04bcdcd808a619776144c89e308fd88681cfb309bd2dd7203da1ddeb6c08abdc051ad34e3adfc86539bee35d5a423ae301396736da34189d96982adbad2b031ece7ce3939af8dc4de689fd2aeb2e8a9ac6a2230034d6bacac920588eaad65a4ec5eb0e39891bec00a59b7cb957a0a49cfd0e2cb21fa43bf2ed23174592a41d33667ef5ddef028e86f899cbcd5b78873cfa6cf27c1a918cde36ff40d0ddf646c9f7d339e1a0ac0040ec096e5a64adad5b347fe40038bfcdf95d9a99d003dd8eb5185e0d9a7b31dd4decc53af4d2856649e62ea74e2f2ef373aee9d7cc15889473d724d809b2bbd45f7ae7a179ff682f29aafee556925d1c3080bb65f3db3388195d04958d674fef3b5528284231c95991735aa5d1b64f9300c8980c749d1cab0dee9f89b621299be67cc407da1e058d21e7df217ac41e2a559de995930b10342bcac95d02c7c2f981011cf505592aa2f9f4bcd1cb3028d1b2a82a79215daef167014ca99949638b3ca5903dc073ea50f486c695a35b43b98b6600a7cea88aa6ead88248013b7a48320c1bb1fbaadf40177dbfa50d2f32ac8f04bb85c2942e50f9a6a0e43d208616f32c26b98bed6a34ed8da24071facf8e199ca173602a6c233a40268bf9c9b4db9ac16d0580789f42cbd13331945f54bfb092aa2279e4f032e92cfabd04805a670ba89eb29349e015f36d34d3c9aff267f90f45db44489d070f39fc787de66dda5e6c32f371451af3c6a68417f6de7a4ff622ab3367dc64acf039266559628ea6a73935560b439d2750418678b18588647ec1c7a3cc4307c32f55ebf73480f7b5c43fb56d8c49871374d85a4f38c0fa2df8234b5056efb854814551030ed6a3a0c581bee38d40832fccd155c40f303b5048c0ca7d3e988fb81d36345d58afe29c46e29194d64174fa891b4bb45f88b4f249bce8df5e3f3b0b70b13abdff33aa42b5203fbcd31b4fd40c2ba096db2770a1216e814f9125e91b7f27c3c1b2fc7f3bc27de05dfcdcae5bd40eff33c98e7b52cf87a78e0e7b140cfc987e3adbe0bbcd5eafbc00ff49c7c9f17e4bbf16cbc17f8799e07f3887c37ae9507be40cff38aa8f703c90bca6a0396b7f26c3cf087676303c3f922e402af08e87d5feb73bd1756308463c5f33eeff33c2fc85d9ef30fc8786abca8e1d44b0f6778e185870c1174a96328b1458c303c8a47030ed5c3041eaa4ac09f7aa04287271e9c454b0f61d43855a229587ab8a00456ea9021273dfc107252751c5124868e91229e1baf89181e0a9accd6ecd084a6c0c7991c1704cd88f880c2100203d121241bf000b40606339a8301f5b1e33cf000e333560c4ec132bec17d5386b72c77ca8c6a7b8bbb23f98b9b1e87a1741eebaea5ac65e626832daa5c362e1b50c7ab89cb66452427ca84a69e974febe66504e6ecf0c09c960cd4ad74562298a6cc0d552d1d9fcb0604d22162a444d50d979c1204d261c2472484b505f45a50185015054b9258e6036f402c3f27a802c10948bc30c163c1440ca698f081415641398f470a6b832faa5a2d0c9ccc54b0e30885551513005005c4a64b4e8f9c1e2250a920f7d2376e5441d936556632842e9b950e4b0a54a105135ea08e16116fc71213ccf0c106c905ccbcde18808e0f873545743901affc17264ee0c1f2b9a172a3410b041089cbc90952f450e504235eb0201c32a3436259e18a2a9cb38643191d253b3c2e43564f5c409a9870e372d2ba79e958152d555911b9a1e246d58d6b4907ea65458812951b1b2b3950251429aa7c80404d6e5a301e3aad1b1ca59e1084a8ba7959b980c642156b15b2bc9696d60deb490b8994239cd3e6c8cb4aebc6054427c9c608d864e3a3c7100d825880e4b5c195270d4cb8798dae253a4b8a969c5c39a02b080bb66a6293031ea1535c36ae1b50887505349ae2b184ac7858160cd9bcc89513a5273f5e3716d8149980d48443f4f2018d80465a465421d10126b136605d6063041cb223c98ac80955a390b7aaad82c0156b849e10046005be4b28e1051a269630028815c89040a5a56a4fce4200e1030fb86c8172c2d2811598d1121f0d322842412c1cb0660d1198c181940c7a820071f110012e8610428b1207302215e4e0b4aea0220149103104103ff4c0830e5b7c8e088d38dc1005b5660e13d03e58430d05c8b028c30bb626e5c98d8b88186028b2c9409a2288803969e2a307cecdcb35440802a000e1cb2c4d1d2c5151da21002a0060270c26552ca1841164ba70296af2a30738012f4ac0454a942636ae56132924c0091f6a10000b231460871d5ec8d224e5c9911c4f8e551cdf1ba01aaac6770668c627062b0c4f031f06be0bd87c9163816f029f043e2abe26564b7c526018cf8887c18b086b880e90cfc75781d743e4c1daf9442f04757c38ac9bcfe6f5fa5c2ed6077a2bcf6bb9ce8e9590951555a00b5520961612eab9da302114a28ac5ca7169a00113c01e92803e728038a2b5421588c5c6829b213fca54d978013f585d80b35b392f2a2fa3d6cdeac98f1bd61655af28aa7a8060824dd14a073672c0a862ada962e504b94055ceeeb1a2cae6878ecff58425c49ae14c053840067002d842d50e9e1d3cab2051e8f5435c73026b8397910bca6ac70aca0b88aa155312a1d64d0b89aa154e2b0808849364e5813920d00d15d6062e2fad20ad9b56989c1e393d6c7ed858e0f2b242c109ad202b264e60655195411810476519100161393b5a22e8ad825648a0538e8fd6e7eae212e26a6255a0c36be1ac5860ce6ab5fa56aed56b657333045cb9b6b8767638dd88ae96cb5bb940225008f45e4056424cb0c1807544950e244c105ba09057d209201827f4c8a8af498119194833012f2090c569838a0106a5230ea214e1bb861a4247c21d2fd7970fb234ade9c20214c0e085211b0630e50630302081072800014b0c21346a50c3b95fd0b90d12a8e1c0171670c001c8941002081f7890a5a90a150c2ef061011553905942891248901119822f063ac0f080185cd59a149cc00d10bef8b040c4c003b0588002100045132f04400559085eba64695a9240175844a00a1bac6c4003127880031460851040b080421912a8c1c0170ab0820a27cc547db9a424eaa829830c3020e0802912f0441131b8f0a52c0410be7459527a02fb117524d0050474c02106335f86d0c11215a527301d3aa097418604bad0028b2912f0441345c8100033603a588af204564494e46747047d4d196478400b0860e1802912d0441132c4100017cc8c210303020742e31c7260b9b243470786c0d0020b1e7419f2c10516765449d8ac59a5e043014b8e2f8ed711a0115f11df109e922fc96ac81b7182561baca805187c433c21ae202b20de0fd08767810d8f9d9d5508eec8d111ea04c9018233e446b471bd5aaeafd562b1569e0771bf09739870779dc73769755f9b73425f62d2de9388bbe7ca31e32d0f73b884394d618ecf0ff5a1f44babafa5dad26de9935daeb9de485a2dc57103878d10870cf719b55dfb371dfda151a0509f2850e8b5b6a7e13c11e214e13ea3354cb5a57b4703338ee397252bad2043eeac273dac23ee8e818738465ce7f1e6dfbbe684f20641100457abefdbc0431b316cb8b876eb2f29ddf852fdb8a43f3e4fe613ebd046091b1bbcbcbf2bd5a1873654e5fdd0868a0d1135690d539a712dd7ade9db6ecd371b50e731df48dce3849eb4a6b639c1dd2f70b719e185e6b5596b7fe61f77f771f7235e194e92502934e79344e2c489919322274d9c307142e4648913254e92381972e2c4c8c8a8c8a88911132322a325464a8c92180d193929322a2a2a6a52c4a488a868499192a2244543454e9a1835296ad2a4099326444d963451d2244993a1264e9818312962d284091326444c963051c224099321264e888c888a889a10312122225a42a4842809d110919325464b8a963459c26409d192254b942c49b26468891325464a8a943451c244099192254a942849a2644889932446498a923449c2240951922549942449926428899321a3a1a2a126434c868886960c29194a323434441ba21a7a7717e2a10b059d47dc798536aef6199360dc5d03f0cb0d90cf8d0f0994043a02a54037403723504a2975f70cdcdd88bb17717790c7354461ae9c1908c29606b27077201eb69698cd28ec066836a3b05d7b93d29bd9cfbed96ca674d7def4995158f9a6ad355da34489c2a3ff46ee8aebe1095b3b2a0a74e408dd95962f45da5b732d2777582bc8dda9872d1da7daee9346a9b67fdbfb64d2e19cf151c83ac37d1cbb70779787ac07b072f01f0a050a4de243ff34eb149dfdc54d335ae9c574f6e393ab59774f18ec62bb735966b47cd3ac240cee3e86e01cac9355bafff8e4b735bbef974b9bfc30b42c0270f72e1e8273b8cd82977bf9b88c6b66c5d1a4a52c45ee2ee4ee50dcdd030fc1289d474de6ea641c0a2a2d0edafa62d2dd7b90b9923966b3471847913966a424c9eb7ae4ee3cdccd7a6eb296bfc9cf51296d6bb349b76dbb8f45933976b39df82a6ddcb47192ed5ad3d61cb5db399cd2cdb2317eda5f65dfdfdaea8bc9bbe4ee629871ce4a9ff1862a7fe7ce9c3192fea9fa584a6bd6a9bb9431951ac6d9e97e95ecee501eae80e83cd2acb933a65577dfe1ee3a3cc7dd71dcfdc693c1ddb778f899e177fb16e0ee14a6cb7b621aad61ba4f4cf196e93c0e8d49c62441faf78e26b4448911f94e68a513274a9a90e42709c26172a49db76d6dbbbcb5b57d16c2b65cc951a84a89a02d4ee871f82644a340a1fe7a1955e0e1477d5b33a7e96cd7d98e879e09dccd1a840f0fbd27dcbd87871e0f1e25bfbed6dd75dc5963bcadf358629c10f953a1e7c191bb5be0a107e4eef74d0a853e8d96e6896f9afe506d7d28d597d7d29fc2b8cfb25cd56977b771ff4a77ffe1a107ea3c6e5cade5ee9e679cf3d35b69f9379ffb33bdd8eebaefe3decce12cddb6e64d6dd7ee5d7119d768fd5aee3ec443a77277d1439fc1dd75d8ace59fc274b72d597395d479247f4aa6ab5988cc5a88c4a6598576b9669a35dd9db502ddfde3c0cc17073840151b1f6890f8410004c63875c08aa89a0488d0c831957c784060e4050fdd6b8cc3061134992a006163d4f35380245ef000b2c2b8cae924231c843983c20faf0a00a98a02c7d15455c57c05c48c0d38384467bcfc4b013473c6a3291085600d2b72de3e622c1ac63525c5a25e071e134355d5b3955a3d521db4284b0a4b6b4bb5a817fb5c3ddb8bd9ec10426506779c1d3478d4eb99c1a3cef3ad78563c5b8a45bd954dec6bf56c2f06ae89b1c01e2a7c7bb1af870a6f35021c213492080defcc19907ed4e3317306ec49420c07522b2ac6d174c159519c55cf151c5f8959992f332798e07df403bd038020084a7dd4061c33f55156cf5e51d62ae6d1970be49162f5881913b3e9916a51d69415eba32fa957cf981808ae562b70058220b85a510ff43ceaac2270dcf3bc559817b5b1a1ceca1ba4ada98fb6280be411f32326f5f578cce31163c58bbdc4ac3cda23664cccd52305d28fb65a3d62563129a71ea3ae7365471538424000234408e9f5c011a265b5e3078f7a3d3e780a30b3a26652203a62d13154ad332dea3a5bfc8845cb90a9aa02573cad9e174f1488b3c307779ccfd3f1c0a945573cad568be2b8ce961665f5ac7870583a4e2e123ebaead2a2df9702092dea1d7d2e176db97a52c869b5563c600a24b0a87704521c9c1565f18c2173c43a5af5a4907304d2291f4bc989453d58d1564f0aded18e35472cb0a70aef49c13bfa7aaaf04a687d200e38ab2216d107429042c1a1be2ad2e1f9705639383cded1475f3d551ff5e88bc78f7272a88deb06a4371ffdcc8034877a3c24d850efb3d1a17e94c343a6aaaa8a27050e8e56f486c7cc19ef684553e0e008a4ae23440b487568d4ea0887474787dee0d033ded10df5e88bc74c0ec5f17848b8a19e8d4749c0a15f4ec8a323848a8bb6a45c3d43ec3edaea1962b7a21cbccce0d033d48c0e4d811edd504fa7a76a453deaf59859d19b9e2a3329d0231dbad2f940878784125614a7a76a4575b4e844ade877c363c373c63bb2a1383c6652e0e00887e27c3c3a2b1d25215a40aa433f58d11cfae23163d385cc914e0f0994841b4a020eebc686278524c470106b51ef88888d508caf89b57aa486d87d74889d102d20fd68d48a7af4e5b4a274f5b5a4c0214a23fca84789ca086d70848000867aaf55d19831257c74454bf02848c72411e5a22d3ac6cc197a14654359b48417bda13e26057ac4ea1953428bdef49ca1472b6ad353c2ab87455d3d25b43ccaea29d3f26e06aa8858c3c31a1b5060460df0f33ed002de1c4f78ab700e1318f17e2001fe00636172629f8ff7792b2f470e325e46af550370d05cc941220e35719cc1c6cf8e385a8863863872880388389088e309c7f158211c73b88ee741ab1d8671a461f580ab1c560e1c5a787050c08343031e1c6378dee781ac9507470e7000010712703c010715703000fc5a28a0f15eafd70f9082a0d11b676220f8860dde8a7e3a5756d4a3204501e7fbc21ef405d27ae0f84794055116a0e7795e16edad413dd08d39dc308197e6042dc4da30b3a24f629ea6046956ab96c33cf6a238613eeaf2c0d8176bf57c445d84ad9694778515868c7f06d820063aac0d11ecf8d183c562adbc1ed08d1871d88f188b4533f0271e63d1230ef3d80cfee36de4f06a0388b00d247eb4f1046d638a232c26aaaaaa8e38720aea286d10c3017df5e908332616c67b85f9562c23282cb0e5020816b96898bd22dac24c122b6a26057ad4ea49e33908e6803daf2f8ad6ebd57ab53c25cf080a96b0c7aac56ab58c5a2ed7b76ad196165e822c3e1c56192008b672a07c3facb0022c232deab2f96c40b0f5d2c971b9e84b47e7f4540163383d2c0f02691530e6eab90163208e0dbde159c16c28ebd371b128c8638487d2d0c5fa7c86582c106c5110a42d90b66e22f0b2f93e9beffba80d0fd0f7b32a8aad98b810ebfbc0d647592da0cf670512f9a409d18055d8785ecf8fefb55af5f8b4284be7f54d59794e73404f07a43d3c90b27ae440f3796872c0f93e96fbc4b4cbf5ad58ac6fc5ea01f2201608aebef0c2c603592005592c10044116c862816a8a7c7c7c5e2478c3f5234c8f21b1154841230e6319b91c06d2211f209f17359263c40b968d0dcb8605d2cf676504054b0fb0e56ab568185713578b7a8cc562fde09902335005c3ca87e903af7c14a42c5087e5e2a161fcf359c57af8be8f8705027d31acbcd56a459b4cf97c5661c80611abd54b07908d19b13044b195b7c3615e0f140f5a515087c3be1ea75032107ab18fbedef83e8ac3e209c3a11378432c4a8d7846565febd3f97ac2901a617d4394d230fcc162b1a6f8a0184531f2fdb0582c168b0d13c4582c8ae5e5c35a7d3e465f8fd1e7c3a25f0fb562c4a250b084445f93152513db1ff5629f7b01c6c7a24ebf8f05ae562003beeff3becffb28a53f28b85a7dabefbb22c4f1becf410aead06a79200be4a2f5b558dff7b1be6fd5fabeaff57d9f1cacef6bb1582c568b25c4cae359ad56463cf40182e2b55a2d6aa4b55ab5807c82a8cfe7e3d35ac901ba3e10044110044190822008822005bfeffb7ad0ac84f0224aa91b3c0c7d4386b0f156dfe7f91a3455aed60742f1a0d52a8afb185d11be62af1e9607b97a7a8c7c3ee12aa4d4c8ea034d80b302f220162bc87d5854c7a31e0f088a7a7c3f2cca3a0ac3f8c45814e88302bebcd52a67f5d1950b9ee785a18a85d92b4fe7079c149c112312f33428382386f3e540f97e563a4a203562a4275c03430812690152d0e7c7eaeb6179d0e7638445874e80650804b1d547575f48519066e5a373586fe01039200c12c359812b6781617c629ed7628134e61ae2412bfa83e54d88b8cf7745e831d0d56a40f8d12ff662391112e147411e9607b128cecb49c00409a220011a17f298072420c27f5ce90b12033d88f5d9bc1810b25e37397ef4830436c45674489832622b8a839383b3001d1c34e1ab47478e8e520ece0e1d0a087758118a6115e18e4845c863678a1e3c1250410f292ca8208ad0870508087ff870203f5e41807c3150489055ec3544089121de054430b8c0631fc580877a3d3c457a3e234532300245e8c5400d32008f68f0f239f2c5c01f9f55ec85e4c7db0089c73ea00dbc20a06f0c3a40e8c5c098d0f8443824648030c9902b49e22d51f2112d71225c31216aa20993a22646454e8c604e9ec0a03c8902454a140ea4f8140e9a884d398a211d252129255151aa42c54a95252b1d2c79573ac07285094b13539626a72c9f16a7272d504f51505ba2b86c61225c75e1e241172f1e7ce0e5cb07207c01034208606421cc647546ab24ad24bfacbdad76b3b9bd85b152619630a570e6c5e19bc36272598cce5b9f7bead44d51e9765422ecbc114418330209634a20814c0955644ca83ac18432279829838299145000400a6700f0a9706605155858a105165c6821002ebc10802560782106186488410032cc20001a66a8810625c2d5006af06c1800016cf86e20000e37ac72c041871c7c071d0ab0c3c743017ae0c1871e7ef0c181f82108203c2182580d210411437811441851847784112b248ef0d89704125e6ca544125fcc975022897015f3623945433e6f091d252442228e083feac57c3e9f1f5f8f9107093124844e15108cb55820cb83be1e222342cf0b42e7eb212a22043d26dcf38cf08ef090f092f09af098f868921a38fe799fe7b570c6f3bcef5b83873572f82e80e31f0e0f26741a6081173b40b0461b62190b66f011f3346a8c50b3001e70887e48a3c61b3e9e6d0905c230ce819847b178e1feada07c3e1e1aa02120cf89ce84de43c641f0cbf11ea0c762008ee779dff7b97b40e0e0b80750f0267f8ad69f9bae5660b028baa3d1f2f77dfd39f7d98792368737adf4feebf6d3a8edda5cae32d1716b6bd299942828331cce358afbdba6da34edd6f42f7e1cd6f47525e9b574eb334c0d07d9e8c6970a1fd1719731ee7141d7d2b7e56a562ed8897e356bd7d2d75697ffb63149f712cdf46934ffd45ffa19d73eff6d97b7d27b526d29eeb78529456569a263f925d574a4589b95026dfd369b44c7dcecf7493ed5cfe88e46f743d1b17cad9fc439476dd73e8dfe6c4bf1d64774aee27c68ddb5a49a8efaf1a63a579980f2dff6dbf0a6fbcc99f547ffded1e8b52399716de3283a262de56a9ea4ddb9e668bd96ee7b6292acd434cf1afd5b147d5c6d223f07f5ba7e26ef128ed2e57f1395128e7a1c46dae6596b9f7471d3be2746aafd13ceffc1c54da6a5629a158965dd1d8b874dd870f7809cb9e97a7b7d52bc29fd1237a13005d3665398a64c99e264cad0142153804cf9e1394c7f32f0a1302a447f32a01428030acb610a9401f5a1140644c17cf912931c8c117290c58f4f95c1a8b62deac98baf0c06d3175b2dfb8c492d2b7feb33ef7bca7027ce5e8b334ffd7947deb7e5c7bd6cbfde16473bb5145969a6596b325b5050d0eb7acbc9ec364f9c4c26cb057d142ca25c41f1a67f96b4527a4f4a0d308002a8a1608a7c09a354b9e3bb7b29ba7b29d9a6fa1b46c1e2ee3f40bb97f259dd70d3d5ca0d06236dfefbb6fc657d2bdaeabf5f85fc1cd49317375d6c757e2e545152e4df90b4bb7ff1d06805771f8f9268ad96a5fc8cb73e738e7eaef4a7bcd527ffbd16484bd5cf694c5e4c526d6f9bfe131393fe9bae56e8f8e3f3b72d82d574dfcff944a2e3c6f8893e3131d1ad7f572cb4525d6f95eef24f298d74eba7d1bfedfcdaca68f9a59dbab6dec86be9d37de4e6bf45651c6eb4a3c6fdb61953fd53f5d26ba9ae375ac3389bb8aaadac56dfa465593fef5e4af6b65b6f24cee69c2cd737495892bbfff01006e44e6174574af1a6bb975aade1c4012ec3597cca82aeadfb9e1817f4a6547e5cc6e1642b94c18510c5c3221e34ce2f02b55dbb332fa6657d93e24df5b634baef5bd2d66aa7a6e5ef9abd69af8bbb971e36190a8baa0c2d094109bdf5b6a9d66fee6ea5fa71b9ea13dba9cf4ebb3e6de7fa379d475a509322dc71145f8a420e6348795cbd34474f283a8fe49231c9b82488fc1293413f65779db2f94b99aea65965baca6ee4ae34d99319d77010ce864cc6b853d89798a46fd2ea8dac9fef49cbcfbfef5398596ffe7dad69da9a7e5bcdc972f56fb2fd5a4b917f2365fbc45f6272bfa6b2b5cf3999695aa97d7fea65b76d7532a9ec01c0ddab42a14c0aee1e0965aaaacca040c68cbb37a68cbb7782bb47668c092578644a70f748f0c6d8b48a0cb183851934eeee1d8800cb147fd99866452a2de692df342bd2b5369bb3ecfb534a2f55b7be5bb6ae26762a5fead6276d62ec84c34d17db8d999ebcd59a666c6b6bfeb6b72eb66b37e662a72e4692ca15f74fb5bc9fbff64fa5696f4836cbf43647fdae1b6a6b8b25ffc6a7187bb76cd356d9e5df1b63c93826ad73364abfddf7c44736abdf5671f6b3537ef32cff4642d9b8fcd36ebf2531d46ee7ac49e5a74c8ca4f55f1c2e6f7d322b6933deda5ad14fdeafd5b2ecf24f6152dba4ddb67fad79b3e096707942e94dd6bc2f46dae553d7cf513557de9aab3c0df74cfa7f6f8bc361a41bf951a625ef89917664cd24c67d92dde6c94415b55febd8be8fdb55a728ad9fb4e55dcad99bcef8b6cf580e57b7a6d5a3ddb6a6dd5ba05aee1e0b74f756eedee7ee9ebbb7668e14b83b0ae658b366cd9a356bd6ac51e3811d41d07490f3317a18a2e6cb1743fec5131e8a5c98809167c1030748d8a20a0f9c8a2b2e807326e70c6f22072a649600c37d882132f8788115ba0e4faab0010d32ee0250535ac00010b0e22c2469428a32f3e0279c004a04d504463e8213aa31608059c0b59a2b72222079c271162c6dc1ba800baffd60860d178dfa4c86a812c86069c13fe04009ba0000f9866f21a10d1548f0a83be5a4e87abcb8c2af2ce14060e072e15598406181230120e1484e85788c0039073750a0044172e44f9caa8457c4c086177571802a3868428d139da06404272035e0496c38a091a901f27184391e20440a667c032a5e90522543e93f1a4041e29e1eae0102e698a3042430c28d5c1eab2f4178c07ba86c81238384294ea704e141024202fc020fc439c2a8220a1fd2c2075cfe00250fc281344e24b1011138102a1ec482a478c07d3c008c27b528a15b30fb3e1d01c2f00a74c24c816abe701e5d5c4089129070f8ce0f3e2230fb32858b2a8469962815e021990330a143180df88e146e74745140e83a70a0330001c305ae630510358cbcc0798e1a45e028536081aa1c243b6f728348154e0e618e38be38c36f1ca0c119392d3e54ddf400f5883aaa729b33150880074b44f8eb0d165a0841115ff82ba705193d607155b94810a2f000244bd0b8a83ee019c00808d0b85c5ef870ca41cd94960e26151376e4d0b49c3cd933709929ac0d14e172058f31ce3a018513725ab8d0b0848c24d1c1ce195560184dc810430b4f54813588a1c38e1826d0805a2e0f4e4a48e26068010d60304064ca8a0238802047192e61ac6c6040991fb43853b5a26db9917a5a4357421828e9e18703f44b811a2c3ab88d876f0237a87066800c0f9f106c48e0cc000c345f095ec430c48c32fcf3a2230401d040c1ec6392c20f09b373f6f5f8f184c36ecd14cf04407851c314aaf23090e3816c2799e24d41b48117b10d26bc1ebc0f5c5314a8f2ce7c30479014270c79627e7cd08d71a5cafbd265ca122c47428f8a042cf000a80683b784840278f174c6cce3712ae10c1a95175ed8442a031c68000f9e636004cc8d4995ab910304264dc8aa7c0c2a940082891639ff620b0c0930a2829167214512d59305d4a9d800174e78651879134d883184a7a5ca87180241075128e0e43a3479000910350b9fe1234de004151f67e18887324cdcc08497711d893064051e7c042b535ea43ce1e33a056084b89d271c572400739041430e5e63c283924106239fedc0438d15de08fd83333c2a2a6aa2f02d67beac41abf0c29d44708df0050b16f02b5130a9c1880788bc8a94595e8304261ce9450501243471c63910cdc05de08a0e7fd2a584264c200081177d41c68925e220c389ced470e4869b1c3c096e07270b8ce1858f2600f1443411c2375880181d3cd57082ff6c808010c4f18305ae01154e5c51039a13dc4836c1cc65c108efe9c00d0fa080c790d3a4d66e882e0bbfe00b03dc2813a5880f81010423527c013d481844620fe8d1c0812c4981104769ba0f2d1ae04511111db78096002f661b08f10a76c4c143842058701e13e08085a33796f84e1020284981dd719105256bbc1a21f0d0040490b141d7c37700600425eca0a1e33a7230233785180db88e021c608610379e3c670d288268c30584e76c500230644fe538ba015356d834f11b2ca6b2448004a5df14b111b1c11983dba83087084a700002fe82c30711e05c89c25f622680a68808d6b88b0d170604504214eeda6df1441ab013b8eb75844d50ad89b776805541f24410de82f58862c464c7591bc8c0136b5838c1596592fc80033480b384b0c0608ae6c241319676590c2b1c1c404e052b601839a8a50d204168910107431a84a4b921f45505766e5d2c5184af08a0040514e078e02b9a15b80700b1c65742277c51f2a307ffd630d930841948f8370136b42461060eff8650b23519f1c23f3217541942c60dfe79e172850f4e49f8c7448b36c41cac7f3dbce814c1f1807b2610634a097e28710f034a413ca00136f7a6085341014258e25e0f443d7007d8c1bd332b40a14651927b62b8ac50822139ee7d31c104213ca8dca3e20606d248d9b9b7e407d7132ad8dce3d14ca0f161cabdb08b0a42ca18c33d9782c50c104bdc49f00309317a38701f230d921305d871ff029b2957f0e29ec5049608634607ee54b08145911cda706fe20164f0e8c47d0825286e7c2b771d685ef8a2729fa1c72b19e1e1ce02540c60b2acdccbf85072021408e13e4297d3070514e1be73e4b0dd10c51d37f40517ae22dc6b54907152821ddc674558808b5c18f70f4a108ad0e4343194c6b9a66fe6ee4e1e1e4912439f949f4f9bad5d4c525ae94fd51bd594d58618fe73f34aa0e1f6e4062ddc2b4107a327554adcbc12361005ec880b508fcc4f1a2713f821c22303001b8ce038c0cd2333471646432870c6ab72c1a9484a4f149e09517e349931208d77828f344cc8a489c22bc34345c4030ad47866ac0d4bd07031f25090438d1230aca01e00cea049d6fcf0f25688319184522b9e0b47c218e240c9140f06285e42217441e3d1b0c3692c41270bef865a55900eb8303c1ed8b00244c5088c3c22e60863030ee8f0c273228d131239a060f0ac20c11b4882e03cf022a0059a1f27ba2a0f8c149ce1e3010f67786e6c21e288ce89303eb10a2b1ad470459a6fc9076832388006a2f840a02167c4026fdcbe17901051c4043aac7c1170322bc2834e5901f142448f122546ab290578c1a305ca6c8506541a9aa372063cc930c2e0052726583d51682e50e28334ac36c4f048a09aa2777fe562abf543d9f2ac17e3ecd32aedd66cb35d2b75f34fe12af96bfad61c7571d3eec6a4aed5f76fe4b6529fdb45eda87076fa421f23ee9ee3ee373e3d7c42164280c14f664139c2dd3d0f244001267e80f1450ceefe79c93d1df1458f352570f78f081f8a70e231451645eeee0dc101047a7a9082e2e6ee1e07327cc902830a3a50e1ee1e0356642ad0810544b8b9fb0780223d0af0810cb4d8c2dd3d032841731d2a84f0e1eeab3646108213483880002370f70f8b120765b070848513b8fbaa8217bc50630036504101776fdd40c31b9e05602998e2ee1e196dc430668e017ca0c8dd411c662e02dcb6080386fb97f8067d89afbbbb77640677271281f727376871b331ce3a8f34a12ff115ba96e6ee42a8c119552fafaaca84aa9b2af7aa2affaa7c55e52a54390b2cb8dfb88dbb9f715fa1ca6daaaa4ca8aa62a1cabdaa6a85aa133c03203cf0bcd048933baedda52f6bb6e5b66c5db1d86def9208d6acd75251da99b95c4cd79b53d4932ca71f57ef266b0e87916030f24b4c4e2959724a91e5cf51559c14894d5a36ebc65b4655715415475a7d6dde542f7b5d6952942c39a1e477a2aa387ca3703d61f23b69184c8ac4e69194f273399bb786e174d541c9e2218f936ff273c624ddf86a4a6b96526de9dfa2e893992c63d9acfc9bb6d7d668fed2b4e791cea3de16674ddc6fbd73f79e7c6bec846b776997f1aee5ad4c66cd9fcb62565cc64de5ae3ae9f7829b16e0ee57dc1decc06d75531b8662d179dcd7e2dc9271282809f9608ce813a3f38b14287a579dfe6b32bdab39adab89742377cd699ba47535c92efb66b3afabc2dd3ff010031a4c7bd2928c49462541b8766dd09b95d4d766b5beedeaa4f36856b382e0e105398ce37864bf09b4eb671bddb8898e9a9ab59a27695692deb6d551dbb5e53de9e74abf0bccfca9376555df9a374ce7f1a6ebeda6eb8dc81bee3be39ba618ef9bae370a7b9d7fea33752f7f2abffea7ff4c85d4160783e9fb5278c3605a9fbb6ea8276f35ebd1c556e7e702e5ee4b56623c5eb9b4df34ab130e43fdc54d51ee4ea99090d0ef9ab7a69d5a88bc3b1d94cb5517b4ffbea5e1b008414c868476dbe69a2bffa6ebed9e30d8ce38973bb5ec7135d7de5633de1a067b9cddf7cce1101e9cee4a7fd7ada9bb2be94479380448e7b1bcbfa9fe89bb87e0a1102afcb7fe2bcbbfad0c87734d467e4e0b913f25b4847c1a49d6222325342743b4a2225a7d2323263f4454abfdd00f91b526444e6aff4542e4d6671612c283bbc7dc5d5f6c37f9a692c6b926779fc241fed24ee1ec54774d72f72858e8f772f7206b0441836ac8c756a39a624a58b264397a52aaa214d5b4b47454a569e9290a8a4629452165c182654bd393d21295a5a826a5a4251a85a4d4c151162c31a5a724a5a8d89312d3962625232a515b94909a94b66851828a5282226d7edcd9e4c424b6f4381b8514b5e57136aa7c11ac59f3dfaff226cd6acbc5766dde504e4c47417ab8fb17da9465292a86b484c5c92906e40cf72f146989ca12929213545094074a514d59908044e08af23779e69fb2dbe26cce012102481021901cdcfdc78782f94295a2625c969e9c1e67a37ed7242af74dd97d53f6bfdfcce1307997cc4ada8b6f252f6e622a6d16772f2a2d2e6d16dbb5f9cb9c653f5496fc5359f297f59fbec44cb61af534dcd964ab51eedee4dd9dc9ef1dedeaf095ba5b6c35ca76edb515f7d9dd85ca2f31f965ddd5dd898c6a7b8bbb8fb6baff342b17775f72b1dd56e39cbb2b49e2eee5b5523f427717bab8c9ddc7a0c761285f4d0940081b511039c8c5b54309a50deec2401537ac983272af0cbe19c0121470971b3c2c8d300a59e36b44e0ac1a58285aa2c600f7a810d70ea008ff704f96e860e7e3ac1a560d58a20113677d6044d20898a8fb8f0b090b1b487197e2428b2d6a80e15e03c8c0e044cb8cbb801c81450f736471d0660133c81630e5ae14b280018438d6784b0b4e8d92c51a7757fd36151ef817022b63970a38714781115560a6a4c1a24dba18038a35ee728205c90394299c65860f330fcd8f7b44f83ca9e056e12b262d7878a1fac1bf29381d1c805be32dddc203a6ec74be9240129a55d593af9c9ca6907440046fe13083064e90c08b7f5128b102ce41c45d28d0204415961ddcb546083954913373ff2288395ef8a183b7841ce940070f4c38d0b559b3be0856ef13ef2a160ec29dedaea66ae62e9ccb4107a378eee2c12b59a2e7f21d1ecb024f87f7520216f96a06f002d7f77ab1c095e7b98f6ff4cf3d2d20079ebb9eb07c47cb73cff3582ca20fe773cff3569f15cf73799fe7ad5a227cdee7b93e0b9e3cafe5b9fcf374c6d5d76af9dc500ffc3e10060ff4bcefc66be3f36c9ce581dfea3d2fcce779df6bcb27e4f3be16f87921f83caff5795a3c1f9eb7fa5e0d60ad5c3a3c0b3caf82d7cad3c1fbbcd6e779df4ae67de08d0dd197e34979792c23ab289eebfbc024ab9beff37e7634f1460093e05059397d0efa178407ae7c40d6e7ad9c45833786e79f8761e89e7ba0f7796a78af0f89e77dacef5b79de124fc87b7939dff77d2d24efc8f7819f37b41a7180bc34f07476827c03f0581f100ff4569e7f4e1fbdf140ff6ccbe9cc7361e53c0df07c0a16dfca6b79a0cbd3f156367cdf0bb6f28c56def781f4cbb1f1f1589ee71a02936030e47d37add7e7f23c98f77d1b58b53c9b0f5c4d793ddfe979ab20cf06e7f35e2eef9bf25df05df01159f9cabd1d5eebfb3c1d305c811f90effbbc9607d63c1b231e0eebf3589e8e2221df920bc7e6f368af1cd7e769f15e9eb7fa3cd0b3e211f99c7c433e9ccff5b1bc95f7791fcee702bd156be50543421f3a3a3d425146868bb212b8285be3e26c878bb31f2ece885c9c39b9389bb938d3b9380b808bb302b83863c2c5191a1767127071c60117676a5c9ca5c0c56a818bb5888b55898b758a8bf58a8bb58b8b9574b16a176b0a2ed6195cac44b8589970b1a2213244489070274890ef0499e23b41b804a9b9fbcb46c78d8e17d0452f392e7af9e1a297222e7a0172d10bcc452f4a2e7a6972d18b072e7aa9b9e885ca452f29b8e8e50517bd10c0452f45b8e8050acfd90152e53b4074be03a405df013283ef00e9c1778024e1ee3a383b3b7038e3210e34788803101ee280000f7170000e5e7888431a0f7108818739b88739ec789843110f7320f230072477b7e0a54347c7cd6b473cc377c414f8ce8e10dfd929e23b3b3fbeb353e43b3b567c67678befecd07c67e7face4e09beb3d382efece0e03b3b41f8cece12beb32385efec2cc077762010eee84143141ed2e0000f69c88087348ce1210d6b7848031c1ed6c0f2b0061e1ed650c4c31a843cace1098e0d8f9d1c23dfc9a9e23b394fbe93637d2727fb4e8e19dfc91980efe420b1c3fdc78d0e1e54f4e10a226a4972510b948b5a4c17b59871518b005cd4a2838b5a9a70518b025cd4420117b594e1a296375c7ceae1e213918b4f4a2e3e7171f1e9baf884828b4f33b8f834848b4f50b8f874858b4f5db8f8f4858b4f1e70f129042e42b180fca88085325c64210e175bd871b105212eb630e4ee366278d3bac9e942878b5dfc70b18b222e7641e46217555ceca28b8b5d8071b10b9b8b5d8871b18b115cece28c8b5d04c0c52e04e062173ab8d8c5102e76f1848b5d38c0dd71c257053b3b3a628e4e8886150fd180f2100dd24334b68768a0e0211a347888c60e1ea2818487683ce1211a5a788806181ea231020fd158e3611a403c4c63030fd328f2308d240fd370f2308d99876988f1300d321ea6c1828769d8e0611a41789846123737e08e1cf10411b87842095c3c01052e9671b95886878b658ab85826c8c532442e963172b10c928b659e5c2c535d2c835d2ca373b14c1917cbb4e0621902b858c687968f17a8f0f0050778f8c2161ebe90c6c317d670771d3d6e76585e7c8765f31d96f61d16007c872583efb076f01d16112f177a78e802110f5df0f1d085200f5d60e212b7b8e2e216d5c52d762e6e11838b5bd8e0e21641b8b845133a3737ad1c7104352e8e00878b633e17c7ec70718c0f17c7f0b83806c8c5314d5c1c93e4e2982617c740b938c68b8b63662e8e315d1c73bae3d8bc76a060e03b5090f80e1426be0325e63b503af01d285b7c070a18df81f2ee9ec3c383c4a07818b3e261ac8b87b1301ec600e061ac079b1cb101402e3680898b0d90e26203aab8d8002d2e36008cbbbf5eee363a44295070510a175c9462002e4a510017a510c245299670518a2a5c94620b77efe13f2a403dac00918715e8c0c30ad05e2b8400063a81266a8490a8d2dc3059c08f9a963339f8f0717777cd016483bbfb8e009039e3ee3e840511d2ac59f317ffd7644a5e15544c910029bc6789300ad77934cd271100841705029e78e2092928b2701b28c078d0dbbc83b874a1a3edce92b22c3d2939c994aac49eb24441c9a2b06c8951514a82c1727a0645df56a5ee792369f974dcd12815a48d9bcad7fdfda7ba6bd2efba93cadfb8a98673c58271d4a6fa7d3152598f5c8c15039c711f67abf9960bd25e020c50827b5036cd7a84136fb048276208aa4eff547070e215549af646864d04e167d0d6b5f6fba4d9bc77accab479e8ee3226d494f8dec0040c486552f91b731162d49a56690d676ca7eaed69f4379eda3a67fe6dfcd9d17cca5c6b146baae968bb16db2ea6e34dd75b8c8eb7df980bc6517a772b1314b08912403ce58b60931841120a4802091f7f7ce88f0fd57d936f20092cf507210f930091c000121170172a4205891328d535a764c9d2eb5a0ddb5e23f1b27da6478441614fd69c3ec201eef4c17ca1528228982ff4733bbce9085ccd1141c4d027f74d992c4a141a8587de376532234e30a274f73781a8b6541bf1b9eb46fd9a6a7be2923eade633661bffbea675679a95ea53dfbfaff18da4f9c45ee8a8f5b96baeb95c4582a4eafe888e9a8a036d8b10f1fa4244263384156f8c33caef04429c719caeba7de456a41b1d6d9646f1aeb67c1cce527de44d5a8dca475493d8bc5f969696718d6a4bafc566ad7c3deafcfb7135d71cdddd8ad35b6c43667dadaf7d7dca64667d0dd31ac774e44869beadd1bf6d5cc6356d561a366db47c6d29dd991796c3597a71d67d6eb7ebc5b7f699ea2bdd6133f7a5ae369dc7cf35f7390783e9f0b087325f62a4f16963a67f23a9e829e69f70ed2ee174d5c1606f9e2566c2e9dac5490b1e8c0c50001378a9c10ca7ae9fb7b7410188dc33093b5c2067964a36ab754f5599469df1262b95aa6449794f9a3f77a464c9eea5663f3f148802f9f8d4f006944867d6b2acf4568ac9f29bb45963b849f754308eca5fe62cb52cfbcca2df66bceb52fef23e958d9b1e67a374180bc6510b88000e2f57c2d96a22c51e57c93f0af34fbba5376d0d0349e58abb91f78fe898df29a9ee9a34669cb33b7fee5a264a55cdaa318e665cabb4fc769c5d3ba3aa4c33fd3a6ce6cfe54e6a566cbf466d75df27f3e7e8ae4ed726e56878d35dae96b4b5bf4fc3367f8eeeaa3992d534fff6b7a829c6f2cbdfd18d6f4977369374fcb2e234dd35d1ec74972ed6f59fee16a47f7a2a4e4e9fcf5d719f9d76d54ae9706c9a066848a26599818c7a8ae12242d10c4453ae8305dcbd04016cffa41040e841210313ee3a94e18cbb8fe6b87ba90de8ac5cfa2b33fab7dd4b5d1dae7a26bb78762373fd6bf5a92dad371d2d77eea57e4aef5e4a1fd15d5e53dbadb79bdda4c5e18bc937f3974bbfab25b1d631dcb4fb2b7af75770d391f085ecb69b6f32a7e285efbe08f83315aa2fef520070eeeec2085c9861bc27ce9d52189bf46f51b18d9bf25f5d968d9b5e6fb94b1b37edfbb7e2f23bf5f0705a00c2dd6b184f27ca9701c0177a9f4f28d3ac485a7f2ecb98cbe1b3f37d2e2fa80a095fc28211cf8a15b058817a73783f4c48e107ef042e0498c0a4822f881745dc9dc943326276e009cfa8f11d15ceb91d6766d079a491e0eebbbf62cbb12b4e001881cee3eea58478f67ddcc50e819cced92d02a0072e4fed1545e1a6b5091d200510dc69d50be241e122582d82d594fe94dd41543b482827a3da55a6fbfb39056688c0e9aa23c778688647ccc657f7170663b2b979f2b4f1cdb3c43819add63ee746f2a97eeabe8c6a07bd2dd71b12aedd258d9d6edb76c93867a5ac24954529eae97fe3a9d2c432b36a5bca64af710ee7dc3d339695b9eaea2edb1cd5cb76b2d28410689bd54964b25c95e92a339fbc95a495517e69a768eefec3dde570f72cee1dc0ddbdf2e9cebc5d4ba38672756b9cddbb97ca670e67ab49fee75afeda8bf09f6bdae284486d7125249570848434db0b220c770aa871b754ee4454b80709c15d47c8033d9c2f4410a3830d170fc7784182061437e93c925fe26bf3f642afc7aec434fd4487cda751d9b57a6b6c45ffb53b87fb6b83e89fd7ee8b49fa64b773b820bacbfb3ecd616cd28bddc930c3dd87689428b403236cd179cc7fef99938c433058fefd391725ca58335fbb7b30fc7801f40260d2ea3e71ee9e0b345a4b0884225819afcd591d9a703747a5b82a76402cb14b9231fdfc53621c257d28addc36eb38e04e3ca4327f9f544b5419bc08f65a9c2e8cddb6a6d54de1ee473cd4cd4033aee9a0cf3937743aa478380543fe6b71e114964c472ae114f8fbcce130199e599c30c0f699dbe76ddbf0c41285d2b1fc6c4f3164a5b5b367cf41cb3769f53ea53b8c4dc5487321ec5b19f43947a376583fb35208676148c9994217a1612029108549a114262b479ba5e9253da4fc325752db9202510e804c327320cc298cb66b6fba9a9a0295f7c435aaf3088389a180bb0f7928c6875dcde69fa278973785c9caf277ae1bca842abf0c736ae8d717e7f4677a6d7e27aaca14f526ad72b15daaca346afa5275eff6b5414f5e0ca4f7f91b4f51dbddbba0fc4e6599abee88eaa7af51f356fb7c5e5b6d957ea678c360b32ff4fe943e546f186cf685d69668d55495a96add5fa02cbabf663dc53ccd585baaef53d9d6274e464fbc3be98977b4b644476db505ba4b74d457874baa3759f359526d6fa5c553555345e5bf96e969d44772b8dffb75ae9a4f3513ba757db33e0e88c99b395ca5aa7f8b2a4d7cd39f6f514723544ffebd9fd64375bdb6f6e514ce395c7d5d6f495f947136a3d54ed1fd1a898e6fd2acae5f2be9d36cddfbc891fc37f235dd996625ed2d57b30defdc2e93b4ee23f7c926bf56ab3463bac9cfe19b5f9f41789f95de5cc5ed5e0af61b5f4a85755174bcf8a4b66bdfb4371d9de959141df5dd42c75d29ce34cb5bc35f31b9ab398a3f1f79dd6f7b8ad15074ac7457d376ada6f5efec5a3a9b7d9efd0001f9cc806274fcfcb7b2fed677898e3a6c6a9bab4c3aff14a6dbeeaae9cecce1acde96026d5d73f4c97e4dcbaf541fd9f5b681663f3ef7cd71465f9ffb48173a0e01dd2c74dcf5c949abb634f7a4b65d8bc39b3e8de24df5e53df1d3ec0bd5968299cdbee89d79b3bc2dd75d7eb6fa934cb392b4bc95a4e3c5b9f3fc530c05ca1848cf28ae7ede3a77d25be9aeff64263f3f8eb45be36babb6a4362013e34d6b65d097e6597b7de65fa23b3357a52eb68bb354fd2e9f9d4cf3a4f2e79f5a9276d569e37b2b92d67fb7ed72234f268ca3a06a56b25d9cbb986645d2911bdf74ae5e28dbb55a5b268ba39de5ebb069c6366e32cd4a6586048ed27d9502c0c26cc954107931ed6ec9556762ec443ba1f643e5306eca65d16fe2271363a7fcf72e99183b955fe6aafba7ff4ca5bcf82848489b18e7645756c4dd7375e3ab7154b9a4dfc64c249d5faa6e285db352b984a3cad7b5cf4eba66a55a96adef92be18a966a5bb74d3d584cab896e5499b9d70bf9732a6a243305f5c6b96f54b0a547ea61bd3fc5219ebb014894da120770ff2108c096688decf61301f086c80c001770aabbb96753f8e0251204f05af052077cf04ad71eeca721aea6302fb86dcdd8b8720d8b8eb208d735748ef70b833a944dafd95fdfa9f742e577550faa9fcb2fc1975cd5220f2b9d0f281cafad98c6ddca4f56fcc0587f7ad3727d94fe92a1ba01ce10708f88008779fe2432fb696eed8aec4347acf1a0dbab8c9abc20f2c70f29e3526e3505090c5e9aafbf1d9ed1cee65da8e5264dde3a62af5e36a9396959fe57118aac4b88a69c6ca9fb24ffe53e885ee6836363637e5d32ff46f5136363637509cb68c5a9b39a08c6bdb6aac6b19db9c8b518fc9582bd578974b5c6652a432d6ed6f2abfbc273e82f2a7989acb923f97abb9cb8ce27ddb676c46cb5bebeb2850c654e858e9eb59fe5d8bcd3e9f24599fa65fe3dba6ba52a0197eda54df34fb5d7176eba75a7fb6e19cab74bf8de24d4d5b6bb4a4ed72d5fac98d2fcdbfab49ffb6819e3c4b9c73b6ea28ad5fdad22c4b8bdb9937db896ba7d5f47537b2daaebdd7da3e46475aded7146f2a85a93eb22dbd91f6a6a3f9776df757ac94bf2b69cddc9984e361d400a27451d89dc27c288551dbb54f140c857d110a1acb2fff2f7d1add55dcd66798b2d2181defeea5e8678cd3b66b6fae5dbec44d4bb67a0475a604a81c42dda066545bdd5f0a446d9546f1be96525a3e982f3487180aa0868271f75a70f758f054f0ce3ccde1ee545b2cda568fe8135ba595b6746f044f51dc7d2c5f0c1d6d954677556756baf589bb3f656d5b5baaff12d37490b6559ab6260cb6b53565da5669b2500b07dcb4b5b4f8a6a395da2e696dd8a4ee4ee5a11610f49f5adb1bf99beefababe99a34fee3fedf33965f5fdda97b4326182d5d21264ccb852a730ac1494131a77ff1a7d6262ca389c530e7ed3678e3e313189c185061e308ef93535eb7971497514e3306ed76ca92dd04c8ad109857c2e359cb1a69feb0e67b159ebef9a1f775e253a6e6c6afa38bb6979ad548c8e7a679cfbbc7b29aacb8cc9cf949626bee593ee72c5d99cb35d6bd66a1836654f310f7b5aa555006480bb931e4a796ac279c8e484dbd8d8dc8c363636373f423a484893b80cbab6e284b01d474de2524808a6737bdf7cc0e82f1487b73e916c6c6c6e64b251976f9a1569772b13c6519576ea5dce2c31ce44da412643132770318be2b5a23796c0506584a2260f9dc8b0883263de00983061019fa6ffbc946f9af68aee9bcadfb5cc6df9122369fd2479425dc9c07dec000519e7acb4e4610740b8fbb8a3d1a7d15b499a3f47f7ad36d729fa1723996645723262020535da4ab754c551bc69fe32637aed896995eaf095da965eaceb3fd191fc9cae26f925ddedfc399c73b467575cc6548c9868dd435633f7595b6ac4040a8a96bfebb559fde5a88fecaf426949e34be1a96be9ad24d575d712df74b5b275b6b5adbf34b10fcdfd4be128131d7127ce5255dca8b5ae340ad31ad02b7ca4175bfab7d9e7dbc6b5bb14dbf8d29aa53fa50f7d6d562a749c295972cea8b67436a3bbde36c59a96678ea263f9f773b97aa3e7d6b586e96c369b7dc61b8a8e5b63933e0d47f579db369bcd9b3e8d9aa6d5515bb31b5f8aa9feee8bc99abd7fdb74f6faa4afa3354b5f9f957c1a9dfd507d79978060b0289f19fddc6ed37adbfaf36f6bdec8fdb51ac6694b6dd74a9135efb77953fdb6fb536f5a930cda379b35a9d661d3ac54db5b141df17d129bf46d95b45bdb6b71f9f797a6190b578765b8fa5bb65fcb642fc3e5a9c5ec828725b744312110438628a614f3843940613f35a5bf335e1f10718ebb2ba1484a13e72a798af95246fe9490f65ef8bce4bc38e2fe49e02ab96f8b532a31d2d23be17e5b3a56303318ac66fe43d1516b4bf749a3d79eb65cb1e05dee44a8e498b3b129af54cd6fbb18cbb63636f8a62b6f2d1f77dad0efa269362a574ab1aeafabcddbb4b5963bf5b6f6da6de96c47abd1ad31d216b6eadd54fddb94121dcb92ea4a6b56a73f8916d1389395de1387c364d54d615aa51b5f3a96bb343fef4c2b423569f9fbcdba2b2d2fd171091de9a8848e48744c4261356c4d13933f4f5e7c295069653e375d6f96becd9b522448487bf1c617e39020a1556fa01d8dfe6d9bf55a9bb555b35631cd8a83aad5cea37de66e3bf749a65962a42f31924e2aa3f69bf6d625632afbccdd25a827d2e67094d2b5f586849b4cf3a4929431d25d2aa38ca84431d94eda27956fef273d796bdef7cf7aa352da1667b1ecfc53ff7497c6a0cf3224d76314121a4537a0982ee1ad31be91b4ac345a4fa09d69c713ef6805dae7111d3d8831c1604d929cf5f3b64d929c545b1caed666651d957c316eaba9d051ef74c6f93fd0549569e3a6376975e7f26fe4894dd36ea81d15cee52795d7e20e76a619d37d13aedc0ff5e6f9a4fba62e11e8c2c4c58d25d3ac485495699c5155a6d99b38e7cf69aaca649ab111cbd3165aa919baba6bb6d18bafc6fd97678ddedf516aa3f8a6fbdc6ee39deddff47d1cddddfae689f74f05fdc5d4acb67e50fedcb9f357f26be69969d2121285a2e2b4b4dfcbc64d3bd37cb25d5b2ad55d7395ab63e56f6db16cdca471bf97ccbcc5767f5b4dfb2ee58dedaa99d336a9c4b84a979bae56dea455bc9fcbc64db17a64bbf6fe94adb27153d393ce4f83884e1470c2c2c90ad1e9004e41884e40388d426140b4e695e194e41fbeaec99f326d4def6b6b5632eb59da29bba54cfa7878728011b35bf29e98fee2268c9f9c3c3756529e54053c046207aba52786942859a2ab4fe512d59757ebc72200bcdf5e5bde4ad3b67cf3dcf771b7caaec56176a65965bfebd49bffa4ddf8caf67d9ceca7acedb3dd52a4952acb2ad32736cfdc99497dcfb26233777e8949d3aca4aee5ef1b79e2299cade50b097959f0c690103b7811820086b20c93c8c8156478f192c6dd573a579c33775f5d40e5f396086854a102549859d02447142d2531a85a491c54dd88415e8460c498c921012bb45c85850e0cee5e1099fb1702980f0423d18a189d472128f2a764e5c3609f3129cb69a95c10ee06d5f29458850cf7efcb0b5e9a0fbc78f075f9b8b8fbce7a678854ae70779dc71c2e7285ea8b4d133b5524291263d9d6cc4195b996b76ea8df780a069371d992a4757512937444241744a4a224aaca34eeee9333faaff3efccfc5398de4a81b0366374acd5b08931d2182445d61cb575a5328e3b73df273fd37aa3d5762d05caddaac36128bc2feec4587e632ea369ebbe4f75b6625e5ff3ac690d54c33be3dbd36af8b18c6535ebcfaee17d1fb7c97a95c68a4dbcabfaa7ccd7b8bfed29bccdbdad492b7ddad20446f3d4a6b9edcfb63e7a8ae21cce4e4e331a4433a64f6633255dbb945b572c331a4461fb7158b775f97febb67fd3edcc52b7b3d570c6a4d604a81a233f7931b9b48fdc99121d69f7a4f71655ab54a540f43fd7be56f5eea528d0d7ea54141def163afef8e830962326282bb8a97cbc9f0beefc8b9b366ec24ddf943f97db62bb387779d24ea5d04b551a853d65797a52a2484b55b260d1e57d9ba938e1b5c0840c77a7957a669830e1f92032a1721f77884ca08ca5a5e9884473e0fcb9dc8fb8484445d21a221094b84844dd475bcee0640cdee2c5c50d606711387c8002359ec64712fb16a21206f82c6a466b67eee24e5d6ad3d6fd49356f2a25b39a6f052a3feed41723e576aff5934acf830ae28fa954774dc2b51b8583192949a2c3d72693ddf6cbf096555d92ffb6aaf5e364b693f6a59192244a5eaa9a34a94a922fd584891299927ad3b29baeb7276f95edd732bc652ffb8bb7a6e1f0d6e1f2b36cd7de94e96afbafc9f096ed9bcdbeae6299b632d9d5e19bae3799b6d9acaff799bbf677ddd56ed3ac3625667d9dc4acab28442053e7f149f9629ee81367b2e2e80cccd47dd99722b39b9cfe9d619f7341bb52b6db7667cc24139150e12fdb6d9b71988a93c9b6ae35b3de8cf74fe1cedfd5f6e697f7d45b5b538aac264de6791f8ffbb883e0e29137968c4a928c4341578733eda6ebcd027b3582149aaba44cf7d71b722f26664085bb5746ce4a337a8f84a399eb538ca340206ac085fb78b1d5a7495ebb6ded4247ba2bdd57d4c0080d78a074a741d5b559adc1cc5dd4c0c8dd450d76dc8dc62441e44f9966c569318359064614c8dd5b2e66e043cc20c7c81cee0e44a94a0ba39534e3702e178d84e114a6716f7ef95f9ad8caae8fcb8fcb1fa5fb262e195f9bee9e99aa32514d475cfea8f14b4caf05c2f94530cd9a7ba99adba273a76cc4fbc7a7bcf8c876edc65c46fd1b4f9176df6ab3365a77b4ba77ddd5f2e223a47147ea237f73a73e127480714675a54a546250b9f33449aaa740e5c5e443d1b1e24ead2bdd99db92f76f2533a6650efa916dfd3459c5b92d74fcd9da874add9a736790a634466177898ee5ffc65c70d3ee5626fd1b73d1612cd509476dc9475b9f4cb92d4f4875d7a4df98cbb54fe2902cc4214cb88f60be50994c1c8254fe99b740fd99a5b4d5a9441282852b45e97ded587e06434eee9b95866daef7494da1e89804a6ab619db18e3ead029d5a5bd95012ba35c6d1bd8792e0bda3d53069f7e36edbe659fe9959f5adb3fb393ca3b7da5d7310de417a2c2d3d62620c4ad9f2a76cfeb2b4d45a4b8fc44cb3e69f52a29d9afe8d02d5dc89b38ddec8aa44c7dc897395af3d0e9354dbfa64cdbafc396cea2fcf7b8e26c63d8fab3629dd436bf8cc659c4d8c73380cde26363176c251da76b1f9473bd33ca9ec6e0c1f4969fbb471d3c64db66b77386ffd49394bdeb8e97e2ecbc64d5a5355a6b7dd7a2bd24f552b1b37e9c7494a493b53eb37f33b55bb7375422abf2c632355652233fe146e5756243a8e74e3a6b734729ce9f09dcd92d00da89e0599f54baa93222b8db630eaba504d9d5edf6cd60ac651e597a749be49de2d4f92a73e731aa8fcfc3977d7f1c8f880eb74eeaee4ee11f1395ac3f4f5e7b28cd9ae2d317995caa5fcef4413738c728af889ffe29c9576db9af5d4a2c3587ed7a412e32a5787ef953769758b8e5155266d2bcf0ea82ad3c576d7a76d71164b69bea50283ed70ed2e5dc0bde8b1637f3ee428815781cf480aa23802538457c3cd8a1e2b7820031e2b42308128f643957fe57629bffc9c549a59ca2f6d75aa59497c69e1ee321955c56da1aa4cf9a576b72ad1f1a7ea0dcc175a67b66b67d91ac95ffba4fb53dbde13d37d62a09d59b37488e20db4a3d15d6ff868fc9a95f23be951876f9ace76eeccb42ab35d4b9ee5e719fd4a9f6649a819f95cca9ffd6c9631ae6adbadfdbe35d7d336bbeddc97b2202a85cec61f97aaf9e54ccbca1ff3dbcac70235a34033aa2fcdba7194ded7c2664034887e99594c858e3b7aed98f1e7988c3f3324549569e6437f664832a632f3a1fabeeeefd03834164d69bbefefcc7a2bb5edda7246e2fbd987eadca969add5309899ee2f0c96df566f6522ef4ed36b75a59d9896b6e66ee489d3959ae6ebea4d3fd151df9ad374ac396ffd379bbdd5fc407a06863e91d9ae7dd9971985697d32d18262f59e3f3e54e34e325bb2ccb8ee68b4ea6ebaceccf2d65b26f363a6a1a1da121d1f97bb7de4d6ac54f3436121fba3675787674d3e74d4d966697496df29e3a81998d9ec4b352dce6a3ae6af2d95745baa976efabef92595324f1ad561d3dcd12ad53847a544c719989a95806810ad59e9cb8ce6ff817dcd4f6756a29c9492645e9eb244412d59998d60661a067bb2d6f2ef2ff9e9583e59f3e7ba2d05ca785b0da5c337a09a9f966fd6fc3b303318cc342bd2eccbce2c7f77ebcedcba62a1637e5cc6545b186c46afc59f31131d731547b59dfdf88c3f3e7af75230d8cc9a399ceeb30dfa4c77401bdf5aed4b4ccb16e86737dbbd946c36f536efcfda666b3fd75c5a3033aafab76dd26ad0c537577137bd3381b22df76b8bc3e4c89cfb795abdb7ea7cae74a16399abed33c5b56b7be84ff9a70fbe14a8b65471b61587c3e4d32ea6e99e1e5abe6956bdff6efda4cd5b7fa6f9c4359d0f35eb8d3e79f3e77ea7ebd3cf47767fdb9a92cf65898e527467d22c494bbdbb313ae2ecc524d5fbd69c1d6fba6ea88d9b8eb2ad4e171fe9cf98093749ddf386244562f36ec14d547054cd4ab52ce58d416ddc74dbb94fdae95b7350b66b97be1e95f5c834ed0d496ba41da2c13ae38d6b29d57f061a7a4655d6569f0175869433a09861821faa2d50f93ef43735a30a3372a035bf19db8c29666c60061133723405d259e3dca5b4fc0d822940d082ebf0a59a4661b319bd5689cb1254931215a5a4b17e2e57631778088271acf9a16a7ed96b58195a5051861265cc8037fda1d7d26b6906e60f0fcb3075191c543347a3902187b364cc408600dc69143214400d05f3e5068b6fc903bed50616a020021068a08a3044f02b7a946002d896d21381980fc75c838b18b450830b2118101ae2bd207073772c4b3bb2da1e8bf6606e029dc7a0a08b4d0fc5f02f314e3ffed24e6d2757e3815b7805b4d8c0e3e113f0882ef00037c3cbc019303ace4330a090dd6ae66460fc70778f7a4b55996a98aa32d1c7d9a8f167b773b8af9bce481a4493cc7ce88c9cd16dbfd27476cae66d5a5aa5e1a7291dc58eea789652a4cd34ac292e631ae776e6d6d5047a9cdd77fc793d9b51bc4fbcf301ba38bf083b6d6f7f6aa1e3c5f4d637cb5b6bdef7b7a53a6c858eb9936e7c81a4347dda8d7cf25a283afee84cc378d3abebf8a3f5a1e553d91ad5554777399cf73531ee326b4a12d434a33b13a87c2dbb78f69a6afb43e5890bad741fb9b8f431cd1cdde55a5e4cbea65abf794ffaa479e6708e3e4ddbfb9f3f476b96ce1e87a16654ffec72cd3887fb283aeeaa14b6fdbeb6cea066411e64e91245c7d9d08ce27dab69d68bf5dfc8faf966a1e3cc4a549526252cb2a82625a62a4a50b2a62c4b51485b9ea2a09ab220c99e94929ab6e44e5ac3d706e52fefd9656b5babe1a02f6bdeb4d297aab88b2d6d22eb7daaad3573b94a475dbea9c3572ae85a4c06557a234f4df56b9ccb676e97abce3f55566d2b694dda99a3fa27e862fadabced97b2a60fd5f6b3aed476b1997fea75f84681b48949bc71ced16bbdc49870f937dd19dfb43eb125ad5971b492f74fb376aded5a9386ab369a712d2a4b138d82dac274920f458bd01109926cda7d4f3a54feced479d7abcbf2c5f01d61e9cc34add48c664c672f55f7ec46e29cd24780717fadea9bae99a4444d4e5ab3f4c95f4cd4e4bc9138f72ba92caa9800cf6c637363535fa5a7d5239d475aa5790165bc56e8d20c6e0850e1ae67d44966bb7647d6d296b792b227ef89efe729d997b25bdf24711859696526c639d9ef3771969517d3eac5b4f24f99aee6f2b6adeeff7f5773b2fd78bfb63299aef965f8ea376935ff35cfa96b65fbb5ace697e9fecacacff96b5fcaca8b699f6fba6e2dcbd5cf52a495d2329969da1b89c3a4ec5a9c6c67e672350246221024022fba7ba9f2a730131721e0228b17c1227151e5eeb66bafc597c2fe9e19c685c94554adbe49f16ee2a2888b0cdc9dee5e6a579aeb9b483a8f19870bb798dac26e11e5f4a6eb4db6efe79aa354e31c85edd7b98a93d9aebd67ce651caeac32fd26794fd97e9dc5e97ea58d33677c60c226c783591a16a248410a6e3e8454d0c3bae361a51ed6261e56260f2b081e56ec612de36125808795080feb023cac1c0022a651e4621a486980e0621a615c4c63bbfb4db86347f8c4ccc327c278f804091e3e0183874f14c0c3278cf0f0890478f8c21a1e3e8185874f7ce1e1136578f884093c3c802706c1710de1808b43d47071c81a1789ec7091088f8b4490b84824c945224f2e1209c14522d8452227b848c4051789e4e02211215c249200178960e1229108ecd0218e61c6c5316470718c1c5c1c430817d30071710c03b83846152e8e81c5cb25fee02efef072f1071e2efed0e3e20f485cfca1c8c51facb8f8c316177fa8fd70baf80309eeae73a4021dae1c20e2ceccc51d9c8b3b542eee14c0c51d225cdca9c2c51d0ab8b8f301177748e0e20e1c2ef270177954e0220f1e17798c2ef280b9c8e38a8b3c40709107ce451e23b8c86306177900e1220f285ce491051031bce262287331a472771d56887cc7ca91ef5861f21d2b5c7cc74ae93b56c4b8bb8ef08b91875fa878f8258bbbf31095d81e2a01000f95b8c143258cf05009273c54e20a0f959880874a6cc04325d2f0500939dcfd95138a3aca7051c7085cdce1b9b843c7c51d405cdca1818b3b9ab8bb053f441cb68b38ace0220e3bb88803142ee2e0007767f9d849dabe93b4f39d24169272707642f0c07742a8be1302ce7742d0f94e0825f84e082af84e0835f84e083cf84e0840f84e0848f84e0850dcd8bc5ca22836b9808b4dca70b189085c6c22878b45372e16edb85854c4c5a220178b602e165d71b10804178b6e2e16e55c2c1ac1c5a2165c2c22808b453fb858a4848b450a70b188022e167dc0c522365c34f27604a8c4a804f06da5999a744c213333321009000000931200304024180bc70312c16c9e86ab0314800372a67290521d8aa32849415219c20c0100000000000020981a02a5295a29c7c8d19282f33e01009b2b0265b1c6599152c7f19b177053c43555c0be14b1bf9c5fad8f1a6dea9b6020874aa802915f6811ad2cc131fe698eb2978a280d50a1ef92c4c70a46efe9525d1ac4e81034e235d5337003df3edf50b9ecdfb7fc52a17fd7f4086af45247e6af2f529cfe8e3149cd0db26bd903b6e488f4226b19e01250a3e9a2110a17132954b2729741f1642cb47251420a7add4522169a8e46a998080f4d3c70dbf53a0f36dd9ed1c8f0df14b9ebe397d2791b889d13924dd5ccfa3023e766edd6e5f676fa397900b4def30b070fc2477525eed178d3873c083c285cff25a8309d66ea8a70a0cda27360f908165e7a25aea728e39205ebc3182a9f66d740cdc774053a8fc169e04bd9730ba7ae045646414bb46fa4aab1c482844d99f544e36a4259f867339763fe05898bb9a20a5658329e25a8d15c75f9d01add8f8653879714a8aad6362c8b67c86edf38147d9b817573d83271a1192d830a836cba0e6fdba0230b64a236790111a66f81a5c10025160bf3b1c71baafe84642c27f24d5aa5b18e4a0d42349f848a78a8c5202d01ccbbc8193300d990b5dc5ef3a30dc7d2f8c94a8fb15806e435a5310fe768b2f226898bc334e1510b7a2d8832e01c3ad6a8577600183ffc3dc1aea0c6f80a6ea843ac6c2739af045a022eb631c4714cee200558fa4f71291f4ddc0f7c327e2b8899b4e1cdb3329b898df6cd3ab645eba7a92d95ec51ede37df57e99b801ed5c31978614f484bdf085cf2f9379c6af1120197c6cb5b66bd50fa4cc28e8bc48e48d19411a1545469298215a4902f6e8280b71a16f6ca743e3034371caff99d6ba142902ea7ea1086f52c049b0fc08ee310b25951c59f3b14f485ccc16fa5ff90fd808deeb3a1a08e59eac455db4ab051a1e400c887887a0bfb39a36a4e01da402a3c3a68f6a2efb681b4cecb44ec43a9ebffccc0595e83e47958328886dd0ee15aacd5d04cdba3deaab3a039a5dc52f0f519ce93515b2dc2513e911cc68f85a50fbc8fbb01215320a1f629f5a82146128b840010e72d8235bf803c66df8c2769a9b6728b807c3c830ccbce0954bc0b7a6c81a5479db1e6b6a1c1ab2054f8ddc9786ef7c608c6aac64feca2dc8299441eac3ec4006dee5b87a887605520c18f44abb9208536d5ff3a004775f8087e46a35398e9c9bd99239b8dd985493b305d7bc1dfc36a84680bb83712ea93ac6e77dc19b02843dc5658d2a48c3656cdee3e633a8652e69e51d218c104c913ba5229253f3b5f86fe348a62ac219d79ee8eb07221073e3671eb8a0e38b5b1be86b644f52ea8aede9db96da275c18687ce2625a8eaca81e37b2c1ea06d007a0eb32feb6e9ee7fa8ca87d8a12286ba76c42793dcb7842e72b0161d36b22fad1f79c893a5cfee9a3e5bdf39de13c96632e5a4dfa92d310fe400b42884e1bf8bc7d66877da31a00477e4e039009220603780f1dde98ee7f890819d0022e88a8ae4203cc01a21c1e19541288e058e01e7a016e78c7dd60600bce0e888096c3a436ff7ebe513b3f3a7cb90bd6b244751329e56b5e45f5930781b959a41239a2796118cb91708a260dafb8158d5bc416e3d8ad1a2e8eb9a4695851d5583db437d32eea0098e4efff1c8538d7b75b7b179ec8909901f5c4bd627463240404c14ac09ebb49dfa20f840094e90038886fcde1a7fcc3dc8ba721a727db6f1d62f32803a81673d13991381179cc736790a9155f57f35e2266486d9f7b1bca38de118a5c8eb9098f3c9de038e6af2da766307d48efae1b6e13f86d6ab2585d86dc3276cc781c28cf08a2ec7501620d10b0e2bd1bda1f7c9ec93531806e46d096a4521a3ef7fb00b084a6549150e5f2463db5db0e6da1a1c2d439b35f1c7b7062be2c5a844adeace61be787c05ebca890a291224cf00fbb807edcb6cb25f99ee38d82d40af621a3611f1685c7b2af18bb111591b4158ef6f0f334cb1e205439a8a88f00483b1421695df54f7fe4cb310dbc651faf56b3c6089113f87bc71e8011b0eb24cfeaa13e71c87319ac45469861e8ef0c66dd44eba1cdf368ef2a4a7fb53fee63260d5f839034786a9388b3d635b10174966d94df2d14686954b5e877c1bc53e2f96db90f8712979933cd632179ffc90b229d0bea9c5472297da974a00976f8de68b1da90c550fa7f98ae401e0ad26dfc0612ffaa83cd97de3432c98f8e8840dacedcd49d146b2de82944d8bb8ba11a581bc28573335f946148b0fd5aa7bb9162d183911dadefa20fdbb894b5578203e7524ca6d1869e0296931f0cce558f1431c54de2ce131f31149e4445db510120612a2a2ff227d3811547ca8f1aa21936d55b39b3ce73b42347802869f2287c36e9bd5e58c0b13e5473b2f08361a2e82357501170d42d7b3ad97a92ccde36342c70b4b442b8d351931650afa7340eb4088a34907604de457bc0bd4e77e585d152591cf9b366dc3dd46ba6b64777e2fdfc3e35e71e1b7cecf0730156c9c5c9ab70412c47c1be40be0da9e5dd53f4e357538d3d62570ada641da09a5f071f27c4aa9ee8f295d61b1aa2025a69a62468270ceb18b6def77924bdd6e97ee68d29cddea60a01cf9f529e77fa3498499ccc9dc7059a0bfa99d54fbb93fd9316266891df4f2429432624cb5530787f41792c433c1f2100fa8165b49d4ae8fe60fde9ed641140538a16078310cd2bfc96f5447273741d92b0eba157fccc94a8c22483acc34d222f5df2324e2dea7fb0367e354e8d76565969d2cb84dc91aee3a58d28ecdba617dddd6fe34f64deb4455192ec92b02fc8d757f90caed2538567840a37ab042fd0f91d221e0c22ee41025aa123f5a0a6703855edf03e4ec821f2a06ad04872b03046f0edc776d0035040448dcc7f29277cbb9ad186731b0ef6556859b9da7b5ae7651af672ec568a241597883a16f9a553d031a5426d87534edd71fc0d8c1de4be2c5630cb4781a1f40c770a345bc2e9d3cd23cc154028cf0f34efb0e84beebae9ff904d60ef88098bb49138caf8d30e15e2e8cbf035939a9ca1c1607bb793ad8efb3221f86c5a0e80f85e9ce1b5b36f69acfcb5890cee7b7043de4cd954f378b5c218a1a5cbd28585f7f7b527d303f92c92a5e2b7ca3496ff9cd2fa7fe91b3db65acdcc4df634e483fd35507818e0848bf0c69dde68d580e176f59aa23de20f1021f2eede580327e2963e955e0b57ee1b1bdf42cd74bba8149927cc17d43a69e12d0ae8ae63b550780397835ddaa317434d1eb604918909ad781231636d1140c1b3cfa67530fe761ef9b2a98ea0cde1c51f1769845824feccf0f9fd54f12871cfd878f0780fbf1d60f4ef606df7e0d4e16a36d6439c62a20a8a5cd7014a828e69af6a1800089a0671460b23438acd3796f99864be1b682eb30f5d50e90922a99a35049934a92238c8dce91cff51de3dfd934b783d8ccd7be13bd319551841047369a7d41671cedac2ff1c6da4b0f8922d4a394d442de5fa35c64cc6f8fcd322245a92cfe6a7b5b7fb10e81ef4e587994876fc98b3a2fb7c02863ec020dcd82ecde9650599cf0ff767e152b40d0b1cfd91b5007911aa8834467ab8048eae88771918c100245fb8d2c3a0e110169673a9b96c3fde2ffb930d2019db13224023e8a27f168e14d59166c8183710ead7229bc7a3e6b3f780111488e81897b0aae6c6116883ffc1192c84e6890a92148352b2c5d35466abe150e5bae7c34ccf91726ca13cb2e3f1e1c13af06f3aa7260736b08ef9fec83988549592c14a872ec98e69e05c11ef3e9564a6d90516ad899bd304b88d8b75a480ccd2e1c7a1cfaddc05a3f5ae3427d6079b01ffe349e67495e128abcf630ba66324532bacd578adb9cd99086dc15994f4d1f79a4bd85eb9359e6b0df118198f55d99d841e54f7fca270b7f48e927acf9a7daf36a5cac2ea0974045d4811f97e21a61c4d30177074876aad26316a95eaa476beaad9678bb64a326752da93c346c878c071edbd15f39636dc7da9621a8a6ca71973297c94afa2e5580bb27f5a3e5794f6be7c5dfa2a1f71477a0c5b8da0461d4183de6800c3724a4f023fbdfd1c70b9b7acee58d28cc2ec9c81996e13ad4e09c771ed94503fbe24b97f30215c7f1cc25315cc01b6d1e7bb2b28b8c6994561c4ba5fa605b35f358a0518b14159140c06934cfe69cbf0b86730630812fa559818e81608a55a02af318528ae8fe3d5c405708c9329bd78c36b00e3a2b45b31c4982513dedd629875a026822fc2e54697ac53b636ddb016519463e1924ba9640b02c1e42eace837c8b3892a7c0200d97d54de3ea9cf1c38d6e8b5695142abdafca574dce53086fdaaeb4bbf67690fe105df6319a1aa8d3acacf51c58a8b279faa6e7688613f822b87717733da453eb9ca6b52861d13699bc35d3a4de762515c1f0098218d6b8c82793f899343cde6823fa06f12a2bafe42185f8897a7b8e0f944cd0e510f3486504eb821cebbc22068640a3160d34c41f0976cbb3e710bf957012a322cf32e4e8ce574d1e4a2a404484d2f3ab355d144a703781422113c92238adfef0f48c356e9017455a77464921212c1cf496a528c66333d3c7804435da3d4b6fd8dc197fdb3b2f43908700d5f619ed33ae395a9925361f82a7df1bd1e8b154139c61cd3e8651d57b2cc48ea71a1411f29084c65ca89fff7661d0d2ad61a6de140e82448ca7997c066fec0eaa7b58387d7108a8c1bfafbf54e8bd1299e2608764891abf95f6eb6f7d5c31bff1a49c216b7ce8aa00773547cb592c57ed96ef8320ea846810ca8a5ef45e64ce028663af4fb2586f22cd354a86750cd9bee1b345ecb213e36ca183b3b538b928a54cddf5484742e46e920ccc42438580f71cb8cc9410e884c1e95191796b0ff55f07024941630d6ed2450a90c5cb8d3dbfc41b8e38126148635e3460901c2e9d2e3dcf22f3029c1b01a6fa8305524dbc8b9f52c3a87ceaeb3ed09a74221ecbd19fcc6e4c21d92855e936a902aa6a724cc817c08e5668ac0c7c10c2bc4278d8e57ab0c28094ba3ac20bb5692f4b7fb35c30aad25a952ebac0fd084cdc29a499d1b74dc2472f23089ea343465a12094566a9ae347fd5f38a78b31b62ad89ead323a884983d1bcd97328fc3d08081662bcbf0c021e7594624140058de19c854f9fc248aa069123e25218884fa4905dc1018f523c8e05c9ccc241f143a17b214d4a7099d7cd4b381c603b9cc94895d58970422c182626dc44197544388cd6b92a9b0612f683084a53b114c91094b2e5dedb992f2bf4de0005bf6deb0f0bdc143b9757f720778c692b474cb985d1022d2d5e7c9b639911bec47134fb36a3160449ff29823dec41d34c035476cc4406363d480de3e12220242b653421a15a5ed521f3d89e95da810e47e87a356a9c0837f19d72c092b2912b33a7bbfef0c6064828675706d9994ab3ae7dc235d9cafb852356300e951c8b662b1719382a78dd900856fb9d6b6a59557f38f7516ad15465e469e3ebb1707c97bfb060e48e71b39e2f5173985b27242d4c12a00d755a50f7336bd665bc125e8a756faede236086949c3d5ec911ea6a0b6dfd16e4fb2e4050686c38764a35275a0506f65a920254c173243675610d5b5e36404ec005e93e43a3482972e500fc9ffe124a0133690f08182e830069ca1310c66bf2dd407e8160034ec5098caab0c84a1297dd45d59d388093e9710b6fef01ec03556c745ebb103c72a805f058bad4de22772743a34a6d4c4d3b8a1116c7d4c06229ff4a5fb9d7e28dae5b4915c2268c0b9e8632a5bbe78913f569325ad9b329b6410a3cac52b8927548bdc64d00652796ede21570f3f2fc5c0cee8c0a2c2a3f90b051a11d7812b1d30b1bf8d544e381978b903f008cdbf3a0d13008bd1d80b0bc40cca00ee27d2fdf56a677b1bb9e757483e09a2df3de737c18286dd7813efba4d9525309b54d313ca9fc01779acf153291250225212a284eb69e5b521a11fa2ac38458338725ba40ba2dd9d7b7ecaf0efedeed42c03007458ca80f6185db70bf1d59b0faf906fd07a821fdddd4189a1cd360cf76fe4d8a46823d16726e2715b68c6c74f826cbec7b893f2ea5f48abf73109c2dd111cedb1816510885154d17d0935d62bde262898d45c5c1265a7bca14ac19d5d1a5ea251592828a246d17f9d90cb99ab4626480cc614a8812004f88ebe8849a830f6c29d754bfa2c732f14f3557f4060c2a4308b93536304d19626656af1622784cf0e78ee96bef16c465465c3d315e9055dfd49497c12f6228da394f56d95bc0f0644260eabdc14bf0a7ea4142b713113541880880405656484c378b00ea9bce23bfe17c4116ac23c0d8be3ae81138d83a533d45f311d0a10f8df7813dd3ddedae798d7243deb938ff57541e3625036effd654d855f8e459b31b83bcd6b08a6f3946899e113c9bd1f119318063906d6e2f0b3ae2bc9246e436073a20b3061e223cba9c51d8d7f7ef76e02e01e14faed7d77e2cc5652496d850520e96f86ccd3df7a03a946416e15e72de9fd83dc605516721de3767af2f9e518067105f4f87bb4572a7bf328fd390f1ed2b3ee51894deddc090188a1bcc2f363b2bb2f3d307254c0d8243056c789c395dcb1562c8b4addb53942970d4da5fae223045644c5fc6dd31697d648f048362059b5da8dfc6f652754ada18af960e30de9ca989bbd83c97d301256b37c92ee23bec863d9a7f9b07e28fc754c189a50bada349e56f95e326d75066dde76b855e16f792ed8c0178aa992cbbf7d0b14494d7e85ee60e9d05615d92c0e4b16f6ec8d9afdf610bf311c0a31f23db028c46296de47355db2653b57562f35a8e905c19c9e126a43a0e07adf810a5d66a12c9623ebec70a1d69a5ece3edab920b6360099a9df2f2088a1dbd2c8e0dcc9d0fd5e5949ad024d0d82c402a506ab8fc4d25290c5f20548818bf6683d12761d566adc07b26a6231f39ec1c5b1e26af7d594b17313101fa188fe718b009677dae0c8d53ae3e04142da5f6d3bd4076c54f3775c792d073cd84da7d7025903c5b908cac3456dc8c4a7c60a16af90159fd6ea02f0744b2bc702f1ea05646683a67648c7981da39354f4d258abc3aaee0abb458e39352c0e449282c57033d189305ab766fe04f79c35e02dba19dfb56fc3e6a75b3315c59430baa303324c0ccd8317482ca5842d23251bcbff6fe5b585b8762c5b906cbd60b16e0ca0ad2a837b7fdd86047b63e1b239fe2267bd4b61eddd6bd0da6d5c830a82d1035d1a30d9fe73cac1120e86f1fe8948764b9e73985de4b542c8ba75b98b275ca4878ca9025d8a3b40299849f41b7f01dd3f456c11fc919721b9c06c0dde4b6d9a22ad7abd2da1e99729bb383bef075e74ee91e41f76695a467f1596ca92900b6d3064edd5d3f33a7805935c02d98ea99efc922966d0d2d7bd6bf87fda18937316d5e5b7c73ef4978c34e4ad41b96fd4beba2507296ead3a778bfef7e1b4e1be6dc856dc3d9102304dfe139a2fa8680e5de887d3cac6418ab65f51f03b3e7c47f57320e3ea2a16d5b660270189cd275fea9d6386a7d5bf491c161bc28ec2f3663446fd0e4601e832257b976a08b631a4df8c9c4e6278c44038ab781e02ab1a43a91bfc2e6760464cea889a51f1970bbc07588a9908a7af5807963306ad4a57cbe6864d5d85e2598b9c8e5223e1ca1a1522f338edd78842ebc824699e8697f1f708252b028dfc4c7165e8a56b0f31da73ab71eb160569f8a5b71d8c101e79754d5d26230d80ab5d7a005ecdfdcca1c203b7f977dac8744901efc6069cb10674d2884baf10111157f76a10c3f623bff044a0d7f271b4d4e12c3590628806a43f3c2a88a87f84e9949369ccdbaf68a879740cf6f38e18b8e5247558f734a9ac52ae94d6fa159bcf5a3d193898c4349298146b8ade3cee785f7691027815cfa0690f7751e856517e1ad27ecb6fc44c4f48ccb1e6fe45b00b556f1f8170afddc15f31bca3cf78a23d8569ec74f8b2022f0700f7a62328a11945163121b79decdc5156ddb05e50e01c3aef189b61d1157386d4049098b5b94f04cb4046038145a6ac3fc1d144bf9877d9da82955461304ef72d9cc75ed5d81013f92461907c8979e11cb2f301250e0d1a05dbd317312b6711f344571ec461a3f7455af61413600390b751107c90c1f1affb88c68d3481071dec063cbca549223b6d34a1631fe1d2ee644cde5af17a06352bfe0fde4d7b2da0e3daf5ee2fa07f196c15974897bff81d61e435d489b27d2af986be6e297564e520c167617d323e94d1c6de1e859962a4b32074a63d8c8046fba8e3eccbde89c8c65a8fce93abf3db8bf2dd82a68f38744cd98c663a6c1e643b47b8ced4e8382f4f9232ef24801e6f0be047252cda4abb5d78bbba4145b2c6dd810fba1ebdd891ac38ecb7441ef62625bc5c86ef723965af821210f2ac7783e20ccff44fc0d60b258be4f3078499040b033918504eccfd647ca4f410a1c7eddc080e3421f4711933928d5af62f489dc09087393bdff1431ae54943b3d88a8882e9b1292ccbc506384b963915fc1610a1ecd41d36504b7cb8a14cd5ddbcedc487fc7600ee88249eea728ac6b8b78fe187aa05e8ed8216f9d107452a1cc0f05c0483074c5ff949301f9fe3c3942b6b80cd55ae5e1c7e18401809a5ce6b1ff47737540aadb96f106f7691e931709ebda44839852ef403659d1583f5390e5cf83280e0be6ee837d6b7566c919c95696ad77aeb91301587bab76b564f3088cea47caa69794445f5c2f74e4d1a034c3661a32ec8270d2d45b7d9bccc53204e57eb8874b932d0c4933535106e0e10593c95e13bbf42342209fe73ada9948470098aedf8ed810e607adfa7a7b37a25a17ec5dacf3fa4525d3f1a029b7ac08b64068cbcded6d7266ee2a550e8df04a1561e3ea2b1d9c0e7f1782f3838bb49441119ed74bfa7702e54a88354999ddd77af9325e073465fd0628a627dc0159a7391da9c322a6b15d802af107069d5ef217338767259adb17310c4cdaf9913d82d395dc7e827fcd0d27c493887247a9cc9a157c373f8ad9d76adfb503c03e44a795f499b823f7ff69b9c479c23a7f11f776436915cf735b96f07b2d63a52d7bc834f581db62c36a43346d7d4218025550935872da447019bc06232b34c1f710005988010cdec2eea65df145025e2c6b55c50b77a467b91901ad36056b203372be10fc682d64d7bc7fef30cfc0c0f9d20dbc14aef366739e3f9677c6e3c00c371de4e70dfff9369a230c530db6293c4fdfabd16895bfd64b44f703e9eefd42f8d3f165140316b529244787d0f11e321e4d840af54b0e2de66df5ed6eeff61b9825894d7dab9e9ef31b2a5b3afdbbd81e9ea7517154725317107ae2b530838061a34f0c546a1325cda3658f00fd7858e0c3a476796434d16f057d1188cc3dcc9b0341b253a19a2e8965e3f06f61ca9d3e8c9ee6c084ff5180536f3052eb38543076843e08fee0d3f62bb2d7bd3baeb27528bda8f39c927b2b2bfffcb9df83c96302ed5e82c4342e42cd9f734b8318aa69be2e9e201d47d78779840c179c8ec37a76d750e09dfe7093674021b4f55b708cff85a11388254d88830d4e6d1e8f63ac43b2610f483ad4bf95309d47e3583825bd10104a1ba3b5ce830e8c5808930ea274284c0941304ab6509c64e90f9aa8d8382d3c3bdc88ea2fd9486e38c93772665d353d2426e32e69778abbe50a342174d4b25ec58bfe550f375ca786e6c8f3d5661a1339ad41c227f8ca18f476bc457257d6ad6b6a9fcc564c6dd50aab81b2962ff5e3d034e1447059d00c4fa5d4936ca004aedec2fa03259317e05daa1e5d04b1f77063a4b314a937c0d04426cd991dc05f68dc37f99f151c6cd4ff7fab42ada690df2332724dc168ce9c5d33b6ef201b358b764b37c51f6ffaf884695caca94f556087d26e82fff1ba2434af893b9052aea6fd1d37f9cc490268535e6064f07b7682dc8f709b5bbab8867e940df8fadd940a8865de41ed839a63290e35dd577dc2a89ac58824e8cb9ce37a64243fe5447b68ec3a56a96202232e77196bee9f3a8db17f7b3854dcb871440b43855bce9d6e1fdc9485f59b2b33f8a8e1f8a8706aba83fc199317b8fbacb1f8b278c6a92558ab7b3c005a71c22fcdc766d71416c50e7e5905a02b4b90ed6350f22cd012007738df16b0d473c31b4676dc1f4a837d15993193be17cded6e673922f043bd2b455ce4807ee8e2ad64cbc45693182239433a83d44a8648120c66247c7a530c23b4c478600878b14c74686193f5382e921ed7c1d5b97d1bda96c1e2e852b5be654df1ff2a3ea0a84efee9c70b20909697a2e2a6ebb2200de5e82e8600b5b39261e9ac22b41706a02b0d371c344ed7e665bcf55dbfba1a78df805f1431059b499fcc9bbe0d835470bcc224458a89bdaefb2592531535f31b61ae10904f533be9890e0995d93590fbb4cf5dad08d3c16cf2a8c5b3eaf51b19e3b66331f55a2321e1158f985955991b794ce182d52a4fc450bf54ef735eb7c7d84f256979b6cb24b527877cc01ed758ae28850e3c514fbd9848f15135ae7feb59470336d008348c7b7f293611f6d3c439060297ae29016f12085057487388e8dc333b500d59a0cff3f2f3cf5ebcd07ab7414cabdf15406dd99e22c629cea505742622f121a21d679a40b559143edd23041c6866d33df1a1460b79853ee318666455ca8abe60c2a606b3a13f3be46d15d59ccbe4db48fbcd19ba517b3e9dec272fa6b200154117274da09a43d9ccc93730626ef9a6a40b89449660c03f8285bd03f16652884116e02b876ed62e183f5789a580763efd60fa8feb4aa6ada391b93c868089b4658c8a795fca8e4df7c20a5ec6bce3e63953df8a0a5b2593690d0f061fb9b0e8a13d4626ba5ce5f5a2a5a120c4e9f601762068c31295ac0c2206e6090f3758f163171fef3f1842c8e48ad21118ed83fca30a53388987fd77bfbf0461ca7be92fe4c77ddd27d3e381a87a8b3f93258be15e43481f43975df687af40b743d6c5e87766cec57a0d946a6f46fe9118f6cdeb68fd1650bc74948325fdb5de23901345b6d7958747c262e79249b88b3c423d5eabf767a3fcd6ed80060c1759707d24323f41fab51405edac29ed4ee103bf90c494c6ea381954a2f0c268f69aa394808472e0f5c64bccdecc7b87e8fc34a6cb81ea685140ace3d0eb36cb8f4692786da468aa84572b06655b1d5d488f4c35c958def19a31f7a3aea1fe5e3376f8238b79656b54a668808c7f043e42d4209f85a9d95029702e5ddc9f5ec38e4b09f8baa002809855e6c21c15883c8da6b95acbb99023ed0276975052022109844d216872252b3bf3a2dbac0b2d46deb08fad4fbde0d980c740147fa22b8dc88c8ac26ea98bae55e6215caad98a84646105982c15b879c83c5b6b6a8faaa4010f0e11244c8125e10aa0d6aa80d2b0c5bed83b554f813bf95ed2e54e6fd845ac6106b32c1921e06274280897936a262bf86f8634b023982f166a00a54fb4c3a23609327e2c02c00021fc19350fed96e111fa48912fb2a250b2f0f6c850fd698ef14c7ee9e764451e50ffdf2e17cf86cb1d4bfd56929639387e1459e3f3e4dcf0c2e0f7af233b0c90ce49f0a3d8b26b8ae43c4e2ddc4e59e3f9f27c759afc68c58956d3172c0967a3413a231430834807f85f734459b8552b33b45096803bcad2a1e04079fff6984667d0581ba0221032500c173da12f621606b564b00e5f5f57fa64cf0ed0c350b1357aacff45c35925f29476bb652b8fb606104c07245fa575a5fd00801a03361673721af9f2a0031cc4510a6488b910d985fe560062a65f8833277ecd0a9baeddec616cc5dd8334fd1778dcf4f9b66e71e69c96510f3cf0ee848dbd73d327092640187220e451df2da4c531a1022848296cedf69fcd50f6bab042bab36c68ddd0843d2612ee7c92fb517ac3b1ab37fb99c57d4bcc02d743d985380921cd4d8b0a78063026c720af59e05192c973d36463a5561db939423df2fc5999e89e863538df06fdd8a42fba346be291ba10b16b35a14ca539db0b4a0317a9527aafc05c147bf80f0f39387bd40b950c6b94e84216867f98e2c59e5b53e8c42141a0eb32016e1cb866a25451a0e33444f390a87babfbbc1784f54092a41685c0e78eb9d8413eacc21ffda28365bab4dc0023aa64e725a35d1698995aab2f268dc0f870650701717151bd860b4f962273e50936f6f2bc733a8091e4583d93da75b194b724b78146057eacac9c35f93df546c7e14bf3dde6464f85859d046faa98a437e8a136e10d0df5b95365939fe61038ca788038162c12053a60223e8cec033d986c11e02b17a56e5ed2d9cd7e6d0b45fefefe86a21af0a9f0e50e7afc8ecbafbf25c53f88264ceb4650790abc7b6a5f7cfdc8ed53643e16586f4125ca3cf7af1c88a9acc19e2951c78d72f2af47020c5b600cd8fac92f8a22cf9a270caadc88d1663a63e3289f304f3dffc26f1ee79af36ee4d6d5a5f05fe6d75ff65473d26386727715ca204da7eecc2453a25101afc33901258cea2a825223368c13db01a4135105899ee2a4a0c0b41b70cf2e4cc974c380401f49c30ea7b270aa0d922db7c72ef27ffd4c8bf2a10c9958422f7cbc2a7b94d0439d6a17157284c1e6725a338d38c1ffa4f6ceaba03c1774dbe7a3e0bc283c9b2e44c94ca1d16f1b7ed85cb1abb280b6bd82efb3020671b682e071e8cff8f38afdc68ed8470712fea2b908eab5433159f53314f28869f8751afb970bee9bb769db23d8f3b06a392e7bf5050adcf841c8ac1f702fe0ffc97e3a8ea77879e991765c2a20d19628dc69f6782c1d23ccd5f75ce1c8d81b4694894d56f30613ede0cb37262ffd109043945b9e6facc2238a5cc47f61ffa5ccd73988fa83629c6cac00cc7fb35728253405745c91a11380e476bd01618540e8443c3301ce825ee418ddcef67f09d70bc24f44b826f41db1c6698cfd4b8a046bea4450f0891565ec3b7efc550d01cbc8f300cd2dd9ce388b43a3fe94b0e85816c4b92f8c33f2b762a8521d962dece5df34e99a3ae686aea1f168d201c65c5cd273962ef517ad83c8cf6ea259c75b28299f3d9e9088847dd365240d0c0734b6bd91231d00b3f5776475ce9265a86ca4c13d747597ccc9dd0da897b14a3c5e46227d697a7ec1597d018b325e8fc93e14d1a2de9f4ff22066d7ebb8318713e3f4fd977f9ffe94b8c5305c8a2014fa309fa3f7e410d48b954e88fcff301ae85e1ba3e855458789d3b197495d069dcbe936324c46a5cf12507e2bebfcb98329c3f8f941bd2d8878f47438c00d5f879db370569e0f13740d3e1d798fde52a9a633af5e5168ffc88013dd2af1d397cc8408672a1ada8905a9d0d8f43412eff5a893fdb6a653d768199ff98020dda889ee9081c043db59e09e789622ac08b99c87d03407fa4bb6de3a7579a5d756014a710d591b516df34501135fa3195bcc6d6b198c86e44f54ba4738af34003c85ea49be5f70bc3f1c95296b6e049b8b88b7650b11665de106ceb6fb48ba77e81f07e0bd69a1a30f4d12278900db6d4cbed0a950addbfed611966407a91e0b7461c88332bb0225c2905ea7d2552b2727ac332268ad8038afd2d9685fa15bc6257f25c9423e3aa1c4b4b05db0f7b122599f2d4aa430957accbbe8a243246c78082da2211fa9073155e6e3e1bbd688058941d131c0e71cca84b24d41a9ce4476a2e290b02bb835e86f4cebe786a56429d71619dee7a0c04930af14e4bc4bf45dbb8b19e0a057e0d17469b566f450afb6dad06ad08cde0dd414c67b49bdd490925af05e1d5c08ca5d518957ce39354cfe2975a2803b6e949bd61ab16cd77db6a76c1579dac5e7a0c17165f7641277bf11b86ed5705bb66f1d53b2f40fbce1f4b3e55f8b0817c7125e4618c93b9469e8609fa82ae220e50c32b4322f0ace8bc800167498234a4633da9a717111f984f0719b405b6fe8a3ea66b181591baf4e6dd4187ee0555fddb0100484252ea8c8711728073c74dd47b45748edd9c0cb6ba028f79cab38d5c97d478745e73ee64b9a52c52ab1657a56c75cd312a9df548e5fb084b7db3585e0f0756415cae17b10c3060eb91889d66d84eb365c658c16d856991a33b2d26cae66a0e1367528297d40c93e77ec10425463c878289141df2661ad374005698e2544870302e0655a32f45007fa69cb3499964240c02658fe3735d4907a8cbfd17daa80e3afd991cad35748cd248ed4a973d3c74e716215833df7f4d130283269a48c9e662669c56e964be558c0d2d7bdddbd4734880e341acc2a2a2fc26f1bff619414ece0b6c247799d31bc6ad8cd7af42013d99eaf4cf7341580c909502559ebeed4463233df5606c6e8e169c3edf2a5410cbb0d13b5ebf02ddb823d7abf05e932e93dbee65c6aebef06db71442b8c1c4b0f1ac6098d32d017a05d3cdd837f7ffb335020fe2db8d0fd4073af82a3e40213b5421f9700fa50f747603a8e5fb7f82da1ed61cdf3d6a57bf1efe4e01f40ced79ba5426ce7ab5bd84aa783ff5623453afbf19028615c9610b09e4813b39bc662dde8d5f5f504cf7cf2b459a7f30c2ac81272904cd1ebe600ab92c0bd12b2883eb7164b4d505b2f27838b1d66398d9a10eeb9bd212736d555abae41bb441885f7a070a6ec6b68a951b37bc7f63eada6ffe696e460ced8d05e2bd6ec8a8186409e63b762c2f236e9e9c2b717e319d33a5c6c172d0e36b2baf0c677b868039bef68558d0ea381006215d09174a586def6f309a5d7d209f3ffe1685938043bcc2ca972ec7d4a1e418e706da36a1dbafdd4cbbc0b187b936af694f44962c38d8ffb3a8386dd50b44ac7dc2c7298cbf2219d94cd18019df32477eeb8f7b62dfe99f268b8616e7e7577db0c83b93f2771025280e86ecdd9ac94e940e99141778a53deeef584b99a7eda0e0def498a4bb9670fe149a97305e9c804055025720ca0821082141bec4589030148c093200d5ccd98e49409ce910b29b1821af64a1d473c42e17fa713576cb7a620ee32b3fdcfe3c3bb38c93090c77370547a5e330f368bcbe8d46e54918085506bd7c6ec03db423a7d60fe0db740796d211ecb51d640aaf1da43a753c7ba4d14666da9bdccee1b4379881776473bd994f762fcb4f211d0af5a3599f657408536ffafe15f666b3a4db544744e70f22fd63f446d3a375a77782aa2fae9c93db612bbf508e0212dc1025fd5b93f5865bdfb7fc48b7193399ce21dc97e1b3e839f39cb72d824337b1c926643e87ce835b1cff22dceb4a87874dc790df12b5bbd334f5a471b3ed70c9d44fc673156b727256c3ee0b961977936f068878fde313fb0e1e54bce3085ce62ab3cb4037bb3d57f51def027acc4c8ec5a2863d1fcededb5b38b2d94c322176edb135fbbc966f13fe2aa3e4eb4497df8684f75affc4765eb386969828de234775d3d9f203c60f81829f41cd66a1f1e523f53c702a5fe2e4d9ca33d022fd2bc09d2a517772cf978f3edb8b107ce37a00cd5fa31b67e7bc7a6a6fc1cf48fed7470b5d70d4c68fe4dde08dd4533bbfbc28bd725c3176663e1319e90792078e6b7b6672cf569f8bcd5603749053dec3b0c60ba9861f38cef523974018f38c52f7d7c3e2fae39151f5eedc5efc1b78916ff651cff13cce3da58b657774e2408ee20a74431bcd75ada8c51236e86e0c89f600d62fc1c0d81e6b983b8147fb5592c3401f0ec6a17be3969ba705785e6890c735dda9791b9d3115ebdbb77e13f13e5cd81345aed5d5d9a75ddf41ee8e17c48f9ef3c7e98c8ea57e24983283b868b6d44683ca8bc3bb347f4f6964887dbaf1aad183f2038ea4f6972ef2db371a470c8f40700ba284ed93dc75b7541c299694cdc976beab9b422a9b147a1cdeb716a26bead34ffaa7655379532637ce0aa6ef5905f9a5b229947a10c60d5efe6b51c0a5913cd40376036200da732f84f50952d1b507adbbfa489f58d49275e084cc165a62d3e3f7753a1dd2baab16536116cf8d9a73be3957498c471f407656b3e80a730a3ce280b2fe5f88242cf636e176dab073e0fae4e3e0eff8cc41b097b8225706a2ed68b355626c1c26f2f16bee2dd8f55080fdbfcab60d43d0a5683984e2d05eb88a773ec27d18bdaf3606f1d6eb9bfaf4ed973b40ce05236283cc90e50c98f0f94ce62675f0bef5d522441e03c0633a3e59aa681778b8c14672e7714886313a55ffd32dd99f9b9e7155d99a052b48b7441117581af151929d5c380ae0fa916596c716889514e6925ca2c2d739df4d4d8186d4daefef2d5add409eb980ff670166d286ffbcedff087ef85a2971f3bbf96ba315f9d50bac0c7fee089107e0cfa54abcfd8bd2092baff6ed93b621204b8edf9f3b39adde28cfca3bdcf40b2d06de1b1efe726a4d878171acd11f96c5f4d46ab9da20ec2040fc42a6d3d8ed1a7fe9821dedf2929e3c10f5590510699a2328a046d545c71d1b8aa9a953c046a8bca0115c3daf4707caaaede9c552515ecfb40e7690a7bcd10d70b435545248b87b957a74d8c4f1320c7bfdba0453ee320ad832b2a9b3d9da7215b584ad709469a89ad272663efb4b54c9b1ede8cd8977e7d9e3f581caac677e4189f441ea59f96bea003f8f7a5b22838e38786d7fab8b2a40c8ea29801637f7915ee6731535eee47acf4a88646274d3280edbb8e27706b9c92550e848662ec0daff0b1c5b274765223d376061f2328c817b6bc51c1115e809ed41e1edcd1e63c2c2a14dade148688a15b881ce83df9b4ab7d0149a3c8e2305f02fa4f8ef2e1b5492a8f97a0f82728a0c7bbf0cbfa8dcb4882658b950fda246fd78f77bbe7f1e626492f60ab6da1a02192bd4c814121cdf169af1247bcb0e4eb57280993ffad34213398eef69e547ce6a5fbb643fc658b618eabf3898b37d7a729168068c786049b9ababbbd4d964eb22adc3db0c78c514eb6360402687ac02ad42644b14d07da89f1d07f101f3a42ef5f5e02025ee41e4bbf0031ef283323d2257b3ef8eb6ab03c2eac79a2387126d5b9f4b1c8448131c169cbf3d9f814e5881991d6981750d7dbb5df57ed15da96d5b333a8a1f44d56b0b4325556c44f56111a95e193b7c713f21de7bf791cd82f09e0118b0d22132ff9a6ab406a27c82afc57678c33f41a36c019c952e4a8e0696a769bc0416667b7a839d7501864fa622639e645c764a1b9609f371cb2e18e59fbcbfe1f94b2c1dd66e62038a4188247a2d3d999fc99414b307c83d8121a80364597fb125187484e676fd793e69f9b9f93b480353b8335d7f7d8d3af8319e5ec694568e83799b2ffa553f2b8dd2ba1606a53bbab07a16b2d99431355320e81004f18c73d851504a19764c0fb9e00d860ef5ba38051f6cf9c5e3a9155b5e5fd240463cec544eeaa23f5a3b033faf9c05f2efe42f78ca17c3d63ee769c74b0dbcc8cbb10b199d4b250dcb15e1a6aa0f0772da15690f08097ef239b7492d8a1f698debb94e03cdb3c28369afa037149f8ef4bbba748bf3c47542a97cc6bee1f9182dc959e4a1d1f6cad492c8ea5a8509a0360984b01ccdd6650f8e56328c6b3ffc0c0da123e321fa79e017fd1ed75d84c446df576aa241e70dfaf73dcf8708e62bfb84ae18661daad9d9689e9c2aaf5c341b8a861072cd961f8024576615767c78f70bc63139d4f19f86e7adc0ec0c2339821441b74b9af4de5c1a93056140e5c3bac990e692a75b941b36a33404a069ef2a30db953041beed4c08f4da8046696574d7e16ec20792e87c885034ebc1c272bf7f70b5b3dbf0b6f4aec9b742f9ff569765300c9489192f01a9236798e51abeac7c5cc7aaccf4cfd142ccfdfb37ee800330ab03fe8e5df92b2c2ebf768a463040f8d234759f75f0f96b6555e161be384229cd65450961bcbc5f3ba0196283b1a2b7bc33312d396ef2466b515fdd3ae713bc7a5ea1a7b3f7e8657112109210fec788e5fd705799f8fa0b286c401ac754392d14e3eada14edf87ec881d5fc1e90e3b097a272a56001773c1b111003232aa31d44491e80d1424dc182998d79c3387b1d98e63fb804d8ac59a41b97261b2ca373ca784ab9186e9ac0cb6cffef6e283384d810e68afa646a1d528ded0da549e686940755a125b2f6488ef2a3a1d16628a31ba48a9d2788c519956598e695a983fc583011f136f64794719e7e11407e40d0c7362048550f8f2c49e4130373a2016ebda8eade3804f73c874fcd4d53a686ac7e2545c803340477034d120ef7b369b245221e924194d7f587bf62db6767f45df9613ff3363510db929f8aad83befc91e50335bb13dc8c3bc3baed84e10eed5e8d20c8d099ea33e7a79819e237ea46cb6c090cb120e8c62a59a9bafc45c69843d3f0e7cd6e22779455f2fef10f2a367abc72631e57084d20956a8217c0e0a97792105d830b85038883b0ed2d4886650afa0582e16b677c4267ba46bc3571ed7491a2ccb28621892af552c4425ad933d443e878ceaa7d1b70e16e0ddb0c78c10c63602d804ca208e3b348a987e44d36aae5f02c0a4a505ee5ca9d8c8bd5c631ba0ef37f4383aac774b6031d0fc0baac33b83e95b1854fdd261e0c45cf297ad9c931e4c04100a25b4289dc5959fd48ccbd4f426e0f8f7abbe16d32399f0a1c6325d3b6cda2ce53c73bb7f641542b0ef8bd7cbcb39c4c81831c987d7ab380b40e91813c83c561f098c6fcf7f0e97614476c763f0950a7448324e155e76d4c6f4b685583befd23575fb8684434e26c0edc04eedbfe6a8bf2e9a3b1307f29230005559742689b1aa1d6414d5b422e0c86332a9c5a857c6f1a8c5b911c85018d6b36ec6b5c83aa75f9a90c6c7c025e88d7081adceca07ab1613cb4611869e1d622f3b33d0a5d166fc4c3b4f7b42ec46b76c1e34305359f33268d43b3db5ff2800889d8f43b90380b22f19c07c7c38f199d859f41e470d4501c5e29c51dc9153b76964a2cf7c054d360e472260a363f5dc859ef68eddd7e9ec5c1cb127396a517be0b18370ee509558817a622035347efdb1935ea02cb9e654e1c1ecb08eafa78e2287c60c9f4a946be43f7d14adf8c303315983a86d7f4e4c1588a48064eb030cc05c2b66eaa3af6aa51b8f32e92f2e6b5fc55a2ead9fa72138e2c547cc18ab96ddf1794fd0bfe13306123fe54476b906d5423cd05f0dd72b90841afaa149861801cd2cfc0895d1bf2d0a2e65453a2d2ced8682e78e3d8a76255da354846227be9eb18a98b346ad7266fad0b70c9a1f7cca00484c79cbc383ae39c3c4aa1ea7992ae0e40b0c94718b95171c0c9c00273eaa24f81aa11a341e6210048bcaccb07b8c73b735ee8dbd0796706df803e2a5bb8b825991cc2dd4da543c110b6ddce16dcd2b81411f4f1a3b5f5dd1e5f7e8613e14dccdb32c215230d72a949b41e5eed74c1e2f330bc812cdb81211a5bc16b02d97a547bb3d5dc3b1521f1c308cc071144d6d6195c460c0080c54f561fdf70a5607f8a7090edab11e2dbdc60dad6d8ba940bd975438dbc1b6c0b595d1538ebae52b3860f569ea786b75cb7e4067754b2479d1ccbf9886dc2da6cfa6080d14efa3dd4a952d6fef83643ec807b383a9d65540e7f0252f8456e1095527ce440565152fdc2bae1bf1da201a4d2905021e33ac0692e300ce5acdc4cd316cf9296506fc0c3d1d9d1d0c9f936d9c0bbe7515309ce20411ef4ab77dfad988c38d96c74b1f0efab33fcabf7eba317c929b71704171e13a108714b4f45e09cc02406f961697747667d5db00adf870a115ad4366c96bd72bd009f6a1a194d205efe8adabda68d96a526d1d242856f28d6ba70b9fb7142f2a15ca1201ba572d6f61da6836c2071535accc9ffbbff37b71e5ee5e5edee8c941ec8482ce04f4c7fdafab9978fd0763d32888e9803641e18e78dafc0f89791dd08f4764140ddd6cf2855cd408c6dbbff117ecd2e82c05444805e57f703ac8222720321cbb4743efe56a76ccecfc226e4b287f75a0e58209f974a5da6a4e5d0eac8c74957dac09960ebb102b2b05ed6738adb4c24c14b24ecc2da436df960103bdc5d2d39e5d032fe162d205b7761cd49e966b83118f74bbf010cef8286790db3396ee24ade17720f2e2670b2083e1a069941b48de58a1872ab0116929b5bf1fcc9cbdfcb1d61f22a0634d91f48c056184f9c99a92d47c840469d32dca7c0bae9572c9d082604c761f0af30c1a45689de4dd4482653162324454e0d226407e1b8ec08d57ea9abe7eb3af3d5768c1967e091af01da1edb98c8ee581a6a2d3434328b5aecb9c66bff89b60d988ff9fbc9488e514e828fa6fcf1cf219f3d49ccf2805c09be8fe3a3da368f5319d4d16725733f812ee8b187621449b8a1ddacd7039d180022692aa95ada864c78994f97fc7220eb1ee1c762dc9e4910859c5d5fe7e133bab771740a063f9f71ac03d32c138b13d2872d569b58393b6cc5734201ca4a6820739df66ff041944444f4bee59ac051a33610f49f9ec1e857b61eea2ef39eb73425aaa73a69ff871be0d795f9efa9d52b7a8d40dd1cb2609f1e3b718c531f416de2d142ebede5edeedf53586e907aef3a54b333579c6b677ee1f6ea111aa616ac05d6892c9234c4f348de55abe4633f1ffd9fe1b55b59599d2f0eadef785cb0d419779b2e652d1ed6bdef3a9d57e2f4b98672ad88a3583a936e38580fc2dcd0ef8311f79ebf607c8d611d9554674dad6c27e3c05d8d318a1ce1f73188d9d327b10fce1a709c2368b6e1049d0bed51e2913dbc2de7d348a777449a5256cd1158d40ffbdbacd222073591f572df5f1ef1239254b17e50f0b7b0e88fef73a091f732733cc95d69d319241a70422e1a6525239ec872f0bf670b7337f5f785c8efad9636a666cc0046902eae8eb0e95d6e40f2c023d5a405726a77d1a7ad3ee9d6344ab4b48c2bd441c1b83410bcbf7da3a89fe3a26bdb079c9199a4067c9616c411af9cd97309b7122ef1e1fc7590268bda4837bff7b4e4d9a403b0cf78bd09ea63d5ae74df5954ea57d6d403cde7415d33cf365f921354f7243645b9de900480f177f983df3e6949b79668679552d1870c5968ab79bf751b1337c6eae8089ba8262367c4867d8ebcbfc3dc470f673408da133b67ea51bb93ea11abccd5f9e7735312454f604c2a692578ad619e8ba324dc5e849a3c8ab93c8466f0ff22caf67bb8b03f743af0e5830747c67be40c9c28ea584d52f69a869dc0dc14516a9a2b679244b5b70c1f186443f3257b6d146be78958decf68aa1b9d2de88bc908746c2d65a31a02dfa4ce02af64e38a295d83ecc49834e2f22df173c107213cd41f95e3e0453a6d536599b52f11941ef547b181e6136390ea8e8d4824321dac7fe143211af79e4903846767ee2f2d6a78433fb2af5ae29c8c930d2f16616d569d7824dbec08bb7108e9c621d364af3dd3f56bc7afaa03ecc232c0371532dc033fdda996a5d51069875623798dc94b4273ce6192e3a60bedbb3c0c7f2d487656edde1a2cad5a8ff7d34b27dfc579c8de7448bd2621ee1e47ac6d82d6b8eb90576477c209541c4f6067e7a0aafc1ac90035032d82dafe55f29264b4863ca5ccfd383357acc6b9a4c69792b4e14e30aa08f03854509e9040e5b1fc12e42ac6fa66c32324352195138f0880d86dd83d12b0852c75b5249b91bc339a5ed86f98330d064e11b449be44439a0529b556b76ad7c3405388971cbb083eeadd1b07b67c9fc660e852260e7c6bb686a2c095cd023a630a5bcf38a51cc86ac7920d3adbaf9c99a44b61033fb25e53366c67f1856aa6bd5c574c1b55f43f0df311df44b9e567a0350bc32fd8699f1ec5d2fc03600a2dce51917278f94f71e429fa273662ab5fc250af96b6854d99075458e225c1cc0d2fd5435e2126fca7aa6ba7ebf8e1a74f628ef71b98487bc11d4a3810492a14f09a113e6d191630d1eb4d44ba4d8380844e851e4881f208d21176c3d91509148958c6b5187b140afe3a8ce1380ad66c40f17b1b82a876c7d71cccf2b04b588de6fda296e84a71bad0c228d08ddd778a89bf075ed3326795343d7e0c046479c779d8013d217e559709f2d51a02024be9d861ef1bb072e973c62274c02aa6b6a49502537e90913c0e17c504fd6e6a586209b0452e6fb48ba97ff8cb162aade0f0d8542de017ad79d37979ca42e03c8ae5bc556faf2510661216cd6338e474481656d039c04d48eab98a09f7ab2c479718bbb6624236832defbe44cc122f5c36c1a178c1245b09c7bbe06ac468f18b085fd9fe21ab917d72c92f31e4a5be48bd2490750084eb4ed06a9a9d07ec6bcb4e34a903f013e7f429f25f71451659edd2f975ad0de32e05ae3364bc0979a6aafcba2692a36c79ea44041ec40d0059d5cf73466e174610de40335c9ad48167a0f7512d97a2b6cb335ee992d83b639c01d9a8fb01a9cb9598629172829f8989f70a365bddbb97d44aa990c5947a9ac07e671eefe3c8682017850d75f460afda209e387084ad8e11ed5cac5ec3eea25bd24443ae1869b030d6f41a6ff573048a19f45c463c7d122ec16bd7e32631af79e16359464da9380e800373dd4e5e844a5634bfa129e015663540ddfd8b4da3c5b9ca7f01131e151dba39a208cc56adad9cc70182205ceb56b9046ace1e2d6a244d548cfac5aece3a0077990b9915d3778b7f2441380f9509fcd89f0af3dfe54d44d05a31198716265637d75b4c5088be49930b08333469253f64dc15ccb9b995e15433d0087eb869b9e8d4dedd2bde5d1bb4eecea9b20c740f8c190f076dfafea718a3667afd9d8d9e2b2ce668ff6d346685a307d44584684982ba84cc3e8a213e005922b7777c50d8d3720fcc5649d9219d065e98d212ed5e989d10f96a7aa5921a5ca3f362c30c89d805e81f96922686377e4bcc5435b82ca75f3587758440af27687a408a0b6a15625424a9ed21c1ef58c7162d7a703bf5e36c061111adfee4c099351537b5d2a355cf4be00cb17832a03893de4543931d1f6d3ebcef84ef61f5f609ff7fb9f85d2793a787df83604b88b2ff7c6ad2f6598abd4d39596271b930005e23f602d042e4fdfbcef9174fe0c2b061f35472db3e97f10ab09a1f4dc3565231b48d39e51e002e5cd644a08e18db7a3be901b6f52571dfea13e6c7cfe179b52f8ef6423e3919905bd5e04daf08827c9bd13f6e1488cd0a04cfcd850443d5389c4ba251a3c06365e48cdc1ea5c2af27d262eab393745d1592c211b8dac952a930c3a2e24707537033da6f8d6c2e8fb07f3b0b0e6caf8aea09c8a105a8b99c2575ad3a1a4d7667e7344c1e6bc1d247c65f8e9770fe0c7a9951b645167c9cd1604abce2fcfb9b30dc15cd9993d5ece2203dc7a0a8666ce3dfe87c2ac8a6fa67a684e012f0a9bcc5ff25cb334f4fa9a76ad3514ff5114664557a32bc55643851f21ef644b0992d4f28e533b3ca43f8758cb88ea7f989d96dd91b965ef639ba60f14b892ab6de99bfba5c437dee44a6b5c485be7cc82d4a8ca08bb0de5c7987122a566589bc661e62792fdfc168c0fcbdacee2add9789f2e5ebc0ae92d0a235ecc7873ce1b40bcd74d1c3b6d5598aa0ed5b5f5007e293e395f2c2921a6e7f446a836155e4cafd075b2f3cfc60ea07893ef8eb40b9d59309b0601e3df57c2909340ce8089e9ed2325deffa7b310cab43ece4e4d0d27c773c10075228ab59e7f8182965abd0dcb6b652050b2d365e7b1d05f649b19ce7b62f47ff95a31d052ad4ee397b2cca64e292c6cb37dacb1aeb0f547ef44c998b4b1d7980441e01b7446e164fc643aee74afe9a6c5a8e69a0a34f1829750167641f1749da69f44809109a2a4c5d0312929049f38f9929fb7191ad69eb2da3e357757973d86362bc6c9511a347ce88106bce57e35c4dfe9a33d5d76a1a6d7cb74766356456b7a15a66b7d2e483647cb594768c48402704e09206985cd644a3e61a51bdf1c1f451a55910932e37e1d11e7e3d60929d96a29f93c7c382870d29deaf4666f9c6498becb1dca7a0f03a63998377b82d587aead568928700b483b71483f53a2543c1eed3b9b4bafaf2d45e10ff99da3943aa77ee5c2e1a84a6f0578654ed576171308d00096ab25c93f244ba3104662f94298bcb6a7fc1bbd7f3bcac219b574146ef64bcf0cd1feac4b74bc276102781f62ca04eb2c6d085012e0d06a2c2412ab1be32698f304d73b0a533c64920d8b33530b65e16fce14b4d615f1bfb236fab226c9c90b9448490db19bfe5d529963885ff0938a175e112d72c6c4327cef3f44702cdd7f83ba63ddea8565b001d6a23fe51eef3471f828f5568faed064ab3e2390c86882b5a6ee8782f0ec6c37d98acf968e5bd613da46c36bbcf9f9f0707590a19c28a509b27a8bfbdfb730032a64bbba14471ebea2c398a506612b785922597ee76139034cee2ff3e74a4d1eeb471cdd7f43068bad806a26c8d86412362793c7823e1e500fc4495399b0011a6988eb76f3be8047a849951eb253ab9bc2767db88e5cad1100b1fe331b68968198a2e033211de0c804009f95c409a4e13210a30cf12d725bae62b6f6ca513b8e7d9ca8eb0cb9b646bb178847fbd01b44b4fe1e6b15b0ab7c2962874d5fdf70a455f03d2e4454163e89b20e6a1d8033870e1e177cc6d856457c3624dd76227bf6b5d4f0c2243dadbc11235dd58a95a272903af1ee6671b636d8f47e90bc36d5c6e070d9067e7d81d504f566d040c3f193aee5b48195fc5910ecc4926d1ebb121c2d451d3e99a2386a69104bb5c15171ddad5caf8e09d7a051b33c1db342cc4ec3d81e59ff6f19983a44ca609a48d86a053d635ea49fd90b0bbe55be786c28205cbdaee73e6ed957f8e93b8f2a9209555609d3346a1b044750221bf76b3d1c10504ab8aabb28c0aeb89fbacce4dbc40afc27e0b3b9e86a3913cbcc9bdd343045e0ce24e72c6f52b6852683fd9a61533e5994c107ca65a0d81d4ee5322c0f7168e4c2b32eba8a7fd783eec9ef68d7f20950595988bf1f857bbd3e184aca1ee2e7f5f71fd30a1075e59ef1103345a8835806dfc6a8a246dd79b7551c26a9b16a7628dc65ea8c930abfc7a7cf04f1e475664e1373cfe6ca0396d4c750d114081f22d33d7981eb536e60ed2d3ea5fa72cd046c5fb110fddfb14466f0d8c35b2658eb69742505e7d1d4161f1d4c1b9af6e373fc984baa35f81392bbfb56c201ae31e2b6fe2a22680802d51d9ef98e7ea830eefa07667879bc93921d4bf4f117fe0d328d1586ad150b58685eaaf61e704a2fc6ec854d19ac27a9d236d88a1fc310c23255187c88a5e2f7684a02098fa671d68a592e2096466c5b87191efc3163193123feeaaac57b4fbb7d78352b01f5ddf29563946a45c325c74c70e2af45167619af91d10088f0699695decdea4b41d43be14e0b0fc95c150e122d56dcb90ced5efa1ec926bcb5eb55287c855f215bf7dd0159a7cfffab8b8f897ecef49764928f3792c5e100c8a3fa3044361276a2b987f57624a509b2a119c12a678d25791101d182af43f1d44749055116496fd0ad78598cfd78bb185d0a5b02fa302f3559a5f952b9ca6e639da088792470e04ce9d76c431d94f0633b7c9893c3a72e01289b8a7573e60cec814bd2e2a553eb1728a9f629cc9324f93f7e440a11a39a437bf3ed1ed4ae684904cdc4fa3546e583adcd55d48a8d0ad228e4eca534dfa0cfe35dddc7b817f9a01d9da79ea45cc49915a2935d6226b7e0b99417c55e29c070eca6c394f3994026fdffe5382a05ef7e348dfa260c790b9549d5ee560c7a83c1ef7f413a46885df2a15f14d81d83d4fa51c709d5ddd62a34b6a8d531e04c48920e525e98875cf188e8c800876a3186d081472c3e3c5180eb3f8b1dfe1b2bd18f271262211601f7b0a7ed0620c5dfdfcb981ba7a33b8b10af6995bf36b19889b9938a460659e2454ab63e1e0d423ad0d984d4d3c0874aba21623d301d12f606fc3296c427dd4aa1bd6dce71c0f8b31b1c2be774382b8db3f518ffa883b97da0dadd6dfee0a647ffaf1e89515ca8a6adeee729e35a3a3b43cbd4826397b4b7b627e41ca18eede322eada538090e4b924104dfa67909d1a4d4941ac4448d911e21c6068c8d094fe3359bc8a26ed66962bf618c6c93f9177d5f93527789b89ba3d68a9e1b467d3616e26af40dcf7e8e71e6fd1b88aa1340ebea1c0e8ed4400f13904be8e90cb4af01bb7be6b8843da9f878948cd705f2db20ff131ed1cfa4695d6352b78a2d9bee47e45f19a30cbfeeb561853cbb0ccd307a5c95c9824001f9e74ca4cbe5ea9448f3ad32cba1087603c3627ec1c11ce2d2a8692240d650735dd67199fcf92bfac80b38d535d4c40063632bb63ce185a3c5aa992b7a28b761f0683010d3a3c058a07d8dfcdf7e9714c9c639cfb4de8a8ee7bf4efff8c5fa8ded4d8d5bf9e00efe6edc2ffc87b886a071b6e65465192361c76ef37897f7eeb2d13fc3ed6fb02bf2b9b7dc973d4a5239cef90bf5e60fbf5d6fe601963d3d39fc92451d5fccfe61d8873bb2ec8e386d2752f7d3d64f3f01b90f6a8b13ec9fdef7842f7d7efeabb2e6dc7a2279860fb434b71fb32eb73f0f199ed35e4832a03f1409b38eb0b76df9f885aa7d741f777b24feac604b4dee56aa9412461c5784182c78129ade4459596463f7f53eac7e8eb8b15c2747a3dd1a848c6a5ce7974a54d6ded7b739ada83925ab0a1c7cf2cd2a1871513c77fc80f8ac1c8b12ee425bbbeaad522e8670902a42a597f04db17ce3394e0a1423ec869dc9de9f790da539d84cdf51c4b98c5803a02c6141d1b42c2fd896e4cdc9b9fc2854f5d67da69304f70bc3c4dbafa5354a0b896c60de031a0fceb8d8c1c2bebb7ebf1feb0d549dcaac1ed75ab7e4e6ca0842ba63a95fb17ec222dc836f37171981b6b15f6680a67bbead684b46ab654d35843f036b0a51c24a73d0ad34104b473c59cd7f6083cf94079024b5f18d50b9515dcfb63b4440189659718bd1e288348ecc7df7d80a9e8f65a8611049fd9d8ce67e831283a524fa8893c9d0d907c05fb8ea777c015a1b707008dc17fd1c2646fe9e85df960eb1e8c00e6dec6603ad15190860e1f1cf1f61a332f2df442b7a48e59fb5914ac307fcccd938ab4eceafd708bf0fde6d8017ac1d2e00cdc3c240978173f357d0f80847edc43d1498c1368e8251fe4ad885606a0078415e17dd3dd3ffd23d1385c5a02fea1688941bd1dd7e547001ae785bed2b7d02b117b4b665ce3306a37af2017009b41e56ea7b23e8a7c0f8ec0766a690f0d8dfb105156ef8042413af70ae21d1e75bbc6cf8df1017a144d736241c745774935344ee98b7c964c2e522ef4d2f71f7560704a505b14fb90e5b1fabe63b43a17c3c242dd49c46135d9cc8e1e118d401b64410fdb89d04b851870846e68db8351733ae52d52bac06fdb52efc13c8ff37187a755dabfc3018f6efc4fa1fd06aaf544f0f2333083af3dc6f335a957824187d3988ba57e605e43f68deca71724add64be8cfb852099ef7382343ffc9fd367e881f3b0aaf60f7c4d7d5c7b38f687be5027a7d675b827e4aab8856986bf77858fb039a83dc9cc4b10d281a01b026aa81cfd5ba674039c9cc6301ea3a7f32a4f28bfb059bc530d5ffaf4192a0a9eb0fd1137380a195ee1f3ffe308843862a6bf97e4a071f00791d7e7ad63f83ec2b22e3ddf41437fe96f1f32068481d3108e6b47849641eb7dc8e969a596fa374e1919517129d9d0d6d78056508c39e0df6b9eeb2982c2d98033193aeea3ebb47d7ca0663caddb4dcbd63fa8f6fe4e64427bf2ffdafdf4b89bc2625f4e9fb31e01e894321a337e3cd977aa1dc8fc5fe3fba2d504dff188d77e898ab92cf566377ff837fb106b8bf986c903053ec44f263acd65661423d30c33821061f32e594110ff80588f33315b06f6bb1893c25fc0a031cd0cbd3370f532c5572e06dd70ce7f3e9a1f0595c6ec10f5de3b2de433dd9c99e5cf1c6ee3762f30dca011f14be2629f56322724fb5f885e3785914a1bcbd017bef734471916ea0fc99cf8fe21fd6120ba7fcc1466ed1d7d570ae0e4e5dbc7602331de15d9ecdc821d65d79da065a8744cd47f37eec88287f9a1f3e8db1fcc7c88913afafdc66298b6f126fd1bee2fc3b0735baaaba2a324d607ba179b396e830e238d8d884e8d7bc018e1d731170dd447bca53a2b5a7bbaa8fbcee62bfaac97eaa96156d67395cd5140e54c2d2a2af27a7e2441758528d65e5ec7de319fcdab11ed2500de72962e81ea3d297683045dfcd54856393162bd9fd2a25313003e10d822011f3d30df0994a752c692c6233f60b2c8b3c0529bfcc878685bdfd1aeb6028971a0b16b86dfd40f6f34943cb19d1230e2ee8be4b346748377b4dab8de3a2456c22e06e0c0c72a54207fb0896fd02538d305e53d20b0ec8b7c8d506cfbace3c43a778f9e60b076ee3f6769cb070ddb077bce84044b24d69a8bdfd91738f48b62d1cdac43f20f7f56ec55794515eed0367dbac7d45f2afb47c04491455d41c5be1b78c410bdf11d4ad2a53b4c854f9b111babb072697727aa0ce0fb907f1d500f8436b57fae4511fb63eb9f84bb327cbdc939476cc577c11e6b4fb6c02f5c122e541003e2feef34b763424b3f66b9600dccd931e38d2475b0edb929f1288515b644abc3327e2136944d835814498caf7553c3f724d4c102922a772db3536562766d0b06b8453ad78d139d426ea5f882d11d24bdd728e1432ed77c77f3fd55b740c29187dd6f2a12d94a1a9f096f5cdbd00d754f24a23efa621338ff70c9aca84e4c8673e6c20c630d3e315c223fdf15ec03d1968a67b7593d1fd6676c5b586a40352270eef173badbc307a6be314255c84414134650469a960f0978dd09b711ad5d1dfedadfe916503e9c7d2b31b170012a7192916e54d541ac5ca57a4571c5aecdb0894084d0b95fd4673c630f7b5d55681174526928b8a9159fecd90c6d8e50c5f2285c1a10de52e5a3b8d273e075bdf8eeaceb75da6ad8120a90e252d9880271d9b61469d08c8fa02b4ce64a3379c1bbfe1fba817488ae9373e425e0f1974a9147efa9ead2d4105662eda3737edea4c9a63d17a8e567aac50897a0ecd72906c28dfc2e41a5df5dd61c17d7f6a60604fad402c8cab492d26f551585c095ce39c17e0fc598a3140f34aaeb6e486b2ac5d458a2f1cd1c54b503d34623dee4b93c9dc02fcfbab72f621cb0e90256ad537da4a4afdb38ef218922723d1551b8bd581027ac79c5578695975b096d0200d48b0ff1aa6548badd57fadbc6b60648a4f8f4ac2699d98343e7dd3d0632c2a0cf7a6b3813a0e21e8eccab9cda6a91dc71c3c42f3c2f564d9a998b107b93211ba01ef7abe7bd8e991bb15daa16745427db628ce4cb393599bde748c1731260609985c0e1b3dfa512a42f051a7510dc3e26a387ecdf236569ea6cb1b469a72336489fa5e9576c3d93fbb9d7e4b44216865aa75afd9c27c3fa497910acb90d1e36d3e958fad04fc2a4f33e25148ae183579c210fa8bed9aed5661943f52dbb362e25b036aee90ea2a23918228e466e645d878670c81e4b1f2669c1cacb0585afb9db3b64b7ca2f948a48d8204fbfdb2994e1e87a7d2a8a7bc49e553f844b86cefb2a414972f2a95b6b7dd650b18298de4122a258414464a5df39e162e4cd4d4de5aa5340605813ebe403367d7f157a93793f595f53aca8e2a4d7ee4074012a02cb5323a417d8eeb494eb0cc17033de1d08d65c4a4f9ddde4cbf28698699cc94163a910f1de124935da8a45019f05898fd4fc183863573b1f0d67572e29f8b97d6f2472f8b711b7cf173ad7f50d3a810e506a2ff93e270281a5ef40dde744ca6ca4b71e811c76d801457935455bdcd5f855c3d29d2a7d3b9d78b5c48b88df16362af28d795643c440b4be67229f7ba80c4bb4881cd168195b3a196bf2e5531c60d60dc6793fcf3866d691cf8cae131be330ac3c01830c027ccb88d1527d6425fc37f48b27e8afc958e277c4113910103c7d274b61f22b4a04f7b0c975385979fb794c20dc9b2ca5f8cd90be81aafc8448fe77ab128f429740b51918408ce4b4f3c05423e52a0347bf44ef670812a7a9c1a9bb93ad9854f1a5af49d0bff294229004042f513808a35fdc15d07533ec9f551ab32623d2dbfbe12029110a141e179e4d2efbbbd6e4212fa114b78ee6ad47d68534d195204d625040354bcfc573e98073d8bdf549a6d3485c382716bcfe1ac369898258ab299ab2c1d1ec2f3d79482903038841b46663e68ca4d6a4789f0ba25598530bdafd0783c2bbcff336a54a995f8f67d092546acc1150fcdc49b036bda364c1042cd0a88a19b9aa890001178a8b63edc7b773707e26ffca4bebd34c8cde6362a4afdf31eefb46bd79db3f49ade0b7a5a9e134ec2c5d0104d3848607b04818f2d42c7f07749c4d571d550c5023442af41bbb78512eab19f8f7674a126fd20467509033cd228564d178596f90d0c55260a20e153a6f5c6da7e1cdcdbc5a192200bfb1715311b7ce8f379c802673459710d3d2682b1ace45be05d605fed6552f7f77a6de7f6eeab7da6e7ce8f78a69d67a3fc478bfe9d7fece3df9f8a13e95e0cd73cbd49b3e371230cde67bf52a34799f978baf0b5ab12e5ffe67c2f027a8cb8d59e610e749a61eafd76f165cfc1649ef71f48647b7061e1669de833b89d8b5cf95e3384ec121a1b741b13b7430ed13e5307ac34fa1fdde82ed4f34bb3164292f40a57dba8d8a34fb76816e746a2c1b85197dc3081273fa7d23c6d296ab2218b76353f59388064cca506d4d95e486ebadab684e182f53a84d851e0facac28a7863c485c039e862ef22a152e74c17b250a9a10db26196755c0938a193ffbcc80e62d93468ea1998481dc5062a3d89ec69a2ebd7e3cc9d739145bad5a421896eb7db228eba4d5869885a212a382dec9184fb2bb12f43d4a175414e6eaf22f5c77ddb3488e539a920284462ead356142bcf3041cddcbeb22cf6a8f9c5261f769f22b5cee8f77b3a0580b44a8f0a72ffdf1251abc5ed4926ffc98851e150de81ff441238c21a8bae46611d933c3fbb94fc198502fc0d639b45bb04137fee531b1cf9ea4898b52fe3ac9f0ef9004831cd34490ba5b957070f302c8fcb117076f67ae27d846de2ebf9bd1ac7aba319d39f3b362c774a666225f58652f7dbede7de62e5d5d0858dbd5c90be6aa5dda51889584019af8a9ffdf3023f686ce85acf977a6e2cae426bfbc516c432f6cfe1bcaae638808e992e1bb47b3fcab9b00c75a8173c74f589730f38f4d6087b5440f413f12ca5612e095125ac4b300e424008c16f6fe99898d129bf596bd25b17060ffb061b3b00d5c43454bb21f063c7b03d062cbcd6be4ea4a86b8deab28c7bfeb87be73c8a8959890216864a6e34a58ee9ce02d5999ffc9decef9cfffefba7afaf3d92b490efd4a83c3483591a2748b66228cbdd1e7420fd46f1d26b0d8dbd83601e15a5d76087b89fddd684d211da4fc42a611ddac22dcb3cf6d6fea51dfc20f0cd3c3eba248ea9967fd84c248ef6b434b16e0b50447329e1ed4ad799b1a0e1e89dd434cecae57d6949670520c67c9398ec2220a77efa2e1893420bfd9afb9d50b2d8e5173236941285a45670292538054ee4fdc9effbad56206d54a78ff9d12916ea0f1a44f8169e209a0a3ee0fa71fa1153ab5ac683770a1d48e59da4ff59a8feb9c364f7a99d25aa57cbfa45b76a010cede3ec6219965f0550bc1443f8c6010a8298339343a0da30712d740cbc81d24fd937674451a1993bbd75aea251f0b43e76a4333aff96ac2b34df28ec2a9fcba1d5a87884ee61645558b3074812f4f53b0884ec568f5d8517cd01cade1e903f784c6e78869bce9e2093253f6407452ec3ecd9657efd68191d648124c2392f0597022c91ff866a946a2a1fe2cf37d61b99ec177a85efc6cda315b1b3050bd70186123a8d1695e5d927ac39733d84024910da51c09a72aaf082471980db826fa885d6aafad98aa269a65cab6b0b2f992940c0fc6fc1fb6ba1e1d79ca2bb15c0580bff044d6076722dcf7f8cf5fba79411e6319ac2686fa8d19298074af70b8bf8a241076ce88b093cdc27699b66127a3031be25b6d82f0543a5006033d02d5678a3870635f651351448ad649e90092cbbca12fa80262b42a9c2903454e30d56a1aa586d20f2494347a5738cbb5aecca0d6b226a7be8a595337738b70ffbf523f47c815732b0c02682e417c3bd3f3d5984cc04daee30c98b5d497234c12f598c79040054874b3ea8e01d91b50080a498c2025cb49d590dd207a6ccc7fe26321814095f28518458d7016925b4b39413882ea1fb1b2580e58fa7e69bd549e1b0a1648440ede71cca2d68f0fba44283f498c3c5acbbd885a187888050677f87728a62493270134ee7ab158ea1da10e82f243908e25e8908885a2746b8e448d3a02c9c3d0026f36780c81cf052efd83b1c9ffff815fad11688a308ce38e52c632eb9e4cb59c26e22e8a01d8cba3148c1f7af3ba17597cd95a3c9b78865fdff3ad553d340782be52f929d83f6f4d6044ae82731e51ddc9ef43bab1e4ae9a22bdae4e98c7bd3de47efaf2dfb54719408e404da99e5c834b5f3b8183fa553fefccb5f2bfaca3a4e5338a7810b4fc1d0f97a13403c7599a607bc7bd121beb627c83fd37283487df756ea7d38b8db9fe57ba7f9ebcc6cab3ecc7d70127a0f0e80a111b4309ee7a6118085cd548e8b797bfe2c4570a9ebdbfc2c44cc8852f45d3f7a7e6778b553f42a24c6c299b5fd959a111cb9c97b73c23a13dd7e22b980c645e40cdbe23d0ed56dbc18b95d03ae0e698162182c9f6ba881a4849681c3ada9fb6c906e7eecfa39e3d43780852e42121622f84235255fb3f7db690db4c3d1fb8d86e8b8c4eed38e05864fac37d926c0a29c4aaee6f316e37bdedaf8eb1fd3d957b9d0a24197a3539bc9bc76bb314bcff9e84db94bfded0c195e28254e6042e6a563e8bd12793134a919d48d012fce325c9ba590aaef758e70bd43757a60dc65a6a9138987008bc14718be687ba42bdb10654a00bc4a644f65e00a61238e892a70ee5d56d89b1345789a6f7e5000c82e5f9763385e62e1cb0864e1a2e89a7be3073adf92c4e8854a1b336c8c5414a768f3ab4a9eba29eeaefc1f221ef954297e597ba3615d3e3792a332ac892a0899fb259039fba984484cd435c1d8bb01d4bd3e63581dc277440eb28be7f1966315312ed1500e9b07a39ba5e6ad63ffc146f1fcda7aecb8645d2a29a7a4128243041bc1bef1618de2f9746160f47c28f6852e466e2558ec0f27607e9ace220347b6ee85d443c8865c1c782c88f2cee8556f6d37b7a1de249d3a3c52ad60b4c7fc83fb3124a6c7da2a1ecc2e9a1f0a17a5568287e0404c60c9b108cb381325606fc88043352579b5e3c11e84478e8ee72d9cd989e4ff6e3aa1234f7d01b6cdc03fc7c7e1ce17bee16878301c8d2de0f64de9bedddfa953e85570aabc00df6c5e8844c4ae92b82b2001c16a60d582f960e73514e19a1d7d97fb1cc82ebeb0acac2c1960c8144a571076c28caaed6cbf89f803a96254ee3588fb6c5169025046de87a04460be98b2f22da176a460464229239549091ff904654dac96fee466eccb16247b4bf75b0e4fd1feac1a67548d055705e75f82921562f76c5d3fe9823c76702c33a8b0dde91b4e9de9541882b6dccb1d4bc1fc8bca7d7bbf5e930f94caca5a7d455be1ff3a05b3d3b61d6c5736b9ee8451623d443bf977f558f425bd6b9ffd58cabef15e5f6e491df483d4e1fa493d5415ddfe79e1de7b0a0030038ce77a30822d93ff8605625319f6d363f81d237836a2ea2eef526c53c92d7a43100f0184195fe42e0636c0d9e7dcba9f69d905094cf23510a63003a30d874f7aa670566d89ecfadfd4622987d5e4ba5223828cbb662ec7c2fbc881f427c354261d028688879378dd18a404fd82784e63b983968f3a8af2d76ac10c66f8c8cf336bcb4292ae1bcf565d0ac5760f324bf0a78084515c034b32c8d71fa53f670d0cd479c43f16aabce9febb19edab9b60eed8de41cd5989a2ffbb5bbf1e32936f805e0e3845abeadb68c05ab6b8205c860b73f76572c45da3cccf247d89249ba60d3c72cde0ab3ff9ee1b025b3948adbc6e02179905eb6365be80ee3954ef3a69bdebee464ad0f1a49584dbc88c496ce703b18436259bee9eeba3596a13ffbdc222103788ab1d322749016a8879f4840f52841f018f87f09efa5dcecd0e34932d73fb92ba4b9580261d82c63eca0c56b0f1a6d25d01b70f661fc0f7d7ddc84f14d0addddb46d8cda3aaf5c2a47152135280cdc9bc45dcaccd52714e209f848bf84d1a43c37b8fdf9f834334f65e4ffd1f6f18bd3a0479d008bd179c9ef18c8baca0a2dd1e4d79d85858304dd3b61aa7d5a69b3910780cb355f8d01f33e13f4335a95a21a6729857bf1b2397d9e2ad270739354cf8c06a3137d6fb74b872ec25ed45534881cd5818e044ebf5b540210913abd90a0b29c28b69d1856f01e01eaea889ac3f67e058ea8d83d5395e3ca98a89da33eec58ef9ae016956c3c913a647632e87bc54810966d85442c0050325cc681b9122a2fc5b842860491fec9eb277a0dd3ad7958d2ecf91bca76bc0374bea8a1caef412040258e846f2ae86aae6edf2c96c7f6df29b9bbf1fe39249cc791304b4b8a886adcf68af96bf853c6df5a1c3d48289ea36041113896880178dcfaf39f10422de08a79af3272a95621dbe26231e5e5e9101d632291231d127fcc4481f6238640038bd525ba5dc0e18b57661569bee11712711cd0bc4a70394f55207e7464c7caad5888e680baffcb2810c7d1e95314e322b2dea7e024132565c788b293162ed4b586cf327b7c1f3684161d21186f0e3b87f160517884e9f2c9340a8f485ffef92129024c15cfc82226102e74560bd567fe2559b679526acf95f6b8a75a0601b81a91dc6382f59f912bb40211609d5d8cc201b177e7695dd2a8b5bc5fa7c19cd92c024107dce6a004d031f217d68d86fe4685c850abc2fd0f34a6b6bcc654317b0b125be78b863494ddbf6519b245f927a4673869f7213c1458717c6fda6b884862e74b6523de7af15634197513fa2b4706da848ab6bf8280de1fcf7dca7d7b127075bea38de190a33d7812ad6bb09f05dd500f75fa9a1d3eb76a31262f690d359d82e437d4b752c4c904872144c847f0c7cec02ceef18bbcffea4f7b79a966c6b566bd0d5278d48ba69a2e8e286422d8df8647a78755e743e06bbc19cec962033237b3134de52fbdb470be8c6f2de7fbcb0619fd679b4cffd9c6f830bf0f2fbe19fbedf0d8f9ce85187fe26d90b3af33de3c6b7d269c1a6b474088596834cedd819c29566442d925481809a5c6b4177062179634d4c22ae52cf659f28ce0b52d79ead2b242e74c2d7e4e30ed7839639a4222cd41b90e166592ca0659449e6a6634cdd459b24487757dd2c21c77f6df3ec3bf3ec2e2d387b0f9f7115e3e834e4b58fb3143e564a689acb3926e42062ad3d4a4e6b0a455dd81427059aeb8977ce9f16e3f1b51cca924d96924abacd385d081cc1435d724ac695957a0094ad3d1b2ab3ee3d0bace40117453a2998db18a357bca834bb394230b9b63192b760725a0399956ba348d452cd889640fe592d9a7794a91810db18c25bb831c109c4c539ac94ad6e92454a033859a6b0c2b5ad725d004d954b4540293ccf7109555739550b61be7fe4f4eba0919a84c53939ac3925675070a4137194d6c8e9558b333a880e69434a791acb24e17424750e3bc1aae00be0f86ccf0699a5264b349ac63c9ba5aa0074dcd764f39ded9f7248184fbc73575917b750977d619b7d44d6eaa8722a0a8ad3148bbdcdf5cafebdcab4bb8b3ceb8a56e7253dde1ca2a742c21ee650c6ecc1c6e9299b89629b83393887f64ade69b7fd83bc9e214912771c7ffc63f1eafe0086b5bc28f082e5ec50dff10d7e8bc8fdbfd092eb178074f585b126e05b0b615f7fe437ca3f33aeefb27e147a3e5a5f873c6c4fbb8ed5ff089897770cb7fe10743dee166c6ecd51490eddb390e4ace73c4fc1f6b8b8cf9827d49277cf18a93cdd959fde0010f925ded112bd606cf3044294d4948489649e5bb3486bd5ab11fa6877828302ed88ef0f3ea1012a9c89bf504ec3ac41e20554768931d9f4d430457f5ee328c897c4a044650281a3c60d1a0effd447f59460569a605c6fde96aa58ba462391e6281c55872fa8c1e5ea89deb10c3b21e8a41a09d52a1cb95c9bbc2b30fef0a0cde320669cee13566186bed2ec1385ac7208d6cdfebe27d0fee09dfa9e73bd6594a84a343f41b6369736d6285a7da9cb5c97bd1a77b56ddfeea0293658c6a7ab8a822d0d928237b5376fcb37fbec6101e2be50f2ce0dc4e9a390a62ec6793e8a3ddb5a52f6a04e5a24611d3526c86af495d23553a16564e4c47e0896825eff448b00616d7d47323d4cd928b92ca942754a2e3fa3e0025dc855e2cf29b51aba72f549d44c1f737bb9c2c5594a073c1673a9dc41777b3bea2e5b7e01f8cffc4dc2344dd65b5ee655a95a741f750c53c74b722e582528b03d3637f78f320a84c0eea6dfabc1b095776570d3546aa9f695138ee05aaac3ef8427320ea2d225e279fd407b68ba4e017de3b4957a877b1080c2f051a1c6ba5551048cb481dc419bc348900023f1a70d2ce4fdf84b8eb9df6510e60c22b079c4043120119812f49dc52926d915c2b2169114b646ed29e0609211eccead0076a416c002b2fa01770a7fa0615ac3aaa63748516f17f0adb09130a980a3838aeca18bc5dd77954a53e9a51be0a3df0aebace697fbfda8fe68b65ccbacddefdcf601da65de797beb5423e9a2f5d12d2757eed2c530fbcf9ffcc5b2bd4986cf0458d243576d4f8d11da57ddc9ae961c6872e70edd264ac65ecb3df0c2b8d308d6fbcb75b9155cc26b355893443a58b31a7f3a75599fb99e50db65579976c55da23a4afb6a85a6aab12098d1b62d2194d74b7b3a60b86c12a366798babdd9ea9756b42a9192eec3eeed06fbf0bdddcca042c50c0194e18332c69421a68c31baa3cfac4b57e1f06dfed9ec3ebf024ae424d10f61cf6bcd6a7f6cd17b20d2acf6a7525b43a544d622fdb5b224a5f740a42246943c8c2fd1bf50cefdbf507873ad94087bb652229c2dcad67befa3f7655f53de2532fb2db942352c3dfae3ca9268a88665139c9344951261fc9277c9d1e37fa1cfe10fbd4747f86d32fac2e13b9917dba39cfba29cfba2f09de0fc4993626c33d89add274a193fce0edd3fb22f2cef926cbd24fc7368ca6f72add03c4ac2e13bc9b92fc24119cb218cbf7e964393063d96b5a30c1acdbfd1bf59223bab2e9b4c5e5aa593ca3e4868565d299b31a234be343dc2bcd336627889a1274615e3bb6f6ee8cdf5fde6c669955aa14fe9055e3aea2cc16c86e52c4d01d304992e3bc4a0bd048004448aa040aed140fb73fbecca9f245bf993e623e54fba7d76c5f09dc4f06dd70a11a28ab7cfb7cfaed8c2dfbf13bf471eebf44be7579cc5940747acb2455569be4d6687f287def7dd3ebb3c9974abfc921e83eefaa4ee3d5ca64386b8cfac0bc98f85e0a77456892b4539ee1ebcb9f3786d4c4d95272b8d6294b31c83f2e806e247aad62659fb82b1f0537ce34cdaa4200d13001105036cd077809d04e80691d66b2608d513021d700446741b33ad0292259e4075d37ce145172a480117345b74d3a0a09b468b6e9a2c684e1047b5b30faa61d9048661f6fe1518be478ac49c556cce07fae8eba32fdc17b93efa8a2f843ffa8a1fcd9686b3f3a3af88ef7f1fcdbef4b42693f53f2b3f5ca9a4b53cca2c27bef199f7387bb1f7bf5dcad670ae4275f39344f8a32fffe86b562a44530023badba34cb24799cc479af4e768d21f2c148045cda4b14963b02b76982efa933dca247b9489962068a2e0497f729228d664927a3497feb119efe370a6b59fb53cdad9ec2988f112ae56a852a248672beb37f9615b338dc63e866996f28abd334cbdb791c6eced66675428769dad46422e2197f8c8eb0fe524518cb7af9428563b9b579542799486278d75391daed6c3980a7761ecda8c3f0fbdc7577ed867f6976492c7db673af384132350a17193fe5cfae596645bf4f466d86799edfdb2bdfdf43cfbc13e10663328619e857d36cb608fedfd037cf46fb5b7cf343f9616e67d1f8865f47eb0fc2118bb59fc38f9d10cfb8bfb0afb68fe6886658fd29e1863bee7655b675eb0712237be11e360ef8fc49cd50d4bdc8a0600432278234b1a5d9233b11fb8af3d941450a7a8544a7c94782a37292acf7e88c5ba4679f643eeee754a023c3729cc0727c0a287133a28f199bdd7c3014a7a9c086c7ad64b05783c691f61643c651713f9f06841135dfaa7ad364de41e22a0e32b25f169f38148691b1080b9e1e5026a1db580bcc7739336089e0d088874cb1b0e1675b4f083046614e008160d267cd122c7e647005f0837365b70c084b0e504590a5bba1b8709299070d1dd3925a460730c2055595c701b264ac0305aa5b78ba6b100cd966e1a22ba692ad0365e9eb0f1d28566886e1a217ed050a0bb939e38f9e40df67f73ec9344fff7f533dfc6cb0f9a0948404b10516880c8d29386668a8d07c8687ce377cbc9dbcdc603583acaa4cc03f3fe9267f1916e1b0ff858628d25ccb0b7bf36cb2a78b3ab70ae7f731a5fc2a73d4fcaf08d5dc2609b2e46d41061d3c547171edd3518982140960b588002361d38e24193a569f5d2257abf9f1fbe6dca58b6d5d2283163eae59957ad27417bffcaaadafa184bcf28ff0d53fe244182eeeed136493c914406922022891cba553e74f4721f7af272157695d2276f3e7fda6e9a1fba697ce8a6e981c70e56a620510211708056e5e5d1f11586f114a1cd87cdef217600432e3cd02aad34276f2e7f89cef8e89623061b24b2c81fd84356c59cd4d0028d378de7d96c4cba6964d348a16e9a8ea6a3194233e48e3b66ea98a923d2c0984b4bf3a4774b867e5a4d805a4b908a94b098a167ae68a1674a3053848117bef131b06383012246f4002f790a158d80626344ca8801747b9e04a2c99beb3d2a976455f23c095495b22dc22e4f0281718110ba3d49b34f4fb3c0025eb28d05ac74871ead66d95f1a14e463b3050536450c4002a12e79fe937830c5f773efb323f452eab1d9d2753b2be64be6d36832f648f7eb7ea8f32ca15099ff4ecf7e2aec2e7894e577954e11558e8e5feb39ee954a8cd155465c55c4553a523ac73b478a449dd0cbe5e4142982e9928d5d70becce7774790384dc63c2f85ca4f63b1304dfeac1ccb661da6c9d80a77f73fef6bb6ae4be938919cbcc5146c885341b912254e45c789b84d4a8755f865f4e6bfd9a7b9ccb79b95fd7579b514c85df06871b95a8bc32ae5833c5d94165152e7337bffa3defdafca5c65be5f6e89bbe091266319fcfad96796055bd1db6398df57cda75e71a6f826674c93d42b8d5641b779ba3068e9954b8f1dc3e2cc7b8fca8c3b9afce96832469331a79e57fad3d616ce49222966b2348bf58a81b8a6052e4d0071c40608158008a1fb87357e28e3872b9c855fe52c95b3f04c1126f460b32442f704faa186279512c5ae739bbd028e8b704e12e516ce0ee57e5617bec92b8f28ac064c0f45b8c70e363c84a184fba2595d93c6aa92cd606bd29f1a356c32571750c436991dca49a218b1e3ccfa5f52fce8ebfe0cf2585f56a98dde9c52c96b515e2d0dfa4993622871d7ca68fede869dfefc5969cc257e3a6325ced4c7424984729f955f9f954b998a27e6d743cfe3a4313086278da9306ad298e39b9c7bdcf288dd7966754c3df0b63c1e4df993946d912d9af68856e9a43fd916dd97df24dba21e3c39393aee13c3ed630a9a7b1f533cadbee7c99aac7da030df8af3dc3e671eac4489cfacebc4af16e623063ea414c9968c295048531540492fbb5628683e4ed65ef36ff25ff3ff8218bb80b0007145cfc66e21bec91a715f73046de8367b9c2fa34b5caa0a72f9b5b90b65337b7f26a3332afb0f4fcfd6bc3ace0e29d5bf62af90bd7f004ab4642f0dc2b6a85ef0677aa085a204ca0844402a105298a94112e166670e9b8f88951e423e5cf727bfc62ac015dc2cf2c4be9ea8c8128bb50a4960135e0943c77110c98300c346038a40e3072c68f01044b541b865279834e90493725fe494e86e3bc1242c617682303b416c27886d722f2cdd17d809da092675c4b15902c35953fed03c66a15736d9d780b08cfd9d5958aef6ce6095c232f8d1d8a4b10a56f0b35d9a15fcfc6110c39e36c12a39992bbdd50bc696a82761dfbf0d276b19276b394676565d33a3991146ba5608e36ae9fd59959e26f1cce893447866942b7efc1403fd3dc232cba099d1acd449f8836b5836c1ffa13cb2b1d6edd259b541322664ab980bbafb15b127976e577aad385f56d0339551efcb2df1886f3878cabf1ff83689cb5582367806eddfe82be2c7587e61ac52da0eb1cbc91b8bd5e1ce67f3bd866593297f3c0f149af2c706d9972daa4a3c623550f090000f20a850d12828b589ca2b7cdb6781800089b406fa570b622c73ef3b3a0e8379cc347604c9ec2f52473149c1d2f8c6088038df558332e078d5ba4d37a0d1dd9efde48dc562b16ef0a1bbc3b7b13e4b0f577973f7096e40e1da283ef8f4ec105170ba6f368946abfc759e1c0cd66082e2a5bb3114af4d5088f4943f4d4f74e81e8a0003e2928d659ccfa7343dd8bca691297de9e6a1bb7fd4ecd0d77e4a44aaa5d8a3b61b58270cf6d59a5e4768495ce01b33786b05212347072963420729734337120bdd311060862071e4749038987490388ae8207184d141e2f0410721a342072103d441c8c43a0899b08390e1d241c8c0e0841d4e50e60520657c20c34577f78905091c7577cfac208709a94b371bdd3c4052f57c7af38f0d5658ca03e887470f8f1d1e383c5ae0d1c3061e4348613ad28126073caa697c230e903146471adfd83e42cf65cd50778d931a665e5034c50d13d11bbdfa51d3240662d8877fe65f7bef1213518d690807d350adbbdb5947aaeebd9965ac1e7a354c3f21b92664e66bf8a1060538eb6f569641eb2a9f954aba8469f78c0b78504dbc709171d5c01586fdfbb96a7ecfa4a08689104f7525b9869ce50ad2a48d2667b8ca95a8f09b9a2ca0490e98fafd0f66330ccbfbb6080826466c214573400b031020f4c5fd25a3d09b42551a87358a889f1e59729b91c85064f57364c97d566e6429dab01cf258adcf8f859eb13caa2e5bf4483533f0aed29323a69878a2e8eec7e050d1ec322c18acc8c89584b4e4098cb56488204c3c4033409a0ed30c3998173cfa015b70b48ed841d2d5b06cd2b9aa4a243afe8519e59df4bafa1bcd4f73339b42c5ffc20cebaecd3229d4d1e80cacbdbceb7c663d3a69d30c5cba632a7c1bcac39cbca96cf689abd2ac4a33ef936c110c06833d71721f6662195d0a7ef56f13c66306043128306104129c2146890148e8ee26a10914ec8c5087aaf66303b2813811471620345657c1e5fc280304c48d12ccd8c93b2fdb4ece4e096d4aa2834e12268915d9da0bbbb71b976e8cdf839992f81026c9dda624af243da624deddb0ff599210baedac5258994ea3c3f49b9064e179d24b7723d9d2f829121dbcee4672d4b09acc7e4876ba1b89b70c74846f83c9904577c3bc744faaa5730d93618a0c418d6132a01acb4042f791326d3a32e648982360ba1b049a235b1a85361df1da6d9ef2a77b660440aebdd787139311312623b51e130c5a4c4654353324311999b2d35d93a4bb064977cd901a196a33b12504a2bbe6484e4ebebf54adecfb3a10ae9874dec03762d8fd0f859a15e8fc2fe4e972f2f682f7782a276f2fe0584179f4658ee356ba2f3362ac718236e56409ab94535a2ff43c82d276d718e9ae2952b30202681c60abcd1a0659acf91567f4d3167552d65da3d35d9353b3020d269c283d2606b18c68648a44daffb332ec1566938f930f85860634ab15cc8c11868a0a26a0d04256c159a6339f71c244a4892e6284fa1a3338009165a6015f835313bbbbeb98d4c033dffb98f45a33249850748861425d81da407763eaff85d883504add5d429b502d136ac7934b30130a05d3cd0f6ec62ce9ae5975d7a84c37b91a22606682689a134c336e74175d9051230210244c3144c9d7621a23189248a1ba6b8644dbb5b3b6810986ee5ead5635a91d7f9cab5ae1948f849348dd3528a1992a6880e8aeb999b688c55a329b19d51f2c6b4add9dff8ec3e057de7cfe632c7576925c480db1751454d44262626ac1089bc9c3e8d6c00c2a7423a04d0ed44d5cb7cfaef7645509bb8432b64df21d3c985800405b9af464ba323d2a6a12667a41138da9b1a4cdb4615ac1d5b44a6158d2ee2f59cfb348b95ef08756a9490535babb67f4e8a9a4d1bfbfa4bae04fbc602c85fa2b3f7c14b1ff1205f151b4c9646c7efebee5319625cecfb628d779a3fe5ece8f3178c516cdb7d9a5478a8149f395804ca09da5d32a55455a7c57e56e3949e431e7bf791ae1b8acc7209757e93d8d4fef7fab188823c6a0f739ad3732398b81385219c5f247ca6287531e9555d0ca3c59cb56455b1eebcdcce538532131100bf186c082863b31b299e66c8b5ec816853619cd493130e85a21a4a934b11dca180c9a8fb3b32e71e52451adff592d8a14799c55aa92bcae73f993e2ce31add2d9cc76dd0d0a70f7f1e9915906b9ca553e3d3d375a4bfa5c89bb7b029cc5727f8f7e372bb3b5eb3ac7995610574b1f29cc7452d00afd25eab5be7f27b44ae50761dba6005c117f263118fbd05501f0e96e619bcc0eb9db6432cb20a41e21f868757748e7675b27fda9c940fba4522793fef43099806820aec29bdd6b62e8ae81a1bb7fd4bcd05de342778d90a7f73e36fd48c3f4434c37f1e79c248aa177a9b4510ff765fb6149636e3d70da5b4d8637e36237a31eca6aff71e7f829feeb441eefcd4c1db9ab1ce5d1654d76c14fc96375cd9f7549c69e87e9129df2e6821936c4d4800e1edd261e6faab181a9264b4fe08c3156b0032d32d0404031470a4c8ce916c8d1ad563830d8473ffaaaff199966b484d79a663ad34c4e77e70fdd3523c2aca09ddd6861f3e7fcd8ed592cd887733636ab343592a96d30750ddd5d73c95af2a62680a97fd8dc5183ee2cbfbf77c880ba03053bcab4b3e67dcb627df8654a76987ae98232d0ae6677a9d2d5ec2e09213da961d94408e9c9acffe5c79e2761303a96ba8215fc8109dd1736a78c81ffb0fc55603110c3e694b1fa3110c33205adc84147cfc7a00b06ebaef1ee1a166a56e8eea0dab291e34877c7db67174c8e0c0bc118f63c09837d36db94a1dddd3d58404607dd99e2ccd01ca9834c945e7a2f16a320ac200e3a6ce2e002840d1c62e048011c5c781873ef32818e0247149b37c6d8bce145775fa11856c359c3d94d33821ace6e9a1674370f1a30fab3d9bede4801cba1ee4ed9b80fbc9ca8b3cad1dbea671247a08bb638d2dd5fa957a91b5984a159018f14ca0d2c1550c2c68d26ce7a18cc0d1368957ef1af6ca34c1b61b8bd6d08c10adf066b0347168bd5060bed4a3c7c1becb3d9bfef41998edf835c0fbebbdb59e13bc9580ed9d7910dcb97cd608b8d31366c4051f36a69fda1f09de424910f8eecbb2b499756ab95151c9c9b95457a85de98cc15276b38e270382124331c41e22c6751e956ce7a59d491c103a5c47469cad5fd259b3d59ff734ffeede6674f36e95c7a3e458e20d1d1c1e97156b543808e907c88bf52e851ea819fe5ac9f69ec7e92a8a893429318fc2bab367cdb12a2169290db5cde689cefd8560cda5a845d46b3bc59f7d9cd6db6f869357c2753fe446c33fea84ccac775df0d8cb9ca2679ccf5b1771fcdb8eb3ae74911711e1fe244fc7f0643b912ff6886793ca98f6694cc93329812cfef05b2e658d65a37a875772833fe25ba74418cbb01aa5b0d31dd1dd5006352234babd175c720d74b8d02d8000536f8bae36ae63db66e031ad22813d3e09246678bd2d8498384ee1abca03b66fc93c57a4d178bf59a140d2bd028020d20344ae8e28c069cd1a4fb263fe31be954761ec6fe2f36430733aa98d113432fa9a8e8f3ecbd32ae28434b370dc6a08107688044031766d0c50c8e98419319b4c860838c1b9021c4adb34a79a3cd64182143003220a33b7615c459cf6bc94028063fe81203a518dcc480070cbec0e00a0ca674c72e7f52b53486de4dd6ce57f1bd4bd5f762fc9bac281fe244fc314b7ae0edda99981b88d932eb1864c6d0c018750c14b410c38a5183182fbc00062ff0d21df14f1cc69818861017d8e18211b800e602a216906941981674a005575ad0d3dd75b250de640dd358579562e881a10318303062981c84f1120601617aba3bce2cadd24a6fb95222167cc10213b0a0b6c3821f2f1bab5bb522be76b602225680c30a4e5f50f1c5952fba2f72ba6705595dbd600c96a5175478a14377ec028e2e9ee822d645933854a0c4ec3a0f63f86bf95a9f5915ac5240c7ac52958214c890821e5c8ce1820a131755b828c0166d6c91832db66c81650b225bc8ce579d12c79dafba148e2b8f187f55e2b2ce572ce944fc73222e9335cf37e9995679f31bce411b82b3cffb9acb0367df85f86bd9ad2c625a05673eb3d251d04201102da2d0226b21d3c294451d597c208b2759d49c004c77c7d0fb259cc398bd559c8dff379bbf0fcf5c33eb5dbe16e75d8797c47ce5b7ba3f3b410a587081851558502c6cae40e38a1eae306245195680b1225b81002b7e7477e4e1f9190dbd5ca3516f5639b35765894c5001135013d06002ef8eddfc2bdf9385b55502232588a18a31aa6041153854714345185460a142670a1a4ce1c4143e4c219b42680aefee88333ff7a95ac6d94b7bcf6619b4c4abc4602dbfac93996669bd18abc39fcc94ba32066f61959daf705f3b5fddce579dd792628a9b36492184149f143048f123768f71dff92a1a01918008cc1d603e00468299218a39a24041146114a88eab0378c6f6f318fcef91f3ac32b647cec23f2d51f6308d753ff826bcd91bfbf953fe6cfd60896716090a16406105144140f103858f66c58ece269db4f3afe5fc18cb59c10bce1cd3a0fb572abd557a9b128669e8d303c3f46fb2ee80d893372afbe9c957adef7da55e75cd87fd05bf6b9f10d3fd04982770e82cc312f704932748e858cbb8af2d27c2b49ce812e67c4ee951aec526277e447c932b6d89c0daacf23c1164114127829d10a4417b8f2ed12b65f83d09e4c362bd90e8809e040a4100be60f1654b47fcc5a6892f9ac02156fb8519d6ddafb6891540c00508bc74c77ac1f94ca0c104154cd4989031410213ed65092f4a5e927c208d0f68f9c0079078604cab5498e68f41f198315805b4a177f706b4a12b794c752c5606bbbf494c5561eebdd92f61fbb5fb3356c37f672ebde2e497e481214b9cb1c40596b86189205dbce8027639d279f2afdb7a1fcb9faef3997d7545d1debff2d11aae76fe2cfe0533385bc90e88a0036007541c0883035dbafb63b055942914be3435511c686103606c4089fe9f3ea361ac2a2951a6af28d17a43031dd000150d0809230908242193084006ecc88017549b32a083acfd05bfdb79540ae5bef355adf3d52ba793208dc66e12d3e9f3bddbf92ae20b7e5d18f358e990213163ebd9d69021ce6252e42a426a418917fce487b9c4c1e5082e52b81c718981cb09486cd11d59ab18e66432f749ceea609dafa2c73a8a298cc2b1eb280da5f7352c6b9efc6b67d585c40e1226f4116558dd1161aad1115f3e893b02cb6c1d71a46593ca28988401336618d0a11d031d064830c2099311b9eeba6b8196c4dc1bb113bb9fbf7cc2b7791e8ddd3f9a5616be932348409f77d223fb271790e2025cbabb94ce055edf4dae7fabf6d2a5d8ed316ec51e8a05e6b0c0062cd000a13659a0c723b6b30815148183a9889dee8ea197a3e1db6220063d0f193264487c1bdeb2c496275b86b6f46c4161cb08dd6d439b88a882082b2622a274f4bc1bde0cc6727d1abb1410caa873d94f2bd3f1554cfd12c595c5b214f6e10ee55d2a49c7575d95b2cebba4eea795012539110742194d2b23e2c7ac550133ba3b7a1e755281fc49157040a6b7bf6f93444b7c5e8f65edc3f8de252cd62b8336acc13e9a8730a3bb7b882fdd1d6d6b88af3b0e41430f4142377e1a0dc42d21c07816220bceaca09d499c10b58f662148c0996fa280151d3f9a294081ee6e1f97ab6a58d62630c50488304de0278044026848c0879b1b9f59a44abbae8bf597b494400b125a685a9e680940104f04d10501640a0208103e00c20820baee9066b686e4eeac95cf6c87e4441ce9a379fe95ade21092d26a6725f45272e93c1fcd3e5d75edcc57b1be4d667c63abf3e0befadf2c931f3cf003961f8e7ca0c387287ce0a28afe61eb01f52066043d2ca0075b0f4d786883071af000040f3c3cf0d8e14b775d90afdcbb944e902ba6ba6c6b18fb68065d915669b7fa68f66b69961964b9c294e5872c48225046048488404f0472202006021a80c01104801ea0830708f180dc035ed0a14c77f833bd506241beeab08a85a77ca45890af62a7b37a75917a38d3eea3af2af35c255375afce67b6eb522f9451e7acd057b2ced67095f6368a3ffad12057d77d20ad6159eb7c15f363ef64a5511ca40314930e26981c40c6015238408b036c1dbb178bf5ea3c097aec5e9d7bec96c48c1fc4b8c562bd3a49143f9a5755d6b06ce283fa68f6ac8df9e0994f0f6c7ab6015da84c9132c5a3cdda56038e7832c5612a53eedb09622953fc6baf06c4d0dd3e2c960fcdb1f4574f4fcefe789e9455068460c262069621b034e978bd550c6dfe5aced622e9b46901255840071640846901411d73727254393a4ec493b2cea1f82aa6507eb3b7eb72c0410e3030e570450e52e4f0c59483027208731082d3e32efc04f957235f455fc5940ecac8573e3dee4284c1c2b7d909a63adcd70ee5b996c1d674bd600ad0a2805a6d29c08454f6280de513871e74475c0b073034f6c2414b96d3438943cd16e1e009a0a39b4902b848008d558ab39e5b9b31f5982901347cb5a62b7774479f57cfcca88811f04a92e98a90e98a4d38453833852818e47ac8f5e44ce88ea99cbca1a848c12b9a8b5da7137f62597339fe3ac7d9a3b43a3df4268df14c1aabd4840b010e02381bae8437565de7333be94a4ed312104b499608005e017a31af62f628cd56e9ade1eca53da67e671ec154764186c274f304bace57b1abf4365b5d5ccdacdb1a8e564bf3f568ae14b472ff684c0b6fe9ee9609d3206bcb8483442aafcdb92ff2f161b15e3d336b7b72f6a767d6b258af6b80394c564670adcc4c565c307d68983e2e114b5a938138d5a13c530fbd6ae3f43c8aa357be4f2bb321a6379c307f55be124cd60a4b3bcada376d2dff4d16258dcebaae5aff9877e473bf47f64f303662b1eeb5f72e995557c6f6a392536452296224f7b39aea923beea0a9b2a68a88dfb5428d89c796377c10be0dd642cd1d4a4b92d400d15df3c38f0661e8dafbd3d6f8d05dd3c30e5e6c65ba25ee8b90b051f1c4649bb1d5335376305549e3892a5d5a70531559054a15a52a475568f09945b9a9ca0f13f582461163a62dd8ea59fbd5d430d558505b8195dfb54238578a69f227633a24677d5a6b6684636052f8d1179e19e17fa1fa776674ff0393aafcae15c26096d70ad95975cd02b10afacc118fe9e98158e2686de12fddd486bb8c2f99abc4fd3aaa4229e912c694ca149594291e5b7707532ff2fbc38a98eef82d2b56b0745bc9e9c6d40a09dd31ffed6693be32f10b135ddf97eef881b64c77fc9bc5368b68bb3e591ababbadc7a46a46fd124ff5ab4e6e6522a6556a8b3730b1bb69e9be4589d35d372f4c4789ab96b63c2f318fc86687ad4b77bc56565b29980a63d6b6d45502cdfe7e458c803e3e3e9e47633e3d30d80dacf4a32fd4d0a8fd5073d57e9c685bd0be8ef16fde7558ba2a762c56a5d403679947e2c752f68a5e77adc7229176518765eb32066747713c6fa6c40cca2c8607e3c33732679065c6a60859c812203b8a5385bdcffee73659c436c7f94b3c761e3f36b33e640828cbc9592d0c56e9adf321d1b152ec8cd817f914c786ba5b4e40da709249240c9d19dd0aba06743bf16b39e71a8de29ae4a924949187d54eb759e2d0c3f8c30a23a33baa42ef334c0758d7ed081083001f2a6c5031e244c501548ca880709a42c51423a604650c4ec7d2f3d31e3683c1baff507edfa11c5bdc4fd0dfdacb5791a8eb62a68ee3ccfa077a0dfbeb24650a293e48497280340e20e60058ba63175699aa602765561b4351e966b5b14e8ad2077673b66e98e30631372871bac1deb0a372168eaba1d410ca08e9069b28248852eb686b38e950ea800206142f1eb5b9cd2ea3352cbd2416eb0514fd890e9ec8e0c9104f983c01a234859255a2e1c5c6ab03afdaeb3f2976b453d54fcd28956a531dea97ecad73cf935ffd512c963c253520099624c209490d24213a7bb6aac0d47cd9b5286fb9bc6fc318365c4002363cc08604d87073b281c7f48c705fa472564a07657474e5c87674c4480d232e464418796d8b7c151fcb5c88a1f799568afb7a8b70d10aa7a21188a42092111960684888a125a7a11f273f383961c3c91627312721505183d7ddf1710d37a337cfb6e2fb9fe36a7f2af5d5575bc39e9337efbce54358d7c80e61e5bfe1cef3680dbfadf2ab0d61d662f9d5d0f1da2c9333294b723dd11d5d374dd4e86e277d6a72812651dcfef82aa670b514e52f17916b88c56a6599cc52962a42659abb89f86d762d9838c164034c8c60626322c4440421129c847c6867392b7c9b1773b5d22848bbf26775f92aa630c558a23cf452ab47422d096249cf92108272109446d0114114089205bd10040290088066402afc74f19325623b31c5adee7ff26b47ee3185f2bfd253b44a510e942a4219396bbaaf52a8228c3262dde8cb5771465d55a58ca7d6c9fbdd953815be56deff501efd985a55b47e68b14e34a841030db918daecf8bb1139cbd62b71ab866596f7bd9f451a086080384e06f0a2bb23954e26c56c2dd24feaf2a1f2be8f8f8f0fae96e2f91f88e55d5229cc47f64f7c70765298cfbc4aca9c947451f275b712a39e32dded3d61bae74bf76cf57c7dffb6ea53cf4e0f093c5cdc2ccf96ce8fa94cc9c99b94293c94a784ee8ee04d4d965bac2d5897d259a507b91cdfbc268db1765077b6582674f70c635a3370d19156e90c5c66f8669801b553a63b565a74dad9d9a911edd0b0e3dd3149991693248916ac94e48bf3948486a64bd5d6561215e2949f93b78f666cbf8be408121264104386214e3230408624477870440547b074a78c3e85a967bb1667248d93112f46964e466a30c2a373f29693b7979111124ca7969344119f8ad08a149d8ac4a0b3860e17295fcd54ad3772aa38e53020474999138e08706e3845701cbf07ded96a76dfca5ac6740ac524e203a2778a1f495849715a6d49e95cd00ae1292deef5d57ab5b39bf29b74b56c631e58eb4995864a081592eae644040d22491099272241447a9c8684b1be9ad56dc67578d29faec3f6fb4963d77a0e7f2ebd4306302675c40e29a0532ac829d5a82650b7136aa85340734a2020a0506256f7f91483173160200629a7184e80410630100183100c51062f2c717a819e5e18800b57b8705d4841081742721d23b61983acbf85a00d6bb8d847f387b3074e6ab3ad97d230665b48727239dc8c938fe15abc8a13b90a2cb880852a58c8e1c402664185130b21ac208315905881ae50e4a44299930a635410e2a482014e2af038a510c529052c93c67c858d7c15696c0524023911ff4101d9225fbd8a948c806041ae1f589416d18ce2e0dc6f347f96651464f44279ea076584fb4a8432024afda08cdcf3242b0534692b56c1ce278d5589420e28c8503889713ac18b13ae9c4e507242905301d028c00f0590a7020831010c139030a1869309dda99f1f6cc46d264aa11ca3dc71a655fa9eb5316ff9cabbb04a15add2e92aa992b44a63b5140fa088d3001230801f804e10344e415e700ad24310a5ee1ea14f41989c4a80a3041594a0815309b8127c4e25fc3865713a8de0a4c3c97512c134839309042713ccc46363039b246c8a4e36454e2490712241cb4fac208dfdf8ca5771e20c5a8bcb11488a28d6f26330dbef6b407c15511e4595c293c67eae5d79b77258b514c368d2d2669593c66a93c662fe389aabfedad9941d15c0152701e4208029027861041d9c465062040498fa34c2d0083f4e22e440042544304284a153087474a7a238113f72224e44b39e1371229451ea0865e4310acac8a3e749998ee7c9d4518ac869d6431911a18c5247ae4a619413392b7c2711678ac336e34c6f3e3db3525b085d8a42c062429f42e86208a8b645a7008411becd6f96a8f74e70005800401a27004cd1dd51fa0400d909003e27206b9c8050e004c4e7042484c6ff85299d94a7308892d19b20975f2b3f96547f84a71f379c7ee89c4088e3044218107c388110e50402cac719271f5dba5993fae79dabba99d1745d8bc293c2c2b7b158387c2791669b6387c3b775298c0adf96947b1f47f9b1e7a1ea635b3bf9e858ebd4434c0bf34f3db8749f7ae45ee8538f26ddddaf530f7ae251a61b9f787ce9eea6a0bde1c4034b6ec9fec9a9a6cca9a689534ded54f34204fa19cdf2963fe9447381eeb6a14f34359c66e838cdbc4089cef2874439eb0f8919bcd663759d0f8956362476b74e9f664e38351ba7fec0a96ba7ee4ebdc21d34b8838a076de8aa2cfbfcd3edcb3d8a551f9db922ce14cb1a823f77cc3b64b0238eeeaee0fd3c7365f9df5f3bc0d881a5630ae51fe8f3df8e9d2057cb8e3ac2d4d1a58e1a4e1d293a78e8a8f9c11a3fc8c00ff00f52c8f5e947657f577f319da3ce3134470b73f890e38b1c5de488d2bdaab64a582d0b95b1658a9489a1cc0f3260c848323b644088e38b3872dd9d42a95878e56e957c1559dd6757b63aabc37d6af51705cbd622dd4c2f18bb51ef6b705c01c703e0288203d5ddb9cbfdacd2dfc06f746fbcdee87963006f88e0031df860091fbcdca8c30d319dc28e33e523b98eff04f92a56231df0f619676bebff0ab9c1a5adc56eb11b51badd50a10d32ba636afe12f5da48a20d0474c7d412f550f331283fcf37f5faf8b8aa86650f8ae881941eacc00619dd5fcbcec6b371840767f0c0071eecece08c1d04b183243a2843075a3a666b6f8d783aee2b6c66fcb10ef7b5bee761a69fe57de5e4e4e8d895ecda9f495ca3d1da4b9b5d95a53f6d4a9a7f2d873e3d19d3a1d0a7681665099b486428d2440724748fe99883ae65ca010362a5d6e69bbdb31cece4e0c71a62566b6869adf175afd1e4263fdfd648a12785753878a34b9cbfd461896be1e02885c201ea961913a67b4c97a431b93eeaee380635e6479c4937b0a23baf79a8e413d7fba0756a4600002028931000003020140bc62332b16c3ee9fd14800162b856b05ea1cae33cc821648c21c400000000000000461b004c9b09795e5624098c79f82d8f62a2db4da8cb9481beb753c7d4fbcc0011a86a0442ea728843db6e9ea28405b06369186c3adf84313ee780fc84c70dd954eafb8e16a8e4389d4f1da75f9f31a087b47002345f0c1bbfd168222388e873103723ea63ca1e609a996a569696e0a3f60d3a08c7bed33fe313dbb6cab83436bbd4b8b9952d20984220b5d43340e31c519134d91a32b30f0eb627444280abb4106955136c0a1596c7216f454370f684804fcbee4ac7a7682ffe0d3458cc1405c2943dbd27b3325f10f50d2f5aaea27f2d3b72e4adc5bd847ac9a6dfdc7c27041afe45d39257f942171e1a335331236d26797a7863c63e830af8a3e51cb410fa0ac629fd6f4a50cbcc48f437a1c08bf086cf3f58163f9cb40e3945e635adbc8350628b3b7b34966a4b2e01bf64ec1854e4a8e051e4bfe512fcdcced905a14b317ac6a40f5b2cbc00f80c190bd944b6bb630ba7f03118c8a4273cbd22cc8f9e6087bddb30ebf7a6b6ffc12d590f83dab58de83b9a3782789ca57a4e0fcc97bf2ede6fe54c018879a7dbac20827cd0cd8d97e935d4be20f409bf7581c2daa8bb29a1107bf20d7880db2d0f844e075c715f4eb36a621ebe4123aa00c065e400bfb096963198a776e239c4eb1efe551a5c82b0586a3f708b58a917a50281ed99a5f7e1e5e2939348ff6fafd01272f01f80fb315c175e3f219e0aa4f88ee3094e8e263e282c9b577ecb4e8a2d9d0496310523ed58a01061e5acee370cf5a07ae2c32029e430d5fa0cccd63b5089984902d232b511ff0eaf841fa90869876aab058e62c0870d821609caac5541eabbb8e42da37086971958920080bab497b46cb2b4b68a49260ff7573c5c9d89804227f2851aecad918ffea473d6ccc8985ab2d3797b4b868f9e5d6af03906a6027d77b8d71126b606831de9d2036ef4ddb4d2f4ffb2f3f5b5226bc027741a26d284f4251ada6b49e69f9378b523f9c12ad2b5288de3218940d0866c2fdf16cc6fae6b6c14deb20bab4735188e10b5dd66fba11123e901c016571bc6568980c9d96d06a1d3181a3a6ccff54eb129946118158fd231f2becaa3123e968f6fdf47ba0de7d2268d9c0903346c1cfa6df49ba212a7a520e919f5ba354cdf68a17b40caccfa6e7e030248d47b152b4c69a91594906cfc4e562844088dc11cdc1e242e82275d6da4b42adad609c6b36451a54abf7dcaf966c0c7a723f476e66e78f61e497f9bc700caf7dba1933ad0f604b6da4287284346d1e129fabafdbdd33bbb7a329a50bd8a029ca7472185f82b83e1e5e16d4a754b7fa3b3ce5f9761c0c7563518d204319a113d57f10c8c30d5714727695f60e7b8e66bf57a61b0b7b0f366c1791d5fbf3ee4fff9cb26c000aff73799c37f20ff7f192b7afd4edf03f814d57e358a5c53422421669ca69ce5550840b8475b1044c1d1c204a61b61af3ea82cf487e90bb4684b045599e9afb1bd551b2f6f1571255d2bea727d2cdeb2bc96045e717d3c866a2afe57b57e43f018e35c37a231220d8c2e3b74a2fd2bae8cc5cdf5f295a3ed21bbdb415af746739cd5a5afc47932751450118c85348455d352f8d61138536c4f6eac0829a3d7c85ae1dce77e8477a2180176e6dff21007ec543ba808a8ee9014fcc8953ae3228ded0297b856cb8babf4bccbcc238e5646c06c88061f154331648b9e51a5db10e04805b189393d592bf228a6764f3fc123a1f6bcb6a5c7a0b6aa078491fd3a65b78381de1687be99254ec0937347f9568980e70652b0fef6901549db3442fda73af177c3e07d5a6beee297f16a4fd0f942a58447b84fd2f8c1d8f721c126c6815bc626cb88eb2d44e92f2cb828aeb9b5f82120e6f7c5ac12ca49461ae18b69806e75305cddd443ebc832826b65fcbbc911366466fd5b8621399cadf3f5e59c04d0bb89475b7ef43ff753e0867516c47ccd4881d1921591c9c102a82371eec375745867e51916fa99dc2ef666257c8d665e05d9098a59788388babe2adf32103ec6661d728f40c7aecc52defd20a2a640107d9963c0abfe1497f9ddebf50b0fb74a79d9f683d5b094760ca50883e0b9f6ac473e7b17535ffd1b6f0e1991841f89a8253278c4953d68994ffff131bc4d17f5f3db01e74df94e0bbb7a21b7821b5d8ab51ce288be1a8cb9a6b6943d252bdc6535a151e6693030f5faecccc008e18042b78f14b4b082db325c21f58a5c85e18248ea611059641e32f41414727278122948112a198d05d14091e53d46074dc24c7ff3b3e3ef8246c8067eb55505655ce1ed4c27ba980a17d52fb6f41352802a9bb3c69248706bbc8f96cc7b5fa03c1686a9b24f82ca13a9491cb727baa70f123f5fe141e90cedd2b2e3c112cf6c86699d24c829ab3ccbe3a4d93b891e8bb57e3dab70076e508882aba4b2e0a0235922f89926e5a59bd352b65343e8c3e2682fab57b36cc73b18141ad8d69ac1149820456831eabc3dd96f787b163b4c5c1e7c5c4e4219c14760a74eddce611a3a7be33fd005236b1242c368becff57eaee707e31740bd999bc1afeabf6508294894d57b3eb7aac9f5222ab1b1b314731cbc2b38a914c266d9ac507850da4109eae721ae79ee1b2c222c20306ab08e04d7af322ee1382f3520da815a522ba98b7a3b82eb643363bfbbb2d4492da5980923f37153be92be0074007448856a67883d0044b52c135dd7ec6804f2777ab7eb848773adafab7f2eb8b143ea30cc60c772ed3d6c97f38ac89cecf23fc41b975080550e7b8bcfb0937643968804a77d67a1757e6d004bf122554b31cfae2e3e7afcd5226e5487be980deeb679523c47f5b715ff96c69ec96f56c5cf357b06ba36c2afc30df38c1f57417ec03ed40913d6c490e4cc3f70e21b20913007c888aa63a7b39bd732ca1be9c8482b151b7c2ccd78c1db6c7483d6c10f7bff1dfe091db70b4b1903695e0f56dcbadf44e072d3dd6262732ab6d0f75264f3d6c7e05533f3988b9599cbe3c4638ff120ee6d0859ad23d1295689043680d7892691fd6444ccea62717e8e11849571c493b2dab75e7b62c3cab656430ec5b6bdbc1363b7a5cefa14ce5a4abc73a2ba451b333158e906ce1129bd9bcdd1e5b524a8d35d43c6f44c633564bd7a2ec710cbe008e89f9baaf3cdd27b83306d68ff1f85598f4139212a1daf97a94d0c12b4d0a4fdfffdcb86cb3a4dfdc78911fdf2d661057422739c62781c2d0985d66a70e40df538c2566ad29af2c75c90aab6aa4f1b2244e2bd1ac5f9f17f857f34fa692e8a921e8bd5762c74db758e23555ffcd8c17acb49e3f6fa41d3ed2bc42b8b2711fc59d0f4b787416f30f18b05db9edd3faad4db22f21e400818c6ac4ff389c9acbf67242b0da4652ac9968d101d96e2a158fcfb819c7d6a0a44607448150a16d1b5a7c3d4f53b09f2174d7f1978512d3f7b1bbb8d3d73c28d627108b76cc98403cf6e52374c0b976c54001eb770d821c59586c4c3829a9bdc765c410316401df09282195f8e2cfa066a3bd912201e8423121ce11b38fcd9853d39991269b63d2d0920cbc629603b68639c8175808f3244162b5fbce135e046104264f16a336f290bf9b339e6ea99f0e9176d0c3eeb11635cab78bb81d04db82ccf3ceef2fc97ddefb3b8ea30bcff557f003c8a464687bac1ed9e4d251cdea62dfd71a2151bca4a6bad751afd2e36fb60d4f8f69409acb329b5e58a8418242130bcc76cd4ef2eca071dd23d1c053a50a6594057e1567f4ada5be2ada1f1e206c39f7b7f80402e3da83c594d87ccce9f0fb74a39f900aaf5d8c2db75db186d4a3f6a4394f80193d7139710b50a59bf463d213963afcdb5058605e454f6891ba1d6c6a3e1d1046b47b83537a0c44f3405e81cada1bd7dace161a3ed676abcfc717ce3ea444b70c194899ccc8d3854d2d2f9445f1b2d4b0aa98da0b0c6236c8a88d1e7b0d38222057aa45e223f3927064629209da4cea3e7c5c1478817588b20202c5d1bed513a0af75aab15e24d40c8ade1cc8c066517a460d5c65d137eedfca6f9a86449a200ec12cd4ca441a724e24eed47e21c414093faae6a9c8b6ad50eb7f297d646637a810cf7f92c0d3f2cf7e8a0df0b1aa7bf03aed13bae12fe6a58bf1947ece4c780918b3b7a926125b1610b56ffa57dca835baf1b3f54c82f33aebdb9f1f0c9840c83e52b87304bda75842a3f11007bef835e8c4fa3358910e54d7c1208fc2c750bdad7e36d0bb3d2a8d60a5defedfee6fa28ccf95d430085705e03f890b5b2aa871387b1e1ec19123a6fdb1e0d3c319625fb7829b804d957a0fbb5f7f926de6ac6ba994a8e857e5e8cadc3885a4a0f57d32e040511fc3dbd86a160765cc251aa9188b267a5225cf23b20ab391cf41a126d70b0867016a3122e3f971308aa40eb913be0750d3522f03e6f0642f503202a4706f973392abeb9f161b5da47a2d82eb47ba57f4110ff5fe78366feeec71fc9fb21195d8ff39228cf55f4c0c2fafc778e1ed5e6151ca79d71ef52ae0a87f77015615658d9f4915d35a5f28d2778bf43ced6c6415981bdaae586ad182137c92b1b65ddfc9cc0ca2fcce039fa81e6e5c9adaa7dee49f4996d696204042871355126cf3d6c6cbda28c33d91fc311d9b870b6ebacca7a96d6d9467e0d4b366a03c535c1b76c11418917969af3d5040807b4588f90868a4b018feeaf743cccf0e72001013396fd42102340639c8353a9381b9a2797224dc589ab87e6d184386814651341e8aa616742e8972eb20194156d2c6a0001100648761083c26fd712a3c8e0a9167a70c6b8da4bb00f1b7ec03d352d2a3ef1399cd5cf3e9d24f970f773aab39edd1e9f6f572203d272b2a361977c81856a0291e106a298399c6b6c342f1d661690a3fd7a4bb6d46c180a99ef183c254330c2e1b0398110e7f797ff868dc323c632afd0924f195c86965285315e907e92c7603535db1ef2a7ebbe6b31266df92478a7d9547246af57067757511f6340dc8e2819414add8970566ef7b231e9a860fece979579836775f3f27af5b0a106eed61c579fe37cf4e40fe09e5d1b3b9dc9dd8a344b3baf93b51b6622b4b94309f6710c0fa7a756a2aa4d90102e4cb31b21b89e5a24a8bc4a5b73bec3a56bdfb82101f80263a25b70f83068dd8d1e64cc98e63b3aeeccb78d6c9e3878b62a9c41abda9f32e3164453e971e6acdf7f29f55818e7dc5cf8d5c1a7bdb1896fba395692a30dee4dfdc509a42c658e854c1bdba8dddd1aec59e43b8a2c0a6d0fb8865c98d269cd04b978eefcf844f76d99251a999e2df85daa8352343c13bb49a0d681ea4c513829e8131c939ffa81a34aec3aae07773adadb9660b79ee1f063b8783e5f4a833a405deb1f5a7991f87d0bd131d8f8168600ddbd0058c3eb0017b83c1b05588996f8ca7ce0562878a9a8266d889a03b5cf0f2fb63be78735f9544ab4cec7ac59c16dda5e488b185b62bd528e9e19ffd4a52e5530df56d0f0a407be88f4de93a16986c0ed4e3e6433a8158e71c20d23c0bbfc107c79526e4557e05e681754b0571f8e8a5f7b03bdcad40d29fffbd6ea56a614b41cea3942dd73d6ba7c347ea9471caa6ebf7d7ab348fcb822b808929cf9dad5741f9556a6c73af196d4bf904222325a45a9e906976e93fe647b8d8adf09e5861e510a821b54adc469d9d3eac678229742a0312da848336eb6db59955c445d3f376f6874057af80d7dec8bcd18ccf140fd6b0831148c775656fd9fdea9c539f62adbfb21f3bd978e3926f4e64fdfc806779260b650e6d6cd0a0d534449e428a18620c98e070876f9a3daa5e5c5c8363ef1b6f4bacd049ae85b09707c1a5eccb2b26e5deb424523ca53d307b01855b4b62f416e2513eb84ef45f6a4f2f4d6d03edbbba4b05b8501561907c58cf8b106d6e2ef3b4bc1605a2ab601c36be51116a617b2c2eeed06e44027bc7b1f4cb023e3aa5de92803782256b75c5a0c7e9e30ae6c0812ece56e00b160d1a47562fbfd22db64204ea2657f713ff995cfec26972b056dd41671e17bd693c81feafbad81f73022d5f5e955f13a1de1a6b2f4fc4b975d0b1b21b4a213e4c67850abd75569df51a3c516d11577f2ba23d320b1b2e852469f02d762ef1684d514a8de7c7c7c4068f2475c52d2058964a6fe272491712c254e183cc293667605b9afe4c7151d6b79d3c4eb2f493e2fcb1afe4753e212fea6daf32293597b00035c4a0d08268ed71fb9deb84b5e5dceb2680026cedff5902994a259c44373cf7b15ec29e0893994772278f74280f5068023a0ee7b7b03393f0ef95f6acf13b6f4f3d3543124c867e5ea070a4fd85fdb7ff604b8ed13bc6a747abb9843f55de90478b66a21861d86efae0a8e53d0fb17fa9d055afe7a9e2c8c3f007c874fb6814077fc863f66f4141a48600ff7236b7602666a599ada2d22e6e0a968c803153acc98959906c20e6aab31be32554f4719a89b1a2680d12e9dbec0255699f3ea87214c999ce0c86fb1a23d7dd6d40c225bd449265bf500f6d6a01d7b50883eb7e4d32e0e657b50e39e36e1118274435dbbd6b30ce624509cd7894cb910836478f7fb2a15611ca792178d57f78984459496e97894409337b6fba4fa1d807f21a1d930801ec10608091e3fd4768f5f4b513906c11c750b15e72d4e6c55ecc9f87ce9f4100a29ed52fc29d936356e72a82f24966ea33213db9ed55439f90e7fc720c516a68e6a740d0c08cbc83f5aca4259cba5b2adce4b1fb689ebfab5ac149ca9957a6c801dd93b64fc75b4fa8f9ac3930145710c63f3e78ca0fbffd058d447b941815fc38ae182c1ae539b253bdf1d3b43829bce332157d12743c76e2a30826cb9de44a8415097f876b6822c22d094d35618045444bc515aa0ca28f3f14c24f0fdc1e2d3e0f6d1410f37c88e1057c35d679908e8f50e40c91e350472d468d34590ebd05a11b88587b8da6c8a2be46370a9bef2b2d42cb30e87904b5f6e345d335336bdac3f37781f8abfe29f85b9a4cb8d450a78cdda1be4a18b3f31908f2ce85805a0365dc7677793ab8d68b8c7af6438afbd211ff9109f0d322ed630f462f2f954b63d2408c0b2847113a23af6d434d0e746ff24299f9eeb1647e1fa4da63849f01379673dcec6875d470d284a24f9db9ff890a47b1fe0b55755fa998a6b32b88102dbc84f4c5796e7fd2334b6f15335baced92ff0a4cf253a6676c71983cf893eaabd3e93cfefadf56fa4da19a0bedcc46fc5b479fa7180307071475cc03d73cb686f2de4c9fcfb87d14d1cc2bf4d99fcca7b2a3127d1d0738579b8651cc32e3778afd3c698c10c4c1bf2d64a1e41fd4445b1cd10ad427cfd91d0630578aeab84ab548d00ad4a03d85d04edc9f4e8def432ad47ec3ef7ac9d20a44623a4aa3b87cc3a07b14fb0c07d313d02d1bfc704e01999139813ef1586549aabc0c1f984d3cf7df11b3e19ce06f67e36d4093110303fbf0f4668d8dce7a512ad94bc7f6008c98c3b6c036a0c7cb68d983a3c39a7e0d0d63c8a0ee75c70da24dd1d3484904804ad6e1755c92148c51b8d9e90cb9289cfad2180275a015408d83bc7ce12207bc48a61d1b9519839e081390850d51319855e220c5df296c52f1fdb01e25db2d048866b58de962590ce337cf77f986eac751857f1392a64f79707a3ad42bf6f1186414c7514cc5a5e2394c4ce8ecafa598f4f0740b7e06c982da5f7f6c866e4f12b07db104ff3f264504643826048cf83355b0323765b9330293837056746fa9cfbfc423e7eb7e96d0b784e53679e557bd2e24199f122a1c849de09a72aac58c58a18d1f44e116fa914c129b325f1c2e01cd00a4462d68f2d5765cd794064c37e278b90f351057fc2beec202c946bab29efd3693ca8fc6904c81a8ef85de40e3c3811ac6442ded8051ec73b2c8660982b8b271145b8d68477764362962880474e9765358c39295a8fbbfaa0c74cc2a2081888d02b6f094f9d72a9f722fb1ed0731a00ae9d41937ce9a420b850066b515d6a96e209c03433857fce0c51bed1a1cc8e8aadb4a60c999b8a894e7e351f5d470c74a5ce15c1617dacf4cd5ad97d738365df496fcabcf37998b52604ac87304a0ad52b5ed19b720b66216f59c48e8ecf3dbe906b1b271826f2c5872c55778ba6cd9a6ea1a42fab8ab515d39f6c23ad107179594ed09078d4ba3c8c7e104adc9881fce03190c68cad30b398d88c24f4f801f46252b6f12343084f844ada05d13e1b33c220904e913a2dc63d3dee26f15c4cf27533a8fa7f8e30d3da3950f93229f4da06748b773c07c24bd0d59a0ea502741418a980389a52ae296a3380219457e9493b46400291732e3fe7ca259a25e8c58aa173ef66abf170eeb4bf1f2e591b4952182315a9860a117c97c3ea7fce33a1a9334d1b7d7862fefdff14f68c0f1606f2c51524bfec7d4297fcb2d3100d1a7aedae7e05333a16448d3a7f0b4829c60b330e672dcb38c356804b8790c478ef74f61fb96e3c90cd01c19f0ae0a6094b7c3089c6e1cc396573d8c0783d561b072a6a3bac71d8a391e69be35442737055691335886d5bf2b264b7771892920140ab9c1ba4d7fd81c6f561e8e1344662c1769566d87101806eb9e1b9e5eb21a7b92c2e5ddc85d98b758e8935a37dc86dfb6ec9f460f80feb6ec7c2c5b929fd6faa2d7d692377f3b8e4bb33c898942c2c23e3a332f2796e88e22f720af86f8650e7710ecaccdc5879bad1d5e46c41ff96ede80bc0b69e64d3dd167915d149ae8e7c3bf8cb5fb0911f2794ce0bc68237a881231990eb324cbddb9b575f86cda0678d39c0aa054a20b2521396f363198fd1acffcff81585cc255115c2fbff2e3bc218afc2b4da254ae2d337c4e1faefb532ee53d8065161495441ac587cfd391717979bfc274924a39e4dcd2554ba1533a888da1cb52a47ea8e082b4a18b86e48cfe3acc54d2f4c64c82d22429eba88b1e9e663304b95df3e22509666551bf971dd3cb5fc054a82b2e0212600e549b476e726010037c6615cab92849bd247046008e9dca88207ddc5cc36310cc88bb284d0836a66cd231340f36f3ff6fce1e5bbd74991ae4364442d04635e6a9d8fcfa52a4425ae7c82df238a8be7e63217ffd6ac3104c988e2894caf1a12450da86b29599c4fb17097e4f9a8e7ee167d164d1990ad117a08469aedaabac3c919c301b5babc1fef4e135382f3849deb3aba67a045319c5b2d61d8427f138d741b8179bd8f6d36e73e4baabfef963e208ff419e65143c7a028394e227c53502eec93591522dae8726ecc0d5baa77e73f5ac39707c27fb1004ae16bf10fc565d31d4eb381c6cbeaea0e4f3b99ab9f6e30cb455a017996c0fa7ae1eace7dd644f8f6ed2e9d9171461403977559dea507539d8157e52a698a82dc88ff53678c3d0af010a441bb0107dfbdf19ba403412bb3a41bfb7468b6258a77f2d1e18434b97e09385bb74e90b03abf7a9a029d780ba2cf0efa68700a99343152dfa6adad5123f70c3d9eb4c85e3ecff798e54045b3dfe0fffe428bf31c611ab08257d3a75b296d2da6d7b94c2af28ebe1fa78b4cfa6a24762cee53b29b85cf10f3c42b401846fa1d800e6e549afc70e9884237f520da7a68a0bbf765872b57f26bf29425e10c0770dd192a94944d50d6a0654bd62e3513bcfa1648e339abcda083f8a522e3ddb0b4113c5b8e955f267a5065b64eed0c24c983cedf3a36e101afa0ddec9e7a2c607abab235b13f794d2bbe88e585dcd959693a93cb0118f8392a649b26f16ef1f93232a1fd95c522c740393310ec318d5a37dc382fc3ad1fe3fdb64cf44a71053f0ee0cb60b57efb47a683eec6ef4abff5fd41d8b055abc79364e2b960376d26ac7300ee4ea583dbfad6f2784362e8a9489aef24c4ab262b63df667dda2ae6d9c3eed0ff5a445d4f031369dabc861db4a74b0c5124f082e864e3531d483c780c009c2a66de1d0be999ad2deaa746500c2ba2e4c797ed4f57376ab2d2ba017af1ccdc1ff343105e4450dc9172bcaf03966a065669982f443f3cc572154758637eb7b02f3c396249699b59a461a74df339b3f967b1269d1f5551e78c8a40bcea004cd0fd216664868867f29524eb75efd9bb71e0f08f9f21314803697c583e9384ff5da01b7692606cb6c51356ab399e3a41130e782422102cfc5a095c3a918b06b1e2869730590f408d5d478367f5721e368d54e75d727594a778ac4a3e188a44305f0c611cf1c7ba90b0f284f52a245ac0e5667b3bfe9bfa32d077124189fca04c8fb7fecdb48c99d96d497c1fff7945c48c2a13a9c4ff0885a25d5fb843e7f80e21b7234335141d008ea78c3df60959c8467398beb19c997128ed67b122def88facf5c52f86f7aa1c65ef017ee387344a35c6e2bafccd256f35d5ca195cc43e88deec202bce1fcde419fd59d3abf12067be1d67d06c07adc87eff05ef3ebed3fa5b9621f0f3cba6b19d26009952968f7596f313dcdcc0ca6a423578720a1d430582ac2908a7bd295c8992353bb14a092dbddc4a2b9c6264a4dfcbf26f0e8fa4bd8d64e97081c7d1477365f97f79f950df70e9aae1224462120cb029c635b8cfb39b3653f13f795e3f2094937cfeffca4ccc8c09b8334ffaa1ae8750024ad9fb89fdded472fbc6ab425f20e96dd2aea6acb4f2d15830889a0531cf9dde2bcd713eacc09648bb7609be257521d59f2532de6198ee98cdecefde9a1751916c76494ad36020b95c6b8e0a83680eb4f44297ce15fdb21c6be70a170f6b3813f63e1eb0ddf1b239e80e95c1fc49f25672cfc0d90f849fdde9c3bf090e6da84e30e999500ee7337e691d71eff4df09e30c3bb222a55c1850df266e1f74c2af02c69bfc06c2f46d8656ab10151600a57737588e18e3ddaf228643cbcbe77487e3b9b5f14d4c8464e7e980d406efb926d465f5cd51d1c1dbbf12fc3d8cd4e43cc8eb91bb477679b47d7288e8f0c3ecbc2e52df50d882682b8911f6c5a05b27bae01988015d59ce3c3e032ba4ef2d7c2d9514318021404a9cb6475c559344fb1450b148bd8de464b2ac2e2b89cbb4b7ef079424a5b4705817ec876363262181dda41d8001a071411987a54eee566b1608ba445bad5ea61eb6fcfbb219dbc2c5ddb90a2c502cc9370288ac84e3e6d54ed60c690f1198778c213f9466fe8dfd7037a13744da90bca11633cb1e4c23776b90383b5ec52abac49558aa2e7c74d1bdbfc58e39531fb0c312705d4ead7e6f1ecf709a7173a8ab4e97cfe5ebf2644cd4738a9dba58f948316fc4dfa301186144c8a801ca7f889ef6091c811d108ddb5721b4684acad063fbf0a28c1a1b467ead6d45d7077af719219078843f3885a8e711b4be17123ace7a5f845b8fcb4da74ae5c847ca4dd3e49b65eb28877f1c89731902bef392605724ae61300a5f573f53a74f6bd9ee47ba098e2656df384a4a1a1d9b04df1d000a89ab229448d7bc6e62f9a399e30c89476593f5116b67484c6396dbfa9c863342f2af43cb0ed016852c07a1a6e94290fd82a901d2f25d0940a4df13a90a82d156a0c6db95e7ac70e622b829da16f6aa1e3d6d50d491d735a308de22af118d610934a3aa71189c5c3579f7d256755cc6379cabc02e5941225aa76a406fd3bfff7040381c01ba0fdd52395cc6567860ae2c47b31d62e9637471072611c886201253897644fbafbeee42b7512381d3bcb76d63bb465cf8b52c0bb3138ec68f3da34ef533edee7fd38877fe1dab45308da756d0a0d4dcf636d6cd5c09c61114a4cc28548121e9775b72e9fbc6ea6baf2ebf2e11a650ace454382e9ee75185a79e4e1e8cccb83f9987b3ffd946391d1724dee56532b60fc5e9c304dcffc8fd6d7c2638e87b8e0c89f227f28962fa9aba2ec7daeb5fc9a309d00ab4e8e0c4ab70bef20077f5d47794cef872f463a70f1c2cd99f50c6a176febcc741c9c1751e9892c73bf40be3b5471fb7d01fcb22397aae5dc2eb5f86bfb5d1ae5c85a384c362d1f9e58ad5840321e911bee8c449bd489bd07ff9c7442defde6ab9827fe8b20c4b105750d5be9fef585193b761faffb2a82ce4b535f8fe30c77b2ebf178dde7f0e484a4be4231e00a31dd514806505c1c46b3e6882fc31305073cf71b490a1e6eca614fee30c70485a97d470e1711e7759fedae6a25efc99d7a2c7dffe2fc7ffcd17be07d5ed178b2611152c82c69181fc751cf77d3b7fe8a93c7a9c04df6d7f1dd3d3e7fb2da6077bc637cf9b7c880e21e1cca517f0817da785997eb97c99bc08adccfa5610b78653c20a12888404470bfc896d4d03d2d9cf6396434126dd326a97733998f11e82ba88c456a1a897bf512aad9fca3500dcb2528128101a395e63b5bc6ffd24c069b8f5efc7de3710f5f458f48e279e9daf8011b60936c982df8733c5c275fec22222a7101f5c22c985ad1b890ba73a82fbaa697952833745d871d710b49bc5730a4189c90c14dbdcc1a0a49c3535a6cba9d394480ab004d2eed7acac25ec33c0eb3cecd59e98d8db11a1d84c15b03779ec0bcaabfbe04939211e48fc40244dd0499c3e075753e6159e0df8b6cdcdf595fde2531b193e435fe0fea9aec993d7f0b6d492c656904fc509f847516510e3109bef7f93e5c441845250ab4cb3b3d2cafb7c0d1ddc6990f33f94abd402c1755ea57a2996e1b774e5ab144b454742140c7243f8fbcaac21a2308baaf947f5971ded9372e0203b26b53c379d6fcc30e86de854320554b32e889bac7396b40561e7276de5c79d3c871f33878f984af500d76cc73229b39f2f6604cd5035d96dc396174d9d854461042fd80edd7ba511eb84f5bce64f05efebe22d3d274f4947b5a12a2002174ca5ccdcfbfff1064f612a49116e17d06b2332b310899e8e04c2ebc55e15523d411f7bc3249eab2d3d0ebb311dd86f9fcc5fe81ea109f8bdd57aa0030de1cfb89eb916cf9bd81e786e29bf627709d335a20bdfcb332a7bac7b5bed134b90e9e094ab1c2c654c7898a5ead3c352b313095b55ec91cde6aec6ba0d4643a65266cb22668dd9b8cd8bb333c8765ecad3a86bca291deeca48a15d7b24ebfa96954f699d41d1b624b03f55322c605b0d3f8f3066b79e53d2c43315e5cd14b0d8411a5378a7afc745c5974799a74e13c5500e2831a0e7353d91b0fb64a2e4f7cc3ca6d29f06f489827243b0299d19665a3fbc1e1a4e3922a7b83177e5cf012601c6c4bc460676ef8dbcc47ce367e4dcb2efd596f0ba98d688e198fdcf488c94f6fef27d368a419684b3aa1024f7c7c0d884aeae60f66996b998fa8b29dd71e46d7a2c6944426dcba89e9447d30afe444f69924c9cbf9986577d0b9929710928da1cff9a8b85cefdb79c1b21bb12c513119bf9694884c8eaefba81dd4893c93e0d97bb8b70ab0843e0d36a24d17747a7e7dc26db9bb61316f94113af354b21e46b608e7d6a57b3aaadb3402f68b8151cc740aa0eb10ee8da1e3003bfb004cf0132ed0289fe784d7c8af65ebce7d86ce1e12d438219b85389e7c67d727c9be6683a12871975e3785ed7ea43f3275a3b78b08c8ff8bd2cf4c2d3dbec2f39544dc726493ab3ef2536f313e6a77bb6d623d8e8e1b925035b53a66b429ef77111b22d3f9db082c9e24d5953a28d818bd47ff27b602ff680bf42f98461e12166a841f4e1227f83a97d0ba85f057257243dfec59ff6e8a16238188228f8d416be52ed655cb0f5b8d7ac508023a981cf238d385a66eb102647e6e2185bae0c4568c1efb09af0cea464cc2673eb0dd5263e473529a6b66e643a68bcbd5a15a0d817ca9a10997debfbc8bcd4bd0ccece7fed8b3d5ef0492dfe676c7bfbea2b52e792204566c96c39154b4a62f2c031cd0761a21ac84a8a9c694d53251b544315675a40e9b407f4807b8dcb229be9a54fdb4eb0a8e58ef6e83f64e60c5397ff2e62448ca933009c111b85c53b247456a8e0cfeb56f9f0f31db62cfddcb24cf35a54951a7724a5dea6139df116a6102239d2d6b2734e0b9762b3e0d11cbdb7ecdf3ddc8262504ac39e0fc33de223abea3e3bffff553220fd7c449afe7c0d88a5218d28b0ae7c597da4638503d427903917faaf9df0df0b526bbef8ca7427706644f8fa3e83610206378234a5605d68ab44f7549f7bc04bd3786f33948b60d25225c619da3fad7b76b38cde5bb24ffbc6f36eee4d57117037851707b10fd5b2345c786340c2156fb785fd1a24277bfb9a82f52be0c448104281cdf1dd4fc44bbc0ea535b918cebccba708f78637e2fc23e67849ca2da7055977fa38c8fbf2420b3d68df73d47f10afa87dcbe4315d8fca16bc62ec365f7ef8584d43be3cbadba65bbd11889596c90d8765e5f632487329acfd2192b74c4bbce73869f68da7e364b1d87cdeccc48547ee376fd39bfed6791e9df7fb7618b71342c74d4cf9706f9a4cc4c7daf4c59e5159eabde73f4db0c164ad5b5986d614bf8263ac728375e2a722c1db8ea82cb74aa312b5d85b66ea1fdf6bf2a6c8e781303f51d0d89995364e86d46b70f72baff39b3e822933376bfd511ff4fbd877ded65a629cb433e8cb1b313333bc0336ea17069d8c460c9dd54fbe16ecb198563e4aca3f98ed055befe295a58bfe05018819cb973a327ddc44c0536c1a8aa511ca8694549dcce404661bdbd14f915df2c6ebe782e73ef988a31b96a025608d021882b68244c841ef86217ed97146e3d59e84dbc61290cb312d4c20271f55f2a8931a4b1491113401ab6cbbb94e8a0151282eaf34eb423b31bff23745a752e1aed2fc57568ce222b8efec217ab499146b3741eb9433107137326b8c5d3411ce467fcb4fbad9971f5cab0334025f33a6d5eac4baf8caa953fd20418f3a08296ed1e9c69ad84f9f726c98465cfc0c440a3ea6b57fc0f8daf160dc557219709cab043432a9dc01de9f8bf4f551a1ab22d802d66793c887da0c079b3a2daf731cbaeb58cb648c6e350b3118bcb80b5be4fd7f2dee182271e7935c0466aad2d31a12f339c0d52029b5108d0702b9ee9aad2c1d0cda345408f90cdd2d60ae9bccceff4f921a8a323d3d5ac6af26e61db8cf7e8a0d8f00c907cedd730ed13a3182ed2871c1c9a2e49d40f5454eb101e9cd94b7a805120bd0e948d34bacac14f96d8e3dc6a262f3278cf3fdcb0e460618db29ce2df78e39e83d9c7773b3ee3f8e24f4e985e78ba3e307972d9fc277b0687365208ea4c1d38285bf1b1ebd6c386055c20145d8e6060d297c67962d049aca38828fcfe5bc8786c74cc5c2c21c0424839984708b7170cb78577aed3690e62041bd03748448f749d169cac92db3e24de44a5bf5f108c379599d42cd898235c907357437c2367167ca841ca4652ef32556f590475586821270b2cbded67fc0786905064d14c580608bce0255d33f21d2949fcf1de07eeb63ac3ecf8b9e8d632fe5baa3997d7c2233a9c37bce1c3052990fe6ec4f1a84fb037fb17a2f0ff6e90efdb52eaf07a0aedb8f3facda4d59fc12611e01a90f71f3657abdc33b0f7d3d02e772f32cc8037ee3935d6b32935830d69c034a1877bb73da3844a5e4a9f5fc6cc12692ba6eecae7c89bccdb462dc7c81edb0a65a97ab965777f8dd6bbed9d734cb36d2493d64012589bd6f529b157c893c866343f17bc87021110dac1ccdc560f257483b5a9f42ce5645f4b773fa84462d7227c85334834764c2e65d0c410a134b5c82e0aa4b35ebcd80987d907ed47ddc5fc9a3552e80bd0ab51a1201e2468e1455f3e7b1ca9b63c6f2dc1641065dfbfbda817b65e6553d74a42479739426c495dd81ad0ece43abd657f564f1ad5360222c8da00d1da0abd66c88176dd4e9ccfa113630606d7817883765665dd308e3ffb5a44a99f0561c2842e3b4e0cefb64b6b01a23f18e5f6b55c04d5b2202091eb47bf66bf19093e0392c6b0c16868cb8e698554ea7683c516a9e6ca7848de0018b77e31d86dd3f06256d0dac0312ab5bdcda836ab8e7cf663a01a2a1a2fd0cb7d5c5f1a8e462519e58642d1f4ceeb9afb76f59f7635fb051e116f555b1378a4432a0633ecf57368b993ffd94e14407e35f9711aa62fef293e824035ddfc3cd5354e21fc9576326ea79121ddd05e12a268064e07d0e023828f16fdb72920c5749765a32afe788067d0a16f8d9c09ae624b065d6cef8e79bcc44c02675fe54964a8236fce226ff020aa951bd64826571ea289017e424a53997be347341abfd865baab5c76fd44475f885329fc7457d2cd24c4bef6163c0b0d294905ca9f3569945a2bf191f72519a05948d7a60937c73628493b0afcb56e30bc0cb43a7eaf02f564dcc00b87a6f18d3372cf3d795b5082e9151e0854d067ecb439a02b17b352ec0374c31177da92308e8a294a00f2b70876d962f6fa30472e909aa6ca540627c651e453e8a3dc8be31fc86b78a76d527596768d9dc328ab584ba9c3a838b71683ccf914184f02c9b86595b556edc67e27d003ece8525105a4497b75b2afa1729b6b3cc5fbe8f03bc7adf08bea68d4f1d1f0691b3dccbc1dc52b44e9247326ac61ad3034e66d3cf1f648d0e1cb3cd89df5fa1dd0d1703be6c78093da98bad0c6f1a5632415cadb8ee7e146804d37f48136a81efe221432bde0a79a0b524c56db635c5dfe6220524a5e2028cd055397a26f85545c7eca12b78ca10faa0b2d88717032d7e816bfea16f0f16b589770f19b8fc850cd2e4e84f8717dfe2433fd774ff40c53f428eb7b89e4d52010334c1f9d27944070c42c64b59251c2eb6117f574bab20ae84404836b346d8391b25bf4236dad98b1b63a7e68ec0aef40502d4f8fc7261d7f63444b7622a10816899e8b8c770db00027133d1cf56716172b3f639b59a701b37af34dc76a7de4776ca77cf504ced0257c27a57e77f274532f4b217177aa9cf28b6bb5523adaea03985391a34f67f06edb10f13e83e7a38279b893db6647c8845a4c0259883577a83e4d3e1c945f044f3d1cf1e687369c3ad036ddddca3b6eeb42dab8ee7b9b81ac8f13750324d9583a1b8b5322b47cd4a040cc5d9f823fc517cc2e3e405aea619c281d02727987a7b134a15de2ff0b560c1d0791daf024011b7340df5da612c44e5eed676debec01f2080390883290a1ca257e103f15a8288c2db9e230f0b004600f6fcbc0b1755ceb073cafe3745497d4f8867d2d109856a73e8d16ed037e07fdeee6e3ab7c67e6a59713e8197ba7a7e8282b82e7a0f9d5ddb34e82c20a3bca7d42a3386c233825b5ecae0800d821066169f955c3effc34f0badefaca5cb16723644d00e4c3e3c564ee266c9c53a66a9d9c05dc2106b15f0e4876d42e342641401e4b8730f323aefc626b4af118df949e027c187f312f8240545fe6f7f14f15fb70388da8805f16d27abfae51cdc10071cbb678b26f6f4299ac1fc26a500c0e9c5827c737070880462100695918d3560ef30a3a41df5f9b433da349de06762e0507e14ddbbd0962c245dcc2b9a060bddd3f41aea6824e2a160b4ce4983e04ff88a1e524c56677d71305ebbea4387e46b28dcffbc20fc7db41a85ecb305fd5f204320f0182fe34bc02ff9100ffbac7e0a6a969b621b1486b9787d4e4ad0543bda6c5e43debc84408268df2b1828d14d0bcfcdab1bf52051ae32df0baef37ea77a0e311b0dc817146643c1b5eeffbe85ad49c757291895b08b65ddb39dae54bb1e0639fdc948440e1a792e7d12cc48bdc7f5bca4cc98f8ebf778de000e92bc5e805a709cd9cae0f9830be3597d545561d3ec418e3a8122188d250cccc578600b39b542ea3e1059c2b563486c897842a89b5196a1c35c480847eaea307fc1ea0ec38d904cb0224d2cb8f5d53afd32b917a4c7fea376030e6da56750540dcf6cb23d760149f7c16344a42f7607e097a3cd985e2b35fd77afe22e04fdc5b0f1c2e483e6b7a05b675c9f6035e29723934d60f050c43d381d328247a17829cf025431b8e7c803561508ebb35091b790b72fa5539927a21ad090e2df510662b897307a424cd380cd252f3f231326bcef276adb13f3d52e461ecfefa94ee89fb3473afbb62b0969f73ffb99d67b21444b644e207839278c6598a96dd5fbc1a185e1abb6395ff4927d14b707a2f1d3faf58f85ddf6ecf5329d8561f814c51de8f6c1f19e07f32bf9323ac5fe6f5bace5b476c4ae403085110bd2ad0585b891208a40b54c1fcb84d33d8cc3d9c47cdce5ae1595c4f80007cf4b1df3b644a123076d9adfe65f2d6a1b22393e3d01733a7185b04cc5f8b6204973269affa3494a963efb2dd603e7950d6056610685079e5d95db507a5c935cd306f02398d1564103613cfafc2a0ecdf7f793f0c21113d2686b6362a6e40f22773b24009ab6e91ab26964612cda4a36bd20cc1e9615cd0f73422a2148ab3116537ecb468e4371b3b65c2042d5b8778946d00c8ed0f8ec2bf70e329b66bf0fd1679d88e35d1c72361e3a30495efc0ee9712edfc27f0b6d6fe539bdecd1d2ed3f40e74792e74ef74ee3c8704ca4347af6e0f44d7a622aa6c1bba98f4d14643754156300cb84fff44f40b36835090dd16e719fc99e694b982988d8f24e9c3a8dcc088d95a7862d863c426fa48724bb0b90f8f78096b59735d7ffd708754e825fe405d3a71c2dc42eebd6099e514dccbdc75ac613c194ac9f0602280a83f98a7563bdb7ac498ea6d024d28719dc3ba132f4a5087a1b8d5d0dfb10d837a17150d1877b87eb3689fb6bd60d373111ddfc6a434983b6a5c0533ad4195359510df316f64046c7117e19b31685e6c60d4d875ce1f216280b00a546b19307ad0e381d007783e58b793a3b5b0e6406c992d0801d0df6c99ea6d6d771d9256ef949b507887a923bde54b2eef110861d33c1558870321d30100af179b872abb3c207d311b7759c32ad6d06daeef3280264afd14814569eb10fa9a18a25b78ef0e2aabfe2660403075a0c9a1c6fe3cf9fe82d8dad96ffd3f407cebc7ed4704c8092e5a8d95cc2e438cc606ac1e092d6ef72758c2d60017803caf0ad413bebd45eda701de08717c768da7b440b433d42d04dd0f6f973df16506a246b2032cf24e01e0826a0262da609b87914d4368bb16ab0c35c16c8cfe3a3cc738ef4e3a56a810c8c62cdc40bb121da1aae6c911907e75f42cd5e0a756212135650e0ead81f63ac5f8c521e522d86f0ce45eb8485f9281bb138b93430395f5e5e7db556b46dabfd0b15a9a47f75d65264f5123ab95422c8e5f8ccfbb55d481f8532eeacedc4f45d86da88a31ae93a0230cd3e45ea2e91624eaa5bc3b63d74f868be2fdedd83c1fdcd24f5c9407e7eecf780c5bc74701b792c788a146dd1107348c8f4cb69a39a93081361854d99546261afa9f2e7cdcea7e3e361063ec8f54e47bfb5cb382690b5036d20e8127437e17053ae7dd9ef5f302e3ac9dadcc197e37a346b3845d95e50e2f023fb184c9948a2bd441d02d840b3baa551082bc50f6c2f5591eb2f94ccf04e2e92aa970d2a53ec382f09c3841f15452f331062e3a5041d89eaca6464d24171c394f3f568962cb119a292da9d6d0ebc0836bc6a791260feedd878947863fc2f30bdb908a479091a50f70cb363740add9b19a26056101634e84226c971caab804dda3fc9475774245ba63453bfc01d3a1ea4771003fbac56a7d9ed25c1032ad0a72d71490e9c0f1eb888c04ca2446af89f6debaa211f1cba467c66f9b6a7f4f541587414fa11df2593eaec07e4ff0702e3716b723e172a41a4e58738019e2c0c22bb8b0daa92370a6c2533899dcda7685b4878e452d22c3a679a60e4e8be9e9c57eacd51d914a3dcd28aacc2b79b2e19173d3bfbc47347ad9f79b704e82b4bb1790546763ebcc0e79965aa6b207b86922d1b24279c28ba44742bee3892b74bad562fef0477547190f8af031c33a1a2a32dc4de3cbd3ba7fa0141ec0d55fe0ddc5f23d423488e13811d9b7b03356a9ee70d1e919252d542f4534ad0836817c53a76ed9dc4d45980654952305b73a36ee7964e7f94c7f33c22ae2e9d385505ea0b89fde8015c7a687840029af9eda6b109a4890a5a8ee18842210ba13602811fbaed726eea2d95cdd7834bc9df1db190db964d058b1f985ceb10b50f94fe1a7e65747bbd457b9dff8f80eb00539a7336d2b681619eedf33a09e5f4f96ed3fe12c6e93a7e259386865e6bb8d0778ede5c08c95939e6958adc40eafd8189cfffb2c65f99f4c9344bd7b29e470f32c874fd102b3dccd6bcca3e9c191ba38e3d2c91a0801a2032907f7c2c920085ba8a71b7b9939a0961dc9f796c0187cdbd07919eee538f47a6bddc982cd49c4ffd129e76933de8e158f44e1353c704c26e42891897f58cc8b2349a67859289c30e9852c974c4030d398932ff5a1cda80abaabba6ce93ef20d8d8392d4a0a3e6c7121c9cc24190ab68dcc762df4015eef827acccf11f554ceb6594ac7c2cb6e51ec7c03c3e163b942a750bfc7f4f1539c33073c142f0b1be9a69965399411dd3f6c4df9f5d9912eb3ed09e1191e3093dc1496e88ecd03654e65bc1ecb14ed14a60ebbc913cef32bff7f8f063f43a242e4b3402afca766719d56fd5325b3f1788d49b7fa3742d5e3d1b0c8c7a1ad9ef0100035f7d10a50ae442e4d2d9c6c8417fdd3cb3919b9a2bed815238e33b1161a69aec9ca393a875fd823e8ce9221a276e2b6c13b3427167c99f768b31db70f8f56648071e73e257eaed4756bcf9ef34286b3661a23f93f41eaff6e00b6070257eb736ef34aca3e06002ff8ebfe27ef0f3d65411087707822f40139e3223cc1cad7af9dd21afc0a6632e0e87e838fc3c112a695e1634eccf67dea9e761fcb4c24f0a7ffdf576b1b1c1d5c6734a50b3621a1768330275714d8ee24e91dc05f7e6871fbf2a20b1a7346fbcffb614e251bfd8fef687dfff77d06dea4d1e09ef2fcdbeebe6ffd56f4f9c84ea71e97255f819a5ce34d406435f24d75a1e1f2454410768a5a780d6cda24647a5f968b418c5739aea413e21c8739680824e1cb4f2e23feb5c30abe397e0e0da979fe79918f4bbecee5ebde3df7ec169ff1001f6c8a8410eb5c146d2caa3d36e11c7ae20a651ff4c49999c0c76e19991ef4ebb247fe84970837c9fef1752cf4da64df791adee734ccd1703b1967cda82c63dac5979609062423bac67a1707e7dee077330c40e557b5dfedcc785a3621cc2fd423cce8928a314575b0e3c4765335e778be730f55decab94424099b482cfc29def59c8a7dd88d6799a77390c2fa3af9a6d7d60461a26be36525d32ea93333af46bcd989f50878685f61081e87d42ef12d8c8572eac67ec459d29fdcb1c19ce4429163f726b4d86de1cea274d0084dad4b33d7b1c09541fc568b5444593207912ee3023feffecf97234473aba21b7232e6a497f003be931e5542ab8932dbb9450515ce2daee75b64cdc541981cc18baf1dfeedb6d3c76b00d84f9aaefab307b02334e24f24124432ba8ca8d32b6a51e62bcdaf707689bf170571f2e647c8e020d5a7b0584127a37f91bd0577dee6cd8ce19ca30d65a629937811977d423b849c5be4b3871194d13d1c0030bffd4091944b0a488022c9de8898e1aef743643b1f9913d2c2ab610e470fc6bb314b7a80763ed6ee8f8a585721fb1405f6d0c6472c96c81ed766bd466729178dbd1808002445f9ada8057f9a205ff6d03c2abc99b34f9afec32d14342f6343a02656981d58fb747a3b75b15ad7eb40ddf5d366e548869d231f900e85fd774feafe173e23977d2211692c3a9b67112808758cb1c5a6003548a0d1dfca9781e5a9086e9c53be47ae49a18d2bd0ca12306c2ace63d73dc5b9c2948992d06b900df6206930ba312049a632877b351eb4d9846f5de4c543aea061be8bc207885324a38547e7f3d59349d1ec99162d72b78372230daf2a88bd5458272240a729c737d4da7e4779e26221f1b77df5a7cec0b8b205dbff86f71732eab9423b990f2900a7f1d7420bcc7ad82fed3c1b131fac61c6aff72897c9d01cbc8e3e298a00e480e129cc344a236a38bc6e2616df6abae7c1523bc294e4853441792d57728aa18e234c195082b140f8b73d751f18e209a04b2d246df6e50e78c19e752146d54174a780414bfcd8ac2722d1b642df67df3126720a5e47f9f3749f790db51967dd570d05a50559f8f2308532720ed24d2da0840cdf964b575daf006cb5ed43f0f4d53c03f0962c7ee926d6dc18308d79b6956489fa64f7ecf84e123eeecd35f91fe55b3d8a62828db98ac44a27d72186deeee284d268d951fb1a5413bba5d9885737b54b19fb039a29b2e493bd6177cb8b8b6cffb5d130b4c9653f1ee3046de38b05db5966be41298d0179713bd666bdc720a4892d6656f8abf3d8b0f072d070649f09080f687f63c1ed34b7384c3e6b0bf6c18807109f1cf2fa67f3bef9d16c1ea1c6bff3498f6492b1267170f56c789b957ae4561f3d123af3600beafe857d945e7c8433463dc1e965b03ae85109ce253d331dfa4e3332bbf5d443c29d1936e7fd37c0bf41226c40c0d4c3f8d923f16cb9c57db5f1ebdcefcade110f8b40406d8e4f63d89b86ef0a199d8e21b224d3394322833c95ce1c12c20c08dfe018b4c1e5dd42c29f953a1f6734af19240f4632d01bd12c897ab7af67a58e7f75430a8a4fe6ecab10b4e8bf556e4c82f1bbfbf875fb5986293f516c9fecc4cec5bc439ebfd7e16eb935f111e5eb20012fd5b9f0f9033421c1b6836560065d44084758f3bebf9a3db94e3922fd9a1e4d3fe7f334225864bb23f7b9a8597bc0e627669a8e7a748c09b83ee7b26b630eebf43485b984f6fd7865ce6359f7623d119bf6e645d34e58e2fc7dfc1c1d4baf8c543a57ead500ce6d6a38657585975d34cdd9bfea4ea6b2b46243545f914f8f08d8c1e1e15d3b0a6884813e0947ce2a3a53c628b9fe87e509a0150f32cbe9d2e8b056c2429538326e4bfb499ddc79dbc203f1fff4492d53b02eeb9320ef3195dd7994e1f8c1f293c23a76a3fb13fce83dab58ec091e667b16cc1c557abfba1adbc852abdb1960476099d3b01adadcb883c1023492aae49404338730b75e4834e12c3a3573219da09d93a296ae4f6b7f5b127dcd245cf2549c714a24ba6f411373e1ed0be7516296514a96c6ee3c3ef0a4de11b38ba7c6cf9af282cc9c45b69803e45252a35c5c4cc950bdb4b1764a371a103a0454c7d43a1f60a2ae90b246f9023a2b642382bed9b0c17342974c85778f0fc67fe577bf8d1f944fb70d7fdbc589547c5ca4221772a83e7636c87e29b9445d1186e9b8ad585f1df53b2c92f788251689fe36e5564806ee450c36f1280720d6147c027f2fcc715ebc7ddacd1a016730b03f637d519b31a17d691d0470eae8bd36f944f21317e1bd2cf1c27a8b00bd7b9040b88341dcab28c085564b7a37b6f9e9faa9416db9d1e45f25056c49b8f81520f0382ba1ff8b564f2b0163221e13b54bbdb745c8081cbf9d5a6d94961862696e973f84a009a309e5b6c4dde339dca1df35a2d7d09273e32b59fab9863c03685cbd98454817f395cb899b8e4a0650990d3bd7585807853f12c26e50e1d04168efe08843b49fe8331c15fcb0b7df197be691182aab05bd0de73f9b45fe874654213e93079b68b5515a7db956066df092ecbdb50856aa976e3434e7e0c6f93b478202574555744ad7a67412f8205e6fb1fa7001d2b8a78fdfd01455303b797b450d895829a4d5a2ba62b02a1699a8853e8ceff64576084917b0b9bd90a708d8c22a469a245c03c9c4e8b4d608535eec1c0a8d28c9d379f8908c7a87c2e3792c55a697ceaa1530f66e05aacb55abd2c5e8c4ece658bcbc22a63e6378c3b129887dca929ae39155d9d2a9085ecd049f5514f8eaee2a50215fd10ad34070b4698b316dc88a65f651acaa023288aaf4644f456c886a896ad93a369334ca22e6370f1ed929d48417e0aad3612bc022e0ffb52a21d1fde6602e1f59da088ee4558519551150a59fb4baa4c05bc67222bea465a8cda8e81f897d27dd35dc091c96972e69f0e0744932bfa36816796d83262378ba47ceb4e25915c68eb21d1d56840d6fccc3c681035d0a16d31e1581e10ac338f0db408aa5b29fd4b0ad1b31536c5a0995a976bb165d6ac0f90be033ba95716b36a7482315a9cc79e97827b1abc28dd232c2156f70c4d1a3f1e7b18b5ed02ebffaf7073bb015020725a9e26fd291d43a3a18f2800f2e61b1f38e9b76f9f062a093674dc951eea14732d2d2ac93fe0ebbf79f5882a7aca7ba57e0290a1ff0a15c5a1cacaa78d6b2a56bae3b79a1becf7f837d8e4cf9ab559e08fd3c8ec1f34e48ff4376525defefbf46a85f2325c913adedc433e2e7a4078bc5e2fe9d90b6f62f781a914127744444b7ba0bd67e38b03f38eb4c50fd659e75f6c0983368ffece99a2392fc42e23e8f3b173d7922ef3c1eace06bb8748c0aa13adfc19b2953e196aab2b7834dfdd04f0520c03550bcf6df4ff5bdfb7ce30adbb27adfa0ccd0e1d6895745a21682d5fbe0ad39f5689ececa7d1bdfc8c1b1adb9286a6f0e9793671841244b76e723e94216e9a4ee6f8d2f42843eadcddf36912504bde40e683a38cbf970af2d4183f1c78f49d92b364324dc35b0c75c8cc00bcd02b8f818ec91e1f89df735f933e4ff81fd7c2cdbafdbdfefcb6d2467b0b5910aaa84a051780cbddf3d5fd52910d31be47256e5be39e40fbac5965af40d199210a9f1b7e81ce6c47a4f3b6427ded880db6007a2bedcf66b1ba6a7710dfcd079f5176a00fccc25b12c2a66c371a271710c3dc70cef254c0c341daccc062dc7800570be1c12b082bd63d4c1f2ad7cdb1f08b5a30e1b8973ff18040cbf1320f0d0e95b564fcc94dd68d97a455e464e69c1062b85679623266e3183c94e06eabfc4332d634e727a0038e59109ba347ddee28c068d74134992420d2caacc2c1bb8cf0d8f14dcf8c930d851b08ef59fd13e3ca3c2466cd912a0091d2bceae98f102f065a8566b5068b2b1f5da2edc7406d58ef240f780b45448d432d8c780d68f6d3e0b11a2c07fd6859804c8e28ad5342c666102510082c025e0238991920be52b21a3356aca954bd6eb9e39318701395325c5930271206a7b6871de2a5c37037e45e07ad5c55624f14416063c160012a0817da1134829299e3e370e3181a17c6054ffc56ccf902c36a8dae8d5c0fb6e9ce87d395963012805995e43275268ea440accf2617620e7f14573de637b27ecfd117cc1e1541bc859cbab0158238c5b54da9561aaba7d1875a62264b7650de83b32e588c3f0d0716acb3a1ce6e6cae2a080bbbd4b3e5b3609234c41de6681ccf7f04eef61c9030cb22f65473feb7fc878a5f7fd83475dd2f4b3ed77815ac595867cdcf9a9060b71672024ae3609cadd62d5cdc24483325c58e1ad90f42f012adeb74eacdc1e8021c7470fbf122618bad4c88876ecabe808d531a85de449a8271581be4de728f73f02db9adc53e64d674b90ad61994a4dc4eb16d5e3eb8c20e997247413a366156a7a4edafe662c3c3c0801fca05799c4f878301ab0e9c9fa6cd40b3e092b26788189c625e59e2f69273501502c1a886cb454180812a93f269addf13657a67e282b59e06c27a0618c129497386c99379edd48c6b8a8a8ffbe982ed66f201184e1fa0d8141168211ef4568c4c4720404c893fffe02f92879edc8ceca3bcc7fb6bd62cc4368fd2aeeee7f88f248694e8e7afc4a5c0f5bf8d61625ed227a1b1a0b9e9358b1dcf92f2138fd483127ea5046888b389201555cee98439f08df19745a69e9792057a21b1f4e75e447569916d1301505644f0a8510e970fcf3427cf22ce6f28471d88cd6bce768ca7f4d0d449316b9581221ba501aa5d9fb58fe4d84bb068c8f5f20af2e6fe3c0a3046199a5ec2ef5d6486d7355a76cb5f8790b3415c0931ca7b32ca065e36174280a6ce2ddc919951a7464ac6a4db61ff61de1f8e6c89eb23ded61bf7ddcd32a4fc7db45d0d9891684cb414f759961ad5a41ad3bb14186261fced6feda0479b05bd99a78d639a3066df1f5b08dbeb0c9c27da8f7744e3d98b9d4082b17b10a5f0593119e0cc63c3cb48e253636ee70b3a84faf0876ef0b387670e641b5fd2577fe838c920e2e9b9cb98ac698c832c9fd54f5fef3fff77c06c41cd73346751d4a7c70fe5a4e41a05cbf9bf8fa4edebe16a52c4c11b2416d30537691bfeac03b28c85341cff57c7fdb21bb1858d14aea4e4a0ebd69f1df88770e2dcfa40450ecf8fa3951eebbfec871d043295c0173ce751af4e0650e9842a69f58b0a1a0a1e795cace27e05a821cf4dcef531d31d0ad20f14c75352f6c4e1af3d57ad52fd4f57d52992e2ca6bedf1a7d7a8e97ce59fccfc40976264c844f881b0cfa9c107f351ef2968e53f8c84ec5db6e40adce48a63ea09bcdced80cdd57427f643e15e8f862bb02adf726031fa2653ddfa1a30f9af08abff25da4b45bb8a122dd3cde29cdbe1f6b0c24b32a94fe483420c91e8c130fffcef401fe8f9ef0451036638f6650a337da5bf11d1237f8216be2b09f3c233672c1f87a57ee27fbccd3e828b72172c5f2872dc487665538c96e1dd72ff394598f69e5896dd3b81946ccbd295032d9815f83a0d026cab3c541a1594bdd3e7818b743047817e7dc11d50b0d01751be0525324fe270d7e917acb042f3a35ccdcf27b9497a9a4218908c3ba264e88b02cd43e6b8938f3c13f03b02047125f5f327d0c6e2125eef895aa3d7e66013556a4c56cf3494f20a5a6160048de5ff8e33f605367c062c23f17ce7f489e6d517ece617e1883cac7730f69baba2760b71484a2723a5cf6aedbe68a33ddc3ef7791279d16b785e094d6ffbedb998f54fc060699a373c7dedaeccbaff5c696ee854b6556e04505bfa761079b2c0cad0ab2cafbac49774a7050348adce7584e07df446ee95aa46ef26a6138641b099895f97c90120d3320d098259e62c2ece5025322272071f92a95161fccba3b73d18f0485d3ac91bec90df3b30dbfa6410bf50aa7e74364bc4f71797cfbc681886eaa0621159c0707262a705c8f42cbbd165fe83d4aa3ef8686dc3a603e7c4d192587fa809a7c19cedf30cb51ee58875b508918bc411dc98ff163c9d7ab2f12403f440f876fc5d14ae2cb624a2e7f11c15fa9f49105af3694bc88fe1b3e49997df81e58fb997d339fbbad324e626a583282279cdb5daf409bbeccbc080f91cfb4c576722fed3bf574d918f7846d857245fc73457e6532a1cf991f0c9a41429c3cd33696396a092f4f5aa84ee710d89e9020cc064c670ec4186b427f2c1e6cb6555d4822578236e48d70ac0ac04ef7bdd330ace409a38843ea2e4ace31979df7eba9fc74c35c149c7c6a88b357b92c1b75d59d512013741b45969c54bfefb89f7cff1c35d858f0f1c2a2519b46e33937f56263f6b9ea349760dadf7993966e557cde75b29ee0cfba9d3d7bdc41aa9cf9541695808b3c7833d3aab16352fd8b749e9bd5c457edbac0f92d4cf71a8d96b47682a78edaa0d467ebb9f355e6ba5e65f9c7ae668e30b29dd089ded68f6b2df10fbbe472617596fdda6c8e00e664348a25d8ae7cc4af4c7fb7ff7368f3b1ec0cce33201ad74a300c39067802f3a7669db71d875bc3afe73d429f74eb2cde3d2029fc82e867610dcb487ad1df03d3a876e38c496bed99c4bfb9eb321ee7ca7c8590839b66fc3a4ec78c335bd79153afc23b0a0978f052beb25d714aa11caacf44d80d0b8b97741b5bb84406b7a69c8d57acb06f0f064f9aecc4de8a2c2b95f1d8b8b508e9da3ef637028582f5baa7411be43cd8b143887693c4d2b0c7ca28b3efbf27bcbdcf19be83a27921ad519a6e411e9970957d04374d9d60f8f65774d1a760a9c1eef61ae07a425e66ca735c7cd0ba663982e23600c8f8e287586cd41f1a886d5c21b03a283976332da9781a3ff87885cd539b0077701406a6d62e6515da9e2a048491f05c48a49f0d0436c6a10b36708bcfe0e2df91f851d7343b05ead9dcceefab81dc74432b84687ffcade5b3a5d3ba8744fa58d2fdcb4a366191ad292ae840b9a71855db2c1c3fc2a88ca0cffbcf11cc12ff71192b37b5ac15cb02a1b8247516c52ec9e7e1a0bb82aea480619518057c8ac85799c60c7ac8fd8ec3eb611a467c273ecd9108a56d6029db0420107618de084edc93d09c83b6232f5434949898ae9f826433eb3fbbed52b1509bb48cc084c5acad143b0d62c03953bb0f0a17b7e5f7e7c63e538cb505172b98fff2e166ceb5fcc525a9866879c87dae3be5ab65e3d8d5779da23cabe64ccdeec47d382475412552e0541d460bb19a65a2356f27acc394d441341416ffbf8572018183ac46cd1280022115bb1d51b776c61e005559738821c67226b73beccbdd4b6ef9eaa10df43f76d1d4489c59eac32c2c6977ef2157f84ff7a1d719fb681090cac6702e9d914d36aa8d6b5f0cd2e6378bd83d943bbe8376575b3cd78a7ff63b4424e9a1f7ae415048ecb6202aeb020011108fbebde7cf001c03300ca0135a56044f35a84502ad4e68082de90e6006ef0f5e8f0d1e6480d4025696375cc8dc4e9fed3799e21edd5138d627152ccf01e411dca1f8a83deac5df4ae736aedeb315b8cff43add3ebc97408300ef9c59d20277f77a5b023b79f6979c1f13f8090f613de7b6869cf0366d9cc7fa621b1ea57a83fd090ef76c3daea76c43dea3c9f91b78f84da99882f6db30dc984856055eabcc486a2a92919bf9c9e261a2ae020f53d35c8397e8b5d7fc5d3534f5aa68ce4de91dc068d8fee3898c95bf568b4eb06445d9e806805570ddf189d08211827e90559cb7d4d2dd2b9ed79a2363cc42c151f3077a339b3e2b5512316f6f3e4a30921af1d37ef4c42e1b9888b700fba6ebd4c7483dcbd6ff67fd50fecce49f1158149a069dbf459618efb2d401fa8109bc8a305dae68341ecd47146d2345df8f70dade6e8ac94f78d7b746e660a1f93fc6bd68b288970c507fec3cf080a66f8b7e45ce19bb579a6cd4ecbf97976770074c45be6f7b3c9fd32caff7bca21d921ea418cf19fecfd45d2ec28f8dd8bf4a4485e4e16f07635cc1ff84a0a0baf69aff2f6df0e27aaa28e13add852b72f69979171b47ecc62669807c24689ef34caa5e960c56b802be3338cd6f81b781918f17d670d4ed66358fcc0bf4341f8ac9327f340e67e400886ef9ba03330546d586b71068bcd17241d7270886caecdd8db48b953c1a2a9d4e25bc696684801413a57993883018f478c4838160f4b193bbb62b401cc4f9b35e8388aace39f82be8a9cd704033a7c68c657bb1034802ec60969e1c3f11963c37473c68a6eff74dbddb4e5bcd8bcd8b00f8b0f0e4b8feacbcf7b51bc5ab13675e636dfaacd39606b38f1c24cae8765a027b26dd44da7ef872c20bd0d36e8559f372c6dce3ad666c805258f92336b79cbd96340710e6b1916d0f391804c9846b8860eace1a39cde73784533ccddc1be5700c608f21165eff24fcafe7069f08fdaa371fa84508bc1ce1d89c1c2beeed807e77603e7716dd0cc9824d07c00c829d82eb0da413666f2e1b0eca2ec4ae1a36c2dc6672f0b2ef442e5c0b18ffaa917fdc17d56ceb3512cca352d659dbf9b8629d292cc1a7a630c2648b0998e1b3c3b9bc169a521a614138d89f579f4e7c2714a4f57f57e38730707ef9516f753130d44403af3a277cf413dc3f762aeadb0c918fb1896acfb4c189cec9c36b4671d8803c5be4f1cc12d1c6983e95d8f10509c1f9a61b491ae689195987e856931eb384db3e9688029d3229f7fdb2f27e092a098805cb6e1a2323a63ff6c58f370fbcaac70a1daaadde1c5bc1eb3feb0fd6e68e44fa0280a9897cda9798235bc188622bddeaa401af18f60e2e9525250db8c7e56dc54cf00f4abdbb9a71e00cec93505a1285fdbbc5187567f5acfd81e5cf8173532db56da124a29938b7a60aff8fed7f4bdff67148cb38c6ce416e21c36d0398a1455cd037f537fcae49fa79de829905732728bb1ce510cefc1cd6cb389fb3e35627ad3767e89c03bd2ab8da14c69f08d76e7ce7bb97d941dfdef5061746b857d9993f835f9e96075ef911d65d05cd3cd09419c0f2efb7d9f05ee94528b1cf6006f30158e70a751bac1fc0e9c60c03c231ca8f8f24e438d3a3f3e2b39e6795a452b6d870c0b1f114ed9f5c61c267c4a377600b301b50cd29d29c585b386f9f7439b375e6876d44814710c1e2961aea3e2d23f6bee6077d02b6494e67003cde03953666a98f259340f20c7bbda9d183eca7e0eccba974474b59f00fda4dc586bdf7c3f330fa1a60464adcf296a057e58d090a406253483762ffc07996fb9ac58672030d46deea411067d60afa0aa30082949d64497def516a58d0e490c5cbc86f11d3042938f47f85cbc7ab6fbdffb418fef709f5e52a25cd0ebc5552b1ee1fbc81d0dc764b3f87d06b02e49043395e7ce3fd95393038f3334b41dc55e0ccd7cbcd4d9af5932f58ca0c3ef9d34a670956596bfc06fa066b0a1f2514c4d2f8c228a17c7ae2001c967b200d1ad2dd1f96cffa2edd21836bb2d4a7effba7c99557e14e589f79d6679eca9682f1ad1d2a502b85e6a682f3baaf030bc79814dd5cfb23a65a6cf76895f992fbd935f4d3832a668799d9c55ff087c8f07cb4faa8446f164ba5868164d647f95818287bc120077f3704d6a92257ab6947f809c13bf407ea1f26423f41dd980630610e391b6463c8076c1474e267688f1dd068b5a8563bf7b465d39d8ec1ff8f3a04e0ffdb4fe1612ade3cf00abd10010af1570a6c690eefbfaf256ee7fe32d5c6489f9796bdc46ef0d5cbe7728e204a234d273060f61c74b0219cbe5f3d8da244412230276db2585e4839d71f58c2d0ae270c02b9503a1ddd54aded0afb711f866c0f46a4e62f184104eafa95e47872f3b482b3d35beb1f62fb1a83d35440b05395d0bed173b63fbe4b554f8ae7dedfaf9b0c4a415520446e8a6d93b55ec9c418a45dcc9ac5850b2105d813b8cb335e6419e2b2e1b70cb20c928cafe61c73da6d28ac82316c43db0cb004c52a833b51e6fac2a23c4f88ec53fbe0a4ad71e6e6729aad5070fdc393ed6058b627b4b42f407c07ecf72ab91c237b6345136849661a57ae89b3ca933c68dcb8c5bd0a549ed900c49c0086bd60c3ab7f5379ff5df1148f98e64ae1ad1c24cf0e6fae5ffd9eb852a718df05ee56dac13c675092d7c664d98641c83d45c39c913f9b063670b5dcc9c5adda2103bca43e3b2e36db3d3034056e672c5fd5325e193acd69dc82c58b366769484d6fc2efefa31733418de6b12c725d15277a975623540f84d409405441ceb02a3f84108e8b17712871e22c16243300b42462384f391027f3e03955f4cfd2dcdbad39464a647a90755dcca10644858434f2a12fba3855200a6d8ddee54fe960e70195f3b20f5107e4a1be91eb88f996167dc6e232031b7bcbc85aea537d5907c2c2ac0fb13037b96baae283f6e3577dec72e23adf2de724ac59f52d44ecddc1b6fdac900cfa7528c8371e88296364d2a02c585638f1c759d942493072717e875bd3accd7c5b431045a9ea9900b9db2f06d2a04bda0088f73817ed04b7be29370439d2da35708e2898bc5d1e8434a8b4b012d971087269393e6fd0945ba1ebcd4c687c8ca50eed0767707f7c8b979ec26d2eb1f05620381cc40c537248f49b2785f133cb86d397b8257640dffc276e9462cfd1dd4233f7a95cf01293460543bbb6342ae6c798b95c94838a0bf01ea961453bb899edb63f59e6aaccaadcd2bc98bc9fb30166786921e809f45be7fdded8f031efaf70caa77b06b6882868ae0474c4ffdf190f3b364e3ac4a6fd9f9c1bc2274bd7232c10e004bc03247390412130923c92e5c3dbbd13cd8f8d4598ea616448e8dd4f8195027c241ad34a23ce720e740fd702af0cab783832304b91f2c2ddd14d68cb07c56eb1384768cdf40fc68b55a8eda7e4c05d89475419402b1c3faa212fcb3dcaf9705f55717b88629d5bc7dc7ec3b4b82a734fb62eae974ea7ec1e939372d3fd6843bf3ae60c6fddcc7953a769f7c28766dd1a9039caa2b6fbc75d40b75d87c5c1fb91bbdb8db5000978ce03f7c78aea767600cdc74ea6ae8bb8899979a6b513ef5add17b2c4aef417bf8ef80527fb0cccfd8173f562c66603f99857a2d572bf5b38b7615900ff334b8c9f717c05a30a041b31bfacb9008957f44679bdf2e8de7a12c28739e0114fd40ba21db041860f5686f40a2817b86984f6095d4c63e513550fe0610ea3be5880c43d8c48740ec34b0389a0aa9507f10c7c5640a1e85c852ee202a3dc9546ea9531e90b25c14e3e0b16709497e9ecf5888ca573b30f9f4e5a4f4405fd47fd3a6cfe3410ce724d1baf3117a5b6c8ccee50aa282b8e1b745dfa940e07fc8a8af4d2107f3d808309822774a502a8c774d0ae71b19a077bd704211756babcda608e0d080da536d642428221ed66d949b4d390b44eecb73a7ddb30c66a11f7717f70800fbd11bda5db75cffd68c001d2e7b14fcbae6475142fb33ed76a699ae0c5c2ae54f8c2b25a125d1936e9d707b0c24dfbd62579750d0d1d3c0a92c991892c88caf91ee918e458fb27e1e2fe6b462c873d84e37983fb810cd76204e8d328759a1327456b38336c22e0f34b468807ca5fc79946337fafcb87b06ae8dd93f44bd37771d3eb805d997e9e66cffad20ec9390d31c7d9335c652fb9c195d8f7708b7d3c0f394f828e25f5a653f6ef00d3eac410f65523a9448c30b9f7c8a7752a078ea248be98036769a119fc97909180385d6dd0b431add4d463816ffbc5b72cc680d2b859491499cc680474ad490b7e030ad92e20bfa2003d6f2e5614304cbd4acff73a3565a6afc5e832f9c654a53c645eb08a7ef13a635d5402fc780ac0dc541f1c593a3ce01e5b09cf93d664215400d3fa3f153c44f47e50ef988c73b4abde12e46d3b7b9197b6353204f19d91a309444a528c9937361dbf0f4df64a1e2fbd65ee327cdf5a9bec94996d30700aa5ffb25d664569f736d85cedff8d52c01f623a3f08b6160a3c6ae77734a1a098aee24e2741c28e010788f0042dec0653dadf42e945ae4ad1a18a5b44eb0335deaab18c19d04060dc417ce632aec07f8c665d8c7f40cb0398b2ad685483051c50fd7c580003130af0f687528f83cad622f55ee82d20de0f0121d0eef55d3cf194d91c074fce47e1e9395e4741021b2218996ac9ff71d463a0f083d3a013d61fcc7eb3efb5f915caf4e7af380fa968448f2f00841d904ef2422db4794771c33aae3105f6c9c4176480313f6083cc9357d424af6e74cc213b8186314a3c6020ad52a825ce16027342e446f59e58c7055633d468e1c6d4d578af479390d9c4bb7707ff4cefe279125a3613fed160f8dcff7aa44776fcc6d3323e38842910ea3497af7e54884712f4fecdc356f63752ecb27aa6be4a6ec6380a2e659be18d4f68d4d9fed9e5a8789413c52171b4512be72c62b9d7ecffce452a63ce3dbb6ffe7274b4ac0732cd900e281cdcd95b5410f126a3f6b0bf1fac1661da073b5d55c5423b6f855ff562ce88c0e48b523dcae35f47ec573b5f4d9a168bd469eb9c5eacf9f6b05743ffc6d643082cccf52cc3a94a793a844fe40da8a768c240b82f78310b1a03c5bbf230ffe3646378690d4687e4f30fc06f5310a1027e570be311b8669987c9257ef5eb7e7bc6850fe0295315275e6a37aafa8b1e2e5f93dfb46dd10b43f4bbf9141b116275f01556668f6c3000d3456f49cec0d7fe65a1e113d5893f0848b0da91b3f1208608d0452362081c5dce062d3e7c303b0b40b26c67c1a64304e8e56e1b921f7557650bad38e59faa5c9d741ae8e1fbf504c067f8b1a4071169c77a23e610dee5d87e52e3f7f2cdc9889b928ef06e4e2a78a1785ce1c3d4fae09febdec70c1fde4bc45c1530a4d106cf83b7c7b31d8b7e1f318520ffab2d78b3a68d7f0d28721c373606be86b8ed81b8e7b0dc0b3d5e51bd3b9a10f1947e31ce1514c95753893f7dff997e8f1087993118763012ee3fbca81edb1d72c413a856f65eb13d7613b2be67efd60bee9022b52cbef3bfcfa3539c987d7232770f142df7bfc557b977dfc157cc3be421948cbd6c91fbff204404172481d9d8837f127e7b7da2eda72fb9fbc224b3f841aa948e2d07989b3035c12451be793239f192bd7718137cf4a065c5e3603687393704326dd4abce59986f9c74c59aa6524f6fb490549e8e9e9dec42894d4e5d7ec5de75a538d320461be86979a201264f33f251c39ed65ffa74c57f7bdc803f0fd7b09250c61be7796b41c5e17231fdd706fc5adab8eaca494cc5f06b205c105ea8fe923273db5bbdfea62c3babffe72e5f49b7939be7a9910c55c8e32dc7987ceaad2c40001d5d458728e6a3d676a4aef296d7c3c255ed79a7e56ac50e9c0a376210be388a8676e121a7bb7da61d5ef0c6fab88afed2bf02e33854c43e8f14f1b7811021777bef2cd3f5d965979040b6e09d9fe5501c1612892933f30d23d529de17ff9d4b4718b645eae623f96833ed5452c8ed039a50779bcc665439e7db8f59fbd1325b36fa741d0079c431c1c1db25530e8cba3a7ce0e1bf48776260e1425014cf9a86ae30fe6c5a3fd0144817d8066da3b393514d49d025afca0c356f3e2bebbf8599632b4df74e8e8c52350edc41cd72687ef939269764f6c45a45a3fdd73483778f22053a1d9fd82fcf549d308a201d8dd126347e405a63851cf5554dd6459b412b3e0abd19f9fc9bb42614f1ef7d328e919991d3dcbc8c62bf7971ac9c82ee101a7eaec4e40398b264f35109cab8514d18ec1add6e04f127ecbdb0e8f34014ea340b18302538d95b8a95566678bdfd03213b0138676c67693367012f0b520bb3113645b62502929a944445cb53b08d1915a850e0b18a2d05679cc5c2c80e6274b638d80bee3f1c67572ac9d4b3e6c6ea95606d4c3bb83ba1e4945c240f5a1913ec683e8e9cb4209e3108ebe46ad5b055274bba1752fc606c2bac2b0c6128ca910499571d3a0b6e4800e42404b5d8ce49128d14f5d402f7a25bf298bd6ded4f8cc1d17bbae658bb05a8b69d3fabc7ccf20e173e5b5fe41d3b55dee8ddccb15e65b40126fe786f84eb4b036acfb74311f884548179b0d88dd246306ee42df5ea5913dbac269594b8fe1a0d8f0c4a39cc402846ce941393a7e4e45b0e2173dc1495cbea2913c46467068f06516dafbc78653be054e8d772793582e80e5573e00339041e4788185530b4fa7747d1b236c25581ab3462a235f4c7ada43f5c032e1d63651a3c81bb45f3c7fdf2311e56fd6f2b2f5eba59daf453d338ef5024141ea92b94ae2e79043088880a099a45209e52dd812415c90debe3f1eaa2a3ee8accfd405b0c06c7057ac396f2f92381b338893405fd2b4be98a37a1a9d89c5df54c54e3e049c2b1f8a42af8a58f0cbc272d887e89816b21fbaf5898b8e2dddc58f0974c68f3248ed9f7bd30b566b478d5a96f127eee13c13b787673953e0713a76005fcaf35ea7d3da343da225496a3634f65c6b6a4c8b8a393c9425af20fed69df27f6650ceb5040cff7d997c3d7e722792722472af730b8f55791ee78de29414a1deeea4462be62f9022771d1c61d30739f6db1bd0ef78f0aba2db2131d4714f7f1760a5193b1ea823aba146ebbd1f88d43f90471e5278526966f79bf03a676a11839f4a83cd80eee6c2604723eeb1b4d4b95538c6fa0067993d4bf8d0e6168c414112698bd7b3a35ec98144f245a99aa827d9121c92745ed7ae8b61475f5dcf69bd21ca4bc90c0038b53d5d2bcac6dc8225a182c671c7a3efec9b7e1387aa14f56bc9561feb09a804797f08a42dee6dbb652e90878330701cab614b1efecc9a69204ab859be2826aacd9a27d579634ab888333cfd319354c7f58c6856b583c536a5f09638506b864146241246f2dcc884cb61fe0463229d78f6f0af3857d09c022a59f30b4beeaecccc0bff4f6663a0e48d7dedcc8ead42ec383557f91d86f1e08b3d42fe10605b22e0c7280c69c4ae670eb61c3cc5e7f6f15c5f9f03a07a71ae2511c7cbe54675926f6b96c06b1f8aed70724122b720203d6b18c6af7442ac29f87d33b666743521c1bf3fd36b5d0ff730aea22e5d664280116832f8e16fd4096f24ff6624571cce426066098d5af78d06da04050bca5b4a060faa42e0bd156557f1600ad9978f52c3cd8e4a879910e7c320b971e61b755a2b930f2f150d9f548377769808a5afee0b2051a677b8b0d4d0daec9bbb78cdbc4d623bee1e224585077c7eeb458aceb118ce1bd49e43c2c578c11e2d0c6421f57380d496442893077cc7f0db3b5421d784c86c45f4ade46ff8a008467e4681126f6e4c912778e0d10f9b7dc4bbc4bbe4a0674b1dd0fc83705171cbd12a9f6467806d10a03b7c887c943237333891c99b03d6eeb0466d608ddc9ba7792cfcdf5062f06be7b6191a6572e1a8195aa1bea7abb550969534f05b369a4e882898b79accf58443d5e62c476898c2dcb768f4f348d6cb36b9aacef65658d2aa0a1297b734990108d0ff144c06ea1e9d3a7a79ed58fa3e1745da88a00b4adf3da41ed247e8d61dd98dff68352a157fae7efa20c175eec2344b088a00e030cd14225b4a4c4fee992c1fa7c64647977ae93e2474945178c9765a649f8f8549305e0196068661061032a37093f304c80e11d44eff503e3473bb1ced4d820253f109972ea4794bd0c6bc76410c1be9429d62d360b8ca2b525bb573c591988ca65452ba3b249a03c7d5199ebcc3ba3f79f0306841bdccc34623b5ec71737d06ae1ad642ec13ee393f4741a33a667dab704be3c037fd20a512b11862a897a33813738693e7920a2484f0294ec43eeda8812b5af0b4418387c53144cdc4d9198b803e933dbf23f6355e9d372589108e12f4e6c3c32155469f5eb601fe8537a67dbff3b3a24155ec66c103aa2979cd852421ecd6da2468c03729fe06b587d949835d7a8d5020d62144657cbe1e8db1162206f1790d898a8946f5535820074afc2ae6d3e81c7c7de63ab55ce460c56c2fd3bd29a366f3979e4c6c1910e9d9c9e4931240f6e8873a63c786aea91d678cd96e2d2400d72dab983c2da1170bdeda68bd359dc2f098479a449a62ac3799fdfc188afd96f8cb74f4edc6ee227c0152dae700c436082842c265fdbe48dd5d43f0e99e8b0ac4c6ac640ff3b931a5db2705a3a1f4ba6efb1a15c649eac8230930abae799eb8e2044df54f474a6165c47953d5e9a0dbdec4aba69671f15c776902794dc8557fa7513a33751b3dfb4499342edea0e97d422d196afac73e35e03dc38e2652961dc4dd1d46273574ca5c4b3d00f5b4c71ff7471e4626673f8cb59a27b9c6c8292c5606f7333a539b7eeca3a7ef2a938220315bfa5bb8f5b882723fb7ccfc19250b8391d431f4d1778dadfa3666e65db2bc5deae4a2e02e28f07aad2764d272efe0a6fdc3c0a3cf3808810eeffb207bbac00b5c0870a07283065e6fbdffd7f7fae1ef12cc9fc1eabbef49f286c28cb2cbb3025e866de0448b8454b7e744648750ca065e95579cc1ba156891bd3cd3e8059d2b861f9485e25c186263956337ce10619aaf48aec5e20a5a43524d1971b6200718c18f9a73b25e56ef73f3fceeaea66a0d3c22260f4886714feea12b51e23995dbdde924e184f8d5544a613e2bf43b1ee263a594f70ca88b33059a1d04df485e573b6f37bce6f62adae609afba7c489b67436e5cf91b6936cfe350441439e074e6a7acb27fcf33bb7bece54650d601d3f3f7fe6637504e5ea989001eeede4d6bb988ae749aebab31a933df7bcf6fe32f450b11b76813c2785ca84399329697a06aba3a4d5c69ce27d3985ed318e51908dec231aa343afca754caa305b714f8df450381e2e9ef5d8a11329228775d7cfa59c5b065f36fb4cbad2c0e7282e0db0891ff35367f512b39308b5d25f4804487e40dd9a00cfd71d9c3bccd5597287ec39405dead1d50d6904ee96629b0a3756f30af27d9ecaa8c937f99a1d70391834e10317d8e00e6cc09b4a253eca8fe42e68e1098d4ec9eca411e015aff630791ba73035858b2d043246f0139fe535fb1baf51180d553939dcc56ff930e39c2bcf6abe5ed7cb15b4c6a13fc95b0475ce69896fe20c6ad987d89e5562804f1abb452f2d9dcd16b5b7a87eaf54411ee2c48058d08073a67b21a935840adaf02496c1ca2c3b618c2432f4ae1bbd3e66b47a516281cba014abd6f58cdb590238beb88544b8c21c8b6b6a0cbccb34715fc85cda581604ac8822a1ed680ba9a5f922850f12b2a6e51ec2da7d557e14d729322db62739129624d114ea15c16027bd9248cd706d73b984cc59be405b25677b91f60d61c3aab7867078390c6a0c7165e6cf1cae47f9a68046ec85d10748fe4cacc3662f60397e856042c68f391de94d02cf0b62b2af4eff67bcef61dbfe0b62f061dfaf74ac383ac6713b4c1657abcdf52467fc4bb1b8bfdc25af84f6286864e1f695fc433d2d40d7adf5fe5f55572304c16a20eac4aa45ed8dc1410f65464b82d20b8587e0eb023324cc7709cd39bfef1f9458ce0a4127fb441ae3a7dcadb5c41e834e2c50b49297bab7df75aa39a17ae37d7441915c82783ad0d8fed51ff672f2c54e77b0da6200ed46cd4bf377248a505066426a17eac38ccafbbd40603a88e4a48bc596858dca7631d4aaa02fcc964f60c46a72e9a9f649e90926a4738292fd77f27696de0eece6ea6e89075843613fd5c5d2a413795c6b646eb9ad866303c9e953a89712ec529a41abd9d105cb0e77fd951a7257d5f668546204b2f128799dc7e662c73138deda8e5dc53358a67044e256092a5445f23be2e7c9dfd856439861cdbfc25c1993d861cc0aa05a2bd1e1a924407d85fbdac9d6eab266aa4082a751bcab26887d146e5ed381fae7f7cea4eef8c619138d470dc2c6faff92a762bc1d3465f041e1ff32e1611b303b2f4e49ebdb04744f8c96793e69ae0d27a915a4d966e7977d33af21b425132ad6743f6657d4cd6a786a7b902bfa01c038af536dbb3b7f0e5dd210b29b3b0d3364d57446d131de5510c0fad9987c8d6e0e1d81ed2a46128d778eca411b49539eb548024a13e7477d9a6f1a6cc3dd879f3cb2c89211594b0645fab966b05188b2d34a5319682b1dfe544a9453dbf4d31f6cdf9c4c2ecc27ffadba746cc892f7d2d2080ed858629abce0ef50d4771b8570b79ac764a3ba03b81436a25f4ff4a9b8bc928855c63fed5cd8679a68268751cddfd823cb78f65d74373b2a70334760bee2748c3d55a0a683e00f7f263924afb67dad80156710d28527310609baccd156f6c99629ebd3006aa8559f63448908188386caf629a05306aad3a0fdfc5135858413a3b296a1f1a75a70e1873618bb23f639d267a00c0363046d1d0f6391499d4d8f03503c4debc0e6225a40f20747ce70d8f2b00ce6cb04bec57233433ac958a570759f7c43842bd0c8ba9fa4e798d373331108f074f319f2b5f2771cea7907e9b5a8d4469b9f8966c2b803b47f080fcb5318abe4a0050d08941f0fbf5e0a20ca4cf4731f7263a1a8b7ed32281303242694f007e9846c5fb368421272e06a4af0da5c452f21f9c10acff627e0f106cf1328030aee69789010b87f1db4796e57f69118c9e062d80ad3f06d65c1b6729f6eef17017521956af10e77d6cd26985e5c00ddd29db6cafbb6669199dafb158af4e34b1a46736994323c3e2c09ae7f9340f955494e2758e5e1098967b15cbd9f46058f3ada060ee40d7191ff0930371c6c8d9fa95d593f07f1c5fe1612cb11d00d4b26d343b5fc63548d41007f961f1434dcbb0b6b9562e67deb7b13e40cfe5f2df99c26f7ea7882cf71bbd092c9022231e52feca39781e50e03c8e08e760ff9d9a8efd41f82637e7f93dcf41ffaa7276dc09a91f4ff23c0fe2c1ed4bb5b387ec18809fe5908b283064db48a392f60e03b7eea7f0e12a6dcb5c38689a8b24fcb7eea8407b8aa97afd455cc1a4b9ddfd30dde064cf35ccfef77e8034d494847b305d9598337baf0a386c909e182e67f75bc9f57c58398201a794c4817d3837b580fd4101767ab197e8484e8875ced2d2373bfc30c1a1081cfb74b6dc68046d9cd784d688894cc8d5113b9d1196afa6cb8a28df82361c53300a003000a001600d000202a00800316e91e0f0a564ffd00da939301c9295966a752d0822ff881f14a664ac5b74fdd6f1ad272e38b9576c0b4bcb3f4fa1715eb7f21ef2e4bd77cc0ec89d302fde0a587e1ff9cd07a11de95afdb1b9acdfccce99f743c7765aaad2061437e72fec1559fbf84997b9d05a31708f52d674c775fc479f78485597be3d64d87668f771ea4f2ea9ed6e36783b110b3134f1e12c4bee6e186aaddd9509c5ae859f7affc40c4161df2678c50a5f8a3b43b5586aaea1200dff9e224c42442a9edd96b1302e7ea5f1284ba70357eb185c25963fa94823fc17609e66266a5707ae96df9025570d34c88cc0fcaf6abaef588bded6f29d3f22e03b579db8e1aa0bb317896db3c237893a0323d9c7d69d6f232e807bff04590be0a8fbd74486dd8be2468966ef68ae1117ae4003cff53facbea2eb97aed4c0dcf57b225ed0c3356be957983021d41c14bba73a785a8ca7ab3fe8f0c3889fb2c7a1c96cddced5e6040f2bedcfe41e98442a4683cd01550f49939b4048b432009d36ae8b4997b2bc783546bbc569d8ce64c761937b151fac08ca1a091da6e21a3ea69940c891facb6d6e7ecde2b55a439a56290e2efe33ad89a10dfc97197486f74e900861d0caa6e747a47f9224d33b9d6492d87f4bc42ffd9759247add2f39080e72e8e01ec567dbf83b708d59a351ebec73433a1a19b79e3f3662f3b8ba729afc4a57007e80f044bc4349a880616e71f1c16002b6eb08f9f01a61793b8c133e1f72f1195f30a8a7db4c037cdd850fa1f5014edbb0331863d1692d65bb4039d29d812373d4896f70420bc6a3744cb43d0aa2d5f4f643997ad4fd98cf81081545c2cbfbe90635dae8e75eef2b695d77578390b350fa1fa4b64f226b4be7c54b066db735e4bb027b6e95900091be946d33e0f37ce0337a01e0b001e202d80c8e6bd3d47d89f7585f0b668d5fcdb66a48c0ec63a76ed0766d576f695e1aa12725a40ba549b1bca02a5a9db5038407ecbfa2f05aa8e62f37bbec4ba2c60b43b29d5c3fed2c8ed617cd6165afb60f3696f04baa98647eed8efbb8687523deb0abbb48a85fc20047d12f629d84826dae0a30c7bbcb3bf3787d186d86d9c518718dfcb49cba91be9ce48fda10fec5a78d40037fc7078a23c59e32c8f5cdea85e02e24d989370ff2070ca087a1617fc81867bf855c986b26163deca5bc745f4a25295a061db6d4819d8047cd5545dc66e67ecc24af55fd00deca200ff46dd0c43aa9383ca05e924dff743af420182621c34a3b465cb7b5557d3cef8caa1a8827b1795c1267ada3f2f37a0ec884daccdeb1ee61d61edeb3677d2ebe59f502e99ce9ae652883786c1fe657887824aed13fa852c1e0ee5c4706d583a0d884b1b2ee26a030eb44e9863b5375823f4c12b980dae77dd7c448a0228aea726f4e5a8e11759554f8e6f72e7592acd47a1620dc3883d4af230ca975ca87f03ea13a7569f4aa63687eac28d6dcf83966a546487797c452aaf7d9915a649d01f690bafd8d8558566bad9abfed313e293023d1490207ce971d6d85742566568e1f08a802d70f4f2070acd5e2e8f691b955fce22b59fe94d49bf9817a29c58c74b91a16c5ee50ce7bcff5dd5be05bf250698626f290b9d943fe319d563bdfc712fab57ea2aac38ad57236ccfedc378eae9046b09527d02b5aa5ce8ea38b6b3586e6efa2d7224ab0de5b2f36cdc05d3bf5e6f9ad6921d1671918b8653033828fea71a9bdd92a4175f42c9f634055cc4a89d950e6809350dfe8940b137b3c832672ad4e5664f9ce7213e3848e3f7d5ee88be2e9fc17aed09feda48a3a3a1dc94c9ca45ba0e500f9dbe231e90bec78f91b89336eaf70a90adcca493b67b44c37f8fd6a7f21afd06d6164c8e8af28c726460fd46ef795727b8fb030e5230ba72312dd9abf5ffa5099c1d3d156e1ff43ee649857417fd628c53ee78aa6b8f7fe23fba21da1bebaeaf183803f4dbc7e4cbd9ac0f34a9fc1aa37ea20bf8e78348beadc665d08a469d3d40ed5c307a17140c418ece6fcfb70aa1e43feec6a49762c3504c7769f27679e5fc682a5ecc6749acc043fda3674956f67f1eedaf65b29da8bc899db6d48decb44278c3c0fe17de1b663f4dec396d5d5d1fd352ffdd5426bd2cfd4fe38a026c32314c11deaad8548ab284a6c20abc53952dff633f99fc6163e15778f72314984d5417106034b0a671ceca2ce9a2dba12559014c2039c19c399cc55a4849ab99c565b14b74c0564d2c49f04b910054af2c500516ec8f22538f1456e06a3f88e7ad5f3675bd422fefc03405d594171ed4f9684958f092a8d16c987c84c3862b900a46b92444dfcc108ea44e249a6568dd0b4567ea70f375a5d98c25f4b9ed900bd76eccaebd9c376ea35bd0e073ffb2b7260509f3fbdaa26dfc1c1ca92c0b6f581078d86ada9f1a539a5f36e7f587534fd73078eef37bcc1baa69253fc724d6336c7e261369ba076b2930f708615e32e6e52ee8258a0390d242506cb011c85766f1111b00eeb07a6900b9c6b44f1eed594386cc0301d223a919cec928f18de709dc7906cc6cd4ddda0bafc40e6147381413d96932e97f607c9067754bf0ba9578bb21363e445626ded6c67766f33deae67cdcdc97571deb4eaf1901deeb8f8460ce4e1830b6bd58035c1869862e5e3a55ae10387e61541eaea8d4d6b861e3d4d4b8aadaff30ced160074544f941648e41b72c165d3160538113e7d031de33d89c4aac68c714c13b32c5ac1a8673028090762cc6bb893853f5e2c5dfa13e9ecdd6cf990fad7067c60194b585a11a5e68a767bc8e2c0f0da692d2703e6bf1044a329210dc9335291db43d619a9f94589665dfaf5b59adfefe88004575dc67276a00cd40574ce6c608f0b963d53801030f0323bbef84767988951bf0075d5ae995f86c8affe0bc9898e33bf4496d10e00528e30d669095d0c0bb68ce281ff04fb968bdb2263e8458ed215dc3bb682c916b70531fc9c1e0c157859f4f8bfe18d65ca7676299d2a06a3aeb1e9829a67c904902eca0183f5aaacb1a14ee40898651aab968ef6b3a3a94a6b3e86b8ba60318c08721993225d72840d7e651f5f014d87d6d96e3817a3f9cf899a8a6f40fb39287c8802825df1d0e0cee488399646f1f78a266c8226a73111a6d60b32de2cbf0cba142a640496f90a72b44df20bb41a179ad6011af9bfad62f4f5681104eb31393280558fed38752617d6d43eb2b7a02eb3f50261f4262225a1c49b4bf6ff3f6ebd6abf3457862c8369ed1506f1715d2a901c633af4cf378f757747ed57ddf2c17c445b910d7f6cbf789cb609754c21beedc871aa5ded75ab19f994949d93d06b880788353d908854c21f7607480384b0878fe0d2d4bccfb9ac9d7f65d318f71d4524aa5adc74b49306d200cea4952d60af73b817151bb5119effb0c3bf9429b77c11b19087e89165a951b743e7a9688a7c5a04d813d414c90c78dbdc0425c0bfe9f1293052ae88df1b9a60bab5f7b883ba0c312e234eb026fc0c9869898d982a3ffb2a98da8be4b5308e94e1cf72938a5a7ca0034cf14833731a4959cd18aabb95177cf4c8a092609044b4dd5ccbd49760b6aac03edb8379d53283e0e47e5719b7596db74f6d946d72a6b2b523ad5162aab117132d50ba338c69be3ef4a1f62f50702c18eb62971b8fe5a746beec7b0582c8c127ae69b07f7e6a1f8f4621fb8c1b43b0d157d47f948c1a7b1250c776649ccc9b3310f26110ace85c76a04db80604b6dd06e40000bb691e6a3890966dc50301df01ef9b2c3d2fc4f419f7d72d711bfb9d68963a972859b7972e1a0db3e392b576ca6e23147a232284ecd9494a75bd0e3cdccf63bfc7bec32404e22524557ac751b2dc6aa33cc3929397ec75a8d290c2e0a82527eac5b62c43e3b384ce3eb5dfebeaf86b55fd457161df2004d4c8419a4b3d24becc1f17aa2e288db63b55a96b3416d4a3b2bfc9a6c6bb8c7c1f1cc0a94273161888d07a91227387c33d240b17fb27c8a8071ade1f11b4073e6e869efe27347e52aef54cd3d482767a30b846f6863c0ce6d6c026d835300db594635392134032552511f85b82150d57ab3ceb49c803916248c1ac1cff59c1cc29504c1017d1d7b6789eb8858c545c2f43f8493a4bfd3d9ee9894a5d6cf8e5400f8f97a69414e680891cb32823e8113adb154ad77f02ec3174456121aeb04d15046018c376791155f2e45f02f1c3aedcdb5dc9d3582a3487ccd9a4cc71ed0e22b41079b1b70cc380e5f47cd0d2e627368287346d0efc433084183be92fef49e0cfea93d7ad341f119dd2feec3d19156250b7a31133e812511f34dd00019c5205934c22527f2ada2e0f99d875e3a90a0ca489fa42ccbd732aa3c99939183dc541223fd1839c6601ef004f51495ce73e86b17cd991086d7969f2b2768c1bd5d72c79476d491067443438ec60548737cf538081a99ca9338353b5600db9d4a3ec8b9d0c568965908e8d44f3467aaf654f592c9b10ed32b65e690172fe34828afe285e994f115291396530f30c82e8c283dd8a8f1b60427a928fa3a756c19a676a519c079f0a573d58551edc3dcd2fe69c78cb735dab07decb3b2781e6c41feb573e1f823ee2c13dae7e46444e892cc49ab1808c3867bbd6ca0746be316138a0b7ce661a87d183b083b75b922006caa161c5c08dabc0da06a64a4edc96c4ebd47545f378e40831468b4dc659a272ea6ad15b7e891c090933ef3371d9166b7dd71b0c4281671ae24bce535ddfdb13e43d64d500b1c1ca476a362e189d34ac6ba856c5e6832fd003e6783fed439026c0d2eed3e0df85fed9bc6a4b7f1647f30047706e58dfeadae31d0ba81d5db7c2354bdb3dd4f4dc8c6448a9c3a054a93268f4e1010f08a3ae782dc87c35491ce8f784e11da89c83a80c5d90e3aa1a20cd9e38d46ecdefebd25838864d442d26409117168fc07a14d71813ca0313502a8f3f9935d3c0017e56a77edbd19147296020709ba08fc083f94c955b36539bb7bacb187167b80792442496a923d747b00fdbfa5bb9d3b7bd5e38b1e4ef45092071a792891072e8fa20f96ba8cfb69f2ed636eede3227367a7585b8bc7173c4cc0c3c42368cb8ead345bc02da557cf3d585e7ecf2b9deaec73d19e8414940321241588fa5026fa438788866a0734a6776672d5cc0cec3d5f2edb3b9d65747cc99cd0b1778e4d3303cdf2f27099c3c0325f1f9615e9cc7f1cf378e6ce5c46c7d7352f121daf79915c0900faff7a479cff577247d6d21d64eeb863c97fbd77d0ff9ae560fdbf1c2fff55ced4ffefe424fd57b2cb11b297ecd0c20eabff5bb5a3ea2b931dbf7f3b68a6ba3a12f0f55647ae0e10eac8311bc5af0fd37155e938a2038239103047d57fed73fcc431234e135f75712c90030f39ccc831460edbff5f5d1c69c471260eb2da0b871a38bafce01082838237aa78c3ea1fef468c7778c7bbba07b41456f91e73d58d2c37a6dcd0a00d30da30a18d0dd810830d16d8386283c87f25733f9dc6bc5c6692e293dcdae7eb3db4e7f25549dccfdcedd945eb14cfc0fd3b6919cc6d1228cf3d074d1d058e01e05c8143548d7047b27e6252ef9c797127896bc2916b94fff5b5c61035b27e4113d79d1a55bfa3064e0d9dbe4b6a9e9bea91a601e783b9591a61ea2b0daa3480bebefa0536bdd9fa7f73555fdb74d1a6375c7e466f92fe0d7d34e2fc1f41e38aa28146d2ffde261a05fcffe3805863cc773820d667d470c6ec8c0ecc78f335783985555377a798986165860a5f6fb51a53c5ba9c1913b8d17243839b10dc7c196dbe5a736f6e69cfd645310f962f6b5df456a332b294b15406080878a30e297d66afd2982f9b1b78e0c185b26420800c27c858818c236db4da00d1864a1b2063dc31069c31c08c011c2303366cd818c18604362f31ecf8af3e6c8444b7aed1a8e005c2f4595eb39f48b1d8cd325dbd63b1255deb144669b02471faea7031a64aa7348dc26ad944352eaf2e9b99eb74e5dbda915b2b064e0c08b4cad0eaa245b4c6cd9aab355cd64cad317280ac034c1da0270c337e08a5d5ec3c1b199dd0173eb9e9a22f17ce5d1d1d69595e1cacd67307c7cb474b751f3b0e97b94ba3741b0ac63b5dcf3e8cf92e5896b7e3feffc9ef8401465613ba4d30ac4a30a66660b8bed8fae2ea79367b5fd88efb1117ed5f50f3dc6ad0d06825d550a971a901e285d6bf17545e3cfdd71d2f78febf6661bdce9b84acaaac5e9652175b5f499ca37c971878bbb8aab60baa97eb76d105fdca05b9378f7281f55c503d142e92ec6c01e7ff2bd98d6c81f5ff556a8baaef37975b24556bb7e0f94f03e7d360a569e1abb532998c56b4ab15e9b053afdf1e59d68265794f4ee6232da6ba163c5968fda6ac3d77308b25b2b05f75a6dbe4bc2c807c182361610725710e8b3075ebe0a51a0baaaf583cfdff6f2c8ca071534ddca55434366041834343bfd64ef2bb737ad3717685d68cee4a7c8597285d7e7245ef8a0bac00e3bf623ca356dc6085b642c87f1d476b2d76aa028c2aa8fe2bdff49298ac42c97fede4ace451aaf8af5055a854a17a4685182a6cfaacba29d89822ccff578ec9dcf53ed2f593da296c53e85ce04c0a3752c4f0bf779a16852e8a09b0f2c052022b0b16396ba2e3d010144d401100282e140a3cd1e68584fa130738a184134027ac13449a98a309ad87a242c76ac926e8993767ae3843c3192c678aec1860ebffe9489b68ac7724744442ea2b65800898d062020526624cb8aec6b8c2ba0ae2aab6441f4b44b1b384124be09608a2841925a0fe5f08f338fea12f9779713566855e38a11ae47a9a29591ab34a3d738f98a7338f635fb7424196ee68fa1c7137a374bbecf962a9ab53827b26a9f1d8318f6325252a78592c762b9ada4637895c1240ae7e717ba769b1d8cd8c16334264202103124596a4658931797d348b7ba6be74ece9cc1b553b62ea88a32388bcf93b79df298059000facdeec58dd600582d50e01b42040553d3a72d52ceed72816bbbf608ef69e7b3717ad7c739d5dd4c6a8b975b9b9cfb74d23dc30228d115346d022ba28224c114f8a08abc5fd5aa1201f1b2f771b840b72535fe0b983e70e565cb38bee1eecd22eaf06f5264fdc7f9ad4b8a9e30ec4ba4c56193265a6ca2c512a83001158b59b3b445461222c113a4368e9f41056bf330497ff1f62082021dcfc5fed08c1e5ab105688255508325aff64ccfc3f991ac824fd7fbdc11c19d74e105a40bc1404d54e1049fe7f4c9cffdfe7183463c8e43154ff558f791ae31a03e4ff81c8faaf647680a07a2034c6393176ece0d4f5c962b11b8ec4411c259391b458ec46d27cd8a4c562371f36f300fe872d7e70e107a31f787e681047b94cdce4030b3e3cf940c364852153751800f4c0460f34f470f64079d88287137818daa18d1da8f87ffbca26ad1a197d3a20ee75cc77dd8773b02cc9cb31df1466764cf28e9976180213074c1260b28041327193ee0bdff982bf4ca043153ae8a0c3eddf87cd0cc47a27073239ec7278e500e49f6ed3d2a0e9c5031cf6c081091c64c041041cc627cf5cf0cce932effddae80d40dc3075c3941b10b0818d0d3fecd8e042b52f17f6ed8eebb9027db8675a8bb3e1470d65d400a686df7fb5380a47f14d69808306313450d150c00c59cce065062019f2e842063132ec6428ba3f5d2673ce52580d9e395cde7e06cf1cdd669510552d544955415545a90a12039a188c88414a0c406f7d96c2acb61416f3d11faa712e667bc71a0643171892bce0e685245ed02f8c6fed6e53174c178ab4a0a6053228b430a585a11682b0f086ef1d16645de2e8f244972532f89d2e5e9ecb175cb47009dae14264cb165bacfebb111f36f316ba821d2b58b1020b2b7cb002102d2c6861d2e2da518105159a54e84923052f290420052b296880821d2850f15f2d7f5d9792de0d0507042080140420446507950f54552a8969d5874d9c3b61eb8434279c7042d25f18660a809a9d009c09802e000fec98b08709624cb0b5f2d2ad29edf9eef26ed39789bb8b9ab8290b145978960c4a18a3041e4a482aa1032c6760c1fa7ccdab71b9db5876825004b30461c121536d4c113175c314d554d15712e782d707abbaeec3666ca6c4fab0992dc53025b0d8ee08a8052c03840262f0ff3158b5b6779c0f9b198731dfc9e898e49499e7c691f9fe2ec73829a0ffff73ebf4f2ffffeafd8c72fe2b812931b199f55f7914f36be4668e316d5f03663007c41a87cd608ea4e1cc6f64c6e1cccd7e4da86242583335b3c091254c35739991b29cd546963b4b922c40be92b8842d96c212aa4a48fa2f81ab81c5eaff93b0f0d059504d904bb0289cdafaaf98df5e96d77769309c9af2f23f65a78404734031802c84c0df3fd055cbf2fa3adddba4d966525a7c2b498579a9258ffb792475c05712632cb949e7738b93eabf9e40d59cc2d96cb3dba1994d093a9cb093397b972a77c7fc5696e7ae93df25e07038d6bb5bfef45f494c7b374eaff4ccac6d57b45c09fab9c9a56e9b94c4e5ee7aebb6e6b34a86bf2a0ed35bf378b7dc456d29fd4bf235092c5bca3b73bf7047b17f9df274e69b735c37d04c6bd59da69ae9f17d6c7c29f8824a389803758eaa1dd998e8cd5294ef5e3bc7529787250fe5d37f2d79f6521496e5dd7217d54394ad5abacd282015eb4d827944c209ffff34db8c9ae5ed32fc0bde623159bf49b25b51afdf244ceea3dc940be839d19ba147ebf1f0e4e0e9c0a3c20bdac5f9d1e2acb975596e3df21ca9716ef4a9758647a51d98ffdf25c16ce01db00e47109259ffbdeb8bb38f0fb526dff5ab336de4944e8ace486e8d9c0d39107249ee19d789f05eb943f787edc262b11ce0ce0871070871617022e08258d9c38a15cc0677f98399fcfa6ea71877fe7cb7d77b758cf57e6985b27ae3283466cdf276e0e554679f4ad22324e6714b7d6abf3c9ea53e40ec4387d47dea3649833a1fa94f235aa1ec0f85b2b7d7793a5b91b242046a0d9497af3f6cfab02e77a8a1ff7f4b75de65cc7f18a94a5905032a5c5099a24205c99433a6bc306584294323c019a1cc085446d879d2aa50169fdcf45d12fbf0ad665c4d9de92eeb4b2994d5653316b354f0e9828ac52c151d27b7a9bb519e76788222a58fffeaa27c5639d6c0ddb30fc9d7b30c93fb88c453b7c44c25e65b174ab1752914f0947a86e224c67f9d39dd9c8e38f544c9238a9830cacff24b61bb5cdb6d4ad238b6349334da8d707c7323bc8d71eb12de8cc29baca98da61a6aa7dceabddb556fbd7937172c390e9663c799efdba33d9316c7bb39730a6b29cc7fb1d88dbcb857e66bbe9ae8e8e42269a43e374fe291678ee3b2be92215398df6da6a9af4c400fdc5a0ad37f15818cc63f8ea5b69226119644789a8900544500f2a1cd46c35732e36c08d4d8d4ac086b586a4098ded3b684c412d5925e02fa587f0529bd51a2416904a520509480c2a5c248de84e39d6db216eb274b3cd13d59e0ff13f8f0c9014ece70428493149c3439095ea0595eba7b79c78a6b1e6dcf2151589fd919ee86b41e6859425aa6edfc7f0c86ebbb4cba4a7a4ad2811202560821b83e98e3bbc95613344daa824d9af03071f353d7c7c40bf63149fa0f320182e4e6bf6a1cb5790ec9cb77a4a719920e3dd23afaf2ff7db7cdbecb232323378cc2184d31d2998151cf1da43498d39bc463e79bc4313258f6d059389332a3397797785912b524b6040310b4fe6b4f4fcfad5663022129048101d91ab21e42991559051f50f1726d4ac30f46f80082a233455bc2a2a8a29ea2204a7aceb775bbb414d6d343af92590c8f308615cb12c66e1506f3000b0f82a107503c3820c913611215ea8be2dcc5598a73b90ee074504407be0e8088d80889b2422217be9eba7bea3ae6d61acd3808830314420ea6381832b4c5d0008644181a82440d922d2192a0ffeffdfe28ce71939e3b6871bb8d1b427da8b5f487da20ae772138a110d6bf9097ff1a0a3d09b978fc066585415e8292aed9cd73cf80f8d81a076f2800c180747e041e39e2083f82a4ee51771b977c9bd7d21ded0ceb0b35090cced7cef386e9de83fac25008614d962ecd926eb4898912ed469930d594e8528d22318102657644991835d1924899109293a7334fe711ebffe48d5575b43fd2ff89f3b5bf30df3e170deafb1366b77f7a0fc4bbf087672f853e702ae953f53ff3b17df5e1f97f655d20c7e42c7c51e5a8694467aa8486afa7af7c53a1dbebff9f977bcd850574bd50cd9e4b59d1d4f515d152c4a988920dead8a08c7003321b3411e183c812447e4490febfe3123635654a595efa439bec58e6a89a0db223ee6714dde39dfb0e29c09030e110010c5132a4811e37c21e227aaa843d409ef6b3b4514a8fa6d01f3ac555ab18766948efa057140c2d814285148130833032a0fa7f4a474b61c172f3607ad311030f3058e002362e18407881ed8208849021c4082150421c1823b4404d688196d002a6d0820bc20ab0082be8153c5500840224420ac6841448a180011e2e7882b3232a31ea437ff02e97b49b3956edaba9a976a4c9ba8a58ababb4c955b3e3d854962e9a7b367f2f17ed14c6b7edb69fe58f8ed6065118b5bb7cf99e1569dc03ea7c7de1046e3e9cc08bc98d7c38416f827e811f7c28419cff0f253042825e28c14cdc0ac5abffff99c8e57f168abf2ada44a09ba813c609432d8c9b8464be29b4ffe3a74eb7c390e73fa82fad4ae1ced6ffbf041fee68853b56e14ed5d71d9beb77be2902381170f155262b9ada463257eeecb9b343f0e667101ca0f326d429a383756ea18e90ce030fe8f1c098f0812af505d38d30cb64e469a781588fa10354a103b6d0010dc206daf87f007cd8401a0d50d1400b0d9cd04053d8001006900819a8aa2f1bc451b8586c577335bd6c94beba111285d50e8391e5a6d66673d55e40ac5db41b099a3d77769be33cdea541dd1788024cb840090b38850b1c102a7044a80009a102b250019d8741d9bdd3342ae4f599b6dac2203b0c32250c127ac0411092da010e81680981140199204c008e300123c204aa9ec952582e4c20294c80e7bfd69e3b7b8880508840901001044200688500480300600800a010003e0784718055b52f26fa439f5c354b71101dedab89c95a8bf1aed697cbc4bcfa72f5186c9be7a53897ef0fe3dd2ef3bd9bddd0003d20f8d080364203aa080d20131ad0141a208605c829404c580094f0c71e5f7b13fd9d662c76b33e6b4baac4c992fa863f7ae18f26e18f22e10f0ac28f23fc1dc2ef127e511f73fa78f34fbc3e7afaf83957735298639bb3644e057320e0e3007c70a99dfed0266b852c85551826b70e669f6024bfbd9e3b3bb54da40bc62d138c52db4403fcfae868fb2cce56128d8305d3671ca93849ffb5cab1f535cb81f5726cf9c7c921c611a7963b0e20e29012c70f38848083eaabe5b1d8367376b769af3c0783e5b9437a63cd1b27bce17a230337b2dc38c18d1f371668c34c1bbb366e6cf4c1061998f34c831948ea4b06e99847dfa8738977b4dab9c6baa7cb3b1aad5b6fbbcd5186b1e4a658ec46c7974c26bb15f1749eba4ae62e9bcc5d768ec98b7b38d90b4ed6c3a98263fbafc00ebcc1f935b4fed7a046746d8daaa5dfaf71fb7ff2aad1871a6dfe5f8dad46086af0fc63a9edfb5d60532c7623c96bd338401a574f92b358ec66e2591ab4341a78a3554d7dcd29bc4d9b0de228fabbc03755e11ba537ae8e0619684c8186feafb6fb2cedddc45b771c44c3e88c38ff729dd1cff0c08c2d1c745d9ece52179739ea3203cb0cfb66e8287193e5c6ea9fcc6e7a5fbbedbb7db91b9b797d3d2bb90152fb2ed19441a68c5e19495f06fd100173fc63c90878820010c868830c2c3254f851a23c9d6d647c1b356d826883dbdc360d8c71660c2fff97e6ce265a6f6cccb0d1c286890d0562a0214612627431686234a0e546cb072d520b8916903575ac19c01a14d620bd92d1aed63f60aa313149bad198c48c90826ccff66585e80732a1207d79eec5f7cb0ad122eaa2353c009230f608638e30be84f114c61130f800c30a306000e30a1844d27c31c517515f846a9a08d574351a7841871761bc7812666d3d45027bd9209b750951a35dcdba68474261f4655f41364b47fb52a231eba25d88c2846c76b7836c19ef603d93678d846cf48706d11f6ac44f3b443ff880be5cb1d86ee376e7b1d8cd5294d69ffa53492c952f90e29cee76bd33e6b9cb37a96f173c74a1d445045d24c005125cbc10858b0bb808c2c56fb1660b14b6b8a59993c68e304d99344f698ed21cd1420c2d7cd0c2a605d0ff636dad92ab666db6bc9472a099b9ab66e9685f4a945a1b106b6a97ac925da23fd4a6041b5279575f5fcfcc409d0e7613f3ca7387f9d541d96ea95033e39ec9bbdad2213558624ebbb6487a5792e29c35c546f4977b1d4b658143165ab258ca22812c7e6041c4ffaed669cca7fbf4a9ebb3d95c351af3a1584ce98cc592ffaf4634163c51d0c4f90fd160fda321533b1a9d06628dc656fb4e86e68a2bf20a2ef55783ed25aae48a5e7805fdaf405c2c760bada8590142156b54f1a58a5d154e55204085175464a18257ad893b8ee3f245a3ae198b59badb2e5a5f354bb3c1dc1dc912fb7254bfb7a87e4d199410122a781eeba6d8fa29acc229aa483c4592ff1bd5bb146ebe02b18eead794428aaaaf522491590a200fd35b875184717f19fbee5254bf375914bfbf611421d60b2b0b8bcc7f25b1a8b096604960a9d0a8ee0beaad6732ecbb4b396866992c16d365287e2114c127e0fcbf9ec07aa2ea770f183ef1abb42792c462b7279cb8aa79e704d557276c5f9d7055276e1356df9bf8fdd7739b4d2cf926787a3e03a7d228ddd2992b7e86ea4cd21903a0b906e08275ee66802524135b4c50e193d1e8c8040357695ca1f9aff6cabcfae08a678937d5363d29cbdc97a05aa20325e850828750092c4a24a94a5e58eff2528e8178079c254146125e92302109a1248a98c93223e6ab6dc2516b668a191090d8fa4ade1aad7d4b9133247a40a206246648547044968fe9887dc4ee88080ad04601c014e0cafed19ee9ad1b89d2f96cb2978bdff2cacaf21ef528dde5264e675911f6e59b6ca4a302231d473a8e244d26e36637bb912226dfbfdfd9713afb703afba4f879a4b38fa7b38fcb64b7225cfece5b910e3b9134dc35228ede4658fdcc88a96a499a35e2a9067194b9978c20229b6231d9ef37eb9792b422cc22ac14a153268d32539479a10c07968ea31d6db794c911264f9eb86ab632a92e6a7b103fb14f98d01ffac455b3380546d998e4ec5846c724671199711ce31fc744e8f4c221dcfcff0f613544d5104f43f07c0d85d8aa24e6098146882a2184709181f35fc9585532543adc69bf3d324f644232f4fa82082308aaaf63994d7de61ec4d3fff374ee4100d97a0c1add49eabdf518aaaf24dfbbdd1d637f0c2d331070f0145e02e2ea4320aa2a1053ff0fc4d3ff3b01e17a3170423157525ec4f4fe5f2726898ad991117120945496f7680a939af6dbdc3680cac60f667ea8e187da0faeaf967c59ebf281071f62f001c90707c2b8e1d4e9e5e472da2676da26760aa31406d6431ba49b73301896d23cb8e101061ea2f4b183103b60d9e1680720601000060d982b606c602cf8d2e6cbd5971cbe00bf98ff3e3e58aa0c5edfe5586ac3603152df1d4ddf5ab1b9a5b636cbb3c328df74dcd1be00d5ae83153a78d161b799e84b9b394891430e403958e0058d971fbc287929000702843854f5dbbb4cb72da56467bee948626b39c661c80d5aff7fc3ee06211be8b0c1cd5b5c2c26bb15c5629d7e407fbfd0869c0d3a358c514398b0862e350c551286f90f47031b210d6668508186dfff101a1a98018b19bacc50e5eb8839efd25e5ecdcb4d333020835628830ea10c31c850f4d5be8236d0d4550d5195a5ca15c318313011432e860d609803862560c0c1c0c0e5bb499020e5ed3d9ece96eece1cd69bc4658e5f1d0c162c83e50b48bc90e505272f087121cbdc3bbacf2b5bc9c6c18bebb962734bd9ede482052dc4d1c20d2d3461610e16c2b050020b1bb000a44b01c22e2774f1e1d2e675366229ac1bb13dd3b4a7a5e696c2fd2e792468660da3946faa2487b90b898b932d7a6c59638b9a2d02d8e264853a56c0aabbcc7167b2244fdf6a07ee1586b4bcd1c2464b172d4fb4e8a870c70f2a2c852a8090421cf54561fade9ee9a2f6f573d52cced158497176ec7987b9e5e97ca9de3b5a95c2e6b9353fcd8e83b707afc6e6760a96e535352eaf997f578724ebd8dc4eae221d7632b7d491ec6a1cbcb25b51efb25bd10e67f6dd1b22ca587267e7616ce24e5c96389eeb3e5cea868832df53434439c84d8d8590e4b31c22cafdf4613e44943970731edf4344d9d4badffe0d11e5ce7326ee57f01051c65a9bbc21a2dc4fb31c22ca389eeb9c24ef10513e8788f2ef72a010923c44944ddc71a5b9f91051c662ea8688f22e0fe1424872278788868832ae3c7d4344b93ca5323944944fdeeb4344b963de105136310f87f5ee976796b7e338fe01b7c6e1a86be27c9bd49793e5c63cde71e5d56133981bc27197eb2c15cc54a16c2c86cdcb75960ae5beb393fa52286ba990d804ce64b7a2a87e6f51fd9abf6dca8af4ce26c6923bc692bb4c96a4f3d89535aee47025caeff71be10764a3b165d84ab41b567a048d812fce9b66e6408ea536b6b493c1d2de0b84b2b15854bf375f50dfdc2fb0d3f166caf73571184be636aadfdbedb8c7cb308c77b01d895d514633e35c39a375ebdac4c489765b6272b444a32330cd6e4c966a4ab4b6d4ed91af26fa8a945c94c1b2272aceff88cb5fd6e9cc7fbb97f7776a5add3d58eadd336d6c46ab99e92f47f5cb6fcfccc09c33a770bf3a9d9b4499f9a8a7a82424504102d557acf78c840c721699cb07f57d41599b92a5e2a21c2be5a7cfaeef6d7deda1f9ef55fd7ab6b35f1dce057baedef3f8cdfa7f1e99caa3faffcab3ff95b7e4bf8a3c9dff17776f7ed7b41b773d580d9e0143f90a041494548d90783ae736ff515a7905527eb1ce5076bb475f2e2b927890498864183289fcff6a84448325cedcecd9c5dba58f1ebba575ea2ad99ec72051e7842e8c4ed44d904b53cddb67d602b1ee3adf7acdbb73622ace776adfa9c5dbe526b93f360c6b8275e1bec059e19e7042ac6461e58c951e30bfa8505a6969de71d439868456116a0050b52a7d8855e254d1a14a09558a50f182ca1154aa7cddbcebebb4badb8db8974ce8c94d6cc79e477d72ccad796e71ca11e21415c42948532818018dbeb8d4970c8eb080f894c49395a71f296048a9bf0e8542599cf93be98e4999f91e8fe0deed37ab525e4e7a38b989e2459420a230450921ca04e2ad0af12680db78b340bc01694aa2c98ad85484290b97386c6e1c2e868496a54f4aed3cfbf8dc6a4b3e3e4386d40d3429edb9ee97ab48879d38362fee4c404498238255b9f9a637dfdd4c04aaff1ad4358940e4ff83b960cebcb8d3992d8eed8bcd494d4e4dccd79e9981dbc49ad43bb779335aef14a6789b1788758d4b2d49b5966fba1467a9ccd20baa0a952a2e1fc7becd77afbdb4c4f3d55a7a2989315752bafaffaaf4fbda332731b72d51d2f9af50b2a090f99f9308a50765498502646b2d7d323d21f364ea959e24119fd0cab1b99da2f4e54eacb6e8848b139f131e7b2f2ea948eb342f2fd27e220db869409292acfe6b52af2cf72f842842582184104200a1091c4da2109bb8f05f5ffa02b18bdad7d4f5b96a96d298bd348a4da6262f2672884cb4b699b7be3491c91626529814bda2f4e5389d7d4858482820e99018f8af51faf2bc39c612a5af7991c423258eaa8eecefb652946874c68804233a93f3ff412fcea818ed2b88627ee998631607afa5b05b734a1d072f0ef39b9bd987aa32ee1e904a153ae35982f55f73bf4becff9913972cd9b6253a48342a82c0e6ff65b2de6f7924db42d68228db1fc08ade145151e4138b9a8afed25e9677ecf82a794154b24509d0ffd77d448c85896931e6daa2075b3c30c1830d92b4e1bb031fc40e70073a446210392112e54054428ea8894804fbdfbfda2d7596c26a59ee18a9effed5b2dc3f3af67bc4d3481c407971688c212e434890e481240b24412444840e206445ebf5e532854ea10cc4a03541565f839a7a262dcf6210d5ff2cc8f6ff391168ebdf5e8ead080444f55fe91581aa1c89e3089afffad219783919e4d7d467b9a5ee91a96d1e713a52b134ce2d8995cb57a0ad1689b03e6056db0ceaeb824dfdd77e05935784b96ab97754cf9c8ae31a2394ceb3d11c5db573acdbe2cfd6bf5c74f663f5ffe20f95167f6cfd3cf2e3f249f37a5d26a20f113e4fff7afb344f8b3e406ff3f9e7fbf562f28a4074a1a93c4d45579877f5a0acc65044174f2d6f9f1981639a7bf75f0d887591208a9c453610379043dca0890db46c30f424d67993a0f1af168b592a3e35d31f4a49736bead371cf14897041248b480436248c2154ffb5a7a7e3a82e45af7939e517d75766aab9781687040d59a027eb2b25b3a53ebb6dc92cf61cd1404b832fa20651a20656340842dff8ffba4dfac2e11c6e9bb8a89c897d9857a1b1dcfb578362d8bca645caa04d062f881910612007063a88184c61b0c3a047c4c0820bacf8ff0f5ebca0cb05572ea0a2103942d87411b2a3512c79dc3bf6c2bd3ca4f2285d8ea2243633def1bdbbd8d7bb49a3b51bb14214b0c08c68410dffb5dc9b52d102a50af0a8c0870a441029d8a35a8b710772dccf600efb76a74714740a9c8814bc441e3e78c21079b2441eaa0a65b1addcfbd7cbbd6d531737757d306aeecd34c19c09d64ca0459c60e8ffcbd24742594b652483b8b7f53612253842022ba20440a2688688a5b099cf2b9d16659769751cc7308e182a218655621882b8a3c70e13e24e0ce2ce0a3b48c41d0d2248f32486e1da35597d8ee890fa1a39d6510e411f22044188105481800251e78da86346d4b1a2ce4dd4f9213e50467cc0870754b0b81fae64d4b40a65a94f858ac52c15da7daaef42a13ebbd3dd7de810f10110c4079644076a70a0141db0406ca08fff11caf672ef1f2df7fe755c2779bfa54c762bba9c49cfcc527ab965b7a2cb316e6b8e4b1e6f9b38736f2e2b2a37c7e6353bc7220329880cc082b911e31dcd7626932d90c5f3e20256e20253ffe20274b6801515b8caa2025bea2d881931c896204d82182002c1128178f9aab798801e62024d245042024e0944202220c78c8840504420c97f0fd5992cd28f68de4bf580350e10e200de01444403f830e08c015844034ad100971a05882940271640452c80e7ff672ffe58f3238cf843ff18c57f437c23c4078acf81f83a5f3766d273fd9dc192674aea2b85f671c11c3ce6383107cb9c2a73329813f2a1c587152af061850f217b68fdbf6e6c528bd03eda6c2dbfb406617b04d1830c3d5808f540410f233d84e441471e0408f3a8210fa63c20c0830d1e5ff050c19cc23d3ddba419caeab214ce45a96327f5b9e34568b0dc5ab395668bcb5693ad5702da4840990470a9346629df774c71c70d77ac7007d21d3f42397bc8b9928345ce939c0be4e8d8f1851d63fe6bd05218ed99f5d06de619ad3db3a7278a6f60b6ed7293a0295360a4632c265ba2635291ec725c47b00ed7ffd77be940d32fc7744c753a9efee9006e4dc93a879939707324fd575a350eb135a8349545d458aa19000000500053100000181c24140dc8a462c1644cde3e14000051b47468dd9836d1649d54c81863600600004000400002775171a3e24156cadb10d96309df5fbd43f80c71507817fd707ca2c8e3c1d2c485cc87081f139026bb817ed313d887db583c563a9ebaeb5bb7465f92774d263f8d759f1c612a3d75c6e395969eef524e684d403039fded06032b9b8b89b1ad7039aab78d2d2f47692ba1e789b1137e6601a9be07bc8d895542b0971e36218b2f75be69489b84c1fe475eb70f9ee2f68d428f3f249d366b89df4583a6d4774b7559d03c9bdb48ed737f74ed6c625826a0006c7c21caf0724b86ad3fb229fceec5e1ccf3fd0df78cdd3e6eee6eedee483f8216b7e4a2dd6eeaaed2f7bd3bebe526a482e5357980d1cfe321c504e645716361f4761349d1818a174b657cc657a067877a3280ac2c82cf37b81a2e08cc74e7f20c4ebb55bda8aa05e39fb1f2864b60b424dfe96a000b7f94d84597095048a0101dd28cf37f4742b1717e4d0aa7bb14e47820446962155d27e3b9561af6014400add1ce74c2806852823a07782bd282522c52989188714c5fb60f17be64700c3be4e71ad3e92bd352738e569f5248fde93fbd02fbb45553ea760903b68a5da9b11740df2c9d7b33225a60b18279bc82351f7f7f974a1683920d4c981b42fe32395ec054b2949f6a39a3ace33cd21b2e356352a0a25343403a9037cc39166fedfce56c18b2b50eb9f6b8dbda5265a0e0bf4ce92e6aa0aa908736a8a57602b8a15f037d8171cc42a87db3094f7166539737a90b43a84344dc96d1377cfbc4f181761ebf30d4837fed1d28f2f0b81a23b59bce23fb8fa34a3fc048d61b171cf93ca840a4c69395ac7b4fad4e17b519e9ef94c1f3936f56fdff8441122b00ac6e16696e10909e7aa894156852d1bb91404fde7f1cd93c394617050641433236c309b9e31659f93dbaf9c143e3626036d248dc84a010620012796412a8d6661c6ca4a8a81a74b82e95e32a80f3d7694369ece556fe2148be8bcb1f3e2d4ee2f78501e83e229e331eae567489bfc48ead1b6133be1b837cc62c0e0de3a38a284ae8509a241e0ea0ca3d65b2d287c6e38d0ff6c5cfcba3375cd7cfc2f82f6f26596c900524ef851710d66d278b03d4903f76b00ddaa26ef7fcb507a889d598e915baa8ed2bd0fc63e68aa2cc46d96b8fb92625caa608a42be71154f9808222a06d62f4941b4907235e5e0cb6fc428297fa84e3914fcb8aa21f35eb1f4e3efa48d33287e4b1c525426070d5ecbf09e71ddd2051dd77b7b0d7dedda1b2cbcbb55ab504970ea21c04635b7f6d536c203f3d8a4cbead514548e382222dfd9723479271b35cf7887374495ba6a099ee386472ff770698215588c601b4dba6a8c981967ffbda66cc348bb3639bb1bc38bc1bdd7048808057c1bf480403ad0644329cec5701f92c861dc4ceae7755e8b3596465cfcc913fdfda9e5c348a921d980833cb0aabf0d0af2d233ac23c7f743e86033314c91709ba6756b364ed92bdc9d52003e54953eb85354500b251666f971fad0521fd20812e405fccd99035add92a61782ae43bb93141232aad6cfd8ad71087158ccae296b54447278c839e8536f0e86a55e2ad13e7c86df20524abe12cdccd9d45b144ef69afb4d6b1e0d50b99ddbd7187b808395f77aeb60e6f042c8fd21e501147273969bc6b4abc81744d90005d96c48a4b57bf18b91fe7c1d7a5258fa78b2879d15b9c6491b336d8b5b549573ee5c65930f4049f751bb77edb9bbf836980e34317c2314a1abcec9b11beb4209ee15943d8bff61b0b6ade42d640bd7ebe44ad29394855fc3fe6b19ac91b4d55002d62887bfe83fc7f431fbc3b5354f67e420a455fae7b4f572cd23e2d8a22cdce13765a36c309f4356977becf04e0cd9ebe9644c939131b62502b0676e4b20201db11e5fa8758c84a2f739c6ac1da4462c11ea5d729b9e3a3109166e6da97a247816fd0dfbc9a49a4f8996cb12f007c272c1dfe870ed836a4bf793e00ec2728fc7f1ed814d35f9384dbb6fcad0cb8eb2adfcc713b22b5b6f167a81ec187402bdb1ba080fe264942221a2b9067714f6e71dc0067b42e36b36ca7fb45cccb6739f75c0773b45bfcc395d0435eb8f8a125d7f1cdd1897982fb7c2b5a18919b3ee6e490276fcfee9631ed40c5ce0d822c663d996d823da258e0405d234af66b570e482f394e9590dc7a45afaff02e5bb4531429ab89aff67d69a376a83b935a9ca5b8157b7549994e1a09b8ab34bc5f63f2414f08829a599f4578deee8e044d68354970f442b13b9614a4ae3b7781411e13ad77fd496a91b72490e754019a7c78aa39782a073d3cb5efefa9d2f2d5905dc7873499e343c3e61aed628795593bbb4facec798bc7a4496508809e61e024b2b314f4fb35136312fad3a05e615c1b9eb706361f10d2bd919d7f1ba457288068e3db68386d44569b480dea4d8cb86702440cef39b136f09491398c313d2d8696d268582cadc5ad2df883eaec5d9a6c72eecac5fa2358745988923db4f7d585aec6ecafd99015b41fd0c2e393d81f081665b89158d5f39410969ae340685babfbfc2049d2fae3a3e76fcad774217616dc9d659dd46ea19b43661991db2d885eeca836e411f7ff34c034102160019910e831b48f54bc834c59e19962e952f6fc48077fcedcd2695dd280a687bfd30200ee1aa37c8448a0c56592691e48d459834139723e0c74c8bcb420a655a3e8d01f27b54ca76e627b8df283d809da70153c5483cb63e9801cad5057d7d1e846b512f6efcf1fd9b8a00210dd8cfb2af26287610d0e7096d6229e759c87545c77429723e4b9b1cdba6d30f74b67e46d8d73ecb0640e483c4007b1cca60ce7618a8bcfd7ca907090b16dd427fcfc114f471bfa1d20c8faa9c1d37bc9d01bc9e746a58ea6304698e5c5cc9faaefdb5e0af3de64831f63bf00451cc1bc4b68fcabfe1c62e029ccf3f9d82edafed7b461a2adfd28594cdc9a18e47af01d18fc6c6154cbf9acecec1d4d94be7769cc7f00cb771f49cf6463ce00169763628784172b58858c64f2ae55561ac55372d9c8ed559df71f0d0449495c81f12b77fb3391c31cc647d091c59c437387d3e0c54b4a1d3cc93572d6f4b942e41c83f67f8ef69f30fbf3216acf155facbed553df092374dd21211adf1331561c033774120c487b4f8880993e186ceb209eb0f2ac68b47612e1b83851d7c0ce61f90e669b2e3e364659c236871ff0ff5ac45d51904d0bb8515b40d6cd2c2f9acd54917957ac0dfbe845c9e9c915a753c5c33ce3b6ca9297faf3d6c8f896c91c1a58492b36934b3ad9d0e29898e4353a958e67a98c8c5a5d29c5db1f9f28ad797380010600a83d13176b3800a36f1776b94916e4d9b2b86448587a40c896b1e266c4648e2ba99176ba86e42b251df4d19ac48921d7283c834d02be558bf76b9c06ea22fcfaf6a8f7a3540c46f73a7c2d19dbde919c49c1f6f5ffb217fa421fe838393009cda0d358f2bc242293f1c0268eb2cc6a534196bdcee5c5358662e5ab1db400c9441768d050bd24ecbaa0f426f437e03b94ace7124ac2d667106dc9df2e05923249cd50e949efa52ce557ad99edef7ddc48831be8926dbb9d63299e09a350d4acdcf7034745fb19310180b52485c68306ef97d896f010ddc39012ed162bc5c07e5b47d2fa307974227a5cd3ea77b1351e0913563034fea7429e3f0aafe13a349e4ea1412db71df8200fd5fb4db617c34b842bc1b500a60c53153893bc8c74039ba79115da275b0d949c9f4c90521b9337972eaccc7b2c007aa5416e163665b51d3b22c405e61bbeb2465196277331caef2092e6f155e8b4ca1a8fcab8415f3d73096f305cc4502bbab3503cd0e90acebbffee6f1b5d5cb12c8c37cabe37e2ed497a4c9ca3475bb2a4c285638979b04adc41ea3405475cbfd9afb140bd7f899c855547b425dee813824694dde1038c6f22ab98cf4ae5923ec5709428eb27eaa863dbe40fc4ff665edfad82effbb1e811a7fd2141a9c46849f63063689aae5ade2d51bcdda66e335856cce2e66b1385d372393463290cc4e9a9490bf7843ab38953d2ff9437eb9d27690c0cc955b9ba451ca57a628ccf47709ae496133c905cd751494ee9a4e68ac14618c51c11cb1e6e0b83a90547542073e137bffb261c59008a99f9ed693070adebacb8409c5c4bdbd3d27303f4477e9e2f4a1cd4671b03836165a42d5a18b7855600ce7183eababb78327e1b097d06df400a421d9cb6afc5d5c9766e943f4f2c867d4761d840f4b4e09d6cbd0ee7ff11a93d81a7b4103dbcb8639c4e2bbc198667a3af4413f0fecf1b029d757b60d9da83476a2ae7d4a688b5c1b249e3b0ac94f3b97d71b690398ee64a46bda2edcb2981d1dcd227cf429693721c9efa560e9fea303ae39671d1df9132ad776aabecfb7866319c38cc495ae9568c30100ec09e02cc67353e868ae452f3f8683fb73a630ab79ae08dabb7ff4f65b683e4423ba5fa1abd67126c0346e2c80c77f0f634ac16539f8a994cce7ea77e7f3d21cf518b871277fe1923105b6bb9191e50595aa81c0604eb3c57bc109927363ee99f2c4db9ddb7af2e2bb166aeacd4857962b18ec4e1af6c5398b7e2c97edcd1853dd1798e86900a7406967194318f950c7115b2277443e2daa6d1c028af35fb91d7268857122687b0fe6a8b21c962fb1e371d6406b390313748dffac8394ef2be8e7a8a5409de1790880aba4d90b33f9974800c05cda41e21d43ac572d5d9dc1d3d301064d20acf204e6d44d8a6217b63a8c7b095cfb5088f12e2821d6d61719d13a82374022551b8f6bcc56c1b502b84eb9fa0deb0814eedc76308e83c3d2e493c2cbe96d7ebde5269f457f3511e7efe6aba1db8e6b1a106ef1f64c5845d9d7cf099e5872bfae2c9fb752a057057997ca3a0a203e12308d67fbfd4ae34dd9bd03c9fbc1184e3e866f7101569c4357808242985f5d793e9ad5cf91b69be5817c2f2d4c8f01757861d62f4bbef7bdd043f8f8fe9ee1fa8477ac2d2da62ee0cad16e9aa10ea8a989c909c7c5e48dfd7d5e500721d07a527f4f860ea3c92b3a65223646357bde4d1d111ac009c065ff50e68d6974e32227193e0c0dedad1e35853ef3761b1e029babd9cca9af399e0061643c11a65c42af84f2f8e3f38aa69d045a7f38cb18302b5817eabe5248a8b8a0d5d8a3950abe3ff237c4de42d16d2c614fafe6f3007bdca9ec0d2e57a4e82870a06bb56bbf3c1329535beb2c1773e0f347607daf93c2771108fe77073d8abf04379c17bdd89f3fa896df8890853ead950a3b40b1d200d72ae57b999796a75e3aea310c8a78e7533ce3b9467b9b0ccdef0c506464d5d1c46b7ea7a4d48d721375d5eb1b055dcd6c676562305f499efe83791985f600f54dc91ea511b0a93baa7e73b856ed206e6321a3df0386b1367e058292818868e4bea19f844bd6f6eaf38896e568190de16a487086bf3ac279e482b0913d5a2b4c7d0641bc48ce918d1ba6bb1c7e9c0d58a0eabad985efa2cfe7b04bb23f5d800d0de0ffa4c6c5e5061c192d4673fb5dcbee650739aecc817c64792f6ed9a97705d75d475b0a908aade2948910662f85acba260d617191717bd2f8326d92fb1728e93198d130b6006c25fda320d32351f912f832869a9a6c31af5d04a038160b194a0480f692195dd948f07b848ff42b3c378898d22b7e33d4f8e8f29a083ba70a5ba7be9372ae7acf753e42f5ab88762d25e0810f847d7b84e5f73506562bb5c6d815c74b84de897e8989dfef4330a7c0d06ab5a52fa8fad16913d2df9cea779553a35c2e7f41c6177108fb31fb5bf953128530674d1d37c8ad88b7c60a051af84d8437a9491fc8ca0311e78646af93fd18521f3e609387b117d4c0207c35d0efcdea697cc0ef4c96bc7cd639c9fd21619209f11cf635a92e17fe39df11cd2a0f68d87eacd8967e5a0feda6e7a7b18ebeebbd82e5521f98aa9f50763b981c3551b22762ae161805a1223a55c5e919f2f36b4272c0bc229fe64781a91a46e0e96256754f077e090855b316b7c336060cdea31c33433a5b1c6ca7fb66a2ed8ab44a8c6e5196458403d36aa07d1c7f0d678c632fa7993b20b0880d58e611b801154ded240fe3e649f264bfb04bf377d89d5da43e14b07e113b3770fbe69a3ffcc863133f826537c62f555f0ce22ffc9d84326de3592ff116399453711b6978da7dfa4105a5c2e7518740990d91f297002b88718ec311988a157922a7407476925ff325bffea886fe94e54bf5a993d0d9ea1c02c81682ee1d388a08579d75de603b53f57e78d5d53bf0c5927ad7891c9921482b5bf6892c995e6810109197b42db6f3e2e72f8563c989a865370f050b332209c40aa0b273d0c923bc440dd7c1708ddb98e1f1a3174e25ca082a96607728e86c97b666696c4e776430f37f5a754ea6f5a73648f2462bebaa5167c23ba80065d244cdb18b10fef334d91d1969d8ca27721b25e90b1233e8b44b8e4894912bb698b6d680d5f77dd81c4c02065586147f1be5384c36824d550cce5194cbf1c42d3925fd0cd2e816ea209b06bccbfa55dac3e78ca5a4be0e3f33181e3c6fd9300d9031608c73927e06285bb8075bd946a51785dd4a9c6d5d7e7e32768070797707b9a70d45d5d2c74f1f708d0a69eb50c231a501c6702639cca7f5c09da976f8d914230ab5c5ff788fc1e4a39481a49d737408d115a534c344c763d94b459879174a05bc8240b439153b372f0d516f89da1a804df2b65a78611da9d1ff922afccab36b82f6eb30e6f850998fd335afb9d29e4ece7709b55c7f7bf8f5413a0cd236e3edd0187dbcdc9455eb35bf0bc69d785d5141e92c219ca33d09d64b4c14ed0d58d9f02233dd4ced9a379993c0c8541c35c79c1af4e6c60982dd8cb55899a787534a69c72c00822bd0df36734805a65419fa87c7103fad03264e11307d06e614c1a34aa0884ad300dd5e5308000caa68e812df133ca6f14a8abaa185ede3ebb59041f6c566af611c46d5fb7d2b24b1e0b92d9ac577007b8489e6f41927a38fbd5b8690328c73b8a4e65b65c3c01c205eabdc3207c167e07b08b88a2b7b26b01fd1725cff7774df0920f5b76275d8fa2e0d9272494260db19a2304c01aa9ecbf699a21e7c3f6532cbd6ce926fbd4ba2c3a58be347304dc97f99783cd174f42e53eb8a9e2fee9dd2a995ba554d7d4e8ea475725390888cbb95119d9012b2eeb8e64f749d9783c902ea548d2bb17160b0e9c34ed05e1af04ae9403d7cba9588b0f8eb7684796e4b04883fb5580f6142338d970303248f4af43fcefeaa420f86b4630fcda9d6bef478c15dfc0fb2e733f16cc0848d3660bffc3443543c2c15ddd13e7202260bf07e6070f035cf4de1bc80a33ac174f870f8c009c64a57c4d4e34a3a62f5af16289c8a69550c1bbc7ece2631cac9a2001bc1400549b4138a051ce3c0f654e360fd2c0dabcd50b0b7da3bdc421fd7434b0f43cacc242138f5486a040a41b465cdee75ee1b27733260234e164e529d10e187ab413793dbc35b3a1979ecaf13528bc6e65e358dcb53c725de6e3d370aa58e04f6993298b87adb167187715659b2e85f755dd0648a3f3f5f009cffd81647764e134f8f32cbafdd79b00764ec24b02dc02c582b23fad89c39ac54d531bece98929bbfbce8c08f4adfc8ebc0911c5988cb0df10d8feb99ae89fa8f77e0fad3a8228d2299db807a695632a047f8457efb1e535990aeac15be2d6573cdaf0f0cea54c7f0baf0d5280815c605470119add45f0ba2cfe6af5c18ac63c75377891f458381eb3a14cb4ba9ccc397c67584e41a7ec17ee2207d48dfff7060125a1006fb1a2096e20e94d75eaaa0771c567ce85aec684b405ce200cf429c702508b899c74eecdc95ee08005d0fe2feee3b15b07728535421f9ca401a27336aec80bfceb6872f72865b07b0f343909ee7457d4a96142dceeb161a727d23811c0b71b986bcd54d17977f1996eb6b293b896232303aa8200c3f277cc5a79a465e127647e49134bd2b47b7c6fd1e2ff863dcd29d77363deb15f098ba98d8ab34060ee7b3ee1e16edb09f83953dc9d3202763e673a0653aae4a5006e39edc963045ecdbab1495c2e44b36dcab62694f35b99f3552ad5d3af077dc0f040ad48206eaaaaf22020dce7f33153a31f1f1e2cd3d6a85973b15f320ea047616cf67d2007e6d0e8b924fb660fef00f2451bcedaf860e5389474abdd8f06e40c1a7ffdeb8dc6c189c1fb6c74ee7a0c726b4f86cbc39ff1cdb88584be247c17e4bee8a1baeb82fff42c1fccc3efc857047e721870338954cc167473ecec22a7552e3b16b7d7da5b82189fdff58b3598b892907ffb496f919a471590b04106454b22e490a7027e449ae3379193e4670891575e9dc661796a7063ff789883ffe7b9962bb92f4ed55520a14acdfe49ee9c563fcb1cbc006097f2a2da17edc7a04e07d17137f3e483d29f0ea420143c9c43ed173f52a292aa941c611f9f579e0282501e701c5fdee386bfa7e5b12ed140bd15be54913c94d358d95405402762f0c4eab6e2f2c21baba3bb722887ef0ad7eb5157ff07b865ee2525f27263101adcfd8e7c9369304c8c2bfb4de777bff0387e31361c5e28a65ebd86ab835e89b22c67afab7c76e7be5fa8cc787e40348607c3e0b3cc394e1453d098fb14c9e8973f5501d72077cb3aa1f82178b461a087430fc62f06163ff6411eabd8d7dd19f4c6ba6c274b1b1b016edad5c87f6fd16ed7267d70777ef19b19d8d40ad560d5e1739eab8cae4792a7b5d89812ad88e7c475a8459d69262be10ec1f91c3af1d67fe77a6fbf7f0d4ebe6ef0bd166de7dee03761812e2b1858fb944d7cd5a22edb8fa5ff83fa1be9c5ba8b8e549cec2505023d195758713388d22c7035dcd4354d7aa33767aebb2a2c587b7f42f70e337791afd9547af8fc8c4bbb3f80d2f36a96502ed3e965fdcb566fea2c8a2253690b9f5a3801996887af6e44c10340469a7e4149407de51ee2e9eab83fc854b5612c13d0140c2e4d01afa309a353d007e0442283e07ad6fbbdf2507d9cf056ab1de56c919c71823a43ad718a1e45221dc2ebc43873db969d036e0950df683d9d3273c08647089cabac97e551e043fc87ee82edca133daf03c00070603a4fa91280d6c0366f347795597334fb68ea882d87ee1f87f4d1a9f638429c3a75637d78262143b10903ac4123bb1e8e36a56473c15d490fa19066d17e9c45aac5c838cf4c8ec5ca20208553c672184ab065802d4c959d3c778ab4c5d1bd93f5fab5fb0e5cd2d12dd21cffa1c1bee77e29327577669c64f005ef8fd06d8c3a44e0f032b233c7fa3fecc6bf2ecaaf87948e82476a97ff2ed5a830af9df585ce74a097dbf04e306ddda7926c2217eea6c8daaa92a33f95799daace88acc0b9aebf0f85cde627d9a58c003821ceaaa52245c59670bf8de4190600af0283af4d86cfe59a8c7f90edddfbd9ae15ea04021f3c0b8bf9259f6cb9a454847708755e370094511e715aea178c5d3ce2fb3afeb3456f891cebce1ea3e768a49afc4a7f6828d8036513cd1bbb5d07a327af24af4c7d8daa816a3c1a9be94ed60f70235f30ae3f3df0e469eddcce81bd2c8473c1f8d3ef02ee93f93367e53ecd005cf440cabf0203c08b06cc135c0e892ea47e571af10615223522013ea483b35137b6c8eb492810c6fc6d2c2dede45c22ffde58a3902cc5be61cd95100c3ac9ccebce100a3ec1c315640abbddae20eecdcb04ffbc9c58b7be1c60a40ddb15cd640b1b048b6cb462bb1c0b055d29a27d1391f7edb4264bcf52c7c9a9d4ee00e8da32a0b6876e82b11f41430552363e3eae4c4435218d95a09deb2f576df0efd71b34410df5a81ab656d6508814cb4702e1b0ede6fd08c03d1f1499ad31e046632a0472d03297d86444c3c6bfda8a4b8bdb748c683edd71551b1e28135637e064f00dd2720206e471813d9908fc5303d37916a54fe4509790419baebc00d33afa6aa037eee719b95f8eafe38f0f1267393fe60c9c8a1ed911a1443522edef65e21a9f4d90068a878b7855c1d50fad3ad9881bfc14ca70c4602352e27fc991ece95b7be797939d6f2e79e94c41bb70c2cc7e7433d907dd7ef882f38ceec0a43e648b072b19efafb84e60be3f5ee478c235385ee3fa59a1d6a324781a1b39fc67c9d1a956163e20c2fb873e057ca0703f6e1dde9acb60bcd2668b9b4a21763feac09557918ffc4f4eea0a4f0d9cc44eed83429381337c8712718eb9a927ce6cc0293bf836cae45d535a45159196d4839700f6cc604f3d2d8c584c0155e30cda8c8c01717fa0c7e5d9984c4c14856f7767a6f730538e669de833de781c1b271fb9a232d15700145b955f363550b57452a63da8dcbe91e46a1216106cbd184e90eee6ff0d15acc2b25ec79a74aa4f71d6b3a5005fedac263db7ec10f5071ab64bca6b59eeab8e7e035c4ee68396e79c28f6cd911798ed0d31fe99f342178078322a49077089b0b03864874150a5c689190c20ff20d2022679d1fa1c6d34f62e26ce115cdf2599e9cee7c1793f4dff71a43a40a56effee4d863233d7a6241d1fa82146042cca02ea20d2d1602c6eae8f158c5a0a60be1360dcfee05a38f682a99749ef3ddbacad74a9d813a1248a4bfca18e199e164b58a4e919862a287aa91a63fc07f7a07e88d0bee25109f496f98955ca29a89738fb5b3c33a96f1d3ad6b2ee027dc4170a339cc9b6e0713b9bd628f098fbbfbcb1a3ddb9436628998e592f72548ca331cc564ef923f4d834cccecf4595071a8c235c1fde16ed8e6823b9824be2b7f030fbe256b0dc35f76eabea2e804fee81c82dc47e262610a7697e2a5a4bce754320d4d44c30859d1f49b848b0403ac81841b9c660718ca144d3a039da6e17c39375be90011f2099cefaa288f46623856d77f6587688b8e38a1a8f5c204ae9c2d88ad622e89ba77061484eb283625d18aee09a88d852db82dec238b5803ba6a9309297e2a37ec457b29273b2be5218752f5f77c2b86e755a05613055ea2625b407018b5d088328b92e49408263f8bc8fe4ff2ac70b06d4006baf4c7afb1f389453574bd72162b12cc8e7f173226d165af8735e024371b730f4674135335e63f0b25d131294b529d9db250a9fb84b16c7373a116b8c16efc1ef63525e89a9063e09d8547781d7a24126d23bf138049d621daed9bf5b70e522760cf5816f23b2031adadd6ed6378beb1d596f3f7b6c509eb57dec36c6f78decc1c7b4c1eec68941ecf57ea3d5881ceb14220d00d948b310348ffdc03557fb6184df31324ff5504c56f22f8c056410f922c32bc1990d1ada45aea152e8a52aa58d591da4c0562c8aee15182408f5172f8f5a35675a6776610ea051930b52b39d65da2d341b02fbcd7e84508cfd7e0dcbb5b4054b936d41c91948b89c00194ac8f23d087ecdb4a508ac1265422edfdaae7bd768cc67fd19fe75b43f70a8bbd913895cd59899e4f020a1c64ef2ac2cbe46064637873425782790c2e5ced53bbe8e83ac5f56f15de66ece8a748f15402bb7d32bd70246106f97f728e36baeba596034846168b81921bf21f90e3ade509bf411c9576281979e61851f85e5afbb1b5f591b0269582223dd51b073ae5106852a4dfac27e953fbb4fb873668aa015113c7613d56bc3524fcf02918f95fbba16661198676028f3a0229a68883a6ac6c8d8c77e878f73fbf84f54c5ec37bfb9f25ff0aa00f76f9a96217d21a23a3d627edeff01e39000f644e6bfffd25fd1cee1f1bdc3de6bfd0010708781f28d2bb777de718c22a6c5e4c6189a11719d2f24a18b55fbd02b3db45270d4488aec686b5f6a7afdc2d132832f6b947cb6250a0e82204d31e3933ea780b8e90b4238a3ceb483b0ffe4760b0abb85931f74f3211c33cf486ad7c7b8cd71d6662479c8487b6b92bcbd9c81b3236b497911f132d8566d0a07de0f8e6cb0ee0c80bbce90dd211bd0439d123506de95391bdf26379c641d8e577281d7719aea805e5a0661576ab69740fdb5b5f578eb5ffa614b586c7bbacd7269afa70ee2abeb92ba1587c5c923aac7b87512589eb92d1bb1404c9d1bd2b4c20da610242f4043a7628c21827249f6ad51ec799c2018f0a6c3c0b501008f14ee6942152f843569b1ed03d866d0945e3b9fb819e4438006513695915a3035e1158dda51a6393f7be1ad08ef88673315be260c55a88e24a89dda96c308afa221e0a10d08d933006272088972d2dda687f27a873311c30a3de6573ae3561e996e4b0b688e29e6f40b32f9481d70fc4074c975633cfc71a966f0eae175e2e74e3026fe4c9bdb1ad0734061de6d7e0c52af17648faff0b7b861f19a8c50e6fee04514f4e4d2095157f5366ab71a00495ac353a5ac6f6b0b0c56baf80080356e16786042c5e72dd5e29da871dec73e6a1f68148c7117a84bf6cd00116143fc865b4d431edd449b5a2963e9748e6d88908f7909318cd48fbaa201dc64b87d518596ec00372cd3638f7fc326b623a1922db1a59d77be8148428281aeb063b60dc8e0a91df3f2a49d2304575a5f6d9c2cb8e7baaecbf6f5961d3117436a829a43620b859a8ac4de1f2e79f72e30d08122fd0ae2e3447e3ce626d4c71f1a7a7c126a4f55ad6fd380ba9e99cca42a759bae5304d26f4cf1b53d88cb112269b547d035d482990125688a3082401a8f1ce8e3d20ebc5517888c4d180d44c5108ab013f55106fe1c8eeb4f4ad70964ae6dcae3b82c73fcbddefe80dd4280ee3818bd4ae4bde751b8a3a0747d921577ad0f7936019f23378bf850a6501e50b19344e7734cbc462e0f492c2d36343c13785988e617429b96166108c12920791a3ef18b7f5e252631831a9bb7664391a998455aa7d742fa6b49fc52c7c759d63e36152ca18c6ab846148dcb351b07606333ad7668a6ed69f1d6acc9a6ecfaa8515845469a426d64dc7483d4d90b1e35e14386036d680bca3632e9403f385c2b463dca9799a3e57cc31fe40b633744bf5f7cb818c5af7a8f27c9a4d88b7daea99ba1db01bba02002d2bec3075796991db30ec1dc2f98929c0ef031b7446206c9454ad111226f19614f391eccad26ca805f039f6d3a4d712528a00408045172bf502b5a5c90488c4f2c6356061f01ef33fc04763c086600e37b65f581bd24a27c9b39a7f0c71b9cea5430e36e091998b19afed0741a66bc5c06089689e8111aefcece76e8a5c3ae27d1913ded3d60f17c989d019146871c37bfe619287d227453baae9b2020f46910b821c276fe3266707a64679050650a22e2133aa7a0f16b34345144c4ae87134dacd0e1ce3abfeab8a55a7f9827b2d0892a369d4051bb0c3cbac10d04f254f0215cd1cb4438293c497cd186130cf701ab42e94ff165ffc43310fcdcbbbe5fc60a25a8546e4274199d30d213708a60f739f2cad37ee467e370a3d517bd96ff405cfe44406081334a00ac618c80a681892d6c77852a57ea8ea3a0184b8891f25277d80e941b4fad9b3959fd37e1b4af560bc46c08c868fad56c0d58baf73e6466d959e7fa4047aac032ef09550d0c748b045fd1799dd0d5a3274c272c7291af54c621c1d35379f8b17b5ee8ccfbbe94e88ce136c3d990b9c0e2e7b2372080532e836a6340f730e95dfe9d74f031fde53835a19943bce7b52baeba50b8a2111fa65be1e97b5b46c3c0f2d16105a191dbb0ee22cd5820c28e8020bdc2cc92b0021f5bbb78e8d5b1045b43c482107b6cdf2d0dbf8f9ba124e761136e84a1ce9b0094d484fa620957fee615abcf8441348e477fcc64bb493316b0984de66e4d773e620a22dc8919621606c78ffe63b4d3db468688a05d2c5060305e203ce78059c49118577d4548c462680702fb76910eaff70e27419cdfc7b1054d1da93677efd4ca53a0becfea6f2d33880c4c117e2d057e322a7608f7ae3323eff09622bbe1430ae4eb25f090470ed5684ad9d119235ebcdb3e3c2724f2acb589d57fd55feb38c51f5ec2343e1305a75e0660c875c17f820675af3a382e2c3e47e5347f4172610855131b863296a1f0b887fea519a57bc76aa6df23d7fa723d3a749679d5f599c76d130c9f97a66f8d83313ee7c0083fdf5caa5fd459a72ccd671c3d54cdc681cc82f6982ae84989e663caa45ae7346adeb36bb7abcc2736b763c7d827a97c2f701992f11b90791307ea793daf7b20d0b57aee07b39270aa754d980a0b600946fda80db8432f6dd1b420ac08242ca0196960d12c2a00719c1ae439b94d43082d2624046a2fcdb36a93826956b827e1c2e6ee8aef4a5c5c2d5442252e5fded5a2fdb1715943b656dc2e84643bbd1d7e85a66d55d6678c1314461a71ec7635e8f94acf22c15f903c2fe3df71203d07a2bcb2b58f76d9b74f5ee302abd2a0cac12ae0abb0ad118db49ee5632a6e3afae38cb07831e5fd6243aba101d532e58c70c5f5c4e6f9a30a7600e75254ffd463fe55f947ca6d2af283cb5f3c4e7cf1afff93c707c4d037723a2be99b4bc39e9940d1247c9f48752772e23344cba813cc76b9ef7dadf50b7f51e76744be74741017857c9357cd9c09910f34ac55caa1b5a768163a6ebe8b289e315c090769dff8c983ec2d66e65a8b3131cc81812d8336c5170671867990015d7d66d12ef26c17c48d40d686fdd8bc8c7f07e87d4dbc7583a7c3fc85ad396adedb961bce0d497c2384fc8432ef0ae40df9b45d5b09e811a1aa5152035b26d4f396c54cfa6661389b37ec2a48711c33dc258a1f53ae0281633a98083bb118a7508d114fd003156cfab92284225f7c9f2c46db167386f730d7ed1e99508baa14c300e337013a6633fea98b4a52602153186d869acc0b44461b8face84c3be8e1856d51b71f38908bb1e57b09aabadc53ea2445fdca47913840bfcaf2d2854a0f6a18adcfdf0167d4ccf450e4a891e3485f6c58837e983a25d310392a5ba70acf99ad481f1f830a3b256ccbaee8b8227a35e8a58b28dc0d1da29a6be70ff16734d580b26606c1bdf3afbc7d2bc21ffa79928e43bbfe1ed7fb481db9d1b1cf91c7d7abda83ff750db30fc7e8bec7cbfb369cb36fa021e943b6b47ca28c9c56765e9f7c61e5d5110d898b05918bc778c726a64ccf68a60a4d446e104a32af659fe3eab134fbb3193f83b3a9fd39ccb32f2e2dea2da23cf9abbdc8f15f224983506056f87469511bff2f01b18f25c9228f152fc2310529a28c5553eb71a7a6801aab79a472f5800c4608be08b59f9e7152e3687309383a2d174abc57ba9e7267c834e657d741e73709fd77f76c0289d568a7adce14331bfad9a0f33a4ca976804efe23db5ced0182e968224ce30c924bcd082e995de57faf2573d4fda0ed66eb3ae0d759865d4b7741dedd3c69981fa17dcf3b8ba773bfbf75cd2445f642225fce3203d24f965ddda233fa41d66710b6f154cd4958f3a32a819881fc2ff1ca757d3386d408db447a20b68774b0820074fb97481611ec3bf3e264b01481fd107025c770081994c532457386e1dde683397b8f28d8307af81e240eacf4ca8a513044dee4ab9ae80e89c23cddde6ad871345553c3cf5a80cb29106d71839d1085a4b710fbdc5bc82c37f033d2be65661c56f33cb905bf0c12b4bd18c8e6f786430357e35daa5693099d67aa69c036416c37519b933c37ffd02a5f63e7090771abcd90f7d9e01bb9a3ec919a7cfa5fe38c82a80a59f5ad1ada62613959a2c1f3a7a0b7dcc2e5a2a32fee6e3a8f58eacd2d840b624199f7d1c640bacbf639708e3c9025d19c9bfc6794b5c0bd33aea9a67d79897e8c0e48f2854e44a3f0f6a9928c3ae400e01afc26acbd75282f76e5024b7af66fbd3097f6081cc020d62773e03438bf0d1dcff01f272f36ce1de013cd8e10b1279a375dcfc95bdb1fc8361cbe102636390cea7808793be4b2a13744110a504731e6dd06f0b740d556ef5891368763ffa4126389fcc256ab8cb9fe69d47493a615559a3cfbb059f7eb8e1d77859acee4b6c48a401b60123d4ef0296a888fb67afacb9cc5da7f09a912beca4a62b023f10b3b64bf9e28138d9c01f87c3757cc8b3cfbaac6358feb11cf8fcea8515b6268c34f672a3e83de3ddef7f2c5b5488546d26108b28e01074f50f180133bf2ab757ce0aaed3793727f2e987fca522f29e8ca35ae335544a7b9cde7b8013cb9992d660560b5e3a603f48907773a405e70f56685b9c36504e30181c096a0386a98a03aec70705033154efa3aace2c4f39474751e3d34b084f692fe2b0069179f0446d012fa9ad591608cd8da48a7d9c3eb06721fdd00e020618ca20c2e9ac66c59777c38088cd9ede70eec1ecf8ceda63d73edc792cd4414360d684bf57241b5d2dc6b81b5ee4956a6313fdbd41ad6d5e8edd070a21e755d6528af5865961676dd9f5940749f36c41fb8fd8e51b83e8af26d88358526b2ca4e1a2e1bdb7f9d361e6b33dc095d18ed43be423d466d004be044083623d22633eec7af79711f9bf9b8b18b47c4924fa9aed721ce2663a7dfa4bb13f9138e28f91c9d05cd88c698a00e34a80d0cbc402a7abd1f00457f2807404e5fea8e51103140ae88a2fa49d76bd4f72d6152104376652bbda6fa30dbab2c25a0e3417f61c985d7c90af74313fd1da67ce86adcee4955ff4fc502d24b0bc33cbce06ce002b7e5b367d9de5ad44f6b676cf27db35901071670afe22d54c9b1233db73836c4e6ac1cac0090b5c3a7f4b51db9de5d1734c631f49c18ded45dc2652548a659f19baa99a63d62f5cd9608b8661cf7fc88ec0ade0d13568d8cc4091e07c7d9d8544b4b521e616ef141187ddcb9f4caaec7be8d90cb66ec8ac2f78a19c48f7d18b55d596b7e6aeec7c3ec1222fad3d5bea16033b6ea9ff30f94e97d661e922ed23bfb9557fb1742bc36dca6b202f9218b2ff870b64c7aff4acd74513fcb8b1d456c917adcc57a88b77c978093edbdf8a5d4cbca0319f731c8b61253a77077ac2d575cc29c65290174ab6bf04860b8168737dfc9102903df24368f1f7b2e178eb3a0867537fbf301dd75b00070e5715cbbbef5f1164c30a0acaf78ea75b958af893f4cf76def228bc6ab77bb89d7977d26dd07a957c35321ebeeeb8e8b784947a4c5c44c85ee3dfbbcf8cd429f2cdc161c5203aab4b572b63f2e40759197311856661a94e1cc9cd9aca266af0489cfcbdd653a6ca84cd1b70175bd6ce932840f5f9dfba39dcca3b15b8bcc9d7a077cf38b4e43c2d0579de4186a7db488367c2afd8cc8732d7b3dde96a334335804c0bba48fd0465286160129e4481274a79aa46b54e93c2e6b557fb2d2e72de5f0f92079de6b46cbe80af70ddc05dbf944d01ef405129b75cfae13b113425d8444715edfb667ef8228415d7cecb2402405401583d9a714aaa3b8afb9b9b1626e82f85bd8d23c1677f9be212935ca19d341b726495f50d178a17db767ee7b105b922361938e6ef2420cf5572ab2cde3a05894170bb10df9a35a2e5a0d9d5a9078f169825924259a9ddd8cf0b7284105c4ac8453aea54056c6ace84413998ee6af9e2d8cdfe06af335164e90275613a357765f1c55c718d037941820d837b766264d093bbfdc7b703e589a9db324df79612fcef727e912acd2fbc12c395e98c7d8b1278d5a3facfb2093ba0a2cda2da673c300c8747da11574389142f859a588005ddb716964efe42cab10f97dd4a04a3260a5a6026825e1129294e92e7f63388d2923e31d8fc74a34a0a42857e41f811d3c74131ab73ceeba63417c3b902d4b962a476d8c8323527f6af03dd7aa2add82d9e5d21d4bd3b63f8d5508cc8ccd55c07a3e10328ba0c51bcbb616b001141ad6ccff3f3a52ae6bd1fd4ca26c6d2c219c7bf9e79d7a2e3c7ba9257c7b5092002ecd22082564eb9dc786681fe513752b2064882ce7dd52c19c32984ee445399c00e09bd31682a5f0d7b8268c65436ba0d4356018998a8dc55b108c85c25e42587866757b4341222cb7008dfdcfb23e80fe0352dff5687b3b98ef8289650de50556b045ccd304befccdb98564b82a096291f8cdf2760984f3a5290a44e3871e8295d4ce30812799d74142d12bd245dcf315f4b211384f454e489e87a80855f5edc06f7ba2ebd1219103f1ae4c0ece8e9e7b86b196566358b05cc4df733a2ca3e5cab2fdc14807f1aee61f8988252b09f975d591c82c0db757b294e16594f050824badd4fdc72bda7cc0988fd65817435a9cfc5ecf0ae843a427087ab7c2fe99ff5d4f65861a8bb8355a059593c638fecbf1e3a826ecba88b6706a738c63869960964139c3d0270f6aeb4a99ebbb0167d39f4efcbc8d84c7b0935899900a22b627eb81ea21dabe8162c59ef159e27d7df1fc13d46305e063c08e38fa1a2f902cf4a1ef9a9283f950a2b9ce2ef5120a77f313e7e5b123c64f0262a11e2327d243d216cc9c58fb1ef7b3994793308c3bd16c10a0d18170e663db168a09583b91ff6e79fed89629b3d856c6602382e5409d99925aa9c119ed429896044003f6012d99094afd538de684beba6b7652791a8a5cf3cc39ca1b042183b72a4339e9ae4c3196da559cc8660297bf7c499e329fb91e7279aa905c9257458f8b6d393ccb510c8b509b941841e1961a04bd5ae7bdad1b7132039f8d7582d268021d3a9ed91be2b17950d7a099dfe963834521e13ec9a009ef037c908b8fd40e854dd14a69eb2352ff34b3fc44cdd4cfdc9b2068c69794998649b60252d9ec53ce26c30323a7be0a1d9d2e8dcc9241d66c4f8baa1878a66b4c3d20318f7cb8119a5a146e839291b1a2dfb1c458b63f01f802ebb396276b7631605d285d631b0245bbb3efd7c7e23feb5c8456d6cee8430299591b9e3b0aafeae5fb0349ee5408ea192cbb605ca9957d1edeb73c077b7f08c421c4156c966017978faa5301bfeb8174e71731e1e08101ae94f23449880823d054c3666ee2df0d44641641d218e3c297868bb7b60d9d0a92abf6f012d403850546b74f4f85c1a0b4216084a12aee858dcb42edffbac874d5913fc4c19c893c06c9afb179fea443106df3a19bee90a03da1acb91ce8bb69102d4fa1c5c32eb3bbc478b459ab40428ea0d9c4381b988e037b5714621a2c733015a3240eb88844075a1807ab8be0318244ee29076f71d9f8a70c88e30f36c992efc24cf97666adf3d19bea51ee0ec446856ea36020bab08b7a543c33ac54794be993443b9eb60dfd9e55a112f64bd2ea993a220a46dca03c0d79634f6c63396940b1e7b052747d1651306971e7ef68338af2c5dddbcb20bab86bba3c2b43348c31284d9b759c7a62251a47203ade31ce59a9ad379f21f9b8279d35140f3b8c1b02a0fb61d1c10f7f5f8cf8fd72dbf29fe5c51026a557d536d2eeb105b53aea8897aa7a6f0670429f948c44e550a0d914072b73a8014b2010a6188e915f83981895bd3f5a0a3493aa1dc054fbd7f9d990dbefee196519f2ca6883d1118b85ebf42c4c50b655a7201d13516671a134d50284bff0ad0bdb09a642f3c149d889eb587d73424b1a32debfac2e237cc88176630518141aa95eff800710bbe87ba9ddfbb24defd95f2b706d96acb173bdb27c42d9b5a0198b2eabbc80641676ba36470a070db368460d3923af702771e00ec74270081b3a0bd4e043147b9479bab7ffc6c287bb0f5995a3a23f49393ee0dc99d4f9c6368b10a22322cc73741c13e90ad22260bb6e01ca9849e002338e225d1603c0f31949bc406f8a9f5594225739d39227158c362c3708b0ae5132b2224e2d300ee728f9917ced6901cac10590fedea57360968d08e0134e50abe98d3a12acfd393e93a526b6d6cdd88673aabfe7bdec8abd88bd6d07db79c2025e19661fbf91cfaf830f763b38f52a7448f1398926105ba8e4df2ec3e8b5089a60e6be3b649181c949eb2f9852670ad6ab8a9b538aa4b69d0ef48b3b10b06dbc8723b837ccb1d522a7ae506a04b72f50cfa0d8029744da6d3633f95df991d2dfe04842c66a06639cd166f741b5d9d5c794fe3761022f13ccda325af6e7a574a012bc766bd3f88ff20248afee366c2787572fd475d9f2a9ece7994603213016e52f93b13429d82d26d13b2bc0b584a4b19a5a664cc0bc5772d40f77cb956666e67125ffa396f8927a77bd2512bfec6ce210515b81ed8f56b4be8b677895b7e98d3ce2eb7959aceeb05926b0b2cf7c47c32c93cdd464445b4983eaab69ced1c1e33e60aebf28cec6e2f957aa635516e881ee6ef78862e828859161a6f2cedba7422d1f6b35d7c0e6be66e29510698b73d202c52dd1e043800fc32ef58e5b08312f240765450dec88fec10d5131b04d83cad60f921ebd85b7379cc879a4f33ff23ccedbc7787005f55e0cf19c39af55315289af8ae296630e85ffb7b3df5583ef8616a39011bf9e3008e02148d589c904ab567674b2c46ab30be054f9ae23201323e58848f789ee48d6d5f335941c3bc54de838887327dbd702d2bf7fa861dc1421bf8e76bbb4adf1207a43a155ed98cfbcee1cd6cebaf351d124c1bc1179d3eadcfde0f22a88c8989aa9db91cb79d54171d796877822c3bc2e1562a2443edb6ab0a2a7f37a14e76b028a6590d4eb80c30ccfb5bc114b4c4153b94e122fe565db7be43655d8b88053aec5eb9e2f65bdb00574971e4b59cfbe40db65204821fc04df783278f6e99e77e3888ea5591bbce12810546d759d278f5c90ff46e33d3f2ca3651533e0122c5e4135590d486ba75d4c6c8013cbeae0786b06c4aac200f828c8a6961c6cd8b538a82717996fe49da94f8233ad294faf9c3b24ac6737ac755b44be07c2fc96f6b688663dde191507238f2bceac46760f726fae51697c06e7ed9b5ce2cdb499388067a40388f59f7d87e37cb9053921ca5a26ac03b1f533367da375c4a86d21d7249a66257a9f6bfe3ddc0c35af0d945d7863fef070007f71c151e1e22bdfd4494841a7f405a87fe6214276c71bac5a6f959e7439650973e4072467a063cd51174a4373ee278e1eedc3b0525b8ba74abbe0a51bd950ee7a0b7f58503537e2931561179fd81f6620d96d05a1ce12a9588bd09bcbd0adba6a3b836432dd3950c29c582df42872e21225f9ac6c24cc0cc81add0518f518b0745207957b9fd8d4f974dbf1367bdfe6a757b33d6a5507c9ae0bd8483e4a5333d164d88fb4bba5d5280b4fed5edaeefcb198ff614ce7a3cb765dfd6a339b1d1a97f9a3e030d8c540eb64322bdfd77ab8493c5b1804716a94e973faa764e88fc59f9557ff259c8cdcebc62c6630904b0baab372ed174ebc92128aa5f1a316defeeb9768d8953f195a8a08e29185c56dd5624f975ba1c500d9e21e82ba46343579b241998baecd1d9d840bd48f094573a6064612bb4cf730c76199051b14fa2d882af6c2bccfc70d068deb1c24dc1fc5ced0c4f967b5b58408d1e0475d7cfec7395c6db77ef08abb88f7bf2aba975dd7f733362a3b61a1dd84d0af2fc069d688b404d460a4661767b7c6e6ba056ab141ffd59e5a39bb96a6adb350989016f8c6d3dbcabffc3958cd035aeedafbb0f1e6976eaf42cbd8110a3dd8b6871779a9b4d39618158b0876567b3306c12a1027ef9a5c4cf74f486c6e4d4f808d4656625e7c05754a54b499ff679b9a9e37d376f67b15f10001fe2faf3fd9f89a8df44ac7bfa64a7901fefc5a4232201eaf8d61ffd33814e7012e51a7bb1847a35849f522a00889dfb618038d4a35bca21f6a1292a921e0e7c6b87b77a73d00585df2a559aa3061a851f40c4d2d9af5e398a792f09bdd8b72dc03b4f648cd2b31ddc8610fda382040e8a8262ef3100d158888fbb2aca235482c1fd05fbf5f15ed8ee0e39bd643f3fd0963e77669a72f86f04157134a56a59404fccb4f288cdb5dd6182523db42524102b46662d011f34240237a017dfa56f857e732c8071e6ed4d9abf67ecee7a78162ad46393da94945bb9e91291b15d63871848a79122f652cd1311b5fb1d6e0d80b47c27e9179e7fc00651a8a4573a71ec348fa120d90f27041cfac1a3c3df5ca7fadd77b0c1f64f6bc62af40f5e47eabe93e4cbe0e25442b0043e3f55b12fbbef210827b03518f8401cf9f7d2090fe9c889bacf0c3b35bdcdda4e22a0c098a72fe06fada48220109f57d30a56a498c6b5060629f5c0859d98a5a6735067cca06c44e9351d531a26362006264bfc8c1bceec9111b157d582abcef55cb9be5241628dd22bbb92931ab09409f9d5e04f90250f9b4f16c648781d4abdc988716255429a068798c64497d20b22d0e380afe29ba2ffe570c9f2509c434964869e4800366b89bbd3950233276fb561e940276338d5f485953b494c32509e14b7b584002c889fc6cc68a92f262498fe9ec3288d2eea7a4288377af78e6f29a8e2f68501a57d0d9cdb246eaf32240cea76f93145b24a11289e0a143346f4f09285e8cb6d64799a83b307f8ff50d83c2de70e4d73ec80fa8bd6f689e53e57a6f6e5dad847d0c0a1168eaa546215fc45ecc8662427a15e44c356809791542719226eb21977f46c680c0bdef68f167b67af47b7d8bc8128e0d5b1a28e854d252f5b20b081af2a86369a710518a754092d1a3330205341c31279a96fe04a60c9abe2b97d9b953978cc7a12f30d2a0226f8898f7807285da2268f78cab075cba6b367af136caf5024d717a5cbd15f99e441c3afeed3c6f92130c2960ba487250a1538e7e1aeff17ae4451a27d51bc6943a6b1f56f41b27a56c8914944ea48cab098496f35ea1b8d44aa81615db4328fd9aafd9488c5fee59d2046401312dd60b3efebfd18f8f156168025c9a1bd64bd79303716913f754b8f8ed156f617c0bb6c28e83998f2414b0a0daee0f4ee3b0ca936616c638f3022ca543508ab108d4bbd342cc4845def43cb89beea0106eb8d748b6cf4c95c017e4c4a3ac25d17df8f525dcf903650e8eddf931554b6de7544e8f751ed159c2e2f5b82ac46240f60867cf508df4a693813f89ca9d0dc54851e27491527c16f83e5249e4b3f22c2433080ef379b5bcfdd5cbf44648dd9559b52a95dbf395aaec5ab17a56f213c2c69c2bed246f161dc1cda431d606573ddd67de005b2c9dd71c9d1a8f2da9bb7d928d76431b95f3e60fffc6c8a52f4c534489db616f207aef8ace4b05e8267287cc63357e603e2c377b98e2470a7f23c7fe7e86e80df2c4768e64ea4952c696606c15cb24cbc32a69866c524166c55d0f81e3e46fca39bd4e5651eb01c90935ab000ffad5d6735e85005b80a4cd24214a5d6018ea4b858a2e745c7552d999ee40dee0df7ef9a01208c0094b1794871dfb90ae984ab469038802991a76687e68800a764ff3123b3f0da7a4fca4540b379c45a779a0aa9f935336a453f87ec801d8b00063867ba8be5487ba668bc881a6a704154756625499248912dd347e642bfc949f7e801b158a3444cd9f06473cdc06faa139a002c3551667f22136dde5ea14fd273509d0ea69e2a14712b6f151357c87d1c558c75586f548c7b871d780a425c14ef869e8816993695663e226573700d9006aa4f4535aa75505f2a144e2ed4134376485125184b1f73a9da58a34b12226c12265a0ee0b4ccf682c1b3779af32bae8be28c10822e4a027948ac60f2b20d974c32afcafe314563a939ad2d1a6bdd1553685e0ea359defa12224e5eac09504edc2f99e3290860633f9e4b63bd8f6e6aadc1ef4cba681aaf996ec242c3519e4a2fd64d78c9c8de488e96853f347dbe9ccd45899765898c7b2e59ad29ce60d2b43c5309fb2a70446e1c0e13ce58bd58ec20a69911d7655e984ae43f120684b0f702d870c6a92c349d949e9b39fde5c9b62978d4eb8a43f6bd41a996b60af63218ae4403cf764210cbef154efdcf6df34debd58f1b66ea750079f0a97b9368e0a360d92df70e09365714acf2114971e912dd5777d1ccbf2d2a83d5c038001846bb18837b74ce525150e30bc0b079a353eb1b27183372b1ac0be01fa3e7cabd34f92318d3fb5d33e6e8936787da645c29c41fb3cc03a235a85dc4bcfd6b4e98073ba2d51f14a70b65f5e62bc007e76d90b3eb086e91b6bde38fdbe70fde2dde1272cc665b4677ff6f5b6da432aa221ae4217aa11be315f9391895f8c17ffacef7630d64537896d79abe4731db3dc2af978b478f43bc7bae44e06b61f9a528035598837062f7807e51108822fce16e1727566768a157565b7369c6151113804459f7495c46648bcebab6d8e187149d98a2e3360a0ecbfc0b607ac48160418bbcc1864f2845f26712844c931945e73fd3c819ddb145163bc851ce598770d4fc1f1f298d2f32d76709df7142bf3f29c5697e7c421b0baa043de67baa9e14043062b53ac425091b395a975447678fd136746f08f592427478487c1e99e52e9c75c2d362938bb478333b6a3a60d518f8f15222cc17690396145d0d6f8cff859aeb94371b12cbc0dbafe8e7be138020143c1444d0211f3aea1f861ef1922d8a15380ba9b46e141255c15e9e4aa08238d9039812855e3ac7bc5e9bb84dbd3016c94430de1a0d53ca5ce8c135db3fffe2a53e44e1b0f29b629bb4f52fea7c0ad3dcb59a72b569a43bfa804e05d07c20b7813f1902fd2b07983cf9a13fa8655fcfd937344779f21d62651b891d95ec9520a409d2eac6d3d22466c8be96b65512de6fa4f6bc0b50b6e6c48394bfbc4362d3334812f328ab4fb6b372949f6a89a23f8b2cf6a1e5447f9e9a8854f462853215981056e5ac11ad9384ee58cc6e3b0c79b72c800288a01ec4a0172092cba8cdf5df0787ebbb0830296ceb513f491f2cee7e01c5744800d66a7436f01106966c5d9ae21142efa1c065c260d18fafb302f3d46fd7a010c6c546318021e1ea4167b89c43689bb7ecd0e6f6cab5fc5fdc489233b6ca24a210eca212d9245d1edb0b80df7ea805d6564a3ba0271283dc611e72cabadc61848cbbedacfc66a08d84716c35080f97988d217223aca933289717ac1cb605a80f7e692225504f8951b3bb4bd4cb2a7f62459bf2b7c976f4044fcce3a76ac1f7d4bdc5bb0b6c5c2976fc84b5e1047cc41ba48093ccd7b6b23b43ab8812d90dad273891877f558444037165d04f67b00027340f337e0ffd68836ef72be029b6b089f8ac86f46f9403b40cc267b7edc5e2ddb7815bb72bc220bb09cf91bd00828a0c3cb79d11b50e9dfed861d15e38b6341957f32f5f19222a18435d9d02bd3eea26b622a74bea261164a8130d977000d9f7b855c4ac05f6d50d43b79336d5bf7ebccbc5fc42f9d5049035f92e095fef308da00045dd39c8ff63005e488b29f6f7683210412896e631445f1d7fced33075cd402215a67d31767fb5c0eb2edf1df30dfdf6b73c85b3ce93cab4ca9be8c67d9214073e821d9ba578f059ea87c4f921e4fb7e69110ecad840ea011e9bef87ad8de6eea178256ba846b0916e1eb12b724e04014598780899cad7fadd7505c3e55d10919c0e0613af22f526e42ffe9b8d149ed9b1b003587d2f46038100cb3f93b4f2eb618df9f49af6e4f322183db85644a1bd13f333c94d7b4a05745cbdd8ca45a613c6f6708a0d7d0ed603b03f98e95f33a923d2909804c77dbce2aad0e329603fb034ae7ecca9e006104d4650b3cd5f81886f219344af5d823712042a726a88b301d5784d40c67f20f8b1b2a8e4c93dfd5496581505204cb7fabc772f393bb4c25117b5f322247d585cad46044c9c3069904cf25f91af792840dc898a0e8c83df7039bb17c433d929a5919a80b974c4b1823d9140094c82cdc17a800ab6c1c85127f9b7b9accab494194f216763c21c1e1297dacf22fc8f2f8154a9acbb2f662d032964aad0c98de9320da00a936efcba3c934657f2903ba410718864d78d13fc9014307a74d05cdd6d77ca055831f94905073b51dcf0b571360728311f78ea3cdd3ac35dcbe453e28906f9dea726dc6181ef81eb513c993ac531138935a3c10856c9418accfb0314997413689337e22407cd0a4a188778d25a5b557e141cfd5cbd13f5d9dd114be4df070bb01dd30377ef16675defaa5b2634d0f9f97987d9a33c5167e3cf8226c9c2f57baa730d3ea8b3be75ff9c7f51929643a770c87150365b7a15bdad94f72a526ead36c52e26fff75dbb967b9eaa1161746e80c62192cec76a7d5538b65f15af7580513134284d11eaebc2c83f319e5475980b605d152f8b5c0a34be43317ef664f4f00841135a93f1336bc9240fe752d4564ab1d83bdb21aa396d925df00975963088900745b080a8f6ac7217839cc4c8bd65e9e862160a12dc36bed1a7e0191399839c92099c85cc943a8474c0e4f0bf8ea04a10b36bb9e65460cd9306dd48258cd62805136a6dd0b5cbb9def29852689e3b7aaccb20cc32d14225f67be7ec94a1b739ea941455cf04b96931dd1d410387b557f9949b18da4ca7531d311c75b5551b744f20181513e250034d67b528ef99023d58a2431a8e0ac195c3b38c6731b279eab0bda61e37c29974c14ef036c25629c674eededc587df5bbd40529f3ef9b98b7f889ff056904943b07b805479bb1c6714dc8fa83c87a16091107cc1f4a3cb187f15c074e071d96b3f5fac79af477aa3b8b1a8691cfce9784a0bd73eb8bbf9d8b881e44fcf9e8a86f1167a97bc54d2a7f7b447398e33be97fd2ece3f8ced7c835f2aa344dd2a74f6ec88b2b6e177875c74562ab6567182bfa4abeac052b6afd7ab7bdd2fc8d364a87afb6efefd2d7eb26227de664942bb6b6f0191c4df8ed93d3e5d5c1932b08f6234e3a62e1ed49ff07ab498e3417b7920e17eaddf159a7417e6ff63cb6f39eff3d4ff5ca89a21120611c5677c2c0efa2b78ed6b35a444797dcaae8539c45a2c83c843dcfc35f833f10091418bced14e3eb7fe4c7d2baec7ade52b2ea1ed93f351bfe02d4389f51ffede91f5c33f66eb2693d0e98bb59581da7cbe951747105682d232e78f46f578303436c2c6c078afcab31957af13d60c4c31155cc97894273366230e0bedf8963a423d48313e250b80270d828ffa5cc9b50a708a4be5bc2f0318b80d5fb5de2d8425d5de2dd5b90eb5127a8c2c9956388391387954b1047aa056b6c94b13bffced9075ab059ee96ab4614bdf341e80abd4efc7d122f28787ca53ccec0011deaaa704ccd2c4215347cc34da525b4f937188dbdd137df599754d246648e0bc791d0cb215ed9e88f70246779b7db2985270a09812a0c40d4fb92522b8b2155ef3f5fd4678bbd58767fb7d7a5a7b39bbbc7be735d04f61887bdda5492d3a9d645ad176b47cea41a26b120bf9e2c9f79c5d0faa7a164d383852d3fb7ae5171d8eb4f77898f1c82d1a244a3e2aedf7932d4588f267d9b10b85fa06dcc4473a8ddf1614b88445a2aca1cf7e9e9706bd5aeb9b000a0434fc835404421a97a938dd017a82c1826410b590f457b284bc1fe4de550c692b20a31223dcaf1447f70528630b14a19b85d4fb48458f75ca34b478435fb83e13edd79c1eec1de17313c867bf4e00b61b56f633540552c6f0b9ed45230eeccc4921719c470768c45e48c209bc6fb6bd4c38afad91fdbe308fdb24a5df4b28d739902a4a7094286fc968438657e99b1d7b621f0c7affddaf1c1938f18db5ab59907114e60c06a24b861be315bd0d15f5292d0d9ef43215a895f00bdb1caef75b614839221d5445966ac0d030d9a4233b4156d8f0e83aa7860ac7967e167b21bbd7586e4965ac9e6a4e650b0d9aedb944d9862afffc270b5c6792c84761ff155047291402ebfb7d26b906b65c371e07a4a065cca6f8bb7f1d4183244c0c606bdc9ce633cded1cceb6347b3670433a942f2c18a877c536f775072677e25ba9cb2dfe0642d7cf8a9db7d628a69e15d4c15a28e034c8a3f734046b3d09c57e364b0ec4b2ad7bc36dda91f0ae51b0545a1a8efc67d5c13936358bfa6971c14239db16d21aef2944785371bf53c47669fa39a30ab98865b0b007c6eb1095dbedc267a820ba9e56cc3b9ef24f7a440ea970e0899b57ea5258c43b2b4dc02ae620ff65f0c48cf0c044bd330fe86e80089976599c3d91aca0a6a08f5f33df86c8e10abd7ecc1850b3e7fb7946f2dc763d6fb362db58a970cb7dd82e9aa6b81f0fc2f873a204bd35b6d1fb8bd43cb79cce8c6590e1c19e14154b2becb426cb685a6b0b98ef9e56167374979120fc4493a4275863c52bc41033175cf4e94aaa6944722114712cf0f6a571e31cd8144866aa2602879659a307b675f0e5793877b32b6d6db7a2db3058b1471cd270fd99ac88cfc09996f18dda4f9bd73d08cc72d39d8e54bbef4509a2f758cff232611f0474e336a6c42ef9779de2adf6c8361048a39cff98ac3eb37ffddfff2e68d8f1387678d839be716c4af8abc66012702f504edd87b227dfcd4dad71c1edc236beb3308d4a237c990697e194a0aed0f8ec71c140e90540bada5e1c19629d76126b2c858ab6370914598e68c71b026865df9d6043d2c591a2fafa927212b69666cf539a47b3906747d9feac5fc6e91621454b08c0fdb43ed0c0899268e16597986216fc83c79e1b266cad42b32d324a0fbfcd501ec044b6fd181f3e7142969996d0b7f93e6149955e0b9309fbc3f0a4d70a1ae6389c6688453b4c4f2a85e85bd0130ffc169b8583d694d565e58330d125b22d0d961c8638919991084f6d9e96fad1cd844977596160083fe7814ea6d4456389982b24a0ce6a39e5df2c53d1f7162c93d8335bad25b36898ead329848e9b6c5325d4a8583bb3ff00495d4f138f7733816b208edbcabf7a5543fa1764a27995129494895d02de29a10f12db1a7c950de8d31c2a86149c1e0396430a1658ca220a6755333f9178b21af295fcc8f5474e081d83e47975d77374b325f68d8e276672783ef168238e7683c8222e1aa601108ac7edf415980faa1e9f9820dba28d4403e2d78767564a3231241206ca6d12496f30314253b19a1a477e314a16dc8c0223b60ed823606d2a0638b19178a8ae690bdae60c403c76e46d8c97b1e010a485c9f062f0cc4b88deaeacde714e84306296eb837140a8785f9dc6acbb879de001f2517801d7e0ece131774fbb692932c2c92be824928adf23c24a68e7240bad554aa12a44fd5d4efed2d96b4766b4902bb57ec0afe0fab1a2ee770b191efe87395fee284ed376ca7aab68ab2370a6b52e49e10614dea151465a99fd761f89f31392da2d55ee5675918b0c1b0493a83970e6238965149d3bf6d3c16bc093863db6e293f31678f18073938584531608ed6e5a1b11c3b00228af7def4593494e9b00bdb3390c955554a6874267852b4b3d5eb5547fea55f2f77f868bae4ff4b505913147da4f4aa125540f128f9cc9b2e557583e0b1511cd3d8d1a96ad4b6c5d90629780f618e6503356159ea1121702eacddf6094079bef8e1c792cf95fa2822cc46909bc4e6c2c70d4c0b1075e4d9aeaca18d2422c1bc5033c84a2f2911dd956b7298c26f1f17f41b0ec0ffdfa1b8dbde474d647b59ea60903f00c33b44a6d190f388bea577c344c753b47766327b9f7bcdb80bbdfd5b309ec5ae66917998478a3c116f60c389e00b380f9b6a80ba3ab5982be8ccef39e30c396517050890d877c72f816e541d00a7d7c070bdda59408ffd23875ec2a0ab036e8bb7090b7c7e08e83d32924d33d4ead57010e4024df5fe4b02961ca44117c246cb442071c95f664ce7692e4be280d625adc9d3ff73b846a6bd0c8f73ae0a417ee7204433b5f92bda4c93902e46d6349945a86ce54c2b3b96f3ece4d505d971c0d73bae610f82c6f3d7d61a3fb468b8386299edf0f5c7ff3bd3766bcbbc8ab09195a66ec34c41c251ebe3460aa3c1eda404d33d5e910ca065b363b8e5de961ba3ba00d74dd0d5943f23b1c55d2a45e657e9c63833c2ac3e5e80591770503957c9e2ecf8dea6bd3d2c56515a273ec8994cfea9b2a9cc8c27b764d3d230c9af37f03d5ab0a57fec6cf4913418d66a8a92629d34183be83f700749106a22c193416030072c9cd52656c8a15dce2bd12ad638d1d9148861aa9df8aa1b57996af1bd945e52379a333d1702b3ee9bd5e73e993ea99ca998aef496b4b1d2297d329490ad0773e89f5ab38c9f31ebd7d136ddc87f4183374e182d6dc633f9f28de847ba364213c905f323dc221ee8f060e99fb33be1d767afdaf25b084b012850a0c6117e2ad7dc803806a5d2a983bbd3b2a23c0199cca25af2b66dd9f4780f617aed3e8fd8f1b9d73ac8f59415db5e97f14c204f710ca44e42139bd39eb3971e13e9de3f48772220b2f1cc517abe155643f8ddce3bf437dbd5184655cd8f737047e88301ce1587d069dd7f0521e476f29a9856def84c282c3f87103e0a51b9dc997cda9e24890a496869e1c444626470ddef2dadc6a5a2bada4ad2b7d2cfaa7d539c6c738ccf82df2b1627c28e9d729e49ab071459e1fdc2cff09cf47bb8a77c2d7375ba2ca98aac738f18a55b372b122eb19dc42d29aa356fe18e0ece19ad052083ead5f1a17e996a40ecad1a68e683fc9b419b27d8c00439a1448d8482e1029e6302b525070b7b67b4e7aaf3cc6b9ce703c04671c52c98689b35ffeba2aefbb6d6279cd0b6dcc88b9180d2a8e0a663e451ce733850a38dbb278ba4fe9482b2508d9eb164fd37ef25964e9ea7fbc8446b6c4346d51eb234b08cc5fb4e57d49f737b9b6119e051c1b0ba3d6c19c40ce64b68ac04fc9f8a97ef972ebaa0ccf017399af2e0815d518b8ecb4d19ed7db30e99dd62064b136f2d96e66edfc55fa20f1cb3cb70a12868ee1e5c17722654c15e74da7641728005b2a138e9f4b930668ab5163d05081f18290e766d24a4e34609d8b235a4d420dd1b54bb58d90e3b8f4682250b8f4f66c1ddd8dad6cd992f6bf1854a8bfc3a72207c95dcdaccbd2a971d28ff0cf690387235f7203a1ed4febc7e8a69e4e73b58bb264b7c010139df84c80f6c8b63dd277d0ecbcfd8ff93d66d66583d29f778b81aed1c11092868a1bc72e4634889b65040830362cd2773fd2efc38bc9457c8c75bbd110a079130f38d0057fba390e750dbdcaa18ab8fcc679664cfb0345eeda3b2f90f2655e8592b95426e1a91c2a00b1e91e1478d618c3a75343489e00789b311aafd4989291a0f95b05b6c642e42eceb6be82e3df95e1b1725db9c3dc5d4206686cf390f1875bcca454b5118277196222cdf04c5d8cb1c8a23f35844aa329ac10753d02dda2ec5f2b0b6283c4c91125f2b64c9ccc000ed29f756128551caf52368aeca6465afa203550640fad21c79714a3d0704a13e2bec7a89efb63c57664343a3192d43caa2f04e49ee2022e85bce5bd810358fbf90487e8d4011227c199a9c483066e4fb317dd8af46c6187e55b70762e63bdae226802d20f3ba3f6055e197465aefa6537acd2c0dc78c0aebbdb2d4e8b34ff00070e12ffca9748dfc6764482b1f0937080e4111de8b9a400e03590c3ba718e1fb7568d627b16bb52603751f80af05a79024ffeadcb24879fa013d7210ec6b5985e63ece346c5e7ce9713fc40bba189d7cff44e5e228a01952785593b31469b3269f483e48a30f1d0ef2ca75aa2fc2b4ccf56fbc90df8ea4cde65494e49aa01748521a6763926ac71b1ec8c26f66b06fbda6e8b43e43bb8368588bc61ed09c5efa72b309ba37076c0a0a4e1b04ae2fa4c2140eebbf19953639284b67cfe6ee3e0ef1c82f154431071650620dfef846d2bad030e6624b8392fb2e55cb192c43d2f0e373f7c694d1416a3350ad63f58858e5935823efb44ec484c5db24c452080a90cb24c7bc9ec20851b4c1ab90edee04e973809be5f748cef2f0758cf95ba89a71ba13d27f13f2f1db1885a56447fb79e260c56b8131905e9cc36ca676df6b4f7ed31b0f3f7413da720b83161994d5137459b0a6d6f2193ef3717cd14bd349f8c9c873fd594e7c03543139071053086089904502e0e9a41eb1f7f5daea68212ea0d6e9e42e04c0542ec969c7631ba49f3e443aa5c7ea96c40c60bc2b175abbed4e0ceca35945210f22d773b15009d9f5a616dd92946eda518b4ea9094c22157bbe71d4b0371c88e8e9dc0a79fcd14e4ca484f1eb7521c0aee2053d83f0b47864252ee1e983dc92bf798490fb7f2149d5733ce3db3fea3c905ceda983833cc07f319e20eadc69351407965adeb381ba45d80d414d21fdef32d062233d4b1cea905ce29676e99cc79dcc002e70d380e60f388d51acad0c5f778107c23e500d47371c9ca5e596ecd715ec4baf0d630a23a4153af80891a4e3b4cea2342969a125457135710796961fbec09a93075171ca2a98ce2391f02d5c4bbecb530930aa5671ff732d6d330d42eb82dba70d7bd5799b888026d53c5ab0a5d63c97ebe2ee2ac6a7bf3d85c8bb84d481306364d7401f76ed5e040500b462780616bfeb441ede9055bab0e410d2f676e68d346a4e5297b8d3ed0d239ab155728d5e67fe5d722154bc1cdc60f8597d7799987c0b1021a4c82c9f826b7a7e0586079f36d3c184be6796956aeeeafc66a0e99fedf0b6fb5de52c42de6fdc1e6d5c013a43ed71be613ff6fcfbb2164dd16d0c0765cfa9319d7fd0382792d3eaa2f2fe778e949d62a8a1c9aecdfdee82baaffa125b5522a0ed833d06b20aaed71f446628125747db601d03c7314140f8aa2005e64314f522ac6d7c82e36f2a6265467827e2935ed017e610229c13b575f42b2866658a6c36374b975135a37e9fbe7db4404ebf810ef7066f7c62ac1cd8c8ff3c15805370bf3510f2fbc87b34b4c557b11db1804422f332fccbecf0c39fe8571a2be6f35692121d960c8d8bd8b76e2b2430c9990b4f818fdd60b00337ca18d4138dabc61a40d575ef55510215882ab47bcaa44d5a993a16da446173d044a06e9511c83c2dcb63fe08db0127759b4cdb011cf1cc5d68f902cad88424948ab067009ac9bc3ebb62151e3b9a5ef92c99243f1d795d8407f7de18354da2b8c9b7349cda0487e7118927ff53b2dcc54a776222d502092cf93c12ca50910cae16bc8d57bd42b489d87865961a7f769bd325c4a068c36be9505e65500e453d827ec9b6effe16901479d78b74a816df89abc9ca93ce477c3af117fb5975bb11deaf0fec06cef16b86b68ca3f13f7a60b1e4929178d35f5e645def10791c560c8f064e3b8c3bc01ca74bd809ea5b74dc685b42cd0bc8b3994778cd912511cd0850069afa8d23162dc8609c82743ffcec06969408df0452437deb35614db518556999ffdaa311586cf7173c55ab77db58570168c273b829072819ba2c2ae355484aa6fbcdf5a553bcaaf183d194fd8c6ce51df58e0e7746272561ab3478b01145c5dd6a3746551e69a5cb75361dbd184a6fe3b65f92bbba6988cacf130407e37c99c6d57fc276eff14c40b3045862e63e63b5b9fe81f583f58d03d02ea1ba19c849d429aa79787a56ce6e7a86322535aff634a644d359889f0475f8e6b79800471304cbab32f0f3ebb733b325f5edb8da95df78ef6ceed92377486a88ec81b0c37257ca3cd9fc769f23088c3ba4cd3605f77ba308e97f7fa6766dd4603c7738c356e1d7b36f56d41f3c25a083e72dfd969a852fc190891a74214349fb69562ffb68b36aa231915512658c3ac9f2a2c1377712b50cbcbfe52403268c1f401a565a0641c7bb1ced2b6fdc09e4cc722ad83a687eb995598f8af59720d3fa01bc85b4833563f096a0caa683741f4cbfde885dd89fb7b20aa2d7024987bd188e5416825301d86123bc0ef39135c7a3f0e28dad8de98f4e02f0240554d25b5ca6bd76bb6225fa5a08e49244dc9988be5d1965fbef9e94495a6747298d7f33b9b8a84e2a4c9ef6af4b802acac18526987619e09ce86e900b64e83d96ddc3ff6cd375ffdc58c9f346cfe26d2f7b48563c37796df6593b274ffa3dc35a4dba545f20ecd6b2e4874bc55bcda23ef12f39c2d1e7ae8015193df44460618157465b60f6c1c2c0fa5046920504bdc10ed654508c4bee9e00bbd325f6d5deed02c32a53f3296e5654372cee007721f13b916e43657b06bfa66ea1eec0e2afdbe0707a064bb731f5e5802ce3900d8c0603d1eb5ca11bebcafa0bdfd3ce04ddae776707f916b27e8224557f806e17745ae9df26b413d83013ca511e96027fec11412de148d4b673ceb0c5df0d8812c13890d2e3cb10ebd460f9c620e1a354d58a36fa9dd6218ed939b02cb23cc04b087a7d4aa6d601d36f2e6e1a03e5f497c969e1744af136b51761eb3423f91c20b35b9f02bfe6d0fc2af37f68aa7a494d86118295b40236dddfa892dae337cdd2bf1cb1e085deee0d256d723d979fc74fbb7bfd8eb2a2eb4364ce95c63f5b742fb20ff7992cef6f2a22defb1f747959718a0269faea870ab64408df838c4c3edc618e18af691445f64fc382f84bee2f8b46b6285669de8a5178fcbeae44cde5affd52197f54c8ccfcc8468a53f1d66024a870b6c71664584f600e83029839cb8284bb774019a173665ed29f11cebaa0b387c074d6803c6e52bf083a5d2a0715f7f2d370baff7b35de4f753582daf8c247962b1c85ffad6c891ad7d2d0e22daea491500a4cd5a0cb525ac656598dc4c18f8e27eb90f719f8c3f6e7844d2a477767f7b869ff1045f0e6e938810d02a1bc4103d7d8cc204e075e65c47881b10398a570b50961b4cfdac2769c6ac3d388ed4cfacfe9587e5c4e209549684760b9f7d78afd8fcf98ec27b63885ffd7bd74a329919a57a104109562df538d05bdc067cb4ba46ea178ecef47babf30677fbf34d273537726702d37a0f97fae6d17443908af94a4ea457002e89d9d1888a254bba1eb5b364f4c80da30050484b15bb7935a06056143f32895225ac77119d25b735c1cf6d71a71f101a0e0856443170c834b344c18ddf5323e305d9db55f7ec5939c711334dce1d64f44787aac03a04cdbb0156729b40b64ee7e3e570a709b175cc5b8a7078bdf6257a4d434fc332df57ae191e7239899fd77cd598ec0fdf31460d4b49885a68c97a1933aede95cca5614d5e34c4cbd26c372d82f883ae3cea8a31789941f696edfbd6c7525db9858e0f82de4d019ab06c2c7d89a52db13867b6723966029b6dccc12ecdba90843093845bfd5b4a5d859788fd1d7ce6e28cbe9a5b40a8c3d508cccf6361512f47878637af8a7810fe61f306dbcfbf6bb88ea8d7f16d2ed48133c8600660207f4525fa236fd107983127afc36dc24bec5649912fe65fec13941415b07ec3ad859b05a695e7b2791caef5e49d0f508bcfe4783cc251d8e1af023c236c10456058439025a342962b3ea7e763610cdfc6b3a7c96a2b945cf1ff2cd2c835485bff97672439f2a9fcedfced9f106c32b09b59bc60703f6470087f62dac55e77ef457b53cf326127491e571f026c2f8cde2d3604c52e2a45832eb7647a5e2039d0d1f509834ec6e9d60e26ec5f37a2f7053fa29f1de51e47d130e5169de4fd461cfb4b76b8f8595c36b7bfaa07a0896a5b6f466a79f6c5b4974750c7762a8c2213ec2176ecf59ab0cc2effa63b113caf753d405f610b415435aaa3da48d75b2da2bc2d1dc3dc3c7e9a63e3cd6375da722ac5a73c4dbb05ae8fb602e85c67ae8d393b3ef70b5f8eda7eb93ae4aa0f824d540de5e91a2fbc4d25bd07d721e5e629084f71a04f1d67416b7d7185c53fe39dd436ceef9d01241b4cca952c3cb46bc2e88744d153f34c0b591fece10640a87211a2785892114c0f1daa26e722b7ee39cdcfc1c147f76efa76a07a855f3c3f0955ff9cd65fce8e24e9c973db5887632ae7afec037a50e17b02a799f2bff9685c3f5ffeee702e99c4dfc984bb58f51d1658103acee5873bf82cc3bd516e2e85dfd7d3d755988223f79699b9eb3125c3fa95ff5fed1500ed2b8b0cad571dde47fd5feac1b9f776d5c9414ed8d26ec04b2651e1e1f0b10e48119f9d59ce38dac16b6b3a80fed6fee2cc7e474400abc0e5875da4d4c40277101ff9cb3d6564ca8f6f6b5d4dbc93eb17f586283a6c2c33f036bbeae61e8008c62e7fadd92d151a50697c1f23c697d7a8ef38a1809ce5a69f39ba69f017272e7d34e2ad7b7620fa1baaa9e764079928bfcecd5c4af617d4ce317d562ea232a23b1b19d479d083cd57e87f55053c4120317557b4ccda8e3b19f815b119226dfd7865bd680644aaf2cf33a47da526a0e81c78c20910fcb669efe452401c53b57356afd1229afccbb99c9331148439c93c643d72b861838efc8adf50006e88cc8be415b64739d55786d83f641c97b685426640deb180c454e1372228c6fc6167e80e01777b975a22e3c48356b74ccbb399994a6f8e4fc32bd91d26d8f0e78c91d4c853c6b6ff35c18ed93a3b40b71789d0b045299b29f37828daf43d3d1ae705526f0c3d3b42083e847471f66de3cb018c3f50489aed65ea2dda7f8e2511eb6aa12388fe80b68d897db7277644888d8f7e84e39ff78e03bed918b727ad35269335e68555d822eab7c7b38639a4139645f8205fe88349326c8faf2e7737b74c5d60de2aebffbccbcbacbb58df7a5a74cdcbb5ef90aaf1eaafd862cc67f42dab73855011c043c78873f3af0216ce1b2b8032b5c23b0a43e3160f9f0e6e3e8cdc07457c6fa3628dd72b5a150cf3fead105bbe9b841bd72c9d801227a29e7fcb7288f12289c730bc2a1ee4a6878e56c9f4bdf2516239026b88d4a5ab0817411aed08b12dfadbc76e53ddbea7b615b9d87a4cfba4f9ce62f594aff1a30721dc374c2299f390fd4e3e9108bdc4281f85f068b8a832fa9bd64e712544b2315b42d81c3e335f8e5759ca5865a1b45ea466a2a7efa82d7f4d421960fa6c53b11215839e20d65ac47468cfb7fb1f333b25292d54f7842290e8ab22c8363d3212f0b0a165237294ab91c6f58bfc88300d1b0baecea2cf5babc3b6ef0f973a234ec80a7a2f5b559b7d91c99f82e45252e7a7b63f69cb0d278269bc523e16ef2d7dec10883f6a2220b1c849dc731d13abb920d59fa4bfdbb18d8a9abe71e2a31f3ee7175388785d1e44a69fee27a820e5e7785031a05333878183a4168480256406890125fed87ca77a1fab4ef6583b4cbecf1e7b2ff2b604e3860bb679a11e2ddec7f993abf2905e2ffd5ecd9b5711f0ee042f22240af2101b5e29e62985b1a2ac0c51c7cef44b62476410e3976b326db1fae13c4ab4b5f5fa6bc1e20d14d2c83943386dfc4040db1bec83fdf3e7ba7e1840ba74738355ef57a8aaa2712822247c9e3aff77bf59425458445e4a0a92d6992a7d0c22b97564f83ee6ca33931389186f759faa395b644086654bb9affa5301604f708e5f0af2441b269131eaa518572a2272d148d9ad32f56b5ace8dc96093c4def4d2a91c33998e0b18e09cdb1c2a228946655f69277224fbffe10881dc344261664ab005d0224308ad77b84c5e9e7ee7b71cc40cabc7a201086572bdbdb6d7a5b60fd90e4daf25778c7da75408336e93e00dd5f206a2e2de0c24284fc1b0a5ffebb36b766c8298ce231601677bd04476a86efe144fe6e580f904020ac9d228061f22136a093a343c3cd442a54428f0e345849345af104f6c0a83cb44f1bf76dda9ec758a4623a120612097c74aead060778dd39629b6c4d772116b48bbc5c7ed4986eec15465201aff25ec63332beaefbf9235e2162e9cccd5c9ad9a08e58c96d4075488d5e383086d58f1c2dc002ca94e09339fb901c3fd6cb747486cb37fe1f20041f9c6b2ee6cc746d28590a2bcd01fe04a3a801f081d6d00769255e584d7af5b1a043e4d700b7560d405557c3af67f1838427c01648847cb29d05c1693d5ea04f4ec3bffcd8fa938cd6de857a49193dea3a1050ecf5a0bb94213abce7934f31bf644900e9465cf865868edffa4ef92bdba5a16dfd48a997cc6c4b2b6c4d616b4d074c74e166dec166c9a4af99ed5692aa419485cd3d7953e18698e139ec7307b74d8b84c9f94d86fac73a5dcf407a2b6456f4a7a111001d3a48b06a881e15f171e6f7eaf519c813a9264a86dc2a7d7d45c702101366752bf26ac066cd33a337c65c76c93f4e1ad7fc9bb0f0ca43a83ed7cf35fe9ad932d7bbfd79340c3fd8d61f84b8ad4c2cb605086ed891c5fc3da0381183866a179fc955b0cf88f1460e620b492de69d53a151c8d44e35c3d65bdc527f1855f13b07d45bc49a48362a2d64512432c362492671ab74b91337fa6590b739483e3a3484a2c8eeffca75b0461628471c25da07ccd4db3909b85e5a20df09d85ac01fb545625dc9cbdf78806796b5a38e21b812851dbbecd92e3b3594c4bd8f39e59085cc642e6b5a1b2356ae15f4a00ff9cba9e7c3ec742e760e0e4520d9c3c014b677cf5aac74c1c9500b94b02a98a106d0e8357ecc2f2ab363ae0d8c270c9a543bb257f33469b02384bf1a4843890ab329943bb10c43aae35e5d358f97d5a2a8f2ab8c36b86dba276f9fa4e607b04afdcc308850fff9c3eb46bde66026c08c89dedc7b6d96e91bf5fb3eb550182b39d5c89ac7554bb8fda0037d29f89f9392a2fb35c35b50efac2064f9f540fa8b78307c3d7db0a0d292c602f23f873220bbc5a34c2d3b6dad603b50b0934c05a6db27e46c0f85ce7493d98bb7ac56b24c54e94675d5517a5c73616e178eb40d5833d1f021fa8baa4e86160f1bdc8ce0d0ca102dc2e36008b27493dc0436c97d6e2976212f229713a2d33ccbd13921ce0decc6adc61bd398c989b4b37208cca4d57c9e524bb6976d7042811595439f4d58a85d98a36dad3f4112aa44b13601d13e0e97de50d4922c7d6f3508147c93e620cccd4225c750a539c3e482707112e5f8a79a89980a3ac6f993f7926f7ea959970a7c94d8a3b11e52658019ca09c0e7d8a0aadc2f322cff6707a65bae011430323053e7d3807a01f0cf0a1dfe6b2641a0d3e2e63111e29805f95cc3475ef3115dde93d3b0933b2de91a73d8df686730cebc7942549476e81a42bbad9c89a9e21a23c975f09d64bbf2f92fa5db19f2945f723c5e6d825ddbbd6ad9b96dfd7d510f3092755dfc7b759d08f8c37aeb1ab8bd445af960d8296961397e063418a41c36275670e65e10332b7a43088218bd836d5d3b702575a052f31d340034f64a2941f261e537a311c2c56ef4fd539915c0068d7f1ad0145acb88af7daf1c6ff510b76a405644c84babd7931bf1c09855705f2985beab880d6a30bc9e29317e3321726d4e10220cc70747369c4cf71a2fb6fe4c4c8efae276959a4ab33cb909a1ab307e6639cc65641a55badf6eb734199213c440289a37a1d936d0ec9c870e7514c6eb1cc3130ac659382816f6dbfdcda1bacb3b0799a61feae3be4ee21dded12048e4d5766a3ad9237d2aa62cc636a761a28868d1be495206466d1a99266bf9ba226ece9e8484b8c5676f1e1cc2986284aebb60c94b19c531931e2d0c23f09a471755ea49d3d53c4e3e4125db8cfdd7a8a09ee1ef9a7b61db2fe122cdcdfa9b750dedc7c2f329b574ff42d0934dd58db76f6796fe59b7312545fad99b929f4e29f4adf3f5c68827b446a87e28398789b9c98125baecbfbfac1b74a0103bae63d9ada8bd72c8291c22432db0935301e7cc2cecde1ca47b27e80f8677238210fc86a624c34042b68e1589c71df730c42a3bdfe2ac27d7ea7d15ab1249d07c6829bd2a9bfe710f3df6a8621675d990677b2f3381fe1bb132cf352a36b557b608bbb0bc13adaa04eb7c196393fc09f5339afbdc647e8b6de66672fcf9a9983191de3ba96133dc3bc2cdfe9c73e3e8c8cf133f7f46e7c3f2adb80197dc272ec44f95176580b6eabf159b6cf45776244f3e96c8c64825a6eadbd29e3851ee3ae106dfb0ea304b973cd4a136ccbd70dec7a5a6234fba70b1ed1b5a676b78fa5e187d8ffdcdbf9ef083fbf5f0d1e07028fc955efee2d7d1fb0f94716cada0a610c98e68ccf903a4ef5ac467173e8e0771d39e1a2267898171d47365f2c2000e6d93930dcade2c56d3cbfc620cdc2fa9fd29b960c2aca0295fb176b1618cc8352a9b6f160f80d29dc29a3c1a5138d39c97c36c9f0b59a1a5769ca450cbc24067dd65000898b6ff3dc41b19bb9a17548f2c9cfe2b30e4c8b2a1eda017e22f884e5697aa8d89640f0ce10dabb4132c001baf860f070dd2581e1b286c89fa8eb84563483ce08372c6cf1310218027c28e2272e927f46be9c444dbf78e27846f97bece201152380c2bf774aaf6d50f68721f1044f3e7837d864233c4db90b40163171986b574b2b258070b6e8b1284763613d792c257a12f5ccba391b6e26d06e7c5ca7009ec4837cc0f98192a9875cde1ac1d229e59a765260e8fa4807629311d01c4fb0316ba857fe05f70ebf8e0f260177d9168c8c03ba732f4214178f0f8df92a3f0fa73962e6ed2525dcb49768f51dbb442768824163d6fc7ffb059a75f8b8ca49eaab4a2aa3e03bf66f4ffd91307d75c6f1b09b53b29f2f2773c4641e4323296414a83d773913d15f593cc07c0c1bc4abe486aec3a48c1de23164f2e229ecc48a24cf20581ec64dccef38491511f79c852ac2d5457bf003e89662a48cb5dd23871aefe21f155fc9ed8bf6fffb6c9e613f7289c68b3dca1b0ba294ff6b0b1aebfbb05fdd8a65424cbcab8e11736776ca3b3aabd27044f949b970509b732cdfd4c9419e22f18c266172026148d51f6cba006608e035fa1b5cd74ad4666e463c87ffd0d58c173d02c2c9da43bd751415925df6cc2ba6f68d1894cd38e44d079e7f596d3a42d135b5f700188dbefb8e25dd83441e75d385006d239978968ee3c0d183bf9a60efee98fb78d1a50347d084674944f78781216ce77ea4f52a0cf0aa6c264507f34cfc54517b4e07a13197e3c6438a96d76571c93f0e040591e4d1ffed0f1c2807d2138269246da0cfde522f38edf7b370e03fe1885db5d3539aeb0444a6176f4f24f9e4c482aae8fc4546870b12f1b9e418abb48c41e71528a4474f881496cfa32d968522ac9acfbf35d9104338a2b2ac0387d6f44677dcd5d3453f318d89ae0abf4c88a724eb73a803aad84b3dbb4a355ddd1eca51e3968df81ac779318bfa61585f3c38c30c026a08e033c06955f1e4b743b38466b6b7200f8c9252de85ca491888fb5d8195e7d11d8596e4b583a4e63b576443f446b9f46d8f5bb4949c756164730496240a54f85e416a5552c9a93f38b5929706e2903f52604077f9623bc7927081cb9722a66b81389462b8acd7781e10a9880b41a3882060036acc5a371ee26f7e29f71857d73a257ae7b90c09ededd1044da2dbb2576052ab6a51dc44f00a6982a7b38a061c59ffd588498bdcba05853faa5d50cf4d03960c9344be7fdf68b44b56f65328e90972c10f748a35251b4812bc1b904d68e9d055a6d913860a1e2ab4a0e87cdf0bb89c67893cb8203784e2771183a3da68a319a39e15347b13af0b8d0392dbce9dcb6903a4f25b359131cd9e956c935b0494966438932bbbcaed34b374730e0050b5ca3f1dd82e8db25ae72db57d744c1741f18b7377e17c6e9186b6c71a9d46313fcfaa0026b0fb62b601f708e860742e567df188f44c1597ad8ea2fb0060346cebbcd0387c1f17b4711abb03f3ae1afaf0f59df867a4fb5767efd9f8cfa9259dd29f5bbc90cd7873cc076ec1f6c3540bfeb9d723929c4aeefc02f265d40f2ab9c35692d6cb3ad954cc7021cdc2cf875084e3dc548db3a0c774dbeb2315f3a9aa3221c33923fbad00b692bb984f67a437dcc4802d6e93a801442f5a13234f487b20bc40c5edb0d280878305bfb8370dbd5b170adfbc6392bc396106b3920bec0d3a63e2c2033c9fc41cd79282087d46019bd0bb17bee52c833d998db6b18100a551887b080b3ed9442ba30af4382a5406abd472328602b9f5bfdb65ddc37b6eb419bea9d9d3756f8d384820af18ffa02e32de964e0a5d3b1b75fd048da067390b5fdffed94e5a53099495c3d5d728d05cff30658ab80eb752a323b4b3d1f06677e858183d0a433c031451d9401a9afbb0bfa563ecf11cd2922513b52f79f0852a07daa5fe6941863a300160bbe07cfc5ea23d438fad2e4aef262ff687dfc376e850290e472ff55ee8107d4e8466d68c8654c9b9fa35e1fbf31e1865c5d1a5ed887d13b32076d49b83099286c420ab69043b9db3ed1810d97d372869ccb53d4e0458170aa6376c4126be983e4f3211e049619299c475e2852ac42daf960112153a46dab256f426463c17629a436362b00088a953ce04566d900a2a0cb62634d9bc22a05c84791fe1af05493bfe59243d8024ca91d7b0be5440343dca336a71fe205e02b3ca39b5efa0979f162addf292e995229142f627437e5882d92fb9d541538fdf9cf9f5ca790272e12f691da14ff1c3b5a63d44f8e3bc9c693e68c0cde53ebcb17b9e30fe44f4866f60e23632bdc692ee9cd6a8e4e0a00db836e89acc0e44aee9197261569cbb3766c6c619d376df36fec7a77f083e6343de3121c4276efed0c43340559604083e7e68d21b07f1349483918cb0e8c651e1711406e492e567cbc09e3b8ff7eb25de7f14cd2e20d1aa2ed42eccf34610a64d2fe3fe11b723a8e36e3a95036bbbd5b8ca76bf44764f657add728d678a598299e53ca7736ab1c1a39fca0b72c3f40fd74c6739f5caabfa60afa45f463d5ed7fe4b88fd92bb5a411de657efa3312b001f2edff252677969e19f3b19fc41eaf9951efff7144160968b7334f93241b6074ca902f16d780a143c294ecf0017b86d03a9bca96822c93b9dd085038196fb82e81bb4393c175cb2a559c92545c48d346b5974816a67c3017688439f9c1c6d1263b7481eb83ac581a88005559d73ccf6f68382cc7800ebfb65fb879b4b0334235195ad3e7c9c3c7f45bec6d044c54b3cd50e8512ca2bf71c10888baf14f4223d7455ee945b431e23b01ae22af99b58422731fe1cc4dbfe75a36da9b44c0cd1082e941580fcc7b6df20cea445ec9d5c8ff0f318f03c0506fd330d5db6cfbba23c73d296a4e49ed8b9226b631b7e5d8fed080cf5139a1f8842d25c35c5a5c23e34329fee4e64a12d79ad01697ae68596979b1016bd13d6cd40803c147a5224d2cbffda67902751a154ea2dc10ebc20df068d429472e697b60b67ac023d8ce6723f457c78e93ef87be2421df03fcb841f8d2ad5a5bb9e2ccf9d3032537fc9db16e1b27df119aa30713ea5962850213164d32c4175e934c56c5a00613488375c4e39ae1176606bf79e1733750fcd8aff65983642ac60d1271a9c4365af7d48b59bdc1e062eabf4904e181646d49eaca52d071d65c4bc436d00a7b94237404953b8b444933c3c5ee9b4d0e18de4813b507a58ae86a037aa94e81f4e02b6b5e01972ee68d6a711c85dca653a5799247a10471d5b0fb48dffd0f3caf5c90201262df96240f0848c02f5ce82dea42eacaf96882c58dcb4999c35753b733d6009ac80e9e49f00cbe633b7f4249e947bfd5618130e150d292b12e36c6b3b3fe8a0b8159cb5a2f160e3ea9ec271daf9d3ce3f82055384b3bfa081b78486cb6846601341db24867505cebc9a508214e07167bcf6877ea901102ff99b0a21f58c92aab856ee4e5bd579a34b026cdc24d09807177580afc0f5d5c210ed795707c6101d119c5e7ca334b4b3d7e7cf664464994f7d44e74ebd8d1d6e0166e75cf61df8a3bfeb605b059bccc8b0ca65a20a6cd62f9c9017e62a24bbc887753fab15f5198b1318c4318b57ff4f6ef39f8c622fd3491829350fd765e3268684d40510eaf26bf68b3e1da64e26e60dc1f402dac64f6e3517ef51b37073c321db4fb956c14adcd5f5620d565dd8e7ec916dd14ba60cb51ce861c55b7d31892a79a8e0c42ca9c32e0bb82a239ec55ed3113aaecf5172492f65d26c135b977a4f5c3bb396c4a2c33355918da88d80b852c39614db94a9a3b95d4d7b16c813911f5710c38fafb709966baa9ab6b2da64b8e83ca4dffb33ef12e818405686cbf32597c04e114191fea64c5b398c0901a17d0d540cdb23df83ce0d94cb8d2c1f3a24df6af2d18776114d16cd48a60bb674fafc53bab6ba2f75e1325f3148ac83c0c91d02d02bf81f86fc01ce554e7126966a937cc7597ce63f86ec46cecedc21f1e08d3f7992d834505bd0f1f9ef2c2e03b063feac80bb57da9b4650ba5eff7759df73f074a0a5f3b54630b080448845e4a90df898c4ff53d3c02b91e5dfa4d67acf9f589cfba25d377407b79b49cf7c787da3caa93f42cba758a78a42797f387394a118f87d9efccf2c19be11653275633fa849eba096c8886c845fe5f922a2001add80ac2d6bf306b55a8b15db4d0c1b1c39ff25ee7b8407aef21772e783e3bff3f20be2f7441c6e1bf1dc012cae1873f57389863dd240c335372605a187f05f0b51dd69678d452714e151eeb2dce75c330186ea3e0c9eaa87c632218457c4cd1cf2316e70717d81cf5df97421f6d3a41cff1916b89dc4f50668c665ff0e873254b417eef95a88066b2b0a1f1a2801890b5a78e117d3ae1450981454ae09c7c8b8fbfd1c8f92f839bbfa2f89d816ac57d12c97a677d8dbdacb261310099b5c319b00c49ca4d73afae45c12e30dc4d9dd39f0e5c5c7aecb3df1b9db88a07577d01ef7cd9ba172eb0bbe82cc97b1dfafc8d216984c7e24c3bd6ff2eaa7f3003b4abb3b689b43c81d423a1d80468ce64115487d9fb35098cfc4fc6547664a582bfe94a28a0b97c97a839b7f49f4fa3aba2e6adf8e38de90e46a7ae1f7a791cbdb318777264646f27cce7f8fe9c0c73bbef402bfc7234238dee234bb1d1119828359a5665cc715b511f9aad8d3810a925fff520615a6f687d68e20a7bf56cade375f389b700adc6ded373abc4a979fd23f54663213c91026245d1d814a9bd63888e3c78d0a44d00f6fcd0837f651e3cb3760ba021e151cf9825bb0608a637bc47663e06bf29bc3cdcfcd8b0f1ddef13f684cb859cd9af580b17b0c4485e82202d43e92cf8ad3116ac168562507a57c0d5789e525dc108160f8f20c43bae08fdae24594b8351f0705162d86ab3ae44d511eb11052db378c42b1df8c22ba92315d217cbfb95188d58bccdd13d62deeab55def673caae5271cbe55f020fb7993320054d2b4d27ac59334efd384de0c953f08be8d05d437a831aeaeadb1cfd02d49371000a8af56253f53877b1b353163a020c3f84a68218cbb6c23150b6bdd57da061720e3b70d26efa31884a5b627aec0fed84cbeae4ef97cde04cb5a207a96b6dd9c7fdc06e54ffaa9f737306dc943173f3d601c58fbf0f6d49152e4a6f346b67487bf6665c3104efa6ef4830ac353a9ae0bd9bc3f38e96cb60dccc99ef8efa64d43418736e5a54304b9f54eaef8c625cd8f5d46dca98fa81178cbd12eb52a2b74f4c9993bcaca369af876fdf36f64c717b0fb0364f27f3fefec4d9e44fa666209d5e21f24bb1bea1ff16d4d776fb35f9b731d8a5a981f0cd0a413ca41fb8f77479faa48d542889368251969951ba302a8883b511d3b5e37dbf8d713e579e4dc836781d3b9ef11f707b708e7839720fbb0b96d48b57fae034fdc875bc5f6682fee2cb87cda41c214b60ee573e9240071bd34b6817729c7ece5122ed824131b1c5b3f25a879c3aaed700addccbba69b3cc1c830462733d7e2f489d511766038c2a30b982c46676153b1d7d6e2470c8b7e90748f9fec97379f5b4e37f9bd3444f7e9565246f3ebf72e2cc45166ec2b4afa3b94fbe0edbae7e6cc19c5eb13112f864a28da29760e7831779b4af8c9f0e44d6dbec2368c3d1e3fb6a7cb31e3c3246fca7a6671080f355fa489f2b7a1e9c9e9e9ef17b909b3b7573e3c089bfcfe43395f5e35ceb1bd5e99a1c7226db1edb4ab89e450c49a29ce64707b2edf45123baa59ca9f9f95988bc289e3b8f549617321f055105a6d94f6faaf2164517b99c001dc9a1504aee55acfacfe4848951e81af6adb30bcf3d80aadaf1f17337df4aba7560f0787fcbf823c9bf9bb8b761f16df481d6a36e574c28a5786c7acc41ad994eb74584188f57290d01c1db457e4f49ffdf56acec90fb95737722fdc70cbf6e286b37c985f63e04bc1786f2793a929fe4ba9b7344cd1f47a61bfe4b8419884a42084c2bc6adac46ffe216ea2cc2b487ecec9c9caa2c4cb35b5dbc3b29882886452736b6536e9e973ef4d4bfce1ea3229f9442034d148be8b1d00099b505b74cec877a6d39082da9a35b96982d5d2d894388b42d4ecd0cc66bb03daddef08ecdfe4fe53eda98d70ae0a236c2038ff39e4bbef85a79fd1a75dc4aec1527484d31abc09829951d01876d9c777abce7dba14e04df89b3da386516e674b95bbedc8a48b6276476dcdce623da8fffa36dc95bb6d22b621f017d544404265c8a9d81912a6ace036db7d5ec43347005beb8097a434662f5f56aef1a6c717a9d98fd0d4ff958a8bb2ec7517b715901d4a9e22c66b150451682f3f1f52743eed71290ad60b41daccec84abfad4971c5a0a91b2d39ffdd199cc32f16161ba7978f447360257ed3fa6f01fb61836dcf9ddefebaebf003890d54173a07a2dd1d9d28d1a8fe2fbb1936e63687ed46a6cceb1610cc57006e48b58db5ca9d1e6df1259098702b692f7bc04b1e357f78920405a181f95f726e017849b17939a7ec6f494f288fd003ac2f430612e4fe0fa86cdf358228fc0c9cef4cd07759a54721c673c14fc220aa51a3ef9943422c88e7919580f75b6eb4dad912cda9781cc3f549caecb61c387d2cbacbc842c13a8a6a3cfa8f16c86cbecd3fe9a238992301a8c42024690b88ab85da58a1d5ac5861a7d7bfe786f3b8c190b202c3893c2a1f8d53606984964fa073d6731a241e7729d37bf301b063674fde91b5007dabe42e897041081184c4026feec0313873514d6a218d6df6c6f09356ac950f237a65bbf48c47d73a038f210a1f15ef1214f4accc5fdbc8bf1449c390697b12a9e3d9b99db6621a356ea273d833057ac2c58ae0ded3678c378eba5e4885b4266441fe9f82e3c119ad0118bb940082701f7dc057ebd9385a42cf58cda71d1266ddfae9a1d2e185274c7cc8c006ab160a9cc5d8a77e263bd8d98703daa52ec1080cf71251f70cd91efb74ed4c439721d8d7b0504ce0e221f2c98f6bd60e3d5a3f002f91c7588b5d20aa8d9f7f6fe25680c3563279d903ac8a27f69de517bd162a07ea64dc775940d1594c7fb642f8e258c62eb9ab176a8760c1511e67df24267084f1165c137aca9150b5adb093275d9a5978904f79eb638219568df090c4167dd67cabadc2a432625d5032648b2d7a225dd36a031612326cd45cad626255d2e6b66dcaa4204f8521b54ff25a91d29e5b64bf1400fe25f98fdf1476e1275ca024f811947886ba212108f63403151e4f5e6484c3230868390c45833821890c36432197a253c51918d26e4a3af8659abe29b807034a2fea248ee37db7dc064ba3295e4b626021fa79a16f124e16affa3be43d057ff8042da38d59258e50db158bc553707ddef8fd270a0d8fb431992203e768a174c81b58f96c9a61cf8eab72544ba42bfb0be70b8e93c0ef131315b12d0893d3982dfef0df5e80ec8c231546eb1c066a830840c7237097f307b3bafc85cc1a4fc92491f601af9eb9c3ed07d767b92c98ec53ee9f0f0e15698c05d985d06d3c022ff0a8a8f17a9b14747da009c1838901b2ca8aa4938baa8c8b037e6644150d4410a0b5491bc3300c268688858a0aa6e8608e02b668392d8b1f5b631b8d9a8da5db4aae6ceb002fa27907dfba4d782bbe000f8aecdeb4339254de1dbac0bbbdfc5687fd24eb0f9e0cf40b27b08d139806494279d00c8aad3a5c9c401e9c402128d5e4fc4099aaea6bf5f12112f31eb922faac502f1a3834831084a8a2b63011e232e19c70e288609ffa2071299274d2d438695438693a3871429c38cb89af13f62389ed54d01f585c1c0d93054ffa0b4f883ad6c409fbe184c120a1301038065c86c704d3b448304d2440a1003b610938d69a9ba1288f50441c8250c3f2801ffcb0871611c5a2a1c415419024141e705ce1c58b66103d7898cf0c555b68261045753279608200ca8ce763c5264eac70e3c40a2a7cde43c50e1ef645d5858d2124e1a48a227cf1a3d0cb5dd9802811e599a128204a745205c70d921bd5733fb40849b2c4668a0cb02469faf0c614202a64bf9811816250088045057a51e5630a4754a1e9640a3948523592240d1f2449e3461b7b58430f92468d3c744213094a4c07e573324514275340713285025078509101314e9e473a799474f242d2c91b4992c60e92a4a983544d219d48b106a90627526c7122451927527c21492c28410a20e210070d1d2449330749d2c8210e1faa23d2c0419224cd1b4033f422499a34dc20aaa82d4e30c0058d1b346d90240d1b2449b3068d1a502a7081345688b2271710802445218828d488020c2751f4800349664c9219731285e8240a21ede1c0c49e1c1440f9745072447182b206499242a00f553f1d29c78989154e50c43841f1e2048a1440bcc1861a7690431a6b38031a50cc2a34d5cf48e53d749e40f14ea0d88024492b404149018a67164922d1605f860a8528fa441c9e08c2133778c206663c918227a82772fc139a930a2441b20f060a16d5dce20b97203980f00372949828c2119a3224a20f6a98d0c1640e6e300943124ca660c203144c000092244d5fd8cf7f811213fa509dd9f2269c1309404992649c44401392f41272c14904825085a659759470128129aa1308b4a00a4d473e238ee8c867347d94884e1eb0054962142b8ed455f93839e18124893e584c4e12dbd9545888a88f2864ff379bca332b556931252b40312314847c3c68e6658a4fd5794bb180a80f16270db0815485a62433e68ad057f652568846d40903129172c2800e9c28208d0cfc60499258208303b420018628590423dc2841a3840c2709f080a4714333831304a821499f190d19d080a20331384180002449bac401ec19064822499a31942000094728421124c90c498a410c66408624955146a8c7013a1d901a450a94cf7bda09013c484a1620090e5042ba42152e70841f42c8010ea42152910e50e064001ac9ce0fb91b09400492d448363c78542702c81180499c04000e2a50785c8a0a7d4c47b4b91fdaf122430101557054bf48d501f9a83aa0e901c5740010872405917a9c00a0049274292af4c412de529f138d0f4e341e49a2b6902aeb99eff2a12133f43c78d4ce0cc9d65a6badb9bbbbbbbb33c618638c31d6ddddddddcdccccccccbc7af5ead5ab57af5ebd7a758c31c618638c104208218410bef7de7befbde79c73ce39e75c6badb5d65a6beeeeeeeeee8c31c618638c757777777733333333afb5d65a6badc531c618638c31420821841042f8de7befbdf79e73ce39e79c73adb5d65a6badb9bbbbbbbb33c618638c31d6ddddddddcdcccccccc8b237cae396be62266451a01269a2049d20cfd15b5633f44a8d01b99f9a105c5224379fe878609a1e78844d4e7a3c1424b45b1549a2b4892c60a92a4a98267cad0cf4c21148b2469a820499a29485290a459d92a2515a0cfca8746a2d1ed4c8a220a7528caf4f18caaa9fa0a0b4aec9024cd1992a4818224699e20e9a084e40449d2304192344b508224699220491a244892e60846308134b2e2b2d1426ad1051016b969e9a2a5456ea410225a74c1c5c60b1f5cf8f08c2cc5051cf58879d10a0ce5e901472bffe9c07c241049b44092248d0f7a603731a3ea3d33121c2a764892541201a9e40c48a8a00a4d3374535513a49141621f0c142c449ff9e9c4744231a3cf3f220d49b222029a91e4197926b505cca7230a51d407ca147a84171a2f44204992a429a221f2224992678aa68a23b4901a8105fba11e709445fd2226f0e69c113ad0c1082f6c872ab2f220a8cdb8a84494a772375a841792f474fe506929623f3e66423386f2c82402119224c95c217ff8f8214af2a32e3e2b2a2d459ece1f9588f2b8d8a7c2dd08a50a77a31df552d40d21516929b2b92124a1078d2a44b8808ba8b414516929f2e94ccf10974a543dcc10106856a3ea7308151068f2e0b1015552891f2428c40089219214620cb09988008c20499209241d847843920a1137f693746e10e2708424491e8f6322a11fc283c7065411c223499214253ae288e30d499274c43102a90b38dad0a1b079535d5143d515b523fa1836723c8223d83c723772d781636510660091248d073a20499e5048564d0f0ef0a7f2418940332120a24f871a8281900f04310641481a0ae808440fa27080243d118427cc084403a44a93058fd04bd20c208af007454892540249072056159a38a209ba62468485864715fa4e0b0a473441281e8f0f1e3c74fc21057e8843871f5c241d6fbc21bd91224992157cc8826bbd850034259274828d1b3d9024c944d2c1072aa4246b4dcdd3b2c20ae7064842e181d2c5152b6e0c91dc409124e93d9d3b61664c1b9a9024e943a40d38d440d1b186019ad0860aa436bc90daf000cc075aa1f242c48a0fc582d286244928f6d339c286212410c5c61924141e5c8409483ad84832a4191b3b24c91dca870d014892f459d983225078d88e1c244972d1b18726ec218924edd88310499276a07cdd438a24ed40d1b1870668828a1d6bb081c223f4301d6ac5435923079224893e6b8024141e6b7821556baccaae610022920e3dbc21e9d0c31f241d7a1084a4430f71d4cf4865e6e38362599124cd8e25499a2ba4c98a07cdbc4892a60a49d240f11e3ac3e854df22499a0d5492a4d140cc7bfe41332f92a4a16214b3a93a92a4d93185243d6846f4a099299a97925334b5d0a1468a068a0c4892a491423445530b22208a054451422449937257bef248fb91a11f7725f443923418780f9d2fa11f9fd04824aa1f0251212d5c8288dec5332b25e4ff25886752ca1344f42e2a2a2e10ba40e842c4b10b9166765242dcada8a8c0662bd0b1bb15cd05242e64a8501049d24481b222491a2844d547923416a88024aac20043365b7916214244414441840869b6e242e483345b09030ce96ee5598408110511051122c4dd8a0b910fe26e050cd94c4524a4998a2848339517d24ce58334530143ba5311e24e4514c49dca0b71a7f241dca984e101d2ac59b39595951517222b2e4462ecc747b3955017cd56429417cd563c2ecd563ccd56c2f00071b712860888bb9521ee565656565c88acb81089b11f1fee56425db85b09515eb85bf1b81009715cdcad784222aac5dd4a457d346bd6ac994ab366cd9a356bd6ac59457db85381f1741e883b9510457954dca9a888aa0fcd6771a7220a81e1e24ec55a1fee54e8c8c59d8a67c4853b15241d2ddca97c3a5cb8534932b970a7f281e9543320d00c89a059339715222e2a445cdca910a99f51e8c5dd8a8a16cd549aadb8ac107171b74204c810772acd5456dca9ac346ba6e26e45f421d0b7b85301b284396041b21398c3169224e99803cf410159a0a0f0f80284c24556111ff6635eb412a2427280220e3fe320461cd6e4c0a18283186cb3111c5400872924a99a28554c33ffe30d492469d38353cd2d50aa8992451a37e022312fea4892460211903e8c4e15f3a24eb3d187d1a9dc504992c4bc38c2e79ab3221f1fffa1649e45a5ba1f1ae2a1286abf873b2af4617ca8cf045513e4c28621fc70598321d63004697a149967594305663649dcadd84fd2510951a23aafa53aa1ca7efed38179eae97c0d5194e77244309f0f813af55b5ee4121a0199992c3fe3230d6974a1230d4310511e978fe9bcd84f0704f6d339928646431c68d041094494a7aac27e3a47485082890a2beca7736487fd748e5c6ac60382cfcad70972b1ff79501792a46180660167c8e20c28d2190a80c22326c60c1f141e9beac87cd006049a3c78446ead435519a620bda8806086783a33468aa84e0b7d117826cc0b7911757eb8d64766ad0f02d77a725c5c6b4ae6a599cc6c6126335b1693992db165660b6c99d9f25a66b6b896992dad65668bb7cc6c612d335bba6566cb6a99d9125966b64096992d8f65668b6399d9d25866b638cbcc16c632b3a55966b630cbcc9628335ba0cc6c7932b3c5c9cc9626335b5c66b63099d9d232b3856566cb929946c8e0802a34a181051d687840071a5248d218a820d98f1955a339a4fa8e8e31144092c4700669b262d8c124aa3a42445f8961b2341b8188e488e34554910f513294108a7aa97218a21092247dba683602c30a2429471c3e3e44e0a83e3464109294431081908e544a8865f91025aa428fc443b9f0e0f13c4413a5d90845542728e66d17782049d28b2824ae39eb242ce43f140b17c2f080debe67f36174aaea61266853553d9a8d389b23758ab6108298da114d198f6756fb9bcd666dd6a68baccdda7091ea5b3c1e1fb5ea70f1af22aa3a9ed07790c0cc1f1f335d3e2b228a85a5d9880a7d7079b11d205c641569c6a92687534d4e911e3da0cba2191177a3b754eda1630a389024984f67c6e3f141b550a224a5240a0a40a0128ad8c2195638a20a4d1faa138514e83843ea3863c8342945015285263aaa2469650a1d5090c3ed702a8903137540c1495568ba42f4e98c603a54f4e9c074a81531a34f35d7c44850b8d0c113b220bda07c3592410e9327c427a048f6613e2820aa330249059c8d740227882449ea694d8c44fee8a2e5c5e58b12a9e48c922a343da542a2aaadf8743ca18f59430f00804d384392a42fde43911ce984ac98f9238f279f9615309427871a9294230f9294030f928e2688710749929078286a088b085a26912042beaa7c803a2f9d992454a80865472e40aa17899ece1f445cb208514078f02080ed504578f0d86c389b0e686e4055d58335379bf6139a1155dc3df8916c1c3333f3e2089f6bce9ab5c86233b3983fb2783a29f5928252cd2c8aa05401820d920f81cab084244d2865a0a1a38c468624c870021949282af428a03ac880128a8e17c02149d214eabca0063a5e9044aa4414cba4e3053b2617a4f1a1444f47d7053990241d2ef8a2ba940be01896f850a11f238d313e44cd9719832349938e31c650c0141fdb411103109224e910430b301f2a242302205d7c18a11e3d7af4e8228b2c92503f363233546d92cc98169ca0058f0570b0e0062c60010ba658011e56f082158460053b2469a258a62355473402cd78aa98993228339f593b9f09f2783a321fd3114d199499cf7c99a8a876a06840031ad08087a240339ece8ce7fe87faa8600d1590a1024b89503ed6043c787c353943be2001ca4b0a38a1230569e8484111244a3483f29c2f5270002fe808630961804047180f987184247d159b8dcb0c0f663a90a410497ea023892889053e9d19125d41a1cc7c6638a2102523aa461765a68a992f3ef6333955f8c8a272a95ca8f8fc40a9c2435174478f1e2f59802811109922320298bef8e20b2aaa0051a21d4190b071a49a2324399024c98a1085c40b898241b29084466c48f3c7080cd38fd18f0020ea822846644575081d151a3c78d8f6565e2e4ee765bbf282992f5d94b8415af66e2fd6eae8fd67bf0d92e3747ce3a48fba4b091b9e2ffa6ebb3e1f7df72d1494ac414edb8eb60b19fab58e3afbe98000aa213216a35b2e3277ee3984ce756cb7b9da1546cb6ea64136aeac513bafc7dbde9a25689077756dbc286d4a2b7d7b06591fba7a6ba3fed331ea7ca5c40c3246e896ede6aa776dff6590933ebba6d768db65bf22192475d335b3e5a8bbf442ca7930f3659a60a6689a426f210b89406848469fad85cf698d77353a06c990c51bdfd106a97b3dc52097d7ee56effae6ebdf711e83f11b516d292f4152c0901fd37999a6f788e8a89aa669822c4636a39230c4e55c8bafdd5b33d36b9bf2b2b539eec7791ca2904ccfddc0743c9e779da4040cf241cadcf47adb85d0310a5d48c917647d4799473a632fbab8398fdfae1620912991e843a2aa138a2f255e90eddafa59bf1bc736db7bbec3f248a8d09069e2caf3968ad9346fa2a40b925dbfdd26b79f9cc7d64e6b7d7c3ad41039d97f420917e4b3f6b167df5e6f8c31dc826cef3d76ee55e8d6c6398a619e1117d304f150a205d92ab5f1d5d78feb43879cc7475a8602b52c48b7de366ef4beea4d9f711e77362130aa9ea67783122cc8cb6ea9f37a70c549a95322c8cd239d04255790cbdb9db596ddc62eab97f3787137e86ec4dcf3a2c40a72b6af715a5b5fb3ed68398f8fd409f2364dd3e46e344d9ed9097d354df6f347eaa4d3e4af648c922a48f8d5c6d870d6f88c4de63c7671a1e999b57247de33ed23098daa6316239b1e255490f1ba696f2fd666b3ed6f0ab2b276bfa953c6d7be8342a6490af2d2bb608d6f756bebc209af88484854b96331b231414914e4ebafb459c7d67dcbb4e40c16978d913176b4a785c2bc7632abed1032af469f10695bf79cb9eb6ea55de204595d43b69e9b9fb6d6604913a4dfc996564ae9b3bcde723762825cf37fbdb858ec5fffbe53b20439e17458bfbfceebbeee4809d22d8495ff45b7d6b976dc664912bee37af146e670f1bd8ff3d8dd03c574181224c7492b638f526699d796e4b708bd0c25a44f507204d99885d727bd9479d53a61e747094a8c2027bbed59c7f9f3fe6a91c8344d53cce8e3588c6c684911e45bfd1fd9b6ae0d3ad8bc8408d2b9e172d4dac7b859ee583204e9b8b1061f5dd5edba0d398f65fec342ef1212b930bf90a862254290d7d5fa2bae7819df662fe731bca251ac60485431561204c9ec91ef751c2be5c83c66f379cfe31910559b6da3949714da4629b1bf0408727d5df4daf92cbdb1236d404a7e20fb56a66d5fa41432ffd91e28f181bc77ce06a9e3c990d1c8af07f25f84cdb117df9a3c5db49ff71f253c90f72d7d1effc5d0260629d981ac4fd9eb59613773bbfc79cfa69b16253a90be7c460a99df3d2f6e939303c9d6d25ae9bd1cdd2e4a398f1d8744150ea4c3e8d0b6bab8365a5be3bc4dd5698e253790ce46c673c567c8ec98721ebb8ff9c6cd6fa9daf98cde074a6c2029f5eacbb1b3175a873124aacc90bf9cd6d6e0bbccbdd8d44351748b921a48e75864af51fad1b1edd53490aed93aed5ccb456b9b35b72e99818ccdadb9536e0ed7bc8bf3986d363023fad6b50c24bb9fd45b5cafad5d6c82d854120339db71f7e2777456e8cd79dc2a2530906fc61b9fc2f916b56b3dcee38ab2ce2d24aa5c4919d25a16abab75fd5defee9221636d7d2d6d2cd2551fbf921748c7b5f65ab0a3b3b3d92e71819cf6db3facf6ff17f7978c21ef7b5debfdcb1c63daae084ac490b741d89aba836f396cc779ec992198177d3a1b3b41cda1174551cc65b005eeb11dadbe2a33ea9cf318368f36a2980b250b2a8bcb276d934d7addfc7436ee461be798d18709598163754eafecf69d3777cee3e6a202e91c8cccdd9eb35ddb6a5d2990acadcfe82cf79b963dc679dc5c98a128e6b22cc2907efd51fbaca3fdda99398fed6f9c5d8b3392521629dbd6377ab3d4f9b073c83455143a16231b9824325af85c7de83ad6c9e064ec3e44d59691357e7bee2de60b23a32e3616231b2f9044760eeb7af4d535db659b91640fe16af5c5791bf2f5888548c6e5ffdc8496357bec17e77105b9923ca17b6cebf5ca666dcf79bc61dc42f2fdc256237deb9cd1c89cc7ad0a3024f7a3b76f8490b9b6064110bae7acdab5ea4706d9a4a4f78c7f67846ed95bb582623a8c7e248c77bdbf8c3efe5be9c7c8e6f7da2ef66f6aafb7158f7431b2b5b05d643c672fea7e566ae733874cd36331b2b9472473ccbafb4e069945c6603e9d2371a140b63867b7566db4b42ba48c29d71df93d59c3aebf5cfcd79a3916239b1270e4336ef7b95557a3d72d384d1ecfd769fa108c74b6eb55f6eb32e89e3ae7b1ed6c1e34237a1f1fd334f3998cc5c8465ee97445ff45ddd1e66c9df3b889626e065e72858f3257e383d3195bcd5609acacf7fa7adc7ad2ebd3b2247605e6335ba6e9612a10b5e1c76264632b7b6c113ad8cd1d8b8cdb6f33cbef4e4ae36ce6cb79fc222425f4a29569fa109069b2df0151759aaad08b40d3cea9178744a0122550099fd97b778deef176fd50f1eba78b8f8a831588e231253f7b93a17b945d74479d6331b2d97cc19c37165fec059941e8fe9c57637451e775b1a61fd98c3b8b914ddd480b1985cfc2a60e42fb28e7f14c4804ab1af2e1550d4d8f2c46367e02c79039e6e6cd7163e6a037c3d8683b1bf95deaed1c13c86fabbbfda573f27a7e4b20ff3d3285b63d7576d049201bd7faec3ae8aab769dd76a88d6331b2198111f9e89cacad5a997afbdb11c8f8b6314abb1d737a1715e285f479eb57766f74ccb4af08e4aaf7c5c87e9bb1d58ebdb4b318d904292299766cecececb3aebd4d53880a857e9adc6331b2e91071ad57ece7e05b8b6133638fddebf2e833c2c7cc3072de344d93f3900884821779a3d3396375adc6089d398fab23f3411bd1c344b7d9bce748e86336f4486dcd626403c4455ac8de7270dd672b6cdb388f31d022adc717fd3686cfb5785d0824e3d5b6a1bdb4bae7f035f3907f0f176d96d77cf53b86a00bdb5e7cddacae56af375b4bb5b02c06eb738b42beacc245570b1792553759b3fe8f596ad9e43c4ef5d80979104e7eeb7174cbc276efa113c4ed0202796773b4f536befdde6d9cc7202a64797d405e861fbb317e0621dfc979fc1fca5337cdbc22df3adae2bbfcdef557e63c863fb6801c39bef5da41f61673b39b6290783c9364bb38cee66efddddb9585d1a94621ea7a40319d6e31a30f13c55c9920b2ae8efcacdde9566bffeea53651888a7c11bac3d791c2f51cab52327b993a870dc6bf6d4db7a285b4d32b64ebae5b61b376711e6f18b3e3fa48581740e46448adbdbed8f3d3d99cc79b66278ab9ccfd903e9f8b753ddb45db5f1585a0077cc8666f3df36963a4efadc579bc79d003d21d3ebbfedad93e1d759cc7905f072483b3ced5ebde1827e4c9792c438560b87bc837eb73cbe6536eb0c5cb791c12551c90ebbbf56dcdb173cc59e43c16c5dc48240b79dd5cded0b98eedfa659cc71bfb991bca72bf116021a7d7472b37eb687b66c879cca946a04d88ba1be7230548ca4bca8b9094fa45ea23d9c8ccd06b2c46364278c87fb345c8a8e5efb72ce43c0e4d4eddac491473a7e9435415816814b3598dc5c846045142b771d186937a3be793f3e02845a52525e54548cae6d3791d1281d887a8ea2c46361c80b23e6be37d675ef9bab9388f43ff79922e08e7746fb5c5ed59ca795cd9ff6a237a98c6292f41aa99b27a94e2324d33e54548cac6238b914d890c5c6ba0d9d780f3142c02dd14159200531a5812b8c2025304aca04015bc6303ddb91f025d400313a082023ba498428a0c5c408a2b1aa5f0e6391b0a60c05d052e9084921159200a0ba040e15a5b80613307a502cce3e91c5914986202f3433b2430f347aa88c01410d850f10051688aa638690ce880e954513880ab993fb2d9d1002918d03154dd6cf8886b0daa5fbd056c7628000309d86ca440c026c98c81e20030946703f3e9c0c0509e081820c60205e0cd87ee2644892605083000dec44c118a00a80880fdaf36170040ca13950666478e8dfdcc8d9bf0460325bca93a9b8d28c96340f249b0195028f998f9d1b0197d304001a4365ee0081fd20e7490031cdcc00666d480063390410c605006192f70c11862b480052b50410ac298495285c000519f18cf1114743830f76da5f38bcd094c500212181981a4a30966483a9aa0891c602880d4861860f02179200090e8801d24a96a44079248928402820e3c213d128a7aa8da630d3d9a207a981e64f4b05af448e9e1000e48e2840376c082c4811c70400c69118a901c6892cce2115920e2d3a158baf359c902491643b2a0408924652161f1862461e1052ccec02208120a0f2c7220cd7c7c4892261188a82e92260c27583880872624942a78acc1c30c28222a08ca34adf048398421a4dae1804254cc8c87026d409468f347664c54c34934038507caa72324824ea2094ea2072449a26207ca099aa2a2024ea02002af979d8bcdb7f84d19c8da8b5a56d946763dd218c8c9f8dde7bd60b35f87815cad39cea6abf172ccbe0c19977bfc98838d23fc66c9901de17d089d6defb5f802c9eebbceefcdf68db2ea02492b6c18977d7863f71c4376743a2b74d4325ff7e51043daf6bede8790a3b3d16b27a475b4c2656f9bbcba3527248bf1cec88d2dbe90996e42b2c5fe99efbba76fba2664e4ebe65cb523a3f4ae9909c9973e65b7b7c18e7e3121ddaf576b74d3c2d96d5e423ef7cbfdb3eff64dee6809c9ff0c5a0717f51befad847c37ce76935aafedce2125249d8e272fea209b4cdf2464d759f9dfa22daefa4d1292f6578ed6c5b6bf6024e45d8db2e59a29bbafad07095923bceece603b65661f21a765cf7fbeb8e0a5d61192d5be7fd9e4c9b339d808f92cb3f1da767667d76b8c90d1bd3dda8f7b3d48d91721fd397be7cf672b5f5a1521dd178dabf93367b3c144c8cacdaeb5ec22651e9b2142b69bb536b798ad6ca33d8464af56dbcc3c9b568786906d1d5aefe6f6d9dbba101246d6737e74e8cd1242b2c81ddfe30b59838b3b0ef9b87937bef7d1d5ecc22163bc4ddfed7d2f3e1d846cc8b7c5b6e074ccad1784a4cf5ebfceceedeae61c0819db9b2c5e7ee88dad0a0849ed83af419e75c23be31f24f3361f7f74b4b9c86d711ea7bc04892c46362c30f1839cedb2f5b1ad7b591fa4c74b1bad9332b6be46ee37e46d9451f73042e66ed15a01f11d98f0c1dfd1775a1983f4d5673898b821979b96dee66e7d5f5d534f790992c20d0993362adf5ad9fe7dea1a3664c3ba76ddb9afbb6e03fb0c267b90ec8cd558638bd0aba56bc89f8b3e9cf3d2ba685d1c4df420dbc15f347a9bafad852f4a1335e465bcaaebc7deadea6e1cd20224c5ae4cd3102129ce358b918dc919267990af59e85875f6dea06d95f3382482292f4152aa0f202922aac8e763545a5266422faca182091e24eb55fbf1a4eed141fa9cc77e0749996de62284ce1ca59529133b48bed4ad66f0ef7ae89cd641ceaecc7e2f76fb68ad7490ef6e4f7e6ea616421add03267390fd60843edf84d6a77b4b0ed2a34fe66b9f3d52bf1e0709d74fdadc2f16ffd566e120e36cc6ccdab61a69ac363233b4ba0b9337488f90b6f8e6ab2f360b997f98a421edacbce663c691d947a90b17dd5b98b841faabd1328b3e277bf33658039336c858a3ffa38dcdd896b187619b206c901056c8bcdc5b5edb83eb6e8ed4190292029b47292f42a6a95a839cd5a37dcf986b0fdbbd1640305183e479eb6c0f2bb5d6d1c7d2209bbad66ebb471a29f5478364d5e37acc395a5985ebb9c919e4740cb6eb7a5adbbaf96e4ccc205fa5b6b93fc75665ee1e91212665903c394e37a9b3962f7ded8c98904132c71afb572dfcf518da24d48f69b29f84a2f0814cd0e0dbeeaf1fd20b6f739cc7ac81613206d7fcd88b8d357d7ecc793c93840a8136949da6bbb1764e5367865e9849224cc4305fb5b45f5bac3de77d6854519e3a4d53e83d9e182aa4b21e17c2240cef3a5e70ae581fb4d13d189c7d733ab53d2b6cfef00b72b1757d7673fd66a5de9cc72ee525488aa7a33245c1c40bdc5c65cdd256a985b1b92e3c1bdbd23abd4dca1ce33c4eb16f9412d3e154139214fa4629cb45265cf8371facb71db37651cb792c1ac540d1888b8f4adb026c6ef56aedb9c6dd1a64fce69bd746e79abb4e3d9e59fda3d22030d1826ccb1a3ac8fc9f7d6fb61504932c4867eae6643a2b6d079b731eb766662c46362e265890cdba069d4dcbcf98f6e43c66579071c2bb38be7bef627f3d04132bc8ffa737fae4e8f7f97cce635705f911367ae15f375d7beeaad935c82c46362a26549073567693f2c3087f7af4782610b8e13805792dc765dd84cdcd27749cc76b39becdb118d9a4984801f2eaf62284efc1d51a3bf77dcf2d8fb53637635b6d1205e96e8b7771bfb7cbac3e108b918d8cc91972b1e5a08dfe1e3e9bd78251b90f1328c8cb3f5b651446fec93a4ea59f201d65dc3d2f53187d42a6448e7a6113274886f6e73bfb8cb5fa2ae53c8636860aa938c1a40992bdcba67dac27b747df5db498a669f2314dffe9dc3b231bc184097245a78b31857cdfb4fe388f3715ce783cf34e936b7d642d41da67b638ce18e37cd52fe7b112a43b07aff3ba2abc0bc69504e93f9fddc5fc39caacd6161324c8f962534b5dacd4f9b109f31f47c4e408b24e678f56efbecdb6d08701999a1841b2b35add63336be6fa721e7f189de8854911e49dbf9a6bcfd1c5a87d8b08d2fdb2d141fa66753152e63ceec7ae932cde5c5eec5a1f7116231b6b3204e9bc5ccfe9edf2377bbd0c132148e766ff73778cf673b03d4803932048369fb2d71c8b6d326ceeabc919f2363c630204f99cbdaf6db40d726bb5b24cd334b118d9844c7e20abfbaf7eb698e3846f721e3b2f9a890fa45b3a9973ae9741d87f7b205b7cd545fb2e65d6c1f64c30e181b4363ed61ada7676f19dc90ee47aba28eb782174d7ec7520dd9dd3b665cf368ff152931c48777b2783eb31bb22e3e7e2c28184ce5f63ef39dbeab3fb8603931b48fad839d28ebe9ef5d9e00e4c6c20eb8c2ebef9dcc15ae77aedb118d9704ccc90efbeb7dada0bdfe4781b6e4c6a20df3167a753da9c451b8398d04052d88cddd2599ff31856cdae99c5c80688c90c6074ce9c6b7f10765cabad685babf1aee5fe276b9cc7d3544d5343622203596f7d75dd8ff73d378c233089819c7f9bf9c6c9e8746c2d0c644fc60ee374ad52669d97d1984318dd45778e5f5bcc316ef1cdf687acb137a7bb266448baeec3ba38b63ae37bd85108262f901c63cfc50dd6875cdda10f4c5c202f75edbbe7bafda86537fec0640c392b6dd4b67737da7cb69939649a360c6d6022863be7b55c73ed357c9039b8daba8d5aa72f42cee3fa5564b5a413322ee7b35576ca9abdbf9c57411e259c90ce36666e578d1f9aa3209e394dd32446c926243f1a1bf2b51f1dfb47ab91688aa6695abce15a7562dc394d48ea169deeba7b4e48d933212fbdb1cec66e7d7ed15ac79890942dac7fffc218ed9b7665c3979014d2e50e2ea74e7b5d670969af853e9d9dcdbe52d69590df78be77a947cbeebc8b12f2c50b639d8bd955198d91eb570d48ca8b9094990701e4c59bda11813a1ecffb24e4ac8bbd236b6c424948e7e9ecff47d79e832ffe480192e223e545488a5b33288984ecf6565df48ece7dba2889f4e1a20510394dd3344d90c5c8268c1248c855175cb0dd9ef436b695f338446d440fe30c1fe347445f0df9f973065fb7b51c33c7d5f4428ed4fab5f03942ae76b7e79ad3679bac9df398ba9fc842d983665e5e63414923248db0b1fb63f3dd1779aec0c808591b65f4d9e95eb7858e721ec7182aa4521fe4b2796c11b2d969335bb718b5cfa822646cebd9fbcf5bf516991b414922e465cf1d72bf35bf794f4448f7e5fc6f63361947f74a0eb19c47e8abf98aaef16bcc1e650cd665dfbdfd9ffe40506208f9d37943d86075866f7e2124acec99bfc5bad967e12384847f1dfeab1edb743ae390f317736eb96773f6b21eea8628d154490192b292f222240534b99826d08ce9324ae090fdeee9a3cb32c83aaee83fa41907258390fe587baf7d9dcc7fc21b75502208c93f21b4f7576366cee683665e88501208c95ffd7f51870d99afc8bca9420920249c175a667eaef7f99b4c09257f90b5698dceaeed175f73c779fc1eca42d4104af45999a699d0342d1794f841be65b66e9b8fceda16bb73913ec8ca13de1559a3b732636f2624fa4817672a94bc215d64fdf74e36d763cb66737c908de965efda581d8cad35b8dc90b5fa7dbfdab1c6ff1c4e9333926962deb03312e656286943ce0a61bfbf8bcd7e3d1925fa6c28d1a7232a61433eba383a6646e9622fd23dc8dad6dfadaf1f46d8ba398f535e82a480a89016d304a242769aaa69aa8f6495ac21efe2ff77bfac46dace2ede70e56644bd84123dc8051775d6ef5ecabed52f324dd334239aa6b678c3a2cf9b1135753f9d2794a8216d63f1babecc2a3f742b461894e441de6bd9a3ff36ceaef7effd16519dcb8c123cc8562be5fae0ba6e417fb889d3b4d9cc696290c5c80649c91d2483d646da5f27eb1669b483bc953ebfeb75ba66b7da3a48171964b8ae57ea3532ff50d304598c6cc028a1434718577bee45065d2f876f45c6b6319dccbd2ea8d292c24222d01c64335fac358badeb7cb0c941aec8d7c26e8bcde96f31ce6318070929bb93f6b4bc22abfd70906dd6196d8bebbdbeb0716331b20941c91ba4a55eb9b11aebbc0c574d43062f4252364d038d23649ddf3e46c7ae1fda081b21a3ede9bcfd2dbb191a46c8c8eea3b4c50b2df5e7e822a4ab8e99f7b20e6173c740a3084967b5fdeeb17395e1738990eeba375dadad5dbbd5102161eb0bafed09b9aec9da2124ff7dd3f5c7387dd96a08e922e5b7babeb5dc72ad0b21ad63466f7b3769a5712d186808e1bdea8bdcdc1ce1f78cc3c5d68dc1c8adb1e7eeb56efad6a5ee3dd8e87c4e82060ee9ea5bec5a7737725bf7721e6faa8dfd7cd556a019847c666dc1e7bebecd5717e7f1a713f3a4a011847c3376376bb0d90addb46ff10d348190ec56fabe3d63ffd673721e57b5534dda0c9da0018484b75ad7ec6c43e6f15dcee3c647429408182f012841f307f9f8adf8a2c3469dcfc63e0fa2366f0a1a3f48db9a2db7dceb56576bd5e480b81d15347d90adb2e50aadff7d96b5c9dd469a37e48b7ff9b6bbfe3d5d35721e579bc62548d0f081a7a57143bef59e1bb4f645ce63c647d0b4215bc3778fb6ab76cef63c76e5d3c5345547288ae3adb5d6dcdddddddd19638c31c618ebeeeeeeee66666666e6089f6bce9a81a4acf780462f294384a42c6631b211800e346c48f7f6359bf0d9e9cfd5f620e3e2bfcfd56b3d46ebb8d9e84dcd1a92ad2fee3a6f63ad3646f520ad3b9f163e74ecae7b5ba3c6f2e570b1079b7384f1c566462773eaaea3f63e7e1102aaf8bd409307d9d3be6e3cd9ecea98313c48c69eb7fb6bf6838e69c71f9a3bc837db337e34fea26ddd0eb23a735e8fe9a477cdf60e68ea20ed73cfc566975d66f05a3ac8fa3ddd5747e6bfdeb47390f15e66d4c27add5bfea61c66f3652cbaa6d4c541def637c2e53436beed3138c89eec208cb3ddf6e3c741346f906cfb7eecf726cfc830529f4d1af2b5b61c6cf3ad7aafabd70dd2adffd7cd93da36c87f7d216dcc3247a78b970d32b668a79bf4bed77adb5d8384cf2efbfcded76c9dedaa4146660bf6856cb548df6f1ae45d0c23a4ccbae69af58b06f996bb95ae696b3357d73d83a4b4f65b77c1cbf0f6bf19a4c7199b7de7e5e674fa6590917d652dda66f6b9854f06f96ebd75dac9dcc70ae1a3212b5cdffcf15d47eefe31c8f90e63abebc1d8dcdf8a4142eabca67f43ead1551b06d95c5c3fdfa37ea1756ac120affde6da8d6fbe38e9d72fc84b678c76c667de62acd50b923ecbb4f2ec1b99fd58bb206d6d8cb5eacb7573ec552ec88e76b1b5d3f67df55ddd82ac8f29336fac6a41b265c8bee9ab1f6d8c340b92cee83ef247cb20a38e6241ba1aa15738bf3d63cbd12b48f7e2bdf0557bd77b736a0549ed62a6edec73dbdecf2a4846db32ebd6b3d7cc7d5241be5358df7c5fac7ae3390519d775eea96b8fe9ec35a5209fadd459bcd4b5e7ed4641cef91d6775bde0d7f6ce9035fa85f0d508e1bbd7452848c8ce27bb6af92db72d3e41c6b710d6bf3dffb2d8a213a4bbcc42a6def4459e2b3641da47e97ad0ae09978b8f09d2eb8490f56d0f2e415a7f73ad1721bbf3de0695202fe409d9196de7983b4c82646eb3ce7ed6dfcfcb201264b3f9bcd9fa864790d1c5b68d56462773fd4690ce1bbbf894de7efab408d2dfb608e3c70799ad4904d9b53edbaaa5add9f8e21064b53ee76b8ed54b2f83429097b63b57d7b7af36c320c816ad5bfd2e7f9bec1d10e4ac90f9b6b37bcc20fb81bc6e3d325ff7e9a48bf94032e89ec1f72e75ffdc3d90f52bafb69c756c35ca8f07d2b5f6eeceb7dd4819bf1dc8f64ddf23adf6efbcebe9404ec636c6c9de0bfebd3990b679edba66a50d69b338900debb2eead577703d9ee3eb76d5a6add84cfd940fabb5f6ffd67f75b73ce8cda6fd1afd0b9d740c29fb0b27a978dec6f391ac8f6ae5f9fbf9beed29f81a4f02b6bcfb1177b95817c7ddfd7357945b89c8d8174cbd8ec4921bfad0e0319ebfc6f6fc50927645a86f4b71c4f47a3c775a92343fe5fbaa24f1a6d6d97db0b6465cdda36cbfc2d57ad0b248dee35bcfdcc3563c8bbd8aaae27ab1ce784ae1143fa5ddc225bff1af4e8bc13f231d6e072d6debcce35e7847cede8dbda70bd5ed57d1312b6ed78617f378cd35d1332b6d7ec3ad8d5bd789967423e6be3ebf6d31b42cb1c13f21d73f5fbcef64bc86967bd7e2f83cc685f4b4867e17ff7476baddf5a09f9f7bdbeeb21656e394a09b9dc3abd0e7a7bc70a27216f3fdb9a316ffd6d1f9384642e3a73cae6eafb5cb348c8fbb73e67f359e7e6650609e9bafb3aeb1f6b3767f608f9fffd6ddd9d73b62de608d9dc3f658d6ffb657b1b212d85ebed5a333257fa8c9090619dff6b45d61eed22e4735b8b5abecc5fe354846cfada6d77e337a77176222465eb229df0355eb3672342ae49ab6dd0a77de65cec43c8c5abf6834d27fbc9b00d215f5bd6d969d95b685f77212474b4ba181fe3f5e6432684b46db6dff65ab3f5b28f43d246dbbdccad166be387433eb62c9b0e5aff87d10e42366dad5d6bad20e473eef2f4e8de318d3110f2efdbaf8fa3f5c72820e48c6eba7f0b36cb6dc23fc876aeedaacd9b3af3e60759e16567ecf274f7f0f39efa48369173f441322f8f6ebab518f305b90b39de9073725f9eab3666bb32c879cc2c0d39f8209f3d5ede7aaee777bdc779bcfa0b39dc9097327bed2edb7541db57c8d1867c2eda6efc6fcd79a333a79a5b8462b828401672b021d7b42ed6d77cb97563b59cc7cc43c8b107e97f9fe1b4eded5ad5ddb5de629aaa14205ca4ea6ecc626463801de458433ea73f2bbbcfcf1b7cce79dcfc1239f4206bd7e598ffdb4ba9c3c979ccbac83475403e9ecea7936eeaeb3672a821e18dee28ad2bde08b945cee3694a22da7cfdfaa13e33a24e10d1344d53354d4080cc70e1a323aaaa8f21326d804cd334d5ce34b9223f3621ea6e3cf5ed34857ec30800478e3c48e71832ff1bdfbc8e617540c88107196df51a1f8b34b267ebba83b4de0e3aeaac33c86b393bc8e5ee9dbb8bd55e16610721471de4bc17d267635cfcdcbf4a07e9ef5683973d5cd6798b73905c9f33b57e7fdd385ddf20871c64ac77ddff07637d74d6fb221172c441fe6cb7cfaf9baf3ebf8ef378f3e01839e020ed8ab3e19dac2b85eb43a056418e3748d7adcddb207ddc2b726f380db95ae40bd7a4d429576b398fe1e3400e37c8656b75932f5dd4c55579866eba3f44a6c9c275841c6d9097c1fb1c63af45ebd41fe7c9e460836c7575f3e8b1b24a1b6d1bd1c33c167d9098630db2f1737e6b756bcec5feaa417eabefebfb6c0e7fd99b06b9a83b5ae3a37da1adeea241526e7459fe37fffff93d83e4659fa374da7663f4f56690cdb3f931b33ce7b3d396415a0bab63abebaa707a5b32485ef3dbd5699fa50ed9a221eb9ad3ad6d95f6dbbe750c92b5f77c7dde39fd2dad6290b12fdb7fb4b938b9d21a0669179bcb2984ccd6d6af8241ae3aadc73add3bceeaf50bd2b2ef091757e610ba55bd20ed74d4b2f7ac1bb37e6917a483b6ce7f2dde8e943ee582b45da3ffe2c5fafeb2740b32aec8625cf6368dd629d582b4afed6b5a5f73cbb549b320a38bfe91f2adac9f6b140bd27eeb369f3b579f2da35790fd2d7a5dde627c0b32b5825c6bba8eafddd51cfd45ab20179bb53e66deef61a4930a9299bf76e7699db519e714246d6daec6fe4ed6e6d32805b95e83d456d74ffd7bc628481a1d5b67bd315cb1bd78866cf76c2d7ece277db52314e43f87d7adc77139641c9f2027d308fbbd06676d6b4527488793c6f7decd9fa50f9b20e743f8d8f3e89c65944226483b6765cff432537e0f2e414ef7165f7b87b335e7500992bddeeb7132d88bdb7d49909399478e70fa74bdfa2141be175d656c99df11a4d3a68b3238e9f5690469d7a2ad394bfbc6d56811648c8c3a868d3173ab3a11243386cc9e5617d7a3ed86202fadd0b6a5d3df53674d0832bae560bb752dc3176310a48ddc6bc1bf0f3a770804d996a3cc2ba476adc6dc7f20fdf662d3ef5bee6f6b1fc8fbccd66b117275372ed6037919474bb93a7b7651ca03795f73436bdde78b0d7b07b21973e5c8e2ac1e2bd581846c9b356df3bde5eb9c0319efbd8e3fb275f7d98a0309e1f467b13d7803e993ffd6cbae8dbf9e17e7f1c7cc8faf20870de474c7663fb61665d3a319b2df556be7d7e991d25703f9dec5c9fc60b3fb5cbb349090adfa1de15fe89abd33901e9788a864f0aa959196a22086310010425949150063130030302c1e8d86a3f178a2287af203140004597e6a9a422e124983c1500ca3208a82180662100008208410628cf14a116e00c03ef6a440347b8ef61d6168e8db8d0df74bf5611d510b68ad2dc4e0fd4d8a705a5d0d20b5810f42cc59fd9f4544d406b19c83a5727210ac88d8bc7a22b7f22c74413e376766d43f788a5fac2fdf055a20aaed78093242b7db8e7c7791f20bbdc6d4e1d1c0af715c1647479b78593ce764b6f93fdf909a5f5470cd7fea27029f280eab52b3137df15661e3323b8ff7015830f651a7273da49283635c46bc941e5f330b5c53695aa4c414c740ac11cc8cf434f43e3b88e4e300cbcf1b5855b61443e3b7cf3ae2f58cbe3a857309bbf341814fac97189f5c7dbbd563afe96028de3f4d559c637775ef79a3917c321f061cf708f244ab71818e38d3693729bbadf51eb454afaaa0d78a3f4d96679d2e21ac2a4724c040e4260cf2b64988d8840a4f118c18df8bb57c4b12d0f1378c3da0aaf7845d991ff3d2e20506a60f0aa374a0c8efa7fca2a0a21527897b47f660b144cda256ae37b42d3e55cd014e24343b0245cc00d7683431844a4d024634b43b04256600d928b43186524d014344b43a0635a600ad515aa79145472ba4a62af3940685bac813d562c2a15454487a9b188e64b508086641d025fc6b50cfeb6ff590124f46d0febcbdae95a0e40be251b52f6d3c1b83e9328941be548d995566b1a4bacbc4fb17900195418442a82bab0fe602070a2030b4eed4f5c941dd598cb823f387efd4d4632b82e965e5d48ddeaf1cb73606e2728a1388010a05ff86fe03848fab7cf105a2e4006f4b5c860909ce6cb43b4223b61ad1179b067e396222d21b4b2fb206a21d49117b35622ed207421dbb22a26e4e92315b2af3bd8e0d743812230636e22eb60c9c3ab2a2440bdbb494cb10a390de587a252ed413d3d1fe6ff0381dd8e5b83a72928c8a309d4fe6985bc7bfc47c0397c5f1dbe276fa2f2b5ff4b24dac5c183104e9264bedc585d4cb8a6f1d058ca38db8ce6e276d68cbd03a55b24bd0f5d2245eb95cd7fc4bcf0aad93978332a153c81bf241fd5a11d38da48bbd066e1cb1474aeaa8c08413c8ccb8a5ff1bcd97b5b4daf0a490ab1173b17d4c28bf2cb7e87f9bb272156230d209961ab214a29b2415dbcb2d9a5f38cb4feb8525bd6b510ddf74b7417f656659966b0d9b666a9e068e85db46721620ba2f4a001204182f961cef46f5396b295ef6f0725dcc37df84e951d1da2c706a31db74f290f1fde9e2a18c31dc6c1ca3fd8cd71ea7da9dbbdcddb6d970c5a861734295122e6558f85afbaa0ced3d0e494ddca948262bb01a15bd7ba69d12db681ba49b30cbdb7d19f28eb2710b7b85237b6b0e9d4bde82f1c80913ca03e9e787d9c605cec4ea6c6783853117b6c7ce70855075dd0ab7eca674514177509eea1601f155d06c868f7e9ac0a2bb4a93744b2c62e552a7df82c7c80e9410c6568f1a106f5926ebb53c43f68cca8287dd6264cde7ba3e28ed5506c217ce7c270e662b2b5907a87fe8cbf965efb3b7b4b5c7729ea531371476482df40841102bfaf61c052b0f0f36752491b2b48b4d352190a2dbc7847ac805d697dac9d4db56be954d37ef10cef6614f290e60e834e594ac79483a807ecc9167e8b4e7fc17e64d6a7197a7ffb60324d2c0f265701d05829a8c5336af89c889c2e384a5052572bc0366cc4b3f92f636866a4a0ba2bb4e41041b08b68d12286dc13911d2ed884c9befd5c8c24c76df134c28b0aefdbe99986f8071a010630bccc416981aba14c7171b16bdf4baa4b93303585488bca03c33f1fe37cec4ed5e7db1cd7835346c12ffd18a84c2146237de06cdcdc199f64778ebcd2534020bf1c675f868d73e0457b31e2ec063f3fb0a85487dd6f5fb2fd7689e767eed5744420be03cd8cc05d25fc961271803032f9c728593fcde6332a54317018b5a471ad5e0677b35288e62d90ee373d126c2e93a29f3d340ac41f68f323ae6e2f80e81b27bcb68aada9e470c4716f437ef848369151d5cf6d460e9a38c27532573379c0dfc3517c428f52d4c94ae18c3bc42254650002d2c6493ba240c163a89265f3d0fe4f44eb282f3933c701949a201f1c217b46b28d8f5f9340f6559debd6f3a3d304a6926664c1c7740d4ebe62c7e155015dcba450bd716f65abdc3fadd02458bd856f5b550c362b9c58c56695bf06b51864573ab2e5ad8b6b8d7e28755e416315ae8b650d7ea1a16d32d68b4e06db55c8b362c9c5bd868f5b6c55f0b342ca25b55475d0368f1440ef9b59d3bde22f31d0369abd85d6897557dec455c4cc6a0f8559e314a7dd11cc36957b5cb6c70c7015b75b281a61ea2d4062f8d92666d82865b3a2cbf715deb6b0cd46144d7a1ffad2adf582b639a0c6ab5f23da3b046c3335cbed52e8d6b32de6aa03d6be437b4d3509f63115927af415d07ff1a85606d26c3d91b16695c36eb171bc86dc4df0d3dbdaa93b17e8d9977d0a5959b8c626fd8908db0ce78dfdc349ff6e9ba2abdbc22ab74781919c3ce111c1ef12dfe652bec7b42cb849dc1fa7340d3d0f77f6d6337f7df82cc9804a31b7468715d4016c709787d4f16e4065c7fdb19eaa279bfa83073765a6739bf1351e54f40e22a2ed8f7640d0d477fa262f489c1ae543fa3dad1213ec7a51a841cd666717e315c756d879077f10f392723212f29cee423df9a0c0bc3faca117b65bf562bac05247f0d95d89e1da5722ffc705194fa79afadfc08b0004faca5e3497d63ae05195f38e2262756700962671bde531c050685e24b445c7a0a995f26d17990d010f188d9b926e1d70e778b0f1e1411ccbe087cbf73c6a8274169ba76a8ed86ea20f28f3d7f27e94f2ec26f5cc5086c13f48d54e9f2bb5f0e7aac40cdc85e5c5522d0d07c8f135a0d67d9ef80b87cb7c8ef882c1dfd379e4b1ca17ff286936d98fb4fcbfd43a428c3b888510f14cef3f8a1228446e62f3ebfbf801a18e91203712601f84ebdd7b4c8d53ee143988c3ba2e7cf07f0de2e122141d06a40c9bdaea3c5d667edada6624e0edd34b520922ba36ff7db796b15cd379c03b7eb0cb5923ea410a9d47b0e2f223fa4fbd6e450354e7f2504f4df5cf4e1ac89b8eb197ca51d44e6c78fe0d066e627ec8ba4549b6f0a72cd04ebbfe59cf1eebb1e294fc75bedce8f02c3c5ce6769e661f1af1366453ffaea09e3e2c3dfb8dcfbb9def19990f05124a4d3bd87cfa9959ca9249122ee17e94c077ba424750a2a93e1fbaeada94959aab5b77616f436a9c6f788db4ad2b58c1a6d0e684530461ea6ec69e43b661f939b7b3cb02792844409aee219971f726fc7e7d87c8991a18a7adac404bb843238f551c28e41c55f69e772ac4eb54eb212708e75e70f176c0addba40d31567ed46f177816bc26d2282a95b7ef80148e8d3b689cc47ce52f679a1435fca2503b85ef17607876b7f92923f06f74b9908c0cc0730b031422c631b3e7a26ad511bbebfe0a908d334737b839333df9933a4b779edcf934dc68fd7432a623579ebe5cd3188f5d1aab6bf1ce093dd198020139c92dba6a4850e0596c1f317978aa487884803257c71fb8e8bbfcb2566fc88572d71082992bff27a380da0e51382d7f438f4070dd56fa239e89f7e4888d5c9ed7685e2290dcdf23aa6a8c02fde2cd94903d347eb7033a77246c998f064b19f922b17855903e69d553d04a0f6713a78de139d6d1ceb4694ce727a5c27ea06a3249a2e2a559a6da78357142b20e0089356cc31a9083ae55380fa68403147bd78ece1123224cc9f5dbfa4b07e09f8bd21a114249896b4df49dae845a4cb3cbecef597936000d8be25cd19e5b88bef4a557c398606e21965771450f4a5aa10597598a6fd4bf570190c308bc353d738c6f7891c4f12ca7b93a81fbc00505211291fffb4fef73b01f66eaac5a1bd1756c0818ea8abdee109d333e504cfa007d240142d0039dc1dfde81437d3e7add96ce88716644aaa3e275acd46d28fd9dc73f345f6b3f66ab40446a8c05e06ddd0845d07bc27f6b7cad87d00408eae632c5022bc42de5f160def1dc433bb5fe55d7b31e80aaa249219f58926c5970b2ab480bb6f8faf43ca4d833d97708dd997e0897c4ffe2efcb8f305b23c2015a9f70502c42bc0e5242403c3c90272dba7f8fd2538604a5e6221148eba4566f9af324ef844bee428366f32b279beabe6d0ab7e9c63c7dfc2e59e9281e8305eb71f0391a8aab77a1fb73db179e58d100ad2b09be65dddae58f344dca000f71200e27b63e0e7f9563481aa3dd2143e80d118a5aca32c02782db66e6439c9cd38c4fba064de9bc0de147522bc701f2e00f04212ef34ed702e017b623e53f9e48fd659da91e073b3ae75d2861cb3b41a77770d3627fb83aa75a2e88907482fd8586f69c8acce86d35a3b515a06c59c3e1e16c5944bf4e1718d6261d46e2fec908b569dbee34e195b6d751e188d3c60822849889cde55ad4c92d74111e0ac2b65a50683789c797e0d99f3b8b9398b744d2cc17c366868104f1b9f9db742325431149ff2546b7a51514829021be68331d8dd47b31d3799476ea3020419016cdb2c37e6a0a96dd19bc7e99a554f2a2ca1227f5db47b7e749526c9d65fee40e3fa2d6c0a6311e014c430a0f3220de787861ea4478eae17993b2ed31ec8fdd1ca7884d399f2e31fc8c9fe12c6c38890fd6b190bfa1341e63dd6f167abe9986a0853e59c434b30c1582a5385524445e2d7beb7176add1b8ff3d1a26b790c03697bc14646b4429f71eb20ae4db9a8e6b2d5d05e33fdb4e71caa9d35f692746242f49b6ccf5d44df5fd1011df591a66e3b9ce474156ac66113d8332499af1a49a1bea188fed2952c70de93d1b7779edbcb4c5e51b5c3816a728bf0308616e637cef76fa6d26ce824c5930dcb0dc1782df32613e8c29dd89461967585c0073f204507682b1cfee09e7cd246e0259b780afbf3fb8e297b2df2898245b5ff37a816a148cb1c185a76798c4209ea1a6cb3bb71fedf267553e622a49767e724aa594ffe57652577ca2036b1429cc9e7a528185d4302b9dd17fb3ef69c66a59620a9ead454d36ba99a88a8b94b1ed22a5677ae3fba95d37a179571f3d4ff693c1de9a1a36bba217ac15f026aca5ec0e28188eaf2cc243f89bb9591c44da6b52e9d773d17112fd1eb4b9df655206a6b87a074a0c55fdf375e319590e62e4969c93b0e254a792ee253a25c9dcff4d506ed53961066aaa304f2b18d2b4f965137a6f668f9e2914cb8b78f8590d852023ef7afb80f030d5659ea1613b2dbecb41277da0def3deba0051b1f5e71c93259b7dedb64d844c61cedd5a8c377739bcf408afc50546cab65551eb3d8615e6f1a500fa5bad569a772507b12a557abbfef016b4e869298811cee56683b7be466088f2050cfbed4cd922dc70c3753a04dc841acbf06d11da42057d57e45f57fc304edf0d22a84a55d982864e8c754e09c40aa1fc9e134d83b965702b8a48bd9075ee7108fe36a68d18034e3f5bf1997d1bf273880807d32fcd6487bac28315d286ed401814f921de50198bc57604ef4674175d442492f921d0630d261ab364cb8057aaae69a6b334aa85d99754146b59264b6cf27be1b87cf894fa7fec72f3d4be3dba0344647c0dcd4fad9a0dae4e20a12947f02c2f33c9ee5110e8a83a04871538980d9dca4b797ecdc32a735a53528123741455be5d05e27968fdfdd2cb8f81e75d2d902be426a9ce9e718a14bf41134e6e93b4e3e0ae32dd9e1bd8cc355dc6c58095a4e90d8b3169fb0ca5cf2c76dd4b0cc5bc19b54665370d63e51191cf0c7863d68ebbc1f22335fbd4247b004a43ff3e5e398e32b2b5b00fe91668af55a94639d340bb836564cc5503e18b7423fbeb9204554b9b41987bbcd82afff1362d666b76baaa3beebd58451579bfe256c66c5291132383fe50a489c041394b6fa2501b98b8d9ad5cfdc79a3a7172817c0be07f91154af6125638cdfa772e5390a4014952440686d30e572d1242c68d4fa8e1e4c381e1c461badaeb023523944d8d49a3599240faa8fa8462137b89c17a6117f2b3a9114421b9a1df747148b22681bbe9617c0a6647584499be813f8474cb31fbcdca8572c269770c1fb721ed75c3be1d0bf36bccc99d533b007ba7f80ea2035f5c5587f28bc08da9185a7e80d62ae65e90440ea2df604b2fd2b747feb45eee25eeedff5ff7228f4823e108e7506d4b0b8a864065686a2fda4f6b056480ad750c41e436abef1444eb1201061109633e14a99f081d0df7ae3ed84a69f8ff8095191e9f35e7a936588e3bb6e518b1c8dd5520ad87c6662381c920a44b1368709cc922e0763574ad0f8a5e106b4ddf2cf90331013318ce0698922771336c3e778b6f92f8298132ed5519b82bc9354544ccc3d8413997b4e641973c296e87ace7f9d26cd58a13461fe902626f4972106d7c1d4b87e6d33ef76f8a840572bd0762a0273f4beb07e74e48e481c7d61f3c6c54e758dab93d8525966583625153c95e472d537b64b9a4f532a830b43043700aaa39c8a7f6e54bb1f3185200f12e9e24e31a827493a4bd3e44849844d0a617b77304829c986729ec4b6c0b0fd58e2703e6fe4d990328d6c30f0ca073a0c8da671939601005ce50221ba2c4a5375e525649a12d86d8d6b67dd4dae83d82f2d4e519410a4b7285480feb5919d995fe3bd95752841aad49190b4d809316bc0b658fc75b9979931c9eae19279e5eb6fdfca417fb9a9f6ea5efe4ef1a370e67c68f2e98a3695be1d099f8731f5aa5f5a14b534368a4c2b4c7b5b6b542709b4becfcafbb8e73e6ce0f7e61edaeed2dd28736ebedf03e8132c3cb8f3c917e0f95cb08c28b3c93fa4e1a468a4e967e8058ed173fff9bc1135503c50e7f6aa0b6a80cf1941a4bb1216db06d8a5d9387c8451f889420a5b9d78485512e496d262e2c170c11a5fb88abfe294daae3615c6234a3b443ce6b7ccf98abe848e7cde138095329f9bf2f591a577b1954dd07d5a278048dc3eb1a1ede406bb26b7b8def94b67fa1e91a49291c11225936b163cb38a1b24b1b2504ae35ed4afd2010d96493f0a2e8c791a596fad4dba977ade6be75e6b32d8592363b0936cd8f9e47c9e3a6addcfa17fce0df7b885d27a64dfd6d8b2ab779470afb259403799c9e50a4e2024d09b92b43ce18776002c5799925932a561ea3512179400436170d10ef6866a5f2cc22b97c81cb495ee77379ab21e4c2c4b5d150fe7c5327dd6bb1ddb9275bd95cbfbd760462a798f00a2787c4366d2942fa8c2a779441dfa3a40387e1b5831698a9b4148380d157dc25f9186455146cd767dbbf4b858576b03dae235e5e9bd54039e34f55a7e26c60b1ce8a51b4de9c0d82fc766a2d032de07011ea0732a90431bac4dd5abed3e11979e3ec6614d12041bdfbcbe16e01f370e9e2c3887385e0ea7f50cbc3cf6e4f2dad01c243cb7bc6267e100b6c01ab62b2f0f0367287fee581ccde8adf52ef81fa2a5eadebbdbc21888550bbbf25b110b3e8f17720570f2421e5ccb58b3c687f050a20eb9f853c9d23bc9e2a2c6a79994de238040d1dc7a0f266158d08a800eacef02346932bc301f712801f068d24a095192310014fb0d1723eff46c802169607eb100908fc48247546758569e9f109b1ef79c5c4a72cce6c4e8c841a88e3b278426c307c76872285f3a058df5271786c874c2afb1b2f8b1fc73bf7d72d1b341c6585f8f9fade1b6e5d6bdf442ae84a7de9d14c82a49bcaa16aa217dd2a1b625812c352cc0ad60a958382702c2f6903eba36872d22582cffec8d4885a1f7ea2a8c21083effbad3cf83d14b75e746c67a69c74fbe61d8c6be7e5455a24f92c671b98117011c1ac04dd9afb756cf440606a1ac349509f3bdc171f51fd526b06fa21d41a74176fc92029899cbdd311876cb419644facd1d5765fe24e06926bf1c2a3c5549383c287d49bb9340eafd09642634eef18504e04ddf0ccf62b06bfc0455f1c52e2978cbc105507d43c5d391fd6e60e243005886e9082a488c80f09564067f9329d546ce0b47435484e53bfb8a3010bdd463c8d4901bee7d2d21222f618e5714580eacbffe81fbef2739c0713a880e8ba7111650da432a158a6ce78f77644c1ecba2cf34915f50ce62d35dbc9103e0aede0442700e43935d1732f89e9816ddf920a10589d0502ff690d3e25663d2e84f49ed758909865c01fc44c568d0b8bba6e1f9bf59e56a146f1dcdf4e4d458e841d5836a6a57c2ae2e04f2f195093c09372dadf73ec1ef940daa4603f770d4ac65338e0f90cd03d758184879c4d17767de5108b0d4f22db99048f10f46f0d321284058a158a716c077093ca5215b380644d1d922e1145a7dddf716015dfd7499a381be17f4ab2ab9fae43d5db30973aaafcc5223883940d0d3b0a7833903c90904293c4b7b88c7e6a8fd734f5428f0a29c4648c418a6e0357f2ee9c883daa3135e28eca0a75e06b18b51f8081c452114027f1b64006c59047e96c200505405f048f82d108130e593f0190a0241d0178123e0b64200c7a9f2fb40a87ccf1755ebcbb25c509d595394aaae116e3932d53b538c88877f023f9863bf09f61898f179bc670cc5efec43c1f319c1ec5d8d737aac1a2286c1787242140145936f5397db79dc31f8626dfedff3101993725363c3246bbb538d2c454bd0a25cdb69cffb77f6130391dc204e6d7f6fd2bd7aaf37f649bcb48f6ebfb5533becf4bef2e5e4530a49a088f88fb1581d153fb0200621229d9f3b6f87b6d007c589f3e4b8241b5549fdeca443fbf6fdb5f3ca34f45abf8368f47e269ce28e1091d392f91a755e647abcedaf931fc270206837028b605727b0649f35f92ff79edfef7f31971628892ded4412ffe68702577d8c0a008cca2b21dbbdf19ab264a423fe5105c80880bfefb1b04635a45ceed05040a342edb74ab7298c817ec3a69fce4c638ef407b43a4c022839aa1542ef34c57aaa6f86ed755e9199adc08ec0cca900b9f9055148b23d931eb70a9594e72389e1e639be4641befb49b6283b53a6fa2b48a27bbc90dce3cb532319a6fbfbb9c132e1ed0e52ebd1d627472098d895c0fa10cebf8d7f3a3911e0e5def01884ceed6d2bd854ab07808e83942d3b37b0feeaef0f36f0a87abde0620696634cbc1466917b0d2ed67e70bfe1e5e0512cfcb27c80e8d7537cda2a9d93649fa61e2fc705df0b6ad3f520bd8faa12140f6b52398b8b0c503f11a6eda3977e60cbcbb8fa55b389668d5f6e258d8123608a591d9cd52dc24a7f7f8debf662dfe958de04526bd4a9c8c37b8c44b1b7ca7bbfff6357afdf6edf047f13988dbc4cb4641bb9003658e1c763c8fd206b96821d1281d2fee0be074c3b4b56a48850e09a8eb9c165631d805d85f6d238b847a676428dc9b04b3b742021d7dd890972be0a32abbc913558a4f417fbfcfb396dd189dde5623fecf9af4dda686518cbd2db55081fe335ad8081db398c83421cdcf230ffd96721e7d8d921092d617cac5a8bf4dc3380c0d83ae6f739318fe3936f4f021b45bf1a112c9167a48a04079b8422ab4e70bece405eed0cc0626fc4bb1e5a1cfedd31c74abfc41b64ec5b6a9419a002fd88959e72a605ed59206ae936b79ec0a9743f981e128e05f709a83521d048c3fc2fd7f9607042476c06ef5fabc2332c583f68de3c4bd884da90996ff53012dbd7e66ed4ae4ca24c7e5461b4221fc0e77752678ee914ec852658452bac7c7320bcd5c11f32b09bdcfa49f714cacb9a2076eaed96c46b1b95806c65e154516a08832d769fea12ed0504340d1f8799d77757b00f3a568fc137fd06346bde0d06ae1f50856b6c0d79c1ae930ae85c9b9ce4d3d83f6bed66187a6a6703346b27bfd6bbcb0daa3801ea1cec5af7b85a76c7ba94a3752ff3d6083e5f4ced826068453092c869d74847ed76ff96f6b8258b2f752d1041431af1d6847f51ad9911ced22d2c5ba38aa970f63c7bc28aa647caacf1c0db3a612a35d5fa9b74efc917b9cd8d727ecda576f0fcd0f92fe45e0be1fbcdeebf68f460d09511647b6448a2a791fe7dd2a392defcb3d7e461f68b0b42ad999d645549e2411ffba6f120fbac7af9c24e72d818e96a8884a75b72eff36d0e081ae6b030de0c3037d1fa22e8a99b29616cc7924b0319346d756f3ce9eb78f62d9fb0a6319845546cff6f395d16e19e0f370241eabb1cc453170fdeafbe019f0130e28814890900510e15cc9d3bf124b28bd4eb0018a8aad49acc320cf08d58f7d32f486ca56ffaa2c83b4b394cd1d5d9e39cb303ea2de75b2a3f5c7e3261a345f2a3919d2ebb0e1a873e9a76d568bcf8eee7649b5973acf71bfea9e1be04c6e36f387bdbcfb65e5efe2d1a73c70e79c9569724cc3fcbd7ced46ca039b2140a46307f86a172b558eac56da7922d72378db41c14ba8b0d02f70c436c623a01828d724342d000c5d6dc9e70f40013035e4d1c9a5559ef39bea42c5cdc001c6e735390bb9370ec05e99fd364b6b5068be035e66edbaa08b38db961fa35dbd2ab754f1f8dae74c8d07cd36520447eb6d52e78981a22dde389761af78e72d7bfa7ede68cc5cd4f175b5b6817119e9db4c71f2d4298bcd5223f37d85d72e5dedd8466ce5c0679e85ec930bc8da509be3654062107f0dbd5789fed93a1e2ff2398ad48317786135b7b10d3b8081bf62b3bf4e26f338bc7a38b8727e083d4ab3839bf8427135efd0d82895bbc9f9e5397b117beabcbdd403fc0c9f13006e2a699819352b73a9627ece9df07df6b4e93e8f8a3bb9ed5baff4915f9987dacf7a409549f77ba0f8e58b5354921994b0bf061a32ed41e3dfcf4d534caac4356eccae07c98a338af9245ae7e1addd5dd6c0c534431875f09cb334c344966eb19066d6b150b8198f40a6d66afe827fcf8cef3f3c3b2f3a31c992e11fc1fab3f4d802e4071ff7f1dda64cf41867347a4d25d98fd5557a34bfd07b77efd1796d92ffbf28bcdfbd3b8ebb38ae393879a8c44d60b8de1095c7462fdf67077bacc80117e78ad2c4cc86081f24fcfd1238d23d1d018e194e50f287ed4bcbc51aa836cff51729b9a019fba6ebdf979dfb7656ac33a5ebf12f9524af9d68ee00f30a1500ab688edcf2e495afaf7504a8e340e5bd8f9de33878933691f04c72feced32bbe92e301d7550b2217708cffbbe632094beb5a9bf23cfdbf5aff71d9d8556ecfefbd326ded2d331e1ad67f25f966e604c89445dd307500817c9c5f9d5fab86d44fa7ed2737c43d3782e759da40ad9e8418cbcfe50cf36ce4de3e479a4ac5e23c690b73b69f0d27c5983ba79f37d4d97ac3dcca5ed0dfcf65f11b6a7862decce17ed67689dda38a4df71563a9329991b1db0887b720a30f28a74ece4e1a96ccac07988f462854e67f9380c242ef09a8efe95a6be4c02706f8a767765b67a7bad4e8bb479482e163264db6521dbaf70ed6bff9820e3c1f850a06e9b37b2eb3ef95956ca3677c0c84ff827c61cd492197eb3d2e0f8910ffc73639e9fcc2978aacdbf453d307f5788445cd48e339a0bcd69e4693bbb078598b3370fc9a99ebcf8217dcbaf1e6df993c58d2450c4747bc637db8d7d6fda1a3beccc7b28ebc28e5638da8f94a997f6aae02aee6953dac94fe83a89800394ca57f00c68c63dadfc0476428cd7ae79ae796f362a21dacbeafe232d827ea9b47b8d88cb18f9ce661148c2dcb03e7aa80730bbf4b12c9b38e77db696593c1b9916ef633bd1bf164a9e70353d5d73bf6d4ba405b24700917aaa4076f11d10e9ef21268077620b0c9fd4075feb4d4c298bd85913b18d854e909371b241a2b4cb7b6bade9fb7fbc8dcb67f631955134197d30f13b7a8fae12b7307426f55ffe6c477d4bf90aa352da52402608ad4e91f14d414b0fda2cb9567643c8f6994a6a0d1704e7bbb38e9007cb4c52748e7b575960bd572b1cd338a900d8dc2f4b95a2029c99579767e666e17b98f2ae3e438f99c46a420404039b0d0cc2f151fd5359a1ce6290169a330b9f5c73b7fc705ec9831fe2b949869b74ec5e83adc3101a7a6886a72fe89a748eee48d4f270dd00f1e982fbe3da37c00062b8bccfef710dc6a81764d66f5d05906166d02da05b041e7fd4e890bd5fb63d717f5e03f6f8271f8e32fa46e753c073c878a0fc3d2041f4b1233e3f077e6e22b99265becd40641939794df96b46c6c78810fc45949b6054245f53ca2f71e2dc14f97b32007710852f07930f0b2cd3403c85cfb83e58e073719f05728cedd3bb2b3d194f96d3f0bdaac5fc67f3d782be3c84c7fba177c6ca61f307addeaf3931510fc45d31b9504ecb6baa7c2dcfe637eebd6d6203863f3fe95d91a5010dae7950ff0b6c14675dd77f8e2bd9b37f727af36be013e00dfcec11044c80db44288f783507e69878ce26e0a9c6e29ad5c8e0a181ee9ed023824f12035680596bb80758461dd835597f05605ef5756d2edfb8f1ede05351ffbc2752e1f3b016ad321a362abcd28e251fcbb663d246d1402f1e10990faf604733ddf1ecae3a66649f9dd3a1b9ffbd132d4bb1af11ccc174106ba9df3dff558c03489ec2446776e2e52190492e3677fbc865a4dec930d5a14d185ab7bc0284581a4b32fae82e1b384cce3317d7e8409fcc7201be49c10488e2288694d029070641f57a0f8142b559a5622366c4f91f8f41f315b905711d18a3fb5b310107d5d000dcd57a641e325a7aaa283301becbaee001fd693f2626aed0ddd517d39048fc4abb656841ed2e669be012e160271bb44479cd8dfc83ab08427e845060c849ad94db01bd5156a8de42c76f236cf1920e56b8f7798c61d1fef9a4588147b4dad0d3ddff7afc5bb02f4157ca808cfff53b0dd86a760db56cac048ee18e3b6d0887aec975dcf9c1aed39ba265ed82ae74101403e46784fc96f9a7af9444a96897f7a73e2d8718abfd497ec01215e841d0055022443f0d9ad14a05e097e12380a508e89c760496aa059c03ef8104419aa3f0292f801b06e1fe6c81832d45054316c108901d5428463b35885f8a87009726a1b3da1078ea367016ac071a0c6b8ec45154b369f48538087e65089ea88a4147eed153813ae0dca8722812429f1ac56f4503e04bf3d041650468761b3a8b56ab3bec12c0960d73d3631b9cb6c664d30b1b886b0d58535a0d22d42a2890e4319a7e519017c1c320f662000729470184aac04f835c000b8bd09f0518a0141500be123e0562210c7c927e0640a012f420f00ab85408c571e0097a9900c0cba003402be2d02329c68025ea6107c2780a84746a541044e419b9839fe63a538285e0e1ce0686965d0606c5e0fa05f9317632c0ec2a7f75871c9b7ff2569e640323df9a8af16a107e6382da6bfc5e59533c6f14cf03a726b0ff07358e2aa814a3fc686a78aef0fcaed790115fa9eb3264d024e82abd80d0f7a74acc55c46a8cdb3c593cf95fd08a08b6a659bf02883543418f71d2607bae5fed5207952f5efb13ee73cf597cb8c58306bb16d4c7f59d25c23ced72a6bd04b0ed87e2534233e2aaacdb04e9c0c77ff20235d952b1d9e69c8c7abbcad49ee595ead1070fbc4a5938bc1bb1b4ed431185dcd7b92dfb8d04d4fd0ebfc0aff2f17faee4309abdd8b1e6f2a995208112a5ba83d4fda2cd1491bc9e199bdca4223522bb30dbe198844c06cac52414a4b7f46c8bb4e74c9d4fc90483b53c348ffcf9ed89ff800ac23b2957a711031638dd9b21751184fb3b7c3924499647a200cf88888c0ecda7d14584a7eb5dbc02d64bcfc80eaa3d826c087a67e6c4885939f74f23cd37808172a3ae9b79134c040da756d6da5372617d339c8b5fcece04e71cd32cf605d7cb84fd98a3f5e10c6c844207c88f2ed27e838d0d243af92d9e7aae63909863d5493ce0e0ef45560a0eb9ae0243cbc74da16d171fdd1bee46a23f07c300cb726c60dfc23e271b623f185f69049fcd4921e50defe37c4ca777bccc8174fe80797015468743fa65c57f7937ed54214694d69028287e7c7552e976a23bd5c7c46f7f52d1b3473333e136048abd60f26d47fb65d7ed16814a7eeec98e44274b5229637ab96295fe0a579da178f26631d94cb012e0e1fa37facc309a51be243292a89d42412680d2329ec4b901747be18fbbb520f9a4f6e6c181881ddc5bd3f773658c9a160475b9b520a8cc5fc6c470c55e364bfe6263a07d44c8a7ed0a045456992116ba411c0caca952377d9b58b27d6758c597cc89ee5835f0848af387dbc8de13765e2dadce1fc03fec394a6d5b747e8040e08010ecb31ca4db31c7d985e7d054823549a65cee90d3d9afd64ff61b97eb7c079fc453a55c4d97379bc2bea3b92c6496a265b012a3d3f35ab0fb09ba21d3422896065612374eaa805ccc417c6c2f8673b9c33c8b5717b042d9e0db14b067ca06c4ad2f42c00ca7ee9faf87c7b6ec446f8243a85f218f4fbf77410c8d741d3b0463046684fb8e1af3991fa593d1693ac60d1ad5ab4e6b0982a20abb6796f9acd62ddc323d76d24f03bd37cec28fbda6430494361afd74eb3dac0c9bb227509b51b0cd5e4a4303844c641e091976e1bdf707114ecfcf919b0688038a73a1cfa39c050a4a4fe8c1403fefde5d778714353f6dc412f727c54a2c4a9180944588883af17b55f6644e906f7c5de55da56464604c647175a2e28a290ce1b284090410b8f990650c1da1771adf39d831f2cede93121b745fcb95b8a20d428103ff73d7578cd646f65c869b86b44f0b2be734b387fcb464ba2c3fc7b59f8cb0eff2c6e92e05f6cf5dcb173df2c5084ee3ca5606abf07222b057178d722d3fbe2e4f20e277b6f9fb3b4de253680b48adb05a8bde23242d1270b66989e17f365d2d3cbf7c22a1b11b52d023f1ea4119fb2aeefebe5bf7b7d949e8abd0e57048dee8979fa8f9a923689f5399e2691e91dfda84737a3957358218f174566e5a07857b28656c36f624bf23d917ecdb60b68fa859d0b0fcaf511b0deb591e137131542ccb16436dbbf1a3aacd7008e7237e8d58f9d026932331668169d0ddf7ab3a9c8d73c1fd305e7513bc7f12f2182f9b58bfdc36a56c6a6679f3ad8875b493b2c5bec3aa380788a6d35c4ce754139e74f2627efcba8b838ac86085f3ef65b12df9145656a71bef88ecca6ee97a02b79e2691e0e9036be9d6a3b10441186b426bd7338ce79e806733087a7b8f37e22bfb3247ba09399f6d696c85bea41b139e723c22f918fab56ac96075961f4b787ac1d0a70bee3736d882b95246ed29075db870b758b8e07e7e87e6c4852e3d9b45ead8383c59a08ac2851b403557dbc3b2237556e211e8f50affd7bd30c6203da89b9f022e4b267c037bbd31ca665aed9eb1ac7dc62769928695cf1556b17d16ed57ecf342bd483fff7f4e80db65973fda918844498c6fd469154941a01bb734d950e6b590129eb34626b0e3b2f6079ab3c41d6ce99f330d782e76499e23e6fdc18535eb0889759789ddd6b3a7af0a74a96a5fb37bd9a3c6c040ab2441f66a4d0ed1f14d1dedfc59af3f68d8fc3c98596a859033d7bd3c167e4313fb2d12dfbcc7067cd2308f02e73bbed98e412059b129f5a73fc6f8785c1708654789d09d28b46c747021d65f592833b9a7768bf3e2df0a397128f9f090b3011f5b5eedf548c04acca020192319d4c3f77d95bfd5f82ef1b2f96b37471c2fa0dc4a5a7c1cfa211e378e223b495d0f9cab91d85a2614bd1d6614dee8a37d496ab68538f788d73d28c9cc3cb1eed4a5b76b0f335c9fca8e68f37ea8d85783e7a935248f05bea224f1522797347a3ce77445a3434d5dde8e119f4fda400cbb37d91e6fd6bdbb6cbd441afaa21c1149b5fd04fedc83bcd6caf7b9421462761a29187c126ec80c68bf04de83339e9ab521fa28750d5bd8add669ba83d2fdec9a1e0cd0823f263e7fa25a3ae301731c4aa98bdea0d95bd4eae0e0630b73f315007b71ef4ef344d7ad62ff171abaaef55dfc82abf1d53f136cb859108cfab933036d3372c1e5b90d022737efe30c27f2e1c833fa655ee2ad5fa0cbfcf895e60dab807e3fcd3861b0467e3fb6f007658af778aa47a66a5b18ef77897989756c0c99461874aea86bce804951f47f86cc8e33da5f59f5565806f18066aff4ceeeccadb52e530849838132516863e7c44c6138f4f428cefd85952202805b7df9cff2fc7a9d502ffa304763b8ff578efc5ab580dc98b4b99fe5f090ec1c58983e340075253120916f10e6e496142b1f4d6627434094f714a40fcf3f8524de0ad21584b982bc3d74b3982e3c0647d59b471906934a7820f8e65a48214948b4b3f818b5af0b451b610cfac76ca0c2d301aa7eb92000a894793a057eb8020883764718075e0e2761cb025eb0b91f5387eb73c44c800038c182604cc096949dd392206804592ece1bf5ce6f195d83aeff758142cb7a8d19bccc43b4366ab5834638b1db7c2ba783db2722bc811b1ca4c61d0b14deb70fc48d8ab896aa50a18581f37c38dd83254d6510694daa145052c84b78a53020b2117168deaf9663b72d18e6adc5306662f1005a338e0a04020598bdf848894e1687f356fad082532d63e4fda3f5c796c836a1f2441b498767a52cae94b92207349714b4a7d3693e8b6f0bf7fab665db7ddb0fdab158c4141a7781c8a4c672f57838789925b812de7aee0f053ca88232ad582e98af92bac36f3943110cf07f96c288d3df98d8c515a29777ecc10c7aa2b976b2490df83365a5ddbf1994991e9ce856958325024411c9f7f78d02b50bfd9e73038af47bb1480d10c2729cea20cf4df1979f3535f3ba04f0b63c352d62230ee4e14c7032078026815295d3f8014b0bd366f2bbf5f91101fb2388f7217b072e05b41f270739d5bef78bb8a304265a9f32b153feb9dbf16be6046a15c917445ee7eb310b12b2871e156e0fc5d0c9c26b6e571caf9618b819e42c33a82b583fbb44c150ff333737b1439479f12b51352983688060b7c29cc260962432318a955ef92b2e811b2e89f6e75f20e1708b2022414f8aa5995ea3a15b13c25c6d4fe327aa2654b2798670ea8752c07fb5a47c6592fc2bf5a9a52487afcf7a2051d3bd53ff175527a0015553335aca6c03c55c177d9f94c88dbcfd3efee47bee84d36bb7c282354c7c0f84716084b9e754c3ebee02f4d027df4b08131311d05504f5c426d961a24e72e3b8bc0d717f6c3dd9a3991bfa53f4f2c448a18701cef19701eef285d252a85edbdb9b502b196ea77c5a95567de216097a34ceae75aef3c1360a84a8244381cdf0edfa73b0fc76958cbc2394c54c11417bf479dd86577dd4a8cf4bb52848bb9997263cca7bc9dd599ccee7d0aec1adfad55aae38cd38c5eb40dec8ae2518f48851129d3d7e38bd9d767b43158c59e3bdceec2fb327857ca6780227ff3937d393272989a76592999db2ac03af9261a0ae45b6627872a0e528b6ce6921c0e974678d446887821ae38a8798bcba3706348f6f0ab780b6c77f50f2dfb0ffdd2874a30b7a3ea6cfe38b75105bb34a7fbf39b482e9fb1eeeb700bd1a9316f6acdcd3ebaf6349460924e130856920974aa020d9c6295f11a6b1ed8dedfade8653233aebe4e2c0399aeef49169b6da154cc2471694a613ef60bf7cfbfd636dd1da0b5bb05b259715543710af6126a5242a6f7d4d7e324887a08578eaea5c8938cab7c5e3e4317122e7d08aade36614c01a1f5d36a54ba51abb90a433add9247384874e7d2e001d86c6600b85b2343b0f690e310b825873f91141921d9ca266afe4c63a244023150a57accce96947b3bcd3ac39125d4ee472e75bc831becc3c7c651aba627976598f72bb75834ab83ec878012c8355abe7ad876a2ef96c630fad84c96f710c1ae2f59613d3c52d38f054667c0d2a9259ba576ca828c9fd632178973386afb6e845c8a2e1e3194de0af1a16a4b04349c9d154a4ca39a3f8d8c4f138249e41d77179a99da09f9e4a73b64041ac16073472fdfa89d1ce7c15946595f0db3f9972484f290a9a91fdffbc3c114eeea4106dd91b89bb5f5f99d01323385ed83d1b5693733a5140b06d832977036e2d03721c7002425845bdff156c3f519d064e1df2873fe72a8375a50c6d5bf290249fa7a4dea6b840f0a6fd5a8536ab3238eea474bf74ced4771158a8c7ba1f32401cb8481bb0fe5d259a16abffea8f8ff1d15b0542122741c32088b7a705e96178daf28379ee9bc3df3ebf3e624962493f6750cf6e82009636c24f15cfdaa8620dbd945875664ce01688cbf318c2500003e9246495a6cbe91a0e0a41399b4d9d6c26509ace35442075ccf188d29dae494da195ae388e3a6c8bb29a1dba574a1130845468714d97f91b879ee28d2768960740bd49d43c94b0c002e93a52e3d07e0a447b26193ebffe2a10ebe0cd518d0221a2b118b3f6c170b0f185780880d7a2f324ae4e207539dbeb167b6b840281de93191ddc5d9afd9ea50838d8c3c64671047c4fad289d5b887889ab42e50731d16cdc1e630742bb263bffa6a56cd445766b26d1f7640f296a4bbac8404307cca0176f0a51f0d8983a0a7560f38095ae39b4f588d0de5ab01f419454c424064854ca8845cd36464300e277180bc74933ff8b15e0d4d47344e9dac182d686a1b4390bbb68b10ad57394f83cd480c4c50510e3c9038f56bd4d061e82b60681ee5fcf9a1c722a4e39c7c01d7ace184b9f2c38c8bfd5bd99682ffe893650c6c0f83178d0064a1bc2ee449e3ef2e71490b473eb80ec1efb95d5c3ccbf35fc755932528351aa6c50b38c9ae5eb58e8fa009b47be9279b5c3fd1bad68b95960841197d52ae062e0c4c865701f26f59ffb419571fc3c056cc86dc3607e4caf2406fd5154c064118a3482dca517d7dc6f6aca2acbeca999a3e5ad0df9cde74b1e9e728791ac3180d9fbe230c5ce73ebc309d457532e1d519a20b491f3c8282cfe2ca6765117c4c92de8c08ff9fd11abd2e5e1b186dcec0372c8ef3d1542a7cfc6a5344b15a56d13b06fbbcf2a8f9d416c98ddfe04d96a5d9f90d8c8e9e575d51b772302c41b3b16b9bc2ee9f198863f8f5ba4cd7603135dbc961cebfb34b473ed4a367666adf2b07e44ab1fcb10d4217441fbabea1eb428bc7045f6f1ea9e8aff9db94971de26ff960e4226aa964e21b8804d5536cdb05ba46acf8689183624aa0ef0465c2b963d1ee809379cbfd6a98831af3dd9d6629e3de56a084277f132b67c17717f385cda1566f9dd9a1daa4def780d35d5827dc0f6ac2639ab78f7f08a480cf18bef0e69e34ffe825884ea2a015fa5c5ad34d1f623f0822e9a15450cc367dd8078bd75b71002969a06734dbc47bf613a4c744006e8aa37e01eae1070041b5a119fc7e0d822e04660b21a16af8c077c59ec97d98f75350bcdbeaa548c3006da4ef08918ab26f16e1f8bb5bb88638a899514e0009573196ffbf510dd0981f02c61c569aafba7f025602aaaf5cbe2c517cef47a219feb00eb44119ba8b2df1109b655f1eeba3c4e84b80acbb2c7b5df040c303f311758e22928fa2ade189f1eb232d4940ac1361d17645ddee7fd893a1095d866e0d461201c08d3562b32ec556b2bbc2fb01db08c671fd1ff9a64d33d082889a0ad53af4d7ac0f02e01fc703a1baa7145e2e9123f903c5a185fe094233cf3bf18521960b11932b412bde418e556843bab311212ae173b6f0c1e11e2192d86b89ebe484df2f7c56215151f96afee4eef2eb1f225af644dc578821727cb4f28e19046c0a0d1be5c1bfa490fccb8ae8478d2bc424df6d34d6dc9ed8387d41702720df1c382c0d44bc3fd423cd4be54281e88a6da4192870c43c1f2eb7fa711fa4442a66543ac4f81e90483fc3b1bc5351c11557552732ebb7ef0f4022ac4d17ad720b3975029daf394684242fe4a03e94421608fecd0e51a0ecaa5d6e82e08485352503305ac470adc8bc90cae9820008abd270a8368871721f487a6c518603b7a5adf1d1111b2fb34196d35286003d19dd652f979e137d79ac4932d541ab2a0fc05855515bf0a132f6d5b1a3d2a21bdba1e6732c65f9d5304853839942e90184c5993db5c4a4a22a86cd323a89becb26a4a6de39b09ee77b798957db5a105c1212514d3470fe412d64979222d99c49e6114b1b7bbcf2a2531f5cded156292d56923e7e673d475040bdfc54c4b6b95bbeff75c686dc8f57d2cb7d496686e896635a38627e83c8de3abc2787f0b4e801ffbfbcf33628e816baed975bf2c60987ea3c6babc4c723c0f9c8cb91514deee9e6947246f573e4c7d773901e0ef79f91796abd65e0d5e732a3dff06a842fb4d2c9d8b8a7629190936c3fcf779fcf36f1451d55ca24194ce40fb5472cfb10cd51c69dd9a17dbb6ea4e1ed34f668e20ddb50a1142bfe01bba81df274a3855aaac96101f9ca0ddff95549483c6ff9abf6960f94b206c1caca4d548acd3f97588806bbf432f73147ea954bbd07f457292bca089de8040a0e69277e07e69a1cc9af124c1ec0318372cb8045ec7a52953c346eb8728acb1e2117f7c85401f322834281cfb982f24af2431b447f5f27ee579185f6e7c6e34579bb27d13f53b894f9fd9933ed8d1318bb06ccda1221af2236f9ef573e7ad68d6309f988a028ff863c275386c425812a24e18a80b07df91b9a316228a92e2da39a3e9f48213cadf61dc25647a16a2141a996a69d755cc458c321aba0c748f666112400d473d4c11617e70765e82832b0869b98528a33ef8ace312d96f3f4d25be8f2c1c66d07dbebfede4169174be0153cbfd9568eaac4f9ba065095786a87e5004f07fc71c085e2f5740698113dcef8f07738ebfed0dd736530d3931dccadcb8b772f68be37aac959a3ce9dff6180941f5ce55665c13324a037185720764f3737eb0030294b91ce519c05f3467e76f8164cb9dbd287e034b6b012f93816d221ad8f9cd68a03c2e3a8ca14bd40d79bdb1842e52e7cd094c7f329efe79e02981def22f01d1117b0650b0e04a2be79ff942c6bc751309fe40f7b7fbade6585f772c617e3c890c2ec07f980b16027a68b46c926bc8f205613c4f1acd35dc9158a4a6b136f745cda0901ea9624cfec022b8f034c55ce20a3b1a3badaefdd5e2602731221807a2ef05c68dfca3c88caeaeced8f973ea59828fc9b50b997d27caab83936ffac0de02e87b25b9e1133f12a90341c7df3917d21fa7ad18eb89f7b300c75f10fd712e6fb217bf36d3be4d8cab614ea644c026ec29e7f087a1e93e19bfd371fc035c519289a1004ba914541b5ff63d786680f7da09139a6397226c705bc6279239afba6c7f53a6416556abe8680eefddefe3795158054039e9c1095d23da86022bc49b07d2abfd97a94574d6626026768b21148068095d7669e8031e242a81582f8597aaf31325312bc2b8c975020743d0e22c9c47846e3c42d65d4bc26580d1ce392f629568d11d74456aa8609ddb3af0d9f72be147300a636c97b0aff027282e449361fb3c3d5f8f26978d09eaddcfd37327684eedda2970b8bc13608a547a473fefa09a2b242cfe106b75ce3c64e6c34cf1c6ca183c19e4fb92e146f50496a4764c443b8e7b2365b7a912454b50b02015d7244a0f66c5bbaa9a50377524a0b11e4a349f3720c2f4ad2e64a749d66aa9ba0eda7194e4bcd391ebc9977855fe2c9cdf41bc630180861a18f308727dcbd0d39b976d37a1dfdf904f77a6a40ed06dcd94738374389027d9018b1943c5b713325dc8b5de53e34db7cf819a55ea2fa52b11b05b2f06f31084fc2a47a1f72d6098df6e66181ceb8d40135120f055587a63e793dc731c3439b83d9ad34d6c234c11b5e368983e17679ed558a5ea7a3ad33d5b9ebe300778ef8b8f578f6e30d7363c82cd9f03e1d780087c4c182d72e0319acec822f2de2a32f24733f57413f6d2e693c7de3ded77e48fed03176d03e7629c68662b9410a68580f98cd4c0ade2e5d113f8d72379e78ac6038525b81ef549b934f85e4714425e6990805ea4f011f7e62088d86b11de93ae990135dfda335ba4d6899d2cecc2c7cd8497f5226b3c59af0264c537de2ee237fdaa594788747be37d35c4755475ddb9647ceb63b2066cd4ffd3500d1c8e023e5a04220b3760b46439330f0f0f0f0f0f0f0f6f4337426a6b9f908494a454aa976679010b644a29c99492d81dbc0b9c99f87466e2d31546ea6e34e301030b400bd30a89305b754ea153cc4f17311a1a68000d2d6854c0c3c3c3c38bbc0c801a6220c214d28388d6a39e7fa625c4388441e5edce5e2284ea63058d011b39ba7880214c3a9430d9298b440b63214c21c78b914df249fe104218b465c813f91f15620cc21871e5d6434b9e902208e3440b19a91e545479a2102310264f59952647c8881a157284188030a5e777f438191b6b016084187f30968e74f988efb9a75363edc3c647c12d4b31fc6076b7083243e465059386161e1e5588d1077357fef6f47137b6f3c1246eb35ebf9237ddefa26b68c06fd898c0923d186de28afa0e1d3d18e5524823aa3a7f3a711ecc5f174b955267a972120f8697a4b4aca5548086062440e3430b1ced12c891000b2851438c3b986ad27c74ad38f91b362002e50a31ec60be0c7df524667bb5af83792dced6c4fa09da6e3a986e5baf64752ef5e139183ce54ccb19a24a29530e26a13e57b8a89e9519d6588b83f14a456cb56ec2292538184ef6d8c9d0918488a637e8337975ebd52f23c70d068ba6bba5847e25f3b4c1782a629b087a7ad5c26c3089f59c82129d3c8851d7b09af89d69d3fbfb5d0dc6d1f62762470e252d4d83316757528ea8f360123418f542e3924e6a44fcc81990e79e7592d8f0dd88194c9fafebc329b7951896c134e23e23f4d998fa6430bd560e39a29ab0a4d9180cf2246987284292490cc69ff9d4ad94264cbe6aac1962848131b7d9ae20536c3430587a3cfe09791771fc4272a23de2880929cfc70bac96e87069d927e98241e9d349674cdc0575e242a272ac3d2f919152bd05decf52e447e9f4c1d58229e72454dae4f24ad5c982c94212972fe88d05632491b3d1174a4551b942fa4b5e9f1a1d4f3c620593aafcdb1dea296787ab7067cb13dbd46a6255a86052e6de267ddd4444740c31a660c48e14d192429784670d0f69267f4761d7125365924b5ff250307b2425df15c2ab3e9e438c2798cebc4dc6e52427182d8f7c87f2fc155d9b9078710fa1cc4c2618c4b6044942924b583ca565c7d2217fca9460b6317defb0d57f214930f68dca496adb87f00e09c6f8ddf3aaba54b61ec1d319b135ce74881ac1b8af27c1be6e2c9f72885104e34a34a14f45869e1e11c1f41971d72dd4ef538660505921e5e715e517662198aeb346eaa80ad2471b0483e855f79c4a6dafac4030999950b9206db573f20786f7efec4e7af744f6d00d317c9068a6965ddd0373b6c41c939397fb82789007af3e53a24f9c24edc024277c56ba206f92b6bbd8a26f241d982aabd675f47091d29203c385e7eb087bed220eec0992b642527cd9788353fc38ba446f820ef2183630ba6e8b6e0fdb298aceb521460d887f49f4d7280f950662d0c02ce6e13cae598ae4a1b121c60c8c5e3aa5a81246eeb8be8618323069cefde76f856889c5ba9f53d8cfb8d2aec1c254276ef73aebe597e91546fdb4edca31b57923572073ca9369bf4a2b0ce7a3d4bdc8c6fdafac30dba7baec905ff2bd5d85c1e444e5e6fcc83cb9c69aab1960a8a2ce761792852429684f2accf196653997fa4d1f15261d523855d7317e3a790a5418cd4ea2744c5863ad057e820fbe1b3672743185b13b6591f11c23966534b4a0d1821c5ea0c07451011a5ab4e0867f71011a5ad0f02fb8680ed0d082c69db5c02340430b1a76c39d8bf3850d2df3a251f05186c3bd68418e2c85414f7a0f8b2426297b5218d56cd4a8f4f1f6b98fc26c71d2cf88c5eed35714c6d1e965fdc36fe49ba130cfbc8f288f7b8b2c0185617f3b4be7fe2cefdf270c2e4946d0155a3ea25d066078c2a04694e5ed59d7fabf138614f22c56a8958afbd4d80d745181b3829c30870d911e72e6dfb29cb809e39c271d99a142de4713c60a7af1223444ae8533611049c5fbe69e4bae0f26cc79c5de7b74ec10a2a55cc214b45c4d9f92aa22644b98d46595136182ead866f2004625d491cfcfbb1682caa2008312e6a0ad2797ee5b93e1f8c8f3008c49186553c4055d59e46449560086244c1529ec8e55d808ebdcb8617608302261aaca9ef8b521b2eef187106040c21ce36e73278b47109700c6234c6d415f0e42bba9578405301c61d8b7aa2ecfb7b0145463edc373d8e8e24e05301a81d0191e3e6444790306238c713f62d1e43efdeb35d63e10522f602cc2544ae26e9b84a4425a6aacdd5084a954764cf86c3fe67101231126b566592e665c46b4cb4c000311066d912da851fe41a4d3210c7f61db43caa5b9681bc29ce467e498a51121a51026e5392e9f449810061d134a790ae141982508f5385721447a2c087329ebef2f5526e60f8439ce6ea464656af2640161b69446be8d8a21e4db3f987d62593c6bedec52fac164f7df69fb631f4c29ee6e65adff50b3f1c16049eb6666df8331458ed029b2249f5735d672b4e0468eb5ced10bf0e223c905400c30f460bcb4f1faa542ce53aac6da471d0d0d34600b30f2600a6982a4b82e5539b45c808107f3e81e93b318dec1a4646858588a4e96658db5b230ec608e26579b3ee26bfe5263ed830d07a30047af200130ea60103bc23f8556eef5c3737c617e18061dcca924a54fd2f75ba489e760d64939b722bf65cfa68f3b030c399844d8a9a0ff63df851e0783a58689a7541bfe4170308e507955fa6358f5fd06931033ea6bb47583f1d37376b8d5aff8691b0c1adace3e87f8b922369882fa4cf652daf4e49035183f2d98fb051d6f92d460887339fc7327b17f8d8b56810d143806baa8000d2d380dc6d02222d553f5ee99ae00030da60cfbf57af7703eca3318b7be26ee8752224c806106f359678b37eea9457b30ca60f2cad24946844f8da700830c067517ed83b4fe1ba53406e35ad871cbd7e3b29be50186188c5a5b37bbb67d9d3d6130a7883fda42ae99f6d100030ca6b3b00b914275ea60d6ad01c6174c9d5444af9b8100c30b86f43b97bffd9e7459140230ba60ead4157ac7cc264b8ad987a11c6070c16cdd162752f27a1bf9ecc3181030b6609049317a1e52d809920f3336c0d08229291d26ce8fc9979033fb30b5d2038c2c98f7e2f3558a8afee75830a8591ecb3d59bd3aba82f9564b7b5cefaaf3b582e9b7a3e413d23e29bd55c1f4c9b28856bb5890142a9854e764a53fbedbea3b05534d2c7d77aae2e7775230a9a06137d2ac24465214cc7d1a298d2c75d9520e0a062d93b297d095ad84fb0473cdbfa5abb658eed209c6d5b4504ae57cf6779a601a6d61ff45878ffa2513cc6992b07fff8ba054b40453ec0bd3d6ad3fd7394a30789add480bffd22d4a8239e8a860fb5fc94bad483089bb9f117942749b0fc6114c49d99a488bb011cc11840a2a87d1cfdeba08e6ad6c6a3f4b53438f4430682f11b211f3b22f3f028c21984bece28afc8a259df6f0281f8607430826ed4eb1743e136f97140473bea978d6ecd68d05046377f5886b7a7779f903c3488ab964a13a9f181d0e183e30d75d075d6e32ebb33d30a8b9a43d7479903d2e0fcc155ad41d988358499ae02af945d68131e4c73ebb49c2c4e57360743b717eee57a16aa3a1c58729da62cb60e0c03c16225cccc98c8ad40dcc1f44880525f46f5ad60626fd172d47dc9aeceed6c0702a3e8a4eb942be80410393b4483fc2d7e4251d9d81712b23a7bbd58fd41d18323005a97dff932a8ec9321646d3f2380f23a2bb25b0305df06afbbbecc9f4fb0ac39f4732f3d167b1a72b4c62a284dc5e893551d28286161690000d6d81005a6148fadada644c92159b5ab10b08801546133af5abd492d72cf00f1b393ef05620805598c2da6ee7d3a810376320005518e4e7be3ecd5f68130502488529ed2911adb40987aba09d8b0f1514c31b282801a0c294ee84ae4bcb97eb2fd2028f403985c9c427ff298b98c26057396e9696ecd1430194c2204566e6ff7bc8be202408801426f7bc6769a476d2e6e8628b1a450b0f8f519852f8879265f7a62ca6111e672887243dfc2e5f7c7461833b8ad0610643d075973fa67a8f9a40e828c32a2a3ce928a24e7e51e82003ee5f5e9d25954612133ac65072bb2f31cdd0b30b5c4287188ebb9611cf7f346ec1f9280b833945131efaf24608dae90083214938713af79c599a5f3086e917ada2aae7c4e4dbb9282fe8f082e15bc4bd54e42e186f74ce695ebac73fc905d3e4169973514af6f45174d0b105939294f522df4d9cc65a3098ce2945c991d4a0230ba634f12a4b92e4ce6663c114f428a56c47f44b7e35d6cc6868a0010ea0a10109d0f0f09041c7158c3a493c699153b357a264830225d9e8a2eca4a500083e0cd0610573a4ac9491a89d26710f0f5e0a80e003004ee8a8824175ca972e6fc99354d5584bbbe139fc861766aa800e2a18640979f398e421775330a470175b17b4e335cd8f0e29184777ac185636f3f9d482060768584002343aa260f41c6f25c5fd8ad599066868416303342c20011a1d502874864861fccc3f5d634d058e010f0f15f80db41b39bcc043c7138cdf5f51527f36d52d7e31812e18e0e1e1e18163071d4e309c502297969610c4af8e269844926a0f777e6a7eac4da18309e6642a590ea1b53721a9c6dadbf8e0251872a86441f95a12d26a724a30ce4fda14f14f27d54c82797420c1f82bea25071d9f4ec5fad071044350cf11092a4a90df8d604ed1a5478f96fbe6a4a308a6ce26259d8aa076f5c2367410c1e861c4e517216774ea5e740cc11442cea3152d76ca2d4bd02104934a95e6d564769c488d0e1d4130c7121533b2e59ce3b36573e80082b12ac6071ff57ac2439258213a7e608a9d8492d9fe8a7caad436b8f0f020f6611b880e1f18d447f47fc7fa5356730f0ce2a942a57c499bafc63c3047c822c67284a9b2c80ecc29fbe46025569e832e9fd0a103b3e7fc1232faa774e7e4c01cf793f3466a383084dcc93a25f5ff0df50d4ca9ca7476dc49133a6c60b29bd1f7afb14b538aa1a306660f22f9626db8458e7ea18306e6206b92a3ed857ee5ac858e1918420a7bd723c553493a6460d0f5c1f452ca1efb7d2c0cefb13be446fc8bc8c2c214b73d6ae7707e2987bcc27841ee5225a929617b579872aa3d15272e88e7a915e6d6cf9654e58ffb5cb3c21037437755ffa2e4945598ca3ebf8f885615a6cd946839e59c0f6aa258c82215a6cbbcb99c13ef0a59a0c274ebf6e154485b3e39a730c7ca4a4a23ec1b3958604c61f0109552ca1f254afea5308ff04ff18d70fe1eaab19611c88214a6109479ce3e7d7a71bf1b4116a330e58e7b1a4134925b4a8d355118c54f951eb57f2af13d01b2c1c586c270e2262d9bb4acd0528db58f0485215e4acac38ea8c6da65208b4f18546d3dcd495acff2d558bb40169e3065ae97764f1225bcacb1c614c8a21346fd9113ec52a6fd7d1865c1095359fc4fe2d69ddb6235d69c8bd37622c86213a65431d789fb6ec9ae1aab09e3ed44f5b62dd3fba61a6ba90b1ba78b2f361326bf8a1f275d5f5ca45a70234762c26041a50b2b571344446aacb5e0460eb2812c2e61fa9c3e2e2ad5d60879324b98455987b058c23ec4a2812c2a6108b2697fa6b273ccd696035950c22074ec7394093126ea933086850bd1ba6a24ae92306beaa591266143422261bcb738a2539daac41224cca2428c70df0f6a52e711a6ab18177cf257bec91106d331e4771aedf183dd0893f214e18410c16cd28c30e78f9dae5f21f5b96511e65329fb9cc9274f9e2ac238ee3da3edb7f2fc441862a7a0ec65e554658908c366cdac8dc9da499243982cce9ccd07194bdd19c2b0ef49cbe6c2e4d9ad1006d51ac22d564ce6a93c3c70b8172dc8714701107c0400085910c214a367e4d6764b8a21b40fbb2c0661bc783d31fa395996bc200c49de09f123b1cc4e0d8461ce65948e8a1ff40f0863a898dc172d79c59559fcc1fc1366accc52fe3c310b3f185fd2986f044bd9c9f7c1105b2f2595a4d3635e0f0f3164c107b3af873455d11e4c41c8d1f1e446bf4bab078369dddffd8fe855963c184eb52b5be8feed13c18361bbf3fa95f60ee6ca932d9cecb0371766610753aa121242aace33f70c1059d4c1d439e88837fbe5a9743a1826c6554ab24d5cead11c8c6f66a3abd255e4242407d39aa5aca7a7d42774e2605c0f7796173a7030ae99d9870bf274c4ce1b4c25cbb446abf55da5dd602c714b4145a9ba384b1b0c1bdb299dc50a1bcced3b22ffd55e94145d83b14ee48aa74feab35435183f452a593339c8b7d360cc095ff91192a48b241a4cf9447eca10e6198c6ddaaf636c9abf04cd608aee22eb352c9a50aa2a64510693ba1b212f7e4f0653ccb17062d26ca6c8c76036212df34b2589c17429a87e1ded15742585c190d3d6efa4ead494243098b33e77309bcf174cd9c4a28a27715e757bc190824a3255933f7ba574c1ec7f9def42902729cb5c30968e6f2642b21ecf780b86a81f2584b0ea13e3d582694dad72fcceaa77370b463951a5f379b29b5ab1601cd5599613a24d4af30aa6b0fd59478d6905934cf68f3b4a8ee79454c1b835794d7627557d122a98ceab3f2b9a369192640aa63d75bd5f4ac63d77523056866817f92267b68bc2b1c32585d1eba0603cad94ee53e8cc0bb227183e4e9e30fa932cf79813b4b2cf394284ad09c66d131e572a74d29d09269d3e2c89c6e5d32fc1b027df4dbd64cd1229c12446477f3ea1524c4b12cca9a76a5fb3c2642498365436cbda826b5716904216473075e990f354e794e36a239846082d22d4cbcd7f8a60d056ada0e324f5e7b03040430b1a75011a1690000d2ebc40c1166a4430afa7d8b6cfebaa1492c30607ee3e90c5108c3732d64dc7ee3295f5f01082498e65af74a3ab1e4e48c82208c68cd1d9a16a9ea51d0f0f0058210b2018eed273ec4bf331e12106b2f881219ad6aca4e2f4f42a3e30778970abafb6d037d758c3f1e1c517391cc771163d3077deceb58dce4ab68d1c669b050f4ce13f7f6d9b8b0ed9da813925fd6b5e39393e6f4ac84207a6246e23f3126543c63930e851973c6f527d4bd60b59e0c064f5a542b05c69a7a31b18b4424f87da883a216f210b1b98438e962bfa05a5b4493c90450dccdf9d45c4cef7d1b28d42163430880ba7d353d6f0ad9c8442163330c44b5de92da84f56a2608b1b5e98690bb2908131c3b5d4d743462ad5be102316a620d1935cb45426b65b2ec480854925c7d3f5ab6b4ac5f415860b2a26bab64711f95d61cacd4a4a08f1126df256182396f8925e49cd66b816831506959c4e091d4ebfa4508d3557c1163752a22ebe78d2858d2db640018e5e0189b10ab3255dd3adf5d5afcb3eec0f315461ba3c2b39ba92f2a7570b1a34b4a0a1050d2d68380a9a021e1e681f568718a930867c864ef19239f10dff40157cd8c8f171e3867f78d12858bb618018a8307f2775dac6235e7ec8294ca2d627a414e6bd448708314c618813d383e4b7fc214f928518a530a88dacc84ff13c7c0e298ceb4195cf8fdd859895e9284cfea984509d5fc4a5105198a49afe05a11e4e3ccf408c50985c4b948c999d94da9a82c21c44d0cad974fc42d0ca270cda542cff7896212fa29e30c514d33457b7c61a0bbee80f1c5be017313a71c8a6ad478f87306d08313861cc104965dc566aacbd9f0b000e626cc23cbaaccf36de1aeb802e2ae0e161ae88a10963eca7c8eecec494adc69a2f51c19503c4c88429eb7b4ae1930af3c13a25c4c084b13be7e87ac1930c317b78e4c0b105171e1e1f312e61d4f6bb0a8babae33046258c2786f229ef77fc66a8f5109b39a9a4e5ac3ccbc932861d0e72762446848b10b8e2d100bdc930d0a4cc210627f98999af02177bab0b1c547310ec4908461562b89bc7d593ad901312261300db38ed725499bb68504562161160f13df7212de1344ec1e508256805a0e1c5b70413a10e311a6bc2345655bc8b11c2a00f010c311c61f75df31ae5de72a1f311a6150dfeb104ae9deab1703311861fe523e267f2b4a387b11a6ee7c29fdc65c6dcd0f1c5b281b6228c2a49f133f8450d7d93e0163b06b542449d1830c311823a41c429a2d7d1f2936920d1961309d460e22d7c608e1078e2dccc820030ce6141d11f4b94ef81a71f105938c116df11452e507820c2f18fbeed674f67f4f3b5d156474c138f21e724bbbc3f7cc05639cf7288b2d5241c6164c414372f658bb5acb6ac1706739548a3769cb436464c1b43d49697dcfb7a17a1958308f34ede929ea46907105e39c1c5da645a78ecd56307c96be28afff6cc184b6c8d1393290041955c827b5d5cdfc766190410563ffc80e1d65259ca59ce046a3c06f988c2998d74cf252302421dac3bccf838a7714cc637fb1f6c2733e8f0d20030a86744a6a990433e1697f8239ccc5eb15a1ca3b742798723aa19d3dcb92ce5213cc7d715c46a911b1549860b48ab5adeb4b1eb46709c6ff5db7121f3c5ebc4a30e7d332d5ac78398ff20b2f92606ecf2d39c6073569511948309e8e246549e49bbf1a20e308a68b37799b2ef2846f04e36f4bfe2c7f8b6711ccffb13e92ea49189d08269d3121f2c63f04839c5d8a13a24230574e9ffbd485ad6406c1a0276a9927395a8940306d9747f8c85eeafc812927a1b4cec49095d8fbc06413a4a48b1727e1ef81219dcd5dbe9ede34f1c0785abd25f72ca47c7660d8fdfe55af9589b60e0c96a735442cadbf951c18e4ab465c9771604a29172e37b981a9cf45b72d5be77236305a4842a5ebce6b60aabbb3b3f78ff697cba081e9f63c47ca5f19e272193330859a9d9e58c182da65c8c06842627c7e512c0a69a74aecd30916862065724e69a7571873d5b63582d29bbf2b8cabd7a9b5a6e4b8a91506a5ea2fc590eb131756989359a7ca4dd6d3d9559824971e95f2f9a4e0aac294525a8b7ab721ac4d8551542f5c695d2935418539dae81021a354c7083a85c9545a5c9e780c292253985b2624a16c4f98cea15298f2670f2aa69228f9218571ad757f3b72eedca3309f49cb232f8bc2581d3af2e321556c4361bed355ca666ebfce939fc87e9e13b3f309c3856cb933e2d7f9c713a620d16f27db9d30f78ccae1479eb4b339611c3f933549ba095376bf2d9de029775213a648e17c6e24ebca9809b3cc5c7a8753553a870973d4eaa4bb737d0973c8a7ce5a2679b4ad2d61ce96ee44c5889c9b75254c7b41b99d122bb25953829cd47d98e92761cafe9096462d4f58256110d671a2e935ad279648182bc951dbda175b59818441ebe8d121afe7cbfe11e638aa6639976fbec511e6942645e5c4c8e26a238c9246a5b1b29326228c305f2e616245a87b087911865827743eed5811e68bebd039f57d3e281106af78ed517911612e4bfd126631b6c73d8439480c15a1d22d4eb88630453c3121d9a38414dc42984c77c87b77a5d7c32584a9e4984ad162e5e4dc0ec2143a65975feb69782b08e3e7efa7916d0361cad0102994a97aef0161d0b19444134a5abdfe07e3cec4cb0e29723ec90f66391d7eef7592eeba0fc60b25d5bc2f760a5a3e187e2e74a5e0374a64750f6611a52d29554e4f52d583c1c7bc52ce97e6c16012827e7d13d5764a3c18fd4556843e1d3f72f20ee61aa5ef2ccd6907e3e98513b93baad696753097ee7ca53da659793a18b4a50a573274b2d8cfc1ac716159576ff1477230d7249b5119119205c5c168a64ca8fcb1a363070e86fbb871153335b6bec1f8c1e3578a923b65d50da65c7a674ae9ae0a4ad20643caf993bd7472b6246c30ad5bb8e59b4ee126640de69a942729495e0de65441271db75fe43f9206530e42a913d16bdb7244835135d3eb3ad8095bf10c8637a1bbbd3da2f58666309bb4d116452b8341a8532989d1cb7e2a2483c1cbd446b8f14aed8fc1bcd75eb27ff296c4c560d24baea5544da91c0a83b92be8d23679bd94c0601ad393e2cdb466eb2f9845ad83c872ab1cd50be62de91ff183e75eba601053ad8b13b96098a0a4e54bb9db82415bdcee24cf23f93a2d18f5ec27dd5e9705d3e44fada15d39873c164c5db2464e5e8d35f915cc296f217dac3d9492158cfa15b154073597ee2a98e6d449b5f8ad242e5430b7685321f2650a06bd9552ca69a1cf220573300f3337d9a260b0f568d95c8382d962786544b9f330da134c41c48f7d2a6d04cb9913ccde25545b5049c653d60443d637cfbf9ebd6f6782c97eb4ab5eec4e3f5982e9edcb7427794ac98812cc27d62992b44f72912418336d6fd5ec73f61009261521a84d2b1dc13c5acc549424a22719c16ca67eafcbdd4254044390977366d224c98c08061d41ac7efcda11a91a8239e6c4ea24a2e71195178221659985e510776196060c2008e6fdcea346628dfd2801c15c39e4fa32747ed07d095d42dfd828aff8c0246fe16ff969db43ac0703e8814196840927c663a97d82ce417630001eb8225a3d5ef54d773430801d68413582ba3ef5531778662e18800ecc152c7f0ab2b4f7d44bc630801c1854687c9e5c153d49968401e0c060276458fefd907be1220ce006a5a553594e8c906766060660039365b913ff3c9e44258930801a18238e4cb83c5e0106400383b6163f378b1eb4245be011c0f5a251d00511c2006660f814b157d953ae08fb00646098d892b3e85d64b13716e652da7c929cbd4ab1030b738510c2bbea5252b3fc6f91f6bae315e6385b11827b52f1f3b7f3b000d0a0c315469dd176399c9599b66ed8c0f131015c0f74b4c2a04ce850b245e67b973a58619e1ba533f12ec9885b598549479f12c24e52d05176a14315a66842c768951f9dac4d854962a90baf734ad829e585a10315e42c3eda6ada276d5c1a10011a5ad0708087470bfc0486868e5318d2861a5f516df9c46f0a73e84fe91e762d8579cf65ec53ae3c499f5ce8208561a4f5a5edbc7aa98238bcd822070e2fb6c8310ab3e9edeb1055e31f3f36d217386ca42f7088c2f09f3b848e3bcac1c51625c8c1c516250885d9b3529061a7ce521a14a65425b98298c849253f61dcb1742aa9cb4a2192c40a1d9e30ae6556d76aa5147fd40953ecee70499b862ccb55a18313a64b6da9fb713d04d111063c3cd00d12746cc22827a731c2df83ce1a0f0fe42cf0227468c2149a963aeced99484c18ae3ae4ab8aa2924aacb1f6710963f5966ecd975029a325cca6e47ad2a66b47e95f09730cd36952ca497815d558434a943aaec4728667cb4551cb4fea63b44e5de77f564e051d93309879b614725ee949649230e812b2fa431821b1bb8c844977c88927c47dd01ff6a00312c611b1b3b7a542627798071d5af8cd9fb7c311c6399d45ed9aaf97bd1d8d30fb8cc821653f31c290e298bc93ba16473bad60e8588421a94b48563271f72b1d8a30c7b3fc20b612ce4247228c1d45f4e6a868a3bbef408471648a3839d96bd9e24a42c7210c3f5252929b9763fa39011a5a78785c87210c9ee22eff25154eda1d8530bf5e24ed22272f84141a5a94a183100629a3a346ec5bcad5a20047afc0c30305387a056410c69c18395cfecaa7a60bc22841b74cfef4d1d080046804c2ace2b936449dd5870410a6ce1dd15ab1c6d5f407d3c8fe68932bc70fe61479da4542fa60ec0fdda253ed7c307827a184b49c4e5edb7b30c90cdd2e916b7e62ebc174f9913b87388d3cca3c184fdcc9951362c2e50c0fe6dc503a6cab750753a40bea2145b285f8d9c1ec21ea46f588141d3b753005a9262aa2891d7430d8c955cea542e660d4d3d972b59a6e179283219e69b7bf98f99cd7389827ce5d7b4a952d7fdc0107a3f587d0e9fbeb7883d15484f82f67ca725248e87083a9b3b9c90921049316521d6d306b4891756a724e1c42071b8c23f4b9a4fecdfd0ad0b10673be7b48296adea7c4c343081d6a30da450e56b9fbc34b5a63cd16e0e19106537ebdcf16561ae72b1acc957209f510cf3f6ed6582b868b2f7038063c024320c0118c1dce577eb535ac7335d60a4d312010c008e6740bd1907d93f6322305018a70acdf9b134135d66a060420827962c65c14496241da359653172671f1858d1a19f0f050f3d3c7120438a4d1129773dcf25e40002130d97ce7b2778a1408100453c4c9aaa7957b963c35d63e706c0104536ddaa6c80b277bb25c70f1c59fa96941801f3cfa6dd573f09c6404475a00f5cb81003e58b4859121ba3dc90e6d81a38b2d6e786a77400e82003d30083d96a654fdae530a1608c003e3a57e1aa154ce65fadf81c94d52c8d949d781396c7c85b86f93accd81d192d01b42c6a4981207c648f941282182b211961b18dd2dc6842023cdc93420800dcc791d22972c754ab849011e1e384a170850037396c7fbe42b42bf9b6860b0da89faa193e9f119025120c00c8cd9a7eb525b3dbe3402c8c09456d2c5504ad5079dcd8885416b4cb58734a977e219b028686f31939fa4bbaf4862c7965ac4b4f60a2965862b4c25f94cac3a74098b7e71c38b3b2d683c400b0f8f1b284001eb0f66b4c2f82571acebc4f6c7ae3061062bcc15752429d5a37b3f5aab30e5709e52b2bce7742f0933546130ad8ff73948b7a4c244c28c5498f75dc38490ab919e438419a830887deed02927a475afc6da47b261a3041f38ba066f91805232cc3885299b8821c26e5e3efd1a6be8c3b9485d740db4a1811c5b24bfa18587070540f0118055cc3085b94d564e720a95752a2508334a61906b5a5a1f7e56749881308314062df1bf54e5745d4af72fb8680e8cc2e0b1bb4327468a284cf1f65772b04fa1e357426150e2f4e99fb662300314a63065a1174f277ebe19f88451c6434fcd44519d843c61566f730d99e3cee884a93c5aa4582a48eaf2ac31274c17c73fd207314956ca26cc9dc27c5d8eb6260c3f6e41e57abd9f0433615a7f397539ed56ce1f264ca523a83c9d439f50e94b9854c6b8664d48726fb18429a730e51bebae61d14a183e68d16e71d348caabb1f6c10517fdb11f357278e18905332861b034361e33cf547d28d38c4918c485e420fcd4b6fe481286b5fa8c74fa481845a724f14cc84bd69119903049ed097f2ab47a9a6bc6238c59fa51aebb43f423331c611e376634228dab8f90bd749fb6c61ad96206238e9e949794d1293fc48b22331661d2f0d1c82ade9e29a24b6a62673b2dcab22bcc48844124c49b0da12d9de820c224fa41c49ed8ea0ef321cc21c4eab54a13dc3f8630c4cbfec82ba33aa46c214c6ace62d5fb87ff132184494e777bc8f191a3c8660cc210d4098f587922fea28d98210853e8f5f8c17357ce1c91dbc38c4098b48ce714237eefc68285198030e77fd3d5bc325d769236ccf883e95a457c7ffc770b397e30a62761f1473c7f64990d33fa60d6dd970f337a3e98c7a45c9e442d0d33f66010aea53c6bdbde776f01175e78d1650333f4606e13af1fff5973d619c18c3c9c2b54e9cb18dfc030030fa694ee1e543813415dbc83b1b453e70e9f676a5a543b98e5834417651e4f82e4f20e33ea609891d5ad20f3437b8c0ec64fe95325516225a56c0ea69ce3277a2521621e948339bcf7a99b7822c8ea92e461461c8cfefb123cd672bfc739cc80834967ad9cbbbbc68bf4e30c33de6090ba1ecdde34bb196e30674b2929a5f4a53af56a6983c1e44d8f7eaf173d6283a9e3e547ec3416ee396b30f5e82aaf48a5238d5a0d268b1fd352750d6d350d06b127d4d5040d0d660fb338a9973f652d04cc38c30c3318923e09162b46cee69d32185b82969482d0ea53693298743cb9fa57650ce6d8ad11f546e66973c56050ad7c51e24388d96130a5759ff0b62518f0ed9359f51232e30be6f7d98a97e45dde0fa9c20c2f98438ee36d2945081eda195d309a1097c9e15752fde68249bc24b595976405af6cc130b952c5113bd24ab45d70266668c160a2257e4e938967264f624616cc9b577e73dab31f52f81133b060b6d2f37e21be2e9a0d1b37881633ae7045b2deaaad9067d5580fd7c2bf7174b1013531ccb082d9459e4ade39fe96622412985105c3d749f556b1e449785430078b71b361af12664cc160da258267b887ba902fcc90825154e5d55139a419a5ce8882e146aa8d6da90e95d70c2898f7edf4c7c64497bf673cc174419fe9a0ea7f37c6194e308c9ae751e1cc53ec74130ceb26f6d7a2a9347799607ed32df12f397ef2dc8c2598cf530e167b7a12523843090613d367128c3aea3c7f98f03f2b418229ce4d90f5249a71046368b5af390bd2427f8c60ace4d9a9ae7253f45904f38f989f50a7afa31f36127f31830886e855317b524b3afd0fc1204baa8948faa6d46f2118a4e4594f25bb73c26843051f36d2e69811049376f80f6159cbb72540306957123331e5a5c4f603c38b49d28bab3835a98fd445670e66f8c028294e6be59ce6b39e7a60d059462387d1f4d12e0f0cd73a314bed8a4e4ed948773698b103f39f8e45d62b91b4bd3a3049d9bdd0c9ddea7fcd81415d794ed73d75ea331c184e828c982af777756f6010bb11271baa849cd00606f3db53e9f35ba5e86aac7dd8486506336a60320b0f6926b95a142d0d4c6aae22da08f5fce799310383eeb0ac9c77a13b5f3364601259fd2c87285af9cc5818bc732e1fd7de6ef5790d3260610e336184901ecb40c62b4cb51a6af53f25774bb36980d440862bcce1d923495e6798c4c8b6c2f4162dc952ff64a6a2066e68218315a6decbf5679ea6626833a0058d08d4c0d10ee0f3a25180850220f878808c5518649f24990f931a6bfa0719aa307eb07c75a227e1625f63ad0aa981a36b905418dcde372ec70e16b373c3c6ef7d51010f8f1a38da013570740d09f8163734208174c3e3865742062acca2557a45c9ca2c55d758ebc286c93885d9920841a514bf7462de43c830852958b63f616b6ed9ef52987bb393474ba9d4682e831406e9177ca2ac6d895491310a43eaa0b46acd9808f9230219a23028eb683149e8b32482a130dfc5ea4f3c29aab2ffa10419a030041b4941ded7d3e4e41326eded53ffd6371bb9278c92fd846a9b14d13ea9138611caca7276b9cb71e38449e4544984d39d4d94d3bd7388b264d5adba0c4d182fe4c497efece51241cd8439f6e9a03bdba6cb24e5c9c084b92ce7afec98923c65370d322e61f034d244551239794e3901f21a5ae04186250c415b2bcb8b76391369250c7a4f9ed74bb4d0e651c298a15ea2a85c8892a449983bdeaafd841589b949c2a4567e31c5437b1991309fc895b311ae23d117820c48184b5cc9d1e6e31e43081f619c147bbb43a538c21467fc83887b712bc55690d108a3e58ab6f9113a5e486284a93a8c2ab91c3ac8b86f0a321661c86ef292ac07f3b858086428c2242c94fc7c0a41fd53321261b820395775fa3071224106228c1727e976bcec9e2dafb156ba90710893c5d0115e2d5d3ccb8d761c1f072d20c310c64e592f7a59b6c46cb990510873c81d2689d029abc70961f8339dd5889eab84103918c81884b1439cd50fe5b1c2bd9a2a9021088396edcbba957e3ccc390619813029b1772d3934d34c650908a3e8ac9dd35a589c5f760b32fe604a26f258a7dbfc60aa0f594aff6ca873530b32fa60c8dad1d2980ef3c1202c8eea76d0f649d92bc8d883e1e36513225c8a5631f221430f26257f2e6c6e555b8c0332f260cef693e38308614cecd9041978305ed6f3964b09a2fdc30419773029bbbf102c9a0aca4576300839313546e6a9520b7274f1059aae40461d4c215a58cde94ff16cd3c12444ecadea8fde1964ccc1a0bba154a7c98a8fca0153461ccc167496cfeddde229d37c830c38987b25560ad59fb3dcf806e3b9beaec7d3718351444e7a4433de93966d30d74f7a75ef9c9316b1c041061bcca2f4baa9f5f7e764ca32c858833174e4cfe78e3ce2924e95c544728f3a4a83597d3f9dbd550e6a3b1a8c9a753a9728ff0cbdcf600a71d1d76fa10bc8308339766ad3dff1fdf288cb601a3917226ad4ba332383e1e4255987ec1faedf1a6b1f3612a640468d87a8449165d2581c0a8542a130280c8360f97514c3130000000c1e144763f1589e29bbb20114000442343056343c1a261e141c180d04e3703014068403623028100883c1a04028748ea6700c8b0f2515e935d557e99e1353aeb200d9fcc6754ce80c44c8119e6eca14f2955f0f1c331dc4d506d130fd1664da9c86913a19b432400ec18bb911457805b235891c4adeb651768091eab5d77e70eb293d81c4e3c2663444d433d431c64abd4c5e2ac4d1c74d6a65fd83cc3375796e80d929b7b27a360695d2efaa2e71a4927e3b85bf4b25079595fbd2e12d5ce34315756e9604bdbcf2447447949e31e3d015327d4ce6ff8eec4b19a3a68e3a2824240fec1a0c4a29cd8fb6e60e69df702c238fdf5a221c2e4854653009cfbb492309094f03eaf9fe9a44aef6c32dd154193276cd51fd88a713bc8bbb72614d62280f0dcb61821b33646137b0ed5c93179a1cec5d49039ba3d9b0fda804b3e9f375fff67495c531f413d2479b2969aceb4e308b44c3595f73e813bb039d68c5d33d15d074468af96cdc2007853353c5e872a516d2328d89ebea6ff34492bfb54746e9263e4f46a88595c6eb656166e4b4ff48995183760f133699db9bd3f91713e84bb02dc6f0280d3e028b4cb443aae45f1c59f868e386af9883444a0c3313163316ca65789f5ea051f15275dba98b19f039901ed51a26979dcee3cc0057f7ce0115f98c7c50561c4c70dd3a131d688e4dc0c8dbf95b9318d566b8c1a7f13a1820aad3e997bddc246f0501819d6dbe2124d360abe4e6f8b9d368b0e6c9650340fa75193d3f6165c390a5645f63a4630ccf23d0e988b646e2c50832237d45d706f09fd133460c2820c85317b4b310e3f2236f200911d6195baf9b946e95aec8046f4bc1f070cb369f9d994f47d747526de2682ce100b47127ff8a3d2a827fdb6947e9232edde09dc9d118655613024789b870a8c4c4a9023cfda92f006b7e5c2e9d26fce8d3531917d86936c09666eeb5d85105f5d96a1285d0cdc6088b5a9ce6545550fc62a55a82a94c5285fea0553886d36acb8394807da585bc695904589de91399533c582c41d09282f086e43284ed66f127a2d58407d58c66b9c3921c44d3fcd24a15ae568a5ebe6f550257005784a41641645c8feea284388cb28047a9670165e2f8fb11a03a18ace39a114bd716a330bd6276af016d6933466fd716a0dcb83e56b4553be0fa08563cc701c9322b365491d6fe6e067f4ba7832e5027bb66a42fbf982ccc6768fc7dc748ef8e74372037cd9c2e33969a5a8ba4340cca6fee1aac57efee90f26fbc8d5fed521609bde34a2c38edbe02fea1995c710f46cd8926f3ee054665cdef666013642696a1346dce3d9b935fa5dd876d522b5059bc58d8f7019d0b133494c18577e1ade092c4b7e1b12250b93e882fcc097e2ae27503b3d2c0545f0c15adc5328f93e951e631230d6579f7ee5aa358ed8e6ebb9f50ef288a543c45723ff414f08891a6362b4a7c585477a951373813a589b3513eb6ddff4d1dc76fbea8e4b03563d4f4bf6943bedc84aeb862c66254a72fc70a4f997d631840619285488e43d4e4b0618555bf6ff7993cd9c8e83d4507d42df8ac79ecbe7cf2cd1c8d51ef005c319d1b591c3dcaedeee1909129f14831e8e934bd575423155c6daca0b333ac0a6288eff7190aa94d26df0fdcf706f610be82a7eb81c69d36165f0f97435d6808c0b1cb38c91ef6680f65f2e8219ef2f12c2412c80db41909203cb5da2bf76d21f0a6edf92ef1be0a0dc7415ae763989a43686280f82c90a64bafda406d829e67911fbce7e50f8c9d9e4886e2a7f0ae954326d3c32b98d18ea3780d645642a76850a5eb633d09e8062181b846d2463553631a11bde2cb0b24489d5c41f0e67fb1e1e37159e99ea2a66f93fdec382ed9b60121641223d50946ac1edcf085e577a3607d2305510bc6127b38b6ce897021a09a554ad83c3d3d47a05f281ba95037af91c7229f145b624c8e36600b5adef16bcfb3e1760774c91ec83d9675d492ff9d7f424f813ec8f343d935f6c7aa7cfc9c9ad4a26408f147452bee24bf1154bc1421e669da917700f30d08c8414dc3d346bba0a73dd70d13a03c2c17d109ed09a71b79f24fdb04b7e9f589a33452ea6200b3c60c75e108fb01d33f2326022f2babacee5cdd3a9dcd48a8142f5dbb74c2bae7f146779f26c070527dadc04e5142a12d06ac44d69c68bf20ab902b3411ca990c250ab4a8295f5cc92e01c46c6f8313e0730889f94103c04a271a1a9668810665cbd920688daa2ab0ac9089d20193eca01b8c49e910e2df46f68e6512ad5385b1363d016da0c30f6def5453d35149ea2f30c5454043b06f36702f4f07841ed2c652a2d80f84f250e051e9685d1b9bf4710af4ddd3b1d58fa546fbb26549d5cff4339a3fe2537e46cd1a727a1f3f31cace2767cf447b6a6c2b2cd19c2803d01efa9f731c22a779f5235b4e70027e715161c209e23408ee15fe61c60367185730afa1e881b4be630e3034af70f8f12a7a902977fa47676b95d68889364acb145d639177c06c402624e91f0de01b5dc7d81f6f3157d71c7eaa54ed09b7247420260af12fa8d1892c80b00edbbf50cff96ad8f070f160ba02ccb6cdc5422419fe282f4a314fc05b20ce8d96f4f17d56882b6ebf66059e8d107135521051db202c099b7307e57c67fdc9b27b44e03c49d1c0c37b7104c0a645017d4c3bbf39d81951e3fd03ba90de3ac1ec34e460461009e16a010e9b2fbf61e8843fea3b97269bd44ddcfcef2e4f50978aede1bcb4735261489dcb44ede40c69ab926d5ab441563a5cb5cd513c0f480d8247ae1b730a9ca315ebd32be660f6efd4c762259ef8d71dd7b3c4ccd7b401479be91147834f9d154b8f4bfd1783a4174d4dbe951736a5e4549c86cf4313a4b6b52a8645720a692995df1f2ddafc3fca341e4ef76ba08b57f15a397087c02db6ab1caa3c75426fd433828c9d4dff765c57a22196fac2487ea9d1ec49c876ce273a353ff85278af8ab87510bd80ccd5a2a3672c6a1cb965cc4b0ace8757a1d06370430b48829dc1d645c47c30e91d02628f193ebaaaeedfc51f1bda6474eadade3e208cee33da6295565679256c4d188b64fd6f31b0614a508f9efe35e025317eac65e6f1b12ff2ace24a92b0a39e8e280de735f5e47a8ea2a9cd582c7c9f913def21a62c0d9708ac19216f7f90ec15018c5730f95e1f3b416bff1787514842ab6e6242c89073f69b261dd381c169785b0928962393eb211141e728da5a1147b02fdc6cf000f60b8adde605862ca16e03b1bf6e64e4f14ce7584274415967a248abb91498aad5e26818ae60c8a3985822946614154bf53ec087e4a9f42de02d4853b0b5020a2650ef0c9a8866091ddb41163b0f292e0dfa48426251b06f839e40f4b681606e5e4991057489c916c23a1a10f111120ab4a0eea4af2f70dddbfec18ac75d8058ad40d59ef704ab045c8e0506e67794163844b9efd8016364da9804ac9febbadd75aff27748af82661223f915301a21dcc370238d0a602024bd1fd430247b53534b3682fc35b9613ebe0830be262ba420825ba247918cb8c481a0ee359042660b38e7d2380f61c534dd182473045b738b3bd88d0f7cee823bf926103a40ecf63ea4bd14bba392e0725d3e2de186a6ed7d2dd18c0184147882d7d74f20a07f02b5e7c63e49b7d6586fc4b740f60a502dc94fd264c5691ed44e71655069eaa4c6a162a7f9d272abc898c52f2ad1c7f8a443fa2a18d66d8e95035cab372cb177a34618be41c976fec7648352223915586f21a5d968298ae628298b34cc729542169ad6216c156184b117d152582cd571ac306c5c6660a165f72e05a864c8b45e53dd71d6e8f2ead82e65944f5b7e0a3d16f1b608bb280a4b308d129e041a9c05d1260d01661bba70b3bd1596006a0c0e61dce18377031308211085a10ce0fff7f2d175e34669d839a773b2ee70f4e5ac544f1096d2479c1c3d1e8a42363e4511da8a34528dcd5a5986636ac1f1e55b5597d2fb1c7e13d4884e80a663246dba34bad54f32c81aa4d1a664651e8ab850c73c754189b59218b021d5a99db2c9cfd4eda91acac26cab18ad5c587f90ea981b8b1105e91d4b568ba85fbeee8fa609f2542566d22726436032c6f448b381725f00d7f6da63a51e2e5bb3f2080587eb64acd05a38f7b5faa830ccf81e6d83f6050098080b0a6e49c80709e02b988b6e97c2361c40a28eb5bc1f3cc321f7b2dcfd0d10510144060a3d04a1375e0e0825c87bfc2fc3cad2be668e87590abb907db333a2fc263766775c14e4c38ac3f41d5effc1410dcf315b1eece3416c9780ee738e6d0855aeffe1097e9329fc55d3e9ca9087c6df6b80a17e541c786e827099ce4b58a149e602dc906d8922365610ddb843ae98151c14a236db415ee677135d1b7075275f7097a2c7db3723e3d758d21e5462c54bf262b17e835eb50eb854909cddb05de2a3a42e75a28776ce6f754706652b4c3cefe11a91deb97fe26dd998a738d10a1fcfa3090139df3e1792db3d3792fa1a799d5734fe19a0ed81c15a46af7498e80f9e7f4dc8631d6f358b4fb7ce6d8ef496d391fab6b460156a256ac6030b05a1b43bfa89002589276a70e0e265de40dc84a84e5c84865a088ac1bee1ec06abf228b313a4ebfbbf9dcf8943699c0804b3d9fd09db19451f95616d378139a8d9e406c494208525791223aeb81cf08efd360eae8862706d403ae2817bbfe4490fc935d1bb4936a7d0c9544246d4d18beb20606739bb92e84044a44f27a1510d425446305293c1ae2b314d6feffc1b34a3638c94be379af27d12542d4045a5dfb6c7b559947740d5a75e6c831d8220cd4cf8a7e00e3812dd86d3fffdd6d5fe91cdcc08177ebd8e7c15948781be697d412d29e519ede69afd26dbe7d7d40ab6ba565eea80e62448f634b9b4d3ec6d36086214007381ce5e45158e66f6c7617970635580749fbe6003ee96cc3aa74de57ea131aca128ed9258365d8c49e1ee9bebad8baea4ea045a1dd445eb9aa551bff1f35282303aaab55f3159c040cf6999ccc99b2c93d965f3a952315162c2efaeb5d8ba5ab5142e77a35ed59e91f440cfe965d6baa7c729cf219e87ddcea44aab19f5662da7aea85642e55cae1cac810e8ce49c94c99ccc2dc588be5b20033a670bad09ea292df6aed65a28001fb8419a0bfa913f9782bba69d9c96ee5889373a889929155af5a87cd6e6dc1f13309c0064880edea01dda712c0691a2bcdc7a8dd32fd9d35ca9da2a44f5592f67f7b44a519e663a2d9c5b17032bd5cdbeaa0d0a7d36e035512c2eb62b309c35cd4b9408d1eb36395c47f42b69baa83781988d9f9af68c9693d0a2cfb19685467f9358aec464b1a400e3e90b4d15b63f6c618fb20b0e7bfca8b3d223538cbe49551a50f524d8696eaa54bdecccda325b59721ad7040b6dbd9576c28307109f07c6a45f02ada4021f4c27c70ad3fdd457f540fcd71ed041b90b96e85629e021e26b91fb357836a29e1b315ff8a662ceaa88cbc2dae08ab4cab5781264a89cf863656dd54a781afef003aff17b00b649223c61b3fc4ed93210d4083df7f2054ad5f8916a11250776bb474afcde8070a03ac3ab4642a82fd0d8b21d44f9e76c5f7b4306a0afba43828c8f86006948b2a39793e2c5fb67cd36e357a3ffaa4b5257f13d519c84c7e16c014db804ae7b16153b2ab5159a22ee0a8e47d2fcdc0c58a6f5bf55b235a4d367064e0e4dc820982ec17c53e9e09d18cea18a9b89ed4cc921459958cc60da9cd53225ff0e63ed03076fc4a041e6dc7b4e4a14fac99986f362dd8951d8eb7b95d7a28611de36663c2ebd3653358ca005f881c3d9897f0a16e74072eacd5f118d9b2a5efdb9b7b9e891cc2303021a86e3a6c8a1e43f0838d29c226cf57ff04dec33e016d6a36252c36ea35849c8b21a9763f5cfa7921011dab0f91be0ad109e2b39683674bf07674f3dad160c776503f680490ccbce93eb4cfde05655613ba1a611f364a06e2c4a0adef6d9cb79d12ba577a44d7295a8af828c9cc08b0db413592262d83227468524b572695a32bb50bb6910c25f221d1e459e6ed04a760fa838d2590b68433940f58691bdd1f17e25022389e0ea0ca70c8f94b603dae629bccf5a3dd7fafa071d093a0b6d97fc204a4c3ff45e90b1cab00874ad7d756880c480951be64e1ebaca40f0d107a5da0f1d81d059d59379131bb2288c1dcc769827490f4395a5248b4d40e0a1738c6c7df960866c8818bf2f167307a65a474d0e4e7f121d42dae258bd8e368c5f2520a4508a530495d3ac908ef6073ff0c535069c532deb887e8605b2867889a39b28730467b1df045fe000e47e3989990ba1981973806ad4085165a4bc1593924bf2b67ee49a022238f35b57b614c78c50f3931289fbcca9cdcb914d25302c994c1975870e2564a21ce049701d4afadc798e713ade09bd7411a40a316586aa3726e33c138cac22a532ee7c0a93fc9aff14bd712bc8ac13544d8efdfef2e7843779aae61ce72de0f97e7088bb782d4c6e9896a9a7632a536222338323a231b66e690cf92f64e8bbb466abee417ee2713178169814ce3f3cab878fa7828da4eb68c204976587778f0215358ff93d86c9f1da7f5c1a562049cc6a3435ba8543f69b84b781a58a98b04a45c9bf1f81e90db6a5a88153d7df27f23b4aa50662c433b04c5b20103079344120d91c52b119c1bb22f9100ef26cc7d746f92798e276ff8e7ca09fd068f4be423fbf992c0f99d10f7766b89b22c683c64dc34cc33b35d65871eb3f821d063403ed749c9bc0d400fea5c9ac30075cf431c69a462b1a7b219f68ba782255c7e683e988dea42343b4deada812efc2515b95025b3c5dfbd1e36217cb6fd280f0ea49fc22e81368b2a4fc6950ca1ead6c41c756b5cae6fda17481f4cd02a363b2c0518ccb650065be36a855cfb91c4d72196970e151c9429e25dae3d601bcbdea7a8468b85b3b2dfcd06e1a4d8f62a5f9ba3c8de9dd1429530265b37467ac74b3bd920d6b3e86f06b758f4fdc869a213da35b2971ae65609c05d6d6084e0d06e1c838a1dfeb6e0e9981011a7c0e427f88380cc0c2cacdd5752df7ad611a0f182d975ce17712a9cc292b30aa502c2ee3732fa41b2645d9eb76b7d081b0a24508b99c398440d7745229514a28e27a06002167b822982287535039c5f900163da00abc06453a610cbc71752de78db24f47e2841492a81119999032364964a5acf9aec81ee548df6ab3843717447163c286d6a084cfcd2b9f4dc1449111b2b9368afbc09e623171271f8f9ae165710844a9f0f6990e8a43c38f90d9b11560ca380ffe0eb9b59b411e0f65e1c8c6e28f2a1e8049692e181536899aa314129127804e3cbcbb56df21fd5be2c03c036039669bb355c3162a2d55eb00a0c9ee55fdc4e397f151504888d76721fb5d70e156d8a1258c6b39e6bf19bfb5130b57122f4b3b31b9d227e542b7e08768b3ddfc906067efb8909062ae0341bb0bad6e9bba5ed97ed8236beb408a1c2934f37a12f3feb891a1600f14ce07c2e6a83553293ff1441a2ad5e526a9a1cc1bfaa2e0a0097797cc20903967660c36109c602819029fc977350b10d505799971085720cb2c3d0cbb9cd37ba15ebeed57a3444fb18a2c4a10f80bd3b80240124d00086ba8f8576700a84c17239c5732c7a5725b5a22133aa23f7a9d9de905924c9c82c19adb4ea2c5575e61bc497c11f0c04cc23a32fa9a003cecc551d9ea042384a5f201ad5cadcae108a6f41aa960b032dbbaa1a7911ac62da0d819b7e744fa4ae22652b694bcd044772a323281d90205c5d5ee210a6b82251577c6ae0d70c99148ada5170d36751954b0bca23d7de4e8d8a033919278656d6e21f25c700041b0d6296e629f5bb8405c4ff6710ee00e56c1f7a4763b50ca5f061362ceef80e1904b2c69529064cc6b7c5c548fb3b64f259dacf03b36d9ddf5429993ae44100a51d35c2596505a5c040501a0f17751d00d8588369aac0cb8094d3e8b7ae995e87a88d9a3154c393762ef11323a406759431b868e3836867b8756c5dfefc509d8b75ba9614bb62e242becc15a7e25a13b623c0906d6a7a563835424a72c5f0f24e9e428b113c6901459832a3faa68543122575a27282e598e4acb2094be296b260f68461de88f59a22f600c0d4faaef59df66ba38876544c45fbcba2a6fca748dea1c57eb3c297f76d2004cd7a6d2b1001d19559189f29df22407539e9d4a396221bde703d8a83f2aa3c7650da8986bf9018711c782343210861750e0a1ba40ff641ee85635ca4642a6950fe3542eaa1fe3fd05ebee38f56d829c4bb9774623c4aaa54368ddc6509a01ed3334701e80e6774965fd7ab1199de4f99261b602e0d6549df6895d56053b1a492eefe45a0f23c9e58b5eb4af03fa7d6d9ef477a23754125a9b0a8e48f0253de535443e94eb0d9603118d0079697ab395ca1f16c9160c73600dc4bce18130aa31073abbcc1853ebabd656e8d6b432b42cd0597b70f674ca63111b6a2ce57ce8a60fe24597b02aa58fed7bdb80f5343cdfc92a225e8b02fb39eab7c6ef4e5f3cfbbef25b67bf053f58fa5fdab7c4ef565f2c7d4ffaa6a45f91a57df278f53447bbd75979c211925976126a1b251a27ffafa7fb836955d0e6f734b63f4ee894414c595b994e62f69f5dfc09093d7a5a1b410e66c398bc6f4b47a5a07eb14f0cef5a8ecc660f3f7dbc9226d7409b5368f9eff0b0b0c6bc9ccccb0347cf5c992bb49e631458b127ef44c6eb62acd7b203d62621f2d79834a481646816d50cf5669330dbb8d911dff6730373b8ff0674dbd82b6d95485bbf93ae338754ac7d72adc3897e2c41f29bc42a124704c92725e30bc7044937127d24963712a3a2929a8442e22bc9d625924d8c4625518955ca5383447c24aa2bed158073893be9c9b8b4a6a3edb07970af3dde535c082d078f661e3eeec771f892a7c89c475d1e2d3d08f5f8eb61d543aa87411eee95c77615349bc7c523a687821e1e3decf410cee3fd75b7ab207afcec71d68fed4d21c73a7b1fcb800ced88ae215601f185c8a9718ca8e8fea2304402136852e773ef5cc6dc38154709d11ba8328f2ef69ba23cd8f38e0917f7fa4d3b17ab02d6d936067d42722c0d223844530d6951c4dbaf4996653eef3684b379659624809d510afd6d024c57b6b4c4f39aa96ab5c3f991a6838adcf05bd98c7e00db019324c72d133e925ecab8105380e606e7c17f6d8a48295206ef1a84518b7de68e2e209810874e1c2343320a40f1b4dbc21222d3592f062ed80ae8c9a5e8611c534ddf0bacc3d815371278144dc15602ca81bca77d12b599654bb48d3530dfa0894c2a0cec0a33f31ce4b295491e9a716dd2b44043f846b544cc29aa5b420353b830475b0ad4b1d921f2742b8475a9a468637eb2c9724e430dd83247386e389c7a2d01701a0b6127b160a955e938c289cf05c7b3e2973a37ce871adbbdce2e1ab2114a9165a43179437663c6b010db77abcc2786499a1254e337a76a58360c54210ac9fc503d6965dd62437cf0db39b438b5e38219f22413635d0cd2dad7ebb4f8f680eafc362daa48e534991ee59ff25e409cc2097a5bccfdbdd82d9a0af8053c796d80d2482e28b3e47db119aaf2e005942160600ade7379ecacbb61b786d23e501ce9966c9715392a9d0c443b8730c07e787bab84968c58414d7026386141914f631fdbf871078f5baf3e6d6c3d48e16f255407b8e434084640a7c4716e1215323c2666ff88b68b6bd9b11a482cec660cb8586519420036266ed50e4a46870e6a49be064bb1b2fe617a189964cc13a7b6f55350c9e47a48efd563925ba6b746bf34499f85b1ff15f89f6e9148fd39c4839b8f5635a0226184a7aa63ee8d26ee9b4522bf0612846a6fa71cf5a4e7e95cb70bb944e8f0a2083ceed422ca8bf291d12eadd76a283194730311534b83d63c31940547b61049726078751186f9f6808515936e46c375436d78272173d80a20eb96efe242572ba38394724d3b7affe1894e34c4a46804be6ae3a2ab85007f400f4d00ab092d0c802ee0f9f1936b154aa37814cfa7de1542c0e2e67328d7387b3b7615ac044b68e4871e358000f4eeb2736a2abbb01501f26812c729f5cfc034b281e89c10709c5000e29e3ac5c4e65a59f09e34a7257560d1493dc1669ed86e005e7c7c2eed258ffa9cca61f7ae1d1cdb600b5bdb86d501c78206f056b279093c4bf34f53a9f7b40f8065ac623c7389285355f30ae06b429715bbe542a81fb1db278e316c68bd5818da16cd9d2ef063ba5026008fe0acc34c156710c480da7fb0e34668e5876c504a10e8fb7c4e6f07238189ee2d273f5b785ef929d876f94422645f08290457f9b1233676e2b6d51c6525448b06c9988d009923c72398bf297d971300f41a14f2951fdb95a06c4961c8ada0df257e68371bd16c010e43fdc3789c5f671e770f36a86440c45758b44034ff1b16454adf482ba65c0f93c26af075296796c02ff744904ef533db4090cd329522b2053bc24489a4ce527f9c783c227482d9110368caf03081ed464811e98626af381b718793196e6a3439e036c48d52360bec0432f046263ca3e706345dd7c283151ac431b06a5d9bb21278077bb5be32ad756c55b166646b427c3b6a6adad3b7dd5225b3b9af5a103a7d6e99d328fa5b986427b6484f5c5b1a92390a2607ae0a540a68a1f5e8d9193a4fd969267aa04b919c53642753ffe937704d27d1237467a8bb68d66c881de86f74dab694b0cc64ca809fe4a20bb3b4433a4e6be4a3e31d41d3fcac39078512da528f71927d7dc0494c51c15a490fdb2b8eb667cf9e5898d82f57384295f5aa0d761a55f0915048f53ada6d1515c04f93a579fa1d761a47a3639708c398914f465a8e4c3061367ad1368a6cb4da48f46070460b041ff58eb43d232355da918aeb9cc26f9cab1ccee9352a83eafc84869b782abf711c145aff6ce44d10b77ec1ef51193420ced8dfc141387e2c201fda4046f30455b2ab0ddb4036c4541a4a690e27247c29e9e5bd67e90c1627d3e7302ada05801bc118252935b9d6fd729c58552b9d376586f1308bfcccef22092febbd8ed82b390135e3154ea3e7e0fae5fb6a088f70c5c0f2f1d711ed60598fb8e9f5bd388644d7b493591821bcda8165c9ca8d95185676b71ace0a438e9585b482291764a89f3a65e8d499d080b48c851b94e44a410f8d8c0407daa6485209474185cb1711ee3a1cf3ea0dfc4645478157512e0433e4256a180698ce52c6e88255648aff76ee29943c60257aed1187b9a5be03a71ad645440c5c22a8a4542ea834f2f1362820b55135788acba4ba50956084a7ef114a81f87eea84e022f79cb9e30175a4804c444969a55df25710177434ea8a4fb48337c90f0dd289c71f3d0f00214229f0e9a381ce1d38bdef8056cd6e2a67e19850308a02b5743f285e818c56861ea407b2313bf1e9cdf8ab7193622de702fa0e09ee882b84e3c2c085d42f326fc4c423f783fb2a93b223540823bdf4f3762589803485210cdc40243ca219683c6a0a372b6b32ad5fcc174375c931adb1a6d58574d697e45a66fb79181559c8b71f816a90eaad50be42f3f741fdc7057f5e9544c8b8e4d94acda85b543398d3038c13f3de1697219b3407b3519b8d266024ecbcca858d4c3d2788c22b0ddb80641b18ed807b5081df10982f55b10c4cc49ea976c3cff91c73449f665d5134702930e091782ff2f88d7e5ad6582a0d0492edc0f9c3a52f57c00fb20f08e607104f2d0b7b96e92f97211632e90998c85d0fe722d2adb6524728f97f6802c85ea002f3b884379fdf4f23f8dadf5c0582ddce2ef23de637d3bcf6fe6e7b6b495e266b758f847d9d83dd179e38705a9ab87fd8fefb850bb4038a460987e2e52746597357b121ba6ece14ad9c14dcc082aa3d8a5320ec01bca340dc06cd1269c3bbf151efff71bd48901bed4d84905f411f3baf9166d0ab7cd4fb7fd40b20f4cac7bdf161bda88f355d7706d8eb7d4ceff8b8f11a2fb87a852037dce3d5c5bb25d156d5c92020d886c6b87290b213a4308548b3ba0cf6de6190751fc72032ad26acdd500fc1a720eaa4a762a274048c70c3b8cc2c3ed7b7deeeeffd78ffca3dbeb3f8ab9ab7579653a85aac3ff87e421a62fb19b6d99adf42cf146c9967a0e52381cd40bc2d0b75b7098c37d644725581eb609e8cc5c044ec81dd044c49389bf0a85165ff8a24e593f4fff04477fc0c5bb2de8c423ea20969dfc5d95a4db48b8a18bdcb601bc2a6d66c0700d63790155d884e9b4fbad5242e16906233635d2d8d453fef428faffac90deeb00840d88de0dc270024710739a621fc6ac206054925b84a81d3e89f10961b21482f37482a0fe20d0842ef222aca9c29825469a7d5bdf6bff881e13124dc0c6e5402750450015da19672fcc76340c634d8037cccb65a58caedaf501b047c3c69b794a256b5857c0881648784ef3e1517033a6d15e33111774898956608481597398027af7cab65075a5ea87f8909b13ee98a0cf1a40c443a51fa3c0bdb119a11815c7ca9f7ef86f13a1c6fb4c8038c7961c2320aeeb4e758895cab3cddece684873ad1cba72cd9aa3a40283c117722a0d197dfc71833ba3b1bb164a52f4fc7a1266b8a840937a33eb338f33360d475859b1d0dfff8dc3f88190fc4a014cb31b55748203c6ab6fca35a1b1e64c1a3eb2217454abf630c48495fadcf049f13e3306f652bfd225de84581b01bbee778bec44af16e551a87014bf6a1037c61f558233492dd320cabd87ea73802b3237cc792d2e520fd46380fc17e089cab21a84e3aec1e561646071b01731ed38f298e59c784c6a4625ac65c1123505716eb5e22e8ce81d03a7019465d22849273208a9b5b722f77bd37353bb48349da92b91bae90a610fa435d58f7b4ada1e16909c43de3fc97e094c3de8843355c5c101c60a0767679c823b7d6b3b7bde87ac1f262c0196de7c755e705b049e05096ca9a6cdeb141029844fe645fe976a0553c32ece269c82370576322f4ab1d4d8858dcdbef59f6e2ec0370d2ba9f39b8ae1e30766c2cae199eefd86c44759c75f43a2eeafc5fa4092f909c967278f689a8384cf8b0dd3e040fe03c2598811955d1301ebf2c6985e70ed978b83e131afa13c6af2b5cc25ec6e97733292be305b9a537430c2a6ccffcee4904c813933dfa228373af89f71aa0d6d216dc6d2ffff748a2bc0c527ddf106149a52584fbf05a780b8f179782300377280716d916ac67813ac52964e22bf1f453b7595487f3fc078e24c4f35cfac6c27ad708ccdab1bf84a8969bcb8243482399106f3b0a3d280e4187136b8e65811cf974eb94ab2fcd433aac47ddcb36e61d4c0f79f2cf17269290f1f3159e2f75b1f0dee813eca4021e89848e0b3660b46439330f0f0f0f0f0f0f0f8f3121b5b54f48424a524a4aabd75247e420a524a54c2989b7483b7a3a33f129a6c9de6498f8040402c20bc70b970ba529194ac5532a28a5c7a80127ee5f214f5a8e783a3168c07a4a297878ca32d5b663164c8ed729a9f85bf27ae3396c6c60c60ccf614305336698a143166c66448d9d4468e4d7c4823fedaff9a34760c189ee1077731c9d745baf489ecac9cdb74757703a42ca15730a19947dad605f82662425ace3dbc70acecdc3d44790ef216dabe0934a4a664a4e1e3cffaae0a444492b62a954b09a76a742aca8bd6799252a785bcb1d59a994498c769c82ffa484d211377595af29f83af9a33f9b8f1252540a6ee2a65df797284953527016f4925c3f4fdb3419052f2612c54f6645c1f9c5dc94dbaf34e8e0e1e80805abab13420e25bede9b147480824d136356ebd99fe0d4fd57f637992df6da800b68514ed0e1095ebb2477ddc43bc1c41c925f98162dbe419c603d922e696b494d66cf2698e469a1e67e5737d2046fcaf467d7f6c7c8e94c70494fd9e40ea57dbfc504aba5c77b83ada714d24b30392c55292d1ef27f8a25f8ad0c169e1daa76639560547559b885790a756180c60942072598bc41529c1c3ad4e23e6346c724b8b5f8e31b31eb3eac1a6934eaa6d021094ef848c8e1679d69523f414f60c60c2f3a22c1d786082a9a6b4ec999ea80049783526d2288fe11bc8ed021c7ecd31bb2c8118cd60ccbef49d4434f7e8398024e021d8de034e4dff43da943ca0d6211e86004abc12b8bcceb9e47c72c82efec5082418722d8efec7927294b29c9b023119cea94dd4bc6122ef22e0e175d74d1ef051765800e44f01526d3c4cfd095cf6c41c721ceebcba2eb4e372ae83004fb1ad2b43f3c2479ea1bdc51082e67e57491a5ec20042ba23db5ad8e490a5dc0050e1a9e6c98391737726cc720f00b49a530e5a2a26e0c3a04c1994ab595f54d67aadf11085627e5b2720b992de21d8060628d797b55a9945448c71f38a1ffa305b788ada1593fb06fb62629546366d3fbc05fafb7794bb0ccb4f9c07e8c6cb2d4b4072eaa78aa4efa3cbd5c3d30da79a2e7f4f595369a072ebf267597206944060f5c063d12ef2f596a767760b4268d3177ec16f5abc30e33e8a8c349765042c7545a0ac90e3af03958c88a215f4ea2b21d73b0191d72603fc9d131258fef9713904003a0868e38701b2c8d5c1711b225b57ff1451b1278c1c50d0a748e66c0052420811933686400ced00107f672f2159d624cea94ae60a1e30d8caba958a752c8775d631b3adcc0d7c7e049d3db36f023838aa0a116717b3674b081754b225685a05e035b6eaf6ea2a63ffda506d663cea1be7e3f8f9b062684a42fee6890adf92fde810636e7e5a4824cb3b45981a0e30cecae8ae6bd3bbfb69c02860e337071623ecd1c3aa59c45eb858e32707f994d591695e4c46fd0485e943b420719b84b4dc143b2181c5c181f748c814d31668b90f24bed88e4b0a182d221063ef2fa8dd96ec4be48018d30b041481229e4244fe434707071050c5c98fa4d41a62b499e44838e2fb09147d4d94775f111aa91c44a0076d0e10526ad28d15841684613e902a7b5b784a4bb50a1830b8cb6eefc93906369e8d802a74bea5f67ffeef4592d30aafbb3d783e7deb4d0d09105ce72d04188125a648c3916b811faaf6a21bd4d4cf10aec5a0c1dc945a9521347d46105365db2fe0ec2bf62765805f6ddf4e7385eeb163aa8c0bf7d324b093a22f7d33105c6826e0da9e33987d0b09156061d52e0af920ceaed453fa64a0abe880257a36e528aa8a3aff324b0fb4107143ccf5fb5fa136dd0501e743c81f7495a993a7a9ac72cdde81518740263df1aa4c5b1bca63d4d60438f6bf64d4a3d05bf461adea083099c1cfba469540c9a7a61435b80bca0000ae00e1d4b6092d6e49a827e97b549097cad779654913faba808858e24702ad47b2d54590ee16f193a90c0e71044c8bdb1f65dcd11b864392d57cc15b91742860e23f0b529c4226e4811f8c937713787e7583a18860e2270c94a9d48d14e770c818d1fb1b5e4256971371a2dd00f740881fb4fc24e488aa03cfb0e7404815359a966f235d79368aed001045e34770a399ba44e3a2b56e8f80117fc3d04b52153238d469d0e3a7cc076a4944a074fdd7b658db416acf5800d21966bcc53513dc303fe92f6ca1b32d4b10326e6a6354f162fa7d420a043077c090922ea256f8624e580af983daee4b30bcf260eb8bca8a34fc449bd7f75dc805352d3fe7609ad4ad7068c52e33b4144936be91b1d35e03c09fd697f6b9dc65423cd4632d322030ec841070d18b7affeffb190aacf8213622a88adbe27adb194051bb7bf2bc62ad3696e0660c4824d69539e64ab1efd9297b0e0bdd7df630c39e60418afe043bcb451ff25e84b2379d1e45cc16669ab6822061932556d048c56f0371e36415465d18c16197080b10183158c655325a3dadd5b560b2360ac821dbd92ae2fa7a42a7acf8dee95ed2e239b0418a96054a4c9c9f2078931a660a082d5089e9d95a2ed22458b2db4d8420bf30818a7e093d2eb2d49957809cd14bc4f4e5bfae40499925a0abe45e69d2521318690cad17e72dc80410a368b7efd90745809114f41c01805ebd9eb7df1828aba9fc11005fbaf41dfeb4b67356d8d2c2c1a80110a2ec4fbced39b2b928ae2e8030c50f0ad31c7d4aaaf9553e4e200e3137caea67753be9a2fe8a400c31368cf76b24dda453db5000010303a91a7eeed0ac13c5e3f80c109f6433669e5c1e2a9bce826b86c3a98ca21f754a4cf8dbe40299a6033fe691f9591f2f51f061899e0da6fbf52abe4fbab6082d3bfa395426b525a62b904ef19724c97a24e12ffa025f810b47defc40ede2eaa042754c794bc36e9a98a53820932fe645162b973266b128cf726a96ff142352b0926ae7ebeedbcf4b596014624f85361a75b7df6714220c1a5b6f4a4b324791e458f60f3ed72cc19b9bf73c411e40fc1bd73f746b0a63ba3a6902445513a23d82a4b5dea679d37ca4570327da9a4529922d8a094f64f113dc97037115c5e6f48c132e76bf8886025e62b7dd63985db7b08ae93e98ca9534ba5983704db9382f9067d39f7ad8560ef93daf2b28d105c3013135372b389b006c187875022b778cafb7bc31004bf195ff3dd0895589a0ec0080497f306cf3c75a1f29a040b3000c1e48ea5cc2649f78ca32bc0f803fb9927e9896b69681f0330fcc06898876c17327ddabc0f9ca5b6564ca67225e52f1060f0810b9195d734e7db905335d26ca4f4018c3df0b962e6deca9962d10327a964f2daf423b7926aa4a5d4346c24d30318796062aac98a936e6cadad9176c34990bc0bd4010c3cd89ff95fb91e52793968b4e0468e25598071076e82d4d518d592aeb809fa0476605c84ceb7119279bc8fe100461dd8d2a419aa555474a7d448ab1bc0a0032b1a24a49cb2eaea8e36ca66ccc0d145172968c0161478038c39f071640ae197b264f2a01a69280032c090c3b61be32565eabb730088028c3870494d44dfa4a275f90b07f6b3a62447ff7f48ad1a09da8b968041018801c61bb8f83d312ff807bd34ddb08132100b186ee0b754a760992f681c2260b481d32f4fb596db647c370301830de5a997875f673c598db4b741e3d0c05803a7329e92372a4e022fb830247f80a1063ec4cfb94d6ee6268ba681ab89f599a496d22112c3051868e0feb285b28d24e35ab600e30c9c45aad211a692d000c30c8cfd071962d41ad174712307a2d18243a30cfc7b99672b4d3949ca910c30c8c0e6fb243379cebf51df301b03373ad2bd2e26494a4462e044040f7d15d1a46a65038c30f09541c8b6104769a81b0c7c753279426e48a9319906185f60fb5fbc62975a47fc6b24046078e11113c9fef9ffaa3287d105b6d428d51f5754d0ae6aa4599a4ee003341200830b8c48d7a98269ee18ca13dcb8a10005cc98817c035d74d127c0c08c195be03d87de9e28e1e96987a105f64cc7d041ec3e30c0c802e721079545971a4d8f1d16d81c796326216f185740e74c1db28bfd56e02a66f68a0ec96973ea0930aac06bce6221a6f206993354e0aa468b0aadf89a9d62028c297039a4d32a414bff27111a0f6048814b49640ed31b31e8e93900230a9c087a2fc4d39ca43d9f000c28f06a6a44ccc94d5d502a3304184fe02ba69096f49350e67921c070022342321d794253232d078c2630f9c72af37ba8a568aca1000613187915d4af36a95cf5daf8c2d1043096c08e96fa9873df35d26ac050029faf3fad093d31a5bbd448c3190148f068059bf52d66ef901923bf1eace06aaf764210b9c72a188f9ff4c5948c9a6378e0a10ac62a77084a4491f719d3399a0137f04805e321b2c6b0efaed31954b06dea962789a6b47c993123070e270117094fc16a8af92586a89a6448c1c0c3144cce7275f3a8ae79548f52f06ada31a4d51f7539b413f8000d16789082bffd0e3dd31e09ccf01805eb39da26ed639d5b4913f8008d2f3c44c1a68bf729df42279d6a90808b1b34be7037c1bd4728f8ecde762a4ba06072e61a75f22d9fe0f45bea88dc9954d248199e073c3cc165ab77d027833c61f94eb0773a832cab0921c939c1b8baa88852f24df0b9e2080daa214df0216c7754b724ef0c658293a63ab2a6ce23f53e98e04ab9e48b1ad44ab29c4bb02151c342ecd38b765b82c9a92a497ecaa2c6dd4a30394d7e68087aeddba504374a2d26097253fc5d27c17f8dd08ea0a5e67f4a82cfa8adf7613196dc4d24b88ffeff9699ef7e3190e0e4782c31cf1174102a8f60d7f3a71ba5c4930c298e6035d46628651db61d6c04971db7da649fe7df8e119c4a4149b3d32f82ff68317ca32711324811dc774e7921672d119c8e57e90c4ac8eab210c1a9a484d4f862a534bc1a695e3c0dcfd13772e038880bf03804aba1f7c1c79432dd202f52d080b3f430041b736f8e9c4699f6da0bc1e656cb1d25d64ab6122118f91d6f7d62e6cfb11e04eb112be9d19f20b80c49738f504b1de225106c929982b0af511b6904045f7921f7e9789327e80f8c6adb68c7eab7d1cec30fbc67045922aa059dd85d7af4e13cf8e0b1079b31060f3d9c7aa33fa5e47469c005b420c7068f3c9c071e583d3df244526d2a6f907fe1450abe01382640812db4d8a2015a64200236328064021fa021804a78dc81bf0d6e5b25a2259196871dd8fdd7f50e0f41e3df1e7560cb5377ba9c3f5552e2c276e0410746e926d55deabf23a95c0088e03107ded42c4ecc7d3284ea75f09003ab6a31d364c7a0db937160d399507949b5396c64408b2de0c05bcee94ba998ea2f21273cdec0e7ce23fc94d64d88f90624e1e1063eb5e670ef5c9a438ab581bd931f6a4c4653a173b4d8821cc2830d5c9a103fe4f4e59f7d6468f0580397b32521c57cf2070f35b0d92e53f576877c927273f048039323270d41b99fb7bf72f04003939406952f23581eef68b4c1e30cbc66cb6baa63c94b9d3703139210adf71d595a82cac0ae07e193840613912032f09d95425afd6360f2e4cd21aae7564c550c9c309df933b7835fb084810bb5b2d21002031b9a2f495745be53ff17d8531aa4b5e6eceb96e405ee5255b6d6dcd0340f011e5de0367b68470f1616e20227d2eddc37d85b6074eedc9c72b25a60ec46d5e999ba9c72cd0223ccf46de5a6e9742616f80f5a91b3d66fced75c811f11f57e5267d660b202a355edfd29248f6d972a7059416d95ec8c1a3c4205ced6f2b628d3794c810f3993f6bc9162324f57800a1e52e04b480b3d5513a4f5ed110576f3e514c735a45d4e99c0030a7c861063984930eb9026e4c2e3099c9b4e22688eceaafa3b81dba429a7984a9dab83155080210ef36802579b635df44d954ce916e1c1043ea46c9aa563e6b10446dfaaa6bf4a15aca246f050023b4282dede5df90725d982471258f7fe2816af3ddd5624703bdea7bfedf4678c68c1e3089cd064fb7d2d2286c9088c29c91a52d4eb0a1e45e0236e6886c7495a821c041e4460834c49176c73fe7beb31044ea60a91738a71250979088111312747b5adcc23084c122aa44cf22a0f20f02121c7b6cf4954f7a6465a0b6ee45063c3e307ec7dda34fe39a66e30053ee0dd83728baf21dd644b8db413a4007909bce0225be0d1035e350615834e212c49be465a5981070f98aca24b34da6ae51e3be07a5dff4ab958238d460b6ee428393c74c0bd8f10aab27257ea9f032e5db598a794e57a4133669475c10307bcc6fe2e3d6ec07e5433559bf2353da7461a0d1b393c6cc0267d6f955c9e46b68b9c056e47c3a306dc45ec51a5ac2d66b088c08306fcf7a6a74ee9e324b8d135d02c181d3529ffa859324991460e1c292841eaca400c59b0f9a2b3a59be853da353162c1c64cd66964ff38a41003169c46ba9c41ad826e88f10a2627156a375fd4158cf4aaec20820ac973e7857371a3015a6cd182193368588c56c46005e36b1152455256a95b05d7d93dfb3e6570f71055704aa64bb13685f869cc18a960c7dc3666f7a9fd9ca382dd08c94e6737113b055f6661f984c590738818c314b9aa55e52c8dd1d42ca34ed618d26dd6766aa499c0868d1a34ba485cdce1214629b8bebc3751ea79498514c4f4be979a6246c19b50eaf52b8735d2708b1a39b8e0008e2eba5080165b68a1c5165a68b1851618d0220311d0824999ab808b220a46a407b5cba6a2878c8682cf2721265332573140c1e51845e5ec4d9a945e7d88f10946342519ef3bd4b37ec4137c0ac9b736d6a89887189de064ce75fa3ce48f5613ac430c4eb07e9e3668d9654e21493818b07088b1093ed3636a11a62e52e50a1b626882d7789692a9a568b14506228003c71a62648295e456ee27caf276d4628b2e1a139caa84549a218f5ec9b900a315625c828d25d4a5b78cf55a1e4b1435a9d363414670e4701c38ba125cb692b13b6f55de2053236d8d023128c176fab84954526692a449b0976152d46411de16920497432af9313b4511033122c1a9bb2074eea0b682ed376cd0b03b400c4870d952ac8b56e3997edc0208311ec1a70f96a643e893f96b4770324cae5725a9d9444412a3114c6c537aad47a6f4d931825127db2f4af61c82ed050d37bb8bb10836e91c159328fd0e221e85188a60cc738a693fe2798960f74d88a4d01ef48b880836289d79b2e8e468216bc1a1c145dd03ee109c8a95b7c4daab9166086e4da84ea9757c73eac210a310dca53549323b48fa3d1182f114abb64f445cd42fc41804af6bde71b437444e108c972a59225e786bcc6ba4adc0861781e0be53d49ecaa2e91ebf91022fc40004bb9e556ff1b56bf207fec2bbd2c8bdb30c215088e1074e864ed0aa8c90009f10a30f5caab547d172ad97748d5c420c3e303a6811e11b74759a7a0facb85568868c9ea3c50fc4d003a3217bd6504d4b22796083f0902e3f2fe95c1762e081dfd35c53c29412ca3bf09691ded36f8e88fad8e18b22aa73fdf31a69756077e455363b9d0e5c5fd4117aae29a84cb939f0f6197244cfb9dc532907ee2a6dc516370b1762c48133f5a733f7a4706064ceafb42b421be30ddcc4cefe65b981bbe0be9e326d884fbe0d7c1c25b24ab610830d7cee0a524f6de7b57e6aa4ad81fffbecff4ce376e5500397634bae1d93c68d1b9e062e9d4efa13cfa0611349f7ca83e40c7c9410724e976fd4c5941a696660e4e94b2252ccad0c6cbcbe9c734ceb924a9aa3b9487e821b9ea39c200619585189227d6d53236d0c671e59694a2d0656638ab9c9ae114134b00431c2c089b098f64352cc3e18f88f16169479ab4d8e91408c2f302aef87d2ccb92d6e9404de8517f80aa9dee3b9f1235d606c94e609e5f5e29ae4029b73cd6d4cd828114f13630bdca9f10c95a216626881510b651d923784329d2cb0164310125c628658e0748a3997a8a0235ffd735760b29fda6ef2743926252b701f2aed2c998a355e57818da59134354becd1392a303a07d3f9da3b2429b11a6953e0c2c7ff3a6a6ecaa954234d0a9c950c49a7ccbc4446a2c0059d114385b4af13d51a696b218801052ed365ccb81e47984fe0b2b86aba31218244538e14d810410c27703a66a769319926b0a33d3f54d289099c6b6b277dea2cc325303176895e9126253022b609ed96df22799e04fe235b4e503b2652be91c0a5da65151162e63ca523f0f6499d5263954da79206621881cd74559335bc7b3f5223cdb010a3086c5ace7fb7691a3452fb8d3b33821844e04352a9e933aa246b085c4a7731e9979043525c084cfed1e29152a74d9fad915670e4c061e30c023182c06afddff5be8554c2d222030ec84004baf8e2040f68c08c19ef89860abc701578c176851840e02387b5c6d5fed1efb161e302c609317ec0a59b6c95b4e9bc9bef183ee0eabff7278d27460f38d339692d57a8a044bb80183ce04d73e59113a4694b290d2b7a88b103463d3b2fc92b0fbb910ef84c32e68831b988a63a07fc6bce5477fb49e4d662e080338f9c5493f73760e409adced33f1862d880039c08cf9b25e97bec3e158cecf15477f5a5af4605233f6ad67442648af6145c060dd994b6ce501353b01edbc264d2e9631d96825196ddad4a65fff6470a3e68d2ae4e3712832419551b05ef31d7c79052ca8f1aab91562307172b30d645a30c5170a9628c1d42893a335d8db44caa38b6033242c1574a224529710d3223a0e03ca449572363b02ffd27f810ddd5d77c927d9072514c8b0c38c0bbf8220519b8fb820c4fb0994b748a87529f773a199d6092f0fba821d489dcd5066470821beda5bdffe287fd65a12063138cfab497fd2fc752d76568824d21fd6eb5780e299a8c4cb041bbc44bb2490626f8bf20e4e4d23b694bc4041997e0fc3b8752d7cfb5ce58a212ec45d7915ae973ccdfcba0047b27c4d742f2c89804fbaa27d126e73224c17f8dbd28cfcf2163908c48305a2a5f8f4e823e2a03125cacf348224ddc2ec87804bb7efb5927e9e4b9ef0826fa9b66cbbe89a7f346706bd9e79a274670275f456d1cb9d79d5d04f717ab4aa915c16529a5cc3b79ca5ad944f049e93a11dbdc537244f05555715b63a52c113d04679f4fd4784ac92b260dc19e7a89ff1d3b3db68560624413797dc44ea247083e272539550461f69a41702129e5a9b7b1bf4e10bc650a2a684fd5039c2023105c7894689faaad363f37640082af3e15f33af687468e147c91e60f6cd75a249d5367b3f2981fb8cc1941c4d5f4411fa5566b5bf36b5c1c4f34bef01b5fe05824c8e0039f2b55ae05197b40aded84f25e53da480603197a60edc5f4b49d87a4cf3379487b9bb4ef3c92aea3810c3c305a53e4a9ac216e6db0469a17ed5d2075818c3bf096d3856429febb586d59906107f66a74529d3585a424c70b1975e03ce4f3b428f21a8932e8c0765f2a33515a3f9ad648f3c2067216b8c998039719d6d9e46a726074f342551c292a6e70780964c48153aa72678e1fd93c66ec0a32e0c09a0875a5335310163926e374c173bdafe3062e89147c9372977c226d603de22515c911e375cf062ec8f83942eef1d0a0b30626f88e760941d6e566d5c09d4649232ff4594cc934f05d2aa297ba0822f468e05cd2441749f2abd233b0e9af36f456e4aa57ccc0e7a9feab495f414e481978d33962b628f53e3224039b33e62c495a8b0ce518380d316ed5e8ee754a254186183820230cec6d8b16111fa920030c9cd20d79a695a1fd5f20c8f80217f2b95712ea933686d0f0027b1a3e3182b264e0ae0b8c12215510dae45c60359dc817af94b6c0e8a79c1bb5d4f77aa405de5cdb74446ada484159e0765fc732af57e70e6181bbfb492b5a934e10cf15d8d4ea262ae5ea50aab502174be68d21a8282ae25a054e0615d5be4f757fe7cc9821830a7ca84fc1c44598104a3a05b65b35f6a4cea14d4c2970e3253b8ddb8b484a13053642b45819dc4424cb4081dfcc1e2a8ebb2425234fb82f67ee04eead83762a4fd9bc824d6024e75869344529e5392694efb3658d29a42c81db10aa4fb608b5053294c0d6ededa72f51d1b93256909104fe5350a1a35208a9420709ac67b869485abaceeb2338d691d35ea669047ed4ffc9319d9c31e32c0e328ac0b85f36ddd490085c7f705bdfdd5279913104fee45e0e35bdb0b31b0d3284c069845c55d922230849ad749dec723287175c68e0466f607b200308ecc4aca53f758a3925f90363704b63e6dd1753b620c30736c368c8e841c9e0017bf162d555b56ffea406942063079c576b281d7453788f3366b4e0460e2f3c083274c06a66cc3984a0e1a6fa1164e4a0dc7e3175ff8e051938b0b345634e704d31fb1b6c29659b670649deaeb962c84f8b20c49b820c1bf09ab531638990242765041935e0b209194b8aa56c70c181e43366e0281cc8a001972a7808edaca79de41fb3e084243522869cee8490f990056b23729b50e1971c7cc482512958127d13359b5748830f58a0ef6a820aaa57d493b49a3ccb1e4d57b062a7720a3ab5db0a45957a48c242061964057b3a66cc1fdfa4986a6f7cc102fec286aee224355228212fbeaf0a540a75de49fb099954e03f298f28212accb415c93ae8ebd66e9080d8ad59093e4ec1a78ed0a31282d0112153707b766934c54e29188f144b7e1c99b4a73429b80dcb2958688ba697320a46e9fc60f92a9ed3591fa2e094c79f9433fb72d3130a56744e4a59e6a0d1e20414dc79a83e0fda8f4f1462b28db1fcdbdaac91863a840f4fdcd9ad734d35937a1df8e8c47d7082ed3ed11925d5fbbbffb10956c5f24788e62e2ab626d89cda749490d68f4cf031a78da619417aeeeb295070021fa021801b7c6082d3a172723b9d3ab1342e6ed820c11962fab804671da3c6eca492363dd6489b3163c68c0e68b1851612c08002dc1b90fc4af161092e5432f5ddd6a07f3c3492175cbcb1c0d3096cdc6840f2828b06ac81e2a3124c3aaf9843997f8e9bfda0046ff6edfaabd19304f524f8714dfde9dd2aa693241811c5837787de3d8f44824d31b9566ae7cfbaf003126c2ea5520ee54978883e8271cf9e2cd3bf594efa8723b832fff8fed9f4d108f6745a8d765c8b91941f8ce07227b73f09f93a7ef063119c8668ca4c89a24ead0f45b031f55b5626a5f9d6fc48041b64c829e59cb4acaf43b6f0810846e555d08fa1ea53c80fc16e4e272187e8c3106cade68e8a26f4c4d41f85e0b3a6ca9244559b90dd072158cd49f976f613fa921f8360b527dae9d54b3db9fa1004db16d4494c8baffdf98f40f0e1c9e4269deb0720186dadbd1d524c117ddb2f3efec0a80d322c5e103d513f303e29650e1d7699bcac83c1471fb8b8d7975797e927311a7ea38fe10337d69de4988a8468e11e78afa0df752ff8a107ae23951069554bfde9e0f8c8036f1f2b92f094f4c64e1b5d9032047ce081efca6b394dcfc23bfd710756cb4d6f527f69418ee6c30e5c52634adde8e8764ca903636d52cf723a912fda0f3af0312499f39afe1f7360443a2d3f21ed36c6fc871cf8afa064b2ace79dcef2110776829d483929992a09990f38302a26a1e3e8c9b13ac67cbc8151dd793ae712a279ff0f37f021ae96c689e2973c79818f36b062ff914c722af92967cb123ed8c0fe27fd1b542acb7c9f123ed6c0c9d8a984d20c491c5cac171f6ae0fa4d997e0abdcf7da6c166d4f840032f9a9521585ac82dffe30cdcc99824050fd10f33701e296f44cdf6471958eda02455068f9653f0830caca4d8c9d5c61f037e8881099af268efcd787dfb4718d89c967b9f2fb5ed8a3ec0c0e7a0524a8a9b4654ce7d7c81cfec761df32e5161faf0026feafea22eb21f5d60cc3f075315838841eb35d2f04a0d3eb890a6a45649e70d8eae912ff8d802efef9a4ce87e2c65f91a6938b8282df8d00267e95e35d384605b1678ddcb11fa29c898597917366ed0c002ab959b4b42eeed3ca181830bc2828f2b7039989652d32935d2f0c30a8cb0cbfadb552724c96ba4e1e81af751052e26f389969ade23bd393ea8c0a99c838be7f4a9c24a16828f295c7d4881539ffe63786f28f01105c6b5cefb92e9943bfe8002e7aba669924ccbf59c65c2c713780972926f50c92685c8096ca520d4468914dc6296081f4de0ececedcc474a0e8f0be183097ce50b3afd268b153f3880f0b1044e54b99907e996dbb4317c288153f25ce28d6b08258307868f24f01394298d6216eb24db850f24704974344fc1f25d2afbe3089c9d7b56a8a7f248b9113849933798e5ca471118a51db47eae8e296e0c143e88c0462e2d42771aad1ffd6bc2c7103895835d8ed61b5397324008fcf7557592a3a2dc844a193e82c0e8ed52f23d8af85b3a0c1f40606f54cec1e266d3d3e7fd80310f26477f1041552f1f70935f538af8d9470f88de1953cd552cab32b6c7f01c644a2aad91f67ee3cee40a3e78c0beb678a50ea6c55fb4032e551295830c2a4a2cb50ed8108fa2b565c9d19e02143803906f60c68c1933707861e32307bc85a45719f69124c4940b1f386063d6179d379fcc6a9d0ca4143e6ec0fa96fe98a23fb796f861035ea4a80fe22afaa8011f16aae3ba994c42947af8a0011b928520ae51fc63d299055fe7aa5e2a043bb1943b78c88211a637c87a3b8b6beaf400128b42a98d31e8178f153c60c177e8535afe1921063d7905a752b44eca21befe8ece156c0e52fbce621c25540c034660b246ea4d3ddfd6eb8bc0d9e438923de514ab9e08dc55bceb9359a6213f04467b7fc8dcf974d0bb10124a973e08bcd65f32ede974aa4060358a12aad631acfc01db5bd9da366cb3877cc0dd081935633c1573ba075c44d752625a76223c60bbdb2bfba885d276c0be08116c475d94d4ea8037e91fff4348b12d25079c1275e341e898f7c5019baafdb5d2ed4e94dc80094a8688faa7367fd006fc8e8b0879a38abed48051a35bd9399632b402d080514987fc591b29f7b3e072c71169b34f845616acd768659094c782334d4987da0e0bde4d4f92a04fc96bd32bd8db20fb3a23858b5cc1c65115720e21d3d256306e4944922521c81c6205ff12ad5acf4c4d735661b2e0aaa9fe2655f09e7f6df487a454b0112fa994dd3c882c49a86054cc1e32675db749d22998ece1a7b326b72c319982f5b8a9a28fe54bafa352302a640549dbe2dd3a22053fcaf49b0a32e42073340aced33f9b3ca5ee4b098982b3e0b14a864877a38442c149d09031e974b92642a0e0c736c5fc63a15f1ff409eed426a6679ac674234f70597db5bcfb62451a3bc185a8ee649ba29e082758f3ee64ff7b3a68bd092ee55431b5e8e4f94d4db019fdd3645e6a4f4d2638f59758ba2ca9fd10136c0e6e962aa86a3ad9253879273f830a5132a7902538b7aae41f9a45f44ab09f16646fc85322bd9634b7ae3e097ee3faebe9cffb133f9260527e3a2d6a234acc23c175d61c2dcfb4165a487015761f43c8a052c4a047f0174476915b11a3ba8e6037e6760d2286598c368293f43ee249533a9711ac9e5a456c11a96d2e82ff4a4205957e2ad75404a74ac6dd74ffa85f2682913104d1a33aa2990c22f8daa04ee792f9c6c2738833ea7bc7102891b1f772af5308c6ef53e9484944ca09c1760c4aa8d1f126c02018a55df42475775abd092008cee4673a61fe23e4a809100836bf490d299dd4baa0260020b83eef0d162d2c784e13e00f9c68eec578e9cb33dd04f00313f226dfa46356fa7a1d40803e70fdaae555793d8a960f7ca89c83c8a7ddbfee1ed8533a2664ff27c9ab1e182b8d225cbf4d4c9a07269e59b020647b87140f8c502a478a3596fdd33bb0218ae6ffdcf4aba71df87fdb10849e75607469124ae7ad9c7d3af0a92798a64f4977690e5cd0294ab6502b21c6c8811bdb507a648d3e691cf851b5a3e3a83c2584032333d3a95fe40d6c599239ed836ee054ccf27b450c53b10d8c46cfa4bb535e8e1f1bf8f4c9a37e1b9244afd7c0ad5e4e509e1af8b48dbdbb9252779706ae425c2de88b896b8d06fef365c59c381e72aacfc086dc78d994a87863b51958fd98eb4fbf5344be0c9c9b4e4fe6fd92813753e331df6fde7d770c8ce7a9241649589eec8a81c99fe65a22dd30f07e2295debed62475c1c07632f97f7fba5d93fb052e6e9eaea02c45af5c2f70be25bf53ba0ddd97ed026fa6f7d2225ab0bb2c17b8b4e69daa73251d25bb0526b59b97855467fead16b8cccc9723699294b4cd02af31fa885930192fb558e073e8eb9ca87fbafd15b8ac29079dc5ad2e7b2b30229e43b036e9fdf12af0df1dec6490ac224a546033849482f9a46c6a4a3d8d9b72ab921478d39bb3461b09ea465160db4fd53ed8a649395060b37c54f0c8392ba69fc089144aec4bc809ecba68f8abfdff649bc09d90e857f1e4df4799c0a88adfbde5934a2f4be0fc42e5de88d257224a606cd773b0d34147962481cb4f2aa2aa4dc5844860f4a5dff020fcb67447e0f45a963693a4533d3502e7172632fb7cb3e6b4084cd0542d2aaffba54d89f07b4abca0623f0436598aa2eb34a488bb10b8917ac1f4aa53043d089c85a85dc27320b0eb5b17cd6bb3b9e807ecaaa94b0cdeff29f201df22a3c9c8d9267fa807bc5e92d57f5726f38707ac8a4e9a4209ff08393be0f488a42dd557c8bf75c004616aa7195295da39e0324b1635ca2cb969098003d6c6a4e8e9ec66eb12e0066c90b4b6b6173b882c016cc056b0983ea5a8854509500376cc2f5945ca909f24000df824c382e6537b92ca59709ddfa53b424a7e1759b076a6b641c60c522bb160537373b5a5dab44ac28271ef60b28469935992af602bfa75bafd75c82d5dc19767325532877c3995ade064a41cfa3cd5534a252bd82832e56e92af828ff77f27732d784852056726fdad3e948e3f4a05639bf756648aa71ea182cde5162258c58b203a059f47f209a5644a326f53b057693de7c71cdee952b041e5181e942865272505ab19644753fb9c951c05ab9e7b629be40e188028f813e969292d9a90985070f9b369b3112aba33a0605df3080de9ad82b27c820d9ea2acbcc4ed2a9ee044e3998a1576824ba52767df585fae71823b4def29a538b6fb26386df17b4f838d95ca6882179d420a3287ce142d93894e49ddf7cd31c18810fd4bfee8a5892ec14634f330f75882d5887942eeb7128c58048fda796b2f4b09d64b42889663b77b26c1f6ada5e7ae24f5488251da368904275cafa4e45ff59c16487035bad56b928f607f37a7183db9a4be388213b2bbc472d48c498de0f2ef5a2df3525c0923389d2ac4f4b499b4bd4570a579d3798cd1f46e8ae0bf2fc6cfd024a94f04134f5d4cc92cf305218249e199cba2e6113987e0437f4fcadbcf905531047f52624816c5358d5e08c69274fdcf55999a44083e95a70f593364af67105ce6da82e0b296ce9cd492403021e8da8b360920d820f9435dfa482195e40fac961a651994702d11e2076e74aa3269e5153b47fac08a12cacf54be897d113e70faea6a748708d1f13d70da293394e4e49a263d70d9572b4d06397ea53cf0ba397a7b42dea04a78e0255be5a6e5fd7fe80e4c7c5f4d13f3b8396407fef692a759882d1eaa03ab55c2237be8c046fdfb1c648890b4670e5cfaece6e37127e7550e5c921d446853d58b6b1cb8c929489cb89722513870912708cd19a2e4ade01bf894e9bfb265ee0626a8a50b12b462d0126c03972a752911dcad830ed9c0af7f3c0f31e5f59ce11ab8ec987b29c343c8ba1a38fdb739bf47358ba932810fd020c100d2c09659ba9037d9b77fd0c0a88c1c84ec4dc163e70c6cbacba944e47676d70c4cfcfc94acc192d4b60c5cbccdf849cc92a62819d8bdec185449ddbb730c6c4a691e1273c8184d31704a2b881034ab4ac78481ddea949426ffd5b380810b1e3d8bc48e6842f805be4b822a617b810d6d3a5a43e78917ec029bd449cd1e6348ae8f0b6cc564a62fb40546a50b6943c94f0b40184016d858395c6428a1165387055eaf45555cd7d45777052697c7ee4f1983bb6f0546a89b8a14325ee8be0a5c341d4beaca2df26e546034d9d88754973aee53e0b54308b9a69b774752e03c6ccbe2e6f5e09e28f0d1ca74a6fa483a7aa0603372004fe0b3ed56d079438a41ea047e937abcba4e96f45e9ac04f2e254547caa55e6502e7d9efd746dbac93b6047e4350358f9272168b2981c9196a2f51f34a12b124dc5929a8a44c6848602c990613f61ad2373b029fafd6f92a42cc296404f63b6e124ae494497e8ac05f87b2e021a6a63d4418c0106c86090620044647b030192369d6741058fb1e151d2d6e9206022f4a74fc983b6e08fb078c48e2f53d9a6f93d6075cfe911ab3d268d5b607bc9a0c5db595079caa0afe41f6968cef809131bcdd2c7e854cea80ed986e25541c5d269303de2f8ffe18623a6d161cb039fde37a5ad0a32637e0f7b73f834a9d43fa6cc0c9f7cd394ac6b425ab01b79b7a5574a6d8e901d08011ebb4ff2131df320b269d5abf0c9a6a4177a11690210b26554822a5309142751f0bb6ededaa72c5b0711d169cdf7755f06841a8ca79057ba2927e4ac2e30a3e7de6f2fe2b916de956b063aa6962bcb4b7cab082f532939e2d5d7bcaaf82932cc1335a44ffdb8a2a028daea8b4b065e2481c0e0643c150300c86e193d305f31308001838268e4582c188a0c9c27c140005462c344e3c2c121c2222101a87832261181c08048461302818080302c140201c0c0fcb0a3d0f70ba8f5f491016d864f976f89f9f6cc6117429941c168278c0b9b07d0815e404de0c45821520e670e1e5139aceb8b6510afd64fcfb39e4ce9fbb2013ec291e18f7c24987cb2b154ec964de2daae97b54239ed0ad7351dc81fbde55ba856e92bb72ffbb4b17c79a275646910142c82f341eaa41b97b68e27ac682828f1c8ed83a29f60620933f7c98077ff8c5c23660953125fc191e84fbe020fecf5a5be93f0b2486d02df86a78cc77b6b8e483bdd94b2bd69876c18ea9c3e9b8bfba31ecae906f3034c80c7a060782f402fb1d7c662be5a09df06fa80eac0bcd3aae9906d46562c1d45d0c3f2365681b6c0181b3efa37c48116e0115b0e65eb8022fc6863fe4a0d763f8b5de50f777e8caca8096f7719c8de7cc137b751e9237f21e3cb55f4d48255409658606a28d3c6a5412880d5143821c3e4bbafbc486aec342c3dd306a78126e0943c014bfdf2fd9ffbc768945ee80761076b837d7b9864e17dc05fc42e2a17a082bb419ea09417942cfc88b78ac3db41025e402cd790bef83b7f570dd4f45ca0b35c1c20e81b9503d647a987a15f4198c099742e804a3b7063ce5b68c772b397239073d8303417a81d3ce2f0b9484a6c08f50cbb5f9557c4a2e5edb70cee08a250e1e1d374c4933347bc6402890220472ac522af9fdd060527b71f1474ca16e3143847d0023a34a28333400f989c245b4c8f72f13320909325cc1b101a820efbc43c2d5a4655adf62fdfc53d0f5b676af1c79cfd00bfe584299a141e82fa41eaa87cc1aeccf08436b9da1e03067d8273c02a7287f9a631cf4bf3f725e3cf5cfc5a076eaac93f035292c16b610ca441f2f119c84a661ab00cc102774121209354308a15dc876c2bf01dc48c5f7512f285ee09a81af08882f2eb120a570cf3f5ac4e9a94703e96d4c5ff2c32cec270550797e4294904b8893a0065426c1af2b1c83ec1fb8460349ff27e0a12b72a9f95304a5fbc2d961f4a20629415cc068e654e214fdb546c9c891cee1cca69d54c4a07118669813ce09e1de0915941c0ce00fc382eba0d3a06cb01a44014e82766a5c03693bfcd7112c0272d12f62eea86ff4ba7b6fbec6b15e309a31356a6562f1ae8badfb56acadcd8aacd5cc747f2f97081490c712fa1c5f8a39ee7d7220591a2265feb4b715eb5f0e2ab1021add3c48f29fa4b4f451ff77bb3c8e8c08701c73b9772e720a97b8b690712a86b69c3875324825807cf72b681be8888ad73b25e053ec152aa72a4f20447dd9e25f5c4f910f5f588d9d391373a491bd0f4807514725378a640fb1cd88b9917cf0329a302a1ba8b535dba013232201cf5a5b87e2974edb1eed80a2aad8f699e8aee1773c94cf5df2063acc00c022b9b900db54fb2fb96be32f8bc82d66c77e572182a8c777095db6e84879f0c1c4b91fe6443a4ad5e4722d66fce13534d8d5ca091de539a65b59985e316c2a8cae81fbcd2ab326f80100310aafd155cb3bdcb99ad4ed9a9cc445b593f849c592be9de4ad3ae91a3ce030e74ad4a5e55c39d6b5faf9597614b79322e58f91828ee657da92d9531ffd93648bbd4a812cbfe527ba142e6b4ed819d968642400a1d9e8150b031e7653e983d2209e94f8ca91f889e33ff6f624ae3989c830eeed45ef2dba9d90422194841513e6a2d06942a515724111cab1d812ff6057560d02cf3f4a90b1ec6bb134bf5bd0732520061c29e3113b1bc40f61607a7a08c1848c4aa153b27c708c8aba0d9dbc9f713e81d7ca9032d8af3396d032ac59ec61a1340280c58d192117ea89176d1b7b498168928e093ce7eba743e3ddbadb95acadfb5ed98da9af6ef7a3db279ce88a6a7e6af10cc06cdd5f2c32456c144ece54c0cc9190028d80926471a24623796b91389ed04f6c6f566d0e16ddcc8959a5fe8e509032ed539b38d83c9c803d6dd24db586f08fa8f2eafdacc79eae9d06860c42e295e0d05bae40b3e46b314daf094539bf80180c0ba573ba1835ce2964cac961a85e3c580c5feda6dbcaa94b5ef2850c357302fc11dcffec3860800fca504e407b72fd923b7cb1da25148ac503fc90d4b3b4e0464ff9ea0dcfd58dce9ee043c6f49b1ee0c1e9239c8c5a547805f3d4504601493944bcf9307907d60182d40802b9a1feb9638a14165650c081d046848e0811270465a18a423908f9115236217d0a9cde4f16ff327c68710f33dcbbd31c94af58edd4686cefffe637aefe4b6a405483c7499cc2e07035820a26473d083cee6b561c953d1a211529e8d3ebe7407ad73fd316328e48918d144de870ac3221ba37b63165834b3125ffeef762e3434340140c7273b808311b62dd835191475fcf0f3aa7c5aef663dbf6b955b3308e298e85e3acea2ec7bd46a2f949d805b6492bfc63818d05a83342614185ae81061a9a299a2851a5aa490088d80cae64deaffe05217fe3b47893f8664bb16c2835e803e8e9d1f3927aa60a5aae012d3c5751a50295019481192141219ca4ae09b6469bcb85f67ade63210000e10b4c56ad48c66aec4a5b1575b37196a23dceccd8811d41571ec328ae81eca57a7dabe1a4f635b5a10905ac8b32611af6ec7c027d574a090559633b95de2ece656234bf422f2f9621e535a6e3940b322791f5f99c4ada6ea2e1ec3e5b4e715a660a646a68faf9cdb92f5b36dd7d602bcbe6cf4390bd87626a1618c7d9751a3f40a926835c23d525905d5d5be3b9ad2c6d8d02256d755f6692f0f710c054064598e0df5d47e94192eda34b7c1603c8732d6deeed3e9efc0ffbaea61e78ecfd22a2214e25ce8150096d90ca5296849ab31629926554339c101dd6f88160be726314416170260887ee0f4834dd18684c104d2fdaaa53e351d64c034a730af7c3d3c8ba64a11d6c121aaab4919fa90994ae1d7443dc4b69dbd7daa9054592532b53c10e36207650e0630c1776d9fde6ed60a97a248e40f4a42ee555341d860e64a3d13955da00c5b9eb23d732a908474ad49d80f2b0d767f813add37042b30ce9dcf8eaac7d7f82f1100cbc123cc06206fd97e78d155decae172ae58a8f6decc3103587d4d0cdbc87722ad7f9129bb66ba0954f4649f4e224c362b9e31fa9f88538d8c39d3051d2b68475da531fc0094ebd60c52ac2e38170526fc4464d64cd387fcbd677f3ad0cf71031c179b0a5a1ca049b86bdfc1b55b8d926340e1e42c7e6d3f9c345f84ea7e75d7f9247f8e116d9099db5cb9d53ad727af78fe0347643149152c5e665b8b402a76cb87ece60107201bcccfea7e5df35d6ae7f075186a3531c667295af6ed3fad1e528325c56f5dab99cbb470d78c502bc7c43a63199b0b8c573ba3a3b6669dd25074bfd4e3e6b6241135cf710f0a496b9d9fa1f89d68504cf65da483262183aa10a9080a7f95c62ab7743b55754495ca2361141f35b27d13b898d4fe498819789574301584fff2be37d434f7dbe30ab11d8f603c4648e2a1c5e36ba86d0252a504ce2408cba2e9338bf0791b6d2c2a9af4da5d051c906d5b2f9e86cfe91abdb7ff281adf8f188dc48c15624d70f908f33d9d7e288797b41b5846f0dafa65b4bc8d81653346ebfa19f3cfec6e3c743c8306255eb6b4addecd55feb25392f55597f20db544e1dfd3260d71cb5d44563c657a365e580bf8df1f9fb3383ff4d1923012272d67427be0d275922c2da74581c7ca846600397a2e58ac1548343cb0b75d07a946ce2ca9f2cd5fcb7d3c642b1bbc4a9890a6e16093d3cc641443b7464584612baf3bc824341458ad8e02dab48a833d4b6bc32822a4c17e03ed5c4b0fc9cbb95968acadf06880ac2c6b14492faefa1769b704c89b202b27f93d3d2c675951c6f32f07d9f96718d55285f25be7973aa2adc73aa46587cd51353b1f17b3f2f5279aa86210b5a9c3b18bd4fc878020f0d2ded14f6011188453b857bff2161ba5a6c73040350dcac56f6a0611917619bd9ad03a4ab53ac8e737b327a2fcb86e38ada87f115058f64b4fcf2798fc10e690bdb636c2adcf0355b28b9b09110c19455d8aa6d7121b28d76797d2cc6ea797dab4b87c376127b7167d51d2dea67d7f288b4d10442a9a817140106ae9e3ad25041c94e40cabd467172548b8e5190b67346aaae4ab45253f2aa68cf3104d3982c2912e086d4681bc55984be9b8d2e578e69a8b2364dc8c56a038cc7d7783b5f67493afa521eaea6092d4b764854f9946100ddf67b775b42cc84245dfd1152893d2d11a3a28c42d52a72fcb1a833654a8a548d5854e725d4c09611b9f77b0356fbf4cd4aabe061134a0247667b231855219b21d394e66a3a8fc3b8d330aa1c60fab3379f1a93d3c2323c2369da8493e746af60547391ad642ca084c4cf179cadf35ea3495c2694ddb220395bfda006f6e31119c7e02d0d66cada4dade822b09ee8601c3a8d0867b09b7a3155749df05fa874d12ce557e3c9f9fb2518c31a1e86686e597e20a72b5a3931883fe62671244b3ebba5f291dbefb72fc9190ccb37016c40dcb635ceb0587a3758a6a3cd6543d5182f1982f0347fc3da6c69bde2b636f27cea1a4fe6d8cca77e0a54e961bb4a01164223862dd4181010e353d3ac76c414c3d2ba574f8a12e4d0da148bc0fbdf07f41f85b2cb699ea24c5ce5e8e9d0ec10cdcefae347e3c4f2dc7e1d36e182f5c3539a68c01c94a2d2616c626236b221ff9280f9840b299b1dbddfce77080029fccecdc0ca27826ecf4a2d2463ba44f33e3ab6069f4420ef133784a51e4c966cc107274824dd62d0caccb80b936b01dc483035a216c6c4a3c88274d5a2179f93c3c06b42c1a44249a90c60de23bc4314f3b316a0b0fa55568f668a8aecf609d501e29e9277aec0df93c809f9638c40d766a7efa69528bc9d140d52a9b453c939f6571c095113098ac0f2001c41968da1529510d14f915c25bb1a416e5de4fc818d5769f94a55746ce3b499e2199309f965543ea3a25cc87d35d8aa2e8528e878f0ab7bf9eb488947eb87551dee5515f45554a98d2edca78186a4127ff35ffe5b4650e75d940c2efa3f9da2572afac1bd884f1a87a6ca08cef4d44a065392a0264612ff45c229b3818c49a86d28f9ed3acc37400a2aa010450f186d58b103029dfc21d456be086c0f4d8aa5c8f75d79209c419c3a92dba7af37604205779f82885c043791c7ab58cfc4e5686fe831e62cc821d84a7a992d3dfd1f5528c0be028cc66a8d13b58b59a959639e428cf79b244e13b0143ca6c568e55000a3eab6220ae32552799f898ba569dafbfca371507e0799f2a873f1b8590dbfe9104d72f481b53e1264eaf7d617691560a823feb120806f0c38bd6f81d6b029e9fb0fcf1be4c6e8cb494f8ee4894ae4de48857a17a64ef09a06160b6a3cfd373f8b0564f6e364625a9f698e29c4770d7e58aca888c1d351af4496ecfb33ce83a385656ab9cfd8250d6171474f91b92a3a9f57312493ee2f895f6d2b591cb849ca9c4ddd2ea73e29dfc7a3cd7e70a9b08a601ca7f4efc11b1ee83965cfd819e3323459c45ee23bfb0914bf361928412b0956a130d3faff8a0a135eb985c1f0c2847f1a0dc1160072b506076f8c347a7381852e0083ae2989217dc6b735946d5e6bc029041e780d9d72b757e506cd4e08f5c7640c65c997ff331ca9a0585f63b76c38715f5dd4f15c82ad2e68e1e450d5ce7ac2df7d175fc65a0158dcd02dff4565d8ac24ceeaf885458782c7cdbe78407d742c099b77d4c3a3405b58223959807db53f9a3e62d9c1ecbe31fad605cfdd4778bddf4a4a8cc8eb5b4bfcd18880d8407bc56ed43367b6e37332ec8b9b293d5abd92aed8ecb341c526874dfb6d3ada44b409caa6924df96d72daa46893cfa61d9b3cec66cc096d72e42e2721e7ccc2ab7d88e336333af546f03374c357f152153c391abc353c518c94055d0fa1c072bc965cefc95e1c6471578def335f1a371d63f62217f7423ffa45e36d678c97c265598ee00701a19636308103c6bfb6bd220e5d7b71bcf61d3e83f1efc7cf9169ba9330c7a6330cfdc88404af186a05be6e90e38524a116786b4585acbd4026c64ccd092acdcad81640469df7fb0c38d690a107e1cf7a305e41fbfda779e4aa5a3cf11d3f0cf208d4a2d4676e2d123be85a9b62dfc6205ee359cc382ab5dde4ed6dc08fd39666181df734747610c207b2d71158fe8e75b64ac8de9528ef107d27ee5bdb83d88d6c328de948c0d92b9949b6c8e4b0ddd6662041da419b333240515dd66718226336a9728fb205414515bacda8e0e8888833465108b42a7da409b4faa1f4da78b611c31ea4d42fcb76736363e651c0ec1a097d47561b581ac3f580378ac39db31f9eb50cc7978e8a95c76dc702a4f83032a80f3721119e1a5c15aaac7379272073e52cc7079aa5638e3b0eb673c46c6031a58323be060cc195b388f0e45b1afc45e0df96f3ea6e2a955d97a47343e62ad193f6391301541db3ba6301b3faa16466351582d9444e695a5d178ce842a6bd6f7a92507c2f9243a3425df218082be8ec18f288384d2e073ecb93a87212bcacc7f4bd470f2ff7a4aa70597f52b4812cdb4ce79298246b2a6ac9b1114db1674b65f44012c6e204b51476eeb1879683190667d6e73a00158102033024595516da4def680cc36dda08f18113e6abf6124ca84915a7a810125d4bd0b78316ce44c95200b0f154699820411dcaf534c49b214ba6a218b991be40ab3b5e383db51972fa382deb818902d46f16ccaa034dbd26601fc97e33b5b536570db41eb00dea66509be6dbf65fddccb36194bf20b4cc371e0a080969f0fd65060bf0e64ffa3928e36ef5fd246cbce35539384836efd3d5ca23c473ebcdae16a36878f3cb06abe378975d565e0390c76bb50065d890dbd386d07a044f6354f9272812b4eca08bd9365b47b1be49de0e3b3886f16cf314641ffc15fc508f46efa923a094f3a8bc375bef412450298879b4d748677208e45769e5c8992e75a1f5642b2aad4d544bf02a72efd5d55e7ddd022f8b0909962a9b16600607cb0edfdbaa4b005b6a2468d51549d2cc3ae5764747baf8fa223eefb5e73fb886bb6b4137f7368b34a78fd16ac34eea55d574c339c0b9b48e37acb522f50dd37859a2573afffdd9664864ad496e8bdba7da1b36bfc3b626c5d212210360872760727ef30da783335fe8b1737c41017bb00ee45401ca59b5cc4eb9e92153326314b4469b3556eab840fd0c21e8ed94afc1585c2b84d973d007ac707ccfa198b0e02a4f1858a10a54a08fe0c67c9d61c280cb6a0b72649f15b6ba258e1b2ca093042dea9c5f46394541633b2ec86a17014d230bc6ecd105b753cbb8cbee3c07b59bb7c800fc0ebaa46f9dc0335ab5c13546de116806b87a2bddac8e24c609c0b6f5f9304197a0db82d6a3a4eb675212685b89d1a64972b656dc9c6b691f30713708628147ecddefc1a18aa860a8adae579c01463f9a362976d069aba9ef7580866639c7481b9ca9933445abfcdc445678839157645b6f9949b0dbedf07447f3b78b9352915dcbdf74ad882ef2c6054bf4d017e90383a1817fe7c9c5bbeb3c7a1976b22874570436d64332500b67a511d6308ccf9f1230493dfd1cd4cd03d3a6cc3ac93e14145b7e368d87ad4fa8b21436071b910215b571658a16647bc7b64e2758ac084821ed9f00122b45dcf4bac0039020299be99987d90443e68be7def628975479732951dcc4ad6b315e19519b3f7eeb329adb56f0af64168e669a8d7ffbf51d49a5e20c3a1abd676e73ea6c0ea9ac04f7cbe3efbc8007f219f69d05deb114d617d0ad815833ba716b12c16467222189bd1102ff13ffc759ead670b5b18868dbdac8a85750fde785e1a23def49794d5621f06f9826b78c9de596cacbffa02fc41a3e0797a160bcac175a710e61ef9e5fa8e3df44590bb2951fe048140cc9afc38a1db64005f3c8bf8006694eb8abaaea883a72ec2b002eb82d5d394c87e29754bd29403913b45c39169d5817400a1f924614cf8573904e5185fb575d2f4ced6d452fb7e8d5086676cb48efac17063a740666f0a2993ae9a816535792355a989eeb3265a1c62dc22de1a4a7648672edff76dac6724b005471ab3f62cb282f46b975eb4097ec61a16b15491a77c17fbd01163f5f219c1df6b953e4ea807edfb3813c1fb4ce69caaebd4693e26089392e6ba5b6ce4c8173220bdb8762ca36d53170f2f1ebc4cea5e71a82a1ae95f4ad34e81d1b01d1484fc24f4e9df436d0c73a204297ec1f716922e77e7d8769c61e94cf51c2ec5da082290d98c83304fb0060bbf7b33abc96cab0ab3117b1bf6b125671e7bf5a6bdcc532752be94c66d0c0090750151f90bdeb24ee63c26f540fe6020cdfc12fe2f9eae2af22a68d70b15ebdc4fe626a6a0de792d8a375e826f45a848181888b855b1b73b213ee52e0843550179e1c0a68c6b44b0ff3c07f309406e75fbe33d904d2c3c940c24281a6a46aced01dff8ff905128a46165688380e0c2d209a4a109b1bda1614a5fe380d4101eaa14780a43602c14358b6567ad16b58007a1a23d433124b0d888c6ca6fb8fb083f403010f3911c06a034c033b82162f797a4f99b7ea3b6a41c00053b4df0b803d0d99132ca704882dd4d20ee014e0de7e708f83e974657f0f6da0f8c8adc6455792fd900e69ecb115f9185c626d200a45851c6ee269deef68858dc0f5309ca795fd5806d6aa533e1d03383b27e1d6b300040f2be852349237d1ac4fe182cd00eb1a5c73155c35ee949e4846f8d95a89c7d556d082427b686b4fa1e5ee01da1a961ea52b7588836b10e6101145db80d327d0584393592bff00c37d0c7b0f6cd9805d1ce70bbdaaaf68c1753477dc7a175ae0a0254471ea334755e8f07104d2733614802d63b2772c7727e22a3d2e369b53f5a8eaff865a68f90844a65f474e0ffed6b9848286a93331f8b57a515b1aac94f4b1c4b75e99a7c5140efdfb2e82d2a4a08adc40b01779ccdedda1a5fe6a4727829a79a5d082742a0771ec88b82813559635d0e758ffe82c80991473f724bc61ab29665c8480e53e4d4bb24ec1da62984b4b7799a3c10a2c9bab4d2be89bd0b971d8af469aacd0673280eab61fef85d8119337f68795f02571822c5606e764a197534e24140636ee8299a2c66b4bc1f019f9aef0a91619cf8258f972182f4f0032c9dbf71834c41905879c655c06dbdc0b4f166f62b38f711c86952943947da12603096f5c51573db48947358515143519087ba37c1c07d6be56312e29414379b8c4e1882f82fc2da19e509e400167febf68daf17409795f045f1b7aa9a09a5c25f7f21e0074921f1fd0d0f7a35dcb91a0e1640aac10c004c131175f4e93fe877897378ee476b417b1d9a682edb8b454f803d681e7df350bf4bd9e082b48ad60e02a032df1586a11a4b4916e19803ac6a0e9b2f2ec24a1e0010f0b3e12d8cc7a97ac360c586bfda0b4487e1ac1f08601acffbc4f291016d0f510368a51eba8b8574ec2184e4eec92c311c486bc1188fce8027434708a46c2c3f21e23c47e5d5a49e9c20448ffe258c98258ca7895d89905580a01ab089161b1942121c3d2d154492e6500c30032b7f1f0734b2f007f97e089e18f657d045c830b8c63b159a62c0e2360a3081bf0668c8ad6004dd9ace0c15601571b14e954c64e65133f07cc87497d7548b2f2f0e484e2e7f795cd067c464686548668f8d81723b8427d8cf85d74ade7e3a1a36cc6d140f73cfba4fa88c2c7df0548762eca7ec398889d69e9440bfd278419e7bf81350c4ccf000f2e83a5e069e2839a6fae4f8faf1f1f24be217e5438456928a1835a9f5d02df7973421512e1c3a6f7712b583ebaf2c02764d7faab2971645037b17731bb2f3d408e4cbe348a730714c7942f01ea9e8187ac4b320e20c24199ed9b549900952562fbd7434579645c1788b96ee5ed4be32339a3135f52b209c90ec0fff9e1e26a908642c74a17b79081190970517153859d2029c148c457c04fe99d3dd1bac1961faf4316f2f30c221a26846cd1b0486802e63df3143f6144555c09349abe3b8521638cc37993c48555ea5f60de1f857bc366d711f17f6890ca5a22fd6ac4f332cbb5ff5ca6a9c1e77c98c06741a34499f44d8c6ae074715a0909283a28637c1f24f5e7381a1293fa8e753d36ed198e9ea70023c3cb8be0e7f7046382b1d38d61b4bbade954f907d3c420066a9cc37c5906bc702693d6f7e9d0666e00cf7d66aaa58d5097c1b63b20e192e11214076b048b7b23c765f3b379a00b0471a5a260aab879057cd630cf0acdaac222a53a9866da61c97841ea67050addf463d95efb1b46b06a21c717624864a23aa2c512c1087530c60549623a53df694afa694df24e9ad93fb6a2b5637a187d9bea30ea90cc0a245215d26bf8cce53497bd00441e1970918924562eaf68b547b0ab63d760205927ba5451acd96d80c51edfc163247c3f0d7fe939c793bcc06601dfa1ddb2274448c3a6279076df8b779753685122d2794a99a2598b14bf2c65b7a1645aaa157a8d002eb3304a59e0412cf8d3f8a08c283ffd9ed82409897e26f5c4828772659ab347e22d7e921a3237b51b16ea134909f332474f7cbb3658a9f57bd4f5e45812aa9767b7683102993db0616192740fab0809566d6fbeec361733b792e475d96b7b26bd2553d603da20f78400fcdb5965fd0505473174ef239cf39407c7fabae2f6662ac2e3ed5f07184584dd223bc8fe908a4ef10182ed367f32da45153e78851d45175cd954598b5263540bc9bc4dd2c14ff169b1d5aab148f0d0777c1c321776f0d5dea17437a111371e9e61bad0aac889c7a93f09693fb519c96b452a7e486fe9184ea4e906a35619ac5fa45ec82e07870f7090cc049ecc624f37516cd9107920635d45641b65b45b4a1ef581807774a49f31104e6971d4c71413156b29b14f39d5fac2180d2e6de38004296f63410232d95ca1c11dc9f5b546423f6e9dd8c6e4bb659b254bcc2482ad9328d1c44384237390af69c2b65413d703c9c9e78d588adc82415b55933a0d42d1dc4e4232039f2d369bb16ab214b2869ef1ff231d7f26ce8456fde1e559af494db7d3df30e3beeca0eee54c180e6c9397894c6afe93330ba25821e23aa9edb29aa939cf10eca3754da50d4c6038edb04adbc05d7638680318f5183cbed609baaf7e3c5bed654fb335ecfd76482a56b98005c10206fd665ab4407a525087a29b3d42e122a45c9e3f743ba6ceedc466a3e86305a39808ca56c04cae69a7a205ee907b72092d4fd889c33e105ed56e485e14bea958ba6f6cecc7cee673cbc84bccddc662c2bdd334752d9d5b1f0ecd19f8e3a01e69f44a27a7ea05e16ca234905d243840303498212a83f9615a984abb1309bc07eb64ca98943818b9de52ecdba481e46d4b64f61d471af7e0c7b0e054be389a8b1b7635c284000085d81684e831b977f0a18532dec98d1883d7561293bb43949408d057815d420fa1462d3b16f417dbd0d94474016c3187d406a14dd9cf2700f21ce0c4dc7d44e8ba2d66c911484b059e29392c845c795f5e319ae10bd6fe2815d6f15787f08118fd6047ce993441f85648e3e44fb802848429e33eb08096d46aaab8807f48ef8e3f79d602445b4c5816b9942fd7075b7336709e2232cda8415e9e224dd891441bf4849f9678362744983b0e2348669bda4206986721d6649afb7817dcc1f6a50f7a411a2241984425887dcc03b83ae5f7ee320f4844dbab088553f4058b2771226037ce7faf4073f0f6800ef4a8d69f73256cb707b152bba4e470d57ce9c142d9f288fecb1e41418f2ddcd5e9e5e4d3bab4a23833d5086bcb4d97e6b549e465cf603643e3a523b48e83b7ea2f3a2d1fa015f2779fe271c6e7efd34ff100048dd842571ab924add6256e142d5ff9f192349151ad215129946e8ac62263165f27cb58d0fce9771b92fac71305d48e56a627c91dd530e6dd2d8dcd4c2a8ce0ffdb1038e75d33e7cfaf85ee3fe31e21ccd5789d53c9c9c8ac0e58456e81ef08203088b04656a2f6c1772158a21602fb5ea06f5b9a85e3d033d9e616343ce928487d5fbb87aacebc0323bcac3b41faadb610aec92a3777686a4f7e9b72d358e7c388055975afdf31f59935d8f17d9019d41cd52a4da3755bcd07dee3829ad370808726e96a7689b34f59f2b93b0331bb068990770b5b7a74abcf79241788ae04de0a3b1225763ceb094535841f5e22a9f26efe845601e7f0fedf8c0fc8c4dcaba9c98a06b8369132df4254de30e5e641ba45ea43acf7c410001e92a8dd1017c4ce3bc09fc4f7ac11769b14e0a86626c7106ec6c498ea7bf3e975eb3d090bea00ea65dd7c91808b0af15221fe364a398b81bc02c4fa6c5976088717eb70603163870be2e2010359a1b18472194128c47782a80255c8b1eb3486a8122aa1a2c80a870b1d24842ed7367245a1177a0a670dc2e9195354056fce67b608ac6dcd930e007c873bd9a3b950b9cb0b634b7fd8ebf2027fbb1e8eece5b82580edc5fe1fb5be43fad4d1c4c235f6b8376124423c2b2ada5cbc80b0a23a3f571d6e9f1dc132c3a6f0c5bf03c5be074ca18c266c9ebcc9da170bbcdbeab38ae09d061c7060f1886d5c6fd292ab2ff6b0724683b17211393e8832ba08d6544a4094ddabffd05cae4206813246f5c6c20d134680dd3a46285810fde053033d8eec23708a709b17218338e15af105d5dc938c2d4c52bcdd903815630bd56ab09e79a1c0b437343d4dab09e282a56f8ca297a8fb409e3eb22c561ca4b9a30e5aa490f90811c5b2718c290d9b4f040df8a3d01e70d4d8a0581103cb713db0d670efbe41ae8dacb2408d2d1987938651a2c2e850f523a642df26a789abe881ae21d07fb17059c355cb0a945840866309e783c5b7590829ebb1363f7d38d0cee8f05c27e102e268d47c7b52f737e0a8f942846c1f1abc1a9ef4a099dc2893f1ca01a0458735765c8c3f08970e59a4a33c3f41b870d23d9d772956e00aac8276152022d503d578927b9a4d0618425d3de94bb6ff87601e68630b21ac07eef95c708b0ce07d90a80dfca2ddf3c7213140cc1568a30596d1bb093fc64f85ee6e68ea7292d435e11ee041e13407c11015a6a07386ff668ef2bc26a7af9467f672845016982dbf37d55f368487ec60853ae288ec3037bbde789fd0102a4b25d120210fee66d60370fa2c5cb6b03832094ca8b7c5db58695a0f55a0e8b80dd9cf61ad05abe543af922d094e8f9bbace9a66b18e8185a2717ba8f94cb303dced1e55cd0ce2740a822a44a71fb5625ed980872cd5af1f126f16f7dee4d591b142ecfc77ee26d8f89b7aa5eb9794dc1b98c7e3e473a04ca094ddc8f92abf9147b9dfc9939a32441ddb816c551eff16163beb5ac283990d0eaede71a5b27803c4e21a3fa87c633242ec80af7d21883296180f29751338d08a21072cf812ad73e699ec72b1f5d7e2c62d44ebd65a7540a0da1c514da27e5ac6d3cf13ff5499c161d86876f49659e7c90043b2324730db637430337939a52f5fc28fa2b870066e3b1053fcc6b80dea7b5a179233b810443514a2bf0b5eeb1f533ce1c9c3397cee5b0f5a3cde27d6db953bdf87a7c99d10d165ebe381fe6829f61f2c60890eb7956218a0d0d6922033f802638d5076bb9489a376b6aa8ac67f25c4280922dcad9819583756eb7714b40b86bb8adfc21bc4268a4f8a1cdf12708080b7b98456eea30a55a6ff8bc5097b9e586382c47db412e438de5bfad90266ee2639c3dc2bedb3a94f9a84dc0b8859014486015382105ae040fc2514ec7802fe4044df0a3760b46439330f0f0f0f0f0f0f0f6f706ba4b6d6368024a49424a9adf153f8ee9029a594648a8433d417ce4cdc86362184d1863fda080d02010bf40ac50ac9f499f2b5ab325cc1873eb19c2fda07c868051b529a92123cf3a59820b00219ac6064bd6b472a993a476d6ce001362820011b5bd880c0183256c1a43e4f3166e855c1c61acb9f53da53c19f680d31c8fc7ef9265430f92ce750ff21afa77b0a268e8a96c73bd8b6ada6e07a77f46be99c25eb2d059362481a6aea99de1e29b8ed9027e4cadd28f8205a9265d09e29658b28f88faf7fb6d9d3a67c2818d3f8666a440c146ceee8b952b0de0b1df904bf25748af61bd2a8c83dc1260b59c53f923e25f24ef0f9647a8db69fa4fecd093ed8a866ad64294a3a6d825162c9dfe228799a9334c197902c5a24277bf55226b88a215a44537f25e208136ce4d0f71f73e275e55c82495a21e85e907973722cc1badec678997542094d25d81d913975ca5ea276a504b739a9c99e96d6f58293e034b7492b957eefc59304a373d25ff59e48f06d25421242de9f881448705192529f839074df23189521287d9e2a6d8a992378492a85a44935b6ed8d606c5c536806d5604284119c34d3bd2d79a47fde8be0840a26b2e45c5322a22a824f1354aede4ba52e272611ec560a22654919e97b47049b738a0abefb15aed14370c13268bbff6032a225c3109c14d1993d665536e11582cfcb9f9d2ea7641082dd2cfa73cca064705707c155f610e99a5434b5a80c41302a7b6be39f84a4ab77b1c3e8588055faa2053bee003202c1081193fbf9aa3db72203106cfa9317539ac4913193f107ee4a4726c30f4c12eb517a55374ef4f481534ae8535dcf49883ac4088380a12351061fbe14f5141a5e3a4765ece1f275d3b496255af0764d20430f2729fa2495b6cf6a870e301cf0001c376e84c1011d1798808dcb01cc41461e4e061e4c9b335a1aef0e8c48cbaf1284251d499b63c781c0160c68c08d1ba87164f941861d72edba183a090bfabd066edcd8a1038c3176dcb8b163c78d1b3a5c0c2efc04376e7419c3860d6263d84036c6172d6807e0d0e16274c18518a70b07dcb8f1858b21c6e9e24b11400c32eac06fd22554acab15931ecf72d482430162635879e15e14d70146ea800c3a3041dae44f8d7539863e073ed6c64b6152f3c80fc981f59c444c1b458e4c37f9e313e8a28b311c1007d6439d44cf312c37e370e0369ed2759d296508a63770c2bf4f3cb6ae471cc97003b7f77f9db263ee48a78c36b0c17c63f9a70f2d1dae2081a12090c1067662b59f8c41d449f30332d6c026e9d95c443019fd35db21430d69cdc135a5e995430b87abe0ec28c5011969606c4dfb6e64730c32d0c05d4a2633a325b520e30c8c9af2717dcde61b649881cb9644fd5f1acbc0c9143f5bfecccb5d2237c820039beede4698f24befa731f039a434e919ba83369535c81003e3be9e3f8fba06adc130f07d26ec5e82fbc43791db820c30f0d69fb55792f294542c878c2ff0232baff6f208870c2f30c1d4b485f4503131c8e802bb49a8532143e9a867c220830b5cf4283107a53c684b627761811b374c05376ee028db838c2df0d9f71b3d564add6b818f29f7c40a53da3cd959e0e249cd8c604158d0278b50be279e2bb0fa95449f2e09c9feb50297525636f7f414f42a70f1541236ba1a29c5a9c0aea9905e9ffadd53700a8cf29ca2c4b558c890023f4a5f27939f4d57d089b1838b09686087efe080b9848c28705e22483b9d37275a1e0aac5b9ff6e54cda4dc99fc0e62611c72d74c6de9dc087bc632da2e926b0aa96eb25242526302a3285ab9bcee8c9b40446869434428852c93fa4045652c81bed6d97174349e02b67b4b43e993de206097cbc48e3e621e608fc85749aa2c734b333023978deb6089c58a848a9b359f24e128111a6eec992a8f5dcfd10f820737da759c960260aa1282a276da7c552818c2070f6616363397dcc07029b2b22ed86d2b92ffb03c6f622e5ec5bdd26293ee0c23f72fc1b0f41a67bc0e7f8554a1649a23b3ce04df379695bab8f15db01373af39bdde4a4a242142043074b126f2d99262707bcfb6637355183034e729217e468ac0e326ec06b72b7aab497954d9561032ea5bc9a9625dd0695caa841b6412b92d438914103aec7473b0b4e7eedc8d49bf290052bde954f23668dec522c18bffc94549f62400a1eb0e0a44790f69af335ad690b1bc40236b6b0412a60630b1b840236b6b0412660630b1b4402362e30011b71f078059354c8316b4816cb84af06011eae60bcb5caf2ae294f9e6d05a739ad24d3525975b783218616f560c517e25b5269d15d8f55f02571729694d23278a8825dcf6717d306a5673b20031db871a30b47810e1d607c9123edb871e375a800061ea9e082ce6f2a29e615edcc0e555470ff1949b54474d4a46a233c4ec1abee6866f28e872918ebd4fbf020ed8292799482bf0a0dba5ba204bdfc48c1c90e161a3125798c82cfd5a33e652d3d9aa31ea2e0f562a5fa1c52a964268f507032db574590b955bdf40005a78334117358baefec797c820d795355ec8b1e4ac9c313ec8590d247f1d31325280f101e9d605490da994da8bcb93225ede0c109369552d1941d3d356463f0d804bb492413dbfc1f3bed9a6025d9e59dd8a273867960f0c804eb6bc18205d1a14665c5e081095427a9f157c97e31868e9580c725f88c3e22c326059d7181c723e47d06cb4be5183a2af15bd8bd9f679b128c8d92b9baae3777d4bf1843076ac063127c0e91458a5bbfee3872ec18230cc22848470c0d6c2567815f053c24c1061f69226ccd4830ae39a4a037dc8404a3e2263565ccce27fcfd82c7231889c1435bef7604b71f6a6b6ff75386c9a3119c4efdaefba57a30820beeda9b97443ce0b108268888a87f168c828722d8a4f4c42da12af7c41c143c12c17d9b56e9b859a445cb0311ac046d77cfdf158eca83c721b890f2cba2ffb628bffa0d1e86e0a4d999f87757082e87c6ce924e242f21941e8460d5d3a59844dac9fb111b049ba2c6cf79d46c33d382e094509bc54ac4f2897904824f4127a154f4e7c8db01c1d7a63a9d628e1172c5a6e0f1072e0909aef9727f52e843e0e107ae3704d11b5f1bf5ad471fd8a0db69d48be9b4343df8c04b0ed3bccb252478ec81cd173be8d254e5d0c2d17d881d142430bab00b00103cf4c0468e6629b45f27ab5efce09107fe93c633bb94c9e2c8f0c0597253bfd1be6c7d2167048f3bf0716d2d2d640e4916ca2d78d881cf509d2ce5300d95d781d321655656cb972548b4e04107ce7474bd749df4e50dcd811f75dde65532d6b8eb21073eaf280bb2627c8fe92e81471cb8bc9e665f59d4697239e001073ebf9a8e1435291e6fe06356341942f28d091e6ee05bbd72fe0db24c9989a305270c331978b481cb394951cfbfb1aa325f78183bc6d871e5c10626c9ec5e4a94aa1ceabec0630d8ca757f430b563297335f03149fb8e96df64d27f0b113cd2c0f765fecffb3d61d2c62c78a081c9299a9e2382d23a4967606db227a146d89ec528163cccc0b82921e26e2c9f1cdb32b0c92f467190819139e93791e4e7381a2a24f018039b338410d67b31256d1bf01003fbaa498a5d503a3b84b6048f3070a66c930c1d47b55f0a0cc7943456d25d2bc1e30b6cdde8cde9b1cb74ee385aa0430cbd828717380f6a7dbfcad3877ebbc085d7a9884c4a7bd0e102a3694925e854b7c0f9980e52e2297f53d10a1e5ac0721e0d2ae446aae091053e6fa8648d1d1ad444565df0c08297aa479859fc0abc84a851cb46895edb0a7c90dfde2e32fea9a90adc066d7df24ab8fa54e03e43f57966bacb4e81f7493172aacc4ba18ba5722995321f055e3325896aa5172bf350e04db3f376d929a1db7f02a73a7947c545855cdf09ac5eea076dcda263f49bc004cf5144aaccd39f3e133855f12c4b0aa1f2cc5f0223dcf472c9cddf48be12b8142237affe78d6f093c0968e65bdc89b62d23d1238b9e329c935f99ef547603f256bf650933ea57e47a5c949d34a70e71d84ca9643095633b86bc8ec24f88c9a63e79f940497512d491db7d4798491e083ccd9d245de8ed53e0d4864aade848aa351748f821d670336091a8f60848c5b413c54e7c71dc195345de7666a04bbaee7495e75868a0a23f8d0ab20624417c1e7a9ba20661d73f614c1e54d0db6b9f636b49208b6d2e9688f31b6f588d84c6434134a7608c6538a489fc97208779b8b2d0c0d43f0d9b549ff540aca275508464e4a8e11062118cf214cc5d1bdafef0f824fbdfb510b7241b01e96dd3546dc1f650a04772a846c49f99eb6090204ebc14699aa49273de9fc81f3bd1391ef3c7ee07774e3d5fb875cbbe9032f31644a9bc6bccc357ce0fd5753cb93660f5cec8951ebdf54e8bb7ae0aba2a8542a836ef6681e8cdc12cfd7e28907ce92103d31787ee91eefc0c6ad1c4c5abed8818b39cc3e3de705cfd78157cf9f8489c6b4392b3af04175ca7819a4258d990397530a49454c264a47090b68c8819598c13e84150736554a4ab27a8d5b88c3814daf9cfbe1f71bb84b4ae78edcddc089decda0cbbaf74edd0636a6ca2fbe9577da64d8c075ea5222d89fda5e740dacc8f6d49b37a806de7f84083958c839669706ae2496d03946fe247434f09b4262d299fb5eac7206ae84f6cf6f1e4a249399810f22e554d9eb32b06e19926d940e19f8902c54ee8da977947a0cac78796bce9253a5b41818bb3ae175a623e78ce068810e31c2c0ae47fbcd29497eb01218b8cd67a9fd93f70556f32af57684c5909917d83ae59d25a9c9415845031a5d602ba5a6cf6a4ae988991d6870818f9c45e8df36dd10475e70b181a5b105ce6dd369519a94e8a4a3052ee5e7fdd5dc1d92a259603746caa0eea7e244110b9c5b6acfea96bf026312526aaa7117216334acc048099ef267a5142f48a30a5ca5bfdbafbdf5b594a5025fb16c83690795ad73f431ba382ac017d098c2e291228aa8a454d19002b71f4443d787a8161b1b78c016c50b34a2c0a9260bd1b41e9e46690c1b1798800d30d08002175fad339b526a39b883c613381135bff42e7a8aa71750aa8481861358df4f0bdaf55354d57194c181461318b5cde7fe1a732c956101183ac240030d2670da83c48c6e4a62eab30c3496c029ef13eaa9367b4990d15002a7dff25f3bd2e4895d0e2d1c6178914a79b145175f58804612b8d4eb4a492b8a042e289534ea0633a55febe31928a510a071043676964ef622358268530a348cc0adc44b7a22e6b459544da051044e5409cf215b9e38a944042ec35a74d774567c1110680c81afca49bf52c4abcc7aa9020d217039ba74090b324fe62a08ec290926c1454408518106109890e495e89646aaa0fe80afd69c534b8714ffb328d0f001574aa594f4ea95e9b422a0d103ae57af92a6d2ec3b960cd0e001db63a3b761c98249d61c81c60e78136197ee62e80fa937020d1d70e2ff3175ac0b3adf99432b0c2ec45893018d1c70390691d73dd3f512061762e0d811061762744103078cf63bcdba1464a040e3068c77648d314516c976db804f4b216b9b29dfb7c91368d480dfb6d23ebf4d3d7dd1a0011fa459fc6c153263169cdd9bb6dadf376139b2e0a4de8e48f2cf34cc8805ffaa9236d7f2657fdb033360c1495131534fa65598f18a728b4dcad2d9aec00c57b063dfa52b2c58cc21cb21cc68059be49769d0bfe725439615ac66b4ccd851447432550366ac824f5971efb23e6dda76862ab8a483074bd974275d71093352c1be86fa4dffb9fd928f0a46435747e750b9b5834ec16d52da1d4d57bcccd514769e1434799fc508334ac189ec7699b71bc2724a0ade54667c932034e576678c82db6891fed385cc1005a73972758a9332a599a8302314dcc8bc4d2a5eefa5e08282179dd926a9ef6b62ceccf80497530eb641095d5a3ff7049784befc38d2e4a77d3ac15f5bf747b335c78e0381d3199ce0b46565fe379dbced83a3ca143163137c648dfc9eb7ffda6a08d8d8c2c603b6b0c136b6b0d1802d34c1675226f72f7dbe3023135cda10845ee650113bba0516666082b56c11746307675c820b41648af9f653841cb28019966062daaeafa0aeda2cb4b1c5186654824f7192501339c434da86125ccaf190439b9981044617ae6312dc067da6a794d6955f39b4ba0b303e083324c196de0d495e3a1b21ea48b0935da2e64c419060b2281d31974ee2a6848f6025fe577a9852e121770413728aa5f8e9d35a4b663482d31bd916538f8e3083117c74cdd74e593daa25bdf02202691b8043cc58045bd1ef2aa9529e79438ae03557f2aec816edb42711fc5a0ed9d6e2410463216ed01f2166d6c839041f84c4cc546117ed5a43703e7a3a53e45821b8d0e3993cab4fd54d08ae8450bde412f39f84e81003479587d1820d2462c62098a4b1d2d5f34316e90b82abd49bd9ed8329b33b10dcdf6e0ebab29724150182fd78edede611f278f40f8c69ab3f75b671d32a40c1e62366f881f5ebeb11d2ea2c5abe0ffc55c7cafece5515743eb0669182f0f4901df2b3072ee5a818214e1296ffd3039b4c3f72929a5ef3a57268a9000538fe781738ae3a2001731580e185eb08402066e481d39a1154d2a022a6d5f1c05d06559363d21a9edf81ffdb20313ceae474db0e7c2cf1d7b2cb1dbda375e03705b5187445f5e9920e6cbabe9873fbd69412e7c0279945e65dcf4cc927a6fd8b15580000aa98210776426e491294478ec98f0327b2e385507582039bd386beab3db7d1ef1b1855c942afc8f7b6f204ed08c60c37f0b59752c5bcb95deb6f0393763d5f48b55945c6b0819359b2fea8fd2079b26b60b744e8babaae8d9b570372848c41e8e86f1a1899befdf2539e986488063ef6e556aefc9693b2cfc08714da64c87631490d320397829222476b4f2caa6560944ad31084480c79f46460cdabb35e8292a5427e0c6cfb65a618835c0c8c25193a657dc8b1b31e0636a7dad0621a4212afc1c09eeddda8d2a72ff079eaa3a36e4a2add78814d7709a61642aebaa60bbc78784efda6e102a37394741fbf32627e0b6c0c4942c98c76fad1d50223536df69f8e27c966814fea937ecd251618cd88a9be976f17b91c5a27f8828b1d3ac648ae03479da0991414665c81314f2999e5106b7df3de0596cfb002a736a7ca88a12be860e238c1175ca0209d40877b5186821955e0728e223d847ecf2552ba382ec60e1c28e8620c946563030f6080316f30beb89f41056e83dc8865a332ef1de98b8303477f7170b0808baff2850e0bfcf109883106056edcd0e128d071bc281670f10503c0831953e04678091169d3bfa2648614b8b4416dc40b966d6b93436bfbc60d0e9828b0af395993ccd2983a0a057e948aa62a3fbf3c98f1044e099154b9b27437955608339cc0bbea086d79a46e507130a3095c08491e6b27fead884ce0a3ed77e7cededb9212011da7033798b1042645ae98aa4c6707515202e79f747d103a1dcc48023b69b494bedc9954f410099c52724379d01dcaab37338ec086c474ee1743974660527a8a418847af084c5caffe4a3146df9815e30b2e3870e346210263fd357a3b9dffc5b0cc60c61038916b4cc4d19f35e9940b6608818b7d2e4a853ecf82c0a6aafa87851ac78e436ac7026a3003086c28c949691fd359321983193fe03e65f41cfc7447440f0b66f880519372fabc37cd49e66c1166f4804fca247aba8a179ec61d3ce0c7bba36fe48ad88e2f8e0e318a0161c60e184f6a21aaae9f04e1660e66984eaa246da9949e03be72c774e1a9ce269970c097dd56ff58325def8a0d66dc80112965b1a0aeed554b1b705a7931e36a8ec9d3ad01e76a75f913626d0ce50c1ab09ade5a33a485560b0319b3b0c3b36f5398c9dac5f8e2a4d3012bb2d08245b5bb78569b2423167cde18740e1a3b5870a79dbf6486e0173b5d84e185eb0b64bc828fb12f0184e025c5531a565223bac6c60626604307c1ba9f106db59932725210e64caa83d0fb2924ff77081f81e053df5396a067396777820f40f0f9bde6e33105b533b1e1e30f9c773495f75250093efcc0c7902fa5595bd9c79429193efac0a7d7575aabe8aea0c307c6fddc4a3d85e41e58d3b4906741add6d71f7ae0cc3a06f724624a4247ff9107c6266ba747dcc9a22d1f78604c44fecf154d738595430b8cff820ba2838f3b70aaeee65e5ffa473d36b610400e3eecf0f9a638d16dc4b31c5a2b383a70b8bfd58193c147a452f1e4093dd1814d2e6abb746ce7c0244d49f7a27b7268e506bc0b14e8700a9c073ee4c0a8512f21670b922cf42ffc04a6031f71e084ce6bff4da1b36f0a072e2328ab0a96477aec38f0f1066efbdbdb424e11512c6ee0bddb46787814d16fdcb831838f36f0e6c9d2fac95117526e470e1d384e7050290a6480021420a6c30b2f8a083ed8c0e68a14a93dfff4d28f3570b5d9be59faa5e5fb871ab8d6f02c916b64d221fa9106bef7bf9392b42f42d51f6860474566919474d37bf6e30cbc89a6cc6a29a6f4261f666063652d4d32bd9652df4719d8a4845f977a503a499e434b4df041065efbcc1c03dfab66427e4e36494d7268a1e08ba303c78718d84b217ed9b985d8df8ae1230c6c6b2e4fc1c3b4cfd361f80003b7a75f728ed61633828f2f90f369ce21626e8ba60221c0d11f5ee02bac56c453e66f497268e1c8808d2dc84717b8d2bd110b1d65ee1d2e702a9ab698d47e47af6c0c1f5be0a2a5b8a9152adfb82106185decd80f2df07ea3465e8be6230b6ca51c44b4ba5ae4a4fdc0022337d3b78eaedaef908f2bf0315f658ba57b52d2b815f809b2cb3dfbf85105c63ce43abbbdd2967e50810b5a2c988f58f89e3ea6c075468f9e3a434a7c488193626a9d7a2df2c75013cf131f51f880427e31eea952761727c761e0e309fcf9dba64ebaf7e39999171f4e602d87aadcdf4a11d9a2253e9ac0240b21656b089120a41f4ce04784452dd31c423c1502bb858f3bc894d2561c9d600ce48de304607461f0001f4ae0aea35958974aba52b4c24712dc16d3bb112a6e60023992188701376e4ce103094cd011a39a7dae12253f026b2e4994c80db5592123f09573cab896828e6b8ac0a9acf02836e61584ba880f22f06d2a78d6d05be1ba6b213e86c08798be1f2a3c4d16c78381c330c013172ad0e11a2895237d7174a0cc0d7c08c13d7d6abef7dba1a4021d636c91868f20703ab3b957a94060af445bd03b293d7d82838f1f305a216d52952e59d5ee0336a88a646eb71d64090350838f1ef0f93de7dcc9d6d5d7c4032604f53cff705bf1b1032e8390a20e387d4164c93622fb8765630b1b5bd8e8557ce4809718ed3bb73c53c50f1c70c2f4a4511d947e52495ff8b8019354445f93b89fab83884de0c306ac4d7a2d21847077cd7ed480fd125943ca8bf9e18306dce8186a84ccd8c13212851ab3e0a2272931c82c416551d240b1430d59702986d6abfcf70c41e9c51874a8110b4e459219a9d75cf72758a8010b6e75344c52a6e41eabc62b38e1f527b45e7ccb9e0b430d5770414da9c896bf2b06b7157c6f1659fa9e55f28face0e257084144ea5bf09c55b03569432c846de88b2ab8eca0294216eba81b4a051b64c648769a6dfc34d77109811aa8e0f5b44e8ac1cff2f9478c8370eca9710a7645c6cd8ba233342e7c8c1494aa610a3e7752dee57c8b399dc610354ac1e6502a8927350bcac73cd42005df159a6388aea87aba35d41805efaeea2198f47cf92d68a8210a26ed56a5e5e46d691dd60805e3aaa6f9d53e3540c166f178d27cdcdda2c62798bce973507ad74ba9c7136c9e7cd283dcd4e804e71233aa44bfd0a12ca8c109fe6d3c27fdfb20121cc46a6c828de6f76d3aed4454870b1d61580d4db07dffb9419b094e78d69ea9742931b939b42a063530c17a301df3c70fea4daf4bb021d8764848a633420d4b70aaae9e63142537422cb750a312bca8f98ba81af364419460ac430ea62fae5aa831092ea4cb9433955fccadd790047b4ae8f04832640bc2ab1109c673ed8b9ca06cd4cf1c5acb831a90e0afbb228f0e41dd9258e311bcd9b8aa988b0993780d47f0d94386beccd22c4ad70836dc4f07651d32a10623b8fc20ef42d59563c721e6801a8be03ae7c5494a868fba48166a2882cdcf5a9b58969e16fc070347f72916811a89602c2421d2d4acaf236e705003115cd22023c70c22631138e3a2c621f8ce7b4994d68a212b65085e23778f2cddd933a61405d42884f9cd27082183493381d15b83108cdc284ae4f4bb210779d526a0c62018c929df7e754a923e6b420d41f029c2bef2b90969a5d608049b3428a549281b108c5ac664b5ead6f803dfa731dbe990fbc1ec5e55bb27cb1a7de0b49bee7ade4e1042abc10746b48894d56a4165f76aec81b37613ab7f6b7d8d1c126ae881ad4a6f13cfa6b684d40535f2c0a778a523a2f7d608ef0635f0c0ad69932631ff8d3af91dd8eecc3156d96d07264b0eddcfd014a1461dd8607282bc92acf59dcba1656450830e7cd6c5a45d42e4dc9e9f0397eb94ac499e9d9bcb814b9b344aee7890691407b6ec4dd7f78dfa2c7138b051d34949195266c4dfc095e63d91e2686d44ddc06778528d1ce936f8b731d69a8f121bd86a1d393a5f7bbd92d6c049c8912bc4a44d7c4b6ae0e32569a93508a1cb4a6960359d8bf6efe7cb104203b7eb163347d252223f67602c47d2bfdb1c3330e66e5b1dd275828897812b2522932599f44b78c8c0776513ca3f6dfc0d9931b0daf9b2978f0eb14e2306565f5d6f57fc523313064e2591d7bf3ed7791c0c9ccabbe165ba52b4e80b4cfc1b61315a1ce99ff50297d466536eb92ef0a7dff6c13ec7acd4728193d183f9a515a13f64b7c086eda5c62879d2a6b5c0698aa2524fa259e0b76b6d62c8799983140b6c348f9f4765afc07af6fc31c7d3a52cb4029fd3f44893a0a24d50abc004212ca7ec954ac94da9c0bec88d39a81016c934054e66bc1249e74b152229f0e51a4183c8a54382320aac9b8514445fb9a832a1c06da860aa2c9d89d69fc09932adaba43b81df51ba62cce1e9d3a8097c85901acd6702a3a642be3caafde359021b2fc6603906d9b7a612f811b58ff9fa25940476336af85eccff202430a24c9608d9edb45a47606d2f7e0eeaa1e349d008dca60da57ff222b0317f478e9913811f573f9554fa29350e813555710f293c21307a27679f9c267b8c5d1058d5ca9072b4030267ef218b12964564d00fd898e29d2afb33a7d0075c6ecf65b2ca2fa3567ac0e9602a7fe2a4f080c9a93b9a49ba3c95db0ef818546dd7064df144a603c6bec2444595d4ebb11cb095cb4a72f6ce66711c7041cf7c736faddda56bdc805327b2a434211bf09fa7314f87906fda1ab0935b47ecd574f4b4060d38f513aa2f79c5b59c053b6a21efddc9a8db952c180f12e26de6c7b87e2c1811d2858a9be9939081052f31497c2f9d4235f90a36bbb3baafe94a52bd2bd8a0932e765d48a14c6b059393ca9a83b5ac60fd4cbd0a3e4b08376d49a7cca2a30a4ec5dc935372489b924d055b7d49988e39890a36861092734eedac693c051ba92208d19ef89f33145c0b6898820fd26209095ae3dbc74bc1fee668427207d34c2229f8d2f9d1cc64879c9a8d8253dd88792354be4314fc6810c9724d3779c943c18b44fd4e32dea0e0a2c5db20ba235d2bfd092e7708393c8614c26ae409763be4ce58163a69e67482ab144bef7258999887138c6a93d9e4ae4896acd9049b2fa6ee3e32a5c78c26f85839ebb3c61e69419960a4efe51482f4d2d7c18449249172df622ec1c9143cb3a6a5aaac5a821149a925510a82e07d726b5ef2afa0f94070266408f393f963ed80e02f89a0a1f4d286eefc819164eba15ba134c8f88109f69e3a338d7eae7de0542da7de562b9129c6074eb4a63d95bb228910db03233fc7de4fdaf4938e1eb84c5a73c84fefa0993cb02ad613634af1c069c72da59eb9acbf3bb0f97c82767fc60eec06491b5ca3d8491201831675e03a8a75e79c2157254d07c63206a5936c9115f4670e8ca7ca206388460eecd686cc263c64d17be3c0dfa8e6e63af9164385031b24e80f2a47c9667dbe81b549b9574fd44c65ee88e106f3fb6fe7f70b2e8e18ae23dbc06ae44c3ea2d3a7feb46003934efb95fefabf3f79166bb1063e8b07f3ed77b38fab811321e58a1213d1917e1a98e42243772cb9a7bfa381b7092149db889a75e93370417bd0d4694f3b7333b041a8bc1a2f8bd44b3965e064875b2acd8999364306fe4ec99222bdbbbcdb31f0b931ad7c6442a08518388f563fc294302d790d037b22af629b0c4174a7e4d04a2dc0905a7c818d18a225a8e4926397fa85165ec01468d1852b560c92cb2aa5985482a50517d2a5ca936184716e145a6c814dba6b9fbe628f086e0e2d1c8866630313b0b1636c60021cb05068a185d3220ba605160a2981165760b466cfdaeaea6b8bb50019066861054ed6d85dee5e5125ea2ab0de952e89f85a323df4002da8c0569508caebf2efd42b052da6c0ebfb69a5dfd96b74a5c008b541837e8f16b4a951e0b3e429b5dd5947d4f5042da0c0572af51aba792d9ec009a54330a1326f94667368556d2079181ab891650c5a3881b1caeda7164f4de49bc07a0c399e3909372162029bdd2445123a889ae812b8512926124f25707d2bb12cc34f021b39078bb1d4048fda2381efcf9e11d7fa2370595a7a1f9407f5593702ffaf49e974bf6b99ee2270359aca6dbcb75a6b22f0515f84a5ec8b7eff10f8d29f6ba38a84c0c6b21d592f9a93dc04812b619bd12a757e3281c09d4c3a7b24d30f98a0397ff04a412b7dc9077c8e7977cf54520fb8f748f5fd67a1829e079c1e57b318f1be436807fc4911ef5c121d305a2cde955273c06e0a1952c896d702075cf95edc4b934ce710a4c50df8ab7c93b694bc95dcd1c2065cfef71ffd8a17f276b4a80193269824cd7ac9bb375ad0800bc1268594de654a6d66c107ab7849c8989105dfd1ba946c9360e9df587097b935686adefebdb0604f8b8b77d03b4f7b5fc1267da3b39ff0cb5b5a57b01a74db238af58ad0b682cda3fa94d0e21f27baac60b3630e65c164ac28d255b0e1a643f2dc54f1185505576ba7b3aa8d7e8d9a0a36e29dae1ed724ed525470273db55fe490ad969e82b118628c94276a0a2ead56cfbb735ff452701e528a112dc7cbf9430a2e4dd4d39eb37b8898a3e02a2fe535756ab52b290a2ea58f299d122ae2d6a1e0ae4774c49c82f60c0205234a63f013fc089946a8969e94a3e8095682870ca242ec049b3f2775a2e3a7d61c7282cb7173b668fa4e63ea36c1778908955384741e2f9a50d2c84efe37964cf06b9d930c15b1eaf498e0db43ec4b37e61fb376093e76c8912442fccaad5982d1c8ba5582df929a9ac3cc7d45a3042742c42cd974c658a29a04a34aa62043ed2da8b52451b220e3a75e5224b8d6984bcb74a9535a48f059e47be8603e828f29b2950cd13cfae8087e35457d75e27b758de0933c53afdd63ed298c60a4879c91b2bc736364116cac521a74288b7944882238cf9932af3289cade26825395af6a3bc9a415728a08ce377656804330c9e42695f431c5c43704972ea69cbadb7527e71482136b112253660eb23d842863b0b89a9b6206c146755d13a1a729a95410fce994d74d9d8e869d81e08465aee6d1699f441010ac59778cf92b850afdfec07936d7bffb2a15acf30393d44573d3362de84b1f3899f4f5f8ed5e755af8c0b5bad5e40bd97e54ca1e38bfd431b5edb607ade881310bd3e6eb77af21250f7cda969cf8e9747a53e181abde9cce844a4d975377e06ceb742b857765b4ecc09a4850d1939cd4b2aa0337d1dd4a3bdd4a448a0e6cb699aefd909a03a327eb5637269996037feda6e63147f41ac5817135dfcd6295f47be0c009fd953d6955eccbbe814f4a081f0b4ae77817379823c970cbd136f01d5b37828a101014800dbc29fd418479148976af81b111af0a3ae389f4d4c08a0c7da79a9a543594063ef44ee6cd29b134b268e0f55465ce9ef9b7ef33b03af2ba479decae1833b0d53157363dd2b72b65e02b68d357593793c4c8c07846091e54ea1bbf740c5c9fea335da23fec1403a7424ffe5c4a448b2ac3c046cd1959ccfe4566c0c068d0567b4104bfc07586e0f182bcc02599428a88f9eb02bf751593d2f47181b3a4fbb2ea2d85e5650b5c65fd20d3a4ef85a4a205bee295d41331bb4c2959e083e5f62fb10d8b55c102232c8ba5ce26bb0227b3d4fdd52651619a15384d1fcbdcb2d9e8d1aac08d4833952fc92a591915d8da167df7a4a64c3d054e7f571231674b0afcb6bd8898c98927ad28f0f9233306f118a3490b0a9c485c09b9d3e94bb39ec0f5c79c325dccf3f5ca09ec579b664b3781b5d12d66723386f299c0a9f79026ba2a33be043ef8a4281a456c728e12b898ff944e891f1e9249e0a3889853c7cb413f8804b637447e5fff09ea1d813b5da739067d79296604764c453ce6a0725e844ca000456037d4c9899e2775d7446093d0bdf5214534290e8191e32124a4f6244d6542e0b373d404d3d0be292e70b818a71e508020a0955a52ca2ac1c3ddd328fdace06b4105000277a2471c42017ec096674ada92bf55aed1d1a0003ee04e64d0a1f35e6efd0d0705e801e7a22663c7f1b8800b0dbca0003c602cc80c936f1253e5ba450e0ab0034e9dc64b29b5c69c357643074cbc8b41df69ddf353b7a00039e02e549b524205c001ff1d430711537c741670e1050e34c60e6501175ee0f03f0628c00db88b1eb3fb4325e8e5779c85c059060a6003ee227e964eeb9492fd05a8011be2e94f5a2359f20d0b4003aead455e8a36d3eb3139b494371815b8fd9805db29e6383abd6e0ed5f9172b00030718626091057cc8828b933d66f4ca3e69f7c1b1e3c610e368a0051fb1b0ac7478081e3432f880051f4b6b8a93ce7292267a059f49a72821c6f6c3157ca5c66c6923ed06f9b582bf2b1d2a241f3f58c1e6a86f4274b86afed22af88f3c42574cf1c775f4a10afefa46a78e54f57ffb2315ecb95d7896d2ec6b3f2a18ddac9b60ca7d349a4e510ea6378a6ade146ca90f1643bacd91d4a8146c5b881ba6695dba37a4e026b5f9dec56e14fc8d9dcedd561105973ce8cce9db534c950a056f6a5f5782bec9a0ef0728182147fe5f0eea4f70797793fc623e3fa1798289924d4bc7ddceecaa13dc7a2475f31141098f7c7082cd223429996983d2b13e36f1a109bca13a3e32513e30c1c5a08386c4bc5832dac5c725b864ba7372fb6b89d1cba159a47c5882bbfa90548a64f5163f8756a9faa8045721b46b497dfba0e91c5aa4b6bcc1f8e21af04109ce638c28d174ee9849e863129cde04914d968e24d88a112346bf10178f5d043e22c1eaa411adb316f7ff3e20c195da7595eca08f47f0df1b838cf963b6baa00f47b031e45831a51311a34a1bc1bafb687dbc5c9bc6c2850f46b0934c5dbca4758c41868be02ce4adb4bd493fdfae08fe43ab55501ac2e123119ce6fc1ad48990d32d09116c12c1f7538d8cd4f71e828dd949dbfd53cc0e1f86e0b4585a2abb0d19ca367c1482495ebebe6fbba5806fdc08c38b84868f8c7da8a4f024e25824100883a1703810808102e603e3130000000c201486429160248db465fc1480034b2824443e2c16281c2014161a8744c24028140608038160180c0884c2e15048201ccf84bcfc23fccdd9b69cdbc999e79ce7382bda9ccdcd90cd990f73c6dcce96250f9f0356c899d94abb0c693383abc7709596ce29ca2e9d82b9731b616f895c47837bfccc3d8f7b0ed169fade7f1c99303dde814deb1166c45d17335dcd2866080662750208a22d4acfbd8604ee0af7cbdeac53946a23355256678910c3f65c9854a1168be89b326a1661224fd6afd2d834fa7f6ba163cc780669085c05be215e24f785c3c2091c82a5b011009d7eb9d6810d19965687ffc01b79050cb0f5b5b7672bd90d49735ed176c4c29d8d26ff6656b1e3c5e68d6ccf32d42c88053d878cb4d89b356121c6e908fcc0d1bd5cad382fb3b985f4189e1093ff24a0eae6b9fdfaa5c7a996959b0743986eb3e77bfe4605f12f85557bcef57a853fb8c2e504163bad26ee3c3ea29dc52ec3ff66161d54e2d4b1c5b3e2b1d8a8fa2dc1c74d655e42884f4d4810f3bc45686720a124b49317bc4b00dd21d03b6a1336613f500a90229a4311fc3d17d50eb0280a5da010519193d28dfbc28a775be808433e704c21984d39b0c669aad8aca0c5806e182d8d867bbadb9df3cc3f86b525e4119e3efb0c8d706a78dfc143abb1fe5c0be0c2c521203af53ca677c9ba39e3cbeca9f2bebc27be75013e16e90f2092a199c3f5820ba5d5bac5913d05fd3d76a36e59f99f62c3158687dd53c9fd0d0f09e2b431be040f1436264a3ab96e5837d71dee86d59bb134156ffae571f766bcf11e8cf7cbbbf24c79a93c40de9537d1bdcf1cfd78a3c48f9d5008e8e819fc591a6ada7061db859d298fb06cbd5afe4de88881a8bb791ade8ab79f6fc28c1d2a15f31502527a13e44de07ae7b742f73c0bb357ef11f662e12d4432e6e2d6e105279c8059942ec486ca86b68539070ff4f306dbbcfb8c7f6469779a9ad6d6e460e0f52feb163274ec32f5c5b8c9815381b6604c5444de1d710bba30f9860b3a6929b90bcd9de75673efdc656e3f37b43bd4ad706fdde56e6f37843bc48d7add0ade9271a6ee3e7ea8e28d8a169d272a257e744752c67b9c5f0aee9cdb39a6a5d6a90aa9876c593a757dfb6dfecde67b6c4b5627db17d51a7852e9d76d7a612591324a962f1a4ac820d435cb2b47c6a3885148b1210d1152344927471f21a5202279479bd1ecae196a8e968b5c85bba4161d4103d0b8457b982332b1d19553c8189acb7927775e74317ac0cea48f51a9c552f9a8b1e799c1364f4e29153cc4d252a0a897a4a537a33a6f15869f05fb91614864694b76b2e641ce1cb30551477508c0e4932148e488940265835ca018c424be145e26d16c32e43082fb265165683c125a0171f9de345d0d14722bf73ccf4b5eef8122d7d0dd48bb5130da3845b20b0ce1fa21a9263f386e59ae48006dbd0dd2fb4101030163b313ad0e806b7b9135c8d4e8b36d2784b8b4ecba2f7e6fbcccb7bc7e71d0cb1288cf4d76b2f0555c40df0435082727b1ed7296cd0a83ba6c4df8d4210763e4ffece9e133f723b60a90efc57503079ee3f01ea559081746cad4dca70c00ea7d8b58dd8bb06ee401d05e25a05eb73dd78d934ea15db7a1745097603af90d5070b4aea9f052948fb361c7552134e496f19f0c34dbb77ce8c0d557251e7cf83215a122f935e5bc50db6d668269bcaab06e8297114998b432c92ce1d823e6783c1aae200af5ef57218fa4fdbf9dcbb015d3dec5fa2e8ab104889334ca906cf1b43a385ea9c07b2c09dfba501a262c88e36d4460cf7c4c3d4c0552c389c1010e92b78295a6b1e5d9495c0afa9a342b588eddf8989866462f8b5b2440cd9061b5c69132b7c48b483c7767d28780369438019d780586ca75b854e7d910baa21e6ba3e173eea11140c9b570b904fd41ecc560a217958c710becbd45d5389aded202876af974244a67c73952ad23619c2359f59b6dcfe3bf27b20851dad1a8b476a1b437443670d596c9630e547ff648a3749d2e00722ef2c6299394c8e993409bcd1d51553acfe093925723dea2900c7a55f6702e5f1f0a5cb3a2e8c8da7eaf2b330320861109db08ddc8add9f8b2359bb21ad000cf634ac2f598b19572b5d7708f19919632f6ae6ee4c0193252aba1ef3f8d4c441fb35297b165a611137747194e85e0883819076371a71099cc6adf9bdf4987f02ef182fae849bcddee61fa210009f1bcf999142eb03226982cee916ab5b02d44c8638000b246e30d3df95dbfa1be68858ae49e3fd0867190ea866edc860df2691ead54994a8555a2810f9e03a87b8adb40b4b81bb791cf86d3baad762f010aeed10190c80f89f19d2021873ef935831249264f3377a1dc9c5696c5c95484ec51fae7c0ed7a521bd037d182153ddbb0943d6f5440c1bd0ceca4fa4256974d0162b8b551462b1798ef7f3d5d5f44ca9d8686cc723e80a2c24496afa0f1d15133b6cc24fe824cfcb0e117cfea3abf962e31cb05af36e1be6dda2c07ec38d240c0761465fa1274c1a449b078c7b17401a5866d7a3468687e756852de462442d1c01cffab5d7f9e8b21c98e0b29fb214d56d44b4e6d41485d8d840ea2496a5dd51c30814c6f83c87ada6c8dd6980db039807197050b388d3433f6c9168949cd2d6bd8e0a70f29b7535694a600fee9b95fe98d8f1a6058cf8907852b3ef7ce25afaf81217188683c5459a21db11b15543cfeb47038fe752987062bd70956d0fa79660bfe538c4d10506ce825ca1ec9f18ecfa36c6a13045040410b2442bd5599307717502e0e697eb016517d8b090b497808392dc5c5a9bc8bb9d83fbe2f26606ab7520f9aa8cab5345cef62ea4796f45b325e6350c351528a86e3341311be125464182f4c566fbee8a3685c6452dec82941eb71c65412a74d56baadff13ab9b36d9c4a1ee4ab0575c83e8b488d15d9d3da1728f98bf1c840d621ffefdc294422da4424ba5e55013bcca5d07a3841724605c56df971d060567a16871405fcd63ae10619c3b8a9cc4f2eb4f6cd9182de961267e1278c9d59e06d00f5ad3a38fc3f19846635b4ac57707981c1b374094bb306cd73a02b7ed97a5d36822429e2c784579fda9809789b0e06ae0114ffd2da224e36f20126057b42f015905e4e28c09a4c915f4e2cd73f5ae06e0c45fe7bfd04b68f4267c235863e814c442c77631c9f9a34274e0b1655836d63fd7febf448e5ecb4e9aa1f103b0aa1bd456b3727e60278f5587faeec1aef32fe58362324bd29f6e4d061b7a9535998d0965b54089746c243fc63d7214d999f9a7f864c94e08ad517a298a654263eca4912262adee08a1b85a85cee0b35e8b67ab9c8e60216e5a5b67aef7004410477468d6126bbc8a81240518a7332a8a205f5dada0225f270174a03284325868ff7e2e03d05ba1b6f23533bf0a2aa8b73ed36dcc197ef27d2842010caa5538c60eaa81338aa1a559043f5658963ee5da999ab2847181ec470666b9ddc796797f29e3ab2270833f833991556e4b030611163d0ec60baac74a6faa4fcc27c226b87b2700c9e5a6cb4379bd3aa6b8cc9254b43eddb05e61c43ee4a91a1311891fe33f358e8da3178d6b49eed1ce3ca810fc8f4675039a7e6af4340a0e8440a270e14efdde9276a19776a26df890ee0ae41030858a7bbb4db02d4ea274cd846b7151ba7449874a4c410dfd89112d21f9cd127049c80c59dbdc98e8a95e8d72bfed25cac77c01ffb338001e970f2beb1e1a1c812977ff27238001b4d8522051521641e1e23e3480896fcfe198f6855ba8f995bf1a80e8bad7f4adc6143967bb1806abcf8e590abf26801b2244ed42b22fc25a3f248712961bece57c951a7e6485e4e4553c6ca8e61dabaf409bab6bb65cccf867e69054d0f621b84066e0f219d3f34702d9aa420139d0e421509e577c275e59fcf874c6acdbe1a741a6102e9f9464c478da4f748e9e83c6c3853edbcddaadc405b6e3a0bb8cc7f1d1dea915fc142bb8868bd9366b852fd7918f263e359a32d118704358481daf2149749c8e0003034d731cc498f0963b52301352e8d97f3528518e120c98f967812fdb5e7f95c63f57ee74bcf85af6a46e4d019e8a4b4318db5023c221cc603934afb720f8d4dd6fb2ed54700339a87fdf43379ddb237eb207ae32695bfdd68bfbc8fddec44cb117b95a286d37e49eb5ae809417641b0e7ca3fcfe6c6eb8ff424da114e99c39f4674c7c55376e0864a7e7ed14fec299d727f223e655b7caec63ab0535a3d14e349cd31247c70b4f472f4577851691f627052e77b25932965753d54abbb43e051ee0082c9026c74c450ae42203b2b47bd9c6880c284a0530edba2796dc8962b62155ad3dd2d6f16cd0e7036dbf80976396180a58f54e25c63a46b57cea14db74d96ab12d3c5e754a7e3991a0f3081a5105e3ded0cc4f3e83e9522a11daf3d8876f3b1eb4da137463fac6b2858bdfc14b1dcb80d0cc2dc3ea1e6c4c21fb0db448df5116580b6e05c40590d9240cf3521a4e8c2352f837302892e1a94c834369f51057c6bd385d786d3c97cfa524254632d407bf81cab69648308f9bb6c81c8b1daffecdcbc1a04c040d53b12e167491343c9244bd10ff11e5f2049c6a3621a5dae536c88de633c4556d5253f9d170516d98e0d5b654e72527d520aa0f16ad7903bfd25a5b1837c20d7ee24bb6e640e5cf09d0f98883787fb0cae54ca35f87d3bceb2f08857d634e990ff8b2a32daff820fda3a9423459f74c0e662ec0ec29b68fd39ea8c840160a94ce98cf1dcb405cceccea4317f8c473c0ea007198e6880ed9a8fcf4a83c2fab7ebc7be473aa0136eec07269d701849a0563825409352a3b0104a167275254581b92f503b8c2ea8518f386c8b19623ac78d146d58447b1d32fc08a355c93a9e77e16e99a9ccbff2593a2afcd7911958e9c2a3aee748522a3927e5e8712f11214ee84a11aa37e3a19365e9fe1746c86a377a96207a4615932a55eb100ef6ecde046f73e6a2a5b309e53ddcef26ebc6eff80d1e1935d93590974c0f1464dadf78ac48c95ed67f996f064bb784496ccc348cbf448aa313222be76bf78f292e4b81c1759dce6bb36adc3548e6825e20dee8fa622b0991e17915b8f8c1fdac02257dccc73dd8f002ad3061af9497b795b4d80b0084f9db04fe7247c9c0ffa97804feea0a05bd04ef0a0d7a6287c003033e40aab411300e60405b63ce460cbb452481bbc0e7c4461c193649fcab96ccb365aec8185e03c7c7cd79c094ca87856ea12ddc224fe4a8652c8a4b7126d55c0a6b7d70d25dd3b9e0711489252245dc9bda42d29c1290e7d5744b9225d4b01246aa98074f3b4c08a8adad3d23eae3cb180425d25d24e5ba7fa1392e3c45e92c7298e5a96ca3a719510ea523a78bab45a4c5d484f9ce679f5c7e26339f24ab053759973a37cce2bfecacb5361c0c0bd66a9fd3105b61f8e6837a87f8a2254a290ea10a9fe2d1aa7f228595dd2fe6f670b2389c9baea04359da53f024271ef25fb93fa9aa5be2662a96fff3e7696a2686435b2fa4a152f89a0e49a7cada4b30ad8c48fb003fc8158cfe90d24b314a0efee034d51f831a85f8c61e2a596954d4d70803ab3f3ec1b4d73a4bf8e55ceff43120e5c184d88d16054f6790590ff38ebf95f2201ec106305819f1beec2b43288995be639f3cd3cdcece819ead019ed9c7ef93eb51cd0d6f8f755420932c72769ce1c4fe8f14356b5973fc67714335cb4f3ec88ec299de90970f5dd73418865d253dada3aed3f96b829bf2284bc8cebe52c673a8f426b1888e493ff4cca36103a1009f3ee2c537e14fbb89d81313347fe8370035d514c86d40bcd159683b6053302ff9c96d679a30d68f33e669c78a1dccb4f0320df894e9a9b54f462d27ec08834efe3e400d221869df9cd1c220c1d7e235636327b4cdcc1d085beaf1c2113c30cd4e495f32e2bc5cc99d1bc637da41ebacdb543a2660bc70f20e9df33a1ad3566dd64a21b5475efa082e88b0bdf3721601ecee0025e3dc4deb67907de0c53efef0de38b020d7a42e71d4c8898673d0e1125f36859e1f51c1c6c185c7eca1c289c5848350a435c048cafb790486545e2c1e61d0c5e7071b13e7363184aba2434849911e806b327f01c4b58117ad9a256c56112184b25ff1187f54210d93ce74256f0f48ef5393044dfafb6751e71d80bd8822b506472b54caa1199a8817f15dcb0165e31a1a9039a00f9797536944cfbffb99801671d38f2e91e39a4efd422a11d0d8715c17562f42613a7461f90e6c42f9a74d86309d63c1c4e4877bf145f5a7a25256d64268cedbaf2c7661ff060d8207405e31db6c642717a6316b8cc16c27e944218dfabdcff02df4ebe2e7e7165934937e983215e16314a0a8d79cdcc05286cb6cb894de0d24c0069a9d852e14bcbffc6077234a2366823ffecb7f598eeb98c6ee7039c5a890baab20df2a49e4b2a59766d26480ac8330726356198778953cdd4b3eabb5400e8ba341271c30578f3f7a18a7a7d6dc6837beb0659bbf598dc4109112b7251148c97a06ec0dc844dc50f234e5258b828d78a6f364ac3261e2d2a60ba478c32af82743548901490f42eead5dd515a1f97d7a11704265f15fb8b7af19608aa9fe8509069d66c172e09f8291af272c3effcbcab6ab9fca97076e60628f93afe921a0b7e52b3748f14d5e1e3491281a5621d096f04a066f9fc2e306481aa260acdbf4067db93ca7a3f06be8e6a61deb5a681befc1d310b60a86c2c443a03c720aae06a260ab51bae780a53bd0222ba3cb4f927769fc084178f13aef04b12f5d1f74e43c118a49a0d519508a115f5541c00fc904813f3300135cb35c21c806ae3ee9111634d7f9d8f3c5750c4f84a06b5f3c9e8744444e590137f527afc65c7a02750d0a08028c3321594737515e0235dc67f10339f949467c24a7c3d7e21eb99a524dc37867bfc1af616ae3613652010d5cd4d05b67e0b2165a472b8e07e0f35a4914234747f81c67fb88684cd24e66ef858f545da8249b63525d37ffa641c20c5d6bc0c7b14e0d3155cb7ac6c0c5bd7955de2430101f3daed09c603d7350df9f4c09a813579cf234f9feb00117b9507bffa46135451bd260b384aef457b1bfc377943099bf87753ba518e0a2795d583b017f217ad58e18ab08ef3c2757d81348959b1630a97cac9c233790d84ddcbd94a404001295a34115cd63ee9b6201c79d720014110c08f40664d240566c2bda1b5c7bfd148953a56a4f16fe1fad1a26eae501b49962a50157555bcced0460fe98e3ec22c20ad98b7c8aeee7c284df811bd5e36d021a8defa91af1177e25391ebd5e27a6946184ecb8845aaa2951f2370586cd6cfa5fb55a6b6f9539fec900388af9224beda6a9c2c8bd12d56f7431dbf5a701948eee12f1a36fee9997f7d1067ef4accef88a92088a254f5a39287927a0af24c43f9d9d54bd043c404182d8a7eb26a7d6c5406cb700b7b47ee9d0f21d5bb3fea7dabd72a92a41f5b877318f729aac74abe9160a25d123c13af47541a53479e17158cbccdab65970878ced3a0ec1bea7c997ba7e9f174d73bede04133368b3719b3da7b199f52df3696e6f7498992c79b6561aef1ca30198f2338862f1df0a60a61c10156025dc54297d3ce78d848d3209c8f49b24dd8a036f7e6f96b1755a8a19802e735a6fcac53c7fb899137b083b22e5edfcf46521b0e6530995ee7ae497010c462ac6d2ebb119a04487be53dba42083180fea1454b32bf2dc165dd439301729c7d0761e49dea2717f64673411f439057300b270c39fb61596b13d0c10ac48a4cbaad4a80c7ce6e4f80ecfb72a8504071bff29f75dba42709c43424583f4f57a6390c7ff28c4dd06b91eda67e497bfe01a8edce4f93f612149436c2368c82bdf9b7426716ac4fa1cc5e176126f9a76516720f119d6637f51bf27e1efe978aee0b513920d151fa2928031df16644c42b622dd6158f8274e2512872bbfd6feec1e0f4215e0995db5c179d4924bd25543a7bf9906fca12504fa3a394d413a56ea2c47a4d492c343f1e5b2f90241e66455d70d44a01b214061f6f862689c75bf0d80b1ed54b150fd5be1ef1757fddffc72716ba1fcce9a4f62872cbda99d3a80cb7f213ca5356ee6f36c016c52259fffd302f28b13cb23173f0aa0030abd1412f6d972ff5590f8d67e45fc7bdbb6ef9850e9b93b40caffdf968b97165dcf725c360df884d2810084e85584c8374c4b5c6f59b75c4362bd01d2ce02d2e8c9d662b640b0c0bf76641ea4d0b637b0a97b2e958f0160bdb7b17062151805156602f7013067b7541e85119467240c9124e239861246fc75108cc77596c5d5e63b143916f5e221175ee1295ceda8ba483f321bc5c275aed647182b655a0311b7fc4da579f939bb29e154340e7468adc46f198c96c64ba9e3914954704dfd6f831cdc13da1f1281a46879db31a3a5a9afcd38ab73d52521ed4a191a7df8d845c3b2b4fbc06585c322c4e4e0a2c48fe3833cdc6818b6f02ea9cadb61619c8525302055b594db7de4db4ded5b1e8442bdbe73a756c65d56d089c9535301867813d5c8efce87f78eb745981415a0963208730d204e2b912d1627c7a48e4163aec994d160e678a7bdaa9ea4e8659b924114cc5d9270d57a6e4ed1f34dc5889846260fb2b16420688ecd0408268014ebe2600eab0f03a790612183687b195f9f6975fec47c3146a7f816d1d1b23dd610a23acbbdf419c90f19c8f7028fb0f3b1c9a64a25cc2a7944d9bfd29f76aa05473cdb075de04f6a1ef2b809d816080d885c6036c25f7d26f9e903e1c18d9a2c690f2648d8bb050da8c4a2e310a61b3e61f9cb08f7fc46528ee248d68174c490fe837129014ca4e0ec3506b9f0efbdc38cd5b39be743d4a8e65d5063c1a880685899f465b4784a730b496863443775f0351153267d71300d5c79013346b800889fba4d8ee1512c6f92b317e50d753d76e4c373c4cc2e10cca8ea7c2c120471e93a32de5842ed50479e062816ac6769f781a2a47fd5d25b9dd7fed580f473052298b8770e50d566d2f9c0c8ff2aa036f7d6a48a1a538a6258e581a5f0e2cbd3fa9a0249c8d6122b60b6aebc811d2797b44cb80ff27825e2120ceb43e045140449c346dceedfd4f5ccfbc488d65ed8e282522b6b2946f00fb59979609db58ea6d03c2569ef1a1340719cf51190368b557ba40fe7e21711349b696b1dc0012241c428b9420b7c8811f71c35648c9da23ae92f952f8226a848ed611deeb90a5e209ec843d614df82dbc0a3fc2acf05fb8164e0837c2c21ba24cad43042d08b6824f43da41fe44ce9a6bd66a111c7ecc8a84100c0990f481cfb0b0754382a2fee9bdae163e7f2c24072fa4ce9450782f33fa58c63eb75bf7e2c420476291243c88091a2908a405e1bb17f54f675d08ba7c96204fb097dc26bae259b41ae333a5ecb4be0415020b24eaa09301498f69898642326b1d2aec9755f26846ee8cd210e5bd491d26f8cd808656e44eca690ae33e9b6882188fb299327dc88753a326de4eec2913dc8e5095d7dcd963872dd4e95cd56468a83bf42586b56803cb0063cef42b41c5c863e691d22102acb329ea2d47f5018fff59caf96ef219e525abd6a29599aec65dc650b04c327c1f454af352beda3a5e22ba32eb0fd7e44d34fd07b5d2b311def030f7caeede5acc3eb5536a2242406faa2ef235099680394da385e27887c3265959f760f80980c611fd3a9566627a32ebbe6a165d2c00d84aba57944f1ea4cef4d592179623fad97d2880e600e635311233b973952902bb62b658a7c5184a9b21b370b8fe60d56c3236b2a00327f4dc556746a4323b0d17559d6fa49878230f58eb4d01f3faf44d67e5009c7f33dc416c018a58c551848797444988cfc275a8bd2da85a363b0a366d9a52086722cfec3b418f8d4702f636938caaa574259fea6148382440c79c528fc09190b0edbb0b9cd02c8dec1fa66797405aba8d05a58328e3ce3b37804b24300a9f3b875a2d8345be2d0c30d9e2e40a55a5e0760de9f02a66299116412797f21adc770ee9c3e5edea62d19306284a0b9fb72c65f5c1d14b54ec9cfc9a5080a5c162be5c52eb15930cb3faae303323fdc3ed1780bab1721fa05c9b72dc1e01a1c55dc7bf16a804b31c75b800dd1c6df8ca914b40022f0b26130c1dd8083c79fc546fd6f8eec49113e4ace29fe1dd1b40a255c412c0986827e8ead4a25d0b36f993f9e187574e9167adc002ccb28fdbf0f1643a3a91621fdfc0d7e7de909600e8d9cea1b92abde5460f34b0d313c219a13d62137338ce96cf2c3dd6c07601270d178d1d95e15d042d8ac35a5f2f0aa294aecf4c2a681fcd1e92da2e6b5081f766f281bfc4d27af3152b82f1b1427a608da3dd2751b35b1c6f9ec44bd57036974ca64ea777ca0e7c14fcdb91942455d7dd46300c973166ce03631fe6bc8cb7b801a0a171ea0c086b474bf6786d7462ce501a4161b1cfec274839c29599c99eb10b2542a10f52fbecb082e9ad4b52657afdd8670043a599568836db4903b1f1b225dac8686c7fcaec5c47dfdbacf94954e506fb6013f8decf2620b111829b3902b0b1b5035b2d77c3d79ec9661378b51b25d8016c670a4cd0e68813d9933f8d024e4d4eec4ea895fdd6966ab3817a726cbaadd321f029015a4f65bf482190de98a213feb9815a65caec141e687189d56712608243c6982c7eb0109894967865003a63b1f83f84f39fb1031a1662b3dcee42e2162940d082a25bd3b3513a31b20c2530e9477a4fe9c056a49f9f5ef36461daaa946f289485470061560fc4b7bc110253332e90621105bca9d8d9b386a7ad1a675b15206daaa00a2887a7558d5e9e3656bbe83bf25e8964558dbdd2344a0d7c7ac3ce03750bd054a46fc29e8bc11d97c13cc71aae8cf9fcd03d8c784aaf62f39f438689035ef0f96ff406b4e4b98473cce6b9579eb16ec327bca6bfbb6499da22364a10312ca2bdc5b08344e0e1838797d282b8043aefdf2611f84e3d717e06bbe1f6a6357fa453852d4a6407f4f52ddd4537c6982a9e2af7c5901d2c43b1092f0b3819ef564f37a6a04a8d4d81a1fa7a346187a5ce904d719ffc6efb74deea9ff6106e4907577022cb1868ee833b23c5cb608cd7b0fd308f207e4b9491538069991c3d1e00861801efa834f6a89de69b647fcb9e648c231ae80cc31147fadb619e1b480dcdcb43b58c1cdd65e0f8a25cb4e25cea6123bd5ca4b60eca7b0a56a92c4bce58463ce48223e21de84747f308097df3686e91605f7971e1e108eb7b974b29e48a93d903d65bfca9557523a3140b35d7e12bb234064d7dd704e9e6df68785545f580356d1cbc54e2e53ada37445e24b173370a360ade6dd16cb994b1cc358c9eae0e1a2b26361b66ca45216dd374f8f9d13f6b8f871bdbb9de2445afb3b04104b479fad1779449a092b9f154d4302cdc0b02ac5f660fde041baa3162988bdbcc002de380e0bedc3323d07050045dd3c6beb68208850196fa08e75719335321bef6d8bd7a22b784f4e1712167cee0e471223c23a5c776ddc9249a5bcf4a71090dd04e188f7949481e21f33ef96cbc8c2b96db23b55f6f6358347108e185d2e4f93f0f1120aaaad6664dc4079e945f02553df450e07a40e5f8ce3ddca2ac00b6fef4e44e6a805d241a167ec797b702a0880220491597fff8dc17b098f00bbd13516c9469b39182610e92e02899852cbff53c19325697d34d573cfc48c76771155b178a3cc8e56de086fdb830923674d9707a3186b617b29e04466c919a8e40dff20c41baf878c79bb1b11c7ad855de0864a0d5b7200fddc769a6364a32d9c922c56242609419430db85a12518c273ae4f42d96cde2c90d7ce90f47b92d44821743f443ebcda91c62048588b59c67db69e7d45355e3727cf0e42ee7a87382c09f94631427b910681c5330aa82c01cdc0767ae4c9cfae5467371bdd3aeb85b2ad2ce4f864a9db95ce6d71ce22d22188cbe5b4132374ff52f40495c1e914d66e03ab65cf49f79dae419102e5c47305c04e98ca4da7c03ad1adc0ef4e3f841068dc861f24aeddb62b85bb83884f1aae70fa0d6100b6a087a25ae0098821562d46db8bac21b4c62a9d093abeaa546543429f02ef404f1a7d32a343cf94f468bc9798a594756c889aaa314beeff83a9a44de5efcf9ec528b738c7ff559be327244aadb8b67bf8868ea7a808a9767929634c99556563cbf7a72813e570ddcca3b8b6ae791702e38d793270b2426dabf358627e4d78f777969adbe8af345a845d211b3a44fb070cd139ca575ddf27f2d25f23b67d48444357ff888f60008015f90336a8d59969c005e0cbff7686203a95207121f3ec5f691dae75e29a5fb83a82d9fce81cc6e1f641d445380deb97657089c741218ddaf56d3b1c91493041bd1aa3386feef390d8f724f0c070da501787f361ea0be9914f7b08de820ce6d645199cd232cfdfd5df43f76d37ded55b4c512dead744f18755f300aa1676cf627a08ebb10e0b5645493d57ff93381ee7efa7eabca6410d49666e884f89ddb65ce67eae91725133a9cba5ccae5f4ff8c3ddd9374e14e9be46e510c54cd9abe842384b8973010117474ea30c673f0e0d6928b5ab803de511a18d851dfe4253c6ba6182d9398c2443fd5d26954fc1c60ef59aac3f7b9ba9bab19796e229b00dd517d61ba51a1ec230af124a97fd046ab2e9282a8d14915145020663b0634bb8f8b29c0a0e86c23145514597781bea48cf03f300daa13dc0c5256806f8beb40b65fa3f8503a59af32ba7fe79939ecbc315fce4f73ae7d539fc51df5c81f208094012c89023e1bc4920a3150b46439fcffffffffffffffc2836884b6196b5f2699a4d43fb65e9f93292599524aea8a507fdb7bb1adce6bb700705002370ab70a2a0b6783f633402006064ec07808a3a48a09795f762b7b3b7018c25829438599f9948102331e8d11b081a310e628ae57faf7251fe28430560a3955f2e8312999580d1c8330b9a85c29994ed23e98046112426bde9d754e218a0261d07d7969a132cd4407104693e521f7d357d7e40fe60ba2e53fb473d4b2f8c1a0f7df345674b793d70763e86041041737efed2c1f0c6bd97abda71bd6e93d184497ae9efc5c8c9f9881430f063993f263296112dd1603471e100d0e3c1872492a49b12d6b2a5d068e3b20871d8c132f3b826ea7856a1403001638ea6078ad98aedfd9a225a7834955a4eb9a373122c77d1b9cbe2570ccc12c794be95eb864acd982430e5d8bfa49b2f3ccf19a0c573150b0813478607860666046197130fe7552e3a1974fdfaf070e389842ee11d52945d7f7eb0e1c6f306e8dbe9896f466a204898101316c6c1b38dc60125f5ab6e106071bcc7d7593ef53487a13101070acc1bc9ae57741d7a5d21b047567dc020e3598d5c45354f6e3ed48c958ab71e36f50461a36520d1b67a41a957fa38c1dbc7f192420f63ab091032788230de61093bb64954b86771a69f49a064ca08292010e3498b387c52461225f83be41195380e30c061dfe9e2fa4b012a5b4c1e9b7810dfa0635920d1db0251b3ac0097098c17055f24d25a70b950f9571018e3218ff928509db5056bb93c13022fe95bca4c492c818cca9bbb2b7544c072c050e3198a3e536e1f14708cb3a0c869c336554cd4704638ca154e00083e16db4d5271d9f274f38be60f894945f9dd6923eb91a26070e2f985267c7e40f2a2718630ce50347170cbbebefa72b574fff655c000b1c5c3057906a7f41733150000213ac81630b465739bf1b09deb5d7c0cf000187160c2178fac64d9e4923e1c8827135ecc297b84ce0c082c12ec7df8591db298538ae604a5a44856eed2748638c31ac803c930bf1c55392048e2a18c73e575e388d3d1351c1246fb174ef6939a6604a634244106627cb13a0148c56aa74a9724f0d237044c16416f1da547fc4fd13148c21737f36436f434d4f3007a1baa7f3236278de09c6ebeba4d7e72618f29d0863ea7cc276ce04d35dfce533a14e657909a67abdaf0f2b17613d4a302515d45e5e11d2c328098657fb71fb2072b86023c1d43eb69eb49e490e3a828d911c46e02882f9b292522907217663250229824ee710cce152cbbe49eef0d86e091c423059ecfb750ed7dd49b5040504c3a419174f9d4812820c0cc35f28ebd2ff22ed41c55cd0fac258226fe4dd30f5c2242b2cee93887861eaf91369e3ad257476615041d72bf2a90b53c8ad203ba48d94839d0bb27857c8d6a6ed1e63d973f4c5195b3109e38db791831a4b06a100bc26cc7b5d8d7c0b835249453ce7d71686fc513c4c8749a6c5ad85717f84cc979b1626d9ff9d90d35c3ca9b33059c8b8f0105516c6f8adc94959c82657120b73b00ea33fe8242c0c3ff163c40e93d542f015a60e5a34b55baebfe40a536e919ebf9f43c9cab5c260c9266dc6dd5cd28a025861d0cabe52d12ec53dab30a8d9114ac7fe51492e551844a6bd455c3f1559292d3fe975428521dfa7a97e855c21994e610a23fb22a27fa776c9146657b3acbb5ca6564ba530a5ad0cd1331e24a94f0a43f851ba4cedcd24ef4761f2944d5d52e5a5f14561cab75a290579288c7212dd84b8bd8bb183c2e435c2528c2c132be29f30bdec7dee2f1d2996ee09d37e6f558ca4d309e3a5668d50677db23c9c30c7a9d23fcf3e56a9b30993d25b39450a61f683ad09739a8a093a6974084225135ad70861c23023f1b2043ba9e1954b98c56554f6c92c215ac268651523e71257c20c5921e694982961708965563a65ad09f224cc7e966c7410af2a2749984f6915356b3d267a244c324ab456f81bbfc842c22897bccff28ac7fff61166d1eea0ac3ea7a4e408e3248addd908437e4f759e57216c4698e4979658f2751127a1bc3c8408524598724a1059eceee74b4d84513f449c7017f4e85111611eb9172e589ce8f9218730cebd5d9e53223f7c8821ea1b359284b4904298e25fd8ab6f5d8e242184d145dac5f828a195e7208c25f47da49935152a8230d998aa88b6a022693110a6549e4ad47f29b32002c21841cc6bffff07c3ae78ab5ebeaf1ff9a130eda7f4b3de0793e88fd65fdac34b870fc6d221f7e2a9f76048fe313c62877f5b4f0fa65879a62f25793089ffb7d3e21659abc38321d7e4ce509d456e7f07838ef2cc0e66754f2289b7eb60f4a03da4b42cdd4ae12328800ea6ec10dffad91ead3207b387d6940fa2a5c4dca2003998fbf24452c943e26048dedba17f3412a4a100381872342de35b6fb9737a83f9822ef5f0e979544e6e30ac6ec9a888ccf5d1b7c1a443bcefbd9899be3e1b0c56c235363cc6f885d660c8b9f9e94ca538b1e36a308d4895eb2fea6930aee47cf1a9ffd3480e1a4c419c9ff9aa256db13e83d9a468c93035aa92d56630ccc752132929cb099532982607bb6b13e299a3420663878430a6372a5a5dc660f4dc29463c93c560f211b978fd881bb286c1385b51422a3d35b925188ea12a1b694f5f3077aa7fb76a7fc88f17cc4976bd85a958296dec82b992fab64acf3f9ec305a35795aa0bf5313ebd05e38d57e70fb95c49755a305e3a799eb3ea3afd62331490057387e4b69792d2e94fc282b1ce3ac9f8f824e2e8af609219aaa532defcceb702e2773c96fe1155c17013f594d4ff3c21712a9884d6c4b4d27fe94b5330e80af627642b05937cedd25e9d4c27d95130bb752cb3ef0a14be74332f215ee509865b8f717146b632632798f774cc12fd9eac83b609667935ed977a32c12cd721844b30b5b2e112cce925d6de3a68195109061d52e6bcd905e1d725c170fed1c727f9aa9690604ad53152f8ed9e9c1752c01130533119c170a942d07d9db37d9e8a6048c27a72ca257be3f40a208241a28ca88a91ec29e7153004a3a96895537f4a59880284604a9e7a3ec5d472134ac13088a50b297e47c0305d4af2c182d07809fe2f0cd739d4e979331dfefac224b353a530b7f6c278313232744f5e9842faecc5d83995f3db85715de5e6f279498c5917866c15c53a56f8503a940b53ef4e8aee2192880be2c214645e97e81423a8945b983dd6fb920ed726c01606196d73f772511e24a016c66eddbae461e634946861f0cefb984bf75039cdc2a04c58ce963c5bca7564611cabfa4c11722c0c631fe729fc75953861619411ca530435aff6ed1506f9f3a554541235b62bcc2dc122a41ccd3071b5c290a3479a5821ebfb618549fddbdd53bb7fd87e1506cdb8930f2a5bfa5d15c64c4d0941881cfa74a93045319d5efc42a830e9b85fa9273f8541f25cc85cd85870dd14a618e1d44ebf530a8350572e661b290cd1f6dd763dcde8708fc2144edc4589708bfdb6284c7a31bba183426190dfa1e6d2749e561914e9c4cbded922fc09935dce8e16b395728a3d614efd6a3bf2e2f5aed2099356779ccbe179d3b39c3049d4ce92266fc298b7d6313ff5cb6435618aa73aaf6d24874f66c294a447b1d4b09c53b5983025b30ed94a5bf457f412c6dc52625da3a3a65ac2e09f442e91c4f38e48254c395da570e96927344209e37dd09fb2e53909e34bfe78a6e22909d32789332af983a57889846946470d4f199e119c10f7d596c118caf4f2ba875fa64a06c3ac794839e1ef434cc760fe9338b23ea204f5a71850296c961695c530983774de5fe5c748f20383d1d2b8cee7ff0be62496e339a8a4eb6e73720ae2b36c85e5d105a3c950932ea9d86c2b3db860b6d149c731d3cdf46f0bd97552ab164cb26eaa652b5ee66264aca14fc306b2db814716d0f1f3224c23076714d3838207164c65256e94e7b42d3cae602e65639ea2468ab896580d53567858c194f74a4df8ab2c964c457854c1f8d1ffe2ab04ddce122a98cbd2c80efba78318a76010b2ffca76c7837b09111e52307e89119b76f9fcab838228182325fd9b955216f0808239c78b9e9f72f48f952798e5ddb479d0179961999d8387130c3329cae51cd63bc96f341924f06842422fcf621c030f26982485cacf7b48a3a3843c96607a5753b31234069f87124c51547c3cddbc637cc85813030362dce06d604c108210f095f64882073c9060be8e707b3a3df668c97dc1e308c6fc7cdb17ebb81c3f848711ccd142463df582ae24d2078f2218dcf334846bac6f8ef2e0410453e7aa4a975b1a824988bb4e6ff11082e1a4ee894a21f4c54e308c7dbb9643b9db48f081618a37b12e59857e61cc53162d5b12b71c725f186b3ed552c3fc92e5bc0614111dbd30ca8b0e49bd041d7288f0c2fcb7b26f21780a964cbb30d90911b4a4a02da8ef7591e75cd92b9872a1e5647fb612c7854105b311b9c27912b2dfa21c31f2a70eb3a0c316e6be9c5417fc24574a1203033d18630c5344472dcc9d35dbce9456684f6961d02968a8b78549299a85c15625260b53ce49a7d873652c4c3ae5ca93ccbaed14c2c2e069da74ce64e5f4b98e5718bbdacf7792fe77571dae30699af4371d2a3ce7dad10a434cffb8dc69647f7d32f6d3384304638cd1c10ad3f864356bdb5c0997d3b10aa3e5fba0eea49e19e85085e174e8f939c041a331023c0f74a4c2e4329f7b2c8ad0b1827fe84085a923567708ba7c63c5e544c7290c9ee6f24254ccc841aa91c68d33c8404d7498c29436fa417c45aacf3db071c6096eec253a4a614ec173e62d78e578925d1f3a4861eebf35f959234ffe2cd101d1c1758cc2a4c39d48e695547aa92c0af328e195b2495d0c1da130689c27bbcff2f711ae403b40610a955eecf3488aa1b78e4f1824071d545937de0639b041b6c3132695b835264f85d1a771e34590fa848e4e985e23453f51fe196798e0d4071d9c305dcbaec7db0f196bc4522a2303d9b10983f6a94b8a569d674732d68e8d336e9cd6343e043b681390232de8d08439f27ff220642713863989f712a29fd26562c2f4c94eb2dae9507fed1206dd79424a8f9c3aaab584aa23e62b4db850072a61d2da2ed692844cd94dad83128618579683b02c49e19540c7244c62419c4823e37fca27634d67604619356ef40cce6a7448c224af575db2bb3fde8f84e1841ed562112b749f206188233ebea894479867c4430425b28e30c6964e12b2cc8d3027dd2108310bf3fa3123cc5d2b41ae04a1e5aa2dc2a4de2ddc27e6841cd48a30b6c77f92e93a237212619ee41255b54584b94aa5646f7934d0061d87304dfe9027e6892779ad210cca2f0511b9301b3b29842959ff7e8ed157f33c210c9ee3e792131984399a668c87b06d7d16411864e4a598b33810a653eff944673e7c5e0161bc4e3aac94bef422437f30be75886a79b0cde81bd4b071460d2074f8c13cd79ff695ef1d731f4c3a7ae3734c5d7c9b3af8601eb153224da7875adfd0b10793698951e93f7e435ec618a30c1d7a30bb8952ba9245ca65e7c110d79385c8e94e2733e1c1bcf93d16376542cc10093aee602eab8a15254f7630e959f96c48899192b6a30e86a0b23fc71ef5cb693a982559306de95547a890be3107d365f5f021e7b782fa7230460e21fff563bca6280ea6b9601eb7930eda3c380231306028820e3898fbb44d77fa88625f7983b9e3267c7b753adc604aeaed6404a196efe28e3618741cf16f3a5eacc975b0c15c322a5b6a0f95f8411d6b305d57c8cbc147fb5dd5a106534e1777429851c971471acc29b376245af09c67d4810693b89265f1e2d67106731e0f3ab23aad7b3a7598a1a30ce6da8e961ef9e62fcf64302755af9274cb8ba5948e319894a5d457d9573d9a5087184ca6e25e59f2bebeb07784c17cc97b84ea297580c1dc9e6309d9d1449e24ecf8823154dab0681ee75e6387170c42f99ce890e30a7474c12caa62c988ab7570c16ce15497752a756cc124776fbc453fc2850e2d18af5ef74d05fb3897ecc882d9c4086175fa43b0bc93b156b2091d583078593ce541e92041d664dc681bdc48cb29745cc120b664bd8fb0a07492c6df60247458c1249e9752be824856e111dbbe362263ed460dfc8c8b4207154c4ae7f34a7491ef9b2103c10180091d5330c9deee284b21edd26a850e2998d2547ab31ca794fe3f0a86ddf2c841c72c31f291a1030a26a12a28efef70161d4f30d6571e7d227a6adc103a9c60f6d4a347848409b9e464ac1513424713ccee275e4b54aa850992b176b68b0e26984daaff4eb0cba3bb97e139406f63cd3a96607cf5908210da11a14309e692ffd68cdd8f5a0d6446d748c3df868d331c2f0523400108c6188334a22309df46d01e420551714400f0840e249842fc3ec9ed18255f54888e2398c37b12570949449f91fdd0610493d23616ef2f8fd277923d7414c194ac2e2bfdd9b67ae8120f1d44308b4851b27c5e8e4a7a1d3a8660f8d7c8edd194086b4f87108c592167f4ffb94bce81812318c6eb30c2e2538255489bc0010c773e8ee46f512612387e61b60a539dd86eca26cbe10b47cb9caab16ad4c0cb40a30c397a61baadf06217c6a485928c355e9894f6961c612732d65e0767d84083ecc2fc966cb764f9cea582347270460f1a0417c8c097610305638c91460e6e705217e6fd78b23d89989eefb3326ca060066694a183336c90a0ae56c0910bb3e849cbeef87061f25c953c67d3e9d3ad5b98635bf0cbbfda41cdcd610ba3951ed39da487ad7a6a610acbf38e60e1bb744c0bf3b55e165521b48fa924143866610ec26b525239fd39aae39085d9de544bf4b2da4a411cb130e8b855faf6179f4212072ccc398654911b59626285e315a612ad4ed656b6256b0e5798f4a7f411b4b3f5c511472b0c2ff973be37915cf671b0c26c2f42eca8a45444876315e66d13fa626dd35694f4c68d37430f8d326c906abc0eca4011b8a0060018c1a10ad3b6c9a7f6df6eddd2e04885f127d68358c5b67d97a83064b94f9f2646d0959392e31486590f49e280c314e6f46b4a59104ff1692e85397ad22108f70bf9107c3446200606cc18811818e8c018637090c2f8f964a8a8898ec214d4d57a5f885887958619efa2c83cd6fe509834b6d4723c670f7080c2587ad243d076291f1232d6d0b6031c9f307b780c612d2f7a47ed9e30a5bb1c1fbd7119a70c393a618e3197191ec2bde3be64a0208b15383861ba60e931c7b38854934d18437877140fe1ff276263e0d084b9e4e64f503365c2144786b22bd3bfc08109c32753b1d2449aabc0710963aa9ff097fc1de32e352c6132a1449f0877f996304725cc5f9574ce7f2ea38451ee2eb6fb6dd44426b1fa9998ee08faf693b1468ac02109e388ddd115f73f1a9130868cb8723a1f27fdcd0109a3e9f0ccfa0d353a35ce40c6f10843d2ce12ea16ff53ce7a60e3735002fc0087238cf1d9b2875ce2137034c27c65daa5df7eeafcba4119c8c1089350a224690ba14347ed171c8b30c8336d51fab4894990220c23f52585ca3825a3cd011ac57024c274255b95c389c958eb341a751a9d81b3438439c4d39c471fc958db47b7349694868d336ed80dc26883594250dbe1c43ae80f1b4c6147aa4593abf1c1b20653f64b951f5613c7623518bee3dce28abc9d531a4c924288cad0a2c198163d480b5b9fc12022e6b283f97d4a9ac110abd2fd7bd3329854dda4d86d12321852f27ca3151e4f98c6600e537fcdcf5a621783b9de47fe23c9ffcd1806f37cfe9f705142550583d1de4b46f768651208e30ba6204743ab68ef05c3c758b270739bbf6417b0ce26d404317a4789b96012c9ea2b56ae101e4f1b67e409630be6533284058fe4215ed1824988faf82d162b744a66c11027cb4e106e95ddf5c0461a663c89411858305e5b95eafa3afbabac208c2b983a3c5e88e65ba1d5b182f1f397d896ac963ba5aa60aa160b299274cba57c2a1854851439cfc147dd3305d3dd7b1493659182f9530a2e63428d82e9f4d9aa7cdfc51625148cb17f925372fb1df5134cbdd96155c24b92f085e104539ae7f5b0939d208c2618648616e126526ecb1e0cc26002f6de273bff787f7210c612b09453c4f7ca49fd26c377108612cc7d236e7e157ebc2c1784910493fca9d3eb9d173f289d9186191d20411848205dd6da35753a0c8871c836d240037b10c611380c23a8f9e93a240f855104d34e6e65ec056da4814618443098dac9a93a23faff52e36d80c60dca40038d36e30c33126da481068631041286104c31a2f5f3920e1f3a45c69a06c6182318a6687d6e23929c6c42fc018c740827dc7d2f4670f0f10b435061ed93529523a4f6c317c6f413c9d94ea6ff5b7a61ceb7f0218f5e0f0b3f2fcc25ce639998eff0b6efc25421897cdd7186c3872e4cb32729ffc80e2f415d7261f6eb38aa53e592f4d4bee10317862826afec736b753bb730974549410715a4a6986c61aad634fdf079265abcd4c2ec914ad6a79fe546190b820f5a9874d8b8dc7df92c0c2a7fbf1fe7e9e2c8edf0210bf37cd995ca444b2cccb61e210513172c4c25b994b6607dbcc2b415f9b5a4e7ae305ef0fce941eb34444a2b8c559b16174197a710b3c21455a26bcf9fac45c9c72a8cb2f19fb2a8bea99c25636d35f0a10a735f9a9790162d7a0eb1c0472a0ceed9f49da77b8d7f64a4518619638c199851061d3e5061a7305d4e397448994fe2ae0f5318258e38f9a92b87b7df818f52900f529852860a9d6db370d9761406d7d1511db449a9f0210a539e3d95f2b89e1825e64728cc215c298b1eb2a030b75558fb089553840a0d1f9f30ad87917849a924af2f9e309b6993eda4e2de32a265f8e884794543355efb635cee8313660f3e3a8470f98f4d98ba93c8ac905532d66a70a3d3a8516ae34313261d43cbeba578e1b3f6e02313e63d19c1d2363624e8c607264cba7d9dc289741f3e87c6c7254c29e5cb49930ddecde81b669c618605c618037530c618a800c0c587250cf249a9eb590f495755ad84c96425bba4bf38418614111f9430ede8a5511d2d859c3a0e1f933024cf8ff6f24149bc21b14f99928cad8183bf71fc1109d3c70f22debb95c6dfb861010c70400c0c8821821168a007e4111f903048cf8e2621761e611295b91a164e7bb54a8b0f4718ed3bd88e078f7a154d679c6183046cbbf868842145f21073f11da45a186110f727721e7b89f7e5224c4129ad7f31354518feab5a23774c909927c2a4cbe646cfafb347bef081088367f7202c99de05391dc2982ad142fe4ba4da785cf830c47d14c2a4a56321f444de9e9d091f84307fae3c158bba222ae4c2f0310853b84bb5753da7eaf282308a7653e13c53d72a1bc147204c2d9e1fc94b8aecf00c3e00610a6d12dc428c94feb7910334ce061f7f30ab8974fa6247c6a9948cb51ef0a08c5484061f7e3045494269fe763efa60922c626fe9bc2284341fccaaa6246509eb88f51e0c1f64549c9fb01ecc67b222f2e7c98339c99e252d953db6bc2a7ce0c174f59323c7506175d28f3b98b3a5eb10dba10f3b1896e245855d4cc6da1563c1471d8c15cf4c7c96243a986c52994d1a1532d66e2033fa0c4f061f73302595836f9c0e231ac21ea45106213ee4600eae5931b392ce103a7571c074459cffb87e95ac81c68d3a7cc0e1f5eb9873667d51926f3042ce7c3593967a4fe30469860f376479e27ba54c64d369433733f14f48bc78c992870f3620ff392c8d1cf93da99e1a3ed690b2a85a97730a4a203ed4905645f0f865aa19c23490beb6f78325870f34a0426cbce362e9ec1952a1ef74e912bd916f0d1f6628ccb9fccb778847e7f0518666b7829ad193c2a8c4c08018221003052010030377f82043aa6a219e923de1630ce82efdb394b23664031b29e0c387183c73dd0b27bb33d20b43aa2f1792b42fbe3330986639463b2baa46cc8ad9ed21044be1e1e30b065162559e23e9875fcaf80037e1c30b0695b3e4eaca5df615ea8239a8357517a16142ee5c307ae9f270a65aa9287c6cc19cba2d651bedf92ab5160c9264f68d05350be63c31dfca7a7bed2c5830298df89aee6123c6750573be8e2ea2a276df3d2b186c4bad2aac5527cf84955f86f041059350495dcea65bef43ff988229e74a9db746968241626b8a897a11d1520b10a2828f28782962425a8da806cc28a36d6440a16008ba744cbace4eec0b0a1f4f309dae382295b897f0e104939abd0c611e84c930d9f86882c707136ef4e06b50238c8f2530e0430908f84842033e9090808f23dce00602f830c28d1b6f038e8f2214e08308370881013e86501f42b0810d1a0310f00886033c8051a30c342c40820f8f5ff8e2d1195e2307bd3880072f6c6083f60178ec82c3431765a06181303c72413c702186c72d08e0618b5a24c08316350ce0318b1a65a061811b3638e30c122cc043160ef088057bc0a2461a08f078c58d2fa30c342cb0810e0f57d428030d0bd8f81ad83863056178b402fd0c66d0288880072b6eace2c3431509f048450d0578a062001ea73080872908e0518a007890c21c2ce6e7be2c29d6ef0a048f51182f646ea5e4c87fe692b1766383e0210ac34910d533b146e68743612efd1a4943e5010a939795bea825f4f8842188fd91952304356a2a62a06003c80c0b8ca145f0f08441447a4bdd0a69545f88e0d10973ed6b856fcf17365f74c605dc8c1c68608c1f7870c29055b4e38ea4cf61271e9b30d7759ce84e5ae5c08d31c6f0d084a95b2e4fe4f4f1eb7c076760608c3170e0910983b25d55cb63c00313864b52dc7c3b889f1cbe81c7250c49dec48a914535f0b08431aec4884e1da37b66b5107854c298a5433db59f2861aa39cfa5b233099387081e1f4aa83cc2968479c4c4c68275f49461240ce7f9644e529ed35307097358f12e91bbec3995c7234c62f27eec43ac7a3db081027f1d98230cf9449a96f9eed108c35c3c7d532fad6e71469894322daa1ed4a5057711a6bb0fbeef29238ff03c1461b2e8e2315f65e75d7924c2b4399ea59727951ccd0311e6e46e2a4832a14584ef3d018f439836e5c3488d943394da109efaa8daee17c274263f8f28bbbd9315214c725ff9fa3482463f195c1e83f0f36c49ed3c046188752a0e84498a560c08737b96f18963c2e61a68dcfdc1a43b82be9b14fea94a7e30e8181f6fd4c99cfbc4a30f06655afcd26ae8755ba306fd364eda7af0c17cbd22136b2f1278ec616d78e881a453120b0f313e66f8028f3cb89664a747ad8ebefd0a3cf0606338c2e30ee6203ee94f6ea2ab82871d4c7bb22fb6f809cdcfa981460e6ad4e08c336cb0251003036280400c1480a0e8c0a30ee630d76e6b13a2e731d1c17c67d7af1e3c8f39182f088ba24c720a49a1871c4cf2f9ab3a2996a59c338f38a4071ccc39b669b57791c71bcc7daf6e2a2fe8f627b3031e6e387d8affb63b95b6e191a4d54b2663cd6dd4e881196d34f06003713f69d3b6ce93dca0460fcce81a37ba3230c618376cd448e346bb193b3803a1c71a4c6fb9748732a9c1aca743ce97143cbae9a4c13c729d2a4c84892829683097aa8f92e44b1471ee194caab2ddd26a78bfb966305f4dae907a30a9bcf72123e6e1bab0248456c933e1c19c435b78cf967758558488d2d9c15cb2ab73964f12ecc63a98828758212b6685db74308baabf8e16f2dce53998e279793cc92feeaf1cb8582faa447fe26090951622fad4a8b41d1c4c4905d7fbfe10cd4c6f400303dc601cbd922d0989b5c1f4e5397c2fc60643983753d3f521a4656b30ae88ce3ad594d3613598dbd4bec47f7acf621a18800693d07be94756673044cd0d8b55fb494290016678bf52366de16bff736528cf579678f82af7c9603c393975f544977cfa184c97ef3987cac8adff88c1c9f1b63dd49f9b1e065318e97a39444f0c910306639d99327f516ae4ec2fa47223e547574b222fbca572178c3e422871cb664a81015c684f655d4656ce16ecf3a0f447bab72d5d0ba5f39c6654d6d6fecdc2215bd6c8cd8b61420103b080a7d71c193978fa5ca1ec17747c39252b14d143845827a2df2a5c1e7794120b217fa860921842bd6be9cebdff144e7edfdad1df3a2978c1647b4a416707191085435ab38a58595a3b28607f3259d4e49ff8099f095f1d8fd59d7342365676a31d235e450c6802327475989409e414ecd4bcbdc29b4b40bde3ed56deecaa90014af0d2884a27843a71332009a59633292a0c4002f2e3c595fa08c6d1972c45eca4b4b2114cd1f524c50929025a548a949245b1141b110c42c9f814bd7df259870143b83d82bccecb16b34d0c10824107d321b32b899fddc140e959f809d3253960984388da294bf40b436eed911dd717e6f41c948efc25556a2f8c1bdaa176262fcc1f734df4574ef1bbdd85af615226e88aab31e922bdf1a32d5a59bab97023e9911b5e41f85db8f092ef9f0a8d6fe155ce3cb3493b3a5b90e7f5926ab530d8a828c172e4f7f8d0223b1d2a84d12c0c415285121e4c59a43a480b1553fa7b2c529193fe38963b395868a63eec45ae3a855f61d2397c8ed45859dd15caa46829e47a044b2bf8be5049c9911c2b5afb4e6a3f8818afc289a9754a45d57454e1f75bfee55829ea5498c2e6a4921d0b3d294385c14743a7687f293f7d0a934a21757eb1cb7e2f0a0b30853959c69c8dd2fb29924a610e93e396fd8c07ad3f298c7edf4994b83841c43f0ab3950896c34b4dc4f84551bec88c89cb6b288c236eb3a22561541228cc412b451555a14f1892cab7b9e81f12f5e3098350d9bbde743e7afa74c214cf6d5bf2af085d36278ea434bfbf4cc90d954d18cd752d9c12b226cca73b2cb4d794fe8b33618871134e998e1f36c5c47a1d2c7c76a77bb92f61d44d3d6521a7a4476a0bb0844949cb4105f949859754c2146a65f2c84b29615e8b2264a77021494a27815097f36479fa699230473bcf22e6bafd4a9130e48e94cc2f04a57d26244cd5e7c1eb7de7477f8471c259289323c62b4447742179b776c5d04a23383bcb95ad14762246182ea2c7bcd32dc29c6d5bde4f8a307f9555b8f6dd5b3711a63f53df9e3e879e1043c42bf1b4f34e0e6a3b4431a9bb5f24ba7c0c61f48a704a843f1d6654089334bb4f2a2949f22d5563c1b0004218c2e85c219b31263b6510c64ba373d2058f2823fdc2020491cea8c9d9de06820f12a2e7ea7ad30362dbeb2c1ee1dcc72e7f5075745ec9048ffac12054bc4f1f9e758f9b741525870f86a0e452b22e8fd41dc28505ec61ad2d9110947a3858d03e696363ed3c984f279d922aad9d85090fe80c2dfe3d498864f13b20d2da32353b989386fa89abd317aeaf83a9374f74a8d27fca79d405cdc188223b25650d9197433237794b88fba97148a86ca9f0fb210d07934edb177c674d5aed6f604288a6748aee92f2c80da653428a9c644adb5cde0663a968699122365c2aaa04b9db1accf9469efad8cb97ac06c39f48a583103969b83a42b85cf30a42868682cf758844abaad319ca67deb1b47274a66d06a3e5b0f859d75b6997c154414b87d2ebc89029b12be93194b52fa6a9899dcec2627075c6b32aa4340a83414e6acba9d34c4f70c1706c91ffa6fe73aaacbef004b112c7d2f45e30e55877e99d4a871d912e6031c4ca88a813ff5f2e9c75733f29fdf3d942e761f611625eda73b5902e2fbfb2c05fee4fdee69d16164c61299994246bd7737905254553a3c368d10d1d2b982d455d2e76a4492b56613797943ae8a95088262c23a94e5f9a42e2af33e3ea2c2d05d3e94b252feb8b422259758ab8bd408124bb4edba40fea53fe09a674314b926c277095527487f0f14b13cc2656742cd6ae5a9609860b1aaa4f65848fb3b6b0802598c3cb271de4eb93ec4a30bee59b28426c88d1a62474399ea1e90290505297bc69c9439ab5802318f3928909cfed93928c6038b3f8cff98b6048dda5eb927b2298820a226b5c12b1da1e8249567cc9e593ead287162004931e35af95b907031193456e74c0309d9874e661ffc220bc4e47febca4ea7c61b6cb23ed428d900b61f4c29cce4a5744cdca5e7861ee8bd61d17f35df8f15794c812d68549a84baa77252717a60b49b2246dc28529277b95ba5ecea2ea5b9892127fded52962a98a2dccab7a9a922b5c0bb34dec54c14dbc63480b438e53114b446761d2799de593c3b996b228ba08eb148e852a13643c448717c1c2bc13b322aec809dbf815a60f4946da89743922ea0a5365bb9c9cf89c2bc55a61aa5211b34e1d46c594156978bc8c972454d7ab30e54ed172c98dc892a20a9398e0ed274723473415c6f6cad3a67f54186b52fa58e74e61b214bd6db9f4fd2a628af7de53bcc25218e5ef629e5d69e47c92c2789f5ac9e36514e6ec14bd7f3d8ac294963f8c94a82a59140a7d4ba48fe381c268ee6945825be8b57c828b5f732967957cf27ae21e2d173d24ffaaf0e984499f595b291155173d4e1884458be623b409936e957a50353bdfad268c575244c676eadc936782ff2a516d499830a9bb49f95a5498fc12bf889b0ec94410a9f49628ae47bddd5abba412c6f932955a8424fdcc28717cd3218e9787f52661d05177bbe32e6f7e4920ae3e4685302281c93ecb275de6d49030fba85239151fdd6e91b1f60843bec8a62e7e658c46df00c370049eea6147dcad2935824932e691bdab2a8597a0a1e24f55901f7ee5a61d86c10893a7702742bc24f36a2fc2e83977989a7db310175b43188a30277d229e68b1a04350224cc9f3bc696d57080311064f41a9e77ab50baf1cc2f4621e57c3574318249d909594c8dd33b24218b3439dc97a09cbde12c2242c5bbb6ea73cb9a04198b2754f6586ba76d205611256a35f94481372cc0361943c4997d5a5957705100639a264d49af40fc6d1b553f14ca77799f8c1f8b9f6e1aa651f4c91e25f25f93a1f4c49a848496c3c5c2e59187b305ce94e6a4bdc30f470505be16ae4e9f82935100d61e4c1702ef36f957e9382e4cbb081827c4018783068939fcc4324a5aa5abf096e9c51469211c61d0cb1f77cf34cbb8248dbc1a0643c3b9c97e585b80e26ebed1cba5e9e1cdc58d4811f844107931239e9fc217ba553a13998fb23cb049192eef33a0c399874df53437785187799a9851107a3e6884923adee924e8283713635df82ee1094fc6f3024cb101e1e73371843a7f0ba038d5ea8f4af6652612012070402711c045248f51e00c3130010404078441a8bc462d13c0e85e1071480035228245836301a241e18161808842351201404844382502010088541814028240a27e196ec03ab41f74a5cbda0cf38737cb323ed8a86cfd25657810116da0600aa70ce296e6ae67566a0e70b7654604720f737c5c02e0d64724730741c6dd034c8fc50bdd6880191268b4923507cf74d766582231df89f0599770a1a4c373db28b2b0e747984ad00cdafcf08c0997b5e6e6eea267b805f181beeb6aac9539bb444f24f37fc683c9ca949faf447fea535fe479cd290c5f455fae73b6e1d5cb06d98220fc824eb376fd0c1de1d4480b743ac6e74a47b0f15e183e4091e968a808de6f2541c8e584911c341ca0bb86b6c938d8b7c3c2b5b544b4461523983f31de5922592fc69c79a4524c8671d92de4c7e09eead39f5d4bfe1a94df4278e6c79a33ca999541f6dbce7ee7fb86a418d54ffd00120f8140dbc9d22f28d7ebb9f1dee3f4a15f72cbe0681c61d3aeb4ed422a08aff1d39bc1c530481076fad49d9cbd92fe58118611efcd5e88ef6c36e3b08c946c14b908e148a6dc8692dcdeb6d7b5af9ff140f940d20c69f84ff2d9748fc199f7c0bb77bbf8d53bdbeaf305628eb7dd3512db1809933c2bbff7a5fda6e21c36a472e0fb4d899ab41175cdde6bf844c934671899fafe9b6045225aa6d60af4015ccc7662a87ee9f1d9487cfe553ed082d1c63fd550089f109f0a6476ec7a7ad90111def3be9d273a26aa725beb92225aeee3fdc6b4808250dcc5ef550e2b79094d8a6a18a5a039dc6d8357c3774190f03370365a7a63c1c251171ae9748682c174f23718da31b7e8203a5cb808e5808638d4d6dcc72b807b6a18fc51b26e5a233c7511c35f57d8d463b36ca40ebd4c484661f9c80837d1b25c6513ac446e73ed07f0e9d13fd339a4114886b7d702ba65328781a479cb5bf8ce1ec300d47a91f363af189a59d4e56ea9f7b9ab99c439bd905f5c0513afead53f1b3046c811da319a4ac96a56eb9ed2007c14672098d6710e0e0debf6e209b3fad0c9146ff7e6189d501df8bdd8147ca7b8f21e8e05ea2633757f4e6f3966859bab60e8bb5c1be05cd7c762000b61b38b6124703725a8808cc2d040efdcba015185262701af9e67ad7d2d63104284feb64d6eb5f0993002109aaaac1112dd71c4e6e0b4bb5e4d97cd9d90ceb3f0e98260ce2bae69033045f53409dfbba11a06654e95522090e53da0559ce056640975de35c9600f50932ddd94450109a84a94701587bffa21592dfb9e65012a0fa4773ae11140ebaafebe8fd28132685d21eca13d6a10f9ae18ec94421dc56084c35c66e1d1eca59547ad0fc0ec170bca1abe70d078bd5c17ed7772e7effbd63e4f37c520dc8aa5b2a5dd5887f3a93080e6504827ece1014f80622f0586fd0d16ab76c4055f7ffbba49c96edef3a47c98e35851308cc6ac01b602cc3fa2f23a0a7e6a87f02ed28826339280daa37f1d8ef6e28012ac3b7992e2db11c3c4767b0fcd54f9a2def88673a7a85ad3d44afb14ac087e5771d3c87903115f818a8250e062f6d1ad0383886173cf08a56cfa2c142da31174c58dd48e3914fd2ed80b49b531898070f7670907e822dc10d19421bb4d67440104da63b2a891a3ca4d51acf651f3c71e361870a357836b71da9ee74a069a5b6fe107877373c9b81ac41405283634e106755661a13990f1ee43a58befc278558c50436c5fdb45d569720729a7cd112c1206b628641d3171a19641d5baabba99dff00902c5ce031d27cee7732841421211974f0002e3e1cb08387e50c1a123dd7dc2192f560b40032b1c1f30413780ae0e0715db9d5c76af008ef83c6ed0f548e6a0d9ee7a387811d6507cb7d0d40fdab60c7a3f11fc20d9ec428864318099b40e6b307b4583b067722f1f9925eb156d5cb4058ea76f8be871624460c1a0669aa32683c0155cc4212c68ee001f6e97a29fa702c27bb2822a855719d837524ec18bb7678848d649a3dfd5dbbb5ff0073e0de55a38c9edb7b04a6dd12d71b34ae2dde6aac54b5f57a3d1efb775e284666143f458a510dce73dfbbec702304ab4c344334181886046dc4a1c66408a01c8b2d70ae21424e16835246a5346d0dae1894169478c33b565351cc4ca7e176a8e929d2614cc0e98350313f9e1584987a8375820e80054cd8f0c08b0e06505803113633f98021e3e088628c88c30ad93daa20163c484fc40afd50a4bb448f3255450e5a401a0ccca1b83c4e32bd7500e94f16a58d3b472e6c8135694c26de69913c7710d4a8ca034d91f673434fd44fb3e5691d2add2003467379045a5d75f175d3db4231ae012afab4ff57c033658c6d6d4f6eb167658f7e374eeff55ed2110f629d4a028503cb647c662edf598abc8f49fe9b384c8d9fd8c05cd5af0d549d3c550297945fd5da01e83faf6967c602eef7ba0baa36279709254d0da59235a64a31b69feddba8ab7b6a2354f20fc11ebab08f3e441faf066b10ad9b25ac15ca5516837a0861300f507c4e244389afa32cdffd7e37eb3294eedd42b1644ccbc68a20f37635b74cb661cf4e9445865d99cbe342c009b91a06000b63ff24116ce487b11a992c81c9b9db81761434f949930bdaba7bbd6c038d55283df3271dd4e7520c73008b4737df2c31aa1888f3b0e1878b1cf0b921327884844bee5a714bccac1ea25bd7f0f11e1b6e82f1d96dbe6a0d516fe8d1912c35f05a0e75b787ed813de8600d653d9c6b17aef7d2fbf5809de265ff366719869ee80311899639a26019e509f8151c866ae27e19840b2463f1408e11784a253050c4c141771070e9670e5cadc8b03d1c743106f610bc51c4fb0a2262485030b4fe61fa81a9fcdffce8654d55a8bf96213db4db24e8f92428c50414d5f7ea1db0927440a7dc31df51da2554386a7a54a906b88bc36eae965fdd8d8657d007f771fb405e35798557e9a6009aef56e2fa71caa281d2d71190a7f09990632fd0a90bd39bf0d50cf8b1a02981f8f9c18c838a061083a9012486c106702d84a56ae81d3e989721f1561cb282b4b0546640a1ea5e6d8e9deb6e2e06331afcc76b697620892e0bbe5e4b2457166de73ab573f8611a1f80b5d6c422c073900b3116aad24de0f3a0acbf719c3ea3988b7180b8014c160535c3871bc6433615e2ece25ae9c9197d090c624b1fd1c0c0dc0a8286d070801706b12c6e587ff95a8150da4896b50d079916720ae98d2bef454ed81c969944bc4257c8bc372dd3d215fca33f816fbabd579cd2d0d56a60667ef624413aa08a31415638ea0526713b34d30661cb537620f9b9eca9e0ca09059b34e11691a16421408d55bfd206f0b868ebbe6e9524a87530e7eac8c8f0a3b3d3c0bb8ec320c000eb4b950a0f5a89df0e3def45b0507e33fc65716c7f25654279a5fc2bbb791669c662cd9ee4aa39ce62389a39c175a76af872761a0d7d6ba436037aa1d7973c62eda5b1aba73eda03bc29ad35bc4e73cd0d34fcc2344ae4f6ea2aa4ceae9b1271ca760f1dbc0a03bcb7fcf552b02ae762167f9c545a6a41dc9e7235f35e42152451c14d5d2e2473e2bb1a7663b038cf79f831fbf1a41399f39950df4cfe176f8f416ac5a09f7c098a38c98b3c927aa2fbb697f0b31de0df2935f1839ad316e184e6e2be53b26e8ecdd88875969f73193c263885ec0f809f6c4fb0f29ccddc163e0a369d4e211774edd66eca0ba7a4c3ed95a8ae40cb70c1c693aca14c43ed386b24c54a524893515afc1fe2048b2c806b04fe8bb54d320e34542fd88ba4066eb37e8d2dc3d1c5c0eb4aac5923d9a76f3f610fbace67f550b5203e31a6e93cf4aa2ceb2eb429338628bb8c8d74bde9079364008916d853126280f980d9dd74e40d3449a65c58bb6e46b691fb52791582cfc56098ab40016e046131a182c29043533120706c40423b3d7a72b4dd417623d49548ae078f503e39425e044db78c0b65a8d5c12b5968e9c4897ce33b75f273e1bcb07ba86b3680161be25abeb05cb2cc30ea5db9a3ae57f41bbe72e94f6d8cc3bab49f93700c6dee1444990c542a8153af88f10494ee60e068957e8b5f945f483b67ebadbff389931e049939a0f6dca66cdbcc92fc7af95ad9d400f09e415a5ddfaa0ab5b495c9848644c8e68e964b84bcd453f28e142b58ac7795d12f3f0f47f20d966f0252cbe851e5e4eb152a546cb880600923287414314b9bc651bf76675cb6ad8129fb192e57bd2a386935e1352ee250d3c45bc5b02d53f201f0dd3199001ac0c98be3486af99261294008cbf83dfcf5f828e8867b750a5a3f6199b715c2a3b2e9fc78cf446b11896e53a15d74145014079aef2c1db5058166d1039dae12685e5f4e9caa0f973d08ff0af43e3310cc9a5e573052ff7610ee045b505e49106ee9dba0a4070bb03f007f417c967e3c455356bbfadf7ec49e47a40c2852004a5ddb1ca97bdc04e43cf650f8ea68bacfd829b8c90f0c9b24186e76fae090eb90a0007ce265734afa1281e43bc97fd59f05333e36138d5b1e2f802f83d18091015291935b2a23e02553970a05e55fa032c6cd4580f27fbe48db17a7788e5ee6f4074a331de655c63453a71d691f68a42db119e9c977de2b076dea2d63df8373c0090794bc017fd689b3bd7bb3205c9c8b9b60ae44a9c961ecb7a156be601ea334a873a870dd16fde4c2239bb8ee4788ca3b839c18cefa2c59b21f019f0b37e30471098be5daf339f81e07688ebea1e0a691e6851d422d3b74aac8d33de2ec6894006daddeb1b0448d6165971ee04a4bbbb7465093ab6950bcf93a930e7c00f8356e9d1bc67da851e07b79e39a579b39caddf4bda6333dd9c46c2a72cb2b034b261e209c301231cdf434b7e828f2c7f4464fd6cde242445cfc43c77ffb02800603bbe3c6fa133f04203b8a7d5bd1cec0efee9dd082435a3fc13bda89336040fa736b11e51fe7aa5ccfc20a6507c42bdf69fab2221e1e382593c02adcbf45b5add7a506c92e9ac02f51e620d37209ad315b59ef012ad22d3b3bb85ae67a4ed1f1a4a12c901c2549273db085365ce1f769958c7b0f1bc64a66dbe8318deabdb8986dda60f4b6e648a3dbc21263225b8b325402b39f406b7d23937360fa309a5bb68c60d1beeb67800a3100047ab552c63c5f777bcb8160ed2d0bcf74bd604723d4fa42f45b13874e9e95186c43835b3b80b5b1028acec69d0f71325de08d5327e9d8e0009896f340190fc7232b2991e1bfd1ff4133eed2cb74ee46c98f7b2a170847355a911f9cdd4c6c13ce38cddf9f9da12caac149f750c72238ede31641f0183f2e2bdc266a4f1823b01a888fa2f31316897220b27bc7461daa80cf6fb489f53d9f93ff6482e016258325523d4ea4d421566ed4384a3db5f5d987aa9401250734f5b7352f0d87befc1dbe41c92a4101e73a0b485923ccf99520071d634a14a8ae50d44d118de7a11743a78e936444da33f07ce3fe6a5bac02c14ee24de0752df349db8d0b2c2ac6960b8c58d3338be231e3a0a641c3a8326240b4593cde9804adafed63a74f0fd12b1a9ebefe57a445a814301addd9afe8522aa3f6f7206153ab1e480d043dbf52f9057adc890c5942f3801b6852d1c845a1a404a83efa945e3860990f826ed5a85574fe5182748320a55046810e52e0494a23c9f83c18c71a462c071b3903cd222be6baa84c8b9e44de1be90a54b6ddec20ee637e4e31337b734f05942b1e473d587bf3a711b1ef22391f2f6601cc8ebc6a92d684e72b04a1c99113ba37d665d60d8969bc13a5ab1da250b79960f23c0eaeb799deb659c22b917ec462a4f3b1a2b332cb16885033f106b17d04d12d2821d354305e6d04ad0b3bd3fe31488089727e858e118a5882e59628975ef7ad0529ad1d58b22b32c00a852d7d66b26225fae6fd03791dbe0992d2079d71b5e93972423cc1c3b2c4750307e12b136b6826583a11450877eae119c3ca6d26d6660276bb2a2d51445e14743b1465846471ebc9a8820750ecdd4133e7956a89034b7b6b427c53840f5ba764501366f91bf26cfcd4f040c261466dbbdf1880781125f3c2a946a936a61697763341490cd65e0ebd9c712e71224408a6210b7762fafd5faef3a9a5871585a6e94033c199d77f8e7989771fee7191990da6b5afacf4c3f5c67e0fa39af96315f44d15a02fd8e7cfdb37831e87e930a81e882b293284689ba1a5c3e7126bcdb4498c5b045ea120e4abbff1b4eb03c1799ab56e1155ae0fbad636244d1a9323b50fbe84836e19a98e52b5a490432a88d2a294441f4d16d1ced6ac6e02040fc82a20cd1b63b2a87f13c12441a199da27b8da08a9822f645096078ab13d8ba83e78a970596418829f786a24274aaac14ce13bb6909a26a42ef5ca50e4af0810e51f85df0ae9e7e0f9a9e749fca9f2a7cf816abced80cb722490ce22b75e441342ef96ca933641dd02cb38aacf8820ddfd85b9385822e5bba7ae972a817df8a66f96db2666e915ae768423ec88f188968a321d62a8178964af08cd2e104d774a34a87c4d4c00fbbb3834cd3a8b2626b0a015b393137efc39fd82249d0b67ad09043473ed2316bc27c142f254b0edde9f1805ccfb2986eacb51f67499b124b08405fe7f824b6b39651a4f9d9ba8753a5b525b5a8ac00b4ee70f035ccd38751480f8833a71680278183e8aec9d776283fdcf445b71abbbd05a6896653bc7d651ba5c680841eedc27a3266ccc67411c0b458d67f63d5a6daa13f31b62eb8b55f5c155ac30873801bcda2c0c6726a64f54527511838329578edde956aa40ca0d8db018d20f5a86401b8f2f8d5daaf7edad1667e97da463b3451f9e66606912225bf228fdc820ea3db5d6baad7c2905e8c22a22ab237645cdaef6db8b36dc9dab536a4edb4b8fdb24f3f250daa0e47cf7924e1a51b890ba5d81fba2d363dfefd2e90bc52a74320796f53465c2683f8be470ab5b2739c76cd445a8f2004b672115ecb8a44c7e29e2a04b4b5c07a8201c512357b4297056ba1eb08f706e259408c3fe2778bfe47e5cfdb356dbee57a0b07a26938e43e3c81147328375778c26e7706c74920e3f8c416dc7fe525b4b781f7de7cdcfd38649ffc9e71914596cc2a1a8a9b1ca11d31346982a5e898880c5dc092585f19bd2d171811440a85995b8fde6b4b1646a1e6557e3f4c95479690c1357fda02fc43e872074bdde2f020ab9647e6c9210bd745e1fd1f98974459fbd8cf1eacef6fa9b5513f524b8e203631c4d520f7da9f0f27153f976a125374edcabb5ee2b6024c33b19fc9fe2bdde45f3619a50912b174cb0603c186e61e065092a62f25757e7a7512276899aeea41c12eae45a019dcf612222d2c1b0d273a91d172cb93288c354e1c76293fcc7d6058169a804abd08557db0a5ab1086082fc9a4b7a74bc324dc109486c8778003825dc43babf0f8f04e2df4c69863747907ce3acf49944c82032de235bdb5a32fd364e9f13812a59aa92c1471b97eb3374791cce52a1e011231eda1f1b87bfd4b192eee36f40b89ac4525f0803108f2738964fd711cc844025c304b5d48020616223bdf31aa4dd557ca1931068551223374dbe4f2668037d05c35847884055e3ab5c152ce466865d15a01d3d5c7b02f2b1c42db858cb49d39143c96426b9a6551b5b90949f2eb87631757679534d21a64ddc36db3dd172c3ab28e378646efab7b6562cb76fe7e54c62ad2d6f12e008c49df8e2525a89169d3f409075e6221e99a93a6a7f463960fd47524e9954df4f609c1ecbf7f23e546e6c04dc4144778635ba1794c04b00af52d6d32684898e9317bf3b460627abab17cd42a055b28fd6e2d58f5a9c6df5b70d09596a29272329197c07b0433454bdfc25c02934e00115eddbd462e4577f2ceb67c44982d2c2b84eca7652f46466548bcd9fb28a60eb0f2941fbb67b2bbfc6d21be3379eb37bcf56c6b44ef24f50861b00de64cb3d6b0c060d955a50f5582222eb2802b3ed1de51bb8af2867d5989c45a92e7c7ddaca24fa404690d4bf5dfacfac2a22c0b7252f2e57fa74e02eea5a1b9797490ce100e487ba3bb892dc693cc60c27720aabc9e8057dd093b5d4d20505918635a1af736eada7b781254afbbd4a94c720f1f73e786d85e86d327affc96c1ceec4e1b28c70b113a61d5a5d15cf859471f435ec632113db6421abb55c6dc95fc8740acdfbaca88f5f52cb5bc31314b791509b1598e3773dae0ed3df6e13fbb43d6b91a1609c5d2447dfd4c8032d083b921e4939953e954a1c63393416d3a1d83708a9cabdd1e34b7bc53c4983f97742da9345aeccf5ee4f454e77c883d2314b1c6c65c2a926b63776e5f2b2c95f4d47ffba37c9b6f722cce51252cb2db3d87c35d2e5d25f778fbd950aa35a99f94556eeeabe5e60212c8484b072b5881cf2791bb6e618d4a407ac5841d1d84ea0053f32eb4d4e4abcf8dd8adb4b8f7d8e4122b4ded650b64245d8363663f109ed85315872e1c3c94dd2fbc6841a0845564b617d80697d51267c3827b588a48754838bd51abb13825cd36b931d0aac8503dc661e99c20946f185361dddab351e32385fa2ceee6c618b20a4d58cac8efd71478dc3821f1b44ad685a1a1d05bfe0087ca31db53adb69e9a4373a72901da6b761b2d5b04a470d90d312607eaf6189a71e1bcf7f79b9a58cd4a763a225197c3578f2f79646cc8b05c435740658e9065bc7343a21c4accf676c40cee25ac331941db3d2b6e27b3a44f56a9019e9e3586225ddd1bc29dd9b1a29a384e151a30ead38fb03236ca6dce87d46081ac9c54ae9254f70d22773c86f2b8a151e89f9c1fcd37dae479dac3207c03324a6dd0a65bbbbd76482a02eba30b02f58699f2cae7246e94b5e2a98c206435dc03cbd31989c0a83292745c8b5c57ff0749402fc3ca04d964d99a6fd5797b90ad30eb9b7b31f30b9fe80e2e666475596f17709dbbfdb54212d0d1a99f1209dbf446610e7b7f15370c45d8af465fd70c690045e0540c0500a3b81f489fa60bc869957c5f51f10e2e3d38beb1f8cce010c5b01ba2422421045219cd85c8ff667c460c49a519b94da79332ae6af53c562859499f8be6ed3353721e334b5087eb2ebe2c1114d9180e9779a9d3f1ca20477a6ec856c423be0232afd67689ba661cc549e08f75ffbf24fc42d234994e66470d1ccf7c48f86a1b48a81c4d61181019518afefcc281180f5d19c45e3f59d138f45c6ad546715851dfb6b8def5c350c277d8af1b072bba022bf1b1f7e1f8806df8ed2d6f6dcc4b30fb6e1700ffea230b5874bc89e9102d1629c0056438c1dd1e08c00abe1c62cd1e48c001535326ec0727683cf4b60bdfaaa56b9f5ba5064c2973f1fc833b148588970712a192edd4ee483f698fbf81a6fac471423c4b97aac52119ae5af7846a74f314cf587c0d12466d756890513df5c7fa9fc18330832df9f8473bd3ad7c1bfb6e6207ed183e4d015c58b5fdccdcdaa1fe1e0dc8b9792fe1c8c5933d91811967c0fbb31678d3fc578f5546f90389e232861b30088774d8a459628238c8554700599994923bbcdb7137eedcb76244b70f044c59f7e105a3822bfbd42e8e8b73b93f2c54cda5835738b51af0782c0b50fd6464177b85e414aa2b50071e2949954e43b0d24711abf56d6e800ae6cf8231d20a8e9ef672128b1fd670cede931905f65c8840b4c0c99d70ddef68663272021b8bb387ff5a0d7ae1b24ba65ab0783ea0235f20b54bff568acf1ec016e7f6e4cf6babb5914c03d55299e6c6b84bba1e92d4fe9254b982bc3f76b53c2bf3a007a6be2e3d18c0b3c860392acbbfdeba93aae1d1957a59f1a809784e3a791f428a3fdf6183f99039506c64624ed6e74f263aa7c19e14d1dccd51635f5e004343aef20ac11ec979936715701a820f9b34733b456e29e0aa83e6d540ccd037f7eb10c9620686ff5a27ac04f2a71271908e01c6f6a07bdb7cb16d84d8c1c7a18dbed310c2610bf5695c3e95dcdda912cacc075c44714d4bd0a775f65d6a69ffca7a7e3977890c910ed3f27fdb2cc51605f7446d9fe5a7e13c48c921b2f34d70f8e84469e6d9b43b4ab2854a1caccd81ff6c2e0d963dea992902e5144288d16d0f8188d01ebf147849a7b1e9b2ebb155f8f2902cf5a7f4cadd768c25fb907b97319fd7e897ae89caa42d9b6a8c066fa17e3b3235587a0376fbdc7bac3afc35c8e16cc58e5311ac5beae69e8ca7e94100268553f4f76a5619f0c8fdfa18eb468af8d51b8928dd351ae37813c47afe73c7cbcf928c808df3ed395a0e7e0cafe003dce4eb74dd71cee51574eaeda133b1fb0a3442e710a6f06ab29e7f33c0b31ca3e3b41094bd4c48548b8cc1b4259c8330dc00a3dcd8ae70d0a77a6669348ca8638c116ba91e9658d3e85866f77bcc16400438b68a58707ab1fd4b02e53814a3c7e2ad4542224d5c597e5842224290b9ea7a9edd8978a8c8fb94f85f837ed90d075b7c04992a167b3fd3e1795b97d87c3a225961b1f4de9d41b6b81f11ee6963a14bc8c048e9e54260adbef3537cbadc8df12b7441ae6e1aa85a58130094f186aaea06607c1cc3d4bfa06ce304b5c268977b03d6416a6748ad3a5d9d4ec8fe94ded80c0a2f0d0cd3d052a69b9129b217819fc2c4150192bc729b5edc0f7609d31a936365ad1f306a6aef0d892ec27834b9ab217dcab7b3a82fbb2dc5c530dd7018b2e102b7ea288afd850f1aca3927042afb6c69937ba552121f5b2c9a78fa21321eb629054e83eccbcfa490ab27717d435126ef5c9eead9964cc3376221e000aebeba8c9d3b3b041be98e9073aa21758b5ea04d0832f04fb99377872248c54a67ee7bcbe82db24a0edf465d8654d0c3ab5c41aca66a2533c05496426e11d3c658e0a773ef5358348c3526acf586ed06d857a2b2b19044522f2811db6f5e35f22f0a1edca8c8d49ddb32fd47443d2394f556ac9710c510ba4d793013f3063c7e78973dd0681cd02a6209a0b4202b596720e93945e4ed1ccdfd9490327a9a90d7fbc23832472af6e420b18759fced10ab618baf16c4043e94d84e296d3e5295fdeb09fc8ccba2dcb41274cc62b9af00f95a0885d51521fd9727c9a24ced543ab38e436ae80ccf88c4fd2ab1f58046132470bb8058387e098aba5b9361a140c824c8ef3ff12dbb787c9d6b612eae4c248319c3c865dc3c913a47efddb5d202d61f45f921ec60513803fc70afb50bd64777b10f7d649554eec1335b980054a1beb72416d78a871fc323589a6aa87e89d07b6f282de5190cc753336c96126820326dc6755b92e70ec41ffc6a47856c204223924c42f7d67ffd792fcc3889e63f5c600258311b93510ee600a2636b2579357ddb745b8b6489dc1ef29703ea877eb23994ce8afcd7f6e66999f30a06431f46e14e3e5c1417918ed5464d2b723fd0c527ae1e8b04e8e6f1dcf5e2b03cc89088f7271ff5317d2239d87f25df731f2c829d2c8c5e57912ebb159b72827ee8389b35f75f29a6ad16fe6e16c44b555aa9944dbc96ae0b1604d59038216957ef4fa29f452b5b27657431526f66125cbb6c2a03610ec9b82d0147c6cc12643f1143a270b9dd52d57335adf404945093315295d7f489ff562949a17b3bf97e1c08ea044dc581cf06d94c156f831e137e0c928ec018772da783813678286d8a0089c0a3317bc723dbe8bd8610a045cf614309e0257014c5b4cfc82688b70127d68400c8a3305523bf276903dd471a6a6da0faefaf07f25d0d97c713c8c1770ff55602d7dac5ab097b26206133af8bb155783333144b45dcbfc574900268996e2477bb7d7fc3b8171a2ea12d04a465af84e82a42f53a555cfecdb13fe2526bffaac5de2197c3a5dc993ebd7c9c77f14b3e86bca1579f2eb38a490b700e7db049e685b4bf6ec9e23fe9910db357521408aa0978d43b66ad8d80d075f49f89147287d0c3089df397e27dcf21f70f82567237c0dcfce6b85f3e3333d4eeef15f53931641e927830e7a0cc89c5d11008edbe92f904218d371beeb1b4f9136828205f1cb710e29b8115da70396a815cd9112791a240742ceaea4caa9a962e5cdc1a7f753c20cc7e89026850a342758d04ee47b4814b43ceb5236fffd5cf328758afbb723f92557fdf70bc16b3cea036f2deca4f4aa2bf7a1576b33d79b110a09f6b292885bccf7c6805e21b0748488ab60025184a53a47bbee1fda045ce314cef2e9067044434ef088a12b3d6c1ce270f2b378ce9436736e21b38c92ca8244ef3ac14a3af6e5803cc8d4c81b0f3fd412f3ef668e34ed585b62603322cef5bd8fa79aba174a447c8f9498ebb8a951545a2a735e0662bdf7fd29cac541eaffde43b21c429ffa4b86ec1725d6e832116c3f6d979641778a698848cb70ae22b03b26abee697fea238f8f6c61649aaf73a199e9d72fd3e4d4f126a17c802a286803884131fc5d0b14e93fe56586d542ab511f6d0e762e83560a930361e55fd88e1a18a7cd2120fb875bdd120b73f3161908119fa0d709f304f9d87efc53a2ecab3f9055bba5a70524a91cd3e0ee610e55bf8be531d90db4d7d949ad615151ae345f0fa522bc393c02a9796d7bcab3fedf26f1e1662e319c12173b200c6f72cfec3913c7cfc58c395d3b025a6ae4a8135baddcacb538e195a2b5750f1cf7e90227273684425e01d8fc67c35dfc8ea2f3d768c3122bff90187d207738ee4d758b776e53cd68da3118d063a1d0f5bf2a2234969fe0d76416fb69693b1e6badc9160d6b36dc69121fe2661911e704be85a8ee1c6d30bed5ddc3398bd76e0180674c9aac92531dc4ccc3c3c1ae721c152258507a92cb3dce4c6668fca56ccc6348c7cd6dac295010453725ee9694c2ed040525f66690b823115f13838bf5031d7827480bba37a936e151d4a45215c147655c01b5ea6b2cc3928c21dea76594baf491c37ab402416b2a244c99b8ca18046c01d22a03828946c15246708e70106ad758347c2f6728d04028a278c5bb2fa491b30737aa950fb2482bba68b5c12a7435a515a8e890088c4aa2a615a804cb91d968af8a7a82ca2c455794fc53b357193a46b1ea1adfd640a53250b7255d2eeaba76095e6744c7463c031de7330c3d83434d8553522cf484a1c3a19750c5a17a5147a51e88f5c49183cd373afa0afd1ceaa9a3b094f7afcb701488a8655431d4b9a827ee08ed15531e869fca16a84cb08cff9f241f4ba8f0285f65c42f346ba943ab6fab32d1a244b1652b6c987374c8dc11c732ec5ad6f2fea1b02efb1dd8cbd1cad184519ce80fd09c1b9db7ef07ea3f7432a999aa46d44d422bf2c4f9ade8553db582f75f8fb2e47566af15f565b95b560d37a9a72e109848ac3633f5bb2a63d00c882c1a059c18ca30c54ba7284465a04e75cb4a8c8e4695416dcc018d169f8a942168a6d486701d30f79b58279cb5db3c09a632c18b06369a218be336273cad4b0fa10a9dc27d41bc0386ace2214127f248d3a4f32149e19d6e89dc6af5f07cb95bec3cdcf3b884982df87ad8609e354a6c08ca6bc63dc526c36e88adc6c68645d2d8ea6192838fc62780eb764ee5cdf44f346d2f41cf5ed6b0dbf0b46dc734563e5d6730a2d92ce4bb2a5c2a8e601923ae4604a3e05c13e81eeb227c5a918498e897caae8a611a735141f7b59ca22138fce786949d91d9c831b418506c1ca03fc8bc5c0c63da50c17a462d56fd724401c0d66e5c85d05a5e48ca310c2b4ff902402288e3a3f6030b26694086c9ff4c1f0d4e066ec3024aa10591d94008b37af412a40d7a0c9814b8095871b0d817a845a4831f3af5dd66be611c05b01d7977c159a1431f0dc1763b774f348c8326176d47460d8c9014bfc7263c1f32a0284e12c6a2b17e64a36932d79cecbdb41a4feb715524f2011b14790be7073739ccc10e38335c4566fc709bb14a447a85e0444b9b597196626524361376c9ef1038ba6cae039b315e6ca9711067e837c3661bfe0a721bd86d2cb61191d80cb6c5d5b9bd91136c399ee3d8b691d98d65e51887534f6c6677d6be0b9dd88cc9a128cdae8d7af166dc144cc86ae5c8c6b46caa02beb045f90d3660b0a4900330333333333333333333e3ca4bfde37ddc1ff7de8d60c232aa45279a9292921209ac35aebce01de7e01dbc8377f0d67401ed0da10d1f0e4d52abe0757486b10e62c41ca48223a94327bb321b1fa7e055a63ce1d2e660724e0a6e8ebfe737785c565f141c4b1e13738c50991e149c94426d5585f6a5ee098ea47c5b29c7098edda4077297396c821f2ed492e698473a98e0b57d479bedef79094e698ae918f197b1129ccd6695ebd2243829e68b15296548706a3e6bf050691b2d3b821f3ebb9d49eab09fcc08cec713724cc9f4712c5911fcee30daf6690c11bc4f93de1ee45552ce109c24b143ffe8393cfe08c10f6311d467d6233d4170e3fb6e36eb2b3b0304d7b3cac52c5de59a1fb831ba6a5f7ce085cba91a626726b7f4c0b188eed1d5b47a5978e0a4c6e6cb13d9819344ea6732248f611db8793a3e87b4505a7e0ebcf6d0217ad8e3c0cb4813d66e3c546ee06d9eb7cb1f04b081ab5d9eaed2b33adab5f082d87f94ef83acb569e1b6c725211d3c0baf652e4731480eb46659781b24180b2779e6c95154d58c312cbc489a7f2bb2fb8faff09225c9a1f9871c6deb0abfe3284a9fc754af6d2b1cf97854438ea7565b56f81a3de4f918415388aec2bf64112d4398e081aa0ae762aeb8acfee1a334156e69baef49bf7df944859f3a948ea297a7f02579a648ee5c1fc4148e678f9e2d867cab580a2ad4c986258f144e942011fd330a5f2ddfa71ccdc7cc88c2df509a156982c71d0a377687f7e8e0592d28dccc21dada625dea3ee1f49d947ac8924b9927fc8ea12558b020695727fca05eb3a74cc509672285e718de849325a7d4d392ae929af0439248513535d57932e1a71c4ff89c35740e0f263cf7499b263269adb984f763ee36d1e953ca58c2dfd80c7fdf1e5fa412fe86ac1e49ce9a630f4a38496ab2cf5c26e1ada698aa6221ea2b92f067b3860f5f8984ebc9936d65b5ed0f020947cee6db72103d6df2083f847f2c094f911e71847329dc86d481a7a46984532187240b33c2bff0d03767c851c72ec20b29592ffb304554116e064dcfaf19bacf4f841f7bf0a0437920c217b90b73c1e3104e6a5bd6beb74a1343787fa163f3cb66e1e342f8d32621dd29ff84f0c2079d6254f6993708af3abe93f1141fa515841b358636cf5aaa3981f0ca3c27bff1f3ce00c233ff20d774567cf40fce775027a942747cfac1f50fa66346abd14efbe0fde5caefb1458b1c3ef871920d8f7b0f5eb7e414ba23f5e0556bd01a3bf3e066a4d57469ed2d9c787043dc6f23fcc776c13bf81f77297898e2b6038d29d9071d07621dfc4f39cec17d460acdd1c1f19caa3e883707377c10739a433e084f0e7eaa34ed992da5b7581c9c34ab9eb482e58b191c9ccf9c2db25f8c31526f707cb2ed322d37b83982abfbaa4fcc698333f39f4288f6d92d1b3cbf98c2aaf755e6881220630d6efb848fc963560d4e48993e30b7ec3fcd64a4c19b481552485ff5c6340c178421030d4ef504dfd8b0ac40c619fced38168fdfcdbd449366011966f0524e89acd441a357b803168601a30c4ea4cc1f59c425bd5eac066490212f937073e943c618bcb4b8decc95a1ff3b2eb6bef0a28b2d3220430c95e6b0fea3142eb68c8c30f8e21ea4b4a9089721cc850c3010c3fb2455fd525f30a656c6e688be1788e497e6735e0b97404617dc0e1b724c4939d892b8e057e7cae361477af1e82df8ad193faf355ae1046468c1ffb19c3286adc6908f0c0332b2e08cb77a78cd1d7e230b032fb20232b0e08590c1be821ba92e68f274d1257fc8b08293c26a32976da4bb8e2fbcd8c2aca08b14aca00ba4808c2a781f89a7d45e953cbe80046450c1df4e9273e8925ce00432a650351620430a2d230ace5cd0147a26c3c5568d1a99749001053fe23f3e5189b858be31c87882d31756db2d212d4b8e2623c87042d540818c26f89299cf238fc2cc4dc6c542c074f1850714d72083094e6dee4de7d31a1daf8c25f821cdfc440c2a5143274309e590638979a2e3586720230947e6f6c163acb83a073290e06dfe9c25a40d1f117304c773f81023a6c4b88a11a86ed5f4f4be087ea8b6cf1fcfa9559808debb89440ec9330427cf769c329a840bb1230427b84b47f3b17e529d20b895dded953d40f03d677498f0d19c477ee04555e9fc99c423f73ef05faa8349ead1d7647be0bd664fd61ee450226878e0a4c8a5327b074e86f71073c4e69a4a077e900d39c8a164fb2293037f656cc35598780f0ebcaa8c0d9afd22e3065e4a15edfd4b82e71c45860d1c8d1e5f4ff239f8e8520b377264c4bcb1ce63b2d0c2b9f6d68aba6916cec9c7b45923a1a52bb2f07290104453864f6d2516de7c8e3b280d8fa25705168efdff6726af8e1e79857f96a5239f9493d4872bbc1e4d4dfb186a3d6e8567993e9ccfd979b4125678eddee5a1a9526125abf003adcc9a93d554481255f8697d36e498c35a8224155ebbc75a1d9ed9c1ffa8f04c730c7b4df6e6fe9fc25b93e41d95b973646f0a7f2cdbecc77394c20fb12395f0b1a884b449e19ca71ca588ee8d3b7b14defd871134ea3ffc220a3f720eed22c77328fc10ed339c87b1fb9941711c99c7c19f70433e881e8ba6d58678c28df6618794365c6ad209d7cc2549ce0ed207ff72c28b5531df99d4a3fcbb09d74396ca13a2ab09a7ec2a64dd0489566d26fca0fe3ce68f35cb6a30e1d9bb745f889472b0f5126e1e0d9fa36bb58417251ecbc420e991a795f0dfaade3e085f29524a09a723db7d32fa78949293f0dca26886895312fe69ae0c1e1d44a66846c215d90ed70e2b64c925249c1829ddbb33a5922e1fe1a51c87312186565c948e70a23e78e9c923252936c271cd718a5ad4a41c898cf07d653a74e416633b5c843749b3e414b25d21a1225c4b216ca203a99839897025367ddc610e39db7388f02a5d468a9eaab4ce1dc2ebb40e54428721bc1c237d20e139469314c29b4a3f214751199226841fd65fab669f2c293908af2e0495a0412a624e10defdcf0709afd61e7781702b4d88b163f848313a40782672f75761d2a4cc1fbcdf902b85c5f62d8b1f5c8ddc954f34d607ff438a629b35ab6ccef8e0c6584915d6d91efc389e1cba87b3ec74991e9c98825d5a87fec9c195073f84e8108b1dc777b6f0e0e794356f26bf15c6ba83ebf669726059b3a65776702d6cc2255955072ff769c7b9a347e242073fd688ec40dad7d3630e5eceee961e678b62b71cbc4a1a25a925264b8c83f3f663f963ea8bebe0e04cdf5f86fb4fd5aa4911e30d6e05cfa8e571109f330911c30d8ebce6ded0b8b4c19f2ca99307f5fd5f151bbe10ce53071d522cb9585d839ba14722db5c4c88a106bf7c443ab6b7480d49831fe608319a79ec65f5e130c44083a795455624bf60887106e72fa9484bcc47b61dc30cde799aa7e89872989ac528831f2d7325cdfeb125916290c10f324d6fad3706bf277ffa24993e77c7108317a1e53c36c86676334618bcf940ae03cd124cd3c4781c31bee066180b2ea576c966e20557d5524564bef34f7e17dccc79429c489ca70c73b1759683185cf0da5375852017184c83185bf02ace3f36cdac11fed1829bb53abedab6919c3fb64819c4c8821fa2e2be3d858ea7432c3897f264df1837358f71b1750557d42c64a4325bcbf62186159c1c6677dfacf6f5e657c1dbd8398e3368baf78de162cb84e1c50b900831a8e0df98faddfb7de0999c8217db248449a99e66f2c59182638b300c181d460c29f8fd3972d49c3c59c48882575953d7696da9fd5070d26a44e592cfeb63f182055b1ce58a184fe8b25648bbe49ce0d5f747e9552fd61a89d104275eed82cfa4907e7ba18156c46082779b43878f30cff0314bf0a254f5775039281b318612fc3084075feef9c24d6c8f102309fe4fba0ade59eab23b48f0d6fe55a5031569d31cc17f995eef0c8911344611300611fca822fb3f6a6d086eb7c79184c41cb9c4b5841842e8da73bfa46304c18f4655e5644323463e06100c125307296ac80fbcdc71322dedf8e08e37a6c5b85c7a40e6efcec14cf43cf02a25252ace63077edcdf9922bad681a329f2479be53843c639f0b3e6385eadf78eeb4371e057faa0b6de73032f8b86908378897677c6b0814925e7ca746731520ba746e2dd2c2b5af8173dad66e224327766e1d4473ff389b62c6e93bc19258e85f7e95aaeb18485571da444b779b5c89157b831d53be6945f336c5ce1a470999c337bc8f05be1c7d6d829bade53dacf0a37a510555931ab36c7b10ab7831c72982c5bc9660f55f83163f9b6844db726a7c29c474af2c72e7563a2c2f73c1fd541d3fc3f7b0a377dac1e3d336b8a536ed55c653e61624729fc6c39bf5d7497983325851762dea8f48e2c878f1c459646f2460ea273bc280c8b312387394a6ff443e1791023e4b01550381b3165a3867cc2c9f1519e34d2e4709527fc888f91d6f368ca612736fb73959c533bc6092fee4f5bc262ea33da8411368410c4e4628b0c03d08413d22f7d1061fd539e4c381f7afa1c652dd9670c261295d26097bf84f3398a9d27ceea52d2125ed234c135bbd587a152096f43fa8fde424ca97228e1e7d618553e3aae8f3209e73aad87906f3b7f1c92f0b27d881ac3a5657723e18739bd234374dc390909673407a17a62e411841b4d6e12e308d77ebd3e8a4eef5d69849f2ba78df0b072dc3d23fc8bd5dae571ec5c2ec24f7f4babab15f1796ccca525c2d97c215b9e17d91c8a08ef3f6b4c1faf5fe6104e84b7dca14c5b6df20de16be5cc8a9d42782a1d45d4ea3808e1f6dc6f068d109db3c7208e209e839298d22505e15fae79fbab74200a89946eeb3e8e2640387193ed347bf41fbc8f43e71cc9a3fd4084f475b91493c7edf5c1b5e47f29a7cd714735f3e178fb38b6700fae87afee20c5d5839f83d89a87b3bb8418427454f93e78f0ef53761c5479e41e7707bf2c2c7c799437c729b583339a3bb68cf920eaa30e7c8c8a31e530c71da3832ff6ff9dbeedd5b49c83511573dc217b8614b61c3c2fadd70a9e38781f793c34724f761e0e84a87cc125f75418dfe0cabd44ccb176f5c92c089552f02ca4bacc32a131c22878193af41c778c1de51c14fc8ce91d85f4b149774ff0c3d08aec0e7382975324f6f6868ba135c1174d299364d487d162821b7294a3e4b496e049fba87c903257564af05245c8d2ecefb72a097e10527aba8b69ec4307129cba0f59f5417290d271042faf5fba8c7418c10d1da607ddf3299d53043745998c670fa34d0e11bc645d15dc21b81e955d730826590bc1cd1965b662d9cc1b0427be83ba9f9b6513089eac445947da4af0fcc0f95c1f7da776b3cf077e84a76fca6678cbf4c077b94f159172ff8407de5f8e63794739c00efca8e3ad4992538c8e72001d385ed6215d8b79b8ca0172e0845039ccd9c73f29e40038f03dca41c2a6567b0939c00dbc288fa255d286f2200938800d7cd91c2b74476ae1d846b9ca10ecc3e769e19dd684c7f9cd3d3c66e14713424c394e9bdab42c9c9e0876962b7786742c9cc91bf75148f9c9372c9c35efe0ad738ae9ef573817c3c71b7c57f8693ac5a887a487dd0a279d44e720e5ce97352bbcdb8ad6395ac50a5985f31f4a6d6c8d4aad0a37668aa7cc4a332ea7c2f76023a36999dfcaa87063b6edaccf1fc7fa148ea57bc8a19885aa4de18d67a57043fbdcb3fca3284941858cc20df691d78c2b0ab7deb447c35068bf390812ab8282abb168159a7ec2f598bbaa247b2a0f4f381a835cf8d8eaf46527bc28293ec55776f992137ee8f7d6482321addc849b3caadf9837849b50135e8478554e294cf62f139e4d5d761c478bd51b269ca834d9a1b2be8413a2dd87d1375eea6a4bf8513a97927b9f94a7ae84eb2396ae634a53c20f52ca42e6ca2c1bf524fcd414434e1d95fa7b24e1a5d4603967ef38b427126e0e326f4bf44f8b1e4838993654f6795f34cf233cc93efed31ec5fa8e23bc10b52e6a348494368df02bb52a4c76480b1b46b8151a953ea3c2ad6611aef4864647b5390c1945f82942fecd914984137a2a6787c84abe20c273b7b69aced4f09743f861b0581fc28518b518c20fe672fc9bb3570a2185f0ad627658dfa7f21342f8311a72c60aa61d4c06e10762ad599f20fcee50bff271a1251208afde526c594b5c0f083f8e393a8f473a4dfd07a7cc3ca60a17c362ef07afdc36c264fae065c8c79afae083a7c9c6638cedc1f114317f242322293d38f741d24abfec6a1d79f0623c6aba089ac3e8c08397af4e43dbb22ce60ebec4beede0fb658ec3b5c73373d781d90ea483db95b263344799369e831f74bc695210e5e0c6d439fabcc6c1dfa4b943f1150eae654e92f9dc342a7d839721d9f12de5414abac10d1d87d9632b5cfb6c83671a39c741d2d431996cf0ac5243541fd7e07465956c1ec658caa9c10fdb614e558fe9bc4b83ff7190c3b8d5d67cd0e087f07392dd3378bdedd1a5ac0e0f33381bdd7bc3bc6570bd83f5b05346062f25e6495932ba778cc17b4bb9376214afaec4e09d057b0f6518bcecc8476390180ccefdbf77c871bee0877e29671b8f17bc145273f061da2c962ef85a23bd31fabbf35cf06354262651f1efb7e0a5ec142cc3460b4e6bc654a9e262684d16885e1d7c482958f0b5dd6247989bf82857d8ae6445836a0527749810217c7b1456c14bde6973850a61b64205e754623a4cade1a932055742beec41ecaceb102938a15fbd3af351705cbeec3f780ebee3a1e07b0e3b753a9fe05cd01056511b6639c10f2ebae5ac9247e99be06594778f3f8c0e1a2678b933640a1faf5b64095e84d09b11568267f769f1ef9104a73e7f1c7ae88104e7fa7344f5f4b1cfe3084e0e3a42bc4c99dd6d044722653bb06c566a17c10f513307496622f82769a93ea423cdd921f892751fe628c71c9b2b0437e58e62f28c06c1f730735467962e4305821f27c96129da64f8c81ff822b612c2f47a10a50f1c33fbc91b246687600fbc4c3158a69b8f5b451ef87d1a6fb9fb8314b20327d9c7a1e7f9dbf6381db831776ba596f9162f075eb4ec100f217b640c07aeab4fe6685bb63206b8819b5fca26967d5c6f001b781df97a35c7e553d7c20bda21244d7972eecaf058c93ccc5acdc2f98aa134e7cd70175938123d3bfe2894e68b36165e7ce8133d473e2cdcb056a1736d7988cf2b9c303194cb755ce16a85bef4c85208dfb4c28ff6917fda9e70b16185d71f555cfe2c4a8e55f8d7b1c74345b0e05154e1ab767c3908396ab44a2a9c9e994b97b7a35454b8f5a9c25a8edc29494ee1e49bdc418839c8111253f8ef963c8e42be147e8c9ddd36ea34073d298a985635cb1fa370bd3ecc3c7fc4ce1ea2f073ecb952ce23147ed0724b33d11dc530289c1ccea3f9c935a7f127fc1017347bc7ed61c69e703e481eb6aadc0937b9698e6cd2478d2c27fc568f327290183ede4de09303a9f50fd584dbe9cd639294cc5ccd8493e67148ee9a63d78909ff35c2574a6dbd6dea25bc99bb54b163094f428eeea38e2cf66325fc28b6e3d764172585126ebabece7c7196fd49f8c1d29b6f4f648c92f0d652847f0f6be922e1479914113465c57490f043aca6f031e5e0ed23dcbca5da97426f089a23bc28a61d474937b3aa11fe878c9d3c3a9ec830c2f30e3e9c644c49c3a48b7025b2cfa25fc44c114ee694e1eb2b89f02d3a8ec73c06117e0c3955d33c840e630ee14a6ad792397b558d219c7416ca3fe410b92b85702b7518c27f74ccac10c20da95f4f7910aea5cc9c42737f50124178919e6adff1658e914038e3b1fa67f324361140f871d47879349dfff3073f6c9c5ffe2d898e1fdc10cd41a3c61c65f4fbe0c72c6ad71d84d2f0f9e0e5a9081297ce93f57bf07269d80e2b7f90cf430fde86ca520dc9fb3f79f093bf44a494c6833f371e9d64b21bb3efe0aaa7e710edae1df51f695e8f3267b90e6eb7664df1618e89321dfcbba43ed391de4a9e83172cfbfc6a2c073fd2ae58173193e5c4c10be396fe29c2fa0f073fb4ed896e1e43a76f7025888a7bfe4e9aad1b9c546fed39d536f86e1ee788930d6e6cb986e6c91b9daec18f3247fd1e199d326af0a312ef8e47ab7325d3e0fbe5b0535a5b0f3e687025ddc392cd61a9e50c8e4d6a0e22df9ce4308367f159b56337ff0ecbe0498cc86f6bca9a0c9eca4756f48cc14d93261e3a2ec570598ebd30b8b93e0a9ed181c18f88ff5af7dc51e60b7e468de778096abf17fcb0a93f66c4f4a1ed821bf37b5cfa7555d2b8e07768161beb3129b305af42a37cc428b5e0474c512aeec982df9192da771c2cf861e63c76472186d4b9829fa3beebb11cbaf35638086fabe0a73877f31012fba6829f72ec9b704ec189704b69a191829f3b9889cb11053f7b700b4bf93ca40b147cad309adda33cc1cfc93d4c158ba810e204a7530869823716b3b2e4ac262d61825b2949aae6ef9827bf045f353a7b234b18f195e066f449bb764bc93992e07de68f526c4ac99303097eb2aeb5f18ad27e1fc17f9ff6a8e41d7dd846f0c27806499ddbaec345703bd88e93c6f441083311dc9a8ab89b5893cf1d82f3eed2df9999735e85e05884c672d70e490d829fb286c98a09047f237bfa851ca4cff2077e58e40c8b613eaef481272947c991e981abed9653a2689685077ed0d1367fb13f0eb2033f567c681b3d126975e0ffe63953150b90032f6cfec366bfb2fc1500077e249d9d255d3e89ae0037f023bf5c3612726d8a15c0067ed8d7f93cad3286ad165e6cb41c2a365af8519a986d9259a7c92c9cbc621d694bcef943167e858995e314652bb1f0d45f2be7e8520561e1b84792263d5fe5fa157ef0dfd3ada66d63b9c2d9f48186fe68ec2aadf0d62b47b0b14829cb0ab7630f2b7d24e12adc8c728b2947a80abfdea227582c9b8e3015be5fd545e5303a8e0851e104fb0efaaa62adc7398537f641ba2bc7b1bcc7145e6dc4d4ea94c2ed305ad424e37711527895434f72f5d1dd3c0a3f4fca986286cdde8ac271f30b17257d6a86c2eb3a3593cd80c29fa9d7f8cc7cc20fedb183af142a2d9ef05288b38b3df127e984177f412c956685ac70c2ebb1f338a6ca26fc186e42c2868c29af09dffeb2df8924136e6a8851e22398f0256d5427e98ea27309cf434b59f5bf25fcf451c75399551ec757c2491f6d78743c259c143cca3a940dd932092f3c580a9e9364f99084ff31855812b6634a1f91f082a58b1e3cb49608094fb3624e533fc289fefb0f153bc24d1edb46f8514cc5a7d258b95e4638eea369c5738e83f02ec29f0ed3be43c7b1ab5584efa16a089dd22a443411ae660e55d4a453f78a0827c4b4f92b26a3c27a083fea682bb93cb5c7aa21dc786bf5ac4d9e2f2d8497aa766df3b9ce4d42f8a9b9d36b3a085f543d8a09f2d6a320bc694ddd51bb2731108eb8e4b8de83b4660908c77fe5d4a492471effe074a8e17fd38c4f871f9c4a135bfbc32746fbe0044f95cc32ed933c3e387ee1de7bed324bf6e078b40ea2a64eafad1efc73efeee8687bcd3cb81edfe6af110f7e0cefce76d91d0ca9af52f6783b90e6b73ab81e5ad6e0db35b92a3ab81d8748afcc1d2e85c8c12b8b2995dd2671703d54ef8f573a38781fcaebfa63c8aa746f703a7a0e2ef391f345e70657d2628769a80f2ca60dce46878e1e877414346c7072868f6369bf64cb1a7ceb0f79de72f5fd6a703d7be4a04572be701a5ccb7739c75f4183bf2134a4671a0b5e398313a33d9121a6ceaa98c18fead0d724a40c8e89a7c5ecfe4af927836f39ce399aabf1a8ff3178926e2ec4f42858ff6270c2fc6d75dcbacc1f066f2a849ef09863c607839f525ef320390cf71c5ff04337d5140f29217d78c18f3653b8ea4bd1bfa30b6e48b19c2485b372990bce59f684a40f72d0f1161ca91cbedfbde318b35af08367faccc741d566b3e046bb1cabc574d074b1e0d55b78c755dd26ed153c099b434d9f90c9572b3861fba543e47ca779f1b0a3b4c20d99a952adfb2353cb0a672efdba8ac52cac5556c5baff63ac3437d31db3a10a2ff664ffcf9b6e1e7ede48859f2de95108d73aef3750e1c5ca1aa9627b8698be53f827d33d99f2fba5e698c28bbba41eb2f3c4985429fca0f597a23b59be5092c299bed8162dd9a370a3e40fda91dce5ba4c149c654578b95876677cc7a1ba22caebe650b829ddff7564c7b61cb2010abf446c638aea486df9849b428ed581470a911896c28627fc8f5bcd42a8eb550b373ae19c78960e82b1c50a0e521d48c20627fc2862c71d346724e0c5c6265c0f1bce43e227c7686bd4d8a270b0a109b7f307edd8983f7a8f63055e8071180e6c511b99f083905c6d5372112d4c50e92932965d1313193652f89770babb2445788dd259870146172940b584bfb221b572b08401461717d8a8847fd9f5b17b4e295157b4997d887a7a109d7b42cbbbfc4938eefeb9225473f6201e614312cef976678e241d093e4e2675f9e28684973aec3a5d5269afec1187f1b87338c29678abb0b70ef70a79aff1289bd036c2550be92b98472184ba1b8cf0e37c1693a6cfb1087f725853eb137b091b8af0673d7c18d357527f4d02612311fe9a7af9c7f9d307416344d84084af6934c2a52c1b61e310ce8c4c276d172f4def8621908fb78314a23c0b001b6c14c2db681e2ce6d01d734cae0e3608e17b1c678cae0c51a9a941f821a4b76c99b3e5941e82f0831c66cc71777ebd06a292abcdaaacaeac7c5e51228df87ff600e1af44358b31440c6697fdc10feeda2b751cf7e4982fb65081f9628b177451aa0a3b60c30f4e4ecb24b12f52c7aa45b0d1072f870813d9fbaa2ae40d3e2053a7eeb61aa6d26de961f4506334dfaefed88d3d781163aaec9f8fb1adc2c596bd0bc0c0aa056ce8c1ff402cb43a0cbfc8835f21e4683347cfc596a5800b30b6b00ae374c10518c9800d3cf871b9a475de1cc3a4f9c25841171f3841170fa851a3460dde2d54e08215d0c61dbe08030c177cb1c51602d8b083a7f59623dfd47182159814a4e0e08264d5c129b79c3938952437aa0ba81eb0410727786be6f76b71f54e7080018651c1165812d8988313527ef3205c7a6ffa2a0c1674f1052939f076112f2257259135356f96b3db448c1e0bbce00d6cc4c12fd390d992c1a3a6145b75a0cd7bf1451860e80aba48c11746058a81116c711b70f0f387db0c39763ce98336dee07faab75f8c1eb9e106ada32eee4ecb23d4253eaf8a791c39ecb68f8160a30dbe7a6c99f6d1c63cd9dba20b161c5b18166cb1050646b0458d0d36f89f39a5c89363b61e8b8b2d2ec070410a4e5a60630d6ea6314f79324586ac1729b80d3538d61dfc88bc5e5ce02eb091062dadd3ba34c35633cdb6e66290b953b58f49738213787101167881811a354ee0450af2be0883051b68702c9ac6a0622f7e1ee4622b055d187206ef425b7cf6278fe09a2f5a00066e6c98c1f7d850219fd4d25c9e8bad93822e0c29832713730af3fa4bea09e38b1680915c8471a80055f05da4003130822d686c90c1dba4314721746757c7e08ac66cfa7d58a11d31f8315b8e223950cb09831f7f0ea2b6e251ee3060f06cc6265708ff3959bee05784201ff786f178c10f7334ef318dfb8574c149e96f51e9a639940b6ece9ec1453ad58c640b4eca665b16ee344cb4e08b5d6a0a92d2a5f6f70e26fbdd7b2c389d992ed9edea9d2b38b235bfa1d6a3d86105e72a778ef139b09c1d557033648d930ace9b7cb470e9297819fee73cdb43b1b414fc9118b2759028b8b6a93f8378471681821f89c6a658988fb59fe07ab86fada8589ced044f52da48f1f19a857013fcd0c346abc87124394cf02d36422563489163096e481fc12347555a2bc10bd1c166869cd2c649f03227b3489535d521c1f5207fdcae1259b53d82e3a5213ab5467053e5e8e314db577711b4cb9ed006113c3b931ca6979cd9d3b3310427a70c95b4729c3aa4674308ceca7fe4f164f74fc9b3110437f465cae1a291f3793680e06d0e391ef994424ef36cfcc08b6079e22323692acf860ffce875de4198e46dc1b3d1833f7bdc23d1e581131e9f63348c45b703e762b4f7adeaa0a203bf62088dd530078e7814e9adbe0d1c789fea714ef213a6be8d1b782aee5d975ed299b7610327b79a4711e9e31baf165e8a0923293b8ed26b87167e471b169ebd269c7666e1857d1c449ab2f02a3c76670a1b2967b1f0259a8ca51c62d607165e0e136b3ec7ce9257f817f239ca945aa9e50a27e714d3e5dd61c76985b72efd59c3c692301d56b85146e3fa833a4f59859bb54d3ac5b8146355f84126c5d87452e15f7d6b06f3a0c20f16730aafc7dd6352f630a9620a5f632bd67df4518a29851bf31e2ba490c2b3f0968c12320abf26b4c207d1ef3f88289c4d3d69fa0c853715bd4dd3dfc620289cb6912c62295f0a924f7829115390a858a9239e707ab3739035b30c914eb81aae1e568c8e909f134e5a86ec3064aba0fe26fc38720fb1f3cd4bea356125bf9cda1f4726fc54291fa61ef1f83c30e1a6ed914b96dcc2765cc2e94b1f65d7b425dc0e72b678f88e1ea42be1db7d18d971e71c7253c2d39c695b622b33d793f07360725922857f9925e149c664f69fce718c23e1c61434e7ce3239430c09275e24856675966b1f4184fbf3924d1de17d14c226767dd49a36c215f54f6da119c62319e1a8c744d5ca1e4de722fc8f467324e36d174e45f841d2491eef12e16f4c1aa53ffa87194484f7e92d857d203165f0107e040b734136fca268083723e51842f028c28485f0936407a9912384ff39b3cd86078f633708df0397bbedc958a320bc8f2aaad53eacc50a849783b07eb36eeb6105083f9c995fd6fcc1fba01a2ac37399871f9ca416aa434da60f7e289363f48997d0c8f0c10932397d58397bf0a37a771817a207ffe8c129cb9d3a79270f9ec6589f6c62f0bae0c1afdcd9730cffe023e60e5e7b7cb183539a3b2454eae0873972f4317d70c1a583ef992a31690ae123998363f9a3935c297db372f03de54aee7d1c9c742ba6ea3d1c9c90439979a455abbcc153f5a0b28accb4ef063774fac852eed82dc7d106ef5d3eb00ff9f38d071bbc8f4e6a9dd3327af41afc8ee73ebe540d4eda8a9d95638f2ac569702673e821cd46839f912c26979cc149e7a3d616dac3bc197cb3dff064d3e797c1495531f75493c1b3b33149511d8393c94672faa468a38ac1491be722a1d3a34bc3e0c9e4e06d29f64a8e04832bee41ff57a4aa07bfe0f95a88d029e8052f7b9691986ace65ec829f6ae1e319f34873b8e0e7cd9888892db2b92d78b93fb5848a18fd3a2d78136361426c89e7c8826f79f278967df96b58f0d275fc5a26623969577022222bf67c58e295150ec248feee5855c1894924a6145eb93a54f083c9db1e3705254f8e9143450a5e6a5289e935240a6e482ef2713c1628b8c96da225a67f7c79821fc6c58ccb92db3e27b8e1710ed5e2728cd56982bf39ce379b63cd39c304bf54ec249c4bc8d6c743865109558ccffa7c26094e8e2a4729a305099e851ca61c5cf9d7468ee0bb472166e690b152c4085e08398e6899c2f5e58be0a73c29c7131e4470f37d184663de48d13104b743c81d875e087e5c21c79572e430dd41f0e3102ec7dbea1db440702d8450267f3167f3074eea891dc5ec286dd83ef07e26bc6358c90c750fd61c2a5a2c0d0ffcb2b90e3a8ea6fb8377e0e6aaeb491e1df8a6ea1f07570edc8eab3ca590c581f315be56ed0dfc1c269329f769481060033f3e0a59f2abb570724c4134a6ce725269e1c76130d114d159f8df79629ab01256230b3ff020f7e6138bbac4c20d19636bbab78f21b0f027d8b5759a0c96bdc2f1d86453b694ef2a5de15a8a11e71f6c851fa6ac3c6b6485133bf038b29854307115dee638248f1682670855e19bc731a46473ee38970abf5a3e920f2544a643856b1e473139fa3cfad829fcaebc21a5c542d29829bc4a2e5b29973f47560a6fc42f420ab7ad4b7286ef706a915178122b872963f7077922a2f0abb327c4431f0adfc3467b8efe79c20714be450a0bb93d5e8d9e4fb89a3656e4303a5a763ce1dc8da758673ef1309df0443458b0bc2177a4e1842fd9999673d4ea39b309b77275889af346b2144df8914afa8e3a997574c9846fffd92c5b65e5ab60c27331b32c0f3999e6124e4ae7ccad29470cb18413738c1243ae849761fad206cfd9b194f0d64cb352ead6ecc824bcf4edb61d7e49f869528cc9b28f849f72ba9c3e9258110f48b81d2654943693db8e47f89e82aa457438c20d29738e432c6af67423fc38fa2883947b349a66846b729eb2868ae93e7a11ae67d9e09f61430ab5229cea286bca5227c28b219484b31c45af20c2b394fca14b88d6371fc22d93ec3996cdaa8a21bc0ff5d01f47918b6c219c1c4426757c84f06bdc73902a1d8493d7c3741b9ded422a08ffdd53e64eed953b32108e66ef9421de2ad70908cf23654df0f30f5bfec1d7709f29b2e32d1ffde0888ba528967a7cbe3e78a9352b92d1dfb6e3831ba135dd6a5f9c670fde64694bada93175f4e098650ec5c62f36260f4e5cdd5a0ea3078f030f5ea61c6bee204436b63b7875de1f840caff0cc0e5eb40a390ec283c831ab83df1263989842072f4a4a39889123c65b3f072f7d98e39e88c90aebe5e04627390e6e4e6917f5beeecc818393c7db3f9387cfe50d4e270b6e91376ef0ede5235aa749744d1bbccb1c25a2648397c390cf18d5e39e5983e3817f320feb715d8a1a1c1b19f1acb1b672d2e0fa892509963b98074183932ae7e6317557cc193ce94e131e7d33a02165703c89aac5e8f155f964706ce63c8cc1f2e6c818dc48313c3226710d8bc10bf9d80e3eabc5360cbe44c8299face4283bc0e085c9e123491e31a45ff03fec0e2486da94587bc195902991a84f92d3053f4afa63c2528ec25cf02a7d18973d795bdd2d38e9fd2b47f7214b460b5e856745084133250bfea754b9b3ad58f0b4cfa34a41bd8297572b86902243f2482bf8d27188ce548b746615bc8e9db3974905ef3a96d95c15ea564ec1cfa27541baa30b0335d6e04fce29a79c3e31c73fd5508313323b7a98bd37c7d2a7c14b52eba1e71c26b9bfa0c17bcb29575a98902c6c6a9cc10fd45c2c977c7e50c30c4eb5a492d58eb5366519dc4c1a1d7358ab99f385b9e200c7e00bae4106ef3dc8df352b1d440f1a83ff95917cb3e5387fe41083ffb16dff88ca61f0cb6d523078b162eedb58096a577dc1691993bce0c714d27f7c1c540cf9d305b727d347b221d6e0829f43b68fffac3b47c6d4d80256eda66a9fb121993a72ca9152430b4e287f0f5972eef5ecb2e07dc584a5a5160029d4c082d71e76567d566feae4158c2dd917b493a68615fc1cc40edb516d35aae0dda58739f8daa648550d2a781d9322f685cad86b4dc133f1b39f4b661f41ab21854a225cbdc4b3db3f45c761f25ca79428f81efc6f76924f179f5f64208c2e9e6a40c189317956091ead553abb45d1a0c613bc0c691f9a48ac66ab38c195892cff0c25175b2970810ab01650a3095eead452dede71b155bc50c1162fe8a2aca67d00b7c81a4cc0446d6525cd3d6ea4da530ea15e61420ebd1a4bc0c3ab3a66a4bd1a4af0a3e418d523bf6b24c1ff782e33410d2478c95cca23357bb8ce41358ee07cd011933a0acdea670d23b839cdb6f2dc45bf0b1d1f6a14c1cdad31720ec254938670c0053588e044f5285ba7ef188217a3d4f26d9ba7206b0d21789b377e7387641070950bad2f0f0f912daf48d95463f0fce7670d20b8f943baa5af508d1f78317d1c8597dc686c54c3075eb28a3c217610f56bf4c08b1dd39e03ffe0f3b13578e0d6467d798efe0ebc4ff2d7b93e7fecb8d6812f2556fea1c8f9a6a9460efc157b8f21fca4f848db410d1c78221f85b49023dd6adca069cb3ad5f07899f56ad8c0e9f4183643566ae157a7e4db964fe7a9a685174d93254b9b5938d1cc276f92ee78a3280b37326bc5dbe5dbbdf3a20b1ab1f0b5bd43f4f54fb1013460e17c14ab932f890abcf8420229f0e29c8374e0cd0a345ee10a67a4a245394b5be1c874960929fa8b4a8815a0c10a3707d6410aef1e1e73ce2afca02124e4281d55f82d39e88b1239346f4c2a9c50cb7d11613c5f5950e17cb04a1a73189e39f23885e313293964ba47e9834de19da4cb5c67bf1e79b0145e5aaa0b69aa228597f2f45cc8d1cf7ab246e1895864b5dbf049461285e7bd1d9235191de51e0323d8a20b1aa120bcbb2ea6e6ccba5c3a68a59453d88e06289c641d2264dfe827f6ac4ef35a8f9334f3ce41e5f65852746c3ce1b4af64acfc49245cccd3e8841f29a7f021f6458f5f2a3438e15ae80ed3d6e6686cc2f18f5972e4f46868c2bb0966131fb287d9c74cb895d583a68eee474303c384118307c48006263009198d93b4cf6040e312cec73fd541ce1c96a024625cc2e34443e6b633ca448e9b5425dc4822f9bd2e4c0947aa7e23c3497e406312ae6a76da761b25e175745e1725e6bca69a48f8a1e55053884820e1a58491508f5a2585f8115e24f7ff984c39d2d83ac2f7d0d73c8e36a68fc735c2cf41960d29d46784f7b92ba5c71d5c4461e6716791f1e63dc9c358af082f04092a398eee72611a89f043aa7b54f76977c88108673de6f83dc474eeef1cc2d99088507eb51ed6c410ce673b0fcb3b3afdef42e4b6a22a59ef6521de5539a8ca1e2ca5c8488f107e1c7b5699746d15680cc2f3bb10fe628809c297ae18a5a7c3e88f628158a542522542d6ace63ebe903420fc384b984e9321c337f8072f49769c2b578c4f1de407277fce2629c4e8e9238f3e34652d27ef51976a5e26d197eda5154172f0c1fb38233eaeb2ecc1b1b4f133db512fa0a107d73bb67e992a4d1eb677061a7970ad2622bbe51c68a08107278878184248be71e3d1b883375152d49e790fddb71dbc8be930b2265407ff553ec8418e2a74f0a34d26edb183e409cfc192ad16abd6146f49096b8d918a395a0ece07a13f556d44230e7ed2ec5959b4c39472c0c1ab8fb6159115491de40b2f24805b031a6ff0b2e5ec9d3199774cef063f98921c42da1c297ae6f8c2ab0d7e1ccb79ccae90d35684061bdc482a41c634668af28a69acc1cf1e39b45384d5e05ca808b229d633a6541af2940fb9cbe9a3c1cd39a38f7a449be990c6191c09e571ec2853766c9bc15b7ff140727f06b9b60c7e871c7a90c10fb2cdf585bf1c61b531705fa2219231657116eb115b44424aa798187c390ffad42a0b4356b1769e325612369f11338520f6c126248a60f03587f8ccb3e182b8c00b10f080c617dc54b38f1eede8b56337a0e1053ff9df588748a769ac9d018d2ef8bd1e7c5bce2c122b840b4eff871ea22593c61614abaea9913497d4d8b6df88f513a9a6a105377518bdcef3a65c9366c18f5268cf97333b738ea48105bf2d6a7aceafb973ecb98213ca254be890ade0a5a70eb36c39c8c6a80a6e5db8e49155f0cec1a854f0e353796c6c7aceb1e262eb042bd805d098829fcddd33cdc4b8d88ac1910253321540430aaed445394b9675952e5170c58309e91edd52b98602776b5b25325257e3a7bd91557c825f79c343a8faa8734e2f136838c1ed28933be6b553f9c409349ae06a872d1afdeb3bf630c19199edde90f925f8e9f279f4b14b3494e067ea4ce96147a6393322a09104ff25bb47c1e3be889e41829b7b735839a87d84466dd553bc624decbb3607afacb9e6e3a36104b7d3ed338fa56814c1cff1f44732398a06117c8fe9e3991ccf07991c34a03104ec3e4aa6ee89da808610bc770d5e1ec60cb1262708defc4848fe7cf141f00061ab1b95956c2dab8de84afe33c973c77624971f387296d2c5687e631e4cc3075e0ee222a5b1e84d6147a00b347ae04a38891e476a8e83845790041a3cf0d64224a4740bc933b883c2d42a3ac6cb5536694c7a69e860cbccb8cb2e29bbcce8aa8c14c22b648ec3252eb668e4c0f9d06f1d7ab686988368e0c0b9f671f1ec48534e1b1a3770fdfbc4a3d9102eff84860d1ceb9cd13e6ebeac4f2eb6bc08630b3050701816a05560462dbc943752c59c6bb2f7dc8119b4702d3349aa68698d1a555f80b13366e1a5cdd41dbc86b270227c74f5314962e1a47c9329c33278871558d4a215dbd52255ee362f390e8f36f2fb0a3fb4d0719a438e2bbcfa9446f36d8c291fd30a6f4a63ca9d31acf05346d8a8b461269255f89dee293586c7fc5155781333bf59678af4b1920a673aecd248539f6c54385d696424b8f97d4d4ee106af0991a9d9716a4ce19987ac3158cab210520a3fc8ca07673e299cdad05bb79d517877122dbb32224f8828dc1c07eb21797684c2f758631e73ea008553214a92b3530f72e8f8849f2f8f6f867464966a4ff8416ffed0622abadf9d70343dc6b2c709bfc62b4fb466e4ab78139ea598796e6e4d38e79fae836c33416b68ef50fe03137e0a2657de1ea690f5125e4a0f35f96b7dea534bb8e13dc8c16f07aa15530967d5633bda9794f03ab68fcba1949370726945cf1463dab428093f8c65f9bd031ff1c922e105f7b0963fbe20e1fd47e4d4563fc2e98e93da54d48e2b48331ce17534b39e7e723ca311be79d49683f530a964b88cf03b70e9e8e55e04d9a723781ca33314e18b847ccb895ae78c6724c2c951da76d0b1bb72cc20c2894f95b3d2d9f57bee105e0eeff5ca1355529a0ce107b7f12ab318f3854e219cba0b3174744f88b32c4dcb3be32ea55bac374d06f3c8caa4c283f03b44f1118bc8917546108e66fed01dc2a7e5c01208af62d68890feb2ab2a80f0eb62b68f273a3089fcc1f5c966b13d9ef8c1c9e01fa3f45dfab0923e38a5d1b3797ff0c18fd44335cdc27bfa7f0fde8f45cb79fcdbbf7d3df851a4bf27f67fc5c89107ef3d0e9d2b4bee8c4be3c1eb309447d25cdfc1ad30f93e779ebef1d90e07d9265b07e7435d75103ff2331ddc181ea6e093d2d46673703cba972441e33f2296831fc4b4f153afc9cddc3878722fe629f7a4dc3170f06efb93f4ff779027fa066f2d438ee4a7e330f36ef0ff7d6dc2e5c891c56df063dfc810739633d8e047464ab9af424ed98233d6e0686c984b31c786f7c0196a288b787cb2b5310dbe475f479d91ef230dd1e084b449a288f765ca9fc1cf72c93c58c80c8e7daa9ca9528644580667d663c911aadc543a32f89d345888cb6163f0358568c65c89c1f14054b335fb6c0e5918bcaeebacbee4e69a0383ebae5e31878acb53d517fc943c0a1d741879c1cdd453c9c3aa762fcb8c2e78ee1b62b5fa9f7a79580833b8e0c7305ff9349b2db82eb2c12635a5091e99a10537cc7868a5edde285f169ca9c98e3e87cb2fdb61e1b2aa78cd4e891a29ab37b96e91f20aae45becc71b48c153c559f8f3fa70b39e5ac0a4db47c4aa5c7cac7bbf95f7d67474a05cfd3d7490efb7328dd14bc34bbd9f00831a637430a9e7b581dbb07761f75a4e1408d1a4e9811052755858d51161dcf57a0e047592343d966b7cf3cc1bfd41922d3d638cc70829783ce1f623af72c95ecc0173498d104472c46df768f8a89640613fc38b630591fc7db12aa194bd02b2eb6eab2264e666653c7a8b4fe511382194af0725dfada0cd28c24f4b35951ca2f8404cf2ab8a85a08d6a8b10500dc30e308acc86c744ad6c59667a894657694a24db2314930c308cea44a9875190bb57946115ca9243ed9fb23bfed10c14f512de5b29bc71e3d660cc1b35c29b7577d9c334709c1cda1c3346bbad4586d10bc105d913768464bf00082ef71f420da27e9f3b366fca0ecb2aff77439f5d841d4af48ca9fc2337ce0c7fa383b6bf7356a7c61460ffc9aa88f1d59c87970171566f0c01b9f0fe5993eca5d31e2c18c1d3839fd85e4b4195386ac03bf2ea4106be55353c766e4c00f36513296c77bcc51b89881033f4d4ae49f1ce5067e2c19daba932c821936f02c4c6c6b8e8a149d530ba7430ef28dc84f0bacbcd2eba3a3dc453c347314a29d2db3f0e3e389d948933b458981116cc1820d5938dd414cb5a33f547446868d58381d33425c7f59f48e030bd7facffb7e62c45ce52b7cbbf2f90f993762785ce1755de8988ad8a874e903e3e10182c161c16824128642c1cd7e23006315080010541a0c45721c0792381c7e1480015d1e1428281c1010120e101210080a120a060806060008060606000006080685414276608e65301f113ffb4f02b53e38081a6d1e2e448eefe4e0fb5cc5a118bde5a418ef40a7a3ff30dfdc617d9b34ffd7f073d12f7e1bb37969b31c27467445e227f755a721f8aaf4ed82f77e9665f5bdba1d93731f72fa089045db88560ebb5199a4d834c95ed3e0c3d8e404d1a98cdaa2134f16942e68ba9fba41b2ba300222fd6a06b1c1ca6a896b6ccfdc63360f18c3951a5ac915597f4aedadcef6e00fc63a94a3a3b4606bbf1e2970253b672a21a18e88f40dbbad6a3435a3816bde8308bdcfcb169b680e54db13f5408b1acb24ca84317ee7365b9dbc93794b5579120d7a4ae5240048fbc521b26c423e8706e73d5f85f5ac1c5afa60d3a589fa8152aa14171dd0cfd013d14c91443aa1ce2f0943e1a836035a3a983c7980437517be3861a1f8f79b8c1b1f927fafd06f66e40a472275af5edc8473ad22bf37e0afda5492f7681368876d3003b81786e5f64530fec6c8e0351b39ae5ce166f2c92c2e4f8d4fd982f223b601fc623f544a3904486588ffa2f4609c33ecec7c0752a2af78c9e50cae72365db4ffd4d9d5f034c4951e28cf8a206bc3158b8034ff1d147bd080f7bb7c5215e1bf86aa9ef40ebca6dc46c27dcf35d31a2dfed9e13d1ce94590fa7dea84d510c01c78a5e7e03ea7262b79991f097b16d45de0bc047f6bf565f0d5bd5466c0150d689bd21e2d4b011cf4ce4d925ee8b33a8c9d29b4da52c74554706903e0f8fc281d6b396f1f8c7a4b0b1c7cfe80e15baf1acb1670945e9f36ab648e2ae2c6d954997c2cc80ddee4ee6cb41a4e12ede533a4097a029fa4a4ec773ec05976c55a48b8f09349043b5b4a28a671479ba5b3069e22dc94788a66345e7fb8cad240ac505a4a328a82ff007dccce8d4ab68283ef9412e3b125435a8180fa0a4a56afb162ed4be7443bd5c403962e29574c00cb41c01e849dbb75a9b68cf96f89d63dd92d6eed27aaeca953f48c9963ea2c04db3bbe3d7f183d25a25d32a480d55f84827834a980560455393d3e25adda443cc509046da84f6a044407c91208f7a3f80a52b9c0cca6f2890cdd31822bc35c105bcbce2f53bf4d765625b1393ed2d44b9268cd2bc06ea4e09b5bcd5bac084fed0034fb21abf6115ab06e62168ddbf0feb95e4f7a4ce9cde2074d78a9d21c6d57f7b5cafbd44dfc3f328e2e5b5ee76589391d0fd824bbd2c3b7d43c9e8a2ad048888d77a5745e48aa7f2d7e3a12101ba7a136ec898891e432fcdabccf66ea0f52ae4d4dcc70754345454b8a8052b684ffff4a5f26add98134ee9460064916abf75c718583de2c9ceb02e2b4e15afca12711fe70cba5fb1bc39e9e95e39764a8cbcc907b0dc5c5486c44c9ca42be1102f402ba5b95234f000fe40158a79905ffbc14f40d2525f74f40a85166555322f1f70d2f4c06fb2b339a1b2af326ab74f181a4ebcce5d6e6b32fb9051a7e9cc2341be933e18cdf05087ece950e94975163b55431635214680eb1e45e63900ed1901c956df73349cc845b2a216ab50ef40049e2a0fc6b9bb803e146d5aedb7e4fdc789983c9ed8817ce44849c0ca78be6c68b159b3b8a97609dc37edcd8158226241d48b004d8f039933a65a25fa0236cb4cd74d06c94966ecad561f4a198f8487c8518669a09c76cc6ab824819b89d942325ca44e8dd2f9795174188ccc62a4d2ea26b5656cf15d7b2eae7a0bca35a67ae7e83d26ef945f036f900b1030d8f107ec1700caa943234993983d18a22a49650d76d20897aecbc70e29c154e2578275b2af301cd9257af42bda9126b6a1b51d3cc92457abbf8a38e9985799d8b2d951ba41710f283d174e059d883163a0ba2b624bc6ed34d99ce504e31b2c173a342ffb6f102b49e09585ad229b0cb2bed38bff2f439d37a65995dbae0abbc1048961f62ee362f04b4d213c22eb7ac8b7342784be7ad77a30a41233bf7b46ecb290f83833f9bc307696ea4777580c982a941c4f715fc34589d90f834a4adbccef9fe469290344b86a7dbbea28281f0561a5fbca2408e420ea552337eac8227057a935e8a52d892e0334c9ce596c635652108f790a16cbd412e96f3a9631fa5b76cdcd1d096178a1bca5a55a454cef8f0f51949590312af52fd24695dab7da521e9811855046b01d728180095e577b1c659665fd3208243b8f42903c07959e8901640a990bb89bc9cf2b1b4b0a014182183ea944e1013da0aa376dedf002b4136c0533c1ba5ef98054da57ff75b7a8ba7f0905690241fbebabec72460bbe53b34434e4158a7a4c3bf7172ab95a54de9030704f411f2e3560e193d60d7a90b8a68fe143a8300f0acaa5600cb64c89291f98d8fee99156c19c26cb4a4c86c005c5b4c74286f9e05416ed8adc9b0443dabcd45031a54a44c719b5c5a3f1d93b47208fd96a81c9eeec29d02c5bfb7d31cc52c95b380ce2b6ba652f96cdbd52d64d609064a090f33b5bf85ac07c2019eaee010202013b6c352bb2ada2e5dbe4661697ff80a0678af24fda14cada154ad109d768a34502f1ba57b035dd4df1e3662e40725b987da53ee41685d6fde29cc4b342adc9b43efd6690cfa5860dedef1a4361a948e62504cde6d35ba2d5a49d758aa21ec1439e477e9424faf023dda2409af5aec88c2b99ef188836c7cc52ba3de648ab5b38515a91687abe5cbc924935d37f1407150cd2345a7b90f4f2e6af4e259950ee6a07676a7f2301b1c4df9ebf65ec7e7ad5133889599596d0595e355e213ea6e7bf67101aceae57912a7985c82d11e8475c5e4aac4c3f01d09cb25441a6adb32a478309590a6e8a47d3a1c16a3c61608f78e70e7b7dc2dc45af4983f1c94cccf2669dd08f98f5563319a15505053770e6f11298d706013bcf3c60e3c727feaf918fe988819a1a215ecaf25eecb1cfe29232477c21f97a611945678d33728766099f9a14ab62dd78cc888b346b0709f917598638607ca9305263612d850c308be4401402ec908f0454546af35427ec40a97580069739498b124c803d968a10f1b8a7afa46ab84ddeb2511df72a696ca1b55be0bd0ecd58ec06909711c7b5a46a28d5547ee7cf1daaffc286401a45201e09ad4cec8b8c0513b6d0f097de3e6358420431f80bba358630827fa5459c551b535731f80e59c2cde40c25e39b763f82009b4f293383d5ea81074fda72bbc32106e688a10450914041825764d7fe7f58f2e0081c24e56152e6e8e475250be06c6d984c32752011dbcc593b5fdffbfeeaf99c5022f40395dbe3bec2e11dc014c3c3a2311c13d063a2f0fbad1447b00f87c80490824da5260aa5c85ca450b745158e263cab2ce3196d4056012db99b102a3100c6a3f99e76a64bac0e628ae133b3aa59006bd2d43959391a90cdacc87ac62a02ee4288121dc11159330b63de8a333fc1d77968bb7faa4b0166a25258b4e4310767b7a0ae651928a396b91d6d7048fc6fc437a0ef7237ccd4d4e66b00dd59f29ab01b4c9373985b515a7d989d8d5c8afad9b9b72a3054e9f8e195ca45e01c234ecb5d4994779a860d15374497bdee5f84618095df991e2744ae8a492ae497b846f48d88e4b58ac7ab46dd8912832d97873e79925ef0151a2d5a415c4b0de7a664f6a342d0ee6b501e22044b6513ca105ee3ca45117bee4e33cb01d461e78ed9c4204f99127636cd27ad2995adfe6206925d63354a8ce1679490e0f7895f46a9384f28f8c4a9cea12b48b675492948cd1c96aa7a9bfd9cb71adf730b7d83b4d41c28781d44e55213cfca21db544ed4b01a96fa24c8bc80f16b34abd5dd1b6899832e75082d3261a560aef9aee4651f5a150498e30e4fa30acb318fe21e917892ff3621c4646ad88b2cfa491a410c4a19df7c6091657125e3f49297b7a29809c2f7812f1e64a04c27dc801b6248c043de9bd5094749de19cd6007d97af0837aa29414e5148890be1f44c0550d3c8259770c19462f8b426bc3daa66ec46d72955555e0daf4245bc289eb0c5213e4353d5014c141575761f954003e3d0381c8e60a9a3fbe47607feab92f4dc8c66a6edad89ef52645c7d3f5570a112f49ec6a26e92761f6242c5ff7634567ca4fc4754e64e5dc591501639fd3c03633e8a2c63ede1316ff31e4988257ef77ffbcdf7a1690f58f47c9c42d73bbde0e289a73074cea6149252022552b3fdb1f9229034ea5747a56744e6707b8d03ec9245596b9a45173a2e48c1e24a0e1c0a6c41201584a458099c7f64a85d894fd7c98d51e352810e725f2a163144a8d3750888740a5e9439186063ba8a88209cd34aa2f4e11e91e0eb79f4ddba3e334eb5128b6cc825536940f9114ab0de49509212767c01867d7b918bd325894adfa7fab8669db630a03f7f3ea91182dc083cee7c83b1e644a082ebb1ad0b8ce949f2a433e7986f08c20120b1651fdc53667b0d20fb9a07bd532eae5700d443a401ba89f34502ed9f5477b62a52c0c666ae6daa0a4c659fdca3d28aa184d1994b09d9ed5661c919d488dd708f5cb11803e6132da66803d121633adb0b90039cf3170e0b37e65862bfca93611503c61074734b1535dabe239326746a2902cd32a92a0ad1aa9dab303e5c74bb4b2713989cee1cdaca26c402c1c868eaa0249d7ad4af0d6795e3d3680d09b79dfae20410ca217cda3c1760ff686ac454c08548961c5996541617154f0b87333c72a254de1e097bb386516a314600e041c444a7699478e5b34b5385e3f226ae00461af8b234efbf4b22d1e89710095321397a22a98179e92936eb336ba64d1bd35f7f30d84d07f344595035b30978e9b6c9311cd1f7723ed5346591f1188be49540c62932a08be7228441999a9d7a9075efd56ce0034a8c000928ca8416f91dec4a7433f24562e75db5632be999334f2a6726b557845a773768d8c9b8495dcdd4e474c6913676198968f139478a3f7e4da5a1821e8d25c52de7dfb4358ab744c8e44ed8a2e70a3a749341c53b230937dfde8cade31f4db385b80239c1e65f29b74681c5d8f5e876f113aac87ddaeaf0da31c1ef83695c3253864d4d8329a37741aba91c3e8a664a83f0b7eaf34b87b879b1757469a62410d51059f44711276347a1c5a3c7c7678d2f3a75368ba8c0174a1f834c1dce04c7c4fb5455f438e008cc656046e1ce7ff5c44b86bb6ac6fb3438021ecfa34b8e70ae7718788987121100e52f5b6300cba7ae0f7e0aa7d9326479bd643658ffd181b0c1f01042f5029cdc15d051113fd001a253c10c78b3f10357907dc7407ce136c8ce71052a0370a826f2a24443da59a7a38c2807410f999029f05be30586edd3b7c76dcdb8cf23e5c88df94e1ef26c93f972c6cc04283f90b5cc8f3afe258b0f4f9c19d1791ae707eaf9df318fdbf526fa68cdb9756d9f0ff85c2b923ef549a5ec073d4ad22f2904404ec439f7fb5898e27ac347a2b0b1a1500eb7f6f5635118d18852ac24ebeb50868c9efa0ae0cc5d007a401778f2e11cc6877d98036bf02fec3dfaeb801338993300e53cdb670634730fc83c9e28b1e80f620745123475ea5a4252ff5d807aa8542fb0c6f03bdb04e8525d45e9e91a3ec93c55016a322d8a7f02e8aad2b2be3d708ddd5d779dd63b89385111d5d8367e74d0f44be72d9280c1cc985debc2eced4503d3f7878fcc9b1bd1904df9d9f7eea4bd11db68b4f84df69ec13e23c66896b206517b34ebb6a6faeb6aba287327fb50c167388ca8f4cbb17044f47e952efcd10cb1e9d56c017fc51dc959d88c5bd7fdaf374f10fc9dfa2b812aa11ff6a9280e32e91b4a558c522727a8faee1a7ed56d7f00d2debcbbd3d9f15524c4491ce740c818957da3f17700e6f4d2deb0a37628284503368c8ad4b4a753eae0a4d637eb130700519400d800ea3c0c686825aef012d8b8fd9c8ed0b896918621602d239a05e24b81cbf602b9d0fd0b50000d3c38c7af7b035c6b9d8b56f782f5957386eb766d713d478c5f23e3e2507444eb57a78817369d02eed898104002d7ab2bf811f05f0bf1ada8770030925b691310db3640f63a41718a91e4b5d5a811222daf022e668e0cf15b5f4c1f40f4a14d36c3c7a7cc897444652ea15844500d1bda8c6fdb8c9946f094d1a96906f6970711a21cd58598c5d391bbfa0da0d26207503a85844ef6c57bf8683cc2400b9cb0df71e41fcd2ee2263fe17adaa5ef808f106af4cbb2a01c25b09da9e166c64c1749a1a04edecb6ee4285d50607d1a546040e8f2671d9a63500dc6a8577bdae4e8dbb37371dd292589c2163477b47401eacbb169348e6f2f1d141bc0ca8d7d2aa6246e56a4949c6e45f2ea7a064eb745193fd209a9c2fa0f38a01437e719a862ad0dcf6e347ad359e0685f6c6f138a069fd5dcc685f5d50031d0f9607636e61910b61e9e17ddc846dcc89508ad55a9045e1b13b70a17097c4022216d2102e80c3c17b6772cdd19298762b73ebbade239b2146a8db532eaf6d378ff39acc89550a640a46bf1fc8d04f7105280a6858c3e9100aa50b2f32b205fda164ed2faa9613b8b34b6ac1f1fb26e684c67f17ab955bc686244bd6d2e4124e669db06470e9c2f1a9804ce35a3eb54d1b3137bad0f8cb6d1140f8c235c56955be911004ca25d810472a90df4b6d1d0cc026440b77f83d2da8f0a17e009b6286dfb5d3f32e22bbce92081572c018b5839740794c965b8586434577dd6b4ddb3b36c6a77ef30745dbad89608b3ffd70f06d442ec0da09164087dba36f038c2820d3e6088079a6821e09bbea05c14801a2e787160dd9db28b0e2414990c6affd7ad95ee64fda22f1e1c8d6134e2054b4a7956ac8d46f5bf2813e45ecba3690cc10991684333e92900dd4fc9aa2980a385e63174ff12f998cdb4b39dd3cd4a9aa56d61e93c5113eb3473ec4d9a4c3b55d865d770c1dc69a5b6a8810e91c955d32f3208a86098500cbeb1628c9a93aa33a9b4eb22af1f7e33e77822d73b0fc3059bf9ba5f0f0726fdc4f4b639dd30a748eb8ea9e93e55cc35969d6d4b6c70345c5d16588c8233799272522d2725a20f106f60950a3eac8fc60dacbbf0e0e270a38f44f1820697be78ff8630b20a7386fb94a5ea3c5d11a0cdb9b79a743bf6f7f7de689ce18a6eabc4cfdbc4062011cb263a198ad9f06dc8364a2997469db87f15c8814167893b3c7b649e7c27ec59825a18a57a6c71852b23968563e12e22de09ac620a5db2036cb0f2706a4b579c523cf402a5b41fba1bb72953e281c457604453293ea7001e1b9147763d2a8ec587c2563f7ffb65c8f217c7395b56d648a779bbd6170c0e9b99337bbecd9ac8a82ec1b880eb4b33a5ee01484550b3a2456a02715a5b77c2c3207c6c158a69c578a549a82c495e5aabd192f10566b7a9c85941d39c1c580a6883081eb744b320304d88213f5fe64b0012f0e665dd7d62d9be9c345334a2fa71305ce4e2964071a768b7506f17b670a94ece1ecdf2e17691168d6c3ac277e2347525738196b25356f602a42400e3682b33f497062515a4bf4fed6db51d3933d5f4643451866922918cb67fef684d5022948a3515f854ae1d8e0530e84e7f274041d60005b25faa0f7b9e6137c68ac301c8dd56771048f7a4ab331d60a333053a139c4e21eb48a94dbd80872461441c324a515d0e0fa6c52e5d70e7d7e1ff1bbf41ab3d5b778e0e8c355e323b6fcec0eef53063b366676e23a35971d3510999cd83d27721f01e6ad1bb7b26d37ab5f8826089200e8fbb587294f18deb220b75a1b437dc747e26912ec11934b95e1551ff8b22e060eac8c09ae15d0b4b6be9afc75dda0deaae5e190305338f758410ce49ad9b9b75787b61a42e5dc2cb6a147a351df04e35d38c992bf985dc1cb8e87808ad4e54012de7ba0d2a593f142807ca71dbd6c5706194d3be79c0c6c11e99a2190391dd1970c88e76ed7dba93a5913e8bee33e0b6b32af9ba6f62399a6649ab915e1d6381083dea087d142d8171496ca623808337a0e0ebde307554e19b96ec224d0e9fdbc74834bd0a4a5f8dd8d93582a7634660a9a11252200046da4066c5bd4298b9669ee185d029c790179a43fc08b2ee170beecb6d3f57b19ef4e9e14720867500f83ece013679e5bc5ed613b8cbbbc4d5c9664aa790984b227b2d8df330200f0cc0a16c167a0225d6e1c1bbf3623e19077a6fb8fd20941a0b9309196968477e8c9a12e6cdf7c8ab8498509b2e7baab63fa76c25c4a5cd06b5069e952157203c83654f51f5a2b2ad1a434ed5ba2842e875d78d06dc8f595d91cb28b81a0bdff4da939462c9e045f8e914be8d359d3eed869d42da1694bc64ca56acf6000486c8e844982ca2f8ef43139f6e93d76016772d40177d16d7c457651ae4ae45dd2cd16a30f8b8f2dbf30e942c9011d8a2ae5d2a2dcf237e24e84445b37dd8435f4eeca89af80e7f6c0386824180445586f6ec821d866ac93da463624e075f1772cec40b134eb44786f78a96fff28e09468c81594d4c71260676f3110589e879aa0731a888f3b14428a4d5422d63f4076c15a77c2862b420ab1fae43b6e5f0c2f831379bf3af7fe9748aac1842d262487139e3550d54e1801c63445ce6602a56b4998b828a0c49a5485a24d2fe624e86b88d66051cc1a01b960f1cbdbe3cfdb50290400132a07819de3ae92c500584fa09beff22efd3cc9f6d7db49e5516f0d70b15b4168441806c818284fa3b031d5c5251a70e21e28e4a6ab554bed883d617c2418cab0310a7e6aabe1ff60e9ef71c54cf7c51e99d4ebdd9b48744321d5d1bbaa2ed6e2f6de673a1d97bec65d8abc57b7a749727fb5fa28cdf46bc475dd2fcb79e907491f6b935b90eeae631bb3f9576722ca14b48b7be2ee3aeb1d7bed76e5e5ddd6fba1f5dde7441754de9fa55bacb8751de8913bab1ba82bb94d37b5e0c1d5cc7baf6d3ede5bc2a0b435a4e2bf2eeb0372daf015d36b5bbfc43963ac8d635dcade75d23bacbdf7895d9ab6e48dd1ababf5c776b650691c7e9c2d415ac4b52d74e177a5d64dd8abaca5d8d783dea8ab3dd42e87011d2eeddf4d6f476e9f5f0f2d405ed9aeaf5ddbde744cfe0f9583720d17dada1678d5974ebe93ed4fdd7fdd55d10bbaff990675408ede6f4727a7d7a817a35ebadfbeaafe2a66b9be1facc689bf8c930abca77684f8956c0b8e719c67893cbcf07acd96a53f5706355fe36225188880a23fa090a0983b42efd80622050158e645920a3a3e79efacc0535e24664cb277d86a2b1fef7660e7f141ad76eb950045eb3a80522ad1dc22b8ab5b73c6c58ac4cbf9b9b927bb5045957a867ff01ed2017181711feca5a8f8696be0879c9662ba0fd6f2b3215cbedb600ebce62638facd876494f9e84ed5107e8e6d857f580f4dda4797c5757f5cc8de220280f2e4dda454c90ad1cb649e5d9b0d7d09af97b2e89b99a867dbb64a904208b51fca950279fd0046d09cd38f5ee40d794bdca940b38025a5181532d6c071840baabd90215e000569667e851533f098d91226053424ecc8565812c46ba5997b570300abb2970f659d5a6d528fa2578736588e78d00ed9a2555573bf7ac19bae4736776cebb85ef1df6f67cccd87173c51671ffeb0b2a98163707103cb76c5f70a4a6f42e04897f5d591c2bfc5ede80097d1e43b30ee56f59ff5a4fcab15fdd6cd74f8927b0eea5398ef55fe7d3f44d6bd641fff3c20beecee4ec0903f129e187add46db60bbd1da525e3033eec967aabcf936b6c2e49fa8003dd1574f501219874cedb2632f573b05c430c4b21e2471ff5086a4e74c6934d3f9b8368e66a687fb288eca34891b8448e8e2cc1b5c8e438694800864e62d8bb3d1cdd1b9f2ee83b8a2798a4a75dae39b5d0fdb0f59b374aa7e72ff32137519b284623602b02a7755a09f82ee10b290d1be4ad3d814fa6db0ccc198eda902a1181439a20f48686f5f016d9334c4c375937569b7ffd5523c106436c2fd8c75bb943e57a0c54429001ab84a78230814c789c1732e94046e8c4c017a30399598114fa5581e2126808ea8e405601b80c6418e6bff97423c83457052f37c1effc7dacfedd74108147102fd5fa380bf3ed070668e82ba913204d78e6272d5ffab557d7347489406e20b7e00a411a0532ed422048bfc0af00a0b1a80be0815509bd41ba5ee0270aa55ec546810cbf0722e39a7fd5ffc005aea5af11c90288bc48f03209ebf526023c0f64b247505134a600e5d7a8e7194f18a3d485c363d1b58e491b807a3bfc3748fc143b25120b08c5999247fcef837a74fc149423b1c2485860e00632697ac8ab9eb3c1aa39f64b0b029001c102d902b6026481a4106432498381eb0f049169b06924441db2e7ec6b6ac12881c31a647cae7bb34108826c1f85c3707edc54d8f600ad48d08d505c0632f9a6f40035952023490215d22cd0eb60a01e373c18580c2ebb02610f4d0913f8410135124ab856bbd78c8f1a972a8155098d446776e00d44a7a92750511cb095f42fd205d9ab573352e50bd60dac46cdfbf659e1d2c7807d94fb0ef2360932c11d28838bc08f1235000187ab2ba806eaadba654f65ef868daa2029c195d1347b68a1c87aeaad0b028ab53b972f4074904207f003fc003fc00f20db0889adb5de499429c9f2a95e21e722534a29a59412c3d7751fce38df70a4d134079709030935092849abb65d984491a3fee424a6e2a73fd8564f1746d50dbd3b9fb4051d2acb8569cee2bca8a43f8ee75de8c00597d4c6926c49cadda2f0b4af6ab999afc3166693740853f7512dcc277ff20875afca26b409c0600436669420081f1011392cf01a20e03043072dba55adbba8662db216c654740a22f24255981db3308aee1953e2d9202965094420821a23344af0e8a4ea90c58c1a353c7410e2e181808e5898836753caf4336ad4400974c0c268723ed9548b5f613a59a7962b2a115718bba40e2f4abea9e9a81506b93f71fb16962459b3c268b296ebe8f419f1d32acc419930419892df249d9781d44e154e03e407346e38a02315954e6a54ad96f11e21353c6c9c19666a830e54e8f2d9a6b16919e3a5599f3f5e44ce969119a9e314a652f9920a6d4ba2b63264809c8083c314a610a679b2c80f35cbf9606b187494c220bedddc454cd0771529cc7ae55f41f4543d3474002272a330a6dc29b92d1fd5ea1685d94de9c99f243b140695a49473d4149d3a897fb0257a07288c2e6245895ad3232ffa602b9f30594a1f269dd88e12c4f484a99389df9315d64f8c3ed8d63a612eeba4dd7992d6a5241f6c8513a6b53bef52ea3927c71f6c3a3661ca3b2a558a73fdea8cd584c92efe255325ac8e124a5948d09109f3ff870902e19d0688475a0a3a30619244d733bdbea47b4c973069359ddb36276809e21f7458c224b99f08ed163b23229530a7493a8a50514c5aac3ed8da2861ba50a92f9ea75caaf5c1662be89884d154c7bc18714ad8820e49984e662f947685f3794522615272ca387d79623d27618384593fdd95595ee41e61d0caf124b784913dd20fb6e208636f9a6625a1a4dc973fd8ce4464d89801f27b35403c6c887434c29cbda2ab6ea92ff7920e4698edaea477d30f223b7e4de85884a9c4f1f867e1977c4c14613ad1392de82ceae78e44986cc484e9a65a07718208533a5954f81cb7435cf77176b9adab62a525cf8ea13f091ac27c27ae5fe5523a9e2d84693e9c924d90760721cc5616b4bd9f18b24feb1884c184ba98af5d259bccd621089312ba3a84b0a04018554b892245ff75923f40184b527be6268a8fdd3312aa20082724e4e81f0ab36929c7cd9c5bae5c8c396b3bfc6012dd52a85a1377f4c1e4256a46f498d09d8422aa821a78c4a0830f26f13e42cdc9792fe5eb83bb6f64c8888d8e3d98b34bc9b65e930439793d98af32cb3a85f3141ec22c74e421f5c935b4db1380c1086ac08083e30735424254d0810783ca89a73b18b6949ae06f723c39be7630db6a9f60a5e44fcb50471dd00c2b4bd72a97b36c2ce4f88f2a41caec4e07f3dde75d0e6929f44c47c4d1eb113ae6605e7d0df5bfe35e6b92834909ea5f64b8dd5f34fde360f44ee2cd3e880d07e3096af4fb83e90dc650928e39a69d6e2fd5e106d37d3c21f465bb0de64bef954ac5b4adc36c30fe8d09195f4b0d5f91d0b10663854b265a54e6684b01e149c0c10184ffe85083f9d6f32fc813e75d4f3ad2601a17bdcc4b9ec3554783712c8993cb44cb9a1b9dc1d42d26754bbcd196630683ca9757fff94cee313bca604a2f222da7920e3298540e65c9dc741a135f0d19cce81883297fe7fc8d0e3118467aa83269fd92d8274e4247180c3aad5ce5e9f99ca7c4c376091dde9c86cee9c4afbf600af1966eeef582f9c58210e7e9a4527717ae7ab313b7994dad98756fd17392439570c1a44dc53cb1e537efa28e2d984d7afb8fa6e374bdd81d5a30ed7d527ae6dd3fef25c4fd7cc8143ab280a990915dead21d583049a635cf4787c99620918e2b98326d2d3ea592d74e4ac60b38389a091d5630763895b3b37c324c4a47158c1754c5d7621d543029c9566684c7765653c714f28ef3ba9495d7935f171f1374523ba460cab1f4e7a81b2a5ce88882c953b0f6b8b5143aa060b279cf13f3781e9c196a19e8788271942499605234f931718269b404dd1e4c124ac95213cc3177fceeb3f466e799604e41899730af6309e6a09e942cda2525983a9cb8f87e9a76720a868e249884db074f7e695b4307124c723577e4ee925462551b388e619254924cad9cfc388c61b439658276ecb929f972068e6298b4f4092bb292fbe89318a6f333311fbd3bfe05710cc334b7a2ba392ac9deaa55814318a693175efc4d46048e60184c67c9057d9ae3b10103d31d3c484be62f4ce2e2d45ce9926f2ff4456ec9526d56854b8b7535f2b282f7961ca6ed854910f9568fa6b2534962c3c6c13b0e5e98cf3e872d41d8c6077b17297da5dd84fd521766f99225d989df0825cec59ae95ad1dbce62c75b5792df4f52427333345c98bce5c63ea5a758da988170057de6020e8e5b984ee85293db45877f12c400872d4c7262e1653f6ab8273fd86c80848c88c858ae85b18332d554911686cff6ea9372b8291316c72c4c26e7e027a87d979c9418b42cccd9a4a44b905ac99249e2e00003472c4c9296539694c8115a270fffdc12b4b980031606a54774897657c2c0f10a634813b30f0e5798cbedb35af34c5a61bbdaca96b6654b75cf3ccdeece25439f943870b0c23c6641fbd4662e5c3ee158857176f4a792649978b104324315264d0f4ad250f231482e70a4c2b4ed39c4ce84bac0810aa307cf3ed87c00e21882d2672f23b951c34b1a9ec224dc67c9ab25c94a6599c2ec1dbef2f7e875f1bc14c6b724e50b7d5143059b145bae2eabb4bb751d9e3da51c1e85d1475b4e59beb38e2a0a8385eb9653ff3842612e25fe277f89bb711d14a6ca72594cbcb44bd18280e313be8f4eda4c505d042e9880274c27b7569cf8160c383a61545d51d144ab50ed45e0820924270cfa4d7bd28fe979d2de84f16af446b343cb9e18248980b489c80019b9a109639d0927c73b7b763765c22cfb6796e34149e0c084a95285ef94175fc2f4a6cade74ee78be74b1c16109c3e79874262c8921c408a4122629dbaf99f820b231250c26464428256f1abf4dc2b4b26179b115d44d2a09d348936276e364ad9f6bc9038e48987a2c6c54ec29c9b40477c00109c359b0923fc1843c1765d4a891c8e07884415e520aa9e15102b6906f157038c224267928f996653fe97cb089fc071a39333c6680848c74c88848238c96529ef49dd6f296bc0c3818611e7195f7d361fa10bc8d20c0c0071c8b30474fea55d7ab83072545184b94a45b4f8e2311a68c7867a87aa8572f5372124ed7111019365ec08108639e24fa872d9d43986a4457f024491bc29c946423f3528927d7c85108e37bed5a901bba73bf1c84307a0c7593d5ef20cce339f24e0ce5f971148449a92027ad053d9167b22aa881c7e1088479d4847eccabd97ad00d191f62839b0310a6d8d9d3e7fc273d6a7d8c1c16e4c7c8b1914118b9e4f80356b1ec6a634cbd5bb37cac73107e69a2fe317258c0c1f13132c2c1a17e305f366972beae9bc5f203ac0a93f6492ac928413ebfa930bd68115969c162afa830d8a7480b699652509ec2a0e24f990a52f468690a83dcc53b154f5c44a530e5ae20eaba39290c361f74bcaaae52988cc21cd6a669aa4b4461f435dd925e234a6a4928cc967368adb1d4410a0a63c5d2f1e3efafcaf409835dda2755923c6192c4c4ce897fe9a64e182f48d1b024cf0983c79ccfeb1f59d9df84b9a468116abce25aaf09d3499fb9519e4c18f6b26e9c7c4225318409839e494ae91111a7722e61b293827a7ac5e7e558c2e4392a8ad2719ea25c09838a0aafcb2f254c6fb735df97c4f1741226f5f9fbbe939230a53f490811ad2261bedd5d4be13a90308993d352546d8ab6ce23cc335b7ada29b47a92234caf7b4932370b96fd469894f849a8934c18614e25c9b13bd48a5ece224c175774db3d5bd88b220c625e45ceec449872927e6f225dc562441877f4ca2cff9e68da4318845736c9f7358441e4986c117ee9e52c84494a55c1e5469f1426218c6d3909ba94386f826c10a67c26eaa912cca365451026d94356c6c711e656098439fb870061b6bffe2cffa46256fe80074f1955dd0fe6fa792b15b7b5d3ee83c92e8e0e9bd712223e984e3a0be1fe274c76f760d029087562c57ac57a305f8b1e1d6b1ecc2e7ad4f9a5783099ec15bff6bb8339c7495a449576305556f2ce72296bb93a183fc95972796c74481042c8f3cf5acfc1f84969a8d5fa3442d57230c9a8feea8dd697521ccc696d9f544576551c0e462f9d4bd408bdc130ef234225533d4ae406937dbc29b96b0f0fb5c17019fa3f8657149d840d2651c7732baf3598048f3e7b6aab4e76d4605092da2739c53b7785d3609273eace1f677f5e643498a4554ad94f9413d9f1198c9fcc44d39db1190ca7f38c302fd9affc32984ed465a98eb7e1276430783c75d24236bb4dc6603a7949145d256230e5d35af154faf76c87c1204b67f3e3c67ad082c15c2697d2299a4c4ba25f30765730c94b5e30ca999e57f4e4ffc92e18ed635fb7ecc5ff920b66bf4ae2762ab7600e7d1d4a27cfa99d168ca2738e995fa7f27559308a2ad9e7795b2c9884efe027bbed15cc2ba78458e8c5d69315cc41df8ba59baa6052ded9d3b253d03351c19caaa37988eea8ea4fc1d427e90bbd242779232918ece4caae2ec9841645c1dc37faf7f6de2a28818271ee5a4d499a6ae9f20483bafaebce75ae753bc19c3c44aa5eba09a6607f1f3d9f5bd033138c6a32c593bb4b30d78f4a09a61b694a2979b424985c2d0927f2c63d8a86048392d23e8eeef079bd631877cf4ae82842c6620ca3afa969db8a613e41cd7897f061b4a6c43088948f32ae0dc36c5eda73ca63e8662a0c734e1f2b6997eb9e4a83612a532a0973a6835e1230cc298791a7f3bf308d6c8c7a2f6194ecfb829d7dcffff47b613ae195f37249d0d6f3c218ab5aa12e8db9eabb30fdffeb29f9dd924e7461d86ded24654f2ecc23f37bdbcbc4380f2e4c2a9e3b4e7dd2fa975b18fc527c7f4ecac2a5d8c264e94185c9762d4c6a61f2c930a13e575a18d552f6f924ad5baeb33096bc54a7722a0b9370e287fd598a99672c8cff7ad2c68dde37818559c5da4d5d2e5f613893f2f44f922b18b968af1ea65698479aa5ed9c7e84fbac3097a68a7dc719b39c5518ce7e2df4e4ad68a20a93a47167b25352618e514f4a33541843c9d36bda97baa44f915222fc047db229cc39a6e9f025a514e6901e3474b2f029aea4305f92426d864661364918dd1f11da9e8ac2dca33b4ee8bc1439148651da4de78a7cba101486731925cf7d8a957cc22016432825c7d013a68bdbc104a5c24e184fce29e72f53c1c7424e98e3bd5cbabf8739a54d98d5e4fd88993ea9e49a30c82bdd75c29e09839fbd27956f553909268c71a5f774782e618a919febbea48f53b184397e99c99dfaab84f9bfe4fcaf4b09f39e64e296ba9c525027618e3f5acdd3f98f1825615215524f4c353bc945c298f2a9c4c95d694d3b481854904f9d5a2b9cccee1126d5f93d7ad6aaef758e30e82c3541da9b6c5e5d234cf9f49274ae7e57d531c2e426a7ff1599351b5a84b9b2945cea278a307c8ad7e9de245549893056aa4ef52375748a0883c9a57b74c58a501ec2a0a4943f076d6782aa18c29c93bd5ab6ba10a6de17b724ec57384b7ff1c38330d7985c2e72bfab654198f2a4104a4e6a5a9403613e91f1e649de2f95058429f8772595a42f53d23f982d4992a0e412f4c48ffac1bcf9bb21d45c929df6c124d42939db9412cc523e184f8af638a54a1247b907a3a9f423dea2be45d3f460ce4fb597d3cc83d96d47b6bec9fb56e2c16079754dafab787f7607934ecfad346d3da9991d0c3bea92f4252c8a685607835a4bb24952d492974407c3bb9fa0533acdc1242e49a1bfe29efe921ccc9adb41e9949224d57130557b9f54c2c16469fed2c28434417f83e164f9fc2eba1bcc7e552a4ec5d0d1416d30578d8e2174101b8c57733d622d073fd11a8c9f4b2853f293ba6851832997905d49fec84a953498b37db455caa2c19c4cea6798588207f70c86ef4a65a7543318e4fa49eb6b49977019cce9aa372cc5899592c1fcd94c6754f2b4dc8dc1a0c45f0c79366bb75589c1247f0c154d8979f5255961307dca5652f894625fcad7402f984281c1b836d23a97dcbf605dc6bbbd785ac8c5eaf86c51f289ac4982ffc1565e30499d8332fb924baeb5aa0be6926925593e8f6122545c48aaa7aff821ac2d187dc6e74eb9a985bdb2775da6c6abd7ebc5d3f569a9da56160c2346794ef9ce55410d3c6a5058306a48efe05a5fc154826acddeee18ff90154c67294ec6e560150cead57639c2945052904851c114dac376baf2d3693b3505c35eae79de393fd8a4600e1b65926c4af688b61f6c782021231905c3b5883a412e37c6836c302828982bcd9224c90a5a6e4e912718f54a3a4ff2f555e96bd47082b93dc6a68d58dca86e06d504c3253968cb6ef557ca144131c19cf27a4b92a4be874e9ba09690a4c52a2c2518c3ed7c734dbe888e6f25c1dce7a6e494d57bb70b09c66cebb174c24d10fa3e3b86495909fd1e5c94bc26c518265982bef0dd9e2d86717b33440cd3a9ecbadb6d7ec8304cc2e30459329e1fc46cc230ca49f15db9aea4124f1f6c3ed0609843094af283add3c88d326098e4fb13c424fffc5c930fb682444066e42f8ca162414bd6764b612e41872f4c62e1b405ab245b762fcc76268a67bf796198bdb45f8613afe3a81ecf56124901e2217d1684ec5bd73ed8fcef5806780793a4bc4a76bcdbb8bc201a37928709d00ee6b0aff77bb2223550d7c1b0196332342f1b403a982dcc7f4e594bbe2e3938076349fa4e89e19e1fb3837230d7971c95837e1de360f0a482d041ac2465c3c124a527a9f49c341584928d1a6f307792f44dc5995cd51c037483418f29a57298c90949aa65886d305b3ca9233f55de6ba0e7410d1fd0280107870818816c30aa992c39467e7efa6b0d66d39ef4a8c5a806b34793b55cb2c8fe5b300d064fdafddf4af2d1602a9db486e797eeec9c3318deabeae7e33efea56630088f23f65bff83924f1a60194cdadc73d6de3edd514206939ce3def3d7640ca69cf3c8d28ffd95223198fc3b89bde25fa353270c0659420a06a3b598b0a1bfc42f98dd84aa28fb9f7126e805c3c45ec3c552b06daf14b4546fb6dc74494bd205f3dcbbe9d91dd11d6711b151c3a3900b66ad68d5237fadde1d8d238305885b3076f05379f1839ed3e1c7a1164c999697fb3e6300b39055d66856cc5bbaac7026a79cdf4b59c482c9d34e094ab89c2b18be6409bae72dade2bf080216a040042e98809a26d00a7cb977785d6d886c85d1258daead94c42a2c77a544f9091da9603cf9ea94ec789eaf94e0140c4add892daae45c4b270d11d0484f402998c410b95ee27a2b58ea83cd460d8f432460140c3aacadb3cefbc14603a1602aebf58a71293f07133ec1d8714d977f3d22726494ed009d60fc142cdef67e12bd0f0ac22698ca2413cd32edb4ad432f036482410997bd8ff9f62f7a1f888c849c11912598367dafa42474b76cab1aa804a3f89f244c8c8b93ea43a3c68c1935108660124cea5795df7f1dd038211e6a238804e3a86579f224aaaeab814064bc40051c1cf908448688d9cb4812101a770c63a95c6277d06fd501a146e2c103746424e5658c243744560535f0a8c0196359ed12844a7e128262182fdd9e891a9d2742ec32561084238651de2c98ba4f0dc33c6362c9134bc7eca84e1826614de5557ad4b5985f304c96f2626aa2c5c1c1c131850386490e7d27c99b17edabe417c6fc53dbf9a2993b8dbb3ab116eff255d3f13b7e9e9ccdbb5e1876adde4b12345e183cfdbbdededc85712d49e275094a5d1894d29f4d10a57d827a2f1706d5d034b58f7f4a3e8b0b732c3ff1e27b720b83e7ac7897bee6399dd8c2942eeff5d80515cb502d38d178f9acbaa07a5bb93c7a4f0be3e7f50adb4fa5fe4274b859983edb28397d9770b230f889a6ae73f0b8658a85d1cf47ffc84fbb9d5f5898ce4407b7bbec15461bebca15a6f30da9a2f7d30ac42e2cca8ce5504b277a95b4b2fbb7362b0cb282ca13254fee746815d65636bb9b4ba3f19d756fe1ec842c13cfa20a838c097f429c1c97479c0ae3792a49e7d36e264e438559dcae4b924c7a8a4259123f5318ecb7cc47c7afc4b74b61ce65ee152f67cb49795214b5bb3aee2bd7a76dad658892b398d5a33075da553979432913af1385295dd8863eb19d47edd9830b85c153570afaea2bea754440e1ba5b8a5a49ad4f982fe9bf699fd21f4dda13065b3dbd2b4149272849d7097357b8a09fa4ead239bf5e384e18d46bc7b84ba10f3619c7ecdce881b94d98d2b7a5aa9cdb7388f35d5034613aadfde741492f13c6aaffa417ec04214a4988e1e038210f72983098a5d56c0f51f273b62f61f4b10f4afea44a091a42219c258c9f4227259c9c4feeb815e12a61f8b060a9c3dc892fdaad0a6ae06183a384a9848659c951547616651c25dc24cc2f4ac57512164a9c931cc249c26c52c5933f6ab288ae46b848942b5cca974ebcc141c2a04baf07a5fd5dcdef7b8441eb99de7aadf4f88f239284d59ff8a88db811e5fa12b9ee107b7b59cd3ce11a77a58212de3946982ddde52aed27d494d8224c9e54f80a72564ded451179892faac43bf3126152feaf972daf890afa21c2f425871357f62fa9b97708c355db7fceb69e214cdb77ba5784acfcd10049f60a61ec38d144b124e57ac9470873e6b789bf3519fbfe06612e3be526990ef5d3f69f208c26331fd5e402618e3ab25f8210f5b59d0e0e10a9a552b1512bfb0aed4e69f13c07d3ae87bc0e745043c62d10ee0f6ec8b9bff6d12b91c1f9c1fce147e4ca8c2cf1751f148bb714626e25df16d54a506a3c4e759658f1f8603c133de588aab894f3116e0fa63ad94ecb98d827057170e8800648c88888c78dd343fa29492d0b7342270f57b2bf92d5925f94c6e121edb157d24299279d34031b77874cc35a5ebbb3dae325b19e46bff4ea23221e36446670eee0ec603ab7ec7152086509ae0ee6ea4f82b613db5309277430aa7b8e65793ee751627330b7c94a9e2773474c2707f3f625f18adac5c1249ed2d5c1c1e849e9e93149c91b4c49861026ba17dd3de706838652fa96a349137f5d1bcef8545bb939ab4b66d244ad6851d7e4d860165929cec7d21a8c76764950693f4689abc1a4be453c76c54e17940663ef2549c9374283a99327c9c4efcae549ce603a25bdc74fd946891e3318e647c7d22e6530ec08919e7193c1d41a97b28dc1fc39aec991264a3ea518ccd7e361e6bc8292c63018cdb4fcdb6779972e81c1204dbb2f1844ebe44ef67bc1b027ac855c3bbfbb0b26a5d484e90b71c11cd482103b275b309d64668210134f44470b06b9962a3c56b260d0f9d35b5d8d05a3e737256cc65730fa5bba7072ba24955ac124447a6ead4fd258f2ab60ec92fa79a194b426f6543048b91735da340583b070c19485f2517a2918f6635ce7fb5130eaa8d86f224ab47728983ba885dc18f917fd09269d24bd52b932490e39c1e8490aed67254d304965951e6b4cae799860104ab4a52429f7a02f4b30a7a6aaf6f77c4a3089b85df83709a696d71a1d91f2be1e124c49990996963c865174cc536951725bd08d61b494214edbb675febc18c613f6c4b3b29c180635af1794cacfdaf961182f9a7af219cf345d18c633f5f3e8a76098ff656c642bc030a8feeb906f3a55aafcc214dae49c4bb6a074dabe30a8d0e14e16a1f2a8b917c68bd6a2836b658d14f1c2a4ca42dd785dca268a7661146149ed6249b2a514e9c26c99a7848b622ecce19df359958f38e1c2b4fde14d56ad3a93bb85592dd693203d4e3c6d618e596257b9a96ecd502d4cf5be7ae2b9cc2749b4302729c5ca836cd7d02c4ce13c78ee139dbd735998449ed83f268a85295b49f23142b030456dcf35695ea94a5e6110aad54a1631492eed0a63bf9eacdeba15464be993480baf92c40a838725f511b29d6f5e85b184d01f5a7c76b316d8ba80d905eeea22f0a103101a17280e5e0ea34001021084e402fe22228f6a84d858000046446eb8800001781d9c1b3aa0716420400022218f6e788d101b09880100020000000040000b00000000a080f71a342e20d2ef35683480012b0262e32c20008900808848c24100019c91e31c0508c019395e2384e300001800041210f21e0c0040001e708020d8e005828cf800c477812023323e448e87470252173666a05c24af3123152071615cf53c13363d086dd25b00e1cc4804485b1c206b812023211f22323c3c1290b430c5afe8a973bdb3307d2749127a61f2a7bd6561aa3e0b2ab7eccd95508d19337e06cff8199bb1c8aa64f9bb1cb38166fc8c9df1335013168906c88c54807c050d90198900e90a933039efe53fce2e5e6346fa1839337203d90a0419f11a336e7878242059617259339959b26398f083fbecc69987bf1040641c10f436448a8dd00041111a202332406e241e212dc8558cbcc88c9f61805485d798910890a94840383352011215083222e3c60c0f0f04e4294c996b623fc8c714e67eef20634adaf81db314064f5be2fdb32895a693a41885716c8ac2943a7b10f2f4e85bf364288c9e2dc8bbd7b7fe17144611622354e446e315e4274cd2579f9f245e8ff484493095bf53fc2a41cb101b40f84e9892bc8e4f52d65f7a13274cbda6b43de8b44f3a64426ec2e8a62b3c090fa6e2b7d4c4952aa558a92e7d651bcd36794866c258f964dc73ce0942942270c1041213e664b2c7eedb4a55335ec264f52727597c63d52a6909e3765ae94f59a98451fdc4932ecdfd9f7a29611c4fd13357ee244c954f98d60f3296ed9384e1d35c0a3e62dedeb48c44f2f5ae2297d6522be4b28dd07ba71adad9848439bfcfc4550ba33dc224687a16154a6bfae97070a4238c955f6ed1ac64bb20fe60f3b05163cf04d908f3a8df761125c60873caa8ee9ce453d7cf2fc2f4ab57823a71f74b5a146192f784caa23d904c8449ae54ce9ba1eb732d8c08539e7ac9a3a64b16cfa143983aa7e792f25677bc3b6908e30533adabb2562a540883ca1bdba5122184f94bdb9b0e2ad7c120cc7f5549befdb5fc1c09c270f2e93022fe48e3200361d6bea43b7a98db5c8e0e006170cb5b51a2a585ca655243860e3c465ea4d81f8c6392e82728a52ecc637e309ca04a92f298c925057d1fccf94f2a4916bdd926a7201f4c3a66265f540e22eb0f6a84e8600fe6dd3693c3789204bbfd834d0fa62ccb97041f59e447b4069907a3c55392924eec9c04b58c0fc183c984efb2587ba972971b7807b358e9854e2e27fd441a20891d4c1e4caf6ea7e8880f505a1d4c9220ed9467e9d7ce061d0c7736d25b3cb6ce723f0793a404d9498e92fb602b72304949dd79cebb566a486226838c8371b6f333c7a46839367e4424657088c68d942a483898f20815d3c193f20daaa8979c87a757fecfbd56da04991d0e0e37184bca33f7bf62b6e19465477f967daacc68241b4cd963625e0304366c9c909155410d3c6e906b3065c4c2dd67cc254ba5de56f24dd492d4e239483598d693f89877d134985d3cefa9ac9dd4c8190da60c75722c693c4b797f06c37a9c1394ecde0cc63329995c921cce949c530673573ce9697d2383612ffcd8889534f623442e30432167390663f52561f721db90111b2906d3e7effc24491eb530988338c94b54f23269a604832673c962ddad5adec5ed5a56944eda7112e4174c3254099e37cdf482c13bb848f5f4c92e98db243769bba28dff13a8a0061e2e482e98542c754bc7452fc73fd86cac6dc1a467ba3d94ec95fd93c8d91101c1d4827188c0059d055350c2633cde050ba6a454a509f369547f2eaf60b090a3f27cc765f52aad6036314ae6b3831ac82a982ca6c71331f53962ccc54052a1b94aa55ea72d6259ede5144ca17aefe24af61c264f2998af3ca5d352b28a783ca360ce3115fcb2bb75be100aa69caff760a97c82c9478967f1b2934e30951244454d5213d7441f6c2320890648c88708da07b209869393eeb3133da88f950e24138ceb2979c96df15c82179eabe7243d359e0f360fa3412ac1e8a59f6295ee83d13c904930894b7fba6e3a5b094a9e4622c1bc2545ff1e773fd8f818a61b517aa55f9d52461f6c42e8c17b84241e232033decc18e6fb64d9d1c35a9f30fee0699462a0426c8ab4301a0f6880bc203d80c43056ffc9e1243fdb123e1f6cc330d8a7cf262bba73e3000ac3a43fa4cbfb97efbafec1e6f13e001939323ea42e18d6ac59b433710fb54ad1732895a4e4e2df0829d6c030f8a8784e2a5b481715d1b8210210fcc2e47174cae7259ed2657c726478388d2f6f230830f819274404692f03847d61d269eb63ae27a47fb017869357c4ecaeafa8517961be8ba6d2a9b57117a6feb292e2093a8a757461182594b01667920bd3769f24fb4fb034b9425c187c2feba756d589ad6ec1c69bab5a0adfa51dd75ef25e50137eb0d53822201c1c323e3928e0e07819203666d4401c1c2c40c1a22d0ce22bf7c2dce42446570bc3d5c591abf849848ed1c29cfec4ec5de66fba6916e6184b4a897f0e29a69785399824a8fc21be047142b1306a7ce509164d4ed21f58184c5578b4e4c19368e32b4c9dd4ce6d4cec0a53692dc93636bcdeeeda56186dacc489134dada88f082b4c925ab14f4ae9e0a75d5c853989e96c71848926070668daa80a9368e6a2ae63d2dabfa9309992b257befc537e212acc16a746cfe675d78d33c0536061561d6fb39d366aa77da0298cfd5be779f6a4507e82a530b577f04b625ddf4ea79014e620c65198c3a5d47759944461300bf5ef24e93db92ca130697a0963a269e75853c9fdb48f50e169003ff103f44410b013e911a7656aefe43349c809c3b48285db8ba5ec953a4775f1e0260cdb167af5834c13c6ad784947e4a5f5e83013869d5382dcd88c983086502a7e5749f2323b9730ffecd58e7f32a5e7ab21a3aca025ccf296e3f2f9c70e0faa0496bf4af5c196dc10c112e880064872e3053b05a484d1eca4a9f211da4eca380993b0f8d1c46e64953c3ed0c899718792304d89956a374c3ed8426c00e13d641c1f7c62244c76af5fb515e4724148ce1ed1382322344a900609b369114ff3a21f7e1f3e42b170e9dd6d2e887a59c54fb2ffef9ca90374844168d7b21cd637c274c19364d7297950254698e452be2df33f96b4651186932d5b8a3028d3237af47789308baa8b735751829039228c95e4bcfc5582fcf2d0210cbab492fca8723f416c08a3aa0725cb4e8cebfd0a6174cfa1795a374218439ab60f2dd5208ecfda56595171d30ad71022ae65dcca4f4198468bd82dd11d1716d141c8f1b00b84c1646a494a673f893c68dc08f1a8e108085332d1d3abb5ac05ff60fc2d495e4ada154ae68a7e30e9132e9fe8174fa50941807d30f6de9d9ede356444d33c66dca071c807f3788f2511d332a2f4b80783b0b21cc6b41bf22325b002eac1246fa851f2a8fc1425f6c126e2a1c6031a373e46540598878951a8642c858342d27030168c44025130105236cb0100e312080020601c8ac502c2509ecab9aa071400037044263e3c242220180705428138200a06c3602028100604018140301004851e12b5466aec6dd202d642c7d1043a3303790457422b52b1483765c50ec603e390758149ef1a47ccd51a256ad7a2e30d23725ebd5c390a40dda5cabbb9717f88fa83d8b896bc0928eac4fa97dd102efab30dfb58fa3bded1b9d10e8546d76a118e1c7db2e8731f9f7d1d4d1ccaa4110e4e65f18d10bd829455e32ffae1b30f91a700bc1ca8a529d8343d6a8c7151890a723baa76852b405a0c5136421b3b0652fa88f6dfc192d60c7b43bffdebbab681df7f89f73aea123ce3b6576a6073f0fc6250e4f2cb84ccc00f8aced3ac643766987c360ba84482a1b0f5c1aa89f0bf35e10272e09a962168652212740c44ce96238fbd12658eda8941beef21a08cd2a481450f73a0818bc4417dd0255067cf95fa01007124cea80f88831e7652235a0a50afb1d7e731cf341e044ae71b71316280a05e5c349e3fa2d75c7f7a3f2d8db63885800b15fbad77d2f0671046049a64c10145aa098011d16299e65000abd35f9542496231ea457845d2a067cad9e46a030ccbbbb8ed374887fe5c083bd8fc8e6cc4ebccc5cb17862b9da243a72582a8118a599d8b36ba711a87d89898b4002a655995ca2be404f2a23bdf430e88093b2a0690be06977f38b56e30d0fab96c7ea6cc82c62cff16440f2171544c2d025c61f1925ad00fb72917faa9302493f43b14ee2a6f4e310a7bbcef9458daa0e7863a7c43752e0fe720907224f53870c716e0a3225ffb68efb1cd035717e80f26283493f19f6d3b39b8414abe59f047bc24ef9d6d088edc2de906c7843cdd04319a535bfd982e4459fd26ca2b9b1228e28e41497eeedbaf08a387f5a87a5e51bfa44cb2b9465972c196215d675b0f2e6260dcd11756f37f755e2c86b95d9a01d8102b782d16da29d22b8ae7b4e6f8883ad1f322e26fa57c80bcae8b747476d411b7adac62c233c2619ed943a4b876ea232ad1861471462392ef62494bf68e048d312d54568079b57794281c91f827e3c0a18f157c5b0e1c65d24a58a827e17c1a5378c930ffd84f3238cd837c11b905fcd88eb61f864b6079f339f45faddd987b29f6f8072eaaec4800ddb11689b7ecd78fb5204973113050a121e0fac233b40a106490989d6fff2515f0da8486682c5b705cf471df6279ec4965f206ca8896e32b9c34d589a659f18aa264672d106e0e19b5d3b1c66f6390c4519a8cd6d17f805b2f8677b6a7a8bb647356f9bf3effacac6914789ef01a39d5d775d634ec2c8921437e56501c775ea6f98e4ef902b0adf5ee88f9aa49c5f7010e6b16e6efebe134896b0c5d3c43afdfc09ae7f0588987216b055276cabb102522c103b7badfc9c42befd4e2deef1f42548e55c7de9985927e5a47be46ce1ddece4bd331a29b5a9d035deab7216ddc26c9261fe9920ea204740d41889a950cc5561d63b0070a4f8848e66172d69fb4f4a9ef5ad9a29ac9fb3ac05e14932e6ecae241ff586980da5d5d4a733f2f2a57d089ef538953137aa0883dbbd042f48f1de869728dcb57129f478199153eb1a7fd9760b4d585c6c808a537107d605516310bec2e7388d483190439d129e099ad6b04d5548a42ce1982aba0223972b107efb78e2568732db94ee9bee544b10f31adb6b1f9d8867460ac1bb5c450e40a5985c0c316ff80aa34138a361bfb291b466255a3210c72f296335e37c5073a314e7775f146eaf05ee224dc4393f28a7e8ca114448643bc0083899467574d3303e26854d5aa238a4786530804fb26961674882cf1a3f164063260b83eaa32e434b781cfd15f4a93c3bf8358b63dee87d00e9828574a92a5d539b45c37f24bd7a8c5d683da32b2f45e6859b6bca23221cb529d871ad042bda4cadf28ea4ba5bf07521e0cb0089868bbac1be6d46010ff54b331c81164211d7baa4711a898b9b49a27257f7e4017886c659e9aa19e4f9bc9bdda25c66d0fecde1dd224c7b9eab77faf1fc35dddf7aac41fb3b8102a30b9442c76cb10dd6b614bf1e3e692041d902e9b4e035a1d82665a484b778bd1bbebfb73897f9e8e0f23423eacc2d750314760364849fc49bfe1496c7f5671daec006a8f4b8305a75c00b937b20c78b4a94605cb0ae9324c8529847636b603f7ad512d5e02c681621a52f767082127b737acebb3b5b11fd93d8039027f1a47afda0ee071645304ce4bd77e458ee384159e6b5b587efef9df2066adc1e2932155486c8ab88e3a39f5616307c6ecaa44b573ebc61c2081d89d8428e997d17d016ef43d30b788b71182ab1e471588c1cced97288a4640029a6f51a74a070490db2c59403c751c0aafbe6102aa00dc361b6bdec27aee50f94a7be8695ece5ec5dcb98a80a8e18d4dd63c68bfd2bc9e14d42ff2ceefa39cef1e11084f0f1a99495a9d4c9f412748abb5e2fd1e0f45c9bd0608118b0a4460278b3723903530dd94d965419d70ee3a751e3e04a9e15008f8e51223fd921cd8a55f2ca5702231a0f64920d6b8679e79eb2c9ae29045d1bb37d4905abbafa59cbd9c5b197790ba6fce4a497be58a6a2f7a1cf12591b29226dfb22d392429adb9abc66b59f03ee64fd6d081af2197e63f971f24841804c03b129090293e14dc23bdf2f50bcd29f3e25e29e31f0b9ea46ef955319c7d788e140e97cca1ad466a0785adee2a000653f7b5b09b13463c8368dcefebbb4e761c2941bf36b6dc215e57731fd5c6633297dd722db240eacc4c98632c89e6a23d3e925db23fa3c0d4b176cd1cbc307bd7b22f6081302011e1eed53f45c63cd3d845e220701a9600d2670f78b802e9fc65c602827741b57fa7653382338de1e8f7d485d20a0bcc46f2472c9fa2bebf602c1e04ccc41210268a32699e42e3b906e50bcfba8837ca9235d17958ce868c2615f02ef8e811ae58cd7ddb196f550b521519713a543e5f8a62024e558258d37082aa6938d7e701d01b83d938945a8c84b4d1cd167b00ba7dd9edfe07c50e653f2844167133d42fd970dfacb889930514cc0581bc948ef89fcf0bd66b7968021791b468518ab65870c72a1ba2ce420d3bb897c5a55d275278d0fa7f67e638e742e83e872b2302b4b5f7bbe0a70d290cac1ac56c52d24fe589f3e1d3afcb49127ddae7004546bff062c62ca2dd8885450a3219cfd50fd84e4da6fe0fac56bcf6f9c6bcf64278b465a209adfed5c614a057ededcb7bff2c0088965aa85afcfc4d04273366da26af227c9971d84092bebdbffd14a074121d1ba617910216d1bf8edb6371c10b601340450413381867dc080cc733a50fffefebfafb7f80b51b00fdb7cdd170e0f13237e0679bac452723101dc83234b5bb1196f5165dc2aabc208994c186295fbf700b7d18e255965977a86f0eef1a2fca416265cdc114473f318f992231e0982fc26a1f35c3f8f7f5a43736b3dbddb3d1056673b6da7f83a3b609a38a86d8abb86a566bdda4413ffadaa1d6551aa6a0317812f3fc1c7769a3b8417da10e8a08cad44af99a7a8b45329702d65d234dc41b0d419d5e12c5abbb88b95e9f8161b439610ea18a474f62c40284c81380bcdf8c038a89ae78c34098f036c5047fa69d3dd1b878c53dfe695b5f8864d32d390a5d7ac2f38cb4d087e5984056ea6afcfa9ee0234576a10a784af94d92fdc6f56543da896a18e9d798f36a8506ea22f48f3eb5c22052a76de41527395f18b92e0b41ce1e4f41026061715a73fd0ec0eed3ffc31e1fc66525340bae443a40628a57f349ed51beda8ae2359c5f76249fe3f9f8429858fa18208315a9a298333d2380014232466f68e3d545191ccb7ab62e2a2984d5bc7ea28cf47c366a6218b6e0a8f67ec25ed86fb8b580b2cc49d5d9fa7647a0ad14fdb25e430260a5c28218c6e48745e3c70a16aacb1e4f074503a254cceb27b9cc0fe3cc191a1c72d1771522c51ec0a18d9cd7b6d9991028474346be9c31ccc2cf988bd23c0ee7c4cc1f4f6ab499061df36abf8824cd42b292014f9be97db9a9331eeef10ee40cc8561cfcbe8e4d364cf0cd954ff8d7ef613bb4be68fc195bc2ef2477dc962cc25551bb74b22d0477100727b0964eb70bbc1ac0baae647db86ddc9b4ab7cc4d0e12f150e764f73ab808b767bf438e3a5d42f9fa298dc7abaa9639303301689d189b64235f0eb415965d1ab3d466d6c6d1b07d4baf6075793f83dc77e41e28cfb80885827f8a506d32265c5918d036c3b23798a08f4b8268671e8435a73d7d9b09eaf040dba1459bb5d3375286baa334784e1864f848bcaeaca8607d2d18571c48938125c65eb8dfec2fd33904df9d443641eea5c250f71caddca2882c2824851a965b2751e525cef9efdddc11c54158d7dcf74f83f29fd681d17852d9d57f3948befa84fbec052cfb8109234973ca65d8d9e6bcef4f9854e5803b3aba0f2e8abad37568cc5464bde14ca3c5e76839ae278c151449cf0bb104080756b907292fe9ca1f72a631ad64e02e3066e31aa73d1b795b1c0ac4939a7314e94416dad496d5fb159fe49f9a1e5eb428c573b8aa35b47385f21441503d741872fd1730b2cbe066093f3d511c0dbe264f381361cb6f93e62da6e55c6445320de65a10040c8cfba98f908752c813f049a27450466a0517d21ce714b064cff6992cb05c330ad441f9b7862a904439ac5ecbc22b8e72375c6fe8d7c955391cdb338bff23904a681f7176fc53f05aaa07bf301b23ee5bbae34a9354369c25aafb7a39a7767509f09f5a364eb3ef5918d91ec179b9b594392f67a8fa435de527bc133ad6b489b2cc523252e7101ef287191f1f1b9854e4d2b16034c533418f616e6c3a96d426c1e246a90e70b8edb2bcd8e6e21fba0dbf250ba4d465dc788d6b750c00cbfba7e2477bf29fc19015786a729b9e3058c35d4a87b0236f7c74341f05766b4a6c51b7f990ce6736332bb7fa53b9e2882e5ee4ed3cdd0379cc9711b47fb751849d1f75f8bc1b060da4c1fadce78177c2f5c4daa6ff1c6d23eb9d9aa9b6e71369f96e243fb31702478756c77a7bebb81d6d48d478dcc6f9b44f43f9b8f29626f7d994b2fbfdb7c55d4f231dda56dcb0a04bfae52a949e6222815543d7c8a555e8241b5bb7173f9dadb2bf16c6d359273bda357b1ad603dc39140a0c02de290e0ab967f7d379854037bb712fee010c1b6e6b09d8e791fa9f9cb3bc5e60486070ab8986d4b3c480dde0e139601c63c3db6e80381975661f74cf32d8af7b38a2c15aa16710675ffa66547743fedadcdad5306fd14dd7813f249c0ecd44af802d327629e3f81be6b1e6010e004cf56a4faf4880a5e88267aa3a6143b4023ba0ed8f2d6bae6b3be370c09e5b89816926aa207db24e6c87cc073a506722c5a2d12d164a4fc0b025df68d9a52341d4142cf498c1505cbd386eea446a0dc7d8882e70b3adaac404fb45050d1eafc23d4576b21188fec0d7a55ccfc5c0b11104abb3bef167a6e10db4168d7bcd61d62c2df5106c33f57ce2cd51f9c26a0010e084986ec05be05b01c67d8e24fa75201be42b8ad29d07e5531891819b74cb2e78aa619632a0569c3b08210530dca661705a0b594a0f7b21cf172b7ae737aa68d87521b74265216d15274714d8592723b617e08ac5b7080ff010818583fa4619a6327d301130e484633028ec95fdb9c1e4906da575af185d373bdb36a85b4544b350418102531123f04398b8476dea4aa34d8c916dc5766f20dc60760d6fa2cd0aa41b9241ce69291ae44cb7ff4c2570c5b68a30001c1dd0fa442f211b1033453a6a1d3dde5b2298cc981ef9156de0659c54ab5fe378236de6c201e347b168210166de6508e669563220711a4702d104c0553efbb62bed3c724155ee6b7833365d579124d058ef11269c5f0f9eeee6ee19ed91bd1bd456d8ee55ef52f6673fc3bdc53f5d15d61e617c144c35d3752333791a4327592d30f0bb0da70f402e6e2790a3fbf842fdaf8da4b15611049a6b1f4a10f5446041f13edc03c0ffdb413a5ffde64d99e149fd68d044bc15b2c549f6ca4ebb5a80e1a4f9123eee4d989aaf079c113557af7f72a2af066bb5f58bb64e75792814005e2040221f6560e26ba7f67e8f86d98916a0442bc6a16464423454616b05976c11325b58510740ab5b4e222030173489cd49ebc29db438166d9a4dc29c8dd41a9c909833e22a67e56fdd3ea909ec3134f92edd68f6fa546e32e9803d93be02884671a1bea34854efde78ec6ecbc2487b5e2e6e48ab7731f0463cebb7bb9f6705b7651e911ab10027e22a19c9dfa324bf79f58f9550a965bda60f8fa030a6b25d7066f22df78ab82c01273d5ef08059ac93da83b522fc007601385e234f9207022f1bf4d96ca922b3d0fbf056b0aa5917e05a89962c79944fa505135c0339cb9c0a628096b65abb3fe79304a144fb142a8e0eddbbd63220c0f5420e1245927826e4124f7c2df0c75c9d6bc512680fb4bb91bdb0ef343ca5ff242152ab8f9c9d92af3b9913036e290d36d60ed53254d15ab979b5a2069914a0bc11fae5477c133419a3f144dd01704a3e7394026ec52d8f0dac21633949149988a4313cf04aa59ab45a70e03cbd269034fa25297cd3f4cf0185e94cf02cf8def2d91642c560bb061377f9ac56471eb2e908e0717acf103b1987701ba470dcba4c3147be0a26cc1915c99eefc75186ff1252abec10e15a52c67179ec0a4ba586ea31b0642303260191e6e2d1d19deda9d37e4cacde5ca9526068caaf02b6233613aa1d21b1473d9ce2e5d95ce5fae69681356248550d7eb45ce136b8028cbe1df541cad7953c25b197ed3adf32d3f9dd3442552f7767fc5c25f445c1a7ea7461007a2e3c30d76123307ac379982cd193ec6cb1d2a109ec509f0588a1b70a4fb0def95285a750f55987fd7460a90a46fc30c4dce33ff4b000f0e63bb1298c4681830dcdaf23c8a67db30e028f07db816a5ea9606b94f235838a5aed97c9fd322b9d37e887aa7596c4d79b6c5ef6715f28c44bbc4abfa191fed1d3e4527f0e0ca7865daba8858234f57140e3cb1e754f5c78370c587dff4c6e5d8f2418142ab553573f18979b05f95c489377cfa275a50118d20c6a33bcb519bb26b5e2c495b9a3a6749b6b4f921db042f860729ba77af44107b6a1d676c4a7c99b86565d489f1b302186761f4bbb386773373ad5839b53dc23655a6bb4d20cdce7d4dd7c0ab8e90211b3cc0cf6a2308ebfc83fc0c1e834d6dde20581862b576c5179b4ecb5f6a04a3f784bb73543a44b59408ebdc6a1ac8031710cf5c31171493c14ac4c3f9abb283cadb04a5adafc9bedd363e5fbeba67692caa69abe260c0d791cfa6d37e1055381dec62006db84d9f47421ef5e7268e5f2a85b3cded468531775db7d6c33763add8c7f2b89682527c30070e44b4d54102b476757c037d26d21613222918291bd762089bfe886d8172676723bd8c176f67a69663d59d06d2ca0babc54bcabf570a740b848f8987c959eed4a236bbc73ab7ca7138cd3962e80565749aff806cebe8bb2168c44b8d2d3c1c2c7fe26078956a5e887925ec48289f394a19ad789321abd6205972db2e6144671c9ad757a31db7fd97091db7e875762db7c01b601e4862242eea8ba4d980107701b795616499789361055ea7da88d4b1ff4c0455740b9cb2290e2d6c69268f7596bd5889b86f0b92823b0e43c4955236ef6f26c6dcd4adb9917de652216aa62b551a55af86dab96f4263fed1278db316990c2ffc914b2fe6f424254cfde29d37699582021d6708ff2ab76f21ed6a39b13054b6b3fa60e9ed2b681b050dd4b0af3efaa0ec45a912e549b4b682d289b1df507464d66ff2ba8f2e45e9d3bb6ec63c10fbd82dd9a6e49c945233587e82da87eaaee4490390263344fa1660982dc1959f12574ffde37845983cca07922fc0f75319ab217e664ebdc79b194e02ac958ab816519587e1acca4fecb0bd963aba110cc0a754e3b1413448113ce9cc9dec2b2c9880ab7fb3fc4098a8d445926786c6669651713894f8ba69b0698d636d372b785030a76773c2ba0a11dadacb9cc33f18f76e9134898c88705e007f12d45c3f696de4481a13c4486fcd568b47437371ceaeb5c3bbb211b4f9aaef4c1e3a0f96683ef45aec90f51bf23e2dc2dfb9ed2d2cb7fb80c7520b9dca4032174de30e58bc7f9d9eaf40e869664e87d170c6953c16d12b4758d79324d47c9c34f97aad2aae7eb61c798f9af34c2b96625e0536c5b0931fdceedec387b929fb164a0d5715f16f3d2de3bdd5f7d282223f65dc46e093632d9e08cedb10ed5d3554c263aecdea0540a43a5d83c29314bad4497d3e7f1c1edde729ec51d853d29c15977801fd36064ec15ac8fbbd59c7114f4dde54835c9ecedef3255a250cbbbbcc45151c92a692a04141c321052343bd200faea101ee8c72d9e605146904c45061c7a3acf1d34627048a871c6deba7dd1a8e9801162eb2b0540608481cb0e7bee262d2b89f93e462ce078802405eb63f2695d4edc9d3cd5c02a22b6c7bd95d37407b29e2a113da40679f1304aaa5ca92aec08acdc985f77f232a0b0f9de32c0fed3bb13b859e65913248b6bc2b71c186f5ac48375fd05bf7f45ceece8ca65b4ce327e75264d1d12486b1b6e709726058d8a0068a1107ac1e01a1b6cba60b1ca0054543059e9b5da1ba58686329ec3245355cf99e2d04e27d07f2446e8fab54a0ee41cd453004aae1b66c5d69e7a2a8a9f87dd546f7321d027a2c7aa358d0405fec0eb110622567ce455278607f05c1b032c04f3f1220deb220e2fd5f5552769bcde517a988ce1354fc0425935c8d220ea3c853bef1109994bebc66f2c26c29614bd832f0d890382d35814224e0c173d2e83b37cc3d8c8779e6a272c324ff5297d09e2f234b3f3c256219690a43d4c2d585a94460249e5c0c09d9448e457cdd9921bcef82f63ff8c0c8ca4b410345011c01f28db20a6d39865840299fa90757222b5f0da0331ec443241d43b115a342ef2a6c5c3395ee0b243d2bb52c3b9a82fda19439d382d48894b31eb3a24fa1cd85f42983a9c3dc992a52230a8d91e0e4badd33f5fe7471d01ba4b7ae89b7ee66e220b4288403e51640a34a984a3367834bb2ac8db6bce2341b144808087bf0cc3de51b9b0abb71f75d34f1b124c4a6b5b1c95897b20d828842804c2141cda623d4a2ca134e219d7dfd0f2754e25900a3dd8a30f1fdc87e27f58958cd7af7d8446a7fb3d96ade5e1bcb3f015de47e3d24db8508579347befe9324125afada274e2981d0358d5248a18122e124b615985a6c0eaeb99689270c2626c2868649c5ba7f6f17a0c7438e648f89d0cc57e7463b43a9262f489b0e650b9fa04306300b20632a90e1b6f4e3d69b3a4417cead386a6ad8bac776f04447afe5c4d6868fdaa95000ad5e1ba60af4460e710147baf586fb7a8816adfc98bd6d43932cd16b56e1d04d9d5d8bb032f57e89cca12d3cbf259ce0a8b4e00f8341494a94aeae4915a8f8bf7a202a3ca1291fc211451a6326810a12e25b1e4f9b2b41b44eac41bb016ac6c0d8c19cb8558052632c3892187a008f60b18d9471c356e8082187c6c16af703249cb6ada558ae264398b686694036bfd2e64d93506574dfac010bda8652fa7792b4a1032fa3b77e7db3e9a9a9d665b50ec1491e483b6b93959870cfb8b9a3e2c5d724ab616f69b970a425ac3aba6fe3677558506eae0262bc934d8a1ebde696c56230e5b55ba283e9c44c117a9e745f38e26cf98c39a435e1254db2813ed291394a19e866139934a3623652fc44808d60891689b3d2a35be87ad5ebd891bdf0c03d1bdf495c5604e5461b57736aa4b802a43d9b406ca00adcd9f337f13b8c64a7e58700aece3d08afe38918b9e9bacbcc02e67a94d16abba965ec0c53090747b6e93864c03897375fbb6ed9cce93bf84511dbab07a8cbd75abfdcadd7b0e099b19bf371dfd0a", - "0x3a65787472696e7369635f696e646578": "0x00000000", - "0x3a6772616e6470615f617574686f726974696573": "0x010888dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0ee0100000000000000d17c2d7823ebf260fd138f2d7e27d114c0145d968b5ff5006125f2414fadae690100000000000000", - "0x3db7a24cfdc9de785974746c14a99df94e7b9012096b41c4eb3aaf947f6ea429": "0x0300", - "0x3f1467a096bcd71a5b6a0c8155e20810308ce9615de0775a82f8a94dc3d285a1": "0x01", - "0x3f1467a096bcd71a5b6a0c8155e208103f2edf3bdf381debe331ab7446addfdc": "0x000064a7b3b6e00d0000000000000000", - "0x3f1467a096bcd71a5b6a0c8155e208104e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x426e15054d267946093858132eb537f105fe52c2045750c3c492ccdcf62e2b9c": "0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d", - "0x426e15054d267946093858132eb537f14e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x426e15054d267946093858132eb537f195999521c6c89cd80b677e53ce20f98c": "0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d", - "0x426e15054d267946093858132eb537f1a47a9ff5cd5bf4d848a80a0b1a947dc3": "0x00000000000000000000000000000000", - "0x426e15054d267946093858132eb537f1ba7fb8745735dc3be2a2c61a72c39e78": "0x181cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc208eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a4890b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27de659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e", - "0x426e15054d267946093858132eb537f1d0b4a3f7631f0c0e761898fe198211de": "0xe7030000", - "0x4342193e496fab7ec59d615ed0dc55304e7b9012096b41c4eb3aaf947f6ea429": "0x0900", - "0x4a83351006488ef6369cb758091f878c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x4ff3897794d496d78686afcfe760a1144e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x5c0d1176a568c1f92944340dbfed9e9c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x5c0d1176a568c1f92944340dbfed9e9c530ebca703c85910e7164cb7d1c9e47b": "0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d", - "0x5e8a19e3cd1b7c148b33880c479c02814e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x5f27b51b5ec208ee9cb25b55d8728243308ce9615de0775a82f8a94dc3d285a1": "0x01", - "0x5f27b51b5ec208ee9cb25b55d87282434e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x5f3e4907f716ac89b6347d15ececedca0b6a45321efae92aea15e0740ec7afe7": "0x00000000", - "0x5f3e4907f716ac89b6347d15ececedca138e71612491192d68deab7e6f563fe1": "0x02000000", - "0x5f3e4907f716ac89b6347d15ececedca28dccb559b95c40168a1b2696581b5a7": "0x00000000000000000000000000000000", - "0x5f3e4907f716ac89b6347d15ececedca308ce9615de0775a82f8a94dc3d285a1": "0x06", - "0x5f3e4907f716ac89b6347d15ececedca3ed14b45ed20d054f05e37e2542cfe700e5be00fbc2e15b5fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0x8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48", - "0x5f3e4907f716ac89b6347d15ececedca3ed14b45ed20d054f05e37e2542cfe70e535263148daaf49be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d", - "0x5f3e4907f716ac89b6347d15ececedca422adb579f1dbf4f3886c5cfa3bb8cc44f9aea1afa791265fae359272badc1cf8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48": "0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e13000064a7b3b6e00d13000064a7b3b6e00d0000", - "0x5f3e4907f716ac89b6347d15ececedca422adb579f1dbf4f3886c5cfa3bb8cc4de1e86a9a8c739864cf3cc5ec2bea59fd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d": "0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f13000064a7b3b6e00d13000064a7b3b6e00d0000", - "0x5f3e4907f716ac89b6347d15ececedca42982b9d6c7acc99faa9094c912372c2b4def25cfda6ef3a000000000e5be00fbc2e15b5fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0x13d4fe63a7b3b6e00d13d4fe63a7b3b6e00d00", - "0x5f3e4907f716ac89b6347d15ececedca42982b9d6c7acc99faa9094c912372c2b4def25cfda6ef3a00000000e535263148daaf49be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0x13d4fe63a7b3b6e00d13d4fe63a7b3b6e00d00", - "0x5f3e4907f716ac89b6347d15ececedca487df464e44a534ba6b0cbb32407b587": "0x0000000000", - "0x5f3e4907f716ac89b6347d15ececedca4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x5f3e4907f716ac89b6347d15ececedca5579297f4dfb9609e7e4c2ebab9ce40a": "0x00", - "0x5f3e4907f716ac89b6347d15ececedca666fdcbb473985b3ac933d13f4acff8d": "0x00000000000000000000000000000000", - "0x5f3e4907f716ac89b6347d15ececedca682db92dde20a10d96d00ff0e9e221c0b4def25cfda6ef3a000000000e5be00fbc2e15b5fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0x0000", - "0x5f3e4907f716ac89b6347d15ececedca682db92dde20a10d96d00ff0e9e221c0b4def25cfda6ef3a00000000e535263148daaf49be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0x0000", - "0x5f3e4907f716ac89b6347d15ececedca6ddc7809c6da9bb6093ee22e0fda4ba8": "0x02000000", - "0x5f3e4907f716ac89b6347d15ececedca88dcde934c658227ee1dfafcd6e169030e5be00fbc2e15b5fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0x0000", - "0x5f3e4907f716ac89b6347d15ececedca88dcde934c658227ee1dfafcd6e16903e535263148daaf49be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0x0000", - "0x5f3e4907f716ac89b6347d15ececedca8bde0a0ea8864605e3b68ed9cb2da01bb4def25cfda6ef3a000000000e5be00fbc2e15b5fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0x13d4fe63a7b3b6e00d13d4fe63a7b3b6e00d00", - "0x5f3e4907f716ac89b6347d15ececedca8bde0a0ea8864605e3b68ed9cb2da01bb4def25cfda6ef3a00000000e535263148daaf49be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0x13d4fe63a7b3b6e00d13d4fe63a7b3b6e00d00", - "0x5f3e4907f716ac89b6347d15ececedca9220e172bed316605f73f1ff7b4ade980e5be00fbc2e15b5fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0x00", - "0x5f3e4907f716ac89b6347d15ececedca9220e172bed316605f73f1ff7b4ade98e535263148daaf49be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0x00", - "0x5f3e4907f716ac89b6347d15ececedcaa141c4fe67c2d11f4a10c6aca7a79a04b4def25cfda6ef3a00000000": "0xa8fdc74e676dc11b0000000000000000", - "0x5f3e4907f716ac89b6347d15ececedcaad811cd65a470ddc5f1d628ff0550982b4def25cfda6ef3a00000000": "0x00000000", - "0x5f3e4907f716ac89b6347d15ececedcab49a2738eeb30896aacb8b3fb46471bd": "0x02000000", - "0x5f3e4907f716ac89b6347d15ececedcac0d39ff577af2cc6b67ac3641fa9c4e7": "0x01000000", - "0x5f3e4907f716ac89b6347d15ececedcac29a0310e1bb45d20cace77ccb62c97d": "0x00e1f505", - "0x5f3e4907f716ac89b6347d15ececedcaea07de2b8f010516dca3f7ef52f7ac5a": "0x040000000000000000", - "0x5f3e4907f716ac89b6347d15ececedcaed441ceb81326c56263efbb60c95c2e4": "0x00000000000000000000000000000000", - "0x5f3e4907f716ac89b6347d15ececedcaf7dad0317324aecae8744b87fc95f2f3": "0x00", - "0x5f9cc45b7a00c5899361e1c6099678dc4e7b9012096b41c4eb3aaf947f6ea429": "0x0400", - "0x5f9cc45b7a00c5899361e1c6099678dc8a2d09463effcc78a22d75b9cb87dffc": "0x0000000000000000", - "0x5f9cc45b7a00c5899361e1c6099678dcd47cb8f5328af743ddfb361e7180e7fcbb1bdbcacd6ac9340000000000000000": "0x00000000", - "0x6441fb391296410bd2f14381bb7494334e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x6786c4cec8d628b6598d7a70ace7acd44e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x682a59d51ab9e48a8c8cc418ff9708d24e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x6c63e84bfc5a0d62149aaab70897685c4ba24bcd9ac206424105f255ae95a355": "0xb104000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "0x6c63e84bfc5a0d62149aaab70897685c4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x7474449cca95dc5d0c00e71735a6d17d4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0x74dd702da46f77d7acf77f5a48d4af7d4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x74dd702da46f77d7acf77f5a48d4af7d62556a85fcb7c61b2c6c750924846b150e5be00fbc2e15b5fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e01be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f00b304f91831830500622780fd38770500", - "0x74dd702da46f77d7acf77f5a48d4af7d62556a85fcb7c61b2c6c750924846b15e535263148daaf49be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f0001fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860eb304f91831830500622780fd38770500", - "0x74dd702da46f77d7acf77f5a48d4af7d7a6dc62e324093ba1331bf49fdb2f24a": "0x02000000", - "0x74dd702da46f77d7acf77f5a48d4af7de5c03730c8f59f00941607850b6633d81fad1867486365c5b304f91831830500": "0x01be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f01fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e", - "0x7a6d38deaa01cb6e76ee69889f1696272be9a4e88368a2188d2b9100a9f3cd43": "0x00407a10f35a00000000000000000000", - "0x7a6d38deaa01cb6e76ee69889f16962730256ea2c545a3e5e3744665ffb2ed28": "0x00020000", - "0x7a6d38deaa01cb6e76ee69889f1696273f0d64e1907361c689834a9c1cb0fbe0": "0x20000000", - "0x7a6d38deaa01cb6e76ee69889f16962749d67997de33812a1cc37310f765b82e": "0x0080c6a47e8d03000000000000000000", - "0x7a6d38deaa01cb6e76ee69889f1696274e7b9012096b41c4eb3aaf947f6ea429": "0x0300", - "0x7a6d38deaa01cb6e76ee69889f169627ba93302f3b868c50785e6ade45c6a1d8": "0x10000000", - "0x7cda3cfa86b349fdafce4979b197118f4e7b9012096b41c4eb3aaf947f6ea429": "0x0400", - "0x7cda3cfa86b349fdafce4979b197118f71cd3068e6118bfb392b798317f63a8910c174c55fd2c633e659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e": "0x04e659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e000064a7b3b6e00d000000000000000000000000000000000000000000000000", - "0x7cda3cfa86b349fdafce4979b197118f71cd3068e6118bfb392b798317f63a893e73123ebcdee9161cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c": "0x041cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c000064a7b3b6e00d000000000000000000000000000000000000000000000000", - "0x7cda3cfa86b349fdafce4979b197118f71cd3068e6118bfb392b798317f63a894f58b588ac077bd5306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20": "0x04306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20000064a7b3b6e00d000000000000000000000000000000000000000000000000", - "0x7cda3cfa86b349fdafce4979b197118f71cd3068e6118bfb392b798317f63a89518366b5b1bc7c99d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d": "0x04d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d000064a7b3b6e00d000000000000000000000000000000000000000000000000", - "0x7cda3cfa86b349fdafce4979b197118f71cd3068e6118bfb392b798317f63a89a647e755c30521d38eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48": "0x048eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48000064a7b3b6e00d000000000000000000000000000000000000000000000000", - "0x7cda3cfa86b349fdafce4979b197118f71cd3068e6118bfb392b798317f63a89dd4e3f25f5378a6d90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22": "0x0490b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22000064a7b3b6e00d000000000000000000000000000000000000000000000000", - "0x7cda3cfa86b349fdafce4979b197118fba7fb8745735dc3be2a2c61a72c39e78": "0x181cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c000064a7b3b6e00d000000000000000000000000000000000000000000000000306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20000064a7b3b6e00d0000000000000000000000000000000000000000000000008eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48000064a7b3b6e00d00000000000000000000000000000000000000000000000090b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22000064a7b3b6e00d000000000000000000000000000000000000000000000000d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d000064a7b3b6e00d000000000000000000000000000000000000000000000000e659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e000064a7b3b6e00d000000000000000000000000000000000000000000000000", - "0x89d139e01a5eb2256f222e5fc5dbe6b34e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x913b40454eb582a66ab74c86f6137db94e7b9012096b41c4eb3aaf947f6ea429": "0x0400", - "0xa0eb495036d368196a2b6c51d9d788814e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xa2ce73642c549ae79c14f0a671cf45f94e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xa37f719efab16103103a0c8c2c784ce14e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xa42f90c8b47838c3a5332d85ee9aa5c34e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0xa8c65209d47ee80f56b0011e8fd91f504e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xaebd463ed9925c488c112434d61debc04e7b9012096b41c4eb3aaf947f6ea429": "0x0400", - "0xaebd463ed9925c488c112434d61debc0ba7fb8745735dc3be2a2c61a72c39e78": "0x18d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a4890b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20e659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e1cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c", - "0xbd2a529379475088d3e29a918cd478724e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xc2261276cc9d1f8598ea4b6a74b15c2f218f26c73add634897550b4003b26bc632a5935f6edc617ae178fef9eb1e211fbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0x047374616b696e6720000064a7b3b6e00d000000000000000002", - "0xc2261276cc9d1f8598ea4b6a74b15c2f218f26c73add634897550b4003b26bc66f2e33376834a63c86a195bcf685aebbfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0x047374616b696e6720000064a7b3b6e00d000000000000000002", - "0xc2261276cc9d1f8598ea4b6a74b15c2f308ce9615de0775a82f8a94dc3d285a1": "0x01", - "0xc2261276cc9d1f8598ea4b6a74b15c2f4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xc2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80": "0x0040fa7f398074858a02000000000000", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb30e5be00fbc2e15b5fe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e": "0xd17c2d7823ebf260fd138f2d7e27d114c0145d968b5ff5006125f2414fadae698eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48", - "0xcec5070d609dd3497f72bde07fc96ba04c014e6bf8b8c2c011e7290b85696bb3e535263148daaf49be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f": "0x88dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0eed43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d", - "0xcec5070d609dd3497f72bde07fc96ba04e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19500e3a507571a62417696d6f6e808eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48": "0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19505905fe216cc5924c6772616e80d17c2d7823ebf260fd138f2d7e27d114c0145d968b5ff5006125f2414fadae69": "0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa195066b8d48da86b869b6261626580d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d": "0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa19509d4a4cfe1c2ef0b961756469808eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48": "0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950c9b0c13125732d276175646980d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d": "0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950d62c40514b41f31962616265808eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48": "0xfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950ed43a85541921049696d6f6e80d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d": "0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f", - "0xcec5070d609dd3497f72bde07fc96ba0726380404683fc89e8233450c8aa1950f5537bdb2a1f626b6772616e8088dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0ee": "0xbe5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f", - "0xcec5070d609dd3497f72bde07fc96ba088dcde934c658227ee1dfafcd6e16903": "0x08be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25ffe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860e", - "0xcec5070d609dd3497f72bde07fc96ba0e0cdd062e6eaf24295ad4ccfc41d4609": "0x08be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f88dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0eed43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27dfe65717dad0447d715f660a0a58411de509b42e6efb8375f562f58a554d5860ed17c2d7823ebf260fd138f2d7e27d114c0145d968b5ff5006125f2414fadae698eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a488eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48", - "0xd57bce545fb382c34570e5dfbf338f5e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xd5c41b52a371aa36c9254ce34324f2a54e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xd5e1a2fa16732ce6906189438c0a82c64e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xd8f314b7f4e6b095f0f8ee4656a448254e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0xed25f63942de25ac5253ba64b5eb64d14e7b9012096b41c4eb3aaf947f6ea429": "0x0400", - "0xed25f63942de25ac5253ba64b5eb64d1ba7fb8745735dc3be2a2c61a72c39e78": "0x18d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a4890b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22306721211d5404bd9da88e0204360a1a9ab8b87c66c1bc2fcdd37f3c2222cc20e659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e1cbd2d43530a44705ad088af313e18f80b53ef16b36177cd4b77b846f2a5f07c", - "0xede8e4fdc3c8b556f0ce2f77fc2575e34e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0xedfb05b766f199ce00df85317e33050e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xf0c365c3cf59d671eb72da0e7a4113c44e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xf2794c22e353e9a839f12faab03a911b4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0xf2794c22e353e9a839f12faab03a911b7f17cdfbfa73331856cca0acddd7842e": "0x00000000", - "0xf2794c22e353e9a839f12faab03a911bbdcb0c5143a8617ed38ae3810dd45bc6": "0x00000000", - "0xf2794c22e353e9a839f12faab03a911be2f6cb0456905c189bcb0458f9440f13": "0x00000000", - "0xf5a4963e4efb097983d7a693b0c1ee454e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0xfbc9f53700f75f681f234e70fb7241eb4e7b9012096b41c4eb3aaf947f6ea429": "0x0000" - }, - "childrenDefault": {} - } - } -} \ No newline at end of file diff --git a/substrate/zombienet/0003-block-building-warp-sync/chain-spec.json b/substrate/zombienet/0003-block-building-warp-sync/chain-spec.json new file mode 120000 index 00000000000..a7964c0cf14 --- /dev/null +++ b/substrate/zombienet/0003-block-building-warp-sync/chain-spec.json @@ -0,0 +1 @@ +../0001-basic-warp-sync/chain-spec.json \ No newline at end of file diff --git a/substrate/zombienet/0003-block-building-warp-sync/test-block-building-warp-sync.toml b/substrate/zombienet/0003-block-building-warp-sync/test-block-building-warp-sync.toml index 7fe9b0f065d..2b29a42e423 100644 --- a/substrate/zombienet/0003-block-building-warp-sync/test-block-building-warp-sync.toml +++ b/substrate/zombienet/0003-block-building-warp-sync/test-block-building-warp-sync.toml @@ -5,24 +5,24 @@ enable_tracing = false default_image = "{{ZOMBIENET_INTEGRATION_TEST_IMAGE}}" default_command = "substrate" -chain = "gen-db" +chain = "local" chain_spec_path = "chain-spec.json" #we need at least 3 nodes for warp sync [[relaychain.nodes]] name = "alice" validator = true - db_snapshot="https://storage.googleapis.com/zombienet-db-snaps/substrate/0001-basic-warp-sync/chains-a233bbacff650aac6bcb56b4e4ef7db7dc143cfb.tgz" + db_snapshot="{{DB_SNAPSHOT}}" [[relaychain.nodes]] name = "bob" validator = true - db_snapshot="https://storage.googleapis.com/zombienet-db-snaps/substrate/0001-basic-warp-sync/chains-a233bbacff650aac6bcb56b4e4ef7db7dc143cfb.tgz" + db_snapshot="{{DB_SNAPSHOT}}" [[relaychain.nodes]] name = "charlie" validator = false - db_snapshot="https://storage.googleapis.com/zombienet-db-snaps/substrate/0001-basic-warp-sync/chains-a233bbacff650aac6bcb56b4e4ef7db7dc143cfb.tgz" + db_snapshot="{{DB_SNAPSHOT}}" [[relaychain.nodes]] name = "dave" diff --git a/substrate/zombienet/0003-block-building-warp-sync/test-block-building-warp-sync.zndsl b/substrate/zombienet/0003-block-building-warp-sync/test-block-building-warp-sync.zndsl index a4ba46017a3..1d8650b5d69 100644 --- a/substrate/zombienet/0003-block-building-warp-sync/test-block-building-warp-sync.zndsl +++ b/substrate/zombienet/0003-block-building-warp-sync/test-block-building-warp-sync.zndsl @@ -13,18 +13,24 @@ charlie: reports peers count is at least 3 within 60 seconds dave: reports peers count is at least 3 within 60 seconds -# db snapshot has 12133 blocks -dave: reports block height is at least 1 within 60 seconds -dave: reports block height is at least 12132 within 60 seconds -dave: reports block height is at least 12133 within 60 seconds +# db snapshot has {{DB_BLOCK_HEIGHT}} blocks +alice: reports block height is at least {{DB_BLOCK_HEIGHT}} within 60 seconds +bob: reports block height is at least {{DB_BLOCK_HEIGHT}} within 60 seconds +charlie: reports block height is at least {{DB_BLOCK_HEIGHT}} within 60 seconds + +alice: reports block height is greater than {{DB_BLOCK_HEIGHT}} within 60 seconds +bob: reports block height is greater than {{DB_BLOCK_HEIGHT}} within 60 seconds +charlie: reports block height is greater than {{DB_BLOCK_HEIGHT}} within 60 seconds -alice: reports block height is at least 12133 within 60 seconds -bob: reports block height is at least 12133 within 60 seconds -charlie: reports block height is at least 12133 within 60 seconds +dave: reports block height is at least 1 within 60 seconds +dave: reports block height is at least {{DB_BLOCK_HEIGHT}} within 60 seconds +dave: reports block height is greater than {{DB_BLOCK_HEIGHT}} within 60 seconds dave: log line matches "Warp sync is complete" within 60 seconds -# workaround for: https://github.com/paritytech/zombienet/issues/580 -dave: count of log lines containing "Block history download is complete" is 1 within 10 seconds +dave: log line matches "Block history download is complete" within 10 seconds + +dave: reports substrate_beefy_best_block is at least {{DB_BLOCK_HEIGHT}} within 180 seconds +dave: reports substrate_beefy_best_block is greater than {{DB_BLOCK_HEIGHT}} within 60 seconds dave: count of log lines containing "error" is 0 within 10 seconds dave: count of log lines containing "verification failed" is 0 within 10 seconds -- GitLab From fc749fa7a0d45c74e2e575dc39ec16418efed902 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anton=20Vilhelm=20=C3=81sgeirsson?= Date: Thu, 11 Jan 2024 11:44:09 +0000 Subject: [PATCH 149/191] Fix coretime migration (#2905) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The XCM instruction limit of 100 was being hit by the 1 large message before. The weight ref time also needed to be bumped for these extrinsics. --------- Co-authored-by: Bastian Köcher --- .../parachains/src/coretime/migration.rs | 44 +++++++++++-------- .../runtime/parachains/src/coretime/mod.rs | 2 +- 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/polkadot/runtime/parachains/src/coretime/migration.rs b/polkadot/runtime/parachains/src/coretime/migration.rs index 64c10f73198..c720cf0617a 100644 --- a/polkadot/runtime/parachains/src/coretime/migration.rs +++ b/polkadot/runtime/parachains/src/coretime/migration.rs @@ -142,8 +142,8 @@ mod v_coretime { let new_core_count = assigner_coretime::Pallet::::session_core_count(); ensure!(new_core_count == prev_core_count, "Total number of cores need to not change."); ensure!( - dmp_queue_size == prev_dmp_queue_size + 1, - "There should have been enqueued one DMP message." + dmp_queue_size > prev_dmp_queue_size, + "There should have been enqueued at least one DMP messages." ); Ok(()) @@ -264,22 +264,30 @@ mod v_coretime { let message_content = iter::once(Instruction::UnpaidExecution { weight_limit: WeightLimit::Unlimited, check_origin: None, - }) - .chain(reservations) - .chain(pool) - .chain(leases) - .chain(set_core_count) - .collect(); - - let message = Xcm(message_content); - - send_xcm::( - MultiLocation { - parents: 0, - interior: Junctions::X1(Junction::Parachain(T::BrokerId::get())), - }, - message, - )?; + }); + + let reservation_content = message_content.clone().chain(reservations).collect(); + let pool_content = message_content.clone().chain(pool).collect(); + let leases_content = message_content.clone().chain(leases).collect(); + let set_core_count_content = message_content.clone().chain(set_core_count).collect(); + + let messages = vec![ + Xcm(reservation_content), + Xcm(pool_content), + Xcm(leases_content), + Xcm(set_core_count_content), + ]; + + for message in messages { + send_xcm::( + MultiLocation { + parents: 0, + interior: Junctions::X1(Junction::Parachain(T::BrokerId::get())), + }, + message, + )?; + } + Ok(()) } } diff --git a/polkadot/runtime/parachains/src/coretime/mod.rs b/polkadot/runtime/parachains/src/coretime/mod.rs index 60bd8f81193..aa074a293c9 100644 --- a/polkadot/runtime/parachains/src/coretime/mod.rs +++ b/polkadot/runtime/parachains/src/coretime/mod.rs @@ -252,7 +252,7 @@ fn mk_coretime_call(call: crate::coretime::CoretimeCalls) -> Instruction<()> { origin_kind: OriginKind::Superuser, // Largest call is set_lease with 1526 byte: // Longest call is reserve() with 31_000_000 - require_weight_at_most: Weight::from_parts(110_000_000, 20_000), + require_weight_at_most: Weight::from_parts(170_000_000, 20_000), call: BrokerRuntimePallets::Broker(call).encode().into(), } } -- GitLab From 2bdf5dca67a914bfaa6a10a51a5ec85afd3e3c0b Mon Sep 17 00:00:00 2001 From: Alexander Samusev <41779041+alvicsam@users.noreply.github.com> Date: Thu, 11 Jan 2024 12:30:17 +0100 Subject: [PATCH 150/191] [ci] Remove unused jobs (#2502) PR custom review is deprecated. Now `review-bot` performs these functions. PR removes unused ci jobs and adjusts zombienet jobs for merge queues cc @Bullrich --- .github/workflows/review-trigger.yml | 1 - .gitlab-ci.yml | 10 ------- .gitlab/pipeline/publish.yml | 3 +- .gitlab/pipeline/test.yml | 38 ------------------------ .gitlab/pipeline/zombienet/cumulus.yml | 8 +++-- .gitlab/pipeline/zombienet/polkadot.yml | 14 ++++++++- .gitlab/pipeline/zombienet/substrate.yml | 5 +++- 7 files changed, 24 insertions(+), 55 deletions(-) diff --git a/.github/workflows/review-trigger.yml b/.github/workflows/review-trigger.yml index e5fcb434fd3..8b23dd30bb2 100644 --- a/.github/workflows/review-trigger.yml +++ b/.github/workflows/review-trigger.yml @@ -10,7 +10,6 @@ on: - review_request_removed - ready_for_review pull_request_review: - merge_group: jobs: trigger-review-bot: diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index dc4b3cf162e..5e01feb8479 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -275,16 +275,6 @@ cancel-pipeline-test-linux-stable3: needs: - job: "test-linux-stable 3/3" -cancel-pipeline-test-linux-stable-additional-tests: - extends: .cancel-pipeline-template - needs: - - job: "test-linux-stable-additional-tests" - -cancel-pipeline-test-linux-stable-slow: - extends: .cancel-pipeline-template - needs: - - job: "test-linux-stable-slow" - cancel-pipeline-cargo-check-benches1: extends: .cancel-pipeline-template needs: diff --git a/.gitlab/pipeline/publish.yml b/.gitlab/pipeline/publish.yml index 92ebc9eea1f..3b77f5363f6 100644 --- a/.gitlab/pipeline/publish.yml +++ b/.gitlab/pipeline/publish.yml @@ -71,8 +71,7 @@ publish-rustdoc: IMAGE_NAME: "" # docker.io/paritypr/image_name script: # Dockertag should differ in a merge queue - # TODO: test this - # - if [[ $CI_COMMIT_REF_NAME == *"gh-readonly-queue"* ]]; export DOCKER_IMAGES_VERSION="${CI_COMMIT_SHORT_SHA}"; fi + - if [[ $CI_COMMIT_REF_NAME == *"gh-readonly-queue"* ]]; then export DOCKER_IMAGES_VERSION="${CI_COMMIT_SHORT_SHA}"; fi - $BUILDAH_COMMAND build --format=docker --build-arg VCS_REF="${CI_COMMIT_SHA}" diff --git a/.gitlab/pipeline/test.yml b/.gitlab/pipeline/test.yml index 00d2b22c810..e75700ffddc 100644 --- a/.gitlab/pipeline/test.yml +++ b/.gitlab/pipeline/test.yml @@ -96,44 +96,6 @@ test-linux-stable-runtime-benchmarks: # --partition count:${CI_NODE_INDEX}/${CI_NODE_TOTAL} # # todo: add flacky-test collector -# TODO: remove me -test-linux-stable-additional-tests: - stage: test - extends: - - .docker-env - - .common-refs - - .run-immediately - - .pipeline-stopper-artifacts - variables: - RUST_TOOLCHAIN: stable - # Enable debug assertions since we are running optimized builds for testing - # but still want to have debug assertions. - RUSTFLAGS: "-Cdebug-assertions=y -Dwarnings" - script: - # tests were moved to test-linux-stable - # the jobs should be removed - - exit 0 - -# TODO: remove me -test-linux-stable-slow: - stage: test - # remove after cache is setup - timeout: 2h - extends: - - .docker-env - - .common-refs - - .run-immediately - - .pipeline-stopper-artifacts - variables: - RUST_TOOLCHAIN: stable - # Enable debug assertions since we are running optimized builds for testing - # but still want to have debug assertions. - RUSTFLAGS: "-Cdebug-assertions=y -Dwarnings" - script: - # tests were moved to test-linux-stable - # the jobs should be removed - - exit 0 - # takes about 1,5h without cache # can be used to check that nextest works correctly # test-linux-stable-polkadot: diff --git a/.gitlab/pipeline/zombienet/cumulus.yml b/.gitlab/pipeline/zombienet/cumulus.yml index 409c0aba68e..c473f5c5fed 100644 --- a/.gitlab/pipeline/zombienet/cumulus.yml +++ b/.gitlab/pipeline/zombienet/cumulus.yml @@ -5,6 +5,10 @@ before_script: # Exit if the job is not merge queue # - if [[ $CI_COMMIT_REF_NAME != *"gh-readonly-queue"* ]]; then echo "I will run only in a merge queue"; exit 0; fi + # Docker images have different tag in merge queues + - if [[ $CI_COMMIT_REF_NAME == *"gh-readonly-queue"* ]]; then export DOCKER_IMAGES_VERSION="${CI_COMMIT_SHORT_SHA}"; fi + - export POLKADOT_IMAGE="docker.io/paritypr/polkadot-debug:${DOCKER_IMAGES_VERSION}" + - export COL_IMAGE="docker.io/paritypr/test-parachain:${DOCKER_IMAGES_VERSION}" - echo "Zombie-net Tests Config" - echo "${ZOMBIENET_IMAGE}" - echo "${POLKADOT_IMAGE}" @@ -30,10 +34,10 @@ - job: build-push-image-polkadot-debug artifacts: true variables: - POLKADOT_IMAGE: "docker.io/paritypr/polkadot-debug:${DOCKER_IMAGES_VERSION}" + # POLKADOT_IMAGE: "docker.io/paritypr/polkadot-debug:${DOCKER_IMAGES_VERSION}" GH_DIR: "https://github.com/paritytech/cumulus/tree/${CI_COMMIT_SHORT_SHA}/zombienet/tests" LOCAL_DIR: "/builds/parity/mirrors/polkadot-sdk/cumulus/zombienet/tests" - COL_IMAGE: "docker.io/paritypr/test-parachain:${DOCKER_IMAGES_VERSION}" + # COL_IMAGE: "docker.io/paritypr/test-parachain:${DOCKER_IMAGES_VERSION}" FF_DISABLE_UMASK_FOR_DOCKER_EXECUTOR: 1 RUN_IN_CONTAINER: "1" artifacts: diff --git a/.gitlab/pipeline/zombienet/polkadot.yml b/.gitlab/pipeline/zombienet/polkadot.yml index 4112096a2ed..7f5d424ec1b 100644 --- a/.gitlab/pipeline/zombienet/polkadot.yml +++ b/.gitlab/pipeline/zombienet/polkadot.yml @@ -6,6 +6,9 @@ before_script: # Exit if the job is not merge queue # - if [[ $CI_COMMIT_REF_NAME != *"gh-readonly-queue"* ]]; then echo "I will run only in a merge queue"; exit 0; fi + # Docker images have different tag in merge queues + - if [[ $CI_COMMIT_REF_NAME == *"gh-readonly-queue"* ]]; then export DOCKER_IMAGES_VERSION="${CI_COMMIT_SHORT_SHA}"; fi + - export PIPELINE_IMAGE_TAG=${DOCKER_IMAGES_VERSION} - export BUILD_RELEASE_VERSION="$(cat ./artifacts/BUILD_RELEASE_VERSION)" # from build-linux-stable job - export DEBUG=zombie,zombie::network-node - export ZOMBIENET_INTEGRATION_TEST_IMAGE="${POLKADOT_IMAGE}":${PIPELINE_IMAGE_TAG} @@ -46,7 +49,7 @@ - .kubernetes-env - .zombienet-refs variables: - PIPELINE_IMAGE_TAG: ${DOCKER_IMAGES_VERSION} + # PIPELINE_IMAGE_TAG: ${DOCKER_IMAGES_VERSION} POLKADOT_IMAGE: "docker.io/paritypr/polkadot-debug" COLANDER_IMAGE: "docker.io/paritypr/colander" MALUS_IMAGE: "docker.io/paritypr/malus" @@ -153,6 +156,9 @@ zombienet-polkadot-smoke-0001-parachains-smoke-test: before_script: # Exit if the job is not merge queue # - if [[ $CI_COMMIT_REF_NAME != *"gh-readonly-queue"* ]]; then echo "I will run only in a merge queue"; exit 0; fi + # Docker images have different tag in merge queues + - if [[ $CI_COMMIT_REF_NAME == *"gh-readonly-queue"* ]]; then export DOCKER_IMAGES_VERSION="${CI_COMMIT_SHORT_SHA}"; fi + - export PIPELINE_IMAGE_TAG=${DOCKER_IMAGES_VERSION} - export ZOMBIENET_INTEGRATION_TEST_IMAGE="${POLKADOT_IMAGE}":${PIPELINE_IMAGE_TAG} - export COL_IMAGE="${COLANDER_IMAGE}":${PIPELINE_IMAGE_TAG} - echo "Zombienet Tests Config" @@ -172,6 +178,9 @@ zombienet-polkadot-smoke-0002-parachains-parachains-upgrade-smoke: before_script: # Exit if the job is not merge queue # - if [[ $CI_COMMIT_REF_NAME != *"gh-readonly-queue"* ]]; then echo "I will run only in a merge queue"; exit 0; fi + # Docker images have different tag in merge queues + - if [[ $CI_COMMIT_REF_NAME == *"gh-readonly-queue"* ]]; then export DOCKER_IMAGES_VERSION="${CI_COMMIT_SHORT_SHA}"; fi + - export PIPELINE_IMAGE_TAG=${DOCKER_IMAGES_VERSION} - export ZOMBIENET_INTEGRATION_TEST_IMAGE="${POLKADOT_IMAGE}":${PIPELINE_IMAGE_TAG} - export CUMULUS_IMAGE="docker.io/paritypr/polkadot-parachain-debug:${DOCKER_IMAGES_VERSION}" - echo "Zombienet Tests Config" @@ -224,6 +233,9 @@ zombienet-polkadot-misc-0002-upgrade-node: before_script: # Exit if the job is not merge queue # - if [[ $CI_COMMIT_REF_NAME != *"gh-readonly-queue"* ]]; then echo "I will run only in a merge queue"; exit 0; fi + # Docker images have different tag in merge queues + - if [[ $CI_COMMIT_REF_NAME == *"gh-readonly-queue"* ]]; then export DOCKER_IMAGES_VERSION="${CI_COMMIT_SHORT_SHA}"; fi + - export PIPELINE_IMAGE_TAG=${DOCKER_IMAGES_VERSION} - export ZOMBIENET_INTEGRATION_TEST_IMAGE="docker.io/parity/polkadot:latest" - echo "Overrided polkadot image ${ZOMBIENET_INTEGRATION_TEST_IMAGE}" - export COL_IMAGE="${COLANDER_IMAGE}":${PIPELINE_IMAGE_TAG} diff --git a/.gitlab/pipeline/zombienet/substrate.yml b/.gitlab/pipeline/zombienet/substrate.yml index ca4daa01871..23630fcc6c0 100644 --- a/.gitlab/pipeline/zombienet/substrate.yml +++ b/.gitlab/pipeline/zombienet/substrate.yml @@ -6,6 +6,9 @@ before_script: # Exit if the job is not merge queue # - if [[ $CI_COMMIT_REF_NAME != *"gh-readonly-queue"* ]]; then echo "I will run only in a merge queue"; exit 0; fi + # Docker images have different tag in merge queues + - if [[ $CI_COMMIT_REF_NAME == *"gh-readonly-queue"* ]]; then export DOCKER_IMAGES_VERSION="${CI_COMMIT_SHORT_SHA}"; fi + - export SUBSTRATE_IMAGE_TAG=${DOCKER_IMAGES_VERSION} - echo "Zombienet Tests Config" - echo "${ZOMBIENET_IMAGE}" - echo "${GH_DIR}" @@ -21,7 +24,7 @@ - .kubernetes-env - .zombienet-refs variables: - SUBSTRATE_IMAGE_TAG: ${DOCKER_IMAGES_VERSION} + # SUBSTRATE_IMAGE_TAG: ${DOCKER_IMAGES_VERSION} SUBSTRATE_IMAGE: "docker.io/paritypr/substrate" GH_DIR: "https://github.com/paritytech/substrate/tree/${CI_COMMIT_SHA}/zombienet" LOCAL_DIR: "/builds/parity/mirrors/polkadot-sdk/substrate/zombienet" -- GitLab From f270b08a486d8e4ec85434ce13a060408d66e761 Mon Sep 17 00:00:00 2001 From: Nazar Mokrynskyi Date: Thu, 11 Jan 2024 13:41:59 +0200 Subject: [PATCH 151/191] Move Cors data structure into reachable place (#2898) Trivial refactoring, fixes https://github.com/paritytech/polkadot-sdk/issues/2885 --- substrate/client/cli/src/arg_enums.rs | 45 ++++++++++++++++++++ substrate/client/cli/src/commands/run_cmd.rs | 45 +------------------- 2 files changed, 47 insertions(+), 43 deletions(-) diff --git a/substrate/client/cli/src/arg_enums.rs b/substrate/client/cli/src/arg_enums.rs index d4a4b7cfdf6..d436673cb9d 100644 --- a/substrate/client/cli/src/arg_enums.rs +++ b/substrate/client/cli/src/arg_enums.rs @@ -19,6 +19,7 @@ //! Definitions of [`ValueEnum`] types. use clap::ValueEnum; +use std::str::FromStr; /// The instantiation strategy to use in compiled mode. #[derive(Debug, Clone, Copy, ValueEnum)] @@ -177,6 +178,50 @@ impl Into for RpcMethods { } } +/// CORS setting +/// +/// The type is introduced to overcome `Option>` handling of `clap`. +#[derive(Clone, Debug)] +pub enum Cors { + /// All hosts allowed. + All, + /// Only hosts on the list are allowed. + List(Vec), +} + +impl From for Option> { + fn from(cors: Cors) -> Self { + match cors { + Cors::All => None, + Cors::List(list) => Some(list), + } + } +} + +impl FromStr for Cors { + type Err = crate::Error; + + fn from_str(s: &str) -> Result { + let mut is_all = false; + let mut origins = Vec::new(); + for part in s.split(',') { + match part { + "all" | "*" => { + is_all = true; + break + }, + other => origins.push(other.to_owned()), + } + } + + if is_all { + Ok(Cors::All) + } else { + Ok(Cors::List(origins)) + } + } +} + /// Database backend #[derive(Debug, Clone, PartialEq, Copy, clap::ValueEnum)] #[value(rename_all = "lower")] diff --git a/substrate/client/cli/src/commands/run_cmd.rs b/substrate/client/cli/src/commands/run_cmd.rs index bc62dc3324e..4ac10a03cd4 100644 --- a/substrate/client/cli/src/commands/run_cmd.rs +++ b/substrate/client/cli/src/commands/run_cmd.rs @@ -17,7 +17,7 @@ // along with this program. If not, see . use crate::{ - arg_enums::RpcMethods, + arg_enums::{Cors, RpcMethods}, error::{Error, Result}, params::{ ImportParams, KeystoreParams, NetworkParams, OffchainWorkerParams, SharedParams, @@ -108,7 +108,7 @@ pub struct RunCmd { /// value). Value of `all` will disable origin validation. Default is to /// allow localhost and origins. When running in /// `--dev` mode the default is to allow all origins. - #[arg(long, value_name = "ORIGINS", value_parser = parse_cors)] + #[arg(long, value_name = "ORIGINS")] pub rpc_cors: Option, /// The human-readable name for this node. @@ -470,47 +470,6 @@ fn rpc_interface( } } -/// CORS setting -/// -/// The type is introduced to overcome `Option>` handling of `clap`. -#[derive(Clone, Debug)] -pub enum Cors { - /// All hosts allowed. - All, - /// Only hosts on the list are allowed. - List(Vec), -} - -impl From for Option> { - fn from(cors: Cors) -> Self { - match cors { - Cors::All => None, - Cors::List(list) => Some(list), - } - } -} - -/// Parse cors origins. -fn parse_cors(s: &str) -> Result { - let mut is_all = false; - let mut origins = Vec::new(); - for part in s.split(',') { - match part { - "all" | "*" => { - is_all = true; - break - }, - other => origins.push(other.to_owned()), - } - } - - if is_all { - Ok(Cors::All) - } else { - Ok(Cors::List(origins)) - } -} - #[cfg(test)] mod tests { use super::*; -- GitLab From c93f5aba8ad19f6b9ebc45714ad4fc61d1a3eae2 Mon Sep 17 00:00:00 2001 From: Sebastian Kunert Date: Thu, 11 Jan 2024 17:44:03 +0100 Subject: [PATCH 152/191] Cumulus test service cleanup (#2887) closes #2567 Followup for https://github.com/paritytech/polkadot-sdk/pull/2331 This PR contains multiple internal cleanups: 1. This gets rid of the functionality in `generate_genesis_block` which was only used in one benchmark 2. Fixed `transaction_pool` and `transaction_throughput` benchmarks failing since they require a tokio runtime now. 3. Removed `parachain_id` CLI option from the test parachain 4. Removed `expect` call from `RuntimeResolver` --- cumulus/client/cli/src/lib.rs | 36 ++++++---- cumulus/polkadot-parachain/src/command.rs | 32 ++++----- .../service/benches/transaction_throughput.rs | 26 +++---- cumulus/test/service/src/cli.rs | 8 +-- cumulus/test/service/src/genesis.rs | 69 ------------------- cumulus/test/service/src/lib.rs | 10 ++- cumulus/test/service/src/main.rs | 18 ++--- .../bin/node/cli/benches/transaction_pool.rs | 6 +- 8 files changed, 70 insertions(+), 135 deletions(-) delete mode 100644 cumulus/test/service/src/genesis.rs diff --git a/cumulus/client/cli/src/lib.rs b/cumulus/client/cli/src/lib.rs index 1cebecb0043..1807b8a1718 100644 --- a/cumulus/client/cli/src/lib.rs +++ b/cumulus/client/cli/src/lib.rs @@ -127,6 +127,27 @@ impl sc_cli::CliConfiguration for PurgeChainCmd { } } +/// Get the SCALE encoded genesis header of the parachain. +pub fn get_raw_genesis_header(client: Arc) -> sc_cli::Result> +where + B: BlockT, + C: HeaderBackend + 'static, +{ + let genesis_hash = + client + .hash(Zero::zero())? + .ok_or(sc_cli::Error::Client(sp_blockchain::Error::Backend( + "Failed to lookup genesis block hash when exporting genesis head data.".into(), + )))?; + let genesis_header = client.header(genesis_hash)?.ok_or(sc_cli::Error::Client( + sp_blockchain::Error::Backend( + "Failed to lookup genesis header by hash when exporting genesis head data.".into(), + ), + ))?; + + Ok(genesis_header.encode()) +} + /// Command for exporting the genesis head data of the parachain #[derive(Debug, clap::Parser)] pub struct ExportGenesisHeadCommand { @@ -150,22 +171,11 @@ impl ExportGenesisHeadCommand { B: BlockT, C: HeaderBackend + 'static, { - let genesis_hash = client.hash(Zero::zero())?.ok_or(sc_cli::Error::Client( - sp_blockchain::Error::Backend( - "Failed to lookup genesis block hash when exporting genesis head data.".into(), - ), - ))?; - let genesis_header = client.header(genesis_hash)?.ok_or(sc_cli::Error::Client( - sp_blockchain::Error::Backend( - "Failed to lookup genesis header by hash when exporting genesis head data.".into(), - ), - ))?; - - let raw_header = genesis_header.encode(); + let raw_header = get_raw_genesis_header(client)?; let output_buf = if self.raw { raw_header } else { - format!("0x{:?}", HexDisplay::from(&genesis_header.encode())).into_bytes() + format!("0x{:?}", HexDisplay::from(&raw_header)).into_bytes() }; if let Some(output) = &self.output { diff --git a/cumulus/polkadot-parachain/src/command.rs b/cumulus/polkadot-parachain/src/command.rs index 516bdb76852..04d618f66c7 100644 --- a/cumulus/polkadot-parachain/src/command.rs +++ b/cumulus/polkadot-parachain/src/command.rs @@ -60,29 +60,29 @@ enum Runtime { } trait RuntimeResolver { - fn runtime(&self) -> Runtime; + fn runtime(&self) -> Result; } impl RuntimeResolver for dyn ChainSpec { - fn runtime(&self) -> Runtime { - runtime(self.id()) + fn runtime(&self) -> Result { + Ok(runtime(self.id())) } } /// Implementation, that can resolve [`Runtime`] from any json configuration file impl RuntimeResolver for PathBuf { - fn runtime(&self) -> Runtime { + fn runtime(&self) -> Result { #[derive(Debug, serde::Deserialize)] struct EmptyChainSpecWithId { id: String, } - let file = std::fs::File::open(self).expect("Failed to open file"); + let file = std::fs::File::open(self)?; let reader = std::io::BufReader::new(file); - let chain_spec: EmptyChainSpecWithId = serde_json::from_reader(reader) - .expect("Failed to read 'json' file with ChainSpec configuration"); + let chain_spec: EmptyChainSpecWithId = + serde_json::from_reader(reader).map_err(|e| sc_cli::Error::Application(Box::new(e)))?; - runtime(&chain_spec.id) + Ok(runtime(&chain_spec.id)) } } @@ -394,7 +394,7 @@ impl SubstrateCli for RelayChainCli { /// Creates partial components for the runtimes that are supported by the benchmarks. macro_rules! construct_partials { ($config:expr, |$partials:ident| $code:expr) => { - match $config.chain_spec.runtime() { + match $config.chain_spec.runtime()? { Runtime::AssetHubPolkadot => { let $partials = new_partial::( &$config, @@ -444,7 +444,7 @@ macro_rules! construct_partials { macro_rules! construct_async_run { (|$components:ident, $cli:ident, $cmd:ident, $config:ident| $( $code:tt )* ) => {{ let runner = $cli.create_runner($cmd)?; - match runner.config().chain_spec.runtime() { + match runner.config().chain_spec.runtime()? { Runtime::AssetHubPolkadot => { runner.async_run(|$config| { let $components = new_partial::( @@ -686,7 +686,7 @@ pub fn run() -> Result<()> { info!("Parachain Account: {}", parachain_account); info!("Is collating: {}", if config.role.is_authority() { "yes" } else { "no" }); - match config.chain_spec.runtime() { + match config.chain_spec.runtime()? { AssetHubPolkadot => crate::service::start_asset_hub_node::< AssetHubPolkadotRuntimeApi, AssetHubPolkadotAuraId, @@ -1032,30 +1032,30 @@ mod tests { &temp_dir, Box::new(create_default_with_extensions("shell-1", Extensions1::default())), ); - assert_eq!(Runtime::Shell, path.runtime()); + assert_eq!(Runtime::Shell, path.runtime().unwrap()); let path = store_configuration( &temp_dir, Box::new(create_default_with_extensions("shell-2", Extensions2::default())), ); - assert_eq!(Runtime::Shell, path.runtime()); + assert_eq!(Runtime::Shell, path.runtime().unwrap()); let path = store_configuration( &temp_dir, Box::new(create_default_with_extensions("seedling", Extensions2::default())), ); - assert_eq!(Runtime::Seedling, path.runtime()); + assert_eq!(Runtime::Seedling, path.runtime().unwrap()); let path = store_configuration( &temp_dir, Box::new(crate::chain_spec::rococo_parachain::rococo_parachain_local_config()), ); - assert_eq!(Runtime::Default, path.runtime()); + assert_eq!(Runtime::Default, path.runtime().unwrap()); let path = store_configuration( &temp_dir, Box::new(crate::chain_spec::contracts::contracts_rococo_local_config()), ); - assert_eq!(Runtime::ContractsRococo, path.runtime()); + assert_eq!(Runtime::ContractsRococo, path.runtime().unwrap()); } } diff --git a/cumulus/test/service/benches/transaction_throughput.rs b/cumulus/test/service/benches/transaction_throughput.rs index 81ecc84db7b..011eb4c7d50 100644 --- a/cumulus/test/service/benches/transaction_throughput.rs +++ b/cumulus/test/service/benches/transaction_throughput.rs @@ -17,6 +17,7 @@ // along with this program. If not, see . use criterion::{criterion_group, criterion_main, BatchSize, Criterion, Throughput}; +use cumulus_client_cli::get_raw_genesis_header; use cumulus_test_runtime::{AccountId, BalancesCall, ExistentialDeposit, SudoCall}; use futures::{future, StreamExt}; use sc_transaction_pool_api::{TransactionPool as _, TransactionSource, TransactionStatus}; @@ -24,9 +25,8 @@ use sp_core::{crypto::Pair, sr25519}; use sp_runtime::OpaqueExtrinsic; use cumulus_primitives_core::ParaId; -use cumulus_test_service::{ - construct_extrinsic, fetch_nonce, initial_head_data, Client, Keyring::*, TransactionPool, -}; +use cumulus_test_service::{construct_extrinsic, fetch_nonce, Client, Keyring::*, TransactionPool}; +use polkadot_primitives::HeadData; fn create_accounts(num: usize) -> Vec { (0..num) @@ -159,6 +159,13 @@ fn transaction_throughput_benchmarks(c: &mut Criterion) { None, ); + // Run charlie as parachain collator + let charlie = runtime.block_on( + cumulus_test_service::TestNodeBuilder::new(para_id, tokio_handle.clone(), Charlie) + .enable_collator() + .connect_to_relay_chain_nodes(vec![&alice, &bob]) + .build(), + ); // Register parachain runtime .block_on( @@ -167,19 +174,14 @@ fn transaction_throughput_benchmarks(c: &mut Criterion) { cumulus_test_service::runtime::WASM_BINARY .expect("You need to build the WASM binary to run this test!") .to_vec(), - initial_head_data(para_id), + HeadData( + get_raw_genesis_header(charlie.client.clone()) + .expect("Unable to get genesis HeadData."), + ), ), ) .unwrap(); - // Run charlie as parachain collator - let charlie = runtime.block_on( - cumulus_test_service::TestNodeBuilder::new(para_id, tokio_handle.clone(), Charlie) - .enable_collator() - .connect_to_relay_chain_nodes(vec![&alice, &bob]) - .build(), - ); - // Run dave as parachain collator let dave = runtime.block_on( cumulus_test_service::TestNodeBuilder::new(para_id, tokio_handle.clone(), Dave) diff --git a/cumulus/test/service/src/cli.rs b/cumulus/test/service/src/cli.rs index 3dc5b8e3101..87d1d4af8a9 100644 --- a/cumulus/test/service/src/cli.rs +++ b/cumulus/test/service/src/cli.rs @@ -38,9 +38,6 @@ pub struct TestCollatorCli { #[command(flatten)] pub run: cumulus_client_cli::RunCmd, - #[arg(default_value_t = 2000u32)] - pub parachain_id: u32, - /// Relay chain arguments #[arg(raw = true)] pub relaychain_args: Vec, @@ -256,9 +253,8 @@ impl SubstrateCli for TestCollatorCli { fn load_spec(&self, id: &str) -> std::result::Result, String> { Ok(match id { - "" => Box::new(cumulus_test_service::get_chain_spec(Some(ParaId::from( - self.parachain_id, - )))) as Box<_>, + "" => + Box::new(cumulus_test_service::get_chain_spec(Some(ParaId::from(2000)))) as Box<_>, path => { let chain_spec = cumulus_test_service::chain_spec::ChainSpec::from_json_file(path.into())?; diff --git a/cumulus/test/service/src/genesis.rs b/cumulus/test/service/src/genesis.rs deleted file mode 100644 index be4b0427b2e..00000000000 --- a/cumulus/test/service/src/genesis.rs +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright (C) Parity Technologies (UK) Ltd. -// This file is part of Cumulus. - -// Cumulus is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// Cumulus is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with Cumulus. If not, see . - -use codec::Encode; -use cumulus_primitives_core::ParaId; -use cumulus_test_runtime::Block; -use polkadot_primitives::HeadData; -use sc_chain_spec::ChainSpec; -use sp_runtime::{ - traits::{Block as BlockT, Hash as HashT, Header as HeaderT, Zero}, - StateVersion, -}; - -/// Generate a simple test genesis block from a given ChainSpec. -pub fn generate_genesis_block( - chain_spec: &dyn ChainSpec, - genesis_state_version: StateVersion, -) -> Result { - let storage = chain_spec.build_storage()?; - - let child_roots = storage.children_default.iter().map(|(sk, child_content)| { - let state_root = <<::Header as HeaderT>::Hashing as HashT>::trie_root( - child_content.data.clone().into_iter().collect(), - genesis_state_version, - ); - (sk.clone(), state_root.encode()) - }); - let state_root = <<::Header as HeaderT>::Hashing as HashT>::trie_root( - storage.top.clone().into_iter().chain(child_roots).collect(), - genesis_state_version, - ); - - let extrinsics_root = <<::Header as HeaderT>::Hashing as HashT>::trie_root( - Vec::new(), - genesis_state_version, - ); - - Ok(Block::new( - <::Header as HeaderT>::new( - Zero::zero(), - extrinsics_root, - state_root, - Default::default(), - Default::default(), - ), - Default::default(), - )) -} - -/// Returns the initial head data for a parachain ID. -pub fn initial_head_data(para_id: ParaId) -> HeadData { - let spec = crate::chain_spec::get_chain_spec(Some(para_id)); - let block: Block = generate_genesis_block(&spec, sp_runtime::StateVersion::V1).unwrap(); - let genesis_state = block.header().encode(); - genesis_state.into() -} diff --git a/cumulus/test/service/src/lib.rs b/cumulus/test/service/src/lib.rs index 1de3af1bc9d..37ea984ac87 100644 --- a/cumulus/test/service/src/lib.rs +++ b/cumulus/test/service/src/lib.rs @@ -23,9 +23,6 @@ pub mod bench_utils; pub mod chain_spec; -/// Utilities for creating test genesis block and head data -pub mod genesis; - use runtime::AccountId; use sc_executor::{HeapAllocStrategy, WasmExecutor, DEFAULT_HEAP_ALLOC_STRATEGY}; use std::{ @@ -88,7 +85,6 @@ use substrate_test_client::{ pub use chain_spec::*; pub use cumulus_test_runtime as runtime; -pub use genesis::*; pub use sp_keyring::Sr25519Keyring as Keyring; const LOG_TARGET: &str = "cumulus-test-service"; @@ -922,7 +918,7 @@ pub fn run_relay_chain_validator_node( ) -> polkadot_test_service::PolkadotTestNode { let mut config = polkadot_test_service::node_config( storage_update_func, - tokio_handle, + tokio_handle.clone(), key, boot_nodes, true, @@ -936,5 +932,7 @@ pub fn run_relay_chain_validator_node( workers_path.pop(); workers_path.pop(); - polkadot_test_service::run_validator_node(config, Some(workers_path)) + tokio_handle.block_on(async move { + polkadot_test_service::run_validator_node(config, Some(workers_path)) + }) } diff --git a/cumulus/test/service/src/main.rs b/cumulus/test/service/src/main.rs index aace92ca965..69a71a15389 100644 --- a/cumulus/test/service/src/main.rs +++ b/cumulus/test/service/src/main.rs @@ -19,9 +19,8 @@ mod cli; use std::sync::Arc; use cli::{RelayChainCli, Subcommand, TestCollatorCli}; -use cumulus_primitives_core::{relay_chain::CollatorPair, ParaId}; -use cumulus_test_service::{new_partial, AnnounceBlockFn}; -use polkadot_service::runtime_traits::AccountIdConversion; +use cumulus_primitives_core::relay_chain::CollatorPair; +use cumulus_test_service::{chain_spec, new_partial, AnnounceBlockFn}; use sc_cli::{CliConfiguration, SubstrateCli}; use sp_core::Pair; @@ -68,24 +67,21 @@ fn main() -> Result<(), sc_cli::Error> { .create_configuration(&cli, tokio_handle.clone()) .expect("Should be able to generate config"); - let parachain_id = ParaId::from(cli.parachain_id); let polkadot_cli = RelayChainCli::new( &config, [RelayChainCli::executable_name()].iter().chain(cli.relaychain_args.iter()), ); - let parachain_account = - AccountIdConversion::::into_account_truncating( - ¶chain_id, - ); - let tokio_handle = config.tokio_handle.clone(); let polkadot_config = SubstrateCli::create_configuration(&polkadot_cli, &polkadot_cli, tokio_handle) .map_err(|err| format!("Relay chain argument error: {}", err))?; + let parachain_id = chain_spec::Extensions::try_get(&*config.chain_spec) + .map(|e| e.para_id) + .ok_or("Could not find parachain extension in chain-spec.")?; + tracing::info!("Parachain id: {:?}", parachain_id); - tracing::info!("Parachain Account: {}", parachain_account); tracing::info!( "Is collating: {}", if config.role.is_authority() { "yes" } else { "no" } @@ -109,7 +105,7 @@ fn main() -> Result<(), sc_cli::Error> { config, collator_key, polkadot_config, - parachain_id, + parachain_id.into(), cli.disable_block_announcements.then(wrap_announce_block), cli.fail_pov_recovery, |_| Ok(jsonrpsee::RpcModule::new(())), diff --git a/substrate/bin/node/cli/benches/transaction_pool.rs b/substrate/bin/node/cli/benches/transaction_pool.rs index dd6c237d4dd..1cf71f8872f 100644 --- a/substrate/bin/node/cli/benches/transaction_pool.rs +++ b/substrate/bin/node/cli/benches/transaction_pool.rs @@ -55,7 +55,7 @@ fn new_node(tokio_handle: Handle) -> node_cli::service::NewFullBase { impl_name: "BenchmarkImpl".into(), impl_version: "1.0".into(), role: Role::Authority, - tokio_handle, + tokio_handle: tokio_handle.clone(), transaction_pool: TransactionPoolOptions { ready: PoolLimit { count: 100_000, total_bytes: 100 * 1024 * 1024 }, future: PoolLimit { count: 100_000, total_bytes: 100 * 1024 * 1024 }, @@ -97,7 +97,9 @@ fn new_node(tokio_handle: Handle) -> node_cli::service::NewFullBase { wasm_runtime_overrides: None, }; - node_cli::service::new_full_base(config, None, false, |_, _| ()).expect("Creates node") + tokio_handle.block_on(async move { + node_cli::service::new_full_base(config, None, false, |_, _| ()).expect("Creates node") + }) } fn create_accounts(num: usize) -> Vec { -- GitLab From c45732d18b31d4cf307be13818f97a5dc07da015 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Jan 2024 17:44:31 +0100 Subject: [PATCH 153/191] Bump Swatinem/rust-cache from 2.7.1 to 2.7.2 (#2909) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [Swatinem/rust-cache](https://github.com/swatinem/rust-cache) from 2.7.1 to 2.7.2.
Release notes

Sourced from Swatinem/rust-cache's releases.

v2.7.2

What's Changed

New Contributors

Full Changelog: https://github.com/Swatinem/rust-cache/compare/v2.7.1...v2.7.2

Changelog

Sourced from Swatinem/rust-cache's changelog.

Changelog

2.7.2

  • Only key by Cargo.toml and Cargo.lock files of workspace members.

2.7.1

  • Update toml parser to fix parsing errors.

2.7.0

  • Properly cache trybuild tests.

2.6.2

  • Fix toml parsing.

2.6.1

  • Fix hash contributions of Cargo.lock/Cargo.toml files.

2.6.0

  • Add "buildjet" as a second cache-provider backend.
  • Clean up sparse registry index.
  • Do not clean up src of -sys crates.
  • Remove .cargo/credentials.toml before saving.

2.5.1

  • Fix hash contribution of Cargo.lock.

2.5.0

  • feat: Rm workspace crates version before caching.
  • feat: Add hash of .cargo/config.toml to key.

2.4.0

  • Fix cache key stability.
  • Use 8 character hash components to reduce the key length, making it more readable.

2.3.0

  • Add cache-all-crates option, which enables caching of crates installed by workflows.
  • Add installed packages to cache key, so changes to workflows that install rust tools are detected and cached properly.
  • Fix cache restore failures due to upstream bug.
  • Fix EISDIR error due to globed directories.
  • Update runtime @actions/cache, @actions/io and dev typescript dependencies.

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=Swatinem/rust-cache&package-manager=github_actions&previous-version=2.7.1&new-version=2.7.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/check-publish.yml | 2 +- .github/workflows/claim-crates.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/check-publish.yml b/.github/workflows/check-publish.yml index 1941bd98167..398cb732585 100644 --- a/.github/workflows/check-publish.yml +++ b/.github/workflows/check-publish.yml @@ -15,7 +15,7 @@ jobs: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Rust Cache - uses: Swatinem/rust-cache@3cf7f8cc28d1b4e7d01e3783be10a97d55d483c8 # v2.7.1 + uses: Swatinem/rust-cache@a22603398250b864f7190077025cf752307154dc # v2.7.2 with: cache-on-failure: true diff --git a/.github/workflows/claim-crates.yml b/.github/workflows/claim-crates.yml index 9e272266201..038ea213123 100644 --- a/.github/workflows/claim-crates.yml +++ b/.github/workflows/claim-crates.yml @@ -13,7 +13,7 @@ jobs: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Rust Cache - uses: Swatinem/rust-cache@3cf7f8cc28d1b4e7d01e3783be10a97d55d483c8 # v2.7.1 + uses: Swatinem/rust-cache@a22603398250b864f7190077025cf752307154dc # v2.7.2 with: cache-on-failure: true -- GitLab From c4380d6e074bc54612841d654c9e85ef773d983c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 Jan 2024 10:32:07 +0100 Subject: [PATCH 154/191] Bump indexmap from 1.9.3 to 2.0.0 (#2911) Bumps [indexmap](https://github.com/bluss/indexmap) from 1.9.3 to 2.0.0.
Changelog

Sourced from indexmap's changelog.

  • 2.0.0

    • MSRV: Rust 1.64.0 or later is now required.

    • The "std" feature is no longer auto-detected. It is included in the default feature set, or else can be enabled like any other Cargo feature.

    • The "serde-1" feature has been removed, leaving just the optional "serde" dependency to be enabled like a feature itself.

    • IndexMap::get_index_mut now returns Option<(&K, &mut V)>, changing the key part from &mut K to &K. There is also a new alternative MutableKeys::get_index_mut2 to access the former behavior.

    • The new map::Slice<K, V> and set::Slice<T> offer a linear view of maps and sets, behaving a lot like normal [(K, V)] and [T] slices. Notably, comparison traits like Eq only consider items in order, rather than hash lookups, and slices even implement Hash.

    • IndexMap and IndexSet now have sort_by_cached_key and par_sort_by_cached_key methods which perform stable sorts in place using a key extraction function.

    • IndexMap and IndexSet now have reserve_exact, try_reserve, and try_reserve_exact methods that correspond to the same methods on Vec. However, exactness only applies to the direct capacity for items, while the raw hash table still follows its own rules for capacity and load factor.

    • The Equivalent trait is now re-exported from the equivalent crate, intended as a common base to allow types to work with multiple map types.

    • The hashbrown dependency has been updated to version 0.14.

    • The serde_seq module has been moved from the crate root to below the map module.

Commits
  • 8e47be8 Merge pull request #267 from cuviper/release-2.0.0
  • ad694fb Release 2.0.0
  • b5b2814 Merge pull request #266 from cuviper/doc-capacity
  • d3ea289 Document the lower-bound semantics of capacity
  • 74e14da Merge pull request #264 from cuviper/equivalent
  • 677c605 Add a relnote for Equivalent
  • 6d83bc1 pub use equivalent::Equivalent;
  • bb48357 Merge pull request #263 from cuviper/insert_in_slot
  • c37dae6 Use hashbrown's new single-lookup insertion
  • ee71507 Merge pull request #262 from daxpedda/hashbrown-v0.14
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=indexmap&package-manager=cargo&previous-version=1.9.3&new-version=2.0.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- polkadot/node/network/dispute-distribution/Cargo.toml | 2 +- polkadot/node/network/statement-distribution/Cargo.toml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 13b90eafa75..217288702ae 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12277,7 +12277,7 @@ dependencies = [ "fatality", "futures", "futures-timer", - "indexmap 1.9.3", + "indexmap 2.0.0", "lazy_static", "parity-scale-codec", "polkadot-erasure-coding", @@ -13515,7 +13515,7 @@ dependencies = [ "fatality", "futures", "futures-timer", - "indexmap 1.9.3", + "indexmap 2.0.0", "parity-scale-codec", "polkadot-node-network-protocol", "polkadot-node-primitives", diff --git a/polkadot/node/network/dispute-distribution/Cargo.toml b/polkadot/node/network/dispute-distribution/Cargo.toml index 6b494c65336..f892616107a 100644 --- a/polkadot/node/network/dispute-distribution/Cargo.toml +++ b/polkadot/node/network/dispute-distribution/Cargo.toml @@ -27,7 +27,7 @@ sp-keystore = { path = "../../../../substrate/primitives/keystore" } thiserror = "1.0.48" fatality = "0.0.6" schnellru = "0.2.1" -indexmap = "1.9.1" +indexmap = "2.0.0" [dev-dependencies] async-channel = "1.8.0" diff --git a/polkadot/node/network/statement-distribution/Cargo.toml b/polkadot/node/network/statement-distribution/Cargo.toml index 85d2c75aa79..7a502436bb5 100644 --- a/polkadot/node/network/statement-distribution/Cargo.toml +++ b/polkadot/node/network/statement-distribution/Cargo.toml @@ -21,7 +21,7 @@ polkadot-node-primitives = { path = "../../primitives" } polkadot-node-subsystem-util = { path = "../../subsystem-util" } polkadot-node-network-protocol = { path = "../protocol" } arrayvec = "0.7.4" -indexmap = "1.9.1" +indexmap = "2.0.0" parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive"] } thiserror = "1.0.48" fatality = "0.0.6" -- GitLab From f7306d327e0eee0a641ac43628ab525b0096ba7c Mon Sep 17 00:00:00 2001 From: joe petrowski <25483142+joepetrowski@users.noreply.github.com> Date: Fri, 12 Jan 2024 10:42:17 +0100 Subject: [PATCH 155/191] Add More HRMP Channel Opening Tests (#2915) A recent referendum failed because the parachain's sovereign account had enough funds for the deposit (the runtime at the time required a deposit) but not enough left over for the existential deposit, which must remain free. The current logic does not require a deposit for channels with system chains, and the current tests check that none is taken. This new test simply ensures that even without any balance in a parachain's sovereign account, opening a channel with a system chain will be successful. --- polkadot/runtime/parachains/src/hrmp/tests.rs | 63 ++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/polkadot/runtime/parachains/src/hrmp/tests.rs b/polkadot/runtime/parachains/src/hrmp/tests.rs index 4fc0b0b448a..7e7b67c8059 100644 --- a/polkadot/runtime/parachains/src/hrmp/tests.rs +++ b/polkadot/runtime/parachains/src/hrmp/tests.rs @@ -185,11 +185,14 @@ fn force_open_channel_works() { register_parachain(para_a); register_parachain(para_b); + let para_a_free_balance = + ::Currency::free_balance(¶_a.into_account_truncating()); let para_b_free_balance = ::Currency::free_balance(¶_b.into_account_truncating()); run_to_block(5, Some(vec![4, 5])); Hrmp::force_open_hrmp_channel(RuntimeOrigin::root(), para_a, para_b, 2, 8).unwrap(); + Hrmp::force_open_hrmp_channel(RuntimeOrigin::root(), para_b, para_a, 2, 8).unwrap(); Hrmp::assert_storage_consistency_exhaustive(); assert!(System::events().iter().any(|record| record.event == MockEvent::Hrmp(Event::HrmpChannelForceOpened { @@ -198,17 +201,30 @@ fn force_open_channel_works() { proposed_max_capacity: 2, proposed_max_message_size: 8 }))); + assert!(System::events().iter().any(|record| record.event == + MockEvent::Hrmp(Event::HrmpChannelForceOpened { + sender: para_b, + recipient: para_a, + proposed_max_capacity: 2, + proposed_max_message_size: 8 + }))); // Advance to a block 6, but without session change. That means that the channel has // not been created yet. run_to_block(6, None); assert!(!channel_exists(para_a, para_b)); + assert!(!channel_exists(para_b, para_a)); Hrmp::assert_storage_consistency_exhaustive(); // Now let the session change happen and thus open the channel. run_to_block(8, Some(vec![8])); assert!(channel_exists(para_a, para_b)); - // Because para_a is a system chain, para_b's free balance should not have changed. + assert!(channel_exists(para_b, para_a)); + // Because para_a is a system chain, their free balances should not have changed. + assert_eq!( + ::Currency::free_balance(¶_a.into_account_truncating()), + para_a_free_balance + ); assert_eq!( ::Currency::free_balance(¶_b.into_account_truncating()), para_b_free_balance @@ -216,6 +232,51 @@ fn force_open_channel_works() { }); } +#[test] +fn force_open_channel_without_free_balance_works() { + let para_a = 1.into(); + let para_b = 2003.into(); + + new_test_ext(GenesisConfigBuilder::default().build()).execute_with(|| { + // We need both A & B to be registered and live parachains, but they should not have any + // balance in their sovereign accounts. Even without any balance, the channel opening should + // still be successful. + register_parachain_with_balance(para_a, 0); + register_parachain_with_balance(para_b, 0); + + run_to_block(5, Some(vec![4, 5])); + Hrmp::force_open_hrmp_channel(RuntimeOrigin::root(), para_a, para_b, 2, 8).unwrap(); + Hrmp::force_open_hrmp_channel(RuntimeOrigin::root(), para_b, para_a, 2, 8).unwrap(); + Hrmp::assert_storage_consistency_exhaustive(); + assert!(System::events().iter().any(|record| record.event == + MockEvent::Hrmp(Event::HrmpChannelForceOpened { + sender: para_a, + recipient: para_b, + proposed_max_capacity: 2, + proposed_max_message_size: 8 + }))); + assert!(System::events().iter().any(|record| record.event == + MockEvent::Hrmp(Event::HrmpChannelForceOpened { + sender: para_b, + recipient: para_a, + proposed_max_capacity: 2, + proposed_max_message_size: 8 + }))); + + // Advance to a block 6, but without session change. That means that the channel has + // not been created yet. + run_to_block(6, None); + assert!(!channel_exists(para_a, para_b)); + assert!(!channel_exists(para_b, para_a)); + Hrmp::assert_storage_consistency_exhaustive(); + + // Now let the session change happen and thus open the channel. + run_to_block(8, Some(vec![8])); + assert!(channel_exists(para_a, para_b)); + assert!(channel_exists(para_b, para_a)); + }); +} + #[test] fn force_open_channel_works_with_existing_request() { let para_a = 2001.into(); -- GitLab From 868788a5bff3ef94869bd36432726703fe3b4e96 Mon Sep 17 00:00:00 2001 From: Serban Iorga Date: Fri, 12 Jan 2024 12:22:07 +0100 Subject: [PATCH 156/191] Kitchensink: Fix pallet_mmr config (#2919) Related to https://github.com/paritytech/polkadot-sdk/issues/2787 Fixes `pallet_mmr::Config` for the kitchensink runtime --- substrate/bin/node/cli/tests/basic.rs | 2 +- substrate/bin/node/runtime/src/lib.rs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/substrate/bin/node/cli/tests/basic.rs b/substrate/bin/node/cli/tests/basic.rs index e5a8a397254..525ab2e39c1 100644 --- a/substrate/bin/node/cli/tests/basic.rs +++ b/substrate/bin/node/cli/tests/basic.rs @@ -154,7 +154,7 @@ fn blocks() -> ((Vec, Hash), (Vec, Hash)) { // session change => consensus authorities change => authorities change digest item appears let digest = Header::decode(&mut &block2.0[..]).unwrap().digest; - assert_eq!(digest.logs().len(), 1 /* Just babe slot */); + assert_eq!(digest.logs().len(), 2 /* Just babe and BEEFY slots */); (block1, block2) } diff --git a/substrate/bin/node/runtime/src/lib.rs b/substrate/bin/node/runtime/src/lib.rs index ec1601929fc..1043e5017dc 100644 --- a/substrate/bin/node/runtime/src/lib.rs +++ b/substrate/bin/node/runtime/src/lib.rs @@ -879,7 +879,7 @@ parameter_types! { pub const MaxPointsToBalance: u8 = 10; } -use sp_runtime::traits::Convert; +use sp_runtime::traits::{Convert, Keccak256}; pub struct BalanceToU256; impl Convert for BalanceToU256 { fn convert(balance: Balance) -> sp_core::U256 { @@ -1578,9 +1578,9 @@ impl pallet_vesting::Config for Runtime { impl pallet_mmr::Config for Runtime { const INDEXING_PREFIX: &'static [u8] = b"mmr"; - type Hashing = ::Hashing; + type Hashing = Keccak256; type LeafData = pallet_mmr::ParentNumberAndHash; - type OnNewRoot = (); + type OnNewRoot = pallet_beefy_mmr::DepositBeefyDigest; type WeightInfo = (); } -- GitLab From 6579d6cce6dea8f2d9c5b39110fc393334363957 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 Jan 2024 13:24:50 +0100 Subject: [PATCH 157/191] Bump actions/cache from 3.3.2 to 3.3.3 (#2918) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [actions/cache](https://github.com/actions/cache) from 3.3.2 to 3.3.3.
Release notes

Sourced from actions/cache's releases.

v3.3.3

What's Changed

New Contributors

Full Changelog: https://github.com/actions/cache/compare/v3...v3.3.3

Changelog

Sourced from actions/cache's changelog.

Releases

3.0.0

  • Updated minimum runner version support from node 12 -> node 16

3.0.1

  • Added support for caching from GHES 3.5.
  • Fixed download issue for files > 2GB during restore.

3.0.2

  • Added support for dynamic cache size cap on GHES.

3.0.3

  • Fixed avoiding empty cache save when no files are available for caching. (issue)

3.0.4

  • Fixed tar creation error while trying to create tar with path as ~/ home folder on ubuntu-latest. (issue)

3.0.5

  • Removed error handling by consuming actions/cache 3.0 toolkit, Now cache server error handling will be done by toolkit. (PR)

3.0.6

  • Fixed #809 - zstd -d: no such file or directory error
  • Fixed #833 - cache doesn't work with github workspace directory

3.0.7

  • Fixed #810 - download stuck issue. A new timeout is introduced in the download process to abort the download if it gets stuck and doesn't finish within an hour.

3.0.8

  • Fix zstd not working for windows on gnu tar in issues #888 and #891.
  • Allowing users to provide a custom timeout as input for aborting download of a cache segment using an environment variable SEGMENT_DOWNLOAD_TIMEOUT_MINS. Default is 60 minutes.

3.0.9

  • Enhanced the warning message for cache unavailablity in case of GHES.

3.0.10

  • Fix a bug with sorting inputs.
  • Update definition for restore-keys in README.md

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/cache&package-manager=github_actions&previous-version=3.3.2&new-version=3.3.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/check-links.yml | 2 +- .github/workflows/release-50_publish-docker.yml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/check-links.yml b/.github/workflows/check-links.yml index 14941efce24..d3865335c09 100644 --- a/.github/workflows/check-links.yml +++ b/.github/workflows/check-links.yml @@ -18,7 +18,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Restore lychee cache - uses: actions/cache@704facf57e6136b1bc63b828d79edcd491f0ee84 # v3.3.2 (7. Sep 2023) + uses: actions/cache@e12d46a63a90f2fae62d114769bbf2a179198b5c # v3.3.2 (7. Sep 2023) with: path: .lycheecache key: cache-lychee-${{ github.sha }} diff --git a/.github/workflows/release-50_publish-docker.yml b/.github/workflows/release-50_publish-docker.yml index f74fb6a0ad1..ecbac01cd3a 100644 --- a/.github/workflows/release-50_publish-docker.yml +++ b/.github/workflows/release-50_publish-docker.yml @@ -104,7 +104,7 @@ jobs: fetch_release_artifacts - name: Cache the artifacts - uses: actions/cache@704facf57e6136b1bc63b828d79edcd491f0ee84 # v3.3.2 + uses: actions/cache@e12d46a63a90f2fae62d114769bbf2a179198b5c # v3.3.3 with: key: artifacts-${{ env.BINARY }}-${{ github.sha }} path: | @@ -121,7 +121,7 @@ jobs: uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Get artifacts from cache - uses: actions/cache@704facf57e6136b1bc63b828d79edcd491f0ee84 # v3.3.2 + uses: actions/cache@e12d46a63a90f2fae62d114769bbf2a179198b5c # v3.3.3 with: key: artifacts-${{ env.BINARY }}-${{ github.sha }} fail-on-cache-miss: true @@ -250,7 +250,7 @@ jobs: uses: docker/setup-buildx-action@f95db51fddba0c2d1ec667646a06c2ce06100226 # v3.0.0 - name: Cache Docker layers - uses: actions/cache@704facf57e6136b1bc63b828d79edcd491f0ee84 # v3.3.2 + uses: actions/cache@e12d46a63a90f2fae62d114769bbf2a179198b5c # v3.3.3 with: path: /tmp/.buildx-cache key: ${{ runner.os }}-buildx-${{ github.sha }} -- GitLab From 5ed0a75fcdefdb0016c7998f33dff91dbc084095 Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Fri, 12 Jan 2024 16:49:16 +0300 Subject: [PATCH 158/191] Run bridges zombienet tests on CI (#2439) Brridges zombienet tests are non-standard - zombienet currently missing multiple relay chains support (see e.g. https://github.com/paritytech/zombienet/pull/796), so we need to go live with two relay networks, their parachains + custom test runner (which e.g. doesn't shutdown net when its tests are finished and instead waits for both networks tests to complete). So we are stuck with native zombienet provider => this PR is an attempt to gather everything in a single docker container and run tests there ~Draft, because it is far from finishing - what I want now is to see how it works on CI~ --- .gitlab/pipeline/build.yml | 18 ++++++ .gitlab/pipeline/publish.yml | 22 +++++++ .gitlab/pipeline/zombienet.yml | 2 + .gitlab/pipeline/zombienet/bridges.yml | 54 +++++++++++++++++ bridges/zombienet/run-tests.sh | 50 +++++++++++++--- cumulus/scripts/bridges_common.sh | 24 +++----- cumulus/scripts/bridges_rococo_westend.sh | 12 ++-- ...ridges_zombienet_tests_injected.Dockerfile | 60 +++++++++++++++++++ 8 files changed, 214 insertions(+), 28 deletions(-) create mode 100644 .gitlab/pipeline/zombienet/bridges.yml create mode 100644 docker/dockerfiles/bridges_zombienet_tests_injected.Dockerfile diff --git a/.gitlab/pipeline/build.yml b/.gitlab/pipeline/build.yml index 20aa4a5c2a2..d998b62c899 100644 --- a/.gitlab/pipeline/build.yml +++ b/.gitlab/pipeline/build.yml @@ -382,3 +382,21 @@ build-subkey-linux: # after_script: [""] # tags: # - osx + +# bridges + +# we need some non-binary artifacts in our bridges+zombienet image +prepare-bridges-zombienet-artifacts: + stage: build + extends: + - .docker-env + - .common-refs + - .run-immediately + - .collect-artifacts + before_script: + - mkdir -p ./artifacts/bridges-polkadot-sdk/bridges + - mkdir -p ./artifacts/bridges-polkadot-sdk/cumulus/zombienet + script: + - cp -r bridges/zombienet ./artifacts/bridges-polkadot-sdk/bridges/zombienet + - cp -r cumulus/scripts ./artifacts/bridges-polkadot-sdk/cumulus/scripts + - cp -r cumulus/zombienet/bridge-hubs ./artifacts/bridges-polkadot-sdk/cumulus/zombienet/bridge-hubs diff --git a/.gitlab/pipeline/publish.yml b/.gitlab/pipeline/publish.yml index 3b77f5363f6..b73acb560f6 100644 --- a/.gitlab/pipeline/publish.yml +++ b/.gitlab/pipeline/publish.yml @@ -66,6 +66,8 @@ publish-rustdoc: # note: images are used not only in zombienet but also in rococo, wococo and versi .build-push-image: image: $BUILDAH_IMAGE + extends: + - .zombienet-refs variables: DOCKERFILE: "" # docker/path-to.Dockerfile IMAGE_NAME: "" # docker.io/paritypr/image_name @@ -77,6 +79,7 @@ publish-rustdoc: --build-arg VCS_REF="${CI_COMMIT_SHA}" --build-arg BUILD_DATE="$(date -u '+%Y-%m-%dT%H:%M:%SZ')" --build-arg IMAGE_NAME="${IMAGE_NAME}" + --build-arg ZOMBIENET_IMAGE="${ZOMBIENET_IMAGE}" --tag "$IMAGE_NAME:${DOCKER_IMAGES_VERSION}" --file ${DOCKERFILE} . - echo "$PARITYPR_PASS" | @@ -163,3 +166,22 @@ build-push-image-substrate-pr: variables: DOCKERFILE: "docker/dockerfiles/substrate_injected.Dockerfile" IMAGE_NAME: "docker.io/paritypr/substrate" + +# unlike other images, bridges+zombienet image is based on Zombienet image that pulls required binaries +# from other fresh images (polkadot and cumulus) +build-push-image-bridges-zombienet-tests: + stage: publish + extends: + - .kubernetes-env + - .common-refs + - .build-push-image + needs: + - job: build-linux-stable + artifacts: true + - job: build-linux-stable-cumulus + artifacts: true + - job: prepare-bridges-zombienet-artifacts + artifacts: true + variables: + DOCKERFILE: "docker/dockerfiles/bridges_zombienet_tests_injected.Dockerfile" + IMAGE_NAME: "docker.io/paritypr/bridges-zombienet-tests" diff --git a/.gitlab/pipeline/zombienet.yml b/.gitlab/pipeline/zombienet.yml index d5845611c60..4b95c86c3c4 100644 --- a/.gitlab/pipeline/zombienet.yml +++ b/.gitlab/pipeline/zombienet.yml @@ -10,3 +10,5 @@ include: - .gitlab/pipeline/zombienet/cumulus.yml # polkadot tests - .gitlab/pipeline/zombienet/polkadot.yml + # bridges tests + - .gitlab/pipeline/zombienet/bridges.yml diff --git a/.gitlab/pipeline/zombienet/bridges.yml b/.gitlab/pipeline/zombienet/bridges.yml new file mode 100644 index 00000000000..9414207a3bb --- /dev/null +++ b/.gitlab/pipeline/zombienet/bridges.yml @@ -0,0 +1,54 @@ +# This file is part of .gitlab-ci.yml +# Here are all jobs that are executed during "zombienet" stage for bridges + +# common settings for all zombienet jobs +.zombienet-bridges-common: + before_script: + # Exit if the job is not merge queue + # - if [[ $CI_COMMIT_REF_NAME != *"gh-readonly-queue"* ]]; then echo "I will run only in a merge queue"; exit 0; fi + - echo "Zombienet Tests Config" + - echo "${ZOMBIENET_IMAGE}" + - echo "${GH_DIR}" + - echo "${LOCAL_DIR}" + - ls "${LOCAL_DIR}" + - export DEBUG=zombie,zombie::network-node + - export ZOMBIENET_INTEGRATION_TEST_IMAGE="${BRIDGES_ZOMBIENET_TESTS_IMAGE}":${BRIDGES_ZOMBIENET_TESTS_IMAGE_TAG} + - echo "${ZOMBIENET_INTEGRATION_TEST_IMAGE}" + stage: zombienet + image: "${BRIDGES_ZOMBIENET_TESTS_IMAGE}:${BRIDGES_ZOMBIENET_TESTS_IMAGE_TAG}" + needs: + - job: build-push-image-bridges-zombienet-tests + artifacts: true + extends: + - .kubernetes-env + - .zombienet-refs + variables: + BRIDGES_ZOMBIENET_TESTS_IMAGE_TAG: ${DOCKER_IMAGES_VERSION} + BRIDGES_ZOMBIENET_TESTS_IMAGE: "docker.io/paritypr/bridges-zombienet-tests" + GH_DIR: "https://github.com/paritytech/polkadot-sdk/tree/${CI_COMMIT_SHA}/bridges/zombienet" + LOCAL_DIR: "/builds/parity/mirrors/polkadot-sdk/bridges/zombienet" + FF_DISABLE_UMASK_FOR_DOCKER_EXECUTOR: 1 + RUN_IN_CONTAINER: "1" + artifacts: + name: "${CI_JOB_NAME}_${CI_COMMIT_REF_NAME}_zombienet_bridge_tests" + when: always + expire_in: 2 days + paths: + - ./zombienet-logs + after_script: + - mkdir -p ./zombienet-logs + # copy logs of tests runner (run-tests.sh) + - cp -r /tmp/bridges-zombienet-tests.*/tmp.*/tmp.* ./zombienet-logs/ + # copy logs of all nodes + - cp /tmp/zombie*/logs/* ./zombienet-logs/ +# following lines are causing spurious test failures ("At least one of the nodes fails to start") +# retry: 2 +# tags: +# - zombienet-polkadot-integration-test + +zombienet-bridges-0001-asset-transfer-works: + extends: + - .zombienet-bridges-common + script: + - /home/nonroot/bridges-polkadot-sdk/bridges/zombienet/run-tests.sh --docker + - echo "Done" diff --git a/bridges/zombienet/run-tests.sh b/bridges/zombienet/run-tests.sh index 4f80e06650e..34487e13261 100755 --- a/bridges/zombienet/run-tests.sh +++ b/bridges/zombienet/run-tests.sh @@ -1,18 +1,49 @@ #!/bin/bash #set -eu +set -x shopt -s nullglob -trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT +trap "trap - SIGINT SIGTERM EXIT && kill -- -$$" SIGINT SIGTERM EXIT + +# whether to use paths for zombienet+bridges tests container or for local testing +ZOMBIENET_DOCKER_PATHS=0 +while [ $# -ne 0 ] +do + arg="$1" + case "$arg" in + --docker) + ZOMBIENET_DOCKER_PATHS=1 + ;; + esac + shift +done # assuming that we'll be using native provide && all processes will be executing locally # (we need absolute paths here, because they're used when scripts are called by zombienet from tmp folders) export POLKADOT_SDK_FOLDER=`realpath $(dirname "$0")/../..` export BRIDGE_TESTS_FOLDER=$POLKADOT_SDK_FOLDER/bridges/zombienet/tests -export POLKADOT_BINARY_PATH=$POLKADOT_SDK_FOLDER/target/release/polkadot -export POLKADOT_PARACHAIN_BINARY_PATH=$POLKADOT_SDK_FOLDER/target/release/polkadot-parachain -export POLKADOT_PARACHAIN_BINARY_PATH_FOR_ASSET_HUB_ROCOCO=$POLKADOT_PARACHAIN_BINARY_PATH -export POLKADOT_PARACHAIN_BINARY_PATH_FOR_ASSET_HUB_WESTEND=$POLKADOT_PARACHAIN_BINARY_PATH -export ZOMBIENET_BINARY_PATH=~/local_bridge_testing/bin/zombienet-linux + +# set pathc to binaries +if [ "$ZOMBIENET_DOCKER_PATHS" -eq 1 ]; then + export POLKADOT_BINARY_PATH=/usr/local/bin/polkadot + export POLKADOT_PARACHAIN_BINARY_PATH=/usr/local/bin/polkadot-parachain + export POLKADOT_PARACHAIN_BINARY_PATH_FOR_ASSET_HUB_ROCOCO=/usr/local/bin/polkadot-parachain + export POLKADOT_PARACHAIN_BINARY_PATH_FOR_ASSET_HUB_WESTEND=/usr/local/bin/polkadot-parachain + + export SUBSTRATE_RELAY_PATH=/usr/local/bin/substrate-relay + export ZOMBIENET_BINARY_PATH=/usr/local/bin/zombie +else + export POLKADOT_BINARY_PATH=$POLKADOT_SDK_FOLDER/target/release/polkadot + export POLKADOT_PARACHAIN_BINARY_PATH=$POLKADOT_SDK_FOLDER/target/release/polkadot-parachain + export POLKADOT_PARACHAIN_BINARY_PATH_FOR_ASSET_HUB_ROCOCO=$POLKADOT_PARACHAIN_BINARY_PATH + export POLKADOT_PARACHAIN_BINARY_PATH_FOR_ASSET_HUB_WESTEND=$POLKADOT_PARACHAIN_BINARY_PATH + + export SUBSTRATE_RELAY_PATH=~/local_bridge_testing/bin/substrate-relay + export ZOMBIENET_BINARY_PATH=~/local_bridge_testing/bin/zombienet-linux +fi + +# check if `wait` supports -p flag +if [ `printf "$BASH_VERSION\n5.1" | sort -V | head -n 1` = "5.1" ]; then IS_BASH_5_1=1; else IS_BASH_5_1=0; fi # check if `wait` supports -p flag if [ `printf "$BASH_VERSION\n5.1" | sort -V | head -n 1` = "5.1" ]; then IS_BASH_5_1=1; else IS_BASH_5_1=0; fi @@ -21,13 +52,17 @@ if [ `printf "$BASH_VERSION\n5.1" | sort -V | head -n 1` = "5.1" ]; then IS_BASH export LANE_ID="00000002" # tests configuration -ALL_TESTS_FOLDER=`mktemp -d` +ALL_TESTS_FOLDER=`mktemp -d /tmp/bridges-zombienet-tests.XXXXX` function start_coproc() { local command=$1 local name=$2 local coproc_log=`mktemp -p $TEST_FOLDER` coproc COPROC { + # otherwise zombienet uses some hardcoded paths + unset RUN_IN_CONTAINER + unset ZOMBIENET_IMAGE + $command >$coproc_log 2>&1 } TEST_COPROCS[$COPROC_PID, 0]=$name @@ -90,6 +125,7 @@ do echo "=== Shutting down. Log of failed process below ===" echo "=====================================================================" echo $coproc_stdout + exit 1 fi diff --git a/cumulus/scripts/bridges_common.sh b/cumulus/scripts/bridges_common.sh index 97ef8aa1259..5d5b7b7a482 100755 --- a/cumulus/scripts/bridges_common.sh +++ b/cumulus/scripts/bridges_common.sh @@ -1,27 +1,21 @@ #!/bin/bash -function ensure_binaries() { - if [[ ! -f ~/local_bridge_testing/bin/polkadot ]]; then - echo " Required polkadot binary '~/local_bridge_testing/bin/polkadot' does not exist!" - echo " You need to build it and copy to this location!" - echo " Please, check ./parachains/runtimes/bridge-hubs/README.md (Prepare/Build/Deploy)" - exit 1 - fi - if [[ ! -f ~/local_bridge_testing/bin/polkadot-parachain ]]; then - echo " Required polkadot-parachain binary '~/local_bridge_testing/bin/polkadot-parachain' does not exist!" - echo " You need to build it and copy to this location!" - echo " Please, check ./parachains/runtimes/bridge-hubs/README.md (Prepare/Build/Deploy)" - exit 1 - fi +function relayer_path() { + local default_path=~/local_bridge_testing/bin/substrate-relay + local path="${SUBSTRATE_RELAY_PATH:-$default_path}" + echo "$path" } function ensure_relayer() { - if [[ ! -f ~/local_bridge_testing/bin/substrate-relay ]]; then - echo " Required substrate-relay binary '~/local_bridge_testing/bin/substrate-relay' does not exist!" + local path=$(relayer_path) + if [[ ! -f "$path" ]]; then + echo " Required substrate-relay binary '$path' does not exist!" echo " You need to build it and copy to this location!" echo " Please, check ./parachains/runtimes/bridge-hubs/README.md (Prepare/Build/Deploy)" exit 1 fi + + echo $path } function ensure_polkadot_js_api() { diff --git a/cumulus/scripts/bridges_rococo_westend.sh b/cumulus/scripts/bridges_rococo_westend.sh index c52b72e51fc..3b6f8e89285 100755 --- a/cumulus/scripts/bridges_rococo_westend.sh +++ b/cumulus/scripts/bridges_rococo_westend.sh @@ -132,10 +132,10 @@ LANE_ID="00000002" XCM_VERSION=3 function init_ro_wnd() { - ensure_relayer + local relayer_path=$(ensure_relayer) RUST_LOG=runtime=trace,rpc=trace,bridge=trace \ - ~/local_bridge_testing/bin/substrate-relay init-bridge rococo-to-bridge-hub-westend \ + $relayer_path init-bridge rococo-to-bridge-hub-westend \ --source-host localhost \ --source-port 9942 \ --source-version-mode Auto \ @@ -146,10 +146,10 @@ function init_ro_wnd() { } function init_wnd_ro() { - ensure_relayer + local relayer_path=$(ensure_relayer) RUST_LOG=runtime=trace,rpc=trace,bridge=trace \ - ~/local_bridge_testing/bin/substrate-relay init-bridge westend-to-bridge-hub-rococo \ + $relayer_path init-bridge westend-to-bridge-hub-rococo \ --source-host localhost \ --source-port 9945 \ --source-version-mode Auto \ @@ -160,10 +160,10 @@ function init_wnd_ro() { } function run_relay() { - ensure_relayer + local relayer_path=$(ensure_relayer) RUST_LOG=runtime=trace,rpc=trace,bridge=trace \ - ~/local_bridge_testing/bin/substrate-relay relay-headers-and-messages bridge-hub-rococo-bridge-hub-westend \ + $relayer_path relay-headers-and-messages bridge-hub-rococo-bridge-hub-westend \ --rococo-host localhost \ --rococo-port 9942 \ --rococo-version-mode Auto \ diff --git a/docker/dockerfiles/bridges_zombienet_tests_injected.Dockerfile b/docker/dockerfiles/bridges_zombienet_tests_injected.Dockerfile new file mode 100644 index 00000000000..ebad4046d26 --- /dev/null +++ b/docker/dockerfiles/bridges_zombienet_tests_injected.Dockerfile @@ -0,0 +1,60 @@ +# this image is built on top of existing Zombienet image +ARG ZOMBIENET_IMAGE +# this image uses substrate-relay image built elsewhere +ARG SUBSTRATE_RELAY_IMAGE=docker.io/paritytech/substrate-relay:v2023-11-07-rococo-westend-initial-relayer + +# metadata +ARG VCS_REF +ARG BUILD_DATE +ARG IMAGE_NAME + +# we need `substrate-relay` binary, built elsewhere +FROM ${SUBSTRATE_RELAY_IMAGE} as relay-builder + +# the base image is the zombienet image - we are planning to run zombienet tests using native +# provider here +FROM ${ZOMBIENET_IMAGE} + +LABEL io.parity.image.authors="devops-team@parity.io" \ + io.parity.image.vendor="Parity Technologies" \ + io.parity.image.title="${IMAGE_NAME}" \ + io.parity.image.description="Bridges Zombienet tests." \ + io.parity.image.source="https://github.com/paritytech/polkadot-sdk/blob/${VCS_REF}/docker/dockerfiles/bridges_zombienet_tests_injected.Dockerfile" \ + io.parity.image.revision="${VCS_REF}" \ + io.parity.image.created="${BUILD_DATE}" \ + io.parity.image.documentation="https://github.com/paritytech/polkadot-sdk/bridges/zombienet" + +# show backtraces +ENV RUST_BACKTRACE 1 +USER root + +# for native provider to work (TODO: fix in zn docker?) +RUN apt-get update && apt-get install -y procps sudo +RUN yarn global add @polkadot/api-cli + +# add polkadot binary to the docker image +COPY ./artifacts/polkadot /usr/local/bin/ +COPY ./artifacts/polkadot-execute-worker /usr/local/bin/ +COPY ./artifacts/polkadot-prepare-worker /usr/local/bin/ +# add polkadot-parachain binary to the docker image +COPY ./artifacts/polkadot-parachain /usr/local/bin +# copy substrate-relay to the docker image +COPY --from=relay-builder /home/user/substrate-relay /usr/local/bin/ +# we need bridges zombienet runner and tests +RUN mkdir -p /home/nonroot/bridges-polkadot-sdk +COPY ./artifacts/bridges-polkadot-sdk /home/nonroot/bridges-polkadot-sdk +# also prepare `generate_hex_encoded_call` for running +RUN set -eux; \ + cd /home/nonroot/bridges-polkadot-sdk/cumulus/scripts/generate_hex_encoded_call; \ + npm install + +# check if executable works in this container +USER nonroot +RUN /usr/local/bin/polkadot --version +RUN /usr/local/bin/polkadot-parachain --version +RUN /usr/local/bin/substrate-relay --version + +# https://polkadot.js.org/apps/?rpc=ws://127.0.0.1:{PORT}#/explorer +EXPOSE 9942 9910 8943 9945 9010 8945 + +ENTRYPOINT ["/bin/bash", "-c", "/home/nonroot/bridges-polkadot-sdk/bridges/zombienet/run-tests.sh"] -- GitLab From 5208bed7d2d2a9de556289ecde12875ba62739ad Mon Sep 17 00:00:00 2001 From: Dmitry Markin Date: Fri, 12 Jan 2024 17:17:15 +0200 Subject: [PATCH 159/191] Extract warp sync strategy from `ChainSync` (#2467) Extract `WarpSync` (and `StateSync` as part of warp sync) from `ChainSync` as independent syncing strategy called by `SyncingEngine`. Introduce `SyncingStrategy` enum as a proxy between `SyncingEngine` and specific syncing strategies. ## Limitations Gap sync is kept in `ChainSync` for now because it shares the same set of peers as block syncing implementation in `ChainSync`. Extraction of a common context responsible for peer management in syncing strategies able to run in parallel is planned for a follow-up PR. ## Further improvements A possibility of conversion of `SyncingStartegy` into a trait should be evaluated. The main stopper for this is that different strategies need to communicate different actions to `SyncingEngine` and respond to different events / provide different APIs (e.g., requesting justifications is only possible via `ChainSync` and not through `WarpSync`; `SendWarpProofRequest` action is only relevant to `WarpSync`, etc.) --------- Co-authored-by: Aaro Altonen <48052676+altonen@users.noreply.github.com> --- polkadot/node/service/src/lib.rs | 2 +- prdoc/pr_2467.prdoc | 15 + substrate/bin/node/cli/src/service.rs | 2 +- .../consensus/grandpa/src/warp_proof.rs | 2 +- substrate/client/informant/src/display.rs | 10 +- substrate/client/network/sync/Cargo.toml | 2 +- .../sync/src/block_announce_validator.rs | 5 +- .../network/sync/src/block_request_handler.rs | 2 +- substrate/client/network/sync/src/blocks.rs | 13 +- substrate/client/network/sync/src/engine.rs | 353 ++-- .../client/network/sync/src/extra_requests.rs | 17 +- substrate/client/network/sync/src/lib.rs | 8 +- .../network/sync/src/pending_responses.rs | 5 +- .../network/sync/src/state_request_handler.rs | 6 +- substrate/client/network/sync/src/strategy.rs | 489 ++++++ .../sync/src/{ => strategy}/chain_sync.rs | 458 ++---- .../src/{ => strategy}/chain_sync/test.rs | 52 +- .../client/network/sync/src/strategy/state.rs | 754 +++++++++ .../src/{state.rs => strategy/state_sync.rs} | 113 +- .../client/network/sync/src/strategy/warp.rs | 1443 +++++++++++++++++ substrate/client/network/sync/src/types.rs | 22 +- substrate/client/network/sync/src/warp.rs | 405 ----- .../network/sync/src/warp_request_handler.rs | 9 +- substrate/client/network/test/src/lib.rs | 8 +- substrate/client/network/test/src/sync.rs | 35 +- substrate/client/service/src/builder.rs | 4 +- substrate/client/service/src/lib.rs | 2 +- .../0001-basic-warp-sync/test-warp-sync.zndsl | 2 + .../test-validators-warp-sync.zndsl | 3 + .../test-block-building-warp-sync.zndsl | 2 + 30 files changed, 3227 insertions(+), 1016 deletions(-) create mode 100644 prdoc/pr_2467.prdoc create mode 100644 substrate/client/network/sync/src/strategy.rs rename substrate/client/network/sync/src/{ => strategy}/chain_sync.rs (85%) rename substrate/client/network/sync/src/{ => strategy}/chain_sync/test.rs (94%) create mode 100644 substrate/client/network/sync/src/strategy/state.rs rename substrate/client/network/sync/src/{state.rs => strategy/state_sync.rs} (74%) create mode 100644 substrate/client/network/sync/src/strategy/warp.rs delete mode 100644 substrate/client/network/sync/src/warp.rs diff --git a/polkadot/node/service/src/lib.rs b/polkadot/node/service/src/lib.rs index ff70dbde734..1aadef03ce7 100644 --- a/polkadot/node/service/src/lib.rs +++ b/polkadot/node/service/src/lib.rs @@ -734,7 +734,7 @@ pub fn new_full( }: NewFullParams, ) -> Result { use polkadot_node_network_protocol::request_response::IncomingRequest; - use sc_network_sync::warp::WarpSyncParams; + use sc_network_sync::WarpSyncParams; let is_offchain_indexing_enabled = config.offchain_worker.indexing_enabled; let role = config.role.clone(); diff --git a/prdoc/pr_2467.prdoc b/prdoc/pr_2467.prdoc new file mode 100644 index 00000000000..db88ff1fa57 --- /dev/null +++ b/prdoc/pr_2467.prdoc @@ -0,0 +1,15 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Extract warp sync strategy from `ChainSync` + +doc: + - audience: Node Dev + description: | + `WarpSync`, and `StateSync` as the logical part of warp sync, are extracted from `ChainSync` + as independent syncing strategies. `SyncingStrategy` enum is introduced as a proxy between + `SyncingEngine` and specific strategies. `SyncingStrategy` may be replaced by a trait in a + follow-up PRs. + +crates: + - name: sc-network-sync diff --git a/substrate/bin/node/cli/src/service.rs b/substrate/bin/node/cli/src/service.rs index 67d21ee69ed..8f2aba6b44c 100644 --- a/substrate/bin/node/cli/src/service.rs +++ b/substrate/bin/node/cli/src/service.rs @@ -30,7 +30,7 @@ use node_primitives::Block; use sc_client_api::{Backend, BlockBackend}; use sc_consensus_babe::{self, SlotProportion}; use sc_network::{event::Event, NetworkEventStream, NetworkService}; -use sc_network_sync::{warp::WarpSyncParams, SyncingService}; +use sc_network_sync::{strategy::warp::WarpSyncParams, SyncingService}; use sc_service::{config::Configuration, error::Error as ServiceError, RpcHandlers, TaskManager}; use sc_statement_store::Store as StatementStore; use sc_telemetry::{Telemetry, TelemetryWorker}; diff --git a/substrate/client/consensus/grandpa/src/warp_proof.rs b/substrate/client/consensus/grandpa/src/warp_proof.rs index a0fae6998f5..29111712ec3 100644 --- a/substrate/client/consensus/grandpa/src/warp_proof.rs +++ b/substrate/client/consensus/grandpa/src/warp_proof.rs @@ -23,7 +23,7 @@ use crate::{ BlockNumberOps, GrandpaJustification, SharedAuthoritySet, }; use sc_client_api::Backend as ClientBackend; -use sc_network_sync::warp::{EncodedProof, VerificationResult, WarpSyncProvider}; +use sc_network_sync::strategy::warp::{EncodedProof, VerificationResult, WarpSyncProvider}; use sp_blockchain::{Backend as BlockchainBackend, HeaderBackend}; use sp_consensus_grandpa::{AuthorityList, SetId, GRANDPA_ENGINE_ID}; use sp_runtime::{ diff --git a/substrate/client/informant/src/display.rs b/substrate/client/informant/src/display.rs index 64ddb71d572..bcf3794032f 100644 --- a/substrate/client/informant/src/display.rs +++ b/substrate/client/informant/src/display.rs @@ -21,10 +21,7 @@ use ansi_term::Colour; use log::info; use sc_client_api::ClientInfo; use sc_network::NetworkStatus; -use sc_network_sync::{ - warp::{WarpSyncPhase, WarpSyncProgress}, - SyncState, SyncStatus, -}; +use sc_network_sync::{SyncState, SyncStatus, WarpSyncPhase, WarpSyncProgress}; use sp_runtime::traits::{Block as BlockT, CheckedDiv, NumberFor, Saturating, Zero}; use std::{fmt, time::Instant}; @@ -130,9 +127,10 @@ impl InformantDisplay { ), (_, Some(state), _) => ( "⚙️ ", - "Downloading state".into(), + "State sync".into(), format!( - ", {}%, {:.2} Mib", + ", {}, {}%, {:.2} Mib", + state.phase, state.percentage, (state.size as f32) / (1024f32 * 1024f32) ), diff --git a/substrate/client/network/sync/Cargo.toml b/substrate/client/network/sync/Cargo.toml index cb19e1adbe5..dd993e7a3df 100644 --- a/substrate/client/network/sync/Cargo.toml +++ b/substrate/client/network/sync/Cargo.toml @@ -49,7 +49,7 @@ sp-consensus-grandpa = { path = "../../../primitives/consensus/grandpa" } sp-runtime = { path = "../../../primitives/runtime" } [dev-dependencies] -tokio = { version = "1.22.0", features = ["macros"] } +mockall = "0.11.3" quickcheck = { version = "1.0.3", default-features = false } sc-block-builder = { path = "../../block-builder" } sp-test-primitives = { path = "../../../primitives/test-primitives" } diff --git a/substrate/client/network/sync/src/block_announce_validator.rs b/substrate/client/network/sync/src/block_announce_validator.rs index 961b581cddc..62c0d1c16e2 100644 --- a/substrate/client/network/sync/src/block_announce_validator.rs +++ b/substrate/client/network/sync/src/block_announce_validator.rs @@ -19,7 +19,7 @@ //! [`BlockAnnounceValidator`] is responsible for async validation of block announcements. //! [`Stream`] implemented by [`BlockAnnounceValidator`] never terminates. -use crate::futures_stream::FuturesStream; +use crate::{futures_stream::FuturesStream, LOG_TARGET}; use futures::{stream::FusedStream, Future, FutureExt, Stream, StreamExt}; use libp2p::PeerId; use log::{debug, error, trace, warn}; @@ -33,9 +33,6 @@ use std::{ task::{Context, Poll}, }; -/// Log target for this file. -const LOG_TARGET: &str = "sync"; - /// Maximum number of concurrent block announce validations. /// /// If the queue reaches the maximum, we drop any new block diff --git a/substrate/client/network/sync/src/block_request_handler.rs b/substrate/client/network/sync/src/block_request_handler.rs index f669a22cd2e..f2af7d21786 100644 --- a/substrate/client/network/sync/src/block_request_handler.rs +++ b/substrate/client/network/sync/src/block_request_handler.rs @@ -24,6 +24,7 @@ use crate::{ BlockResponse as BlockResponseSchema, BlockResponse, Direction, }, service::network::NetworkServiceHandle, + LOG_TARGET, }; use codec::{Decode, DecodeAll, Encode}; @@ -56,7 +57,6 @@ use std::{ /// Maximum blocks per response. pub(crate) const MAX_BLOCKS_IN_RESPONSE: usize = 128; -const LOG_TARGET: &str = "sync"; const MAX_BODY_BYTES: usize = 8 * 1024 * 1024; const MAX_NUMBER_OF_SAME_REQUESTS_PER_PEER: usize = 2; diff --git a/substrate/client/network/sync/src/blocks.rs b/substrate/client/network/sync/src/blocks.rs index 539a8a5d612..4988045a478 100644 --- a/substrate/client/network/sync/src/blocks.rs +++ b/substrate/client/network/sync/src/blocks.rs @@ -16,6 +16,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +use crate::LOG_TARGET; use libp2p::PeerId; use log::trace; use sc_network_common::sync::message; @@ -87,10 +88,10 @@ impl BlockCollection { match self.blocks.get(&start) { Some(&BlockRangeState::Downloading { .. }) => { - trace!(target: "sync", "Inserting block data still marked as being downloaded: {}", start); + trace!(target: LOG_TARGET, "Inserting block data still marked as being downloaded: {}", start); }, Some(BlockRangeState::Complete(existing)) if existing.len() >= blocks.len() => { - trace!(target: "sync", "Ignored block data already downloaded: {}", start); + trace!(target: LOG_TARGET, "Ignored block data already downloaded: {}", start); return }, _ => (), @@ -162,7 +163,7 @@ impl BlockCollection { }; // crop to peers best if range.start > peer_best { - trace!(target: "sync", "Out of range for peer {} ({} vs {})", who, range.start, peer_best); + trace!(target: LOG_TARGET, "Out of range for peer {} ({} vs {})", who, range.start, peer_best); return None } range.end = cmp::min(peer_best + One::one(), range.end); @@ -173,7 +174,7 @@ impl BlockCollection { .next() .map_or(false, |(n, _)| range.start > *n + max_ahead.into()) { - trace!(target: "sync", "Too far ahead for peer {} ({})", who, range.start); + trace!(target: LOG_TARGET, "Too far ahead for peer {} ({})", who, range.start); return None } @@ -224,7 +225,7 @@ impl BlockCollection { }; *range_data = BlockRangeState::Queued { len }; } - trace!(target: "sync", "{} blocks ready for import", ready.len()); + trace!(target: LOG_TARGET, "{} blocks ready for import", ready.len()); ready } @@ -235,7 +236,7 @@ impl BlockCollection { self.blocks.remove(&block_num); block_num += One::one(); } - trace!(target: "sync", "Cleared blocks from {:?} to {:?}", from, to); + trace!(target: LOG_TARGET, "Cleared blocks from {:?} to {:?}", from, to); } } diff --git a/substrate/client/network/sync/src/engine.rs b/substrate/client/network/sync/src/engine.rs index 952300a14d8..7486c091ebf 100644 --- a/substrate/client/network/sync/src/engine.rs +++ b/substrate/client/network/sync/src/engine.rs @@ -25,17 +25,20 @@ use crate::{ }, block_relay_protocol::{BlockDownloader, BlockResponseError}, block_request_handler::MAX_BLOCKS_IN_RESPONSE, - chain_sync::{ChainSync, ChainSyncAction}, pending_responses::{PendingResponses, ResponseEvent}, schema::v1::{StateRequest, StateResponse}, service::{ self, syncing_service::{SyncingService, ToServiceCommand}, }, + strategy::{ + warp::{EncodedProof, WarpProofRequest, WarpSyncParams}, + SyncingAction, SyncingConfig, SyncingStrategy, + }, types::{ BadPeer, ExtendedPeerInfo, OpaqueStateRequest, OpaqueStateResponse, PeerRequest, SyncEvent, }, - warp::{EncodedProof, WarpProofRequest, WarpSyncParams}, + LOG_TARGET, }; use codec::{Decode, DecodeAll, Encode}; @@ -45,10 +48,9 @@ use futures::{ FutureExt, StreamExt, }; use libp2p::{request_response::OutboundFailure, PeerId}; -use log::{debug, trace}; +use log::{debug, error, trace}; use prometheus_endpoint::{ - register, Counter, Gauge, GaugeVec, MetricSource, Opts, PrometheusError, Registry, - SourcedGauge, U64, + register, Counter, Gauge, MetricSource, Opts, PrometheusError, Registry, SourcedGauge, U64, }; use prost::Message; use schnellru::{ByLength, LruMap}; @@ -97,9 +99,6 @@ const TICK_TIMEOUT: std::time::Duration = std::time::Duration::from_millis(1100) /// Maximum number of known block hashes to keep for a peer. const MAX_KNOWN_BLOCKS: usize = 1024; // ~32kb per peer + LruHashSet overhead -/// Logging target for the file. -const LOG_TARGET: &str = "sync"; - /// If the block announces stream to peer has been inactive for 30 seconds meaning local node /// has not sent or received block announcements to/from the peer, report the node for inactivity, /// disconnect it and attempt to establish connection to some other peer. @@ -140,9 +139,6 @@ mod rep { struct Metrics { peers: Gauge, - queued_blocks: Gauge, - fork_targets: Gauge, - justifications: GaugeVec, import_queue_blocks_submitted: Counter, import_queue_justifications_submitted: Counter, } @@ -155,25 +151,6 @@ impl Metrics { let g = Gauge::new("substrate_sync_peers", "Number of peers we sync with")?; register(g, r)? }, - queued_blocks: { - let g = - Gauge::new("substrate_sync_queued_blocks", "Number of blocks in import queue")?; - register(g, r)? - }, - fork_targets: { - let g = Gauge::new("substrate_sync_fork_targets", "Number of fork sync targets")?; - register(g, r)? - }, - justifications: { - let g = GaugeVec::new( - Opts::new( - "substrate_sync_extra_justifications", - "Number of extra justifications requests", - ), - &["status"], - )?; - register(g, r)? - }, import_queue_blocks_submitted: { let c = Counter::new( "substrate_sync_import_queue_blocks_submitted", @@ -234,9 +211,11 @@ pub struct Peer { } pub struct SyncingEngine { - /// State machine that handles the list of in-progress requests. Only full node peers are - /// registered. - chain_sync: ChainSync, + /// Syncing strategy. + strategy: SyncingStrategy, + + /// Syncing configuration for startegies. + syncing_config: SyncingConfig, /// Blockchain client. client: Arc, @@ -381,6 +360,12 @@ where } else { net_config.network_config.max_blocks_per_request }; + let syncing_config = SyncingConfig { + mode, + max_parallel_downloads, + max_blocks_per_request, + metrics_registry: metrics_registry.cloned(), + }; let cache_capacity = (net_config.network_config.default_peers_set.in_peers + net_config.network_config.default_peers_set.out_peers) .max(1); @@ -429,19 +414,6 @@ where total.saturating_sub(net_config.network_config.default_peers_set_num_full) as usize }; - // Split warp sync params into warp sync config and a channel to retreive target block - // header. - let (warp_sync_config, warp_sync_target_block_header_rx) = - warp_sync_params.map_or((None, None), |params| { - let (config, target_block_rx) = params.split(); - (Some(config), target_block_rx) - }); - - // Make sure polling of the target block channel is a no-op if there is no block to - // retrieve. - let warp_sync_target_block_header_rx_fused = warp_sync_target_block_header_rx - .map_or(futures::future::pending().boxed().fuse(), |rx| rx.boxed().fuse()); - let (block_announce_config, notification_service) = Self::get_block_announce_proto_config( protocol_id, fork_id, @@ -455,13 +427,22 @@ where .expect("Genesis block exists; qed"), ); - let chain_sync = ChainSync::new( - mode, - client.clone(), - max_parallel_downloads, - max_blocks_per_request, - warp_sync_config, - )?; + // Split warp sync params into warp sync config and a channel to retreive target block + // header. + let (warp_sync_config, warp_sync_target_block_header_rx) = + warp_sync_params.map_or((None, None), |params| { + let (config, target_block_rx) = params.split(); + (Some(config), target_block_rx) + }); + + // Make sure polling of the target block channel is a no-op if there is no block to + // retrieve. + let warp_sync_target_block_header_rx_fused = warp_sync_target_block_header_rx + .map_or(futures::future::pending().boxed().fuse(), |rx| rx.boxed().fuse()); + + // Initialize syncing strategy. + let strategy = + SyncingStrategy::new(syncing_config.clone(), client.clone(), warp_sync_config)?; let block_announce_protocol_name = block_announce_config.protocol_name().clone(); let (tx, service_rx) = tracing_unbounded("mpsc_chain_sync", 100_000); @@ -489,7 +470,8 @@ where Self { roles, client, - chain_sync, + strategy, + syncing_config, network_service, peers: HashMap::new(), block_announce_data_cache: LruMap::new(ByLength::new(cache_capacity)), @@ -543,37 +525,19 @@ where if let Some(metrics) = &self.metrics { let n = u64::try_from(self.peers.len()).unwrap_or(std::u64::MAX); metrics.peers.set(n); - - let m = self.chain_sync.metrics(); - - metrics.fork_targets.set(m.fork_targets.into()); - metrics.queued_blocks.set(m.queued_blocks.into()); - - metrics - .justifications - .with_label_values(&["pending"]) - .set(m.justifications.pending_requests.into()); - metrics - .justifications - .with_label_values(&["active"]) - .set(m.justifications.active_requests.into()); - metrics - .justifications - .with_label_values(&["failed"]) - .set(m.justifications.failed_requests.into()); - metrics - .justifications - .with_label_values(&["importing"]) - .set(m.justifications.importing_requests.into()); } + self.strategy.report_metrics(); } - fn update_peer_info(&mut self, peer_id: &PeerId) { - if let Some(info) = self.chain_sync.peer_info(peer_id) { - if let Some(ref mut peer) = self.peers.get_mut(peer_id) { - peer.info.best_hash = info.best_hash; - peer.info.best_number = info.best_number; - } + fn update_peer_info( + &mut self, + peer_id: &PeerId, + best_hash: B::Hash, + best_number: NumberFor, + ) { + if let Some(ref mut peer) = self.peers.get_mut(peer_id) { + peer.info.best_hash = best_hash; + peer.info.best_number = best_number; } } @@ -585,9 +549,11 @@ where match validation_result { BlockAnnounceValidationResult::Skip { peer_id: _ } => {}, BlockAnnounceValidationResult::Process { is_new_best, peer_id, announce } => { - self.chain_sync.on_validated_block_announce(is_new_best, peer_id, &announce); - - self.update_peer_info(&peer_id); + if let Some((best_hash, best_number)) = + self.strategy.on_validated_block_announce(is_new_best, peer_id, &announce) + { + self.update_peer_info(&peer_id, best_hash, best_number); + } if let Some(data) = announce.data { if !data.is_empty() { @@ -705,83 +671,106 @@ where // Update atomic variables self.num_connected.store(self.peers.len(), Ordering::Relaxed); - self.is_major_syncing - .store(self.chain_sync.status().state.is_major_syncing(), Ordering::Relaxed); + self.is_major_syncing.store(self.strategy.is_major_syncing(), Ordering::Relaxed); - // Process actions requested by `ChainSync`. - self.process_chain_sync_actions(); + // Process actions requested by a syncing strategy. + if let Err(e) = self.process_strategy_actions() { + error!("Terminating `SyncingEngine` due to fatal error: {e:?}"); + return + } } } - fn process_chain_sync_actions(&mut self) { - self.chain_sync.actions().for_each(|action| match action { - ChainSyncAction::SendBlockRequest { peer_id, request } => { - // Sending block request implies dropping obsolete pending response as we are not - // interested in it anymore (see [`ChainSyncAction::SendBlockRequest`]). - // Furthermore, only one request at a time is allowed to any peer. - let removed = self.pending_responses.remove(&peer_id); - self.send_block_request(peer_id, request.clone()); + fn process_strategy_actions(&mut self) -> Result<(), ClientError> { + for action in self.strategy.actions() { + match action { + SyncingAction::SendBlockRequest { peer_id, request } => { + // Sending block request implies dropping obsolete pending response as we are + // not interested in it anymore (see [`SyncingAction::SendBlockRequest`]). + // Furthermore, only one request at a time is allowed to any peer. + let removed = self.pending_responses.remove(&peer_id); + self.send_block_request(peer_id, request.clone()); + + trace!( + target: LOG_TARGET, + "Processed `ChainSyncAction::SendBlockRequest` to {} with {:?}, stale response removed: {}.", + peer_id, + request, + removed, + ) + }, + SyncingAction::CancelBlockRequest { peer_id } => { + let removed = self.pending_responses.remove(&peer_id); - trace!( - target: LOG_TARGET, - "Processed `ChainSyncAction::SendBlockRequest` to {} with {:?}, stale response removed: {}.", - peer_id, - request, - removed, - ) - }, - ChainSyncAction::CancelBlockRequest { peer_id } => { - let removed = self.pending_responses.remove(&peer_id); + trace!( + target: LOG_TARGET, + "Processed {action:?}, response removed: {removed}.", + ); + }, + SyncingAction::SendStateRequest { peer_id, request } => { + self.send_state_request(peer_id, request); - trace!(target: LOG_TARGET, "Processed {action:?}, response removed: {removed}."); - }, - ChainSyncAction::SendStateRequest { peer_id, request } => { - self.send_state_request(peer_id, request); + trace!( + target: LOG_TARGET, + "Processed `ChainSyncAction::SendBlockRequest` to {peer_id}.", + ); + }, + SyncingAction::SendWarpProofRequest { peer_id, request } => { + self.send_warp_proof_request(peer_id, request.clone()); - trace!( - target: LOG_TARGET, - "Processed `ChainSyncAction::SendBlockRequest` to {peer_id}.", - ); - }, - ChainSyncAction::SendWarpProofRequest { peer_id, request } => { - self.send_warp_proof_request(peer_id, request.clone()); + trace!( + target: LOG_TARGET, + "Processed `ChainSyncAction::SendWarpProofRequest` to {}, request: {:?}.", + peer_id, + request, + ); + }, + SyncingAction::DropPeer(BadPeer(peer_id, rep)) => { + self.pending_responses.remove(&peer_id); + self.network_service + .disconnect_peer(peer_id, self.block_announce_protocol_name.clone()); + self.network_service.report_peer(peer_id, rep); - trace!( - target: LOG_TARGET, - "Processed `ChainSyncAction::SendWarpProofRequest` to {}, request: {:?}.", - peer_id, - request, - ); - }, - ChainSyncAction::DropPeer(BadPeer(peer_id, rep)) => { - self.pending_responses.remove(&peer_id); - self.network_service - .disconnect_peer(peer_id, self.block_announce_protocol_name.clone()); - self.network_service.report_peer(peer_id, rep); + trace!(target: LOG_TARGET, "{peer_id:?} dropped: {rep:?}."); + }, + SyncingAction::ImportBlocks { origin, blocks } => { + let count = blocks.len(); + self.import_blocks(origin, blocks); - trace!(target: LOG_TARGET, "Processed {action:?}."); - }, - ChainSyncAction::ImportBlocks { origin, blocks } => { - let count = blocks.len(); - self.import_blocks(origin, blocks); + trace!( + target: LOG_TARGET, + "Processed `ChainSyncAction::ImportBlocks` with {count} blocks.", + ); + }, + SyncingAction::ImportJustifications { peer_id, hash, number, justifications } => { + self.import_justifications(peer_id, hash, number, justifications); - trace!( - target: LOG_TARGET, - "Processed `ChainSyncAction::ImportBlocks` with {count} blocks.", - ); - }, - ChainSyncAction::ImportJustifications { peer_id, hash, number, justifications } => { - self.import_justifications(peer_id, hash, number, justifications); + trace!( + target: LOG_TARGET, + "Processed `ChainSyncAction::ImportJustifications` from peer {} for block {} ({}).", + peer_id, + hash, + number, + ) + }, + SyncingAction::Finished => { + let connected_peers = self.peers.iter().filter_map(|(peer_id, peer)| { + peer.info.roles.is_full().then_some(( + *peer_id, + peer.info.best_hash, + peer.info.best_number, + )) + }); + self.strategy.switch_to_next( + self.syncing_config.clone(), + self.client.clone(), + connected_peers, + )?; + }, + } + } - trace!( - target: LOG_TARGET, - "Processed `ChainSyncAction::ImportJustifications` from peer {} for block {} ({}).", - peer_id, - hash, - number, - ) - }, - }); + Ok(()) } fn perform_periodic_actions(&mut self) { @@ -824,18 +813,18 @@ where fn process_service_command(&mut self, command: ToServiceCommand) { match command { ToServiceCommand::SetSyncForkRequest(peers, hash, number) => { - self.chain_sync.set_sync_fork_request(peers, &hash, number); + self.strategy.set_sync_fork_request(peers, &hash, number); }, ToServiceCommand::EventStream(tx) => self.event_streams.push(tx), ToServiceCommand::RequestJustification(hash, number) => - self.chain_sync.request_justification(&hash, number), + self.strategy.request_justification(&hash, number), ToServiceCommand::ClearJustificationRequests => - self.chain_sync.clear_justification_requests(), + self.strategy.clear_justification_requests(), ToServiceCommand::BlocksProcessed(imported, count, results) => { - self.chain_sync.on_blocks_processed(imported, count, results); + self.strategy.on_blocks_processed(imported, count, results); }, ToServiceCommand::JustificationImported(peer_id, hash, number, success) => { - self.chain_sync.on_justification_import(hash, number, success); + self.strategy.on_justification_import(hash, number, success); if !success { log::info!( target: LOG_TARGET, @@ -849,9 +838,9 @@ where }, ToServiceCommand::AnnounceBlock(hash, data) => self.announce_block(hash, data), ToServiceCommand::NewBestBlockImported(hash, number) => { - log::debug!(target: "sync", "New best block imported {:?}/#{}", hash, number); + log::debug!(target: LOG_TARGET, "New best block imported {:?}/#{}", hash, number); - self.chain_sync.update_chain_info(&hash, number); + self.strategy.update_chain_info(&hash, number); let _ = self.notification_service.try_set_handshake( BlockAnnouncesHandshake::::build( self.roles, @@ -863,7 +852,7 @@ where ); }, ToServiceCommand::Status(tx) => { - let mut status = self.chain_sync.status(); + let mut status = self.strategy.status(); status.num_connected_peers = self.peers.len() as u32; let _ = tx.send(status); }, @@ -871,22 +860,22 @@ where let _ = tx.send(self.num_active_peers()); }, ToServiceCommand::SyncState(tx) => { - let _ = tx.send(self.chain_sync.status()); + let _ = tx.send(self.strategy.status()); }, ToServiceCommand::BestSeenBlock(tx) => { - let _ = tx.send(self.chain_sync.status().best_seen_block); + let _ = tx.send(self.strategy.status().best_seen_block); }, ToServiceCommand::NumSyncPeers(tx) => { - let _ = tx.send(self.chain_sync.status().num_peers); + let _ = tx.send(self.strategy.status().num_peers); }, ToServiceCommand::NumQueuedBlocks(tx) => { - let _ = tx.send(self.chain_sync.status().queued_blocks); + let _ = tx.send(self.strategy.status().queued_blocks); }, ToServiceCommand::NumDownloadedBlocks(tx) => { - let _ = tx.send(self.chain_sync.num_downloaded_blocks()); + let _ = tx.send(self.strategy.num_downloaded_blocks()); }, ToServiceCommand::NumSyncRequests(tx) => { - let _ = tx.send(self.chain_sync.num_sync_requests()); + let _ = tx.send(self.strategy.num_sync_requests()); }, ToServiceCommand::PeersInfo(tx) => { let peers_info = self @@ -897,7 +886,7 @@ where let _ = tx.send(peers_info); }, ToServiceCommand::OnBlockFinalized(hash, header) => - self.chain_sync.on_block_finalized(&hash, *header.number()), + self.strategy.on_block_finalized(&hash, *header.number()), } } @@ -961,11 +950,18 @@ where fn pass_warp_sync_target_block_header(&mut self, header: Result) { match header { - Ok(header) => { - self.chain_sync.set_warp_sync_target_block(header); - }, + Ok(header) => + if let SyncingStrategy::WarpSyncStrategy(warp_sync) = &mut self.strategy { + warp_sync.set_target_block(header); + } else { + error!( + target: LOG_TARGET, + "Cannot set warp sync target block: no warp sync strategy is active." + ); + debug_assert!(false); + }, Err(err) => { - log::error!( + error!( target: LOG_TARGET, "Failed to get target block for warp sync. Error: {err:?}", ); @@ -1005,7 +1001,7 @@ where } } - self.chain_sync.peer_disconnected(&peer_id); + self.strategy.remove_peer(&peer_id); self.pending_responses.remove(&peer_id); self.event_streams .retain(|stream| stream.unbounded_send(SyncEvent::PeerDisconnected(peer_id)).is_ok()); @@ -1091,7 +1087,7 @@ where let this_peer_reserved_slot: usize = if no_slot_peer { 1 } else { 0 }; if handshake.roles.is_full() && - self.chain_sync.num_peers() >= + self.strategy.num_peers() >= self.default_peers_set_num_full + self.default_peers_set_no_slot_connected_peers.len() + this_peer_reserved_slot @@ -1115,7 +1111,7 @@ where // `ChainSync` only accepts full peers whereas `SyncingEngine` accepts both full and light // peers. Verify that there is a slot in `SyncingEngine` for the inbound light peer if handshake.roles.is_light() && - (self.peers.len() - self.chain_sync.num_peers()) >= self.default_peers_set_num_light + (self.peers.len() - self.strategy.num_peers()) >= self.default_peers_set_num_light { log::debug!(target: LOG_TARGET, "Too many light nodes, rejecting {peer_id}"); return Err(false) @@ -1149,7 +1145,10 @@ where inbound: direction.is_inbound(), }; - self.chain_sync.new_peer(peer_id, peer.info.best_hash, peer.info.best_number); + // Only forward full peers to syncing strategy. + if status.roles.is_full() { + self.strategy.add_peer(peer_id, peer.info.best_hash, peer.info.best_number); + } log::debug!(target: LOG_TARGET, "Connected {peer_id}"); @@ -1267,7 +1266,7 @@ where PeerRequest::Block(req) => { match self.block_downloader.block_response_into_blocks(&req, resp) { Ok(blocks) => { - self.chain_sync.on_block_response(peer_id, req, blocks); + self.strategy.on_block_response(peer_id, req, blocks); }, Err(BlockResponseError::DecodeFailed(e)) => { debug!( @@ -1312,10 +1311,10 @@ where }, }; - self.chain_sync.on_state_response(peer_id, response); + self.strategy.on_state_response(peer_id, response); }, PeerRequest::WarpProof => { - self.chain_sync.on_warp_sync_response(&peer_id, EncodedProof(resp)); + self.strategy.on_warp_proof_response(&peer_id, EncodedProof(resp)); }, }, Ok(Err(e)) => { diff --git a/substrate/client/network/sync/src/extra_requests.rs b/substrate/client/network/sync/src/extra_requests.rs index 8edd1a772e2..cd3008d270b 100644 --- a/substrate/client/network/sync/src/extra_requests.rs +++ b/substrate/client/network/sync/src/extra_requests.rs @@ -17,8 +17,9 @@ // along with this program. If not, see . use crate::{ - chain_sync::{PeerSync, PeerSyncState}, request_metrics::Metrics, + strategy::chain_sync::{PeerSync, PeerSyncState}, + LOG_TARGET, }; use fork_tree::ForkTree; use libp2p::PeerId; @@ -102,7 +103,7 @@ impl ExtraRequests { // ignore the `Revert` error. }, Err(err) => { - debug!(target: "sync", "Failed to insert request {:?} into tree: {}", request, err); + debug!(target: LOG_TARGET, "Failed to insert request {:?} into tree: {}", request, err); }, _ => (), } @@ -126,7 +127,7 @@ impl ExtraRequests { // messages to chain sync. if let Some(request) = self.active_requests.remove(&who) { if let Some(r) = resp { - trace!(target: "sync", + trace!(target: LOG_TARGET, "Queuing import of {} from {:?} for {:?}", self.request_type_name, who, request, ); @@ -134,7 +135,7 @@ impl ExtraRequests { self.importing_requests.insert(request); return Some((who, request.0, request.1, r)) } else { - trace!(target: "sync", + trace!(target: LOG_TARGET, "Empty {} response from {:?} for {:?}", self.request_type_name, who, request, ); @@ -142,7 +143,7 @@ impl ExtraRequests { self.failed_requests.entry(request).or_default().push((who, Instant::now())); self.pending_requests.push_front(request); } else { - trace!(target: "sync", + trace!(target: LOG_TARGET, "No active {} request to {:?}", self.request_type_name, who, ); @@ -217,7 +218,7 @@ impl ExtraRequests { }; if self.tree.finalize_root(&finalized_hash).is_none() { - warn!(target: "sync", + warn!(target: LOG_TARGET, "‼️ Imported {:?} {:?} which isn't a root in the tree: {:?}", finalized_hash, finalized_number, self.tree.roots().collect::>() ); @@ -322,7 +323,7 @@ impl<'a, B: BlockT> Matcher<'a, B> { } self.extras.active_requests.insert(*peer, request); - trace!(target: "sync", + trace!(target: LOG_TARGET, "Sending {} request to {:?} for {:?}", self.extras.request_type_name, peer, request, ); @@ -345,7 +346,7 @@ impl<'a, B: BlockT> Matcher<'a, B> { #[cfg(test)] mod tests { use super::*; - use crate::chain_sync::PeerSync; + use crate::strategy::chain_sync::PeerSync; use quickcheck::{Arbitrary, Gen, QuickCheck}; use sp_blockchain::Error as ClientError; use sp_test_primitives::{Block, BlockNumber, Hash}; diff --git a/substrate/client/network/sync/src/lib.rs b/substrate/client/network/sync/src/lib.rs index 1a7e773c95f..494e3b87aa9 100644 --- a/substrate/client/network/sync/src/lib.rs +++ b/substrate/client/network/sync/src/lib.rs @@ -19,10 +19,10 @@ //! Blockchain syncing implementation in Substrate. pub use service::syncing_service::SyncingService; +pub use strategy::warp::{WarpSyncParams, WarpSyncPhase, WarpSyncProgress}; pub use types::{SyncEvent, SyncEventStream, SyncState, SyncStatus, SyncStatusProvider}; mod block_announce_validator; -mod chain_sync; mod extra_requests; mod futures_stream; mod pending_responses; @@ -36,7 +36,9 @@ pub mod blocks; pub mod engine; pub mod mock; pub mod service; -pub mod state; pub mod state_request_handler; -pub mod warp; +pub mod strategy; pub mod warp_request_handler; + +/// Log target for this crate. +const LOG_TARGET: &str = "sync"; diff --git a/substrate/client/network/sync/src/pending_responses.rs b/substrate/client/network/sync/src/pending_responses.rs index e21a5763225..21e409eb847 100644 --- a/substrate/client/network/sync/src/pending_responses.rs +++ b/substrate/client/network/sync/src/pending_responses.rs @@ -19,7 +19,7 @@ //! [`PendingResponses`] is responsible for keeping track of pending responses and //! polling them. [`Stream`] implemented by [`PendingResponses`] never terminates. -use crate::types::PeerRequest; +use crate::{types::PeerRequest, LOG_TARGET}; use futures::{ channel::oneshot, future::BoxFuture, @@ -33,9 +33,6 @@ use sp_runtime::traits::Block as BlockT; use std::task::{Context, Poll, Waker}; use tokio_stream::StreamMap; -/// Log target for this file. -const LOG_TARGET: &'static str = "sync"; - /// Response result. type ResponseResult = Result, ProtocolName), RequestFailure>, oneshot::Canceled>; diff --git a/substrate/client/network/sync/src/state_request_handler.rs b/substrate/client/network/sync/src/state_request_handler.rs index f78fadccc2d..6bd2389fb5d 100644 --- a/substrate/client/network/sync/src/state_request_handler.rs +++ b/substrate/client/network/sync/src/state_request_handler.rs @@ -17,7 +17,10 @@ //! Helper for handling (i.e. answering) state requests from a remote peer via the //! `crate::request_responses::RequestResponsesBehaviour`. -use crate::schema::v1::{KeyValueStateEntry, StateEntry, StateRequest, StateResponse}; +use crate::{ + schema::v1::{KeyValueStateEntry, StateEntry, StateRequest, StateResponse}, + LOG_TARGET, +}; use codec::{Decode, Encode}; use futures::{channel::oneshot, stream::StreamExt}; @@ -39,7 +42,6 @@ use std::{ time::Duration, }; -const LOG_TARGET: &str = "sync"; const MAX_RESPONSE_BYTES: usize = 2 * 1024 * 1024; // Actual reponse may be bigger. const MAX_NUMBER_OF_SAME_REQUESTS_PER_PEER: usize = 2; diff --git a/substrate/client/network/sync/src/strategy.rs b/substrate/client/network/sync/src/strategy.rs new file mode 100644 index 00000000000..ee99252fc91 --- /dev/null +++ b/substrate/client/network/sync/src/strategy.rs @@ -0,0 +1,489 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//! [`SyncingStrategy`] is a proxy between [`crate::engine::SyncingEngine`] +//! and specific syncing algorithms. + +pub mod chain_sync; +mod state; +pub mod state_sync; +pub mod warp; + +use crate::{ + types::{BadPeer, OpaqueStateRequest, OpaqueStateResponse, SyncStatus}, + LOG_TARGET, +}; +use chain_sync::{ChainSync, ChainSyncAction, ChainSyncMode}; +use libp2p::PeerId; +use log::{error, info}; +use prometheus_endpoint::Registry; +use sc_client_api::{BlockBackend, ProofProvider}; +use sc_consensus::{BlockImportError, BlockImportStatus, IncomingBlock}; +use sc_network_common::sync::{ + message::{BlockAnnounce, BlockData, BlockRequest}, + SyncMode, +}; +use sp_blockchain::{Error as ClientError, HeaderBackend, HeaderMetadata}; +use sp_consensus::BlockOrigin; +use sp_runtime::{ + traits::{Block as BlockT, NumberFor}, + Justifications, +}; +use state::{StateStrategy, StateStrategyAction}; +use std::sync::Arc; +use warp::{EncodedProof, WarpProofRequest, WarpSync, WarpSyncAction, WarpSyncConfig}; + +/// Corresponding `ChainSync` mode. +fn chain_sync_mode(sync_mode: SyncMode) -> ChainSyncMode { + match sync_mode { + SyncMode::Full => ChainSyncMode::Full, + SyncMode::LightState { skip_proofs, storage_chain_mode } => + ChainSyncMode::LightState { skip_proofs, storage_chain_mode }, + SyncMode::Warp => ChainSyncMode::Full, + } +} + +/// Syncing configuration containing data for all strategies. +#[derive(Clone, Debug)] +pub struct SyncingConfig { + /// Syncing mode. + pub mode: SyncMode, + /// The number of parallel downloads to guard against slow peers. + pub max_parallel_downloads: u32, + /// Maximum number of blocks to request. + pub max_blocks_per_request: u32, + /// Prometheus metrics registry. + pub metrics_registry: Option, +} + +#[derive(Debug)] +pub enum SyncingAction { + /// Send block request to peer. Always implies dropping a stale block request to the same peer. + SendBlockRequest { peer_id: PeerId, request: BlockRequest }, + /// Drop stale block request. + CancelBlockRequest { peer_id: PeerId }, + /// Send state request to peer. + SendStateRequest { peer_id: PeerId, request: OpaqueStateRequest }, + /// Send warp proof request to peer. + SendWarpProofRequest { peer_id: PeerId, request: WarpProofRequest }, + /// Peer misbehaved. Disconnect, report it and cancel any requests to it. + DropPeer(BadPeer), + /// Import blocks. + ImportBlocks { origin: BlockOrigin, blocks: Vec> }, + /// Import justifications. + ImportJustifications { + peer_id: PeerId, + hash: B::Hash, + number: NumberFor, + justifications: Justifications, + }, + /// Syncing strategy has finished. + Finished, +} + +/// Proxy to specific syncing strategies. +pub enum SyncingStrategy { + WarpSyncStrategy(WarpSync), + StateSyncStrategy(StateStrategy), + ChainSyncStrategy(ChainSync), +} + +impl SyncingStrategy +where + B: BlockT, + Client: HeaderBackend + + BlockBackend + + HeaderMetadata + + ProofProvider + + Send + + Sync + + 'static, +{ + /// Initialize a new syncing startegy. + pub fn new( + config: SyncingConfig, + client: Arc, + warp_sync_config: Option>, + ) -> Result { + if let SyncMode::Warp = config.mode { + let warp_sync_config = warp_sync_config + .expect("Warp sync configuration must be supplied in warp sync mode."); + Ok(Self::WarpSyncStrategy(WarpSync::new(client.clone(), warp_sync_config))) + } else { + Ok(Self::ChainSyncStrategy(ChainSync::new( + chain_sync_mode(config.mode), + client.clone(), + config.max_parallel_downloads, + config.max_blocks_per_request, + config.metrics_registry, + )?)) + } + } + + /// Notify that a new peer has connected. + pub fn add_peer(&mut self, peer_id: PeerId, best_hash: B::Hash, best_number: NumberFor) { + match self { + SyncingStrategy::WarpSyncStrategy(strategy) => + strategy.add_peer(peer_id, best_hash, best_number), + SyncingStrategy::StateSyncStrategy(strategy) => + strategy.add_peer(peer_id, best_hash, best_number), + SyncingStrategy::ChainSyncStrategy(strategy) => + strategy.add_peer(peer_id, best_hash, best_number), + } + } + + /// Notify that a peer has disconnected. + pub fn remove_peer(&mut self, peer_id: &PeerId) { + match self { + SyncingStrategy::WarpSyncStrategy(strategy) => strategy.remove_peer(peer_id), + SyncingStrategy::StateSyncStrategy(strategy) => strategy.remove_peer(peer_id), + SyncingStrategy::ChainSyncStrategy(strategy) => strategy.remove_peer(peer_id), + } + } + + /// Submit a validated block announcement. + /// + /// Returns new best hash & best number of the peer if they are updated. + pub fn on_validated_block_announce( + &mut self, + is_best: bool, + peer_id: PeerId, + announce: &BlockAnnounce, + ) -> Option<(B::Hash, NumberFor)> { + match self { + SyncingStrategy::WarpSyncStrategy(strategy) => + strategy.on_validated_block_announce(is_best, peer_id, announce), + SyncingStrategy::StateSyncStrategy(strategy) => + strategy.on_validated_block_announce(is_best, peer_id, announce), + SyncingStrategy::ChainSyncStrategy(strategy) => + strategy.on_validated_block_announce(is_best, peer_id, announce), + } + } + + /// Configure an explicit fork sync request in case external code has detected that there is a + /// stale fork missing. + pub fn set_sync_fork_request( + &mut self, + peers: Vec, + hash: &B::Hash, + number: NumberFor, + ) { + match self { + SyncingStrategy::WarpSyncStrategy(_) => {}, + SyncingStrategy::StateSyncStrategy(_) => {}, + SyncingStrategy::ChainSyncStrategy(strategy) => + strategy.set_sync_fork_request(peers, hash, number), + } + } + + /// Request extra justification. + pub fn request_justification(&mut self, hash: &B::Hash, number: NumberFor) { + match self { + SyncingStrategy::WarpSyncStrategy(_) => {}, + SyncingStrategy::StateSyncStrategy(_) => {}, + SyncingStrategy::ChainSyncStrategy(strategy) => + strategy.request_justification(hash, number), + } + } + + /// Clear extra justification requests. + pub fn clear_justification_requests(&mut self) { + match self { + SyncingStrategy::WarpSyncStrategy(_) => {}, + SyncingStrategy::StateSyncStrategy(_) => {}, + SyncingStrategy::ChainSyncStrategy(strategy) => strategy.clear_justification_requests(), + } + } + + /// Report a justification import (successful or not). + pub fn on_justification_import(&mut self, hash: B::Hash, number: NumberFor, success: bool) { + match self { + SyncingStrategy::WarpSyncStrategy(_) => {}, + SyncingStrategy::StateSyncStrategy(_) => {}, + SyncingStrategy::ChainSyncStrategy(strategy) => + strategy.on_justification_import(hash, number, success), + } + } + + /// Process block response. + pub fn on_block_response( + &mut self, + peer_id: PeerId, + request: BlockRequest, + blocks: Vec>, + ) { + match self { + SyncingStrategy::WarpSyncStrategy(strategy) => + strategy.on_block_response(peer_id, request, blocks), + SyncingStrategy::StateSyncStrategy(_) => {}, + SyncingStrategy::ChainSyncStrategy(strategy) => + strategy.on_block_response(peer_id, request, blocks), + } + } + + /// Process state response. + pub fn on_state_response(&mut self, peer_id: PeerId, response: OpaqueStateResponse) { + match self { + SyncingStrategy::WarpSyncStrategy(_) => {}, + SyncingStrategy::StateSyncStrategy(strategy) => + strategy.on_state_response(peer_id, response), + SyncingStrategy::ChainSyncStrategy(strategy) => + strategy.on_state_response(peer_id, response), + } + } + + /// Process warp proof response. + pub fn on_warp_proof_response(&mut self, peer_id: &PeerId, response: EncodedProof) { + match self { + SyncingStrategy::WarpSyncStrategy(strategy) => + strategy.on_warp_proof_response(peer_id, response), + SyncingStrategy::StateSyncStrategy(_) => {}, + SyncingStrategy::ChainSyncStrategy(_) => {}, + } + } + + /// A batch of blocks have been processed, with or without errors. + pub fn on_blocks_processed( + &mut self, + imported: usize, + count: usize, + results: Vec<(Result>, BlockImportError>, B::Hash)>, + ) { + match self { + SyncingStrategy::WarpSyncStrategy(_) => {}, + SyncingStrategy::StateSyncStrategy(strategy) => + strategy.on_blocks_processed(imported, count, results), + SyncingStrategy::ChainSyncStrategy(strategy) => + strategy.on_blocks_processed(imported, count, results), + } + } + + /// Notify a syncing strategy that a block has been finalized. + pub fn on_block_finalized(&mut self, hash: &B::Hash, number: NumberFor) { + match self { + SyncingStrategy::WarpSyncStrategy(_) => {}, + SyncingStrategy::StateSyncStrategy(_) => {}, + SyncingStrategy::ChainSyncStrategy(strategy) => + strategy.on_block_finalized(hash, number), + } + } + + /// Inform sync about a new best imported block. + pub fn update_chain_info(&mut self, best_hash: &B::Hash, best_number: NumberFor) { + match self { + SyncingStrategy::WarpSyncStrategy(_) => {}, + SyncingStrategy::StateSyncStrategy(_) => {}, + SyncingStrategy::ChainSyncStrategy(strategy) => + strategy.update_chain_info(best_hash, best_number), + } + } + + // Are we in major sync mode? + pub fn is_major_syncing(&self) -> bool { + match self { + SyncingStrategy::WarpSyncStrategy(_) => true, + SyncingStrategy::StateSyncStrategy(_) => true, + SyncingStrategy::ChainSyncStrategy(strategy) => + strategy.status().state.is_major_syncing(), + } + } + + /// Get the number of peers known to the syncing strategy. + pub fn num_peers(&self) -> usize { + match self { + SyncingStrategy::WarpSyncStrategy(strategy) => strategy.num_peers(), + SyncingStrategy::StateSyncStrategy(strategy) => strategy.num_peers(), + SyncingStrategy::ChainSyncStrategy(strategy) => strategy.num_peers(), + } + } + + /// Returns the current sync status. + pub fn status(&self) -> SyncStatus { + match self { + SyncingStrategy::WarpSyncStrategy(strategy) => strategy.status(), + SyncingStrategy::StateSyncStrategy(strategy) => strategy.status(), + SyncingStrategy::ChainSyncStrategy(strategy) => strategy.status(), + } + } + + /// Get the total number of downloaded blocks. + pub fn num_downloaded_blocks(&self) -> usize { + match self { + SyncingStrategy::WarpSyncStrategy(_) => 0, + SyncingStrategy::StateSyncStrategy(_) => 0, + SyncingStrategy::ChainSyncStrategy(strategy) => strategy.num_downloaded_blocks(), + } + } + + /// Get an estimate of the number of parallel sync requests. + pub fn num_sync_requests(&self) -> usize { + match self { + SyncingStrategy::WarpSyncStrategy(_) => 0, + SyncingStrategy::StateSyncStrategy(_) => 0, + SyncingStrategy::ChainSyncStrategy(strategy) => strategy.num_sync_requests(), + } + } + + /// Report Prometheus metrics + pub fn report_metrics(&self) { + match self { + SyncingStrategy::WarpSyncStrategy(_) => {}, + SyncingStrategy::StateSyncStrategy(_) => {}, + SyncingStrategy::ChainSyncStrategy(strategy) => strategy.report_metrics(), + } + } + + /// Get actions that should be performed by the owner on the strategy's behalf + #[must_use] + pub fn actions(&mut self) -> Box>> { + match self { + SyncingStrategy::WarpSyncStrategy(strategy) => + Box::new(strategy.actions().map(|action| match action { + WarpSyncAction::SendWarpProofRequest { peer_id, request } => + SyncingAction::SendWarpProofRequest { peer_id, request }, + WarpSyncAction::SendBlockRequest { peer_id, request } => + SyncingAction::SendBlockRequest { peer_id, request }, + WarpSyncAction::DropPeer(bad_peer) => SyncingAction::DropPeer(bad_peer), + WarpSyncAction::Finished => SyncingAction::Finished, + })), + SyncingStrategy::StateSyncStrategy(strategy) => + Box::new(strategy.actions().map(|action| match action { + StateStrategyAction::SendStateRequest { peer_id, request } => + SyncingAction::SendStateRequest { peer_id, request }, + StateStrategyAction::DropPeer(bad_peer) => SyncingAction::DropPeer(bad_peer), + StateStrategyAction::ImportBlocks { origin, blocks } => + SyncingAction::ImportBlocks { origin, blocks }, + StateStrategyAction::Finished => SyncingAction::Finished, + })), + SyncingStrategy::ChainSyncStrategy(strategy) => + Box::new(strategy.actions().map(|action| match action { + ChainSyncAction::SendBlockRequest { peer_id, request } => + SyncingAction::SendBlockRequest { peer_id, request }, + ChainSyncAction::CancelBlockRequest { peer_id } => + SyncingAction::CancelBlockRequest { peer_id }, + ChainSyncAction::SendStateRequest { peer_id, request } => + SyncingAction::SendStateRequest { peer_id, request }, + ChainSyncAction::DropPeer(bad_peer) => SyncingAction::DropPeer(bad_peer), + ChainSyncAction::ImportBlocks { origin, blocks } => + SyncingAction::ImportBlocks { origin, blocks }, + ChainSyncAction::ImportJustifications { + peer_id, + hash, + number, + justifications, + } => SyncingAction::ImportJustifications { + peer_id, + hash, + number, + justifications, + }, + })), + } + } + + /// Switch to next strategy if the active one finished. + pub fn switch_to_next( + &mut self, + config: SyncingConfig, + client: Arc, + connected_peers: impl Iterator)>, + ) -> Result<(), ClientError> { + match self { + Self::WarpSyncStrategy(warp_sync) => { + match warp_sync.take_result() { + Some(res) => { + info!( + target: LOG_TARGET, + "Warp sync is complete, continuing with state sync." + ); + let state_sync = StateStrategy::new( + client, + res.target_header, + res.target_body, + res.target_justifications, + // skip proofs, only set to `true` in `FastUnsafe` sync mode + false, + connected_peers + .map(|(peer_id, _best_hash, best_number)| (peer_id, best_number)), + ); + + *self = Self::StateSyncStrategy(state_sync); + }, + None => { + error!( + target: LOG_TARGET, + "Warp sync failed. Falling back to full sync." + ); + let mut chain_sync = match ChainSync::new( + chain_sync_mode(config.mode), + client, + config.max_parallel_downloads, + config.max_blocks_per_request, + config.metrics_registry, + ) { + Ok(chain_sync) => chain_sync, + Err(e) => { + error!(target: LOG_TARGET, "Failed to start `ChainSync`."); + return Err(e) + }, + }; + // Let `ChainSync` know about connected peers. + connected_peers.into_iter().for_each( + |(peer_id, best_hash, best_number)| { + chain_sync.add_peer(peer_id, best_hash, best_number) + }, + ); + + *self = Self::ChainSyncStrategy(chain_sync); + }, + } + }, + Self::StateSyncStrategy(state_sync) => { + if state_sync.is_succeded() { + info!(target: LOG_TARGET, "State sync is complete, continuing with block sync."); + } else { + error!(target: LOG_TARGET, "State sync failed. Falling back to full sync."); + } + let mut chain_sync = match ChainSync::new( + chain_sync_mode(config.mode), + client, + config.max_parallel_downloads, + config.max_blocks_per_request, + config.metrics_registry, + ) { + Ok(chain_sync) => chain_sync, + Err(e) => { + error!(target: LOG_TARGET, "Failed to start `ChainSync`."); + return Err(e); + }, + }; + // Let `ChainSync` know about connected peers. + connected_peers.into_iter().for_each(|(peer_id, best_hash, best_number)| { + chain_sync.add_peer(peer_id, best_hash, best_number) + }); + + *self = Self::ChainSyncStrategy(chain_sync); + }, + Self::ChainSyncStrategy(_) => { + error!(target: LOG_TARGET, "`ChainSyncStrategy` is final startegy, cannot switch to next."); + debug_assert!(false); + }, + } + Ok(()) + } +} diff --git a/substrate/client/network/sync/src/chain_sync.rs b/substrate/client/network/sync/src/strategy/chain_sync.rs similarity index 85% rename from substrate/client/network/sync/src/chain_sync.rs rename to substrate/client/network/sync/src/strategy/chain_sync.rs index 3825cfa33f7..62c260d582b 100644 --- a/substrate/client/network/sync/src/chain_sync.rs +++ b/substrate/client/network/sync/src/strategy/chain_sync.rs @@ -32,21 +32,18 @@ use crate::{ blocks::BlockCollection, extra_requests::ExtraRequests, schema::v1::StateResponse, - state::{ImportResult, StateSync}, - types::{ - BadPeer, Metrics, OpaqueStateRequest, OpaqueStateResponse, PeerInfo, SyncMode, SyncState, - SyncStatus, - }, - warp::{ - self, EncodedProof, WarpProofImportResult, WarpProofRequest, WarpSync, WarpSyncConfig, - WarpSyncPhase, WarpSyncProgress, + strategy::{ + state_sync::{ImportResult, StateSync, StateSyncProvider}, + warp::{WarpSyncPhase, WarpSyncProgress}, }, + types::{BadPeer, OpaqueStateRequest, OpaqueStateResponse, SyncState, SyncStatus}, + LOG_TARGET, }; use codec::Encode; use libp2p::PeerId; use log::{debug, error, info, trace, warn}; - +use prometheus_endpoint::{register, Gauge, GaugeVec, Opts, PrometheusError, Registry, U64}; use sc_client_api::{BlockBackend, ProofProvider}; use sc_consensus::{BlockImportError, BlockImportStatus, IncomingBlock}; use sc_network_common::sync::message::{ @@ -72,9 +69,6 @@ use std::{ #[cfg(test)] mod test; -/// Log target for this file. -const LOG_TARGET: &'static str = "sync"; - /// Maximum blocks to store in the import queue. const MAX_IMPORTING_BLOCKS: usize = 2048; @@ -95,9 +89,6 @@ const STATE_SYNC_FINALITY_THRESHOLD: u32 = 8; /// so far behind. const MAJOR_SYNC_BLOCKS: u8 = 5; -/// Number of peers that need to be connected before warp sync is started. -const MIN_PEERS_TO_START_WARP_SYNC: usize = 3; - mod rep { use sc_network::ReputationChange as Rep; /// Reputation change when a peer sent us a message that led to a @@ -133,6 +124,38 @@ mod rep { pub const BAD_RESPONSE: Rep = Rep::new(-(1 << 12), "Incomplete response"); } +struct Metrics { + queued_blocks: Gauge, + fork_targets: Gauge, + justifications: GaugeVec, +} + +impl Metrics { + fn register(r: &Registry) -> Result { + Ok(Self { + queued_blocks: { + let g = + Gauge::new("substrate_sync_queued_blocks", "Number of blocks in import queue")?; + register(g, r)? + }, + fork_targets: { + let g = Gauge::new("substrate_sync_fork_targets", "Number of fork sync targets")?; + register(g, r)? + }, + justifications: { + let g = GaugeVec::new( + Opts::new( + "substrate_sync_extra_justifications", + "Number of extra justifications requests", + ), + &["status"], + )?; + register(g, r)? + }, + }) + } +} + enum AllowedRequests { Some(HashSet), All, @@ -193,8 +216,6 @@ pub enum ChainSyncAction { CancelBlockRequest { peer_id: PeerId }, /// Send state request to peer. SendStateRequest { peer_id: PeerId, request: OpaqueStateRequest }, - /// Send warp proof request to peer. - SendWarpProofRequest { peer_id: PeerId, request: WarpProofRequest }, /// Peer misbehaved. Disconnect, report it and cancel the block request to it. DropPeer(BadPeer), /// Import blocks. @@ -208,6 +229,20 @@ pub enum ChainSyncAction { }, } +/// Sync operation mode. +#[derive(Copy, Clone, Debug, Eq, PartialEq)] +pub enum ChainSyncMode { + /// Full block download and verification. + Full, + /// Download blocks and the latest state. + LightState { + /// Skip state proof download and verification. + skip_proofs: bool, + /// Download indexed transactions for recent blocks. + storage_chain_mode: bool, + }, +} + /// The main data structure which contains all the state for a chains /// active syncing strategy. pub struct ChainSync { @@ -222,7 +257,7 @@ pub struct ChainSync { /// The best block hash in our queue of blocks to import best_queued_hash: B::Hash, /// Current mode (full/light) - mode: SyncMode, + mode: ChainSyncMode, /// Any extra justification requests. extra_justifications: ExtraRequests, /// A set of hashes of blocks that are being downloaded or have been @@ -240,14 +275,6 @@ pub struct ChainSync { downloaded_blocks: usize, /// State sync in progress, if any. state_sync: Option>, - /// Warp sync in progress, if any. - warp_sync: Option>, - /// Warp sync configuration. - /// - /// Will be `None` after `self.warp_sync` is `Some(_)`. - warp_sync_config: Option>, - /// A temporary storage for warp sync target block until warp sync is initialized. - warp_sync_target_block_header: Option, /// Enable importing existing blocks. This is used used after the state download to /// catch up to the latest state while re-importing blocks. import_existing: bool, @@ -255,6 +282,8 @@ pub struct ChainSync { gap_sync: Option>, /// Pending actions. actions: Vec>, + /// Prometheus metrics. + metrics: Option, } /// All the data we have about a Peer that we are trying to sync with @@ -316,10 +345,6 @@ pub(crate) enum PeerSyncState { DownloadingJustification(B::Hash), /// Downloading state. DownloadingState, - /// Downloading warp proof. - DownloadingWarpProof, - /// Downloading warp sync target block. - DownloadingWarpTargetBlock, /// Actively downloading block history after warp sync. DownloadingGap(NumberFor), } @@ -343,11 +368,11 @@ where { /// Create a new instance. pub fn new( - mode: SyncMode, + mode: ChainSyncMode, client: Arc, max_parallel_downloads: u32, max_blocks_per_request: u32, - warp_sync_config: Option>, + metrics_registry: Option, ) -> Result { let mut sync = Self { client, @@ -364,25 +389,25 @@ where max_blocks_per_request, downloaded_blocks: 0, state_sync: None, - warp_sync: None, import_existing: false, gap_sync: None, - warp_sync_config, - warp_sync_target_block_header: None, actions: Vec::new(), + metrics: metrics_registry.and_then(|r| match Metrics::register(&r) { + Ok(metrics) => Some(metrics), + Err(err) => { + log::error!( + target: LOG_TARGET, + "Failed to register `ChainSync` metrics {err:?}", + ); + None + }, + }), }; sync.reset_sync_start_point()?; Ok(sync) } - /// Get peer's best hash & number. - pub fn peer_info(&self, peer_id: &PeerId) -> Option> { - self.peers - .get(peer_id) - .map(|p| PeerInfo { best_hash: p.best_hash, best_number: p.best_number }) - } - /// Returns the current sync status. pub fn status(&self) -> SyncStatus { let median_seen = self.median_seen(); @@ -407,20 +432,10 @@ where SyncState::Idle }; - let warp_sync_progress = match (&self.warp_sync, &self.mode, &self.gap_sync) { - (_, _, Some(gap_sync)) => Some(WarpSyncProgress { - phase: WarpSyncPhase::DownloadingBlocks(gap_sync.best_queued_number), - total_bytes: 0, - }), - (None, SyncMode::Warp, _) => Some(WarpSyncProgress { - phase: WarpSyncPhase::AwaitingPeers { - required_peers: MIN_PEERS_TO_START_WARP_SYNC, - }, - total_bytes: 0, - }), - (Some(sync), _, _) => Some(sync.progress()), - _ => None, - }; + let warp_sync_progress = self.gap_sync.as_ref().map(|gap_sync| WarpSyncProgress { + phase: WarpSyncPhase::DownloadingBlocks(gap_sync.best_queued_number), + total_bytes: 0, + }); SyncStatus { state: sync_state, @@ -452,8 +467,8 @@ where } /// Notify syncing state machine that a new sync peer has connected. - pub fn new_peer(&mut self, peer_id: PeerId, best_hash: B::Hash, best_number: NumberFor) { - match self.new_peer_inner(peer_id, best_hash, best_number) { + pub fn add_peer(&mut self, peer_id: PeerId, best_hash: B::Hash, best_number: NumberFor) { + match self.add_peer_inner(peer_id, best_hash, best_number) { Ok(Some(request)) => self.actions.push(ChainSyncAction::SendBlockRequest { peer_id, request }), Ok(None) => {}, @@ -462,7 +477,7 @@ where } #[must_use] - fn new_peer_inner( + fn add_peer_inner( &mut self, peer_id: PeerId, best_hash: B::Hash, @@ -471,7 +486,7 @@ where // There is nothing sync can get from the node that has no blockchain data. match self.block_status(&best_hash) { Err(e) => { - debug!(target:LOG_TARGET, "Error reading blockchain: {e}"); + debug!(target: LOG_TARGET, "Error reading blockchain: {e}"); Err(BadPeer(peer_id, rep::BLOCKCHAIN_READ_ERROR)) }, Ok(BlockStatus::KnownBad) => { @@ -494,7 +509,7 @@ where // an ancestor search, which is what we do in the next match case below. if self.queue_blocks.len() > MAJOR_SYNC_BLOCKS.into() { debug!( - target:LOG_TARGET, + target: LOG_TARGET, "New peer {} with unknown best hash {} ({}), assuming common block.", peer_id, self.best_queued_hash, @@ -516,7 +531,7 @@ where // If we are at genesis, just start downloading. let (state, req) = if self.best_queued_number.is_zero() { debug!( - target:LOG_TARGET, + target: LOG_TARGET, "New peer {peer_id} with best hash {best_hash} ({best_number}).", ); @@ -525,7 +540,7 @@ where let common_best = std::cmp::min(self.best_queued_number, best_number); debug!( - target:LOG_TARGET, + target: LOG_TARGET, "New peer {} with unknown best hash {} ({}), searching for common ancestor.", peer_id, best_hash, @@ -554,20 +569,6 @@ where }, ); - if let SyncMode::Warp = self.mode { - if self.peers.len() >= MIN_PEERS_TO_START_WARP_SYNC && self.warp_sync.is_none() - { - log::debug!(target: LOG_TARGET, "Starting warp state sync."); - - if let Some(config) = self.warp_sync_config.take() { - let mut warp_sync = WarpSync::new(self.client.clone(), config); - if let Some(header) = self.warp_sync_target_block_header.take() { - warp_sync.set_target_block(header); - } - self.warp_sync = Some(warp_sync); - } - } - } Ok(req) }, Ok(BlockStatus::Queued) | @@ -831,7 +832,7 @@ where } if matching_hash.is_none() && current.is_zero() { trace!( - target:LOG_TARGET, + target: LOG_TARGET, "Ancestry search: genesis mismatch for peer {peer_id}", ); return Err(BadPeer(*peer_id, rep::GENESIS_MISMATCH)) @@ -886,43 +887,9 @@ where return Ok(()) } }, - PeerSyncState::DownloadingWarpTargetBlock => { - peer.state = PeerSyncState::Available; - if let Some(warp_sync) = &mut self.warp_sync { - if blocks.len() == 1 { - validate_blocks::(&blocks, peer_id, Some(request))?; - match warp_sync.import_target_block( - blocks.pop().expect("`blocks` len checked above."), - ) { - warp::TargetBlockImportResult::Success => return Ok(()), - warp::TargetBlockImportResult::BadResponse => - return Err(BadPeer(*peer_id, rep::VERIFICATION_FAIL)), - } - } else if blocks.is_empty() { - debug!(target: LOG_TARGET, "Empty block response from {peer_id}"); - return Err(BadPeer(*peer_id, rep::NO_BLOCK)) - } else { - debug!( - target: LOG_TARGET, - "Too many blocks ({}) in warp target block response from {}", - blocks.len(), - peer_id, - ); - return Err(BadPeer(*peer_id, rep::NOT_REQUESTED)) - } - } else { - debug!( - target: LOG_TARGET, - "Logic error: we think we are downloading warp target block from {}, but no warp sync is happening.", - peer_id, - ); - return Ok(()) - } - }, PeerSyncState::Available | PeerSyncState::DownloadingJustification(..) | - PeerSyncState::DownloadingState | - PeerSyncState::DownloadingWarpProof => Vec::new(), + PeerSyncState::DownloadingState => Vec::new(), } } else { // When request.is_none() this is a block announcement. Just accept blocks. @@ -1037,7 +1004,7 @@ where is_descendent_of(&**client, base, block) }); - if let SyncMode::LightState { skip_proofs, .. } = &self.mode { + if let ChainSyncMode::LightState { skip_proofs, .. } = &self.mode { if self.state_sync.is_none() && !self.peers.is_empty() && self.queue_blocks.is_empty() { // Finalized a recent block. let mut heads: Vec<_> = self.peers.values().map(|peer| peer.best_number).collect(); @@ -1071,12 +1038,15 @@ where } /// Submit a validated block announcement. + /// + /// Returns new best hash & best number of the peer if they are updated. + #[must_use] pub fn on_validated_block_announce( &mut self, is_best: bool, peer_id: PeerId, announce: &BlockAnnounce, - ) { + ) -> Option<(B::Hash, NumberFor)> { let number = *announce.header.number(); let hash = announce.header.hash(); let parent_status = @@ -1089,19 +1059,21 @@ where peer } else { error!(target: LOG_TARGET, "💔 Called `on_validated_block_announce` with a bad peer ID"); - return + return Some((hash, number)) }; if let PeerSyncState::AncestorSearch { .. } = peer.state { trace!(target: LOG_TARGET, "Peer {} is in the ancestor search state.", peer_id); - return + return None } - if is_best { + let peer_info = is_best.then(|| { // update their best block peer.best_number = number; peer.best_hash = hash; - } + + (hash, number) + }); // If the announced block is the best they have and is not ahead of us, our common number // is either one further ahead or it's the one they just announced, if we know about it. @@ -1118,27 +1090,27 @@ where // known block case if known || self.is_already_downloading(&hash) { - trace!(target: "sync", "Known block announce from {}: {}", peer_id, hash); + trace!(target: LOG_TARGET, "Known block announce from {}: {}", peer_id, hash); if let Some(target) = self.fork_targets.get_mut(&hash) { target.peers.insert(peer_id); } - return + return peer_info } if ancient_parent { trace!( - target: "sync", + target: LOG_TARGET, "Ignored ancient block announced from {}: {} {:?}", peer_id, hash, announce.header, ); - return + return peer_info } if self.status().state == SyncState::Idle { trace!( - target: "sync", + target: LOG_TARGET, "Added sync target for block announced from {}: {} {:?}", peer_id, hash, @@ -1154,10 +1126,12 @@ where .peers .insert(peer_id); } + + peer_info } /// Notify that a sync peer has disconnected. - pub fn peer_disconnected(&mut self, peer_id: &PeerId) { + pub fn remove_peer(&mut self, peer_id: &PeerId) { self.blocks.clear_peer_download(peer_id); if let Some(gap_sync) = &mut self.gap_sync { gap_sync.blocks.clear_peer_download(peer_id) @@ -1177,12 +1151,33 @@ where } } - /// Get prometheus metrics. - pub fn metrics(&self) -> Metrics { - Metrics { - queued_blocks: self.queue_blocks.len().try_into().unwrap_or(std::u32::MAX), - fork_targets: self.fork_targets.len().try_into().unwrap_or(std::u32::MAX), - justifications: self.extra_justifications.metrics(), + /// Report prometheus metrics. + pub fn report_metrics(&self) { + if let Some(metrics) = &self.metrics { + metrics + .fork_targets + .set(self.fork_targets.len().try_into().unwrap_or(std::u64::MAX)); + metrics + .queued_blocks + .set(self.queue_blocks.len().try_into().unwrap_or(std::u64::MAX)); + + let justifications_metrics = self.extra_justifications.metrics(); + metrics + .justifications + .with_label_values(&["pending"]) + .set(justifications_metrics.pending_requests.into()); + metrics + .justifications + .with_label_values(&["active"]) + .set(justifications_metrics.active_requests.into()); + metrics + .justifications + .with_label_values(&["failed"]) + .set(justifications_metrics.failed_requests.into()); + metrics + .justifications + .with_label_values(&["importing"]) + .set(justifications_metrics.importing_requests.into()); } } @@ -1202,11 +1197,11 @@ where fn required_block_attributes(&self) -> BlockAttributes { match self.mode { - SyncMode::Full => + ChainSyncMode::Full => BlockAttributes::HEADER | BlockAttributes::JUSTIFICATION | BlockAttributes::BODY, - SyncMode::LightState { storage_chain_mode: false, .. } | SyncMode::Warp => + ChainSyncMode::LightState { storage_chain_mode: false, .. } => BlockAttributes::HEADER | BlockAttributes::JUSTIFICATION | BlockAttributes::BODY, - SyncMode::LightState { storage_chain_mode: true, .. } => + ChainSyncMode::LightState { storage_chain_mode: true, .. } => BlockAttributes::HEADER | BlockAttributes::JUSTIFICATION | BlockAttributes::INDEXED_BODY, @@ -1215,9 +1210,8 @@ where fn skip_execution(&self) -> bool { match self.mode { - SyncMode::Full => false, - SyncMode::LightState { .. } => true, - SyncMode::Warp => true, + ChainSyncMode::Full => false, + ChainSyncMode::LightState { .. } => true, } } @@ -1243,7 +1237,7 @@ where .and_then(|b| b.header.as_ref().map(|h| (&b.hash, *h.number()))) { trace!( - target:LOG_TARGET, + target: LOG_TARGET, "Accepted {} blocks ({:?}) with origin {:?}", new_blocks.len(), h, @@ -1336,7 +1330,7 @@ where } // handle peers that were in other states. - let action = match self.new_peer_inner(peer_id, p.best_hash, p.best_number) { + let action = match self.add_peer_inner(peer_id, p.best_hash, p.best_number) { // since the request is not a justification, remove it from pending responses Ok(None) => ChainSyncAction::CancelBlockRequest { peer_id }, // update the request if the new one is available @@ -1353,25 +1347,19 @@ where /// state for. fn reset_sync_start_point(&mut self) -> Result<(), ClientError> { let info = self.client.info(); - if matches!(self.mode, SyncMode::LightState { .. }) && info.finalized_state.is_some() { + if matches!(self.mode, ChainSyncMode::LightState { .. }) && info.finalized_state.is_some() { warn!( target: LOG_TARGET, "Can't use fast sync mode with a partially synced database. Reverting to full sync mode." ); - self.mode = SyncMode::Full; - } - if matches!(self.mode, SyncMode::Warp) && info.finalized_state.is_some() { - warn!( - target: LOG_TARGET, - "Can't use warp sync mode with a partially synced database. Reverting to full sync mode." - ); - self.mode = SyncMode::Full; + self.mode = ChainSyncMode::Full; } + self.import_existing = false; self.best_queued_hash = info.best_hash; self.best_queued_number = info.best_number; - if self.mode == SyncMode::Full && + if self.mode == ChainSyncMode::Full && self.client.block_status(info.best_hash)? != BlockStatus::InChainWithState { self.import_existing = true; @@ -1450,44 +1438,6 @@ where .collect() } - /// Set the warp sync target block externally in case we skip warp proofs downloading. - pub fn set_warp_sync_target_block(&mut self, header: B::Header) { - if let Some(ref mut warp_sync) = self.warp_sync { - warp_sync.set_target_block(header); - } else { - self.warp_sync_target_block_header = Some(header); - } - } - - /// Generate block request for downloading of the target block body during warp sync. - fn warp_target_block_request(&mut self) -> Option<(PeerId, BlockRequest)> { - let sync = &self.warp_sync.as_ref()?; - - if self.allowed_requests.is_empty() || - sync.is_complete() || - self.peers - .iter() - .any(|(_, peer)| peer.state == PeerSyncState::DownloadingWarpTargetBlock) - { - // Only one pending warp target block request is allowed. - return None - } - - if let Some((target_number, request)) = sync.next_target_block_request() { - // Find a random peer that has a block with the target number. - for (id, peer) in self.peers.iter_mut() { - if peer.state.is_available() && peer.best_number >= target_number { - trace!(target: LOG_TARGET, "New warp target block request for {id}"); - peer.state = PeerSyncState::DownloadingWarpTargetBlock; - self.allowed_requests.clear(); - return Some((*id, request)) - } - } - } - - None - } - /// Submit blocks received in a response. pub fn on_block_response( &mut self, @@ -1564,12 +1514,6 @@ where /// Get block requests scheduled by sync to be sent out. fn block_requests(&mut self) -> Vec<(PeerId, BlockRequest)> { - if self.mode == SyncMode::Warp { - return self - .warp_target_block_request() - .map_or_else(|| Vec::new(), |req| Vec::from([req])) - } - if self.allowed_requests.is_empty() || self.state_sync.is_some() { return Vec::new() } @@ -1694,7 +1638,7 @@ where if self.allowed_requests.is_empty() { return None } - if (self.state_sync.is_some() || self.warp_sync.is_some()) && + if self.state_sync.is_some() && self.peers.iter().any(|(_, peer)| peer.state == PeerSyncState::DownloadingState) { // Only one pending state request is allowed. @@ -1706,7 +1650,7 @@ where } for (id, peer) in self.peers.iter_mut() { - if peer.state.is_available() && peer.common_number >= sync.target_block_num() { + if peer.state.is_available() && peer.common_number >= sync.target_number() { peer.state = PeerSyncState::DownloadingState; let request = sync.next_request(); trace!(target: LOG_TARGET, "New StateRequest for {}: {:?}", id, request); @@ -1715,55 +1659,6 @@ where } } } - if let Some(sync) = &self.warp_sync { - if sync.is_complete() { - return None - } - if let (Some(request), Some(target)) = - (sync.next_state_request(), sync.target_block_number()) - { - for (id, peer) in self.peers.iter_mut() { - if peer.state.is_available() && peer.best_number >= target { - trace!(target: LOG_TARGET, "New StateRequest for {id}: {request:?}"); - peer.state = PeerSyncState::DownloadingState; - self.allowed_requests.clear(); - return Some((*id, OpaqueStateRequest(Box::new(request)))) - } - } - } - } - None - } - - /// Get a warp proof request scheduled by sync to be sent out (if any). - fn warp_sync_request(&mut self) -> Option<(PeerId, WarpProofRequest)> { - if let Some(sync) = &self.warp_sync { - if self.allowed_requests.is_empty() || - sync.is_complete() || - self.peers - .iter() - .any(|(_, peer)| peer.state == PeerSyncState::DownloadingWarpProof) - { - // Only one pending state request is allowed. - return None - } - if let Some(request) = sync.next_warp_proof_request() { - let mut targets: Vec<_> = self.peers.values().map(|p| p.best_number).collect(); - if !targets.is_empty() { - targets.sort(); - let median = targets[targets.len() / 2]; - // Find a random peer that is synced as much as peer majority. - for (id, peer) in self.peers.iter_mut() { - if peer.state.is_available() && peer.best_number >= median { - trace!(target: LOG_TARGET, "New WarpProofRequest for {id}"); - peer.state = PeerSyncState::DownloadingWarpProof; - self.allowed_requests.clear(); - return Some((*id, request)) - } - } - } - } - } None } @@ -1797,15 +1692,6 @@ where response.proof.len(), ); sync.import(*response) - } else if let Some(sync) = &mut self.warp_sync { - debug!( - target: LOG_TARGET, - "Importing state data from {} with {} keys, {} proof nodes.", - peer_id, - response.entries.len(), - response.proof.len(), - ); - sync.import_state(*response) } else { debug!(target: LOG_TARGET, "Ignored obsolete state response from {peer_id}"); return Err(BadPeer(*peer_id, rep::NOT_REQUESTED)) @@ -1838,43 +1724,10 @@ where } } - /// Submit a warp proof response received. - pub fn on_warp_sync_response(&mut self, peer_id: &PeerId, response: EncodedProof) { - if let Some(peer) = self.peers.get_mut(peer_id) { - if let PeerSyncState::DownloadingWarpProof = peer.state { - peer.state = PeerSyncState::Available; - self.allowed_requests.set_all(); - } - } - let import_result = if let Some(sync) = &mut self.warp_sync { - debug!( - target: LOG_TARGET, - "Importing warp proof data from {}, {} bytes.", - peer_id, - response.0.len(), - ); - sync.import_warp_proof(response) - } else { - debug!(target: LOG_TARGET, "Ignored obsolete warp sync response from {peer_id}"); - self.actions - .push(ChainSyncAction::DropPeer(BadPeer(*peer_id, rep::NOT_REQUESTED))); - return - }; - - match import_result { - WarpProofImportResult::Success => {}, - WarpProofImportResult::BadResponse => { - debug!(target: LOG_TARGET, "Bad proof data received from {peer_id}"); - self.actions.push(ChainSyncAction::DropPeer(BadPeer(*peer_id, rep::BAD_BLOCK))); - }, - } - } - /// A batch of blocks have been processed, with or without errors. /// /// Call this when a batch of blocks have been processed by the import - /// queue, with or without errors. If an error is returned, the pending response - /// from the peer must be dropped. + /// queue, with or without errors. pub fn on_blocks_processed( &mut self, imported: usize, @@ -1934,7 +1787,7 @@ where self.update_peer_common_number(&peer, number); } let state_sync_complete = - self.state_sync.as_ref().map_or(false, |s| s.target() == hash); + self.state_sync.as_ref().map_or(false, |s| s.target_hash() == hash); if state_sync_complete { info!( target: LOG_TARGET, @@ -1942,21 +1795,7 @@ where self.state_sync.as_ref().map_or(0, |s| s.progress().size / (1024 * 1024)), ); self.state_sync = None; - self.mode = SyncMode::Full; - self.restart(); - } - let warp_sync_complete = self - .warp_sync - .as_ref() - .map_or(false, |s| s.target_block_hash() == Some(hash)); - if warp_sync_complete { - info!( - target: LOG_TARGET, - "Warp sync is complete ({} MiB), restarting block sync.", - self.warp_sync.as_ref().map_or(0, |s| s.progress().total_bytes / (1024 * 1024)), - ); - self.warp_sync = None; - self.mode = SyncMode::Full; + self.mode = ChainSyncMode::Full; self.restart(); } let gap_sync_complete = @@ -2012,7 +1851,6 @@ where e @ Err(BlockImportError::UnknownParent) | e @ Err(BlockImportError::Other(_)) => { warn!(target: LOG_TARGET, "💔 Error importing block {hash:?}: {}", e.unwrap_err()); self.state_sync = None; - self.warp_sync = None; self.restart(); }, Err(BlockImportError::Cancelled) => {}, @@ -2043,12 +1881,6 @@ where .map(|(peer_id, request)| ChainSyncAction::SendStateRequest { peer_id, request }); self.actions.extend(state_request); - let warp_proof_request = self - .warp_sync_request() - .into_iter() - .map(|(peer_id, request)| ChainSyncAction::SendWarpProofRequest { peer_id, request }); - self.actions.extend(warp_proof_request); - std::mem::take(&mut self.actions).into_iter() } @@ -2324,7 +2156,7 @@ where /// Returns the number of the first block in the sequence. /// /// It is expected that `blocks` are in ascending order. -fn validate_blocks( +pub fn validate_blocks( blocks: &Vec>, peer_id: &PeerId, request: Option>, @@ -2389,7 +2221,7 @@ fn validate_blocks( let hash = header.hash(); if hash != b.hash { debug!( - target:LOG_TARGET, + target: LOG_TARGET, "Bad header received from {}. Expected hash {:?}, got {:?}", peer_id, b.hash, @@ -2406,7 +2238,7 @@ fn validate_blocks( ); if expected != got { debug!( - target:LOG_TARGET, + target: LOG_TARGET, "Bad extrinsic root for a block {} received from {}. Expected {:?}, got {:?}", b.hash, peer_id, diff --git a/substrate/client/network/sync/src/chain_sync/test.rs b/substrate/client/network/sync/src/strategy/chain_sync/test.rs similarity index 94% rename from substrate/client/network/sync/src/chain_sync/test.rs rename to substrate/client/network/sync/src/strategy/chain_sync/test.rs index 15b2a95a07c..c89096bc6c9 100644 --- a/substrate/client/network/sync/src/chain_sync/test.rs +++ b/substrate/client/network/sync/src/strategy/chain_sync/test.rs @@ -38,7 +38,7 @@ fn processes_empty_response_on_justification_request_for_unknown_block() { let client = Arc::new(TestClientBuilder::new().build()); let peer_id = PeerId::random(); - let mut sync = ChainSync::new(SyncMode::Full, client.clone(), 1, 64, None).unwrap(); + let mut sync = ChainSync::new(ChainSyncMode::Full, client.clone(), 1, 64, None).unwrap(); let (a1_hash, a1_number) = { let a1 = BlockBuilderBuilder::new(&*client) @@ -53,7 +53,7 @@ fn processes_empty_response_on_justification_request_for_unknown_block() { }; // add a new peer with the same best block - sync.new_peer(peer_id, a1_hash, a1_number); + sync.add_peer(peer_id, a1_hash, a1_number); // and request a justification for the block sync.request_justification(&a1_hash, a1_number); @@ -91,7 +91,7 @@ fn processes_empty_response_on_justification_request_for_unknown_block() { fn restart_doesnt_affect_peers_downloading_finality_data() { let mut client = Arc::new(TestClientBuilder::new().build()); - let mut sync = ChainSync::new(SyncMode::Full, client.clone(), 1, 64, None).unwrap(); + let mut sync = ChainSync::new(ChainSyncMode::Full, client.clone(), 1, 64, None).unwrap(); let peer_id1 = PeerId::random(); let peer_id2 = PeerId::random(); @@ -117,8 +117,8 @@ fn restart_doesnt_affect_peers_downloading_finality_data() { let (b1_hash, b1_number) = new_blocks(50); // add 2 peers at blocks that we don't have locally - sync.new_peer(peer_id1, Hash::random(), 42); - sync.new_peer(peer_id2, Hash::random(), 10); + sync.add_peer(peer_id1, Hash::random(), 42); + sync.add_peer(peer_id2, Hash::random(), 10); // we wil send block requests to these peers // for these blocks we don't know about @@ -128,7 +128,7 @@ fn restart_doesnt_affect_peers_downloading_finality_data() { .all(|(p, _)| { p == peer_id1 || p == peer_id2 })); // add a new peer at a known block - sync.new_peer(peer_id3, b1_hash, b1_number); + sync.add_peer(peer_id3, b1_hash, b1_number); // we request a justification for a block we have locally sync.request_justification(&b1_hash, b1_number); @@ -181,7 +181,7 @@ fn send_block_announce(header: Header, peer_id: PeerId, sync: &mut ChainSync>(); - let mut sync = ChainSync::new(SyncMode::Full, client.clone(), 1, 64, None).unwrap(); + let mut sync = ChainSync::new(ChainSyncMode::Full, client.clone(), 1, 64, None).unwrap(); let peer_id1 = PeerId::random(); let common_block = blocks[1].clone(); // Connect the node we will sync from - sync.new_peer(peer_id1, common_block.hash(), *common_block.header().number()); + sync.add_peer(peer_id1, common_block.hash(), *common_block.header().number()); // Create a "new" header and announce it let mut header = blocks[0].header().clone(); @@ -702,7 +702,7 @@ fn removes_target_fork_on_disconnect() { send_block_announce(header, peer_id1, &mut sync); assert!(sync.fork_targets.len() == 1); - let _ = sync.peer_disconnected(&peer_id1); + let _ = sync.remove_peer(&peer_id1); assert!(sync.fork_targets.len() == 0); } @@ -714,11 +714,11 @@ fn can_import_response_with_missing_blocks() { let empty_client = Arc::new(TestClientBuilder::new().build()); - let mut sync = ChainSync::new(SyncMode::Full, empty_client.clone(), 1, 64, None).unwrap(); + let mut sync = ChainSync::new(ChainSyncMode::Full, empty_client.clone(), 1, 64, None).unwrap(); let peer_id1 = PeerId::random(); let best_block = blocks[3].clone(); - sync.new_peer(peer_id1, best_block.hash(), *best_block.header().number()); + sync.add_peer(peer_id1, best_block.hash(), *best_block.header().number()); sync.peers.get_mut(&peer_id1).unwrap().state = PeerSyncState::Available; sync.peers.get_mut(&peer_id1).unwrap().common_number = 0; @@ -745,7 +745,7 @@ fn ancestor_search_repeat() { #[test] fn sync_restart_removes_block_but_not_justification_requests() { let mut client = Arc::new(TestClientBuilder::new().build()); - let mut sync = ChainSync::new(SyncMode::Full, client.clone(), 1, 64, None).unwrap(); + let mut sync = ChainSync::new(ChainSyncMode::Full, client.clone(), 1, 64, None).unwrap(); let peers = vec![PeerId::random(), PeerId::random()]; @@ -769,7 +769,7 @@ fn sync_restart_removes_block_but_not_justification_requests() { let (b1_hash, b1_number) = new_blocks(50); // add new peer and request blocks from them - sync.new_peer(peers[0], Hash::random(), 42); + sync.add_peer(peers[0], Hash::random(), 42); // we don't actually perform any requests, just keep track of peers waiting for a response let mut pending_responses = HashSet::new(); @@ -782,7 +782,7 @@ fn sync_restart_removes_block_but_not_justification_requests() { } // add a new peer at a known block - sync.new_peer(peers[1], b1_hash, b1_number); + sync.add_peer(peers[1], b1_hash, b1_number); // we request a justification for a block we have locally sync.request_justification(&b1_hash, b1_number); @@ -837,7 +837,7 @@ fn sync_restart_removes_block_but_not_justification_requests() { sync.peers.get(&peers[1]).unwrap().state, PeerSyncState::DownloadingJustification(b1_hash), ); - let _ = sync.peer_disconnected(&peers[1]); + let _ = sync.remove_peer(&peers[1]); pending_responses.remove(&peers[1]); assert_eq!(pending_responses.len(), 0); } @@ -887,14 +887,14 @@ fn request_across_forks() { fork_blocks }; - let mut sync = ChainSync::new(SyncMode::Full, client.clone(), 5, 64, None).unwrap(); + let mut sync = ChainSync::new(ChainSyncMode::Full, client.clone(), 5, 64, None).unwrap(); // Add the peers, all at the common ancestor 100. let common_block = blocks.last().unwrap(); let peer_id1 = PeerId::random(); - sync.new_peer(peer_id1, common_block.hash(), *common_block.header().number()); + sync.add_peer(peer_id1, common_block.hash(), *common_block.header().number()); let peer_id2 = PeerId::random(); - sync.new_peer(peer_id2, common_block.hash(), *common_block.header().number()); + sync.add_peer(peer_id2, common_block.hash(), *common_block.header().number()); // Peer 1 announces 107 from fork 1, 100-107 get downloaded. { diff --git a/substrate/client/network/sync/src/strategy/state.rs b/substrate/client/network/sync/src/strategy/state.rs new file mode 100644 index 00000000000..ae3f7b60055 --- /dev/null +++ b/substrate/client/network/sync/src/strategy/state.rs @@ -0,0 +1,754 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//! State sync strategy. + +use crate::{ + schema::v1::StateResponse, + strategy::state_sync::{ImportResult, StateSync, StateSyncProvider}, + types::{BadPeer, OpaqueStateRequest, OpaqueStateResponse, SyncState, SyncStatus}, + LOG_TARGET, +}; +use libp2p::PeerId; +use log::{debug, error, trace}; +use sc_client_api::ProofProvider; +use sc_consensus::{BlockImportError, BlockImportStatus, IncomingBlock}; +use sc_network_common::sync::message::BlockAnnounce; +use sp_consensus::BlockOrigin; +use sp_runtime::{ + traits::{Block as BlockT, Header, NumberFor}, + Justifications, SaturatedConversion, +}; +use std::{collections::HashMap, sync::Arc}; + +mod rep { + use sc_network::ReputationChange as Rep; + + /// Peer response data does not have requested bits. + pub const BAD_RESPONSE: Rep = Rep::new(-(1 << 12), "Incomplete response"); + + /// Reputation change for peers which send us a known bad state. + pub const BAD_STATE: Rep = Rep::new(-(1 << 29), "Bad state"); +} + +/// Action that should be performed on [`StateStrategy`]'s behalf. +pub enum StateStrategyAction { + /// Send state request to peer. + SendStateRequest { peer_id: PeerId, request: OpaqueStateRequest }, + /// Disconnect and report peer. + DropPeer(BadPeer), + /// Import blocks. + ImportBlocks { origin: BlockOrigin, blocks: Vec> }, + /// State sync has finished. + Finished, +} + +enum PeerState { + Available, + DownloadingState, +} + +impl PeerState { + fn is_available(&self) -> bool { + matches!(self, PeerState::Available) + } +} + +struct Peer { + best_number: NumberFor, + state: PeerState, +} + +/// Syncing strategy that downloads and imports a recent state directly. +pub struct StateStrategy { + state_sync: Box>, + peers: HashMap>, + actions: Vec>, + succeded: bool, +} + +impl StateStrategy { + /// Create a new instance. + pub fn new( + client: Arc, + target_header: B::Header, + target_body: Option>, + target_justifications: Option, + skip_proof: bool, + initial_peers: impl Iterator)>, + ) -> Self + where + Client: ProofProvider + Send + Sync + 'static, + { + let peers = initial_peers + .map(|(peer_id, best_number)| { + (peer_id, Peer { best_number, state: PeerState::Available }) + }) + .collect(); + Self { + state_sync: Box::new(StateSync::new( + client, + target_header, + target_body, + target_justifications, + skip_proof, + )), + peers, + actions: Vec::new(), + succeded: false, + } + } + + // Create a new instance with a custom state sync provider. + // Used in tests. + #[cfg(test)] + fn new_with_provider( + state_sync_provider: Box>, + initial_peers: impl Iterator)>, + ) -> Self { + Self { + state_sync: state_sync_provider, + peers: initial_peers + .map(|(peer_id, best_number)| { + (peer_id, Peer { best_number, state: PeerState::Available }) + }) + .collect(), + actions: Vec::new(), + succeded: false, + } + } + + /// Notify that a new peer has connected. + pub fn add_peer(&mut self, peer_id: PeerId, _best_hash: B::Hash, best_number: NumberFor) { + self.peers.insert(peer_id, Peer { best_number, state: PeerState::Available }); + } + + /// Notify that a peer has disconnected. + pub fn remove_peer(&mut self, peer_id: &PeerId) { + self.peers.remove(peer_id); + } + + /// Submit a validated block announcement. + /// + /// Returns new best hash & best number of the peer if they are updated. + #[must_use] + pub fn on_validated_block_announce( + &mut self, + is_best: bool, + peer_id: PeerId, + announce: &BlockAnnounce, + ) -> Option<(B::Hash, NumberFor)> { + is_best.then_some({ + let best_number = *announce.header.number(); + let best_hash = announce.header.hash(); + if let Some(ref mut peer) = self.peers.get_mut(&peer_id) { + peer.best_number = best_number; + } + // Let `SyncingEngine` know that we should update the peer info. + (best_hash, best_number) + }) + } + + /// Process state response. + pub fn on_state_response(&mut self, peer_id: PeerId, response: OpaqueStateResponse) { + if let Err(bad_peer) = self.on_state_response_inner(peer_id, response) { + self.actions.push(StateStrategyAction::DropPeer(bad_peer)); + } + } + + fn on_state_response_inner( + &mut self, + peer_id: PeerId, + response: OpaqueStateResponse, + ) -> Result<(), BadPeer> { + if let Some(peer) = self.peers.get_mut(&peer_id) { + peer.state = PeerState::Available; + } + + let response: Box = response.0.downcast().map_err(|_error| { + error!( + target: LOG_TARGET, + "Failed to downcast opaque state response, this is an implementation bug." + ); + debug_assert!(false); + + BadPeer(peer_id, rep::BAD_RESPONSE) + })?; + + debug!( + target: LOG_TARGET, + "Importing state data from {} with {} keys, {} proof nodes.", + peer_id, + response.entries.len(), + response.proof.len(), + ); + + match self.state_sync.import(*response) { + ImportResult::Import(hash, header, state, body, justifications) => { + let origin = BlockOrigin::NetworkInitialSync; + let block = IncomingBlock { + hash, + header: Some(header), + body, + indexed_body: None, + justifications, + origin: None, + allow_missing_state: true, + import_existing: true, + skip_execution: true, + state: Some(state), + }; + debug!(target: LOG_TARGET, "State download is complete. Import is queued"); + self.actions + .push(StateStrategyAction::ImportBlocks { origin, blocks: vec![block] }); + Ok(()) + }, + ImportResult::Continue => Ok(()), + ImportResult::BadResponse => { + debug!(target: LOG_TARGET, "Bad state data received from {peer_id}"); + Err(BadPeer(peer_id, rep::BAD_STATE)) + }, + } + } + + /// A batch of blocks have been processed, with or without errors. + /// + /// Normally this should be called when target block with state is imported. + pub fn on_blocks_processed( + &mut self, + imported: usize, + count: usize, + results: Vec<(Result>, BlockImportError>, B::Hash)>, + ) { + trace!(target: LOG_TARGET, "State sync: imported {imported} of {count}."); + + let results = results + .into_iter() + .filter_map(|(result, hash)| { + if hash == self.state_sync.target_hash() { + Some(result) + } else { + debug!( + target: LOG_TARGET, + "Unexpected block processed: {hash} with result {result:?}.", + ); + None + } + }) + .collect::>(); + + if !results.is_empty() { + // We processed the target block + results.iter().filter_map(|result| result.as_ref().err()).for_each(|e| { + error!( + target: LOG_TARGET, + "Failed to import target block with state: {e:?}." + ); + }); + self.succeded |= results.into_iter().any(|result| result.is_ok()); + self.actions.push(StateStrategyAction::Finished); + } + } + + /// Produce state request. + fn state_request(&mut self) -> Option<(PeerId, OpaqueStateRequest)> { + if self.state_sync.is_complete() { + return None + } + + if self + .peers + .values() + .any(|peer| matches!(peer.state, PeerState::DownloadingState)) + { + // Only one state request at a time is possible. + return None + } + + let peer_id = + self.schedule_next_peer(PeerState::DownloadingState, self.state_sync.target_number())?; + let request = self.state_sync.next_request(); + trace!( + target: LOG_TARGET, + "New state request to {peer_id}: {request:?}.", + ); + Some((peer_id, OpaqueStateRequest(Box::new(request)))) + } + + fn schedule_next_peer( + &mut self, + new_state: PeerState, + min_best_number: NumberFor, + ) -> Option { + let mut targets: Vec<_> = self.peers.values().map(|p| p.best_number).collect(); + if targets.is_empty() { + return None + } + targets.sort(); + let median = targets[targets.len() / 2]; + let threshold = std::cmp::max(median, min_best_number); + // Find a random peer that is synced as much as peer majority and is above + // `min_best_number`. + for (peer_id, peer) in self.peers.iter_mut() { + if peer.state.is_available() && peer.best_number >= threshold { + peer.state = new_state; + return Some(*peer_id) + } + } + None + } + + /// Returns the current sync status. + pub fn status(&self) -> SyncStatus { + SyncStatus { + state: if self.state_sync.is_complete() { + SyncState::Idle + } else { + SyncState::Downloading { target: self.state_sync.target_number() } + }, + best_seen_block: Some(self.state_sync.target_number()), + num_peers: self.peers.len().saturated_into(), + num_connected_peers: self.peers.len().saturated_into(), + queued_blocks: 0, + state_sync: Some(self.state_sync.progress()), + warp_sync: None, + } + } + + /// Get the number of peers known to syncing. + pub fn num_peers(&self) -> usize { + self.peers.len() + } + + /// Get actions that should be performed by the owner on [`WarpSync`]'s behalf + #[must_use] + pub fn actions(&mut self) -> impl Iterator> { + let state_request = self + .state_request() + .into_iter() + .map(|(peer_id, request)| StateStrategyAction::SendStateRequest { peer_id, request }); + self.actions.extend(state_request); + + std::mem::take(&mut self.actions).into_iter() + } + + /// Check if state sync has succeded. + #[must_use] + pub fn is_succeded(&self) -> bool { + self.succeded + } +} + +#[cfg(test)] +mod test { + use super::*; + use crate::{ + schema::v1::{StateRequest, StateResponse}, + strategy::state_sync::{ImportResult, StateSyncProgress, StateSyncProvider}, + }; + use codec::Decode; + use sc_block_builder::BlockBuilderBuilder; + use sc_client_api::KeyValueStates; + use sc_consensus::{ImportedAux, ImportedState}; + use sp_runtime::traits::Zero; + use substrate_test_runtime_client::{ + runtime::{Block, Hash}, + BlockBuilderExt, DefaultTestClientBuilderExt, TestClientBuilder, TestClientBuilderExt, + }; + + mockall::mock! { + pub StateSync {} + + impl StateSyncProvider for StateSync { + fn import(&mut self, response: StateResponse) -> ImportResult; + fn next_request(&self) -> StateRequest; + fn is_complete(&self) -> bool; + fn target_number(&self) -> NumberFor; + fn target_hash(&self) -> B::Hash; + fn progress(&self) -> StateSyncProgress; + } + } + + #[test] + fn no_peer_is_scheduled_if_no_peers_connected() { + let client = Arc::new(TestClientBuilder::new().set_no_genesis().build()); + let target_block = BlockBuilderBuilder::new(&*client) + .on_parent_block(client.chain_info().best_hash) + .with_parent_block_number(client.chain_info().best_number) + .build() + .unwrap() + .build() + .unwrap() + .block; + let target_header = target_block.header().clone(); + + let mut state_strategy = + StateStrategy::new(client, target_header, None, None, false, std::iter::empty()); + + assert!(state_strategy + .schedule_next_peer(PeerState::DownloadingState, Zero::zero()) + .is_none()); + } + + #[test] + fn at_least_median_synced_peer_is_scheduled() { + let client = Arc::new(TestClientBuilder::new().set_no_genesis().build()); + let target_block = BlockBuilderBuilder::new(&*client) + .on_parent_block(client.chain_info().best_hash) + .with_parent_block_number(client.chain_info().best_number) + .build() + .unwrap() + .build() + .unwrap() + .block; + + for _ in 0..100 { + let peers = (1..=10) + .map(|best_number| (PeerId::random(), best_number)) + .collect::>(); + let initial_peers = peers.iter().map(|(p, n)| (*p, *n)); + + let mut state_strategy = StateStrategy::new( + client.clone(), + target_block.header().clone(), + None, + None, + false, + initial_peers, + ); + + let peer_id = + state_strategy.schedule_next_peer(PeerState::DownloadingState, Zero::zero()); + assert!(*peers.get(&peer_id.unwrap()).unwrap() >= 6); + } + } + + #[test] + fn min_best_number_peer_is_scheduled() { + let client = Arc::new(TestClientBuilder::new().set_no_genesis().build()); + let target_block = BlockBuilderBuilder::new(&*client) + .on_parent_block(client.chain_info().best_hash) + .with_parent_block_number(client.chain_info().best_number) + .build() + .unwrap() + .build() + .unwrap() + .block; + + for _ in 0..10 { + let peers = (1..=10) + .map(|best_number| (PeerId::random(), best_number)) + .collect::>(); + let initial_peers = peers.iter().map(|(p, n)| (*p, *n)); + + let mut state_strategy = StateStrategy::new( + client.clone(), + target_block.header().clone(), + None, + None, + false, + initial_peers, + ); + + let peer_id = state_strategy.schedule_next_peer(PeerState::DownloadingState, 10); + assert!(*peers.get(&peer_id.unwrap()).unwrap() == 10); + } + } + + #[test] + fn state_request_contains_correct_hash() { + let client = Arc::new(TestClientBuilder::new().set_no_genesis().build()); + let target_block = BlockBuilderBuilder::new(&*client) + .on_parent_block(client.chain_info().best_hash) + .with_parent_block_number(client.chain_info().best_number) + .build() + .unwrap() + .build() + .unwrap() + .block; + + let initial_peers = (1..=10).map(|best_number| (PeerId::random(), best_number)); + + let mut state_strategy = StateStrategy::new( + client.clone(), + target_block.header().clone(), + None, + None, + false, + initial_peers, + ); + + let (_peer_id, mut opaque_request) = state_strategy.state_request().unwrap(); + let request: &mut StateRequest = opaque_request.0.downcast_mut().unwrap(); + let hash = Hash::decode(&mut &*request.block).unwrap(); + + assert_eq!(hash, target_block.header().hash()); + } + + #[test] + fn no_parallel_state_requests() { + let client = Arc::new(TestClientBuilder::new().set_no_genesis().build()); + let target_block = BlockBuilderBuilder::new(&*client) + .on_parent_block(client.chain_info().best_hash) + .with_parent_block_number(client.chain_info().best_number) + .build() + .unwrap() + .build() + .unwrap() + .block; + + let initial_peers = (1..=10).map(|best_number| (PeerId::random(), best_number)); + + let mut state_strategy = StateStrategy::new( + client.clone(), + target_block.header().clone(), + None, + None, + false, + initial_peers, + ); + + // First request is sent. + assert!(state_strategy.state_request().is_some()); + + // No parallel request is sent. + assert!(state_strategy.state_request().is_none()); + } + + #[test] + fn received_state_response_makes_peer_available_again() { + let mut state_sync_provider = MockStateSync::::new(); + state_sync_provider.expect_import().return_once(|_| ImportResult::Continue); + let peer_id = PeerId::random(); + let initial_peers = std::iter::once((peer_id, 10)); + let mut state_strategy = + StateStrategy::new_with_provider(Box::new(state_sync_provider), initial_peers); + // Manually set the peer's state. + state_strategy.peers.get_mut(&peer_id).unwrap().state = PeerState::DownloadingState; + + let dummy_response = OpaqueStateResponse(Box::new(StateResponse::default())); + state_strategy.on_state_response(peer_id, dummy_response); + + assert!(state_strategy.peers.get(&peer_id).unwrap().state.is_available()); + } + + #[test] + fn bad_state_response_drops_peer() { + let mut state_sync_provider = MockStateSync::::new(); + // Provider says that state response is bad. + state_sync_provider.expect_import().return_once(|_| ImportResult::BadResponse); + let peer_id = PeerId::random(); + let initial_peers = std::iter::once((peer_id, 10)); + let mut state_strategy = + StateStrategy::new_with_provider(Box::new(state_sync_provider), initial_peers); + // Manually set the peer's state. + state_strategy.peers.get_mut(&peer_id).unwrap().state = PeerState::DownloadingState; + let dummy_response = OpaqueStateResponse(Box::new(StateResponse::default())); + // Receiving response drops the peer. + assert!(matches!( + state_strategy.on_state_response_inner(peer_id, dummy_response), + Err(BadPeer(id, _rep)) if id == peer_id, + )); + } + + #[test] + fn partial_state_response_doesnt_generate_actions() { + let mut state_sync_provider = MockStateSync::::new(); + // Sync provider says that the response is partial. + state_sync_provider.expect_import().return_once(|_| ImportResult::Continue); + let peer_id = PeerId::random(); + let initial_peers = std::iter::once((peer_id, 10)); + let mut state_strategy = + StateStrategy::new_with_provider(Box::new(state_sync_provider), initial_peers); + // Manually set the peer's state . + state_strategy.peers.get_mut(&peer_id).unwrap().state = PeerState::DownloadingState; + + let dummy_response = OpaqueStateResponse(Box::new(StateResponse::default())); + state_strategy.on_state_response(peer_id, dummy_response); + + // No actions generated. + assert_eq!(state_strategy.actions.len(), 0) + } + + #[test] + fn complete_state_response_leads_to_block_import() { + // Build block to use for checks. + let client = Arc::new(TestClientBuilder::new().set_no_genesis().build()); + let mut block_builder = BlockBuilderBuilder::new(&*client) + .on_parent_block(client.chain_info().best_hash) + .with_parent_block_number(client.chain_info().best_number) + .build() + .unwrap(); + block_builder.push_storage_change(vec![1, 2, 3], Some(vec![4, 5, 6])).unwrap(); + let block = block_builder.build().unwrap().block; + let header = block.header().clone(); + let hash = header.hash(); + let body = Some(block.extrinsics().iter().cloned().collect::>()); + let state = ImportedState { block: hash, state: KeyValueStates(Vec::new()) }; + let justifications = Some(Justifications::from((*b"FRNK", Vec::new()))); + + // Prepare `StateSync` + let mut state_sync_provider = MockStateSync::::new(); + let import = ImportResult::Import( + hash, + header.clone(), + state.clone(), + body.clone(), + justifications.clone(), + ); + state_sync_provider.expect_import().return_once(move |_| import); + + // Reference values to check against. + let expected_origin = BlockOrigin::NetworkInitialSync; + let expected_block = IncomingBlock { + hash, + header: Some(header), + body, + indexed_body: None, + justifications, + origin: None, + allow_missing_state: true, + import_existing: true, + skip_execution: true, + state: Some(state), + }; + let expected_blocks = vec![expected_block]; + + // Prepare `StateStrategy`. + let peer_id = PeerId::random(); + let initial_peers = std::iter::once((peer_id, 10)); + let mut state_strategy = + StateStrategy::new_with_provider(Box::new(state_sync_provider), initial_peers); + // Manually set the peer's state . + state_strategy.peers.get_mut(&peer_id).unwrap().state = PeerState::DownloadingState; + + // Receive response. + let dummy_response = OpaqueStateResponse(Box::new(StateResponse::default())); + state_strategy.on_state_response(peer_id, dummy_response); + + assert_eq!(state_strategy.actions.len(), 1); + assert!(matches!( + &state_strategy.actions[0], + StateStrategyAction::ImportBlocks { origin, blocks } + if *origin == expected_origin && *blocks == expected_blocks, + )); + } + + #[test] + fn importing_unknown_block_doesnt_finish_strategy() { + let target_hash = Hash::random(); + let unknown_hash = Hash::random(); + let mut state_sync_provider = MockStateSync::::new(); + state_sync_provider.expect_target_hash().return_const(target_hash); + + let mut state_strategy = + StateStrategy::new_with_provider(Box::new(state_sync_provider), std::iter::empty()); + + // Unknown block imported. + state_strategy.on_blocks_processed( + 1, + 1, + vec![( + Ok(BlockImportStatus::ImportedUnknown(1, ImportedAux::default(), None)), + unknown_hash, + )], + ); + + // No actions generated. + assert_eq!(state_strategy.actions.len(), 0); + } + + #[test] + fn succesfully_importing_target_block_finishes_strategy() { + let target_hash = Hash::random(); + let mut state_sync_provider = MockStateSync::::new(); + state_sync_provider.expect_target_hash().return_const(target_hash); + + let mut state_strategy = + StateStrategy::new_with_provider(Box::new(state_sync_provider), std::iter::empty()); + + // Target block imported. + state_strategy.on_blocks_processed( + 1, + 1, + vec![( + Ok(BlockImportStatus::ImportedUnknown(1, ImportedAux::default(), None)), + target_hash, + )], + ); + + // Strategy finishes. + assert_eq!(state_strategy.actions.len(), 1); + assert!(matches!(&state_strategy.actions[0], StateStrategyAction::Finished)); + } + + #[test] + fn failure_to_import_target_block_finishes_strategy() { + let target_hash = Hash::random(); + let mut state_sync_provider = MockStateSync::::new(); + state_sync_provider.expect_target_hash().return_const(target_hash); + + let mut state_strategy = + StateStrategy::new_with_provider(Box::new(state_sync_provider), std::iter::empty()); + + // Target block import failed. + state_strategy.on_blocks_processed( + 1, + 1, + vec![( + Err(BlockImportError::VerificationFailed(None, String::from("test-error"))), + target_hash, + )], + ); + + // Strategy finishes. + assert_eq!(state_strategy.actions.len(), 1); + assert!(matches!(&state_strategy.actions[0], StateStrategyAction::Finished)); + } + + #[test] + fn finished_strategy_doesnt_generate_more_actions() { + let target_hash = Hash::random(); + let mut state_sync_provider = MockStateSync::::new(); + state_sync_provider.expect_target_hash().return_const(target_hash); + state_sync_provider.expect_is_complete().return_const(true); + + // Get enough peers for possible spurious requests. + let initial_peers = (1..=10).map(|best_number| (PeerId::random(), best_number)); + + let mut state_strategy = + StateStrategy::new_with_provider(Box::new(state_sync_provider), initial_peers); + + state_strategy.on_blocks_processed( + 1, + 1, + vec![( + Ok(BlockImportStatus::ImportedUnknown(1, ImportedAux::default(), None)), + target_hash, + )], + ); + + // Strategy finishes. + let actions = state_strategy.actions().collect::>(); + assert_eq!(actions.len(), 1); + assert!(matches!(&actions[0], StateStrategyAction::Finished)); + + // No more actions generated. + assert_eq!(state_strategy.actions().count(), 0); + } +} diff --git a/substrate/client/network/sync/src/state.rs b/substrate/client/network/sync/src/strategy/state_sync.rs similarity index 74% rename from substrate/client/network/sync/src/state.rs rename to substrate/client/network/sync/src/strategy/state_sync.rs index 5d34613d1c5..1ed1de7c8ef 100644 --- a/substrate/client/network/sync/src/state.rs +++ b/substrate/client/network/sync/src/strategy/state_sync.rs @@ -20,7 +20,7 @@ use crate::{ schema::v1::{StateEntry, StateRequest, StateResponse}, - types::StateDownloadProgress, + LOG_TARGET, }; use codec::{Decode, Encode}; use log::debug; @@ -32,7 +32,62 @@ use sp_runtime::{ traits::{Block as BlockT, Header, NumberFor}, Justifications, }; -use std::{collections::HashMap, sync::Arc}; +use std::{collections::HashMap, fmt, sync::Arc}; + +/// Generic state sync provider. Used for mocking in tests. +pub trait StateSyncProvider: Send + Sync { + /// Validate and import a state response. + fn import(&mut self, response: StateResponse) -> ImportResult; + /// Produce next state request. + fn next_request(&self) -> StateRequest; + /// Check if the state is complete. + fn is_complete(&self) -> bool; + /// Returns target block number. + fn target_number(&self) -> NumberFor; + /// Returns target block hash. + fn target_hash(&self) -> B::Hash; + /// Returns state sync estimated progress. + fn progress(&self) -> StateSyncProgress; +} + +// Reported state sync phase. +#[derive(Clone, Eq, PartialEq, Debug)] +pub enum StateSyncPhase { + // State download in progress. + DownloadingState, + // Download is complete, state is being imported. + ImportingState, +} + +impl fmt::Display for StateSyncPhase { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + Self::DownloadingState => write!(f, "Downloading state"), + Self::ImportingState => write!(f, "Importing state"), + } + } +} + +/// Reported state download progress. +#[derive(Clone, Eq, PartialEq, Debug)] +pub struct StateSyncProgress { + /// Estimated download percentage. + pub percentage: u32, + /// Total state size in bytes downloaded so far. + pub size: u64, + /// Current state sync phase. + pub phase: StateSyncPhase, +} + +/// Import state chunk result. +pub enum ImportResult { + /// State is complete and ready for import. + Import(B::Hash, B::Header, ImportedState, Option>, Option), + /// Continue downloading. + Continue, + /// Bad state chunk. + BadResponse, +} /// State sync state machine. Accumulates partial state data until it /// is ready to be imported. @@ -50,16 +105,6 @@ pub struct StateSync { skip_proof: bool, } -/// Import state chunk result. -pub enum ImportResult { - /// State is complete and ready for import. - Import(B::Hash, B::Header, ImportedState, Option>, Option), - /// Continue downloading. - Continue, - /// Bad state chunk. - BadResponse, -} - impl StateSync where B: BlockT, @@ -87,24 +132,30 @@ where skip_proof, } } +} +impl StateSyncProvider for StateSync +where + B: BlockT, + Client: ProofProvider + Send + Sync + 'static, +{ /// Validate and import a state response. - pub fn import(&mut self, response: StateResponse) -> ImportResult { + fn import(&mut self, response: StateResponse) -> ImportResult { if response.entries.is_empty() && response.proof.is_empty() { - debug!(target: "sync", "Bad state response"); + debug!(target: LOG_TARGET, "Bad state response"); return ImportResult::BadResponse } if !self.skip_proof && response.proof.is_empty() { - debug!(target: "sync", "Missing proof"); + debug!(target: LOG_TARGET, "Missing proof"); return ImportResult::BadResponse } let complete = if !self.skip_proof { - debug!(target: "sync", "Importing state from {} trie nodes", response.proof.len()); + debug!(target: LOG_TARGET, "Importing state from {} trie nodes", response.proof.len()); let proof_size = response.proof.len() as u64; let proof = match CompactProof::decode(&mut response.proof.as_ref()) { Ok(proof) => proof, Err(e) => { - debug!(target: "sync", "Error decoding proof: {:?}", e); + debug!(target: LOG_TARGET, "Error decoding proof: {:?}", e); return ImportResult::BadResponse }, }; @@ -115,7 +166,7 @@ where ) { Err(e) => { debug!( - target: "sync", + target: LOG_TARGET, "StateResponse failed proof verification: {}", e, ); @@ -123,11 +174,11 @@ where }, Ok(values) => values, }; - debug!(target: "sync", "Imported with {} keys", values.len()); + debug!(target: LOG_TARGET, "Imported with {} keys", values.len()); let complete = completed == 0; if !complete && !values.update_last_key(completed, &mut self.last_key) { - debug!(target: "sync", "Error updating key cursor, depth: {}", completed); + debug!(target: LOG_TARGET, "Error updating key cursor, depth: {}", completed); }; for values in values.0 { @@ -185,7 +236,7 @@ where } for state in response.entries { debug!( - target: "sync", + target: LOG_TARGET, "Importing state from {:?} to {:?}", state.entries.last().map(|e| sp_core::hexdisplay::HexDisplay::from(&e.key)), state.entries.first().map(|e| sp_core::hexdisplay::HexDisplay::from(&e.key)), @@ -237,7 +288,7 @@ where } /// Produce next state request. - pub fn next_request(&self) -> StateRequest { + fn next_request(&self) -> StateRequest { StateRequest { block: self.target_block.encode(), start: self.last_key.clone().into_vec(), @@ -246,24 +297,32 @@ where } /// Check if the state is complete. - pub fn is_complete(&self) -> bool { + fn is_complete(&self) -> bool { self.complete } /// Returns target block number. - pub fn target_block_num(&self) -> NumberFor { + fn target_number(&self) -> NumberFor { *self.target_header.number() } /// Returns target block hash. - pub fn target(&self) -> B::Hash { + fn target_hash(&self) -> B::Hash { self.target_block } /// Returns state sync estimated progress. - pub fn progress(&self) -> StateDownloadProgress { + fn progress(&self) -> StateSyncProgress { let cursor = *self.last_key.get(0).and_then(|last| last.get(0)).unwrap_or(&0u8); let percent_done = cursor as u32 * 100 / 256; - StateDownloadProgress { percentage: percent_done, size: self.imported_bytes } + StateSyncProgress { + percentage: percent_done, + size: self.imported_bytes, + phase: if self.complete { + StateSyncPhase::ImportingState + } else { + StateSyncPhase::DownloadingState + }, + } } } diff --git a/substrate/client/network/sync/src/strategy/warp.rs b/substrate/client/network/sync/src/strategy/warp.rs new file mode 100644 index 00000000000..7935b5f29b6 --- /dev/null +++ b/substrate/client/network/sync/src/strategy/warp.rs @@ -0,0 +1,1443 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//! Warp syncing strategy. Bootstraps chain by downloading warp proofs and state. + +pub use sp_consensus_grandpa::{AuthorityList, SetId}; + +use crate::{ + strategy::chain_sync::validate_blocks, + types::{BadPeer, SyncState, SyncStatus}, + LOG_TARGET, +}; +use codec::{Decode, Encode}; +use futures::channel::oneshot; +use libp2p::PeerId; +use log::{debug, error, trace}; +use sc_network_common::sync::message::{ + BlockAnnounce, BlockAttributes, BlockData, BlockRequest, Direction, FromBlock, +}; +use sp_blockchain::HeaderBackend; +use sp_runtime::{ + traits::{Block as BlockT, Header, NumberFor, Zero}, + Justifications, SaturatedConversion, +}; +use std::{collections::HashMap, fmt, sync::Arc}; + +/// Number of peers that need to be connected before warp sync is started. +const MIN_PEERS_TO_START_WARP_SYNC: usize = 3; + +/// Scale-encoded warp sync proof response. +pub struct EncodedProof(pub Vec); + +/// Warp sync request +#[derive(Encode, Decode, Debug, Clone)] +pub struct WarpProofRequest { + /// Start collecting proofs from this block. + pub begin: B::Hash, +} + +/// Proof verification result. +pub enum VerificationResult { + /// Proof is valid, but the target was not reached. + Partial(SetId, AuthorityList, Block::Hash), + /// Target finality is proved. + Complete(SetId, AuthorityList, Block::Header), +} + +/// Warp sync backend. Handles retrieving and verifying warp sync proofs. +pub trait WarpSyncProvider: Send + Sync { + /// Generate proof starting at given block hash. The proof is accumulated until maximum proof + /// size is reached. + fn generate( + &self, + start: Block::Hash, + ) -> Result>; + /// Verify warp proof against current set of authorities. + fn verify( + &self, + proof: &EncodedProof, + set_id: SetId, + authorities: AuthorityList, + ) -> Result, Box>; + /// Get current list of authorities. This is supposed to be genesis authorities when starting + /// sync. + fn current_authorities(&self) -> AuthorityList; +} + +mod rep { + use sc_network::ReputationChange as Rep; + + /// Unexpected response received form a peer + pub const UNEXPECTED_RESPONSE: Rep = Rep::new(-(1 << 29), "Unexpected response"); + + /// Peer provided invalid warp proof data + pub const BAD_WARP_PROOF: Rep = Rep::new(-(1 << 29), "Bad warp proof"); + + /// Peer did not provide us with advertised block data. + pub const NO_BLOCK: Rep = Rep::new(-(1 << 29), "No requested block data"); + + /// Reputation change for peers which send us non-requested block data. + pub const NOT_REQUESTED: Rep = Rep::new(-(1 << 29), "Not requested block data"); + + /// Reputation change for peers which send us a block which we fail to verify. + pub const VERIFICATION_FAIL: Rep = Rep::new(-(1 << 29), "Block verification failed"); +} + +/// Reported warp sync phase. +#[derive(Clone, Eq, PartialEq, Debug)] +pub enum WarpSyncPhase { + /// Waiting for peers to connect. + AwaitingPeers { required_peers: usize }, + /// Waiting for target block to be received. + AwaitingTargetBlock, + /// Downloading and verifying grandpa warp proofs. + DownloadingWarpProofs, + /// Downloading target block. + DownloadingTargetBlock, + /// Downloading state data. + DownloadingState, + /// Importing state. + ImportingState, + /// Downloading block history. + DownloadingBlocks(NumberFor), + /// Warp sync is complete. + Complete, +} + +impl fmt::Display for WarpSyncPhase { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + Self::AwaitingPeers { required_peers } => + write!(f, "Waiting for {required_peers} peers to be connected"), + Self::AwaitingTargetBlock => write!(f, "Waiting for target block to be received"), + Self::DownloadingWarpProofs => write!(f, "Downloading finality proofs"), + Self::DownloadingTargetBlock => write!(f, "Downloading target block"), + Self::DownloadingState => write!(f, "Downloading state"), + Self::ImportingState => write!(f, "Importing state"), + Self::DownloadingBlocks(n) => write!(f, "Downloading block history (#{})", n), + Self::Complete => write!(f, "Warp sync is complete"), + } + } +} + +/// Reported warp sync progress. +#[derive(Clone, Eq, PartialEq, Debug)] +pub struct WarpSyncProgress { + /// Estimated download percentage. + pub phase: WarpSyncPhase, + /// Total bytes downloaded so far. + pub total_bytes: u64, +} + +/// The different types of warp syncing, passed to `build_network`. +pub enum WarpSyncParams { + /// Standard warp sync for the chain. + WithProvider(Arc>), + /// Skip downloading proofs and wait for a header of the state that should be downloaded. + /// + /// It is expected that the header provider ensures that the header is trusted. + WaitForTarget(oneshot::Receiver<::Header>), +} + +/// Warp sync configuration as accepted by [`WarpSync`]. +pub enum WarpSyncConfig { + /// Standard warp sync for the chain. + WithProvider(Arc>), + /// Skip downloading proofs and wait for a header of the state that should be downloaded. + /// + /// It is expected that the header provider ensures that the header is trusted. + WaitForTarget, +} + +impl WarpSyncParams { + /// Split `WarpSyncParams` into `WarpSyncConfig` and warp sync target block header receiver. + pub fn split( + self, + ) -> (WarpSyncConfig, Option::Header>>) { + match self { + WarpSyncParams::WithProvider(provider) => + (WarpSyncConfig::WithProvider(provider), None), + WarpSyncParams::WaitForTarget(rx) => (WarpSyncConfig::WaitForTarget, Some(rx)), + } + } +} + +/// Warp sync phase used by warp sync state machine. +enum Phase { + /// Waiting for enough peers to connect. + WaitingForPeers { warp_sync_provider: Arc> }, + /// Downloading warp proofs. + WarpProof { + set_id: SetId, + authorities: AuthorityList, + last_hash: B::Hash, + warp_sync_provider: Arc>, + }, + /// Waiting for target block to be set externally if we skip warp proofs downloading, + /// and start straight from the target block (used by parachains warp sync). + PendingTargetBlock, + /// Downloading target block. + TargetBlock(B::Header), + /// Warp sync is complete. + Complete, +} + +enum PeerState { + Available, + DownloadingProofs, + DownloadingTargetBlock, +} + +impl PeerState { + fn is_available(&self) -> bool { + matches!(self, PeerState::Available) + } +} + +struct Peer { + best_number: NumberFor, + state: PeerState, +} + +/// Action that should be performed on [`WarpSync`]'s behalf. +pub enum WarpSyncAction { + /// Send warp proof request to peer. + SendWarpProofRequest { peer_id: PeerId, request: WarpProofRequest }, + /// Send block request to peer. Always implies dropping a stale block request to the same peer. + SendBlockRequest { peer_id: PeerId, request: BlockRequest }, + /// Disconnect and report peer. + DropPeer(BadPeer), + /// Warp sync has finished. + Finished, +} + +pub struct WarpSyncResult { + pub target_header: B::Header, + pub target_body: Option>, + pub target_justifications: Option, +} + +/// Warp sync state machine. Accumulates warp proofs and state. +pub struct WarpSync { + phase: Phase, + client: Arc, + total_proof_bytes: u64, + total_state_bytes: u64, + peers: HashMap>, + actions: Vec>, + result: Option>, +} + +impl WarpSync +where + B: BlockT, + Client: HeaderBackend + 'static, +{ + /// Create a new instance. When passing a warp sync provider we will be checking for proof and + /// authorities. Alternatively we can pass a target block when we want to skip downloading + /// proofs, in this case we will continue polling until the target block is known. + pub fn new(client: Arc, warp_sync_config: WarpSyncConfig) -> Self { + if client.info().finalized_state.is_some() { + error!( + target: LOG_TARGET, + "Can't use warp sync mode with a partially synced database. Reverting to full sync mode." + ); + return Self { + client, + phase: Phase::Complete, + total_proof_bytes: 0, + total_state_bytes: 0, + peers: HashMap::new(), + actions: vec![WarpSyncAction::Finished], + result: None, + } + } + + let phase = match warp_sync_config { + WarpSyncConfig::WithProvider(warp_sync_provider) => + Phase::WaitingForPeers { warp_sync_provider }, + WarpSyncConfig::WaitForTarget => Phase::PendingTargetBlock, + }; + + Self { + client, + phase, + total_proof_bytes: 0, + total_state_bytes: 0, + peers: HashMap::new(), + actions: Vec::new(), + result: None, + } + } + + /// Set target block externally in case we skip warp proof downloading. + pub fn set_target_block(&mut self, header: B::Header) { + let Phase::PendingTargetBlock = self.phase else { + error!( + target: LOG_TARGET, + "Attempt to set warp sync target block in invalid phase.", + ); + debug_assert!(false); + return + }; + + self.phase = Phase::TargetBlock(header); + } + + /// Notify that a new peer has connected. + pub fn add_peer(&mut self, peer_id: PeerId, _best_hash: B::Hash, best_number: NumberFor) { + self.peers.insert(peer_id, Peer { best_number, state: PeerState::Available }); + + self.try_to_start_warp_sync(); + } + + /// Notify that a peer has disconnected. + pub fn remove_peer(&mut self, peer_id: &PeerId) { + self.peers.remove(peer_id); + } + + /// Submit a validated block announcement. + /// + /// Returns new best hash & best number of the peer if they are updated. + #[must_use] + pub fn on_validated_block_announce( + &mut self, + is_best: bool, + peer_id: PeerId, + announce: &BlockAnnounce, + ) -> Option<(B::Hash, NumberFor)> { + is_best.then_some({ + let best_number = *announce.header.number(); + let best_hash = announce.header.hash(); + if let Some(ref mut peer) = self.peers.get_mut(&peer_id) { + peer.best_number = best_number; + } + // Let `SyncingEngine` know that we should update the peer info. + (best_hash, best_number) + }) + } + + /// Start warp sync as soon as we have enough peers. + fn try_to_start_warp_sync(&mut self) { + let Phase::WaitingForPeers { warp_sync_provider } = &self.phase else { return }; + + if self.peers.len() < MIN_PEERS_TO_START_WARP_SYNC { + return + } + + self.phase = Phase::WarpProof { + set_id: 0, + authorities: warp_sync_provider.current_authorities(), + last_hash: self.client.info().genesis_hash, + warp_sync_provider: Arc::clone(warp_sync_provider), + }; + trace!(target: LOG_TARGET, "Started warp sync with {} peers.", self.peers.len()); + } + + /// Process warp proof response. + pub fn on_warp_proof_response(&mut self, peer_id: &PeerId, response: EncodedProof) { + if let Some(peer) = self.peers.get_mut(peer_id) { + peer.state = PeerState::Available; + } + + let Phase::WarpProof { set_id, authorities, last_hash, warp_sync_provider } = + &mut self.phase + else { + debug!(target: LOG_TARGET, "Unexpected warp proof response"); + self.actions + .push(WarpSyncAction::DropPeer(BadPeer(*peer_id, rep::UNEXPECTED_RESPONSE))); + return + }; + + match warp_sync_provider.verify(&response, *set_id, authorities.clone()) { + Err(e) => { + debug!(target: LOG_TARGET, "Bad warp proof response: {}", e); + self.actions + .push(WarpSyncAction::DropPeer(BadPeer(*peer_id, rep::BAD_WARP_PROOF))) + }, + Ok(VerificationResult::Partial(new_set_id, new_authorities, new_last_hash)) => { + log::debug!(target: LOG_TARGET, "Verified partial proof, set_id={:?}", new_set_id); + *set_id = new_set_id; + *authorities = new_authorities; + *last_hash = new_last_hash; + self.total_proof_bytes += response.0.len() as u64; + }, + Ok(VerificationResult::Complete(new_set_id, _, header)) => { + log::debug!( + target: LOG_TARGET, + "Verified complete proof, set_id={:?}. Continuing with target block download: {} ({}).", + new_set_id, + header.hash(), + header.number(), + ); + self.total_proof_bytes += response.0.len() as u64; + self.phase = Phase::TargetBlock(header); + }, + } + } + + /// Process (target) block response. + pub fn on_block_response( + &mut self, + peer_id: PeerId, + request: BlockRequest, + blocks: Vec>, + ) { + if let Err(bad_peer) = self.on_block_response_inner(peer_id, request, blocks) { + self.actions.push(WarpSyncAction::DropPeer(bad_peer)); + } + } + + fn on_block_response_inner( + &mut self, + peer_id: PeerId, + request: BlockRequest, + mut blocks: Vec>, + ) -> Result<(), BadPeer> { + if let Some(peer) = self.peers.get_mut(&peer_id) { + peer.state = PeerState::Available; + } + + let Phase::TargetBlock(header) = &mut self.phase else { + debug!(target: LOG_TARGET, "Unexpected target block response from {peer_id}"); + return Err(BadPeer(peer_id, rep::UNEXPECTED_RESPONSE)) + }; + + if blocks.is_empty() { + debug!( + target: LOG_TARGET, + "Downloading target block failed: empty block response from {peer_id}", + ); + return Err(BadPeer(peer_id, rep::NO_BLOCK)) + } + + if blocks.len() > 1 { + debug!( + target: LOG_TARGET, + "Too many blocks ({}) in warp target block response from {peer_id}", + blocks.len(), + ); + return Err(BadPeer(peer_id, rep::NOT_REQUESTED)) + } + + validate_blocks::(&blocks, &peer_id, Some(request))?; + + let block = blocks.pop().expect("`blocks` len checked above; qed"); + + let Some(block_header) = &block.header else { + debug!( + target: LOG_TARGET, + "Downloading target block failed: missing header in response from {peer_id}.", + ); + return Err(BadPeer(peer_id, rep::VERIFICATION_FAIL)) + }; + + if block_header != header { + debug!( + target: LOG_TARGET, + "Downloading target block failed: different header in response from {peer_id}.", + ); + return Err(BadPeer(peer_id, rep::VERIFICATION_FAIL)) + } + + if block.body.is_none() { + debug!( + target: LOG_TARGET, + "Downloading target block failed: missing body in response from {peer_id}.", + ); + return Err(BadPeer(peer_id, rep::VERIFICATION_FAIL)) + } + + self.result = Some(WarpSyncResult { + target_header: header.clone(), + target_body: block.body, + target_justifications: block.justifications, + }); + self.phase = Phase::Complete; + self.actions.push(WarpSyncAction::Finished); + Ok(()) + } + + /// Reserve a peer for a request assigning `new_state`. + fn schedule_next_peer( + &mut self, + new_state: PeerState, + min_best_number: Option>, + ) -> Option { + let mut targets: Vec<_> = self.peers.values().map(|p| p.best_number).collect(); + if targets.is_empty() { + return None + } + targets.sort(); + let median = targets[targets.len() / 2]; + let threshold = std::cmp::max(median, min_best_number.unwrap_or(Zero::zero())); + // Find a random peer that is synced as much as peer majority and is above + // `min_best_number`. + for (peer_id, peer) in self.peers.iter_mut() { + if peer.state.is_available() && peer.best_number >= threshold { + peer.state = new_state; + return Some(*peer_id) + } + } + None + } + + /// Produce warp proof request. + fn warp_proof_request(&mut self) -> Option<(PeerId, WarpProofRequest)> { + let Phase::WarpProof { last_hash, .. } = &self.phase else { return None }; + + // Copy `last_hash` early to cut the borrowing tie. + let begin = *last_hash; + + if self + .peers + .values() + .any(|peer| matches!(peer.state, PeerState::DownloadingProofs)) + { + // Only one warp proof request at a time is possible. + return None + } + + let peer_id = self.schedule_next_peer(PeerState::DownloadingProofs, None)?; + trace!(target: LOG_TARGET, "New WarpProofRequest to {peer_id}, begin hash: {begin}."); + + Some((peer_id, WarpProofRequest { begin })) + } + + /// Produce target block request. + fn target_block_request(&mut self) -> Option<(PeerId, BlockRequest)> { + let Phase::TargetBlock(target_header) = &self.phase else { return None }; + + if self + .peers + .values() + .any(|peer| matches!(peer.state, PeerState::DownloadingTargetBlock)) + { + // Only one target block request at a time is possible. + return None + } + + // Cut the borrowing tie. + let target_hash = target_header.hash(); + let target_number = *target_header.number(); + + let peer_id = + self.schedule_next_peer(PeerState::DownloadingTargetBlock, Some(target_number))?; + + trace!( + target: LOG_TARGET, + "New target block request to {peer_id}, target: {} ({}).", + target_hash, + target_number, + ); + + Some(( + peer_id, + BlockRequest:: { + id: 0, + fields: BlockAttributes::HEADER | + BlockAttributes::BODY | + BlockAttributes::JUSTIFICATION, + from: FromBlock::Hash(target_hash), + direction: Direction::Ascending, + max: Some(1), + }, + )) + } + + /// Returns warp sync estimated progress (stage, bytes received). + pub fn progress(&self) -> WarpSyncProgress { + match &self.phase { + Phase::WaitingForPeers { .. } => WarpSyncProgress { + phase: WarpSyncPhase::AwaitingPeers { + required_peers: MIN_PEERS_TO_START_WARP_SYNC, + }, + total_bytes: self.total_proof_bytes, + }, + Phase::WarpProof { .. } => WarpSyncProgress { + phase: WarpSyncPhase::DownloadingWarpProofs, + total_bytes: self.total_proof_bytes, + }, + Phase::TargetBlock(_) => WarpSyncProgress { + phase: WarpSyncPhase::DownloadingTargetBlock, + total_bytes: self.total_proof_bytes, + }, + Phase::PendingTargetBlock { .. } => WarpSyncProgress { + phase: WarpSyncPhase::AwaitingTargetBlock, + total_bytes: self.total_proof_bytes, + }, + Phase::Complete => WarpSyncProgress { + phase: WarpSyncPhase::Complete, + total_bytes: self.total_proof_bytes + self.total_state_bytes, + }, + } + } + + /// Get the number of peers known to warp sync. + pub fn num_peers(&self) -> usize { + self.peers.len() + } + + /// Returns the current sync status. + pub fn status(&self) -> SyncStatus { + SyncStatus { + state: match &self.phase { + Phase::WaitingForPeers { .. } => SyncState::Downloading { target: Zero::zero() }, + Phase::WarpProof { .. } => SyncState::Downloading { target: Zero::zero() }, + Phase::PendingTargetBlock => SyncState::Downloading { target: Zero::zero() }, + Phase::TargetBlock(header) => SyncState::Downloading { target: *header.number() }, + Phase::Complete => SyncState::Idle, + }, + best_seen_block: match &self.phase { + Phase::WaitingForPeers { .. } => None, + Phase::WarpProof { .. } => None, + Phase::PendingTargetBlock => None, + Phase::TargetBlock(header) => Some(*header.number()), + Phase::Complete => None, + }, + num_peers: self.peers.len().saturated_into(), + num_connected_peers: self.peers.len().saturated_into(), + queued_blocks: 0, + state_sync: None, + warp_sync: Some(self.progress()), + } + } + + /// Get actions that should be performed by the owner on [`WarpSync`]'s behalf + #[must_use] + pub fn actions(&mut self) -> impl Iterator> { + let warp_proof_request = self + .warp_proof_request() + .into_iter() + .map(|(peer_id, request)| WarpSyncAction::SendWarpProofRequest { peer_id, request }); + self.actions.extend(warp_proof_request); + + let target_block_request = self + .target_block_request() + .into_iter() + .map(|(peer_id, request)| WarpSyncAction::SendBlockRequest { peer_id, request }); + self.actions.extend(target_block_request); + + std::mem::take(&mut self.actions).into_iter() + } + + /// Take the result of finished warp sync, returning `None` if the sync was unsuccessful. + #[must_use] + pub fn take_result(&mut self) -> Option> { + self.result.take() + } +} + +#[cfg(test)] +mod test { + use super::*; + use sc_block_builder::BlockBuilderBuilder; + use sp_blockchain::{BlockStatus, Error as BlockchainError, HeaderBackend, Info}; + use sp_consensus_grandpa::{AuthorityList, SetId}; + use sp_runtime::traits::{Block as BlockT, Header as HeaderT, NumberFor}; + use std::{io::ErrorKind, sync::Arc}; + use substrate_test_runtime_client::{ + runtime::{Block, Hash}, + BlockBuilderExt, DefaultTestClientBuilderExt, TestClientBuilder, TestClientBuilderExt, + }; + + mockall::mock! { + pub Client {} + + impl HeaderBackend for Client { + fn header(&self, hash: B::Hash) -> Result, BlockchainError>; + fn info(&self) -> Info; + fn status(&self, hash: B::Hash) -> Result; + fn number( + &self, + hash: B::Hash, + ) -> Result::Header as HeaderT>::Number>, BlockchainError>; + fn hash(&self, number: NumberFor) -> Result, BlockchainError>; + } + } + + mockall::mock! { + pub WarpSyncProvider {} + + impl super::WarpSyncProvider for WarpSyncProvider { + fn generate( + &self, + start: B::Hash, + ) -> Result>; + fn verify( + &self, + proof: &EncodedProof, + set_id: SetId, + authorities: AuthorityList, + ) -> Result, Box>; + fn current_authorities(&self) -> AuthorityList; + } + } + + fn mock_client_with_state() -> MockClient { + let mut client = MockClient::::new(); + let genesis_hash = Hash::random(); + client.expect_info().return_once(move || Info { + best_hash: genesis_hash, + best_number: 0, + genesis_hash, + finalized_hash: genesis_hash, + finalized_number: 0, + // We need some finalized state to render warp sync impossible. + finalized_state: Some((genesis_hash, 0)), + number_leaves: 0, + block_gap: None, + }); + + client + } + + fn mock_client_without_state() -> MockClient { + let mut client = MockClient::::new(); + let genesis_hash = Hash::random(); + client.expect_info().returning(move || Info { + best_hash: genesis_hash, + best_number: 0, + genesis_hash, + finalized_hash: genesis_hash, + finalized_number: 0, + finalized_state: None, + number_leaves: 0, + block_gap: None, + }); + + client + } + + #[test] + fn warp_sync_with_provider_for_db_with_finalized_state_is_noop() { + let client = mock_client_with_state(); + let provider = MockWarpSyncProvider::::new(); + let config = WarpSyncConfig::WithProvider(Arc::new(provider)); + let mut warp_sync = WarpSync::new(Arc::new(client), config); + + // Warp sync instantly finishes + let actions = warp_sync.actions().collect::>(); + assert_eq!(actions.len(), 1); + assert!(matches!(actions[0], WarpSyncAction::Finished)); + + // ... with no result. + assert!(warp_sync.take_result().is_none()); + } + + #[test] + fn warp_sync_to_target_for_db_with_finalized_state_is_noop() { + let client = mock_client_with_state(); + let config = WarpSyncConfig::WaitForTarget; + let mut warp_sync = WarpSync::new(Arc::new(client), config); + + // Warp sync instantly finishes + let actions = warp_sync.actions().collect::>(); + assert_eq!(actions.len(), 1); + assert!(matches!(actions[0], WarpSyncAction::Finished)); + + // ... with no result. + assert!(warp_sync.take_result().is_none()); + } + + #[test] + fn warp_sync_with_provider_for_empty_db_doesnt_finish_instantly() { + let client = mock_client_without_state(); + let provider = MockWarpSyncProvider::::new(); + let config = WarpSyncConfig::WithProvider(Arc::new(provider)); + let mut warp_sync = WarpSync::new(Arc::new(client), config); + + // No actions are emitted. + assert_eq!(warp_sync.actions().count(), 0) + } + + #[test] + fn warp_sync_to_target_for_empty_db_doesnt_finish_instantly() { + let client = mock_client_without_state(); + let config = WarpSyncConfig::WaitForTarget; + let mut warp_sync = WarpSync::new(Arc::new(client), config); + + // No actions are emitted. + assert_eq!(warp_sync.actions().count(), 0) + } + + #[test] + fn warp_sync_is_started_only_when_there_is_enough_peers() { + let client = mock_client_without_state(); + let mut provider = MockWarpSyncProvider::::new(); + provider + .expect_current_authorities() + .once() + .return_const(AuthorityList::default()); + let config = WarpSyncConfig::WithProvider(Arc::new(provider)); + let mut warp_sync = WarpSync::new(Arc::new(client), config); + + // Warp sync is not started when there is not enough peers. + for _ in 0..(MIN_PEERS_TO_START_WARP_SYNC - 1) { + warp_sync.add_peer(PeerId::random(), Hash::random(), 10); + assert!(matches!(warp_sync.phase, Phase::WaitingForPeers { .. })) + } + + // Now we have enough peers and warp sync is started. + warp_sync.add_peer(PeerId::random(), Hash::random(), 10); + assert!(matches!(warp_sync.phase, Phase::WarpProof { .. })) + } + + #[test] + fn no_peer_is_scheduled_if_no_peers_connected() { + let client = mock_client_without_state(); + let provider = MockWarpSyncProvider::::new(); + let config = WarpSyncConfig::WithProvider(Arc::new(provider)); + let mut warp_sync = WarpSync::new(Arc::new(client), config); + + assert!(warp_sync.schedule_next_peer(PeerState::DownloadingProofs, None).is_none()); + } + + #[test] + fn enough_peers_are_used_in_tests() { + // Tests below use 10 peers. Fail early if it's less than a threshold for warp sync. + assert!( + 10 >= MIN_PEERS_TO_START_WARP_SYNC, + "Tests must be updated to use that many initial peers.", + ); + } + + #[test] + fn at_least_median_synced_peer_is_scheduled() { + for _ in 0..100 { + let client = mock_client_without_state(); + let mut provider = MockWarpSyncProvider::::new(); + provider + .expect_current_authorities() + .once() + .return_const(AuthorityList::default()); + let config = WarpSyncConfig::WithProvider(Arc::new(provider)); + let mut warp_sync = WarpSync::new(Arc::new(client), config); + + for best_number in 1..11 { + warp_sync.add_peer(PeerId::random(), Hash::random(), best_number); + } + + let peer_id = warp_sync.schedule_next_peer(PeerState::DownloadingProofs, None); + assert!(warp_sync.peers.get(&peer_id.unwrap()).unwrap().best_number >= 6); + } + } + + #[test] + fn min_best_number_peer_is_scheduled() { + for _ in 0..10 { + let client = mock_client_without_state(); + let mut provider = MockWarpSyncProvider::::new(); + provider + .expect_current_authorities() + .once() + .return_const(AuthorityList::default()); + let config = WarpSyncConfig::WithProvider(Arc::new(provider)); + let mut warp_sync = WarpSync::new(Arc::new(client), config); + + for best_number in 1..11 { + warp_sync.add_peer(PeerId::random(), Hash::random(), best_number); + } + + let peer_id = warp_sync.schedule_next_peer(PeerState::DownloadingProofs, Some(10)); + assert!(warp_sync.peers.get(&peer_id.unwrap()).unwrap().best_number == 10); + } + } + + #[test] + fn no_warp_proof_request_in_another_phase() { + let client = mock_client_without_state(); + let mut provider = MockWarpSyncProvider::::new(); + provider + .expect_current_authorities() + .once() + .return_const(AuthorityList::default()); + let config = WarpSyncConfig::WithProvider(Arc::new(provider)); + let mut warp_sync = WarpSync::new(Arc::new(client), config); + + // Make sure we have enough peers to make a request. + for best_number in 1..11 { + warp_sync.add_peer(PeerId::random(), Hash::random(), best_number); + } + + // Manually set to another phase. + warp_sync.phase = Phase::PendingTargetBlock; + + // No request is made. + assert!(warp_sync.warp_proof_request().is_none()); + } + + #[test] + fn warp_proof_request_starts_at_last_hash() { + let client = mock_client_without_state(); + let mut provider = MockWarpSyncProvider::::new(); + provider + .expect_current_authorities() + .once() + .return_const(AuthorityList::default()); + let config = WarpSyncConfig::WithProvider(Arc::new(provider)); + let mut warp_sync = WarpSync::new(Arc::new(client), config); + + // Make sure we have enough peers to make a request. + for best_number in 1..11 { + warp_sync.add_peer(PeerId::random(), Hash::random(), best_number); + } + assert!(matches!(warp_sync.phase, Phase::WarpProof { .. })); + + let known_last_hash = Hash::random(); + + // Manually set last hash to known value. + match &mut warp_sync.phase { + Phase::WarpProof { last_hash, .. } => { + *last_hash = known_last_hash; + }, + _ => panic!("Invalid phase."), + } + + let (_peer_id, request) = warp_sync.warp_proof_request().unwrap(); + assert_eq!(request.begin, known_last_hash); + } + + #[test] + fn no_parallel_warp_proof_requests() { + let client = mock_client_without_state(); + let mut provider = MockWarpSyncProvider::::new(); + provider + .expect_current_authorities() + .once() + .return_const(AuthorityList::default()); + let config = WarpSyncConfig::WithProvider(Arc::new(provider)); + let mut warp_sync = WarpSync::new(Arc::new(client), config); + + // Make sure we have enough peers to make requests. + for best_number in 1..11 { + warp_sync.add_peer(PeerId::random(), Hash::random(), best_number); + } + assert!(matches!(warp_sync.phase, Phase::WarpProof { .. })); + + // First request is made. + assert!(warp_sync.warp_proof_request().is_some()); + // Second request is not made. + assert!(warp_sync.warp_proof_request().is_none()); + } + + #[test] + fn bad_warp_proof_response_drops_peer() { + let client = mock_client_without_state(); + let mut provider = MockWarpSyncProvider::::new(); + provider + .expect_current_authorities() + .once() + .return_const(AuthorityList::default()); + // Warp proof verification fails. + provider.expect_verify().return_once(|_proof, _set_id, _authorities| { + Err(Box::new(std::io::Error::new(ErrorKind::Other, "test-verification-failure"))) + }); + let config = WarpSyncConfig::WithProvider(Arc::new(provider)); + let mut warp_sync = WarpSync::new(Arc::new(client), config); + + // Make sure we have enough peers to make a request. + for best_number in 1..11 { + warp_sync.add_peer(PeerId::random(), Hash::random(), best_number); + } + assert!(matches!(warp_sync.phase, Phase::WarpProof { .. })); + + // Consume `SendWarpProofRequest` action. + let actions = warp_sync.actions().collect::>(); + assert_eq!(actions.len(), 1); + let WarpSyncAction::SendWarpProofRequest { peer_id: request_peer_id, .. } = actions[0] + else { + panic!("Invalid action"); + }; + + warp_sync.on_warp_proof_response(&request_peer_id, EncodedProof(Vec::new())); + + // We only interested in alredy generated actions, not new requests. + let actions = std::mem::take(&mut warp_sync.actions); + assert_eq!(actions.len(), 1); + assert!(matches!( + actions[0], + WarpSyncAction::DropPeer(BadPeer(peer_id, _rep)) if peer_id == request_peer_id + )); + assert!(matches!(warp_sync.phase, Phase::WarpProof { .. })); + } + + #[test] + fn partial_warp_proof_doesnt_advance_phase() { + let client = mock_client_without_state(); + let mut provider = MockWarpSyncProvider::::new(); + provider + .expect_current_authorities() + .once() + .return_const(AuthorityList::default()); + // Warp proof is partial. + provider.expect_verify().return_once(|_proof, set_id, authorities| { + Ok(VerificationResult::Partial(set_id, authorities, Hash::random())) + }); + let config = WarpSyncConfig::WithProvider(Arc::new(provider)); + let mut warp_sync = WarpSync::new(Arc::new(client), config); + + // Make sure we have enough peers to make a request. + for best_number in 1..11 { + warp_sync.add_peer(PeerId::random(), Hash::random(), best_number); + } + assert!(matches!(warp_sync.phase, Phase::WarpProof { .. })); + + // Consume `SendWarpProofRequest` action. + let actions = warp_sync.actions().collect::>(); + assert_eq!(actions.len(), 1); + let WarpSyncAction::SendWarpProofRequest { peer_id: request_peer_id, .. } = actions[0] + else { + panic!("Invalid action"); + }; + + warp_sync.on_warp_proof_response(&request_peer_id, EncodedProof(Vec::new())); + + assert!(warp_sync.actions.is_empty(), "No extra actions generated"); + assert!(matches!(warp_sync.phase, Phase::WarpProof { .. })); + } + + #[test] + fn complete_warp_proof_advances_phase() { + let client = Arc::new(TestClientBuilder::new().set_no_genesis().build()); + let mut provider = MockWarpSyncProvider::::new(); + provider + .expect_current_authorities() + .once() + .return_const(AuthorityList::default()); + let target_block = BlockBuilderBuilder::new(&*client) + .on_parent_block(client.chain_info().best_hash) + .with_parent_block_number(client.chain_info().best_number) + .build() + .unwrap() + .build() + .unwrap() + .block; + let target_header = target_block.header().clone(); + // Warp proof is complete. + provider.expect_verify().return_once(move |_proof, set_id, authorities| { + Ok(VerificationResult::Complete(set_id, authorities, target_header)) + }); + let config = WarpSyncConfig::WithProvider(Arc::new(provider)); + let mut warp_sync = WarpSync::new(client, config); + + // Make sure we have enough peers to make a request. + for best_number in 1..11 { + warp_sync.add_peer(PeerId::random(), Hash::random(), best_number); + } + assert!(matches!(warp_sync.phase, Phase::WarpProof { .. })); + + // Consume `SendWarpProofRequest` action. + let actions = warp_sync.actions().collect::>(); + assert_eq!(actions.len(), 1); + let WarpSyncAction::SendWarpProofRequest { peer_id: request_peer_id, .. } = actions[0] + else { + panic!("Invalid action."); + }; + + warp_sync.on_warp_proof_response(&request_peer_id, EncodedProof(Vec::new())); + + assert!(warp_sync.actions.is_empty(), "No extra actions generated."); + assert!( + matches!(warp_sync.phase, Phase::TargetBlock(header) if header == *target_block.header()) + ); + } + + #[test] + fn no_target_block_requests_in_another_phase() { + let client = mock_client_without_state(); + let mut provider = MockWarpSyncProvider::::new(); + provider + .expect_current_authorities() + .once() + .return_const(AuthorityList::default()); + let config = WarpSyncConfig::WithProvider(Arc::new(provider)); + let mut warp_sync = WarpSync::new(Arc::new(client), config); + + // Make sure we have enough peers to make a request. + for best_number in 1..11 { + warp_sync.add_peer(PeerId::random(), Hash::random(), best_number); + } + // We are not in `Phase::TargetBlock` + assert!(matches!(warp_sync.phase, Phase::WarpProof { .. })); + + // No request is made. + assert!(warp_sync.target_block_request().is_none()); + } + + #[test] + fn target_block_request_is_correct() { + let client = Arc::new(TestClientBuilder::new().set_no_genesis().build()); + let mut provider = MockWarpSyncProvider::::new(); + provider + .expect_current_authorities() + .once() + .return_const(AuthorityList::default()); + let target_block = BlockBuilderBuilder::new(&*client) + .on_parent_block(client.chain_info().best_hash) + .with_parent_block_number(client.chain_info().best_number) + .build() + .unwrap() + .build() + .unwrap() + .block; + let target_header = target_block.header().clone(); + // Warp proof is complete. + provider.expect_verify().return_once(move |_proof, set_id, authorities| { + Ok(VerificationResult::Complete(set_id, authorities, target_header)) + }); + let config = WarpSyncConfig::WithProvider(Arc::new(provider)); + let mut warp_sync = WarpSync::new(client, config); + + // Make sure we have enough peers to make a request. + for best_number in 1..11 { + warp_sync.add_peer(PeerId::random(), Hash::random(), best_number); + } + + // Manually set `TargetBlock` phase. + warp_sync.phase = Phase::TargetBlock(target_block.header().clone()); + + let (_peer_id, request) = warp_sync.target_block_request().unwrap(); + assert_eq!(request.from, FromBlock::Hash(target_block.header().hash())); + assert_eq!( + request.fields, + BlockAttributes::HEADER | BlockAttributes::BODY | BlockAttributes::JUSTIFICATION + ); + assert_eq!(request.max, Some(1)); + } + + #[test] + fn externally_set_target_block_is_requested() { + let client = Arc::new(TestClientBuilder::new().set_no_genesis().build()); + let target_block = BlockBuilderBuilder::new(&*client) + .on_parent_block(client.chain_info().best_hash) + .with_parent_block_number(client.chain_info().best_number) + .build() + .unwrap() + .build() + .unwrap() + .block; + let target_header = target_block.header().clone(); + let config = WarpSyncConfig::WaitForTarget; + let mut warp_sync = WarpSync::new(client, config); + + // Make sure we have enough peers to make a request. + for best_number in 1..11 { + warp_sync.add_peer(PeerId::random(), Hash::random(), best_number); + } + + // No actions generated so far. + assert_eq!(warp_sync.actions().count(), 0); + + warp_sync.set_target_block(target_header); + assert!(matches!(warp_sync.phase, Phase::TargetBlock(_))); + + let (_peer_id, request) = warp_sync.target_block_request().unwrap(); + assert_eq!(request.from, FromBlock::Hash(target_block.header().hash())); + assert_eq!( + request.fields, + BlockAttributes::HEADER | BlockAttributes::BODY | BlockAttributes::JUSTIFICATION + ); + assert_eq!(request.max, Some(1)); + } + + #[test] + fn no_parallel_target_block_requests() { + let client = Arc::new(TestClientBuilder::new().set_no_genesis().build()); + let mut provider = MockWarpSyncProvider::::new(); + provider + .expect_current_authorities() + .once() + .return_const(AuthorityList::default()); + let target_block = BlockBuilderBuilder::new(&*client) + .on_parent_block(client.chain_info().best_hash) + .with_parent_block_number(client.chain_info().best_number) + .build() + .unwrap() + .build() + .unwrap() + .block; + let target_header = target_block.header().clone(); + // Warp proof is complete. + provider.expect_verify().return_once(move |_proof, set_id, authorities| { + Ok(VerificationResult::Complete(set_id, authorities, target_header)) + }); + let config = WarpSyncConfig::WithProvider(Arc::new(provider)); + let mut warp_sync = WarpSync::new(client, config); + + // Make sure we have enough peers to make a request. + for best_number in 1..11 { + warp_sync.add_peer(PeerId::random(), Hash::random(), best_number); + } + + // Manually set `TargetBlock` phase. + warp_sync.phase = Phase::TargetBlock(target_block.header().clone()); + + // First target block request is made. + assert!(warp_sync.target_block_request().is_some()); + // No parallel request is made. + assert!(warp_sync.target_block_request().is_none()); + } + + #[test] + fn target_block_response_with_no_blocks_drops_peer() { + let client = Arc::new(TestClientBuilder::new().set_no_genesis().build()); + let mut provider = MockWarpSyncProvider::::new(); + provider + .expect_current_authorities() + .once() + .return_const(AuthorityList::default()); + let target_block = BlockBuilderBuilder::new(&*client) + .on_parent_block(client.chain_info().best_hash) + .with_parent_block_number(client.chain_info().best_number) + .build() + .unwrap() + .build() + .unwrap() + .block; + let target_header = target_block.header().clone(); + // Warp proof is complete. + provider.expect_verify().return_once(move |_proof, set_id, authorities| { + Ok(VerificationResult::Complete(set_id, authorities, target_header)) + }); + let config = WarpSyncConfig::WithProvider(Arc::new(provider)); + let mut warp_sync = WarpSync::new(client, config); + + // Make sure we have enough peers to make a request. + for best_number in 1..11 { + warp_sync.add_peer(PeerId::random(), Hash::random(), best_number); + } + + // Manually set `TargetBlock` phase. + warp_sync.phase = Phase::TargetBlock(target_block.header().clone()); + + let (peer_id, request) = warp_sync.target_block_request().unwrap(); + + // Empty block response received. + let response = Vec::new(); + // Peer is dropped. + assert!(matches!( + warp_sync.on_block_response_inner(peer_id, request, response), + Err(BadPeer(id, _rep)) if id == peer_id, + )); + } + + #[test] + fn target_block_response_with_extra_blocks_drops_peer() { + let client = Arc::new(TestClientBuilder::new().set_no_genesis().build()); + let mut provider = MockWarpSyncProvider::::new(); + provider + .expect_current_authorities() + .once() + .return_const(AuthorityList::default()); + let target_block = BlockBuilderBuilder::new(&*client) + .on_parent_block(client.chain_info().best_hash) + .with_parent_block_number(client.chain_info().best_number) + .build() + .unwrap() + .build() + .unwrap() + .block; + + let mut extra_block_builder = BlockBuilderBuilder::new(&*client) + .on_parent_block(client.chain_info().best_hash) + .with_parent_block_number(client.chain_info().best_number) + .build() + .unwrap(); + extra_block_builder + .push_storage_change(vec![1, 2, 3], Some(vec![4, 5, 6])) + .unwrap(); + let extra_block = extra_block_builder.build().unwrap().block; + + let target_header = target_block.header().clone(); + // Warp proof is complete. + provider.expect_verify().return_once(move |_proof, set_id, authorities| { + Ok(VerificationResult::Complete(set_id, authorities, target_header)) + }); + let config = WarpSyncConfig::WithProvider(Arc::new(provider)); + let mut warp_sync = WarpSync::new(client, config); + + // Make sure we have enough peers to make a request. + for best_number in 1..11 { + warp_sync.add_peer(PeerId::random(), Hash::random(), best_number); + } + + // Manually set `TargetBlock` phase. + warp_sync.phase = Phase::TargetBlock(target_block.header().clone()); + + let (peer_id, request) = warp_sync.target_block_request().unwrap(); + + // Block response with extra blocks received. + let response = vec![ + BlockData:: { + hash: target_block.header().hash(), + header: Some(target_block.header().clone()), + body: Some(target_block.extrinsics().iter().cloned().collect::>()), + indexed_body: None, + receipt: None, + message_queue: None, + justification: None, + justifications: None, + }, + BlockData:: { + hash: extra_block.header().hash(), + header: Some(extra_block.header().clone()), + body: Some(extra_block.extrinsics().iter().cloned().collect::>()), + indexed_body: None, + receipt: None, + message_queue: None, + justification: None, + justifications: None, + }, + ]; + // Peer is dropped. + assert!(matches!( + warp_sync.on_block_response_inner(peer_id, request, response), + Err(BadPeer(id, _rep)) if id == peer_id, + )); + } + + #[test] + fn target_block_response_with_wrong_block_drops_peer() { + sp_tracing::try_init_simple(); + + let client = Arc::new(TestClientBuilder::new().set_no_genesis().build()); + let mut provider = MockWarpSyncProvider::::new(); + provider + .expect_current_authorities() + .once() + .return_const(AuthorityList::default()); + let target_block = BlockBuilderBuilder::new(&*client) + .on_parent_block(client.chain_info().best_hash) + .with_parent_block_number(client.chain_info().best_number) + .build() + .unwrap() + .build() + .unwrap() + .block; + + let mut wrong_block_builder = BlockBuilderBuilder::new(&*client) + .on_parent_block(client.chain_info().best_hash) + .with_parent_block_number(client.chain_info().best_number) + .build() + .unwrap(); + wrong_block_builder + .push_storage_change(vec![1, 2, 3], Some(vec![4, 5, 6])) + .unwrap(); + let wrong_block = wrong_block_builder.build().unwrap().block; + + let target_header = target_block.header().clone(); + // Warp proof is complete. + provider.expect_verify().return_once(move |_proof, set_id, authorities| { + Ok(VerificationResult::Complete(set_id, authorities, target_header)) + }); + let config = WarpSyncConfig::WithProvider(Arc::new(provider)); + let mut warp_sync = WarpSync::new(client, config); + + // Make sure we have enough peers to make a request. + for best_number in 1..11 { + warp_sync.add_peer(PeerId::random(), Hash::random(), best_number); + } + + // Manually set `TargetBlock` phase. + warp_sync.phase = Phase::TargetBlock(target_block.header().clone()); + + let (peer_id, request) = warp_sync.target_block_request().unwrap(); + + // Wrong block received. + let response = vec![BlockData:: { + hash: wrong_block.header().hash(), + header: Some(wrong_block.header().clone()), + body: Some(wrong_block.extrinsics().iter().cloned().collect::>()), + indexed_body: None, + receipt: None, + message_queue: None, + justification: None, + justifications: None, + }]; + // Peer is dropped. + assert!(matches!( + warp_sync.on_block_response_inner(peer_id, request, response), + Err(BadPeer(id, _rep)) if id == peer_id, + )); + } + + #[test] + fn correct_target_block_response_sets_strategy_result() { + let client = Arc::new(TestClientBuilder::new().set_no_genesis().build()); + let mut provider = MockWarpSyncProvider::::new(); + provider + .expect_current_authorities() + .once() + .return_const(AuthorityList::default()); + let mut target_block_builder = BlockBuilderBuilder::new(&*client) + .on_parent_block(client.chain_info().best_hash) + .with_parent_block_number(client.chain_info().best_number) + .build() + .unwrap(); + target_block_builder + .push_storage_change(vec![1, 2, 3], Some(vec![4, 5, 6])) + .unwrap(); + let target_block = target_block_builder.build().unwrap().block; + let target_header = target_block.header().clone(); + // Warp proof is complete. + provider.expect_verify().return_once(move |_proof, set_id, authorities| { + Ok(VerificationResult::Complete(set_id, authorities, target_header)) + }); + let config = WarpSyncConfig::WithProvider(Arc::new(provider)); + let mut warp_sync = WarpSync::new(client, config); + + // Make sure we have enough peers to make a request. + for best_number in 1..11 { + warp_sync.add_peer(PeerId::random(), Hash::random(), best_number); + } + + // Manually set `TargetBlock` phase. + warp_sync.phase = Phase::TargetBlock(target_block.header().clone()); + + let (peer_id, request) = warp_sync.target_block_request().unwrap(); + + // Correct block received. + let body = Some(target_block.extrinsics().iter().cloned().collect::>()); + let justifications = Some(Justifications::from((*b"FRNK", Vec::new()))); + let response = vec![BlockData:: { + hash: target_block.header().hash(), + header: Some(target_block.header().clone()), + body: body.clone(), + indexed_body: None, + receipt: None, + message_queue: None, + justification: None, + justifications: justifications.clone(), + }]; + + assert!(warp_sync.on_block_response_inner(peer_id, request, response).is_ok()); + + // Strategy finishes. + let actions = warp_sync.actions().collect::>(); + assert_eq!(actions.len(), 1); + assert!(matches!(actions[0], WarpSyncAction::Finished)); + + // With correct result. + let result = warp_sync.take_result().unwrap(); + assert_eq!(result.target_header, *target_block.header()); + assert_eq!(result.target_body, body); + assert_eq!(result.target_justifications, justifications); + } +} diff --git a/substrate/client/network/sync/src/types.rs b/substrate/client/network/sync/src/types.rs index 5931cf47b28..4074b33eee1 100644 --- a/substrate/client/network/sync/src/types.rs +++ b/substrate/client/network/sync/src/types.rs @@ -23,14 +23,12 @@ use sc_network_common::{role::Roles, types::ReputationChange}; use libp2p::PeerId; -use crate::warp::WarpSyncProgress; +use crate::strategy::{state_sync::StateSyncProgress, warp::WarpSyncProgress}; use sc_network_common::sync::message::BlockRequest; use sp_runtime::traits::{Block as BlockT, NumberFor}; use std::{any::Any, fmt, fmt::Formatter, pin::Pin, sync::Arc}; -pub use sc_network_common::sync::SyncMode; - /// The sync status of a peer we are trying to sync with #[derive(Debug)] pub struct PeerInfo { @@ -69,15 +67,6 @@ impl SyncState { } } -/// Reported state download progress. -#[derive(Clone, Eq, PartialEq, Debug)] -pub struct StateDownloadProgress { - /// Estimated download percentage. - pub percentage: u32, - /// Total state size in bytes downloaded so far. - pub size: u64, -} - /// Syncing status and statistics. #[derive(Debug, Clone)] pub struct SyncStatus { @@ -92,7 +81,7 @@ pub struct SyncStatus { /// Number of blocks queued for import pub queued_blocks: u32, /// State sync status in progress, if any. - pub state_sync: Option, + pub state_sync: Option, /// Warp sync in progress, if any. pub warp_sync: Option>, } @@ -109,13 +98,6 @@ impl fmt::Display for BadPeer { impl std::error::Error for BadPeer {} -#[derive(Debug)] -pub struct Metrics { - pub queued_blocks: u32, - pub fork_targets: u32, - pub justifications: crate::request_metrics::Metrics, -} - #[derive(Debug)] pub enum PeerRequest { Block(BlockRequest), diff --git a/substrate/client/network/sync/src/warp.rs b/substrate/client/network/sync/src/warp.rs deleted file mode 100644 index 169b3de35aa..00000000000 --- a/substrate/client/network/sync/src/warp.rs +++ /dev/null @@ -1,405 +0,0 @@ -// This file is part of Substrate. - -// Copyright (C) Parity Technologies (UK) Ltd. -// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -//! Warp sync support. - -pub use sp_consensus_grandpa::{AuthorityList, SetId}; - -use crate::{ - schema::v1::{StateRequest, StateResponse}, - state::{ImportResult, StateSync}, -}; -use codec::{Decode, Encode}; -use futures::channel::oneshot; -use log::error; -use sc_client_api::ProofProvider; -use sc_network_common::sync::message::{ - BlockAttributes, BlockData, BlockRequest, Direction, FromBlock, -}; -use sp_blockchain::HeaderBackend; -use sp_runtime::traits::{Block as BlockT, Header, NumberFor, Zero}; -use std::{fmt, sync::Arc}; - -/// Log target for this file. -const LOG_TARGET: &'static str = "sync"; - -/// Scale-encoded warp sync proof response. -pub struct EncodedProof(pub Vec); - -/// Warp sync request -#[derive(Encode, Decode, Debug, Clone)] -pub struct WarpProofRequest { - /// Start collecting proofs from this block. - pub begin: B::Hash, -} - -/// Proof verification result. -pub enum VerificationResult { - /// Proof is valid, but the target was not reached. - Partial(SetId, AuthorityList, Block::Hash), - /// Target finality is proved. - Complete(SetId, AuthorityList, Block::Header), -} - -/// Warp sync backend. Handles retrieving and verifying warp sync proofs. -pub trait WarpSyncProvider: Send + Sync { - /// Generate proof starting at given block hash. The proof is accumulated until maximum proof - /// size is reached. - fn generate( - &self, - start: Block::Hash, - ) -> Result>; - /// Verify warp proof against current set of authorities. - fn verify( - &self, - proof: &EncodedProof, - set_id: SetId, - authorities: AuthorityList, - ) -> Result, Box>; - /// Get current list of authorities. This is supposed to be genesis authorities when starting - /// sync. - fn current_authorities(&self) -> AuthorityList; -} - -/// Reported warp sync phase. -#[derive(Clone, Eq, PartialEq, Debug)] -pub enum WarpSyncPhase { - /// Waiting for peers to connect. - AwaitingPeers { required_peers: usize }, - /// Waiting for target block to be received. - AwaitingTargetBlock, - /// Downloading and verifying grandpa warp proofs. - DownloadingWarpProofs, - /// Downloading target block. - DownloadingTargetBlock, - /// Downloading state data. - DownloadingState, - /// Importing state. - ImportingState, - /// Downloading block history. - DownloadingBlocks(NumberFor), -} - -impl fmt::Display for WarpSyncPhase { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match self { - Self::AwaitingPeers { required_peers } => - write!(f, "Waiting for {required_peers} peers to be connected"), - Self::AwaitingTargetBlock => write!(f, "Waiting for target block to be received"), - Self::DownloadingWarpProofs => write!(f, "Downloading finality proofs"), - Self::DownloadingTargetBlock => write!(f, "Downloading target block"), - Self::DownloadingState => write!(f, "Downloading state"), - Self::ImportingState => write!(f, "Importing state"), - Self::DownloadingBlocks(n) => write!(f, "Downloading block history (#{})", n), - } - } -} - -/// Reported warp sync progress. -#[derive(Clone, Eq, PartialEq, Debug)] -pub struct WarpSyncProgress { - /// Estimated download percentage. - pub phase: WarpSyncPhase, - /// Total bytes downloaded so far. - pub total_bytes: u64, -} - -/// The different types of warp syncing, passed to `build_network`. -pub enum WarpSyncParams { - /// Standard warp sync for the chain. - WithProvider(Arc>), - /// Skip downloading proofs and wait for a header of the state that should be downloaded. - /// - /// It is expected that the header provider ensures that the header is trusted. - WaitForTarget(oneshot::Receiver<::Header>), -} - -/// Warp sync configuration as accepted by [`WarpSync`]. -pub enum WarpSyncConfig { - /// Standard warp sync for the chain. - WithProvider(Arc>), - /// Skip downloading proofs and wait for a header of the state that should be downloaded. - /// - /// It is expected that the header provider ensures that the header is trusted. - WaitForTarget, -} - -impl WarpSyncParams { - /// Split `WarpSyncParams` into `WarpSyncConfig` and warp sync target block header receiver. - pub fn split( - self, - ) -> (WarpSyncConfig, Option::Header>>) { - match self { - WarpSyncParams::WithProvider(provider) => - (WarpSyncConfig::WithProvider(provider), None), - WarpSyncParams::WaitForTarget(rx) => (WarpSyncConfig::WaitForTarget, Some(rx)), - } - } -} - -/// Warp sync phase. -enum Phase { - /// Downloading warp proofs. - WarpProof { - set_id: SetId, - authorities: AuthorityList, - last_hash: B::Hash, - warp_sync_provider: Arc>, - }, - /// Waiting for target block to be set externally if we skip warp proofs downloading, - /// and start straight from the target block (used by parachains warp sync). - PendingTargetBlock, - /// Downloading target block. - TargetBlock(B::Header), - /// Downloading state. - State(StateSync), -} - -/// Import warp proof result. -pub enum WarpProofImportResult { - /// Import was successful. - Success, - /// Bad proof. - BadResponse, -} - -/// Import target block result. -pub enum TargetBlockImportResult { - /// Import was successful. - Success, - /// Invalid block. - BadResponse, -} - -/// Warp sync state machine. Accumulates warp proofs and state. -pub struct WarpSync { - phase: Phase, - client: Arc, - total_proof_bytes: u64, -} - -impl WarpSync -where - B: BlockT, - Client: HeaderBackend + ProofProvider + 'static, -{ - /// Create a new instance. When passing a warp sync provider we will be checking for proof and - /// authorities. Alternatively we can pass a target block when we want to skip downloading - /// proofs, in this case we will continue polling until the target block is known. - pub fn new(client: Arc, warp_sync_config: WarpSyncConfig) -> Self { - let last_hash = client.hash(Zero::zero()).unwrap().expect("Genesis header always exists"); - match warp_sync_config { - WarpSyncConfig::WithProvider(warp_sync_provider) => { - let phase = Phase::WarpProof { - set_id: 0, - authorities: warp_sync_provider.current_authorities(), - last_hash, - warp_sync_provider: warp_sync_provider.clone(), - }; - Self { client, phase, total_proof_bytes: 0 } - }, - WarpSyncConfig::WaitForTarget => - Self { client, phase: Phase::PendingTargetBlock, total_proof_bytes: 0 }, - } - } - - /// Set target block externally in case we skip warp proof downloading. - pub fn set_target_block(&mut self, header: B::Header) { - let Phase::PendingTargetBlock = self.phase else { - error!( - target: LOG_TARGET, - "Attempt to set warp sync target block in invalid phase.", - ); - debug_assert!(false); - return - }; - - self.phase = Phase::TargetBlock(header); - } - - /// Validate and import a state response. - pub fn import_state(&mut self, response: StateResponse) -> ImportResult { - match &mut self.phase { - Phase::WarpProof { .. } | Phase::TargetBlock(_) | Phase::PendingTargetBlock { .. } => { - log::debug!(target: "sync", "Unexpected state response"); - ImportResult::BadResponse - }, - Phase::State(sync) => sync.import(response), - } - } - - /// Validate and import a warp proof response. - pub fn import_warp_proof(&mut self, response: EncodedProof) -> WarpProofImportResult { - match &mut self.phase { - Phase::State(_) | Phase::TargetBlock(_) | Phase::PendingTargetBlock { .. } => { - log::debug!(target: "sync", "Unexpected warp proof response"); - WarpProofImportResult::BadResponse - }, - Phase::WarpProof { set_id, authorities, last_hash, warp_sync_provider } => - match warp_sync_provider.verify(&response, *set_id, authorities.clone()) { - Err(e) => { - log::debug!(target: "sync", "Bad warp proof response: {}", e); - WarpProofImportResult::BadResponse - }, - Ok(VerificationResult::Partial(new_set_id, new_authorities, new_last_hash)) => { - log::debug!(target: "sync", "Verified partial proof, set_id={:?}", new_set_id); - *set_id = new_set_id; - *authorities = new_authorities; - *last_hash = new_last_hash; - self.total_proof_bytes += response.0.len() as u64; - WarpProofImportResult::Success - }, - Ok(VerificationResult::Complete(new_set_id, _, header)) => { - log::debug!(target: "sync", "Verified complete proof, set_id={:?}", new_set_id); - self.total_proof_bytes += response.0.len() as u64; - self.phase = Phase::TargetBlock(header); - WarpProofImportResult::Success - }, - }, - } - } - - /// Import the target block body. - pub fn import_target_block(&mut self, block: BlockData) -> TargetBlockImportResult { - match &mut self.phase { - Phase::WarpProof { .. } | Phase::State(_) | Phase::PendingTargetBlock { .. } => { - log::debug!(target: "sync", "Unexpected target block response"); - TargetBlockImportResult::BadResponse - }, - Phase::TargetBlock(header) => - if let Some(block_header) = &block.header { - if block_header == header { - if block.body.is_some() { - let state_sync = StateSync::new( - self.client.clone(), - header.clone(), - block.body, - block.justifications, - false, - ); - self.phase = Phase::State(state_sync); - TargetBlockImportResult::Success - } else { - log::debug!( - target: "sync", - "Importing target block failed: missing body.", - ); - TargetBlockImportResult::BadResponse - } - } else { - log::debug!( - target: "sync", - "Importing target block failed: different header.", - ); - TargetBlockImportResult::BadResponse - } - } else { - log::debug!(target: "sync", "Importing target block failed: missing header."); - TargetBlockImportResult::BadResponse - }, - } - } - - /// Produce next state request. - pub fn next_state_request(&self) -> Option { - match &self.phase { - Phase::WarpProof { .. } | Phase::TargetBlock(_) | Phase::PendingTargetBlock { .. } => - None, - Phase::State(sync) => Some(sync.next_request()), - } - } - - /// Produce next warp proof request. - pub fn next_warp_proof_request(&self) -> Option> { - match &self.phase { - Phase::WarpProof { last_hash, .. } => Some(WarpProofRequest { begin: *last_hash }), - Phase::TargetBlock(_) | Phase::State(_) | Phase::PendingTargetBlock { .. } => None, - } - } - - /// Produce next target block request. - pub fn next_target_block_request(&self) -> Option<(NumberFor, BlockRequest)> { - match &self.phase { - Phase::WarpProof { .. } | Phase::State(_) | Phase::PendingTargetBlock { .. } => None, - Phase::TargetBlock(header) => { - let request = BlockRequest:: { - id: 0, - fields: BlockAttributes::HEADER | - BlockAttributes::BODY | BlockAttributes::JUSTIFICATION, - from: FromBlock::Hash(header.hash()), - direction: Direction::Ascending, - max: Some(1), - }; - Some((*header.number(), request)) - }, - } - } - - /// Return target block hash if it is known. - pub fn target_block_hash(&self) -> Option { - match &self.phase { - Phase::WarpProof { .. } | Phase::TargetBlock(_) | Phase::PendingTargetBlock { .. } => - None, - Phase::State(s) => Some(s.target()), - } - } - - /// Return target block number if it is known. - pub fn target_block_number(&self) -> Option> { - match &self.phase { - Phase::WarpProof { .. } | Phase::PendingTargetBlock { .. } => None, - Phase::TargetBlock(header) => Some(*header.number()), - Phase::State(s) => Some(s.target_block_num()), - } - } - - /// Check if the state is complete. - pub fn is_complete(&self) -> bool { - match &self.phase { - Phase::WarpProof { .. } | Phase::TargetBlock(_) | Phase::PendingTargetBlock { .. } => - false, - Phase::State(sync) => sync.is_complete(), - } - } - - /// Returns state sync estimated progress (percentage, bytes) - pub fn progress(&self) -> WarpSyncProgress { - match &self.phase { - Phase::WarpProof { .. } => WarpSyncProgress { - phase: WarpSyncPhase::DownloadingWarpProofs, - total_bytes: self.total_proof_bytes, - }, - Phase::TargetBlock(_) => WarpSyncProgress { - phase: WarpSyncPhase::DownloadingTargetBlock, - total_bytes: self.total_proof_bytes, - }, - Phase::PendingTargetBlock { .. } => WarpSyncProgress { - phase: WarpSyncPhase::AwaitingTargetBlock, - total_bytes: self.total_proof_bytes, - }, - Phase::State(sync) => WarpSyncProgress { - phase: if self.is_complete() { - WarpSyncPhase::ImportingState - } else { - WarpSyncPhase::DownloadingState - }, - total_bytes: self.total_proof_bytes + sync.progress().size, - }, - } - } -} diff --git a/substrate/client/network/sync/src/warp_request_handler.rs b/substrate/client/network/sync/src/warp_request_handler.rs index b23f30c50dd..39cf1c5d806 100644 --- a/substrate/client/network/sync/src/warp_request_handler.rs +++ b/substrate/client/network/sync/src/warp_request_handler.rs @@ -20,7 +20,10 @@ use codec::Decode; use futures::{channel::oneshot, stream::StreamExt}; use log::debug; -use crate::warp::{EncodedProof, WarpProofRequest, WarpSyncProvider}; +use crate::{ + strategy::warp::{EncodedProof, WarpProofRequest, WarpSyncProvider}, + LOG_TARGET, +}; use sc_network::{ config::ProtocolId, request_responses::{ @@ -120,10 +123,10 @@ impl RequestHandler { match self.handle_request(payload, pending_response) { Ok(()) => { - debug!(target: "sync", "Handled grandpa warp sync request from {}.", peer) + debug!(target: LOG_TARGET, "Handled grandpa warp sync request from {}.", peer) }, Err(e) => debug!( - target: "sync", + target: LOG_TARGET, "Failed to handle grandpa warp sync request from {}: {}", peer, e, ), diff --git a/substrate/client/network/test/src/lib.rs b/substrate/client/network/test/src/lib.rs index 71f13b74a53..aeed2985ace 100644 --- a/substrate/client/network/test/src/lib.rs +++ b/substrate/client/network/test/src/lib.rs @@ -66,7 +66,7 @@ use sc_network_sync::{ block_request_handler::BlockRequestHandler, service::{network::NetworkServiceProvider, syncing_service::SyncingService}, state_request_handler::StateRequestHandler, - warp::{ + strategy::warp::{ AuthorityList, EncodedProof, SetId, VerificationResult, WarpSyncParams, WarpSyncProvider, }, warp_request_handler, @@ -699,6 +699,8 @@ pub struct FullPeerConfig { pub storage_chain: bool, /// Optional target block header to sync to pub target_block: Option<::Header>, + /// Force genesis even in case of warp & light state sync. + pub force_genesis: bool, } #[async_trait::async_trait] @@ -758,7 +760,9 @@ pub trait TestNetFactory: Default + Sized + Send { *genesis_extra_storage = storage; } - if matches!(config.sync_mode, SyncMode::LightState { .. } | SyncMode::Warp) { + if !config.force_genesis && + matches!(config.sync_mode, SyncMode::LightState { .. } | SyncMode::Warp) + { test_client_builder = test_client_builder.set_no_genesis(); } let backend = test_client_builder.backend(); diff --git a/substrate/client/network/test/src/sync.rs b/substrate/client/network/test/src/sync.rs index f2be662ada1..c025a8262f0 100644 --- a/substrate/client/network/test/src/sync.rs +++ b/substrate/client/network/test/src/sync.rs @@ -1232,12 +1232,14 @@ async fn warp_sync() { let target = net.peer(0).push_blocks(1, false).pop().unwrap(); net.peer(1).push_blocks(64, false); net.peer(2).push_blocks(64, false); - // Wait for peer 1 to sync state. + // Wait for peer 3 to sync state. net.run_until_sync().await; + // Make sure it was not a full sync. assert!(!net.peer(3).client().has_state_at(&BlockId::Number(1))); + // Make sure warp sync was successful. assert!(net.peer(3).client().has_state_at(&BlockId::Number(64))); - // Wait for peer 1 download block history + // Wait for peer 3 to download block history (gap sync). futures::future::poll_fn::<(), _>(|cx| { net.poll(cx); if net.peer(3).has_body(gap_end) && net.peer(3).has_body(target) { @@ -1249,6 +1251,35 @@ async fn warp_sync() { .await; } +/// If there is a finalized state in the DB, warp sync falls back to full sync. +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn warp_sync_failover_to_full_sync() { + sp_tracing::try_init_simple(); + let mut net = TestNet::new(0); + // Create 3 synced peers and 1 peer trying to warp sync. + net.add_full_peer_with_config(Default::default()); + net.add_full_peer_with_config(Default::default()); + net.add_full_peer_with_config(Default::default()); + net.add_full_peer_with_config(FullPeerConfig { + sync_mode: SyncMode::Warp, + // We want some finalized state in the DB to make warp sync impossible. + force_genesis: true, + ..Default::default() + }); + net.peer(0).push_blocks(64, false); + net.peer(1).push_blocks(64, false); + net.peer(2).push_blocks(64, false); + // Even though we requested peer 3 to warp sync, it'll fall back to full sync if there is + // a finalized state in the DB. + assert!(net.peer(3).client().info().finalized_state.is_some()); + // Wait for peer 3 to sync. + net.run_until_sync().await; + // Make sure it was a full sync (peer 3 has state for all blocks). + (1..65) + .into_iter() + .for_each(|i| assert!(net.peer(3).client().has_state_at(&BlockId::Number(i as u64)))); +} + #[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn warp_sync_to_target_block() { sp_tracing::try_init_simple(); diff --git a/substrate/client/service/src/builder.rs b/substrate/client/service/src/builder.rs index 1a3a679c519..0b8c86be92b 100644 --- a/substrate/client/service/src/builder.rs +++ b/substrate/client/service/src/builder.rs @@ -52,8 +52,8 @@ use sc_network_light::light_client_requests::handler::LightClientRequestHandler; use sc_network_sync::{ block_relay_protocol::BlockRelayParams, block_request_handler::BlockRequestHandler, engine::SyncingEngine, service::network::NetworkServiceProvider, - state_request_handler::StateRequestHandler, warp::WarpSyncParams, - warp_request_handler::RequestHandler as WarpSyncRequestHandler, SyncingService, + state_request_handler::StateRequestHandler, + warp_request_handler::RequestHandler as WarpSyncRequestHandler, SyncingService, WarpSyncParams, }; use sc_rpc::{ author::AuthorApiServer, diff --git a/substrate/client/service/src/lib.rs b/substrate/client/service/src/lib.rs index 0c7e138ce90..bec1044daab 100644 --- a/substrate/client/service/src/lib.rs +++ b/substrate/client/service/src/lib.rs @@ -77,7 +77,7 @@ pub use sc_chain_spec::{ pub use sc_consensus::ImportQueue; pub use sc_executor::NativeExecutionDispatch; -pub use sc_network_sync::warp::WarpSyncParams; +pub use sc_network_sync::WarpSyncParams; #[doc(hidden)] pub use sc_network_transactions::config::{TransactionImport, TransactionImportFuture}; pub use sc_rpc::{ diff --git a/substrate/zombienet/0001-basic-warp-sync/test-warp-sync.zndsl b/substrate/zombienet/0001-basic-warp-sync/test-warp-sync.zndsl index bafdb7d72bb..c5644797321 100644 --- a/substrate/zombienet/0001-basic-warp-sync/test-warp-sync.zndsl +++ b/substrate/zombienet/0001-basic-warp-sync/test-warp-sync.zndsl @@ -22,6 +22,8 @@ dave: reports block height is at least 1 within 60 seconds dave: reports block height is at least {{DB_BLOCK_HEIGHT}} within 60 seconds dave: log line matches "Warp sync is complete" within 60 seconds +# State sync is logically part of warp sync +dave: log line matches "State sync is complete" within 60 seconds dave: log line matches "Block history download is complete" within 10 seconds dave: count of log lines containing "error" is 0 within 10 seconds diff --git a/substrate/zombienet/0002-validators-warp-sync/test-validators-warp-sync.zndsl b/substrate/zombienet/0002-validators-warp-sync/test-validators-warp-sync.zndsl index 3977eb6788a..6e733580d6d 100644 --- a/substrate/zombienet/0002-validators-warp-sync/test-validators-warp-sync.zndsl +++ b/substrate/zombienet/0002-validators-warp-sync/test-validators-warp-sync.zndsl @@ -21,6 +21,9 @@ eve: reports block height is at least {{DB_BLOCK_HEIGHT}} within 60 seconds alice: log line matches "Warp sync is complete" within 60 seconds bob: log line matches "Warp sync is complete" within 60 seconds +# State sync is logically part of warp sync +alice: log line matches "State sync is complete" within 60 seconds +bob: log line matches "State sync is complete" within 60 seconds alice: log line matches "Block history download is complete" within 120 seconds bob: log line matches "Block history download is complete" within 120 seconds diff --git a/substrate/zombienet/0003-block-building-warp-sync/test-block-building-warp-sync.zndsl b/substrate/zombienet/0003-block-building-warp-sync/test-block-building-warp-sync.zndsl index 1d8650b5d69..a9a0ce442f1 100644 --- a/substrate/zombienet/0003-block-building-warp-sync/test-block-building-warp-sync.zndsl +++ b/substrate/zombienet/0003-block-building-warp-sync/test-block-building-warp-sync.zndsl @@ -27,6 +27,8 @@ dave: reports block height is at least {{DB_BLOCK_HEIGHT}} within 60 seconds dave: reports block height is greater than {{DB_BLOCK_HEIGHT}} within 60 seconds dave: log line matches "Warp sync is complete" within 60 seconds +# State sync is logically part of warp sync +dave: log line matches "State sync is complete" within 60 seconds dave: log line matches "Block history download is complete" within 10 seconds dave: reports substrate_beefy_best_block is at least {{DB_BLOCK_HEIGHT}} within 180 seconds -- GitLab From c421b87978404954dec4555895d50ef028b73cf0 Mon Sep 17 00:00:00 2001 From: Javier Viola Date: Fri, 12 Jan 2024 14:33:32 -0300 Subject: [PATCH 160/191] Bump zombienet version `v1.3.91` (#2912) This version includes - Performance improvements. - Minor fixes. --- .gitlab/pipeline/zombienet.yml | 2 +- .../zombienet_tests/functional/0002-parachains-disputes.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab/pipeline/zombienet.yml b/.gitlab/pipeline/zombienet.yml index 4b95c86c3c4..55120e66d0e 100644 --- a/.gitlab/pipeline/zombienet.yml +++ b/.gitlab/pipeline/zombienet.yml @@ -1,7 +1,7 @@ .zombienet-refs: extends: .build-refs variables: - ZOMBIENET_IMAGE: "docker.io/paritytech/zombienet:v1.3.86" + ZOMBIENET_IMAGE: "docker.io/paritytech/zombienet:v1.3.91" include: # substrate tests diff --git a/polkadot/zombienet_tests/functional/0002-parachains-disputes.toml b/polkadot/zombienet_tests/functional/0002-parachains-disputes.toml index 27cd81dface..f6bdfeb4877 100644 --- a/polkadot/zombienet_tests/functional/0002-parachains-disputes.toml +++ b/polkadot/zombienet_tests/functional/0002-parachains-disputes.toml @@ -5,7 +5,7 @@ timeout = 1000 max_validators_per_core = 5 needed_approvals = 8 -[relaychain.genesis.runtime.runtime_genesis_config.configuration.config.approval_voting_params] +[relaychain.genesis.runtimeGenesis.patch.configuration.config.approval_voting_params] max_approval_coalesce_count = 5 -- GitLab From bd80dcf6858a0ec9e61b5aceab933979f7258d2b Mon Sep 17 00:00:00 2001 From: PG Herveou Date: Fri, 12 Jan 2024 21:10:54 +0100 Subject: [PATCH 161/191] Contracts: Translate .wat fixtures to rust (#2654) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Translate all pallet-contracts fixtures from `wat` to Rust files. - Fix read_sandbox_memory_as to not use MaxEncodedLen as this could break if used with types with a non-fixed encoded len. --------- Co-authored-by: alvicsam Co-authored-by: Alexander Samusev <41779041+alvicsam@users.noreply.github.com> Co-authored-by: Alexander Theißen Co-authored-by: command-bot <> --- .../account_reentrance_count_call.rs | 39 +++ .../add_remove_delegate_dependency.rs | 70 +++++ .../contracts/fixtures/contracts/balance.rs | 36 +++ .../contracts/fixtures/contracts/call.rs | 25 +- .../fixtures/contracts/call_return_code.rs | 54 ++++ .../fixtures/contracts/call_runtime.rs | 42 +++ .../contracts/call_runtime_and_call.rs | 51 ++++ .../fixtures/contracts/call_with_limit.rs | 51 ++++ .../fixtures/contracts/caller_contract.rs | 153 ++++++++++ .../fixtures/contracts/chain_extension.rs | 42 +++ .../contracts/chain_extension_temp_storage.rs | 63 ++++ .../fixtures/contracts/common/Cargo.toml | 3 + .../fixtures/contracts/common/src/lib.rs | 122 +++++++- .../contracts/create_storage_and_call.rs | 59 ++++ .../create_storage_and_instantiate.rs | 59 ++++ .../fixtures/contracts/crypto_hashes.rs | 84 +++++ .../contracts/debug_message_invalid_utf8.rs | 33 ++ .../debug_message_logging_disabled.rs | 33 ++ .../fixtures/contracts/debug_message_works.rs | 33 ++ .../fixtures/contracts/delegate_call.rs | 49 +++ .../fixtures/contracts/delegate_call_lib.rs | 49 +++ .../contracts/delegate_call_simple.rs | 36 +++ .../contracts/destroy_and_transfer.rs | 89 ++++++ .../contracts/fixtures/contracts/drain.rs | 44 +++ .../fixtures/contracts/ecdsa_recover.rs | 44 +++ .../contracts/event_and_return_on_deploy.rs | 36 +++ .../fixtures/contracts/event_size.rs | 37 +++ .../fixtures/contracts/float_instruction.rs | 34 +++ .../contracts/instantiate_return_code.rs | 53 ++++ .../contracts/invalid_contract_no_call.rs | 25 ++ .../fixtures/contracts/multi_store.rs | 43 +++ .../contracts/new_set_code_hash_contract.rs | 32 ++ .../fixtures/contracts/ok_trap_revert.rs | 44 +++ .../contracts/reentrance_count_call.rs | 55 ++++ .../reentrance_count_delegated_call.rs | 53 ++++ .../fixtures/contracts/return_with_data.rs | 43 +++ .../fixtures/contracts/run_out_of_gas.rs | 32 ++ .../fixtures/contracts/self_destruct.rs | 53 ++++ .../contracts/self_destructing_constructor.rs | 32 ++ .../fixtures/contracts/set_code_hash.rs | 37 +++ .../fixtures/contracts/set_empty_storage.rs | 32 ++ .../fixtures/contracts/sr25519_verify.rs | 48 +++ .../fixtures/contracts/storage_size.rs | 45 +++ .../fixtures/contracts/store_call.rs | 41 +++ .../fixtures/contracts/store_deploy.rs | 41 +++ .../contracts/transfer_return_code.rs | 38 +++ .../fixtures/contracts/xcm_execute.rs | 39 +++ .../contracts/fixtures/contracts/xcm_send.rs | 42 +++ .../data/account_reentrance_count_call.wat | 37 --- .../data/add_remove_delegate_dependency.wat | 111 ------- .../frame/contracts/fixtures/data/balance.wat | 42 --- .../fixtures/data/call_return_code.wat | 42 --- .../contracts/fixtures/data/call_runtime.wat | 33 -- .../fixtures/data/call_runtime_and_call.wat | 56 ---- .../fixtures/data/call_with_limit.wat | 38 --- .../fixtures/data/caller_contract.wat | 286 ------------------ .../fixtures/data/chain_extension.wat | 46 --- .../data/chain_extension_temp_storage.wat | 85 ------ .../fixtures/data/create_storage_and_call.wat | 60 ---- .../data/create_storage_and_instantiate.wat | 66 ---- .../contracts/fixtures/data/crypto_hashes.wat | 83 ----- .../data/debug_message_invalid_utf8.wat | 28 -- .../data/debug_message_logging_disabled.wat | 28 -- .../fixtures/data/debug_message_works.wat | 28 -- .../contracts/fixtures/data/delegate_call.wat | 111 ------- .../fixtures/data/delegate_call_lib.wat | 79 ----- .../fixtures/data/delegate_call_simple.wat | 50 --- .../fixtures/data/destroy_and_transfer.wat | 161 ---------- .../frame/contracts/fixtures/data/drain.wat | 75 ----- .../contracts/fixtures/data/ecdsa_recover.wat | 55 ---- .../data/event_and_return_on_deploy.wat | 26 -- .../contracts/fixtures/data/event_size.wat | 39 --- .../fixtures/data/float_instruction.wat | 12 - .../fixtures/data/instantiate_return_code.wat | 47 --- .../data/invalid_contract_no_call.wat | 5 - .../contracts/fixtures/data/multi_store.wat | 54 ---- .../data/new_set_code_hash_contract.wat | 13 - .../fixtures/data/ok_trap_revert.wat | 35 --- .../fixtures/data/reentrance_count_call.wat | 76 ----- .../data/reentrance_count_delegated_call.wat | 71 ----- .../fixtures/data/return_with_data.wat | 33 -- .../fixtures/data/run_out_of_gas.wat | 8 - .../contracts/fixtures/data/self_destruct.wat | 83 ----- .../data/self_destructing_constructor.wat | 23 -- .../contracts/fixtures/data/set_code_hash.wat | 43 --- .../fixtures/data/set_empty_storage.wat | 15 - .../fixtures/data/sr25519_verify.wat | 55 ---- .../contracts/fixtures/data/storage_size.wat | 68 ----- .../contracts/fixtures/data/store_call.wat | 45 --- .../contracts/fixtures/data/store_deploy.wat | 45 --- .../fixtures/data/transfer_return_code.wat | 34 --- .../contracts/fixtures/data/xcm_execute.wat | 52 ---- .../contracts/fixtures/data/xcm_send.wat | 59 ---- substrate/frame/contracts/fixtures/src/lib.rs | 5 +- substrate/frame/contracts/src/tests.rs | 17 +- substrate/frame/contracts/src/wasm/mod.rs | 18 +- substrate/frame/contracts/src/wasm/runtime.rs | 5 +- substrate/frame/contracts/uapi/src/host.rs | 23 +- .../frame/contracts/uapi/src/host/riscv32.rs | 18 +- .../frame/contracts/uapi/src/host/wasm32.rs | 27 +- substrate/frame/contracts/uapi/src/lib.rs | 2 +- 101 files changed, 2352 insertions(+), 2602 deletions(-) create mode 100644 substrate/frame/contracts/fixtures/contracts/account_reentrance_count_call.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/add_remove_delegate_dependency.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/balance.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/call_return_code.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/call_runtime.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/call_runtime_and_call.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/call_with_limit.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/caller_contract.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/chain_extension.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/chain_extension_temp_storage.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/create_storage_and_call.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/create_storage_and_instantiate.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/crypto_hashes.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/debug_message_invalid_utf8.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/debug_message_logging_disabled.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/debug_message_works.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/delegate_call.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/delegate_call_lib.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/delegate_call_simple.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/destroy_and_transfer.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/drain.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/ecdsa_recover.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/event_and_return_on_deploy.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/event_size.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/float_instruction.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/instantiate_return_code.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/invalid_contract_no_call.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/multi_store.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/new_set_code_hash_contract.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/ok_trap_revert.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/reentrance_count_call.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/reentrance_count_delegated_call.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/return_with_data.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/run_out_of_gas.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/self_destruct.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/self_destructing_constructor.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/set_code_hash.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/set_empty_storage.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/sr25519_verify.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/storage_size.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/store_call.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/store_deploy.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/transfer_return_code.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/xcm_execute.rs create mode 100644 substrate/frame/contracts/fixtures/contracts/xcm_send.rs delete mode 100644 substrate/frame/contracts/fixtures/data/account_reentrance_count_call.wat delete mode 100644 substrate/frame/contracts/fixtures/data/add_remove_delegate_dependency.wat delete mode 100644 substrate/frame/contracts/fixtures/data/balance.wat delete mode 100644 substrate/frame/contracts/fixtures/data/call_return_code.wat delete mode 100644 substrate/frame/contracts/fixtures/data/call_runtime.wat delete mode 100644 substrate/frame/contracts/fixtures/data/call_runtime_and_call.wat delete mode 100644 substrate/frame/contracts/fixtures/data/call_with_limit.wat delete mode 100644 substrate/frame/contracts/fixtures/data/caller_contract.wat delete mode 100644 substrate/frame/contracts/fixtures/data/chain_extension.wat delete mode 100644 substrate/frame/contracts/fixtures/data/chain_extension_temp_storage.wat delete mode 100644 substrate/frame/contracts/fixtures/data/create_storage_and_call.wat delete mode 100644 substrate/frame/contracts/fixtures/data/create_storage_and_instantiate.wat delete mode 100644 substrate/frame/contracts/fixtures/data/crypto_hashes.wat delete mode 100644 substrate/frame/contracts/fixtures/data/debug_message_invalid_utf8.wat delete mode 100644 substrate/frame/contracts/fixtures/data/debug_message_logging_disabled.wat delete mode 100644 substrate/frame/contracts/fixtures/data/debug_message_works.wat delete mode 100644 substrate/frame/contracts/fixtures/data/delegate_call.wat delete mode 100644 substrate/frame/contracts/fixtures/data/delegate_call_lib.wat delete mode 100644 substrate/frame/contracts/fixtures/data/delegate_call_simple.wat delete mode 100644 substrate/frame/contracts/fixtures/data/destroy_and_transfer.wat delete mode 100644 substrate/frame/contracts/fixtures/data/drain.wat delete mode 100644 substrate/frame/contracts/fixtures/data/ecdsa_recover.wat delete mode 100644 substrate/frame/contracts/fixtures/data/event_and_return_on_deploy.wat delete mode 100644 substrate/frame/contracts/fixtures/data/event_size.wat delete mode 100644 substrate/frame/contracts/fixtures/data/float_instruction.wat delete mode 100644 substrate/frame/contracts/fixtures/data/instantiate_return_code.wat delete mode 100644 substrate/frame/contracts/fixtures/data/invalid_contract_no_call.wat delete mode 100644 substrate/frame/contracts/fixtures/data/multi_store.wat delete mode 100644 substrate/frame/contracts/fixtures/data/new_set_code_hash_contract.wat delete mode 100644 substrate/frame/contracts/fixtures/data/ok_trap_revert.wat delete mode 100644 substrate/frame/contracts/fixtures/data/reentrance_count_call.wat delete mode 100644 substrate/frame/contracts/fixtures/data/reentrance_count_delegated_call.wat delete mode 100644 substrate/frame/contracts/fixtures/data/return_with_data.wat delete mode 100644 substrate/frame/contracts/fixtures/data/run_out_of_gas.wat delete mode 100644 substrate/frame/contracts/fixtures/data/self_destruct.wat delete mode 100644 substrate/frame/contracts/fixtures/data/self_destructing_constructor.wat delete mode 100644 substrate/frame/contracts/fixtures/data/set_code_hash.wat delete mode 100644 substrate/frame/contracts/fixtures/data/set_empty_storage.wat delete mode 100644 substrate/frame/contracts/fixtures/data/sr25519_verify.wat delete mode 100644 substrate/frame/contracts/fixtures/data/storage_size.wat delete mode 100644 substrate/frame/contracts/fixtures/data/store_call.wat delete mode 100644 substrate/frame/contracts/fixtures/data/store_deploy.wat delete mode 100644 substrate/frame/contracts/fixtures/data/transfer_return_code.wat delete mode 100644 substrate/frame/contracts/fixtures/data/xcm_execute.wat delete mode 100644 substrate/frame/contracts/fixtures/data/xcm_send.wat diff --git a/substrate/frame/contracts/fixtures/contracts/account_reentrance_count_call.rs b/substrate/frame/contracts/fixtures/contracts/account_reentrance_count_call.rs new file mode 100644 index 00000000000..9da4eb6d538 --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/account_reentrance_count_call.rs @@ -0,0 +1,39 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! This fixture tests if account_reentrance_count works as expected. +#![no_std] +#![no_main] + +use common::input; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + input!(callee: [u8; 32],); + + #[allow(deprecated)] + let reentrance_count = api::account_reentrance_count(callee); + + // Return the reentrance count. + api::return_value(uapi::ReturnFlags::empty(), &reentrance_count.to_le_bytes()); +} diff --git a/substrate/frame/contracts/fixtures/contracts/add_remove_delegate_dependency.rs b/substrate/frame/contracts/fixtures/contracts/add_remove_delegate_dependency.rs new file mode 100644 index 00000000000..759ff799374 --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/add_remove_delegate_dependency.rs @@ -0,0 +1,70 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! This contract tests the behavior of adding / removing delegate_dependencies when delegate +//! calling into a contract. +#![no_std] +#![no_main] + +use common::input; +use uapi::{HostFn, HostFnImpl as api}; + +const ALICE: [u8; 32] = [1u8; 32]; + +/// Load input data and perform the action specified by the input. +/// If `delegate_call` is true, then delegate call into the contract. +fn load_input(delegate_call: bool) { + input!( + action: u32, + code_hash: [u8; 32], + ); + + match action { + // 1 = Add delegate dependency + 1 => { + #[allow(deprecated)] + api::add_delegate_dependency(code_hash); + }, + // 2 = Remove delegate dependency + 2 => { + #[allow(deprecated)] + api::remove_delegate_dependency(code_hash); + }, + // 3 = Terminate + 3 => { + api::terminate_v1(&ALICE); + }, + // Everything else is a noop + _ => {}, + } + + if delegate_call { + api::delegate_call(uapi::CallFlags::empty(), code_hash, &[], None).unwrap(); + } +} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() { + load_input(false); +} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + load_input(true); +} diff --git a/substrate/frame/contracts/fixtures/contracts/balance.rs b/substrate/frame/contracts/fixtures/contracts/balance.rs new file mode 100644 index 00000000000..4011b8379cb --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/balance.rs @@ -0,0 +1,36 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![no_std] +#![no_main] + +use common::output; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + // Initialize buffer with 1s so that we can check that it is overwritten. + output!(balance, [1u8; 8], api::balance,); + + // Assert that the balance is 0. + assert_eq!(&[0u8; 8], balance); +} diff --git a/substrate/frame/contracts/fixtures/contracts/call.rs b/substrate/frame/contracts/fixtures/contracts/call.rs index 0e5f4fbd2dd..f7d9d862d74 100644 --- a/substrate/frame/contracts/fixtures/contracts/call.rs +++ b/substrate/frame/contracts/fixtures/contracts/call.rs @@ -19,8 +19,8 @@ #![no_std] #![no_main] -extern crate common; -use uapi::{CallFlags, HostFn, HostFnImpl as api}; +use common::input; +use uapi::{HostFn, HostFnImpl as api}; #[no_mangle] #[polkavm_derive::polkavm_export] @@ -29,21 +29,18 @@ pub extern "C" fn deploy() {} #[no_mangle] #[polkavm_derive::polkavm_export] pub extern "C" fn call() { - let mut buffer = [0u8; 40]; - let callee_input = 0..4; - let callee_addr = 4..36; - let value = 36..40; - - // Read the input data. - api::input(&mut &mut buffer[..]); + input!( + callee_input: [u8; 4], + callee_addr: [u8; 32], + ); // Call the callee api::call_v1( - CallFlags::empty(), - &buffer[callee_addr], - 0u64, // How much gas to devote for the execution. 0 = all. - &buffer[value], - &buffer[callee_input], + uapi::CallFlags::empty(), + callee_addr, + 0u64, // How much gas to devote for the execution. 0 = all. + &0u64.to_le_bytes(), // value transferred to the contract. + callee_input, None, ) .unwrap(); diff --git a/substrate/frame/contracts/fixtures/contracts/call_return_code.rs b/substrate/frame/contracts/fixtures/contracts/call_return_code.rs new file mode 100644 index 00000000000..1256588d3b5 --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/call_return_code.rs @@ -0,0 +1,54 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! This calls the supplied dest and transfers 100 balance during this call and copies +//! the return code of this call to the output buffer. +//! It also forwards its input to the callee. +#![no_std] +#![no_main] + +use common::input; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + input!( + 100, + callee_addr: [u8; 32], + input: [u8], + ); + + // Call the callee + let err_code = match api::call_v1( + uapi::CallFlags::empty(), + callee_addr, + 0u64, // How much gas to devote for the execution. 0 = all. + &100u64.to_le_bytes(), // value transferred to the contract. + input, + None, + ) { + Ok(_) => 0u32, + Err(code) => code as u32, + }; + + api::return_value(uapi::ReturnFlags::empty(), &err_code.to_le_bytes()); +} diff --git a/substrate/frame/contracts/fixtures/contracts/call_runtime.rs b/substrate/frame/contracts/fixtures/contracts/call_runtime.rs new file mode 100644 index 00000000000..2b132398fb6 --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/call_runtime.rs @@ -0,0 +1,42 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! This passes its input to `call_runtime` and returns the return value to its caller. +#![no_std] +#![no_main] + +use common::input; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + // Fixture calls should fit into 100 bytes. + input!(100, call: [u8], ); + + // Use the call passed as input to call the runtime. + let err_code = match api::call_runtime(call) { + Ok(_) => 0u32, + Err(code) => code as u32, + }; + + api::return_value(uapi::ReturnFlags::empty(), &err_code.to_le_bytes()); +} diff --git a/substrate/frame/contracts/fixtures/contracts/call_runtime_and_call.rs b/substrate/frame/contracts/fixtures/contracts/call_runtime_and_call.rs new file mode 100644 index 00000000000..fdeb6097e73 --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/call_runtime_and_call.rs @@ -0,0 +1,51 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![no_std] +#![no_main] + +use common::input; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + input!( + 512, + callee_input: [u8; 4], + callee_addr: [u8; 32], + call: [u8], + ); + + // Use the call passed as input to call the runtime. + api::call_runtime(call).unwrap(); + + // Call the callee + api::call_v1( + uapi::CallFlags::empty(), + callee_addr, + 0u64, // How much gas to devote for the execution. 0 = all. + &0u64.to_le_bytes(), // value transferred to the contract. + callee_input, + None, + ) + .unwrap(); +} diff --git a/substrate/frame/contracts/fixtures/contracts/call_with_limit.rs b/substrate/frame/contracts/fixtures/contracts/call_with_limit.rs new file mode 100644 index 00000000000..5e98aa614e9 --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/call_with_limit.rs @@ -0,0 +1,51 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! This fixture calls the account_id with the 2D Weight limit. +//! It returns the result of the call as output data. +#![no_std] +#![no_main] + +use common::input; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + input!( + callee_addr: [u8; 32], + ref_time: u64, + proof_size: u64, + ); + + #[allow(deprecated)] + api::call_v2( + uapi::CallFlags::empty(), + callee_addr, + ref_time, + proof_size, + None, // No deposit limit. + &0u64.to_le_bytes(), // value transferred to the contract. + &[0u8; 0], // input data. + None, + ) + .unwrap(); +} diff --git a/substrate/frame/contracts/fixtures/contracts/caller_contract.rs b/substrate/frame/contracts/fixtures/contracts/caller_contract.rs new file mode 100644 index 00000000000..c2629e9fa19 --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/caller_contract.rs @@ -0,0 +1,153 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![no_std] +#![no_main] + +use common::input; +use uapi::{HostFn, HostFnImpl as api, ReturnErrorCode}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + input!(code_hash: [u8; 32],); + + // The value to transfer on instantiation and calls. Chosen to be greater than existential + // deposit. + let value = 32768u64.to_le_bytes(); + let salt = [0u8; 0]; + + // Callee will use the first 4 bytes of the input to return an exit status. + let input = [0u8, 1, 34, 51, 68, 85, 102, 119]; + let reverted_input = [1u8, 34, 51, 68, 85, 102, 119]; + + // Fail to deploy the contract since it returns a non-zero exit status. + #[allow(deprecated)] + let res = api::instantiate_v2( + code_hash, + 0u64, // How much ref_time weight to devote for the execution. 0 = all. + 0u64, // How much proof_size weight to devote for the execution. 0 = all. + None, // No deposit limit. + &value, + &reverted_input, + None, + None, + &salt, + ); + assert!(matches!(res, Err(ReturnErrorCode::CalleeReverted))); + + // Fail to deploy the contract due to insufficient ref_time weight. + #[allow(deprecated)] + let res = api::instantiate_v2( + code_hash, 1u64, // too little ref_time weight + 0u64, // How much proof_size weight to devote for the execution. 0 = all. + None, // No deposit limit. + &value, &input, None, None, &salt, + ); + assert!(matches!(res, Err(ReturnErrorCode::CalleeTrapped))); + + // Fail to deploy the contract due to insufficient proof_size weight. + #[allow(deprecated)] + let res = api::instantiate_v2( + code_hash, 0u64, // How much ref_time weight to devote for the execution. 0 = all. + 1u64, // Too little proof_size weight + None, // No deposit limit. + &value, &input, None, None, &salt, + ); + assert!(matches!(res, Err(ReturnErrorCode::CalleeTrapped))); + + // Deploy the contract successfully. + let mut callee = [0u8; 32]; + let callee = &mut &mut callee[..]; + + #[allow(deprecated)] + api::instantiate_v2( + code_hash, + 0u64, // How much ref_time weight to devote for the execution. 0 = all. + 0u64, // How much proof_size weight to devote for the execution. 0 = all. + None, // No deposit limit. + &value, + &input, + Some(callee), + None, + &salt, + ) + .unwrap(); + assert_eq!(callee.len(), 32); + + // Call the new contract and expect it to return failing exit code. + #[allow(deprecated)] + let res = api::call_v2( + uapi::CallFlags::empty(), + callee, + 0u64, // How much ref_time weight to devote for the execution. 0 = all. + 0u64, // How much proof_size weight to devote for the execution. 0 = all. + None, // No deposit limit. + &value, + &reverted_input, + None, + ); + assert!(matches!(res, Err(ReturnErrorCode::CalleeReverted))); + + // Fail to call the contract due to insufficient ref_time weight. + #[allow(deprecated)] + let res = api::call_v2( + uapi::CallFlags::empty(), + callee, + 1u64, // too little ref_time weight + 0u64, // How much proof_size weight to devote for the execution. 0 = all. + None, // No deposit limit. + &value, + &input, + None, + ); + assert!(matches!(res, Err(ReturnErrorCode::CalleeTrapped))); + + // Fail to call the contract due to insufficient proof_size weight. + #[allow(deprecated)] + let res = api::call_v2( + uapi::CallFlags::empty(), + callee, + 0u64, // How much ref_time weight to devote for the execution. 0 = all. + 1u64, // too little proof_size weight + None, // No deposit limit. + &value, + &input, + None, + ); + assert!(matches!(res, Err(ReturnErrorCode::CalleeTrapped))); + + // Call the contract successfully. + let mut output = [0u8; 4]; + #[allow(deprecated)] + api::call_v2( + uapi::CallFlags::empty(), + callee, + 0u64, // How much ref_time weight to devote for the execution. 0 = all. + 0u64, // How much proof_size weight to devote for the execution. 0 = all. + None, // No deposit limit. + &value, + &input, + Some(&mut &mut output[..]), + ) + .unwrap(); + assert_eq!(&output, &input[4..]) +} diff --git a/substrate/frame/contracts/fixtures/contracts/chain_extension.rs b/substrate/frame/contracts/fixtures/contracts/chain_extension.rs new file mode 100644 index 00000000000..474df00d691 --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/chain_extension.rs @@ -0,0 +1,42 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Call chain extension by passing through input and output of this contract. +#![no_std] +#![no_main] + +use common::input; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + input!(input, 8, func_id: u32,); + + // the chain extension passes through the input and returns it as output + let mut output_buffer = [0u8; 32]; + let output = &mut &mut output_buffer[0..input.len()]; + + let ret_id = api::call_chain_extension(func_id, input, Some(output)); + assert_eq!(ret_id, func_id); + + api::return_value(uapi::ReturnFlags::empty(), output); +} diff --git a/substrate/frame/contracts/fixtures/contracts/chain_extension_temp_storage.rs b/substrate/frame/contracts/fixtures/contracts/chain_extension_temp_storage.rs new file mode 100644 index 00000000000..1ab08efb3c7 --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/chain_extension_temp_storage.rs @@ -0,0 +1,63 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Call chain extension two times with the specified func_ids +//! It then calls itself once +#![no_std] +#![no_main] + +use common::{input, output}; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + input!( + input, + func_id1: u32, + func_id2: u32, + stop_recurse: u8, + ); + + api::call_chain_extension(func_id1, input, None); + api::call_chain_extension(func_id2, input, None); + + if stop_recurse == 0 { + // Setup next call + input[0..4].copy_from_slice(&((3 << 16) | 2u32).to_le_bytes()); + input[4..8].copy_from_slice(&((3 << 16) | 3u32).to_le_bytes()); + input[8] = 1u8; + + // Read the contract address. + output!(addr, [0u8; 32], api::address,); + + // call self + api::call_v1( + uapi::CallFlags::ALLOW_REENTRY, + addr, + 0u64, // How much gas to devote for the execution. 0 = all. + &0u64.to_le_bytes(), // value transferred to the contract. + input, + None, + ) + .unwrap(); + } +} diff --git a/substrate/frame/contracts/fixtures/contracts/common/Cargo.toml b/substrate/frame/contracts/fixtures/contracts/common/Cargo.toml index 127bb575088..296f408d011 100644 --- a/substrate/frame/contracts/fixtures/contracts/common/Cargo.toml +++ b/substrate/frame/contracts/fixtures/contracts/common/Cargo.toml @@ -6,3 +6,6 @@ authors.workspace = true edition.workspace = true license.workspace = true description = "Common utilities for pallet-contracts-fixtures." + +[dependencies] +uapi = { package = 'pallet-contracts-uapi', path = "../../../uapi", default-features = false } diff --git a/substrate/frame/contracts/fixtures/contracts/common/src/lib.rs b/substrate/frame/contracts/fixtures/contracts/common/src/lib.rs index 29bdbfbb042..6904ab2f504 100644 --- a/substrate/frame/contracts/fixtures/contracts/common/src/lib.rs +++ b/substrate/frame/contracts/fixtures/contracts/common/src/lib.rs @@ -15,7 +15,8 @@ // See the License for the specific language governing permissions and // limitations under the License. #![no_std] -#![cfg(any(target_arch = "wasm32", target_arch = "riscv32"))] + +pub use uapi::{HostFn, HostFnImpl as api}; #[panic_handler] fn panic(_info: &core::panic::PanicInfo) -> ! { @@ -29,3 +30,122 @@ fn panic(_info: &core::panic::PanicInfo) -> ! { core::hint::unreachable_unchecked(); } } + +/// Utility macro to read input passed to a contract. +/// +/// Example: +/// +/// ``` +/// input$!( +/// var1: u32, // [0, 4) var1 decoded as u32 +/// var2: [u8; 32], // [4, 36) var2 decoded as a [u8] slice +/// var3: u8, // [36, 37) var3 decoded as a u8 +/// ); +/// +/// // Input and size can be specified as well: +/// input$!( +/// input, // input buffer (optional) +/// 512, // input size (optional) +/// var4: u32, // [0, 4) var4 decoded as u32 +/// var5: [u8], // [4, ..) var5 decoded as a [u8] slice +/// ); +/// ``` +#[macro_export] +macro_rules! input { + (@inner $input:expr, $cursor:expr,) => {}; + (@size $size:expr, ) => { $size }; + + // Match a u8 variable. + // e.g input!(var1: u8, ); + (@inner $input:expr, $cursor:expr, $var:ident: u8, $($rest:tt)*) => { + let $var = $input[$cursor]; + input!(@inner $input, $cursor + 1, $($rest)*); + }; + + // Size of u8 variable. + (@size $size:expr, $var:ident: u8, $($rest:tt)*) => { + input!(@size $size + 1, $($rest)*) + }; + + // Match a u64 variable. + // e.g input!(var1: u64, ); + (@inner $input:expr, $cursor:expr, $var:ident: u64, $($rest:tt)*) => { + let $var = u64::from_le_bytes($input[$cursor..$cursor + 8].try_into().unwrap()); + input!(@inner $input, $cursor + 8, $($rest)*); + }; + + // Size of u64 variable. + (@size $size:expr, $var:ident: u64, $($rest:tt)*) => { + input!(@size $size + 8, $($rest)*) + }; + + // Match a u32 variable. + // e.g input!(var1: u32, ); + (@inner $input:expr, $cursor:expr, $var:ident: u32, $($rest:tt)*) => { + let $var = u32::from_le_bytes($input[$cursor..$cursor + 4].try_into().unwrap()); + input!(@inner $input, $cursor + 4, $($rest)*); + }; + + // Size of u32 variable. + (@size $size:expr, $var:ident: u32, $($rest:tt)*) => { + input!(@size $size + 4, $($rest)*) + }; + + // Match a u8 slice with the remaining bytes. + // e.g input!(512, var1: [u8; 32], var2: [u8], ); + (@inner $input:expr, $cursor:expr, $var:ident: [u8],) => { + let $var = &$input[$cursor..]; + }; + + // Match a u8 slice of the given size. + // e.g input!(var1: [u8; 32], ); + (@inner $input:expr, $cursor:expr, $var:ident: [u8; $n:expr], $($rest:tt)*) => { + let $var = &$input[$cursor..$cursor+$n]; + input!(@inner $input, $cursor + $n, $($rest)*); + }; + + // Size of a u8 slice. + (@size $size:expr, $var:ident: [u8; $n:expr], $($rest:tt)*) => { + input!(@size $size + $n, $($rest)*) + }; + + // Entry point, with the buffer and it's size specified first. + // e.g input!(buffer, 512, var1: u32, var2: [u8], ); + ($buffer:ident, $size:expr, $($rest:tt)*) => { + let mut $buffer = [0u8; $size]; + let $buffer = &mut &mut $buffer[..]; + $crate::api::input($buffer); + input!(@inner $buffer, 0, $($rest)*); + }; + + // Entry point, with the name of the buffer specified and size of the input buffer computed. + // e.g input!(buffer, var1: u32, var2: u64, ); + ($buffer: ident, $($rest:tt)*) => { + input!($buffer, input!(@size 0, $($rest)*), $($rest)*); + }; + + // Entry point, with the size of the input buffer computed. + // e.g input!(var1: u32, var2: u64, ); + ($($rest:tt)*) => { + input!(buffer, $($rest)*); + }; +} + +/// Utility macro to invoke a host function that expect a `output: &mut &mut [u8]` as last argument. +/// +/// Example: +/// ``` +/// // call `api::caller` and store the output in `caller` +/// output!(caller, [0u8; 32], api::caller,); +/// +/// // call `api::get_storage` and store the output in `address` +/// output!(address, [0u8; 32], api::get_storage, &[1u8; 32]); +/// ``` +#[macro_export] +macro_rules! output { + ($output: ident, $buffer: expr, $host_fn:path, $($arg:expr),*) => { + let mut $output = $buffer; + let $output = &mut &mut $output[..]; + $host_fn($($arg,)* $output); + }; +} diff --git a/substrate/frame/contracts/fixtures/contracts/create_storage_and_call.rs b/substrate/frame/contracts/fixtures/contracts/create_storage_and_call.rs new file mode 100644 index 00000000000..8b79dd87dff --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/create_storage_and_call.rs @@ -0,0 +1,59 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! This calls another contract as passed as its account id. It also creates some storage. +#![no_std] +#![no_main] + +use common::input; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + input!( + buffer, + input: [u8; 4], + callee: [u8; 32], + deposit_limit: [u8; 8], + ); + + // create 4 byte of storage before calling + api::set_storage(buffer, &[1u8; 4]); + + // Call the callee + #[allow(deprecated)] + api::call_v2( + uapi::CallFlags::empty(), + callee, + 0u64, // How much ref_time weight to devote for the execution. 0 = all. + 0u64, // How much proof_size weight to devote for the execution. 0 = all. + Some(deposit_limit), + &0u64.to_le_bytes(), // value transferred to the contract. + input, + None, + ) + .unwrap(); + + // create 8 byte of storage after calling + // item of 12 bytes because we override 4 bytes + api::set_storage(buffer, &[1u8; 12]); +} diff --git a/substrate/frame/contracts/fixtures/contracts/create_storage_and_instantiate.rs b/substrate/frame/contracts/fixtures/contracts/create_storage_and_instantiate.rs new file mode 100644 index 00000000000..c68d99eff82 --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/create_storage_and_instantiate.rs @@ -0,0 +1,59 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! This instantiates another contract and passes some input to its constructor. +#![no_std] +#![no_main] + +use common::input; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + input!( + input: [u8; 4], + code_hash: [u8; 32], + deposit_limit: [u8; 8], + ); + + let value = 10_000u64.to_le_bytes(); + let salt = [0u8; 0]; + let mut address = [0u8; 32]; + let address = &mut &mut address[..]; + + #[allow(deprecated)] + api::instantiate_v2( + code_hash, + 0u64, // How much ref_time weight to devote for the execution. 0 = all. + 0u64, // How much proof_size weight to devote for the execution. 0 = all. + Some(deposit_limit), + &value, + input, + Some(address), + None, + &salt, + ) + .unwrap(); + + // Return the deployed contract address. + api::return_value(uapi::ReturnFlags::empty(), address); +} diff --git a/substrate/frame/contracts/fixtures/contracts/crypto_hashes.rs b/substrate/frame/contracts/fixtures/contracts/crypto_hashes.rs new file mode 100644 index 00000000000..35cc03f1e72 --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/crypto_hashes.rs @@ -0,0 +1,84 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![no_std] +#![no_main] + +use common::input; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +/// Called by the tests. +/// +/// The `call` function expects data in a certain format in the input buffer. +/// +/// 1. The first byte encodes an identifier for the crypto hash function under test. (*) +/// 2. The rest encodes the input data that is directly fed into the crypto hash function chosen in +/// 1. +/// +/// The `deploy` function then computes the chosen crypto hash function +/// given the input and puts the result into the output buffer. +/// After contract execution the test driver then asserts that the returned +/// values are equal to the expected bytes for the input and chosen hash +/// function. +/// +/// (*) The possible value for the crypto hash identifiers can be found below: +/// +/// | value | Algorithm | Bit Width | +/// |-------|-----------|-----------| +/// | 0 | SHA2 | 256 | +/// | 1 | KECCAK | 256 | +/// | 2 | BLAKE2 | 256 | +/// | 3 | BLAKE2 | 128 | +/// --------------------------------- + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + input!( + 256, + chosen_hash_fn: u8, + input: [u8], + ); + + match chosen_hash_fn { + 1 => { + let mut output = [0u8; 32]; + api::hash_sha2_256(input, &mut output); + api::return_value(uapi::ReturnFlags::empty(), &output); + }, + 2 => { + let mut output = [0u8; 32]; + api::hash_keccak_256(input, &mut output); + api::return_value(uapi::ReturnFlags::empty(), &output); + }, + 3 => { + let mut output = [0u8; 32]; + api::hash_blake2_256(input, &mut output); + api::return_value(uapi::ReturnFlags::empty(), &output); + }, + 4 => { + let mut output = [0u8; 16]; + api::hash_blake2_128(input, &mut output); + api::return_value(uapi::ReturnFlags::empty(), &output); + }, + _ => panic!("unknown crypto hash function identifier"), + } +} diff --git a/substrate/frame/contracts/fixtures/contracts/debug_message_invalid_utf8.rs b/substrate/frame/contracts/fixtures/contracts/debug_message_invalid_utf8.rs new file mode 100644 index 00000000000..6c850a9ec66 --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/debug_message_invalid_utf8.rs @@ -0,0 +1,33 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Emit a debug message with an invalid utf-8 code. +#![no_std] +#![no_main] + +extern crate common; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + api::debug_message(b"\xFC").unwrap(); +} diff --git a/substrate/frame/contracts/fixtures/contracts/debug_message_logging_disabled.rs b/substrate/frame/contracts/fixtures/contracts/debug_message_logging_disabled.rs new file mode 100644 index 00000000000..b9f62adbfff --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/debug_message_logging_disabled.rs @@ -0,0 +1,33 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Emit a "Hello World!" debug message but assume that logging is disabled. +#![no_std] +#![no_main] + +extern crate common; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + api::debug_message(b"Hello World!").unwrap(); +} diff --git a/substrate/frame/contracts/fixtures/contracts/debug_message_works.rs b/substrate/frame/contracts/fixtures/contracts/debug_message_works.rs new file mode 100644 index 00000000000..3a2509509d8 --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/debug_message_works.rs @@ -0,0 +1,33 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Emit a "Hello World!" debug message. +#![no_std] +#![no_main] + +extern crate common; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + api::debug_message(b"Hello World!").unwrap(); +} diff --git a/substrate/frame/contracts/fixtures/contracts/delegate_call.rs b/substrate/frame/contracts/fixtures/contracts/delegate_call.rs new file mode 100644 index 00000000000..f109e8a63a3 --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/delegate_call.rs @@ -0,0 +1,49 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![no_std] +#![no_main] + +use common::input; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + input!(code_hash: [u8; 32],); + + let mut key = [0u8; 32]; + key[0] = 1u8; + + let mut value = [0u8; 32]; + let value = &mut &mut value[..]; + value[0] = 2u8; + + api::set_storage(&key, value); + api::get_storage(&key, value).unwrap(); + assert!(value[0] == 2u8); + + let input = [0u8; 0]; + api::delegate_call(uapi::CallFlags::empty(), code_hash, &input, None).unwrap(); + + api::get_storage(&[1u8], value).unwrap(); + assert!(value[0] == 1u8); +} diff --git a/substrate/frame/contracts/fixtures/contracts/delegate_call_lib.rs b/substrate/frame/contracts/fixtures/contracts/delegate_call_lib.rs new file mode 100644 index 00000000000..197b396ce4f --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/delegate_call_lib.rs @@ -0,0 +1,49 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![no_std] +#![no_main] + +use common::output; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + let mut key = [0u8; 32]; + key[0] = 1u8; + + // Place a value in storage. + let mut value = [0u8; 32]; + let value = &mut &mut value[..]; + value[0] = 1u8; + api::set_storage(&key, value); + + // Assert that `value_transferred` is equal to the value + // passed to the `caller` contract: 1337. + output!(value_transferred, [0u8; 8], api::value_transferred,); + let value_transferred = u64::from_le_bytes(value_transferred[..].try_into().unwrap()); + assert_eq!(value_transferred, 1337); + + // Assert that ALICE is the caller of the contract. + output!(caller, [0u8; 32], api::caller,); + assert_eq!(&caller[..], &[1u8; 32]); +} diff --git a/substrate/frame/contracts/fixtures/contracts/delegate_call_simple.rs b/substrate/frame/contracts/fixtures/contracts/delegate_call_simple.rs new file mode 100644 index 00000000000..cf3351c52fd --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/delegate_call_simple.rs @@ -0,0 +1,36 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![no_std] +#![no_main] + +use common::input; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + input!(code_hash: [u8; 32],); + + // Delegate call into passed code hash. + let input = [0u8; 0]; + api::delegate_call(uapi::CallFlags::empty(), code_hash, &input, None).unwrap(); +} diff --git a/substrate/frame/contracts/fixtures/contracts/destroy_and_transfer.rs b/substrate/frame/contracts/fixtures/contracts/destroy_and_transfer.rs new file mode 100644 index 00000000000..cfcfd60f21e --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/destroy_and_transfer.rs @@ -0,0 +1,89 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![no_std] +#![no_main] + +use common::input; +use uapi::{HostFn, HostFnImpl as api}; + +const ADDRESS_KEY: [u8; 32] = [0u8; 32]; +const VALUE: [u8; 8] = [0, 0, 1u8, 0, 0, 0, 0, 0]; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() { + input!(code_hash: [u8; 32],); + + let input = [0u8; 0]; + let mut address = [0u8; 32]; + let address = &mut &mut address[..]; + let salt = [71u8, 17u8]; + + #[allow(deprecated)] + api::instantiate_v2( + code_hash, + 0u64, // How much ref_time weight to devote for the execution. 0 = all. + 0u64, // How much proof_size weight to devote for the execution. 0 = all. + None, // No deposit limit. + &VALUE, + &input, + Some(address), + None, + &salt, + ) + .unwrap(); + + // Return the deployed contract address. + api::set_storage(&ADDRESS_KEY, address); +} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + let mut callee_addr = [0u8; 32]; + let callee_addr = &mut &mut callee_addr[..]; + api::get_storage(&ADDRESS_KEY, callee_addr).unwrap(); + + // Calling the destination contract with non-empty input data should fail. + #[allow(deprecated)] + let res = api::call_v2( + uapi::CallFlags::empty(), + callee_addr, + 0u64, // How much ref_time weight to devote for the execution. 0 = all. + 0u64, // How much proof_size weight to devote for the execution. 0 = all. + None, // No deposit limit. + &VALUE, + &[0u8; 1], + None, + ); + assert!(matches!(res, Err(uapi::ReturnErrorCode::CalleeTrapped))); + + // Call the destination contract regularly, forcing it to self-destruct. + #[allow(deprecated)] + api::call_v2( + uapi::CallFlags::empty(), + callee_addr, + 0u64, // How much ref_time weight to devote for the execution. 0 = all. + 0u64, // How much proof_size weight to devote for the execution. 0 = all. + None, // No deposit limit. + &VALUE, + &[0u8; 0], + None, + ) + .unwrap(); +} diff --git a/substrate/frame/contracts/fixtures/contracts/drain.rs b/substrate/frame/contracts/fixtures/contracts/drain.rs new file mode 100644 index 00000000000..f5c8681c938 --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/drain.rs @@ -0,0 +1,44 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![no_std] +#![no_main] + +use common::output; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + output!(balance, [0u8; 8], api::balance,); + let balance = u64::from_le_bytes(balance[..].try_into().unwrap()); + + output!(minimum_balance, [0u8; 8], api::minimum_balance,); + let minimum_balance = u64::from_le_bytes(minimum_balance[..].try_into().unwrap()); + + // Make the transferred value exceed the balance by adding the minimum balance. + let balance = balance + minimum_balance; + + // Try to self-destruct by sending more balance to the 0 address. + // The call will fail because a contract transfer has a keep alive requirement. + let res = api::transfer(&[0u8; 32], &balance.to_le_bytes()); + assert!(matches!(res, Err(uapi::ReturnErrorCode::TransferFailed))); +} diff --git a/substrate/frame/contracts/fixtures/contracts/ecdsa_recover.rs b/substrate/frame/contracts/fixtures/contracts/ecdsa_recover.rs new file mode 100644 index 00000000000..0f28ca2c819 --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/ecdsa_recover.rs @@ -0,0 +1,44 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![no_std] +#![no_main] + +use common::input; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + input!( + signature: [u8; 65], + hash: [u8; 32], + ); + + let mut output = [0u8; 33]; + api::ecdsa_recover( + &signature[..].try_into().unwrap(), + &hash[..].try_into().unwrap(), + &mut output, + ) + .unwrap(); + api::return_value(uapi::ReturnFlags::empty(), &output); +} diff --git a/substrate/frame/contracts/fixtures/contracts/event_and_return_on_deploy.rs b/substrate/frame/contracts/fixtures/contracts/event_and_return_on_deploy.rs new file mode 100644 index 00000000000..9186835d291 --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/event_and_return_on_deploy.rs @@ -0,0 +1,36 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![no_std] +#![no_main] + +extern crate common; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() { + let buffer = [1u8, 2, 3, 4]; + api::deposit_event(&[0u8; 0], &buffer); + api::return_value(uapi::ReturnFlags::empty(), &buffer); +} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + unreachable!() +} diff --git a/substrate/frame/contracts/fixtures/contracts/event_size.rs b/substrate/frame/contracts/fixtures/contracts/event_size.rs new file mode 100644 index 00000000000..e95130d3083 --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/event_size.rs @@ -0,0 +1,37 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![no_std] +#![no_main] + +use common::input; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + input!(len: u32,); + + let buffer = [0u8; 16 * 1024 + 1]; + let data = &buffer[..len as usize]; + + api::deposit_event(&[0u8; 0], data); +} diff --git a/substrate/frame/contracts/fixtures/contracts/float_instruction.rs b/substrate/frame/contracts/fixtures/contracts/float_instruction.rs new file mode 100644 index 00000000000..b1eaaf8543c --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/float_instruction.rs @@ -0,0 +1,34 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![no_std] +#![no_main] + +extern crate common; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() {} + +#[no_mangle] +pub extern "C" fn add(a: f32, b: f32) -> f32 { + a + b +} diff --git a/substrate/frame/contracts/fixtures/contracts/instantiate_return_code.rs b/substrate/frame/contracts/fixtures/contracts/instantiate_return_code.rs new file mode 100644 index 00000000000..67cd739d85a --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/instantiate_return_code.rs @@ -0,0 +1,53 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![no_std] +#![no_main] + +use common::input; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + input!(buffer, 36, code_hash: [u8; 32],); + let input = &buffer[32..]; + + #[allow(deprecated)] + let err_code = match api::instantiate_v2( + code_hash, + 0u64, // How much ref_time weight to devote for the execution. 0 = all. + 0u64, /* How much proof_size weight to devote for the execution. 0 = + * all. */ + None, // No deposit limit. + &10_000u64.to_le_bytes(), // Value to transfer. + input, + None, + None, + &[0u8; 0], // Empty salt. + ) { + Ok(_) => 0u32, + Err(code) => code as u32, + }; + + // Exit with success and take transfer return code to the output buffer. + api::return_value(uapi::ReturnFlags::empty(), &err_code.to_le_bytes()); +} diff --git a/substrate/frame/contracts/fixtures/contracts/invalid_contract_no_call.rs b/substrate/frame/contracts/fixtures/contracts/invalid_contract_no_call.rs new file mode 100644 index 00000000000..13af3eb22b1 --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/invalid_contract_no_call.rs @@ -0,0 +1,25 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +//! Valid module but missing the call function +#![no_std] +#![no_main] + +extern crate common; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} diff --git a/substrate/frame/contracts/fixtures/contracts/multi_store.rs b/substrate/frame/contracts/fixtures/contracts/multi_store.rs new file mode 100644 index 00000000000..b83f3995a42 --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/multi_store.rs @@ -0,0 +1,43 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Does two stores to two seperate storage items +#![no_std] +#![no_main] + +use common::input; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + input!( + size1: u32, + size2: u32, + ); + + let buffer = [0u8; 16 * 1024]; + + // Place a values in storage sizes are specified in the input buffer. + // We don't care about the contents of the storage item. + api::set_storage(&[1u8; 32], &buffer[0..size1 as _]); + api::set_storage(&[2u8; 32], &buffer[0..size2 as _]); +} diff --git a/substrate/frame/contracts/fixtures/contracts/new_set_code_hash_contract.rs b/substrate/frame/contracts/fixtures/contracts/new_set_code_hash_contract.rs new file mode 100644 index 00000000000..2a59b6e33d8 --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/new_set_code_hash_contract.rs @@ -0,0 +1,32 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![no_std] +#![no_main] + +extern crate common; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + api::return_value(uapi::ReturnFlags::empty(), &2u32.to_le_bytes()); +} diff --git a/substrate/frame/contracts/fixtures/contracts/ok_trap_revert.rs b/substrate/frame/contracts/fixtures/contracts/ok_trap_revert.rs new file mode 100644 index 00000000000..55115f8642f --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/ok_trap_revert.rs @@ -0,0 +1,44 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![no_std] +#![no_main] + +use common::input; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() { + ok_trap_revert(); +} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + ok_trap_revert(); +} + +#[no_mangle] +fn ok_trap_revert() { + input!(buffer, 4,); + match buffer.first().unwrap_or(&0) { + 1 => api::return_value(uapi::ReturnFlags::REVERT, &[0u8; 0]), + 2 => panic!(), + _ => {}, + }; +} diff --git a/substrate/frame/contracts/fixtures/contracts/reentrance_count_call.rs b/substrate/frame/contracts/fixtures/contracts/reentrance_count_call.rs new file mode 100644 index 00000000000..9812dce2e81 --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/reentrance_count_call.rs @@ -0,0 +1,55 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// This fixture tests if account_reentrance_count works as expected. +#![no_std] +#![no_main] + +use common::{input, output}; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + input!(expected_reentrance_count: u32,); + + // Read the contract address. + output!(addr, [0u8; 32], api::address,); + + #[allow(deprecated)] + let reentrance_count = api::reentrance_count(); + assert_eq!(reentrance_count, expected_reentrance_count); + + // Re-enter 5 times in a row and assert that the reentrant counter works as expected. + if expected_reentrance_count != 5 { + let count = (expected_reentrance_count + 1).to_le_bytes(); + + api::call_v1( + uapi::CallFlags::ALLOW_REENTRY, + addr, + 0u64, // How much gas to devote for the execution. 0 = all. + &0u64.to_le_bytes(), // value transferred to the contract. + &count, + None, + ) + .unwrap(); + } +} diff --git a/substrate/frame/contracts/fixtures/contracts/reentrance_count_delegated_call.rs b/substrate/frame/contracts/fixtures/contracts/reentrance_count_delegated_call.rs new file mode 100644 index 00000000000..9baf9503808 --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/reentrance_count_delegated_call.rs @@ -0,0 +1,53 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// This fixture tests if account_reentrance_count works as expected. +#![no_std] +#![no_main] + +use common::input; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + input!( + input, + code_hash: [u8; 32], + call_stack_height: u32, + ); + + let call_stack_height = call_stack_height + 1; + + #[allow(deprecated)] + let reentrance_count = api::reentrance_count(); + + // Reentrance count stays 0. + assert_eq!(reentrance_count, 0); + + // Re-enter 5 times in a row and assert that the reentrant counter works as expected. + if call_stack_height != 5 { + let mut input = [0u8; 36]; + input[0..32].copy_from_slice(code_hash); + input[32..36].copy_from_slice(&call_stack_height.to_le_bytes()); + api::delegate_call(uapi::CallFlags::empty(), code_hash, &input, None).unwrap(); + } +} diff --git a/substrate/frame/contracts/fixtures/contracts/return_with_data.rs b/substrate/frame/contracts/fixtures/contracts/return_with_data.rs new file mode 100644 index 00000000000..5340f86fbfc --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/return_with_data.rs @@ -0,0 +1,43 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![no_std] +#![no_main] + +use common::input; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() { + call(); +} + +/// Reads the first byte as the exit status and copy all but the first 4 bytes of the input as +/// output data. +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + input!( + input, 128, + exit_status: [u8; 4], + output: [u8], + ); + + let exit_status = uapi::ReturnFlags::from_bits(exit_status[0] as u32).unwrap(); + api::return_value(exit_status, output); +} diff --git a/substrate/frame/contracts/fixtures/contracts/run_out_of_gas.rs b/substrate/frame/contracts/fixtures/contracts/run_out_of_gas.rs new file mode 100644 index 00000000000..11eaaa7c862 --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/run_out_of_gas.rs @@ -0,0 +1,32 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![no_std] +#![no_main] + +extern crate common; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + #[allow(clippy::empty_loop)] + loop {} +} diff --git a/substrate/frame/contracts/fixtures/contracts/self_destruct.rs b/substrate/frame/contracts/fixtures/contracts/self_destruct.rs new file mode 100644 index 00000000000..94c3ac387a0 --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/self_destruct.rs @@ -0,0 +1,53 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![no_std] +#![no_main] + +use common::{input, output}; +use uapi::{HostFn, HostFnImpl as api}; + +const DJANGO: [u8; 32] = [4u8; 32]; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + // If the input data is not empty, then recursively call self with empty input data. + // This should trap instead of self-destructing since a contract cannot be removed, while it's + // in the execution stack. If the recursive call traps, then trap here as well. + input!(input, 4,); + + if !input.is_empty() { + output!(addr, [0u8; 32], api::address,); + api::call_v1( + uapi::CallFlags::ALLOW_REENTRY, + addr, + 0u64, // How much gas to devote for the execution. 0 = all. + &0u64.to_le_bytes(), // Value to transfer. + &[0u8; 0], + None, + ) + .unwrap(); + } else { + // Try to terminate and give balance to django. + api::terminate_v1(&DJANGO); + } +} diff --git a/substrate/frame/contracts/fixtures/contracts/self_destructing_constructor.rs b/substrate/frame/contracts/fixtures/contracts/self_destructing_constructor.rs new file mode 100644 index 00000000000..97b6759b3a6 --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/self_destructing_constructor.rs @@ -0,0 +1,32 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![no_std] +#![no_main] + +extern crate common; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() { + api::terminate_v1(&[0u8; 32]); +} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() {} diff --git a/substrate/frame/contracts/fixtures/contracts/set_code_hash.rs b/substrate/frame/contracts/fixtures/contracts/set_code_hash.rs new file mode 100644 index 00000000000..e3cf4becfb9 --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/set_code_hash.rs @@ -0,0 +1,37 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![no_std] +#![no_main] + +use common::input; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + input!(addr: [u8; 32],); + api::set_code_hash(addr).unwrap(); + + // we return 1 after setting new code_hash + // next `call` will NOT return this value, because contract code has been changed + api::return_value(uapi::ReturnFlags::empty(), &1u32.to_le_bytes()); +} diff --git a/substrate/frame/contracts/fixtures/contracts/set_empty_storage.rs b/substrate/frame/contracts/fixtures/contracts/set_empty_storage.rs new file mode 100644 index 00000000000..e7366630e8f --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/set_empty_storage.rs @@ -0,0 +1,32 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![no_std] +#![no_main] + +extern crate common; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + api::set_storage(&[0u8; 32], &[0u8; 4]); +} diff --git a/substrate/frame/contracts/fixtures/contracts/sr25519_verify.rs b/substrate/frame/contracts/fixtures/contracts/sr25519_verify.rs new file mode 100644 index 00000000000..8920ce0d4f6 --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/sr25519_verify.rs @@ -0,0 +1,48 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![no_std] +#![no_main] + +use common::input; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + input!( + signature: [u8; 64], + pub_key: [u8; 32], + msg: [u8; 11], + ); + + let exit_status = match api::sr25519_verify( + &signature.try_into().unwrap(), + msg, + &pub_key.try_into().unwrap(), + ) { + Ok(_) => 0u32, + Err(code) => code as u32, + }; + + // Exit with success and take transfer return code to the output buffer. + api::return_value(uapi::ReturnFlags::empty(), &exit_status.to_le_bytes()); +} diff --git a/substrate/frame/contracts/fixtures/contracts/storage_size.rs b/substrate/frame/contracts/fixtures/contracts/storage_size.rs new file mode 100644 index 00000000000..744ffe8503e --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/storage_size.rs @@ -0,0 +1,45 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![no_std] +#![no_main] + +use common::input; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + input!(len: u32, ); + + let mut buffer = [0u8; 16 * 1024 + 1]; + let data = &buffer[..len as usize]; + + // Place a garbage value in storage, the size of which is specified by the call input. + let mut key = [0u8; 32]; + key[0] = 1; + + api::set_storage(&key, data); + + let data = &mut &mut buffer[..]; + api::get_storage(&key, data).unwrap(); + assert_eq!(data.len(), len as usize); +} diff --git a/substrate/frame/contracts/fixtures/contracts/store_call.rs b/substrate/frame/contracts/fixtures/contracts/store_call.rs new file mode 100644 index 00000000000..d20d811c294 --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/store_call.rs @@ -0,0 +1,41 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![no_std] +#![no_main] + +use common::input; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + input!(len: u32, ); + + let buffer = [0u8; 16 * 1024 + 1]; + let data = &buffer[..len as usize]; + + // Place a garbage value in storage, the size of which is specified by the call input. + let mut key = [0u8; 32]; + key[0] = 1; + + api::set_storage(&key, data); +} diff --git a/substrate/frame/contracts/fixtures/contracts/store_deploy.rs b/substrate/frame/contracts/fixtures/contracts/store_deploy.rs new file mode 100644 index 00000000000..26f3b86baff --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/store_deploy.rs @@ -0,0 +1,41 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![no_std] +#![no_main] + +use common::input; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() { + input!(len: u32, ); + + let buffer = [0u8; 16 * 1024 + 1]; + let data = &buffer[..len as usize]; + + // place a garbage value in storage, the size of which is specified by the call input. + let mut key = [0u8; 32]; + key[0] = 1; + + api::set_storage(&key, data); +} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() {} diff --git a/substrate/frame/contracts/fixtures/contracts/transfer_return_code.rs b/substrate/frame/contracts/fixtures/contracts/transfer_return_code.rs new file mode 100644 index 00000000000..d3f6a1dd3a0 --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/transfer_return_code.rs @@ -0,0 +1,38 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![no_std] +#![no_main] + +extern crate common; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + let ret_code = match api::transfer(&[0u8; 32], &100u64.to_le_bytes()) { + Ok(_) => 0u32, + Err(code) => code as u32, + }; + + // Exit with success and take transfer return code to the output buffer. + api::return_value(uapi::ReturnFlags::empty(), &ret_code.to_le_bytes()); +} diff --git a/substrate/frame/contracts/fixtures/contracts/xcm_execute.rs b/substrate/frame/contracts/fixtures/contracts/xcm_execute.rs new file mode 100644 index 00000000000..09d0b6cf972 --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/xcm_execute.rs @@ -0,0 +1,39 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![no_std] +#![no_main] + +use common::input; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + input!(512, msg: [u8],); + + let mut outcome = [0u8; 512]; + let outcome = &mut &mut outcome[..]; + + #[allow(deprecated)] + api::xcm_execute(msg, outcome).unwrap(); + api::return_value(uapi::ReturnFlags::empty(), outcome); +} diff --git a/substrate/frame/contracts/fixtures/contracts/xcm_send.rs b/substrate/frame/contracts/fixtures/contracts/xcm_send.rs new file mode 100644 index 00000000000..6d4629e748a --- /dev/null +++ b/substrate/frame/contracts/fixtures/contracts/xcm_send.rs @@ -0,0 +1,42 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#![no_std] +#![no_main] + +use common::input; +use uapi::{HostFn, HostFnImpl as api}; + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn deploy() {} + +#[no_mangle] +#[polkavm_derive::polkavm_export] +pub extern "C" fn call() { + input!( + 512, + dest: [u8; 3], + msg: [u8], + ); + + let mut message_id = [0u8; 32]; + + #[allow(deprecated)] + api::xcm_send(dest, msg, &mut message_id).unwrap(); + api::return_value(uapi::ReturnFlags::empty(), &message_id); +} diff --git a/substrate/frame/contracts/fixtures/data/account_reentrance_count_call.wat b/substrate/frame/contracts/fixtures/data/account_reentrance_count_call.wat deleted file mode 100644 index e6d6ba8bb81..00000000000 --- a/substrate/frame/contracts/fixtures/data/account_reentrance_count_call.wat +++ /dev/null @@ -1,37 +0,0 @@ -;; This fixture tests if account_reentrance_count works as expected -;; testing it with 2 different addresses -(module - (import "seal0" "seal_input" (func $seal_input (param i32 i32))) - (import "seal0" "seal_caller" (func $seal_caller (param i32 i32))) - (import "seal0" "seal_return" (func $seal_return (param i32 i32 i32))) - (import "seal0" "account_reentrance_count" (func $account_reentrance_count (param i32) (result i32))) - (import "env" "memory" (memory 1 1)) - - ;; [0, 32) buffer where input is copied - ;; [32, 36) size of the input buffer - (data (i32.const 32) "\20") - - (func $assert (param i32) - (block $ok - (br_if $ok - (local.get 0) - ) - (unreachable) - ) - ) - - (func (export "call") - ;; Reading "callee" input address - (call $seal_input (i32.const 0) (i32.const 32)) - - (i32.store - (i32.const 36) - (call $account_reentrance_count (i32.const 0)) - ) - - (call $seal_return (i32.const 0) (i32.const 36) (i32.const 4)) - ) - - (func (export "deploy")) - -) \ No newline at end of file diff --git a/substrate/frame/contracts/fixtures/data/add_remove_delegate_dependency.wat b/substrate/frame/contracts/fixtures/data/add_remove_delegate_dependency.wat deleted file mode 100644 index dac7736244d..00000000000 --- a/substrate/frame/contracts/fixtures/data/add_remove_delegate_dependency.wat +++ /dev/null @@ -1,111 +0,0 @@ -;; This contract tests the behavior of adding / removing delegate_dependencies when delegate calling into a contract. -(module - (import "seal0" "add_delegate_dependency" (func $add_delegate_dependency (param i32))) - (import "seal0" "remove_delegate_dependency" (func $remove_delegate_dependency (param i32))) - (import "seal0" "input" (func $input (param i32 i32))) - (import "seal1" "terminate" (func $terminate (param i32))) - (import "seal0" "delegate_call" (func $delegate_call (param i32 i32 i32 i32 i32 i32) (result i32))) - (import "env" "memory" (memory 1 1)) - - ;; [100, 132) Address of Alice - (data (i32.const 100) - "\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01" - "\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01\01" - ) - - (func $assert (param i32) - (block $ok - (br_if $ok - (local.get 0) - ) - (unreachable) - ) - ) - - ;; This function loads input data and performs the action specified. - ;; The first 4 bytes of the input specify the action to perform. - ;; The next 32 bytes specify the code hash to use when calling add_delegate_dependency or remove_delegate_dependency. - ;; Actions are: - ;; 1: call add_delegate_dependency - ;; 2: call remove_delegate_dependency. - ;; 3: call terminate. - ;; Any other value is a no-op. - (func $load_input - (local $action i32) - (local $code_hash_ptr i32) - - ;; Store available input size at offset 0. - (i32.store (i32.const 0) (i32.const 512)) - - ;; Read input data. - (call $input (i32.const 4) (i32.const 0)) - - ;; Input data layout. - ;; [0..4) - size of the call - ;; [4..8) - action to perform - ;; [8..42) - code hash of the callee - (local.set $action (i32.load (i32.const 4))) - (local.set $code_hash_ptr (i32.const 8)) - - ;; Assert input size == 36 (4 for action + 32 for code_hash). - (call $assert - (i32.eq - (i32.load (i32.const 0)) - (i32.const 36) - ) - ) - - ;; Call add_delegate_dependency when action == 1. - (if (i32.eq (local.get $action) (i32.const 1)) - (then - (call $add_delegate_dependency (local.get $code_hash_ptr)) - ) - (else) - ) - - ;; Call remove_delegate_dependency when action == 2. - (if (i32.eq (local.get $action) (i32.const 2)) - (then - (call $remove_delegate_dependency - (local.get $code_hash_ptr) - ) - ) - (else) - ) - - ;; Call terminate when action == 3. - (if (i32.eq (local.get $action) (i32.const 3)) - (then - (call $terminate - (i32.const 100) ;; Pointer to beneficiary address - ) - (unreachable) ;; terminate never returns - ) - (else) - ) - ) - - (func (export "deploy") - (call $load_input) - ) - - (func (export "call") - (call $load_input) - - ;; Delegate call into passed code hash. - (call $assert - (i32.eq - (call $delegate_call - (i32.const 0) ;; Set no call flags. - (i32.const 8) ;; Pointer to "callee" code_hash. - (i32.const 0) ;; Input is ignored. - (i32.const 0) ;; Length of the input. - (i32.const 4294967295) ;; u32 max sentinel value: do not copy output. - (i32.const 0) ;; Length is ignored in this case. - ) - (i32.const 0) - ) - ) - ) - -) diff --git a/substrate/frame/contracts/fixtures/data/balance.wat b/substrate/frame/contracts/fixtures/data/balance.wat deleted file mode 100644 index d7970c92e41..00000000000 --- a/substrate/frame/contracts/fixtures/data/balance.wat +++ /dev/null @@ -1,42 +0,0 @@ -(module - (import "seal0" "seal_balance" (func $seal_balance (param i32 i32))) - (import "env" "memory" (memory 1 1)) - - ;; [0, 8) reserved for $seal_balance output - - ;; [8, 16) length of the buffer for $seal_balance - (data (i32.const 8) "\08") - - ;; [16, inf) zero initialized - - (func $assert (param i32) - (block $ok - (br_if $ok - (local.get 0) - ) - (unreachable) - ) - ) - - (func (export "deploy")) - - (func (export "call") - (call $seal_balance (i32.const 0) (i32.const 8)) - - ;; Balance should be encoded as a u64. - (call $assert - (i32.eq - (i32.load (i32.const 8)) - (i32.const 8) - ) - ) - - ;; Assert the free balance to be zero. - (call $assert - (i64.eq - (i64.load (i32.const 0)) - (i64.const 0) - ) - ) - ) -) diff --git a/substrate/frame/contracts/fixtures/data/call_return_code.wat b/substrate/frame/contracts/fixtures/data/call_return_code.wat deleted file mode 100644 index 4e9ab4dd77c..00000000000 --- a/substrate/frame/contracts/fixtures/data/call_return_code.wat +++ /dev/null @@ -1,42 +0,0 @@ -;; This calls the supplied dest and transfers 100 balance during this call and copies -;; the return code of this call to the output buffer. -;; It also forwards its input to the callee. -(module - (import "seal0" "seal_input" (func $seal_input (param i32 i32))) - (import "seal0" "seal_call" (func $seal_call (param i32 i32 i64 i32 i32 i32 i32 i32 i32) (result i32))) - (import "seal0" "seal_return" (func $seal_return (param i32 i32 i32))) - (import "env" "memory" (memory 1 1)) - - ;; [0, 8) 100 balance - (data (i32.const 0) "\64\00\00\00\00\00\00\00") - - ;; [8, 12) here we store the return code of the transfer - - ;; [12, 16) size of the input data - (data (i32.const 12) "\24") - - ;; [16, inf) here we store the input data - ;; 32 byte dest + 4 byte forward - - (func (export "deploy")) - - (func (export "call") - (call $seal_input (i32.const 16) (i32.const 12)) - (i32.store - (i32.const 8) - (call $seal_call - (i32.const 16) ;; Pointer to "callee" address. - (i32.const 32) ;; Length of "callee" address. - (i64.const 0) ;; How much gas to devote for the execution. 0 = all. - (i32.const 0) ;; Pointer to the buffer with value to transfer - (i32.const 8) ;; Length of the buffer with value to transfer. - (i32.const 48) ;; Pointer to input data buffer address - (i32.const 4) ;; Length of input data buffer - (i32.const 0xffffffff) ;; u32 max sentinel value: do not copy output - (i32.const 0) ;; Ptr to output buffer len - ) - ) - ;; exit with success and take transfer return code to the output buffer - (call $seal_return (i32.const 0) (i32.const 8) (i32.const 4)) - ) -) diff --git a/substrate/frame/contracts/fixtures/data/call_runtime.wat b/substrate/frame/contracts/fixtures/data/call_runtime.wat deleted file mode 100644 index d3d08ee2454..00000000000 --- a/substrate/frame/contracts/fixtures/data/call_runtime.wat +++ /dev/null @@ -1,33 +0,0 @@ -;; This passes its input to `seal_call_runtime` and returns the return value to its caller. -(module - (import "seal0" "call_runtime" (func $call_runtime (param i32 i32) (result i32))) - (import "seal0" "seal_input" (func $seal_input (param i32 i32))) - (import "seal0" "seal_return" (func $seal_return (param i32 i32 i32))) - (import "env" "memory" (memory 1 1)) - - ;; 0x1000 = 4k in little endian - ;; size of input buffer - (data (i32.const 0) "\00\10") - - (func (export "call") - ;; Receive the encoded call - (call $seal_input - (i32.const 4) ;; Pointer to the input buffer - (i32.const 0) ;; Size of the length buffer - ) - ;; Just use the call passed as input and store result to memory - (i32.store (i32.const 0) - (call $call_runtime - (i32.const 4) ;; Pointer where the call is stored - (i32.load (i32.const 0)) ;; Size of the call - ) - ) - (call $seal_return - (i32.const 0) ;; flags - (i32.const 0) ;; returned value - (i32.const 4) ;; length of returned value - ) - ) - - (func (export "deploy")) -) diff --git a/substrate/frame/contracts/fixtures/data/call_runtime_and_call.wat b/substrate/frame/contracts/fixtures/data/call_runtime_and_call.wat deleted file mode 100644 index 5d76e19a74c..00000000000 --- a/substrate/frame/contracts/fixtures/data/call_runtime_and_call.wat +++ /dev/null @@ -1,56 +0,0 @@ -(module - (import "seal0" "call_runtime" (func $call_runtime (param i32 i32) (result i32))) - (import "seal1" "seal_call" (func $seal_call (param i32 i32 i64 i32 i32 i32 i32 i32) (result i32))) - (import "seal0" "seal_input" (func $seal_input (param i32 i32))) - (import "seal0" "seal_return" (func $seal_return (param i32 i32 i32))) - (import "env" "memory" (memory 1 1)) - - (func $assert (param i32) - (block $ok - (br_if $ok (local.get 0)) - (unreachable) - ) - ) - - (func (export "call") - ;; Store available input size at offset 0. - (i32.store (i32.const 0) (i32.const 512)) - - ;; read input data - (call $seal_input (i32.const 4) (i32.const 0)) - - ;; Input data layout. - ;; [0..4) - size of the call - ;; [4..8) - how many bytes to add to storage - ;; [8..40) - address of the callee - ;; [40..n) - encoded runtime call - - ;; Invoke call_runtime with the encoded call passed to this contract. - (call $assert (i32.eqz - (call $call_runtime - (i32.const 40) ;; Pointer where the call is stored - (i32.sub - (i32.load (i32.const 0)) ;; Size of the call - (i32.const 36) ;; Subtract size of the subcall-related part: 4 bytes for storage length to add + 32 bytes of the callee address - ) - ) - )) - - ;; call passed contract - (call $assert (i32.eqz - (call $seal_call - (i32.const 0) ;; No flags - (i32.const 8) ;; Pointer to "callee" address. - (i64.const 0) ;; How much gas to devote for the execution. 0 = all. - (i32.const 512) ;; Pointer to the buffer with value to transfer - (i32.const 4) ;; Pointer to input data buffer address - (i32.const 4) ;; Length of input data buffer - (i32.const 4294967295) ;; u32 max value is the sentinel value: do not copy output - (i32.const 0) ;; Length is ignored in this case - ) - )) - ) - - (func (export "deploy")) -) - diff --git a/substrate/frame/contracts/fixtures/data/call_with_limit.wat b/substrate/frame/contracts/fixtures/data/call_with_limit.wat deleted file mode 100644 index 04da59551a8..00000000000 --- a/substrate/frame/contracts/fixtures/data/call_with_limit.wat +++ /dev/null @@ -1,38 +0,0 @@ -;; This expects [account_id, ref_time, proof_size] as input and calls the account_id with the supplied 2D Weight limit. -;; It returns the result of the call as output data. -(module - (import "seal0" "seal_input" (func $seal_input (param i32 i32))) - (import "seal2" "call" (func $seal_call (param i32 i32 i64 i64 i32 i32 i32 i32 i32 i32) (result i32))) - (import "seal0" "seal_return" (func $seal_return (param i32 i32 i32))) - (import "env" "memory" (memory 1 1)) - - ;; 0x1000 = 4k in little endian - ;; size of input buffer - (data (i32.const 0) "\00\10") - - (func (export "deploy")) - - (func (export "call") - ;; Receive the encoded account_id, ref_time, proof_size - (call $seal_input - (i32.const 4) ;; Pointer to the input buffer - (i32.const 0) ;; Pointer to the length of the input buffer - ) - (i32.store - (i32.const 0) - (call $seal_call - (i32.const 0) ;; Set no flag. - (i32.const 4) ;; Pointer to "callee" address. - (i64.load (i32.const 36)) ;; How much ref_time to devote for the execution. - (i64.load (i32.const 44)) ;; How much proof_size to devote for the execution. - (i32.const 0xffffffff) ;; u32 max sentinel value: pass no deposit limit. - (i32.const 0) ;; Pointer to the buffer with value to transfer - (i32.const 0) ;; Pointer to input data buffer address - (i32.const 0) ;; Length of input data buffer - (i32.const 0xffffffff) ;; u32 max sentinel value: do not copy output - (i32.const 0) ;; Length is ignored in this case - ) - ) - (call $seal_return (i32.const 0) (i32.const 0) (i32.const 4)) - ) -) diff --git a/substrate/frame/contracts/fixtures/data/caller_contract.wat b/substrate/frame/contracts/fixtures/data/caller_contract.wat deleted file mode 100644 index 43eb8ccfd54..00000000000 --- a/substrate/frame/contracts/fixtures/data/caller_contract.wat +++ /dev/null @@ -1,286 +0,0 @@ -(module - (import "seal0" "seal_input" (func $seal_input (param i32 i32))) - (import "seal0" "seal_balance" (func $seal_balance (param i32 i32))) - (import "seal2" "call" (func $seal_call (param i32 i32 i64 i64 i32 i32 i32 i32 i32 i32) (result i32))) - (import "seal2" "instantiate" (func $seal_instantiate - (param i32 i64 i64 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) (result i32) - )) - (import "env" "memory" (memory 1 1)) - - (func $assert (param i32) - (block $ok - (br_if $ok - (local.get 0) - ) - (unreachable) - ) - ) - - (func (export "deploy")) - - (func (export "call") - (local $sp i32) - (local $exit_code i32) - - ;; Length of the buffer - (i32.store (i32.const 20) (i32.const 32)) - - ;; Copy input to this contracts memory - (call $seal_input (i32.const 24) (i32.const 20)) - - ;; Input data is the code hash of the contract to be deployed. - (call $assert - (i32.eq - (i32.load (i32.const 20)) - (i32.const 32) - ) - ) - - ;; Read current balance into local variable. - (local.set $sp (i32.const 1024)) - - ;; Fail to deploy the contract since it returns a non-zero exit status. - (local.set $exit_code - (call $seal_instantiate - (i32.const 24) ;; Pointer to the code hash. - (i64.const 0) ;; How much ref_time weight to devote for the execution. 0 = all. - (i64.const 0) ;; How much proof_size weight to devote for the execution. 0 = all. - (i32.const 0xffffffff) ;; u32 max sentinel value: pass no deposit limit. - (i32.const 0) ;; Pointer to the buffer with value to transfer - (i32.const 9) ;; Pointer to input data buffer address - (i32.const 7) ;; Length of input data buffer - (i32.const 4294967295) ;; u32 max sentinel value: do not copy address - (i32.const 0) ;; Length is ignored in this case - (i32.const 4294967295) ;; u32 max sentinel value: do not copy output - (i32.const 0) ;; Length is ignored in this case - (i32.const 0) ;; salt_ptr - (i32.const 0) ;; salt_le - ) - ) - - ;; Check non-zero exit status. - (call $assert - (i32.eq (local.get $exit_code) (i32.const 2)) ;; ReturnCode::CalleeReverted - ) - - ;; Fail to deploy the contract due to insufficient ref_time weight. - (local.set $exit_code - (call $seal_instantiate - (i32.const 24) ;; Pointer to the code hash. - (i64.const 1) ;; Supply too little ref_time weight - (i64.const 0) ;; How much proof_size weight to devote for the execution. 0 = all. - (i32.const 0xffffffff) ;; u32 max sentinel value: pass no deposit limit. - (i32.const 0) ;; Pointer to the buffer with value to transfer - (i32.const 8) ;; Pointer to input data buffer address - (i32.const 8) ;; Length of input data buffer - (i32.const 4294967295) ;; u32 max sentinel value: do not copy address - (i32.const 0) ;; Length is ignored in this case - (i32.const 4294967295) ;; u32 max sentinel value: do not copy output - (i32.const 0) ;; Length is ignored in this case - (i32.const 0) ;; salt_ptr - (i32.const 0) ;; salt_le - - ) - ) - - ;; Check for special trap exit status. - (call $assert - (i32.eq (local.get $exit_code) (i32.const 1)) ;; ReturnCode::CalleeTrapped - ) - - ;; Fail to deploy the contract due to insufficient ref_time weight. - (local.set $exit_code - (call $seal_instantiate - (i32.const 24) ;; Pointer to the code hash. - (i64.const 0) ;; How much ref_time weight to devote for the execution. 0 = all. - (i64.const 1) ;; Supply too little proof_size weight - (i32.const 0xffffffff) ;; u32 max sentinel value: pass no deposit limit. - (i32.const 0) ;; Pointer to the buffer with value to transfer - (i32.const 8) ;; Pointer to input data buffer address - (i32.const 8) ;; Length of input data buffer - (i32.const 4294967295) ;; u32 max sentinel value: do not copy address - (i32.const 0) ;; Length is ignored in this case - (i32.const 4294967295) ;; u32 max sentinel value: do not copy output - (i32.const 0) ;; Length is ignored in this case - (i32.const 0) ;; salt_ptr - (i32.const 0) ;; salt_le - - ) - ) - - ;; Check for special trap exit status. - (call $assert - (i32.eq (local.get $exit_code) (i32.const 1)) ;; ReturnCode::CalleeTrapped - ) - - ;; Length of the output buffer - (i32.store - (i32.sub (local.get $sp) (i32.const 4)) - (i32.const 256) - ) - - ;; Deploy the contract successfully. - (local.set $exit_code - (call $seal_instantiate - (i32.const 24) ;; Pointer to the code hash. - (i64.const 0) ;; How much ref_time weight to devote for the execution. 0 = all. - (i64.const 0) ;; How much proof_size weight to devote for the execution. 0 = all. - (i32.const 0xffffffff) ;; u32 max sentinel value: pass no deposit limit. - (i32.const 0) ;; Pointer to the buffer with value to transfer - (i32.const 8) ;; Pointer to input data buffer address - (i32.const 8) ;; Length of input data buffer - (i32.const 16) ;; Pointer to the address output buffer - (i32.sub (local.get $sp) (i32.const 4)) ;; Pointer to the address buffer length - (i32.const 4294967295) ;; u32 max sentinel value: do not copy output - (i32.const 0) ;; Length is ignored in this case - (i32.const 0) ;; salt_ptr - (i32.const 0) ;; salt_le - - ) - ) - - ;; Check for success exit status. - (call $assert - (i32.eq (local.get $exit_code) (i32.const 0)) ;; ReturnCode::Success - ) - - ;; Check that address has the expected length - (call $assert - (i32.eq (i32.load (i32.sub (local.get $sp) (i32.const 4))) (i32.const 32)) - ) - - ;; Zero out destination buffer of output - (i32.store - (i32.sub (local.get $sp) (i32.const 4)) - (i32.const 0) - ) - - ;; Length of the output buffer - (i32.store - (i32.sub (local.get $sp) (i32.const 8)) - (i32.const 4) - ) - - ;; Call the new contract and expect it to return failing exit code. - (local.set $exit_code - (call $seal_call - (i32.const 0) ;; Set no flag - (i32.const 16) ;; Pointer to "callee" address. - (i64.const 0) ;; How much ref_time weight to devote for the execution. 0 = all. - (i64.const 0) ;; How much proof_size weight to devote for the execution. 0 = all. - (i32.const 0xffffffff) ;; u32 max sentinel value: pass no deposit limit. - (i32.const 0) ;; Pointer to the buffer with value to transfer - (i32.const 9) ;; Pointer to input data buffer address - (i32.const 7) ;; Length of input data buffer - (i32.sub (local.get $sp) (i32.const 4)) ;; Ptr to output buffer - (i32.sub (local.get $sp) (i32.const 8)) ;; Ptr to output buffer len - ) - ) - - ;; Check non-zero exit status. - (call $assert - (i32.eq (local.get $exit_code) (i32.const 2)) ;; ReturnCode::CalleeReverted - ) - - ;; Check that output buffer contains the expected return data. - (call $assert - (i32.eq (i32.load (i32.sub (local.get $sp) (i32.const 8))) (i32.const 3)) - ) - (call $assert - (i32.eq - (i32.load (i32.sub (local.get $sp) (i32.const 4))) - (i32.const 0x00776655) - ) - ) - - ;; Fail to call the contract due to insufficient ref_time weight. - (local.set $exit_code - (call $seal_call - (i32.const 0) ;; Set no flag - (i32.const 16) ;; Pointer to "callee" address. - (i64.const 1) ;; Supply too little ref_time weight - (i64.const 0) ;; How much proof_size weight to devote for the execution. 0 = all. - (i32.const 0xffffffff) ;; u32 max sentinel value: pass no deposit limit. - (i32.const 0) ;; Pointer to the buffer with value to transfer - (i32.const 8) ;; Pointer to input data buffer address - (i32.const 8) ;; Length of input data buffer - (i32.const 4294967295) ;; u32 max sentinel value: do not copy output - (i32.const 0) ;; Length is ignored in this cas - ) - ) - - ;; Check for special trap exit status. - (call $assert - (i32.eq (local.get $exit_code) (i32.const 1)) ;; ReturnCode::CalleeTrapped - ) - - ;; Fail to call the contract due to insufficient proof_size weight. - (local.set $exit_code - (call $seal_call - (i32.const 0) ;; Set no flag - (i32.const 16) ;; Pointer to "callee" address. - (i64.const 0) ;; How much ref_time weight to devote for the execution. 0 = all. - (i64.const 1) ;; Supply too little proof_size weight - (i32.const 0xffffffff) ;; u32 max sentinel value: pass no deposit limit. - (i32.const 0) ;; Pointer to the buffer with value to transfer - (i32.const 8) ;; Pointer to input data buffer address - (i32.const 8) ;; Length of input data buffer - (i32.const 4294967295) ;; u32 max sentinel value: do not copy output - (i32.const 0) ;; Length is ignored in this cas - ) - ) - - ;; Check for special trap exit status. - (call $assert - (i32.eq (local.get $exit_code) (i32.const 1)) ;; ReturnCode::CalleeTrapped - ) - - ;; Zero out destination buffer of output - (i32.store - (i32.sub (local.get $sp) (i32.const 4)) - (i32.const 0) - ) - - ;; Length of the output buffer - (i32.store - (i32.sub (local.get $sp) (i32.const 8)) - (i32.const 4) - ) - - ;; Call the contract successfully. - (local.set $exit_code - (call $seal_call - (i32.const 0) ;; Set no flag - (i32.const 16) ;; Pointer to "callee" address. - (i64.const 0) ;; How much ref_time weight to devote for the execution. 0 = all. - (i64.const 0) ;; How much proof_size weight to devote for the execution. 0 = all. - (i32.const 0xffffffff) ;; u32 max sentinel value: pass no deposit limit. - (i32.const 0) ;; Pointer to the buffer with value to transfer - (i32.const 8) ;; Pointer to input data buffer address - (i32.const 8) ;; Length of input data buffer - (i32.sub (local.get $sp) (i32.const 4)) ;; Ptr to output buffer - (i32.sub (local.get $sp) (i32.const 8)) ;; Ptr to output buffer len - ) - ) - - ;; Check for success exit status. - (call $assert - (i32.eq (local.get $exit_code) (i32.const 0)) ;; ReturnCode::Success - ) - - ;; Check that the output buffer contains the expected return data. - (call $assert - (i32.eq (i32.load (i32.sub (local.get $sp) (i32.const 8))) (i32.const 4)) - ) - (call $assert - (i32.eq - (i32.load (i32.sub (local.get $sp) (i32.const 4))) - (i32.const 0x77665544) - ) - ) - ) - - (data (i32.const 0) "\00\80") ;; The value to transfer on instantiation and calls. - ;; Chosen to be greater than existential deposit. - (data (i32.const 8) "\00\01\22\33\44\55\66\77") ;; The input data to instantiations and calls. -) diff --git a/substrate/frame/contracts/fixtures/data/chain_extension.wat b/substrate/frame/contracts/fixtures/data/chain_extension.wat deleted file mode 100644 index c24ca286ff8..00000000000 --- a/substrate/frame/contracts/fixtures/data/chain_extension.wat +++ /dev/null @@ -1,46 +0,0 @@ -;; Call chain extension by passing through input and output of this contract -(module - (import "seal0" "call_chain_extension" - (func $call_chain_extension (param i32 i32 i32 i32 i32) (result i32)) - ) - (import "seal0" "seal_input" (func $seal_input (param i32 i32))) - (import "seal0" "seal_return" (func $seal_return (param i32 i32 i32))) - (import "env" "memory" (memory 16 16)) - - (func $assert (param i32) - (block $ok - (br_if $ok (local.get 0)) - (unreachable) - ) - ) - - ;; [0, 4) len of input output - (data (i32.const 0) "\08") - - ;; [4, 12) buffer for input - - ;; [12, 48) len of output buffer - (data (i32.const 12) "\20") - - ;; [16, inf) buffer for output - - (func (export "deploy")) - - (func (export "call") - (call $seal_input (i32.const 4) (i32.const 0)) - - ;; the chain extension passes through the input and returns it as output - (call $call_chain_extension - (i32.load (i32.const 4)) ;; id - (i32.const 4) ;; input_ptr - (i32.load (i32.const 0)) ;; input_len - (i32.const 16) ;; output_ptr - (i32.const 12) ;; output_len_ptr - ) - - ;; the chain extension passes through the id - (call $assert (i32.eq (i32.load (i32.const 4)))) - - (call $seal_return (i32.const 0) (i32.const 16) (i32.load (i32.const 12))) - ) -) diff --git a/substrate/frame/contracts/fixtures/data/chain_extension_temp_storage.wat b/substrate/frame/contracts/fixtures/data/chain_extension_temp_storage.wat deleted file mode 100644 index 504646df1b0..00000000000 --- a/substrate/frame/contracts/fixtures/data/chain_extension_temp_storage.wat +++ /dev/null @@ -1,85 +0,0 @@ -;; Call chain extension two times with the specified func_ids -;; It then calls itself once -(module - (import "seal0" "seal_call_chain_extension" - (func $seal_call_chain_extension (param i32 i32 i32 i32 i32) (result i32)) - ) - (import "seal0" "seal_input" (func $seal_input (param i32 i32))) - (import "seal0" "seal_address" (func $seal_address (param i32 i32))) - (import "seal1" "seal_call" (func $seal_call (param i32 i32 i64 i32 i32 i32 i32 i32) (result i32))) - (import "env" "memory" (memory 16 16)) - - (func $assert (param i32) - (block $ok - (br_if $ok (local.get 0)) - (unreachable) - ) - ) - - ;; [0, 4) len of input buffer: 8 byte (func_ids) + 1byte (stop_recurse) - (data (i32.const 0) "\09") - - ;; [4, 16) buffer for input - - ;; [16, 48] buffer for self address - - ;; [48, 52] len of self address buffer - (data (i32.const 48) "\20") - - (func (export "deploy")) - - (func (export "call") - ;; input: (func_id1: i32, func_id2: i32, stop_recurse: i8) - (call $seal_input (i32.const 4) (i32.const 0)) - - (call $seal_call_chain_extension - (i32.load (i32.const 4)) ;; id - (i32.const 0) ;; input_ptr - (i32.const 0) ;; input_len - (i32.const 0xffffffff) ;; u32 max sentinel value: do not copy output - (i32.const 0) ;; output_len_ptr - ) - drop - - (call $seal_call_chain_extension - (i32.load (i32.const 8)) ;; _id - (i32.const 0) ;; input_ptr - (i32.const 0) ;; input_len - (i32.const 0xffffffff) ;; u32 max sentinel value: do not copy output - (i32.const 0) ;; output_len_ptr - ) - drop - - (if (i32.eqz (i32.load8_u (i32.const 12))) - (then - ;; stop recursion - (i32.store8 (i32.const 12) (i32.const 1)) - - ;; load own address into buffer - (call $seal_address (i32.const 16) (i32.const 48)) - - ;; call function 2 + 3 of chainext 3 next time - ;; (3 << 16) | 2 - ;; (3 << 16) | 3 - (i32.store (i32.const 4) (i32.const 196610)) - (i32.store (i32.const 8) (i32.const 196611)) - - ;; call self - (call $seal_call - (i32.const 8) ;; Set ALLOW_REENTRY - (i32.const 16) ;; Pointer to "callee" address. - (i64.const 0) ;; How much gas to devote for the execution. 0 = all. - (i32.const 512) ;; Pointer to the buffer with value to transfer - (i32.const 4) ;; Pointer to input data buffer address - (i32.load (i32.const 0)) ;; Length of input data buffer - (i32.const 4294967295) ;; u32 max value is the sentinel value: do not copy output - (i32.const 0) ;; Length is ignored in this case - ) - - ;; check that call succeeded of call - (call $assert (i32.eqz)) - ) - (else) - ) - ) -) diff --git a/substrate/frame/contracts/fixtures/data/create_storage_and_call.wat b/substrate/frame/contracts/fixtures/data/create_storage_and_call.wat deleted file mode 100644 index 2bff53b638f..00000000000 --- a/substrate/frame/contracts/fixtures/data/create_storage_and_call.wat +++ /dev/null @@ -1,60 +0,0 @@ -;; This calls another contract as passed as its account id. It also creates some storage. -(module - (import "seal0" "seal_input" (func $seal_input (param i32 i32))) - (import "seal0" "seal_set_storage" (func $seal_set_storage (param i32 i32 i32))) - (import "seal2" "call" (func $seal_call (param i32 i32 i64 i64 i32 i32 i32 i32 i32 i32) (result i32))) - (import "env" "memory" (memory 1 1)) - - (func $assert (param i32) - (block $ok - (br_if $ok - (local.get 0) - ) - (unreachable) - ) - ) - - (func (export "deploy")) - - (func (export "call") - ;; store length of input buffer - (i32.store (i32.const 0) (i32.const 512)) - - ;; copy input at address 4: - ;; first 4 bytes for the size of the storage to be created in callee - ;; next 32 bytes are for the callee address - ;; next bytes for the encoded deposit limit - (call $seal_input (i32.const 4) (i32.const 0)) - - ;; create 4 byte of storage before calling - (call $seal_set_storage - (i32.const 0) ;; Pointer to storage key - (i32.const 0) ;; Pointer to value - (i32.const 4) ;; Size of value - ) - - ;; call passed contract - (call $assert (i32.eqz - (call $seal_call - (i32.const 0) ;; No flags - (i32.const 8) ;; Pointer to "callee" address - (i64.const 0) ;; How much ref_time to devote for the execution. 0 = all - (i64.const 0) ;; How much proof_limit to devote for the execution. 0 = all - (i32.const 40) ;; Pointer to the storage deposit limit - (i32.const 512) ;; Pointer to the buffer with value to transfer - (i32.const 4) ;; Pointer to input data buffer address - (i32.const 4) ;; Length of input data buffer - (i32.const 4294967295) ;; u32 max value is the sentinel value: do not copy output - (i32.const 0) ;; Length is ignored in this case - ) - )) - - ;; create 8 byte of storage after calling - ;; item of 12 bytes because we override 4 bytes - (call $seal_set_storage - (i32.const 0) ;; Pointer to storage key - (i32.const 0) ;; Pointer to value - (i32.const 12) ;; Size of value - ) - ) -) diff --git a/substrate/frame/contracts/fixtures/data/create_storage_and_instantiate.wat b/substrate/frame/contracts/fixtures/data/create_storage_and_instantiate.wat deleted file mode 100644 index 00c9a657f39..00000000000 --- a/substrate/frame/contracts/fixtures/data/create_storage_and_instantiate.wat +++ /dev/null @@ -1,66 +0,0 @@ -;; This instantiates another contract and passes some input to its constructor. -(module - (import "seal0" "seal_input" (func $seal_input (param i32 i32))) - (import "seal0" "seal_set_storage" (func $seal_set_storage (param i32 i32 i32))) - (import "seal2" "instantiate" (func $seal_instantiate - (param i32 i64 i64 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) (result i32) - )) - (import "seal0" "seal_return" (func $seal_return (param i32 i32 i32))) - (import "env" "memory" (memory 1 1)) - - ;; [0, 8) send 10_000 balance - (data (i32.const 48) "\10\27\00\00\00\00\00\00") - - (func $assert (param i32) - (block $ok - (br_if $ok - (local.get 0) - ) - (unreachable) - ) - ) - - (func (export "deploy")) - - (func (export "call") - ;; store length of input buffer - (i32.store (i32.const 0) (i32.const 512)) - ;; store length of contract address - (i32.store (i32.const 84) (i32.const 32)) - - ;; copy input at address 4 - (call $seal_input (i32.const 4) (i32.const 0)) - - ;; memory layout is: - ;; [0,4): size of input buffer - ;; [4,8): size of the storage to be created in callee - ;; [8,40): the code hash of the contract to instantiate - ;; [40,48): for the encoded deposit limit - ;; [48,52): value to transfer - ;; [52,84): address of the deployed contract - ;; [84,88): len of the address - - ;; instantiate a contract - (call $assert (i32.eqz -;; (i32.store -;; (i32.const 64) - (call $seal_instantiate - (i32.const 8) ;; Pointer to the code hash. - (i64.const 0) ;; How much ref_time weight to devote for the execution. 0 = all. - (i64.const 0) ;; How much proof_size weight to devote for the execution. 0 = all. - (i32.const 40) ;; Pointer to the storage deposit limit - (i32.const 48) ;; Pointer to the buffer with value to transfer - (i32.const 4) ;; Pointer to input data buffer address - (i32.const 4) ;; Length of input data buffer - (i32.const 52) ;; Pointer to where to copy address - (i32.const 84) ;; Pointer to address len ptr - (i32.const 0xffffffff) ;; u32 max sentinel value: do not copy output - (i32.const 0) ;; Length is ignored in this case - (i32.const 0) ;; salt_ptr - (i32.const 0) ;; salt_len - ) - )) - ;; return the deployed contract address - (call $seal_return (i32.const 0) (i32.const 52) (i32.const 32)) - ) -) diff --git a/substrate/frame/contracts/fixtures/data/crypto_hashes.wat b/substrate/frame/contracts/fixtures/data/crypto_hashes.wat deleted file mode 100644 index 9d86b02f419..00000000000 --- a/substrate/frame/contracts/fixtures/data/crypto_hashes.wat +++ /dev/null @@ -1,83 +0,0 @@ -(module - (import "seal0" "seal_input" (func $seal_input (param i32 i32))) - (import "seal0" "seal_return" (func $seal_return (param i32 i32 i32))) - - (import "seal0" "seal_hash_sha2_256" (func $seal_hash_sha2_256 (param i32 i32 i32))) - (import "seal0" "seal_hash_keccak_256" (func $seal_hash_keccak_256 (param i32 i32 i32))) - (import "seal0" "seal_hash_blake2_256" (func $seal_hash_blake2_256 (param i32 i32 i32))) - (import "seal0" "seal_hash_blake2_128" (func $seal_hash_blake2_128 (param i32 i32 i32))) - - (import "env" "memory" (memory 1 1)) - - (type $hash_fn_sig (func (param i32 i32 i32))) - (table 8 funcref) - (elem (i32.const 1) - $seal_hash_sha2_256 - $seal_hash_keccak_256 - $seal_hash_blake2_256 - $seal_hash_blake2_128 - ) - (data (i32.const 1) "20202010201008") ;; Output sizes of the hashes in order in hex. - - ;; Not in use by the tests besides instantiating the contract. - (func (export "deploy")) - - ;; Called by the tests. - ;; - ;; The `call` function expects data in a certain format in the input buffer. - ;; - ;; 1. The first byte encodes an identifier for the crypto hash function - ;; under test. (*) - ;; 2. The rest encodes the input data that is directly fed into the - ;; crypto hash function chosen in 1. - ;; - ;; The `deploy` function then computes the chosen crypto hash function - ;; given the input and puts the result into the output buffer. - ;; After contract execution the test driver then asserts that the returned - ;; values are equal to the expected bytes for the input and chosen hash - ;; function. - ;; - ;; (*) The possible value for the crypto hash identifiers can be found below: - ;; - ;; | value | Algorithm | Bit Width | - ;; |-------|-----------|-----------| - ;; | 0 | SHA2 | 256 | - ;; | 1 | KECCAK | 256 | - ;; | 2 | BLAKE2 | 256 | - ;; | 3 | BLAKE2 | 128 | - ;; --------------------------------- - (func (export "call") - (local $chosen_hash_fn i32) - (local $input_len_ptr i32) - (local $input_ptr i32) - (local $input_len i32) - (local $output_ptr i32) - (local $output_len i32) - (local.set $input_len_ptr (i32.const 256)) - (local.set $input_ptr (i32.const 10)) - (i32.store (local.get $input_len_ptr) (i32.const 246)) - (call $seal_input (local.get $input_ptr) (local.get $input_len_ptr)) - (local.set $chosen_hash_fn (i32.load8_u (local.get $input_ptr))) - (if (i32.gt_u (local.get $chosen_hash_fn) (i32.const 7)) - (then - ;; We check that the chosen hash fn identifier is within bounds: [0,7] - (unreachable) - ) - ) - (local.set $input_ptr (i32.add (local.get $input_ptr) (i32.const 1))) - (local.set $input_len (i32.sub (i32.load (local.get $input_len_ptr)) (i32.const 1))) - (local.set $output_len (i32.load8_u (local.get $chosen_hash_fn))) - (call_indirect (type $hash_fn_sig) - (local.get $input_ptr) - (local.get $input_len) - (local.get $input_ptr) - (local.get $chosen_hash_fn) ;; Which crypto hash function to execute. - ) - (call $seal_return - (i32.const 0) - (local.get $input_ptr) ;; Linear memory location of the output buffer. - (local.get $output_len) ;; Number of output buffer bytes. - ) - (unreachable) - ) -) diff --git a/substrate/frame/contracts/fixtures/data/debug_message_invalid_utf8.wat b/substrate/frame/contracts/fixtures/data/debug_message_invalid_utf8.wat deleted file mode 100644 index dae0de88418..00000000000 --- a/substrate/frame/contracts/fixtures/data/debug_message_invalid_utf8.wat +++ /dev/null @@ -1,28 +0,0 @@ -;; Emit a debug message with an invalid utf-8 code -(module - (import "seal0" "seal_debug_message" (func $seal_debug_message (param i32 i32) (result i32))) - (import "env" "memory" (memory 1 1)) - - (data (i32.const 0) "\fc") - - (func $assert_eq (param i32 i32) - (block $ok - (br_if $ok - (i32.eq (local.get 0) (local.get 1)) - ) - (unreachable) - ) - ) - - (func (export "call") - (call $assert_eq - (call $seal_debug_message - (i32.const 0) ;; Pointer to the text buffer - (i32.const 12) ;; The size of the buffer - ) - (i32.const 0) ;; Success return code - ) - ) - - (func (export "deploy")) -) diff --git a/substrate/frame/contracts/fixtures/data/debug_message_logging_disabled.wat b/substrate/frame/contracts/fixtures/data/debug_message_logging_disabled.wat deleted file mode 100644 index e9ce20ba42b..00000000000 --- a/substrate/frame/contracts/fixtures/data/debug_message_logging_disabled.wat +++ /dev/null @@ -1,28 +0,0 @@ -;; Emit a "Hello World!" debug message but assume that logging is disabled. -(module - (import "seal0" "seal_debug_message" (func $seal_debug_message (param i32 i32) (result i32))) - (import "env" "memory" (memory 1 1)) - - (data (i32.const 0) "Hello World!") - - (func $assert_eq (param i32 i32) - (block $ok - (br_if $ok - (i32.eq (local.get 0) (local.get 1)) - ) - (unreachable) - ) - ) - - (func (export "call") - (call $assert_eq - (call $seal_debug_message - (i32.const 0) ;; Pointer to the text buffer - (i32.const 12) ;; The size of the buffer - ) - (i32.const 0) ;; Success return code - ) - ) - - (func (export "deploy")) -) diff --git a/substrate/frame/contracts/fixtures/data/debug_message_works.wat b/substrate/frame/contracts/fixtures/data/debug_message_works.wat deleted file mode 100644 index 44a7b6db1be..00000000000 --- a/substrate/frame/contracts/fixtures/data/debug_message_works.wat +++ /dev/null @@ -1,28 +0,0 @@ -;; Emit a "Hello World!" debug message -(module - (import "seal0" "seal_debug_message" (func $seal_debug_message (param i32 i32) (result i32))) - (import "env" "memory" (memory 1 1)) - - (data (i32.const 0) "Hello World!") - - (func $assert_eq (param i32 i32) - (block $ok - (br_if $ok - (i32.eq (local.get 0) (local.get 1)) - ) - (unreachable) - ) - ) - - (func (export "call") - (call $assert_eq - (call $seal_debug_message - (i32.const 0) ;; Pointer to the text buffer - (i32.const 12) ;; The size of the buffer - ) - (i32.const 0) ;; success return code - ) - ) - - (func (export "deploy")) -) diff --git a/substrate/frame/contracts/fixtures/data/delegate_call.wat b/substrate/frame/contracts/fixtures/data/delegate_call.wat deleted file mode 100644 index b8d4f0d47f0..00000000000 --- a/substrate/frame/contracts/fixtures/data/delegate_call.wat +++ /dev/null @@ -1,111 +0,0 @@ -(module - (import "seal0" "seal_input" (func $seal_input (param i32 i32))) - (import "seal0" "seal_get_storage" (func $seal_get_storage (param i32 i32 i32) (result i32))) - (import "seal0" "seal_set_storage" (func $seal_set_storage (param i32 i32 i32))) - (import "seal0" "seal_delegate_call" (func $seal_delegate_call (param i32 i32 i32 i32 i32 i32) (result i32))) - (import "env" "memory" (memory 3 3)) - - ;; [0, 32) storage key - (data (i32.const 0) "\01") - - ;; [32, 64) storage key - (data (i32.const 32) "\02") - - ;; [64, 96) buffer where input is copied - - ;; [96, 100) size of the input buffer - (data (i32.const 96) "\20") - - ;; [100, 104) size of buffer for seal_get_storage - (data (i32.const 100) "\20") - - ;; [104, 136) seal_get_storage buffer - - (func $assert (param i32) - (block $ok - (br_if $ok - (local.get 0) - ) - (unreachable) - ) - ) - - (func (export "call") - (local $exit_code i32) - - ;; Reading "callee" code_hash - (call $seal_input (i32.const 64) (i32.const 96)) - - ;; assert input size == 32 - (call $assert - (i32.eq - (i32.load (i32.const 96)) - (i32.const 32) - ) - ) - - ;; place a value in storage, the size of which is specified by the call input. - (call $seal_set_storage - (i32.const 0) ;; Pointer to storage key - (i32.const 32) ;; Pointer to initial value - (i32.load (i32.const 100)) ;; Size of value - ) - - (call $assert - (i32.eq - (call $seal_get_storage - (i32.const 0) ;; Pointer to storage key - (i32.const 104) ;; buffer where to copy result - (i32.const 100) ;; pointer to size of buffer - ) - (i32.const 0) ;; ReturnCode::Success - ) - ) - - (call $assert - (i32.eq - (i32.load (i32.const 104)) ;; value received from storage - (i32.load (i32.const 32)) ;; initial value - ) - ) - - ;; Call deployed library contract code. - (local.set $exit_code - (call $seal_delegate_call - (i32.const 0) ;; Set no call flags - (i32.const 64) ;; Pointer to "callee" code_hash. - (i32.const 0) ;; Input is ignored - (i32.const 0) ;; Length of the input - (i32.const 4294967295) ;; u32 max sentinel value: do not copy output - (i32.const 0) ;; Length is ignored in this case - ) - ) - - ;; Check for success exit status. - (call $assert - (i32.eq (local.get $exit_code) (i32.const 0)) ;; ReturnCode::Success - ) - - (call $assert - (i32.eq - (call $seal_get_storage - (i32.const 0) ;; Pointer to storage key - (i32.const 104) ;; buffer where to copy result - (i32.const 100) ;; pointer to size of buffer - ) - (i32.const 0) ;; ReturnCode::Success - ) - ) - - ;; Make sure that 'callee' code changed the value - (call $assert - (i32.eq - (i32.load (i32.const 104)) - (i32.const 1) - ) - ) - ) - - (func (export "deploy")) - -) diff --git a/substrate/frame/contracts/fixtures/data/delegate_call_lib.wat b/substrate/frame/contracts/fixtures/data/delegate_call_lib.wat deleted file mode 100644 index 62eea32800a..00000000000 --- a/substrate/frame/contracts/fixtures/data/delegate_call_lib.wat +++ /dev/null @@ -1,79 +0,0 @@ -(module - (import "seal0" "seal_set_storage" (func $seal_set_storage (param i32 i32 i32))) - (import "seal0" "seal_caller" (func $seal_caller (param i32 i32))) - (import "seal0" "seal_value_transferred" (func $seal_value_transferred (param i32 i32))) - (import "env" "memory" (memory 1 1)) - - ;; [0, 32) storage key - (data (i32.const 0) "\01") - - ;; [32, 64) buffer for transferred value - - ;; [64, 96) size of the buffer for transferred value - (data (i32.const 64) "\20") - - ;; [96, 128) buffer for the caller - - ;; [128, 160) size of the buffer for caller - (data (i32.const 128) "\20") - - (func $assert (param i32) - (block $ok - (br_if $ok - (local.get 0) - ) - (unreachable) - ) - ) - - (func (export "call") - ;; place a value in storage - (call $seal_set_storage - (i32.const 0) ;; Pointer to storage key - (i32.const 0) ;; Pointer to value - (i32.const 32) ;; Size of value - ) - - ;; This stores the value transferred in the buffer - (call $seal_value_transferred (i32.const 32) (i32.const 64)) - - ;; assert len == 8 - (call $assert - (i32.eq - (i32.load (i32.const 64)) - (i32.const 8) - ) - ) - - ;; assert that contents of the buffer is equal to the value - ;; passed to the `caller` contract: 1337 - (call $assert - (i64.eq - (i64.load (i32.const 32)) - (i64.const 1337) - ) - ) - - ;; fill the buffer with the caller. - (call $seal_caller (i32.const 96) (i32.const 128)) - - ;; assert len == 32 - (call $assert - (i32.eq - (i32.load (i32.const 128)) - (i32.const 32) - ) - ) - - ;; assert that the first 64 byte are the beginning of "ALICE", - ;; who is the caller of the `caller` contract - (call $assert - (i64.eq - (i64.load (i32.const 96)) - (i64.const 0x0101010101010101) - ) - ) - ) - - (func (export "deploy")) -) diff --git a/substrate/frame/contracts/fixtures/data/delegate_call_simple.wat b/substrate/frame/contracts/fixtures/data/delegate_call_simple.wat deleted file mode 100644 index ba0a8fcc8ae..00000000000 --- a/substrate/frame/contracts/fixtures/data/delegate_call_simple.wat +++ /dev/null @@ -1,50 +0,0 @@ -;; Just delegate call into the passed code hash and assert success. -(module - (import "seal0" "seal_input" (func $seal_input (param i32 i32))) - (import "seal0" "seal_delegate_call" (func $seal_delegate_call (param i32 i32 i32 i32 i32 i32) (result i32))) - (import "env" "memory" (memory 3 3)) - - ;; [0, 32) buffer where input is copied - - ;; [32, 36) size of the input buffer - (data (i32.const 32) "\20") - - (func $assert (param i32) - (block $ok - (br_if $ok - (local.get 0) - ) - (unreachable) - ) - ) - - (func (export "call") - ;; Reading "callee" code_hash - (call $seal_input (i32.const 0) (i32.const 32)) - - ;; assert input size == 32 - (call $assert - (i32.eq - (i32.load (i32.const 32)) - (i32.const 32) - ) - ) - - ;; Delegate call into passed code hash - (call $assert - (i32.eq - (call $seal_delegate_call - (i32.const 0) ;; Set no call flags - (i32.const 0) ;; Pointer to "callee" code_hash. - (i32.const 0) ;; Input is ignored - (i32.const 0) ;; Length of the input - (i32.const 4294967295) ;; u32 max sentinel value: do not copy output - (i32.const 0) ;; Length is ignored in this case - ) - (i32.const 0) - ) - ) - ) - - (func (export "deploy")) -) diff --git a/substrate/frame/contracts/fixtures/data/destroy_and_transfer.wat b/substrate/frame/contracts/fixtures/data/destroy_and_transfer.wat deleted file mode 100644 index 2afd3b2fbac..00000000000 --- a/substrate/frame/contracts/fixtures/data/destroy_and_transfer.wat +++ /dev/null @@ -1,161 +0,0 @@ -(module - (import "seal0" "seal_input" (func $seal_input (param i32 i32))) - (import "seal0" "seal_get_storage" (func $seal_get_storage (param i32 i32 i32) (result i32))) - (import "seal0" "seal_set_storage" (func $seal_set_storage (param i32 i32 i32))) - (import "seal0" "seal_call" (func $seal_call (param i32 i32 i64 i32 i32 i32 i32 i32 i32) (result i32))) - (import "seal0" "seal_transfer" (func $seal_transfer (param i32 i32 i32 i32) (result i32))) - (import "seal0" "seal_instantiate" (func $seal_instantiate - (param i32 i32 i64 i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) (result i32) - )) - (import "env" "memory" (memory 1 1)) - - ;; [0, 8) value to send when creating contract. - (data (i32.const 0) "\00\00\01") - - ;; [8, 16) Value to send when calling contract. - - ;; [16, 48) The key to store the contract address under. - - ;; [48, 80) Buffer where to store the input to the contract - - ;; [88, 96) Size of the buffer - (data (i32.const 88) "\FF") - - ;; [96, 100) Size of the input buffer - (data (i32.const 96) "\20") - - ;; [100, 132) Buffer where to store the address of the instantiated contract - - ;; [132, 134) Salt - (data (i32.const 132) "\47\11") - - - (func $assert (param i32) - (block $ok - (br_if $ok - (local.get 0) - ) - (unreachable) - ) - ) - - (func (export "deploy") - ;; Input data is the code hash of the contract to be deployed. - (call $seal_input (i32.const 48) (i32.const 96)) - (call $assert - (i32.eq - (i32.load (i32.const 96)) - (i32.const 32) - ) - ) - - ;; Deploy the contract with the provided code hash. - (call $assert - (i32.eq - (call $seal_instantiate - (i32.const 48) ;; Pointer to the code hash. - (i32.const 32) ;; Length of the code hash. - (i64.const 0) ;; How much gas to devote for the execution. 0 = all. - (i32.const 0) ;; Pointer to the buffer with value to transfer - (i32.const 8) ;; Length of the buffer with value to transfer. - (i32.const 0) ;; Pointer to input data buffer address - (i32.const 0) ;; Length of input data buffer - (i32.const 100) ;; Buffer where to store address of new contract - (i32.const 88) ;; Pointer to the length of the buffer - (i32.const 4294967295) ;; u32 max sentinel value: do not copy output - (i32.const 0) ;; Length is ignored in this case - (i32.const 132) ;; salt_ptr - (i32.const 2) ;; salt_len - ) - (i32.const 0) - ) - ) - - ;; Check that address has expected length - (call $assert - (i32.eq - (i32.load (i32.const 88)) - (i32.const 32) - ) - ) - - ;; Store the return address. - (call $seal_set_storage - (i32.const 16) ;; Pointer to the key - (i32.const 100) ;; Pointer to the value - (i32.const 32) ;; Length of the value - ) - ) - - (func (export "call") - ;; Read address of destination contract from storage. - (call $assert - (i32.eq - (call $seal_get_storage - (i32.const 16) ;; Pointer to the key - (i32.const 100) ;; Pointer to the value - (i32.const 88) ;; Pointer to the len of the value - ) - (i32.const 0) - ) - ) - (call $assert - (i32.eq - (i32.load (i32.const 88)) - (i32.const 32) - ) - ) - - ;; Calling the destination contract with non-empty input data should fail. - (call $assert - (i32.eq - (call $seal_call - (i32.const 100) ;; Pointer to destination address - (i32.const 32) ;; Length of destination address - (i64.const 0) ;; How much gas to devote for the execution. 0 = all. - (i32.const 0) ;; Pointer to the buffer with value to transfer - (i32.const 8) ;; Length of the buffer with value to transfer - (i32.const 0) ;; Pointer to input data buffer address - (i32.const 1) ;; Length of input data buffer - (i32.const 4294967295) ;; u32 max sentinel value: do not copy output - (i32.const 0) ;; Length is ignored in this case - - ) - (i32.const 0x1) - ) - ) - - ;; Call the destination contract regularly, forcing it to self-destruct. - (call $assert - (i32.eq - (call $seal_call - (i32.const 100) ;; Pointer to destination address - (i32.const 32) ;; Length of destination address - (i64.const 0) ;; How much gas to devote for the execution. 0 = all. - (i32.const 8) ;; Pointer to the buffer with value to transfer - (i32.const 8) ;; Length of the buffer with value to transfer - (i32.const 0) ;; Pointer to input data buffer address - (i32.const 0) ;; Length of input data buffer - (i32.const 4294967295) ;; u32 max sentinel value: do not copy output - (i32.const 0) ;; Length is ignored in this case - ) - (i32.const 0) - ) - ) - - ;; Calling the destination address with non-empty input data should now work since the - ;; contract has been removed. Also transfer a balance to the address so we can ensure this - ;; does not hinder the contract from being removed. - (call $assert - (i32.eq - (call $seal_transfer - (i32.const 100) ;; Pointer to destination address - (i32.const 32) ;; Length of destination address - (i32.const 0) ;; Pointer to the buffer with value to transfer - (i32.const 8) ;; Length of the buffer with value to transfer - ) - (i32.const 0) - ) - ) - ) -) diff --git a/substrate/frame/contracts/fixtures/data/drain.wat b/substrate/frame/contracts/fixtures/data/drain.wat deleted file mode 100644 index 18a21cca803..00000000000 --- a/substrate/frame/contracts/fixtures/data/drain.wat +++ /dev/null @@ -1,75 +0,0 @@ -(module - (import "seal0" "seal_balance" (func $seal_balance (param i32 i32))) - (import "seal0" "seal_minimum_balance" (func $seal_minimum_balance (param i32 i32))) - (import "seal0" "seal_transfer" (func $seal_transfer (param i32 i32 i32 i32) (result i32))) - (import "env" "memory" (memory 1 1)) - - ;; [0, 8) reserved for $seal_balance output - - ;; [8, 16) length of the buffer for $seal_balance - (data (i32.const 8) "\08") - - ;; [16, 24) reserved for $seal_minimum_balance - - ;; [24, 32) length of the buffer for $seal_minimum_balance - (data (i32.const 24) "\08") - - ;; [32, inf) zero initialized - - (func $assert (param i32) - (block $ok - (br_if $ok - (local.get 0) - ) - (unreachable) - ) - ) - - (func (export "deploy")) - - (func (export "call") - ;; Send entire remaining balance to the 0 address. - (call $seal_balance (i32.const 0) (i32.const 8)) - - ;; Balance should be encoded as a u64. - (call $assert - (i32.eq - (i32.load (i32.const 8)) - (i32.const 8) - ) - ) - - ;; Get the minimum balance. - (call $seal_minimum_balance (i32.const 16) (i32.const 24)) - - ;; Minimum balance should be encoded as a u64. - (call $assert - (i32.eq - (i32.load (i32.const 24)) - (i32.const 8) - ) - ) - - ;; Make the transferred value exceed the balance by adding the minimum balance. - (i64.store (i32.const 0) - (i64.add - (i64.load (i32.const 0)) - (i64.load (i32.const 16)) - ) - ) - - ;; Try to self-destruct by sending more balance to the 0 address. - ;; The call will fail because a contract transfer has a keep alive requirement - (call $assert - (i32.eq - (call $seal_transfer - (i32.const 32) ;; Pointer to destination address - (i32.const 48) ;; Length of destination address - (i32.const 0) ;; Pointer to the buffer with value to transfer - (i32.const 8) ;; Length of the buffer with value to transfer - ) - (i32.const 5) ;; ReturnCode::TransferFailed - ) - ) - ) -) diff --git a/substrate/frame/contracts/fixtures/data/ecdsa_recover.wat b/substrate/frame/contracts/fixtures/data/ecdsa_recover.wat deleted file mode 100644 index 4910e706069..00000000000 --- a/substrate/frame/contracts/fixtures/data/ecdsa_recover.wat +++ /dev/null @@ -1,55 +0,0 @@ -;; This contract: -;; 1) Reads signature and message hash from the input -;; 2) Calls ecdsa_recover -;; 3) Validates that result is Success -;; 4) Returns recovered compressed public key -(module - (import "seal0" "seal_ecdsa_recover" (func $seal_ecdsa_recover (param i32 i32 i32) (result i32))) - (import "seal0" "seal_return" (func $seal_return (param i32 i32 i32))) - (import "seal0" "seal_input" (func $seal_input (param i32 i32))) - (import "env" "memory" (memory 1 1)) - - (func $assert (param i32) - (block $ok - (br_if $ok - (local.get 0) - ) - (unreachable) - ) - ) - - (func (export "deploy")) - - ;; [4, 8) len of signature + message hash - 65 bytes + 32 byte = 97 bytes - (data (i32.const 4) "\61") - - ;; Memory layout during `call` - ;; [10, 75) signature - ;; [75, 107) message hash - (func (export "call") - (local $signature_ptr i32) - (local $message_hash_ptr i32) - (local $result i32) - (local.set $signature_ptr (i32.const 10)) - (local.set $message_hash_ptr (i32.const 75)) - ;; Read signature and message hash - 97 bytes - (call $seal_input (local.get $signature_ptr) (i32.const 4)) - (local.set - $result - (call $seal_ecdsa_recover - (local.get $signature_ptr) - (local.get $message_hash_ptr) - (local.get $signature_ptr) ;; Store output into message signature ptr, because we don't need it anymore - ) - ) - (call $assert - (i32.eq - (local.get $result) ;; The result of recovery execution - (i32.const 0x0) ;; 0x0 - Success result - ) - ) - - ;; exit with success and return recovered public key - (call $seal_return (i32.const 0) (local.get $signature_ptr) (i32.const 33)) - ) -) diff --git a/substrate/frame/contracts/fixtures/data/event_and_return_on_deploy.wat b/substrate/frame/contracts/fixtures/data/event_and_return_on_deploy.wat deleted file mode 100644 index 809cfe13545..00000000000 --- a/substrate/frame/contracts/fixtures/data/event_and_return_on_deploy.wat +++ /dev/null @@ -1,26 +0,0 @@ -(module - (import "seal0" "seal_return" (func $seal_return (param i32 i32 i32))) - (import "seal0" "seal_deposit_event" (func $seal_deposit_event (param i32 i32 i32 i32))) - (import "env" "memory" (memory 1 1)) - - (func (export "deploy") - (call $seal_deposit_event - (i32.const 0) ;; The topics buffer - (i32.const 0) ;; The topics buffer's length - (i32.const 8) ;; The data buffer - (i32.const 4) ;; The data buffer's length - ) - (call $seal_return - (i32.const 0) - (i32.const 8) - (i32.const 4) - ) - (unreachable) - ) - - (func (export "call") - (unreachable) - ) - - (data (i32.const 8) "\01\02\03\04") -) diff --git a/substrate/frame/contracts/fixtures/data/event_size.wat b/substrate/frame/contracts/fixtures/data/event_size.wat deleted file mode 100644 index 1c1f34b24d7..00000000000 --- a/substrate/frame/contracts/fixtures/data/event_size.wat +++ /dev/null @@ -1,39 +0,0 @@ -(module - (import "seal0" "seal_deposit_event" (func $seal_deposit_event (param i32 i32 i32 i32))) - (import "seal0" "seal_input" (func $seal_input (param i32 i32))) - (import "env" "memory" (memory 16 16)) - - ;; [0, 4) size of the input buffer - (data (i32.const 0) "\04") - - (func $assert (param i32) - (block $ok - (br_if $ok - (local.get 0) - ) - (unreachable) - ) - ) - - (func (export "call") - (call $seal_input (i32.const 4) (i32.const 0)) - - ;; assert input size == 4 - (call $assert - (i32.eq - (i32.load (i32.const 0)) - (i32.const 4) - ) - ) - - ;; place a garbage value in storage, the size of which is specified by the call input. - (call $seal_deposit_event - (i32.const 0) ;; topics_ptr - (i32.const 0) ;; topics_len - (i32.const 0) ;; data_ptr - (i32.load (i32.const 4)) ;; data_len - ) - ) - - (func (export "deploy")) -) diff --git a/substrate/frame/contracts/fixtures/data/float_instruction.wat b/substrate/frame/contracts/fixtures/data/float_instruction.wat deleted file mode 100644 index efa6b9de52d..00000000000 --- a/substrate/frame/contracts/fixtures/data/float_instruction.wat +++ /dev/null @@ -1,12 +0,0 @@ -;; Module that contains a float instruction which is illegal in deterministic mode -(module - (import "env" "memory" (memory 1 1)) - (func (export "call") - f32.const 1 - drop - ) - (func (export "deploy") - f32.const 2 - drop - ) -) diff --git a/substrate/frame/contracts/fixtures/data/instantiate_return_code.wat b/substrate/frame/contracts/fixtures/data/instantiate_return_code.wat deleted file mode 100644 index 6a8654520f1..00000000000 --- a/substrate/frame/contracts/fixtures/data/instantiate_return_code.wat +++ /dev/null @@ -1,47 +0,0 @@ -;; This instantiats a contract and transfers 100 balance during this call and copies the return code -;; of this call to the output buffer. -;; The first 32 byte of input is the code hash to instantiate -;; The rest of the input is forwarded to the constructor of the callee -(module - (import "seal0" "seal_input" (func $seal_input (param i32 i32))) - (import "seal1" "seal_instantiate" (func $seal_instantiate - (param i32 i64 i32 i32 i32 i32 i32 i32 i32 i32 i32) (result i32) - )) - (import "seal0" "seal_return" (func $seal_return (param i32 i32 i32))) - (import "env" "memory" (memory 1 1)) - - ;; [0, 8) 10_000 balance - (data (i32.const 0) "\10\27\00\00\00\00\00\00") - - ;; [8, 12) here we store the return code of the transfer - - ;; [12, 16) size of the input buffer - (data (i32.const 12) "\24") - - ;; [16, inf) input buffer - ;; 32 bye code hash + 4 byte forward - - (func (export "deploy")) - - (func (export "call") - (call $seal_input (i32.const 16) (i32.const 12)) - (i32.store - (i32.const 8) - (call $seal_instantiate - (i32.const 16) ;; Pointer to the code hash. - (i64.const 0) ;; How much gas to devote for the execution. 0 = all. - (i32.const 0) ;; Pointer to the buffer with value to transfer - (i32.const 48) ;; Pointer to input data buffer address - (i32.const 4) ;; Length of input data buffer - (i32.const 0xffffffff) ;; u32 max sentinel value: do not copy address - (i32.const 0) ;; Length is ignored in this case - (i32.const 0xffffffff) ;; u32 max sentinel value: do not copy output - (i32.const 0) ;; Length is ignored in this case - (i32.const 0) ;; salt_ptr - (i32.const 0) ;; salt_len - ) - ) - ;; exit with success and take transfer return code to the output buffer - (call $seal_return (i32.const 0) (i32.const 8) (i32.const 4)) - ) -) diff --git a/substrate/frame/contracts/fixtures/data/invalid_contract_no_call.wat b/substrate/frame/contracts/fixtures/data/invalid_contract_no_call.wat deleted file mode 100644 index 34f7c99ba85..00000000000 --- a/substrate/frame/contracts/fixtures/data/invalid_contract_no_call.wat +++ /dev/null @@ -1,5 +0,0 @@ -;; Valid module but missing the call function -(module - (import "env" "memory" (memory 1 1)) - (func (export "deploy")) -) diff --git a/substrate/frame/contracts/fixtures/data/multi_store.wat b/substrate/frame/contracts/fixtures/data/multi_store.wat deleted file mode 100644 index c334ed54c4e..00000000000 --- a/substrate/frame/contracts/fixtures/data/multi_store.wat +++ /dev/null @@ -1,54 +0,0 @@ -;; Does two stores to two seperate storage items -;; Expects (len0, len1) as input. -(module - (import "seal0" "seal_set_storage" (func $seal_set_storage (param i32 i32 i32))) - (import "seal0" "seal_input" (func $seal_input (param i32 i32))) - (import "env" "memory" (memory 16 16)) - - ;; [0, 32) storage key 0 - (data (i32.const 0) "\01") - - ;; [32, 64) storage key 1 - (data (i32.const 32) "\02") - - ;; [64, 72) buffer where input is copied (expected sizes of storage items) - - ;; [72, 76) size of the input buffer - (data (i32.const 72) "\08") - - (func $assert (param i32) - (block $ok - (br_if $ok - (local.get 0) - ) - (unreachable) - ) - ) - - (func (export "call") - (call $seal_input (i32.const 64) (i32.const 72)) - - ;; assert input size == 8 - (call $assert - (i32.eq - (i32.load (i32.const 72)) - (i32.const 8) - ) - ) - - ;; place a values in storage sizes are specified in the input buffer - ;; we don't care about the contents of the storage item - (call $seal_set_storage - (i32.const 0) ;; Pointer to storage key - (i32.const 0) ;; Pointer to value - (i32.load (i32.const 64)) ;; Size of value - ) - (call $seal_set_storage - (i32.const 32) ;; Pointer to storage key - (i32.const 0) ;; Pointer to value - (i32.load (i32.const 68)) ;; Size of value - ) - ) - - (func (export "deploy")) -) diff --git a/substrate/frame/contracts/fixtures/data/new_set_code_hash_contract.wat b/substrate/frame/contracts/fixtures/data/new_set_code_hash_contract.wat deleted file mode 100644 index 86ab2737be4..00000000000 --- a/substrate/frame/contracts/fixtures/data/new_set_code_hash_contract.wat +++ /dev/null @@ -1,13 +0,0 @@ -(module - (import "seal0" "seal_return" (func $seal_return (param i32 i32 i32))) - (import "env" "memory" (memory 1 1)) - - ;; [0, 32) return value - (data (i32.const 0) "\02") - - (func (export "deploy")) - - (func (export "call") - (call $seal_return (i32.const 0) (i32.const 0) (i32.const 4)) - ) -) diff --git a/substrate/frame/contracts/fixtures/data/ok_trap_revert.wat b/substrate/frame/contracts/fixtures/data/ok_trap_revert.wat deleted file mode 100644 index b7eaa9b700a..00000000000 --- a/substrate/frame/contracts/fixtures/data/ok_trap_revert.wat +++ /dev/null @@ -1,35 +0,0 @@ -(module - (import "seal0" "seal_input" (func $seal_input (param i32 i32))) - (import "seal0" "seal_return" (func $seal_return (param i32 i32 i32))) - (import "env" "memory" (memory 1 1)) - - (func (export "deploy") - (call $ok_trap_revert) - ) - - (func (export "call") - (call $ok_trap_revert) - ) - - (func $ok_trap_revert - (i32.store (i32.const 4) (i32.const 4)) - (call $seal_input (i32.const 0) (i32.const 4)) - (block $IF_2 - (block $IF_1 - (block $IF_0 - (br_table $IF_0 $IF_1 $IF_2 - (i32.load8_u (i32.const 0)) - ) - (unreachable) - ) - ;; 0 = return with success - return - ) - ;; 1 = revert - (call $seal_return (i32.const 1) (i32.const 0) (i32.const 0)) - (unreachable) - ) - ;; 2 = trap - (unreachable) - ) -) diff --git a/substrate/frame/contracts/fixtures/data/reentrance_count_call.wat b/substrate/frame/contracts/fixtures/data/reentrance_count_call.wat deleted file mode 100644 index 44db8d041b1..00000000000 --- a/substrate/frame/contracts/fixtures/data/reentrance_count_call.wat +++ /dev/null @@ -1,76 +0,0 @@ -;; This fixture recursively tests if reentrance_count returns correct reentrant count value when -;; using seal_call to make caller contract call to itself -(module - (import "seal0" "seal_input" (func $seal_input (param i32 i32))) - (import "seal0" "seal_address" (func $seal_address (param i32 i32))) - (import "seal1" "seal_call" (func $seal_call (param i32 i32 i64 i32 i32 i32 i32 i32) (result i32))) - (import "seal0" "reentrance_count" (func $reentrance_count (result i32))) - (import "env" "memory" (memory 1 1)) - - ;; [0, 32) reserved for $seal_address output - - ;; [32, 36) buffer for the call stack height - - ;; [36, 40) size of the input buffer - (data (i32.const 36) "\04") - - ;; [40, 44) length of the buffer for $seal_address - (data (i32.const 40) "\20") - - (func $assert (param i32) - (block $ok - (br_if $ok - (local.get 0) - ) - (unreachable) - ) - ) - (func (export "call") - (local $expected_reentrance_count i32) - (local $seal_call_exit_code i32) - - ;; reading current contract address - (call $seal_address (i32.const 0) (i32.const 40)) - - ;; reading passed input - (call $seal_input (i32.const 32) (i32.const 36)) - - ;; reading manually passed reentrant count - (local.set $expected_reentrance_count (i32.load (i32.const 32))) - - ;; reentrance count is calculated correctly - (call $assert - (i32.eq (call $reentrance_count) (local.get $expected_reentrance_count)) - ) - - ;; re-enter 5 times in a row and assert that the reentrant counter works as expected - (i32.eq (call $reentrance_count) (i32.const 5)) - (if - (then) ;; recursion exit case - (else - ;; incrementing $expected_reentrance_count passed to the contract - (i32.store (i32.const 32) (i32.add (i32.load (i32.const 32)) (i32.const 1))) - - ;; Call to itself - (local.set $seal_call_exit_code - (call $seal_call - (i32.const 8) ;; Allow reentrancy flag set - (i32.const 0) ;; Pointer to "callee" address - (i64.const 0) ;; How much gas to devote for the execution. 0 = all. - (i32.const 0) ;; Pointer to the buffer with value to transfer - (i32.const 32) ;; Pointer to input data buffer address - (i32.const 4) ;; Length of input data buffer - (i32.const 0xffffffff) ;; u32 max sentinel value: do not copy output - (i32.const 0) ;; Ptr to output buffer len - ) - ) - - (call $assert - (i32.eq (local.get $seal_call_exit_code) (i32.const 0)) - ) - ) - ) - ) - - (func (export "deploy")) -) \ No newline at end of file diff --git a/substrate/frame/contracts/fixtures/data/reentrance_count_delegated_call.wat b/substrate/frame/contracts/fixtures/data/reentrance_count_delegated_call.wat deleted file mode 100644 index 49e0193bcdb..00000000000 --- a/substrate/frame/contracts/fixtures/data/reentrance_count_delegated_call.wat +++ /dev/null @@ -1,71 +0,0 @@ -;; This fixture recursively tests if reentrance_count returns correct reentrant count value when -;; using seal_delegate_call to make caller contract delegate call to itself -(module - (import "seal0" "seal_input" (func $seal_input (param i32 i32))) - (import "seal0" "seal_set_storage" (func $seal_set_storage (param i32 i32 i32))) - (import "seal0" "seal_delegate_call" (func $seal_delegate_call (param i32 i32 i32 i32 i32 i32) (result i32))) - (import "seal0" "reentrance_count" (func $reentrance_count (result i32))) - (import "env" "memory" (memory 1 1)) - - ;; [0, 32) buffer where code hash is copied - - ;; [32, 36) buffer for the call stack height - - ;; [36, 40) size of the input buffer - (data (i32.const 36) "\24") - - (func $assert (param i32) - (block $ok - (br_if $ok - (local.get 0) - ) - (unreachable) - ) - ) - (func (export "call") - (local $callstack_height i32) - (local $delegate_call_exit_code i32) - - ;; Reading input - (call $seal_input (i32.const 0) (i32.const 36)) - - ;; reading passed callstack height - (local.set $callstack_height (i32.load (i32.const 32))) - - ;; incrementing callstack height - (i32.store (i32.const 32) (i32.add (i32.load (i32.const 32)) (i32.const 1))) - - ;; reentrance count stays 0 - (call $assert - (i32.eq (call $reentrance_count) (i32.const 0)) - ) - - (i32.eq (local.get $callstack_height) (i32.const 5)) - (if - (then) ;; exit recursion case - (else - ;; Call to itself - (local.set $delegate_call_exit_code - (call $seal_delegate_call - (i32.const 0) ;; Set no call flags - (i32.const 0) ;; Pointer to "callee" code_hash. - (i32.const 0) ;; Pointer to the input data - (i32.const 36) ;; Length of the input - (i32.const 4294967295) ;; u32 max sentinel value: do not copy output - (i32.const 0) ;; Length is ignored in this case - ) - ) - - (call $assert - (i32.eq (local.get $delegate_call_exit_code) (i32.const 0)) - ) - ) - ) - - (call $assert - (i32.le_s (local.get $callstack_height) (i32.const 5)) - ) - ) - - (func (export "deploy")) -) \ No newline at end of file diff --git a/substrate/frame/contracts/fixtures/data/return_with_data.wat b/substrate/frame/contracts/fixtures/data/return_with_data.wat deleted file mode 100644 index 93b9daa07a3..00000000000 --- a/substrate/frame/contracts/fixtures/data/return_with_data.wat +++ /dev/null @@ -1,33 +0,0 @@ -(module - (import "seal0" "seal_input" (func $seal_input (param i32 i32))) - (import "seal0" "seal_return" (func $seal_return (param i32 i32 i32))) - (import "env" "memory" (memory 1 1)) - - ;; [0, 128) buffer where input is copied - - ;; [128, 132) length of the input buffer - (data (i32.const 128) "\80") - - ;; Deploy routine is the same as call. - (func (export "deploy") - (call $call) - ) - - ;; Call reads the first 4 bytes (LE) as the exit status and returns the rest as output data. - (func $call (export "call") - ;; Copy input into this contracts memory. - (call $seal_input (i32.const 0) (i32.const 128)) - - ;; Copy all but the first 4 bytes of the input data as the output data. - ;; Use the first byte as exit status - (call $seal_return - (i32.load8_u (i32.const 0)) ;; Exit status - (i32.const 4) ;; Pointer to the data to return. - (i32.sub ;; Count of bytes to copy. - (i32.load (i32.const 128)) - (i32.const 4) - ) - ) - (unreachable) - ) -) diff --git a/substrate/frame/contracts/fixtures/data/run_out_of_gas.wat b/substrate/frame/contracts/fixtures/data/run_out_of_gas.wat deleted file mode 100644 index fe53e92c4fa..00000000000 --- a/substrate/frame/contracts/fixtures/data/run_out_of_gas.wat +++ /dev/null @@ -1,8 +0,0 @@ -(module - (import "env" "memory" (memory 1 1)) - (func (export "call") - (loop $inf (br $inf)) ;; just run out of gas - (unreachable) - ) - (func (export "deploy")) -) diff --git a/substrate/frame/contracts/fixtures/data/self_destruct.wat b/substrate/frame/contracts/fixtures/data/self_destruct.wat deleted file mode 100644 index 00c3895fdde..00000000000 --- a/substrate/frame/contracts/fixtures/data/self_destruct.wat +++ /dev/null @@ -1,83 +0,0 @@ -(module - (import "seal0" "seal_input" (func $seal_input (param i32 i32))) - (import "seal0" "seal_address" (func $seal_address (param i32 i32))) - (import "seal0" "seal_call" (func $seal_call (param i32 i32 i64 i32 i32 i32 i32 i32 i32) (result i32))) - (import "seal0" "seal_terminate" (func $seal_terminate (param i32 i32))) - (import "env" "memory" (memory 1 1)) - - ;; [0, 32) reserved for $seal_address output - - ;; [32, 36) length of the buffer - (data (i32.const 32) "\20") - - ;; [36, 68) Address of django - (data (i32.const 36) - "\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04" - "\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04\04" - ) - - ;; [68, 72) reserved for output of $seal_input - - ;; [72, 76) length of the buffer - (data (i32.const 72) "\04") - - ;; [76, inf) zero initialized - - (func $assert (param i32) - (block $ok - (br_if $ok - (local.get 0) - ) - (unreachable) - ) - ) - - (func (export "deploy")) - - (func (export "call") - ;; If the input data is not empty, then recursively call self with empty input data. - ;; This should trap instead of self-destructing since a contract cannot be removed live in - ;; the execution stack cannot be removed. If the recursive call traps, then trap here as - ;; well. - (call $seal_input (i32.const 68) (i32.const 72)) - (if (i32.load (i32.const 72)) - (then - (call $seal_address (i32.const 0) (i32.const 32)) - - ;; Expect address to be 8 bytes. - (call $assert - (i32.eq - (i32.load (i32.const 32)) - (i32.const 32) - ) - ) - - ;; Recursively call self with empty input data. - (call $assert - (i32.eq - (call $seal_call - (i32.const 0) ;; Pointer to own address - (i32.const 32) ;; Length of own address - (i64.const 0) ;; How much gas to devote for the execution. 0 = all. - (i32.const 76) ;; Pointer to the buffer with value to transfer - (i32.const 8) ;; Length of the buffer with value to transfer - (i32.const 0) ;; Pointer to input data buffer address - (i32.const 0) ;; Length of input data buffer - (i32.const 4294967295) ;; u32 max sentinel value: do not copy output - (i32.const 0) ;; Length is ignored in this case - ) - (i32.const 0) - ) - ) - ) - (else - ;; Try to terminate and give balance to django. - (call $seal_terminate - (i32.const 36) ;; Pointer to beneficiary address - (i32.const 32) ;; Length of beneficiary address - ) - (unreachable) ;; seal_terminate never returns - ) - ) - ) -) diff --git a/substrate/frame/contracts/fixtures/data/self_destructing_constructor.wat b/substrate/frame/contracts/fixtures/data/self_destructing_constructor.wat deleted file mode 100644 index 628f283a19f..00000000000 --- a/substrate/frame/contracts/fixtures/data/self_destructing_constructor.wat +++ /dev/null @@ -1,23 +0,0 @@ -(module - (import "seal0" "seal_terminate" (func $seal_terminate (param i32 i32))) - (import "env" "memory" (memory 1 1)) - - (func $assert (param i32) - (block $ok - (br_if $ok - (local.get 0) - ) - (unreachable) - ) - ) - - (func (export "deploy") - ;; Self-destruct by sending full balance to the 0 address. - (call $seal_terminate - (i32.const 0) ;; Pointer to destination address - (i32.const 32) ;; Length of destination address - ) - ) - - (func (export "call")) -) diff --git a/substrate/frame/contracts/fixtures/data/set_code_hash.wat b/substrate/frame/contracts/fixtures/data/set_code_hash.wat deleted file mode 100644 index c0a9557b4d0..00000000000 --- a/substrate/frame/contracts/fixtures/data/set_code_hash.wat +++ /dev/null @@ -1,43 +0,0 @@ -(module - (import "seal0" "seal_input" (func $seal_input (param i32 i32))) - (import "seal0" "seal_return" (func $seal_return (param i32 i32 i32))) - (import "seal0" "seal_set_code_hash" (func $seal_set_code_hash (param i32) (result i32))) - - (import "env" "memory" (memory 1 1)) - - ;; [0, 32) here we store input - - ;; [32, 36) input size - (data (i32.const 32) "\20") - - ;; [36, 40) return value - (data (i32.const 36) "\01") - - (func $assert (param i32) - (block $ok - (br_if $ok - (local.get 0) - ) - (unreachable) - ) - ) - - (func (export "call") - (local $exit_code i32) - - (call $seal_input (i32.const 0) (i32.const 32)) - - (local.set $exit_code - (call $seal_set_code_hash (i32.const 0)) ;; Pointer to the input data. - ) - (call $assert - (i32.eq (local.get $exit_code) (i32.const 0)) ;; ReturnCode::Success - ) - - ;; we return 1 after setting new code_hash - ;; next `call` will NOT return this value, because contract code has been changed - (call $seal_return (i32.const 0) (i32.const 36) (i32.const 4)) - ) - - (func (export "deploy")) -) diff --git a/substrate/frame/contracts/fixtures/data/set_empty_storage.wat b/substrate/frame/contracts/fixtures/data/set_empty_storage.wat deleted file mode 100644 index dbcd3a1326a..00000000000 --- a/substrate/frame/contracts/fixtures/data/set_empty_storage.wat +++ /dev/null @@ -1,15 +0,0 @@ -;; This module stores a KV pair into the storage -(module - (import "seal0" "seal_set_storage" (func $seal_set_storage (param i32 i32 i32))) - (import "env" "memory" (memory 16 16)) - - (func (export "call") - ) - (func (export "deploy") - (call $seal_set_storage - (i32.const 0) ;; Pointer to storage key - (i32.const 0) ;; Pointer to value - (i32.load (i32.const 0)) ;; Size of value - ) - ) -) diff --git a/substrate/frame/contracts/fixtures/data/sr25519_verify.wat b/substrate/frame/contracts/fixtures/data/sr25519_verify.wat deleted file mode 100644 index 2da1ceb87ea..00000000000 --- a/substrate/frame/contracts/fixtures/data/sr25519_verify.wat +++ /dev/null @@ -1,55 +0,0 @@ -;; This contract: -;; 1) Reads signature, message and public key from the input -;; 2) Calls and return the result of sr25519_verify - -(module - ;; import the host functions from the seal0 module - (import "seal0" "sr25519_verify" (func $sr25519_verify (param i32 i32 i32 i32) (result i32))) - (import "seal0" "seal_input" (func $seal_input (param i32 i32))) - (import "seal0" "seal_return" (func $seal_return (param i32 i32 i32))) - - ;; give the program 1 page of memory - (import "env" "memory" (memory 1 1)) - - ;; [0, 4) length of signature + message + public key - 64 + 11 + 32 = 107 bytes - ;; write the length of the input (6b = 107) bytes at offset 0 - (data (i32.const 0) "\6b") - - (func (export "deploy")) - - (func (export "call") - ;; define local variables - (local $signature_ptr i32) - (local $pub_key_ptr i32) - (local $message_len i32) - (local $message_ptr i32) - - ;; set the pointers to the memory locations - ;; Memory layout during `call` - ;; [10, 74) signature - ;; [74, 106) public key - ;; [106, 117) message (11 bytes) - (local.set $signature_ptr (i32.const 10)) - (local.set $pub_key_ptr (i32.const 74)) - (local.set $message_ptr (i32.const 106)) - - ;; store the input into the memory, starting at the signature and - ;; up to 107 bytes stored at offset 0 - (call $seal_input (local.get $signature_ptr) (i32.const 0)) - - ;; call sr25519_verify and store the return code - (i32.store - (i32.const 0) - (call $sr25519_verify - (local.get $signature_ptr) - (local.get $pub_key_ptr) - (i32.const 11) - (local.get $message_ptr) - ) - ) - - ;; exit with success and take transfer return code to the output buffer - (call $seal_return (i32.const 0) (i32.const 0) (i32.const 4)) - ) -) - diff --git a/substrate/frame/contracts/fixtures/data/storage_size.wat b/substrate/frame/contracts/fixtures/data/storage_size.wat deleted file mode 100644 index 728bb4fcf3c..00000000000 --- a/substrate/frame/contracts/fixtures/data/storage_size.wat +++ /dev/null @@ -1,68 +0,0 @@ -(module - (import "seal0" "seal_get_storage" (func $seal_get_storage (param i32 i32 i32) (result i32))) - (import "seal0" "seal_set_storage" (func $seal_set_storage (param i32 i32 i32))) - (import "seal0" "seal_input" (func $seal_input (param i32 i32))) - (import "env" "memory" (memory 16 16)) - - ;; [0, 32) storage key - (data (i32.const 0) "\01") - - ;; [32, 36) buffer where input is copied (expected size of storage item) - - ;; [36, 40) size of the input buffer - (data (i32.const 36) "\04") - - ;; [40, 44) size of buffer for seal_get_storage set to max - (data (i32.const 40) "\FF\FF\FF\FF") - - ;; [44, inf) seal_get_storage buffer - - (func $assert (param i32) - (block $ok - (br_if $ok - (local.get 0) - ) - (unreachable) - ) - ) - - (func (export "call") - (call $seal_input (i32.const 32) (i32.const 36)) - - ;; assert input size == 4 - (call $assert - (i32.eq - (i32.load (i32.const 36)) - (i32.const 4) - ) - ) - - ;; place a garbage value in storage, the size of which is specified by the call input. - (call $seal_set_storage - (i32.const 0) ;; Pointer to storage key - (i32.const 0) ;; Pointer to value - (i32.load (i32.const 32)) ;; Size of value - ) - - (call $assert - (i32.eq - (call $seal_get_storage - (i32.const 0) ;; Pointer to storage key - (i32.const 44) ;; buffer where to copy result - (i32.const 40) ;; pointer to size of buffer - ) - (i32.const 0) - ) - ) - - (call $assert - (i32.eq - (i32.load (i32.const 40)) - (i32.load (i32.const 32)) - ) - ) - ) - - (func (export "deploy")) - -) diff --git a/substrate/frame/contracts/fixtures/data/store_call.wat b/substrate/frame/contracts/fixtures/data/store_call.wat deleted file mode 100644 index 746b7a48b55..00000000000 --- a/substrate/frame/contracts/fixtures/data/store_call.wat +++ /dev/null @@ -1,45 +0,0 @@ -;; Stores a value of the passed size. -(module - (import "seal0" "seal_set_storage" (func $seal_set_storage (param i32 i32 i32))) - (import "seal0" "seal_input" (func $seal_input (param i32 i32))) - (import "env" "memory" (memory 16 16)) - - ;; [0, 32) storage key - (data (i32.const 0) "\01") - - ;; [32, 36) buffer where input is copied (expected size of storage item) - - ;; [36, 40) size of the input buffer - (data (i32.const 36) "\04") - - (func $assert (param i32) - (block $ok - (br_if $ok - (local.get 0) - ) - (unreachable) - ) - ) - - (func (export "call") - (call $seal_input (i32.const 32) (i32.const 36)) - - ;; assert input size == 4 - (call $assert - (i32.eq - (i32.load (i32.const 36)) - (i32.const 4) - ) - ) - - ;; place a value in storage, the size of which is specified by the call input. - ;; we don't care about the contents of the storage item - (call $seal_set_storage - (i32.const 0) ;; Pointer to storage key - (i32.const 0) ;; Pointer to value - (i32.load (i32.const 32)) ;; Size of value - ) - ) - - (func (export "deploy")) -) diff --git a/substrate/frame/contracts/fixtures/data/store_deploy.wat b/substrate/frame/contracts/fixtures/data/store_deploy.wat deleted file mode 100644 index 7f115cba977..00000000000 --- a/substrate/frame/contracts/fixtures/data/store_deploy.wat +++ /dev/null @@ -1,45 +0,0 @@ -;; Stores a value of the passed size in constructor. -(module - (import "seal0" "seal_set_storage" (func $seal_set_storage (param i32 i32 i32))) - (import "seal0" "seal_input" (func $seal_input (param i32 i32))) - (import "env" "memory" (memory 16 16)) - - ;; [0, 32) storage key - (data (i32.const 0) "\01") - - ;; [32, 36) buffer where input is copied (expected size of storage item) - - ;; [36, 40) size of the input buffer - (data (i32.const 36) "\04") - - (func $assert (param i32) - (block $ok - (br_if $ok - (local.get 0) - ) - (unreachable) - ) - ) - - (func (export "deploy") - (call $seal_input (i32.const 32) (i32.const 36)) - - ;; assert input size == 4 - (call $assert - (i32.eq - (i32.load (i32.const 36)) - (i32.const 4) - ) - ) - - ;; place a value in storage, the size of which is specified by the call input. - ;; we don't care about the contents of the storage item - (call $seal_set_storage - (i32.const 0) ;; Pointer to storage key - (i32.const 0) ;; Pointer to value - (i32.load (i32.const 32)) ;; Size of value - ) - ) - - (func (export "call")) -) diff --git a/substrate/frame/contracts/fixtures/data/transfer_return_code.wat b/substrate/frame/contracts/fixtures/data/transfer_return_code.wat deleted file mode 100644 index 50098851dcf..00000000000 --- a/substrate/frame/contracts/fixtures/data/transfer_return_code.wat +++ /dev/null @@ -1,34 +0,0 @@ -;; This transfers 100 balance to the zero account and copies the return code -;; of this transfer to the output buffer. -(module - (import "seal0" "seal_transfer" (func $seal_transfer (param i32 i32 i32 i32) (result i32))) - (import "seal0" "seal_return" (func $seal_return (param i32 i32 i32))) - (import "env" "memory" (memory 1 1)) - - ;; [0, 32) zero-adress - (data (i32.const 0) - "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00" - "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00" - ) - - ;; [32, 40) 100 balance - (data (i32.const 32) "\64\00\00\00\00\00\00\00") - - ;; [40, 44) here we store the return code of the transfer - - (func (export "deploy")) - - (func (export "call") - (i32.store - (i32.const 40) - (call $seal_transfer - (i32.const 0) ;; ptr to destination address - (i32.const 32) ;; length of destination address - (i32.const 32) ;; ptr to value to transfer - (i32.const 8) ;; length of value to transfer - ) - ) - ;; exit with success and take transfer return code to the output buffer - (call $seal_return (i32.const 0) (i32.const 40) (i32.const 4)) - ) -) diff --git a/substrate/frame/contracts/fixtures/data/xcm_execute.wat b/substrate/frame/contracts/fixtures/data/xcm_execute.wat deleted file mode 100644 index 72ef14ed82c..00000000000 --- a/substrate/frame/contracts/fixtures/data/xcm_execute.wat +++ /dev/null @@ -1,52 +0,0 @@ -;; This passes its input to `seal_xcm_execute` and returns the return value to its caller. -(module - (import "seal0" "xcm_execute" (func $xcm_execute (param i32 i32 i32) (result i32))) - (import "seal0" "seal_input" (func $seal_input (param i32 i32))) - (import "seal0" "seal_return" (func $seal_return (param i32 i32 i32))) - (import "env" "memory" (memory 1 1)) - - ;; 0x1000 = 4k in little endian - ;; Size of input buffer - (data (i32.const 0) "\00\10") - - (func $assert (param i32) - (block $ok - (br_if $ok - (local.get 0) - ) - (unreachable) - ) - ) - - (func (export "call") - ;; Receive the encoded call - (call $seal_input - (i32.const 4) ;; Pointer to the input buffer - (i32.const 0) ;; Pointer to the buffer length (before call) and to the copied data length (after call) - ) - ;; Input data layout. - ;; [0..4) - size of the call - ;; [4..) - message - - ;; Call xcm_execute with provided input. - (call $assert - (i32.eq - (call $xcm_execute - (i32.const 4) ;; Pointer where the message is stored - (i32.load (i32.const 0)) ;; Size of the message - (i32.const 100) ;; Pointer to the where the outcome is stored - ) - (i32.const 0) - ) - ) - - (call $seal_return - (i32.const 0) ;; flags - (i32.const 100) ;; Pointer to returned value - (i32.const 10) ;; length of returned value - ) - ) - - (func (export "deploy")) -) - diff --git a/substrate/frame/contracts/fixtures/data/xcm_send.wat b/substrate/frame/contracts/fixtures/data/xcm_send.wat deleted file mode 100644 index fe29ddf0f14..00000000000 --- a/substrate/frame/contracts/fixtures/data/xcm_send.wat +++ /dev/null @@ -1,59 +0,0 @@ -;; This passes its input to `seal_xcm_send` and returns the return value to its caller. -(module - (import "seal0" "xcm_send" (func $xcm_send (param i32 i32 i32 i32) (result i32))) - (import "seal0" "seal_input" (func $seal_input (param i32 i32))) - (import "seal0" "seal_return" (func $seal_return (param i32 i32 i32))) - (import "env" "memory" (memory 1 1)) - - ;; 0x1000 = 4k in little endian - ;; size of input buffer - (data (i32.const 0) "\00\10") - - (func $assert (param i32) - (block $ok - (br_if $ok - (local.get 0) - ) - (unreachable) - ) - ) - - (func (export "call") - - ;; Receive the encoded call - (call $seal_input - (i32.const 4) ;; Pointer to the input buffer - (i32.const 0) ;; Size of the length buffer - ) - - ;; Input data layout. - ;; [0..4) - size of the call - ;; [4..7) - dest - ;; [7..) - message - - ;; Call xcm_send with provided input. - (call $assert - (i32.eq - (call $xcm_send - (i32.const 4) ;; Pointer where the dest is stored - (i32.const 7) ;; Pointer where the message is stored - (i32.sub - (i32.load (i32.const 0)) ;; length of the input buffer - (i32.const 3) ;; Size of the XCM dest - ) - (i32.const 100) ;; Pointer to the where the message_id is stored - ) - (i32.const 0) - ) - ) - - ;; Return the the message_id - (call $seal_return - (i32.const 0) ;; flags - (i32.const 100) ;; Pointer to returned value - (i32.const 32) ;; length of returned value - ) - ) - - (func (export "deploy")) -) diff --git a/substrate/frame/contracts/fixtures/src/lib.rs b/substrate/frame/contracts/fixtures/src/lib.rs index fbc2647709d..4d850d75624 100644 --- a/substrate/frame/contracts/fixtures/src/lib.rs +++ b/substrate/frame/contracts/fixtures/src/lib.rs @@ -69,8 +69,7 @@ mod test { #[test] fn out_dir_should_have_compiled_mocks() { let out_dir: std::path::PathBuf = env!("OUT_DIR").into(); - let dummy_wasm = out_dir.join("dummy.wasm"); - println!("dummy_wasm: {:?}", dummy_wasm); - assert!(dummy_wasm.exists()); + assert!(out_dir.join("dummy.wasm").exists()); + assert!(out_dir.join("dummy.polkavm").exists()); } } diff --git a/substrate/frame/contracts/src/tests.rs b/substrate/frame/contracts/src/tests.rs index 4f63104ef26..28fe3c2af49 100644 --- a/substrate/frame/contracts/src/tests.rs +++ b/substrate/frame/contracts/src/tests.rs @@ -178,7 +178,7 @@ parameter_types! { pub struct TestExtension { enabled: bool, last_seen_buffer: Vec, - last_seen_inputs: (u32, u32, u32, u32), + last_seen_input_len: u32, } #[derive(Default)] @@ -201,14 +201,14 @@ impl TestExtension { TestExtensionTestValue::get().last_seen_buffer.clone() } - fn last_seen_inputs() -> (u32, u32, u32, u32) { - TestExtensionTestValue::get().last_seen_inputs + fn last_seen_input_len() -> u32 { + TestExtensionTestValue::get().last_seen_input_len } } impl Default for TestExtension { fn default() -> Self { - Self { enabled: true, last_seen_buffer: vec![], last_seen_inputs: (0, 0, 0, 0) } + Self { enabled: true, last_seen_buffer: vec![], last_seen_input_len: 0 } } } @@ -231,9 +231,7 @@ impl ChainExtension for TestExtension { }, 1 => { let env = env.only_in(); - TestExtensionTestValue::mutate(|e| { - e.last_seen_inputs = (env.val0(), env.val1(), env.val2(), env.val3()) - }); + TestExtensionTestValue::mutate(|e| e.last_seen_input_len = env.val1()); Ok(RetVal::Converging(id)) }, 2 => { @@ -2154,8 +2152,7 @@ fn chain_extension_works() { ) .result .unwrap(); - // those values passed in the fixture - assert_eq!(TestExtension::last_seen_inputs(), (4, 4, 16, 12)); + assert_eq!(TestExtension::last_seen_input_len(), 4); // 2 = charge some extra weight (amount supplied in the fifth byte) let result = Contracts::bare_call( @@ -3511,7 +3508,7 @@ fn failed_deposit_charge_should_roll_back_call() { let result = execute().unwrap(); // Bump the deposit per byte to a high value to trigger a FundsUnavailable error. - DEPOSIT_PER_BYTE.with(|c| *c.borrow_mut() = ED); + DEPOSIT_PER_BYTE.with(|c| *c.borrow_mut() = 20); assert_err_with_weight!(execute(), TokenError::FundsUnavailable, result.actual_weight); } diff --git a/substrate/frame/contracts/src/wasm/mod.rs b/substrate/frame/contracts/src/wasm/mod.rs index 4650a9bc79a..d00ec2e4752 100644 --- a/substrate/frame/contracts/src/wasm/mod.rs +++ b/substrate/frame/contracts/src/wasm/mod.rs @@ -2460,7 +2460,7 @@ mod tests { assert_eq!( result, Err(ExecError { - error: Error::::OutOfBounds.into(), + error: Error::::DecodingFailed.into(), origin: ErrorOrigin::Caller, }) ); @@ -3428,4 +3428,20 @@ mod tests { assert_eq!(delegate_dependencies.len(), 1); assert_eq!(delegate_dependencies[0].as_bytes(), [1; 32]); } + + // This test checks that [`Runtime::read_sandbox_memory_as`] works, when the decoded type has a + // max_len greater than the memory size, but the decoded data fits into the memory. + #[test] + fn read_sandbox_memory_as_works_with_max_len_out_of_bounds_but_fitting_actual_data() { + use frame_support::BoundedVec; + use sp_core::ConstU32; + + let mut ext = MockExt::default(); + let runtime = Runtime::new(&mut ext, vec![]); + let data = vec![1u8, 2, 3]; + let memory = data.encode(); + let decoded: BoundedVec> = + runtime.read_sandbox_memory_as(&memory, 0u32).unwrap(); + assert_eq!(decoded.into_inner(), data); + } } diff --git a/substrate/frame/contracts/src/wasm/runtime.rs b/substrate/frame/contracts/src/wasm/runtime.rs index 871ef05c37e..7b1e35ee1ad 100644 --- a/substrate/frame/contracts/src/wasm/runtime.rs +++ b/substrate/frame/contracts/src/wasm/runtime.rs @@ -583,9 +583,8 @@ impl<'a, E: Ext + 'a> Runtime<'a, E> { ptr: u32, ) -> Result { let ptr = ptr as usize; - let mut bound_checked = memory - .get(ptr..ptr + D::max_encoded_len() as usize) - .ok_or_else(|| Error::::OutOfBounds)?; + let mut bound_checked = memory.get(ptr..).ok_or_else(|| Error::::OutOfBounds)?; + let decoded = D::decode_with_depth_limit(MAX_DECODE_NESTING, &mut bound_checked) .map_err(|_| DispatchError::from(Error::::DecodingFailed))?; Ok(decoded) diff --git a/substrate/frame/contracts/uapi/src/host.rs b/substrate/frame/contracts/uapi/src/host.rs index 8f76b21ec9f..21350bc4eb3 100644 --- a/substrate/frame/contracts/uapi/src/host.rs +++ b/substrate/frame/contracts/uapi/src/host.rs @@ -38,6 +38,7 @@ macro_rules! hash_fn { // TODO remove cfg once used by all targets #[cfg(target_arch = "wasm32")] +#[inline(always)] fn extract_from_slice(output: &mut &mut [u8], new_len: usize) { debug_assert!(new_len <= output.len()); let tmp = core::mem::take(output); @@ -45,7 +46,8 @@ fn extract_from_slice(output: &mut &mut [u8], new_len: usize) { } #[cfg(target_arch = "wasm32")] -fn ptr_len_or_sentinel(data: &mut Option<&mut [u8]>) -> (*mut u8, u32) { +#[inline(always)] +fn ptr_len_or_sentinel(data: &mut Option<&mut &mut [u8]>) -> (*mut u8, u32) { match data { Some(ref mut data) => (data.as_mut_ptr(), data.len() as _), None => (crate::SENTINEL as _, 0), @@ -53,6 +55,7 @@ fn ptr_len_or_sentinel(data: &mut Option<&mut [u8]>) -> (*mut u8, u32) { } #[cfg(target_arch = "wasm32")] +#[inline(always)] fn ptr_or_sentinel(data: &Option<&[u8]>) -> *const u8 { match data { Some(ref data) => data.as_ptr(), @@ -132,7 +135,7 @@ pub trait HostFn { gas: u64, value: &[u8], input_data: &[u8], - output: Option<&mut [u8]>, + output: Option<&mut &mut [u8]>, ) -> Result; /// Make a call to another contract. @@ -145,7 +148,7 @@ pub trait HostFn { gas: u64, value: &[u8], input_data: &[u8], - output: Option<&mut [u8]>, + output: Option<&mut &mut [u8]>, ) -> Result; /// Call (possibly transferring some amount of funds) into the specified account. @@ -186,7 +189,7 @@ pub trait HostFn { deposit: Option<&[u8]>, value: &[u8], input_data: &[u8], - output: Option<&mut [u8]>, + output: Option<&mut &mut [u8]>, ) -> Result; /// Call into the chain extension provided by the chain if any. @@ -211,7 +214,7 @@ pub trait HostFn { /// # Return /// /// The chain extension returned value, if executed successfully. - fn call_chain_extension(func_id: u32, input: &[u8], output: Option<&mut [u8]>) -> u32; + fn call_chain_extension(func_id: u32, input: &[u8], output: Option<&mut &mut [u8]>) -> u32; /// Call some dispatchable of the runtime. /// @@ -374,7 +377,7 @@ pub trait HostFn { flags: CallFlags, code_hash: &[u8], input_data: &[u8], - output: Option<&mut [u8]>, + output: Option<&mut &mut [u8]>, ) -> Result; /// Deposit a contract event with the data buffer and optional list of topics. There is a limit @@ -485,8 +488,8 @@ pub trait HostFn { gas: u64, value: &[u8], input: &[u8], - address: Option<&mut [u8]>, - output: Option<&mut [u8]>, + address: Option<&mut &mut [u8]>, + output: Option<&mut &mut [u8]>, salt: &[u8], ) -> Result; @@ -534,8 +537,8 @@ pub trait HostFn { deposit: Option<&[u8]>, value: &[u8], input: &[u8], - address: Option<&mut [u8]>, - output: Option<&mut [u8]>, + address: Option<&mut &mut [u8]>, + output: Option<&mut &mut [u8]>, salt: &[u8], ) -> Result; diff --git a/substrate/frame/contracts/uapi/src/host/riscv32.rs b/substrate/frame/contracts/uapi/src/host/riscv32.rs index 4132768abc2..b1934cc469e 100644 --- a/substrate/frame/contracts/uapi/src/host/riscv32.rs +++ b/substrate/frame/contracts/uapi/src/host/riscv32.rs @@ -84,8 +84,8 @@ impl HostFn for HostFnImpl { gas: u64, value: &[u8], input: &[u8], - mut address: Option<&mut [u8]>, - mut output: Option<&mut [u8]>, + mut address: Option<&mut &mut [u8]>, + mut output: Option<&mut &mut [u8]>, salt: &[u8], ) -> Result { todo!() @@ -98,8 +98,8 @@ impl HostFn for HostFnImpl { deposit: Option<&[u8]>, value: &[u8], input: &[u8], - mut address: Option<&mut [u8]>, - mut output: Option<&mut [u8]>, + mut address: Option<&mut &mut [u8]>, + mut output: Option<&mut &mut [u8]>, salt: &[u8], ) -> Result { todo!() @@ -110,7 +110,7 @@ impl HostFn for HostFnImpl { gas: u64, value: &[u8], input_data: &[u8], - mut output: Option<&mut [u8]>, + mut output: Option<&mut &mut [u8]>, ) -> Result { todo!() } @@ -121,7 +121,7 @@ impl HostFn for HostFnImpl { gas: u64, value: &[u8], input_data: &[u8], - mut output: Option<&mut [u8]>, + mut output: Option<&mut &mut [u8]>, ) -> Result { todo!() } @@ -134,7 +134,7 @@ impl HostFn for HostFnImpl { deposit: Option<&[u8]>, value: &[u8], input_data: &[u8], - mut output: Option<&mut [u8]>, + mut output: Option<&mut &mut [u8]>, ) -> Result { todo!() } @@ -147,7 +147,7 @@ impl HostFn for HostFnImpl { flags: CallFlags, code_hash: &[u8], input: &[u8], - mut output: Option<&mut [u8]>, + mut output: Option<&mut &mut [u8]>, ) -> Result { todo!() } @@ -203,7 +203,7 @@ impl HostFn for HostFnImpl { todo!() } - fn call_chain_extension(func_id: u32, input: &[u8], output: Option<&mut [u8]>) -> u32 { + fn call_chain_extension(func_id: u32, input: &[u8], output: Option<&mut &mut [u8]>) -> u32 { todo!() } diff --git a/substrate/frame/contracts/uapi/src/host/wasm32.rs b/substrate/frame/contracts/uapi/src/host/wasm32.rs index 29fa1706a84..77cf22891e2 100644 --- a/substrate/frame/contracts/uapi/src/host/wasm32.rs +++ b/substrate/frame/contracts/uapi/src/host/wasm32.rs @@ -336,13 +336,14 @@ macro_rules! impl_hash_fn { } impl HostFn for HostFnImpl { + #[inline(always)] fn instantiate_v1( code_hash: &[u8], gas: u64, value: &[u8], input: &[u8], - mut address: Option<&mut [u8]>, - mut output: Option<&mut [u8]>, + mut address: Option<&mut &mut [u8]>, + mut output: Option<&mut &mut [u8]>, salt: &[u8], ) -> Result { let (address_ptr, mut address_len) = ptr_len_or_sentinel(&mut address); @@ -379,8 +380,8 @@ impl HostFn for HostFnImpl { deposit: Option<&[u8]>, value: &[u8], input: &[u8], - mut address: Option<&mut [u8]>, - mut output: Option<&mut [u8]>, + mut address: Option<&mut &mut [u8]>, + mut output: Option<&mut &mut [u8]>, salt: &[u8], ) -> Result { let (address_ptr, mut address_len) = ptr_len_or_sentinel(&mut address); @@ -418,12 +419,13 @@ impl HostFn for HostFnImpl { ret_code.into() } + #[inline(always)] fn call( callee: &[u8], gas: u64, value: &[u8], input_data: &[u8], - mut output: Option<&mut [u8]>, + mut output: Option<&mut &mut [u8]>, ) -> Result { let (output_ptr, mut output_len) = ptr_len_or_sentinel(&mut output); let ret_code = { @@ -449,13 +451,14 @@ impl HostFn for HostFnImpl { ret_code.into() } + #[inline(always)] fn call_v1( flags: CallFlags, callee: &[u8], gas: u64, value: &[u8], input_data: &[u8], - mut output: Option<&mut [u8]>, + mut output: Option<&mut &mut [u8]>, ) -> Result { let (output_ptr, mut output_len) = ptr_len_or_sentinel(&mut output); let ret_code = { @@ -488,7 +491,7 @@ impl HostFn for HostFnImpl { deposit: Option<&[u8]>, value: &[u8], input_data: &[u8], - mut output: Option<&mut [u8]>, + mut output: Option<&mut &mut [u8]>, ) -> Result { let (output_ptr, mut output_len) = ptr_len_or_sentinel(&mut output); let deposit_ptr = ptr_or_sentinel(&deposit); @@ -520,11 +523,12 @@ impl HostFn for HostFnImpl { unsafe { sys::caller_is_root() }.into_u32() } + #[inline(always)] fn delegate_call( flags: CallFlags, code_hash: &[u8], input: &[u8], - mut output: Option<&mut [u8]>, + mut output: Option<&mut &mut [u8]>, ) -> Result { let (output_ptr, mut output_len) = ptr_len_or_sentinel(&mut output); let ret_code = { @@ -602,6 +606,7 @@ impl HostFn for HostFnImpl { ret_code.into() } + #[inline(always)] fn get_storage(key: &[u8], output: &mut &mut [u8]) -> Result { let mut output_len = output.len() as u32; let ret_code = @@ -610,6 +615,7 @@ impl HostFn for HostFnImpl { ret_code.into() } + #[inline(always)] fn get_storage_v1(key: &[u8], output: &mut &mut [u8]) -> Result { let mut output_len = output.len() as u32; let ret_code = { @@ -626,6 +632,7 @@ impl HostFn for HostFnImpl { ret_code.into() } + #[inline(always)] fn take_storage(key: &[u8], output: &mut &mut [u8]) -> Result { let mut output_len = output.len() as u32; let ret_code = { @@ -665,7 +672,7 @@ impl HostFn for HostFnImpl { unsafe { sys::v1::terminate(beneficiary.as_ptr()) } } - fn call_chain_extension(func_id: u32, input: &[u8], mut output: Option<&mut [u8]>) -> u32 { + fn call_chain_extension(func_id: u32, input: &[u8], mut output: Option<&mut &mut [u8]>) -> u32 { let (output_ptr, mut output_len) = ptr_len_or_sentinel(&mut output); let ret_code = { unsafe { @@ -685,6 +692,7 @@ impl HostFn for HostFnImpl { ret_code.into_u32() } + #[inline(always)] fn input(output: &mut &mut [u8]) { let mut output_len = output.len() as u32; { @@ -707,6 +715,7 @@ impl HostFn for HostFnImpl { (v1) => [gas_left], } + #[inline(always)] fn weight_to_fee(gas: u64, output: &mut &mut [u8]) { let mut output_len = output.len() as u32; { diff --git a/substrate/frame/contracts/uapi/src/lib.rs b/substrate/frame/contracts/uapi/src/lib.rs index 99d77f504ed..83877c6efd4 100644 --- a/substrate/frame/contracts/uapi/src/lib.rs +++ b/substrate/frame/contracts/uapi/src/lib.rs @@ -36,7 +36,7 @@ macro_rules! define_error_codes { ) => { /// Every error that can be returned to a contract when it calls any of the host functions. #[derive(Debug, PartialEq, Eq)] - #[repr(u32)] + #[repr(u8)] pub enum ReturnErrorCode { /// API call successful. Success = 0, -- GitLab From 38a0ac0012c6f2dfc37b46af1b015ed3a5e296a3 Mon Sep 17 00:00:00 2001 From: Jun Jiang Date: Sat, 13 Jan 2024 16:00:52 +0800 Subject: [PATCH 162/191] Upgrade aquamarine to v0.5.0, v0.4.0 has yanked (#2921) aquamarine v0.4.0 has yanked, see https://crates.io/crates/aquamarine/0.4.0 --- Cargo.lock | 4 ++-- substrate/frame/bags-list/Cargo.toml | 2 +- substrate/frame/support/Cargo.toml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 217288702ae..0452f04908f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -333,9 +333,9 @@ dependencies = [ [[package]] name = "aquamarine" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "074b80d14d0240b6ce94d68f059a2d26a5d77280ae142662365a21ef6e2594ef" +checksum = "21cc1548309245035eb18aa7f0967da6bc65587005170c56e6ef2788a4cf3f4e" dependencies = [ "include_dir", "itertools 0.10.5", diff --git a/substrate/frame/bags-list/Cargo.toml b/substrate/frame/bags-list/Cargo.toml index 7fab47a20e1..bd0d4884b4e 100644 --- a/substrate/frame/bags-list/Cargo.toml +++ b/substrate/frame/bags-list/Cargo.toml @@ -35,7 +35,7 @@ frame-election-provider-support = { path = "../election-provider-support", defau # third party log = { version = "0.4.17", default-features = false } docify = "0.2.6" -aquamarine = { version = "0.4.0" } +aquamarine = { version = "0.5.0" } # Optional imports for benchmarking frame-benchmarking = { path = "../benchmarking", default-features = false, optional = true } diff --git a/substrate/frame/support/Cargo.toml b/substrate/frame/support/Cargo.toml index 04717c012f4..dafb86bd660 100644 --- a/substrate/frame/support/Cargo.toml +++ b/substrate/frame/support/Cargo.toml @@ -50,7 +50,7 @@ serde_json = { version = "1.0.111", default-features = false, features = ["alloc docify = "0.2.6" static_assertions = "1.1.0" -aquamarine = { version = "0.4.0" } +aquamarine = { version = "0.5.0" } [dev-dependencies] assert_matches = "1.3.0" -- GitLab From 127b9bec15f8a83964ef6049209df75da47b1479 Mon Sep 17 00:00:00 2001 From: maksimryndin Date: Sat, 13 Jan 2024 09:53:09 +0100 Subject: [PATCH 163/191] wasm-builder: bump toml from 0.8.2 to 0.8.8; replace ansi_term (#2914) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hi folks! Thank for the well organized codebase and an outstanding engineering! I am trying to compile a substrate node template from source (https://github.com/paritytech/polkadot-sdk) and encountered a dependency conflict ![Screenshot 2024-01-11 at 12 22 16](https://github.com/paritytech/polkadot-sdk/assets/16288656/b630773f-9d58-4abc-a15c-45f0e6b96b48) and a deprecation warning from advisory db for `ansi_term` (I see you replace it with some alternatives in other crates). While for `ansi_term` there is an adopted fork (https://github.com/rustadopt/ansiterm-rs) and it was my first commit in the PR, I've decided to use https://github.com/console-rs/console as you already use it to reduce dependencies (as I believe other substrate crates will remove ansi_term eventually) --------- Co-authored-by: Bastian Köcher --- Cargo.lock | 99 ++++++++++++++----- substrate/utils/wasm-builder/Cargo.toml | 4 +- .../utils/wasm-builder/src/prerequisites.rs | 11 +-- .../utils/wasm-builder/src/wasm_project.rs | 3 +- 4 files changed, 86 insertions(+), 31 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0452f04908f..b20adebf963 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2922,15 +2922,15 @@ dependencies = [ [[package]] name = "console" -version = "0.15.7" +version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c926e00cc70edefdc64d3a5ff31cc65bb97a3460097762bd23afb4d8145fccf8" +checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" dependencies = [ "encode_unicode", "lazy_static", "libc", "unicode-width", - "windows-sys 0.45.0", + "windows-sys 0.52.0", ] [[package]] @@ -9625,7 +9625,7 @@ dependencies = [ "polkavm-linker", "sp-runtime", "tempfile", - "toml 0.8.2", + "toml 0.8.8", "twox-hash", "wat", ] @@ -19632,15 +19632,15 @@ dependencies = [ name = "substrate-wasm-builder" version = "5.0.0-dev" dependencies = [ - "ansi_term", "build-helper", "cargo_metadata", + "console", "filetime", "parity-wasm", "sp-maybe-compressed-blob", "strum", "tempfile", - "toml 0.8.2", + "toml 0.8.8", "walkdir", "wasm-opt", ] @@ -20296,14 +20296,14 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.2" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" +checksum = "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.20.2", + "toml_edit 0.21.0", ] [[package]] @@ -20328,19 +20328,6 @@ dependencies = [ "winnow", ] -[[package]] -name = "toml_edit" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" -dependencies = [ - "indexmap 2.0.0", - "serde", - "serde_spanned", - "toml_datetime", - "winnow", -] - [[package]] name = "toml_edit" version = "0.21.0" @@ -20348,6 +20335,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" dependencies = [ "indexmap 2.0.0", + "serde", + "serde_spanned", "toml_datetime", "winnow", ] @@ -21710,6 +21699,15 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.0", +] + [[package]] name = "windows-targets" version = "0.42.2" @@ -21740,6 +21738,21 @@ dependencies = [ "windows_x86_64_msvc 0.48.5", ] +[[package]] +name = "windows-targets" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +dependencies = [ + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -21752,6 +21765,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" + [[package]] name = "windows_aarch64_msvc" version = "0.34.0" @@ -21770,6 +21789,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" + [[package]] name = "windows_i686_gnu" version = "0.34.0" @@ -21788,6 +21813,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +[[package]] +name = "windows_i686_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" + [[package]] name = "windows_i686_msvc" version = "0.34.0" @@ -21806,6 +21837,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_i686_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" + [[package]] name = "windows_x86_64_gnu" version = "0.34.0" @@ -21824,6 +21861,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -21836,6 +21879,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" + [[package]] name = "windows_x86_64_msvc" version = "0.34.0" @@ -21854,6 +21903,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" + [[package]] name = "winnow" version = "0.5.15" diff --git a/substrate/utils/wasm-builder/Cargo.toml b/substrate/utils/wasm-builder/Cargo.toml index 2154cfca177..ffe95994c65 100644 --- a/substrate/utils/wasm-builder/Cargo.toml +++ b/substrate/utils/wasm-builder/Cargo.toml @@ -15,12 +15,12 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -ansi_term = "0.12.1" build-helper = "0.1.1" cargo_metadata = "0.15.4" +console = "0.15.8" strum = { version = "0.24.1", features = ["derive"] } tempfile = "3.1.0" -toml = "0.8.2" +toml = "0.8.8" walkdir = "2.3.2" sp-maybe-compressed-blob = { path = "../../primitives/maybe-compressed-blob" } filetime = "0.2.16" diff --git a/substrate/utils/wasm-builder/src/prerequisites.rs b/substrate/utils/wasm-builder/src/prerequisites.rs index 2cdbdd2798e..99eb6ee1f18 100644 --- a/substrate/utils/wasm-builder/src/prerequisites.rs +++ b/substrate/utils/wasm-builder/src/prerequisites.rs @@ -17,15 +17,14 @@ use crate::{write_file_if_changed, CargoCommand, CargoCommandVersioned}; +use console::style; use std::{fs, path::Path}; - -use ansi_term::Color; use tempfile::tempdir; /// Print an error message. fn print_error_message(message: &str) -> String { if super::color_output_enabled() { - Color::Red.bold().paint(message).to_string() + style(message).red().bold().to_string() } else { message.into() } @@ -117,10 +116,10 @@ fn check_wasm_toolchain_installed( Ok(ref err) => Err(format!( "{}\n\n{}\n{}\n{}{}\n", err_msg, - Color::Yellow.bold().paint("Further error information:"), - Color::Yellow.bold().paint("-".repeat(60)), + style("Further error information:").yellow().bold(), + style("-".repeat(60)).yellow().bold(), err, - Color::Yellow.bold().paint("-".repeat(60)), + style("-".repeat(60)).yellow().bold(), )), Err(_) => Err(err_msg), diff --git a/substrate/utils/wasm-builder/src/wasm_project.rs b/substrate/utils/wasm-builder/src/wasm_project.rs index 2126a49bd7f..ded6b2188b0 100644 --- a/substrate/utils/wasm-builder/src/wasm_project.rs +++ b/substrate/utils/wasm-builder/src/wasm_project.rs @@ -19,6 +19,7 @@ use crate::{write_file_if_changed, CargoCommandVersioned, OFFLINE}; use build_helper::rerun_if_changed; use cargo_metadata::{DependencyKind, Metadata, MetadataCommand}; +use console::style; use parity_wasm::elements::{deserialize_buffer, Module}; use std::{ borrow::ToOwned, @@ -38,7 +39,7 @@ use walkdir::WalkDir; /// Returns the colorized message. fn colorize_info_message(message: &str) -> String { if super::color_output_enabled() { - ansi_term::Color::Yellow.bold().paint(message).to_string() + style(message).yellow().bold().to_string() } else { message.into() } -- GitLab From e879c484735c73cf77edf45e17fcd11665585162 Mon Sep 17 00:00:00 2001 From: Serban Iorga Date: Mon, 15 Jan 2024 11:55:27 +0100 Subject: [PATCH 164/191] Warp sync zombienet tests: update DB snapshot (#2928) Closes https://github.com/paritytech/polkadot-sdk/issues/2787 Regenerating the DB snapshot after fixing: https://github.com/paritytech/polkadot-sdk/pull/2919 Now we can add some BEEFY checks to `0002-validators-warp-sync` --- .gitlab/pipeline/zombienet/substrate.yml | 6 +++--- .../zombienet/0001-basic-warp-sync/chain-spec.json | 10 +++++----- .../test-validators-warp-sync.zndsl | 6 ++++++ 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/.gitlab/pipeline/zombienet/substrate.yml b/.gitlab/pipeline/zombienet/substrate.yml index 23630fcc6c0..8a627c454f9 100644 --- a/.gitlab/pipeline/zombienet/substrate.yml +++ b/.gitlab/pipeline/zombienet/substrate.yml @@ -47,11 +47,11 @@ extends: - .zombienet-substrate-common variables: - # DB generated from commit: https://github.com/paritytech/polkadot-sdk/commit/2e4b8996c4924fc39f85198019039cf0987f89ec + # DB generated from commit: https://github.com/paritytech/polkadot-sdk/commit/868788a5bff3ef94869bd36432726703fe3b4e96 # TODO: As a workaround for https://github.com/paritytech/polkadot-sdk/issues/2568 the DB was generated in archive mode. # After the issue is fixed, we should replace it with a pruned version of the DB. - DB_SNAPSHOT: "https://storage.googleapis.com/zombienet-db-snaps/substrate/0001-basic-warp-sync/chains-510ac1c891afe26bad6fcd6d74185917b3fb1b4f.tgz" - DB_BLOCK_HEIGHT: 47222 + DB_SNAPSHOT: "https://storage.googleapis.com/zombienet-db-snaps/substrate/0001-basic-warp-sync/chains-9677807d738b951e9f6c82e5fd15518eb0ae0419.tgz" + DB_BLOCK_HEIGHT: 56687 zombienet-substrate-0000-block-building: extends: diff --git a/substrate/zombienet/0001-basic-warp-sync/chain-spec.json b/substrate/zombienet/0001-basic-warp-sync/chain-spec.json index ab0c5bd0898..f92a968652a 100644 --- a/substrate/zombienet/0001-basic-warp-sync/chain-spec.json +++ b/substrate/zombienet/0001-basic-warp-sync/chain-spec.json @@ -3,7 +3,7 @@ "id": "local_testnet", "chainType": "Local", "bootNodes": [ - "/ip4/127.0.0.1/tcp/36639/ws/p2p/12D3KooWQCkBm1BYtkHpocxCwMgR8yjitEeHGx8spzcDLGt2gkBm" + "/ip4/127.0.0.1/tcp/44693/ws/p2p/12D3KooWQCkBm1BYtkHpocxCwMgR8yjitEeHGx8spzcDLGt2gkBm" ], "telemetryEndpoints": null, "protocolId": null, @@ -59,7 +59,7 @@ "0x26aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9f3f619a1c2956443880db9cc9a13d058e860f1b1c7227f7c22602f53f15af80747814dffd839719731ee3bba6edc126c": "0x000000000000000001000000000000000000a0dec5adc9353600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080", "0x26aa394eea5630e07c48ae0c9558cef7f9cce9c888469bb1a0dceaa129672ef8": "0x3104106e6f6465", "0x275bb9277673f20fc2801bcda9e63d2e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0x2aeddc77fe58c98d50bd37f1b90840f94e7b9012096b41c4eb3aaf947f6ea429": "0x0000", + "0x2aeddc77fe58c98d50bd37f1b90840f94e7b9012096b41c4eb3aaf947f6ea429": "0x0100", "0x2b06af9719ac64d755623cda8ddd9b944e7b9012096b41c4eb3aaf947f6ea429": "0x0100", "0x2b06af9719ac64d755623cda8ddd9b949f99a2ce711f3a31b2fc05604c93f179": "0x08d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48", "0x2c5de123c468aef7f3ac2ab3a76f87ce4e7b9012096b41c4eb3aaf947f6ea429": "0x0400", @@ -72,7 +72,7 @@ "0x3a0e22bc6b9ec8129f8b37b4779576b24e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0x3a2d6c9353500637d8f8e3e0fa0bb1c54e7b9012096b41c4eb3aaf947f6ea429": "0x0400", "0x3a2d6c9353500637d8f8e3e0fa0bb1c5ba7fb8745735dc3be2a2c61a72c39e78": "0x00", - "0x3a636f6465": "0x52bc537646db8e0528b52ffd0058f4e905beef87021a5410300c4d3af80cb5f7d3877f3b7940cf0d2f1287c7b999c7b71af4e246461b7d5599548d4040702298488e5fd3e3493c7f067db80064bfc2f3f4c3243f4d7288212f8d10013a79838636217bef4df6965bca2453dc1e7417711899fe1cab8054a7d56f2233fd397ad0997e8f40da69a598e72f7918f6d8e1522b77efddf2cbded35bd26fa779bf44bd5bd65cd6c7a2d97e8f40ba5ff230ec5188c565cdf6bff76ef9d97b7acbb22ce9b7d34a12b2f7edb4124af6be9d569e90bd6fa779bf44eded4c6fe7ef56dd327def9642b97e38457b3bd3dbb9472235d35ff225ef6e15cdf4eb6da7cdef1108c5d569f3977cc9977cc9977cc9bbc8311599fb869637690c61d89d83002e6d9cd6b99dd6df2390eab4fe256fa1b01d09113507460b104916244420a101490d48b8209900121b90e880e406245a90f480c40b922090fc800408105070240d109c40f2054917244220e1010916242e801007841420d90282991b085120c901090e204071048a2320386206840f1c89e28814487c3842c491228ee860240447b41ce172a487233c1829e2481723143832c4111f8e803182869123a4663802c3911d8efc70248623588ec870648622671851c1481c292b8cac60a48a112a4658905263648ad416524448a529720223664871c0081c29278c0851440d290d4859400a8b5405a4c248252125462a06a90d482921b584d418a926a46c9022436a0c292c8ec091d2e2480a52203892938ae2880a5254489d40aacc9115a43e70040529111c6141aa0aa92e8e48919a420a055221904a819414525c48ad2105c5112a524f48c5914223e5c5912d290f1c992265e64815a933526ba4c8485d2155841120a46e9042422a8b23491c41e2c81147c41ca9c09130488a301284940e525aa47290da62e48d940b45e018a941aa062930475e3872c5c809a4ba8ca0400a03463660640d2324305202292b473060440d236918a98054068c98a0081a52341cc1c1c80c46ce30f2c508155270a4c090ba8014135223286202235b462c602409234a184102490b485e383201235348652992c6911c8c0c11c508d7910b48c9307f288282226b489d51e4cb91101cd9728402478038c244111ea4de18d18011334526204502a91248a9216586541a524748e1f0810e1fd8f0010d1f54f94085a8353e48e183dc0728449d20ea4d541a5170a2d0887213654614185161448d208a8b282ca2ba885213b54554165157444911a545549a2834515d511888ba401413514b44291195449498280b44d51085258a88282e513244fd10e543140d5140441511d525ca4bd40b513344658972216a02514344e110f5250a09a733a25a8812224a0bd418506ea0c8802a03ea0ba82ba0ac80d2022a0d14135016804a024a0c14125015803a022a0c94115059a06a80a2016a06282c503240c5000503d415a817a05c806a014a08a820a08080f202d505ea07281fa0b840f500c503d404a0b640ed00a503540e505d504d4071417d815a024a09a815a03a0045064a0b140e503740d90055041411501c80da009406a0c6406500ca0928159ed6784ac193194f267842c1d3194f27787af3548227123c3df124c6939aa72a9eb678cae229044f523c41f1a4c513164f1c7822f3d4c49399a7289eba78e2e2298927249ec43c31f174c313d7130e4f3c3cf5f03481a7219ebe3c51f1b4839318a7319cc87012c3a98d53184e669cc0700a81d31927103861e1248513154e1f70f2805307260c53874901a70d3871c0c909a70c387571b28013979317a7179cae0c59630809869031048b21590cd162089a21658688604815439c1892012734864c60c896215886c430e48521568654698a3324370485a6143c4df174a6898ca6334d633491a0a98aa61134b1699aa2098ca6364d5a3471d1f44553089aa4685ad394a6494dd3154d5e3465d184a6698b261134b969b2a2a98c26319aba68a2a2c98c262c9ac26802a22988a61c9a5a68a2a1c985262c4d579a5e68aaa1c98a076c3c58c2831378d001214608a9801022848c1102468818214208e9125284102784700959420810429810f24548134228200403427e109284902084202164082117101246480684f8204409215d841c21c48b100b08d180101784c8e084849017829820081a41e0043923c89b20630421030241c4081246103082b0b161b1d560a3c196c53603931a52463091c154c6056608e00b06390c5840d2e2821200b9b9200c0ca65c80820bd0b8200da22f17c4c1a00a065b179c806905a52d18a4104ba3a703240f179cf193010cac3049a0870348634085d141194c3108bdd001063a70a2032590c4000283080c5019486000b121a2c00660845810da62c241088b504ea8850da8cce26c40c40d1a6626b0c1b9a105e90c1b163e636ee8c081161c6c4144848e25846418b2011e208886c845642384a4200485250c2c31b1a4c492180eb878ca00076a8c7010e6f6e054c606650c49d9c00c0e88b8376cc0c4061dd8c08d13955a151b7031dd406484100c348d0d80604a934403d21add0e1a64a181161e7ce183020dccfc502133b0f3c40e14482910aaa201056a53ccb40c9161480590a810009700841000172aa02a04e0c2cf163dd8e44022471039c4905f7ce0e44862e70c8e24845c18c2854482191a4a3efc30c123c48c4b69859e3637b06850463e02680dd30c3c9a506241001498a500488d4f0680bec8c106488c190a36a8005018b333c822482e9b0988b8fcac305b4303373c52927c087202a1187accf87182a807a1157430415404d0183960c8617058408705341862a7072137ecf080b4c50e1721597626b0e383101b84a610b5c100060c5ac0400218ac80810a1850c1400a06285c90820bd6b8408d0be05c60820bde5c30c6052478aa72011917b421dae1022fe6179e106c7001210de468c3630608173b34b083cc8f313f36b02303433f0cf9b063033bc6ece8dac10123617a6c71e4cb094257788ab8008ca72598ac0849d1c088212798a5c16466489a214f0c89228718b510ccd4d09104d311b313085901b226a9890d309004469213443c200581248491979a144340f80a1e64e18116d7870a66b83fdc2d1707a41e765ce0da9053c35006728c91038d1c6018e99023430e161e321b70d9a0871d47f440f333a60336af868703394690034e8d0a272943d8f0049123034376c841258714a434922490e34b0e2190da2095c103821c5bb13631326261c4c440aac2070d1c4ae0c881848194e10615ff222a8e8be1a30157b3a3650706ae0e1f48b901450f181d0ae80ca10346e78b0ed70d2e9d1c6e7cb921036de1d290230c1e28789ea056762cd1c1183b94d860090e86e040881c1a84c6f044c1c117a10c70d0c5e98a11dac0d5722770bf5c36170c0ebc383dc101180e7eb86a88a8b85b105971bb204273b92012c1f582688abbe66a41740551151708273417090e82e000080eb86e059eaeb849dc301c50e01ee10485900a40d834d9d0340354099a70982e409db1c1970b6eb88086f7c2084c53960d50403483ed061b0e4e55107911c5e55426071943343063e2c90dd1046e0e97cb065d426478a4b83cdc2c4363807421d401a127862630b4656887211e867418e232d483d00784a0b83b087140a80c101a3b62e021622704443f0c9901c8044a2a10e9909150da220a62c818242b74e440e44307636edcd0c1123e39a411107921128264a2078c1e374c3d901460c2c2544647134c5c76ca107131e930a40d93160eb0600a418f05989000228369cb05653055210407a6304c572071c154012157986a601202a90b26313d2660ea62c2401215a6313b6498984082c394c34e0798ba208980c906a62590d2308161dac00d1c98a440f24287991997190fb32d331d82d60471c1d401261f80daf494c18426c90aa01130ed902402a02d80ac904121cbfdc4013a23c3800749e4d8908343ce0d395a3cb0802c043e5bb2257ca09011d1b3852c099f2e3f61f46021bbc1470559971e2b645d3e1390a1d02385ac081f2f3f6d7cccc85af0a942a6824f086432f81821fbc1a7cd0f097c58f859c3c70619191f0fc834e0634516838f143f27f0b1806c8b0f1719959f1b7ecef0e941c6811e2d6446f8842113e3834566c5a7851f337c6a9039e153c40f193f36c880f0b9806c033e42c858e8e942c6840f18590d3e67644df80cf13386cf0b3f6c7aa6f8f1c2e707190c3d6b642ff874c93ee0f34556c68703320ff8c420cbe2c384ac071f2ab2ad1e2e7ec4f03942e6c24f0d32217caac824e073e5c78dcf086438f8949175c0e70b19057cc09079e9b94236011f0afc80e1030219169f0ac852f009239be22386ac8a8f0464637c7490cdd0a3468684cf123f26e8492353c207899f14f8d020cbc107881f357cd8c82ce0d301190f3e3efc7ce1a3e5270d9f0fc8b4f49cf941a3270b59057c64f881e3b3453684cf0ab2237ca29081f181e167043e63c8b87c9e90d1e093c4cf1b1f1e6441f8b8f083021f256419f8c922fbe24384cc071f1c6436f4a0915df1d9e1a70c9f29642bf8dc200be393e5a7043e33c8b8f8e42093e28301d90e3e64643af850f1b3c6478cec02b22780d2005d019405101632105c216e105163c8a4780281141a469e907a414a0246402035841129a4603072c6881146a0f8c962881717d8f0e381282b724c893ae247ca4f0a3f28fce47ce2f8a4400815d76267033e5c43aef49cd123468e147ac2182201a3208c86e81181d11723341889c2c816479630124208961b597ac4f420b183099e293a2083a70a1e2a7abe3cc1e139f344c6066a209d8009881d0ee800c1c365c70b4f186002811117d30f4c4dec90b1d38674a176a95e84a880648690ad1a0884d4c014844e1033384f609250d02943670c1d0d448189ea014a8c9c38395b72509033819c1972aab85fe40c01c40ba92b395c522dc4a600a226e70a236d72c07c30c3d318461400b2c590970fa8d4ce001901921a2e820e68b8200b1906c81717d4101b432805a119c82c640d3533640c445af8190104419403121aa22d3762b86183530b73889c188068416403531243a0b069f1034cce0b4c17e879c3e42566c68d2090beb065c1a482072388a131840231384d5a86c01073d341134c2ef0a4102be3c98ba6294c30109519c244531a437288da01c90443b2e4886188195125d0c08c0d841802c4d30f485734498029cb4f144f2af4b04152c3d303141743a8f48c207682a81c784c80c788271f86b090a3081fa323448f17405c08a912448d1e0f084940833186681962c68646930e3f668674c1f4e5894ad2147762c8123766806a63bb22c905f202b11230f100e4c5101d925a8891a0a94ad41a261a868c8184051397901d84ccc0e4449417e40e3b39100141d48507051d5d8e262a033113245511a282f48627c77486a985242b3d2948522107101a9091b4958405898c242d4d37f8ac31a485a41b76ba24a5d0242547981c46e4a840130a34e04208057a0654163a74f00c20adb1a5e941a3830d30158194c5930490dc749081a715989e807aa30109a228d0f385075b0c7121c71149599c4ec0044507669272c0e005243482a4310487a41938c8c20335495784d000d405062e0c59e3411c1d5ae8c842871a1d585ce0e6860f740ca7349844107b938388a69c93113c96b09dd14425a646d20b49316050c48d1a62675c2046558162a12ed017e815aa434581ce50733406ba434d81c240b7c8ced4192a962ac30d21a28248927283872416a0d4dcf8016a8b1b3ddc00e2c6961b13e0b1c2b495944342c15317cf0f486c926a400aa3c680540227227ac8e45cc971c1a6c6b6c50d2f37ba78c0856d4d920c493830b1c0f401a6179e28f05444120c4f44f07879fac053194c5124d990b482d3114f6372a87063872811447d7123072717a274b8c145c70b139927359ed2b091c3d31aa4384c5344a9e194844e971b436ce0c30e123b66e051030f1b7864f9a1e107d78f217e5060a78b1d2f76d6f4b8a2479a1d3eece8b2e307b20cd20cd24d8e04725ac8b1b2810d1be0b0c10d3f6af881430e3439acc821020d84d0804b832f3fc4f8e1e6b9fc0fefc3062b6c20810d58e01982070c0f1d786ce1b1c38f2c3f6ef861c353f168be8a9f323f50fc3c81030d0e2b70886047103bbeec1082c7023c4bf02881a3061c36e0c8f26c3e8c07c307133e30e0e30236a2b001021b667a98e8c140cf05707cc141011c5c194e5623a3914f90d3c0a0070c7cc0800b8f303c2ac0e3081b706ca861238d222f45411401a1810634e080061bd859a289871d267e34f123033f9c50ca416907251d7e8597c0b3603bc28684ad024a46281da11466480f3b67eca0b163021f60f810c347181a5ca101161aa4c1b1058e2e707081a303383e80c303368468fa62e34b075d3a00a2032f1d8ca0832b3ab0e247183fcaf8d1e607193fc6e860ab03163a5841c711432ea0a30249522485402905a5294a52ee0a570297851e59fc74e55863a3c256856d0a1b49d850c286057652a043029d12e0a8c09033701c5144435196a21a9c2ac03401262b98ae306980490926199828c0440513114c16601a8229034c58307980c908260e3c5d000a8b27189ad678daf2e484a3c047e05d38167e8567116584a771309cc278144e859b71103815e14f384d7122e317702bbccb9bf8608aabe0557c6bbe711422e053260a669cb986e7660a261ab3049ec23c63aa314f30d398269842389933cc29e60e938a999b58e698a981b981d9354330939817981898344c1ee6959965d630659852cc32f303b809a604ab26501a3082082130406a8992240b48c0019080706466e0c9b634a42948063263e0c1a4818f1e938bfc219cb9e703f1723a75b5840149a02c99222149927052119c4c2549022625d1722234616202036646717a0a6bc9945508428a8c5220c29310a644b0618482be7ac014d5d503a69c0c708dd668ab29ac2b26234c59259962c00396947082202335fa6a4a84274e4e60524292ac292b283f4669f49509584bb0aeaea6aea69c9cc0044a6604a7afaea69a0c19a1d13b4626e8331ab064aa498fd19bb62aa18412a0624625c06144829a91198d3575e5a6af985c3da00153530c68c0d494cdc7a80c212332a6b0ae1e703546094fb0ae4c68d35358263080891516d6921c2331a69a34791282cc288c6e0001462330948cd83469b22484264d96743082be9acab29aba9ab24a823535820da32fda8bb67ad28024574ea6a89e6025c10a61c9095349a64260620525c914d613274f3aa819ad21016b0427534dbae8a9a90624798295048b8411984c39e0c8888bbe6ac26409d6940849a6a61a6064b4453f69801326491e6035654255122650329693a9121eb024ea8dd4f4d4085af494084f424822c292274da09890454f612d6182e56409d695132632232cba4993252184b0c40acbc9930e728cd2f4d515d6d4d5550e32baa2a74270f2c4499225213879428010f29091154ca0e4075c31617a40be46220880119a22a32afa8429273a4654f4144d42084fa04ccd8cceb4950923306980932721246102254f316089adc728048de5c484272124991a61099424575653544bb0ae925c2db19ac24652f412ac27265425b972928409943c821326544bb00c206404827e8295c44c4f85e0644993250c48f2042bc9159613264f8a8ca2e82b11ac963860ca2ac9084e9888e0640a4a122650f25593274fa29c3029e10901b011140d8509095756534e1cf024c903a6a88c8c9e6811a69c8cc0e4ca8909584b427892c5c484aaa92458564fa04c59f5302ad32230498235756565420840461fe8ab2926584cac9e908065c2922423246102252f81228293255642888c3cd00e6002255b4d51593d3942e41a75a00d20556444a6a7a64c9832e18322224c8d30c29222161871a0afa842982221840df415969329ab29129c3079230d3861d28099d1980e81c99513265658274c2579401328509624b19a12a10913136c54213c69621332ca405f051939d14b92081935d125245982b544842558535039465d1060d26409132c264e98f41861a0a94278d2840149a6b04c0861ea84291da30bb4d5930ec49e534d18b004cb89090d488215c2941513119c30499204c8031d33bcae2bba88c9ad1576572e97a71605b26417b2cb8432bd2a34341312229a753321a24e88244592ec194799ac671c67e3d2d2d06c68886826349b117544d6daa6149cd65a4bbfb6d6ebda75b603bbed8c815d8e570ce8158bc562d52dd84020d8fd81df676de71ff8596bedbde36cdb54a7d25ab18f3b9011add5edd75dfdb3eeb65a6aed4749a71e250682b6a9d7afada59456ec76faf87413b49df5cfc7a7da39bfeebaee4647a9b56d5fdf4b00d6be6c37ad9d9ded3a6b6747e7e79f9d5dd7f9581fdb75734edb59d04e3badb5b37ad74a2d3867db6eda55dad66777dbaeadaddeb6bbc3ef7bfd7c1f6d4b3af50a7e5e2b58ab06d5db67e398fd51a01abe7bd4bd57add6fbbc92d529bd21d93ad411e8a1deb19d6d5b9d4eb76137a7b536ecacedeeac7f6d29ec735badd5f9aca53bbc3ab5ddb6765e2bb5edd46db7a5d59d524adda9b594765b4a7b6cdb766aadb594fa4f7fd6d6b6d49d7e5f75daf6d56e1b020fa8b55677ff28eddcbdfa095d9d75d2cf0175ce59bdceecccb6b53ddd61ed3dddbbadb54d41af1ed4594e4dc0baeadab579e88e0daf3672603098d5e4c9b11366a3bb3f4abf2f2787030e68b45a8360412f4ac1a0201d3abac85f4141eea1c37a76bb37ddcee9cdd03b0c3bec0e1b47d8dd1d76bbc3a6bb7fdeed74cef9757b87cdc3636367a78816d1a2a200c0603930182dcad9e931001b7600393b393b7a7a603d33b6e3a5d44a4de7dc60ce0d6aa5f47b7dd3bb5f95c76bb5b6baadb576add56b5ba72f9a9d3939dff7edecec74b4ca7693fe50f7ef03419fb3ead40ae5899312bc7aed9c39c31ad2d7f7a2b356779d8f7eb4564a7dd420774a015041132afaaab4a494c98b7eeedf0dfa53756a53a74e93ba52db1dd5ea3ea7d7170995eeb8fba4b58215f45a7dc8bd52dac19cc268b5d64ab6db5a6975fbe347f5eef1dadd64ad95d25a29a5d569ad74844a69252b59c91e9fd5a73b0fffbc01d3bb9a0324c129074110b4d682d66141d577babbaed66ac13727add5bb5a58d7d7d1740f6bfdbe76afb6daafceb65d6bf774f7cf1dac3cced3d6456f5815c176f7ec10aa3b0c66ab57fa39037a090c96a3545dc9ac14569de6395e679d496addddaf6eeab1179e7501b59ba7bac3aadb5a3baf7e747a6edbbd5a2ba5b6d6aed57aa5f6f57abd5eb1e93ee7f7f297c762fe7ab9bf1cb41d383b5b6ded5a6d7bed9ebbcfb62f6f874d1b4ebbd2a60af04aa90e1f5f10ed9eddfef2def176ffba6df5eeb676daae7e7302a01a191919d5ce76d63bb74d29ad3401df473f0b3e2a80ef45bf9c1edf475fb66953ef1e770c003a79c410406b8d595b3beade55fa51ead63fafd66ba5d646eddaf5a3947aa5dfecaac37cce0354efdee9ea48fcebbcabb556aff6f3cf29fdbecf5afb555a6ba59552fa514abd27a882d0ddd63ab5dfcb8f7c3fdf0fa594ba03e9fc586fdb4d18acbbd657ada03aad5ebdbe6a4deae9ead378d6e95d7767bbeeae9b9db7bb4fea6ebd565b2b9d75c260eed37d5277eff65aab75b7b6bbed7c79fed9ee9e73ba775bf7b66dddbfe973ceeeee9edeeddddef36bf73a678dbdbadbbe62edb34e6addddce7e35d5d1a1fef2fad1afd64a3f4b69db5aa9b5356abfb6d6b63b7de9b8c36036697a0068051564f0caa076d74642fa26adfe49bd5e377ebca98ece0dff3172e3c64ba70ed5eef66f4eeb0e6b6b4183b4d26aadb757eff69d39bfaf52fa35ed3afa7d9876dd1da5b5564abbdaeee96da9adb488016cd73a6b75ebeed6daf6eeea5ead7bf7ec6e9fedd6d297cfcea75b771ef7ae5ea9d759ab3bedd9d3b67bbbdbae6bdbd6d6eaee94d2eeeef6ae757a75ef59809a53dddd6b7b77bb7ba5b5db5aeb6eddbdba7badd5ab579dafd6eaddd3daaeab5dcc765fedb6b6adb5b5f6071fc500039d99c3467dd4daefabfd59b79db54408603b9b2306f5e494a3b35d0c8876b60eb14d94526abdadb5d6924edb7a95d217ad94b67dc19c56cfbdadedaa77dbce5aebd5dd76de8d84082446d09ff607583d2961aa042b9b723255c214d612ac2b0084bd632a6baa4992139694606384274d928ce084c908233c6902844193264ca8943c3012421b9146231e119a3021218424584d4c58d28029118e78de1d30e564ca0a473d614a04274c705c7023c8084caeeed103a6a89284c0a409034c8042b3bac221f60557575356504a78124212aba9ac27214c59eda0aa05e00228214c5df1b8e0860076042000178880c3076b89d59493a911922cb9122184a9244fb0a03cc02a841b401af0e4891594240f680013aba9ac0a984498b29a12c1ea49925a002e9862628555c12ca17bc79455034278d2a4c912211c504a58827535550213acbf0c30e1ea289c9aba4a52c213119c2cb1c23d57b40e6836119c2c493265b5044a094f32209b2c09e149930ac227584b4460d2644956922b26499c30594242080d68c0931b19d486884e78e2002ca225245c11512d09218429aa5a002e78d9053b925c3045b5a40903928ce0840909574b48f8a91298603931c10a7f8f066099305482094e84fe842912926039616205254908574c4ab05a827565c4730574d4173c7962154415c212063469f2c4aa82bc64ca2ae801535449b04e98724274b1a64600925d615d3139614ac8eb1d4e9e30c10a61c9959325565849b0989450c213dad8179cc0a401535650f05b2d996a12c22ccbc914e5e91d499c3c6172653595954404275350a02c493235c212ab27585749b04e9812ca7232457be86471ad899b4aa2cc28534b54d222c569e1604a5a4b4bebb3d66a85394a5a2b54d25a53eba6456f5a5589d6dc8985b84a9534ae6a511c0ea7e538ad8aa34a70530be72f9ce3b4b43c255a13a785036f5a382dda381c0e87c3e17038ad899b8dc3bd94344e4b8b2ac1e1a656a7e4366f37af4aa2cc28515c49e370389c969696d6c44d25ada5f529d19a382daaa4713857d29da7a4b570381c0ea7a55595e0260ee74a70ad446b5aad4e49b712ad4995b49696965655d25a5aae446b6a4d25ad3595e05e556677cf12ae967499feeccaf4edfd6e96e7faa1fb6ca4d7dbeeedadbae5fa5f39e7fd597e54ee7db8acf9fb79a9bf70f97dffa4b9bcd2cafdeee120fdb5622afa1453f53baebae592e67e1b27f4a7ef6d2687216bcec965f6a7df45e5d795ebd33bab90e50726d7ef9f479035975f2ed7a7e507e6ebcab4761dadb5565a3d00fd73f42e1ba664ff2c6b64ff2a667a27ad5de723905abbda35d5aeabd5695d144ecb092715d27377657193e7378c521ef56e555b7d7a8b90b64a29ae8ae52eb5e991bb8ba06d8ee8b4eab47e9e300b099e0ad93f3fec5bf398a5131bb3d83eba1b3612a9b95cee9ffd2d02b1fadebd18e5eadd49f6ebcfebbdbd6390f9fd60fbf0f07f33a7f9decff7f07c304f0c761215bbb0fde7ad4e73fb5e7792ed07472221063bc9672edb5b7ed9bf3bc91d856c942ba677666fba1366f27c9cbb194e1f9fc4f73b5fbc542ec47ffe7ce7427657163519fc34623298c50f432ace51c8f7afa70a1ffcd06f09de5953cde5f2f835d3dc631399cbe3fb9db93cfe92bb187627c5be7bbfb08fddd2eb18c41f86e9fb18c49ffc254ade99933fecfd61f8ce9cc0ec0f66c7419d443d92f2681b7d8f3d4c7c6f240266f183da07fd6e2432eb24fa220e82c1eecce51e85cc5c979c5f7292f2c8c1315c7ed93e953ff8a57f3f6961000441d0e71864be7b933f4805eb24fab14ea2b95cb5c89a43218f1fbec211c7be3be935c61e269634870f0b1fcb66d878ad6031f1973c263e2c1cc57f8522ee460af1eb977cc9fbfddbe7b7cdf130e9348b71ee300f6e6ac1dcd3124e2a64cddd95a503930ad9e5eeca322677120ecff33ccff3bcef22af8c70ba77f3735af7b3fbbe130ab27ed7fdd83e80f877dd8beda3fb2eead8ececece87cce931ffb9d9d9d9d9d3062b118ecc7173ffc582c168b69118621e87d18866178266cefc3eeeeee9eedde153bc9fb79e713a4f5de7bb17df87bdefbf53a10766f7129fad71ba4fcf205bffb72667f286006b113d06f89cbf5f52155133077d809e8f9f5e52b0b97dce5d7eb7b2462f30bb7d3ca2abe3a7f51f1d575d8cb2ffbf77e7deab01fd6f965fbd569d6fdbbab86354edd951d974bd93f7c89dde574df5db9bb6a5893bb9bc88eabd3acf56ed944cc5d07a4e26f5635c2ae23bdf685dd6daa1f765d776bf775aa603f9c0ee4f5f67d04b244ede5995d58b366aeddad1d48359f3efd25afb8c4caf5e7ed6e29e6eec335397c9a3d876fefccb3a686e24a0ebfcb35f7d8e4b1c921eea9a3f4ee43176df7614f6f0aeba9a3a3f5361173bd33274a956978336fe7d755ca0fde99e768bb3b5520e7f3380dbcdebfeef7f3da9f63d5f7e1c6157fa558d7089bbcaf1fd65b6ae5faf57af5bd25afdfeb97bcde99bfb7ff2ab5b2fd6ae8795f6fd6cc9ee77de8fe9d3442d5ef7ec9bf5befd7f2f5d3be5eef7dfdbeef3f5cbe7e7ecd55b7ec9dab7f15cd5e270e5d6377567f7e7dbfb3fafede87f57ab0e4fd0c5d9c63107fef6b93bfe77dd58c638525e62a0ef2ecb1094a9392fcfdd7efddf27baafade87df2d6bae4f5fd8aaaadde472194b277f4f2996983f2250c06b55c541f64eaa8f6533f8a5e7faaf6b053e96cddff7e89424bf7ec9bf5b65a38a833c3ba97e38c5d7ebebbf703752f53148f7f5e708c4e27abfef4eebb4ceaae24feb9b9e98b0bb1cf16937c7d905e931b630d664dfbe15bf131f14fff520785f97bc376be679b366b6f3da0fbd677b854dfc9dd4bfe4f652d97f915e0bbdd8cc618f40dae6904e035f298b3f4720f3963353d97f79f73b4929f78797745a7fd973b2ffc231f0bbaf2ffe1ce794ef412c735abf88dbfe7ce1522bbf5ebcf38ab704ff05e2b266f0c39f977a39b3f8e5102d0ce46e241197e0d3f056ddc0db9948cdb48ae68903499f14fd760eed2dbb9fffddd9c455337bd8821c4ef1bb49d9bb424eebb7b79cf36d0a613b8ff6a3c9e3f3a3f9a58cfcf6f19d34bf5fc86b3c7e34df9f0749387fde114875da7ca7d5cff63f1fdbe654a7e1128be6f9afe7f15ae8851e08e212fcd7839ee8350f7cfaa177670ec1dbe2cf514851ae4e7bbd773b8b178b66f0c3e93d29ac9dd6793ecd6b484279fec4a50de99cf6767edd8f833871e2e4ef627579f264b7b83c21dbef5b7eb9bfb639ed34efdf691eeedbe5cc55334e9c387172a995fbedc5a2b97f8a1d269df6b47a3b0b79ed337da4f64133fda20cce8e4b385120fb7978c2345c3208b60f1f60eea9a3fc72699b879d47f497d254a035584a13a675742e6d0ef3c4252e67791ec16ae6f92f1e900c45f11bb32aacecae2b7ac855b13c9f7eac7d340a327d3b35e84c4bcfa515bb7dccdc2c829c1fce719e21fd971c8a5c8f01525573b95653c57469ec9a9e1a4c366972bf4f1e6deb07a70635977b0cd269f2fcb0bdeffb3eebdf47674783cdf7a484ed944269993a74c821c4b226cf3c7fc97d56cd4c7fc610763fa59054dd1be5b2ebdc5d34a4c9de79aa7d5829e52efd5afdc5cfefc6164fa99264b3bfb5639b3cb97e10122ac8b249ee5e29973cb96c2f3e68db14fb735a715a7d0790e5b492eb97ed45ae7feb27e9d1195a90d80109306a72399bfdf9f6b66dde5c15c2851e52e08109db942a49b6f95b3bb62955dce6fdd6006cf3eddd1a80edc65564fe2d8a1ed59f666e5c45963c7ce32a627fe2db63a5cfe597cbeeea9a5fb69936810a1de8328615416c21c56bcd5086091d7468024d1125b0b5ad7f2cf2b99c6d5af19a5176af3b840f20e9510f0d65b250ee2e1a28909572d58a756d02eb3be93525c5b35b932bee6c7d0f3bb198aa0976f2f64b8acb5bae3fdf3ebdf57b24d2505cc91677f9befb1297cbee5235e935d9fbce49437125775f42205b0f3be935b9fbf2962d2ee753271b4ce9ca1dee1205a7a30a277454e1042e4fc8f4e7edaf07d05185135da2e07a8dedf55d45e3c4c95d72432df880658b158e2d4390c96141e935b94b4e47154ee4b23698d27542aea1b862eb2f2190bb147a8ded8573bdc6d65fde7287cba941b78eb2bbb07c91b166ee92f3c982082960e472b6c651701fcef5975eabb88492c722395b64f1430aa640ed648a1be75a9d5b21c22e2ae795a63c5e5f92b9ff41dbd90e2c629b1e755cf45fffb93ef8df1709fff5161701ffab21be85ff7d01daf6eabeb39dedc0db831ed50f2fade991f7afab448f6a0f3a3b40f8df1701ff05bec54542fb2106c1aac8f720be79809b1e755f80b64559b0d1e48ab9e8b7edf55fabc9f5af9b5c7f6e79adec362778ad9c5bd30a14ac359acc2b55abba978299af7e9ff75fd7b6afebbaeefb0ef0fa0fdfb8ba7f61193daa0568db5befdbf67db76d39dee5a2af94917a907952cae0079219ea1d0b611795ade6a33c5eb4ebba2eecd06f5cdde3c07fd18ed6ef7b03ccaffbb0bbf37bf45e97bc1f3d8aca16fc727d3a02f1d76d9b779bc24c3f9c6313999d042f177daf55ecb1ebdcbabb77b7d40abbd78dc2d53deefb97b594feebc3afebdebeed6c675ff7e9517df0cae85195e5fa16c89501c07fe128af07df48db5e98abfb02a8c0810dc4347a545f891ed5ff3a242220dbf6bd0a1cd85eff7aef75db9693a9ffe5a2b4bb727d10bc56fef0c06b65a349c0125397f9d16a72dfc051adea1f11f5bb7d4ceab52eac6513fadddbb08ab37d78ee0fc31ace9a4aad1db27def3d5c6a01912db6faecbd56eeb109cc1e764ac4fb0e97f63ddce5f57e4badecdd28a47397adb7bd30ee7baeeeed4884bec565541d81f82fd18e0bccf4c7a6971399292e7d0c32b37fe8ed93c24a23b93b69ca60a6d6aff56b8d014dae33d7faa18b738e377289cbb47e17554ca554db849486b9bb62b8426390e21605b48353bb1a762e9cb12418bdf04ea45e16f495bb0b8629e827526fa49f48e76c18c4649abb0b0629ba2f0c64727b1fac3b494a3726d6d30ab2bb5e38933b77f60fa9d8b9a190b95c0e05db746a34e8cf11887f8f4468d9dbc7ccfd57dc64a34ced6c1f1d91fa1497f44d90652c995555c7c9fe585eb61fd2d129d654fd762795f4bf0fad58db87775f85d0f768397349bfbe77674eddfb3ba6aadf7db6a39351ee7077127d7a3fa74d27b44c671d9d1a8d4cdfaf135aa6787692bf1d81d09f23115aa6b83bc9f1e7cd0a266c0f63f6bba8ecaeec34af75970b6b1a4c9e2311faf3e708a47fde59ff9c2890e5f7f05a29947bfc40721ed3d65d3070c9fe455ee3726699d3fcfdbd4b739a1739cdbbcb737b945d9992bbeb8537b9ec91fd8535b907e551e440ca99e9fb08a4c869fe4ef32af2b37fee2e9a44f824ece6416903a9df37abe6fe7a9bc8dc4f69537a3b7b00a65821f4b1bb977cba0b645c0686fae4ee72e186ea82954eac2390adcce3b4da5f472055334eaea390f9593aef8482ecae16d6c80e9651d6d0e664e189f3b660a66d57a9cff6601d96b08baa7fd3ffeec37a6ffdb20af9a4ece3522bd3c7d9e8080404ef2dbe69d96ef4dd46bd7bd3b2cdeadf9487fd128be68a3b5c9de6cf84ec22385b15ae2a0e72f7d3562fc5e5ccf5bb5bd25cdf5eef9768bd9dbdebb61e8b50dbec6c6fdbaaf3f86cfe2299fb06ceb5aa3b1324d4ef84bc864533fd7277b1686e9ab95c2e97e7d78b456b9e5feb9c5484fd947e38bbee29ed6e8bf45291def95a3ebdca0be47c1a50d853046477b5d095bbdc5d56d4e4d619332bfe7017d1134205904e8b85738aec718856ae556b4e26253a4832260c8d79fb3b7eaac655b8dc5ffacfc6edb426bbc29e1e20bbcbca98dc5d56b8e43296eb5b90bb4b0270720d678f4f5ab99d56d6ac95674847209d8f4f5a59b4dddf2a6466fb796d166466fb167f797e57dd875001936a7e49dfe7451266ce0e12f694986b0e63f61dd3af9df5f7da2c883f7d6abf7b2a6ab315f3922fb9d69c934cd8536418b3529fb426fe9c56bf7e184340152ed79e793e03c2761aa37e912c41565ae954d85eeb2e099cc9f4fbc5be617b08cbddc5021b2132b9bee5d16372395b7f2efcfe3056bd66bf5f4aee0fbb7dc03e0cb5c487ddee24119721902acf42425c7a0e7fbe784b5c1667869557b81c7e7df0bb7dbc1ed649305c864f7ffcd7ed4e1a71293eed3c6f9517274e9c14e4fae22db5b2fd1e83cc5c7fc9c3db19bc541567cd6cbfb44d9eedd3d1a9bee3522bfb770e7fde72e6f9740c621ff6e19d35e5d23efd390a11bf3b69fe125d72f156cd38f97bd89d8d42bc7fe172e6d783b79c19fcd0de7266fbe3d791487dfb3d02117fc9c39e4a90ddc5029a5cdf7ed8a18b3d0a193fc465cd21f5ac2fc31e86e7d854b3fd30ec11864bad0c7bf1667d59fcf0963387dfed43c4a5f84d7ce4eea4f0c35fa2e10d2ffd1e61b88a66fb40ec8fb7b45fdf8ec9a59043f0fbe72864c6c922ee4e2ac3f0bbefd183ce21ee467a3d056fe7d79ddf9db94eeadebba5ffb4b7b55ed34e099ff2a012fbfff69e8acfdb4ff2a702f4b007007d2a2bcc97bd8e6fca830a10bee93c0d7a2a363efcfe8ff2a0a244e5e781be5f467950f1c1379f8fc51e28e763f77dfee6836f39450ff4379f173ff65428be7ddf93f846be47ff46f1edc32bccbf7d4ff4393f7e3f49795001f10d7cf70f81f00dbf77e38ddebd07fa9b3f10be75dd93f8063ef937a00f9f4afd207ce3e1791d7ca3ffc2b7d7dff06ff7437ca3f46fe1cf7e87245fc4b7ae7b10df28be0d3df8247df26fe293f8d6edfcadfba3c7f137f271e01b0fcff7e05bcf7bde13e11b0fd1f7783d8fe36fdee3c037a21725fadbab08af40dbc1b79defe9f9d94e4f0ffe1b20f84443201882afdb03e4934349cf5fa00ffdc29e2e763bd13fa09c987fd72329097a3d6127fa00f97c3796d381af170d49af2747247d5e22508ee79f83b1dbf5d0ae07887e461590a1c76ef816e4e0008d8c768042fa3a3afa9bffd1d1cbc7073f8dfc9e265650c1dfc0afa082eb79b1c77f24827fd4d1687fbb4f33a27db11ef2f1570094f315bc057ff3790b8e8efe16fe118ea3b7e06fafcec828bc8f9fd6f53ccd8d8c8c2af89bf715e09b91510e7d0b70e018fa9bf843afc77f44f443377c2cf8a3bf01fd118d96e371e01bed6fe0f8a3bf817fe36f242efa9d1d077afc4643437f8388e8673f74e387fe96f343df1b3dd2df628f349584de82bfc5de8259f4372c78a4bff9fc8dbf7d7f441312c22f74f4427fbb2f34ff16bed0e398cdfe0611be0de1dbd0dff819d1cffe26fe6cfead7b1c4ffb1bf9b499c3e86fde1be15b0ea3c7f896e389889ef637faf86faf47c2b70a2af8227c9be1dbec77765e08df82827e866f42bfb3f3b3bff5fc0cdf82661ff437112ff5d1fca2b7e086a8f343f816846f413ff4a2f8f86fe0637cd3b9f1f86f2186d247f375de82bf81f8843e9a6f01be5580579847e1e3c037107c1e7ce3f910c7877f7b6110427c03c317c237f0c5d78b7fbb38aa8fe60bfdad077bd047f369f866d4f339f00de31b7e1cf78bf0edc63fc6b70e634a1a65e2e4508218b66c17042a6089428d326ea002021b95fb4b40f8eba3f917df1ebf0fee3e9a6f03373dea271a027a217c9bc93e08dfb49430420c33687e08020a256c405a38a460050c4e88200d343bd880fe9683657d341f08df64b8e9910e5cd272ff2d86c93e9aff833f7ad4eff3378a49e8a3f93ef8d6835798362a39cf836fb1dfc12b28d9a8d0d7c1b71cd8c7f04dcb872e28e8e2039c37639861a37d851b237a800107384ea461a3423ff63712f7e8a3f9317c83e1a64700c0658fdc7ff3b0521fcd1fb18c1ef5df1c2be9a3f922be8578059a8d8a7d10df7e20b1041943bc09811b216c2fbcc2dba8d868c2044760c08a2a6a8861a3e2effdedc3b43e9aefe19bc54d8f9270a994fb6f1dfe3e9a5f31498ffafbb528eec893e238a5944eff25a7ee3fdd9dbed339ffcb13cf9ce6d79f14c8c4e5cc4fa667ee0f63edb5f6afe11c81cc708a93d6a73f9f8e4026ee9983002e6f9c46c57967f6d1bfc78adb694b4e671961173514d94e9b3fc72027e4723914f2fcd045ffe60764c993e9fbd72fbf7e9990d7e6cbbcd6f566d9c8575ad9f1ccc9bfbe7fc558334f5c9be63b2efde77b608534b9fc726f99c9bdc299dc2f7a6db6ade4c9fd5dd498ea97c20ee205d93fbfc1b00940ceefefd7a72073da3423a5c7aa9a853a69e29e7766219dab669cdcdfe3d849fe6227f9d3abc2945cd6ec6be4f904d95d55dae4fe2e775795359fd83ee8fb8ffe74fe98bbab4a1599c769f36bbfff7443af70d79a9329eca252c96bf3cb2f77eeaf5eabdf1f3614e93f73d844c8908aedb5765af9897e44bf3f0cc3ffcefded876efd4b3153dc5d24a7c964cea3fa117dfa34b78f0f2f55a1a2933a979ee7776be0e1a52a675a47e7894b7f8b45bf3c34fb3b79a6f2279d467fc979bce6b89c6f9fd62fed771fdacbe334fadd159d463b9722943f297aad7bfa3c5eeb4cdfdece9dfb8753eceecc3dfa8f40909c467fde22a7d10fa7386fe77ac78adf69743241969f3fafb99d354d9531130dd95d55c2e4ce2599c52cf35a4943f2daccdd45254cf6e7f19a4f5b2994fd7b4440171f3aa9f3928b5eeb19c408a4b650d81e4e14c8f9dd35054eee6f58589f7e587b4be6715ae3eab4192777bfe46177bf4ea21ff63871a995e7f72d67ee9f5190dd35854d2ec54c5f5ca23d0299bfe4d56bfef4bff6d13dfd57fbe84cbfbbdde5884e6ba795b2ec3f737799b192799ce65fefcc5d443115398b086713e4fc167b5a80ec2e2c67f2cc65fa61acbf8bca99cbfe218f29f69d5248aafecee5cc79ee2e19d4e499e7fbe8347399e272e6727fd8231132d7a737abe68aab669c4cbf6fa995cbfab32630575c15cbf4bb8aac94cb8e93cb7eff25da9dd41fbad8770641ce9fb97b47ff1cab3ed3efb18acc140b396dfe92f76da7f5cce5bea145a7571176409253d04ce9f22fbf4ce953fa94d2295732a59452fa5d44afda483933ab20bb4b4a96f71acd6b6525bde65fe4b599fd3faf75570a56b2bfe8355a9bf979b8ad1473f965fff65abf7ff5da7cff2e724ca594fb86d69c5961e7f083902c41ce2fc5ec73ceebb92b67d93174f1f35a39737fb78f0290f4fb7b14529dd6bfe4a18bf3d62cbac9555eced219b3c43cdf1f166b1f563397ab38c8f3fd432ace4bf3d83eac662e577190b36c9eef2fb60faba926678979be3fac7d58cd5caee220cff7ef9148cde5f2fc259f631399cbf345af75f6efb169e6f2fc255ff2255ff22e724c45e6bea1e5d3b3083b7f5e2bfde9f707215982f49f5fd26fa7f587f47e4eeb8f22fde9f7f748c49f8ae2cf69fdd569fd4bae352753d8452599fddb6bedb4f2cbfee597fbdb79b41ff9f7870d45d29f396c2264d8d3036477a150267757ae4c2e63d91f83dc5db92cd947201305727e77e572d9bfbde6bd7ff51a7dffcf6b9dfd431f8178b8670e02b8bc715a67fa4108e8c2a5933acff1492bd30fa7486f67efce1cce917e482fd60cf53f58810cd29d54ce2cc8990509275b33d64ba3f1b678a63cbc2d7e44fffb485226cb9f4b6f4b69e15833168e35d36b726973d68bcd5d90cb0e4c87a60353d5745b6a787259af5431f50a984bdac5a62bd39f5c905d2edd0dcde264dc4da6ef64bc8cb771349ec6d9f8195fe3665c8d6ff1e078f1692637e19839f346cd5c33ddcc34b3cd4433d958385ebccc2fb3cc14339798646698396682995d33572ae59943a3547e99ce2d48ffd2c2c9d4c2b16bfcf8ec68f15a556c07df3c3641b69ead9da7ef59f101f0fc4d8a8d2d209b2c8bd7aa6c786ae811fd2d205bcf1499ec3d3158bc5615eb790f4d4ef6e383bd2d5ec07857bcd6836f5b40361e7cdb0ab2ed60af8b0c3da2ef99a1530de95f7a5b3c37b96fe03e2dd2f115a1104f9e8f656d54c5dce47243ed23cb89da4716b803d43eacaa6239ab27838f5583da47569db58f2c51c7a77d58557939eb27cfc7a23f321097393bedc3aa6ae62c590e1f6bb68f2cafa77d64c5f2c425f9594039ed23ebd3691f59a4d83eacaa38c8593b197c2c4bc6c6f691e5b0f69105c6da47960eecd53eacaa6ce4ac9e3c1fabcb6016cd605698415c8e9f1564db8755964fae82e572b90c3e16f5da47569767d698272ec5cf02cae0f7d3f661554573962ccfcfb219cc82651097e16705cdf691f579fbc822f3fcc625f84d76f28ea763737055ac236b8c3acc7dc45531d103303ff1c3b7effb2ca05c86b8cb4d4aec56bfdf0ab2bd3e2b28973b19c45536e2c48993bbbcf04d8a8d3871e2d83e8cdbb16d01d93c7c2bb2f8f61dbe09557c9301d928bef17800e66f05d91c931e80f9fd5a20ee733b454d18fa1e4499a93dced4a73cbcaffbecbd7dd992d7ca8f54e235ef7f78ad82ec3d085eeb2e2db464ef13e0359abd4693bda31ed9eb324b2ee435bfde9ac945f63ccbd4905ea3ef3d8fd7ea7b5ebba141843dd390f569571666724f2705f0597435edffaa07940a0db58f2061430d418a58ac213435981cb898dc5591e787b1aa99bb8acb89cb29cae45a4bad99535745ae4f8194575ab9feadea3871e2b856f6ae4c9e67bce49b6feeaac87e6de4390af9ac9ecffe97ca9de259d37cfa42e6538c15e633643296e70e97fe5933d3d7ca37d37bb36385b95fab9b9e86534a29754acd5ce112822d99c769d4b98460cbb68f5af44ea3528091c28b7dfa4842f5e9dbaeebbab102b1d49d89b0b36d1f9367ec02019bcc239a6193e993b24c9f8e9487f7f49184683cede57e5a94e97bd55af7ce76b69394e80f21adf5763fa7d775f6e97b5dd7d52bc48277b3bec542b5ba8780d249bfa7f6a97dea3dfdcfd2a7f629a5a1ad52dbda9ff667f567f63cabdf5d66a8d8ef2caeb5deaf93fabb0b8cb0bffbda3eecf777ed63e60c9cd699c965255a8a1f50e2017ef73fbeefbec7d1f7455f3913bfef32c8ddcfdac7ccddeb0a39ed7b8a02efbfa79fbb2b0a355936c7ef67deccc3dd15059cdc5d519c20f3dcf9c2424efb6ed7499dd433d32142fff941c0ecb4f147dd2791d07e68e708047c71fceec3f00601737752a9954bf141efdbfb7ef1d228dee4da495d5ffff17afedff7e3fde687cbefc50f1d871fba285e3083210dc76f3c45b1ea4a2bbfbe74c0095010275fb5192f5858c82f2ce2b21ffc251af60939bc1e7e0dadf85da7119727e4f0fbbf1b838019a402bf1b83df63d397434cf5bd7ff939f9bfbcdb572b9c550959ee3a522983ee656bb2d78eb28c677651a1798d3ea551a0c994d2ffc40404c0cc1779add49167ad2ccaf333c8f3c528bee4f9e42c9a0408a360210e146fd674599456d833148a3162321458727f98bb0b0a2e0a0597cce3269cdf45a5528994fd657d91bc4642bf9207c664cf8e75c89468e886a2b934f079adac4f559ffeecde9f7ebdf5c37a9d525c7a583b6babe88d04e8c46f24c0f7bd4621943aa574826215ab6657ee4e9a35f977df5d505cc9e558e64ab65fbf5620cae4ca5cd10f7cc9d433a51ed2faad253b9495ec4f3df025fbd35805fff5757ceabe7efd7aeb2b65903e3841da81147c2abe481f049f86773e58523b4a7d1fe5c351beb7ef8d4e9f3847a9ef0055a6edfb2855a6cdda8f62df1b41f83eca07c2f75e9d544b5e23d3bfd9b103dd836f737ee29cb757ca87036ddd77fbf0de621c68b3515bafef9eab8a83298604bf8af75ce1e7405bf7f563dfb903d70998c3176f1308fb3a0699aff3e29797aa49f8e28f4fc720d749f8e3ebdc522be7cc8fc59ebc55344e9ca7896354f36177168e1de04266890e60c945b9bbc8b821a3a613c33b838da31d3d31bcb3107667e1d88ddee8347e07c0642c77020bd0368ba57cf8a665037115efa7ad1b6f972d4fc4e12fe50edf6cf7decb625cd7bdfd1bee7b8bb7de661f6fbdadc355b638b051d1b2591a622a235addcfc28a23bf1b79428767e177ddcf89676187b5b664ef3adcf40867fd03a3bac71e07828d941a1fc7e3b2173fcaf8b2efb188ec457cdbf9d17e8f208c2fbbe2872eced7f78370c3d97011b791bfe43d168912f4e247213fe87b2c12f4225ef2110492035a327d0e58c9f4bbb1c8cee7bc78c787dd283b0ffb6e3c00d08f6f6f919dcfc137d8f77cb78f0f3bf16dfc0d06f423beedbcf86dd3b951c4077a1b370ad0ef7ccf8d72137fe7bd5b6ae534192877d706dce4ee3a0173f7de6d0273f73d1f86733c00ec7b3e76a3c03ef639f706fb9c27ef0df6e4f778809d07fa25efb9b7d8db78f16a654fec6ee2016e393ffe2df63adf63919d07c237f2471b37caed363ef9b3779bce8d72bb896d8bdd1bd1dfeedffe873ee746b91fe53fcad0df7051845ee77bfe26fb9bcfdf789eecc622b0cff96e0481fc1d7cd3b2c53ee8dea62d86bb5b04d67d0e8e427e8e94f84038caf8b0f7468b8bec7c14f1632fbbb7f1611817e5e76d80206229402f7e0ce3405bce8f1707da481f1d2e9572972dd88b1807dac4b79f73634fdef197e878a74dc89422f14dfc1157813d97c5544dba9c5ff210974ad97b109733c87cfade754263570ad0e7e09bdb308e32c3b7a0bfe57c2f5e29406fe37fee4df63f1fda16b6e486e28a6d614bb663c6e406419e5790dd85459bfc25591f8b3469c86c60035af206ac68200d07d670e00b992f1c78a381321a00a3812d1ac88d7133e64c0e45b1bbb30f3bbdb2fd99c1ecb1c9bdc663936dafc97683295d950bae5cb6ef659b4398d8dd59f7df9d75b829db7fe52ff7d8a4a30a2772e2d8b4c194ae6ca1b8027b1bf8366d23be5d6c83fcdbdb20c238a1eff92112e384b8bc277fb4409e9f73b7de96f3b3bbf536f1631717fb9e0fc238f17b72302ef6b11f1fe8deb46c3bb80a0c73557190a9ca9e3acaee4a424cced326bb5b6fbb7d3729b1dbd6db70e2db76fee7de7c304e14bfe76f389defc15b6f833d0fde7adb0ec6e9e0adb789b84a0e96c2812de7c51fb19458d95d4980c91363d506419eb804128a5c765dc0e4266d26bfd696fc12c5877dfda63cbefe374ac13ef624e52125f630bc9583b9ec6bd9ea7be39356b61da6f2b0112d1be936d8571cf9dd662e479ed05db3ee615fe56db0b75f42c916cf3a5c849c5f2ac9f3e737e511c351c617bffe373598f8ed7880cf8d2f3e1d8b880fc337d88bb051fcd1fa9cac224c424bc6f166cdeb49fc17569a00f87ec98120c57f4d244811cf9a3c97cbf471b95ca6a2dff9e5d493b36a6ef2fa99079d5fe277192b879576619a497d52d8188e3090dcc9d92149722727a6a303cb2161b0188c8969dd6b21fc5e5f8ae2875ccc6cc59411a3258bb162adb5afeb39aca2169d285ebf6dd364fb9fd768b61f5ad1ded7ad4efb7e1a417a4a53c7f7484efb9ee6b4efbf0f699447067ef4fd9741fe3e2fb40c9cf65580ecbe2f3368ea14566ae570e69fe5e5aa99cbe04ff1cefc67af9fbdf010ad0ce22e2a70601bbfbbc4a890bb4bcc56ee114888674d34bf9ee617c6e5d7e3f6f1faef7b92f298b6ef659487ce7fff5303f1bf0fc19fbdde0165b2033e9075eeecf5d3e6b6d89dbdf0075fecab4c5bec3f9ca2ce9db6d78d225fbca5039ec860cd21f5d9b4c24aad3c8b82fd2cfc9a699e7d90f3b31047e560291d07cef8357b9e79c96926af94698be11988ab62717297ad0c6ce34b89a5c05665dac69ff2e572391896e2c5b18d4be6cff132317f8e5064a6d9fb0f53b5d5eabc53e34dc666ba90d08284957c737755804deefed64ccbdd1709bde71e2b953ffd92fcd2bebf63a7988aac543c37957f7d3a4239cd62a6e492e429857287a9e877ff89b289e9ccf4a7069e299452ee4ea260c24904e943e4ee32a289ec3be4ee2282874ccbdd05468a262c296e72a9b584cda509306c20f7c726112475227717d7953cc7e4ee12a24c46cadd15c49b390a019f5093ab94806e74c85538582eb1b8c842b6432eb1bcec1072914b2c0970d1e5f24a044758600133b9bc126326f77fb9dcd81427f77feef719c2aa99bd898584df7df7debd9ad903711067b20556585faeea3879fceeba8f13772775d96f29a4c1db1fded27e577f0c624d1e1ffcb0031d08e8547ffc1e9dc6ff5efc79c507eff83e3abd82bc7e968e6727cd075fbca5e709667db98aa62097fbbf5b62cdace54d4a250c5bd4a2411d1ad1b2f947a14f85621538b0f93bcee78713836a944b20be745a4d60d77d5971f9ea2e7287bb7cddf7fdbebb523aaa68228eadbf765da2e01a8a2bb60fe7ea97af4c8dfa7b3c8051569a5a9d7b08bca4c9f441db953bb00c1541500497c8f4e7100f9b40e6b2e672190b04c15ff2f97d3933d57cf0f3f9d88e40aa80cc0fed87d3cd74f3d5bdbaafebfc9bafd7ebf52e8677e607fa71e6658d4c1ffcd98f5eda64faa228be288e60501070040283c18688be293644149b6060234c1c7fc967a437cefef5b3d9b733e4678666b3d96c768774baa1f7f9a12f5e1b1a81f0d8985138331be2983334fecf8f1f8e77f6c56bb3ef3ed4a19aaf9427d61983801ff47574a20fce311445a1110f89d7aa49247a31f64db0ff5e24c2624c84cd66bfe4e3ed2c74ab669ebd387b1f8978b62f743b8bb90b675f67e3cb7efcd056a05bce1cf43d1239ca63d0050292fddc2e8bd3baf7b9f48dd3ba7fdd9c5bdeb2ce2d6fe42d6f140e8593bbefb278cdcdf899dc3d7de3b5d777209e35d1a7b23f9f7e8f1ed8fa5fbc367ef7e1388eefe3cf0bfb39cbdd75030680b00284162f5fbc68f16285dc7adb8b1f0eb481f8f1edbf35c2397e288ae3f84b1e8eafd7c3fef5b0b74b780df6dd873018ec050b41508c89e293e0b56a02c1f0bf07413014e705ab7019f69d4158ec56cd0c83fd48e428c3f0cc69fcf9239e5f9cd6fdff3de11fffc538f77fefbd6d9b53bcdf5f2efba0f8cdd98d40ba8b875c3eca13db259cd6bd8f50af0ce2d20119fcb07d00b90fe72d71e50979fedf2a6f8b82bbff9fa369c4c092b33d9ed21e80efabbcedffc3657dfbb76d65a7c5fe87ab689cd783977e78cb13f2eb7b84a2e517a565a725776f9770334eebbeeb2698dc4d2dddbb9909a69b6172c793bb27ff3b773fbf7cf7a20fe0bfab6391fbff742cf27fc3fff8beed9a390d03614f25da805b72fda0efffa606dea7c9f4836ee979f6b00ffa259fbd522ea75256ca3dce7ec9bb7decc8be23f7181484840ad2be529e2391a02f3d8f73e2721c83082077277d5a1ec45ead3cefec61b70c7a877ad8dbb061c306b561e3432adab0f14b4e924444441f4e91bc4444ef231022184c1445f18732423fc5a15850eeae1bb6721824027d2fc4e2efb5f2bcb01f1f46db88b6b332836a2c161b8164f2760e67e21ce70b8d04e846024cec41f7b16f0d50e87f5ee87f8484848440a11f1a1212fa257f2121a14f08cf9c6cbcf836c4586c72097a8fe8c5271285be9cbd7f3806a13f9b59e83fda66a81b891cfdfcd0fffc50e94376478c7557624343e2d0d0d08d81434f4722477908cf9c641f7bd9c73e14ba56350b7dacf288368c188bc562bfe4b06c5fb18fe19913d0c31ee8611fc2aef842f7cb738bd7c4af1f7acf9087a6fe78678689b0db79e856cd2cfe283acd6c5fe876b638147f76837e8906ddce40d73be3b4fab26bc138adfecfed420f4d79cb6077c58996453c73f279d8fbe00f8ed3eac36a0fcda587c64393eb7f70783c97368c0d93eb7b67bcd659d9b9530b3973d95dc9f52d18afc1be7e48d9782d27070441365e03bfba3b19f07d0402be8ff1dafcfa244992dfe39293212d27974c3e1d819039b733897d8cd3ea87afd77c7d7ddd9fd7f65422fc1f96c849b9bb7eb0d2254ce691bbeb8735baac916bb9bbba8c59434df6c18c0f60b20f5b7c9892439d30146ff76ebded8adfd6dbf0ed3e0eb4b507e0fb3e0cc55bdf7e3314c5d7cb83eeedcfe677d6ca33a7efed0bf9689b89cb5b9eaf9527c5f23cff1b891c850ffbf061b8b3e2b4f0eb87e1373a19e570da9fe3cff913637986c13e66ef78ad9ac6ffbe49e7c76faf7db8b46afa3ee79bc8ff7ed4c1edb4f1475cd69c83cbaa99c7ff7049c24a273356e160b7f318ce1c76b62391a31ce29913a66c9c56fff541e5b746ae0f6af1da0bcf2d41b30bf95dba742127f6be73f57ec9b59054df772e691b271334b590f3eb87e79b40662c325bdc65eb6d370fb3e58909e46cb8caa6891b9cb04579c04dcb56f42a28d9aa28d9b8e67756bc46db786d662db97349dd642793eb7b991b94cd0d27e303b8514e2eb9fef4827d0c9e5c7c007866c99dcb2fd7af5db6de76bf67161721ef7bf6015cd9d431bfbb418d34bf1ba18ae0bf4fc7227fdfc70fda760393f468fe1c3f681bc61f3d9a17373d9a0f6e19721d61c4fa67b9bb7ac0e2b0dc5d3ca4c99df3babaab82f9a099030f5e3299ddfbbaf5364ff43c7cf31ee7799dada06d99a1dfee96c9adb77de2b7f536fb169775001fbe7d8ff3be3d005ed7c8b5ffa35d156d0f40d95d134093b13cfb164ae428535ce5e589c6ec390132b1dc5d13109379ded49fafc39b3c012fd93efd441094e870a6d6594114085bb6d00ad2d099fdfaa552ee3eca6b65114d89d74a9204af95b2dc7dd77df74f5e9bb97b25af75d70e6a72f71978ad43caa598cb2663412e3bcd9a0a72d96d72d729e5ee91bc56d277fadd9cf3e7b44fed77cfc7b2d9efcc455eab9a71acfab16cb63f47a724d9dffaf7744cbf81cc0fe7a5a2fff43d0671a23fe92de97b1f7ab78c40b67f8b1205f7e13c883f7dfa706983d8a74e1647f9f79a5ffaee44df62a7f9fedd0b794d4bcfefbebb74f892eded32c9e3b5898214a420f718a791faed9d71728fb946ea5f727b3d87429e5dbb795120ece903195221a3079dbb919cc714f0a7707d18be6e77b9872eb69a5c373ed59108cdf4c1db366fcf7488d60bf923a2d46e08b094bfa7a393c7b2f7e1ec6025ee4ab6bfe4a3074bf97b1f8538c955b8ec7d8f4d6269237b43b476c8df8754ac6310ad2db94a49fe3ef459e2b664db8d547e6f47ef13c1ef2582b76d6393bfc521e8b329acc4652d5fb27df2753f97cbe572368ae95875c2941450c865ab769a7d8b4bea23915a453315f5b0c593ce9f39950fc8fe9d7b0462bd8313b66bd192eb835aace4fa2f25eadb25da64fba1126972fd11873572fdf0bffc11fbf1fb7964425f44f39a7d7bebeb25be44f13d5114c30f63b76d3d865433a7efbbffbe0ff63d42851f08fbdefbf0057ee717888378fffa97f8de9df9d56310b0fb40f03512a90f62aaeecbfa5723912bad2c3e95fdfa1f2eed8bf8f59e56eeeef8e0d59a39bd7efcd78f1f6a65f1ed8d5d7b45aaf1ebeb6377ca942953625fa57bc7f46c7fdaaa74ef2869b678da9668d52d76db16de2a8ac40a727cfa746c0adfe272fc10cfc2ffbe7b1f9b463c0bb193f7f6bdb70ffee77d541e14f5bea6fa2f5cda0f3f0c6f29feecf53d7be120dd871fe22c86ffa2023fc4e5cca52512e2ee24dc49e5eb2991fa212ec1b77766f07567e70cca1f9f38357014723f4ca987d7286e6a812eaa10521a35854a942ca898b942850359acb1353da2924150840c65d8a4814613b6a647feedd869d969f4cb252db71f9564bee18b5cbb5941f657f25af9f5f01ae90135d99f87f68392627739168b4eebb098bbeb062b72c53cb39bae46d894c7911b133851468e034ea4b159294890c21a3464f8c014b6be81f4a76f03f9d369d4827ebf5533dfa6d6f40d42ba25d7d7538c6409726ec9f5db0aaa04f86127c2c0ce5f04fd6f20f881e015df5ecf7e08de0edb1bdeaf1b838c0f3ebddf8b37fc25fa85ffe1ed3c5ed8f52e96679ffffdebf513bf7ede0f83deabc579c77fbd9ebe3ea4d7ab4fcbeec32ee42f39bddd873d8ab8bc6511a4e4dd7a1bf9ed0320f10d17fbf600807f6b0f007df2e9d791082dcfff79c317af3f79db16bb5ce287f38ef87ee07d8d412cf821784b2ccfdf47e42877df21a1829c5b72cf2da25b17b4b28755bf9b3a3c9fdef296adb2beb718abbe7d1f89d07289cb5d79422efbbf5b658348f71397f4a708867277ddc0432eb57249df6d809369b9fbb013bd12cb73f7fd0d84e2ac0f53cdef6cb1dcbbddd3d1c928531ceb9f5bbcd6d55ff22d4148a820b13ccf9ca6ffe7596523cf5bb6df9d93512ea92dfde977b7bce5b21fcbe9e844c3738bd33a8b0898cbf32919e1fc2aa1f9e1eb853fa7bdbceab4d78731d7cadfdfd91f7d9f73ce7ef7aa5b9e2f22950a99d9fb79e70b97589eabe61aa1dfd23f8bcc4d6a0e855cbebeca5b03853839ebeba8ead3ef9fb824f3fcd72dcbb27cd5aa6f4a0a2864ab2c9bbfcff2f29556fef0bcf65fb773dfb2ca7393bbb72f2ccff53d3c6b9a5d01648f9cdb39a45ee42424c68c2ea262b4a74720569a19f64a4f79e83c7d1a7d9ddb94470f3064d96398bc263e7d0f9ebc167e5f93669341a5f0e9d3f1492b8bb8498f0c3e1d9d74b87420860c82f8f312e0b459db4ccc3d09840d458a3fbbb27da49287c7ccc99c8707f4c87e3b7d21c507c169097012822c7b4db6efb403d9de1413c2c9f62797305e736c3b7f9960bad40c02e551e447f6bf8f2cc98adb8bb245e3a404e901e531adf8917dd1be1b41968d264bb60f82d7c4b79f00255ef362b3806fed4f2ed68ad7e68bd84ab622c6aaa3e3765a5127f97757e65f26415a9b7da41ecea36df6bfa28ebe7d92f2a86fbf8b2ca69a5ddd06c4dc4dc4279a524a3bdb5dd7858d147ead1dfe994127b5cd7d0fe47c3fd3df75d7f577fd545d7777ada40b11f6d7d329ae947ea5dffda4ea2aee9982b08b405c6ad5cfb94123261be5ee32e34a36638d19647248c58e4bdd42b57896ec79d9622c19fb15a7796ecb9ab1bc746cbda73c6f7109d3f9f2fbce79fb3b1f8f9db7cf834bacfa511e3bffe393bf73db8f62af73db8f481cbefda63c7270ec8564091286b16af6c4bf4896203f8c45b327fe888550cdafd9c35422f66ac6aa4148c290583463e17282e9f20b53f97b4d8ea9e677d9eb425c6ad1914897a75fc9202d721aa589b2ecfdec9a845c9be4da56964b1272fd25f7aa66b6d8892c574c35bf62fa152fb91b32f9737795e125dbf9768e2391ae5c330feb7d9d60f22c67983c71e9796fdfad789e7defeb08c4eb5aa27504325db0d56b1d2ea76fb995a94167efdbfbfadee5dd2612e6ceb7c2ece1fb037cfa0d7e9bc93d9ca6852c7b64fa1fa5d16ed9fb7a71e7c2d451bf7ab7aba2b9eb68d58239f925dceaeeeb574a2dffbed3bbd6dcb597bdeedab9e7f7773f6f5b69ec5beec2d431e7f4eb57fa7afdee7eb5bb1a44d2798cdf1ffaebfa7bb73e08c4ff15c4c56fe701fbd07bfab0eb7d91d73c327f99be3ef0923c3e22b182b4ff12527be1a69e7d81e36d3f02df6fdfef965f299664ae5fe4351097b249ffbbde2d499efa4538d70abd967125f7bc3c4e93bdeb409642ff6389a989acba3035e85cafe4ee8a4b90f43b8aecefd3694e3f19c8f2dfffcd54af7575bee7bd5e9ef7f2aaad59ec775d195b64b069918e4d9586a9a37bfa7ebbaf65c502a4c34ec3d4e121a595de1148d7bddf7ae5849a857e186ad5aed26fbe5fbba544f3a6cddd3eeacf4eeaaa2341d25abf5a7d9a3315ad1453cf25f5125094a54951ae6f67f8894a5e4c57ffa39442296b20e753ac9a6b511852fc79f64bcff3bcaf5aea76864ed8afb8fc72ed9e7ed9dfddf74faaae2516cddd57211ea7f5771d2e95e4eeeb7531e4ec2e56f739cdbb499b08db47e7b28675d6afecbeef901490541dfeeae72c9001a78c2cd982dc5d6354203b96b55efe70b9f42bde7b17d2afb8a70efb7ee9db5bba15df7217a60effdab613ae347dd9faf52b4e73fbb6cacb56a4b76a550d34de819c5ff6c8b5eb470359f2d0fa140b695ad759be1509727ec993fd79f0b74508c3745a3bcf812c1bcd0fa7cd2eff5abbaefb9cd6d9ae0ae5f93c57c8f618c8c665cdd383952764b70039bfb340fda2b065b9e27266fbfae961e55936c9df97502a399baf95957a7420765282a49f81d37c8ee277ef7d3f71d968f2fc1197ade61371d96c405cb61bfafaf9dff7c233e734b74899def2234992ccee6fc9f079bce67df89ff320e9917f187ef59a8f40c25af31c6bc54d64154c11c41499d2af99e2197dadfc4e23cb2f3b29419e50361c385f311c0c27dbf77f8aa2f885cb56437eb86c36320f37998acb86d3646a87f1cc515c36a1e5a83902a1d803a7f9f7094ef31bc8f965c399e20455a021d5d7779dfd423114adc56593a2dc3d08beea7b1e2e3d7bff7df77751edbeab66c5e2ec0ed69d545fc869a4d32a2e9bf410675744ffc800698ca31186a152372ebf287737962cbfd3ead372edba0f43adda2778df2390164b9edc40baab87d32a2e9bb4994cdfdd8610fc6aadb52eb952ae4e7ae4f0eb2d7bd01eb916e519f6a047feb3c7ec51f6989fcb1ef3bd0b29be7fd923fbbbf8f19042b2a25c91727dd8b7d7ea8ff5bbd8bce0c3ee784ba5dc61ab5a7a90bba72310307c914ecb216e52946f62cce8c24bee6a7eddeab41eb059d184595da6b2effdbf64a1d3425c7ee12d7be4f06f4b1e42c9a1d34aac1c86b754ca9fd35e647ee112abcbe277625697a9baafcfa3dae67fcea3bb72b9dc14dbfc30fc70f9397cef962fe4b5ee9d1ef97bff794d1c9ffc52963d7af4f217c8d72379ed837def4d7ae4d87f35f0fd6397745af8dffd9c163e2c7cf2cafc280cbfbb3c4e0b7f8e4044fcfd127df092f53f8bbb629156aeeeab678f20fdc3cf6bf4d65af6988c6409b2c7e4726eb90fe4f725b995c17e93cb3a4720205ea2563503f1badb7976b8498f71c2bda0821370725773f8f5fd45fad75e270d277798aae28fe269e6e55e854b802c793ada449667cd4d154c1104154d64144dd8b824738bdf7d69bfed1d920272be7da7b2d89120fd71576e600c2f93d259c549c7c83286953a02a194d6aecd1a6dc69835792e1f504220535cb554342d6009d94c31c67cd9eb2e31b6642c9ae97b4711c61b28bcf6313bc93ba93fa42f34f503dd12368c23c2f832c3d0210c18e60d2385703c43a42418bf3060a09a1848052905184dcc0b0613130c2266979e2d3ee204c3069f1e9e1fa5cf8bd0a97ccda590c8d3c379d8fc979cc7dbfc3d786a1f34fb47b5d9ca748bad6c35d99b8debf0f7d7d13eea3f914b592e934b31d76b45df2aebcbfd559fb3c23bbb722e8754ac97288755ac3728879d58af2c8756acf7c727879f586f4f0e5f62bd3c792787a158af4e0e45b1de1d391cc57a95720813eb15731813eb0573488af5be729823d66b73a823d6dbe57047acb7e69047ac97e6b047acd773e8c3b3d3e3f303c3565864d6d1df956b0ca14b610347c84fee1d9a20c59e606cbd996cdc50ead3d9a099734e1f29ed664386cd185a6965a3049b306cbcd4ae766cb2646783850d0b9ded2c9b29f94d2e67ee30462cc8273c18063e9bc40b1c02fcba8422bd23d0228ee0ca081b6123c8a901ba8189744d8c8c91221a52a4931cc31c32d9bf70e27b750e99bbeb8b2f3a3b3a3bafef0b2dd9bfb8f245ce8b37f97b512fc2c83c3b22bd5eace111699a1d9d1c32061bc5107c7d1e0f4c27e745995cd6eef2628c176172f979c1e585979ecd46cd174ba0f15e1b80175bb28b79c9063060a9da925dcdf42e0787f2a062ccf87f39724b76258bb1593e34a41a191b7a54be9bcc835ef1a31ce5e16cfcc8ffc9c8ba4831f40a9b2ec7a6cbb1e9726cbadc9cb76ace7c85f268db47e692aae9c45ce9b26285cbd6d69629539c46739acbb2c61a58e0c0b9f2e68d15376e9c46736fe3349a5f751d76365daecb399b2cce26fb77b99e52b73e2be215120b4f169916a12ddf71e9725d64e0b8f12c6e288f6e4a67c54d87c54da7c54dc7c54d97eb24355d6e0b55b3858c1a31540d5d63a6bbd6c0c9251593fde7162e73cc0433c3ccaef9652e31bd4c310de784d7fbdfc2f79f39af95de9c32b7fca79579c56b6537b1cc2c5e2bebd4e2b5b2c803a1259e1e2212f8fa6a67671734a4201f209ff77feac804f578ff1f3e1e78adca46974197851e7562e85197dbbab2d46de9bc7460ba9c193fea3568be356ac8356c646bdcfc161ee771e3a3fa93a28c47a828f7d7a84ef2a7943afd3e2bace8371cda1397b7aae7cc93d695fd67165bb25338fd659ba9b8a4515cd2f2546325eca2928a41960ea69b8d83f180f2f83e9a4ffb94f26c323d261964f95e90fee5777729a366b008bba8b4b9ecffdf976de6f3ca7aa5aaa13cdc8d1ff97f6c4837b20a27e7b27fb7e5b5726627e3b42b944707c68ffcff653292bc52c6ca192c69b4acf123ffb2e392bd4df72593b992cb7ac54b2e7dcb16fe1d9a3467d4806bd2b079b559e3c66b58df1b38dfade1b532dec6d1781a67738688c8d7cc666e866848c8d5cc8280ccacc9e5d2dd7ceee6760296d7daa456116a4d40ad2040a9247461a8c4fe7cf3c6b588a267996dda3896b9c6adcc34338d4f9967e699b9861933138e28fa1551f4ad9cd3fc8315c81087ef5ab464c98205cb952b56ac6c6d4d99e239cf5d89229e6b5c89229e702e1c332036f3c2663e6c26bcf54a277909f2c28c1e32084e73fb84175372029ce6b229b060222b719a532f585cc82238cdbd1c109904a77938021064c94d9ce643b93494c8509ce6b024bac892b19ce63f2c8c11279fe03407b7e0604476375d80c9a5bb4193cb7aa55e11bf568e350bf8b592fc9caf953afffa5ab953bd7c5f2b7dfee76ba5ecc3b8ec9ee0342c284c4d48f82182920c12a07441b81f78e716a4bbf13743404240ef4fb100cd72405382808088de9f5e99cddedfd72022a25666338743342444b76641404a94c7121757fca8b380b8fcb6bc70497af970296b304b5c88f1a3eeb2b8fcc874b824cdf851e7252ed0f851679bfbf19f33c22e2aab9a6cc54a98ad2d3053a6d49c9735d6e00207ce96376fb4b87193c5694edb5c791ea66c9cb271329e57c354304f5f9898b8fcf8a1c5bfaf62f93eac54afcceae503c1bae5456b96b9862c95ea15cac6dbb459133e5513beaf599386a211dfd3a4a167a899f1fdcc9932b0a7649c56a6cc1827e364ba8a14c142af78fff464856e7dcfc444a7bc9ee65effe387afe170c0cf2083374a4a6e9ce6579462a4255a8cd3fcaa565c148682a92f24f48587878b286ab9ea3a4cb3b8fdaaf95716b717f2ab26a6ea7c45e2de72299b2cea952eb67239cd742965c9ce859aec64288f09c78ffc3f182e3f72c425291371296b3ae164ffd0c994be253b86337370fca717caa362f1237f2d1f17f28bac86c93ebd64ffa905d95d6adee42ea1594513640b0292c97e0bc8365465a39aa147fe5b40b6a0a1a1af5ee89157c52a197ae44342335caf64d9428fbc8211438ffc6b179d6ac892b2f19f5d90315cb6993cfd291baf955d847ee7fd691b7feac66b6597d98bef4fdff4bc3f85e3b5b24b105dc3e7fd6bce6b6517a027dfbf4ef979ffbae5b5b28bec75debf5a7993e717f9b94f97c969fe3df74706516ef2fc9c36793ec926cf8fadc9f3616af2fc314d467326cf57a23c8430cd8fe6cf405c7e41b8fde8854b1208b71fe152964b25196e3ff270f9f9fb3a5c92b9fc70299b4f7155e3e33d197093fd7b665ad75cce59a6939e808204a47f39cb5895e924fff9c434e347fe6e9e8d4c4df68926fb4f33c8f9e52ce36eea7415baf2fcfa659ba9b86c5cd272e3b2e1643ac320cbb9650b36b96c38707844f9913f1a346ad4b0c95ece2de5f42f69e5dc522bebf4427f7ee92969fe3b577673ee8ddd6f74777777f7aedc37b476664d21eca2d2b7642f3dfdc72ffb4cee6f58eccb4e93fb9bfcb2d5e4fecef9b2d7e4fed6f9b2d9e4fedef9b2dbe4fee6f9b2dde4fe9e65dee42633c774cd25c4cc3060e6172f4e1b5ffcd8c3be44ca79f24ba59dd7297b9ee7cb1e3feff3e50fa0977dd95db30ffab2c70cbdd0974d26f78d8bd3e8975d26f70fdd139c465fe8ce2d4ea33fbb584ea31f74a716a7d107ba509c465f766716a7d1ffb94d9c46dfe74e2c4ea3df7349701a7d9e3baf388dfece15c169f475eeb4e234fa3957c99d5b4ea31fbb09701a7dd89d539c467fbc20388dbe7867ce69e5cc69f15af8268bd7403758bcf66a73c56b1f1b2b5ef3d66c79cdaa99e2b52e8de7bc56d1ace1353fe334385e9b669c46df8c19330d27fb970d27cf2fa79752e9eb2ec8f9252d4f717cfa24eca9fd98f764f97dced3d7eb3c057fe7c3e7792a7e0f8d7ecfe5b97f75aeec929784dd4f2c93e78764c6e4f9df8f3cdfeb91e7db0cf2fc4e29cfaf4879fa96dc37b466f3a340d84565bbc9fef30bb2a4cd1190ddb585167f12debf890f606bc826fa8b000bdf5f890ff8fe09f0fe367e151edbf7fe206c0dc97e3ecace177905c9c2d74feca3dc448ce360f65141a22c0cfaf928307cc3719013b3e1bdff5317994c0c43f0e7a38cf8d6f343cf13838dde47b95f85c7260b451104bfd7df7670941bd0ef845e0cf651fe475014bf4fe815f4b7198e02846f44dfd3e38121eca300fdf889dff77a0509c95e7c7d414142b2bf21f8b7d7db8266427fb3c9fec1d77f7fc3f91336a1bf8d1f25e86de028444398cbbe177ee0dfaaf0d884660c20580307db0cdfb6866cb720fc7a9c4df63720fcfaef71b50c1152d86458cac4d138b6d7df70340454be48c1f683b9caeeeb47f1c1371c0771e2d87a30177d1e7cdbd1c15cf373306e62ae8a8bfc046e6490802d86b9cafa137f182e5c7c618361ae723ec54223e62ae9db2822bee1260b4894600c9bf737dc0c01952fa4d842ccd561b24fe046062b36f0869b71cef00019b617e6a2b84e23d6703102db87b926fe280b4894a08dcdc33c930d39bfac3dd3ea5c4413d6212befad60d98ab48fa593adea07650f63c9f2f758365bbdfe275bbd301699c3c79265f0b15ed94a2479b29588b1c80c7b2c591e1f4bcc56b117bf9fc72a2b275bc5301699751e4b96731e2b96ad488cf565f263565961b6dac1585fe6792b2c59f6792c32f73c564fdef9ae9a707258b20cf456586496fd8f1516996d74d2fca1d6716927cd97dd9fdbad63becf9d75d2fc9e1bd449f3792e5027cddfb9429d345fe7ea74d2fc9cbbd349f3c9dbd349f36397a793e6c32eac93e68f37d649f3c54bb68ef9e1056fd849f35f576c1df3bfeb75d27cef7ead63bebd3f9d34bfbb3e9d34bf5e5927cda7d7d6d6315f4b36e914e17bcd76def7afef17eaae5cce1f045fafef7b7fc2fb0e0a3534d0bd2d438b1834d8afb50c1152e4326b28cf2fe708aae83246a6e1537dad9a71e28021f85442422ff0f5dfeb7b2a1e1eeff39e8a243baf7b2ab16a76b834c146ae98aa9a6023534c45f5bd66cd85b47d5865c9327dacce2a6b96e76339f83d9697bdef2ca0ec3d56cdd62a4b28dbc79ab9b3cafac9dd63d9ec5941d91f8be64ae90cb376fef5cdec65bdb297933d2c3a2d66bf9fb43cd962d2693b3c1de6f1f9f1ef97399639ad8e42ed23ab27572c44e464f6f7269d21ac309bff14aeaca01cf455ac8dbe14988fedfb7e59cc567f0a5716509e5fc5b3752f452897cbd9aafcd874beffb39ff7526c84b6d74fd9ea6ce157a136f0a5c4d4e472b62a3bb6d800a654d1b1893fc6fa85461bf953b6a84de7ab74b69c9712cbf5d87abeff45dbce4fd9aab69eaf526d3c2fc546572e67abc263031ac094295540dbcf4fd9b236a0afe236d94b89b9c9e56c557482be9f6762b269b79b361fe80af58ef9b23bd43be6ff5ca2de31dfe7dae81df37b2e50ef98cf73837ac7fc9d3beb1df375ae4fef989f737f7ac77cf2ca7ac7fcd8157bc77cd81d7bc7fcf1c27ac77cf1c67ac7fcf0be7ac77cf082bd63feeb86bd63fe776def98ef5daf77ccb7f7eb1df3bbcbd33be6d7dbd33be6d35b7bc77cbf5def98af357132a76adc7ae75ee4d4ddab4ffb454ff4be5f48a87ab6ab94878b8aecc7d9e962845d7b727872bebf28877e25fb797472727e0b88766f7f0b48f4f1dee7f560ffe713bed8333eecb7826c3c98aba48a394d07dfb8cac9e3b41ccc5552914ebbb10bbbf58af7bbe015badf159d36dfbbb7bb5f7471560be6748bb08bbe8f2465b2ef3fa54ffcaa579f3e52c5b713e811a52fd4d5fa5b40b657950d28f6ab621e1459fb2490afcfc34af4887e0f7a447fe9bd866f51f4883e08f488be92f9a5d2cc4defcc84edb5febae3b7826c3225d90dd793b3030023d0c6d00c88bcf1fd3c48372cf82d20db8defff9f24fc444241de9303801df1c6057fc35530fbe929fa2b33ca81e37137fee8fb859292fe86fbe9c9d9c9f1777c99d1118ec70d7dd1f77f17ec50c2379c920eda0dd907800a7e6600a860f683a34729f6467fc3e9f81c458fa3fdd1df703a60b41b1700d54605efc3a3f3b89f279390f06d2bc86601bee16837ae8d0a3e48e6c3a3f3b81efc7fc3f5e41c612eefefdf703b2ffb1b8e16be11e612ff86bbf13930d7eb6fb8a1c781b9bac7d9f822cc45ff86bbe118e3bff8b1cc06e68a1161d2033084b9609814c2df6cc4424ef30f127191d36688654ef397dd703f453e2f2cd483b93eccb383b92ce6d1e970cdc15c1593f486d6e85f0da192d0c778489dc7854b4342447fc3fd3ca9f3b8598f40cfd564277b8ffbf99dbfe1661fc35cf471b2eff97e92fc91f1f8fcf838f161dfff41e4d4f91b0ef6b0c73d8d08fc18d0df70e1cf1e37becef7f7c0e5bcd0df70e207f1fc0da7f33f8f9b794079dc70e20f61aeef6fb8f1853097fd1b6e86b9823017f8371c10e6f25ef67adccff37cffa7f33b8f837dcedf703ffeb1bfe17c30577df171e4f7cc5b9569bbe17830d7c4b21d100be960ae1726733e5c44622e1ea7cd8f61ae263bd9e277dafc1b0e86b93a3c569c88b91a7339161fc7a3f5f2ca157651e9b9e161bdf811fdfaa568bfe4c9a550ee27bf2cfa6005d2aafbd8f755d8135e89e2cecf1508025d8d5d6e5b41b6a01fff0a06f3f9af8ae9fc3c9df3bf7e7bed838040d9ec09452936febf6faf5de57cb0025935b385d349f43b5fe5fc0fbe7151e5f8e01b1715ec357ae4cf2c483865bca683af7474b02d33e62a2707b7d3c8f7ba485c5a3299be1de33518be82c1b01db3c488afc611db25c278f19a88af44115b2f5bbe782dc4576188ed172e368cd7407c0582d886711a8dfe0b5fbd5ed813e334dae5e12befabfcaf3cec81719a1593e9d5fc2ac7545533ce557dcf0b2e2d18abd8fbcf2d48cf7568e074979a32f93fe76df1b8780df6b3c56be318afcd9da2305e137117305e0bbbbc06e22a1b3d4f816c3d5fbcf692894b78edc3429e17af79b2efa77251350acc64fa9e18af59cc4525e3a2e2995c54649c3871dc7cb002593f3b2e6755a6aaa884c9940ba4a99e2441a7109a299226003400d3146030482c1a0dc80382284aba07140011a5a2505ea0c9c32447524a19630c02869011010118009819802000a06437b3b88b06ca113af6e79862e7c185e6e24ef73a68c1908215ee40ee9f424725ce944890ff64131ba712105589b985180339966aad0d4de1852fae8208fe3e822614da9a080a2a43e90f76d244d4b11122ba88ba80ba7ccf79676208ed3e891802dbd010f2bf010da1366e975ebc426f382cb040e4d1cdc52c56686d7800d52148012818163ed4f59180faf03851f820257890ba7533266a8b191fab97c02c04bf85d1380863df59dcd75aafcc1e7b93feb777db5b0f479d7cc04424274331989143855f401580ba0bec1ac6de17090612f4dbc147e10fae016bb2e27524ba3c4575980275b75051c1156235e0b1b8805b7e5e933cc03ffee3777921ab734c37959e48d8ef5c7b5ade88f74c398535f322cd15bad440c6b3ea3c900d0589cfb94c388f1a1bcd3ec62eafd290bd4358cc7cf2d988af1f1c456c7c11ddf0d9a84f9079ad364c7da002bbdcc5f748641ca04f480784ce9b14dd54bec09eae53965062765ca8eaf151746da5166ae34b53e764aec2638a1b15e8a8de0403ac7aab25819ee61f15208908c3f3a0c98c76a55a53b4a2c73485b1720ef4a13fd862cb9d8da5456dc1c900ad5497686f4fcc25a267a884a0a2e5964bfc34d8694aef7023ccbb0d29ba04a1cc34bd1f04222d07bb2fdea4c31de932cd847358677d443ff753cf1c5e9feb182f888051afb9ac75735b5c3de2f7422c27853284a5171c10e6750a41e04b3d74b04191512f53e9bc36251fee3d1c58ceb12446461b06d48344396c2392a2ded3548a09c8672fd0f70d7d3705bc4ffa476469c44a5f9c9902172a6741c6a02284e9bcea3999c939a30d2a8517234a8737e6dca3172a51290b15a1be5d2e28714c1702ec11a90672b8f7cdfa569a2ea70e03436cad2d77a79a4f309ebc066050f08af6d6ea9ab00384751ecc6089da78b413b286cfa494baa894e7c271a0a103528b318152b337df6cca18c717f1a4914c68216a945aef297715e1ee23e0b66669f16407c089d1b661b106c95c84a6f0d09e644e29360250c7e7e4910793a97e7421be451f22a6243fe1f95adf1ceae0d558f23262151e3e83fb83aa1a676bb5616341050e0298e27ba6e0b7dcc9100788c9854fd94305a6a9bb0e057659223e99a5e37014a319b54a8bc1b8fcb818b2d145544f9116d1c7c7507ed941486ff88f1a1327ab7d5f0ec2610cb0c65b8d1fdd4032e9125e2be979a6f8bc54cb5309c83822fb1b46ec48fc46e2043d118f0478cd03c1bc2e10322252f41f245f2548f17e6d5b27c89e10d1d8b3fdfa4f1b0c8497e268418968515db5e705478405cc9c4cae1e1cbbb8eccc5432f64b5e67464fc1641f4f58ea7a9fbe40263f3ad5ec803c3fd02d16684a96238e7973cbbc9323793c1b1ddafaab2f444d4e201de7e4a0d4af90454e16993bea525549d5a3c2898187c533c5dc116bca764fc166cd2df22e8237455a0e54a456be563345f6cf44604c1d033049d67b0fb5b5a987dd6a43745187cbd0ece938a43d647c4774fc4c74084a0aaa7609a6ee8a8e8e9004ba37f518d778b78c74bf4859d03efc4a30db89eb57e4040457d8c75464ace76704d0d77c724eaba29e4cf7bdefe1ccd8dba4cbf5ce154ea11a3c3ae89cd669d1d21364fc7a7a7ad9f3a26bd876e6f047d720a3014eb93d20d08872b352e135828c9347518e0134db6c49b8ac8b263d46f6b86380d81ed57643a39222b390b29a9012f610a712a31ea400dd80ac1d0abc679001385f637c826e712e734c8da0d0f9e550846c4a1392cb084a83151337e0ce02b9d52bc2148c3c96535dc0808fba594073e3ae49919be2d7c543fc366061ccbaebd3a9262b001789b92cc5de4c0b4d9944b906028db1a55329c15da7f0c65886495430cfc762111152986e26cbf1e68c209989812733d04b8c96d3e498a57d628673fc8d633a1f6475c40c38643db0b24232e7b70ba7b9ee274876db00d03a76c8c6b1765902a0f099f9fbf9c23fdcf0716ce1381555fb44b5753ce9f50435ad69338cd57be9849c5862b033924a53aff3f770b5b82882a27da553e0367746368edbca1451105a40d6c771b81530708ac3a44dc83f0d8e0024a285d2cc60a95937c9186e758fbb8b8e3e000c8df2c2cfa7dda07e016aebf68146bf2f50ebb9d9f384cbd07a0c605b4df0d02536e898af7355872d3484cb63283235bf0de9904ec546067ce4a7730349b4b231117a73406158625d8cc8100a68c1a00977d0b74a2b3b71d5f3731c5923a8f6f4e3c4a68614ed26b5af5e52ff121d5011fba57a24a00cda962222022dd5843dd9e26e7511557b34dbc532d7e9fce175e11e1ef70e53759f315d165476408ea10bf9f4ddfe8955dcfadfe337cf5e69cdd167e3a4684543289a4b7a143733960b3fdae72e8754c8d9d914b67a742edd71ea7eb723dbdc29b352cd05cebc34f6809aa9b11aae8aa243052f155ad5a30e6780d0720def7ff88f2b1b1485e35aa13df472e5b80a0a201df5f30eab2104e864ea2839bb8013d711fb377ffffd43eca8d4093e69fab6973fcb17092a1ae4f50370a9c55b0b33063714340f227f0c388a70cff78726920cef5e237ffac950055c0561ed693349537e0a91f67f0b4b42b699074693c455d94710ca5c3685f8162afed875f308c03f21ec3333114c5951461e93d27233899ad4e6598f4f3ba5ca02ef83f19b8483883296b8b4b844f4da4af689ac309a6964cd1c0bb5dcac33d7a23d8d24e0512dd81fc4213336525b109b698c249f67cc8cbcfb9d06b31a8092c07547dbfb84ce60c9decdbaa0fcf1389a718d3d3b98479d04fe0e6919898b1ce0007b136e28c2bc4e2d2976969cde80a98c2a3b9675d75809c22ba5f48aac4736926033e1d22287bf40c13114084d384b08472487efe0971fb073eb1494613c323d1342184dabf4c80f381eec9caeed51fe002c5f4866d685b4666ba0936abac5124b51e70b9da59388b14322169bee25791878f86d469969c5592197b88d5d837503b39566e80859d523117c181355006d86b4db69c80e1859c2458e929ac991a86f46e9be88242822dc9a9c9ad5195a21227cf1e442f0712038c79534ce0080933cc82ad1c54f30e42f1892d240a75613289ef7a18bed291c99289ada3594e633351cfd390b9282d8d07e0a3cdb9722472b2e7c7b23c8200d7ca3dec7945036e4c39fc486331231f0349a50d7815750e235e80ceddac37f98c4490e3bb2eea9382bad9c1321c0be33ba55f486782edab4571dda3038bafc724242bc82cb8855cfe95d127a481c8ef2fe17b5501591f69b7ccec4d61895567119ec680618c9438f69e44416d54889a8fb8f50a904102b00de27b6755ce331a375ab651fe42ba45be13ceb169f1c77f4d16542ce9a682ca06f941d896fa1a656d17093baa3ce527f76383c7921206022d9c5073e3c1f0ab1db64c6444cec44ecf4339d9aee9a117f23aad230321fe91e634f405c871103a6425cfa20862b2c4b5626dbbdea8b19a608fbae91323864016b463fbfae5539768e7435d093e0d0d3a9b19f4cb9f82d59df738334401aa6230eb599bd3310ef6c955ad49cf15678255a9901567a4451b0356c7b248aad7468482fa531e936cab9e00f2fd11f30a938d98804a5bb5a6b5209c997b4342871a6174a87ce9fdff6bfde8dbe39dfbef22845d30039ac1a913488be56a39327121342e069f3164a1b1b14eb5eff180e6201f013eb635f8cd1c666e3321c81db8285659625261031d34cba4d2172a0c8c26705517a11a2404403e81084b4830da83eb1b20ad12a41537aa426f574822ad583f027abe7f922edd8471db6a6c739b7369f7a077019e14708c21280f33bf0cc4be343c9a9b3692ffffb76ec87378e33f84c6a9719124909e9f7832334f23379763a135375b5018fdff8f26d66f9600d79d770aeb7541707c500ad970e26b55127e6a3a40ca2fc5045567be4094ed5277df674c5b04ba59bfa5360b6eeba5802b60e43c96f68a33f9db2bceff8b1aa0f2906b0486e7623184aabbb4329aa85fd5db76205fd0de6393a669677a0ad8ad477a22a750be83465d6d213f6b0296218d4eea32110d68bd2347ae3319815ff4d509906cf784f1ef91f00b57d7e5f78043d2fc211bc756e037b7f984abbad52831f8d6b8deadac65b096db275c89fac56f4b5055b638acba39831db86ce2def983c199a9fe896712141e15afbb7e3db5906da355d04608dbba91bb44be74174007b37c0fd1ebef81d0727b492fca256a7abb3a99aa7ceff8b06e06f01f32ff8274831365267cba8bce93a17226310af477b61584bfb59dbf0cc68022445c9e382844377ff586c463b7a9bc30746ca66b87c1d7354999a951ed3038e56bb4446653d24a8a21799c5d08a79f3901187f80f9c8ec7ffb3dfe1ae04b52d8d953032325b824806eada4662c7626cb34b0453fe475f86684b0f8477f0cdf49e66830c56b040e832d879e5f92eb74167f21d06e7f00e990eb207027a43ac8ff12b1266cca6c1520e560c1eae3e13311897e2c7b48da5349e0ec93d3331c4abcfe51efd1b1f372bd419b5df1cfd8dc7048aee18054eccb1ce1345286b0cb4b2b254a0d8ee79668685a5472c25253ecd57f9de378549b1099f5513bd6588eee4e9587928faaa9577b1689c10ab973aa7a3030967e95400b14e1401ee21b6bc1d5770f14f23dfbec69b0f99cbb86e0b627e22618b8ae0f5995d1ec788c88d7da2db6c25feb917465fb3087c7c63d6bb7ac4de70404f5a63c4a11b52d8a39340ae7046d0560bce522b55496fd724111e037fe99374381b870cb878f2a30aa6d9b6a2854b7c620022fe045e1f9a441e65b3d29a0604ac983f681fe9696fa11309150877981eb92d1e08ec24cb999f8211d955e85bc0641ebe60a9950380e251053c3704734774c31fe2b3c950be2562d881fdbde3bc69a26ee5962dbc31e8fd52a108ff4575c5173c092d210c5c87dff750d5c23a2e150a045fdbf4d34194163f8bc1faf5ec41c82f3faa7b2196d45ded7c3ad4d7d8b49af18baa9a801582ce917587cfae831258c12fddeb2deeba5a3628dc7164b0a08b771568f97173e959dfed4f1eb9311763842e49116dca48360a343ba4f75a28d6ecdf5f7ff52d0258b86eb5df72a928bd0f32004981d154c7f576793c7bf7d0a436670d5408357aff4d24e8f54a47ffe077a2f8d75fb06f13c33a771ede8012060dcfb792fa3dd9c4d308f67be25cf91158a5eb35da18e34da4ba54bac375ad3ad6ca9f38e7b87f65f3039df98f9704fb2ab602ec5fc13f7d63a5b517d128298360f2c76287afbdc6f13df7e15bd86dc7f5d8a9a63973e81eeb0e322918f6d297bfe54b3dec6773ea58f596a111100f4ece1de560836bc9c83e30846befb0bad501e5ac15f681f0b29ceed312f5bb05dacf2c08624560a15862cc31988187dd1ea064e855d8dbe4c3b80d2b7f5c166e166cbb84b8c966260557501b456df1c27b9cc2a26eee6a55cdf11d8e56127b8570131973b2d4e1bb0cf77557b3b46a6287ec693c44e64f362c2dc1947c0a67d327afaa547c279d770dce4cb91ffe548062f7da0d80e9ff4a09daf4e044e5c47610b7a23f61e30aab2636d3b349cf94a23c0a46ca8fee08f3fde38e3d710c5d61e77a949f5dd2c3a00b24344dcbcc3e6b516aab89ac68dd28fd540028e99367ea479a8a3fdd701f79bdcbede694b9bdc52d883dc52619a4c7f4b5b15f26c6ddf4b39406d7d7fd2822f333a0bb9265f53fa279517f131b707a4f78d95b2a6256ce2d13d0e284db7b1b48c815f5765a176a52f656fe7b13d92370139a3829b39975f7dbf464855f4e81c68962f4799713e2ba3482d27157690afe465cd809ad85b7e675dd26f20e27e084678da8109a15ce648d3a9f10fb9d20ecb767d2a934de2ddcb495ff5635a27a1d2a6a052b904874946b247d591fa96f0b53bf1650e84bc0c286b2b707f020e6c04e84fd93b80b853b6330b4e2ba83572e254cc0cb896cfbc9970c773c31109386d454f1d45f2da9b01a5807cd7eb6650d0c805c600bc2ae922cd15a74029f8b6c225e4d2fb00e4d5b9c47c61d0c6042bc52fe893f303986473587a6c21626d8cc65b5e6c6182581a054e9482c39dcf1f88376753f16d59b749b8c703c6f1beb559e0614dddbca13a5fb6c0b0257c2c0d585a23b3be49b391269a04d33ff12d5e191160e954c5cb120db982dc170ecc753677dae1a94d291eeb542e068ad204937d2e7627295507f03ece6b7e18ecb770a8ae1828073a470147109e3c9bf1ba99364555d1ce891b094a79e91689c7c5a1fbe2c610139245b94dd1992a44a4ebea8593d1fff217b2ed45b1962141837ce21dd9a41158e017f545881aebcb928c809e61c90488744546f0628df6eb1f617412095a9b96898a7b2974539616ae55684b7b2233cdd0433311855ec25625349ad54df4b614deb7dae2a3e441380e4bdc4b127dc40c41c708ad7de763b1978d2b6fceda0fa560df597bb1beefce1b6fd533add2c558807f2e87b9ab7e380ae6dd5457e920d59ca405a24df416ec9dc65fa7bd9edde2ff080e81b588773b1819b173a146845224783275713cf477498624c24f59fb0902f061d5aedca94f53e8b0304ffce44eafc8f4e2b2cb51d845bba3ea3e7947c0bf456ad9de331d8e9680676610d52bb289f55ee118d9854b18fa13cb0880cef4299616077f6c49e507930021df64719a8f1313d374c2ae2121d56ba80950e4bec4874e87085db2b50e02031be314ab0214a5ce328011abd1233769f2056c0b820cacf93e92bebbc6365992270c78ee595e97bb2e3552b74251a15cb4fa0f22f489132b3820b98f00d3c4dc8b104df9130008f43b6a408c2043c54f4135ae162d30b8fec9a61ad0449a7d871187eab6b55f1066bd8ffed4ea1d8ddb0454ede1b53eb0c56036030449dfcb19e9cf4c58874bb7c7e99c3ba5dd036bd7d2155c786d66abf2ac0da938c869cf386ed2f0603ed6f3665c52c5b75e26e3ecf8e2378e7c1091618e38aa6e43f2354e892b9c43e27e00fc07d1acf6e10a0a3920642e0e95671ece36d29ee0932a71d73842df1512f4b645fff8dc1c4ffec189e62d32544ec9f2d71e11afbc975a861c267434a56e84b866ec7e2ad61b89e14e4ff0e06c9c1d081445d4f5c4b32ac7135634cc3f3ec5de5f982a319f5f857907c1d229f7868b05c380aced9f758a76065d83b12587b034405936b500553158f5ac1bdf633abe996960d73e16b7cffc69124203bb4eb6db37fd2d3ae6a23c7e0ccbc92eaf9e9993f5bede73a4d8191080b69c247031c2da591004a892d9dd62f3ff3e163c63ecd41907480b15f291bd9f15921db85d919b12093c009d49f0c041bc40a31828ee468557e16298c179e804baa23df6754cb07fd06e32f3419d153398a992ef3244cb33635d8908a0e2a0428a0581c07b082b824ea70f04e74fc881139210ca4424d17bbe9e2f05ea59222e890472b90fa9e1e20fdde6d00e61498cb2a981348989d8d5a72f3b404eae6dceaea4d53c6fda6c21923647922d326cc01868c267b68e00c0e4aee7a1f32028855a3f0bf9fae2a4d0f027d9824c0240c9ab37ae6cec21a3658ba1c3825caa7fd93a2b6f9fd6dbadb9b5ca4f40877271e64a3ddabc24b78260415def55ed37ba950802777d12be92fece18ad8e1153fb09de81ac0ad0abd28ae751f6a90a99d106ca5b75839f0264188dd98daa69b063be3308981d5e6642ed37049c0a72430ae97865e5cc5400eb7a0b34a51d0c7bc9c5e8a99dacf36caa9dc19c055aa08f173cfc4973e3a082b06053116e2cee8598d401207497606617fb053a6d8a364dba3f74137864c0f07e4ed37e2747407f22b608662ffe9948853334292fa8e78122a2542eff20cb598c0c9e55049d3381b8431017ce970ea528fcc3262905bebc85aa442d283fdfd615acad81156c4841f5e8405fef0cbbd0d9c9c964650a0b162f44a00338c35fd5f48bb06a3fb3d96a358b5dc473e645d2c14e629d24f2cd9f7c507fd6999160684240312907666bb19de17cef4d75868a232a384330e3582df19a9c9c7c0288d2bbedd6ae409edb2876d1db6aedb34a63dc064da96bd4b1c031b9b00099b706d318a262d6db1696fba193e3d8db380794107b00a2c293aac7f108e057aa2e0a60a1118bf99db227c46aa84df21350238afac5264d230a0eb0da91abd6dd33b1c8d4f4242a3a1adbb5ac54c4d4a9f3ded0989549db94f9cb40cf1da78a9cffdabe4c2dc270c59d5001a26ee99539263c0335b2b6105cf5e1c040cd37965d635b100ec86d70e41d01dc0e8b8a114f0197afb574e36ccdf86c625469c4ed4ce668a4bd4838d45d08be3590c84f96c658898c88890d3545abaeae7e92ae7e1daee86e953a8525ae9b43345183dca5640c5b9a7638f91efeccbba388039bddea3bf10df4a0e4afffa390e9f227ff18f814fc29d4298da78f1aa44c541d986e2b564a733cd758e0e5278aefd7d197b3425fde355453fb3f286d7c7aa725f9f1dadba101cdaf6cdaf340de3cae5d9997e8049205cda2da82d18229c8450b04168029d4c2b154242d89126bb60addf8e8aa3ead6fc151c1090a1e9451f40946bce5d0e875f059f3b6a662cb3840644c9f3b1bcbfee4134bb023313e73d6e087ade5280c594ebb8f692c6a1fa149054e91f3556f87f69e6fc714907e63d0e5c790e3988e155542b369559815d15eec6e9bbcf3135209eab32744139047c4a4b8a099f13532792bd43070e6b2106c72d9600445f09bc10620141b954a1584fdec7777852bd1a65b0920bcd3e9c7354b1d26c4181f1138bb8141bc5731fb50060de7e24569f49dfd382d3cb88e899e4e747be59f90051c8bd0760eb8107aa830d287756a13e64d633baac61dd8e781e681c8ad6691dea5589c53e5332971568e4bcb292a6f01ffef7f54e17a728348f68fb0ecd0825680a10d790ad00611ade2c209b217001ee66d85f10b9862506faa36100b25e101cf8c245a3a1c62cf61f17baefa16a3474bd725daa9854317cc07beaad1eb6747f1b3a3b1db6d00c34f5438124ac63128d0c4acd357f4e39fa54bb2649f4edb86eeb9d6b6b374d51cfb22df38555244518aab32e6247582845aeb82a8a57c77956a36806aa310e1084cd6a4ca861d4383968d90c6a49f98fd8c35f50e39bc0c7e4643e385b9cb165b3330bd86f06ae3182c6cfa9db4164703c40dc5bc73bc63dd53b9b0127d51270d6e2cb47e729c4c61e6743c70cbe074a40819d9a5cccfdeb3803e5c70088e1baf0dabd4bd66b34b4015f3c1a590cbd461a71f7ccc95051e623fe831ab2aceeb028d38da9bb8e8256e74f8d6af2dc6e95813214740bbc61c0d7e725de04c565a0181a5216183eef0dc92719f0001bf9cf5d7b0fcee822f6d8b32107e0b1cc0aaf8fcc6203cd48c5a9328fad74f82b139deeb0b01e9d1955ea1ffc5fa1579756d813fd22637986758d91b703510fe8d9d522f76edfb90ae3d322b9fbf5d5e75ee58ff9b79559c1319322e5cd8f88d2932575cc720dcc873616e28cbe5d20324ff3cf64f274388885a9070d6f73cd2efbae3b29c006131658ebdb49e14e1ecf24c77694ca8c50026896af4fbe908e9841a777c0261613339e75b8a034bec23b45424dbbf89e15c761a8219b5bebaad083531ea640ab031fcdc1eba622301a919bfe907ce3b9450903333def5022f13e33e87a89c12147199a263f59932e8f6142bcc8cb51fef3b8cbb0cca06494ef94dfa49b4ef0154369589c3d8948108ec887d62e2626b545d3375aa1eb552bc04603f136bf47c6176c42c81024f04a7ce0fce747fbf4b76697972e12b60acbcea7b43885b1aebb4c19839099b2a977aa3f4aa32c27a839b1e801fbf6113f94b6bd2b77428d4efb4bd8617e8c0fa8e05d3b1ce54cdcceb1d8799472389094feb0b4f7124aba95cb0cf970f3ba9f7011e0ff115f04cb4a6d37ccb8d2785276c3f24b1a9afb92b6546f44725d1541850ae5ddf58460b6c2a02ed94178b706112b12e0ed2f0abe30fd30d9129424203e1233289b10370478381cf1f088fb2472b097ac70b9c405f8ba220bdc5a8c501b2aee8a6fda415682c06b3b3d027a46006b1604c0a780f45c36c5792e55c1309fbf26ad619eec3efc8399e618ac9806cca0d7bb88dc4a88342101de4363aaff9ff8ea85939f34465bf7900aa4774b24325130ab183f58bb36ede6642932f247bd2e382b7836c03270d8c1ddfe6eb12e90e6cf7a84c0100c62c1e1270c0dbaa15924a4e10c6525511d7f16fc6708b0a6bd9a0405ec6f21b971c05e38b16d662a486e062862ce56effb3dc4370efeb7e0e31604a1f1b12b76b421de885c282eaa5f5d125f273be52c5edbfbc248ae0e13253ae3285aec87e5eee5d91b1b78d2b5215658be5e10c7a124ac6e30146ee88d844a7875fa1162650a52024a5afb1fb5a278b99b03df4d2d010ad7b1d670c8f28dedbe4be87eb4682650f5e63c9f3ae4909ef2f6c88b2604583dd366d8000670105c3be0b119c17bd7ae7db9c569c34b455232bdcd1ad65db6def6e605049d11b5fb597f45a1dc2f173a96b0b1ecda1736c13a516355816c95506e387aa8d79351478e94ade363ed5d4d5a2b4989e1af8d578b932f826bcfa5c4206b5971c9e77131050800025e15b3eb2be5cb1f511f2b16274882a481b13d85827e46aeed120a90d58c36f2892bae716ec741e66ad4b8850cc258a147f7bcf4255b18abbd60772dc0fe909a55272225ab690df2c75dc100a6c456d8ae1705e7ff4a69fd106e50f148f7fc7fe4446a982ebeaa580b07807305b00789e38dc68ca5c8da3f52ee9d92dbd468e157899140e654e502cb742af1f31577b76ecd30893bd08c6373aea343896364a1eef94ab79c00773a855e848cf6dd8adaa2d0982e2c9d91595d1986df402903cbd01774306432752bd2eb80742b4b92a7f5fd9d7bb358a5d3d08d38f98aa0128bc914cb7135cbc6cd3d218d19077a9b6f270be8452ce58551d79f206aafbffea74ba3c72d82660ae14d37ccf71e796619f248cc2864759e2f9720960b6b2918706a1b8cb4d72d7294f91499d23f794dc52836444831f69ed921becc6a65ae36f0376cdf22f251f1addf39879e47cabf53ac5dd34f32ba7f9076778704f3fbc6b0485fcbd022d4173efdbc5d9497d42d370d9d9f9bf9e1fbfe037adb997eef80ae2ad0bc0d34fa9dba87a23143390b02d513174106e9fa07cdceaf75e22dc0d44e89844d2558f397e2014e66e24dba57dc09664102c92da95cda239b5a981234f6305c164c8f6e711102ca4c5fd76cb4947e896913c169d98380fecaa33229ef0bc9737c0635fd93b9a7c104e1e54a86693ec567606ae8a918db1748e72705d1f9954af9ecc7cfe40d755b77030fd7deb67d6ab6ed95b6e7b7fbd5565dc7a4dd3681106d7f1008ccdf7a3af052b2fa594399a14647a9a53325fe3677da4c157320d85d5913c20fcbcecb823d9e60869f642298f0f8878aa10a2dd7cd5c9bdf60951c2ca331ad77bdb4e1c79daa1f7b33008068d1938ce7760804b54a38731364de9d45082aad816ed4bec8924dad5cf0e00d16405248bc09ce590b3d6818b2ff5220024285bee6e2d8f6b0c7aa9a837dcc8f926e09825cf5427b013eadaa823eea9d31269542c61f344bb1c606e1624e09553225e4564ca80325048c70cb38af521d8707a723faee0469c6516c56c24a4309b83210f80e00f8d153c53d3a18a8400f9402348875a548a92a05b052da260eb6702aed8e2be40466222019bfd585e9e94c32bdad487d426c8947f6db2b60fba0e22319cf0fec4d05be78555abb9861648cef8bae2f58895a5f7a9a1d14c38d4a8def5fd4850dc3c267c013cf31da5b9d4132cf8da93d1c14fe3253f614d2543408f137d73c141fa083629ecf05a03672c8212d4f3129cdb0652f24030d99ab0644c18c24124c53e8574dcb36d433918bafdd59da5b250d14db97c0e5d50c200950273f02297a4199142cac65d8da18e846c7e61be8eefb2360b67934383b81dc9f8b68b935a09a9f91e5fc0b43f96a97d67bc71fc883e998d8497e4ba5e1d9de8197101410642f2769ce08c7f445c88cdbf3ca3f26ceabba1af6abddcb1fcbe3b29bd40d3cae926d8e5324ad70d9f63ee508365d0d2067d3d45a55bd58bb1b955dfb23289da0e684d2690381a87dc2abc1be33ff32efb738b76fdf70315958015e2461dfa90fdcfdc7e59da840b0be5f26f3c789d09d60ef93f18703e54eac86075a6eee64cf49ca3e977081f9707711a96f33bfcb42e09cb340b0999d1998cbf2b251cbfe0f9ac977ee4a3e8a8884d634f35f18559b03f0f7a65ac8de241d6c3de80cb5f9c8c652bf1939151eb4bd91357d25fc31059406b884461a8d7030066e45b3805163cb4fac61dda176d6203180e9bfa4b2f9990454c92ac4ce82885e808a60ff2850f4e181f17ad6dcc82900bdc9356d4753d9a0481bcaa2329295e05cf0e8834f09f480aa0ed42ab6ecf4078c92ef623a9d38e9ce846b109c7426287d832e29e66121451a0ea1ca9974f4eaf216718dc5bc855f608002850b513d5e0983b8d2b388c59772948520b7fde56690c66015d8ed9ccc061978a0a5ae88a1aba0348aa5da98d8ca68d074f1798735d13f4fb14f9032b8e95580c410883d4cd087ab0a5f272905a07d6e7191295f49a14a3e87c94b86a3e4a1120ecaf72ac287272b5011b17455a5843d1a5fe18fbf585c489ae7389b9d4f64170735add806980c31b0422d03329faa097d85e5b8f95b6081af512f0615766d90937fff9fbb342180bdde34997ad7c275993a41660be04ce388a7351fee14d8d94383cb125ba257997a05972de67d633f062758e5d6ca02f923ec12004206bad5762538ab45da29f3d71c8a6b58c36a9afc824bc1583e4b9d04d2451632ae02fba62e056e8d6267daa1850e999bafaf699a3baa01030e7e17d26dd1e1d4b90fca914949e4530f36a32c48754382b02af18c601b1f8b5d8f20dd26213215f0b3457bb0c3abc7000a89360f25d0891bd6c9ce1f34b541945389d1205cdf81250062926e64702518f4d50a87b5c0f7c153fc4e6b2de0f70341aeea83345b0ea2b18ee21d427a71048f43e67fde21b881a3bb62e5343ac4bf5942491bcb638080fff4e5ef2e209aafd031c0b4abe34cd96f040b45c6231a20ccc25f2015ad208b3973e3e0d0a45134675d8877f74318135df48bd4b51691c524bc61f4b45f3f4662aa21c2415fb81f6ca8aa52a4c91fc12fe6c8e43ea8db615e6e340009705d7a61c0190abb102eb55d3bf054bef3371be79b1466d8e788e567cd5838817d83daa0774178f4391224d662fcf081e267d669a8b788aeb013a0b5cdbc82261760add291c42b16e4e500966c1e0f7a03b0f58af0b61ebc4e77808c5af4c68c41cd56c27f11cddac3959be3f8248ca0061d3d8ea36b957e3da81793afa4e29b3d170ac70099f40ce880dd7a8080f085b1f368f1da0a076b838f36413d9e5218fdf6f7532d771c3e4d8e90e6f06c7031e9be8585c3fac41a6029599d80419dd5b893d64f2a88c19ccaf4531ce13b33d060fb6d9fc07a0406d864dc08eb6a01f64a68b9f2f51458fe50d4411858f59e441fbe1cc2d68b8928a57579c858933e51bc717349a1be842ee5488c2899588154b58ba75a95a42b265633b1252996606e2d3fc4a81cec6976ca3cd5968f88af28fe2d6135a6734997806dbe338a497bab83f064c17385da75007986ab1462bd380eaa515b8260a5be49e000d5f5fa5003fae4803a4d08a015940e7fa16be740e3601d7f61bf8a2f8cd07ac89acdf67b7468c0136f50ad8947a62b7a5ffdd35e001be051b087f470e34da30b3b7c5823942882e4f7ccc74bbb086b22eacd4cdfc13d551580a365e51b835065261429458d06fd8fab8b1b5ea360f76c5114af3323ba1fe2a1458504a8532aa00ae431ff3ca5b0cfd42e4fc85809f20d4eed0c7f05bc019cdebb0bc15ece85e1f3d5d5508827df7ab1a8eb9ed27a2ed3f7f355f45420df5e73fa393a7148f6a40e625cccebf5c4ce22098920bd14692b218c844017f8438a8378c8ab10ad18dfbd76df58c56d0f33ce90618599781f8bc53ee897788d210cfb2fe286df55b15690347073727ff544134914269bffc1919ef2319f02362289c00cdc1c91b564a4bf4122245c9b5b3ff21056898bd556ea13221bccd545d2c811e5d8e27b9240c8cd08c86eb65df9fdbc9aa878024443c861a2d348a36c63841947c016de714326cb4a12cf811c9cefe4de0dc4642d8d6699a37fe88e961bf03af88c264116a43c41278d5f98fbbc984fa4dcb876ef3cf2086aa2ec811e1e9e106591de45fa09e6c82d483ab739882616fbd23314e7f7ac73df0e86b6768f47597c76eea13517828eb09a5b4ce5829a73aedbdd7b0024e4f1741299453823121dca3ed66fe24a577c21c027421a35db30b302e4e50704f7ed22306e5787d12db50ed0ab88b8de663b80b44ebc199bdbcdaf86e7daa5bad4489d1d2aba53498b4267ff1ec9cb60906f6a54491d0533d7a0b602fb5a00420ad1805355eb5d7c9bc7b975b9abcfb0688df3acd848a37962b39bce80391564cf8acea654801853ad55d0e9a35e83be6adcf1f7b2b8ee4efd348b08e407fc7fd8bed2afa0fec8c5e6f88c9fe5255d2ed0b090d33a718684d7102fcee45df4e80d3a79e1350e495d2393a4fd121e7d608df71e606bf59a5402aaf786e127e0483f0ca9ed099ca967fe9b65aa27bb1ddf18d2ccd02580d62b2e2a7cb6c59ee502cbee7201a018ab9e0809d21a30d9077b22bd2fa7b87e583a9b10ca244419c98ace225b7f0dfdee5cbec03d89879d7af8c814f9479e01dde25259f87d8a38107b19ce427b2cc03b438927251dc0dcdbedf3264a89f4723ef8280639905af863e04d0e48762628c1ce2eca39a97e7aa7810c42befff4ceedc203a8f1c2ea818b87f056496b0087d94d2ab89c72dc3686f6c1fb7f0e13c96c129483660e142bcab5bcf671bee90b3ed95d4ecacbcd967d635f2e5311ff2c12437955030670318370801a2cd1879070530194cfa4c8a214a0d372af60144eaf90f5b16f61463124e0853396c211f73703232f54113b9b5c537c00028b6beffe1de27d9c77463d7815e04fdf07e80bd2c8b490ecbb05f9616a0d164dd66f8024aded6b97b100c4eab7f10674bbc6699d5326dfced3a8972a43dc9f0428d00d56aca91b349b64dc4f942fa0b18d04ebd6b58ea26a0786a6371883d66821b995bfb94751d88fa70700b9b908798fb93828ad4825a6a477137c218c53cafade1c24fa68a320e863b6e58af3669d914dbfb18a4ad5e1108f27d173a3a131e2a00a017044be7a8515670241fb1d4a258addf698cd74e6f72da771363b0e88b4ddc64e0bdbd192e16a7cf58738410e434e821e8510b17de267581150619e8e59c6d421b798dd7385aac61692d23e7b22b5c74852fe59af38f9fa4872867de534533bcd8d612a5755b4b44a65fc51528aa1fabf076444d92084bac2d05c0ff1669feffa326069ff3e178d951d87d8a6dcf93f4982b8e382842b3f6ab34d155b44d3eb91ee5d4cf802ff25292f6ed22d229d4c54e8f47c74c0664fdb5d64e9ba0cdd9ffea4f233296377bad104ef191f710a4f7645b9f8e2e908ed871c737e519d6147a20a44e287b4e8177014b734103e12c1f34ba4a0f997337a9c0ec4989dff7f11efb4ce1ee68c5dbe0269133c118230f9c198ca558c8830665c22951d3bc8dff37a1d767312a181825ae221b0f5e192ad1f13835306e84fb055d209ba8a769c7a8a8d91326b869dec9b20bea154fd370e1e490c16adf6236611dba398234130824cd71a30b4bb347942fa31a4e10635a447b9668c59252288f557818825a8e7844633218c435ec350f5d31eccd27f254d88ef1fc66fb297779309e815b09efc89ae0c8861c95f087863318f9b30a0950084bc201d1588a8cbc116104451408428118320de4a414b23258d055b87a331d9039a050c3d1dbffe319d8692b220d0be8facefef82b57fc173270b3625edf0b00a2456367c9071e8e9895f8359e3363c011e8a5075076b1f43a7ee5a6ae84c4a9a563d62db75af0ea10909f950e43132717b0c2e437ac50da0b1fed7f183eee49e55d2f0f448e5a00e44d194023e81a5838e6802f758e74532e28f7da43dabe92b9773ee64efee38df188885a52a9558aa8dc42163d46b1000ba87472e9e61d8fb4619c5ba96aac16f4c4df731260b8ff0988effaed3d06ebd10b3862a3fe5a7ba57ade0b93ecde13f39901b71948f98579b487a1079321494fe42f47bca7a6b178619fc55ad1294150b3c2de93560b5c711a1d81b44d752046d1ee314c3520e31606983a46adc7749e06a6a760a353bcb8775bde2ecff511daf85dc3267af07dc73963db5a89b9dfd892b98001cb5b9d51810e5100a3bf72392587ad3f389c8e470f2479911d42aa6dbd605504e522401120eef5e716656d3e66b83cd54ba0ce07142d0f1c97abc8c435d72de48c0a1f1d5170cf5cc9afc7ecf346f0992ab61c173d0873cc9a1304b834176e824b68153d56b3bd4f333c78ae26a9bb41658d77cae8cf09bf56d726d1a07df16d3a92f1798540e6606b23609f803413d403f6aaccb7edbf08bffbc16edcb571d6608d0ebd395b86d9a39bb26f150ee77a3a1e1c3f989b1b9be78fa705660ea1556aa3e152db91509d039756050161afd41bb4b18012a09cc20297bd97d2974f36dd27f0458565f3607ee192fc43274826147084eb79fdd5c2dba8de2a4f24b837b07a3c52ea74ad725fe9760bb9bc5d2093d39080dea92b8d8e0dfa4c15a0b271fcbb0d9364405d216ab7f07861f3e544a88e65c8d5a452b10705b9bf3333f637cc2667e1d89e873870265125f5e8660f26afc3231bf8fa8200b9e387e18bb0d51919300b7fe3d4cba25e38e20dcc3b4f095ae4270190bde45a51211206c1624f44180645ea29342f181a21b7521e815eb09cb1082ba453a51a27a511bd40858232e89de8f88393cba94dbb77adf1827b73de86a554ae8537dae61af57a82a8636daa6cef0cf19c04edd6001d95232af5df5b5cf25edcbcfc09a08f278458890b4d6a6f5328f73f91f0b3cff502f1850e9b207084f59486ad1c6ab1a9a36bd847f09e1d562e30c580681385a440508864afd9290b03088212480f737b3c14fac20d31b59f1dae9c50e301ea6cd9077e13f46d36acd1b1c3e3d782c1a750e71bd37ea66094f4871f142b2946bd1a0b4e7b40801b96b8fabd650929f40a7b10b7982ece6c566c6985bd845be6bbc2bdc844c04003b7e840cf46398ea9e8c863fcc3e8a33716bc863add63cfb753dbf1da4551a704bf526ad5148db191e348ad737b15c44fcd80a65321c671f08c1a5a617d6750e05e3a2eb075a1f5cc24462cd13f11678afcac86aa523095b8f5855961cb8f2e1172e0ec7664cdb5ddcf07759b1757008b13961358c0e191db77d1f1b6c1e787fe9336fbee3e74977fbe740de5ecbcc3130aab8fd24314cca984658d12551afc260256fcadb4d790dd9ce68ad124d8d479e802060510cbe2785d520ff87b770a5efc0c1a5f338ff32c0ffdd6e6e8ee4ca0ffda9ee35fa3117f0ce7cdada323a824466af58e494103cd2a22a6daedc9c5341abad37dddc4ea0ba626b0f4f2558d1a6d4b2c86b856d373e741d1d120744e3aaddbadb9955c41c7f58b31edfcc61b4a258d36695d75488dbb47e85bb1bf520d55a60a16c79c3ceabc4e782a91e72dea496138c4140d2cb562da741c34bc8350a0f106ece16101fa593884adf51bda6f7bbe79c1ba4ca697f0373443b71c5607628a41d041611eb7879f9f52eb7e976eab16bcb40a7c2bd4853571a87cd66cb6ff39d37a4481ef2d47f5d0c153487b7898d882325f3fdb075985495a7ee1cedb768cd09aa3206a8604e67a5a3f292e6525baee4aa201e934760815f95e6451967e2c9e7bed1aa272c04da422ae233b510371c0de836a66780028ba2dad60dbf634c67547cbe06fc9f62377ffb8895b51aa98df42f9615094680053c60287da0d445e8e23077e94122d6189f217bd47003b3a68ad906cdb35f8ae58959026abf14f7fce489f7e5d739a4437210d716ea377bd43ad2419f023eda4809812f5f4046c024115511a500fbf9ce552d20cb6fa77f67b33e8461136f11b31da156c9f000c8aca37a06a2c7df43c71d607ba5d4db33b0271386976bf4e487a129e8a2d19f4fc866512207d789b47e983347786a278d544cab4d094fa66b1e7a93c30a37683e7307899b8f08ad1c3596a921e7c5308ff7b51dba094e6c8b22364a4c037e5978beaf0e5f4646f8cd9917af5cea29f3132a915266f10b1aab2dd1dea556f437145af0eba60e9b3dc190fbf41978088471ffa6e84c64c46018894315933bdcee474c3fc0c3b1d81fc140c75d041f0ca361ef1e163eb1c826517d9a43c8731458f8bc47b45050fb90838572c09eed612a6c4172ca6f03d9facd0b2b8b27c227aac59f1f8c45e9399c0b29b3cf323e101ec41c1938cbed58e3c51890aeb166bb83a2cdc1d889b01f569827eff38bb93db16d942e690a7210d38b0072ca0e37e96c0a2bdae85550bb7d16228c5e2e88f8a71d35ec0c196f46fd8ee7a9800e79f44a8a9263485a7c0f1e688140460813ae0a2116719e4d2cb0b6da83e2b9dc9ea833026dcf67674452bf6aae334500f5a30843729b340f31d6e614152a4a18c03c7a7ea9b8bb5f32dc817ca105713a90e31b42fbb0ed014c06835837189ff72031b10555bc575f297bf7e66fb984d1c93ad796493b4961e9393b5d2d4320f85cfca01799e7c76c0785c406add50f15e328c7909b8fd2b8f3f8d58e04337a07638eb3db7f01e70f00008028e2f5367ea23f236a31d85a602fe0a02eaec593b5700c39eb12a138e4262d37ce06c8755ae88b657fc084880f8b195c8610c911ab14444301d794a99cb11aa4a2eb90def070bc2c25427b1e8706c0a397c7973602d3b6b06359d6e704ce029f0cb0b920951de901329539a9607a9edc1928f5e67db870a901a497dbd87a5ab0187541822b46386343e81dd50a60bff83ea101e9c8374304c6a721568d6a6600f299041ba91a04efb848a5895adabd6a74101bb21272784c8a30f33c833ec99146433639d507e2ffb81084dc3708e09b7c93a013cfbb636247cd5641cab8ab75f38b9d651c7d03f0340a3ca06f18bc5303a2d7006192c098d6fc1e40edb846f2ad1b7b61b9dae53b23e02656bd39d002f46fd52153ae86b54059bb6f878398ebfde6c8be70567102215e582613b2a3212082e2793480bb9a8926f90135bfd978a251e6ec857686c9a0a8611b59e0eb250f5b7c308e68e20cdbb873f6c6a5db8d4c37b1d4c5ddbd8f1a964a2b77b1722df9b0e90b7c61074f87ead9bcb281d5c9980406fd1327ab20673bdc1d2f1c7e58d9e51513ea23f28aa9235ca9a6361288c6e3213c3c9f1b4787ab91b9a97c1f54b089bc9536042eebec9ae9e343a5d00d59c3410f2248860b6e432121eb5cdde68fa0da90c85c91317e8c97e09c5574bda6aa3de9ea78b174800458935842b271f1b2bf9ebf78e70df2f01047cb16735c16b51d629d626367eb80ba31bf247a9a586faeae4c72a58e3ee9b14f1f9f59e633ac25873f5027aaa6c3dfc9b4c2d0a01494493d7d71fd4bc8923d84237999c8b137a28e0d443f2465cd2f509e28c02ba1e1736a6ebfb26796d8cb9537653b0f71dfebcae825179c352e04286924083f6e0342cfaa10369c0fed7a9f6b5d1b85c520bc17fc1dfd7b6f19e01328cfe33a1524eb7769bc48a19c90123da8119ef5a9ba54239483e8e04dda18ed38675164a2674b174f8d80ca5e158fbbaa6e8d4166b732b1670833c4835abbde657e8d366b7ed2063bac598a64253ee0890e84ca074d233dc8843c87dec5a5a31c3b29649a6bcf75f92bc1db6320e281b5608a5217718f3361293c68b2cbd9ae24643704d78e210fc6beba7f94c92788aa943d418ac7215d0421b4716204644e57ffd099c4ff892ed6e3abee84429c2bfaf4c12ab170dec3a932ca8cc3d20c3f35ec4c50e30d2b6cdb977c0f23af2e497ddde0ac31d5ad909ddbff3c7274885c68ec1c4805834c70a250d69bfa6676788c328448bed3170ba681a745f9872468be888f9731879eeb9684d82e6f23e0f449528ac828b83400dc1c0f138948e93793383472ff89ead3a908db8caef5392004613faddfd604a8657c31fedbce34066546a6ee2d8b64a66542196aefe2d7236ea41eaa6e4cd49880f00fa555943d09138d7122e318e25f77bd29dd6f1da0305cb5664e8e09e8a3a7241bf6572399d05adfadfbd22010b29677c30db53f60547014053f4116059dda96a6d5133a0d37ec6dcb1fc18f5905ff7f82eeeb2a9983a8735210d0cc3be3d19e17a543c31f2911f3f915e8285540d8004e8fd5b9f14c7458b35b9409aa005e61f04503f90d59591e2e737e3043cfe9cf7b8a02c61e228c80b71b88d7e590733ce25f38c44ba3dc4d223b3be22c9b5857ffcbc15395e74879fd603b3ab14745d74a7260bc78c30cee9e0e6694e7e0213deeb7b8c812187ad44e1d3a9bcdddfb509c604a2e957b122fd08aaef1c5f0f2efdaacce0e7b353f6e9671193193c1f64fd2e0da0f6e3075d6ee31bedd7b670d6ca8ec1f9a563300f8db8ece3faee1d1f94867b364e0bf0f2310ac137859e80989729a360d7a7dbbbb2b7e5cede627b296aeaeba9b3fa4b379cb5d4476b403001cd4fbcab99b2b78bb6f5ce05084457c91040b837b7e9a684906b8606d39b35f8f0327720b6e49c095e322978e756466630b1de94325724fd53caba7aed2d9a3dd5bc377910925fd0882e62d30e74e90704c8ef0dd0d3e27db16c3b583b4a3beafef563898e86182169eab7251e077edd5ba525cee6e763360c174677cb34ea125d6cbcda0c424c8b735defec7b86e1c7f6bd53e1787793016b1a22c270b7856da9a3b33d84673a87e0046e910104086b12b581f80c00fc00541190b967151fb4b4e6886c93abc531a38c15852e40f3c3f99c1712bd665b9bb752e81df4ae160251592bce515ec2082a1c8407a81039d656dbdb2d19a696d90fef8b478d0ce2068317ff9db22aab09586b0e88c1e2e32978c0c25f0d4bcd1d7ab4614a6b195cb91642cbc943e18a0f4e849615679e3baac05fa584a9dae72da7f545094f6b80d263719d034bb5a5a1545f3547e44deaf449fe325e3d8deb08ed80f058b3dff6ae85ad46230d8cb82671814f40bd35761a00ced66bebf33b70fe11b1dc20b25b3c285c6f66f5b840c002dbe3b8eb05f7a6a1a0fab6580816150bd8fd8edb96a33d338074d015b42c13a3c240cf19078d3fbfc7f68209564f767dc2eace636cfe4008d1f22d2b2c889ad846dfd32da9f5e2606ee86b54fb39a05695bfacd81abedfa919b600bcaede581c9b49f7387c8e65ea5675440dccb98f136b34fa5661b41730ff89c98d06f8737b64623953ab2bf4e4cec419a8cad2588f084eca713103bb02cb81f268ed343dc7666e78b50c5aace070b80e1fb6bb15329100d0fbc4540bdc0681cf5e8869cc7498291c0ce58eb180b5f94880bd2946322773cb15a006e58cac03bba9eae5ade3ec5363547b59da41b38741a70d94d6d887bca98e7622242c14dbfbd0cb89387f26a407ad27c82e907c3a333c12010681f195e9e6a84478b04bd094e1555b448bbaf6189023710cba82165ecc6303e5f725ca92009237d1ca09fd85d794094790e2e609c045e2db4e209a8210231fc67f9ab2f2d5578563356fbaed603e09d1ac57c919a1f756dc671148c19ea5da30f8503262e256f1ff96594469a08e8fd5cc5d4d96f0bfbf443df9bcb3f69ff36defc58913a1b9dfc55e294c0ff227c4a4cb463acd91261a69d79ef8b48149dbd7a9f243bf44cce3bc3f1e74b67e28a9b49ee7c4599f347a0143b74459544379d3e383cdaac5978c06682c25d260f35be62e25b2ad183df0ca2caee69852bac9a617289b4013d490065a822e83a872cfcb509d52b1172e1925f06274964fbfad5bded804040497db6bd7e2cf975a1676be0f180f041f97e158c14251c3773fa1e8bcb14182e0faa4ed7a3d158dda7de3e83ab3ba291211549361567470d335f0eb4d04dd59811cf6c29c18931ee6d3e52458eeab5f7b58663b05e6d835a240b8eb6e2238d009ba7c67156f9dd2842d36b566139db447c240195273a8834190be92df25ba04f66b32c2af393b1028248bdb367c69ca42c5971bd04ca02a63e3dbb7dd5438d4561086853089e531c01a20f345f7ab27582b0125617df8613c958a4ece6148300281bcdd4ad4cd54832b66270d630fdd388fb33f83302ead1d7567836dd18de928d5f9e7e07d92c4232e6ba669e20f714e27b11a51e2db1368ba5b8c8a4ce41b6277e98e382549a262bf84d4a2bf8b5ba94bcf8342a1a307eb6dab855e9f23859d3d4290ee2f4d97d56aa2a4dc83ec43bf200613270198c924ef62fbbcd3d84d458d9789a0772da808643ee0ebe43590e2be19a850e55a559ea0dfeb6240e679ff3409d49da3855be5618b65c913e96349f54e44864af14e2e9d95d568be58d1441807d45dbc02e5c615c8c66f7176092dff94a1941b833c6ce071ca70c8bdeddc8bf242f1999241f5985248a0bc559db7aa30ea8495f0b58ff1eacc1eb492681dae1c9801f39c8a6bbdcbd6576a009586e9765b40d61d460b594ad94939e89691101511396ac4a7f781fe2bb46b4fff20afe1501244782911fc55012792f4b99c00b46d9b44587f9732e455959cde1967d69aa6b25466ff42949e31ce1149da13555789ea31953dffff28571a748a32486c6ad9d2556199b66c5e522b9d9f78e346028eed29d84fbd0c483333db167f0a5ebd9684c8439208819b29b243f153d0145bd872942cd077533a82ae7af69d0662fa3992b475f7846b52e596ca44721f4b675c0fbfcb093ffeb2a5d1a7bdebe49f57de01849215b0fd6d4d302e0014aad0d80026060292c2f95255eb1024666cfee5e1cedd5ea855ece52b9ce24bcc0bd0617debfb4a5f4c63b7690c002072d3b50c81577b94fbae3c61dc642a445a8d1dcca3446586105f896ae4c39ca70a3455ffa924cd0f365ca4c495a998009628274be236baf7eb12c75657ec1ca30d4f82f95257cb29505aa67ef9f4a3984d38320660bda2b03f3c789d7e100438902953eba0fc441fc548ac34baf9c8366a616bd2a8dc6ad632b7079983d3d532efdcaefda60378819ca7291ebc703765caf63eea88153ebb622319fab9455e2f79fc34788a88ba3cb0f42c95d76ff402e1119a308e8fe442987febdac0562c56c759126a153b6e733a7434490f8243cd38e11282247d58156af416c6de81cb15d2b8e4309d6b84d945b1c31274009a64dd8282be032ee49569b20a703404845ea6f91a19372c2c4eea12cc6f7d4e2c364901c583c3f2cd935eeb09f02f4bd04b3e9551ee257bb20ce3956b71146a539041f03c6c58e8bb47e5f9f4f43c8772702074ef9e6cfea60ef3112b6893c58b015c4beb79b7d8e2cca05fc97fed126fc28e11fb2a692c10861a4409d6a733098310f04829dae620ea37e64c01e823bab9ffa8b78622402ddd6217d18362eaf670238c2c0d229acc340de8d1d2ca352d88ecb576cf3e8382f72dd699ba3574723e0d18e0325754b15cbb6ba0baeaca33cc29e30507d03f3887f26d8b24225761960a51bc8281453253a1ca8fa75eb07be7f2e4fea0f9135147b7767b2934425ceb35181ace1ed88bdba4e0581032ae60d626af9c3cdaa39aea9c0a70c5ed7343cff7033523038a906e25539fddad011d4d06b093a613f808fee6b3b4804cd8086e1a45163bb84e516e5720f48a11a22fe97a8aef03f38b88064f18b34237273d9397f8f432e33187e62c068af7a35b6c109e221305231a325dba6489ebb36eca130f6c070b758e37a561ca125b05c310463a4f50e1962759905a4035a9f31d19cbddc7ecb734be4ec2a897641a541891f227202a5e979899bd6350ea97836eb526231f318ca9d3cd8eb78129d752be5f31c5d7b3458ceec3977db2d793d4081538bb9569764b7116384e31eba692d5e7f5faf071dfa0af256fc513ac56bd28c2b1a944b67b56a1e3473e0f5fd605528cd818715070fa7831e75c6e544b0d6c2c8b90b7b3ee522a4cefbd1eb4e841e81966c30cf0c88319a7165bf58d90975eb31c48055f0f425a1b3d024ca29f984af8546230fa9f89a20654aadae0ff997054e042c15728a6a2a00e0f673e8335cdfb040499b87ff8e9837f810d3d6085aa83611d05eec1cbc4b0b47a3b6f0ad11b9a0943b86b10883b4ed2659f43b13421565f72015bfccd9cf5a1d3ca137c43fc926439395a83fd9b51fcbe313e9049c7b4509605c129461c962cec9d7f9bf7dee7e6695cd75954f14b737dbeda412980cac25d411d5a5c7da81bdd5cba3648f2d6250d9c76da6a1e30003bc908338fa2e909b401e5ac70d2ed82b7898807968e6f985f9cb84626a44242a162417e8446c5097c904370a3971353bbc7ab4717dbc452660c5239ba7c8ad4f295e41b106efa8f3227dfdd2f3c4aec9fbcaa5ddfbbc8aa0dd9560aef413c2748e28a13e40c3ae665774b45efd3654c96e2101666dc85d8341501c5719ad29a393669816a2acba9aa1882490a970692fff683293b748e212ea6116321d798ca4784fa2d0d40f97ddc8aa1d22cd20e11d050874e4444342e0fa4bb1b624463134c2ccdec8348591074728da088f00d79765e1eb9aa3b3c3f41ea1b38f1cdaf17309fb8aea391047b5ae7a122c809f1d603e78be3d0cbceb368811c2b5f0010d51621738badbbc08b1d9c74d7a4f6fba0ee63de8f0324bc2331eb147506b77cf5c13af2125ec676bb5c7d68d24e18226372e5c601a1cbbd3aaad3319475aa764431c0ec3f9c3e03b2289bf501cfebb028352f13a06fac4affd1c51a2b3098547278105e2eef35fe89060c542c4743f71ee66d8dd8d24dcb157d8b1ae4727a1ce7cd09844f9da0249c2ef9e27a10b7dd8c64c8daf8b98a691c592d3b03d98a35dc0e14568c24ecebd8976b5ec4731b3a55cc837cb1cfe4c3e550a080b957914741329206d912ee54909840cea93e6b990bee1a5960f2f920c83e63c694d2c5df53eb001cba457c85b54e214cd8612ff6d6434673ea8097ba7a44b79831ef45cd41f19d0bb128f78ecfa0b45712e68ce90ecba60d800eb9debb2404c579d86f95081830872890ff4e871e490901ef45231ee9651cbc4f5faa787365daca9bf168688f8007c8caaa40cd9d8b2a8588a49f189acef093c5cd7e98322666617a54a3b35469abdd4ad3a1078eaebbb4224bb9ab35800bc2f5af33feb2394bf870f5ec5d56dd45f101ca3843f79a6f3e298cd285b708ea4aba51c1049d01bdb4a50d1c8c481b363f647a0a6bb192ffd982a59932a209a43f3ad12e92e4d2b6006bc080c97a4cdb0a5fbf254e3e6c5d2e5e6e904ef6a8551dfe81a557287074e102bc09e578bf4ed478c59de07324baf88c60f925576c3894dca88de96ef03532a21ddb86ca3bf88ed809e9d51221da309cb2eecf7cef91194bd46fb0808d144a2e606a41f12f1aff2737586503961d6cecf490dd15f50af18834a2832336a8745d55eb8562333519a0699b8732b45cbb1d7dc926e59fd3cef2883c52d14049465c282e49ef651ef2122df77608438199ded4d02384384e048ff19df41ebecc342758fabf78619d7c506462f5801e2fc4e64ee259c7eac72a98b143ef06fe9062da4f9ed964473200a8e9b5b21456f5a70da45d4f1260648d2fd168c461145be6103297aa765a1a747916ed04092df6f59742a51851b999166775b10ed7a1471830624c88d164e971a75dcbc1d09bab185d0a2a2ce3765458a6e6fe1742b5150b8991d2976634bd12f4715972c142e7ff96d2d14ca5cfdd36850bf049f46d90e6c3b7106cc5c61db8acd2cd7bedda75dbb6e414975e03ac027701ec6fb4db9ba0a07c68d5e6022e27373bde5ac2b22d05ee31ff7f420e7c1752e075d1d04e230102d3b524c97e97510405741d0b3dff500212c9d06da7c53ff9c46b6799f9c34fb0da0b077a6f705d603af16db7904ac989e3adb7ccb0a0588fd993d09b014a46e7ccfada5726baadb75ced71b94c3dabe2ca59be6b1b6284f64a30f6130f1a4862e1bdef44e9971dd5be11d1aa807f45bec755dc8a77a1fe74aa5a2048a8cc2669c3cc6e2553dc6218beb2c16a72d438787c8cfaf69b6f5103d00f473cb7a34c5b033e8821da41395db2bfd0fd94de607b158cd9716ca6cca6642b0b4feda61871dce070cc63f88b39d217c35230afd874413e2b54490e4bc8ada683a1a79625816a22d11c4a233f66e42b3e54f7ef80a61152b5d0b5a683e4f3beb80b3d9b6edbd67335874f7b47383c4a213303788dea655ae39f7338ad7b83d9c013556fc00ab774253dff1acc2df31af29020327bb6de424d339b541d898aa7356dd846e23b8dd08ce9f3a47ee4d4ed7c8991789fc2f66450c3ceb64aca724c5b64931715e6bd59b54a39961cc8f8b14f95715663ac711a0c05ab738d2e8a8e82b87ef97e7fa9dbc3904744542625fab8ea78b156b3fe9de561ac16f968c52a5469e2e22430f6dae9abb92be2873a5e13d50404552278589d35a3c901ed1ef85a0c152c8b991391f977bf5ee4a6a2b3e0b1713baef40a56f5ad212ac7a701b98acf3975eff207d89477f50b7422608a9740564df8690043500ee8383b774c3ffdf7e25189cfc989d0e000266fbe57d8b1fbffc2a129dbafcb4195accb62ce540cbb7fd581d6165aebaffddbc5e80e96e7e64fbf7ebfc0f2ee726a6b8d284bbcbd26b365487f4cf1d05e4427260dbbd32b51e70481334a06dc94a0466fd12606b4aad972b35c55baa52b760a8b064dd41fa49d4f242e78fed6d1405ce45722569bd8f3cb08023b0f866e93ee01d04892b22e27516695b582ed19e1d804c82fb2ca6c31682fdbb54a858bea83231167750dae5f5fd0e977be879774b62d49e9bce2df52954b88c19bc075bd20a8ead98259d8f59c8838735afe4de3eb93a9e7fdeed425ba630cf91facd5ca6f6a7e01f92aca8a03f3ae9bfc06bda15fd370b963d9f8c107439021555ddbbf0b48b09d328388a85b6639181bdd310b95c1a6cfbaded746baac56d413a436ce40a0d741f560eadac3a6b0fee2b986931049b1b5f6605f91009885f0c92bcecb08d9fbb7d2e0a43d9dd19be1a42bb659d63b9d49c12273924067a6c3811916d323ade3cb2002d4f66a754dd3f261c10b110043d1d60f53a3724b07ffc65b514e59a54795f67b1d17e28049b306d007ce27f240a081f6e5ba1020986dd0b2a06d0f1d7086b73d9d81663b306dbf2148188803cbd51d8cd9c5361b417c0b4f2bfed1d00034df3a37b804da007cbc4cee6830bddc9fff0c2f8a0707faf0ada1e74aa7b19d9c3969bf5650b47631eb582edf67e79c0b4f7dde76a1be1c92a5f442b92f9a20a25a5d52bbede8820db2cf4f398be970b8d39a8b97f1b101a049409d01b3a71cf346cfef91008437504ab78a233f81785474025cd81dfeb1137cfedbce7677597a51954197d18a6921cd664572ee25d32020c2b07c67a0d0b6fb87fbc0402ed0b0470bf600f57c01ca388bbc0685a19cb472022def02f5f03fe66a5f51269b7c3c56ef08315e7738017f42991d66efb39102e1b74e765aab836117aab117c42bb172db312a64076ecd1406362292e6e97cc0636dfefbe25ec05e5af45084785db6a0f7b9b5cc758770cce367ee76f7d9e1a4ddd6c088c1f3b208828a5997c7db1808d7b3a1397097a47f4d44009f3bff006de961460f112e0d551002cbc418b108beb8561b0b9488f435742c6aa04147b6d8ef99cfcb5566ee442e1937df465de269c18372d6856bfc52b29eb3acb14938174481c3382006fa58184e2edc1b790addf92d3d3ceed06b98cedc398b43f0932376fe475ad03bbdb443bd530dd8f3b715dc13cc35161b04f572c0b9c65a64cd1a514a43ed5c507bab87afd56c8c172a29d99477c3f2ea457f7cb68f70c1ffe5df6ec0a6fc4312d819ec7d1220f084b471e99ff422ee02cff3e0403303279b832749dfd62161f7af73410a2ef2409d54baca169ead532c631ce21b03fe12164ae4b5510819cf011a25dcb395cb1a44ac0029ab5ee546aeae6c45c556f3ef473a8a13709f981f969dd42d3827bc815099dda3c15282a2a71812b031ba3aabebc7a2fb7442a8604eea8b5b8e1a7c50347a23252af7e557cecb9cf492821b0c3c28e3799952c5c91b3ff7bfc3e5357e8fcc44785bdd95a8fc975674b10e51990ed8f37fb9e2ebe08147d8f2eb0e74ed796e8482ee9e7490d371c4918e851f4f7476babf5d4f3c646b09376035ffa9ae1bcf392874a8815b46dd746ef8721527612f2b11a38e43f4120d6344d3a8ea05aeb026f5a20c74410f64b3505d1d62fc73d2396de316ae4a6227cc5f4f76bbb5a9e46eec050efb2280071c8a5ca6396e02510e0fb151e0b2f4d439b903a610387b393e316c07e8d734c70f5dd372ee9f58e9ab8cf186ef360049d82c1dcf21be27cfb8c7865d785a1f0de5fb4bde5213eec76f30f936850b9c1e0d752b7f5f66bfc8290d47f02689e8f0a5be6f85ae2c657bf80c7402c3a554c9f4a93320794255e293801d7b8ded6c4e6017b873340efaab0f7ad56bc94891c6f3f412672dcf69314651a503c069defded9738ff83d866947c5ae4c4fe1080548c2fdd6a51118eb9e84ce0010dec0b0a817567a7765f9b4f28e95e40a346a5be11a7e1f80a067f22de266f9d3252030d5c6f8a05f7c5187d97793a2469f1d467d6a1a5a4bdc2f5065646c6f10dd645c098fa4ddacdc0755bdb07d0c412f5df7c6621190f23f04a3734d565871239525e9220f8f6c879711d815ce7c8a8e40dff69ef62b96b347ddda1195b6fb9854015b7aa830af36947f5e60ed896f59fce0b117b7e75b58c83d41b0844addce2a3a1e6595056e4d99e68afd5abc468024f372fd5b123a3d13ca9363410830ad5e89979930f159a9a58b1d96687ecfcfe74f328cb29003a444708dac83575f158521aaaa2e161d7508248a40d5a37464bf5ee1ecbe1ab9f8aeb06e549c875b7d826fab3b4937e81da398c7e84a6c563c6cf280c0637845cd77317176e84218dc166e10aae6920d1620e09a0e88fb68e7d5ea87073bac93bb1d3b8f1fd200b100c4bc43f78ae9aef0d54780ba7a87130364053c6b993357d6842ef9fba681e83dc1fbea5a49736f9cd7de205127b2edc7e2980a79eb67b21dd82b91dc80f4742e911df89cb7a3cbdf0a476d9c01f4212f9b453cc2f774da0c0ed8fcaf1a2c117197696a4e601a7ddc31a74889e04f777ffef4e730738a7361c871ad677141974e005a9ee09886c02d449b28c7ea26689c9e55948334ed7eec32f590afab481b282473c58789d1a333e343146e0a5d6669747c2d40841f6a1812691002d904f74ad7871c1c1e7ef481c84798998178c109a4e3a4b88e23524abf37138696cc11f8f84f6100f7f9b4fac3f01e087f912b9757275e2e62927b676bc66d165b219347db9b9e872fad2a1658c1b42cd7ab9ed12f95600c4d69047ea80ff79b8c51ec76ee8afabf31fd03803eb81ef86eb8c2adcdfd26f271a414e7d7af600a4a77ab75936f72fa8bf735f7b847943ea5162371c67c55bcab0f2f45551970d5a553498d892f733b52ade5d1a204b01dda43a4735a04b9c7c9ade543409e2364774172f8b0c64ce50f0c778f6e90570ebeb1cfde1e61e7d4fa6030a42f3eeeb5f22442f8542eae3407a6d6a5a3461b942755705419d7cd7217bc8106570b56278c00e04b598b5cb0019386214cb792daaac06fbdf67411022cd44b83179fb2e077173f300bf14ba71c05c5f5c12d794b598fceab411c1e9d6000b85d072fe453e4ff520cd5702861b1afd1ca35e4acc209653b2b7fae3712dbf8c16853a3821a4fa1fba1089bd9159758cfafc168252b8471cb0da8a12af9af69fa1ba6da1126c0d14f9a020d6f05b28de356441c9e2d3319818fffa48bb5efd75c2dc508b8d39fe946e8fdb83b37dbe6eccd3f92146a304ac63129690e22178e5f1bb24493cf15778ef7c938d55a777cead4c1cd579753d0252e85a2d6056ef0cfd95b1900ab86b447214b7c55bcdc35e4da8b36bc3f0ddadbca0bfe0cd2138a422cca0cdc78ced35c9aad0b109394619ff2c799bcd8364a81e9f746af19579e1fa801d1a1343b6f9ed172e23269d54bcbaf61115073defe5f83000fcb96b9a5ef59b86bba2bbc7283140c63dbe24ca8f1e3ce418f7be8e6f0a0ddf3d15cff05e16a3989400c9289f468af2a131b660b6210559ef93494dda87912640c14486465357c6b21857b1f44cb3e430923e5d6992822b2a9ae85b22d2f571e00589b369915515c4964ec8d2c2d07d5a9a8cf8a0d9476bd8892594cad064390e92d9f8a6ad4601e3914698360107150a2e49e6d59ab05d8fe2394f7fa8224260012aad497918bf96e2a474a580b78cf84a803555bb597b06994f520c3a21eb64c874a1b510e200346a8807f86a5e85503139d6d938fe36575c98a264492ae2caf7f01dfd9a112e4a8c5549be02e9739d192a4e97f6c1c044e12843e0d5a2090ba9a0ea11192324c77fa04b8f9c6ad75b802461d4e34ce88c4150f27401a4c4801e9ec3f8d1aab3860ee462522c1dc950b95ea14c0da54b1bf54ed23af400da20f8db364a3726d44d1fbbf9fb490b677b7bdf7de52269902cd0cdf0c130d47848104982c59c8e82ab068114506133040034a0bbe2c6e7c01c6036afc10430d0d1d9210c2080a0c8ae042046658f1050f44844f4a5466bc005383fb29490d0bb0c6e3b1397d6bd10bfb19666178342206b7e318d665e98cc79f92fc80e9121aa594f2f8d0cf3c3d3e655815eea7244c70b6b34ad329bd10f753922578c3fd94c4059ccb1a44545454d4155c999cf1e575ed3ae8c2e6719c0fcbf406f5e0df5c20f38dbf29017f84504a394bbf67c0f42909e929a51b98edf25452e6d1bf1986bbc0464a4e28e125044e5b0c31c5154630e410c4194e96380a230698ebd8e07e421206dba8b17361a6ca105fd4a0929278e1a246d8c206173cc9b0822c59d0fa1b034f2e7c7952b2c6b4c1f37b667ba6673f1e9b9f5f787a61ad6b0c82611f1e8eec31630b8fedb04832866d6cad4e8973050ecc0516aa1a017609f6b187c115fdec638f8e8e4240cb8da5abdb7bc891767b7fc256dc4f485680392892709cb7d53bab78c273ffd14970b21cee272435eac56bd71b4739d2862eda3160228b0d59b62841e14403c060e2e405455491860b6855061d17b1f68b4408ece17e423245c6b957d143d213121d927480fba9053258c4fdd40219b0dc509405811faee0d05910f0818c978d410fabffab56ff8e5cdfc3a54285a04b18f5d48212ce303c9f42d00567190e9c79f09c65aa54ea2075ec1fc4b1833edb557ebd057606f7d3d1173ca3c05a7f8f73cc1c33c9348ff96940e1aea551c3d9a5c0fe20ee5a1a486097c2a19ac77c7f3af3241df3ef8ee50ff7fb6716ae2c08f8b0a456c6091ef2314213ab2002a6a202b82ba475fc9d8c6d9c2713fe313f17e1799b49f338325f08883a9630bde3efdebb1a96de29a677acc0fdf4020dd8d9984c34e69f6d1e4bfc59d6937ada3bb8efde7f32d199101af33a993699aca7e7bb4c1d47d22ee7bbd7b1d9c39f023d6b9aff68ad1a322803bb0e1ea23f718b246c983a3dea6a284343992462f0caf3c8c6df3d09e4c457b0f75d0da460eebb0769e8914e45573fc5e5fadf6fefea3e755f43b8ff9ee32e50f72e0ee9de738014db5da0d0cbeeb9a76209dcedfee28cf409c8fde83bbe065d70fdad0656e00e70d7da10028334e4c8c6e3f640f2c5f1f28662908f05811fa0dcf10271efbf7d382fd076bd06b0bde700b400b5cca3c6b2ad20ca0c52b400031830685be0eea1b34a6b160c91c30c56ae98218b2d68fdad01907ec3c02e2bcbf31286fd8765bd7c5dc1f4d51788e3fec60209173c5f88cf68cd9f480452184ac2ae43a61e0581738893844b47474747b4285d231305ce1d45e6069c3bcc18083c692221d0431309811e747c47f6c19ea70cbd450b1decef52581f204613d387c013285e36deee130e8772377b5d5910f8a18997edcda5343c05d8e97555a1e2faaf21930957ef1a991b708dc26e4fb9cf21a62bb0dc6fdc036d5fbde4c48ac515f794724fbf9b1b02d6ca7595eb8c74dc7795db6a6498e0ae75dbb2e3210e0550ac606609ea6939c942821e28dc1d86e9bb539c2965740982cd1cc0e66ed7d07778cf711cc5dce47ed6ca711cc771dc76432feb7b16dbb87ed8b0dab4460e48d5556053b86b6bd08073d766238dada1f4c21a2db800c3a2861a4a302c3507774d8d2d7806774d0d287096b5a0d63cb21e2b5e14f58a9e2c464960518230ae5001420c2ecca8e20927238a500285a905e2162a2c7ab27861096bab4458130154f57ac3195f024c514c1105c6941d8090800896f890e4021a9cd184152f8a7a454f169d349c90f400c5175bf800802db8c0610622d2b0010ca70d09d18a9e2ca5103118c1a466040d656896ce1a8c19a468a10224969260a0d56f27b87e6523085cabc0f54b2af31d8d7bb27821ee9a1a42e03ce23c6e434059ef471c1e947cfc1167a4b31ffa6ad8f0c28f90aef9988d578d19948c238fcc1371d7d44882b30caa2231b9cf3e447a7cf8cca3f56f648f8ca76716db353668c02cdcb5357ac061b430abb4fa38df3c26acece1f172cae82cf4d89cb2315d66f3e8e8e80809ad7e88eb8f3e6b5a6d2cb6710ee9a54d1288b08d6d70d7c680c115776d8c0c7086a180db2858bd3f6284e9bc40f4bdffa175fe1652ea98c3dc77f3cd538808730f9279fb0e0d297c8c15f8698005fb8f34a8617f1c87617f908a0aa038cf4f9142147317a802993fea831be90a7d05f6fb56c0f7dcfff814876cdbcf07a2ef7d27fea8a17575e28f8ee3b8edb99b81e86f0f447ffb29d2df48a0fa35f4d9a4f94f119c1c18b069d0040b00774dcc170cae1a36829eeff052f0c97d47e6116f95cec4d9277eb7fbed957aa0efbd4f7deffd77bdb2bb3905bc3d779b08cefd4123f6b729a73b1cadaaa7c04e3c4b98789e11460c17314b675cc12038c30d0469fe2327ce478cb287c517bf6ffc7803c4fa16c82255ff91763e4b0a667de8e40c1aa8194b989a918429e5c21687a8deaa9083c1b7cf890a683d8bf51f9947fc7ddfea1ec008832cfbf659ffb15e4566d7f71fa0e6572c92f52d2660e29aff71d67f5f39b104d5b79e45e61430eb39b184efadebb38759aecf16bbeeeb0046d8f576f5f65b478cf0ea762007bbee0b7ca0d5bb1e5cbdeb57ab77dd7275730aa5ebe61470eb5bcffa1fca22b3eb39d66fa290896bbe45e6d6abae03aad8d65540cdb32e50cdaf2e50e8228346cc7a4be6d60d1a71cdfdc2efbf2173c5e3539184f9ac77714878ab97e2fded5937dfb8ede5f8d5cbd196606f9ed8e667bec5126c7ec686cc4578c63eeb411649f1cc835bf891333fc51272eb59286017a5788a2564fbad67516c73330b78e6b7dfc4121ccffc5782fdd675ddbcfd10c5339f2dcdcd4678e6d2fc46f33ffe91342cd665fdf62cd20155ec10657d8a1c9a98f5a5c0be4898b8f513b7de5ef1fdbe86ccb73fdfde9cc22010f85e0ab73c3162983038c512c0f73c126c91aaf9de1949b0f7e08857ef22730ad8e5c2f6db77d8fcc862bdfdd778b3c5f66bde866c2f6b6eb698f53324ebdb67afafa9b9d9c3ac3bf32fb23d3673b387edcde1affe5d24f734640e1a71ebc357912a4cdcfa2a0e71dcfa299230a4f5decde0b75aa46a8a07306a918e5b374fdc7ad5afc899b7a4eb59641e31ebe9ea81ecbb7e65dff5f65db7bd64fdea672eeb7f688b74cc2273f8ddbb08c4b1ea5b421abf5a0fc47afbadeb802df63584f5f659577c2bfe4afc1f575d20f0677883460c5e0f679e9cc28fed08078d5885398406cf1f7df503989b7428761aa1dff735a43ba8afe0fa1bae2d9b78233d85bf8ec34ee6108f4eebc6854de68ab7e964b84759016173a872918615dc52dcd7852edf917388e975d91c8ed371a61f529c43ecd87ae915bb7c47c5dd3b2c60e97d0da15fbfde5c31bd4ec5ce37c2a917380cb67f1ce312e86e9c71d6dfea0c371fc0ee1db552efe18efb2790918979f8e79ee490f70effdcdffdf5765fcfa73864d6dc884eeac21635260c4ec1cb0ed777153a0ce44f8073ce9965988897dbc67173ce39a7d75e6e410ec429905f2ff4f207d093b0fedc11de1a0a0ae7b9849b6cb734c9608f3654c73df9fec7fbbbedb1ece1ce67193dd60b7578e66aa83a191fe256914045355d3833db3c623015be38bd045dd775ddf7f4f4c0783ce63e5e7a2a7bcf2249a062c1ffbc6e76b37b5537bb17bb0f27fd711599c75c62199ed7480553647e0cb3b3d6c075a4155ab0749dd701d1407bc9eda57adf756f5d388f61ebf33f497a1acdcc671d2ce3f1cf5e7d42f3ac1992042af64bd9bcbf8cce6adedfd2998bf533df22ab975df729b2c7cbee6dc8d263ddd790edb1c6a95246672ed6fb977446f3fe2c72f4b27b4bfe78d9fd8af4e165f72ab288975df72119012fbb0749147aa77b1ad2f358d77426c463dd8ece71cacb41168877bbebb57ce3b26ddbb64308ba9b723c3a5e22a0a7c78ba1063bddb110d1e3655f29613cb89da08680aa4780fd3d5471dff672deec7dbe1b4efdbcaf21e0cf9f37bf7ca8e2edb3bf1106ef6b48f820f8e1355271500f0edf08839ee88950b8274ea542d20339107c2e77cd23c1cef3bef3ae90eac3cbe6b8df38ecde1bae5eb193af21f5e8e8e8683ba235ec77928e8dc459d7c842703b0f767e500feeeefee91dd756b76db311803105c1f0b6bd97fda157ab1076fe967570bfcec86d7111d01f29ad25f62a7d2588bee20a85f498a007572d08681e9324ea9d9979baa6e3b308786cf68cf912464c0a50c086b97ca63349a0627d56dd089b61987eae11c7fbede97feaa6bee216bfd40d0ab1f779a537dd07b04bb0e2573c8bf86cd668ecfb84f8f01de04763dfdf80bfcfb31e9349e7f83eebc09d6158f5b9d4b199e7fbb6effb9e041d5a1441d1fbbe39bfefdb3eef9e6056f99aa6804e4eec7d15ca74ea3a16479240c576ef31d83c97e00dcff7ffbc89dfef37b2829f90234096832f8a77a8a2e06f1bcb4a36e254d0119dcd9ac7becfdef72ee5fbe67fdfa3f0fdf77ddf5087c5dffe13fffb59f31de17fb386bf70ce1bd45058fc167f88158364c5a9effbaee0efbfeffb867d46df4cc1809638fbe0fe9fe6c181de99df2b1c2cc3acef7f2aaabedf1b7558e4c4ee75ad2755440e2cc009ab141b8475051c84358a9cb066f9b06221c30ac50deb131d8455051616d62b38c2ea846d2f3d08ab150084f5c99661adc5c2da4400c2cac407614d816d2f75c25a6527ac5404105614e408eb12b2b04e0121ac4a8410d6240610562478c22a4547588fd8310b6f1c50c54e289c3f471176cec26a444f588b2040589d788495881e611dc227ece6419fc31e7dd234e6336c5811c21a6584b042b10508ab1076fe84dd3c7e0af033c28f083e3d7810a067b64307cf004200419643003b3a1f04205602c0031cb00e2ef9391c6c80f3bab931dad4fcfcfcfcd0b87e7e3eaffbf9f9e1b69f4a7d92409f5e2760c3c01a965ae79cb37ed3c6a7313a76992e63f18ca2b317fd7e2f74f6a2f7b580f9db9b50bf2f0bfdf5b7cb429422fd757b16e8376d7ed38410a1311a130014f6719e35030461f3ace124512988446098b363fe494c93c9941f46bde3ffe3df647397c13ebf3f8c0f4f324881fb09f7930c4a185c814d67371b6cdfcf013aab7486f3fdb346670ece52df9f029d01e0fbe7129de57cff9c42672ffbabef4781ceeef7cf243a13bfc9a7f9ee3f81ce66be3df866dd78d8f7af406736df1d7c8f24ec7ef002789daf213bb848b00e1ec7b7480f2e52cc832f5f45de8b24809daff990242f128efbe47f24002ed24ecdebbc47e65ca412001f80efc8d745bae4c39e2337b8482fee298973910010808ffd0d89b4c1739f339f26e7719ebb4a3a340ede92483957e9031a92ea7370fef52089847395686848dee35c2515ed7f838b74f3f66f9048e0eb69de4522bd687e835f9148345789d290c6b71bfcea53ab077f83abb4b39148abab24020d29fc1cf02ae1fceb2ab96848dbbf7e8644fa400057e9060de97b9cdfb94a1e0d89feeb2b895473955a34a49ab73a5769d290687e83ffe02a7134a4155200aed28b86c4fd2b76956034a41b6fdf8317cbabb4a221899ff300b84a3d34a4ee71de83ab94a221cdfc06cf22913a78244846341c57090034a4faafbf57294643b2797b91ee2b4d5aea9d4442826444835da5116848f673723e7591681ec9f548338fc4fad67770956634a4d4e3dc8bc43dd2f648f5919ebc4a4e4362fd06ff2492ffeb22e55c24f091528ff43d52f7de2b4ddaeb3920915cbfc145529a349c8b641f69f548aa470a5ffcd745ba79a41b8f343e52cddbfc0fbd216f90258df58f24111aebb72157a0b1fe1a7232d1583f0de92267c81368acbf45ce231aeb6791b389c6fa2db9227b68ac5f45a24063fd22399368ac3f24a7138df583648afca1b1fe8f4c81c6fa3d722ed1587f47ce2934d6cf914f63fd1b59490ed018131aeb7772d668ac7f92404f3138e1dc4f4bc2e0218a81e68f782cda991e17e59851f5f967f842a915adffc3c86a352790d79e03f22a381b904f19c3d403b914570ac89dac07e4508c743703799311faf5d29b339033ad6eeefc0accc7b0dedf9bf9ee2b65b15cf7b6ae77245eee9b86a926ceebc29aa25faad3c1501fb78529afabdfa7bab616a894d7d5a609e59489db421ddcd4d4d4d4348f9ae6d13c9a47f3a8b5cca313bcec69913916ce93c9643299ecc1ff3c8fb3db58c7d0997d7b1d8b7dd57df1e631b429cfdef65847dfc7d8ec4ccee44ccee44cce1446e53ca0c0f6a727b3731348f3e8dee1563b40f31b13e99dd94fb8653d9b4bb667530b8d51ff118b9d4b3d63496364c57389ce38d031fa6196c22c85119ad87f2e4d2d7446a463f4c7d15afa4e4e197a87d2528ccd530bd4a45cf4c4e00c89348fa677d6bf71346ca663ba700203d56f016d3f73c4bd2b49f73449e1d72c11df6649f5230dabbfd165ecdf00b1fef5fe148ace5c8bc7fc3fccd835d7a245cb8b9c37e4bc418efe36e46c3299cc255a582495c24b7f4b522cf40aadd12a249d42a550270ac5b5d0cf4e8fb4607f7ae447584747c79b9a74bcc99bba77a61f1df909fe9e67ed38d2d6527566d6c173fe7ca1e9649b3393783e54eff8773797d869d34c724aa1fc6993bfd399e465e94ebcf4d9c44b17ca5ee90f6492302794336cfd3c93d6b05f7f0dbb0025dbb86e980acd1a60fa4f4bb8e07e5a2205ceb4e969c913a64dbe034af3a0f566aaa038c2f48b348ff932ace3507a6726d1a3e6d1988236357e9ecc8ff8cfcf548b93ef009a976ae9a28a142e6d4c89aad2a5e6e5ca172c61a4100344c700513265ca90c1f49d063653aac5a1f40ea594524a6b60f3e49204d39f5c645efa8cc7673e1ea3efc363330478ac8897f49d3c0d9b6792ab4129fde944674df3eca439cdeb5a7a873e7d57c3769fdd494667ddbea96b691edded9ebe3bd199cc63f4c19b3d3b36f5ae1309b99b82070877f32360f4e1a5156a2f7dbca44fc22c72463df270007bfbfadb91f7c04f3d287ef8a2ea57acb7cf9af9d6cfb89ec6fdc268c87797cbdad0336a4d3fc2ad5395d33668a23ba535e986e65f035af84a5234fafd5fe9f54b54c43df72bfa5eb72ffadefb7e1caf1efda2efb7d1df5fc9a415715fbbf7e8f7bbeafb1779cffdd67d51eae92b49d9d6aa7aef5fb43dc7fabefb22b0658bc007554a5234f122c9515d2439a92ffabe75954c1ac8a2cfd52fda7ef5444a268da808fcee95a468f6ae5497e8ebdebd2fa25f3fe986268617bc9dfabe12156dbfa5beeb3d51117def8bbaafde1d278da8a8e32e6cbbb588fa7dd7c19a1d0ac04a4748baa1d14b249453d44d41a39748898a463fa9a66e485665926e68f48990e42849fd56e9252a12bfe691ac926e6837ae965581ac7085e3aa69591538b3628d352d97558134ac19578dcbb654e0b77d11cd53a19c1a574bf545e1db2752924a7995e6b72fe2c2d78d1fb71fc74b54e4a55e372e5151aa7abdc6120da7c6d5b220919214ed7591e494295386766373898a525fe36a5915f875db17854f9fa8c8fb1a57cbaac08f7e51f8dd131555ceaa9ea868f560f745e17f3517e63adcba8ef9aefbaec35dad8bc3baa3bde3eae2a8ae4bbcb02f0aef83d7a66e7f37f46e751df3bbebb90e7fa222ee86ae63fe5654afe73ae6d35b5d877f7fd16b7e58c005285923fd42df0b792fd4bd10f742db0bd5173ac2c191d0910e0afb1fe91aa6ffc348bf91bef9bf37f2dd8ce3bd11efe6b17b23ddcd2eee8d7037dbed8d6c3787f58dd436e24fbdddaf0a35785e9897930bb08fd4f7fec8f6df1fa10ffefc23e2abfe885d3debc84ceb5d7fa486e66d8edc18ffe608ce0bcd2b9473e4f51b080901990f44e8f542e30bd5bc50eb85562f443f7c12be27619629335f68ce9b85e66b839b715e37ff7873f38df1661c1a9b9b6b686e1e5bae9b675a37bb56ac9bedea661baa6e16c39b43fa2adc60f0e614bd59851bfcdddc359c55b8c1decddd14b813ca51e106d79bbb9b02d3cf431ca657851aec178633eb0ba0cf2f157e2b8f72422bac420dde8ccc0ba35c97ba3829f0bba3a8f22c6de12e45d35d6ffbfed7766bfd268502767d234375eb38cf4b7daaef0fc150257ebf65bd11d7f7bb54b8e5fa210ecffc500d165a619bef1f434cf34654a8d8e6872aaef92117162a007e0db5f0f8468652f8c61b5181c3af1f727c6364c8620edec8908737789c1f1ab110c539468654d8880a8e73aecfde2129597b673e0eb9f5cefc17f9dd905eefccbf41765cd83b606aa5122dab5543e3ea9d991b63efd8e0f4ceeb66030e7a67be93461c4c3a660c301c37060705d3283041c0bef4502d5f605f7a1a8a0b133ee400c58b207630726a42468b367a288152134a2d28bd4082a1c69702ae0a32524f4ac6780d994eaf21ee5eac5ff762fb8db0119ed708839452a65a2b933937dfae276581b2d5ebcdc78f102f67185e0f180a830f4a15831e304e8850aa1880214295825a471e99c705b705ccfd997eae9f3d6fcf3dc8715c8ddbb6ad31385bfc414456524a898cdb666b6aab24f51ccf09a402c54f3cd0fd875b2c528f8e8acca3235af75ea46bb4ee0aa1b1fe1ff7892bd49312a7035499c14b0f486cf832c427c6089aa02081d19446920d34e9069a2e605cb89f94ac0083b89f94d4b838617fef62b387e7143ae3666d62e1382d9e14d5b43905853f9a4e341468cca3b39156492234c602576e64d358bd2f132a0bde575ad368443caefbad7e778bb8afdb6fef9144514c98632011c511cdfbfa4445dc77efdd22eebbfad599e8ac89ceeabb0eaa258af4262f1d0a9e7fd43466c2f6dc6fcfbd4ca8cf11791a73676ac2fed973c2dd41d166e4ce8d017acd633aad1f5c35e1135a3ce1c7676d4e994e136a8c1f4d2c5ac2447969da341664da37a281afbaaffae298d9542f11ef8639b29349129e4b2610819f7ad69b40b4faf0b937227402ebbb3f817bf17f3cf11ea4a411faf637fb2d9e10fef646848e4c2c24c480a6a99e014d6bbdd0092f13bed47fdf34d5092f13543ff33397055aeb06712634369f455af2e5cfbd110da424039a9644f5df83533421f5dfd313c413c01356d793686cbeeabee88b4f0af1a5ec4c502f7a897877a4b1f9dd2d39f2e597888cc6660f9e6f442b5a1951efd400db61b030b5c2e89462390df46020fa210dbdf7fa39a8077bff3de8916125c3d6cdc38da7a80015667735d0b3b9bf00d666c28ecd642db3e9c2e610cf7a653d5e4e1e287e08759b39fa9d0810f4497a94deecd87f0badcfdf9cd23c8676cecd0b39f14ba5523345a9f03b04b67b5debd65c539f5cc7040457fe63455560b377e50627ac9ce0c97ae2908abddea9a56eb0b936c184095250c5e64ac5660f054b4cb1d963c2c4664f099bbd2490907284cdd5089b6b114e44d8ec0d11c5660f8a10367b41e0607305e204367b4d573ec082fb3f1083cc2736d71f4ae083139b2ba63df04077e0117f0485d89dcc23767777fa1b2954847d368f8e01e8d0a143878e0e2ea943870e1dd4e708f34e8f09b0890d4bf187b7794fda0070f68fda8e73891b7bd9edd387789ed84180e7854d28e09cee94d6ba6d1cd989411c0ff54e13e9bcb049ef0b9b4c89411c13e99d4e8160188a4daac4208e757aa75bb55a59cb62b55a3333ae2669c4208ebd76cdd4d4d4d488352198aaa9f9bc9a9a9a1a9f39aa6c843b1940b0bbbbbb57201384420be9eeee6e2e40e7b89b8738bcbd6fdbd3e7388ee3b8a26a83f5ebd19eb48b6cb4f98ef3c44fe6252aa2154df711808dbbe97c019cb82b786462208eeb4a686215fa3dc99823dca2026cc09511203db81f4887fb7eb841ae568ee32a57e95565223cbd695519cd39c7a0b4524a521250f7908a40b6179a6530b7e1f960a5d5676faa5c846befcc20399436f67c07adb7f64e18a0df66cd9b8d8c04a1d89b39e607a9d8e5a5cfd93493859d3e4dec349ab385fbe94b94176e2b226862da513d56bfa57899fa2628ab264c76c9cb1f4fa25a814c2b284c874297af88979e9096f1ccc04a178d97137451ba7122a5948adb8722d998db489bea68ae70fe9cca5d2c168ba562b2d9a11ccab53897198ff5d98eadcfdff5fcd0f76eeef92e6d5dd5655d7b67c8ece32e6e9b22a5575d7b62f3acd5b0487165033b7e29f3e9d900c7da71fc2f653d38fbd210e704a58945b6f5f9c1e6e9e434a58a94b28747f6e2c1d997ba9011e5e384a9898a6c564f1419674445457d1146143d8a8a7262b34735417182f3baf9924786f3ba1927549e505eeb42c617367a98d0b0d4225bc5c383cd73698949131a5e5fca744a1d9e2533692669c974b0791ecda3da4cf2b2e3eb945ed217bda1d68ee3ff181999153a1d1f6cee301c588168681cbfecfb38a32bf460384f284fe54b3a62c204752f511a82704f2f1456871ee8128d5510ec0659afa258ac93a077d02e6de859d731d19d668f2346d886b355c75adf6afd6cddd0cb2906a165ca607b7f668e4ae4fa929795c8eaebeaed05c00e168514822cf073f3373e7b236ce6a09f22df4b7a436fd01f3f32cf30b8d280ab0eb83e8b6c2f7b135c1f24b30b81eb73640e2abd7441c1a337c3301545511445511445511445511445511445511445511445511445511445b18bd166e9670efa20c5192914c5c1d99782605cb41469ffa8a8a8a8a828256cf6a830d997bc7ce972e36d3e7b38a397e20d1bf1bd6968839242c80cd98da3851d3b143fdb304fa8c6c1f437eae322bb1f36a6c2061019c358d708d2d9a7c2b24c851deb23f2e5c3ca8f451e31c22c223961178621eb723073d47f3a23d22ffb2152c44bba54a34b53345d9a50365fdf357388e27b149dd9dcf698f8d56b2e630f8f8c866c978b032a38e0c0ce1ce2578f89d963c2f53d59904ba784d1906dbb78e1e432547fdb6a5213ff78592bc885530c3223fe387ed0c1cca263f57387e9bf667a36524a5d2358b1057ff5ad164b00850809b30da6ddfb128d55d6f8f47bf698503347fd5bcdb0b40a61fde84b74b6ea189d3d424a9ff5dfcd8ef3843a628453df5e862210fa3347fd1f3a9b50adab02b7f19b2ed1d97889d0255c1f84f2b25a4184ce3cca63f5ebc51e0584099b2794efc81e9565f99b380dbec3fbfa1ee53b3a5cff678fc6d54b91f4660e71fb905c5a91ede57086cc4121ad214bb0173be69e869cd8454e3c434edcad8959e4c4969c78454e0c4e3cfbbe63fe008bf67307581c41efd4cf2a2cfeab671e4557bd43f5e2cff4cce6c50f670fba3473d4175ffc2a8a6f45d215c68ab5be78478fa2b3094563f5abbdd95b45e1fa7404acaf4f97660f22ffb3072d5306d39c33feaa67379e3eed1dada7dff5ec467cfa3764d731f15b24ed52fc1be4aa63e28fa4f856fc9528feea7df52e9620feea865ed28b89cc1eabaf3fa1e86c7cfbac0bc57ad08695437f24571da3bf22bb73d0b721bb8ed15791b4cbeec512e8fdfe8786e4f62059ff23bd3ced18d2ce68c6a7120e9c8eac7a3fa90f50561ad1b2a5f5836e6f89edf75bd287c7643c1c157ff48360f6edc707de848a3a0cfe9e149af9559fcbd56799f783eb6f64c87a239a28befd2262f8ac4bc4faf089ec8b6f444b816fbf48ea590fbe7d15f99adf7a23da8a7ccdfb5ac0ea555f64f5aa9fafba4451e62da2fad6257acdb734c6bd114df544af798d1469fdcc33a069493c1ae3defecc25229af999db32a2adde88f64d637db69863dda6d9ab229b26924d0b8d6829d288f67d2587b81f7e85902f2a96be777d7859fe1096bebf8cce7c788cfb10ff78c9fd0bf61bc6a58caa7b4de08c942876a0e161f179529f9879415541cf0be615107470c2cec00a2bc993083ad45a013c9862841e4e44f0791c7a882083c7c33504016637f4f82ca9b37781b7c3e60a1d38a8e001818801b86a35041c344c107e0c198f12e4c8814200344eece078a2f3012623000368129b452973c27800800de1418f5ac531e3c17c50503b9031f1ee23a9242dcacb84f07266ea0d8f326ef4b0627c810d0e2b5e4dce139a1daacb00332d9f28960142e0d923ecfcd54e1635ccc106f849a4682cf0b89c23ea364386b6d8701c464cd809ec7c1f606c8f20824f0f1e1f06974070924bb86f50b8238d2114e70fe0f870068189b290986cae1e5461b3d7c387d7c1664f84259bbdba611f186cae3f854d1636571c56d85c4128c2c5e18949fc64f0b021270bcd151c4db80c9bbd01e4301b22a70c181136d7279bebc41e7e7138857da8d85c4df0496844c8a2f4143ccce87185cdde0b08c53478c338aed8ece500d183cdd5005df8786180165e4372c52ac02d05ee37c23c629089856619bca3c5e69a830c1903cd053948d85ceba7308f0df3e051af4763ad32388eb0d9cb13c370b0d913c1a7078f11685c055009cd32f835a4001fa637b380fd52ffa4349dfe98fe70c016fb4b640a74863b463f4b9829706b41e2dc352f3fbd43ff8b979dc4cbc6ff64498a05811fba78d9fed4a977cd8fe80fe9c34bfa3e65d8dcb524dc8fe38bcd5d53b23bbce73ceef578c3997b31a069a927ea1acd03df7b20f5ac7a7454bff1f7dccbbb4452b769acf1376e244db2f5e61edc4eb83bf890f06aad542582abcd7eacae35e3a2a9b1196fdcbc7036e020e7c9dbc1b7f803f63f1efe78952b5dc24f91417dc50b8f60ad5c70c20b297da5ca4fd7c8e880837530846d1ae29c7cf88841fa5c12ca8a9574a587263e4e84f480c9e9f99c24542d275948b0d43399208027cc063c1c6c808438a3a5055f60ee67129e25446461bc64382fa79026882b845841368f8ae88c7143e7e6c612a00d0f628808d2117342e9c5a61c6da2a46e48018614cc3d0a41a59708c0664003aba191f2715f2408c605858fc1cca7c8a1cd35c38427c44b280be080d17d8a739cb18acdb04f7dea611e86dc839df823f4605946e003e6aa4f100ee66e0a6319dfa758acd15a97abfb58cf893f3e19eb63f504b964b07d8a0c72616b2d576bea7bebc216360013481106b69bd5e1803503fc143954f16ae58521b8fa2afe00872a5e8dab59f150f845f5293228c4a208a6de9b3dbc9983537d23e65cae1ce2946afbc4a7e20f555088c5f74205f415415c21041655e25d01a7665738b2d210ba80d1ca85de6f0fde8fcb1e0e439cfa1ca6c29bb9df1a7345980a4d4cef10c594de0ee67502ec9f1e4995d8fe5cf1d6643bc176c3668239679d73d68dc994c166c35682ad868d868d04db08b619b6254a67944d862d860d866dc9f6c226824d69045bd2e6c2a66443da926c48b616b6106c47656ad00619cbc61a6a8c49030d4b0331679851461832c600f3c5498c19c8c04b1873ce35c0884197995a027ad033c7f460feed1ddedb9ed9397feb1eb099c37fcef7d923f5134825299e75ba532a06f1c1dc83ab897dc70340f0960d83cf1e2e533a64295a39ae6ea94b3a76cf77f098a5bfbf8f11b0ff1401bc4d63e5f6d52b686a5fa9d4dbb8edb7ba7d00d3219ccfa69c85cd1ee5cce1338757e214e99d63fb8facbdb395db7b64d8e5f642e8cc766c7bff72f6d83ac7961f6f5b87b7cf01d8bebdfae0b77df5493dcfeb1915b76d401df5b95803574db76eebbcdb28f5addbbaaddb38aeababafebb6be750f9d99c37febaf4bb163dcfbeb78ef3798fb4c836930f7d966c7596702432eaecf75c9a55420bd4bee3b0e731fe0707dd0fbbc8deb9b16ee14eef7f6be1fc7ece53b812124de1ef4664faaea3e4efcb13dd86d9552d57767ef708e8b3af1c7f69d18c487bae7759ee7cd19557773357212489692e20b3bbfbdb0f33bcace6e1e22e0fec97d90c6f3872606328566193c67e5a2eb81e38d760c2b0cbeb0be2015562e6058b708c3ba450cab16aab06a5985350b1b76f30801832c17143b9f15562c5a61bd6226ac56b8c25a054d58a9a809eb143661851a6f84dd3c0250ca6ee06ef23b86830437c2ea829bb0b6e015d6435c93930faecfb90fa6d4098fed994b4c382f9f0753ba44e7652bcc231d5c9f2b7582a818d81854a2e0c5614528178ae355a8fa9c5b2f08c7c7cb49bd51e6e5ac3d412e4c8986b0c5b02097ad3f1466221c7a1962ba02ae4fc91b5617db3307a59eacc60450fcb4017a26f3d87c227ef3889be65e01fdf1210401d4eb0f5b90584102289c80c96c58e9418ca62780604117a5aecc1526a8a481c3d1910d4a22a8818a2a74486a214a8d2e2dd4c0880a0e58701142063246ec500494116d00519b41195bd868c32887364ab085072d57b6ecb001199e5843cb0978a83121a623e3e5c8298d249e88e20b961a6ab8c2c6981f62784113301d1b5fd050420449b4f862e90c231f8000638633b648a2420518dd1a5b64a982098a123f00214308da78a2862f4b4e90a104179d1a186a0c2f3ab4302509227a4b1222b85469620b1762a0c5985a122c90b8628b982e82384208306630e30c1bd0c8a28a34587042aad180c5162f513c4c49c388358a908196315880c64d1518aa70693a22883112e0c2861940f15005186c4041032e59a4c10219d668e201872616d0a0848518463831c393189f1a99284230e589175f6400861490b18410480431069533fcba30c50c111c514697219418c3a012430d497820a30524ccf81122a36b90202a0820a8380a0387b642072e3b303145130e30105186cccb1e4a7f9cde76c20998da18643c21a2096ad4c210484a4c29c38b3374a0d12f80a085e9d045c2105685fb898c2a502e2e6ed861061b9ac45043932d2368b1e5045b72d812658b0cb670b1a58d2d666c81d1ba719df7a5c05054ad5808209242509224262755bcf49a57ce4b852adb1a452d5efa8be28fc905276c315ece31b5a7587c36c58881c2b37905fb53279fcd2a1ef39f4d268ff9cf66129fa5e031ff2a5398a0cc244c5e68c052d02477e23b9a5cefef507cc714bfe23b3ee7e23bc415ebb97729d8bd4acd67afd97c7629b0bb15a347ddf02f37ef63b0bf3e3b19ecffa38acdbe6405de9183facaa461693a13901798b062f08e3cc479121f01c793a60e546c9e5db484f1f1d2e5cb6a6905364f2c55ace891020b948a0717d83ca1304de171822245645ac2e6b99404fbcf26b249838f8033132e6181cd2d661ee9ac3044048a3f66ae3399c0fe4081b580efc841257e92f4349c08f80838ef7f020abe63e6fd7152e28f9911aad89a12fbc9eb43d0e2f5893f580588c1869ff8e4e6c6137fac9caccb13ed931b373af187c8c4e274e2f864fc10b418c116581827fe139b0f410b9b4dfcf129617536b17c52532385e5a9a2ec090dcd1686f5e9219fb83e042d5ca43b19e10ceb233b53085ad8a896b3b03c910105ebc0fd348618fc3281a848055154d468f49bd658688dd2eb39b4173d3d5a94d8c2e405302c19a22b411333d8020640d46086195b1a2190d19344bb80ca0ca02c4d11a5948522810249061394008718bc5882f3a289018cd193041049a4581af384b4850a2a708419334cb1459313800963668d0280e94902c360450ca2105306136472ace1d402a8a62c3ca4a00b20be2e8cd0f1a52709271b5a8852c10ba89c40050d7802ca142f544125042a1053c7e00e04dc8981bbae4bc2688917a0d1440dac3c95718566e96ce64a173ec0e00b166401035af7bd04ee3adc6189aae18e077733c05dd7938437821aa4b2009f923eca2405afbbe4defb3c8fc6789f3bcc1865b5749f1bca93e59edcb5fa58c69a9de2f4d40489534c455147de66c4f4b3d19fdb0b6077f7e7cfb592b8fe04aaeecef9cddc77cd71bfcd23dcb57e77fbb7ad6b1ce538fadccdb5f6385adb9be7e5e760207abd5bbd9c69803d374cdf7fe23adf015bec6c1eee802d76368f19a4dbe956dbaa3211f6ff827ec3b2fd71849db89f64e082db4b215a83234cb3b07932512e36cfa316ec0ceea72f3290c0c58690c4e6ae3d7d51426960f33f89f105ce9e830003dbb3871f616f3670ae68d889eb572f2910e45c3a3a3ada8136e79c7336394d99b567dac8246fc91e552f61c6a040b17850ade5c7ebad5eca7a7e862153bd3447b6e97c4a3f244fb82e1d1d85e089d6b539c5a969fb99348f50e8f6d261462d162a3796b1c7cacab63f3debae7ddffa848fe8ccafa04067ee643259bae279b14ee86c76e979a563fea3160be549b08c3d5696cbd15aecdcb5c2cbc6d9bb607fee881aa2f0026f374fa62ebe63ab5e9733baa0020cce7ea55bc10c33e8026777c29d91822d32c0d9936c628450b2e205ceb34be5c29d81d4250c9ce7155abd56710add2ef7db13d5e7bc8d2a4b47b46ae4bead017e2d8567a5490a66e1b6f2a4865bdcfec77d70d1fd7c58777f84f8f0928b0bf44748d75121021f9f8302775dd73dce378f89bbfff15248d775deed9ec4b882bbaeebba9b83605c4b4ce5be6d8e301f5d5821efb3aeb52f8dc133b89fc428027fb89fc468c259e639f71a52efaa77e60fafc24e9c5778feaa79f490a6f4b250442bfd16ea13254d5abd5fb46d5a686c83a2b159448ddc372f60c3f21685672b61c2fd94444b47e17e426202d3a5e6416bbd3319e0343ac56360bfa4b30faa4803064e4734a326cad0e6afc0e386289a6a47b469449b3f97e8644267aa27a88862e988d6b5f9ee4467db1a63988efcb31f254d14e810a5469bef4c1c0a6a8c172d74e651515178fe840ae3130b9e3f9b9ce69414e88c4ea1b1f9f389d0590f20a09c68f34f40c1a7583aa34bb4f93d74366953fc4ec1dedca2ea17f3e9f7fb379e5f8294acefd1594963f3674fbd4f63b41c3258fbd333a3274b644ef0430ba2663883365f48cf8c9878228d20c808e1431333681e05ecd9436862232a087578e2208ddb670f1c20908e016ea181593258a9c43038045362e08f0becf58e190d06decea0bdd36e869833701703cc7d81b73170a55fb0778167efb415dcbd33833dec4dcf029cf35ffddb376dbefabe16c0bdf72674bf5d16b6efdebb2c4429b27d775fcd42f7dc7df5378dfba6719e3dc273eb9e38cdfb1f1f6189ed9e7b1c2dd88f248a5224f5db25da3ef544df87cf912f7ff08d681dd93df7459ebb4451fc16e11ebc442ca41e7cee8958885224755ffee2830f3e0baf05849ffa22e27df9ff801fde975f2345c217cb5aea53dfbd114d9c1fc6529f1ffc2c4ba53cb269535c80d3527774da9872ffa639ed5960214a91edbeea7bcf3df72c7cf755ef6b01dd6f5fc4bbaffa1ca0b1f9e51a61a6a041173d886185c67d775ff51a29d29d40630e451648320c21821cb8386009dbb4ee42f32e11111a9bdfa1d0611a8ad634eec1920193b6fd48a77bad64d2a210d916e0b4ed7e46d5b9329e106ca0d1859ddf6a030430ecfc146e2b2e7801810ca72f6660a104cc154849408879fac243084becfc8adb4a121bc4b056926e08e1053bbf63811776fe0c6e2b2e3001a10c10dab0f339dc565cf0020433b888c13e7d690a412969042120b1f33b30a2ecfc4f862decfc16152bac15252c2063e7775b8c61e77bb8adb870040831b0f355b8ad24250921c98a0b56e06e57bbf08faf4078817d12a30cee12c0192476d0c0f369aa3330a80e420e75b2908890830754f4e8c1fb1c44886176a6dfde8e29e9f3427d28cf068b8aa30a109caaab896a650463f0903f181e35e460a1b182e3071c6600387833283964c0a2d41e4d50f159a2ca6cf8162a6d081994a68247981e55781987135e4e130fd5005cf874618023cf083b7f078b9a438d97426b819723a5ceb4dac05104ac892a89ff39eb79cdb0d683744a5718eb5fdddd6975d56debbcea793efb46958d3019dc5fc7d4cd7d4811ce20f070b82f3553a994f7892e6fd24a694f5a715c6188e3e588b3d5d56ab55a519f0daa5e45441af7b588e6d1987765623bc330ec4de539092b837860188aa24ac6b3d5a83207425154b5af2cab55a9b766ab3b551612552a277fb856629015f656967392e5ad9b83ea461a391949c13ee712aeb3ba8e8c62cfc3eaa5933fac57d362d5d89a9a1ab0a6a6a6265553f37935351d57b3d5545ae33535b3a607a0ca47703fc55430da9c45023a7d239dcc435e6d48849d529f55958d78f03c9f5349ad0db52140475686d6f3bccdeb509589a810a58ebbfbdc3617d7b9acf8c3f57d5e0782dc0656eae0047bb599316e009cee1770cdd19bd3e79c734e9f734ed7e84d9c2013bbbce454af211cce2ce0f9eec515bafb48a7fb0dddcd18009b6368fd5ac04b4b435a43d70fcb755d59c4cb49f2340882e124ed2455aa49ae56d6b258ac563833e3aa93a4a19935eeeeee16f0b2278d8d8d8dcb66c6c6c6c6a665636303a66c3eafb3b1b1e1369b4a6d7c7ae08901411b4e77ea1a378e0badd7759de77d1f91540a0c43fb2354a99a5cfdb02b168ba562b1582cd656a9b366dfe0964cfa3ed2b0f4e7ad5eb60fb96676d9dee96f126c74db7c9bde90cc4b1e5be75655afa7d7c7a9d481c14a1dd8166eb6ebb8aeb35e8afafc640041a794ceeaa3cba69b6f3302d3abb46ed4e7b611e12e2bbdb0d6ba893f388e36b17d3defeb388feed0f561384e37dfb66d6efda9320b4080d6bddb499e20b33d27ab935b0fc711ad807389bd72c1fe5da7a577fca75491e24ce652183141427460de6428a57436edde21e3a57b1227bf2f95a2a9542ae5b3552bdafc94078aa67758c0bca494faecba61ff5a0438b520e0e78a77f939c18797587abcf4e901bf8edbead7d4e797a2cdff8ae6a44c80ddb3bdf43a6b6d4ed534dfe79c5e299d32f0c24a696f12f0a63baddec475e24c3c7a9cb7795ef53c8ffaf43caf2d155d83388ee3b8f9ce558e9b73c95c6aee665a9de39c6e1b0fee1e0cd79fb4d65227c3b0bbd7c9d5aeeb68d779d775b3ebbaaec3a92ef0c24aa917561d59d93bfddd5cedbaca7151c24927750058ebcd4121e5ac3f470a15e14a6bc51cf07272c0cbe92e5c2b587390eb876ef4f6ad4028e6665dc29d6e7942e1f93ed2b03ec91ca406a8048bd82aa320648ca1190106000800f3150030381c0e0b85c2b130cd43710f14800d88aa4a604c9b8aa32488619831c4204288310000000003423053db000d68f126976ec454fc4be728212e748966cca6e1750febf1589ed3339cd995d6a655b618244586e8a9faf4ece9fefdbaddaae6cd1ead174dc32f37b8ff972374da382f5be1ee5824efd15658e9272e387b207dcb59add9cd1354e813f3ff148968b8ad926323e2244338e04c39e85545797696637c70c3d175e09adad295fa1e0129a27ced00a6f77a33d0dcd8e1ef50d2270f17147b00a0169319d883b9c8ab208266a0840ba2ca15e0aaf5ddf20aeffe446096fde519456e83fc3efc7978399384c5b773603057065c3c7f0c8282836f88dd92e3ebf8fd82482da5b2ab299403030ec994d330b81550e689fbe400af1bc62efa22aa33d4060af584c338212c52476bdc4c5576d4e0c804c5db419c66176b8b884b7003920fd0a102ea658419252667004b839ed4ee8fa08209c00e1fb6d4c8ff3fb8c45a0db630314f581951a8ed9f507555b13f671cd90b031deda5d181742f5b0c66a4d75feef13b14a0b21dba24d7282945c179616d30dfc93604fdc5476f7fd5e4101555ca678acb8cb75247efda3218b84367a547a8dc56355821bab905fa75438e887d256e17d77f98770d73ac2377926c27b91196cf2467fb0980ca86265bc728727f47212ac9824a9d4021c3ca6d4e5d700537589c591289ab34ab42bf6d0d9081d1c9ef13a7506363a15c40dfe75460f43d0d4ca4017d71a7cd37854888ca8ed3963ff606dca4ca04ffd045b992cd206dacbfd4e3bf8964b801b6d6b2ad51ce47872557a05e93c73d83bcf0afdb289c6351c1dcade1ad5f5a44f103a326aee14415b7f02dfea6c9838f4e320799e4888ca947933aa4678835628fd8e7d8337630f6a1839b7f17b703c78540700b6cdc038b9b407039705c07f844d78c2ce41ccdb43f94c4a5ed97785a7f6470bd522454debc82929ae08eed93199d2b61e5a4d9399f30ead5f5695b80d2d4fc03b7a1b603dad443a55186e4656350b488303c5dd5a22bae5766493bcb0aab345bc7fa9e41c4deccc5c4dc2642c2feaea53fbb1185bcf4840ea7f8ffd942df655bd6892415fd703f828afb014cf66d90e3810cf18da5b578bd6b6850a1a3803b156a26ef55a89495d91b8654f71b13ba3584b0667c9f90801f7d6c3a57cc29530e0fdea10337206aa5ddd1797b3a5e6947ea50ba9b3e0b86952584c78ee91cd97980d5cc347c750afdba70f9985e587d758df04f3529a4c6cac966f4abf7453a70671f52d40e1a3fef8b52eb4dd92335a16868f34f9df43a4aca9e6ece70c2bce73b7a0a157e8894868c6f8d839d25ab7f169012691a4c9ffca35ecb7eaf20dad982d4321c775d0a4a5904a0e7f4157d2cec559c10665346a8d45bf8a68f15ca4043947008934c7374d1339c1bfeb200b452cff7218b8910fb49da07ba2c17e07d67a02eb32579d4b13c3f61727102061b61a6a9fdbf827bd70d20c310074288bd9fe0914951c98b28295b87eee8d6c6782e1c917c741213932bb4a2f478f8f0616de440b88d9802b771d8a41ea096fd98b2b1f08e48be5f1442b795be4fce3a8c17d47c43fc55d8cac8c2fdbcc127e56d2c383007b75dee8a66945d9019e11882780bf11ea874891324547d6671533fe431c0d625b348a641ec7b217dd6b34cf6d8122582592fdcf6a34afd24119981e18f0b06bfedda9791dee3c80fdcd6a7f7239d30cd91ceb9665fc6cbd571ea3c482285fb5f92c85f317fc02b81330a958f664213e053fe2be3347a41e6903dd768d540e22ba2d9db9ae4248291f6e8999f2e02963f7fe738e759aad07945f5fdc429b9f1415057e78807f45904ff5f2379a755e00d40b78135cbe9d0064b99c5051117b8f735adde25e3e0b3adf9013ac3402583a0b552e547320cd870f0a0ffbc027a3773436ba266d11074a8bd92868e19e962e0f1d33906233abd8fc976ffe5e05b49595a2a364f7887ce6f1d99675b1b3ec0895007f695d690a10681473e8930fe9e60750eb629c193779f23701d3bdb55bd3792192607ab1ecb5e84eba3e4ebd0996facfb5f837aae5aaad2eec97956854d1b420b4682c92c991569a2fab2e0812143906a36d44b54b0b912360e2cef083c6ff12164a465b994b5ffa325c80cac947b740fe0c6b7e51d1c36377a3680359ce930b80417234c3fb9cdfbec66147fab8adae5c2fb3ac18d80a88c93470c600e90ce1c4aa6bc076a91d2cf52cf6051355ab4f65b1e95081f264fe654e1c37beb55421369b05a6ceb2db03d3ba4cdf21e292ad5e0b9587d1b9ed395e1df9d05bc2379cbc03d98568b1dfe3e6f45f2f65047a177adc37011cb384644fdeb488735e6c29292e9a349f4c22e5539bc0fdf91a3a6e65c6188b55b6c7f18aed0697e29a92159ae701129f9608145c5ef0bacc9efb20bed3c4d27d98171adb9b4718af5e6fbc5de4cd8865e44ec19a929141caf545eb88d45d8c969e8002075088bd05c52dc893d268447c1e009f116bd6ccb4c4fd8eaf6010e40cca062a1100fa355928a9a1dcb3c0ef3a9d37f765e97a41604d11c95f1827ebb8c9edd5af7f2c4d3b0429680bb2f2f23604452100cafea2bd9ff1e3b5b7b16f2039755f47d17eeb5cf86c5439c961c4a1454592a4c40ae353b4718e893de8db9625d09232983e6f9c81f2715b5b006928d85d265711627569862b8dcd865a9cc9302038d548c961aacbd846798c6a7a2eb0b4776614fde6b99a3fd9fd1a80047aec720ba55fd54ae706cfc5f463339b8c1e40c9bbdd9925f6d0ac4272bd12a77f8ba006c97b49a83801ca0aea461a1b269e563422709c3fb6a0a1b6244599f964d131a0a2be09f7169bd2c7327231bf0541a281e371cea5d8e0c1641b51d2670575a74c2ce454b7394a690622ce4d0fb50293ba4617a71045cf0a46ae619e61a0e3f236dbbeee543556acc0e773438cc9dadb73c8a015c282b17c9de7b99f1cd1498349e9cebb24b34d41e9b88ec1560fc6d7de5e61cbf7b994862f5d239ddca24e7ab93cf083681e1783bd3366d3917d7f90bbcc4d14a1a20b09d79b571cc71b04508f718e8cf077c7c23bc897375612cd4fc085a3b3225b03a959cb880b20ff007937dc0c994f1805780de930f449dcd1c69e006d92591e7fc1c706d1de10a2bd1725913d4e8b56b4c34d842b8268538580586d0bbd4aaa28ddae7c3e697c261f34a71f8ae2d15e4410df20186d4f41f2acfe984e4d126e37d0c78d8afa425dad682af7973cd6e938a50a05e15c64636639226ab35d4a2aa9bdcec129ec39ead083f533fd4e59a0153c4dce4b4b953b57746b6c85a6b58f53aa130e50b736843edc886144cf9cd47b19ceaba40a88add1a00796193750f2db4419db345f78eed1d4a2fdc355f2c51f537d14af1c9a0527737ddeb090d4a6770e99af0ec22cf660e55259e2051e96823733f83162a7804d5dfcdc4ea1aa513b15cd53b902a3e403d1b1c89851a9e162188e2e294dcf4b69b6916bc0891cb6ec87ecc221ca8657b174c5b424baba2b4bd3ad5f4de2bcde8c53bed6f48e5aa6ab56ea3fbf01b8d85249321e0d39c1494fff7f8371f0d41d31573fe6ec41086064fabc356b41dd37be78d926fb29ee80d3ad524e18afd9df351dfbe524f8d274245695770d3522850f5f4eb5228cfc4ffcf53255afa339d077a5aa69535cfded179149e2c5440706044cd4abf9d841241d9175166ff82b53b28af25284d7d50186bd09822817af6c5af9f9924311f0df9b2d827c52465451026bd5674b92749278f40f2372a56aac36527147a836c504b2b18a770802509bb7acc667192ba6ff2b1e653d839ce573fd92ceb44a8fc7db8fc40a06bcd873c69e5690f0d36c3cab850b5e9e1888b4a020244e2e8083c2bc95ed8bcf00579c1291ccc3ab685f26c2e19e359261562c9a0ba58a0811aa9236329aa5a47da665514f27fb7ff39f1fcb5957da470c70a3a6d212910f6cacacc0275ae4e0c5f585409f4c33602cad99f9fd42e50551f95dcb551c9cf342879898edd65c06c4f05879b548bb313737ea3c8ee65b17a38cfa4218de81e10b7cd544eef0f1d88c016592b62b9546f2a9308122a3c87e0ff7361aea0ec7e25effcd58f0a1079a580e9c4ae796482bf72eb8a378d6e57b280a4c144d61825fe59f5d85db29b84f60a9209a66e3f095ee0d5dcc2fc67052dfdbc12af7cbdd07bc37d4bf2ef9bb15c44936e5f9eaec801a797f6633343a296108183aa601dda2d24ba7a5dd2d3e4787340376126aaca7fb8ba3178694048a15a22165589855db62d682066a1d8c4d6aa007c70d79182139896dac5a834a890b2d85a9da2bc96d647147681df81589b9d13b57fd084231fde834fe83ccd6c04f75199b486483152381cd4402e6eaf273c25eb7089b2c6aeccd943eddbba1688c908b41df8b082d66f0e91f4c675a5a73ad392c3cc629a1f7506a98b033d00136dbc1f9e54b6a9a410cedc895f6fac0ad895e01a6391e70ac406178ed02ba48c03320ede11cf63888f6ec1f63b8587da5c2b3e82286db4f98065a77fa145f21bd002a33133da3090766c2922e2fe1bae7e7097ae09117093e411ea5c43f5798d766845a95c3c8860eca1840e560b2bde73547d91d42196664df154ce70a729e7daa281c5336fdef55ae6373917d4e231f71f9103562ca328c9ebcec0efb4e781990634710348190d68ef596c22ca671b41909b21374629a064c012e93c4d5c7713c9e99c1d9fca8c820f85a9709edb1f4034efaf8001fcfc270ad14676cc6fa08fa285c9b1206d3601bd677d8f2b2c4565b1094c08f4bb347ba40360c07458fbe6645a0ab824036f79a496b7e002fca0116660457a383de2eed9170c14006934cc86bb28592c81c9a2ca97f53b61933c29d08f99b939e8827bea5d69f4490a3efc039ba400560a2db75fcad8d35630c1d79c820f392d9e28c3969a5e8a84593756718fa35217cc536f15f7e873ac007542b0251fc411bb37d7f211cb49245687f4494260ddfd0fa1664954c1285895cc1447de9165ef7ac34c2c631e28144c6b3b5d07691e1721ff1ad2936714f906a83bd3c351692dd0763f5d144c4fde745ffde1dbe743cee94f8a4c6d39836773652930b3602707e299a0b4a0bd07f7b1e5bdbff8dfde42bc4b1506c46953530fed25d45d66e437ee172c0dd35ec2552eb584fceeae6e68a9852e84dcd3dc0588a4f888a6b4eab4dcbc1b0e975539a5b88b13dbc5495eb4941c3de43f4543eed59ddbc54cc707885fa079ec1a16fce21cfc8c8c2e213ac687776cccd0e56a412ab497ef07d056731ed77f081392c689c0bc23600dc06ecee6b84fe6b16cbbe400e02ff23327d15638d07edd8e3887534e81a405f11df4fe828f6a43336306b58a7151f97b9be526d2c2484425f9171df557152d7bb2bc81bc2c6435d10db1a11e8189420fb9753b3dbeab43712cc75ee353e2202db23010ea297a7fb5b1cf789e6c5ea0d93d3a7fbf1f4e2a1a663f312e0734fe1f4ca4f221cfa3b83d67cc091e7e409508b76bf0fb81ff131f6895f71a29c3b64112cf608d0017104d0d2ed781b5f60b760779c1bb36775cc6fef9f40ab215e092b0f96cead71dc2f0635cac1651233af39204faa5f030e3d6d028261815d96e420ae6441e1fd45105d112aab7205de3e2be8dcc865f8c1f9ca05b95b865060b5f681315f2791073fd20496bcd6ea5b241b54210b4e62434958ed01bd60a25fa91221a112bfc193726350d9291534cc340db639dd5050a4534a15bd43e7f867aa1b669f9c3c5e2a2d1cce8b64bc3a8675181574f2cd6129ba9b9012b9586c1eeec2f1933e6f90ef7b5a87ba745b2e4ed85f7a35a5ca8fbc8782cc4a7ece4425db228f1d0c0f204809785eb9e11cb327e07b82ed454d0a25993b266333aa6067c715fc1a57f8701ec6a3ffbada26f1e10a75dbae509832d34b7a8f6227a3c1145ac464976400283da89fafa4a723d521ea1c56c1be46132ae45075ee40e20244ba2feda129e52926070e4499b68ea326d744c875e1857c9a049088113302611637839a20e4d5fb2d5e68b5ee2e493383b80765b76fab0e326c37aa117ed309af6cae61717560fbfca90d223025bba39064137340a3d278b0ccce9c0ac64e8783dd05c4ea1e4ab0713f57c8913701a8a53a60258091c0152987ea71a4701c94e1126c14fc40b3faacf84fac05b46cbb63019e3b9b3d84c4c353c9775eaa0025c32830c69f23506977a9ac649b8d675e5647f226614173c412bb0c4251bba6251a140c6830405f21f941bd20cdc18fa2cd21f0837e8df999b2102e198b0e95681f2b7fc87c922483e663d0b06052ea0d33d8878f780c3de983f66e02250df470a05c263ac510e68edef13f69a0f915a066cb571df0798b9963b8611350ece09b973ebeb3ae1e15f64a8d8182b8662aa2e2277c1b3846a2acc6a715c1f585999c200055c3409ff07e52113ae526ab42831d41923d736df7835569398b12885519ecddd58f9201843d7ad8a135a9925a36c09536aff9502bc432bb8fb5ceb67db2ab0d4067411f12e81275a29bdf855f728ccfd5a0e6338df50bc8d988fc7c5ecebf7df9aa368e5c735e04271654156ad0d9fcb118f1142abe025334d90bd7b79dd67fff33c15819f8d03b49af23cf47084956d2bf6e51f0bc0590e84a11409297c639ba7659e9eda6e2e9395284b1155d337fe263f3352482f2d584de1e4f4d08d83cbbf84bb8d45edfe2b064dd54c44eca332de8464b1d6ab6fbec72d02d34c5c33ecbf33a8357e27f10d4b7b26c55372506c98cbf3b555dd01b4ba2eebb027ab919f1864d886faa41f688b305140979326dda15dd15e2dbf925a95d9f15f51267d6fe623c9b0198398035224b844e6903887da58c4dbce4709235e91280d0c6ea1fa1275704980574e0fc68b260f14af3d539aab1f592ed013bfbfad50cc36dee9b9caf42f8c97e6f2f30a017b8564e530f72c0c68420381212369cfaeb3eba78836461d811be6f953c0cee6638bce4da5f824c832265fc3039cfe1edda55d00e4e0d845be5a5eca87c74b4444d98cb3e4ea50bc8e3b139c7e11c625de5c0b975fc1f5f909a701f9f85db2229a8633cb15ae5037ceb887ecf78a37a3390e3e0dba5d4a103621c59044a1105acb7be82546117d941774f68f1919d2404085e75d4a6332d79e70a71fd360d7b7592e3a52618302693418803fe42fdf5d2b69d6fed5b8fed568f45729aa8ec882a280fcf41b82766d2c74b64a09f405c88d082dc7cc60cb001ccd46b828e25bb6d4327344332e523013f7c17a53ebe7c8a33ebf429c134a63cd307d0e991cd11c32c9379dc40c26020df1ba85f850c197e3816c88cfe4cf1a889db984ceccfe6499fa21323d6e2d596e4d936e938a05b9db03859462cd5f6457d31d2e85a3fb924e16187cb385bb79f1fcb3a6b5cf469af59330e4d218fa11c4688b886a7d868c04a9aae58fec621cc75d3cef3e2e08e5d71e1a0d720a9e5d651ce9048a6b74c550fcb4cfc545108ff3654e58d1040221da5107eacda3904bed49d3b76fd017e7e79a1f6511f40c054f4cf9bd1642d74c4023de8460e4570dae9c67f9fc95eb8bb2a80d982232df570556d9dbed93c110a1c5f363b0c0bd7bf9500ed14be8252e991b4c76d4a16621e2854889f21f3eba14ebc1dd3842d1ca8600db2926d2790925608e690b42be557317610efbbf4e3247fd82ce9f6f7927b64f7b228efb08d24d93d0115c6565d6ffe4f5dbe2a88282303a6153c279af6355a4dbc8bcfab75cdd28ad43d9170ae21d8ff3bb8c709baba58627837eee0986187fbf6a2e5deea1ee559c173bafe6c09bdab8b7aeba01d34a6bb20c85d41d7ad97b377b203c7eb05c333e7aaecb8fcec47ef51135c5625fc3c7c1ecefdd554e7caa1a409f007ace72e982f1f4c1a3469b394cab9a1740bec9c50c287230c941b6320564811a0fa249781fecad4d816d975db7e1160890176d219e4c834bc6aac82e618cf65a890aee703039183175cfbce670ffcb6516c9423053b2f6ee004afd70982a0ca4789093db71c18cb1070cf36dd2b6eab70dd13d22c3fd010085866137fba8d469c47e6a02f2bf6bf47b8add51a7cb014bf0ab4a407043061f8e00857dd2d15bc5d3407a1a730862e191a927561785b015dba55a0c71a30d63bdbe98654a72df620fb9dbf05f38ad7d45bfa7f0f063c0aeedfa0e77a375c940523058ba32212d31cb4c71caff2f078b115ef4f1a7db94f1d34f78a018ff00332702a63cf638fcc145916972b9ee12b8d9f93fa63df69c13aee75cc9f8937c0f5b960e81938e81a8718ec7ff6a5d34659daad07eb184bf407f5045adac3e340b75cdaa54428ad0dd4e5c6ce67c5027b9ac818c5689d1ddadebec42aaf2a16c907c2f332e572885603ea0104ccc88320a4ad69e315e24d4ec08630d81841e3e02be6d4400e5faf1c43c85345ca0d8c35518650d16373daa16ff7b87577bea3a90c032283666afbfd71976cf7fa2b5d271fe2ed31c269c9aa13d79aecf46d47b0a1ba7ed59b68601ddfd9a202074057866d9c29d5956191129a3f191bdad9fcf31fce63d01bd0699e5d1a8da55e152f38d285ce1b90bf289cd16fa4cd17acbe2e4432f83e022d27daf49ed8afdbc01a60e10d186d8d2473ad224eb5ef52b5592cb34f1e889efa5367709a1adc8b13412bebb6fe3b9ab160fc87f56992ec0effb1138bbbd6c58b247bcb20492181dac6340528f6424d197d4a079b1733514cd7f8aa9dde531334a114b499521bf3d0e7fecbba3896524a76fc53d93cb485fd8d08a71aa09c3da2d2c1446f30dfd25bee456119cfec5c121ade66850a0bc100933e3cb1552e4a0ef02d848c1d1906e94818936c95c570340c0321670891044baafbb10f9009a808962b18b71aa1572dd11bc0bc981e8f7915a5dc83bc13152ed196abba3eed80c46360b7a32984100c5b230f4532d92c9968a689339feeba29053947a0d149db69d416060205205bd07a57758580bf176b520552d1cda7b48a05a7aa4d5f145e50afd0bd3d745af80c26263725306455c9150341201e4cb415a8097f16d3ec439a8eb771e09b0c1f5b815af88c2e9678e815a5770b05dab3008031d83656a4cd31df79460d6c4e9a480162d1c2d7233cb339e7ff0eda6e65d6e1a35a304b8946dd63979d55c0298c44ff3954cdc3d5e801715591812125099bd6da205dcb4d8b1d0648b5fd515a569a6d3392b9f24f03baf7f14a20512803b4251784f1b53180cfeeb524f8b5c7aca682503d214d42f563d48e99f5f0ff85a7baeb07291bf6f5d2079a5e2f5dc525ce8f1c4339b3958e7980a932a096371c556f40b43bd2499ebf6e946f66a5591da6bd85328e20bdbc529ccce3bebda08340af7f842cd9312c2e6da2e05a412929edac85f4678f1a65a326345c5a7c9711e997c8998554e305fec92ce575c74284f6c6ff857358e7959e95c1f4b215acf92faf459ae91e566dc8f64ecb2e53f4fd567b9cb84825e91438b5dc6b44dd9dadd539e4e522787fa2c41e32e8507722981993bd288e06decce25548670124f5a59f695f109e772caf10e4ff5527cbff80fbe482e7ea1e07143240c87dc221af5a81ef9fa3440bd56111ec2699420bacd9cd8894e31662971ce20eaa4c68bafc9cf41154a77056ea0467132a14e983eb1a1fab1765d21fbd4275846b9f7c1f90dcb7d357a47b2bda79a96c0ccc996ad7337e4741ee3f2527b2d05c2aeabe080779826754ea2d30858498d4c5a8f4aac0452aa5e5424af9559aa25170941d4d7f8eebe6a218f57161d0fc22569dba27feb061c89e58af2f7a824796ce148b9407468537d18d58445c530ada13e09d0ebf33a7d7c6323bd32cfae5c9b9d45d6f77c23f000606abfa3b26b9aab8a368e1a28fb8c334a93b05c61c4c248a6476bb7407a31bbc18bd1ce9f7f36df27b0f69cef1e2fd6d0ebc75228c06dcc113dfebf133ef9b0e10942f08325ff58f82cd1348ab2c04e335f1317c683fa15ab6a69c3aaee84b84672429dee91e9865ec5c41a9de2d785acaa866f37a3695d25190e6bf8ceeb6cee885999b52c8d25e8d50bb26c38cf829e4649c41286e27835668d2f5d285a0a074f14967060817134fc5f9ed08c84fe6830bdbd9c919a33a4d5de4d554a100bec6f3b881cc36d92f1d8707aef60ca2a49b490e73209ce38a3ff6b1301eac873f41c1f988a32cadb81f4aa2712ca5181959b27d0e57755fd798181f65ae07255ca10528984bf8e7fe3cfad8b70efadeb76eadc1f77ccadbb4bed9ab7ad1618c1fd98278bcc9f4f7f533e77904dbb09788d6a874820108081a508f076184623620bd8990cf15cdcb8aee67479d9a03414014c3dfb7217bc0092e4a75fc1125872df46b75a3a2f6b58fe223e147dd64093a4fc5a588a016fc5605917e3805bc6e3800e8c9465bd5f0bb6fec2f5f63c7bc41900ad11be7400aeb530fec482af28605bf9b668b8e44c91b92cc6cb7b57112b104d02794af18535b4bf4c1270c3c4383c16aa59c500bd44d1bbd0904ad785158ab2b808619d14f703ab8048473eacf3b334b2adec9d6bfa883a142a68f4eafd1b121b4dbe69f40e9a31eedd5c8269bf36bbdc69f8e9f4880b2b9e9532b77785a51e303684f1ad7ac463cea28353c049f89bd5ca501eb2c0fdbaf15ca6f9dcea37130fb40678d0f50bc4f4ef4ad0a6612b0bc5aac069ee1bf17cbb8ed6e4446e4d2dd53baff2b69f05274cd0066614325a5b0ccaafdcf01c8bdf4ed8b6ef21d3ac3a5118ec25a21e8d162e13761acc3f8c3e00b7e109d038bc77c1a5eda5b38c6f0af2d939bb7277501179532c2dbad4ec48679eb768b36ad6d98faf7981da4f21c55e6a19a4ecb21fc819df3ee856dd55e11bcb420868a86199faa1ab41795ed3b01dd825fcec6b85b5c9d507a54eed6b58f5a4dc7426227efa9b1c50d83d5324b6821ac0d2916324ee563a98f2154a9b07763c90ecb52094356412e36eb0fde257f20f111e90b5242aeae56b30a28a02022953201890c0d1655bf0d59a747d283b23fed14c0cfc6b2148f4dc78f79f7c094f3d0db3a454c00930dde76fcaabc5127ec70114237d8249319ce45914025a4f4cc76afb24974ece205d5e299c9d1e3aa63da2f1b7700c1f062e96270ed2ef710c80193dd874745e656e93ef35495d944c3628b4d1aca4e66748b06f0a1bb6fdf06f969db5322a0e512dc5f2068677f3b5332236b64b5480d929438c9c47cc3ddafa5122f6075f114df81d76e1ecc9fe44bd94dbe75bda9c49f4bfddd3825fdcae6f74a934416026093dcff749d08d0aa6a4f21e02d2f7d908d6da117552b7b3ccb991851dbf3b9431b1c02de276a4f7e72607eaf2f3bb550619b3531a7eef88c118166c573a6715701e024ee7dfc646bed7314ae021f172a27b565a75fd6b4422f4fb8d648dfc00f747fa59f4e0f306bcd268a33e99a4c42b4d31b72d64daebb0682f64e9c864d8c5dea8acf9417ae5ddc661212627523d6a0716f627e8a921f23fa4d49c40852a29ad7430d7d1581f8fb2f3a3fd212618f9ad01686a430b33cd0296f86a1a0f161ca423f78e0c2971912b9e48d977a34d387a0786fa534a2dab951cbe13a5af4e830e213bf181a057a3896ebfd1040847f7cae968a8efb22748cf46d1247a5cd4d0e155a7a315dbd104d9208de9c18ab3cf067c703ea1c989dede581f35e62a74b5a18ee3cc8c21c7dec62680e795f9d77a690bda38ed6780e9a733307a3d5c5f562f501ab81cfc66bb2c3a31ce4430120458a558bf28f5f4148d2caa7a9a6551f622e8e93a00e58e202d62459ad15b77f45f9798c9a2478d7a6f18a1f62c35788408eec8b788e85112f108903a41056c7590fcefd643a7c32e7aa2e512dc0635eac41710b0603ca2550ecc0fb8e5b24219d7989854ea5380f7addb06217b6352a3aaa257c6bace1031b261c2702b4a8bae3ed41f6a554d6027d10502562048c25e6568f2de0a16d14a9ddd19d686f4ceb83ef836e3ef1eaad049be8c08d4f8c104c04b6d8322f0d133920a9dd4a85e5c8c0d8a529004063234dfc16b4a4861d71c6aaa905c86a373686bbd76a0a82bb02a2ee6a0572e4348f9bae2211ca9793c543f15d8f902e76eaa9634c4dd69436d270df53c551ba1d1203d28ac641b7427b3b134f3a3467f2be52b09b9988d8aada8ab0550fff9808b07a4638a8e04c4b355b2de3d896ff359399d5202ee8c402262815d3cfbd8aeaa2b8d47a5ee889232db93adbf539eb3abd9df41d931f861055a677cee6c32cd65955094feca8a7c286dbc3f9af637d67d35b45ff810dda5e78eceaf3970641aee6af803be11c980f0bbdec70f37e768eb5d363dcd443f59c7a27195e9d52bfca2d1159a5cb87ea86e8d6ce61c28857f308e9b67c261a083ef7c7b646d501cd55ed2da93fe9869e587e88d88897803dcbed79a1973e178b8e16fffb1dbace94290421e020beb84f2b46f38b613e93ad13948c38d6ffb263fedd9e44f08d5b9e2c1a402dd0ef73a5697c079f83c36f2f1a958df3d17afb86b9020eecbe3834622d6538e1757c8377c9bd18bb54b011f26f47123a1840801db5c4141d3ef4e78322538ba155bae3904e18be31499120691ea47a942d58fae58daa6822ece3443773cb33444f01b4b03a883e0a3dfa7b9131a130589d23ce6393f92a999a12df04cdb27b3848b8e2640c9f6ac0da42170e083b45c809fda8aaa1113163a0161ab3ad0f143a187702255d1241dbf71d248a40953c5e4edcf1bfc3c03f16fe30e8fecc23fc1c761f94b57e4cc3454be49b10ee66612f408346c8315a7be46a9eb2016952724be39009d04daed3b48b8f957d132ae2c63b061bcd2eefd5cd6898b53e560aadfe02f4e010eaee044d5a1eac2f1448af1a5d19cc1e35fe669fbcaa1fcc27cdcb1cd840bfa740763830e8acccd69c65dc040436ff5823c91c5920e644ee2355e1fb463c142373dfd1fac51b0d3ee2f26682c6774a779498009e87f0408a485ef2d8b31ea6f823806b8d788f19997bc9445bf20d9e23d80471be32fb3b31b393a882e7cb7ce2b5209f4b494f8d29a4d5da028c44948742def6af28272a1b60a2b90d4e5fe758240092e828d9f5d6b2370973bb9ed383ff8af4340019bc5f980a7fbd48ea6f17d5097ea25b53c004bfca04b11730cbf754939d08ca97397521ee5246c6a0a7b20f705e8da103c32ca32114ba4e353f473449c67995ab2f67f29a35c0de40950ecad4c73d1dbf2337a3772d44c4dec0956c5118bcf7bbca0379ad18c543ee0eb80bbfd554f4817d63dc1df5863c442b431f9ef8d27a2624e27a5fcf7b8db9d29660c46db2c573de3beb91c01e840ec01509ae8f0648631d595fbd55989de4e2aeeb776e16f532f2b6f430e24f6f1201b42f7a42a70bdd8485c1ac0c921f03de55c2de2383c7428c825a60b50199d088e0391ba2bef2c9d8e7eb709856440ea1eaf0d44d23c203d8c219ff24a17b4389519805c099b48aee6d1bf0178f55bd74fe779bf88f637ebfb39a61fe9886a825e30a85d7aee5919dcc99e9f5c2af4c2512fea8ddff2ef766a42933986226ad85f723baeec43a8289caf28c5c77103eb722a83ecb6f4d166441e79ca7f97f312c54f566ce9344aa078f16927b2d5ce539e285aad6aa0bbb9f6ca3bd430b24645e19b4999e1ffcff6b0f607eb17f9c63dd633ae9b36df0a277dd2a80ad6b4894974d1ebc68545f5c91dc427a7d65df12f74f3913cb1dda7793d075cfae347e76162c81bd59f6447b2ba8bbe308435784db5c0e1e7c7d4960d1093f968211df27f8464a045e743a9ea3b07398d4fec75bc28df0c291da8912e1edca340f65b3b6053ed28c38081696d1483c1c093766803e001a9f6948181c0e96ca3f77499370f1445efe01c9509c831269dfb365e29250388daa4137ff60fa6cc1a22518a1bb759d201658c87aa9885b0fd5c779c21e487357fdb28bd10776ee3272f1186f051df672fe3da3679eb930c1103fcc17edf755deabb980c1617e090790ac7edcab57bf7919d6d782747e3d9c73043f821ec43097f3d7f3e68e1cef92780bbdb473fa31619beb480c7cc1300374bed7e4498ddbf2b0e00350719407e3cce4d68241a7ac0e89f35f38842fa298adb60fe0e354a534246d9f629a1d4fc70a6b245da8dc4a355267514bad0fd26a5ded880fc847f301403d13fe8340228e9d41104e20cbbf7747889ed5ba4cbf7b18c8f592d0b7af8a8e888af4c35ebbf566e9b04807f2addd75d0fe6a4426eb6c9705e0380b1c9f2b830467257b03f88c62d418954d0fbbfc3cc1a6007c8222e1e98ef7c09ec01950a4d1ce33e6f9ca82ff354bb18cb262426833614d2c0ac50e18d24e10ff90b6403474a02ca9a7482e4c0163a9fb356a862bc33da3060e279a86461c00cba977feedbba177e016ec664ee372243f207124d9f34d9443f2b2f9a60ea4024c8d73330ea60501aaa3f7e07fe8bd847f52bb951272b408bc128a12fe2a44bd776af47d04875c50a6075af542155a194fe50c778789c0498c548eec7b1f74317005086932de2a1ab65310965e76406af9e5f6ada46bbed84d503c78526d36a0f5c0e639243c1746900a51cdc6d15b77eb5b94cd6a7c7e3f02882b1528519b3d5844608c71e5b9d1babc2150a6e6036669cb3fd58a16cfc0ffb5c32cb62d895f5e777ce360e4c02d3c45a9705b95f238a46326ba988c518c5cefacd5032dd3ad7fd096025937a212475feb0e08fd5081dafeabb01fc9731424fb12a0a0975680d995a341f80075e85f6032331b2a025c6a7670740e8a392871a4cb8d45fee99dd29fc65d60c5c729ab2afb7ac03f0acb079aac3ec017f0f132aeeaa741c381329cd79def27075d70582e932db78a82ec2b73d810266ae4d7cc82c5daccb2a2c0a2d0a3272e29d8494faa97267dec983c1f4c94a3e6aa18304eefa6e151786a3f70da5f62b8dcceedc5ee426f1e34cc02eda2a4e80bba1078d17fad76c6d972b0771f35e5ee1970d046d2423a00c4c4f3299c02c8f81723f520fa4ee62198e4d66a00e6141a9c8a9899d2f40ec31623efa0af9a420b687807caa97b231c9901e8ba8153dcabce71e62fb47c37ceac3f3f0813aa1345140deadd0600eaf18dd7449138de8d0e81f6d700fc1d9428c383870c84456e866b9b6672d2fbac6d5b2c17231c5dc3e7bde8085e5089d10589182faf45009282bd8a888998b428ed619e7b89cca7a0151c6d368fa0230212f0af403502c7e8e489b8f0d09a573cc3dee679e0da20380ccc350638320e6c69e71237d0c20e9521e2d045872a84e5c4ee6f51dbc5116e448f0392b1c8ad63925a48281ce06a0e6d79d36ab120a52d8e14ba678bb3301414cc7f0aaa2fcd499fe47051a508417d95fd60d14cccbf6c69025d67923309c6d01c7ea07d162e231e746e0384b24e217a26e0df220b1718b0346bb4c2ed19b1e5b064b406461e05aedd7e8b4e6320c76039cee280c90a64e487a2515cd9bf6057e060c320677e78138b63911c83213356274a1a460a38af13a3ebeed506dd71af644b328d5060ed989f0e0956b9300589bc6109bcd4db934221b2bdde2a93d0ab2035b246c46ecdcd0eee68c65fc01334f647b7de7e8a7197f0394dc27bacd8778e1db7c072ceeac757e4bb050e64e57e0898eaa199b17fa6e2544437bb9b0ff63ca590264376f90b4c3af0c004923cf3829761fe29d52fec11945284c89bbd472f133207d6abbd6aafc7e7c978443bb48d77ff5f5aeff0a7e69a085a5cec5e74ef4a48bdbc92300116364ecb418fb29f74d495ca682de56ebd59daa0423abc20648f0afa30a4d20de2f07fe980bdcaeffad3a383e4f0d8cc1219bf64cbb95c84e286223f0e2205803d7dccbcc772014f619a4157c0602eedc7caa966449bd170a50eb1f1c5e8125952f8ccea4b24c56587ebbfb7b283c112e1b6a0866e78ae0a5b0b4bc7628a28715494f55adfb86f57a23c5783016972c492665d23203ddf9ad8e18c54dd3bbcc606af23d9995e2d78132a284288749c826106b499aeacc34b859010ee2ef53147797d07470c740020fe110bd08728d436b46ed375e94055b950f976ef0d292fcc26f3fba4a92b28b105b5a46323a1b3a029260c5fa9b811b48cc256670e100f4dbef45f6bd10996d703c1914540eb549c599803edca3a1e55ea25b0f4c792c069751181f74aff49bd42c41e440e9b2dae767340cf317cdd66a7cd3a988acee59707b6f41daf969499e509315380db2824eaf81959fb150a3b96209f5bb6539756ffd6058ea297ef32c6be638d59e2ae73feaf8d1ef6df510a7645bcd1c2a689e8e95e0c474e34933715cb371d7e6397a4da66e5a344f1f3a4b837e49d08d25798c06ad88c3e973d05e2591b0fa6c71c8beb759af02f4606c8403bd614b0ee783ab2a175a1cc9f09e79ff20f023af876efa54aae3df989a56fb8f90fe51635f1785befd416b87843943ffab6ba9e947f79938feb32e029ec8dc1db805a0d7ac0d03509e81f66a975c21930fae949d7052419928d7e93541071dc0fe01e90f1e7b653e7c9ef573babe101cc831d4b75851b906aa2eeae3b8da0c15d2209ada404fc24c6ac4fbde916d3be16afdd9cb1f954a523acf609a34a4cd5afa3b3eae50e987d3b5d2f4fa9b46539176031256eb27ab85df80da0833ff0cabd42af081a9626ab16dae4ccc7d2048510106873853c3a5e10327d04d5c1e6486d9bc342c0657dee19e7bb99484b3d8be09788519ffda8b0cd1c8a90e8e8e83644fc9e529a1ab664944fa83cea157e282f5ba7ddcdfd870441df3e81dee9d226fa3ee8025808382125f8232a023bcc8ea76470b99af57332619c5295be1d9c0365af6b5616f03b6731a8071f4d9d74d7051e1d899a448be3515fb73bb30fb61760ce368255e1c4bbb5d108dff54d5e86c57647a961f56aac5748e97a837b98cefa75c6414b35c9cb12f17bf37064a09f435e234a87f3cab647fc5f7750c6570ff28d7cdd094fcb995103948a45669f90d93e3ba779ac4bbac2e3debc0dd30abe9a4f3bee079aa9a32e9fe4b237de5c08bd78b13e0bc3ed6a359adb2d7f2b630f8e8cd153f9f6c690b5d8edda554305a3d0e8073831483de92c2d59b5ac25bc764badaa1ec0f8e3ddcaaaa05bc65d8e7b8a7e442e69cd8193feac9cfe8d719cc40ac5b027e8edfbb2d035c35df4267284d1bed682e31c43b0fcf150c584a0126ff520c51bec4b6c0a08d6f6b9caa8e6183e3a3b7bdd13e9e590af3708ea47c21b780ef30f16381e36018e25e6302f17ecbb1aae024cc97fa8a7c439ca6134a652a927bf4fa679ab5d82358e063b29c2f515002a9543705dbc09e93790a6276aee8bd9e8246a3247534c916d575644b6a04b2a5d7fcd8e252a2d8273e268c8c99126b6c66a1fe324c6a28387ca390e55db06a90a8c752217447119301a629259fd90517f4255a9d6670e766305831669f7193ed3063a41b2044385737c956ab824780f80c2752139798ef5633cf377c71999b2bd77753878714463b04dfd622df331f1f4cabfb25d53a35954597fb80bb86332a1ea9d62fd8740ffeee4fd9f1c27250d36652bc13bbe7d910b31829b5025ba50ebf0320a74cc23a00f5ded2c607c89853cf63eccb02e74cbb9cd8c60c2a41cd23c3476036ca6d214f01e19233819a7377388e6fd80312edb4a3f1f708061c2e9e4514af2a7b50c5555cffbb16ede38827fe8d15ae8b8d82139dc58697baee6777f8e1712320ce8072e957706b5620a9ec4321b8a175b19ea8e950bd7faf6e26c858d572b6bbf795060a2c6a71c63a51ba3a1119a410d6d2fd9e41b167b0bdb5342c9a080f91db597025ca17970778bc5fd9e09d775c570461c9beb62d199a0d500812f476655ba4f07a678e6d072d5f8bed7a0ca31300f911f0ca007432eaf99928eba781209ba2639ba0ef516968519faf571789b11c34f381980d552fe43525b277e5da3bc20693b53c1a9ab1e257818978c42b59c91f4ad4e3a02a26e97678a4360d6eb3abfefca2199c8556cf7c4de848946bad8730db9553c2867c12077173ed6a1d675c0ce7b23b6ec0f443caf596630293a82d553406265f9e47bab1cc8f8b95700381895ffeb1c9a220cd30c1a249167fd9b72073112063518b44c0d5afb4cbf9a415e135335b85597678da70cc95e84a28840369699af01052a9008643bc4b04760fddf5aadd97c6511cb568f846dc56f0821cd29c7e4f48eed4885b301c61e6a22d0bc864ed9495579c18bac789e8040f118581bf09f4bd8b1a6a012610801674872af95580cecf9853e2d7b431e2abfd5c787ea84827fa861d00890ea5abc78e2567072393d860cacf390d16d06d08469b4c65c8bb7733aa56538f2f61342b936d348f50d37890cc95dbcaa700e4ef1aadc3fcc4a82604d9e7544daa8852c24db201ad492df7802f010b629dde3f508c1b642e1ef2d99b4d7abfb9e91a90245adf2da2704eadbec5a3a30f7b112d2e7a5329777b09e5bd9ec013def476d625477792e0475d6fb0d48218a17dadd18ba37c5a82408527781058939be7d2eaa2190bcc7a757d410eec028449cdb3eb1f862bf4a68f7941e77264d5928e5c973d41f45864fa207329ec4b5a4f988455094bc74c10d4cf30442375b45c0e3377356f7eca488102fe544a163370b706b5c2e95a6973accc9012df61ee196790309751d683f4434a669f22e490121b76815e6087ef8e7a8c68bd88ee208bacb88c3470110ac3aa2e07a9c8b56390cfdcabe3016efebdf1ba50a66aec0e9f1f3a47d991302b589cbdd4dea1c9cbff7fce35824d3c8b0b350ca2049fe0d3727a16f5628631486d00f1cfaaa9b7072037a40095e679d5a332be7183bcb6e2b5edeac1f34e6dcf5f50ec2a8e283856d7edba1821aa270983223e1865e83e09e8ab843fb5f93e3c5ef164f1bf4e673c690351a9020c8087cb238062571c53f5a454cd4fe0651e321283abc019d6daafdfff4412cbcf7edc6f7804867671ee8bbfe4c76e84a9e36023a08ae1636e888888b91c24c3bf0b386bd6c5c5281fcdd78ba5e5ef81a6c5548576c3da4bcad44f36e136ac4573955507c8fde1875e2cd3cbd21371f4bae309cc128dae4ea3d0d9bc5c27af7786048853b78b85057a3116cdc77ee461dbef022f544ce70395fad391fb5cfaad56856fde39537fd0d4ecde484aec91417bc728a1074f410bd5a7a76b8925a58f4a4c60a4f8355155fda686267e7cd2c2258fba6bc9d9fec696372a39b679a99652b8be18ff6b4c642569013cd8c11f695699dcb2679ed5185ffc8c51b55e8d7014599b864f130fa8d1e6726f9fda85bfebc64d699231c0b5994ffff63300f54389f52bcd427979b51c21d164752e0ef79c1f0352ecc8b1777ff46d74633a78dc7b47c6773dd01506f528d0a7d5430270adfa0918748b518d9115c08746f12c930f002e193bf1b4780e04a622bc62ce35d49d2ede4ea50bd42b7112bb42611bfa48036e1bf959b155cd8b27dc585e1931de2914667c65c0f43e1c5c6d2e7233caac25b6b0519d3ffedae520a6f9e851e10a92ca6d19302c20d1f6f73f1e74fb08c482822b723c645ee07884a2321c61ad28df1960e113b9512051eff788523b49dff03bb265a4de49838c9c116e351a413cdf6d2529f684815e32b92396ff920601ebc162466eb2ca10926abe11018222336fe947d47ac2fc91b4d52e79e18e78de201dd1a51fb1706ca440c222550f92c40824c5f423ba6b45f239183257243f2608728fa8531c6247ede3c772f0c8bb646f22fb3022afb921fd2df0759dc27a29ca81d11e61825cf5852fc73ed39f47ecbfe811e49fd5c3c241561a909c174abf15be4b110688ce43f416ede8ed327ef967211681fb4e174a3bdbfd7f797401b6a3c55c7a786f825be13ca0d3086f159eb9e242a5332e5a41be949778cf5606af05061a11368675fd2c06e73fb05909d9dab7e1d56517ae792594541b76adb5c97570a6542afebfab6695a46bee10ab3fe597d2c9b69a9842fffbdbf32fc768f41687f4823234e8a6a887d50ff8a9b4d8a1c2a770604b2eb8fec4832a5aaca14b862ce696d106e789fcce72cd13a59c14107871a43e909dd357a3eb0720916c840cd6fb97ddd11a45b910257b601074d41a17bb505e6c3e42a2996ee81108fb6c42162388f1ae2f7c3f34f9812bec9013932d111e03d20f29468c08ba635060bba4d1e4b8f834a16de23bfe8e284a859664747038f0ab76fcc1cfe3d0f1e4c71abac02d1ff877024828fa262102e6282d678473f8a7ca721494ee76c58164e064b580262a82f299d06c17b1cabfc6e78bb5e5fc31f026a24c03dc777e71c04660e0b6c65f3b1369307f88d9a23b66cf7e0107ff2f525f7c8048512132dba7ba6b36fafe8fcaaeaa43a59c99e254831738c54da53909f79be6f32fcc561c8910623bd5fd5319e4f8f595e95784c78fe94c192f9f3f2cf60d58715e6572453fa032bca5d77d004e96bcf423ec446c0046e4d8cd4e587c9424f34ca306aa39d41ea9615ac5a47769cfcfd233634cb9c22f54ceb2f77f1cd1c6647bc6e91b73b16c72a273f6e02ab198b8fed5590fca8e5a4aefff4707bf4397e37eb93ff3cf4ee7a3cd93f2e4a15340ac600f77736923c3dbec85b8eb8aaf21d62a9a187750f8f2fdd8846cc3f51f95ac8ca7e015880c9e76007dbcd8ebd4bf14fc4bc9978c22db0eae72a9332aeac7abc434b4fd3794fe7a0345e13c0052f625b8d0e31bebf395675daa00c63b4386ecee3c3fc8a84e040fb0fa49bfa3fd4f10b99f6eedc9a3cc4684161145ae7c9c215aae4a25a888a4c57e0b660e81666222077b2879385d5a905560feec764ffe3b9d92b36f6e25730d223bd2eafb1213f43c946edc65507ff5381df2da7300b37ad5d23df6949572ceb9c365b949623e51c1f541e88edcebdb2b378222461185a3c6d7abdf65c60c3d99eca299683258947ef1e32ba580f08bac98b325d07efb6843ce641301b6f9ab2b0d248afdbae6041a25496f3a993df475b1be5ae96f2032e17e040b4bc944295d131d6901247a6f9b77bf10696a81cd639d12a587af5778d52e2cc1cae3430c9369b1115d4cfa4b6e1e3f8c605fefc44ed2cf4f2ba36f44f2ed826eb75b699788ffc2484892776e270f7161eb6b294a251810df8221965f7e7536dcb28f39b9b197be5309338933c0b983627d126dad98c37ba9471862126b03616c62cc9e90f6439881f98b01209d538650085b1af062ca24b76e12df0a4f653cb88dc5ea92b1196118c2bfd9746d2333f9128c5c390cce7631feacd9826508ae63e014fc69cd1591ff3d78200eb35e79f5a6489cc57f287383a1636d305432fd7a00a1eb832b07c240aaf0f74021f14816879e292f0caaf3c1e0abacba1bbc6342c090c5caaf49e1254aaedb31ab6a56137ebd7af617507ac34feca8fd034a06e217c4417531afc4d45b334b54f22846fb1a13817ba407380b05746d3326f6a9c3cdf9efb28d59a25811d01e6796101d84c4ab1ae658d53c4958354ef32a8b22d63824fb8201c7073605e838c47ef4c20fa440353e9105439be41af44afc5c1592edb47fdf0d2edd33da0e59893b0444a951d1b17036971360dd86722c8c74c9e843b43be002e8bf1666724af161c2a7e5c67a7d983075bbbca7e3a45c9774f2e7ceaa151cad114be4d68e4c73f018f4453d3d63772d3056b8fc8d9a7b631ce843f1f506a2736e10118894212c48e60d4c3813487616c48290639ffb1761973076daddf00d6f0206362f976847c4dd06ed153c3608bbe8701f4844c7752788df3af33661f0a955ee03592748b68f55ea64e736d94b34d3bd288a003ecefe7a4d4899f7b458b5bd7ff3ce0053c5e592060e52503586dc51f51e382685aad3485fae686ee407c652da9a5a74ef221f0429cc646ec387570c7b5ec0e22f5c6aa4fa1521877a6536b2a0902a7e218505516f05b2e9af83bf008a04b9c765f7addfc05d8155231a04ca01930490d0044637f33a390c8af51c346c71046f4c2cf5e6246a986d74957b989336ff88fd33f12ca3916cd1d493202785fe3b92e3a59aaaa927f77a830de0609316f91e207ab4393daa0e8e6647a2d6fad4cf38f085c30ff6507685f63891c0f983a46b3fbd1137a49a03c1bc57f1de132c2660655e97e12550712ca087ae46bf5d5d4ec80f39dce597c212aa868afe68df4730a8e8075169e26827f2ce5c06544e07ae80ac9f047f42ecf32e9bd4d6c3b69dba9608dd5a3223e348d278d26ffdfde668bedf1c71704b7b631b43bd22258ab15da6edece1c1c1a18fd35bb3a71e594b06b4c187e0ff16ed34e3f13947677ada95585134e7ee4dd4b971be88a1a6676d8071237152ce5788c4b0116656b28ebcaee308d876fe7653ac194708661e9c216d38e7fb1f6cc5f582eccddb5e4579f320a5f0b8c381457097638c05d00203c8080749065dd4e18a89409cbe2d43fe40d91ff2c9715c4739e62c1cb5e548847115d9ccfa417c837239e0911196d94890325c9a42be1989e60039ea85f8e2e05e73f8288ee73214f26db5a691f5355d116aa044379a53d978ac56a8ec8298db173f975baf99668cd8b4dcde695bf4d9de9d2652d4d8923b72acc0cb7f79880e96a60a5829d05e937f231c5cf6a84a7c3be20a500d742745859bc36714f3c2b6698853390bc77e297d16c76ef0fa3a6180f36fe85ad27a8577f1689c590b380c335857cd8f6cefa3543eee831d440472726696061673c6b543353b654095b8c1203feb162bf7530e3f8508c3bdbf2eab2a0bdad4056c0e4843791e23738a62ae26ac0ff7595c92b23ff2c9c60acad3a19f042634836932e203bdc95b96de3e6e5b8fc7893273936e39df9e7fbb55000ddca966cf6291e2a9695af9d88eab64c85f52a7fcfcb1063b582b25974ac0fd683fff06501476c2883684084003ac53616b880e75640821fc702b13649b325d5f2f10cc0ff20ae1ca1819baf44e0a86f522f2fac77f3b9920cea3ef92122cf4a982121e42cb5931a003e6308a0770ed44e323d63fa58477d5e26bc9be5cb260231aaeb25744ce02a427c2c807fb8a843d4646253a86e02d0f3694787204f91d8071fceb81578d353ea0f43d601cae583bf51d1d1d11abcf105ae21c76e05f55d0c9ecde434f6bc12ea51d89c8e339d53a49ef1e3993e95a1eadf0f73189f93970f5fd9d2be74c13d1ae83b8174f55eca4fba017be8250733ba840255830320f2e4292508e07ebe2f12067a850ef5cffb9dbbd0a494881110d78c72ddc4a77669660406c1c3c0442c495cf58bd872a0c67c9b0435ea284218a16fdd9c3426b263c76d19a265bd312e45fe103df6ff5c463bc9caf29dd8bac1209f58625045c3166fccda6350c9a7b8b8111baf1f9b143a0da1179f884f82aba9ef53898b1d00323455d8dd1c6c8fc5f31fe84898525987ac6bee417e7fd6856c23b105944c8a4f104e525697c3096e7558638459c7215db1185df3145a2d8b2fad47e11acb91fed5f5750ac3ea564a83174549f805dcb99de930ed5a769a36735d705a54312d3d3949d5b4ab22de5d93a95c786d00b476b6a82ff6141437446708dcb99f290185eeb2ee9ab53abb0859d58751f1184babe12fa3fa648968b606dc32d8bea618b0689b56d87e9f14762b9cc6598b34e3dc8c34dc12ea37d24d10f23e090e65cbe2dec66ca9595bbea4c7326d11c2c16e17ce7ec8875301f9825a9494727107dd4fb00878c929dbe85f53a095ff107930416d8a443e990442b6804799d6df27fdab56ea2e1d51ffdeaf52b4e4ed81047100b2352bce053889f423372d8c7c779bdd0ce6543b1da5d877fbe71c749df3300503f02587825663f223bb7d758ee91c905eb29b872894cbda8905a345bb05ea779e1860a59dc62f4e897199e082d097a9680d5f79a8c87292301b3f6ec3a782c5d8ae263755c35aca539a5a9e208c85099ee767816a8bc57a30e4270c358c98e4d783f871303a693fbc6bb6e00afc71156b3251262ee5c14f9e26b0d0853f631c0576224665f48b03418ecec132a8343b1038d73cd4de5c06bccf2ce48f708d085f9338960e96203838d5fd06182781d6340ba2fb63d0e2ea8e1650df02201c3c6dcd3f4d05bb9388c2347ecebccac2adeac4df79b0852d27890b0f24ec3eabfb7f7f81191a1d0042e447d1252552f5738434c4b06b5a078c1ed51dbc10678dd13f48c6b5ddbff73d89dcf9a949503b9e602b1eab6a27a30bc776d440a9433960a3032bf3bce912b986ad185a6f6dfb64ffc138dd00658e30d7593c5448dce63af9289e1614c13ddcc87dd42bd567e4d10036874d0427da71fc5d77b2c6feb770dc3b05df8136b80d305422abd0006d601fe08634c4bbb4bde06fa740cd66b74cb1c6a6048accab5154c1423a1373bd5670d5745d6e2864917b19dd4b31040de64bf66418a19d520b6402c3369b5dfc3ebf88a6c524dcb41a10fc2ebaa06eca3091f4ca5c8f69d7f4087e7f2f5f06803a32eb86a57bccf92081a56a8ac0ea22cc48c16a4bb8c0efba02e170a03939ee5f3f588dda77797b9bd34a85964fd8b932685cd3ad5371cc5b1990fa5b6c1c7d5c66c572385d646f91a56cbf468e963a3d65cc416e3de6a886f1a4e680b4c2be1c8c0de6b55c7f6fedad4d344b9b3033efceaa71ea2bb29aca97fb069efc4b459660a222acb7deeef46b225f05718b88c83d47613fd14417e868913401d7a34004c75631ba585c791cb708c975940f6ff23a666cc698c42c54b704cc553464e2b93785e3759877dd4892233c00428ad8b88cc5bed56e4205721e325f40e0fa14c1adb1daee6f8c2be66317c05ccc12b40d2bd069f10d6be53d9b9ca86c92b0392d04d679b09b22d93509355c6cf38010b6269f544d028d228bb50b92e64f0acd40e326a29fd44084da1d5281dbd7e50b3669454b7105a23b28d27bbee6775b28cafdb73e0d524cb0491cc4ee19d38dc1384930eef9b9c6bbd073ee442affc0d90c755c250f073c0cca26a03ed936d941216f763df7d5c58872c3d64b43f5afcb3e75713dbc9ea28eeceedfc7e927a0ad4eb6d803d2a3a94b4aa8f7f691230f33b9ef4332006e3ef9321385ef935b2c49211f9426c861ab0a2d32c2de6322e42c116746f52d8ec6e48b2326b91eadfd11db390c6d65870994dc091c8a01972665dd1c5d525047221e24d65b765078718916b5f8bbbdbc08f89c8f395b1ae6dd3423c8b4d833712164aef89fce2898ac65edd6601404ec593a0d9b104bcf88ac81bd8dd1ec1fd2a6ff788e3775d744066393bd8e22e24839c0231f63b0fb41929a363009bf46def57111e5150041fbb6fb13f30b672fc414399b189bb65db63907752676059354b17e415fa5caa7f228ee87b7572c17e542f945ae2b4051f2ebaaaa4faa13ffdc11ca55370e6c6c85f9428aad26eec77b94d433dced1ac0921c68178609b45249c7867b10afe94f8447279da9b8bb0cabc81601a58b67866aa8a558318a7f02d37edf2e0b7fea12c6b659a788ece52847ac05c5f4e865d71a7cd48dd7d872d0e44498ead3612637ae39e6165fc6ec5937461ece08f0fc58320b7e08a4900ba40963d80149b5817c93f243d246135a398c9636001d80419e5f185c79b06ba4e77d0f474874e4f7f68347483ae1d1d326c01d788ae336b783bb801d9b57c3f9b5dee943ccda447070f0e6056c35ead58ba9cafe67aee3723876313ac06aa4a73dcdf7b9e1e8626d784b7259378faa57feac5edfea71060bb9871aacc116bd4325c158d8af44703e15e8d50a288d4804836907bbdd9680b9fa4e250ac201d523cd458e0fa4257f2dda7e844b3ddf44f93008363ad2fedb178dcdeee144f6cbc74df3da7d3935ac5902c74eea1e2576394f08a75078c217cd911f705b2e57be7d0e6f14dee9ef7cf5d3ffd5d92db03734e1d7c076f1013908388915eb44085d5746932c4de8e9cb3c5e4921b0409e7fa21dc918a1c783f0322e19f487202a50e75d14224b78744d7a982416e731866f410f826345fe0c09d19d1a6c7d14eeac4b11ef73928bae7d022e730237b02b8ae697ae9329c3121e77943e29331ba8c58533b364cb94a653ccadd37c8a055af4bdd338e8091bf755bfac3bcc0935ef975ecbaa19abf015c12cbdc54f64173b121cc24e4d6ff1a2b5bae372e423ce944d11648536a1f9d1bf87982add073db84e09ccd98d78bf76e4965ffb4744d615bc5a2098ab4b88bddc94a6e46c05d0803499388f035302ba408afcec24b36203a5e150347a0960a56ce8797c323501add0e85f93f028d603278203d0e67215d2bf31298df8c9b152cde22e69bfc06939d2703f891d3add337ba1425ce50de8e32870b7fce581e7d194bec4b4bba8d4b9e1461c7d04c1719ccfb1c3707e517645ee7794dedcc4a8c1f2285962c2a1f5d257886b2d432800d1b977d44d3fac92e856df2a752e6d2095243969f7e5ace93488b3dac79fecde8d1aa47cee70c1a500296ab56ca24ecdb720b9f315e87841e22619622616c242854fa118142ef3de983c807f3971eed213433d5f63911d013e8fb14c1417f55317c1709841977be7608ebe128eecece2d18c21825930b96dd2fcf8272db56e2578bf9217dabd6a5161a3591e4801ef5200d2274501affe9ca461561d56c5494da56e6e8ec3d193b153ea18f320800a10a6beb3c54a23296c37c454dbab3ec46c60bcdd706f50fc1ca008ba05aa0837bd8c819476905aeadcdeadebf8df9688a11c2672477e5d72bc5a97975f60a75be7531eaad991d3d61485e13c7a01d47f77bc7ec32cccbcd4190b945443084ab9dffd38210bbdeaf744b7581bb99ef40a41f0908ba41e5c45057aae9c25a22a634ab050a1493ba9a8275b10fdd83085fb708b09663fa11484889fbfb6d9fb9736097b07b0d2116fc9c6548ece74fcc9ed44e48c44bbcb34e05ec9f5b8da7056e34c5d36915d1f79024fa5171141744930b4bfa2640fcfd6e593fb961f68efad768dfb057604a6104544756818226df3baba724033bd3f86b3731d61b0b40140b64a030204a156ea708849eb1ea1386d0e50f7a27b1a2fe73c83f1719157e4a6954923cda208026f642d0b0e2385da7c6e0477f4c562e16541afea1cf94314a8e45c6743f531310a718b234c26a9514143b46fed2a76a51a7ffd7f6d016122ee504528f8fc4a80781bcf893737f3110265efae09add52c59eb03a8a293663f08733d01bee9c29adf093d0e6653bea888276bc406c5a6503c13c491479a7a3049179f872d4036e21c6e0b4030342fa0586db367c4d1b391fcba54dbfa2b472ad3c9828b0a50bf24fdb4749d2357fae91e4aa437159d7a240c294f6f5b1a906476998ba16f53fa9cf404e906656d8cf9f217b41f8469e5c77af0da8fe70b47415c66e4d4aad911ef43efb582e8ab10fdaa450d7ddf489b5a4666ca7500202714ccdda787205425842ed90a6bfeeb3cb2c0c14d8226d3ac15258c647b3adad14db452c89d8a7f322ed21bfffbeb5288032c707e0f21ce13eaae1a409ecb5662f05a2b6a7b73b2f1200855f7b80a10166ef667b0c8bd43e531dc57ba72bb83dd5f3f78a96048ed26753031517d161906c573601e08374f93a322c450d241102e321a469464770f64f48eda690bb8ca60b4d0cd210c504b36482fdd8168943e0c35f45b519aa27f7f58142ffe5df73132545b0742280bab6044d9ab9d82c716ecfd006a25af30caebd0b4de87e5e05ea76f41b8c225a304255fc878c4dc76ab5297f410543602d3cc8b20590ab682d3c8aac1864b13079946495412251a3228a114300a36f2122195dc8da3f4883319fe03e2c8466d14098d67208d34a4362b41a197e27b7d47bf16c6feca97a4abe11b313a52163ae8a120c96833e8d9ebb335009c1c13a41027bc0ff45a34b8496c4a9bfad4d723c67ed8478537b248ca71166cfa7c5e8d4da105720fcfe077e8977c90d5ad75e5673c361bbc2a2fff9eb735da16297e45561dfd708157ee8636370fa5eedc0b1bcad3475bd57ab69710df2eaf148f4790a8d806ef716a7d0eabe3dc2273da57fcb6185be523824713965cc2d93a7d84f8e2a956cbae13a6821d99031cd1eb6384e788233616ab798774d50361da50a39c264fcb687a001d27c9b9ade8277463808c22c8d2521ced81afb066dc6669c01584d7d41e0fc4ddc2b5393c8e1e2210d65bf6f25d2d92f96d39ce22fc375be4504c294cd5a193f8d51c64f9991e7f11db2cb1a1a06f6f7923dc6cfec224910ac71cd7c0888e118fe20565af157efd10801c14f931872a3c52560682e3793c0e266082f86397ccfcc09046c7814e80c5499048e7cc59f134d1040b2743a0ee7421b6a58f3896b518f3ef8575bc2c226396aa8176ac38e1e0b6d5826d57fce28d5b94f42c52c776194ea3f0995c4052bf401e001892835eb1032f0b6acd863d3c8de7bcb2d032313c0145413377eef5c3259c8bc7d71ad5103d37ba74c5d9a9239afb9275df4de5946604b95267761a2ac88d37b87a93a537015b972c2acd37be7ab006bac30879cf10262a6f74e9308ec4dad0aeeadce4aef1de7997c26e7dfd92fa77e39f5cb3967370ca55ea9573953d565e6ef6ce377aef13b2bbf002e79b2c5c7e645ef7ce56f875b1127e011237ae7144b2f4d333b96d0e0d23b3385ba4ef08d3561eb5145effc45a3048f392e307adcd03b676131c22b451b8ea699ded9ca65b212f83a783a783a783a3a5a7468fcd6e1faad33e3b78e8e8e0ede08da00b11aa11c9b72466f1d2b2ac6aa701489d1b6a6b7ce3205377e5059316685ca4b6f1d6606362d1628e278bc68a2b7ce57076ba88858020407dc9dde3acd0d6d34448cdd200b3ba1b78e73ed32ad057ece33e799f3ccc9f992939393939393137699c2029f2846142312c9a4bf89555b442291889792b84c2989c0f677fbf7d8aa4daddad4aa6ddbd60d43a55c2957db52f5adbf5b19bfdbadc7317eb7cfa51637caf0908091f2a7770ba20c101155b4801cf9a2775b1508e4ab8d8e89da9dde6d332ec51a352f826411f9a2776be5325909fc21de106f88371c0e876e180af7eda1dc631f2a875bbf87307e0f5ffc1e829db953f35a92814bd37b6815224decca96892c48a2e83d5c0eb9991883060813237f7a0fc754296534c78c9440a3f710c5ba03c2268f051618bd87415a5e2fbc38a350fdd07b487699c8021fe70f3771f41e37717070ec70f21e3b8e1bea6e38728f1d874acdcf6f9c2aaddf385b59bf715cfcc67946c1f8f2248d1798df0abd71ac8e445099e993bb818489de385f84cc283342ee041817bd7198cb216bc25ced6581d31be72b014276803943c349df98de38cd0dfc41c9915622cadf9ede38ce1b97e946e0df74dd74dddcb8f0f97d7383f5fbe6e6e6e6e626eb9d383182c519b0207adf301f6fbda8fb11e3cbc9a6f70d567199b08ac017fe2d857b78d9f7d8853e727e0bab5afc160a8542bcc77a4d2f66ecc85240b933d35bb862cf8c2d506fee050bbd855f5b82805b023ff8a717d40beaf905edf21e7bf06f07e5cc583316d0c93a59a7df6367e5362bf780352d1a6323c8aa28d13bf8e5686d32b4aa7c9960a17790b9fc1d140b167f0783469efd63edc202c35640b175af7e8f9d2fc7981728d8aad4d09bb502c15d8db2b32d5758fef466974a5c7cb900b3f2922589de2cf345901d49d65c185912446ff66b0645dec89401db6282466fb6b94110401a65ae048e20a337eb64f19b7daef8cdaaf8cd6e3dfecd563d7656899fb0eff5efb1afcaaaabdfeb568adf2b8adfebf3b1af6feb6ab7e6ed556fddb383b1460811b4a5de2b93865913cc951c42c2f45e979f34d186ab4dd3ed8916bd57e699e598963432828ce9bd7e4500b02ccb8d13cd2a707aafcd3628d29a68b69861f45e9d8fb52e13aa15f8d8b7fa876ea5477c5badc3f9ad566d89a9cfc7aebea52a5d0a759d2a1e092e5398c0f404295fca97a676790f8556a57937bfd313bfd32db1f4a943ed2e490b2836cadce99d5abd881e6d26a298ad25e9a177ba4c62c0b5c0c7588fcf0fdb3d5407f808f58de5300462b84ca86f1470a37b61d4dfb8caea37dec2267e63302dcaccb169eb0146a5372e92e5448a355d41b4f4c6cbf700c7b797e2ad048a347ae3e6e3112444d8a0ab52c24b6fec7c8c6770a5d6cb84ba53963e2a342c44c4b0e83b16488aa8d1c1e6a7c3c0013951c6064895dee857028c2cb590a515492306ef3061a446959736217aa3ce67b28655e56a065c5f97de68536fd42ef512bfd1278947ab7ea35b1ffc8d569179ec32b81d846907184ad517fb013094633ce209158152d5c0c80a2a39bbac2b3c111a2b876c694ad982c28c16bdf3df6759173360726b3ece6060089c99738c14392c3a2a854ac014316b28f6c0dc35d1180ddc082537baf6c8e8699e21768f3a8f908c212b3f95e1e17ad49ff8f2e6b17ad425b8e87bd4a7724ce1c8bb5857ec7ad48b5b43c5ad471d4a0ddb840fcdd2b39e434cb251757917958f3a86193b7b8f3a061979efd03dea99cb8edaa39eb7e4bd23f6a867bf1dae473d9fc97bc7ea45de99af44def9f9a813b58d3dea444df2cecc475dca46be7ad4a56ae4ade3a793f7a84fd5e5adf3f6a8eb38759c8f7a541994fac62386a1841e74c01e750f25f2d6d97ad4a74c90c83be7f9a8bbdbd8a3ee6d79e7301f7509cf9cab475dc292bc897e50f21e750b4ff226be3dea18bef226361f6d5b71447557555555db54b07916c4b34e24265954a9fca0b7c464909854a37a8ce44d643eea165810af1e750b2bf26efd1e75e792f7a8b7742ddda31ed5f584cab9f6aae37058a2f6a87360cbbb157bd48d692dd7a36e44cbbbb57ad42118e97bd42110c97b88f7a85bc8e1f6a85bc091f7b039ec4292f770f9a8bfd9dfa3fe6579e3e83dea1a62c83dea1ab6f2c6713eea503c70c01e75a8afbc71b61e75e31e4ed5a37ee377e3f7a807e1509db48db1f0aadf089138f21e75e48dbc6fde1e75a9b2bc6f9a8f3a8f91bc6f988ffa14919bab477d8a2c6fa1dfa3de9495f7a83761e52d7c7bd48d81658fbab14ddec2af475df310663deafa2b6fa1f2516fda11dc7bd49b74e41da47bd48f5f79079d8f7a5392bc83cb479d08759e31798f3a4f98bcd9b747bdc396bcd9e6a32e0585ed7ad4a59ee4cd2e1f7556c92a1ff5a835b549a9548e685fed79150dded35df22a14a5deab50d2ec78d585c4a4ea6341c9dea36e2149de2bdda36eec527bd48d39f25ec568e4bd6e3dea1b5059ab1ef50de8f256f9ec1ef5292a79abcf477dca4e1d7bd4a7aae4ad321f750da85e3deafa2fefd4ef516702827a843579a7cf47bde895772af6a82fbda55c8ffa1294bc53ab479dc9aeef5167aacb471279aba81fab329196bf479d284bdea8dea3ae9f728fba663bf3eb8a2a7f5d1d89a1b052a9542ef5ea4a4dab0b53a818703dc1eaf18405972c7a65c3e62dc75c123a135ef4cebf367936e9590f12932c5484bb2023bc28955a75e185ba5a7596985489c9354a2c85e211e311830acc9b47ec51df3ccf479de7899f56479dc7cdc98fafa15f5de511e369f2c83c6af25651e7f1cb45be6bf7a817c564c04f1d99ba521394b838a45fefd39deb9154d3a847b6c85b7de4f2ba29bf47f9b7420d30a0298c1568c831c837be542fc54be9d2b7b445c2f9a82df2cbda2297f8b02dd249b0455e699152f66e5a0b4ae4dc9758d3f97cb31ab6c8326d8bdc8b22b6c829392d128c4e8b64935b64959d16e9f780bfbebd3cbba0628bf4c2d322a97000efe13efc87abaed49e1699e609a1459e89d022d3f624b44839f4deecf8b4c8b8092dd2cef97ca3c3d363feb4c8284de7f38d0e6f0ba845921906b548409f2ca4d022e9845a2497e71b1d9e1e1ffa656c917820e0535a2d9fde22d78e2d526fa8453279abd0229bb4723d764179c83d648bccb3d0229fdb917b4a7d4e7f442df26e8bf925d674fa15b5483323b87df7af2acbcda8456a396a9175482db2ed2da945b265a14f761f23576a916d965bcc2fb126df528b44e3175ae41f538b5cd3d422b708853ecfdfaa1b861619460f8feecd33b448351a5a2416a71609c5032ba51f9fde8ddad02203f930f6c3185b61bcf5a9ff3cb5c8be29ace23c6c87e5b09b5a2becc93e502db2cb09fc9456cbadb7a816998503a51f9f1e5e9351541387166905ef3bb448373f00dacaa129eab74faa45f21dc07d38d522c584f0c9429fec3e1e5ae493283cba37a3e18716a99637f6942f0b7d729a62a6046e0c2f72a82e33f60994e5d4f1d0565f55551fa13699fded2940ef1246dfb0ac4db6b4fc7a14be8c1fa27476609f618eee4d0e1009871a6f69c15f3f3d06ab967fd1aa52fc50056cf2e9315551b42a137fd14600fe700574f2e9b1bdf9e25b9babbf6f6db47ec80252f9f438c4c2c3da0b02e67d7ad4c16a62b90901cd7c7acc5858374fb7119f1e874f1ca7da8a4f8f3a5fa188b359d686c67360a2cdd6ebd3630e1d1f7148f39953f6e9315b31dd3e3d0e77d046b0fd451b51f6c32c3666e539dcc85b15db69c3e5d32371f9b6dc2b7e81b53103012e6f15fde241995d24bec2326ff5873ded8a4f8fc56573a906618b8bf9e931e78b4a86117e2c954b2e54c2d8a7c71ee2af422728f4fe3a4171e6873ecbac2707194b2b372119790b873f6ddca7c794c593451e90944f8f41165fcda0963da24a6c84ad7c7ac47910732885963dba40065d1e8494a150bbc28fc5d2d8b2c7137c40e633e8f179cb1e413082b340352ff442efd8b2470f38a0a4aa5095b78ad796f8f4287ccbabb0624573851ab24db55658adb0a05441a7828fa8658f1c28bd8486452d7b5c0036c2d8956120a818b5ec710007508ebd92dc7d1eb5427e55fa3d52cb1e4360238c9d4af941c430296aaaea39ccc85b18a5b41ed957e1f61fe0172eb5ecb1c9e9c55760d1f4c30b353e3d06558ca97032b5ecd148c9ebd323cf83b0cb5b1d36355554a9e0c270f6e9b19881aa055d0b3ea10647d63d08b9bc85efa4653d02a92e7c9c678ff70d4dd9df37346a3fdc40d5f7e971bddaf3539f5af6e8137406c66ea947de42f6987ba8d47c7afc79a1bfa8b64f8fc2b1372187b84f8fc1ab2be6ab431f7468d3e3cdb3c7db6406925f8fe9e7fd502acca747b5ef4a39d592f9f4187cf698c2eed5a10ff0d043cba289f0fb0a23f2167eb87961106d44915f8febabc77bd666caa747f625b00d33c4e978081cde5b824316071879ab6900503618554b7dd1d8b85969230d7d7fe7e10af4005606688db81d7e9af5598f400f5865a0ce30a257b40516a0985e8fea0c235a789729be1e1dfa200db63a5d842d87310e342aace010a31572c161884e5b64e6ad66f5aac452d300078abe78c3e5c095b75a6c85b62040a970b5e4a36844425be144168afba014ca9a40a5a88c02083863cb412b6fe167d092b7f02b28f3167ed1072a640b4148dec2e7b045c4aee85c9817117a886629d1a66d2c097ca2d963d3988ed24206981eaaed7a44b5c64e64e915bd2caac58c8a4bb3470b5c7a58d456a0ca5b7d1051f2167e0639a4f6a6503240aff052f8d034c04188e895070a144d032216bd0e5dbcc1439bbc85cfe1c5527b532834147eff41fa6117da0a29f216fe509bbcd507312583a8924143cb01c45bdec2bf291410eaf8cd4a17a6c631d6f0e901a14301c0792bf4919516a6502bebc77b14c055be8fd7e3d5972880f455a856692eaa15e2cb5bf820e2f216fe5060deeadf14eabaa5c5e1e9e19cbe9e5129fc108278688bccf2167ed1917cf3ead09ec1a7432d91141f1fe39d9b7b84557555d55555d3344d2fd4c54ae90c9f2c34c21dd2955d57765d5555555114458fe8df140abd47a8dfec4c78d4b70ffe4bf43406bef8c8d94f1195c2ca160bd1b9185f7c445174156223badfeda7970f67154d9943ec6178ffe75ee39098e234250a000d40ea2a7a8df0509b53a862541d4ad3af4fd3db0175555585298aabf2abaffef00e758c52544dd37cf6b7ccd848455140617ac34ab0fe8e7b05489552afa85f85a17d82af30dc407f86101840347d60f270616a494aa9431207a4a82328a3a7a20d8ebd032a45e4e4d83f84182bf3cbd8db66d906fa8faab0cd3d3e418e34526a728a9aca8021a718e147688808e94286a70eea87c0f0c1c39454070e51504f1b9c9ea2a650a90c1fb05f625e32762298d887007154856deef10972a4915293531486a69c62841fa12122a40b199e72407cf0d034c52475a1c31207a5a82428a4a7a30d464e451a1c7b06548a2883637f8a42a5304c717569c9d875985d203e7838aac236f7f80439d248a9c9a98929a718e147688808e94286d5c31453070e51504f1b9c3464b8d0e4844a35452db7fa32f69cb5e5614aeaa80adbdce313e44823a526a60b39c5083f424344481776a43a70b810b504a5f494b401c9e948835186220c8e1d0995226a72ec179a502926a7c78e565d99c9d88b5657521d381c55619b7b7c821c69a4746129a718e147688808091f590e514b4f1b9c3464c0d0c4849f90179a1ebb0bb051aa6c93b1f3c800557288823aaac236f7f80439d2684929a718e1476888a807ea698392539206a40c47188c9a8a981cfb102a4574c1b113a152169646808dd20fb0510ae1041f403d6d38aac236f7f80439522929a718e1476828d8e26370835352060c4d4c17841c89dd0310f480c9d8237000041b9c341c55619b7b7c823c0929a718e1474882860c18909a8e988c2e142d39f61f548a48c9b10b39f6077450eccbd87d38e84043060c4755d8e61e9f20a4a39c62841f7c1462683abab0a414c12708fb00161026639f7080056068623aaac236f7f81c19e51423e0b4f8f8c37461c948a928c9b1177b22f8a05247418f7d0a006b3276a0100060bab07454856dee312aca29de2c291521e5e41e54caa829ea4bc61ee414b5a4947454856d2e22cac1470a49488e5d88834a111939f69c8c4a158da0e7b123957ace64ec42464a4948474755d812e13cb1c5471cbfa8d49163c7a894910b5b548ac8c72128337663901f19151d55e1459936fb5ee4d859548ac8b10b51290b3dc5bc8cfd987b8a8e1765c24e74c42813760b471565c243437ef113d2b1aba89405c743b8674cc678c8c211464e95c59d9c0ac7a1e3d18d47a1238563d011e8f873dc137c5297907a842384e3be7b9f7acfd1798ec5e346ab367af5a9e7d4758e1be5fad4738e1bedfad489c78d7e7deaed71a36368d95f61ea3e4d03f0c0054bf40b43a93ae3dc0ced28e7be6f74c1a17df52e1f3bb451a5d546b7ae3ab45131b4f9a8d27378910170cb414a1939a4aabee2a8a6115c35742c2d9b6af28f01000035bcba354d9e7f677ae87dd5ac769401cb528365c70dbdafdad28b5697162f55d088e87dd5981c2079db4262ef6e6f4befabf63597369796f6fba6d1a5d1a5d1a5a5a56db0b797b68193f6f74de3f1fba67dfdbe693b7edfb4a22c3034e8da68e540a1f74d2300992e6e5b6c646ceef4be6914b6c288fd5595115345ef9be6010a297a6cd2ac6192d0fba63dc182030c95091d6df4be697f5ec064a4d9f5c950ea7dd3c2d0c2d0d07e5f343134313431343434ada686a601a95c341dbf2f9ad7ef8bd6f5fba23d9357e89ec0dd00b47bea7dd1acfc7ea420d3b6c5c644ef8bb61c7ac362e64a58913c3dbd2f1a73a9881917e58b1b48fcf4be685f28b081e44a859f8a244ebd2f5a738c15bd1844bcb014d1fba2ed9038db217176f6fb9eed589ded589ded58dd33bbc767ef86a176b876b8ce1e30ef9ee5f87dcf70fcbe67377edfb3dfd311658f849b1f9adef7cc00564d4a307932468896def70c08151bb618388290e97dcf98543d4ceca92d09b3a2f73dfb4a53c4cb0f6e6deb4def7b96a3869725952f459e38f4be67612e53980f7cecfc7d9d7ce911dffb3df61080669cccdfd769e3f775d6f87d9d214238f19c38dd90545d5169e97d9d5626f6b4945535b2d0f4bece347f56cd234400d9d6303d380366a2c616b7b92ebdaff3cb67eb19a306b30719277a5f679308165a5e138c0f31bdaf3383c82040fc06914164101904081020dc3054ce7620e41e3b88112068fc06c1f51b0488670d50cc402b32438415135f7a83b0b203abdb42e7e3cca93788250d32a6159d972d737a83a8f282469d980e269fde20963a9e5ca9f051f72389de209644d1eaf2b163adc611bd41641a1f328d0f1f7e7fc8cc0f99f921333f7cf8f0616cecc387153abf3fccf8fd41c6ef0f317e7f784ea0c618b44013cb6699de1fe890ec3841f7a4ca050abd3f2ca514510bab62b7bcd2fb0333ce69a2aeb962059cde1fbe9ca418d3e2c81617bd3f345f3083c9e5c894bb1a61f4fea073c683ce190fdb838e9f071d3f0f3a7e1e3c78f0e086a1f255bef2e0a10d0d0f5bbf3dc0f8ede1c56f0fcf1e30ccba946c59c2a54c6f0f56cf38b232bc2b4f5ee8ed010139f6fa8ecc51fd91e9ed01cb5759d80a2b7b56e0f4f63002af0d983d1d5deef6f4f670b960a97142c572c691217a7b7032e5646aeaf7d4dbd4dbd4dbd4d4d4545ede94dc639f6ae33585b57e4fe1acdf5353cf5d848e448e32384674e93d6545a24aeb2c071a3256f49e5a6e5093e5c50989156070e83dc5cc61468514b91d702af49efae2a24163ad49163b127a4f35a7e485613987f8a5d17b4ac74c4ac74c6a4be938a5b694df639752baf82d85f55baac56f29292929bc2da527b577c5485b5e1c0b1f687a4badb10d218347c6452e4c6fa9250f2d5f4f7c9079b1a5b7949831bc147132628cc0d35beaab063702a9c04023a6aa2a4d6fa9a61d092a3241e45ae4e92da5a3d54147ab4387df1d74b63ae86c75d0d9ead0c1ae43de63efe086a17474c03ac83df60e651d96bf3bb0f8dd61c5ef0e549a7409516322ad8612bd3b58c150aad0ab2207c44fef0ecbb8327b6a5647d698d1bb03734c951e54d228b9daa27787af164e8efc782ef1fad3bb43d3868e357c69b2eeccf4eee0d4a1e2a043c581c36f0e3a551c74aa3870701bfee6a0e23787abdf1cc43870e0c041cf4895135678259c7ce9cdc1ca4e0bdb1e999c93287a73a0bac31136232e0b5d11bd39cc5d5173e6069534bd397ce58489ca091315f53b2a872f6aef73f8a2fa1e7b549b295138c5ef288ce277143ef13b2a2a2a0a2f4aafc88cb32134dec49c7a4759519599d155858b1033bda3829450916665a68aad4cef28bdbcab2d5bccaec234d13beaebce4b9018264618b1d33baac977c60998998d659dde51396b50396b5050bfa1729e50394fa89c27141414941b86cab1cbb183826a6305caea379489df50257e433d817071d19d28a202506f28144d48c839adecdae80d75fb86b8e89aa17c6b43a53714d0893aab3226b0006ad11bcac918122d32469c6952426fa8bd232faaeef284a008d31b2a87c6530e8da7a7df4f39cca71ce6530ef3e9e9e9696c3fc93df627257ec2be9f48fc7eaafafd34e2f7d3532daccfa9034a153fbd9fcab6fcbac838e34ccce9fdc462ac8a188f29294698d1fb89d917a806055c0c28617a3f7df9609324cb18112ac8f47e7a22f7f52c2377b68686de4f67369cd9b0e1f706bf0d7e1bfc366cd8b0c10d43e55ce55c6d907bec1bda98d95025e2f7862daadf1bc45ef97bc3138996ba381c32d27cd17b435712295b682eb2f481d17bc31249a44d4b123f205062e8bd61abea6f0c0bbe2c47f4def08506c6913c2a6e7543f4ded0c49b91e60460913d167a6f203a71223a7172faed447c7322be3911df9c9c9c9cf2f29ce41ebb1309a7c0df4e6d7e3b01fe767a5e25e942c50c8a2c36bd9dac9c655a927811a1c64c6f27342cd2f0f98db0da91a6b75305f0e0b0d096805e777a3b55d191c5a38b5f1734817a3b356370b6a34c8b08970a127a3b916920d3a0e1b786a686a686a6060d2b34fcfdd6c0e6b78635bf3568d0a0018f026d5934ce8c31d708d15b8395945fdb90bd2e6b6d70e8ad41af6959e559a5d9b8a1b70621582ca0a0b081234917bd3520e02c0a590b17656c70e9ada10640b0687cd108d392e68bde1a883432106964d81988cc0c4466869dc1efb167503233a8f99dc1ef778634bf333c1f7b86b70c1932e411e35e849961e39976a7778634b63436dec8bc40e3d43b0300cabcccf485d912d3a177061363d05858d9f8e2c24aef0c5f506268cde9205bd33b43132d6c4513e797b8167a6768cf6068cf60c0f01b43eb87a1f5c3d0fa61c08001831b86225e11af3060f88101cd6f0c677e63e8fb8da10525f4d0ac5152997de98de10eee05141b4368c8d01bc3720278cf3eb62a38bf1f7a63609ac9c2f6e32ecc1b9bde18be1e90c24dad84891b68c2e88da119011d566d5662ecf061466f0ced5c533bd7d4f4bba9a56b6a6a6ada4d7a7b8fbd292fafa969ace7779399df4d657e3791f9dd54002f5fb0588961a54553efa63d2655606065f568c1d4bb6979d5b490d262cb4b4d5710bd9b9850c0c424015bc1438bde4d5f6757702c4953c3e744efa626142c28e658709961e9ddd48631b5614c4cbf995a31a6568ca9156362626272c350ad5aabc6c4f464e2fbcd34e6379398df4c47556b2852dc617d6de9cd04854995ad1f3aec5a98d09b69f9588cb9b7e42cc8113abd99987b4bb2136e4eae70d19be9cb0d88df8a13735daee8cd74e16e9081c3e36b61c64a6fa696c48596c4850bbf2fb456175aab0badd5850b172eb861a896abe5ba70c1ed4298df17f67e5f00f3fbc273865e893068496894d0fb425a19b03546a8d09de97d61b9249202cb95671710bd2fa86012b825c91619214dbd2f7cb125b14332e6695743ef0b3d9a4ed66c91b3a23ba3f7052b4b5696967e2fe12de12de12d2d2d2df5f52d2dc52d7df9bde4e5f792deef2536195c4162a00993a6f7929502c2c05cd92ad3626d4defa51a90d0d371a5756359824def2500dc7129c3a5075b170bbd97b088b88de0a3638236a6f7d2598d324aeee69a8ce9bd44a644a6a4f45ba9a9d4546a2a292929b9b929294951eaf25b89cb6fa52dbf952c881de98321a444569ade4a6d26e2acbea0404ba1b7d2128d8799aab5bb1c3ff456628a65b1c04203068ec799de4a5f2a2823654b89305d9e51f4566a22e1c1832eae8615187a2b0d55240d552425fd4e1a2e9386cba4e132292929c90d430dbb865d49495692f27e2769f99d94f43c53e4cb9f1519185a7a275931a1d2412347608d3cbd93c2a039f204475693152df44e625650421687e249e40999de495f315e00b98322c6a977528c3c1a4f36235e6e6cd13b690bd21624a4df487a487a487a484848487f7f48485dd8df48597e2361f98d84f71be989064b18961526d2d4e98d6475820617176e6940aae88db44cdb113824088e222cf4469a11e3c591b122645a80e98df4e57f7e6adaf485f1b8a1375273cdea8b8a29229e64f446323b323b3afa7de43c721e398f8e8e8ee4e48e8ec21c5df97d74f7fbc8caefa367d7981936276b549cd0fba8ad840d1445d27801dad0fb68b9f57c7341c6e71746ef230f6382644dcc9236617a1f95a0ae455b0bbe1b65b6e87df4030d9709b824725e7a1fe16819e1681919fd36c2d932c2d932c2d9323232ca7bec466060728fdd4849c6c8eeb75195df4675bf8d3668a3226b424439c58ade467e34b48494218b71a7b7918d162e74acb95131d3db68cc2acd189f98320c85de465fc7bf1b2aaca4010e59d3dba8d9c5c688b3b7224166e86d7473a6e8e64c51d1efa21bbf22bf2f2ada457a7b8fbdc80d43e154e15415159d05aa29a2f2bb88ee77d194df453f6edcc0e2d5c5e4cb0abd8bac7820892ba2832d860c267a172d7db848b88929d3d70688de45cc1570d56d4df90165c618bd8bbef0b6a29400eb5b2146efa2e6e3265b39ae7eacd5a0d2bbc879e384e8c60911d16fa29b37a29b37a29b3722222222370c759377934744a4a42292f29b68ee3791dc6fa20c4188bc209306cd0c0cbd899a2c39c3b291f5c4b2d39b888b890d20695c4cde00f5262a4277420c11314e173ff426faaa408c16765ba428cfc0f4266a965873638c99bc2f30f42622b34066c1c26f0b4d0b4d0b4d0b7e8fdd42090b71bf2d44f96d01eeb7050b162ce019b15bee20b2a412446f0b484698c96a5e5179a2b785a5918c4910b1225190acd1db02f38a122661d8846901d1db828f3546b2e4784ed93ba1b78504d4c51519a337038a99de166e68206f682091bf91374ce40d1379c344fa3d76a47205f2ed3712ca6fe493df4824128977efa85ccc48e2440d1abd9156284e80cdf883e1c4a237b2c6da902a5db88ca9a9d21be904cd12cf05191962717a23bfc8b86d055619b165426f2409ced694411126eb6c4b6fa4f04c05e1990a157e5710fa5510fa5510fa55a850a1821b86bab9bab9aa5041a955c1c9ef0a6ebf2bb4fdaef0244127e5eccc6f19a677052b16786474ecf0925142ef0acb1b4abf2560a06c21a37705d4cdc7db98abad3b34bd2b68317b40816bd2ecdad2bb4213053ff4465481c9cd00a27705a19321a193a1a1df436f436f436f434343437979434335869afc1e62f27be8f97b284a19ac228130bad6b8f41eb2aa0199561bad244dc0048ad07b6889e4d763c78d3aaf336b7a0f31bbd4d5b5d07a8a28d37be86b2bc6dc8a2a304e33bd87b2e0ed588a1803a48a84de4342afa3d0eb78fc7d147e1d855f47e1d7f1783cba61286199b0ec78f43a2ef97d64fb7d5cfb7d2c916287599891194afef43e5a5d333458c0b5b5e8ab1144efe3528493a7141557754dbd8f21aedae0845491a372a7f751eec489b635262c7e30f53e5e2928ca6411b30282a6d4fb1804f420a0fb6f172a5da874a1d2dddd0d4309b38459eeca3057fbed69bf1dedb7af51a364d2c449978d337abb0fb02eaa1358b2c0a0a2b72f8deaee6a1c8951e5058cdece0c8115d713167746bee0e9ed5f11d0b069c2e4a92402a7b7f3fdedc0aa119724ca9bde1e9c3306e78cc6dfc6209d3148670cd2198d76c6bcc76e74c350c13d7c84fa9e51eeb11bc78c67bf8dcedf4625bf8d4f199460e39117c4ce871abd8d5641c6d0399172c48a8bdec6255497138bc58814752ff436d2e004132576737845d8e86d5c63f3c2871f561992137a1b9b674c196941a034afe86d749a09990909fd16720a39859c427e8f5d4859262424242424248417e44121c8830285df148260f808f54d61ef836014fa1e3b05a51c85aa2d0a142850c0a3a017541114541114f43b28b80c0a2e8382cb20bfc71ea4bc0baa4af23b2828282808af99f64604881a9a2ebd83982dc6988d68e1a24d8dde415f6780ce0001fd06f203f203f203f27bec404a2e40555b624040404078ac931fd6c9cfcfef1ff6ed877dfb61df7e7e7e7edc30149bc7e6fdfc28fd7ecc7eff94fdfe41f2fbc7035964a80d99f1c2c918bd7faccc90a9e9437215634cef9fbc39195fb84859cb7143ef1fa601fc02abc448cb82c688de3f5f1c404b4395628b8cb51b7aff9811b92293858facd943ef1fb209641326fc9ed09cd09cd09ce0f7d8275029271cf93dc1c8ef09cddf13264c98807745c6a54c13b3282af0f49ee0054917345df0eac25ce83d61c9854f8c0f154f2434f49ec04c12e38a98932a369e0cd17bc2979429629e3ae0a898d17bc205bc6000a9cbf217a386de1358153eac0a1f9fdf3eecd2875dfab04b1f1f1f1f370cc57675f9c83d769f2a9f22bf7d88fcf621fbedf344d36382d702cc8a0bbd7db4b488e2428816ab352abd7d961cb4b2a81c9151a60512bd7d980da0a38b62a22ac81e1abd7d0e60462bcdd38b9595357afb14a985990b444227234b6f9f1550c20a2841c26f09ac5282df6397a01cfb2d61c86f09427e4b90204102de96a02761efca8832bb3537d6b0e92d21d7bd408147a707064f6f0946c4e0dd88ab61668d96de1248c0c50b498b355cb4d8e92de1cfa8189357656f0497de129e3cc5d8b07d4103466f09eb5c84752e4284df1156ba082b5d84952e42840811dc30d4bab7ee4588f0224290df11c47e4700f23bc233839ad58e305724c28cd03b82550d6c98b5b991d1c0729144ef084b225b7d3d6ea018ebd33b02f371190a13724ed49208d13bc257d109341766784459a37784665ae012269c963f40bd23ac6110d63008107e4358c520ac621056310810204050538320f7d821d480f0e33784b0df10c07e4378dec0295edad48ce838a3466f0856c1355b9a58c09e00b6d11b828b1b386af8705184f9a637041888e09125c9953c306af486f095630620d5173eb018647a43683ee6d1a6c7922f49942cf486b06af5ac5a3d3dbf7bd6ad9e75ab67ddeae9f1e2f9dde3e3774f8fdf3d3c7ef7f4f4f4e091103347e2b91caba1778f150bca9454ce32594c6cd1bb67a98165991f70814b8438f5ee615a2952c6844c1637347af7a87f32cefce85371d644ef1e09f85833dbbb7a01844eef1e350c8f1a8687e7378fcac7a3f2f1a87c3c3c763c798fd7aab58a87a7c9f3f59b67c76f1e1dbf79c28450cd7921f382c2466f1e2b193499e255c7e4cd4410bd799667aab072949dbd69d5e9cdc31481160a1250a67471dad09be76b4bc496195f4cccb5d09ba7e9c6a38d4990bce717bd79d4b5a2ba562cfe2eaacfa2fa2caacf62b158b4b32b16cf8a5ebf8b5dbf8bc56797135f589630f55244d1bb689554c20bd6522d0d1086dec5e5882f434e14b951b646ef2213034a6695bdaf2fb1147a17bfd0b4f0c861f6638d4aef221b98911f3dc25481a9d2bba8d2d85169ececfcde51993b2a734765eeececec8c8dedc83df69db89d1cbf7770fcde095c5965cabf2146a3b1f5d94e197e4fbdbbb5f9b57bcf9be213fc0a94f72b81efee8337f7ee8ee5ebdd8d9ab038df3d2acb8b770f31802ccf775f008b77e7003fdd332d75efee0108f0d33dcbf3f1ee27d822e2ddd118c4a4fb05d37480881413cf4029537618a141658609163e26579e57903c92a35bc42452d35d9b6f72140631d9a47497f64a8ebe2026959aee4868651193c6e35f0832e52f38ea8298bce043c4b32c9a6759f682b3ac8fe6b339ec1996659958364cebd91cb68f4572966d6259b111cfb6ac1936c959568965839c3d1b8135c3b28eab5867fd7640c5952e3b2e1759579a55a285cf598309644eef0c234857922a33cca6e8ab1b27a07ca9a1daa2f77d2ae08893c5171a1e50aaf4be7e9aef4697be36bd205df44695620d5002611b11430ed0076b02ae8c951a5f75ac8308527a771273f1ee71efee83f5ee6ee4dee48e621193ce9259cb18ddc7e86ef41046171ac558bcd1d116c4a4116ff754f91d84e537f2959494c2c0bcd28f25af040447d88f577274494c2aad49657e477df021024b4f4a941a3dbae4eefe7aa080f29794bcc104b04adc1122584949643e298cc72709b1b09c114365e26c854e0acbf1498eb2202693da6f72b5094ced9bfc7ef926475710934d12909090dc07c93dee915c88e483ed911c55414c2231f940f14c8e5e11934c177a5cf90b8ea620262fa02026d9ad253222bfe4e8096272498892177221f71112124a722121216b5e8828c42724f4424a42427e02212121cf320a0939fa2524344608c98584582121170ac9608d891625aa7c0521137a92a6468bba2051b4848452ec4003c67955830f89901c9c8a277d489c4f21675996655996655996655996655996655947ad884916690c12121212121292a326884924a3d168341a8d46a3d168341a8d46474b1093461d2ce6b815b8a626c71a250d3c2e44da7688407344eb86b28a952a3f27ee61debd8a6a8d133540b43c38edee280962d29584b8bd92a355c4a492f02c489b4f72740431992414414c0a41b9f2aabae7ae3a52c9290a4adeeffb96e4aa77a0aa2a94be576f54f5ab4a7553d5b7ac57b30a4635baeab8ea2aebd5b7ae577b54302a92ab8ecb54b557dd5e283c6164cc136615e71abdefb3c8c6cc081a0e113df0f4be4ee5f56b8aa17caa02c47a5499f0f202f0854ae6cc061a1f3170586924474242424242722192fb2021394a454c2219f117a3d1e833b8ac785c395333fa092d27745f2898a4301a8d46a3d168343aaa24268d483565f982ac8760dd039665bd0642422f242424242424242424e4218484849c06c4a4505252525292cf80984c72d5ddddddddabbc3b14b877970131e9312026d529575f2c168b8e54c24fee456f9af2fc6284625eb1e81d14918ac5a2505652b1582c168d5e2c2a158bc562b1582c16e96abc922b390c884925a1d168341afd05c4a431e9ee93dc05c464925048484848c85b803465c623390b88492496655996655996f5151093acfb3df2ee1f1849e34782f9c22b8dea4500804fd2ae4881e22287565d751510936a0a88c9225efb477ee4c21c7ff4a4ca1f390a88c9a3ec66e58bbcc87d8a8a1c59e44d4ec07c518522bba222efa0c85854f404ca17b54558afa8a8c88b8a5c98bfa8a8e8c80b3053d2f4b822a6a8c4162348ac9420fba237aa7cb2e2dd55f71310932e2c168bc562b1587413109345a351c968341a9d2879a313e51bbd04c4a4916559966559966559966559966559d649404cb2ca274120daf25ec87ddc84bc509bd70bf90888492167311776d8e5f7f54bfa6372b1d5f1c590a2aaea90bf3544a8c2d48eb4d1fbea7d70238558dd0d16555b7a5f3e2e6d2bdab2da643c149a35223172e8a8d245ab6d56afba088849751393457374bfb383b7fcce8e23953094aa77dc093fdddf99cbf23b3b3b793b3b77c74f30a766a798c5f53b77470ad6eff0ecec08f98ea36e3b72bfe3a8dd9d836b6137e6ed0c0d8c1d59803cb79c64806bf48e565918c0366548ace97d9f7b4f04132538a238e1b2b3b3b3b323e5ea858484843c04c4a450b1e83ec5e29c992f3a0888c922cbb22ccbb22ccbfa078849368d6a4a9d7373afba509d8bf2aa7b8098543b404cee18c590f146ce0162d2486ba9e5b37b76647625fc64f4ec4d596bcbe761ce929d03fca47af60e30d4e5cb372fbfb8fb3ccc587276342b17e51c83c5e761c6cb45cf8eba65a1fca6542a49e88dd26d00eb0bdd12357269d4e8aca602cfac0eeb0e88def9339f0e266a48e09991d1fb3a37e0e7a50d9b36620275641560a1c225a73604065fae810ca7990f33544aaa30c96456b4418355a4459bdea85807ba82fc1842d67535978584e87e07bd10f285fc9a7921a61712f20c03c70bb90f8c332fe4bee5e4857c03c4a490515a2c168bc5e0178bee2ff8be58f4fbc2cb175d03c464b1a8a8c31715bd20fb22365fe41920268bd42a3b3bc39d2b3bbeb3b3b3ba99c55549a3652dc6ce98391269dc485099edececb8ef78881df780ef777676dc03627247e9471ef4ee5a65ef5acc77c70031e9eb8d1515826aa7aaea9daaaaaaaaaaaa4a67c30e480f6696a7ea609c5e549a48f6a854557dbecabaea2154f74099f5aaa34cd55127d705884975e877cf1bdd68f42ce68d7e83bcd12d404c1a7d54965d59ba67f3acfcbe7e107ea355768f763d5be537da7cd659966559bf2c8b80b2ba352e33e682406175b6e8bdb5f97df9c2d41b5d3e4b822b8c99164cb12e7aa35f9f012860c2b6ae88b468ea8d8ab958c3baf2590f51f5ac7b704289f5ec3dcbdad10131c93a2b404ce6fc44b8ee89888888bc89c8f9020692b1215d639a48090b2b270e2e7341aa88f47a3c5117ba67a33ceb14980031a93a07c4245194bf8528ceb7e01220262d209148472291c8218f1cd1f4ac4780986455d5afea102026d5071093c828b90a45bf83be0285af508189df5768e2f615aa7c0577003159c187a8fcd0d0d0d0500eb01ecde596b12b237a088f2c90c49312557ee89ddf7e88098a57d95ef50610932a0388c9a1a80b7fecd1e38fbe0062f24863ccaf2bddafab10ae11f62bcf1ab73a071e18d7d54f5083ccafb7cf6ab9e5eb6a63ee579c75caba3afab6fa5d1dc55bd1bc5fa5fc46fd7ecdbe3aae5af1d5afabe3ad1573fd8ac57e75dcc44f3bbe3a2e5bd57ec5cf1788a5b5e092a20d1c9b2672028ec13a53a60891fbbc7e2386c41531e3f292d35cd2ecf951fd3d997aa3cd03b8b511eb8332630716bd51bd5f9d2f0a9b1e6862b05ce88df2fd8a99bfe2af5f9d6559966559966559966559d615404cb24e1d3c07630d055c179899153b3c58b81c09a3eb6262c44e0f122633b2a475d91dd9d991fb9d9d658d355770ec1db193a277763c01c4e44e9ba6a6aa2a9aeaa4aa2a33c8abaaaae2287b15479b57550fd135e2551f409792577d0154af3a02e8da0be677d4672245c4dc4c1ca15393e33e671422cec8f6aab82831a2b38d2b9ffd00c4646ebf587461922fb6f9a21b80982c66afe17cf70210938ee18d34fedee80420268d42211a6e2fe4032026850480df769e82fb50a0e048250ade44c1a3b248f83df5142850f00e28640a14283805bf14ee13c553a8f1d9b3078098cc411ca5e9d7758502f82bdc8c5f3d494cae4e96ed59070031c90ab3aabe2979d5372026554d4c52e0fbf04173223ec89f980c8a53f2400ee43e40408e54c24fd981bc09c8a3e4b61e680a687520a01d202039320f040404e4681650110808c8090404e457c8178b1e82982cdea8aaaaaaaa2ac7e355557510c4a4ea21aecaeff8076272874595c18b1737f7eb1af7e457f7404caeb9cc679f222673a00c2f1c7048d4aaa23c2b97030d470c3e1b63bc341b65ccb32e454cb2de8198046afaf909fa1fe4ff2871f8edf43ffff3e33f2e64abfa1fcf3e6c63ffe3cea6e67fdc6849d9ff78d3d3ea7f3ceac7433ccffec7ef9adaff380762f2472dc9b73cdfc27ddbb6ad3761a88bd7f200fc76a97d6b9d03fc94bdf50ed4d66feb45f66d500ba5ddf1d6d1ac766dc5944a658a768dc8b739ed93d6d1670a25d4ada36dfb49b0e4984a2f3165ba1dd392f3a166481e1bbdb313963624d2808ded50d3fb3a21f098db7a969de8da6bb7b050e3e3860b294a70b435d811064646d591368081addfb65d5b127dd1a388c9a21044d055739afaf5aab909fdbe7236c6fceaeaeac2212a7ef5ccecfbd57dc87e75bfe1f7ab1b0d71fbd59bd4e07ef5a81cce5f3dc4f2d7b3b1b95f7d01645bbf3a1431b9d221ffcbefa8dfa9b1c7067882c595950b7db7d1efecec3cf91d1b5a7ec7852994929d0cac1a3eb478f1d23b434cfc8e3f11933b1f40fcee095afb8d44fbade4f4ead4ab6aafea20f2aa8ebe57770c797547dfab5f465efd62f32a8fb257fd7a9579d5371093aa53273bf91d95801f746bb2bace9cbcd03b9b008b189036714d7ae0d0dbe8f38c1b7a3976289330f56efaecd9edb39796cf41405830b901462f8a199dbde03ebb13319997fc6e9fbd77239f655de8e359cf2c5a9967d3943cabb6e2cfec9e750d4d1988c976828bb79fe01888c9093eeee3e3e3481f1f17fae4b3f771c1e2d50caf7a1331a9aeebbaaece444cae1788491fa59750c6e525f8123129a1f811da3e823b7e5a3d82232344f0a6087655ecb2686c29b3c2a7238479f3eada2106c898de59ee23f82d7bf555572226d59b2617bcc0d0b3b2b186a68a0a131855289830c04ce86df4eb8927614c72ac20c3c232291bf22bd4963731c0314168ace975f524246232421404330fc18f884908c29eef797e4f8f237b7abc0943a14ba5527942f7744df1e2b79555a6248aeec992d1d6220d89246465fa5ef91eef09fad5f85be957b8df5347bfaf9a19901f3326bfba4f121cbfba2731f3ab1bb1fdea4d4ab6fcea219c447e752362727daa7e77d4abea9217a277448ccc8a393fa6de4d185c982013e3f7ac3245a3d162c2d97576044beffbc6f6aa7b8e573d8499d7ab0188512666454b99858456cbc25ef5226252c52322267bec9e872bef79dc0231c923a3ee833a1f5cfba03b52a929e85133467cf08358ed3948a1843ae81ee4607086de07798269c1d683c19d60d0d12faeb90fa2601f440b3afac44f6e18ca83a8dc07e93e78c48e0415366435c8a468079c495137468894263c74d0830b586306450988c64633a8468c52ce0f4cb92248d6a6a5068db2b1327aa3621f7c9af1016444a0de0dbdd12697f28bae161d494c1691bffadd51bf7ad399d656056272bdce9d18bfe343c4e40e5a0f1935969c99c10ad33b7fdb9e7d8b0706cd90bbb1235d73ba9dd1e25b3f1293edcf67bf32bc7c762726b3f0098f0af4aa1a43cdab3296bc1ae3ee553712936a54111e5a7c3848a8f0c13a9fa5528249db921331f4aa341b63ee5917222659a7404c06f19caf63c5ec753c8898d4a923f339c2cf51f239393941cfc9b1737e0e4f4e921cd67372d61cbf3956c03e6727c72cc7d1650a25d4398e6ee1a7fb396a8edf1c17a6501a4d18ba332848ba94d13964fc4c3c7951b7a24eeffc3971678a1c09032317964346c598560d1c2f98e4f0d8e3cac1bc02cb9163e54c3330ac4c94bb9ca6df3d7671afaaaa67bbbf571d8898547d7ef7fc6ae577d0d1af2ec44fab671cbf9e55d1f2ab9a5ffd87985c9d6559d6599f404cb2153e58f7e483ee434c0625109339f7f9c43a114ff408c42471c60f87653f744fa1847a3874a5a6282a487e38c54107374fef877e022a657ed8f74324434797f849f5a1a35943ae1ffadd28f3872e4ca1ee1a38351e66866071e9a18747c88c715de968e2e99d9d432c4e44387132660d4eefebf743adbc2c2eb8c69a70e98d2a7ff8fcb67508c464ab4549092e34849cf0a2773ef22a90932752d2d2d4408245ab2e4ebcea3dc4a43ae18354707cd07988c9e09b92345f543472681d598dfcfaa5e2ccdf0b21279a7a9dc1e6572f1293eb13f259ba34cffa0e31c9666272887ee91093291ece91c7ede6b8faf012d3a13d804f6f1c252643a4373b1de279c346a87088e7898d50b7f025f38469e309d3d6f6fbb6fdf1f0e1a3bde7eb7bec0600b4ba6d6dcddfb74dcc000668c36bd34b231346c8df08165ff4be6d4c0b04011423a635860d1abd6fdbd75a93b5264d7edf26cf26cf26cf264d9a14c0ceae4901643429b225d6e4d9464791197d55e454e87d9b58fd8d81538145cec7159edeb7c9328c49181326bf2f13b1f448ef321163e2f7d809c06cabb69810f97d991080004cf0766431333332c40d4fefcba49927a6f657c30c092fbd2f13270f89270f89e7f3f77df2583d79ac9e3c564fbb67de631f801b86e2e1c247a8f370c93df6010082dd27d9effb1cfb7d9f437edfe7f3003daaead0a6cc8803a2f77d9a79a27786e28a9b11bdef33ce079e153c30cb2052f4be4f246829b09a6cf44c8cd0fb3ebf92e4b5019304cc8a157adfa7b2858e2a176244b459d3fb3e8b589614b12c59f2fb2ef97b9c878ff63e6f49df922502e8eb5b22002155427edf25624b9e6802abde766c91a1b78439802eb4146dfeac8c09a3f75df25524632b92b1b1fdbe6c4db6265b938d2defb107e0ed8d2d0080482e5b90df974decf76503f2fbb2fd64ad31430286450a2cbd2f1b9a081b5ccaba1cd173a2f7657372f93126cced860fbd2f1bd30048c87c8c65696919a3f765fb6a5ba1a5c744adcba9f765cb59e103cc47d599950cbd2f5b516bada8b5b6f6fbae6da5477c8fefda9adddabe6b7a7b8f3de986a18a5dc5aeb52460da5dfbf1fbae85fdbe6b60bfefda3398620a5c9a2f35d0cc591da0cf8a5a0e122f9420d1fbae2dd37479530e5161a644efbb8643879f9935cf30b3167adfb52f2053c0c05c39b5a0e97dd79a455850bcb070d1e6454befbbe60454035453fb7dd58a4ab5a252ada854f37bec00006c72d57cfcbe6a3d7e5f35b1681b940be153429670c9540f361ebc351c7b4213385a08e776e4a937b0500084c9f7512e746a1927818a14e190b48c7a060b2f303899a60e46988c6d1720b02d59e8a194f4669034308fa0c48446463345c82e95482a0db5a044889c32abd03463c84ba0471dc481088d4d4a8278ccfc74e89b2035c5c7c2150916d884118c612a840dbcd09e0db4f0a8c5a93c756783aaccd4646a231c1e973851783712940889b808831a8e351651d7a6ea2204880f1ea6a43a345dfc3d5d9489fd07182a2b6f211d861c394cdec21dabbc85fffc0ff0031120fdebe9dfa14d8357b1d1940b2229525f535df2568bc8768811c05a883e7a767cacbc85dfc4465f0b10a647d78f1ec31b00fdf5d157cb595b1e7ee93b1cc95b6874cb5bb8f77d790b513083df3478142a8811e9e502efa792e4ad62f8e36b214d623d7f8752b02ea14b37cd513b9cc95b95a2b3b02405eb8fc0e87f83bcbc855ca6b6e4ad6e40226fe1fa4c81790b8f2dd67e0708ed2fdbdf331da5007d79ab5951504f1b9c3c7898f220210204a91e9ee24ed6e99043f4c001bd9f53038cdebce5cc4051f73be7f0600bbcb9ca4f4a0ca78a3d55ea8e0e0f133bf6311ca2b8eb3f4073b1f543f7c7ca06d3344dd3344dd355180c06831e02abc160905d6db030a3c38e8b8ac689371c57b854a0e88726294e388902f723c9de9835a7d79429327c8801336b6a297df4180357c5e965e3eeca953672589c8d5b103562c818f7ec55fcc406dba8aca62b23b4cafffaee5e07f73a432483aaca0a57945d51145ce7ab37cf036cd40113534c8d719d699aa669fad40762caeb034f95290c3452141d321fdf5dda11d1022587755dd7354d879a30c6187be0628bfa344585d9474d4d0dc5290f2894c56f14a3cbad25119425f349eac6960d4e3e4383872b0c8ffdf6a8c8c40c75195d7de8fe72aa89483c4e201289d90500b8cea82623f7c16a580dab6135aca606802914596cad01c6290f26a6f7277a17d02b7c9f57373f006c2441eef9b614b4f0a684212ca9c7ecc8c1b020e533daf1fb06bf65e61b07266269116a033751266e32ef92918d99beb58008c299050b5dc80a28104c878a613ab1bbf44ac454e510aa61060b8e503d7ccaef9b00b08f72612363981718e37e13c53c40fac0532a859c48241233074e4e4e4e4e52499c860c29bc50e8c714bff088dea39b167c7af36915aa4bb866ef06d5715870559cb3de25d575f088fec54f9b85814a24c0ba8e05fdbaaeebbaae18638c31be4b53458cf00105fe46fd847e4a6cd4f482af0528df0f14b4ab8b0394c9a9e8f82668309f08fa04e951d3970b243c0006708005e0a71bbf9ef69bf85c57a3eb775fb85781dc1c89d748bdf1bb6302e1f186a8824fd79b167cead748f5bbbe1a83f553d5c5227408838607210d1faae46b35aa4c8fa4a2a04afc821e6c6427c6f3681a02555736281406d9554d2d9ca5cde2a7698a1a7520f10077da7eafe8d613dd0a40fb1f6cc07481926e6da2cbbf8195b7a82623d7f97da3f37a395377e81b7149be50a9e3746801514d46eef3862edfd0e51bba7c4397e8720181197514e32d176f07f98448a1d421243ec2fe94aaebfad8d1e3f0914e24d2895c9a43e22995385350b18b27e60153183c25baa39a30181d1d6fde0529943a14223dc2def46c5078e33bdf0885c29c8343373df263afd3cfe977fd823a447a74bccaa818c6e991a1f06f97df3797ef04ba2da3cbe02b3d5ed7755dd374c8091f61273cec84879df0b0d37632fa7df19cee92518813ba54bdf0adef373737377901eb9bfa96be61a3621a3e146314c328f7c9aa303bca640148467d3bae018ad128c38b4cff318a620e522875a8293dc29efa36527dfbeadb078af59d59a170cd591dda4de9d06e6a423629518c9dc38bfeed80d9bf1d827f857f89e8ed908f60b2d05f34abe6df0ec5476f879d96c25fc7ecaf7fcff6be7282feba2aa603f4d7571ef967c7e7af078b13fe7a6a85f5a8df1093435af476883081ba8cf317cd845e8f84bf8e83ba9098440201c25f17a23e8cd0a2b703cfdf9ebf1e245679d4afdc13934e1ef51c62f20c4ca0049dbf4eac8211009f9c065c354668fc2092422baf0f029101d78c10ba305c520441cba287135af476682750977f867f3d9b60f1a8f3a03e04c2f9eb2cea12826ed03cea1188492e8ffa90428b5ef92126275097511ff2a4280f4f3be4e1e1b9c1ea0deaac7b7779ab4f2c79a35f56f256cbeaf2be7a7179a3746e79ab627879e3af2c79ab5752f24ef59ee48d976d79a77654f2c6ca372779a76a55f256e5b664b549de69932eef140c4e4bde69565edea9d595ac46c91bffc9e58ddfe63294bc51be12c2bf6825d6dae48df3fe2649bfe48d8a619092d5124d392e99c72b05220108879985486e7ce4e28af62af78c119790b1e225b254ae21eaecaaeaa47f893ac11faec4648a1e813cf8c37bbc8fffe21fb26bcab2984599723608fede25554dd16350c770886ac04de912c62ac6aadaeeebe9bdd8538c558c55ecfb0aafa71e02abbe0a80cd0122c0fad7efa5818ab238521fb2474f1fef19bcea2c010c200220e1fd760868fd10983ddee771912d90c8dbffb86424fb1f515951ba5883a2458693c4c80e352d5fb0f4265065050a217a6b24c0aa3ce192c33363a62f0da7e8418b3832ced8a7c767c27d6ab1117ed2b946b807003ac227c01d0036c27f8736b84b49b9bc7ddfb4c72df60d6e071cf5e2bff47668ef92ea4d2531e457d0163e52fda25c186a0a1fa9deb63d3d413be8d1f651abd4035a465d15b6e8966f1f0f52a81ce2c56b87433eeaeaf878c302fc5b06ff011e013299b2c2e38d4aa17a825e0d1e5b6ca43a7b548b3972eac27706f15a6488aacbe1caa2c79515aa007d085f79eb077305217d72ee59a986689ad3a3b4e92eedf0003fed9603e7c0ed60a53a364ad50b73d9030eb091938cbcdb252e32bcc8640bc5810bee128f9c7d6e07f4559f22c03d4397e991ea7988fd2ea91e027770c148f66088036ca4fa0f33eff6555598629489a2986ee8526d40ad3a74a0565587c3a10f87c3e170381c0e87c3e170d80e87c3a1e3ada1de70381c0e1dfd42c5d0e170381c0e873e1c0e87c3613b1c0e87c8218e4b39c9f7efdfbf7121d0d06f7a44971ee138d07075617ab4fafa961ee1b88a83e33838383838383838383838383838431c1c1c1cc75b387a38383838388e7ea162280e0e0e0e0e0e8ee3e0e0e0e0e00c7170707070fc22718644b0e2a18ed97b026c7455351da6699aa6e81e414f712fef9c7b304ea65046f8083bb28258de514f2976d56a781190832efce155401eeaa46a129ae853e7f8ea43bf3e3c0a62087278d42fd4f11ea141a2dfa50b58f9081474ec4127baaa738e40c1a100a4ada33aa75042669a5429440411b1a60c1820377a04e191c7a651bfc2e0711b7dd06f8edbe86ffca650c36030f5f9e17068dff8ea39474f8f828e120370e3c2d4718eaadf0c5362725d8fc2e0d0088c5e75946880096e5c86089f3ddebf60a58dd3f1b677a3eaea8e42892c5468e47df913413c0ad3a334df25d497fcb23faae5c6d50a327456a6d899608bcd581c1a215e68daaddc3975a479b2c715581576e3868a29365ae82166510c0190266347e56ecf63bfebbaae2bc6ebbdead0c546a8ce5dc60e020adbb028a43866642e35c95b15ca2b66293292b7f0afd1ed80ef5daf7a53344b0a50800a5f75d4874186e4adf658c92ae6c247aaabaae32ffc947a524c4e7d265096b1f2f1d010938ca64b4cf256ffa620f81f081f2800e95fbfffa80072fe0a69c9b70157af8eb1aad72119d040df60601be5e3a1225edec2bff8b1fbfcbd4728f1de1093b8adf023b344010c5576c5c160100d5efc586c1d33bcc81257288a92a0bb6efbbee18b2f8aa6d777509a620fc25078041fb2e9511f40dea33d6f586c1be1f07121f1557dbf83baa5f81e2b9003ec09154114001af85788e29be6603c960d7db8126e7fe14a94bd84bf7025723c1229968bceeb43550a0709206b5b90e0b0719b6895408323b3044b181a236ea419e9d1a288191100fab579a1c2ab0b96465d3d7e61a3b6bcd5b2bf5e014cee8026775093b72af657c5cf2cb8f94e3dfc85c5fe3aea4b5732082d79ab577f1d4497bc53bdbf5e54cb4b43f24eed9e83352fd45c01033cd3b541922d2398743dde9e1a652b63c2e4ed6bce0e0d0533c278619181c777022b89ecf24edffe7ad12d5f6cb453b7bf9eaaf9dc5fb722dcf2d7777e550d9354a5b0f2ce8fca55e092b10bd95d075126ef14ecaf83389377cafceb1dfef24eb3fe7a8735f747170a3c1d40c264e131016743cbe902c60c9f18768140eec67e045e40236353b765c49614b58dd8172b32ab2130cc021076868a8ec50aad388df6c9fd09c10a62a60cd0f3891414704ab218d1a82f01c93b4499bcf1db52d8f52567be8ebaa38ebaa7502258f1648699bb3f3b251d8c01f3d5c50b4c8b16944f55dd7fe7f714ead621f14b2185858e2d318dba510a55831b687d746361769011f103660cd697115c5f4a7255b3099d5510b92a1a75107b7963be4fd3271959551d75e4ed701ff5ec3302e4a7ae1e711e36ba78ef48ae7024e3a1ad9ef9eb17890ec18476b965a2c92c18cedaaa67a7b5822b490ce609355b36bca089b1c6c58510be2a1a25ce8ec4398fd8386382cc5e9cf32d850bae208c7c5375a3a5e2664d16bec0999183356eaa328fd75049be69b261b97886e3968371375ff9a68ea5cb412d375af2dad762b875c395856dab961c8c63f9b21a268836bc71f7dbc845d0452e5ab133c0d20085ac1842e5ca9532457cacd8b1a3058daabd35246cc40129e227e4ca6a840c24cc2a5e7c6d40c40036396346b5e34e58a44513e2c089428463a1b45ac41e6d0ae1d9b0c67088971e38cbecf3174d848b1b2839c74730492e1ad1cac2b61caf1c8c1302c1e9d2fe4543f125b771b6c12b214b4ff06884ecc9ad8f4705ffa2a140f31b39667891c1bf99475d2f9b0e7f675618140a879c82c728c0cc3e512eb3605859882428978369ec8b9c362106e6d6c90a402a4200f35a2380664ce4e108f649d6598153250b69049539c78bd5916f86b04b722ecb09cc43b7a05e66a7dc70c9375672c232f1ef591b2e4bda98c1c1cb37245a34b9b8a2bdcb394c962ab33fd636b9672c7897d527bb74c3a192d3bf6781716002a510f132cedfb3402bc11e99fd7b16d8252823ab7fcf02c3a420a3d3e32c504dbb23af54c4ae2c2c41545b2124936fb470c06a0c5128bd8623946142b731a219a5df302fab4af62edf54b538f28d8a1bbd2c7c4164cbc11a2c9bcce3d5eee59b26995c3c5bede26ec4e49bba9b1768545a845af2da17b492837fcfc0d8e960e59fbf68546a886559d88697837156f9266fa592d53043b41c7c225866ffa289f0fb9d5f091ff960a3b4e777cea8671f341469bf8d887051aa4f94d02fea1ae12d3a6116fa3542953e3ece17ba930ebff1d1399bf09c4fbc17465de70bf15ee8fe42f4eb852b9eea9385e847bdf0ba295fd8a37cd45112578ae7c9d3c4c4df09c45161024347172950f44db3ac2b41c2491530da51e6e52303e306d8e41944b7c1e851256726044ba3d85241d523099e526ff4ed6f9d55608faf153d00eb6e4af51bc5fbabfc1b785d78fd5e3a243f00b3a4c9c5699f144a47499838b62b3f6448d1b7e94641a205844a19316550b0c4c993be1251d4f6f46de1a76537268c334c0d94f0b5f9a3a145489b377d1dadba1d94f8a904512f02a10cf0138e5f77c109f0136ef3d739c04f18f0af87c04fd80bfefbebf93a954aa5db7554af8f4fa954c2d04d3e1d7aea6dea3d3e6e05d048e953271ace2be7c119dba737afc7f7d5bb7b107cdfbeeba734c3aa8ae01bb5da68d6d6a78e325d78f914edf2f18d7e814df08d8e35959fe2a44fd4edd39fd4ef46e79c28d0dea7a952cda78eab28f8c6561863dc832ec518ece81b8f359b98c16a43bef1d3ad826f2c87e93e758c87f7a94ebab1de9e05dfb80ffb7deaa9f2c8a744be53abab4fb3524f9931987c9a767d9a7ea56046bed3b1b4f9a9a74eaf4f53b54fd367eaf6a9dca7769f7a8aa7e4d3629aa67b47bed3bed4ef535795779faa559faa56579faa599faa5c9fbaca6c7eaa767daa6e15ec5375ecd3b24f5d759249f95455fb547daa6e4bbe5539ba4f5dc50be2f7a99af7a9aaf7a9ba77c1b7daa7fa7deaab72cbdfa7e96af5e97af5e99ab5f5a9af4cac369fae5d9fae5f609f62f0bd8e7d9afaea2cb3f169ba3e3f5ddd3e5de53e5de93e45b2a7e1931cf52226938a8479242424242457c24f4a8ee44d4848f01ea9456283848484e41709098900cb38b12a1a665659481fd67e7c598179f3210229094c9297a4a42ebf9d9a253ea94a13cb27b98f11b74f7227fb24376a3aa2a62b4a6d8ac8b17b5e29e895d288dc28a2e2c9ee70dc2026913060e53d064799c424861674ef10de95dc1da9849f90dcbdc9b1e0de797c8d37b97b92bbbbd791717931e30c471a9ff182879a1a675de61cea77cf27b5e8fba4a424cf58323ec9511bc464924ffea626f7697261538b30dfe4680d62b2c9db47ea792424252424a7477215c9853a1ec9b3de23b98f23b5e87a242c8fe4280d6212294a49c97d945ca8c4c2ca2b39ca454c2af90c62d299b6f07826476510934c77646fcc79a39a371a8d46e31d993772e081f18a8f3766a39fd168341ab7cc78638eb18b11c98d4637a27c4aa59285d1445c591e892f2ff2c2b4116b0dc95b99122b25f4cecefb7c42f6b6e5efcaac8c0fbdafdfc583d30ba3cda804c75a0c139a18c3a072549206005318000805e3409865619274ce7b0314801a5aae5e645017c8437a92c41832c000830c00000000000000402007a9222f0642de3d507adda33eab22c21347a5fdc104374dc685c48c93927bfc95109fdfe2af281e6f7107947b095d4219ea528e4511c04342d6f6f604eab31502a52b9a085dcba049ded914cd91501cff25cabf8398e0a40dea6af890d175ec12d3ea4512a66829e9b4632703627d75ab093d180381bc6868c2beaf6c09c78d8a7b6682c1fb7c85bc5322d6c03faf592d6295ff210ef71011b0fb5a8a20d617d4a79393329820fa8ada48f2cafa89ca1c0281d46c4f4132d8d9096b85f473ce8ae4172886e3cb5befdd82b5e49ea0816ca513cfa4cced9b1c9856b4a03ce5ede07a31d952ed69384a50de98ff281269d93bf1011283aed89e83ff751f024b33261238de17bf797f9b8e54e898223af4b619d43db9e5e41e7c18bdaba04a9b809a5620151528a8a9623d2b2d45c17dc57dfef70040ec8e414f6c4892a1631834202ac00ee787306e16387bd3ec4f1931f31abd7963050dcb2a4b37ac7db797576a24f2478d3c73216fcff961c8af50d7c3d084edf359edefa4ce8d2e62398e120b2ae923899f16a51101a2fa9ceb371115b68ecaaa3b486d5176598038d5f952145169538e8faf14e297b0b968667101aa508ea5981e80bc22997faa0ca833cb2072449de066918d88f4408bbc05b7b37201f55f923bba18e73063fd6ec215b377f800fcf291e2251518230eb526963e98113cb8b88384b4fb67e2f60b4ca1a3c16d4f6878efbb10fb2f2eae2f5ddc6c8b89f059fd601740bb748074248e9fe2ff32e2fc94088a1e6b24999558c1b29303f81cff7d846ff5190647dccb87aeb3de227af76e22ec61a117a2d7b4decb4d30bdc7f4b6d56b6c2f0cf782a6f4f3845207380c7ce73d4f8fb32862fc79f02729e142a49a6e633dcce8c1ddea95f26fc6e8add1d1eee895ce3710f658f429f77925583d99fb69c50bbdd8657fb99d564ceed5caf0b283bb39d1afedc11ffb72c3b37799dec6f41ad3fb1fbb727b5abd16fa327a20d403cd37d07f9eef2915db1bb7e28e639b061972a5fbc117429d115d8c1bb9bf2c6417829ec6184b6110c2bfe57243549843cbe54ca21d52262a4fee4d8e81b21c341d457adefaad4f45bfd1162852e428d32504af49bd4d6879c18692150a4b09d4789fad7c8d8fa364005fc451fe0e139f6a35fdc00f00abf6c12c40a951843f2503c4c112edfee754759008345af859c8dfa457ee59e72a532bdc1ce417f2c4161b802bcb525940748e9b4f1803fd3c98a998a7e10e30d40d892016a3207b7bff9d574ed32805f353229b59e31e19cc5a568b53c2d78387ef43137a80ae45fc56668ebb84ee1412339bb2d9282ed8425c5a71409961b645b694ba0c6d2f6a7947ef2a66a16e576f4e0b01d5c24f415c6f8bf26644b6ebd17e823de649d6b81bd77aaefd878bb1a64a77fce865de62be148aa69701108bd86141cfb1a1e91a8096186268097a43f66420d2c6eb9976117c3534e6885dd982be026bf2bbf3dcb6fcafe2efd8c4ebeb1650048826bb588446c28850cc2e26c6d4433418d1e80c7615bdd73bff39009bdf150eb9b671923e453a2bdd67e3eb5e25004851365ed72b0ad5a90f905750a60bf3bdd2a287dd2c48e95a49386cbc709b701f2ca6c5da4a7d65be04f969a6d88947e3b6c15ddcbd4bd0187059fd8cc88df02e478915a5b88df9aa3ff4eff95cb8c61f313786db40859b0ff2031d1fcc94c4121de0e559826336d01ea0d0d3f66865c3cc4997f2a58e1e571d5a6b000126c23f2e23d6f8d34c3d24901ca35b7501b1562e6e609f74bd553f101d05ef96529436b3aa3ea43b14117cbcdb88d9449d4ee76d2414f85fbdcbcfc9f67003d153bfcb67b40bc9fa9512f307ebfeb6dc9942508a5d21051ae903a49c811b592447c79136694e4f37f308a4f65b15d5c369e3cb6f8dece3ffee5d8e13e09c0308bfda461d0883fff1a76c333ff9aa68a806fb84a5034e6fb6632a5bb982490e9f08621ebff05d7a68bbe308e065193679eacfe6d1aea60cf7c574283ad1299b8311abc4ef8288c1b082493195f76f132a53f17087fdf026f5b727111eedcce1f08bf174ae81ba49177d18a4709a96753d6e89d3ec79bfa4eabe352e99b0ce8d9dc806fe34a99d9db2e2f62eb0c13339ade8bf0331aca2362407b9b18121a2cd443c4bd32ab94b94d0710fa822f8b7ee22a3f7442cc22e45b9fb2362311424a8db7c50be7e822c8b11dd7bc4a24fc686c88e6e7db883ee38dc3a41031b346a997552ab3cb6cb0997429102b5a32fce44e15dbe46803320b06502cb727302d3313e8103384c7bb43ea7d3d1d0b7dac5cd0b390fec0ffc9c3a84faabb9cff4b331cfc431ef3871e5f914b07fe2644287ddaf4834b0b73b6b7540c418b96425b1f9a66a89187b1c79277ab808bb8ab3669a851bab96fff23d512528f3cd6dcbc1e2d02f81f97f36490283a6d7faeac500e24aa22bb8353ada69a44c602f9e092bee9960ab5174efdb264424a92872093aa157bd20ea2a4a2c2807891757ac343d08f5e184800ebe5ad95e663b015b9c92cd36005f34b8e479a04141cbb3dcb3867c352fe9857264b4e5b89dd33b45a01e078f4ebf6dbfb487ce38308fca111d98f7eea2232b28b4715616db8feb62ee97b8bc1ffad6bef9035ba017b557c8b759cea63d70c6fad2ba9359d9f0e0954645a1d15e9ea483eabca69933663b4ba84a675abb7fb6859e506b07e7ea2441c5c6405ca842661d2152ca045f2fbb219098c087174e1dcffb683a5f385936bb8cebe40e13647a4c3e56520cd5bea49af13ff84d9a07799421cd5335f350ff172d49ca42a43422e2acdcb04e5cbd43667728db46dab8e098df0f16d3ee7467d8a96fc18ad45cad520caba268bc8910c2dbb6e539614aa82e25f0b18d670463ff9082e2fe531103aa7b1e08930301b2ddf616fb91ad4220d42d82bf95c92ef7fd49998e685444cf5bd6c433d29d0fa47e3dafaa1993f8e3e8c405ddcf8ab70faf211c41cc5fd87ced624b402ae5f8af6ee009ebe4e5f5714bc6437a5665ef065f1496f2e70bd3a0d81d2866d427f68d1ade70492b952ea88373a3776630cf6db67f5e0f7156da65abc3718517688f96af26cb5400ae670985556466080fa5faaa5398d90e45e2644ea7ab5184a98754f73fa0e57e1ab7eff7ddd6b126a226259858702311618a9ea1676ff9818a3e6bee664a9a88bacdb2f8ed068ea4a1c67f7812e4b5efb0ab0c79aba785778bebdd8a70e16e2676abc773d40a0176460444a0db672153f6e4b752d7a5dcc0182cad4b81efa9ad519c7c81c4b33574abd80234765abfbe8bb1d5b99b52e8dcabc4915dea087604220a933219604c58f42a82f5f7dac9516be105b40207cbc20f762fe59ada694bcf255e791a5d8a74d8a4f002269abad09c58b25f551038e50b788de26abb0a047039c1fba69ccba523870bf288eb9a583f2dd87a86b2b1e59b0bdfdfe122629528b4348c7bb5b53e9c3eef1b06711514b29291c9cb484f2b114c89595709a77d0131823f44c7ed9a0d4fa604ae89ee5a96d61292bfee909e731fd8808a00f5730fcedcad7e4fe8ccdc94b9911af440b8b8568b444af862ccaf3afad0cb19605564c8eab67d6be81cfd0fcae833fdd3b975b5476e7e4634438e4e0645ac84b54c026879c374c265bb14a43a1a575f71de494909b4888a4acd890b2ed6f3d5008775733654611d34022c112aac0aa0851a50962382fa5750ce3753588d63d02ae3d5a514b4f386ba4658b53dbcf4e8b3343710b4f4c6cbd2b97396996e082f91f5f6cdbbe0c0b2e9319885208f283e85207d165b8abb61d30c78d124f0e8c282136ea95834a9c000530c59a97e95a90c03aaae82e930d075c006a6946e8fcb3ce15c762b3f413edb82f9b57fdfe7a969ee0a04af1cd4a3091a57e0b70e7b7a384650ff6944a369273cf18a797d8a05b2305f548a90b23207dd84c33f20a3128ea5a6c8990e40e4c49f91704e1468770d10ec947827a92bf22e78e68b0a8c68481133024da4abde37c31bf462120d2875df034a99f760a9969f5f95b3e1b175ccf35f3b2abaff194e8722343a764a77ce394b521ce3beb20d9856bbaa5f9229a1d640992749c5960941f7bef3a8bf4314496fb037771df5ee35d8b778237dbc970be4661542b517248869d065e62eb47f8e209f0d08520c32ae4cbda0d22c6b50eda8a6e4ca020f289de7208f93d83343f86abd20dd03916a0d049e8a38290aa1a808edb5b4a14786b23c82019d17e56ecd8b1d16334a499388b790139c7101a77ba928b4b96a235750d8341e6d83cef99f7a769d02d5f8670a78d8a6c2cd6ee28cc0ec93dbcba0e5470a2c410cbdcaa7fb0d6f54cb1606f7bf1ff1c0dedb4a738ebdea02a34726d3820b255c5a0d6b3af99ed14076896f20492f1156241227ca66c34e6e16cb1e622c97f4a865f86c9bf9873848ed654fae118336cad34387876fc8535da91bb7bd52b4140b0a61a6ee02696023abac29d5f7ccec77c3ec82fcb6376c050c872583d7b022a5afd89aa7511bca88ee966fbcd5c2990840300118d11f68bc2ae5f0f4bb662164ee1f6490a6642c3e2cc91e24b6ff51edaedf2fb40e0c2678b5bf5e8cd0b3fb4cbeed8468982e8c20c29949b8d637b313a551534c6628e42f8c9070ef1e2903df73efba449be9039658986d3ea275b1e3ddb023c640a904410209f798c2095eca1a9b58ccb1fda26d359ca81731bcd7bfa8543f4352f5c817fcb5bbd6c6006c64993f56d534c3fb69917224b16df692eee8efce0c84238b2184fb7914fd3a53b5e06940f10230ae562a8af34b31d0c45e3ffc537a549a06dc4872d4adfdaa4d51d685de7d45a83f4a0105c90c17c696c3721441bfb2f07481ed81f8cedd6a80491d22653b1a838df2404de9923973f2664e03ae4a82bdee2076319e39572c20ba546a5b14d3f7e039f003412ee6896fcf0b17de9c38620a2f4243346d4f503cfa9651c69f4a2ffc72b53cce849f9bad5cd13c5c74e93356d0c0c6586aca3e993461276e542a06a94bcc041a24c92b35eeea055b5b402a8a49afec3684f74958a2279e3c7f775d09481651546445a22b43eed0fbfdfba5f20f3c1a57cbea7f234d9837fe53ace71333d86d98a341bac6409e0c09dfe9a8439382e26bed61e485971ad708782a902e821a885d058e40b978098ac8d57c92e08c5f6c34d71d710e5e54f042d4be65af0bb0a1d23792e176cae708411a1f10e4dd17473aadf6568acc1dcfe48b7da0d22b209dc3f4a4f52506e603a3309096eae1403d1d67a9b599289630e7c14cbcf5d22e999eb26566948d80e54b10cc8413bdec30b4c13ab405f9d5db9b51e36341ebbd4a933c7a42a675628d91591a4b075d2a521334b8bc74c892d19c88df1ac54934940f0f6a89f84b3aa804b185f1cf18adf6a753bb262567969d562e1a9e27c96875474a66c67492474007abd056fc9796bb434d8d25d5b12b1aad266007d768fa05b677fb21babd52165fe9b5055d0d8b5376279ebd2f9bee19d6c6bcddd3d98821868993d0569d16734175cf838cfca2e1a1b31fc616142eb73889c245e6693ad780de0b19f44a6341fa5bdc7e65e196220c599410727b9bb9d987d746997c15aad7463c3217e6be029f38c57c11ce1e5023013dc0c0e096f28ee1d94349a36b0a6e75cc30d741602cc00ed1f5926a60df1d93f3c6515c0073ac043ac2dc8233295b41499d11aad18d43f6443d9e8be244b490e356963b72e158219ab117f4e1fec97d6d41dce8074c97fcc4d1574759de76814a4058c979d2fba09809fc0a9a3e7bc1006a7a43ea54c77e06a4821838aecea4407f8402c7448a59bd0889f201396774fdfc6fcfba91705caa320977575bb616874c81dd00028c63bd812244a459612ed7ac0985a78ed82274789bacc962e2c4c685b91e9f2ec22ce5211a94893aa47ddeaa228a1c1a02531e8bd17a302c635aa996f84bfbdce21582e93c15d284897777ba9db35d3e6d9e7a0a0c1163d57d85761638cb2207d2dc871b41753f8c24029b6775cf14623c7ab0707ce9fa8b0583b91633169fbb8854229025d86111684280181fb7a3312ecd53272ec3b42fee3d99104f711bb52f13a6dd205e8a46894e7b20109d18ed168a5d314092ee9afffea6a43f8131f18e3b83b1552c6e6fdf5dd375a01ed36f6f36ba5a443794846ef850ebd2a92c1f84ddd341a6f78abe6800dcb98b05ecc252074afc29b06bf04f0b8eb66a792d3662473668f55e82e040b5eb435387b9de22bf0b8d147babe4ce62dca14497dc252a6344a57904d70b82acb9f8b808a02a74e0310bea1b14a6ac99977a7619fcee43c390241d332bfad6b05cf1a0257e1fefb8c4e733085a1be8182639f15b927ac6bbe8af8a3f57bb4aae031ee769fdcda96b0d0584798889b4de9c0bf01937baa60480428c51b4bbfda3449d2b84fae66f5057358e1a797a8a01a0be050bda88614d33282e29885dfa819500406de2c0c5c6f2427d4b766c6200cc8e42228be5814f27147c07c78178e6781c06bbb740ecd68c37852f5a1e83680f95c11e448d4fa9da1fbc1a3f8d37cdbf315ee646c65df85c468b3e7ee8f42606dacd969a35eae36713234dcc603e2d7f06699e4719aceb29ec92c9cc109c4af3ef15b4f1cedeb1d05ec93577149b8747f002967a89d612b28786ea0eaf376db769e29c1d3478cea1b799169df3a02d715f78f117105c5a2e858b778d25ddaab8e0eb9bb7f27e72533c50e6c75b3af8f7c16d05a8f9a9b8cf654ce22954436d221f58a4f3c277590b4acddcf991d2e511e9e7546683d59ed4a21ca875725716efe8d4e4373494281495682965ab21e5cedde7b984f34f4ef0482d835b8aa0910297f02446fcc801cd27c7ef12de7aa4458c2a0a6e7c8c8eddac535853afff5659feef2ae7986bea78b3733b8ebfc76ed9a64af60a8a167eea00afe217878eceeb0ee13ecd598ba46e4c1527c1040dc50d88ce9a02f214d3b8a26e4a8a132a8dd60151d937cd18a0a3659a9cd1e1450e72c218b98c44c4d7352338a6fd0fa69f83cf3dac8138260fd620f2fb06e86a71ec5b0e1dffa9a4ce2dbdcdbb6dfdcf88258917b8b42acf0947081786f073d8dace8655c14b6c5a1eb0ef371031ab093291bf6795c2529b5174680e1da6d0766af7e160338bd683ec6fb59f06d3f509ca23af59b8e896d55e46075fa143bc90815447c33b65203d707ce849f82657b9462fd9f329adae517d5f88370026469b3b448a9049bb267365384f8bc275c30cb48d95430b9375d42f0ec7dd00992720ff41b68a3f2037082619ff2e1e63272028875fe04300f1d68ac08ab22c040920b4ddc70de08f35705f9f9395a7c35130683ee4965b8951c6104e6f169e0a0c2290c2bdd26a36b1057d6559682958121a62900ee6cb49690c6d752a7c0ad88812198268a2e6ab6dd5a62c0d4e012e1912c591d560f0ad5575a7c780576125a92b75883c66ce5d3555efb31bbc0fbc89400e796aabfc63394d8913e114b024a8cb5cb46fe4310b21078c79fae216afdab60df85193173fe0f3bd0c3cdfee31d07c717f81c307b05f093fa7b558fa0b3d39d1db4280c0abd46801dc36308f12f266ddc550e143e2479005ebe89ee664dcde528e2efdda39aa71f0b47f3a99fda38b0d734c4c7dd63a6901ef1b243ae8b519cbb4d82d34509b9fb51608f1cc5c57eeabc8b5438a7f291e59b656c7860d3150d790ef03913f02b00f4a07401faf54bd56d4f84163a198bcf49c4fb33b1e4e59d9b0ddd44d74bb3f58ba6d809091572382a3df0edce5ae107390620bb87771195641c210d8055ef7de54d3dedca92dd7654a3a68c4ef818d6d0c7de59c0ec7e43535c29394a7904940dca55805b7e6c544c1aaf60c12bd1715fa06c7cfae7c3d695f1d52d6c021ff001ce1f08f7ce03dc9da63823557272ae93404add62b8bb3a468c0b3055502a48567ab4d9b4b8aa0b183c2f251aac11bd8b933bc64c55072c1bd9ba115b34bb087a014f41b0d59ebc4950fc79d607c179025910033bb31dcb958f9a72e465efd0c1aeee956b74f1b80e711e919cdea2879dad3e6f0bdb00e5c7ea8b217e286b404ec8d9b55af9aee76f1c6b3a4d80cdbdb8b25dfcdfabef9b478640fe0d68418699110ad67b4edb605b37c57909b7fa20f0be1a6b2a738a6468572d850623386d1a0415f4a59ad4c7512c6c8c0b9c5766b906979af8c53b2cb120eeb337901d92980dea62a328ce2d0a9f1ff184b28b1144f589ddbf43f7ed4d94fee27710a80bea5b0db9aac69580923dd080c07a49a047b6f76b5ec02e2916468a4792fa4e529149a4a5d5a1bc5c3063c7e64b6c69e9a6c13555d6d0f76e2d9f6d3db1bbbebb95fc7b1730e14db144534520311c4c6e1322c62bed1bd334e13fab7e3d3ade7f3867a287c9d051ddfc54f158d1dddcc671c74d87e693719d063b35f35668597bbb5eeb4f258b98812e6f7cf64beef197d85172b38abd4ee5395a835144405a0b7421c4ef15b2276ac78527df679b8efe91ed62784b2786404c9f8a4054182b19f7d19f76288d1a28537c2ef8c460fbebd018905cc80163935fc28fd2d8c40b3018e8ddfac214b6ef611cc990baeb9cf41d1fa55c2d279800e2e1abd8d41acebc9f49b70aade164128b9f7bb7ffaa7029b9605765bd2cdab95d80a33fbc38e9ac77709e53197a2c5ca63059d657c82d5b6b0353e3f616377db2559357c0e87696f509d10be74d3be4e9f59ab6e2fba953c5745d433cb78e60211b1d03a5cd8fcfd71121d9b75788984293d6851410bd8d6924d1577cd940661e14a343d6f9b036b9febbbb96e208ede8e6926ed2d589d8b7fb81b4c84f0c6ac74804f9939b6ce1c899087f1a4dc3026adac9f4c4d5843931c599ea4aac62a9134060009229be98945ba9d7f4c9e70e1c968315395a8ca3c00d5f61876306f61dfac00103a601498d1ed2a0c8ceaae2b5109a3e09b8dee3f3b678f0cb1795954ab00c041114dd2d6827f7a046cd51094ffd5941270dd7cac20d8bc78145dd93380f815cbabcf7ce57a8bf88aa9ec0c91a863278bb19de056e9444222038ba6eceaa00d8668b54576a870316403d61222c29592d6cc321916e34aac956a54b321f386b45a236beac9354f4331c359f4d9aae7685673e5e11111c812c825fb13906d0635c7715171a48caf5dae41bbd13102e6acf5d40613245f5c31cc280000b92e8152766ae6013b92d6825469894b80eb4ee4184757fa1f27672d9ccfc4b19116aa2a634e8e1221f1d6c949dd1ec02c2fe5c7dff0917eade49f84302c9b24f47124efb993e85c628247dc27fd062de828097e5cedf077115c0c3a8030b51e441fe25964ce1e09bee8114a68805198152e07ed84c3b64f616de6c2c19fbb2c94fb453db38545413f640440dbbefa9c60b3e131206583ae8cc5a501ab02a4a45f4dd22c92fa04941f85948243489ac4013098cf2ac60ecbcd57b80036c4764de72a3c353657056c06f2db161b6a50ab0241872a9fb3f4c861c4f4cddfa450e146c3019e9f8e5387de281192c1f96d0a56c07d5a648227ff1407965ed0c8bccc2e45afc62a34dfe6359c02b5237a6b7096e574038984d1c6c120166b62ab4511d54509db9020eeea9782f8fce054a87cc0b41a78e0c252647070881072fb197cf88fd935ac2e304d58de9dc1941174532a9b77c1117478bccd1f78c8b87bf304bccccd3f453afdba9b324be797e32ac5b7080291ef9080aa8243d6c5a52723cac1909c1a33c64d8a4b0b1f43d63005027d09a741edd536437e8190d94aa2f487ca395d812980b20e88c10f6b747e25e7f00c5339e4439a619964630805fba195c75d95a9106e59432b473ed9914c22aab0e8d6ffbaae4e7e81b2c4b59c23124769cae7ef58c5bbf8deedba22e4048053b8e08368390ac47884cef1c173f9f08a6d2f0eb97468c0a91df309006c6a1a2646bbe8b4b51b9812177849fe6d67281dc67746fff8e2b14146b4b87d5bcb8707004bab3bac8c3f9cdeec773fff17b942822c1d7b2dbe1ae796fd8a033fbe0f118d56d22ad5536bb00de8bab6b0de89f5515ca68c1993b5a06bfb87950f068265046bbd408ead1fbf8c85bff5cd87a7012bd3f5302a8c7fb4763eb5183e1dbf8ec121a9f66ae54a4df68dcc72c3314b990246dd653d3459ce6cb8c1207dd3f25008c17dd480237de4fdc35f26cf55ea65bb3d54464790e02f375db0870a1b14e88e5f9aa5dcb43f0fef70ef80f20b167a12ca21c3cf1d3a4bd93880b678a6f025343824eb14c778e5666270655ae11c6cf6b38a4f0870705bbd0bc96cdc1b52d367cc9cd229c119ed6e988450d12d60cca370d08695918a18b3a91478732ea6deffd31e02b20362c11e9ce24c0648bd9853142c7f76bd37b35ed828a412384eac36e0b454e1bdd327bccd63960a5c53ba8bb2976af7b9c5442054441695be40584665709e157f121afa2fbf201fee4c97881c966237dd02c2ec3a8009d6188b23434567e66cf7a902e5832eff9c26adf9e36b1185efd1abba0002ec01d3115bfce4692003c158930b27379c39702f07c11fec017bec4cf438d29331583d5cb9dc639ff206d9c91fabf2f148bff2b4ff1907b9a0864e640931b19510c225c55f14c007bc8cbae3920dea4804b3811b7a01c294e532e157b87f4040ba1e0a8a0a2b1f499b43e219f48979b160776183898545ef521d1da9f0633f03e9cc351bc1a87096be6d8a315234c27d4dea2291765b80db0a7698cfff070cb4d4c2e6c59fbaa34987eea7685925990005d1acf276bd70c8b0cb81f89c1d32cbb6df4d1facc82032221aabc467a20c3e0e5d3e6d0d75a1156e910ae1461bc274357ad0beabe08b3bb05609bfda00c5aaef3c106332a3bfb2ab3f9e75791985c7fc83ce344762f25e64fcd29aedcec4f97494a8d74c7bc758e3721fa5bf70458a2ea0e8920ac540783adc93efa423b7044f51b84910a0a07486dc92124e2fb333b798e0288aebe053811788c2e325d3bb5c1d462e4027b610792e37389ab53caebe6f62af3cbdce37b9af3cb4d63700df6ce3f88d1ff5eab7463b59d8b8fb4d0450d3a1202699041ccc5f2a4503caaab09003c57b31d7e37daec8737f62a5106eceab07b971d0d6c4c5c1e882b5118d9317ba1a32ab26c9cd02b2ab080851496ec731fa9666fbeecd0b76af5fa4e189e4ccb5f7d11088c8468425162d9962da8d823093952a85dd165b2759f811a862c1f2485914c337d2e9aeb54ee02f8f49e61d48128213b2368259b9ea2e5f2ec18fef363bd80657f975ea9dd50bb34fb1808f016346db8b23814ced722776f47dbc207de4db503c057046f47f49bf21703fc5a53d271d208eabb72f30792f2f0ed8ff48149aab3c19e15c60201000ca3a6d7b6e45ab48c89bc1e833f74cb03663fe09bc807f14f1129a1d964d597d68d2dcf7660f92b64b52c47c4a3192a7c0ad91079753d9c0c434b0d665d69370c6770b1c18acfe968d6fe2ca949261d7815957d3a4927a867d3319c35ea4b67bdabd4c9b2f3068a71de7f7aa74f7443de6429d50a62d962983440e65e28cec3c4878c9db79559f87784f0ab10e20edf9bb3b3b69cd03f3151d39bf4f267bf8c90bd591d777357b38c4864d39d7be3d6191bd874dd013f4ca065b3d74811e006c831f8c369bfe1606d173a419e2f8958cb80ca89c7f7eeb63aacbe298a5c978af8820e5cb7ec66ca9092406b65fcc4df2fbabc02d560549f921e124b24352e0e0417a90dac49890a6a51d2316ebef9061224621b0407b7c1da9f2078fe368e9952fd781e3a155829672021cdc08e666db3b3b41ce85d130a888f422eb24e55def4e615993a495f19b607d39e2620d34949911e4f9cdb43079f4ce5866b374f0c80f358698869f32a47794d7c1f672596090f3fbf00b8a624bb52e41e5efd1a1695d269551ed7e62133428704498ee4e6cc9f53081f86233eb6887118b2448840cc7d4a84e962b2aa354ef779307e73b22a91d7bb6c05f05e318b24dee7824a06ec98112c85b2a7e4638f71a4be3bb44201069584913e503883016740f176dbc8827d86030b2f1a5167652241cdc01b9dddd27a2b6e0aa4a59c3eff0c12f0c48f63fa11a0afb6e6b66a7f6f2be5e625884e56741b888f8a691671320e52738c7caa30a0378096041e2aa78b1e53dd8ddcc12c0fae1293eaa3e2834db11d4d803e744d86e922921d6789a19c3c52e58d9bf19ca59ff9727c1bde2079d07d38453ff43f4dcf779fee18390dfbd981298bf9acbc4a2d53634f36e1eaf4d8fecb4df053712b758920e76ce94dc3dc1c0b7fbc7ece310cf3f44cac588d63d35ac1b6d9bf84a00f4d10881d8119152d2906b85cb0100692322a0dcb76a3a6033577fb6c5b99c33aa76952b490572e01f178e79e01de2790a58080796fa1848fb71c737153b1f8812f080ab7844f2ea8a4cf0a2a8aeb3562c950d38a664ff2caa37fc8c0523da2b14af03e46ed691402ecf39bce2019476a02fd5536f3389a35e6ca7cc75e9a3f0ce3a31f0e89f3f75b307bd05588170f7cff65287a0c8e091540fef3f232c1063bfa0a3b29f9d78a420c1388ab18b6af14f9389d743cbf0f25b12bbdc0756143cdaf7bbc42c8d6b561df8ace66363c431e27b3c75648bbc7ef993c378fe5cea8bf29398bdf6d2ba1a85e7c143f5dfe2dadb1b5d271fcee984f9330e9c3b6ec4461f798f46f08abc7c601f4b7e183043371f38e3a7cf055f38413dc13d846cf5319c475710992671b5f571c625c679f243bfc85f25ae655ce205534caf0dea724803078ea51c0630cee3d093bd2f02bc21f4fee2580ee38afcfd5feac2dd54025c938b0f0d773a4e23d5d6862188dadb3dce9b6f3e125f9adb36b656a3bacbfe212b799de2a5e6c84b39b3f03c97712b3fe30932eacc32a944fef7f4d2811247b520222e4fcb97c2c7675e161995ac9e8be7e1e0e455daa2285539f36c0ec4feae2953f480b6eb4145e40b7290037c9aec222ec27e1921a5046172774cc49d8ccb27e6b5e737fac4c7b8eb71a48e8bc1e6bb764dbb705838d75c74191920b8b03d7f360896bd16e8a5c485d4a804bbce7ac77965c1c03546b9694d6feee9eaa441cab0c786709ae6695b42f203e15aa1d37e1ddb37cc34422d23a684892bba05991b08ced036c749a38e583727043afe3fbbe5f8bba7f2371bed4c647a31749e9800565116e5601d33294d12acfe2a9814d5754218bf7b6a9752065e6ef831de101266d108f9a3cdabbb26a7955b724b8efeb07efc1c2655795dc704384025ae8540c80c6142a80e89c36049eb6c46a468772da4dc8cc2a4618e06b5d8055338c3d5c35057515ead491dacb420b88bca51d5e9d489a1c3918b41f3a00c4680631d3854fff7c2c45a2559fa44b4d75e06761ed4b6c6c6a1dc15f7eb50264ac56bc98fa1e814a3ed725cddf162f69d9a7155cb6e775fad6f3706444287db67733169966712cc276e9b8a11e20f82b73c83e9fc543a73b86e0c9357bbdbb8d34cbe4062ad3c5572c376913628ed706073e72a66fe8e0a246e001a0187a8214ff8c79c84a4910fa2e6743a1d9a0e1a02482361a0c48b0bb164b194239b91ad955c28b7028e7b29dbfed663362fcfd982b2be213e29f0997f0199b527a400a4e313ef2fa6c47da8972134009c09d18bda1216d28a7c19c16aeaf065310d4862b7f28e4c62812ce9c49140ed25c1b2e9d9aab0945a9922021bccbd4083a166bf3d6969532972c96bdc3e663e8b712b777b56f6220ad50d7cc79e25dc8d447670c44d2773b3247d575e13ced21a76840a31fb081cd9174fb7ef315ebb28e4f7ead01a3c7879992f030b2da5a73447f894140ac9394dfb888c4368670b5a2fbb9e7a077111f1e4acb674f326ed49527557d81e480275153c340f53ea642bc8b57300197bfcfe8d0c5fd879a18bff052d7a3baa2a4ea8b8314502e99bd494b478e91985d9f6cb2d3112ff3d72ef206eb155f4ebea9c1e93768108689d80051f4db7dc9b72f649cf8e8bc9f651bb25e5e0acd9af5fa65652db7c3519163cc2f7b7d2f0bc38076037bac332f9b2221040f0044ec0244f631f990424c62b9613d3821bcfb8d47d12dd7a4147cdc5d5f497008ee76c6427b2d5c523ec75983d80739f018763e7514f3e23f9e228429d7f095ccd34d6e3bb1db6e68d1e857e07486caa06f3dd9af15e6e4ed3b6baf04470eba09c8563d91f8368fe6b16794f8d266de3d17f8000957df756f2a61aed09794c05d81335283c2dd11606bc1154a2bbc0bc4143e5b645ca4124c60c991cba028e6cbbf9b7d9af4dcb14eb4c8591b3e90b5e21619e9d97ff9e84d5fb4ec72b7577ce3865626db803a4b8d876dce7b236163e48570a21b74d19d29789438558a7b82b72a43ec460c8ce439a3ad97856ca7c1211fd5b515c16a1b05c3d77ed2012a87c2ed02a4ef6188e387e6a29f7e3100423d5fef8d2a9f2e0cfca1db41fee0a6688ef06debc36b9c5d3f50c355901eb661a580609f828015176025a68cddb695f810ade7a91bfc552f3e936ca45d1953b34fd32ef20f15964bb1e1b36ef92a54396bc11b100036659f40177eaa7049571043581e0dedd9eec1470c2cdb01a8a47049bf4a4924dec454ba429321b655214d6deb282820f563c4b54a0b1dd625d8b35f787e2f678e57fb945cf1f14b509f295a5c5ba11bdd4baca32d0600d89c559dc789bddb1ebf204ef02f95529359ee7c99d354111b9853e3589fc19f4b8d32383b65ff0c23bf529ae22cdb69defbf8c8b7e1e16b223150e4f1f20840889b0f9ac1057904b139079fc073c3474e44ed1e1c51e834d18d3fc92cf99de16ab674a5c7e6bfe1fcf58e1db1f3c6309b5bf6b515864c1cdbb77ce4bd83db8085d3640e50db760553ecb698d74d05fe4fbae176eb74a225a3fc067b7279de640b3055f2d3b791f17cf68a3dd89eb5489e39ebcc06e466efe1ef12ce70d6e676c36e6da9c35d6b14be95d48545475b8d8ccb02a75268dd40838bc1bd69930013edfa7fd5798d2f2be9fdc7edfebb343d3a56c58b02e2c620bc78cf4ccda83d83ae94adca5accdf57d0536eff02080a0ea4a1c2e03c0f68d3afc12c4c752a23f5c346df83784fa8b69b5325757608f723e34b2dd408c74574b564f9b1eca69a8921b1a6bcd2415517f280d2b0ca492521695543395a6bbdc47988e06c7ab05458b02ad9ccf0188434156d6b38275160a0b7bf103aceb5288ab4becbc8f1741bb2c8c49b1da826d01083e83b962b4418de57467ca8df46f4c72362518b4e3375adf7762a6455ff73ec2446e93d225edfec1c6cd6cf2b17d83586297e543b5c65adb9b5d6f466f8598248a7053ef52ee31ddaa20582a3a24970434604364c5a6c4727477b4cf9af55d8dd3e6caa6b50cd02a8cca2278d1f987bf403b9893a2978f730c5c9b52abd976951b9ad6b6f8cea8230ef4a1e44005539bbe44290fbf279112a07fb4358efbc17212ebc475272d0db183e2fa570cca5d547a6287e82ee1f0d2ff02a6b6f01628a38884f6f39cbf479b890df5f777477e2bae184fd256063db935bf9a2a1920e103ad3f17d6b592e7c898f2dc70416f8b2cf901b5127578b5700904b4400a1cc24f5e465a38532dd1aefb01e7752aa7dc1ffd2657e8458923ba07de6ba824b264531d9338f55010f770e9fcf89025b8ec02d6f0e2f5971147b9299e37a70544c72ca8b388ac551f0eb63ce79752496cd925f08c4dd2b63a796c66023618e2ed6431735104f4d6940c6423957105acccc4236e98e1237a6a4b2302ec650d836ef4c30c4c149c8c4b76ee67a15961270e3ae1140ada2d23182ecea35aa384d57085e8c9fda3d2f6740fff763289f71a831e8c099fcfe4a0d8273b28d4e2be82967f19e86f0c2ca9ab4f10aa2fec15039689e95fb569cde292335ba471867c0f6be2bae08361c485a9c841c4ebe0f0a6d9569227e8a986bbf677fe25e6fb8d14d180c0a69ed48c02529bedab06aa752875a553df6f01ccea29cb2374b41ffdd90f4469672b32548c283ac9c287cc0ab22e0b0feabd3dba9fd90d56fa6c1f62a3f9e2896f4dd1cf42493e9cad4990081a27c88caef9661dfbbf4b6c663dbdc12121f2a39734b4715e92473c098ad7aa2893096dc23aa33be2c1993959710fa7395ac23bbc2809003926ebebcd4049c6040bb088c4423485c2f76c809f1726596c646bdb8366667d1691fe7dd59f46aa684ab6c8c31ed3ca15e2a5255f3d294997cb3e219b35ff27bbaff071c8ba88ebacbb69ee51e99119a6b8c67911293abf4a4053bcb090ee14ef7b60583274d2f4b41a30d73a92c3fad96dbfe33d53887e3cbdcd0711e8c9993b5adfc8712102bb468a4a1f674e00312664395e898150a39e8ca0e666113e1b36ae0602fb5dd7d8a44b9b18f5bbbb65c310b28b72caabc97eb3b2e700d4bf59c4b553dc37b2b62265ff316173e40f4fdfc68608c772927c5fbfe49679825dd1b3a8dee9852f70680457e741101964bba578b051066719b863caa12c38cb293d76ce5503d42fe7b2ba0ffebfe0d4c22bea059ef022a151bbb55c0c28cf35fdf7ba22004c6e33abfaf9527dece12588df388f12a5c41c0c72e7fd1657d39ff62b0ad844fe12f5483655d1c47c3d6a2853cbe45811421b43d6dc43dbde2e3cd618450008e62f6a7f3fde8ba2c820aad7c0dcef0fb8b7fce956f4159e3b6ace61736d6ade6300a32084eea0490d3f13d92b7c3390783a29747254eb2aa0addfb10026f7ebcf027333c0608909c2664ee3e4546f8e0a44ccb0abe3a1484b0ac80e51beb2ff0e5b93bab5b498f693154179fbf6c10d257ce2319bc946c56d3c8789df4ad78639e49b7907088a99a0bab7b4ced2b72682165a09bbdd6506cd3b6fb7d4cef87ac39b685603a714f737fdba4a3dffbb168a73a4bc5300d170c5cb2826b843b088773114754614e510056fe7af95799a0ecdd285e3d6824287ca0726e54754ff16b2d30ed23d09fb21e8e92129dac75dfcc1ed459cf2fbf0b25ca9057fdf9f2ae01c129735d7755d53c97ff2af9c24ffd993b9b3db2641c2c237237df269d6c22bb8c91be4120944afb2120526166507f6ddc1cbb31ce6417a932334d0dd59a49af178519259b7a845ba2f07e447b909d23138ac057dca3c0471647c1d69ca7e28a04c9fc229f9ab94889de1b2b3fe13421b9f1d5eea29737953daaca4b3706fe954ac3d25e191081a065066595266945950a6a8c25b26a2805ef245eaf5581995d21b03ad269e332172147cb135c4ab81bdbc5697ef19022a47651469fc96c0770a9e70329677ee916ee878fff5b50b70432b4aabcb99387272238d61c20ee550216e0d93cc8c3673dee9848c239923ea58beed14b451b3fc4496752d4bf1bcef73040868a7abaa6268eefc3728d14c7d18070c2bdc8474c423c3cf4473e10bcf1a321364656595d3776e34de4de4880a1899bfdfb65cc7809f8901e190156798b9acdd3474391871c9cc04f98b3bf24ef7c4d587747fdc05eee40429d56f1251461cac6d64ca897338cddb56f61dc37a6ed648e508fb157163c00714de27312229e24736bc1e962933143521218bc1009072e06b3712e0d30606ca129343110eb68073faf8fd655cb16f82e8bd1634e4204776f66755979d4e25a0c93d714cfe9099dc6a958da426419033b377b8361129bf8589c5bedfa188eaca859bee42b4ea86f9a670fa5cb780fa36ce71a2949883c1ae740cafa15dffd8e9c44b88c7fa3ead280d9c623e0ef30f38dc9b0b09106bdf9f7c2447df741bd37d020400eacbd2e25c52d09566cb92f22405df1468cd0410d28dbc48bd1e2b3151fa9d6dd5b93ce27ecd35b9b6f977f6facaf70fce4f1bdc803596fc15a60dd37246ea140bf10ec05ae275223d3597c5aa19d4f0ce957000e886b4940c711c948e5b66f21dcb7472d340e0887ff04029f22fd2d8e9b404294b0915e54a30a5c996ef3a0eecde6f060cc38d1727292620b6fe2fa32cd71a935104c21230d8d1320df0bb9a78f56c6d35f7cdc3112f00472be526d12adebd3f0349dbec7128aedd917716c7ec92b5aba47f52207545ba2522c614ad462c660861f58bc235224969a9dc07b85adc193ba1a3373c0c0572a62d47b8fd57e1fa257d512a59d55fc883b076bbf8fcfeaee45b3c09312bb2cdc52755729eacc292924019acd6ff73064a9c6d4c497690cec0d763fe47cac8b9b6dee088ca0d0ef0607a4a7476556924a8dfbe42f52dfd7b41058bbe563c50d6184f3671562c564687844a460d5729c38d4050ac0428421f8f7e9b604d3d0942db4f89257b7aa93ce2bb2996cb34991543268f980d42532c9b84b75988406055f7a041ef001b8b79d0bce8563870f6fa193d03d4167026a74f5f6fad2f154d5fae917eb1a5d890688ff4f075f7996d3e967fea5b7c93350025dc356087dd97c727558a55403aff75a5a725a8ae4ccc38e2af21dc2ab9625ccb21d84d99105196acd49dca2faa1e648320dd8d7fc8e4212327ee54a83f91c22fc2e945b02430a66c08091451effe08f513e021268704fb2350f28464743c8bb86bda70e20d616a7dd891c3df1a0a73239a7a39a19e19104cdd7a3166019fd677384d71be0d107ef72ea0973b47d76f0bf4ac7e94e1bbe7dfbf9fd967e2cffdaae66552d955d4573e907c125d944c55a9f0bb5dcf833d96556947209125bf4c45c655bdb69bc0639d481093c5b97c0d7401b83cd6e6e603b3ff0058d36f3ae6ef087e6019be08cf87e8a55f56ef6351fa703f40b34430a890de383aede166547daadf6c7ed9d9b593efaed9212cdcea0026472fdfc1a8827506b32d0460d25156c4c583247f7f591aeb3423a7d362880d32e370868cdd83ebf1003b931575e673c700aa3e0b1532d0807489c062529f2c3937ca668a8a6c071387bca35bd305539b5c3b02c671e80519c4f2f4c32893c123574606ce8b0569dd3350c97350230f5c3218131158706856e9f8bfa8a7e7e3b7dbd0dc30784a49d9cd9ccd947b1b4756e9835c91f964314116589ab89816394e65709d43f71acfab06578408c3969fde6eabd0a05d0d5ce6e04a79761de023d4d1609498df71250c7049ea4c1fbc5254fbf6b6c7e8a7323c53d65ee5921722c367e27bf0de2d6fe3c147f46f7d90f78fa143533666693cb560e3415e365a3564100cfab98a014052bdae9c71cafeb221c58e98409f0f924cdb44484d6546a7a32fd0b6cf570a815387d48a59dee49dfa9918710edb05861dcbfc96a8a22106df4278fdb84a0482ec26487f1ed8320ade328de839f50855134a63062275c1b93990f15409fd6dd60e956e7fe23ecf69f7bba5aa94144df1387cbf4d4f447ab7f8d8630170f45d21aa19727157e19bb02074595d57b598d05d73c3bf468f1eeae732d2eb262f24a3039219c9c4071a2acc1dc61802bd815e7c03d6ae74417e0379e3a8575c625bf5eb42adfac8e6ca33d8ca386afc14357da0173730de4049af446035a3883a9f10c4efc6548b4200fe742c476945a23dba6d3737c40a0e02aa44ba4fda821c73ade36cc02c6fbf10aac577b7b0263441261379e3a4d782bb177f67dfaf568f92b336772d7707a809a7d3aa875857ce1a89c9ae6adcb0d010d9c01d02fd6b7c38c580c0a927ded4a20e020240118689ef0e228e6a84ab7cb5d88b7058fc2eb9e8f67f77a285c4d341e143515e11e8f9219866dabf30a09e7ba3de1cbbd05b1cee9acbfd825eaa0145988d5a8877abf20c207ef323c0d8a746ae3588589d62519dfd2bc2ebafc9d1175267dc1aa58b10cd085c1f17b730ea6f1142cfd284156671f088cbbe183bb36566e626c3384ff517a1428afaf5a08368b8dc3bb0c05b410f0d5d05b1126196ba6b76361366f7177efdd68257201286fc9477bcf6fa7d24d25afbae46ce3e3f37a5e7b0aa55fd54028dd344a0ae4c890cfd4924193cfc6fae4d0cfb8af38e2878b756c47a2ed26201ef471ae46c73bdc4c312f3e9b8460a2a4ac26162dda25ebfb7d3f09a96097ab71b9537b2e28b4328c94d29b91225eeac3349a1a47d1a10dde2a23857d7d7f9ba6c48169811dc902291ba6bb36f6933e17605cbb4e30a3dd34a15754fa9859d995100482f75db689e9d982e4534d5ea08f66911a7b0c229839ce69c7dfffc2497ff79da209741d4774d03fdb0f2c885ebc6fca90395bdab29888d54d414c8e600a754af666a0ad49cb978eff608104dcc73f4c830e1327736f12d4aca4b8d8523e7f624ba51701ebeaa973100e241d14d05418d929a5d1d801761abf1185690716a2ae681afd6457923f2967c864c70159bd126436a005b197fc9217212d81a91ec80ce075dbe12455e88764ec08ac72f04679fa698fda34caaf60d07b49e49380ddd4441458541ee134214e3a5fff705128987c88d16dc25772fd9cb19612b82109609a47b894d03eb3d2340572e013a245607aeba5e975e73612a44888a88da3e903fbf9895bb3237344ef2aa9d86b82eb9ecf6ef118e43b49658c2771a9d11f229b856b3300fed00dd3fb0de2bf4d7b1dc577712056d17f2d71717ff7a0196528687f540e7fd1f0627a61be6f4a58b8bb3244d39beb808c279cab6c370e2e149165d119124f4d9e0577998e56154516eb075dfdba4242f0a35c3f081c886337734649a04dc9848c42baaa06d712227ec888888c87a1aceab18ba4df215171499224f06cabc2389368bd928842e68c0776b41e0dc3febfa00c20fd2e379f26fff27e68240b301bcb21c9fc129f7249a66f1ccdac22402620163b5e3cba1b90f5802b320cdf687168e48b428861c82f75c3af613ba24e2a540ef1f7182269f524d22d648f5d2b81b3ad5646507e671493b4bb3cac8183dd411db242add2ab32a6e70b69353f32352e86b3bcf131b8b7f41d7d14751249904add705998f284ef3792eb76b5ba22d4d33ee2636a2644fe67d168462ca6388d0324263aafbe3875ac57cde24b7357caaf830f5f837305d8669ac385c0900eea170660b75a4accd6bd7a9fb59ccfd8ed985402ca2e3545f5fe8613582eb3bbb4a914fc51e17f76f1646264b82bdaf148187499df00df8bc182ec06bdfbdee56e8cd754adc5fa7556c426320b22ca1da379f68a0a7c5077e61bade03a29f001406ac6f86d88f165d680c6bf565d33a69309d3d3987f79355eb48811f4153758ce8c2cd030edbc65eba1454f567557be3ab98283699bb3a3bf38c9bba05e31e7700d2bef0456aedacddef05716d4027392325057842793c244a76c8d14e062b0fadeb838a19dbbe83c6bfe4ac5a1691b92e3fa9b9617a210c193672a4be2ce6d74cd35c0f33922c16c3d8aa1e18248c4d9fd1422d8b616bff15a781013f42d0cb3f991073aef4a808a9db34d297804c32cfa4fc04f3ae14c5fa6577ac18a6d8000f09e292eff33f3d0b3239ae334f97119e84112904485328efbe95d69a67ff5c2f659bde1c88be6e6a7ae90facede514732f736763cde4d8b4253a0638b0063703d062957dd154d496c7a7713df14441afae47bb4763947075bc9aaef9df92b69d967ddb073de59d11de21cc44cd8647c600e78096031a216d64e1949295633ebeedf1901cde3f300c49b228c76efc2aadb1dbae929112635aea7633025b55713b4fd1666fd8382e2365037544d22b3d81e0230a0324b0089262404e3effb62bb03c662166688f0aef12283da5db12e67df46b0049a2e1349ea74d859fbd43274f2db6fd76505c86c8ddd8e776fc796abf7841f780449308f65165cc34024b7c33aa75f7797bba077cb1428c495c75f1b91e340a2416c75cff1972ab5fc1b49de2b0f2ea8e0319b6edbe1a56f2e9faeb750a0fbbb5d95fd65a212c7df4b7b9b59e0ff5c081346ecbae9e588e673d0319d76272c3802e515f444d3d5ab4648897487397992f6d26bca4071bbaa677c5cef3a986d629cfa4e05f76e5655852898859e8ecf33aee9d9591824867cd12068031fe9f551dd9d1cf67d604b473d940f9700846fed2b33667b0c510188e11ea53f62e5150b72f9318799b4185d454d882cdceb8bcf9e86b1d6783286bbe83ff40c808ac2a073b61f80c0d72a326815671012c8a6a9a5ed456915bf04450f3fb7f106760a923a68165c5ce921ec8476baafb1dad62642b0d9d1b9e4f5312872a398b168ba568ad918fa4b7daf2ecf64895282dc20e2d151be036d82e8acc2f514a263b92df5a0261a201af7d7b71a2104a7a29f5095a4c0ec6c8bf43c2131d924fe58ca97f53edc4be6d20b777ebb2c64e0829d9c32bdae54b4282573a82e322a5f07b20adef06928a64e141fb4dc40009c48a55f4fc03d2d36906a47a6d2b43a7e70a619198c83211c55c38c742b99492f74897244645f8ab741afc8b671047f4c214ac881f0193df1e1964b4475c2cf668e76a3cbb211aabda17049ff7488120f8f3e5186de8da70bd2574c05276b5b3b2162a8a7d751bd71ff2667565a6e8a5031a5a8f2e7e2d084ad612351f33529affd35926f083440ed4d036744338c7d64766c2f5296590da6fffb6c32e8792fdde0267442769490f856aa7886863585009423fdb21a9769c6c7abf367cca2786b677f4eeceeabdc85c24a84dd336e084d0866bd08513b4addb4ee6824e5bdb3024ceaa083c3788b11f0fcc9a5a0164bb6f6939e96d351e18d0799afbe2f312b5293f2b21cbedd8dafb93b992eb2d47e0f3a6fde963344b4b8b77cf465404058458f21495d952e225d09f25ae716794d2dadd88ab8d3d4651b032e60d297fe89c9049bb552f712e7a8cc0cbae2c4a4b5d061a5e7502699686a5b1dd986a662254752ba91d6884cc68d5871a666def3275d35b3928f32d6e93a56a5a22ec0ea2e1fb8822122d555825424eb2f4a0859b906029e5c37442e174c092acfc6f4829a5239fab290bb24f4ce59a65fd4e80151ffb0817aca794759ed52803987d2fa060e4c9939a179765ab04e8e5d1ed4c0afd3a4cac34d5ab93eb93e0964666a9975b9026bd47bfdb1a3aa0081b989cc81d31c3e3ce0fa35d408f41f8417e2f787c40c29296b8582cb2a5e45e3fcf524fad9397ff9717b72f828e4589de08d50d1b73038d600b0c096f668c862674ea6c10bc068ee2016d093c2248a0c30fb26b5ba5e850d115f98077f61744cc5b4a1888930bfe2b9e30d4cdb096c7a1e31f3f0492e7b5158ac075d3027d04bc07840b56f9e768f95573a3a4afcb9911e4c8893cf4243b4fb8634998e2cb6b9a2c9da0f7d695a0f2c83b119e6dd962ff722275bda7726a85449dc789b4d16b5801f30474b76ff03647e8a2d71dde22b5d33bc74124ddf5e0a2976e8950d6117a5c2561464ae028668962775d890e1bbb49567e482a4c30ef247141456549fcb8d7b9aa23c75e74369367a5d0610c515479460ad39119cc9db96856fc1dde8517105d386157b2f6c23ed5502c2c2a6500df5f3db6267633032d18c0eb706a9e28ab79414e547e20fc482d0c470babad11d2265c160f0acc798ef6993467f5a161911991c25aa705bcf7d73eb50742e6553b24e0df7f6dc11727cdbe5dc9b0fbea24db182f5767ebbf0ff49107f436d0bd2170c8ce8d688ab796584f46d0d5c4703e825b4cdcbba5dd64ce9da831152ed92fdfaaa8abf468dee51dcdc7cdc23e13d0b546a25b609f49dc5af5d0bb12c8b892dbe5408570e4982ef7f69557db83b382f2c314f0b6926d829ce6020a68990e9870995cdb8cd58e8d841d9c552b0cb7cec39ff4db8e714ed40e0fd649feaf46d08c1ca17d40531e8fa2210bfae44e7e02917bb77d7c30529617c72ca3ea573bac6d78d9d094bd8e0fd200a856337aa600d70f2fb3d17079dcc227131c6e7abf42b4cbfc7859382bc9d4d790ad9f62f7be15ceddb28f240beec53cf3c6cd0e058ca4d70dcfc972c6d51420ba84de5d963e06b4fa420e2ff2be12cc2070cf8e72effeb186b318f056f4626d3d1af844c58ae63c622467cdbc482bd3901b1d128a7fd71e2250b122535df514425a402a8291538b3fc7396c81a7eca9863ddccc6303e521292f1d203027b0997e9e623d5c5a472fc450dc02772276cbd5189ec5026bc79493f0c53fb84c6e3c4b18bd974de29d00e1a6a9ab5c0cb24eb112a896e8628bf12b0f17257f6f4e48f9f5178a393e0858f3b5f2e3ed90dac118cc568e5cc68902a46a50d2e3eef41c70105e2ebfe00030c7d259efb46806b77d64be5ef547cd43c4e3c3b64829f8f0eff9675066be247cd744e3f1205333f7789206becc8d924594d2880b1a4c4f5928ac206f90b01a0e842fa7da8f119c7f02303e5f1bb62fc4f91aebc45d5e439df51774b3ecbd299ca5afdba7822f6b30975e786a6e9126273c8d091a14d6ec8a2a634fd6d58132459aa3cb6c71a90e85c9548aafdc9b4dc0936878ebb2faba02ce7ce8128acce570a6390abaa096aafb260e3abb5c02922576a502cae3ac1ba0a390a2a7524858ebb7290455356280809069921de0b2ff8ffbd8f91be0097855911c1f4c6e1b2dc622a5c6c9fc240bcdb96c4174d45622547a8c69ebfb617d43be519b152588c96bdc0024cd820a682de20493928b1d88914f92035316ca40b38a20bffc407f0e24221c633b2f3caee427c701f15cb3eca914d61b57ab567b6585e85a7a5683daa9deb1e6aa4d7aa3c793c2cd620a684644ed430ef101e5fee403d74a29b7a3960e9452041dbcc434f8e6fb000399b6681517500a50bfd3a46cb9013a56894e5750ca58ab03266dfb11d5eb65a82e695acdcdc876a7319d3203b56d5b8eef9075294f50a25b5d23e8351a18475888c3280204401200811c4a41b059d28a7f9984cf87861e50a1105d165fcfb9265acb922d654a49262965b004d304e50457ad1a435974d8f715be47326f86eab2bae0e08e7ee37cef3d6da48bdc060ea6464cd9134877011637746534686ab2475f4b03517cefa96838dffb6de27bef5d39a64deccc24475051b584007195348ac6b53889003bfada9da39e017e1fe1fb9befbda7699affc42a6546697e9acdc6755c82480724175473ce39e79c73eef139e79c1fa99243d9f8a139731c1a7d83ff6ab987d0bd46ca3507b88b2065ce6b57fb39fc799487c6e7209f6f9bcf798d61021a7e172916e33a9691e7babb262a606c9bc4fdb3f177771ab6fd1d6a94fdbd1ed2301afce6f6fe813723fa7b3d8433b8702fcc8714d216850f81f742063e257f5abf0c6778d3fe13866bbeec16d6c2f0d5b740fc913bf98aece44eb26d939d8c61b60fd76f1741cac9388edd13f7f327ac5695371c51f72b013cb226011bcc2255807ce4609358f0d38ceebdf7de6e091d77b59f509d8f9ce126ad6cbe4ca20bf39981a6160cc3300c73804734f861c1c17b61030d9c01b22b1fff835b32c1d8f6b981c7f1c326c98048830e3628801f21b0496a66071aaef4fff05ed850b37d4d4c7e8ca591214296001c3609d905b1851c0be6bdf7de7bef7acb8681de6e273859b25dc84ef81f2a706d9f0278302d892d1c55b0a540e6e35b31fe37e9967cbb2d0602c007e083c1821112922ffc1ce01193153b391208b7bc302d2f8c1d4c120300785fafd8d57aadf01f01b74482206d07163e3dcf34865dd76e0956fd645e61188661188639704b365c4510f3ee65d9771e6f0c29ac42e4acf3d854d6410c4c7b57f86ebd432a7cd73de13512825e231ff03592825c2327cc35d281608d94608cc051232174d4c807df2dd23512a4467e144f40ea62481126816903c8d0430e1924e42384e896c03531e4c32d816b3a04c42d81e1ba23e4815b02d71c2110dc12b81e864408098648704be07a0e71c02d816b396442088590072008a940d3c66dc241bb25704dd3ee89fb01efa924c720c660638001889dd4f581f87b704b4eee3a7852a07bb3da8f74b71f3228db3e27ecbdb785175107dcebb2e373008f58985ed9ea18ceb06578176112b82eca2a1b88d1b19ba5df2d522c16dd13b7ae761f21c2f7286e5810b60fb2420d704b36c04816e96b1345c407f102601383052324758851024d247e0e6e498d15ad61cd8303782402d6fb8e6c135fbb1ab6c95cbbf52c87d0ae892c8b70b049e03a380745dc4d32639031f8901e42c31c6c930f9b04aee5fac336718f5c0429c7225be4c3fbc13d7195311cefc04a8eb58f7c5fa79cfd48976de5c13f5e951d0c31c02315a4281835d430c847f2188657407eed964cb5b17505912f076e8904371a78e79948942081c8edfabbe600675d9491d16f9f8ed16fdd827e6b172b760d03fbf2f2a033d0d2c086260e5df7e484f83174dd9302cc1f699c914622d2280169441a9146a4b100124c76bab8b6ac1030f85b84b6c0898ec0f791c61f2c1a87bc4abfb54b9d4aa350ad6716166741f32b095cf76402a206a34b02d73b0328b7e2559c6ac4754f44da3ed2f861633d827eb9934f71291ec5a1f81377e24dbc491bffeb9ebc284274d7170e60c8577026be44bf3557a24d86203f86330cbbfe85299ec491f81137e245f45bbb9c880f71211e44ffa15b0bffff10feffffff0fbf07e8d82246a3d13d71395e841a2003584e39432cd4d9d64f0c9c16a6192589d95423479b74826e8a8b9154e78636093efe6c65ef879ba90235da0a2ad15e474eeaecc51320979c9f1d58b4ef8c076acd88cf632a7d91e0ef253f8d3abf277e4ff4999b7ba7f6d9b903545bb5721b6ea1c0d6809b360aebf4262616400b975c0dce39e783317e3e6bdedde7f59086c1360d556b44ddec587332c543b34fedbdf75bce9f431ba31cf823bd5163ae86580a85d0698999738f12f411cbb975e4bd87d2f1a859ddc99e3b2ab6a2ea45a3135eb690a34e28e618c52f49bb2ee86ed2767c6ea8384bf162939685f104c32a395bc5c84ab4912e1a516e686113b9ee616fca9db383d0b931c184b444430305045340322f25d662d4a436947b274d38beb1f5ee91e10ac702dce2aac86da775da8e40191c255b544f075eb8200a0ae6871354a634acdd5393f7de0fd3a846d0485d97a8c78db4a92f629eeebd07b191b2e06519f7ea1dd5533ca59ca19f1971c11452787b37a258e93e5221e49c73ce39e79c730d547d5989b8d134a69644d3a75305f5fa3b46c988b751bdd1306cb9f8f4bd77ef91ffd85fe3f88aab103155d808851052acd6278c73c707e76f7a441a3f984b07184e95d55b180c4016324eec2206b861e5e1445ba2da1233fc58987bcd33b3ae190f1e22d1170dc7d0dee0c26793a4a415613372f7f7971dea623a5b02e97a720c791dc17009275595c4130da609e85864f14ee81de549bbf63ea45e3110846a792e56094a7ac0605711322a4afedea74531bff7fef67a20b2a250f139e7bdf7de374d6c66f5f0de7befed949bc4e5b2ecedac50bb16df7b5f8f54100fe3383ede29b9bc99549eac53a923ce39e742cca11c819d3fbaa39ec02ce51169c4528ad53ee75e2f98a0d8dc62d6943bc86866d1e4d15b0c6defcad056ccb4b9663c3c3bc9379f1b2180805e233f6b5b510d9e8b1f0b27b8154332da20a5fde303bf29335ab4b0ea0d91938cd2988b97d2ccc85e0686530bac9a2baacddc1d64b61be8419a7e91c928e155a5a9f352ac100f2cf92cadf5a198426d1fb8034b721ac326389d31b57bdca35f13ea8725e7c9556b79f646de3fe79cf3362d4ce26ee5363e3ac52d0993b81f69fcbdd74399af2f5f70efbdf7d2a719afe32b77e50e266ad5e44365c4df7bef1cbff7de7b8adf558e7346f4fe2703a4839df5f731dfb4f472b6648e48e3af914298370780cf5398bd5cfbecba58a4b68aaadbb23a47fddc9d6e317dfd0e2b1d0d57bab454167a9f732a56f2735ed39c53c3969f73ce8bf18c7b8cb12dd29ed738e1839c43ac9333083de1f1ae506563d7e7fd7d5f0fe90d6cc48eaca04d68583466d05a5f51579296073a3406abb8dc8865b76339447549eb4b1da012958b9d18df5b77e038f60edd9d5dda3a122e475a4329816d51a13597b9b4a3d41797c2a6a05d00db46983df15c945d783b639121e385ee284a4e488dda2b6e147bc509b53dab5b18de540073332e245ee4a84e527541aa945ff02fa32a967a0ecc0c63736a789c1bfe4dfaa12d1f1d084814791527986dd0fee1d3286b078a8c331943b72d5ba72c2d7ae5c20bad668e6887eb8cc7044cd5cc131d9d89164f781f8de1fade7b4f7326874b21c365efbd9779080d8fc4ce19eae425fc308d270e5da26d97cd08aa2ec6ce4e588db10b60b48d1d796163dcb486d3afaf0939751ce7bdafbdf772ede7da17bdf7defb153323cee7103944a68d668a267644bff7ceed9e78491d5d8a678d00b6827bfe26bc140955984ece839bab2c398532fc4a55b24863c5701001393498fd0e93f0de7b1f0f6379d8e701cd7a597decde7bef432c0f64d2a560a17c9a7136b192d1389aac72d0e09a62eea40142ab30757f4f6733422e9c22fc81d5200541bda0d458a6e3388ee3f885b7361ea56cd6a29c2959f6cbbc722167fcd6dcdaaad6e9f15c7500758a116246da0ccd899aa096704fe3e390726f3e6d271e89983c8768780c6ad633dec909c0a427e591900b0408cdb92071534de12785538a9e81db837bc0bbf8b700a896c60fd3cfdb8ab4351b412d6f29ae76882ed851f738c7d6bb0eca8dd57b4ff46e411575336c423b1bad794e53300ed3de310ed65cefacdb81c6b9e9a564481f189388b5a1ade8069052c038f9a46a4ad009d4ae1a418f2d26148277c7ad337a204d722072c6d03dffa8a423f6d78f0408482fac80652662f6b616e79c7b1073ceb30d91736b0b96cff9998c5ccc0f5314892a4e8f5f94f5ac050c98a70f8d13abf5b60cf4c3c3c6e0caf33292e6bc9115c1d8594b2f8a14dfd4b8e6e79cd87befbda75869e5586a14a277ec8c9aaf48f71a63109c88e439acce140fcd0fb6a0921e2c6d7073c58377faa660387d484dd41ce29e5d5920159a0c130bc4792dd26d320063f4d0d9b979aef5bdc8cf5294930e8c08e818226944518a3e2f9a04d0f94059a5cc177f531a7b5a2309448c0d144326f658b6417dcb18349dab9e57d293d24c9dfb7eb3804afb825120a2f7134c655178c9942daca05c4159802484f68e9e9472491bb32ba0e28ae52ed2c62f2dd20ef97c5f0f697806878daf9ed4cce4c14a0e9413bd83bcbd2a61da3c6d0ce1a8a52dd248203d420a316a5c2962285586785d44987ac600f369cb5a9b4e3da34f3e5a5501048f0aa112796241352c56b2ecbdf7dedf3137894b24dc796d1c55596fd120bd24599819cc8d3919541657296ce8dd90f39a20ec2aefbb1552efbda76c357bef9dc3f1c9284be6ccb987dca12a49a73895f14fe79cf839e79cb30d65332da09f3f2d8ab7173da60eb9b50a38352cfeca9a2566b85171ce39e79c1fa39e43b9026bd71033ba2cea338aab2c4a338fb3610398b4a5ba6c27e7c49e12205aa4eeb65e404b58191044386d805b2d5c5497a96756d0888ff00b06e6c1e9496ad9818615a06caccf48ed25284bcacc72ea9b55eafb7aa48221bd32c37b8f2285a291c2cadbb34821f94671bedea44a96d9fcf23b4566c9a533311e3c8455e5065ff3c63f402c2e6b7b3581b3c207fec4c072c22d916e1e14591025013815645929b1161b209c6d220097777b445c81d3c09819ca232d7938ae3d594f1961b530c57cb146ef0ad8b3d9e4871df3c74f9601de1fa337c785107e72bc0d57aeb4fe58959c39e79cd3b5f7defbb8ed314ea663772a42f643acf59db1b60c335086983391d48184326ac2060f04f455ce39779b672f0fec14c67358e31e9749ce37e7fced2a227872c3da83e2da82110624b41362ea042095ac2582fd441dabe961ae8a924fc2d35658979cdbf629b0edf7c011765d7765726667394ebdf7de7bef50e79ce7342e17604a48537c417a39bff7aa9ecfef0ed07ac2d1c3a923abd1b48f5230b1fbc3071386fd49b2f2aa4641ab5adf67f83e6f4b5545f34bc2896946d73c533c343b83273cea3ee57eb525ce9e4b1e762fded1a3f042b9f849af5d70637b4550d0ca734394b14e1f80a1909a2ebf1771149d39c3ec02f2d5c7543eb4de7bef5de8b9495c79069d62e3da82637740b2567f72e60e49cb5e0502fbe8d064dd473c66dedd8c147beffd947693b8b2d0cfd9ab4e23a1f7c20e0f4b6b0711563118783f375b39c1231031335acb3abd24a9991ae71df6a095b442af43b6d8aa05a33aaf70f179cee1ab7b88ed489953f6ee21437e5bf2b76d500397dd175b0f2ff89230ca25d36be0caa12ccbb24c75e1d2a5d9222c07d75de9dc5c6d68e1c039a0fd934bea2bdb361dbdb75e4978ec341b6fcf0b085c1e586e109b0f14a6222df3e0a662d3f3db37ad02f02ae5b9d7c6de7b17ba82495ca9ec458f19d3ea1823dfaf08c961f8de6ba01635e5ce3917a1e19178c5a863402336f506164796c7226feee9b953c70444dae9483ff34643b2d6fc05e79cab449b439973ce7d8a5a4e3e43411190095befbd57d3e60ed518f4a661bde0f18a8d87684aebb46635642795e3784af18181a4a75c20754a6ac63ee3dce382b4095ebeed1b9615c7aa62c9eb9af6bb152ba777a6340404a506156736a3f7a09d54938b32d59cfbc14382e28da9e85659442b7444348c088c86d5cece2b43ce0e63a83251c16b47f33829a0f0b0e5a008720e62333fb52acf2ded875acf18debc094631c156a4c1662507ce92fb2190f1c8226b412c8e8f4f04092da91611effba49c8f4b8ca934ed76d134c6ab7b11d2bcf7f046402cb6984e9817232a40b97a35a2a34e6be964a29af6e29574812f4a43865ddbaa267589b8e2fc3c3d6d58cdd9c5bb4c580733bc49139a836a8165f17ae000be31a6a66b131ecd91ac4551fae324e418db15a0de24f5d830418535576c1d79dd28cbe3d863263c00ef926f2454d4c41d201030069e4b17975975cf8503c26e41cbdb00b0f0c4bd6e2b3096de872957ae03b0610713c8d61342e76abdf07915fa92a4037cbbda581ba8d38d134022de40d8e848c97883abc1dca25ef766aa58928218df5266e5789e1204d37beff5b08f4cd9a8f0a249851c9f30b08d333aa9bb169a3c6b566c8d02e08a2b46ac4ccc472aeada8f80d9b0cd93553df9fc3c983265f3f2d93313cc2c8300567014c02cbdf7de7b57cef3dcc3ec718126cf5459dbb0622009b9746356adcd8b155411471e4b7bae7e87c53ad961bcb6e5de1a350149f209ee5df360d50e3b96569020e91b55c453b6305b22ce39e79cbb292ccfbee9dd8d3519ac14d16cc580b317e7544b96881e3798c80c19616a28e8fe98185c615aa0d7258b17cbd950caf2f6b1bfa85a33025bf8f950403a5393d3838566bd7ebab4dc28809d473be8492884bd9f6bb8ed28b86df6a694e0f3e0436c6ddc0eb8a2ddec77ad3a571c60993f5f6c69d68c5c8d23e1bdef5dade38b0d1eca36330a60b3731518ce21dffa2a311bbbde07b7dcb1b0f774afda6c440f34da21e71d8689ddec4683fe41cd69c2ea8639522dd3cd2a505b21a64d41ce1962355a4833d0a5ab2732b32b2939a9bc08bbabc351651d2488bce68ef2ceee56448015f563a2c5a905569bfac03697d2eed320a58e7db252ceb3fcfcbd1e9a88d992428f8e66028c8cbc6ac8a668d4a04a353a540b30e408e8a76f868e2c6c6f71be617b07e7c82851cb689576f650c1d67bb02769df64071918ba0b16d2deba85bb2af3c5fd5bd15a77c7f726995c51d5f04b702546564785925b53f3eba9a84ecbebfab3b42367ad790879a5ad296fa5a3963936748d3d3a55efbdf76a149cb2dc529ca7073f9e60eb7df8aa6ca701919ea8b48c38e6194360da000000b3180000030018c5912c4e34b9ec0114800620caa0c094403c168c45c37020100084418190181806000000100006822088a78838c4f5c60acd1301250a43bc1ad85ed64131715b0d999a1a5759224299a31c443d5685c06ae47e79089ea6f42f2b18d9cd7b88e3548c8048bdc68eb9e9828391c1b0599d64c0c07da1f21e3e0f1879597a857d91e7a21d9b001cb4ec41666a211b767e5817dfa2ac5aaa1240df4ed97943d92e1dffb819324854fcbaf808e2adbdda524e12f7d6913192ad0df0017a6a421e5fcfb42f6a4a876c03cf490dd50adec10eb7aabc543be9eb6443d4fa1716104c1d7302a7b3c349ea4e02c644f18300ae5b67b0afb0ba56c80d553c07bbcead28c02bc33eb7c6c4829ec6284d5c947ffe9217291e5c89040824df8937e39875f9fd798e5571556749788364c8624750026650b670e06040268c79256157523f075fedc201e3312fa14ed561cd31ee4fa550a0692c5eddb16d3add875097c5ab5c47d4d38885a9f816d33c19963e3f23b3d6d4e0952f89ee1235d15c91dfee3e1c7aa9ec6556c3450452d3d783f0523cf4e6ea389dd658c46e04ed84c8ee0b7435dd729e84e901a8736e3b240496bc3810832d5bf13f69a90fbcd7448769df23fbf56d8009801c8fb51bde25c8d867078549b24fc2847038d616a9d1b15643e377274c66c6f301002f714cb29e08ddb634ed4680d7ea2bdc2c5dd422f2f3c42557d4e125b9f7ef436df72eaed57510d1147e58c9759e448ee88fcdaf2377f7215051c8376c4dd0b09cfd53f005f37d87345078255d4bd39b742d235ae9685b6baf3f4aa0f64c65cabd122c0c83653d10709d04f390454e248718e60ad8d7195ef4ddefe7c70e0330792b967df4f358a3c27fe7cb5bb3c950a330c896eadf59c7b349acce2bede82ee72780cdfa8a35a6368aa94131f5885fe375c64ac55a1430da10f4001b3c2d1773d3b1cc0623cb4b7691ccf66fb2ae0abad2ac7886350594ab429c3296f3a6e8be17e1058e8489c0c9c27aa3df97902e68a1b7046b96e522c8c02c949f5749c2a659a5d4f03840ba4b39801ee6a6955d443350a4c92ca0a0daa6376205a865fe0f2528f213058a194df7b05d028440b36c25090bcbca6494465e30a8b82cb372f7948f93b9130795804862e3d866bdc41f86ace7b884f5baf5cc91a75eef00dc2fc51bcbd024f2ff316bf550b02b07999b31f2dd82e92f0e2759730a39160cf4832f96b99174a339610dd580fb311a199e9dd29813f182b92becf2f589ce55627c079eac5384838f969658fc9647f2ecfe5b8d2e84b1a6bbf4c1998908089b9c3362fc0992f8c17610217cb11c8dcd8b5b1d2f56c2ca621c64d92ac8488d5c938c63933b84eab32d9f008e06481052da75780a14e068330f450ea3056568a211e52297533053c2131b1d80537412ffb87d17dc9618ab2c140c0c18f8d4f56b94a2230744180b9612f24ad9d0df605ecf789f9deedbbb3b07b3123235f44015ff06f378a3ecc0797a3a0925c8839fdcf6373b9da2321621b718d19704a8f5e6fdbe019ab96179a9b51fb7d4235b6a90643b1d2140a21e58cc908d19deda4efd6b7eb22f70c2c9b4b83cc5021895969aaa04aeeb864d9592f906ecfcbe9acd9663d5acb6f8a4fb36ba88f902450299b103ba9cfc4a721b4342b8229297d9bed837ca3916d18fd1f3367459842e133030008bdd01ccb21db3dbe63911ccb35f14aeb20e10e3a98f5e77b27e44b7129e2e0ed5113587f333b01daa19e300e836537151d0e1b5e49d0a4ccb3dc98c630438f08b9365b73b8d7f487cf1d0c0f50848ff46dc931a3abe77613ba2980b77536cff04d67c62e6b17dbff09a1de9f4ebd5fbb1e5a27a81ce93a5603eea61e05a33376524ee0fc7de32b22ba8644a372a87437fe053b8d3c7e7a4fd56e3045954c52258d39e71b98ab25f22f8a50f1fba47910781e2b342a1426edb8061b57f2adacda876d6fc253630d3453302c269d417f489cb91b1e782abf29deabefbf32ebe1da9fbf90ff0cf694e75fce83d0d64d0ce0acd6905fe4f4e79f3311309e43a00c758cfccc9354201fc3a60afcb3d81c7a0210e410df4006ac7b898b60faea62a96e602def71a37aa214945e1bc5f8a326ed9c17a253d65dee3e8b1c9391407b38e81c88575fb71070a01134b2c72b94c2eb20e6cbcd9a66143c5e3fdf0a5855100bd4accabd14e0c3152abe3cf745e665ec57bb37628377311336a184d82f9b4fa7236102addd90dde097038760de283648d6332806ed65490202e24a802a718fa3d6e39cdba0fdf4a8ab26d35917fa4a59d92ba1c6e7e904d3f7b6407baddc9936b1694bcad16d7525ab9f46684fc250ec952c140d67591e459601b95229a85064ca4c1be2d96ec0641950f78df36cdd01cf0d5b08232184f1ce3632fa1b8558790992bf2037280a41f677045bc29665297cc6d7a35cc1fa929d31718279707532c518511c50bdc8bf4b78530d421acc194df3769d9429bf790cfe6a8c165569edc88d65368c0866616f8cf3cf710f947128bcd8e72a52a23438cf2baee3d02e2e3454118ef51db662550f7e7ce2b078ec012c3eda4c8a926bb04ea0cf2f3f3733cfce960cc5e2787042b19ced39f86a4cf6c939dd7db833c2a5fa7e55f7b113e34e2080a384a2802987f6794fa2104b5d7e311456f687e4c6ab7a6d7f939dc541bc48abad4158d588a6cab55a0b5f920c18a1e77e79d086599f9358b28c9a04931b9f901e976821a686889bf4999cdff5e82c5a55830165a37274f329438e101bf7392a00a4c7ff99aa4dedb8473929385f2321cb8ff4f78b4b24eba86795b406981d7203d61b3992c3a4932290105e3a658dde612aeb9abe138eb86b477c01335a542f3bb21e5357a64a37b802071805eaddcb35759b69ccf1dbb70e5feba1cfb5fbd5293f9d12a719defd1c9948d3177fcfa32c73c6d3114eccddf7ca3585c9f03ea0ec49c0aa66a6e8f1e2e504ed605338f2cb90c29feb13530da7fcf9955427ef3d98dadeec46fa40ed418023009a2fada18235eba3f9c445332144274beb9b2e8e0e5b982bafc3862304df329e56c88b219a7045ecdb762736f34a9525300dfcde69bf716a08687861d63cf48bc632b71d6e838f014165efd2209fb19dbfd183b3774c863f6e9f68d65909053e44cfdc900df5aa331181456dcf7372c720f7d6d3f83fbc5e8cc119ed7bf115a2b90b092cb22937ded5c600a716382b0144ba52b9986178d8caac830f178e1af23492f0f606307fddfd353580988a692bba72c8a51ac991329920aabc3e2e6f55c46ca78fe2c265d42a3b883a323bf458514c7da115e2f8470389426b69bbf5170d6b45e31a121023f31057cad989816d0070b5a919b7c4cdfa7456e9be50b68694b1636d1417068c828b8c77aa3b95d5895c859813ff3858bf4348dcf8afd133579623b3b4c9b6ff9b2f5da44e7908fc4e79de2308aea9477653d76603a928f1a57aea61a4fa28477c622bc91a61633a7f7274290736cd9cb3e905324fd823b286f5d13ae52aa290a1e5ee4f5d7ec26b78bb87db2f003fd087fe2a420981c81b07e4c848b1432386cf6ddb1acbd951c4310daa833633302af68f9d3af4ea3f64badf65dac4cdbb14e1bca4d6af8ca752c789a555a19d6460fb95fc11449f96d3313480c8c65d3d9425af2c1ce99f1f4a7083220518b4dce51f84b512d45c7893225000b34ba7c06c45c5b8424dceb47ecc9620d6f4cf056a32221afefc8c5a35f6f2656346b968c84fd0b138b2057a474ae7236334169b32a31460c822399b93662fa809594a00ee35ae7f484b2645c13d5d700d50a9217bc9d1806643e862d85918d3f3de599e0c9ed010b2d5e6d324f0df81622a3b83eabac6602530cbd4617af47995c10066ce6a04ec131ff5d798ba761393fdcf10c09b5186a12675332a1a04e6bdef8a715cec1b5ef585277db8609a26b8286366b7bb09a4b71945224f4235f570e4525354acd59163d9b22075f5200cfa6f563d46386d3e0d0014d0332e1a3b121219e8ba163e0fe198711d2cf74e09ece57fcc7820f9cba11ccb20469162b94705960fc4564fc9c9ff13639b331603d7e7f183b4ad48e40923f99aba84c3e622b5872eef04c40398db4e87892f22f5f0f38a38ca655297d2c0033231b06f11bec2864501071001b8068a790747b84620507d08e0248d0fc7b9c96f914120c7cd92de55d59994f36c1f7a345d8587b2228e14d0f2f82f695a6fc6edc482daa891349cc22e0a8e2479de842dbc4635ca5112238e3d74741b5eb22073f55ddd30ad2631822c6019665e15055c03ee4a75123b17dbb34ab3f3e68e23ba6d78d9978727d3a27efddf0c6794a55f5ed74b82d5e341c5071bbd4f37be2a83bb11f46b19bf492ea71b51522b8f8f222de83f33a06c1b1f9c91c2e8f15b4a7e806068a2bd436666d06d3933dd037822ce93caa6316da8641eb829ec099f78698756440eeca4515cfcf24528c84b80d22f1865ecd932237b3e2a98c45953516ddf7e2e822ac882f5a451f7541399965e31b7e52fb98467825d9c4a03f249285a3754543bc4b4ed34174d20f48b2f28064abd68a1c9aafa2b02a29c30889f763236a2fb074945cafa2c4f5502c024e2079180e7d0b460c16cca98015155daca2fd43a0de01988450312f23b4a711050b9939e7f2e815c880864bbc8c26576c01cd992b2c9d32e1b70c25aa76ae71e427de69ab02c3410072c74ff4c72a66daf499a174d4511ace44fbb2355e5129d0b26ac647739686161c239db40bd1cff98acfea42af376faea51264626a2ffbcf66c2604691a5357f09fe1f15afab9d55960a99c6786c3f1b0b7194a8cf533d27332f517e9090067f84f6bc37ec1e60354df0cd4d2c28d55380577314c2bb76302afc88329d2ec8971db79cbf291b69e16f1295e68361a7149c9410983f95381f2672e897ada5bffbebb001e6182d0d63939b3adabbeb169586f1dc49495a25f11039a803192040fd5fc03aa95df1d4677eacb9fe0c1d4b3d2d4b77249515b342d2b06b742e5405ac864127d9e1ec7b986858596112b9aa9e21ebc692f17e57be7fcb1ee3fd3a16a3f36e3e679183140efa80b168647f7bbf6f3b39c96ff6adcd4144ced58198da0d6820823a0e667a6ec4f4d963e6d187640a011c24508d24d3b0f23a752d303b4b49cc9c12fede5110f9174edca78e0cdb89a2b08877463da16762c8c432164f1f708c532b0f0a184b29b8e2b214bd71a4996c5b3294917c094dad125707d721a06266357c563621fe4abaf2462342b5012c30da1544dbd9d50daadf4b97532f2a8f0f1f40eacb9121af72c4c8cf39fcb105d22898a3ae5e45ca29f547912c3511c94fb44c5218902bbbf00e27a0d684ef8c209f8aac90a67c26c1c14d3389cb8b5bbc15a928279041b4c7f563b2554a71dcf1e805b6c76da52905c29296b164692e19b6b80d3856a4d3721f86a7d8eb703c71eee413751a638a3a0d2eaaeb6f466f6a7e8e01141a56388bf7731447a13559b31034d13242897b52a77a1e326306a837df87cec419d892f2bc6548d8ac2ca3d5b46e254a322ea8a6bc4884291a43947e4bca5df9e988f62f99d225ed4122537eadd1e1f03180819a05a99d920a02405c84e6329aa19fe206879adf91c09110e9e65d9b90350205e7062a9aeb29a69f1e63a0be5c5f1df7b9f8aac9ca881fa3592398b3d122d4797c41f98a0c6c763f0d4524778f51405e8c2c1a13b4276fb808a710c7b3cffaf103bd096b1ac73881a9b568096e13e1c1aa1c17123ac88ff30b41787785753f92630d9b30294deeebf644d3f29209991328ce81c728996d5621bd035e8740fc9543b0d9d372ddba5fe3dc3b7e5c806dd94328975db5526b95f947b24e5c2a4701bd48eef8d451943853cbb00ea3c0c9c1950480725f360685379f4943ada65b211ea0206afaf76b856287ace74251053eefdc0e286e363aaeb6579980508fd1f8272f299261f1baa452a15ad55add9e1075f4ec01c0492905423d7fa322e87e22724bd1e7c497c88e8aec277e89e38b77e47ae9698ba5a8d44eaca1633d1338ab9a864294587cea9be830bb11f89638223d7111785e000480b97724064f2fd5854b6d18d167ffa8242ccf0fb150f4b9a44175f95bf76734e2d8b81539ac177357f1ebfe72db349579d4f2aa4c4a3f2f6a1acd53bcbc156899792271b6c336929c01b2ef13a00069857bf83e293db15c4934f7bb98c07e02692b91fcc1456943a7e80796cd17bc1b4a18fc109058f04112a80e0df6040fa024cc626c90f43f67f75b90a21f278e2be846d3ff3176288ae8a12f1556ca110c6a822f6be86193ec53732cdfafeeef2408c2d7989617a3a08827ef96baf75b303872b26a78feee79ee70230dc24f976c481aea0d6a700b33a05225353b9aaa1a35bb0eb4ad4acbd54494d966c15b9cd3526dfae0ba5b097936e82923db9168af403a587cd91f51d2b68798b76fec618f70ce99dc0220f4b1f70642d27fa43da5a071cf0e3997140a9b88a6861579b2d716e328f98a00dc379a405b33d0881b29ed48c280ca01d3e072276a6ad298c69e602f19468965b92ca7d4368eb4eeb18e1f6763f7c254d630ac74ac6cec7b66a647110a4cf97f447c9f312dfbc8d71d3c8c4532cc188e9dfe88b01f28aac70ecacf02a53dab352a585d48c906902283d6435b83abb341cb5ade3810111aab9ca0ba89dc910f8715ebdf0aae8bbf696e57931077bc5d96dc283031a688a3a26716c7bf3a52fa06c603d022231c614f42199e17c464ffccbcbdb5d944d997b4ee6c62ad10bb9008dc2c5060eac57782d2619138a926e6c9671b7c013be227ea331e4925130a144f856b03cd6d40658f19bffc3395ca9c2dd688d0458b908a733cc609c9601a0927863e7f10a6c07dae11a828fb52d29b809ce67838ee5f50ac0f89c1f1e9bc19ffc30035fbe7747aa05f4cbf06b32c8434d225b4c33acf45633285ce388e0229cbbb7cad2cc03333434cf315d9bfa2d3bb5c8d99532f895e6e591c187117a5c4a950e3922563919fad8843a5a000f6b89e70a57c1f15c6ba78b0469c2076e685826847bc5015f40a0877392c9272115de16fb2fd89be8b88f0b5899ff8b4240ab6d73b9cd0e2fe810e680d533ac7541bf8d4f2c283c9663dbb5c2c74754c07f9f30d774ad10abd7e34f8045956aba14fdbc85a67a8a058a28a4a017185fcb97c6ce0f26dbfbb889405c925d59d4fcfc55104a65bb24fcf8cdef4cb75932387259c852de1a29efdb0f8646c450b017b35e66709cfe2219a73fcb9f54daff665ea720397ac182b577f33add929d75de41281c56547bd427449a09999e7c6376f5dd2276639fb4cc41b3a23ad521c16727477748604d06e56c08d4a9369f9a3941578807f5bfb17e80a054137db124a8e98e31ef9b18f1f2ab1921cb3eeb650aaaaa64b639e2e9c555f52eb237b8a335394c13efcdda6150bb5a26cbc74dca01197524d5a2d461432ca898451ac8d9a675c5dc00bd82d951e8a4a64749769eb971dcb0e9e7f1c6a8b04416878ffd73a3ee7f50a4f1b46639eb32930538c9e88625125aa15447c3c8b9a6c838e11c0dc8870db8a11ae1f7c64436f0ee1dbd35a5b0fc8866920dda713721034c77b075e41ddc2319bc1db025084ca638ef06f3f692657e9498bfc21c29ec5e77f7760631b99c7a4e4ed8ef97f3cefa5565ef499ed93100110dff7bc9a9eb9f359ce255c62e9d1f48015d38db08cb4cac532897d51453c97e66e1ded88ec0c2e7c8573d2086d0989daac7ec08adcf505719128bb42f0e89715b08f86be0d4e143a7a4fea83207ff9c69f57b2cbc4c77814ca0c18bddf34fc68261caab714103868355d69aeeb561263575ef73685d443760860a4c4c43559f98993e9d388c96ac914e055b09dcdd2cd110fa4b29b2cf2179d831793e37b22ba1c9770e672b9338a14182d2c7309f630655653eb2e7d226783b4665b913d3542659268ced1c4db68928cd1d3b3c11094c23cae00053f7ea8f99938ee96c181640d3ad6827c652b244893127ddaca96e4fbe1dea68a24198db75aed33f5d34b49575bbb289b980f5deaa0941ce8dd3bc30b6cec0968653cf28d5eb61524c857e6b936757cf4128d40186565bb9bfe3c4d39f1ba0f6077325c3642013b7c10314c88524857fb3e1f8df306a83a9514b72592ac58f5494586826cdc652adaa17ad29a5e8405d84fc1e9ec3d5cd3b2e9329d885216190a8c59f7f8be43347ec50f9af8e1c9476ee2e8a471b7abe8b1a8e923110fd7da67ad3083e622e5a776e098ea04c7b9fdb2a066203e691785c59acda15fd30bf9d4b9b13c634b1e1f09139e4796268e56547a2af654a0c6b3b4f94494757ed72003f813a158a4af59b858630ac13f9731744781bc7019e9f139de9e684a3b6a8c75f7d804248812b9c15371f92b2c1151fb8c03363c2070eb5cf99fd033498a9ef22ff349460f62833bf967cba64432cccfc09192423c379329a1c0c56c6768f828b9cc6db10570fc580f41e77aec6a05061f257cf1fab7987933eb841382b4848efa2b5ad18e63da6099ec4f3a87838dffdf1141627e054414d5ed80d1d0a7c7fd449b8bd1b1485c74c292222c9ae122deb5db958574517cc0471c45d9ded8d383531271ffa66ee679d2b9aa002aace2cd0dcad2152521cd971fbeba9e5589ea6cb4d5e82441f20e2d3e66ced2540504d39101464e4900f475af90a6f821e746cf7660c78464a408b507bcee0640e324529d02a8866a55d0161328ba81ada389ff5e41b244e974e4883b1eaf2b53b1c905d3c8c476280769acac36a72a4178eb9f8d9fcbebac6e1d1933190e821029cb20c3e14a0479a8b5cdc92f3bbed29cc7567b7342ab76e9a40f5d1d1884563d538b678350491357cd617ae16fc45b09d6b038472fc4e6acc0020405825a9133af04d07632a9402ad7e80716d96a8865da909157c07f6d00a67ca6c9f7af151644e43666b2419b1cbafd5ea6e516747da59bc0d6274326b1691d921779c6266ec89d2198e3b498ce9fb58bb6eb1335f6cb58ccca628675ee2ad6592a7fb4b0c63dac22fd53080eca5175a528ed7fe268072efd9f323e2f06e52088787bf18b3d735aeebb03dd29c400bd57be604b4dc071e14e81c8806b1a75069019791a56951be189d3a7411ea5699c32ae4312607dcccb189ba71bfb35424f1bab6364c4bb543537a80290412766e22a03dbbaa43e29800c0c26ccf458f307811747df8d2903bb8b8c6c2bd293ace08661ce3d6a36d669015cc1456ad95ac930fdf20c65011f2b73a51aa3501094a625d528f7b1ae0c5f0944a1c9e847797e3319563cdfc20c9e853d04616580a1e318142e955d59313b4bd149d8fceb85d846c956952d3d7a9d8a64fc0704297c7c01cc506a0c59fff4133247858f9f2cc20c338f1df1112f916b8e2da12c8069a38837ef561d627c3b239f7c71721af5d8acde8f4cc794e10ad332ac63046a689a2c035d76dfb8cea5d48d1a1b2942972941e8db279d1a73b3d422e9ec7cd451b38d1bed4206292ef3ac8bc520651d14a4debbccf992c5ec0c3eb90b822edf640c46a9d686a43c0cb811a6d94b97e156402dd0e550672cc0a8e57039481cfa32849121138f6a90f0d1d8881e2e37de87b6062307a908579f41afaa4f2a42123ab133f472860455a08c502dfc9599df6669cc115752778374d4e63ff53fe7ac4ba549cf78978e9abbbb6107a0b3eb2898156848ec554a7b5c17428f36c90c4bda149c2e0603c3f9e8a1a03e1077632d1dad6a771adc1aad8a492796e02163da460e8cba51af575b01a31ea198132337521bc918320a8d8666f4915ea633cc0fc79dc5b1996ad59c76e270fc269f848a85e9713818f452c7caf385ee67fad17fe48dd4e0e25997b9812b5c3e3f7f6c3141d4a572f37847a345dd86bd367ca6d7254e8b6e66295f03db85481b2e1ebe9e5d48cfa4166b5a32bce2780901396fe43898e75213ec441940e089c8d28e44cb4ce103cc3d86b2d12c19dff85d64c3e8e957a0d6dd3c2942806362569bdaa77ebaf31c92a478af33cdc5e656db284a37d3c5e68f19107ea34ae72f47dff3ce698ba538599fb8852488e792678a273c83c18b921b2be294c70e527430b1019fe14a3eb1676ae83b05fc738687122d614f79351ba3380f5c29654710bd664030b6cacd13393d1572c0407e8c3c42a0a7a2ae272f0cc820b00fcb5609ef185b194cd22695d2953c0bf12dd8ce18fa469e906204660c4912166e666b6e22acc0bd0dabf14e670ca6ebeca481cd86a749de45645744e19dcdcec5be96655b9a42c39de84dba9036fc1c174751a98e68a7bcc92f1a7439df71e2e045e4103f3a2256b7753045f8c991253365989cf4984e6954d62c9174ce0ad444965321b66c654135440c1b2f0e3d807f003b2282cab63a9190e3c8f53f792e6043ac9dc5c1fec3915495473e3ccf9a356276622433e2c5f3ad79d22309acee05adec447d28c07ae2d5c49f71a7baf657535941b8780de3c1a42fb677c8168a699b1a66a8ba5fab99392e8a0fefddcc07fbd32df105bd897c3c58011d7bfed2a19266a79b7fbc64f7121092949a208d5af14699a7ec2dbc8aaefbeda2cdeee1ad220f0ecb41d7bd0571d6ce3de2cd0ede63a00071106dda976babd76878b6755eef5f7a1084f4ef3c61d1821d44b4bda9ea71a8e7b45e088eb3f6867ec3803bddb6813fa3d8ed177a9fcda807374468e117f0bd58621e8e6afc4595343fb28fbe67f59f22ff07c5906a2f16eb756beb57abaddc8a0f34f0437f63d6555af147720e25a6048c1282996086ee6d0ba73fa651634aa221509095152b2b6b85738f6ff4e73b10744740673e36a718c98a2271eea2411384e8d1f6f05523395bde5fb48f712cadbd2f6870bc73aa2278ea089e8b6c28a60f80a0fd61dc16dbe642b1efa466e7c716c17b583fc9191ce39f29a4c9a6c033860327fa6aafc3b2927be29bb62aea001e936edc2ab935c78ccca26e01fd899f637322b8a28541c9fcb0d4cadaaaa505eb45b51175f7c022041a5688424f61835d76473223c2e4f68063b503394edc2f1582d64a386544b7dee917c2bb2fce4b2bdf5f35c39cc8551243920d4ee8dec12332403bb7fee1cefc3054da9d6b74c0c1fdbcdd2f0c0532eb380c7157d1f976587eb94cf6d8f573d6fab78bd85ab0fe68139e957267ab4c0c856cc0f163624c4db462c2c8566eccc707f4cbb5082ab80a2f99f0a5c6db1ae564bd754f3b09aa24519e4426e2e13c97d0abb20a56f13afb1b00f1fb0992c687490952cf41898a0a153d9423bc09181a1cfd8bf08da32b843cc8b71c7ff8641de52b56d6ac637532f101ee7aa2794bd605b0f6a798c9b31d6ad57336ba184364799ab5176485599ae91040bd64ca4a4df37bf51771bfe86e4a201fc5f5f34a957011d5baf8a3ecf1a25bfa06dcd54337a5ee127d23176f8feed3a6f961908640996d5ec775b31e30ef4f2f453b81a0483375a825391777212584982e0338d02127b8d4f3e32e3d2b6ddc5bb915f1be2873a44a61acb928c95f8c6c13c953fd6167e61003ffb88e1864805599445550a55b61709b5c831dfcbe2bc03730a3a86c1925c407a91ab32f0b6a8212e0bdfbdef058309781195764807dd01b00a5787fe040c03019a36f991f2bc545282296ba40830e77706d89f9a3e3b80076e8e3e12ea6936a6a58741c79618b152f3d38563773f30fe6a0246b50dbdd5e5b0ed86cf979a289e08181c762aa5387043e3b107ccbbd7fd4f62058bddc5f7f86c40d553b9f1fef5c2d3fc84d44ad1df515fb44912268ce7a515c6c774fbf1994d64c2a55754c5990768f146010a052d1107130da23aeb0121bd6eae61ff8f3a5fc299bd6fa188a00ede4570455926b44f08ae260cfffd9715acf9b67286328acec9319e39e72ed0be56c3c83f6e5570748b8bdf141c708025d0e64c03df5c97f30cf29a4cc0e2ab4a261cc6113570c52d584875069d5b1762f76b4752e073dd79258bf427c921181f2e2040197e26fff16eee1f0520177c83fa9ebb4ab23eed22e02266b868ef4585f420acc9b35dfb7765ad00a04fc6a91e335070925f8ced094a62b11bd511c32f93e6d3be7401541db28271275a8a7ad4fc65881375b7af5412e959350630c867ece26f35aa7830a04a855a28107d3be9fc9c84f0c4635b38e927cb0da86c79e4e81792300b20780bf9910b0e13f008f20663b428b852062c5cbd658b4d9d5c47be4cbf523b16698937242fb01bba8dac77d951c9c1f899b9fcb3d57f81b27ddf9fe0f35a4cbfa6caa8cecdc913afa94c5d66cad0a6b04ccdebcc54f31d65ba8811f5189cfe7c5e3606e65993edb03deb3209d3608420ddb9e9914a32326e8a161b141d6088f1c96172a6a746f1ef3f7dc88b1093577ef7341c637287c23bde3a2413da10260973128d3391322c3771ea160abb7d551e3636c5657d8b210afd7dd30855bcc45f4f7b362b688c3a36ee7bc6ed23ce6a2e190ec11ab43ee3e2957d6d1a9e4a80fd616a8a43bea3c81076c809aec46b64fe919681cdd304ae9beddd8968ebdc0d181ea5f437d8e002979d31d446afa3bfcaf5cf9b1e9e86b150018e0b2d92dccb82c59566aa762c81cafb3a5b6ad4129043d37034432daa7880ab35f212ae528de91a9738bf504253c30eeed30ed8a4d1117c1117411c2ed19004f47ac5b0eba24092ffa2d6b0d1600cb12c3e4a42ec22c2403d2871f03968edbf293047de25ef7c8e17fc81649ff1dd3524b668430835723cbd0248f743001faac9c2756608e69758b4736519a09c810e612dddd4be8ee0ccfdfa84404dcd562bf8be6a4b144225358969921f917dcc13b3ef2494411c58c929fce2435f0dcc438a48e3aa9916419a695ad5492fd8ec8277adbbda54c5beebd03640264026602d6fff87f9e1a1ac1c1f5b97072b416fde6ff1c869e1fbe266e9489400d362b6c441ec5a3e1a1f7279e75d82bf01a8caf38aed59b549fefde6e065435322f218d187305189c9baaaa91978aa2146b046c31df5b466f5056bf8c6062a6a25a4733ba98a8ac707206109add94ad5a6b176fad65b740a8ba41442595b9a913cbfed3b978d4c06eae3639c51c32a518511950881a114520edfc3c16c4d5b1b6528b9765433b9977ddf098cec9afbee0fa4a6d5763b588741bbc2979e198e3d995f53ec36f58f07d59b896eea8d3ddc2f91cb3f4f8ef83899b37d9942b69cc22080b6377a526eee80b4c017bf6111420e12ec2ccc4688ea5f600755dc649fe8fb03048304e2f1bcbbbf71090eee3cbf6d80cf34161958a9b9a51d9b09470a712ee42862bed85f444ce0eab7615d76cb04899b560012563a9af3848609c73ce53d082f03bbf4a59f077ba0decc02ae386569699892ce1911626473e80614e8d3d63c5b5fdfcd7b15935b29435be4a383f03d65dc559e47c4660896b8373abc001c75a16c1be5df68849d4f33fe6c0993f38bef6aab891f2bfdc32395f569601e15d7b1f9980e9825ac2dd111f4a1899b9319c4adac61a39dd56faffffff3958e766f9b6f2fd92c6285f54baeae706c2f2a26363738aef00d345898c2ad7666aadb03d29fe7268eff69e43e2b45f45b8c979ae838998f33d2121fce3f055aad2b53798ad4584e5a2228361fa8111d6301a72368df0f9d182922d45887081ada3ed6a07fd814662c69b0a135b1a1c4d8d418552e1d0a4bbca362a787fb5fd771213148eb943202a50e43e127b9c060693af238faefae03355cc9f26b5a1bb93b0a8f8755188fbe40b4162346a8c5ff5b2c0262b1bd165ede912e427469319b199f7146ed6654d7f311ad12c03f1152422707ef8974937b2cf074ac394fbafcb3fd0ffff4f24ba246cf1884cd62ac466ff20ab08516103ae2a41226802746ca87bb4b552af751e391a594bb84f37ec44c29844f285e5b7a2c8047139ac6c367490332a6d4c1c4a6a2c6d70396a253cb9a56c8a11c8b93cb5367de9f684cf0923fdb23fdeaeb9daa50801a72051d2d95db3c6c37a1fd919c5c8804744e9658166292ac84ffc0e9b34b914a135b73b8ad8937f9c2684f2900fc33ee21e0d42c89ccd3c00f2e53f3af2b63f0c494dad5317e64e829a619bc5ee3d971c7b9140873f46ea8a9176c4486731125b8c742d93792eb96a78e92c5b84253c89ac020596ae643157cd1ece1da577cfeb4495aa0ad921c79688ec828b1b85d46d0eec3d8b7ebeb98c9c0b89f312a2d7b81da2998d9009646365543338a9142ceff24b1ab2c7e81ecdebe9b0f2151d9cd33286b9b0e012cb2ccef17a5dee52065c870ac79abd5ccd3f79f4564cf72dbea3d9ef9608ea39e0910f98731c56ce872669410292b80068a15ab8e0fe29752e1a8661a59392863f5c4df14c95b2de44a070832b0ac6c285db917983f92543ad8aefb2aee13db4f6de7b4892eebdf7de59f8855798c976af58d5bd9c0bdda3d1754263c7d3543b84fd64471d9fb83983ffff67451d5c25c599ff417a493f9f92abd2435506c9c0409d1b7b80215dce6401c5443c17ce759ab91d6949992dc1c0fca0432f72b0049d26af1238c0def1219801069e12399fa13113309e4180ec8a0df5ffbfc9a90aa6ab9eacb9155062392128516455b4caf993821709b833bb26623f0b3d566e842dca228e8e55978d8f7327aa6585f5b3b6ab2821826f8b02ad3bd73d395185102b3a833182551a587539ecf2f1e6d8b0d97ef38782d0f4ad1549660f549a508deac509a67639e209cb49b19640fd43396dbb66e0c3bdc743e1495a33c544adf676a899c0767c96aed63804b188b692493e506abcc8b9eeff7fc719ef3ce9ff5cd7e16185d6a495b1188b9cba9061c5e1e6c163f2b4c8a00d6275bddfb8f1e69c73ce8965b41befbdf7941fe23fda76b17befb40cb34938ceb1b78eeed1bcdef4e79e5ca5ed3e79ee0a483a429943c3aace4ad575295365a3e362b4a9ad0a19928392990f2b43d8737736e7e60ec7ef15dc242cfcffb95f3ca338591f801195a15a342049ca94ca5441913224a15919a65bd688ccae94473fefbac286d65581216d7393b0223e9ef4ffff28cbffb7a2cebad74936c61cde8a6832823848d293a4e5050c0cb6ea8e2ca824dec4138184d65751784323b6d3dc15ea930f5386463a8438a1ace8b596e1657242afa446a407c844a729a23a234787c964a3eddcebe34c782a8d99d5a6e6d7dafbff9fc999f131f6fe3f8bf35e219959a456c26f7a6f8f8637cecd3b1a4e54d457d6c4184c037b412b1194516312ce2d680f9cacb6b0802f2f3cf6d4b824626476d8679b45f1ddb929cf9a63cdaeae47579f7d95b52a54a011c64061ac827b618c2be19623cd89d66cb31db99e77bb8224caf2fbe4d1dc95d914a85076c1240aeaa0f4f61669f10e6aad9b8485872ba0b48c561db7ea173c0683c0c5a387da55c62cdb65300acf71f8cbd9b99f72f2763b3c75fb0fe408cc4177f26d9d377b68c05bcde1f9b264f08e051f1a4e3898ae7c30a11c3851c4053132bb010d3fefbd771bc04dc2f229cdffffaf6c9c9602774ab4944a83130dfab8570b42a94e3231e0ba880a610605086e2a2411bb671cd3c4fffff1508226e305712c88241185ac251f2592e0a8925269255ceaed474bb485a71b489af737033937c250045a1a7ef2d20224ee4ec8de737b644786217c3f86a9ffff44322e095b930382c887fb74bcf7de7bec8103af5c79cb70206bf58ec760414001774f81b79c324354e69aba4dd3b5a980ce92df3f38e75c854dca39b7aa5930d1c343299873626dc645c4958c19f2c8450cad09b2e37e9b8485bf858409d42ce15e700a4f72a7c0630489b1a3b8a7b50f5e94a2714f6934621b8ee8f2e8d995f76fefef3166b0f078b4398a8fa13d7112e1035048995000b19cd5f842e1f6a3c4d15a350c980b3bc1e1faa4825a2fb0f00b8f355be31b0fc37eff3ddefca4dfbffc28229c72940989c294a45bfcbca5fb286948ff8fd9e2eb74284bcf377afced46849734f0ffffffffe70dfca1f727ee7d6e7974c7815be4925d69091665bac779cfcb1150c0a28757adf454026110b502e72588aa6953435d3cecb7161e926c4855cdd48847c526a29d2c61f045c676dbe9d726fdf4b53bfcffff578ce3ff5fbeed1117b5051c32251224e88458c2289f66b8f8d89163184108869c472f354a45310f63ca9eeddc086199884273da56f939fd4afed0d48a5793137a2568701b1a97d1100a660787c9ee6134f3bdf70e1b2f14e7ff7fa10e8e41a356f2efa39f67809ada0d1469ccf88aa40d263420ffe3ff39c63d1edf2937ab1fcca52b341bf18ca52b2c6271096cb7050077a1d25c4feb562728809e9e028cbe8250b4018d9da864b0977c30005900d3180804150461280e3441b8071400040eb470d0803c342c3c2c280a06420130001808080081300000068381e150380c24088c0979d90015d8dd487812943343c8407f4f9d81c48cd7ee5b57095dbc46099ddf635d62bea10157584ac7c03a9578b059982c0fe34f1d98d62f344a2645624cb893382c017a6488ec84600a4eddba5d20fde291cd459b5c2e297e4eb88bdb09342e20b0a23da3e2a9ebc102d7db33755e8bddd4ce247b78e54967b180dc09344927165d49cacd4cf450b0c0c72a96ac84a8682821756d7651d9fdffd52ceb758d424c93234da2a703cc1b10b0059a2377651ffbb7d620fa63fdd08c3892447d03e46efc81c109aab6f4eb67dc337632a061a155cd2aac6960c2bc6d312e0ad22347020366e3fe220bda5bef53c41fa10f3dfb046577e0a6dac18d73c80f783abef2c911a7971e890d2d35383b4bc5fe91aadd1e26d1b1b4b68dc3866398c3f95623857582afc7d12792b89569b269629c7438a5b6e993661363d0f49694e7d6f193d9bc23e5565f359480daf9c428a55110b7e554466b1de0f5f9afd4a96e06bd8fccbf2b8c0b772a8f0ac5df49ecc115132c4fb2f92fc0612b214df03e6a6f1c614545a2a5ad287b9dbdea6b791711799c80e017c0ea91e6448071321426c1dcb1ebc0aebc04462cb952dfdad96b29733a4aeecdb80e3c3c5148c8e7ecb49294b2b424e4aff73a22aab48645025c315d0706e2faa0fc7c3a3810865171895193b440196874ac76b92535c96b156b0245c82de60012d7af63f91ec294bbad6b9131fb21f6531f2a185826e91bc626bae941a6dc5a4ef0b3cdca5f0e78ead1dc2206b27f5f22065f1543bc589ef8eda47111a9d43600a859de67e79a1e6fbaacf99ce77daa8dd35f896ce2dbae4c36088d3ca45aa997005e187b7f493193ff97589d6ab5fad208bddafa194600a8676d48800ea8ab7818e11e88d41215be8f713b34dc7c237e3d814f58bb8a1961758a22405d50e085c8e3ffe0ee7ca424c7deeff38e429c4e82f9c2ac85043dbd2e3ead3b918388ba15087463ae2bef1cd9008aa4294911c02fa5167d21b07d5a829cca143583bc78160f39ff873a51cdf44bc7f7a28e55a98c839f65c64a8b28876f161b135b760f06fdd7088a16f6d95e0b64f978386bb0161430368d4f0c38053dcd32d01430e8bce4b9011362459ee9b63404a118ba98ee57cd11b51d894f18fc4cac5d9d7cae6e1f5e44842609f8cf845294578da628d4da8a3c50085796541241327fd4fc05224522013d72cebcfe548104808d759805d2d3cb7e16a4437612a12569b9a1412aa9ac259e0f48c120530bdb4e91f2421d8d545c7da769e192fce1764bc8a530eeb4efc5aac945d2a08fc9d630503a4898aa19749223e1144dbcb8e900159a18d0f1bc6f47cedede121b6bd6a245fd3cac0fd5df45a6d937464682f7d104fba8353285e6c90c9b5815295874a4f1915846ad374a9bbfe6979f65b60ae16a767bc9c07604a8bca2096d2cde252d1e0cd8510f545e7b70987419cf0000c2c45cfb0ad4c19a15c060f7df6527ff0f03004f8806ece9db6c10759c988de25609168f00166805241fb4053b07f9df2e046163a2c6128fdb3813826a978a2e1047749e0771fb96ef2f80c98becf6a28b31f228840ce1ab3e7d1f4b2ad5821ce5e4202a18c6a12a966bc15866c048c14a65f758babc8c518dcb7a3df4b9b09b6e2054df4ca8342e5a95e1cc5ebe2569db3425b32a45d58a78988169ff1a5b22914f2c1d128b8f7537ee54f2b86114c42c35ff11e297386d9645f00991e4a109064e0cd61e98d8f6f1898fea38c95e427d4e34b9a2e83d82fee3f5e837582325c3de26fe238b44b0da14e00c9843144ca275167ccc85d088c52061ccb21b5c595a6510708e5868d652a22f59d5d81e766443fd94e0d0e40e8c943027ccaefd45b4d2e581147eb34c8b1848aa54d84a6afd888bb2d49361ed1dc219ac7f9a596286d57bc1bb4feb6b519a1fc60359db3d67fb61117ecceb1cb5b88f32f7bff125e7312db0a5d1f94a07818482d14dd2ca0976c0fd79392a6eb9538fccf4601ade8d3a991d4a8e144d13f098528d49fc4b33fa2ca300d30e52f33e031f19191c671928e30eef18e4b8c03060f2320151b7c961ba11ac71a552226c99a4a65e259b5352a5bd714caf34254a746e3f584bba1bb3c560ecd737b1ec45821c32db9d480ec144b3d9c388927952d1f4f57e2ee3ccff9b5534bda15ae89a73200b6b6e1f8b77d1d30d99087d43b551caa120fa3f2ef593c7808cf17d3276322c047ccb488c5a4482e72d6d8202c8f8c450e00227e2e074568b5dec82a3040f41dfafb9328355ad1dbaf018eb5082f0282541b58c4f8bb36ba56e8403d8239c688d5c1362f8cdaf81529fb115d1f9ed88dcb1241c86a61e85be2c83b5cdc3a6692a57ebdd42b72d23e65c566ad6858d01d958425f57dfc493460bfc4600e4c73ec2b9a5a3900e27a504e739c2ae5b15070111b8c0d9453e1b5cc7e3f3a8b64374b9d328c48829edb7739aab753b1b13d51874afa8b8f29c421aa78e5c9109e45d7265b451edabccc3702cb70a0c254be2790aa2917318224e07c69842975650478fe063cc31eaaa32ca9441a0cf731ef9838d85e95a638c7fa23584198266530bd763551424a8333d1ab7eabe63752dec37f755e181ee6bf9df11c9939b772bfda8ca4217788a72f647b11c840196e4eb49649c7d1b28307c105ebc301688c8a45ea10d31925cb1a0df0ebc4237f0a023206701205911f9dac99cb5519b8c2caa03aee476e202fec5fcb60c641b79c98b45c493d396ee8be2827de002aaec90d467fd09632ea26867f1ec8a7c9906984b24921e65a93355005e4c632f98a648fc86833999e2c863e580449f32dad5a86cac9c0a000e40a90ea6abb6868183a703739c78f95c2cf30a68c8f9711415f22e66af33d0b276e53f5c159ba16e57c170a232c1e0229cd0bf4b9471ff886db544c3285c5b83479cac358f62d99114d59e91c883920c554c371d142c55ae8c3129a98d65924e07af402e08c19276af0f69012403df5a1414c2cd7501775e4b0689890b6512a598418b9b50798cf2842d5c1e316e586590a105f90219ab1efa885caa8a14bb2a54c4f66445c95016d266565a01c9547a2409f05dc4b206b0b643e58c930bd2fc211c0ea4893c0f1a87b9e88d0fafe5c8a169100298ceb921043aabf1d659f60a472813860cdeef22bf1db703f6f238980e0364014cf6dfe1366eaef2b127232b0a4a3ba504f9feeedd9392225a2026af6872cbd44a2b05dbcdc6cf099c8b2ed9417d9a88e00ae045ea0ac99aa256081beb00443712da8361eaf585049d53770fc8c435b797d6756035eb7be3eda4150c6568146ee935517a476ecb726225070d258b155d624d5b371f335dc6a414bb5510a5dba7e140da046a00b82b34209b523fa578a7a48d8a03936ac8261a97ddfec38e445800f03d0e576f0d3c28ef40cb060e6532b7cd20c4b26a0e55fe92231d86cfce008695ec35bbef70630a15da8d04326d8524e8a63ccf2039324975139dd7e2010837216e46917163e167a90025874e468351f148e805aa7bc0ea2fa1735e908d1c838467e233529c9a02080ce53b8a991bf477f253074434a32d0bb08eddca985146a720e1c07f823cc28486aa81863d6850dc6b4f4299f90d17b3183f519432139e4eda6482517b8d0b279d3c9d5414dae2515db261c9813ad61d37f1e8286cf4161b66f6d4d12c7be94dcc92ffd413c6a1ae9a59b63f50d5b94a400591aac2c3c5e74fc807fe68bed7d5c17ee2b25f8b03519c6137aaa902e575b47ac3c6a8c3e42a8d3788d7a657e1e974d53da2ccbc0ac0c05e4dac02f29c98486055d0c4206412937e864e84c66398ecafba65fe948d89eec025f5d3e184d73305272ca0c36e7c3edc4d96d907335f103f49258ef6df8fef595d55cfb9501a24b02785bee00b1661cede505d5cef7da47d0987c087fbc450f1387f3288b0a9d8d409807f651b2e2223060348064f78da0c37fb38e19ecfd41ef1987b73fda1c1c5f4c231191dd8de4811c6fec8d1b317e7db58484a59542d0c5528d7d10b57d7dda7195310e9700683dafc771080fb010f77383809f36d8f700f4a00d7cbf51427af9cc28d0f74ac0ae0b7a372cdd7256aa764cbbf3172f8a975049e20624cfefe313f375ba5d6d6abc72562c19366c3b34a7049d25716ab50536edbee08e26acd489e14e39df9558252951d98874b334d088b869bc0cafbdc48313045eb5bb8da94cd2e49b04c3e5994a0423673384b0c2857ff45dc0da981729c32d871083b12cf16817d828dafacc6f0560baa97bda1d4fcfb0d1a7c01a93cd8e2512a0b13e56c266a7ab0b87d8d600f07a81874c8f2f49c9118a6ad0843cc62124ccd9e4634f2b91a209c18cec846768c615457080218323ae3bb20b8ad09d6c4082d4f75729aab4b279b26458720236c68245c3113eba23253166789097f94358924a3575056e086fa9067955047bed83ced5162dbab84c6b790a133d18879e30d24c0924a588b520c28daa030ee0ca5aabddd26638f961eb3efa229f6f4df03903f00662e980c20da39092e9f60c0c23453cd0d282e5d52c5f91dba2dfe6867e14a1573f1415c2e7e37ca020fe4333bdf2052d2ac9a5980e1a3447e64e1960517a442ed0b59711bb11bf286f0f0ab2c785e3253054e0d896047851711cb95d54c727452248af4953214c1c74c44dc573022ec226df6964e274e6e0e05d9db9487e18c8e424f89914a2b1efbd4710287204224b6147cc96584a07c3c2e42a46b9a9aa535c87175168c81c4613fdb633059c7e277cccc2b7a32a209a1e7b516b1d490847413d5450bf0cca91fbb6efa2e5f872a36d506757538501cb60333da2964d03ff6315d0f01ac0f529d42f7af4e826377ccd8fcdba182639267c4b48be50319a6d0589bd393582e055b166f073a396eedb725019ae5309b8690b407b059fada9116c974932bfbb8d24420e76acc26548a9419f42b076556cc70535f72acc809178c587250bca7d3e41e5013ca7aafdc7f39569c00b5d23a503efc767b9e7955821f76009d2ac56948d4a11a86602f447454099d3581eb969c833b2921ab5f3347b8607844888eb64d7e30e361d2fc0b838a5c894ae856be6847fd32d3e9c01e2f189b9f8580786200638bcf1d344ba25b55f2607f38807199f5c28cfe452bc888c6d5cc34ca19db0e030b9c0b767fbb89516962ca204813bda12109d9ad05bdebe76b3d431040fe8c71fcdd53b73bbf05a0766a1f28f5c67f98005532ccff3b27112ef4a6af55df76e09fe42cd4459e8690fcf34839d324773a4a4c17e9e92f113675db81b371567829c8f316a8c96c6e1ee616e4a576cc623430eba010b80e5e23e08a4461a53843619bb8add4264b7f34e6ad8630f3eec44b20af4d2a45392da96c43d46c278b8d595764f100b8b84e303be8a653a3f18d28e780a2fff5f4b0f85d6981b81e28c1ec38c017c0000f9293131b505b9883ae5cec59794a85e0d15bb971954b78c7a810351f8d3e24410617ef837aa284678141f9f6912d9c3c6f40e645cf36d595e5358eba1760dcebebcc57a220beee8d643c3df049f47617e7ca224a290adc4dab51f53a86d2b70613d071c72d0e4d735c2524fc286551d2b9ce98cfcba69162c6357472f87b5314ed97f03312866078da80b58b1c9403eec8f26a941db90c5b8301637945d7afcf7e3c0fcbcf380b39a37ea7730952b49101dd1b6feb83f15d4f93a85a1393b7860c258bdb31f9933880a77c460e564d055a6a6f10bd6f79c9aa2c003398c976709b3f101636625a456c7e8155145144c1b4323ca36299cd60d03f176f3aade833067ec3d924d36f1346329de0c55a914d500ed7d81ca74299105c8f1ae32647f0438a70586a94cf0882a5780ffb8f650cc9ade2fe6fafa832a118d792e087818df877a1e3dae84d39c749d4fe07ca0d8081c6e842c3fa5cb77c2331f8ee7335db3c07bcb6b08cc0fbbfb04eb39102c4d7cf20c701e0dd95244e29e15c6e2122bc41d49de3aedd82b599c9d9a189da12d4e7e4e2242ae51a16809ad9b6588caf4d907beb8a5a5580b25714c9dee3433b01c1864e6f88353af006a8593c89fc840244068deb421335484ba6ed22960f6f73d593fc6b2bb2a9c315b0a9e494d55b3f66a376bef3810eebc42c260fa09e3ad311909c209e2493d1c9753043bb7e7482b6c4c5fae9b09db590a620464a591a943afeb1472af24777e6eb0d30e3f03a6a08d0d4da4c5d5ff823871242bd2ab2008e4c36ee352f0f7a10b03da72a684bf48f69b52d01dc1ea9be8a83e828c67e96b0229cbd82459de695fec37fa34e59fc1e646bf7fda52d5972419ea803d402cd84c2cffe3a2405000ab211b4eeecca9c6c44cec030045511890ebffbf2de70f205c83f04638f8fb0aa0ff3adb72f74c28e02630d143181c57bf1873971747041f79c7a8209a04438ca41fa7406fccc0c2dd93010197396c27782c41d4a335c4e10748bdcdda106f62a8b5344b512188ae86b056ed38bb7c894c8ca5a860166767ef4219026c3221090ff5b068d084d5cba993764179e2a4c0c327faae89ac9a757b8e858736a3406bb142b132f94471c2e027279d242c7b419ad7764545ce0a611231944679fdf0e563997b264916b2a7b01fe97107bfb6b04192681a5b6197c0cc8253140ec3438672162e9070130d4857dc8a24013d77c2e1ac5ce560edec630ea699c3115bc2470495dde3d0d3fc42b405cf71091e5f1ee48f37a9fd9a8e413f227df7da4ca0de8821e8db89909ee78af7c1215bb3d4641a0f8a69feaa100305bc992ea878d706752276a14986defdfcd93a084944447b0f8c252aec1243bbc9ee6c1d090813d4c394c85899a7a0a80d3727ae47928b2ecaea3ad88df7365a62b6987aaac263431ee6e0a1f9abb771f13683cf29e26a50d8826cb17803c104e3a7cdf63d204032109666f6252ab5d4f6750839a6e37b7d37035cd35adc24a19cf958c20962c50d6734067fb374d964c0e8d18c1b83b903334606926bc094022c0bb049342a3d2d3306702916c929933e8e31771b7cea7fc3f046cfc466fd3b35d4df05e3d72d090917f42cf6b92154f90dac3aa83e7b2437b51401489b99596dd0a6a009dd7c745393475204513d27f3ee411b47e3fb191998c0960117796c023ad208a6a148924f483c9940b538e35480612f01aef3410049eae4b1616ed2cd6584a87e3205b5b5d488d64548b40bc75ff8ee2ce7c57b159c91860018ccd96034888386e690006fc336c8ccdd8cba18f97b552416d2ee62fd901ecfbdb4f13516fd7073bd5c91f6f4467b84ab689bbcc04d9fc8f8bea1dea73e5a9ddf74c1303c414d25fc5ac7e50c24803c25f84771b1c0e2260e14ea65d569c770b090a5673e88c84e01bdcbdaeed55cdb7662e10d05aa274f37374c10e69785c77cff4e1bfb897d5b7dd3b013508495794323edcd9e34bd8a33cd80bea1440dd5dbaa021a5265e188419bae3fb26e752e8f9868bdffc82508023ae79003a0c828fd55e94309ebc8d0871c3afc9dcad5a432edbc98137bc6fc1da810a9dbf95083ed73b7fc70e3c9467aa098d54771114d2f0b867892fe324da85a26a531d9e288c502d12c20745efb5a6fa78ef982f4611f8a07e709fb6b2962465048931a28027e8fecb260dfb9fea0725694928d228c247a621b2db5736fbeb9b9f3868ab43e1f1e59d2ffd3503ef9af8e5e26cba69088971f1a9923778bc587198959373e6366b1a97910891e9e46c6097bd8cda184613864428ac6476796984680152886e0eb3186244e4b7b480e81e20032137bcbba04acc13e7664e0a88441410310d25fa217d55d4f2d8419f44adef936a1246edb804f0012284ffa8524047772565e915f9415b4cc987ace1631014acec01edf1af03ddc8194609ad042faacc80e5d7dd12cdcdf8c680b710d86761b2879ce572c80ad12e8f5db6e46f6c85685fd9598744e71915e044e05662697ec8d4b26c246b26ae5fc6fb06641189131bdf00da9f36f2c57649a8cf1d937b8a8caa060d4980e5397b0afe156f22e0cd01082642beaef3b7bd4fc56442c3f319fa36469fbac7b70c4667c729a4b046cfafb71175dd4c510d88d3378777a74b680798ba0aca08634ede431f2b581eed62f773c976894668ba247e57ddd27291a0024c1f1a0fb121683c5f651a3c498add6b53b8994dd615402ca7c0a81a91fb7dbd4b0e6322a467b269e187aba09b66095ab172372f56b42c627dea452b5626aa12dfb03b871e22c05ad9a242fe2d719bd445bed8155d47a3c26011e07e4895855fb10df6f7ca0f3d60269380d3dc5942b454258370b9e20d6f2912299230529d55be718c0f2ac0d0378eade02dcd081091a4faf008436e8fa910a998bf09a46a474c6406d29f874d64018e6d1056ec4fc700847d4d7d8b3598944560718f4ebc588451c27373e68f55403286290300c6b80843b1add9196383cfef120cc4521a616325e41dbca3bd57a6e23716bc10c65197eeab0285d1e44e51885c379f2543e032631c975e7ba09936324cd3aa0c8a09a913a162c87c97216493bb5ad17f81b330468d708134f5bbe9783541ad2cc0723b741464e0d4d1c5145d2c857a1a9eb456890ea7b88cf3b74287a77ac6016f975209f9c3e1ca4eb5cc7911a182e79bf719d89d90a0b5b41e4e0352c6d28beba3c2ec202d1616cd91c169e3f071dd8a5adf48d1053d00cda6cd166bc9e281db6e89fc581d5a2ce67565c4e9a0b46d649cd248752fb9d526420d2046c68950aeebada097e9510f0c0d7c7139d61e0544cfb48ee1c00030b8cec4ceaac763fcdfb02279e1850136b177e060609022fbefc4a526745fd95582058b699c470ea372f2669cc53cd01581db3a88996c1cfaf591f0e76135975f9c88df3b36aaf52669882c6bb92a20c73adadf45351bb6552afebe668a13516082a508d19116f8e6266c7637cf242ef4443b7a310f0256f82368a2b8c11c805f0af61ee0eb7520acc2d1b9c065286c2644cb9bc64399d8d541582d463c08975af65ac05f2e06adb805a3561473cc471cdc60f2a3dec058522bea44a7e8cc2369626a5ccd5c181000ea17e33151d441ef524e9b710e1f9dd4cb691a58e93131b6ab8dd4f8d2561473ebe218373cd8a668a81bd054862fba1fb5ea32ff3744f64a8a27d8f5d539c2b6512b90e421217f8a68ca4a6ec1c93b328154b8cce331affd22ac375a5e73f323efe258c1b6c991d37c88c6db89ed1a46d46997ae9a401c42be04b1d083b8832317d669f055fcbf14ffefc79a37d20aa601714f44aed59ca2cd47a58e6e65323457b7f51766a2f734931ab7f6ada3fae82a56dc2ce951d8c48beeeef1b576213d092035dd481268d7515dcc4a7a17ed2bb892b379ed03e6fb1c8f9e19731f696a5c1aa3bc4f4c31eb4bb8145beb6fa5f4e5f804daeb60b1b9f651a9ab9d138265b3cc2e16dc32a29da1e2d35fdbc3ad5dbd5be1bce5b24b254a0e17281ac1e5ec165b80c00d6dcc204a72a1c48382ac687611f4fc2dd01c00e75227b3f023de097fd479d1a431938264d94dad05ed1a34b890136841f76b6dc4fdf52c005f5fa5c0023281667bc334179d13a9824ce67613941b34e01c2b9e107e68a90e206849e6e8f2ed70110fd2e800df3da4320aea49373104de2e86575b6138bb89a162f98a4d92d8287d503943709fe5bec7c6d594912a627c66f8bda06a3251d0687ed53b608f18f61bbd9f6b1010976c66a536ee90b9b114bd12084ee6b250e2769b435cdccacd46eccc99f7a97c03fd2ad2972e48ef68278d525767cf96a2348ba70d014c97b5d865e928510c7a191371aec50815fb4279485ea2dbb7ebdc023b9a4b3202a825bad144942c5ac04998e98855083c68c28d410544cf8252a44b658dca937a108744e78c27e34a45e80d6036fc2f8e82413d8082601ef61f7face77b50cc57e4aaf61e7fa54f49d374bc527d626a7b752f75bc8c223d2bc661a2ccb8e1b99f96b16e4ea47f9a252c103c3cfdda5e4ebe5d63026f66be9aa4c8bdd235c0c63744d747a7abf2e4e0e2479025c973a26e716431a6eb39066372f76909241a018a9e542456704c317517283c880a4ecde828601882869fec8bc21606b368c014ce90a730cf020d0c5780a5ddb78b3b28591b285998c8c91a6c83cdf2c2c97220855c4faaf9b99ec7ec276bfff589b585760977db7b4b99a42c21012a022e02330236ba109e4c36afe0db1908217ea488a6c760da3eb119a1c9c60955276a54343057464630e2e74ada06ae3392c7f8dfb1ec9d33823d609fc7bfc7cdb32f3b9412410bc7088ef0bf5de1e081be2524a66158ed3f6761016542c628652c468c2627851943746c4a1225e73de247151122c308e0780e986a38f758396ac5a3d33de252747241b6cfefd0b683649a895a491ff50a496ac884941a0ad516f1ffd4166750426aa3b1a46dd0d86501789bb3cb75c011ae3e2eabca5cbb3a0751f7defbff4dd7ec56b9cb02836f8fcc6ad82db29a21a79c99cd921668d7b073ffff6eef9cc33d841abb4862d13a296b724127a41b5952765d81a6b873bbb6f3de3b7654119ba2cd8dd76db28972756409ecbdf7deb570fd681b4acda03929dbf18811156432520e5170a8625d6c59d821d8aef5ffffffff2574d7ffff0fd32b2430863b57b6d3309852261dfa8cd78af5debbaef8ba4c2c5ea8391494d215351e1f02425e4043b69a6c48dc9c237981f40011e34b24df26b092ac4857cccd3ed86507ef78379823379a707b965b9bb2fdd880abdb5b911a32e72f3b92326f00921211a14571bebe096e2e20c52c45959016cd5a8a0d020033aca17766556dc669ecf6a363510095d204d441e7b710bfe0343db448b123c7cb154e184cf59028fb59826bdad81fdc628f0519fde3bca3f7de85c2ffb0defb536639e79c8b80968890c2226c119958021d6575a1ccbd099c3680384a251a2c3c8475589bfff573b0ca597557658fb54aa20285ae44793e6c484cf104973978ea09de67deea46bea44e361e06502c5e63ea90fbe0dd032068e8c27cf60a6687120ab685dd5519b2c8546b50ca5bbfa4386b5da3c31140910c0c3a14eb1b73abbbf75d325e3e4900d98c888311432606e14d324a3450d0c418b98039cdec95674fc44daac6bd2cc6db7b8f07c4f9e95f978e0674c705fc00428ec510fa5f658569e212f1e65390d8872aa4cec097e51fdeb124997888742e86f10b568d7d24683fce79eedb66bb6580f07fb62d99f9d507f7ded7de7947d8948c08ff77846415571fcc77701d3686da75fbefd8b2f6807a2974096f2ad4606a0ecf9f0ffeded9f7c547d529c982a2b5bd72ea49feff2d95035cfcc27722514396fd60c72904d12668eb4393bf70968042c97566c34d6975b655e0a5ac7df0c73af5694a6ea7a01ebcea4de8f550a903946c4962ba28bd865469879636b8ac232566e3da6a9628a71cb26a08704602e11f9b63235390e03108e7df7bef254be97fdf518dfd72aa976dbde9d3bb5bd9a45a0a27621b8ba5259822525ad5938ecc0c56899da20b11316c711105040a99b820e3408207080c4fc76d80caec4a66e8e8e92d08048aa94ca013856a5121ea71f319ab114bba7263f1026461a354e06a16400050dbfb1bc0ebff97fdff67ea0cb935ae0427a6751e4db3428ef368742007843b27f82936a0fe343cd7f928396ff6ff37595360178f1a35c3d0ce02483755834e060d77bc2a88993cd1dc6bb45521ab71569d268f535e58476a9dd324394a610a2427982a4990f0630dc0f6ffd51d6c48ddae9750be242bf369adf7ffe5af938b9ecfedcd7d4945bea6f0d38b75a11e60577d5ab1ebc707ddb4b0e0018881b88802dd8c01445c00f74fd35e5f970a26e2d1112b509259402541c15dd39effffcf6365cf95358f550aa8323d2dd16a43895d063483be672a5edd65ac602b91068382143aaf6c28b9aea6509c058d84186c182947d65c5879e17ebea9b8f7f518e205f5409223dcb9b8a75ba5bf7f907b142c5062fa505b562559e76630f5bcd5429982d4764c069fba9a64c531b6e8da7e215ed80ada3cac1ab7302fff915a98f11b3be918d6a6c6921768a41d1a7a243b498007cb84a10feec53dadd6d3b685400884937d28a762ba2657044e9993a5bc9dca9b1ee0ffcd754813f6cea122077d7e494a9373ae1a9547612caf1c52e85188e75def2ffba320eb4412958f96d4545408f2c9e8cb4fb81452cbf91d6d977fae6b43ea7f0e9d14b3188c822e3cc132640f849eceabe2922de909b59fcbdc728d2d0a486cc590d3d6b1ce905b3952c3ab0920fdc30d5b7b679fbbd8bb7ede7beb0393df1a4853ad1064652f662598689db005d19890424f47291a768bf19fe3ff04c8bf3e625e90528336e4596b1a11b7b4cab8a6fd60069057d46a07ad6bb3c8734d4fd833167d8863718b3302a33a5111672e471cb65c658b1fde16065de78ef3a82b21cab0caa502dfa5850f2ed88f1571229fcd45094ba2867007335114e28a2152b04721610f62d6646431cd0c396d1240af552348effaa8ceba43cce4ff3c18431f77c3c918992e2eea091c2d4798dafbdb8131c9497825138bbd006f541131c52c9176f1e6a5a662c87788a67fd8318819bf48c95591649560cb559c7cb4f90ea565b51407620ccd8589c326febf9f62c8f65ce63fbb814dcb4d4b8d181ec07258305b5152593a449f9b8fe7b91fa3d600ce64e6484b69470601b21b264ff0490686f1f949a062c7b6f1791ce5a3f2381f63feb1f95b979d65d39fb6da05ea486e66fe263c661fbcbeeea977c5fde4a590ff3bfef90e997f6231453b606a4f2e95a01b369b22e78d299ab48706e7db3569b1182fe46ca846d59134a353dab4ab9df49d314eea98d2adcd062f10fef64dc618fa0593aaeeeac4d299181d30916500183007c657122ad536733562c689891714e7a6b9e9c081cbd0d3a7bdf3fed1ab9e8484942d1142bbcb1b887a1987ecd3b89ffd357fb5f7b70daa33e7af8e246bee4fe90b8df997f19dcca771f364f3d736e727b4e7d6bd3a873a4df2d5843d3e78325ce6bc0776062ddb122e2541d762b322eb64e6b304421bf19c0993b16774d3b9f7defb5067c8ad9cbf44c20a35713d019aff2c003ba77b7f2540fac0401be79ccb3a436e4dc614d72d45ae3c73236af20c1ba5256953a7a9745253b2fc0b462d791c8ba26c1958ddda6cc837e20b885f8c3515661d2ead0735653ab16242b1421b3ee1e73832e73d5f1d7ab638bcfac82d30ac554c46cd6b724bd9e32a5ab98e7057ec76353f387813ca39d6248b6a8cb435c58ada5a4680e0d03b0d22bb63bc6412af98c3bd0b097bac4b2a9273de0035028c6fa87450379540124300b31800004000500c84813011f438f71400030bc064c06c4028343c3028140c8401600030001482c160000000060303a2602054109894e26a0340782386c18219b1ba0d8f9ed13f9a226e9ceb5ceb91e21e0087d849ae95ce2340e269503c041807e4acb5486f8eb9c9ff36d20957d2e2dbfe3c0285ee0343ef7628473c83168fdb04909216c60072740076efb3c45dc219aa69a35e56fe0a409638cff71529cc779b8b5ec93fa989c8166eaba458fa878f03d55608c93796867d31b25f36a476a26f2cd94659c56bf8500edc701c93698c5717cf0c546d5c2037150fe0a3b01cd811f13a39decf2d74edc826caf29de0af7212ae60c5801985247503538c89b00cd2e357a2f5d267bb88b62de66a31805bff9bb26913b0c9be09cfd4be1b082ffec7cccbf7d37bf422049e1dc01a723ef9f51e6768804a72373394371cf5acd03672e7496360c0149bff543b076aca2759c34bc07ad45ff803c9c7e7131bf2f8ecc4f2c05c2bb2abe8e679a201d4b6e3aac6bc8449ba69288381c31311e894d5cd5533640fccd2c1f67fc3673adb59cfc78a9240cf1597e7e4bc1f212e7f0d8f85b0dd79adc99c924cd35f3dd762dc9d55081bdb542871595ffea4e786b40c9e09e3baf00e343edf63a864f410b48ddd4fcbe22c620b160def781f1a5c308a8d13e31fbd4043dcf1d25279a212172704c0f0d4e9fcca2e04a1f239028cc11a033d620cf4d1f2172e00413f2bc86981539a067a33b92a0a7f6c559216a3af5dd397012d752e1b9f8412795c68d83a010f61edd3e75323023fae6e210266205eb1c708002c64f01a0fe0fcd44ea4f4a3eded1c0b85d50242b5396da6c90e0b67c8f92dacdd9c8126290ae00a60d75818e865e5186bbc87102805a2f69b4305028e8e005ed28f72e053f55777054359ee9001f0a72200a29a246faac710e5364b446b04a9aba9a53baf4de41dc8b96faeb8becc9650739ac77cf4126afea2a4eaf37230221cd064642a8fd11e7a32d7c5636fde6f1765686d4172ba85b36e3444d1d422219fc47c261017f0dda1f32626fb9c5922cc571ca7aa910f74fd9301a2ec6fa4851480e7c7df369b8e016da3063666743abd2be5bca208dcb984690714916664f61ff872b1017c2892ec11954133a819fc96298f9a4a26068b628159c573dc812a260ee860cbb461634850063ab4be487f299205b822629b22a6a3503404f1c927eb0876015b59a5671d8bd8af39fead519134490f85307ec527e9f124d1e490ce4612f6f2e64088e49e5738f70edce1484a28df5039bed079ec0b5012322da8414b0beb28cfbfccd8bdabf6b9385c7f08a25673c4bba3deba44f7bb09afca64db1640d3f5f98e92804ff02098fb44e8e3aa591b44e124fb4fb8d7033c0e36e9b8ef8f4e1a7a88b62edd5ae34c4557b8fa8c367070e24f6ce8748afb2c37ac6092e3311881e99f3e981a275bc8bbe802b2a90a684396198c7a8eae73a61d236b2257eea9fba23bcce8537aa449d7a1acac80a5121fd97d676cbbaa946160430f8126f64a077992f95805290ac2f916dbd5edfb3a812344730a3dd2b81e62f9b1b9fbec2e3476caee42fd2b25771d2116947ef696e14b4a0e382630423ea68b1606649a9beae125a76449a030008ec8905a2644568330c426b868bca988eb0f769bd6b85cfc78919db8c75184d11d02df61855d19a27d0290888acc4ff8fa27b452c32f4104ac5c0cd0228bc96e9da3756ba301b22120eea877636480924ab8cbf90a0ba5d9dbed17d516d179809cbad1924796ee4aaee921faf981a31abf06647a9259fe4d112d1dc139cf4aeab0514d336902619d73046abdb1dc1abc8de50b0e4c24223ba3350e6272d9c1a2f0c75b1f171becc1eb108262a01cca7f2640dc55f66fca9ae309788be4a53dca0811db504c1258f81db02242a5091451927255239a80257adee733275d201e32b27651f70912ffe3b94d2177b1270d67941ecf200f08d14e31fc44640c1da20178168a553144a1c2d6043cc2d8264913768dcbdc73a2bb716f8dedc1ccfa334548c839acb73bb182a5b8554eea51128f2f4b5c65cfc0acc17edc7c02f2f6ad45f9d6d6c8c146695cdc93680638b53f54fa0b567468a3a051e0fd44e54d9627412c03e25864684649e2fbe58f6a1c4da4cd5161c6fc5171e0f6e77628ab6190f3c0b4b6f2d85082d9637c7b6487a0017533d5f08864dcda81969be0a613a657ad102f900f9e924a23f3f2060e8e42eacdd62cbc04a2413de0ff5fb99c8d6ec4ac4e27231b55d43650276d4b6c4d211235c6e0c18c549b68aad19a44c10bf92f7d701d30a5ba3f6c2bc4b2320ac3ce3d8203658187374e26833e11308c7cccd71503fdcce50a1bfa91e586a999a585dea2789c86af17e05eab45c35297e63f73c2634fb0db2623246e9b7b64b69df221e27cad435b5e98298bbc9fe89e862d1fa4813c27e44449402424c079230fb806b150c0724dbb382f3386e0b072d1bd3403ccf3f6716f02a3b94eaa15111667f012f64ad91b61cff8426a48861a610070409a31e21c8b4b1aef8d997d47219a121100840b264e88a62259ab8e03a7336c77d581a4d76bfe5ab4e8aaa1425dff5b95c19236a17debbf98a130c362908c51bad8ab505a82bd64b27624da97c8f8dc4ae6dcf24d3d97b14f6ae2bad4b792bea96bc7843fb6b3c9692141b97b57ed19600b6eb4f5e0e45e640059a4c6a99eb34885a731c94dc57ae10fbe95217144c83b4d0a7883fd0f22a1a572f43eb52ed1eb18a60d260a818fd766ac60071224f1cfdf61db40dcbe149c1fef744aaca60e1c9e0d1af7d9c4c40c8828752eb83fed9523626d32a1f53531cca5229db392b91c2c89934af8bebd6e160b58103c6d20d773098f6f9ae15fb044339911e32dbd26fe6e4a4e7c5b04048240b2cabd796bae1aab24b89d1b65cd1c9dcc7589a88d326d5901b425aa04a1d08b75f9372861ce4c5ebb9a122064e43ebf1fd438de4654bd6c49997b44bfa43f78d353fe1fefa388573261a4b3f6eba84761d55574ba42f08d23f019ad95abbba1fd18e9f042c22bf21b34c7540555ccf924f916917f3f39e9254636d686d7d7412d95be0a1ca3458e7aba91cbaa411098292e67835df12f1381800012ddaa9459e7964529370e3a864d2a1079b0560348ba6a35e5df252985d3541f03b17271fb9123b7a01c1fcd8a855699141545a737206aee858a55c59698b1b43f9af126c788aa4d69d2993cfff667345d4fa128bf6909281a1d431fcf34808a08554c06b044435427d4f3a1a2435214e648e1e5c148e046490260cc81d6b561cf676d41933412e6b381d39be081be89b00543568e5e5d8fa130b017d44c193e8acb3246c52852e1799095c117c3e71461109baf8f71674fadc5545318b7a3f8af866cc088a0b0acfa6d395e629edde040e5679251e5266e226d8ff059224cbb68144e42ce7ccb8dcdcec5768cb94c57e0a28c9e28bbac20143150ec51a8066df0218ca693c2b0db8a5cf8c50438c83ae34578d598c908ea458016880e836c0bf54b9cc1658cb1be72b1fda5ebcb9336c86a374ed8c97ccaabb226e084440afe106d7c0dd0a0e3ed9546ca643056070f6fcfbb3bc4e9901886531fe5880c198879a2f1b64bf09d6904eaaaa97189171bb9795dbd661c3eba2d5841661222951dc0fed8cca961fc89e0b0e2265325501199fa80368f8893c0a345436d9a76769e21730aaeb06cf32e30d0ed009264a6295748e22fa6f0bb54082cb566a3098a1605067e44c4b80b0e305db4115fb00815b4851174b64f36ef0b9c78c9d2e499e3a709fb1e3b19fc7c8be1160b3695dd4f006f5c4675f073db25e404128dcb0c595bd46bcd04578161713a987012068361fae8a9e05270e3394f3b6cbd559fc8a0242e0afff0b6cf991a8c2735fae90768ec76b46fa1194239731d2b919c90d357a2c1b3e89cc43f37b5755a6ce8a5ee361bf7cc5033aee2b1b27f5ed43c9507ba410af558b914fb942394eea5ed2620978668bf96140e47724417dd1dab3b9ac62474629039acf584a58f2a83c96686490855d74bcdd22784f8ee89a5fff04f6872970c613e27df4520705a8f8ca1db5efb9e307d324326ab5298f7f5072d10dbf2eecc170187b9fc825eb8fc88eb695740499b51cc23694c9428f25e6e2607172025701b1b2264a9190e3f5bd0f1b0c3c02611f09b449650f276465c13a87aa55740d59fed03c67007f9a8a308d88d958c8327abc8d689e5c26d9078be1889804859f58111bf252cf4c677d776f0d3010436413ae00f28bbc0c142035cc7fc893037fae648e1c0c203a3ee91e8db30e7f9c1ae8bba6307f99ad0716d0fb5e1e383ba37bf5181182e912f951f630323a73c24533346d6eaa32a23567cedac1202eec5b0a39a43ff3063a5c18da009f3dce12295978a6554e20eaaecc68c23d3584337799de7c1f3db644c9c6658c0327abfcd7963de8791f783db5c915b68b99a79ba35306351c4f4c204123c395d1d74acd502c1474f1111904d891c294c179dd83f79f7f3089dabd323d9b14f8b7f972b78db6c299b52a6e14d903911a60034bebf7281a7ae1fd324dafc983ba32d0112b5769caae83769b08e8cce92bb9627d720cb578d4923b3579828037591d1fb49b44c7bbce13e89b08e7f9b38eb2131aedbabd863f86818a291715ed4e98074cc581a945d0a2897e77a7c646303c61b0f48c9435c260394a7a8e9685a9fd1ffd5487ed5bcabc00023917162ce12ffc8e0384d7b58db56a3f41ef4d63575833eb1201d91d90a29b74efdff735223ac0c8911da9cd7ed5f32314fdd087954c40fc1c3bed4f879d7baf3e56080594322d988383f516d7a810d761b60701107c7f0ae9ce4f9ab90ba46297c3aa4e1df59d29f4f50c0f24955d05692254b615c21372c963f564e6f7a995de0108792f85634953fc68fe89ba11a390521fcd3b1a684b916f73c0be5290d1a329f07d128acf823286f82c5c5a295ced72342e8c87c6d03cea5d2a01a88a6cb2a3fac8f07d1dca151b033a955ab222f458d0bc3555748b7e51cf7a72df90361269db034969978b154ef85448fef4066fa0fa003235280cf217c33af4ac206d7125b9785c811e63bce125c7bf48f42abcd2309c75ea760c615db16682215f4a5ce0eff18640f2bfeb5ff9ef51229dcb518de2921bc21db7b2f1eec2d515a9ac069399cce9e756b4e0b52c113ba020c16ab9e2292b8179496b28ad1824c9173f12585c181b0d9a6f8fa64c128e022680a64e6c21425aeb2fd2cc709d6adc88ca51d2a3de0192839ed40432542079a437f078dfa999e018902ff47a20110f14a514d4b6eb0ce3b2b65607e064fe0bbfcfbc01d5f84708dbc5b17d89a5085e1abbdfbc6bc4b0afcd3aa7dd3c143e5afd61a3528587c67640e0a457ac06479177bb71f09d683ecf968342b8a61bb812210c8ab6806412d861e9960516a9d1fb4c9807221e708352c2afe650932eb3178ff0fe6c60364fc86fe8d9651a7ad88756a5661ce742e32689c6eccb8d4f116596c189bc201860179ba758b592a8c2594e78711134d9a357ae9552ca2082af722a68923f6dc5b6c51e34c02f972f0e14daa02a9990a83dd80b571d0f1fc45d7854c12ea86412846ac1f9f1f4fe9fb69de4ab066e3e550233e4c251c0fc684618ef93f2a6492ca8e0341478c8bbbdb234d4831ffe26af20732fa4998560e2551dd26551fc7b52a459d8faba87f5b09299b855388838680f33314803f86b4deb942e84c2645c54da49c25976fd000fbe59ebb7d317ca2b402810db6c54118aa24aba136347608f5cde19cec8ca6b824f7a89e1871afa92142a54547522c40d2483f5b39785273949179c64de01903544bfccf7bccda193c660da229109b249d4d645bfbfc630649649bdbb914b9d189d41239a7487081d60aaf6ad2eac424fc5b4aa9f225cee899439a411dd01270fba5b26f520fc72f938313bb11db2df13d8280f9ae067f029c4f2009a19e352fc83688d71267811c10eb309864390261f2f64a773e00b754392dad8ebc03332ba5575ffdda44018589065fef782f9153c0149db0cef634743254720a6cea7f2da8c311e48bf4d859300d8162411c10b1175212704705b36b8a73e3b647320caa76c474a6c711593f1dbba9bbf35848fd2102e695a04137e26579d310011323741763a8253408ce89b66bcc7345bef56e05d48f89d3bd7b8ee20a9a59e47889b915f399d530824a94013955da13b1b398a0a6ac69d11357cdf6992bf8c3e0abacbbd7af69522331666076bdbaf91db906a1e4a275eed1b4dab7a4886a610d7c416b20802eda14fa84330dfe1394275358761863713a3887e8666e5df8fb301beaf0cceba806ac264a467105837367542221b4502878cec1483d81143f708791213ea8c44508aefcade4f7b60864f3eee460dd04c02509a38074b8fe721ae2e047185f3503b943b8701549070977cbe7452e7ec910b0fade778b0f922412382ba31b0ff54784963fcc632504e5dfefcd3b549e4cf0d07abc48f70d0f83b321f304d7c3a8d99e746ef8b4094daffb4ef1bdcbafc0f17c2d77ed252e4aa4737256548fc10762ca78646f2eda140e8b16148e007248016a1a4527899cd4941c38164ab5d3000bb46ba0141babd00283be5c34427201244940c11040180004fb12028659cc7ba2d69ef18f204bc4875c6640cfedfa7cc14a3c6a848d218c3f4630e19c543b2ef4435c9c4f7a90e027673e4c44b0fb14a05fd2c5b5518d5f80809f45e63ed2899a3765b2dead8898a1a5e990fcd030efe3c70ab96c5a122d70691a107704a032b8434a64e6bf29584351a64d8e2516cce6f3395bc57acfc1815962e9c5d8ce650c07b90fc03c54e2c0f1200a3c505c119c3f654d426dbed169d6eb943c1f4663495d21360aa3447ab6bc2043007dff2265ed1a02ee696f24512e19110f22f21d521c7e65f1ce265b4048a84eec47244a74f047a0b6babcdaf2e27efd2263da81cf3854b7453b377e6c7c5e83a2dd6c22d5c1199823b8139ad0c0a123196e6c6b05908d22d1d7c68b325f9edfa4e94c869c07de5688161542fc5bc8d4053e821c42ca149f637c0084c98025e310520849a48b009d81d8690483b3a4f93d86b406f24724bc1f4f0130f2ff046292488cd7236cf29268a64087ccca6cf7ea2c61a2c914d5c1ea79c2ec329a4fa0671c14cf759c31c999469f20ba09697ae9cb22bc19ddfa8021038f9618c777c533dafc2c09701b80b8d57c7ef404450cbb25ef1f7325b152eb260c831100c2e55e3f5c11e0ddb897759053902e23e29c7c8c09646af54b1a7c87ec7069d5e648ccf4f484434580b9ce48782272e00f4a7c0ac15aa87041965c8edc3ce7b074dc84e926e1395d6eee88a5c345cd3585be319e26db89c760b9505838fe68357376a94969956881964539861c92ca7954df69d6bb97b8c8a923ee76c9fe4466b41bd953927cf8b34fd5db9087f849751677f7fe59fbe62d4dd424dbfa116397d688d5fdeb854609a8b8a820c7c8c96ff97c929d6d0667a15cb05ef46e8c2bde416f049258649c1727a8dd5610fd481d36677a82c3e9029c1100b5bd1945add5647b971e2714996d3be3b98cad176f078f15a8e8a739d0182fbd3035ff3834420d2ec83b9a6f6ebf36545315b8aca4718546b8fd7ac97904bda6188260881e31b3c63c9879e3f4c3b0d4642b3e088fde605993529300d00be88e1ad25ed96beadc43b97e70aeb824a5269c77aa636c5888f480a21669bc0a76b2811740e8d36f56c57837858279f825ca918388b3a8e7537ac00d583d615cae45fb59c30094f35be8cd1820118a87ef4ee0cbf6e01e726b863cbbbf0d382edb90667f77b6775ae00cb26fd841941cc11bfd7ab2722235947317c5eb29b1528318bdfd630b0f7456262934bc5ac1dbdce1774dcc72c907e8a28cb1600565bac3f076e041dc94afdd68cdb35cb5b75989d522b75ac9a92e4949a5206e7400b0cc6277470b438806747ab005efe1aaddbeb4345fa910d8e2f38f8f3f85b0e60d4122a7a52904b902480386171ed3cb885f28684dfa2b02882e829d44e6edcb3e438be907b9a1536d1e421142115700f727177a5db059206fb1f2900ecdd094ed94d86da04e36a7b01a766a5712dc40d105d24d013657c705eca5755896dc4d74eb141f9265cddc6df95020a39936f0089db919be93e7f2959d8d401b11c8f31de79a40739cbef182ba647e2162c37a1d6ec039bb0238a807f3db90b5830816f1096078106937ed86e615b8d864c71bce23c5ae45348f66117775cb9dbb9a4c7f89e5bd595c539aa6903053473c9d84775b087780289a97da6a5b51c213a190b5eef69a865038ef05d2b32151db5cbc3ccfc795577a9bb5294e15d14325a42bb1e23a23a4063ee5ea8adca0a52c6f0c1a3ff2eee0138a2a4d83c93aa27bd6a4f7b295ca28379fdea90b3c02f0701a3e881e6c8ce2f3a3e86883e25b1f1fc296a05f3febe3a8d8fa66a8fed577b5472241e80e0b098ed8b6b2712d51a47e689e39545e32721f04afb00076e14606cd5322b6c390b3b6cd162ee1299e1b5a095d62294068e5c551a0f27f597030afcb923df0565e3687d46592cfe15b2ec63d73c56f9feef5cc776d591bb64041e403170e96c3ce4504ae12a998d71a8bd90131b49ebf0ae1832a07c8df41002aefcfe3231dc30a893e015ad1f1f32424235b037a141c33d323615f19133cbd9ffb7ee7448e93066514decc86ece6666683fd2ee11c1fb3fbf664c250433e6267acba5641c5ca2566054b77d3f02089b0f11261a92f5fe75ef4ff891b3d541d0941080e7c2020a2e8a0d1e0ef47e4c641dd3bef89b0a00cdea46f1907a1d1d88ebdb76b66bd425be7ae468b0a71d77a776418af0658945d900f3b44ea3848f4af13b330139bd83736f6aa9addb49a35fe007a70405bee44bff78ae04d29d36c0dc888704080817661e5fbd8c7a1e6fdaa3966a34a0dc306dda7e86008ac075e25067258c5d5124f618b0b5702a1da9e453da0970030dabf135014984598200f27565f7e5318c6e648336322064e3d598881dacc54a2baa9775d6eac434d528770307a046385a2d417a34432f1c83d48e339519727ec7e28f4942ae3d432452769068f5eb42a14e82a6fb86368dc5c37294704efb4d276aa16060d4d15c15f4b5977082e6448b148ec52d75e88857ae43c496e9590aaf40371c799f383627619dd684723482759d7124c2c4e5b22b6fe8292d140346f96581773089725c639cb538cdae6dc74dc275df269186829217145688c1f880d707d1c7f8237430aea8e4ecc6329e066148c48e3b79b4eb07c10dc846866ce1c22cd10b69ab5799933209ca727f4a3999ecdd5737b96cfd2472e8c07742071303a38c42647d6f6e916ede0962f6117dc170d4c19011a90f4205780cc61750e899a83ddfd834158032e0273300190836b612cee1a51ede660ac7340741c1820b67307562f980bfe3f09a5faae6a1bc35099eef7124a50410298a554a13f59bbf8f41b7fdc94c0eaf6bfffb7943249b9f70e0402f701ec015a7f41b91219b4f84e932b5e8f0210a3d06a54d9596374b1804275dd40b2ead041ee890550850f8b4f8e7e7140ce4b06550ab885f0ffb737978c7b61909b73374f699dfb15b5dfa25dad56bb00288893081e4194154ec81ea34a8a8c202d1a58d38290d9fd6f130c1849712981853da9a45c3f9888f9e204cb8efe3d29507568d1bd8f2fcc5ec8d15acffad3aefb53f99dcaa48ab7b2ea1a837d732f2e6732e57c7324bd05f7c1abed189a35e7b5fb3e87214d0ba61391ea45024dc2673328696329ee518580ce1111aa5080f3cb0009ab06b4c5cf45a74307b91e12256cac046386dad71a97ab5911f7c2233798820833b751a560bdc0af040bce15ca36d71398dedecc9c02664564600e5dbd31ae25e94dbf796f723724370870a8fd80b9432f7cf2c73388262738fd60333cda147fbb1662e211ce3927069f28f4e6762ba95d7f60c4ec30e7094b219b690fdd7bc405021d1136a4a4d1ffa97775683d1da2d3ac5d60f0b1435a8c4bf2934bd2eee2ba3514ae8ab8b76b9673d78603d049012f9161031a4743910900903c78e4a0e2010999509aa8b0332ee6b346d045e6c99c6d19216986985f25f4af330538f001f493612585e5a56ff6de0efc547854784e205d14bd44217b8a9e4a405b84c47bbbe9f05f448f0165da0a61b0168c9666f7ff2734ee356a51d534cdad51777e342895c66c4d355a1fbb042312e32eb1c620d75503cd1ba6e20b1f502c3294341a1e6c013841642874b6ba80da278f88e852817969e125e84b65c790458f652a32aa51e18264f1292a43ea9e7f773d59f2daaaad46b3089cd916de74d298dda9b88fe05ce69c3a31ebf1a60f516ea8669334927e14b0fa76295faad856eaf9fdffeb766ffb347aa801128ab21c9a14411dd84692b5248e64e0c4cf14201ccd33a2ea18ad3ac69776937bd7d3b4543168ff6ec1d392e7d428a7d6a997323f3bd3715e132f989d6b4db678ea6a621525e9479b4817645ddcbb5b760fef729b932bb2ba59d4a89973ce9dab9105caf3766bef36d2794700110d0c4d3f15aa259384122415c40a93716c5f105e94c4192db05208403a589439e72f5665ef9d789a11023b5bea9071b670c143ea7531e1db91d9c3f58e92e72a232bdd956eca8853edae76fc0a2bfaa3164ddfdccdf940d3cad41a62ed7ded9d5dc3006bd524e72d54f1abf78c73b1c2101c00d19641ec883e378082d2f2b32818936004f7c5aa8a530352770061845698b68a80d3d7f99873ce39538b0d5940b2ca5e9dbe0c01f298ee690609185d4b5925247c312bc44210c51d48a061732ae05a4713a32c03c03001800c75051abbbc037a9b1a3a6d584375d53addaee938e79cbb5fbb1569d8909a12ac334076efbdbbde7b67dd2cda0c88cd7c6ca9512b566cdb7bdf7e2d5af5e6969672f71fc067ee649871138655fb95275e3aaf1d6bf47279f9ff6ffbebe35e7922535987b067499603972272dcdfb78dfae9396c5a3f3cbf90c52bd6a38b516d9b87fd8a40eb5196a8ca5a92be5998d4b223c43a0a1355662520ca5a0b44b175259584432660ce94c40d61833eb9d414a419cf929832c333b319155f622c8b5e2bc211a15289fa5b99b1ada982a811c0deac0fde505ec6dc6016e246b2f7638a1eb4ffcd02753ac562f508a9d1b8651738ce5bce695f13e7dff0e59c69475701e7fc58ec6feec5e5a26f6e4399dc5041d3adee2d13ca23a296a53a7efba7b5b44f65d8ffffd3525e3e9e3ca3afd3c745fae7c7ef43dbb129a29eac18eeeda6ba5c92e2debcdb744be5c3160befc89e48a685e41da7389cb5e8daf6bed5dfdebe27ba9d9a711770b90bd05c92f60b282bcf26839ad4c27bd3525e4b92c96a0c997e56325359716fde3ffbef66b2a72532a9da08111885b100dbffffff0fc930e455fce90f42686de7725ee32e43daff040aad5a13f39fbddd9a0a063737106f0f59d50cd81e5ea0ea4f7f130eecc2d4b23f82b26cbcb7cb39e7702e4979641cebbac111f34b4a08b4527a8261a309c8f784b2a5e311a2391d64e32187de902e9b25ce6eaec054c0187caabca2768c9e38820168209c0cd4655d82401494237985c2e919dcc12f5c31c899538fd952e84cff40799e890636164a9070841365b334f88835f88e15762aa84d67f5681fdbf7de7befbe378d7fed9fd6a240989ad50a413148d231a312d5b13cf5d2cf8ad6c91d14284629c65a740c35f7dba623debbbfbd7db98c5c4f5c463bb7bf7a1738e77c984bd26eecedb23e2845c8da4e200250ce93140ad8a7e5418fd30ad58e0e27e551c300f67f9d8d2babe930164242f20467e79ce5dc55412079489d5645814d842051c1f6a1f6f8ffb7800bd8f610feb3a76e1e6c74390dd2639f246c34c3aac8aeb498c0ac4a20c67811779ad8f2fc525beabfdd663f147e2c356bb543a141b121ce27311b8d11fdbf9b680a2169e8ff5900a48a3d38064f2866507fd2df73ce69ebf2ffff7fffb0a0b478624a4c513da94e2021fd4a68c25141a4988bc4b16759126786d107378c3f48a872e9f9c8eae9ac99570f9dba5d15c7b4a6e4dec7a6ee7003fc1ef7c57ab71d7e435c2eda37e76dca82fdff2345dbfeeeedd3e2f3b2d98a4fd2cc4994a25496b3a34b0ceac493b3c771822e02e007574f0eb2c81aca6292e907a3d2b712a5b4d4d59452b38f4df10d849b102e4e333c9bab119aa88f45f7de9bc6b996a4d00f34511d49ce2906a05a624f9cceafded19310f13028edad112dee8e279efa0a2277b7f66586900d160b53530ffdbb5ac4da80ca0b221ba20bb82a262e2964a043048fb9c38a11a485467ad111975b528ce39c0d8cbca85431794d41c201c31800040001003110c6c1408fd35c3b1400030bb474bc70382c284430241c0a85816000300c1202024130000c0603c3c260283c149655f2f201c8c38e10313010752dfbdc08ae25764370085f4c91742149d5635a4c3b274d5222c790192e44ce2b451e34796564b6ff3432d26c1810b506ef095dfa8d1286f21eea36136d1b8ceeed8e481657bf018cf14e9307f40d612aa1fc663f4855cceebfa0e8686f5a5de955e10b538a90f55079375ec18028dcd95799ecc318e75d13f797a283f6b41168227f2f52e7cf2600276ec03a4e9b1c87a98ffa83b2ae03539fdea23e87044f422df9e79b8af654053910a7e4be979c1dfaf6d2cca350d394ee28add9372cc78a73ca149d1b4982b7725a0a766c682663d6444099a43fcecdd25c441c065939cdc34301e9a9ada4aaeaadc6b6f786a24bed4d1232189371499214ef400783c55d9870edc6bafb233c0177c1c4e7db2e112e3346b2173b05a4096af06f14a8a4c4f3c61609bdd349f94fa998b7e1303bca8326f67fa839ce037aac01c0d3e081aa869a07dd68b4c900a009e1d90b9b97e7a0fe6e0f7a5137b70a057c77a76b511f9c5374f83af399c0d871d44f1e8c7bf02674d5133d4b91e7c11c76ebee229833a296f8c8d6030ff104035d00bc8fb4cb3f8088de725a74f4c6e39992f36638134446b9dc73651604eabc393b1d48615dceb767ea12c6ca68eddaca3adc7c16dfc591b300fa6820513898543f336970ce16e756b628c270759b1eb9fadea75aee78e33be6bfcea6227aa7ef719628b53ca038d9d61ea529b0f3dc34aaa3ea8ea8cdb1bd626cb6aa343b908495bdda45536a39c8a8237c4ce007a81c93bb609ea08633f8383a11a90c4aeb31082552d21ca7ad121414efae02e661d12f1da851565faed8a232a02fb3c9acf85b70632af0a2486ab4d5bf01b0881a23f2b94f70d764698fad0f1d097206b1815fe3ba3f8c188c2b6412d4e22e4a38282851147999a39ed1e34c85a53f5a80bd9c758cacc7ee50cf79acefe0841978ad1eac4861ae6bc11755045098d52314f67fd002bb113fa1987bcdaa25b95a010d65e400d4d862ea3f155d75b68caef1a889ee5025a587a5a2cbe7c20232d61d2f1b68703a901a23b600597a4194c24a52b2c0a72daf3ec0252e830e99f086e828b19e77d18a5cb7f4d8e1efb029a2b8bdde6c651cf274370ea7ca59149f7dd261706e52935612231477a988f33447606147c53b4e08e3641be4cc0c535562fe4d3a6e18ff85b029c4751f5883caa67f582eb037ce9a1a951f59d903e580c4094073dbbe377a0f2f7058587a5cdff5bcf989f4380210dd26388b32b27fc4ae70e92d511a982a200be7ef6858753b62723c57325acca13ccb0ecd4fab302402f615e01261ca6eb7a45fac9ab5b3d4c8bb209effec56d62c65a721c6340ebf448dad09ea6b02e924dff7b64a775b0600ec77b5ad6cf652c609528ffb23ac04aa4466e2bb33b06825d03923fa2c115a8a0831df50b26d8bf3738fe6ef09da5097729008b91f81bbd1f45df7ce9ee106941c873e4369306b7c4c96ae4cc067ae5d0ad7a2bc8e93e05445fcec231f54fde7246a4ba20ced996931919f26981584626320e708f5c7584f9fb8ea33a9b2053465ea1a788388db989e377b2ea14b7c98d01689f9f4743f080e535728b4352a1635cf73e50ebda5378611416e4dddb9d0f1140b5810cfe6bdd282d36f09936ab2b7f771e0957ec0967cced4da44426309f1b716693b013ddbfc9109782466b848845ce4851eedc17a2b225fe56a97867a72f51f312f74174da9f46ec0ee5c8efba3efc5679ebd9607aed14c3f5702b618da4b2e3c512a78da4c338c904b92fc1c813042dec33b8d062411d01859c91e5864b86e2ca50c98f229405046d3ec8ae477727ea8d6cf9548f8c82eb372d39da5d0450cbc2af940dce3ff0e646770e0b499384926e2489deec8213983ad861a0f2daf8fa69912008980c73b967055a5a7a5e3b18ecd5b6a336a16ea34546a9dbc24fbe278aa8081c3cf02be8870600568f496696e7b934a62874d1595a20b250e8827ce40b089103190b29461a78879322988ff6e278d73f92629e0447ae50a523f10997614267d4c8e1940a29c04012478acf64574348bf430e805473a608ddf88ba9ee6a102371a5869cc681af7102fb3c033a148fa38a1422ba82b74a81416fdd8495c3d8dcbdea77b519098d566b94fbd3ef04786241f4c4c73ad67e26deff63b284db54193c851bb5025df010085a0596c503d4bf846875dada6c9c9101a1141627cf318565cf8cd438ee7097f29559b5b677ba7189aa5b665e62edeab7b147ef02a05c3a58ef85d097431c3123692535972ee6d44f14162b4d99e9da40265303843009e609532d4840f038301a990c6c051ad38b30bf449db03489d7e5b2761c600e1cad919476a2428056574ad4a039756a324f1eea34f8fa9aca252efe8e168a2d97e6b22232261d176b8fd1cf2f9af0bac91703b0fd27be333cb9beb873acd4f591db1c22f663e5b84a926ab52764981920dd20b66e83e80d5b551a2dc1d25dc8ad0058ba28528cbe2fce1897b68696d649880c97550cecab41e2289901b9a7020c46980562cfb036537a080caf7663560a5697f70d472bc07a5572df45ef3d3f24f307422a6fc2a6513e1d5499c31bb4021398a99f496d9c40ec860013bf2928d5bfefabe6b3edad21f75d2dc15a9ce83de73ca40150ebee66d8f40e2604f75e279058dd94447a4f552750276fb4d1578ee5f64eae8ce1464da0084bf35bd5216c3560249a621bc0bfc95f663971bc17e44e22c7106750d1175592f5503ef4276a11dbf5b546cc1250839413ef94887c2a39ac37f0082e6e83bf46f13b83147d0a694c9a6d7743e50d7b9800c05222854f46bdcb8e30ade958f7f0988acd9211411e0707d5e3dc088583edd10aac88d56eeaaf077183a4767bb8e478483871e6654191bd4e8534642b331445829110f3d61c40a721bcbd67db78dba0782f2d5c69b41998e76994c405c0315383cf5fe4295cd099427cf92eae12e04e58901e8b21d72886c7113d3cd46613ef68cdb3c53e567ad7c219c3611c7646f799681b8604172960de93b152d2debffcf0686bdf6cf907cfcb32e3e48dd10f900f1eeea96ef41095b044042fd05bfd170abe39010619a4b75ab075ece5b339dd394f01c15cc02e2fd0997196036e1c24998c10b7aa50702c913bac978082e54b7448379ec605ba856d6db69f8785a184d4db18d0262d197022e47e8dc3506d09035b37145f85238c1231593dc64faecc0e417465cc358708990d9144cf140325e5dd4e32d93c7b2b285d0300bcb16efdd87f7ca1acb37d0e514986fddfa6e2f7c0061a4ad705b1f4d4a71fb54fdda932a236940a643933ded760126fd43a469b04e973eb5a4983ae02096a8ced6b4c624950f3e4a3908306083e2fff1a7678bd3090d0d8420cc2cb9f23b6536699cf876252c2eb7aa480d3d90b878d6f41bd2e762b8d08332f72aac01cbac89e3305ef58a25db0361d0eedc75ca4b1bfd7851f7ae2903281d2c21f6f1478f5e18bcebb8469808bedcb6b0ab6b1d9220694b7aaea355857c654e9fc1ece982d4e4dfe37534143fddcb2f19545d447222f0eb9b1e11215052fbbd5a152d485dcc0c5024a265f9164b4744f0d7b4c27ad53bd2fdd063224836bc3834a658cf52d73131b53ae27908e60caa8ffc7b2e0e4c4d2fc70f380151ac469d547a226c5769a9a3fa349dcdc32b5da1e56ead0c5a0e439b7622473f13e64d6aeb78cc6d1185e558266b7acb6099a6d44f3ade47105e9b66db345fbe2dda1512247ce56aec3a64a6a124c0f928c2300024c5f1448fca9cd95e1d804d71606321cfbd2fe08be392c9e51c79ddc65d7e90ca268dbb95c274c2211805e3708d26a192000351de8bf59bca88ca644a5a186ebb4bc032c2821e73005a47ecc345ed60c4a08e790c4424d257227c769ee8bdf290f6e40922c2d183655590e9221db3a603d78dabe500604041fc122c759cfba846961b5e119958b2dd7d033085442bd3dad50d2c0d5ad2c77c4d3bb89c444be23c34c8f0689d74f860891e09ede1645a21ad3440de7926d872c10fc3580a8e02091db5ccab43b18430f69b2f15901e772fa09991525f7e0c27cc83826f2cccfd84997e2d9e57137f07f9c4e6b3ddf97ca8ba6f57061d87c68f9a0fd874382783108d1c1117ebd58d0d0c312a2628dce562ae7a5567c9af58228c2010f49238d03452a5ff87c33db1dd74ed9d3cc663cfc72b6f1672f1117a0e54da46c91e31db3faf0ce6929b2dc76fb5e992c18c4355463e2686a39f96a5ad89df9a096f9862ae561341f8d1b15beeb3e5d1306024d408fba13b1a7154682dfd7e2617d3cd352b0769045d3df2e4ec5d772c02ccd98ea83b5ee169f2185dc4de3523db47d5d44fa96cdf9cc8bacacdbc432a1fb065266324477cd6c2a61daed1d4d3591ba88d63dc11ec07e0b8157fc93d4a03aa71116ccda0281244cd5552936bcbaa45aaf16da65f6464de12663ca128cf78e46914bfdf357c0d4d33f2bbef967363c69b7e95d723ba0eceb38286d8a1fab0fa8c54453cfaa33101fc19a9dc81976f8cd76097944cf88815ce1d4764b7c9ed58252b41382a2ef55f97b0f8ea14305c8bf7d54700865740bcbdf2e992014ea4659b11580ba0a6349146720b1099429175ce6ddcf728cd1361a405e58a9b1e4bd34afe3a54db6fb205899d525b24a93aee852570b416114164b05d44714457894ba6c3fbec10ccd1e1185cdc5bf639c3ae7709af57dcd947cf7721d6eee3efb5a95429110a25655f5c2eb997548cca39c4ffbec1cf921e6d6f813ba49718233c113e03205de3f8dc5317557f5cc72364f5c7488aeb0ca411ae3384001b4611f9fd0102436899d573048b169770badecdea71a2303590db4145af027e077d132497af7b8748ac7f9a4160c4fddbfc97dc3760a14c31fa44a3d537b27073a5c542897f2e74d230e3419b21ec0c16386e7c1e7b71996c0afe4843303d31bf67073a4b72a3287ab46c1888ba4a6327467b2da9a4bc02c03d47ac1006b99e15b01658df5cb0313fadc9d6c96a60cb8879d25b44a13fd9245d348ed20ae8e981657f7314f9a21dc7acecfecea63525aa37b86b40ddb5cdda5a7754917c10785fcab5bc1b792ce75533f1b521b9c4106c6b1a2c3190f9308615d33b10c7bc2843cd21c069d0d9b23e68d37ea5cc607b025dd235ac21824f2637fea87367b954fbb76a7a63eda055116b70ed279304e846da0d58a08d6d03764d4354ee3b4610433e6051bd27147c004841814b866c3a6ad0bdf2e8115483f329d4da411398343bd0e9d31d847b1e857501de40526cb8eb5338b62984e1917a464470f2643f0403911e58876b1377833af5757df83c895b197e0124a231b914bf268e0ec61e03030cfa1253c371b7dda36eccc4f62a9b2ae759ef62dc78924426e61ad01ede640075c43c826a234607a64b4b9794ad4b432455f24f775f382ae60a89613088a4f4db4e4ae10e8129a1981b04575e9163a76d3f44b3c3cc67f4cba3e4db8d004443d3c8e88f478ef05b313d20f86c8d0ddce8a1d86c7e6b00854c9b3fe16d2edeaab95d5adc47afe0a0a7e6d58f6d3cf851bdaa8d411e5ced8ac574a8fe95384f550544b86a0c1259ff456fb63d56836d85f2738259035dfb0738413bb46a888283d8117ab32e84ab437a81ba8ab75dc9a3e2430ef7a7ddb98cb9b639d34403c90896da7c92abd173199799160566bd84acc4603f1626bca8c971758f7d02f1ac8878eda34a4366cebd11924820ca23a2d14338009b2140fd19f416b9bcc8b308061551e993651ee90819917f7fc98ba4f9a1218402255322406a32f156d53d5270d868542e52bfb1dad29ff750b1e9a911a5719e58c85510ac42d270159fbd5f425738975ad8a62c88c3a62cddacf32970b6eb19d6345c8c1f2161d2e49e779de3ae7db2878faca9c19688a2b4ed1a1ddec6f3793c08cc3f6d77e9369e140f5b4581136b3a5104e3b8d9fd38a7007c70a92998fa55ed00229c28b7024e556cb0a6bc51b8695a4329c3bb2d59752cfc341e2becaa09d1f91b94b784b340d419e4cb893030a763a24e009629c809c2d89621c2bbf760cb41e027924e4a97dbe68137262d824cb2f8c27d040f1df0f8b9572ce19c97453be39285b0411159429ce92466a3b9a1bb32e6de0b1ae4f0eefc0c75809dc3be818b345a18a1fc03b88de32a715ce57290aadc00a4fdf7b20a1282e2c403003a7bd01720cf4473014a1aa108497385a4d722a302314d17f7fad05c7cee17168d8b3571910a6182c9a0fd80cfd5f4579e518b0661053a2cc5b53892f844e343fcf19b99978005d6cd3e002987e34163610b5e22fa462e23f235f9d7050e030933a44fceac299a59fc32a48211bc91467b77f1037f83982a1ef42ae0048007a68340ff34c320d8ed89574d33e348557808a5f229eb2b71ad6033491eee35b764966353f039fb434cc6ef3072fa6f5921678656ad83ce4dce0c291512c6be0aa445263aecd781d89ac8f970b3ff0d78967c41f7a9c39c42068248488ce5111bc3d920e3da435f44066c06c917b7e862e596429d12ea28950074ecd2804102b81adb8b4ec2b931d1c4d1808236f21b6b16918f80ec4bd386b5497ce495fd447870b684c5835ac93af3a7cf5bb4f2346e9162670448fca58658d7d80c159f70d73b0c139fa619bc9ed38a194f012f30a554520c335730de9a415ada6d350c5bee050d560431e33a84b9098236e9054112637ea4ae08b229aeab55a19fb3ff8e207123c80a71e7a6f7e699c45181c1e203ff77c7b7b57e344c748d0ad33e9dcd7c1743e40fe867e252bee286def1756df3e12e26aee29a1d6740c009ea99c3709f00587f401e67425162da57b2e2b2f7a8864c7f29913192301226a6febc7a8ffa223f8aa150b233f4fd4fcaf451f965014a5421feba92128395606106532910d3d1db729aa57175b2339aef5466dfc618e1f24c23da38e713380ea4c4080c2d97bfb8aba8fae1684df51544d78c87031e604aa8bc87fd45793e7695a8d318014b278c6fd5156609601f64415cd2b820ed79340eae54d535b4231073e616e116380d185281f3c3466151a51b450360965ad8638beefbce41913bb2a89e91738179cf3295379933a73c19b2f99e4e806236481bb69ab1579d5374a12186b627b4ac60b9b21fc542af84c4bbee7f4bd011637c2acf39a46841f0bf35265f64552cb132d21ba302f2a3057c8fef1233dc189282f309c7bd2f8fde49b53171796b9c5e817ad278d3603dec388ea8b56a5deb466eab7057c9615244032986f10c53a224d23bd7b721fe857eabda0e817fe48ff6390e5e341175cc8d959f93ecd3063f42689c89efe88cc2d1a4603426839b201fdaa107392f8082e87f7ef9a37a333983cd7be9c0212727e32e12bd130f395a92482f096fb1317b5dd31c0ac54416c5e9f3fbab617d0ccfdf24f225f206c153ed393f9f6887f518e7eba40e3f48b33748f0b0816f5535655aea989bdc722d3466525ac88b8812207ec99f68cb42becfd9372b67c176390a8dde026d2f7a7224ae995e546a3651453e2e0ba2e2aaa8d515fe5d9ff33d2497ea46e85c0f954ec459b050870c6e6f9055913232227e78951ce650204c1b8d5984e2521e6e8a79b120a980b535717beceb15fe20306c5e6aae09515aaa5870bd424811a0e7b87d33e95c23706f212be8b1e0dfa37d1bcf0297a09458e2e0408cc5db3829cd6a61b8737f1b47b900e7dc1f349bf63eea12cbd177c50a793abdf0081660b26275c484399e27884e7b8e464c26772f146f9893084520cf332a936d143aedce43577a8532237f295d424a62371aeb1f59abffc012927519cb7a30d132d62f30a178b6e7b41521d62fc0643f8535955d012e7739babd2f5ae9f089b8e38a5c0649c322d5e117865750f36a379820a3a18cfe122b3ff6d9eaa81311f03ec6ceb6efdf46c86324d965e8a50e18bb30e2ef5c84306c1a30cb1ddc3240604b5802c1b996584d0f266c03e1644aa3c6e78938d992bc1f5884e45b488bf93499cd8162db4d68709425858098210edf79ff8d11f958233c18d2ebaeb42da525683965cd3c48e8a3f80b0146466dc581df6c1b6b8a48f68836f04725bdc4e3d67620c72a5c3920007d712b94684b91362668e99a74e7321c457d5c94f6f040f0f111d7a6de974d52e3fac392d34bbae9306f29ac382916ecf1dcca171e33bf9e06bb58d6a57013cfb47bbe9f05e3121f0612479e980049cef865e0ce5c93f1d969f57a6c372781d4fb7eb93264f1a8c1ffc9b408530ee9e06b898c463d043ba8cef57c950e16346149b33614a5e664cc444d5ddb80cadbf5f392d3692fa923ac3b328ac7842823a2349e6bc43a965dfe9820cd3896e9c5a777231a8cb0f15cc90d84e7885ba34214a36a941eed34122bb5a9ce8e08084eec99630839a9359d72b757cc807d0f143918df14d1aad1eabe5d46c3a10746bced1a35c89e8edde5164fa2269876e307deaf00f4c264a6f2aef99fd034601b242f47b1654689e0265bcb406343b1830cae34a5b0a6846e1b2bc142eacf82c10edd12d176158eab6d1ffabea19fec10652f0747ac676d63966d69c22245684ad1a5e92d24c149cd8eb4c1e65cb54c012453be4a806bb49c82e4128d08083631a7b5df70548a9c5b5c3e52136ac2a8297ba2a5ec0f0bbe19d00c5da1c047306850bba85504a603f2047f788b8533be99c8375e86fe298e6f60aa24808f48228c5da161d95b0f6924b9d5f21272f6f9b9e236a8ad5fe7a0e34d30e3b93d81f4054b64077af1603b8655b20ab5d2b7c90ba2d7d8cfa4265cb4c4748cf5341b403d3c452b68b10cae3bde8b97ab9a6e46ffeba6362048ac7373f45cf024c5d015d62d71ccab6eef06946819590da2b49be5e22265300c0c41e28cd078bb05be4350ddd128d2028f21c3832c624680f547d980690ed45535d6260a227a33c896cb30cb2b9e986abaa301551ad570ee1ce51259deaa12a5a1454b1bcb638b6c9b14e527aca7938c123281d2b35eeb81fba70f778656230ab203d7f420a54d99af848be2a37f4305a70d16183749e1bdd5fc03117ae51d6aa90c2cdb93338430106e07dc5026eedf7e48b8cd500774ec3df090d4cb5ea29d9197f3ab3570673592ebd13e8c8b94b64519806502c778f4f08d9960c137d9023b80ca3191e52e7a9c10cf8a76a1241d4f1dcca1779a7d98a8095723c06a202dc663551f3d1250385718f8c06d818267e979bbcbd7086672c081840a3ce6d0e0ea5fe0bb64ff36df2a966324ddfbef9fa817cb08981ae47071893ef6254bf5291bc9771322b52924b92f49bf09d72fa8b36c53f0fca7690dd41b281cca1801e8e2e2b7290a3435de797266a4bc223722c6a64ef16c1250d43e3d5cc5cd037792f41248888073e5ade7a6266f446deb336426cb22ea57a9d6e61ca1b3d0f377d65a023afd9fe4d446e3366c26ca2cec1e429183e43263d94c70cee9a57ef0579c427a6a6a5c1572c909d389468cf52b5863809d6bbd91a4f035bc70850df3313e8bf5a603117e79a91dc84bc281f2707575c33242073b2927082da9483687705d2256467917a23c3d108119f7d91c1d05ce34aac3d56b44c2191ab1d2974c541002cab8b95d5e300a4adb1c25930cb5a8f45028bc49d35cff99f7cbcd5f96509d551d3557c5b3ecba88aa2635e6bfaebb4e8a8a07c33a081ba140ad544a562eaea1b8d4adf71e545b1bfb0b714c60ae08d40942ff6eed0e35b32666bb6bbb7b4b29a594016a066f056f0543189de19386e8ead3c3fff061bf8a56c6d1307c335dc574e53dfc325d79b729990ee5173ac2f0b612f9f9aa8f0a1541413e6a06401a6058b431ce018257e4e7cecec9314e5575d1c6374aabe8e1f8ab7efd5a92bfd6ca5f75cc5f77ee5fa19baee16f186a71895a8c1b519cae61b882e905547410ecdfcf2a7a7e8b91ecce822572c80109461235094c86041104a949052d3056228f0eae69210b9730bd2845e82a100441106cb23536e9e260052a6a3883979e4caebdf7c661eb28292f66ccd7de7b1b95e2de7b6f5063ade08185836b87c40e22bcec29d8cf2a86234ba640e001301a07bb0b8d76a00e5fb6f0a0848519b69c5c89d2aad2e1684a14256e3077db460a04410c46295412451d3246edc2700cb2830fc66b129b4a10044150d44bf0d092e58b1a1b92b8a25b4f1e378a680d8182e2a4c7bca05bccb01b2b38014eed25bac80802791a6f1293687be42e47d9ec86979a357785a7252e748559b2821110566c0fbd215aa03202ad294234150ec2b6441719b1016c00810540f60d5c610fd7ed8a20f3c055f6c84a19abc65f4a4c7df9011b311698346350a821882c4750804a91a72b4b8c41f2d35e6edc68311fe6100029646ed60bdc7b6fdd13ad52bc223366479223627ed0ad67c7c15cd2f797db0a1a20309cf0054c939e8a592670dc3f2b4e46a55985fb403d85a5012b214a538668ca9143cc2e1413e57644126874984a81cc152474181e3b9e5e31fc9cb842ac03c7b2be352f500d972c141af3b803611886be8cb3a2b62f35e48d1e6aa91a92d7103c3a1177e1de6405458cd0a1b2467bc770ace4bd63d848eb1d0892e3de7b37f98d239326d04cdf5c361a282e78391364aa0a1407dce064cd0790ae108143b7b518f9fad660f6de3bd4927b2199853528a20826241e8630610709206559eab243882630543aa8bf38914d78390cc3102be36c18cb380da87d7a8ad62d0c6378ca1e9172c145a28cedbdb7a82b22872952be5f5593dd0b57447046091f5d6bb4175549990f04d10312321811c4088f2c245a58424735e51f1ab780a129f37863ecca0a1dc44f4f9a6bdc2f942709643e1046045c4b3878baf55c9365c81516988460044a1dd45dee14a62934cd85eba62ce28bc7de69067492f96e17242c6411522a7b81f2cadabd7a4ca054ce342f0cc330fc91f1b6f5f61e633a4030bcc0c80f9a2cf2d4a2c88e6f323d8492cfa400c32ec9499424312756e04109263fa2a67a3aed3322a5b7c872de911b06f245d513d528ddbc46496b659c1597c2292e1e6a31797b8349a20ead163ab87a612d4b8f4fe78f9771560cc3f1856b43f0826ec21425291c61492310a58b34a2c95a64e6618b872e9e264b0cd31cc1554e2da100ca6f64525382c8096160c861f505073321d071a647970a4f6b90f8788cbe1f39da675b484929b5c0f31185458d0f49425f18ae1ba133459272f0c014d1a2b5ecbd411004b5440d822008a2e1524568d93d7cda46019bf4302cc3100435d20c41a47004192351c618d9b223a74c00099613902053266ba7d35972786ae51d035243c8430e3315961c5a38a20b07943544ca1d8a04f85872c488334754dda0b104e90da9d25a86588120d78f2c345a53ca4c71f2a1e8052c2c44a6f8807503920f48121dd45047f4e6e2a14046f9e55ad32b8f4f3a66957298a4a7dc78d2044a0b2c7ce006176658424306c7cf8abe627b54f84b98499fce09403aa686c03790e0de6b07a972160382ff546c19d9610744105844e8d613cb6f07de1019a8bab8a0add478992656001b9a4ee01f4f4f509bc9123aaed2d512b59a5f0a637c6052050a1325616e41bf291f63968af448a3ab80b0bdf7de184a5794230e468c9505788259c022f8856118e223252f26666259fa8aa755d830b30503913057698a82d860e30a88941417315b5c1842f78eec64f1b8554ce3b88414a882110882208879380c4b1fc8b0078fe98bd20850b8a2001dac54f8712de1a307ad4160058220a885276a1004d1685e19be94c6d88ed9dedbcc4be0271528e1c3c80f205e70d848a2a1ecb80cb1e28509979f09da862a4accc090b42d52bebc4cd37af1d8bd337ab6f7de31bcc300972e5e64f8d2c5c9d63ee28424a682a870c4a56b70a19c0a9f5400731ef7d641b6d8c194551582577eec10e2c8de7bb310415529ee0c720982044791a1965f20088220086a208496a8a77a0451c18732589c10918608a95711131aba44216395c40b5134153461cfd44936031b4c369a4a281b494c9005961c430241264926b013bb140bc3300c4391dc1f0fc3e6636f7b5137bf446d37d3dbedc5ec610fe3e68f6ecc1ef6376e3ef6457d085f73c5edc5ec691f6396decc9fbdd5d1d25b19e326bd99b38f21fb595a43098cd9f3af417bd9c7e07ff337698dd9f35b99de5ec8bef630645f4b8994944f94c2e05ffb5a4a347bfe453a6bba38a2a5444a60d07ef6444a56a7d937c0ea6a9430fb595a420dfeb5a7a536e36aa9c518844f7b400eb459fa198771b6fa61c948274b9962b06b6a70fff53230d0838f571a3a68f501614c2d5685d0b8220a02f8fb43f41a61d5ee74081b75fbab4f8977103a3dd4ba2c6bb5f3d4d1419283c5f197f6df5e70830f3fcff05967f8f430dd00abf933b0d1c1ef87bf5a2827a4d7c51e84f051a758fa01c6e5c7b2fbabed1ac3bfbbad3b8ef789704ec7e8084969095f214d449e923c19c34b63847bef15bb08a632b09a878af0d5764901119558cd6106f7febd415835d153cdb8fce4cbc7c5101cf742bc87c836e75cb6e6ded74675fd1f6020fdf76f2fcc877d0cf361690cd807655c7ef1d7f15de41cecf393af5b49ae36eb5596af1f01e77276d7e828ff4dba4a4c42663dff25b2cb5f92af19f943c8266a75b0d7eb757b7dec958a503ef9b02fd211613597280cf361a999bed55da48ccbbf7233bd4618838c4b477885e003a7f14a6758ae9eff078ae70fcab9e7437944575bd5cfbe065dc0467dce61ca6f7e61b008143dd4654d67475551a000f1fd9d19e3f2aafacc1e06ff21ecd3f7d36ebe4857ab3ded61d49ef6e0d35222253729d1cdd7be4847cad01bf8e717e966e80d4c6f2f666ff330666ff3e0dba4444ac01486eccf9408e7654f74f3b30d3090f8f957b183e0cd7fcee13cf836f4b4416dc69919971f4cd7193e5d4437a87571f1570bc542446fe07fc6e52fd2dda037301501c6cde388d000ab3b332e3f0662df00abb3799c9488e826b51957a40b21e7f2ed7abed59de967dc7eabc3f97c93de5ce0fc2d9636c0ea70529b715777f3b7185777f3577793fae86c529b8b7436e3322e96bad89fcd94a7af743dfb88ae337c5a60a01d8a35d4ea64a8d5658081c49ebfc50662bf66087e888a3dcff051800d9231489c786a336e27bf8a4c1c6691637fcd5e9491bfaadd661cf936a89b335486dacc519b7131d466b20481560d8265edfc1d143e3f412a3200b50833cb27ad09fe45cb74f52167f8a062a8b16a49acc904fdfc0405815b3f287c7c2ef033e3e76eeddcabb377768af6bd3440c57efd51d16f0f67a12c1488310c5bbe306db9b2ebd9cbaee72fc9d85ebf636b73e4dbd102b5c057f1f3ab28c8cf7fbe4ad3444b7e57b1e7be8383bfeadb8bf15f0f8131b519f74a6f1602e0df6cea82fcd75b5d16332eff0b1d519e27dca61f6035ff4f12b75a46073f3fbf804f07c13e8dad5aab05625d45ec4b9d739b7fc4d22d8a73c705c6597bf3ab68f32bef64edc9dbe33c794b31758155fc26a238ff272489fff51ae7b8b5391312fcca4ffc7a926fff046a2d4e02d45a9c09d45a1cbec2bfece30add1576a9db9c048f9fc6083867e2f1bbc040af9f79808164287227cc1426416a310ef6e69316c57913288ed729b94f92b7c4419770fe44d7a27e9a2b3070d7749ddb75d25b0bdb759e85ed3aa9ce17757b4357dd6f3ae86a1fe7495c5ed496f343b8a8df50fccb4169ec6e4bb38fdb83f343f94435565f6fcd1538784693fd4dba8a36e9ca6b696971e1c76ab10f9f866aab863f43ad55c397a1d6f218baa230add4bad3572b25551b8bf8a040a1aa3e3ebb68e3fbcb6279f2a7fd1ad4ad6cf6365d6980249659fc37984539566fb05403dc611be09c8e110c0e70ee28ef9c749c3b227b5352be74fc3330d0ed38cc93a78e9f06069a75fc2360203b450354c74f748f70eeeaf0c32e900de3a4d7f1b7c0403a878e9fbc34d4ea66a8d5d150fb3334841e7bd29ab0bf682c85a10f20c3df45b73f9403f9b9b53d617e32e685671ba222dcbed6785f6b442c7807d39ae5d127d6c138fd361f5fad0f0556efb7c8392b9a1a800e80e2f7f5e7232ba92f18f85834a5cda956b440e1076ace89f9832bb4737bb4d9cdbeaaa2b65739575a1cf8fa77c0d7e0af36e0af1cfcb58210edb100b0ea002c4ebfd66fd3b550d7fa02cc81e5d16f01317c0656f5ebff31bab219c3ee0f616d55f04354b42a985acb03be88bb969024a4ddc1e88a42147316dfe2551c57e4c0b7adeafbf78cb4f397fd7e0e722ee7f7cb981102069afd7e1a1848f6fb67a80ffa93837ec6ad3382b05a7b6b3240c46aed6f68e75ad46d1e9b2b6c9ebc369bed59d86efba23e43d7efb3e7e82aa3f3bf4157dd6ffe44d7dbcfb7a1b3f24471de9afc87f00ca5fd8916758e43fb1b74c5bf4efba16c836aaccebe86f2d4627596835a1dff187f187fb37ccb9ffc6bae90a5228ace533086c24cb44c575deeb4bc4636781f21ed0e693fc06a06f7d3d32502e22b64c60757c8de6248f6aec0adb518e6ab327dbd47492c6c016cf0f5eeae80ec962c5e80721f7f28e3f29973aea281d521df902edf5d007cf0117ea4f01b0256a71b8cf15d94ef748311b35da739f348112d18292544c8c0030797138a9254999272640a4b9518194c2b942122041a2a231a48c3820fa91ea42875a919f783d58cd5dce3916cab2c841c42cedd2616975f4aaf62d4f3ddd273be523dc0f4ee2c0f0fbe5e21fa5bec219b651d1489ba32bdffee706efc5928290ca42d971cbcf55e652323777764366dd16243dea245a9af972a8368074e4f6807313ca11dc4900468fd1130d0aaf6bcfed0c040da4a87be969d4cacdfbb46eb67a1bbfe09c2b9dbcb7fad1002b278b13db623200b98dcf56b9bc3af635d254714e9eac6fc04ab99e8f23006f9c75ff998d6783dfef5ee5ebcd21b07d0bd1e7f89728c417e123d332eff8d22ddf844386a9030fe017445baf18732794d0d9c4818dfe99572a006fe1274d67431a6445717c5736e02a72d463e6c31418909ba6ce2aa4c921041b48c54d1e5d8d60b647a5cbaec78d2e5bfbc9cb3523d8c682284168edf0dbafc9f73f8653bee16c5f4c4322b6211e35e663448db8b616b099b5b1efdb12c5cdc32dbb3f9565cb73874fdab4fd7415ac8e6b4c5dd2b5dc474bda34318a64e35c617fffee6401c47510c6d587db151be272247463f2b2a3ca6a52d2da9a8244f484757bf1e15214c5c5b5452dd070599b597f0dfd48a5251499e34923ebafaf5a8642199896b8b4a6a9704276124ac2ba8de6dba42bab8aebdaba5eaf66357384e63b12bdca6a2b63c2a87e2fafe60d5e23a0a0ec5578ddfe254679d7586f95cd0661c6efcbae3544acc0ab74f62abf54d57229d73865d27527cf2354abe88ae3b5d7c91fffaa29871a2b54216b83df9d7db45317685cb52f1495d8a18c892312b5c7cf25e5c62f1498b6fce7a779dae44dd5a1e51e4c223aaf31e3e8933ce62f843b845ce8916b8423bb727f3743dbbe833531f59a23c7fe63b1763d85a42e7e90ccb130256f3ab39c3d2f534559d66dc6d52bc24d3b5ecfaad087744b3ca9b0278079f7750a73676419f4db15fc3bafe3577fb359ce319a785cadba351dc6d9ed269980a083bd79f5f7f50ce8529bf3dfac3cc7f4a4e00dba3df72cb85bafe1528c8f2e8c7c08a879f79ce05fde83f4ffed36fbfa8b5eaaafb15bab6e7fe0dca7fda206b79eefe6c2e60a74ef7afc941f8444a6e4a5a138698eebfe96a817e3f7c6caeb8223ae3ec1cd5a0d4198766487b85eedbc75728bffdd1e6c4b79f5ea1fd680afd362766dc057aac6a8bbb2a56f5c72ccf7d9c05ca56bde94a6377f06fb72a06c25debbeaa5ddf05807f43405eb3a6879fb7bd3d2188dadbb3df6a00824fd28b22e73a3a19d834365fd19577f285ec610f01feb1bf321997f1db0bdac33e86cdc79ecc6589de6e2f680f0b60288e2fb23461312e9bd16a363738a72de7a6634282138fa613ec505081052aee020000a0bc00f76477238407542abc1e6c53f65b00d533abceac0aa27c599aaeafefa7e0525da91f0d3c22eecebdbf222e4c70afeeefa7026f85fbebfbd39b75b17e37a0a077eb6a150182bf5d97cb8c9a13cd097c848dccfcbab0511292cf260523e125ac6466ca4644a9efd711c274028199883499b1020437257932b33b79787ab2f3d9a8e01da68279669cce1f30afefc7c150b86706c809b8d7f7dfe028ec33938367cbb1df864aca779ad95fb3aab2d9e2d9d84fbbfaf96c47fb675958fc8a770681d5f7cbb6b47c31ece7b80b73cda678b62afb6347465e4e218cfa7e5812928f05a4bedf5c52e25692f6974298684c6c20d2540b625bd2d4f7bf923cf11862fff864b78309b620bbbe5fa4c22b8b387de0f5fd2154cfc41ad2ebfbc1285f8dca86c3d7f76f2a292ce7d67e6d5505c5e6a3aaef7c957f659c4e2532cec2025226df9ccbf0b075206be5aecc55c604247c9d315d9cf50643717c91a5098b71d98c56b3b9c1396d39371d13129c78d4921694afb7c05ca15f446742508bd51d0a28303538328211c1d3d2464948b3335cfb2758529a9db1a2d4f7a742985e38f8ce1130f5fd2891a6170e365e53dfff499e64596c4e9e2ab040bd45d914f9f76b34e7468573395818e7c50ae59cb13dfbf7dfc0d8143921b03cfbb78faafe9fe72daa6f333fd9c5a2f0b0767d3fa6c2cb4fce1f0faa072ef19de9f5fd37ca072eb13df9fa7e4bfe092a29990ba711527dbf045655562c9c6b7455df6f425fe99f158f9dced2585626a880d5f7dfb6b442247a5a7d7f8eeed25c5c8d6d4973f5fdb62323b3cca966ff99843452d99890fa7e9c252572cb69a5d4f7df086102af3831f5fd36449a489e2d85a6bebf96e4693be19d4b3cf5fdb4273b1f0dbbbe7f46853722e1d994787dbf0caae73b77d8cfa37ce40b3df6c7a8a44c1f3c23a9be1f6655e543aaeafbcdab9fe6619be1d7f797595862b75b74c071a6c1eafbc92dad12099e8d8756dfffda5d9bcb7726b17f3c32e26a783f8cfa7e318a834958dd0f226175bfad0852df1f9266945050eafb4173cac7240353dfbfcd295e130c4d7dbff6f294e4a9efcf62baea20f9baded974ecc29ed39c9fe5d93f846d5df8aa63d4b78e11cef9c0748c62a4c0c96eb790a9a1ebcf688c14f8ee760b195ed7e99a4305e465dcfeb3070ef2fafe1c5e0e159cd3ba1ca8bed71c5ecfb1caa9a5ed664f66bb59120cf4fafdb3a7199119138d97735ab77b7d7f074e4f30d07a3b707a32f345f54d6575d56759b3ad59d75152df4b7dbf5d6942faa611e99b96a4ef19afef07d3581556f7c37eb02b9c83fd5e61bfbe1f86ce8460dccee98c09abfb6362f89af3033ffc75c6d4f79368ce0fe7b8119291916e15fb9af37ba15ab43c423fbe823d193a4af70c12a40736c5fbe0e3cdf1117d1f3c7711f4fbe0637f0e3cb029f4db97f1814d115ad04cb71f012ba46f4f7efba815715c002b01d42a5bbacdf5fc6479f25bfb15b040f788c5e60a8c8f8ae017e907095f6defde7bcf9cab313ef9f8f5e290e5c97f4d18e393298c575a028e02846e4c95ec74047d856ad89efc794dcfda6ae57c585551a74496e789c7087e93fc2ce1f9af5116c590856bcff165aa7e126c6e4c39b8272745135e3c47d7a9bdb8f5bc1db05dbabe226471fa49b038fd1d90ca6142d74f9ee8719bbeda2e0cdc7e6b58d53d28f0730058f86aab886c8adbb73559e05d5a736ff02fbaca58712f4a63770fae50064409580eae10f8fa29603370eed0f5776053ecd755f6878e25675384290656084cf9edd15f643960556dc3e2f408b7476b1d7d03f809f440060758ddbfdaaa206e7bb36b312cfc2d8677b77148b5c58683539bf56e7ef6341aed3ccff38b3a0e4e0dbdb9f913e706b599fd8d4d9a6db83db3afa12baeeab31fca34546395bf3557d87c6a78dfb04fc62e8bdcadbd1b639243f19cae258bddf5b518b616751d8b8de1f6495d5ef3ee2d8e24f4fc2437bec5a503a0f8888a4fee72a3bae7f0d7dc039230a8742cd8f5380d2ae5cc0c0000000103170000180c088582e1a0781ce5380ee40714800b5ca038604c208b0463a1600c08830201188402180081008601208e81000c63a9cac5071effcab56a5f71569aab549c4e260fb072adda57392bed6a79955ba1ae9e56d715d16abc82baf2afba566cabce6a6ba55ccdad5257a6d5e58ab012ad4259f95777396106a67d25bf0259fd7a657738e23dcf025b08a564bdc823bf36e0c1cde50c961e000fd7e9dc79518de94b8da08bbac7838a7a94b8fb745ea87f0a6c3a97625eb1f802b4e0240c27af54b846fa84cf7a5e1c2af2685c0912d5d27991879d028c13b8c5771179b94fd03599223d933e5ff4ce91c5c00dd2ac83fbffccf309b6c8141d29d81ba92d77a9efbfd00c8eba03fddfc487b5bc2cfb4a24371b310f89e91c2079df079475c2594c8ddd68e30907304c3fb852b42d80d1203a3669a53f7b82461ea3759ac3aed706681e8281d3286ccfe3b0ad2fffdb8ff84eb3f9e0ff712f448a3082d9e855951dd49d5b08b0cbc6c798fd53a1a8fd1079f93c0941302c08f35e25792909564151a46a357dc8f99c9aa0d7360829e9a93ab222418e74238b16400e7d8ff9af45a38221190ccfb66f1a31a41ab467a7bc21e19d3f0c9709c6b034527ba04233eaeb9b8405ba90bae58e17bd1f8abc4f49b6a81f2a9b9999a69fb9b27b3deb5e3efe8aa2b9a13d6b59e557d02bf3d56555bc12afa057fd56ae55dbaab3d2ae2eaf722b94d569655d11ae8a57d057ffd56bc5b6da596dae14ab833f85a58dafcae5f459635fcdaf0e1456eefd7329dfa00c5dbbf71b38be69d39cabd09c1c4a4bf7929293fb60042353e321fa7c0f0dd336dc9a326ba9d24522588d4ca9da1b640886a81b2171ff310f25d2d25004834345951eb4f25e69f6ba255bde884dab15f7d020d785088fafe73ed00bc2ae66428206e5ffdaa0d3760819dc7b1ecdd174fa2c231ce97214cf8cc992a76c36280f36522e5cad108548980ca3dfa1c9794637a12d8e1c90a7d470d40afd03d0c1843ebe0900efa9edc34b03109cbdd96d60f68f4ae06deef3aec3789eda9e8721e072611924db7b0659a19fb92b0c2b2221afc39c41b7f8cd16064b83da0c5ebdacaf1d0ff30d48af8ed92916ffb2c367ba26123b3e61acddc8f5d42cbe78548767e68996feb537ad5df1381f1653f8ed8a48fcf5798b833c2627b1f8cb0e11ff48af1f7591b3e1542a5411175290086b1430beeeffc2c24e33b146161795537256319b4009beffa47cd40a3bdb805a18754ff1cd212ce1dcb3fab793373738e1bfd011cecf9541150b5389bf0b0b4391014ab43068ae7752a26a36ee4e1d7d49f7d266ce2da3f71fdfe6585539ae1013dd85bbe6e1651c215739e7ff80f59683f2af23d353ae33e8f22c1fd4d0390034d9bd42df2338c1bec9732c54b919b3fb70ae4e4b9cd76d0b41b434dfc788f5c008474e4f23832ed93508ef00f30aa0384926fd8eb090174ec04afd3c0ba85e7c29f7851af9c55586314d3647c1c19db1beb5a4ccf517af5322fa7b3706f633ea4af471f620af8a439c63ea460bdab3b7d6bf2eb98504865b8fad9bedd5d7c56ebbc7bf5bbcd4986350afbdeb59104baa3e769c2125e545a498796f4620d70a6c356c3611435f68010e5fb4f0589ab1d09b5a30463333e7bae4e4767d534f60e5cfb5b89245872eca4a16ddd70890463511f2b248adb3aa4eafd6426fb45456822b1cca90a85d86e312aca594c4e91d1ba4b6a693970a19e7acf39b59f4ffa8bff2cc6a011d8b0662a810d0a80e3f2331f60596e5971dfe3e3ef8f0a9870c08455daeec508682a0b93897accdbf477516e34e0103b55cc08ab5711a2d697860196a3d6eb0e4b6344520c1f26ab45c2a024bf9730e0cd17ff604188587114609155874ad00ac7f617d1dc86d4fca199b33500633fe1ff862969b5ea8459d933dccc2427f70852c77aadaa6b47859f6b681dc80fa43fc61f015e68c3063dce1394a83a3076212dfdfc2850be0c19d2bcde998050943e832b7690a7d383ac70d465afab8061aca7e52ec9555784ee651dca67b87698b3063aa6d90ebe21a4786878896d1fe26ced244315a6eaad699e81327da47a0cb9b9e946d8a27c7702224dfb72887a3908ad705335d422a48aa7dcc3edacf418d2c7364072ee796b1c8ed8e0f436f1a8b0b120d70e0d6c8bf65d1855e52914973811cddb6d394d81fac4214defcfceab2c46949926283875b8a4fad8d1a701b3c92db0959e6dc503f36ef7fe0d3e22af5041acd45c19a01e6cf707105d60d050992d7e11105e1367e029ab6e939db4b4739bed56a537afb937e48914d12e74d12f573891500d6ab0088a943d1a371d5de0de042330925d68f6389a0795f9f19f40c814f58666de58d8f788c79c63fd5854fa0e34f7ffbd5a3b860865254262a184c1faea0c0d5b1d08e032b3736ba6642888f86c08e1a62b20914dfc976b61a8935d0175cb3a282675089937dbe92b27a97e55e635582ba9d13e08c5c310d4b34cfc9c1919c292d5f34ad0047ee221c7b0d1fb280e383c90224165213088e47d9c89edad370fe676faae88d3c6c27cc9cec61b3a26df0282dc60344119704df52c015a7e350d666d3dbcc860d96c77abc9e4c98657f92ed53eecc6b5b3ef582c809e1cc7b21ca6a10ed239dbcb334c1c4582681ea5932cc4b88490c02722e6e9415daca71ad6933b209838865801e6d5a95f22ac15098b09ebcee5dd5e9a6693a2864e207371fe6fb606ecad1942f24f53dea01761542c38aa8c392ea4d677a82a672134c720503d10288eab9fa4bfbe5763d3c66e175e04592d6c6a6151198a82f927e0e74a00e81724390219a2bbab8b12cac780a553c32b01880cc60b31f813c40e4bd027377c5234e834c265763e4a55d82c1dc7b48b9340a2db316be98d1e4be30f20d35cd0d2887a3e5ab7add8f9502b0c42ed9ef863ccdfc136c676c176e6847019aca5d2058701067241a15432398cf32e5412ecbac90211dba53ba1dfde52c403cceee1d3c06ec6182351e58226e113384276033f45843a79fab2672a9de09cf9f5b36c59d72a101858a2b9f61c3932f20a5b08c7355d67ef95fb9f2e40ae808096454f2935c010d00c4238ed766ec6f856492586f7ecefc7b9b36cd5f92ade17a6df4f71dec4b09427862168f1a3d674c05b2873bb227300de60269c3abe06bcd3b1258e6387c94cb859fa58fcdb8ad80667bfc0fdf04c60f500fb16cdee5e7080f9babd46d72a5bc2f44d4c84d05e06b6585e9be34d36dbfcc1c85996b14eef8a101e24d70a405c954742e65088da8e7fa32b0faaa598bfa4930ceb0c1438ee048d748f85eb0f44cfb6a1a92576e3c9868dc5ab8222f106a7fd90ac015f6d1c023bd1c27c13bf4c10abb48bcd1d37d72a6f43637cd9ac5297a23d1ce919ca5ac91e43bf438ae5f372c46b8448d3aea85bc279e94060d31c163a7ce244bb6bf58ae713184a06e91993721da51743906257b513d38073790e56ac2f31883221db6727ab8e20fb5bd54a7889f258669b7b6100bd33839a67dc629023230dcb98952fdb1978c2358021e52dc6c8c2b4560c4652f547364c1b2cd7f76077c16442cdccc916b45903726888a48dd5be867bb7ab81f2bb67d19435fb2371636c184b6cfc2f86d89e7b3e7bde1ede64a7d4d9514f981d47a68595073794b722082a0d1c3d765ee3e44f13fb6bf843d47a7a02464378a6f618b571856e2565452ea00cc97bdeb24a024b693c77053e5f032f03c6e3714765696dba62799ec84ce8d64ef9ef2ae2708eaedf89a7a598b4485262c2a39f8c84dd5bd6cc2aa9362d1937e1c9c89bba1a611e17aa38b8051b5b9c4392422b5da4b7ffa97c86e3452e552c015d5c8d17fe98cb9cdfc90f1dd823d42a736d8d4c9b77478c1c7ba80b8f0a4ac5e2ad4d87c1805617bdd03500f0f371c3a1a7d2147996f3e46a284d4d4b5571ea9776ca2a299a644a84324f1ce8726c4ad9aaf92e6dd98427a018da8c3935f6ab897ad8ff477ec1c7997b4bb854a44bd72b3cd02d9ad741266f78c65bc4bf94f9a298c9e1476392e21ee5a567cae21183a37ff05409c7291f0fd7da9f8a13df72b8c23025801e1a56e084a5c2e88e2c1a2cbf6c835b45f3f348f90ba155d749e3d6e765b552cfbc65214427102a92942e564992e2eda50fe4e467a86b8e298df853e1a9068d83d416c1b0cb4e73885cc44de21cf7a468280f5275239bceb64f7139df23d90b8d1b9d8228a06ebe4628b8a7cc8287f7988940aa1b53ec7c84ccfa668d1c638221fe266bd3a42eda546edd018884922f3ebce884fe29e965e2217b804ec861d152b692fbad91bc42cf1ce8b99ce210de946e84ef47f27a09595450dae4cb26c92f5c91793bf9cd472b295c92d4dbe9cccf26457932e4d42970ed5bb0d56ae00fda9b8dd1546795983575ca76a878a1560e93a9664dc85fbd10619ab73b73735651793ad08d95a4c763d79892dfbd2a40b932d4d4e0265bf98e4e5e42356160b6a526e4d88700b78b9da62dddbe919e29c883b2a1ff8267339fd79eca76c539a4f78934e7851cca74f3e66c7375f9f132e4ec56bb3b6ef7f668d438a1f143e650932f0410e679e367c763d392d4262a660dae65d7e30e1e597b248ef9113b985a994c82e3fb247570b6c11d93f08c71eb2abf264fbe73e52dec0b38eb660e162611c534c604653919466316eb49c41011465bb9beccc8435750f98bd173aab5b25d8b5722e8f6a765db3befca0f95b1d46142dc364c9a3be9cef7e2a66188039348074e240db7848f99039c7c8d03a48c03013fe8a4e6d783a4a2843a5d30466bd0941b3ea2a988cca78bbab40670c6e371e1e21643ac704801ae82217e66b08e8a0a0c7cf5dc84fbe859e2e71ab282ba6e8d2ca7cdd57ed08fd4e12b11f6c3c8ebf21d1479a1cc634638568b7c58bd09631025e508607f5840732962e1617ec2cc23dd7979f1b5797f8714cd2635ed856db8a1d22fc09ed25bc5b1ac38d416f0e2555244c1e8218937f389384b8ac5b4ffdc184a8d92c6659d41e98c9eac56c1d0fcede5b463d93c866994c69ba9bf7c1a711e85ea1790080cd254487144a3c7a0ce2cc8025b9dabe2f02f591416c322be9766def6255ff6a47d1cb40a617fd72a2c3be7e828e6a9f3c831d97ff907d4edd3debd7078d68d045cc48c8fb7116af8bd7152637b6100e4ad94f94fa83984048343d8aae9c6c151f4341b5dd8c8dbe3f7fc2c4e7c3ed2979a2d3da995b3a3f5bf6476b2b9edeaf6f8f333b95cfc608da32323927cea54a773114fda12d35c8f20d4749a7ac22b91771a197752d9155442e011b68e6ef5b20c80c9f88490b8ce2d024427b23fb25150ea0e7ab2a44f9a14bde9901d013cc58cc5df95cf759a7bca9d323bf622684d06a395d058190ab4e9b5be130c8d2376324bd529b10d5fac876ca396315d43697e880551127516762e46bc95e126b36366ce04ef0d5843b9cdfac8bd70b9e5ed7077df4352184e783881a7bc55162997657d2cbfe84b2585c40436f92fd378d2441c7385c7d5e3eb5072475bda8342f40a03b61c5d0f3333b010f8b68c5a660f0e1b49237d4374f6c4a62e9bcde10623b161130c111f5e59f6548c558b46d08a73154542fc2453edfc2cb2f69a031ee6f18781e43bbec31136cda157665b96e1c308a47e1356c4dcf204f0ea6cdf1c418cebb6cf70e9247c9d37f973442becfa35ff7bb4a1239df961f30dfe3cf85c77d521cce6265d2e13e0b43f51d727555a8f0e261f3d59e21d8995bb94660b5332bbc3486a217d31cfb99ade345460db2aa31da86377f58ff393fc479afccfc12de46ce1ebcdd2a35946cd6f7d370f7437864a71b8a30963998268cb96a1470046d7c7f57c86196ff6c9e2e6b8f8ff11d3ee0b699cbb5b975fc250d81d091e131d5467689c49a7ec88b054f13876a17a04455922516b278ee1c8c4bc6540f73959a82a434732cc0db81647ff90caa2e88e522746bb6461014d5f19e84f3be84958b990e1ea51534ee1f85f289633f5ce168d02e21b0017c0f7463d0b65500c50f675c81445b6ccb0639e88ce5d493a5cdbe71621a2df6245838bb66162f88cf4304fbf4753496d0ecb8b93ca92f8e6e837a14104ac7da1f4e2c57008a79095431f416d2c6ff0a72c918ecd8a8031a2468367a68f19a8fea12752879561caa666a0537693a6618de8beac3f50fb4cd0e8872651f987da8808ddacaea2be8e3892ae03fa6c26927a0ca8907a132c85e828d8208f4f0131e04c42c78750874d6960ff17ede62dc4b9f36004508fbcccb74ea7cd2222aac57e4c015a5ca327ce70fccf1304af971f61e031d2ba6027235b5a5632e632564859800a92cbbacfc34eb438c6c7036c11eb7291efa085b24cec60e845b4c8314924937c95585c6042aeea441bb47b8027a307ea38b3e360d80dac1f7b1176f4b8eb5005621bbbc4c1e334e2fd8abaa86bf6ed8b75dd4cb4ebc14347ab5a8409a34af9035d2a30df2022681e18b7d40f00b409caaee596f9cac3f670843d8ff95cce18b27b984ea2daa457316de510312d65329e38af1203dc017d7fa0d0437d371b296d083f868d46ce160255bf3d22aa50155bb2575ecb4bee4dcb7b1b95a054c086ca504a4b54e12262094aecae4040be5416dc84431b74ed2cd33b5a0ce09736211ab58ba4d691c7b64447e704635a641c25ba777863c0aa7f2b29f4807ba1ed235adc2bd009e430ee89f2173579be6ea2948f83be25ae11ccbad03cdf601dae3ff39a64e45b5a07e506d77426a00118457e13d335bd929e9248f79f31de538efbae4f73b80b0c62636cab992d9a2c71f67f7dedbc74fc37e0a0cd68735833c1073324983e45bf921a69b084fd492f48b725d3a35a6489b6738a8238a6eb82f952275966a24cf21a8885323fd9ab998331a21ecfc8ae546f4c425d2fb287c5009b6d27ad8a9a31790a999d2e1e67594a4260e172e5d9b29b94976135cab32176ae1f6970af6eab04597bf24315fbf965584463aae7fffe022cb76eb15d91eb60852e6d2122a63514c5db1e41b2e21a9f3c4d5945268891d2c71eab9b5d4024cb19352be4de4e5d2953a44a4116a78a3ab31e3ee6cc6c1b57b6d41fbd3eb931ac98f6cd6cc8279ef750f1ed17b30e55a1c22d173735152a3227de2dfceba296a0023fbfae8151c8889c7745c81ed63582c67c36c6a485b425d501df531c30d12c4dec50371e708fe4da9a24dec0434e47f21d0ede83c94e3e3928e37dd425eef3072b9120108b5cf2ed8178052332f44e2baecd607412658e4053a5afdbcc712b113590d619b7afb2b9cb5ed4d4df6b8dc9c117e2f6456dba99ad14ae3d341493ea5ca22d52af9dc4aead3b90375c02fafd27fcef3ecd183abc88bbd647d441b4d7aa4cac99c4e0c0a27fedffa10e572302c3b51ebedbf7e9ad01e6e099489e7b2cd057f729a44a3848e785ba07880cd3088383e03a87bd51f908207820e5e52bfa03ae2fa2e5b3eb5003c263fe891f3a0f630def46c59431f55ea59f2aa9c0520fbbb31a68980d94b56258cec9e0970d772792083303fca1b86a6d2bfb133633006fccf702492ac410fdc01d26614ae339c3ae3fe01aa4482e3bf95c6bf312acb5b52e888d9e2446971ebb8ac95b4815b7712ebb890a123c011edf22cc9c0ce4a83f50182ffaefd2315ce66ab3771a0a28e5c446778e939eb57ddb8cac909a32194489979fe9f8adcf178d03ba6ae9b50626ff44e4fe9ea3e324e0877d923d5320135bf60538a12ec30fe477d00985b2ec13a3ccd15317ed42b26933ef6f05151b7dae06965770a393d785d6cbef665d89a5695803ea612b61c637d303e12158c7425cac5f01ecbc27b00e6ce9caea18b8b61d8c79189dc59c9d773e00a5ae5caba8f742d9ad321b5d83d286cd3995ed83d37e3f30c78d845dd80279fe9d91651472d4216f5a089d83a435b1267c6d23f23232f9a260bde4af562b95c7ac6b28289e21839b5b2d5e63b349df8b874add251286998cd4ac70ecbf0c8958e392aae16de9a44f2ac8dbf9c288ff5257da6e4113f048c33a0d69e4383ccfc38c9226c7f90b1ec4f1e527dec90f014cc46f239e0dece0f5dbbe78c6d7fb84ef49f7e3f4ab070ceb9395ecbde4893bda5100a39e4f322b907531a512e1d7792e38f90232388fef0a63594fa2275bf9f272bc544b16bff8095397c407b3ff0bd2765e11f093d9b0c4fe5d967120a3ffcc5f50b81b7ae2d80a875d6c33096b4fcf91050da44e14c074f383275333a908a54027bdd0fcf88a7a47f6e336dbb2616babbd67510008ca2b2fbd788300d455261de0515b84f97eca7b5b9c75dca0291a9f246e8f0f107e2c1f49f4d97611f09fb0cc8f2724f5d60fb92b2ab139ad202fdc37f53fdbc32ad392792ee441f46893263e903fa5ed7487c4c7feea090c4c5f22b24308a656fe8b954837579acfa13755e220171831e700f10d0593ecd7ab8deee06b6897882b81b62564440d38b2b199d78429a757b72042407510ebe6faf12a0c34109804e10b6092d5cacfbdb094831b7881f7c5bcc595055e753c04c9a32659eaf62076ab66e72f6e741a34bcc6ac465ff37f340e5801f57001d0cf7fbacd4e33b898636fb45f55c5eac110ce6f523ce98e2ba91477c8c112299621a03f7680ad5726b9dbbe0f695d09a5d0d53555635eea67efbb3ba62e81de0bc899f35273042e6ebcc111446192952be3ecc5f3a77312d2b2f502f929bebdba89c4d2ca5a7e0eed5c91686fbbe0f9cbf6b7822dba67e18925193563487bdf9d48cda5f7b867fd0d9e946c2c3b65d8c7f5ef74efb2d94434fdc8f5353a358a7a81b88e7ecf2cda143d30aca5939693f79589131cdb8c9a333e04b61b200658f96319e4a0edb904be861eda5eb5ab798d15e3de869c79b8658d2d3bb508cc9678ce88510c52719244fe27d3cd09bfb55ed033099a157757e67fd4eb38709c5570763c05b9601d165f73edf3a8a571a6a9ed9c0319602f4348f5bc7e7ff9f835b63e8f24e30f48ef387cbd32f19e128f75973b0abde544209f4761a150059d1a88fea7c7f8e5032b608f79576a423b8b550071ad0d4e85f4a97476ad917c448d42c399d138ffd04615ced25c8d4c0d137dc1f151318c5730fbdb4036f11edfcf0b69f86dc6861ecb8f1eda7e9e6988f82ada026269f82b10fbec52b6bfc8527695a9787267cfccab8b82498f2d6ba781a0ec47061f39faa320d281f29963d54c5d535ba5a3466622610b69afe88d0b05dc21774ac75d893ae0e4805aeb66e9a44a6a6204518d1b08db5c75ca733e76d4d9f0e8ab5ee19b8690dc983a43cb38d935611efcff99a8ac060e300496ac0a4caca743afe923e1fa553f25f20202a5556b6d42502b0bc03fa11eaaa9c14ba6d4a91413647cb3ba5e8aa0d5445893a8bc251704cb550dbafd5464a533873af6e640804f1484818b564ffd8b11df2378ac995bf5e810af366771c3625d1e3890fab8f39ac566ed3d3a118ed95c8955469457961aa7c3cc96a055c6ae63df4491a4b2f6ab0533c6eaa2ad031ff262f4e30b373150a219746dae2e4c0657cdbd5b323238eeaa7c8a16e3cdce3f368a922e0629a8fc4459930304310991f738bfcaa572e2fc9e04e50d80111272f126d8bd04601fc3af8cd8cdc5822d22b34375ca195430eb8581ed48a68a6dfe5d89c08c463dfa18ac3ea864a38eb388fb7eae77e4a8bbba631694862a165e018b486a7c4206aca6aea3458916174efbefcadfc3e48ed11406877659c632645879b0ea30d15c9754d08d3000f90d84788118a502fcaa540107b5cda2aa5474478231cd77a43156a07a07276ed0aa98261bd31863689c09cb30986afefcf98937536c6de1cc0ececec5cb3c8da1a5e9fec806b025dc8f992aec8bdb49c12ec48212d815f40e71179cb1347b37eca4c30fc6e70be3ad3541eb8733de7f58a05f1768e648cd7d4fe29e9164690eb1c0b254a626ef4928bb6ac7c12c0d1773fb80a25fdf526b9317ee0e5d04c278cc2cc34c4b20be1615b413f80c4d234a36b4aa937ea8161a7b0e5b0eaa891794705562c4dccdcb415c0eca596c522238aefe72019f6e0ea32bc42337e82a3c312ecb8e300985359d2358ee5a018460e76ab0415319189af6339548b160c8e8b788c2cc11ef1039afafec2a84a2600c7f54bcde86354ead1d7e235146355e528a218fba43e483febc1b146db345ebc086430cf3c20afbbb46ffb713f85ed468fd82508899768943497996b5f00e582a4cf1f0948f2bef99cd5f07ecaf1e19f1a33940040164e7ee6b1b815071c7393b788ee67568158815d1570ea3023af81230e7c657e342d408d12275d3e56b807cf28e3f435f288fa91ff24627f6d6562903e36373e16a2889bd9bae8a019d6698b71e3712908ab5e2335406ca5470090087ab49bd9368b7bc012a8c095d4f2d241c03a541266f85d670eda83d04eb67e844372a63fa9a5c70d43920cd2afe8ec906421b92934a6abf61b97e92d912914996b769dcc5196ae0bbb7c7acfc86073c05347e62f9a42bc43b3f14e625fabcb9851d08f54b25da14d0c789739a57970cfb250e03404b726259dccf340be31aa0d4afd5d8ea0d4cb6bf99a747b12994b099056d1c22ed13e019fa12b61a83b20a061ddde88885810ba3e0e88557094baad1b60856c19dc32361b685345e3799cebd3baf1669e9b3168282bdb3ce07a631df91cd3fbc1da4e6afe23de9b5a22276a563ea6891380f4afc423f32954e163c50b100245e190c8265dde3363a9c9d39ec7dc0ffd621f834043df020e7a2947093459ba77279d6408d4208e917e3751c1638dd28a317426db0c959918101f70ca6a564a8551a37ae4f5cd0a326b8cfa221e204ee408ad8825595fb53391af493fa218611f47bf72e6c98a864dcdff110945bc75c389c07d30282dac36bac27580daf3c8c53311ffbbbb196d29ead7bf09e2de4cc66acb913c1f0e28878f1c7bb204ca7124b0d9e18d88f910e568ef3791c660c2d24cd3852d63c8b23f25846c548eddf3357904f21e89ee0e245b58a5c226e3947ba1b077e00a9e0cc87db02c3b8b11652b18471702747a67954a207385603b5efe59f1e52eda8ca9298fbb9afda4717a56909134603a589c3fe6383f46391f89403b369298fdb62e401800687ba92cce3b9951efe81814ff6cef68489c65b04b1f212d2a4a6b74c64e6ce52e8c032378626bca92a8b480bf1c7465c0115c0958810a060e7409e070885a54768648855c232471291b0794e5c44512bc4573a9f19d4adf83766ea9eff42bc9bca4ffd394693c0ff0c01a9004cca525d9d15bebcb120e57182904424d7a6d878e03e7ec310e7cff3248738cf77d0431688e84c2a01667a38278a0e863cdf115b5732c80d4aa71877e2c10d664f4d5a4800acf386d24343d34f0b2864ac702525b0c1590601e6e337b3718a0ece9c784295b82e2542cd9083d326bf0cc9330cff08ac9886c446ff377f66a4d462bd6c7df031a0364d62cc4a907e8d31855fa3d47e1ecc8eb24b574c23e8af4d918a82603f8a03f526f9fe14e7885a50c5463231f5b899983ad69a392b4179b01d2065bebaaeacc442b9f1eb42c187ccb1e25400a9cb79437b4dd61386a88ed98255590ffe125c074d05e16c8e0ef14d40bdbc960da37f98e7d31a5bdd96a63b3ed47aac9f02e293376a88302a7112d1b99b15a1c24df82c650647c7d389c48baf87cc3157daa4c5230292d25ef90d7d9362765d33cbe8d8857f8e2f765440cbd46fb811d4345a1ef3e8dcb773699a669a9f0cb5299b835206a6a4c6706839bb28779bb4970cd1430d6d804e656fe8b38b689a4e126d9135453d98b4663a22144b4c766708b355e83e74c2971fe5a4232a4f8ab9a6558f6fd84546af1f98214b559268beed78c724dc94bd89b31550eaf821d27f6c0e54d41ab79921494713dc4780b22668c70608d697f162896544d4e8d7446aca8b4c8e0668a5dc254d7a96b0537a4af6993181f224c109fea99275182e6a909b8127d4c47aca903e60be85ab2d8692dd60542c984c3712563cfa35eb9bdc88498654c63c590d0243e5e753e0f7c84c871e6d207ecd11200aff32060841a5661b0912587e5c6c8e48b4bee3447e5673d0e99574b469610b8f2254db8dc206372a514084bd9027b2f2e47936faf51cb39cf7cc349e4602bc920e3fef341cbc06e41b0430c000cc60b2bba7ba3c65f5becf1cb0c68fb5df6c62f1e4270e2912b37f6b83dcd18d849fded60d063baad10c62ab8d8063b9338983959baaca0dc45942bf80f935739c69d8e108b001df08073f11b0809bfeb59ecbba6dcbe1ad75c2324a6331c15624572f753d958d449de08269309ccde968a10b000549cdb8e4c8a8fcaadbc0378fac7b06dc8a916c7f683465f22857b7122a55f8b651f9fe20b8afb9633e5a5bef63349bd2968d6a9d1edf7c79810c378b0e309ca5d2f75131ed75972759ac416d17a17fcee881300f2b4f725ccfa2b8d8f4d293e6c4763a925a7b944b27554accf7aaff3692f7d809d8b03fa20221b20f4d8d783449c250675e98d11946b1dfaf8023aa97e7fd94d20d91a337a739542450aeb236137c9535e2bac22967e3a0b998520be9f1a46e15cd0d26f1b3873877b320724bd8362b38bfd63ebf503d1d5d59b71f614f344abc602467819c5870ecd44e28d9bbf292b8a867508214c1529b4c24a23b18c5d77b559348007f8cd74df6d0cb257c02f818722deeb48b8261adfa9bc3131f984deee0c523d00e7a39ab4babcfe2f816dca7e5ab80bfed4da417fe063094ef0290629561750055b606752fe4208e48d7e74f76ad7e6d4ec61efe9eb47031ead3d2f6004ff636eb03b9ddba88082a919f488dc68829fc692c8d6fbc2c3eb1330cb704c0efda0580a281c054ce261952db7d47da1df0e20a1bc80c0b795c9c69d9181a28b509d455926768f7dd84fc81e54bc114976f76f07438af2cfcfb4bc9fd19a07d0a26d3edf4e7a5c33befc2f253f6d68890c9a485e977944425c3ec9bdd11af95eee990ec410e0d6672bb9364d20d61a1a9c83914d19952a14b7caee21158e5a7e9811bc1d2722e6a4646e101cc057118c83ab9191622c524f7ad3011708cfa35d0c19d84d70e076331a6beae3c6242c3a08939edc1d50a2b9b31cb1def100ca59d28c049c74e00029a6524438c04100000d3cf23040ff3ee53c6215281e87e9946bb664c8f8d685f00321368913568ffd48acfeda45946610c2ef9b53e629973d5e7eecf95d70519a367ff8bca7933d7520b39fee25337a6ba46fb69c345b5bbd27b0ad4724a62e4deac3705739bc14ca60724df094bacb279f05b610e0957d64e72b1f8d2f8abcebaf251fbee41c1745587c155e63957d742a6936693fc532a69810b36c97f7c5497d7666bb7c210085570ba01eb08fa5ae556598bb01bf2bae5141e0690ecbef80cb0afdeb86464cde864c6a09e06607015701b1a66b3bd0f2bf5c5ed45749c2d81bbeadbf9cf038c272aad0b8f533c9e76a87ab4e50202ade356a5fe602caaef188149f8f313ea5f1a14dd03a8c3f3379ff5dcba5cfb2ba54dfa61963f09aeaa5e6cb7291de7a4696053b5a7c3f602c08d65339264026d595d5b5f212e95992261bc55a90e42e28c67babb2d5f40204f2afcdd3867e0a64785af8191b8f897475c212d6884d8e9b68bc75764899a5bbc5a798d251b86062697105a2686668a83ffb2c5f66786557b2810c11a51ef207d4317f3a5ba33ae454c9df254bc5f40824c4898145b5d3e9d7a71d8f4e7585ce310498de0c3e363ce58c3562a5095dc1a7baaccd48ccd280f9d948f8cf8e255c582824a3a4ccb0e98ecac359128a40cb1eb18c7cd2515a7f659eca6a9ab0b6ddc06f594ea2c74e594236483291e5ba6c8e495458e4405e98e9166983f378c74cc25cb5d83cea4d2e90f5ec31d344801e235a6ca040ef378aef0810460cf225d822f8488699e6cd8a905a9c0e0a1f8249ad5063b421cf5cd5029d01a66bd4bdc0cf408002eb02e9e76bea85529d43125467e4968a42c6fee658d478ad3c4cc20b7c28f40edad0efc31ef7b3b94dab0276618467e87f4aae3652340adbbc52ba39499c781700063026a9d3990ce839429198b5c638301b1083a7cbb9cd5e24c32ad8f98df6c3b4dad9999562a7f7c3bc49d986f98d0cd0074adb533074ca6761a65ab229eb350cb2324e70944b8e84b300f8f734f351de5ee366a33ca1d76b0d15dbd64517ea89269ba3d8b6a6efcf1ae43a31326ce7a9ec43b6af9cd3e05f4b1e3f814002d9e4d44b7f84f912c95e858d3221dde0ec33f2f53c6f6950d34898582329606ac732e7d92aa3a2d11bf39963bb17776cd2e8a557159b12691c827889946a1384db0957d56dda8180b0d31b132616f8597849558dbfd0573da12b5741ec09cc22e8221a6d60292a6d9966676f9075db21e322f0cc468d41959ade2c37a561291e82022b18b7cb0c597246043a481569ca22fcc20806cc4234fcb7086e197e59929c51da1baa18ca985a9637dde0b0a316f3c4dec9d69e4db4c61ec5d46ac2987822fc017d4dcd011cd8f7ed530c25bde1e6132fdd7380f1bccc8c8541ecdba7c4fc88178a4bd04ceb526bac0281c2848c37978ce785d1bfa7e9ddf048d5404692f554c6006a66fc63424707b79f37137120b4f76534e55b1aa17a2711fb8d88226c59730bb8cf3ad23f72bfaa46f755f414fd22a23c0f9050a96b0976da6dc0fc3e080d29e5e526ea80c6f1bd056a92a5f179904260eee2d418750b577c3a142ea4a617e5bd3d89e356fa7e17245df1222796e8e84f9a86c648e329c8c049a244ff5e4d6a43f17edb821c38e3695e92f8687a46d62d5511330e33d248cc9cb08b2f92a9a828fdd041048158cb9caa4783d2fbb1d35baa535cfc0c3ae5534f427729317d0237d1c301602f72dc9c4a5d6dc08d83b18be9f780ead36d315e3c1d95d17ba81eca859739952ca5efe1acaf3a43b192094f4c6228d8c1b408856ac71b2d652e0133fc847006581b5d03d73aa71c090ccdecffcbe3588de95604f9d1679bd7f59c0830f1c029d71979fae30df6046c45a753888eae500fffd042c41c9e86521c1f755603222e15f93446c4b81cd78d9126a9cb0a4e93583148071f61e679d9a3a514220298a882e431272094ab41f5e13201f968e83f7da9f3232eff6556f86c05ca7331ff49b25f6681d5662cd35436d36760bef9f5b1c63fc8f091a20aede7f2b041541a00833240166a8a46c1c95bc5009c84740c145b4de478914d9488c3e6f8fa8000115b1b2a519887346f9ceb76d487090f010d93ddc4e20c95d8cd43cd4fbd1af246bde638bd9194ec041ce4045e4004630d5720da55493af52067a71a78dc3711c3c2688383727e6d9c1214c8f572d68c2620d7b4d3e2785dfb55590e6d444d3a000e2a29685723e83fe874e809670f2d30beb87cf2a79b10f17e36b1ad6dbb354208217b93bdb7dc3bff0d330df90c6028e10b4baf3ed7c1963c4afe50b1e27ecf91064dec22c7dfb056b684ae1ebe804412a07802095376f0eaa7a00b872359240103114f5870f4ea43d8b750059380902ed40abe6003224ca4c089a457bc10e9f231061c5cc1082c9074b1e415bbb005511348c080e2440c014881882aa63ce1c8933026d17db26db65bd0357f4f344a371e768658d269e38fa872fa35dfaf2965aff0aa57f028e89d6ed984532aa5ca26b5109300e8da1dd3ab222f2a18630547aa127941edeeeebac566a3a3bb2e55276ca5e94ee9e091b4354ceada468a484a3d8544ea6813d262eb53b5edb63ab85986465438a15e71876e868b90bbbbdbaa48a1b1ea55ca06870e1e32357745534f745357cbd0888a23f95b1d513092686a6a7c81074f6890e4451117589103090ea280c1128c20cae2d541c0a678c93db9c8ddddddcd754442ee25958332a9365277f7d1146568541491fb3654f82475191a4df1856ccad0688a28550918c80191192089220757d4006e9104861327a0f085a52c5ce86a40d00c9298202105328870ed18998114b0f00517465062c90b1e42780be1618e3c19c5eaacb6bb9f502407b9234f56313a259e912776f79429920e25f76db2309a428bdc3c4410408646532021a332349a828836317fb25d2aa3c7057c748066fa4c1acc9f30bce084a523326a6ed8e04845a12da8083a2a4286ce32312ca9229c18f7fbade5aed097fc64cbc2dd31dc8fa5af83074e0e0b773b09899ff9c5fd522908a7adc24d3521a90cf25166392497100386d66189a425f2364f96ee19a6dc8f45e674ebabf4fd92d781d3ad7aeeca21b9849803cc2d89b0b859d82e5ddae73b0f7f40565ab44bf028af38a4a2a2d996f336efedd5634130a08c32ca906bf2a723d7c640563b4e6003265c04e539734410d4e4897f884f9a99869b768cfb712bfbfafe6f8c0c978198038c8172ed7743eef7f719b1a95d7adb3faef3f68f053bfd376f655296f3d1abc78260c04e10325b3c029a231e41e7887f989734e698b3091f1e31877efc4aba7840567c64b2922bc864253113261e0df186f8c9a35d1c508e0f20464cbcc8f170298a272093232896f207a32c413222111adead538ea7d1adb9c54a4af91c324b1a620e39078707649223133348e2e382a31f299a08c2074a9a5cc1c40544a4f834216298b785612907298c40d4bf117388393e255d37e077a325c32a9844c98dbf0b27ca024a18c99b6ace1bed5239c28113ff2395a510146ee4b8f9184189464239be3e28c5024796686d393ea65b738b1ca52025c728a956ed90b99f43e6be99d10727f7661cbd8ab7e9554c228f814819b4a08514274661784528c420e4441139c0011154f08a3c34c88baf6e286928c24a2be57536cc5d6eb8fbcecb62db2b79d3a54b65b18a87eda6e76cda75b08673b69b6ec23a1b8692957de795e109258bf36c3ddd20d051a4cfd649db761bb96d306b0a6583321fcd3479f105a5adf803227ff5d8b708e7eb63922814b38839c45c5f5f334c71bf99a94ce69a45cf9dd25f0cbbb5b6fbb6a3df3d47bfab9da77de3bc9d5c83ccac61d86da4f594b2cdb1ab4a99464ee1c5d76d1a1a60703f4845433c557051bfb7d7dedf6eb3e2b976c117cda292b55886594ca946d15324c32858904456408651aca08b9cfa6a83dcb6718ff3f4ed84553bec4fcf6133ef9b39bbf43e9d6c5a99bceeb093266f274b2f48e70ec72ce20ddbb3ed3692db62af348cca328b639215b4f6d5dba6c551e81eb9b791d783cdba509a1a33a2b9e8289dd449525a4a8d1a38d0e050a3468d7a54a7a84c6a519da216d5a37a448b2814e8124a44a1408968112d7aac35cb6aab6ea0fa8151ea551f464905e4bdd6acd647c122762885fcb48b2d002c9848b82c6929230048b004d11d6844ecf8b9f1d066606b2962f9c18c0a14802407262e3cac324784c080c51168e085d113ace8b9820747a841115d681185204031baf8018317be3003273bd8410291249e40062c3431862fb2e86e2140893c405001138eae40c20dc810050c8d450e80e003196cc10761242d1157728cb6c5926accb1d41d453a00c2174414a103325e5f4a850831a280832294780106affecc42ee6e15272cd7b846b73ac7d7dce856c442ee328e9061440bc8403ad22d584119bea0411251e8c14b28679864545484dcb74dc4c2d90c8d8a8238221a1484b65247e9a4e6a2955a8907dbe983f122f729ad94561a5540f9ebad2f71f4543f39de34865192f1b08380ea06f186b809a12aa05eed643a3d2f1e76117f2ab141e992ef27142971832f54e10a1d49e4a405442f14741132f04879c9b7a753b1f042c12a8b97e472cc98f0c414449b109890029e577b108b1ebcb6494ddf4ed6bc90440a3caff60c80f44241c7c8846600296e7c9d94e28fbe06db2dd94272b649a22ccb344d5b82cd32ef934ae4d012ac954496c85a6bbdc951a0683f7b5b9eb4b85f4ccc655634686ad4dcf87a72d4fba894334a9e6cda7f73ce890394869fcdb4e61fe8fc8070b99ed6536badb536a333abf6d48b493446b1962ae10b32e7cf2c327de6cf498b1b5f3869f1d5d4404992bf201d93a250548a4a44968372bfd4bc85aefa893f78ec9ef20f50b2ec84f018862cf704e5a6622eb3a24153a3060728f7c60ddabdd464db6cf8a2a3e42f48db4c835af560a63ff5d61e7633c3f5d683804422de005f319db8937a452512f106faeac13cab8d0ca242af5e4aec305a3dcccb01718072e33f8ecbe23cd283520a9fe418f10784cb344689516216dddd40dc2366112546c9418c32831835376c70b0c42c6294982be8c004a22dfef4ed158430c677378c3056b1a1b0b8356a206459cad2d6c7ad1eeb6eec0e9d83a07442148629cc6e358f837261c68ca010ca33646804854fde324e9bd35eeb6e2c8e3ff1ce6eca6d373c39338ece896198e2d93b74deb0cab1400cdb340ef36677a3418e9326d8e990e50867e8b796b3631422c76e67a80c5104e18b2448b1e4f322e2002fb8010da47ce103259ebc6063f817357b45e334413843f13ce5792af3163b4269fa4c903386bf12c4e44d639931fe501a817a1563508edfb70e92aef9d8e56c581501f8a2912cf91587a792aa07eedb373c643b77f8ca41bab8cfc3ae021c1e72c98adf70519e98527acaf52a16b14bb6392c4c11d22bf8df2552764069956394120820f45bb7a3b3c4f802282777464a27e681a3e806518d1a1a5d777723bb8ed22431cb8642ba1ff7d95cc7b005f1431fe6afe60fc21884902c822d48af209d18abb29bd2885d4e4a9730ef47afe02f90c4a18a70812838db6633a593e2f40a4987212e85bf41735968d4a0d12b784ae7a3ec40a63fb29c41a0207fab5e65f85eb1a4766ab43a98737e3b30533aa3306249142d284229a594ce49e99cf1d36bd410ee373384f48a6d83b1df2bf8b16428693784f84bd1cc72e93d6190066d50c6c6f91bf2f436b9a2850f32f55af2268732f558b2924c3fb130c264b31c176564990cbbb580fcd90ca316c2c8f0db0d94524aba6ddcf454f3d0480b486468d40513cc03a537e41ab2d6e5d8b6cd6479d07a1f9cdc1a31d30784eb72c88d93a6fa5a1f7395d71e6ad70ebb1c34c72eb890a907ab90b14f0f1a293921530f1e65d83d00c32aedfdecd96107a17511a061083f18a38928be781159c15f101ee09b08c03a1d68ec74c0b20f4e348f877c874d0f1a69a109997a386f1bd43669a2b7698a553bcc4c1f33c51f0a72c447b873b8464b39738dc774cb5e5ea65bf433537ca35740587295799eb20489197b8671c488eda03430696bc106653ecb03053cc43048af2834da42920cf3498afb4132e6c705e9153d76e8459ea2d32c2aa45774698a101d68838b4bbd62c0d06da50910dd0f4a998011f7b31b863ea4ab795ef43f3c0073e82132bdbda9c7173d4d8db4912e48f4a2d7215d36f2f0bc280f4f0f0fb53cb1a5143eb25aba455286465b1c4191a1d1164564d5d13cbde4822743a32d96322c4386465152903539bd80596a18295e64fa189f4cefe4ce94152eccd0748bdc1f15a04c558cf44a072f2e3dccb206191a2d9992a30a5051a65731d2ad98448c9d0e32cf89557e66487155f3589e593531bcc2094b195ee18430f2674aba539a45ffc40af783618136e00d0364d1c3988d9618c9376468f4049eacf2036dc09393fba9fc40a1fc9992568aa4eb4a6916fd25e3480ad21149459432451959caa82432fdb73245879b1970846bca135f2970861e01445c951f0a557e269085cb8364def4efc49369c4e224052687a4fba9fc046515f6213df953c97fd2a757f3407a4ac6b04ae21d34cba394f2bc2cd2ab894d5e98a29894268c52b7b067df95c272246e4c86f22a3fed9a3952015a62486549b7a011144a9db4240bba093d81287f2a42992e39ca9f8a924c5588325539ca549a92bad59a584c98249828dd9390a2f2a302d42b9ae18f2b92e91bc3e27ea6a9b2045609ea15bd925ed1e97d16e9460c4f6f65a85794e854858bfd74c5dda0c8d5c3219fa4b81f4c94ce13c32445e17ea6246caa98d47f30432a2654d54485d4430b2e96a1d1162ac8536668b4054f9edfb02e87cd152fe5289ee6a91425a924d92e6beda657fc0189c9f52a48d553c989c195ff549054245649f260a278304a1e8c171ecc52af60a4580c933481187c2a263144e644dd6f2549a6975f11ea155531e9565435a9dd8ec9c393eba5576fc40550ae9e0df964c55549cf3e760f983c3cd9be3b98a4868902a394e94f4dae89a857f41f4c526c3929566da66d3a7076861290642c57083bb899dec6a46ce0822a732d589004a3b19ad10520d01a344e66fc60dea8814218240e1b16238ca179e8c802480b5894d32b7a9c2c60a0047874811e2a64985104a4d872524c870ef48adec7ca168652516012901f4529316410205eaa183a027debf48a5e48911128119ed3929417788ee87119c2103d2d3bc622d107ca0d8c441f233f16892122fcc4d62109a0222222d0124150586083a0969346094b5bb0227f100946814a7049cb2245ea568c45d929928703f64a5a1e8a24d32b7a1d5bdc8f22d127ed3a11b1e8a14dafe8bbc8beb66036e5886de00cbdf578e8c0d12b174ecba3984386dda248361a00673ae71c898bc493ed0c5be8c29d191a5951247d7062451272bcf1c1c9d53234b202a8a5911546901180623042154caec0811116a0f0829015852081104a69219c73ce998a12bbc4df9c73d639e79c730989a5b20c8db4180311ba76d7204a5012062950b8f084300020c5155ee0028b1d2c2d618bac0a00d4da1d46ee9e9127e38c6c5a7c91fb560b2c649ba1911657684dd4474ae98c73c6f854ca5a5965ad12ab7690afaf405279ceef64ba93278a4e3abda635345366f625c86e802933eda58733ec5413e36418e61c48f4b25ea646d8e03bc31ce352afa21426b48a6e27196a219a5713ee175be8d2449a1b85a08d7e7cf7401b4540572c02b2e2a140d18216c00043882844843311c79e38d4abf89b2fb4118b8082462b27e4f8448e357a156b304daf8894d8faf13c8e3c987b35e7552243a35771da00670290e31510d32a408effba1cbfd90021fc3703ff21e053408e2d444e84ba65e04c44caf13ef48036a0850221528f76adf0402231c6295b473c8f781ca4a31cbb7bbc9c706be8215d67c20a52d0c00a442881e1158fd1f63ab7c43d7a1581b2186cb1bbc9de7de2faa0e4f68c31c68800316e073194057e5004be2f8184e455730269174ae8886ec56e82943f2e2f2175a18be436923b89dc9f4bb4be53eef7e85f008b29b97b294b0e0148f7a3c97d21ab5f038bba9bd311fadf29f73f0004da88198601922112911ba660bcd0c4c276046d442f661e22f1089f5ec12354db4856c71f38d32f62b284e82b9a3c23f60b80c4d56153e389db521ec91c6cd80725977b8e3c877590e4dc6fd7e16e7a4edf6f874390e4dca33ec4747b8fc22e7c993c55c51dbe58c7e93af684752eee308dacb5d6c95d6f88c91b62fae52e5f81cde421c9d9debfde10ee2a1ee4ef7be89b6ed3264f556f5255fcfaeda746559596cd574dab304273ce39e79c73ce6b599d58d4e788b9aa78e07e9fc3fd621d24f527acf38a3bfc237f36a98eb52b17a250548a4add1d857a15a392154a472f872e4ddc003c715fb00afb0b4efde53da466a4dec38c212ef892957dc6e1ebeb282c1ac9ca9e5d47b77ed8de3de32c6681fcc8dbb12f4600be8860b7f9017bf7ee1be66d5ecc5b7738445818cc59c6708663945ea1be82bf9957a4cb61dec3cb251e22ff7218e972f8dab0676fa50a736c3b8661c77aa957b597fadb25918aca3f5b9fbd05b3ec2c2c2cd6dae7d86ebf9331abb560efba96ec5a761bc9e2b552af2ab654b72ec3bd79b757d861b4c3c0bc877ebf0798f71b0f9187d1de30f2da25d641a235d6913016838181c12ed8a1c42a4df51c97ab24566958c5435f3e07e6aac360dfa4e77295f77218afa5fc1028696868ae64d5d74b7c79980f1922b18d64d5c3fc3b0e11121ad36ed35c6c327295455462d430896118b6720ce31071f9cbe92ade0b7cb978f22fefa1fb2fb83f447579f84279a7fee955bd4d5faf8bb44fafea3b8a17d85f0e5fa65fba5ede03cc0f83a16499700f2f87390c1ee2f217fc970a3bcc775e2aefd85d620e83755c1e731dd55fbef3d24ed3a978a07f7905e6635eb0bcea30d7f057138387b8c8ab9e23afc22aec7dd5fb2a98bb3c47f597c76f2e9ebccaebbf78301ee7e2e920c989b90aebe82089007c111982244775171a3e44857d4856bdcb6b780c8e3e9255eff398abfe451f2c6ac04024218106ec8223cf52ae33e0ee91acfa214886c07c880b8e409255fff22ff260118355380a49563dcc0ba6912c1c97d7bb78cd2359d562568354f8f840a32a20e57a9844aeb22757a49ea52a81b0d7278372bdd5b04f1229515a4206936e7d314a93273c92a85baa48d4ab7a98e392f750ed245f1779217f7dd485fcc9e42fea6790702f79ea654f7d2fd56f1153ed98197b8e99b1f691ae5e6a567dad6f1ee972797df748d7cbeb371dae70bf36926b1b69a06e7149b878f105bbc5d56f2f1e7cf5d2940d7f3b9aa6ed64ec9be6fdc01d66ccfbb85b9dccbdd38e8239246bff74b2863feef61f973bef872074b23dccbfe6c1bc7d722f5e3c922c9c9b58d4ab7a1e3e176697bfc057b784e48a2792e0c3c3532f3b150ff22ecf9177c1aa9cfe0b566158c5c3cb5d9ef37217ac8304bb8ecb5f700ecc5ffe82755e0e83775e1bec72d8edc5536d87d9b08a0797bf7cfb0bd641b2e19c97c3609d97ad76974974ebeb24b9be7edbde4bed9a01a8a73419f59288ecf129522f7feaa5911a73bd0c6a577cd567ddd649eac462dbb66d8776cbddc583af170fbe66ee2eebcc9b3906b1ff9135cefbe2c60149657bccb351ed805dbb863f0a94b1efccf09e7ab9dce0109164c428dd8aaffd2ae5d1a99f8518a0c8a2074820638926a03819834f931ab820092642f042230ae3d38b2688a06c3435374e38602263e84489947376b6dd9a373108aa7898553ac41c71e7983b6f70a6addd219f70a1084f8e37489108ef96b46274ca58732375850f56041f08a1090b9ea8410f1712d8020b3790a202288ea001d18f0bd1106c985c3002136480052ba8a044921fb834852130618b264e58e10555644f6ecc2d548135d1dddc152a1802665153d346b387c8ddb6c6092eaaa024ca0f92201186962a90f88cb102294828c3ab2b138ce4ee1a27ec1529f826869a24fba4b7124a2d40f920164b8e385833356a7a7cf7f041c9b5afd7be592fbbec6eb42ceb996b2aa732d5347cf262a7037d95a7405293da746ac700ac08821536c34e16751e4dd654686ba3086dd84332e439376a24b3d9ed7899d91737ebc9dc9d654f0f66da498cbfb8f5362d310d4537be6f527026c231322669b7ba45c3116eee59313aa789c299beec269ce963dbe59891eb6117c4e4e191410e521fb34dd76ec78c5cf147828c617a1b396da44194524a69a6f73dcf39e794524a2ae78d1237ce3be7e7256bc2895fc31c828847b7a0e4c1a35b10c372ba957dd3b81a089b0291ede3cd2c9e3540b8b3df359cb8dcfb9045af7910d2e064b9c3957d22db9368b3565218fb831042484d50d02cf30c484d124327644665083d0de4ad238c3152536348f3ce8cb1089d34a92c12632c021f6fe8d82d8bf42ad28e73824184bd8b6c095b30c91d3801086480018cdc5de38411648d13dd7d0e870e1e991548685fc44fca8983749ee7d12b781ca04c6c8343173874d1d2051b94d9624bae07b4d13c707ad0d46478a50eed369bf7a30697ee804d32c553d3bc1fcdea053c81519e25e652f61eb9d5a339b292ac3e0e493692484a1f720ee114b3202363c50b884c19294656b0800c2d909132257777777777932fac4046ca3c156e132de4eedb2a9c68826479b6f90b6766a69753c289edf39cf30135e41f62103aa1dc3e7a39e23773c4f5107a41da7e66fb54af26d72b8b2dccb7c640cc62e3eba9f783b5f0f439e0a9c55ffc08e24ea658a4ad6483328dd1e636d8e5e06efa16ed76e9758f1e341d7be705e9acca0e3f8c7aaaec3367dfa66657b3005a5c8961826e3f7e62125b6badb5f21f4bb6b735265b8b5d0ac9f4df8efcccb0c3ceb5bc7df57e90b7dfe4657d56b16a87f8fa1cf1f8931f41dcc9f5920784c09db93bf9209d6919659441e7cc1d0e118a67b722cc146e43a223d418fb987645247860fe8d6ec5263f5c4c0d15d9c44eeeb23439e2388c0135b831737665f162cecff979ac625e90ce5472cd15408b2b13d32b7998a01b2fdf2d6939cf0667fa90305cdcbe74d9673419fe322d1cf077255d5c0ee6558ff33a0cbea46773e328313d95fc76f8ca3c95e43cf8d20922a45bd4abf16ef42af3e6ed6bba05737723847ce478664b306cb23185f3edb58fdc1d040af27cdfa608f783443d7cc0568c10668cfb5dd83dda1567e0633405a2588513489a51154baa4842cad83645591e871115c8c8d2a80a23dc079b74778fc0e6781e8f480f5b2f96a2f333a6dce6c9dfbdf77e95b74aafaa157b0f1f40ba0523919ba53c841f24e355317ab1c892524a6107015a46a678054463b68353ecf9091fbb1d5bbba04dbb54d821911efbb2cf5ebd1efbaa87de87829ce679d967de0a6a5e750433d3ab76884099e2206219994afc752a0ce3d4c39c735f1f76d50e5ac67010a70cab9069f2b793e5234f861e6b36d103da88398291a316728492e37d802e0b59fd0859128cfcc1a254fe605117b91f231093276e3c2a3a401837ba629164f58f66e4ce42ee1e11cec4ce7146165490b41c77288a2237942c38a142ee7ff148079ce938a50048dc484694d2ab7e8d27eeb7ca0d21fe62bfe924ca11055b1896885e48540ed851ed8083c42dc9b592f4231e41c64f919974842489133aaa227f70ca5191187fe44fb7baf5c5e4a06e4595e5a4916e4d2de4a8943fb9448e07225e48bc8ff81fdddd1248bab4a2222d924092021346f820750329b0b8425112a220f414e9d21edf4bd2b53d9e47cca18324a7ebaea31dbe3a4c669759e7c9a1968f75c24cfecc1c581be35603d1953f70265e8899bf5e6a32d424c3264718cadf64428e2f40864d8e50945118a779f0b579f045834606e3b0eea68fd42bf94446914a9ed4e4120dee378de4f86964e600bae4546222c9713691e3678793e43e7ff227c778f91325508e3228c75eca981631c0c217b93fa10b82c109232e0823f35746ace3b193230e42333dd6ed98700440a766a122b3394057862fb0d127d6bb417d802cfa1e708688fba552d8532988c5eddab10d5fc9a2423919b6185655ac46a41e53061a07a4571aac016d681e802cad5b1c4793ef15b7a657da29a6e995f6ecd60bf907fc01ba686eb7b86bda39ef46af346e721e0e38a37d8b474e513b8f7825209a9ca81b7740174abb76b57f5b8e9aa67dc3b80690e172aed3a30fd5200dc2e68943057704320761f36c39cb57aea25d47b7b86be7d13fac85127fddfb4a5ca7a357da6fd18da7216b2d98059b4ca66f2b9e8a47df973b4290a9edd58d5d87e7f6961dc61d897bb9d3398f47afb49f34cd0677f8eb02a259dae169f484f44ad334ce03d22b4de3b47a4cc32c06b503e956bdf61fbfe14e1e91d357f0d70923e9ba8d7637dc67c76327773165a2297a390d480d597b7737b757cd712bc9d238ed270eab4c5c778e336155d7bde3b873da7f744bb53d26cf108568abc0608332267b8b57cdc2fec96c2b1a19db2ef6025918f6171bbad301fb91b8d811fbc65835bdc2be0026ee57f3c12538ba855d87e5e0516741813216b16770287fa9940759d8b1978c4d0c333f7b425776c8e2cab00c7459bcd2a2f853658cbb91bb046dd063918a2c44cc42c42c89e00c769b9643dc8f16c918765aa45bd8b1d39f769d07c328900cca6c96655936b32c9bda9c33cbb22ccbacb536b39cc5aa6dcbb2ec3456ab4c36edb1f23451421d66628e193b5369501a13523a69d49898d261c6ec72cca05d8e19580a4bd11c2938d3f37685657739b22c65976372b2cb41e14c8ecacd2e479703c299fcdd1c324b6c6a26799bce117f246ecd1f8d2c7f33632ed8b6538eb8a1aeb89fb5e27e13084dee67ab405101350520dc6f1eddcf5211348514f79b4ca4108511ea08aa08150514145050a096a09e807202aa0928221413504b402941c9fd6c128470bff9042a082824a08650474025817202d5042a098a09941166932bbbf96e66b7ef6f59111a00658937b924cb4731032fb2c4f36688b4032d50162bb0aea8ae3461b1df905b59851d22e1e0880c91709084cc071a9721d20e6a80b40322727fe354f42cb95e450f917400c6d6691922e9a08bdcdf4c1c0c8e14dc7aaa65b662dc46a7ecd8419349becbd683483a70926170a4e0aa6468e48550ee14e88033f3d1d332068df23c9d47dd35ed3484d336dc1d56e56cefde75a6ed46eddb35224a4d9e9d3fa6a7cad9ce5dde74ee9aa7cad17e2fcf61168e4a621efac59dc3266cd31306b793a4ab93d89bfa3a499eb28c3b89b8df2a892b2a354f4e40c55a1631409ef297ac99a2af18fea44feea6ddfd43ba367c1f56b2a43665eee4a8619886411b33eff6aad6e318e2de1426a57626db6120a65aad16d6745b6faa5b779b6eaab54a59b149adf530dbd99bb02aa7bbe9a621a8ee84fbc77493e92a57c143546ed2567ed2ec5730b45d667fcaac8a87aad66633f3b0ac1ef3b0faad70e26bf78a235d1df64056b55aab96d5fa16ca4cef9e9d32537d97619576ce66dfacd5b02acb9ed9cb22d981641673ff117dec13e8ba280940d7c54050508a15c8d0226737757737da715c1480ac4c48afb253c00390951d951d95ade04c860ad2acecf0280f48b3b22c7b76acbb59c1994cdb34af8bdfc9f7ae0c61f9cae1eb7ee76555505895a372d451a8b7bc050f6939eaf0a5f29d17a77297ab702e98bb57f9b52a98fbc9de64ed6d8b6759bc6bb7f6b6ee5b47d8d28481f42a7b9735808c0bbf15906665e7b2ec515cfbba8236b8676741d77de4695676b10756ddeacb94b290b3cce11f7026fb0ef6dcca5550bf2bf82a289cbadd4fa64ee947b75c727620dde29e1d886ed967e73cad88ed5a7163109d83c0d8d2c40267e23bb0598d46af2c01e08ca5699665c11bacb5366631468ca39c8da79b1ebb73277b5387b94dd3b46bf6b75b315b7bed36bd695eafe08c5d65ab6576f624036577006750318966a11e73006f40fd885ea1a00d157bd43b1aa1e27ed148467d5bdd80363aa38ef86a64d4a30a5e4d7151bf37bd53d16aea458500d095c240e0b7c1960aea5f0e19b5d99a4ce3321021e6b6ad7ceb6eb41720fde2056916ea10daf801cea0fec91c3c006fd0565890855ac12b38838af91965edbdda21d4326e255d3f9a853a0ab5655cec6e828845320ac79e5ea1c6b8f7f1309ff1d45f8e9d7ed5ad95a34e83a65bf5a8c77b0be3fd69c503d22b140bfea0948cfafc016750bf515ced998e95a356502ba815fcd92c776820cf6f347c86afc45c751af09d41763931d8aaac9751871d0e11183c034368edb7940721ebc58390b582bf1b825cbf751cec96ca0bbc8a47a357a8bfa02e040abe5e72ece40af3195f49fde52b30f89285fa8c95144e4916ea2f2b58c5729595b760151516ac5a59f98a8aca5550ffd1ad67d481744b3bea4074eb1e752883c23f4421ac4d51b66c66279666651dbc217b9665ffe85b9339cbeab17a8bbff9fa23716786b7bf36cba88685d841bfe304b9dbc9a4125bf68dbbe6ddc8628cb35b326e5bdce28655313eda2b44ba66bc32d7e99003d075c23a7d316cd6178970a1a5e1ec1f0443cebe4d2efbcc3ebb9b1a3893459be64c59bb4ceeed6b767f3aa90c799dbef342e1fe912ced17ab7250bfbf5847d5c3101614ea2d47696fd14e47fd84691a56d19bb0771a8677d08c1dc328a55e69da59bc9464655ff12e599996da56d939af03bdca7cf42a7b03c4b85af61a68233e7b02a0ebf4ec38ed8a3eed43ba4eb80490953d8399ccb20d7fd00b39130267b2dbb4d15439eadbfd294705a3b68b579295fdb46115a76defb0a67158b56ddfb4cb22170a77cbaee393378c5aea95863921dd9a9181b0d69640b178b1c3c9c1198ccbdf7c3fd657181fae881406b919f6ea321bacb7ce1c1e6fa894eb7903470272c03c7ca359f5d453ed883c39e2ceb006ce4471e9b13a5dab6655563d8439d8006fa8ffa800e04cfd5733fc6603742500b2ea6b0657d57e7ad9a957f3faaef45fc3d5dce0ea0459f3f53275bef177edac5d8ee748bdced35bf5aacac8c4ee729832c53570a6fe48dc2d7f35b93e534a29fefe3d63f6d2ee66c61b3ecb93514bbde27a15e7e15185427e334321e9b2123b7dbcad423918a611ab66ec18275675bfe3659188b91bad98d96d865539998eaa87bebdc543b0f7ce4bc6db47dc3f5895a3a3ea21d6c7c397fdce8bda6bb7b88332bc86a164f550cec96e9f618b21fe9a2843aca210420a2f8b60de85c2452df50ae2db94274b5a9394e21152131549a1a1dcb5d2a529b93d49248b727fab71ceca3367eda93fb3fa4c8d9b1e968429211d1115111521111d1d7143424041404143404242ddfc993e18cfec993c584f6e6c62d3346589262925294d495a92ac96a7f4ca22492491e41105924352480649201a8424648f88b27c11109164b5fc86e2680f8ffcf1912c497f240ff5913e599e87f6ac2c4d614952cafd793491727f7399b224a49434549444b4f48274347d8a88e64f1011d0516a4868290868caec019a3c4233fa47caa3ee691e89249b47b60f8c52d29425e983745444247f86a40c8a441248b2a6372414043485a6d7c3137f7c8824abbff31202c40f1ffd9dd7cecb221d49567f9b819b5e0b49560fe5fe460337e9560337b1633d709a47b25a47870dee2425ef08091315014068480628c8069f9fdc5ee491acee991e10edf9f0709006c04dcf8600dcf4686a6870d3fb6a869bdedd0ac0cd1b56afa1894b92d5164e4f1501f84aedbc0efb27f784aff691acbe014c1446061b77e7946149cd24f8240a94dd4352b66c6edaa15e4d8bc921299d48029d8843b27ba8a57c5d925e28e128f27af46af6218413fbc4da277f147ab305f186f93e85b127c3f7e8158c2d88374021d1676293ce530fce896b728c346cec82b06d5beed9518754cc65528fc9c276771f4ec9fd296592ca3585628c2d985c32345a9205176228e273ca9a5edd8033f03870611bc906653e8b235df0655daa080f71503f1dbe3e58447329a98d8f0efce8963dd4f0f715cabb9e952cfa93e71abab0a5dac13e3ee24f01d97e27d3e3e0c18d20ae563e51dbe84ababaa8e9138a245da79f304da2485d6485ee228ad414a99b22b5eb4434c98b6e4dc1887021c97c821d41a3d0254a06c683f5747cd2ad6d8b5986e9138a843d893162485852568b6a9174d522cda2b7f6de54ea5fd5a25a24d35a548b6a5165528fba054f5f9b20757d92bd26d906a05ab4d23a572b5d1449b2a83c8a37d093156efc766dc90d19eea90a37bb0d8e78149b44a498795df4c9a3c6e29eaeb8197d42917a559b64caa459f45be5340f87bc55261cae45bd82c2fde613cc0b5a248a0ff3a2cb61b3869196b01eeddddd9b7b6fefd3bb3dac27128918eba94cea516d8274f2ea130dd7223b54c40e29e9563f15433f8c22d522f5a75bdae9ab916e6da7b7daa3a77d3bc4ba5ab47995c95773d45c8be00cbd8e245c9861fe302f302fb0a576cdd794d48779a16918129614b34891a81499fc51242247449e224692582209a6045b8231c9f419ce32dae4c94c9a4fe893a6b516d5a24cbf454f88ed416c1622c85d49973ca2cf3c1c5e7b0d8033a6bce9d0f0511735935e5daab96658d291e3c3c88ba0cc0525f9834c025f5ccaf35ba4733e12ed60c12da2c7ae43bab4dbb98a4392353f6daa264f383f31c4774e6c4e20a40bfbbc10e9e29973690960f8e1be719b96f560b35be62189df6e30af7bae94bb9d7ad1c321d23f3e9265bf8305f783473f2db563f6da0b892e0d673665eda34dc2912eedf63da42bbbbd0f6bb9db6d2929dbc722fb48641f8f2c51c521925ddbb86d729bed1ec9b211374fafecb53d0464d917616390ed6ddb20db7fb0a879e08cfdd73cd97e654fc3fef632f650c6e21f9a08039a3cb193a1e101e014839f58c44a4bec2102923e457eba966b484745561b3ae1d8137b7ad4d3f7c0de724b4366f51a352bff9e638e45b478170c37f51977f9cb5b4e6f746b65656565656565a5573c9bb719a9abf2174fb5f2e82359da0a8e3d3da8eb7295ee0f682316713a9d4eb127296befa1dd87cab577a05bf7da519c4cbb6a7c34b2f66f27776f8f5b51e156f0675dac0a3ebdc5ebef47feb477de08e28d1b2d2ab7c68d1a3537725c154fc876158ffb6d39795f6c41d7d4b8117b58268fd6a6302650b784e87f7694dd2e96cdc53bb2f219afd766e076f1a2126f49c66aba63dbbfb8e2f16816f61aec8993cbb2c5ee01f2147f3bc853084821e485e86387485ecded5d9eac711b07bfbd407157cef22814836a70e959bc9523362e98ff6cac9d0e9dbbb7782c5ff15c4ebdedd1eb58dee2b9bc40715bbe72faf895dbf426f197ca35b228a98fb05c070bf691f4e2230937f648d706200bbb162cf631f4f8785152338e47b7826a7713836c5e6063c4edbc7296940f8ee3be556e45286367692f0814f004a1c3c39329de28a7794760de7947667cf362122f2ed12bec2e1e7616af46ba62916461d2857d56e2d941a0a98d414292458ba42bf64016767b67e7ac53f1b07297e7ac3c87e52f2f33524fe12133b00ac7c505aba2aa87cfc0aa88553cccb80b929cd45d3e44f519efc1e5318fc111e625a5729901e3c197ca83af944b64f156bc3bb9b1e845c9ed9b54f0d799f6401b110870063b86c2dfcbcbc5dfbd27fcd96c63109cc10e241583202087644a8fac60b7ded7f98b419b77a4e7af955f66b5695ecc2d5e84c10580945b843d063d0e49d7cab12368c3660cc370d08a27bb1844e4e695b33c6af636dd972753afe695b73c87e52edf6250afb0c71c5f55598ba7cab08a0798b7bc871977c1435c3ee32d7808921c17acc269b92a02f0d57217acca667c480b5665a9d47b68f90b1ef2f296a75edef2212998c357077a35033b8c07252b85bdc5c3ee82e4c1d70c0fbe521e7cb5c4a09924f707f6d12b0c7b8d23aeaddeca049a1104ed5c8c5d3763d36896f6cfd6d0fe5102d4096d5ced5fa741ed1fbd93ab420120e5c2e823b50bd11e79a00d99b54722b1a7bbf678245df2da639274bd3c557489be38647fb216354dbb6374efc77afa0a607fb9b70f2495bbd3eea64fbb9b0e6bda394f6bbc8233da6d369bbe93ab7d437928af047046a3de8b77a55c98ab9efa8cbf9cbe05e57d2d2d2d384460ae7a773844529f719467f3a68259517916c65a6e9be1a9508f3c92a51dbe529e0a85a5a6c2cdf05292a53de5695f8aa507b4510238a35dbbff5e7277ffdddcddfbeeb1130267b4bf28b91f3c2a9a9203669696cab5e3e4746b056be73cd8abd9dd984ea35bdabf1a59fb86e3a5df29ad0b57d3de1847afb41ca7f737160ff60a75156ff60a857aec74381d75ee2adecadb43713fe7c98cf2b65fef836264ed9df7c57ce2bedd463b8e6ec1eea6bbb76773c771edd96cf26687858471396cb5d708c4970b46e56f6af80789ed70dd39d9a04cd4d931f2b287afcf6477835375765ed4a675765e18769bcebc9dd726b9ccc3b478591c897a47cfb53810d5d3571c91a2c01a7f29e8842c0fa38be2cf461c922c79236e1c020a12225dd8e9e5638f8c4961b077da1e788894e3634d1939f6b8001058e418a34f2c12a311a020237274895308914916e363d2528ef1b079ba4564fbd747f8fcf4a08de4a16e718f6f25b19774518eefa3a51cf3d74d72fc42fe5ac9149b8c1c254f8eb711c67878f8334549142b0461498cd7d748392a95610c45a8a0220562787d9d942313f9f4d92d05e4d34dddcda90b4740ea82134528e10b4b2fd3bbeec6643b22787277aebbe966e6be7537dc46840779bbd6dd6c515eda2dccba1bed7a3953c1167276dbdd64b3aac0886a23e24caf40ed6c9202222d99674f3e458e064343434e2471626828cfbcf59ddceab5e46d72570cf79b59da6f34bd929fa1c9a56d5d4ec41ce29b255f8ff26eea50aedf2eb34bf91addaa288f251593d32b7994d7a359f27de569f0b92c33d5ad0cabb2731a5665ef7eba7c0bcc610436d7cb5f1668a35e7e9378d37ef2eaaf17b3c9d36eba3a745ebdc9eb139626af73ec76745efcc6793960cebe759e76aeb36f9db7cdcb51af698fdd4df6437698e194d49bde74725932cc5d59706f94d3b55328c309fe602620cb5b296439440a98c092b932b0c8dd51f03091fbf0458f39421b999551487ab18868070b2ece9474bb4d6f4031689b9dfdf4b06358a7ed6fb04facc31d6b4f07893d921cf969fb39f312ebc44f1d24da91e050ac135ff448b4c32e477ec33adb25b64739f214ebf4259672eab0d85700211f7aec4048d7f67a21d2c5137ba48bc3f1280e49568d5108270ae9c0f98a467e3e2e61601ce5fa2db68a54993107d3101f42658898492192556d7a471131d3284631a665d81157e9764faeb46ef1aa8ff14787740d394e8fd9dde04c22765e9e0e121efad891e434929c3e76e90de90044d7c44296968e0344557ad5c7a56a33eef39fd5417471382e4956fd869d90a938845c0fa36b4653fee20f4e5492acfa1d46dc2fc621e96aa2f6e91fe902f2d9a1b3fda68a403cb558d5431f7b04fa588743043b9d977de4022f4a179659fbccb379cbecb4f6aae27dbc304f15710fc9822f9b18dc9464519b9e1a68c38704407a308eb690298559640a675e94dc8f86a6467fda15ee94491999319226c7c25d16233ddd35618c2ab2090997cbd0688c28e48fdba8188328d72c8c31943f8e63115ac9b05c8e1ba3070bf66437ad62b62f0b4d4d8d5ef9e00534a8fe18316bb08479010645c81b504be385215ed0f6c61b34bb1b4b2359f1564ad3d4d4f42afe244916cc9646ba6c675de8c205a9fe33fc596b83226b83236b03a466c1dcdd8dc530a2faa96cef183cb56a9ecc2f67ed4d89714526e282400425167bcb114716eeb41c0d996d0862509121210614f9a3c938b82d191a8921345f3b881124332fa659f1ede180724f53a3e606b457956786466348ca5f8aa8075b8d696dc8f0917e36e43893638d29b96fd4c3e8ccd29bdcbfa24975195bfc163d9ab7d34773903640de4e4be4203a9832c4d1c3799b3156404a28f10f50c6883f29656a723450713f19194ae99492c90665be2d36276d7ad5b305673700bab063d84aa1952ce5a04dfd5b65cfe64a3a2fe9c4aa0cb4217f574683aa99b101e686472d310d53dc785386d1664a4a6443446483623670a60f89a00db864b371cad9ab86df4eee222dd8206dea45b8a227c82d1bc68e300080949b21153c4a79e6fe6968028a12474a54610b265e9d85143cf1040e8a30c60d5efdcbfe4ab6bc942e04ac6c7874d7c02512467b5962b451dc5883458e7f3c0d9a18b92947d98e0108b75bc6bec1cc29080f23670514ba907b253724cae9d1f7d1dd304b1193a5a491e50d008481832c8dc250caf25f1d91a59118b6c8f235dd8246539484614acd147745434e21c5c85286210859a6588ec0052665305902832f5e56ba14c044148cb0842fba5083315ecfe9e14347946064d8448c1e64791cf8030295b2a7f2837b5968ac68b4b8df6a1545fe58a4f0d04811ca5d9310a18b3e62d82d59b1bbfb70261e072e6ee3c0859456b2224ccb0a55c950a6650c36db2d083bce79e5e92d7435a5135bd93b1305dd4d834b27c5f08310c209655a4a3f3b431929c60621709b542f63992deddbecbae1b63695b2d730673d16db16b3f4aafbeb28538b731e76345a8fd238279df331d248699fbbd4e6898374967827b716b12e5c0a2784725e4e49a594523ecb54ca5a8a514a23593057ec25a86fb1b04f4f001562f801c893474eec8b99de46ccf4f4c2198961d8b173bd82a9d4c41f16846252ca2c07a179526146162ee802e1ce398140a41ce3e7163e723dc412c326a6f42c41689e52a6a057f3bdd6facabd86dbb47c760b5d9ac59c87490c7bc5b7571aa672ce1c844e9e196b6118156266faddc81407a179e2dab486171af81374f590d0856ac91c68e20d280fbeb62328d46d1ac2170ef9316fb0fb9d5eccfb2929ef7bc4777b284f42d6bcfc7c9c3e7176284d87d25e763a9c1e71432424a41ef131ef4ea3f22fb5f2efb2d043f8ed107693c5da15ac825f79eadb842d4ef5aaeb3ada755dd7bd7ad8af376f234f1e868fa03ebdeea9981884e6884750469e5835bf93279e18d78326e64023ded0a914cde936dd593ae7ec4ebd2062195f100c022e4ffc43f7ce8b191573bc9dddcd0942564ad2d0884f451a9d473f71f7bbc979e79452767733533c789b1e4b1477e698a9d4bd19770837cdf4ccfef4db9da44d9bce1d411de9f90b8567b3e64fb7e9e9611f4dee771ec6e1cf6ef8bb1afe525fd17c35d9de7239aa66a8442cd695558e2aa56866000100d314003028140c88046391603c522515d10f14800f8bb6466c4a17c99320c8510a19648831060880008000806024a800107a5ace6a002d651d532c20b0280d987dfc21fe6f577a97f34dc492f25c0ce21e49dd8a0e52e439a98c5e1ae4904ae53a9e34aa02367b6486701ff5a8bf5183c936d4c9dae0160a8680a5c71838ea30b8e2120114289b9bfc07ef482e8ae16d61838e69d4654097b9fd196264bd93ce426a9577028dd5604a099d99d72155b1cf494df93841b13181cec23bca41951fe9639f59499153354de76f5c7b5fc92e8d0dd1700539a58cfb244013db498a76261112a8eb05fbd65d5f6ae2ba782a5e5dab57e1c2eab78e277422bd460a15306db5fcdaef505f6c9cfe46c9351a0f41e76404a30cbc212172c8749811c74a822a0013f3229edfc65c6256d1a31e553781b896ab39c4ff2490a8c4c9e678437c0b06ff7a3ed6462374ddba6eb002462f33ea9f82d7c3cb4d0cb9c6d60f8d95d6dca4bab0ba3bff7b23428b8c75f82316ee69c3f136ddd43c341cc24a6acce4d620f0bdcbd8237a2738afb9bd02f6012950d09ee135a86e4f7b14317fc8a0ec874b381c6f714520bea498cf197442858521c23fdfdfeed71d1367c850bc0919346758a5d96125b4d1364d3dc4e7b54742f83dc3bc49b3072c041298303705284842b87b46247000f00c6af197f00b5590415abb2bb90f29c57d620246689934943cf0f2be3dda8cbbf41ac58439a6c25c08537e27818311371f8748c2f958682705f83c023f4439d295dd6b1dc00a563076a83e80f97386465840d7b4e508d1ac90d555d845b3e8c19c2a037e7d610d78f886f67e3f2d770bf7a91a55b210cd135bedf94f1ed850c55d438ac8a63d0e82b42b75b826a4e20971d47b32a90d628596b047c79f292725674414f9b44e6f890df14190f046ed8d4bf46204471ba1d6e6efc76a306c4a413d0c50ad235473bd2e2adc227471e04125f681154806f4fa61db181d0e9d62c010f8f7b9690774226d4bb8efae0762c5e16b478338669fb1ce08020f042fc6b9be0ce2ecfba084e7767104f095f036ad77ae19126bd43542ba8956493f97fa61b6f8313f78b247d730ca61c43c6326ab6e2e1b2976cca76985ae5476102f895463682cf55d50900c08fdca0cddbc9af7067e1566533a735fcfb7d9242612bcd31a2947eacd81abbc58830a51ffa4bb60e374ed071661113331107fbbd634a820daff54cd00092412c9a4e71df2dc7cfb1a7e863af431ccd17e86b3370c0a85c244a6da9d8fa26c8551bb046bfbb69262abd7b7946b768808f9b6ae5d326d07084620202c063a2fa34f48b021b4d4e0341f373803ff466017e85459c05d803ccd2c74a6d4322d4842de8e626fb157a2b296386d38065d59ac3e2f2dd22ba8a123edb64434d44670ac7fbb1c17889fd331e832f359c6d64a77d800c41c3890683e9da1573e5c3cbff06467eede2d317d913e73a8eb2dfc9e6de26efa1b0a364dcf1cb7b3df49fb6dea4c92c1f18e16641acca2612d25883d25bbbb3f01f1ac73ae453a89a70fdb544dc4087530cc3a1f08480f76f091f1d0d0b8a4ef70c7f78f7231a7d3cdff2839885334b5b59a36e5e0caf706152c5e29dd2b288b1396f5b917406e3f300ae0ebe063c543fb3eee1b7515e1918d1cc869c7cd441fd366018f2dd6ae006789c3a1867880dc19ec914db1a1f43887a391b3beb6e99e847983d5c38571be16dc21aae7d227931e8197fb2b25b2bf0a926d3ad7f6580a6f81fdecad569fa7310d9f81824a7772c8528e1f09b62b563f49a4abc4a492c19b74f7b59e4f64621e3371f6fd563f80324d142aecbf188127aad7885d07d29cec716009715f86c3018a9bd527bbc1c84565f67a7a92b94c35a29f1c70b7837e359b5e67773b115d67e5c5e4a82e03ebd7c2f569cec302aaac6e2a3ab394da869b6c9b2b60ad5e8d86310753b02bbef19ed84a5c04eb830ac8f47ba64b812a1b443814b0deffcf62d20542d3360df1c628da95e06a947893abdfeccad4439d7b47a55e7abad8a5ea2a20a75ae248fc93bd57d24fce5b9f1bcd89e0d5f07e28d01e5890554ebb014288e5bee25d9577ffec0044c54d8f2c9d56fe0a30e500581ca61827449149c5a519784c6af5797a10ee1cd5f269ae95cec25275b791a83b0206d0a3366bfbc9c900887bd017321f1f910aea187ee3659a543bdaa708a3c1fed6d0e0f18175025a4a8e88475ea45d1c490d9128679a65df93b24e1c48247735429969cd750f0ba9d290b9350c76cbf30eefd838493fc088b7280ccc5f0c92fe0388d789dd1164424af73e2283636b665280c520e346776922fa592cb5fa952ceddd89d7412f2c8fb2ce9cc079b7a04d33041dc0588710e553dbe510f5386311543eb45dfb5ab9096adf8598992ab1a791363be37f112c33cd11f63b04336ffa62c80ea5dbb8cd0a621cf817e301671ae108afe1441d6e401bebc31a9e4365af8419dae016a66cef51470ebfa64c56f76bad516d22a48ace528beeef58400f67e9bdea97cd10da1666258295c21bec1af045c1e48062bc6238d907c014a418bad39aeafc9a85700c0db7be96b63f1488e0d9aae259d317a17c6e2437b61b4f89258619165620ab458d4d0dd72134cfc9be37849c76a925318fe72ad6a730cd4061920684a53c673b9456ae651a9920e748d5e2948f9330b98313b47c81114f1efa6400d3da4ca14068d5b975d1bc5ff8ef5d8914b9756ba577d0d17e2fa874864acf9ec7b813ffb11f72ac5dc8b16333b739d89ffa5e138b5172011f6294defa2a491a6a5bdf7e40a3b9ce0836ece145d3fe38a9f677271321a71693505846bc9168dbb3c860c121297c7f3586bbf6954a5f704e0be3f4bfd7b1a3c5cde7134070b209d81b000298cc133ac3006b2a4473f03cdd8883deb616086012bcb8a0ebbe29dec5d47f169bd9ae1f03d77714edd452e9a7e03808d0012950bc2696d605cacb603b09753afa244b9b42d70029ba84c919ab261c11c225af0eff8d50ecfb7b57445d994ba29b201d8b033b8869e29efde72fb5c38c6456531229bcc8874d0914e4426a39a55713a538f100bd20764c1b1a34259f933ff83eaffeae374813a3759e8b3530c82814863c5fd8cb9339da36100513452b8d8270a0db5982512dc4f88e2bb72c232e1fbb9351786976d5d015381134e7453c2ca30b2a8f0417cfc87b6b82e241384e136f265d770dfa869dba9412d38723cdc79ce5b5a251faa7a7a0dd99aa161593c9c734db787d8fad866f325315af99e550a02852c117b2d5fad79dce481a39821134ef3e31e594f3b65e7d1e38ac1bd22008c0a6980478e3b475696390aa7cd83f40338cd2400b3c99c62d79d45888b5cfee1a63a99d613abb378e5af8e2b5c8d7b8e56db6a5454643567981757b4eef3232a49bc1f3147fdeae44784248ae6b19a9a6278323ceffb4aa31fe7745dbbfd0f30da8315d39d6ab0521fedc9f829e4e35281aac7c96ecb7cb549726397e36fcc4e786d30f9bbba54b433401296629fe4f7361a1efa3a1bd8d7dfcbf3178d513c635ac2d087a65d06569d1d23d3c2f7b0c49b540db1e3bd0957bb1115c1b2a34fa0d1d5ed5a18acde6fefc5f1bbde67ed83f023df07731c95cfe8767fa40fd5778aac76f20e1c2b0fc75469b03f05b41b28b1b727e26d3d4f9b41472feabd0b73abba982680d0208214839db2023f6d912718357bbb30d66120b97f048c49a30032a2942a4e89eb8244de159d7ebb31f92e10bb9caea60fcf8423d6dd5052bfba173e99db24c45636fb70d684468290342c32303c86d9d8c3f58596425275f56175a67f92ba575c452a795a6e64062dcc21b86ba5ff05851c527c8f0192a284010cdcfac06b6dc645941f7af6564c549e9cd053f814479ea7625fa6b78697533c544ff7518400e5476765c85eb041d26f2578712ff3573c11e97bb7a23c272a22c6b760e52b6b6a7fd07e49b32077ee8f0c1cf77ce23e9489998dc9376d6f4d575075fd49670465c10d31ee162419ae3517024c7cfa972281f32ee74d63592d7f44f278bace307d688ff430689d5d933ff0255052ca0865104089d5539b900e597fb1847a9f47f9183b482712d80c5ebe8d29f398e4cbab87cfbc24d176026ca8608b4584223192301e0e0067623a1d3c36a0a1ad87472e845f8c31dd8ac08111b27c3f10b3ce39d6ea8cd5196dace06743db450b424883ae4d9f6872fe794485a406359a61645c0747ad76c0bdaf5623a5cd350f6f5b101a3050dcde79905429941ebaf714ca5737d04f07d3c0378bc8b640b466f7a4da8350b3f62645345b635e37abccace74311d63074d9461c6b27073caac4f83a3cd1988c62b63dbe3971bc994b15652a43c39ad3cd5a292c495d2dd5d57434eaebd0ee5ed1f0c2abf93d075b0d70337f2ef773a498275b08050b0a77a5246230045603370c2533647682d2c989c27931a46b11d55ccc643e27f9e9451a22b05c9a4ea96abcd37b34f2c0bba39e033992f2e522e7f5b6bb2d66b1acd14618f18dca860cb940ddfdc20036de3f5d90d46122f0549dc55bf43cccb8258c068f2b69d0cc35306095d481b24d478e1e562408c8671a270dfee49249e58b2cfa6dbef5e6e2366a6b17f303eb0863add3d5510f9c847bbc13cea1b0957b67be051a07ad6f8c47fdf11b4ef801babe9ac7d23e8e58d0ae1f4b3767e297c84e579d2db1f69335c3dc5e52d61af93e79fb8550112717471e5241074e01a2d1e63b0cf0fed63d65225509c3bf7d84d876976f7ce72ff2ea1daef9418efa7cbbc2528e5d4842c6a706e49273dec0ad877c8922a2ae4e5567e01e5c44f4f12668c31d4e720d32ce5d7ba59110de940fb028b6a03fe2178491dda80c96f310118cf4edc5505dfbfc3e639debd813c56478e04a18e14f820e4f3754fac7f57ab0681fcf817e7f41f9fca9510a5aa30f6e15f20b65f783c895d04f81ed0cce82d5f9d1326dab4bc49fcf17f42d8c8c1b83b32df6923c4756f9300b9a8ab84473c2b88ec606f309731efa241daa1a57acffe97dc51a49db491731bbfaa2515dd8b5ad28d57a664795b55cb87f7005752d5ea18d17d1beebdf41ef6621de53e260341972560a24dd48c80b4778c12c11542b5a2b72bc07e032288d0a888f478a9445981cd8d78751a609ad0f1deb57f70a3c8fb96dc7022776db4d6b0b21d7487432168e4c627bc64730ad9b8c54313f880f8ff0abfe7694f2d24c64416698a599545510e2eb843036d56d9ed72e2364024ca77059109ce40c1b05ee7245c35aedcbde1d8b6308e8d814ce4c3963828fc361f2f8a12313103fda2ab1859022a60514f507ea2da9c91564f79e4fff5214cffa31a332310f869df139bbffe72db1c642ff05b5ae104ac1b81f9600c207ab71df841d9034177dad18fc446f2de9acb8f8f0304fa8b700ddefbb8ffba1bbdba8aabc9370365e8fc0d14a9eb0f2166112e6abfb38eefc025e9578ca2fb70436003c307fa2508fc1f1774411460b20aef7e9cc1e6bf4a897098fbc9c477eba44f0c3f14cb107cb00b75675a0edcb8d35e9d3daaaf45fbe6643204224608c660ca119aafea0f64437378b893e4531b0a31cd11efe6a8551807307bccb601de850b24517e808f5090045cf21a7a86fbda882ac972c35d0c0938375fb970b6d19e6b53f49c10f1292072f858637433b9e785168747dcc76924398788bce18763c462619e8d555f07c1c79a4c3304e99d53c575cbdb5cc08decd004b0da28f317ee7ed0a1e85e532fa5d62ceba12d9725cf3268474d245e361dc424130ff0b5afb134681b06914ded60e878551ef13d6cd8fabe6bbed881c168c89014d244d9dda8747d7b77d308fa1f8115d6ab3216d829670b7051d8c36353876605e5beb8e65d896006668c918610518dd32bb4e20a52e08481d19b7682be2615fcba2b418fb980dce72a3f2d85aca4802ff6ad861b200b6652553819ed307fb2cf3c4b66ce2d81febb0716dc3f7882191a4dfa3a1a59ddf8df1bbb8ce375bb4b3b6b60de6f0492ff2f4b0423849fc3237164c033fb3687eac77c58a300e5bc0a909338fcfe2b0bd298ea0323ec406c04c20acea0d9e0eb7ca3003b69783a825fa4e99d67a0d7747f7897d84d54efa558a4264ae14abeb4fe9b52694956b72dd740947e004cde7bdf5ecbbd764cd1b5bf18e8b99d4827b6278209b24268a240a1b78c2f710b0a033921bdc31d1f89904badb8b40edc5ef4e7d8041679a1841699e7193e7523c1c0948ac46b195a9e2c8e308ffae0fe5898c951d8d25f14b9455093210bc155ff4c00c4287fffd9bb3d7ef2e06419694faef69200e7563145491d736e26d397036afc76254c7fbc5123480bb8d40b850c79eb7638a9289099cd730d303c9841ac4925fe6d4b0e8e84bb44dce5f526f61c914062f19898fbce8654a58cb82e5161e7684165eb46a54328d0f83a311d98f7835fafda7ae3d449032cbb7981824e4e8200c781fc6e88741c613b856cd927761ffb4d679dc31a483beeb288610b32c5ccc42c3dff0f9e65ec7ec4aced5c9b115b2f15d216b0829d86cb5c29a5c401611ba8371bb9a8309b40df69412e3c982f1572c3bbb52cce924e4418097de1247b9db7182488e8d8924e07832f36f77a82d8a49fc5ba484e6286737c458d48f0c140c7048749193d2172033e0dce65d15463eab78b6191cd1d37488aae14fee60daa8d2d27ed007f004a94feb383de2919a6ba3377be2177e57957a8209d03c757da4a1274397e606df95f5e3e827fe1b7a943467223a3cab09f74967bb826c1ffb80e32497716a70020b8dd2c3da3c68f9c86ffc01c14d0b26f62a564848e263730e3513248f1a249ae9dec100c4871175de2a17547201d4d82f0945724eda3295e0a37154d81610586430612e365dd7342232ee0b7ad136d1b56f4499d81c4da12542cba8230a48ae6c29e5aad7700f7005769b05b1fdbbffc7c561c6c04cde566fd995f22bad951259da397d3d4f073cf9285a7b26c290426d07d53a758d883225c40bd7ed993fd3e91809e4c87d468fce3bf38bf205e4680883f52c0d329d37fe45236be202346532671d0461ac48a7cf1382b00f1f09d1bbc71bf3ef102e0501484800c27380c4e72422c9788b61a4d2bda8abf1363fb75b7293cdca2213c5dd5a29a4cc5d99cbfb666d81e88064ad129e1020980a3b7e7ef9c4c4253f1e16086ec05a1cb6ddd77c0e74184a4db2ef3c37b48a2aea016683e4929e165a045063525e5f6f7350729e7e9e699861dc84d81ddd6ceed10a3b5e0770ae672fa96e59ca90d599b314249bd530599121e4da7618438c6c78ab286f0810717ac26f572764e931e1e3375814f6fa530f3f37e05517a8ce5dc4d3778645d167397e476821dc7efdaf74f7d6ad6afd2ac70f07dbfa083f478acff99fa028722d2cfec4dce2a40fe289a6402e3232317bd5643ad3ae22e92053401b221e9ded74508ae7091acc9554b70e0c6577037d74f71619a2df5f1095b7e4c58dcc805e47a9d1110c7145841bb9b849ac03ca2ad243572eb2e21ba76c021522bec736260be63e56867d02190030531bb53d28614a03d1ac277df14ac0804a5c0c4ac893ddea2fdcf990f97590b993cceaec9759e4846ca9c29129f84edd50b51f67660cb9d29b5db884b22bf3e5d892deeea16ab93b1fc267d34fdc4d491f315e9e228ca0ed43567606d36b9bdcfc61f34afce8a4ef267c93143b6471818ec5db54129169dad331a752fe8169ae1918ff8579828ee3c7a255cc781615719443fbd46f675623795a3f6ca5bccd4f66f5c723710018b4b1745e2b4d3549dc78b0eb33e534d7c821ee2394c683f0507a6dd0132792fc3b02b57bb098f00a4c76cb8a8f6010d9c82ede3c20f3323bd44919124f24e7ad6e27b2f595c0ec696544cff94d1a2bbdff18191e291a40d14d08dec208728b0a7542746fdcf0fc476e2d66cb7b7a0514d110f949bbac09ecacf33c9d93edd7440eca91f15aab1e656de94e3a28d73bd4822e164394a470445a9f3e35c09483addf31fd41245add9cddd3bcef51d3caa2533465761c8c1b9f03bd148cbb5c1a9a7ba2e4eee9790b47e56b5375f06e8e4f8582661655be3cbc14a779c85f942439712c4260bcbd0d03bcb033eb57dc0505395094bc0fc35254d005571c639bee019a62bd45cfc22c37c837e997c3b0faccb445593e566966e3051a52362be0f06ec428138ec2901a6a27f8059fb55232d4efdf0dd5a56c417fb97daecbff63bb2e69e3e26a3137947767c3802745ed066a6536dbdc8a73f59aae683716fc1d6f2de8b9754466c564e90d2028a204a2da7a8afcf280d7d716973e6e12d7d1bba86fa44ff81a92985cbb598aba69017d41b64ffb7bb16b4fc20f986649324e09221de714e756030435ac3a29260aa61d9fff5a73fda7b9faa25d0c7d798cb37d9353c99d1f83e25fbc44a14465287dc94a11b82448be8b03a19824baca5079884d4818c468a0b36cc297e81882d226131c7a4e552b6367bbfaca99f320422286eff423528ae6517e60252435d7ed930c4740a9049ee48d5ff9cfe42c34000ff7275117327f96161845b3ce9d7cdcb5d0c163f5c2839c83fbfc6d8e101435ceba567c90772cf0e2690b43b4c24f551a267e98d9432666c5d4246428944c932f5204c8cdb4775dccaee38cc7b2e8d65d7e95c1ea4c4a962bcc0e32c178c7803a82852a536088653dc0371da26cc5ba20adea112542bae4e9e944b5976ace90018aa48442f7e07e1322f734b72eabe548645d1fa70573202447fdf99ffa256ad0eca14c58f9faba076e11f95d7daf1407d0cc4a3d89c50fb8e1be3b325c2c1e765fbc7719a0279e954984c16e603d9bade8959e1df187af9b9e269dc1ff80ce25006a5b18a0c809520ee5044fa023a369cf80ff1adcbfe1c8ed48bf0cd8320e9e03541cb30a1bc21ff42ad12af031a3c66c10932075f3ec35d8c7235f73430304ba658e344fb0c7d5e2d74390df0ce287b7d845ded229ded69e370b30a6629d0aa5e300c66fdfd9240397ff7081d0b2d7558c885b6d450336ff722334bc6f096bd1d84aecee9404e06b53f26d028a3d8353493024c609a3751fcf66e6b1f18943b7b82a28a0290d6e31227f02514bacd92ec4b0b92631b72254935de03113cae69bb11d2237eb86e5b3881005009ae8a43823d549885f972ea91334724221cd7c6f9181936f47f1585a4eca0e8f86a4f61c25ef5a35cacedbbc06ed00ca4c2d454050845c55501bab194382536abbd3e20ed8730d07ed01f30305716812de81ab9bc908dadce3d7aeef357baf679784840000fc16dae8bfe1dc535bec61c522e59c1d583f03b77f3037c1e2cbfe45a269ff8ff6c12205f926edd6763f4db4822d1c064fe27a762fd508acba0f0013d6957c435a449408a015fd51f0a2308aa1c10cb3bc178531707ec8800ae1d13d10680d07dc9b3e289ccf66acf0e4471bb66ef504c815bf68ddb4a378001ac61290ceecbedbe4a1454e83f59e8a8ed626a210a232e708149c0465bb0803f4cf5caa6f89d45a966093938d255bf63d1cc1510e1290011fd71b0550f017a7bb199803565368a54781d21d47d15ced604827db6b0b02ad0dd54401ac645288c3c549e14568e353e15f79fb4c64e7e869f2074833302c0400c03e8820517832fa2b4bf825af38d730d0e60d3502d39f7d22f86e077bf5b4718f792b1edee19a121ec7994d7829438809734a5cc54f84d9f584698e70f7374c334759b42fa87f3575b8a0f75ca3fcaf63e603e3521909f513258f243c3e21d290bddcad00c87fd716aefbdf0acc2c5e5b059a4eef27685460b4f384bb3ba245f16d842afa3a8edb2f8664ae057c492b662cbda5f4c5c5bc178f6dca69212c4dad57d2ff2535ad6509d7f5c080da1d9086ddc3c2ff4cdd1b154c6ffe3e88388e3ef7b185f7827d86c3118ca939e697d8ffa8682bba39f2f6174723bd9278a8cc2d0353d1bc2c6c013e8de8efb7cf2e6bbc4ce47ff7ae92888ead07d8079e45b10edb4321310c4cb2e32077a83f2fa4859f382df9c0933c77858ec55069dd0bac4dc3d33486bc197f52353a92110a402042566f9b9a21b278b99ad320df7ebd895d1ef886e13b8f7cea6d5f804df290d69abb26f3fa01445d810ab6c984aca7b99e38b32ccbf69117a07bde3917b451f4810e2c324e5ae7cebfb30b05af6da96431140336e2875dc7cde7f65f7e9908ed6ed7d13afe6e32b0975a68dfd9018b5c1bb97921a1bace3530a960ac77d968e79cff8269b4108c5a1d9f057c1d5852625b0f797b704a803679e4a86c1e4d6411050534bd1fa5fc53d56a05bb992c23a9d5d8bb0a1e50b0c9117a1538b1610444af91d05082b0040477213a77c2eedb5b5f069d241c5ef02187919d72f2ec6a33a11f5456bd123b8b21cb774bd5626dd3010c05999e3dd6549480f0ca2f26b872984bf9192205c94a41a38dccadd139f526cb47cb573dfd2c9298b8cafd9e40b6d1aa72dc46b1cb5546edaff9d4e2f6f55f03f428b9e8521602745bc5e72b860620555c3adb605080fa202929553cf1299fcee12e479c75f6d6f3c2f1fe2eb036f323676de4e291e97e0a1c5e6e1c92002631e91e2030b9ae32b933a990516856fc2c2398078a3d0b51ee753fd8f5fb9d9a44f7c2cc36e396ee338fe7a9738ad871a4dc6ba5ec26c527da007f6f3cefc76c6e204dab9f361721bd6d204ba1b70bfb45a0762c8395de35d1dff5ffe457a23e8c69afb979cc88bf5b85f2ef93eacd9514c6255e94d2d0f4c8b3bb16c029d03957ff8ea35808e6a4245ebfa004f95eb122d3da58548875f9765033c5e52a8ad25b3f5eb1d0310f8d1374a0271a91a34736148beaa4f49112f7ff0d54b3d1b65833d114b28294665552730c4255248a1660356f26829e88f50eae7152105c042a87a8c69417c1b02140cdc183e7672861e7e67b934510880d3acac4021c420dd02488c369e0636133d4ff521884927d06b7a33a6427860f8884ad8d73f56edf66462cb3913e683bc37ba38705a2c8f594432850044750f5a2ef342eb94203dc2192c19f35abf5bab61e0ea8986b41fd8ac98d47280a1ce0d802abe2b2e2815fdbbbc35b340b4f3db26483502864e6c15d42803c3575a64109991ccfef6846cdd8fda95b517c7874ae998a6a320a3ccd3e29c2d37415841ec1c5d2b20a1389b4a820a1a8e068bec8c5182ed60314375c6675058542223628cfc30c906d44be16e4e0dc87e1ce3a1a0aed480ef2dbcd2276221c8fc090f7ccd06bd34214e36d4d11119f15e8fa1ff9fac668f4766ead8b83deff3c7f8fa6c4ba56f8de2bdfc8979df6cd20a9fcb908133e6dfa5bc9766f67c95e2c4af040105a4850389ec990cef55dce3c833352aa11ff9f06d089094b778fa84fd918f1f53ce1902152910240f8519b0d5787c3ae9fd96f72a4524b6b85f0dd1fedd3db005e4922d2060dd287022800c3cf8ed2ce578f20bb2630e49674e34c1eaefcc875b87c3dc53736114507e0611e8f7932dfb5f9b35898fa01b541362f84d329fa0ee4c1b6933a05cc040f78d06526ae999ffcefc80ef18cee9df275830b6fa54ae93e5414e69a29cce6402be5dad1b0ac59fb3ab01a8b585936d920417efdb771b249fcf2b01d3e572de5e8223eb2ecd39bed5f3ff96961609569d59b2115ecf2269122c9108027553189acb6a4e40fb58b166fe9f2c8400a0d47fd13ada33437b74a310cdb91d23eaec9fc5a8351432c695560c780dcf7638ebb8a3410f292cd2b8b639b0de218e978ab1738a50821b6c195947e427cf1ae062fc0ecc30001f6edda63020bdb33a36093e4900253476f07e70132c30397abaf159cf910019f1e04ccae0145611858278e88d5f67c0916707f7375be868b4faa1e9791a4a6cdecf400c6644b8294324a1af66ff8a5a9842aff1755b241e34806ae14e27cdc84a491652531e079ece22cefc814881b92feb96e4621bcda96e8b52e139762443c7333058cbe748a57d38307153fa6f1eb5f0c78936a4a052e98c9a6d3290d203204acc81bcdf267fb7892c09aa4cf5cf696d02648edc5f3a2b2d1134749396a660014c635cf39e54b73d552180b9fe22e40534a8e320a0cc1ed36b10485bc69c678c1f529fcad2072998bf8d5d3c520dac540e360d8cf9138939725f7a23ce9c76cc933e2f76c3895a162f41797f52eede007d53c9a5f0e621737d1941107169281c6a5489af3b5473bcbdf96fca898ed3549e335d940a4f960b3069afca8ddcdcfae27a1fbb3f625e62b39703329ec6a4ce135b5eed6964ae98a3d98551c563ef296ced1bc672d677ab2f3b4901e4a9d4139c5cd72bfb9694803b0341b32f84d101cd409b4db02ba285f8174b0fe35e51d35bba4526be087dd11636ec1646408db2050c29338c31f88d8b1aab0d6140a42dbb7cf21ee89b7354b22b99ff275688a8e41fe0bdc275e9c68419f95f5df045b286c36f6b74cffcef4a148ebf1fda2c942f46d0d7a3d7b034a82dd5cc910d22828fb065c1ecc45ceae6cbcdde80a501eb63c5737d91d34e6b339a22d9ac9dcd396ac3d54fe0b5e1f9bc7cf5259d67391ddd11fb6391381b14bfb918ade53c4c5535ccc82006e4c7b02fb7f6474ac7c84c6f4d15465ffc05f0b9144f50a623a19099e071997bdf183e4b141ad54f038419dac3055b162b02201c9035e9e494253b97071ba9b279c5d6b8e39beeb2721cf59f432df7a3a15d7713f81850679149e02753938f6909e092f598ac5d93d9d9f85855e00fde40b6d40eb6f924a45770d004aeb64d6110258a0b787cb4a3a0eff08da85c764253a154caeb724b0bb6c2cd4011a311b556027927e282d0c00739ab6735b13da59b94d51ecb2816c886ad7d509ef8e7365f09598cc20660e5ccf36ca0c1920acbc7e68503bb16ba51132810ca71febea223553ffa61b18acb064e7e56a81eb67ed131209642827cafe8a8e17c606474a8a728a68ed524a821aa973a3a461cc738040261c8a2112598830e19d177b932d077fffdc6ffe1bd1a0056b93ca314ec48f9b718382f2de381a03c7e895d6291a7f536c139f60b380eb19652006ca0681f7cd3994c29c8af6d2bddc808ddbf54c4c1e4a731508ee2984ec313347b53ac3f436bfee27435073af58177559769af7f651415f8bedbf46b9f50a29cf869ba4af49f89b8f700b6f96e6ee8bf8c3ab9cd70d039c8fc2e1706b633a05c10a1504c4537b7d0f1f1103810b92885c0f630e0d98ebc9b67b0f0a206b78eadf8de013c4e34b479bc334637a100226185b469f1c29c48dedc7878c3c7f1493b0dfbd467c282b6de695854a8dd8d0085d7231d446a068622d64998de18c947ea6a9142fa91aab1204cf3620c1995fd07ba1e4e45358c922d43465898fff6990ec023ea38e85e812a808c60cd3ad1f220080e96c33189aeab075038d44ed08cd7ab81e5fb7661986a98f3233af6478f872115339860802271fb2265c80ca992076878d75dac39098625e84756c2ceb1117271d566e89a3659993f04209e7e9bce80f998f5d8a211673f45abb630202e8485eeb13c9eee22e8d6e38e08b64a3c22fe5f37a63ae5409b4592c20e1bb80ff34a8403c118dd5e4f8adf9644d7b16d470e1829e54af45d639226c72d1a29b7149c09d0733aedb16407b4aba566b32e0040436d39000f574a459e931a26330b7c2f66d7710ff0e0c118e201b9569ba110b1377cfa80a5083a1414f23df67cb4c982259d7e472170bd9258370f0ccffe472b06ddad359066da030bb8515f59b7a5ec06a18014b4d4297c49960f329616035f98103e6442c13721d6cb11e706f5b3bc840e51020fd8d15c7c03e017ed5718d4a1693a8d9617422d725d8c9cd734481fc8d80634604858702b8c85afa945a75e0054ababc6218c8651223cb3644afb55455e24ab9a3fd5e237f1ca84a6bcfeca2e29f998943d416f960183bd3ea20fed9c6d8c4fe9525889c0d362533a6b56b9f8a0099c1c0d39811f2c9fccfa095cdbfae109a96d3369fe6f74329d711179a2b9e101e8de5be7ee3017751e9126b3c1c07d312ff323705de24d0b9b0ae95a485a54443232df5150ac22e021419f20d96d5e577a895918e5d952b517994246319c7c9317978818f9e60df6d381cfa87e2ee9f493fa5d710b6246f26bf4714aabf0957f7948d4a2aa6b56771e3e5e60ae6646e3f2219cfacf0b0ab344707e046030bf9c7ef3232736102adc1db4761ca62670c663c8453c7132c9f9ee8195d39e1db9bf6f7160c9a14f9febdbd4a81ceab1066db6777c1bd967182aa0df725d2a32f711817ed30724be76923e94cfa09e3cc46c1bba5518cc5960d1126c24aa402c86a6762aa3a7938561d0dde9304145d45ace88facd90ffec0909881a6a3eec09ba716b1069ba34cb95d6447013dfb5b1f5e83909dc9d3a4648c4acedafeb07913aafa932839099043ffe4d45e8bfb78db805ed33e9d1d61719e90ced01035a0ad3213bf77f3ddbad48689acca843d32f8fb7d5d7cd114f5f67a74db27e1f00479c46c98faffe756eea4ffc8eeaa938727eea51577c07a9041f8728e12906b8c577cb537d31e066a8917faa2fa1bd99fdee39e7fd4bed110a5800b66cf55a82b85ed323e5db0198e3d836a80797a4a96188587542087af93873751b3411fc55d415067c3b9aa4392564e3a8f4bef99a4f4bd42995ecc38c1892bcd6853c7b8f772679fc473dd23c642f740b4f33315a203e7a5361ee27bf27c1f11a1bfa875647ee6f479f52ef477e2e646b043eae8e99d0b906623f00c9e2dac7ae89560e69d79c220350cb01e250b9b5c2ca9767b80fad11f4060d412490b2fc10d599ad39936fa05b22a5e9b23e661aad16518f70c3511139653da9f926c81d7fc1b79fe521f7fbf64705aa07b5e866981e2b7d395f9ee1f1582d6019ece8bdeae0ad744adf8c4bfef6ece6a3bd80619719cfe216c4053a6e12965e9b8ee3c64ec1f87344915fa259e3f52cb24fc3be699a06e68ea01006a12ad188aebf68b6187eea698c2769ae16cfae83e16c62d7b7e7145830de10a9bc91cef9bd3c0b0b4a51a40c6faaf8da299d221bb0fcd1d0ec12664fc5714dc7bba89b78f70be19bef52506a8d515c7a9e6d8490dcfc02d63a332cf07ecfb89b6f91df9c0f406400fdb5041cf3bbb4da8a1b87bffdc9db3cf1fa666f05c848fdbb3c49023f09942335c416d8a8aa4bb7ad38d049c0d3892495677f3798d62e0b5622f9eeb70b334ade61ec2f565098a006d460d8432879f8c855a13b4eedace4338bec18035d2e1bf48ac898b7672152cb7d1401b6118a9683bf693a19ad11d69b0d3696572abc8df1db2d18b8eace131ba73a7eb619dd3106c066db9776ebfa8044b618e26d8cb17632932a2dfce61cfbc5326fec1ebf06368076ec176f288533a69c28b3fc0a0d0fdd1febc36c7e8f51c6183c88c1b1b0216c7477160f53430874399ce3046de86f40504874781cc3a436432cbb11762d82135ce93c5033f9cab93fbd86d6b7e74487616b5944bafcf0e69c166967bcdf9b921310578cbf9a0eb83c0723d6116d67bc538a0bd2a1f5ca621c1f742466f61c3ef5c8773c4123fa6463bb9329cc9fb978b23ee8d431caa290c0d8161f01ec1316e2c68c03c8751b39a1a56d882f6a53587615b8473ff3503f4cc320d6b17626bcfc5a9160ee5c8c2781210e67da40f95cc4aad7be09a043ffd8a28d6d517ebd7df89c75dcdf63cf955d74e5e3b462f5c54b9a95403c793649a5bec6a8e59f930eb1bc09c271a350a9c77b911ad160251bd15e45023f8c3482ce04e72cc06f4b109531e02513903880f8f2b545c367e4f23d7e7da05af523eb7c9594723e51963216ac66e2183a9c6ec55492ad626a8a0a8e8b18cf7db8950c0d9b7d8b63e0a057da0c2d90bab222774f37a6709f8ec8fdc94c72befaf39b9a7b2b3a49234e61e7778f87edffd3e6e7ccf6ee07534330681e077fdfcaea8272134783ed2703cd792d78e4ab34db7fb0840b910c40cdbb08d0b20bc0cf161c2404d07ace3c3431210ecb147d7eff1a0314764fbd5ee7cecbd199998fcc193d496d96e23ed6dee054913ac8585aa3ecff4f73e62ae07c1d40bb40d62d5dd9ea3745025fdd3e76aa047c5a27d9dbc3c42c9feb1a42832a4c4a2184ffce6be0117dd93e5d9074577f668a633f32e1c544b9fef28251658a536b6320684b6a8549115a99b4b1fdbe0befc78b487e5fc35742363822639579300dfc072589f83a1579416c0f5e770f0258985ae7a15471ee083dca7292fa6ed3bdc8fb831d38d555d84fa77fcfe682cf42058ec0f3cfddfe7bbe9ef5bc00a17162b93b4c06a0e9408a259f3d1f5341134d1aaf81a3e8de301ab7be9238e9edd1f64a29866aebe476fe4b1f14376dee1ae82f04508f7cb4fe8a6613cc8bb4794adc43784545b5f27b39a1c5c040433e054c7880567bd6665a8bf2ac650aadddfd2419ba88ef8d426f77ce3b3d3d97809510af688c483753e9028be26015eb5a52ff78c0615150b75bfb1b146f66d98d0e8b4604497893d75661d18f38010f9209e473516a1cdc4173fff6c86a9dc00a8f000e2827c88c59d0c30024f4aa6d376519e1c92c9da8a2090381197b819ebab781037770565d79e855811588358f59a9939872270063a20c7b9acbdec8d85bc77ff045470538f00109a61520aecf209c02bc4d1bb23d2ac061948f3aee73a7cfae2600b7f09dcae22a00475db6ae5792b92151a566f80e20757af11ba9cf37aa675fc956728acbcd2835215f9bf4756987f4eb2550a33b643df494e5ba1cdb869b21060321adb902b579a37bd51c11e1432e0a3f28eb48ba0a231ad3c5409aead6a6d1176e54c61bd8a260e6cf9e0c6e07908ce88b11e12b51e5c84fa7a0304c5baae23b00ed0b9704ac4877d29eed554882f2ede2886338355aa4269101828e46cd3642b2b18f12c9488567513b96f6a0b7306d178330d2ff348eba9ad37accf43657adcd86c76c3023bcf9397f8eb918ce97cf36b95e9132dc5b795e70d5074c5427843c51bb45be5fce571cb495695605a975155793e8ed26e5df0389d1b33db759d64be785c01f0040f097193a9ecb598dcb5918bbb7fade605dc36265dae8a25abf31af4e52a0b2cd0ab2120e0f45c3721150d8e49ab4c3ad132f2a9141fcb5580b51c0e012009023b33eafe04091730063c2818f6dfc9c439e9fccacd50d11e8b1928bc0d4e7bb1e3fc152df44b08b1842261dbdf704e87a8ed2d2ed21bac3996a807916953883a260e33aa3ce02ff58fbfe58ed95ad9500f67d375e308b0a049969fea3b3ed3e04b234a76a647793f1d9df54e7b64179df3eb24f289b1c564df1ae1241d3f6d091d4b307c71b64892c7204e846f880fe936f3b22e2c84d84ecf433bd0e78ce5e8b8c7bc6c3af8697a87309fb6702ab92226ec234bc941436cf2dfeeccdf6da819c21bb17c4f7c91df64cbdb706e4ad074e82e16343648344682355d3f8395b6c1b21cc572687e574fba61ba6695d518772a3910d93681ccc108986b237f5a3b4dc9474cb5b47b9527e90bd00b80516909999585b9d3761435c880d41994910e2a71ec1b47f89359d1acae0cdec3506378c5067807cfb5705ec9c818213b72e48d071ef098f2fff5a3ef31c1c532173eb26b93ceb1a3644803e329563717d1bcc09e0feefd5676cb0176e55ef06aadb363404149645162c6820be0d7b7b20ebd638a8538f4fe8d01ae8f56d68e7a6a18a6078ec4b59b9f394d3a35ae071b9f76df0caf22c7c7783534c081f34d03384c29e05ba82f304338574202cba366c6d3f2b6a0eb583fbe929f6d080409e1a64362276364c11bfda483182c7a1d0940f665e26691c69570d4d2d6f9f891de28016a73e11092680ca4396b2abc65482b8ed3ace351774e05e3654f25908bdb465190813264a148c460b2e372032e57d49863d872de3a2c021391cf5aff3aa447446c673953ab0bb84416d3c972015601e1dee302bd2724b7d297c78b4e406ef6c809a7674ea651fe61d3631337da87142282d6ba40ceb5d4018744699cff62c1e60ff4340bc04606e08ad36cb005ebd259966c3dba05e91119563d56efffa2f5b786cabdc98aa4550d07519841c6874698add9c2b3f20a560df5d060f2f9d8dd15ad07886ab12990877b38b7c9c35b04017a6c40884d48906c0e48ecf26fc0c6fa9244d0c54aa3475389f70f38b058c9584be3b3169920b8cb71490acdced7736d22e0c1eb84cb2cec54be0de70dd2261e7155e9f9fdfda61c10575018c84b86e06f86eafdbb72c0c3172146cf3238db780e667b2e750fa17776a6e324dcb04a818e9f8d1487ee74649bc8a554365ca357534d2cfb287de78bfb83194c421a9536ab69733834ed3bd2574dc3d7d0c0bba0e0cf4b67da61d527c3d3841f5b3cf5154eb2441f5b8928ca583215ecfa2f5123fad4ad3d0753ddb6abc89496fe569fd264564c41da9586565fc1e24ae69c2cad203ecfe3d6c94074cdbd7fc5675e64ac1c6b20ddbc602e132859da7f057be5f519a7db2c2f273d7462521b017156763d2ae2e3e5e4fa63cc3d0f4b3b292dc84ceee4477479d3cb448176557f57c53042234ce7a85d6cb45e1ab10dfef097ad0829c91442032a960ee764ebe53147bcd3ec38a097c6ff96e473329169a0aa93f166b056072a2a5e4b4baa5dc9a4e5bc7b7e3c459067d58f392f7aa7338c2c94605a859c6434e0be3f1cf4a9cbe20d249bab942d74195930aea81d68ee2bfb1a963f00cc6105a6775753815a5531be30c5d01b1ba0797df1027875fd30d3082739d22755f64642fa39a0a8e5764926a012e7764659a5e8a17de069be59a836ec9ac92c2f212213e60ee8132abc285865ba0e3151aa800de5e9a85fa6adaf6d7078958229ac63dc0b47653ee80f06bd2907798bfdea8db7b56d970a26cdfc7fafe0f1b93a8a1cc5d798218893d2242301f6582c653a13963edc64173fad4bd4434ba97bb18791d1d31478506526bcfea179132b58c967be1e3b345946eda63c0f867b45452dd003cc0bddc4a8808f16cdfdec00c23e1fb76a55d662b59596936666463ed62df415ef0cacc14c0538ec936b02a602cd52c5cffcf1cedc8ef6a5beb6586550b1351fbf2cefdf9cdd36ee1c4dfd32c3b0cb629b5e49f19e048789556225f972812e4d5e639164daf7b57f8597adb200ebb5355839afab2c0fa85f6bdfd02b8545715815f64bafd379c63ba112d8a639ba91e00fb9d3c866668acdde1d6f99dba0de53ac4aa968f81469bd187a57ce6d51584e4c641620d79545c84792bc9a9d9cb5d5051739f7e90c9893baa4b2088eb728cfa3be674d9e3a5f136d448d8a96b27a33e33b26a0c14fcaaf59a9cca845e004d4b0be56e6b7c9a0f3a119f091ca00bbc47a2c8496749189528c8a1a3cf2705485c7d92d53e6f1e6ee3f2777f72bb00ecbad2998a39e9507376a0f79d8d91dcfdb8a663ba9e947c04b4e99cfe55734ed79b94fc08b72789a2e32da94022c7fd17ed8d8b6f16e9c11118f5cc0ab2a4645aab014b2b65dd52e357d7882f54d371d84789edbf8c18ea859d7ece8721d4fe0faa92d48cb8ff52f3d35acd8063d8f33a55c437fccff7347d40108a1834749841c162f1a934f7753217746141010063c395f230b5bad92c1f2aa299a74deb4547df9c608333674fab08666c9b06036956dfa1acbc2aed0ffc61db988b4c276e802a28fe30e2c4a4aa3e755e18abb29e6e97ab1444cfc91bbfc2f46b0816a96023458ab1f7d4cb5056e24fa7940b06ee03955d0ab2792718774ae52a9d47724a870d07fbaf0514d0010e2d563ec6801d111fc5079aa58aea3493a979e6a550f3c4e6f30d3425a6789ede6b268bd0c118962b1c8c2955c54cd2d4bb50ca2ff6005d5c5bcb712eaeba9cf14653bf74941ab0642fdf1a42453c339987baecb5c63ca57eb65154c1d57f477b3d0d72b1be7adfe06412ba60c1df23ebe708f2c953eba65c46a51731d17ec4a4cd62dda6d5dfb0825817fadb4f6d27f51a91b445b462f6185858f1fc36778ddcd8680445595f0fce76025225d830745c6ac6ff759c5d9010852c540c36efbb6faf8995a5ad2f1318525665984a14377ad855e5f6a7ede6568babef1b3c918ef7189036d0405f0b5cda7f8c3b028b3740ada00e54ae6ceed5790e523aa5df903880e79a751124f95e50037eec82312d4efccf28dbebcbdd27bd6d8566679093c17f9c7e06c8630df870acc9c4917dd05cf9d04d5cf79250b310046c55d1aced1b0c6c957330d3a84fb0cda72310ae166a57eb67c2153a0ff5851111dda43b5c12783964dc50db82b6cc68f82d9d2e6bbf0408a2321f97c3f61db4e47840f8f20f4622318b1dd073139a5c7ed029063a82a064685116ba67edcb5854bf476139ee87c33fc66d620499d720a63c705eef8b33808906ac47183ed80c1896a6c7da160d380eb24fd9ad73c4841588386c4d6d11f8b0c0b63f7adaab24fba47a9131d444365c950b4f9f88054fe0ad3316449695a0a94bfd65c723f8121f51b13b04342858f828a29e029faf505d77eb988e66e839a05f3a6f54e91a35df00bded656ba0d7fc8f8455df8851024af36f116b8e7fcff4850cc1e8bf47db1f102b8b6f9466a39e3d668aab657e7e8470212e0343862284e1ded227bea48714c4d0358c2f76b4e51e0e030b35ee844e2db70209b068ab87c4823537428dbc0a70b601000b4c39b9156a7e9de944f5ea76bac25ca3f06cd45bf29a53234144a0c8f030e9797eb8b9b3983408ff77a0fa7bd6a8fd3135f5d3468c2e632d9574d666173b02d119fa73e1715c3279f66f36e4d46259563422ab82dffe336d11ea59ef8f826217891d7aff3540f4a2e8e30750f62c7c4a6e2a73499fc3a99b873fe06b42ae7910eec7c2f13f9cc63d8afe76bd0822fab10dd07d753c1f0c4c3a6ffd5cbf8f5bcbe3bff1a38dff86c1300dc01632ab49ef11a914ce38044a47dab8780871132d00d782198b8181770b00ebd74c8062405417c18f5c76aebfabed352c6f002d4b9e28c04306c9f21850b480e0f9cd94872a2e12e18f099758718f974906f02b6f280bc498b316d6076e15029545404782df676c97c95a9d408e2fa8bed3872d6e330558a04124e999d677a41c6fc7d23405bd39584dd6a7e25a42d79bf5102423f96407c82ec8655014f7e8b18a4719a94194729030dd60fdade00e1b7cfdb234f1e0647d8dbdb973520871881311926daa6114a26e18b7d2125d37eea0507e7d69a2b09a67cd6c974d708c385be280cb401f3c546af243a66f67bb33c0e54f4d326fc07739ab960508905216061f154ac0c5d2a67b8cc3767c5b502ab75a92cf294e0daf372523ffa648341d2e4f3af0d26b4251ba1b0e00fd6f99fafe925068420db9eaea124fc859d9de13ccff17bf661bed4f2e73a917cb236d54c876b584a288a3772196a5e69fb6e00e52e4ec2da149ddc87d06f3bb067fca2b6c2bd037514d388e790eaa2a27635303fa77001cfa8120013b8cc0b6f88b160277a3f01f8faa63b2285e009b8ba8ec14ad739e569d40eb8f09c2a02df8522bdb4240cee4ed98cc49dc532dcc409e464d840cf97f4ab6a89154c33268e8a36d08daf347b98d9ff114d7501ec23f1c94fe3aee022093d45c5d1e92d183c168c881924f3250e42d50f6fe0a52040a18c9b7db97f2cbc50814495bc476062febb7d40a5005f9f789033fde98fa8850e41feae9e09fe7928fba962486d380aa56eda82f97994785b5c003f4d32a92b5630d3ca043b881cbda84f8c1b7a7bd918ec0b47dae0675d7d03c55f409f52404eca5f59b023b96e87f062557ebbb91a22041f892f352c7c5fb3bd26425e0fb6d7ac16075af92bc24663e74925d9260acfbc6b202bb890e74dbc4f3b2227818c30922ca1f1c4d51c264a55f2e05be353ffe933965579287268fe7cb01cd4a48f792cc2ffea82642d7e8cb381b01e1e1ecb268aaf273ef3a3e27e92105e7a771de7ab3c9411537e9889743111a6a3f1b39a75811c94568e2998e7f9750fbf80a43f62b3e9c0d7a82e24b3938c3f9b39b5a2e88ba36083940a8343e6cbd811410d0455d63024fc51b3e16e014fbfde8355e9808c74f2581f22d9c052f631296334ed98c455d5fa7080235775816cc90ea93d1621c675d11d9a8d847506d5814c547347c54086a70051956c22a68cf0d87d86218e018eca3979b68eb97c794e0d567def8452b1e2f834506353d5bf25421ec445154a472c7a76fc5cd4cb24cd169eab5687ce00d53bea055bbe21c3cf9e354532f83491be8912e1ad0ac9ad80e55952d659d62295bb04234e71c39e4754361fb12b5e17fe599b91281030f562adf1288835cc822dce2d7f61ddf5690c89e694cfcef90816402dfb30167e21f8c1d9088d567bc22ecf1fc2eb3243afbf10aad20116e1cc8c468a5c2b7027597a186bb358dcfa6387ac3f75060db38e76e8cce7e79ad932cffc5a019eecb8b54fad5a82a891bb43c67b5be3af934ccc30bb4be0ee5fcc5751f8dd2c58460320dda434116743b191d5c2a421d72efe38a9021b3674ce47b133b12685ab7a7ee36e584d6bb508137ad4ff6d9dbba82ba8a626ee59ceec9e191e03bfc17890641e03de4562f25a1cced6d924c28784396ca0c3b953399eb03cbea6c21b4284f87b9c24a6d722e4b390282da7ad7c0d8bf7a501e53601fc653fe62b0da2503054bca3c6fd75f9a327f0cac18821c3bbd26a200798598b02e5e31f5051cae73a934eb3cc3737ea3c1fc7e85a61ad1d01fe8ad29f44124ba2495a8e5daa38b244e8d32094f36764b353bc4a736912638030715d98c964b5d325cd55229fb4d771b9a5a023363fccef7eb4723fb17d745568a0fcc9e8b9c3b318a651e2781929f47593d8ad64cdad3491592aa45eb4da42842329169bc73e3fa8f6685ce304d577df84e8564249cdba2ba66cb18c3762983596d471152c34fe065912cc9bba1923edb1dc8c677c9bb8c9d2ab127d04ec380010f28d5bdb6551ba136a4756c96d050055ddf08aad0dec4a65304a433b7c529ed5594f47e5c04716f7d30124a888f847b92180285efc6317a7c862dd87ada8ed82864d76fc2e35e8b43497a0f35c0e4f92a489dbfd4bde888a2bf9db9d79f28c3628d645cef19e007c333b2d9dffb60b7c1e3617f7704a1964630f3f383b9243fb594f844121883fa6a3f163e818605221e020d402a28b6bc8437c9c9ea468940483d032bd4237c547e78032f1a00e818a5d8576bc3125faeed164a2e21efa1f9bade8cfdf69610115e22b3ee66732d1f5965e572b3ba62f6075c050f49b6ae1a31eb55087fc3c61a05d380f31dd5f249668da23543504769c0d5129b2f33e56a3bd8b195c92bfe49dfdcd287a6fef457dcd8376e9db99fd607130f503d466c1c4f6c1f388fe6e637645e7d5014b42671c8a0f2f248b22f9dd606ffd710d9bc50482e54b912f631f97f4b067858169b2023b4c233ddcf6e65c7ad94b10f8ba8ecbd32ed2212f3889a23b332014d9214d450d0d032d209299f4f1c37795f0a7a960307e4df33a65a0b75cd9b3b20191fe08c169b57d073b4a421f2a5f6c4cfe067d131eeef336ac4bef9f33a7eacefd39a5470c0a74fda68c9c5714180a2276980333a1f886b1c8a54858bf1a3a285f9da6e942b5351cf1f11f7ed2322b1fe2751740fc74b744cab83e456cbbe3dfc9e36cc7b4d516e26f995e44a857db274c08bc849f4dae970818fe3df46820775c40ae81a975dd8da2d84dd3febff009a1f34509ca33cc683463eca8d1fbf1bd6dae9b1c40010b01f192f591c2f02292661a259d8a907e999741e28a600e8d31d4c5cd0fce3f3e1a29a43d36d76c104aa7496f6a603606b19103c0e940bdc022939504c1e047a8b7e3b262628f25add2d14e4b0fa56886a2bab61896ed83ad22d2318187a82782b1608762932c74be32568562444654527db8756f112c911a421f797aa85af160ba7d762819f2d16de4ab9ee41d5bfab18eaf48a577a4fafd056c40ebd2cc299213459506d0044ab3961509f809bd52eee2289ab7416cf22ce02fd20c49653e2669069fa098e17d61d33a74df11b881a678d37bbc79f49fb3518829ae43ba7b1bd6cf4278331f70d315c375ba459c1afdf591891dcec6161b1ae8a3f08cf486a8d5b0b49a09cc925908803003ac0f2bd5ee66dcadea745fb1b688912e10c428c1f81fde301b553b454c3c1ce9a156889e920fa76ef295249c9f144053a111b847fc9886d83704539769ff63e3d8002030068c9b0d5a65a90acd44fc799b6b4a31de302a44b9a762b4b5296e11c04f44e07b888c01d8024a222d9bcb7eed193d30128efb37438d7a90a9732ccc590b25406ea57d074bffe1670efbc48c78c38c7b1500a78cd75a5991d5327cd919e7564a5efdad022d9c508f2992cd3953556534d8abffe377565d7f2cd5f503c169dfcac534bed7d8344fc2b2f25295692e7869e03418ca5ff2e46b4771795dc3c1cf36b1aff4a11ef5d2f8d65a099a133abf2601652a6d73fa499c4f824b802c12d8e1159e11f4613d61d430a6d6bac977b9e97b4d3cc3dc75ee79e2313be81602489cdd48ed06aff3eb71e0f5b8096050fad9b0450f6eb60b04c003a3adcd70acc3a5c79e3175037991976155c824942c4a2f493a2a391d77aa34d29c4b7b32de9b0e2328c3373301080a7d0bc90930e0f070479c4b1a017e1ff560cb0420f684ed0947c40ba7391c9a49459bc8bf90f98ce5d8e2dae952139ca66d2c723acaa9b9e2cfa55ad1aaea84313b5ab87798b73faf15ff9fe31d6c4ee95bbebf96144bc4fd7a72697dc4b6812573fe7785e5b12cfd10e8f499477769e52b141a1927114d21694c0f4fa61a9cadbd96c90ab418ae6f453f93536490f26cecffbeda662b4d520bb73457991b80a824aa0501eda72dec8dc1c13cd47dd0fc9450bcdaeecdcfb0a58578e04007e2de8480114b24a5304637c20db7c80afa04844e66c27fb1eb4a848fc181fdad4ae5aa9a33a2fbb4d9f621955d3699345c2830a8f5e514a946fcf2c2ffa7f97c154a2bc80e905e43fe57731378af169c8553c6e952e02e21d23dab29e051a3eb6ffa7d8456a186049e7ce9b9f760a1c0426dcbddd69973d55e900064b83e995ea9114c4feee05f44c812f3391b8f14f05f241a67cd358cfc243adb56d01c3dba7e6584f331129cce22dc2603432be59c9c7c666efa8a9c4dc4c9f1958341b2313f652156f86036c9e4a4160de4ac5114e92acf0fbd91ad0c627e901b638a1ff6dbec3ca05c24c363e658dee4e9b3364f53e49c59f60c15f7adfb5c68890738943204c2ff8c166b14f2a62252bc4310aec07e0429e6231799a017ad793cf6e1e0af1e796adbaa457c10cdfe19d05c03bad6b211a9b9176b72b09cf2cc28bca2b7f28933f5068eb30da1afa49f36c8777498e001340e0848b3002266006d226d355fd11dd9bd8c04b1834ac8abbeabf24b0401de578dafc84166559666443683156835444c32a7b3d75ee4da6177c00f52e81884d5dd1a55464c38b9ac0da46a5a48109b617f65d95c0d0a76c0268e26ff6976768b256a12d2506320e18e222493ba20c4727712aa84fef939e01f4a9a9f80ccf328b007388a1357a3417f68999dbbd7c8924a29fc94d9b0b0ac25c858e88b623e783c2878742718f4dbff296c1fa8ca350b22502a8dad1eed5d1868c0947369fa3a4425cf2d49a28c5676d05ac33fdfb6711aedf57a7d0c5769301d4c87862bf10a3f0eb43fb8da2096eb4020a599e9a8752214b12b7bef52317b6e368da43786b62343fb401f29710c8f8ea3e5cdb3769464d6e4a6c3261e1df2d8c2ac9171fea184340e6652f3f12f654435b52cf98e562760a012b177f539084f9b6cff9e690a0dd31b8b56b83c67175492d2ac9247532c619e8ae9c1063d0c0644d593c3a5cea15f458a1fa5a897c31cb47e5311ff7d15f8cd40472d7f78f1b9baae4cbfcd02e1afc12c83bd665f4ca898584bdc73285aaa2a1aae2a4c7d554157d908bd5ab5ba2271b5c40e3df2548aed39b651dd198735315b0a166d234201bc718ad6748b5d1541b8c61f06ee2fd7df38d65f0e97b32e790b48e9199d59af0cace481d1b7d47136a8d04a1c6758696405b6be2d50d7980f752e91d8cb9a53d4e069369f4d34e9a8ef5c326f483ba5ee4ed41261c8657408b9537b045760ee81aff027c0a845760037e9186b5a047ff92c79042793be1154d877f9a54ec85a78e2165da84bb9959d074773061d2ebd7aa0d58ffaf8208fdd240e2d0487486a59a40add747d697150bbcca41bf12aa6497af52971a8b005da5d60738a9f179670929589733add5684485ea15a34a7fb10f1fbd54a31f699f6ad2a874430d9c1479e4680f28dd383b7a5d97f8a5a39969fc1ebe4af9f9ae4bd489c316cefc8df05ead1bfc43762dbb7af18e04029b00e9e25e442e737623704e6ae31fd4d6bf749c06a99cc87dc8792d221e7cc3b23c4905934945b94e021be63964032d732252582224cb5191ce0e95afc1f633935831424d4a3b742b9e40ee74482fb526ea42c46db5fd47fd45ef37dd77435fb5768c3c6f405ec0f1656cd845e2dd5452ea2e9260b024e8e245ba9f83a351abae2b98ae13d9bc1c3b5e349951dbeebeab85bca77b901854ecd94586307f7580ccebb3851329e9cc097808789bbb491def95eeb33c05da1245f2317e455b51f2eb18fa513c650124738ccb02e81807e861e3a30950413865ff496c45289c5b97be36141bb0330b2e193d55063bd86549fbc796d96f5d7aa21f8f3b8f9d7eb63c9655172d63bf6274ccc7f244ecdb65e7638938656ff2bce007a778c554a00f11013447f00c73c21f3fba4ec714d806c568861d883088ca424273fc27f026a980a80ce61d8cbaca2df5f889de65d345b885543b943187b3e97e6a036bbddeb6864e6c156718ac744d036792265d952d6f18e1ce4c68dca4fad96867401e4e82528ad9a12305ae44a4d4e4d43287448b5679af9b0a98bf8d7698b58e0ea0381662451a64a7d4a3a91359d44cfbf62431ac4d1d5c5220fbe0ed6a9a3cf054a3179f469cecfcf051aa86c0dc6e688612b4146689ac1fc3f0c5b01b94a1327d1c493dd39e7213e5f41e2a7191de878688b16fe1bf8d518d6f7c8a5ed99823417b1a04712e9a7ae8384cd45d278f633c3b2b08cc2248b38d4263734224f157264b393e7fcaba027e1e840d96636bdc2fab2c33190dd14a48540003caf31b7fa3d3b269765ab6be4168c9ca529da6c8aa41a3f8a8645b31e3484c1495313ffa51fc60d18e487fe87737676d6048060d4d24a3b58e64149c24632b0f21b14a4a4125d2f08fe301a090651c974996889c32abeff7017df5dee40b406be55ac73ac942a6330da723223aff72ae96364f1e40bf169bafe50517c536b0b7b3947f0aa1a74ba36c20b1cd44618f455310ce5e461802d1f1d7ba893c2b5b19633cf9466addf3103826e48f11b3583ef10f9a9fbd645b545f1df79e2a694c369eeb907cab8427909e773819b21f118bb2dc78edb9e89aeeed102fb950d6fb2debd880e765c5c7d4b19bc8ccb459a9ab5bfc04aefd7bfdef826f950dd748e99f54588dbab10dd99960fb40a64884cde16560811f045e370a2d7ddb2e41ad35e34822e5caf04b6f2d5e01c887e58c9d32e144d51cbd3cf1d1877e7c3e3b40be8c9ad1ab8a29c1171e29914fc20e425c81e51353ca1e58937829a686df3cc841fe0721ccbee78a3e7a2ca794f959931c56a8a6bcfbb0b035804d7c3555746d9cb4a617e81a98302d211c1ba3f5552bf671605c1a3caade16683fc4a6cf6b50dd94427fb666edf11ae7b04a8c43c67c4a251f506ffcd54d9fefe5f63f5b175009ce0c0856ad39797f9fed8c253b2727dc7723fd84e5cf55bd9744f32dfca776abde03bb0d2fa6db2ddc1e986a3ced7ee792ea8b68e5ed09469f0e1568edbccca6c7358fb450749e38c6f2f0a42581d65a02fda2ed923cbbc94152c5d658018c6ffecbcb92cacb66267da468d2f4e25fc6d3ff4e87d82c6db9be401cccaf22ade27f9fbbe114d8d56675f342222c2d82c57e5d6a8bb9b354cd89ceb409102cac53db3d2e80d74e5260e2352d993caaf78a1606835a0959c6415489cd8dfc4bb2ab29d54fcf0ac1b6596c4c1cd352e647b3fad588a415ec4e6b7c11216e1634e61b29a2e7aad574e68488a0c238a86acfb9d4e3651873ce9f91fed3ed08f5c60846d5875ab0bf98bbf2836f419d299c012def7f2be26721d9522230420927ea6bd7f0b9648e0509cb214bcba4be33cf5b4c29c27cc6631e606f725987e200f9cfda80e570fb61b86a753c6e2bb8ca496c3a71ccf86dd927d57afb30fdd3b260d56c19f92230eae1f3a1437fb9f0fe16975c6bfd94746f7354388d6bc761e7390b194112219821e53caa806c50843c8c35639ddd6c9831fa3f0ea7b00c0a38e870e3e6bd4633b306791897db6b65a0648d77c68ab059d821bf4a77f93f6ceacfba692daa7c5169de9a40f9ed123b253886b177cf4e13b43118cefdfeda99643de0a6166e02d2fe707e1dfaf7ea6fd662a28ce79c58104dc4475f53d11f24ed18a65dab13698422e7f67c5c2f3d40c5f29424c9c782055154484e1f301556c226d1b991ebeb9b46e86e4b63e41589c0cc92b6257a4fe22975273c3f634a31fcadb6f38d123545be82cf756aa8b845f54a64e248e0e5510a5dc3e051f09a6bac04d20ce6f081877a1a00df4b8f516002c0f46bbde37dee338d1523aef9fbbc70c4162db6232a6af6e50d364c61f7d5c4e2fe2b56ed3adb91fe35e704567a2746e6a3e94dcc906ce14c952dd6cf0978081a6c2d2f89e17f4e183242db7131bb6467975dbc255cbfc4a0db5639022ee48339313b9708f89ad2e7bd9d3c2696eac9d4d9f690361e902fcaed9060d85d23be5db2bea937ffa6924b804857c0367ae8634c147b6883cbbbf95aa4f81ca4874bb5df02d8428ce090ec13d30ea5f0a0e687aed2a271034bea2ab622465905cb29a07c5e4c48ba6b27201b25adbeb149548d577c633e7247a3b401a53855cb87b15adc63a89fceb78f544322dbfc9a35da5464cbe838bdd9e3a69c4212282400c252fdd7d1293a9668286c4d9af9672f7b206be6c5046abf2eb6ac8a390991a41eedf4f84ff4d933f68aa40e0654c8cd43520b02f803268742b09876af493508c821b63844144466b4f16ed348feb651bf28afbab0d6b77e1bf8ef7fe0c2a1e92459b1b285c544d1a731b94fbdc0a17777bf20610446ca10d7732deecddc7bd71b4d6ef99e8598dbeab563e9bd1a94c64a576b9016032a1ee4fdbf61ca9652e76acf37cd7db8ecae525af53fb70c74fc692f9d72c4975e2547165e34ddf7caa65e73171c2f4c2d7bd70de576197da2fe41f49a776f2fe37fbd239304acb1c8414df096d047ec407ca6dd325113bbd716b73498f9a80d82e16c97a5d75a2faf52e92521997e4aad5a82352f178cdf456c657d8bf720c128e784e414e8093aba737ab9db9f220fcd70a92324decadd50c7e2cd4ab5850335468af1e3f3c7bd20040ed6d28514fb6f9a5b8c8f70653e36a353dac8426b5ce01a78618dd60bce88fe10492dadcd3100dc0c60a81c7debed7d8f3467783c8bd1facc446ad67c05153010d3a946f23702eb4ed372223f02daf7b8fed6cf60d3eb9aa7f6c00c71c7669692450fc4cfe4896bde89e188e0062e1e2328484deab95906c8c58ebad6c2fc6aacc62f5d4f1f72e7b3598cd2d67670b659de8ddc2bb4b0b8ec8fdb9300b526dc0c81781421d6cb4bc0994d0e0dfbb0bb94b1013e66118a416a403b5e4daedb1032c91f31945b946191f30f164e798ee48c605fd3667e1e471f57ac1e7c0811d9af093497eb55bbbcd9ed599598dea1dbcac5e2e6a0202ebe206572e7949b88b3362ea6c183d10b650891c5bcbb2b16a01bc1e4d32b42282e572c8064140beae57da7c6ea4dab9037e3b13a582f247f6ad54aa7a6e5c399ad9294e01c4c4b432a4a0cd06c66c996567d861656cfd905f1e7e973bad6e401186219b74a36a8e9f2266e6e650e60bb7a3735b316bee51a1386e10f471bd974ab8ee57abf65fe2ca264550a6d731f3874fb2df3204bc9411a18663e725cf6ca14efd7ced544f7c17d95e62dd2839a86ea12d7016cf600641484a5e8a938389e652b2a7c6298cc9b16ac66a5d234e5fb3242edf0b373304ff3ed5ae3e04d22fb09a6f0e2a78a5f16bcc6806f4b538eb9ed07fdb2fcd20769e2e58379ede0f31f5fc27a09ac41f0647f4a5e2b081df350ec53b10756485b9e36d34f7c666c36e834d358ad9444093c41a260b8329b1c1fc3c9135238f7102f303b17302814859c3649ace912c93e0004b8ed4f4777cbcae13f21423fa2c0f27d677305195ca47d26ac4d45ef0f51225ac41e1f7a4bfd59ea6b021c4efaf7fee7b6ec6d2abb71f17e3a5ba3134db237c28b3273658e1de0d193d55af51f94c089cf725c4341bf9f4bb19fe08b10bf2ee90cde3ae55538da262472db607f0782800f28cf4490c9e5b25a78c73b39163aa32eeadf7ab2860c99f0d5831c8240df9c9f318701e6ca3735331b8eb51f4aa206e579a937a356ad79f9d18fb101ac65fcd4026b79115d179447cb22ba265cc2786b8c3c4af347ac7ce639750501093133ec4b074def9d0a06e74686e7ab7967bde6c0867b99da9d04d830ba68457bbc13bd7a71bbb5c86c73a6811b6294a0465bc458032fd2ff12b84a948d507bac86f5f07a9265279def70db86aae515a83e55850a6a93f0d8a0346ddb3557c9787ef804d799010c5b69bd13f6ae9e51f18dc57b73079065e43dbfc279e259da29a3563915125e6e0b0a5d4507fe48cacc32776c194bb5d556b16ef3d13aff925c5cdd8887c3e3946c2e02b292fb71f5fac7722a5dbf6e1ef885701094d61a241d4e47bf368dadcf21af0f900329fb2b78780e84fa14991becf35b24d0c458e5dd3f05717fa27fec95feff3016d5d7fdcd99943a772d6d118dbed6275e2bdd5d26cceda99e3daa450946937d098715b8518e40d90e508995149a755c3914199ebd257f214900d3bf9715e44ade9f07f436b113d14de642fd21f6e3a1fb4921c98ff0c5dee81bafb4bf7fcc84f937c93c51a6017da1fe9050a0acdb10e9b2be39bf1b14ad4b83ccb780dbbecf583114387d6ae5fbb1017deb849e85fa40e6c73371993fe18bd511b70169f9b9a355ccbdd8df0ee8db27f426d40fd23f9289cafc085fac47dc08488be72663c5691896cad826c1833d7210bcec649a268bdbbea04c0f004aeb04cd292270b2c043077607f6cda8a1b39c80997b5e07ababa65dbde77f3ebf841fb11ad9831bf52656a5e469d44c71e663d4d0a14f9983566672e01a346dd2f16e51ad7e8a1abfaad66c9a99512031a3834e3ca7a195f2133d11182d191d7470231df428fcc193f0a4dd74d0fedea2f6c534d3e7d1bed2e786db0876d0163d4ddae359ef17bf4feea06d4507dd414f7a0d8007bef00ed4f9de7b57e9516088703031de06972fe5f2ebe2c60f83fbab6c2a7a1539598e41b84aa5abf0949211e8217e80a43f0828f2719371550e0be26c621140b7d5fcfb5f047c8de3933d007a208e2a064b83cad7e900f65493a47641e64f51c30b4599f3b8027d40e8b55d45b791b6de977cb471749fc2a6772b3ad57a433d61c5557fd424d456a20f043a742c154e03300590c3469fb9dd674dda82c6f3aaeb97be369c794d2c640cea95e2dee7f0dd265cb341bd2bd8808a309ea0d5e8849dcc2f4132dc78f45e818f00816c632564f5a7591b9b3807945ddb980c3348743927cb182388100ae4fc02d3cde4884cc582209a68308c45723e29b8b1b6ac505f12ffd65863d34a5e4c371ec141006c8854a1c6adb13bbc50f3378ca368148ddf612443afd0f4c6ab1c3a4aaee30b959d557ce3ea65fcb92718743159ddb79858b436b795051609b01fddf3994edf906f3014f3052fc69459bd58cef09da5c404f9556cec0cbde0728595ecd79a16d4b7793971acf473bfb1aea8c87dec1c841112000c7a6706dbf1f439d1465dbe5d45c4c279a8e0d222f9300b8f05e73a106937d4d5eb5bd93c2c38272a3497cfe03f0fc8e25bc8610450df3ad785dc438d7516340967eaf3360e7147547c94dfdbb6f7c8fff1e0313361570c48d72ae087139708c237efae4c5274d5145a353c68ec75f0bbaa4df9b4d0a444408053a7fd051e09fd3810d36cb7253f75866b84d1d4f890ebe58830c4d31454653f9e19c1fa8c8486a8a397991160112feafc598189691759f4eafa2ec9b517ab13568fe61ab77870b6a28fd5606391daf45841cf5eea6107d6d8d7602a44de2c4280b0294c1c5032cc306d0e95cdb58fb71e4d82dd9fb42d3a102b309cac960564e217e86f4bc3bd7161d4aa60ce18d4b9e7a85c3dca3249c455816a6e6004f14d0f5513d324cb16c2ccff513ee96d730c9952a24e80fc0f8f673262acd6aac7e2050c4cc005d14eb7ace9f8526b995eaaa8b2a8255f4adcc3e5cfecc25ca221fab6f6c12b2445a6796a1af5aa6fb400902fde3b109d798509a10db794d628c216542f570b4b03395518bfe19c0546c777d85565d1ef5ddd7d1ab6c1ec1a09072ed38aa5e9a250863ae3b0f772faef2f75f3c9b85ca3116a168e99072576d8d4e3f7af13ca1c67e7e5b2d192976e25914e6a3f2575da5cb516b6deee59b84e0d424e32bbd7f11cccde616be12e184de75524e210bdfc1c13b14354b9a40fa7debf0efd0159814ba50cf1c98cfb1073404bec43c999fe2021ef15b7a91fe71bd127567b4053e0b26265d7742608349a6ed7cce47eeceb7a66f661a6db3c73722ed538b66e23949c89106d0b6167ddb661cf448bbc7569566b0c035ba9df555a81cbceae8e2459fab52604cdadcf4d2ea9de95fedcb3d5c6e4cdaacd5f2d55a53189d8c00eb6ad6aed24d1f99b42a6929378f3bc8a68893e522fa37b42fe36563b472d38c6c36d019d96a19cd69d3f6fbbc945cf1d6b6d581e87c7243bccafe462863ad7adc974334e1bf9fa7434a216d9a5f7de3ec69de9e69a6f34c7a4a996e10522d78988eac4dedc9a87e865794c12746414dc6585569d04a8d700793866e9f8e87c6b1622dbb97fefcebef72cf7bcf6177fd379295e779237d517be353b96999e1f0dd006e0d6e5e84a169e8b5b0a4e5fbcdb9709d8d2ba3ecb256848adf79f0f1a83b3f652d18d52a22ce7418cf3a925a5eda3e7729ba815cd9cad3d1ae24d60e91eff38891208e181b877e2951c815d3997d02f37a6adbe36364357c71d433ae4ca42bdc87b91b60bdefaa11f470a77af35d42ae2000952d2262633452aca5b727f55eeada6d5f34afafc35ae5c298e8bd4f29b92fd7bff39f368e3ca1227f944afe1aa8005c62c2f149116eb28b58ba7eb4fcbaec6376619bca3d7604dcc2088e257e1cbe55dd54640403cc3963fcf7a4f1d408ff1702262a82a94c8d258e40903ef1328b182faa11badca20e70250e49d7107b92d58c994ea6b8bcf0b0e7a1f8ab65c242acec4b1d25c92f7348c2f3be680a4233802c0f1127cfd469902d0a23faf7c6ea1bcc145c273018704269957bfd5ec6db0f2669edab7bbd9aec174efcf423c6db2811289a8f994d6a823e0bfa70710ea01d5ef65f012a6a28ab3b4cf1c27e95a5d2d7082535eaf0e36e3ba155e7a556b4692279ec0f15608dcd017c1d2ad5ab23359e3dfdbd68f3aef3adb0449d29b63f84dcc09015950bd56312d8ec772e1ed2109ecf443abf95bab7755e0c644174c90d6db240691cc3a1797256e5b4c5c986c51a7d543ad67cb7b7cc68c7a63f362e2729bfacf7347144efec4a09ba89f6330ab270aa78bce1b8a4ba29f914610e27f1ef0477345dac12e5ac84b0701a4ce221824fc42b72bf79c3d23352dca429e09e447e68ee96e32cf912c937369aa4f06eb4d83bf88b6146e5c81e6df3a12758b546029d41a903289eb2b8f575f75da9106256e95725643ce183d5a43cb67b935a6d5c4edaeb3f9fbf041549d2cc82aea1d9e68d661da0add7cbd450857a56263452601f5c43fb7b30f2f6fdba7dedb96934f433a7f09d7eb862697fd66bfa239af5871cf9fdf0a6036914a88dd10d327f8e9c91ee54b1f6817eb68a451085c34ac0d6a0753a45e66c20014740a60a4d2a11c3a67ace67f92333991ea2dea5ab2dd07d777a70c588d8efc0e8b037c5ddc6b43b85c04acf254f092bcbcce41f8e4f19f8d1234370432bb4c1b7b0e73e090093923e09710df084a980eecf6dcad24b64d0dab675f4b97203ed601a51a9a781e3239f209fb8bf3e2a8783a964bd4205bfadc2e061806380f03434bd0ef22ab5ae71c7054588fff6206c27d5e3bd9229571bda0d324c3e20f24a4bb4e2a8b1a92c17772597e2065ab7329f864a26a07db71c436e912cee02ac9edcab7237e0494013533a1f9b23bcbbd999e8abc7dc7e0fc3c3f3daa2f4aca423e9eca38ad1644273fd6e2f6ceeeeb53c41d9611d9da7fce35816611cbd3088d0e854db8befbd8509db69532947da1276c69930f041a2c46ac673d1a047e6db11e52f42738593cca1a716f3c8c8bd8609313308c78919e52c08e6a5d8b887d80e366f2e00cee99e81fc0ef4c2852562a5b9a576252670d6f1908702d98f00153d17daf4ecce1641692561d52bc64236f21f51ff1d223250a39322411a687decd1736afb9be8c152e4e3396db5695c6e924c758f0299f0d7b2b52c90796a4b14d69d0b786a45a2a3d2c0347d93c62f34820c97b1e065ec0c2c9d1f52bb511387e9742d673cecb03e0882fce73104e6325febcb4d49b0c9cc959793c7c3e3202c82318bd6edd657e18f88d4421b7f673b20b62ad031ed17c43a80b6b1d5d3035bcb1e97079250730e6bc2e37017f86e5ec4fcda6548f574a029ed67094d412771a24b225281e828dc0628d90b932d35d4893c957b8cf06431aa5b9ded2908e18cb7f0d2bf61d8c521d1bbac1a5aa172de8c77ed5ab3058b7c0cb8773fceddb5baa9f3a6c937c9f6d3f910e46f6f54418d6ff57f782f912c09e70d9cc58c0cacfd763e50806f5570b129cedf4106c6c2cf43bfe485ce3c22cf642e8b80835c429a7347aee71efa9caf548db7303e065894dd10dcfb88f5471cd6008aed0a20f18c88a23d67ab0e610d404aa5efaa63d5454b08ff9f67f568043167b933a3fbde974e5ff1e0fca806b3a1d227b3b81fdef5dfca26a49b7138fbe116d3a02c1f0d849e04a71a3df7db10c00dabee72e65f2516770fbb2f8d39e8280becea6b18f379e92721c710087947361a0d504619245e21d5a846eae856123b9afad4fba372991737ef04a65c590207eb6fa981e97ee222d4d4e25c2810779f800f862b1bbcc85dc4d746c6c1aece6c45c47dabfbe11d4d8fdfe3a65bea2fbf91b88e2f4e8d154cbf08983c6d511cb18051be67143270a8e540a89c94e56cb107d0a436a840298fef40166943314827c6ce0f0ed531e897f116ae7221505c6446e75d66827c3330297c7b5e1068ffe299d06b5868b4bf56102d62e87142a9f7dd21d6650fbbc563f0894fa6997d0f9778a6285f601bd71d61a708ae6e1cfd9affee83a426779b89b909c8f9227d256d3c22a4824f1dae50d7163bece5e37ed323f0faf91e2af694ec6b2d81d7f8b872cb5f7ff73515ae88283ea8bb451bbd7685417a7a0ff19856a1fcb4d36231ea2403064c0e756d3915d1d9a2012b8cb8b66096d7566643768f949823a1d5306ead83bfab27baa73b4336ef22818c190b85af2cc9d663e743438862c0427309c79bb5a696404929d7f385833b4788708b6476a6ca0710405cdcee9d6cf56e723150da8304c6adf030482f42b21591a7389419d7f8dbf3db85567f61f221aa9b2250f6219f892104dc549d8beafd5d9e5b5d5b1973d6b377a23d45e650b5cc22d59ae0a1a328893df3b92d0928510a42cacd924075dbc4552d0f3f19e5e5bae97beb757a45d09e88f951981fc8bd7ebe1da96ee18c01892137132e75bbd83d8e03db828dc2522c53b632304ecd68a3851364dbe011b05fa836b17a7891db89b9854936c246b15ac23eee028e04af203c2b07751936f1bd104e6bb56596cd1475d925878cf64c1208055a3ac82a27ad54409b2cfab04fb7f1324f57e4f3eb44c2c6b097a0b7cd9596a9cd1785a04a98e3397a627eb4fb613cd61f53b2d57a34c87af70135d4b28c6141f5259af12e72679a60a7ed2c7ae75cafe958a4cbe4b388cfaaefab8bdc7d1a812f1ac11a0ec77f62635094dc29161456d7285cb4685e39c11eeaa113a73551bfd0a0d591256ed0ac74d77ca8d2f75064f4056c78acca6275e234ad83918693d7822cd9296a7622b2c05d1376555ec2b2ea685e5c4a548007a6efb0a233b5b475fa6b045165ee3ae6ef4fa77b79ad465d6229e9e532c4b2f8a182a4e47965583e45a81994cff154cb5d2ed883b94f251fca1f5c369576d50ebabfce6813480af9d298249124310a2533864e219ec121fa5d729dd94693773255c0c9dfdcb5b6d6ed504844e7e9e082d57ae2cbdf5c4cfeacd07d15bcca153d27b5d2197b9ba4f5c0f865219eacc24812e32e4e6f9cb1c281673407c2dfc5d63da29ab66df81fa4adb6fe8c25e3eb8a6629625268f2cb98ff4f2cb3481f421efc86f9fd86234597c1832fb8a2199b329a50a0a088d4afcf27154e43947165cca8d4ac041e993a5658b2db11be8709cae3da39afcffb7a486b9aa7795de2bb756f7acaade935b574f57f6aed463e566757a9ebc0cb9c66286c655dae830a03cf01b9080cf06d1063de0db0b783905f3ba939c86c2b15471c0d360df0d42467878f1a035965dff3d29af1d4ec15277c582a6a7c16ee20e0c6206648ee1f78603973f8f6dbd1c474b88b9bc0908cbd86d4310ef5ad8df775be13fb7c5afc1187ab6b267a5de2bb7abd3eb244b0fd54e52f2fd6b358173feab53feff07f1e712898eca80ec8a7d004ad38e200c9a73d939a96d943ca2d0b71587a8e66eadcfdaafddd620a6ff16d96b783e582cadada7977ddaca091de85b00d5f3ac4e0e5df89c9ad34891ae1b5229e9f5bb9a83bf643ae07945f59ccae6b7bf94a40ac129be2062a0cd7812bbd7f19184a673ebeaed95bd2bb4e591700484b9033a34dba257205e554d07a9de84bde500e1b5cf69f6f36bc3d2bb0dda4b59ba8f6bf2be6222ae19e9b19fef323818187effb0010f580ce2fe47595234d501d25276537f70abf41ddc5fe5227e76428f69a3c96e7befbda5dc52ca24655e0ad109930a27ef9ff2a6b0888b37428719d79ee303a85cc87acb27c6d06477d3b3a1bc81644d986cc2ae3f952059b3c655b5068a5dff4616f2e83aac227c56ed7f112ed696af468b7202fc455cdcc2bab51e5606fbe7d78395c146f1b00fea12fe6dd370386b5cacda3c42069dd5964f14156d27fdc5182b291ac3925a71cdb3cc86deadb5b6c8575722615fed3b241c55e471ea4c0fc98eafb8af454ededf14ba76c2fb2474d7ef5a74328cb2ebc818a90410f49afa25504a16f85216e55ce4aafa79fb48ef42dbf76d4ce049f282fd54942557c882621f69abf1d5e83947c659b43d77d533ac6a1618d583eeed75d0bd7121c7d8f2892b926cf9f9a851d525647fd38f13d6a284a25da78ee9b1a6c77cf5789aaef35445a70ead785bacc77cda96fb1c8e748f5e73835dbf148efec4aedfc27b6ee6c8c0c8d0c493f8d44155b7f62494618514b09927aec8d9f20932d86c185b3e418623ae933f4431ffa154a766d7aff3888b559ced710a8956d3e6115f594dc47790d2acf155e9eb4f97aff2d7ef36d2931ebf168e559bb408196e6f5b2ed6d26f61e9c1d2cb9d212ed692769d1c3a9227e471dae868abefebcf6ac4be75f72069d257a40f32649c3d90b4bc61109bc376180c82df3ee9e5d783f45a10fb5b11da6bdbdff0b9e5d6e3b4e158a58b362c02d5e3eb00d1fe5eee1bead9c2281717ebd71a56c8aee3ac1d8a5aadd6113dbe92b02535d55fbb1625d93a0eb4470f62d9fa57b3305f8d5ea3238de48c68fef8aa76010563c3c5fade1432c31ee75019f6c8b261eceba8db1651c4bedc759f8446c838a107b019273c39e3dd5a3b8c3f1cddcfcf7bfaf590b0ede9093461618e587624bed25e739dd17b76c5628feeb3abc36416628041098c80e0e33ac38c5502abc2114ac0c1194480c58c7d29ed6369df7e382ce79f0edf434c34ec1bb246fd93b0450a4968d56812430579749d1ffc8ba0ec9fa03c7d145d64968027c80433467815a830ebc1ccc9535dc4086d892bc2e0737100051682668a1881f2464c255dd0c9994179f9fd401ff5c3e953feb4628499934fd1455ce82230509831425a61c50c8a76427b23749839d14e5c3c8196a076a078c0f484592000443161b5861579749d1353286786f8ca6a14105b02ce53df5ff55da7beefd407f2295fb0c2ea804e43367190e7cf3d452759baee9b38bc97beca726aff92a501112f10ca9a4452551fa5626db7a462043d9b6e998423c6b0c7d9c4c7f8ed1f13a5be74d2e2353d8a5bfb5458c4091ca9f7b0c89cf1ef6a6de2e6edcf1f1fe9a51495d3fb0d504a985d44a9e81cbe555252885aadd6114d6c30675ee3f2958bd9aeef368ee32c3a535fe594328178826c62be1aa7cf5c527f0ad59f43beaa55ec9a929292e2b3eb4fa24a65362aa7d34485934938653398e4711201edfa7389afee5759002464f9f21b624e22674d1ecaf2c72a7ac4f9a4c79ca24320b2467d18a1cfac6eb25314d3af84e1cbef4708239c335d178692aabae71e462867ba2660fc0d0fc395efa617862b2f3f207c06c6039131d6c58f315052ae84d1de85f628daa7dca0375c0b4bef221c63a0c0e02d435338d693b096b43c51d6b442aaea77e1c7b0b3d8f54797779944bf8550960674d003263e60c2092220c10c0f5194018a190bb0701161a63e90fa41d4ff304638657416b9581f0ca7d19cb9589f14ce2317ebc3a8bf124aaafabc1be922e739bb7e0240908bf83b61dfff3fe081d4233167521a3593e79e45b3fa93a86a0ea46ea86d237216a8336546be6af991a33a829a3d7acdaeeedab53aceaebf5d0da6be0d5f55a35d1f480682788c89be9b44f54ea2fb44f709b043747f0bed6b21d6d610812692dc2d3fabb1f39c1c650a093ba1b03c0961049dbb3dfaa4906b54384ca342892b0cdb1f9f6ca9c44505245838c1a20a7c63070fa73f795b2a7145b1c753d0b5c2fdce5601561005212871c4073f2b8040139858c30c9a18418934f07c4558a957845b2a71e960735b2a7121215121b7d852091250c049b2b7a512249ef08094202184ee95495b2a412207dd0d9420a18331ce39ab60ec6513ce4e38e2828ad74908372851c452d690c404a6298a5cac4106253881020e8a1a5a481164a2020d4aad13294890a398b5f83101282b61971bc0808433f6b250c66a3041ce2785175561172f7838632f935c701368d0b9c0b8bcc07cd8a5090e67ec654feb88c2cb73c1694842677381717981e9b40e219bee680d2e1c84c31d5d71e442613bca828d1614c32ef88917581718971798285c51d85cecc2838a33f6b2968f5c8043a748e22a39450fce4749280105181ad24002a1181ac06023850d55c9cf1ec69bb33c01d6a00ce00872aa0aa39cb77c024809290654844d0cb9dbf209a01e2400099c185b3ea164083f1cdef524e6afeef92b90f1b43950827ae4be7b9a83fbcf7b4e88d3f63a8e9b61e5a8873710aa9a6f61604491659fb2ee6c51d6b6851387407c08a1aa29f3297fb60d1b2f2f26534a3e0d67d1f082a01a104550167e1c1611024155f3b57047105435bffa848111294b44808bd3dfc31d54350940001d7450a942a99a5233027b378585c15c70a021d3582c280808e874ba9acb180c8c28fa9837a8cbcc5435352b65cc748a5dbc57208285082dc4c9355b596c9986ddd1d92a028b2db3d8e1a2dc5074724b3d0691c2449e4f85384920d4256f5929a58e5d14320322f311a3e105b1aa4f8120da11546bad152360627c3a7d8c9425f234a9604ea7d56a176f5ce77d2430975a9c98505ca478dcfbd536cc692128a62c672927cf815095ff88da9ef18d8cf3090865097195ffd4395060d24e5a944e2a3e8008913f36a429355bceca3424eb867743a96690f4799dca0e2082905f048c8825976947b78cf588f17d49b53f1120eb0053f9561a3fdce1425cac5bc80bb15508cde15b484e165224a4a8a80825a468daa8fca0e32197b0a51ee2db83a837432224d11e2bee6c14aa7c97da75d461d5e79c1f546fb8c0504a5fac5567507311cbf329a594661f749df49544c2a6528f791cb5701c626938527983cad02b8ac7d4b6dd74d3afbaf329b68cc21e51d24589852db7b0bb8a51d245cd1ac1adb576eb3eb0721e296770dace729b66adb5d4c5923e3bbdce4a95d556d36abdf62fa5bace3944915d6be54c9f0beb75d52ec15501a6d8ca6d5e37e97c205e77af94dcc5f4b78a3f1c76895c5d74593ab9f0bccd8587f2d1e4ade96ae485d76115cfc599a21f8e1419641cb4624d7bcac34acddafbe1a83db08b73beb0565f7fc105f7dc8d8c75d4d6a3d5da7008ba6d37b56a37dc7d1ed802c56b91624b19f4c0539db67317ff8b847d8fb0618c613736bdef85dbffbe1be542100b217d3cf2a6ba9ebe0f4735c02cd7ef932e7ae7422516748306f190448dbfee2379dce98527a50fa93dabf4b2ea944217a9aa9f432931d6e30d307c92e8e2e30bb377fa7a5f56fbd3725f0a0d32d76df785a769f24ba141a63f7150ec52b4af75007f3cb44dbfdbe474d2d5d31ab1298e8a92d3057b4a12b7ab532627415190efdbf0facadfd62b52969458c67cfbfe29cb180c733fac3d9d13a57da81ff6b7f72153d545e1e748bffd0fdf73fa03dc7fbf691fdba37e784ea3f0772f673eac513fb8f7fe876d7b4f7fc0091fbadffe03de732f67482f67a8cbc58f1472a19cd930555d7ac4c5fbf8be1cc9f4475a339fda683fe8244b2f21df9f0b8b71700fc6c1381807f76cfb14a57a3c5c78377dddd86cb1fff2763c249ecbabf16094e51d89e504793740b78a6dbf44833ce2199ee12367e1f03a9038ebc6a8cafe8c1f6b121b7eac3d37fc587d36e9ab8eafc4277d5d42ca5c23961f2b139bf43547c6c878d2d796b3ee4e75d9ec1cf9eab390321708080d3319a3879c755d2e264d8c62be0aa120652e122452109231315eced26432980c4816d4e3ab140fa4ccada9f1018f8c81f1a4a737ced28080680e1012a0249bb4f2a4a72690321a132614059bf4f4888c4115394bdb99b59af8ead40529a3fdfc7c4126635e2c7196e6121a22a92c41ca684890781336e9fd47c6a43ce97dc7595626731e99bf48a627bdcb40ca68354e834d7ad791312e9ef45ee32c0b04e44780fc06286793509ef4330d52c632992d769c4732e6e449766747b653446a310529637f7ea8109331251f6759d7cf12d24fd2cf1f48198b64b6582441d8a49f3d32263fe9278eb3aa4c47b643e254b0493f5320656ccd10675520aab28f8f6af6112662d8a4d78094a94ca68d8c019ff4427c359ff442c8182acb44a4f7e1acba435596f43ca44cfd992df6e58f8df165939e86b3aa8bf43b640c7ed28bbeba4f1a6fd8a497359bf45f48f70c295391b0c898faa4c7cea232aab24f22fd9432b566b6d8273de9533e1c24d8beb16b74838ed9a06f6c86be31166db4edcb289521837f7780eecedf9dbb73a249e1755d24d7f5d7755d17c9b6df22c69792dd1a594a26bb35db7e0986b702c4042805049451dd49dbf9d1764eda8eb6a3fd6cfbe00b4e25f46a34249aeba4b934978664db27a56c2699562333c93e9956b3ed7f2e300a101312900908c83bb92d767e487af474b6ddd9d9f9d9f6bb92e6591792d3a7ad8ba4ad0bc9b6cf65cb5599ada9b22aab325b433758865cf778975420264040404cb6fd8e86f4e746297dd9f9d9d9d9f9f1ef30a5d485a4baaaabba906cfb38ac7fb7d6b57a4ce1f0f150edeeb950db1e9e4c4db87e46f51487b23c187d51564a68ca944e9446b62fb4ed4b9d4b58648f0e6dfbad56ab0b61b20946590ea31a4687281165e23b35c33777766777866f54eef62c1c52db3e8d703271957f3a64948567b4d64c99ee689e72ee8eecd7945733a32ccfe5aaa329e31da1733a651b824e0ddb3ee7b5640dfb252c727d0f86b1941e0ffe2576df201a16a9dedaff2f9cdb0ba914b5f7f04ab1f360daca89d57ef43d7ab06d7ff3bc2d8dcf9b353c6f729e43f8e22a9b5d651fffc8c96313aac78f616af8a4b28625d1c7219c3157591a2617edabc293abecdff0adcbf46c5a9465fa53aab52da5ef1e118b0f11834e6ec9c2324539658db9a76f10c703aa70d1eb7449834e2e57cbd5aa71495fcd9d9db9e3e27c931872d5518df82402062ef7711f1f82bfdce543701ff7e9e9248b17992dfa56f31d4ae9634b1fb6a4f6a8ce9aa22ceb6428ab6c5212431e65d1c7d2ca734b2c7162434b825e60441aee5fc8546aaac779b35d2410494401773924290004c8145d37e7d42530e431b5a5961928812177394090e7cfda244b3ce99c4fe87cbba7e99cf4b9f0c58504790477f000529f176fd408f5b5d00671a1be7699b4fe304e90c7bbdd1fc6c6bddc5f6d765dd77597c3f76fd06b75752a589b4ddfc34ebe9059ab513a7e849e3dfa92d06198208f7e04ec653f02c6369489255f70ed70cb255e6022e917ce99bc49b823a2382e564dd6a0463e248523de14c6913cde8d9f878b7ddaf75e877d4f4b178d6c0fc7ba7df4770fe5e6c221beb7fa37d474b57246b250ce690e5e687afc00d01eb5b73f7db2bf5e34792143bd60cacc955abbda7df572f7f6efbdd5f3bcd7e1efbd91ad85a3bfb6e66dcf19d99abff6a6512f982d2f9a5c948e86d2b195dac065f7debc12e4eeef033b76ecf7fdba4bc975a72ee47c0b2edbd8b9779a3befb84b6baddbb66ddbcf37b2311ef153fb1a36b235df42a5326dcacc6d1f4f99196321f1334ed87f4dd3a81ef7b9d7719fd39c73781b3237d6da6ca1f3ffb7e96ab89a66a5d66d6f434c59dd5b3d02d99d908db56df3ed3365d9dfe4cca6ab8bf757a890effd4d9a8ef1731c0782e0ebf007ebefadf3be6d88dd1efe0eff0dcacd0f67ba54266eb8e7bedbde76dfe9ec62cddb07ad5ded6a57b9af9c1e5f76ad737e1b6903b7ed41d2b76d1b17b2d4aab37cf9be565225751f676f344df33ccff3ba700b39eebd70ecde729d91bd854eb4f1b57f836ad6da25bafa92656efb32005366da1525eeeeb34e8f86f4354ddb368dea317f7b1df3372d5d34b26b38d6b13ebd8fff861bd97588efab03305be8dfa0dacbae7b7ef62574713050d0fbbed07776d1fe8a1479cc3ea8fdec673ffb373c3dbe6cfb9fc7ca9ef7a5f003c38fc9f6de3d6f6e0ff6b1380b943a4bd50b4cfe91c6b6ba033d1289f43ae426e9f1033b9bf4fe46f6178ebf3f4c0ac7efbfcfc8ee382d36b4b5bf41af55027d519f49611436ba6cbba5f7defb46b6a6ddf00155e4ea6f7d0bb3c5f5dc4167bfb394ce70ac45b6bc37d4a81240aa11bafa5d0de5768cf1eb90371c1fc85837be2f3ff9d7c896e110bbada64a8475be5ef2caabbd2c10aced01c2eb059d94524a3987508bd37563b787501e5d27a52a0b65a12c9485b2902c62ccd5059d7459710de7b4b6565baba65dedc89c2f3f6d563be72c62ceb7a1e3e8ba39379085a6d3e93478a83615ed745295210b8b369d343f07ddf35fb6ac9584e23116d9535751aa01cb986b276715b27c2209459bfe6f980bb6252c09182c899bb9e7c78470b68c09b9760e5bc6a818da75d76fbe376db7e9df35ac610d58ec90f2ab5e846e4e774affb6b6e36caa4405355b26614b254ac076579a419e321d58458a8c639beab1d6a927131777f0c995c96d0da1f3e494f24b8091aaa7087e346d87b9c10310be9abb7e066834d9b50eed2abb9aa5e182e744d9e7dec80c0e51f6b73732a3d93811e103a6aafa582f40ce64aa7a39b343dff001d49733302e56ebe2627da1e1e2cb4f1669ecea7509efa7f7d3fbd9a295e54fedf338fbd2c5aba1483f7f7b1449f710f77c7ffcddffa73da7c7d3ecf0f6f5b567d1e6bb46f9ab7a98efb9a3ba779fef6954d77de7de8544e6ee340d175d73e1e69afeb8c99245d341240cd6c959c54fcfee9e7ecc094876f75d8b569e2fbdd2962a5bfe4841d67e7e490d797cfaf8519fee216eea9e1e31eef498455c4ab988c7bfff2ca28ce9c2b9a58c1962166d4ea37a88fbbefd7aa0dfa138917e278a9b233237a769f8903f6eb2f60f5b422a2141cd962f4f3ac9327e449a941287b424a32a7f4e8f63102124d16ef11ba07b3ef723dec0e611ed925e6922d33d72ef72a1392d84a2606cd2aefcb9b6bf8d2cf2f8056dfffc5f4cc674efff0d7d419f90f7ee7de75f0ed96de167e9c7715c083e87834c8de2c1fd7ceea72662f7f7a4c721e9b7f0e3f2b783ed0f92f4a76b0a87d79379324fb6dd23da727f4425b765888213302924f102ca7a1976b9ca5ae33a098b0452490a6a36fddbc45773d36bb4e9d35dbffa3f98c8636d92010c5ce05a8005480528104e404b200210f807c800c2013fac3400860f0c5840ea470c1f340a50e9e1050f3d1270e281daa123070a0e170838c08c69a7dcd8c100a502b4b0211393097002c35a7d030880005e742079a04b0b006ae090038d8dc32af1061b667462063070010b00a900052620810840e0014038e08706f8c08005fcf041a3801e78e891001e3b74e4c0818003ccec1b3b18a0003664620800c35a0de0450001d0c1a505003568e480834abcc186192cf7de7beff59bc347c372ef8c67f9192c7a9cfb6a79ef129670eebb24e80919510c8a1933807010d1bdf7e2f0d15cfdf7f5ddd94952831f9f9e26ee45a243df2caafbe1df9a1ad7113a38362108c396484499d02ad0236a449bd02bf89671838f0f4c08b1202022acacbc6cc0c1c959414f12242d48a56e5e84be630cc160b0a1194646b331d8b85a57a8a814f9e8e8e8f8b004050939c19b38131f8ac2374a4692243c370082bd728082b2a35dae23224092739384c954d322f49d320483c18642264c6456b46645592895887c7474747c1e06fb29c21c125a7204df27317272745cf0e2d981c1f7e1c098cde4111637476acce079465ce81b5c11128a49512423a262db82521f0dc62e9acb4b8d253f365a68c81a1efd2a12c982c1c08f35c9057eac3d16f0f0dd0720ae250b880afc585d14f8b1da4cc07d8804dc9f0e49561111f8913281c08fb4c9037ce57dde00e1305e9235711cf02385fdf023056a80fbecf1c1256bbe18f023cd59c08f14c90f57799f423efc459164cd18cd8f3e53c08fb4d583fb34e2c19748d69cf5f8d18512f0a30ff1709477bfd9f1a337e147c6b8d8912cc7d1f1a3f3e4f8d15f38dcf4ee3d08707faf912c7f1de0473f32f3a3df6c2fbdbbd08d1fe71a5a104996c776f871ca0cf0e32c2a80e77737b2e13e92e533991fe74fcc8f730901fce78bdecc160ae33f7b640c49b2280eebc7a9b3fa71ee0cc0bd7f71da3344b2a80e3fcaa30008c0e5472906192ae45ccb8f5206801f25518df7215934465594863f0f29438d660b7dd58ff207871f6de44043b2e88c871d32a6137fbce186bcddffe2b0c818ed5d466bce6ca1eff7fd4f1f0ea718d017b080f661ca5c2640f4e81b088a2ba0474c013de609e82153e61249408fbe8ba0ac0b8b801e3104346cd37f809cdd4c993b04841e9dea3800e7079c06e0f44c99ebe343cfa6b7c580d7025e3f5e4253e6e6f8108a51964644135340ac073d8da68c76c4831e5d83f598b304cc198f39bb9932dad08e9b4d351d1d38397070e0f44c19cd07013d2fcad25a0778cdbcf64b68ca683937f4e8f43d46599688aa7688192056003d9eb6d194b136b4d1a696de4c196b69cf94b1323e8bf119017c0673c3d22b3d00fdd2b3a96dd99cd912a3ac4a448da64c3d9a2df405a0c753005e3abc5c748b1e4f19007acc356234f48cb22a0c67cad4a1d922a3acaa933365aacf6ca19f039de1a0672a3d13f5e837e8f1946dd06396b1e89c20265386ce828282e88c4918866118861ea23e1a1d862caf9f4587e1876118a4c3b9c320213a734213264351d033b0b0e8798930c64432feffff3f0cc30fc37ff1d184ff323e7c19e1ffff7f1219e1dc9f84e70640b0570ec250cb087deb7befbd17c6cacacacacacacaffffff8aca47f32b2be1ff87bfb2f22b2b2b30c2b957aaab1ea922d8f391d49c7a5393f8d757e7fa5c9dab7375ae4f8c542a954aa5522b2b2bbfb2923a7d342ba9d4ffcaff4a2af5a9548a498c70ee14654265d48ada9a15d12cacac50a218a16f18a1efeeb66ece6dddd66ddd9c172a2a2a2a2a2a2aa954ea532995948f26a5a2b2f2a95f49a9a8bc8a8a0a6c6e15fa438b3024b4841e2195a23e444744444447a8d3e9743a9d4e2a2a2aafa27272f1d1a89c4ea957f9948a1ee73e9d4ea7b94f3487ea5017d017e5a13b14062a2a140715fa7e01d386349806d360da900b14141414141494d3e9f4a7130aca4773424151f9d3ab9c50501e0505653637caec088b1b7a84d698e174d2467beaf8e8e8e8f8a4984c2693c96442414179141493e9a34131994e8ff227143dce6dd2269349686e930b79cca5f022973991538182e24129a16f17a1ef4e6b69395a4b6b692d2da745a9542a954a2593c9f42653e9e4a331954a263dce5dd2a5528967ee52e83deec412ff711fdf81c9e449888e8888888e4e72ce39e75c2a95be54ca2d3e9a52cea62fbda9a4c7b9b3ce79673fe2363e821dd7711c2f41a9a44f42df2d604330186c88f47ddff77d5fcef973fe4a1f4dfebed2e72fe5effbeffb64737fb2263547465cc8595b1d1f1d1d1d1fd0f33ccff3bceffbfefbbc97349fe7e5ff3e7f7a9cdbd39ee7fd80e1dcdefc994013099368c66690123e30f44db22d9b6373b86ddbb66ddb3ccff3b69734deb67deffde7e96d9b7b433297d8f37d66cf4c3299f0bc99437444444474d4618c31c678dbb6df364cfa68368cbddfdedbf43837d6181fcd8d8f662b0b9c69335d68d8362d658dd037071b82c160f43badd65a6bad18e3c7f5250dae15eb5a353924a160d484891430d6427bea50d695559f298383e64947c7bb6badb5d6da5aebd76abd8fa65a5b1f4f6b5fe6b62f302d2098005c648de95b0b7d7739782c3965ba32aaa2da76c118c82528489ceeee3eb330b7bfd3588dbd5a77a2fb854dbf34cbfe41a3ddf359708bde19be536cfa83893c8a7b3e0def24e620160ea22a6add7217c364d809e8659bce16faa3dd937565aea232720729cec741947500a99a4f1fdba78fabb02914b14d5bbcf925c0c8ae3f98b832fb75e3d95286910bcc19853210a1a068e70e6f7afaf7640d2a5d74195d32a531eea2bf2361123d8c5d7fa49e9a2df5fda6664fac31d6429e4fb167855dad949943b3a5fe953136c8a81c78cb3b3f9aa9b11683a078e0f79fe266199a32a16ca92f630ee16df5978c32adb5ba67e96ec3b93d3565e449fb31532db5ab8bf6eef6cbf1eefe44765eef7bf92ebe22812f5fbee775ac1cfeb404c746f6d7e9c5591487aaecd317b552860acd965868377d5156f660ad4c29c5a1db5ff3bc6ab58b37aef33e12984b2d60282e524e2a2f50a91518313ed43ec33b792daab24f5fb129e3f1609c736cdb3abd9d23ae1a59c33e672302d9e2f1e878496cfb1ecf8ddd3be42c1aa2f739841e124fc76bb9ca3e86ede024b1da03daf02038e3c12e168bc5409607bbd90c94f160f77abd5ea07eb0131202c3073b1c1004ffc1aea7078cf120379bcd66208c07bb1b70e5412e168bc5c0d4839c9111887a907bbd5e2ff0c5839c9010a8f2208743550e82e0e941aea7074c79709bcd6633d0c583dc0d08a23cb8c562b118687a703332024f1edc5eafd70b6cf1e026345bac10587a70c30141109c0ff6805b0f8863b158cc08c446607ef085f86a7bf0859031ddebf502df87b3f08baaac108885401cf0a5e3801807fc1ea40ff680337006ce40f039dc03827706823fa50cbe992df6c197a4191f0ed086d8cf3043065962b3582c36dbf6431924ddbd84ba57f712daf63ffcbec3e97a3a9c0ea7c3e97ab6fd18313c18b3ee66369b7537db3e8c952e15338ac56246dbfe0a8a7bc1bd84b817f7e25e42db7e4a653b71385c0f87c3e1f46cfba814ec629b7137e036e3b6d98cbbd9f65fa05cd316db8cc02dc66db198d1b6af72a2b5d85e9b10b8bdb6d7f6da84b6fd53c90cd9eef12ed970b69e0d67c3d970b69e10fc79024109bb11338ac56246db7eeec2eeb794aeebf4f8f2f2127abd02f7e5167a4f7747374da3ce337978268fdd6447c38fc629a51ce8244e0b9f6a185f0f7f92263237a847f0b55ff968fcb9ef56475cbcbffa78a8762d25c9fed55feb5cb6f8d72fd4668bb7ddd669bd185f8f3abbaef334128dd120201ecaa3859e4729e5a13c9487f2681e4782f1f5d0b08bd87b5268bf5b0204e322847f942077ffe9d8f4d8bda65d7bee89d44d7f0870d3f7be7b77f1f3c7ad56ab156e57d95eda3e9da4fd7f349fd6fc6fb838b5ff343d4e776ca9709b852f6cf73ccff33ccff33ccff33cef492b1f0e6f3699452d6fb63e0ff5f5f8343d829af4ddf548a17d6c81342286e40d7efe8e0b89e05dff0b89e4202936eaa3e91efb0abff87a748fbfb006994d280f64cb7d30a43e90352e877fec1e7338a5a33c379cf6f88a87bedc533e7f9020d3aefb3a7fe612babf3f7f648cf72a2aa552f7e376dfbdae46f7e1a7efa53e1a4e7bdd6717bdefbe9b5f8e209ea783903add3d11b51ea93d345c2e1567a77be92615daf79d0ab978a5d42f1e0eef9e21e5a13ca03da03df44583a8108db9b883b2a80f5d725fde774c29fd8f12edc474f67d0a43b19491abfa424f3e1a8a297e6f52ea69db53edf356de6d11823c56d7b6797ffa634dc1fe68b67797af6c3e7f3d36bd1199a52b328f059a32726fbbc457f5efdba00ee6aebab762a0010424df4a960592aafbf22d1458bce2bf60b360a960a998924e1a82400e4d40b2a694808c7915955269949fff16a288d4bdfd10e0debe7becab2d7cece27d4f1399aebdb156cf74bf0b5da60dda848c609aecfba38b38546bad75ac75d66a1fcf5a7f9420e31f72bd4cf6b5c9f6f7ad8daf8698fbfb3fb2afadd9b71eed6b34da9b7df5885ff6586519c9c926d9572eb9d6c77bffb17be7f4688bbcef3491b93f3dcaf0bad01e6da19d59a3d016d92059e33e175a29648dfb5f68a7982d42361612c11b6bbbc445adb583b2ec90abeebbb04dc6d174b41d166999845f0edf47c898bbefd7573d2263e8a62c0be4aed97249ef7a148265a388d4edfd10e02685727736e6db7071eaa83caca013501e6158d5d56239ad64142bf6fdf1dbfe56b2a8153246e33e8ef4dc93e4e6e49c9bf41e8e2f7b3e6572bfd69c8eb2d1fdeac238e77fd7c7815f8fef394d646e921ee70681284b56d70664b7ffe83708a867d1b743089b9ed83cd2f971d9111e213aab391f0e8c7fca68bcc79ac8dcdd6b5f8e191e0eb5ed8538fcb7d002d9255bd0f87fca19d34e8fb668df9f53f6f5c07a36d144e6deb48c2f876fd77689ac71bf8616c8c5fb2d40307fb44023d611a4fbeff1170e99dbd3b3090ea76c9bb2d9840eedfb4d94fefe2c7203b4f8fba4906ba1c59286c18082826cf0667c395c07f1ee0f99bbdbf48f2379f49bb1ee150affa789a8b40785750f71e3c79af2b878fd3d6ccaa9d3d3e0a12c1758063a053dcfbedfada6dd5d38c4dc18c855f731cef974b240db69df17ef73f5eb31b5a789cc8d7576f1bebfc6c339078ef8beef691536b30a9b9b4dabcdaedf6d5b49c5df06d95512bb8e8b536eb684863cdf8f7cd5f21557857c76fad98cda549b2c8410f35d7b8e8b9e531963a9f529ecfadfd703fdcfda771ef43f8db2f6ada5d68425cb8362a720f37fcb3dce1f3d28c7c53ab523e9a41da90f1dda010979ac3541fc87ccbdd1b1c2b61da98beacc36235f7947b52563beaf5f8f903124f049a4f7c21124692a9b9bfb68b6eda7dc1e956dee455b489b509b1b57c96c8af0925f65485fd4c7551ee4dbe953196de2ab4d6fb4c8574ebd8ff12795922662ee71e26c9b7e1db489fc6e34f395cdda837680e52043e6ae2e175dbb8eb566571923f70f13e4b1d6b0305515208b2c95d8b4f690f7ab981f1965dc5d4fe8e3a1da44d4e9e3220b1d72b1d297ac51ff2707a13f646effd1735641707264cc1232c6fbef3def6d387edad3b56667596be90c79a4ae5af332daf56b8daf50a307b97c859aba87b8635f8fd0214ae43990aafa3ec044d8b52a61d7772884e4d1aeb3ce3ae439be9acfca12fc70ccb9b7af7ba33fc371ba7c359ae8913a81602e5659a34e177c0c955329fbcc835cac2e64f44d4e4c72c7857ee462fd1f2ac8d4c757e3d3978cc15f9f0a41c66c5fe9fb1020fe687c0e21cb1814aded3fc3f95b0ffff994a2e88f28eadd28ee71e284e304aa53564b42f1d813e7c8579ca6e141f531ce99be3c48dcdedf6eba8748abb847fa126dbdd9c55af778c2d181f7a9ee97530ffe54f3c04310140fba7940808bf36128a1635693afaa8de72f848e659aa6572d919005a1bd10da676d6e0dd446bc354cfde7dfcfff5292ac1b54a57d4c35867b54d91acc0b7205920117b5ed6d587f0b75d8aff6eb573dce6d0488afe46b9f811b30aaf1b0859fd4befdf8f242a75b69372d6badb556ba6dd5242ed5974a5470b34729d33e084bb5f75e6cdb6b1afebafddb30f5365cebdf229c821b3e5dae23f47dd0f781caa14d51ddf44a47799441defba02ce9e2534c8fd2e24ff297c0ffbee5c5ca962e2f35a48c0fd9e2425534854249d9a2a49721f7248e7b6edbfece96afb6273dfd4a0aa58ba9f0013e19f528f9f4b7277d573f1c2494a348288d92ba8776a1ac177a3ca9e8319ff4e4f4f43e1c1c178e2f2fd4e3bcefac746aa7fdf08712593e9d4db65767955eb91f36b97b4ac3573424fd143d62177ac4287acc263de6935349ff286e4a7af91bf722177a1cb61fa7a5ac21f5c8b2ef97a3fe767fab9f77154709b8a7d170a1533aa5f5ebae7a3462bf98dcac932ce3acf293df494a3539a776f12ddf9fca773d7a4ffa4eca1d3038bb789f7bfadafb9031f2bb93952dbf4529835c88abf6640dd27be8fd49d8221cf3ee7ebc61779a88294392360901b3a956ed1d2e1e65fc457c3531ce599441228f28ee25953fce9618ee608951e1335dbeb23f5f3edbfef4f15545c3b63236c5cfb63f6b8e70d54bc9668c2b23cacb27593e68c7c937c9306594e58fa6934eb9f8e305799c3cdb4a1df2690ef9f4290f4672f0cc1ef9009fcc3d4a723c883b5cb4cf3277cadb11a3a4682955f25d682bad9c13bb57ab871f66e3b7b1f1cb978dbffa575dc4a1f6e1a8d74e79fdcaaf544bea6153fefaf547916e2971587149be54a244923d7d48a3ad3d1828854a6badb5d64a29adf56badb5d64a6badf569a55f2906b9d65a6bad550bd6530004440a60dbbe04e60e7ffb5422678fe256a2c4cdb65f45fb32476ecf162f44aafaa6485953aaec5b0bb3ad85c925f28fe2b64f83c5c5f9e2f3e043c6c86d279544940b9ddc783665f9fbd7ea0fc3ffff95954fa55e45e54fa747417993e94ba5cff9bfef3defb7ed317e2bc33bb1a43c3a036ab3a9ccd5711ca433652e2c08a6333bf044aae60df827ae52ca245c692b4cbad40e07c1407922c5995259b050cd7ac39442964a527064df225ff94a2ab109daf4b1d095f92aa2e3a8248bd9eb92a05444330000004316002028100c864482b12c08236172f214800e79a2445a589c4bc4510a2421c618a49422861043004006066064c401002734d31a47229058ce311731501086d20b13c9c76d18ea9c890f8268b4be475c3317d907ae2d9d1087f6db120fc76bb9380c158a180a44f484f817f12610816a12851f08ad4aa304986000f8dc661292e986be11250280729e4d403802a99062624723372b871511e0fa9fcede35816a6b56a99e6a927bfbfdc01bb9191cb62298490bdc046300211a96ed2cc6b7ec755dfb8caf800cf34afea323353413d6129dc77def4cb6a9f5dbd8d83a71e128a03915a2b83a543399f10b6fd24c261d1e715d8cb20824c4db44ef4e2d7a39a4f533a0d101e7d3af79a4320123fdd2bde7643999e95b865c13cdc39392841c055c960bcdffdd92b3564d13baeb41fec9ddc8feeebb7e619928208409abc609f9b9b7ff93de8fb382dd476fe1dde785b4c9663afc11670f454ee13868897b7ab915002289e2f4bf2abace12abee638531b84569609dac86b3d9ef1763fb25a784991eac43045f767052377435323eee37a1a638f999b201f07432b351d0f964ce763a72ac4307a1448242fd1f12dec0553e1ffe21b0c7a5efb838e77ae0b478e2929e5e7dd32673fe19044548dc0c928a2b5401af70f9272725a152863469a88b009a9904bb388fc71a418ab957512a62bd3728c4f774ff68408869c0514b66d780064f6e64036f39cd3921020ab6420fd897753c0b2d101b915601f999ef89b9011de16410a1a23c79a351a507efd7d888d4234ab64906d87babad51c20c07a42c8528a28908ea014a5c94810c79ebe4ed4dc6f2a84a5ceae66166e4165dec1082a6e4166dd932d095ed660b07a83679d8d9b35253a105c0179cd0338a13ea1acc17b0acdcb1002cbe89ec2db5758742905d5f01281308fe0d4b8773114cac9c30f202926100f2904af58af9de71a52f886fe6a2e28a0d53c001f766025c27d87108825f730ee2e8074a9dba16d2571dd75c627e672a35a31651e3106d633317f6f08d2478c02665df744343e69d804ed481cbc3693d009d9798e10280473fa8b92c01a57b78666282b45460a815bb4976734269aedcdeb79a38991aa89183ff95de3f490fb6d1a5866db68bea27e89fa39fa756d87c54a31f6d9f4900800afdfce63ffc5d82461f54b500baea3731b314fbea61295e655c0a4fb0ccc510387a54920639835a1fbb5a952dc524494f7e0e2df3f4594a3273f088ffc84c05545cc84f10ab6ef463a88851115aac789e0177fa87fe505ea9040f38f64e150c0bd587da6995e930de890e16f53a20c69ef5e434c95d5051247d8c200310a31207a081b132909565e96cb6379701a41ce80726d9f49059784206dea762e37a9c9bd025a8389bc58e249da7f3a54500b3930cd45f6f3289d9dc62e31f3190062b3b9d815bc13e133ad66e30e601272771a8e1df13bd98243a2f156b97d4b3cc3569e992d5a31ae6ae653d355f5d7b4d744843741bde96e31a059181b47ce0a47b4e38214605b1e790ef7638de507d6a7c049bfc0d350306b44c0980409556d88b1c5af2141a134d555964bc16bebcad055883c16c6d487a261449a8fced7d38d97acdf1bca66e528ba78a28ff857289668ceeaefc0604ead9e6f24457dea683ebeb89ddbf85d6e3bc56d11760044725cdd18fa26339f14b5bce315a7e209e90e4580b7a24c7d3c4cb6ec09f96ba89002922edf52efeac7867c122b22ebbff5ee9cfddcd4c251479508546ec88a99a0cbf03a199a00de496d13156f14f50f4f834f400e53c726a7d0fe20896693aefc14c056b2569904b1ff60be51e4f55ea3883e5a71c2f498eb8358a13163e12e3e093e3628d63ab8e561c9765789c226417e8484bc0becc4beaf6ee1e62066593042f339da68ea45f1f0a5a0557190f63ef3c231cf4669568d3af8682371813149dc84232158462916e3794702e2ad6d53add0cfbbe491e67ffe65e1c07ad6f9da9b8807d35f710eddc206a98fab7a404869e4a9a91bbd5b7cce21a2c4231f1316ed125391500504031ff7e02fab71a6a1203f3fd6d6a45297d7eb0655bb0764b2daca42f7d9f53d06b9423c4dcd1161e8baf37c5fdea98de510d4378f76aeb014e8728007992e2993725fcdb26a7915ceed045cb7dbf1862f5e0ab8e369366a0f5367063b13b73a16c38fa878b94879a1f4b140319bf3b55f3273467e35898a285763df84145f044ad46e9b23659b72711d6cc9e0710549596fe27e996b0932e4284bc519ee315e2dce64d4271b5583445f3150e39046c47749be942849723ba0a9115f12530a1483b0e0a2361e20a701d4c34c8685d64beb0045e61230176a438fb9408be1840f85f344e89af4894e719fa170fefbe034acb484798843ac7ee97d727bd50cbaf7a26e0f0bc8143eac3e647332d8ccadca044890767defb529e003e8e9dc53f09d5c76af77d124c55c5f7812ee84c626b90a618114427e44011cba836f1a6a04e06a09d7012522dd2171c6eb4fb449eecef264e860de918663fccd02324890907eb4e598ddc653f663f1d2e14812381a68ecceccbb1167d72fca12a5100961da1fe08567d1e574d1dc491f6c386ca25e9991f149c68a7bd3380eafefa80bbae9f3e738e3b7b410395f1376596b01a399bee72ce10d416a72af0ebd9429fcc08afffa93610eb20ad19ed906e22cdf00bbf2414677e0cc22dfae955620143731eb792c4b2fd223e509581e31c12da080eac7240957e9b787b28e94b5daf054c62c75c8f00c03aa5e7d09b8433a20c808830bca067bb480ed5514671f90610b3e2741503927ee622c969104b672e2925912f625a4fa61f26c7893d04be95035773930ed75aaab7ff02b16cd8f4571b8dea100064f4b91071b72d8f8a92b7239e56e51ddd33dc27f685d47b6c5ebdeaea01aea0f2f2b9e98debdffdb7dbda642b0ac2eda4ea429da118f52030ca4f466e3baa794f18b6de00e3240725f5ba1cc977d6a1402a87de4f6862a4d4b0257704ef539ab350394c8c8a6ba4d3689e258120249d684c84d8bcd7b4123e9c92eb4abcd617b41c9efe67e19c222e63f84a2bc5346a02ac965ba21d26d0d15efa8880245a72086ddaaff328a67ea55ff4204e71e601e78a17a96a33e67ddceaa09e65e556fd0994dd7c1189f8e1e926ca0852f9a1452b5e513167f352d8497af28788f9bb42b3392e8635a53aa47ec0925c1fc6fe8b2375d26cfcff1b24f2d27c6dd4178361bb2dd4c877e31f1c8a770179272e3ca5a68adf2d6120d7b210d11d4b183b3d3441e4fe1c24050c924bc0deb335d7aea2c5d997a48ad49b8da35a3330122d31a42213ae262317190ac17796c41a0a9b43188c6db5991042664299e48a199bc2b881349fea8349bf286b12ab340fe267c40667a0957dbee235c0340359b136893c073417773350543b08a119e8147339d883fd34ab5bbae066f44fa4b0b7fc2892cec30f291850834880286b7630d60a20d71d65ff45181f02569da5cec2f83bf5e49ac24c23ca4fe9bd1d96d6ea4b77c0b9451607c9d7a7d7eca38688272b5f850dfd27b8e30c762a82e41ea830d86ff53911f946da887e64c6249b7d832632ea064261b756ce7ccec43950d9b8423958c620b8824e4dddfd2d326364b5a26922db2681424e0ae616bfad088752c3a8e89b48b53087adba77e72a35cd8389f6bc8cdc5335c6aa9d2e9ef0993a16259f483cf257c38a630926680f4bc8506df942bae5dec7837cc02131eae452a37c00ca59c039542e82e7a6f786dbebdaefef6e73e1f28c37ec6dd2b3bc280fd338a9a170cb9e31984fa19edb82a6cb409f04bf2de614ff52124c2c16cca22fee20b85a3f7ad092043618ae8bde6bb5d0408402e233618e8d2d9e04b8970aabaf9cfc215d5d8882611b1a2427ed2d125427c0166361f512459182ab636a2a3b215117c718cc364efe7a3ce116e35cc32f258ad8bf9ce88a45245d5a5767e5ae3a4ef527560b9c529341267ed20119d13f21acbeea1c3b8491404a07a8aa5b6faca78458cfc9dc670add1d17227b2cf83bbf58c982702177d59f730d183412519cc7ec54c5c3e6b485e31f1c5f167fa96b8ef74610a988b975dbf8a508db86434809604baa5f4d4809a5c2cb340d6aa44014e887b31f4f3201939f4533dd266b16916f16aab99fbbe0ca98a6c46f29132e5c0d14d82d08ab961ec67f1feb8dee6a9c0ae8c5797e500922c6e314a090c3fe54b63e00e17930108eb14f18dcb5fd62215752bed33eec27de480444ea2ec2c34f2573933515a244d87371e157180f9df1153ccf2609e401c18b7317da9f445f23e506a0ed1958560d5987300a1d2c9c1a30b09f77f54c932687e955583f229b5b3325d3442d3dd97818f60672b96aacf6669980f88dd22fe2ec9cc5e7181d71ecff903a36b0e844253bd4a4af04c588f5b2a0697fc59ce02c91ba1eea17be12c457665aed2a60c0c6b010dd96c32f5aebc00f5ee44bca6111dda98b70b949fbac5d193301626ed63404e1f9f69945ab394e4e8d024073e009246036d49e55ef8d0c9d00cd02c060c3128e45aa24a052f5d1093a5bd5bd11fddcb3e1f14a884edb260fa0d079e3d1b0c92a5ee6057e7e018d32c1d8ca341da4d6d6b6d6beb2bb7f83913c3ebdb5c901ca556bee230e0ee393ecde70cfb617d5f0011608407b3966ddbbc6a2fee1456a19b697aaeed9ef7006a39301b6f149ea94d1fa4cb9c34911e98a551a25c8f4913d3622a1a466f2ccf60878ebdc779599be8c625c6e4df3c0bdc361c413f2eb05a2a89a22d40e35e80df50d53d3d29ea35a23ab6d163fe7bee8bcd3ffb4c2820171f180a56490e96d319aaacf4970fc388cc69b1c95ac15471c95566c3531e307de717ecfb44d9875c434d03ddb9d8b8050a9fc204cb23fd0cc366365e8703e5532bf9c96cef68ec8058a46218b7c52be85c818e1a2e06dbd6f769d0a39fe29d0d9c1bc43becb205950688589def26889f466b58b574c1a22b73704e653f344a8432494b595254814815e87000ca34ef7a90b90478afe915aa39002e7161f0d40604b1703a246d0a86703652d14002e4b0d0100ec1c6440a4ea53e294dac3d81c2921831001fd5eea82e5162d8065e91a927e8287744567a1426945471409f05d3df71e923b450a82dae0bff916ddf8a78201b66d15ca4e8107514123821c1aac0ab0abf11294516c031ef1466e332e3fc54412ffd5f070aa0fb8012cc2ed7e0e50c06244d6a70d6d7f32a2263204e5ec2dd5ed1e03fc7797e66e4bd7c4bea455c432c7fe88ffc2aa9735448df0f0a4454bfbcb60177873cf2144fdf7af1fa1dbc5fa2c0bab24d044ed1c29bf4e3d50850fc2b28c0827e79ec3f989c261fc7b36d804c8b18861c45accc19cf37b4ebd220e4ee0db093b6c73cde5d422973f50f2df7b3b91937276a1a3e5ee8039941df2966d97fdce064680a93512ffddff3420d6ba9ee840601014ea22c895213abdf1b9a007532e50d45bbbc0d4823aceeabc429923ccf578f64b0102f9133c41f0656f43f629856a516a5cd7a352c2a3bf5ba94440cdc4101f178352ea676aa22d3e520af34bb7b3e21540cdbf125a403d550aaa63558dfa759b7bb947842ffd0d8eb2116eb84b123525784584d1e4a1231c4d18efa498c8089084cc15f78a00a9525c03fe5618fae9dd35c3410c72c524deeefdcce546ce08ba341c092defaa44ca3ed0255516d06d79c4d8b7a667d462aa7fcc68a20840bb75c9130a02467e390390722352a801f7c865f60cae1e068d4630883e22f3b0b7082011beb3f8fa93c8cc1b8acf74744c1e698703c0608b4fd15bd2fd36801e073b0a906f8afa08b2ccc89318e91109098b06576a0510e50c72687db41e2918f87210204b6fcbd203c8f763576518c4acae3f28a0b700619a01663ae873f8fdd5a59a33aa0362b41ebbcb34a7b1803869c9e63828a5077ea67b75628081abe9453a265cfb0ac6a2fd07d2ae2ac4bca92e1a0d9d40c1202b8bb6f53a08f857606d40543f0128fa1e9712a523d919d171782c8883e10d0c25c0e084200cb9894c2dd2c80620cf086230d1ce7d52662efeabba22e2e3fe4f7476a09538c5286430e9b308e86df374391d52dc456c44aad4240973f845654a4fc8121585fcb559c7229928259886e24640e24db825a91595a1ac3904c76465302fe23d75640474fb18641348554649a1cd534fb77140e441a70413509a904fe4124632e5b778385209625841658003da3914f44305ac653d007bdbca7d4fec3fa360a7ddcc530449fbc2c0eb81eaa0379df30d002e9653013e8e39fa4fd99b62e047e4f91e8c96b1622629460506162339d8ca8c1a4550887d46636d3c0e811faee41e861ddc8be4d3737901b8ed134057b152517afe19136b91938b21e4b162f7d14f5cb3a80036334ba5abdd5324a52234c67ab9a7bb4c6ca5ab755f88558c413e9ece20e419ed3a81c65f0de64c9cbd5d53d39138302009cc95131cbe0078ee0d96264fc630fba19e0aa055f2cec0d323279b4e81621744a3a847ef3288c9cb32389848ee68f17917ee50d1ca4077e86fa852832aa3e891307e23d326cdebe2ecb97afb2bd92aeb06030fc7cdf5b1245e3963d5fb177bc2432c412b205f7b6314b519241ea64f4f695f803ddf99a26606354c047cd034b8b93233387e4a85559c8aa9d31fa4b9cd916470e7a7b5ea455477b3cc29666377b52e00588d01a0cea046b712b9aaf5209de754b2827975798583bdeb4db99f0e24b2e38fe865ba98c3873ab7fbd6a3c52acc924b063e0e9014085dc56c66bbca00b2769311a9cc572a02b0e00cbb3213691de710e1505ccda82ab6a552a5ad27f06c943118ea483ab061424474413292239481df3ca98610447b35899eb0f8db86815cb09843f7decf229b03da75ee440b5fd59504a118c49681b0fbd1daccbc28b1b845382dcd54f965e7acb6eb4a36e458cd3eb2845ed02fcbc5430463888ff55d32bd354535534a0aa493cc03c1a498fdaf82eb2a6fd94087d517f22d7ba3109af8eef23aad6299b9692f4e62d54cfc1bd34df621fd0972e7fbf93895b3f590b03e009466672ae4bc8f813b65f2d08f2a06134da32c136242f01c159ab19a155145f2a822b8fb2654918552d7227c8eeebe797a942768a0c85620c3a8487fd8eb02113524be99754df9c0b179a2942fac348d082495cf280e58369f1c08f54195f6a6785572a598f84ae7f2e8f38bc37156fc038d7ff00b220c94debebb24767f59a21974bd3f3f61ff6570c2fc5066c2a8f9dbe3a94a22fd50b2e7f7e5fcfd65f3f76c76411b9ac4a1034609118033e14a0b7abb19343eb707b62933c23cacc5f13735a9a158f64fee7dd9346906234dc64bbdbae8f1f53d8ada045f44f4ec64ece63c5acf26485260dddaa31f58c5d6ad3d8ac0bc6ce89ca755d548ee745e22615e1872ce6ba96a847b3a6f91302f0c39e6b15625d22d9597689817061df35aab1ae996ce5b14cc4b03c76968419d0d1dd9161fe82ce87107be663c3e183336348c0f83dcae29781064128a9d262d415f7f10411b7443fbde7b277222d9323911936595c1844e2a4326277292cc323981c96595c9844e2a4326277082ec3238d1a0fde69bf7df7df3f63b13ddfbefbe7bfbdd77ef5974dfbd7debbbb7ef7c1fa00fa8edafd717692d837468496b90d74606648bd75485ea5c954f78e6a0e45432f254462fad32c8343ee4360e9193578b1c972dc0303b1b675d5ec475110987e9c0ba91137ab571c9902449304707c7ed9b137b398dce72d371c82285c55d95aa6abec5168f3d51ef36e896419924e53001d50087e167801a4d651272cff248db5d24436ddf9cecbd41ac8e7b8a830b5e0c090f1a796058fa13bdb7c40bb96f2128c1cb9021c141c75a5206c93cf35097dd759dd4bbc1ca11a5cfe8b8ff22b8d897d09001b119500641e5c1a1ae5ded32d173c7f64669cdc230566ad409397cf2c867803907d9e94ff6be2daee37c8aa0045e43860a463d609cdec45e97c7849c6f1944dc4b7898a1d04b312e83643e7fa06b5dba4ef6de6645448967e9b8af18a4e065a8d0d098172c83a3e77d5077ddbb4eec79c5bea462b9e889d33a2de418e491eb881d8065c53649cfa5771d379f3ba26df0f6d4f3726389cb20b14fe869823ea4c43384dc577065c99424a4b48cd6e9887573b2c715623aee2b0d2e7a352c346ce48162e9648e7e8ac9a41884dcbecfeddac9ae48225b5006d9620106399fbae75f6689e4262bd420ae0d61df98a5c9a1649542bc288632c0f8e0f88c1c164253a0c11f6aa8350c63103123a3216f883f98e23498fc69cd8d59c01bd91012e31c6cc5e07a0f2ec936725f612cd480435b8ea8f57008ef89ec8111c6d41ed73aee39076e1eaf6239a6534bcfd8e018d0e86304c31d4e34fc667e078d6a0cece18e77c419f500cd3a035cc4682fe248a3a3c10fff1e610bf6fd00287e2b76b4d1c19cb26ff348103d8cd0b308dc4bd988d7cb432120692c882f844334666a03c6281b66b3ea51028c88f8f022461a331b87ca3cb5c5b1af16508211442845fda9195c8b7a3036d7b2783ea75e47100944e323e6d533224e384c4f628a339b41229111ced93c3a2fa3e21ca2566cf92bc930243c9bd3b1b0373c5d5180b14f103d7c4bcc9273272b01d7cbde7a4e4c5b350c4c7c3fe0a82f74e9ba8ce975c833340eb8831506e650e31b0256aa189f786a863694e369c0268d5d5c8f3e58be1692813c7103b88b82bbe9b9ba95e1e3993100a9fa130c00061d77cd0231ce8f5d2ac32fd048ae0d80fa75a769588214c076a529a67218afdfa951810391ad0b68518a065a1c6a18ccf4a82580b3d17fb06a866b53d20ad38d43367dc76c1cb20cfa4c949e3c3ea00d2ff184e07073ebe857cbeab83eb3ce7607f46957e56aeb09a125834841c6eb809b2030a0c7550c973de0688560cc16f2cb178b0a79615e440c34d81f5176f972ac935900b63d22ff80af10d6091dd203e9da81ce092a719b296a8fa09053f89f117e5f954af9529d5ae733ea8434d4071ccb4ecd0e2e9866b820276dfddcedb4fd6443f15ae74e53e4d2a6e8d9a4e96d779fdd6e0c61324bb4ecc6e06438079cb29ce2515e56878b94eb210c6e62c761fc6bb8fbb5c5d4a516f4456d1e30aad70a94ff09d5fdd35957242465d12e1b90a9fecd3de05c91109ff6541dfb79b85767e19d01090b5ee4c5aa9bbf1b0bfbf0f5d3e7627797df283abe8edd197433c9f45a6beedf1706a0bdf4beb846bd1a2da12c6be829f4c9c24aee881f9b74b2f462f1ed2729c9ceb31e9a0d6fc871de85150327d0e5c143d718f20ba40c249b4a0f787914c8e053d343a6e3d7bf185c82e126c1ae47b8eca3098fe48c8795498edfd972d2bc1634798f669176d69023e0ec7076b636e2057d1403234e31a32288bdd6fb45bb13d97a392188746246f144c77d4ec36cc9528f81b6ff8dc197444fef8b343d683a993b517e68d934a96464b175a1714b5f831b682025346bea7231b1b482de1e6eff1b832f899ede17697ad07462f136a5ae4d79f513eb9d171b632509a6fc27cccb9d3f6720c6224654e5882551061e2df0b387fdc326f5caf06bf6a13d1cd876320ab94b5f5389ba2236b62e911ec6543e4b59dd8910d539624b94815703fcec69ffb18bfd32f88e1d783b07b6f386993889ac9f8e62f5ab82e2f9c1c45ec34f9abcf3f040d72e366e4343cb66bf81aedfadc199451e2bbd8ba241a24abcfc3b917303c1e4037e869a2698c800977198b2d0762b0ae7ad61e28c3ac7b6916403d10abd7bbabe6d267526786b2faee740d769de1cbfbc1b50dadaa6ab78a418266110827406adf407c7232ecc87baeca6e534169538f9187c7dd50eb538f005d3eb2ec84e028e31c9d1c55c8a70b44bc23140f60f80330aab14dbb5caa2d5a7247a51e2f05b4a5634ecc0afa7eb8b7668c1812f6fc45de876664247e45b8f87932612ff0415d1683720b807bc95c9c0016a04993ae9c21ba0128d1a54a60195fff57a525dbf5b83338b3cb6bd1b85878020e1b2ee408f8d28371aab3c2b49b8e38cc76cb21171c1bb6637f4220ae79e95a84133d52420f14f574bcaed6333f166d16bfb223d0e9a4e66c6e8640feeaa6842f7fab54b2f9684d8b0603d6d22bdecf5adab530cb038d065b79dbfd1d085d9db80e3e766b25c9cbb2cc1406fd0be7731d8251a6090b30b7988bc531db5119a8c7f3eb1c1ff8926786066ad2dd1c8b77a41c05de8baa1148c0336ba8380fd351c181f7eebe6084d08331dcccff5814af051f4367d14d7116bdf2640545f24df960d457b1385645b87416698dbcc6f793aa1eb9b308accd581311e5e95dc1d85ac8195d5a421651630d947af25d5f1b433d8b2c093abd75d28be5a7bb1761c35a9ee9764d4973506d3de2b2d20d62475719d4a9e7f0dcebb5559390daeb1091eb858588546fdd3d79372db472ed1ce93d25db8e9808af0c917562ed0f998e868b03cd297e60959b9ec6b1f5c4272967405fc79e15b8ea12d6aeeafae2242b3ec90651422cd882d0ff96b3d9d0dc720f9f3f1078998eddb17e8f781eb1bd4f4810e3df0c59c85ec0c6e4e23ee28801c9faf47faf84f1bf5a0e0dbbd796063e942f4311c0d1595fb9dca09396482ed332c5dad0ed435fbe5a069d7bb94b495a70fdad26cd03b2c5d289a18064d1502c966c22e6a4df257bf4613accec6ed3deef817a726e1a229d941cabdf10bf0d5c3d16aba7208d038812102f54381d87b731d3a830396624b8abab6d911a787c7cd90e22e6965b9fb275c5109cb8ffbfacb9c0e78ca214afc432d987dea631f8c16cf4ee8d3714a5b363b826abac31ba6b3c94e2d73620237525ebde3ee9ca3ca58b307c790c6744d3d55dc1c8c4c7eff1137d233239db31c47f055b6b7dd1d28a7d32b340e3d251750c9dee130a9808a378c824af0becb78c3cda96b00e51948da3a9b81f77fda993599a35c9a8bce2a43e26b952b4586f56184e23f95dd4a750f4fdfd7de33343f7d29ca42fdefc35efc61c9a3144070d49af541eee0ffc13915853545b7d7c4644ecd008ba2a1171f5e9ccb361c3372d56fd917000007431200679c5716032869a8f7bbd422b341b9ded8747d371b3a33e5f48d51499c5d9dff22527989b8e5f3c7df856f3dea243526beace94de14c4bbcbe7ea0567fb97874cd342f17a76bbcafdac38a775b696484f8ca0f856bb36563f26299b293984f93c2d5655bdb5c969b6977a1746a53f5eb1256d99e2da3e4fdb5886328a35f92789f33cda690662e68f2bf180de99b57f7f28fbf48a0d84ab96244e395bfe5cfe64071ea2acdfeac3d8cf6960fe67f37ce40e3c90553c330bca5d3092869e48c1299013962e18c356814bfcc5ae8d6fd43dd1238e8930e391a18a6825546b88bc2cb520f2dc41dc5bdc39d466e0b855c40919048eefcf5d717e819427206095a0c43c2e7323cf16067d0bf2e837ad89ee32fe2f2016911d3002bfa225b029532fdf9130c920c69a899b039b3be5d74b81c650dbad99c99c44f997519fb78b46442753f692a5d6f3892e4bc8cfa25b446e2d44cdacdb828ae7dbc211eec43f359fe1b956b057e54302f189f4979adb2627c267e57a83c08d20b6a63bc5c54234e30166c8246cececb8f8cbe6ec59d0455cd734e2b6bb7aa8532a571b80154fe8373749e7702e3561a5d308f21f63bd10192cf33b7edbcbb67f1673b57f2259a34b88ed07db8c875e9b7d6d4b8b86df774448e9204aa816f723faeda05e5273e1f8f234ef87f21afd9b036c8b65fc83a302ce9b5132df600c0fb4d8f8271bd3504cdefddbf754fe60f2b03efa502339216e2a717a4bb33c901a0e4bcb05435aad8a102e76d7adaa12064cd0efa71d52274d01d8c772059a5f0c0e8de7abc5ba09d4bbd1116e42900f60577863d2424b6bc6a3ac88244fd227ec64006011284a04082101468d0820229a0075190b21f320c462b89b5094c98309d29d3263561d2b4a64c16d35c4d17f09244444f85d0ffe98b8d252e0b3c68f593a980c73015668cc87ce077597a02b04ca193f941af787e06aeadf1cd221a1d71a6c6cc8d62a5d7f7b40651e8639c1a9d6b57365e929db71fd3a3080440437b6a1e7196f2e3fbde92db84c25a0c767c05635c160b018c0a09734b8ff3ae395744ee210756e4b10d9f054d4e34afc6beb67346129ef36433afbbe1fa5ee425252949697bdcd2752a428a31c4fe94748f8153fd130af73dd84b39f479a515f5408a1dc2cac53fd64dc6d297bb435efc47219ba9683f5edb8cfebd6e16553fffc9eefb63d4fdc39cac282a87fe439e0c1695fbfe7b54fad348fff398ec282a27ff739aac8acab9f945141dcd18c24e80ca97c7ffdf2f545199c88f3628635199d34f76bf3fa2ae3fe46755540ee657454fc92a8216559cfacb3afaa3a6fbc32f27151585f643e7071615f5fdbda6fc138df6f39567151525f773e3a75c54a439d45008692eb9853954d92b226090872a2ae3f613ce4b2c2a83fe41fdfc3748f26729ad75d00237acc73916d500f8dfbaf4538df6f335e7141525fff3a3a72c2acaf3cb66f2434de1b76f8eb9a8a8d56cfdefd92b83f71856609531edbae984170d45d549b6474f7b1976b71112f1c8c679fbedd4a0d2807de555d22c2a4da42db5ae650d0bab925054b11460b7d5ef4cd270655199ba7bde2e8e5554035b1707fe121f6943684ca78bca086aff5f54e33ff9f477a4fa7b6db3781bd1c47f26a3cd0c50544915d089130011f65a0eea298a7ed7e50c3d6e57549fb8041515de6b28d5e5ce99d9a0cf54e59d2c86aebefb2e9ed817525809252c90b4d02f9e862bdfcb632793ceb14cc85c4e0b8eacc45e130432ba59adbaebc6fb9aefded017f7460b21c103e65de25371121f52e3d6a332e91007534191f9a1b151b52706e2e34adea42e7c9842031b4d8cf1861e96abd95e4569a3a53d4dd4f08c09269749cf15154edd6455abaee8af7c8ec94c84a82d8e54fab5ed2077da58243384312b47c2eafc24e6a9a4068d4d81b99bd31f33146306a7fce9a1b21a46e3e68a0facfa6ae386a90a1ac33ebc1071c81d8b1c7e5a4414358ea72c37e4a14d8fca2611f1fe3195dc2356c0d879a28ff47644eaf77d155aa2c74872295ad193255278d4812207abd4618daf7306f2d7ec7fc2fa297ff95fc227232c358479ca926b33a40b0aa86e57123668d1cc7025ee99d0e8e955d307fc39333c6b7605a9ae78209973716bcf801fd83afe054468878fe1174c89b579d1c06a953ee2af2e4ab431ad5780990d9bbfe06130c30a8e98b1167d49e72708d32f34dfd02272cd2be0a295d55fd9316f103585e7be385e4f798f00283ef5575c014c31a179e90ed902594031764870f8e83088c8ff4165f04174fe4731f232aa3fddfce058422d4cbc873b0a25ada91acfa0504c71a196d8c8d54f32cc73cfe97133e9922ca2726d731d6097be8ca4d04a3893a108feebdd01d2861236bcdae68845fb7b3a84b8610327ad1855f38731f12d5af14da5d78982eeac5ccbea11b18df9a7c326a013a22e0f02a34e046efec2103623c26e2dbc51c2839f3bac1827a28ba75a7b8c828a288fcab14fadb36de3198a55c106acf385c7a32e1d60ad7fd6d2b61ae9e933976dea24a62c3a92af9560cbd677f22e5950197642f23f62b939a018d1b13805085c46d26ed9ac5bc0cd577928ff47afd7d47b26f4ff81fb2b2aaebf62be43b611a9f57eacb72899a329e8177a5b534ef3a666c7c50280717276ece6b7ef132aae74eb991863dfece0cb71921676814cb72a0dfee76275feeeea58de14c5c884544585cf624c39c5c6558e5de958793d31d79595357bfef76e39f397c445028243a2f2ab19330f513bdc91f7c2a702dbe280c99baa3889627ba79cba5d3658639dbfe401b36919e2f4819bde9b38843db067226ffe33b657a943bab51bdcc23ee016badbd022e29117931f5746d008ba6229691c4ccc31840c9648ae29ba088cd90024cdde78551d80566caac9d9133d38c45db3cea06d9146b9e6d2c453d6d03acfff41899d68870ca31493b01fda6dba4e2e492797d47494dd8845304799fce00d3747046a55f53fb3448c62e38873ad31d970132df5ea064e7d919c4d2449bd76b17edf731a789171be1803593e07240dbd2359436c52a4148c32b54f9d3a05b1b742dea153027fa023350d8f38c5e9277fbe6376a35a1685a9719b323b96149656b4a1a7ae4c205c1706b34b448b270ab2a56b8582cfa8071b0e44e27bcc97c067dd35da4b1751a5b74d935d26a147915acc0b94baff07d4d7f1d7c6b929496b56ae2096c21068df0181fa2f92d972527447a22421c6a8e2085a1c2021a127127a7740f312a113f3e421c19fe641f3cc47abb42610a914b76762a4168fca0c6862447f1388667512dcc0ed33126d3305f7521e0dd36e32e962eae4c5cc0c2f22ca4e8607baf441b2ebf83b3f7fbadcfd7542f1e9ea1b502efb08020d4e0cc3d0e69a2b60632bfe4a7c6abc12c5158e3c438d008202399179108a80512300bfbd81442aec91b38eb8bd6b4e8ae7b274a8c28c33fcb3eafb3f8cd68ff726c1ca565f66a53ab40cbe9eb8b582d291f21923c573eea1c84148f2078247898823a8317a47d6b9115115f16391e5e1b4ebe8babeb9e57b370b696285bd72d623a0e41acfd73525e4aafc95c4fb5de24d99edc1e34207f177de4b5719d2f1374c7381185cbd3094fc229b2b5795b3c321cbc9b6721311175a2c85c291d89064448dad65be4a92969ae2085904ff16ba604a1a1e690bf09277b250bd7f03399080d2ee807b919d87f41650684f06ff8d2ab27239cf7aabadf508ce80b3142e53cbd21a9d03b36a74dd7fbba0eae5ebafc7b9bd3b2a5ea15c48b343d92a157254ebc2b70b750266f338626f3e3afab528c4d81656ce5c4b313e2d04bf6ff5d10379c236c23e775702b6a9b05361057eb58d1d2b924f7e2e31b3198b25a90655f6b3e2669e699c1d98905e18b692aa713e3c5645378967e7bf3c2e4da3c42b31360cdc8061f05cc402ce188cb37f809b44e7e68c64b81a0597d2968aae826a84a219daddf153c20687851ceed8821b4d6444205b241dca75b16da6013726f1737e1d2accd8c2d5b1c71cb1e1a03581d563a237be1aefc3f4c15c230e972986272e21a682343dd01f5807b7207ec1273acb6e513c83dc0eacb338788e4b735178ffebcffd3bb579d6d428e19ed91bf681dce4fbf0e9f395b5c692ea0cbbf64bea54334f62fc602d2fb43400febb176086aa6df3d1a7c0a163b165c1500c63318948e36932e75464256c713fabbb4bbd0dab01e8c699a1ec4d9d173c668367a6c17c49aa9a4944e784184167b2371941def8e371af2410b7489ae53e7ee34c0079abbbe6070706b0b0d1104c8178658c3910132b1c7c122e17ce748cf5cc525fa79595c1012d4c550b86178d257e17b0e2647f35c3cc40719e845bab92846f2a95312dc5139223b6739429ecb1c34fb675d0225aadc5e72a6e64e10cc4094a85f15f3066df8277260c3a3bfdc1e4cce3e0bd149ed996f93007b33c3e416af4a03bd84b79f05e891f3124ad71951461df327d7d5cff862c917bed9201c2bb05c792ea870cd9cb64a25a3fbd15af4b68e62f42eaa16684240fabd47b6cc3f236d8ba517c0c7c2a028aeb5d1ca3bf4df9ddc10eab951a7cc6f3f192ae3eb9e322012104f521d712c48b19c40b318f42d4afb1a06ba5aaf270b5871499be3c815cc750a4555c010c2973487635b09cc8a0c8888906a11c756a4387dc7de78ed41b8e9681040b555ea250a9cb8a52bf09072344f540dc6e86737a8987b9c88552421b58590504283b48f300ad341060f49489447a7e93a42ff97546ae20768eb9ecec9c6bdb5d891914b6df854347b3d7a1ba6bd9c581ec03a7e7c9690d423104400a1bb73c0b735b894a4dc90aa1dcae71ec22411393a4b4470b6cb2fee58802f10837f3de661b1d0fa10d266797a9ec5afd4664e10f7fad172f5c29969f423bb85affc6f8c62280c9c34c8fc2c7c95f77e44e7109b92123585b06f9f59345c90ea879e47be4018a725c88204217359255b9b905997944950eae8bc7108467c63a353b7394eca8e3de6a6e994687eb71816589a216cea0979e0e7635e82d2f6a500b9aec8b4d83294a05dd5570661ddbf6357ab6225a921d438ae0f19c58d37f9e357a8022fc4813faec9c2c48d939ff9c357ff68a22e9fa67ec5a07c1440a963dca6cfe11e1666016d5401297816ea759c9d30923732764c1c8710fd02a6cc5297c88cec656e8f221d2ef3f50e45725b944ccee0274771ff86e50b4df7d8abd9b0f73d0b0a1c39a0797a2afb9415837815fde56222f6a791a8c27e787c64ca8473309a710cac6186d68970d662a2bff2681b2fef425258353b122306fae571294cd9f089cab99cab44fb1e0609fd710170fbea019f522dff9ec23d323de5ffd8bd89dceb3fb5a41dd5cb80751daea4d9b171d3251fe84902090836c96593335afb9a3786dda6d37aab2b254072368e3718d50af144de0122c1f2effe93cac289a45194aecc2733ec818007e9476c0c51b41edae4d0ce970ef1ef7128f62e38d62f958b07b08c99c9ad0ac8a8f744c97a72af91a62a899a4fdb89d134afecfe1fd60488947d5cd2450b25ad414762120059e7f2ea3921f318eed03bffe6388c969c1e4c245ec490053ac7e55da1422765c08945722be38c67724861f5c7fa4f7fa7cb1a1eeb8cce0cd8cc7488d9864eef3894c28a312a8f7b2d2fb121b27fb1cf91b1d7595afbcf6a0b2d6dbbe71f566ced1f8d602c20a8fe249b7472fd15367e339b2867da390c5294ac945ea01878028cd764ec2a2715cb619166dd993b8100404880d0544360bae934a84fe63c36a1a0dc6d4f037dee0ed421cb4140ebe1953b9739ce5206b584f718872ed65ecbf9d43ac850b86768e919ab45d94ca2dc1ee9222ff0b6a97886854c921da3eebb52f8731aa11d0edc534da44d47148a0b106de67b900b80a79471acc11b0c84174b0a933ac57c806b679cde6bef69de048f37107bbc081b46c40c44a09f29b16ac680d9a0b8f9591ebf38a5ce7fca09ac05d2a29e2535a2901dc2fc7165be31410140e1a70126ef345aeda9633b2978fb4ca3191a24094ce8d30a831357249a1274b43a1010b418c6eecfa5576ccd876c13e66b616f70f2d55f9bae00db86a2031541aa85a74da869d52599f742625d7ca804e38766a6be430564061968509dd9a0fb8a5079e36dc6336dd1c32caaa26ac265b3f56e592085087077615529962e3455538d30e5a3e300cdc75da24b37d44c1e211e20d69f080fa8173f4d255684dbae1fa45d84c6e3cc6a103c39e1bedea8508e8bb830f1c8148192e8704cf0774d789437733927a2155dc7770bba934e2bf183955fd5e17b3fceb879a85dc9aec42db445b7a1a17d38d3872e96e02a6508825684b899ba94f927bc9113797725e0397d9d18c274d7f92d2fa9d6dab5344f7114fc1d902605f27d4b16874523c824624100f3a4c1b3980251a36486aaf7275befa22201673ce5daecb7c45d92b2984247b70500cbe228fafbea2775e1f7a3551626974e109a227f5464ad590e7beadc1c1d4ecb8dbc45b8304f31d8f141817d4589a13c45c796a18ca7d38781745ed20d6983e337342dfd4b72334b1a979d03ba760323aff94dd2ffda83dbaef828e01bdc8b9fca951347b968d7a2af9c50981fd4e5628b0c96ca2a72f764c60b792929c3305521226271c5a3494048f0507fa81f9b8d1043ef43bd2c061bd2897c36ed5befb56e28a2d133de0c52d4a868b3749a6a1370507dede040809ba30ce5222cc8f50c48eced8a8e88e3243b3f13b29e2b150ab5fd706a24a7f6dcb9ac3d06c5403ad281d75981089486275476b970061cfa4ebfb8f87004af26724f8d45472e0bea73784cbab0755ab26f70282f6769b809710fdbe8431c1dd2431ada78916c7ba11599e2f64dc58140c36c3870c52780a08208306efbe6c2442dcbb9fd2a62b8ded6d55077f0fb678b2920d6310ca89fd7ff38107ddea4fec4d9ed8c19aeb11c05db57c0e749b4099ced823c3af9304ab6a7fa70b3089e58fb031f70d759ac046728a0cbd7d1c48ecdfac1b3e3528be8ba3a5bacf332d9d4d35ffa5e4a1f5cbbd03550f5d4893329308df529608c434a567672719745d5566e1dff642d87dfb4b1e81ae7db96c95d53f42be941a2ecedf977b432473e8f9ab83f8ff0377329677ba17dba7598ad10dad0b2248fb3a0a6a041f64a0776f953a5d5029b7f7708788d746d0acdd70dac39a5d65072e97e800fb5abecd01c31a3a5de29b23d6613457888aadc71eaca5222b78fb082c58ce2998c4774a9c4442340e7871c8939f2ddbc6e30b92152e39dd4d1128e9850e9fcfb8bb2044d8de8be2613dc70e932d314eeb6ca0139121cb6e6dec483112abfc16bb83c17cbbc9366a1ed687c686416bfea907ff92935939844d594088c4c80165675cd2bf586eaccf2c72c6c8855bca9a10ad30192f14451bfec7cb7d8403da2ee1da832c3663e4144ffb73038811af0b8452e331e0d4ab115f6bc79381a954a263fa7c3b4c0eb88ad07edce03c1ee02296f051377e8ed61c2491ea36138fcdb38d465fe217f9429f4fbcab323947e708b7e92f33d0af8b5319427d4021413a3ce79a5262c6667761edc37dc740cfee67d4d87d6ce6924aabacb64663fded4762eb53b66f005ca3adb5015bad2212a7ee00c4e1e49e4336c1cf407e386c10f50d596aa54b45a95e535c8e4d0fd6b4486a213cf23e1c18d7c69f77157d8affdae88c2c627789c1615abd8cbdd91018aa0a7cff97652a0d66a61ca415ff7eb0f89e1a2034ee974f313c4a3efbef45afd267474c9f144362401fbe42d713158ec3f7ca80f36298350c8793769ee435dd89229689006424984c4583c93275c7590ef3445330a62c11b72b2943e5b14e160714e58554c45ad2b010abf0e70f59775697645434afb6c8e6d9903bc704d75b7493aa79bc3ac7f6917c92102b9e144cddb7000d59c7c6b089b5905a2738a41dc6f6bc1d8aecf9fd0fe0e7809da04a372f789405a574e6bd16cdfed2e7f5c34c90a7a1e79960e2281a90263bfb1466cacf54c44123691a0eb73c44a5643383e64a0d556adaa71348fe476433fc536166b89d87471baa2a6aa7802c557c8421cb99a8dda7dc7303a0a84d4d6a29f4489cfe70f42c37112a51bdfc4f6f47844a7c0edbea8f86a5db5dda9b94ab3477e12f9b143c50daf8f2d5aa943f38dbaa251164e4ada96c25f08ec58e0f715e83a70cc84d6e398ae4b369ba30730272cac99abc530a6177f6c723b11c696810a1c426f08bf22f95908787d027c16e4db820a1a86f90d72d7ec2e0900f51fd595eb4a35621e68f2c0df87303c55bfbe8a5a6afb4774c703c1534522e12de8e14c9ea13db874bf4aeb027c4da4603e18f5d08a2615e0e7b51019650a4ce50bd38b4251642fdc1180de27409e5296ec9ede1bf2af1227902f6f0cc90a832c1a3a81d2e8bfa01c646bdd7666235f2329af4fbb815ce45f08d8ae01e92b7edc1fd8678e39a1698353b375c3b1bf16db9c9f14a1fff5c8c2dc48bbfc79589000e12cc6445aea4e8f009f2ff7a4c39a5e34c6699fc17811444432de19ee1087b92f9c6137707ff5076a3e922f2c6d8858eb27838b9e84264418670d2d908e5f7b87dc609c9c9fa84d4446a00f791168bb96ce69bdfcb8b2d5a104af57a4ba4c243de1befbb3f43e544199fd045677217201165c14dd4ea3ab942d18485c2d1633478dd4e21804f481b8585382dc034069094b2e1652d728391653f27cb244f18a639adec243b88d9f5494e36747bdd0c21982e44bb964ab1ec09f290f6e0e343328e793a3d0800e6fc91f022a31ec179a9a1f0112ff3e720815f6e9eccf815226e487454d66ee307cf49b160be0f51637c82cdf2e4410b33dfa3ced560fc97061ad0413c48e016016e98d41414e0ef5542bc89f9ad7b1b57089c9cf576fc453a0cfea21e3fadbf4e415842ecc7b378767213bd7ce20141c11c41180bdc4c82e75866b08e0dea3e52caa09faee9cbfcfbcb1ee5703521c5f77b9f354b4cd6b8214df19fb9374bb7e282c39857a8aaf24ceac15ff1f9c2db912bb1e9cbc232d68834d34c38e3f9c28e5215e75eab54dbbf7c6215a27137872cd475c140a81b26dd5f478b9d93d569b7e6c6b948668207c7f72954526899aa674ca13ce3cace8d7ee870a7f85f96d40a848cdfbc0e18d6dc9799bc6943d76eb6445a49d9ec8d8e672eb7f6baebc23e2aba1e2046eadd0d02fd84203c4e1498fe499898a8674e32d5132005882b0682f4d3c4bd8dea30882864c35916f70bea98ac3e86c7982c5fa62509ca20d7f7f26d5f881053ec6698cecf790112f1e327c74d6c784f463a444289706f115f61cb33e2ee2d3c1e4f12d8aa98f460f4a763190e6c2bae731762e27761526a6f5bfc129e1cfee7084d3319994952c54ead9c8875d985eb32f49993a8a970372aa8407db350909b05c1b1e6cc94394c1ad3769687c8c082ddd08914207829f62ecd9ffde3e36fe33b1b96b50c15b5d809c854d02f9456c390a59c4ae32ed6e0fecd252eec9e58dbbd571d213ff848ae5b7a48d97e895286018129a6e59390ba4c4fa0651e41a2b48c1698f723f61449b1fb22268bae8fec9e0dbb602d53a0b632886e262b0ae8c5e35cbed87d0e373d6bc15851498856af54f258be40844bd53809b541e7c40945300d0a6897cc916949ef4b2213c8f2a73d23a8cf48c2476867aaaa2ea60dcbf88cc52fbfeeb359c5db9b35530ed9376cdd73d1ed285cba02a4dd14ec4d356c19b8e58fa0f020e2d2a1020bacfb86b3fff36432a68efe593d34aec302aa87fcdf1752f35e6964648224eaac74d357d58d57139f80eae2c09c2c4a01d4175afb2c53c40fe08a1c23a63fb381ac0249fa202e65c3bbbe2427d002c5b5b99fae242e2570cdbe671fe3339da8a7979651ee7603a24e7a2142677c2a488d284e201a931b90cd60695e43dc5256608b071aeba6c322fb19431dba07fae4209b072963e99d29b8467a412ad52474ce2011787291086a4c055673b6639def33298070bc9e188ddbd5921194757821d37302d90554fdc371306e668cc333ea470f336e3af4d707ee8ca4751d645320df60fc812456113f6a08d6b12332bd25bb4237fcba8db4ab37dfb84b2ce670f905d4c78008a262a494eebe7c0bd8b8f5cd2c7862053c9377385295311abd639b2d74e4748ccf5bed8b0a94ba4673866e23f9835d6c2d8d6611b85382702bcbb4182da6b5fa44b5fe20cdc92d50d86e27347454732198a142f0853ce1b6c6fd659bf2597c652db8309456984987234c49114d188cddc100259f6e99e131448b1a919a64785a23e05888373cf9dbf3de62da473342ba03e38071610d4e5aa8d5e2123096eb07827e5788f5324ef327984e5f1244a0f230f8c1a5fa5568e59c1c4bd800a72e485ab3fc9b5b71c546d84e3fb7dc2392f6d33faba2836eed2f97b9797151cce1024f3486d96ace3928dbf954a59a57ed4afbafbf7dd6953a5064d8d116a4b793b08244948b92a07f6252a6f0a757309d6248b8c50a72a956dd0383463b61d0ee89b80afc11cb336a3d2a8b58189e9eddaeb759cded0c6aa6d84f23e26691ab344a4597699a5380ae4cac33532267117dfad12799e2fe9b3cbeeeec3f3f4386b1164d9f8c14eebfabd77b28d254c7c63eb6f29518620aa6df2022b40a302bfe003da23175430b6645d135195a1f302430bf900695e0ee83781c991268a4ac9b0cbc05075c74288234d9e4d835c467c52335adbf1d9c26172e50d7b2e17f33f4b2bac14e9c062ba27432644d4c62a4a1a2ba2ce1489f0b8de8f4476a8d2c57eb0028bd90b7b1212b0d19625fb7a56616c3bfc8a9e090a15d0a9bf14cce5c1d12b3065f4580e67b997f76110e6a46e3f8b305b4d3a185a2249175a160dbed76e7de7ba98ecb7c187fcb1c4b8a8b55bb47c97cfd69e42473d820d37b6a1ae4c52c42b71251afe9e981f8f6f8c6e5b7e0f7a4b60e6bcd0c2bc09f55686e66d05d0ad3a240613e2e817c866bc214e998b2b361cf4c23a2acd92f44883cf1ff6a2b4472c4b0e71a0e2fe552a860962b6fca9d9e5316d416f6e487b2d6001570129a7ebd7e71c154c7fc4ea8978d50fe1afb60e9ffee25170f37f3e77d831e7e288bfe88e144cb9621e52eb28a80e5d5584e2e11b771a5ef841f2253f867625f2407237ba939be39874b1647d97aef74e1a7befd5a6cb82521a0f0cd00d11d12a2ede1e7096ebb10d1fb20fe6812e98bed3283de911c83da4f139d79fa54019848edbf78390dfa4c541ba5f36233fb7aad2e24ca3a6447c3d8f7f84fe85c0e39463b38fc96f016fdafe6c2bacd01c92c06084511e96904990dab092e66841a4baabbea453000f2a9da98b35d370278eec9ab1eace640f40c68b7b5a9efd46912409b01f55273c52ba46c0a2be24b45264b3ec54dd5193f87eca2146a2ee5431297f61661726db16262f99db89028716ea642bb9521ebee086cd2c9ab47328fbf8aa3a85ddc8a74322295fd8db81d8b5ed9c4e0b2291206b804e90e1466e9c107f109db91658d9e5e1a9f5a82ceb563e5936a52127167df98b2722cf9194e05ae9be3ce6601026a4367c4dea1cc6ec8938200cf4e8eaaff65e44149d5356866b72c93a4a3f4b203bd2695ab2c12c103a791a773b54ab3ed52f27af5c7abae03396369c6ac517353c9bca94bded091d3a37cd3688ed4e01c0650d382efc74f8297db6a2e897d43b909c8f22133b954daf036cedc2d03a0bf9d69d5258756792035dc7cba2bbf0e861f9758980c9e7d8ed829a55d52c0cef59b907de99b869f56c190e772f90ad7f40793c9a321a6fb59fc9fc1cf3eadef7f56eb53d874c6715a74b8b13c1be333cf810699570f8a9d7faf735dc4ab80d06850b6706d4fe25aae6fecd45426b1848df7ffdf311e380a846dcb701caeba460f43afeb7104b1e2473043ecf4d4a7623785256ebd4ab2a11ecae93bb507b566ad9a7c865988df3a2711b8ea68e51fd9c6c4ed298a89994d814bbf02f4d30a523b99bfe44080188a0d98354197394e563458aadba190e1fecf46f649e564d8bb0e4dafcca059e8a93fa61a6775337624dc17d4bef79ddf1f5b6cceac4c48e4946f00afba88dc2e959cecf3a5d01a0d31894a2c8ddbc3bf80992d7ade9a7369cfbbf1074197e4cb83d41b435f3d628d1c543d1b115828365922b141b89a401d8e46936ce0cb4d81108fc2c32803134324afdf59cb9073d4a5a0d179180c95e0ae563c2570717aafad3b0d60b763fc614258c60dfdcb195f171e0e8abfc8d71af0e26952c92abc6fb8327aa75a506ab3e3a93f285a51bf817a0a3dee951a389a0268510e8d0df7662571d6aa5d5bc905485fda337f25c151c5ba3953517d9093d6682f981eb3e9fd096bff4378af9492a6ee29c8fced3484979d769bbb9e9370ce897519efe9e8c54f0a7b4077b80ee2bf349b7edee1cb51d97bc3d4282349348c847c1f805c6dea15c94254ec8cb2ed695244235e94dff13d71bfea1a6bfe5559d7b5d44f494a9dc83eb73d757a264a6aaa9c4602e275c11396ffa16500f88ba3ccd93bd50e3d59e10c72ed320720c6d878b37165bb6aabed37b69caeefc2ed34beceaeaff276365e6e972ae86a61e3c876cd16db6d744ed75ebbbdc6e8d99595dbb7f16c757d6ba072acb52a65b6d5d563ea1787d9c9d7904770a887d835edad4f910611656009b411d85333da4ca802356d19672c0299c42c5555f28d259753a573d53470aa0728ceab04c74a9b713711c74c32b3d681ca71627a5ecddaa59a8718d8e176757b8da8aeab546d3b8dea9741abbebd8d24dfae2928039dc4ec555bf21a253b2b2fa5b5b655f24b09889158a372a619087cf886659e12e428573ae1a4a4ce66204cf62bf7876751d1e419b356dae72edc9cae8649e1d60fc69c1409893aea9b48ec5745623018acb629520eae8aacbc0b4712623bb34041d76ff34383333e60828ff9b3e6b97baa672274133fcd44e4f706156c6711282d22b88236c2aa27b9d78848e2897e996fc94f4714d212414d7c98b4e4867925fac6271f5ad98f96237a7d24b2c912e13cb5b88e385ad18a5eb35b27ca43789592c2996934ee72c414f53a175ca161c4a24f0ac650d9b376c757fa43ebda69b6a914104169f2ee561c8c10a40c559fa6e1a18963d6e64be0990a3f154180a699d26d0701830841419042f1e02736c1e9ef11e5af3fe08b0e2008f99c8a37ba38daeae56297ba21a58f85c485fe927bb8407651f156e27e871350ecdd1111f7b8c15a53622a96b80de613ca81fc395d5c0947b708d913ca6251e8dba14b3815e8df03d754bd690b108c88da7c438e863a297b94f8bc99339c70c520169980b3f159004d6d01da0db06f0750d035cca29d1a06487fccb634a51a5aa22ff2013ff3f962fbc5c332ed27da6f16b16f33df37dc0b9be566796d81d0569c3670bc6e880255959cc62325c8d9f7dd6ef64fa277cb9c8161c053c4ce3d149ecefb2418fe1406e7d4de1c96bffe50b31b6ba36e1a71eacc33d5e10795c4fe21c2a2c2b52a7ce05bea615ee69c125be3544d94ffd7235a6a7c8ea3cce5d5caa93f97be5f8b812a5f2cd28729383158d266248624c24108167fb60b5a2410936b25842031fa6224fc8f5eed1e936bf25dce59bd984b3490c9706d6236620d2f2d65e8737b8867d9c45c5ba5a614afd61105db8164d06e35d26a3c6d09edc12fc59b36d57b4f93b6e91e1cfa85fd8ee9a38fd3ecdcd0ebfff1c78033e250212ece2cc8860c3888be1e8e272ebaa6fa5e6096f390627eef8e06cb0b3829cf6df4ce4b7a7e4492735a0e7ff87d13a40757ed645aba85d3b107bf2294fb7d7a2d67fd35cfffd566f5238447f4e9c695563829003e103cd57f2586e34b3101850b70ded20f34be3cd0a7d3f2e9abcfd544a526ab0d6ba008a01626985742d524202c9456701329ce72f8c1d5a1805ea9168ea6ae28eb428c3ac85200590ca3c8eaefd0e7099bf312f2980ddca67f9a3ecf492bf2c79c22631e111341370bf085f7159a38587a3df88c3b53d20283bafcdbfcf45b1cc9117b815383af7c95582c5b0ad9cbf69b424e6993d139f865afa2feb52a212a4242074fdd6de66d1199d00d7faf587cb04d8f47df1884332684e772313a8d66ee95b07923868f2286ab6ec29d9e7cc7961e436c442a78613c70012d71f97e1e571dce880b052ac58f9a3411f1ddc98eba2c15b1d6c9614d117e764c12c15a1d43600960c0126e497e3f50bcf857d859e2f4ef384f10488b3ea920df2fbd76be4daa255faf1f0b794e505f1017b049ec81869d1c1cb0aac2610729abc9b568bb9b9473059143c9e6bbd6801e0277c0b89b0dc3a0064b816c64a0ed73fd8a44a66c065baf1e976524f8b2751fc15d287ac3dc79bcec9bb01f6f234aebd52b91a6c7bd63082e79c9e2ba6b7afea38dcc5203da405f916fc0495e526b7a81c8e2fe50b504db50113701bac2023716e76f3c79dcc24933b7702e6aa9286b67ac2c678da19a8aa680befa57cce26d406fd6cea6bde77bafcd6528ae000c3f26f8116c23ad2995e6505bd601683317e13720c14be989bcd03e101ccf0e843909f500bf5b8ea6db5adef0f1e8c1093c056b6898c470d00d056fe794a5b95beaa4f3fdd8ee3a50d0e046bd00c286099b41680185364e014f0ae15ca7e2f55633e1821ed88c5a182d3b57298568b847da56fed2ba2a0e71f21a5782d6d80d5b8807c2a2713249002df5164c378c6f5680f8a7bda68c5ac3ff80483eb3a89cc046abee251d4a6db545816d50ac4b72dbf6fd3e2e3a89d198d1ee3fadddb979503b40b714407034fcd88a9092b1197946d05723fc74f8699dcb17f9b1a9f09f3c129bf7e254dd7aede69a2360e724cc39001236ff16de998c8ce19b63945123dee68a12bef84a660eb773de60ef1383eb3f471ec4b3ff68998523fc67dff8a639a63a7ddc4b011bf3c090f86c580e4ecce1c8dbd6822434c41741b0405f8b661d40448a4b3b795742883b157e4ea1b2af3a5ef851d9d707d6b025748fe3231ae75c2252410e2bcc320f4ea40e8e9e8844e02ee3492e9645fb4804379722905b341241c8b4854f571c8d8543c9cd90bcd3d0024fd8c512dd055d6288ba0b3c594c2b9bfb09951d296f31e8a9fce2057605920d4416291b6bafa0b5aee30393420e2055eaa44caeef58abad66b296fcb538c09e48e415b5a7d3640e4a3e968fba7ab9b5bfce72234c2668b656e6d222a6ef823b513a9a512c387b3ad4a9060e03c2d87e44da682682a2186934dd4c081cdf12ab7a4653e120915108790028046482a93adb3478eefda81c33087cd159346c22bc3d262dce8b8564c0a3a02742153f062dc247dfcfa0227a51b8faa5283479d677015a52b0e7d37b46c83ee5c64e303dd291a9b0bc1d2f7a1ae4f4526853a43e9dde7ca443725b0e39ea21f28c3a2ef682c2f7945334afdc7c3407d95a9c6210fc8a1b4cdb7ed7668804cee4abd2cf799aced619581b653cb2fe80c735ce6cb784410513a04788d65e26f035f737661025d470395d3a7053dba87591984cbcf78317401776291d994968e5073ff6c89515e9d0df6985336c5d8d04f4c82e3c8c3bf9cf1f12b3d54f0c0c89f8ebd9e71ea2a1c9cd93440efcace76e6613a5af2c244fa9b21dcec55c3a9f9514d74f80238429d9728772e2eecb856b4403371b2645dfd6de9004fd17cba724484738bb3f8aa9ff2f8d9b34fe134942f9439903254090fb8d15b0aa7e094cbb5a6b89e0324e52321f28ef079e20cd2a91519ff0171b3da36cddc642db4d51de3cc45e811d4183372847209ea30f666f9cc263c446357252fd99838585cd3f12f1edff94e83f3f3b00c90adf7d9338c60911db51d142c5d3441c1b739e3a5005ca612a973d90727a35cc657f08068868a046511b224f281f73296a2529452fd34172bc90abe620f50d0b74c4a60cc691841227b6ed2e9167a8bf9d72675f938da5a9739be8349a927441f9f7e2eea2c53ac635129a0fbf071e08ee0e413dd4221efbbcbd0554b7ce17c74d08dac4291dc791617ad77fe267ede3788e6459eabafc2baec024cf78c1b8cec0e41762a5951695ae9e77c69ebc595e1b60e461644c6a6259e188a9b7911277982c018b7168d0a765a8df5cb6fc814d3d45755cfd540c41d6e60f180358e41288f6c0decff364b977c5990f7fbc2540a87fd35a718df8b868492c2fd55dd329017f998e044e27f4edb41cbb47e4f2f2f7551324bffd7c28db57a7f6cd7bfab190556e20bf21b078643d1c44aa661f372e8024b21732ceba24d273819017730e68fee3b4c2249d0003be46803b6b264275b32dbc0e6431452d0ce374e398f1ce7370c5da080411d69dbcdbe45476573612884698bbb27db7998fc55a26aaabb715b3972a518aeb75e484f0d90319442788e73295aa44fcf2f954b4800bb9c6058eb8000f1fd7c2ec03ef1430d81927655d80d16d8b3e7474d7b11e4438c78cc16a68ec708afc1f219d412ab154afead89312b7debe9ad50c8515cb67673eb30613edd3951a83a3c28ec50226ea7941059e0f1280e70e45451360628b08da608075020b24b0d791bd388c6bfdfe19796a2c887302ff9ad3b68e03112cd790b5aca750ae5b24e8f85abf546ca3f8064490a05dc49c78f74686b6975d0199c25c1f0c6cc1289bebb851fde86775e64c2e45a4cc60617097990e7680672ea4dd5ec92ba05f9f62a33a8068ac3903f642fd400f5966f9a27924fd5954facaeddc379789096aee86f44eaa54df11f28a4ac4188f90691497d02a89f6331d340d57dc3a32120124cb4275e3c0d1bbacc7e3cf30cb714e81a4e7b2cf9844a5a01195e6cb6ab35057f5cb6409fd7b0c1608e805080740bfd6ebd3dca712a1403e1873c53a2aac885b198daddec1646453839de784bbadda79b25b75205490697bb64e61c7b12173d6512013c2da100813da32a676dfa881cbef46bff749644d0109768a47f43cf5b6c684d71195326eeeedc35b92c8dcc22498c2442061e745d9ae071eb1f1846892260846689d94459f1136f2a37c09363d933e679a9c3332fe2ba51d704c3d55e2ed7d5e4a590ffc929e9357e3a3fd28dbde855009d06637f0d0cc81bbd4bc80da9d7c026c5862874a815e1c5c3394bce12331d72574c103dabaf28e5a2050c29a0eb79634e1cd25cd1d1d75869fa9f0e31a646f5c1e2f67e1472af8653274276a9b2fe5d669f553b91342db870e4c197103a1ab23988644ed4c9f539eac7a6ad2e9179c996776ed97125fc61074dbddb6dc5bca94640a5a080a091309b51a90c1620b59738b7489d2152fdb96d4ae6dc9d365db12a68b73d94604c6edafe1d86b0ad1105c7230e28933b2ae25b7c63a16b9b2eb6c445b5ccefdbb16d0952d227eb9505a2175f0ed7a5dbb0e9f03cc587eee28a5ddc42399d0888866702227cac99139dddd9d73fbb8c6073b0ae92937c78ee368f106563e57e629b536ab5135aa3fd426b5567fa846d56868682889509221da91378da35118281d1282a16947fdd44f59b453377516fdd44f3657ec085ea091487b8df31a15e12582d7bc96e4c5a44da2a964d22651d2249a4a29ae4eda54d27534688d59336dcc690347bfa72a0850dab481f274ac558b7ef3dc2208daa85113ca075bf62b1a27d1fd5293d6b04ff2a0117ddf54ba3362b0aa49346df8beef390f0499c1702442a70d92c7283be0a0fbc26983d4c19c628fd54ddd346d98b469438dae387c8ca3862668ccdcd7e52532562e9927f72f2f3d0d5daeb6cb67841cf7f629f5bebd07e79c5f555e7d4e75c2776728ad504160fef7df6cb15af4a3956ddd3caf68f45c2a5f25cd8cf2e9569857c9836f7fad2f9f1ad64f74bf5685c1a6c21148ac20ecced1deeab19aaff5b99ad6776b283bf91cb542ea90bfd354c543fb3fcacbdddd1b87c9ab8b8f7f36f8f5ed988853be7475694bce861869b1c86a06cbbfd312caa17c3c018be3ce1708b6bc1c823835cb8fe3b5c5a1bebf4a99945077ec994c16c6f257c6f14cc074f287d3a19ef48c867cd54a062b9f65cf644ba09645fa76e8413b2d5b02c99bbff4bfc12f6ff206847b77bf0c01eba6d0402ee510c7fdeb72af162573e2831cb53f1887fb9f16b9afb1821dc1cbbd0c7a192485e45007180c0a1c601e3ea40eeeb907c23bbae7deb274749c7b1f2f1b525c4e4aaecf4ddcd4d5aea3a0a45131aa3b4174eb77de3bd495fda4c1b428bf9b5cd75bd73db87edd9f466b464bd5aa21c3caaf59692224d6131bfeb0584ef3c2760a5b4c8b7e5d806ad77521aac5ea5c34ad4ca20664b1e3744ac17b22f2d61f27981953bdecbaa72be54f26300d4bbdfc2966368de11d1ff8dff7a9d60886a39c4af5bdbeb352f5e66d2e39949f994a5097c8cf744c35896651bb46a74da5a586d5f0d6308f772ca90fc2b33c70ef5df58ea40a53786ab1c605d69fef389dae748a5577b9922257e2440df3dead20d9fa75a095165598b2a8adb4282711e3c814ba2722a1640af5251ade315fbedfe053ad11d0f8da1ab930154ea71667f8d7d37f3ab528bdfb9d7e0aa79916e5d78861c7553f719a60aefce9d4301bffd1953c35ccc69d689ab132932691c77a0b76c907a33619d691b0fc852b2791f4deadb83711d3b026958ac753bf74a554ea5a528b4c7a92efd51aeb1e8c20dcb19faefc06f3c9288f39ad5df26bb5362aca6914a0599b12ccdbfd0868dc2efc13ea776109a48d04ae17a6e0dffd6cd97c3f1291b7d6f7f7291d6359ab6b799f924cba5236acbee51d7c6badb53ee7546eb102e1187375e71daa13dcbf56fed473785326f8c836c8b9ce65d4164cc02ef95db8a24e534f553c435a5cb528532dff799d0b2511e348cffd9ddf0bddfbeebdef9edf632fecbc6519078586d908e96e09fc0209429b670d8e16c1ff6c522f898e1ac6452d1ac13be49646025b3e5a3e2d8ecd4346491d4432f5b55acb62492fa479adac2ba3240f492475c8976038b6f466bce785468064aad4efb4aa8544f54680642a22f672bd974e5cef3f222f1c818eee28846f1705aae7eb3eaa50f55eab0bc77abd14cc3a557f6d8d7f9100cd926a34a1a0158ecc642c009231d71ae5962b570d633a5b3f1ac660bc30fd68912714d804a049f9d2fff3969cfd3746406259f498c76a2883befad59ab2d663fdf360c1d2e7bcd6c9bab325e3f47f13e81e7541e37327727777777777777777f7affa684ff540a1639266a6fb1b9b1b1e3c0b001d70b07af9391a66a346cd5b1ab0192fe5f798e0d330faf27dfc742c7cf9401aa692ae3a41f604e03ff80084247c60428b2a7cf0de479226699dea5df55e5f82f0aa96f7b31580fab5b89fd1fa9e466bc6db168daf69d9afd1aa791bad1abf6ad9e8a0c5c103a0d5c1b35a00780f5aac0ffa76df8efce87e14bc6981f036ad9bbfd1b2790f5a371e6cc91bb682a004e0597859f837464062e54ba48ef5cd5d1d6bc96ab1f23f4a34ad1fe50d6e67a65ddd5bcb62990147f182e1286fa0783f68f15585fffd08865cf0a9ea04950454efaa577df00108ad3e138526002dd7a28402bbfabbcacd686effd84fb753415ef083d6072dbe0dd5ea3336adbed1bd072d9fb53ca8e5422d76df41cb873868f9aae54a5a4ed4f2a2f65a93168dfc09929516935aec3e6cb996762d41a0cdbc1c5292800aa4c50e6bf5bc5a3dabc5caeef6267882d79d7aef531e4fd39aa8bbd66d74bb36c33ba0cc48242e988724827574c13b64bd35943567ec98f372af9db35edfa75e1e49a486253578d4b79a283be65c33b7fb6fd680f2481ef10e300d238263d6d952b99dbc72bb974cdcae7ed7effaccb16ee4983d73678b5c2cdb6870ba1d4ba4ae55f2d5a13c6ab15bb5e8d3217335ac167b488b92a9d6d05527d4efbeb1046acb3aebdda63ff0e1631c23a7d33196bbbaefba8be924ed28815dcdeaa5240fd5f3f38cffbeef5373721c5d6a912752c3fabd9f53eef7b504f3a67e04346eeafbab3adff77dfd9a6aadb5956aef507b87da3bd4dea13ee558ef50555feba73a61c6f77d217f9faa9bf4526b69a47e72bb57a96c4a15b6924f9e901abdefefbd0eecf11857fb812d7941d0f3ccd4be75dec48bda95dcce876ef7dc37ffeec5ffdad5ae7677777777777787aaf00bbdf0f354ada4c5efbdef542534e8551b4ef5b2e5627c8a2375f7add430ae25e07d09e4147a626b6d80365425b8ae8b69b19bfd33be3f355f82dc83f5bda61efcbe7e5fbfaf9f7ff5be52917474bdef2eb5eb7dbff7607d3ac1ff522a1b0d60ae012edb6830bab70b7eb5d13e11c0d99af189014288708071a28a18291255242a49cb8b7734d78044f9f981c28b73401c5c57ac1773bc7426cf3af9e8090d07efe81eafea1499edc4a0d38304560ee358cbd74602dd7bef858c434509a7c9f61869d8687d08e9f1f90124c810227665428bd6041f137a5889e66571934256a25a885654333a424aaa9d74a28811190445012a13dd25853a176ad89014ba75e9b2a86a502e20e2e602a52c5d0d27275eaa8c112a820190942a3e0c41c60e33b881c999da65db191a1863eeea0cd3b5676eb77f7543c36606ddcd4dc8d02ab0863084fddbdddd05104f2edb8028ba205cb619a1b99377f0fbfd6804b9fd0af8c24a9ee9139c393558762d2cff278425bdf85420526f37ab977a4c6dac9607b7e6d2ef386c00949d4fbf65cf70529fb38094d5d0881199cfa4985a592c8f51197fd7b043fb35c82c4a1e2c75703f1ae0321677b471b91f0f70f9bbc6953cacd4a1a2c0947d616d000d6c118fd5ca7dcaf3c2dab5660bacff0c721bd0a0d58a90006b454e1cf1c2af70504d5024e54006cb0c860e0b77f9ca0d70e06076cb218923221a0e5c09cede0ae8266657fe09d0d0e0ca1658be88a106202857e010c50b45849184c80ad26c48be7c16ba9236934666ee5885eaac616c3372baf26b50c3e4ad4357feac95b50001050a94175e5ac0042f0d91040e5e384dd18599e9e32b30805a14a5998c6ba5790c004f33ecb004083337fc20935f893cb633831452d06c4103961864f2ebcc63ec4506a831c4e8d043145864f2ab90c758cb1526c2a09141922c4932f9dfe735a8ebbad9e55a755613d064fdc73abb33c480155b6757b66a6dc2bde438aed6d9ecf2f4094e06996b679d12df02becfa9f472546d3c59c4d41109d231f9026d881129d43009eb806d4128b9fdb2e6d50e36ca283f50904134b9f5592dca14baaf3f76abcffdc7daf193af72b850b3372f6f07976d403cc5a4ac9feb60f32715eeade2dc5f3a49812df60f45a9f7f6d404dd2d38ab124eac5c69738274e5ad91c5d6c08234724540170bde8862fbf9fa0861f6315bbc6247bedd1863f98e7c8322e263a62bbf0b0e485786440cf0752fc17bd3b0ceb2beef9f6123d09d2a9e0f9cb75ba9ffbcd84c9acd664d64dd3fc352ef799ee77938c012bed0c6fbca3c2aa4fe7b56791d27c6a7ba8bc341b242c6da3fb2134371f954904fa45eee19c7276d24c0df7d5fbf175664479d225c67413a1eabb55acb6231d4a5ddefb40aa9f77ea7a5246ab16bd1f72848bf5a96d5d1b9b47a409529a53aee62190e929545a154d222fd9c212b6b330bc6b20217aa26db0f487dd4448a66c3618c0d87295856e0624a27dbbff364fb39b60228f2fbfd2b92d1651b12d11d75dc7ed672d9560498fbb98a222189b9fd13bccd585c29bebbf8c7ff2944747797eff2a54afc166d3fab9ffb6bdff0f1046ccd95d787a2fbc1655b1334f7a3c138b8e6c51a552cab457e2ea30a21a8208992e596854c364143c54603165f60a84126dfb25e4c7c5cebb2e4e9ca908833026a65210c8b65ad3be7eece85328cdba7493ed6930f2bf6621c2febae2e42a405f699b7d7ebf5a23ce79c73be4f1da4980da062fb29df6657dbebb819be08633e567dee3f9e5f188ef6ba873cfef35fc8ead210e8e69097b3813fd789a916cb5dee77bae6f7e8d12e7fb107f7634e8fe98029d6aec497ce8ed5e1cabc9bc13b52adeaa776328cc2e67b0f328c7bef99bda72a1ecf725c68c33d5f1bee5b365ce823842110e0821668501446922298c85c8c2827324bcc6e1043ca05a4088164091256868450e2c50644c8e08b175aa290f94bd51215608e8e8c31f385cc5ff4d8075e70c31393a32b62a09139192d9ecc9e98bcd0840ca866c41751d2b0200ca73264feacb2b1859d21b784c4a3725fd949c77ffce020ede387939daf9f1f2d3aeb3a808a1df9cc13ccbf48c3e6d73355c8bdcb92a1eb2b90f9ef780cc8c77f1c08ef78ae355bc9afce2b8aa53f4a04b0cb7f017cc5fd47f1ba02a4b0f4abd3a5a18fc9cd2ebf380259c67c08509f16fb81ee6bc7bfc7ffe5afe3356e069f0afcb5b66a8b48bdcc7272f3bdfa717d8e992bf71ef3b35a5c7d8b528ae5e7a7c18ac1025cb63d51e5825fb2b4015eb833b22475dddfe00acc71d9068511d716e159c858a20ec0869b02a24baa7af5bf384162431945b8808c1819194d780c404324714a33c41047d2605985a91c9d1eb727d275d9f6841577c6655b0f39dc257fe24fb6b87214affc2ba7cc4af9553e4bd6cb5c52b582d1810a22ce7891060a9313515018ac70c117525e904203941ab25abc49a2e141a43ccff362c08de1eaefc85a81d0e2030269da9aeaa469eb214d93a0db36976d3d5c71b9cbb61e64907af2d5305a35f19367c6891421fc2499e4952f59af0ba4c763d667fde6d24f82155f5dd8f1e6ca9bf95376d131ab1dba6ee3610a32d71b26bb092e5c664c907e0dc11cd791b85e1d8083bdf91d9cdcfed99cc4297d9277dc02304e4bb9d3e3038890179f496262277e6228396163016eff28e6bc0a208ee05052f097ef21092dee304ecb6c6692cfcf4ecfbc69b17dfa7ffa77fa7ba6181fe3f851c1cebb5f4184743702f903640140d831870a52509f0529ab5f432352062585f9401a96e3c53bfae72380613a2df26071fedc218171e6f380f1b03865879209e350617f7c7c348c09ef485dc98471267d9f8e25e0f683c21023d3e92899f4346cd4216132993a0de3a5a62fee08a18f16270518c787713e40b2364b4082f8fcd016eb86750312c4e78755354fe9f3ff58f670ce7153879bfe4ae20dc79c73f6f87471756e0eeea594524a66f1d562e3f403e958026e434ab79be6a4a1ba0439750962ba5248d29ca54fc346e6f2435b0001de41e9ed6918db6a4cb7df8486012075656b042390b7b63cc6e95f800f76e42620b27d580529e89e052993f5bf7c4001fa310224eb9ee5aec6591ad25fa41f487f90feae258f68834942d6acd1c00f4d6c4cccdcee47d67c1338aea7617dfb71f4889235e478d998c070fb75761ad6c16d9b0e4fb7dfa7b9d9d9868d5cc5ed0ed37514f496bc3285f9608b25ccb0ae5a948c5363f5e5dbee3efc16fb06e47ad2800b5740c3aef92c63c73a5b0172b2ac65938d05c2d4b38ca37010aad5abd571f86c2c6044963992a53e0336f23f3132239f18d9f7decbfbe12cd93f210ba6195c3152a20413a02a696ea8797901972b41b2f6620b1ba8a0c9e18616a06424b8708b12362a9eb64a65ea8dc95bb4e48069b9b285852d362d2f5cfa1e2cb174c6a550374bc5e395aea498028b10961660a9228b115788e0a1e264a14b171bb203158f8fe0ea893bdedceea425b73ba98adb4a80b9fd1ca878faa948d9c18559134f432c88401193344fcca0850a20280d4a367c2b255a908497db6fc3eaac60c79a84d0a55bb6d440a7f59c73d6a8787c8e9074c79b01dc11470e1e77ccb9b4c7a5205419638589952a9008424289248e5cfa5c05cba56f95be38d1a0512588db3328a5947629fd1efa3e7ea8572beb57a978fa015085069e398f6c2cb0e89c73ba4b261854b9fda97e562b0dddfeda6c364be2eeeea978e6df717533c21d73e4dcb187165e3a220c5808977eb53d5cfa2cfa3fc4a52fbea08b4bff05e5d2d799f2c5a5bff3824b9f4ad4a5372896d8f275475828be54f92a38c21156d2dcfe69794823268d0b3b7c510609a0222aba101384d0932534d019b63cb9f449e8f1584e8e0863ec989323a3f78adbd54efa2c1ac51458ead2ef7913e8fba054ce1f2b3843eb1c18d144b506c8f24916d8bedc458619344820aface59801e9768ef432fa4cc3a80c52dacc59435b39779921e836785bbc9d33dd2f3f04fc35e0048499edffc0b4d84c2df68d71baa7b8ab658d067c706a916f00cab0536c05d95bbed33edbc28a8d13ee59567b64111f9d13d6bbcb5ddd8ff5b2bad6cb5df2458eb674c448797259e9b28d08a74b0498cb5d5cb61d61713f1a1ca564a54fbdfd362c81742f9564fcdfabce3cd6e3f78771e4e34429ed44bd8030d4134371d410f94580040982420b088fc1450b35e8a2848449104c9260b183930b5f66902a1fdc771c7d191a913229e551cd42f27f3625cca75146196594219ba10a3240431bae524936bbff87fe0c8dd8387999185a7735cb9f65338432fd3fde7ae9b8abbb7fa7a7c9c57c8ce3bb47c097dfa75efe377b041beea5cc8894cd78d5b38c8696a8246148295a0209900e52a0043911031cca406246abbaabcc8c7b96947668e6317944befc2533279a318eac36dc73f7f29ba85ba8672d06b5283f0419f4ac67aaf761b94bda3c405e275e0865ecefb4735cf7755dd7751cd735d7eaff40f95f4b42b94b3e4d0ab94b7eaca2e128645ca92ae0322fd441831d7bd6d58ee35677ce50c4d1a2cb4248b2954b99295794a185134b6412e7072e2bdc1075c3186764f2e54c0ab1aa0253b6d33afee5312024bc6072040818c6f0610cd9a5018b282b96aa78824926ffc55a6d908b29be3873798ccb5378116501c945666381f9fe1eaa80fe0c6df859e6cf32a9f2319d5877c95749a92463d97c1ff93f2de22cf9e8b84b7e08657ce4ffc8dfe9a9f164d975f8faa8a774ad8d664d06098b4d048b4818490711d013a8a3a72496ecd0c20bb02a90d0caec60032f6835df3d9b6af4b98f1887fe4ee34459fef2c48c192398829802872bb4b8c1921a94b8410c941b530d2cec286f37301d4b49314753cc5caa84260cf254ef936e89d4d24acb27dd12a9a595965aa6d48cee90dd71b2233fb9ec9abbdada6e2a6b52363ddd78c112a9d7a61fe8766823a518bef3c654bbe631f9855df4c3188db9f4c9d43cc632237a631c5a8613504cd1e58a2534533cf680249adc92c2c0e2072c35a322b45c66e2b24d0a1997553c3ea9d088941571571a8e7eeaa5488bb88bfe7d626d3a2aa4453ad9966493f2248f6c52a082d86773775720f5365266e3f3fd171a913296bbe803c97096ec0a5c18c940061947564ce9400bba28f3058ba3a4208a782c15cea492ccc602291b9689eea29f0a6d26cb8060a0c5105b7021b4040c5ac828535184185d92c050a52666b65ea9968ebbe88750e6e501a73239d0608599205800c1135ac8f002449a2d6482782cf5f487346ceeb448e9e350b9c926faf289bebc55afb5ab9d8701e5ee3e43202dd21f774d1b2f7c40df5bc73aa02f99a0241a2d97762d68de58c882ce386a2106b40530940a5d5a8b3274e9cb26344cd7750f81be5d873e2dd29e1629fd072061fb3be9868b97f20ad919581074e4cab9fa5e57ecb8ba370de35fb528c7d5654d795f49765cdd8c372bbee32a2665f23f9ece3ec3e7cffe968dfbf109b671dc0e8588eca10de42882884208708a07c75abbae763785f99ce82ef9abf6efacb787ed4f69385b6449e5631c1fb74d772735acafdf38725fd2e2b4305eb341f9c26d50965ce553ca87405f3941c93c4a506f530414cdb88ddc35bb9fb997966aed9a4f5b4b8b73c9c9d20f7b6964f5973bbfc615763ea5358c12cde8946a59e1289b7a4a27792bd99e5431bb66efecb0c6183b7fa769d3b8e9ddd3e96e854a77e9d2a54b972e5dbaf4b9c40386954fa5fca7a7a626262666d7d159ad6e1a47275dba74e92db0e953817b7e6ed6755c8beb6c0e69513e7fddddcddcfe514abf69d34e6a919fb65ccbcb8a1d7b2679d097ef49aea5637da69778c95790b196225df253a91a356edc08430318400411ae8ecf8ea06c5cb1a3cf867c68f4590b29e16ffea6754c36f550c338215cc062459411949421bf7cbf815a846ee566b7c618db2fe4b1ae75cf7ab915521ab53232148d362525d56851c79825d34d2a4da13479e4463a41ab214a7bda953f9778c0b039a03ce673f3d86b3ee918c8aefea7a7a626262625a524d7d159ad6ec659eb59ebd9cc63f2e9090a2aeab60b5d8e23f35140caea33d45551c06535d441839d41b8b00296cbb9bd92ef4c36e139d598e96044d30d30f0a240a82dcd5c906ab2d9e014556d42882161a7470f272cded1cf38f50af39cadc93873ce3ae79cb39d5b4f8f558e6a6f5e7ce5e8ec80f548899a4ec3f832fdfcf861fa61aa3949e25a93a3214a04114284dd1555c44891a822519c54a5a925d19252132b44b527475392b4dc6a57851222a22222222249045ab0562fa2e8d51f205db06e7054c6a9a2c8ca31417cf5d8e9f1f1c1bac9d1228b25b258395e394451ac591aaa36acafb52da6616313355323f5521fb5954e6aa5be3598b1bb68a2a26ed24277b42ca30120b1d6b6d14d8e65e1105f3a3d767a3a37ea27d6636d64d4462bd6ca5a280fca4acc91e33715ac5567a645ed87694849a8c82c88e6d363820f6b59ac7ff17559cee363ddc5c464697664a61f2639d4b0d1a260e4078890211dd07efc30fd00f283e9a72634d3d1d111830ce132c41c39e0ea865bd4d121e187ce8e093e3f405008328427f7d8e9a1a3a3337b4ac200efe8a8274f464145456844b52647439408125c1027c4cdb827e724eec963cd3bf84a0ef368741a62726ca67e6a28b067ae648ac72611eceaa79274e5b61213f2f6e5f677e12899c2c8a631b7ff0b2799db50d3491051387293448ae56897ecd1232707078e6e2035f753727ba71f00c68ef3480878bff7243093693635ccf2fc7c22f977238a9d3fce23212d7ecd3965c05198a1db4e733a9a4d3d9de644fdcda3ef9b471d1b41cbbc4d31f2260514772a49a1e58e13cc649a4dd3693af771a04fa4da3716cb7e29f8f707fef785a37ff740d7dfeb3b2df5b5a6523ffe8ea75ae3eca9e2a9efad795404080a468434ccdd093b76516e7f0de7942e9c4713a946033fa00163cc135cdc71ae006554c1f5779abbfac9388fe6142874de6e770af43d9c4847642cb591004dc186abca431bbb7a1c2af36826f54fa5fe79e4fd738af7b3ba2310b2a05d95b2d509e1a54b7f82ec21f8002f76b463d04461260aa71a59b86b282c899defe3b5b68334ec9deefa045d72fb5f3926f0f7b01498420ba6228c6061852764fe2c8e81800b1d8cc21c198389309567172a7ba74559d3c192d8f12fe5388ed6742158eb1077511eaed668e087a016e51de2b11d76d1af955a960f450cc511312e17de5862a73baee072efe395524ae9f7d0ee592d521ffa3ff477e8f7d0b4f8665ce6d8c5dc7f73ce771e5cbbd43127996fba08362b9f5716f42f9345f0a5979aaa905904c12f1c8d5cefe5a7bc701661595cd921d79f4590c804a57321dbbbbbef4dc398457fa6dff3cfeab9e466c82ca652332575f473aa12e64d8555eae81741cc164a8e5c0f99c5e9cdea5dcb6964ce291f330f671e41eae051bfc78ee6d15247eac869f1d522fd9edf395ae49f5978ac6523f8b3fc44fe578e8ee4917afe1d92c77cfe1e92873f8b46f7a5a18a022d538575082b71b00e0264e07ad8e178d6419f0b3770c3227daa2a81c522fd7983c2f5ca2efa9f2d61b2825c9f2cd26f5509f6be9c771a99130c24322ba41c402427366050838517d105162b3c15d20bf643ea3203298ced24fbfa8ec026337e1072fd67ab03272b7fbe6566e67a995329efa6c08d3e393a03cf1322b5238b8041c54a5268908a4295838df21cbaa496784528011e517d451891fa525fd32b8a2551bc60b52833690d42de135af812afb29e0596c1bad5195215c71260942a6888e161f5040747d8d44e8f09ac6775408675eb9460a05c16294b3c6e3aa2a66a4c613429e79c57bd2b61cca019c3439a325a9c496521c252221d63607146061e5c304248d6ad1cdaa91bb802addcd5651b18239073d20f82646626be26ee869246fd12618b0859c8f8abcfcab5c5b2e2bfceab478418d81f273eee6a990831b05246799376609a04750dad0f96bb6c03a3030e41608d33b3bd974e0f303278e00af42edbc07c11c66be2632e5ea44d59d6b300e005146358b7aecbc738be8671e6f41fe79cd35611b2a8f28824bd855222f2ce17e2b7cb043c9092cef7d9523d60de99c472eca5e2e0f60793713eb8f26938b21207aae974ce3965cb19b4e5e3ee6e669e4f442a7dfd1cc7f1e4b870865cc3b850f580395db0630e1dad83c3e1485f39391a265f558210bff389f4a5f376f78cc30c04d449ef0244e586a318a4a0bd608588156a4e14c1050f49a034d180cff20e6bb184925a0db214550106688717dc6e685244142ca86202293f105154eba1872a4744505164a0c4182dc8f899f92bf3f30eeb457b630293949c5260bad9ac093103a8273330a90b84e9818534312c91248a0c498a23304863268c29b31f6a6e4d4120253141338386184534b002092c8e7012820e624451f444832358f8e6ddcdfd7add1a4f9f06a55c38d6e7ec8c56f55af3eb54f138e55a4de7f79cf5aa5aaf157840b5fd0a261fcc5c0f2e33f970d3f1a0b66ef7d7b0ab5fca1e614e8b9d9a5dfec9caa1623d7462e363b446b857c10af4b9d0c6021df75d08c5a6b6c885d647c62f5a96b79749b3e44d849af47025cdd23763e8c8072329bc0803894c42014412659ac08286265a5299a131869a90618916b4196a43e94dc73aa0754f8339b7bbeb96fd74baed09daed67d976774f00177edffc6055ec2fd4b89f04bdc7b9ba2e5e07ba5f330de7e72d99cac98206544952ba31c9fe2af325d9cbe5255b0e66e27a37f4b5fbb7ffe74ec1eb945b23d8754fbb1080d7c391088f9c4f1eca81b3357ad7db6ba4b17139c52d93946e4cb466743465ca51165dfee60f1a52e20da062e533353df9f4a4f441d049527ac91c94526666071d4643e9eeeeb57ae62ee747e2fb5e57eed8928600a458f9686a77dfe0e397ee54dd05e52ea594524ea91295b4d89236c5f28f92f6eca22ffe5c7ffa3cb3e193edcd715dadc138d4c60882eb2976d560172d81641cfa744e6e524addddddb9df71e6269ddc5c81a0ac31869d2f79666a494b2ae59c73cec94f67f2b9268e057157ff53f333cf180a9467a25aec97502fb0925db37a90a7a7a7a61983962d7d7efc2c09f495610de374356e1702afe5b1ab4604d79f5d5dedbcebec724e90d2212d526e752533f3286475fdbb2ee44ac1db5500447450f5b0465929bd699fcd9b64bdfdd565971b8051160c0490b1976d5f9e6e1138eac7a51a064afcd5ca498542b4890d5d5fb68236ca91bb8c182292b22190ce10c9a03045e04bd367fb4225d5de11b00b5be3b2ed8b931938d89bcbb62f2f64616d5cb6dda2227083aa93b95a1b775eb6dd8c7868f276c9ce5ee4ef493534edeeee3aab1b1e30ac7fcc875dfe2f76f9c7407777d759b973feb2c9bdbdfdbde9ccac53ac2c1abcf4a4bad2091f6aa490134c336e39a8e41427b2b8decf86292069864e1ce174b9096211af7839c2cb184d5469e2064b618800985295eeb8e2d1858aa55a1726d7bf591c934ab2eac94e0c1d3b9859e18a2c4c5092a0b981bb81b7386281142e6ce1a18b1ad00a42551071b105113f44918dd686dbff2fd0c002490c7ac0c1cb161b645d58c8a20b0b4c4931cc24696715e5549a5fe5df6ab55332df9420c3850a16325190c8464b25cb5d97d6e0c40eaa2bc2146230a501830b141599d8cd9a3c3dd831a75fc5d3e26bc94b8e4b737a701173e94faaf4c3a54a589880818918d880b081c1439fa881460076542e3c2c31c5edffc002d982240931312c81818a1e658488a1061eae94115212866f543c2e999668624b0d6e7fa26fa8a4ed9585390a95a91900000050001315002020100a870482a15830524471ac1e14000c7b9e44724e180b645992a3300822c618840c21c61043108111a12129034ae877b3aae3b6b03b24fc3a7c3b146de6e4085afd7972abc1c0192808ea55e091ea6cf53d4c35799378d8f543f05ccd67c68f3d75b70a7fbf45512155be294400c3b40b15d92d7fb1bfbfb09b9f1c0eed21e408cde766ca9caaa578d3839e6ad5c559daa721063bf3cdd0fa330be09f09bcc60b487cfffaabbbc5f205cb08eaf4c00d9384093c4888f7ff369907196fbd125a8c5d06e6f07df65540170e52070940f64b0077a5e3c1bd429d7f3f59277d2cbc9454f7048f7f9c2a1d5497b6715c7a9884edec7d2feefe9ea7bcf4291c433a24d43b856e45fc7378a34af00b3bd0ce349335b6cac7da9eb113bd502402b2d802652cb77581056fcb7269dc00f45fd8c3aa17b2befebc687ac974c90e333524538c4e57220218a59b3d32304dec03e6199f48ba811a5b941c4df64d19e5b5b838569f5c803d15a094847c5506997d5806a6cad35e0a69b7e7879854fb9875e48d892fb9c334eac0a8161b22680b7f273812a932485f21ac52a998f0164d7de89c06543a129c344ba54e15826c3ff7a86a469aa2ff54d3d67864d20b141e34b32c7ee481d8b6547040b3fc7e9a8e8ad0806be2b17fbf26769e6d567460b4728a0aba730ba77fcc3503fdfd8d078f1fc9914c803dfdfd915445754074f3d3c665cfef76e3a94b353c1e00f2c17e9a8bbce0a21375c6df69a9b59a7f4de31e3594a6ba4e4bc8dc0f68c894bc0d90b5f6b53f351a8f60fe15013bd3cde30369cb04581950e281fe95ca3d0c4fb30958fa04adf525444e86603272f8a16320e5402bfec2f6b696f325400b1c8b68d1105bbefcc6884304daa79a86d18ec03f38ec768bfad705b72a153e55b1d2877f8468fb491d168eba08fd5b9077948afc7340e8aa726126b3b94becdd9a0fe6d1c6c268c7861db6b82c2c87c634a40b9df810ffd5d1462987060557f27490589c181bfb0a4375686f02fa5445ec817e71a36b93102012e13993b81afc2f508ecf517910e3d1b088c7d005802f17baf7f714d8ef7c0482fd614b180f677fbd75b88f75edeb3c1b81553f6d186fffe0e701814756bedd10dbdeb8b9ef89c78d39c7a651d3db26c9133b8eca380f2042be71318c9cb5158c31d622d70b0702edfb84ea0dfb4ae57720d020fa18e330082bebcb8b1baae7330eddb0b3f2552f90b24f8856ca09b2bfa687b5a3dcead0becb3ac2b93b6661a831fc15674e75426ab4d72914206b4625316168539f2fff62b9b832630ade8dadf26c80ddcaf907046e21540412e4b9639de27dd2ed9938b90ff24e8660268564be4c58bc0b33e282fdbb0c9a57d5a38d5e55ab955047464532fce0fc1fcd749537bec64512010d77a613b3a752737e1abbc14089303105ae37ea29de92b0bf7d26d502e72f063f7acc30bec9a8cc0fa55283a80e596056122e7a8cc7ae8c85f5acf24b1241f8ec8e5fa9f4a252c7bc911d91ce0e030eced20c1e23133121334e991dc5d0318f4d55a0dedac923239b40461b866919746d88f6e2678d6ebb18fc209c605f227dab119b1f84d2684fb4fe9dd63d264d0fb29bb8cc71588bddb9297c899878605fe177ca1280c97ceaf0eba14df272d848bcb78ceeb648e2478ba6d7fde46eec8efd232009a230d1764a1a95d6c64b1c0f2b8422c554908c296ad1ce1a87c273f0ced44ba30df197d87280240caaaedabc40b85bb73f9362671f1ead25640ae6e8021d24d66c100a6ee6317dc45c10970222b91c04253dd904ddc860908818a308bffd5bf3c3015eb329b4e2d44e6ad30b0f7cee49ba4dc132a311d59599e3ac3febad0b615833e7c1cc923821a9795210bf4b14ed2214b3d02ffc2d47f9027b04f67d1811f1d382e4e375af4821e7ffdefe308711412ea93621bd126266be82fc6d8f0b4c77899218ad4b3c726d8f3741b0f1d9c9d3a067a8143c3e10383ced91294734de3e4003e302aa123e6f9f69b3326c2eadd7e69b58a600bd7857687f45ac0cf296748b636a0640b01f1cae3c91d1041aca206e2de7a41540cad9cb028e438419db585fdc4df9120d38af697a1413862578d2dfd79d028b3224992b662e70b9dcf85f76481ef4ff55707708d4654f79b1f8add10b4f5cc2545d464fff2269cdfa4d884f1dc5999bee715ac81dc380c68581d883d9147b606eec41383af680cc9642dfadac14d8edc734d8494e9df3ca37c61e948cd2419b3dce0730583054e9c05d6dbc56400fb30869c084f71c1a4c669a9987b88ec4d68fe8aec5086e050fd452613856be5254c7c32b259ac3d75c0f6589cbee66b6cdf8dcb112dbd91709abd4ac893ca098d3fc7ba7833ccd7899ae5393655196014dab28fed4450c829b7edb379a95863221b234f180ddd396a623abff50f61ba3a8c08d47cda360256432f7b089b2828eca15286ac1c82bdfbbfc837023abfa8b2261e4f58b47aee62e48a9eb00fab61842cd69601effe996169b55ddd9f193ebec8743efb3c539f8629e444e77d328c93f903de2f98ff7fa17d11952ffff2811267d584f702509238010339cdbe12a66099c2a4fb76e84472c76858d447f03bdb26ee1eb70e80991ec9b91911d987cd3f4fbcedd5f084ea60d59038529e3464da8a44ba13e3699762ee80732d7cd53e59e3e3a34b10b21fb2537aa024584ecc57621f4129e65aa33743df0f88b3e9fd79821da0141ce764b775a84a2b8008452d4a312f98a476e92b1c17e76431f6be7c8e975c0d3b49e8dcfd981cbb8aed3531b1c12779a14ae89e9dfa28e2b9edf8fed6a5dec89526a8d4ccb4935548d858b5b89545a181e7203f98fa52e730339c0fe4a8132259ca82899e449177e9990a60bb0fd83c4a12ae1fba0bd98141372d2db228640f31baccd48198199b5b78cad0879d9f7137e67a86b9f98b1849bc9dafdf627ce42a6e45786af4ff3dc93790e5f3c8f23c1b5bc67487f70f4afbf1d673039091237bc3f090183659705fc55a590436124b925cf11baca469248bc50f235beb60f508da34e859faca4cd857734e06c6c60d6ca8d3bc6dc1b8669814783e0a1aa709b05f6d90890cd99d97e7c0b893830095b7ec9a4c954bdbb8604b366be68906ad65f9d550bef90a52dd9f71b85d031cc36fe289691653b347743541ffdd75a1830bb96abc47f1efd892e9944a9f8a97c0b50dc0fa133678e1a528f52123e72f65baaf9e6dce1bd0af6562a4d67305cc4e328eb955d87e3f75b98b86a2328b3dfcb889bdea21dace76c0ad8e3ab3ffa85a3b8687526fe22ce71f9d115e705630f1e06fe4bf59c688175110d1550ce93c36ee410507e035b8d798f82ace860f4af71afcb04c4a3ea0180d305af217041a423f7825ce3d5f64296d214b9017c3ceede6bb48813b3f0600229de3e02a4911d52e46f2057842427658cc0f7c52c81897989e371b4b1a09bb27acf687a8a98676f13c0ad7cefd14cd6d04b76786528dd560a093d0e8ed15a15321fe40fc63336aa5f5b7afd81457523b4c76db058814d9712cdbf64d9b662a9cd3679bf45c54c9dfb77aabc6f5ac2aa5269913259a55b9feff9b00cbe12532bfe613aa1a5fc6efc8e1d684c153a0db502c8060550bf049b3b6fc457ef99eaf7723c7054cb1e2e9ea91f30d0f4081c57a69c6188b01bc52c05cc4ed4f55f27896be61df54c2970824a329245516e8854a1af1bd5d624bbcc554a43ad4f71e51b8206abc2482419fad18365b97ec79634e6bbc8cb683eb477d56c911108580898c0643b25010fe7078f467cc7135dbadf338167c615d720864d74ba12337b59c3ee4294c52b113473891d09dcd64b7996d47016f67f805361e211477767523ce88589eb266443076a4875a8d40cb1fc68ff2954a11f40d1721d10a76eec69eec654a5ad8bfebd205595e690f505b9c9077338e758cb8e0689fdfb28762f5b3e15f6e9b2cdc89350a5cd69488ed59348d2706eba59053779f37d6e943baa9825045c16b8d75ab45016ff5714a606e369786afe6cd4c987289deb54f5cd0fce23a673ce67ff6e137fee66bf0092d69afd2dc3c6f2f4455f4d63f2ddf524bd1c9b14a91f7d67d3b38a1419a7943d75efa7a25c200dc92aae4ea71fbacf41655a15ffc900545860c127250bd01f12613f14c179e32da2110f7a6588871b40f7118f84eef0a51cd8b9463eec897531a843a86cef3094d03539a863c49ea1d116e5d923ef610f32ef7756c6cd41174f0d2e223d1587b1d9b6ead26074f3542761767bbd3d2c18f3ac4297b5ad1e8b2dcceb2cdf3e3f7800b358155b19822577c608216993c82cadbe86ac4fa2d2c09729577510837345dd0067afafb297534256b5b3428b09fab27ab130fe38cd0a419869bba5da09cbcf85dacdde922ee80644ba3e5016774400c21a4feb81feee191c86736850037beca71b3292f17b7cb96bebf6457550e1200fe258ac71c7ef5990f83ff3c0a05acb4e5b4cf68b0a8923310cc267ea78ae59927b2533d2923b3249b6440d7f4dd566bc9524f224e4a240fde7fd6ec66b0b442f121ec7fad5eff6810549c22a87695c131c0765fd41961eef87ebfb4617aa824a9b2e1f35cd09bd66d0694b15d4c8fd4d26a25a33b7243625eb67368c204aab85007b7fc4b9d07a9bd6bb294515fad45a89e33ff006097867fbe58ab1c79b605c19339852dc2ec1dbe47ad15d6e9263c39fe6dbfd9935cb27c60b93b4ffc3c2ac0ef159f1b80c414305d14c69cbb4ff341cd33a419285053063119cf06a5708ea4b00ea932b8c018e53c16a2af43007208860d08e63344c52333e25cbc1c6c12a30485c63f4c31498d8f7a121d16d85c1a342da6543c49080653dac0e0de402367022e06bdd8d8009dd73cbaf0da9c17504b7071248e4d04e59e4558504603e881e91cfcd926ca80a9cdd2b76a9e4648bf065279faf27673a188b4694a51bd68a1cbe647f263a3c5a21c08539833faa9e9aa9d5b525a03fcf1d4a6a7cb875cff412d90167d04c81400547cd8897a9e167a261ac59ac276fa96916741586eeeb84050a1a7446e181597310d3aaaf596a1d4e318d45bfec63f7ce18de2686d7098a6cc52980ba9f76cbc06819eb833e9649465d73c086af649e50261a368fe3e60e60cae4af4c70a23f32b9fe246fa6ef2bb959fe959e6d8d1f9a7ce09122b0659940eda4d1827d92e0c2b9d780c1559ce3fabc5280141b8a0863fc3ab0e7a15fc22544843141e081c9ea49c135bd000f02e6b46b9d830dc474663c6c9b57634bf2142fc68f4465c318227cda3bc7559a21acbf65aa07fa4ceab8ceaac62b7f5a32eacd814a209efdc89d82182b7dec194dc20dd43aec75a2467e490afc9e1c310fe39ec9e6c5e179dba313fa1102a7958e6fa900541dfa542f75a0a0e8f85a6f648288ad688cade4a6f974fe18a7de6debaca40e58c040a2057c858f51fcff04201383b3a4f0ffd0ea43c590e41f9e480b70ce897c842818200d0450412bb79642834d45b5bfab412439fa4ea03f7f70a3a47ca1053772e3f92654da01b11f4cd21396845fb1a288bf6f50247ff0817d4010c8fccf67c4010092ec0f3e900e7c88dc47e144de89daef90757e67431b09b141817d226c3b8ba1b0d5ce9a7a05084de319b46d56ce36d9ad77286abb34400d4fa690e4b6bbed13bbf5dcae61b75be652b8144760fa6b6d9b38c9ada06f30b37a4ac505d9d5dbc7dd13c080e5792fa06753b1f3af8931dfa07f2dd6718e2adf26c3deee184b4d34d2710000f80cb330512d38f319391c45a72950d22c6d6cdbf84d5bd389f17e5f433bbf523fe1118cfa3dfce9d7695cecf43e50c5905a434a23f3af0ecbcea7e644287d08bea650fc75220f93562e56f35a026fc9b236b09cf8deb1d8ab8f373b79bb2c5ef399d6fafdba5d8a5d74b33b40af1dd3dfb47311d216aaa342a140701c89a59e5f46d3da9835875f2d086add94d83f281da2c4961e0c2cdc6a3ed022d01741f47f4f7a200bd8f484fa50edd32941d517fac9719801a08509600c1060e80d30aed47261199074c39080c318944311002454a26340d869efb473877dd898b33db6b2f51464eb6eb74547e3e2a2ea22d1bce844cf1f430c9fb485ec03cd29febc6e6b65f70f98b1ac6e42ec89b7956027964540c5dc95771de28da73b633cb926f1f9c8b7d252259853e9b35d73e27f1f03ea2ec268a0445a522400485a17fbb6e34b4d46cde054e54155e9f33e413639db0e40d285077ca0b23ef1198766202d0caab6e87733011cbb32e625e92420599f1bf6505edb5a394d23c253140a39cf858b8d2e5dacd2ca3deae00c82d9597cf0e80a944bbb0882348172d8fbd368615f49c10494d2ad8c1b7c924d0db0a22c4e053d892062b6f8c1e56ba58c3f28d119039b1bf3eabb0e666635b2fbccbef1bf8b386a86dd6d80dde65f67b3fb140984b058078549474c6ea2c883844849536ab1952e13450a2cce7394b243022986cd95bcc166f68573358dd44886b500b3124cd3d4176593bfad59d626eb852b7a031f9031e24cc7f58f2db61c5b0e3b511c6fa7cc84df2e580ac187d82282467564116bd5ef7281f6bfaf0f80ff82a4dab22025f80d9299567328dae72f4dff4141180bdcd4a2f541bd4447c58d8ce9817c016175133618d9b99c19f6a5bd1570c378f7b4f829bd68e506495a6cf02221c0d8930490ddffc7f3bf47446ea228eb14978d9e54f0e14f067cb6375a832d65fe98ffeafe99f4f64f9617843dc8102a2f0fff91aedfa1c4a7beaa1c99a28c1eca7d6f7269107009f137dcc632ad1e4f79954be5ef0574e595b26e135f97e8e180ff90c34251d63639df9388f446055830cd3f39b635084f6c03b29df9b4fe0d310182c9662c91e1ce51113d2acdcf6ca3ec4ee62d66c06bec871876b68e73eaa4374aedab8c7fee3968eeec0d4e401e8ef14e03a6e76dbf611b146279a2227fd931e38ddc9059910b2f9cc36dfa4ab9063638100df62974d5b430a94d5aa40d82286aa3795777e247d0f59cf1a28c659a8bb98e91aa145e9e7ef0a87d0370f1f9fd3b791c98ec72da876911644bf1441dc12921354af46936cffc8e071f523b215d3a055075836d8f0c65bbe1dcaedcee3c26789cecdd82580cc1bc21cb6f25495e84cb85e4c6ba15aeaf50e889b4add80cdf0e0195574d3f15513b0ea61db89afb47f1135e6c132df0c1e20cb0fa25ed35fc00411fdc2014eeec173f9f50e09747b6a8452720cd5793b25789437fecfa51f1a7f63fb2aa178f10ff3715da9d883f4f4a709d4d7d730f2336d08361473ee9e8c2b883227d8b107b962f845d7962ef3f254de3567f926357e3cb4d5eddc70ae5f5b4b8427e0e3e3c956a665d1f206a95bf78da9297fafc7dcc5a2167f546a5227c8983c0483c29b71498b3f955eefcc08deeb9a51010ec3d03a100c5d1d579239889d9ee712bf29758e629c767105ea46d5457ece415b1289dbe1781d99cce48c9c1d5b30341c77fea90bc3d73495560d52df59e853f02cbe95cd4894cdd32411cd3be8ea0f3c549df04d872fed82a5bc099eb8177c836ceaaa6b215923b53f1212ef378c0ecd1fec6a4079fe43946d6809a005bc54b2bece76322415963df1aab7eaa81ef15c1bec3302d18b902275a66a2d42c517869350ce88d0a878f4c0d0135dbc62ac20602c52c165412a317bc59bed4c93f16909d0af4d461d4ffc8fe9908e37510e5de94a360e1348b26eeec1be43c6ac05806a2832877346a74dd731d6acebe14692e625f4d79e01d704b831f1d6cd2a011120012b134d03bb3d24f797001fae7eec9723ccc62d3052ff1e8d2c4348e4be310610d969559a915eab8708a4c82564efc48149742dc2273ae25aef3552fa4ead7244bd6c63f553920625fb578c62f158e9efe19082dd9eb8ec22f496990c5306507b45ce4ff6202dc65c1463c46d05ce6a8eb47b870b1f06427bddc30fc97ec66fb3f89d8dccd609358e74498f43707df42a9974ef74cecdaf1c6acc23f66e82ac30ff60e55bc541543ed507f7772fb5410f82636a936cd7eedd86418f93ce705cf03199ff5c89bb83d632ea468c2082514355118ead978514cec215bea6651271968e2ec51977a8984d2c102762b9c7232e2010a2eb5838645eee9893f1dd4fe0dcf7b711c01534af19438c019b1c99304d023139d1574a12c21eb0abdca8e32da7b667127aaf34aaebaf715c574ba8fd1a86619064edf603741517a3a32ad9a83ee4401a630669d658772f34dfc031e5d27a83b9a23510c1455e4f57b908e0f46b4603989a2876d45284d67d2d60e858178364ac48497e372878c3a10ea4edf8c2f1efffa0bb22be86fc3df928527e40f610c2e2651f6f97d171a32758e384ce65367aa4fb6e4d313e3f0e5dd7376aac958ab64d73e65ceeab0e9e19746c167484746c1f1f802a65f61f60264324df12cd40b4f6eb924afadedf140e4c374c960e8268e93f9c1f26b272488ff1dec469815a8d1b14081c7086231e3a2add0737789443e920862deec480c31e57fdc470b825d854500cb85566250246ee1b54f15894ba8559b3b5badb0f0144f130ee49d620110eec7b0453cc538782d8a1f835ca9aab203b19c31c5237acf149fda65bc23a3af3812238ac3197238b417c56ee883ae6531af7db5ab447f7e681204d8f964a60dda8102c571700702bae326f155cc7e0b2e4a266ceb3911edad6eb2a3b03df716ec078b4c8081f1aca63bb26bd160184ea6708bc887c04f79c366155c162bf890871dc1e0585bc1558631ce7d7b5e03e0b1f07dfe04d3ceed41a195e471a63a11978286b2218292026a0127e7b0f493f85c62c31125223719430520e1553de464d641d4913fcfc0fdab742a97784f3caf5ce748fc1f46dace495595d00ef034c88a6b8bf8f64eaea880fc7efe6a5e1c3403df05a90cf88ac78a514098338e320df52526cb0f0b218527378d977a655745a0ad0ab707d33863fa6c23838e7791b3b0acdd414be868c506dbbda8536cf2e14a3e1e30b5890b1f6fadf79300b3baa2ca934e0906d640cb922b00000007cda4126643054f8edd5ac3b9b1b80a65684b6f62a7af47892235c8349a17d4418e9f6ad2c3f6de30a4e3d5b54578162153d64e27a2066781d4f12cd31474a7bd0beaa7e4bd21950b93603e88d1f30b3e8fcff501a46044476aa1aba12aa41bc56951ae348fbc4d0bf09d1382ccbcc785f4c1397221b44ca0a5877c2a562b060f839022d9b081f42b7b4d2839ccc40dcdd7253187af6a924828d57669e780499bd52631ad5a0edcc06a8e93cb3196de20e4907678862216478763944e45229ae67a12087ac2ca73d1cf2bb1a6492c0879bde8edeae2d66de7d2bb03c5c6d97c7228693f5ba7b616cbf0121209a7833d57b72f783870936f07fa66dbe2dc91c4382507d2d1f5d85a4be841877ee15a591ee44665f0bfed76a889d59a4304d2876d0a76b5359026010fef5043804abc16f8e720ceb7e80f9c02972ab2c1cd43573b305cf5b33828f91ddc7204019ebded908e9031bd0765dfc6bcee23b9eeb7f082be7f511f07146f378e09d6d80a8ab471299fe1e4c90a14ab456cbb90d8a6cb4b7abb20210fd947793489c0e2ef70bf1a9c581d7b76ab27f3ed815880355382de0d1c45fe090e42de97ec959d66ed38ee27420ce8068641c62c67c39fa6e18770bbccd2e09e9bddc1b1aafecf4d48c2630db7c0bc7b1476a74929e87ec319699cebe389a2c2afd36654460bef26cec01270235effe0c849ebad0594c0980a560b2897ba5b3a69e0cb5ca291f3b9512c7355aeb7485a47ba2e743959ee6488fc72bd081a667c9118e23925d4e11c4943ce7464c8a040e153dd191b70e7a95f4bc171c95b1bdd206974bd82a4871a45dae2529a5935743849c7725ccb13d9b20750878c941ae2bda7dd38c4fc67bcc2638a9a44c5302576096e1aa98a855c3cf3338508e220965008bb99beddcab8942fedaf19f7bdef2d036812e592c365944914d9509c49eea9ba49d3a2de6e3c2658e126ea2c6f2b7951401d2527f54ff55371df00394f8d45931c6272e6dabb14ff4b2ed0d85748beeebc98c02ceb02b584b94409c2e35f190f6f3e943f78787305e795fd1c0413bacc8fd6cea5c113151c47715445c5e98f0d21a2f3c553b91a2ece7c75666b9e005ee743ca8175ad3a22145679f26f9b0b9e3378a37d5cc5e5a397172140b6d3c50dfac3083ae241aecb0865549b8ad13c735ced77ce85db12449d41e4f4b4dfd1c856c5009c5945c36e24e9bb1b20ef3876a2bad70e5a53de858312753203119e27e17d3dbfb1f806d9b4522404c0c4fad1fa4144c369bd5b9c0d0c829504b0931d35031a58c7cc9bc1cc79b05b488c111f326c98c8373f34e4071d2b2608f49bb79c945545357d706d7c2f95cf835fbc40ef8feefd2fd1d272852ff3d324d5ba50067b10db4255ae51f8e52845fde3bcd82c6c0a3a3eacd60fee3aaa42c3d6b63f6fff2df631688cc82b4290a0bdbad0bc40ae258e9846e2a287fb3199fc8890319dc5f31a914adb4c3583d3281c84a6642c436354aaacb04f65545fdc5ab4487c83f75645501c20942b7cec09070b7ef9eced879453be9858c2b01954c1c2bb278964f7e81862eb8c9168744a22d507a422936813675e646dfdb7cbcafe8700e8c35f9b5b44c96ef26a979eabd4b6b4e9e1398089f50575463348ab21663637f747120812cf6912aee84f032a494eab8ae6cbe838bda3fdbc144d106c7901b8c37a3217057c05ada9d8ef81a5f6b20d8355aaf65735cc667a4a349ddefb339a1c67e2c1c6cd2d2beee943a1b9f252b50b0a542b631986343ec55c836f3c3687dea0c5e2b2fa45953b40fbb679cc5af739156075e269ee2754508e8b086759a76dfbbf871a96653140cfd13164291e2e42460e4739a1e21045aca8412c4584cb4ad07c4c47482307581a6d130049f3d1dd744a9ec73fbc81a8f3728d6912f3f118fd5fde3144b2290ee6194a1f4d199e3ae57880cc523431af31fbccfcd946e2723a6f9875ef796f6cc7c532e10071b8a4aee9926b1f06dd9c9f95fe79a1d47fdfb72f49392dc76b16a7d81e92b3a044d910ab0e4398f60e646ce3490b0ef36bdae7348c8dcacb2071802cd8b5010cc32494ffe327575e6177ed3f656b78f12e8d5904a0d941630acbaffd496ba42809a22175872413c3f0680daec25a3cbdea7e4f35df294c5dcfd7f4227db9ed13e5c21c89c9d3d886f47e115638f65cc2d5ed3b8dccad13112f69db2c9649611d76b62a95dc9e8315a25d00052be82d14f151660fde8511b58d456c8a913be54a9ef44cf5f95286085499906aa7a0530c30e419e3ff462e194ee52cabfb29e1949edc2edf86146741324549872456ade0c2ecf6f319a998fe3450d0980cb2f242c43b133ad952dfe17e046d5029935a81b57ef09951b719cd30bef3dcfa9fce1ee322cbd4bd320cea149b358b296e05e58728bc6e413e0b1daa194ce4bb66c5356a51dd27dec8b84a88c1f57acd494edb321202bc96115ef0ed3ef3c45ccdb136737f57bf974581edcbb804d33bad0e02549ad600b9d26bc68880d8c9eb93039c0ba10e84b409404f7b7f06c2ef9f3848184bcf03acffe174d88d2b76a3531f7ef597c82a930f1bf4eeacd65f05d61a3df2d049fc13c09a267b7c5a20af0502d62e99ac35a3b86fc7fdc4845baa0b1e4b44ce882e1c303724c7ab30a96e485ecaa826d05063f0f2c109fff18d7f4917686ac1ce44ed4bf7312ba727f52e0e07f8d40031cd163e6a6f10b23d28e942f1727746d0e124409b69dd76cc9069779292c006e4ad6ef0be08ffb74f8f9464b13fd0116bf4cd478c601e6437dd09af2c322b70edfa5f7d914a0b693dc267da7b9d04bd34304dfe88c808e86eddd9aa62c5bee3f4147476925397d650273d6a0c849cbe7c98bf32ca23b0a519336fc51386290e71c56502fc8888120427fa441b888896297e2bdf6d6a0631e1327d1ce99d42fb840be7e71b4fec45aa09f7e5b5d81c003797ed458e44887f2b4713b00825f1f9b65da8d497cb4bfca8d8e1e80be4138e3ee75dfb559b8f16655109dee3621b9760673d6c9d339e100a7b4a62a45fed5087dbf502128e3588a45b41b5e330a1d23579a540a7baca86359eb5aa08bcff569d5d032dc2d128d5748cb5bf12405ecd368fbe1bcc33a919e4faadc79507d682d3de19fef300ef7736c68185a03960a17ad81b4cf6c357ff734c93bedaa338a6cececa067ec0c816e2d62cc742e1544d6d2ca04d14777732595fd9da6fb3f2148c525bf1a418b2a16c11b2ae7400754ff1becbc2b8ebcded8aff89f73b22b671454a7ddf483faacb42c98a3e0355b1bdc88b5003a059a8f5e48d5d9118b0f962795a526d05bc872b8e6d8176b7fef91e1baac83d76d7a95b968e80adf92a3f3f6d952b9d8ca14871dbf9e64b45595f00942e4c4f1ba824923fa204c1cfa21484a3089b8f51e64bdf87377c250bc1dde26446e3931fa0a506a4e2c5640901313e104379c67c15b8bdb10b689f87a7a21bb5edfd787b9d48b89e8d39561b8afc63b61c2eb428ae0c1d1ae0d7ba0c744341408438404dd082b3c0c40487639e531be166d22169ecaec36b85fd6107a30660ce4d139d11a6c9ae4b9325cb219426533d19fef953f3c369cfa17618fd274152ac92c3f5b26a4eb2c23d07c0bbc772bdd9404199bc71fa8f34541e8850d6469000979281f08c5222f6466f7df71b4aa7fac549664bcce1585c47f2cafa45c826912f9a760675c02289b2a90503754b214369b40cef34b9d3ba15871811a633147a8d71310eb41ba775e55bd9c20a62050c424df110ce9a931527e7ccbe88646aab1682ce3ab08085cce487391f862b075fc8c73f69332f09e7ad44a79c9459804208e82996cc923d2b1196a37ae5ad9f8f9f89054aa4c4280d7adc19cb53da411842ca6f96e74ff264ee7013c3d1d7414e65a42c7378b99686aec4fa37282eed814814d3897b5a96caadccebd9f3104f24eed79877a796cb44896aedbd5260f0b61607c7651b0f60b38949f9e48a739633ae0954716e3e6e20d6ca31d0afce53ac7749f5cca8d4c10f44d706981644774ed4a19517a16987047bea685386295847f5176fd812c5cf5ea2973edccee0a9feaea9f38e1592c86f409c7a41101410b851ebc2daec579f99c4ae9f483985585a2675d4c87d60b8dafc8623cb2ceace40b7e366c0f00a1e1a1e69c0277f4cbbfc69039d3ffc8acbc491789f5138fd1ebf8ca70f914b7209b1d9e7495be883eb2467462c10b20da19296cdaddb9e137069931a760e664f50e32ad27dd7ffa9aacf66b6f758d434fedf05754516cbedfe6596b97305b6422005ccbf19611ef195558f64545dce429821be42e3e1d446e0052e44fca1983a2edf7baf128080333f5b220602007132c7903eb99ffee155101ec5e7c7b9056102c1877f83bdffc1e2d58bc6158f5f92dc090781c1d2fcc54a70a7de7d9ac8ddfe85a80062ca75127949cfa501e15acb33ed7f97a9f41ee340ec92564db58727c1bbf9b682684d4f5e050667eacba1c0546855e03465a14018afe2a615ef49afa0b62e2849e3111cdbb01eae290a4aa73f75c72f54dba38cf05b0c4ebc309fa2b647efcf4f9482439b8db7e7fa27bea89521a1906c9ce6436bedcca9d5ae311710f7111ca23333dd09a329786f5fada27c62153c370a5e25a6b7e437048bf3959452a1eb36a57cc3ab596a04679c4f0c11899256cf17adfd9538a529c32238aedd18dea7463e7d9d806982edbde3b15fda6fe703fc3df02efa490640d932375568437a81f5f1d6ff673d125184a53e382375223409ceb8114cf7b38ab051f99da427b4495fd3ab705f2d8ba38d3297deb736cbb8bec186a32e4e1556c5cf1c50e8140b1ca745eecd1d061f5626dd71448176a6e4f0aa5e04f91827358b70918aaed97e866c599cca7d87faf665c7f6efd5188781243c31d1b9c750c63d75d97bf1b6345ee41a8498080af6548d6722b686cf9efc41ddc23bc348750406d46faa0cfe608a77206fe46402990cee7af086669a766f7488b180f21f5b949c6aca74a578117479ea436e9dac749fafe3e2a8c4c8babec6ce0819ec82baa8f356d2ef2da4f5ae0a48b6d145cb0a8947aba04f5903ac30b12c0fde84d0ffdcdcd6951992e1ddb0a3bd4cdde831901450ec64215a8a362a8b762a558c01cc8fc037cc02e18406e0ca22caec0aa509b590d4dce506cc282599b65673c79822e6b8fb8347f8fa9f2837f58916b4fbb26936d14fc3f80871485a94ed4113dada3481acfa1c6713c9438c0a5d74c1bc9bbd07d6c2da26db3ac588b7c3204427aa13c2f9485606bfded0bfe0223deccf763948de4bde3f97ca510d60f37601cbbc569c52fa005629080ac5be95e187c42936a6088ec6c5e6a80db30a429808fa58e953fbaec39f93091fd2943becf378dd38513ff05537d24c637991feef5a7fc8e9163d693dffb830b46e72704dc92a44e2bde89b2ed9c00525d3e7a864f18ce2963f704d2134ab617347e8559a1a56d369bddccaff7920916f6d3f15ecb294d432cff9f6755e92c11e8caa6fe7e901fbb3dd3eee4fbee78f9b329f6647f04a87d3d50e95334e36e5d905add9f309b3a82bd6a860339401a28a3e35f08c189a40efff5c2a7eee2f526485ee48098b9fcf26862261a2a64fbea37588151fd707d4286275541376a0a102a1e5beb6a3fbd03adc618d22d4211daf414b0ce83735fd3ef314132d1e923b0fb54a5d98b709fbc4dcdca1e79061fcb9ab70b12863d46b3def952c4dd99bd3c831c821d3dee8b88b8b87834136d2b302f2a481b43eacd0d46b0702be4ff99610b953aee84f22a78cc5acfc7d7b9a77e83a7d32f0d58fe56dd050c43fef53115ab4ec60783849062c5f3fc04ac00f2e876a9efd54c4f073b030d3e4198a7ba13b244d676df3b025cec1bd28f1fa523a7e40cf5404c4ba7ff5b19722833ee2da85c63ed53f22c0f9dea790c9a65eacc150a8d1f9244216c5037a112fc58abef5929de9bc1cbac0d427da804b3199a14b65bb0cd7464ad3d494bf4e0e82a00df13435f087ae2bf38efac7a28e1897b8f045d5e843300058f1b96f786cdde57bb7d8307694fe9d5152b0fb905f037a2176ef9ee73feb1efa35e30d0cb7cb20c11d53851554aa9fd02b9f9ad8229265b32959034d72654d0592d8f42a9e96f060e0727e71c55afae97d4fa918a45822707c067d12ca25fe5e1df3b50adf28a728028ba86c1f519253b9900e58e95282383a7d226c29bdea407f561f02184cdb3cb80d695db10c5a13f34fde279f2d59d226734195bc0f41a39a7fd466fdcc12c94f8b21ca945402d0457113a6f34ff7c2be5e07f5f28af50fac02914effd2280482a25408a45678e551785dd95e065006b97a2da838465fc10b1b97f142dcc2b3c47dd5a7e8d9574e3c2f13efbce767134930b1ff984fa158c1523df14955326b30cc0b627824ee02292e6f0eef0d78ca803de584b07d5149b6f13884d81fc9638373cdae0bfd5a8835a95c9ba3125fbf5dba1df7bd9f8e3c584132fda3849182a8018a49fed85ed37d1d698fdf341c7ae05a0307bcd102ccb9990a86d01f94ab2f1d1ddaba0769d4cb108a4299f52e94401443253b1580916485ac6baac7f5389731100abbb80cdf00a4cd4c4f16a155a04f50db4b2e0574c298852c97031f63d403be200b8efd414373b489978fda6256298bd846a3f1f38c5be6c8806506b9f20142433dfe5f735809ecc8c73ab1f47ff4853cc9a3a4b119545494ca419720b9571975cfbecb28d63fc837398c0d275a603ca4ba9c0bd7a4b8ee12f018da5f28701b528a9406d3a18f93f5c039cab37c1f3d0f4e29a6d9dcb93441795d58468b0d7a4e35492ee03dd8048d87ef51986019720e7700dd566754cd5baa97e6db546657da31fc67906c294b5de6af020fd443068cf1d3ddd511e35d80d6d320a3d5346e62ffeaff349b5b5449b01fdc30db0165eb79c64e71bf1a0f9cc3a557ab0d09bacecd176633eb704d437c133e44fe0911c1c9d76268237a2286f2029deb2f1d664302623dd5ad590e04cf29069a78768b3c729aae149e6b7970d260a213423df95b5842f589a89878e4b53db237d4d94db673eb329b54db23b6d9fdb533e8924c7a88a2568f3e28b1e6a61f47e56a764e40309ca45ad5a413cdaf9314b437f35585389a367bf3a538df094378f23386b9bb37e95b87d1e4873e7644d80ff72aaeffedffb2062462f48c2fe742d87d4726432861436beca5bc7afe120fa975113284e36bac18c3a5fef7eb2277c25f6b9559590f51937a51a7dee92b181605bd1bc98f0947ec983dee97f57ea20eded3d04096c76b07bdbff34d1ae97da9c5f25ca9005e4d83e2118b1f228ac76162ffae5eef049de01a91de294ac024de69408115c0992a4634ada0b9b25ab69695f661656aac72c1828830550eacbefe3705bae6a8b8b53439dc72d53184fd6f48680f51fba94c528b2d4d91f85975a88c150ba1aad814174322185c97efaa85aaad227e778be954b9df3964d728f82a0b8367aae5f0a2079029656b42877e3042ac91454f7c37a71c00e8d269cb207300d4d0ac8ad3c378aa1a7fe057afeae6d903613d04ca3021bba6950ef6be66f2b599b6b87f924e9cb4ac90d3102bd27e9a07e6959d0d7fcb630d0b1820a7cd0ab5509e0af9bb52a356f9c1a9e24b42508d5f12df36af4c990db50e550a42a2554ad054342f15667995c58184a71e43b675f46a75ddbd4c553f543cb433dc25dec5612af2068a6d59e8fdc4860c549ad0133b3123415e39000891033a0a1a873c027ef0c37463afc6dc510941c2db315e4970a5203766f7573b334a653bacd32e9faf9e5bf8e1099d57ec2c3a467ca5ccac7ae91cc9181ec015dc7d636b023b503805cdefe15300a9c9b7ae1bbc953f35679a976d31e2964d85f82e95117bbde38f8f9a5b8b07cbb077878a8408e8c0d41e3181e09d5401215ea05e236dfceb67a8735eb7339f7c6b035b17482fcffa28d6daaa5997253bf5764e107d9041d4c12dcf0fa1d5450729c86f3bc1123dfe19874c7616863b56eb508bafb45b7072411c695d020cdfbec42abacb5e89a1c44cf793649d3274d333cc8d0b3cf741098dd58140f5999a778527c9cfdcbd3e81667d277ccb61748f2f3c16549c5a17868413366653f3ba0153c2da4204061dba97c3c0bc4287fadfe1c8e6c10c0e9d56a5d06a99d9822f19c0f011e616e964e0055597dc9dcde9dbc7098513ba5b6b728ecf301aba598fddb41ea8f2f187a3df15b0a00def9a8f39dd6529c58f979a00154bd15ce8908a44759b53912370b12790e509d93a536e5158de91353c7ddbf2b74100dc3c28683b6077dc78482f02ef67ed68088519cdc149bb1c08d9461e217079cedc2fc6d9624d91cadfe14f9aa41a122f02696c93922fa3369fb693399247162177eb6612fd5919b3820551cda2fcd05060d4101f5144d61841e4b8b11fe4c470eeccc7cbbecb9dcf97571c3f4714491185c88be13d1e5c1429654a68883c3a34bf73d0b110c6fb00bae07b5ea3f82abba236164d7d8fed51fbc4207f12a577e0fe43d9ef96f37f8efef6cae611da25d182781e0f55fb68914e59981b38b35290e2ac1ef172c296006b1a134a8f0538f5d89b41a2c5de67ead415d254043793a0a36b5c7a084c895dccdce8a886472442823bf092274438fd70ba7d1e2f48634385414ec3c4265e9b15e8a9cfa34a2a6d3e111aa0338ac0f51f37786704c1e09c7743e5bef432c021014dcacb1688120012a979f1aa9538b83b6c94b10293b863f70596ac03c3ee95e73a7437e6993e058108565be8c50953b9a6e87921ec28700b29a02b2a50287bc3bdf0e07ec34522b7d429af558575d1619025feb94b6588c34d562374c3fc378dbeb1b8beeb837aed5e2d1dbc3f7f9c72b1f893fc327c4446d30f94d638c5b2e7c90aa4ce5958d5b5cca70d7abc873f3889a3b0cf6daa739d44dc71d9c550cbf0722498d534f35cfc1264e4b1014c68228a4728e340dcc4fd3f195a2ef83bbc2f4c9b27839c9f43997002f7d2bc189b68a08eadcfc12f520205af12124b70551d398ee7596314d90bdd7f03d5a3cc28fce9ced723a04a21a2b81d5f71a70b688f1b2791610df8d8102d32f5897b934549632c0f21f17b4cc011f993412fc30d3ac826301bf306eddc014af5ce58d97aada25990487ca2c17f777cf38c20b7cf2b525b0a482b9c6c7c5850cb85445af7593d055109b75a3e3766d5867ca1e1560cd7bee25036274355e2a87765b367526e78c0ced003392051e43a004f420995ed6bca2564c1f6e7200a70bf146dc69163c26f52535ec52c4a125baf18b25c2670d3c5f3047740bd07878b4605c906007131bf0173e7181d47d1d1399eeaf6257e96ec2dbadc331c56429fafdf440ffd1a7096ac11e09983581da7390a0a5d51dee3e4dc828a5fb0a2280d54ec8b54f9a33544fd298fa2bce0727de2400c8fac3b6140204222420a7d15c3cf99c6d11645daee623aa0c87213e6c728bda0ca8db2a8b3275eb3d9757f58a54333e7e6ebc48da780385c663f0f37f8cfb81b5d782e2e50a727e52fcbe198278016f06c5faadad5a5d9e4e4463a77091e1acbfaec8f379eb8b3af35635b34c2338457792aae361c44ee49296a74519f8dceec526610e3b231f07d1c306c05f110e6191cfa7a0d823c75ec60e526f2d6a5d8134c3dd7ba983a59f39f19fd6da826487d592571f803eb1196892e4083bf359033110713d8c43b1581cc9908936e267fbe23e7279293484db065a065ba297435703d3cf4961e2b0a97d5a296359d4c3ff262b35164e0e8d260a852f33463a99738b3d72fa64962c7795e96ddf9321cbd455e31f5e23888de7d8a2dd21291676c270e2f28900c47dff8e9258cfcafd6bdce92dc05a089ec7cd002a0ac06b7c6b1837301746af43cec035cdca7170ea58e3209e1cb3100a367bc27b5d731f6f1ce8f7418fc74861cca56a521d433ff55b956372047f4ac99b824adae710e4c8ee7c6de20964b82da622e5e0d587aeacadba3bd1499f002bdd47046fc6ef304914d1a228cce9d12e6f62ca902c662762244af442f2a54cf653aff62f6053d59b75feee1d48d4c845932aa5b9c582e9cea4e0ed1f1ecd025114a0133c3121d4594471321bd7a9cb9cc65663bf899ec41000df84cd9e8d1c211b8c28824f11522ea174b129679302b82a70745882cc11f3fe25c7f92fe0e661a478da243d61b40cfa4feae64a72a689c04cb5cc47f1ab692cc66ba2876979317fc0246a2ca1ac2cf178934c54b982fb11a6619efe72ed2a5b6abcb89ed9ec265945b6973264d9984a0480a4576800c0d43417648676efce6100e8106320e75845c1dfdeda2673bd5029c7b6b1fc4330f17809d1cb0a38574c9f17f5d2939f3dc784708965f7be08ce70fad56cecbf7a0b2100664e4b59463f5ac946a39983536d335b236cc811b1e5152ba375ad3bde12ac83350a1008ca0d3678c205ae4a8bf831ec3d717c44b8073074b6b7acb139e039526352d85617b68f8572e776d0a291e604e3499a52091880f60e67c7841ae35a7c7eced99d99bf9c87c70c72e6bb04059c96b1a777ec69f82800477d551c3e9816d978c197498b3e7b8770382431eea1b2e6a5dfaccfc3de945ed6ba313ae07a1647afff28b42c12bca23df1fdc9cca3363062db0e8dd08d3f26b19b45dae2cd0fbad617411af5e5466c3fed82cc7d21ce2a048c9c4f4ad3b9e78fe3bc02978cc1bfd092de80c08bb47a316f092f03139819646bbe44694ee6e5af448de64aef1b9d34926f277936f37d4b47639db2072f89514153fc62c6252bb5dfc9a5e0bc1e613ba764c491183e240ebf28db263e1d1ca6b5578b4314d1c2c3b35cfdf9131ed88015e27a71214ca7882138818851fd0ff11f76f4bb38922c48494f4537c46b63ddd80963a9ef9c92774a553b2a03042905412c7cda91564f1dc00de4100bd6fce8b63aab3e857b7228bf5720bc0fd4ea2a147aaf6a12b4597a24edfef19f9c8a037a700f9f629a6bd8670f8b8f662946becff547bd4fa799c1711f3b26066be0f5072698d937eba4c077260d31b0eef89aafb3f4307892eee769be14312f83f1681480047d1a6e0efb30ae97ce1aa1c27af2410329fee61d0ac052e80c8836da568791316e44f033decc76d78e5a83381a3cab7788ad8230a9f02509e56039872e1b31725e8e6fcdffa3abc3fab9292c93c1d5f49448b21ed483ba6bba2a4e03a5df2e012231c5be1fa52d685171cadac2e32144be09633ddfcfa90381d2c72f5e4488d56cdc991deb5c5a91d9b54858727af1f3bf3c3aa7db02b317fd38ef1cddcebc9195be677feee7b13a8e02b5684d2d492d3e00b91d9aa38846120810195e42712ab81e21e769a22b97504bc31f6cff869bffe0f8c1ca0a00b4e3007c3061b096442202fd89375d00327b5e5e73e81bee2dc3969fd5e04f235ece2a27177b54c0d8b3070b362433f0e1dd4811a7cc1ea2f4e2cdb43803c41b5d80946a5abe29003f6b34e681589d5172d1a11b6a69ca7dccbce279801b5ab4f12b2b1efe01618aea39c36193260cec3af87209f5b61a186040aff4fe4790140261d690e5328b28cc423e921898f952159edd98125a8025081ca6245eeb68e9cc5df13f9df54b1160fb402d1e47ed223f18284b2cebcd71473875b4655c8480184b0160ab952e333cad117f6467bee2e2450982817809803ea0e2beb3c3e24af8f354ece8c96bc60625148ef3d130e18e9f24dc77e00c4b804a7b864e65a22b96ef2f1c1843f15488213b8c47406ebfdf8a0731d70f68704a3bd38e36676cb20bacb61cd926ee420099590f5f02a62f8890949d922178ea4f8aa2f4c8d463cf9b4373c9e3c2f64a66e984991689d8a4d057300e4a177c1ddadbc24e864884d4ba2e53eb316260c3e9cd5f0900dd6f5fafb2ddcee7c1e9077e7854ee989accf70d37c0080c24ffd8470971f4297f804685289ea1a600be3fefaf6bbdc5f84d3e58e1c26e9580ab8223992bb8fff0a2f2b02d1ba13b4a164061c377569d9c4a77bb8bf99de13bb7a4e733da5b91dadc43637dc8fd0e361492c135ddff382dc95af8fbc4333cb292ecfa227a11b8a4aa73f93df94596632e8aba4547313b9b6cc37915c84bd2d4222478959cd88d8f8c23348dcbe4524c7f3bbb05b30216bed8e0d7c3ef57d2c012948ac762170c7110008a47d44bb04828a442db55dc2de3f1ec1d83da12d4030714717074468941facb522b18b06aa4888cc62d44b727e2e5eba82fe3d7b0e39990472295ae18295bf25fdfdd435661a68c6d6b184117069d26b1bc784466c60d5a6caffa241f872bf394576e906e357844f7b6e1acc33658f596093a8c908d0a46568e00fbca34185506e36c7ec3c7ed61f26eadd3284b490037c1c77a5f687dcf958a0845c2caa975c034a85cd9b5aa0d891492b7d9681a26dd2a429dcd6ce962a3adf37bae2e9448725d070859cb28e4bec4ddc983f997683b5ac44352aaa941089c3a7a8ec420919bb734643e81dcee402e4141544cf42d813621d13ffd5839cc6f4a19fb292232415eeb5fcdb4c750091a57d5599cef414c4ac64ab5900a0ce595eb025c5d874e53a9f3140b67d320ecfefc6e6b1791505b101579725f373885ba24cf2eb1897f6d8cb6cfcec676a2c1250f06a94eba42382728866b4d63cedf50f015262274ddb274467842454e2b80d426bd501d37f71fcc0b80b2a0009db33e1c6d2a00938b93209ce4b12f47c7ba46f260fce28a10d48d491acea8875eae60c5e5a7a2fc9b796615926e7c1e536ee1f116a0a623357a059afe7cf304a6b638c80dfc2d29d3646cf60129856a5185b22f533af39c8cded9aad971ed3614835cdde5687995cad8092e02b4f7dba78838e7cb66fb315cc20d2cd3fda2bd15a53b40c3ff4932f040bbc8a2b78f3d8357db140bdc4071c1758e5a1be41b99c3ebe7197d290fa9ce3dc36bb4356014234dc4bcada5ebbe2229e8fe5329d8245e3c38609ea40394e7d9434e750bc786662297a0080945b2bbb2096c75a0883894c493e5ff0da3c8a17fe6f9aef87449ac080aaa34d87128c42ce86daeee5b48f5f9ea3e4f2f924f3ef604d4be6a214e4f40d0a50f0255271e341992215e22ded8bd2dd1cb6a7bdd513bd060c6303e45206972727279c9ec8b6a753b56c6f0062dbbd77e5bd72d6f9c63c203cb501f06e1be0e4b701568be0fe5858dad85539866b69b742ab94f2b7dd717b5c5bbeee230f1c3ff2e202c9cfdbaf729773a0b1e8be4fd798fc50e739b63fae76482243c811973d3c71be065def90d031ce19028a6964ac380366012247165b5854506cc60730077bea26b4149e5fdddd54c1244f24052efd9d97e12842608d55b68cfe7a01e9c5b5c3889454bd580420f789a1c6622750a10b5702c0d6cf3827bcc027b9dd8aed88c4adbb97576c1280c21ba1072903b581319ea6a362c6fef7d7e04b4f65638eddb196130f656d7655c6d45677b037943ee1f1f5ae2e17d6dea9a067116c3fa612dd5f48f8969b077ff22d98c609f72b24b76399e2fe5a4c66f9e1494b07ada99480f2b918a9e4a5c2044d6d1965bca499f1460114bf856f7e93d96ffcf6b182ea8b1a31746227f10d78c046427e85089db3e0a9a96ff42347dbf2d85a9518e74b4ce708f87f8cac25d85109e2e2ea35f2a47dee43e67d409f04841a0c1178fd1097ce9b93a9ce9b81815efa18c98b94eae6acf2cc0239da33e34fe32d53c42618ea367156822254b4da0ec629750f4bc3052d23f69a164d566ece92f160e16c61beb09221ac50f758a7930d1f2dd36c504ec4660079dd03ff445e56ec8eb052a2185c34d96450a1debf0c968d295634392b294ea2e9a03fd67b6a33d82cdec2fe0729b37125b216a12a505651fe1ad68d7546bbc0001d7e8a25d7e67c80a1e72f1a15b925ddff91501686af1800b181a51ca0779b2815ef1d89deb4296d78e146510780b4bd0b8c00ff219a937be7c9516256c00ed3dbd7082d7d08bfca909cf1ac7ed26a59b8dda8812327ead849520f5720ca61fe7687b1897cc8bca41ecff590311a520fe4323245efe370bd9ea6e014484dc10e181d04075624e874e932c318926e61d38f460fae45b7002bd7901bcde28800398723d044e368c21d8b131771d557c5f962b9e9e4fbf80eb4a32bf2f9733e9947ff6a3ab770fcbf592abee82b6c1d07ff2408354e357e2cab1be25bfabf900ca0479776eb0d4a96a8f3e481ce8aec5f41af2ab7d807514e706255855841734e3c5a602b5ccd410652e0cca0ad5f82e9a0c5b36c32e897bf047f6a750f7333270bf334207ee0f4f6c3244198b9d02ec176fd128236ff6c16dcb9de35854b40cd8c405db80ff081d32e27194c5581037bbd530b135c534c15177aad35463335f4f504d1c02493b07e99d24c05b92ea310e1abbfca85ac6baa56000a5aaf3c918239f444253886c0f2dae2ba2918eab790febedc8e92127573dc5ea29ee1bf23bd81467d8a1e822218f483f7ad695e54b59b72cc665df4c4cdee4c69bdaa0b6f5122f2d76eefb4b0cd9881abe631c9131ce46cd1094c62f90c68aa16591749e8ea786942a6233ccbe307581aeea4d464a5dcf3e73f8464984e798ce4879b099c3d5971d1fadbe17eeef41efc6a10c75a977ab4fd8492d31ee12cc3cec3d69affde441ef80a57f7854dbe0599f7e58ea8d8a8dba79117271ad5384fd94328c5436710d83bcdd13bbab7bc713856a5f56febd9e4af33aa0eda684adf2b0ed62b9ed451ef9888afe71795f10c61fb606b5bf673274251814e5d3b945feae0fc9816629ee8a2bbe328bc24b835523d281faed3c41340ddc5114e76db12388b0ade5f6083528115f3a07b3151e9a6a24ce8b71a595ff9ea224fd1435870827e81488bd1209c73ea887d66984074cbeb64c2f114037fd768933a5f531261002dfb6ea3af2cded96c06777f99754b1c916cb6db285e93bc74d017cb11202d47b2d9b1724d177c4a3e0272393af4101896a50f216a1a1d92d3e56b812dd49515415991d073f08fbebd067f68048d1cbf1830729d653fa084222a520eeef2726496ce65d485074b2b12c6916e6b5b5d0fc6b2b1d3b1d368afa2f4ee157daa4925c1b0bb40800b1f5e13c0a38ffb599584a3d96e83908cbf40c61199ddeb7d2d5901ef8826968e068158af5c086a8b23d83a48442ac1fc1a27cda9a5584c83b214c0900bc0eb0aa4cf503d7a436cf18ec1bab98535e72943bb26416aa9fd1c9b8382652db452dde8f33b6d464e8a8b730d33b4e7ab2d8739500b141fe36afe1aab1f57024e67f40180e5d8c13c9b3e8145b664280354a653e1b0ea74df361b0dfad9c5d66cf536f0f789c624171bd36f36b1ba60c543d94c47e03136272dc51a271e65d754a2fe41277bb2b76636839cbfce6cf73fc2adc3d33983e50aff6c5e97b2b3a577e19ca9fda510a92ef0aeb66d737a95cf28e468ee15bb2ea15c9c7d0882218bb73921cfa851e819c81707feefd7df59d4cb3d5ff47ced582e457acb145f314f5f053282c4399477fdb1b2083fc3689de10104e8ad67b837751703e20ea1f41fd31d73dc9a31aefbae4166be6134a1a2fd8f95888635751919efbce21548c7d09dec4201ce3422f9b571caa845b58f17e96668530317ae453fe7eca0ac129047e7e19964615038eede3f0006fcedba5c5db475d385739c5c9dee924664d383c8ab3baa3cf6db394a0168f27f8c261a88f1fa8de346d69fae58bd2983de20ba0e533793dd5de80f4e4f9e24887a1795566619f45e30dbb843462990ec3f3dd98012271d33dba87d4bb438a9acc274168c527bbad499f44d47512cf98ffac93a273fb7fa654e2020ef064ea66636d4558179bafd5522baa106b7673491a0620b52f486c60eb1876e1ba071561cfd904657f592d00caa7bc34625af8aeda52e2796a29b3d81c30e819d964016ba102317fa520b53a2e169a30174ed70d2494c0d6b5194c468065654de36580225370ba6bd4e908f87db97deb4d7aef3cb5e7a46e11fb0edf432863447792970030e5c434c31935d8ae379942ac6b40c6c16f0c24cc9f25d8a6f92defc969323e71f43c74a7ac7a205fb704f0be676c1d8799b1be3c1885495635b31a6370e403f9e2a81a440eba3831395745f92740b57ae21a377da0d709bcfd2d9d4cc11b6dc7d22e92e99fd46d8a2ad383fd433b70b511e8a38f8b1959fbfe79009e09830eb87f3a885da7f6c1ef5e3aac2af2640559496ae4f0392988000442705b4c511315b835b76c1b2c8451d5d13161542688a8316b3067dc11dc5e3e8e2f82eaf3ad2bc0ed66617227299809170653b969317904dbb435360f40e18fc71d14c16476ac0f31ee50e72c90e6a4ea25a99b53d6114e1f9621bd463e0915d11c14dcc392d296f254f8b7ba5bfe0fcf9cd42fb5153b15577743b79dc387586e5044c3937bb5033d97632054c62eb0a262f2d2101a6fa1ca718716cc693e5ee3ac5c9c17c5061de1cb78245ac6427972587114acbf26e05218674e6cf0d3b30fea5afac23db7226c9e2088161bac1f97761c2e049eecda93f5292a42cef728d6508f08874c84632943babe90d8d8bf85f64c19558fc3d7fee5f3b91abb6bd3ac1842bf4942562341eb56f5cc1cb36aee554c5eb75fd7afb97c0aabd903e2396431271b36369f188e4f2c223775e0ffcbfe1d6aa020404e66033e8ae9540aa029de496f355fac16ca6c40a2e741fbc588c504705d2f170e71b2356c8b857984be814d003ba17afcb158ba9336f9301b537560e97315802e64d4593a6dcf503226be2a15be046b93878240556933cf980e3d8ec0284d0a4e60b80dcebf007ecb306105f4767a14fca3833d746ff7d62bfcfec08a79b9164631125fe2933bc6a404dc02475fb35c734300852a9dbe365cef44637049a48f37188baa767b1c08cc206696bf20394400c92770013d533a133843db37506b2d85c9e9545fa106454c364dacecb63b94e46d438209fa09ddecd0337789b5413ec87d374041b50efa93f2ed030adf517157ce9dc5f0d876d5943a593009f0ee78421ad55205646fa1b3ed312f0f10e15d39b741473c07e200eb27ac38212b361f6ca9dc6a79b62f99c4ef379ea89c34f81e05e1205500855d821ca17beb9135d7cd739d5e0cce940f1b3d08cff3a58030323dc2696b8833b05b4f8274275c8b1226a56e149537511e7e8e35c212d0d4776c660187a077afcd3d088ef03820b98b5108fef9743713d9f07c59fb31cab9b8ece1a6a0cfff5d16381cc080a8fbee9eaa07bb36b824ec1cbace6f8954a20ebea4539d48fd06d6354ce9bcec480a6292a37ddd355c10c6fac303a649d36b48c4bae21e93c79ad9032dd33c73fdd8890134364baf51eed9701e4f44d2b7006fa683953d8fc6fc8e8c015bd8ebafbaba44b483ebc68c81434da3a1e8c7be31d75b1553e93f56fb468a4a64b6c782f6d8c010fdfa986e1543da0fe66094ea912c5109fd5096f611958b1f5e6c7bc1c30bd5ef849b55f989bc4b7e6db019ab75f34bd7c61535dd331d9ce64d26f8a0d1abb21bde3a1c01ed9cbe0b915f301ea25e601b83f2cc7e43c37e24c5620c4cf06ff37a3569fcb9b77fb68012ba5a2c7576dfb64c937da127d0d30bde274029dcaa2d34d371a4466a633022130bd00816a7558e721d9b6a842daee193bd391c73a87fa3ff9c24034f6d8998eadefb30321b9c8f0299ebb729f5d2a6c30eff58bad69fe069ded4d7ca9a3374d97eb42e4e6682f9400f71b4b7a54b3ec6508fad275afb5f3a9e6c20d13a4643358420c6ba5da609c387c18c850a4f9676f599b21978db476336ef8ac5e1194947c12ca4d45271f41979b2c46a8845a715278675d068ee1db6ef47ce5927a904df8682611d9c8a426a85e30ca50f7101ca8cbb10f1cd450cb4acd6342d503ddbfd876d4e874fc8c587f0a83b4ef5673efc13ffba497b5d8d60806c81041506ad52445a24713a301a2860c15edf81f80ea95a1af5b27d0b37da363596473513bc1bc90c50c42d0888c1e0c07a8b48a97c27a5fcda09ab0aa281426f127b7a51c7c3bef6f5db6c63d25cd8fa64dc997406dac4c761a37ff27c1a0c3634255089e99ddc575f5944c5ba75868dd26110ea777d451dbe15ec2bc0dc013d2597db6ecf68103c836bed798f7ae0fe366ba11a20007d070b20febebf315862232072d717a86ece1f6120b9d03b87209d4173e5137a30b8144b921a5274047d1b50c584b581d8ebf2aa43e9d431b844f686d262157b5494bacd70b770b9067e9c5267d4299c66e26a9e1e80097b886c0812f4a1c37611c19e415c761e610de1ce5e3326da531cfa37d66a2aebc751b48f5186684f39a9faa3a82e2413e3e5c8ec23bf8ebb81631b92dc68e51d0001d2e2bb376435d87698086ed120c5389432b879c4d7a3f9f08ba3a66ad840973ec7fee32fb294ea237e9969c9198f8d78fec78b151d673450f91f8533018256d123644406da0156d30a42ac3d4e417ae443c24c1238d49eb7f0951331475b6960669dac25d2e3535f8b8247a8970487444e87c202f20caa97acc55ae96f9b07aa882c7b0f0f7bdcf8ef451b1313f0a8c3edd9f0ae2017656c8785573c6128e59823aa265cc6ad95a9435b5d6c1f644e490f086a408306a7ce352a26a0f282c46cbef0d600f488e066742f3d960d0484e1227f21d2a70b132728d65d4984a28d5f34cb19a098463606edc292ad0d0c48e35428ac66fbb518c5d8d4d108856e5f7728598a7f71e4e910ad32a7bb76721d1d11ac7de5bce2529658a1c6fe91838cffd1d0f5407652cfa8fefb7e2c8b7ace97a61cb04b4cf3c481b74a84ded1b9b29f077515f8025f3ae5ea1279100ea1b48ebf076ec12c692be4ee64b58bf504b6bd1ae098d283562eb95a4bcb051c8b540fae2a92ab8b4de707ac4b1e37999cfb1ddc3ba472fa39e8036e6a5490fbe40aeb13b4aaaed94c77890a5722848b648742752c5c83372768be145a24652e4d489b98d29fdfc18c2cbf0623650a234a0cc7640fb403b608848e75b8b7b6cc56406f98ccfe2191774a43d68c77c2d6c32d06d16b2849af2783573494b71843cfc413b42880e179217815f3987086984330e830959af84095cd0c071a2956bfc711f3e0a906a0faf73d6ab9fd2efd4c06c2155d461e4517d47b2417de36186c7a1a6d228fc7bb9548a26d648afc9be300b18ccc7817ea1cd4855699e3b34e16777dd41ced6b6f81c3a67fefab0283f4587e0662afacefba47264239080d9e7feaa8595cc68c7f1a1d8adb9579e5f19e6ad4d232bd04cc9e39fbeadeb2d9407f2571d667a6f7a3f91cfa69d2c1dae5ba7b0c226ec5698cdbf56e9277fc980234fbc28c38c5ed6e98f30ba18fea06166adec319de2f8cd6977a74401d60f9e2f1265b65fda2a47010c7f0a90db84e46a8cf5abbe5e9efcdb9f60464c981d56bd84b352298eade0df26c436368962988425d01c8bcf8cc7663c8041b5d659c53f1bfcf95516abed1c12b5e5ce59a84bcc33a5a7a085d49c96cfc5904535d52118ebe93d01a3c163ddd2aeca952ef1abdf4ea8ff9ed0b49bea90d50473323177133e0eb835530337f29ea6b897ac0abaea7fe405febd91ff4b605384dc7939a635c508c32277c61ab0d4ace857069737e5e39f1936b5fb40d6b2a1b65cfcdef4af5c2b919d9ac012a3512b2f5f4f5fa7e67245334c68fc5edf08be31d8e0cbefd6eb00fb6fcb762cdb006791ac7d18ffa0a007598a3f7c9fc8fb679add714265f5042c5449017ae73337c19818818de7304e30be96c85b73a0728aa24c24ff486ff49c2d49e9972c1a8d7684b7325a9b7088e3fff849d6dbf519ca0ea0da3c817d91146c2623615881811e53304f39c57d47d750751141c06a41432adf84cd7360ea5dc9945684cc18bf96e61b9107bc8af9ec8f31fe37d522eaa99a920c2d19d6e283eef98152565be0d6a84a2c39ebd542935aa096da9ea147376533324b5f4283a61164a1fa42dee436be456d4b226ebaf0ac50424ebace3b591456afb181f8b9f71192ac9ae1e0ec0e4d8a67973aad3caa988698a5eccaf7691cf70c78108a0f2a1f31e3673a30b6f9c06b4087c4d531491abe2510f32772879a4c51ec3d253e2e6df3b5f1642f3832553a15777fef83ad00ca265b1ca2fffb12a8a5971daa01e67feecabbbcf3ce1898a5f375a46876ebbab7a0e26142e7a712a5477d93d7b6cb24b33e0a564089b0dac45f7dc39ff328b3b60d6033d11350933108dbab24b5b0a9fe9532c0df5c85ef1bde89059b241dc6c818c6169907556247c9b1f6e81b2f42f1edade5c92531d2280a3e92e88d74d2654803a38eb6c068254f09ad55b6211edc6f29df67198c7603ca2d20de6723f043eebd762211caf74c940e0c740826a7e0ce48d641b4eda9480163b53fc9ac8dc3908b3fc93e08397b79ac6aa267bd55e1beb683f702348cf1bd5e4603b02435a90647b67d4f38062c0d4209c11840caf4f80ca6f935b4bd5e56d0a7d0884635210723f6d280c2a972eb1ac544e18a1dbe629c5e47398c95320fa0c841f3063489f5fc8dc63811a39ce24dc4ff38218eff2d1133a3a169451ee52dbba96bae11e887f51e9d49bcbeef55633de9bf6afb38124e638454c6b8f557430a23cf36a29f78369a55b17abb2860fb1540acaf56edc38e35e31ca5767a4d492746863c0b2b933405aeb89b143170b3a44ad4a5c05e53d3bea7908d6aa7c211153595263f08459a2865f84f11128d8d25f4bf9bfdb13b36712b319ff7af651a88785ff7afe0fb4a86abee64f471881a81580a248573c8180efa0461b5b10442b247c5306da23237c3aeca8da4336610ae973d0361a13dceacab1a686855172df6dc337ad316cb00a368943252e0e9847b313b354098b69efa89435053046f0c2a07b102a9c8151f68f695ca2b8debdbea506cba55a9dc5bcef09a2f31a2fa341afc58265fad571445a56a6df5ba8b33e4c4ca42672a615d59bf086a55297e8fc9b7ebac8a53db53256b915578834608eee0f0a9c0d84c40cdf2544da5e981050c95c3a496a5a2f02b93be9bdcbfa03194db4ba449e72aec4159b98795bd801b5ace93625a155af90deca25eb6bbd8b720558e43c088dc2742c37a3b2672bbdf612fca783fe5d1abe59e3fef208e085c048edbda89e434b4e3ab927987f955c8dbe1e8bc110c6679a1c6e7face6b6fc8f8b609dd21c12063d3a5f160150ce6b88dc00c102aa7c00c681009e1147e432c395e086fbb08704928e98d110ae8f9994c423f19f2fbb7091394e091f8652fbcd7baea800097485282c249b63a32fb81b64e595c66fe2c15f6c271df746f9079cf3cb6eecf85d0d6d9d05dbb66c4abcd9c308406634d658fa722ac4a033a4a1e785a304e4a4e07bbfeff03cc58ad44e9324ccc88960ff89e1790b30c3dc539d7d825228e8aaaf2f2cbd687ac8f3f40bb0a184f0b5401742b65987d29fd1992572fe76f2070f938b82f45bbe979bdfa5816f2a8edb626b79432a52403970729079e071f553fab573be13e547d0da5931aa4dff3c6caeb439f4b6a271d73253a1583e2ad2ac00d9c18146f8c430a70332782f186322ee7735d30b0b07d2d9d473aada344ed469ff91cf93ecf049c08e1393229fcf3465b114b6ed7dece8db6228c5c3a0127567826e0c44ab41521e4f24b1585e857a3507c5815cb3abac8ebb812638c14836a114706bc821b6bae2f568a189f93c418053a287e6d62a3b8a6443146dc1d6b6ca8e3461a5c5c3fd645c38b8d1faf0fd8600477346175dcf82670128742074b901a8cafa4032018297ebf601c159f6df1b9169f9b64ad6a319d6d83dd629e9f0af2fe98d75f02f9935ad42b00f97e340863ca865f347f84f9e08481c0830253476c8a5b641c65373fe4dc49e6ce079accccfdb9ec92edfffba3877ce89729f258d3b4dca0a2705a2206998c206e80c288cdac0828d97cd87c22afc28a468011f13c43c6c6a7373ab549f2bcb05e1b22ec6aaa8d9495795343ab755557b59689c14574a452ddc0c4b0c38dd22d0bcd02bdf56aadd6556b130b09cbdde8d466881bc2ba2c76dee8d44649872090f8d39eeddefd523adf46e2e9d9968bb69ccdceda21bf7b36c8be4303b888ad882dda1050c4061485fabb8180a08432f675f72092f985cea7c9c6077cf9f2e5004e5f984a1781985b56caefc745b9593b9ef07c8140f27bc63a514a5815976c73c34a00376cb169721d0b9b34ae9e5dc943d731deb885a9e6eddd354c5fb6fc956d74b6b57a932e32c0c6e74be95306f48cee0039881f5058c3cab34b53b0626574ff49fd65e3cb9bc1c60fab67f9703edb7097ad5ce5a4bb752a315abb13e5906cb0df48753be7754c2a381c1728388e092e356eb500a92fb2c079a2868c942635c8c288c4060b345c7c101275240b6394d3ed88db5237206e4960605c88ba8ba0e0a1d8dc5db9eeeee76253ea725dfaf3fb1a5f58afc7e86c3aa21eaaf3b95f75f33523285f2502ae9f8c42923e8312c8a5cfd4d5af7ab1ac7b7d3168fe4a0077feff001a70fd995ae08bdc3a1c85e64e74590f2238bf00255c7f56bd62d09cd20307d897c7bcb97bc41a05c2d6222a23eced6888853169644e5a2aacea46a7db90dbf560e3d8b9c30d89d02871838d4d1921968248e93247088dc919229058f3c6ba766e745a73e6b26e745a03e68660940b48f024b941a4630d169e99a443c21585a4dda995d17431c6bc297d559807c56ffa4989668903ae900983e50b0e462c2d0932248a8b0c608eb268f1a6998ca2f4d4814ee9378874443051b008e304931a0c48d658e9a9034f14331cb1e60531489864f546a73554b0a83502495061e64b1422a46052e256c04d255dbe1061459a327374605202091c2553cd446726410107850a0884214920b18648134fbc90e1c8ea0434244f5f6e4b38718491234a68e55aaea9e176373aada1a179d96e1c24b1521dd49f82e759ff4c79439ec9990d2856eaf6ef58b2a12bfc312fcc67cee73b3fb08325b2fb19a99f67fd4c637abdea0e9128a9a4723a11acf3765c443adfe7d5da59fbc5c8ae8a41fcf18df216b6354839aac10e9604e04a0e28c0b2a40555684e054e116bce4c19a10649237950116b7e7dd4a0ff8e1136e428d01f8ad092fdeb2f6426ca63309fb20d9a90c4869e8d28f66fc84a3cdcdf956491948e6ab5a1eb1f8c1d7f18ec60afc070bb7c6337611b1945a89a95cb7da12bd6068b7a28da88428e028f06fd6fcc60c37aeb21f97f276b073395cccc2ffaf1f50116ee07f8ab43ac106c83267490bf98a532b52630d627f26f80070a2c3d77b9accdd681c3ba2e736af2c2cdc256c161bd6198e5858dcfdde8a466cb125dc76895cf5d3d88717447281dab77cd5f146a568d42fd7ebd827149cfb32d971a2c44b8e639a959c1113720cc10070423465eabf35a3f1e6562a5f4c3bca9e1a16bc1f2dce8a4e628891655e85363b256ae7a102ceceefebabb1d49acd5afcf69094287b276b8cca28adb3fab125380110346079a2582d0a4b9a2092c9a60f1459a2f773e511653b270a7a92e3c698b135c0df3f59938535ece50b9dd2a2a9d7f04e28f92a5fcc4d8f8f546a7334d2e17ce065b6f7442220314e346a72448c8993f7f5028740c850ee297929a9abadd0827c2991d45edd8020805a2a2a2a2a2a24c689083f893d674b1876214d777c487a2a58859b83648b9d97447443418cfc0f02b0a5fd81f6f0f1b3c58fe28c7d6774929a5548a4287055317dc500715446480444a0719635aa031664c8b8c129f192d891771283d649fdf7fe0e1f71a9bcbcee4b6cb3dcfef65607ce8696ed7e90cd2f53897a55412e343e9e4f2c75042b9cc0c67a6b4c4537c4b826293f2230fbde94649bbecdd181f5db831627c3533c58df12dd68e187688bbad87c1dad19230aca072617c0f6b078c180bb29ee761ede8a9dee5f9d6e5b93c2f7be883cb43e67679ca287179aca8e1f29059c1e579cbdac1f3f677583bec8ece0d5b77a7e9ee5471c4dd2133c3ddd9c2d5c498244f4851912a2ab610b1408ecdc10229574a1b53c8b92d59e9c6609e37f6e94f14d612027110c6e84b9829ee1413839829a610e2c29a7081a102004f6a5c53829932e7e492c39cd20037f4bebcf9a2e476532f3a4ee98280af6360030df66701a2c88d59a4c4b17163162950b7c83de9ee719df79d74ef1511002539d66c4651ba34d214421a79c38d4e5da4ae931727b7d90a474590d799e55f6316034054e1d26b54d3871004c3449919ba7881d6021844c66cf1c5cc911358210b63142d42bafd55caf5aeeec6a717647045552d5d83159dfa714a6cb623e240d5ce88a9a1ccca891ad4d8d9c30e1c8a2063060b1a6a51d0291d46a4c375db3ebd6082da73e3930bb7ebddf8e442199a021b85ea7792a5cb552b8c721c477934c80fbeeb095b1c7777b96aedeeee15c85ac17eaebdbfbf5a5dae7eeeebfef9f5bbbb0ff076c7d0ea21f935a67bb7adf496bcc09deff229953e5ed23d96cd97a5eeafe95dff7cbcee941f1692a5df68b07ad0ebcef9ea31a7f5e016a937e25429c202a2104b97ab562ae79c5fbf9bf5e5cdaed5e59a5fe7fc6451839e7c3abf5aebfdc00af5aa5ed58354f87c80d7bfa622b8e7e694523e27a594936b59d70f14b1655dcaebd5659518dc1ab7a83f02b90cc2cacad518ad03a8d950de1e929ef44f36f8d3ddf22c061700b7a8ed0d727e12366543795dcaeb555ef9faf1f83e3ce8cfb8aa4bd3c4b9ea8eacfaa1eac3b0d6bafa42f0aa54aa4ec5b79b7332a5ee2ebbee65f7450fb261a46d6f6f672929a594a33f0db28bd2293f15bcfb634e203ac77cb641e99c94523ae79cf4656dfd19aaeaf51887288dfb6376e1d21d03309e6c949e853f3333ffb8ac27bbe59dde0c5dd7bf8891be627d58f7e10737aab9f5c8a5cf57eeeaabf70945e0521983aa77ebf317feb8f419acf49d999999329dac12b8cb558e525b55602565eae27bcccac9f3fc4ceb3efca0be8b5760283acc4b5798fb22f731762aa694aa2853ea5cdcd161ad56cfe3adbafefe1556e195eb7db873dbfba2f73cb9157cf5c1517d70e80787fba87dade041fdb5391a696cc4330f8e6cfc4e880b6e7ccee0c62f5ccd29a794cdad3be59c73e5f4c6771bb36ce5a01fba38165737f6dcc87df8dd48e3468eda06a5af9c73b08dbea1bd9c235a6b7b28fe18f0dbd5c18511c1fe1068c836d8ce01dbe85cf2c1fb5e04a594cfc1fc6695f0ac1d3282fc0e833188207fbfcb43f04900bad2f5651ae9e247a01dfe5d14eaef1f20988e117eca782d3d76d6891771c48732b3504929b5d511275543f11a62cb9b34337019f28516cf892354e83439011c24b2dca67803c584347ac2a4c6d8798ddc17ba62fc1f7355e75ccd39fdcaef31a5ad3e555beda93ea029d6eb181441202e6c4fe9e473ec39552ad5bb9cafcab4011f3d4394112182fddd4996314a1dfa45cdacda3a3b2a150c54bdf7ea56205011dae3e817a390fc3c462e486deaa40bcbbaf1c9c88633f6c90849f395917b332ee5a453ba198e1a31a5735277fa9452779752bacc74ccd5e7a8648ea24056e94ae2d760ff297b4a970dc629566ea689155c21757c87ee39c70ad6bcf1c9c8c8ea091f7ac6d61b9f8c86dcd03e19b5609b58eec627215ec45a1108232c404817b7bf5a97e5b9f149c81418d5c66f7c1212d53e373e0919c2bbf149481167a500c66270e39310a4285b728f4ef8e3f62b610db16ec4104228b0310b134937ccc274b33081948529eaf64cd6233ecff6289b1f8da8610eca9f2f2ed25cb2f9e27ebee88d342b9befac10b81b3ffaa255d9fce6c83221d61a4ee7450b4c4ae7142c9732117411e82545047716cb5480cd6169c962e360b684063333d7dfd54295ebff44ae3f99800cac133386cbdc18cf3cb1e4d2078152eb51ea5ca4189aa3c39c3672ce5017ede2524ae99b8042c72c06e6e7c978ab9c242c1c8ecaea7100b433934305d672a40c611811ec0651085aa0682147c98fabca5833a2ca81a106db1773429062c983627dc241492284eb46a7253af4ddb18699637c216294bf3cc618dd99741c633002b47284b103b0f98db08735d195deec3a30182ce288eda6232282c1408e39c6586e4119ebf40599af5f68b195d9fd274e0f57479c31d7dff5850f1fa412e18018aa843912450f4a67e864a2e388a726988620ad40ce0d221d1cd3c860658d4ed86b01104cb4408b6b5560430f081c73fb65bfd7564483c54919db1b2f698e8eb09960063169d41c0184ac270fb79f3872db6b49185336048ab18caf17526edcf9dd6a424287bd96675b432cbbb174133774dc8e4c71cb16729c78c3c41b286eff7381c3ed07b92873fb6129b8fd444570b6dcfe119844a72eb2b8dddc94d317b7eed25063c31f737e64d1eb4014fc9e898d3f3fa12ad5e3ffc8d612183f11ff4f516e557926d0c31690fe3748ffa741fa320ec5abfa4a6f64dd1a33eb6e1aa40ea741eab72844a5cd83329863a5cd632da35aae0a7c29eda48ec528a428ad359415dbb32dd4dc1e6f0b319775756e270b89a4f3114dea213abda31bb6926ef8e37399f945f0cb37887eac0084465f47c73aa98398441c337412e7e0226c63488cb59e1281b0075d6f5da1ed263136e36947b9e0c39e72691b71692f71693fc198f2d88c8f8f3c88be4be7c397f1b9bcf27c21c8f330be50e8863cd5f385de0b496cc4399a8768833efd72e9f37ca190fdc2de7269435dfa3a5ff8cd74e97b5fe8fae968ab3feee5b793a2107d1987bcd856d5a9bcca5a3df7e2a041faddca53b156dfafcb3dd820fd400536fcb9f46915ea32151a62ac0e1183f8992ebfcce1b252839cc62a29d91bbdb0a1b15ad0c6d61bfa2d7ab9dd426063e58d5e6e696e5895eeca633edc4799ea6d75b96aeda692c76a103188bfcad295da652c97953c16654b77d66653558a423ec00ea6d2accda63965ed608a5aab4d55a92e49d60358a6ea227df5e8fa4eeb53fa22f8d3fe10f0a5742e4d2a0dc6a9f44267ec173294cb4dbb4f540f2221a922abbeaad4d5a23a5b57eb9a9c757441112fc93e4f8b6895e441f2e7c77801d1612507199018cf022582265b2579ac4b527d21118d6f7d216c46cf17be8ca65fd2951f0c747de1afa4eeb74af218118c2f2482f17c210cecf942d0d5257549577e046c940591d10f23ad9bcfb31b6f389fce9a2e1029f38b5188c3caf33d5fc8b7e7574811078cb74166b3c8b9970ff73cbbdcc37885f4fbc1ddd6d76307f77d20ceb9f443c05dfa13c6abe8d208d8288b320b846732d59107c9973cbbf543fa56c7e5817712cd2fa46f69cf8be77be25fd435ca63f10aa32ea0e6d8c0c5912699fc6af398fc2ae531f975ca63f2ebcd6352be6ae631f92a9ac76298db9426342481a3441732f9aa23b7af14ba586ee1c69d2fac3a5f68595fe8baf5c1d55765916502258236a344d08024608933b2fe7c4e28418cef8fb228e3b62461ab2daa41024845dd27fe315e406a4cc1822e321662fc05329a64313e211298e98469218ecce784068201263ca440d69f0f0fa320321f1e9107902032ff7c7818c9f8193e3c5cbf52e3054a881db63892cd6434c97c4e70202b3029ea181ad0e1899bac3fca7cbe41d9c115351efee2e141f267b83e195f581760c446599401f911c50726ebe00afb3ce4a320bf48fe08928b0917bc3a2eb2182f1a55087124f39278dace1c369f034adda9bf9a73491dc72b0af5108da3864a5346cc16a5a55a13d2ad06bedd647cb1337374caeb79cd36a6eca9a906b9993a88f9cb88e1b0424181a2a4b454e3b8cad1a9525dfaa6d3e0c2d8467cbe7ef9f3212194970370f9dbf93e3aa5cf395b04d27d004e96e5fc504af92c9d03a006230e599b39a7524e29a93be71d5f5128fe74295db2b7810d96dddd57aacad129573d4eb85d4ed54bca393847fdb9e21db8f6224e8be31bdcd04f396e831b2c739556d554adbc96d3d8463b8d73c4dbabce3bcf697ee4489ee4b170f0377f0820c23aed9de634a7396dc5059571fb69389df5063558fed069ab956aa5e334a7d1228e586f3d4874fc9d4ffc20774783dbedf4ed763a8bdbedbc6e5735d0c5186374f9a1bb47f91c859c6bea53baccd1cdcd365c36e76d60438d1cd9dddda3bbbbaa3d19fa3be72e95b75ffd720de46b6ac079f11576163736f88a2a36d3797556e726a592cea9aa9c06773e57e0fa73955fa9aad65a29e56f28052bb66f77c5a3fa0648a4a494ce545760b75679c46167d15d4ae9527293523ab9e61cb17563b32063cc7a5f69ed74efaa5f8e3898d93fc07398fb02408df5bfc995378387d9537532d460c4861bc26a0f56e7c62723435870ce1869a163b29c1750b4e1aad8d514376706a995125a584b58d68d4f33345144b5d576b57ab6956648add6ab4a24adaa8881bb42536931428f7072c40fd53a3161950826424d8933a28814e10838548988c32a11ecc664065b3d9b84511245da2a79e18a0d094d842b4a6f9358796284fbc1eedce8f464568d6c85d379c106ca522cb8247c28e3b900468c0f512b3956dee8e403d40d221d9cc18d4e29a0e243a7f1990ed1102af0181736f47e6ca071dd6b4b12816546856ab39909d2f4541c8a65ca8811b3a5a1a0ae7f33c5588be94ee2870225742dd56ee8e2a31bf2d1974217cb4737cd4da18beda9fb54448bdb3335ae2b7f7a46c4315f3e8d113847bf7c05700e57c451afbc6164e220ce1f1b39d877dd8862e387ae334f44dcdc7eeea7458c2e7ddee96c8ff9cc2ebb841184f3ce9f2cc9de834968225de7ea211f123e1f127c5e6f19d145b662e3139132977bf9d3f6a0df9f2da16ffc199b5542973082705ec997afa45f28e3d7437e3e24b4d7c6d275d3e7940298758d26270906247a5afa8b48134b4925a593e8c63120e160c3410b22513d74caf84424e90987a8d96cd6c2bc2109ae7cfe7c4890ef0cf871b19131c69f9633f31166a418168c4887d7f256373ec140c5ab51274c67b6904b589e050c192b6f909420c34314cb8311aff943144958e1059a2bb3283c30f1c414955b4153b954373ec1b0c415d5f9d031dd88345d91831210495aa497007894299a30496202324ce64c45216752ade361888e4c92a37222e949ae8a4018610115862312861b5cef7aa2c9b9f2c6279a17aea8ee4a5d797da2a1a1a1d5a09744f3a058db4881402deb79ad1fefa6e3c4f2dcf844b33dd1a08039a1d51863951ea368e8e22dc14bb8f4e3084ada7df906117c690367ca93244af410050268982cb9b14521cd74d4b80372a4cc388963648a9099020f3461a58a175b2cb1218b0c5fb2386a294e9852a68a27495394e430511004e9c88a23cc58a142cc16185837782828429bc98616a41336b8205b8b97da583416dd533453ed052180e8b8ca8d8cd41f5e89b5f0839794f2f51ed060f95d081bc5008621cc2c39d2029b1ab6786236f9a0a810e50d95255cc802871fe8947e834887d7f25ee0c1aba9a0e32895afd7df1ed3c7ebcaaec2840faa13a8a60f1a2cf9a10d933654d08491b3720209ad673ea1401a232544ac0891d2504685f185d5f67ca1e5f942579f1972fd2f78795407b943d9f9c277b93c6e929472ab157528efe650d5a1faccf577281e9347ef72590be5aebae6754da76b3b5db31ff21c6b2955ad388e53712b8e6bbba3e3ad62b0565ca792471e934b95e70f8ebbbb9b5b7294f26de94397754e2e5de70bb45e72c983dc996f0d7a936492b5063de49b5cbab11b8623c5d31754d1b42ed21ef8b1020d24a97ae2d5223774a3eb61234192481de4dff19cb1d65a6be5b85a5fd6d5279134e81c07c900c07491571fc579f9cce1d890e35cff304ecf8c82f8d25ebaf9cbed8813a71b1877f79e02e35fdcdd419bbb7b83e959ddf5795fdcdd3dd6e4174ea25372788293e6d3963f9865dbdcdd9b8bbb7b83a1b6b675777f691bac6dd3871f39e1e5051f7ee460dcddbd9d4bdfbacc0d4cfa26a59492caffc12c058fe131b20926a860e128f9a6862f1c65836259894a03656b2fdd42b7e0725a987181f978f978d510724b420b2c460ab8448149ada294ed0708cb911e7cfc74a9de856967c812553051a69767b3999628cfcc941344d95a04c801ea4c4b76971b306c5090b9f1355f1232303284e9eb129b74942cb569b2f9e0400613372ae0c079e65eaa77cf66b3d98ff602ce80324305f4e1924d2ded227f485b2745114836db0fae72f3c7d4c143636aa2a38b941fa5b39855c20c283353e4e56e1a2974b1fcf1f63b730c01f7483133f30db6ccdcfcdcdddddc13c5ccec35a82eeac8d40d5d47acb065be21bd9f99398339967fc9637d7928fc49c18a9dcd34b20613cbddf8cf57a58a55f5f5f501166ead3598585a8389adc1c4fac38ab0a12f71f3adb5f97e35a290bfc7583d449b228ed53b177276eb628a8d141adb98a82fd7bb498aeb2f8be874cd83fc43c7c200d5d3874094794f9fbdead5972e54c58e5074e3c9020922f3de63da8b8d8a6a70b8607343333546ea8b4d8aa8a6eb4e66d7df8943f11f5ca9872815a38ed5f6197b7b17d96006bbe431ef5d7e91c7a26fc063acf7da7d2efebe468d1a356a5c07fb55af9e19c164528744a7427ff72b46232c1f7154cc9f7f048fc967368a353ec23159acf151acf151acf151acf151acf151acf15151e5e841f13ff6ac83e2532d5c2873e6726c581fd1a4a410534af95ee84d224a79705f000ff2c1c70565a4f4966cd0b6e83b8d3c6107ee943c3cd7461cd1eba1187dae0f09e1bc31c68d9f8f9677d1c5558cd50e8ab6e7f6dca266e6001ba9ebdd5555bf63ce008d9556644d5a514135a85231775dd7755d77c7bcfab65c476375fcfbe51746840d5b2a84216c6859ca97e47be850508842fefe491e780e411ebc8266bc7866449b920ef2964a2106794b5d8771c54ea959a687a67a887b9f3f2463441ec41425e5b6ebbeea3e9f137680942076017af53fe4ed0657af273e26ec7cd7aceed1b10826ec7ccf4360e77b7ec8db7d61aff8d561a0417f14c4d830da747ee777be121475b13a1f651d4ea9160cb6691493f7ac8f2c08f83c80653d6f3fb220603f9f07b06ce73dc89b1aec91561af4e779cd290ff267bde6ed459b6854832e99ae77ef7c73014e2c95b9e4a375a11a7c9b982d52ab59a6419f5353aa41ef19c2aa3e9c52d77ffe40a9b81e6faa9733f590bf37f550d8b3abf3fe34fc89faa778542a3b03caac690d366d248d44a5baee39d26fac78e1c209738c31b21785fa6978f1828abcd18b174a6fb47883c18d5edc2c69ddf8f4025317bdd83c5bb800513f2c3113db3ad6329a94142933d043ed3caf787b5e3c2f593b78deeb1181837185ddf9f83a8f815abbf6982582fd1ecd7d2980a1dc7bfd623df762bd7392c7663cc7f8c2dafa420be34b8a41aa6715cf222b04fbaa9e22ef91dfd9977fbcaa679fdf79f9d48f977e1496f531948f931a74d22073121bf18c691d00c133feea2db161b52deb9c0fc7f51033cfcb34cc2ef316fee132f77033d762d8c8590c68369a91c0d12ef79167023d886930de10b0cf0918c8d00392a4994cc6cbf85890f132de0046b5db710630aa5d7f0318d52efbf7646600a39a8c05199f14fa52b80f7265bca4d0bff4f311009a035ab704dee1f6f744c633eb046e92c93841c65ff0177c2570bd8cef828f32679920e35da08ccfe541323ab802944134c2052f1ecccf4abcc4490ca5e399400f454d811e8a7f8bd1360d0b39b2e24856dfe517b6bbbbbbf44944e316c55ba2bb17f3918202d543f1e968899798a97f4a9f3204893848f0398104aaafeed5955cf54db399ea832716043ff0c182a0c74aa08aa9be1f4634e433a514b7bf9d046febe4f6d71709549f8f777024be605bd6f5acc44bce506eac2d7e4c9e24fc6c366b2d5d040a5947b5688d0d6b104a11077d1b96a82b97bba62a97bf436a70c7d3d1ec2259ea21a51e8a4f466e547aa8addc340d2a3538a9f8844943a5b62b0d06443aa9ab7535aeab819ce4645b49099d54a920796c2a4d246fa506b90337b62e35a8d4e00d276ce8533eb12ad51cc983aae4a6cb7de1bc1cdf2e72ae66f3aad445b9aa6bbafc0730b2306e7c3a3ae23bbb61a57200176cd8d55834560c1107f7dc74c3ee5e5e854bb10d7ebf451c53290a1d451c6c626c0611839887279c4a019ed7a8e4cd76453d08d194080000040053150000280c0a8803028148281eecb2ec1e14800d74943e6e50329807834990a2280a628c3186180008004419420c414e8d19002b6ffe96dd366308b7e0542bea00911b6f4a9d2a721caad2a02ca8931ab28a17b8520b958855a51a0c0889dbc7cc05e52407378edea7700f5446d8dcf6726242147f173f4bb72710a0783875a5618fa06553a6e9e68cb8e1f95ffc13e0de5152efb9bc48b703294ca44718f9804289730af3561d31f6fafca85f049a979ccea4130470a8a72384226c83519a9379ff962613dffba8cb0032a9cb871582288843a64b71d6edbbed61c90cd2715a32029dab2dc14581a71d2b4a7286949ced4d7d98be86bc8c23ffc36c53c62182ac190120921218a0cb3ed553f38863f9434c34ccd0f3d7595ac5a0666d61c6a709ae25161145478eea5fcff02ef99b443d8de2450477c089a62f1edfd76d7701433ea3ad3c509851d5c013dc3a32c52125149fbf27d4b8aa0be73fa23b9cfc028b781089a51e3913d89fc790732c1a0633fc4e839164b4032f797cf40a34e5ce31402f279d8b6d85e32d6a68efc00c8b4ba1896fb669801ab1e07a917f99a91a64ff4fc8bd73d3e863fa4de335c7c7856f14737f8892cfdea535c5b7e7b528b7bf6472ad1e8eb37813fe995957a41a0ededae4f8f5103446e05e1415508f0f7f5cd703554246ee3bf1b278192ef728ff5e81472febaa9d8882a77661e77dbe3d688772ec01808f280bc40497581e20431f67ca5361589f252e0c21845b97f13e8bd521d563471d94c1a2d7d3074a11151f1e714731a0bdb7e0eb2d9c9dc45d584bbea2c09a138f356efa38b0c3e07dd65e5e383154f13076a99d6fb55f75e0b650dc4c5a8a8b260b3243f44c42e2686edd49d8194ca63913d8e71a540bb4b7d5015fce312d4658e80bd78cafe86e56b9ae7731dc50eecb28d7edf8cbb20711d19a4bf691b8b705bf967c9ba8749d896c6a0ea87b93e7a55e927b1b4424c3c29d96da881ac72d2b9ebb65ed00e3f6ab218921582f92c9a32ee0735b83dbfe89543c030831f3d92c9bdd7c477934f280cb05e435c823f88c35cd6b7bbca76302be556261cb4078f1e1bf0e4abf4b155d0648d7db4ea2106ea3ba418896c60d3e7d2fce39ba77e825737d33755ca203a3160f504e5e735129f919ab7eecdcb56eee67ce26753c40b4205f594098c2d3df2aca420e8c8b8df2888642939e068dbdf39e5f1b1c7330102303f92ee3448712bce11bb49a879b1776bf52190788f8b50322049a34a57791f558e96a94c7453be9e2ab28c0aae630108752be724c1919104d993cbf3a29232773f75059d444ab3bfd545b86b8d3e5b350a6efe2b953dec4a7adc7d5b58f345aa412293082d8a1c9aaf5570e48abf28e3f87260d57b332cd1f75bbc08646ce8a82c89674a99101115eed65e3060a6441b81e503ecfa54fdd18363bd2e43876c9ca70166fed2d5f0f2c67a81b9fe2e749863fa44db694159e1e56569c09ed311411753577dcb968140b24a64192287ba961f95cf64ac458840f52bd7c5339434ad5ad45f3b13982e128a338fca3c827221ac96237181bd7fc7894167b24ac751725b652c7526e0d6bc279e38014b34550636ae4765802ac6f113e342b8b89b4356cf22116dbd8b107223840929557f5583a642d597c70b4fa8f32b455113057f7c5d8e31b530fdf2d3fd6b61e0a0e2574899465a0b688a36e7bea870995e043c56a6a4da97f54eceeb13eb389445dcdcde6a606158159c9034ae0160e5062639af61db38ba6a3486cb39305d9e4466ff473dad28e2532fadf231b916e75030242106c79ed00265bde556f67caf2cd2de85cbf527c90ad8bcf322a854384e159b29ef225c55aa9bfa25b8f83a7157fb682fbda26d27f6c655496a9f594f350f0a05a9267b54514a9db7cda94d553e44013c7bc80e37e82584736b50bf2654956ba640e7007aeb6b3e7db161a89f3fc1a973fb105a28f45faebbb3302a286b8108423d79b19d96231001a8f91d5214eeb7a9b1db703209e18456287fc457b10b940dc810e98624a37355296d0be7caf41a0f1edd5f74bcc21c2398b6479cd7078bb3230cb419d1165418d1304dbe386ddd61f996cdbc061a4c41cb4b1934fc500a8cb3ec2042b1b53be17d325e628e6289a0809022e0687d6a5a2e9ee5e5619cfe96a0f46c9eae1428d122c1915c51cb80f2e7e89485834ea09554cdf522a186b7fdde65a8a92b55ed219d3367a010c1ccc054e9e23a959943b7b73cf6b32f80229845f95dd9d7ee4da322917fb543a630c675b3d3f5b70d4328631350d1c3b89b467e5d9843d9dc6d813034ae5b74dfaec2e2da651d8b1cd4016da9d010d3ccf682f9d3868403d52ce689a182ece2f87e30c0ddb8fe3e71ec17a1f31d3783877d6e02cca69c77fe1f38d77e079d210b44a9bfa18a7fe7d8e18381d51e1ef126b6f843a5291095d4f978a1a64716b30d85f6af528fbf2fa3c76087d371ad84cd9331e1bb8759536ee6d5466605ff61b52a21b7722cb84f737816f153b696509458c07058015e910763af3de3c44e2c12e475e19e3a2b8cca0643bcb9fe9355de035c09e7a96316331c27208b8c4024f12d41187722ae264467e9c07a054ab6451a82c8242602af397031754fb09afd78eb5b4ee5d49a1271f0273d40ed39abf6a67c3ce32149a181226716ec741dc6acfa4d928038c67a0bec1eb219e13b7640b17723ab02f14906a988d43cab1449977bc181a98012cfb445a801fa77b98e5e800b81f472fa89547c18c9e8e1f39f64767d09073f9972b1b19b6146792e418756b8249d941708a494b2010553f04220a5a4ce8362870e3a9ffe068a631a2a60b2cfd1ccc0ffc88ef9d0177fe79a73569a01c8e9fca29ff09c391b27690f0744b20088243894d5a71549553ac5e15c503c170625e60ab9ce6360ff19513006234e41daae9d0875b41366cdfa7b979b428644e353ab3c3f246d1644633c2db4eba3e852c4aed1a7acfd287ad0f79f01207896f8f442f7f3a8fc23ddc76ee71429aa4a11c1cc16a1f5e551164f6aa204f2283debb9eebd85d3d3a7cd37c163bac559ef50e85b252e3e6287b308b0c3dd038897293d2a9268f2e9993389475e4afc45b1cb231248f5823356e50901049d5fe82a8e19d36cf40bb155344ec4d8e15dcfbb0a5951bb8adb16e3cee0c7d663c83dad3b53c2a6bdd7f698a541ba6e353b4c5d36835143ffd3d0d58f59d79075b18cff7e13db86d12d0c2e1a75a70eebc206ced5f21af8f82682aa45fcd5d32fae54501b1a13c99d2991f8bf76d5908927f35bd3b245b09f9a1dce48071a9437fd557568600bfe9437cf97b5dfef6f8cfa76683741bad84d5c0a34b74bd6648cd7c3a42d9529b782add61bb6c5c04f05b5ef39d41e3e0f9cf8d7b0f7891d8015c38b7ff951e9af614bb2ce51bcaeb058d0228790922a39f5db685162891582da6a79e95e38c9c6a94b8cfa21581cb8849d8b253ef64be50387666d753a1a96f007040b4eb52a4b10f0e75deea8ea7468a322e57887c818367423a6542ea2eb4d08afcb8e173ebea1c14eef57881a6ce796537e4b45d60390dc9d73f4a5b66cbda214b26b3792dde1c64b74dcd55934a41d2d42eb12ec24b5bb37bc72ee4ae1646e109fc43367183b2c2f967974f96b8ebad1f0ad020d94129c41db8ae055acf85f334cfaa571ce61780ef09af57b875831f485cf1708e4ef8d1befd9055ab509cd96623a6df7ce5ee901d44177cb0cc0f433c9098d680029db5402675a29b9504f58f6a8603457530be70f40ad26c6b5a13314bfcd344dcdced5327022d133bccc9859480f09375c2a1f12c9f5e8afe45a5f4362fb985c4c2939a288d7f992e8e36f0221028c2a09666264fe8ea004e48167fdd932800fe915258d0249441c61471808f0ba7b830e3943fc5e905daa2379d4f0582963fe4802b4661fb1ca14092a8335d26e40289ad81a43707cadcbe3a6ad0a0f0f352a482186628c13065df25b73d28986130a1d35733f9510d57fe540be232c23de91fb76db2ba4f85d456c2487080604f74e3fddd7c955e1f5353f41a30ecaa3a6bd8126b29605f749178a290b94548b35c0af93110ed3cbc5bbb4870115b6af7f7bf4a768be2de97ab3951aee9fdb78bc615deb5b10b792872aa74074c286e20e33f901d33c03e9305d17698040e379e4487f228a75c241e58648038483569bcf5910fb923403310a39cef236740ce07c87105ec26f7d13113de2103d48f85570252a4fae88667030618f15283d26fcbdef3a6417597895eb88b789db58d091c764bcfab0ad377e6fa558e19df125c4322058377c8ca82307068485bd4f6d790497b6f512b487db18249ce3b41cc8c656ee4f774d1470634102a6fc3261875701c4f04390c14cac4d6422ddc7e23a4c4b23151d1850e1ced1173d913898d4bc234f068d6a964e2e2b0a852039ee09072919ec733eeb3f79e452b9b94dc3ba817a747d46aefb0a7ee6946dc2c12b149f1d056dbfbf8b3b108b0f52af1390d3a86c4e5df60c7172f089580a8d45b933ea6e63c9896d965528112b6cca690ecdc6dc4eb46cd627354bdab7def42f45f8f2ad9e6adf4d5c5a493697b5793ff09256493f9730840d63b38e744346b48f1f1a996d7c9dc3b99560ec9811768f9e4b35b050165aece14673e26534bfb194494fe0eb2c679441482e9d7dcdf70e4ad538a54c20b2219afcaa504027c82d9959e6c0ae9d853148a725129908a8fb79cd1882a157bc9826ba1a646c51366cc9eff3b9b4e5652f3827b710cac3cae0b09713d5fe439deae3a91b731b888fb72328c38047d8d1b025fcd5409135c663bd11a823f879c639054ee204347b557646e840d294948472e5f909dffe1e35e7072c4a89e5326391e9daae7764b25ddd255a64de30c3b884487f81555c4df4f6036c90d09942dbe8a88affe175b2c84386eb764ecf4b52dbf587bed8dff3fd61da7fd8b4627462ce2c6aa9a179938071759e4722592333790e93820278b50817627710184e7652c97b74e8f6df5f1f12077ee67e632fe775ef1847e5de9446251f95a8d2d0a621ce165905eeee83109c1178ea413049fd2192ff99c89e2d4eac357103952892459092e7f51369e5c53192811b37c9f917beac07b83f2bdbb765b584305603702bd32473c175d49e914f16b64cb18ce7650b7c24a8df26c848b607d2f9b5254f8ace4f85ae63c62608609cdc853b9dd567f82034c3475bbf56b48d2a457bde05ec962e545030d17e6a822cf5ed0360e53da0c18b46c145f55cace37b6419001c7a769fc8191889b32a1f3344c9503781d20435219cb740c254519c1bbb9a28cc73d4e109c69956b32bc83ee7dbe1095ecb58c58c3ec4584a69bad8d50baeaca2e33a895b71ba334e8aceca0e1ab69beb31c14356baf492c8a6f2bb3f8de475d851231140c98f2493cd333602a35076e88d812c860ee48a00c22005bbf8dd5a6cd8cfa8af51ddcc9a658370ddb117aa29e722ecd1f632c24880f07e0cda0c14ffa88b212e0ae1326adf05bd6698a43f18a211ba60c00f5929ec5fd4fab264398a20b2d4f2fdadef1f91e6766c299e95709a01438f46bb68000bf8cb0c926a3170a8032b3384ed7811816f35614451faee63faa539c1b4f719478a03f366c23e6445a0c823a5a605661912a2fc4f3460ac5c5cb8497a6a028e20441f6e67300ceb16762934552429ff632739ffb3598042dd42749b6b6302564bc2cc6fca45b5705d618ab4cccb1b24137bd0ca9d3184dcc8daddfcba25f4b1dfa9e6889d53cf527213d39c7223cb186f9930896cc711330e3653710baf72be854e558f694b79b371b191616275a347109cc9cc2f7a0564c0637c14a6885aa0868fcf4c1cd695ce26fab2844b37e9449081dab3afc6a2d41239a69f4a9e7662c26fb89bee61d70875fff535e54529b8bef447d7b31ed10a4a81a41de6b26319e8ed5d6b890be38a6a5337ff147b46ee24323c00cf1ae97bbf6c859e334261f99d40901266524fc5c460f0263a80317948a73f5444174cadb63e121c8ab99afa0a22878f2be100a27a9e5a995aa4bd0595afc9362abb2e667da4839e8793e5cc992f31fbef97f514e976777851c66c341a1d979f254e6d9dc61701c5a71c249f7a196eb78cb5cdf23615e6c8048a43211219f72821939a4a5b13ce1e664a82d1586af1627c57611c085cdb6443691cb25f8600d7b3a8c129826dfa32aa4a342def976c29496c68b2abfc72e4338ff41a20ddc01084999ecf08f8324b51da06ecb745f32d48460d613b15de86d0efcb46a8da0f7aded379279d6780cf797207ac3b7a99043586b02969aae45196587181053f31a2cdf2786101943a748dab337ead0b11456704041e20dbfa4a46d4f7604f2c6531c111f42e88d098edf1c2200400d13713c57dc48666c4ca700fc16b4fdc55d2ad004d1aca68930e0eae1f6d11c59d497fbb20ea7228630f78522a44f14dfd275d902d3ab6675d85b944e9ecbd55c0a7c8c019fadbfbc130abb18d7b1870038593d95aeb643841cf30ccce555709e18bf557a1f9594dea329eebd1845e9be06d6369b3e41b12500875a7b6fb059ebffae523a56646ca18258e54a741e421ce3c072fc7d0b26daa72aa19328dd18d0d588ded39d2a43422edf2be80394033328604647892d24fc904539d4c9a8dc2f49603730228b8363ff36e5890cdf5963350aaef9304b35ca0020137cd92043b20c9359f023f06b846b0443a47e7c6294c32287941865356ae99c1438af40d46e9ced229b54670a909fa244999788d34c54c3fa59a6a9c5fcc0b0ba6d9a9b725f0ae568bfcd7997c031f1ad5d87678d4e46083402428a2e215db47380e2e1b5c3648d54b334cb8dafd6bcd43d2a99e9f2f2588ccd2551acb947ce58a1ba1d89b2c644a23808a691c010d896f728bc8d04218542879750e07ee2063769de0e60d8759e5a721667c1f5e403e61ce181e1338159f0cde78e5cf209501b01c8a00cbefcbd1351c6a056c9ac6826a9a746e7918a642f801d8d58228712fff43b4430dd5a9c93297b7868b10eff9609283e83b913b46a45490786e5b5e2cc895c3961c2079db6ad2cdb0679437446abe7129c123b1e8513eabc9f611e337cd6a601ac205c94b646b26683364b7d1a68ee0e61919a950b10af2a61ac07aafba21764685638501366194aa5c93c394f239cf9e122485ce0cbb6369e85ba5093ab1ac769daf3e59b08b53611d39b51e80382688163eb5fb4237a8f6af1f56d62734609ec087eeb7fada50890e150ea20220745a6d0d8e80361400bc2edb42a518873e49fbc49fa1e7e981547c0ee12822b4b5873ae53d681d661b11f09e15ed8a14a4779c037f670012e05fb6e68aadae34ec3562962b5601e1024ef011b77c10ade384739aa8debe19fc651728d68017dd6b88e13396e1c819f992122bdf3571fadcbadbc4eebe7e3abcc7b3b215fa6e37c1383c226f1530f7be2dc42e144c03109fb161ac46e8808204c3566a7321a9de1d3cfe8f4bd6ac8fffd4c06f5b5df8b2b79e7fd638d41b2bc5232643e23dad50b1d68a3e78e9373537f74b428cf062e7a8127777f0fac4f38cf4c5c7dbabe9062598960d7c310e9f730beafb9c38159ca9ce2d052d6c33a05c32f9015807743a978e58b000940e92405325f44a77df78cbcd715d28c9bd3c27b120f27e32d0c434658588ea61686ef22573022643ea32264800814655a8f90f9f8c6275c4fa7b6bb30747cc8afe0a534d7ce6f5c77246d0802fc7d2309d4a2b660ecb529aab3c6682bee9428b07a52b7b0d4b77a415aaca53ae84e89ac28a5d512efbf3c045a699b44293dbf043e45bb18d517154c25824a87f38ac413511c0e5bd321db836c18637777436147b20e066eefb8f137c602478271e90d32c10c9d32764dc9d249628efe5ca13dc1446f683d920700a584a44c7ea601f9960315ad3223086b184fbbdb212f95565861a515540695155bdee0a03651e8f668a4bc67067a75eaff6312b0d3d8f483703ce93f7e20907174d0f01ef2f12c55925a78a5036eef6b6130817ef46c96e93a11e483e59a1b4c5c20ea5da579db0387ed2fbd520595c7340ad2904d60d901f4c5c4dce31c9fc5c314834a31602af3f2bc2c00e791a1239540752698a2b7e5f7fdaf8376bb9563fc26acf68e3efcaa5a90f5a0cd32a92334107cb4fed38a23d1e395e6b4ebc14f85ea3d6dfe31157a6f853a5a11932fd81154225a422cc59f9a6a49f59042452ae669b0d1a766fda5ba922d494a5f0527024a07aba889a5b9df0fa13e5b73440da1110f3bccdc532f6e281acc9d1c3bb92db8a74658de3838854582aab148772337e0a85fe8f02caf12207b9526a9ca883ff5ad1371cb12bdb18ba721d9cf18493241e0305751add0c2fc496de57e7b8bd74d7170055a1c9ddac2a0bf19c3ba2de8143a43c7eb8ed38697d166586f1238a12b80aa7760fa0b585cf43bff6eb6de70cede5acbea68fdb8c18277b7e8930787da8d4ef848c59c8e5735e2f6bb68aa84cfecc98d629e58a19d6108913cb00716c75be6bfe0008c59faeda71a46fdbfc739e529fc24c72b742c5b447c4c33508f8770afbaecf1de6753c6f7acfebf367995487e579feb8ee23b26909fc7f8a86d42c387cb48510cdd2f2a0a071e8ad89a084834e496e4a9a7c4349bffe221ba2916a2cf1846024c401b54993cf5e84efa39302ea73055e05a88b80412702cd4c2efd76a90c9d9317e0092146c8d558efbb1bbe32836009ea5889b82ca488599c19131985c6a5ff6860d32bc370ab8c644b618c5443910f89f8cc8caa6b0767afb4fbf78bc1b5ff4b3d1d5aa2fa12bc5f65fc4541015ee49c716b3a264661fca78764f06d5c8a764f03c43a9e7d24f754209bfe6abec5c61130b2f101c1bf61495933fd092ae20ff2b442d5a424c937db6a1a77a790a86188bebc9c0eeab58c48740ebe59837c0ffa69d384d2647800373015e8f8451291042177adaba9db68aef15d70c1f3836428f75f99024398afb597ccc95b15b4aa424a35d9a930471def1bf9f1252f1e9410095ef581d0b733856b2edc26af1995fdfc97e1505ffae5f8cdd6aba800e98b6c445d979119b4d9f57340a70fe8ef6d0d1f3eee13bcf67a7196174bd72f424145dcb8449a76f01d12f4ba07b4a8b018f1164e470148a5fd49bae69dbeeb13dd944a03c8dc3342976eb0b695dc613d1a871e5cc72b5bd9476e5d438d82d78b377ea7ad3e7654a4bf53749379664e5d3434a8de87987ab5b4614cef84cacd4cadde07293676b8f33cd27742ed3c01c6f414b0ec538d3e11963e2dce9ac1ea25f705e9385b6a95b93fb2142dbbb0c6a912263c2bb5bae11b4a1c74a25da2c589ef37aa949bca8c73fa04466e17f1430395dcc3b79e523304a6b4646c5b80784a745102fba2031b81f6fc6966bea82aa5fe38ce5fca8bf7233002f138d81f721a363819e42b8f938a2c2d1af698bcc4832624c49c37ece1140ca79004f9554fe61827ab4c2ae9eb096927f9eef915bd929777fd80f5b107122ced0ead8b2ab00713cc9c02564959a482ee69d9b4da61d8c97b87f2dc43fdd117f21638ab12199d8857f93f738d20dcc164f5fbd60ac1f0595ff9e5999950bcfaab583a1ff7f4899aa500664a219540f3206b7d3f48328520406e93bd4885bd13c18f2d3849a934082344767d9a3841e52d52a052191c6cc33ec560d6d657461f488e011297ef4175559894d5bba8a292b2b6374de315cc2822120886e03f2be469dacf9d4c7bd2e6b77c3768bbdc8300005413974a6ab5f97166a9c05dd7bdb08da8180d62af6b611a10fbf6b406c50c20636a1c9fdff8fa46bde080640021c3fc064b0275b84bc56b59d4575d746469f3279d8fd1c43a5e7ca2fa4cbdabd87657223a6e810d4339ce9f170799812904fb307b611144679bc7ec94d84563c8989361fd27afdf13b5b338273684c655bbd5a55a1a02de94673c811a7ec5be2f72e27d8dc8ae037175fb62e7b4a045c6fc6c76d958b2225abfcc8bc362a20a52d8d6f2a5789e34c288fb531bac4eec7aa096290d5a941f01b2d10fb5734cffc037ab0c7af9ae4522c7fa7e101348ddf9989c79a3bf6fea4559202c30c36de64908e8ade04b734b83af4c4b220e182b23e518124290515987553ba340f660af9ad26ed49c891a245828cedbb34652f491e10f400818239a96dd3309acebed7b5f40ce8e39339fe8bfda6255c088543bdd833560cdd3df6e6b72eebec6d239409372ab8ee9466be0af8d34a062602c4d9b1f7f40a57e380e582ccaafc9dd9440e83a7eb3e782887280439e47089e6c96ae51e9706939e6e791951f2609a96c5e68a276c65d3497cbff2e95bf043ce2dcac9de256d53ccc1c461fa1b95b6c0cfe4c1c2984373b9313553fcb740ef60403d56fa397a890a393031655e41eb5a659a082e2d544bc02292aa2166e0282c18b7df7e31413ec4dbf7f2a9f7f7dd9d65d57145ee3626f5f5344153c7168a58aaea03e0be4908b79e9e841634d5514ff31d8bd7d46597e16eca8346b939118002cd1efc5a9c56c45858851c3c3701592eadad23a685f354c7222920115873ce281daa85fe28014fbb0d5e2edc60bb111698b50e70c025cbe0f0134ebd1e8af4c49796787f945c5ae369d6450b8d6efcfed75c23287e1ca411e64e0589766ea50a87ddda36b5e06782d830ccb5086c3b6c0abb0e1a888fe8706a8577108b981e33f7e1fe131bcdbc0a01868dacd5aaab9d80438085fa09bad6413a57608db69bf223541fc3570bb79d2d1a6b9a9df61439afc58eedfcc5e45d6195ac340f0a9913680c159ba99c15668c48fe85c4ac225d0db95f853b1efac337e5f495d5d1fcb7bb0644ef84d51ce585355a2ab0f9a46d3ee94760143b4e56dceb8b82bd081382489590cbad298306ac3a268127e2825723088d171356e06d1759a92b8ca56a9a3e1dc6f23f8b672c8a593115b4ff380cd7c7569f78759bf2c09433c7ebab42331d24441a1aee860d7c2d6575bdf4981ff472769c7a39c416e60772845e14135bc1ad7414dd2f2858e94335780b4dfcef927ea8589a276c13174d5c189d441045377aa37565c201684ccfb87f61feb2036f7bf0694396aec3fcf10b288afeeda663328a025d8ade1db83af919104a8c965e109d7c639cf74b15ea1ccc8f68bca64cab2597bc8152fea044d19318544719e25e85f68b7e36234fe8513bba44362429c787d25174d4b9e207794bc79d4fa413def4508d58a51ef075f720850e45abc0ab362ad8849c93508d5d1d0cd24c78fa3e2614122d7178b0496fc467683679aff787022c7b0f9e27033d297c414aa2fe8319dcc89a75608a5e9a4e4c1cdb81ab4b2779f41d0de5f191639dd87add8a3a752c010870a0e137d9ccab1d056e4aa6945627ba498bed3c0ec31dd63879d0b36045840b327a6803cc513358511bd7345911877c7c75e1618ba28c2f0745df3a248b568854b413e12c949aacbc7801a1e23850dffd4689a59fbd1bb359638f48cd63f16a0c2221d68df512cbfe46508b3b76b31f979fd9be47722923525744640e3b1b68bc661ce2766ab36dff90a64d849576109d2dc8a39fa5f7f40f93818f7fafdd07d4e93f8b169023498dd6ff8dee9b7853a71eb452dfc83b91faa1d5ed0a72d253a395a706aa0ecdc1441e6a6dbcef306823132d0ac11e354759ae373f7e7cfb3b2ea8d3c28a3d061d618fae39420255bfef9653ea62dd6f511b89ae33319c1875f4a4c02b94843e222bba6c2980cfcfd88de734facbe060b03b7a3092c2e295ba3677a5d5f80575c939108197872d86bdb208e63333588f8603b0587cb5e77e8799b2d5ba774e12435e0adb9e560fd85469ef3d54a6dba0439b0f10bfb9b7627a272e48d5774a8b04b9540bb3c1752b81afb77fde6900922c8f317b70a5b84b70568b9634b8f0dd3cda8e8d79e8a8291e91c462cfbc9626b9a006f49a7e65437c6797e54426cdc97408327fd60fd6a82e7e5605393225ebd9a58acc8f8f05bc57473326855020bc392f572f32e92d5a913fc199056785db7a691691fd14bdd201025964b758790148f7401a238a022fe0cdfda3e9e88ed2a1c3d314bec8724974ee38027bcf672e4f1c09ddc28ea5f93141f7c9f9e67c11dbdafb64f0e3cc3e1885ae47ed5aee202b06a3709066efb4e2916838195e19bb25c928a59555a4d1ea4417ce0979d30ab237e1d305e89997ad9a550742f42550d7968c952728287c30def7dd255039a275438cbf103e12e319a3595211e9106dcc5deba482231662c2e9ba112d992cff6be7db01ae1c226eb62b9061f5357b677d4ae7a96b8a0b1ac683cc6e06f350d66b9c5cecf3e4810e38e0e5ec8e2850dbcda0a9608e4c36011020955ca87d2b9b68e6ce354a2dbc1c7883c8de0bbbc574efd896df50d2db22f8a60135102592c1dca8a21ed6c55341e361d55996f45befc28b3db5f7fdd49c1ebb53177706d2934992a7a1fb1eb6f76ded7b1c3d457cc54072457cd287aba206d26707423099cbb54f299b23582a3548ac5e2fd24d944b6c1c94609a52839c9ee1b5e35250319270c6d0e70a34c2f18f2e8d570cd8354c7199c32f8ee12dda25dcfb570b3bc6ef6d9be93a9530b9406b5e022563596e88d2bdddd4a6e7dddd8c79366f55ed53ac61a9da7132592ec62af9742bc41d094b5913c8dc94956229972591121f0169357d541c702809e49e3854780a8bcd8b6cbe974fc95cc9ad8a57fba907bfbf20288c8f6ebb26953a5058467cc039d334a9efcd32664b52a18939f5e934a4c765e8e947749ba1f9493f3fa65fed1e8ba941de773e34987c3ebaf636b965bf48c5ccf9cc36fdcedfa62ac2694d91646703bf1df585a7bcc9df5e69d282f41aeee2ffb811776e871a6d49a7bb3a1876008e81a9b7ad43a8e8575bf10608cf4790d92255485da3c00d420be4b8d26e1f31c10f98d9526d555f2d2b98e6abbd1a4f91c545dbc2390ecc0df569907f4207dab4b9c7c6c8a54e72aeb568c43a20f91e7575ea612b2dfb5652c2f26f9d22547189b99312751122b00526ca5aa36c05e9f3783a0f0ade44437347fda1c2f303728c706de0f68b26f7ecb47c5714788e4360645fe92124e2503a18d382ab42ae586ef1c20fbebc8230814998493284f18f41e7f08039f26da494ad9add42d0719c549ce704cb4a6c7149068d1de6bce994c32579053e846354a2a7c70faece448ffe0eeef68fd65f6a35eeaa88eac4a234c079990bdb48de76936ae23706344a89992988fdb6bb240aee2a81e5f00ce1b69b2d04048eaedbd22fea7798c400d0e3098b69c21da644ef94b1c92be1f181362e410bea71470beefe1253f735971a1a332ece0c5330bf70efcbc8707c59193202436278c9e1fd3825bd97a655583642ab3d7a3b965bdc2e04788cea1b5fa025a83f9f72efadeb92bd3ea0194b53acc7ea9c72fb0596ba08a451f6c746802e1c4291f6b62d9c8a2a93343b5d7f5a18d6a95efa60f61c03bcaa983437a1ee1921c89e9b6e8acd7cd6b3075cc7d9d1c49b8378d21de953205faf6d2b6764703194936e8484451d3312dc9eeaf6b0041660dbc607af189c900e445b1d2261a20d47bfc034dd3f651b44bd84e73f78ed456437b8cf9f96d7e343bd6057c5c1f343358b2a28264dbeb260d22b7d0acea85e2335b40a60fba7d215e1ce9344ac0770cb113b3c913e567f058e5aec3f91c08a5a4bf2fac42e1a5e3e30d78ee6ba49cd2fb8aa887b416ac1a8ae392bceb6160640b05d0c8f3b3c07895eafd24064a40974e31a7336f8f9ab56d740993fca443a2538f732f1d3b43ba77e4e379bf51d98303cb9a4e3085cd3ef6295ff174e73e3875901415293233266a6d7aede7b0f5b684f15d629cbddf975785d996946da52f46c328a1dd2a8e871691947f8269ed4b06ed589eb9c4741486a84c59ed90499a60be71d8db0244f2533fbc331922d67f264270a6c232d0cac549a31b123dfc9ae8d5a67083ef0202889ead91f470864226ea23fc1b9b849e4ee727db0c79b09aa951b4228da859e128d1455387e82262b16844cb2620adf74fb21f95a75286c93fec6dcb3a1f9f28cfe56c56057f003c61aa7b24552132895597e0252205645f002850b8e77528790cbc3650267ce0a9420ad877dff3c71e05a4b99fe07f9eaac69087b76e0ca2786becf7a7090a964b3a8ae73db9c7cbeac0c67c1007896d1fc4e1fba7ae446aaaa33d54caf3efa4da83b3da64e0831fb4faffecd98d4b5a8bc2d0d55d2b7bf50823d43197eba916cf3e13d4120f636c52566b462017ecdbf04f6c3ac796ca9074016e0836f33554f788e27f914223d77b554ad3f15eeb2f26a480c2da9b53a0138d9ac129f267a4917ad7a977bda912270c224dc0075b628616ffae92e07bb59d4b8d7915b033252552aeb0dc244c9ac78db41ec54a7ab348a6e263b26862547474da8850818947756de4b0158f286c9316a9721a953070a93c78c847c171bfe4634d8d1fe3b424b90a0f204b1404cbba8dc2f932692582ef49c912239b194a3d288a288afe5588744b60063bdb9c93ca7a979f64424e5590b5a283eb85d9a4a73b8c6752836d1391afac8dce1d63299d491107618f7e4a9063d899c6a93c097dea625e4f93382e4297b48fd1b20c2a69ae3913d21c3674fb505ab5a9900d316deb8ea82bb8d4a8d7925cdae4450f646e3e84ee1a785e3b23952694194aa2aa4e677eb45ea9d592de0c65cc4fc9de2c27fef8a90294a46bc54a43704e7fb9961cc004f25730f19d5bf9f62bbdd4d9779b93bf313438d54f11354832cd7ee30ffd5bb08a74a2b8dab648fbdc1840e07f5a4af3018ff70f390237a186f22b0d669e534bff33730e33c0da34ce307e0929fd600d95f186588e9a2309aa6d572a87c2a9e8584da00b23505b9206508d26f920241795e18a488f4044f1e82028e090915dac4f5e9908cc724eacc0f84f3029831da7bfcb8270ac5e2755b5b6b9c0c39beeee8020ea5912bfb127171e9dde6f571f63fdb986e4dfd398d4ae41ca99a7b5fda32b26b2937d73cbe2d68c652d7df52f041bbbcc7c6ae91314bed7d7d164270e18344cb461516ce013da444c86bc15be6b8466bbe639d830e8d287f87eb0f8c999685d8cbdf761ab9b416e883de5654535cca292aa284e2eff5214ff3db88e9e8b0aff79494c12b21154f6d3deed1a2b29657853ae2e8aab627072627277851c4e071729641587a4558669ab09578dc30a53802ff6c21106ad0f434a29030c2336c58471ea6108784d6d7cbd567e0a87ac250fa27c71526ea5f4e79d4fa8cb6bead5dc8a5ab4bec3c019c63acc90acc700eac1321926e124b4f7f0f7a83f967e8a31a793d30d4ab698a81f9f4d016b4c4869f31471c9788c053b249f42a624587708a1522b942767b0175c9562312300cbe7afc9aca8d25cc54288561770ca95490a6c291c868f1b02f08b097160d633436120ca615edfdbbbc8493b2d4131cd85b99d51cef061e92b29ad9d033760de5a88b525450aeb5ee5470c5d0fbb6077131d258bde410f81a9c7ba8eb91ff61e11cfc8f4063baffd0bfd3898930c0c9a52b2579b0eb35d40fb001e2bf10cb05bec6b675105a57aee3e1bb34deb1bbfd64d6c03fe102b725b0fb06fa4547e967e1f96804b1fe566f9985efc1f32a56072e8f1d411a21e01a130f6ecc1542f631b391c5f8ec8646139255c6b769b9a3edac2871c2f23dda81a8e812f3f84e742a73fd4956309738653bc116800e3b6b9d3eb0a1528168f59fa6a4823f2492fa1aca4790d5da73e3ce2a6a2e9c1151fd1645236be90eb041fc3d69e1ac43add3399a5820a01456dbe4cc61f9bc3b50f966e337655884796d3810a87a9c3dd83496db64785f0ff84003cd1e0e72561b4a225a51e2c0a2c2974e09524390879c4efa1c2a093c6538b5aad22a1f443a5d6a2486308aa7de43cfc050b055d009694630d963c70029d970085c53c982ca3661b72a8ea4101af3657483783d4de932779d4eaf9fad3a56f7b179c1c9b083f2c73ca158b9da46ccbe1531ede9591aa82509da72437493e4444a4c1afe3fd49dc3693bdefa79bb76ea80bc681743e1c50cf23f3bde0db75dc0e0ec4314e70696290b29e77830948918c87a269f0dbb2015de453af47ba473fef46814089e199a8718b7c6471601466f7a5228d8486b4d8b18e1c38b6188b21157b41f65a329918d74cb34f3308e9882e0ae4214548a6a2e8b26e8a710827b95a258b6a795f0f77d627f05a3b8613ac276b515f61d4a7cd02726611f93a37cada83c8d3889f814fcde1d6129c5b2154672cc39e3afe925a499022730169f3045859ae8b397324dfe6a930f0188b0dbcb21851ce3b15143bea2e2d45aaaf9632c61896d7595c33702ca6f4aea9921f0f397e49c3f7f8cc65fe6639486bb7aa76ab2393bd606e7207bf120032094ce0eb5bdaf415c9fc3c311fe5b339b08cf428a9a58774462f231b4cf8c69bca281b26c14e96114cac34bd4f42250fca18093b0d1ccd9688037ca9143fc6430ef46732b4e430fa487195b306d9f1ea104e9b52ce441f5790d5a8e707d4faa76e952ea7128b241a0eef3a2f26b520d964e38e6ac44a1d6e25ac288d136904fcc883fa54317b8d37a8de57a2e50ba078c705b46edc06a2014d44449422a26e898c362c1ce287dc0c49e2aed7ce12adbdf1fccb7d9dad1905a938f5365cd095f911b6b34e55285c296e612df72c7fc409f9152a88ef425b0f6fbbbf5ed28087c0001d5f28967b3869c86e986fb71ed3660329668c8166e89fd4020c14a4670a2e9e20abe2f3a4f0e638ff459609eab49a021761cd781e378ae1c4677d589a7748008275278e863885499a38ce2007319994523874940062d3faac21691d8b9f08c0a472df0cea43061a1ce755d55df790030d5a329eb1430063955bd3e34815fd0249d25540519665cf424da448158d250e66a123e31a6281840e6aaa08e1f9279038556fafb882bbaf41ac1980bc56debfff1f24c2d1d67e22a31458c4c76150d609e567fde92cca8e7a689a1f64d13602cf09dc4582d5a09002f64ad19795a97ae771749ca9739af2816514ebea9c96ce819e3a5f23941dc91fe1866e5036ab510a170122ad4b090d2cad7f76ce5839f56332abe98ced53f912c5549b2fe59ea09b404cf42cddde02657736dd5f629b50f9805172577678e87911b739664f214fff1edb0fe3aec27681434c85401754e98d98e07614b4ef29bdc28503698cb3314c5e44bad5868788e5d74e6e6da47f3dbfdbeeea7a53e2cae52032f3852c6c824164d6a940c428037f36de42b4f21788b32378ccc55c2c96d900242a13561f4bba6e6207de286dd428680c7c82f9ce0a8cc28f4bc5579bcafc5b9da1e07f217b0bfcd27221cebcba0d5bab1ecebd3a80da40e7459a790815dad016c1e5170d66b28601cb6dbb24ef20ae95068efe9fefcecc7045e0628370c7e87d221c25d64a9c8b21ede583e76533ea5a6cf9cae7f28a0da71b051803349edfb1e8353556d6d22e5bcb9f924c600753c7a455a7964ee6402d185a871663c60d8c56a656e46ea113f89f894daeef6ed62c24ef4db472627f2ced6be049e57cc4d9802fee38d391e70b45b886bef4a44e6def21d4a7320de7c6375dfa04dc01d4193990db7235ae33bdd8a6d2aeffa089a36ecea957307f267264c599b3bfe1258e21d7df78eb40feadfed28436a22615d8a6046473da1c04e7da58f29f0773c753475776a3313cf52a9146dd5697052b6a2b171da57cf3fe2a8954efd6152b4957dd9284a1a25290b085b9ff38ae850e49dea97297bb55808b58d9dd1f161f02718f9734eef01b5265101cdf25ca0bee1f366c3ebef4d044328e590d106a4924d026b55f31f6520dac7ae9371084f8209e64402ac21877960aac8bcde7aacbe82877d52b64713cc5e63132de863f2ffe5d029afb273c1f4a65e0ea9299d6094b000aa8a65777158158ed17a16ecbf37db80112c732fcd5c77a7bc11b5e36453ec04803e92c0260ae4d81b839d0a7ba5116e092dbb90ed35880f7aeebb62d6302c67a35490e3b959c89325f996cf92b553d09e00ae322c48456f8d8884e4768527a9251ef95d0f400e02edeb8caa673742ea034c2f94412aba6a2c914a8410db04a9d14d1e8e70782ee2e9b9c20eac2f9f5dddf8de40a4391488bc1d6042185e924fb5be1ded13a8cc87e979a849eaa8b5a732a256a0d5721e17ff03706add6c6bfb92dfc5e501363b4f82173a4b55f24ff9e7688caec18c13e63dd23d7fa8df60dbadde0343bd9d967d3305363fe2c970a61c14601bb562b9fa1deb634fee13ebf8f8d25f2e09eb1454e5a9922babcdb2f5929ce6e5a18512dff2dc96921d6918f8b5010545f87c535668131e9122d503f1ea4f891aa123d9b891abd705b404e8cd95bc4786ae634d28b9c10d93a5cab3f0cf129314c0665924056e0cf0580e2124bb1e3649b29535ece1befc48cdd2c1746ad497d2b27657705e540ba186880ba7735a02f482be5563b1b83af3cc44cac33ecd7a8b52053eff2e459951fe61cae2a58d649aa4195ca50c3378873cad6e109c893f037de668d42091963365d04301614f82d6d1bc2506506ccd1aea1e7b5a69462c4474b605155e302fbe545b8b0aa2d19e4f76928742d2db37ce4022c159d9b729c879e6aff870ddc9ca6b49e5e4c5352af602fd7068401ba27c3935d2d8d9cff19e7203b293f895124058ec0072dbf9254538636a8e40528a703f284c245f0bd494e0cc357131ebe7a9c6ba5b1e89754df0262da478b245bd411da397f02d064868fceb99adeb449d3926d3e4f68b6cee58e80a941dd0e022f8242c49c7af7dd04110ab9423178f79bb7574faed3c16de90138cdf5391ae2c5ecfc553012678b183fc2aa67073df259ea5676dcb532e4d79f6f0d028f35c4ae302216eca16dc30a6db83e5e960e8ab848ca3da63896e5a115659c1b597213f75dabf9ac2cca1c7486b35d7e5bec0888f34b2994cfe76ab3c1dfafd4d3653a45a6d176815bebc6ab89f115fcd16161ad82b8ac1b809951ea4ad7a60c5c0bb6dfc2935a8a533c321751c7fd01d9881d41ce104dc21b279602db7c1ff7afaabe5aeb8c71fb7936f865b01c13f8b3752ebeb270022e3dedb1a0188f2a1ccafe55131f2c4f40e4f341c7231ec45f474c543f18481efb7c5211ff9200519cdaaec782f8c5d1b7e1f0b28cd72b23153c865295294f9ec9041f28143d10512257beccf8303731569c8e858fd04f81b184c037f986e334da4ea015d3b670d744d8a1fb3facfdfa6cafea536e76c396f4626cc27d6c61bccf14b8cda111fb8cfa0f7ff23cf347e0082ef08c80e4a1fb8e8267da24cf67dfaa316e4c005151f7614ce1190fafea76b22455c8d6a7ac9dcf9f505d33ab42e087a75e050489d7859f294a76808bf4b61ee617a9bc09cd40934809a0674c0b1493b2d573103b21096ec8bb691dd344f5fc239560e0cb18f22fb9ea25815aff645345d505aabe10348d39451e3410835b07df9a018f8591ead3112042c5292256e4931c7bb58e2f0831bd75d9dac77adf0ee806b88d7da8a94127673056652a0c92a5d6c6da868a9000f88457eeeabb0a49f1527355708500f25b65682e1a41241d0000030c4077dab9787927dacc3ea15504584f4d6b456ceff844592e4557d2719b40a47c30e841abc58c0abd9791ed3524caeaa71769ae3d2e32221aaa1c7afe734f20b9ebbc66da58af223284f51018a4547c952b93b4353226e20c5098e5cb5a787d3d48c70c2a7015746b9a99c921e2594db6d12ad70415d4cbea901883f0603be916e63bc873cc14e2d35cbb9535ee409ffeec9235e60eac2ca1305dba10778c13703ed0d22a853953615e54609ecb66616b756d6135729e93f927875d669506452aebff574c20bd81b7dcacfe2a7fa217efae286dd5fcfdf0ad08217bb7fd49b547617c2d16455277a0c3a246b687568e4af98fb9d96b80ab591d575d3465e140a0f638cd3a6a48c0540c7095a0f132ad18acb708aca6aa21348f41562ad58f8341064dcc425d74b6a688a57f8a69976eb78433544cde0e2cfa24e2d090282d425780f1d6fb075a83702cb745d0a89ac7f890d03a84ce7c872e90d8549a0e66e47e40a73d2049522102d5855f1e3d8743a09b468cda377bd845c9fbb0630a37bed53838e5e0b42ca01a42559d0a42d414af37d226276b206e232ce5307fca2f8d0c12bc1ae5ef85dbeb6d40cd02f5e8322a3d981f522af3d39c84dde2a580e468a9abbd4607c4c8b918ce91399fb09fbdba6e8c8a9bb816b20930c8fe94a92e24ff36466d9811433f24f696b404a72c6309419489790c3bdfb1c45d933a0a951b1e69c71b43974a68fad89b867134615ae95ec83707a349e1f730cc0954501fca1942fd32747ea7dbe2d99c7dfeba23533ec6a8f1e8ca7e24a3123554aa103d569b50f69eef636c204122a9255a76face1c85d3248e9e2e1f714f6cf0438d08518c6320c52331bf1034e7552da89f333dc537fa4d445c1166cc1071625d3e9bd6d958ef9c56f31acf61e7c9fca63e4c53b2f15bd3ded20aefb8a4a645009b9d9ee7c7f61313c68fdc787146d32955e581e55e7cb07ed67b88b9d99db1c6930429ef2d34c45a929170c2604ece68fb48d8fb23f398363174c79492ad7d7be182af74828b23f504687f1734a746b0d7f47d7237cae13306ac8643282ca45b615da4ebea8cbd039507b1d84d889bb8ca558579fa357b13d2d39b36c69a5c82813c4fca68f42381f3e8cc10d6a003f620bdadde5f8b420f2646eb0065beb3f0dad0735dc59a8d5d6042f96170c2c0d1c6aa6cda6304924939abf07dba2d4e4741cbbadbc23f39fc286505c7dc5387e72b94d2b2efb2c8c69059cefbc1e69e33ef0b2e94264a1eadd5e815577bd5f72656f128d4f635a8bbd7376c1e428e234dd2f2ca41b49b7c7f0f797c78ab4d4abd50a42dc5af97a1e4ba59806f1df78894f2701120e468f213c7336c125b423a909b81e614359485bd472e6d8c59573fca0b4a8265019d513673eb0e3f4ca465baf50ac764d5e2bccbc1d20416b26e12196d3808a001873fcf3f7a87c21123ff58d699879c6bb4c71c2ccccc39822c201e33f50e362c3ad7b49a8b9acdc15267ea100dcb249c62cf0e24f5999d02375a2091f25c128aa7aebc433cf35d422cb456e4e87a634bcc38f317d8d8dec619b12a444fb820a4c0a142eaecef47b0ba8f53d1e2c63aaa1c1e4c1e5c00bec09f791396d1c946be44eecc57ed873c5421eabd2e2000373ab9ba216f6e2ff5fef5158bc25b2f83480f6fc09f3d9795811e86604dc4ab6091c253a6b4d50b346620fb42cac4fa5b300c3ae3bbf01932f5eae5131517890991c1e4b3d571bb2d3176cd2b78e7b439825371402b7cdb27ee4303159fa8392271aa46e8b59641485ed126a95a1ba068221fd6567823788b88e70d8ac5f691e5350e194d2471a444777a1f972862336ce65153d328530a221d8f6e5afc4479aae44229700d476d725f331058a59ab7a349950d8ed21d87a78a63d40873e3f26526be892c0bac11f418882c67f64e11be2ae5767e0ec471003ca6a86f2e69ff865123020993d99916e5c13904e527dcb191382a74c66c9cd5ba649c2f6a79a845353cd8882528b523d559ae0c992744a282491e2283c7306cace00a16177676cdf550e08b64f9829511d8133f7c17965605ff734b15200b012dfcdb69a77c5d03ce2afab2f986a09face460656b8e052b1b3edbbfe1755efcc580e9472c7bb942fb3ad7546b8402fe2a6668c3146828b0454627ca35ef2d1732ba81eb65b0417cbc9c50c33f414982e756e862575aac98a007d4f7b6d9d261b5c90447008ad51bccd305a00b537b7fbe60c32d690b9a7491b84d37fabc550199351c25a8832a9a3ebd5361a8988482967b410330927404e21b9fe7134d5092948a7ce9eb54446ee5f7283a5fec02c5267618e666132555fc8ba8a0e61848379dddb3799f7488167f409ba3d08933399ae83c9a843e5e9469eb535a8876e8d581519a8695f6b59a6fb18e5bf96c9d717b10900be7e9fcf2bc62b2f7df2b44da360d4d798e377c0266acda1dedb97d2be962e4ee4801aa850f43e07f2bc0f830369c1aa36c5b540bb3e70a59b4048102b7cdbbf1149f7d9a2bad2e1fdcc3558eb2a382fd975bb076ff5f4434a60e3b9788ca36172e8afb6857fbfa8d9d992f2dcd661bc3b8b13e3797da4736ccc6cd0436337583f7f2498886271584c0aea6b2f6d5eab1351f63abb56dc8191218ba5b4a2157fe51dd1821041efbb5eeba9a755c06d68ceff9bf16e41dda493f578d2ba3d462d2a5ccb51c7f86ea7c02a0012839d11eb8b7d46905c84a86327ba882ad7e8975549c23d9a327dd4cc1a99b883bbe2e126234c840148920c54414d287d3e4798b9f9a6ce82f762024b7b0afea72ccdb0c63000f5021927b013b8537ba85e7410fdbf92da9e5ec2eb8262e0a484ec4d6856effeaabc6c402b0bc2e4708a03b4e7d1efb1339f60a7eccc5d6db0d8b7e896543178c6dcd8b82ac6b36b5123514aa6e3eedbd6d02e8a592b3531582f515fd802d3c8a781803fc7e18e02b44b7169367733c0f122cc4968c2fac69d65b8bda99e27a0cb6d6f6e9ec22319ed41647b1f126776044d25b01f118bab0cbf9fcb91f4a144f549e4220e2d188d06977e7a8197ba839ff641b7d27fd6584c246d10f9bffd64108fb187c7410b7362d0e32b312c94c9306daea7828f00236208b9ecc93c1a938e9ba7ee8b14709310dd990b43a5b05ef934ae79fcf9d7aa27f03e1d8489e00b84b6a26867a844a9f19951cf73ea760176e08191774dac302c8a0d2b7bb406b8b5da26ee2aeec02cba3e21c43f27337cbb64c55ee2d84a32fabedf1927333fb5d06c3febd784467f0328acc6775d52ac30fe17a2ab3e32139b74a0c65b949e7ed39e67d0d81a383dce69e21bf75b0490484c8d888254bdd55f9121745b5665ba45e216d88ae60e0c7fda0d4d5e906a3784dbb7d93387f5f439e353fc13bd1b99fc918d160888abaa24f24e58dd3cc6e17e9d4b2401ab45af7bf7276a8881bdadecdc271fd7ef080016e766f1b4d7d38a103118ac0e9593cb35d08603a7bac08e16765575b616af29029de62a2cb98d4418df688643c629a4342eba40f38719af4d1985f092c05bc7f3c751a1401a3de61887324983cdb9bb0ef581cd85b61ddd5cdd2f4deb02b17e6a6258323f065543e366a142a4c2ba0e2a5448e4a96b2002d68be831522d5f43fbc1f4838f3b115c086ac824b8e1bf8c3a2c8ba2a69eeee816cfecf3f9590815cffef9872d61f1e4a6ef13d8dd4d81bb56613c82b559a5cf31885ceb882ee217de3cb4d14d1ec569fd197c4348b3ad25ad14cb94caf0565eeb285119e3550325fd58a4c1d3ea2d1e04d7ef46805b9b030fddb874cd3c946426e7631f8ee10b2170de82950dd080f51114c09bac70c68922e09aaa906ef44f81255370c4c649e0a85c330c56883e1be152cb08cc7c01f05da383f1accb1ca4be42b44b79924da94ef5b5ea12c7df2a1841fb3422525655da9aebb0c3dbd59ae1af79840b5f3f15a67738b8703732f2024bdc563b833d4f706150311f756b7a1936b43534232cc4555f1fdc281510d3fe053df740388823dc8734b28123b07564d552657dc6871447b84922b062284f143fd3acdd35ca6ecc097d07a2c07854ad60f9361b844ee389239ef15af898467dd0d21704ce97ec30ea1bb53bd3e2e2ea3e0b740c6c1b77e85c67287020c07f456f5fa8521c6b087cda597219c8d4894419a1510be0e3846ce406fb6727e854904d3b7dc1f442d619d158962530eeb4fb882f7c9d4c784195d58c0b699de41908eab00b5291436ce364cd41c36a055e27f711ac668452b8a23c5f2da0486c3e3eec9a6119b476aa6ae555ff1ce83b1d13e88fc73a96c731fa18c572edda6d108284dbfb0f49320501525a437947a1a599f9fb1e11e0198800d774ab874d7dc08cbc411de26d0acb9dd2516868089e25483e7bc5c4e4d345c0bcd5d987927ef879f782ea8dcd00e44d29432e03cdd006961dae23e81fee633062eda216ab43660f694e1593a7a1cfa81b1efd0dad0b53f1e111668dd5e51f37a9d285556dcd071912e8418a5c7aa0087b92a012d10d2f6c4348a8e13870222a25016d486fe0d98ecfbdd41c374b459f813ea65daaf74ceb9ae04dfb5f219637bf9610a58cf728badc28da22a3e9d55361464b3f0092feed90f38ed65cc8eca11c43df61086dae51901210028c3406bf5d8ada3b065e4eae470fe901d3134e4cb9a54b5364ab0a0ef7993cb53aeddb98100d534e2c5b849bd39ee3c16bb6ef8002ccd7bf4a262d000384adedff4182c60dae4cceb96df766551841d2ff7d0c66526c56d7f2a21245a38a85c5643aab2adc40e9c867a1a670d63479b0559ca9fe0665c4d21b1b2e5e7adeb45f685078d0d505897c2e0687bd3dd9b1c441678380b14dae9638ba0641529e07b42ab01c91c6d105e8c1063586cdceec54c824b9d15e0b72aa763daa00694fd3b34aec69f0346e03b267a01527aaa51450075302d27c9faae6e39d1cd3504640da00b5ec108b11b709e6209fd7c002e9d36a63bbdcd8641e0ed9809a4dd76b2f49d99c62e5a83bd2ea16a85e28cd51f8d5108a864b726e2d835f3848b573f5d35825a706a700c6487c541d3f986003eac6838de66fed091a0ba90369e136c888beb0205936ee446892960984d8da0c32d008065133e9509630bf6e2ff69d83e4206854a4c05f3bdeab9f75c6c3d78cdb20ba7262dcb1e1c088e1be299d2932181390429dea043e315830e9c0d54955d47adac77158156e807b978f4be0d3507a836c4fbf4a2048f5bb4e338f804516999ae9ce6f79d79aacef5edbae33c51439f58a816c34352195e11eb3a3c694b5d2ed6f4b0020a67203020160f8b27384914a309d153172836b78d2b63a7a92c84d0ef1fc28876cd84105d92e4502d9e960ec63d06cfa01599560f4db04cb44bddd4a5b127bb8f695e2da1c5dd0ba351561e2cc0a47ed60e123e226a9963ca2626d3c5ca4125d7647330d8ab4b1e6c73736cf75500184c8203e53a081464de5ec3868ed75b122773ca7d4162e4ab305329436c6ea0380a3ba3821979d858d651ca16fa72fdb218f4e85c59279bee12321899fc095ed8eb2323c08089c92ab6a9edf3c4303014a6a686df1049d386d61b8786a4d168c17b3f5cdc895bda5cbead3b2f72f82ac49382839e6424ba83d3cf274fa3d2b47be5b9d2f454130d8bd4497a83c348839fc7d969564760a23b72028198ecc48be9a5a0ff1dbd3f5c80ca3026e8a17bb7baaed9119915c7051f35fc3a5048cfa316fee843f82854fe18a1087ab7784098259be7515b080d98d1ad3518d19f789f31fd5f50703570af3c873075aa473a3363b056a7f003d317f3d0ea01e10601697ddbbfce979e449d765dfae3faeaaacc67bdcc8f8f5cff5b4b88ee3f1529942407621357b72fc44af7b6b41c2ba533371a2cb79212e0857642e4df6d2d278fe7b34f746d7444cb51d4614fa1c29e579b8706252ae769751aa09245694c2102424f9ee1c7166646405c6cbc58416799ae44db4152122caf9c14af78dfb226bbae048ebe458fd1c6ccb60985ea581635f4dfa3b8df2f57a05e5b3f371c075aad3986348ddc949cbb1a8d1e0fb38b33b6c619302599fada07fc3a39b7dc75a7c9c3d5cf56f8860f3c9673bd2098e863e81cfe223a2b147b4f888a02edc057fb0e06e7c44461d23adc6e43707c230cd98db1594ec029cdba5c650270ac312980c0afbd000db25e01a4b6396d5c0e3c0e77697369383e06ac594f7de038f0378115d5d2ed4c938e5308a6a73061eac8bbaa2de3521db12ca1837231dcfb6c50f1fb4a41a87634c64f6eb074b1d4a70ff1fe4729c1564c4df9a738813a4c2d6a616c30be84897003432ce577d2b2595507c98c2d963c6b4c71cce1e13923d48c43db721a097dcb0ebfc7fd90fca94df7e48c967b9506a53d8b9a30f5a45ac310403abb1160c3177f897ac068b15849618f4352c828edc8cd3c0380b92a5b007f96073ebdac5c899075042535ccaaebc5a747db4135c1002006904ff807c88f5f60ae683328ea401dae1f32260bb9fa96025d7487d1c7535dce5e08e0870e3df36cc49368adaafa165babe45296e3cf11cf2e5b67ebf86638dfb95cab5ead1aa5e6d96f0c001b9baf272147978d708d7af412d71e46098b4f2b70ab32a33e14dbe7cfb982686b66f3e7a07ea38aca420daf130439297ae4ec7c1038263daab1a8cb18a6e2706cd373d944de86db3e5e181c2553cb07da372b7afb6a3e4f22712976b7db06e576696489c4d67ba74df7ad0220c243a5e679c86ba56d741c154aaa94c5601ac58556835077f9403db6d87d7cb439e6ca9db0ac54e28d1ea4683b5053ed63883685830c6f48db29537f7bfa68001d21f8175e1717673dfb9392bf26d2d4b83ac4a180f078b3c82961855ffef1cefcce093bc403443b0342393646239ed8a3534831cc8715d9a61478650d7f30e13b970aa465d8c1b1ae653f786358a05dd78ba4629ef9d18b5bc2cbcf05a5a10d7590af26bf908cb2b76aa527b0d03200842217702cb93691c870416a8b087b5589a410db73da2175b00ba4a2964d73ba2c544a1aa025516d16c16f0547ab8696d482fb8e17ad51b9cea4e08765062b22bbc441c86ad4a49625b4f8e884dfda0c30a783b64ab3cc8f8bb47442f0793be5b2f088624929b3a5e9c266624acdf3cdc41d6c21fab25b00c5f9f3c37cd4e101fbd0c011a5d6f9fa830f8b3561fb1b95bcf5911215bd745e77396d47cc05d23c152a5f486a35d472da364310886bd4491499537a4a5d089053399e56aa18e6c6c836b8e5ec456066115b3e828434b4c3ab0c46b6d45016ecc9a726c0434b52575b3beae2ad4ea88058accd1875aa2d48d10574fa1c39d90c7b8f08c31c65cbcb5678c88486dd2ce98993b79053b288ef31c249cb434a0f5e0c9f236e97148adc398656a59e4a4df70532c144d7167baff1dba55cf525fd5a2e246d5e675c15af13e85a0ccd44c9c34249db24eaf5acc5f18aa81810daf7b3ef92f1f9510ffaa55f504145f022ab96d5c5e300cd29a0e92f1a4f4f2bf49137f26536fa6b54a016604fc12e89f60f323601678e37e808f50170146036c59c3e251986e43c100703c7e59f0fc36fecc6ff871147a9299a53755d687661ca9bdba030fc2b626adedbdf7967b4b2993940193059f05f5054f6bd824ca38865a4fbea9534d1d0778fffd0bef3fd3a88928fff7463af7690dac2f3ea36cea5c5389f8993ad554929fd6be2a45d5c4b411b029172db84d492297a93dc513ed66dc81e84a55ab402a2a1d28a4c12141a24264481108f440b28688238e44692197f5ca12208bfe7dba8d4ee14a3002352e80b981a9d977253bd3614b82a44c932753b058d5ecbb2d0451599ca6b658a9a99061890c377461c283528dd4613d3422521e5b69cedf8a9c49a16e4a7a15773bdc61cd422a1bbb1f82a130116ce4ed6f6952b6827fb9a805f4b3e8da29694d2c6907747b1494b5564bba5b2f42fd2c565052f0af72479722f8d7355b87571c7643a9f1bdbc40defacb50eac892327c4253dcd7658873d8fd104c2825dcd95978c563379c81c6eedf50cbbebfc3f91f17451f719815a6d9f75f25f598483dd09e0e1cd58125dd1684583b355482a6b81f224155b4b636c31d4d715f839b3e69bb521bb3a07c3d25bf771b335402774a10ea04c120fbbe78c79d92d628286b8d9260109ae2863787ddc729c3240b4a5aab91d1e07f3ffe295aedfb3a6fc1df3f41a733dc5159794fbd12cd780f0ebf62bc856e9071550595f7dcfc7df18bf7e0fc7db14ad44259d8e416442ee12ec40ad38454f6c49f3a876adf079d4028eff1bf0f4af1d9057f1fbce2330cfeee6cd069dfc7a0148f2ef032cc72d8dd31c39d8dcda2b48e496dcc02130c1284b2a813986756c2e598e70b07a67d9f8252acb2b1fb38a5f8e5a614a9707503718bc8a585533cda57d44253dc70e7b0fb1594219687693c76dfb583b67f6633fbfe19eef67dd0e633ead98cf7e8bf9f773eabe0efe72c9fbdfefe09226df26fcad6db94ae174bba33ee9a270562d7c7ed2bfe998fecfb94dcb8acbb8a1be8b4bf4a571983a6a8df2a8b64ccb0311a4120d6e923ee705c031135d04206a926ee50b3a5ce0b1c1cb4d043522d878c052c46d4ecbb898386404d9211b51c2b96825852b366934ed6a007139c6a5ed25a0eaf75041c744c08d094b1d5728460946a4d3a2ea8d5ae668e5aeb0e917e597f689a534ab3412536cd295d6d9a53aada39252ee7df56ab553645799ebbe7ee79ee799ee77989a91406f9c3b5873a06b5e29a3ffc7ae1fcf9058ff15902c05b421c9266d3270224470391f29c94aa6e50731ed8a24dc005b4092cec2e40022e5c5515747b13b43c7a5e160e40d227ad1be46cba7952b0cfec28282e2d558169ac7e06db7640a98afc94aa00a13eb6d9940999d1d514e1f7f7be0002ec1a748d9aed3dd9c169ee4f841a75cd16e102dece6fc36b246067f32b7d8b76ace5dd16786d1bafedfd8f5359dd308759d13ebd621b61b7000281161a7342aca83e9b68ab29a5e92340f760199276dbbf85acf6e80af3f756abe5a2ad1331e8a0d6767f1306ed49b2386dfa250b6e0f60d32f37606d215fb6bfeffab06a52d13427c46a9fb47d81ba4feb4383c164fe622d4bcfd96940dd6e0a99d1f54dfb7a69cd847e162250a97d01df356a9a9a7d7be5fdbabdb26e4aba48c0c6660dba668dbd51726ead1c1b0a563814d0382525a160a62562ea61af467d31831dda6efa19ecd09ec10e5d71b8e22a130ff66ead0fb332287dda2cbff7de7b7dc9deeb4b5976e67afbd7e63d5fd50fa0d48dba4ff7856be4aa60ed5f2ddb5eaaeb63d7f78ebc5a246bd36004daf5a7b5d5a8ef63adf50a48a4b25776676d34857d33bb1d80987198d5dded5d001efa7c5979405e7201d7245bdfaa2aea3f6e5bba49f30155e92bd9c192d2c986a5bd626d76078dd927d90bfb74296b6dafc2b6d6041fdbbe953aefeeeed2dc1d8af265df7ef199ccc6ecff6b5b6b66dbf385855bf2255ff2255f7ae1dbe839534411ee3b10effb3ceff33efa7e6ddbbbdeb5eeee6efd5aea5f6453ace7388cfe5415d56645cf5ef4e573ae40c193450ee8d0d41ead66d377db91cf26a0204aff59a12a138c0cd49e6aab30fb6a363df194d62412dcc7599dca99e07f9cd2439ccc00d2e08adc2066a7420f3788a2b5dee9eeeeeeee321a2c5fc7eeeee1d3ddc660db5eebeed62f7db7ee375662757b3f29daff53139b6efffefdabb33aaccbbae8fb340b194dbf329dfd607af5d2d7e26bf18733189e2fa315d9988dd90040e9fafe7d185f30f450ac1ff81ab6ab5eb74817d92f2aa2ba22cf6f861029adb552a76eabdf7bf1584b10ae7d0cdc3fb171ded8dbd79a9ecd7915db93524aa901a81840886bef4929a514574a29a537042346e266837055a0d1b4cb0d599b76b9e16a9ff9b5f33c3a43e0d34de4b65af83faeb345ca35f07379d4835603cdef91722d3445afcc0f9648b45afeb03cea916bf9916835f045b7dfb66228d292525a9e277efb3a43e0dea0287e1e15c9f1c6fe4a5a034bef73f9d5786dfca26ba4e589b77dd13556d2836f57c055e3d39b7aa44eb5913a54671ba3afc71b0f5f4bbd7eb9ca5a2bc65a2bc65a2b06dffbb6beadf762319f3f2c885adfd620a6d44f2868cabd163f785feff17118cd610608a3ef58c9179e59690c630bd21a96392c8cf7f9c35ed77efd3c9dce637e213739a9e23a8a42e6b4378367e584891027488c70a2027973727382a4cbd9c64b075a2bd8f49520e40a4cae283ec625a556131f62912a1249b8826e5c010954128ddc4ac84b55a1911e3f3e2254609a1f1e0b53190b09ab8064bf4ce60e71f27040f8b0329a6c056d88e652630157a503b5224ab8a75b6dc8958b265561d6af264e76053b1e2401060fab8991af489324ac2648559ed28c4d6871d3dc13125e0b1adc34f774e5e249977b4a21f774021951ebd70bdfffd7cbd2683219cceb097bd1af45690a7c46f42afd5a64340f2ba3c956785f96ada0f980b41306c4576d5676d39c9398ac3cea2cd3faf5d2d9ed0f3ed31eab6fc554c60a1215242c2eb5f3226d27a304191ec69449c20891da796ddb9f9e97c96755ca3dca477f9ba5c3762444bcfc9f07858c96648c0f8c189ed3c082556f358956a6a8ed75aa6aa9ba17a6aa55cdb2798f08c495d6781187f21ef2fd5d8afbe954446c0ffde9e93b7f8ba464fbe86ef3ee37ee6fa5ceb875777777777feaeea79db24cd2ec137f4f3c0e09742267da83778e140ecca0830e56365b2de76f48a09c7176c1e0e03c75b2717098206d1c26416c9cb72181705e0540d2a7c66548f800ce56ab400b19272a6821e344855afd9ba767cecdd333fbe6e6e675d3957df32f1988ec9bd724d0cd87dbe65d2490cd05f55ffd798998ad97f0d8fa5b2490d6ae274920573ec7ddcad9ad16cf6ea1d8ad160c43760b862476eb5fad184ad8ad18c8ecd60b5d76eb4712a825233f8b2410a935d8e7b8c71784ec9109cb1e3f248146bd0204b62d3e48028961f8370c5f339db0c3a7543bfc4c02852fac0dfe470281375bb0cf9c9d735612c3ce4f8fd8f975b5bfc724d007002f97c4caf644b0bdbf2490a7976c8cef45b2c2b636fb899a63830ebc32022bb16389f014828454563fba271e26e824355fb57d437849469d0b69225a2cd461a04b394ce68446cc3901912b0245a4874d6e9a733a53a67a193d06323fd8aa9c3922a276ca30a0048609169090208732b5fbb2186a0434dbdfdddd655ff40983d999d7b6ecfbf7ce386822c40f2a38d870c309b5534bb972c410344aa48025047f60cbd4876d369b8da99633c28e18a16571a18c029450541f0eb04f1e2342446d2f02956b218c0b4f7efcc777b689e87bd7bb4c1c389a74865cff005a7399464d44ae17f5bff0b25210c10a2b4cd96c352397f96ff39fa96dcc7a3f3e6d3d298bd23f32d71b351189ff856f249a4336663f4ccb2cb2b1a8ef03f1bf270a9f347134d50f4d1d7ff275d4aa4924e2c0a13364f33a6afa9b74868c9a886e3e7ca3d6d7fd010ea45afb7e845afbdee8c6acb617c5274d1cf401b4964faa13ffa43b5a23df4647b570156763464d44e17b6f04be51687a7f56dcf7a42955a56cec338d5c0fd29af73df82fbe07bd371a4d1d7ff075d4beef69ed85e7a68e03f283df847f0c42aaf400731e6822891f3fc8906182625bc24cd4982da2f56afde8cb375ea890c02e5150b29ca8b4b67c5fa2b0b47036cd4119e2314187a0d1dc53d0f9ac38417d188b28060d094c2504c9cd503b7514d387b14431a9208c92a41d3d6c403326aa88e7a506c1c31305e456c531513bf639661fa825463d0603e12174fdc0c488904956cb8b5841f3810ac21337cd417dc1022ff66cfe53c73f5f411303b5659f54eae78a0ffdc2d2397a86203c581a8ac9f7811ebeb6c54f90d04bbf34d40a5a080a20301c59414112b2f439c0c0850710486a00c2040a6452a585af30e1e24179c01b7346281e1f50e2a989253a2d5e8a485d31e18e2cc1e170383a2514146467317e582193c982280b1b0e9bdd6000dda0065561dfbe0bcaa2023485fda9a0234f96ec234cb8234b7e60c21dc10509118163120954956a111434d90a2b5a6c9015016fbe60510cca42dba04153d8d73ce89602d6689975e1e98c13400c996c45fe17d40b87022763c21da94ba4bc1c51e40b94d3bdb7d67b6f7d29f7566f3014d58489303bf3f181f950d918da51eda8ec6c805f6f3b98f7d84091b56237f4914044b7a47aa33a797c7636686e88a31d8ca1ef764b52ba9fcf4f4db26f7f05154d6a6f9564e9e6991f56013a13cd9a24eeb3263500fcf35d506067261b963e3e5443442fcda4eb8d874655dad9a8b79a548b38d9285dc5705d5a2b8d1d8d9d142e958026cc63f6ad140ca9aa1830a4aa627c1785cf62c0aa6055b0dde2bb413f52b0aa18647eb05215f4e3e10f7b30a7f1c77bdc8cd142275455458e2278edec8407fef8f69cb00f86c27bb05bbde380dad8ad8a41c3461acf5b58ac056227d2ecac4847a32cf42ed23be88feaaaac965cdbb63add8c22196674338a64e8bed123bd27f1df12870f3a09845f74f283f0c16b6baa9fbf6cea7cdf7fe1d39a58c77bbfa85e25e0ff78919d81b4221957a77bdaf3142151b5edcbb0b2631051dd5724e3ab3ee8ef2fc6f7e2bfffe60d419dc39ce507b0a111f8a12e0cc30bdefb5ddd8c2219666c1bb8f7d67aefbdf2a9d68746a3f9d02f3e200d04414fbccf534d25e2d3684f7b22183188beec6cfb965665e78440b23188a8eea2f718c20efe4b7a70df9fe8567b9f4827f3eb9eceb9665309b5b1af9e4ff369002663f86c4b362cf9d004a46a92583343d698222390d1d181214ed81951a5a9089b951d45884e2cf0a063e14c119f0edbd206a820c1c08304626a15c8972f57cef8b0420e3d40dd6aadf7d67ad55469d0dd092fda61ba54223ecdce44f3fd693c3e237aaaa77a2a2a37a88860d0b041775443346cd034791cca2410110d87d9b7016388eee86e86d4b6584fb67d1b3086f28e66659ea72cca16364df39e6b12f9d899a6ca94ee68788f37e3fce77969244d77b7960e63ce6b9981698f3f1e44c44f794eb056af57b5565c1a8d2f3e7ed1e28a4d11c617cd6a6bcaaff3620c41f0c1ace430d93ee1454fc9b07f521dd5d1a930326465510923832ecc92ac1af2875932356e3c659f630d523b57436e8a934de52548d52ed2c9f01e2cc54b07ae6a15a98dffd64d96341bb39f4925a2196463f6a7a64617f40c87d92f7298057587a6392a66902c8e427362ccf88ca2d1613a55a7d65c0d486c9bcdb3de20efa15b7cfba268ea5087d9b7ddec6c001f805a2287115ae88144cdfee0a00b420211d09002919a55c3830f6550d88d39b2a166bf22d9990c862686f050a247142c353747177f85f7c89051f20397f9b231eb4c6fdb9600dbbe477ae07fff86e31bb28d1d5f3c9afe19f60e2a7db5f9681abd8de1174d9deaf74d1778dfbf36572450989db4b1e9a40bfc9e39dea7a40b6c5e1097dd6546a4575aa450d5afbb9aa7d1a60e9b5559e30527f7e40bae87d0962372952322e5c566b0430e3e10c1d2c2d20974b754c684201cf022268b141712743baf4a9b4262f2438f38644d382a9033496c351c39b21235377ffc00f573503fc0e963bdd6a963eb30c0f37de6d85747cde15eab6af5ead56bad23d8ec43ffe8d522e9a75ad66dddddbddcb62cb7d790f3ebf58f03cb09db18caae4c80316283922049744092c3aa8b112b6670e051a456ff1582a36d4ad30a253d746e0aae009be6a41c91932284a6c201229072aab5de5b6bbdba0ac12d79f31be90e7e8833c620f62ad582fc1f3b234da22f215c5d7935e12675bb0ae12a842b108602835806abb72ba5937ea1714b9a018227db7e0837190cc4a07956a58b416d1110a331fb620e081b465358713b0ffaac37fb396b5d6fff911ddc688a9bb5d6822ffe55f867e962021bb4368c312531c6b701101185ee8e3f93442426c771247f7cfb3c23ec2a841ca56cc5963368e3c3862be4e3bf57f4db10d15fa80a4d4d4d09f9080dc9d04de52277bf1e86e6fffbfcdcdbc267cae7b573fe904e46901aac6d5f4847b1accfbdf7deebee733dd481170cefdd091272263f58518ac6aacb95a3085455c1a8d2b9f8339db95cad274d23f25ba4a93334be8ece8b274d9dfbda6824dfe65f8ce3db98464d44fac737b27992d674abbc6153de6c4a5ad343349e5ced1047862b5ceb5dad77b55ad536e5fa203b739932d994cc65e87453483a19b62320483a19336c47365d900ca12ba220a1fbdd2087e9509cb2a3223445b67d19d596648782f2c51549164459dc59dd516d5353d5f6bb62118fd8fe17ddd18a6635ddcb265f14c720ca82dcf66f496ed1c77bdef0b839a22946f33442dae37b179a823475f0d7d13c4553a7de1b53db64570d0af29e53265bd172fdab755ddf7ab55a2d17acf5ddd695e194a0cf38691d3ac22ca2388e9a0925bd311eb768d76b974bebcf394c55ceadaff835b62a79c77b2f8d1b0a50a32fce8d8dc61783f8627769974bbfcbe57269976bf49b1da2dff0f7e17af5ffaf454be8ee22769acf48b3b3d1fca73d4d6808674c24a4e5b5f35a8e481109517cf3c574637c855eb6dd5ef774c619638c31c6f8abfa182e06fc10fc1004c3f02b8192adbaf7de1bde7befbdd7ef9dbadfc5170cc1f0431004430e400e40379379909237928de5d65895330e5539c3280b7db757daa471d8c8445eeb9fdf74ceddef7577f14717ddfdfa55328ea0dfeb55344e582e0920db7e8c7a64ab6ec5d73b613fde73cd182d744255e10f6571dffea6b31a544a0aa6739cd2d060341d4d1c3ef8f7325dd7db5e0ff0dfffa91886c2ba7847f18a3ffe681a8d2f8a7fc5ebe3bdf7beff8b6f4d25d9c6eee87ed33b9ac3de5e6befdbfb20d86bffb5426695d80ab6356df5b3defb9ab16d8b2274b565082f3ce4cbdf97bd8b47b0dc741c455016861f3e958526183ef84e32e077086210e3fc71e0258bd156acf84cf5ae775f94c5f814261660d31815c1af5fc18f6b590eb5accca2288ae50e29b073b973adb73586758760bd0e9325e0870ce32b193f2901035b66cad87a12c3cdb54d70894441b2892508c1e0769ee7f53bae1f9eec187d049ffb807159f568bb5245aa371b8edcb990b21324b23be864860bec94d049170aae0df90aca150e0f5962ade68931c618634c3f839e7b2d08c44ce995e9a04514ee3e6e989fa1417ced7ceb835c739994c6eef5bc290c6b60dbc73804198077aeb5ca4a63f8c992d298cdc66e63698dd6d2f787f7d5c076af52b75747e8f749bcf77e062e32dabd0b68abbd35b17c1acbaf4cc3e629bb91ed10fe1b9f9d91b74d10faacb8ba4453f86b1ffa680987f7d025ca82e6ec206ba7ec94574702866c624580dbc48ae8e4841b2b060a16af49922cc36dd2c473ea31d22a6a9575b51b7f8a6cdfa639283588a1c01ba29bec153f36ca921e5192c05e395a0be54d73515828a20b01071a96806022468a9020487ae4c0448b0e2e6469c2e344932123c6a1097cc2417ca201073f85213fc0e95e58a28bd4084d3a7e6c69e2081d98d00041f544067c3a62023c055a9d78a5cadda14461284d4ffa6a9787656174a59a450064b1d286e6e333220e72d096ca9a57d3d8f7beccce86a89cca14bdd2fed0abee6e1200f8e7fe3442689d9a1887b42c56f2c13e9540b66458a0f8184df87096a7e1b5f3721a033a1901de40a3e185c10f67b9619fb4ea860e4928a9c1696784045652188286245c8c30e16906275b7e7009962ea8c4cc996a5ac74cd5080000000033160000180c0a06c301716828cb645dd50e14000d64903e6c4e30958743915094a32808a3288a318000430841c41864185345b7015586ccbdc0c1ef6f85786aaf1e69dba69904e1e83bbd7004bd3afca149f1e349a8323b1dd05d5028f56c74d5b606383407423197d4aedb49269e4a76bdb0a4e7b895da9554a28173c9bfe6ed1177087732222487d2d595be9de00ecbfa5c95fb9c40253baf5e9a1d8c3a16586d788f2c80d18fc45a890188601acc7f1bd9fdb68fcdea738ff2665d806303435ca346ca0178bdbc2d6e6c45c208448d09a81ea8cd6e9463d9b0718ccc8003a068d71f53b2feaaafdb288a2f83cfb9418abb9a9d606900a71fcad19d358783fea8eafd9254f2ce529318e2bbc169cff1f28953118d034d809fde1105ba29ea1085cfe8bba022c77360a83db6475f0e8c538f5a89ae874bf447fd1e2b99a6a0f4481e9f2e04c2839fcb07863abcfb84d2870025d211f7242d40742c89d3418673ca176432955ed8200977db29f9b49f4d5a102cf5eaacc40667cc24ce0208f6d3341968f0167e24758002659bc284a447402408f3b49051038a62832f5fc738cd983aa1118028d213d83ccd6e1e3d500773914ee8a41d2c7de82eafe15f828b87ab1a5b6e8fd28708178ed22e23af414ce6662fcce11edcec3a8f7834faf5362f6bf65eb9b1bcd26ab4e1bbda1d3fbf69f2865fc4e6c647d7ef3ef8ab0ee90d9da4b0cd0af7b676e90d6f4b4fdfe6be5ad7da5dad6dc11b04d1633f6c4f218a9a2b5f9932c7db5bdf8dd5a127909b30f4728bbe9074431404f37a25583d553ed91fa8cfa415b4a0d73868fd67faf3f298618c4d64517be57bc0d1b705bb7d944efce482f724689dc93608ea840408e6b97dbe0cdff0cc988136fd9be76369bfbf48482a5f833b1fe6f3c1267e3b68e812b71c627c32f9a1a090a511245bc5f9c8df31c1d0a084122155b56aa0ce026142885688cc060c40ba9a24760bedf29a92c64b34d87af3b173cbfc4f7bf31d1bfd830a499d2332a8b1591a6ac0f57f20d81f921c59decf4a02a2c0e35af0785b65217c49d7ea1c908fbca4c29628bb19413e7e4c89414b4abb64444c34e87b99e3c2c3d7c2b5aef1fd862829cfff84f8786f6f30b5b65fa67d13e180fe70122425ee4cec0df7f55d30161ab993de71b0ffb552ad83841057a1815515c261d226497cb4f70e81a1406be4feb13e6aa01db7b877622840d80538bca1779658c6b7425c999a8535fb0990fdbaeaf25096738ef363ffec655f81910fad163e6e64a2ca9f29e02c500af066f51290688d8e40b4f6787c420e5be491cf04d52b220f19ad7ed3f060793c876421fd0f25a35b2242b0debf9d5467980e7915a7b63ad8849583e0416b9b69ee9c608ebdb584286c108ef9f48878facfa94167fbdf1c6ddebc0cef8d946d442516290b842e489ea020ca68a6d359594734921f3521b1937d5c858f505c64862937bb606ec3d1371ce16ad01a9d1d2abf482bffdbc8371ba5e3291c63c42de405dd3a1b743cc3f22567a5cc535050078719220ef54da684c66ffa1e119fb98ff6aa4db39038ff48568dfc632e922bdeb00c9aab971c15f1b331b2df63fcd9aa9487414d2762b3cf3c0ef5e208b698c7fbc5ede7270346fa3398375bf9c8a1f4618035bd55d413fc4231bfdcf3898c508c7e6b380ca19d91a3a4aee0f70f81acaa03d38606469cd343701fdb1deba654161157a2e2d298ee76c2cb09b8cd99def1ef88e56a5189b016ce854e9e9833cfc718288361297b71c25e18a43489c206326c93fa7164c8317c0142199a09cd46ffe7d0bc0c5cacbe33db0c3cb69a43f4b939e0c15e214ea47a1fe0e73e9f68b40afe0067351c44d19ec6dbdb704873f8c0e76c0ec74e2144c57ae06318f4ec36bd9076837e42d4f83fa9948be8f37320314df6cb225a20b6f63c146e759bde565260ac334d5a90bd07afdace17d8440c920c6e9e4c05d3872aeb57b59770f2e3f8446c2ee821722c2da032a07528c4094820b2b6bc14763ba1f3bfb0381b91db71f683989e4d64af9ac6b9d8567ec00d015c8b9ba018ba28825124b4f111266064631736f61b287d467e866138672511db8372ea9a363890e21fc4b3dd2b39c190595441beccee35b3345e0be00e04100737d0ae9fd7e2224fbe1b670e285abb4fbc9cbb404fa3fe5b2732864b24a1bf68899c2a4bf3bf9cfb4affa2ca9292f8080a538113ce27b9586f71ee27d6ce3a41dab2837e34b5cc63d36f1a4e4a54c177b10296243764957c4a9f28205f450b98e4312fba71f4ddc32e11434c237bf86ace59c9223f67e14931f45cbf4002bdc05cb7cc1b239ab84647d9e4fd06fd4dbcc88b235bfa4bea49faa4fcb76bb424b2c807680c4f49386e339a97a66eb5153c1292a943296d0bd9ce869e1c1a2ea8e211f4f87f3a26043e70560f8fa4545d707d9c809077d3cfc0a086c82b34e26bdef08674935d5221efba53ee93a7a436e3df8eb7ee03e8b5c958dbdf9b3eb550886c4b5c80da00e7901de4fe006f29e42eb3ff35b82428e166ea729f0f99c250329a831c1ae1c1320abb706b16de680165c512e54c94a0070602c909c3020065830df776aa7627bbca3c354c0f74f25b4ba26d9390c7f2411d366f7fc43471612f8027335f91900719324d560fd93b71eee3249a08432fdc8e9b088182dcd8e074c93e202e88092f3058cc7d28a819e650b1dccb14bde46f436b917107096aa5387e455e5fb966e193434948817418912af486ff8243d3a1e312885c8edb09ca80b7462b90ab427889f7754823881b108bfe0769dba302972f225f9baabd612c303ed4e9e8159dc38427cf8ea19d1b7264f88fbcfd2e88e8ee20630879b854ccaa87e4733b28b35850901237bb3b6cd1b9fee31cae773217b78d13aceb2e0744f186d588c6457fbdcc9dd69582e4fedcacd2bbc0baae083ed498f28a647820554f19db783eaaae4dd6ffc6d478bba035172db8794281584541b88984064a47512d8a31e7eca862587063b83df7cb55b6e27d27417ba037ffe8f28946fa2faf960b9b36046053deb5d2227de6c38576ad5b6202086cfe65fb7eac962dbf059b09d0b99a2a445cf1c4e1aa2f1cc9af97da036c5a3f079c429c5c07de970db3b87a592a0dfdda913213e86f6607faa54fb453a0b8f7dc86cc276a6017052d1ee069c059a926d18ee1c386b70f9c7468d43454aa163c1c2edb9fd0e5b95e70ca37cc6b352da8fba9c4c9c32f7c48fc3d555c837f4cdf3f1a9dd190dec9ea532848efaa47743fc1f7cbb806336e4d04ee726ebb935a2752a79294aba98aaec1fdbee8e77d7d3b1ba83a1e3a2808c91baa09fc2fa0be51f82208fb54699a190992087f5dff61b142d9fa0c5f2020d555ff6e5a4f0487e4dc2f77e374af101810348faf88cff0c3f9477c45c92a2a3c699abae58006ad47936dc0db4f0c017e9293e887cc06702dd81a23f41ed0e41d57b0be89046b8f2f276d424de8a56eeb957fa562729986b25148d5a4d7e02c94a3c54e90b7c343e36c81b5075bece1de9d6189772b00326eb82d8bbe959c1ac9c5425f2a68b443c9d616b6bd3abd58cfa85ca5ee7fa804111726ba5a688ca7368088848e345a5dc34e50c86d05797578e06c5cc336ff12f84645c129da21e93f927cb210fa3882e991048e5d3f30eae50329b5311817e27204a757f1add7d333f2b8fe19dc0a4e369120245e98ef8d471104e68a074cf051a78b8a61a7df36050097370e07a0d23caa471dd59ea78205b48a000c90d54a325d8581e3cf05668bd4d8bf568e1f82393f7b59f90d8a0d79e8084312137b5ebf957fea1b13797e63a6ee4f4295ccc33641fae98ec1545e31b3ed5bbf2418b804e98a642654b373213a54d0a80aadfedaec416b345315bcb551fc145b551809c232d70dc294672475b2322cc30d087d59aed1614a069132941bbad24b95e2c2214f746352af41903d13ce5193dba59450997633efb14f420cb2e4e20132b3b25128236a1778806adf43f5582196cc79b06bd9504e04432e1556fe7e57bf920c56a0a008eb3ab52c2a64bb62fab337a5ab81da2714a09035ecfd6680debb66854dd4b707435ff2e57b3e042cd37a385b13fe8ef882b31b5ec07458279c6b6b524b8f8deb78aaa405e0f3acc7ebe46a7a14f6e2f04b5999c90b945ec49c2005e83115f7862f521378e089ca2c40b40628b5688ebfc4b26dae68cf81b591d40c939845f2f828bcc05b59e045e21d58833b6b87e02d2cf1737c16a3557f72cd8214f081c3fa7e2b1bdc5059fa141feef5f8d8110dc73a962f9454ea2f1ab093f857c7fea5a2fe71b86aa8ed00bb14432d615701086696d9b54b0c514f085527f6fb6a1b590e7d184a7b4ed6fccadf5926494f0eb7089aef87243ee4073faa7bb797ad1213495c7de4a8cad615438f4178513c6a6bc4d05a1606def9823526895b8c7a119acbea78c515e7d6a23e5ea05d7720089d9ed003f30cfd487f72ad62390ac98e46e8a35f890ff4e85f0417e89e33cbe1eb3a2bf8d673d65a7c408d16bd5330e270877d9cebd4f093d4f41a092ae15cb9f3cc217bc38e526ffb78a6368a77d317a7a78d766496dce5c184c3eb8a751213b67629152dfb0571d50ec936b824b57cde8d8eec6fc7f6d33fb4700f12ac5dc3b456cddf0569d7f637b33a1b9c04335db97b538087e582a1fddbb25673497be9d1514336c571b2702fcb50d46cf9d96a51ab8ad6ba9426d02b8db3cf066464fb342aba7cb72ba58149a9eaa4eed6f69f57defd1a4852984492075b74ced56ca5473b675d764ed5588e02d6ae5c1b23b81529f5594a76f158dc4a1bf2a7ef7e4ccffb806758ce7ce6f66fc0874ee0caec765452ea818a83b79e29f0be6eb698ad560a92493a26deb8593b4d46545c2481cab6bb9fa8dc88431f6c77a306e0a689c21bab8a6d365d2a6dac1960b213b0c4f85cbf43a8455017499d2f0e00262a904d06a64929391e9eb4af215995149bbe29f69dd106e12993ea814788f8f37bb04143aaadb4b9798707c51bbbc1764439528be29535d4f07ec9c71baca165581aef2a0a5b83301df3101487e1c60e201c48e15e1b46fd4b33b369526218799abc456431555524037174e3fbaa69cc24b61ff3abcb509b4bcc0f584d6f30f866b5d265085dcf42d6763e56b7c8b7755a346ec1679f12c5718d9eb0d977398db328917c4716011a2700d287747e20c8516f8fd31923b0de0aa136eed421460e2f0aca95cc0d6630b8fb7475be59c62b722f1dd31a2757c741f0cd333b2f0410f100e7e79456d01b598c64f84635c85509d40718c54633ec55fa83b279af7e3750e794ffb1cf10d382026ec22eba4daca7d4d805b476ac8b25b08bb09bb95b066377540bb29ef93d323a20bd6e55b0ee6b75a25db9cac0abc613182a275a9d3a7808cf0aefc1860f448d721f9d1140f53603fd8918f5a2684a5a628376bab4d2ca558197e97537deec9b345705850a416b3778c7ad2140a33eaccd8330314b2418e4aac015efcc0724a5c7c4abc514fa207e51d133621aed63b9dd2408f0727c438aa3ea60558b53865ae46642c7fc10d80244431cde2061f3d31203b313663bc26cdc0d82df014741e2843204cde331c25fd108750382ab265293725a956dbbbdaa10cce61e065608601d18e34bd1da9552c7ed884d7a8d5bc1fca3c5416bc38879ac3f8b1359d067750f916b7fb308ecce26ba0bc46040e914e1b33fb440bbed97dd79eff4d8b1d439974f5ae1206c55c61d18ea7fda3e35972e389de6757a429deafc0a990acdb7762b461eadc837c03cfaab1a73fba20771a2ea264a1f8a76e3ef6902d69725d7b2e1dd4db45bed7536f4cf8b10a62767bdc5cec4f163d61e42ff395391356de6186c2b685db0332edf2d718e48c371b9c0861dc03917c8511381954ce89b53a5763aa95c76d44911a9074e5ea15e985dd93a4b511d4f5d36117d11497228176f136f1763ee52f08f8b1086492487db2f7e5cc3243965235c8791f9947df413042d53e6deb58ddf18e71ceff4c2920dc284e330ae419a20e3f8d33d2e64409ffb2dd92677867bd20893ed4bda273cb61f9360a568de645b4534d9ae324f6413a67cb81bb99a848d359be675d6515e736616efa6bc1ec74be20f16a9cc4b1e0ac36956e9af4ced3e6bbe0a46152ca4e97d5b233ae996a80b8fa52ade01ade461e52c046a75792d82a4de986411d45aefed7b9b3710a1a6c2484d424a217ad996d2ea250c442f44abcbaf5c22083ca35c484e15846a85a396383a266b9b112b6e92eba62c092fd936df116cc9b8810154a141eeca8c2ef6a67dc17b033bfcf0b10676aff736c3e96e375ee57f78b107b80dd7981d935cba9af68be8a4b486e2aa33a7f41c489d86c389d9746b66e61641c1104f85d271ed866602f76e190e56a2554b907edf4d9493b2e9b8bee922ededffa4f9e0a4840096fdc78bf64f34541f187a4132f1ccf1fdaf2e610d2df06453d8545ef061802cf152f9be71531f6e8f44f232a76a7c5ccee9e94d668f2b67216b4a4ab2e946793a56c7be4847fa2c4a7078107913bfd4cb502a1d879a1bd9b2c5e06d9885501fb597d97062fb2135cd73dad087209bd9cf4652f3833ce8ccf4fd09c02ab0e6ae91a97a308f3bcc07755c6467570bb562fd0bebc74705db75328b89527b200cdd6aed9611599607e434b840595168ac306627008170b5be7a1cfe6703b4bd66a0281a2ddb0091b5f5c50334aa811fb845eddd2f38b41e691979467c76a6a3cc486a49426155a6472113901d65d0236710e034972207db8410a4e95d55515d9a07112d41d611ff082fa51846bd366b936c497a6227d82e9acb6072ec9bfcbc6f1c37b477d7872fb74f8237279eb3cca53aba5f51b50fbe6acb6f2d484cd2ac45811e8c46018c3137b49f1e090c4feef15a445e44abaa1be69e7119cd92f41f06bdce487ac77a592fe480c06138eaf7d42abca5675b6ab407b0b86b5ab59c817ce14155ca7cf24665273ed14109c981541ec700ba81fea8488b32f9fa77b4cd562d78c63b4d64c0060631fbd28fdbcd16150b28ed1b6bd318059282170015f717a77cc717ec12c06dfa4355052a01c3397d252be1c1bca7f847fb94539b08fd2a4e650844c1af54cb7817316e6de936e3814e5b4c2afe1d15ce194f0cd3ea45b068624146b6b34980c1375d681b1f384e79196aeb32cc5ee55941cdbf97dcd77bef71975ec9c2997ba12fa6bf07b07107350f13662eecee6290469bbec7da6e8c35bb34a10af2672b98b0c137d228c2748aa9285d610a3b18c6f1e649485525c4e825eca3094c7bcce61a2a7ff03b00416447cf35ba9f36115042dee6bd6f613d3a14394a616baaf0144fd81d760fde81eef81a9bec74eff86af4cd0a1e96d77641d8bb0fd6ae091de49e828519534d4ec7d8b041e9bc278c1ff42ad53e1e59819752d32639aaf9b1a2fcb25e64d4a87d9cf8da6973f07471b93e7e812acec58785cfa47f9a237c48505f5297a779dd4d9835d97bacc77e56128e966e710f3eab1c1e68272ee065a77da561b04c3b2d6f28c0d2b15a8e33eb9be8d1bd3ab2433b09bc10b2c6911668266babcc80d234cfc70432f1f84b517714b9b0a9231d5f5c2c0a54b7d3c922258079aeaec013f28073f65fba2fa682a04978ea84efb582efef8cbbdf7fbb51cf455fab38534d024a10ba944cd6c4424801ab2be87dd40511a8e67a4181f8185ce1e087c4456f265e36eb00277a81ecea29328e931323b6b7b24d8288527326a9d0f01b69af006d02cf4e26ba020869fc8ae19556e201afd5a36c1f7b12414f8c2cf2a54fd2c3f997a2567319454420cfb222c98513f3b85cf616e4090602c4f68d3dfaabd1b72c1743e0baa4e25a4c8a960950d0b6b8c44132075810cc149e64d34a47fc439002328945395962e27363e269d845c0c1352ecc1a08263f4012c4890e0f98ead9ea32ad8cb25e935771795764158b542a1a49f4b8a2ee36cf16a0471f9433ef4bc3032a81528d39c84a758995840fbb71c603933d44b99e973cfd85b1c48112e7805eced75dc448c6b375d50301060225832fe06432091159f42ea80606d8f7453fda9ec15f0653b92dc008cde0c6b2e5b3906097a03f197f7dd9ef41706482196e150272d3f302635806ba08685ad21f0276a0f31d7a0a506f065006fe062b9d65650120fe7250d5e7816ca83ecff36c5f11959b89c0fbb52d6bfb3f07e58fbbae408b302374f566127738f3242adb53e465940e4f4fa704d8560c35cfc101d386c4263239cdfac1dc1078c5b126d9d3e47ed1096a08c3aae84df404cb24464528277586ff228515238674a8ff2cf266141f973cf340d6a1ce789823b36d248a1c24c46191d51c837cf0a067d31801a26ce85173225e5e19ca2487d3f0e43c944671b00d3e100a60751b70df78b6e903ae0b203a0494cdf3e9ced1551de8381f78791c19ec1ca20da2d51bef9f8fb5b3e3f8110421940f52b17c17660fdf16c900cbaf4f73d95fdecb67e8f369562301d2e2de5e735b2a7e91c23afc8f714d5b70868f09eba9dbc16fec4cf5e62597288e7124503656183ac13efadfadf61276a82ef00ccb1f443841304a4cde1d64228fbf20ed5bcbb4d4c36618f4c6f40ec4fe9597c184968a6027a828676bb4e4080d08f135f7f54118011103e6cb31500d67411dc1f8d0436417db2ff308fe5f42bb2a1cd9267e96dfe7ed4a1b6c144fc5901228136b0330605e5dadfc1b58eac2ff25a55483793ff6a91d87bb9f86abc4e3da476245a2d0f85ffcceee26024d8de8d202858af2aa2133800b03d7eb2487a806e8563cc0e8bc1675fc8ce0a41ee54fb5825062d150fb3cac0d4da463757d2054486691088527ff81fe7f041026243211e61d6d8c3300a8ebc11808a6e0555386a255c11f5606f166d47fb986101a389b0ccc3fcd1a00e3e3917dc524e03f1d758caab4cb73137438478f5d59948ee8dd8738173c3e8cc4a71465aaba9669ca98c95b9a690fc058fc893335fa89448bc8709591f65ed233418d11632a9e144e54d2d482c6b4c828292e7967d152232c8120b035b5e84a2819142d21425a02b1b42420b21515237eba448b0c5ef4c2a49486869f7a6b7cceac968fa6b2076c147f5eab9c3936cfe45a7a3a4f794fd69d7ab48ef56eadc3e08ca656324d6ebb96d7bf7e7755d8693ad0703429d9b797808ec1237acb0f3bcea1f1d7c87874f41504866f2a49c70546f4d26a83358ca6fd7346b3eac6a5e47c0475dc86b8a2152c3e099491c1beefbf40ea823f90a87d44e706bf211e3bab535eada90c71ad2747bc3e5ccfe6d4080bdfc7cc2aa9bde5d97fd1118f9d1eaa0a1950b73df7c97be78bb5f9dab101723ab48cf55e3d08b93c2230c3c33f91eaf4890e35db7790fd359c9a76ae0a1990416813c8bf096f024bef4773b42d172ce93e7503cec217ba8436e14af1c125fc0e882f271ef5d2f67f18a099701f21a2c2dfe2a4057af0d2c2af1f3f88cc4e9f97be219920930d83d2a51c50e15ec438b507b1aeab766e5cd4158ecbe5f5f1ae691c6e85187907f99ea0e42e5ac2e17473609ebc735d5a1ee5e0a7653c55395d9b083b469ce724ae09786859b2459fc9d76499b35a6df241e423a6dbae3361fef5474087d743dc634e0f596c8d926058aa8fabd7fc95d40a28f959587de0f31444fdf12b1df6778ffda0e010fc1cb15ee6610196d2c064f20b826798d318b13d8c8c3cc31c3d3f03eb59d03ec8822f87872710e2647401a8ff4c604f0ca60c4345124198767b161f14ad3b125b4387b067721d9826024bacb1fdd5f11d2cffbcc3a4c2e12ea754a2c192058d99a22125f0e138b02560ef11f895548eda5d70cd7dce266689e5f2a190d483162f6c10f6d64d833a987357388b3b84999507a1011958b9ced301cb1c0330cd4eaee821530e5bac80e0af3b2d354cc505062320f5ccafdb2115d5039e23a63ecc543e66508093d5c1a90cf935a1f9149e49c2b4d389591cd7cecd2f40d110103572c5a43e9b211fa77fcf5fcdfc24cefa9ac055c7d421d5514a04d5e7ca60e607c54e9e51b76dfd7113d9365a5901a9b97069085982cce1d50d79497016c4f3b664ac51f9d582e86da236e02311af405b23451b8a56eadf6efc11f466dd2e34020b1930e976dd4a9d028286153913d3603f8cdbf78197717f897832656e5d8b7ec7c6dea98c6571768f51df77b62b0127294638148f123310cd57aacbac9efabb2193886e9a0355af30d92f2a7d3c6bdbbf866ca1fdb804bf805b45e9c30f75654f6d70a613538490fde26f9c99f664dfcff38d4815c462d600b2517b86fe6a5517bd84faa3cf0fa897161e07931746db9e0d09e8249a031f1493315c8e2d3848cd0bb1475cb05183538c8d4b109c1936baad158747e2f14c007c2cd2c6298682fc702b554886cf299e75279e2eb02edf3ea6af61bf32411a8d45dc0fea2a6063f26bc5d399cb8ea19a017e720ea824d685ee532b832fa26a803f20b4c0a6b7c868783b2d830e5af05fbbd42adf052dabd17db8b520016091fa6ab62f8739952b67f020df9b1d4727f3bcb05d98b43dd1c8c6b4d677d5a3528e9f74ccfac32c65ad95b0940965837fc5754a94fa6810952251723277e03cd14e5ea3e370f59f09a0988b3c43433d89958d5d647a73d4081dfe138ca813ec58d784c8dc4cfd8dbc4d9ba046a9fa4445a72764cc553c9cabc13a2a9fbdd23c679468e649d97de525fa8ea1408b23efebac00c7d2f4493962f4e46d36de64ee3c2addcf655e6b3ad41f22de3dc016554dc4f507fc7a18a888cf2fb566dc666aa34fd66a68283f05c126f3afb93638e94bac95ed9c954cde3ee0b7b1f127efb0c2ab6f05188173f2a0ecb468513f5ff8f3e1dad08e0b182138697b00eae4006a7f075377c5d782874243ccb977adbc4c6bbe528374da96a17331b3cecfb930c0a3a78fe3595af9e548ac6bf29450a98e8e2048d3b80112df060cd74ad0c9c23c5145cb80dd595ae69bd54bacd28a40134e8e8d9687f1b09448e60318e503a5eb459e311b1ac59611f0e3f09cc3cfe3ea529e3d5c26eb6484a626e626e4ea7e89d6ed8c8f5483b32afdaaea80dd741e19e06ce60fe710fde477167902b5c0429688220f636376f551b1b9c29ae700d6f5cb6a4d075543bfb5e6777cd008c04ef99f9619133089b4baef00d0131fa17c1d15a138b30582518a03d456b7e1918a88e309ce39d4f14aeba99d29b2d1923dc607f5153af20c75532f710f83f5e819b2d170b2574a22546d2d467ab0501989f2fa17eb38387170d291f5a9287953800568832f82cbee5a1f4936e5bc8f4126a68136484e0bbc31beb2bcb8c34f9400e264ab852d0285d451ba42f8d36f8a31ea5310a98cc152d776a69ca3c9052284f6465149e8506020c818470d17d80c259feac3cd689c97d4cdaaac033df66609a003bd04ba70a4c3c3930ff431658ddee4a5d989b5392655bfb42c8af1697b38e4255d892cfff43aa4b7a022e847347890333a88b7429966f42b6e002eafcc3659d9a602005fd53e7dee28c7b5d0b4ef9ff72c892f3878683799cf048d4796ac486b9679c29febedc5ae1f17a54e63d77f452105823f7d75438a9c524a8e2561aa374d03208d7a24db0e8c89a469058d0fbcd08dd8c51c0b79a7eab120fd26045219ff4f56dd8d9f8adaca19c8750ff6d17313d778a5bd1cf88faaf830aa5802a2b3e55f1dccede12d8bcfb0ba8dda8948f223cf76bfcec4f14d0f40deab4ed572a14429c9a74dd5345c3b8777da29d99c7f3cdc7f0d2fcb3992f03f2f7a646293e0d64ec0fcffe6f170ae9a4964e4ed1e66802b580215404850d54fc5986c0a4098df8b9eb018f570640f35d923518837e3d167d1e15e241b3aecd3b0bebeed7c0d8f6ff661f2c53090fa3e7861b2ec784001c8b5fff63543ab3e0b92ef7675669a6bff419bd629d6929f43de9592e8bec8871d0338536b5f1a08606cb14a9deb72e0ce2086ea6cb381ec2f0fa953873b7542a4919ed4e83f44b2dff0f1fae9dac4ff07f02b76bb1e649efaa2dfdac7d381b28007658c740d0b61e52a2f2d41d9e8a64c7aa7461f355c9435fff163413baeeff1f22a431f50705d733b847e605aa5e2e43820483034fcc8f7a6b517cf150b3d0840bcd94a071735bf8df3efcba3bc07b285ee47cb792d8dbd976d5ca5d4b0f0863b3edb834930212a08f707887af0d35c07076919a566f3322dc4fe7959c88570ff8b1cc781294d518d61c2e2a93d43d8defd69bb36628860261d0f6e431b98689751bb0c7851fff9ef6ffa914500ac2ada05aac6d54b49c96a04fd25e38546164818dfd72eac6c4c77d6eb0701e0242db1b670b82ea613600323985c379df292298519bbce9f47e9eebdbba487fbb8fe423c5204d7d821ee8aea693442a146e20880ca445beb0703f8c45b0498f9ec91acadc9c48fd966578c3643d6a465379194dfd11f70f1562a8ffaef8990bb34c4a03827a85e55aaed4b0124c966f9d72464764b176cc3ecd1abe874c7ddeaecb90638027288cceebe9ddaf05edb6018c244e5b87d6e4ec06326f712c2eaf3db196d032380d36c93554b48c08d49837a29be7ac53e8489ab40e125f7c240d6b4876a80707931e0840aac1a47c0b572a27887b5765431eb435aa4c54bcfc06950bc8f5d31525ad8ad0fc0b12b7f82b12135a3cc9e8905da61c43e23a6aa786dba22146cc63884ed8720de5b0c1e983df7bb03ea31023330022b28a81e9d4b5f6fd0ac40491062341e8de69423df9da6edb8c422cd6b5af0f157938b0b77f573c3f695287698db44288f08e43a7b508301c9041c1d07895bf047d3c4936a591714edce30bba755d9fd8e151637812eebe9e91ea9159260f245816fbb75ea5313d2c839258b3cd9c00b950d182cd43f3a83837f7f95dda8dd3d06434f9dbb95aa21e959619c652268883feb34118d17b355d65dc6105e751ba451d9dd6360c842ca29cceb157819906a4f31b82b377bdc6eda5261c1abd283bb5266c3ee5e1b49175c1d34a69ca961bbd73271c1ad481f8e8a99df58ddb4a9d1022bd3056fe1e6f6409b03dab62acabead90c2ae2b34141499acd61b8a96601fa8d5363b5a3c7da81ffb66801f7aaec5c49769eb1ad07a8a43bd8646d7cd74fa606d67ca11e8e5613c3a4278e84c9ad13659403f029a9274e04f49edc7569d543788e2b454fff3994e801f3c37dfc053cabba8317d083c4ac60a22904a0c31122e01363a02bd4c26b71e145d74a287107320e81949b39d0952a0a83590f3a45ac0f8ad1ece13520511581af0a818a0cd14d09c79ef128aa4651b1fbddff0a1f0b945801b811cc44323d60964f0223b0f26548aa081a76df31729d28925d3f6f989eb61ed4d9ee0a64ca18b83ce3e5e8f35de4f50b1e5311f9baa0595a7d426205d4308d640b1460f096031bbcfa25795ea00b46f022fd92a7afa4a0b4f6a1d6345345afa133f2783c339c00042b112be51a90ba26c7b0c4648349150235f4d1c949b0c53a1939e41c4e5eda983dd65568c45e8beba26b3dd8efaf9beb2e288f6493f5418f3b8be3e0aa72a8b573f4be9410e0b0359ff80a4ed23232a70bd9d7a691677ca627e547ca8017fa1e6511087c87ae513447d8c2bc35ce6d046f7ad717bf22e87e2507590f20e162aff8b10d25258225b524850a4606061a65e964380608bba6d5e3980f953b7d77d99203f4511fff386debf55dbdca113c607626ffeff678f19d71d31cb77902edef1f5cf0326d274cea6b9a35fb372f66b871d5f3fda20c6d17670fedc09828a9773751f6f9c92514ea0a2db0707b159126d4f7b7bf3449a1d8e53b39152e0591a9ccea84a0407bc060d1643332ddcec95b93627cad454c7996d91739da05819fa5095de7e3beebd982928791103b7acd83295a6952db30e54c814c4c66cf444bbf84c7731268d619e51b79bb4c1f811aea23782f1269235b58b1c4e6c85b5a945c856c23872bc7ffeb8d5d0b67a9885b5ab384c525c8687cc36b29a51f7b3cc3867039f9e9c87147115abfe7fb731cb4705c4de735675bb8ac3149e39ca4c56c223d8214b7a91430fc49bb6a77873ac72cd9d416bee15486d25c7f13212027026c2e5169b547220c54822ba5572f42c88445805e34fc9d18cb91adb3d8e46429533ba977b053f21a75416c424af4638f72b67aa20d27b87d3af122577c6f940e3ac3f1132d031cf2f1fcbad76c6125c444765c09d1d24d15561841b5b98911f616110cfdf71e699ac6cf4cadf483641937f5d0e569e480787a5168acbc5a752bb231337c5f46e79d3293a8802d5e74a638c1a0b9ed0a6721f9c062b5f155314caec5afb6ef358ff25fddd5b5702428596e845281058a1366e2db573d7ab8460cd1e2f928c8acb01bc65a7608c6275f1e1b4b6764c196665ed58400937461652a9e72d82a0a2b040821987a97aa46598550bc0a86020aed149325091e70ad081b02b4b54546fdf23c6082a9c852b83935466fc34de472a816e751f0858340a4e7e3d28ae11cc2e700891a6ff1f5971ca8d1231ee2054fc0a313ff5ed44d606e22c488d4be862fd6d29a483f7233f69edd40501d08db82f3d08145a2176b8146b297aa2cbfce29412364765eaa91cda91f9f4bca41001c739c0d2f316d0270b2facf0578f5ba21fc77a2b9c07ea784fa923f1e0554fe1ac40ee65fc044f1974471f9968ca4c80c32484097f98a2d237a8ae241e4459f13ccfb193c15fc0c857290f7ffdd41e7ecee079ce0e040854fdba9078ba352527883c34f3ae5a477515841291234fcf468aba74e4fcbdcc1c9919054b80bb07b371fd9ed7ed32068b2717574b70c47990a39bf5197643e07f03ff488b929b06923384967bcee4544bef32fc1960ef9c41c792234432f35fd72a49da66d61faf198eb0ebb9268f2594329356043914027360436fc189d160a8fde9c126a1977133f3a6d8606d09ac0b38381b6cf6c709041cf0f1926e31109ad9ad1b1d7a642464a6df3e730252a9f1fd3907f6bb5bca8db9236be2dcdafd2efd27b38d50a8ed040381ce510b13572e292fb702be19ea78739036d75bcef92f660f718b4b4760de8449c22db76ff0b9fb454b61f75c95dd226c096a8531059aab6edd95156f5bb6772967a9d6237f1756812fb0e256f7aefe8ef7a32f2742a89252aec81d0e67d5651636df5ca6bb0311376d00be9ca541fcb950db0736339627b2e1ad5110a30cef22a040e0e7d90abd368848190672b6396ba9ab1b7c256b250137d5985eb595d996999f692acde3219d72b0454c30974e34b6a0f1c433dfb42c0d286b7be6efe041f0b7c9fbff3e66b1fef4674993ba060104299088290428af438f07ff688ebc8f3169371441b0c979af68203f6212e23bdbb9a0aea3d9319d2b026602a6740950283fea0d2b174712580710811b09626354d30894dcd81237a4288adc42cb70429c8848587154961ff0cd1fcbc4464931664c69405bcedc3c342c5aaf7cff1d60f7a5cf1aea9ad38faecd08370a7a1913a617635a1cf6db6777509b894832ed1e25e0aa5b703665905ea81b057717ab349d384a73830450ca8d0d131e59f8c37d165c07fb94082cf6d9d36abed1d5ac5b2f87928b008c6fb4f5ad87948c1c0798bd836a3cd2adffd6a740bfd958d69f512c7f4d83a89ff1423ed42c99ef982199c352826338d72aa11c2cd0920cc388592767b7893f960f9a8be01889b4893ef31457a3a7b86cfe25987be0c1df8abc36c982362750273d4029d28a40b23a890ad545f5665b88eafc60b3391f7e3465d1b1b345a817342250a6062e4b0c7687105b6750335fd8caad42437449d4c40e966e92d1f0d4e12cfa6581a5a43878fc3280a178017a3ccc35eda2ab026aa64125967f9868880ed8ccdf2add06241ba2a0e27af29681a6d820f41de9d9747049c0ae2766c898ebe43fe388eb8240fa9142d0cef186bdea2e9d73b8fcc6e194bfb694cef93aa93a101488014043c55bfd94a8edf50b816c286e855aa18cf549a59b0876ae0bcea75476aa2e8ef712021fc251321fa05fa7fddd246a3aaee37e80f12f4303368cbcf3753026d85e9d520260d896ff63fa6676e6471deb7343f046bfdbf2d44035f3132b78c0a9649210c6ef7c5171c9990a9124706179a0cd9d7020c5ea9fac30d54c7af23be473f821af4e2f5e5ad8964a0225fee3916431d6bcb1b473f4c53b98da56c463d52307346795a5fa7c7b9285113ab71eb6e9f6120aa5fbbc1272662e3afb961a22e5ec3b8f2fdab76b336ca101945f86c0753a22cd9456984d071bded3a5c0b4688213a8269231d753df6835b8adfe0861b766f2e326b5be0345acb544e7011d692c4173e4f11e225bacf78ca31261a03f13b9f85756382d75fb9962917dd49af0e73403ad6155c9514ceb3b441f1ec3ba306d543a0050823e9a60ce7a9585eaec2fd8690bbed11f2a1fac39eb3ea852eb796695963c188f0afc15095110f2767ef1cc9f28f21fc6b73f00eb665917283300ba7c480c2dae5dcdb2a38dbf5c8c22d62fad21633fa38402a29942160ea965a4d5d2886fea46e27e3bc935bafbb8b17d99a8a06a4e8e6043ab07dbf37d7d4df30f74be79e2964e9955802eabc2bc404d9818cbcbdf0b94a6c3870ed9a22c0d95e1f5de9baf73c51e77ba45301efdfe2f554e2f49cc343bab02a3c954b6bcd4143ecd12b96ec413148558c261fdbed28956b7a6089898f7dc31f387fb5e6d21b81211a4cab8d3af94200e080ee796122bd6e9222fb369973102f61d2b25bda5a2d082f8c6557d4cdc4da2b6bac68f879ba994e2a90b8682deae2bf5e7451e4686da7208d100539b369e271f5dda65f94559423a8a2077e6a1f06f8d38877ba8d780bfb6c7c618fccd416e44bdee261bb0ef637103ace8e3857d7ae7c8d50b579bf90a97d68050852b9927a04056ee82615f382fcd319c2e01a3b69112fbb8d3f2fd73c13ae9c91d75af646a0e1d2fe2de92794649528f11c30e801ee92a8bcbaaa98153696827da235ec74ce6fabb89c33aca65a83df95c325e63a703fac104dbba6f14143e1b9fc4c77553ac37917e3512ed1fb63e95db1676636528906a29fe2c98aff98ad9e2148b568e664c1d676a4a19e1fc6cf49c804de3ab60606436cdbe66580b9a68648c402cd29629868a6fb50dc9ba955c543eb7f4de9ec57637dda5f439f348ba6d4cd5f8f3af063e70f553bd0081d59a7860ba8a2211b3c1a69fa9b80801d8ed662e1366788ccc0578acd3e52cde64fcb79990678ee0a5f1175a394f1448e4758efae71d436512ab5fc0eca30c1153b149a587348f03447e633ef0a90de0b138cadd68ff1e53898692ee88deb1e22628090338c5c4457ce1ba3bffc2cc6231f07374817dd6dfa6933f6ff195ad2d583d258d2060e0c691b48b053083c73ad2fec5157e9d79fbe00c09bf6a83a520270ecf361e91d056a0b56cd5dcc1d290f560ee75d6635deab9fa174b44659101fe66b34a4a4d155c0b482039a27aeedb142d02dca2fe8fc34294d87aac22b2f95bd671ab6339449e5d5ce73c99a3d53790f2475678893dca9d073017a30fe4690ad538898fae52edd9c1ebbb057f04567d3f45d2017faf1b9685ac1e248f0ac6800be8823dd9d1dbd1393ba46d695fd96bb4df7a92ada7b3c69ba1399d883191a2b420b6b3224673fddd5d01aba9d121d921e6170f8af7c07a1dec99d6624d3568af40a232f22b48b071f5cdd50675bd3b87f720bba11b32a7bd7df1072eb7ad54c2d7e68fb927dc96f13b841c81d544375682dae50b65415c0622cda543568c4847d7f6e9048490132fe25035823f2e282d996e128a7d639efd0ad0b475428e9759350d6210074dd286629608f6e0087799d7bac38f7efdf47eb4dc4fda075f70ece4cde8c9aa3b80010a57d75f9a59f5e97218011178706be3315da145881bfe63b0d057a1b0fa89909a7ec24651fd842e875b801750462cbc4b176c7727ac676b044ea731a84b0b9fc10ff996810db4839db0acc2cc9b11f75f7ef7e00d3d4352acb951ecde288a0da03967e7b092135fa2d5b0b8db8c375898289f2a267e2e88c1e34cf6576a75fb9dcde364d7ccf9be20679604df797b8f64078c791e298e28bae08282bfee8e798dd3b0400c9794e89757157c294fecacfd7551863c8610101fcf62c9cfa7b1c074c573e1315fb57e8187798fa7dc4b48f574b889aeb5278329edf999cc624f5b375b21b9ae34a4750802441494ef32c29ab62df67f763f4e2c350b3efd562c24ff1f8bbe847982d12bf520227df4c24f31cfdea4d92a11f98af50850b658bcbaad50ac013ea976477b8e24161bc4543337fc01d98641d7e5617af22b3469b58278aeb072eac5f7ec41f4dab75c1256883d3c260110c54e21b06ea5b3a998cf361544efaa6e37ef022c0f901a6ebe0b9cc88d99a5586b0f1eb6ab7dc6c71ddbb230006939527092ff537a66f23a57bfc70f0dc5520f045e3566128bc664fe9c318dc86501d22d6b60205acd7321e7042b99b6907a1b8875ffccb3346638a00242eed73c40713dfe4c8d0ef02c7227d8ec381c1f02e6d754de53445ae5dc84b2a30a58556e7090f2eec00679d3967838f17bc86e9a6ab0544bb5d03df18dd21767d6d1f23594a4ed88eaf0d3c5b4fb958edd1d4e4ec6160ab835e35b6dbeef929025e1c56ac621ec9cbd753c9b014c2c5b0c9a8c2afaeb4752fc8dc9c8a4283827ba7061a53f583ba6578e48f5f4143f5d17bf639bfd482022d1f1640c045e99cc188843d1feff0f5deb8fe9b7325c980e5f9078d37d89415e265d871426cbf298c0b3822666596819097c8d07f7802997b68234490129068afca0724822b2697dad134a4bdf8aed1f06be417c8f83105b277294613829309305a5c9403a702a2eb8d4f488b4e6f418b3f6ed0b666f5b6f0b994295050ea987f80de3d9f07a23683f405545080b4f854b102489aa2bbc7b157f94e5900d9d0ac524f8702d478de883b0d847212b3d2da1931e340501caa9b4235580581575098d4c402780485d57331d014168bf81d5d08ec18db16dc8f8d794caae6373fb5a128e81f21a3b8e0560466368ad7b267dcc7e7d21be6d9400232ff6f02afa64e77f590a1fff6eb2e5965246be945226191f02160241023bf48469f4c563316123f3148a1f8bd96c1a168399680ca6e112933a3b18f6311dea82c9b1de2253a8c89882fd0f90c5a40ece0fcbf961b1fc16e3b83165c0544d69cff3f603cf4d09ccd39b504d208cc4331f791ce38e24e252c464d7e5b0e51893a54aed3af584494c623287494cf6d81814e0cba80b0c93291c8483684cc8ebca4a09734f63ccc2575856ac4a68ad85d952b639f3e73bb2d6d97950e420e4bb260467200f7928721072f061200886d95a9bad157d425eb90bc82b9701d6978b494cd260b1efa979b62900236c2222a0279fab060f3e1b2f22461f439c80e20205511c31a28a1b5448220bf2889b12b41e3d96bcc07c84890cc9cf1436a2d791971037560d8888a2fd9148dcd6a96c54b8385167ad1561bcdda28e9be2d525aa8420a9fbbe8ff47d214d0a25499c10d97a289275134f67b57a2f67f636994cdfa22fcf7a1fff83091395cd8d8a496725e9fd75a3ea7a67f1743002dce8009cd4e59f0590d59180ba030f24dd6fffbd578b307a4f59fe023fbf5cf5cf5538ff8f3c1b0e2e4748be8d4617472949c9dbdd7b2fbed4046332554e693413fdf9d166a231300b8cbc91fe544a521aa523256d2b175aa331ab49a324a5edd8a249aa721525a992198d9923f2ff8ec021c01525299f36db0257d336c13cd1b1ee9832975722a94a8b542ada60aa274a53324449ae79e660b7efbdf85e9df10d8cb9e537f0cfce364a7ad7db18dfebfdc81b515ada54944687f22d74c2c4ab948501188f3f232e61c8a1daf8533e49558e877e0ca2e172fcc97fb156609eb00fb844e11235f3f5d65b6f1d714f8f46d887f95279129e254ae01297b8b4b9ddbc9bb6791197b844d19817f110ae95a95a4e992f5557bf7568be9a455298ffd6d16387149e45c67bef784703eebdd7e6fb8fc81ff7dedfbdf75edc7d7b4cf5593934fe3c502502e047d65ead18e80c11dd09a5c82e602de79cd7e6cd76535bedfd5bdb12c3d6bf998dd61a200a145c132088e86480410e0f0b7026ce565e01012b3f7039dfe6dfdebdcfdac769eae9abe5a06a359a1a95b53b686a324c30281c5baaf29cfe8ad148c01ff308268d9bd75e2ebdabf4ade7a12eac9fabd944ddf76a54c719813a2e488d7a8a5af3350892c4eec3d85acb0bd098e6a270462d70f7b7edc7f7defbc358060cdf16d5592d59a62a4afcbfb5ff9fb5cd238cbdd17f167df6beb7666688a52506b7e275592d9b73fe517e217054f9cc59730252bac9e35d6fdf7befbd2c9b57de12637baa8ae9f7a30b819b0105d5663ffbfebd9e3c11a7c351dce963383896195010911d6640b3ef34a6c2fab34633209e3e7bd8f7996d364955dc45129bd186e66c064404a74f191fb00eeb2e9f3e1fef6163f3afd495c0fa32e3023f650346cde61edf622df9e6302cff994b891f50c3ac0016681b20a1f68c74bfe3e46c1a1cda965aff4c6bbd77d8dc586d67b82732030aaa35952166f78af63fe760b11e18ec6690873018c843d0d3a0fdcf0135fb7ad7db18dffbd5a8f16d6f94f5fc90435c51c2723bae576ce672b95c347346a5a9a79d5c4ef5a22ff5459808d41f61cea89c86c668cc81802aa9d5ace51a6b65e3ec899e941fa09bcbfb816c07800276dcc648d5dac57ca97c8399f9ea7f100579212524555f84e19990fa17fddf3a46449e2dfd6b43002e01b9e694efd5acd1ae347f777cee1ccf43a210ac217d39b36870535dce39eb6eeffde5ec42e275b790be5207da5caf989db138a1e7d33945af9b93d4e19600267dfaddfb4f9928f2d92da860a993167cc5132f464b6a0a05f91082082925a41479708b5c5f7b0e1cc8299a481105872d38e802862328140df1f9a02885a215eed0d3232b97f26bd721888db284be4251b2d0451d24c1467451a2b851aab82d30261ea3a56ba1a4164aad502e4b8068f11272ebe2c7c6ca0584198c00e5d081ec6063650a92e106d11014248804279f623b3b571ce36e9452796aa9f620b5d65a6badb6d65a6bb548b0cbce864ce1b96c006285ca90570d4b5a58006939a929e2862b8efc78e284253f0035c16344e8092e4a0f49bec42c9ebcc42788b81897a0b506082247d67460b91dd72b36f34623cfe5da28fab293cbb95eb1ee7ab9723bdf73b987bdebe5cab96032d74b87075aaaf21d57cf4f6e845d18bb5e78a4c03cf1982f1595334fff9a312811cc934e9d2f95f798a739ab08f3a572d7c85ad076185b6b5fe7d1e579de36790fcbedb85eb13a0b8128e76c6dce1997b9e55ff3f823d67ae34b73f6f938aa9e3e716668a89ef0107da92c63799b9543e30fd058de66e5506dfc19cb1c73cbbf050431c6b9865743e71a98f35c025b6ca84ba2a228480951114d8c085971332224d3dcd459addeadfe3cefc397feeb7b6f544c98b019b9514d7db57eade74c0e1d4c98781d8b47e398323727031e16688e63ca5ccde7ed262e07c77bcf334d19f008a8c2499c729c7a12c046e539103850043e573d8d161f35a5451f905f507c167da93ce56eee79fd723ade2e049fbfb83dadb5f6fedeeffb48f782a40f247d3693ec851029ba11b11c111e5c4e67b5642157e93de42a61d87b0e0e876bb124b0b55a8da646b583a6e622c30483c242c90e9a9c1fe5799b66cadc130f5c0dc401f9db524dfe48a0384922addceeee056779c1b2a2f2ffafc31a95300c7b18862aff59f459e1550566452544c93eca12030f2ea7b35ab2deb5eebdc481a39e3810304cad66d94b9ece6af592477756c7e510e17018635ce7719161aaa24c89f55cdcb5d806dc0fd850978b63ca605e790e1c16716e54d485011658f2012fe63965e7c0bc959add9cffd6aea42af7b40906d63f6f9ba9b35a4d684f6f2dfa7c1fc8c2e3424296d27a5dadb57eadb5f6be7bb5be37f32f064dffdfdaffc737cc69e95f26eb3a2ca250f5743b3dcba6dffa0d35652e3ffda8c0a4f141684c996761ce90d51e19cdb26ef42eebf9193b2bcb7a64fd7fccd32ec97c653d54d66fb25b4488520694b10c6359cf679a99caf1cbfa9cc1818037f5f1fdb2aebb34ac4f9cf3458f6cea697f3752e92bdd3b5e0a43cfccd8dc3cde018b36a834ac9ec9109230800263180400c230144371180a8351326f14800e4e7c3a704e3a300c4943914824475114044118c42018630c30c010632442089d980332ea7ad87d158396cbf221604e3599f71aa8a2c0a0ca0d7b6b1ac084d57bdb86969eb4502c690ba6b4dc4d8d891cbb929b6d050a8172a2e3ded93998dc2c6d88b387c83a13402fd19073bc22d98a41409d46418e5ea8589f93a08f97892f7492f9278b49c09d982086398e55cd5c1f84be977bb1e3079f5937731a991d113378942306d6ba46035bee4f1455c94ef20bb29b43766ae38c332210c09a745bbd69263ba34e23a57aa37b3318b489758799fb0e0102886f23279f83c087eb9344dc3cb13a184460d0768f192259fe1e506713dc95ff67d99ea8320a40d9aa95d53e2d23095b8ebdafe6519075a9fcf5b6271fab0f895fe0439903688a9b40e8aeaf1177709229e34dca964fe263c1a6e884cb369741f00876e6dff9d1062edc2094849f81441df75f07214a86d237709c54d8226d57eb312f1b25c71148a1f030502afae886210b6ee9bb4f8b1223e8d323c7cd42e47c465662a2815548f1e1d573ec2c14d990b6be88cbce4a37472e36ccdf5a42adca9f910580821b2f533da4baa2f8ddf1df067c76c25cb97a0915892f80cfa046d2db7444874a61006fe9c0346392499ac68ba7e53afc5e7736f5781407a055b31e7a034d07c9e21ad7242b1d53e8f8b069a8c92eba68121a8d8e589a04b4744316ab3763b752aa5cce650ef68043de418b260848b7c3c61d86c168ba77d62280d8c231bf969ec2476c57d119f201cecd39521aeab0c7b60831c00201f98a3ee3f412ea264090147e5ac91b298a1a427fc4432cb3d5b9a2c25ccb3487b5ddc861e19610ca6a3f4178a8b60750622101d9c0b6d44527da21c071831939abd4c409280a1d1f0a833f22009109b7847675a77a8a42a0bb4292a8efab7ab4dfcaa4b75d61954df9eafc1337ab060d4a5782682351176d54106e785f17645b5333971ebab6a5dd81cbb8eeaa3e61597a2f853ba59fb16d5151013d528ed1a3b238fd67d2feed6a7354e654ab489d7e05b31ace1cd3baf80dcfc7ba08e30372bdac2578676de18f1f9073c080abe734e315d2d010759685f4c1ed252e4fea412009ab0cd96f1f518013ace2be938f2af508812d2ed9f6b3e630cbaed9456b967c8821a5961c1b7c6afa93c936e2388535828ed81c719bc077f055cc8f0ffc08c26ee6a788ebe7bb675873cf9cbb1205f9fc577dd72048bae8369dd465c8ac30a2c5ebbf3479fada90e52f894c9ff5a18819dacf5128746b07e702f89e37a8e00a0b45a2bcea004f794ef7c72f59b545bbe62795ea6500a7ba09a23bcd65103a8599c3544272c94b2265c631643d321912e488dc7a67760edac29c30c3d2e18dd0e9394c6213a55a978307d844b5dae2a3487c7a9d54c37bdddf3203c136c47434419d651506135be77d8158773b6742e638a7f30e286420c417a2d7320df2b6e89ff7b43eb21021f919d9de2d1d5b94f9c300e0fdf3a890ff7b2e54b915beab0a2d07e81a8033c92b1abb05bc0d9ab101f20ef772263cd156795125452ed8040c8a5233a43879ea2a8181c0b6a0559e34805a29a12fb65843a36a624c795c6b12d76b0774676222d7305d1ebcd206eab748429474e96a2ae862a4d158525d7bd814c8ed10473487c373551bd2ba0e485bda31c1466c0471ee8efdd50b42ebee20ce2dc0a578d002b9cbd37fcb6587dbd5265484355cf949b19c5f0a0191338c09ccc6ac9083b166b156d0e8b05b89cb902f98cd1ba09a2e372fa1765eccd353ff4689d45543c984fb8744f427779089c242084fb460b364c654a60aa61a84bb313e28bd7cef4b02acc7777f3ae918d59635089c76461c262e934a188143b0833bcf8fac4184e044c9e40a2502d33619c5fb4d4140e0e36ea92af21774957d12d75c902700a43e73c0534cfc49a4b201d6b2136317748451d6cef22aa34c5a7d72f03f7781927cbf4cc53828ee21a8f5884a13f23a577af7054ca0982cd14c5113c8d98bb0e1d03a830e7ed5412b6d0640273aeb00f4c8d7f162fd1d446c2f561eeb36aa52d87d053735bca33d9fc46ec294cf0bcd7e8c8903f4c53855f949693e32316935a9d06d68c89f91c6d7a3bfb107e6d7177d51bb6cd3381a79b7192393a47354fc5d8c0faf1d23dbb0512ca5680c013466a3f4ef603602338231e6a814018b12730cd35e865c774912ba60adc98406394b558c1068b391dc64532eaa06a2039fade2466a2c4628e5108266b399185e44e27a3b378915dfba8dd4dd36818d868345bc2ce23ffa5ff73ab578b630a542a90a4d3528bd5858e201683b01dcc6fd015b4e9c6302dcb7a6cd318d80c551c4f6707f57ca2b2438db17871b8158d5ab811382aa43b0c72834eecdbcf36af9dee3c156da1b64f4faf6d8ce355cbd1ec096cde5778f5a572a1197d5008e487cc3842d3f3567737b5a955295db760dbd7172685f05c3c8e909a0b105101474ea9624af627ca734af82cacfd70ec9f376f3037d4fa3fcffb599b08d6be8ece191d3da15e7b6d872ba330b8c6afa1c4f0b3054a079c6d54d09577626d4353f3c198d71243d3ba4a207f6f827253ff6e6820578007dd08276ac44482af403d11b583547dc463c3a72843404ee62f8b97adc2c82ec2bf48be80a928513e18f1f8e35b74340a93c450a7e0d7e4b011a414c4b539580fe767f95b6f9e7e6975b102865d72aa2c46a625658ebc00ed5f93e59e6cfffca74de58a59325370601e1bccf1c35b1578b47f7d7353140ddf05fabe2353643acfbd6b8cd39c7e85ca6db83a6c5d9e78cc28fad72964bcb31305b9b0623bdccf5f4ee3b51190df8695d27592005ce7ad7b5893b671299ff23a1bf747e75000426c7e14a5106e87cae5cfe01e51cfb5c790f72a2a86f4e1859e281416bae98004327235a6e2b3c87326a0a2aeb8067057d3965f158af6f7d218f77a46d22a893e317ec815c3140dde04c9160422733c09328dbc95af6e72865eff56324c5614a523e6e026ce280226070a0c049df3e6b001450dadc776b4add1dd0f68099d4f2d887ea0d7ba16d9d1a6721b7d527e667d578b214ed21eb1eb672fff0f74e8403286424584c097a7ca601db90e933115b50bffb22be126e81e95634036852b814bd3b37fddbd2fec426f2323403087a5ecb190a551896c7d10c4a19ca8058b37890ec4118489b751ef7a1763214548cfe566076da6f82a902e1f42695a4703b2d11c648969881035adad5002e42e32706045acb4512cbff0dd4a681cd6bbe880cf1c99c41caae95218ef234796580ba73f746216e340ea4515eba8c82ec776304b5307485d7b0d040290311f1d91a0819681882b5b4545ce5ff68887ec13dbfc97ddf23faf81b9415a323f49c03494d663f3d09af1ce00b04ba40b2e9f0903eea87d2b60783583f4dfe542b3afdbdd68cfb35c8d4490060ceca13fda748cbc32d86c8796c1eda0b0173e85433157fcc582351bee071ae08c67a4cce961b7b4767c5d422e7482d47f17bc313311819a940d77c70555de5cf8c5cc83d32827e10ab95d3419907d52d94d2b3e98aa1f70bf53428af557910a2b0cc0b7b34f8ae13d5a3496fe0eff95e5dc45bad5acb7b61af06df75270e227cf828bf58e440eec1484964a27638d4676845119ffd1b7f01a7ec6f34818d7db276a8f69022b33b5410562f6037525013a3a49e9828989c942dfb0e03e186060fe8a6bc48c90a10e2883cbf2625822e0586e19824a0ac574a65e0089e0b9a0e96eaf0c200710748dae138e5b8f902c381c903117e9b3fddfba688f6712d8b92d80cd07b01ab9ddff0fbc5fc66af6e15e1155a95414a2822d3a36a826f2b864b3e458b3b856c3ab24b5a4519e4cdd413829601ff173ceea17ce1e19f2e7253d1c9b60e2d6dda98afd3eaf64de2f8790cecb3ed635174961956a9bc3ffbbe0e4b6a686a1c2a6cd2547a7548be38a064b93a9100bebfc916bc0af9b6223a1d6540e71f03a234acc8a129b9e5261ef94b64129d38e26bad4222b0154b9cc95c8d31e906b8cbf5b6de19da4ee01c20254f2ee3e6fc6b3151d9ac922ab9dda6642f482b8efaf0429991f06848c9731fbbdf08266aec37b24e45b0a0b0d5153706831c00a091939822e776c404adea44e220cfdccdcd8cffb2fdbd97cc165e3c6703fcdb4b131204fab3f73739186cf0f6825db13c18999627970efcc20293ec474045a3a8610b91786aa69951ed659d49dc4348717a281722cffa813181efd1b4da3c377b9b84596d9e3d003113ed47e62045abe1b50112ccf598005df9fa795ec0a66026d574875c250e41b37204d57693490785c69920a669ee74c9a75c1a27f7574130bb69c27deaa6ef49d8c29180c74e3afba08e6818277989a824ed6d618ddf51be052e6c2ed87df840d9fe476f5a52ceea75f99afc1241c82440edc52cb1931da3454f754c76c49220e111fc0efd271038841777c47d7d84a4ed5b10be216ea11fac384a3d027969d4671fc920e906bf1cd3ca6cfdf18650de34ea2cd87215f653c5db84c67a26a0893aac0c07b1f2e92ad5fe90367c272e478e9c5a35b292da5207391c7e3d2edbca99245042c10a9e261fda88b7a769ee89e5a64e5b2cd88d1c6e11af74f3d11672afd3d635357eedb20bb992e3e9d17497a2a13cdadf6f318283b4ed6afcc423909a2695290a69bd9c3bb48627ac954db1c237e2524a71a40135ba519938fa859c48e8add698adf7b99e525840133916c136e2c471894c64a7671aba0f5026d9a021b15ab61f3c20321bc5895d8540c0c7022291674dc65120e25e3f605f0bec0836a865bca500c19665b5f70ad00728c587e892a7f58d019bea41a83353c4122f44d380b306c19c00cd121c47f505e80330be2f8b98af12c34931c22ea608c608b3312569e218013e14a680e11fb36aa133f51d74bc550cf29c2a192d01e329d661a88843794861441754ca25a4d670a79d127f984579bc5fa04e654862e1aa9b0de2376a0acfdbd5cad3f82fc0e5a854c52cb8a035100ed970d35a21c58a28b39d65dd7e1bfa7d6602d48e833b9c3bb2b2e151c8a1f5e820a8b241938b8c0131b16a5e375d7b691ff49dadfb52d22b6c29cd435faddb48ebb2a85ae470d043d253f7fecbc3a1ca2fa3e57e806fa36783a9c18659e0641718f3994828da676740bb28e7565d1da1694af36d5960059490fef5d2e2090bf181f371af802a9e6c80f942e55300e7df3664cccfbf1a079520d82d4fda4bd8cffe2eafa3dc985af7b636c74e26c6427896ad807cba114929e972c26fd59faa4c6e84956775b9ae5196b891584c363124ca44d9f8845811dd99656217812eb30b6e50d9d945c1be1d675c1fb3c1588dd68a359e15e3fb35228030bed570973582d08cf5ed8cbf3b7be71a9a2005736cfb8fb7f22a3e9b089c1c83b6192b6e08fc4148c96a3504b757ab5102c63b434185ee0682d923c2a9da124ed2042e965f83064314509829bb58395b21805805fca607de7b97eea93875cf44ae6813654dfb79e14c26509b2e53c5f69c4785a14c6b9a783f01eb62d45e4dcd7db5e412aa5f36f204e8242842179bb7b206f999870d80ae2d5d40976c7595d7f95df4535ba5df7ea7bd482ecb5ce2c7dd635a917034e5dc22a42a25033648d5449573e9a8d6cdc8a012420771f88e70fb8cf47624a882d4c10ae4643d242eaa3d032f50ccaaaa18687a4ccfac27f6a368367fd42f5e1b3862748a6d0712ed6807dd43851b48113bf78468961bacc3328b789c3c0f572dc2b3b2c098d3a9336758382107b01930291daeb8460a134f0d36df37cfea15c1a7fe57abbb7281c329520a4d597d0903e500a3cc9489430f6b0a624c6c122fa34c8c7ce1789a2ba42353844bcbe186d3ccf9951a6e9001f5d08a1a694ac9b00074197f9ad06bb0f8025abad288748db0341c91a9cae4bdc581354a4b95a6dbb840794ac323c7add0655167b4ae6fe328a6375c00c92ca2c8f460f241c14fc36f2d30c068d1806b75a7c7b74060708053104ca7aae2b0dac8d37c3929e2909f5bb5926063e9aa994e0bc43e17d287ceae677b88b8174a61ce2de2a08f72a22d79c0a083cc203a72ad8ba7ad1cfb31efa38b8b5dc9a4a532d5bcbac856b7e639c641be739d98e3c3c6ca67d174cfe68b828e0c2c3ac89e93bd58a11b632d49d3655ac933df79858e15418392ec2215317bdb1125664f5f08672b0a24a322e23bc698cc6a56e17484e41663a52702704798a381c8791b52aae62ea79a1df0050cc8a9e68a3f3719e01c999c01533ed644210d5549d530300a25723fd41b9e6a728397974fb152a152d0ef4b58c30d7a1fa4d85c04013fd4820194a0c94edb6359acce1606ff16a14f4b354022972273a8274d53cd0c4f3d0070df7860653f663adf4ef397b3403491102aeb99ef2cbb531ae16d688e7c9921dfdf220b81c4d2b883c26676369d6767a5d169259dde7c7ea3f780c5ec115f62e1793b21e6288594a606c31a751ac2e71775d395bf20359686c912e55108f3376496e68d275a3cfa65cb47e5e38785d35eb3314c28eaf1a5022b175116ded9653de3b8fc3c155f674ce447468ab6b4a36d1495f5042bdb457ed5e10313d3c188eb6d1586239551924380aec34dee2769104fefe4b9b2ec9c7331ee609726074fdeacfc5666b018924c0fcaad3013cdf44dc6f9330e2c9a50abaa61562ecd139d0d38a4587da33b9e280129e2276ae2fec8426e2d2d73bcc109542dcf468cb39b80d0442ca1cc0eb7f34a6bdf8feb3b0d1d1f863fd36c65dc7c4a7befa6c4662212a8970f05712952fb786cf59d83ceb856e864131e68f351ae631e3d8f735391dd1a78c83ac0ed0b7c28d23e66de4edeac53bd1fc8ce7ed2569dd41ceeaf6717f4e38b9cd97b39dd2d96c83fa9a51590880c89d4ac91e72dc57602a384e5dde04fadb27f7b124f4f4029b417577902f2cfe20912f14507b3ec40013122c2971c2be2511df90cb37396850fb65b470a89b9d457b79baf2a716a275047cba73e225f73c61312f36782495b7746e1efb25388737e3a417bb6e344df1fe5b40cf7b9a88fd793b30a5f6c86f2df6f29cf4895de7eba2f0b0dc4484697564d1c8552a5e48c681c8ad8355896ae2219bb7a5189c61b6c9db41a0f694dbe7de4e95847601493f624248af36b2f904fff9bcdc17467fcece8c301bd703a6917c7845938a0d8e40c0961f66ca70d1b258613932e94fd407b3f0105f4147b7d1d3fd08bedc7e85a60d6e8c542e9b742cfd5b7fbb2cb29a3016f94aefc3ebfdd2788c901bd4402fabb05446dc59c08a4d2351277853e888d64919876550ecaa036f3cb4d4e64671e58e8f4df797f0e0c298b60a8f1ea53459aca7f3a2940788c1d5dd9406dca209ccf3ad9a83151520ce4f6b4718b5bf55b73e548d99050bbf10358dc29e2e393ad9d93afe925a75a033d4d86e053780ad254f8928b570da80ff10941aadfbe6444ee67baa8810638ee8bdd45937812ebc281eae0c11fd5c901d0654cfaace3cb9e5db73f7b71b3908576fe492ecfd9987845f16da1ddaf059b180bb0f003093722982ec9763d2591b9f818dd966f14a4a1b1485261059ee4e808bac1bcc788b77b0c05fcfceea8b427219d17c7ac630452b9339578a6e7664bc0537676d19aab8b13e079d352fabdcfbc0c988d96f5b036c29440a02567232b3ccf4ef19404470fade1a3445da1c2a8ec9a26624805f0ea24489b9838eb80b99f48f45f674e7d7be03ba6951b9e163d0f4dcde59799586d2f3aeb2f7382024fde80d6d468355b62f43e8e229667c032f504f94c55670e90c413401db8253f32cc07156220b0a2dc2da4097684279612dad15e28b0ce18252185be01d337feecdfee40d7baa256b3c3de5c27096e2a7e9c4d060d8d427a47819a4f86070d15ac1f9a35763208d370403cb8bcf37e118589b58c6df35a6c40011884756c93411e950b544b03cb16fef98c7c8a328cdea4e25c0b81eedb001f48260461a8a74145ae2b3565a7d4df682bb613590935179534318d83c676c2dabc322c1d3c8dc71304aee7f50876d68cc99028a06f8d419aca0f4d4cf49bd06f398c410e6d27b3023b25613a09db22085fe843158517e73a277960e96fa915a690800f2d4e09fa6ad25b80c8a84eba7c7322b34a38304010ff9f7736b4e5d394e12df6145978c5bba022bd0501ae148d939ef3f61f9e0fc0628b24bbfd1e73d36fd06b111b09109a06f1a9fa62735caaa8b09641cddeab8267caf465f592f482d91a7ac9f30c8e67a9d2781c12cf14e8e1221228cbc2b45d3f622c42546e17c84011a03c05c1e595369654e278a2897e2851b87ca694a5e83aa6f314dad752965810acf5bdcbd468d0e48d7ecda6105a60bec5db37f7f96039b198bf65e840006e0f0f9f87450ab2302c763e8097010c0289b8342c853c3ce44e216747c8e92129c4a8ea2ffc79f02b9a604889d75c39c87ecb4921f5421283c2b6201ad2cd1d722235afcfa7b7dd8383bd863e08770e847603aa4ab6765a3090424a0749d6e825be83b9acf47091530314da5738d52f8d8baba09a1caf5eff515f32f10fcd983c71d892bc80b21800a150e6c485703ac846f1cbdbab177fa83eb1c2a647b26a1f467be1acfc964842f6de64cb2da54c49a66e07ac071507499e6cfe7d3739c133dd679288c46e77cb008b35c16ecbe9ddb108927e3043615ca273c33844a5b5c4660882063d842923a8790b195158f0858a34644610d40fb022060d146244a1023441cd666431060d46ae3803065182fa85c49698624aedfec55883f163ec96115f0d8864f0cf7c158063cc1f8c31f0e74704cfb3610354e16b314fc778263eff9420e6606b4805fe01139598a75b6083fd5be64382e64bcf05ff70e8fb871f0efd78c49732225dffd260548a8d8045ecc68f6d4ab6aec23f2cbf76984886fa873db404bfe214f0b92f64b13ed6ae70d5c26d05c77ac5f2731cb23e630737e425f6a202f38cd0c53618fef1cc6b97115d3ee4877d831b6b98189f4c1897b54de18ffc4737225d157cb42b3e897263194eb6b8786ae2f481f8fa20ee38d57a40f1f32382e7d9b0a1a2df0ef3f8cbaf9e3c8e81f5af1b0754d26ed983631f882f8e10600ff04fd5b2efa08895c4d670bd12618e013318d7b90852e79cf30ac50f43268c4c052fde8933273d8301211e8b5cf71a9f54fa4b8f01cd7529a51412f218e3d71c3bcc73b3f083eb3fbda8456e0ce6fad3af07f36c61474063b5f7a802f3b49867842ed6ddbd01da9f3e68e30e05f9f4a7e782fc703e9cece3d17f0506b1fb82dff91b8848777a1149f3407fe9384a8cad5fde8d3b6634367b970e36ec2124f86766fce31f3be880c592943f392b108edd266a3086da079d3ac38676639773df085f7ebabb9b02dac66245dee11eaaf50bf90a50683fb83b1e0072b061ebf69276b5780c1bda1b81982752807ff86bb5367ed8c1ed2f64324343feea3071273e19a2306e8c2d831b9b88b8b1c1304f7424315ebf487ac889b61b36fffea4189a5c102e27c16670b7c8b5c7c03faa2d31de808945c6869145f0ab878aa491bf4efce3f35957ec12cd2cb0aa2fac5d6ce84db01f2e1daca6fd94807f88c41882882f37414c72bb061144f8f9817993371531c43cfdae2e56fbe290ef7c3164a6183253a49908f38b620ffc3391408a26883506e14c4b3b7cb8fddb085dacd4c23fd1615eeb13975cf8b5436ee19f30a2cb65c0023256cced2b6ed3806970436fb28279aab0fea1c3be30f670fbbb04b7df8bb8fd8cc4ed97ccd3fe0df98b657ff0cf12fca382d85fa1b05bae97db4f82c47ec23cfd524abe71b40513326e28bb2533f713d7d13296e9275ea678982a9de57690e83232c5a5d82f01486e620626a3ece04d5d8820714349d48548911bca25d2483eb91d97881cd62eee1243112a6ec8b992b8c43ffe9d817846124ccbfd80c60c6cfcee7a84c0c5f287c0c5c6ef1aa0bdc38ae09d0e3a60b1ac75d815d612b791b8bd14c6a59091ba9134d8307f492f358c95646e3b4c3a10d2a889795a3ef11d7f39194847ac2ab60634dcfe251983fc6413f550fcb0878a482dccd35f3d59e43bfd2088b13e0473fed061f20c8e92adaa58de4fbccc5345f8e19dd6c23ff1ffbfb7c40e23ba625183fd2c321d267ab97149bf40a703feea2d71a7df0b2ccc909321eab88315378cad050431161c010b1b7ed02374b161346a2315f887b5f0156ef14f93c7a696b189190c8caf8b2313ad74436e3be305376c22264937ec256dd44f2447e6c204cb6d09e68c0f2e47f7ff769887dfe3c90929254bf9cce3dd4fd06c652d5bdfa9d53f6b6d1cf3cf3ffeaa9ac7ea9d5ead18cbf58f03a3a92e90510e6872766ce212658aa332ad5b6d5a4760f5a96e98946cf52b4dcbbacfc9aa87bf561f06ac38da4ee08d568f0f0ea5a32d5f5e00c29decba4ed6db75a954ca761da700d0a6466553400fb68eb43a846b9b4597225362ecfe8848c91222a26e4544b442ad7e552b4a2ab1d07d3d7af80ba8760940474766cca4806000f5021033603461e5fc8d568f0f8ea32d51bc00a423ea3a2225a8afebfe681bb2fa2728a5ee811a080af5f1811ca1524025a89e10596b552854f739a1f1fe3937effffe5a6da71e1f1c3e346e56361e4be5d979d4b53d422ac354d4248448c99229444444444b3b907c69894809519390a6a6261f2d48e622c5d13d5d0f0ab9568f0f8e23a418c392e4ffc307119192a21d3e5a00d2d464ebc9878f1d293ceb098b2885ea38056c0a38294053808f653dd8422a6a1242a46449b567d02c7193eb3ac9b55aad31635094a3b293f5b260a849142a190b9483711cac48c74549c3d8ec6b1861ade86d55caaeeb50d116a55229db75dce7c466fb9cd4bcabc01ba0efcc1aaffa0eab458d52536c2870d0cc39b8a473d2e9eed2dddd5dfa74ea4e9dce499d7febee76293b3a783b9457ce8f83f8d75f943bb43ea8b556adc6d7546ce3b67f41e2928ebfcce15ca72352fad56aed9c4936ef18424704f819675871295d4a24fec2befcfce1079723139feeb3baec1d2ebe3a7e1c7050d3f1c3d31d12342468be0c1beb7c13fc9a43b8fdfdad10f8677ef351fb503aa32fc17c6300f1f5c59df8fd81d461c48631c6e6a0e63482cdf26bc8113cc4e0cc1061aa98822488a310028a0cb014d10289893b4311222940c3a4091652b0e0c4121d62673c495383f4c80d6699325f4aa6692d68c127c26ac6ae583b5240b23b906c6e08b699eabdf51252b4e08d1d297c99f58c760326a3582c03c2c424c423eb2114830d9929922d6912850a519fca83056e3b4909138a99f45337f1e74dbcb9b9f978136fbe18638c4c4b38bdfb83fead94557d11a9418f58e251642256a1e2d978519e3498e4c558fca2d4e00170b0fdb62dd2175f8e628c3146d5506c08498c4343699e485363d4c4280ea970dec6c808e76d706c1ee7716c9880a83e2738389f508cc9a84911214671280d73c9a2caedae07855cce4fa9728414535a623ad394f4654c193368d208619554a954920a6bffd43dea875c0ec2f9d40b892ad5c717d260cd27c423daac6caaac7e65646363b352a9ece7c426f539c9c1417d4e38b0c1aa712a61f5fe3b76e4e0706083558386d7f20112f29d39f404895193289b6d150d3758ee72520d63e890200ad946114dc734cda49de09fcc8818f1919062b1cb4a4a97bff28fc3ee6d9612d708222e7f03c1af864533b81ab122681d2e1b11c3606bec2ad2fd0c1fd47d52a46cb9c9eda4790d23c288265222deb8648449045787863528865d2d0383fddd311f11bcc426d36178b9fd48b7bbc6d860cbc0dc85f5abbc9d02dc7e30575afe5799c788cb32b37761be0badc0f2e52ccbbe707a1f5d960d4595b6f93989ae6750a5dcb88a33581d91f222558313b77b189854c3910a4ba2e1ca49849bd980ca020c4121ad008688eaabbb78b2b2497ee71c41fc8b67e2990639c2ae134e300fbff4747003d140349366c23cdd41208c19377e18cdc811d3300fa7619ee83b3186bc65cbe5ef2beeda8d1f6a7c74c39dcb9d8e7efffe3a13a4accc2351b0b14e588dae339acd66ca1125f274e59f2c0a1576e557d8c3aefc875df939c11162d75efb1a4d146262b020ed4f4f630b246400439eb62f0dba0fef87eff819aa44634b4fbf23022295944ed5129658141b1aa2339b59466f888e94894a323a7dce39a5f7fea256f08e3f18900b0ac676e23822205e7e1aa3b17ead60b40c3d43d31c8942c750268a863665b0acc8f56ce8fad329b331d7b331fdaac9ca9cc9d2d4a1a68c29435361b548451256a2eb4aae7fcdb413f72cf7a31a496c7f5625abe2afcca8ca13a4ebd994ce8466bae154f27c2976e7972c16e9ba12f3f8cb662ed7870e0dd67e8bc6fc450107832a9171fd43ca14f31707292d5dcae483799cc696fc29933ff5a7fe5ba431e6f117cae2a5ba4868ecfacfe045cc0c47354e44678c7e69d75cc17529a534aad185900c41e4e7980fd419adde95de15b0341784a1b9f475b64d6aaa159a2051ad208419f9a9971fcb13ba90fbee1be2c23901f5dda33e9d1bedc239c186a8b7df902b71787450cd7750cd272404419dc7d7b994e742fdd445797c3bcf85d4d714cae3cb79f1a6521edfed3b0f677b8fe9ab3c9dd6c1777edf20a5f4cb59354827a574470aeda24d29a532abb505ba75c5416ed4ab5c4e647d6b470a35542b3429e2ffff1f869cdf5f3f615bfe5c552b0881a6562b3b0269a141370178a57b0b3f9c956248ef833f89bdb91cbbf8cfaf7e0ad2af23986175a47bb1b14ed779380e8821e83e3e07711e8e033a049c25a8fba46859d7d9534ffb7050a02e684f9f6fe6a1a03dfdceb2ff1bbecbab0d56d50a4d94c49bfde98300135af68021419c967dacdef1aa0342180b7edf604f172bdd098cb374df7d42343004f7c170fcd04393201c07c4e79efb8404f942095150941f8efc5697d5f2f7f17ff088f6c02cd915c6951696d5d3c5fa87d3cff1eb7ccadc4283fcd25b62ff0e61f2822d3c1c01e28a1b98098a5d90d0c04917494d68088a6fe3b3c26cac538704c5089c5e7bfa5af6e1d053f6f579645f9f7efd8448a1dfe9eb8743bf3e070911228587f6a7d337804fa73f7d2180e1f4dac7d987433f216d48d0101c66c8020be27e7b7f0880e13ef60d024b685eeb5525c9c54283b05417363e0be1ac2c2a79c9899a05942f35184119828aede10b192a4842850b26566e62b7a7c002ca1359a4f0b0e2a228e9dc886eeb2e41f68496b02305d683dce5a41976608d41c54c085e9f9b09f1f81a1cec981b9ff668302e09f1f8cd6b695e65676767778f2dd021b37d042932f6a4013152cb47d6f7260f39dde7ac92c592734ed98216b15dce16da55b5e76fe107907659b66c1ff53e2ffba9ee09c00b6c7cebede02797faf0d1902a9c07f28e4f9f1d3ab23bc1823daef70cfa3bb390bdb5d6faf84b3fe9e4f4f5f48ed799459419b24069421589713aa5f7f8e0b07139c98819777539c90818356cb55dce44707451458f0f8ef9e54a3355c210d344082b33084105352421c5152fe052441738bce81e1f1c2c6ec5a52e271909c37dc12e40e208aca88ba22488b4a06c91658a1530636cc0027b01d7f4cd2b323051d0a411234c12518f16681143040928497429e30aad8c3139d3cb0a63383962840c9a1cf170450c53725012028951156514d1328030c0b4a28c232440c1174fb8e01a74a952832196b018630728c66092c2063e883063f186218888c1428b27c620a2041718385102c6858628747041360600b3cb901330499285891670f132c50b37f0014a0d96b06287335234597192820c323ca842636d97938c7481822a62b5241991a2c81936dacb494692b8f4729291238aa4e49fbef5646b1a36465d000f5d4489dbfdd58ab9cd5ac00daca42237dc7e26f2ed18ebeff3e2c008a805a54e92e10637e462676ec863788999e874853a37c01cf433ee8277669e7ff4e4ff0d39ef461d22b0a18ffff42410eefa579d2f8a6183198636c60cba0a2f9a2b61470aac07e5e52419763891608b959931c8482c4a2b1f1d2e8deb97936408ac2a2cc6c11db25aed9755e30a96d6dda98149350e4c39db25db956594c179dac0f5fe008dcc33b5bb751cff465147b6fead3d14fc25733195a3025caa863558a0a323c550a3a9c289a2141c9159c5a171ab9ca22356a06543da72a4495f82eaeeee2451093b52603dd85d4e2a0ae286acd80976caa877edaedb19965e4e2a5ad2dad74a2a3aa2035759a7f460b3cb4945b032b65e4ee2a129051ece9cacf0a92b4032b3267a9059280a6a7024d81ce2869e8248fe706badbf3a536badf5c3d6eda99f8f144abdc34b95c99e6149d1f4b0dee12c43bdc3ed8304090e3ba6a8a2f396abad1e1f1cd5b250508fb82f4e6268711ac2de5ce6a204d2905d5de6a204956c0a5b73998b124168b1f632172592685e2c8dcb5c92481380cb5c948081d2c61e59b694a4269404008d0dff46fe71ddf820fff88dbfc33f1bf3c47f55153728a185097890a188111136a8419a1bb0c0224550fc07b7f8623188c01ea0149a70fcc5e7461ea8dc90b100e07a73fc1c1bb3b821f73e0fb2d10f92cbd03a0683c17408bae147ee1ce2b88e85bff098323e378c4896441cace0c1e106d79f6582ebff44615c7f3087a3ebdff24992c3f5074ac2c5f5df2154829b340231aebf8f26aeff0f0c6871fd3ba0c40c1812493ab4a0e887eb9fb48394ebfe0476e51c821523f373edf7226268582c797c706862e6ba95b02e319c6234c0f5b729b8fe7c0391eb4ed43948c8ac90d0e0769208a8a027d858e7e78920e9c51c6628e3491008455a58f142c599334b58090a62022a452841c922c491a0eed3c541fe660023ac7c1c965ffd85c31f8e0af3e93bc0bf3f183e18a4f0e8f70f873fc26060f9523e4bfe22969e252c3782b0ce3116856ba72d9ab0322422be985937ca4990b5b4b0418a3b2f27d97014c4d651065d198bba9c64c3093cb8cc858a995615dd3ed323d3dd96354550a2d56af94edbd66cb55aad56ab25db6d2a73758a2d4a9b0d4e6e777039c9061a6ebd9c64430c93868d75543638c69e9efe421bf6b050e307eb5fb3d7de9fab1fab77e747ed8c5be79f3cf99a0ebeb17e7d653faddefc8cf665eae9903f9f597a641eff1e17d8d095dc7685dd74db15769aebef9204261be7eca676c5bf118485410a8fece9c3507f3e0c194700250b8394f830ccaf0f03fdac3e8f8f07fdccc8fcfa46bcbe014063fdbdbbd9f5af60cb81887cb71b757b998de2c8ffa0ccc3911f0701e5607530ab020dd9569118bbfe9571620c9a5e13cce31f8d825c892fd9fe2e7e8c2dd9806e00b2c166ffc16c974797fc39c3c6cc0cfaf0cbc777e2f3abc26030d85110bf102c579db23de7d7ed2bea5fd3a6fdb6e99c3a577e2f4cb069405b4c76ce3957edca3e9c218e1b7f94108605c2ba92f54de9ad5e4f83b7f59c1552dd8883e37a737e4058577e37a4d28dd76a327e383d59ddfb9c66f5f471da27e79cec69e6aca0efd417ad99efb0159299ed0d71e47b97af5c4f8596937193a6554598bd67926f286b0d71e80c8223545f75e335a16ff60db60f3f65e5be6a5de0cfae8490ac502062c355952e783969cca4c7cdf940ad55faf50bb3979fcd7e7e56ab9fcbcc5b651f7299cc68166475a7ce9ddf0b1387e7522da58c5ca4d423b7e22c8f159d73caaf96654b29e70c5f9877fe0bf2ce0fc7f52177c8fd8c089ad1effa85f2a9cc80f8f329a79cf3935cad5c4d79e152fe6549e99717dcbbb8587a4f8352ca77b70df2bb4b7777777777b753a49435a2d8505e97f6c331219c960b3aed75fa734ebabab299482a1d09a01a45587e81be406f9464e6536ef5ccdf6aae269dd36b1672d7e909f3e9d3f9e1a86e01c88857da7c3b806241edcd654a595d92b9aa83c5fe4b973537deee02350f91cd9f7562dbdbf11dd62f1fea9d762975e6a434cb217b684e4a59594e8eac4321de10867a23d34ef1743a69dae964c2111b7e8be3ba0e85ca5e5e27d927240441dea9d3116f372b86d0bff5705cc775adaa99353534502106ba0e85e294b5e055a150a84e472a956a96b5b6d3412f4ba5aa61a6cccccc91a83b1d7d57363872d8743afcb256ab55b76af0a663314ff3ef5cfec20ddcd8f9d015cb29cd202cbf0f49979f0f3985d55019c24d9a659911a9d4775dcadbdebba809dced79ebf8b9ed936084c030f8cc9472d2e6bf799c2c3f8e45367f57697fea3e7eebe3db7c642c6e6c517163c74f40cee3e01ffbf16d6aa2a41da4fa4438c2f2c66d9b90b358a947fdc6fdc6d98f9907f5409dfac27851dfd6793db69390ce3f8f061b14bad120c740fe29a964996acab4317f503666044877af3104fead5b36953de7176377cb6e325b6d17c75adbe53de77bfcea6dffba3bc9c63aa16dc9d4e3386e7edbb6c928fd738f5438e56218a573d987fe54ca3be30f9535c471d93e04194822a559466956e9cfa795dafc4d6d239bbfe9b6b9799bb7d9fee6396876396aa434fb9cd8d8c41acb9849a1721e3c428a292d319d69da8225e9cb983266d0a4e9228d248b59466b462355bdfdcde6b58fcf31e0f4f1859c381ddc9fb8533cc54ddaa86169c62855a11289ce00d9a1c38ad96965e38e723445520f42d070628b0d5678f872134676eccb65a52e5f6e68bb3cb95b2a46eeca8d7e8ddfaeba92e5d7a0ca4d0b86c630dd7011c6cdd2cd1634d0f0e18605375eaae862e4850b6a14d5e0814610357a00e3080a90d0a1092d376254f004d20e5cbeb8d1e2872453a800c20a1a5720a141c48dd24d9924624a66808285111a5988d1840a13256894404aede54bad4e3f8ac532bdd30f3ecbccedd78e6c7419733b2e91c084951f55d25fde1c5e5c9a4c1dc1b8dacba57665cfc43facddfa9a273710b38f32b1b160564bc10d35782962098d11dc7ca1c1440d1f962832230222129ce0081a4f6ec8383102871c680c7183457cd6099fc60a6c68dfbac7d823920085cd1139d9a0133664dd9843ca771ce93efdc68df32b3273e393f0840d59d286172b3912a4b0a18c39e277fc7a6e06e295fd3a39d9ecc853045a520a86aef67fb754fd2dc26c84aa583f6a9f6551defee17593dac72e47d6a530447a17e9ffe09f46d2ae220bd4af51c98d4b8e6210321931d0f67c34583f7a2d34583f165c15ae6efdd0e7d631b7be4fadde3e3afe6a99f65bff0ffef15b1f489639e17ed5f5bf5dfeb57eebe3de895fb52fd4b9f5c68d4666804982058c922ccedcce3c0e129253851005182dc1822a930f21f535178212f32567f2982bd9b05acb62fd87a0ce2028fbea6d11012cf4ab4700d05821fe71ddfe1e52fc372a297b01eb6ebfbd844a7783618405d1296329f897f0431d3056e676fbf821d4c3af7c1d7ea54f1ba0dfbdd656438bada185bdd65f42bdd35fabb52cd6bf6d755fa127f6ef085944b1440a92132a9812d40ffa4b02464384210393a2055150bf65390848d847ff8f7ea1fe1e67b6a50abbf1b718962f7299a36a05274b1c29fe3c72257ffddb70b13ebec7f8a7c687ac5b437bab071fd6fb0383f143bf9a92efc4cf9a8a7e7b4f8afdcca872109fc6673f8419981bff66553ae03b1918d6cdaadae47c0d003a780f7ecbaa745fabb5dd57f1170755eb6156c5919827664b48f1b3a6f8d952c654e3819a1ef9ab997c273ece737044e30b6d7caae42f87d1267fb991effcc02e8f82c1a276f9d1cd17b26e6c946eacf94256cdabbe260f68938def8077f08515005f6873be90759bc9b7c7f9c2da1c7c363c7fcf97fc8b2b45c1aef80e73fff87e847ad60ac6bdcd17b26adc48e54648b584af04204f79a15fd4173a98cb79e1dfd091ae1c0ae593501e51a2d0ad085917164aa32bab9050032bb1ece897f539f34c510988890d1dc991922cbfb80b145c09a28b33362802f6803263a0188232030d4c303b9223f50b15f3d89876319a22459ec6bfdce866a237875c5cc2550fda16b50eee386fc3a259b971f9650aea11292326886ef8494cc4906425c98a5f4eb2c2b4f2ba8b2dfe9c9397fa87223c26b2ec468179fc99397a701499e0c85cec2a0bdb396244817fb6d8e5e86e8ceddf5a26f5f0a48618db3fe7e48ffd50a67bb28e57d7216f7b72487cfe7a26fffc6ef46ff363b0416700ce09f18b43ee77839b39766024a4e93a2c76920f0e2b27cc0db93bc1dc980fff1ffe423d98c114169665a5944e00a21ecc48a73a3a19fd7c7a5aad956d174b297d8748ba0f45b33341d3d873a23d77ed446b3518575e438ba537b44058a3062b5da9e27277428ddbb1898d3f3273cb6db766d317a52526d939ed0a6fd8cabd52ce8e960fd82ef9fe812e1cff21d75faa6a83ad063f27f4e7d7d3604eefe448faab7ed1d60b84293e2508b1c0444e995664a525bf39f13fa907a31b7364777bf1da7e45cf09fdeeda097d3e41c6707d7a7aa7a3a3a26614bb72943665adea6fb4cb513b5e5a65bf6496d3ae1cca55da3265db6573bce0fbf5dd2fb0775ade5b8e0f10ad94d2d63e5b9f7e8eec6b263b13a20f50c85d9ef214331cb6c83cdeeeded46bd6ddeefd85ee93455d4a29a59452c629a5c7d914f9e7c68fa5ac16749fd2a7949c6b0b388194ed6289924fac5edaf8f117ca0b8463357f40b8cdb9e8e19cc01f3f7e3827c40fc784789b935cf43696b3fbe37a8774ec285bca7f736f29bde5877393d2bdfdb673fc146797cad9e5e09f54b6e7b5cbd1d30be96d996267e61cb6b935367551b7fdfb931a8da72d2eafdd1cdbbddd679572669e799665994baf21815c842ed1fd4b419194be748d63f94ba775e6b7cdf7be9ec92ab51ab3bad5e72dcbb44d4eaf34db324a6fac6416dddd5d3e9f32cf6e803924093158c93ded2a1cd337548ac19adfb6e95f53b243c12f176b6a9e7b95eab9865371cfa99e5371a82e5e6953a88f99877ba0e63a2f5e194fa08e0d33744e71480e9ed9dcb29981e0c6f7483f9edadd38aa8aaa166c4172d49fbfc5d805c9d1bdd6d3aeca60ea39f5c2954e6b767a0ee26b25832954aa0316954249c9f7e4c5db719b74f9f1e9a43957cf89ea250a12d635d572054bde2eb52ceb82e4909f7de5f82715f29d13ab65b3fbacac192cb7a3e6179967d6764d39655635595f52aa519aa3f15c6934e3b266adac9c4e5fdb387b2b17a0aba8b44d786435756848000080001315000020100a0604029148241ccee2a8fa14800c76944478581a8c835112e3308a31c620640801c01800068888cc106e00301c327e6fc923fdfb2db72405b28af7b174bcdeb7182ed36371b3dcbeffc8904215dbb9969d8295dcb9022de9ce4dd0a458b3d62c9941c522d94653d57a8d29bfb57b2d9d5e17b1e5bb7297b2722dd2b110d0c8cc4f3c91c0afda3bc5690bb9f6445f6b795f55291b21b2e0c82029aa0db11a6f7d4c862fa151240d1cdb7dfaed4090040cca5d9256dc93e42caf4183d09bd9f7e48049a13ab051a5a1c1ef9e768ad5ab748d38e3d1e00b59702250f35a831cb3c7652508c1555104301f7483390d60d5041c25726109dc51c9cf0a5d8d388bd05aea68483b78c03ace8c9671c841f175f3657feaaacacbba8c0df92deed325d0eb1a63fa33c27d5252ad4b6cf951ba4ac9f48a742ce827b4bb282fab2ab67c97eeb2a4ac4bc7d49fea5a978ab51253f1031b329f05f567e5aae5e5aa8ea9dfd3ae45e9645d2a46f251bacad2b2aa63eaafeaaa4b25d64b4cf5292e65b95c997c2cace2829da704606f67b9f094c884e458b19f5ee38a357c40c792836495c6ab241f90ba40857ce954a4e88beb2e93bef9aff843412e9da57c1f5b61b894b15ac29b343aa8e880457c9919ad69e9642ab3c2ef63024e84c6504fbd7290c4fcf327de83c944731feecc889444f7d343c1346e6d4e7dc2d5341a3a5cf6502e43da39ea9beae662badbebcbea0d8aedd46b5c6efa03797bd7dc78b9a4d385df359d2543dbcd6e3a9be3e29fcc4bac0b562e5676d86d8dd10c4737e22eab4a370f39b12ee50616f8ce2132c2f740b1ef794a3bf105557209f4f0cc8a44e5341b90ba53a1a7e60dd77e5f56456b66a92c8ef3b511752f89218528169685b55010af33b99ed4ef46db6c65d987b2764e4dbd9d525765ecfa5bdd7589c47a2406d407c45d9694ab12abfed4ae5a5eaf8b58920f2957292d5765ecf231ed92be123bb9ca0a7f41776a03cf8f27f87da1663ba28824182276bab9da3cd558836370e6e1222219eef5f3e77764741750052a845fba2a43f0be24426b1c0e78e5252921e469d90a49724762048a1743887edb2a4d759def3e89b4a9685f7a43a892be83065f517f8fde12d2a961ed37fb962d652bc62db02c0901187c020dd3b0b981eb87c2228dd5f344da8c6075625a6757752f587b8bb9621efe23b1a356dbb7f7e9466efcbc9f68504be454950642cb76742df9af4f86e7843bcbb548d43640e9f9e67349fe06b43ee32c924f185d4e6c59333504f79816c63cf2bcb8c030946859b7d2635c91894cc037d0a6c22b5491f6488c9d1d33865f44f0cab2ed5509995f84e0ac75d477fbc1c295ef375f7a8e0c2e5d4daae590b7dac8557f8dfba438dd744388173498886b6a7f6992496d09896e2f88f4a0984bb4493c920a268f67a988b77e753767bb4067c88d770d0ae46c4785bd4c5cda438142d41e8eacb3dd7eebd603ced4fe195a951527f081ee902e44f623e1b0180e7793cc9c91ae4505895b266744296a91c36c1f10393c2d8308254eda95c9ab7cd653e56cada99a5c605b173d017e93f7f10a2dc0e3f2170424ad9e38870c09613d9034b6bd0c31d824c44d80ab46853b8dbdafeeb1e90db6d9486a645ae56e3ade67a4a62b5d57ceffd80d54f8d1c4fee520ab0d618da6a7211aeabe362836e5888af4f60dcb0d700cc9155ddade27ff986900a32b80f489f7d4bc1ef742b07fbae7dea4166b470226175553bd6bbf6e7f2746aa4dd27b916f4375c9b72dcc9bdf1a0d1323aa091876e751053362ce46faa48470442bbd9416b22c430a69640899ada547b950f07fbb86789a40711bbad2a72aeea782bf3d0f55a7a7b0fd62225487595bbc5c3de6271a89b54678f47fc50cd70860f30c4a29f8f7c6d4cf1fe7edd758bafa633a463c742269c72975cd39dccc6b2b9b85621c13ad48c90a20c4564ea14117b9b7fe4f2ca348497f5cafed0c8851ddaf0077c3a2f5a675965480a7f82e5ebe6924e2dc122a2997ba847df4cf5d4d3bbda922cea5eb3dee80751d9ac045c365bbb52afc7cf68e10cffd943831dd835588a07a4d8dafd75c8cbd264cdb6bd64ce7d67d3f6f725c83e52fcce9bc9757219a0100379cd519a6b905e2c24cf7ae0bcb625d16bebf23aab8eeb90f9973ef4b187876cfcfb77cc404e7433690b2aa003187a5e8cb2639e181fd4919806132a3e6b08574e4a4790b0d8146df3702b8637fae67c8a1d2e63c55161524fd0c4d751c29ccbf9be1d67970729bbe9c820f89242d0b549478100514c275a4fcc7128fa6461f6f8d0ae875fe70a47bd520fdbd1819ffb7b025c0872367b0e6e0215f61d0c48cca309aa4775984627eb6c4d3cca5b551c86e4a7a18de94d7847dbf320d8a58fafab8297ced95cdb0222e95156e1721381cbe69fb3b3d5a5f807988b52cb5234ac18b9e4342732d8e53da89c162d278cee1a704e4833b0d4536e115270b4711bfa026795141cc393a096421567273beacebc1f2a8719998a7e0f6880bf70dc8413195a41d546d4234732856380931fa3e5109d141f1296c24768ab3e6c9eff9cb2bdd41ee808a463a8d5aac17b1f794a453912c29789101552edbea4f14cca033185048e6a3e01364933166a72653cd1ef05b3807674b68d21b0578b037a94b3fbfaec0e909dd93484eb4d410eccc5f4f731f68d49c9e2d59a4e3fd361331aae84280389b8985fe379d565cb305ca672c903279ac4617b3f175c15148edc21cbd9d0cc2624ba0401c27cc9fe8b33f9d05bfc8eca888fe914201020cf6802e8d317fa971484967536ae85ff6eb025e7593060323434d4ceed59b245c23e0b9995674c629ef4a76e90ea69a6a80d381952fcccc2f2a93a7bb90fb69e3290d7f7b0372aded703e84b1f5db3b650ade41a2f4a320cb7b16c8fadbc410b6b5529028306e1f58fff3b2849254cf18976252504c0e8bf9b1cc9db245aae1dbd295bd15b1ef18408afbafecad2eb6edad67789e47aaaf82bb90533a4e25436c583395446cae79deabd1ee338f332b49d24c5cd100ac148bf2a998d849ba0326276a92da9f8dc6dae74a8ca8d6500180da4d03320b41634712486613116942bf4ff93e7645c61b668d9782bec6b00c78a4277362d80c667fb96e2a811041d1288b248a818efe58e99c18c18b557662cf2431185b2e230572ae39e735f313379c493e2f63fe766aafee71cee0983e10c80ced84bbf2c1ed85239187cb2587680611a3ad55f33c03dde73ad1c5b57a953c0ff1cc37f5369e99f070dd4ef29ce60036075373ff4fb725d2d7f5b42c89d8c7d5437e70027eff08418128e1218ee50b7891f05750d59b1ec137ed36dc39d3c0d964859a427df7da53d0ae56eb40cbdac16a12d9ed4e964e055e4f64db5d06ca3680e5b962d55d86fb9589093b27b4d5fa92ebfeb3fbf6cf23e3ae23db8b9d311f6579939368d61d0b764d52d7f8c8e29bda41d7d341c4cc770ab8270ae398a2eb9a63bf0c3ee2c58a265697c9e6b6be7c650a05aeafb3021c50c4251214563f68fc0914473a0fb7b7c93a66cb487519c84e179af9c31e6842b1d2b3a0952b5a217710d8f59c6f485a86691d6b48fbad3d85b74cf9978abe3714d4c83044a9a1fc47c080818418e965282fb820aac8335ae0102effd317661af23137440291116b15b1f72fd11171415b89b85dfb1cd25a401b6dfe50f9215c73dee82dff8437835a6e26d4c6400433eccde35e550dd5cf9506caddb392651541fde529c99c9c5f515324725ba8398a28faa79c20715211326ecc1b5ccff411734dff2d0243a6be5e79b205b6c32a40dcdaf0a35d7756ad117daa58683b26c3f422e7765ba3f4aea52063c97b217ee54fae149288360f23d981431892e445c1863a1244d565fb89f30cb1cdb721fac9f880e6fcd2f5ca9c576f7590e366b48d3ad8640303c3941e400c441673976d3a4f57eb1dbe6d14728f1e3605854f5b4239c86480d7d80607d812582b02ea97a6368e15191c9f55d4b981ae0255ff035fcbdc2da534fa0dfb30f1439b7a8833a6c1b87910b41a3c01a211d1cec7acc5d73a05dc8fc1fb7093aa157fffcf028a018c433c60e552126bfeeb1ab2a2226b7cc7f14dfb84e524cbad687ad7ba000deb0b1ae7f15ed457598fb587bf000a8dd634eeda0729c48fc5b44fb0844ec05ef2181fd8ab0864df4e0276b6331ee5a469db523ff668220a31d9ea59696bd4b8ca7b9462cb83652f3a1c23be5dc702a93894746d32788523279863e58725f500fc055abbcda3b0003388d44f0b21c1b300cb53e33580cfe82c60441c00b0a9841cb4131452120be00e9fadc1b91b9d39940fd977e0c45f8a81b980ad6ca013d45122a7be7b3040a006896b682d73a4757955cf321b485f62c19d585bd5fe0eb830dddbb4d055c845d510e95d31f1b6a3e05e17e7903a9b9efff05614e3e851ee7e762c2e533261d758e7e4c6a8e708f663e97e291bd90c1048c909922c19831e75dc8254683a1536eb8fd86d756d2dbf9fbb1ad598fc8887fe5b07625f723028af23b49f90d74ac4dfbe2fd64dd0ebd1bbf50625c44833d40fde5edde21b8d9abe5325d8f9676c8fe26a20e24a23ecb5afdd23c84c9abdae03bc4ccb819b6a3d9be07ff1511b83fb401df4f5673cc6ba746d7ac880f05c7bb3618068b06f62b682f141263b565db72579cfc289e5d29785b18c5e301e0ba8c9e788e8f9d2184f83b6dff6356d0abf6f356409ee7e5400abb42fdc2ad235c9408a5fdb7fd1f32a0ff497eca0da1a4a11841947600ba43a3d3947a53d8bbed0a01012653aa135f55f31e152a5b1882bdf393a9b21e71ab6afcf83a9d13aed082412e837bfb2ca3e0a8729f0737a282396c4b351bf1705fd74cb1721911698e6d271abdc053a831864203f7e06f7d3a03f878993daad1e04f828d023606f181de7686f186ef58e88dd1425f18f8e33b1993525fb1738e33812e65f7b421d5fcd924cfb73708e6b1d78ef7f01b99027923570561310372a1ba9c1135836a1da60e06485e4cbf847832d02394ceb8804d53cb9fbf94e1f12f7d8365d1dbaa96d11806adb8b9de3ed00828c68ec4dcdc67bca835dfd0ce23517aa5b0d93b004c4c91641b281672824366a471f80a5bf98d75dc3fb0f23119baec9295cf0ab7e025adf6ca1930411ec0495c6d74ee6e40894167ddfbd291dd2b9aa4146aa5133ca7c4021dbf0c00b1373c433a434cf68b0c9c03ab48325116672cd5c5b75597bb56e8d545fd9c84e7ab9129afa33be8003663baf5435becd8afd2a5eea4cac420fcaa26b1fbe0c596d9e55412ed37b1105c65319ebd5ce5810d61b11f45c0310483045f962af3a5b001d2a25ea50e010b6623a44eb6c8116a505b29bcec44880a077ec75499c2da010c9538d83438d3351c57ab8385b60ffcdc1d4158cf4019c2a69d5aa1a76608e2632853b9817fb46109d75388c28a88160cbac846432ddc14603e78190531653a60358b726abe0a77333082ef7525ae0221b980c99547d3860c8f1b1bcf1f5e684170b9a630c287b95847262ffeefb3e2e62900034f6142942f715628712c6eda816ca85a007642b702e4ae4514bc99f5ded2f95d168498bd04f0c0cb29b3d2212b373c42e31707f629ecc9d88bc053a46fe9191f8a5f01c80e9b640b2871420652e52f9d348d3145c1de2c3f307d932c25ec27225568f8045cc3f43c7d67632e5d6e7f9fb0080e7aa5601652882df0598093652d89edc313225d9f5a5911bafa06aee181750b3aa69c65d8f7be7ac2706e3e2367e3443ad6f727b49ddfeddfb567e1f72e082419b5c0ad3ebde9c229e91acb04ffc47972370e9305984238919862463da484b098de355fbd7425e222ee7fd66da18e0aae5962a5323c87c0ca2aa6c92e9de47d2444380247781f14ae8eb08cc0c74577589335167ea5112c3109ff1b13d33c5e6ce31f14116e815f27b3acc5e7e1d283676a9da26b2bb9e1105e19b289f738916dc5d283c4a32e5ecaeeeb1a701d3b426366d895cfcaccbce1c892ec73a103c5c39e6ddc09b05aaf7c78dfd6aef740167c16e165e318b9fe5d557f5981e6a3f33b653155374a6a536b0d694f2ac39926d1921dfabae9892161b55f2e43b05422341d0b78a148582ddf37015d2422c69427fd39b8c5f78b20fe40e37a541fb260885a5b596b2968daa6ec130de97d3f655c3152b91c4ad60dab17b57603f3cb7a232748f87f0469a10ab441f68fb7a1221fc9d1257900fb682a2cc2b4405f345fe7c89877da19707d4eff3c91ea6fe57acc9a38cd9c2eada13760a2205fb32400ee092999d24c79542585c326ae3d2c0380b0be11fa1ab01b7420c582aac8390890b9b643ac2f3cc701318cccc628765343cf9273d1db2dfe536844236ab87b1e71f1b155d435af88f857dadeabe53505df61da70ea7ef46112330ec9c4485c0e5c011a23d7d1303873df1981ea1cb34d23ef13b2170c8e9549acb9a836fd81cfb11931a19e128f78600e7622ef79fac3c1a8551f41aacac0f1ca6a030100671d79a32c9b1ad0900245234d944e3bdb80e949e5018676eb67541f9f8be673dcb3ee9f5b77addfbd07437efd3a0433a44617972cbfe99210563031de5d993e36db8139009c11a1bfcf47924a10725d4d8a2fbfe93bebbda376e2219eae391b7a5f55699af7b4ccc78381292f1898f623bbf4dd7f372cf5945f489dbaeeae9f77a8c4a4770fd0fa18e4b8c3218b421588aba2506119d1e1c8e3ab5602e4166d09a304e6105f6c2fde3c2409383f7e0a319ddc7fa4b6e12996c04d37391899aaa3e42534e6de53303a6693b744c52844dc223d9a4102619e59d77705d3eed7185589fb398401526eabfc303ee3446605671fd0c012bfbb248689a2e44b0e3d974af3af6745c6cd46987ce8ab8b982f9013892210ce5e3b109e318d8675c875c5f42d3f04431ca16a40a77f821ac2b421eba11641738cdf5537a2738a4d98b44bac3b86dc4d1f436a5120e01300b68a62e0ed8a5c561044b661eeed670f16822e5be5d2e47d1fe413a304db21b1bfd270cd3869c93544e34068d0710b2af14039f09759698e7bef3d59f4041295a8898ef0edb65aac6c0f5e903b8901ec97ce1e7d3d63939baba7a9c58aa64cb09ad530dec7c892099625762efdcd78c96b1f1d3aea974871f07e2f6b91eae0702e221b3237d9e1a51455f681891bdca04b004d126e761b39a84a3ca089e413fbc7e41bf0cef8590e61f171b57517f4806bcbb9bdf8aacc402a60216bf5f3dc06a3f548f947426b4b3fa32be8251801725c9f289781589a05161437df5fbeb80b4888bcc7de477fc79e4a15842f12be41e7e25d2365ada47492271928c02db5bf1a74850381d7e4ab90802b70ae21c7c6a0323590b01006ac420b482896d9b49c4a5269246ec3c4e11507075015e63cbfc7f620a36b236b6c960d983039b1895ff5d06f4238d8146ff21845f3927e734ecf6fc24377cf8c6575a28463ad75ab529baf0ac6c512271ae5badb669bc628318159158c1bee328bfcc5723f027cf10c3b2eb1e951415728fc42b404dc0d95ad75f412b76eae21bef6c31b485b3ee8ad32d06f4d150b77ad0c80cd637aa62e440abdd8245e418149c4bddfa03362e3b1f244ab3de4f16a1ee87d64d592567bfe1465a79fb834466407231bcd4313ac00ea367aca39fd176fd628bb7ee89ef35faa02f14e94b25b452089b4371f1d45bfccd939379f5d64537f293c2967f5f7c75aa220363dde89b9cd2501443a0daf34a4b50b5487b08de096f54a5e30421ae4150a0e1e4de46ce60c2d37b3c632a7a0cd6bf0f03c6bca23f974833223386d510070b2e815f31b931ed48074c169d6a10c96b661cc0cc55bcf6ca7848e399964f542a5e800bed707380fd90684d5237264b739512110a485a749756d0cde032af7a3d285540c519a8a4d708feb2628f1ae02ee982ca409a987f8b746897e8922547da32ddf650faf38e7f6f6bc50c8343e94efa76a53166f11b3860320f7dc184ffa692567844d56e3c5d1ecb9d4d5ba42f286d54aebfbb0e99a706efb7e856428f5ac2b3c43cc95d831beaf684e5ac1bc5116e8454b24a6d1edc5161ae0cfe5a6badc023dc003efc5f88e6efac8e4152e63b57e877133ac938b78b976d77b65cf5784a45df4202e2027f39f3ac4f9aaa47f23e6c1eea4a74cfb46059dcd9fa32576256e0c90137a53bf5578636bf4f4a5f4cdd54d52fec6d7d1f9de475ccb1ba7e356feb7b787298438eed4a04d8c31ab998821408914d2015ee854a8af99f077fb1b85ba88d3a0b500ccc17160152499f12189f7b63f04490904a13609747e2bd48a21977fe79a4d1db6cdb6d3c4c9270ef1b34884388967e0fc0eb15e5269269ca973a7d041340fc64665dd3cd348a6a0d9dec4cf3641691bae92b91ba13bd734f4297df7d7a444157582b5087f204b3c02cf06667f17791993b649ef548dfe2234a84fa6e12537d0d2e346a1c10eb61213ccb009c4213b7722a4ed215369152c79b36acdf651f16d943e815532ba95403d6e0db8f5e54a34efa22b83ab16b086a13e678bc2327924e5234c3d2b032012e14f64cb89709a0cfb6a825dd9db83b41e26eecd96930331643a051f00a396a0860691deceb453cde7751cb0439993f85a1139ad3c69abd4a65c7f83363529c36079e6b7390b9eb3c427b97cc966e71e136a5e9f91c690ed2143ef2dada92570083181713b877c97c6199f071e57de4d520af5ff361c6d16813245260a2320da217287bf97ab71ca6b82b016fa1bec95b7a5a18d0427eef10a612581287d7759a1386d6bc1fa64a4e3513c92ecafd5071e41439d74b7834157f1068831e867cd0ae561530106fcb278ad6c25fd97831aba73c7cb305f2f059577a7dbc7a34a38d4dca9b00fe405da7f73363bf7692858dbdaaef289a997ef65de37ddf24f013ba47009b5ba161da95d1612030c60b02a948b32b50a2a521fa07001bc5037237330885a1d6b8adec71049a3bf98225e029d0be4db93a356b7f2057da3beb161c0fc28703a79d343e062084c3c075a870e38df2a3262093f77893ffe927785fe547738b8a5673421158156d10ae31e5ee0114000e247cc6f60a75c8fd24c72bb2a041318a1f7dea781fe98a404d0da9b66f9f387ebb64b0dce632cbbb86c0124b698aebe5e497c54f3763969771a8817a4b04c6d85c459496935e6a95e43860da7cfc51d7b5da1b907ed34e9d18165d0df44e1e98093ec5c45ef0f4fa559896d07bf1b8bcd1a10d028ada9fde79a2a24a4083db9cba0a6c54841ba60f9eb5388fbb58e48db0667a7149657aa9021b2934ffd42d82da928eb8eeff8f6bcb8f86193e41afd71e435441c5466c8c14d26bf2d51295f3fde86effa3c92d2c01364b7229b75e9c923f9a65b1f648ef85782fdd5385c5cd64e82d0d19a4317ebc013f1b3ef428d8ee5398c17626c119925708635daa227cb38a7547b533908935a96fe9b0174c97d805c1ee6eee5cac62945a123e84fc68b3a90c41014a79fb92ab4eef2eab02226345d3b52ea3b7a969f4f635493b9fabacfdf940a5b079d3847751346f451cd19437b5764a620368c2b51c832d2996cb78d72d5dca1d9808ee6f62a1749fb2069aa955f59fe0c09b9f369d3c0b7334c389c040239eaa21d9d1c4a2e06c869f31c69620764061f0a09e0167b920cbbf6cba2e93ddde140aa77bdc802c7fd556638849abf6db6f11ab1211e3de3a7d39915bd797d3dabe9c5ad18733789ff8d34a358eadf3b49bca45ccb96fe0646aeb64c65ea5de70783271ea021ae54efc2081ed24108021c0ae04b6a82c7040133f3e656ee7c4c011eabbb01020f3e4207f16a68ed1c423fd4ce43670c2bd1ea24dc15e17887a0db7cf43fc0a40993ccc5defb899dd01d3fc815abe1dab1e97e3df01050cfda494040298dfe5cb2c04c74beef0f43fb6d15210bf0f0a1dcf15562169d1e04ba7b53fbace227d42cf50535ff70ca6b2656e20330e540548520266142428c749e113ee6175b11d869f6d87c5e324a81712ee7a490d1a00bb32bb2cd1507f569f2a4aacac888e0c9b2ff679ac812ec17859cdf3626cb588651c4ce5f2bbac7937c5fe9a2e2079112a20f80591cedda7530caed04b4908f24fa7920468cdcf26944586a8ad1ed4cb95ce03d32453e33d54cb5cd75fb09f382c55bbac0658adb37e277c185ea3df26a82cb80a454a2c4bcd519de95a68e68b78f88f785fb055d28926f198e87ec16c1c054a2b2a1c628d5be9b6c35c5ce7cbfc51097cbac7aff9ac51c2edb61db9bd34b5306a959c8924293fa06a13450215fd296db13ee662a8ca608db7818b5b136bb322ba4024442eb76d1ceba5d59d876f3965e2f03353884e4c015d316dd5e42652e53ba8c6d37609981bdfb60d2903f05e2d1d4f6cdfe1146064381879919f7d4b36ce788efbec62b37283ba0e0cf23900ae9575051143ef40ab0ebc84d89f514a5303787aab6a477b625920cac38e239e936a6dc4665c674c1e84ace7044f2f02f76f075aaa6d823d70303b67dbd3c09885da834b14e251bd0dd708ea49368f30cbbe6ed4c4bba1ba7743cc5cb71a748859b5a44909c3b74948b7da89f9a8afce55d2e989f1fe301b9b80182d6862140b2f32be495a5e9514e3fb322ebb885f50568c48d3c601bde35f36a3248d01e8f04b5f4f4d2fd7c1a944730f32c4409eabb2d896cc4d77938ce59c01a546015fbe27b19b4c82198c72e822b4952f29b7fcf3464252ec1e0d3643f90a325dd813dc44ca8806146b61bf794acb04066a9fc4f88c4185a98b778a8b4cdfc59ed309861e7e4774d27bcdd49cf323d49a5738bf230ea3954100791ada3dc8677539790c1e11bc46f564fe194ba40bb6a4aa221fcea5d5f4ee672163c65cb9449f10fd14777d1efc2bdffe69cb18243fb0160fc4e2af3b48e6008c92020ec957b0e4f9f515d454c19663ed8b04ed7ebe6191f0824dc591e842c03e6aa7b171210eb980d49442fb61ff138ce00df1cd6c7c4c0d5a4a97844a32d4435eaf9033a7ee76bb10ee10285a05df6ac1fc41916b09ba74fc55f1311c14acd231c27a0a02abaf029cc17cafe328142c81d625a94cec3993bb0b45cb02ad9594fb2b3ec348f72865c8afcd71b9c3c91d3a8c4553fb6dbac0fc8a9d29abd00cee2e0c8c6feb9ae8bdd43169610885a50d1983466d4fe4f144cd461a4de1b188a590667580b4008caf5e8490018cb9d8d048941517f7600f4be628ae95926588da20fe8b996975d4af69a5e82d70968b2d450a93ec250d5e392aa950774e141157f37d19e5167519296b4afb6f7379b80c6b174669791726a0cf79afea1283fdffa56e01a02e2e5ebbc9a5f2d4767f98d8db783eb61480f75b400ca90462ec48696308bd2cb7b6ebe471295351fe7efc723e968ba2561683bb4cd835e2608ca632bc0295594d7c16055ef8bd0bbb38f3dc434af95380216559cb6527b0f35e206ea472686d1ea3f5520250386abf8c880d1a9dc01f63bc4070b24cbd3af724b3e6330590527127816efb5c9ef1c699775e5a8ca134388d5229127c8728137909434cfcd7554577991f5cbe52990a76a998aee8b0a37454ffd2dc840a18415e56fe79fb2306d8a7306f5ffc9989b91642417aa992d51fbc659709211a8214b00e40d152533d95a10f8a7562d3b67f2cf6d2fee8daff954bf322f1d57e9ce535646e1782bc3dcace98cc9d060b06f79eaaef012652b2a6c0cb6ccdb2a17ee6659352deefde10d19040881398d2c36a5341805548283354f8dc78ecdc03951f9c4c140d8ec7dac513df2a06211039233066f541c85e79b9911996858229a45188dc7878f00b6c7d768538e7b0193c10cf24b195d2c46e76ce38852177b20aa438c98bea57cd55fea7fa6d9d7376d85bbe5505d45f65c5d40bb3732e4419b94df4cc5c23418e7e28e5fd414e5bc7fb35a20ac443c54efa901640e2f509532114ab54395201548f56a45122eb6b27d5cb1c75fe9ace209cc01179c528fc2899ab67eebc5c8da5eb4af1f5ce91bb977556c74d993802723d3d795024b60acebb23ac292c1360eb196612f8b8f0f95fb675f648f38e1b9f0b20dc51d49b26725da2fcae71e22e23fda8f1c4302a1719312d0b978ef31d3c3b2f5c3186bf4678510393f090e307e7c2a6e85f70910ce6f37d78c756a9a19c2e85afdc562159d9f0a1c5eb7c20458a05583ae547f3a0e98581d97bc6185248b68137707ffebf4835b447452b9d008ae610d660263870e614b1f8a649d104b463afa2c0e9d1e5e6fea84a8a8e3300d4e482c013a26b000702d45dfd39127650c1da6fb13044d8866c28d2355bc53cb7fd6957f8345163a6a016ce39270bce033c2749b9d99dd8f6b9361712cc9ca3055a651dff241cf4ba4bd9d58b0adfa9ce5fd94f5666a70d20d7c16cd0d97979421f2e9bbeceb72763e99626236f5cc21ef151bcdc4e136d9f9ab145c5855a1afe50d6fe21322f2419f5d8e5a85624a33b52f206a8a70270a1b14468aa0d0a7a6790f61f9678ef7ec722b4715c6092b2880cea109d333de031e1e4b7c74d0ab4ba847d6b05100818269bee3638f24624684cc8b1197ea8283bb44c8fa068ece4469623951758d5b67569733a583d111cb9d836d415ddb92e10f9c050600076106e8ba553a253534ed2e9b67f49db9bc595a4bdc41e9b46c487f0f9a2446d34da4138175a50734389edfb45e8b9d7581aa68b702ece5d62643831251809cd1a98c22f02ec140cdd205aab0c797e39b099a938e46d4569ac727182a55a891184456b594d8a4376b1bf1c3fa6e75c0e41f78b22c8f89e1dae6769dfada4cd12cf2a7778b84f72f69ce48b073201c038c7b0802b99628495053fc14710cbc5e0e8abfd12cce07cea9c083d8c7d46b2cc1d9dbc86135ed6844b794979a9c520d90413f40ea01e4619c0235e81ace7add26941322de08284aca4ccfadd059964d9859cbf329493a895078683c8616408576719c849824321fcf0c3423166fd0c2584628af259204719a118348dc86b69f0b00b6da0be8fce982409d86dd9db0ccc037ef214b881ab47ee5fe85b054c54cc72b4974bd2cca7f6b9f0050c2c999639c179e9fd4503d8364848351c3fb7c744fc35938fb87390e511405c1bbc1a182c9ca4fe876bc590c87fd214238555f800ba5738814065463c21eb8a7bf82bfb30bdd0d9fd6265367f25551e481d9e1f54c4961f1e888f840f036f05db9359b1c43450f67b3a4b31b2c84b759a68e108d7026b22c458e415bae02899481a1747f06505007278b2c3be7fd50b3c2ae9d64a23a265fcbe0a44bd79007e0fd1605a4e08a7df7df3b1ccb4faa038eebe4d77659e986f62856bb5ff2437bc2fd258187f5a05f958e6cd1f20fc3e9170fd2146ce3696198fc88961e850d2e10114a8ea2aec052345e8363f87bb985822b924c5b152378890e9bf3215f0467c3770748c3a2e5935050db2552290f6cdb21f361549dc992ac69fa0ea507137bb32e9b94a1a8ce77056b529ee3852bb489ab53b5450a8955aa8378f2326922bb3463a77f68681c690b692a515ab767526c6d2d15f391974e4b22f752101ef88334862ede3602b7376e1fc426da2f30807381a76ae787de97c33c09e0ecd82b87c30fe500b0a233ef7ef883961ea4292a0eb97ccaa47a82628f49e6f38335a040bea5c58e3e0b232351bd0d3a0c6ef8177bf57f169bfce6fbf2f580297a88efdcc9a53121b72dd1eada87f38d2b686b4523d76b3d68290f93ac72c0c0481a9ae849c2485381c0a80beee10aa1b8dd2076f9caa93474e4d3b90262317b77546c767dda5ec71648ede2ad8e83ffeebf80ffbd72f8ccc5b60e8b8796f0de2c9c329c8171537ac31de099ba44c58edb7ab9cc24eb291af9e322e3c42a29a865ced5b7b71c3939083dabca8f2137d75e58d7b08819df0b73142f3e2de7c25f016c96ff363a8011264e79ea28e81541776db0e7d65cfbac2b04f2e0707ff3aaf0955e181bd224b7030141071bfd570e735b994350b7d95cde3610b3e16df0e82a57bd8847c9088bfdb1385ef48f52ae024257a47302db1fbad5232d2cc733b4d2b112124ccaf5e4d29b1643f05b8c7aef02b90d5afa1007de4b82807ca3612d83e4fc8b2f272fe6b652bcde5659e3a739b39f54f96a0de2fca4062f7d54d6aca815b5c405cfb21dc1740f9d386657f4fc7b9bf87f923a917f0bca75e1a65b7bdb5b9dc96ac0737efb22038dfc33dd999165444391bcbddbe13250bfaefa1d9ae97dd7a0de188a294068f09518664f7862507a7002163ccb9ca47248dad022c4081d030f6fc75b93722f8624fcc6ffaffc05d2e53190ba8bc570fdcd480ccb8e35350e831db2371488eac6d21d8fd93ae779d913a931dda767069759e5eb96d1bef211c991b4381628cb9226d3a44e8c6f6a92f8b945df922adc5fff729f0f4937a8b3c47e90b1f65dd7e4a2b8a4a1cf13fb88118101a9d2fd60bc063c6740f0b1e560ebbeced176dc6fae3500f60031a6ff9fd6a61e3a0b44794ffbdfc2f0bb3e7595fe332d6997555dc3c93e19647b3b4005de1c43378bcaf37de93ba71d8f80ef46221518ea32c3da349052a7c9a8bbc93dde49375c874f0d14b6e9a9704e2ed511179cd465a92097c1390a383357c8c13f6a6b2e33735691f8dc6a6464e4a32589202577c6a0b95e2e98374f64ade65757450e592a31305286406e444c989f6c71c36a2a59aab84f5528bf0adabd34484886d773916cad68861f0353b443d00b30ed28d59d8add28b7123ec1b56d173a35b27d82053da08298d59e50cb27d13572cb9e28572aa5b070bfdbc66411653fcc9025b0394e214f2cdbc51bbbdd6a1f51fe76878d432420b27e209f1aa6749bebc6e7c51bc010d0ee63d0e87af02f7231066c52882b91daeeedc0a82bf33e17fbdc8568cb9a512dee9c98802a24ac5be1b7aa3b4ae9041e1f8cd11cd16f314aa746e5987776d4b4252bf88b840e93e96d43b836977d69d7dfbca2f8d2604f15c313dfc6879c2977dcb100af7c63b5d000cd4e57928a4426c48fd9e62a5eb4d3061268d21ee1c450376e113730855951c14b8e19d4a1e32e7ca9cca997d65b4752cd32088bc3af831091bd1d724f8cd1289e690c66abe3110ce2bb07db2228f4cf1f77a6434ba0e0593dcdb1f1a66588297c00c0e69b3b494f6b479a629a142013435e079eadb02a11a3fe0c2f1a58dd0c485c8cf4e952bd97bb83e1ca310940d5b5995e6c130849997c3655f2952aa435c0040ff708eff95f3031cefa7085cd0199c609ecfabdb305a42e7d671c198f6cd303d42c1b7102b39e674565e30fb0e132b80b4bd129bf084854369b071dfbf5e916c33c1202774d43ea1076589438d5640c04a4ac4e31190e463d471fbeea094b6a04c11b409302cd33ffe0a373b6f9f0bc7ce93df867f082550b627bdadbb2761ba4f00ae4e9c1ee6af8923e00838cac6fbb218c3baf985bada4f770155337d58d369d47f68b75480e0078e2847d5916f524b05247a452bcd835db02316ac82fd7ed1547b82bd81abb8a429ab943e6e65b92ff9c74fd026713e30d8eb8cadc2120e28a01e493f8c3242efc5b035bedb32271cb9f9a6f6fb731c71c976dbd8851ed2fb7ef8ee0ba34eb694898f4b1c6bd44cb65162fd717ffaf3ef8ff8fa2792f0b72fe449f5142c8a4a63d7e0653b204a552d3a3bee006da17bc4d29f8230a31850945435f61f4b5a74e1c3733f42c9116743a760a9c714095bd60b8388552b93d404ad4f74fd5458cc7bafed551eb203a09c94c302a2198f2314361da627221ec4869a5430ddff265f1ffb3356d29613fc72b293cad7b86348c01f42a30da64d7e2544671256164dc222d80d40b3b8301aa81f124c75b085b48f77de34149426ec540f091c8cefd38291cec4cad5494152d8269c42c1f87d5dff47538287561e718aa57bbd7eac045d48bfde19ffc9d75782eb0d43deab1a01df55fc11bcaf75bf4d2c34e267fdf3c4b8252c3a033b87f71a4b0ef74c7ab31ba9ad3160e285e9ceaab23359d9f6e34dcb3f5b6d6a3f19931b53fcf4ba63ef4daa15c20e6bfd50b6751d70f63811f5abd0b5778e7f39b9756fb3c97dd3c19fb3b7a02a91c40847a777745eecbfad3a09e17f0faae0fdc99c5b781b826c0996ad031039b682bed54f6f67b6778c06711956fa26bac33cfdc56434e60d58692d50b7e94c362776238261e4dbb67ac5e8d5da4f6f510e8061f7046090c63b0a75d0f56841855eea59b92fa80de449eaa4bb8a20dab36042e631bb5ae1dea6e89cafa67c04646d045101436755468dd580ce4833a02a8b1b9215f90d46137869104b25c57706d449ba4c098144e3441512b4efc9a449bdd59ef4d83ab238a2d7ea2f05563ac8e1e4fd3904c0200a7cdde6c0f372f01f1479865cea0c357c65478173c60b1316fe930d48d0d4b1cb9fde2141e387558d572342d9af20b801b50abce4a212b79f5b0cb44abb9ecccfa20a701f498bba01dbab1d9a55395e1734131218b260d867c0752cb1a4e38090f0cfb51a65686f6b0f5e24189111dcbd34706a91dfaf385c422aaca3d03ad642e558035d6d5f5b4f048942cd077682e5ebefe61fe1e3c8db33d7ae68ed3b3605f9ecd8425382127240c4eb96a397c3ae038b6a146c5298139d002794107fde035d7e81a72255a10411216f33ada1854b41c87bb70081988b64f283ce194f960f5b58d0f6bc69d829990569ea8f68d82e3c19b4b87d91a2b6b2f1b237147397941b66b02cc56ac082f694e431688e04bd19ee2fea26a93e5096a5f82c93a67444b5a1184ef42eb4c58d4a16a82ef5b2d636d93582dfde01a129c11f50b119e74e45808a3913e20c3983c30d5809b30187ebb8b5513273268ea0c104870b074228467e608fa4ded99cca9003a62b4eb99d211d934da1626d45419aa9488b8487bbb6e04619ea521dc44c404b9eaba31a2e1956bbab008bd0fba2a7fdae3f170bc000b2abf1f0938d903e785aa8909c922eb5f1164d8a8d4370d129a737e77e9c5a879c87814c26b71ca070d3800bc1a65e7e929bbb77bd26da29bcbef7b849382084907060c04a0c425cd4f7d218afdfb3abfe6d15c31ecd34943bded1b2e2612f2361a80edca4b363164baebf9d90b893c08d5869c30ca21540ebc5b1a8c795e2f68d02c1135455bead8dbc6eab947e1d04259963277cf926599e43ed70b7d0e074c6df322694d5927478ca20ded75ad42ef537e12caf70a3db5e5b237d25224add879a55f4735c663c57d405d4829920b6202b3b4c321124d71c81c1ceddc0e9e75c298f20c65bf24f268a263e2a2e1621cfc5675ad67ecf3479d8a237cbf20a6d7940e1002bd03ff64273d2757ed4276e0c03b845778e71388dc127238d698c08f85087674f70e7d749e386804c9698809349e695f386e10fdc3eff0b369245260b1c183718c011480a82810200d93d25c3676b195904b0630d01a0425e71face394da1da86ccb8bf9458822420323c880304a141f3b576737c1c573e57ef093369ee84ddc2dedb36ce62694d4ab59b8417b8b28222345cf4f02ac90c5872c23e2912e1001cdfc9c1078eaf43c274a5f46c324be9f797c10b0bf3165d974d3d1ce5d35db6c9f2df5d2bccbe4ffdfd04e062e62fff7bba3ef01cdb6a4f9245304a080b5ed68662c1c8b54f8d40c6be25fd7eea66b1e8abb00a33af714bfe3286b41fe6b92e7eb8c2e5340ce102385c506d49762ca42f17406cf3dc7956c76f768191ec82edf625b37d4650b356be28e496e9b566265919eb9cafdd39d5c200d94801f2c14549d4955d9550c322c1f44b33942ab0da139a343a4dffe85dc9f4520cb826380ba58c9b6f2037565ff3edae465ea9adb22263f8d6783e9cdf4b4e91b23744a5d52dbfae044260ed96942ed9e7c108cc801b69f0cf415bc3abc0e9ad96cf4dd6bde72640a8637321384d6c47d8b21bf7b6b15f8def3b8f9def425331eda18d8a58b94ab52e7496d675d6863c3b95efca64d347bc3594ed4d510ed618fe94fe59bf9d7e186668a8ae8a21b79582e5fafa3e5e605d7c6accbffabeb7f5ed6a9819a3802951e5e9460691398744b055705d503b555a7bdef82f674e6190a02f6764464d9de24ad2feccc48f6480986ab86bdeace2dcc4e756b3089cf23033bb17b5b8894ba6f05b3dcc21a6784851a39ee8b029ef1956a4926b774d9b3a6bb5346a5045c44bb716e36407936d87788beb8ef75402b47e77c784d478c5bb97e4394d163a9c2fd41b50fdef42f7ee952e81705e21b8b962191c91df5e04a399d507ba3e1b1cc80eb27fb1947ea3907ff51022ad4e61b62fa75dcd53ae11b1db3b151be88d5aab08a2da46c2b898f01236d3f51108e47a7cc8e66a8162af442afa979da902acbcb79763fcc71e1da568c4e7f14c7e689546a4e9cba71759e281b34fa593c8711c522cbd520080300e5223d2851e92b019c820eb4cd72bc8cd654195ba92754992f7e168171cb9f0f601b44b1ba28bf316864f9f4c0086057860369b9ad8b98b37248bb3dd0d464bc43beaba8bcbf3e9acf636de110e45e16c792754f0172f0b7d65760aefd2f2c42a41087f6c201d47ede259450345113462e560e01b873d9b8042ec7e276fe5ad8ad7c464a6680aa758d5a6d4aae98ffd0abe07b76a2c5ee394b898fa62d40da744cc6380525edad1546a7d3c185a45abad5645b99eecb3fcb0bdd25c4cb7c6af105c1cc5ce1a94e6e5692f010318508c22e85a17cdde74659849e55962a4aecd09b2c1275584006cc4f25411f03fa866e11a7b9badd9e6e5ea93be83b5a48f9eca04cae28aa4ee1e9b73cdb9133257a4c7ea84a3c6743a8fe18bee5ac868a3b07b144259202803561607879d5917a710785dc00897c7346d47dccf08c104d8cf8cfd699718213c69786fc719d3b4a17658fd94d88896656d44eb2d6809268fb15322f2e2ef0c3ceee0083406a8d49061006664c382660acbf69ddffd1d2abafb47f67098945f1688864ff5852881ac71b2babcbe9c2c4953659ba564727f44f646d850b967d12ac61e2a284dc27f45b05ed25229bf6679d77f11146b472c0cf1efb0f2de94376032d0829c2d44fcae0e0a6616e1ea61eca525616f4d460180e4501c6d6b4ba9289a9de8f4a66f64e5e8a899077796566052b2bc80b406d4c34f2e26323ee105c386898bad5c2d48a0b0127c8cbec549a6ae74a8e9a02968db2d694f8a68608a819a710c7795932f274edd016664d3428e222f3424525a85018a44518d95a9a3faff4505294aff58ded2c3a41d67f154596d3fb6a09bb2d71b31b7788a58cafd1b2b75e988934dce03560e5c596d311b93bbe9ec878340e1219c5fb8601b9882b92bcc339aec82465c323751328f1c6a35329c26c3eacc368457c9270a5697cac5803c649b047809a87abd49f578adeedcb1192ab30a2790197ac80ae409e868dae1cba59bd163fc1d83807632309340a4211a0e093e9ea3d6f2d906c6097d402d631863120d25320ca04903f4bf9f030cbe600724063be494f25ef2777b1802469528496ba62007057b2525142b92ed5a9ce3aa1cfac875a2cb24ec1ea29f5d27482ec4d502b466b04d5f33e4746f6aae43cbf2898f86bafc12e8c401d54268d693b9cdfa734176a18bd00456890384e0941251e6beb23db2255fe4f1002c7ec343bb23d870c9273642504d84e997958751457000c3a753a3a9a30401a4bdb3fc38c4606b2219c4f300c7a31a74fa23b1cac1e83f0c29ce42c97b6e25919cce381c91eee66e44db09c9b3086c088e2c45b7f564edef16bd85df3d903a888543316cb86ddc37296d7eedc1d7d48d5ee0582c23604a2fed22956d973331fb0b43efb7e21a82a7f87d485064153ed13222d28282c5eedfc77187ea96bb28e9c94dce891c61cba4a55e6d673fd533b116455838b9186b6c4e2979d290f3a433295a4b9443d35545cf256e6dd029840b7f17be831984ba48b857d4070da6f595a047dfd0a9918513158adcf32db591324f4bbc3d4900c899f1bd901c9f1e5195c39dd74c42f2fee224042f67f43ee7b0ac688a612ee651a96af157e36084b2547e3224ac122d7b8e23618494270879041566960ea9edf69c08a983b4853abfda6524b5617dc315249b3548bf5bbb43fdbe626ea59dfb20d7e486ad237749fe296965b3e7ab57ca29b32d4ddfa774643ec991de75579c4fe9044ba70031b8a20f117669935801553184e55ba90a30a691892b6a2547a828ff4954a7a6ea7e4e27ae4cd1cf07c29c92b47c5c863595057d4e6df0713e5797d59272094556c29ca71ea32b918761a68a6a638d247f0bdcd3aa7b8890a1cba0423ae3549d9b421d179c3e000bd8b45751960cc768221f4fd4e1a308f707e02aaf7db6089d15fdc360ff72b4efe54c5fc8c09824604d94e86c9aa444a07d78474eda9fd08c6c1a7c222014236aa49072492e48eaf6477778edb2a42abe5165aaec262dce8272454f6961290e019c1fce1e7b8e4348a1607b68293e42495560336017259420cbd8612e3e81f3c932c96b89b9cad6874427008b78f82a6527a6a27675d291e6ce06057fb4915a8896a0f598996eb1ae3b19ebd263459dfa8a82c8b1ee0e1eb30b47c898b4504528414fa8b24c6cdd39757e4fb48f14128f79d75258343196d8c2fa4cd3f72c7802abe9dda08fa4b5bad474c8fdbfeb938ee17513a1bde96fb34cae3ea617c892b780088dc0d21afda2c08bda6cee3c538055b290f599d71bf83481e6172d521f2a38b4a4e864482e82901969c054076d8af44a5e6442db0b5f8fb8f4c2481df5df038682a128478f07c264d42d39e3d899807f326f1f9ee882da2a3d29d391e4f5f12e2b333eddc18e26c73f93b7fe7a2f367340cbf0b72b6fdf15403d4d71e7856dd4535ac1b6c4881d31b6ab32ad047a667913a13674f8fc72332e75cdcc760bdd9fc0f6ee12a2e31de18bc3f27378b06d55842ce8eccb0611c26645c7bee294bb7ba05f8462f563cdde3147974fec10b2cbc4dd36d9e0b6a09b9ee17fa6c7141dc18953bd309414651b6f71eed17f842ee541d3c7f6248d5924e81970a33ef794ba97f511acc168bc3d031840cbabf5560eaa7f5cff8b1f2ef935f494f4547945e73c56aec01cd984cc3b90dc89d80fa31a5d285b549a9207e1d89993bc057f00aa52fff88e7405c11fa8bea7e62dee3b792e356fae14e435263f543af67c472a2b5877da8caee828ca53dd396fef6c0df803d2d02a53945c0dc83105638c53ceca64226db30553450b24c7dd5a29f34b19385622833229efbb0baec2e5e08cc5608add4416c3cf2c737f674c1c0a83cb46750f5274b1f55aeb8b589367604f9bea6d5282d343051c2aa6400196600216bb765365d8eabc519baaaf53c443393a8ce590ed943f0855cb15e271610020c17a3d0e582c5a592e38430616257ad3d35521369ec7f2c4cf573bce82cf7628fd17b650041de2bcbe72b5df591695065851dc27e21a00a0f6bf93df7c597e9e44c47e6f10f95d89fbc58c4c6bcb91aa3f1f870e2c98ec04b52e8b0bada9138805b5c4e09580fde727357d3c591f9869fa5bb9e20ca38b899b92bdec5166a0de883229adf4d0bb088246e15d5b364fe198c3b6222958075309a84092279454c2d9652d7b7ea526faa7e419cae28c9c3668d957a98291d707005ee9591f94532c0ac578f084acf3489cd1f8096080678ca1267a0dbd00e5478062e504f020b95e3891059febfa551670a7abd507a25ac38f34e92acd248ba3d6a0ca82de0bcd2c24b44719be15a30f9dd7ddfe9491dd7240bb730b0f6a2d78b3cf49e99fc475d43ae9ed60a94c49cb39031c2a9e9065aa5520f5a20490a44a738d15881f4a6b89d9f09aa56749a7394bc3e081169b0051ca2917a257171f70968f8ece38c5d529fb80c505d66319bc1e93c41e90775fb30e2f3dc3414bc2b8c306fa48686ae46e042fe37860fefdc573215723b70a1c64ec1caecbbf687c95c8b3aa69fc8f8fcb8e70272e9a14bd6b708ad4ab35452c807dbf3a886c92d5e78755de040a798cb5918fcec58f7a914c6b014125f1e5b766b64ee380c7e0a158de404727073d68d1eebf10d423b164bc78ff19780900ef7e57a70516b75f2f7101ad7f9b34a7ffa02259c27cf8b5f1a8d14ba19ea9fca7eb119a0e34941ea8e21407e1147d3deb2f579ac0ec0a6e0074ea91b218950e4278ff152a5acd1bc7603343c2e5487d5f6a401fde16bb047af60c9ef6fa0de0750dbcf2dbec3919b4cbb42801f5a948f71e86758bdef60dd65fd3330588a11a0e2d162eb7b061eaa05f699924b52f2d72f0fb18d2ca1895bd2ac2b0704928d00547ca28fa1e14f9035e5640a1189ab0d099a4cb182b39d1c481958dd35d93f7fe4f453718f66b9cce32298e3ff210e550110e71e13b381e2417a78c8771f0cbff2b2b29354128fa77eac7c6c44df8470feadf15640d69e91096a955ac201477bf85eb8c3924009656833822a1241ace5b8df6e862c32166e2e2c642b77a831382edf25dc3756a743f1d83167718c43edf6d4faaa4a98dc4cdbed03d9567474d9b2d9094f5315ba76ee01ab49429f0bed539e5a37096d31c8790149a9fed0fc5eb85447ede78439da77af11f901246a4f049c0d4a0a1d58f1f6146378a3cf2d169af3d01f3d3fe1821eb4db82122e2dbf17bdcd147ffa5b611108b5122cd74acd15f7b32d37e03ac6d1d9b5d1225b8686b6088d00bc20f6d86d086fea0cbc3a6a361c0985c0df8cc86a016db00521fa3d8fc1d943292f66d63cfe4b4534d86851ca54a5993602255905bd4fad32970fe95206238121567b94d24aaabf71c475b1e25c0ac699dd32cf73f0c3ffba857c43c632de14d76362c2071aabe12f1549f7e601a9bc40c6878695aa23e355466b694409274a333085ee5d8244da90655e9f2aaaae170ea550a82ca43e7c8c2aa5b23a20ced1ca845e23cb6ae088399a7d376a9cc8d34e9dc07eb0f349e661c2d412f137d22f9f5f0ca538ccab70eaf04508bd75e320ffcbc43f2c0ed252d10c100c24ce3cd007015c0565a880d516f4c49dca1a0dd2ebaa16d190f0707dcb1e79993a9b23b018231e07f790aa4cfc67f7ffe770fbbfe2865dd44a516c7776a00ff255121b0edb0f3d4d1038773e83b8269509a0c6d65e61eaf2f8245d9883873ca4f0308201367b486bfba21a9ff73dcc8662758a2ef3d549e9f8d247db8d5e7b987a7c432f58f62d8ae53a6e4921b333b5c60fd458f20a28b96e90acee4bb30a3d0998121267028b27f9b1b55f2e684b8c0a90965121720d31187555c4d259fc94bafc0dd81eb1cbd01b4f759eb2845434e99c9af611b80f0b0a826c6d345b5264a22c0453d102de9e573897d734e3b75890d85bf7d3adbe99ef0a7be2da75134c6eba5e4163236a2c92a7891385379f80ff015d7bb99d00f2aee976638373ef8a94c11ca4d672c71db98391398bdf9ed99f9549bffe032d2ea8d88969858cb548cd59c13de4110f9c4100106c66ffb4b6fd93aa64abf2c8ea6f465fd7d2c8030b77f55e8f3f1ea4746f8491d3b894c7a4c1788a423b78242f8a048d57feea4650c42e87a5e870f093be737bb29e113487cd42a0ac88d677256dfa67b1554f8b906abf99a40d0263b70b6b018a4d89d404db80fad2326dea26987fc725d3ec36331736e4a7928e6a70d610f469d33dca207db3d9ee246559d2d3c8b4caf4e01abb8264262224c4854717ae3ea693297863c1b62b0ce62104f4e330ad9239f4e373dabe56b8184b202912960c1b9b6eb254dc97304f18b121ff30db0fb0d169c74d31c71e480ec95e76d5d7c42a53371c7e226e3d91577cd123734facc8c4c9b2830fe83ae4b9fc1af3946171bbe8c49685e6c54703a9f3b0e37c70b75856681153e85dc2ee182143ceb42bd316c61b430633af807b535652943d91b9dead6b47755f8d039c022886dd48d462cda6fd0604953e05417c9b3ae6c85a21da063cfddd04565aa01d31965dc5e14f47eee2c29587068d8f4a591d92b1dce16015f2a4a1107a0e46b76e16b7010d8c6ed24fe1edbc853f0688f3b7a95b61a979728a50ad7828241deb5bf72840287311cd02536e7a696dfab92b1b47fca0f0f8ec1147f4f0afd935cb2dcac30480f4e54079aa874a72c62b7128f890a63d5104dd4b19eafa7a99db530940ee9ec8c93e882e89f198bc1d2af5d42340ebc34998d329e081978c71ae0642fa937f95e0191f1a4a344e53c99f504c6bebf826f8f99b4c45900d445078af7c3fd10ad2a7d5dd6b9b5624854605fb81208111e78bd1a0f241f5931520fa48766233eda9fa0292a8ec2a1ac873016e142d865240f360c5e61e5e8be1b316e46b84ca63c118c05e0977932a999903b608f285a16c75332451b183f0bab2d0df53b24429740787ad315a1489976665b15013584df90f013f8f6a56b36c88b80e68e800669279dfa3d15fe3d17caedae2f0fd01ae5871ae632c465387d9ae0cf14a003e218481e6e295b5a99a36ff3a17ab7764e07350b4edf3799b64caac855ce54564f4ab718888f52456737f2b0de9683036d755efce2f47a56e921a24c8c266de600855099367f2f2361582ae7919e184b6e8163351fb69b8460b40a1ce458727a19cf4b83e5b631f35f8a65c78653cd050e73d7ed608209c1389fcfc73f703842d8d6dc499d1a8bb5570c09410faba4050248b5931e178ca87cc451cb0c9dcb1c3f7c0993ca445ebfe8e5f3eb2258fed21cd6ba069dc0f1886b3255997898f603d9d03fbf09afff8c476dc0c384ef419643a1fb55ed0ff680e39df598c6d8b16f6c1728a14b32da5125b3250b788a22739ce82598746f675145b18e0d4c9833642263395d8214ce027f6b0c6d83fa6e8ace23aeb68197b429bf5c10b680a03945a7b907a2c2a0c409de4703af0c0601686ef17ef004a9b500244654b00548405f2033cbee918fc020eeab49010b8c1f4198a2328e59cdd161aeff64d7afd102639c81c41207eb78a3bd78769e8577aeb4f41773b25ab52f569b2d1933a627003a59235a0362c749b23f617ddc5914639e06c0b431c2819c01f6c2fe918e1a60a1574f98055576c25843a31284949dccfb46c7ca3e58dd46c9080c2f63b3b4574f53f2a715e53d4fb86023d79dc8c082c261a771b247faa2831e2600d33c84e0804270e77427194eb996c7f3cc7e7781691c28835b9bcdadf1dbd44aed61a99bf207938d8b173bd9208172ab61fb07dc0c51b93ad4338564bac7dd10aff25603261ed74ae5e53c68c901f5e44818a41a43a2325276b1e90a2ea2c9d8a2cc4ce98bcf00f888bd4092c5e2c0b70abf44eb18a79f1830a869563f3bebc94ffc2344480351c8457554c9141e5f1e4327939e090900c74813b1ad03215d8eb25939dfa67a899e17cd7013a425964f22c239d79a2bee564675243c96b0a0902aec4e29bf30f550b083a975a9119cc4c6664e0a41b8b51a51cff941c44a7889c00100204e3d35396cf9f7aca4cf7464c54ab09624bfef657fb9481d078e5aba53826a738780956a8cf6457611532db49b389d3e4270d679579f5bba2ff2d2acbca1506736714af720cd2f7c6a27f0059670daa04feb60f283231a57b9385e89643cc2fe7426220ba1260c23ea96b9ea2c81c04b8a59249abb93099a04b2e07f7873ea95c225ce678af3dd6a7819a4ce4167614ef28b8f676e643895b39a1397b87acfc9a22b8fdf64dde7d1b555da6406b74d8a076a01c64256ec307a1166e448ec65015a4903d78e69c9abb35c5a86d90a9daa6da3387e19e18d25ddc45fdac787e7d6e2b03c2f5196d9be4dccd9aa5340d463c281a909c77399c02211fe94a790509671deb12438ce075125b36b618d1c5f4292553c0fe0cfcaf4318564e9f077ccdd1e31c7520b42e4babc6dedfbaa4e28e1422532934fa2f5c4473281c64c2bc1535882959cb97d7c49d647abeec27fa03f5f2f4a3d92cde843b5187f6f4563e3694a9d00e939e2a9a632d304bf6cb5ce9b7e29bfa0772ae61daa7c321342c5c8fbe1b06ec1359e1efe8e4b5bffb26e7fbde38b84eb90c5e5ccf282f783d69b95ccdf4ccbe63ef41f782b3936a5f0667765cb6a82c38d05da47e0792f577838eef0e403a1fb276a65faa4151220eb1f548f32abfdb1187a8fd2c8b9ebeecfc8f6ba831bb44e27e60f5429dd166daf091a53627e2affbbc10949979ccd539b3e2ea1da1c1df366c69443c4b160dc078d51dae87a38ae4404808c0be1ef3ad1586e8acfed39e86193fc56164842e5ee70c5ab7b6dd06d0b99f1203f37b8102dc454d5cfd1679af0d6ce16f41a76c0017157bf4504ada77f3e3596f325742cf84beceeebfcee8777bd3410f03590ff29bfb464587de0ec780341a29deb2ac761c15858ffe11c85e5ef32c88edbaa8bbe094a3e0bcc3618236cbd482facb7997d5fb3c4e25c42ea4332dcbf2c01c480c5ac1635ba59df9ab7d091332542198099b8d9156712a60f127414b134f5587d5ab3ef895351894ef313266fab9afead951200e4122e3822c264cd4e6d1dbd4e90c048982d40ccb364a6234c01ddb605c6b9fc7fee213f5e14212ac4f0bcc69e4d755b45cdcd8f212880457e57381978eee238a54573796def13d2f4daf87ee10c3339a9c445e1ef6941af7164660bedac556eb77cc12ea8266f74138e81309b8028028d230b4388394edcf0ff0a0273e06b6d8f4deeb2c59a5b933167ffdfbdf88f9a5048a2b0a47fd5ef47de18859290bb4073ca473cbbe0b19d52834d5f1043b212cce9d47681fb310014032d50009ac1156d562113d869a0b9e89b51696802077225d330ccc03441ee33f2c832d3a7247c57d948428fbd7f95330133f611704bbc943fab7347e007c086ebf8fc3bcee70e88e06d0e3c0d1037942aa0b69a4cbe845e663ce6474a1d468f789eebab88cd9f7a4c1bf724f3bfe37481cb3433769b79f913414c4f10f2f8782ed0fa60d8624449b752004653ed8381cf91a3d946838d4258e074c6ec80f60b9a4320365a44f11767bd4c0c38c0f877030fa3185153f8ca25f44d90804f59c2938757ef3095db54bcb8b1cfc2c497d6d67cf15f7b401d06138b0c715c9fae3f777932457c4a71aa58d33a1a4f6f609ecd879a9b705fc1535aaff2ac6118de31e4c6f76e43bfa4cacc52f511eeac8be72fdf630e3b95dfcd778e7aafc4b532e735d66407835fb00472031e64e703bcc3e1c8094e54a62999059cc886a38a863933baee8ef4f5955f0af65d1fe42aab058f41e10799f9f37bd0cbaf3d0a888e6e8298bb23e8a301527647e9366ab8473d4df3e969b013c7aeb190a3202845ce2c4c8b908fa019eff0a9802425c1d49ca128971b43bcf88a95ef3ab0845796cd198aabdb1530ec7f4b299757cbb49349309be1d7e45e2f217cb917d5871c4dfc2206e4d0ce155eecbf867e6ce275d9a940a39e814f02152f4ced30b3df312f154f681f080e8d0add3db2433ab8431ca1e72d26cc49c4df72904e872678de2f13850428bcad8054815c5bbc9ae94fb5aa8966b05279ca4687476f0a06e0a27ecbea418ae11a28ffc16dcc535954e72d782ca246d3a5e301c55a261c8cf00b1297bc55ed8b193604881e69e8e12b18cbd384a65c1f8a3808e38109eb9fa0b08a7c1ba397fddb2e178b99a082cc8fcaa7ea477b859160016090b806abbd8d2f3749f8df5d6f69a58bf995317e6eeb31157e0306b326323817afbedeb6f472489e0889ec9d8ddaf0fd59a2a73be9d8bfe898e8fa6903184cc34a7802fa0d56a42cba5168dda1bab3d3f45b9cb157790182407a7952896a3dc42bea409f80e06723d38b08275cec54f550a217c4116acd51ac9b0c5b23eb9029f95589019460a0463e46c651273f6abf6e7e1c25bf08e2ebb1581050161be1af35577883200ba0a880d66cd264a6ac5f9c6727d1a309ce1c9acb4de48abf2b5f34f3aaf0a5b7b1b435a1d134d45dd9de9199f8c03c5415e4cb5c1f8e1124a03850aa52e86332a3ed1a744d05b569a8e2316c7caecd8e378dfcc2b335b012c82ab5b58473be7b6885f764bbdaf1858a1e747daa33e74b8595a4cd9e2ae9e05d42ee6bbdd006997f91ad35da59670935cdce26839e607dc10148831b9d23580ca4738066e85405536dc8ca485fdb1d82f80c5438fd9f8fd3cfdeea8cbe20cbe9750659e786472c7b6ff9734d6721cc777c4c35f39b17b73707b011a87ee1856e4ca99d0462640bdad6f7df7c181a723d1b9a0c5770b332b39cd9c9d6475433c777e96fb12581befea092bcdc134c469e3f79b2b46690cda110c351d47a54304cea560eb58146434f7f9b6f972b33855eff6d41838a8c40ca2c1900c6e18954576419f40b64d322d0cb6eca158c7fb2605b3f2bf858d8f2ef1b3f561a09da75cd5a66e37738673a70d24c64fd841fdb6a2e5ecec1938b9f3561de7b660b245b0c3c1f7bace71f54beb463f1acaf31e5a69a0b6dbf14073bbd932f7a786e8cf30c4aeac6e03872e84e08e87d1bc74589d9d92dd36d0757963f0c41691f066b17a37339c0266f33f5f835a1576240b38cb62a1da85f67d1935b1714184899360d6cc09e4f44af3ac1216c19e09860ef2488c84442687174b08e9298ccad0fbb66e9969f1e421426f3e9729a8f087a4c66a62f9799823022ac536f3c4dbc861c18688b98ac6986e63b7d812ee4b7c7fce141403c1edc90b369228ddcbd472da6cc132ffef7bff3f72650f0df787b1e2fa080949830134750706b4f4e3eb35719a9844bd331c2fbd53998f00f33bf54e558271d7ffca78092dd16f18bb54aacea2790eb781d6631a3b2342a379119056139acd68c929036fce70c3c7f2e80f74db3c4e1038ce5773374e62f0170975c6db31d935f648ae2ad494eff245833d5681325108fe94dc6404750464a1a36eb6a90f8f042b66be27d5c091b4962c60cec61127ea57cc5c09fc7e6e5b9f259a5a127a1d34a005f6e2adba585fe698f5833de53344d30fcad79fdc7951d5cd75c038f0ff7b7fb0458be60cd46cd9c54c0acf32694829dbfe823e31b28510b4e7f37c14adbb3acc3e7a6a02934136e4cb718bc5e738bea40bdfd6fc09a435f643f63e4c660da4c19825f37c06de36569024ad5b265a1555eec02e796792fdb329a158c1a4d24d7d8252897cc6c1498a88e86a813dd3dd197c59b3da52da92f46df1b469a7aaeb1f9595ae25070c88cb7fff71a0af7ce2098dca13aaceff18e70a41a70aa93a5c16075511daa02fc3302ca879d4e5d40d499490745175f300d82eb03b138101d22c9220e5fadafb5dc92da5f6fc99727e0db4132525627ba82dec7c1865ad1d51e87ee09db7ba93971fdac10ab1bd36e3023765cd4eeb8095152c154c3727f234412b2f7de5bee2d934c52060805a4049b04eebfa35d2bef1f3b6251bb457b5511acfd7ed5a3b05ae1d82a16ffee7f652bf8a8ec5f58ddd8a07b34337b63f76eacbebff1eaa54793fddb8f991dd6ec37ac59b5ba396a0b4d03aa628040b7ec3b866d706e78bc5071f82e1f2a4291fd398b64a30c6ad05df0619d24905657545c7412c8ffe352e8dc63408f4c8106fdedcaa3a108e0b121cb520c07e0c18635b33418a168dc00ba185f50a10b685dde1fcefc1248aae0d267d7906514b68932fcb5bba3c19b6e71592303510517f09d9c361065c820d9df0511d8ad79b09bd95fdd1027af5ebba1cddaa541bd7de9e140bd7d1c2aafc27166f53133af5a07a9c2f67d433994b7d76eb8236fb141d48d3db361960625c671a8ec51d9af3e437d55ddd0b30ab561af6dd8abb0d820cabbaaf7bebb618fdc3d2757abd5d3c4bcc22f54be66f5daab6018a0b02f6eac5efb95ca6fdf23e364fba81b7a46bdeaaadc989a31adba3db2bd3733a7b0cc41aae03dea86d149f63e667a17fbee7258a39f5dda20cb906d1932584aa28715ca19295e982ef9d33ff5c7e8a5829d1c5f39be8a600a69f63721ba74c416f71931da85d53f5bdc8174fc74e1340bd38581d8e2ef3ef9bf26ef156c6e7c8128c37f851bd85016c9616cf2974399dfccecdcfb8d67edb9f79748ddea6cbabcc95778233326952e105f6cf6f7ae0d98190dcea395391f9b184a13d39783dcff7577afb814dd1d811bec9c53877c9d2b5d8e8a50ca2f727c1551948d3c61d86330dd924f8c38499f547deedae9c2106c7c32c5528e4f929c7091ebae669d24d987e06592640dc830fa2aa2c86b68e8c69f0c69df37b45c8ede8df98d5f68387e8d7c4dc334356339c35c3a0b7a82f40821117a914e4338290da1d4031142d289a021413d487a7e4859811404528dee11d2f3229788587a91484190aa93122727234e3f828082524f489e86ecd4e81f203f3b40ecb47c4890a527229e5e475e3e483922454948c9c709c8e945e4d5f2214f459e78082b1096842c311d61aad14788629050900f1211482d0408207c202242d4428286087a914c4c464a8c7a701272f2e125c40b0825a5214a3f7e8efc5801a444e4e7079097d2103b3f9224412a8264021bb33b218588146964c488080811901192a513b8a28cca2bc9cbe788ce53104f7389d0ce8f57d02b49129fa0a01f5ea40449f9f1f3c4439091200f62f23162a407254a3e414a825ac8d3131020355a8814292d240911119da520967c50b22385fc2cc99e223d2fd2d2244cd4c24419c7a12b20cad0173001610222652e31b25344c86988530f403b3e4a4246b60a11b2750810413f82e8f911e227c9cf4f7c91ad983b4c5911e40908271f828208f920410a229a4b88e809424808120a6a38109c89a99b314d8734754add9d0aa1f3b1aab790224b3e0c31eab111dca247a101f3ac1833cbd9cd39a7cf3967aacf3969d01cc228f7af7c6efaa0cc13830dd2a7b28715bdbed448e94be73ce9929ea1fcc5273f98e49e11d64c6dbe4c7f4683300dca87c00f4b4399a9a4f12504519681478ec010ac471fec1608c6137ab0a0527ca9599665599685b5eb96cdb2ccfb2d1236fc72860f5002fb31fdd58a0fb083ad61cd1a9e9f659fb174f4c85a162b76563689c0c2fa867896f293211f79b26a141fcb3723a083fdb29ca183ba4b0779748fefb166dd4a6757b26e25ecc21ed9ca4719d4bd4590d31863ac09c85e93529c3de0e68c4079a5c19a61d4673361e38b092987dd8bdcc92b0d3689cd71a93823b1ec962d2595ef4670313a90ff48c1c28912d1d0e4993b4e4d4c90beaa169fba3348ec51b7023c3ba6abc696f958583f9b29807d0cdd9a8fcda41e820102eeb9c8c92e46ee431bb9afd106e746747db3857bee63fc9a009f64ce658acc7dacdc53ccb2acc82747a71c5f2d10ca9cf42af6063dbbe1a45d3663caa6f53dd78e7bee6355adbc5ae0934398cc7d1899c0702dee6db0c0c56fba3cb6c8e7ba9ae170c5c6c992e5f765eefb6b90fb5e6eaf65ee73702cddcafecb9ee33eb2385c2373b0292cf0910190e36b054ef931ecf2b3265061bd41d97511182891d4042bdc78e62bc1b8684e0e8d18f663e9d9b9ac4eb7bcbba395239623568c5cfd29529d487b727c776a9727cd963e9a2ead496b3a3a3a3ad29c361d4d8a92f694fba7d3d70fb5285d7592e557a55c2b8e0d569b94e449cd021fad69d2540dac4ca25ad36ce9d7a234694d34476b9a2e4fea967efaffdfe749aeb9923b3913135f52ca9c6407f8d8a31cda8f099a9442b2a16b4d3bddf2249a23917c742bc9ce882fcd03084936ed0c2935163f4793c9870bc597de36ef464ba63a5ce732fb08d333a84e83376499fa686a4354c1c51236b43954a75bfabb4a7372680e2d42851aecd7284d4775bae94fc7c621ddc9fd99d694dbf3a84475547a95b6414973680ecda1393487521ad21c1df3334cc3cc459aba8c4d511b8f8b22a2e4fe9f25f9d393c35a973212e693ce0e9b47de2d248fa666ef77c1840d2553ee67aa61a59d6b9491f3c3cf71cecea28cd25f562f0af6c3834c29a5f49928a59446af4c57e2172c44fca2fb1af9defd0c71c22e4beea3877dc5eecdcc1c963b902ad4df6eccd46844263ab06f17cae444e711384d53a95cb8b82e39747179b1a57ea4b88b32aa0b256c188f3a974bad4fefd4e122cb3bdf366fab5dc36064a737e375fd6edb384a29a515534a9fd2a79452ef467d6fd6ad4e5a67adb5d6776fa662fffe94aeb4b4a718a75dcefbed863879f32ecd7ccfc3eec5b47765ee34ec2b867d64514d6638f0648f4eeb9f9084a5815429a62fc3af4f5f0eb58fd641d69099f270ed7aecebc70859565ade57cfbba8cf3aeadd4d29f539dd5137de4c8d0828879f6b7db07e7d16ba45a9c895c827d76755ef468fbc7df4747838d9514f6f5833cd86638be989a33f85e38c690fb70ef4867288c32ee4a07dfdbe2ee4a0e1d0b38c4956b84071b283b5f6b543f70e4f841d76a0c1503f27e56a07537c7ccede952c630d972acc195fecab568ffaec637bb7ca5bb5390dcd34f6a596b5b7b746191a0e6fdca73df24d05a5cab495bd356b33beea274b1065961c9fd8a0088a0e56dd4aabb46581315ce2cbf6766557a9d56a53b92abf5a75aa7ba562fda537837acc9bb10dce2eca981fa78743f51aeaeba20cfbaaebad43fbb6bf7a6b5fbbf633bbea5ec517958fab8f2855a6d915b2acb242a9320d5b89838f2720f0f10114b5d5cb4c4493bf8dff0e77f225aaf7b771ae842e5c69acbcba605e59851e5756f5f13395cf5ed35450170623bb7ad46bdecc0aaf8075d2c33167548fddd0e13936488bddc3e139316d7168c392573aecaffab59740f8627f0aac565ebb445670ec97ed63b05856b42e87d61fb79b1d0de688118f5834b2bbace49a351cc625faa567ed47054bb90039be542094b9134ec8516dbac5dfdfc6051cc2169d45b22d549f737440b061740af8c50dd99886996b6283514a174ebe0f127905ec41eeaf4740c9fd5ddfca8494f2092e1679b9004a8339d92b57d4a01b35e8ff8a32dc05ca27bdf06a684f5205ff588becd1276945327b0bd90d7b00e50cca1665bcab2d758b7f773525ed49d6d09a68126a56e4a46e2d09755399f6f4ceb061c97341176e76de8d32dd9532d18bda953ee4ce8d323255589a98357fefbbf7a4a2ecaf3d75abb1d0a4742bebce322d496b22ba5c53b9d635468e335a778951867f0d2860f68f69aff3a781c596eea61c7f1d71b47952bb58ac5b032b62c1ba49b6c769906e5f5fca6d93db4bed9dbc10039207bd42f7711f1c1e54c7bb4571b64e72afbdacbee334f2ab94d2779ca703d165250e29b9d9e972a06ea14f9b7e0abb8b2616fbe972c9d8927aaae9a87652383cf07720d2c7892f3ffdd5068b43a62d2850100eeb0c376ede30d860eaeff6f2d60daf20bf7ec59a96531a6635987a6e769dec6ea2e48d3707874783f45d3c61b9c73e6c27d24be148555d83dccf6f19e4941ca9ca36b893299ec19808ebef95d9739cd46aad13271dc376f27dfd3e5935147030cc9bf9e7a4fcdc67b6d0972f7dbcc8fc361c82d6a77e75012e1ff869b57eeda6b011c6bb37f3ff82acb13d7d09c417ede94f20b6f053d687d595c287f665155beaaf1edf19c1fadbf55b3f851b630bebc6d812a6727ded7e76edb9dfb454560390420026c65fb16b9aa6611a64761cd6af5fb3ddaf2dd4432bf76e01b8cda441fa29dce6d17a76767c5af85daca7ef435ee4471ee4446e2494e9e3fa7ee57665761fff71200ddb74f269f05c5f8654aed8844fbdfd987ea9b3d338d3e539b385fefdb072deb5d02d89c3ed534f9fd36aeedfc88c7fc30ed8b1a1e7c4f4bdf8ba4efc6970a3eed32df44dd881cd9ee54ff8f9fd3c27b878fabd7c07ecd83032a9917f2373ea6bdc478354274a9ae9f3c8b1d120c5b78d6e1f750b2d925b7cd84e78e40e7dcfc1fee21c146e28330a1b7e180f807ff1383c288ca72f755025782594f03196f0d77f1ca841ea1ece74bd305be857adc2c0eed3207d960f2316f143f7b1a13e4eb75c481ddfd7c73c1c1f4eb75c441cdfd70fb9577dcc44e1c67c02cb8b0b801b1b7471bfeb44585fc20d2d76c350f6849dca0d3ffaab3b4396c3e8c4de1b9953384783f45f98d4c3a1ed5898d26a352a2905bbe5305a00538632f6dcbcdeed982e131eeb3813ae8c2df34bb8f35b5ce9237f8cb88852d95779cfbef38e9b0631efb32bdfbb34d9cb15b2972fb14bdfd1ad897aece514d1f5fde08990b12c32f6b2d6ecb9ec66ecbf4fe55f470c65ef27e78e4956ed5658986c717b49698c15151515154c83cc2b38cc5ed6b8bb13a519cab6f4c2bfb10817e1a222ae089c45475c37bdcb92a7412c633874c9a10d2bbfa0c1b37c195259e2b7d3d3e1658fe2c1fe029987e96043107b97e99247dd82fd7f982c9a450d62efa2897579f9d84bc15e3a75eb493679d8c32fc862d88733349fd982613422385f690809e8953b2f478fec7d8c78469695008a11464ddd0a6551514ec65e1a614610cd8c66ec259386fdcc700c51529f1db129555e42892f3add9aa92e959212c7d02016ca793bd5c75751911ccaa28cbd2c5a328a7284843d267b32f6d80e0cfb568ffdeac61cf163b7c2ec3df3ecbdc6bbdddda7b7634c230646592e2e2eaf26ce844e31416c860ba65b28eda73136e4c3c86b03a65b72c6282557af0d989806274cc601237f0763a35b11d360612e9e23943927a5945218982572b2e3d0c244893f279dd44e171a0f3e20cae8f4cb98d43f7071aab2afdcec54ef75debfbc58e3d9bd77c39a3b2ed4b81b9db7ac86f97dc316b8c79ec32f6e6c8f75efddd3ee5560f756f5f4daef1b5e2087d9db7c79aaaebfbdf4e5ddee8b1b9ac49ee338eee9ad365a4b1cd6a0d23e0b7ba06e9d2d19a621006020b2365faee9c73efbf06b4087361fd7e2072b33f6d87479f879fd9529674148ae714d987af9dc954e7178333da670cca85b133fbe7fc4355e1d7be918f61aec63ae2163dfbd5fcefbd8ad2e3b0e6b76adbb5b23430db96b62de3cebee8b1bdd536f85ee35c735f1fdbdc76e75efb9e89c2633f56e74ee3ed2df30efe90dfbb5f7a7de8d0d62fe953ed718f712d7dccced6af766e626cabe5ed9800e317c3373e39b99e3abf20bc737fae3f797c3d8395e57272eeab0d89c38ece4d7d49a55f88b777b7facfe86ba44fabd1bded04cc4c7cbf4fb4fec59e816eca38cdb68102bc093a53806d36810c37e060dec8c6e551da9b71fd3d493b1b9696f4cd9063f9667611f4a5933265f62b55a5bb3ce6fc53a0ccc21983d99e5c05957947911fb27f600f6401208440fc42813edcba721ffe583f26777114a1e2426e53c79423e517a990425a080e20ae952e2f8274dbc73be15052081c3f6e81973133b9f62186e60a77f7b37e6e3a8f9af733225c6f9f1b1f98ec5f971864ec7150b2eb25831ce239e399390f29c73c6df3638aba5a065b274ce9fae15ef5bc07058557ebaec67bf7255eeeac6e9fad962e392b30cbb2c2b522c46f3611e49b2e7a1fad4671802a85f611ef651ffd3de6f25acd9fbd75caf8d4bbf7f57eaaa3215ab58c53714078c2953a6e42ca489b9c6e633ac815b33bdcf7576440c0b368e18b1213993d4d4be1c968916409a0d1246ed14cc15541b2ce4f8fe7b81cf97548d705b12b65f6e5dd536cc31df640e567e9ca8fa32da0756be8c38a2b0d1065510e5b80412449ecf79516881ed971f27758c4e94c43ec090e0e2ca0a6c0027acbf8c2f33ce183d46234ca939e178c2b637230388f51c5f4b9ab28c4660cd6af47df863c4a1cd5b1ca8e6c4ea065744200852182104274648d1032a8e40128210001df18323a460473e4080ac4911b67964060d982533d09630b1c428775816479f69c8aff23f1726b9e6e8492656cc00851451a4d4008a2110c89c28a50850601103156491948405823ef0044812529278b2414210a61c1129694282cc09577282ac891b42414e80c44f134842e831e4a88aa51f113411028a7f204be2c9a28a21243e44c043133d7e6eb8c2082aa2140d210826303049c10a94d020c8117816e083044e3c190194a723644cfc200b242190a0040e9ae4b0840a9017200d21c40b8ad2096c6080278edc400454032444e10411512081c1153b086a01982b12318a896422d1aa984284233f20c11241b8618612274545a2a460474706cb5e55cb66f0812962c0832336a04226b43d9099122f257ce044153c88e0064320e5e008dd4af75a32943fc797123350c2a843410db2e4010c7e08620a2490646412394ccc600a164198082123ffab0db64b2709f6dc6bdc77da7337e64e862a6bf633c348ac97e36b0950fee8e9883cc81477f80a2b9f939d042e4650c6691afb0a9ccc4c94f16e35aeb999f9c5c4ee1ce06abae666e60e935fa8b48e7465390ad514491080200063140000200c0e8543439138281a074693f403148009909e40624c954623310ac2180a81188aa210040000010600001020c8186db016a248c313788d86471435803c6f1a08211c4cc225803949730c0320c7a6101fd81d8e670c5070b9650d77b2b4f33c4efb41d5e10ecc484f4812e3300946a9b94a7b5ceb48436088b20e4c789e630e4c614029887e4490744a9e7fdfdd0ccb90032b55fa24835888b6f8a5f8cb300a9532c309cb005eee2a0f0c07345395dc4c8ef07034c4846d6ee9ca3226fa0ee701295fe9b5cc7645e30d0a6dc9e59b2a0bbe054d800d5129aa2c86d05cc1365c945ba0e423ca429c9378b000c248217d663cb9a49af4bb0181822e17178a8f59893fd02bef4327259ea263d76de4e2b09bc30c344fdfa0c54be773ec0e239bffde5ba0cff9d2910bfc2682364c54517d18025e928b4600280e9e09e00404cf41f144112de0ffe225c3904a6f6549f2b2c9f6f0cc6c24a3bd24fd3430be4a88f12d6cdec727209d9dfcd2c53cce5797028d79a3d8e511669be93662c9fd11db1f06d6f6daf031cd2820df1045b6b217391dba6dc5c205e32e2bfb3b3fd96db0bca74f1ab5954796907db2d569a9bb18a6c93b3be44c53bcbfa160eef2234777f991df5d7ee44acbcf7e4f86b694c099fa1e65c476a844315b71490bc72aa815496767295b5831b3d8046de660cae2bc3e06d68003b118e948bffc19bd6e694408002b3b025683d13b630ba717864a3a6a87359b7eef691e67d6e896796d89e8b8d852724e555d02ef48e8c958496d7008af28a1b9e7d1ef64cb96a9e5d30a8e6930dcbcf992ab09f515140c16b49da69a81bbdd5a1636e9cf9ff2b37725db26493c4e588e483526f1619a99b624edb50438e567b76814a14fec4e58fe8c8f68f1ea40f69a5be7f916c4900d121bdcb1294535ac60995b4742c0d64e958a2dc21fcdcd8c915d7b4b468485fc9d0a60893be9c2bf2626dd731a41c5265af687e1218ebab51b6ea36117efd806149e01c612e8ad3837736f358caa0093c54cc4af20721709bcf4372ea97fd2a04b945071300a3feaa2ba7a74719c3df8bdb2ae61215d621ae3485863fe4b2e267747355cfd50e8e53ad32abf3db55a04edf15d8873ea8ba75ff17db103ca02433a62e6122bfb7a281eaa86dd80ab336c864d14d95ed8ae2b0ea1acdea44dba28beeab53827455cdea2b4cf12197e339f6fa16d5808079b198150d69db10d4c0647253ce6596590f6d8cfe8b264c348df2d83a240b2db0580188a3742095dc095fd7066f9f4b6a7013ea4227694e9087c15df761c0a286b19ef53674ab2b5d13f706a50834470e8d51d1dd9c3325ba4b6ce52bf16aab8ad8b50ddfb824e884632463ca9ad4aa1427911d15b6b4b1f5dc9d2e7692ba8a507ff5ee09a80dae6c16034bb8498148750415259ea61d69b920ce21bb425d8332024005a4a12c73f7beead50aecd3627b692a50f3d3758c187322bce2d2630d10041fb67755ae4ed9fa799ecd0358c70db75cdbbd9077aae68744d48a4114c34ec9fc17ffefd89baeda5f460162a4f991acf1796e427115f604bd7023dfbe3e5ed3b48ab41ca4e9130dc9731e6e22e3f9be4de055d562b191c1c3342869832c248d3b811ff04c6c95d3f204a2f08bab874caeaa504bb5e423ebc24a249a13887937f033dd5c5dc5c4e8ee5f72808eb862fdce2944216910d96e438318713b6425064a8b45f0ef630b5548464426922a6c9dd4cb8a02e153f0827284a30f96c7b170e671b0806e3855d207dd32c4ed4dd9a125c6f31eb32e872a3282d9a95d69e3aa35955041f6c61014258506cf08ac2f72b9ecff82fc260951271c7a14db48f8ed53279d9e8932a0298cb88f792c6a0e73e6119c9e1268caa2574d89925d7dce25981700f543ed7781f0e3e02061d644ebc0ca1b12fac94c2c1f6690fd8324141498c4281835a99095809a3eac8bb9b82adee80debaa86e1bb90608fbd8337231e74ba0755b1dd09c49950d3572001e4d83986cd79b5e1f53be552c009729a797bdde01d2ab6a6eeb633e927925e791a1884a4a728395b2b47627044cbe4a0cb72b516049a573ade66145a90afb4152e099686dad463528dc0f4e8b7ef7e9bd23473d2c5251052c7c31357fe4d74d7fe3c9d1987d23bd8b85f6310be9de78d082f76ea3c3a1dc2a45749a76e422081c2b392c86745466dd416ab981b90a04a12638d2f1f0794a9ef6babbefa9d1bbefa81d78df51cb3fdff9a12e2a43ffb6792bf14d3b0469172e1e45bf91b0c6df27060d9f2ff937a2262619ce2667993e40243ef09a1fc04eee735149584bd9ed88618f5925ae403da6d8452130ba7a24d09dd4d35f205c8f7c061ae2435a26d4e7d4590f9fc4816c1eb67d11690228620ce18c33a02a4846f5ce38f535acf56a8f73699a50e0d19423ef1c8e95fbf6dd4cd009f8f2ae7a61fcc003dc2762a170ce1079c58310009472fd94ded890704054b6e8675544d8ab408da0f2a2b9199c3da8982d84828b6cf3a727dc6916a614ce74f4017bdfd3b62d6cb28c85a33fa1bef847505d6cba840a237da8180b846a02bb7c22e213e8ee0a0a981f298929ec4b9b6d50f40c478e7c42661f259da3a08fa076feda0c86be1db4268573e3e26b30ee561bdfce983344db32c6a4082d85ef270942231b936640b2e7b12651b19f5e357f4aa745b20c088385a7f4a71da9be25a08dc5bacf8879656fffd32d718304a70a6b077cd27e6fc884aa3458a3c41fa0f6b253bbb353bc668748139bdd5206b315c1635c99a62bb08d2f9cdd351b5304e57109c976caa8006c1802eb2fad473da87dbef2499a7665711fb61d86462290be9b8155a3db9792325a7785052aeb58efa9626f21a10ff082e93087f831d4e59e94ff303d6404a5c44a10c65453719c4b728033c437fcf0e7236e62446d17ec42092e66acb3900200bef6ba3972e6f91640cc27af5bba2ca050ac59e68f75ddfb30b43b6d5894bbe08f6d3477332e39f8bd4b4fe0b6a6a5a6acf2f8deb7fdcc6234c715ec9468481cc83dc55a7c0319648cdf1ec00de43ceb9d90f72d8fcd4a17dac3575e83465387a225c371e1a04942e66b126a93c38c94234855cb4d308e2c78484c89897add412b8e23150035b16f0a79f6a5f1932a3c8875aa148a70c507faf8e0079c959a269185641e0f5a6850003a6d07779939616b8abbd4560844c6a92580b1222cd263a3ced0b16956fde46ae36b968e5d821c0bb83a44d6f61157ab1f32c746bad10a682f04d0732cb30061f2c543d009b340a88b4e7bb5d1304b5171d2c5d8eb3a7ccfe8d22844560fb727825eab5953d0027f4c4a3098dd41482244f0ce9ee2659605882bb29e2e54c77a4f939d7f7902ac82a1cbe2dc03fad038dbd267aa58b72c42751dc2728a49962914890b0e9a32c3121b30f931291b1a4127390146c5a4082db0e6fc47a8dc3fdbef5951201fa2554caba6b9f42c6aa20afff7483706b924cdc9f1c64b4221570cd44511fd7bbbd563f52df80612d2d8cfe5d8b13108dc8bafa7a0aed25ac584f0adf9911dd0f92970865cdb83e35ab860913abf967c06f18312be39213007681b8ff1a5b02aee67c85419b720cd618ba63f1bbe93e282289bbd070831ec9d781bbe59bc811f860be286f6079a0810f53b9c0c916389b6d08c695792a9b8c5d39dc40f9af0edbc9ce44ff2921d24b8a50f619610d4754d14bea70cf306142a25d91e8898300e8c64e1e051daa65bdd5031025238eb13faf978988353ae62b66c5132124717b50d9f987ff540861a9ad1e9873ff4282c955b01be9feb8b4d5aadb7d35c8947de0069f70322f443fb77248c9809163b654906f5ef323a6a1abd0800025c5a653abd27146e0d08e381246a327c778a7d6a0fe677cda308065cd41cf69a4707200e3a2b4c1610d1a8e2b44cccc3014f58f0402f7a35c69d57d714d369de80eacc96a47b031bd27be4ee3cf986741d011dd2cf06058a7839e4828041038c538bc3fd8acae8a3d7fb0c447cb6b58e9cae9b31f0e4f49486912abbe0a0ad06b7039b2fad938e7b0ddf1e60c5a4e33bb599e59cfa19e9c2532743775d522e60aa88f8e3540a68f9d57ebbd49622cd2acf44d0c6bbe4afd12f7c7a52c1261335f1db93c592a6688827b3ef8e24a7befa3a310a0b5b9d565c96d97a9d138157d8eff79e88a658515c1095d3e78430e8866735bbc2c2b31426f6b2be391b2bef0e54ac7a4da7dfe98c4b7aa612452f204ca2be5ca75e6bc2a9eecd01a16349c110d8ab91f938f8502b39f5e728f9cc97eb54321f6cdc18f1cf51927f3357f7728c1484b85d09599b8d45b623dcae64d021032b3ee42b8312b1eb52f5635501ef83ef381e203d9d91b37c5e4d2d2c11bfb846f6450ba622965113f334618d7cea8baf466dfbc4978abedca3a16582d019ebe5e6ad97d13bb9eb36da5bc48664465036d16cc4dabe325f6cf99549d89c35ee6584efb08ed14d0596e5e7355bd9f49a0df3224ebeeb52695dcbd3ddec9ca58d99577e264124a6011a3cdd13c1d4b272cccaf9c4b45919912bf1bad2569863cb6d915c6de2cc40d0a9f2644de357ec31de7336dc8089bbe99630add5899faceb2d64bb656adce9736175eea58b2509d62bcee6187103cbae43440c0785d022f726bc538e2129025039420ac61635ccabeb3630d68fb85b8363307cfca487fba4c954649d2aa587c12c4f3ee5f303322807878f97ed141943c701f87af556520175d026e471a3c9df30104013487a6fa9b0a648b13299ff12a1b4c9780a91f7382af05530e93f937be6f51574c6f6c27d99e0ffcd1936f05ebf388464da49915ca8fbc500234cf2aa08b530848ecb0d954f8476d898c8d60ec941ab1b5a60732fea72005350407d4805adcbc2fb19fd673e7d2d504b30da43501047538a14c7f7289d4aebb0aec42e17245433aa41c43eaec88f577de4861f09fc4e39fbb011a2ba759c9e13bba2a3fafe1f7d457dfaf3ee1b4085b1b670a24003a21f6500477826a69c377a25cd13588e8075a2cccd0cef7b5f9748ea9b00a128f1beef2d47cd052bcdb425c7e3cd9080df017ac5dc2378c8f0a524ad320257d57d5ca81e05276f33ad3ad0a0c98c2212a3591805b03f67feecd8430682bd1326f4a6e131088b0fe01a219724e276ce609be8b38fee18aa69476ff366d8223c935e7d22d57df40738c119a37722d5a673d00973514c2dbb515b5b4dda88bf19ee610bd65f0d3452ff4a61bcacb485da60dae12f12b9f9112b67701ee2fa5d795f602fc4425cfee9f8eebb176d78eda0ddf931927d03d60af6fe214b76182bc8c392965a9b04066ccfc8cb551f812b7afd874045588ed61dae8027badfe8407b473c0644c87bcb4b4a2b28611f057c94b5b874fb3df31e93b14e0bc6ebea0da854208f7656bc484cb0caf50457c404887da67ecf986191a8b83edc5fe40bfd51d7e72778cb165a23fc1369badf3134d6ea5b047291e3829a97666633a867d879c6a6dc1a5e98a7775ee479b8f04755eaa18fa921224563d3f50203be0310c180974f6483edf47d49e5f777b48d68187b790c4d66b618406984ce6ea0f784c8d0f687bdaf16c51080970f05f1f9470952ccb4c00e175200deecf33f4a4f6cc37896158be0d759ebfe917bf7d973f05bcf005e20961afadd84b6c05633c0a32104d0ce3c52c7163dd9618a4fd937d4e1dae1161f2c079296ea9f7542c010dc423de84cd176acbc01403eb7385c4e974e773d0a011dcf9c19a76600abea0feec60aeae7d69396860801b8fa690f0dc72e536fa6825b54755685dc03259f83e92e255c7cfddaf7da9faafbd48304f7c860f5c79590196a255c5168786884c012614a8ae8634b23b3955153e4b2ce48c1426c8f19c43c99a3f451434a5f80c9e6822c51147f8bd9666d9e360ef8737ebe3d386bf4fa8371c07f9eaf720a951d07a5acb60030dfe341540a6309e79668bcfd1ddfb8b0fdd472dd1c91dfe617ce100e99e48ed8aa1d7fe65bf8d060d307672af082453a953b1c3b64dc5f3b90f73ea4f7d279136b971e7d0af1db69b2efd28dbad0a8ca2d49c214c011449c2a1e89016f3eac2fceaef671424c10a239f8a8ca6690209b78042dda166a61745d1fd6dc008a600800d74023250dd22ba1cd4a0592d467a0b592600ed98d2fd8bd84c3f72e2d2cef75016d2c0f29827520204fbe4212b2eed432ab3f5b26586b9fc5841d83e58409bc43844eb4eb3ca4ab516d905ebcd9bc467ac96a759912f3b39735042baf60d6b4af70b767ba156b8d20040b74b6a5fde5b9304ef6f6b09776ab4b31065ca350a366d478c608cd2a66deff7a8e9f54ddf3d1efee72fb26b39f369766f21294cbcb34d2fc6fa90aab0fb369e0bfdd1424acea08265505482f3a3e58152e17cdde0acc3632f6b47b81012c6711a8a86dbcef8de29d84b47319da128e077a7446fad55eb6c0b4c1202bc45d5480f786364fb3b6549cf8b7f4c035dd96e99a4a1c05105c9fb384bce07b04d88e0a7a64e4e4900ec8a2cfda1aed6919fe75ed8890cf401313fcd6a21e48487d63a4142b94d91296a52c7716afe893975589a22589d7f7c45e1d6f8b22277b7c6c08b7d2fbea5dc7d4cee1c2464d8170958b3c5601907802f2ac270ccc4901d36589e2aa030617dff0fb850fe54dd8eb6581ae2e00f5a102be51388db7ef07ae80bffc3cf189b675a9bf83c68c9de6b34757767b36a2ae5a9a97bb2318586602015215d092ea0b9d5b4b0e2971dd6c9b880c87ba279b9c4cc8a33bf52d3e0e0de8e63f62abb6698c4c12e041c15f822503e4e186586a0e97f344471e31cbe1c13d9081aca47cc83a59c9898bc7014a581c9fd028ecf74a5778cea0b644b1331423738f3c4b2af0d7ff5d9cd3a2e69753d794554f5be541c04e39a34b4fea80b665cc36c552823fec3849c13221c842406de0cf2a0bc43f472dfd9c5b94aed95461a63da4f4bdfd7a5e5005983f46311c28d00d7df1ad4937382867bbdf086818ace7a323d5557d029c2175a0bfb59d5867190f5dc5e51a5db39239dcbe95d751e9c1ac5f2c4e882b384dc7b96f79b99b85be812d98cdc1f13eb39088683b2ea9b51da7a423e041d5ffae52feb95cabc2b21cbd4a3be060380d6dbf1add2592e97e9d80dd9df74a7dabe3655f4ca467334e82ca6779742018ed459466b6e813f20c915585848d80beb1d6c6057dec1c7807c7bdae113d9bfd2a16ea1e4d1b185db99441d459c4f6e0a05e41f4d81fa899ace98dbd829a850c31f68ec1da28f2b916e3cc57f689e377cb6e66480392073603f0dddc44c9dd80b4a4025f98b66d9612db2c8ac1f5fc870d6895d97bd74964d1eeec08aba88252d29dbdae1024ce63d304cb7cd867e6386414b759c21423165068910180beb442e7fc5b5d3e88da387272a403bad8aec719f76298ed860efdae665fd0d8461a253a0ccb9b6f53b4d4172670da886776d711859d7a8fac1867246a6a8f029d3dda30731e70034738708fca1f59872207e5a8d5233f6ad52f1e19d62eb97a5c8510ebdf03875e25987f31e256dba899a323a44c4730be0d1382315ba304eca342438b324114b03136567ddb9248dd3432943af0f8e44938cc20c6baba2fdfb1cdeb1e518485c69eaff49eb1a30b3041c85d2d7a98b5b02bb4f1809f11f95b0c10b2ce0faefb6c42b14d50ac7cdeb7e005c0d131260ab08c24cf31eb4adead01057e0c04923c8bb0c1be66d6bbaa1841849a0b5ab54d52c6775f74cb2db16c9ee411b6aa2a4728d0a8f210ca5cbb8a9325af32bcd27fcfc9c0688eb1602c2c6bea5f7a3947ca40f7ec0903caa418628a5e5319a76e9a867bb66cbb0f9124b4c7933db048326bb0f8786daba79079a6064ad5ad72f249ff39c64fd56d3351e3cd29a489e71a29a2cb6f5c03f644ffc45575362c3684199f9cb569a1f461101fdecf9453f8e42d028c7ae1709c13fdb3acd69f5c70bb261f7263ac138d5f6c3bea6cd7fa536f7d7fb918cbfa2a7c63ac32f3c13614755ca1a5a99c59617eb707076fbe6bafcfdd5381dba2502286f1f31f0d0f236950b30b2760f12a5ec1f15c2771db96f8ccb70b7a43ca187fa3276776b5b9a9d4978aa7a154af84fdd8878b3a3217bebc0825364202206d9e320051f761da58a05a9dd3aca57be5a64b7d5598111b34aeb0bcb43a9c60b42aaa343f3297e5ba0e39ee07b52bc5a52e5ea4a681b411e55472cf8f92bc8067f4a92564d308065d265d663589aa6ea2eeecaea63e21e985077572e1e04c9085fbb943a11891d1ab15fbf9c834f1fe6ef5da6634ae59d431393d7e2991e67f064597217245c981e03d717646376aaaaeeda4c66ffb5c0817edbed511ca070ef8a635cabc43d718f716af6cc0d3d5c93e6633d0a890a2297e1b3e2012eaa83eafd37706b63f9b28fda5aa931b9cfeb587461751e70295596bf4ed5b1a85b334b3a6ac8a670f2d89df6d44cf46bea7c6ce90ecdc7cb113727b4f6248d73157f7cf01392cb9fb37ef7990684d7a4861d90a6c5f23b66dc38187d2e4300366c2f105be1143f6b5eeaf42e6400299b16c86111aba336bd9da422bc7774e98e250b3fb6bc2b699535981dde1c5caa3c8f0976ff7f1b5ce37625c097bafc5d5f5fe5aa25dc4e745bad3add2c09eebe740ce68d8e7388fed6d1fe99305d227d3db9c5e4e94601e569a09162ee28e1ffa782eca1399d99346861d10f61d7ba345b06f7eac794cce498bb6a15a0da653764f7391357f2f7fd3eba423cde2a99f4da76a84e4f25d7c31785dca562f2d8ddc1d154168e42eda906c14c22648994c3ba6041edec6e2c1ea404c70021edc0209eb13366f82a34b81de24c7ec97a3e1a5071e3e27b7b5a36a6027ed8060073d1af51515bf75d6a0fef4efe6ab8451e9231d328fed2f01ec5ab1e83b643d0e0430dbea4556f7643fb4cd6d76eebe91ba0e7a32c58325d1a1f0a637873dd952062a17e1ee830fcbe75e3398059fd2055bbfcd894fb7401222487ae91741b7cd75a7959b7f1c401ccf4e065b3932a7ea0b4ea58f575b6bd6b1407d4030ba7ed7a466b09804c322b5485748d1a434107d2f1ee85f3bffd2e6a440453c032bce93bb003ca630f4b2e09540cbf123bc10f7b968b74e1b3315c354f6c6cdf76e98c3f813976604ec61e6e4aa1cb15a3da34d69b4e7d6b051468b6b0a1d2396eb2217c16a5933f99ed25f673c00753062409f18b08e88f7aa095d60be8c010de47d3fa77b6de88a3b00e5a264aee5896858a19e3b5f416ab3aac7899e480306a3a4007a358e4471d942572476270127ace6072643308a3a5ad135914c53c2bac98039ac25829c8c7b346a300b4a6318e598776448495bd8bf28b44edbc503da095ece690422de478c5809164d8e933f5e58729bc3345d17810d537512bda326a8f8f1060180a77251ad57b385d91ded0ac6fc2960685186c85ca13c565923e8a9c81727cc0184b709792d59a3ff8847002bb7369225315f219a46fbd1aa6397b95eaa8d20a9cfc26c28a44c89357a40721e52873a80c06804c4512bd2a3f3a5815b593ef28d539b69810dfc366a4435eed1d820a6fd11501eff4db9e91dd9c693d279084dc6c4c74da0779e4bfe2ad27ec93d564a77360a0f3d0d1d40203f3f94978ec061ced8644fbd4af9a8b5bfcfeb00f35b5143e2752fe16076ee78e68d971162d327c81993e587fac45a2d9a39a3341bfc28b3900f72e346bdda2df77004bff393f9a5f9c21c2e20e79e580c36534923a83e33da381f4f0b9bf2bc0bc24e9863a907070ad80510067f23f3fcc0d2235eac2a7372655ca266ac3605e9833b864acfc09c09fa1be0a12d777f3f828f7f91d833a482e125231bc5a99314cf37e4c402990d37b3c5892a334b2c657a2273d17c712b7f4ccbfefd6b93bbee893ab225fc2b0bbd6951fc4f406a9381ab722c5c50f0737034d7fc2604834b6b374645452ae4fd4448b8cabe2b4d1a1f137ad5196a1ab2b6cebe728daf684fc7a54c2416dda134e33ab1a88864c2350f387205306309b06d9100eef93d6ed0d5d89a5049a44cd91f5735e8c39c370ef626b5419da1db9cca3fc9233c430da77ef0ab96c46a6e651ffd3dfc0750391e0f4541af77ed52ed12b25f270381b9a3e4b55f25ee124c1a148d94ed57e9cd06614f853b423d35f16f88004f5ab57974d0faa2af564ba3889bb21a35fa988d498ff17e220373b1811cb316068eb41859864c3d127c773411e84d21b7acac2780c786d88347e77e427ac78daafd001f1894c33b8143a3a1ddf5d35c9713f9bd8ea439f93a3a206069528eff6006349344f9b743a275e9a1c9ffb477fd7e41e427c0a6e01e8fa13a21dcf4c8c49645df65ab2a0f3d69809b271a42e6f9d9a3d912e0024fb8e791c2e551114a018f93b6cde55007c6ef5797a65c7ab9fa6667c5feb204bde580df5014febdbf8b0a52bfae7034225989b85c8df813a30901beb8f03c2e5cf1668181abe48c45be705857467cd4b562fe92bff34467bfc8a83d583b5f1c9c0b16bfd8b0c0c7a1b01d85960c3e069a00287bfda3240753a5e3fce24228f17b0ca6719bad148e5b78e05bbb705a33899be8f53ad0a9c5119a1b5aac9e355302d079d355ae69b8ef55b8d4e8047826c8d8fd29215dbfa350af3aafee198860c1d7c5fd4a122e7490cc2bda31009e6969503d6d75e88a1fd65ff9e5317139f7317ff0e586c6870c4728c26c077696470edb5024df53b5fe419fef1146dfbb0a528feb0adfd4e42d62ecbd0dc72d1ef209cbda57978a7caf11ba74b40c8d8ff9be1fe1e20dd02b644c0df662bb7b505c25f2bd9e729619df1b2134c3039616a23fc1a1fa7cae77f55e56085d7a643eb015878af23e4ccd25cbaa90ffe4ead5a83374f10839aef5d6d07d076b10ead3f47abb3a2ea421f0b20e5244f3cb17db46f2a9133deabf675c7563d83c474e0d264d12250fde8243ddb9f0098027cdfc6583cf9e3fbf016a1d79e0411ce532e9075f3294e1373409c08191fbd51b287840248416c1cd3ff1f8f610c443653de77b9514f1ea3fd021d92413be63dad38f1c7b95b1dc6a53802055bd13f1d2907c5b8ca021f24c659d98dcef6ec1b91b79e650fd82bba0c846b5e19721be70b1d2986b002726ef8b4321fd998589170b79979516efd5ec41922ad4ccc3e57587d1aa5930cbaa9cc679821a6a3394b69fddba74f66d66b147a3b66d1f3f219f0dff65a1074fc47fb93e54976c555845c6bdf80cb1cb732ed6a2e174412a35ec81de75cdea6bc0f364ae174380bab43e644a6e226665e89766be36a37b931e58c0300b617fb64cb0cfdd60ec829d33bb0e2af411faaa22cfd9dcb82ee0cac9d3576db1b3bdc85f94e1fc4b7e961705b562eb6ba91eaa7a6b7503ce2e375a5914447eb6e7e099de9e31eac2e714cf1cbb6ac6b5b1233e8350e465356cca85d5642bb1124278b739c3702bf7bf8c358d857424c9b974b34a74f70712758105f2f5129b2441df0de07a4cea490831abf4a82ed4991954c6bad424ef4e07cb8b099d8637c723164c133a319857591c807a5cda0adb1048c1c41dce477c06d430418cb206162eb9532d847ba86f45078c7c5aa48beb90eed035c7988c4ec17efa07bb996f84d7001b6365c5ebf320cf99dbbe70e761a33f13e73b0e8e293c2f5cd677dfc8b041bf3cb12a443e7b0b7e87b30a089ea4b90b64432997b58add0a94557257ba1a826a31212544cd5bfc491c4e8377e9e0d85ee95c356c7c7e835fa2836399142390f6026abb7bf18afba94bc31300bfc2418125baa0216a5165098cd4bd65f06a003a0faf0e36dc1a85edd2b40de03070cb83ca386e4e63703121b1bced37d834da8165a83cd6a677992fb398e738b26df96405a1283884b2ef538b9cafdcd351e5129faff2e4c71821b27aa93e0939688a5a93458671427324102bedb7cf1c00de7c482c477651c109c6266faa3425e4f22913ca0c176d8d71b8db644e2f8275458ad2bac3f0411d5620ce1cc7f8d6b5bdb4def75ca4933bb2054c484eeafa5d920d0f71d5cc40507b88429f7f54af240c740066e48059607678548301b096d2de72bd257cfdba6ec6d996497149c472e1b3b89214652138dc53125111b8386bf8dcc0bab5b4817877e414b39cfb134476e70d73986d95fb0343f6f415ca84eb56ee0adf76bf9b5729dbbed1027f08711ee5d3012f699239cf22caf43c4a331bfa6713236dfb26ccbfe4db6f626f272f352400695fcf856d6443954d7adb2b047736de754b59005ea128990ca85ead257101b76a48146788b18dafe87b607d5f7c01e266a570b4aa9138e441b2a9432e414112a11269b6ccf50da5f137a1e50ecd2742266e34e56e2552465823581c0e1b426a30c38f93437a412b9d39c00b185ca62567c10d17e95b57b14090d75420498089afccc4b2d9997d2824f71c9e54786df64275825057cf691262e91d8b4218a96073ede460781cc219218ce8aafb2d74a5c57acbdc27746b7143c2bcbe6017ae2576c428035106f2eade65fd04abe14ca931a713bb2494583738809fcde4ca05423588145d050466845cc8cb9684c15e0a17714c017245a9cd53912143ae88e9568190505410eec2a8dc888fb15ac35f0412ed4f0291e01a802fd96c7e7fed50855458872c0587a0d39b07b0ad8a90c151d633ba285c2ab9036cabcfd9126e741bf16cc50212548f38580e58a8ff0a098ddffd854c40322e938f7fad8a3468bfcccf904e76c3c2c4f6a818067aa728d12e4466370aa3544fd72bfe06d61ad34fcacef62490eb19e873e94013c671ae6667aae6098985c9754a8135c00f816829376b4308f3b7596787aeb917365df41d6610ae3efa7fc94edff8a4bc0609a48b1133a295645c3c8ce57b05b6765553606838cf84f777ca5cc9d34cfa1002ee5fb0ee4f06df6984ff67795815863149130847c288bda86030fb7450c126886a936270f9c185548921cb88bf7e04320bdae03f63ad0bbed511ff5bebd4aa8028e77fa20aa2dc73a8a3ce0bd5a58c6f67900ac47845595645b56d68a80c08a662276b83fe5b0d7b6ab764a43e783032c8ffc2509293303d51cdc17931c1fe4048cbc2b6727a8c70b465c4d227066c4d7b9bbb8b22d1c6c2e23c879d50b15981d29b5651b8df040569269650579727098c4f9c3b73fd88c5c30b1ed125add2177724a8f894fb9364f2b466dfa626ae329f33173cb4ce50e0f0a497ce3a484b844e8d5ea606ca362dead5b63423f9ff395504f72e577c3cc64f57edf6f9ed98c475eb29da21bb5df432aa33667209caef10f19373c85b5182c6a7058d1d60395b7ed30fe63ec257347bcef0d850ecea95e5213ea492ed422d93e24fc51baf9ebaa196c07ecccbef397538e5d85fbbccc99d66342c38084faf94d36b0acb334c46a208f58ab3a4f7d0f705039aaec096fdd6992502d594bf597a115687c00f0c0bfa70c06f5cb8ebc040cd5fddb0c0d70da66a0100ca7b8e405b452af03cc1587089e78648c5d6c346b1a18102fb33a75419e8ca818ec1297e20497597d999ce50da5068e0807b9277ead96ee075a5c0cdeede3df17fc32f089665d129e091ce5f7d90ea6aaf73a94eb7717ac17c62118c30ac9cc2582eb7c53962840a1a393ab3338ad80a63e6d3154fb25a161a7f17046de8c63dc4ac8c92162760166b42824abade51dda4006d960d42a459f0efafd65967e6d213d11173c1925e35c6ce4f383ac067f2a800080fbe81725d329e762b1360042b3d5ebc65e9b4c722ddc5ca702ff0f9d7d5518adcd70fd6334d0f0eb5a65ec0e7b8ceae56c1f78da9914f80fba4b45489b45b6d48ed52d937acb7817bee94e77932d7e32e7a9fa38338631de76e8c05d989ac3c8da3cf3cec92644e65ba5cae71488fbd6b6e72d3c62f795c0c42f08dcdcb730cb50ada173ef76f0fc3921be95930f4db10e786bb08c463acf3416f1c55d0eaf67567aec58fa3280a9bda95db8b658df161e52d2f432541dade8fb17219c01a515126e95685a173afcea19118c5b402197374cc45119770363199ce8b21832cf444810ba7e0cbd6a375a41dcef2d9fd3f64f56054aadbd46a83d07ffb67256f57cb8f8421f8d66178fef69d476a31a0c345846889c03033c4802966a76588867fc069d79c9a4222d0e9cb8478b3ee774162c74667106a9018469a9de2ec2a0fc7988937a3b18cf34b13ee71dbb518dd39fc204dd1cc950d6744d7fa0abc3e87121a2660b38dcb9551b7ed304a8751dd87700d8c5e9e0c266b6417b4ca2cff3c3755a1cf9a47e2b5e2574875d744ee5758b6cde0d343c7d4d8e17080a27b70a78a76d59a6c5265c7dbb87fa07b39bca0ac907f059bea5615329622e3209b753b40cfdceda510ed35ad4ae0146dbf0f7928ed8931aae46116694a6fdafe2a2b23282a29476c74670db86ba99e3bcfd74ec31f42a13dad378b48074558f28dddc1f32ed9e669496995ce4949288125f3879344a15b7dc282858ed442d9bb1951a89c230aaccf75723f49c19612226a3eb46d746a9c828f37051eb0f0f9766a515db7c5cdf2a9080b0d1cc0e4ff0f0015f1d1d031a53dd13bb46de1da8b14bd4d88eb6cdb76668c27a0137e1814e1b672b86aed44bbb41ca2c9c94530746e43849b2b6fee13cf96ded02adf7d8a2ec13ad6c40806d3a130bd596c7d4739c19bc89cc5bb93909ea9e85fc83e83f71b81248b244540be6a815b55e874746029a3b2fa1a58c04429273fe24a2228fe424c6f854bc6068213b1513f8024059cd8399eb59e65dd076b3523d80528a4a821c79f66425f193e12a2c88a62a917f2c010f71a86a04ba35ad49a062cbd77a49033eb3e78ebe8d7da0ca50a2c0577b41c6e693e8092ffb3e1c4a0c6afa08400c47b2dcfbd254b24565be6011c538080b1ae9e53d2db87139fcf04f2c37ee64ab3b715d673655e48c422cd7d918a20b5a6d513104bd31266663d251f5ee9aed9e026fc2baef95e1a1fb0d95a51ff5f58cd0d0caee49c14ed9ad10ca3ba284aec806d936dcf8beb95c172e6a0bfa53fc101ae691587efd2a8e057073cdf3a00aa6f9d05e7f4c3c79634b4f7f23c01ec34c60bfdf49d8e5b14f328a6993feb007e6fad591ae99f9755eaa1ab904537f55b4dcc102f6bf3f636e2b34658454dd9f7a8811f9b415fbb8f2a95788b386e5183a993601ef59f78be52b7c4e13e6bb0210df4d5bed98d43d98a841d8fc9c1c2ff4100de51dc2cd3ffe25f73294c17c5245f8f58e3d36e382d4e2068cec2d7b5f2bffb6b90b637239c5bfce57cecbc3d83c3b72a3e663a9a8fb44638257d5a13d89a3acd6b071415ec07ee5f38df5c3e8dfb420350f5743c7cdb8d7f004074962c15ffe025d8141dbef47964fe5e09532cd3e1e7c32c09a8a28689650fe8573b471aac47d87a4003c2cbe1e3eab3a3048b295dfccf505a9363b47fc42f1d99c8cc2cf02744a80f2801e865dd4c9daaa2fd4f7ff84770ab553eeba4e7985f637c7c45f6368f4537febf8c528706c83ff1a888747f1059fe705be114c915c406cb4cd9c799ae663c5b29bfff89fed2b3e9dea770573bcf9c2e8ed5eb27e6d3700eed5a914302d41e4fa5015d67743f15b1281f5efe464a7898c5542c794fceef4529102b5b482c1ea5627edbf53a0ce50db0d3865ebaf0a206bdfb032f61b38817a4f753f3e9be27aadcf47286fbf71210202f4e6a9c31f8dea521cea2e404cd73cf5fafd69505e2132781ce223f9a12f6ad49d43b70035e1d61f01dea7b0bde9274c276f1efa2b4195c50748d1fc8581b34acdfcc7739014fffb3193587591e4db6a39f2880e1f1be9949fb44a502f649867f54eac012d76b9ba3a7a2cc2c85649dcf55d2bd2cc9277f9cbbfd7dfd32aa248f2e3a9e5f3d3855af14ae3c3d313e8df3524be0f09c4137d3f2e9112363b29e59e936a8329d40d1f858d14d40c554e043bf8332dd58dcceed8f96aa3571a84f52768ef8b54bfbc8699a514c801160bf7d453501b92ca0395efcfea4b633d46fa4f4492477a0ba4902b3fc3c813a89efa74be17ac8aa078b488a7e348fbe9b48579db1e0164cdd2adc18dcc90da015480d2ab0b4c4d1241ec58096fd861be5bd479ef1246f90bf7da04f61759af11d00189ae5885cfc834a5563fb4bbe8971d2f7e74da956c4b38bb839e5fcf307d31d1758b205f6f42ff480f76694abec71b5cee65aee618a683bf0acea8fce030b651f13f91fff0a829ecae99cf82deab103afd4fcd3cc7154f1f40703a00233374367313ca4c1581dae5deb7403f91cdf5f2aa3bdacbfa93b6bea630760f55965f995febdec524065f971027512cf4f971ad9ac7117dee838ebf3f10da0210b10b862fbe804f08fe68fc730afc176632359a28a262c3edb428a4b9ea07f7c41a5da4042cf201f5eb66e861178fe9db81f75001c67751277b2c26f967ae2aad09f55b82d3a92cef7e115c99b4c9c5f6315b9cf327fa3d2380488ea8d081950e78ab39db3ff91d279304eeb1b954f63bd6801d4fabf41e91ce12fcdd895f21147c89ba0677f1f8200fe9473a3e5ecd74370c6d1734eb49e7d7e4025dcae9028a02e576d6ada379b63d29cf5126380810646d6ab34ef3aa3a42c0b39ed55258fde70c0c8db26b14690a3d8b385461a99866984a715919bdc5e46bd2cfe35a7b8e63d1f73decba9c4a479fa940734da5816916872abfa799b5dc6596aee2e350e5836e8d8892be1d6df5ae1bc959ecabe86f8e2dcc162e2933c317afafd829558e3e2492723cfba3e7c63a926914fbc7171434914bff431cf60aa38b9fd1be4dec30cf19a4a66d2c20a0ef47d2a0efbcb6f8bae81bd38eb3a02339b262c28014e4b112519cf25c2cf3a81d269dc1c465fb36ab7d4cfccc1bbdec4152c2911f6360b8be211e3ebd263eb27f96bf01db1bda2cbc8c19616102a9bccda90598382a8cc91d419e2f9c3e2c03769568c1843ba96c7e1544a9037c52849a1b65991576ba5f6825c7df25315b7e84c94f41d50cf83114157b3322fc6445e3103a5e8939404d1f5f59badcdaae0ea6742f47ff40fa268cc26075616c259b030de7d4337a57b91aa1408b44ab6880022fb8012d8ce171cce14edb703e3ee64ec479088939d59af47ebc82a2002462dc764593345b9ff5fe24b987ebb878bb9846d6aed8c3cfa0fb944b1346acce84f1f087dd3f76bfbff4912619beba646242bc803de3fc99b7cf3a260aa320fd3b914820a6ee179cf7c791809227b9f6bbcb0a4fad121cd949964068486231c14132740ecf6e73bdf76c8757cb7f891ffe67cd481724f1e58ce138cccb03720f9395e4e7f93bf912cfd80ae0213de325500fa0393d4137510efdef1d820b821480f16013b1f11d0123e4a464abcde7490f4010d7cb8c4f85deb114bab28f5c1280bc70e6d208b2504175ee36c9dd8813a2a9d7ff33c7084f143fd6d3b7e9bce1b3c6abf732927c82fe86c617186741afffd54183f151ae5671f2ac0d835c1d044aad954e472336fc2f0ac86036eff8ee31e1d669be804b7e2c0db765c998a193fcf95e0a98a3e4e20a80ebbd0530a3271a3188b0d586a5f851ded326efc74cd9b85db32bf04ab6354cb725346d2d6082828f158352be57f677e4797820ae1210119c0ee9af368e365be1d54631de4f4d385858893b110157b55999ea1450a6fc90ae9332d754d1466406ccc026b44588ec45a8059e552ab17358addefe95a138e2b2729204e2f9fa0a6ad9b2866930a3d290f625b18a4b67dbe1cfc3a07e9deac8a9eca66333f7f7ccf3077a1d116fc69cd960c6426067cca66b6c933abe1cce89ec797d1693cec426234d6447253755badad8f57e8dbfcdbf4a7c6af72c34f36b87896159414333db8ac60514c1b605872415aba978d7fb338b3dbc891e2784d75b0d22857218132c6db7e572fab91fd307479b77b4afcef10d3cb8d18384ba98d336338a014a57b339b7506ce72d7f6488033a36633d19ee8b81c28c85d0e9a9970feb3fb6bc7c0c4d058ef8337702865613e86a25ddb7bbcb777f29ef1fe4fa3a88441d701e7a05ff656fb273af3063fbc7641edfabea2e66d2bfb75e542199aafab74667b1736012379aa498db2d5babd119ffa24e8355875d6022141508269ce8466e6696282162668678276e668618206e634609a36266860863633b466cad3c89964fa0507cb2b57b57699af900e83e830b02e83eb36800e03e81e8cce03e930880e037519b06e03e83280ee01aaae64001a388a3630c605f73598f13533180052689f072b07695e4e100a014c410a1de7d155ff0191422b33e6ee3d28084302844b98b025bcfe344c08121c4222ca537201acb5038aca5a8c59305a554d3aa949d641ed4014089c69c68c5c23b027d7066f034ffdb611bb2748c708cb6803ffe328601c19101e3def015c03500c0fa261cdc6289cad5a897045d5ab4364036aeb6646895adc92afbfdf12a2d60821646f2977d5089b08c8083918169badd1e48ed288a98c182e3dc9c37ba2bc206873708b3e46028a1bedaea182072f2fe99ee97bad64697adad27ca729dd86d6b7c5ee82b6c63cb345b214fcac41b106fb88373811c757cac13c3670a9440335328272ed6de1afd78b73bc1b9ead61431adda861a38886b15c2fee8eaf17e7300fe9e2e2b38e7441797c44fdf1cd88504b27bdfbe8c9e0944ef241360b26a65954d5076f432b89aadee1d1a22a46e9244b433a0ded695b231db434ece39f389b34e61fc9424d86d4e816bde709318e74095247cea174877499ab1e1519b0e052904f70e953255ba89d1d5913c645f40ed74a8573e8d6241434ad26a8b3588bb266d10be00a758c5d3a8bc96c0e7afb3266340c35bfb2d19d5e8674715d7a1ad245c5a5078276b4e3544916aa8c098bd198890956abd54ab2d0afe04255dd7175691b7d2c8ea7711b143fef3ab65bb2ad05d6c153691645358bfe74fb1336a389189d5206092ab711b9e00c9356e152229969ba403f417e8c807e8274692bdd902e2c5d38ca38c069186ae290b0d8dcd1a8228c70e98188aaf96f7e9e64697aa6a5014f3acd67bad396c48d26d3dd7c2789208b3724cb4872c7d8fd2129d91a770db5f4d2e5f568a9c381a4a7f49cc83e92859ec51bcc83d3b109c3217714618433c4522f684251e3e4f00ddf14d1d28479b4eebe34ebf4141b3a47d23ada890da2a49544794f2f52bd1451c517556c55314e9efa4cca557ef2d453883d6d553ed8223a57475f8f7ea7e722364211715057f19388a37a8adb20e29c8e72907da044d455620fe92944224eb3e1282211a7a97e12734eb361a779083151176922e1c1a2e699309c1e921371dae9f46c346136c54da76f1e2d245deae9fb08b2857df867b686882cc6f62104f4f333a4737430f48f7c44c2dc443539174d2b984cd349fe3158452e41b949ec816249c41e2dbe12734e73f11422ca67564749f19a155fd992f7983e93e2abaf6c0d8a0babea9f2e6939a7b5b0ab9f3eb3faa9c56b4ebefa4c8b94b7b82421b13d5a5c14556ded577c463c8aad41b9f815b6a6a78672f1352b6e2f692c4455ff864bdac5dfc56758fc065b93721677c1e23527ff256db5fa69f59cd35af09b872985285a51ecee4a7c0bb17974d047689fd9a23943ac2869a2286917258d85286925dd251992826d0b9942cb3f40cb47144dce997c93728ab2e2e429aa5e21aadae6a89d8e82723a5dd2524eb6c7bba49d78fd1e7e8d093bfde4f4541e75d77b8ac8454f74ef88cd436c9e063a41e923fa24ca99a209a042e4c08d9b9b9b1b1acab6ced01152444963f19eee89675be816159d6c48bac40c3c371ee2a0a03b87b6ed05bd7c550f8e729ff50dfee124260c355bf3b5a250bf348232228da04e64901992659ec54e6dc9326770f6c66ccd9f70903b3f9390ace9138bb95c2cd68f9a393051a91db206fa1a03440d4ba359e2690f1515155ef3f411dd4252f27254ea3056f40152e8a7429434942869df8bd42dfc8b54ee8e7248862684aaba2d6e3f25143da0c2125a488308c4608446dfd2a38e0c54ed690b4ba76872d4acfee920b681348b2640077564a0be99309c9ed389388de5f42c74c3e9f928c551dec23abcc330173839a7b19c88d358d487d73b3e6cd4c226902cfa190f4e309010e972fbe26df09da883bb2700dc85b8f21662eb560cc051c4ee2df24d018a3dac55f55bdc8676127be0f01b44fb16afd9b758dd5a1c224eeb49f11ef00617bfe13634abeadbdbd0724ec3c1b26e5f639da6c5596f5bc3e1f6d6d2d8e3701bdad7a793ed81c35db8b80d6d0580af5e03c057efaf56eec2d2b8f8ca695607c06d685654f573b80dad85a86aab8ad1ba7dad75fbbeb5343d6d6b01780e96c63e00a769f1d66d682cd65958cf390d8773143788bc120011005e4b94b3852276978583d86c82d6d9d94921ca8b2276f724cacb3ef406d1bb3918514f2c176119a7be577771fa1b13665b7c44b9103df18724aaa495682d6e3f7ad785a8eace5a89aacee6a8adeee20f9034179606355bf42b6b43bba4d98fac95e5001fa1f57497b4161f51b6c54bde4254b915c59b3eeb4e4a966ac55f6421aa882b441b44069a2d7acf081f352b8abe113b2572d16cd1ab4439e94b620f95a78839a7a9384ac421e2341544973ee73415cb3064ffb8f41409c9a2a7dd95378512254d852869b27de46044e5ec2cc6402c8835cae6a44d72b86bb368cc647a91af0feac84080f04fb7cc53d58b1ee14daebd5289db1b8d090bb902927726ecfbc320cf80804b3fb24e8c64a10fc58dc662a7f6dd6831d2c5e4f974967d065082da99fe89f531d2c574e93f09a65e466af7ee0ce4a47b9681348bfb64ca726ea61e21c94d870089f5a1ea6ebaa4418079668bb356d559558cd24d9f29dd649af9b8d0d2982dca3e660dc9b223670ba583800f5c4a3fba2ecd8189bad9934da5a03610b7055ec15638ee2b2f9332d479eee30af7ea166ece395f2b34eefc8aebd5dcf6e21642ed958e59e9d90d833bed582912434b10810a0d55a19b7958820494aea8fcb7534a65873d50d699690bfdbfc4077e67934105ddd0c995434b78a1282889a2954b368bcd62cccccc4c29534a69534a245b99bdacd021254c4106778c1575284882177aee182b12628468280d4542288dc5624af041ac0b45ee182b0a1a2a0211452b572c368bc966b159aca5bb25f38bf5158ecd5e88f82b442b2f44cc432c16230d1509195ae2c71111cc1199ae1c4ac21ab84d0946b629d05a4429a5cc4c29a5945246c009aad7ac7ebde8eb4ecfab3320a0144500156d60d002cc28b5400131ac21c81d655015869280062a54a2423724e40815ee288198f012f312d3ddddddccdccdcd4c8db62e0851c3127794411f98c1cc609899999952ca4c29a54d816ad800ea6ea059d14b114c4c119d01010d0d150174e40c779440dd0e983023169bc5641c9bf12c268bcd3a36a3c1b13b8d64b31769d4dd4d149b311ad588c562434a78c2a5760a51c318ee186b0275c95e5e6260625e62829839e6052608e62586ce9798d96b4e6934ca267ed0a01ba32d314a29a52f4141434ac84150509195d88c6730fc97664deecf5a84e9f37b7a30b3170904d3cc331896b1b61733b3805eaf570b7f265bf34053020d2d11844b8138252c01856ee8b301b73dd3c79d3e3f0870276d178b262a6936853aff756077d3377dc3edd4eb430e01c1be912e7dbbc887cf0fd02df248eccc9963ff7414f347b338d02b7de64c3b7f90ba892742908de8b4231bb9ad37aa44aa3839379e473bcb7d6018fe2085ea63c2484e29a97b37d13012db3fb345ef512ba1b8f43381ddc496731f94e3b80a1e09956fd10b3a7dec58bdfeb13f6ca70fc942cf83650db579e85f32a8a69913eaa0ec5c6a0a7ba09265fe233195246ae2b3e59b3e820ea94e700c0808e83cb6773a014078740349968d81a48ba9777a47bac0ee36efe663e67dec1da2efe067cd41bd038acdc34240bd730474e401f54e13cc40e46e6f1e473cf8888fe64927cdce36cfcea6da54d3ce800f435b53da685bdff051b3b6bfaa50e9473ee292d8da9e83ef2881989a9a7aa29ce53054392bb32f09f4da743c23943564c890497f363a29fdc174b63cc3a5434877884bbad09707eafc4887301d424f87748b4a6e2c4954ce32d190d7102af7a321d205c6d57b3777dbe8f7eff594aabccb004fba8cf0a52aaae8277eb310547949fedd470687e49f2a06e9f533a4574b6255277d9ead81af3d3c6d4684ba63c7582872ce6c6d27b26d2c402a25a2ec6380a33af290217209321c71b733916e2192674882c7177abc00086230427bc9abc2453c8489e6587339eb922cdb57562b5a449ba4856d136ac27291666d456e916d7ea3734e21c9b2b1907499dfce479030a6821017612116922ea6e622b40e54ef5d91ab9ab94c7755ed343d638f1ca6759f59a1040f6d032b94e0a175b6a63bc97ab3b5ad5082875662a26459b3b519000788b6bdb3cc335b9e2869349b83afa42618c9b2bdb0118e065c79f0e0c1d3b24fb3eebcf87375f4e56f30e813786c77641e3ce419ae4ab7a8a4156eeec856b8b994877431cdeb0324e4f3339b28a27a3ac31c3c87b86c519b3d8128702b02ad1111c99071c44548171da44bc9a5670d4817eeb4cb6994ca47e78d102dd21c0941336de850b930b553ec8720f59b610fdde43acef670a7016ba5ef25cb3744327e90b00c705608c9424feb40ade9a9211d7c4d8908b5a6a7063ce99ff9ae8a413af8999e1af8ef33252cdc800b3350c1cd0d0db43f30219b006395b48f07087e263c68c1d7901ef66740bea135ed238992b6c3e6723b62b5af038988e865745d7badc4568c6c5dba828f4fb72865a10400a923070d096daa17f36e974fb8f20cf76b9012e0d21046d73e4dd4964fb83b48d36539296521957712ff4c98cab3b5efa57b9e2d59954753fa67559ef5e8733042ed2c0f590eaa420dfa5e3a043e7b23670b024258c9734eb99936eb922cf44395edcaca75c46a73e2eb165c59f8a2ef8b64a19e0b0995c5928590dad117a60b2359e8590881d1e19a5ca6c1ae1054f660dc021a6dc1156700d12cfa17082a0892febda67470e623fdb37c4371587207d24b224e4e8c46b22dd9a227c2a3e110e0d213e1a249b9c30823c08b74e94b553e70efce59dec1f645b2d007d5cdae545836e0d2606408bc156dcc2ce94a6c64deeceb75a927f33ccf93bd288dc9b64db6518e523aa39452ba514a79ee665f1b1160c8cb7574d6aceddeb7b395358b8e32f628f53c4f9451ba5d46a9d7511a6b96ab5994524a69dde810a8d09cac395f332b6bd68b6c7ef672f996bd34aba5fc94534e39bb9729ce64f3b397d953f632632b2b57bf8550db0544bbba6777cf4683dcc491bb744db652cacb9a35cf5bf7ec29bbbbbbaebba57cf7f0296333c9d9d3989497524af9eed90b11918c586c361664326e33e204176d5352972c368bcd3ccff36631592c269bd1199b6ddccadd1e9bbd10c562b1cde8725b11278429ac2e83ddc2f29f37caae5b5dee1cc771dcaa4e98cbe5e2ece6a21b58c2073836c2cc1cc771dcc6fd356b16c7c95e3819f720482fb5d6fa229bc9b8cb662fccb217e66cccd52c598d6e01629b2133d2c412787089e348b04f648f4997cf778544ba675f245136beee4692750bc923914827fdf3441969e3bf623252bf646c5daf16596cb67dab4dd8eb75b76f6147a6e008123b29688902235060043da3502814ca1d5135264c553a0ea595ac0a071fa769df7b948e924635a48bebd2dfc091438710dd3269b3268bacb3a50307ea76a6dedb63bb79df1ec4761bcda21bed1a2cde2843a57da35bd852cf43591bcda23748a2bc5d83fe06f5accc8b4c84699614224284c8a54290cd00820ad5902dba196d561a15793d8ea46013e2a7593d045ddacd39190ae962bae3bce99c282e7d973a67c24ca7ff58b3c534aaaeeb6c6836b4300c69ea43b09aa4e9a1173eb4aa4ed559103c68696c682db29164a19dd3d7c45df78f39f4404be39a2d0a92bc5d33065fab072b0950ad3eac257d1982d5d2986c188a34644844558c302479f8ce961c7cd783b51efc28871491945efa27ace4fd19aa62984ce14d242fb134a64e1cab2a06f8f035f0613d68c187b6ce5627caea85375d55faaba82ad91cb57a90a656d6f85a1aeb6dc9c29285e94111355bfc10a85b7a10f3d9c1478b47dc29e9944e92b0ceb9f4a4cbf7d2bf205a0219a092de279d34eae06edffb87a253f9924e4356053d06ab680a65f899fad0d6f4d4c29b5e037a5dad243755d6e5cf985e5f6d0d89651d06191443ef424199870420a176ce84550f558f629d1b5d97422159e85fa432a5e18b7919308f5cc9c2b2c5ae1eb47c441f293c946969faf0bd3b8c4f07774b76ec63a02b89a4770f24db968db6db390cd4dde8ecd07cda8864a1a76916edeba4a061d2746bbb146a56c77136013a08ffd14896ed1f0f46b5df4574cbe8e1744b4eeb8c1e8ce99b0eee8e17b0b9a49b74b6592b0af5b358ae8e7568a48b097c91dad7072e085a225d960ea35fb23ab84bb22347ba673a49349d9b356b9bf50dc9b26d13e6ddeddee66de723c9b23dfcd7a4731bf7cf72a4730f827ba7764adfb66d2bf10eeb346bdb389eacd3300e4792651cdb45346b6b9c4e4661c4d646dc6d7b1bc13cf4b7b710eab663e3be711bc7711cc73ab2b57ddbb86de3ec585987273443739109976032b345b9b9e69a6baebb6d0f9041b073e1bcaf1442ff8aba48a88b848426ac8f8e848ee6cf0c32814c9fe97374346f7ae614d145338a7963fba8593ca3e099b5929b9c4645ba6c134ba322d91e2a2e692617fb68de348baa106164c41251357f724943114d8ef299929fd89a93971cc5d6f4d44e5ef21a9a9e1aca4f6e4eec10297e72148bb2343d27b686355b969683116af3a47a2a1fbcc94b4c5ef211c5848995b3c4c658499c589de6d1437a28da705d072504955926a2a4f1d1a4d1e68e6e99a5cf23bae5fbfc215db6279aa1e816b9235d60c8cbdb07449f6a504d5ef292059989b6cedb69c2a8a885843c8edbde79deb97796a6a766f292a7f808c24a4e8e72937b9ed789bd8383baeda86850ef8e3af6918e8a0e4aa833070c793b48b2f41720857a6a1e9d386f60f4eda366f56de8a9a5c900ee77ee74cb267b9cee7d3cddc963f27e8f9297dace1fb7df39ddc259b0590c44e8a788b66c41d2455e9889eda393bd399ab0a9d3adfed4399ab0dee956bfd6225448d4d6c9e1a3a6b47ef3f4a6e329519b67005ca81355d446dd3e90ac4aa6e4dee5a53bb3798eeaec6c3f8583ba710ad1441462b6ba03353d3064076a7a363bf6287949c94b7c5cd26acc568b37439c5ec32547f9c94769c404ca89e51f1f499834b5de4d3eca23264e2cefccd60f499458ca3b453420925651c1c7713797e3b81650d49c69225dfa729c0f2347448c8c9e9893a3b81ca5f443405528c0e54ec5ea83eafa4a33e04bb6f4cfca49daba0d7ced3b686bdf67e56cd1128906048eedab0eea76be4bbae448970f48580b912dee56b0c216b61086308cf228077b620bae5c0207742e7311277e88c82568200aa22570c0c7e538ae930213914e481736922c5c034916ce883ab20fe380f392a8422ec747a045b33d2c7c32c8c506ea76157d48bdd7bed3f4505beb1e5a1aef9dad219d3b4df78f7b4de9db6d68345e13de7b277aaf31bd3b028eaac9aaf8dfbb87f6de69e99e487ac7e8d87ae876ef24ab9a5615837b772232389dcc9da72275dd29553d5ad2355bf2ed9a4d4950a2c26ce679a3377b6997ac5b31256a3fd63974a0f3d2eed001f4e6e6e6e6b665c9da3607d03bff358e79240a06f0918b631e3972dbe698d7e15d962cf4ae6ec140df395dd4bac4eda8d9da469710320cb3984c0675aed786029e4c304f66e6e6a67d35d7dc27b7719cecd5cd71739bb2f97ac5baf69afd02c2276cfbe8badeb729699f2800973bb76d7335ed134be2b4c0a54cfbb6d92ce9662ae1c4d1e4965c7adb56c9326bddee490a76531c107541e09cd87e902e1dfb81b5426d2895096eb2514cd8640124cc355b1bb5520125975ddba78d1064e6e44b962901ee27b0a2361f44a11b4249179474d936a1d113b243015a3bb4b614094b91aded128522862a59f5e2a0b9fdf94d0e69344061f2cab5f25a79795e95af15d7ca8aeb357be51503899222f7e209f6c095426e885c063a12e46e373f77e3af391f486e1ff9910212ecbcc008c92bb19719cc0bcc4c4a0fa65f66301b9dc1c85c5b770d1b73ce8a5e8a6062e69c737677cf1e3202970ce625a6bbbbbbebba615e6266bfc4ac34eba5099806a25bba633ac63c0491481074440e548004033e12ed3c9bdb954adc5bcc01a7922ebdd7487a77b3eeee39ca962529654976b7945dea26b1d77577737373777ba8eea6242621a1f2eec83c2ffa6e977d4eb674efde6e5b1bfda641783afaf6b0e58053392b6950f9de6af60f3ae7ecd938cdd2c1a1de177ea644fa2ccb86f49d742fbcf799efa473254b135aee25ee7b2d3c4d0f67694aa38c1b82228d1bb747d795d1ac39fb98adaaff3ec7c33e6e5e743747b2cc791a399fa7cd3937abc3029d2b5b74445600741493552aa0e0b4821a4cc004489c4f26a87d963b2a9046f8fc997491524a299999999999594ac92ca59452ca34240088942c470c4941778e65cf187694e75fdca1004284dcb100e215c0954db8a9125c01a423a87c593382048d82424f07486e51d6b159ec323a76973c2f002762b2192dd9e846c5de50fc959e81ef29e0956189743959b33a2ba56466666639e79cb2a483921da47491dd2577134beec7607f6c5dee9748170963cbdfe16ee20e57863d802aa87cd9415e505285ca2a7a2a98e251f932061293a2fa8492b3965e7d81c751a0a492ec31bd3a8b91519b4144c68cda0c22335028146a464d06911974d2da0c2a238321523b9a01858c231a5040a183484d4886d00c1a42a809ab1141a188a08810e994989303b1179998da904c2da636549bb3d6866298368da95198d7134f3c61c3c80d2180e83863a49c74cea1a11b2e88113a7c40ae5c323a8b3829b074a19d034ee5d3a6134686524a29a594524abbb9b9594629a552e80b2c6328018ef364996741c34aec857906d3ddddddccdc3c99290331d07c8501908e547197574a797ecd62606464c3c83437cbc0740c8c0c8ccc4bcc258391a9492118995ad31addb37bb6140201f540fe6b16032323142303232324536bad3230314231303230322f2e9818999a91904c8cac2613aa734aa11d3578b4e90c7803df8b3e45793a78a0aa9c523d4e18d061033cda63a2821486dbf36a45a17ed922bd47a1c64c837ad4939ee772b95c1e959ef480902133637aa09110ea3c68e472d14e0cdde285943576a7af663bb91f9e30d209254554b73624481e0aaa86e7d9134a10975eb6e649e2b4714305d43bd25cda3a98fd842b2fe726fe10a46e93e3d8c666b15973cd79b3982c1693cde88ccd5e73f69c734e4ee7932b2aa32b12b61d8008957e3cf9502ffd476f6e2eb539bae7d0e1dd2b7598d7811ac29d0f0a728f81e629a909c7bc9d9d4996f9510ab9f4e3ecfee2a071e99d58ad9a8e282297822ad26575cacd3927a5f497d38e75066d33153d2a7776c18ee9c2e82b43b250fa43bab8fa88f6d1405474c03bbb55f0a07611bdc30ab5b3a8222e3dcd81f98f427596b4d1c92afe3e43f2cfd6f4d4944e6255fcdd64556c49482c4d0fb3add18037855db33e0ebf14bce076ef7ce16b3ea15913bef49185545c53b18d510a3ff34923a309f33c2323232323169a05289a3b10cd7b95443489f6606859b3457fba1347955112254dd25eddf2c281f9416e41461295b32f322119c8369d300a9f5c8d5488bee99b39ef337d342ba9542a15843cdf8f419f1f1f203fe310b7718282524182820005a5c40bf04dbd7f7ede3ecdfa61203fcde20bcc9bb238b8713a284876108b3b48e30409f2e99f1735a863efb8fc711ee15ce6e1d13e8ee81fdd82d32d47f466c26c68fcafc5ed6f58a5dc350d7046a5ac6eb038e0605b5c4e3bd6bbb236c58676645d9601565c5a2eb242e6a6f44db7a02c23e0a3379b30037c64ddd43f610778ea579c21206557fc43897dd32cfe0a918fa2a8288ea2597cd4677d0051ce9601441bae9bba4c598f8fba65c5f91c45c39ab62284d1969b78e1843ab2d1e58f5ce4f2d948b7301d6db86ecae539254439ea2931c58e2b37759438c66a577697e29692923a4a14f9ca9428af441147d45978cd2a7121aecea10dff569cfa971247be284789e32fea29e2c837e55f4a84216feadf045762ca65d800150f53a9940a3bcab378f8427ec5514415291bcf5521da5ca983bb2bebcd807560711b58b0b0a08aca9b68c228cf6cb11c5129618b69814c47b1a3e7a5d8b15ed3812eea9acef394b53c47d91175512a576147cf4bd9b15e153ba2ae8aca4d2c96cba5f231a622aa2e8affe92bae228e3657e536a4a4a8b0235f15529ec57211a9b8ea9f0af122ea6486aae2b36e22d439ac370c51a8975047b1232afc6ca6882a4f89361c259fe23274c0e92bec8af137c551dda24a9d7f153da8e49bbba9774ac4005fc5aa44be271576b4b92a9e12c7bbae4ca552a951c776514f71893a8a0a14ea294fa56e7c1cf118d9b9a9a7642a954aa5521f59a9d4c7d84da5521f513775f9d94c892897628aa370d0dc130ac7bca71412a5449e4e9ff5c97a9368c240d92af9891dbd5a62471b2bb79e3bc967738e28138a876ea989bcdae5ac8d95db53a85be43531c2036991ac790443f8a464967982288a209dfb49bacdb9cd59c1c997dd22a48e60c33c5609a99c286daef7710803071f299d8a23cdb52189de0f52a81ee9dcc35872a74a77e4c891355cb6fcd994610f3dd893cafc7842a9d43f51e51d3df6bc273ec946a8724889a1fb4916aa7248892726886215cf8e9268ac17acb5929c6dad84a64486a0c9aa629cbce433272fb135355268a6c4c44a0924a9cde557922da4e7f005e9a5bf9044a384821eb9d47627a9785d5f14d5cd8e3624d1a5f3d3ca348b3f7ad487093ac0854074622b41194894f881124074f0f56cf1051fb9dccca717432a78799949bbb3ce16f3cdf4c08b2254ba62dd13b0592b972f74bdfbbd6451a891355129de2e7a8ae294421441f026d9c9f0e472c250509ac48eac149606e51b756c273fb16fd60f1b9e50c78f7cc4f5bc1bb3085629ea68a2a8e822a0ad08cc035f4aaf424c812244e2d16464909caee2f32b0d431d25c5b9a344d66ccdab103f5b29acec56f7794952c5d1e6d67f131ce94f629fc3fa8f4f4e4e0e43de137b729b7b228ef424252636976eb7c46e45601d483e9b95c4d2667d9aba101447b02483fa92fa9488fa7e243d652e57fa48f3c891fb71253bcadcd277e6816d8ba16e1f5f3159d803677b9098eccc3c728446626fc8f0019286d3eac78ca086074ff292f7d4ea4da6cdd64c2fa9d6f4b1ce234768924632e37d063c897d1f39726713263d9227ce97c21e6232af6dd81523f0c0102efd6cae8be338eeb3e9b948f7bc9b3c99d24d9f1d6d78aef7d0aa4aa592ad8137591a700823d77b781bda6c92fa5249e3248d43078838a6c7a5fe6ce0895e09fcc4b1de8f74e6d249a20e7ac1667120f5018a3aeff26ec375bdb3f7ce8e541c19e87e67d1f513f3f9f7ef1f3f14bb735c47af0cb94a856e110cb72f02b787207967510793c4f136acf72206751e39d2b28d6d2fe936ece5ce9c73496771f49808ae894b52e292789ec50d07cda538e6e55ae2340cef1bd7dddd6deae69a3625913cd0640ac36651d2f9f254fae4994c281aa8269355b15183c65c2e56c76d45cd9a458a7c3c0d7ca7d309d5836c09b271c5ed14b74db7cf491ebcf75bb6743ab613120ec03acc77e2cc01b2091c7c0d2059e63f654b90f10472109ca73e7842e100586f6edb534a4ab2a8a024cbbc65421d69ff9c7aeb934a0fae3f6ea9a8308c7bcfee7a7b72a21daa23786a18a54db04a1717dd8095b34fa580eeca77575a29593acac397a36fae7ce99f14e5a5d1dd86246dcd7b6769e63dab9234d28626df95786aa1c6e64b4c9bafe9ee1db42af9edf3d2aa6270f31cd13741d5577a8d09eb3e3f43ba676b6c4d4fedabf924ed1351cd2a7d964ab3d2614a77951e2b7d86329d4a5e075f55f85a77d24de7eb892af99a9eef35a477afe931d91abdf79a4e25ad2ab435d2e56c81d6d6bcd3d750ab92d6d5acd263b355a205a9aa4ff559550cd2bbcf90de79afa1277dc69bf746d72d752fd92024183eb9e26848a489ba9274187c49f7c42048df8b27d8095736c1073f2edf796f4599b8f360137c1074b9542a1d06df5210a46fef441ddd2b2f24eafcb87ab7d0397b005c6001544daea441a51694d6db245d59adb81d48a64a90c0ebf826c828059de78ac950570e011901080839d83c4fca4dd233338c38f6e747eed4bec47031cc1c73cc31ccfd179818e6b6177e0cb79dcccccc7c3e8acfcd32a8b404f744b3b67b5f897b13697a6a20789aefa6836d559a65aaf534f335e0e9dbaafa24f61eda1ad3e7bdfaf0db7f60a2da2448accab3aa1824243592870f5f5fc3300c1fda21c29358d7e59cb992009ac234599a1e10fc10a0adb9115a1a611113a195734b42d5266b327d35d3c1cb0982e0413b440df3ccf0a6ed1b4b870993651fe691c1e90078fa0e980e9e7e06b42aefe18cc9aa3c9577d0f37a67bb496423b3b5e570539b47ef68d6b6fd8544ed1d1b906c892cd420900d3db5fbd83b8cd8c88847b2f4e4f54defe896fea7854fae3c242aaa593c002ef499f20b893ad6cbcc559c730153a82ba096029573ce39e59c734e39e5374a634e2f398dc9e5ec6ddb58b527bad54c64694a7eb22c74642273c3331473acd3e473c78e365cac3e4311c513978d3014cdeaded9691f35a8253779898f72b8f3843aa1f7a8046d7844412a15a2114000008000c314002028100c06c342d1582ca029829e3e14800f89aa46684c17cac320c8714e1964883144000400000000224d900e182e553f85e58589a4d4a92ca8fea7d3145959a8a15636115673e65b9ce198f7884d49b83388af8e6048f2db548277a03590c2b898e8fc5d838330bea9a7a82aeef2cd72c04f281f8c50030e9fd354c1a52f04540e01a811db5aa010e9010fe3e08c79af6beac2e5c66af93e98059f3d0057944d22e2805c220bf6536f4f6e9d0ff0f1e1c3f0c26e334f9101e8fcbfbff831f8dc897f045f7bf863019385f8cf2b7e18785a0698bd273bd795f973fccd24d5ba753e0167a76f7fa48a8d1ab63a5e3d3f2984899926e3dd14c6961007fae3adb4b0534e744e3c066238eb406bba09c6efa8596ef5384d71956961ae2d46c9db487580907100b3ec65e5767f3a16aa44c6db5436d130fe48e7b584c7253753b9de562e15c53501bbdadc8433a3a0ade4401779bf594e091398c72dc82117817e4c6598d1e3ae2929dc0578f4225305e977aeb6f627fc056a8dac4a5c2618d1ac279ea552a5941714f8048620d405f970613197ff5e6de025638bfdcceb5ceba7fa6e29226897060a04cae1dbb0b7e4b2516de291f00e31ce14583882ac8b1953a5a824683092d5886583deb2d95e83b0d8a033793a20c7b761919f6f8374209379feeaa13e44c6262f565079f401603a2f928ce09606197f06438b1c90c67009335d77f5c6a1223deded015731069563c803493d914a89fef970be454649525868a300b94d84bf47dc8c9c0a254c36e5bee04dcacd5233031a8d77097966b02a543ae3e7d66ae96d92436ac5648723ab3219d94cc1c9e6694632efcfcfcbbf43dd335600463cd54a6cbf377b253a24bf824f2b18f6e7d18921e436ecbf0025cf31c53bbe60771356022eb18b88e3af0c7804430f0d2adb0e2b43e4207184038d98388c1906e633b13955c487f653e0528ffcb19490218e616572db7cc8b599007248a53fdd49f66761a9ea453d4677938d94001407ec0c0524dca168b375c8faf9231200054673b6ae7dc19394809c4c3b49e68d78940f4ea1efabb60deb553eaf9194807545825b41a1ccd1e459197750b76183ebf61b9fa87f112b33bf904750c8617ef69dc63779f96906a06e71cbcf1684f1cd8d9df86d66d56978622db7abc72529d4649187ebf03d531d670c40ceaa2d953d8e13c9ee3e104f53ae4dc610dc2721c233d09f5a1b1810f14a7d07635b6fda4b10ec5e8cbe8af242fff2640872aaba0d04f73d635b9b957abde1f29db30d99998adbf86028f210862519fe5926793525a3919aa7c310865d0258cf3f4db2da751c170ab531b8f32d2c82eab4d9953c2ce63512d0194445981d75ad5e2c070ca833f97e72d87b662660d7ee0cc54ada90326482e086f233dad05c0b5b345a25836c2d154684ba3fe0be51963f4bdfcc7ed2117a4ced6bafebeb8c5e4107e04bd87093e590ed6381fa1a28e6711e037082dfa00516275890e70d6a02060a7251ff57f0e8feb6b16b8ec64fe2994ab870f21f965a91cf3e550af3f4bfa192a2ed61e00e4354959b6f0f41e3fdf3b1d454d1ec4feb503a7df3ea2fe04f6a3402847e09ee500c99ead6eb395b881f079fb08ac139907641c49a5825d376ba9e43245279d4187831fc19940c74640e5a5988271b8a51c5d1907c69f3fba5309e1385486d6989ddef6e9bc96473d4440780c9c0a161e014c5aebb7e1858bd2e7c4b042c35b0fef97d2964c3035db9c7fce3e0484804d77fd3e4c9c9ea580d0f014a565fe6667755df874c0024164e804b330771588d708e8be72ddd1af254f358ca897c85d46ffb8a9fe043249f62425792cf689d915c694ef12140f2beedee97a0664e3c701b038f2a57fffa8939d0b1893807b902e9310f0bb460a57fbdaade9169b8102a589ac53456096d2d732dc3e16bca86e90f9dcac9474db72e4269c1aa7809b9ece49897ff94d8dae2e6934b56a1501639d347a355107ea1bd5a8973761f685311a87f72a08a36782841fbf8777b2aef03ea65e1ac9addbc9e63dfc58120d53184664d4c93be4364f51fbef817bd1ae8cc4c4d24b382d1beca8320a1d0cfac1d5e8f7ce55bf45b9694fd9241971ab17f8ba3d6578dbc9090a45c3e49785aad41c1e5db2a88a29af586df02b9b511abd789aa834e15314870f4ae950d1cbb3048f4aaca24a743e7b7a6341d828620b2dc09d247877328b9d80971646a13f8dcb1c0e60b51129a228a51a779140ec4058d388d17f3e984f53224aa484482e46cc926388c407bb0ac1846c9668044143e4bf4332e966854595882e0cf2b17938bc8f20aa7f7b0a6e3ec7d19db9778178f4d3e648725ff245ad8ed80e9b7de27ada147f57d8f1ef6ad4b694aa84ba634d7225f00b3bbe44b7e7260529a6383558a053c70f13928e4cd56466b15ac5900f097829f6a716e847e7cdbc478d1e8aba2f3c209607d4373e5819965f8e37d4d75f2922350f008b471a5b37da5111851aec5b50b2eab89157e54eba4a59f5532fd12c2fb493ff84791f293525a729916f53e4522800a00c6c194b460d96bedf78e2ee066050af95c77e0a249ef0b435d62546a2e923c94f74fa35430412bb0280906985842b0903a807d8d04437dbd4aa055afe31ddb4a51b19142e2906183c758df76bf1d0a68b8264d78918df6bf42009c3c2120d683b1ac7aa0d1620c96ac7aa0013be8a34f027908f22f8dc3a8f626d38d554c700484baa34e415861de8fb03278c6310f0650ea27e9c3ed917aefb4820a0fc7f27860f8cab7359db682c126f68eefd3282253e312e0bfb1f80e3496eeda73c3e6281ef9f59a3779626e2e3ba4f0fb13d23e57c79562f78b0e4a01f7e43e51ed17257f940bcd8b0835c44b5c35354533d834bd02fc539fc38c67363b136d796cf42d918d910b2e3038a9a650f05722dde3eb26414bb18f1990a431410f9db810cd297a5f47395951e26554b099c0a9a93bfff5c47708065fa2cbe37af2f0f90e3c36eae2cedcef28bd61799cd32e219f377cc03e749a04d34a055c6542fd154e8ca2de8e570a0e40ed3082c7a7b333e9dcb5713b77f11c26135e1687196724d76414dcfd3187df7f85add5eec053e90eb94e8494a4090bcb5cabfb363561a14f49c66081cc607aeed977c02b88a3e901da7b384f922cacbde0ee11255ce2f16b4ad3468a8b5f397c07d0f743f461cd494c341dbc467dc6921f6b0af5eda64f4c1b33cf24cae6a3213e51575a9683e6a6c6bfea0c78264fc7edeb6d646dbd1213475232fa41dfa17f8509c14f855fe6d5bfacb3d6b1163fd5ef7ebd17b73f33862d1d6312fb27df1c122c63e3985a8194aff8e39d58e1797aa658395cc4168e9b9ebc3877fcd4d8a6926ca30732a53f642659956026e6020d98674fdd4f9e2c952fc184c08501b113c4eb02c4e93149f9f29808387d997f30d6ef2b8ed9a1b1e5594f2183ffc72b68260bf96235f885c276c96d09f16c2ea24d737c4a9f9e44e1a98e9cf173257c7a15931577d94eb3bb4fadf9c0af6cd9018beeff4ddab86cc0860fbd8ef702466fbb5348e9c442bbb858bd97251931e9940471091cde119b542fb52f2e009c92afbad61a42fb44e1eaba75331bb84c5cea8fb10028350cefa8ddc929c6b79288c4ccfe96f37c5ac7a6d12f7f7cba4fc4e68da056b4814a3274eac3035a8e73c1df7865eb2622c48552e414efb9fffe19e0df03baabc9172718ada79b6f130f44f755eabd56cb3513de43bc32112133bf3b8835805c002b460cee6c9b1a9b18f31c5c00ea4a80f42ea56a00f3e6cabac83c8902cd2fcdceff849bb428e45c86583905529cc0027db7b6d7fee7dab04f5478c5560d15aca9a34fe42323472f0e20db5bed39cb36175ce6a14c84e7ba01d6d3671e60bb592fe4ae2933219fc7451b04decc37152848706034a3797e1c2dfc2c2a828b48a5fabddf43419cd0004394f2aea70f39b22ecc414c0b3c0923248527fe229e5d97840aa10780abeef3b3053fb476780ead94a09c8816e36a88256e492fb5829115e4f2af40e6fb41b8359cf86a6c1cd4c481a310995ee241ffb99958a2d9ab84a61a7a962b112561398c440b1226744103cf2f3e327b6f6dacf3bc0b408d8ea4f709e91f7f8079fdc8b588cdc38a57efc812b99dcee57e2ee86a8aa7cf7e17444ec19720e5fa6fa7528f82089ac427867011cb22c99c546857247db888558452bbd9a223c341597712a710ee8ddee471aa9abe1254cf03ac10c06de6e6adaeaec1561d507c3836bf0cf2590df6ce0b78c6769156e6ddbb280042363f58b1497b994a6ce200d100227585960ef06e6067c1691b7a20b31f6e627b9b8154a71f5e92b0ac36cba36d344b137c7f8b5647c2aa79807550a905fd1f722b403d887fc47edd7b32a1065d458fd493798f04a32724a8b0b245e14814e0415dab40632dd44bac5221246b10ec2602afd52073d013a93cd469d68dd22356d350e2b60017ff6b0c10b18b0b75613d1f6c3171094b94be51138234d32342f3c0293f4e3fb6cc0c42320b75eeedcb331c80c0505381f044b59533da750535d829be40325943f128fe2d4c961964c2e31c2cd153f480fbb11fe37b087cb3ee1fed396f02f87e4c519198d95ecc2f4d0dcc70afc72a4598975df11167c8430719ab9994889ea1e07bac69d82ea219dd4d4de8d67a63b499cb95da99cb11cefb815747fcf05e173951eba05683449fa2dec5ebe4cfac6b41ed5f933d89c3a7bda3a1b700ab5c1a07dc00d2d4a734935f8156fe1c3578f620f58c20ca7343876bbf34b6fdeb928309fa831b89564dd410b482855610825d506ac04f1de2333b099910e42449c8f8af664d300f4131878e451d2dd8233e9ef84aa916cd8d7f7712a5a3f233c2ac4331bf0fc11440f06869b33e00b355424fd00fbff90d3f08e43081934e2632b737bb74070984903eecd4621dcd19f2e94d319f030b4a1b5703ab88e74cc52744100630418110da978e3ef2d2339a6d664e9f25171e7551c2b1a4484eedc9a186ba656800a44a39d26f5a0fad78f4e699117eb4db6348f861e302f751f30040d2c9fced5c8fb6519dc31ab991060ca78242220d465a2d8217cb1f7a5a2ae4759c3220cabcb80ca870c594be3819098d16c000fb7de95d3cdfbd1595939df3c3fd459ea8495c7f9d9ca9ecd894c884cedb9cc238cd01c19ad7d09c837e8bc1a025ad839d052235a3b9cd4cb0228b1123aea94b18c1299fd9cf60e66ad5e34aaa7d10fb1701e995296be5511cf6ad0849d7667d8c99769cfdde40544744d586988a2c45cc4332d02540453c7c64965a0e1c683005ad53a005f40baf809a16c82ba93f5f0837f823bb2776ca35381c296c44a0f70425be48c61c529a8d6827bc119156901f8cbfefb6b1a303848eaab90977c53fc3a379ff6aa33c54f0c5c1e0b0a72deacaa74a821b5a8be4b492adf94ea82bdabb0ed0a1903dc4fb5eca36a9213d60d1f23d61e7727ca9550e2a7d0a5cfbd2d98d034525b43a840fb8d32de8702e3c80f4e545f4f58dba177f1e0b0cdda42ebfe70167ba68d30a10a58bbf4288490f2c242591ed4fa36f4364682391e11f304c94a239e85861068514472a3640d3d351484fe0719a84f0e0d67a156b5be682c658eb440d7daa43d99abe4a93103ab99783679797ed62484702611fdd9a81d6648100f44144939f3a6f7e29035e6324afe0a2eeb2a7b5047ef326d50bc635db150a099b787de2e76cab0019554164ceb747d7f90fcd2485bb7f9e0646b902815a214a5a0319d9d88469518d6121e87ef3a98290fac4a81a5b5c004ba716509147c5c6e96f58a5290aea51d13a0332aa9574185be4fa07fd7979c759c7c1743f044e2e470007afbf4e10e81bc010cb3fff06af3ee771c47b581fee0b5a05edbfd762fb214a015219a358468b14e9f940d02b633ea36b12515909c785356aa6648e31020b7735615ece73b02bd75fca6ae942d9629c59c43de9436e67662b7bed21ff17ffdc65a8a776b4e9e39fa29ceaa8a8846918718c2999e0a3dc5bc7dbd898b140e667fb604d02335b4e3081de03517d620e3f404daec7efc58892408bfaf3127a02d3492d43deff4f5e9720f87d4d6ff0b2b3288cf1d8ec44b7dbf7be7412372b1f162dac71ed7b60b76061515011fd0a6a0af41ec1c79118577c698a6aa966e8a15067df8aab7d6d73719931a79e5192a07b9c7ab00875e28929288ea26d7d50f5140a8a2314317bef16f30c262ce0b96ece38e37fa5d1a174cc4de252392e746af63feae6424c3bc34f91638d46cbdbe960e7ab0d80b00e6231049531934c8fc26603afa6df8deaafa9c330e73d532117d14e2acc6ccab7348a0cd79f56f7d5192b758cf95c7c17fa6434661ba0d124471f5319a6788ce5ad5fcc8af8fb0743f65ee3c896d431062e4ca6f478f28ad8847e1bf11fa0a6d192a65840de7b4da4b3d0ac3289688b5e1b8d0178f71b2ef19a7773ba8f9fd77ba670b3897b31841a325a6e55d536c1d623be00465a6e005f032243003ca16debdd72b79b10e93c9f8db78db13a0873592e01fd3d4cb3f1e4b5b876928b5e21af51b9808f4b05596048b51ab7d270ae31df5c6420523534c950a6c8da2f7a654ab12e4a46c4d47a531b21ce75a90b7eaa26023d5254874b21c875a785414cfde32cae2df0d64b6f6951615fd456a7a70634b806a4bf4e156a8b5819fcb94c22c949d106a222b94332c99cc918143f6d083e2d85c553c6e66afd0285d65bea3f5ca31f0945719a190dac6011a3d6c8822632b380163b7a33c21dfbde73873a6267549f0b7be35857ac052ab16a24378791aab04a823c5c09f08c54924169ec7300c23433a201421772a1290fe00a49a43d0ea6c3e1411307b11ecc21194b9df1c7bbb9b7e1a7f6a826af6d76ae35ffde2f2f6255bb1c71576d1530c744ba01e3bf5edd13a705f5270392a37ec6567e18cb03e4d1a81cf1318e1c40792710b59df4315d01073c1c3901ea6ff1f50e6ce67eaff148408e02c1cedd1cbd3eccca5e3d2d828cb66cdb18a85658fda0740b77500e3e698212351c1be6f268f526c602608a0b704dee0a17ab6c8b633d88a31a667db276f289b602c7eb01e56cb4d3e65f5f293e69e52b2284c759dd129ff73a28a046a607d6ca110430f0e54d9c69b7d5630b0264e8f9a973348c8e18eb4c6779d886a912ed04d30ebfd62ee09006b39bd0b03b58076311c8ae4280f660e30f7d08206a818fb9b121fc9e78f5318456b7b5a82bb98f4551080938df007abdea52a80e42245ce4112cc66d239fcfc8cdf8a7cd97e69a37cd360044e05bc7a6766cd8109507f5bf22c7955516205344943be7ab60507488cf5a3eef09b76127a0848fe0e9bf867264889f690b6a6c4222585d0c10d0c6284af135c727ce36ca09c35a433276c222ee923081c29938619350d927269e337c4c4920e4b2cb364af6194acdd5ba82f3b8150ec5be781e00405e1f44182d26306aaef06725a1bf0d16bb43932bfcf8e10db02ebb309e351f105ec0859a0df87d2f17489a8c0e4382ce19593cffad00881577130d836b0a3cf14957f92a22780bed73a46152e67f9610417c8ef60a223ca386921ac127545ac2553a21a02b1e0f876808c4298d86264b37a1c3c189a96f87e25dd4f5eb0c349bd51149e29dd5334042053eadede323844f62823ab14253fe7bdcc5b09ee09bd0b6222499ae3997325fc81dcc4a46cc1c91dc8697eacb8e4292f4781c2eb7e3196cabaf3ead29410cdf1d61bd2b5da654bf45ee9917ae47f864fb55a30db29a65c179483c2765683876a30c65ee96221a627b77750969314de2f2ce8f5eab32cc793d5df880771e31dd8b81c09370cbd23c1e2e859a8d0750355e77f2201d1b41d99d3e6b16b579861a93ed66fbe496e7d06472d2fe736f557f8d10319d1bfa933f69fdd385a0c967f58628f24721dffd75af13b4f57f2f5e01eafb7bd62701fa557bfdbe9253f632d7808f8e489e77486995bd9da23affb1f9ce121c8c3d6c9bc096111bf5f499328b11aa070a30dfcb14ae8d831a72f75c9ff6ac7ddbe5007780047387e1d2230307f5ebceeea5d85af17d2228b02786c8c5ff3d3c6eaa40a60f746b7f886f84dda05d10fd640fe0ff573bedbea0d09a5ec36908f02b397a949cdd5ab00429a8cd7cf990b012d3f326850b3a81658f7d85652ac023e49e6b37d90cc407f2a86705d2eb44afb5f5cbd524845f5f939975efcb410a6ed45fb23fa80b475bba83dd5ac48c59fba6b00f3f9710cd557f70f662bf94547ceacb4fac6385e4651345cb44d7f4e872439b1875ed929804940bcc50cefefa7ed1d8f9ce19fbeef96784aa7087438c27badc2e9ce8970c77d614668048e5a5607f1fd3546fd1f7e58a3051b95c38405cfdee28f536072a3d62009503b242b2119ca0d70441d6da104b0adac65f1b12b38b11a5e676ca6e52394c34c31838dbc927e8646c1f04ec6b834412a160e3263f0f5c42cd30fa601440fcba744ca2059cd828a7916540f5c52102025bdfb0dcefb1e84d61835644c556df2e4a880336fd644a934d69ea07fb11db0c9d104fcd02f96ef9ab02feec167e1be8132cd32f76cbe4150d581d92ae04baea88b147d2b3399b2b6b5d650bd80f13361d23d27a54d50d22cdba956dc856b52503d8be0b6147b393fe4644f4c40ec743a2779e709ecb7d98147048d01f557c58ed114b8ec1a4ad64a36b99277c153ff37d6a01c233b3a3f53ac7ea898d510a90bc9e93b2a582f70aee9eedc10a1f321780f55e2436032d1484f76e198a408c47ac9597cfbecb24d5d24db9e14bb4cd104b113386f9b6fee01add5cda1579d002c7b11b566327d3d3826ced64db0c8adc9e229d7b332664c252126e77bb973109cd52f41174b7f67e1ed782622ff81a840e7214890c3707d02ee000672ea1cf9c9d01b41733dbe1d4cc10fc2e6ede5149a1bfe17c64e024364932b0b0a36a1df1856331962e24527386c5027f5a3dd48462418e1bbdf14cb8841e26395ed179b607b625d6e755ffaf7d8f99b8a36e0b7af46e6bea4ca0f2983f49eab688b7cc55c59b0f59fe9f7b7d491198720b5759b4cd2e86d647393da3b08147d14f5fbb36fdfe5a666c8423c265aa09aa59134b5654983d1b15a56de2698b5f7c527d16c8650f525735644e5089e73df7e03bc178d68202491cac29c880e3c554e74cb6a327f316fa7726f18993436d4cfb0776884ac56fa78eb56cc633e24c550c2fdf60cb389eae14651dda77f58c04f40ce9aceb8fbe0f09b699a3f10254f6e86a7cd3aa30160f0a188ac4ef27e935e8944f3eacdb73e83cc2de3834b951fd4c4aa852c61381cb3f536440646135fc73a04384aea4c0c6ffdc27e358402933ccac26f4417197495aea9676f8f8a48e455a3adb9aa7471f5b68f4f50cc899e0d1a8e0a338c3253761236fe9bda9bda4df3879439c1802ec403d89dbf05e27a4d411643cb1893f97b54567d90828660bc3179bfa90e537013659b968b87cee07211b330e138d0a057154970dcb3ad453efc5d3bed0420835401a444632c7d50ba74ea928b579e7483d3e2086d2d44a12b27aa9683eb9c632903f3c6c41e4484136b359b577492c6b269afcc506a5f9410fd708e92a708198ecd2a2fc97a2f234e496671ca1014239523bbfa6fb0006fa1c801ae68df4d952870f172879da16e5be91eca275116fb7b936267584e56a9ab8999ecef10c12bef3e4f24d2aee47757a392ab6682a119f50dc59a6d911b106d421803c9afd8e346aef54f068bebfb21ad4f4c41c91c1f5e33d1f22be3f429d57d666b7843033c7068f2197fcf939d5e683c496ffa7ad0566a0008cb2c62dd3badd050291f7c885da06713d77691ba147831e3570411c7fcc66c152910d36b6147097306c0ce42a4897c4048b37adc2a36297ff9c52c51a9c9066fa247979da761264cd2050680ab924073d571632c8bb7dc08a0be337d0a2ce22f5a8b632bd8b5d1bc0ccbc0b4016920f4db0e529ccf4192fc6433aea758ae2c99ab9682041321731c19856be635e569c305fce05316b6a4a47e776c461604800766a0e19f91cc0fef949af04f69c8a56a0ffbdc8ea6b299a28e10902d686a19f739e4db7c0fb529609dc16be0855598a12fe1b41a7ed1d8539d6936a635035cb09b013a680d0c6f2b5410c475017bfda5bad529743461aed414f81bf97f8b13c160fbc6f612628448e5604a306ea0388520eb640cbcd63375ffdd2b09269eb73636fce8b681cb57024b01fd61918b9fc4c06f3f10876c6c8e1414c1acdf78dfc98ea109b0e1fe34e863da6460bbd8c53472cc3d4837fb7300eaf9cede3569281b2e8cf032e3a2ed3951995862143ef93f7a1d04eb187bb3e6fecd35b03a9a4044f92e29f163142ed0d53f288643a564429a3fbd8a0a5f090fa93e32339146a7fc31a64f12fae24e4c6fc58d17d67dbdd5fb8c0109514f877481f0e8d10e98a18e0e1f90acb7bf98de413c97b461c19dafcc7519f50d173e15b94a1bc22f04239d7ad48c748715ab83c2c664732b3ea880afdbaa93642607a868a0eb3633fc41c07b86efb4f5660cc7a8c8fc19c792b7d5e52453c32e052afc57e8d2cde952c267f43c12b4d3c79186235ba2a7a0d9d26e88d1eb024f608740ac86cee0207423cfaf41398ce4a71f6b5acc758462508d37c20799d1ed3a010865ab27eaea59f51142774eb9b04ba095034a68ec9d48030225de2ecedad229be756af29d6740cc31841c00484f39c9c0e398f6c190a4d0bdde336b77e3fae1a0bd7ba220322a5eafa34ca975b9d66ddb3d86a84ccdcffcb2a84d1d2aadeec34bcd632bb5fbc1443428dd0506e2ed885513244f262751a8374dc26fcf8d9b253b14e304f86c48e14a9c4003122d22fb5216e77bf44aa0c62dc2d8ebabe4eb7ec43e4edb356833e8dcf5aabce1e9d6203ddd8e3a2d9f9dbb4eebe1c9b275fe75895987db92c54c28ccb8f588b65f2afb827c8abe6f8e55debbfb280c1b68d5de113c52b3768381f94b77514d4d794a39dfae81bc1a28bf286586645be53108b74b6fa295b597b738ab06a0fc0bfc505b7580d7dc5e847e2c0cdcdae1c7b141883e8bed520e200c29189db54bcc0271dd5b0ae40cdc7a9c2b7325cf4353b318c3b1bc8fba0b42f86d80ce2ba8603255f64694156184be9261faf04450d3d6a967696f8cd9710cf754b4c74b825f6a42a9ac73ea6d7ec457921de3d1aebb0757a9be750db92b00f5e1891e88f6b6a4c7d29e3af57cd6c0790bccb3469bb009d0374ea31258d4f581be71df76c0c382d3ba98288ad5aff5591d7feb6e55722208f70af0a02a8e1c0b7e63fe59bcdb50521234df93b7ec04de003ef87b4a2567a9d0c04358905a32d02755169ce2ee1785115c1af92cad152913c0b05c192e7e4b3d78c53a14ebd5f6ce0a09220ece28abf2273ef2d0dc5eb7d83acdf2da069c33157f9578302d86b642208e254c81d988af1426482a8191bbc8d6ae4e7a699e440ad967659bc553a352f8c4251e8797ed5c0ef4856f8880d84c7c769b81b082e682ce2c8115840940784f5a1050c2c7beb57cde951feee6c66ac367cc84cd7ac2ccec8480c6e6df9e73352261311133fc8ebb23c09e7fb2c6270ab77dac4782d96108a67ec59ffd32e8939f62d006d24ca8a371475299f377d3652f8ae2bb7397cb5cb78f29893386d8480a086ddeb176be8b67b1532b03085d148a5d5f20bf42aa84d2e24ec455fc33cce8f1f28c86d40a236591b32a7e71b846533a650a28707743f8fa64c5e7fd1356e342fb2993b0afca8a22ee34aca15f5e4f84fb54cd81e57593ad34470aafd5ddef9bc883d21e9a679fe6d2bb03917883b3c3d6d5adfd27087d77c3c803c119c746837da3f233bc8034c71a3ea95345855c3aca315f4deb1be807afa9983340dbead683ff9f7d3dd7f3cc815c74c0a210d2e07804ce9c4c6c46b2e1265ee30b68d6b7df6773f7de3f11f42d7b372621c68265705c741f1142d2b6bedbd58bf8b4ac4b8b4333685653c3758089a6e2a342de63ba7db9fe72315ff754a7ff721c49b6b3f158bcaf1805988dd4bb1116fc6182d823b7366c58b0b843f7f03cf68e931bd491e3b1f38c903b88b6056ad2ff524fb947f9bb2d2f48f5dc0773699e7004757df1b25c25f0692370c94238ce7b9804c66c3a01adcc48852180f1454c3cb846a65b3a1e60dc46bc9641f2ab3bd7ddbfe2902b38eb3cc4329e8832103a427c3173155378bfc7bde9b8eb0bcf2441def5807b91ca8b76257aadadc0b1c58e80ccf5b80a2445f3ac147039a24baef8cded35100e387813a52354fe58831e4224f89363b249e41e35374d59c88280b0e7538c077cf1636dba4234fdcc1eb4722da167ed86e99583cb9ca81cac9ef707823dda5ee9c6552a04420a7203fb68d673f53fe581ddee5bb6bbb3556bfd19fa5a59a0fed65ac6eac54914adf58ddccc0adb8790ba2defc7901f30f9d103d4886a125bc7252976af94d38464b7e5a4f581bdc8e00dde0e6a9112a23ea5158f748c3d4062041265890dfa708c10dc74ca00883a7722a936285bef48713c1636d79284e6d659b3cb5e2be3c85db62f8e5a55e7f158ae345fa1c35471ea1f1549d5c7b3406620a8a6f57b81ead2ff712d0ba1a222fc127e03c924c08075a381ec9569b35173b20696dbc352928b4cb161133cd76415998d0036ac18d729a3849d6b0a2aadadaa0c6327dc7a52f4de3109164147bfe058b17a739c804224c9863ec5cac3c43159f44c1ec4a6c2041fd9e04106ed66307b59b0677af5e310fcc2a4e422d10c5d2a2f23f68d886f043897947eb763576e62c7eb19cdd7a13f3f4d89dc38b91ee775428dd59e75122355822ae1911cc0432f1b9d6b7d2701a2cd4d021bf434007fe0cf0ca1aae1a0c860acc270d9af1c0d57b255697a1683d9418b2938255f3b025eb16bb25f51600396ecf8f8deb4aa4f642adfd0e62451fed213947e1d7a952dd0d7bf21896a758fb4738d311f5fa326bb158a1598b046d33b6336bd9ee16bfa4da5194ada978c2019d1869be930255555df21b6cf05d2b141e4b8691f7d20c5954c5a25f21410c822dd3c6a079cd1b6172934c0707e4ea234d8a46ae9724cd05993b5d453392b14eac94d90d49add399b107b4aedc7b5fb0995097a7a8f5a0384c70ccf5f8f256e832606a39fc13312097dcdd5d1ad5b71f65579ef8d93abc3bc0c7c49dba964ec4626858668a807483a009beac43684ba2edbe2b92b30ee45a2db31af1f1a9328d7d635a4e421ca717acb5c67cde5313cb929368d7104aede24764f4f494edc506a2d654a0529e02fd49d8f2f2addbbcb5967c1294a17ca8d6d08541c34d87322795fa45e9f34d71496d807e1e7ba6e28bb28391c8d924ea8585626d094d8e8ba7a6b5e42d0869f5b63b0811feb9d9a3ee530ef903c8d9669412d7cd83d378c3fb40921c563f03c05b0b6ec93947ba5b0dc0ab6e1a6cab682880005ef3016895275dea3e031f96983ac83e0ef053ff7613f0443ace576be6958f13fe4bd435d09e3927c9ac0f1fee7c1bce2aa2c6fdd7c4d95099a286d4ee91aba45d5f920edc3e990647f9a4558c3aa94bdd970545d63be9e84e0a9d177f2735697f4d2a5c7753e8421f7630f6a26ea18bb2044c6d2ff19cae54e927ec9066c814e9a89a43cb843b961d46987c35e4fc0ec1d46c9093341dd4fd8dcf7766aff52582a1beae30cea7ac32c3db9e1b9d2a75627706dc059dea859caa4221da6749256fc7f060e6846f17a0a10454918a2b1c8dba0f001bc75f760c5f3998911ff092950b8a64181c0c082f205715a24c6e50aa0c7bcf636ffba0321c6360a19894171421f8f1456167ea6375b58454d66d5ffde963dde99827c846df8179eca366268c5b9d482dce779e1040a889a7d96320cb1fd34cbf6d635f0bb699105367365408cba7c529535600add81aa13933f3a8f8d19613cafe869549aaedce6676056742a04ac15daf665d47d24a675682be10f9106ca2fc27678671ac20fcff616b3a73aa9c6f20700da0ce3eabb74687e46d8e7a77c40e2e574a8f1b2ac978c85b67ef0773e82193d26773fc3abbe9efe4f20452ea9a0849d791b7eb4abab1883d576655e2ac26c065cd4d64494d32783dca43e89cfffb7509bce2a2fc382b833de5c895a502fabfc1d976c18b1a3ef61adbcf7fd9ba61475b5dfc864fea5009d6fc554447caa83c9c89a90523430a30fbca64b6723aab45e58eeef2bfae51af39117dec40596ade92a1dc01c5a40d8b99d82d9287c3993c46c64418921245e75ec8f5f1792e39237bcf2f11dc9da7b659d85e35563851537dceb323bd4d59bf5a1b305bf4f1ce38eea0e724a265efa9b5b31f3ecdb37f47aea80301864b25502b6c708c2170f89ef790a79c3a9e97df843f0426d4080539ef5d5ee5de187bc824796a48628d0d9992e7fb9a25634d66ba1f1ba2597b0c6a1a8c3a225d9473988e1f8ea182189f2e82e49c983c086e5b3f8bd1122b06986c616fea7f194d29c37e2ce6f75f4de168418af083491a08498fa2448435432656023218764359d82df2e3ce570ab61d86c0eaf3b7fa68f848e337b79d3b7019878e29cdc7fb22b66f45de9edb48539427f24adeb7dbc8057a5854dfb1fcb79d086fa7b939e4c8ffce09a4148d6a6dfb017d345f82de1f8d40192964b3d42e687e63926276a0b1d53a143d1ae1317c0d8ca4e69712e3c34c319ce45c2efd34c46b3c4f4316c21f66e5fd94ba000cd3594b501fe0471f1d74797a6c37fd6e0c6e9a2f0fef63fc76f0fc4355c269c9347e5b112977eb19ea5a2e976cc9431458ba4040e341f87f2de42e3143798e7a05e878f564a026271117e00c741decae67c140b48c4ec8841a69a1d54d3c07059018cdee036700f01fba4299a367948f953a4bb6407ef53be9a2224913b4b4a4d54923300c25c59fcb18cd6b488f032ef06f7ed627c3d9bb185f8006281d2f3e504ba261a45a2cb5afbe28e48afda0a2bc6e5b4d7c3638ea875fe01afc292ee172d0c0e386b89184bab21e5c4e27affd68a81424b9140440c012ec38516793c523105ca27c0d9d588856352940109ebe2b13392bf388965c2b516f57dec035a898520ed7414db1d3fc425c5eddf574f4d389844b87a9c104012e1ee08a8e114d017edc13de9255736ddb69f023de24087550da540120ed5b3651e777728ade0f814f25a2dd325be2a21ff5e0cd30a3d93d74ca32b697347cb8d945e945a28626395b31f69bc7c0dab07e6b7d38f85ae1c703adcbf494292051d38f80ddc93a8cb968802a6d3f5fbf317f48cfc4e9ab7388fa01649cbc1464bd11527e4115eb2d72a3cda5798ce16686e58f0b2095c6cf4fdb4ebfc566592e426ba65c50058659333f27bc6ae88a7a005cc935e8ff6d204c1be8bc3ee34010e35620b2661e42889cb611f71e629ff747d446c06d36f9f9dd9e0c74ec78e2fbc2a73b43dc1ec1cfe79204ba334041c1788270e72db20bdd94af73f9c3d462527af03e47f77a0a7d6e76207a679e3bf0f68bb29e4c3cdfd3f00b35958795c474a96623e5959c0abe5d2b5e8dc6ec462138eb3e7ae573b0f370f24fa93032ee1ef8a74f0ea16136e7bcbb6ca309b5c01092fda8344a441b7e95a40c19084e33a5d9c57d607df72258a4323672ec9214ba1306812bf71860ca088c823ff667d34a0521f874d42e127bdbc308313896f03baa58934daec9dd402a0f2d8d9e8f599d7e8e70bea3e2b5bdbc5205c543efc1642ce0d9eed950674c4c7da956af342338b43155384734fcf32444939b72b244f82429b987b153a46f85a7d6074216630c5faa37c43eb72c77d8bba1b68c4816f4ab1e93d52567783aa8dea657a48aa8a432f62754ae3713ee978e67a56ab39ad60f66f690059d5d5012e39b4a1d89ca90640274c02cd442a7c1e255d5f4f9085116e3880970a4c332d072f9a1fceb20e8c95c38c4e464054bd54aeb3140b20be498e5f17828770ee877b7c8ac79bb66ff207b4930d594ea395fabcf66b0a732528792df0993415007d62a76aae583616a597d1d5dc5f76d321d5fe1c9214113064928a2f8e5f8b561e5bdd7e5f1600a7af1740b72ac017cafd4e229c67530a0c2dfa8812daec0c6cd9385bfceaf139a978b2ba8279c542d76f649320949d5e207823ca46e5c74d3b4716d4ba24bcd2e453fbdd1ede7b4a975186ac588de6fc2269915c5800c9ba311d1eec2892297934c9417c29f679ec99788451d016980a847c2522e6e20d4bb809fb842f6a090cdd0b3df014d0eccd7faad9bd635852687cde0283587a6ee3fae2964957413ee7a590cbf1da4e01e0ac66f98667e75a1bce60bbd1d6c49769ce6085af284d245c9ee5f6f162c6e7fb8ec3ad71ce20a04d97fab95898e5fed0c97674e518202cc3f8be02e3178bfc7ebe5a2d3d60aacde8de6cc348ee4d0b1aec406a417938597702182c5660598b07b9e56ca3c61d76a2c482ca9878aefb510326ae9ca1411ff25687cf86c56e3d4943c3cc4b7e09ea688dd7bea039cc6cf5d0ef77b135d0a861cc2b5e3f1a9bc7b57325d64ab7f6de0e7008f3fb6bd7daf8e80e7cb8795947b99d049a5c2beee63d8b13ce29c7c4ab9d1278cfc08c31293ba85c0a67658341ae12bf4066f54f367c0906e4fe1bc1193016d74e72177eb0680e8b2d5e5cf1dd96db6642169f96d3351a5c8daa6bd666d5ff705844e1afc63260b2be45d28307a68ef24ef58aedac893361d1a2aa36287d18b2059730d54e867440365e6e1ff6c420bc77b885cc8b7d2a2541ea4fd48688ca7fa18f27dfb03cb7d91546d3cce0a3bb756a5064aeef50cc64952ef0245a3a2101c6332c95f65d805bef3b6645c7d4707be888e6dbd554a5c40c3d97df53bb420d6aab2a1387eb242faceaeacc9f060ef4b319e84dda4eaa8da547d6f985a878301f40e8ee1f64344f5d3230c002e8b45e8ca1f467c4ac49a783da8277d03c27a7f34c5728b1c9adb4800d2bb123f9b38f1bee21ccfb943a39f8fb9ca7b4faf149d7685f7d14a93b412870c6233c2a08f4ce33eb45d94144a8caf8cab28c8d9514eb9ef0a36c4eadc58ca387df13a37860a559cbf6562da6ae132ae63cbe0a70154f2b32be9888369bd8eabf6ef7eded0e3f0e61f5a76e99cd8871c10c113a6f810c5083513d9e65d57ca775b9abb44640b5d09a477235a86e1299f10efb8176549a8d8a4acf15c715fe1e5a4f52f758493dabf743e1d49c9082784101aec0eb44439a0820d1d6dfda45f3f424062e39a881d68c8570fc05bc64b9178722f15fd041bcf23489d41e323ead5686c6e712cd748ef5cdff878f700cc020cda431a1f7b89ae0fc2c6bd71abfca9390ac2b3e82105ddf246118881c2f7998bf063fa6a1ddb4db5e727523924766ca2946a5691e73a57c8f34c8cabda14f1d17fd8c13ee602e5eab54c3c6db532e8062061d861a6a135c357e0cb10c2483d452fc3f8e0d2b04701b80691914c48fd019ec3b2e47960d5264819cc7fe6f101868e9f278280a3cb147ade148b619b615c3538f064e00589257ccc581083aa0218174f15b0f8989dba658cd5a8892f3a890520d2c278ebc2c1130b4ce9145281ecc5238837adcf8f9c9e1000126e5dd6c69e16ce3ab8f13dbf78bbc84fc4aeed3a5d192fedb05ef9f258711374a3c3d3ca1c2b65bf2750bcffa33d61c81d5406fec0a6cc3dce28df6db60c558196015a3b8eb84e3dbde0f0d1c0de780c5cbe0a5bdbe3f614c63fff6e0ff76c353c61d0fd392a4e9b3684644f221a4ae22e79bf36bab23b53e15f572daa69f63cc3517ccca2398398dbd1dc858f31b48ec2dc710f7d5fe431934ae4b1180c16aa05d6915c7c22e905762c2264ec123d14022a1b7d19cb16b368543f274674199252ebb709193fc2978e74f2d2a8f44e5c20fb996976ea442c349bb7ff76b0353071c0a8c4874fca1e5e34b73298f9189ecb0a12794f89b5edd0441f2f5878ba608f97ffa5b55e2eb7644861bb032a6dc77ac3868fe94eb5cacb1affd2a8dfdf3de835c4649752adbf8af261e73e9645c1aba71aacefa801996eba7193d308f5df30740d9d3a0f2465f430133d8cb1d9318e021c83265bcb03da17808b914909cc60397436929c55009461829054a8c336e93931d60da51745d82e44a3fec5e55408d050e4223430f163c610b3e53bb12520366e4cc172befa646cdb14573cebd5c00b4e337f375fc8427c3b3c00f7b7688c2fb8f3e8060f216751b882a39b7a5f7af610324fc62f280b0cc57c1f8a3b887ad0c4439b4c00e467bd904c493055c652d25570a4d702046789ff98f534b3630965bb63cd02cd6373a85a3c3b87ce7596539609ea3f0e90aa55cb990e099d60ef078ce36f7ac05f44c48dea9a6117713426303c0b39c04c7978967101eb0134114e24b5425a7d48aacfc999e8e06fc042ea5e30024a1c369d7b0c64219c50f36fa29b756044227da990abb515e6cb21291e9bd7616b66746bef7df7a2066b254228b9d961761d77b20501eae073b080fa9eb6346fbbbb7bded91b5c583b6d73e0909cb4903892908633721f2426c9295ebf556f62e46a10f6808287be70f88db8941812c9740a87b8543b15446c78a67c9344dc011a59d7c6a7f908ba5732722bc1095d6ffa2a3525f706b027ea6ac6404f8653bb403ab83e17591871e4562702030c45df7f1af860041d04225e7b13122bd40895e652145be8f7b80f45520e48c860424e22f8d6f6de3194a2147b863c5d6c038046b1c753c0a71fd5962d5eade20f337933d4c1a6a9d0473648850b09b7b580a043639a3273bcd480625272c872a0cfbebc66c281a5bdd3b97c1e701c48d7a592f800848114bad237895577489ead069b1ad1d0ac76231bb74e2d579ae5aea3318fdc0ab2d60400eac1cfadbfebc5665782759a99afab1c746cde38b0873675e0c9ed6a242c898bb1083d886e5ffb24521ff1b97ea034ece21f967e8af4726a59a446554e4bbd04327f2e5a3663baae698ddecc9aaf9455972469324cdead00c069c20c179b677bfdc3a09639d9c1e59fdb744e229882c5c86fe70f0e66660c441d14cad12222b0948080329c20142c3a49445a1f851c40b0b858f2bfff262c7ef7d9e9321630526816776bee59fec05f3d34998302e18899c3ae15a1014665e833e0ee317b46323591d7175fc7f361ba34641c105db674c4fa3121f053c1362213c699d01ee84f44de63d8e99355076356f094e0e69f6c631845f1779b1d3ad2131560d8cb5535e3195b9476d0c7d86fc8f6f25a8ef0ec85c4c8cd0417d54f8389c8f99f6faf069875f91dc42a76d13e48c0a55482498ee5b269ee722887a1d93eac114e9cc2e77d5bbfab941d15d2b857e154eda0fb379efd148c13fd5785d89822160639206309c160c811465021ca0897d49166c4571a5ee84bb13ee3ff331de57307c1623bdf8c58edad856e05d26cd72dfc51742af5869d8d7e55a9b8553a6962d1b40ecb3bf3852816e8645570380a1baa95cec25950f0376b92107883263511dea06e81b77d9f11b73839700915c573192eb51f55330e037ed55c86cc2147f9170d3c65420a6511d6dca76b31f8a4631ccbcbc24650a1800dccb188df4ba5fd61d6d0bed48a1f46e3ed2656b46d330bfd2c5d788a9269890bdcc6f1d64cd66974acbe92fb57ca1d61f7b042bfd509b56cd92f45a7d5d63c88fda7a051c4d2bb0fbd2efb587c14efd38572fbf4ef61af576ae0502765b99eb610b6cd3c3e6d4c1d9ab97706ed4889939d5b0c440f7f8dd2f91dafa41a59343310e37397885cc46a266f85f09d0dc92065cd6651916898614d5628178d214141ffb6384e523454d2e76b41c62612a69dbd10599d0b748ff00b11efb891a1c7f783109eb7c097169d111774883c9de1c4627577668499cd0c50c5cd22eb4ce5992c698f40dd2a92317151ee85993328561a80c4a6cfcd4f0ce5f663e9cb2b14cc369f6a8bc6004276f78d1193996581ed04238d44e7b2a6a6b9292d2aa25875058a1a603a812c18e8cbd969548f7f606b800e0313fa467c2fec48d1686dd83ece44b369916da006ddb6d7cb1df4342dfbae500595b3c8526cd0c3a071c02f0f7c3938e2dd4f8a360283a2950d0c4cfab174a7b1f8c12c62593001f467f74b7d5481f6ae6fb485ebfba79046ddfbb37f6c417233191c8f07094cd23b20570c828ee12208f260e92743707e7091a35d73918563e771b2a00307d9b2b81780a1b8e03ec7b8dbbc43c68610985c82c542e04ed0bdcf41b6d50d49f0edf3c55662b7ad8d40a0653d7448c3701a74f0c98337c0bcce70de2854543595e8419774989ec3056abf819588db9aa5a98bf164a50aaf068b51381a857ce25751c7d35045a798cd970b0b2a7f12cca593b550cc311491326242fb13c9fcc7d95bd31fb7ab5c97256fb9416b9a86c69786b264630aa1b29fb52dadc30ef4a4b190f1614e234d36affb4d83b663009656e9e4d07ad4b5b9844d4c290b0f0131d9fc102089152da28db33f379f76884b52e68cf7a5d80a664ac0618912e950decf948fc9c19b48fdc1f5cb49423fe719becc0745de74f0d3f6c0d313e4a5218625cefbfbc6fbc91d3ab9afe5571bc3dc4fce3154a4fc91274d442f9040bec5a790501b4ffa336394cb0c255932f19a7f9cd15f63821be22c9790ace9102beff48d6bd1bcdfbafd381d737d027d0650fa960c61bfb54c82bf50451eeaf36378ef3027dc121e64f2b0a49f79d9ba965c57231f9bed5e0c1486c7d8b3324a0513a6002336338e5a4c5fdee733f6dabb9784db62275454afb15602ab1c57313ff9f00424b9fc5bdb64c4e465ec57016622a74dbac8b981bbfbadddaf8716422ce3b7946a7d7d171daf6d5fb537b8ef5ac05badd0bda9f7734bf3baf98449cb92c9023d1f9e847fb33e2f1c46e9caddfe9c9ef9156c80ef373066b188ea659e8ccd2e52b7c7c7f1c45ad71c0248e00f240d65549678bb050dbcdd22013e86a4c2ae722a244baae86264c826f70d55683c53d75f332c8ebeafae01c5d43467142f9d3e708cd71f2525fa31debc3ba0b2b4d7f659a9d22b80dfbb2502b346a61a4b9356fe713cbff8a25e57109f08cffe821ec2a765e345a8d0ae83a40ab2107dae509be0c50e86668efd2b298d1279e1e8647fc2708f177a6d958113c2c33256e78583cb68cc845dcd2e5787356b4c690e28aa71dd611bd59f77dba7916fdb652b6125c6c99d463cabc08f64388940f5ec169785fc1a7a559f03b904e850bc1003620b38330b1863a1a395fa1b2f9d6e5ea37ee84047cfe7868ab8bb77a3428fa4492f04d44faea4d8eb0ee85938677ed0bf594010b0fb4e7dde6a6cf2168f1f4984568315df93fc4eace758339c8e632d0f46bbad7c7ed1d0946d46f28c8b32f46319d1b4edcf42238b3cb778fc1dc7c9b02e929b12f1a152f6b8d49d4a6b08f53462a79380610a3f3ab07d92d021c598273a6bc6d3e8834682325a4e76cc44b7c12b3a4ee2ef499694e7b0007d72be466cb051df9583dbd29777470b5f2badddb24a4b958a0648d7cf8049781fd564f41ab847458a65d3ffbf49cf4b9a6745a8bba7549a61c9d24d2b920c5d6769f2cd3314197a4ddd45b71e5390aed7d38798b7c4f64a643ec90d0a416fa55ee6d7d0db205d02abf7c240e9e1fee85d70133d96d243f6e86d4accec1a7a18243dd81932e334a294230db10e7a9130278d0641982594867ea8f3305ab59249587a93a15e649fc68e700b3d41fc9ca8ecdda26d5635306ce4b293674e1f3d73e655f8f30ffc197c85c7958160366205f03e2033de51e8b10e562fa2733b8f8295e7910c307f126d0162a44e7f5d941fc0837ab0f59278c60f657410624ab41806b8b8df2d05cf8461017c88e8c5479bdc726e81676d89a1e0876e765afabea5e6de5bb78ff9e0462c6b33ce6a781e968810a6619780a19da7bf6dd500dbd904a5363dba7b046ae184e4d70018f209db5946fa0ab53cc39911683d4619164e4bdea5b2b7e5ce705a93f05f8afaab3e2cc47ac84107ceece91dd5470d11e07a412264112825821e76e57f2ec58286222c77ec6371b7ac808ab98cf5048a65f11249ec0bfb7903095929027db548d68e519f36bb977b46ef18fe9749905645218078eacf52c030be7a87bf908955d56de5f9f7ac7c60ccc29547d66746f7b315269acb0fb53490924b27cb4242e63d723abbd12b656f8fb71749e95edf0e5b21f21f8f083c348a19a30339ffd897ac270dc2aa6d7f338759be85da442fff634d326410b7b28222b4bf7b909eac54539e32bd7f3a46d97536cda9146f907e257cf29624e27420ab5dc4c7b820a3b450a51cee08732ece223898a454d3a4ecebf5cdbae5decad2408c2d7281a5b3bce25455860661568c4f85362821d5740dd9c224bc9bea83dfed8bb774daa57c2ea7bd447178923af2a3c9ff5060d2944f4b9932a7c7d4ca2cc09201f7192fbf960abe540afc0b11f930ecebc50f906433422329e04f37d56f5a85c54237d256aed72e3e408f4cbeaa9ee4ee7a02a6ab630e1fb315de3b313625d9a7c858e71bd4140bd054e3736f1dbba55fff0ac6b8d63ae807f39df6fc5c47321532d2b36355d4c09b41d288b57241a402c776093afd3e40b014ba1f5e42bb9b65035a548cf3e770ecd40d2a22fbcbd9355be8e77968c3f2e6431045d4c9582a7571c9a5dcf3a3bc074b034f07c7864ef44362e4f51cbaba309d888d361de6ab08bd35ed9a872ccbe573e45e6ad24652b9d6d34d3e1cc1fe9dd201fa4b26807f5c46a82f6dc1af15e61e2bc2dad6fa92a9233c482ff412841a8aa4ab46fb6941ad8d487435f74fea944036757b12f37f12d5797c0aa60b38af158fa91d270325b08ea6642226b0db238c3940ae6633936f9f831047951482e0c1b5cef642a1417064e5da858bf3818853d3615adb9b000123681c0a5cf94c5329a64b82aff37317e915e04eb85ea9407c5cbbe17d355eec72d7660e3f6125984efa4efc813571f94ce2834c2eb0a61fa3c3a54cc8c7d37c8888d8c0613e834ea1aa4fd6a884912485a5ff9c4a2aadc33128e391f30cc744ba3adf09cca51dcb484b760f123ae01835f881eee5a8496c0a608ba5bb3d89bd9ca636177d0b5d81c779bf132c254b7b4ef7b1e07d884a3f13b32b01953b5dbc0b47d0219ecebcf6d7a6dcea8a78e29f200422a9884317988033920d08685b3d737309c6bca6cbcd7e48f0a365cb1a68282a34e497289a1a55547f0f01114062c047b854c5c148a9fce746fc9fbabe1426479249825375a2e0fd9351d8c469fd8f45235f22dcc40ec95fe83b1fccfbcfa933451248d4bfa13ae0bdb0ea7ffe19c17f9c535f0e85d608610132818739fd14d44c04ee939f6a411ed7a00f8b3950f4bf0f1e54fa47226b7b7a8e2ef4aad18f53ccc3e8daac338dbb862aac1e921041ef312231789dc0982bb39b304c683d3211aa728b3d06c3c7c131ee647737ab0ff7e68b6ab24362ad3f0ade795eb0a9e1baaec7074fe5828beaece40e845906b1bceb5e9acc6faa8063db5d0caebb9f7223916530b13d991103c67e3082f890e9022565251049365e5d94eb24e64d1824057dc2d5c265b17347f38a94df12c52ac8c225e0b16c4c59a293347400372954c4a1201826e5ec4e3632e801df4da00120f485b47e8f8fa449bed8fb053d4afe39971fe00dfa95a0bcbef587a124f75bfd6220580f9fa0236cf4f0ee1fec40f3424df3e1e7981f1bd065ff7db15fcf7ef8c814702df230f7b300001856ccfc9c65cc8466f3967d44d136a839ac15f36c8be843b8b8c0277e8632085cbcf52b3f27537677ad190c3954364ffce0eb863b1554e906345a1b0065e3fbddd1f531e0a436e587fd68cb8a75ab848bf1ec0c805bb16dcf2a20e303ce633e1e4a96b71a5a5749a02951dbadddc972d9c1a1a1e9dee286529d0e17e5aaf9fd981ef86e5ac90e294404baec4df4b0d1b2197c61feaf312ac676a043203155d8e808f45b84b855a590a2e03924c7eceab168811ec43a18551943c26c66c6ea250119a6e6701b408c711c4bb1d17876ba8f41c812f3965b4fe6316f3d476e3ba6a7b3df9e86e75a3454454b817ab3891eaa2ddead3efc87b09569289d4f745c38a5f3c25a84b9cf7f580ad6647c2d3dbf271243ec445b42f784f89ac2c448cf7d401388290c769e98379afc5205045a9e7e0a52b79dc5e48ed4d2f47954a306d48bd58c15ab0294df1ed02a5798e3a0eb2d097fa282d8406af3ca0a67b8e8dda7554a67aec0bacb57717d779e9c8782bc1d172bbdc17f3d5d1510a91e5e2d42ba8ed09a40acb35979bc255a7ff065c4295b1884a9fcc2a3024070404eade9d60048c5f34908a5570a4d65718033b03a7ffb0c3484a52b7b0543edaf80615767845328b26004d0ccc33b9c22b893750a260a210c7c66956966d0dd8fad4c33612a96f7471ec4473e9bdafc2233d2d6fa0ed30a0390ae01a3138b296ef0cc172f891e3f495dc30bfb47133670a1af16c87808723b2f65a2787a61459c2282ba860e66e20f3c4c6ed5e0bb7542f63876f114be8098ff295eaa8b55b018dacd91cbf681711d38d3a4d0d7b39f5693c13b60fc90a22c9d4cc77b4565f81384ab350e0eeb0d44d931f30b6e6020acc3ab6b12bdf5cd21f3827d7486d15056ac8ac37e6eb797f78ec052743d1f702adbcf6c5135e215e3fd6ff465cdcdcc57f4db63df95eb7fd9e7405957581a73347099f4a1748ca59176207358401c37f3730ecefeb7ac0b8f3fcb73e894730998a48d9120a0f413432446321b2b0fe8c70516cad3e84ff27b0b0b9a323808c0445adea09610d0c5860183397e6e3003328a901059b8e4eea619b92fba9651adb06ddab69105fedefda2295664224aaf2f286f3ef5825be22088f26b262af29a87394c1c9e0208e9c3a2fcf9beaea8903c5ec6455e168a38f7cfc933c2aff4f1af83f349fa2b9dfbaf8572c282367eda8659930cdf79143c072d77062c3015d9ec237680a893757519ec1ca4bcf4dcc2d402b40563a9bd76de5da22d48b2291cae476342b314be57c22e6726692546352964a39db2813eef5f884c86d0da826cd978021deb615c1af6d100287645870137a57d642ae6606bbb96cd6eee85d07136d8267c654935c2bf4a790c810d689f27360e93439fc674fac5817271cc349c589f42e184771cc4370010caf72a45d39549136eae3ca1601903c905af28c3fcd385521a0b68721b43065521f5a88bbc719d63e1e15af6a4302d610d668a3cdfa34d48b25ecbed223b96d07ca2cafd374ea9d85b13dfdbb1683536455202bbbbe472293e3d8c2e154932f1f8b637b8754470d014949dc90a902fcada897df428126790548c7bedd9bf20b80a7cefd62f50854e816fce8ae115dc31c76c084bcdcd95b53a4b5de530759a2efccfd04d020292d3097a1e4e0d5b74d4b3058784f30731c598e0fd4e9f9a800209485977fe734e14d11315a2179780e964402bcba3ee9845299f9d2f8ca54fc05e4f5d51e3ad98c1c2532325fbc4e822e581f70246629162df99932f2f025afb5970e12e7cb4e40f055237fb7e2211f45e640154351c46c60f9d6d30713fb8cad268a29b51a394d4951d661a214989c38a8871ae43ce432f6e3257b841e596d7de40033378fe21fa82049b003d37b47b14a25001eeeac85fbf1541984c4b72e91750710337a34fe8c30104483642ad228e90c1c7b4368607f3ca1215b89e6972683c428654bb93991387d080daac32841b0451eeb453e3413e20b093ddacae786568e0370ba1ca666e00f3bd7c3abeebf33d476b646d3a19c44fcae2190ae7c57d6e91f839139ce4b7b6044f16ac78cf63c7c6b06c8224c18948792992ffdcc40049e151214535602ee550a9b6d42f1978f7e98a9db2d696c6408d475a31dbb9c96e6285079f8b326eeda334558bd39cded5d70804e3a3f03eb30be0bed625d8dac10b4fa1764e8a965e459f84628c9b86d23e29d7d0202be0ea7f9666d6ea8be9213ce807ac9b4af84da1d053e3808b8d854f5f102e6b3ae120deaf5e698a1a83f370ad90be26d832433f2ada7081ffc153ea48847380480a36b823e10cd81ed98b23ba1c71f7401328545ff93883246a39ec4c9ed1b948a99442ae691d2f0b5910efef0efddace9eeebf194de7797c590a157e38658b51b943eb680fe5bb2e045bb89b8a24282bb8fa625c5cfd259cd0cbd419cff4cdeda4cae32270942f7fe44cbb9dd3dd89b0d536149187f3f6b48f51f6622b24e60a71523d71d50f539fbf96222b6f52a9e45b34c12048a1f702a56a00505521a917986137d8eb600a3c4b727ef634461d86e2018ca03b4dbc34b2b5987fb5ca086ba0e0bd47726b07bfb7fe2ecd2c3379f35f0445b1df8eb4a85726d96632a38158591f5d8fa862b76bc6b57c6d332e2da28e297963830dd4719b98552bc3c3590070ab54ce06c29e1fec1052021bb886bfd9ca6bf5c52a273704090762373f86c39c530df466096527997cada040c3071403fb4411bdb6c65ccd5cfa6894d31672f02b5f98d414650c8c3663ed500b9cf55cf47e118e9ee7d3360aa079fd367cbc7fd99574725b39696e7512b20c2d4501a2168504dd100c66249173cb8d4794840359426182a824d1b51e2051df2bf7cb2d323a9fba92d7b5e026868c4e63d7f56f3c8e338ac017c19461c727ad849264f3e3ab91241ab022f17adfc592f87470c40f1cc8bddb43e021f0ecba556544540d143ccc0134312dd96a405dc64201c3ddb17708bc553fbab98212a2cf6109a199fdbe5d65373cbff1bddf2ddb5b5a3d5044ff8391cdfa580a5f88cc763b20fca1dcd07e8cf6b68fe86b7d9e8cfdb03944518535eadc897d7744c2789efe886bb632c2bea695c5ee0a33980658a5eeb0aca2431108d893f1217ba4127a25b1e51a7c45453af0dcc7c291a88ac9c34bd754e6af72972b6aaae918e89bf819bd50481bfa6f6728cf51eef3b876c117067ac50a4079c02340ef613af94e1913b8e4d539a66745bdd6eb7f4ffe658dd8f2e9eb75454d78f2ca6190c23b53e868e995dc0080febd8b12e503020e98be3e25e693f07b9a5bca0dfcd11c3705b907a844c4ab8ceec2a323a03972eba8bfa1f6e110a3266186482393a3ff824deffcc5b5c83dbb55dbbf14d2faf2f9a91aed1cfcfc0b3abd00622d97deec9ad4b9eeff50452a62ff558203cf8c3df03aa09e3423bc6338e66e1b95dd50b24bededaa39040e8abeb055a70c3df28036f5cc43e4fc4306e4f713f1b55a13abf6d94c314ae1bb69d30196c250aba16299c592a7236c01f355539828a6920bee50ab18280dd5596858b1f642ff2efe0f950bf6d70908b40a5ca6e37a70e25285bef46b742f0fb917318aea863ee34ce7839bdd64c3480f9e7960785ae623f7b8a1fd810a6ed3343ae4c3dcdb6706ea07c6951770f25e94a5747d2dfd72eda2b580c3ce62c776f6b6b841ce91f59996758bfe012c513628f70decfdebb8c8e334702191236fe59040a5a16964ff176d864fbf9d47904368c1ea1843745c6e9aea9b073ab920051c0e2daacb43abe36c926741e12b50f2958576773a8f9a204f6e79e3af52c4a93ab015789f70341bc24d4bfce7ddb91704209b1095e0a0734e18ffd62419a1f925b2df16117f337bd6a3bbcb3e447c0235fffaa7d4e503c1bd40698e3c976efb051c4e25b8b72b2535bc8eb2eefd3812a39828b87e2adb7b3230e91b281a69fe3e4485a8cb3a4e6766ae94e1c48cb65711a5defd4bf65c758813272efd741156d62cfa03a8d01e91cc2203ecf2902930fb0cb214ef8cc427be957449f8327452727c2d73f854c3db111dd4cb3e3d3dd97523435ddac6ec95260019e076ca5e1e42a60ba53a58a6c8c8ef4d57a8c68f7a38bbbf835dc25d13d90ba4b74ea2355737dc10dc3ac5ffeab62177b2739a67f254235e94fd2e71b832111922267a7349c790108a9d8db8807a00e59d1011e5fbc3979fb361605b32f79bf04b427a990e0be0576d5759e6b936cbfbd4f3c297a73bf90c6b30e5fc3c76229ccc3f2af002de372717aa4be8a7230084242cecedd181ba4072d0d22f26bc8a334687153c86be4520a5ef06a6e2017fed48b279040b41bdf395b23cfc435816093b1879961de314cba65650e4a88221f57233c13e8e0dde2f02a7e85dc0772c6df71418c19d048a554248964177eb8b13ba83f11a190ea29540ef65920ccfe8196456791d4c7cc9af0eed8b17638b49bab1fb36e2eb65a5fa31c5de195fae051a4ca7c26291d37a7f40284461dc9bd5da48825308b0798718759291c006885a81485790ef4fbad17a134948c465fe8b3deb8e557a20c0d4c0192ca7e9d17f1ba4455d95994a824935284ad3b549b18a63be543dfe1228f87c5a65b3b757715488d64e8505bd2f9081e6e9d47a1073418b44da8fb5be3a07b1cac4ecb6b8d85a23da8b21b9b55b1f75500064eb5f1b74730cdac588823dbd13651158194cf9ab55d32b98fe1f7ec27e2a512120dbca15de26f9b2374d32d12a95ce65010796afd86cc4b83331115e5d46eb7e7778602389fd02d55eb74a60158ecd831c719f9c690716b6c9c7d1ab4a178ff114fecba87a99887d4224b0a473a2786fd26b99085a96dbaca5d38ce2d7ea56cce3ea80e48bf7f6a672c54479d3274f570e4ef0c71e27efddffcb02d6fc4206f3aa46f7d9ba09d0ae84a5515d86536627dc775d526d873852abfa1a90a8713f62d6562929886a3aa9c072db3e11c076a7b52046cc1d278c114303d66e8aa24eed49844aeb7246b170ea5c99782ed6adcb5d50cab51897871b6929ff02a1fdb73f5a85be7eab496218c8e05502ee967db95eeb4828d93df28a996c35d9cbf0b1d1817615fb4e3e19cdd4e918a2cb7007e2babc3a298801bf51b57b818cf7269f16b8df10eb4b921bb0f776fb726c78e6e7c549cefd87f6ad312505a184c7815c9a5565840834d4117d7000904f4ad5365851385494d1bf589e5acd12b76603c9667e1ef092e0fc37c8035cfd01d05f14a31efe39df9228814af7d2b591a34de06dd3d390003cc55adc4126f026cb2e9af2977352d40cf79a996637c732af1c28c2184fb754974973f71e84d6d902883b05b7f4b3e0379c8df8c4d4dcea501a7131945035d3cf571886a497ac41de69ea21ba4ea71ea0508615194bc19add054edf44128c1694868eaea14209aaa2b62b9bce743ad42998bfbeda150ad25524787005f4f9ba12896210d77ec8c0441db24c728ad3257e24f3b76e42f34cf95440989619a10f6fb405babe29211c35304b6797434f195023752b9d5cca46541f7319876a495a5ef3dd562e5e34c7a0942a8ee7f411362c9153cb67fe2f1f5cb4227cbb06f5b054a2039636b3d75ed9268a8294e5382405f6ce2c331c0fe3309801905584cdb91782745be505b940d15744de992a8ee35586c7faa41df9f1326c1c67b636cd06d92bdc014f47a72a374db742b99d35405cf55a390ab03d06275c9f341481404d226985a7610f1b91fb5b730d8343545687000ddeaeb25652153cda362220c5189558fa30e0f78fc840a9605fafc11d33c8572c53d1441b0e54ab67b36be4c4ebc67df56364520da5357b45aa6e871a125994ccac8eb8c2726fd41156c8d10cd68dabd21437fa25626bf46d0ca804e4022776a8d13c944cc63d85add88594377b468b20718caeb93f5666b57a08dcdac270a6d6336bac5ecae20f198792a0003477857c97bec7447533f53bdce847faa4a7ee41aecdb4a4d8a88330a9fff9241145ff70c40955ee214c3e535155c442bf55417f92d2fe0250c407f7a75bfb4b06dc04984aedc7a919679e31f513082fb66af25d8d77ca0ef74404c524080911e081f80a788bf498e5fe620d7bc30afdd115d7bd407f80b24a70e608e2fe12f8f048bde50b5fcea640cd5eed1796d6bccf4b2bf29d3ea23ef01dbfd5e08778127bb77d1404e14c3300b14e5810e7e0272020f07b5d05352c6906da1188af254466f40089b49bfa9b23d572e10ff726a98423ea07d835ab5bd6e3497fd4fd760bc124d783a3ec20b93cdf3ed66a33db0e2c7af7b528c3ce5fd5b14c371eacf114e440ff5f595f9b6fd1e55ed556b6a49af6ab141070c2fdf24e4f662edf7fa89dec93781d0375ac5f03aafd8e9c55208cbb69c6fbb9f240482d0115a71a5c9640ac3f53edfd1bd0596542865a048075c2d95b331a31f77ffa9937179c7ab7bbba343b743973436cade95ff6eb28d197926fbf6d7fd2ba511312b2b2b737e926444a29033209d50ad609dba6bed2093f5e55625bf5d60864b09176abe5d34db99ebb95b3ed453859ac592a3386a2ba79894e157597d86b4ba82997d8d6b4ba1d7510c263d7f2f679154077a87dd3dd55727ad2d68eba4a4c27c925f424a68928fdb67deea45daf99b6a46d4b7a6ffb763fa03b3ce911c860abeb92f09b360a8f69239166a4ba358d547768d22552b537048e48d4587de9e85f3deb4b75acbe545549d525dd2925a9af52b924c15e557a89ec5e9dd33a9b57a75749a9ddf4cdda4daf92b25ebbc9ee942e51d8abdf6b5749ddab5b254ff6a6cb7b24bbb997d84ab37ecfbacdaccdde5c8f64ab45c2b6bd25cf6032047a930e4ff54dba44ed6d3b88e20e1e04733d5532a1eeca1d5ccaa2cc06bf9d0a369b9bdcd69972a99550b676fa6a557ec03e75f1533b1666efaa6c42eadaa91152dd297d02ddf56578ee1255eee04d97a81ed435634b4e265b73e52e92d3b56c22d29e1d3bfd7bcd757397c86eacbeb4f0d3a4b1fa0a6fb469f028bcbf9ccba48dbae90eddce84531f7df4a1c746a29b7b5025526d4e5332f595651fda026bf00a027406c68068ddb64eab7cb1d95b996ea1574833b81ca9972b57700fb884aa4b6da80a4ca51c15d95a7d2141b12564cf3e237049c7ec6c23e2f4cc4ba55f344ddb3452dd95d6089451d5d6111c7d58032e6d9a2d4497740b39c74daed65ae924f24892bcd76ab55a40ffc77b59acf1540e8d73b2209ff596ebf3ce19547b387af57bb2cb52acebc92ed70daa52c09142cee6b64ebb43fa37fbe8a173a8ee669fcf3b2aa16e920be4a8bb699ffbdcfbd6816c63eb266d7c36d621fa2d7d1f5d6a4363a9b9d345e2f37975cf96e714d233a7109d4b708f768eaf5a37eb909edfab832a2b043e342b9f9eb305d975069bfd538799fdf31f2f56769097748f67ce48d9411ee4f7147ae2153b4e44fd60f073ba7f7e7e8efaccf7cea05a53778866ad7bb4eed9e8cc5cbd431cbd433d3d3defe9e9d1582c5d62fbfe74918cf709aa948a4975876876918c0ff29b590fb2acac814f087407390df2212fc083aa2b971f8b60a02e2f4da39f44b02ead8b842621f2225eb619297bfb4433068d95bd7d5e24db4ff7c9272e77ef7c689252071d70b5830e3ae82049c9a7bb00b20948e80ec03be86eea7c3ef7e9dc381e797775397e4e0edeca1ebd0238969f4924e385fc9f5bdf25c5c88f3ca872740800fb4a37800174d1916f9de4c18f3c29e8468e64d20017fa143292490368520423df77c0910b69143cf8916f8d0298220f7ee42804ddc8a7d0bc00b0e048bef7b2aefed45a7db97a5e76db35de740164138602f00e349222f7794f2ec19dcfca25b8b55b904da0dbc772a0319f6ff7f9cccf3eb759fb58006413e82e802e03f0227fa67bac4430219f3c37b7751b0905deae120a8552ca20830c3000faf9c1608379e7e71d224090201a3ca872403eb7edde7b8170f59a4077fecc0faa1a74d9589c7b916ceff9987b94f892665f99a2cde6b26efaf8f8f864a66be282b2917b908fbc481e1f804c77ce746365b02ee388b14bebeb1b79d09b18d1416f72e4c966dd8373f35e2633b3decaac7bc1671ec06b1b9f1d72fcf6f1948aae5a7d01999a2422f2f173f7e812dc5367cfdc3381dce63c77505612f2202b0911c9a5d2dea698b3e79edb4c0a9b0bbbd46d1d83bcc1061b3c755b1b689f7b592c164b9f9b63abf579c78fb9c727933e073a01eecaa4cf0970a0711c47f10e8d638f267daec131d0a4cf83fca7479749bb07534d3d965076cfc73cbed4b67eebd3e5ba8bc5fabc2e17eb2cd69c1f73d9a391eabed7b757bb43accfcfac75267d740841fe730cae81268982fce741fe73eeeb80641aa78252ecb98486cda677d3544e7dd1232983cb6a85c6214308f2211fa28db607f9dc64083f9f9fda68fbcfa70640aec12906a7e5e918dc82276dd6cd5c45d2d263abd5f3d6b5abf512dcb3d5d3eaf9ec41d2bacf67dd07c859f964412ee9fef9964db0419e7399b435b84f2e9336063f3f079291ea0ef27913681fad6b197c6ef00d7ef1cee0ad0cee0d5e823b830d7eba4bfad8e05a1d92c1b50c3e2f920d746d730d0810049541c620d73740b9c2a96794c1e4cbda06c839dc757508eae4c973734ef24195247f39dcb55a6fe1db6ae13b8442dd5eadbe50f7c8930faa28542ab39ee5d2a6a976b669d3c4a6b22cb39eb23a3dd9e7d2cdf3fc52f3d164d6ee10dde3b9f9da064b93b1325ee0b2b6d963176c676767871ebf758fddcfc901abd56a1960b7aec12412f4d65b3bf720effc48deb991bc73569e534806b403ba5b43ad2efbe6daa6bee8eb1ba0f165e7e049c4ce993f736ab06b9b3a0475fa9d86a7af717a7ac611e31f9f9308a5627fe87f00c974a3b0eecbac87b9b4581766d6bf3c37a58242bd27974abba767688eb9c4f6a8438e19751285aa6d74747474ce01c973b45d581f4fe6526993e76c07846cb53e40f7bcf7de3dcfd36a691054cf6de425b05bf7de2799fb5e69b77299277073ebaa73b56365d78ff276e90ce805e35bb9dc608f0fb263469dcc3dda2ed517b569ea8b3eeb52f3d125de3c9fd3fbe4b99d03ae448ee3b883dc579c909b2e0a117972494b6ce7472ec10b3e807c1404c3baa41b7f455efbb2b14da95881d3581f8ebbe6d2508ae9b332334bb367b666cfac8d9197da9197d8839763d0cbef972fa19740077859e40099bb509e73e73983f29c1e1c31a275f9817640f7fcb27b1e54ed1c4bc4daa53aa4e7f4748d05aff225deec0f953aa4c269627574f91a7579962ec7169d9aced1a38b305b007b2e6991c25eda4196d2bcd90078eb1847bb9e1feff94e2e95f6ce39b0eb6e927cd7dfd4171c8eeb58f41a4b6b5fea6b1e75875a7abb43537777a87a3185286d9107065c562fbc981cccddb373d6691a32bbac70dad4217329cd984de9bb9b647e54a954a77788e79c4e4b97d86e7d3cbd4b6aeb3aadfce34bf545e9c6783492a95b1f75724d8354f70f5dd70440003f7fbd5aad1bf429347e1ab90777c091076914827ee41e6814c01405fdc851f0e0463e8500f0356bb0346bd22cada92f20ffe1c18ddc011e68003820481fd167b24b26fb086803f901e4c78fcfab047b9007d556aed8eb95037021417e02f0798704906b99faa20f407efd00f90f5d62fbc7f899cb207b9eebeec47834f72357129a2d4d8a60e4475e64e447741298d6936691911ff9119d64e7d81f7a235a49a8d5d225137a87743e5b93e7269d9692d60130e6d7363e75b7f4acaf1f575d3fc8fec8af631900b902c9af9ffcca354c9a3a64c9748766359ab75b89622a15862088f1f779debd5dc77128d4b6b1ce52a974a9ad5e9e38689dfc9c1ca85e661b8fa42e4ddb9b53888e2e4d1b7f95371e75896dfc957755f63ee710d53d4f97a983c757e5395f5897ddc5075931cf83d9f4d4f7ee613e81eeefd825aa21d0ef9a2eb97fffb2472f084af3f38e33788b0feaf21b3fc87eb96e9ccbee27ef5faefb7e7bda887ba791b2cd69ed136b2f4918ca30381b09dbf4aaad434533dcac43b0ddaa824b25fa4331cea85e493d928d01d39d657508966574ce2607375b9867cc91d993d03c976dec25529645a46c742087313b687183183453c6367e38c28a1bae60420b0c0cc002060b5db0e4604316ed851f54a4d400839c2958ae6091c34c12429001060922d6e851831e6fa8e186161b3417ac182d23588105192e7350e046cc03d4d0e20e177420a28a0d1a1521b4e4c1c7186fb6d461470b6628614394385bb26c218616a51890b0e2cb9739c0f061c61a54948962c40f6f207183c6824f9a15c2b07144112db4a04dc1020e2d7ab85181092951b036591b6c60e932860a52cca049e9018e2d627648210d9827b428bde043176b7831250e0c53685fa8b40104176c1c81455b61043cb471650a137850c94253215c618a3055bc88390386d29627c4dc4066882fb8c0a024c3194e1851051a5b8268438bb2c3136b10f1451a396a76d052d0001b1df690018931e83033d1f041431b3937c480071e4271aa3c11c5183b5840c1a90f286fb04081831c38a60073e20302419029e3839921fa909285cd1c39a420650a20b84c51460f56c098600834fa90b38712181cc0bc70060b2eccd0e3a487111d6584b9c3072e589cb1c58719879629d8ac20e6862e6220420e3839c820c707386caaa4b0020e071f76e8228c14cc3491c70e768481260b9a22b2d8a201727a9072022e54aaa4616a828b34a2a051638f24f01801cd0a6fa420cb0ae2303307083ede9420052d88a1c313593634a298c942052bae9842003af04893470f5178907252811859e4d052a7507a820b1ca83803c51461c890030d6b5c98a18c1c3be0b863022d14c1660a14f47146093b948a2063ca1c708c10a28c1d5b2eb05485092e5b442163ce132c659459d2b2820a6bd4114e61830b17a05823054bd001079b28aeccb0c69531d46429b344c499384e90831c6d686e94c1039626a860b3c51c6c68e9801a4d1881031d38bc51610c140c41c5092c2d60e1410e2e6f9628230c3db0f8e2c5490e6b0f35d0b81113c317626a13130e1632e86843a5071fc064014408c4b8b0c618589c000619e218018f3368a02305375610e70407d66288a5219640e38b2c59ac0011c31848c0d1820e5a8819420935679c6125cd1b5b3e2ab278a20915b804c1c61755a22cb10973a5862b6e18991953a60d1a5cf0228836a4f040c31362ecd0030b347868c307195184704309382ec046172be0028c0c61527062e3023069b0e882c594285658430c183124e1e50b3267f050c51572ba5001c7152f0c514410710ca18611344c21738a5301334a54b185943c84e0e2a48608944843073869ecb074450b07f200c3a58b2b567063821384d8818e1eea28420b1069ccf0420ab038820821f4b8038dc9c60d971eba88b3c70f514c0088384c80858b209e38a384821bc01cf1c514546048e20c3bc496994ed849d3aa1b4c8814b8ace922859936cc50aa018a120001a60b12675871809914f090c7155ee8d0021d72bca4d1868a1136305106c643b7023cc2d020c60446b031d4a68a2a6f98a082cb166498c92245194b2861c79c14c09963ccf046981abed8a3cb162d4a425c49c20926dc60496206333d0041068c153470b8328645b3c567093738f0b0268e1fa0f8801467ac6ca185971f5e10838a4983893774ec7045853bc2f860cb0b4b5aa021f3c60e59ce64e9a28d2a74a8618a9b0b446146156ea861c40b6fde30c08b1c3690a14594388800e30d27ca00a3a50e1fd2e8a205a34d84bc99a558b5006d6b2d5652aa4686016d7ba56dad1d31986199e958ae61505a336bed91286699b6af20f05176362bb167d95157cf64992eadb5d38723303a6a18ad5926d6302cc66635dd62a65a29d67578cbde6559667dc0304a699c8c525a6b7d236f8c52faaed24a8feb4b3cca35c3b00c336392110206ce6a86611966eb186b7595029b5836b36c6aa7ec42c0c0b27934cdbc669165733ecb320db5993291cd071b23af28528488176d23657564190d5d1898c994659305cc846126131e2d667ad999e6f398d8f4c00613128695b0330cc37eca22864dcc075c76593e1a47cd8d6962d8d462939ddd9485bcc165374f26932ec59de9a39712d99c59966559a6b5fa3261221a189e1a1b0a02975869c2768985603776ac3b993424ba6f309930133645ac69b8341dbbc54cc7b013763299a8c944821b031552d8580656904e48a738b20ccb321366321dd34e278b6118663a65a4cc9489f6872c33994ca66c4e712365364a93959cd7eb8d6c6736b399611866adcdaa1af90227a6b5368e1cd9e9348132ef4c63d849cfbce7bf8de6717d59b1be7246336c1fe58d69ccda164e9906f5354f265b5f1ac3943212d46a79f052bd74e13022a8cf7a650cced36a9f7b3b3da866273278842e3019c2b7ed356d648fb7d52411dea7e3126f147684096cbda861b45aa3b0563bfd3d48d912a6898df0f866ce79253ddbc822657bce69b11de697ccffa8d48ccf7a9489b3186c364f227803c2d9816ca669182adb9b4e132b43c7d031096052548fd119ac28619fd24c41806cea26ad9e82ec0c4a7d65154a7d6511d84936c89a90ea3edd6af9e8c7a6435b92176cdfb46185fec75e5553956ef59a4fd7924cb043277d9a48c2d4c35c1e05d937a5e9982ce89827472558a952a584a32678a4ccd903d873698b349bfb38ce76a63c4f9bc574d236597b97d0a48dd95c26ed721ea9d625f4f5873ab02c5bb13ed7602a55a833d68aa652199bf3892130b8a4716c2c0c55e751a99e44a652e7b94a17b99254aa548a6257b344784e4fcff1642521322b097db943aa22da6bdc29a2692e9d4ae992844dafa7fde9d14055cae66ac743a74a97387b88b1bdb27a26e6d5b333a878234d1563b08be4f4f1601e9f3a47731852ba7a18de9581c84ceaf0b474342902f99e3b80e7d728b8cef31e8d029822d7798ec2cec9d7a62f8140dd9383ec4fea3c19c8fea4eeca40f6273c99532b5d16d9a178aa3acd4cea2b5485c73b05a6b6d2b677756e95b33b149e9b57a50a33997a787a31936790a9f35c9fcc64eae4ff9d4ca6bef37c5726531a094d800cf8bbeb3de4319e8ba1cefaba04ead1e52c8377b0d44eeaaed47972ea644e5d954fa85bfc0caaf7aa8759753197495b3ccda90755552eb11d9eaeb4565fa9306f1773779a511fad775154a99e4a5dab43ac6c8e76e1c9f03c571222cf5a69265276ee3a196a5204f23c2f22cfa393c0ac9eb4a3c9f04a42d3fee0b3f44af3e824972643cd44ca15fae54a42a40e75024a80ff9eeb43b13fd89f04a688e73b4f0253449ee749608af2c9bb74129822d7b54e6af21d9d04a668e72e9d5482e6d149d3923ae903fd72a611cb19e753c8a5c597b30d8f06b23fe2a710a96f7f4429efd134cc4a7ba698d49778553e9a6dac98b32abc0c855adba97f87a454a8ecdcc59377b292902b2b09f1642ab4a3a7fd71e9697fa650ea41767b98b99734cc6b97346b652e9336a7512491e994deb2ea0a0d996ffee0b24abd542248d987a2c0e55c6a52879049801245634ca6d7ba51323633dd96b34d102093bdb66d9b4e6d729354026741d566a4207bd34966706980a309671b60064dab70e4194c3777d4e6b6639bb31d9116115847c41ddce2ca0eb2e792166eec2dbe68b1c461ddbc21501a339b5990d5e6cc34b7d92cd33328fb61cd9a50cb0fccda89d51ffb390f14949d8ed2b48e52cae496c8149a6960aa755236761a8595ed79e395849ca8be7a11eb238b8a572909518ddd8b869d6a6aada4ea1dc2e728099b625ec6a91c7e4f65a51d6a5b03bde03bf861f5b5796d4670834ba52f9b62b4bbb8e350f3444f1f54b10ee8952d58b52f560d6d2303950daa51e2363188b1679b18e6ecf928f6ddb34d0c5e2cb0e4a6ca864d2170325583e712186bf6fce4606e2bc8d417c23ddb30d1036acf2528ae6459964d0c2b8fb0899da61246d8ad494fcc56224c8b15c8092cb670ae14d0f8a10a307c702308abf980850b77b06183841a18729062c30a536028d8218e0c730cd1021951685ee4e86ca525c478c30c3971e6a0f1f2238332f08f572582615fac78e39a11420d14377c91840adcd0327b50d306d00a53ecf1e58e20cee021620c5448637e5970f1218a27d4ac6186cdc20318786c4182851a522013471aaf1ff505d4864503a3820b930abbd6333d68c65cb1224c1a7850d17650b3b41141c79a37c24cc126090df3420d139a25f29afdf5c33585d46740062e1fa40a55d7e4605aa0376ac46867c43945b021c312549c814617353c60252d4b2cc96085183bb850a39e5193428786a670c51ba93214a5a60d32494ca1839632260043015390b8c2041b15d0908706241db8c4bbd62007c33a18038b2a68ccb0070e7c685caee822d3630c38691461c40b5570c040ca06e45cf1e1b154870b3b648922840e293803ce2517c89023ca156a74714308fb4bcd1a7744a1c4921946d8a16db9c28913142eba88c209375eb410450d22c23340d308196c5833050b229888636ab9224bb83110450d7358385347115d84300cc3b01a04a88c206e5022410871822cbe6041230709bc2044144518d1041a2e64d1b0581127c38c1873440c2a5832b3c2e93833e70a2abe30d186032a8592142ad2d0828923d23c81c495aac515346c43ee98e34b173918f1c60b42d85f68e06459963911030c14ace1c5882a45645996655996c3ce8e804c698c163d5c5133079a21cc10cab22ccb8eba7d3a9665599665d8b513062ce052ec5880832505ca444d1740e0e0654e1c3ccab4a0051573ac0963c5ccc4e186394cd0c5127994600c31d0d08152c30d1936b868f3854bad500e700494c9c169d75a6b196b9b985ec4c0058725e28041061f342b63a450677c084347993be064710643b345470121cea890879b30dc0853cfcc20850c51dabca0a6ca14704c1b96d05c34fa20f305063de0f011050d5ce2c901b6ebad4d03850f2b38a106172bdc80d16a58e24ae00a36d07842872182a8a2d6336b3cd8828b2a777869428915588d8613e00cb4d147113b80c1c4116ed8252c0628c2ac408b9b2d6ea83643174f8a931fb080f105cb175db43004434d39436b9d706ed818b73122d3d21a65d76a860b27b450011477c4e162036dc840c19c22c810038656021996aa6c1b2323c713667a3033c613530849408c0c57c891e18d20bcc0615287cc296fc05162018b25cc30411e706cd821063e3c252456f0228a2aa250b9e30c18754f3877d44ac2e460ce71636aae7471040d66ac7c112a8136f6a24a64d60f300d43b3b117a943b42a1b5bb2228f8d61981a5e9ec8010c183ae26c11c238700c3c2f93d1fe9081cb715461db1d54c9e0263e1a371c38d3da9422dba6ca719b8034a843ee4dab9bb87314f5c13e71188771188771dcb99b82b6f6ee362bfa1e666b57a956aa4f09579997fa94504fa519b6765097a7a38636930619af3077551eaf92595f40e7b88c2f7ecaf7507c11bea88bbe877a5e2ebcf8a2d555a1a8a7ac541adb1f8cd3242982f8d445d3945069977f6d932e3f78fda8080934a5ae9e6ae0723a1da5734df5f0a3f8d657ac9397bb19bca76967699d88b54e043f71f79be46ad6f33c0fc823f1a72fa76927937c1a4803d5d7d4ce69ba6847bbf4edcfbd96691fe388b1fd99daf5941dedba593b98cbeff5e2f1cd9a76ef81efaee5f283ad7dfe6a57bbdabd2f5f5bd334f9bdd3259984fc3412dac7dc1f70379344dfefc924b7fbdc4a9bee79ff4fd9b9ebf47e3f7ed1cdb48fd4949d264d767777ee9ab2a33fd8f32efdc1ee3e4d7c97cb7b508f40065f7d4cd346e2b136625d3bcae5d54745b6a83d5d1e15d9acd7932b8d35aa9e5dd3656bb552a9542aedded3ee3d95763d4f4747e75ad6d1509ab6699ea671b9a7fb7eea5314eaa77b3afdf4a05aa2bad3e9282f9745b6f799cb0fb6f6f1d3125989c7e4354be40f7509b4e7b1d6d1a5c6d2255e893aa5cb7b0775f9c2ba04dade3f6d53efcf41d6cbdce7e9a677f79ede9f7489faedea55e29df3b48febfa453bf7e9c959ff53787a348fcb27ef5c67d7d5257565fd9decf3e77c9edc53e486e07dde21ef5ed6777d8acf77f45d2ff2f9ce79fe1759f01f3cf3d7f3532cd0d3fe789a2445f8f38b78def33feb69a7f0bc474f3b7df2b43f3a4fcbd54b6477f71b02507d9d9bd9f5fc293bef39bda408aee717b99e75d1ce7bf4ed0ff79ee717f95c673dc54763fbc35deb697f94485284fcbfa8e73c5fc014923225eb69cf7d4acf797411fbc35d69bbf2b4dc3b6d84ba3d2ab251faf48a3f28825222abce109de91a87b4310dbbe974d6570eb298e9d8bb8cba86ba7694a68fba128eba1a856b0ba6dbd66efb76cea68e627d75950e3e789cbda3f2c4f8e3477a17fdb1a9f77942cfe69680c7ddf151b9ec3e4d761a04a5cd75faa8eef520dc7f197f5e0560f0281069e39bae12d4bbeef3fb3cf801a5fd6910f4ec4e93dc8dbe77e7be771a69cf236d30c8e25c76f81ecc25784f8f400683fa1e6ba3fb4f1b8dc747a03eeaf645e9f2a8dbe3eb7572896d151e59e2b3635dae54aa3975283e14c3797c0e8b6178eed4a172081e773f8547cd83c762f8eca7f0a879b0d3657624bbc372a252a14ed54b5477eaa89cd225dd288c5118e36b288c426d014f37f8a98da82689ec9c1bf87997d8cc81f6dbd6e95269cf5c22edf0b312693dd49fb631fec1b7eb40d07e03bf81200882baa45f0e3fcb6ee3dbef46f3ddbff9ef21141024c11be1cf83f8f3feb347dde6f4f68a2bd2aeb747dd3e816e6ba94ef5965c76d04d5358caee128efb367e7592f5ee3a29a3ed1fb7e5f05ec6dfde82a3d9779ca99b974875ac4b13be4f68edf0f8a6cdf33c4fd42028ed107fbbb75d954bf01beba2a9dbb67bc79484ffbe65d355e21d831bb88124084a1b3c168fff7d40698b1a043d1bd4246cfc9284fd05d92d97e04dcfb2fb01ddac7fb9fc1eea11c8e04fb3be6923d6456dd4faf6a00a66a4acfc3452b6597ad61799edd6a70efdd622c767df74d9e9e8e067781cbffa88ef9df3c62cebb6ef5eb6e17ff7c6ecd986ff81bacca877ec71dcb30755a2ba65ce3ba64b2ecbde3defa8cddb36971ddfe9fe8ef57dd524113d3e3dd6256a7346dcb58f5e25f4da35eecb1ebda69dbb98cb6ff1602e49d8a0e7e9b2677bc757615df6f0f0ececb85c24d96ae9e88c238bb55aa954622a70b9808080980035516badb5d65aebb8299d73ad8f037378dca9c097088207418cef812f2f76200b775c97d2e1b8711cc7d1f3eebdb78ed7169b783fb6f7c3e55a9dc5d2aaaf4a71e35197187b2f8cff83a63d79f2448e3944b23bfec67debbaeb7c98e43411e86db7db8e3dd9f8d3b4eec993275d2ebb739d46c248b2c336d975a2e87da9542a3587a6699aa6699a8684618cebebeffab0dd29cf7327ce6a49fbf44d2345e8cedd49b79d33ddc94699d417c6a4c691d38917c7a7760a3ceae0bf7360c6ffb2f710ce1a8cba4b5007c10d6a278f3bc660e6501c3eea2078d455f2ddbb247727ae93a8ab494edf22d73da94fd7bb89d34cea0bdcb615f656ab636d147ab9043552ddab2ffc448522caf354aa772aaf53a9542aefe0bf4ea552792acff33ccf93e39d6eefdfe781dfc1cf0a22be0c82f8b31fa879efce793f992e9177a9132727d3edc00c033593fac276dd9cd7bace8b5adf75f4b4de8bbe7f9a497d4d4f33a92f8c25615f55d08df2c73eddb54f3f75fbd4e99f4ea7d3e926ec9d3d951a8735ecf47aa1aaa503080e4ddb585771abb73eea78c79c9753ff7227be4bbd7b79dff77ddfe67ddbc55c7adeeae0b67a50c5db879b74dee66ddee661fcce6bd26477deea38a557dfb4d1ea60f7da2b3deb8b23478ed51a4715eb2a968aa552a9542c954a7555fade0bc7f77daeeffbbeaeebbaeef57abdeaebb5a6c9eb9372cae613ac5235dcc0929234cd8dd3992cbb463b403d3b8a76d03d3b57afe512696b59f6ea1dc3325176ee5e4e9269d3b912b64997da27dd2a12eda7139d507b9eba8ca21760d76ed2e805d84d99684bb2698cc894c4f4d3eeba8e625ad850ddf12c72fbf7655c7178fc8deef0dbe701efe1768d5e801f7ee3c24cd43dbc9793743ad4587de1138549c2776137eb6b4b6d9bb87dc7acb5d65a6bade50eeeeda66bb2c3469d263d903a78a2492f289336fe0e0f7e6efced1ca841301375f7ba7b1e0e454e14df85198b5d6bc4f8aeeeea0bc17f2b30c49b4aa5527ddff77d1f1b209247c495d2a5e665edbb2bcffaf3dde350fb3e22dbfdcbf6921e481d9f48fc8e2fe6f01cce44e2f1533909d644f8dd5339097ed77d9f77d003e0bf1369f482fb501385ff0ee624a1c62ed1777c3027f98ea4ee6f63ddd5d7fd97bb2375f88938714c259c36ac84b184a3d14b1adb25371dee5f6a3b5e121e3ceeba94260a35476e5b099a86c9f0db5642092590df72b96dfa6824c9ed68dcdbd1b8c9a371dbeeddb6ed76dd15d3d0344dd3344dd3c612f697fac43b19efcea569e3693c8df535029530fe3601643a67d2b40ce371fc5fafcc843554e7e1f12f274c809800551aced852202b043f4d1bc76d478b074550d330fe5fafcfc9ce5d453bde5d4c4270d34662288ee48a35aa5aab954aa552a5543a3a3a3a67b85c40aeefb8f20e90eb3b40f667c2d1a9df13274dd34e502c141b461977f595ce5517c7ae6381da3ec1b5394f83a0f41d979cce411d1004a5edfdb39c87d2017574583adde747d64a756feaa6eebd3775efbd65b458b5f3024c76162eb404ab1b408192059c30d5bae30539dc3ad8ba20c771addbbaa78d5a5c2b951253622a954a89a9542a4ce9300c4f2738dff74e03bf839a565f18ef6e8921b81eed4c1351d7ea769ad9c5266295438cade3c26f195f2c8a7bdbeaf78920f710e4c0f0081f896279b4f1cba3eddd13412e3c1237787c4c1b710fb5d115f391b8bd6371739b2e8fc47d53de4da5baaeebba6d63b1582c31c4a30daa8eb12eb1caf38ec9af56bafc391235511337c69a288a47e26f15073a9d4e279389c9e9644f278ac2ff7eca259009bcb5dd3d263b7be681c77782b593ec405d80ba8a09f1a645721f1c7b6d621d10fe4782df3f8e186b5aa849b0a847f368ef03bff0c398c9ebf58fe3a749f0589724f9dd89eb3b77d2731e7c8ffcb408aeefbcc8a5a7dd29ead14fb6779e271b7f6e26db03315078040404c491ad56abf50688c9ee3ad2b6f028863b40d48913d74ee6b92bf7009122ec9ce7453be72972bd871481e73b2fe2d9b92f3a02a2293001d2a9f88cd7c676b45a939dd997a7a14c9ad3dbc9cbd336397a2985397a71d5d601e4667551f57bd6f885efb2379ed0b3c37bf8d575dd35097ac71bde5407555d93bd799a86f18fef81f78e5e206eb2bd974db04af54d1ba9b6a357f9e9a3d75675ba3c7aedf1f32d96ceeab258ab8bab8b2b71258aa2b81245d1f33851731ce7e6d5a4d3b96689901f5762f750d32cc6761c3defe8f57d5ff7ae7b1dbdb0d73e818ef55301c330284b6dc2eee3532d95f8e925f7dcb95fcd694fd5752af09efbdc49a026ba9ad3a8af53759dd8899f6fa5c430955a855f85ab70b55aadc2d56ab56ab384e8aad1b695a29d850b9d6ed24eed4d1adb00fb2983c9a610fbc4b6d1c5c671e2511ceb2b9db7bad43b9dd4bf107bfa9df794177ad7eb5250ba7f9f6478942ec925e03dd43f5d92a12602f59c42e686b23fd04bd9edfdf3b4d17da88d748eb2765fdbd261ad56dfa752a93a15d7799dca4389222a8bdfbbaeebbaae0b7cbaf1bffa9dfefb30e5f0b679ba54da5f2ea1ec2f7c2aa5c187794e21a02eb1dd7dddc11c64bb7cffe512c97a18538c8fb3b7047b1a11f80fcc26d03ef6577787a7904f6f2294391ba98eb47b03c3b45336af604304aa135bf843a1de5afdd3a509d83e6167abfedd7497a08e35a84150daaa73f77ecf65eeab5cdecf835c787c0ea38e7399b4f10782d2e6fe7d477d40695f0d829e17ea72250aa5bf639c360a0f6aa3d65148b5c49e2645542b3b4a14bf675fd7a5ba4feb50b9bbc75debf0bd54f71d731dfd3acd7a86caaceffbbeef63e369238e6edee93d6fdbb6eddedb7df4eab2ee7bf15ec658055e05de874f79b8c362f8fa6b5422d56cdbee058fb3f5f0e9de12a94eac25dd3a4e59f6e4743abd4ea6fdd170f664634e48c0e81e5a6cdc778ffb32f82d779ef7d15a6badb5d6daf01de8fdfb365017912ddd6de1e7077e1edeca27fbbbe92ad94a6d7f24bea74bd209f9968775510bcaf63ef793ddfd2b43efa0a791b08ddf81da68bc87846def1d367e7a5ed7719cc87522c77198eb448eeb30d76d294ea752a94e8bae3b7dd76958974a5d2e9fec2e7c2b6be0bbcf3ac43b98677d2161985e275d2b93f616b5de75452d8dbd9ec8d9487653caaa1706ce344fc2ce6636b39d31a8d40b99c7f328a91856230100080316002020100a8603a2d1601808921adb031480117d9840644216c863b120487120c3400c641022c6184288318618a30c4d9d00ccd7dd74961c2dde733c0ee8c7e38fb7dd1cd61f6770840f60371d17ff7d9dc08410d419d27c1d4a0f397a79437d4812a66942784d5d6d836c7c00239d552da97ee03fddfe3e90924b0d40f424e9f81b4e9b68cc7263df7642e96a5988a5dc937e159843e17b5a80b82c76fca931871b035af038cfed03377035fa5216bc480f90c64c2a3fc7f9d40c4866dc8392b635efaca49ff123e3ee147d5ba4ca0bdbe543a14354287e7dc27d16a6c60ca2fba155302254a1529070978ef32ff68e40d63760571db99c15f9a724c30fa5f17d909d785e59701f824ed1b2277b49adb0c792b7a154c5f725a4891ea8a50ce1ef0d485e82640f1fcc95b043ce5aa1fa9c07310677d0d53dcc249eecd0b0388fd27ce3aa6b2fdf8fd426e03d5b0b780f8b5263bbbb1e2952bfadac23a7f29269810c74df7389ed230427e0c6b3eea837212a70e5fd47d9f7605522110095155ceda81b06275e3203d62375f696fc259b95ec77db0604f587e747a2e1d663742e49e07ac4a1276a040a8a5e1bdf987ffb83d73e0f53709980e09d1d274a69864619395fb841305038ce2c154ecfcf805745c783f821dca7f593133960fe319177d4d8b764d483744b76fd707af16047a3592dc5ab7083110cae053ee4ba4f89d0aa6123983df7997c4e736223e4c87a3ca76195fce3ae932e6ac435cab86bb4cfd73aa355a0dc9451d260575542b5b4072ec19026f7c64895894a73eb9fecc66975fdb2c31010684c8153ceabdbac7a6608a93c69bbd5f03164c54b3c2ce6aa5f2f6a8a968a0deff5bb9cce0a345587d3eeaabbc609ef07f02f16b00f317a107ce51c613e69a5ad0a77fc74f45020d15f8d26f9ccc65013d251c64bfb5ce13acbf23363a1513e19176d4ea36649f6958119170d050a5daa22ee0da1ec20ada8a4c11759bb9ab8959c95c873e7b3544ea89012bcc4319dc1e3a85c4d49759134fbbc986c309795ee901f15ca1dadb1c7f7f36d802e4f251d148555bc51541a526ac81f1d9773346d8f959343baa73906f4429db4716961e3ab840ed6399f471bb72a6eb7f2bd060ace73730d79b15b8c3911b12121b6a21b8f681cd64ba4d6a683abe4251a1788c1418d58d0165b686c21b2e99df147e3562eb61ef6bbfb7a11c334e9fe55d25e0e529dcdce1426df80c697f9287aaf9ce989473d86f919886bdf0e9a1d9c45e967312d821599076d223fb1caa390fa749adb8c6fbf7c3c75973deb705cd973acda8d139fa241da39421210311647536ce93e3ed66fd6846bf59ff72aa747a2d250619e1ef62a39856a026a404469c22af5239eea7bac12794168a73bf246c99075371a28f9cb9b9a66c6512a664c81d2108b86d044a6362703c96324f6149ca9fb77285d36873eb2f99c0ee0d706f93a1ed062330e4342a04df99021aca59c3c46ad7e2cbd5e1c5f7f485e0f13469e93e219f7c2ca88176116c2f1df988588f39d10887411e4691307eef129cd7b6c1acb14b706ebc6b730bb218127de9a8bb779148a0862d6044bfd29b28f20dc9c9373ca4dcdf76ea6b63a7e5885418cd911d4452763be6ea12f0b53cc728653819f06e3c7fd783dd8648bddd010f9070ab6ed9244acbe12568f1e0d29ed55d9cb871b5d94d4b99de48d4d31841a41a2c7e72395212f922f7a986c2efabe101ffa85ac6dba0c871ffd2822a48f97eaa3b938fb652790104af1a3e801ee9610910fbb42e542e465272a938e77bd40a3fbfa0964719b346085b3515d1aec7bbf7bb47808651d1b195587565432fc78a220daef24d36708d1f0104499a33e222127a2b9f39a37b02320fa3d653ab2580c3d405104f6ec78abb7ac13c0d05eea50abf8d3145c99457e8989672c6defe30d81865a296a28ea641669d490f5bbde3ce6adcbf0422d03aec8632844375a0ef54f811b45a7b3ec1ce4f5b0e8a174755bcffcac3a74258e5da55029e85331f7e9ff1e237d941d57a075304258784aad73f88bce342f7a6e517a05400f851641db5ad162e697515b1426ce6a5b1c3a2681ce39cff838cc5af5f0477c9895a447b2b1fb9f6090add2dc88fddaeb79bb7c5c071a0bdad3426f1e67420236a5bfec61715fdb0d8b09f902bc38cf488f1e37a6b0d6bc3bad78a8219f36e1acb711765e6b47a85d696fd5e261bcec48618b1db3bf992f9f7640da505cdd11b17aa3894b84d4ab508cddd816bcd22b88b105607ab668b1cad7f4bf3a98c4c6b0414b62e9078ca43f5e656c4f30d890c159ef0fcb4f02257fc03473ea9020f88cadf057af4b5a43775fe95f3c83caa4b7a09f70d0269335c2e12f0920faeb1af227a63b3b933c504768699f36c859c56c1c0fa6123f2baa21d3216f5e37decbad1733d2d0be44ae23cc74824a17f0a25da521da630a65c26e16f8a194b65a69c47b9dc1121782ca3d09e6f4cada0ab248c3c560320a2abf7f41092a0367ae7e6515f8b50f7e67cb1c4d72bc4007160ba3e16eb21f34a5a10e3741652c164578d6eefa5327f7e3cb1ef2c59744e06902c440a7861105bebbab5fb96e14b664a6511ad27754b85470f8885f9acb2eb223c3d0c7341cf95489631baaa0af7f9b5bdd671cad0985ef32f8b16bd198ed83ab013b427835a12f7e326702919b5b9bd009838f650a5199c1efa149b70c55d9c947ffe7a7f5300e44fbfd980d12237f8aea3ab9565661ae8ffc1f37ce3f8abcf1ff4fcba21300eee6278a6195e9e94b1ce28c0c87f267d4311ebaabaa179601d1bbfb54658c6519921960f01896d986c6901b94c2ea69c83194319e2c998137054f746630e522217be6e8d8b54d512c21f5e02aef223bb4f3d1f976774f6000044484c5b7833527b8126392949a9056c48f3ae8c827dd03aa72974ecb419025c2d8ebf0cda6674bd16607e14f37c890bb10b144a7de8df1019ebdbc2a6ab38569c0e4d2c21ff8579db0c563e884a9fa3b64748de38e6422896e707fcfb7ab68e8bb08d4c1b865ed6ed3846e98b818d5d32fcb50408796bac3c3e4e8b2490d18a9921f23353c4fce8666ce4720a069b1e93dcb0cf4b8f9bd5dadba2cc383bb8e5bd1eaae80465444fe34901aebaefe6ac0b88d58e537ca0ec3e5f9e068e0f4d298ff078cade354bd0b6890b6fa98aa5c8745eb111ba813e3aa118e080f30962b64adc6177c93b454f0e703ae52b1147ca4ac58dc3192f7009ede00af80be1ba65a70643a4423b73c2a9a41e6291dd0bfae7560cb9b844fdf5bece90483f0057681daef01a465b313f3bacf7361681cfc4e389c506aed25b0d6216f00ba362ba00030a88043578d2165bba21a4db523699e0c0c11eb469177984f7300017624fd6c1a0af6d1dc2a287a90db53b7d33af134fb7eccc9c15891af3bba1cc524839a230e1484b8536cf41e09628d9810a3f2345cbed5080e54ce2db23942636cf428541c7e675df66fa3d9fc3af21035b36760c14cce7e50a6f9e57f1881c1cb99812b9665ee3c81c8c9497382ae2c26f3c8b3cc08203980f45ba9e81aca1da35449187501178a605edafc334876a490dccc5b27661e224e87c891962749b83f63725f71b2200df00c466252dd98f9f8751ba49575aa4c62c0dc42bf03ee32ba9acc54f0231cf025b723cca0b33c937efd5857ee978ab1513aa336741471bf39d557155c974f5035656cb030b974758031b2229ad5684df293b080e7b018aec61fe48bcc42277265ca9d414933c30ef1a988a3a0f1e5a710477189063e42b1f0d4380984110bdcaa026d6bcf67b8d158f8a40db66d3638e5864925b78e3f0f95aab1aa1a2aaea0059af1ece3f4cf2a25f780b25fb9e480ade5659f901048a96393b934d6d02c3d05c2aff22cad66e02c93155c0410a0d56bc5b392677582153c2540a2956fd298e143a5c592476f07e42d6dbe70c012acb49ad816427e2f535b36022e046f93a0e08219dadb521d5ebace50b98b404707664fd538d15d3465be2e52347398d2731c7d2589b13f336512d1dbd842a20c72fd638af29f8ca1083908d675d0cd2475fa80ccd4d5543f7b625bb1e0738831530ea4bff6e0bb6cdfb141054dcb949df37c1751f52957e3d7520e260ea80175e069c66d2c8f004b6227bb8b5be4c9b95924cf30d5bf1d52f6671c7e8c315dbbcb015b4e9e4127e17f02206678a9ef8a4dfc7238db82127bdf6155f005254335e34f897539ae997208e5e51e77d40ca74726730d41759f1cb0427d484935bc405f60340dd60bf021a941390ae2d30e65c902dd9f624836cbf9c9682c47b1bc4856a539790e16a4e8c5f4d6f8eb856e5bf17614afab971e48052bfa41a58e759c05eb40fdd9667eaa77e97e73f3de8749252a3d28335233992f6005c6e58e1224b71446c89ecffe436f7e0884dbdd7e2d0b27b62843d67383149624edcd8bf0dba969d19d825d59b2d0177bbee248039530021e09374a9d3295b4f24afee5d5e72e5cf022ba9461090449939ef317bc4c4fa1911a5bc624d47e7db74e57c6bb14a8b7e26baa31ad1c00fca5aab411cda4460ed648484996298fd0d4420ae229d678ded83661b809e6ac3984537a0766e5aa4936558042853e42bff420f77205a2bb74af9e687d81961e9e3da4488409b10a37058edc1505742675686e37dbeda35d6c68c807316ae3fd1ba1df085dc311ba0ec1662606267d3991b81ebaabb1b9ef1ecb885ca444aaaa6c5426ade579749de0883c2594207e40342584423bc0ab43726f61492e7d04ecac1809f6b48d073b777d654585dd8f1a001835ecf26de4119a938873d1c7c9e0f3a02ed436c901c113c52deb61334fe247e8f31c75b23e248dd3e05d7faa05f5ab4d104b972ea3bec002b8e9dfe39a4143f7aef6aa6694d505e4d071cf43a3e207c0a299ac5e3731d4764fc266073eaad23b05feb4335d51348b212efbc8bc1a1cc0e3a17bf5e0eb84785c7e4ac2a8a7f23f0ebf27823250d28fee4f3ccdb5cb2342b6648bbde83fd2b5b909ac9ed85d0d054ebd9d7dc7b719fb86b59d54acc43084b313ec44f4194a6fee9d4ca37a03d01cce60a157e828830421aea0280221c2075f1c09d0720942cdf124804babd22e41582a069c04dc7f90a7069a9a6f743ec64aa6f33998229f5aec2cc39f9d7b802940e814f2dc9190681ee4a88d224090b87e3859743e341e859c870fed795fbe19469ed06d5fb1d2b81ba4512a3f8836e4eecbddf9cb292855e8d367eae40d8c7f8a36cb0fa413436ccb06f65a647115574832c0d2f26c1faf6f8f1227197a77afeb8337a7100e622eb5b62770671ef2ec91eae994a64ddc672ea8eb85434bef26318a5f8414ff5e58d0f010fe4ede9856f7a274a1204fc2c80f98c81a32b59073f9f5cd3be0e2b5fa0898bc83d286114bfc46c99123ac58c510f2f0dec9959e8c40d08e3c8ec6e29fabedc3e9ac028e7ccd6e3f53dd8003013cac7e8d7bb7a6c8a4f83369261a8869c85249f6293e3aecc3084eb39ac2dfee38b8bae7a3790ac3019f627f1fef8da3b78a6f616e3e8fb6a4fc165ee6e135ed19afb8b7856fd170ba0049c8f0cf7c08863a376600a2257ac1cf16f655e4f315ae44b081d9c2bf03eee6e6c3433e66ea617185aee37e93d45c74493e62f1eb4ef31d5c629dba94eb701b86d56039cc141c89147bde2d9180388d0d28f349817a6a4d449446981282d3ae929def77a147409989a31568a3a58fccd338c87668a0070e27d001fcbd01da7eafe3aca953ecbd4d2ddb737eca739ee09dd592c84859eb8ab49f098c68d4fb559904ba3c5c6560bcb988e84525e24243e7e8ac1e69dd3ea6b75abfcbbf97921b2499ecc4c7f18a546c5097951e15af610e242daf173d7dbc9ea8e55222182117070ff63aa0d55998fb5afd1d1591f30fb77551d892705a578bec615cf31afcee87d7023fd1aeab265efba9bc3baddb0bc633cea20f98938d514ac845daba1c3e1c725d50e563d25affca78dada4deb1b1c096700c376ff911e947cd6fae62f903cca3eeac77c639b9b4cdaa1badf85005edfad49907cd47e1a697c435216a2b0d629760cf0b08f6a41bc6f51708fa1fd5a88e820e21f73863e3ea37da3ffa7660f7747bec689aed1f2f71036fc31ecd221344fae062e31369e2d3610ff1e53eed19ce9db2bb490784a2d1b1af451c6d0cb9f0854e18236548b6984f4708e62b63f0a74291de9ce07c17143132be76d493c949451e395d83f5e7ab9abcf93bc94901b7f24718bd60712a8592afb9d4e181fe88fa03dd28cea0e49cd50608ab9c832a05e31409e958d7837bc57cc9a04a6e007a550844ddf02ced5ff3645d3185690ab4bcfe4d2dca77e355561d0c4e4f0a9bb9ac239790f92b3e72584d594d7a759ac03ffcf6a3123e1b3409934258de81018b42234b6de4237aceb7941e1d1662c2417a3b3e57108c52f547e323e9b26884fbeb3a6f0f172f3cff3480ca54f92cbfb902f68557872f1c07f8d622c68736c94c634a2d43f156da224c352085953b26f50d8c5577a2feaf1f4823585e37049cbf3856ab819088a1b45d8e015dcdbee454f11953e6a558790673e520fc83276e82984c01f4294a75ddfd8a4dc3430b0048696c8b0c07f83e7c84b732b09ee9f53a820f0fb70971e4eef4fe2c38ed1b07ab795771b87c026b0e2ead6dfafbabea75ea76a2360f56360c6c11f9703d94386bcfe4b458c6b056c69f4740d2a9a0356274160211211acca6e22eac27a00ce4bc90df9c106888d836f040273b12e38b7973f5e8fa2277721479c1487824834123322e4d4684c732fa98ece1c4ed89913fb82d6cc19e1e70482d064b68e15896017e69c49f8822689174561019605b4ae7df2947c66269017e651326aab171ad107943ed1108f2e950aae1b46c583ce93123e3ec8cbe0bbd1aeec904efe36187a41d2f0f76b66fca64886646a555bc28f40a40ce1759de854f58afcdb5f978eb0f8837229d89b3bddb82a6b3e28dbb7ef5c6124e2a01c7e1dac97cd1dbc4b0c92bc12c2a5a0fbb503c7146b9cc4e96ff6cf644b5c06f141ff4f3b2873949bcf1d409b879827975490d76ce442a9f0179e35bb4ea887571e83bca7d272d6989cade1e1ed77ebd8ae937c8b42b3928fe88158c771f82e444d021fd1cfbe31ef5ee3ba0b98d3f55c440b478ec70411025bcccb85afb227a028e4c25c16e0793b0d14faadb5b2018a2776bbd3c04120327645a1d1c2c313b8e401b6b147bcd6c3d7e100eb517243b169d2319aa50a58313da9e414ab80ced4ad437b216a851f1a11f212c04e3ef2980da9b9c0ece0558e3819a266d0aae10ba76d86672bca48a8550b313c80aaac523967ac0215eaf5bacd880dd1c9bb220b9a5b76f88f66bd1a17b934a603c5f0fccb6e9303ff9f2d151779eb8a323aac0c1bfbc899249b7add7983e01efa54d8bafe55ceb841f966b953062b288ef05e559f87061cb0c08883fbdb8afeb989baee8950d6cbe3847163c03d2b9cd45066ecd4f890f46448d50570486abad41db581f46e8594e2e08c2b131157ab4cd06747992baa94eb5af6d4e6ae3338cffee40eb4dac262ad43506e35ed6b0e391c016c306b11619ae97eb28e2055b12daa8860fb1f6cd5a117d43c8433b902b8f2b0a13560233001aa89880705b8a0d0a89a528a7720427efb22dd8863b399fc059560bc0d47faf5b34561e0cdfd9b7c5a07c0fb67ac2c87784606afdd001650510afe5d4457ac87569f46e8002ba778b69ba02cff1a5ce5bbcd07a1013a61412d7e87737d85d003a86ea6bb6c732fca2d6dd874882b6cd0ad4b0a33d68686ced151eb942d457c170521c55edefd35a4c27893a0b1200e0b90ea9c0ce97f2c80bca582dde794a81bdcc8fd6ad4741bebb5cef935283355c0698d1ad406c7d5212aa56945751d0ab9d93c0eaf7b0e862a1677870a7dda4d8d4d6ac0b9a0a3283b999e62bfe8c42dff209ccc3667ee68056e101272566aca8c11b0cf5126087b4463b8d0d5253565aee19fe795f17870947799fd086fabe37b0bc50292b2c523eaf7e296883e783ec76c21033f95ee16aa1daa846b7d2044d1b692445f09301620de7b4edbf49201434da889087b7cd526968d16f55875e9ce421eae3fea1712b38a3a08a23bec7083f4c62759c835aa6890a26e71dae3b1fa6d3834dd71ba2de454c0826a8b03d271f16ca455f330cf5b605938c388616a2902de4a7f924c6d6f2515757a5cd362a665c9675979b4d1c39c2988190458cee77e964ddf41ea61e598929cb8ddfbaea8c35055b7ce80ec7c35ad357b0c30b340a775f2dbac0bd3a7c28c703059701172be1c8e17cbd5e5ec8968f724548a8d76fddedc7c7f88c666152ce957e684dd2e9d4f6f2a02363950fd9c86633b96a8e4eeedfb041a43cb40804c2a77e8df958c193e38c193982edec9c987e46f879728eb1630cd84e174292a8f13d0e5600b7fc420f06b28b585e48a651d04d5551669fca5b44ba4fbc980af8dcb911a1fdf4e8cdc4050b6777c69171f8e06536f84470de4770a5bae90e7018a6937fd17d5f1cc6b350406d53558731d3e30613ebd2b03f72a62a8b0455e9aa0e827da8cfaaebc728416c7860678067e3f97346f9539a8ad4408945393d4af016d68336973c5e1b9249d3e8a5f8da19939eb92c75ad82e4ea64fc5a643a797644eb76dcb26f349142f27500af70c3d1a52b3c06bb3f6bd4c5aa380294da4704e80e927efbbf6ef22fa66f06a34e78f7f28ac926f5b399b42b4e2e038ccb9f6e0f7e98a963485c84defc4d9441aa467b337edf4c3b7134c299a24f504815326142306937d8252872633a11e6b4545079a1e3897cdb15a28bbd41bb5af161691016c8dec512b1a7d2621682545191edf29512128eb0af059516496ce7283119f85d5b6ca22e34c0deaea66ed82f1be651434897163412b854ec1896ac89e783d97b678ee8e9471194e2886e5d5cf71b9bc44d72fcb7380ba66fe8889822b011caf89444da08db109fb11e24fee4b00d12149df4e1cddd2e8eca3c54913f5e6d17eaef93ecbd72761ce707ad28f4772b875816efee3d7356c90569312af8f0549e0aa3f8f37b6ea80a3eec61886b960c2d1538e7f6ad4209baa2f7d1e4a933b8c3279021365a6f49e65d75f7477d7681d659069882816b8fb47d52c7b69c57e6f202a1a80556f1f5ea7cf7fdbb8ab216db114496df76731ee1082aca20647641fbc093f3714098038e2c1a8da477244ed85e6b5e6eaafca7bce75a9121398fe9ab9b877d81f4605b8ca56a2614e70c211699ecd7b3ef077a68974e6745d57994b52c24b2ec5784448822009f7ba7792e0986b29fa1e26fdf0e339dcb9e50cb82f1a73edde061884e62ab81a601cb13029d2fcdd3f74fc261b62d7cce99a177dec6e16ec052cc043beebc90ab3927e5b96cc5c2a0026c398c381c9700fe290411bf0d644474bfff3004505163ec49a1d22d0a5ae410166e4576dcbaa14ee08470978beead9816edc75f51cd0c40201287533ec9c5b48370ac29c80556c42c5a352c5dac1b1de1038a9b23b3faee6fb5ee1018037c2b693da72a67552595c4a755a8aa0708e1f22f0c59b5b2acf40a2a7aa1d82c0f95e5429e11ce429f72899d7d0f25e80c4ca50c235ef22f80ef1a04767ab90ca468d55720230bb668b35d89baf8660653eda2a21ccad4d74757ef11ba5f27f6986629671aa00bfafec09d438089af8a05ecd98cb7aefdf6bab5dd5d1747fc9246b3e4a49675323e5195ab1618155d427e9115ceb87ffe0d37b1218ef7a57db2bef60faa9a6afa82dbcf4bc347ef414e8229ff44d55b64a9658b8b70c045bc1954a8249daf0dd8674f2c400d60d5e4ad24757d32524eb47920842b577c23ffc308b72051d8ed9858de10b5de260785034007c3ae8e1f19852d3a1ea1b518332621401c410142129378f84ba0dd91245fbd60d5741f5eb1c77d5ddc591fe4673d72d2c9a1ada4ae81040e94330fe9a5494a2c8810aacd9fcf5fa73487e2f34a2efcd8897e9f46087a0b15b33a294b388405344a461b29a78a4acdbc7c34cb6e6ea78cf2617e4d218f420980bd7670a7455d72ed5b8657c4adda078cb8230f9043f2f6a8df82fe5b61fe1b2d66a4b8b0417a8e56619bbecc53e61aa0fbb94b9ac46f26ab0006e6400f0602e8a0fab15eb5ac63ae6a4d7d0158edbf95650571d1ab82dcc9d41d2eaa00cd024d053f5afcf16541be4255bda11536320694e5873a42571f0723732208f6a436a7c8daf67f534c1316c24ece55717813ad4e711deaa8a516fb65a50c2b8c49df32c2513a0d006035ab6f21090b4ea39767476580d0b91c1e870a44c9daaf06ec26393006a1b13e30b1f0722016fce40f95f38665a8b96f57360e23f14b5752ce5fc1ff905dc49a4b8370a54e9b99fe2c7860353af6f173df050346730edff2c35d99c03feb3fcbc01cdf556c00426add00e1ce14c6dba6a695f335d53c24e48cae4324227639f9526ffd59f2a28040e9de0b6663685ff75495e56909334a82545b81a49e9e2c238d71842223c0515e97c1854f76a7254d64e068b0a3d62b3238c12c479526142d6e6ff24065f3355b493465a6891528185cbe23a38d39a54e48cb5507eaa96624b4573a4ffa4a1fac89104ff80b244db877272b419670090f1bd02d86efb422ffa128b84e155562bbf3ddf2f784f50e1aa7db83e3d395f2b57a9861a1b0fd8a9bb91cc93d0f857068d5090f9664e406f5f1ce2ee68d4c53caf1b03dd052a3ddd2ae6c826f06b4bc34a79ae61bb0fb7cbd3e6126faaaae19f18b55567634868b55b4ede3aa9efc0c9092ddc003cd9e1981d86e9b42527dd61c1262829863d3bb736862c66bf64619521f1299e7dde43a2aeb49cf9c3607de0bf89642a27e9aec9086b156e80e137f8a683dfe3b28816f9e9784e2c739edf5f058216d42112fdc215601c716dfa5ee0ecc18008d5fc6fc0190565525c671a60bb67e99a0865683832a42983ec93a8521614233d0d58ca54688c591baaa4c98e5c2b977c430143190aab522c62f46750ff5af06eb92bfad407bc39f0dc1df743ac82b5c13f98ab4929a8f260987b7b21996f8d6948cfe144af2f1bb6b0f9ba6441a2a7288451a47241194af3e3974d93595c73dab1c5108107f396042b7936cfff662bf0a630cacc566c9b4dd2766e289ed084c0d3cc51196d0b0e0473c4ed274871d5a308e852ea940583e1bcceae094c63b74804117efb2b5adb4350ff7a079d6544107b0046d173ee48d8bd928a9688f09758376da31d8d08b4aa615a85985628965fa804aa99b9ac603ca5e741f3aae062f4cd04f911b7971ae5f4e635db025e693719014797987704ae8e1804c1ef85c9eea05eb8e1209f705888e44631607260106bb88da7016ad7d9813f399c906309523833d70afc81cebfee6dd3a880e6deebb94e341d24d2a9d36be9aac6e35c147d7cf9b28ab8629d53c0cf00696e31e801d045cf4cb54e4356ab2b139aae03995c6f5982feb37ef436781d4a883e2bfc16b2cae77713bb0673d6b4d052a80251719770722b8fbe716cb571fcec8526a201012cb4d56036292af53c321403a3d0eba8bedb6220a0414b7c8c45c0c6cb83f5889b71e8520a007691beae3ac0039d23e20af5c55c8b5b710645daac3427cfbc35d7d6cc70b965a8d1bd77eab484feb6c6a90878f450a8d3a4d7aa02f7e1dcd71a1d7cbf367e5754981504cf671fda9173a42c16ba561b8f6010d8c590768dc1ee7c9edd6eb69de7e6885334c726f0faab0e512b44ac0d72936d76654af4dbe2cfc8e1efe56576714d79e66136d79c57f15599470d007f63b2208ac4ae28d896355bee7eae4a3ec111f6d8e4e15baad7e168176615acfb2741aba23e0825f1b25d807887160284f75f515b6e9b92da03b8368fa9cb51031e05543fc71001079f80fad7bdaef35f66a170a92749d2e9fa60a451e488484f0bfe5a54a95ce235983348387104644bd91d7723b6245d71b5c280395cda85f7270348bbfba93d0e9e14912e703cca5077df64213f013a0be8d9cc1e34b0533d77ddb759f7e1afd5b3edef8a9d5f499d96b774540f808158315b623112f52cdd827ac9c03d455725b9bd034e73a5d483f32ff9ed9e213142547bfb877dcc0877f45c15c72062235985c8179ba18ac702507a69d9f5cfe656495b5cadbd256681a9cdcf0cb565f469f16db63bf7af20ceb6153e2148ac76665204d8741ccea5aa55b9994143454daeed56af099afc7099d3210ae40d8afcd6e54e9830538e7358dd06c4d5fea6eab825c09e8a9fde215dae1311d1502744fe3dd22060a0f33efab2600de56991c8ee6075327f4750c0210e447cd339f6ac80c8e949fad6e768e5382a40518a42d481507495c81027906f5aee4670b8ec901afb1fe778021b4d4c6a611a0b98805c3b09241c41db336e7beb8967a03cc85b1e0a2e442cb7f4a46c70633bfe86c23d9eb8613a33e45f2f82ec09b0e176c8304c89f8bc10539e40f0e2fdc72acf6d9b8673cfe1c8d877e5f52b12b5b79b1663030cebd5d0ac49f0274a1926944d9d1e940a0f12d2f5f36551b19996d05f1db4f29c38741a75fea59a9533d4580a5fed235ce84a5d61344d232642f9455c20b777b9d75775cb1ae2686674565ee5bd10186ad163b8ef1f359ea0d32454d636d63d5d8f7c3132d8f2487976d341e500fab8aafcf4a5db848ba40b3b5cd9ddb4ac3c66f7932167e080e07b8577eab415e77cc36f0105be6a1f214bb53d99cd442af8282558c47ea9f222a83c248c2a7d923e94557919bc2940961d9d8931818b9abfe54cab51e40ccb318ba77922ebf18c2ca229b044d9df881b8913ae4f6dc53c7a4b2e2780c0c726a043dd723e9a362ee701c1c420a0abd6622e9456f7ce80c08917a643c5625ebada52b2a2d1324500d31e831fbb89f7b27afeb9060eca2981d0455588762ed5f10b9a031d19ca5c4ed645e8e2c6c2b486bf97ab5fc64a52cb31c38077d89124d5e25c6d0a34eaa44744c03cf6b8ce78eeeb74f94e3c4dc1629817822af8a90188593d4eef728dbc97210ee08f1b0f92e870e61d5190e046f8b8986f95d3a44b9c379d0c5e0033b81221e2b6081e2f0edf146a071b05bbacab745c629271966537c4e98c407856eb004747469eaaa885af416b5cb03b2d75f3e949464fc0c0a2ce7f9fa8a61b736517c159bdb64cd894f5b09d7afc0718372e98c64dc07682aefb39b1ab05ace440791c1e7e4674da465badbcab9f48983da6e604e2683d6ff90d57a0b70830c5062f4c24cbdb7208ee7dae51b7e360fdea7c83a4f2e55a82cc7e619c989692724ff8f599ddada19d2afe5cc5a3d46632e2dd57a9baca44f0a085c0c968e09931de2ce805fcd622ba4bb39d8a2b4af0b8d99fe327c11c97cddb2a281af789695be4ae58bc1a26613793fdb4bcabe161ce3ec21d7b4bb69df26b5abadeecc706f844a853eec7775bba5234ceb768de58bdad6e3ffc945d1455bb7a9bd3762de7e68c4c4be01d2bd8e285f969e723baa7187f5f10deb1a715ef5082e9185ad4a27a63e7d6b4c30aa65db472e179c7b6b7484fecba1f7e37cd7c122787c8931ec38b9fab62d276dadb5bf450e669f4167ebe1ed60297bd892361def337b8f6129dc33c3dce8ac9b788fad97472cc51cd7b530e6db981696713953687e041d7ce6b76118ddd77ea1976fd16385031769eb0c0accda7ffd225d6d7cff7f9d1b76bde9562b1d958e340b9f411b62c4c1e8da91332036ec4cffb21dd2c04eb7dea59c1ba9a6dc6be6d989073329d2ad0b5a1720e60dc51c33b2007e44dc7ce4fd8bd1f727f5ac481c29f1dcceb297a6a6f86775307addfc339ecdbc5910334c7b7a9903c3dce3fb2b74eb9b99f6e756a1a705a6f49d035803b4febffeaa462d5cb0ccdfb82bda54b544422e7edb20e634f8577bbdb7f927bdf5cdc6ec4fdfb4eeadaa77f02a7f1f084ae29dc85eaef8298782b9e5f6b2f42a1e8c039f44a2f7c5aa468f07af2c2331c1f7613cd641fce0ec14b979dd7fc40036f7eda718bc7139bf22f9eda94074abefb16199868c6139c9605e1694fec69053bdd4fbb1117ff74706ff6d0636f26e0c06871da76e23c1dbe90aa659ffb041614e875d8c313feb0f51add30d81035ad67f7468b7cf7c9727a32bde69193787cb3e7b6153f47681e4fb89d6bfaa803ebc974d1270172c8659a21a4293c3fff492c3ef014c53c50bfcc9d8afc90037be1eba08bf6954f10b8f06ddca184c64bdec2d901e7684f4da52dd3179c69ea726e7ca3fb132af0030ed31a9e4f9a073d8131075a3bfa69113a503ee20d59fc76342fba76549b6f8ebb9e9521497cbcb34e0b81a77cebe164ffb7fcf1dfa9be6e3396a8d46a7e164de477faca660c4817957fd90804509e9b9fdadebd9c3987a840b85b18801827ecb22d05e341b1abf327a739e64f9caea7de54c92d6ec12fe3ae873c24e0df1cbc9cafd7cbefce995bba55934eacce03f2a7b03424a60e81d4fc3df18c2cfe3f3f4e12912abfc06287ae3a75fb181d650de2d562d5a5afae34c888114b7ab752ed4cce1e98891e9dc599aeac8891b09a2580f76c0f1cf2d310a09c7a7c2f4474bfad4afe72205f1d1477a36ee943f45c671704293ed07cd7f68748d03e8468d5948f74aa21195d357ae8f39c0afa17a57c276d77de12b07565e8e294d4269a1284d2aa0763a4236128084141c1f1cd944f74548ce04f9184347bdeafc635a700bc6d6258320feab155e4e1bc4b51292d7576b52aa81fea50703cdbc8ae94a0a65880ff8a0a851704d153a1e658fac0960260a89c5a15184cabb832991b7a7876e3e5b2a3ff40a2e575285fad0251983ed324a5cb01759c22d1b42e66a23cf6fafc2cb252b3f5a84b85c90b086b6c1c44b7ad91448155e505c18181decdcb89f9deb795a2b3468927784aa830f19269a7b388b978ddf7b9abbc661bcc2b40ee7b798697d1b9fef3db5d6d3d9da3071b44f1fe421f3adb013bef9ea818b8aec0567b51f2380d2ec1bcade7273bd5130941caa4131892941f001c9d8964b664a15123b981ac0fcafc40aa1d2d21cb1eeb8758ad0d1d0721dc99d44cf11e34e4fe0169f62094fa7f3876f1df652f69e0817fa68f904f0700f6dcbcb268dbee905e45a5dc27715db4aa51bd39239214d71b95df96c378685d725e78c66662d63f23d6adade0d52440d41c1432c1c3b4e89227be50f75f8ea2816da8d4aff23b41b3c91a6d55e65608e369e39cd52bb63e1e67b74da71a8c30be7391b325cf143cc4824228a4312ed3a8f936e051d973fb7ed066e25105468e7f81e4e1a279213fd16deda047d2f35c7f336b4c818b53f4da1824516a8c47d8de197843211d8a0ac2ec444c5dcdf5692d4792b26433c3db7b9b3315de62fde48886cebd05fae864cbf83f47b7349714a039da9d0ef498c26998348b5e00d29cd1059b058d1fecb4fbd5f5367ac8b3f0a2687ec61ccdc4d25200955e4e23277ed8bdbc4e740d3275e3785da5ab89cb59fd6d59419f5ff27a6c8e713a069f1592e4b86a6be7bd2fe86ce5d5214e5cb65da1bc2f9f36dd4ec3ef8e940e729493c9634fc6b1f601593f2d0fdb20fb4eedc5f287a20356c95662c3decc917f9fcc190e1022f7b56bdc2b4d5dd770d8c10a935f2b0c740503e8b6492a358ecc07d398781cc031a91fb6dcd0f1f2288a35ff49f5c0f7b894f53cc89ebdb7b47293d452eab6690389751f8f48ae4b662817a5f1ccc24f32f43907524f897c0ea50a27475f8fbe8c005fa00e84cc1c716d7568b039a9686887420192ac1a6d8106dc77b9446de6ddbd8ebccec6b97a733aaa9b520e0a345e7e4750d81fda6014e6d5918c9da8925973f9a5ad9234d54eccae91e048b74f8ddc7d4db6e1723b4e1a49310970df14955f31b7c8d6da75d25adbd1fba7497003a0f6316f8d325c18b23194767220dd2a6be46c52aba8c70d492917e329cdc2c8cea8fa59913a2cb86cc0d5b96642d20e375909a65471d3f75a16845e83a4a7a6ac1bc781115d30732f5b340b312fb2d2dcda6c2007fa25aea1e09281c69739dde03a2f814807e3bac577d4a3c83900b9667ae25cd83fd43522162d68f0b92e79677023531176987d0f58c2ceb9eac0e206d2ea8cae14a9b873aab02b450513026c1143ae8de43f4e79a135133e99b9650a37bf3a235854fa52ca44c9e0695ac749b286a075d8b2e07cc5b13058bddd91512d4bfaab850c97710e6d33252a714c99888a358ab91d2326d3689f4a44a68352da9341d27a30d085c30d25efd51b5e51b85999b0a7c20122885eed8234142f7740e4c0deca61ccf6c81db65a4b3dd8d603ab7072f1f83b0736f987e54957c9fd0ee0ffa7313c47084cc9b0f575f4fe607aecc08f6987c02d3bcd3346b380da419a54f6eb08fa6c1800970a440219c00bd7db34a9c41cb693f65a8353c607d45944a05473aaea46b24fc58259588568e8eb6b99b89230957c21ad2fe6f6884f60b37ccb221771e856bcd125da342f28b35f7efa0ef3e6c874cdc5d839f63e8ee5c1b41f07ad2ee3b1634bcb6090147d12f85b5f8a6987eba200c29b85c9bac25777c5cb8978dcae30fe237ecd2258d0d8a0ca62ff082fe6416f2ddc42e09fca945a9068459ff18f3e7529351cd6d5c2e5ca27a2e4d4b39a52c5ac24996e65652fcffb271071525bb4b1d7346578c561cc8ecf707f409d3f22a376875fbb85328f8ca4b6705312708f7c519f254a45f554d69c922c870160c3e181030f5be1951b35968bf5d1708a914a9fb8c5522c82d119c20faad8bc3c13d7934265a1482962578bdfc8408dfa3a53789082e19b420a6a5234ed6d34852e674a5365578eaec72f8252d84c100c086ef0c6c2291e6602ab840c81ae7b6d7bbfd9feebc741eeb4887d9f6dfea2f3be9b35e15b2cf0cae5166a366eaa4ad7053087b9629032e2679114aad403bf51d89fb106e76b88754c6c423f3ef5630b04d6b9cadab93d500d8c74ab9eb17afd9199def0affecf8a72296d8d19bded4d4441080a61c27faf6987a4d5cd1833e5d9acf6778990cd299fa24550176e446ba80d71ee9fabc1b569a1f8cb3b69206ba96374c400b50ca15c03bfabbdd895e5ab31b2d97baa48e18670828012cd3edca049b15e16a6436e20093487c1dc34789f2816f5d3ac8b68318339a8b02745bf707df177ad041bdf7495811531d0d49763b2721c991b58a38cd12c265c82e8c3ee91931e52fa3af16418a233f2c388ea3cffaa69eb9647a7672aea87133445c70796c2a5656c725d21959a746452d3b6019e2f22b0c03e0a92b61c6d9c351c98b638d12ee8234a1b52acf545870d3124b9c3dea6f2b3589930ceb6bd6cb9006326fdb032bd457a52fa3d4c3529a08c2668d14d1496efbf0d4631ac2bae1698c370cb68d42093ddbf8cca03325140c346fd98f4b01cc352287aa1bcf8fe15502740f470712df6578488edf163483e7bda6339a8b6094ea3dea193201341d1aba1f786bb53668d834664d8d48fba49da1c44d34f260b9942ea20c6051738001855e4f3f4f7eabe8566da431252d3c2a3f585928aba3c842e6f57fbfe88d6c1176f2ddb8e14b39a2e52ad5c156bfd58b8fd08d98c2dc28fd91d3afa6dd3b9cdd0a5ecb7055e61c03b2fa26ec4d79d111dba41888e8d3ecc6eebc25c11a6a7e831df4deb615119a232e824142051842d4b60c210e5b5924d93c79a8ee5a13b64189328473a71615845f5a87e346516f4783d3b293e0d3d3d4fb3d70bc230afd74384cd1ae5d97cd2c2a464e63f9488aed918d1f1e1f66590e69553b14ef5a2d1cbf41e4314b625bfb40d1734575289332bf54a1a2fbfe69301ca4c20dcd39e8cd0b31e806eb534237a5f6b85b6f29520de6e55a200a8ff0842db5d3994f82a16c42312fd47d857c758e4d87d9e5f2665009843a9f4aaec85909cf262341d4a9a02599ae95a011d362714639fb6afa649739a477a746589a1e6af90ba2f4d4e888a76adfb4452501d23b89949d7a419955b2a9ace9da5e9f760634a940aea627f5bc4a054ed7a38ea91f449598ca1caef7bce4310df3dd1ce92ab8f4d6ca1953e064eb9f843acc876369013df10a5e2695cc597ddb403b09b818ae582d536f73cdf188e76a415acd0b56af575648a3b2478cd2c142da2bf8ec8ee118ca8e76bf762c4607c759c4dab6a41aecc21080f1eb1df8f75979cbaed903430c8bc21d1b4e04cdae978846d2faf4f2412813233124dd02843807f0bd312f483105974484aa33dcf78efa6a01a1ccd146cfa5a8ee86c572f5bf03080e92dc860c0c9163e1592168c2f2449a954ed40e02993495b866a74f3c42dea7f18bff5488ec8bff9d62dfa1fff6ebf84d3ead3f7d25d8f97b7d23cd3fba751848770aefd9f1e3ccc0340e3d78ddcd60081cc889d2c87868a95e486f41c5eeac8fe869d8e8020ba9e418c343f1044335d7f00f54c16043d0924c3654e4bab440bdacd3f03da19dcfb5871e6a3302ea8e652c5cd1aa290704f05be76d9f80516a61d6cf526590d1c0c6bc63692ff5b3953c1f98667174229734c324a9a5a11a540688736ca9f82f623f5b80c18d5040e8ec81e0177ec838ea2b2c9e94711f59f282bea8994a71a3d488965802b3225120642881b823fbaf8dffff2f3f31ca0837577177b2293199df9fc9f0627ecb5679a378779b525d2929693efc3a2cd5364a19b95402ce216188e6716c40676b108e4bedcc3d85f22237c488d1658e094929830f718ddc674c3a1953483981c90f3fe04172327e163ce39c037ed01d17a377e7919bbf56e9c77d65855916691332f5fb99860eac7115bf394aafc2e8fcd308a0bfe5a69ddfa9a35a363713b155f257d32b585913cca2a5de76a01be6d7020afe8c2985a17963a13f47aeb25e5e4e6b049cd3720c66ba1a76474130bd7170f8830c86836fd26fc422dec04df3841e287fdab87b84598ab223e2bfc24a44ea6a9696ae39e2034421e6002fef3e9fa652c5c7ab221da74703ed9e805048370ad1399342e7f92c95c274e8adabaedc995755352930266cdc079846837f29cf2cc044f8ec8d5cf1650f7083344b04a6288398d2e079903cbe7d013dc77da7e17db4f6c8c558577662048edb5f7451d33737191b6f0bf153a8f854c70264d2e5ea449945ed878a042e5f50b13c145b9ae7c48991d492295ab4d71b1b4a24a142522d30d0c5d41250945dd5a3627554950aaf9f5cd53aabc753e6ec4d354b3ff45f2cabd4fb8d5a6b4c39752c9f853e68d1395afabb065b6230808c369cada1cb4a766a2bc4760c2a40072f356ebe4e51c6c12b4b2088f9680a2addc66483c8bf0a18c91276edaabc89f8bab983a5947c2c3132dd63015160c3eacabc0455cefdd50589a1983f86a1e9267be6e67b17410cadb5889d9912420ab402159ccf2ab95d981fc343b8a7865a24255746e628631349f60cbcf56678b7da37333f4f4f9206efc841bc70ae38f8d0309e13f9ab71d9fe11dbf97427bca22c1c6d1ad4e1b58759b07265d5df96e470afe3b1278a0c049eeb5682f610b52cb1d301d4a126df34f157fca8a90c36940ac7ebe4d2cc06ad30c9a829a14a7bc33e41fde3328e5b6c539ac0e62f650008c967088714bc5eff93863e2540947061c3a1e8ca2cf2bfbeb9996fd8a2aa5c8453b6b7e216760510fcce0de6bc42408484a9e7fc4088609a774029ef3fa3e2670e640e8d46f0457c07a12118a7cfc54299b0ba8f45bae611e59563cc84ce9e5aa0f5ae48e941414b77022f1b5c2f35c332081aa432760d2f5c11820badf2a29fe2ba7a11426380f12c725340edd3397c037a6d7c34c2e14bb13f8ee9237aaf84b2ce7152e87fd53cabeb8900eecb4984e3c53d3b78701f6a12e491d52d011b88150a724a09d1b054b650c3aac0c3c27125d974891a6314fb74d5d95963925d2ef190c518ed5b81c5a4ca80cf9ce3806eb3e0865f4468ef20375d57155b45ca620de157bfe3ad5a6c8d8fcdb4a07cb9dee02cc55aab5d7815189934cca43226d4c42ba847f642897ae628db2828fa64ec02d0cafc76a1a317091112495c403b4ab3212300cd60ebd6ce00e68ea949c98d6af3958cb014aabc0c54a754295171940b2eb2348788257715c234398bb23aab2af109bffc23897293097e46c6fa4917d462ab5689af168558bc7009595c964f1c6e650ad452f812b0d6447ace530715c548fa47a92db4d9ac8211e684c46c27ae7cf1d0b7278d5fafd589ac443be54390c699ecf3b065d79f1897363bc787cd7b237d2311e48e16cf37448ff356052e2657bb98e3175d06959ab50d9a7b2c9fbe497d24caddc3319690aee03ddb15428d8f0285825f20a41a78fcf26f041ebcdfd0bca39bb484c812e4e7b527e607fefadfd8d6355dca81ec761450d4530ff201399d1b4149b35cfcc23b4fb37d43924479856311850ce48ab0a17f50f18a53084e1967baa860f0f77a7d07933e8c89e24a55900554586cddede1077e4182637bd904abf99bbcd7ad4ae09d1dcb3d78a2772e93149b0c85b464e2e1194c1f059bcc98e3dac5ab705c9ea7aa6d06a58ce6877038e4431e5703a5b784db5d2b4ce97d84867fd4be3c3967de19c3bf5117cdda8a7b1ecd0ebe94ae2778d57c545ce9bee9e48c896c4c815a5678186a016e8d16ca4ba990b3549a9a404472dc98ea13f07381ecc2bfcba90b4152152a5e8e487397bc352cba7825ae28a684d66039bd53a289dbeec4685a5458223263695896ad377972113a3505ca33e4f7c20862572627ed8dcc9a456f48b6e520b04eeb5bae2b15cd8f1662c7f97d5189def343ba281af007bb13fe8ccb5c8ed63e40609198388709014bdc902051d995fe99056b7c19ca4bcacff920ee977998ffef4c1835654bc832169d0b33ab8d0f8201fdd5ef42e8f60cf16ae1978565fa1bf0bf85bf18c45a8c99dc23ae140662799f242f73da05594c2ebedeffe524a3f67f33a3297d86fea2ef8f461618e2f410e2f27eebf3e44c8a23b23a6945c90fe17b4098492ae8f4816a45025821abab08a91b11be6621315e8f511e662290fabc8eb66b39244f676e55d568be2bfdbb3bf647b8d7dda6525be5a5c108c1f4d3ddb3fda255c28c368f0c4aed479010641ccb8300ff8897414e7139e026534b27637d6e75ce6fa6e5c51b353d779e6fc41e5b8864687c28773dbe6348f0a465dc9bad950c76b64cff1f267c748aa4d0d6b281a9174b41f2a41b52264ae2336d3ed6c5e77c4a3a6984752f31280135011ce5dc9a6d4fb1d0486acddd8ee565d9fff27b405278c14de81f95da454715857a4b97b94083ebecbca3586fbe08f258ae905c2193309b3e81dd6c574211cc78a70a68304b49ef300e571b2a3c085bd2034653bc76fd3a6768e4eb50a2a64600501e8ba568212b6c0b2eb423d5d07a5b5ecaa6570881b731c4c3d4a4ee3a9cf20a313276a8eed4c7ac9a84a898184ddec6b2081a75c277bb15480668c0a6847bcf043fd0c24ac02d11e6f207bfd9482a40f65e7a397a800f64eb166abecda30ad4fc6fa0c75069aa537e868b1c09823a9b8cef7f5ab7e0dd87779003f8dd2e85eb32f1e4e8e771daa7c4b0d6ff0eef4ac58074b4d18d653d301ba7906a7bf1a4af0bf113cc119ecd948d702de985cbba0c4c701c83a4d2808b202f5eb6e529c16c14c877e645a62bd43cbfae989ade73e7a35a91123d12ecffcafff8a0c8632aa19d99a10185d6d076d6e15e298eb58d8a8e04b67e34a1e8379c3b95e9b248a368e011a05ec8cf89cc7bf7e10a89b28b4f4b64e29d080d8a58d4779f0b48ad2049d91555277f1ad53d5eedee020f37e6480e1ebd5751ff2ce004ed8ae64c82c5562f5a731ab72ffa0c30b7b56b96a4bf997406a94a4d03167882be1a9a2da2a8091c5859c96fba3b641a4f770c39f1835544e04e2af16667d3d5d64aed4bd5be0c7e2a8b04727efcfb92b755d27d2a30c3f8ecdbdcf75636ca28505b582581e39c953b35cfada2c568c41893f580077c8c784f6eb4f19dee35fd317a7cbfaa57df879d20a9f43d3a15af78823205ca6853a5e5315d593e1159e10f0b2aa1b5529a0e7c1aa1624054291545458cc2abcafbbc9f0d7e138129acc201516a4ed5efe042a8ab6344abd3f7077f3c971f8da19c7b7970508052b0199c8efda65401bc419e8fb252fc78b632dd6e84571a13ed5e30406f2a13f0eae74f589c91b084ad31e6c6e59503f22c5a833346f9e0364bd97f6507fbc15e5a4ff3e5e7f725238fea5cb5e8cf50cee3599aacbca78f5c5660c79ec48abd2bce284b4c221e991827f6363a921acd9120a233fb9720899653337b0b725f12597f3f3831c7012016f67e01565bdf1bb31a93e93d85b4bdf1287bb8422ae31295a12973ade8b5aeccfcc8eb9d0e342e0c638b7d9ffe4adfb3ef5ae89b9590dbe786e6464e50818795d411710d0c4bcf7e649e51e35af3a7d6fe093191e776d75eff14c1745ad09e267ea1c919760edb52891db78abeb97a87164f703dedbf25d9bb2bb138767cb7d4c416cb1c284dce9e54022ac6460137d72ad6deb6581e936fe24aeeba7b160f342a3fcd9d65fa729e1beaa2832adabb7151dd554081054d990950915b56bcddbc07bbd75da50e08d20990c38a2cae5c68e94beb774599bf6efb5cdd24e85017f633904e41ce204cb13b386d70bf568cc650041c5c7c5b1a68135661bbe706505d04df00fbc51ff5b2e6770b9a221bc2058b39bb5e7e9d857f0ab7f5a1e9c9bf04ec00ca484b0761a61552372115832d4f06c3addfda2af737a0a71f725ba73f0b70f5e6765386cc88c9ea1c823ac9cd8fdbb4c4088136e3b06e2793a6a6f35a297934b82e682f05589fb64cc99ee21db4ee90cdce3af2bb241fc14bede9165ad9324aa545d51ec6b66e1c45924a54b746e676a463ed16d338093c91fa754fd694b1ae3511eb776457adb2e28b1499ddbe170b34fb5c6e6ce180daad90ab100df15dcdb3c15b679f46e69086b39860700a0a199500968bfdf95861b8b2b2936664b84404ba51294ba1e2ec9c83ea4344678bc976d50d6fd4d6de9c3c8e09e047e2e5e515dda50e01c00f3f5acec3fa939e3dd2c991a495e094b003f478b78722b01bb74fda9b5cde745e34ba37d9e14e2e6c68f5728ec1711372912a3c926ea6e695dff990d3a1c63d391a80ad0caf9b0d1f3237801b67e22b92c3325f0f55868fcc206cd7f0fea8ea0599a2c5bf5653659c537270957e47fc75922dfb61d02e70780d24aa49fce41f2b6382002a2df2c849e40ea40472005ea03cdf70afdd3af2e82949ed2071e4491d3948b8ab9adf5914e23772ad57d0a783949c43dcf59d408b875b823dda8124cd94b625fe62fb8a37316d8a71ef1e8cd4338c69dd1316e921785226d9546cd529ae38fcaaddbc1e4b9ba4ec87a2a19eab2df00b71d1db4b8743b86d1bb540be10de12197ab2e197bc6e076af99d8500f4c8748d6b27c473f91dee208ff3536808edc49941cfb2b080b58da03aa9342a25f1a5ea4cf67af09f768e3f7cf0ab08306dc1efcc781e82d77dfc161055c51601610770fcdf2e921c249a79b9695e8ec30221bc5030f5aaf097062c47dc3324557dd8cab1ebd60d112182844c4dbc59c4a8ea60a814cf9e4a483e867022b993cc813e51a4a6a4dfd99ff63a5a969593480b7f8702c39b876bf0a65d5b5c162b91fce994dafe187cbf6539697fa770c79110491dba03dcd2fda84f2864268dee3a098e13415e1cfba71cc3f5135a3c62301123393686bee45c5fd582fd780dfe60052870e62a6d942ff1eee33d4cf79e1288df8f3c3d374b7c7bf52e124335a83971757d182bce671914111886394eca3c7471a1c8fcfef7f624b35be8ddcd2d6a7492ee772b705358a5a6d128177ca484bbb97add08c7e98cae1a01e48fb995a0cdc26e98e6e12a44260f4b8f6821c217028aee7c82d0769f8e5030de5e13826c648a2d10c71718de1790cf1de843478637568766b49dfed514e6ecc50a4a11a9fcd6eca1445ecf5f76a7f4b4313ed052b17ce8e368bce434d095d5262a670826160cf322a344094bbb247a843d229e724728510d1cef92be6211b191c1ec85b57c5c634af531a187cf7a28078014f0045a04e94b6a23415d10487be6844b038c3516cb5bc81d7c0ebf94d037973b7990d25d8b11e081db70e9bebf240c82381d6e7d21dd72169fa925de13126994417dec31ea333874f4f6016f57903e69e7565a8c29626247cd24c61586c5d6a3b89b01dea61d35c44e1f22a3b036e1ccc0aae7eb029a4dc76aa2b474feb7e901db58a9c3481095ef6f16c1c20704ace0f34f4f8500843228245c559cb0ce0c3aca3e0ce32ba70c136cac1532a87b3e0b4b3daa8f293a88a007c386b03e4ee96867b7bf418e8fc06c21a6df810aa4390f32893e04cee17dd1e8cd8b359b1702ec8e04caa5c4d920bda35fe8891cf36a01a87a9479d575be247b9491b4f2b510ce37f133f3c15e848abd08b151d25c34e5962d4d391a84d9adf384723c9f2b90ac5ec53adc7d0d599f7a33a62ed942ccbb369ae172942a99932afa24df819486c36ba883b5eac9f3753d9bae25f27fff138d918c59d6a7084d94d6525bac1a6369639207c2e01f0abd09cdbc435bcab512039b096ba104455bde50a70289d03297ee470e1c3c426b0d79ce66da2535dd231d098a3e2ccb21b71bc8ab7a37b0be721b913b9eb3879db8e9989df69670b2ca16984ed845b1f429e14ebbd9ebb7e8a9f912eaa749c86ee125fddb5c6830ba4f48f3304925c52a2adc2f25245ef806810dc86e48498d1d0b20e86bdd8e85b680e9284d441059e31448a0c57405c15251d9b0b6584ddcb9b9f40dc2c5270be1dc0b582a4e24beee834f6cd45e15dcfe741b8bac00e033a9d5c9c073d52bb62797e1bd6281bb725adae948d83c3a0b837f88ffe2ffaedff8d10b2c926646f42f6967207820cdf0c3a0cf0ef97f531d9d1b4a3791cf8779c5105ff1e040c62fa75238a503c4570a6bff7ec8ff76797c0fe3e5924de0ccfddacefbc1b959813ce64798a6c399896c03e1d52bf26ebfa00d3d2b7f4c1412c1ba90f418489c8481e4e7f38f0ed6e1e1ba15ab26152b13f99eeb03ed2b151af76c039e7bc5bcf68872d51af2a08218410ce396789a2aadbadb2d0babe4e0656a10b4daecc754ab018c39d1918c0703729df7b520937e268275c8cf779450ab487857d5668d2bb01b4d0f8c9b3b4274fee73e2bebbf760305c78c9a4e28683761e8f06eb1e35862082b6f2118f958f34edcdbcd77363372d7b7fce9652d336518addfa9f635aa6f165aafda365d946bad70e75ed26f20005d1307b7294799aa6699a628c71b4e33d3eda52fcdb44a2e92ed3344d524a598a7f8e7267f7a90cae09163f261a3c11c164674327e7b7cfd1f9edebdddbd9d0c989b9cc7374622ef317367472600e80e7e8c01c0087719d9c97939ea3f372d20370f7c9d9d0c971b9009ea3e372017ce6ee94b3a19333ba0ecfd1195d870fe0eed1d9d0c96939019ea3d372023c864e0ecb699ea3c3729acbb87be56ce8e4883ee3393aa2cf7801ee6e391b3a392bdfe1393a2bdfe106b0a193a3721acfd151398d1fe0ee97b3a193137a8de7e8845ee33536747240b7f11c1dd06d1c0177c79c0d9d9c9427e0393a294fc06fd8d0c941f9029ea383f2055c013a399fdb3c47e7739bf370f78fb3a193a3fde6393ada6f7eef8ee26ce8e4646fc07374b237e00cb87b8ab3a19383bd87e7e860efe138ee0e72367472e87d788e0ebd0fcf71f790b3a19373dd01cfd1b9ee80ebb8bb8ab3a19333ff80e7e8cc3fe03beebee26ce8e45887c07374ac43e03fe8e454e7f11c9dea3c0ec4dd599c0d9d1c79093c47475e028fc0dd5b9c0d9d9c789ce7e8c4e37c02771f391b3a39d483788e0ef5204e019d9ce9423c4767ba10afc0dd5f9c0d9d1c78229ea3034fc487b83b8cb3a193f35ec47374de8bb805ee1ee36ce8e4f431f01c9d3e067e81bb1c239e81e7dcc5e0eb1891016b83812f5cfe0578b8fc22bc70f91658c0e5133184022e5f082c2ebf024170e1f22970e3f271aa73312660e3f225509d8b1181ea5c0c1ed5b9184054e76240a0fe5073f90fc0c2e5efa071f90ed07180cbf7a1f27354e762f4507118e0f21b4085cb67c08ccbbf99c2e55f1b1e162085cb57808ccb4f40142eff06012edf06142e1f0135945c7e4de5d378c2e51f600097bf83010470f9339c70f905a04972f93208d084cb8f1180cbd7c18acb1f00002e5f00d5b91833302e9f549d8b1180ea5c0c00543e8c174bb8fc17f672adcec5784c6d17830f539f8bc17fa9d0c5e0bbd4a9522e06bfa5461783cf22aa958bc15fa9968bc157a9d3c5e087ea55a98bc14fa9988bc147a9998bc1ff68f5e362a0a4d00aba6a685615abae5455242b4bac2d541d4dd505d69757615c0c7ed71817836fe4f26522d75dc70524b76fdfa63bfa760f06f81aa2640b503860663742bbd3f9ce3516307b195f47b3f0dee69618f19e65f1a8de4322e9370dc36ab5aaaaaa41e25d7f4f7333ef9b0ef7598babe639e7ecb956ddae5d691d52efb9b236163752366f82f6620e32550129abbd4841dbb4bb3926463c1ef490da6d870bbf44bb5b3bb994d27faa56b3da4cbac6e6cdc0d3c320874ff00d8a830eb911c417420835b7438d04e8702133ad1e55550e7097b2d7ad3ad2ade74a1f515cec4ceb46dd9a3df79af1565c72a3bd9a449db24166c712b81ae866a64b09eff442449b1e74179e456e86274ac10d521cf1d72545c147841f5399734025ab3a511c1643b6183ecbb29ec35deb3db7aadbaf1155bca35cf55c864fb00c88c58597e83e2170a1053838d83458b000b73efc0e09b8b4a631af8326723390929ae4ac8a45a026318d9e26b9252ca8aaea49596181a228263f7efc20810228036cf0f61694525ef2e3c70f14dcbc69a25890523e76337cad95400869402674b7836f8210ba466143df08e9ee1bbd0466e625cc39df162f7f8b130bef319c3e31333384ccd3bbaf86e6c78f1f22b0e181be900fe16b29504ab2c0c5754ab0c0c5ddb2fb3e80eb946001c9bd6e82f05e3787e74e87bc4d96ef74df1d7c772e01407e13bfc10544cb843c5f770057802de265937a380b6ad2912619a982b6818e78f25511f52446816ff0758f499a865b72b9421bee7de7e43a1b9589e09c1ce973f70da0060d3af7d784e1a5356486fcb89fd838242da0dee4ba707072933bbfc1b91438e79c9b40aeb198267745189d83939b9c9b1c1a20cd856f7aefd07dbbde5dde7b50c67f40c628ad7bf08580cac08d7775ab0f3a474dd334f5a893538183d3e426e7603ff15e2741fb46e3d232cc7cf5f6fe450a82a32808a769821042072737591d7865a301baa9b2ac673deb3de8a083ce49e8de7bee35e1efbdf73e2e46bf7a35e9d51cce5597215700b2c375b7c1f7d264fa06d3aaafde2b5b72af3e39e363f0d3a9779bf7a4ab3ec9ecd7d67fe75759756f46627583fdaaf66995f5aa942db96f3d8eb8aeeab7e448361d6f21c99d0eb770e44e7f525cfe34f5eb77d76f0262faebe94cb9535b0f6d1d15de39ea7dc2716f06deb925ba07f68f3b7dbac8c151a1f290122b38b9f32a5ddc0981500142abf3afc6bffca8fef283ab07de95fc694b7cf996ea95dd42f7c0bba595c7ea53d39ca4b487927677276b2c557bac7cc52574cc672c949eaf51fa66ac1b12b744ef6e123d3763518265565aca28d367771765d4c32d597777db7997efc52cfaccea16e3afa7f427c56e71d341e2c7c5727a62123d77ba6367c1463ae6a3f6684bd9a9129a769b37afd5275bdb70f8c7b53eeb66c47596bb562f4bb31bffb06ed3978c58ca67dd2e7a5aeb30112d8fa7b779292828b7e999d9e9f15d146aa73b8a92833e2ba1580fc01b3f47d847299f8f47b95547d8adc7a9a3c3eaa0cf3cf06eb43a342037da12df7dc59e8f52f9c7bdda8febea59e54d77a83c44044bed4b4547486553e26e3b8f863e1fbae2ca634aac30e4f2e32710a1cbb654ddac1bdf39aa382d6779ac9aa57356cd6a382c9add7ad8b13cbab35801c8e52b54676812d172f7662287aabbb356af2aac29112d76e66192bac441e3780bc79644cfc5ce9ff4292db5e7bc3624eeccdef28973ba5937256e4c89f351c7bcf1da33fa99d588d5f8ac629bf62d3bfdac232d1b6516a725746d941d7bca631da1fcf3f819aa204a67053d5427684ead6ebc65948ea8c569015dfbe7f433a55e07d51450bd522e1dbe281667f491f696b37cd32c4ecb594695e5594b65798c1fd5963b8a63b71e969d7769ddf86205d8e11b3f6b8f77a3f5405f1738687cf712028d9f137f5999fb07a8595e30a77b13d6e9ae42bb49ed3acdc7e5f7b6a21cfc76877593443cdb3d6f896e7682a4a6699244444b4dd12a71dfcc43e271145e158e009151bf1032ebc898e31f0522badbaf690f73ba20d5d1b04f59aaeae0f7447be84d3a8a23f9cec1450eda7b03f1babb690fefd37d9bb644673df0f9f015561cf95edd341c67e59b71b7e9066246850248052c6ee61c33641dbefd77ea3bf482f5391dfc69b239d17a60035bcfe524a6ef4c77b2494cf7c0e74e3609fe0ebd0c7362f719648a902942e688cc1b6464648a909129a2081919199937c814714d4646464646a60819262654a2d4e79bb2e5c45bea333f899edb9fa199f2d8f259314dc3306c4e55555595defadc41cb7a9665536555d6b34a8fe970298e96c7f99489a255daad4016aad8ed17866cf551a5448ceef2e9d22e1fedd61c91526ccc8ed5ed5d230c04023d87bba0f7dc941aeb66c48d6cc597c58f268f556a61dd706e555977e168fa439f4f733de106cde5e57fcc61bec10b336756fb2b3594edb83e3f27477784be729b4e49494949e94fbb8d88985fb1dba8ddc5b93837e5d3662b2fc3b0cc883b7de0dbcfead5fdca6489bc566ae87332d591f21596af6444e870431dea508742a4901db1d8ec2b0f7d5aacaa3ed5a7aa6ef350e68b887d3ea7f405bd3ed747b3d84a65dd8dcd8bf401b51fa90ffdd0b37a3dcebab1fcb24350a1b1d895b6a5d15b6ca9be3716db43873bb2ae497fa8deb5854dba7d0c0c4cf7cbcb417f61f9647969398ba8e52c2f2d2296378b8b8b8b0b0b0b0b0b0b8b1bb4f8eec9d7a33d408af32e10afacd8952cbb40375b32e4b2bc552eaa9b0e17e7b6a09c8574594e9291f9657171b92c292ca0db2b2c2cef5eb1a1a784588ec272d735f6a1bbae61b19bf696bbb754ea5add7ae8a0524d9089b07ff1f9827a313afdb4d3ca8a5dc9b295ad870e239bf78974078efd8bdbf47cd12f8e52b7ebd24f5bff669802d1a14f9defb29fdbf47ccf65a9db2fcbbbaab45414515db9a3cd524317d59edb2ba1ab846ef3b47f6af61494bad5b8f487ce74c0d1c1128126a3a2f7477a52d2b8cc8adeff4824dad0066d70f0a2f97cb22c849265343499dd785ced9a4d7c05df6840154e730d98ba7fbc9afe215d0cf9ac8a9a245f5550d5ead524d933f2f00de01b950e57ca59c554a94f9926413e4d565dad55de48f956a6478d0b738cee4089c2094e5c984ff91a03f3179769523706637568127c65e9702f7a6082b6f58f66a269fce8261a48d308222bd9241e2faa7b79b9cd7ba99fbbd42d665437514bdd3496aac3a2aac32b7583f02a55876f4addaca354ad49f09f7ab9c02a4668c1bb69f6d94d4eadaff6acaaaaaaaa9899b96299173000f0ed01880f40054085515f54995af1b83d68aef58dc765773396cc56ba8841dbfac7ed1e5c7848baf0ce773d8a8367e5fbeb73af3b57f3e25b75afb3ab81f1ebced9b07e1dc68b1a2f53630f21f50cae7431228e8bc4515a7869ae2523232323737e21f3c2aaacb4b63ad94660ba003098dda02db48692493077e0b6635d2677e0ddb13f3c5b9a4a3f949e183476e289eb16973004c9020e77f2c8850bae6664790a9730f0a0c925d3f582046dabf180ae31e2c93f99cda58611af86ab601f584a0cf75d76a1044f8f1ea41bef22aff8caa55d9a04ca427357da57a56aa23f843edf450f9b86d456ae889508d204cbb84a04694264bbe02073bafce532c8cbb36f6c248817179797b355573eadcb0aaf109ee2d5b8b85828685097563e5ec60b3982b6711026e2e52ef631e71b86a249ef3232ce5197ced160b9e48265bc4b79171929c352f98abf3317a0ab5876824e3117f73d17e33db3427379761ed234a47c37122312816a806ac857f2b138777d3e1f27ff612371076573e06374974b215cce5344da91dd8eb8526a9f4c23006f69a483722e9507e62391ddc14f82872bcfd37313731f3196df377ce303e63e6efa06e6361d8197c35895694b2ce45aa2abdca6276559ca2b458e8a4497f70a71a8e25adf7aae9c2e519517527959b56b491a8197cb1aef6427ab3ae25357a9d665dda49ce7af94445ff9342fc7b8893ecf627be05be5958fea5021e2e5b18aec26e3eb262f956abda9e853aafc454a7e5ee63c6a3abb2ba2ac438a634abbf3ae35af95b931a5c44b0dd5d06d5e751db4812e4adde4a76e4fcbea06ba1ec8a5654a29a7dcf85a2ed2aa0ce1cb0fadb401f85f8784872b1f5d5c5c5c5c2e6d0e40e063f4256e1ce5e11277a0a412e09b963b9a832f744b2caf749d421b8152b20b24103438f9015282246e08013f794d0461204d3240193477b3319046f918c0d5a0d81dee33efe626175844cb394682464e48bc1a0bb899f6618b30dcfaee0e57c36a8083ab820f4f5c127715fc3dd23719974bab77c59be97f0bede5e821afc6355ff1b40c6379cafc848d3c811042faea2406e26cbc2dc6927d9f752e065fd37ad4a9fd4946a8f7fe57c3407ac602993edfe49057f3e16e620a2a6e9f9d111c4ad0367e42a3d5d0c5d691d5c04fbaf8fcd53013f8095c85db408cc4dc8d9fd827468c3c79d23f1a481aded022e813340b2064a63e9fac539af065fa2bb72f59075d13efbe5d35d1f6a052bac6d5f03b0779351c704eb421bc1cd138e066fafdeeb347b818fdcc0acddd6ca008291fde4cf7abe11df44c7f8a67194712b4cd39e1691a0d91d891a269c47b04121af557c323856c62e53692dbfd265056a2c10d2cc5abe1769775e06a2e20188109b7efdc13dc11386493667541768de580ba4df30ca21df124e6eefd04571363398a9e79bfed2adcf7bad2a0862dea24133349f21e6426a2b7920464a1adde76cb78688236eaa1efb40257fe6e73c4ebc21259274abc99770b0a96f17e7dae549777854a6c5a3314f7bd690f46de4516da95b775a92f4cb87881029349492fe924310f4284490b1191cb75e9243fa4d81cf8f863de1722e63c45fa8f79c395d15346319f1e739b16391bfdf782bc99c7415e0db758cb4144b6e99dbbd13b6019efd927aca1a77017afa681bc9a4eb203bed15c7cd3804cdfc14df29ac99be1826f7415469210e1e2becf5055b151e20887643a51a91c85233d1c9fbfdb387784745d3861226d803268bf119b37c337946019ef9a91fbcee4deadaba87cb71bb8fe53826fb093d17f2f44e4f5eb4747ea1f4036073e5eb4103f4f91172fac7b33d79ac45b8abd9ad436073eec8f63ed2d4f3d098ae4f07051bec48d4dc75bcfee9a26fbd41d91f72cca93e0a1561ebe89f9ffdbbcc9b4871c7ce06f9b0310f888b98f1b4779dcf2f44dcc632acc3f759bae66375026aa1be8aa3a5cab4eacefd42f1269dab4c58337af9f8cba850a2eb2c0e2beeb946471c57dd71dba9a94bb5bc0d5a4d81d14bb1dc8e72ab8dd9beb82a195325a36049e5d8d10a02d7808f5be109a66339bdd78cc6ed96d245c8c3e0f51681b0d8d9452ca438b5dccadaaaa5ffdd11efa4224289c77cf6e3d48773ac65bcc26b2aa0edfda4fa6be46b49646b2d0848af8a369b82c80c1c97da7ba681a2e0b61a8223271df67f6e6af07f1b9ea55aff771aef7a9e5e1e951428823301f5c1227ee0a9c0c9e477b76687140a183de73b3b92e46f018c4dea776047d8c6090fbb4d77833ef079d873ecdf2884036b33c24ccf2f0c837f31eb292da11dc48d7457d183ae83eb4670f02747a6a7d840ebabbd96a10819d86ea085a504d795651988fac0011591e9662c8112980a8a4a000d978c8cadd8de82defb961d9f8085f3b287b0f599e22ec440b591ebee2cd3c90e571c2c349aed09268578438e3da7544fd73fe5547941d4560be1fc447de7acf8d4d8f987061076a6003911f3f6eaea3bc08cee7b3a59847b13c0da4a51872dfe7b70632440a953f209f4f8a131415cba3f2eb9f8f8aed2e3e0f488a2501dfa0d82e5a5844d5bd19edce89a67deb2e427737a1cf53de7383f2ed0111bdcf5304673e749e22382b9fe701c2c38d8ac8f2887e3d642fcb23b29de4cd3c9e3e6249c0372a16f4ad8f80ec887acf4d928cb23c98e8b98940fa8aeca117c101151945e07a769cebd990fb7e1dc1b91eb23c6fc8651f488a944aa1d4f8a95aa5bab8bebd21d725858fcc8e70b063a73c2ecb03a46fb22f717aec7d082e68eee68a2b92dc97591f4bd02745b050042304f9313fed085a1d100804f266de47eee268d97390d9e764522820427531cf37f3ef70c89bc1ec081e0e1905c137d7f9e675f16686d0821de15ca7bf4ea92e7e6caf8bfb4e802ca82e1c139c0882154abe80052c4c71f34e3979353d4f44010c2b38430ace00832eae6fd447d0422454920ba58052bc99f74abe3f4005508a08ea812de281364dd3e47ac67d7bd7dc3051140d081f7b613209c2550057be2ec6fb93c1754f1881920bb31a6f1a130aee7b021349ee7b5063c3e5a16473d0e7205e16a47c4e76ada6494ea7a275e66aaa9cf5180d5202ee86a7e7e69ad3f2f4dccc6f72f2b8b4bf8fa8c7abfa98e7a1bffeeab33ea80f8a43ab26223b16795c96a7e7e6e2312d0fdfc83713795c32c63989d03ee54ec4c98e9dfa91fd7dde650ada06e5a18febd8a7087989ecf473da0d3a24352e258adf6828ea5a95843cd0fa23b345fa98f5412340ed086714c4fcfb94f57aac38f397e58953dd79b12f2193292a46ea32a598dc78c9aa4a1b2b55e3c590d25c2e45511475bdca799cf32edb1c6ebbd3b75dbea06d52c69e18dda4ea883abfaaa5f86dbabbe4f6a9d2d4311f29c577b0937ce1c8ed5352c68a71c8c38b443f9e7ae1c9ed2bf982141700d729f9c28fcb1488ebd16ef397854da2d427aa2dae1de8bfb7cb16da06a7ecd612bd755555655a7bf4e7e7a4eaf6cb4582b6eb52f294cce1d97a72de77de0e378739cc610e1de85bb6247b9076a463b423fe3dd6c01b987bbf107540ea4cb93b5519789560ba3b994dab231dcf662e0667979d0d1d4da6b82cd729c162c99dd97427339f1d673e63ebf238da3f1f45003b7d10980d427b332c01778372591f45a67f3e5f55ecaf5eb7aa76699d56f9597d501c6a797caa0ff76678a0582634eba3880f1fd3dabc19388416b46bd6e5e6966416893703af5923de0c462debf2579dc7ea759bf7aa9eea9cacfd83699f3c98b0b24beb83623eacd36bd547111ccb3a1fd587d082358416e43fdfb4117c2c4dff6dbf3e291a0177c3445bebcf4aedcd6438bafaa8deb7b24b4b3eb35ef55164eaecef38d5fb596579a4f56ee40f20afff81678de229207d438f552648b0801b7a207d833d561ef4549580bba19f6a10ef067b557d6496870912f070731d08dfcc6b7634f18ca6eaa3084e6647d3331fa3c98e22a0dd3a4ef6ea9ae529c2739ddedd58ee667290370387d042cb7172b849f458d53f60ddddf0cdc6412e262cebde6f660f6c2b0553e711b913f7497722391bd89d4ef3b44994e4ba258e89cc1919d1aed37fdad1fbb4a3f7cee38c78339374b5ef9c75e4ea9291e371ce59b3f220bd9909004c34cdc5d011b918fcbe91ae3a67757284d3b7ea08c74abbd5b8ee94945246fb88744f49984ec6c13e8075faee998ef3a6e9d0f2c04fe7e9111fdedd4cf5bd1fc474687dc04f6febc347ff2551fd077e95a708ce7bf66779c0f79e9b26e293e529322d0efcb33c3fde9798ee83e6cdd8d1fcdb8ea6d5a1de9647ebb9e9b9c96c912587cfbed1dcdd64d6a634d2c1f2237803378d0845f84a3bda313faf8f2238d3b3fb18cd51f58777769212ca6992139493a466a5d2ce1e1e79280fe547cee9b3821f5baa268764754ccaf9a96ed31204254b8949394d729ae434c9692a517928a13c9c26bd8c8f739a3e4dd39ce4049a224b2927bb55673b92524e734e19cda1428fa9401528270855e44b9385d26e495cd75555554525fdd4fe59f9aba24b4a5152ea885198a9856c63f5f9584d9e93ed9652619376607c971fecf46331515dc9286669a7409e5e6f209d82e956d4b52ccb92202115bf2a9e900bb5664231eeb6bc72aed83d214da382957575e52e94f2a92a4a2b4a2bda4ce8235265d5ddabaa583dbed07ecfced945fc62b79da6f45b557acf5e31551129ad705551a7f40da9e2caca797b54fcf65edd6e4f4815ed4e5fb6faf6ecce9baa37556faab8c99bde54e958799f3799f243f66a949d9eba4dcbc8e5876efaea2f48b5c13c21977e25562bc72a8a025281b12fb47aa195ddf872b123db625f152f7bef652bf639b1f2c852af8ba8f99515eaa1948fdd449a165bbb7393f69c60ba75893e9eabaaba6855b9d2a62b9fbd3a15333b0415b4c9a56c9020794e3c279ac973e209794eb4304b1328955764f3e25f43ae0872abaa672adb3f89444353a38648d46d9bd21c5a4b2252fca2381ace94aa55cfc6d3ba699736bd24f2cea5942f711f0d51faf7fa913e3687ba5fe82f64b7573729c5edf7de99dfb767bb7a5dbdae5e57afabd7d5ebeab12d614ff99bd3a38fa24f4e7137eab5a47d89dbaf7aefbcc91ddc8da29506a2d46e528a4b5187e2501c4a0b3dedaaabaebaeaaaabae1e0a45a128d421a194524a297d9f5fddf8baaa4ae9533b0a9d75bc37104464147ca34f634b71f95a0a7ddb525f7ba75cbd7a8979137933d53f5b8d8d66236ddf4455d5a7e83718a691d21cf4a56837fa26721b6389d83ecc8bdd4415edb38bdd6a8cec46d36237128bdd2eb215a562ab790536513754ddc5ba2f56bbb5f74873684f3955fba07afd55ea362fc55d940a49e5ae4d6759b4aa2cda92753e7d86834871f7ebb6541f7b5fb6543d9e625ca346acaa4b4a4da3343497d6a871293d67a775dba1ae7c3cc5e44e0da4460d1a1a12e9178934ade209c98d76082ab46d87baf4d4af53d446e726279a262497ba116f62fbab460d1a1a12e97793a33bd4e5ee35ad89bab2ba6b59d62d4b4617860164baa601b109774ce708e7e49a4cec829556524a09bfd3a5a6a4ac2a694bd34ecfe01bd5a1fcfc367f5d166577fa96789b963a33ac4ec337e4ab0d4e874d83dd7437637e4eaa87670947d33b4dd59295757f9a68f8c6746a43b9eccc96a8e9fd2dfbd8ad77b8d93714dbd42d3b8365c853d28eac5787d3349de56964f70e77fb1c7edb61e31cf33cabcf683be74b1fbb714581b8eef4197c63b25b12ae096559d55d8aa2accab7a98e793bd21c93afd5ea59bd3e5538836fd051fc64d9f8433c1d51af0e67f08de9f02dd6af3aedc63c63baf5ea6e06df70b78a1315637c8c56c24b4d7606cb8019675410031c98dcebb2dc4272a114f700d729d9e2c9dd62c99d971fe44257dd494a3736a2596837c62810f35a94e6081dba0b2de67790497140eb4277299fd3b28fad4bc897d6a5cd8325ec4b5c4b454a08ffa48a7d6ca93cbbf5c5aed2412ccb4ec97dec5603b16ef3ac2d7ea79642d6bb65c5cb77137cc3badc227c5bdfd02d09a1dd3ac88d9fe2c1370cdd5ab96571b31d61978fd90fd6d96e3aacf3adb37c3c0415dad64182643407cbd996f8a1632c12c48f9716949f8fdd24a539ac97a0dd7e5120ae6bd92d89cc4e8a8322b93d5117abee36f3a7cb5888656cddc4b51e698ed09fa8d2af54ed2af573abc6eba11a02024a4161b62828ccd296e6adbe3a057ce3596f66c7e82953792cb31b1b796da19cab44b1a3eafc374369d6105468f1f42d7cec1b1bd12c164fd11cfc92b4d8270ac475f9a776600af8065bc74ea9bb945eab4eb7aa8ebad507ee04c19df0ea9857460ac4a12dcce0a4a7b719ae3083113310b933ae5352062ebafb581f9b8ef5b1c6a6c3c6ecc63df45014e68e511885390a73c7faaf96e0a5e6a4a847fde5bceb1b76778761183685b6ed4cd36577fac696e9d43b3b55a2ecf68bbaa452a82951e453aae852d441559399c5acf5948a523f559bee65b71eab92a04bd2e049922b80eb943c81e24e08e146fd7d0948c1fe849ffdeec697dae0c5a6ef38517dceeb71ce3867dcaa5f95eb162b73f52bfe7a50dcadfa4edfcbe6bc3bbfc42d5dffe9b7ec5c7dbacd9c7266bbf53c487b337c94ba33b5ec74938d35bb59df32bbd3d4eef4bdecac9e132ca3e268b79b757c4119b028c3147766707b43eed6dfe9eb630b2497749d922d86dc32447103709d122ee0c00517d700d729e1e2c8ddb86edaede1999ac90bc237361feedd574b393cb76e2f8adb87fcee645bb637c46d7063bbd3db1b12a98b0f3ddaed7acfcb789488f2f894f72ce8f121eccfed4c376eddc4d2677d1a820a6d6ed494e3d99265a9a9df2537b9f0fde704df88b6c4a7f894bd16d4a425a69eaca91cccf74f571d4ce22214b7ca972654775facd04af0938eeb6e7cb7e704cb88f2fda6e77017924187db645072fb20a6d13a96b1bd20d79d72a73be085f639c1321ccdc3c1748d0626d050856b120d1a1a1a1a1a101ce0b46ec9c326758e4b9e008aaee9236f0636510277a385b00cf8e3322fbec75bd2ad601f7139226bdffef1faca69492492cb37edc357b42461199004f9dbaf0c899b30c26249f9246120373852555505798a0ce44df1637f52d3600b650582624a297d7880bceb6b9174d864b8c64b9e4978340db6305a2e81731f16d0741e3e809a46bd3dfc7479cba981236ed31c638c50039535422412893e670f40b4cd5941034dc3ea6159afaa8a65ee44b5b4aecfadc951202273a907cd9dffdcaa25ee61c7644b5c82b1231df2d37eaa6c212e067c136c277631adec1c0285101244d2475c0cb6028c0e2e3d619c5fb91b1d44d25896ddacf392244db2022b5982b6711256c25678a91bb3909e79f241fa47ca616c0a037131841ce1c10a6deb2342aeabfea2f13c9ac645a26f129eadfb80a206cdfae6923cc0d9e0f39552d336510a0e3768510346542b02c232a0768448cf40c14732ce6e59b80517039e5f75089aa000546e461ef40054005429a3dd62bab2d2c59076eb41c34be61167633ad0695448ba8aa621abc72853e635b929ba1cb52cedc6dcaaa31d30e7b32dad5020605e3133977ad0dced8f3197b5c497d28e7654b6c49f87f90673b6a5b8f2ae58b9a214c7741a7bd0dc128c65710b7136e247df62ee47b4c9cf61e8b0e476342b981616cbf2124e622bdac3cb612adb019a5b7a39cccbe15949d35832612a7f5a1da0e90106e6f25ce5ad5a5dea10adac2f9f558826c1bfb0ed4153e3be7cbe549c26411703de8877f8222e1231792a2ff0e5e54024f0627160636c8b68121c229be020314a2ab48d815881c60684854859b9b8dce6b9d4eba32bae704c801cd161141dd6b28b569b043c8087ac98e90e97236808430364022efc947253e2cacab22ccbb22cbbcd0a892bf9ca695d0d83b63190fe028e24da06ba3046192608b0418f1a3d6af4a8d1a3468f1a2842b8a80deeca3d1adda6b98534ac2e1a2404ee061b6119f0108a91913010e90baf1174d291f8b45e8ec49f2037c37c83216ffc830b2d3b65d3c0ac7c9305891851a8051bc232e019f2a16ca91da47613a2da4090801932c13c99d359ecd68df110055f51555505334db2301fc658d2b2feacfb9169123b0b76a8d558ad696b217d65f5297299ef12519f33b870ab6e24314f108a60fa750218830bdf24d75dd577dd0f5a7cca5f3eab8bce18b5dbb40f6f0616c132e0352ca0114d8279df5975131d245e30efd1347a60ac915e8dccf9348e068ca311e3685447e33bb84634a9c70b12adb23d627ded204d82afb59b6820cd4493aafaaea342bcb88c9539df845442c72c0fc9a0cab51df0d004bee2070f4dd0388b2459407127755595a7e023b432153e1cbe08be8104cb802017e30a67436e315724ab8baaaa7a6637d1d63fa4753d6a1cd134aa6a895b1d4ee72b9c0debf07e442ca23b57c36ec6d26adfaabefbda5a59b1be89ee8a75677de54c9d8b61dda238ac4fd5a23d50b75ed57727a4112049f998f3c0f888cfd37323731f32e7f8bee1ba233e091e2ecbc8c8c8f880711f377d03e32f0ee3469c0d6d8b197d13b5b0b81a96c38895e688910e98c7c3580d3409321298dd7a5c46fc96ad478d1bed11d688e98fe2a86e44d3a887d740d38039fc113de463be45bbd1dcf81a9799e532e9f20700dfaa007c0b40b50e80eadc0c8c8af58f1899aa59ab72e5eaf35d7073d95e4dffd0ceccd7e4f90a96014924d0169a95c3b26f12e4db2370350708fd4e6df5aa47eace6f3bd42b59b69a90c03f9efe643c353dcb4c607aa22149572fc91089f2495946a2572db69b58d6ba6accba7955ad9babe620d50b82556df50ba272c6aeb65e55974d57fcaaaa2a8b59cf30ac5bb6fc4e97347875cb63986c4d7b12bbcce4e93bd344dd6f0dd3baad11f6fe0bd2d7ca2576ed6aadb14a55babbeda79f13ed4412cbb22ced05b9d515aa14d616aa8e0e92f228d6ddbda6a92f4969527e62d5941343b123eb7c59498d7e545baa08fb74932bb38a993c27ae39e79cd3aaa4d62029a27889a2d5d014e34fd554895a0d51fc10551d45ad45dfc98feea2d54063abc1890d516b51c5f8f2d25a74f5175a3989a2b5b0ae59ef6f4e5a0b67e35127ad851327ad05d56a682d5898c5049f6ab4e4caa8b53869e18263f5e1b73819c16044a469c457c56a9b98f8bcaa7a781e577f5dd11627a3212a0feb110c30901d11b9fc7a3c5ba2db8b918aa31d94fa4b5caeaeaa6a71321ac237aabf511454bc60b58d88bccf376c44e452a7d5654bfc2a259e7b6be1a26215bbd32d5cbcaa3a9ff92d4e86c4ee6d6544e4be7f3ed8e78d60f0aa6b5b5179f6f3ab6295ea335a4229a56d47306019d468c8ad3e8fa7b25717a57e5a9c7412666b45787904038afb08767a61d845f91ac1c0d2a860e24e558f3e72f9f12d5cdc2b567de46e3dfac8ad4eb57071a98f60c037780483162723188c888c6010531804048a6f3033cb259f25afa494b3a14ccf796acad234e70e5f86bf71ed304541ea4b208450874986e21bd9b71d66664ac27fe6a76e5c9de21b3cf53f9bec8bba2c452d99968214df606ea624c52c77585214750ae32c0ccc6f093b1a94140b3a28dc56c0251de0f36d871933306a06c7e6a654a58f158b4da1a438c994dd62eef439ab1863554b6fa55b656565c63bb51252b1af298aa2dea91e1e8a4f43ede06ef43b5dc2bae769f8466f33f8c63cad1e11de2acbd1963a4491d460e6534c89583ed4d951d48c1e7587cb76b4f2792ab36b49537c1a8e717ba7df1e913b8f45c69ecd2bd16259acc852a76f799685df452c7683971e7bf673cae3d5b09bf1b9fa595317d96d874b2f97542b5555613458dfe6a9d4cf43553ba8ce6318e9d5f0d0482916cae73c5e8d12336244f2d20c859999a9b56654f556b6c49752d366b4b2493bfc337ad46b1dc58ea412af4624d2a619b35efaad47bd3b384973d097327b3d925e0d4f75077ad9193388c419bcc22f44264a8cd5b7794a6365b18dd24291202959de895db17eaa39e3e72c6974ce6ab2d3b49851be9a0cf4ed2af176d9f9e6d424cfa92257442c979335c99389164e9ac6ac2613ed73d2aa6a52d15acadc94729ecad3599530f9ea5382403cfbc1aa3a6852ecd9b7caeec08d7764d38eb2578f52ca7335297552e500699fa0eaadc5163ac886a8a856a190dd2a0bb2680ea94525298e0bc3308c6f6b6fa2a5a8fcd595c32afa54592eb5ea6e33f94cdc28fcec1b7d66e1ddf89f6fd47e2e3fb7b5c0d8085bccb288b2c7afd4cceec0662db460a2854ddb7495520318d5d44586727daae27517dd4da49f7dfd4e698e98e7ac9892501cafe21f3566cccba80513a98062555525cdbdaa62755bcaaef13bbbd63060d829c97befefdfaad76ff1d53e18d9d64d4d5628c5c409c954c5a4e471ccbf4d49ec3625b9d4771ef6b087d1ed3abf89dfc46fe28c8f31c618734cccdb3d8ddff6d5ad623bd25ec91cc6e54345a0f7fede27245315ef558f8930fe6ce93d064645b54be96db5320fc6b7becc10546830ecd6158c5fd56db8ab77182e7c1998bbf7c26e226bab9dba98de7bf066f53d2dc64e56bca98adb31efafd73ba6ba4bf947ccb3139226513076932f76932e76d48291ee8484a6c6dd1c921a170505fb1633146666cc7a6651262ba8cbd26f1893d2f5f8ea1b6677a68b6157465576b2225a941ada371ad219c99b995e8384d9ed1592c90a1aedce6477a62b7b89ab6805dfc8ec9644cf64854834d189a3dd99262493155312ab9aac60191457ae51984e66e5f0081b691a53641ab3a5ae4f9a23852767e48845714c5d5d0f55ec53ca41b53f3f575314455dafa5144d52d4f5ee8bb2692de52c04797da7ef24af4fbe2045a57c7a739d9f8b51263b5d4e97534c55dc6da74bf34bdcc981a49cea06efc45444598a9f211602df90a77a5af9149a5fe123b06bb469c6cfc3695908f3fd8b864e534cd3b45d2957697acae70acd55a65fef6a59520898d5f63a9db3ba1ba7699a66cac532269a2385b194149bfed84913024f5c6919c6428851ab54a93a7fda6d073afa4375ce2e9a27ed34410ac47578b110a66521b01116c2a338ac23949452b21058c68424450b909cf32ad9d986a200c4a4396874ece292497150cfa23822768abed3d0a08c49a292888543893149bcb44a322546816f58a750a2fc1541292019975ceacc6c2dbe6e3d8ac2a8478c7a8c58dc0da35fe252d6e1c5fe1e95442bdc0d8b25aab7b82446c18ad16e71c9c57e8badc8d713e2a5b391f24859d84ab47674fd1da3a8244d4309dfa01ea921a8d0e292b884e6009db225eaf419e851c7fe30104673308d2a3d3010f6b08be298d74551147561545472a9533407bd75acb2ca536af6951aa23426e14cbbce6cab6b578c02df78f2bda76dd413ecd4f41805ac0e4185d663ebe196504feebc8cd5c5beb116eef4ac4a1703bb4aede196842af5e4528f514812a340511cb38a310a2c8322125a8390f784446eb2620911634a833ad4d9fb3dcb289f6b6ffbde13e241eb84c07a78a2104c22753231f2b1778c65307ef1aed32783c934b9dcaec915b7e6eeeeeeebdcc3f39a9fb440ac5b88d88f4ef8bde026f7bd3fcc96f82d7ffdde7b93dd7abcf71ec71e7d8b2edfa8fbf2cdd98089793b1bb7516fdff455b623991f46b7100fc39a60dce4c617619c851f00e2ebeeeeeea65efa7bb10100c30a31a7904b46a6ba7b5d576596e12cf8459db715e5b57efeaa3da6aa1ca6667fa9a1bb54d04735e56dbda5458826519a68851d161c6da962cea231d7e4623dae3bbff5b8ae63b674c6ba03d02be7bab2f5b81c16976dfc16aa20eaf2531c377431286c9ad86171a9d84234e9ee96996c8bb8f024869ff043f28e50c137b08fc62251b3b4f58e3c245818b3ac2c772b21180c6becb9160cebcb3f2aaac05aac16c86cfbd8b6f34af00fb3ac682929b1c8238f0aec55112dc9c2f290608fd23ab4be5996b4de628dac28a5c5f2c658564229d46b3b7a36d90bcc3bd234b05b7f5458522279482e7616c98281ee9e8aa863300cb3311686c1d8176b9fc00721647954b05c3ed28faaf696fa39d7789d85e51d6952a450e4c4505090c037367e117bd1b22c0bbbbcc5966559146394995d24b2a689c9c4d8298cc2a88784878477e421e12191f621816544aaa50845bd21175e4e2ebc58bc288a2a6593a2ae8b6a6e2d2645d9ad9ddcc951545f4cba09dfa0decc190562623447f6eba29c508aa3df908be2a078d6ec6e45655e5793fea586594b21a75d573799cdc5a5d9127de854b7a89d5cd86d456d43f4a11d21ca8e3ebf3e1d2505d44da839af6794e6a032eaba48e5a24293e6a05e0a5db7a80b64532c8a7d9f4f7777f727eb2639b24f6daa9e5dd3bcaeebe253dbf4abc22665d55d9e7e4128da9899cf7f35d05ef6b22e698eeb25b61b470ac475afdbbc8bfabcf566f2d6826f38ab2b39dd48554a4a29ad843752937530c4a1372489814988c0206f8893093ed1f28641e01370c8db4893d6963b0c8442dfeb07a3a02eefc12042e873b1a5485d620c8d8970c86d3e642252093d5b8a8f8251b4b010bec17f108aae5ace43e0137ce39d82433aa5b290096dd9da89dd7660cb6b11a984e01331d2fc2bf5180aac0e8550da42635a628c78a36a3fc1d84dc23c86260636136c8525c6185b2c7c020a693975a9d7b952f32dd5dd516d81414476939a8addb469a321410899c02724841032814fd0bc1a7b6b6fbf896468606c9791f285b5163e01613399a6ac1d7c023ed14c2e759128087c020e79e9172ab2c73bf954ed734e9547cb53b01533ebd11ad2d18ad9e78cb187a739be4bd797b8d1a2161b6126a03395bcd3284048bbf5bd8e626d3ac648af6d07b62dd15f8f6fcba22c56434946cb7a8c547c331794253bfb76ddb22cfd2d1bb3d2b7cbeeb465e990e7531beb06b23c459f8ad10833b1a4dc404e688eec8c6575e3db7cea1d1b9485eace14f1a5b61b5f31f2b321f47297527a31931cd9ad53959f5227ac2a47a9d863a5dc65ed6341b8694cf9b294b3783b70074aeb7d8bedf6a9b0493b2dab47ed5c299f8a10ce6b5ea586eace1497ba388bf8cb72162c83facc624e7662b91b635555b15655e42c86481529e58dffbc328d03b15ba8d4ecf6b4450c199a11000000000073140000300c0c8844a3b1704c22c8b15c1e1400109eb050705017a6518e21630c314400000000000000609240bbc51862c5e77e8b556ba6e8119a0a5b8dc00f3a4082546c0d5a51a66abf389d2dacf67b9c2740708f3a28f3e660736f3d7ff86e7f800bc82b84f9bcf276823efb4b4121568765ba5f7d0cebf1ace4b0ef279d354c8e92d05f4ca3e5f3d8e8c7341fd64440a68e04d4515ccd05998d7d813e2b1be332e39d45eff098d574c26383608839a2d3a956630db776467ff7826a7f16dbb159cdccba74c65b8cef948c95a0eb7c590a76e810a8b14f9745ac8590b83f39e876c58eb27cc4015d6d783caa2ccf49b37ffa2e979dfb3615dd08ebc96fa6bb16f4f376aeaab602ed10288142460173da3fff6cfbcd03fc2cd75adbc69877be6392816a4b786d63c6f7ce8f7383aee9aa9c82e7576d9c4044f9c12d3a2722d24991674b8ada55fc77945deb7c47170179ccf5f5bb1fe62fe218a3d637e2948eeb8b3afb60c09feededf02f62c99c376279ddda42d783040208d271b96c5d2cda8e08668738e65d8de0a1debe2e81d773a8281ed3e6db830a86d8a735daeb965364d79495d4fd602d7da90e3644d7c41c0f01505ac0e7163a7dbd29c12e9cf515f81d8647430b0a18bdf1bd6694f98ec06459cdc8d8f9cd7b09653908670e5b354198b4c307bbaa9d1ead488db80c67e61cd8fdc7c922331a6d7cc2e904ef70bec2d4e69b0f9d74e24a93a058431155fae61e323a1eddba0ee900f2768b5cc0abb5cbe493b256c07d045c07af11da1140b42a2e9f77b131d46de53e928ebe16bbfc91665f7f296f0b3a681b69b84ea4ef96f08e3889886776f4fcc5f5ca92acf8e94b31921f247f54d4ee6542c127b5da16d9379e063f5e5e55253f0d74e8affb82cf6f6d15ad1424b9797a369a9f560eb63243b3599678b7424e6a012cfb19c340d6b4870ad39a8d75f2969663a209172faf484c0819dc660a3af7f5c1d909ab34ab49e2dd1c1075691d415f176490b3833d07a2e6def9ecc00d6b6edab0aa452b16c0e988bf3dd4ca255c553477a7229d30c1295a4803b04aa830b797190fcb0aaf5d30437eb3fcfba5d0279163bcf3f83b28fc201b8e2e9bbf9c813f493fb1a9890068e3ee223f2f6c4aa05dc4358eac4b3bc802b4ef6e8538a0b9dc58794a6773de407476225bfc71c116dabc9ae37da345610b03be325d9d793276b68342447285e2f5754182f47b593f756b8140da2293df1fb097ea478e4af9c0ab3ad287e00051d09d0ee0b9a6eea3af02ac0c570cdf27254728e5aa123766bf8a6a3d6e18ed1d2ed9d5fa457903ac295368ca4d6329e955d1e8d9d3565a1848845613a9aaaa2a38be600c1eab454583f7debbe805d1f40830a7da40f25677d4425c48e203186000d541589f77636364495dfbbde91e09c1bd0b48a48bce58123f97af537916cf2284352618684e7d1f2276b1d05641755eb9bfafa8b6dfe3d5af4d27a030abaf97431a0d184bda0fa8ea4472f8ce7e8a9c52eea8c4b7a3e82314454b27834af0e3503ba31eefe307d46a47b06d42885a176e2bbbcf02916b80b14b4810c68e9240253ec11c38a889917b942701b0b462eba901b54ba90cd8acd84eb855e5c47f494c471527d0d82e027981fac603fda26a7639d665004566c195f2391d4794790a92ea68d07da4c3868410137fa10896530951a2b90e967d0dc88c4055ed756eea75949aa5a5eb7f6c28f64966dd4e439e3b8b167b82be28c7fce187219d02843a8fd28d36131a3f5ec81702c79d19018051ae40c40fcb52c7b0a02b362fd1b6c66659dbcb40f10b62affd1b9d013c540acec15726af48f0c39a1121a4333783f5b0ea4e97771944a8b6e4494c30bc082f0d7c4b131a667c9bccae910902fefe0d7f3246eb36bcb14a1b2dc7a660d404c1d811bdcd57028cef6b8570bebaa72ee96fea5be6baea8e424c10eb280be2231517042ea995140e5145df9f91cb1a3e7a4fe7c7bff435c33397c08aa26917a0cac76daaa044103075b13959da5c7fb2134cd2c8ff6faf530c032ad0a9ed271b93fabbf11412b36fc8eb5c95cb613fee8bafa821345236b192585a291e944d61cdd44d69c5f4b34c3df3b0337b97981ccb422cecc6fe03e0d2deaafd47f4124f580422f8da8e8b9eee33abe275881d19295ef82d408be80485e7fa2ea4a8d8a6457862282d0094f44af6a178649ed8db84f5a813414e9c3a410f4e4f8988b31f4629b621758a0b7f2d173d507447b3f2035d9a83d6c7d5558dddab958b0a4c2c4db8d989dfb26e8a0c215344a41e72beb894b0d5c0c137268e17f6c04b202556186a052cabc8b9e7bbed40a3a281df8f52f7e89cdf365d313d6f27250e64818947f95c9513c08f1159dce86e857803ab7ff017ae07b78048585c7a29bfa34002b6a4f31593e5b63859edf5e38a0f24d860721dbbfa3ae8c47c3d3379ae1a3980a16dafe6eb96069f917f94e58c0a535854393de6b6d997256dabfb3a2a0afebd5c4ff37ff172c5dc111d91483550ca0d2f58b97478d77cc582495079907b95f54b050c7da05a7dbee7921f00018ff0b1637b321c61a894dc985015f9782d53b93b9061bdcdbaafeccc73f3a5fca451e3d5e2fd9b47fe762dfc2f897a1e61520d6545cd015f737b3284bb5b8cbaceab519dedc7cd13159b0fec3bf88a112b3a31b30230466ba2b4a3230ef26815cb8d5093fe6c5510a32ea884b20447e7922e2a9dc602271494de0b7fdcd83fb7ee6963075cb20237c570352aa7b147997f9282b79e1964061942ca05da73c1ebc70f9df8915437a2c03e4f0329336a923fc37c94bba4a2a81b218c6e68be62b77c1c231482a60ef6a402f9450f8bd411311d255456fc25c621e4bdef2e6121b621dc7bc4d1b0e2631ffc824b6e9fe3bf1d04fbc91f68d4ab2530d7022ca556da23751fad63bb42f44f4fc73e5ce06f2d968d175d2fbe74c65054ccb1d90b554c282b9b1c0eea8d1094a7bda5697b2c1dedf64426118e00ced0d1e963803fc5b58d5257d07ab90692de0b74ac9d701875809421637afb16e7e1fb2988912acb186c6810368f119a24c1e0d8281875c27ef6634c3b3698bcd045ffd0eb08c3e3c92661c06b5a224b34b11b2722f12461f80206548114ac6b77ed618d1cd17a3883fb6cc72469779efe15ba9e8b49756e2704b659d1c93f4476b60eca807e4c96e58773d4f07bbba1f57f25d3ce91fdbaeb26e1fe0c3d9fb608315752248d4dada2dce8d4c58c60878d0d8669e811116f74d48b3a327b38012cbad04101dcee82689b79efe3fb3517dac00ccce4020096663a537b06fc84485aa609c8e5c6dfc3e119df525c78d33bcbe508703cc143922def14a27da742a0b8bd8b727d1923cc0d70089673b7751d7022510fcb96beaa38e38ec30303e8dd17865bdfdf3faf0d1b892630ad5bb0273b0a87f342c20194f350cc6088d29e281c97fb62bd5948b1007e05916aa7c8672e35cc4a08bbaa4d80a7a7d9eefe6e14a07e31fa4cf5ee73a05be6819dc5f5d5c1a56b4ab789491a72fe8e79939c8543d99126f22de1460f65d41083c7e160089104c808768aeb6eff62e0f3fcee0ed2086e3f6222309c3b62bf38ed0b0a231c73122039623a4c6dd08493ff1c50b81dcfb07ba5361177952f62bf0bec9326149e596025075c3b699c849d90219a1ee5a9cd8f05ba42c0722066d4d61543928bd6ffadddf3b4aeb6731e0c800533d113e0efd4b609dc998596ec92c258fee644f192ceeb783b5159ccc7e3a2fc17e1cedafdc044359ee77b354aaca17c77cf86ccf50da50c964dd3d15312a5b10c041b6009111524745955ec3cb1144da0c0423b839973ec76835c869ddea3d685ece3df2dbc6b37cd4bc91c37a4691c10f53a116e71f5aa090b37b0cc226e744cc839aa3b4c1098d7dca23845bca70eda9e710e5c85a8c153da5bfa7692f7d1300e50ff7754c68e8d9e996532b8cc8eea277a40c8ed541cb4be5c9a542260619e06155103fc57e1e54c20d41c8a2051f1823c7c7b560895d3a2a53c515b11894770b3e45c6f036c3251b92e87bfdc4defe3c9e9e7811d672f1c366bf0a10950ba9b5b1cc1f2da178ff5f8801a6299b8f50fa9e79e888b7e9d4b170015d88e43b4af1fbff49e43124974935008d60a58b3f827adcf3249e0fe1b03e92b427d5c4c687584b1dd2504cfd2c9dfa3f95715d637e70bdb8aa8fa19fafaf46fea39d3e14315b91e9a9e1e22c3bed04813b356dea06d7ae767ab8f040ac01420eb1cc22725dc8e4fa795fbc49e0d3fd87c9353a03861e4b9c932b9ef30a48b6cb207e2d852c6df09c89299e45c1ef5509c02a2ba2519754da57241830197ce7918b4c97f4632f809b451c7b1ca36dc22d935e32d5c0e04c865771fbc5d6dfc868f113284174d12071f948494d72b203e29f7325580785c77a09feaeb04e2f42d6c6dcc1de82d769e50cf258ae7185d7ab86e5c21cad58ffbed8cd23e92ff02e6447e84e164709781088258e6f5acca0ed0d8fd3641822c95eaff2e8805fffacc288b1cbc34f73938aa8171466864d9a27377071ff74af96c72e7b7ecd2187bbecf86a7a609810373792225de6ab1f797356ea5562bfc35ca0a2fbead5af66580a408b9fc03dfeeceb5e3070c9638727b1892e32a0b4de6ae78af64b59037b14c29b4003d17010db29bbab7435c506cd4cdf6290fb59f83449e0ca4b599b07ac9e3ed5123fb015e5e3824940ef221bfd5b7581931af4fb782cbab7020bf74c0c84d46638e6e675c774572582bc3edf55f98cd380535603d6a296cb99a3e68c45f04688943860a4493cc429239c25ad6c1a6a0fbefa2abe95185c3a4f4235f504ec7a1995ec7c3742c359b49e84ea5f5234cdc78d94704ecce208433a7d3e1116e4ad74116e1221a74ea859e88c2e3f1e0a63809c3e334084b047a2b487a51463a5975540ffb13a0e8db7823dd07a229167820fcf2f930f8687102139bfca84da64fad77dbdc9c6a4cf53e4ef7ce2e6e5911863e8071970895d3a7a045ad802a2f6b520606f0b77536d163e40d4fa57ff7ed05107fce3dee2b56502c9d880bac1fbe7231be45d64ec4c391fc4f9b47932e65b55108da82acd4c968716d95a81e3f99480635368d80112f7f95f8c3830459e26096a3fadfde6c502717093e17b3bdc0dd0e4c2fb7138dc2286679238bb9645a6939b3c9399730eb7efb794c5ac73f4425fd5726121af756acfb5f1ebfd03a63321699882737056222431271e6155a65c1284fdc80baa6310ae4bbe6b28fc8652a2e67c1633c0bc2ebe8a2753b8b62f9c5f157a49978120536a6e3cd14cd0f1c4f2b9ceed16eae1ead91f05dbe9aa4edc8d970ebc5c688e36bd534b4b1c74300e59249bf52aff6b9e3828db6044073c65fb3aa9d732bad102aebba42bbfc25f4471ca7e2257130146d2515f32bfad227205c0c99587e28868b6a982a646467d887a926706a1877d1518e6e36608dbb86900ac0c9546648ec38e7d2ec625a8b65c3ca8d6394037e9a18cfdde8c03f184dba095820817146edbe4427f1ccc21483296ff03dbb6a348752745ecd07fa3e3ca72c2781547f9df60a29ba3500a12fd38512b22248f7d81ec8feb2b45ae5dd2ef20901f2919fc94244e4a51aafe6e043c132688d47d95eaed671594e0ba19945501d4817529a7fa19c2738c9254c578ef90822a70315481af494033d07eb024b05c306b499f9467d7fab2cd3c9523c01e9747365526c9b82943bb08e27363922ac4af011a3c940d3f4a264ed959a58eb43f1d61687eff9ba9990f3f5706c8baebc43e7e3ac55a1c94e3ff679a4c291d6a7a8bd6f71520b145c8427c758455ff6e9cfd1dc754f886dfd0ba0b289ba8d07e70f93d3a5527d8bd691802a9527182ee05bbe96c9ba226dfe77b537291b9aea36ed31b4569e9d58d4fe819624d467966e9862b954fbba9344498bdd1440b2c4ca293d08e23e68a392d17147608c178d0a30937f2ceb1cc70ae1ea350b302ef6b98048d4f8086c12d4752e77ae0022dbbf80341e86c9540d09a099952e44f0b7b3a0b9536d870de86898f2f0722fb141097e6ba2fa523fdabb07d23827bbc719e9f8ae99a415c7c232768bdc5208c8704b74b466a9f1934136554741fbb4267578e203d77d307412cb3ecffe3ab9a9b4071079cc89c9bb35e2bf0571a66250ef4b0de004a2820e8a64308ce370504e9f0769c235cc2a0aa3d4b1d3261820816fac0b931edf31be0aff744b7ad1036d72128243833ebe60209b93c08441399acd91f1cacaee0dac0225515b2f444b72bf26804fe9032e84c60767cf82461c098f6ee54bb7bd63a884642d7980554bd72f7340c084e405e83ef56db21448b9919d170abf1edf0db4826a3ef8abc85cd6924177e3f02e9bd193f57b54ed413af4a65f05778e7c77bdfdaa0922224f3369048246eb4020391ed1136c7895d932fb8456a5525dd4c16ff3d8b40d63ed8df3ce3949b6c99f4c12c9fbc01833f66f834905e47aaa111c0acb44a7b77dbb64ff5b0923fce56876464a7a2cf0410f1c02de4f1586508be2a4934ea8eae5a001988cc93d0c6670ab5fbc1c2c1dfd4478ad225128704f88e8c6e9d6995ac674ae232391110e8357e3a30681b98b0ee7f0feac96ab612a9e769084c4eb01588e055d7525d8ba958b52ae6828824e987f2dccd036833ae337c73d23ea90a2fa7b50e6eecf66cf0ee55a8b0f44048431424e006bba70d6393e94818264bbf1e5102662ab22bef7e3a06540e67ce22595814063fb256a94dd1ac01a6f4beb420a62e2f1695edbeaf1bb24559d4fcd4bd231cb6db32ac9c7334da097bc961210973c1b466e56cca7b00707628a7ce00b1924317159b5e26dc4395a2c3dac02dcecdfd9d6d1546809d5dde1855a41e6cac70c6271ad2535496826035ab7719135b09d571fb331b91c077b1a0ecb0d982fc7617aa1a98fb8f8268c3cde815a94d433cbc292fbf5212c08894c76fccc470663847ebbdd66b849838da5c3e66081219425c7f804c1fab4c2bfdae82b7e4685b89441da26571bc73a027b51ff1e21cf8b87034950ef8b1fc50c0316c97a3550e7c855197dc1d7c132e20180e52b750a19ba6eeca1d9eddc1675d41a7408b0b12305762a76ca27f7fa12e67f04390f05372b3240215373b87d7a81b151876db45dd971a5584f48d9aa8a52c148761332248d4408ae84041b31042fabb270f55e475259653111fcc8e13224d4ae782eee6721cf84799b6fd687df457e382b21be638cd5d3e23cd76b85f48fe3bcf1d3c252f709f1a6f6c523530439cea26ffd1f53a821c162265d81274a267ee690675202cfd45a94166f29bbb6494ff743fddc4de60dbbe3cb753c5e97ceaadc5f6a1249ed0331a8e11f100bf705a1c007f0fb938fa7a978a1ea5d884bcccc389c34820bd9234c929fb84990e2d17a5285ce62a7d0a4f130117bfcd60e453d7b975076957f21b8f351cc2a41c8fbb97a3755563e3a8037c9d62714e3835cce82feb5251abf261256b4d8d20d9a2a2d47edad9f0b423458eb6c6702c64ccd3269ab0875b6077f89d9a1119b19e8655c3606ea04a26a674dfcb2a493e605c7a909913709148a2a5fadcc6f75459f66408a2625674b64b54286061a8a6a61aa5ab549b38237e9f82d61c42f8344857a40ed781331e016e3a74c9cf569dc1d18201925357f07e2fdd894ab9a493396ae9e075d624fea46eef7c438c930128302da5c49e79e63809bd29483f0dfe62fef9ea9cbaad4885aaf3957cd29e39842791db62974e9a6df7d0130762686e88a525a40648768a43e78b3648c41d7ab638e5e02f90a1b7460287a914e8c827f8d2ab83d1d320efa6e46e63617177dc45a70d9e2e027845d73629f739afce8ade63b4f20789fea223174e31dbf004223c88a0f7c7bde42c1eea06f51bc7804bff3d984d7d4d8d302dfabaedde65935c6641768ce0f23cb2c81c214cec6611353f2e3a4a2ccf9f9fabce691e7324d8dc273349da39222850bec586005df99021ae7f78c4933c7b664bb98626c18222cf4292cd66bd5eb60a470ec6a8082686eb04cccd058b7b2959f5f4729354eafd6fd2d3364d5f4342bdf2596eaf8caee506e9ac86dd9d36e54b80508bf4829e0606d3b7efae3c007186cc1e0985f82f944027ac0296b1330440dbcf2200ae12a5fb8c076d1a33d0ba3891e09c042df9f3cb0fd9468654799661042db9419e2dbbb60cf3e0d31b938e7663bc9515aaec0e1829c0ccbcdf06d4b53d21b7ad70098f3c8dcdb3426f3e0f58c0f0df3580c5dd997f9780e63b5c9ba02f4f0008bffa38d3edb992eafe06b1af3eceec520cee03452182e684892442c6b948836da1cc0605fb767260084f92e17c1db6086d09c53e2848b07de13ff25d92416e0c04a7bc74b388adb942999de48684c9765eb4d7e0814020e940f02288d88e287617893dcd47cbe979b40868e7bac74b7dd32c60c26519fe4e84eb10b2fe87c2bfb4055e0b75548caf6e28abb8fa265204f658df1c674cc09f6fdbed093f55d3ea0c6f4f905205d7bde44ea2fa176d53f3f2b3bebe0f03e4fb0aba26e1144017c7619db2351f38f246f990b11a4c218cf1722309715871c3b918eab9d68d43fbc46a77a3859828468c022a4ce4a0acc1f4cb3787f32c9a8201505d5371eeaf254bc088691531ee7d622b87c8dd3fff4efc3035c2289632f5c5d1dda6bf69a65aff78a3beda9bf0efa99e3138e960660886327476aff48db4899faea7552a6bb56ec5415529bd800fc5db95f03e8ec8b3e09677313e039358a8e2459fa243160b4124d9fa45101f5140d08eeec17f6510fa5b86d90cabe7b97bcf25572e1cfb4d92ac76987b2e85fd74854aa8554ad8e35dcd24e83053875f99647c59c505df1d721c9c0f0dbe3758bb1af10f535cf136b9a75c4e54ee886e6cf9083ac233bd1a40315aecae7debc0400c81fbd3192bd7c7942d6d0d5118e20e2849ba8ac02a1bc73e022b01d2e3a25b14eb71409be98e6742c76d00de9e30845f6c00001096d084ccb7c09aea6bd05dc241fff5bf5fb3e8e9f6eace803de465cbabb197402f0048997a36190e05d5fa4e190e574827c7a41ec319bfd5d642bd2d30ba464e0d0aa375a16a60f869eadb9c74904a9ca7f515a8d7116f981ac3d782493d3a88bf061502b89fab666d0b988e8254d27cfae01f439f3e347e8c18d596746980593ebd36485d3e68ec02c73348cd8c4153fe7d2e2498fff13cc8b68746c7a0cf79d08cc04896f05e1597d4e3bf28000d707c2d9f6b4586ec9d5e6e2d0b19a6054003369e293628eaeb8e2a7697728a89c21e5802676a038a2fdf04ef47e8d3169b35cb9814b4e5941e16b1f7169261321b00da0b4108f0b714f50c95f371f03829fff220671e40a9e8751db0c58ad71884fe712f6d529d4c6b429681c8b790a25d882d86c47e2b3c25232ba11021d321bf48d44b68808389ee6af95e8072421961c7221832590260813b02e3fcd151a44ad9ed57204edff905738879a6001d99251ced63ebe55abafdd6aba6fc7399b49f11824fbd7a5ae01113d1343c986d2d501fefb491d96995dd14b8f18a8f737bb1a73ed9bea7772032194d83b1354c1999f8a339325c701c050ebf041b41c97b54dc9fe3d18717f2c4393250b8708372e0dfbc510548d94bc3f2a88fbc4048af93c445fd0ce36e002ca816550307ddcfc27e0eafb020fb2c00cb4f22f72bb87b8677465db40e2e31af278e25d27e1513f442b56115919b275285c76e1cc214c991f2fdcd641528ce02fafeb344556f6701373659154ef17416a08fa90b0477ba490dbaea02e934769ae0cf44390576bd49cf720a75adebca3b024ac63fa2911e285bee54ffb691ea07b61edc046912cdb7b2d7770202a4612a7334adeee51782a980e40ad04382bc1a8a0a99383dc816a6f4f477047ba5b3165dbf39865e5073fa238939ab0437b9f9abbc02dbce136c19906942b8dad4402d0fea9fd503adb6f7cffa6932ad8910373de37a19996c2e3c1431bf42cb8046b216d041be1023e9e5d16596472c19fcfce43f7851379a6cc6ba0115dd7ca0185028d6a8203111c9e746f365130d6d13d6ed5205ce9c62b15bc4e32e8936ed18ae2591184dc93cce94dc90ed67f8a1c8ed99cc05c6474823a08f5fee3e1dca7f827e4c99e2440026c975ae5bd4daa9d733e233c151af1f25e78f13810f2f7faf458570da11ac6661556493ff3508e903228020dac3c136fdb8dbc8922fcee6e0dfa52391698a5136dfce42c9cf55a828bd1b3a05b91a72b3f6f262646ca55133ac4a72865c5f58051ed3ad48f72c442684a4cdcb598a21a6b651ecb033c7f6351510a3519abedd4b0680b6021022fc2dc53d87f456bb6b54fef0e362d69222ec28285881d71abad5060b261849a92ab9a86732ec877895f0b205d6824d40d8631d0b38142fc10c1ec565aa12b00654e2e151ca80ac10313da8fe962ff91840ebb01f8403e24593917224b650dbe3975f818eab66e147133a5e52449b73ac06265d80c2bb0d32e8844825e5ded1ec01a774362fa2cb78f68104fceeb0171dce65cbbf2807706e61ea5a9da8c4dc383771d634eb2e7f7b1805ebfbdc1835b5713fffe024bf16f21bccb14478f2231630e4bca41ee87f981b709b1c7e208e17d24332b870b757a1f722965147a30ef1dfe3432cdd1aadc36666011fc73b8dea1966525211f817eeb5a466a98a101f8c376b36709c8c1114be4f7f88921c7685295a9544b30a0c4797ff6d3226b3e09fb2d0a02ce581015b65d83cbb64bee0d1f87151a6df1ef3aaf90c776ee95953ed0895b66e1ee7bed30233976e15d95d998b51b56bff71df5a63336533b33430ed2a7467ff60137cb26eb0ddc20b09e33c4ec25b1a16f216cf3d3873573e035267beec308cfe5f5d24268b10a7d470ef6f6b6396c76615d4db988bbfd3f7d8d5b82cbe715e5474c481987f19a70b4b8ec20bbaeb36bdaa2b3ac3e64cc861fa04d876e9c6af4fc4ebb877258b1360906c5b5bd9a938a8738a54796999bcce8ba154ed12e5f1d81dfdf0742408f8f8e1a20c535a7f2be0e244387cd1490742c6549c8cb6f9a76a3a29aa8dca9d3b4b00ed46e79a9caca9d09ad413a77ad7ba2d4966899bf6222c0f565b21e8f720506ca05aa8b622a625f9d26ad11a451c4e71ceabde2d1ff1fd7eb101a172181e104c52349171ea97117c2778b65bf12c0f12c0188298d0aba97938ed32266e120ff35bf3d0837e9d72d06fdf85427f246a9671017858f2369c5047f3108a169cd8ea696822a0e10098c30c3a85f4e8b4cfa839fde0d50e0c0282fa7a68e311b75b1243c179621b80c319e65043bfde3c51a6c9313e6624ec89eb2b1c02e3d3ff14b293db54761e89753224b3ce2f12f098ea978cc30ce35b80c467fc62775a82e021b0e39fe122a4b691428b6c433d0935e0988eebd1740a626b89ce4d742fa3050e59ae1204d0408a2da82c7bf3df4b3f1671b749e4fb2238aefd96520a83bbb3e6b417bc8521933b9a2e00a3d70c76480b82e17a7db734efd33fb7e7b4ef86cef756e50dd0400efc5c31bc428bed43b860952117eb114e69a780a7a01dae6c25b63a199bdd8f0a6d4916ca7cec6bfd48fe1b8ba4ed36b242ce7674be3ee28ec90c331e0f554d80d627c4c26c3871c5f572d2d33352f09fc4e2a3436fa1358f95658152a8f07f06ac9f6f810495ee723029c413c7c6f9e9b55deb65038e42b1561f78ac1599ae05d0aca3ed35704f52b08721bb96d08d40c3466e23680411a5c75a32da4af17e41f895781d729fb6431114d2d1bd2ba8ddd2dc10b2d1bcf5dfc1b4fc91bb97e7a82f316207d6ae4b807fc31b22ee6a60e3df9741ea9a2a83764ebb5e1fd634367712ebfd339d3aca51eac092298a60e40d1791121e0b4578a1366b0db12c9420b7d842df7de327e731690c410c29fd803ce8d68a7492406c3290a1b2717bd110a5489c3dc09fb41f98b060618fd976cad6508cb6e6b91127caf8480414f90000e19f28b73fe8f39e451e4e9b6f223470fdc0b28acbe0624dd23b1f6c3555178ff5b22a3a15785635d14e0a21bf52e1bda4f82a6c5b9548124e24ea68f80d6d567c0edaad3839af7548fb9a14af420303c891558739dc83d596f8177ce11e8890d306ed078a7d987f49b517f0b4be395296865222520a594033416bda513baa7fa4fdf4a494a732ad99545217b9805c2b0362d10da41c5b37fc7047a0d78bd15a64171b5bb7d264546c5452e13fa8336628202fc478703cd56d28b21a0e5887402f0a8077c3d0e1bcc1c55d2f4799ed773edc357ae9d09fc3e022dd081cd5a61e5090508655e60633e1cca7d393a32ae9f57322265faed1214201840f1fbcc1526a78fa59ccd26d241fb4ed209e21381776ac98df31a4cee8a1a732e185334fb0f71890df065111a690e4ec85213cebed94c5f494d11ad3aab85ef45b7a48c656e03efc33e592d4c61ccde629f1c6a5e451e8a4e147eb58a237f8138db74ddb437e3968cb312511e27ea0445c327e68bb1aa872cf5a29089314dea7b175f2695bdf35a4603e34e68f98a413d8faa05487338191960b5e05932f5b3da4802012723b45521fc1ffad7574714b1d85ef5eb60aa1f8f48b46dd26ba8796e04a8fce3f665505f85bba1753504ea05bb3648319fdcfb764578aa354991811885df4219da17e4a409aa4d2d9d4a0d97961bbc5e5622cc12894c3f24e9ccb6a9b1545add8a788df433712811f2f85129611767204c9fe27b38cd71ee149e32cc77b72b8321d54c9464fc23b93c017966f3f04cb1c344a793274e5cdd0d1747ef5cee327c8e08cd0e2bea3069026ee56006d63f8a7dffe7344b3a12bc547b193018a16285ec6578f6d2a712bbc619fc550c523d718d78daa9e0bee2f87da13299a4d0f7ad664ca651e0e5710849b2f8278ff6c09ba0c62ad0d8e46859f2a0e3ee97984a1a411488ebbaf719769e5a30bcc88890461fb547db523e1ad21b4b8a9bedac0e79875529a51483c04201aef49e371329aa3c5995e95d8196402031ec4bc9a676db9428bc0911af56e1b749731f0281e208ab102a523f3adf8344478a0076924f70cf0b7da1f14de07f0fe13f2fb1cd3bd2bb9086138af73e4b148e0f9356c50aae224378d44ef8a8248933b16973eaf173e243def491369ecc88c922e2abed5768f56c543b16c2cae2c622b8aa2ee732ed282ae30202c227cb621a4e283eec435685fa0b9fad2e6764da29e9ccd125d0a1d6787250092a8c18b8c91680e97f078fc71ca2041abb4c53c731194be4ba73fac1919dd805810ee70c5845b8741688c94ee3646053058fa2ed26488a01df29d3e8546d690d117ee608f91a560b4af10427f245e77c0f7485a53f692628456251c34dd4b21ac871ed9577474a6dd5716ba82d76ce5205e6323b7df0ec6087e74498d1bc86c8d71438bc18f2e4565c2120fa12620a445472fbd5aa736a6d561fb10c315311b8eaa28a4382c5cdd0c15f44cad8d27e2a29049b9eb46c0173b074ff215d2e76dd63a76a358cc54d351b18e5ad934b09ccc8b6b0608523812424666a74d6230eed86e33d5e2d12e49032559c888802941ed516cf3295d632926f2e219513a42523cc773bd1e71da8a0edb513f5b20167b0f66f39410928a767a5426d9ae0c48692fc5176ed18aa4ef19d9796f1032d38b2935a6251008aaddd9bd0da76eb6c1988a2a87b88dc411b36e1feb293353ed104397b4600a381ec8bff850b9c80163e2a36002ccadb351bd8e65fc64938bd47be8bde92186cc3e5e60021440a877614ff128529716e5299fe4368065928ae506fd0e6082cb260cd0d3c59d648b8914fc73b86198e8a5f66b8867990f7ea2ff6f1dc0a2d989d804d7d5db55209fd0b23e25c9fe66e48eb729ac14a587b3972de2e77c40e745f7a8f889eabb6865992f917ac98872090e04a37540edf870a22a1a93384419eaabdc479e3602c955c4162edb5b5dc1cbd6f23955e3d6a45db78b1cc71d5f7cc345fa1284b24af1e816ec67353ebb3164771900b02fb508c0bffba75f7272970c574bd825cde84a98156295188e80c7d234dc2850dfaaf29a1c1c593d3687f8150d235953c2f00c33309578d994fc68a2fb011665667eb84e88f761f62d5e0162b2393258906acc94de0ce6a94e227ec271d616b56b53dbb9b6dca5ae2688735909b6c48d31d6a7c6de2173c3b9c109e7809fad5231357eb9c13dd8b61fbbd5d530e547dcec7f0b064512503b69269510fa2629c3c13e10871d8c952f69a471a97247291aa643044fa27b8c626dae3af9db0d90e7c66916f95529d724bfb799b7a9159a40a8a4a130658d2f5428770ddbc58e3214a081d876bc9268b101b763b9085d08a4025732119f578d4d8a2f08f237ec1c573c453061179858f871324046dd6cea284c0edc2194052201ac4a91a28ddc6b46791a11201f571bb00c20c9974dc279d352cae59964be24a1bcfd865ca2666daa221e938c6094ea260a404a60053c1d2c063689390a6e43df96d5e1323f5b90277b930cc63385dd823165c3845bb16ad025734e422da37798800da76b98291d1102903893c2ab0f2c3a61ae9cce3b9ceded62cb2fc710e113ca4713310d4d798b78583c27a209f9f34f7c3e151763a7028cadd8d05d8f869f0d04ae9920bed63966a0ae56f25678ce856c60c0c04986c68c09a5c0b71d57ecfe5a95f9e0107083ab3091a675361200a5d2ccfc58d2ad8fd83d22a75849ae51395d67a0b260bc378af2e37e54a1d4787e8dd2f072ff83b33725b0747547535be1dd4dcb1a33c2b4f48f131cc447c05f075332ffef8a22b0a9985fd627896507a39a6473dd4b365c9c7800dca8507c7dfb5f82624f79e5a99edcf76b3a67b77bac2d0fbd30a73a235f222a0b223b845baa3a58196974d68ba2306e55b5184d12be4f4b41407dbcc9cfc5dc2e4a92bd3c13dfaa71233d30670f4ff27c887e975f5246d53486c4466c0fd5322a1e4a2b43e01d27660a93e1bbf7bd0ba9537fddc55b40ef0498221b7e0e82667c0e9929150821f8e1dcf58b431640e2e19836c43f388f01805666f6c52f650acbd44a93e0822ea0942160821bf18805c3e4bc88b56a133288e15c79beeb94078d01b3e4da513c7c4946181868e4bfb72d896a93565de8775fae3d4daf1197702014460f76afc68dc63a4eddbb47ee94dbbf3c510a51e65b2bae82a71025fb2840e7feaa97bc7468972004f1412c269aaf310861764260e5ef142a21cefb7e25835e0dd31c29f6587a3393d703ff6b644600e003fb0bfc6bed9e8bee56b22ba27e8dd0a4cb8dda33ab9747f4f9532e209949abbd55fced9a1c06eab1cbb546c6c531f0cedb466b292bfd4f5419f8f4eed3b35a77740b8bd4261d3d116fc27550695f81cf7f262d1b6cb08f796e9ca98a38dd121fb3d44fc0f7f31f38ed8f10f057e19ec1e54f891b5597d2605b9665e6687c51c211dc5e63971e3cedb78d16d6b235665daa9b577fd3986dae52d09a05e18b9670064c73fe0be16a3562efe975b396815d0a771c4540b68e5178bdba7b85b996659fa0d9f1eeee1b9eeb492562ff17c03dbdcd0989034f79cee8d73a82d4eaf13f7f906e60e5837553f9a8e9b9f4417050d8d16250f58401b602ecad63972b50f9aaee29762a10739a48c610d6be1a217b8a54722c3a7546118aaba7135fc03db5143c5b09ebe3f4869c8aad23c801c6031d2bf1aadec33080687058fd398150a8d862b0c6b2665d3ac0259573a80d991a9609e1934b8842eade04b1270665ee9d26a1481f7b929f889ae1a4c2ebb72c6753bb21ac22e3be4bd0417d152e9f350d42eec6e1b88a526fcf83d2846dcf5591cbedc48a22e808d5cb20aac96bfbbbcf8d940262c0ffad2e600785d9f137598e7879426194ba7e7aabfd4b98202909e83e884354289a8418b05a8644fee456b5146849086ba99648ab72f369639d940fdbe83decb05ad506690ef480304a287466e0256ef22789cc885953cd4a8c38ffffbe6c85055f81295ed331e701216e09ecc7159855d0081d910529014ff10439bdec971642c3f968c704cf614d8f6db4735e234321069d3d5abd3427b880b3548f0a01a30220d19e1fed01205ca9310c36f2d518149becf5b45d6c64f17d2279a6af38a774e0b74894291d37f571847443dfbfaaa3a1aff2fa8693a665220e93fb070f89dc479ed3ad2ea41e678d44e96be25598b0a68f091c834db0cc0b65024f9201fb20bcffd13cc97030d5fa9c1069ada2bb1de7a53a9e9a321cd6249a9a326d1400876ad166f6705e1b3c6c01103d4aeabb9d1fe913009e453867b26805bb9f9519883662314bb41794dee0264c3c559383c9e40e5ab5f4bbb3cdc2ba3ab5cd7373256b1d6b1b8eba618f315f7b8ec3599268f02b63cf3a970e310e597c4dd226e55ccc580c34d9e519fc98eea35b257e06cbd40946f7a12f964c6e4de800b39107432bc55e381ab3f1ed3e4b03cb8a60f14e3b0f6050e88e88228f11daad22d49d027a364c4e9438b6e0a8eeda81223778575c3219d56fb9a1175c6671a5a74ece960378b2dc8536317a27507c4f204ba15d33a5fc9972f6f4a7262a1ff5b00473a3c3a12d0838dba2c5143a908118b97723b0031a32a0c530cfd38f31301c2ca52e32dd3cab01909cf4f69d59f2853a94c9f6f5b3c0285bfa0d5782f927ddd7e062dbca840f8709baf3720cb216e813ae2a0262f9bf3dae900aaac3e11a0073ad86b51a7019eaabb5f3fbe3059e5bd3efae4171e0063f1024087a6646cdedb039ee1f4c74c6d02070185bcc3c3ed000e2edcb1b545d8bbebb77967533c6a3bbeb98078a1b3c6f1129212c7aaf2fc4be795ff47cea018e8e6e583c9037cd2d455e1bc12d0023987a36636602d816d409b4c2882ddc3276d2c9f895b720704e0ada756291117d51a89e9dca63d89022a089ecec771f1bc3e5710bbca6755044f63b3f1feb21a9844f9e108256dd15fd59c9255c5ddd5c115734eaad4b0949572a5fbe7125bc3e8db6c8a5458f08625e6941ecd4c4a9c6663a0143381d30dfac3e642dd86e852badfec1cc3cf04c682b1d2a33c34100b42e8a6d7f56611e906c553a8caebc5348eec50dcfecb3473c8ae9ba498793e10d3bbacb473353e503e7dd06e3e2a0ce55fcb39d24d45c82a6b78d1ccf3bda398c78c2bad255edf7d99ab3432e6693cd0291c73967088a8a90f7ec0d16cbfac1fc322d16a3c5374f99ff314992a898a146f01ee745144eb106db4731515c9a48041ba97887e5cb46132c708b898dfc9de5e5b1b98003a2f8257750b8bd4618f090da7b71ed4d150cc6fe5e8a8897d6ea862cc063224e1b606efb87b4407741773c256bc36a1577e1ed2b9883948d8d52f6f862a826cb5427dc31b105fabab9f5549bb8f6d453882eaa5f5d5b40c7e88b4292869f079b862918fd7cf7b9c80b046322b9dcc9e8fb706e3c5f80369209929cd3f794202b415e848fcfbd7d4e09ed2d244fd3740b940024be85e9b15d877ff10f9feba9ab30c0d11ab6c210099d112b8835c501076083d7edcc18e480014338f63ecc267b164817dc24d599876a3f830c39dbcf8e64b2629b599387cdf849d981e94e829c262d7340daf87549e34221479c12aa8e19156370ff9035436c98df2cd85e17fd4743fe415829d811b3637d19b5d9ca3de40dfce50ad05b88c7452ac4b77438ed319f0c818751afd2405d6cf6e43c13c895e2210fa8898572315de613d1c79da73dc03fcf141af251a2dfb7f2c711cb56ae23abb9f00b5630a11ce8b493700335de8c8597aecede951db1cd5bd2a070ef2f4935ecd786cab008c924ecbda88382e3461e50f9af811f3c903f300d2be64ebaff2e9acae50dab97a328ba0f11b135c639d14ab589ecb63135d7f0c4eae06cfcf0bef177493484b469169869c966dadc48e10c2570236335291b21ee02e153ce2ea83e355e20c4024026ccab570dcd60b42eea59e5789043445909aa921be52fe7f8c2a2d07a47347e0197babf87332a2dfe3e64147b7a11490495446f288fa1858c89516cb001732fb4af81f9f574cb0591189f5f986ea388c25b136c4701e0335097b71b684803855d68b0a52c48914e3c2eff5973c0439c9e8da3ba93dc595013403bc9b5512023d5fb12ba0063b6a0674de8409ddc771392fa1bd814bd33b8e751869070031c34d3d2473cd92c0558cf13834af002b7762aa628bf13ba43fdd2dfde0b812b49615285e6bf46b65dd0205b107c826cc4108a922c6286a5a52ec8d1a05fd9618040d945d9a577e51b9cbe1a6d8d826fa80a099996af6487b5a3fd122765de58f99848adf35134873576e8cdae0d636ff763ea2c57051474f3700c87b77080c1c3f4ec85d3a0086c8f6580e9f1c42142000d92ec183f28cd99ccdafe72cf487bc6de56ef6a0181622caa62f2691902970f6f7a1271ee1f2c1a4348110490bf104db09015bf7fbb51551b0f1eaaa4beb0d7840f7e773ef41518300710f67b3b097c5628e958c5043f2ac1de5ccaea574a949349735048fed4401c93d21cc85e25f92154ced883189aaac3c35bca246fc1d73fa54496377b76baae78908921c75e0c96a3f4b76432e31f56bb063b16bc3986706c6a12e54d30306d96718f80068adb6889c814d0342b3c59c8d74c08f821682c5e6f758e94fab84d2846eecdb5d5c87f2a569f19bc0969a168fd9b16fbb8b4421f19b084075e749b1f59cbb0516d4eb14f2dfe3630dc6cdf02dad7808bb1c5b743903a0f52f0c6059d79882ee0128574d1b4411e8282c2d8ed7a4a6e4cd5e91903515a68a31ac72b8fc0f90f7b80722b518c60fa3092fe02be0a13dca05cc8c9da408b1fd0ec2c234ecde3a015773ca3ec7281041a52c8464adc661af8168e0c25cd13d6d11f34888a6d1c5b1687fc9abcccc523f0761451589f7e88eaf8e890ae98dbb4240d8568c95a0dc74e7d9b37c6643acc4f1b07e7b414f040e263336b82d19a400cc283227ffef2d0a78b0798e2b4fac04ddaf2f65ae45fdd8eaae9fd625d148ee2cb8a962f37fb90dbe9803b5bdda309dc17526dc6d00dd0a9adb3f82b8da312cb041110e43ee78bbef9da126ffeb5ea7ab90d093048cd22374a037724bf1155bdee006d0cf5fe2cf1cb99850c7dacfeb76a3f20b8b4dc6264f77505dbc6c1065239a8e4052f9051614476db56e496be0593aa3065b26313a399be4fd7b9dc9d0e3464159fb25c43ea66ea4de67217018da8e1feed7bf499425446e320939a933a0e737b9b0baa76b51dd28197c888408d762ac60530fb1d739b0132c2f340825ad7cbc3278b333931bb1dc8a7d9cce2cb041a5e1e989daf07a5869774e865b6bbcc73f544a4cbcec8c999e29be6f1acc9d360ab8cde5609209812a071ae80ed3522c31429e1c39b04262f426b68c73e750a20e11367547a0d59c0dee9c16f77903ef469660494f8caa125924aca31186711d611559644746166bf89a220094be72f8630e31e5aa760128b94faf99f157c23972897567b202a12422394680198eccf7452046fc2ba821fbd78a86017e0b62102e1a227a8c6ea72239c3d996d78bf48465da23e4f4b9d568efe6d22ebdb0f16b04a39735e3b0a5fdff2af0ccb6a91fdc6db42a59ad047d603348b5214afb2bdcc2f19006c1861dac97c24d61ccffdde449a6c20ccc106e9ed50b96f386e0d32846e922ae8106563740a1c8070a613768995a178eaa926671150094b937945588a726c2275b8076c9c9bb139a90f77512ffac2b277b25d0209305d58a75387480f5f13f7f13dea66823822aff33de86a0fca5c38543f553fe96bccdfd0021acf0b2bb0e37db9d168b1e49eb533ef76dddeddaf06e8f93cbb846a35db5524e68c88ab403b3df0422ed8e9aa8794173d8c16af7b0fc291712d3d641a57d6ec87152639d6d5311023b19c125e29777feb358a89fbec86c262ab804965a124d0f2a76de25c9f06d6b4d759402323d739456b7ec58345aba8d6b5d49887e93ef25cd1c3425b34db297e41fdfcab77686c37484737a51a2a0f97d4a6b4707392371140367d1a4724762352e054d12ebe8794e7f86ac70bc90d8e720612de7f048b61b57fcc4399b6947022b1aaeaf5f36aed95b56ecea6598c21b545f0ebf992e763fc3392c31313b10afe2fdbe4c63c38646dc5eba64becf0bbe70daff6c65d316acbaa53ad54604668480ef9ae218b7a4c5f336b254b784fb791c60928553828cb39e4041d3d30b202deefea2a8d8b37aa06a746915f4bcda653520d963aa50ecc7eb89273ea36a9af19ef1a4d94cd8009141390105db30417df260a213fe185ee8b6cea18ac9350f4ed2448b0c3e900a01f33e4ea7b8cafcefc7f45f7cf58fa07f0b7789c5cbff10eefff6f224e2b5c6f430335b88c5f57215acbd7cc9f6acd08962e80b9830c612fa7a1bed5a3fce3358869ecd6b7d2c692eb405bcf4f8450e8810f3341242d93706eca851a206ad5385735e8156a20270af44e10e6ff4c6ca4acecd767bafafd0a7e08ed46a2ff8f7dc83b8835af4ecf30075bd984101373c220995b6009fdb909ee0ac92aeb762bc9d250ec458f82916c62d854ec087eb48e47b5ae0613500eaa2a32d4928f8d4411001042086950f0f9664434f086da76b928b4e51d0a9706e287dff8871f458381a78cdebc0bc41675132f0a8fb4b9ee58f014233024f21422833e2447437926bf7c3ba0017de90bb03439f3ba4a5ae0c544f1e4d316b1352ecfa8744cfa12971602f93880c1c09f96768d9fd4c26f6eb8683f55094af7af1c71884f8704bfcecffd3f32dec8e0d6644d92f42b47c0519782add9cab157598e408e72bd8dfcb6f54e22be273ae42677ce06aaf200bd80b5988e7feec4a09019539f3c77a2be3b77904b9d65a939316e7432ea7a5007016be3e2b95a045f34922aad445d1d0dba2bb3dc0edf060d3121857b89f5c3e6c8fa484a892ba1eb30af740baccb28a8396261d5e4805b005def94a346bc3b6bd1ac4969a61d0279ed2e98743e8cf6e6ee786da7b3599ad5bb55872fcd566c1826d59a387d61161a08ea39a78d4eb268df188471e4bc97508597c5ee9010151639405f6092a6a2a36bbd70c254400216fa6b10167c6c4a46967e2b84dd05f543232e281a5af55cce511f0d9e0476b9efc6c9dd7e971cacef2af6389d58a61aeda27891d694cab497a744efa6b18c46bfd0f67ab1987923d26051d45264a1ba70bfecc1d5e9a1ca2fc1e9e38d88d6806f2fa14b34a523f6aae1ef6dbd22726001f33ca3217989be8954fb0590a5c71a1940cb991e15540a1a067ef4cf30fdbdb2885ced6ee70b8c2884b82694924c9da6e79ca2cd48cd6193c8d0a40c0c2fe98e7c6dda1511d28e9e4da7447afe149e63324ea2db3cca0dea012d75ad9d4e41afdecb0546064d3695910536dab53c8158aa941fad252b02b4500ded8f69a8a4579fd426208fb3a2e2872990475848b1e61fabd22415d0c9621fc22fe0d8e5d47df44822169e32562058aca47d6d955571c9533df0a478aa8407846930da7ebe147793181e3ccda8c105d386a7c43b78b375912daa9cf095278bfd1d44b7990434908ca3137d3f29f2312d2cdc798098fa039776c8e8b8af89ce481452c1b3587fd2cf1f70f0c0b532747cdd0dd473445dfde342ab91b471f0ae15e2b2651a853bf1e64c64ed7fe8609f99302287e7298be172dd76128259dbce4a885ba58ac5729f2706bafd38cc16c8394801a5e0cdb654298689039ddcb986621d0cc93eb1565d8db203395e38856377d8b6bebc40d9f6bf32535a4825d37379b7508e1c82a351c97b74d6bcfb54c89e4b24e684737b2745cb237f15677826e34c83e4955e293dc52bbd6ebd52d5b719d2ffebf4b9eedac31bd1d513eabc1d6777598288d04901e9b95daf682b6d12bca76676ef351801e1752b0a90858181869fd939a08a4a2f3bc8e4c02dc92765763e5596d831093cd82f1666655fd43571d98a47d0250b36c994e87d28962ac9690158aa3df3985095eb4f87f37738de93a3db5961065c2b310814ee1608cfee989646fa0222b615f92b259c155eb29233eadf819cf485464b56f871ec99b4ac21065f89638b25eaeda6a4a36a8c552cafa96c63e771a02ecfed8bd0ca06e783cfa9c007cebdad0862202b4252ab23f4a5c85b7bf803f1e1fc19773d777a3903abcebe2fe2dc7b958fa4eddeedc947b0b2c54d2dfad26278a73894899aae3e969a79743788eac13aacfb85b5d1c0628e921623b5f3fb0b8c0c686d4f982c27312e6ce63c5ba1793a36d2e40ac06eba5d2245e5ee8f2b65c80625a205be10b8be0a057cf185507eae9ae679e1c9f4f6b9416c1ae363996f4fea316dc306e65734c708d58141d4aca5a06855b59bafb7d3ddb73cb1d60a42dfd182d6a8a672b47c66d424ef0d899edaa5d6adc3e696bb3630c9c40eb618ea6cca4cd89e882f4b948d9aa2c58527e790561bdf897505584564efd36b65370f89ad05f776ee698ca276f7999f6684144ace066480e9483c3573d920a7580b8d430698fcb3a839fb6bd2a76b5a9c9be5ee334389d9cd95fd9b32092d43f8b4801a6e6fa267429c425586f599f4b8547a2c7424463ccd38d2d93939cad7988999c311d0b5184ee98c6044b525ba55860017793571cea41c3e38cd32217991913567425c24e748093290b8b4ad1c57f53a46cf06bad2b2758d2494fcbc5ec69099da2f2740a0b087c591a1b426294173313bc727e06c7b8c9cada076a301abb94bc91b205c93dc267ae76815871a057437cd0d4d1c99cbc7dc462df15c940654ef101ef77e3f4e58ce72e53a2228a7c9d9eadf77c5914d74b27a3624e11b0031089028b1b549750fdfadd84a41fddfb3cd48da731f52ba240a35985cac05823a4522a8184902a37afcec1524b9d37b04a9883db57fb3693251fc3c3f56c184684530980d6bafe62e7ca1a9a6c3f281beb330c4b1b56a4af069b89d026804be080c6ae51eb09231aeeaa4b5de80655efc68f39c087a09079e7a6ccd2d2ce861d067418bbde71420a363e6bef36de7f6b543825107289d04801cf8e7bf15cef9ed348c1aefebca861fbe42e2728785473e811a81b9f361e27a7b71e5cbfd9bc7b0120cd99bf79043bc62c1ea488849b14a3f0ac904e768f548996931a23faf8a663a49d8f2285103b150d43e9db21866bd02aef1297af1f86bcb1b13a4d3da4ab957ef2f6f3e4ea096571606a9d3fa10a0b882f11ca309d75faf141df9dca7b8573f631cb29bb3613788c3c2c6f8858f9d7f5345b9ddc83f90311e3950280279bc8f9d8f9454776ec3bfa580f46cb3501c63ade84fe795a01fde57b1f750ceb8f260b2f552a1ba9dd14a3d65d48fff1bd70dcff8ffa7bb52eb293d26e6bba19e151bae7d0d6674ae2e7ec1dd3635df325238f56051e7caac8f6b0837e6cb1de0263169cf3d78dd90bd0d2a81686f68a140304107c85600c1a0f6afd216d83d8090c88a4f3748464a2f130061d44262c790094b971812677e03c6b123c06a677be7df81e0903b1189f5b986f9afd26ed75a5de7c7406e14c8ec3728a9ff18846ae535761f3fcae0496d91eb028f0115a7caba80f0dd498c7d6a0ec1e6f68e8d5cc1a1df90736617d1334cb08e338449404260dbc3205220a4cce9dbfa01e26e783cdc50614b7ae32d6c76d6d60afb554de1f571b1c9e394b36df722bcc956dc40f56949f8e1145b2bebf7013d521a6228066596b0b1b7a9a3a6f31d2d68d045b2f0db5f6e317201ecba77c6f2bdbb227898212fce70b07c27bf8797b9919979057d1bb269e2982c218b4fa38db41790fda8531e2a926c69e430e9649e0df1fbc050ed2393b6c0a97094b9855748f1a95178c7f3cccadd073471185799c19537bda24820a2bb8a7c5527c78e8589714a936147a95248f22cb0c827ca5d872ef9c4e2540404b0e519b3298c06140f5d244b525b02b9b3f40d7f539c6d95306c8bfd7643430902173616691b546a98c9a3a6b3d59dacc1bd5dcc79e758cb123ca969d12ccfe736743706bf50a503b84fb6ae3d1c3e137465c34673b2b131564c2a3ad92779b9c26c2bab110a8acbbc41621d6755ca159a83f61d8984693c2017dbeff985dff57d0ac02048e765e22ae13db40310c2fc4782e3e9311a9e834cd8da08c27346a8dbf28ebefbe0a6b8ea320e58b7e8f8499294faa7ceb5f727acf0073a5880fd20e55eda7e4d49a1dac6e49892b48de4421f6d0cf441350f6f6ac3ced7240e1f5add7c6f35e09115246891bfe01ca637924e4382eab0cb15cf1951dc272d855cf1525d0feb908bde4770ccabad348b25e9e93b1efc70b5849d9f63367a9219381640b34d07b0e8d8c9fb0a63a426964a984098c2900993ac61fdc9f8c294722f99c27ab19bcf0b09125e7b54ea5615c83abbc57633a0a5cd519196696ae2553c5df7b68690734b36a57b32ddb82e4567e53bee45cca60771c35708be21c1d687270c9ca21c6ec2211b61db0ca50515602b67173f6e8b76b7bd17be80003f92bc8394fc71ff8a8fbab003610efa9251d25e4db45163df61ed063b3c21a926e998220039e49b31520a55c024824f79ad22aebe8d704a35710177de7d27e49cf76e08dbb75ec0c29f0cbe0fa7dc6a2d0a99bb33d0a6e4831563adf8c353076ad0c43c9108bcd980927e4993d07d3fa8ce1909e2326718f48e5bb033002783c18d4e094445c436e8ac0e42419d0a38201f12238f7a83761952a7859d2d173ede5f2eb870f58cc958b0f9b2eafe329f336a2f9f973697f4976e0cf845aae90dc91f31af96d746b920eb2c4c445475a28a2a7e4e3280e7d62a911c7866d13c24e4020c496c49791c15d1dbdf0d573dbea8dbddb52da9ab4df0629d88accb8ef1c523852ae27e8250c6289d676de7a07139b7508e711efa602398e42c8d8222081578887d0b0c0e3183f290ffa2ecb1e74f6140352a6ff51bd643699b07d3782b16ded4df4cb2dada6e5957a2d3803dd756e5552f56fa1b1415c8d64c5b5f203ba6495bc6aaa2c108fd8ecb8592a5f4b02e0b1b7ddc9ec656d18f6753ad8d526a350561ea71f9894b999079ddd6eacce31ce25188c76df09c63f208e2e67668099b9175b347c22a3142cba39a9aebad31d2802c805ed512aa7849b6840b29cca9c0b09bc4ee67aefe2f68b8835fa1aa814e1236006b30061ce90346497358bdf4bbe481dcd0ab1e0e1237d64571ca03a6c07640c6986f0088010d02c7ff5483c74871d8530ee87e92da447dc103fd9a159db04b8a4813d82fd05c06b1562b6f926bc826623683644e3d1904a4079b104727692a3f173e0d01f72970211e572126ba3a7402d7286fcc83ea7a9cfb574ddb0cfcca97001c809f07bff9460acb24c6ecbfe984ecf4d9176c770900be13dd18cb2cfa04df77015c078ef9fc5b38d52312e1da3fd6e661884a904e09271f8912c005820b78d23fa6604c00a78ee2c3aa5e09450918e9e8ca54aac0f86a9a8c9cc66ce0cb93170506a286552e026c1ed214e4bc09b85543a870209b8f7c08b8b0ea1605f88790d20a48ee4474fa306cc7edb8093ab359956de1e30c2c9ccab2c09cb55c8d5d390b110c948f9d2521cc4de0312b0cc931f94fc676b7b7d74d2aa30b3d0904972c5a54957860fb5c24203205ec2ccc945480162f112ec313d4515399a191b38e4532cd7408a8964334a6091958c92c39cc52f56033bbfa910655be33b62b1018a3252010a210a1df2f90385e1b396072c1f65c7921272c5bacbc6e97b0579f1dc570ea2471d2f04d7df1ae87bb3ab9094e70e6cc4bd04d43321895824869690555dca0af24b795578c0272b0d89f3580b709b0e970138c808bec3a89993275ffae602963df2dbdd3bf922bd2714c0411be2458bbda19b14ad2f9534222163d6871dfac045f1819f657b29b6118a7d0a2e4c8f990bccd8cfb917166eafdaa29250b6fbd793ffa84a8ea04da760930892ce9bc1890263122dc0ce54f4f479e44538530a78764d4e860ced618ffaeb376703065739df50c13dcdeafe9385e6cc6318be12eebe9289b6171a5e766bdf7ed52072f7a051f4c5b9a72a0dd3f41dffc1bc468b20913b02c6ca01d6740a9b332d0fd818715d864cb7fe7611b1eed421c1233f8dcae2698da5330623e67e058cce10db5af80909d60ecc373109b04eb0076de91fffe70c62d4c6a1a7487532dfa7229e3df70e348e7dd67ce3ef88d0f2b60293ffd08d98c7b9e947b62fa52986d12a36b115c607505e98646174fdcc704372a56ebef8867e9935b8ee0ba085a6ab63c2810c6a2301f0e8d22ead862adaa996b454e0391b9905e80a2f1bb50c626e4bde24f08fa57d4aeda7c92b0120b760fccc564ede44d445ef423f9321da252d9e7df75335388ab9dbc1f94c4e4910221c30b176290969cf29991c551db94bb29e482d5582cd1d9435a400e803c11e7cdcbf75f1dd954d2b8dde32ade676804e8ce4bd96b48a04ee93abc12afb01046467d0ef4c9bffed332c51ad66820c1ce0a31066a123e0d37998ca95173dc5ac866baf0242eb2e11a3197928dd0b9d93d14b99a9e78ce507677088e44b6ffa1717cb2487ec683ce61820367248f015736872230d2de90cb9ad5a7e78ceee7b321321753bfeb643b405164f1563bb3cf4eaf6c05801db518c0977f54b6530acafbf86f9a37cf213af9327aff7b074f0e6cc986cb00a00647e20268224f9fb74e3ee84e1f3aba9aa551aee9fda88f904fee917b5f6e0e46857da7ea08ed1504c8d6b87234d2b8e085b4aaa07b88660349ae1ce844c4a5e722c311184beb387a09f5007a048e11cf0f9a9a791663e9c2b91bcc35fbb79ac456bd7d5cb0ff22fc584c71bbb72e07ac0024b8c18319ccd7d33d71f2c482f6df2221fe2185ba847eaeb0c23105ae3315e3136d9ed1cbbb578773086d54183243bd43f40a0b3a9049b457f1463565def93fc9c7cceebe28432f18e033906b50d3fd878cc51a137192fa604a08908a4dce6312ce31aa398a93139ff6b65fb1a36e3316456ac22ed44ae0141af0e2f17952aa51619319b3d3c5e4b50da0e86bc870a4b8eda4709ea7d89a8a06aef183bd4e511f90804c94803d5306de063f5190565aec3d952a1a307a3a77a18ac1211a8dcf0820b76feb6ed48e8b41259987feeed8218dd42abc819001d2840d15c5f5c71be18161c62edbdf48cb75e27ba0d15cdc7a26eaf50028ef27432cda4661f60b29bddc500b446f6f2b94b4ea5b5957fd75eb43bdd73e2e49025b3e1a7e24305b744d3149c6ad2db02585e8286af5de863fda9ec07feea88e06ca6b2929fe80a7a02d454bdfeb947ec0d6e3548c23452a0cd22ed483638e920b985834ef19a4a289e03f89534e0a39fdd4e6966a551cba498e5a5e879cbc6622db00bdcdd21cfd7d63bf4b52e8e56b4d94aa83e3874db5caa90f8ef683508d47ff6eb5c9e65dda20fa9bcdb8225619bf1165cf4e5956e94602cdf6127ce281657527ac4276febfe7de1202adef335f03fdd88c5186f957a71f06c57c0c8ddfd2ac7047655cb4a296229d43a4ca67a00fe9f6c3e67357d4e5e00c9a6f67fc4515fcc9facfbeb32d664a6e1c44b5dd41e8eac01019e77cd0c7726d4a7f22bc643521edd6d2ae286539c9febab5529500dce01ac489496ae775ad9bcadc51f576a795998f1289c58508bc8182881c1312058f03168806894a832a49089aab3ab76a9ed495da09a66906d2ddcdb884ab1a9d5e5aa9569011ab27806d0981f64111d42899e8663dfa0aed973cf374f13f6f83a55966d00a9034fd621126e3c7b528de7e46c6487f5da393e491de70cd2967dce2b4283783f0560d1e200ff924dca31389ac29e60c68a3670377dff09eb0a83979e73845e657072f83175bdfdcaf130b6fe75b95a83d2477d78c6db9869fd376a145625d88c1e5ce369f38e054e182e750d22c3798680428091f2d7326f71cefee5300882a0e6833ad3c7179779b5bceaa0cb071ed63c7fc55da0e9f09d3ba3ad0ecdb2c68446ee88b239860171517297a06fe3c6fbe1078c0e4fb3c9acf95518895740fcd1b9060d360b09e70be74568919df1c0b497ee02d213b5ead413c39feb2e577097f76234a171dab8a8db494ae71908743c70e58666ff08cb67ac8d2f4cdd93375b2c5dbd426a89180c2d016aac520cc05fa5c4f584df9e75f2cfb9a87094496748ef3149229cfc7772083bb8c4c392d86302db10c2d596d11d4d4143e3f37f5d13f12f9c9ac697543378b7289b2ba4e2477dbe323d1330e0ca852c86bcf0b7aac2ea61fc5a215f4893d7583283d0ff4d4a6e4e2833249b9602f4fa2f8c897a2486d2adb714b424010772d48b6f9062b44002629b9babbbea9aaf0bae4eeb6e0a6dc1d6c36aa6b7015181f08e7743c74baffb5acfa6a8042c221ea0e05aec992ceaf0caaa02c0f3dd7f1614a49cba60c78d8944471b2741482b086325d327d61a34f0fc24567e62a97920f1462502ea00d55246a8216f953085348ca2ebd29660b8562ade02b7082a67b7b455f3682362f489bd38380e919f24b535a9ba245b056d082ced5059ed0f5f72845d4e51b0cf920dd901561d43e4d646a7cc6055308789a6707e15f4893af3a178d1516fdcbd464734777f726e452607e17e9cfdcfe48d1d4e40c0acdf063cc64d2e1ba0f3a12dd15b8120e2b9c65aadd0e2b703558ec0201100bda759392bd8ab5c2141d75f54550d5c58d0995192c8b851e6c5850b3084460f9c9b5ef9bca3da1ed9451d88aa9c8078bcab305394301ee14ebd65385f8277298faaf6b0cc036508482694a615b5c83b994bb87ab22c351ad60f943d5d958462304b6669eb4441312dbf392113f5e7dd2646c15fdba174ad7cd2050b423ffe4f7f4190330565bf6dad739428564c99b3c4570c224661e97b0eaff0597c4234af4cf1100ef4c470ddbd5f8cdf277b1fcee0155a8b53434c90941bb9c754a94b35db90bd2517a1da3d417bfbd68abc5c0696b7b0dee45aee8f2d595d3c104e8bd5f0c390e4c0db1c05140fd2d6b11ec456bc83a800cf54a02e803c40510dea0c67ab6ee889185e0b9b5b087e8e23406ff1511efca8834bea10fbe70156d5982cd7a3e201d6fe513eac81bcffc39c2d34924d52c08cc7d8fd0625c79535c664439ccc8397b03f72f617e9b0b9bc76dc24b957d2790d44cd25b0727fcdb00b13974df5090752f75e776b2799c9682e60771bc4f86ab7555544752f113b9ed828a04f48fb4093e10f8718cd77cd8bfc425d7b66169c9e29ca0c455ec42ac87ef137ebeeafd10604e98199e818ab2fa6cff40ff4ed4716b2e3864f085fb0bb2a01b1ff521aab7b5c28743320858ffdd02cbe8be45c39295ad4553a829f322c98a0e555a9860908474d8aa0803137a75b1d11ec715fe8c954539a2ac77464a01fc9b0b79d715d137e5a48461d889065d506ff90429ac59310c15e7d129eb461f298a91bfbce3296089ad0d643630eaf6e1d4e34bb1f75cb6eeaa202458d0a09de13a9613556ca3ba93f0eca8fc0c29e91ab3993f86783ca02e6529611ce9bf1ab0f295de2ec59341925b595bbb20fae9df717125743d73f6db3497018b5f744bb562ab40d4d555557cce7d5131d1ecafb41bd1ab2e6645490407f496cf89b6a5de488a7d0d34c48d85fb6a93df8f5e23fe6ac8c0b2f92cf3456495f9104876af444878d7f240792579d74966fbe438fbe38fc96a53fdcb6be44237e447cf860a02d90b5afe310631158130d1384978767cc0b39bb2513de02af7b33a9322a3b7edb11fed14e28de4d623a407d7190289283f8817264895d0dcdccf22a45a66d87a4a7423874eb008dbb9261940ee4e149ba44ba82c308afacaa2a302e7024a5b411928534fb05e0b9ca9845e039a6d33fb1c8c56850a980bb48f4594ad57aee4ba881aae5caddaa5eb65b3c221baae07d7cbcdd3f77b032b32b415c5899d8114021a03c142fd01c464f15b68488ee2133fcaddb7b32c747b7a8be181f363bb7b375209840a15e7087de9743caf6e5bfdda31740d50a441b469d212099ccdff6282eba78c65691f84621e2f6097f4f2e443eaeda2a6a06b1dee4dc140c105f07b6469bbf3686e1ee8a917ba34bf40a811726d17a3174fd4d61783626d84121b18f63125aa6a2d515c6dbf6a97d13c694e0c9af3ccc171067097d91d5c9a1d8bde3f007468e1cddda1eae5d35859f15a93718f0e386a4a1c45b93f79df2ee7482633fff874c70a7071026d2732e88fa72faf8e11f69c892cd1ce5446a788b7787164f37d84510292ce028cc08738182bc333e760c001ce8d57814ce8961cc1029940fbf299ef41dcc4d8cd9755711793d43e0948bf3c0e679c2d67ceec11143076604d3f33c8caf6a8bafca0605d89c2e180261a00bf4f7c7246ac93368c9394ee03c353836bcb6178c6b52845108897922fdc5f4f3e5f616c1c073f95f378c46d15774002e48ea700d25ffbe86337370e3a96efc59cd53ca1d6795c29eb03461786de31ba4ae8c19608966c5912303e9e22cc851d3ecee4dfc37b3a00391f7104a77860a01052856debf24ac6978b016ad62276ecc12be35a2ad71a27424c1d7051e37355b09c5c51254744f87eafd9a9d0c2ecfb010399564c6e57a1809502f1d999c257f94fc89331c9bbf8f535f593744432ef86c5b29e25735b6ae638016d7dc85b8b0e8dacbf3bfd99e3bbf79cd27fcc9bdb3ebd5308a2163bf5abddf435630ccfe664d6a6400263588e39f403f2455865c4b9d184854185484ef08c99863a913e08f96b5ee8ac850c4f3d54ad4730cc9d4d4c61f64973fc27a61251522993eb07e51449ce92009a7c38937ab8b4177af37f9a7bb01cbbc0b8582ac09913f0b34a09a6a724ff89a0ff4e455c6d14e9005652dc4abbd1f32822e1feaa8b1041686982d4d38ab4982214e89c7a731eb82c4071667382d1bc0e333e587b534e4ce6bdb26751d47cbfa7a8f08454cc49e26ad5abe5c74babf951aedd859bc42e95e1711de40b36e8abb97753cd0bba51644eb961059c5eb2246dfed23e5a09f9f6ef130590f6259b17e935e075fa34e061c9295c96a8585b089b68fc78191de33d21c77123cd97279b575fe5ce5d4a38273095004054ec092658f0a1e895273f346e9463b635976b1c4d636820090b6f9a513cc2806d54567056fdcbe262b9ea582846fdfbe874be5a8de6c4652abae14378b11ffc85dd6f333f79306e9d34b56ea56768b57e5d70c374a97143f56236d051a58daafa74798a9854c47a9e4031fbed5cf63e290b49f2b2c317961d895d63458e03d42abb24f61f5475ac710c1a5dd0d2525c4fa7f17f14d5639325be01266140a4cb59402d3c7e62f23309d4a948786cf7c305a99aedf8f94ed65ee93c1e90824db082637a6ee4ff256886ff72a8760c991b0d14cd9e338e075865224af78a0984199e2d4205a1cc9773283712f0098315c117025732e4887d206e424a63a0144e753b4577765210dca0afa6b636cff7f997a31e6516c728c2f434039abbd188f1e0992e36dbc5e01047bf01a0ce3ae8b5c60c321a2684e1fd824930e4b75ed9a353d1bf624e674404a82b45157f42eef4131fda4905a69f25d3f5ee907df792d3fe1df36bba606d42d160924aa621f3856822730f6cbe7e4224fae39dab4fdd77916353cc0aa738a31b484d28e0ebc11ea73050065c1dce44c6e484a8ea4e3624a4c61b205fd6846a5cf71030a8bc07e904162634165bdc2bad6b66a5081fa8e945c34072b6d1fa4c73a13fbe9ce2558e33a1648c9a55ccb80bbbe090a489f59e49d0ab7c393766f1a9dc169700a0ea9ac4e6093684ac010975646c184105491738e1602032555329449c7d4aee70151ecc198eba3a05adbf64e94d4a38114526fc9051107fbf2422e861b801e129a87d1739c40787097443c815b684d814395dc740988e022e7b13b8e2e4beac053fad6e123414ddfbca83b425b9b5a26e19ac1c597b0eb8761392a3df9af1c7f786bf83970e82d3f09e438af4d4de891890599565b815a8f281af598d7732b55d0d68622751cf136549c9fa701c60c49abeaee5daf50c99a94fcc8c1ead32d599fd3a94f1968fa9e8bd992477e4089a2745b0811a1dab5844efabbb61c6440ce278dc71a544dc70c4f69687f716adc1d796c1251f51b35fc604e3b18f16a27a2ebe83880645c81a1979b2552244528ffb3da289c41a5b606a91fd72a793a0719290b56630dcd9b4fd65f8dcdb1e3805d067c51712191e51dc4066eba534c3b9e4a253aaef47d26e420e5282735fc8fd0a549ddcb85c56dddb8dcd82c49ff474dcb518f833e3d49c0143f3ee6f4c5468a3f59377b23304cbd9eacdacce522103b0cbb614e0b86799db52917fe129ff3e5a0390e5994bbb3a7ee4212862ac597f51d9f997bd6a55dc4669400833e93b70abc0269fc4d78d2811b86c7cc4551afa1971d4d606937cd27086b57561f9cb26325e141e7824fe6964b86a16613394976b6e405c272243c8cb01c544f5fd47c84429798e5b0a27821b2e777146800398dea9fc6a5fef2d27cdc94f4b99d7042123c1b066a1b0129a9c5bd76ae3ac745d16ee85da9bdc1e98067357cf6a7b256da9ed2e85b28ccb44b675dc9924876657db31d8c773a56ce9279458f7a41c2dcf3107fd375c1d65ced1c44b6fea4cac18061b9b157a0225203c9a99a5ecaa3bcf34dd00f4f2227fb6c942f74b7b10f6eabdb0266378faa4570468943c655ffc36ce3722ecea36e053e7c28f02a5010d7638404362540778ecd5ccc7e09813bc83dd48e9bdc6e4ac88ca58e538a650c0744245519651a51bf0220bab2740c221f637138b9f458b1bf3dc1234b02bb9aa4595b31b4938d881b4fbdfa3727fb7b18420de7302c498293749251f7f18a317d56f4b73345b299a1341135140836097b433f18afe13fac2db0ca6c5952ce53c4f7cdb1e25c0e95474dae379303b4a638c432e4804c4e73edf8515af6997a09236e7d50296e24e4b7b306e6dd2be3733fb37aea8e9377a28761413428cd234e7e7d62297c1020ae2f12b11fdde013b2910d75b129faf9170863f6ad30a8f37713d78ea6fce5d46af32b372b112910312872751e1843ba241b5fa4c15214e6e675e145881ab762ae4d76bb6ece585e16db4028b0495a4c7a16d2b49ff64ebae6cb21db35a0ba9bc9d58044778408c432c04bd8127b6fbf7167e25e80a518dcfc94ce3d6cda671a67fde99cc8ca192f235489fa7a7cf43b5e1e37d18da41dbcd83e6b40f1b6a26fab4e2f566ae6d45ea331797b234cb0919fa81e256d4335811cccf78f85c12c8bffeefc6d113ed73371c597e375699d449d4531180dc7bd97bfdd2eca83aff74d791f6f98862da506d083984fa6ad16763b0e58ef9f7e50cfae2a46e2600bd52f2e3b9f9cda729be0f8b77c271da9957257c55f8b5d6602ad916a3c39ad92e69181a5c984ff8563175e99a5ff65b4e4e7176e9a8d37d391ead520a2ac1afe6f86f3d155effbfae29a6124ebfd3e8d289978a39198806c4f5e220488f79829c954a23a5d8116cb6c1f3a7f968c946474d7ae89c03dc98fad031c001bad3463e1904da13d7c96540ab7f91dbc3fa55d5a51fcb26185899a6e4f1820a4a029deaee63cab9350144041b4bc0ff1f798f3005cdff1666b20ea20a662443164e271cd7f4b8e0878e8be80371dcb61affcbeeee9ac70b75dde28ef8fa0f9334670f78b210c606e2c031cae0690fc1fb35668368bd90df31805a7bf962d08166bd475ddb3d0b8e3982f40fe059bbb92b5c2a13ce214ca7f9e081b61f97ab9f76290a9e5f6952ff28fc74708cec47dc17d238e4ece5fa39ec30d3702a095d62c5697bbf1b16a2896d900cb8cd4da03845e67c169b1be0943632a70a8ba10a59c72274121577f06381c1a942e2d5d3037a598cd77ce452ec9005bfd85004fbde4ef92e3b83d0a3c137b620dd5f1ed42627a6c72182389615145be3005bd6f05712035d26b420e23b30ebf96f7c2b8ff593b915150835b9fb41fb76314e224b714ee391325e7d13e0454bd2101b25d62df3959890ec951416924c7cab4a526f309159ff695cabfafb6c307ba804859548190c9dc3569ad5afd4ee0dabae745122f7cab0d68d9891bf1e56ad88e9d812375882572b483bcfa43c0209531d016401585041a5bd4bf6e7493ede00140e093c0078bec78fbda77dad5409a558299dbc82a4864a95fc8cbd79ba7220d236cf9326d31aeea287a0c14fd37abf00ea929990c84b97b0a3561a51d42585670f56245b54cd39544b415ac7f22b0d54469974f5f0bef8e22a788f7c0daabee88ed228c6370e00eba8d52f39e2e81eef05fccbfa4927d82f9605d5b59fea9a37276e1f5657285d35227893189259253eb155657ccd11098282088515351b81ea5bf58466859c1e548677e7b5950ad63da593a0319f1d3007976ca1f31775f9533d362666f422ce334285e7baf33c887fe777f67900f571d4bc30f47810de6edf23fc6cb95d08d3689f6472684cf8d9142d510999d62e743e50d053dc228e0a71f995285086e221900f3af0574978a969a1c816fb77960400af781a8189bab0c7b3a1d3dd94f7b72f03ace29a8f7a1d5d5e8021ce4c9a0bda80d474af5febb981db571e0bdde13aa3ff5921a63ff1d6d565be3cf6883b6a88dc6880831c6141f12e654c0fc53408b1ec459bbd1b3a3079d937bac3b4acacdf7c96939e979862892d4264bf287659593f9f3285a2c585dfd92a5480934efcb8f0b32171e059e1e316fda13c4248efb6e8df384f572cf0e01dbcaaeb0aa3be46af58fe06cb4f67f9a30b38cfcf1e10e7fa29a705b7feadbcd2fe921a2088c637aad3c1f211dca78afcc86ffc2b2ad08d040fa75a82b3721a454f6c95eb6fa2f34b7663b1c1a73e5c05de62a23e74e9e0adb91a5c920144a81e0d31b28c93083f3cec7360016a7c15eb50d53873e6f3b5e8983d50af3ee5fbcbb24fc1c351fa8193111559fb3525d75f9650de951b13784ee0d06bd8485842ff9b79b2625343c451e700597422f2122f1c90a94fe04eb758598fe6a885b4f695e57ba909ae73cec804d984f3a9e3902cb81e5d1feed178ce03cbe7fe3e8a314d7fd6148fef5f5e33c88dd4ca3d7b9b8929f0f7f72f3de0ebdf1ebfffa98fc7fbc5c6b04c98fab81bf15305e205d9db51745979915e6b5f05b4bdf613a7a63b7a700fd53663a35370bfa030cfa7a68078834001bc667159ea9ca07ef09e960c3ff9db80e38102381814c9144ca20c0bf7bc23ea5cebf0a28a3adc65a4a431ca518b2ece70a09dcc8e458b161f9a6c7793d6fa6ec7809219917891228ebb9b0de49b44ddbd66604b666422053fbf9bae3f2c51e4ccf8a28352d5013cc1ebf0e94d54ab6416a1e4e360adced29f73197a924cae1202c421461c3b3220bcb194240fdc42d3987447086399ba784e732ec9143e09b8113cdb777ec2b9cd8328aaa3ce09326ef21393d08661bd7ab0a869a4177cb3dc9c2c7aaec24a01306aff2e8a394cec601008abc55c0ca617f721288802d8bd8cbb7179a6cfc1789310dc50e3fb42c12e8ae37269037e0974e72df4c0569f7f51a54716e9264dc8ebeca679ca336afc38e717c8aee094c8c18bc3191818b4a606f4fc0c887a2d7c198b9f182508365d00fa569a123f97a35f51bac81d8b040b1082adbcf56044cffad857513c465eaefecf42eaa715ec60ad40a8285b21e843978132451bd1dfe70b042dc82a47c614b465fd60656944f5bcc692eddcc150703c585e5cc030512a96949afebf99d54fa93b0f127df19030340bd5f7c98e79d86d74f7939734023110b4557dc122d4355ddf787f1e9603d8a6b39ea2aec8be07b36eb3cfb17e8bb68e8fc4d5f8d0151c724de61dd56619c11ee632740cc6e91d00a132c38881fb7d5eeccd7c491f500432b267ff8104ca0d87c08f3b3c5337eacd71568a04f423118e81b2e4770a8c206772867207de65cc294cd0c92ed7f3a23b6a468f93ed03862cf1ce7382ad4bf56a105622f1e5a45076fc96407871ee5b5d4c25e1529d03a322fafd5b70a312d9bf8d9edf2d589b6de2c10eff25acd788f9df2bbeb864ef978a75409e2f14d80dad739b67ec0a4b9102aa319e70d9513d2717b12d539980e04cc2889173a5257e62795979ec43d53d832b122974744895235bbe3b7b6718c9f74c61274a4895b06e74685b8193bee67fd7bd2b6250f13b3f2ee8d9e2b8bc4b3833a1870dc007608200bbcc21e3101e362414177ef0b7e5a0f213e096680b7d5303d051e94d599d9d1d550b192f5b74aec258306a9346b565e310cd0b46514773958e737e00cd340e30dbc42e5de6b6173711ddb2c3bd69d17faaca8a6ca59d13362ad2ccfe2b43406ceab1a80b0ea8beb194ab4bd4da1a91ad3fbc50b0589ddd2507a4b42c4b49b580b584eea4a6d6dca82d28882678051af5a7f7f7867bba470c22cac98183565120390928e3933440b1307df5ae4661a534da425485fb979b8e70a683130f50c727b007ed10ffb2f7293db88622a0f37420fcc11b820a8d874bace9c0decabe0973044c1a5c52a31ef61f2d883379c67a0df5158c42193bb7d1af5626b8ecac59fd1b03137587cc9b830f9f5bf5a9401299e7ca2df9ffdb8115d5077a60b67c243a771b3af3dc099c087a412aeb1fffde3bc61b396eccefb9131811f4dd70862d867577e9a778992243252229207036f6249e27f7e2b91318d1765e860dd6c97669f099233ffa035dc9a5925cd865b1524add23b65fcc915779912df22ba564bc99699fbd4929e185af7d55f18a2e8299b3fdf313da58e13c17999069d62214b74e82e3a1f46f0223ba2f96828b78bc74c1edf9f95b8189eca00d21f5d33cccedfcbc9b8113e17eab9b8abd9d5b3dbc06e9489c84b929bf7f53b067c46019cac3e1a8e7dd9f28d6b466294e52ad1c5be2ca7daa8066820a031091c8fdf8b84e0ff9777ed7b8e304c70f0a45b7a46510ce51579d2ef57c7aa71d9cf1a3bbccf8b1c2246e2868721dbaa82a2d9ed13b6fa9acb49ac1cfe676a3f49a884f4310a09300f2656eb4abe587bb77ce0307ceb201b949eaaed6d74ffedb01e32bde0d6804fe97e99c558fe028cb9e7d8fe7766ac0c40117b7c1ee157eff5376304ddb166baf86ca748ad8b7b7280a1670b8d880c0363a75a07e9e554198fab0db2cdc24fa09f5460cfb2424a083bf763858dcaeb0edfc771671b8cce66092257ded659fe4092dfc7fc81a251cf727ac34e50936b61908d512c25bfca14a530443ae6388a44fcc1b88c5fc7b5814223ae5524ff89a3b2bbd55f8822b1a168077672200d7ccd79a50b7752e607797ae4f54d2ed3556342e528b5452418f4b0203eb8048dc9a6f971e1f6578e36973f0611b555a944efef8a5cc2d83e74c326ace2d6a0d3dd24bac276600137d75eceef31a5628e996033d9b9b9c1095c86da64bfefb97031ca1c6cff302081d001e857071c978b6468d6a5f8971a12c08ffa6e4b7751bdcc2cee434e71f715fc9f7f0707a0dfbce004a0907c46a8cc6f676dc59c2d8b37f15b88836647cbacccaa52aff90dc7fa53baa4ac514dd76bbd9ede68656361f9f7b66e88159642df2fc4212554cb8da427cd90d0a3ea4ec1bf5000c87307370a8f60cc85dfe7146144bfe781e4aac0f0e248826b886e99e1ecc739ac7e39386afa0edbebd5c32bc9945ff19ff1fb4b448c048b8ade033d7e1bff228b4b27cdb0e3ac6c7aa44fb81e0b1277021f832d5e03c0b22e247db075c16b7769da72df12c5b337cb6b6806c905bee07412328f3b71e4b0aeb6ccd56b053118053f299e3b732efc7481b4d04c9ba4361f3444efd04eccf39ea33dbafa695be886985978213eed56dc34cbf372dc89527a666d3462908ed296811f34faa29dcb1b8117d6ea6aeef92c21ee95c4d01153565e0f44fda0ec5678d293cf86c7007ca9f24fec90c1a2114dbce0632e90ae01a79fbeed0e7e60d594f8f513be68f35fe84300ecc45b407158a865abb34c55ab7a54d9b1856e29a0f97d6f7e21c2cb55b893970084c4abb350faedaaa2a7808ae10ba3c18e27910276d7c106ed330b7f7a307fe18a7d390c5036794a8bbeef7083211812f52c0d6c83d4e85d4bed893d8e02f96e4f819f5f372171b0036c44f8008becac881064361314f9518e0d7baa93102c8c169d03ad21e128712aa6a890ba97537ce16ecac2d670520af2fb11d39c80564b7f4af945772932c875845f413c1296d14e016054ff646bcbeda17cd84c2456724748d6286332e51e7361a8e9a048f5fc899d94e137ec46b4cbd7e31178f31c08314452e93892d196c7125bfd25af50949021ebc0e577882894453e5f7a4a0c9e83c70b61a82e63bceb9f77a9c8457f9956bb9a3361a920b2c3e250f08d5753d26e7592bcf58d6c2264b63aa4611463c52f19b17bd3c34ee2f6e35cf0c2479bad2c36ef360bae57c235130474e8bb1a980e62a1951d73971178d1881132055fc10636f0513cd018f9f4fdc531d0444485c4565dc4687bad04564e0e6f78f80af7fde48680e6cd8242f6ba23a2e8cd88c2317848ca002c5babb74121df0cbe9738f1954c0c48e0131156790ce0acfccb0601f32928fb403662b9b1044a2866b95ff5608072523e10ed8ceb6f51b443ed776187307afe1725fcf4582a98c839b22777f92b12c6c09e8dc943fc7878927d33e82567827c778258f4d6ad8bcf696de742dd7a8e85fe071696b6f4002d3d0cd1219bd02e1d15c4850e9bd6e5bde92c91f78aa1ee4b4123904ae7b71316edd45df7d30b55003b98117f4a877f48a80cb2b7da63d5063fa632883fbd73175def2f62912a43b149d61e2c6a722f56662fb4ed2ea4428cc78b46ed74c4e3b9da101562231b39c3b095c69c3044cc969d916a9642adc988feb1c39b54a27dc39839412b513ab46e95860bd86756020164684a74cbdfdc9495e4208b48ea2f5ed6b7f5bc55f86e6bc507508e671a389aad41b880a0fadb443b58144be949251fe36c62c8a4226b542e776a16e387d8aaa67e6c2fd8b88701b4e2eb6465b52cbe2d95c3832a3a40d82ea2df668605a282bf57241000afd41f750f154a75f13675e308ef5ec17cb8b5394e1d719fc2820d9bcf061b5baa7b38256c5f43a4e3da72b47cbb4bda7e684ad2ed3d24ac06fd93fee712054463f8665c15f34b8c7a4113bdb231db30990df6a5da0d400dae9b640705ce502c5429d2aa5bbed65891285a66af405c3ba1a95a5d6b0e090d24e53a185948479030171d947f4edbf5597c332a1bb9f6593d8efb49f9e4a4d060384625359aa5cc1fe32a07cab5403476918ff6423262f8b416cd51cafb3121f091b36af63c16574c872376ab2d3dfe5e889dccb547649b9b44dc114c2d349d837e296ab87e8bbd41409712c228a40506002e1b85c931ae04aa32db040b57d49470ff1ba1eb4d9e7286d2412503c7b6f7931ed8e5703a868355db0c2ea8901000aa9b463a4492ae05574defbd4d6885876056fae23626c791934f7b0ac632901272863fda0ba381e010a12607f4d02c0c656563bc656cafd498209ad0552cf173d6c8849a5f2d86210b9f3fc4d166b2c429cb74ddab3947053e5edcb5b968e240f1f5266dd641167085435dfae240b7a9aec335e0445613b6292cb649a34626340d050aa73a55b10e120d462dae361b3e17027c3bb7c26264250f8713c5c053a7c658cdca784c6eff80ee58da9a8b1b26e84359c2bc32dce55122288d184854a5761c67f1861204a815ad22ce43285d701c36488600b3c4aba410801c3cf840be2f9e7cbba733e6a8c0ba9c8100c92cb1157bfee25fc276cfc87fcd49ae7fdce1264f55c88bb719c56684a5f03b4225891a156d45a67a6087c2c08959223e9e08c1f023164e5ca24d10134b466dc9e8f03b0b4741e473498e8c8a641b144927e838f1102312ef8a0d9018ded4a55b80b8cbe3e425d4ddaf800e8e603d23e76f14a00ed1a5286111fe4082b144d3728e9c353356b50d114374a7109f4d5f87442acdd40815a268844b1f3ec2a1f833e816a3ef43d522f830c4f6163dae3126a37f1dcce772347f75cf63e435afb4c0593410cb70feaa552932c621b588bf07232710908f1429508d4a6a8d901b18df7080e971989fc42ade60b273e4679d2a84ea38ff842920309d07ce2392127ccab8227a2fbe289471c913ddc4d9e42b2528b4eb60a06617c0112266386acd69de1a399502024a9b13c4a273fa0a93e4a1cb280d17b8812f0d838a7f8b8ff934ff003efc30994aa820a756ccf71d89a3dc300b583efe222043542f369dd1051b4a668a1eae1d656e17d81be585f299e775b4f00ec7bc66b5bb721e839213c38b9bb8b9a587df9e88f3683116bcd7e1204566cc82c884227331803f0196a7606c7089a3c589e68268e74954eddcac14e81d4cde74e9e7e12628fdd00cde2711dbbfa50db3bbb5576cd37f024916735be1cc25f163f666f8631fef7a5dbcf695b53e0a224f91a9186648ee798e548b170e2d7389c4f94d523899e6f00f5ad253f7d0b13da213eebb44ee2460fb4ba8fd4a415c3e919fed56f76c82bfd669094e1757785e4f944a2108e781765ed3c44e9feefe1977e48bdc5fb47a665acb3fd8cab992b81b403112f42784582a4810744b40f202d4495c991bc2b880047eeefcbf6d0a43541a91200344de32569669c10c715b7d1c815257a435e03202e4b6290cf581614b8e0beb49e3e87f4d749c693bc0d958afaa080833810dcee5ccf8da4edca2920b04b996de1e4b23a8566a72c989d46e90524014548a5dc484e63bc161225a72d2a1a706aa9bc5022fb50dab72289a1164f5b2c867b6c61d1713d6fd76108d860aafda1ed3c37741bf4658fbfa8350e6e68a425155c394729a5a5743e90d39121113d34e831768852115dabbb37d18704a664f82ee935bae41004ea6f6154a4f87bdffc4732d10a8cae083f653e9e65e7676115d320912f64f8503873f10b7f06c3d4e00ae67d11ed0fc2215a43ae6224eeb969e760e31d1bc1c327f8a1b7ab45c1ed215d25a0171b261b418d81a7bd707a3737447ef4bf858e081f0664c429a0d2ee908df44a066f4710b74860d57a94974c20b8dc4c3652b79e5eb741585f2bbbf0cfc0f5213450792e85e4204f42c61c64a27f2279949822cff2d43e362e0a67abd48bdb655bde665ec79c0b8f710fcd08140a907c7baac0a836c4c2e2dfa48388073bda9edfa20c264ab195acb83908e584be209f2616e1f76a7fa217ebff89f25e5750c555694d0a281f18e994c2fc051835f823ee5cc599519677052b714737be752e0c4872e0ac05b62d3005011c1019359ec508d0fa38f26f23d83f5bf0cf7a6f7906934e1f566b5dc40dc756253b6770f1a10f536e202df760610bb964915184ca40330ec84af604767a67fe1117900d79138f1dc23dc5995620ef35f4b18260ba35c8b620f52c886641593c67b10ee1e5920d5b65e3c0204069ca294751d4d9fb9f273c9ad2f130526d4c704f01d05de64dccfc06f182640e84743a8af691854430671cd2b4459084b13f87c00ca75eab55b166647a6b5f4df38acd4f608c5c0f4b33b63a831459de0573871e207b6296c908622eb1b344786293e10bd67c0e6c7f381bd344863c9ca37f69c7e34445428000cfabb43a36672e4d63defdf5cf4d70968a7ebd350b0d475feb790e6686d55cfc129a4d4e61324e17ac15d3095d95dd6ec31e2b8be5b563df42d93221cb12e6b47dc71d8cf6bf0fd7669707b20f72f57c86c80bcc98c1ae43f559536813fa4ea381e10db06e449d048ec11361d3a3dedd5b642896eceb4286a8dd37704777e440aff714a847cc80527c41203160a0cb0c1667030e948cdda3025b0a3b8b703293a1ce425e2776c0bf280fd83db0ab519ed4e36053b540d7fa0e37eadb68c7081b7070127d8bac749e21076ab58957e9dcb25ba9d2391667652c3ac92099b00cc483f06e355fd615e3137b84a96c07878c51b80ab87604bdcf1be76db358727513bc0351c7480234549b5ea2bf32676679ebf6ab9951e219b0719dacdd18c1ed3724ba843a42ca924d78574dde7f6d76a228e80fe5da3dd39047ce4ce3cf719427b27237514288627354e285ed029d2f4de7161d11200206f77711d0d4202f8a4a110713f43f62bd95d40162f33f89cba437927780f4889c58c9a8f2279f9772daf8db21e8c981e61f82f8c5efe3ae8301d97fe8c68980edc107958108d476bdea2f9e4574a98ff302454af407e600034141e6dc6cb05c11fbbcb8e1b5df2ba3ff8dc39f8388fa506435fbb1a9e63f8b541bae16098e39d10aa6d36b7160250dd48b506b30ffb4649b681364bc5d2fb88010a4627d503822b5fd4cfd31a011e2fb45b1e5008908484c1a00a1065daa802b81c9aef93fdba09d3c74073e2da5d34675002542cae837f5bf315b9d7ed52fcab473805ea09f6b969d5e4f5b06b8608ca9372b65d6294c4858d106895727e8a34953deb596d47284fd747241892c933ff55ed2fbd3307ca6ec7e2f2588ce9c0afeeb6423fd58f4aa37e83ab25abe277dbe529a4e392ea74e3d06afac36473ca2d5bf2fe27f5527bf3f791adf9973979fd8433e8c4e03fed67e605a5cca037aa6ca85572096324a073e8155592b67bf749b718501f2159383dff418acf907d5223f31c50ff4d52f90fb2e323cd801ce62729b9bbc70c163e6b9c7964a0801257f92d591190fa43d793a0a48862dbf259290bde5de524a29534a32cd0730083c082e3b82d98c55395038e138327f4bcdd068a7ee61d56847e65b2ff3451afb1a6df4345a9dd14aef321b5a25f34082102955ed473d3c3d3c3d3c3d3c3d3c4f3b33823a9b95845d3c2d9ea5b1dce757ee7bcff49b03996c7c5b7dea3a5a31daed7a14e2e78896ddf1269be34d8f42bdf53a3493f53bace97568282d87e6e0c97a95ffdd6a6f306baa7993ac7978e5abb137fcf03e3872e87ea6bfb8bd6766c68a80ee9c3ee4f4a2ff7815b7e255fcc7818adc73a022fff12afe73d26a88b4902da59a4f04870bab0c6b2e6c544f1aabfe4e938eadf5f43a3ec4399116226d741dd7711d23349c9e757cfaf4e9d34fd6790f222f5877777620ffa1691a2250ba438c7a131f722603bc31ca5f61fe2dc456465a52da27e550bfcc888c9108da27f4e493f1b99373c1f48e59cbd616629a733ead5306b28cf3bf1e1b7d67268daf0cb4ce4dcbedc8ab7cce9136baf551da93f351e79cb59e4effa9148e85ef573042f84858502f0a5304b1bc2b7e63dfc8373af6d16e418ef08574dbdebf4bed8db314b3f2fa0df614b3b4ad92bedb7d9605fee1361669771131899059e004c0f82ec8cb8cb0dd56f05980415ac8732cc019a817e9a8cd48bf883fb54e5e3ab523f2277d4ca3d1889b58a7a466ea14e35816f887af6e4ce2f7d9e72ea65fd4f65261855f63adeda562b5b6975ab3c9cccccc9cf5500ff5900ab0c6de7b2c422637d7bbcb525a4c308c8e3e9b32226d22208dacef26dda49b7413ac63134a134a0996e097649ca5d284529a543299929df3fa6c7e76652599cc94cd4b62b33e13963d767d2946c7332cc325aeccf1ea9996e952d726f5a889cc2833ca8ce2ac1cd0f7ba335859a862d2fa5a2d5a223db5227d3aa3c9d08ca9d052e52cb31bc6d67317eef2221b995bc920849fc958b3ecca2a9665d7d7f935ab5fa4b19a5d9f237b5e31cc6e4a7c6ba1083fcb6af6ae49a3ce30fff11fffb9128cc62084fedacd26ff491f45b7aebf4a18863daa07bb4ada0d7d37af2fcd2f5d58e98b74467fca609ffd561fbbe07b977ec3307b612e53cab04b433de11f9735ed764b2c81f01d87f2fc88d224c548aa17e97a1289547f93798e9f633e134d0d8e113f8e1a9a527b612f332312a95449cee33ccee33ccef356b52598af6ea5c2ea571cc881fcc77f666af52a6ea54a3aa294d29fe1caf5eb56239c21bd8924546bad5c6bad95fdc77ffcc77ffc87493acda48f20b50ee99b09e9c1cb923bbdd34dbac9884422914695448a3f1a91485fa46b8e293ec47b543ba52443922975936ed24dba4937c95a664142f5a09a2041120aca86f241f9a09e9848a41c44a447f590504d9828a5f44d922b0de9eb6f334f929f036e394013e94924bbe5d0555ec9924896c62ae96bb29b0856db8c75553eea09ea09ea09ea09ea49cbb0dc42698c31c617df663d74d675bd283f3e7859b2ced58d33d78c7693bd235d33339147fc99cc8fde68f4667e53f246a33a7a26aba42f6b37d208a376b3a6357117f82cd6ab524b2198269449c5044d53ca9432a3cc282693e92714d3a44263324d9f09653691c469704c29a488e337d2934c31d6309f524088441cb1862695020284489c5166941965469951f807bc7c60729988ebb29821e652d2e69852486fb6ebe3f370255fcc504e3091be95493a33436766e8cc0c9d99b919bda3a49999a7b45699c449f547334afad6dfd8fa0d32cfd84d04ab4da6922ccdb4d7989dde43fcc3d429c62a4b2efff1a58c32ca28a37c54debd7f97eff25dbebbff22feda36a9bc7ce7fe7ffafcbfd984734efebb94f2ba0095ba2989d7bf95c2c77f7f6a7a339246cac82a473293d26e25138d4ccdac1a992aa5ac916f92915faaf2a58ca9e69443c73f8f1fc0bf00fe03f06ff30f807fab7d8fb75b0af19f87dd6137223a2c0a764b9d70d8ed6b68ec8c8c2c5592356129744646cf09e79c73f6ec23e6d46926ed73ce9e734e48336b53e255a6146d69f42ad6c3bbc943827b4b2965cb9652a29ae86e1414b949d952ca19a774f99db953aad9adb37739c0641a66adcb9a3012cb366813514a6987a1943aed3094b6970643296d224ae95547f449f42b1d3977d96dd543264c7ed15906b32ccbb22894719818dbb32dcbb22c7b8f66d8cba6dd9c4afcaa6464336b6594a9ccc85d4c58d6320c8ff2f993fc499144223d52fc27497392482452961b284956ca27fff923914891442245fa16e9e36f2eed36c4f4a4529d31619544fa1a52cd931e07497e8d666732196ab79509ab3dd9783d6fe7397950e4f57aa494d38eb01166b73ae7b4f34da6199912f6de7bcf8867c433226b2985af7bce398ed13f7e7b8977c677d769eeca48644929e94bd2958de693461946ad1eeaa11e825ce444f9bc397310cd47f5cc37514d4c948fbbe69c9bd5bf3d3157ca691be8ca774f6aa9b55bcf2faba42d7fd413d413d413d49311c33131cacde394d2abb895e93042077a0e747de6b7ec2d6ff93358b5344f9a26cdf4f369e6d768ce4993e61c56b2b41672e9eefee33ffe139fd03badd34cfa08f99cf74efd0dfb492a5d5573dd436e4adc493a5212add6de6dcbbdbb4937e92658c32ff435b39392c340e94c44c246b5da4dc923698ea96458b44ade8d54fc3deec25db80b77f115a9a19737a550f7e8fcddf471d36f74efee94f0fdbaa9a4efb3d2dd816468e85ba69a772099652019bb4d1abbd537758d2dd9ed47760392d98d48e39829d9875b9c18a8056299adfdcc3be78600e071a080da21006df6b0d1e603c06ada6b4ae2a76079d88dc80ebb010182b2ff3356a6546d54067b9ad33274841e159dc19e86e3a8f8d253a4e2c15dc9820418d57bd7707444a1e2c1b484ea59d72d98b0a77112965004918ad2604f63255c81c18e8ad6604fe32a72c0041f15c5813dcd350704514fd8d35c1a573021525114723837de780216956b3aa250399b76265067f3fc591cf621891f00a1e2813651cd6ea11f3e1c94972bea366ff51e4c2adb375135bc870ff99fc5e129b644d151f160ad40f57ea5720d5583e3e0f0c0c14a950384118854d49b9dbfd1b6bacef9e8a108368454aea1bca89c4d73f70fdd4a1a4c94f229dbd595cf4f1bae2ed494f47df6861564b6824ecca166bd37f39cd38acf5de77c4c291d83daf50efb29bc6e9cf371e5f5d1ff883ffda75d5fc47d75a9c63da8229f9f651f5acbdf9590358e187459c4bc07fcc38d40b79a1c6300042f7e2226827f5d8fa970179e0284c81524d50377e9618a7bf7ee6dbc4713355146b179c599b5971efaff07a28788868886888688868886888098588d6770a37c503e4411a29ee420423dd9c2e5faf3c8413d413dc98190a10dbca9252784dd8f759430c6f7b4bf52c0d3c3d3c3d3c3d3c3d3c3d39302f81c0d8ac3ebf7774ac141cb9471beaf91ef4ff1d91c715ed8a83ed308b3db3b8b45de41c5098573965cc7e1bb877f0ebb393127bbb9a21a6bb7f9bfc33b3c96cc28a61965499d58b58a409dcde68ada66c8c981a0840f42d27bf64e0a61d77c2f7ea95ed7233e181f6a8f7ff4432dda8dddca7dcf94d916b942830f39f5acd3ca20fc2708aca515d4d940ec62cb04de1357ded3294e22afe4e1368c7f9deef5ec3c426d8bf850e77bcec307e07f8fe174cb6e1fea7b286113a8b3696a3a61efc5b8f170df77f79cdc4f35d73a1648a78840cdff6997c6e387d3109c205ed54df8003896230fdbaa533c7e70336a53360ca2177c41541245230932bb268646dd1cd04442bda10fb3a71756fa8c7975bdcb32ac0ab5fe53bd4aad66d49a845a7fae9881d58a04acc2ea3ffc03b398ff60b67a95ea3f59f41f2b8ce7a613e22ef7bec8116542dd1cd094628c8a38200608c8117d978d24953d246d10222f0421f282fb02658351428dcf415ed82146e51830ac87f84766b3188a38c065e9a1cc420c4ab851582774195b49e020a5d5717d4a3b31227941c96ad48d75ee0e2ef5663ebca085fdc50c254339a338d3e9d3a967717278094e0b79394bdc93444fce269650e33b61c90e2e9559877d5a089d51f88765a52559070c3b9951209d3e3a7446811716d6c25ba2d0b5a08e93ce39275927daa973a3f08fcb0dea6c74604f670c33065f328609a3decceba7b446578c97155b67663083eec531626c27b18c0a67b4b26c471895adec65365a7166add34d56f1316aafb74ddb4de0234d365400f2a9cc7b765451d9be8941cc6171f7497946c58250b99a1e3e2adfab49c7055b484208b58a9da0f3b417abe397212f27c7449d62ce8c48f7bc30b576a451b79f60d41bf9f06e7fe9b710ebfa8cbe532db3de7a9751669e62311d261dcecb2342468dcf3ac0a87cb7bf1202094284bb6c2fd8a8c05d5888a73477d99ef6b88ba56d61419d4d0361cefde9623bb11e624bb2ad3b8aead65db8cb9abb3b84eacdf5d09234b320c347f96c2b86392e5bc4a1853bd009ecd969214e604f0b89eec11d43ee3e082d94bb034c8dcf7007f6ec10aabca5b978792d047b473de11f765b359716b2c92cb70b1772d96593f8983117fef66cc3b8d3ef45b0923fed9603cc7d566ab1c0e8329f11a6aae3cdd363cf08bfc2cccc8f86e6df430821cdd644af34136988cf88b7b3f38c783ddbea19c1efed3c235e0fef74ea391dbc87e3f8195bb2241b430b81af82da06e44aab83753dcd9e8b48a5190971684ea543b42e8a4363552a75e7974838e0471d663d7d94a9948f8f8f0fc4f1ece373d6d39c3e38ec8440d462c0f27a9e11a6ae612c668b2d8bb3677e4f47d888342232ca7e8a808aa6b4943126311166661e59cc6c315b96658367d43a66491609fe834d9303b97a7afea38d7e6a72f4414e369d923fd2be533231d3fa9aa085c09c2d5bae3fcfeec9dcdcdc6cc1e00e84bbbb475f4828e541719f3e827b769c60147352f3d61c99a6c7afd564e79cd3649a26d334fd34994c76e369fa53cd464ff6ad9a1a7b63fa9ac6bcbcc963aaa9b1ce53ad7427ce038bb413274e9c3819bd671e5d7172058b4eae3871728587733a6573677777f76d9b1bbf755aa775babb89bce084c7098f131e273c4e786a9a46a80b4f217a3c85a887a710f114a21e9ee26070176c9a98c8d5d3e32e4e8569d9571834cbce68260d9b29e2a71913a9f4264de667b4926495d4b6d3b5acdb39ad2fd2a71136f22fe2f36d522a74ca8988888888685335609857e4609a88bd600087893d3ba1f73eb3b44dcb7ec3ded96795f465d91b67b1cf7e9b9fd139e1c8deccc726666f9837f00f2774c30d1810bac109f14eb43760e0061c6ec0c00d38f0ce0d37cc2c7bca1a3fc60f2d6604fb6c6a996747e4c4aae974c30d4237609c6979edc471a97246be0ddc85bdd8c05dd8cbb381bd70171bdecf7c46d2a2296a0f8a7961bca8c1d8b0b197ce6cb41ea7e5bcdc68fd4c2c454a5fbb80953a6d0e18e6b277f03e2b9396bb90248cd7335df9d77b4f87fbdc983163ded874dc6bcbe1461b02d37df6e6fa0bb37ea4312123639289f58b34cc2850fa999f9d925f8a2f33994c8b7f4da024432f4d3e67d196eea5597ffdd5a9abc7f5a597d196dc6034df6549461a13f5a566c4bdeed1a9938eb7a9b6760ff6c25dde2aebd28ff7700f16534de63cbee33cde83c579bc078bf3bca74178ce53b193f73c938ee93cf461329a5359da9c9dc18059f7256d760ff9553b750f39eaccf4256de6475acd578d2635a399341a0d883ecca49d7e46cbf1351a8ea7d150788859a72f69397ea4e1f8aaa1f001ce3722d781dc834850e75cc830eadce59c35ef66bbbb5b46e7e0ebf7daddefbadb39c76e34b294a0d975ef5cc05ca00f9248f3ba1d8d2e95a3919cd6659b39175cbc1e1d615ed961188665d80873ce05e7487434a2f4f1404f0d51a17bf4e8aac0238bcabfa970555045adcef9191327efd1cf0297cabf9d1cf74805e7a3552aa8d02ce88652c064fe438594362c1af8f03ccb7b962704618a31c670d18424545bbd414bceb80d822b2c18a20824b6a062cb755dd0922f1785eb829664d941d74086d03908df39e8aa7307c695ef58929793d382ab243e5fcf90e0b8f2bd53e8357eb94f199f5bd6655960b4737fa807fd3df770cad810be079f6befdde10ccf2d1fd0748dcb08bde7b4e63ce29e70dff36833da4a709f956d1871fd5cf76a726f11995fcfeecd65f49ed39a93e4ee6c212476f7fc9dbf7687fc9efbf3475b73f7e7de738e85d15602b6186e4179328411151f8cf17ad4654df95e7cecbe3d0641b83aee77497fd9314a0d7559939f8c91efa7e010fa30d53d6c908851dd6f36146a51fbf9c8bb40aaa8eeba185f1a9213d039d75f9e31e5f59fd9b33caa54bf2ec80730f4faf3b0a2ba477284dacf0fc4b9705d7f2aa18cd868bba1e79b3ee1646db4ad96b8f27d844e748adf08de9d4aea75b7ccc46ffa7c1ea9696e2696f33d95186b3c9e78cf6ace873f8f28ea66baeeef875495432d688efbfafa19d5b09b79caf8dcdb9ffb05ff0a094208a1fb3be773caf8183a67ff37833f3fec7fd66376eccdabc9ae84f8ce861f33f3004275575ba7497be4bd7fc3b0c2ed7ed7d6af7f6ffeafa3fb83ceb52438b73b498cd9fb87f923b13c6633f88319128fc0742b9bc11fc86dfbf0398be315cac34a7d73fe78f4ecc80ad1756a0599a9b404e20750d0efebb20b3815665140f942049cbc005e794c51618838ef79b8541452807efc91f4256747dc1757c59115aef5f3d98d866b6533681b0d773ebdb0f711f56e74ebce702756b3a8b910b57e301e56aabb4ed5cfff24cc8cc867d49371ebe70b65c9474df9a8969c04273ebe2f4302ff3dcd30aaa1fa572edf57b8647c19610022e35f6a501e3ff53dcf08233c018d61a32811c4f03efe039c084c90939393734790c28df686fe7b128f2b153e0dfe30689bf5395c973eb5869c78411608b821275e80c5a5d7cb66b8ae75651e63fcda422eebd250345e4c3768fda5a11e0aa2667c948c17ce9597941f3d43325f7a26c375a98d56be74cdae537c25cb25a8b371773a0250fd4f30be347a66e46df2a37cdcefe343cdc79293b8bb312279d90656452fc0ac12d9d7d17d8f2101d366903df65c80cd7de144ce55e2373615bb359519acc4c8a206106460f17100f69d3d6075dfcf4c03ce0158f3e08a20da11a40085bfb38138bd92fdca702d04c31ec3b02d62d8e85deca1b6656f65d8a328eac21e6561239804e7c6517c2cfee42145bdc1fedd4c976d18ce0f3c467503f83c5caa0c49468117d880429621275e9065c8891e95f3f8e1f1838abd7fff114cbbc1fe8d465f5f6664c48fa1d882239c3bdae86f173ff6504351eb51172a5a8f620b8e34be309301fbf918f6d71dd9243ce642bbd170b1f8969dab8ba31befdddda1bb3b4cc24097ff3d60a5c2e6ce8f55d636f8dedcfecdccdcdeeeeffd75eaf990de3b5ecd77a8d90c71eedbac4d435928898aaf992f379266082164763344fbec9ce1b29c0f1e51d466e6e6e77cb455e042fb5a08d3d9f3dbba307fd2a9f59ddf7f33edec54ef50e49220eeb0cab94918703907c62b2697ef784051f9a7fb7277f8cc3dc75e66c459432254dd7bc8fe45fc6533c07fffcfdd243ce66e34dc393f4e6957b8343f54f93c331856a8c27db1b30abd9e622d84fef517fd820856aeb430ea775b258917d5b6ec292af3887333ea7e7bbf8d508d72a8871a799c717e12cf6478943ecc9090fe88733eb2a79ab66df4df468d6cf4089d1685e47dd436b619c321ea4cceb4c16fd750f01a7938176ef337f95b4459f6c875dda3264ada23d745457be4ba7efbf275b788432d09ce8533bc0b3f094a06f8efa15d4d6e2aba1710853471c59230686b4ba8dbbceea8b89e85143ad71f6b213da7f8e927a0fce8ede7ee66f782633c78505dd092236ae81c55447284eabac012e66e29544700f45b007e1c5eb9f796a7e1e2063b4d0822cc133d869809f44ff8f80c010921e854b1c201500f971dd0a0074510d1865bc3013d10316b4c29562ca082054308c20b25c47821c1972728c10d286a44d1c4b5088205506011e3c74b0da09cd105162222c2c841107eb8c2c3b802267185db525bf0bbc97fc2e230301204cf10b614755144943e8206b420e3063d4c7a4044959fcb67d8800b283d14d1e5064ea8588a175fc4a0e20a1e19a4a1e23f6179513c2d3618a2072b2d708305338955132a2822688b1421ae588153a38a2b35b852050c6c90c6fc4109c640e20d276bbc4184456fe1de7da0b798d7650cc48a7a9aee9d07827cc8b92ec8072e178beb827cd8b9a616e27f722ecc975bdce0dd4cb7ff59b9feeeb9c8b92338ddcd0439393957c98964fd36f271b77addf55b7677d841c9bc3bc0bf34763efc2dadfd4a18e385dbec0b6f9d7ef96ed3835ea9843933b35542e1f6972cb67092c5109a6020ea2b5157250b2d455a7a2e67a14598cbfc8300a42bb752b94d5c313ab7856c3a6e982e6eff6ce7cdcfc1114a8677dd9aae6b2e8b989eab03caccccccccec9c0f1b4e2e075597858d25f7ba2c6b88c9b286976bea14f350e5304354b6a8286ff1848fca351d3f382d7e68324505849e368a54aea17ea0a20f7b9af30248082c2a0ad16043474523175de8a838089f221d159d46e8a0688a853d8d5df045133a2ad7763041452f35c068b2a3a2748d253b2a8a690973c61615cdae204215151d614f6331b830a248454948fc00a4a2958a245c2046454b56ac88510550661025c6074f3a5c25334e1b02ec4a7bf39ec2a7bd4c8e2629feec54bb4fccca8c58d63527c94e9bec08a5f3e35bf1e79cd3fd298d914697324a4927b526b55294d239a765cd1f4c5c9d6d99620c950714b4a305f3094a01d0182aa615cf1527a0c1032126c60ce5608994213496dc4009675051049096290270c2658b0f4649ce31490b038cba3d2e47d08111ea96c9f0ee743e8a704da9dbdb52b7f9450ebc2042dd5e175c6c31041c68d1a26e330b2da86e2f4bdd1e1642a8dbbca26e4fc3624510ea36abb852b709841dd4ed51a183bacd29ae74ca7d010ac040757b9a14efc6cf0fea66004cb312850645dd66907e27ac723ff7bb91202d1ca085165a60c100407eace0438502b440801ea901082000362d00c06a2d7c0a3c76e840e540a185138e1a1a530b2d78f302503230e026e1316d37145cb6f3a78b2edfd9a779c3f6d4a9eedaa6d36366eb2aa80100c3434b6d7e1f32a8bde4fa3f3ba48b545de445688198a22fb4387618a6cd224daabbff10023dc4a9a04b71b9b00b213109448451c68dff5cec2bd459b9fc4eca45d50055fd7c99681e985dc88648455a82749470a306439904b238a10932aab8808d32463e643923094c5cf093f3301c54f1de7befdf7b87f1bdf7de7befbdf79efb7bef592fc6e71fa3bff8de29c6f7e2b3014aa9f03620d09f3b3faff739bfdbc4e70f0b8ac231c6874f32332761a9e47208b0cbf6063e43abe321f6b238faca6ca56466c4999dadc81f7914ed898ff85ff17f4a4a2dfa5e7c58a72ebb9d6ea539acdfe49c73c68e335a156c8000010a42e405185f5bb7ecc30a2d575f601e108f6ece39af6b74716acee99e35634cc519e37435c668c24e17c8db78dc74dcf8cc8f999999996d66a718d3010d200f95dbe3ba201e9df72efd22cd04967d917673ce39e7758d2ee6ccea38c1e787d3b6c53c2d2c336259d3bd629d7af0f9a1a35766c421d4d129934d0a7e84f6758ff7f16566249e74dc37271b895bbd0f7e34f26c98991d74d03921af87b02a6b2288083157bb2e6827cc731861bdfddc32a1f32a695ff7e07f8fddafb04fd01235d4a892c5f413441b61f40c3909a30726748abcf88cb102d3bb9273c1a425206807402af652832a5354339a0c1815f5190d2713826ae64d1a0e4d501b674c51d1e004015533cfc3a381caf4341a0e0fed032b62543770de649e7f754bbfbaf55797f4ab3bfa15f6ab4b7ff5ab3b7f75e5af6efcd585bfbaef579707d216455099dedda8fe1ad62df0977e847121b2261386725d9bd19e83a36d7551354015cdf7ddf83241c3a619cda960103b405f30f1a2a8076989f3e1dec812d5f5078ada6191927bf2a43146e8dcf570dffd8a2877c396d73b13b41098d342e66fd99c1620b3ba1a436aba1b6fcca153fd814e75078ca8fc495c0a3e1356709f461dd0d856435c1a0eae077c4b83453bd7657840409b13f2e1ff6e0754e4faf33b9d5c91e414ac49ef76d2f136a7d7c1852e91c41b038b144f0d3450f031aa161df4606609537420a970f28654c30babb750638c48851a65bccb39f26e36b7dd95db5b9c1647e48a8608f2e2f61701e3f6e34074bb3be7f4277a5dd010545c795dd010519cb48cb00ce1c32d9f1f438e4c1a5d77b789c2650d31a5a17c976669acf5e6d7317eb672730d9a589133fa8344b07265173a57ce1ff2457fedd22cad9d0ff9537b7746f8fc4dbbf9cf977edd7ddbacf2fdc6ffdd1bf789391fd96dd2edda2905f8503729df13166c11b365a767a8723e8a749904eff2a364609fcbd67d718130846de5dd9c0fff66feeb0b744910b35774492043a29d912062429704d8c8b9b003e7dc240cb85d736ec37ed75dd921892bcac9b94a64aef5ee4ab06be9707b87240cb8ed7cf02b8937f60ef195c40cdc4e21090320b05281bf5f489c72eb57c2f7bd0d8c4054f86084a765274bd1982f3e18e16ac0144d90c184284fb0418430acc8c2c613c6142154c5ce1453bce184cc192394869629de70c242810a95a12f3e30f1854f0f5778d084225630c58b25a08e78ffd69c80514e10e7c3a99c0ddec3fdbaef51715ac8c617e73dbbe580a570bcd4f79b0b63029c8d7bb8fe0cf0a9a9cd69e1a24e35aa8688e3c6bca18a164543fc958a81fc71f0212b95d3e084eb5fc3077cc853f9ebe0431c90ca1d05210d3d845d0074e5050814b40233329f20264feee688aeafa08b1c4fc8e6b2a484cc2b40b81b769d161c3e40830dcccc73ba8947126ac77799059e2a5a1c1e54ec63b3710e9440eecbb9ee5ee43ae0ba2bbaf23d1a6a6022202ea122dea3896c01c25a2ed780598fa5f881b8ac6519c87bf0c580f3f1a5eae04364ca2043054288c1921e2caa7e13f8900724a5e7270949b49103553f0e1fe8e76e547e4fc11a6f108d2103c8883482d64042070a255009638479b9a85e938f276a009a6004215c30c51369b440d55bf08ce959e30a2831e881f643e5bb0312bf6e79b8ee1675245e7fb7a7eb034cfd1234c18a1d00094144194550f513f1211b172f80011451988125052ae78511d2e891e28c160ca10c557fca8770008a2ba4b0e209296250a4ea77362d5b62c901543426065ac47091b3c4f4405011400461065ac44009152ba186194f7c004483237680b8e6148d09420b1b53a618d3c614c20d30cc58e2091a742182288c7b029112823004298ec8619223457201a70409a1854a162690c1c5e5cb5f90f8f587c1aff3e004b87b6ba00102ec821608f143143c187a4244118a90c1143ca0d2041fec4c417988caef4a10892984258b1390b880b284e192c5093a3d20218354b0250732415d77a9dc43de336f7ff98360519d8adfe788eb827c985cd7c5754149f0e0d2ce827c38c847cb656626de732683fb7299d079d5b3afb3948dfd4ef10a51ea5ffe14bc9f3cc0a81c3fc29843ea1ae9797dfebc29af3ec4891992620c2f53a01c41089c33c468230a2cba3882122a1574011a62893078aa204185012b4b4c71840f8000420b546650d74242c062dc1be7ded970159622a68848a887777438c7bdebb1b9c0ccec83d3d262dc4e42595bc2dc52b7bf8b70fbab94e6e9435047fa3a1f38c10c312aa80225847454da90ca7de50414803637f3d5964f77ff1eb77d3142f9a65b7d31a5a37fdd5306ce87dbd8e9a0efd52adcddb7e7efbdc7ce9d3b771ea672a8e44d7745b563666800200000000316000030100a86c321c1589c2792e0d3031400117d964e6c509588044a94a328831032c6186000100030004343db2401d0b2dfdaf659dbedaf5b312437231ac34becd7053d9263f89f5dba30c9f726ebb09425b5d0e324ec11c41984c6e491c6c701b5a0561b7260ad6aaf75efec6918ab1c1080b124e77df65bd2d10331cc86fe1f510a5e75384e2046bc5c9867eed1c9b4319dcc2a7047951da8fdc58017d9437efaf09098a4d5f7701253b72f3025a8ca492a2499b07dea387880fd1626cc480762d18990f3f7ac239d2554f0adb75591aab19d9ca5b1f28de03feb9448c7e009dfe547d87ccb49ef0d70e48e332199f2b79e7975fce5eb2a671dc3d2ced3152819927b2a57949cf9f732e1fdc5ad957092104201bcab8ca20e2edaba5f5052470f748c223d7092cba2fa69120dc66b3de6c29416c61797c9bf652c9af985b4f7bb9b3f8d58b6b74ee6c568ff3d137025870d588ce4747cadb9f62ec2198d79e2ceca55aa12a23e0b8b8aea23941a68f624a7a1d92a2a21d4511fd71bf15ea2a0d4bd4994d25387ee71ab27cb5b4d9b1fbd0cdf63d1641ba10a2fc8721602bf296dfcb5aae5fa0414d5fef00deab90437e47adfee6aa9d57855c1381682a612729652aec36b42e7f26e8972be4b283edf5743b24b089bc49faacc527cf12399a54cfe12447075a9b5800214d3a7ff809e31113ab25ab5a974d070d6a82f33a9d4dbf6dba05ed9ebd16b0b8ef4566c2017624be1642b2d30acf90448e4c2e8ff7254e7261cc7d144ce969ae76c5929a9392b2346bf037babce4cf2a66b8013414cb75b3336ae713941a4d2d3e94b5b5a5713d5edb63d315ab43644b147872b11e323c483e7614fefb3117704e190f7b8f9704d6383c778ee556f1aee81e69c27b8105fad40848ae191fba294db75ba68cf0f73af2f82bcf7cc4ed055558d5c0413b521e459b216dce68a0b05ea272331f6e912bfcacdc5a6ffaf5f9b1a88eb630530fb73c99c1b7b8d7b46bbdd72408eb54a82a1f8984c8118d8da3a6040091a9c3343bdb1a53f1b01c855a31e0e666e35310033af1ec957275ae92e28be5740ab079573073dae2f6e2020085118652bb0bf8495197a5338847a1414a198ae5ec54177154b8fb57bef1082d6578928db166bbed1f26c5c8ec4ba779d02e2dfe77679117f55d44f465c7a7cd30dc3b2611978d6f967dc9934ba0681e32ac1bf1965a8b70f9a8c497e1ad25ed6a67f90249917be2cf938f7793b15c268a294c562ce4ad2a443246c43f793218e2414ee7ae6eb6152f1d6b002aa7db68916afaeff60d6c5e8ab18f27396743c2793b00a2367d2c4e81d077c0a17f93ea6af457dbdfcaadfadf8a223faeaf5c312bf5fcb765f16221f5265d3a1a3e567a2ff85288208d579b262b467f7817c5608800ff67d33aeacc61533c87e59428a9bf4a928c1860f19c9d45806aefb16a0e535cbbf25bccc8df2f782c7fb73c61b025c73f98dee1e33fb5d1d07fac86ee4c39af04fd289715695555cdd705752749fc0eb5eac8fa0dbc31641acdfbb01878e1ae89e8614367237fe6aaeaad6af6bbd921eb93a1e3439008789c0c6a462d589814b8d3e3b77c92760dc588f4ee906a912991b22f0e396281f9f8deafa89b7897fe6514b6eb5dc5b9b59a55635a4eafcd53eb823554bd03fcac8d773b9dddaa1ecb3ae68b7385c143caa1dd629c6cb4646c517874c1dae5cc9d198fe13f2b1b2f444b67dc09021dca30b9548511ab56cc42167651f8e86d53008e5871ed6410904c84499cb132ccd975c10570703080ff8897040afdd9cb86f75001c26505464be43452eddd32e902aaba3a9ead8f65b67fe7664772fd365d47bd80cd6db71c0d00bed663e8d143e63889cb2f671c7e743b8899e12c6140e134e7f340dfed43d7b4f7764ef0343ea3ae9e9cfb697723d145f6bfe81d5b48a0c9bbfcd0e42371198788b1d75b09d11c172b0a7b708278607582e8fbbe5afb10375b52c71c6532dcfe4e8efdf9553f596c9eef1bab0f2c61f2e22b1ebd95729e35a76fefab7ea349d445c0ec5b1738d0a908cbb87045673ee3b4abecc191185eddca092fbf2a0d7a8034f3ae8c10f1efbebe5b8b7085af078beed3e689ece7d53b6457a8878eec857e8126f9f2170cbaa9fa998e7e6c40076c76203086959b109f8fba0f4563b50fa69f27dab7b807ed8324ad5ea7f2e57ae207c1353e1d5188e9611e8b99aeccf8b15e895c13dc0b997c79f236e9e4cc9826bbaa1d9e8a88608a29cb4d1e12352af49d5c1ea83720d3b8d4a8d899dad02e82414c3c4f273a0bd938c9664d5b95332f921ef61e61a3afcb436150b1e4a09481ba285752fa89b9e4cfbbe5349ee507238bac54f527915e75b2fce39e9d70e7a03f28fde90072bd601cf6a4fd998bdacaeb191eccf409073d28786591a4ecb5748d00051f50d34a76acc13255815ad6d34044cc0f8c75ae7a9fab8a1adac8c0ffea5c504f474d1bf011d835547293c60b02f771eeb10b3d37b6e51f224df80247a8a2258e2c583e2c602813f71d1b956bc5b48b1360bb650ce87ad1f7efacad88dceafc97557540e1dbc8efa3db885d692d18d38c3dab1affc60da925b9e43bd4e7e540199c1410fcd9137111405f0e4cfe014e2b581b36ec6f0d7e51655186a69cf2b56ddfae4a9d5ca4ff4a0410cef6b2b83ee94522335ac6923228932958e9fbf0cea3c9af390d9afaa89f643363ba3dbbbf65ee708d6a8600bd09df16a4e5eb2355eb4cdea3b071c00c2d9871a3b0b0a21e4a9f29687f7315833213d864c33e91c77c2337c2dcdfc14eefb74f889f408e854fc7c977f3787242a7287a0a4fc8f099fdd266c8dc6254feb47b8ba29c6cf8efb852343101c1a19046f6b8e6ae25af5339bf98c35120f9d4b9d853b61620a12a3b1a502fcc2b725ab204ae20628bde608c181cced2817d58297b96f7acb5cbfa9f49a1ffbff359d7c2e0bfb70fec3670c4d84141286b6d964d3867e87c5ecef90cf93e589088be9d88532ae317101877d353a513bc2d4aec029caf1271ba3a0df82cd30e06706b27d456d32cf310e035cf64add2cf604e969beeec00e20f1123aea8ec01a263bf12454a58ede0517eba7886bed95ad1e261f372b7473303f7fde0c18b0bf3547c1d54fdd1d08192ded3ff0c72bf4bbbcf20980b7c4eb9eb7d53bae9ae8db13881d8de207b9bd00973c10b87b9f1e31cafa077168582a281df4c53a30678bcc9c353992b6a6f0f2ac4b2fd1f34b1764a7eadaa1b1b311839a9abaf0e22aa768b91a8deb84aebaf85cc4a5e440b994b80bd0ee818dce79bc6927b9b15ed0c724606c537d50929c68fc26863b5ded397c351065e235a5ca4b799293486d748d2b84e7064d83873adf38e3612616152ed2e679d0f926d53f9522b23d5ad6e1875d7d3de104e85ad42e79d8759ead4ddc48e476aa48beb140fdb358e513a66f30e41c1b588e8da2447d760809a776bb97e0fbc6f2d9a43b9f2d82f90086877139ad6dd0eb98ac88cc9d0c71fae03d19f9dac38d1f19c42612c2fd493d71e488057f5eebcbb8e8c639eb533aeb0bc2d129088694f1c8b44774183d5f595784dcef5dab5d5d29c894ab511cd46b1e07718466fcf078149cf29af272506a4fa9dee857144f25ab45cf3ba85aa72968497c090d26241fd1688501c24feedcf74d70c5b3f65638ce507bbeb875a217fb5069623de1af627a47b84326b1fc3cc69193493a0048309e324923d732fbb3ab7b4d8e1c0025b62242f132fd221a0702133df244326ca73a08ff0e5c75797f4d97e803df0d512b1c2df6321c1752d9329aa425a80e9914c55651e08e73b49c1789358034746c187388a744b3ca9278411f8201625f4215597d8a2de997f994f1ccab747f13d085679c6dbdea3f0d0e9eb0915aa193853e7b810bb8303fcf2acde643a007957384e636979821a865ee3277889aa8bd16a24a0e4f24f1a026968bdcdae5ea716f9407f71cc81a8db5f952e0d68e4d7fcfb98512b06fa8246eed227c814fbaaf033bac68e2d24d94f3e1694fabe76c7e5fb018a7425efa8657465345099a0e910f844a3e8f25ef753879414e3d3789b9fd56a741029dbeec80d0fa371cc0ff260a6261328e4a656b959ee9cb946ea54c4e822eeca0224ec0c12e4ae344de79f43ba8c0bb515793e8a96b7b424af9af558113cdb7a1d5b9fa38630aaf4d1980dc533c158b8e1180bd6980172abe67d396bc78bfede9817ab69227662f8e2ae275291061c25a77d029fa0b1d551845093a01a3d26baa58b74a786fb0c716487fd4795c0b1cab11ea1ba1f3313b8397d9c68fdb66d916c870f290333a901d48a50447bcad814b551da9cf4d77f4274434365899796bcf9bd1b2fa4cd1ce3ac95b389d7d10a67c6c05878748132f04cb0682dd5edb4326910f558f04aa9f54bb8235e7d37156124b8a080b08f4a759fc8e9b67ec1aba925917995277369dc9635d26baa7e769805e724ea9d2f21764fec740f46a95937e2bdecbaf51d90a2d55513d5d1537128ae0022bfafbbed9fdbe15f43b0c07a906529a90876e33949789cafd555388be0eb041dcd8337d1efab4058cb6b27f1fe58c08a44e1e09a82e0eaff09d15f922d26f36a9b7f2a711df597a856a4aaeac671141f785f4f95e60802b1798c9829ec4f30ae7443e76a677f34edd9ab1bd7c85d9fecfebd5b9d543898a865e0eba1d6919b94ecc5f6a997abd0837fdf6f978f326dd8c1886a70a4a2a0030b35f87a3017ebf3e8c8fa6ecf65963a2d942d5b3225433fee00b262b26de4830ae7020e4f86b000e2b676ee068cc7a93515e2221166363dfaa79a877d2d98f4a24b44da7ce1a12bb5e56ae4e1424c625a6516dbd4acc0b2c43ee3725ea58addc12b54c53170b748b1c84b2b1b35c725c0d8bf1d9c44576dc212fea9037c8cbe187d02b2d188724a919afac49e91986ac8533b8bdd3718ad8f70cc8d399e435091a0143432ff262172ff7098bb33f659f92cb4bcca4e9a2d9882878862a42bef9368f86c20c1c67b48ea47fa0a688bffed32bad0211754c358e0484e5a194e6a0aaa686678eb9bbbdfc9ac7b14d6945cd1d8773b3cad8ed6af8e51093f33bd53115e76daabbf837744c2c5b2f5f0bce206010bbef5f382107c69e7e188b517b736cad5aaa2e9cd4795009dfeb08dfc103ebacfd7b65a736928e7cb134dd81f89eb623d61dc809bb03497277a0c4ecb38dbc2a525adc4d7d5e156d976b6a801211b25db8420f6cfed6a794548c3101409a75b462d3779b3cdfaf849a30f469af7a60da9488ac0ca91fa9d7f6b8aff0f1b2951b4e003b591a5a1eac0099bd3c3b00eeb87dadf24383103f23ea3b430f2d781f18a77b6deadf9ac7270042f77e76e2de31bcc105375a925ff7584428ca0706ddf13606569800c51c061bcd6857cecf75b5d769ce41d7ba19ce26a8270fdfa0e41f7161dc24c6f286dc85f0a5fb5cfdb3b0f5bc327a6d62d07c525396d1b7a624ec231c8030092beadc0049f765ac63da1d444d3a41d7956a5a69462171920bcf223a925fb4e0d3e3cd307318c8bb1c7384e7abcaf442596fb7672a23a62fb87db8524976293c03a3c86a7628ff54de31591b848c33fd5445bc469d0744a6a6fef251878ab1bdbdb87ea895b974d2c290dc2ae1fe1ecc49349aa384450c7b022a493d22b65f161a0cf483987e9a896f4dff86bd88d56f55991c3bb0faf65b87fb5bdbb6f470c7c4784812d65882a5603d107af00ac610c5a373218b75f17ef965ffef11248eca0457d1266232bbae3ab0a8ce59d88da49e1d659bc52a32692b76483c8393ec5b0331825fa2b95991a6224808dd76e6055f065f712acb3d4376e3ffc647b0e7e3133b0ea71176efbedc5074d3f0b0913fb4459766d5491cb7d7ff1fbd965daa6faddce6f8a294f2432e5617c7792ccaeb20a79256d4476611b6c105b8ec90f528dfe4d033a935aa572da1c97eca277e7c0b5d6e12a0d93c44638fc34b5f3ab154ed14dd60ce2bf9ac6d72ebe64482952a8adfbd8fed65626b76c1eeee1c9b031eaaddf95c6b0dfbc126fbb3707bcaaf1672b42ac38d1041822e1ca9dd8be428d98d4428e98143352524889d1e9c5ea52d339f8c05e88035e8e2385810a1ed291226dc86e530e844f3995b7aafb68943cdda3734a412a97abebefe1ac48d658662cab0a61729be67b60e72881003afaafe8fdf5dd4d053dc2d0ffac7b4525fb0854c501000e838231dce54319c623b4e1301b97e0f2d576f1cbbf492dbe64564060d017ccb4bef868c64c5299d8b88c4303b123575cce23f4276cbc2f39a85d055372fd65bb35f92be2a163c9fc874830c485a6e5824f2e6c4f8b630268f816981b05deaa16d79c2389c71e28ab8a2282bbc37b17915b03d133d22a47074783fde3e7adfd08d0e848c3d3de83685a1b682313a7e42da6293df0fa7e970f85140eb18a2100510e5cb1174fc869c3206b0d7841ad484fae91fcee28a0e98bf6141ff9c9338f2a88e99562861a0b6e5b60fbf1482f57ffff1d6900a7f08909e580dcbdf28712330873fc0063245ebc4262ecfaba79aabff13c70bc2de9168cdfaebfb792485a584edcef47bc2e1a36aaf9689bc6ffe8677a11dac5168dd36e8de63f9c65934b0becbfb144fb9405b6945e6a9003690625630cd0e49fa943adaac278f88cb475c17efd172c916b2526a0e9d83ed760ffdc438ba01f764dfdb2210e7f3c0ef13a9aa4b28872da8343a4b6ab373594179d46c5c556b6d381cdcca5a5cc82e9bd5d6bbb38b8b078f206aed6f4a2100a72c22ff029f7236e87b17159795c4a94969c956b6d08c65ed86a65f75cedec0b0f64b3ad40a276f7b0b91742b9cd27e5a57eb7817b42d7b13f6350ec4afd41dc06f6a1dd3dfbc60b11524115c036466ae1e006148832482d7c078da34f8e42fdf5110062c121d1eb2419b033c48b8c6847f8f66375e9c2308948a794abd0532d30cc61ab0e3a82841933fdfbb60e62d94e63d6186ba4d33d14324c99ace1631f7f9bcb4f73e66f6394ca781405b7f63d92b7d8c6682f56819bdfc40e6d1c4bff247445c73c796d35c6bdf76a672fcff24ccafa703962b0f0ddaf2fff215b934c82e4f2a1c7cd7a7e1b0e0710ec2bb7f6d59a90c97ffce9317b04d2e74066b55c3457b4ded935b09e71fac4e6bf10a2767b11d73a616cce98d15e1fedaa70570eb0a67bebcfec6b67c3ce45a12e06120437f3ed34aefb3e68975915bf85f546b2e492d977ef5dba1e5b76e21a51f153af966e1729c4cdf40a0b02fdd292658b3a0785cdffe64684bf7bfa084287c7e84bdfe9ce33814ec2f5be1fcce8dd9ae7a81bdc34bc5147e38f125915a5c5d2309c50baa4ffe7baad5949862f9b3e54e4038425b948dc3e3e685f5e718cc72a7c24c7f93b6366591aa01176c9e5709986c8bcba64d4f65b39f86dc06045ad81ba5a0e4b3505268ace77e84626ea331e62fa992b972d5aa26563ab300f77ed4326815418e4d3b00b5bd0596bfa9806e05a01ea1103fe5d915bd8ddda0eff2902e930d56d69e76269f9769b9a6d80133780ea7fc9d600afa8a19bb9eb45dcdf89c30163529114af566c811e3708c905520f66f9b488ab7ed5a2f042a8643446b145656287dddc4b4e2348e64ee8509c198744449dfe7bba7e8abc01599310b81df1bff76ae55fe25a6a574a1e89000aecbf03f9e5ea3d69322ee3c8f9f2a0455e4f46330fe43ad2f0d57be672d876fe8220d724e2a7a5f16c86a3b6c3f38e1c4567838ce40b4ac24d509753e31ae6e2eb9b514fb1c902c72404161b5157a580e8d2ecae7cde1b6476ae46693861d0e57bece4b239b4092f8b54a9f44fbe04efecd834c6f5bd546ca8a4e9977e249f0c4db440d6f0a5bcefdc08c2bbc4958733feb546103b1f779b14658e86797b05255e098aa6e83524e56325c0f84420f16171419c9edbdf473869ae06b9b32ecf05a5b874209fa7c0f95b19b011c20867bc80a7799858915e4db0225aa863970da6f526c75294910cce04159a30ad2ca8a731e2fb58eeb9ca6165effb15bf6d4630ee5993249b6b35b508a4ff22d623cb76502ff31d47646fa1d68b850dbfe6ca3afdbb6fdad534d7687ea79e0731af428ddf81a33ac63a885c1a08ef5bb2c62666451e7fba46b2f27318224a9a8d52b72886e88331081001f6e4fe147915ac417f4070345a494199e544193fb713033aa2792599242dcf8318c00a044924253cb43e24b61c1cf63834890f8bde10078d94d1d61fb73cd65e75ff89a3d0015fffac34b150b1760f2957ff5695d59ab1634dfb113877c4ab7eba3a3033634c10226e288686097c1da7d650be1f3cda1c84b1cdc9c79a5492d52f64e3e53452720249107f7044ea6a9511c4d809dbf495d5e1c5ef0092957e42128d72556a0dbf844c5b3edd9009dd7a5497a0af445509a3a8d68daa0a47c01e802b48a9640023c2bcf8740e02666343f4ba687c59404f141eb43531156e983005d0d27978abbbb75b7c8519abe245c8cafe1e2906b892f3f17e564dd039779c99a37487d795495c6131765c85e369b7225b59c114532af32ad4d0880055d1d60fd9f8f09f57c7107c424a9425a29df42123287fee69dd54a8ef7ed25eea8f12d7eaa11c6ac58b135d5615af1dcaf0591090b1d5a9060aea8a520464b48d6c296e8806b070b6971325dc018b3ad769e167f3ca5f160087941dc0be761b269ce9ac12a51f406d3503b3594ac3d18b1e9432d9eee59350f9b41c7cf92baca2b2320262e8d6d990d9e8c1fbbc1f1ef73ca8dc32ab77f185fdd9264c8df34c9e6b2d0a446b83ef5b445bc0f9cbbd0a197b7c98cee2dea9ef1a6479a2ce52078fb452beb102b2a83e0aa90f8993fcf7ebcb6d7833c2f4b23333d1a9629b5c3354b4e2d2e912deca486802f5cd409543a86998c5f6eff947da508b7aa74ee5fda867519ab385061ad2624d1a0de549438bdce6ab24988e3cbabacd11499273d680d02709cf097c75050e71b98486a049ac2453519ee559aaa29a6f69d0a8f0d108f8d14f9dc2799e5b1eda4a53712417bbed873e30fd717574543ca5efadfe8bbeab3c5d1a4324aad8320a06262737001d9affd567939aea1896e14dc9e9f4a9587725ddde690b548114856201ed707169ce113bfff78f9486af9cbf9bf545d4463c07f9af7936fe123dd3b2f79a160febcdd87234cc65d63f92c87e5f49e98c42c83cdc7b7df63276a63e0ad5c53e0d8e014007c91ed607367364d825a39520854c95d3cdb7aa4d048de71550956d0cf0ad698e57a353ae0836ab5760f4eabca21ad7383385a735343685dd514b943713a2859c068a1b614c0da93489c8547e6c8ab66a864ffc1c7a1290b0134eb44d14f9c87449b025b00fcbc7af2b0a1f7e9f39e910c0d1777b0a755ac3b54efa699b29deefa92574928159d3838d084a8004c9fcdf5f8bec078d68bce924b365b4e45bde884e33beea74383f1398a8c062948a66f9365b3d7a1085330e09ddc443060c27c1dae2d61d96842da0b670532b0acb1cee20677d25230808618a0b924da905822656037eb74d84b4c4894d8071f25d8eb2f35937740308fc5273a1b40af8ee989eaf294364b2b46761a9464a424d1db9b6f41bbea927e3d1fc6fe9f322862b6f04244e492c277d10ad35e5d7b7768e613556e3d0ea8675778c929e97731bc89d2d46d66dda1611f2943ffe49d9299d7c3f14c9d26c49c260c854ed4e662813c4ef52fb41e4ca979bc080adc678d0834baaacf640016fe05cb18986c2bf0134080bf9994476ffbd1cdcf8867e6f3176e58f9fd071227146cc6abf5e2801fae89ce80486dc05141f4841b48fc1d7b001db303f2fb790efde316f2d436a4aefba65ee9226a48fa65d54c9b0bfe1e974b55eadf8c61fc7700e15b752f4a73dafe33f267d7556716957054341d23312703a703522293f285f6989c219e43938c1ea160c47fee380dd404bd88309e9811f62ff93659efce8c0997dbf2a86d055df2dc2e27ace3a624596ba784c614aeb14a1d8b3942aa64f86d922509bfdf15f82be831034ef86e67d5fc952322671d9ac2e7995cf9e73b31225ad403eb3ef8b96658a03d5156e7da85f9c42302f04377c0bc604a2247e3a37f5684f499da4804d9e5312de00d91d9c70a812502ddf7f03cda1b7fcdbcb1a20bc0206b18c3e8d1eda736a8c143e763bcd4662bf67cfeb2be1f998c974ab808c344b6eb49ddfdc391ec513feeb15bbf986f2c57513496061ee57e0eaf6270001a0db15b361d936f6fe9a372b8b2d6989edd6a78a549cbe4d933c84446e83f24abfac5cc4c5c394e5cbf15bde511127f5f3841c88a9ab13e11a63e2baefb80884664253d9f5b0558385d5be02860658280277e37904b6f7111decdee9da0262d53230802b1f2ee445cd2c2ef4311fa244d76aae2453224263221c529d212388c91ce8a9f9f180eaf0fe652245f1c06eb5a278ce9a6eac52e908757a54885a9ee256f224d2f942b10f1fb5083f7a7b916b376046e916987d12729926f8651d0490c818ee543afec0a027adbe2a18f1569737313df00c0920d74036109a5b241ef56645aa075d4c5088e9d67b24e868d8b741f458411fda9141ed7a6909a81597d0d18c1d253c8d21d2d2d9ec844d66b14cc19d5545a25ce1f84dcc299c87c90f36e7b7ff3a086160aacd9b426f5eb1f459a64284dd019722ae62fdf4b8bcab19a951b114af4f79aa757b100b610c54c257016f936a7396a267331c554bd989c6d79ae3bbe0ed40b283e848120b51c99f59c41ae6a1eba79c2c726dc4cfd1e740083b012384420e472833ac4a0f07603f06ccae9f083d0cce09b625776623c9d24babe82c1a74fe19e385bc220c742a3dc5935c788d7771b10f987ca2e19d8f921260814c034dfa7056a01f1c193a5d4b974a88ffc2d98899b15de7e3490a647e8df1716291f003e0eb4861a28dd9fe1d656cc69537d4b16151945b22978f19588064b246db992f480f975cbff029f041e332a580f1a4b29a6006d0c2563642ebc3ceda580da4bb79f7aa43587e1019c208552aa0bac4baeaeb3656047a470f3348081f12bea5b02a22694329488e345d1d4dc137740be43a3acd38857a296ab0c5fddedf9bf471058ed4ef477c0719a0524672111a725edb0e11b9bdaca9898d56b2f1640353bbe032ab32094941f74627d41d7cf25896c98a4b2a626ac62c94517e1157f57679481f8aabea41b963c65f55572a3fdff763bb4f4a78ddd1583c9fe98e5e84625fe5033d70da2fcf7b14f3727e953c52ad6a92bd48b8e5a8679d6254256cba30e1f0344dbc9b894fd65d73729170785bdd2f7f0a139b181e48ad28dec864e99454f5abe86a4d7b238ac814d1da9197d47f302f8a38318bc532c7a24189aee2c2f6b94e509f0d68ca1ca568f152baa7522f527e42f150413bc21f03ece9a7242d7f6af58a137ac3213403dcaec1fbeffe5876e1aee9165bb0f2be77189a52dbb418acd2a78c21c27dc14a3cfe7fb61092c804c17e82d6de6714aab5028f0b834465c0371ee78c8daf9cc64150a321da1330936818fa63ed5eee2be01c06c43ad6969cc8f06e55614508851d075a91e1d875b47da99cd82c26a2b80107548842af111c111805afd00d4257867d95fa64c8a3ee30a88601ca8264c1f173a30a1bcdff158724e65a976cc51b56b4f7ae8f62d6ad0a55bc0801960b2c6bf6772a1d5429d8509dbd7926a0bc82ed52d2b139cac5d09ecd96cfed02e2ef5daccce65e26dd722f71a336f20ac125342961646b68656e9d42729cd18495f67009be8bd4b22946ae8ac2f059dc307d29bf49874c00827f092f761e1b61fcfd78a3853247ba60257fc3ce2228edea1eebd4e6b93f4129454449cd2ad083af0d04097a90f79f69ef7d24b98806199aebba88af48e7cd57bdd26c3fa09e1608a15e4414307dc4af422ace2c0a4e5ec359b58c0f83cca8185a6b71b05fc0ef33400b5c372d60f32947bfb6a303cac8b8fee488214310ae5c05d8ab00c00e3a45ceb72884a891189a80f634b51ca392e020770801042679012801d5195c95fc817e81320ee548caa72b30757c5e07e4d1fd4ab7f34a425acb3a11c16c43a2dd19d83116c10e6b1b06ae46ddf7a2867dbdbb733097d5c12f97117cfb5b33ae42995ec8da4154b08c34554f2f8801df92258a78e3e90c9d23eb667a97db526a9bb5d6e40240cfb157576772008a8f189874ecddfc924fb697a44adb189eed870414ca519c2219b4dd41bc788bf8b79213c2e22c38956e8f51426560d3bedf1b34213e0980e603ed3d1875ca5178453ee1d6631ed480ef9e46d1eb2be46e5b3edc97c79c658bc41171007b6d3c0ea68e76b3b498d7359d8a3b97fe26786ec3e1b233bd0ed0859a7c3f438bfea85a8a3d43cfdea9887cc339fbc548fdcc5415525b4b125ee84c44ce5f296226f30af9f14bd61680863e5cb5d81f0f1c83869a05832dca6b47611a017657ddabb7dabc88dffabe63fb07119efbbbdcfc2108a2938f718230ddaa692972b68385dbb0755594191f1e1b0a10d09d65258b383da0bc9939f7e44d891c24ebb9eb6eab7cdc57342c997344687e4abbd4b3d84d75be207718f923631d06ca4e4286580f177df4139fdf02982d9ef53f8dd489a90f487727febff3eef4b896e3584768b5f43b24aa588107171f68a329a8830fdb006be6ad30ddaeadf6fdd5201f8725ff126d75e71af7cbadc28cd18eed669dd1fef9a8caf42cfa1ce8f3f26ad6470dfa2107af54d84936ac606738e8d18fd706c648d61ef37103d760ddf10aa5096cb55e1c2638bc3d146c894626d4286b57045cde57f89a8850bd84630cbf1fb25e9aac786a309ed757299bd7f2fda73972b52e18e26d9995faeb98eaa0ab9fc4f53751edfcc96b31e71aad90ad33b1ed2b1b01a397748ca88f0553a97469fd1909b9576aaa8add28ffc7dcb34078bba836ec1ffb20e061603756650b2f5bd092a526a4cb93733377259812b73c1666e5ee6bdca674423d658e4f66c76f29096b3ef74c2cbc7b3ab7286a269a4a8691dabb27a75ce1eac81f0489d06729a997788930361cf7286eeed80a22fb6faa2304a23d2345d46447b9692f2c68e12c4c1fcd99e0dc81ea5fbadce7a4822e2f1c228f2d6237ea68ea88fc75f322776352547c55315899d0e5170ff98c9518a0bc72571e6f80610e12784c979e2c0c6934e040b9641c5e00f631ba5772d5386665d96f104c380d2db9fc14a555ad808674489c4aec69f12ca93b7f75e8f7163ec3432cb710bcd5e20a42fe247c4fe9199776c2930961c39afc42d59dded9f2d2920f89e28dcb138715464276b0446a5725b73b0cacaf3faf25d4a66fc4233bb317bb9091652989cdcf4c40fa1213300c3df54280f7071823f239cac69e4052603981961e748071d431d55a3e5229cc29d64dd029b3437bb928dc26899f644ea163a1579e6ba6f6d6bd292c4caf01d80717f6501c179a20ccd9c3c924b1a5757fbe046de2b8e3047497b41f54d152899f36c1a828545adf00ea8199360ca30fc28544411b18c9483cf7c87ab944b8481e86c0b73255e1125b582608140d4bdafbdab8faa75cfcf3d617350c53c3fe7689b0c2f1fcadbb2f443559ae087f40999f6fd9ff7e884f2dbaa13b4920914629d88fcc30743df59b293adaed4f4b7eab49e70150465cd5c277dee2b6e5a252ab37251bde0ebe4f6c5d5570bbfba6de2c8fdecd116b8994b25b24fdcbb961a7bcdef920fa2e2f73235cdc1f92e9a7f53159f0755c29398e5e4dfde12ec779a3fb2fae1130430c99850e77e69c4d84ba49baa6bfeb456dfb3de4461ee1655d90ee772a22947903f7ed696cc2046781026ab122494022ccabb38176fab080064e808988d5b11e5bf4011a5165fdf92c12e94bdd25982eb62db37fcae005c369e3cf1aee8ce4f1e70c9c34a89cd984c746c3397ebaa5cb72b3b52fa3ed2d07135b1a04ba351e395273e7b1f048bcbc8b07c731af04050795aa6b8f4b30b7b18f94dd04f5b03f1b2577e648336a85c795521efd2f670767fe7c55111a633db43846bb40c716188651bab3d919cf7629e61832b088eac77510e984bc5692e953b36426b64f2fadeca1dcdc075de89e265bd540f3887ed07099e469152960f39d5e8d4f90cd432438d1eeb056f80ac6d26fe9c5246546bf3fff34a8184ed4d1d956dff15c81462e51a1ce14567f120673c01f9237e1f646a9331853bbbb61bf90d77d37bc5ed544feb13c39091ca1d99d52be5c8ce5510576320137948250046a48c08fd8830a9f64fdd89dbd590a77fa8d03efb3c6b41d35e3e6a1b0203c5cc5b0281d5348b27c77852108b947bf2cc4f2965bf944cf65316affec360674d0fb6028a788f2e9663ecf462efdb81410bb39d57a884c56d8b4ab6b34ee1f77baa588d0ad4abb587ae3c5d0a4632bf7fe0beb79b99089a0a76b4471681c5b8ef2d2f5492a1b7869aadf385739f939a9fdb499cce33a04e520fdbe0c99c3a7d5f8b1d09cbd5f7cdb26b6912c037767f55be2b7543fd969af7927ae1103fa542592ee3506ea0bc1a7a6e283b5aec7d42ddfd5ce62b70dc035255d6b2443158bf2f14487f49d0e07819028fcf852e391602729a11b3afa36b25cb80ddd50488680c62a8f8481a5a5316e4aff49382d923288f8c58590fef7a65ab4ea268f3a1e31b89eae4265c8eab57a2bd91fefb98bafb15cbaff8c2f6c790cb453953c8f136b78095d665df9661715ce287dec21babcf6f059c29eff786325246b9d410d6a380fba941c032a2c224126dfa2176e52a5c076ed8054566b30403329cd2ac3a2e08b961ae8eaf355fdff6ec7e0a336d64b63fedd55c859299dde6f72b9a35e83a00bd00abbf1d5adcb123318d68e5c22ba5c538e9742145dc7df79a5b2e093e8829af78c61dffea9ca4c36563d868ee7aa5c358b3a47da8446e73ff9f1cc1e240f11204185b53a7e80f0ee75ca0c55d22dd62f0ab5da09440c433e44eef6b02809518481108718dcc65c70c24c3f85ef9c496ac6babce7db0edfb1d3a0ad09f4e140829b93f991f39161d163942911acdeff570812725fc0086d0797a3786e7162f9e09ee7a093e87cb5efba667bb0da9cb5cbe89b44ad4d8b0f3f5af43bf051bbd0f15989e215f034968fd17a4702121b779bf82e8331fe5bcf128c2b2f521082dfb3b672097956e302b21cb996f38199828cafe20240c0a9acad9adeaa9fad8a331cf65f0aa12981bbc0889c1c8e60a8e6609c58b1df0490c410a28e3a95598e86e3d9d2c45114747248702f5cceacdfab66d3cd4979acdd89d9d3177ec54a82ba6ad7a06a9ba633f17a712119d8f7552c80d124f722f087cb1f8d3397011ac0e1c8ca95b014c029619a088ff660433e84716e3919821cfe7fe00514eec058b0f5c32b8fec9598e3dfca54905a226317850bca014d4c8bbb4ddf516c08b6f14b17e3b3198c83a7421c77f3f69513d6ee68795452f89c22e1f54d2192f3ec8e3845248160c057788f66e0743624965d4ca4d5f6c59bb76ec3cc4ec1cf0af04105e00d95e53b50d652c1ff207d1346f526385958f805a8761368d29ff912217e836f7b1a8741288c18fe2829bed20fb39cb226103a58aa9f741e9ee42c036fe4505ec6f163cac09a2df7465ce7c1a266c2860c3235e43ce7fa00e5c84cd3d1859bb1c131037e0f28cf0802b5dffc1dd33940eb7b996b9ccab738da875aa3a98ca9eec14dea3c9763278aa0885dc9e83729714e38f992555ad490dd062f895a21f9a3bf904147be8bf671ee54c6873f0e3e3446741eadcc1da069908d12e66f2f1e7c957c3540f1d87f5db6dae3e395c40b151447fbfa509c8f1b94646a2bc8c652273e7ed29dec33df3493052252b6bd7e4db95d07924853a6719c24614d1c9f6d58f7076865b6388d8e3bcedb86d33b4cc5eeb3c96c8d11a67555436cf700b202f8b115d294ec98e912de376436e82f6d939b661448dc3940f6b8090b10d6ebba889b935792d351ca80c37c1bbe8a1e454d1677637befcc8905ada70b29a6c80fd5b33d13073b30df53fc2abf90be118b768f85aa44399e9c42179c68410db49938e53d5b9b78c35b5608338bb5b4482c0d814393b1545e81e5cf9647128e21625a26d9dc5220e462e09a7d9adf9a1968b2b576bc7ca0ff50575919a5bccd5589ab996e6fbc6d808f5c1356b10f64750ae67ca4d03890c66522c33d71cc6462019dd2757ee1949a045af9cca65dd722f6920cb888fdfbdd85cc82077904d98a7ebd60868c4505f4d4c9b711b406ed7856476fc86bbe489c0ac26ac6e06a4a3a26a24d4cc2f93af7d414369219c8d246d0860d698bdb7d5d0073a89706662243140e476d37c86dbc8336a1b65c1efab9c18a272bef58fb850bfdc98c1722f2e136c39d0906da848aa4f456ac8e628e12bce6d8f38a41288390223819be8c53833b3a31bd0d23b4792011d6cead6e15ff7524dc30038a3e5c71feefff206a25754c0e62c4582e2631ad4d5e6294d7f56aa12f581cd3242a4237fa82940103c64701dc71012bbc1174e6c0603f7f36a920a060483de9204e72e529d0a06d659a9eb6a4c1bfc1b3314688579f9d05088a39a11abd3ad8b6b893454734b791c008e98c9858d1025b3845b2a60ec85da62a807a9a32884460ad518efb2af340b81e35e040a8266ee9c6ae75e3fca1f788e100c1484594df3d21649ba102688066582f00ac2e0fdd45a6bf85886e2e30f84fc971cdefb71c1965183458efc176c6502a02028547eac50e9615e278848c6034bc042b191c8bda1456690ad50472104e5b64f447891f3bdadbd6cfcb3c494f2f6a41db1f6121a4498a2ddd569d2f023a5f82e20a4231aa43eb88e06431461ae43c3a502d1110604e6a41a8eb0f85c0f8737a434697dc1110aa3898c7374daa73a2157808e047e121de1efea159257cf5c528514e4f7efe67e178d5592c2cbfd2198577d890dba1d34bcf4c21179a24de9e925c80eeddcb2e40d544383a3fba152ef49d5ea1a5862234913038bef678a7e88e7c45a213f7ac28117b487ccc7d7043d29fe553f17f2b953bfd5cd59bd125aeb99020345e9195bf1bae112e0e571c4f355cd5b917ca3340909002a54920238c2b88cb8d1ffe6705d4129e4b27711a3546847163c5a69813df49a09a5c56d6bc3b5898db891e931d2475c9488bbce764385f0800038dc81dd5993119645abf0188e81b09e10fef2e2da489692c090c5d967a631207d98982d4e54b85617766a854755c7ec26a8457f48214195ec2f23216fbccf2f5d7bf24e2cf101c7ec9f3e534ae57da5ee6e83f9e45f45096c58d7a8230d1acba9227cb5b48828d5e223fdafe12d3ad273058140266103dc1b1f0721e107dfa1be47eb45622b28743dbf1445f114a5cb7b6be308ce6d766cece27c9e3d1b1bde8f0817d851291a82a898b074af9be794ab5cfb4e159de3822cb28ad1d68be6a55d66fb9ccc5e10e9a30f652782d858c98b0fb0273f286cccf15175c2bc6c8661ac9f638204b94f11ba1b8521937bba22008555cfed2b29733f827570a69324913d63668a96e7fee044b7fdb28711ba266a27af030f58b971070024fa463906bfa4155166c02438ce629228f33af06688bfe7accc1577505ae9c0f55fa800fa932735ba36bc30423fe2725eb301c066b9899a0e0efad3fb6eec42b3007dcbfb75fbedba6eb5f1c74dbd89c0cd6d3f4ae4c2d14156e3a3c588e5c8db0d2e7d2ed47cc6d826b80e2b177534a52096567c13916023bcbcf84b76d1555062845910dfa47114839a3114fdc4ceabacf1cc2acfa0475918d35a4f061f4ed6c6b03eb5b257aa4c6bcb633a8f5b1b0d9b8674db3b6c55feae19d42ad7a45fdbfcb342f9d7ba12fd37369f86d6447ff06d2d06e3c029f83f29f20c300b8ef69c95d0cfdba994d6354eeb6106c66c99c0193c560f5b44127ee018f12e2c69458427b3073f68dba556702c31796c644d91ddd6c0a5e0d64ee82a663d259a55e60f16d5b6ea7e9c6232a762e901f61421cc5370b4a60061bc060dc1516acf28b3386e6aeaf09628ddcc947dce0b625edaeae86bad41d48e52ab536c04b8dd168928b38a412d9679d4730e79c24441f1d06367bf7039f191f23aed2d3c1e894f0ecaf948f80be8f366d4708562b9ff1102061f7796decf20858c24a395372a51e7358393ba86e56b0ae53235f5a204a5f43078e64fcac49cff04310a1b8e1668e310b40fa57e92a46f3e6bf99c66636ad66310bea5d37e4c466422cb7a0af11c602b8a55459f5b2d5a5c6dfab5a0b36616a5fde7a80f29556e0bb127271ca9f02c77a16839a7be6ca24eb7eb326c17e6c592f98506c74bf20178ab830f02fcc018ce1ec1c96e76d7028419213fff024d3fcd6994458b8f1f59b7c6960719a0b988b599c498dd12e48cefedcd2e54a3f31b79d2d44f076a061d4564c2e9248a3800329837006aeb41584b8dfd2db524a6cda4292a4734868960d2841f322f4681f1fa793476a2ba51c52220da1b154eff9116f8dc831f985440a8fad5703dd85c0ffd71c61f3603838a101148738a6396419edfab1a73a3673d0ec449d16eec5fe84b93c3062b6d5e03027c2a20e517396198aaee311c72911c019c9a5baf3cfb1dab124f47933885e9fe26a9b9ba1312a89a106ae8ed32f2dec18204cd891bed1ddda2bd786cbfab1ec46ed14f42cc98cc5d1149fddb33bc64c0f5fcbf04742f2a733dcb6439b998d5719f2ff3327a4438af5ff5bf5c19855357345f6b2e58c256bd6959a65ffcd4ff638b8602d5bc7da3ca7b1edfedaa1f409afba3cae9f2852a832dce89cb964ab8396a1776a064328b1cc5a1632e67ba620867b57df951f795b0c131c80866c499b5d68dfcdaa1dadaf5bfd6d579b9f8d81e0de1366559a407218ca54f9f673e216893b50e1ad9bc4567063ea16e3011d623d378ea1712d13f24597eb42266821d28309b1237dda73b44adb83b017e507e4f4d5a276360507c816f4fa226a20f085a7181728a9bc4e0238759e467f8e718a3fcaca690ae9f1220fa3422e9531db21a7ff8278716c43599fb7a5c709fc8dbd3a5c61b14023a7917d33ca6be210db55f96a41cf8fd090452480f4e93ad6d8489fd5b0a4edb22e460423a25b26a15ffb424376c2c4dd5fff05167c3d201e7c8e681f4536fcd3c86527e30b30f591e900149be93104e3e081d18a0c9946d8378e7186b632f3cd9f29f04657fed0ae5bb9cb6fc32752dc3829354cd08270826619ca5d8ed26f751c68a5baadacc96316a60d635c837164b3a7d9430fb59d8005a08f226fb4852793393e3766926421a755bd8878025e4ca129f261b00dc27c53c63620ee2c9c01f0ef4af15895a2432a54e38b3a2218143ffeea571111f6ba523624613099d4daa97ceeb662f9a22e207458e7523480d427b5503c54f2ec3b337d4034985d0dab8a73a8a0acd40632fa886d972e4a3452f878c0af6a0c86c8ec9dd4034388bb09007e8d7bab7763de8e070024ea4af688c49e3108fb0a4ced5c357a38a2eba805136c7302b0b4a6aebbeabacb5fd7b097ef3c2f32d8e68d3e536a43a3d3ba5140970fc7205d8d04d75f75c740d53f582b1df9ad85fed4a9453427c62cde5ac0638b9f7b41dcfd867beac9b2d365d8f069f125c4a0323b54d78dd76b93063366963771dc3408c37b853e17c002cdea1dfd663af0372847e4c4bdb26fc38a39c08d6ffdab94e5f1bea08805618772f12d33b33915401dde011ce265427a1643ec85164c5dcc50dc0781f6946112ea976260039dc24eba36e6202afc59231ed289dbee3797fb21d056a1eb1f95ce6920adcb8cd624b5ccb477d0f3ddb1cc4c931b314041489aaf09a7ad3e989df04be1caea35030d107a9ac15a3f93c98ca809f72d2d48b9d89328f35e1c474dd6a012cdeac0041f4494ce92ac071648a31358024a12c47609b4a98da4fe6d4f486abd911aa19f44462880407d238280d0ac6a83a88181de81fce6bddb47b8259a623383f2a31feb9940a32af918fd27882ece8365a0507bc1e8ee1fc37ddcf57339280e8117c90389d87de8af270f6e8d9e9188ec275b1f31c487dcb4060e903568f134edab38393937002412f48bb43a171f2e29c0cba600d7d1c9c7525feea02a81bfd300271284b17202d32531234af81e33a84ba88f402a0aa7a7829e044c7ff7b66b783fbaf921d4e5e6625e050dfecda90a5ce34db2c293ee634a37c648f6c459e8299977a8553024e369aeb49b731e91951194a5f6acf42e0bfd3a94777383ac9991b1e707099e421765da5d458d1baaa687898f5f0d51dc25fb5105708f6ddc722e0b4cd1e0a382a033412b4f87cde0918069c44da9abd45125cf0568eea829349632a8a399bd015855a061c6d07fe0a075cdc8f8093d800884eb28b24656ae2d201bcdfe3c2486d6b61f21f7086191545c0e900c71605043ebf1d8fd34a511534718fb78153e708a4c666fc2ebb5704943085e33acd9185ece49acd92198cdafab5a5b5ce37176a94be2b4d2698ed42667319040d82ac319fa107d5cc0044b1ea174d126a989fc650319a1a1a2c08061fbd99a11e6ba51ce3c353a9a622a8c9efd27dad9ba0384d28b9fed20ca42021d19cea20067d40933f3c33d43240c9a12f500459202805340e49479b13eeb42b26cec4a2d9006dc161c50d35930875712604a019de0788847d8e18dfaac7cfdcceb840b741c9c685e7d59c1dce37bac52a5c0c5c5d04b893be4c82114ce8c6e3294af3552a22ce3f3ec09ab522196702e912fa7600f7a8d21c9ddc45adca35badbde6afaf7060832681c47ea65ae3726480b2c5fc83b2a8c6f89d9235d33a5c824c73dc4e0fd8b6deabd811e210dc94d00e17c1097b7a09ce4cec98defe04d0aa4f49462591abe00d689464087d821ec873b2c94b5de15053c8a3ed9cb67342c6459abc820f7f39eb4fa02d36644313e351e9cd3a10da334ebfc32c7d642da9c3df02d719dde4761e2168cd1a326563684168cc0c412c010bd98d8c8f54720e028f188a64815a37b059377ac2a73c83e949ce44755c2a8f6d09b7d683ac4b233e83ece902e1fb2f8f03fb3bdd6c48ee00ea5d5fbc7382fa1b91d7240579664ab21577c51ad17f216a0f41e26b8f2ffd634eeb2a5ed09147707119f755d2831af94ac5dffaa414f09fbd77c5c28a16db3459f9d52065cf28e80a1fd01a82aeba4a34109275c08020ae2c2533304bb5b322bf6ee5873c196549be48330c2631d14aab7ffd9d2a44062062fa563e31fad4ad199c9c55373be0787b9f8935c05dd86674498fa9992ac2b792efc50ae7c1a9c00e574c98f52a194fa876c5f6df731ead7f9a07dd62d3787d967a8cd36a05d72c7f83a817d68d57e687a083d165107ab808331657b379f5d0ee561cb1ba34fde0b0d0c1544d34f348321793facc4393d174188ad2c1edf09a7a5d459fc5e85552e1072499f85adc77eb8578105a4363643b3210baf22cc9442b644ce8c0fd620b202d5f7d70182d879fada7af696651248b68d9378f5a49309663fca799878ce196532b8f4099eb2c972979157ad1eb7098bcf51a4ee4208460528c0af10314ebf74f32d63f0e992d2456b566595e7e1c96ac231385f77cc18b68501a7e2872794a0d3e7ab8369a1d4c0433e0f0c505bf257e7e55ab39dbf7d003fce376a95fc734505e3e14045a07fe2b5d08fb00c6f137a0827ac81008e142598b303a3514b6f1e145905c875770d7a349d9f6bd9e4a586764c257506436ee984d964b503983c549164de5dbc5eff02e6314ffa5a5f08b1b953f30a744104a3e302fed9e4e4c9f89712fc0fd57ff5c46e1295c136d5b3ea7a83e9d6061d2abcb5f10d433610ef546819898aa4910c5231d7db9111149bbe3ee3f4c7efe40e25273160a920ac788c020aa5b5905c08093c8ff7ab8fbb1db60c601d47b3ffabbd5cd0d4abeed40ca8ec1cc737e0bd6690925c58c7705d026f7e1517db8dab1f3f615179fb359fa86a1c2102dc7334505a13552be0d9ed83b13d5d3f7e116c93f43ccd0ffa8402ceda3827a48ce205c6955eb0666268c89127bd1dacc7fd4ade0deee19f66b912a42cbd50056286a9fd644eb9d46ef0c6a6ba0172c3562fc3c0b765a25a411ed420022a92f2c7ccb876e7b01821a0122c75d8c03108853362db244e823880584028338eb2f731e8cbefda137225218f1039cc29a2b9d179bc8246bddf915440ba9e710481ca303749ce79c6c706f1a57a68d54d7cd7e6254846cbdb26452f87f5a7b365063babea17cd9bd4331ee0e30670a3824710c4360c879096c8e82430990552432830510aa850b4e96e2f8bd8c342c71e9bc26bd049a63c9aa4e82d57855e9779ab5e1d7bce57fd4ef3a45465bb3fc7efbf74084860b42a589c80cef0d827d02f54bb619aaab05357cc2e5daa75dc98513483830c4279a04e48138934727003d18342f749924a604b56c318f8b961b1423294ea0b06a6da44bdb79e22b1011da7c28a00a4704231b6ad61b60298dfa19ccd415add9feaa00bf9298bfcc74edb5fbf3f66d02d4512514ab2b787db4c907f8419babc4bdd6b13aa7e544bb222b30d65509a904fc9f908edf72ae0483df76e3c1516300937a313da4a97f08a7efa2c1632914354f801037a00978777b9d306ec63e6f637a21bd11a88d7e332eaeb8386c72a834658391a5187d66dd8fce66ebabab50e289e75290cd8d8ed523bfd0f34a853f584069731494735795c80fbd618dd7dd9b12ee293161b46eeaa47b2b723d3199165f35319fc2414be1872666c103ca92d2230db15839af085b3e3f40964e801918d1a772170286b4543c5530aa33bc3c49fbc85a65dfae0e21c065902104f418be6bf727d1b22d90b0a6543e07906e9103d0ddc1ac60655458c1b4287d190f48405b0c873e2cb58a7ff804f5b078eb49ddf7d0b75bddd9d1a9410a832fff491e855dbaf98ef5e4543acf1ee898c35da829cab504541aa4e8109400bd90cecb7cd1ef730628dbb7c0a6a364f12761ae7ba45c38ae2c85931d2b6d257873efc3876616e84f01544a93bc462e42938d4d6b4200feeab0ec6837a0164a2e73826f9829170f3e440074f63f7c10b98e17937848c30417297809c75a16d30694f4bc08cf5de6a02de9d1ef90474a5ff1b760d9fa202154749d4b610014931f3d831bae4d418818ac09e2c189faea36f24c2b7502aea3742ededce83a393a042540595622c95edf0f54dca0d3cda4bf030e33ac03a093581f65e14b367f5eaeef2a93f5314c15ea923a8eaa67783633d5154f62628dceb54065c3ba471bae8631cafb843de611d1019cd27851b5e7a28a692e010ed9683255a3891eb01214636c9960f613ac630d6b31d1c0e2d06f97b51804c4174accd96277ec25a464a69552fbc80229eed0bcfbe1381b2346dd91d84eec61a3c3478074c0388b504aa39b263f4c0093ec8cb5eb250a3ac5753600b0c233a30d5890eca3449b48fb29b73de771b3357e3cde68b0c33c82f685bb74da9d952fad333042ed3cf0792a04980ca1986a8442d2bde2f695a0731a0f7e7109fd0542b93733e081412a27d19a4733e4e5e45d1432e69c4a3155cc1b1f9cef8121f84fe947c13992cdea6ed9e81ac1304cb10212b834c938bb4ec4c04b0ac170db0316107fa2fa20ad5674e4a571a7091b7d278459a1c2e84aeab7760e028e7e0baca157c5c01548cce9d4a6eb50b529cbb244645e91c0f5126395760fe2e48ef35ea70760f449d47bb79655e7c0ad2b9b0e280421eb7b4e6fa1608aaf3e44b7c6f1e42c109010092b4b884692f305db3871040826d045694989ebcdd67c0b1bbb942788bb867f463ada918b0f519d7b663188b40283cdca386816879272b035dcfa1efcad31c1fcc3fed19d7a28684a78eb2cbd81de6cbf12bd7093ff372f98708486f11d6efcad5e59eb28960ca31a0a6ecd828e905509516d2adea3c3539a7269132f95d2967b7cef5f38954ceeffa9b1e35d3019c76ee0417c14a00b57734f82db7e45bb0e3440241dc2d9ec8ffb599d7861fec31f4d21c14f1dca47fd35b32afed8fbfc791bb6949ccf21f7b40866d8b64f01f797a96bf42b6dc87298c497d1c5aa472f0947a771cf074ba0056e25c7387e9c308cb810b110965aab212bc777b4a71316c2123b6b036b815dc781ca4aea1e2d096dffe253c3f8f7e6c2c146a3e6e790c58e2c0309e2427482483d5f9a5e046c0e2561a41631b21de88c82ab5256d462a5633220a9382d51193bfa72e2e760a1086b16c69d521b1634d0fb28fd380f0b716957b10238a0b0d2dab9c9e3344b32bbb1600039ad7df9d9dc54692a9659a471115b8743d7d434b25e65d5134b2b9741387d255cdf6a4d58be5de937048b61739f15c14a113a9fad66b8a992ea520a26c818ce0d4b919b283b8994c39d31531113fad0d0480869047b27f35c156c0cf942e78c29e54730e278fda211069d97db1d0c17243415ebaf04f98711bf9f3d60473886b2f909a8c7df41fd4440dbfb62b37e19f88deb27a0f73e77c22b67075be918499e96daf490141729881f7495e5526b0ea9f84d00f3ba8e4b87ef128622d0002c553ad27ad5ca6082093e346bad2728e65b96b54ba40f00f96d352a2a55ad770f7a980a428be2b8de590160666e3c338c8cfb2e01bb77292df82827b2b133b79ac7d45dcb27615b99c96caef59312c2992447a9dcc0c25861122d5e21183301269b64ef19bb8e120b1937270094306cb43a0d00870b772ac8922b4ac6b8198d5dc58a1a3c0d7a1962e7d2d75eb3ec782b71b6318cdf90c47d7c09e6287f706c4d7eb19312c4c39234b4ba993d791a7c305117298e321d4cddcdcba35a998155eafd5cb901d1e317c0abed5bcdea277ee38b980ad22e887595fa075dee3ca5eb616a93e1f0ebf8622b412e593149b637004baa4b4bf7fb12084492065b93186cfd1449f9b15a0d1f594bf3306987a00a766d672768e146684c9b28df0af65427b6ec7073b3b30dcbeb311b0e3f151f2f71d8f88c79c6493267500999e21c5cbda1ab340812c6b9b1cdf9468145d9099b8c9da395755e571f0c1407974997cf7c26b6d1a066cb6c9528acbfa164023e88e5c0e92a5c0dff4740ab7b683b97879308d179480c6cf00ff7669247511ca44d102df3b2341e12aa0db5943ad4e97fbba3dc7d2938db020c9e7fe63e2609f02cd5850eab93dc6a809d424c765e51c2c7b695eaab1ea66971a9164643921469081dd6202f771a079aab5f815a084f680e9e75283fede9bba36360bb20b2b346ba546274a0f93557277907de54e9ed28197c0e8e8c5847cbef38b94c91f814143b4be338d2651d32fbdcc63828f3ad8619edcc310969859ed15dd78be8a134f8067160e29b8d34129f412de98fc31c12e59cd522395ad611bad4d7c5c6a0519372211d70921f0a012c40f28090334177b0e7dabc101593e0510ce406a395260f1ff1054db35792a7613919aa9d62349e263a9e3a2a7dc2c5de61e08cbae0fa23c889f62815dad29b3405e5dad8ed90d3fa1103f89796c2f50e0d36a659885ffaf2c0a980b0c7e7a628f69e0accb0acebb90bec8fac5aac796d8ebb41ce630d5d4db4122eafe9fc02a44da5cc155aa652d23f313bc94fe61cb2b3dc0ecfb8015f04af112a56d95225ec0c7a986aebe2cf5f43ecf82b31bc663e705eb301ed2d1381e704aae355ee2bf786c005c5a47e3e384f52001e1db7df57a69e8c9d8332b4d217708c58b27013843d91b8de07764019de30abde43c983e3369d21ace46d629879fb8f71cc2584889ae99cd47abdf543b819a8511d50cf8aa9849971ed1d417a305c54df400dcecabe842d956b85a42bc126327331088ebd32ab75bce881a5f1f615cdbabe008385fb654967135bf9c7c95c502eb789d7ef0ee67bd633836097fd73bf0705b973155b97a3476a9102bc82226a8fc2ac451dd8548934653f229904d0f226bac70882b2dd01f57c5c2e477f326494a2d26a82653abfe5c1ff71c7dabb3a970f4089000fc76be38cb2eee372389b0d67b7c408bff2e83b929f274f5e893ddc941a31b5eadd70d10e3b141fce1eca30f9cb300fee8f59cac74e5fb9653d0e99af8af31934f1e6d98abaf69e9570ae84eae397f2046af98b172e6a9e84f77c67c01fde6d153c8a1a6adf54c4a39ea1b76cfac1f2e2670c659746c80e5c65205478b3f570d5d7df59248f4a3bf68b0afa8d873cb3558ab2a1081868bd194a1d9577f512c3b669b83f08e5e7dbda9f942ba0784632736906426a99ddc4c1a367f1751452bbf92ae97277369a6606b650ac181baf2de018d40638177f886bea2dd6c228bea6edc8a2cb8b5dcd263f175f57cf3dd3f041ae1f9aba7b9f89fdeb275c0f5a3cf913b1760fc805217dd679a64f58ae4c351ce6388b70169a111696ca0870ec91735c15486e698b07c61ddf4095059cf7984a233f44a982380c7885843f522ef9d439bdf2dd00163114033c9d3afd12b8d6cda811620bc7f4709c6cc0676de01e7f39406bdaaea0bf711c4545d30029500434fd7c945ed27f716308c94faa65b4a480c31d0dfffeda25078df1947952682ebb8e2e27a0d2c426055019b686eae274fb73ebec3f7ea06dd4c08f58ab087a41ef1547dc3687dd7b0197d1ca0cc4f2dc75d4190482202eaaf987c202467aaa8ae0f4bfff3e9ca6e4b6f8a45321b2807eed9ed4fcb2dfee0372ac8a3c2aac818b46e6c23662a129722fe3c7d47ea87a97cf8eb4a0790d03356e3b0acfd39b07de7076396d447b3fd9781433058045ef4b4dbdf549c1daf8be8684c45bcd10554561e95229e3de19d1cc71233e4e7d80885d51bc5a64b53cc8a0443acfa57221011c765c6367dc2e5d4cd468ed09dea621b93b4b399e22ba352ccea8b1b59a8472f3717d42b6d79156bd547729de6566fa4f1feb7e2a1e12d2191be044b280c5ae5939bf2431cb61671488845fb5f177ac02b6b9b588e6c8e0c01e7500ebceb0e243ebcc2c5228bc489c1fefe25dac54d6339275236616d0807394026d70c4ea0e31ac49605378e37ebb686bacc47ee981935e9a63700738d607f8280a2c39896462f974f2a877101b5d5061f0c748dd8fd06cbd092924a54f2ca7215ab7108105bdb578f3adc1fdae7474bb1c3a02cea0fcd1018d7c8179915db0fcd5a6c30ee5048f6e6eae305587e8a6eec459abf1eda678724384420d9f73a9ea934ebdfcdd62dd3b905d2581f782c7eaa5ee2ee4482e576893482683d8fa72600770766bd88f914758196b1e112c928a6cf23eeb97c85f6abedaaf80e79aa66a38a69e9cae3b8aebed64b58131856e40058b0ca016f507dc5e00bef5b13fe06e9919648af1b2c32d9d0e50d065deabb70d59f8cc90b3fdf41a9a27c978133717808b42894b703d03836debbe8199d0dc8d10a3bf202aaa42ad9d4db31e6fb9300f876be782bb73004d3bb029a360f76c6bbed36c8d87b04ccf9e5d4b3cc3bca2002165e8f40b40e9e5aa6a70d999fee6bfc7215b7d2391c3d91423d1a0492e4c5ac7f099e6a2719e85e81fc96c647550be6483ac34cc37c7f4d05dba5fd5b580917b31959f63a44ed6c48d0e1fd3826688f7f6282fb5ef1f2381f435b6e8247971b03890c37c41a5f2b127a90207f318d3692d313550f5d68943c0800825d2c639ec910c79b9bc20d1cb3c08f25622f6ee849204e1b6fa20c0203498eb82e0386df6c7cbba521891f67f4098ed12822d38aad367fb6f18aed1de6d8617be8fd23dbd0531bac00cf2a479ddf0d7cbe05d3ae292565df4124af2f2edbe268e0eefe0fe610b1f34cefd226012b86de856ef9d7f5ef70157061b28d92cd87cce0a6b284eeb0866df0a75cae2ce7cf8f9a9a5bfaa5cf563711b518d22aa7a2aea2c0b42989fef821394ee8fa07536aa94fe4f992d5b94ad797b1d6f3e4840e0cb602280131f42a4914748d504782e19ef5600e3ac23f39f5c4ffa750a6a38e39bbd7091c7d9ca7f06e2f38d057b58c74759acc572eedbea6c556a766851760d1baa12ee68f64ffdb0151b26b42232e4d5bf18c076f3b5261bafd71936ddbd18ad070be1e2782a6d2f2401fe39a9d42f3a38dea7436afc7697452bc2da826ebbbea71d28ad6027b8cfbf738296b81652bdb9928276751683a993e439c02e8a604a6d562449ab7ce5bbc572cd20a1d4ae3736c757e0499ba692909b25e60199686887e02f9f2581cb13ff23f8cce879c6f9f9b7e5bc8aaeb88dfa780aec24041f92ce75fab6078b9a3069b18fd9977abcfbcabab31574dc9cd62c03bdfe34ca78c9f1db30dc8b6b1b178fe69e9e4b0ffb67b58fb731f76a9b01d53b1e6338a3ec6ebe2c3fc87e45e77ed98d0431c978c293c1bbeee678eb69801c35687435ab22a1c9906477ea93957a4040e0dffe274b2cb0a7d59bb456a1e30909d8ef51457600e9d6660069a9a742ca77a9d851d613aca32da919cdd780241e095473227329a94d795d832ee2cc7fafc3a8dd8f03533330b451ce899cd46e0b81330c23e68794670e48f14c69c1f1288dfee6ba769625ddef77d4668608148244aad8e7208fac617af10e208dc9ff715b54481f9fce5b85ba53008741a50907de90eca94de6dca8c39d36fae2cf0df6bda64be2d01950594c75a45279551bfc5ffce3ff40804a4c8e9740a95213b2fb9397f83f1af2dc54d3a05733b084cde97bcf5826d59068f06451c36a318cdfc0ca28887054df7ed1d05b9a1f65793a0512e6a8fa359ada93e40be996b6f0785e75171f725ce417cb876536119698475fdc520e89b2f8eb59e04cc07588e6b4e0abcdab6dbca04954bdc7fe13ac6d33c3f8d2e2d8d3ac8d076cb185d42b6195285641af3ef6a4d83e8674aec106de7cacb070600e86172895406b3ebcabd0a40e2dc81ac0f21a94a08ba300e83cd93f0157aa0566660df53913564602f6fb1125a5f7cdea7a9fd6bb05615533f41d7ccb0e3eb54152761c755d565e432eb9bbb071851b04e170b2792f0a6cac247705b2a3fe30aa86c8f1e5bafb8be5d0cdfd27f211b549642ea610a42f97f0418d5eecabe6c8154e68f49735e04726342bbf2a0f8037d6c3cf99c77aadb35572598bb8590395d2cf6bc1b8b7479e17d2e90529198f7c4fe3c17b67d3fa4463bed24f4f7802a5ae0b259eabf81abe585f59a8f4ee5a5a05f30f89de7e9620888d45df03b5e2e37b3a06608a82a995f628f086cea058aefc7d7d5a77e9e0b5bd71e0bcac8fd0f920d7824c256e40fa207180e631f9cec123efa0c8d90bebf18427df7c529345807ef7b6f090fc002d30308ec8eaeca0684fb15e266a98f0079e7b690283504170f3d40f8b04f1d7a094b7c0e62f040a407a83b4677261969af3eda796a2bed57e53a586731669d67948d795858e0fa627d737d28e80170f2cf182028e0cb494086f4d4282276e8dbda95d7d00b02808b3cc01b8b95b906bba1986a1ec3dbe2f879e305eab5be0bc3f44b2e0d3a68ac930ceed773132082e8a05c233546d43141d10fbaadd590f620de4079058e4ecd8b863e2845ea561c3f2ea0e8cb00f381431c9a495d0ef8ee4b44a8f6312c7566b21678f30837919f2069388f863e549309c51622d0b7640f3f48873c91dcd34ed29596db836cd3760218b0b6c601e0246a43ff07f24f7a486a717c86dbf3300bf0440a0a2e1afa022d211771ec8a42df4c2c4a57e7fbee09e44a34022f2bfcfdcd7cc08d65e87e4d6a15828c4ec1dd27ba9f47f2ff6bae5286fe1fab5be92aad653ee49a2da3d8d45779fbf8c5466aa07c3ba1713eb642a894c9fe45d70690444be76ea574014803f6e1d9a50e36b41f954534a20c8126e639781c4dd823edb3208acb7241cff3babd4df0654a3ee474cf9a519515174a63a13f5f198f41970bd53f311ba849b26f5d685abc50883b5a307b9c07637c6c336c3fd90468cdb3fd006e32d18990006334a564e42f0ea63e865ca6d43cf6757d6d3c32771105a66b52c52e0d59c8c932fff8fa1b1f8ff58870c9836393eead25d5ca5d1c5aa952d0c779cdb6709ae7948783d41ebeb177d508d4e3424a588e85e98c65b5df7e4ac2457f21d5d68a375e7a1a17dd49352019dcfb40267e43735b84ca0f49ad007ecf88eea536daf53ae2393ceb094f6c9e75d184d443a4d0a6e878b950b5b2d6d28c88568461c4bbbcbe2d3b3277f4bc16bc9c190ccae856a850fc387eb90d9c4c457d8a6d33ea7a920196da7c0ad9abb0c7eedf6b9890ca51bc2e251e2a81a5cf5040e8caa6886e013c59842f479f92830e9741a07839416f44687242e6a03d0e0991270b2e6c399f8a7fb81f1d72c020b59772a4e5034d8a526616a0286783ae6a4deebdd19ae2c16f469005e3db60bc5217652c037c07eff42a6895173ed75f1db7ae10eb95af07daeaf9db568d29946933acdc7498130ee38f5f9c4a4df8f1adcb57b9c91f32e94ff91f0b152e24ba2ca4a55d03475a252e6d0477a9dbff83a08b2036e69322d08f6d04e636bb0cb8e753b03f9402193d274e06634e21c1c2bda61d770b7f455bcc031fe4097493edce3b55f96126c0073d64fcefde5d14c1f53a66d77b7b036babb6580c60a3ee85b516417786e6adceb99b0ff606bc687892e0a316b59ea2ddc5d3b31350c150c510f7f71f6d9cd4dac1203b7eb8a3044dd39f57464658ad90688244416a015ed02d2fe0ccde7ef3135ea10690f037de759d78f87e10f0f6203b9f813aaf486224b4329fd48d4f1bb65da0c2db2b3a0db669da838985875441825c46e706a923f1c451a4df3d457838ec21f7568f26670a947ad0df2a7cbde37be95a50efe820edb73fd4fd6f9180585e6f2924be604745fd9ad31c16fe735972316eb762e25ed9fef102b5eaeb388b28a9369d4e759ae1f728573945317852beec846e5373b71124b3dee597ef6ef773c0c6e40ae26a0f7419f74b2aa5f9332aa073a245ce2fa7f8cd463f5cb462741b7a279f71b2c58751fb84c114f5d3a185574e1bd8cc406930fa10aadf2cc96d4e41a2ac4fdd5537deefcbff302137f71f076f28d6b7e725f57deae0b08e38ac7908f889c89e0b58febf6a706877e4c02decc187c345d10927dce9d47400965f2bbc0cca80039c97ad70706f2ae1b4c221c76b7076b86200953390eb372d96ba3f489253f30b4e5be1178841a08d09dbc1ab4628ac815f39c2ff640154aee3a8816a70c08fe46779e52e9cf2b5e1e3b510035906327fec2abab4108f4f507f81311e90d44ad19b26c4b45cc72d347cedeb96f02a797eb3e8719cefb9b3193f3d2045c65f76979ab384b0ad31b9085124232996b6666df90bbbe65f28e16604499e366f6ed34b9c609d906f56337e03c00498e1cd11fc5d37c27f61fd013300a64016e192a4483f0e3e1834601ff346d6a21064197d721a89529d6a8b529ec6e96c4c7adb616f5e9c73a802fd91c6d7cc980db0147df8823b8fd2d846e8cd42760dd91c237bbb57d415e37801ad460497dc888b3dd6f37c467c9ee4921e1b4e3587c4859d7a8e4426d02085852049da8d4214d8c48b2371b32588b62cec87b74764ce36a4070808065b22fa1298853aa2343a8ecb22200fb423eac5dd1de0b7b8537b9fc1ca2c98039d519fd480aa7bee339a79d918e5475e7063770abed90174f5460034a5ec00a61679c051538b1cc04a87a97efb33cb17b731c22f31391e4b4884e166a19c3608b656dcb0032de58e055c8e038aef2e9b551050c96c3a96d5024ba305361c757a9aa576bf9a5d55a0c7234f9c11732742d6afe2c5ead19e3bebc079b04f7f5ecaf1325ebb660c79ca54185e6699748c1d61e2ded6bd1807f0f8d3402da46dd96dcb2da59449cab609b1096a09f7bf211705f0f7bf282e06e0ef7f445fd167f44df98e3e2a1fd297f42d7d563ea6efcad7f461f99cbea70fea8bfaa45cbcf9fbdf948b0df8fbab9b8b0cf8fbab9e95cfea6705e4a2ebefaf9cb86881bfbf0a72b186bfbf7a227776fcfdd511f20791bfbf4a428a43febe074569187b52faf6f2d96306daf73d264ad34354761f37ed1ea4b862f2d894d338260fc84511fc7dcf898b39fc7d2f88d26693bfef09b978e3ef7b505c94c0dff7865c8cc0dff7a2b80881bfef11b9f880bfef15b9e880bfef1951daece1ef7b4894367ffebee723775afebe0acac5d9df5745b95881bfaf9272d1c7df97525ced40c6ee8fdecfe8f5f8fce81d31f9d15bdaf7554694d60109511a6ba9c8c509fc7d15918b393f738a353dd36b49237540477b685f174ad34854e5e3e208febeeac74512fc7d15908b25f8fb2a272eeaf0f755412e9ae0efab9eb888e4fb99ea169b7decf5fa55d3859eff923be374013d0714fc4b9c27f810bc4dc6044846408221be5d1e0438bc10df3330201f781b8cc6050fbcfc3cf081b96f785b8d9a9a0d3536413a60f34238f02000360086458e843604a0011b4606408019562b02ac620a30fe108980979fed004fc3cbcf9680e77116eb69781e875940067e88dcf2b335e0e53764ee1b30f043e4be791e97c0057e88dc379ec75f6ee0f143e47e791eb7c0d7f05d575bd9d3adbf0149abe33ad5bb6a78d77b3cc0b93f87a938dc79de6310b6e3cb2dece18e5a55ebfb7ea2009c7b9e009cbbcb2f50ca785eceb0cf5b651a56aea1734d2bdbb4e477f15c197cc9218c17936dbc3c196f26dfc0f20b4d76d5c82d60f56c720ee0dc22f8890270a200943b871c9ec7e70940dbebc50f016893d1796f48879f9fcd048f0368e4880eded1e69e33e2a4154e0724489ec73192979f0dc9f3b83782979f8d04cfe31e0fff01d00603f29ee799e6fdb3b9f01e00e5be01b4d5e0791b405bcd7b352f3f5bed3b00da6c823c0740dbbffc6c42de03df3f1b007e03a0dc47405b58e43dce081bef9f4d00af01506e2f03e0dca0149d01d006f31e28457b9e17516c1eef9fad018f0150ee0b80b61b1078f9d91e70e3e56793c0f3b8d723af9c564e2ba795d3ca69e5e4a990270f60b774db01ec987c64ed83c2a3f04840d5138fdd3701a80af2d87d1d4095138fdd2f01a82201a8faf1d8fd11dcc73ed807fbe4c03e39de5b21cf26609703d86111416b49ecefb77a627f9f054569d265b297bd90fc812c7c0744692b272abb8fb1d6afd77f2cb672dab703daf7b113a5b580a8ec3ec65abf5ed869dfd74394769ba8cc87d23822d612a5691f2abb3f3484b126e27c346b074bb646a234ec43574c2eb67a64ecfe7d8e89d258502ebb3f9bc562ffaf97d63efb3ed2be2ca87d99f67daff35e5e7e360a3c8fdba6f4783fb0c68a37fd733dd12d7291027fff1ab9a8ffbed7651ea0ede53fb0c6cafc5e5e7523df3c8fab3e1b137309ccdfef925c5cc0dfef965c54c0dfefacb848c3dfef985c4cc0dfefaeb8c8fafb5d938b08f8fb1d16170ff0f73b27170df0f7bd5586791e6f19b918f3f75b535c2cc0df6f1db9a8c2df6f517191007fbf85e4e20c7fbf95e4e2928b46fe7ecb8a8b03f8fb2d26177bfcfdd5678bf911b4c5bca773152f9460622a69b16163622679cf9561e4073e8fbbbc578ea912b5e74cee9866b24b1935b05ce3791cf6d968deb3c93553ecf979c87f20086de42a446c1e4ccc9ebfc92100e7060138370ee0dc1f00e7f60038f70de0dc36807377009c9b03e0dc1b00e73e02cead0170ee119c3b03e0dc1800e7be408d95d7f3f88d0743fec01a2b5580b6e4f11fd902e0f735e0f86cae2538825451f2e2032b0064568129db86a166cfe35e0b9902e0f75af6d95e3e19c8847066bc3c8f7b4226f0de37c477ce04928061086bcb2a5ee8206748bec19325007e1f01b05b8200d8597900d8313900ecaedc002282039edc00f07b0680dd12ce67bb49014e0cab2dab7841e526865a9e4bc0596b0161acf5eb95a3052484909c250f800c03435e00f8bd026848000b010730004c08850caa2119720c2877905c00f07b15080076563c767f06b063f2d8fd15d85df1d87d2360d7e4b1fb03003b2c1ebbdf03ec9c3c16f3814e2872b75482728a29329580b3769b28bd4db7c9634ac4a082125b1600f87d0056f86c36b2ac20802360b12180217926f96122412614d14942241701bf9761e7b385a10a766668f189210300fc3e06209f0d04d10042802a5edc78dc23802743de0176369038f789805d1733e7fe10b04b22caf1f7f5a3ce41b4af0f397ed43be4610005a832e53b0050040e3877015ef86e981be78b6421e0f7b6fdd95e8ade07501afa00e420e0f730c0f0d96c866040804b193602c835f0fb6dfb6c35610b6c09e8986a069079c0ef5f18f2d96a80670ca1a18506355c00bf6f2186cf46f3440c0ac082e679dc33923f30ac420738b70264f86e985b07013210f0fb1f01f86cb02b02c08027600cc8333b333b5234c06e5945298c99066417d059f8ff86f876095900bba4290754a93224c4bd03e4d903cedaec01ec96a8ecfef4e998f6fdd5d721396101337c42e66662f63c02b20ef83dad009f4da609058000de5209092990791ef7129045f0fb15c0037cb657180e411fc08b00b7a5d2135d6c1eb6d7f3b81781dc0256ef037dbc8d6f48dd2d61c72471eefb00433434f75202f903c122e8ba6515a527360f706e1af20786525c0ae0dc12f83e077c37cc9dc2f3a859b5a89038f783bc58a222db07b6a67cb69691c4b95f61a0bba51f5b46fb7eed13e2bb43ea923c765f8632340ea4ed0969dda12843fbca2c42c2edbda702bfc7dde77ca7c28e6fedf8722ba7c777dfe3bbcf51a1879793a36a3dcd3f37cd5eeb5bad18320f91fbef7beeb37d53e8ced67b9cf71e007207aa54954a4abd906b8172cf40df39a0efb90494b5a90494b5990494b51da0eb00e54e01947bf680b296031cbba57d5f067aa0eeb143daf75bc0ba63e0d88db1efa3008e2aa17d1f0738e61ba0b4b141b96d40b96b368d9401e57e8172c7c8ed02fa6e01eb56fd7c6f35f74beeac56df7ba0efeff5a77a3c612aceebc01be8d6a1b61ed6d2ac950793217fd7792a0a8b41f5ddab58accff957482eb63e9bc47971eb51ec751377dd8fac1f573faadefb09c2346ba5e26617933fb086065a56b1c1d41e5b64ecfb4ed8aa1d6cd567709c3ee967ebbac761f7d3f3bc7014c156e11ab65a7640e233065ab86edb2b875da63ce6aa9f5a55402ce8d1656ab37c5cc45c6c7fd6cd45a9a4029fedcfea71716e67fd6c7f9729568fab7cb6c370d83ecc5e5cb90cfbb2672fae1877512ed6b769a22b11dadeea4b79cca73ce6e4a0ca47f5a3025239e9a2dc3f196236178e22d8dd93c7bc83f22eaa4aed917553f9b06e1ef3b7f9d1fefefeb4fd47d65307d545f9ab7ae4cebc7553aedb963676c8133b99d9520b1ed09035b8cdccc74bb0600734384d13a1b41795cdc734d8340c1a3cd9f483504a298f1158f0c5bed9eeab9b124b53579a5e6e3c49b30d0b74e571c2db4a53bd7d1f3ab3ef3afc1ff3c153c4be8e6d75b6a5b26d8739edb46d10b67d97e5388e9b2176d97cefe5e2f5fc93e1ce948e00c5e96789133cc8319a24e10a1bf4d0845b949de9d8ff9875800f4998a2081f84f0f444cdbe0ea5ed5094460c9838110106d053cdfedb8fd9bf5d542077a74d2e3acd863e45b2e2e213147a346523c1b447ca844414bda17a92a47eccdf74f37872bb01ba949c4f5c1ce79eb98c7e8c3ea141f489c7e84b894ddf75841e1d8a22515aec47ea3452a8570e304665f565b11085d70b4738a90f05a2415448ee40b928958e98c1a6ef512eba6cfa2e55f36eb56766859e47f3873ffd7abbf1f45d8ad2703cfddae3345a942493a81693e6499832fa2a554bcbcc4c18e6c8d1638fdec3e557efa043cd1cfa9268769590048b10a88b1e397d9b11f48833f6541cde378c9c361be7d19c4be364724da83d7f164d27defa713ed136de00e14b2cf2c96594111759ffa3ce9e4b54467fc2c2f1f794794d282ac3381e8577281b8e1a261c5fe1f8ae708cdd84e3ac65b61d88d2a370d43624d4a6a16a027d0f72e1a8b3147b1a0bf1db84a3ae913d4d38ea87853934968592c642ea501488d6af2f138ef8158ebad6982b1c6750504f76fd9610a80534a3ecfa1a68d34701c4c1a2475636d12a1c75ea542cea77c572e5e875ed0d704a51599db77a77083d060947001d11c5964a470879bbe5e6b5a516b7299ed0151a624926ad6e449c60c3ec5146ed39b567cf7e4df11902e20845188114c60c6412a64801840d7e88c005185c1c65df01776df5a103a4ba199d67b169d898ac70228b0fb6b002466d48962a5b9021861742b4a036c6a8608254122122966042ed861a2855895282032a4fb5231c5831c4136324c10849a841a53175c40fa24863a9f60120a486b87284221c15e1090bb8a9272f78d2c49329b63fce2e199cd0b12d9556d084ddb2a5d20a9cf2d195558260688d750d2b60ba32b4031e4660b17e9d73a72f958c40634b2523a2603414a2da76ebd4c088db0e6e3a0042aa9242114fc63882ca314a2983a0a79c4f29a5ee94de3c7953ab355ac394569d09fc1f132f5bf39aacd99a675739b3962377aaf0b4a4c9a331ccf87142194974104502c8b8728330b62003062dd8214a101850482146151f3009a2022ed260120422329e5ef0b4a48960e8e728085010e189131f0855a1451386a8384142cbf9364db4bd05196da9a482a39c2d955400b46958a5a63c26e5b13ae5b117e8d13ed9f3898b6395da522efacf5b6d22d1a53dbf4e99522eebb9edf9e3fcd9d3faecf9f36dd09e8f014a73a8514acd399b9cf6fc4aa472a240945e711aae5d218ef6e8958873aa8d6e74b4e743d59b0fd09eb5b106d1ea4241140ba552adc89d28d4c994fb12b5a293a61441a14f36fdd9f369cf9eb5a65a9d728979e68d566bf3f584a2b49e1feb64cfdaac8d13692ef9d39e51af2915d3b142d8081e52d296f77187bf8272db1a8e47903c2697ea947af4aa532a15c9e4b17985a808ca500daa4f6a9050fda940b75d7ba2a43e6acb29a7a72b4d4b56a820194d89422404c549900ffd99a2b72d9d695f9953d239e79c734e9fb388c7a4848ac2e2b1a41dba999b3c7933b69af6e59e036b6aa0e77fefcd979c93b552751cc65363ddd25887e334da77621e6f3503f9e3362173ee6d62d50249bb445476697789ca2e10da0ca2c6a60612da74222f911544443f9bd2b8a8d793c672051be9a3edf321f97c4b514ee388a8ccbba25d3b726b4569b307166dfad44069b3c7853693bc50da54f2a2cd253294367d80d1660a9ed2e60f34b4091452da14c2c59bc7ded4be3df9c7c9c6b239a6270e4a8aca2e1320985cb4017363a62587184ed5714a90fa1962de4017449d3fea8c7840ef06de27b7073a7e1e5ff5c0f2790f6c428fab1d35f4b8247951f25a22e3032c05ff030dd07b18043d24d3498c07f2fc07d6de05f0fbbb4469ad1e97dd6ff52ced8b9d5c76dfb1d36dfa0e8823d2482d2020228e48eb4b4469aca59691cbee4beb4b8471cbc8e85d784e09525c81b15ae2a4286db562920aa2a709fc4ae6104100f1dea41604410ca3ca417e88b74de9b1d5b3ef7b40de0302d6d8de07e43dcf2008048892d58864cf1b1090668356b47a5a3e4e9b43849e07dbf20bf23c1e2408d8254da1e365704654dd66b358ec9f22512c2291c392c76e80d26330605396e1be0ee90727a074d9f7daf24302824890805d52d8e4e68b69014511eda7a1b1436a09dd209cf093d3f4108e72ed113bd1ec113bad608686866c4804fed8a232b69290fcd8b2b25fb6fc62c22ec9633e487c6e7c906a136c80dd122b83aee9e4799c0545699d152c37174b6a06af4d2761170a09e1a23306c12e099cd22ddb93ad29e98a89290402bc3685083b24c74180130850fa0a637765df079700d46a6df9d1b43206696888f801942e0bdf6bd15b7eff2fc5c2a3a6f9f165530326b16a841a290c3ba77d9f261c5f1f861ede5a562d412970f9b6fc602e19833058143eb8f2969f8c2b6350468689252fde96dfeb2563f0f50a59a00446b5e5f782c19797a824dd969f8bcbcbcfd625391183b7fc6c207162a8983da07499f7e2b6fc6a781ef75e198335bcfc6c35805dd20c5c3bc06ea9257375d82115e97185b4efaf9c562e80b5199e706a86860630d9ed5d8ef20439b2d78801e492ce79474bbb25520449e7568b09d8d32df90a93c9cf1fb0c7e76b9349d85971d97d255f93be82be36275c0c1c71daf175e66396235081269df38e96d61ad401a2a373aba57d584d789939e82095e9f62e47eff5b0bd36e0c06ab5b266b158604c478cd5d29ad503e871190f4173d3e7c7a7f53c6e33f6ed5d8e6a979efa3d6cefbccd9e5ba77fee4eb7585abae8e2ca8657e00ba4f19ec552adc070edb1435a2db9d88d2163f476569af67dee1352778784c6cb0c7a1234e403c1a72a3e7bdefcddee3d9c6d057282bb9f1b772abcea285e7da702612b55cd2dcde256abd5ea7138ce8dc1d5ff0a636aa5b59dafbe30945a25c91db92f0fecc7cdd97537d0d69c9ab552dda0c386c57003c5364d6cc6d8660e7479a88d6484df6506f207272573562d9034ee480a8b7d710cf695b2efcc195756ecfb39c8c599bf9f9fb8b8f3f7b3908b9387bf9fa1b8386f7f3f0fb9b8c3dfcf515c7cfdfd4ce4a2f8f773918b2bfcfd6ce4a2ccdfcf535cd4f9fbf9c845dadfcf545c84fdfd8ce42290bf9f935cfcf1f7f3928b347f3f5b71d185bf9f995c6ce1efe72b2ed6f8fbb9c9459ebf9fb1b8f8c2dfcf4e2ed6fcfdfce462edef672817f7dfcf512edafcfd2ce56290bf9fa75c84e1ef7f3717ffef7f3d2e0af9fb9f8f8bb6bffffdb808fefd0fc84500fcfdcf898b31fcfd2fc8c5f0ef7f4f5c2cf2f73f211765f8fb1f14176d7c2e473a3a4e5088b5c4629f8dc264adcb01e1b1d93b53653a478e1c9fedc2526059fac2147a02e1b1d5d047cfb729ac74e8c0f9666470766499d70e584e95e3ecf5924b44c2d7ebf5fa982f67a69a753c78e01e3d54e054d0f158f5b182a581c16a76d1dcf800a2835e4bafa51c6c4684d1eae8da3459d2749e43b23332341d1d180b955eabe3b1ca026c47623dd3d189499a8e8ece4b4a2340693ab7a9e9f53a3a3a3a556707065be9e8c81db971acbcb6375f524a2d657687b7576db76578b96fcbd0e50a61bf3b1a956f19bae34029a595522f772f9dbf6c64bbbbeb504a299dbf75d0a794d2957565ccca3ab770f096eea5b30b7ee9b93d57f7d2f9c56badd937be1edaedc1dc188bb93a615420b3250c0dabb5d66f88e953eae10833d2da73536b2f87f3387e9e4bd5b9545ead95a3dd23eced96129452ca7993524ae160adb5d65a6badb5d65a9bbf154bb77cdf8aa55b2ee0f8b21dbcd2ca925297118923ffc55a6b75acb533f0ea90d65a6badbde18cc6d172b564171c2fd8ea966d7191e088836faada1df70213f392814970b4d9f4bd989795b133296cfa1e8d7f42ecf650d2982cc1974c96af992c758e1add2b4b4afdde9b55bbe3b6bcdb93c972c6fda56b74ba2538e2d8f4ed9ec9121c67605982230e9a2c6b64996da84f59c36e0f696ca868cd923293d299d3acbe3c66e759152d77952f7656d775a194524a29a5b405cbeaa2b4a394ce5aab9d55f9a97a973812473ecbcbab5ceb87a384ceab5a3d965469d949294a8929a59456cee5ba2c8e127accd3ee5c61329e94d21e659491cbf0179d3299d2191d607096b377c5b261d39f55d239a9a5957379714d7971b9844fd01bf64607ce8bca23602ec771dcc531e3e1aa5c9d73ce8b46c5616f543b73b3f5881b7b2be762af4b0fd7cedcb823f4fcb0b63eede5dafa346b75675c91fc5ece39b7b464cff33c2fcc2d9f43f9b5beac9360adbe9cc4bd4958eed2ba82c812692b4b73ebe56c12f72661b95b6758f07654f50790ae053aa510246a5c78e1d6d47881c7de1e536ad0f0eccad1582514c655ca51cac1aa4d22566766682eb8754e4fca9557ede570a7f2f2b762e98fd572bdc0c4bc646034356a6c1e0c6ddcdcc081424c9623a7905b52e6029bd23a29b33fb3e55bdddd1474c8cc28cdf5302f615e401caef0f5ba71a303e785936336a6ae1e30d80163ad9793337ba1dcc531e3e1b2d5561e99c767b33db2943b2e5bfe7d8a518882828ba3da7ac3eba1428b4bcba4916fe01b15f2abf0d9381ff96fa6eb65e55ce18c32b384a8e8b3d550260d1bf680819e1fcef4cf3e5bfe196b05edf2f27dde98b0e58340fe984333c7f5cbd70107b9c36ac0fc913f83fc317f967468308011b9a3faa759927764e6cc6a9129715a5a7e7a3f5d4229715a5a5a9e97f550f642d6eacb9e3fa83af2b4fd7f56646643ed0a224ba4ad44f1b3712f7e437c77af9375806663ce9e395036501d72a7bbb31966924d4e46386ce4693e217677a10db389740435d361215316bc9dacda3f807440b2943b2d588bbd165ce074148f0909a2c685176e4d8d1778eced4154838667e75ae49a4265fb7b96316b6960bb96a5dca1469a6846f158120aabd9ead760f0170a8202aa36701c378b2691c7dcc86d983f661332c71f49e8098903b3306429778264297766d1f61965469951a2481c213dfda99d09e232d3e23c94b0c9424f4ae98c4e26aad65a1f5181d4aa82088f46b9d02b74092bff21f2e80f3055ba6208152da2467b3ed64712494add8826940bf910130d9a011176ebab8b39f4b33e9b665981bf7e33e899a2e74da1c1f6a0b44af5dd675385b13b2b9660acb997552871750b548cb16dd54754f86cac5b7315038cb5c6dcec2209c8f6ef689620c23044317242e3c4135eb6ffd5690208dbfd2da689420650f8d8fe15d348713385141dc8a0c9f6a71a8618c0f698a5d0428c2982b6bf6b1ea4b67f75c73a464564c860cdc9408a8f0f8eca90da2155c64f9317c50f19423d107a28867af023c52222e2c1151e1ce9e0f1042dff9ea1bd2d959ec0e20342abb6547a428a5594feb6547a62e8892227a630e69c48a287ca749d70c284fa58277e48e243d419766289cf9ce9cc7ce81011446512373135841195495ca412631585be5b262da107f908bdda3269094b3d4b4852b2042adf19da6e99b4042c8aa850b0065f1ad34f33be7ed0cc1cffb1a3d9b86eeadb5a6c2f38bd9a413a9d46fb7ce9aa273cef5d8ad63aadf5d67abddee937acf4de7bad0d96d605d41dff0dc798adff95ca9ffffffff4258effbfdc914746dcb9c3f626e8dadef44ce96fe9be8537adc3f8dd964af73c86db1f1ceda641f0bcea4ea9f4af1247095ddd6d0f2ce65ed762989039a78c71dc572eac1eaba1a49662ee5a5c3bcc5d9b44ad13a7c09392da6ab35f6ddd99fac6c799edd75689c371f567d561d79fd55e6a69fdfb0df14ddfdbb3933f5e5d78e3aff9a386ccf1779ad046e2f8db4d431c213de5ceb4d8bbd6e2c91dd1c4130fa2f020c88e9dcbec39b7e7be030cad6f5acf2c3d6e5abeb7a552134c7bc47bfef0db0ec33f21948697a31c27df8654bed4d7691758ebce0a22ee1344b805b6d6041387674c822ad638eb9a134d7736c32ce85942634493094d1c6b9c75105254263126c28f104f42446925259a98482897c9204048b94cee11eba59f58bf949a18c25f13139db74c3a838c55134db365d2195b1c41bb6c99740651009a108a1246d214124a4f5ee0f4687ad2f42397f9b4f92a5f35a6d65a5d6aad3cb5ce2811e86aadb5da4a6b95485c9dd551eff95f5f36f1509a0bf92a8c00a539b6e138a321bdfd3ca2b4f03d0cb15b2ef49a707e8d70c4e1c3c27974f32f1b1a8733e06c12a2ef94524a299d4ddb29a52028a98cfeb3fce694524a29f5a3ed94da50498f6af80c9037ce3dbde9928b3d77d81dc0c1a4f3a414e5d3ea319f387cd0932ac193373a483aab0e7b5bb7527ab54fa5769d1f01bc66431c3de8f9fef6e65d7ab3555cb42298d252ebb4c5073d65c56286e7101434eaa358c04c3a4ea1cc75c171a38ecdc18087cd55d91c07032f361783156c2e0640d85c9428b819cde6a876b1c5421ec528bdc0086e5e2673e2232e37416383368a6953b19937a501638f375fec51878f4d81ecd8a34c5a82874dbfd2c74be460d3d7af2590b0e9bf0bb4d8f4634c0cb1e9cf9808c2a6af33c5a6cfa33474834d1f7f364abd8ad2944cb9cf56318f1c2841594263fb5f4d69608331387b13c6f6af5836d50009d5ae392d70c1f6f70990014515550c0144d0151048010f41101185123f42b2065586be3979f0e067f0d8fe73498826a4ac600296a6daa8374502c807473ea820ca8b9a0102f3f3cfd44685481983d177da42c6e4f6298ffd6c87f22897f2d8f4a71d4be8f7a7bd03144a5f7cf15303268a40a3369f064acb41054500c1881f624085506d3ecf7c22373e7a468fb888387595eadd65644948a453e16b2b3de2dafe94de544aa83c51c15289f67c977edd7a381538d6a91af154612f9cb7e933ce1b15222a438f998c9c6cf9d9c6d9f630ca1e6b1017501c0a8f2eb454da026a8f35686f0154a1384dd6a8ecb106edb1faece9e25881b61317eb1853f69c3e6ea408ed011cf4a64c3843e6cc1f31174d3e5c303938ba6ac6dc67bb97e3b8b9b94f013ad0dc638f71e1102963dc7b75c5bdeab937c202ad0a471ffdbbbfd9bcf79e46f9745ef8baf9c18607fafb9b269a6a2bdadfca762621ce0187da1af0bfefd16c02a08d599b465dd1e3bc45edf994d29c9bdf0cb4b60add88da0ef4a076752038784c42d120ca0e9a3e3717a5120da0ec59836e98aa2158888e8d855c6f06afb9119d9f10c7cf4377d83edaf0884349d9e0b1313fe9e1054411afbf499c59857c50a1c71db64f1d1e93bf032d2b51abe7d2f76f06afaddeab36373d97e48e95c9e44694b6fa197a931f5147a2be44a5d4b9b2890063cb9f5fc81fd3094c865a3d26e5e6716f923bdcfbf4a212511efc31d6faf5c24ee60f87e204640d5199bfe741dee450e60fbf3273fca16c7fefceeb2b26f4eb50072435566883a86c88d2ac1095f9236dcf3eb489b6dba13a651bd5a24a7465fea850c81c2912c79f0baf6cff19153d7fac446e4469b436bf225e93df90ba6f904fd83494977a0f1de89b1d236991f483273ff009b3b89267164f37a4c165d586d2653f767d29c52d72903b39bbda5d7ff6b8e8e3a2d3ea433182470a9d830e375a6f610e1eab520790b2fa45780161d7af3cd8f50d2071ea0a4be8514a8d184a0ef4ff5f2fad6b4503bf27a76b4aff6cf9b3711eb3d3eea87a9032fcf26e9f23ec314f1f978d7f4ea0e9f3831ef1c6dd8c891ef3c6f8e767534d500770f6780cfbb8424ffcd389d27c09b9134469b286e5c6ef3e0e45ee8c136ae329e5fde8b76df3f4a12b3c993296322fa4181361ec337d240efe5a12eff077e1f4f1187e1f57e879abce1101cb6cfc13ca908b4f84669011fae5f668b611a59598545c7424fc5348eebc36feb9f459bca880e20518e39f6005679aa067d013b9e3ff92423781710e474c292987392c03f419a93fbfdff8f1cf208983dfa7191207ebe0317cf3187e0f73f018c63f1384c6f831c6b8da303c79335a772f42ca2c1417b3c76c52ceb6d55e712bdb66d84d4f222ab36fe5b6b3164d716b9f470a0d1a27d1131747ec422e8e597a900d153d4ea2d183fc2791f320774e30451fc28cd9b7520cb96486c4b10fe431eb4eac7dafcae9c4fc41a79839f6edebd984dcf1b7f3890d9238560a8963bfc863d688086f6b812e0f3c79e3e510bc36536b4b3d8ba490b24a81e8ccbeef56a06813a575ff1ac241d8a5f4edbe3bcd229b2cb4bf235971713a3d796cca91e44ecebe755fea84feec3bd29e7d1f068486ddf438a19efc8ad3ec5f282abbef427247de1ffd49f5a347bd545c38beb49654c6230589470a0d95e4e29d13cab3903b5a4c289f33509adbe32cb2c942fba540c851e2c3073d4ea7a78944314642ca8e81569ee4b1eb484cf435d253bf9b8e741fe357cb86cd60bff6f8e8d4b087b1afe7605fff62df4740fd2eec7124c9e3be125cc3a1db406280d27c0c29bb524b90b0cdd8f7cbd8f7a733499cfb3b9c6084dc993bfef72730456ac48cddbf628c7a7b606eed4812e77a488b9038330a47097a4a79ecbe8713ca63f76782d06386dacebae1e0284b1845584d2963a5040db3a5d2d10d721a7a664ba523285445474a7c5347435471e4c36a896639c15302543642cb6ca984450e3218fa654b252cb4e0b880e20ee9d6964a5808a9868005101a58245901a1331a788ad6666024b4de52e98a31543d601021458c7b851213aed042ca15533c2a74b7a5d215523a20e8bca5d2154cd8205c21f404930b63d74ca7488c1e5a3530825c8a927cd0b5a4a39619ce82096ba633f3a1534404c48a08bae808213e565113a05cb382b42a5aa2c493fab2a8864094a528c187ae76031fcf0c1c64084caa2b4d38a64e8a184a823c0d250942849b94241f6050024a8a163ed49680a448d1a4a62425050a1073a633f3a1e385b52f96a404fdd4bc40fa1a517e48238d3dceb8267477860a892bdd09b46bcba4349084b4cc9649693c81add0315b26a511c415210d1f82d0390daf079a7504cc447f3ef0aad0ad2f3e1968c14281d65b266589a20859607099e8962d93b2047543d0ac2d93b2f4f061a15b5b264d49dd194415b1608a08b3261a53f17c302584ee095db74c9afa81159adb3269eaca9e3f34b5a4c262aa8b0ea479e12aa7ce15496c3f52ea5102d7c5acdbbe665ab68a5a4fb5473da3a96c22214d95cc3725ce4dcc53d1e88be330772bb52c17b5b672b5769752db597b39edc2d95aebabaa8ad67d5b2d2dad5bb58be36cb69cd52e6a2da5acd50ae68bc953366d22944684ca6454331d0cd37035b63a4df52ab0ba6c02993ae6dfdcd032055f2f1bb3d9ffeb157b2963723a7b877ec63315c812828e1b9ba9c6d20b916fdb7c44e2f813a1b40d4899bf10b62769ca7246cd0a9eb2c4999b03eb8cf78a8159694b3f6aa9c77259ce45298b5217aee06aea995d34fb39fbdc7babcfc6b55c9fad7eeb2bb2c3a67473f59decd7fc918f8311cca49b9ca072661290d88d3ce348963366922cf48814940d5247ce90596692d9048718887c310625925484480c44be30c3485d61d29b58ece6c60dce0a2de8a893ca5ae594ae9591242a1ac8967f7373a389b8ccffa64e7a445af9628c33cac86286913a29915952911991187088acf0450b636ce7a28cf975d29bd8cd8d9b9b9b1b981ce3a960dcd5dcbf7c363af315d96173e1ccacfb5a9a5b23ffe8e8b999a2c97552adbf9733b6fffc51661967925cbd9a2c5db4f1cff229269f9efc88cbbc4e7ac48686ce36b8383720a57c92ad3dca27f90423f38a99a13d49260c93d92ce01b8fc907f78dedd93943d8ef80bbcfa5f266fe56798212cbf658bad59227189348db73e509c6b6f702932778b3bd983c414945d5618ebb348b23fbbad650bf709d99526636869e4f69ec45650ca5b32a7ad65a6b85b12f97da7771d505b7742aedb1b25c7db5d2faad6aa595669644a2b5d25a2bad9efeb719f1aeaa96ec5a2476919cabde174a25b5303a728da994bea4cb502ae99c73cef029a5b45a5b258c05144ca730180c0683c16030180c066bc15a602e30180c0683c1666030180c06d31f9be9202df17094a3ae535383e6411998fc9ba3ae255d47ca5ce7890655600d7d61a18d1898fc1b17bbaa75bc1bd88d977a674e50630a4c73e3060c0755b9ead59179829e0f84c7764f406153e8f933385008a0d7a8d48bd96a8a142a53030000000000004316000028100e89844291208ed24c90e90114800f688e4a66603697c8c2244862144419638821c400038021c410858c689b00d27915e1e496079b8a7ce8c4a806e8402caf7e16653874989f60eb0f65e72cb911589a2dbf74431e97d7b8b6f2a3b10d8ecca1c0f96d7cc37163289ac7ae5eadf2168968274ee519d8281f5461b558a6d55fca34c29e3c7987023a0a8fd0d7b1d8dc593e2e25b3bcf4c9e397672463d923b93515d94f9745b567799e5b3a147d100505018eb6a51472ed858e31c56a0ef5de3fd04a3b4eb7922261782613e4a29b8003517613c3115786a45dc1d85bcab576e7d4c4d52f9041d875ce204db02860c18d82440ada3f1d6994ae4d78c751e0e90c6ff834001f104216770c182c135d76a879cc50fd32a11a0b1b688f9c3af23141e97c02d618cd1d75978e311e73235c472ca123d911f6e1b1f63ea65de1a8c6afcb6fffcd4ec0c36bbc9d2488e2256da3717c9c90550fcc28fb49a3db35492c26aa7e3927755b75f86fe069c4c10bae10f1770efc3bd0e5fc69176a01cff4c373986219f2b867442af0a97df9e0780bf94f03f0a2429f2b2d8f02f766835969e5dc5e79d7cb4d003a0c4959b6940361e158444d534329d20a54263071606d22e1d4f662851e8259d8f907baa95d6514255a4678e541faab8d1809a7f60d09432e25eec6157533b255fa33ed66f80af6e878af87dd04f026c62a7a2570236401c4b805947077a62e44418d7afcc0e18af0831ae3d982f139ed2fb24f7c8dbdc7fca38ba69d228f7426a6ee8287d71c5c19532f2c763feb6110e64442082ccc26fb8816c66be6f37be8be3a4736531eab4cdd82a30bf7d9861d8b7d66104430b93046d650216829f819f918c05c6cca751441e811a69234a08c9fd441b9738042394afdad22096f37047638240a7a3a804094a61ef3bb4270da3b81d8a9e32eb3516f7420c47b77097ae1d055ea31c0cc6d72694b91668576c7935f3e45b0748184d6f4b840c6edb60fd9eed2875d709ccfa2a9c050636a2734898cf9ac52c44c61dad2dac1f565b2a0c579522429b5c38f1ed4010c5fd276e777b2f0b0fa2bd4fdeefcd8be2c29c01cf0e71dc8914509253d42559963c76a481547f2edaa121ac9c7fa908b1d0ce5ed6f77006d98d03a12ff5bfb07c297201658a1bc0e1fad44054002913c570fee4b42cfa847cf827c3014aa9c404f96a9fb3336a111d39c086696a2fede3bcdfd78a10e930b0ae7ca7711df6962d50d893b42755b53eef1af4e12e00045f32923292a3639723148e3f7caa88fadbf4a4c0245419868c214bb179585058d3eca02965714b8a590c7eb9a5336dad7935738c3882c79e80f09935b5599fa4d9182ba5071f48ce4e4182bcc965cd155c712acc0fb1d75ce9996f8256478f9e43fa1b5ddd034072bc03e00fa9108a56eaf1343ac20c5699aa225583229e5409053ba82f0e41f214a194f32d16b90f54476dfe1182e3ba5a3113089cb375cc206f7b7d45e283dc8e7ea0256a690feb67f1328a14bf513f09c859c98d2ba884ee912f8f7a8b3fea93761feba2cb51e354103880c44e4fe5830d63decc4c2b3fb70c53fe39f7d5315e6fc6154656f73799b038efef92bd7cc6d978ec742585f4be4c4acfe25861e7499f9911783658873f307a7e0fff6243ad5f9f732d8419f19baf23d600408402b32b5ca53aa0143dc96ac1a822bd5aa55aa61522bcc138e15d33bd6391fe8820ba0be1563c80f32a7b5a393113ad673141f5c7af1bd6619848c62c9184b35498b26232c425d182fb3e139311f5aa48455f87e075f828dda560d748ceb287526c7cd790eb1b6fb162a02ce15b31cdc42822bcb104ac9c7b4ab63f3484a8e10a29a83c69e1f897108c4786e7ff105158779b9d4a5e3a0eafaa447a8c7661536f0027e3e59abb72c51ed11e0b96b953591cb2d86be57dd3130b5f1821c7af09835d756b8e1d427090cbaac56417fb1920063a1df1fa8d1b14a75d804a5db4973b3d28f56da618b6b2f07874d5abd02c51ad489aae3abd500d4620a042bd6b711a69e62d5a3b542aeeb5dc80b4a608eb0aa92e9dc06fd5ee6b5e610132a538d0368c22151606432b8596b3072f06e7688134c2e621b25a00273260db6550b9ef48918ce2f6b6a36ea3dec2122933498b651684c85efeb908d85b30c9c33498dbbd40ff87ac7ea2ee8b8c00ac1b25c904af51472558a2edf675e3bf659462bf0f96e3fc1f07ac8b53f62de0e16492c173e97de1d068e8ca0b4a25633c7c9c3955a8abe2d3b04b8ae96a1fee31d482125cefc4bc24acab6665888bd923ea01031ce403d072ad902566f3663a4d9da4f7bd117d87b953b0a94776d6899987bed917eb04d2671eedf8e4dc9c1131f47b321d314d1cf5f79b81c6d120f49b54b50aaa4474d294748c3e23e18bed3243ae6c0231a15e7266976bb53282a1c199ca83c3e43bbc1acca0e1509ada1b3162caf436b93f989393907ea5078af5aac2d1797de697e3920093c26a2c5d7e0369d77a13080666dbd7ab9ec9343e0b89f07fa9ecb63d4e1493a1effcf6c1eac189c92af4aedef7628828e470bfa12fdcd83902a4083d44b1694865fb467f0b4811569c9aa21c106415793c5a1865c6a0ef5276a514b255f501cc97c9ac53a86fd7b690cd28e381bacbf827fcdad566cd47bed3e59237100c3d1390cf18f57dcc27bcb5cc3efc05ef97f0799c5b6b7a375ccefdaf0df8c68e292ed633728a16869292818140ba83c29338282ae2b16b92e281ba73df7cf69b848dc9205ab2f0a5c9dfc6d7edaab2780c14b213282b90e6aae0df9f42fc16ff0f307260529ce4426996afb0b3d4a3690644c94935d56e72820a664dcd0eab106135311a6b17480c510100859e75af6d7e41e0fc23c86aa1ad91ba520abadfb0eeb2f6da7c2196006a1b6f7384b7247acd36e9e908f668859a2ac389947fd1145abc0f31166e60644e441862dae31ec073821cf017ae6add70cd81291458821584d4829dc98601b82e539d1c6b7e2e57904e27572ba7f576252688217baa2f2d1ef41192c4dd4aa473863919b9804054603db7dd64a0d41ccc90a5636fc374294b6c027933a4c2a76a6bd178b2d8a2c3997e69c28afd0f18570d5da7051ec0bb803a7cbdee45bfb91e863290ef16b4224c55de08200194db937020288a81dd921eb8bb019d33826dc7705b2a23d536b38cda74edff6ac49d270f5b9a502d926766218b61624e2d34aa2091ec7bca7a816cb3b8289d8aeb7946909cd7e2ff84e6f781ddc23eb47e9ccdf8906c58a2c75ba556172fa870759f9741c95a01a71ef4970317c2e308e48de81210246aad10a3366bc65a96fb2d032d58e96efaf177a771b7d193d8fef79c088bcd864215b71c28f79095995a651d8e4306836420f6ed2c13f3078bf92e91ce4670fa843e7375115e3761e9e62671ed3e67768fb326bd00bb33df3055b5c03811e59424e059a16d772c3b975ec0ffda9187a339f681f5283532a9a31667fb538f2d619259103cb5e57c266659c78b2431a3f1ee78ddcb56feffc519db92ebb3841987b4adb033bb8550e5d16d66955c2c88ec0e30a3001899466216ba92f6296eec77112b3800a81894e15efa6e7e16d9a2702d9fe80bc364cce5af4e0ba43959dddeaea068e84c4cc006ba9e1b3e894ff9bcd4af9762146d2ec614b6659ce7b634271423b76018ac54aaacbe4569146e0c05168bd81a3b82c377094f63d823964e6800744256bb14c731157ce3156520f1246662a691df7a9087e251b2390074ecb5bac993295a026cd550c40b2c79aa4e574580158cce99b535a0d8af387f357006539a15c6be78c03fe2626ef1d65ded694150c70efb4effd08c97e075f23a5359f274a73c1188984a1fb106da3296a0ec94c0fa3f682bd0dc18eda514cc9ed7ff2675187b7aca517394e7c1b4cf1bcdd478f1790dc44dd1dc471ee3a1473b252c00f09bbe05c1f546597c0556ace1190fdaeaf4a09fdd5639316de5ebf149433caba02d1765280eb7ba04fb49d58671ced32fa70b6881762dec9b85877886a06f9a1ea8b4158445190d0678cd7f27ef8ea34346a952b2fe3ae46e4bc0caf4729cd6280f51478db8655025f8f6a8ccdc96847a05dabaf0635309b5bc4e3546f03342bcaaa2a27c3d6dd02c1bcfd2f815d05e7657d1aaad958553937d62cc03cf66b60696cd6b255de02b50f2da27b624e46361e1023ee8b90107f68f8e31527a5380d578294e22fc4ca82891d9edfae53a06b1b592e306c726fc3182ef1126b023c087aabfbe360c0b118dba94a9220e234b8ac3cf3133d0537bb66e5f9773c82b5d678ef2930d25c94e99d273458736aefe2c098839888d90583290109f46f5544f1f24587e9cf3668ca44b6d5135c741424929600eb123c6e7d6b07113d9ad183914bcc9a326d9fe933672a3f11b576330e0eee9b5604d641bed30ea4d907ae20d30e7294af801a3a90c031a8154ddbc6ce310538245ede78aad76f308433a5e0af07127840714430a98c111a810156cb74809337c86e2d7178669307623f5be5ef65f1f14d8ef93e4a4a971d306ba88747f3f4cb50064160936f357fcb2e159f3f00988b84141db446464e308cd128e80546672d026809ab0612d20d7645b9e59aa22fd74f1a145f9b867f2e0fbfdf9b8ce58832ab1dc50f449075c13cd89eb9c3b7feef4e7af1ca4743941c5a56be13364b3863e6d5b44a8f527e8421062099c139b5004f880d13f634aece51698aa534bef1b22919c0b5f6ec62ab8df240653aa00723289dba883d61d36d14231cf50bb76c7f16a419cdc3959f35ef5f069fd935cd6027b6a58b173ce560e09708c24034c339bc77fd00fb688ac4153c511dadfc8b84e469795d625e52d319ba7fc5e345124c49560a2427351a1b8379d25eb861bbc91e9f69472b67edca9312b835f806eab25dc980f0e45762ce703e9b88ddde4b1e35c1dbfa825edb684c7d9967ca900941707cd9095091e66e3bb7c030fc6aa1be86f5597cecb76a91bf6106c71f1ac930ed98bf2d9147f18700c0fd47b471fd763d1f9ff6d70349b393bca30b8a7a120f2660a4a17d15ba778aa7f1d17cd6963d3b4ee7f95f1d26fbc0fda2691251034cc737eb6c149a8042a310ed091ede1f7645b10f4a3bd87d3262e33e932efd11f50cd1c2bdc844032c6ab4cfadde8cc0089687a569714c9674a5fd6ad65cfd32af4a900f513e59e8e452e0aa71cbec6d588ab59c553dd129b32bf9c46096369b26d8a4181a4d9b1f11ca0c6c02f0dc3fda0bb08e0e749e8b3e140ac86edee54d905064aeb8e4b3cab9c1d366eef0294f093384b40c8a0bb9ce514ebe3dbfca5e7250a4ed1d1430336251b5cb03920f3d4a4dc662d7e581e57367e159381faa65cf8976b004073e3b27c64f9a4b2058c810fc181fd6a299869bbd3d4cc49cdd13cbfc116529079b8e2fd221ff0a4f01f9f7351370c660478067aef2b93507f722755cbd1fd4520bba6bf9e7b0d3c4fe84ba31f4dbfa9f0b739be285b83ef557980923c49d46060fd20b940c3b9483c1da78afdbe2d9b45621e70a60cf0e681fc2c21da6925e6d26003c779c9909a64f614a344b74bbf0a204209c6e144fc0761f5fcf17d34b8db2b2b750d2fddfb2b416cffb1548befe9d7e48a2c65606619fd10939f8c280cc01d14247653fd920d3eb5f6019d2b0fdb6da8fabd926ee73d6c6bd5d6d9cb1a40a236658fbb4500d115e453402fc63d031639227948df30565d76e0ef5ec5e8fea59d5a0a24094ce89f2604200202536c4f16527271ff3b58c0f1dd50944d4f2319bd32affbb050d9b9e0c9854affe9d7389760faeb173f56585dbb80ad5706ff8e706d35a9a0113e4a3912925b326a9925b24d0d119db90e0fe4f2f8f588c4dd0a44ed64c268539604ffb08882edc09c458fa8295527b5b002aad395e05f1a1aaa990abe5f303f305855e33f5f48df81f500567ed25f4cbd6c2f345547518d26a04b6e4c0f3a160282fae593c95c47eb1d0f60d43521ac89a66439049f9f42fb9fcbe7c7b4025793bb93d43059d35d99ecb8dad1195b23075832b71b590a098e5debad28a826e9d5832cb8199e5279ae5834626f3f33bd4434171a4a44330cbea921391ee3ee6057d608276453ca8f3cdac5e1aaada665fa970267f86a85804ca19ab4dbfebcc8cf725c76db8620bdc14e0e9a9657bf87b7113c04589751f57ca83220b8eb6cec892f02dc0d9726a619a14cdd4f49d96d27b07b657fd910c1ef37a9ed138cc3f8a00d6ce1f149a3f702678ea3453b871492d628eec2e73746e90debf0299096dc22203c93717386803e18e74db77be1e0c9db34c51948594fefb60b59a5a8cec14a80c0a340cc3f08433a2103d3ae77f783a4b1cad05beb858dd59dc42e1f85559bf716685772aa1b3e88d8a039bdfe5b373bf959afa67d359ce4763d9ace100323af095819006ce5baf43a2b70bf70805811a79bce847c7dedd2c6c52fdc476e11b426b5846c5a8e0d7056c6e23e4208402a088eaf4c802d3d7b30f8c339eb47152f28df4b5d6361fee61685307d902d8969c01d7fdaec4f06f7491cd44866d41a8a5cace53510b0794a872c804bc135d554f7c0a9208878611b427e3cfcf3873c7e348a0275fa56f052a8f3e99a5d7c47c46b1aaaebd86497b6ebdaaf868196358a130b3977d6ce9cd2b564443dc6da7ba3c1c9070fd56ceefaac9feb28da98011fc227b321fb7907abca0056c5ceb224cfef6ad037338e16f667ada1c30600b625bb76db01a641f5dd9b96eea7d75e6576576e2d76563b23f41d2e45fb761093167761c6509d59f5041cdc35dadf8c192a874ce0a7607fc87d28bfb759eb9f7b854a2ac4ac3027b9c7642f3bfa0dfab92a5814119b94c0422498265426af888b8d01a8e9b19f95051376c47d08a0077f37a032a37c478e1a0be451ccdbf983f765044dbd58432f39783ed952cbf5b5175faf36351f1dc780da2ec358723d4288788797085b29a3afabbdd17e425a2491cb82f89c82cb24f6a0530757c6f677c6432206ecc5025d8594aa046daaca4774b6351afb525f43900b8c7c785db8a8f276585df9dd654ca06abf8b98b45fbe5c5345b49b02e8fc3014f0907de92e53a989ecdf8eab53a83a95f7d4f7d47d4cbece72e80e8816afed1cda8eb71160a10b1ce7eb7efdc6a120fc99cb549943f5a0ab5d33b2a16dd4336e462cce25216304711c6aaada9fb9b75fcea59ddff9ee578b5440ff601ac2de1879d92741d157bc3cd72458c41adabc7872c8651ca159ebaa1476f5c4dac71c523486ca80e5aa7a457378462dae9430865b097c3b1e8c081c0de9b457ad7134c620cbb78c34fb3f16a6bf54c57048698c2b84a9516ca4245065c10455b386100771efe681e6040aed359e919676668aff0422fa42d4702c3fbd2bf0c3cc6f66fe710a1aaec2335180c7172a6dff7bd031707212cc444245d342056441708911184fb2a071d5eeaacb21bcd0de51aea2267df12722bf9428ade4aae30af1fb98c249bd4043571dbfc434da4aa983196b83cbe2d6fb48616b2118a8cf0da95986c685d0e2784e62274f7d74d4d47851adee3dc4537b35111246d9a558e6cb291305c17c9f750b41fe181312da7db51e1b64429457bdc5e65976100d640f285df3425847d5e104d4595ffd52d0adcc66adf09bb6a7dcc29a80b18498b00cc30f018c6c552e0412d8b11786ae162808abbaa82f9d8059e7a6d9e9d6c9bcf187712044d8a78708a31f3f0120cf8ed97266f5bc6610b68e5270a8bca7227026baea63cab81c56d212ca954918417dded2d9242a63a899b3b3e8da41ac6fc5a7764ef686677a1932c3e1583759214a12ca7b95b49f264621e642fe64b7fbeb07d8885f629ed57e849c90b27397af1d4f8ada3d21601c387bb0d88bb560c563f9093391a5b2195104c8db6cd62c134230097cf2a74b0f366439f93996a44ef807f221ed0de165efe6816341fc0078f6fc793cd4386607952192dfd1ea3653e2c715a1e6a1d0b45f54ae7bf9733c80f296c431400da75bccc7ab77b9cc8a82c96243a34dba89a1102e1fa6f40029164dd8f8e2da2915cc4c5d93b7e22e611980e079fdca3bad81d1237c09326ebed7f67665899f7ae8d2c427c41865ddefa03a51334bdb3e447a83474f1da6908112deade58bb502376f6a87c1908a5ee056e3501dc9b60723e34c1517b6175c4ab4303ed48f142ba4fb884b1e6f30c39c0141db38293791f3a096d99b7f51cfa6508cca112366f7ef87d59e8720589501fce67ae2073dea5087238509202ac62524175b7a91209f24ecda849eeb4f6afd6b9a86de034d32f86a8b2668bdf92ac15389054903389d63553e27c738ca214a95cd9a3c445fde52f47bb2bdc9795c31c69568e8da99b3b874c1b9cf6be2cc20d3b4e1628840c83fb3f9e9916fd62424296d1f33a0bb33fa37a68fbafb15957782e19c3b774d24f171c304837d372565391cd56da172a29f08164345041fbdc62bb7e9a1882ecdfb8874edb6c00eb089f2688bd29e240bdccca8260be8852716359f4a56593efd761f5ef3e6084c9754f47a87220502769977a8e1ab0df0b5f16baf5f2738cfb4cda6407174aa8a3749fd3c2d0030137ef063ff2fb0a87a60f4bdaba24e1c09e5959a6f7ab1394e19dc2a16306e0f91470193cfe82f158c07300e138fd5883f6a23343bf7b161e84ee0d570e6fa62d17430b5bca7d2b523f72498198c8222c6b3ce64d13ad952832b65cbfcbee5a8694dfa2d35e40266eb373244cfd0943517646f1b8e80d44a64a88ab4af64174f606ef92c00052a3e1f245326895f8da601eaa8a219f233dd763f084605a19da5ca53ebf216b701498d5da97513f3e075d153f587555368f33c20216535b77f7bba4826a1a560774e21c8867b55b0de7827704a1c0c02b772f02abdba825d201f31e823c749a9f5c33b0210cd1a22e6686cd5857b20e867315f7a86e7b91b6e3d089a86b60ceff1664531675ffa2ff2757198dac15eebd58204782ccfaf404c2a61e1b41512250cbf5fa850697115ab1b242f3ee66b715134331941068ae4173079dc4eea0734108c2bf6147b7c3d885db8f7d966b4559c17f5d77c4753ca0f86ba8e2b7d9c46ccd751300b8ea94a5b384eeec8a8db218650390a6d0ab73dbb23c06557f98826104e38774091e27121c5df4ccc629fe1a935b8e17ad09943a0691c9268000aa7b8f96cf926ac800fa88c8d5ce9939650f3bf7bf2c14cd50b1b8a1bc7d35a4fd458217ce0016faa1f16ea24c6263d77c2385399527d2b8836f0400da2447e470076606d1dc4b611f3cb7997fc36d6f699574854b091d9508d61c394e7739bba50961c210d56ac6e252980ad6dc053ccb154f9bd62b5bf41fa24fece0616ebb5b02c2fe4e5c574d545d9b523c4d1f81b010dd78680a69fc28db4890cfc68e57d6f655197b3767c57355a6e24594dfa0e625da8f2f07bf3e28fb4db14eafa9baa1b9b17e082bdfa3620d54f31400fa21a554a295a0d4aa87546644cbfc5946d34913a4bceec6a5087fa135f4662ff77f19679348a4c6eb1f275ae3e87155ee668472dbdcbcc251e69fd94c77326a966034256f661f1da7d936a783c21c6846e77135aaabb168e140e4ae2142a42063a3e640aa94e904a4b0a055da1f849bb376de662aa573f364dda38adae61229b41353772edae72831be5b57cbb38c85be144a64f1eab47fc5a730272e2599d71686c830203c9a246b4fcd5fdcbd6839e86128447c78b04e25d49795019fb3b5c42b1707421d5c692e29d4e42fade5daf6e738e6afdf06d5e4baf5b276238976a7211c4014cf109b66537f6e61186f3fb82cd5d555425c41c422380cf6fac409eaadf773f6466169d88ab04821376bebb153615b297de5b765fe9d5a9b81f7f96d69e4ce0183d572fb63ae1af4db9b8b681eecd6ba9160945199dc27fe1aab602d0029eeb80fd5d6001d83bb5cfdf5a84de5a22afaf44165b89535768d7b9166c2016c163417577691be964672888a9fe847acb427460db4739d1026bf76ae572c718673e1126abea3bbd497a929dcb03462a41c4ef6584c3135537bb1772fbbfe3e1ad489106eb4663d7b49b624b3097a5883b540df787fad9113d638fbd6db9373b809df79bf7d4e0f2161c0e432e098b31a4235c883eea6145b8ac4ccea7e11174d15c87e77d351643c5e6d88672e8d9f4a7c399bd760771d0d689fb57fc601b08753c8fd682703b2930bc77dbc133620b24b47b508efbd4d0ee1a59e77485c28053a620e403f0feb397910fd572f1306cc80774e6d28ebe51b50ac9b6e1f26e45b1b7d93400b135a5bef31ac89287f1d083b2d87b9558e4d1c1e853eb1b96fe8c325324b01d732516cf60eeb88ff43836a0575feb31d473d58d78e598c0775ff84b6a6ac85a14b5df91b3e62b290b0587a043d8e74bf6ccd29a8d355dcf21b5e9c30e7cf8903cdfb21b6fb2aed66064976471ec50305fd38b8f7578f318170dea222293ec5979eda8f392a40ea41b2791808df26e16eeb5aa5ce234fb8100dd7fcefc7dffd254dca03105bdc32c33844f07fb1aec97fb742ff9691ffa8ec4453d2e227dae423fd3db2a14579d35fa9045c24c7ff84e8cf9c9a5a3e12aaa9ee3d0980bf3bdbd608ccc3f29a9b1d2fcd6218b29e615b8b6111bcc7d9e47dd99158575f28de44185663f897c82ceeb8badd6bea2c5e6a67dbaa5daac8d5d2f2368d26e026d174c5da563ec5c7960293e0ac468dfa0887b5d7a2c1435bd627b22064c64970cfab87b386dd81f6f29ed9721b045c40207a08b19860bcc7eeea890bc6835e58a55dc68c3a7c4d29ed6c256933c9f2287c86286053b473e3ff16116e39cb70ac7be4ecf811eb3e0e6d711de61ee0e1241dd16bc7ff32f912dafe13459296cf23463d68f58e58ac7a4e43817990b7408a2596602a149e5cdb28602acbd648c2a019b2a96e49f2fe02df8e3cd56c89daf95a106c36ccab9663adfa09423195fe7fe20268f29e3c2bc1e299d084683dfdd66dcbeced3059f9abb495bdde08fbab8ec24659b6fbbba6de0bdfffea7537c6c3060b84db013e27adfc3a32eb904cac9988ea553eb3fe1f1058f1e62a8bf8b052396e61a287827c6cbfa1261f7757975907a43f257e180d72a33a165166e4eeedbd2092127fd226ea7fd05e1b0b7760f9416277ec66e27576e06d21d70d7e45e0839c1e5b3253f8809db32c6fb4c784c98f0c4a9c169e5df27c8534875960b35040e0bf54433d8a5ef6130bf7d32f5a4d961a028fa5b787999480e5a217a3516e7a437188ad2cc48d1448e3b1c410b26e5017a91e9c1d2e168446a64e8fd32f62ab870eb03201206942338de790498bd413e3f1d8b293381dbdb8c2920c472cbe1817cbfa3fac77688cefe383f6b60700932630e6b48c5ac8d2dc1d103c5ddb5ff72805f2abf889831f172937c8165529a7359743720b4cc51871125126f297315006c5145b191d7078430b41a725e4bc7c279c61613eca36775950bcadf5c9a451e77c4f2ea41ad8cdb30fc9dbaaacb69acd0de57082dd54155ae2cbdc6d820be15abdecf70d3564c8cee5bcd0a9196c6d59c66c715e52bffec77b7168d2149d7cbafead3bcc78446cf642b1616d340e5794356eb8afab7607d40b1fdab42a26d18c43e069d410e4bc4273900574279a3542b29eb218ce37f4e9dd14dd23066cfcbea2c14d3583d8ffc9095d72e52afad6fcec88479bf0268e4f130e1f5f6f2075607eb268b997f3fdbd6e4b16551b5d22d30416a4780ee7f2a765dac69444049494617a8d54c929692472c48b7541bc5d178d4f6e99e20007c2efc8c608a3f201fb605cdfcd444521c1d6d9bf8b087778c940742ce1bc51b4b105ba0486723ff6190c06ca2ed6483b18a03d3b055c307189a4db85a64e6cc38631f019e031faa8b819c9fa5b299090e883a84dff52177f16c25c70771e57b27d75bb4ed6aa0f5ffcf6137fdad7d449a5106589555ef152356ebbe1e91c3998940b91a7c2daf8f6e0c6216962876b84f99ffe4523a1763d6664ab90f5ad352222f1114ea00da748fa469e221cb996e5403fb86d98ee45a4a14409dff2dca5cbc440215b1044facc70d67aeedba506b5535bfa28f6308b275c636de28bc05e8edd1098fde41928cc0b59714184bfeeb1fff1f6862e5a135a7ce3c3642659046eb1a629829b4d5ceed3d667a2b00cfc729f689bd671bdcba31d4b825da237e6fb8543bc97780934848098c64ccb9a72eace20a21a46034eb01421dc8b084cda08db3eb01e6472d3b9d3ea68a65c6246a3d763bd7383ddc8edc5fbce102da0f000ff128e06ed91dda750f2bf64fe315d1fa9ef9e8a112de41301ccba11e2999f15a554c7d7b649b19c512a5db520f6aabb377cf596411dbaae23743e0cd36af2ffa335afe607f6fc5688cc2e2e409564a1d876198e8c8a383be91374657668ecc3073b5e0768c144604631cedbf99908147c9e071057a2de1141715a72ac53728635315ccff45a8433530246b0d4bb3c4e2ac7f29f025894423755706cf57900d8ededb50224705684f9e1d1f8cbfcabead474607ca4ec160875e619d85c0d1fc396271d87d6410db3b778eb1b33b84ae8b7ad13b82a9fe4fb7db413b69f3fef4c5a64d6ca4228a60f0bfecd0800550f005fa96ae5aaa72869480c902f3b3bad423258549e3c7f452bb828b6013014ff2a9162eba0035a65d89bab1d4b9b448c1c6208e278a6db164e33859c8cca2a2582e29a0fcc8f463769b34dd08acbb85005f9bcfb3e556abf199ef849a6e45036a591cd119547ef601078a87c4f8601f3f81ca8f453df090a4e42dd0d7d10814342b03d59f889b06fa47a5ae520ea2041bc24d38f26d060d16ccac384480c5be696fb80d9b8b65786087b6f8b9f0d72a114cd29da06f8d8d420167d27d3c36d742003ab1b1c1d8305c48d714f867a9d0f99f3e88e5b4ce8a8dae99bba1454f5ade07321e98043a29f8f935d88931fd278ee9bb542d6e83a9a6fc5d9d1fdb852e8d70ffccfa19cc2c44b04a2c2af2b66912f3ecefe81d7feba1f7d385371d75dd9956a8a298c2b95db3e7fe1dc8c488e288719deae31f9d3f16113e6f057c57268ac7eb1458d494026b31257706d1899434e88a8a0971ca54b37eb1aa6de936e19103c0723ddcc070fde14634f32992953340ed00ec786dc1d442d4ec0409bb6aeaeb99c451bc1e2f441b0e0ec9aa350240e7e804f61e76553087517bd03ff2ed41e3a7c1ce2c3bf4bdfebbdf4b70c5649051282973b31e7091127b346e90a7b39545b0b4920a5699fcad68285a89ec38abb028601e91004fad4d70fb9c7b741e13ec6f5b884c81997c2f1e234f4011a87bf82102ca2299dc1d67abcd8d5881932f4f60ed3242e105c5428744ce9bc8a6034659e8674d7d1ea7650060425f6c8dc0b25aa0c7d37cf63ed74aeedc7dcf6d8ec762a1d463b88370496529313dc3f9b3191dd2307300330dbd61741707edd1fe8faf76a612ef443fbeb3b5392bc0740780bc7d81f883fd5a55fb07e0412c2d7f766d5973950531f1fcc4eaf1e42ab39720510ba172f1130a61fee3b28da4acfebb7341c290182383f49032a904e9d33f84d98e31bb28dce20153ed5136f4194d9b2ea2921e47efc42350c4960192b0003eee5595c624082b5bd7a911fcb49e35535d976e5848c92e3f878542dbc2e9285766cbc7ef4b62143d05b9f76117ba2b79c53273a2093bde7bae9b4076262af3bd79d0cb12fa4ed41b19c8b3b67075e884fa2772f9be52895d36a85cd127d5bed6e74531aa25e7a6c8a30ef30c94d7ea8649943170ebd3a25f134b1b60353421a2783dd28ffba98afe67cd64df15e998e62aa8cb21c7d0955ad04e632d4fe97e306c1f5e621ab5451ac6bf64ce15eb2a1272cb5e88aab9b8dbffb53801afd19fdc2649132dd712b99a5b435e1cceabab16a7ce87c37ddc8b3556e067124e9414555831c5d30f360641301233d7279830fd8465f967a7b13085033c3ba538b7b0d69889c5915e0bb0272d0e250aa600b39bcf68e6b76a22a12d3fd964204061aa2bdf363ae3aeb8449e3653ecc5c04f4d49570436ef316e738f37cb67379855af5c741e440dd99cc75f96ae42dd613b022ab0b7e4792fa34e011716f154151e4ef55935c6828f63ad29eb4a5cdf693039cb81a0e5ad437bb75e98e616e03b20f0c2e9488f327fc0207ab9f82e56411a62fdd1577c9e1021e80e0972617739c27e8864dc53c365bb049b4051684992f73d6ee156133a1c5157af058c79ec0f417af11f8921caad915ec58bb6a496d8e8061c8892ec44567e10ed631a24d55ec057f7ba931302bf4f57fea6d1d6809f36d3a4998a73076009868ba6dc81a98e5baa7011efd33d6258b82ecff838fb75d112ecd2985cc601687818cfda1f9d41ae27763805d3cb4b3df5bf21ba07e765319ca3b81a48e660a45122101d14569a64c7846ce3c23625e79e22069d85385b15854f7447e287bea02969e11e68d4dae6eff4d4e0258b6de1bd6c52b310510a5be12f556e63af70f8bde77278a3f4896b959a43b39dc3f07cd320305d358534fd9bd60a002113b673503f51cad556a860ccbf5802c1f061c5a18adf56765733b07b1bd64cbf6d2c4e9afba61193985a43e18f110ed4368f42b65ec4ea5e6ec44bd5409448edcd66200730966d0beed5f2093380a5633e82775d4df6f0213b4fbfb938e972126d023c6516ad0587a56886fcbc1d38da33e5642e544a79acd5e66a10c2334df4e7dbe6724a72a10106cea16c4848f67668d638152c34981b30d26cdb84cdefb05462eecddadea733679b450783812a896f3cff1974ba81e272188915fa36188f821dd72dacb799a2c2ab2d9182c5df52f6d200917411b4af5fa2d489395d7802920232727f0cc201197ca0702a990368734df9fe279393c1600e1f99b76697dfb26f6ea726fd668cf71703df885dddfcf0733415e89d7da095b968a0072096be0cd703380e668407fef336b912b702e45f42f7262e9775ae555d3ac95d308cfa4a824bc99996a847f8ecefc6668f45c94f320e0b1decff1839cb372820f9895dcfa8655d1ad65509ebbffe14c2a81cce3651c8d3c2b3d7666b76dc3c1e761a5b36b8df0b9190ad9217ab66a9f4e1c90aea1150bc66fe62c17c6b2af2180e80c5c26456dc57479ea6b5995f1134d76d70c38b4483422dfd5c9535fcb863291aa5a1883cd09cc0e460186d6279439209ef408b35309e626ce128c13ad29361b62333423164af5ffac5385bafbd5facc8a2f6d35ee6dadc66dde103344d7d30e2c80aae857dc170edddf99c1bc700b23fe61d1571036fa022fad72d1abb97fbf40f012e633ac82c1079c2b5ab85236e14d33d055a6e3b69aeb0be3abbe1401b310d67d51895a762aa3a4ea1b22a5620919b8cf95f774c7f8377293316d125b56623be92c99259c04b01bd20ca567d3fea7dfb2d329bf57768b1dd4ad48cfa14ed5811ac94f56603b075fc7eabf580b6688d81d6343b42f63fcc71494548ec0f7eb889eeb331661b92f63ab765605a83db4e4c909b50c8e1918c058f0214b328045796b8238fa26eb7a6bc2b903b49cfee83a6aa49397043b0cb5023cbd4ec51e0eb34ae1edd312df27788fe09327331531b7dbcae433b6cb46f4e198a164eced7e0687e47079e022948ca92996490ab8895cf6c3702dc8b22c7a483e6a7ea71355db944ca68ff2c937bf3c14dc0b5e9571e356cec3dc67fa66ee418c04cd3b8a595125178dab79508687ad86b9210b9b2e536a0865ae30e858c1fbc4c88a4586c3a911cd38dc36a6afa5fab918f2910a3081d4c706702bb0de2f906a9ab1f4eca442bb06245296bb6c23f55181ba2bcb999984507af9eca9260aaabc0c22d5cf37023d03be96d7f6255177c0de0302d0300cde738cb4534fade5c0316fc1890c4a4b256948db4ac17931e976a2c8eb5651856904d09a065a3a9d68c032e5f06f2849be73a82f292ca781de0c6be5f6fa74838c17d17cb112d7a8323243cc4084d1287726e24479785dc7329df1828e0f7aeb4ff40c351301549c58c29cd633f80a4d454d26614908b56e9f166538703ad0e4d9eec2266bf77ee33c101623097c07c6736469c3bb2cd7960eafa42cbd3df77a342b01b3719c919c0c8754f53b85f72b19d072a522aad9000bc83080c9ade90ae955b814798598d039079459dd80b91859f0a8536eda91181c9e45b4aec6b59c6eaf834061925684f8a50f7bc2ba6ce4cb43fe0a549245bf85c0815331bf07757a0279b12292a1f30a23ffd758919bc3a8c40f1726206372296225752b50894b690ce8e23d1f95847f50be64b1c1ac11b49a240afb13b39a59cda492cf2e26fe456a3328ea35e5523a9d5eedc6a0ef49504c47d1e5ef81dff4768f4430ec4141ea5ce0b2b5c9f40e8a9684a05b4d7094244f2783073e18e40e5074497eb9c3a35e82550a0b35c0a454850553fb7b905858dc362636c8e44432566451e721646afdaf14abc971967808977226269b1be48af2f259b81fef0b30cac4644bbb32f1a2aa8828451ff06a816cdca26f571a486535e46d2c5326cffb062c929448d4d6c9fd60281333d1d429a7f433da25b246b2c7ef42c3afac4c0d348976f86b1c9a7361de68801a85c22451f1df5907bd993d1a3d54b2b58cd7025f65423ed098bbc1d563dce42b5452260cf806ae8162d702b13c099e32442b2c2dc844451adb808c29958798ce3fca84a2923f00d63adc2893701dc39da7df670799f9983e0c53d7005e25cc4807a6e04cb601bcf5de31cf213314665761afcc012a90c1e998ab8ffac1598220e19b0d560ec1bf331fb6d25b1c8e8a211379836d7c553d74d083ff538afb0436ca1857d183ab128cc5857afdaa290690b6b125b347f5543a843189ced4c97416a9b956801bc2c741609e6266b53ac94e324c6abe955022c5a0350d337e28a2cfc4e3af4b333f7922f3a876334354bc32d1b60af767c62c6eb63451247c84e7b61072877b5aac545ba5c83473ba06a9acbb303d9b7e5e8589728cda331319054555ba1c5ae5bfc14b9944e49cb09d6c3b38ebfb689d30b6f67cacc28fd74a2b9b694f1739cb3d5e69b6220f043aab56d1e2fba5562af6468fee2d71d2a3c954ac08eec438c8951e6ba204e8a6233c264085799832cec481d96a4cb2e6c0cf47d445e9b85abef0da101cebec4762e11c4a60f250e1a1eec15af735cd80f3087962a74c338ab94ce0c830375a69943820b4eb338e272702c1593c5735a4781e2cac1289e6353611caf78ec8f91695008dd9e7b95e4a2906129ef08c0868b83e49b668ade3608c24b9734926ea8952e81c516cc046b4cc8f65141cc53bb59b7ad1d052a28819d904e28edc0730bdf6077c6caa70279576826c254d9c5fa665939aa58a2f3cc45fb1325a4b78fd3e5d333d9da30dfb9e64eed1d9ec1dba5ce3fa02ee5b33c559d7c2b635ed82efdf668be63e0261816dc7f45523e6fc7a6b244e845852e16de2544ee0d6207a68b15218fa9b8cff200b262a430cd9f6c2eb1b85d18914b8bc19d017c8dddf621fa12bf00fbe286a4f643b9df20eed4f1f5895179ad93b3262dde663ad587cc31fdf7082addbd2ec4abcbfac48b950c541635d5a522b15902d4bb2aa987004a6bbf7277573fc3d608d00b463d2eb8a4d8dabf08f7428c4f2e7c071fd7b072f0c7fe9988b4753a2d5847527ebc7672f3308b5ac070e99d5c0a8c14c885ee0be2e181d70c082591f8bc325ea1c407f6303b85a09badffbb3e8323007cbfa145bec750a28806ec56f6d8afc2b278657e40fef2804b2243264664c54c1fd49a1af71a8bb2743e5d2b6796075ac1cf9b56b86316ab9ea9011d02eaa7060f4fa72ae2f2e4933bdedc56108fc0d006b43446c76eba7737c11f494864734ecb829213b5b011b8457ff100a4c80f812209e98319a640b741b8141ec505c4bfd135cf4b50055994b1d187518fcbbd429e1c08ca5f4725824df75116c77747af30944484e881958be07022f30a4310b558e2b12f68c14740cdffe03a614c54c3a6d1e93b773b3833af096569517ff205194fffe2e9d27822bef553027185af384052f04a79286146256596863f80d337e73fc7ea4bbba83834dc3580cf5e09632942d1984d55fee1200e3e88802463b578194688f827d256b44a591792c54ed85dd21b4a274e2bd93d8c2cbf66e33ec5faeff19300875c5f4d423258ef0d0655a8a40375fa17889007b6ce70bc5b7445c5699e8e3a1495eebed2b5941b775a7b62a15c86e794ce9e0b23edd9b7443d76edcee68cfa72ca2a7b281b22a00efd298d355a9a100cc1188fd787a0f9b4ae7020861d2c6f34c95df82c88199dce04c83326f3ff5d8022f3180e0db2fda9eac3c53390e826b5287f445a55eba76a30238081e3268e401c7a39a4b248e4180cc019b0010916d266a3242e3c95afa4f9c37d57b53e8c04802d850a65db0fb33d85f48fdf6ca383579ac0731598502a330151cffa6474334c247304563d028154a5a46e95a65be2bc1f0793432361b27186920b857476ab2128a6d94714a0b6aa74abdbbbeee81ea90f84c9b525fa84f9a309aa13c3af8d151fb23f56fc22da5036d721977f525c1f2527f7d7c61ef3de16628c06dc6de3d8f272e13566984e9ca80cbc2746c13e6077e1f98d87588722173e3a235c62f2d90b2ac6ccb5ba2a606750d15dd9eb1c6fce3d06da01c8a87784ed4a3b0173f6534cbb24c419e5b189c80dd945d9c753c07050f5b0f03de70dfdf63bd1b6da00db418c0598c53ebb165d5b0b26b601975e920c9c3624d6c5df23ae072b1c89b2a5c37bc4ffd350dcbec790eab12e66d43821fbcd0b510d6ff6e554efc4222ef5d493e54b9f69be3642f9e0b569bc96e9b4687ea52388abd7f3878b8b14a3bf4a45f00bff17f053007dc03be68c767167236cbca7ecaf1bfcb1be1aeaa32d5c3f48e934fc10e82ef14cb501260f25ff6d23b24d1f59181f06ed968ce7933990f1a5d50b0bc4e252aec18d0f3a5e0edc12b16846b6f0999da8bdc1f9e8a743329280a8dc4c6ac41fc03e3049a9151bfec15273088281d0abe28558994460b2a237bdcf505c4401b0083ee92365beb28462f5497f1c2d57550d31e0192bbd055c6c61bbb7aded79d6752554600150bb14b65d96453f3ae82a813ce0c4abf70654cde1639531c01bd0efc989a5de10dd3656a0e3641aea204b980d3d4cd70dc3cbea6bad9ecc305b7a947e4d69d00fe36124e75302fe05b81631d0a01c8c37753e744e551da6e8789a83f99bb256862ffb991a57e6a02f264ab2ddea497de3633914bc8f53aa40815423e17a3d9772976f7b3920428730c5092704427c5fbc5448bee295de6bbe4da0a2927cf14a81de4a8479426d12e25bfcd9d0e4a720b8b051205cc434edf070e4b495f4f8bafbc722299af2b7bc516595e6243af86eafa059ef9a8241b17b13581162dc940a45e8a987b7dfb7142d4e5e39796137c35ae09163b56aa58d16ac56b033f25082f478e780e83a87e008efb815139137374c47b78f227cfb752b6c677b4ef1861d0a5cbb60ae73a4a0554cba50341640a22256eb4724da21de90e264212ac6b6e694c5d678341f62abcb7e94a7e6a24becc70a5ef60a5bc5b7b673fbde0e128cb0ddf169a70bec3a961d7e60d29e87f523ec08d3954aefca0e99a5201fa54a41ba0ca3a02e991e750aaa5468690e9b970b6f7ea9fbed0737bfa7f5903f97909ed399af414731a08926be414eb2e8a108cd99d54532f104bee06bfd519a64d208316e86d081adffd7ab5ce23fe9beeb6c5d66f456f81774afb6498eb769bda9b10ced7af2386644a6c7cefac4417fb5615361fdf015c5838c13bd9f93eb614867b5c46781d15a0e5d65cdf06d02b4b9fa832937a009d5fe3718bc1b6f49a690661eedc5cba9c345894a25ca7ceb6032fd6dabb2a960188d3056e95d374663d02611950fc7badbf9b39cafc8c721e016cba5004aa2280d87b30bdfbd0d91193032dee2d166ebc90de7345faae765b622e9631d4764a4e4e050a9517ae2998b1a2f77c900a62f0040a23630462d022356dfdfc4a95cec25145a812bafce7df40f5192b62f9c8e24018ec8b40e0550198dedfdacbd5268e8c2bc4dda4479caeb9c47ef51a59050f406e00a8bf8cc053979b096ca43c16b54cce728dd62cf81ef9b7dcf7921e931845b6341bc796ffc4bbb71bd5003438d546faaac77c628aad307ae442ae6aadbe168889de0fea0ace860631c3ddf73c03c2a3ee029865112a1a01ae1fda3908bd57f6d443d87b47019a7f10c6ec9caaca787e3fa1ccd5c409253d41c0390823873341d4b13811f97ec30b2cdfe5071a5b15f0e972950022b5c692de81469015487bf28504a5c8b87665fc304c5e250ef218e73ed4c5c3b48dabbeb4519e1de88c63797dd48c49f4782d431a56c7512fd6a5c05bec1b5ed011d52fc926c3f4440319d3f4e2e2928b13fb0ee21217df3bfedc24bfd5dc32d5776dbba5cb609a77bf281d9e0c0c0527498e798c0700bf8d8e61efb9ae4dc1cec9d4be69801f32694a0590033e3d4244f47f8d997ad71df374134d755dd11b2a535163b5aa13f47292449394e3f79c218d8151a583d0cb9b1f2627bd49df3e79f47c18ef0713d58fa8fef8a886ab11904077c01992f0541364843721c48abf116e19c4da80cbff9613e7e41397b2f0513355891a6c82efb9ac7a762d1ce5cf0cc7de95a2c0e0ef3ee4a933656e7ac25908987fc5110e30bc8e85d30faa2b69919e4f1dc0a367a03a22b08b993a35a494d99583602d913d10bc61cf12f4c84e3b0cb1aa6eb83fd9c1770f036bd706ad927f592396f59506a5c95d6643339b8ab39e0005a61ea31a1cd9427869940ff882765512d921ef18f3e87f82c461baa7044a11bf419e80ae2f5383560707c63c199fcb9e96b673ac12cd0ccab45249c5e3679d6bab0d11096469c5da63c10d8adbc28c25a70b430b53075e17861eae0ebe26dcd08b2857f2656d894ed4cb0add00f7528bdf333a03a24a6e595c15a361ccce2b7996b2a81efd0afdb50c351cdcb2a039b2bc3321039e5723214e76fa9f5be9cea908d1456b4aa0913534b231b6fce81b14f5fe19f53ed3eba95f1aa283397cdea90c403a06d2310684e13b956be29d084f960701d92796bec60019ebd9801504d04e7c1da44ea7a130ce50c1a55cb261d40b3202cf845bd74d6d543b71852127bd5803225a0096eedb2863ae47e7727d1726ff1958b04c246730876cf93302df689cb58825f21aed683f526a9cdcafe229db5a312558f8952b128995e15212e53849b9ff507505cb0260bcf6bf5eadc540431ca33520b21bcac828ec0dc00872949cdcb513e0cbaf3c649a252af75d775dd9de841329cdaa689d0a45afd6c689972f34212629448acae30a91136f0e7136f88868e1514564bb3946442b1047742eff11efd1351252289a04da84a884e8bc5be248a506a164a3a4cc71ec0b78424fecdb7032d48ba0e1b75c9cef4286ce7ade2b2b28c446e9b13a7a5a42e2789337fca78dc9b24690a4712367b08732645d8c1f07c32badf1c978751238e4865725c6badd8871b76d7060d79047b18b36de69daf89eae0de35fb409e344ed006923f8a5631138199262e1a2d872358069741d009f88ff7c205d2b99abc0c425cbff51330d3706bc8d67f888c8dbc87b60098cf66a768f0c53d1e4f1579ef46bb2e926f26e41f555a453d552c740a237deaaddda2fce1b34a1f6701f0e4f48b018072435372991942332b45de8007ad274c78d7e099865e2f16d1211f925bf004254a10ce701a05d4548fc4b0f5dc3f5ac14b689f630ff65eec42da10f1f0d32eaaf3ed6ef145ed1328398f8e8d1872af641c3efd03983e5caf6e7292eda8d15a3053fc136c7901d2409988ba78ec6197b3b6906d9759aa5f201f76bd9cbd5619a4f122dc92f774af532abc5b0aaab2f0507803c5809f126f8b23707a5cc26a08c1f8da8b26d149ac3fa4a79928807ff333368f9edbbaddce288319abe4616c611b01563802847e9abe3a346d0a993d6d03a6771e90a8cbbb8c6b0deecf1917a3c9307e12db9abaa20b4d5d4c6d9c284fa8720dc76a99e03f210eb7e7b2e100a7e2ccef3df59d7eceb5b2b3f39f91d88ce206612e5cb0165a359e070efdfd6372b996a10b109f3dbf39b43260057ec9dba8b6c8d9d1e394936ab2e21e96d6d5b442089d47b42550de52df71e8b73b82cb830b12210eb62372e56ede66c38dd56a76c244eff080a10291ae63f55f568fcd89e4a3b1d14a0ca38c0e4a4aa1d0e2c72958ab15afb84bf5ccfd8707f4969a7bc3753e7f3bfbe7cda39c25bd59e7f15d1e03362cf9648a27cbf3d4c190e219f25101673832260114c99c2906b7b7afbfac36b18251217c7a439d971f20f03e09bc4c2b83680ce484de08d239f9c64d23820c96de5f001e7f653d6ed5714e591cce005647774574b778f9b93a3965092266bc3351af632a11630a4dba519aff92e3d8e0e3786ddcb17e1ed5d7d227dc62e174e576bf3840e42e478af666222ef42d4a45349b4ddc4d68e825905e9089449ce255dc3205db619cb140d05817390ff533ae73752cea71eb554ac022327039858bdabcac92353922b6f7872e96286e55f7e769cfa111104b8205b3f27bc8720858b9a0000008f5ecb4e50ab660a49f52f008d6fe07d6923cbc7adef8d4b298fe9c737fa601bbf4e48895d2cba3095db4f1be587afa951f0e6d69948828de7aced2cbdf5a6543621d77716b4be7115b6b5e2efe1dd8aa463dd2c3a1db01b3e9409ebdee8e832de81c047d49cb035db35b4b02253f31a307c26a4f9993653682537cff1554de6b161ad278d39c9a156d8a491c8db5750692fc5560186b48106a8c257e6a7937e98a669632191cff8f647db764ddc20a3568e42f12bf7d83d20af9c6e15fbe5e65b056bf52216d5f61617da5eae90d6b32fefe0aaecd318f44a388f903333e19c432bd494e4e193f5852b8921b6ab249903e15ec31271ed62f3eb0852618ebd856d3229355ae5c3a2395756b3688663ca8ea0383d5c810c4c90b704983576eb382375392adcbab21799fec542e872aad8d97cc13953132cf77ab2a8e2ce5f3aed1219ad7201a577171a64dc2371d779d85b56a2e6f778bc11d208f67445fd33e5a008fbf54658c66191b7d7a9cf0c145fcce97928a2f36ceb5de11a39aa3330eaf93753e229563c88044cbbb3b01bb05ef5283d29f9624115b2345c04179d342d52f848bc214bc8dac651254681c9bbc98104f6bad713daba8505696d3bacb51a580fb41edd12075681986c070bff1f4f497eb014c15320090e025407921f8a4fdd924334cbb22d129f0597bdd53cfcd735182c135676f45982ddf8d8a1dd832111352ca489b30f4128de1481f09f21c2c044ddb55f42e6a74490d32c175dbe19cc3aaf0526434608ffa42eb5582414b4e15e8b38c56aad508a905788934fac28be296bc9353e1826cb939b01ec568f97e0dcac90124a26714f5ddb147d0f3d28af552a10801e19b377a6de121db63dd1b5da4765604e984c11b3beaf7e6e359a7bf520e88149d7cac9f3e656ba2a3ecbc168f8c888c31d722d3a6aa5bf31bb97426ab034f6339b824f2823b2a2244d08685b61110377d433752d097fcb50901a1c4c1ea99b844908e51693f6b0a6263dea32c8cdf3bf3433f0215105dfd6d9e52e3d41de3f1f55ee10fc7dd2ead694284ca5d9abdf2bc9e410832850740ce9e92eb1db5e6ed5a922381a5929d104c77d874d2197f030b58c271b592de14ad853185a3033d71089b5d82175cb042e6ca6b6b8ca010a005a249481bb0bc6a237f2a298abe74bd88aa0153a9254f5a938c1eee0b60832d730d9c9a0a0549f0a6c7ca658f19d64b7c9160af25173d6256a73f2ad72ee4d99a8cf11e8aa553ab66937b05798a91d9c06b149942a60d86bbdc5a53895f5e21166a892da4ba1a9a52bd46cd1018614d63398e06f63f5034b34f9f6b79e008615d092b02cf917256c3b9b8d6dba07238fe567bb70029bcfba7ba2fa2eb84d4a8858dee4e5a4c14172abdd9b6da020bfad74c5729653063a611b27ea4c8d900008c7565711ce5aae7b10189449136c6b9096797e3a97fa1e581df8fb68ba2f2170358bd688c485fd39778774218f11d4db634818b5e807385e73d7d6c50d19f6711f622891d4acc93ee38044e283f2b182ee09e1d0b44fc5108a59a4028e8971613918f4033d5dc9c66f67f98b670684a48e8e9118c20a50d1c63ccbf65937ea8d9d64deb6dc9f106d4b3e8f8167ffc214f985c8a265ab195ac2e8b438d628176749a21b15f9310f441aa9d3983d54737bf7e03ca4e78780c03f1ad481c782b31ff76fad990ae3b92f93eeefc9d35b27c617f578c2625281e244a1164011bdab32a8e5b400c1b365a585f4da943f80c8e045a72ea4accf4ac9219f8b8aab645fb4a8655b1e49c1473bd0c560c474c3c3ccdc57a38fb12238df2bc87019839eb59b2b6f97a6c8e249c6bd13ca0da487921675a3239157e672c357be7dfc6b68ba7e501d69d650f6a854a8a9820a4b58c3b78b852d5223e74680ed493a105f18e4e62966629481e95022f420140510258268e15491b761f8ddf496fc62f2402a2478011a2cf3180513ea59970398ce545fdb14ef2529ffb774623a560e9333ec73c04c472247c127d65ec0281b59d82747cc7504def59c45bf9c0ff6cf4bed95bc5599db363c20bba9d3bdf0c19506e613763ba01aed189a4fda0a6d4286a0656813b36eabc09734f4a52f3ba7466db27e5d69c97002966c2fb549db6d54dd002c617db6827955ac03cd78180739f0cc6d4e40e4cad021be80bc7e350ad525cd13494c8b642976f462704ea59122d4927d17308b580cb3dcab4bbd47484123f8561c9011510c04e307d1ff366bb6ebb54df33346c563656a9200a138e5ad040631f30d94b60c2ef61486a3e3376b52b92901e10146777b1d477cb5bda650abc0ea5e3e39082c3746d139417c460d29701594491a8246fa5813ac0299155f4ae1e9eae0f4ab51ece8e2131f32d9c5b1261df3e1753e58ef2a055e3291d8dca559f4ddca447f590a450ad747a229730dacc43b6d40debcb5641629c796ca62c2855912a4c18f6ae1bd84a420a94a5a8186f3464bcfce700d1ce97de895bbf335cc95a7bb71746564fd2c53e9148c5a41d90d0ae44ed0cca084d72388faf7efb543d7d6a620558e6e500a37917826ce37932996476563c2a5841574d02f1b7783464bd2b41b80224f26094d7f54e3aa40c9bed2510694482066c7c1377418da5192ee8e0d38710c1f28e9fbb848f9d98c7465a6d3ef52a2aace09e617431c81cdff368834d54d63e307e365594420addbaa978c827bb1c657b9568b5ea5078df3e73453af9cb24f7e18ba5d2908b91b0446f84d62a5f5300a9027435cf33b1abd549cd2eba0304388e2ff95d9f01a25e720332dfec20f82ac0b703bf90f77f8ffc340a0c582916df2ec2609a0ec875bdd67e9af0aeab87952027740cc262703b4d55d3cfc4052ac661065daafe29a7d430a2f83d23154664fced00e5a9c81eeeeba4e043e9ff077b95726f098c6def77bbfd78f207f059a5ec233280a132da5af17e590805cad5efdb628b1f319b016332840fa9556699941a5d076cc998ef2dbe57fa29e29027eb85426099958546d2b112bd6a931da8095ab25ec4139ffd59579f4121a5e4376bcddb6fcd7c916267e9e90469f3835f4a88e48b02a0a79a7d920c9ca8f7df63f470daf5a0d5e45130dda5107a181d4095e4df48e68b0d3a2dc6c1ab1e726ec789fe449193eab0c300ac5adfbce0970f916fda8542f9b4fbc6982b5c5417d1182262c4705d584587f63f1c7ad7228d70a139eff5de97867a6b8e78da9052923c5e4ae4967f027165f4cdc438381d9e86d11502cd2e9392bc25b9dccd5465dde24e900b38867b75e801f48fc59bb5fe5e3fd4a2258eb032f1c80976d1e0cce149415c83fc07e41c8328e9e2758012a380a02b7b01262937dce41848af679b9e1c0c8f75ec68bddbd6e421bc449e6c0f49af4450eeac5f3d425206d01ca0917b8177b2219ffc811bd77025fe28802bdfdfd922a0326cea902e57ab606370415a05560b818024069801543191188f634ef8ee0e662e65c2a047315a3b2bfa52816a693877efdb78a5f87721eb9286821c02ad87db746fc1e538fe2ed6830723fdeb165aa88e10c44db1a9f8abf33f8769433e6d5295796a908036238c9c37047e800a6d1b1e297d67ecb09b640f56bc4b526ea1e9bacf7d51eb2604a1ef269488ee0c940bd73ad5f94ee69a7af7a1b8ac2578ec5f349141875dba4cc1a45d2809fb16e391eacc36642b516e4fa6a919ee9098f77da937b19581c8dbc23b08bc37a9e4eb30d4875300577aaa83f2e8ddce707b80678e4293fcf4a5c38d8f48a10bbdfa9673bd283bde7c095d7828a885a74f272f6c725d639477f3fc1c225d137efec2d6ce6dce8e7dd5ff4112f7ca325851ab17aefdb8f193fd90b4f1eccf7d0b3f97553066a8b7dd96e762f57d6f88738e1a253abb20696748b0a3d6bb842f56a2abe87e2a2d74684f6a624dd5c341df2c3a84da8afc4d153024167fcfa0e9e5e190adf483a1b66feea67d8cbe16f5d996f58e7ba875fbd765e8cf7125cbcf96a5e16dc2b10b1c5457aa3ddab0e1d8ce3d2ada9c2cee280289033efb110b391819c3f648f6e2a18dd381b747929804fa426ee7308141177435788e13dde458a4c82fa2ae182252c35ce8c4e0531dd24a4fd6710d51f61c66522019c529efd0401dec1e381c6b61863e9d02c60735cc361b7b9526e727b56b2b05394aaf4fe2fa1442942eededae79d87e9f7664df8beddc871ceb91e7f35dcf0d7d8e8ae4a114706d5a73a79f8d67da370566b2903c536fb0ae1aaf0c3d4ae472401abb7d314af7bc4b0cfa10a2812350aeb71e3366f8df18394192d40ed6ab4000d6f2ce15203a003e865ae18d5dca707d0debf6a3f6b2d3cc30f026c6b03ea5f027a5a30d0324e072aeb105c73e08ba0650d7c03b953252ba7c27bb097f7d60438f803db72d829ce7b65b700727341787bef3b0800d1f089011082878b3b7493d7c1f9037a28c01e70edfdbf498ae5e9343e0a35b2f7de724b996492297a07b0079007b7dbbcd38abb6ce2a506eb9fe411093a581d42582161b5a194c9c03bdbd717225df247b2ead7982facf6939df867020951f9235d52d6acfab5da5a4f1bea93480dd63f7d52d660fd6d258f78b048527674da4edb277fecfc6f0c2cb7be573f6c6d9f94f14dfd9e26c3ca0fa5ecd6a73fb2566b99fecc1bfee557ed48b21cef06fbe0892c9490814486900830d07715ac3f75ff1dec8ea4f885ff777baa1d20dedad3f4b2a9003fe7d315c71ae812ddc7ed4278ad4e7fe5318ffc8ed6552a6be9577faf416fea369de3f67a61165ffad50050c03007b786e96040d132069631827680e9b225061629d912a4458962d18416a0190ca95077c0acf65d6da2c8533f9ff5142e8626b5af89e4d753f08dbf0cecb2e7514a5b7ab77ef3ac2d639da141def9893cf3f359ecd103efd4cfc5e01b174284cfa6cfa44b5b7225f7e24b0e66c22692f9c33b75c63bf13d0b9f3ed513711fda586b512a9f3f43589f4d24bdd420cc5b3998957b69d0bf57aed4a0fb4cb2d4e0bed0c6270f0cfacfea377ff8c69f4792192dc94af22456fb424ed290ea8fd710bc3ff2c79ffd6772f54118db3fd3d2a0cfa9adba5a6bad957e3e6bd0bfa76b74b0a1cf7cd62eef1c22f799bb7b521ddaa28b5f8006e30361e61300f9122fb147231196e3327313308fd954348a128b6c7777d74a780a51ecf64c7f0a977927c78d401fe016ba433891c191d28df7d9b048415ddcf85996929c48d8595c458848570ce2a5f61214c433a0f845a44af585dd0490c7202983827e7870e510ec427d6c20d4279796be8d3066fd312848d2a4b934c5d012edd0c84c90eecacb5f48c3eda7210649170a15bf88447db108091098fb0dc522be898f652908cc52e77416524a391489aabc1b7148bafa0331b6d00b7e00f14dfc0763ebe52953285d14ea33b2815e6d705b86c43b5db04be6e3d464beeafc158980c437b1bbf8420913a1bfdcd868dcd865dc089485dfb0611715b5518c60524baccb535490e4c61bc6a55be4ddb04578a73f3e06d8d555644b377eb161cb6e7cc9ff51d68207b7bf96f1cd920d1b08f5b1bba03e1c1c1b9b9a2ff2a7bd4e5fcb24ab0d1bf68e21a22473f6c4d10d1b8bd294147020728cf547173be5f2941478b9de4840535810bbf17663f1c276fd6c58daddd3e4c31ec4344089a258d439fc0d24a391f338934f775a2eaf64ae9b82f087938fa460e3f26ade683200bf7fdc410dc6066a302a61c4538896dc78c306329910c0dfdf9f031a8c6f9aa185befd41fcf66d17f826bebb472694a613487cca0f141e675434505433ccb276719216bf393c650727b1bddc5e923096bd6a00099a082ad23933a04d2be99cfaa4a8812ed8c9a2791bb04413bcd3dfcc0ffa35375dbe659295420aec4cbf097766c8e9514b845ea78f79c434408923329c1b16c87ad64932a4b8a4734cb8718a0e586ec846ac1e49aac773ce3927f3f4ef912bffea673b08c3f2a78c2cff8e99e52f4704b63da6014a20f1f1c94461f9439c5bfbf351a39f38c92f7eb51f094907a9c5a0ec1fc9fa912ec924b2fa6b8d3f3fb71db69245921591225244aad261b72b6c072b8b3c34487b22f8269445b7a99095db4f83224f4da244f04ee5c237df57dcb02ba24231c9e2a230ab28ec6860c6cfc00b59b7c6edce74c5ed9a14793838b80717dee1c280e141860d3930b79f8b4957d76aad4af5df4acdc56ebf3c013bc139fefd5205ecea8a248b49e4a94ab1476fa1924cfabb8885593156e11e319671635774db4a1a3b6056be229554584661b0bf2b922e698595228f2c9a6d71db0b99cca22ac925bee9a74950261f159245f3432ac4b24ff4956ab556a5fa07c1b0956070c3e8050557168ffa7502327dd1714d0d1444d818eff4a53e3384fef69bb69a19a259c98a7c8ae106fb9bf9c154aa985140d5e873cf2f6e53f7f70a06f9cd04e90f86392fc054aa50924657ae98ca0b62b75732b0d18c02bca74f3f1bb8ba9a5100d59ebad0bdf6cd0cd1b6d7e8e702c73dfd66ea67a43ef5be1e922c2e96ae5e5bbd387ed515bfb4170962c4e23752fc8e7551cf1c8eaebfebfcc38e16e649b202f14dfd40156ae3f610b73f6a4a92d5a75b93c47a927469495a12df546d49fbc23c1c1a71c529bdc12e4e0d66f5b75a238c0002083333396ec8859ad20f1e63d8988c23ea15826ebf06d2a46a8978e7749bb3ddcfedaf1f97e43f58ffb16175e2f68733c6255525e9aa56d8d5c964bc53857986d8c5115527b6c8ec0cbcb85d6463b73fa2dbb06ebed8d48207d970c66e7b2dab2cf2c8af63b18716bc13bf8601dff437086b10dd06399974b515ccea8f52addcee64b7bb2d0998ab8ef14dbfafba0aeed1cf638b951f6a489e348371b06d265dad1608fe871c8c8355bacde636bbfdf347b29ac90d55d7868ca421ddfe2e21b0aee4491fff84306ce849f632150fd4e0b6d591ae0abb1dabb23abfb05a1b3fd9edfaf54cb21a0c1b7ad2ed564abafdf283309e9035a26304d889d3edeeee2ee587737ead06a3fcbf42a48b032d90ace45085062708a34305521041c5921ea800e21261c3eed28577fac6efe9be9921de09f547668674a623aff8a8551771b121c7b846616d6a74b0612bb459cd74b73af2ea5a6948f7de67c434c4fbd367e4f4de7730d45d3aa795da75b95c2e4b0db2095a6c6841538d0a6c175c38b9f31fe907198801764e0455e12566bd5400e4572b8325b6d0e2190d2ed600a203961b42f55c8756b861ea48a9660b25b7bf5554f01577042b63f411ecf6d115b73fea40b192c4ed965590ca282ae367753be6f716665ae0db5fc832e250a5282929a988471659968d8d2aa7216455c064523861c5e880090b2294951fbc2844a718105d11135394147880cb22e62de1c386c54ff753af48e2a21cf1a3256d519200417d624054b3682388e903858996c51610b8cf1540348ba30f489f2748330b2b3ed03e45489e05143f449f2c96248b6b164900f96031932cae1d3889b2f484bb61090a254b4d684e96823ab86c144607293a2b1d50b5d82eaa236bf484a686fad0525d378b93f228c342bb5868567c23a3a3232c585e68d70bcd8a8f836363e379a9140d8a53881f96709915fffa17ce70e5a75d89b22a724861438fae200470f97d9cc086aea259e1f2e7c8c23b333fe28d7ce383672786875a93c2e55741884d8773fd84c0459773f97998f05030556b55aa7f106ce9e05cfe1f810debe984cbafc20fca047e9711312d253674991e97ff8f6c587390f0a4832b36f4d44d110f2e6ce87703fe12a0e0803f754507fc519bd7e5eda647b55378e446d693e10128b443850e11629014fe0da8b0343c2e3f8f1300a0e603102293bbc68eafe804247e75f95d29b0615dbd6cc71adf0e594d096ce820d8948ae66b3eb8fc3c4f0070795c7e1f2fb0a18730b3b4c48655041d46bf830d1df440a6021b56966af6847fc84f8c9a1569685229cfeb46d819c386d56603259e2e6e78cc48e051d46387096ce8377e0fa00436f41206b0c504d4093e927054ff20d86ae90c00054f470f286c0e4d151bba8b93b5603a3a77a543bfac78bbd8e6ee20b2a1f3783e64d050c1ab2d250f2856f0aa74b14abe046f4d1036ac37aea0820f9e9d14745c3928e09c00c2b712c076e517dad02dc29254c4a9261f9f3e9fd971620f109439def3b7bace6b75771d90d8830b6b2e78bbe7af958633f9d46dd559295736b147fc4ef3bcce99b21d6c58af4193cfe4366ee336fadb17ce1ff335f9d37f7e354c02ec0813268c573ed2c5ae055d19b7432501dd1afac789b9dc0ec559faf203ba4ebafc808aa533c43058aebbfbb89d4f39a5a4384e2975774f793fb9353789b6942f34283b562157b5aa54ddcd7ee517ce70fb8b31eab8268cb1a54faad58deb64b68d487555daaa7e1c2f5d5c3d3e849ad5afc2a9a1a81b854478a2ab7f55a3b427169b3944a8fc82ca87c5b9359d0a043bd3d5c81ef1b3c04f85e8742d0a4d219e452121132a855b022b0a45de180685f9ef0b097df4ebf45a6b8e5a63074ad07022e1f2e7ee2f594168a021dcf8d130d3354cefb0bbab64f18c6f974d431c061b1261b0d77c8f7990f892865e1a6a9852fe58afde37628cd1a93625fddc9d793ae2c41e2ca5045f4a29a1d8f89a4e2bf471b92390d8a37930018a6d9e8e36b147943cc855f857bafb6429a534b9d17535cc8ebb5797d549e92e5d47de30a16970bb5eaf76e7ed47492836fe4c90286f7f10bff28647aebcd2b225d52ad745198ae338a79db681a10b5bdd6a913b9fddc8a45e8d67fa97315da53e3dd3a62dd1f529d7fdedaeb6ddba7541a6a9721eb7d1a854d5522a437d6a1bd72d617de827f353eb47ae7ee55c039706991cfbb47d5c59a0a91e2e6db8328894c9e1b14bd9c33748accc99b05eed22c774697a02e8b6f65dcb9654ab5c67f24ef3511ed38ae3eeb5c8d598ddf3d9d574a67fee412091473eabb6168e8e8f1e165aa09c44fe725cb7551a954a43ed8059972e148d4de491f2d28a5a9d56427a24ab04323bd8e8ad2683dbf63e2383db6ba6207ebbedfd0b35a099824c8e7de2ea0a4883bd62a1c14ed92bb6877b5f3a7d748e77325e8e1c261ffa26edeb718f74c54203e959010ceb551f9d432f7fe7a726aaab6ccb4e59414765669231394518151a5c1e8772e7a422c41418a8ec8a6f586363c4458a0f574a8972e514218c94b4ec94f97c6f731648aa671fb4aa16121dfb7c36116005c37ca74dbf19207ce9b7c097f617cebf40bc3ddd1f37d8ad3f4dde025fd37b1d9f3efcfebb556f5bf17dded99ebec4d274258f9a55adf04dfd10041e59857bd4e7ef28655da641b7aed8453b56ba464308cdae685b568092c2bce556fac5ad748bdb84a912aa2b6c0bb846614f40d245bf82748719b63e2dea9c2b98876fa558d4da5f68ad34f9cca7da67a4497d838a21991a33d84bfbea02bab0fc1ac14a1b600cc1602f7ee120c3847935e9df3caf7e34f93c89af0d563343a811148a78d18f256b6612dd4a9fcec80f27933b878c441ed828020a356a18555e4db83ff2ea17bf98af30428b11bc8c6ca08bf26a82fa0d502cb05713ee438b4211af507559a973ac97ce8991b2339ab8f5a912467010329a742b1d9295c8c66eb5c2a1f4e25639835ba519b7fecc8f94995c32fde17e6884b0393e94b16af9156764e80fef80b73e4dc23bf3ebd3279d13f3f569ac03ec9a48925583b864dcfa215d224493689174b534d8ad74e956aa742b9d51242abb4f896e8df14dfd89245db38a29236342b97522c97c09e817fda69064ad4ed77fb0e144f21c6c38856ead3f857827defa130976b59855bf5626ec13b7b2e0d69e2bac0492ac5a7fe687ba03664d377c17b4a74092559f4d0aa04f7f3c894c763b926c475387d48480d3872ef3bcb385b199a185fa414e9fff0e2e36bed79731f0c67c354983f6f39f5517524af981ce03348e74ad2bfde5af645575773ceae9e9e99ce8e25a3ad55a958a5bbdd0ac466286a4b260d8f81a5dc2043088c4623322b3d90ce62d9790d3b5f6afb4654b9937bd347d27b3ea62d6daee6d0157501f738a399dbe47da95af422f2563f27ead76edfa55c0267e206a8a7f48a3b2f1cf6b3a27856a4aa5eb3a9e7576b27b96afc3bf9ac458832e5980b2b9a8ef52f11110bfae8b5efd233e32dfc5fe2357ca5ec5e4b039b655d8b36bbf477a3fbc477d71fe696553610c36b7fb2a6073b9f931d6ad916c5af5dbe686436e7f15b0b9f183a17efd5058d890461583cdad0d469acf6b3a67daa65e68a0040d26684091f221d3a50930b2986a39affab36a0b1916d7e975c19f88e71fba2765f4c00c27eeb551c73591b9ebee6ee69e3bf56b8df541abe2648c2a53f7d16000ed5968b07ebc950411dc7c61432b13860d63485dfacdf8f305d2609cf1f7eb5f0f0b24c41ef4b62dc68318f357888cdf0384675a11662c51411497a598d184ede0744619513029e374540650921b2188258da1e4471cb3a429412dc080925ef0c34f521340fc0853748615e1b2d11b56783f6f98e08d378030617923071514e05b2965abacb79e7ebfe867c486d7fc66bec4af778e7cee8f20d86af58dd73bb618224061e3f3d3a9cd3aa7a53a1dadeaab6429979819d2affe7ef567c486d70662d330624bcf05950ca9566b55aa7f5e2a225929b08d14978a2c2d2df1cfd7eb7bbe78687a116e2dbfe5c79225df243baaa0e3f1604bd55cfc4b1e6c7c2965757797746ab3ce095aaaea8e2a7667fab12a3a7bf58167fc5e56adaeac56eb8a41e7d10039e79c105835a573ceb9f2b9a58bf2ff06eb3e9932bf8ac107b96567adaf520579da31979fc857a756929628395162c233615772fff08e8f2b9db8f285b45a20f82fa59452461985e43793807eb1f41f6cd83f9109131e2536be1c927f4218dbb2d6f8fd4cd85052122525180852c848e20c2d6714c5608a4bca184ece5052839900b6106dd1e2b2942d45392ea7438bac06301a0859293348eaa2c40c558b01a6bbbba3e3cc208994527e94ddb1e52b5125044b97abe8e0e47670b98a0e24b86962fb7f34b12c250b1327a48780c5f6ff30819234223aea4e860a5bb905441f7c615b46a25a7313c5c66729599870395060594a962459926c35042f9494349a838ca3a3e96358ed59ca8c48f68a724fb767cad595576911fac9608448ec65fae717f8decaf4d1c4801db197e9ff7e33f4e3cbfb8cc497f7deca0ee19bb90309beb58606271fdd39a473b69f5f57321469703e4e143b539f5fde87dcc269d96074e568e8862c5dd2982fc3fc22f3ebca5bdd18e9cc97a10812d6010dce8fd785068734389f8425f6071396a5cc965cfaac74672b044dba0021b4c31470bce6111750390119606480431a485ef36528f25a8d2166a1cf40272d3aae095946537d748e9b20082437dcf82c3f7584175f668b0debad35729fee8f0d7ddc9806942437dc18e5ca2ff41b02cc86b509bfc7fe9925e1b2c425e98a3092e042c4e587830eb4e0862d4a026b9ba07cb0a7cb52c038a26a0103488d2fc268707ca1f445921148324b7e505d10c5d49615a024a76aab67ad951c7c3081c104555b6078f0aaad9e2d3ad5a0c392649a810f5c1844de151e362c439d16b21e2a18491c0c34d8565b5a0c8180565b3debd305901623f080174b5a0cc1c395580f7236ab84016a9f2f9878ab5649a303b1a5d3c2d10923a94a520f3e57603a94d0a8b841c484c30d1f9480a303677cf1250b85e28bac872f55783b58d365a32f50988ab0de65a32f4c8cf8e99877a6cb8e2ce6b9859c326e33b6a6b5a431b57dc66c76d3316b3e4ea6f3397cade5532ec6f9dcdf1d799ae328a5f2b79f5fe55e7627f9b54aee2bc7750b6784cbf2ac6aee6cafc3f2b1adfcca11e66fabbe3a4c3e717a334e9c6ab3ade28d3675be0eebc60747003d9b524d95ecab63a23c2be98a1b748d53aa79e3d76820ff0e36ac3768f2d1982b3d9928572d7e54b299d27531c6d81f5d767bb7b79c73b6a6fd0e9eb335aab59452aedc5d4a29fb677ff789f9664341175b7ad2dda79c94f66f31ff3d1e54962d61d5f3ffb19e582c46ef16f32e7e4d47eae158cf29055db4d5db5677cf3273f5e9c5150ddcad61ae706c6c75cd1b8ca9eef66ad5ea1119b72d556b3add25f539e77c8f3d289d734e977d8384f52879b841a272c5a19b9aec5a3d6e1c7ceeeed6ddebd712c5b6a2382ab95bfe06b7573836a895c7c1e7ee6eddbd7e1eafdf0edd3d15dd3dfceefcb6d8831ff5456c9f54ca23a856b5bad1d4b66ddcac5ce7521ed1bd4ba733cad7fa8506fd23e2d5ea799ea98f90479852b313ca33f9d04711f1f8e688d3b6810762f3d4b6d4a66d1c4d711cd7cd4d761cc7ab7410891288aeedb72fd5acc881ed431ddc8732d1d5f1acab95b3f6fb54caf366703ecdc0a51f2f7f471e4d7a8ff93ceba5df0b0d12e14c2653e4893cbd237d6ab5152b721169a73a139829793a997ce89f4c2d441eaed191ace620157bb49c1189a153912702dc63027cd3cf11d9a41c4a4dd16939f87126832a3111869423072d7ee0be88014a298c484b9b946dabb99bcddd70ae5871372ceeb679d1c3ddbce0e26e5890b81b1633eef6ad2fa8d0b10206575881d4e56aafeac289abfd7781c6d51ebc22c5d59e9198686d280e69eeac4dee7cab0afd9d4eab7ed37d4e37e25cc78e69532491c30d28206ccce52948949ca03f28012205e806243e18cd924c8179016214932cae35aa7a13f2d2c31a376cd51c7a48aab92c0548a684d21618a7cb49f3313539c01c746a74524a3353a909e6b091fbf82d30c7a7543473fb989a9a03cc4135934fa594564aa3a56a4a559f26a6a5026d8e0f265702e7f824492bb91d1be8f637926ed852d472fbe3ecc37844149934711b056bdc7e57f551f534e2b8a7cb3d49717c5142850a07da7889c00723b86082890c865e212f096539020b25652059c18be872d7049f4df54892dcaf58aea63dadaa19336c98ba38087155b8b5062bb882821814918396315eb37671fd2b18d73990c3951d745b9c165d835cd379cff4fd3a6159022900ad016d3a0788912643b8f7bccf4893b073cf033223847b057000c61338248509f3ea9e4d423cd05b01912cfadd4a8864d1e7564836350dca0f6b9c881c928875f50d52fa4e7da460c39a4bb948880b9d13a62e7d3ae50626973e5880cea9522e9535971a71d1a5461788f53b3ff4716911396889c14d710df5a620d0e286901b402dd9ecf1c69e1ad8d07dbe569b230dfe3f64c6ee9abe01c3474b48a004174b3088428d2522800349113994800b281de88210def1e0c61fd23d62d8fef8c3aeddda77ce91061f22c3e2499e91fb244488fcd76930ce06636bdb0fed690ce07539ebed1518a3eb3418715ebafc4a27810cfb3724129f02f185b820334999023b5a9aa150d986997d19fa023b414a1c4a4b4eda58ca1107ac8da33686627000b5016363078c50d4a8f4b986ec7a91ddf8cda081b91fbf500357e39bd6ea0adc16e36fab1a5f8b9aa6691fb518b5c8a30d2fc11b436a785123a88a296ec4d2f0928609f52493f2250a2828987d59c21bc2cecb52be8cc00921296a9d6b8ca1448aa435a40cd14214b335888268418a208d4bad6204d10d3e986056e6b214d89737ca7802f3e20698110d604e007059cacf08c6e874745aadfe5663462da22275a945aac91ba94569d4e413b54823952e439b8b9239adf8f44ad407557b29e79453a55969b554a531ddf8281a7dc6a8624fa86359b5f959b7282b59dceeeeee5d5df226822eb6f44935e915e4d6b3af687f9c2e9d4eae1bc7ccecfcd38cd8cc2ca594cc3c254b96acd38a2a29a58d74fa63604a19e52764fae6a5e39a6766a63fdd5d08f77c8734ecd5bdad3ff5c5fdb642a283ce8bfbeaffd457f769db73ab1f9dd7f6dd0a890ef5b5fd8fce8bfb6e7aef777ea779cccc751bb0eae4b9f53a87993b8799399ecf93ab698635d30c7f422a77bcc1f5ef6238553ee7b41d75975f5864fbaac9d50c284fae505e342140bb1640cda05df9c1403feba619d79e9a66fc5592d5d7b6ac0f2133334b8fd3dddda794b24d20a37583848d33ca5558dddd9d55df69a75093e2ca952b57fc08bf72e5ca952b577c7a187ec4bc72c58830ae685e624b9f54ab9ba604086849500cdab8287f3a67caf9c4e8088b93e8a40619948c1469b07fa9f3fc0522b3182860f286089139c0052493a985be53828fbafcaab62913f344a2d8a37f3ebfd79930e356f14983b1581489224f6c01f7e8af4c6ebf809b5f74c24201809c3ac7fbbf4f9c3801c2499dd53c4adbce88959564377efce2430737f4a1a52e957127164b3c5c59e77556bab28b1ac718a621da8032755cd0060942b8fe4eb3448c83c7ad4f6c4aa5c3445c9beb52d888c1b54cd8586df56c8eff1a6e543b59b006933488d27892e31ed3d4b8aa8d4ac60fece2b0114b83fdf18b474a1ccd4e107fe24f048a4a62109df9c246a0f8f3383bd8f9331cb061bdfff3854857ff52d285998186521a4ad050b2628a92111a4868c460e036004d4f87d70f437ffd208c8d5e0cade4575aebd56b2529a4a4ddde1605b69c9f6d50a6fa6377cb084a5b9e45c95a552a5abf185a373ed3185afe02efe83528a57b4e844af776c597f6b9eb6cf531b0513a37b07e2f59d191a01bfdbc383fd255eadb9f76b72ad539dbb66ddc17d6af5d3f8dfb3602a02e7d6dc5dd946d2a9c9f8a1a592fe5a5ac974a799ef5525eca6547a193dd79fbd6141bfa95d2e4bd7fe1f4f9ded4e6b7ad425e5a795e397643bf1cbb3310b9f463b1fb156c8197dfbd56aee991eb5f18af7f335ce5f216fdad723af99fa6c1204bd69b73cee9abbf4b68642d66b9fc520da74fa96bab70bafbfc62885992dafb0536ac5fb5357ed673b7b536f5e9ed5222d15c2607ebd1f37468ab147dff3cac9b6b6fa5e68a2fe7ded2d59fc2f277dd92dd237f514a39b5e8f5e94a01020813264c9857653056279d82ba1b6143ffd9b1da6aab9455def99e7cdbd57e3e85c6eff1f3f8dae73598f2d4aa8649e3eeee85ccf5d82da1245a2fe5d9cee170031caccc0dbdcbae1682c1602078c92266318f018664dc83af018662cce2cb2c1327a36143ef77fcf4e932966e456b8a4bad32333fb3d7402f3f73cfb8c0c6d7bea7dd5d05276cfcda20bba459dedb5b717d296c3ff777018e78385385d42fe1467777ef58ce6dab5cd35a84fc92a3ad3dfc30c8d0baa190185a579a707de4f32a2ce132ce4521b2873a3550938ffcd85fce08d1de84db5736a77075723c14aeaf42f9ee52075b1b64e91d6bfd8c6ce0a57dce92b905d2aab90ca0cca844ad5835b974884600000093150000200c0c87844281401228baa6b80714000f738e40725e3618c9b22c465114638c3180104280010000038010111179f032272ad7d30dc4a85d28d82d75835d2672700dc863e4e5045ed2acfc291e60828033a66085312e87818d658456579b419159ebddb5f8d3f52029b4d1d9e302ecd475df130615d8d35de77c0d1afe01cd03db353abed7473a75833734be5ebfc233701b075b453a2f56c3f89fb722a17b31027bba99b61887b457f2fea995d66b897d4efe5de5ae7ee10da8d5e936da254add019a468042c8342846f51cb6c037598735c83f7720e84bf5112fdc832d537a671b20d868c0ba59906e1b8d3eafe84bc35ed968dee7fdb83002b81aac6f82355c634951152a08d1ae648fb63cc873fbfbaf66a0050a3ff6fcee639129fba0763008fe2be7b7f2e5ebc55982324120b9a4170832173f7663c923850e1b35c16c9dff452bc9a29c9818b8bb542b80b4dd1df7448c8beece0ba7221a28d756e8f41f202ea88fd741315e00c9315a47a58aa6772ae6e0ce031bd56f47019c846fe80bb026f1076eb6a34de36095e1571d0f5787d3c5f1f3ec3e01ccc0df5baf736d57cb10911a9436263122fa727c238e78461cd4fc488d8da800d1e976952dad24aeeaf052a4dbd2500342b8c1ca46cba3846b51eece9186eb3e92d7989d7ef23159a939d5faa8b9bd23b3946272f21512c32f1c087c31ce2037a2dcfbbb6bfc1ab0655e39717e5e4a8f21df092f87cb31e56dad65d4e7414d8d0967c0505ea71d281c00edfaafcda419a5faa6ed771b59076519820aa1dde1870f56083632c8e9dfe45352208c1f44ac6cd50aba9dd97ae974aea05d4a7dd74b27f29f8464d4cfb133387c8162c25c6c5f83379b95c2151d8d3d9d765b745bac732c0653579ef8fd8b9a0249a48719aac05d078da10b666977509749abe116bf803c94bd42027986a365d12b504c8402ec5d83e65075fa56ae6ba864e8504ad211a853d9c2223b279e076f43d0dbbe659b5bb51b0ea1418a3da6bee51082636a4559cabf344671089542286bb4461cb3a14a242be095b671ee2d98e1196a78688892f8dc4feae133d6cf674e579e50e75ccda623c8c1ed9167a24b7c61ab2f23a78d3ed7568c7ed4ee7caecd09917577022aa247bb52446effd8a1bf6f28834c8f38d61fbde047c24285e69586f1f1c1393d55c2342088639f2ca801caf1493bf4a9afba689e173005f41b81cd169cb6134380737cb283fa4decc733d95848762cbbf3eadd449df4d474eb60a332bed263757b3eea90e6a48326e5450fd0fe2c70a030f69160ee25699d1186579eaf9d53749caf5f13a0e5f0f22854bbd7027e7fa03bdb2888270a9a0a877ea0c3fdbf4f4f2db69f5834297abe556112d7b54018dca65a3a424738a41e8cf76bdda15a07a70359c5f5fa97d5a22aba1e5cd34ca57c9d9a3cabb2186f79cc0ba180bd0a4eb9ca7defa986bf496ed12c43be6652e219518e5a90d8ff2f7ca12d142e1d8aa4f0c5225ae1b6810d234b249ebafe41cd97dda15e3da12c34b4b0eac886203d64bc5cd50864ae05842eb1dac13124976af5596967c6d9758ede4a1699dabfd43bdc879f1e06b98c3139875563a3b8ce7ae68b5e4ed17e95436befdbd1098384469beab6058cd480cba1a14a97d6854d4ec33df31ef4cf40371edae5b9570884b8222c3af30c04cdc26eb65dc1494aba425ba3d7c4dd049af2d830903b854d01d704773385e35a28bafb0c3f32d413d0b2d6bbeab5c949ac55449ff19b2ac32ee171497c5599b7e38de96688f777bb20f24738e58878e3f579a3efd560f446bf9ef1d9e5a12177a0248a76a23cf42acf515b84951f3a049740a95075bd6ab56b6a3444478759a25f9b5ecdee550162b16250f0de61eb27c79f999b7885d24c3290b4016dc768c78e0b6b0f38b495972778c3204a2553c6d92df70d9b2154011c42193744f8a79c050faef362929afecd58e85e7c758fa617e3a3d4be997bb7756ca9984bbe3d2bc46623316bc5e23993e9da5adfd1ed77c7cdf7611e3d06156dd2dc09f6d85b3ed02e1caefb7c44561ffd7e80cef8668c2b94dc79d0395057737fd49142e36bb17f68e838323db67f21baaeebe6445444b86ae22d1dd729edde0be5aaa51cc02a1d0d476c5acd3a66d9e3f59e47b6ab96d1a88757a9745a736f8bbca8939b30c79e2ffc0ca1d3b59edf24fff430d627f56651ce8b396940dc98dc046fcab92411d0dcc77ac4f9be4f8b3da19de3304ddebb408497de0e784ad20d19c44c657ce904d9d376237ca0dff81b051be51a4fb8b3d7c204ddcf91889cc9a9d801396153795511d85f5a9be6015c140bdfd2a939abe0518ad0a3177637b26e1e4ec7741d4b7d2ecb2261a86d181e92c1847a43826d04d0f1cf2d670dcde87368e5507e03ce8ccdfeac95dd8d677403545666b510c2940ce0234f2d0626acec3130395f428983fa4b7a1be401aa608169759fa00dc8219637374a0d28466c7bd48a1422ed6351a8727aab4722d388b2243224e991c5421598328cca283cb86585e6e40dedfed6f975332e53c734c197b7726c0a47b572d59c6f7e158cda95d9bd4642ecba945f9b9a59ad0d0a49c3cf3f8ee22edb08a2823bdfc68ef26860f550703d7b38f035baea020b60f9c8651cd6cf8cd8697b91e5f0a501f77ce474df30581efaf270c37280d02d71e5ceeb209c4344301eb2eedd21aaff6774349f045395c6fce8a6dfab18800e943c4374a082e741b99bb3e731b5bef0e524b0e01430837449e05f4d7a5943719ba3a7676894513ed80267df9094bc29f82308bde8b821e6c8aa70020b569878cbec93f0d0e570e1a0d25c7291a2549b71ab6ca5305e5ac3c364a95afcc68515d3e91297b827c0d0d89255780c2611f9ed46a08e1b4b7638f716cdea3653988655d6a05e8640680d830c66f3606a497526c930621534847a43fe7fb716a68f07bbef372eb3581490fb309ca65275233201fb70449f03f571076bd9b5224c21150c608607b82b59a02bb590b54c4d8154b09338019c0a81720cfc58d3005d8ea9b893f777bd92177710f0f2e9cf21a00ec91a81589d2a1d6bbb0a2f120823f2a924517dc13aa9b0d3165890fa6af66f5d6abb5b24bf5e6458ef8d01ef09577536c0962560df46123b958f40d3ea1f5d68d7a02866aeeb279dfe203e47e4da4213c459ca7347db57c94be4f005a6e8dd64b3b66d0d10796924a4c2102ed4dc7e42ea76cd33a2f79380aaa1247877c92e1aceddcbb63b3e9d4757975ab762578af15ee68d806b0c6d64c3b60725aac531b1f84b50bcab73886b1cece7181d346ef000ce460b570c6c9e6a961d2508a2a117c75bb99eb1f70c3091717a300bbba29477e85d16c663800e73f4bbaf52b463260837362999545c5cead13fd1403ac6b3400f89aac457b454f0a49d68fa8f14585ba537fb8dec0c96e9898f6e0ce6333f4db19c9a023d9fe3f3e293804f4e72c930264482431bc57c572e331fc5342d408d6037fb4090864bd1506f5380d2010db4757e11e976cb7719f35fbd67b8698778636fd1890b7615ca4350d5f7b01d0e3070401ae24ad344b2de1a22f28ba0ec2f33358aded15c520a1f96b72c3584a30c314349f7428c75212518c4cba38d84d3b647dcf7e2d8ff5f36fe7379acb82cdef90c4e5b721bbb05e68b38889373f3f0bc1364607a3499ec2ad598fae506d55486281113dc41c02454d4e104a05200629090c7861b1a5ab84c20aec7161b6279a211ea8922913c586fb57793938bdce50d19627caf3548d3b692c3449961c1fb6ecac37582b2409e2093217d87f2d090263cd07eb3fa71262b1f4281fd50c692a90ba7fa5d222437436f40a38e35cd42e299235c2f74496aae8875169f8845fe5db02657b897209a06d4feb63a441f75e436781236c375b51addbb351f92424cb881b24712353a389f03dde13a285bae7794a4cdf518a258d86356c6ec8fabc16888e49efacf732af7c9f42e8d3d34cfc5cfef452f8d2691f536808e271613b3a46dd994fbda396541064c5607aafcfa7bbfbfb0f60518e425d9a9d43e59e5ddd859b92f7af5be14dae11b37be72c74a47da6864d01bf695dc90756bcaa22dfa552fb38f5b061152079a171ca73222381cbb68dc25d84f1f4922ce9255e07b2782289441e4d438e942c5ade5cbec105b2ec81d0629ea0c39e62f6bfce92e551ec4ceae54fa5d98af7fd74f9df207fefa7fe0ebdfefee9fdbf7c72bb8fde851eb0facff5af98cb9cb3a566bdfef5c253a3c7a00993567adcf97fabaeb63e98b3401e1c998ea5abd9218e6a6a8b5de3e820ce518a6a2a975b37e055b6676d48e5013a068a895c259e5db44c9ef6d0bc563113ee9598cc6978cdd9340ea65b3532acd080bd41baa054a58fa90aee237d87dd16c9a1a2a2ef5ec56c7774d0e60608a7d3db9f20e643563ef54bcbc69cd33e9b5be16cf77d57cd452ad911ae267f4ac495cced7a683e84bcf20db60a3a99d8181c101ba57f0f847894e947efa39e91ca726ea8f1c2c1708d906bc4970a0e54d2a082aa3056216d4db98c790c14066643dfb4dcfc3d45e8f364120a94052f393b71e58753e452941f4eea6cedcea987921c5dab15ef15e3091d34d862153c8940acc047de4a48ef44b1a13524cc540f2e269e2a942e805440909c0a86b25946d37545f30a666f81ea6c9844c3ec1af5fde1bb9fc4a567a46dcc181e68a5fd7a5dc3944f82268a234b4a684826765c9cdeda65b1cf244f159d7c572de06e3588448c924a419521e0594deccf038310755ccb44a141fcb817d98810fbd8b48a04d7518d558cd2cbb5fb0f9ff6e3846592aa6fe5e1fd86f7727d96890bca35c7c7b4d35ea34a2e0cff3879f16939fc98147690c13a9521473b1c56b048bd5e25f46cb4c06f491c9ae0dfcefc6728a8b025057422d99c81fca20b2222556eef8dfe822fe5cc78f31aea6480e2f6c3121344227ebf4abe45b1a7509a5f0a3a0339e69db2eb5eb4a068b7a26f7540cd8d3cb9a3730956bbabf8e6cbe1ad55954bb73668876819f0d2806d6bd96384dbf9181c2933bf7cebd357846cecd38c2e3d03fe4d25f44167b9d475f7dad4de280a8f6c60cccbd4ff2d3b1c4f4897eb259313f768b33e12af5f2c6a8fa4ccdeb1f84667395fa6ecaf416bfe7044fe2d932f0d9c4c6087725007291ec0b267f9a4b85069501430af0a8ff50d82ee10c3c7fc3c2d7adaefeef7e9c3b43dfc071eff1728883f98b6d4ab75804b8417a703ec88e3dc56ce70a4a3a353d6fdb8560dca2a292f16f023e69f538b029ab49fb2dd68f0e9d28895ab82e0ac6273f31e819153fe000b30a7efb8173bd73ee0e5baedf7687c9f2620c8b8b1490d724ebced8f685caba49b5a34dd2707f4c225ec2af08bc1b3399db88a9cb7cea04568f4b053aee91274ab3094833b8a1d2cc65653878c3d761c19e18528e3b4f3d2c8c01444d46ef2cdb138220b14433017648db49be4c2f1ec6b98238d2f18c2f9397178952a66f5c05a8263113a17a685576158615945b17f5bf54e80912a7a5ec5777764e4326e43b1123dab5b8dd6c4309e7725461b326a8459870f06cdf0bbf3bea237702c9c53fbc8eae0fd96cb8eba4845d13a85b73340f7c815c94511cd69c872ac48860dfd93d996be66a6b0df14ad8cc17c6011aa0880275f70acc3e0ed12d0d2abefe0a171bad3a33180a3a5585686fa7dd7ce8db7cce8a8b2e3065b1094cb6892302a54e59e5270dae48419e3962a34290f6b8924e80a41c12dd3d8e249b25bfb74697103e41bba374974a96165a6f6c18441acee4fe56bb22e6c603736b0fab4788c644dbe6b127c74ee50fbd09bc344f81f6551a7b15e08e0220c9f61303e9520ded87cbd4cb0c6e1b2097cade96d8d8ab20eea93728b004f3944f58ee4260164a707db9da1386db4579bb22291a5c53910efd1ec930c528702308e9e262c2c0c42eb4664aa80f99ef100163bd0e908f6a1710a2061a077b258f2922c1d6678ae302bf37c315ac407650332d1fd63d4463986cc784244db6807bffc6f0d5eccc294b92cde15a75831415c4892273235b19b4850ec07d23f62df4f2dd664fa453e58afb6ec06028f06b769494e31d9e83970e02c2f809441d1988c807c628e0df00e3d260ac36c392c176494d462a97015312caf7f78f75cf7f30971b397ba18a7fde05351c52b099b1cacc0c8161b74196799d6c05c85827fab33740807d5dcdb388f018ff6933f3ea49f9be7c02f5164ee6ec5b8e435e3a64065b84f69167d7288b89fb21dcaec36caf8eef2d56b6f6fd503368c7159705f013f6e9645686a79d21c32eeabf78e007fdc429882367a75b2a9dda14b93dbf16310dd080b69c59e638e8900f6aa2c9a36a50ca2a04e20bd2b243c9b7aa85aa2c160fa68394926ac9aaea90fd3d5a2bdad5443a910fdd229463ea1a35a2d8899a12a0462a124b49f6cfa027d174a8ca2b4a0dc8861ea3d732c9282c4765eec4337c07f5217aa907ad725826c12353e988e6224317965694e8632fc69f59d274c6d630554eb2b5d8b71b07786e06ded8e4ba2774de8bdca682ee43908d67d8920d55c7e9b8159e704161b4e203acd6ec8f4b44b7fb01504bf4a46dcfdae6e576a642682ed6e87ed23b74f3f15ec59ea4b351e2700653e3ac1fb352eb4b0309cb231d26f1a8681ea3aad6521343a63f07a3cabc92168ed379a9bbb5a225e28932cc198a5af57c8f0defe873554792da8bcfd91f38c7e7bb73330b6d624032a991bdf09b9ec58f6f33171f0b94561d598848f866eda6601dc32676dbda21dd3e43feda81a6b6c894879cdf7d82fffbb7253facc6d2ae8999619e5151490ba18d4a41143b6a0ffe666a5236f97c420d855d90515622d373b40b82ded2061ff474c8b7bed10a94597807a080cd28967e70b96987908b18fa4675c8f10ddada9e77312a5d4121e0c9405abb9a3614bfeaad78060efe239f7625107af8d76b44ab0b37aad8cdc951baa6ef74bb0c83c0db8390c9df3413928ddd3adfc82904c67ebf09349194234ac101a52b5b90f553487ca121df46b891416ac58422e74861a4c4d27c98b960b8b83e002a22cd3b3f824fad94d21acbd8798d8d37007d58496a1669c3cd5f1e7c63e07a105b0ae994be103a6039c5bd13eb19cc88424b909d487660305851ca521381c00aff82fbc01fb3fc144b4d79e345137c294ae6d4eb30cb94400320644c2ba7726ea1755802e3a2d4863088404231345c8f90f88db783a790aee6c8feb3e709546acaaed7e10c7a1070fea01f7426351cd0268a0973dde676caf5a387c9237b67f128e4562ae62557cd8570224b865ec7394960711e6c5fa7a2d77c05417f1cfc8796ecba50757d6402e8ae0b4efbacf628732e8eee4835e1d9e5a6349add57f0ff48f7232614ba90e2d048f6de5cc070ce26e9b7710be330937184febe4393946a4f8999c00e7a0c795bce05a82e6441646bd42e07befff405c638844e1040688f1460553eca3b698fcc522fb49b506e20b38a27b9d8a60d98c3af36032c599eac60d3f315c74a726ea72d0ad6df0b3a2be1237e73152f60a6acdd7040ceda50572648533229ce61afa2c0b3b7d68888574232579442aa6acdc5ab95b88f4a097a2d43dfbafe9b7dc2136e887dbdc7f241feb62c45450f258be8d20c07805964f198e01310e0b8f7e860e5cb07a51f771ce425b4311069ac24b663cb92ea24e3fa56539a747088c038a739cfff153ae5664d076b438e58c56d94e3779581a256f7f87b9c3af39dec3ed4a78edd656b53a28957b6af638de1f10e5dfec3856dae1b50666aebded13c9d5e0fc0ae6bc839db710d07e6a9de1a85b59687d1bf7dd82be2fc802c876266e6c35d72b224dcaceb2c859aded7decd36d9b189bbc710ebb1ac73a1d0eaba9057c77194dbec3cf0e6fb3e050f71d5d0145434a6d33e65a782c24125e4bc8fe5ec6f37d5868c89a75ae1aca4cd3fd475e030c4239f80743cd777f382820f2770d3c0d43bc3e933db1017c254975f48f10255a10490c3bdd9cfabdf5f145a27ffc4cb31bab0406be9a02b5af563d3fa0a1892a907f7e45466509aea0dff737188e2bd75ca2f6d92dc39b0ffb15e0589d744acd07cad051d394c413e002bd4bcd43d1912f0765a0829c06929d8463682b8c285ede5e0f6a30f754f4ee107ef54f05a630863bbb26387bf97883a03990ce4c449e7c0cde20934aabf18284ba264af1dcaa003067e0de5425dc377f513afb6e8f32c0b62af406995805cc0b0dec2eb82ec694ae97fcb7d42f6cb85458adf05672322e01fc376f25e9a1cd4498c60880ea688e7043b1f102b4884cdbf9713454523ed4e33160382f700f600f1a434a0f88672b98b31f692c34401797444b1108a616c6e0bacb596f5d9533f356d21113a71abb09017e81ee5f52b5d812149759722fee59b332b12009b19d095088c8d9c3ffc0b626ca8f75b530aa8df833c0f765193d2fd7fd652788e9d8fe48005d42a4897184ad82621ca1d7786652fe4e47230180c00931f450b2419f91489e1edf2fd8e4661ce77e3d8bc014a49a499aa03ced54788290a6fa81da751510474367efead016b7f3317013a602818ea1b412e28d9545bf50b62a72a245e72dc1c0572382ce91b05353a03eb077e222a688123561854a32a15aadc34378d9662840141e6e4dc5c1a23e08470f50ab34dcd72ea082349aaabb34882f98c318842b8fc1afa5fbd102fca246dc2130ac42c7e49b8d76c91854db60a60bc720bbbf7672d4d05f7df924193f90862014c1bd3bd2b178e65cdcbb1ea2ebd97854dc3426c3ecf7439fa6c5d8ec617a6cf83033ae5c27ea79e7a30a472590dc1ece4151176e62a08287953215818c66dd684cd765ba5f66962168d1c1c49c8bf4e7f56ee844896e41fbe96b7aab30629d9a2b61a92123ff9dc6c8db89a327562e80b8b23e25d803ffa4e6fd4167d2fae5571f2b165dd5c73d3ca19833b7a1ae13ffd274d9fc3c9a682865e60baed6a917fa7f0d32e6613b29bb053a327d7998df2023734b106b1dd025a0335f02df803a7c0023144a16fc88f8f22cbb3162cd93b11eb686d822615930ad0daaf793041ac4111e59f1693d17c17d736bd704ebf6f25794506f9b05296381673f7e34f3f652c6182f60ce56f0a7cc079a2606553308124fa79a82595db0c9fc4407b76bbc34eebabd3d69dd06b7293cdabf2840d8f3ffde1682e82e3a30384dea7a3d37759efb2d7fb42ba0b773d3f20791f17d20c3a24afdf71188fde21655c3a5fa7b5b259ecf97046e994fbeeda42cd749b3a69b08dfe3060f0438dbee75858b4ae923d9f33613bbf520ec296de2ca1489f7ce7c29ed27c7dff4b276de9bfe08621333789532abb3f4f9af0cd48cdf9aa630bc1a27484066e2a8ae65c9ad6ea914b0b495e891ca71f46cf124b3854d35d62494001e64f5501184f055c15d8abf3127bac8b50e0f65de0d24a843fd3bde29485c4f79aff150f5a5a3b607d07b0b50b44670d97d8ad83970a431059b2de0c4c934a990f4d104fa5102531841c1395840de0f7e1bcedc390b8639f03fcf0aad08cca11a151fe32674c3b77f7be7203a1ee41787bb1494436aaa594639c6bbf615c5d0775b96016478a001a43fda77a15d2de1e3c9bd83c7f498c8e4831fa515787b65957dc3a01141c6b1c809818ad434cecf4af131abed4a5f871776a88ed438919d8dc930671d86f3df2dfe25a1f079c21abf5e7672dbddfaf1c48a8718086f76a7f6a98842c67af040a246f7f6512c56e1a01bd51d5caadd57f0f64f733c067db93f9cd1fb01ca0018be8b0aa3e1e3461dcfdb6d501c884ca072ec92c4009c54a6c7bb8f5a6903b2c2c8e4c00f2b60f24936e8dfdd07a7a54e50f0213f1becbeb0213f58823478655e6c1a57e17b78a79f4235b792ca3bc71cd536e74c016daaab77824d007cd49c72c006e5c22e4c50e71212bf4d7b6697e17b910bfd07d56b303e20e3ec40da0b53edb86c320955de50ac5391c7793b427848509e1508b8fbd33ce99a7cb4e11fe8f5070d639bfe629905ab3723c4133c18c326eb1c65324b2964cacd14f4a1d84eb08ea6d656e1b193959444ffdce476a7e3a71a79c8bf2022b6b3bf002ffc27347ff88a17efd23956f4bdb838e88140ee586edabee00297262bbf911c7920dbbee54065401452f8e745d5114913bccbed581315a245fd6b5b7c66b5870e59f282e244eb24fccb86746f085eeedd99b9f5f7be24debe356861d01efaa08915c3f5f01366cb1c0c91780c205d420568f9ed8e942bc033fe700a749b19992a9b49e05b87d2e3a233e7a917c04dab80c9a9de61af5da1abff79e102006681ad84b756160e0d6ac74a8e0d6b90aaf217786e735e7c4dce489935fe52d040517693365a208d2e8597eac5d7de098f8ba2a5737b99af68de326e3294a166e036f32390c388e7c93814bd35b11b0d022a4f449a6337a43cf87e5e120799ee4c31ecd4db79d025ac1db5eaef98b7bf4a4a20a6054a7da6dae3826f3d95aba9695e6dced7324974d7430680a3b90858828f8390ba35dc7c5970795986f4384b874d2f709b64a2ae4b47c6b9877d8bb51496c6490482a047836486ebcc2665acdd8b528544c0143de820d37bce4a06297bb8aeb41e9552c8bc5a614e06b24b73001ba3d5517e7d70533bb30b65d12800c1fe47dafdfb574d401436ec526ed1852ddcb7362999bad6e9c12d977de59f3d6c8887421558fe0865bea48dd15fae0eeb8bf9465c1aecd303dd765397f24cba1a789c803a8b8fd6a9e9d77d5b1f595b17add98407a59059049bcfa4885c08e5a7db0cce1508633712312c53a4520d40c4a32c9b9f30820e68c51d8ca1611211581d31ad51eda575476574f0a58184e0a5878c9f41b93544d4e68c5f645cd88b870472536c56c42045c8cbaf9011dd7cf0b01cc7a8b2d8a043f280302eb080424107c8ffbd6889bc8d48d9b4d74efcf55202961c0c82448c45cfc4f4343c652113b32f9e22af34c0b11a486d79c3acf14f8b7b3f6b990fd597cc1e8fd8cfe4dd326900f254cfcb8b2aaa78a6213eee423a5cbf9eeaeb1222fea5fb8b19139cbd954acd760df1f0bb422ece067e748b7a2468df210dad58eb5e9fb28ea68bfc0885cea4cdad90b0f85eabfa9b5f6eecd53f7ee719a98c68b8e441f57e5ebe186ad240e34849a9299e2277dfff4005655e7070efe634d6448d3af0a7b7d1a092b38b6314204b9821be6a6ddc7003b113e1e6d81fff3e8e6e11b5289c50d30273a6fbd539c17cff05606c8a811f3667548f94eedebe125231ed65cd2cc14f7bdc07b09861dac00a2bef2ab8cf60e885e2df4cf4b854e78073015785db6f7eb2e2d7d0267a071f162131171c1c667805fda930a38f71eb05e345983d9a9818e2feae463bb9dc00e77f55157121c6a192ae76253da3d71a8f0e67dd093b3f2eae3f67bf37df74dcb9230d689205bbc83e0889d90f0949c95183a6bfb1328a0d07552accafa0ed924e9b8ca84d80c8af9736b43c0d252a6dda28c080e311d0a596d103ad1b7bd8f8695ac58a33746cb985a0c2903d1b534b50476b5477db01ea181b39d6100377fe3c51994e37196886069ccc5955da02840495d9d2b7c4939c343d96f406830fb683cf7af55f7d3a2c52ef5cadfffaa23959bc5c7c2f506a48dadf34dbfbf904e5f8b92de9f2393be179be9038dd67257750fd40d1951efbb7bef0b381af8f958d80bb470dca62c7b2fc24f2906a0a89b20296d1184ee6ce16df2ec00a6a6885e0666125e59af4f1b8449acc619ca063a4a8d830984a2c50901c7cbc4458d08f253be4955970d239792bb99cfcc1f15760f7986e492023629d9dd60967425485fa7e22d0ef13405c1f1f21a0cb000c265226d4f71da941c88a475f60c86b0595c93e953190d8b242037051cfd631c65df9140a26ad124ee13495759cfe0d604827d24f4aec6fbf91f84ec78480d0499ea7d306cb38bfec16bc3568e56f82726cadb580cc9f370df4756300533ab8ca09fae75a33da5cd80b80b8ea65da8da118e3c9d1c647c734087556e18a0b79bd149a5623c6acd8e587f03e89e68d4c2d4b31a2fc185f002266fdbecbd448fdf9441f080521f13744a5758c419daa6e195710d8857d367743b644e9b12329d6a13e0048c7f02f9e490639bdbd40f47240a33e32ea696152fc9234be5dea4a6a5c74f54226fda3b6e7bb6213f118f082174979383879dda26129150bc00aa49ad52e1456b95bc60e3272a6990e450b545ceb0af28ae23f2482b32a438972a695a2ab49261914e6ea60395509ccb45c39d1d075c869a44142887a9956ed9d1aca2532104fc4d392161de9b4c3e75290129fc8dd02684665900c5904189d2a5ff2fa0b9c3716d858c816b238db5029b053e25e67881456a0d8390e64c5441757104de51f59a66cf2e2e15277248047e2a75663db15631761f71654fd671f304fab1fb1199145c51af93c16752a5665e8049f16f6f4d9a6a2b8126a7ac0ab2be408c9192402b27ea844ff803c2c408b23d1f8f163256d18aa4a62b419a66945a95a714976b02caa6917653207f969dd1d271758ab677e1c5890eeae8454c24c675517b9a9b6bc2a7d933b50ebcfa01665f6285d4da270bb7b36b40d29e6a8e6bcef093e7049658472163278cf7cf1354901b183c0fdf613199302ed4eaae7bda63d2cf51ed7b0e86fdf1f2ada5db782465cb16d855439a8ad1cc3acbbdddaf942ed300efa256b4efd37ddc1ab7f476bac7af738bf4968e3b9e1a1068618dd477d6c54fb45c25bad10a9f496d402ade372cdca1cf4132012ac592b67b48ee035ccc3bd51193edc7c18f97e75d4b2d4993c8ac85dcdbd4b545314bca14a53c4740a4450f74083019670e17d0fa7e5c4c70da5f8fd3cca52f242df94f0f0842441d2a42ad8fd9811b8c421868526d11fe4590610894f662295020cd9bd3400009b00588cb73477a30558d5d4ac41b1470bf32196c4bedf7cc8603109bd4e03de11358e943afc1d36263b371e037691927ee33642a13550b208cc1398e542c9380aafb950adbec5b3196176523ebf30789904b77772699f52d831c73128f64e1953a572c989bc5b261321b7bfcac5c98371727d05943ff6f29f9b12beaa5d8dcad4c8f11df119e1379a6c728a2df5c1491e48bb7382739b35b8e5458e8912aa7c2a6dcb978436ad008bbbffea29392d3f099761e6a8c2b1092fee3f502f370ee773f6771f4782a5bc106554414789e13b6704f180d88dd125dbf1e12caca4b3875fdbad9508a02c8be1fc1677340e1d2fa9fd71f473e7877dbcd0c3a3ca68b63a3e82abb490914be995813fff312583ca3d77cc367dd9c366c0fd0367094b5723312cb9f7117aad0c4da2c59b0562b510b6ede618268168bfbc661f07052601a2c5b8bc3df1d35e48387aa1d6e50c25ac2890d02325510fb20c5dec9db9f604ba0bf7edefde5dc43cb42368f01cabf03824a50db1038da9bda736a198ad05b87ce4687b1545c3cb49e2091c801b97f8a17091ff99021d79529c4257dcab971c0389103cb28d217a1f27b3989c278bb1f465a09e58c12a112e251a884ed6fb1b2535cf4bb6edc19e20f7facef3952ca98a2eeb2032622589c0cf5a4d993146d5db0ce623dc069956752b2babb13b8b419b82832e5313f9bf840351362a3173684dfc0b43804f8194c79bf08e62d65b967a62d2325ef54f68353c367afb7b9a7e52b0bf8a747d1362e5af2430454076de4c2f8e5800ae58081fd9cab671e06287e3a5072af37cf9ff2103f396b694c5ca5594d18d3feb04d98e64059657310548fd3e801b6344c0b43940e9ad7c89b837ccf5b00e71158234d1a287566d3cc1112b88cee1058ae3fea5053cf0a5a1b9de5ba3c5a5c06e2373ab1b310cec42108f87e6bb4c3f036a6d17cd0ffe79d8614ef4bd1e043bffeb07bd1b4652923baeb570cbbd7d38db72bc356f5f294e901a0097c69f235ce183c3975a40ddd298311bcec525fa081dacb9a1ee673beed35a36a2d97f77d79d98f6320a0d36779be6d63a3a20553c706343c77c88b6ecd7ba88c0b5ba6efecfe4b2701b2e683211681897d9cca0c46099f23f83c5db9dc00d55665506c7a4582a1227a024fee3128b799b92c061ee8b45d4fe2e3106e87b84fe44d50c501226c4c23179d10036ce9d0b497420267fe958bed02002abfc772306d4fa6616504090b69e1c9487f37d21f28ccc3d155bdb19f840faf2df461958f88263dc397499bb93b6520239326509366f0e7041c89384a93f43d16ba6b77222551793d165d3c7f677f2de87c6d2c9aa61d53ddc614b95e3eff2270ca443d2ea7b9c8651537e3f39306e75db798f88bd4efa7475eee2e4fa3bd89d6acdf0e15f40475910c754159590ce17748c80c9ada44c3683bee49195b7fdddbb9e3b6ba6312bc63766c67b943a69daf74f04e9207bce6ecb50e949fdd0eda6944fd1a6380542b99b3bc129c8f09cb9609906cedbb2b98aa6509027854f449c7dc06a805151f3525e1eef2e9065a11049da4d3e07a8a18e73ec95d1e9525d4f52e14d78ac49da7894afc2aebcad31196a1c490d1018a8f9270f7b23778fb9b2c184032a5e3839806ae55ce813ce389a000e8a1efb4edaf83f7f7c9fd1604ab10cde704ba15df01252b814dc0a6e703bca9cd1cef00a9094eb0494644e429def54dcc5f6db2599bc1010ad6902d6cf64b93c649e60085fa1dc885ececdb4065f64145419ca5f6382750a178e88bed9424bd89cc3091ded4e82921afe99b4457d14accfaf105b88d6356a87d755d6034b6f5e7e0329fe48e55ddb294e91d9bbcceaf3af25bcbb04c2473b309572531d0359588a2364d0ebdb8e39fa9538b86655694bd75d9bd43b2673747de8a00b15e399452f999543d659bb39f49e4072d170f7900311a0a50e12a046d2059790f0bd4d4ebfef8c8b981cb0ff066c5aa5e9d3be892edce5ee82252eb9205a695637dabf88497865436e85e3425da633eef51de7223f3c5bf3c6869903395d0b54b2c4babb27b85747f7f8e7cad1016f615c27d8057cb515a9dd032af0a678d4525d1950486664d638b156e9cb88c4047ccb3db1252709323c1e5f37ff5fc52b3472cd4dc2e9ba228df69e6342b4ade8e39e8eaaf144d22363ea2ebe71d67dd9b145166539c1f505e9aa3375bba53b03da89260599562e5bc4112aa48c46343a46a84e93df7fe89d85c9995ea79d9a0383aa318f460692c7552ee4c5f4a812f14c5b1ce81ab7d4c19471aa3a358575bc1a86abe34a4acfb959492693f1577d71367c1d8cfc43a8f255986921586867236d66979b536cf7b72728563c42919a1ea498b840958b5a90e53f79828b1c1cb1c3db296ed576e86d814e2712a45a60c7e876e496e01c1201006ea12da8dd474b843de058b957c35c902eb1eb5ca4e33a5f2a6f4cb0301529f0bdfdd65b0180b1f203d95734fc3862f2829f9f9c2ac34d6c855d8330b28c172b3850a468324fa060989078e9147c2da6f93a625f4c76775408c5dda38ef95f0c34baa61299c04c10e3fe45c0bbb3f254d97a5683ad69f0ef290ec53081ce327d8267619d811444556f8894559bdb50b33ea91754fdfed0c219cc1d5e9491fd6f878583d057cf3305ffab80f88749625d525585265b514ef8b4c6924269651c8119dcddcc726458a0cc1c7b6b29e44562f92e37de41e1d8fa4e293665c676a406bd8c2af0ec50fef9ae155d33ada8d73ac3049a2ca2b0cdf493f84e2bb1ab351a0f3e6e1c69bf6ec6fc638c40c9caf13101d36dc1b885695ab34fee814a5568be35d66833e3a3d5d0e01086bcd0d08764c796e508d89493712323784cfe49e95ab4b32ba48c5ddd025cbf239054590876b20658411cd7a66cb087c1df9ff10f5f27ee173eb465a9e541d9d5559cdf67e754ab333f2b48d3298b9f73a616bce206ec6763b495b75eee405c1867ee1a6188a0cc0f3181ec93a47396ea2e71a31156c644442434d7a87fff5fa39e61971c7da9ceae7eb21f9c892009aee80284168e8ea49979397990e0bcfe4af3028b94b745db9898d558e464fb2ec3cfe149c73e8036415572e397ff75ea921225d5ae0dd8d6ef92990c729dd4d2b97e39a25e4c61350276fa7cf3752e80cb222b8c75df657b68e747978ea5e159b44410af2754741a5e82d2c22b0ac764bbcce9676346e7c55f30b523b98738023ee417fa107bc51ba17219582188c8edb09f59d7d358732ad2bb64e884ddcff202dd07290781d249c07ed3a0eaa94c0a3a9b34f51cb7f8efee319042232e18a2e44faf1e245f117c17ffc4f1f7fa8e91d236d043b9c20d97a76ecf6c850fdd84d740e4103acca2beca867bb61a7422505e775b006aacabf980c36b2ddd71b0d8d0ab676449028bf47ad366028e51260bc05f860b59106bd0b82a8fec89247b8deefba1486c07b92ce12ef14431adcf0d508cba64bef7471d2f727ab6cefd7bea6973c4c98fbed91ce0706b67cb38bd21ca25238f9d7447feb1ad3b78a797a4137925462bf68504f47046c44ca89027a4e8537144f7a4998e51a1e941d1b9a799c984af62f366fa9e73abfa53ead797a7e9921cc1adcbed60207acbce61a341704caaf381ac6ae86d20e2819e3068457c377d84c2e6c81c184cdb49214b630589a42d8c2172cec4c9554a18583a569842d2803a060e1ee37ad90852d48d8b9e9b690852818d8994a60852910d8986c300a2a38b09852202bf0e1560465cc32b9600b5290b0997e640aab70b0c4a485190ab16af1cbad70ba6a66d00e8d57931d4c6a7cdd1b16ecc25bfbc866a5ad4482722de6d2097c6b89844abbf361cb2f2192c78b16ddab54da315cd9dc30222f008aef34b025306dd68662e15f9a11b7b7607f7d5a09ee6de2c4a25ed53f2240e44d835caba5c2861b51a6b77f99677f0ae104796d651d663299d161416cd6015156ea282292814b9f0528aeb8dd5657e67867e2c9675ebb885a6e82dcd0f86730646a541d89167bef47647e004abd095eb41c002b86c7547fde97d094ad707db7d5762340cb4ba59a14df6cf133b0b231bf24dfb9e5edda2c97738b566d06faaab56bd32a75ac5a1802104466404f42539b6d8148a8ad1ae4d954bd5778311490d1366ea5dc0ba7cab9f23cb84632949b34f474105519cfbeccee8de059bb90883b45da05eb5f2d3d6efca4c7d333dcc6b08b6d7c98e73b0451d5fa8a13d03f7ef86756e4afeee4e0cd901911e83895ed1676164ca544d86d0129e72e2cccb3d88cabe009f4d1982b4010c1463aae0648f2156e259d67fe71d585e8b0cc6e4a0cb291e014545cc6f454e7af4c778fbb1aac32e8cfc94e356902e3650fb914c6000b2d9b6a70f3819206d83163f1f6a8703b8029d43d2f7d51edcfc8c24fe45d04b1277621b603d85b80ddceb617ef056baff35458a6525d4a471331a8b7a794bd13f5ba22a808e68c071a88d9244e6980d35630157575a997b3ca01f123bb002b3f35a95a567d304f42dc393d91cb801689e6e7e28a45677d74c8e93fa5cfd42ba202e75876d3b36f905c43cb5d26798d261bac005b02efad0f85a57dcffab04c1eb4dbec2bfea4ff0bff9aa75091857dcf307a3d58c4f8929b2cc9142ba66be4e582378db084e8baceb175ba4b5619654d6dfc759fe1176d42d12ea6b4efb456a4eaf94c8dc1e9face8c3f82f62dded299972d119f8627ea5fb78671399e752848cb6da40152adadee0baafbb7dddd1adcaab9d232b56072eae4871e126c5497de0451ec163b0b554ec85e7d96f92c0b8299febd14d85905782e5ac5b0a3c045ed400593b17112b7d1b61d532767d623d5d4e9ca02cf1a01228514b549e07976d2fce0ad80229418dea917c452639ac41c1a2d2864008f13c7eb2eef49e49573b37d36382e5fcb2d8e85dd4f10ce365214707ce8ed2dbb38479a408bb19a4968d2b34f82b792fe06cfbc971050901f8367e3a70a912225756fd7540f8911c53e365f0b19796813924603c78dba769c9d26364f0e430f251867964ae9842ff0b0f6589b022600d89f0e14f7dbebdae29ce19b618f0685ec827117425fe76e4c092ffd9bd8793bbd95cc268d3bdc4ae910b79a1ab7aa0b389fa8915b9d292d6516acea5591dfff80382904d42954a6681df3027baf4f4916b46dd7442d060d5d1ea766f8b29558604caf2566f041fa360968327ee12c28d6365f4cdc8feb23c78e0496abfa43f50653ee0586b994b7942c010b9e4c5c1c629fe4c2d9d40ddc32d7dfcc17b0fd77b1e1c91dab7ea3250e856a9848684550d95d9369463d5d99b48b476c9e97fce9b1b11cf8d1d33535a831575f4c0ffdf25753653aea9e892840f64cd1db314717da3a06b03b35f4eac083ba1a88fe8fc4887ead0c26bcceaf600ebf550fcabe06446ca6655487edd9065c3fdaf77b6dc367d4798aca99815b42682b2201ebd5db7b9507bd8efcae95e9847ad48c72d9371fb8307067142234be5d297044ed31b0f8024c76be0718a2c1c22d8f2d8a925de104bc56cd8c0079fb1755488fecdd99670a963b97313203c0228e372029e9512d08e293ee0ed260bd376a183d48870d8e9ca284d5614e5a1fd018be4810768ef9260e3b4c38e627f39ed2ea2e02b4a7f373c8d81d61a5c47af1496ec6be463f043ca572e16e0bcd3a1407f3a1c81b915ac83376ac40dc20eadb75debafe435f0c19baaaa791855ea89e9d9888f82202e67b835014bc61f6ffd6c4b0a01ab0bae7b9c91def94deabf7f61a1730961001a5a6a199140d02af9328f219fa7f3f3304b6d39bf40c0ec10d61c2a3780e4512de4ce4f1f7c4356fad469b67cbdffcae99bfe9df5ce1639ab63acfe7d3f40640378fa888df2a29826f80cab170599224c960f5649cbe5f041695f8890e422e47238e85cdc6013f9cf3f3960ed6f559df388ab4121cfd948bdc9452f10f41cf281265850af1c15a5b0be16b8939eaa4657f0c312593852849e382b6edf3b223c4894f25313904f0df534836454ee5fd1a0ddc471215f1b9aacd01d718d8bf0d106bfbb605bdc1f3c48df0b285288e275fb61c1bc22d3de62003caa5067cabe3c9af33f2b53ab464cbb70dba7bf66b1a85dcd004e0d1bd88b156d893bc8fc907a37c6a96d3561cfa37c04816328e6fb1c95940d198332de6157851dfb452fb568285b81faead1aafaba069c372151c2306893876ce82a328c5bf115f1eb787fd5da762cc28083e619f65a21d1688c06394073208892a301209c66111e7763f967d5a1312ce7e5622fbbb77bc5cc84667685c54356cc1454f8e7a8d39b718c8a593c32e8747d30bf46426f8c4e92bcee0f2dcf3b3488a35f2c8062c38f667b4ce32c9c2ba102a04a3d13a94098c5ff807783de545564ab1a734f09a9746331a416ce68e08700f18d0a3eea97c50c33eea034226bc572e012de359e6e764c23ea25588ab17d6530b816b01b86736f67e97371006d95bf86eafd0e58237a6ae1e87400759ce34e0a084b0520615885c72dcf7ebbdc085433803eae3da2160ea2aab0effa1f6e70b05a13fb0d1825dea9365fa75012c4cabf22e5e23953f76148d8653e9c6cd3d50bcf49bc46b24875159087f3b0e9d5a8385a06b34e4908bfbb08be2f022f741b60b22885e228eba9789b46f91adee860d29ab5aa87bd16e1e4f2ea063e1212eda2fa434b3ea632f7d74e55b74e21a733b7a0a648586368e4d03805041fc94cc00f813fe2fc21729ce31b1a5014fef39d8f00864b78068f10e4936fa905460f8a3916f6b4646e122d1358456b40ad0afc18ec0e231d201abe36377a124848dc120c6897240016d038223f1089e76c2cf7f046827e8590f035cf22882e59a8cab84e37b8a0700cccb9b333968ac9006f3a2c841758b2af1a911f22d35047e58f0850a8974b63c58e7e565c2c9c25dbffdd3d430ad8da3661ce1bb645a636abeaf44d9a9a7d0e901f2b21178fbfc01df48e78d82e1aa1e46e483db00d90e7c89d38e3633f7c06628f704d33326f51e60e6e676b815281117b61045142922b015db3b2b1979af74dc3a9a44ab710e76672ae98c38531d7b7c089c24f42baa5034c5a6bb788a6df00607791f154ec1d11b90ced3460c64916cb0ce39941dc624d19b90a029c27f1d5017db44b7658f16fd38a949b980327a1921a1fbc3808ba862af2cb75881e7077719a3dd249a9dfcabc32d6918c824f390b5e79b74b4b08f9c9e421362832ee669ce6f0dea6d666eed879dca27b53b0298c9bfaf0975a045d45615440aecd97a6a11501068c36948871694190517611992a5ea34a043caeb8d1126cc15835060268ad24b2094ee47f3b1890c3fcb08ebfa94884544ffc4e7641f5be75e87c809399326a06dbdbf14bccbbbafe73b2b3b3bde123b9b8c3cf616515f20f6c7239e63962aaa898479b14a95eaeba6cf5b9fb1a20da9f1216b6a3eb40b194c5c3a6881f624785a923b0890b70261a60e6458bbbe312d5408443981bb0b76072feca3cef69d5afa656799b66932d5c3776e62db041f576c9bf6bcecb279ba09a9cf896a77bfa072baaa8d9b907a013fba6012ae4002cad858c39073b320681c6388b95a682049543d656c7b53cffd483835dc082e928905a4524970cc8d3c8930a653b390456f2be090ff26d3dcfc134807ee4f5de24de19c72bcd02a4d7e255db8d46655a506cc08db9f953f003e1958dd503274148b6f7762b904955013cab1c5dadb6ada6ed0ff6f4539f53429dbd208433ced19f4942df801dca0e6eb18a650581e056c14742f9c9407e1a48fca2069052ada77c1e528db5c3224cff602545d22fa3366e74345163a3039cad0501234a4957d1d8382aa5f04f133a44622623a76b40333ade1e247cdfc29f615bbfb1512773e86a183dafb9421f47c47604ea3c875eae60d29ba3cb9c814c246962ee13d673ea3c001c1559f8237d91201f351ec8f4152330115c70033b8f3b64660cd5a8ca411e311a62c23de261daa55d3939b00313de670ef003fc5ad942f271ecadf4ee1699a259c74865212e25b8287c7dde4b03c2eef5f5c36c44972beb257d6106334167fad56f7cc08a04fb1f9b69c8eeaf1251e79e7b1a59a5d619e522814ac4719702dfc68a4d13e856151d6abdd57508fa37bc5444cd0b9bbd147f014205eca3c87cd02982548d799a8449010340d5cd6675045ed583e1ce184b83dddb7bc24fd1a5267d6b735b8ab302754a7d64add1f0854818ffe0a4a5e510ce19a4676b8304170ba4909fc897ce09e5fb665415b9ac22015daafa396c9374b1cbb7945f0e5c722cb2852de831669b490b4d6f57acb6bd187220970e282df33d28d6320da5cf38287a648047a786048bd2353bcd78223c75dd04ee89920a6c84f81b0ae0a39c3b211c6a2eab03b2ec0e6beed3c1c41e2972ea8622c03f7fff9497802362990a5df4382cd25bc92523a910eee85d8e658f63beba3b6b5be98252669ece21dcfcbc7828b48df3815adcb6bc9f16bc9e5e10353575afb6c5d6e8c53305744082e0f2bcb42aaf6d8a71ac3f49041742ffb45d487de7f6efa2e321827e469fe394280b8ab8157c56490d5e46c755c83e1b5b2761406ae04ba76b5b8d9beaa36fb7572e6dea9e5e4ab534e8379e91f56d04881d95c57c4237189ee26055748134badbbeef54687aeb268b0d24be159d1c186051536333c746a7ea570fa8236a865352376a7506780a1cefa143939920ae9db0d3ccab546f9429816b13453e6ed26cadba655f46c9f11285c6d086573182f6a6053ae8350129c6d895091327a47379242ec7a7c7b1a4ae32f36ee045550da75b0eb71a209975849345831e9cd2b34dde5d4f9c99ff1e9105f33b3a0465234a09fdc3a55b4e95f4d01043a5e41b4b459da619eb8a0f642347ff4e53fb40122a9d279996aa0776bb31432e0b385fe363367d5e34082aec2b34b9c4a1119f96a90be351dff3d45ea904ce4df0aee6f3ec749aff91301f8e5f3df42a93f253510e0b901d87bde79aecc6c83f645f6d12dfeacf8edf7357aa4be772f93cf9190c546ebe714c4b1e43fa8552f2f1224e9107c62e7312d0b681025940b133bfa9ab23e0d88bf329e769c314eec70dd70261e3e3daadc7bc4e8302b2f8175b5b6493cab253a2f4093cc22f18910f4c89395f9459a1eec2378df27bfaa8475957d573a9cc98cebe1741709afc34a5f1a9571994a520340dad41da554b01727dae25433064497363ec50e0fba44ef7f8ea7d71b744b823d136aa9b06901cd5f1d0defb1b749d4c23076377035de6ef9c087f9239cec552c6f98e693cdf6812b80d081008fe4fc2a419f7d1995d404b1559b661b2a2cd2d359cfcdcb526f9b5926acb7864c769408c0dc791ce24871918f5b66bdad845959da23105ee87dd739d3b36b12007c29ce574a736b9893cc043741d40a274a4962f3d5167b5e65329fcd6f0bd7f15af8a282468267d1894f75db0084eb4012168c1a1a2812922ca745d42876f54ddad469a4d93ef16e4755e9f91e2cc7c192547ddd86b09aa0bd3a7d10f47075c109d59a41ec22ef7ad467698394ea77c47e30b629fdc751e6785c4a7ccc2a165f20f3ec591f0bb9622c711e375d44d69bfe080b238bc9a2348937badd7dd420d8e84ad96cad794f580348facf0a304980593174e81117a813f644de829a826d8a27f89d904b1c378f4cb0cba84957018d6dde501687f12b9957e69733ebe308802822485fe8d1e83edec790ad9411d43d9c3aef5146a8f250bf6a866595bdf8c9e43ab4ae3367983115215b31d0e84a4f04e3e19e0211293c28fec336cccf0d0643d408645bbd9ebf36e8911c094df74465b1de0a9a70454e9a1fe38c450f14d7f8211e0672ee590ab88239bc00ad261415fdad0733fbe3ceb2be65e9b5114a85c8dd7dde4d638b8474557432988140e8970f3a86c9132dd4772e2952ebd8d2b0d187c885a46d98749afdfcc985a37754d5a81126d3ec608820e962a5cc33a8ea39cb29063c1f831c512995f08e92dccd4ebf5e12fcc495c17c1d0d54bf4fa40c16369673c67bd7de4409db7c8bb15b1e38949c08d121aeb2683a6d75c790097a17c82aab0c058ffd0d592f8382b4cd5d13dcea5279b13830d7cb19c5b271da544d5480f0c649274330eb55a377df7049d452689097694472e8bc27a57ef13070f0d1bf3e7d553850d0d3eca1cb7db997461083a9c2300d92d2875df22602133a7df40ac709252a504c5978eb15c4da2653483303a1d860384ca82c003478470c45032e8cdababaf41f950063648687df36d493a95bf6f4b851be99dd2fc66ba8f31da1dc2da8c146422b189b98c88f2193eb16a4a5c096ebae1d94d660360119f72f5d63fc784536f7d4dd384d191a66b308af561ec86514a790862a97783ef86649b6215d22156e51f0b0d0c63f8e009ebd44614f448a6f36bdd6c06aeb5ca1cdbfc14c8d9002a947a9c87d57db5970ba0be538d2ed05a76accc706dbdc3ea19b6ab896342a45d07b3ca20d9c2f436e2bee7090d9c537112077ca12b512f6ae5095e51f3bb38469a52f54e0ccf617ec1a6bd66d1091987c5f7cea2d6590ef343ef5628ebd6c1e513d65855980eb176f56cd6d85a0eed2cb0261199129fb6b0f94967a44152d3768ab6740ed39e04ee912c69da846ff31bdbe749851235b993cc74b4e25c461f3dc0b4b0c9a3ce34f9633b13e76d5f90a0d3da7a776ef64bdfff747b47c2ea4f5308d8e43a7b2bd0b47832eebd0114974857b03604d1ef8d124bc11a690e07b9d6cd8a6c238f8ce4624096488580fd0718ad82a81f8eb9e48b22e4901c9ad50541d03b2ab300e79252faca38a80fed8a5eb4fe6290127e78aea1851e116a16379e614722bae0d1c2ee4990055d12128e5ea4d144dd41233e54906936a068844e68007e40234ff3e0a9364ed0132b0791b510eaa4336e22c98763dfd2bd247c8dbfd781985844f3c3b19b0296406cb1e88158c23edb50887e9885822a45e450c0f0555055c89b94028a73d01fcb9ce2bc723e6fdaa1bd9b2421bf2e6441000cb23fef30af1e659ba65abf100408ec2188ad46a8e69c209ba9a89dfc6787a687e0fe2485877741694830c9de2ad027449dd9446bb964baddf8b84ab89ce97ca4f00512a15b039cfb467402e7ee643e57139eea16e9cea951e96a3253780f3ba7c85ab3bb4af30684aecde233778deed0643262ede074370ec5e7a9e4777109db8e8b4e1bdc64e397492eceda487910de11f801ccb1518173eceaff5c765e2a7a51e8fcb0e53cb44889cc99dafd927e9e57d03f99eab562802500080e1e74b820e9f9e349d9ecbee77b352a0996ccfb88101eaa857c7ce0fb965dd06b6c8f77105f4692dadcdc1ce1e4ca232abb1e31d91ea41e8348a8412622ff30d0142fe46c545c521842b7d6cf66b2b7b4bbb8f6609b111115251d2a8e9f0cd09b392b11c3f386e5369b5104af985cdf5084053e354f655c910deff4328ad622d55233c9e3956b2d6e38355b033f14428b21a1b546e8b5de6c7f96409541f345feb509870d6745c13d113a83dfc05479e374c13d4e051bee4ce457fe7c3a0d06ef71aa75e839d235a7a47f8196bbf5bc2017156b3a1c74885f0298628baea5431db5a02d780f1671c89689b22efcaec75398f2c3ff0634fa67cfbb9e4b0fe40c3c9429828d468c34f5d2f258220610d6234586831188c97d89fa1565bd713e92533fc088351822012ce01d72428de3f57def66a9962f442da763755057d81e0529992edd8af98e00ded5bcc20962b00077fb74935759945967a6ecd256d1f37c04f3d048d6a5b54f8c3d3a9e81b61e093af8c090eb5b4b23dd30410789a67596bc737443e02c77ff9590bc8f54cac2ed9cd75ae0419e1c6810090e90cfbb916011b659d4798e28babc95301698448c91239da76fb5cdc9fcf642de5c1f7e1490b59da509da5709813be01a824e41b1244e39c226c3082c02d1011a77d742a56efab42e3c92be43700fdee58acc4a5b310a683a8358175aad5a9f6572096bc325a87556794b26e2243bf4cdde25f672a63315cb00aeac630a5ed95613192f0d8c2f191c2c8f45dda125a87698082be0e80a34e3b441b4b432a7ba2825a7c60c3f5fba70e06ec7f77393ca7741f05405981be034fabb45a91f1fca438cf90480e6a3e805d0e00fa0df3d5d9be5af1addeb5627618f54ef40cf1515db9b080a90a849b8bf17e61be4e658a9e638aa2539c411d17b7f359e24cb64a174db140fb7abbaf61133fa546d91a6ec7fefbe203b89c2b9a91794c72a9cf3e41d46854a20588a912e0759d70899622751a9077121bbb198582254d65b0b1269f9f8353fd0b875141119510c884a564694a7eece1c182743ac93cd805a71fcd12ba79fa29ce7913012737ac0748e303aed7a494e00b7deaa328bec5e569799aa1f31e78b2c01018d0ea7f9423c68c35d5448f07a38e2e238d3eaecd65e106efee9c9cc2c6ec4a50e10de329e72abb8029c8476bcd37eb77f75af671f0fdeca9e04fa9aeac2572b74dd8c260da2ff2df38177f92aa7f035bb7050205aa46848b6c375e49a47c4c7d3c01acbf3c6dc8da47d481ac4a1ba3da916344650b12d7f6fa345a4864a236bf2517e415df91945e686257d4cd0bab535826050c368255cba7a1e49591404905427719259219a194f042293d9d453ee1617a9067ea1511381aedb745b4648e4d6838da072cbb6b327ecf781eee3973f771a23823d5802d215319a69f94d679a198d769f4ed3cec544b395a887e9f0cbe764ea4ed90c9035d90cc3063c1bbc516e0a84ede17ec019d627b1299322e57aa03747503fdd421401217f84cb3b0fb8b57a5d8feb4db487fed349be9479bba78598039dc2c957371bd7c2dd57df2ca127b66378707ee5df674a3ee77a4d10e4e8e18f454cb3c08a5f8c5cc69744b905a8313f76bca20cdb699ab1ce5b3e1c2f04099768ebb31d6d7e5d8f681834d9d3e451a10fc490983bb5d65a672675824ba9d395119550048505fcc816e622c18e21fce3669f0254e476c40b3a51d19b17621e37e4bb453075f8b8ef65a84224e176736cb0e8e167ebfa41094a3dde6db3ab381446807d8172854a174b21df08fc9cebe4ce23f2c235468be65d34a2845d0272c9912415f5bb2510a7d6049541ac15d95469dd7d7e05d6ac54a3e3ae20a6e1c3fc21ab15da06f70ac5ef376dc9f83138b510ebeb48596114ac53f4de18010ebc5164dc955d04c4dffbf38245c03a36bb5cd2cd767a012d580295845afc33d23564a2e9b0b00258823f1c54eede951fac2439630ce55877bed20f49d7f24bc4f47e6dc686087896dfe25b4a7c6c7867cac0e980d280982a35c80130803a7a3a129be7be7c352e1e219f00beafd380e8d8c6522e229118144905c89921cc68b3bd449c490fdfd4a27ad9719d832cc2b43aa50c4341fbc8211e981eb672fcae49ba996fc854f550d4218dec37a871faa92a88b40d1098f3e945ad52262e6e41031a348fcfb70985b89dc7c21d8adbc9ddc2934048acee860891149a7293660907cb068a81446a3ce7524648d02dc7b2b284dd38969c0c8fd00da18612c80967fbed036ad0c293774288944fd4cc4c89ca4d803966bfc5d9968d7dbba9ac09bdfd0c9132cf10040f054d07afc01e8e2d302f7a9f72f83f07983ad475411356c8a78f4be33002d2db502d483d35535f498666eda7c2f2c3d1e07edef22c147ddbef40fe53be13231f4b5644046ca07cd7a8f9334e84b83a98054128b6d7d772004d36d95c02c3192a93351915ae1e1a46947dd3fb1747fecc692d6d029b45dd70c79fc408260a38bdf86c63f643fd8afb7e616356bdb33504e0bc2540a91bc2f7be896f81b08d303dcd9b8e5068f85650ce97aa55cb51080f88f52846a68bcb7da8d31d61a40ad776b403a8b84c7ff28ff231835224382a1b994522324e129e5847ae2a246402290f9f4814e7625a93c4743c33c723334b0e0d64e8a422cd37b093135b058b61028dc7f85b36d1ec6505ca98a666e08b6f44e6c55814f35a6aa70d11b305456e2e6dddd102a263e33da3391503f44851f32838080adc5987b133a6b9022c39ae82255443e4dde106a425c751682faf2689e184f41e60941b4322aaae82714ac459be8f2e01674c051d7be97246b42856b829f6b82ea9d9e30c760774de9324b4b1f62a9962ffba631766f37010220da45e8f1b752f068e96fca92695243f0a61fd60e7cb116e68c94eed561ee7e6e58286b82c0fb890acf1ab4104806e85122524d5812921ebe7d1919e78fa9bebf0965968c9f6a8a45303d3ecd4abc5bf42f803f11e99c44eabf0cd0906c7ad716c1fd3c1c8ee9b25662348f72aa90b7b40ca50546c343860c211e24d1ad168a6321b8ea51f0456e1cbd2df5ef96fd67250f42e90c8c113255223d3d98529850f6869eda224851aec4aa52b9dc7274d56c8129a23ad793e371d02baa8d17b9b20a0274b245ab1c543755138ca5d55e515a1179fa671095f3fd0fa01878728c19996ffbb1d42e2bcaed4c3fa900a70c191fb608e7c024b1d7e2add304be122f178735445ad6d365475def9565b830007ce222867a0a689fe6d60dceb1e1695405f53bfac5d8a66719f6edd16937da24a262ad11ebbc60eda99d25dccd4f00199503083744889fb97bc89e5697a6e69179a4fd1ea05f20337c80cbae323cc4a6147e42aef5333a94822bf05af8170167d0d6a0ad51e9a38e032db5fb99cbd2facdc0328c41c1cb7b09d1b681f700670c66042ef57500dad9b4445087d985eb5712a8337678562f4aa43014013cd92fd5edd970672424e9bbddda0c1727322b1e1219fd435f790c9557f64b18420a18f2a3c4e7a4e2776e04b9a4eeb722705180585037e103e787e411c80055cdfe803d1ad45ab82c7a0af058089e169c59860fd924cb6898d6d06e218d59dfed45d74182e4311f19e4960fe2b38aac4af8b098dd4f461cc7a81fc288d306ef45a34b3d0f1b51d24ff69125c16f0636c8685c7bccf69e9b639d64cc895fe35ef5e6c80b5b1f7ff5c04638827173d98c5cd490c91be81a62e6d63c96873e782af9e352652140a08b230d0d9c40a164e2246df35c60f2825185fb2d09739f22990f414309d7da873262adb8a612bd5325db2de491443c9548a7a8b6f7739f746bcedeb5dbc42fefb28c37518cbfaf4fa1802c0aef9cbb31e2061f46f978e9c1f7ac698a25aef32fc9a078c2602884786cc57042104eec522512fb76cb7175132388dd63582c41223c73d77e23f4545bbb2fab4998cd28d72cb257e26238317c1c6e9b973a270a3f0419fe7ba13ee818b0183d327d581871245ef46ab0f831bc6a025c4f030b1c5a6511311af5e2e8acbab08d5e95762bab48d745e89c029302fcde890cfa62d82dc44a1ac83d529ddbde98661933d1973a872dcdb932b69b76f71303d65e01dc87a0fbec01a1e2d5b8975db124557c2d3de0b0cbb8016b94c822a6ce4c83039a97b6845a201a56a503f1e77f1755a5233f855af91770e52e3e1523b378af4894fc913c32c5decfa0445f71cd07930aae78186760700ee0108539804c0535a5857a87d4ca7f52f9a2b6857bb1a7642346d9109164efbdf7965b4a29534a013e085f085408a18fdb6d4f73bdef5c71a6bf566b535115859531c6187aa1bca1fc093b10fb8d0803b7d73664c5c6cf5e73fd6caf8dc857fd36543db0db6b1bf29b1abf7df26ede9f3cef31eff4988b274396fa1aeb6fa93829f69ae779de0d377a9d165d7baa7d4edc5ebefb42eed61c4f55309efee5cbaaf8aabfc6d7c3c4bab8801da0b9281087d3b7fc297b8c461bec3dcf8b511e69f97410d9f8a73fe1382bccaa9cdefee9fb251267452caba2a414664e2c111bca9f50c8bc99146785999151bcd15c3ed36f74bb4f45b0d9ff744ecc94a43497e63334a138893729305b02664e6e3fcbb79dbe0dcab7196d479de9524a37aefb52d763ccde33d0fb18638c310b32e4d68f9f0c9dd52f5b9209654d7cd5efa93c2f7bf9e33737ce6a16173549ba9c0c924da413f99244b7dfcb42cd65c559558bdb31c6dfd1376aae78b30d75b8bd7c4ce0f6f2810d355795a4ed75fb3597e60364bbf2473b72b59faba364c36cc9edeea66454bad3a4d6c5eee273df6c89b3849cc58139602fa4664dfaab210721b6068aecd378e017fa6bf7704d3f6dcd0891dbda12fb37d45c3248fec8239ceb32b1b1cc0dea677523a7c80647682ee35c66a2e8ac100626c538bf6229995e962fbf1b777e5c4404cac5322ccbb8a7b1d971232b88828acc10ad084bb4b897f4a34fbe33f68ac9fc5e80affa758c008910103948b203252808c11241449cb022073368a2d5dfc38603d8c0863a742c0067e3c1062838af1a7286288eb324d8e3004d5e6645e32c7f9b9c244b3f070936fb52305a19f19f15a6b828063eb7df870e999a45f6cdcf3ea9812a1ef166bf23deec53ceb2801299f2d55683cb453e48d7570d2555c4e4c9ed97d1e1a36977f49319fd1d7e69035235388bf2c0a85c0ad61041660500a05b874839c395355c399f26d1c04544f0d5995fb11788b222b8e817802bbf00dcf9f14b498abb7d7125b8a2c2e2c006bfe125cf8c8d657480377ce5af830c1b46a21b9188714071968daf9c866b4ed7df06c631afff05fa06c6a19281defe7ebffe1ae000e3882fbfc68fe64359250ec48e919bc912a41b3dd79dabb095c87dc3592143d11189aeb354a90be32b9c1b3770a0870daa7f1b381a61481bcb84ddcfe519746710e3f0cb2dbcccf36f52cace61b4046806712cdb6790b3425f127256d8535c274aaacacd250c841b72379c4f2e7ff51313760a996193be24ec8ab31cc4a6388baf3f0bc9570ce50b820949aabc5a2d3c4fcb7e61dfede7112c29c7377db0a4e84ddac8c85973f60ca262b326dccf20efa91f6a58920b446c04dd07f41b5b587f9f72fac20974f9ed17ce9fcbcf7d39c86bfa7290974a0eb28fdae80050d846e233fcfe61b5a90e0c5da9916c6518411214f9590a283b08b5607c68c93c4f2be7c80db291399e6362f879e33038728e4053543d7c0cb151ec66bd240c5c977f8a91cbcf21d63ca3749fa2a4e42c950d17a8438ce453300e24ec0d71863f0152b02aff1ccfd35239a8aa008e8fe17de07c0e7087893fce3be803c7c7f031803b389ea795f3031bc3e7f89097b0a58851611c3172f5b9fc13d69f7be4729832f2151f5d769fd1dddd9d97a20e2b0ee440f146abd5da54ea81a2866463a321e16c46b886ff53f968616748f3c009466831f90fc0b7f03c2d994fe543e657bf027700f032cfd3fa8cb07df9bbf6ea65f5f1679ec60be05dfe66008ffa7843f3ac96e7af48fca6c6592ccf5f83e28d0bcf5f859c757afedac46f5e78fefaa4bee28dcdf357226741f11b189ebf1e55a4784380e7af49758adf14e0f9abd28de7af569c75c56f0cf0fc590febf9b39fcc88dfdc3c7f86c459f53f16c08f05163e185714aac1f62a6a20340962c9228aa16601fc180835785dd9c5f7812a1e7dbfdfd1f773fdf7fffd0786ffff6048c3e5799ee7b2b8727c188e0f8be1c3f9dc155700c31a038696a8aac0d0da20aa916aa21730b4b934bef9c4572efca86f1ef98abfe59b4953c957fca76f5aa13df48722a1dc479bd097aff8b58f42f1157ff651a48f4ef115ffcd47a5f80c3feba3467186df001f1df219fe1b1f751267f80bf0d1253ec34f808f02c5197e183e6ac467f86d3eea1367f85ff8e6159fe177e19b4b7186bfe69b537c869fe69b4871867f00df84e233fc02f8e62bcef0cf7cb389cff0afbe19146738beaa1a7156a8215d7ec692fca600425494fca667be9a5c7eac8ab3acf84d4f67d444d2e5afaedac3362e7f2de22c2e6a02c9e5af3fce3ae2598d1a92b3420772209f229a147e2d499be22c49c6e5d7a8384bc959d5a87da45c5af215ff019c589e1b3927ca8418d165a4cbdf585200be1d162a8450e4d51a42236887560b0f806fa79b416ba787d962a2ea1f229b68b5003251353883e6125f6140975f379c412d7c1b14965e2deea40b497a0ac611e42c55ffdc36f28d04a893f8732f71561397f9b8d5af1a28e23785be193497f88adf8521981f5b8a98958825f16354ba9fcb2c0c49f1c8f8008c100518447fb79e9204c5a2acf315602c5169d58f23426beb6e87e462c738935cde431125f738fbc71521ce0a717680607143ae4e9f9121e6a1604346fa2a2f86ed598006340d04b86103baa3a1000de88f4b48c18f4fab7e2a245af4c3a16db8c67fbe0ac3e8b7cb6ff88b2597cbb5839159c4034e93eb7de47a27b9de412d84d189e3ac909568ae53813354745d48628432a4a04284255cb9e2847703264562e0ba82074a7e384b95e2eb4afd1c71f9708edb308e397f827f65be46c9fefde923edf26f1f50c5a31f7ca10aebc9404a3b9df3556cf7e973322dc2ddddddddb338536f2536e9f42853736a72cae83e3b18946d1560504f6c1be7ee1387153dba4b32b68e2edc081351747ab6bbd1822ec0a05c98fc61777d6274caa96d33ab98b66d5a56312029e737e58c4e85c0af8c620f03030313314ab34e677e8675614b73db8903e52a36ba54f0b2e2c85adf62ae5bf96715bfb19957808e50246a74ab283db9feb489d39e2b549c059344a110e960e8ba8a065123d79ffe34418b5c7f8f4691c8a5ebba7c85d289b42297a6d00c9a5466d28472fde750388b241df94b24539644d75c9282a4c43cba369ccc24d77f020571a791eb3f7d9c959a2ea94445c9095e3e94528c9c4583e8babf14dac1a9c723d2d00bca75fb11e8fac722d73ffa2471fd4a1243e894f86143d2834bec8111246103a98007bd84a8a11c1d317981fac175d7c2dd1d09e66d743a30d25ed5d7e87454525e8eccb2f1a94ec786b4358eaeacf182256e8d1a2f90c1ad91c5adf12f9d4e8d4f3d8d4e27255f9838e2bebc4ba7f342e3519d0e0d1729d7e55b3a1d1714ea593a1d94056f4b12275858de763a2c568a7b7a3eaaf1daf73a1d6be2c28485c9d4c23599deb6c0886bfa540b96704dff2e80e29a9ec3b82b7eddd8fe3886f5a278de013c1d37bc71bd6725d78be17a5ed10a92aeb7840dae0724c4f580acb8dedbb06005d77baed3f17034ee198bcbbdd6e97075ab3057abb99af696e86a9f5201d0d5902871b58f91f5ab12546e55e2885b6dcca54a49ec40ba2e4cc380d13836296963b383146c787c61c1854bd7e9c4d6a484e122092257be4d82082484ae7c9c259a43e5b8218c0ccd0d1424418514f4a440084790b8fe3647c4b8fe1b0e1131526e084374431a23c008c2f5af44d78d20a1e8881ea06089eb361c17450b21a4e464e5e4175d705ef01607b8210fbd7e7470fd53442871fd9f882ad77f65e3e2a222bc28324268882938510e223051c40727583031458aed14521c599b2d6cf83f041200b094bb7fcaa344f9e2baff0c35b8bbbbb7445d59802be5db21622044195702c15c08e12344124f2940091bca97095141b0e03a16412cdd940672700431b8a84190107cd00a2d94288040c50c9880b2c3125abef2216960c4dd5d071936b49671f82d0aa20813c74db1c3949cac5cdf282a9a3b80eb406071fd5349aeff1715d9011049246783aa52e4b344861219421a8e18aedbafcadf7d27468bd6ce10ea6a997e080c2d26dcf78e6402d21346ad21a71f7a5aa68f490ca37b2f84de49dfbf21afeb3caeebcf59b9de7326ee6f802c2dcdbb4997326eb1d43e4964f4144caa3f108473fc00e2f255cc8d20901d1d7c35e39c520a217f62e453b2421b1b966c9ca57a191f5818fd0fff96f277f895dcc9d039f40a08e38081b9425e871d6771df427c65a57f64ffe0954448e8cad0edee7e45203a2809897243aebbbb63ec64e8746c7777ff308e13e34082713810e348a27dc76ee2cd02ce51035117b9e0f6ff601c1caff709e9f8caed165f26e2161701f1553f0280b061ff2cf98d7442df3412a0b689373d620d9de347bfd0df2986d2af1e6aa23ee22b23cd5dfc4ef2a3733411fc427fff93db8f8161aac9048de09aee96615e071b0ad7747ffbf403d1e1c5b0f2a7c6d2c637dc53eccbb46d8678c381118c6005999929c81cda09e6f04c7f10204088a49cc16fec528f0b70400827b1122ff595f8f287166d2c63c32e83cd0db273fd77ac6e101d263739bff17e5c2ed70e4f83135d2875e3eb8c27aed70d1d379ef1e4c6761ed85c62c5f1c0a2605e66157f624186b4135fc9168af5f9c1f87a79bbc7167e94a291c78e4a48314955b9787474c338a57677c757bc69577c5df99f112f57bc212232324242ea577f446cd7b813ecc135f2a351bc81003b18c6215c1991aebc911172b95c49ce925772d10d964829a59c614af6c82e641bb96dd448fd6a2229650f29a591115292a3a2a3a42dacf28ad279e504996b686f98f36a3e1d01c5c0e69a49758861a3e4308e46c606162685695e96da4c1e011cd07d2c9c0de799f9da67593ac0726373cd6c7d41d8d8cfa1acd52186e5b6c964a374be874e29a534c810e9dd43dabd08efaf71ede55fc165437ba75049228a3d37b4b755edaf6cacf51bd0282563a383caf5efb9fe30d757d76fe0bc66ec7156c8a958d621bbb2a99f31baf9e564fef8ddddddcd3857825be48e2c29ed2080b528b88a33be8a33fe71462855832233db54cd296d92bbfb0c86aebbbbbbfb94d15a9c5f3561639990e3b2aae5c05a1d33331bf588566efd809e7052b3ea1352a12be4ac9e5a8ddcfe3172e40616cce695ac97943de28db7e6bb5088ddf8f125e3e8627cd4e41cd8472bae7813932a15bb14ad00dd0ed948e836f631e9b6a4e09347f00b328904f215d7f47b5a8faf7c8af8ea07d34ec035fdda0efc42076aae2b4ff4dc1460df2f8fe01c18e3e8a8cb592afb7db33a91e20df58933f3c85934bea795a449e5f64cb29f45f9aa2d56ab4df5572a749bc5c9135fb5f71c8d9c17a43327d96bc857edc518b7edab4834d736543728d605f60486cdac80a0de8ea31c0d532ecd88f6f36d443436a338d3bff454526f63fcc186d9d0edcf96943e22fe9dd62d74911889d995272cf61bc6759f099341c9c6e72ba7fc1cb172253617d5a0ca8d496e7f9d65595479dd8ec8830de50fc8813860a02a7befb1a7a02a03793492cb75b3a226456e7cef93485a1a91477cf505615d3db1879f32acf7dc7b2008fa8634abd2d3bdf859d6d12ccbb22ceb1ef3ba2f1452c557d915ba59c9ae30107e6493183397b33adcacfc382bdcaedcee71566b2ecdc8edcfb22cbbe22c150f1ce2d3cd8ab3e2ab68f82881d4d700774a40e4039f568d1adf8e8bd10c9604b57654c8429e9ba59e497c158ff9d9cfcfe2973df679affa9864df7d34c88b65f1b38883e7bd0d12b0f1309d8fd4ab9ebb0ad87898dfa9f12aec73629c355400550ff3ed7455b47686c8265a2a90c9fc1e668b89fcd4978a63d83095bd7c955d7116d5d168f716e5d1c7bc20bd0d6d449acb57bd81db4b870a1be4ac707b4949e2ac304bc2348c3e76310da3b4f3ba0886345d06ae9cd8303e8679e00f9adb6d589681a1f7e10f9a4b1fdbbacfb22ceb3e217d3bc0483637f204ddac0334b703431f370371f0befb1886c435fe4e9e3439f2b354e5c70c3432ee225ac970bce22befb9fe6599a6454dd3346ff64cad7e4d0443dab12d647c15636a065bce10510ed73057798a0d4c84c3358c6174ca8ca377a6b5fab3eea883cd654bc9d40b79825a76778cad84ca490c7035cada303bfaa62aad337ad75ad976164d69a72ea554be4b4abb8bf44f944f67f4d902efd857b23a18fe90717777a712c3b08861de30128bcac9182b27696c565cc3cc546218d73065c2b55360e3644c5d69a53f8d2b20be72b62225a5bf514a299592c69650b883bd8028d8f650ca60db3cc69629ce7afff41839d59376196b1aa6b596c5c6bec1f00dfbe61efb55594aa9c3149b92a337c5fcc80a2ecbad7cc534753a779cc0d63a9225bb37096e8332bd64eb768f51ca392926847b609fd6c3e6068db66d1cd77d1e0d7b2693b5a7130b4b4b0bca85512d3468d06039599347a3a3c16d1a0d1a3468d0a0e1bd8217f25c6c88cddddbddddddbddd5dc99327bd83ede7a21e0c5d7ef636be2c137b28d9a51b04bb2060e938cfd471de2e87412a1523834f38810a0ca4b08326bc788288d203932b45486942119a0b1ebc954a092944456105a90807464f82ae73a8a8c44f195c7fbe7c3a626b68200c841bf2d8dc30105a31c638c154ab5cd0010f1146d840064f3c21f484245a0270a2821614210b25508868c5b7898f13bfbf9833830d4e44c246c311292bd7f8cfd9fd7a02e597209197e5e5d7112a9a073b2fbf8e0cdd5e6d3d98d87e8ef92646e60f0492067bf963e490cfb8518a7e60c4c5ee6006594a17592ed201941ba6b84f712e1685f22366e493ad79b07eb9e80914b79f3d90c68dfc7c644b7efc7cd8968cafa241bb110c62ba4a649c7179177f73021bb287edea1e604120af0439320c9f7371631de4382a2b9575522aa394d22ec9176c5734018a14188d4d0dce6af099f808a8c2fa87cf835f1f087278a15f48eaa27e5c9f2fa4de13d7f4b3841db8fe11043ee39d1eb8fe51ce1067e2a752e10360b8f367a895fbbb59b7f428683d70ba130ce97726e5e7724f1ce2707d9eaefc420f844036c95da357a95f1076e396964f1eb9941b7fc3381dd9c457119bd8e4b06eadbb7bca204de4abd790afa2d3e0f21544826e3b8bafe8c1c8955df050c4b7b85bd765339b997581ad95527ac311c0bc7204b4645f23f5f2aca4e5b1ef79ae7cc59b160b2859c2ca9470b397427126f6f0807a159e87978771f9159e87d4c77c0f0f34dec6f350e3559fe3312ccfd35a61856f791f2b7ccbcf6f8979167087e5637ea7e557789e96cac6b7bc0fd5b3bc8d6f79984f35ff9fa7a5c2a7c2c3cc870177984cd007cc3fb8a39a9f8a33f1795a30bfa39a600e3efe3ffb1fb8b3f3fdf73c2d159ea745812eb8c5f2618a05e4560b98136d7c3cfdc98f27e6e3960aaa8fa7c55d064a27be8a4238b014bc72e357d0abf82ac6f73a5ff255fc8f814d3a7296f64fc19086e3c758f273cbf4f386db0fde0cf43e279ebe9590796de4736ffac21f20587dd5bd04193c49b12177e9763bee7b6c75e42ba308448cd2c867e2d79b74e36fa72258f9a12fad2e4eadccd208c9593ee44f3ce38f6fe64f401f22f2553cf25544f255f4544fecd2a5f1353ef5f1e34fbc79799768e3735c7e7fa6eb52b01bc9b0215b39eab8a2f98173f9a7cb196a90fd71e64f7c35e4abf82c1d8e79312267b57c7c87e2372c1fdf9f506765a092968f6fe3cbe9a5d4d72f5f27c5997e1a9fcbd7545e3566b0d21262c045142a18030560e800350102a98820caf8c10d9b96af5ddfced73e3e135d5862df0a8e0e5fc5f8d1153ffac4f7a5f86ec5f2989c8524aafeee795aaa06abaa77540df6e8e19ea7c537ee34e2b239f14a7ac30724cec8f8e33d131f1db6813eb6f7c09d0dc401651756ce1067240f32acaa9f2ff63b4c7c6c339a7c5506f6e8e138538738e38c1607ee8040e24c0d43586ef19416b7787e30025112111640dcaa81423e10f93a60d2852180c8d741fe0df23910c9d000077ab0dd403f847de9a557c523ceab5deddac0e05cc31f2f0b7793d15df609b6ed003188eedd2eeb27a58c31a66e8ccc2a1d5416b886dfc643771abd4241299da8e64955734e965f8e8ca02ac618670ed7b89c324e49f9e671b22fc77e9c12ab5db77feeb72f27fb727272fa552d5162298ccefa548239180f792398d38c83b3ee5ca0ea111f86b06fc8ee2da58c37ee94ad8993a0254880da484ffbe870e5c7d20d537c20cd00855f36376456a98d79081e25ad523236e59471fbd91a036b4d9a001fbca0d8c733f2bd4fc270e5034e5c8d2f03377ecfc8d73e79f2c04962555a1d6360b50a65cec270582b318e9408bae215f483a2a0278470aeb206e1c867588acff09d2108537c866f68eb0c8a825ee083a023a92a991e71020208243c241f6b4617c5657a02109c1654bc29426c40dd1642685bbcb8170a322e5c5b1329a84740da0f490c81694194fd40c408bac54f15c3c84472827d81027964447d281aa28b233ed8008928484928310317463eb8928812e480a09fd4136814db72f90a238888c208204c4d58152e5f514418d80daceaf2154568c1832286682e5f0144181c6af36f5e6c93de2c2506c66fde206d52b1c03858e09a7e8e946eb1dfb9660eb912ac5cd3fef99591a937a7bcacb4d24a2badb4ca9777337593e6c7e8c9fee0a1db447c4004fa4bae10fdea9b3a9d29849ace38e30ca1202440493c1d279fa1162431728f743847faa7a77dba0877a305a9a808456ef7e870a55d9b8d8b13519c68970e3f96aa68342f2da812832a3f6e984225fbb1a272830f24295506c689138c20e5d28772b16934838e210a2343451149e68d3b7fa40410c5892836322b1af903550024a0202185d139a94dc019679c51314a29057f70519c88e244cff7ca679c71c619777e7cfde3c1fa94b4b18c4dfc554cc56a6badab7853fbebeeeeeed621a3153b9d1e6d85283e1191911112525252fc8804de893bb1b0d8cfde9eacb5d65eb9e10b36a65ee1082432c4144f66cd8dff2db04c0423cb0d6c8c0b0085109a2e0686fc032178b044a450ba210f41ca383f185f7da88d3998d5ea3f95923f6c2e865db118c617958a80b7b8e70e02dde2c08f334736e46e6a8b33228027a026af33994c26a634d57de8f2a6706853d8ea79a6af9ff77dd9a7e28d0d48bdd57e6202b5acb910c2e2d2298062976591abcef20c87fa5903ea67cfdd5393d775b7a7936d7d4d9f7d3af5bd6f077f34b57dfd62aa3061187632795df644da1053d66ea786825fa0cf7d8d035ed1ef233165ada99d5861fb3b2c0b28846effe9e35bc3b81af7a6af2f0efd5a37ed3b7d3b893736f00cfd5a2dd28671b4629f71f7800dec303086c86261bc2e9f5ca6164443b76a41a4830af6cb5732f86d27fdc47e7fd84e345ab95aebf61bcae47596cbdef32a8aab18cb6d73a9bd834bdfc6acebfc669f659935799dd5baae03996b34d07626af63e1b62a946ed8916b167c08b90f07735c03eec0b92ee3b0219242e79c734e1a63a435c6186394314e3a8798327ae6c419f68954c1a654c1a664f18394c54fd1c5ac40f229180e85320385fd10ef29417d8ef7e460fca68749cbf7f02d262c95dfa25a3e25a867f99478b77d7f3156d049b96dcb718a75d7526b1653c5b73d773998beebbaafb66cd8e953e2f2d5c5a236cc095233719ef7396ed2d16470d998a3ade35e3ea5db1773d49df62ddff62c1cf8821ee39afaf46d5f3f31a256c3d0bc6fcb40c9c3b6615f73936bb28f2fc7d77302a6c4e53fc737bfb1e39e3bc9814cb8f4d594a05efbea133ef6994de3bc260c5dbe99f76db5c7e338cf0a29375cc1731a53b0b134321c5706e7364f6c4e27938c9cc9f4398e7d31566cdd59f04d5a3d9db24ec7f461ef9de9abb08f61d8c9eb38fbf1c699be9823aeb3ddaad3b1e0fb8abee9937182edc73a13184364b1ef03a30949973b1dcbb96029188feb3afb58156650b9db630c30c308bce2cbbcc23670e52b2a835fef39ef543b1d6cabdc6f1e675b4e5ec765590b4b96711cd7751cc7b170a7ced6acd3c1b6ba612c9c8c971343eeda8f4d9ce94d2693f53acef4d99b6c4b8be94d26d3f7a74c29ce04a5c80d5fb0f1da46105290c1b8e78ef33c93e7b1f6dbc641b25a6b9d917d1564fb1d7cb12ccbb21cbaaf5fe5beac8abb9d2a1773c45bf65996615ba66926afe3b28f6f57511be792bd4c977d1f184b53b85bc7b9f72edad73a19a88028aced6490dd8e1a57fb0d65b32ccb32d7be2fd6f1a871356fdbb68cb5d6b46e190f45bf253bc2f68736190bd745298274b7c7be3b1d0a7861e3e528458e2eb681385c773bb4cfbe3a4b039bbb2867315f16b65bf780ec3517ee85d3b0e73eeceb677d51a76f397d0fdfb2bf35d7b13c0b68136728fdd3a7c367e85b1ebaf4412376455375aac65571e5868c455f231a6070350a18cb280465e62d7aa68ef33c93e739cdb26c7a5763aaa8314719f62d6d1f57bffa83c53e94973218436469f604d7e41afa9bacdf12cdb4ecb32fc68aad5e1106958b7da00f36445dfaa84b5fe3b84aa474c3159a316cfb42cfebb8e6eabe6915a3dd10a060e5cb2138660adb5328dd7005bbe960524e1d8c8bb1020145d8bea96ef96ddde1cc2a9d5162da469ff6a51e63ab66ec1da965aa1a63cf3927d6145cd28efac470f11dd817be1189978fc448ba31baf4a48017965e3e12a38a2b7f7610f02106d29c11f0218611cf30ede88523b8118499d3376f89cd85f531c1f6e523268c2e05bcb0d8e52326a6b8d89d208cb352bee241041b59a708ca391dc3689078390c9bf3a38c11e3b155aeeac86e8e3e064efa746afd7db58ec7cb6d300cc1b66dd2e39a71b0773a926bda0c2ec61a2386450cfbe86f9182a0f7d65d12b6c992f94a4e5e1a33cebd56cedfadafbad99979be8c326a5dc7a3c6ad601882fb80e9dd8e9e22ddc9e0f2c32e5f71822b7775f90a138c7137eddd43fefaeeec72e732977dfc541ccda673fde8d72fdeee7670193708d741bfdad7777b94b338e6206c940bd21bcb4e062ea3d62f62d659d62d13eb731594b57ecc359e6d9d83313db0fc1b97824969dac71715f6757fce572c51180e0ea2381e47b0533e81763a8e753a7eb2dd0ef9f3a9d3a691cefa1b570c9b5877b7e08521f0c762882ca394e04191d795d7cb9f4bbd90dcf8302996cf161f07e70ad20d39999249574a299feb2ff8e3e1850de57b648ec1f287f2f6adcf3a1b5f9631983d137f31318c524c62a818a34cc293255588179111d2f3ccca06270b97cfcf114e020a12fa2e36e6f921cc0de598e3631fd1fcfc6bf7185f3edb70ef303697d269689f52c8f4789d439e16d4eadd3db894d2a806aea1b15971b632e7853b1106eeee1d6394724e1486b2be42655c56b16da37393d1b7ded8f48454b77b9c1eb09ce564f3dc40b77777777777ecee6e54cad686d9d117e5ab1b0eb90d528952ba7b6cf724b6cdbd31be89c0c6cc298f314a0ea5432dc5b0aff6e7c357ccdbb6755ded3caf4da6cf9e4e2716aea50525dbc5c5856b1a9d8ebbbb6b40e9babcbcbca05e5a5e5e5e5e585e4ed6e475dccbcba6bd64157b7979a1f345c6176f00d42a16c57944a5ac508cab35cb7a685aa7c3715cc7793ad69a4ea793773a9d4ea729a39f9a6bd022bd8028d8f8dd2d04d5a88e1c8de0aa579f714e9f5d85d8304ba1158d8ccc8a46862d8aa3184631cc562d7a67436c9bc7185b2e8041eed9d30b792ed032ca29039b55e524573927a52bb82cd7aa5339c3688d2c60c932301ea7cf397b72e685256862b3ee517e1387d28e8776a20ca026a8444d1765410a159a110800000005f314002020100c87c462b1582c0e2451770f14800c7c9644764e9ec9a35912e4300a21620c2084184000016300466868e20008d1fa5ed27a2b8fc638d2ffbb97ae90893ed302ad3759b90b10ad5797f82aedc1c166356a6725cfe703151313d3f87ddc38e3d4e22fafb76fff40780e4bf73bb886f6d83cd046caf76aa29f109ef4e6d6eea6ec0d344015cd9b9802e6c227cc59ba26d86d846a06dbad13b728bf2975d1ed48956cc9a4d5e54ff747bff643b9014e9c1c44da6a2003dba449b7c070f7bfc90f63222cfa2f9573349119d69d116d38a037ffbfb9ad72aaef85ef11ebabbdd803b526ac2a41fd3ede6cbc1309301b18b349095252534adeba47c71b3d62d46240175e81997c78b8cd6ac09424493ab24e878b230702b30971b9e5b580a7fd1563278ce4afb349efadab9363c8cb5be8fd12146213da09ba66fb786b0da2249f9397ac485f0a0454bb6f367fe40a90b66ee7bb8cae4a99a931244e8a24b365640ae6cec325579d0f762bf38b554d36ee9a659648d7262c07d47a74f951d89e3701005090dbc8afe3274ff7c79f761218486d1eb3d9ce2cebee387edce15ea982eecee610113603bbe302ca830419d8b65a2cc81860dd73c0a59acb5130cdef26fc9701b4ea16233c6f44b995ca7929c08e700c3f371cbf76cb5685b636dccdcd3b050b4a11e7239b7cdb11d1140a86695c2db26fa478a91bb6813949350e145cf58373e6afff9a413801ac73d1df4d58f201107276d8eb9a893918865bb11a2ae8a6325ee25a1473bf86189c69d00861202c480b448f0fc728b9ec6a29ddcbb817347fb0b2d7c9b2dc0865708cb90ab16faf7029c91339960c12440500e56c3719b3ae180e9c9702b6156b317e532c4f64dea74e55e6a0f4dfe21a4de64fd7c5f0fcb89d30c67a23a14375579a44ab3335450aa61e9cb7aed2e456f403ad93e18749cef53f2c6681c4262a3d7fac04de1ac31e0c6268dd8e2cd8fdc8df42952b4b7bbdc276eaf33a65348f440b6eb7b66d5a5b68b1aab1212e9f44a88027a2cd516f6cf1835daf6711d89a23c9171f06b685d07217760597cba942ee5318f1ea650ae078b1c860acaa2081e2f75c555c3d2dd36d5f3a9ddb9bf787de7f751446abf441962954ec2d49ad013bb661a495f4dbe300759744ee56440891af60367abc31f591bde836089e4080b4d1a662884f9269062e73ae6090064a85be5e89687680a73330dafc891345f3c0ef85646de8581858acfb9205d13e5787e751d5556199914a4e3beb885a156d273b397eaa42467f8d66578742bf6ca0c71e307c04b2114bf92f3a24f06d2b90c56e3630f5e3dc5839e30c12f1520b895695a493a48549ba09ecb38ae85c7c2c2e9b619f23f4081d128f5b80030fbebe7168c060fb5469a0a94175f85149bc1e06540d3c21ab8840177c06c86d9da65252e2a3fbf90397ddc29d717f8f2402d35496dd2c9cc0954e970e26dd836789c8ae5d8e6858418166375bd35ff412dfc9901e56aeaf0c71d9869b088a55c41528a16c0651d70ffb63520ea98ebfff324a42d6757bf4933cafe964152c64243b23f7dfa4d7eca95c41478a5c8da292c76a56af6d0432bd7c9f9eda015fe299d46a1b3b41e4623ee8130f724c7b6f24ae4f3c2a6e6c84f0b7cb01d54d073ee57862754e0f75f533fefcafe822db010683453c41572882586a37a7d17887f12e0afa7af5e94bd96b54c83f0d19eef8e9e5e239c3889bff0cdd905b1925d081d7c044f8c0c307ba776929e2012850f8a50c91d0210a736ed3101956a699cbfd57817ab158d84250481095d66ccad29bf2845c6c6589586bdb6bb0c864760ea2668f4c02b27bb5147562d6f6ad981376204371536a85a28a9e005cb7c98e0d079d2239a9445c20f220e10f048a15bafd2cca044cd4a76c1844189951a36a35a9ffc287a889f6f1565fa5fc4246f77c1ea10a1b2fc950008e1eb68750235ac76b82030dfc2a8439c68d75cb3f240b22d137b28e9586cd03e01de90d1db5879df7ed58834832af761eadd5409eeff4fdfa5657522238726db637a127ffcce4d36778157955bf5212f3403d73c4423eefba428e142c5eceab3e1de35f4c8f6a3485615a04ce25924d5995f63ea4a3e564f0cf49a6e2a56d4de19976cec68ac451cd685bc50c2db66870747a5104dd190b1896ee22a486c2600f7f0b18d1c9b489dcdd5b987de2477444508b048cf4291f6526ad8e1def12e9861851b5b1ec5eb980f25dd5c74801df0cb54b86d1cf45dc82584c3f03d210c858e040a2cd7d17d47fc161d4f0b7bb6a913f6291d1bf8c1247d2225717108c1ea6f841f93820c94d5743de753c421fbb1e228a57e2a214e896132e2216e48ab881d6b4880963a6ce5a3f82a6b312ef8f7972aac32c411f48e601ad164b021df94a3df5a70b1d82d9b5c932f3db30791ea10729f51ad8fa6c0d834f1c758395183a7fa9ed5d4ffe0cda55647e8ad304e4cb1a7bd231661dd4da68c97b6e106947b9b80a101d13d7465e29997c8dcbdbe9e5d1b619ad7562b523d9facadc349b4cf50165a29326b768b635abfd280c421cb410ffca8b908029f7e92c56b529898058f8c210cfabb6f53b85ae7d8ec49ba6d244ad3c32d94cbd3ee7b4c1f13d198adb2e378b0c0ff4dddd8518e2867484bf05d1267c039b8916782a150843352cc2bd9ac50dd6ae8a2ee314038739049348669f27280140e51d8c0fde26eff54f2fb7c9ebcf0e368792473f94fc33052dc2690870fea17f526cd6ce6973a489efa88a0dcc4bad1bf7bf500c2d922e19c05ad8251d67485f713219d76887e55568d826254a2a3a5e7ec9d094896bce2638c1f9b7b6ed8b445e81ab51c8de447a2ab54ccc9b95bd9820ca8e57d3c89c0a13b56f3f1eaf6324218018fbea6eff082c580036cc99941abcfbd189baaaab5b51364be01b3cb3b28f97a69ddf003603126c81c6f60298eadf97a2ed6d4ebdead6a9b1f4ba521293acd1712e91b7420707efdf3ac5526ad05588607f3abaa457125970cbfc4649a3b2460e5c7a51dddaf85503ae96af7dbcf501a7da871d0736eb513b29d9cf873dd13542c26709255b50b3bd24848a2c217ec980c4201bd985bcd6cc640993f07b74b12c5788fc1e9598e680e16ac74e08ee500b11188574aee1255e171c4523ba39035892eb23b08b0d583c99d30e751354c64fb13ff0de5431d65ad68f68cc8a69bb4e8936e49ce2d5c517a8190f2e15a74e033da2a3eba77b6e8fa74334e44c4fe08fb80d311b0c1d2c965ded21eb1e0bef7c4ad4f714cf759ef7684baf6a44d20eb09d9a8dc6fae4642426479e26ad79abd3164500a668ad2e3cb575f47b30b31fb6bf5c9602f568e5cba3479cc852e0e4a91ee07394b326175a865080cafd30d554c63509f832cef5b80733ecb22c32d0e0c6fd5021f6a1f1a31d2d805d403bd04cf3a0a4a09ba8d786fb73816f8a02d83e7ef36b603a88f129d8ca9892f9926d1918d0bd09d3a714ae8e6576724a51dc82737c679d7d5b670dfa1e6d92eacedf23e4781460acfc28c953a24193399e54c8c8b47c687451f1af64521ef4aa040cce05c718b2aac7d4c0637f84e839dddc731cde7f65ebf5037d182ea4598d59d9caf90f2b5050644d16b8333c8aacf097457055040df425c263025c40a9eeb871dfac1e745eeca95d06bdebaf932b1969c72da32a28cdf8faec25814fe7b28935e3e64b4e21d1c75997c00e4ea6676c5a6e1c3b90a1b2c248273179dc49548af1e84c27353e34c4007894d2679261aa879ab7d2b44906f7dd63cca41280497a07eeb766bc4073b6854f4d5a76c7932e70b39a3c5d5f8ffe0b2a534b2b9bb135a5b57a1673c3d50be11a80710c8cfdc1c9f15f40d92cf6537e41a745583e1429269be0b4ef64fdc090a732de80943cfb7a585459ac0945208e0a87688306ff347a49cdd0266f4b63c0c4ac93b1502407febcfcb333e564869e2c23ea65dc2b02ba5768f02f9157e26f3323acac30c118a0c9aa8d56dfa32694c9b7f9a737848d804ba8cf7289e2302c7485447eb3aa6c98198f95a0f98ee8f76fd2a354be5563950c84d627077887aa03ee1836284b92f1f00c719631e80ef9a2d3b19708816144d673f4d18418e52950f51029e17b6384df088da6a228906a8c99e6f6bf3a5d0c8f8707d78efa73bd1e086d7ddb5a4525f4f9e44d97b67224c455d1a4f3af21797a4a251c628040abc42dfef085deb1ecb319e5bca96396c6f7f56cebb9e8861451b05c2eb9ea4c98c356da3ff924d6c9dc7cc73f8f86b6abf39abe4a506164b0836384987fab00c7f8a13aded2aa3b03feed8c90ab9fc73327d28927d2042b2b57a4d3960b1e06f5dab5ea11a172c556ed1aff91472f76fdef8573293b908119936ee0f4dc7506d7847fd160e3999d0d876215b1701327e7f5b64d7785327fcfc0687415fa7b2d0f9861b048920fc6374dee075c54c9320da0497c9e4d8fecfbae6b81ff63484048e3b5d14e56c241b51896990e69d3e18696c726d1378a8163ebba548ae96211f74fd9756c7ec654ea29969559cd3279392803f78bc5ca5f468e9793f29a4782ec5857154a9141a99c3a8a7295032943857f5261beef51ae5b2ae264d7b3c175b571fdd4b900722173144eb152ae25aafefd0764b786c12a7d883a2bc7338c878473ead28d0d2c014ad9ce84ec0df00b4051aad990a17495fa436d200b7540554a42c43ee0a3bf835583b0248e6005b9c578ea1a9d8a302980626b955f625aacfb0995ea62aca06246552cabbdd20a79f206bbe8986b1c15a00fefeaa66471bfbf3e4c238b063a0c3027bc284c787321cb3f4ff37ff5d4b85d9c977a5524a1c77067f09ed17613baa522c2dfdbc7c44692a96022372302f80ede1c1d9c932ef63c772925d9fada73b2f5121e440f7ff00bf4602a0f1c4bce60d15f30fdfbc13e26d7f5bd8310db4dbd04dfa01e20513c733875e15bedf25f2a1128b37b57c06e0a40ba535d06735dd233afc331e51ecdcd5e975d86eb6878877be8e6041236b9595cf92203e1410e0dfa395857a84cb9ba9815e93bd618e61cfd85519aa947ceecff86a512893be05f5d4027862ea14b155a902e56544a981c96870e531261c1ab6d3f82b3f2b1ab15412c1a1fada9d75ec884eea46b707ae99a31e0d81fd63ce80752b7ca101616a021421d093e0f6145844fb10c57f07ca78266bc734414d74d5b9d3d3a94c56259e2349984e2f60563826131b66562ebe383123739f5b5b7573ddc8e00c484b5a9e64817df2b5dd4bc6603ac0cdefa67d70de99961122895d4ebe38e314e54ea7954907c5643501a8615bc5a13734038c20fdd13b9f3d7b955299c36cd883ecd6fc3073d5bc55f31e180bbd14c327d2af602726890ad0aa41c7fcd2216f45d646c936cd98506b103b68d36cee3b5d325c0a648b2341f047614685f810c8de8aadf5108f793f195692d523bcf7908813450fe295036105ae3a6387804a07293f9fc5c096e1812580d12508813fcbf0395bc249661bc04407e98934bd5c34e65155519fcbc6eebc954aab0d3866291d7dac1f2ed174a76180201896d7cb625916791284115684a8e13b7c953d595bf47bbd584424459bf4da7f71508165c6292750f370d42303b3712c68024c4965958981cda38428c6db083f418ba7b873894b235717cda5693946a078b988d2ac935ea3d0d7e3193b57f9cb3a348b7e957a0f57e0f8fbb33e0f0ce353d8412e6cedcc92908a601183a61ecdc1dd638bd73431548bf7bdc0cec46c501e652119f66136425a0aa85417faf69d22b8ba77fc1516530fc9ca1f50fa4e21af0680c284c3d6c3a3806e77431d75dd8f507bad1f5df12d88062389c4f76e2323f78ce9e5596cbf121b20c0e9500086383c26579a212148489d5347332bdfc2d0ef1729024e6540824305cda365960863b5687fd31050ef8ad36457d88fe5eb3e86e22afa1b8d8e498e0876d783b092af02c71025fa41b11e085e9a2393f8770b560642fc5b7e3cba2641cc47162589057ec6ddf90edd51403983d4b7269f96c63c686e06d72a680b01262b7c32cbc020bbf6623d03424f4ff4ae6212c350b5b8e27a3dc11a86a38fb763b1e263d9d011962177364c8357cc87da9c8c9d9ed1ac3bab14c87909a0eb5a30ccc737e0ee60e2eb00d056ed82efcdf412dbd09c6ee97d05fe10623c414fe81de116c8982df8ee64139bf5567bf74936dfedd3d6cb9b2676baf85422a80c2fcc74918299eb8494e9caf378830199d9205470f9928026af22d158539053a5b1a2056585a6b6913d5cb7991214686bd345aca0e50ae58af58494d0e5c1a8ff472c5521ef733704630bab79c59dc1aad791508ef94261b3a269abdee5711b67bb4637f9812d91346521b300d406746919e39045d9e33aa19bc1042fcf902babc9aecb180be264f61e23c6d2be164310bd3017b740ce38b1e4aac8a1cc97936621541aff8d3769d94d17394997065263bbfa624c0f871fd0077d213d9718898d2697220553023db3432718b502b8ce7f16408ee83ac6c582809dd5f45e61f7848ac82d93e9d7dea0d59dec22a6ca086b751e16e10e095eb8a5383fd5ce639c5899d0e9c950d212f1423d228794b62e0e5d89e963ffacf71c49c0bc2d66281dadc3290ae5ba481a72d61120dae8a562c6f0648fd8906982269da174d0df5f5c14340ec399b29986fcd36a266304db3178815aa82b73d8d0fbe802862c808c33fcfa0c9c032c2b890ce1fbcab379d2e35661df2902e01227346354f56740d1acd1b59ae3fdbb8b92eefbab1ca1daa38c7e646d7b5bfbf6d97d2a7b6934637dbd58a036f3770c03b439fce635168c0facd0322b0270c066d379557d75ddb70e807eacd6d9e2bdd6bf1eeafd49b270025175ed773e0bbb7e4c7e0e23b921170ed646470573b732251bf5ee0b873453f2192352250a4cdcc3b4eff72ce2bff6c4f0289c0e2e928fc1c211a7b92960bf7e65ac975d0cf8c1927c162756e56e21429423984c30413176bf06d24638306450aaf797f0852542465423a23cd8e8f3dd4719de7d35ba408932e8735431462fc99f8dd898548f1f3940cd07fa51c04c72301e7905f51454a11b5a01b9239faa8d3f2e6771a228a5afe5fb6a1a785d8e047935031c8e6650d4b08127d441040443c7f5e8509a76664840a6bb8977a4cbd7401558cad225b9d94f41c2c429d098b4ed8bad1579fbd807d6e8249ac498611c50dfce42a58e053db622e5f0d330bf66f39fa53e233b6f26e603ddedeb5bd2c999ef038af16ae98ea59fdbbe8c7a2f693409f1d45b0932c66da014b31a3b61e86545294aebe0bbf5de740fda3bbba9cd99a1f377913e5846a511c01723214e2b72840b22c69f961ae3b62c0e07228511cd068328fe5ece8d3e933f6a35b2d24f8112808fccfaa34686ce1aa591044849bd2358f01e624f5c75cf6e7b6da3d718e18f5cbd167985442001b75aa2f3456db4b0f1f99d4a36f59be204d81e005186c4beddd84e5771a45bd8e78140c51dab28d429867338b03997562d841e8c319cd71a274609dbd3f30cc8ae9908978f378ed81b9094bf22b1cc5832f29a3d5df94413c40dbc6fbb7d96444aa313d0cfa88f7c24eea8dfe0bcc0c88b14f4836ceaa8cb4c496d85b161dd99a547bc8c35373d899acbdcda6a4230d5ffb937d291fc7ac8f84f199643fd6a980e39ea039309062430f9daaafc4133d0f9ec59bafb25c25e8f82124817ddea5d00258d400738f40fed175cdee02c79de6d1444177b671f7759808dc19989e19dba955ba7c9654143b53be414c4a00b8c8efbb8550b08b8356c4968c692617ba4761d3426c367021e7a25a24d618d9e674d47e83c7b62b8c510f075821a6f0e49825a430e05ff778218a0e28b65c2a900a63d4cfab49a5fe4e12f06e13b53aab8aeca2423c007e52034cfbeaf8d300e1058e814f5265e5884cb545337d110840f24274ca710e837e38dcdd701954d243b38a728a2509e6d63019d6438fea5ef56bae34181d706778cf8fad0ff6fbbf19f24fa8d4be3941275a025ea582b6f89e18a3b856c153113bc94ee955bfde81b097019a6ffd8a52dc28cf3b45f431106b6d7305e0fc69ac9c30194c48074536cb2e08030e5d4d407c9364d904d25716147505340d5e7ee9524ad8c3f4955ac65184fe71bbc8d1f9aa2d2e407273dd8561ccd7547bc000be131a2b8ac2801ea83481e0136d8a7db006951fcc462e7e691707f98eb7410138356d249772c8f482d6603ce0e2d68c6592d613333470a79c3823f9bb908af5ea7acdd99bd43446f6abdda97cc14f496ccadb81593108f868896c9ec6ec852cea45de2b73a06056e6e19012900d25a314844c79385d96530bb36cf1be55a6468accf5781101247b0d2f3d327c5624bbc84af6f625ce7384d8872ef900b90e74a276056c25f7e5dca563cf5c7e164b53a5185a51a8879ffe4d0eb86e1cd3a9a4777dce9c09b9eeeeb5bec712c996609537b6582e2101e73bd7259ada7ea9fc3c1487e91cb0c0af6851177c884b98d87853d3a36d2d0fbf30bd383aecd2010f04da00d7783173a156c22f685aac1f180781e6bc5b8653d66e8623655251f68013002b16c588d6a3d2d6e2ee2ec1eefd4493c1651cd5739f9c219bca45f79eb86f7827e41b392543ddd61b1880dae0ef6b0152c30d10624ad27efdd5b2e2b6ac71594c457554215e02f28368081bccb11e34f0f45004c22afdf71e4d6216a580f632e32165702436c2f0c4b7287bd0ab5466f779573078fbc0153da2c1f3ab0cb0c3bb13d1f726db1af6a35112cb9836858acde46f8847f4f88864f189fc595eb19b6747996901b937321115850168595230523dc782258aa0d0edb7b0cf013ea5884e2e14335d7dbbb8fb9e6be362c58005724144c205d1db8ba0f9ff0f422102ffc5d2f0e30d61e26f8d370b1ce296bd97732e61a04a87ce60639830da88336475145a84ebb7d44999d71a2e54798808a8a0f2dbcef5e77ebe5768a256739b226f5dcce89d3bbdc850645dfabc09bc94fc064f4daa659dfd033bea29cfb54ef6c605d2135c42ca7b91941ad5cd10445dd5ff9828e7bb376b9f67c49255b1215e9a2c74b5d4e241f13e9210d9fcd60733f9d8f5491274c87756d580cb28be86efb0ecb3db8d386196c371998339ca39bea9398f0eae8c5c14bc60624ba1110949949fd82c3a65681c5e44bf4ebe92ad2e01ebff8e9da3091e5cab0a777a1673ca69ccb8c0d63caa157b30a097fe0d7cdbcfa30befccaf2dbd4917cf431d0950ebe294e449624cb34bfdb55ff891cc450beca1b41cb544daf0b70605b1353c0196fe7d8a6c630cadc4f91c6c2bdbe2962d21e9895117b5bf90e3d6eee1d329fe0aa207cb04e354f86b32d806610e0e6d6b95aeaf314bd914503c356598634f4b604e408411c2eaeab087dac4085f6ce39374a7962726ca718680109ab302b52b6fb8eeb1cf90c5c7c6e3863909906ff8cbdf4b3218480f945f2e5261bc8d94509802fb1d8d3471ee3d8037d104f1a8d97050252e2e032c547185045087345b95e40d2683928d9f34940177258b0b26feb136589515233c9356501ae420ccdd01a25321822d0cc31d4bda76c3fc5692016e752f947037d18cd4eeba6dcf4f698eee3898e7d19faa2d740be133c3bceb3ef351b74270fb071988ce3b927702d433fae076f2083fc7c80bd90a5b8bbed18081dd1102bbd8654c3acccaef12d01d5e96d909e804edcdf4713765eb0329bb8a76c0316b84c310872588a141843d23f17c9a58e06c2886d0a3b001ae884a775931e89d801ee940006556d903ec4295c43faff55802a4f0024b296e9359a178f31600d13c9e7d99e83bf8cb2d90deca515b052500e2d1bdcba49b59ab8ee2154bf24e8e8325912b1e5b8b746672b451151005db9a3f0be8b2e2043f03886ad2f0acc2270339b381d09b1160e0e9cd2db81b3b5e89b196d2bbcbccd33f7a5ec6d6cacce67ac1542e063011a3a6c0392715050b855ff1325eb3d781d2f3fa0f0f24cb45d55779c225feca8523a6b983ce9263816efb6a38b6a5b1474c87aa63dc3cf68f7a2b3feb66a869d73f338fe1e15c64ea5c3ccea8d5fab2ec0475d74f6eb11c536d117db918cc83933b959147158ec1722e45a11003f4d1c102913778ba8fc6d2cab30efaef974f5aa6755bd8c5f15237721b199845f0d008d944adf77ffe6b6759c3179a02a10a8e0212a43707bb7125ae991fbf5a4f3ddb42d60920639194deb16835c2c628a0df6d18c070d30a1df8e0f27fa4d7a7380a205a7e59f19d02a23a2bd04a11594383899d43799d04e278fc9e106eff71766ab4564a24b0ddd5b83b061d1e64c448df719964623456ad5560dfb528dc91309a20e152c2162cd107120a718e8a1a2b8899a6b352d6bfaa7a2b6aecb6a1a710f3b2a883c96d5c9cb8f36337b94bca6f617d1911fd900d46dd16f347572b462be6c75f5765253c476963f7058a17e7ea40bc241b733a04b879cca48655b4cd4d2dd24d314f6777d568b8e29d01838d280003d9de501d7b8a5ec904058e37ed8b89b953ed0a8e17e5577d46eb81e544980ee06202dc786475515f1aebf199b2fc9b7b1a820b48de54684f56ddb82f9ea9f45dbdee24fb83d38662d1937e32d6e2803ed5274cc140737e78aa0c5b92ae73ae29c7502ae2ffc8dc17f819c08c0a21f115eca9db51d7c5445be91cf82b5fc8c78dd86f20db8a4164df6d1a62360760c4f10cc5f5d0a45f7b09a44cfc9e8a0596271cce24893e81dbfed63c81be9acde4ca8d443626ee6fffa7a5a8740fa3157c4c353fcec758acd57930af69f9050d334dd7b48015b1933d59fea19b0646cda66fc01bcf3993ea76d9680d60028b62799d1fccc9408af49f584e533ff13cb801e0aa3e000e776a36c040e703ab65e7a9ef64c9e2fab6908d17b948cc1539ea96594f3c3e0adc5ec270661d9d36887188f11c61a0fd9a146de86a65bca264875bed3483b3064e2b2336b398d04f2bfeb5f2cc9aa4217ae9b8a438caa1ca08aa0013a531d66d16641fbd036ae2a2696fa962cce1da06af1f3999c88db6ec8810a3f8ee96e1ac5fdcf82b8de664c62a01a1f494350615034907af16b1ca703aec18d68e9cb1e943ac35cbab5f15961907055a6af86e2d69dd8bdf041daaf8d6c27abc5b327c8f37205fb1ec1310bd3e64b4bafd4aa647ec13a8bce9843a7a7ab17b1f2cc678fc6167222180a6c865ac25c2c46cb39f2e1cfce19207578aa9b7202ab9065a93652967206bbac1d60b5c6cd77be11d07bb16a6252fc4047bf901a4eb0d8f634a788cc3bd14747398aba4d6795773d7360d57745e698fb5c464d973ffef0a8cc1f3a0893f10f32b9ee85fff88e5b1382efcafc8d740e50a3a198d6547c32ab09ceeb0cfce9494ee6aa8af9f8a2971522ad0c87db880f3e4823a525669b943301b94f4d974310ccf7085de738d1496cd56bf380d63936d01ce27b92538380dd282e0b30da30675314f2f53295ca9fd1b9e5246d6c9f0a44b1c0b390031d8e70a3c3cceff2734e877e44016203206f0c490c78b5562f947a72f8deec505612629fc3525058f4b596c64db3702d05ee311bcdcc04f81451124a60e9909eec077f9be96972be98036b0a67274a0b5e3fc79c47a69050e74a0f3f91909723b33876164e4fbc14e0acb4f2fc872be08a0894c23b40cd85e58cf5f9803be09c89d6e43bfb802aa7f7ba4a1fdf0620087989896e6af562d5197aee2079ac6bac76cb71bc0d260d71fae1d44e74288c0b94911f8ebb166f4ead58404f93507c7f93e1daea61197a11e7f8426d162d6cabc786b3b46a5d58d1e0e5f7feb89209fd5cb24fb9e20c87d1480bc3197ebf72c1438001716e8dd76bfbbe216db737d24862154e3fbcbf813fd152539d885e6bd2742e1d086d05dacb30b54e2ec93eac1dbf5888c1a690345f852ad099453db4f288552c4e5e050f2e5f025b83e538b29c1fb9056d49720a5e7ee97d9e96c392f66e194af817da3f3307708eff6afa8e4a0685fbdbf62cc465f9a677f81284764b6b2995b889a0ba13ecbb2613a187a32db30ba46fb33cf024fa9c92c22230753446815fbf928dc896db26819944341b076e82412e5017e66ea83e6309782519958b6fbba8198509c167b8652dbf4b69cf6064b0c030fc3c59e1997baacb5eb47f1bb0aad45fd74ead6d2f9bd91cafc4781d1c6ffaf31906e84a88b82a8876461f2c12c7c3ff92914fcd8cc67bd958cf834f5e26aec455073c26cd4248d8d72dce47e642db621d574ee98c6d87f220cf13bdf75c708643380200a293da243ac7628a641a09ab0dd96b5bba889716d1d69f5b2583005d78692d8cf272a26eb5626d1b52409077f2706b6386748c6fb5c6612d0101b2c5219c6a47b6f539928e7878b6712d45d3ee27f0865c44a0603d4f9c9e2f37a1e483b648b1ae85071d809b2de10bec4ff2c384cfe838b424be5fca3512f96f2f3287af53417c4819a986b42e420400b81ac7c7543f2022c833b9fa789e7231c807833931b62b4b2e88d281f6f59ce12de5967ecff57605a6cb0649b17a8713c15f813ce7e39b606c5c9e02272c0b106a3dfd4c2b3c04e65afdc2b59bd81d7caf2d738143dff38140c6795909d32d6968eeaa9ab0e4c747a54d27ed1f63eff5852554c790012da563928ce197a79dde2f9c8ff914d02f14a00fabf943a620bb472dcb23b55ae3c3d6b5f3215b93849c8e1baf6cbbcb55361e55eec4ac8cf8a760b95abdc285d07045fc7d58c3cdf20da43ff8fa8843d34cccf66a4322aa1b9692d2f0bf3239a19e14213f5d9623dd6f22f567af169a6cd3758d66bdbbf4199f654d754903af63eb556699f733b13948c013f117019b264c4c82935f65d89c7adc919b50fb1151fa1edc8e96a7d64acbafa60f890e9f6703f4161f3455819d09180ef920643e551222b853954f9e6d34ea61ecd10c33f7ba1f3edd6256c978b293027b203f838f3f85e27ee3f3d74971f6b186b149aa7be85297d967f79808456dfa4fdb1d646e8fdacd3f1289269cb0b3d0b84f17e0ec908ca9c16fbfa4a436895c51c5f42fdeb1e2b8487cfd56dbc20605b4fbceccbd76b2f8d34b184b1957e9be651ba2a2ac18b48a508955b5228a26886d40d4dddadabc7de8cd401db34e94a3fdab582defc265d47f12355a4996deaab024007c41deecf38dfd2afb96447fabc9860f43b0cdd3606bb4346c8f9ba77f7ee4ad7c83ba8c6457d6ef59aa5502680fbdf194c5d287bf2d68eea0c861657b5dcfe5e43d07d176402d83b22788b91fcd0342cdb772ee8376289eb88ee9e6b2228df668970ea6eace8ae02b8966bb69f35d1858b0a118d035a1d060a8866202288c6fcd3e5a70526eabc9973ad396485411433930ae546b86b903174beef2deb5193fe7386d77c786c2eeba2b8fcf951bfceb077fcd769da0c1958c5cc257b1a0adc9c6268c31819e67dd5213db1adac95842851ebce4e84e802800e600d0ecda9262d70fa5005c4c028ade25a90d9f1c78f62326b548ebfb4fa6e73d57cf72f6b9495ffefbb491d1c26e1060e0cb81316012080be9c80ea18dbcf19036bab795af6a3673f6c56dc3058f8e6833e0019cc53ead8b2d12b0ad2f8b8c02e7c21c1dace3c0e83b23d96014d9f358701c03de9ccbfd14ae0977e6ba437e1f4966470894cc1b886ddbd9649c683c816bf06915c8406c2e3ecd58e5f80741bdf2aa9cf136708894787f97b7470417551f3b481ece58eae894e0ba607c997d9e62d87f307d23551413a12dcb08147f2637626e2f997ffb182e0504ce19b0735372a376d05fb116b2df0d5a56963783358d6bdc7fab0f866d4778b7aeb04fcaa4ce32ba79eb55be9a98b72e46d1219b8fbffeab72a4735c917201f8a5a5557ac944471e7c6275d7a98ce06721207fb8baa8fa0d19841f20ba6bab73c8a9309c6daafcf21c5219f3eb0fb09fbf85383a1e04d6165a0efe180bb0082981fe0ed9c85609834294e3f5ec5542035441429fe5a3f05d74212c56ee52d8b59bc295ab9daedadcb219243457fe149b3a9d24a63a217cb3b49244ef6e860dc0e8ce51afc30e391ac318f0c44121372915890f9eb95a2b61b35f4f1e6d31b361c2b8379902fea6fc9781120ef00174514f9d346379a0fc0bec425cc11600a28b998ed2e78dd64749294846d7050a957432d8d2f7de763f073a2b92e3124cc63872fdebe9320c7befdfcb4a79363ece5e9c4af96bc38850436b0e5bb6d8b46becf77a2422292777028841404542883dca10a31aead536d05701f5d369b3d64464e3a682824a3d5344d9d55ce0198447725afbb01189edf29ef639fb97e35920dabb4b2d52f0d46bcb796bad4f9f6c209a6ff759a55dca9f7d147c7f14eb506b7011bae8a7fb1b706b2f81ad6268a42841544889e5bc37b5dee5770d5eb5a72471b8414b1f3bd7c57f9b2bd398b85d26eb393d469dadfe03e026d4e31ffffdc958020c7143a0b39c9ac2007a8743127167c15a3752d93e630e6f1655167b8a20177498138c8dd4e9e56fdb04f83eff802fc2f7954f88808f72331ed79f129db4a6dde6529073ccf913697dffcbd74815ccf346afbbac0f459779154969eed3af4ec5d301d97414db2bb1b7602f73fb906adba95ca2992121a899fec41b9e3d51d75a65713165c3cd8f1ad8184fd3df845b5818b33dd0470b04a5d7b7c815164a96bf021d857c89b6bcc9bf508cc49604be44a13981ea676974e2f62ebcf582479a286c480383704861bde43a014bc5d1ee3f1159262f604a3654e919ff22ef0f22328cda83f5e136550a293c3054982e079336174c7ecfc26cd4d7b148cf6a143583d69a43e6d245f40aa415c38e7133c77ff68c6890663aff5d9660f0cec14fd55f59e98aede691a1b55a71009ea1d7de6d1c411b9a0578d20a64cc3db6d41fce43d3eb70c179da877040fcad72f663305edc46cb5db9df6c8e297531b3d36b4719450b6dcc66ba3ec8666b5960757be34babc59dffedd38d2186cfa610854999d56801e38fecf17e60366677c1a77293da149650ab622e79674e7f9593f52ec4fe08bf0a6c4776ad9a70d873e80bf7e89674d9a3e05c6dd731023425e51b78085d36a28f84127e0838e3e4b03262e0f3d398f4cb0f7c2eaefabc2681705f57b17006bc58772a2c844d788eac6514c56391aa04eef6b4968a7ff9ba3db543e5907c331e1488422c6a2a526fb74fc3b8b8dffcb97a6a676b0c523b39bc0da5e3a4712ea2e56509c3b1e404e502c6f9ed6458ea0386f9ed6dd1574cbcdb3f5c911b4e59ac7bacb1514e7cd83f5d411342b3f8fd62b67d0558e79aebb1c4171de3c59171d41b1fc3cadbb1c15c45b00e8b041813ee293f4253aba29e5386c462bef731e437d5076e285076775f76d978a3f9499cc9c4a58863ac0befa3f30f34ead59ab7eed7421ea1aae5bdc968cb074acb24c9196999eaae5d7e1739fce752493705c2149e475787b2b80cda2ade80fcf7ab5593a2a4595b43afb667860bca9b36587f4dcb329180ed8b0b05c56b510384385e44f6bb26e3f890bba8f8ec9f8f5cf7851b2b8ab1ccc52572ec0db215beac6ceae3e187c9e5c0b6dd356d06ed7b5324a8188c50249e98029e34c30951703b311c1091f662e56af8f28853ae9a781024a8b4234eedca5bf090edce3d5e39fb677cb6b9ec331f76bc74bf897d494195ef1035cb8675c857ed92b7e4c541cc240bece6a55ac3fe82d05ce2b45a4a66ecedd0427144a256541a958bacb4c19274da5871ec8a37bc82c611b2a15bc008107a02d04300d22bfc2a167a56aef588af4ff9ebdb84fbfa9a89526604dc6282c5c6ba3d38a54fe75d7871a63acc926740cf7ab83110b1e587fa91ffce0592fccac2ec5e24fa016544249c63b81864ba511b62b090a63bc027ca030cbfe46e8e795534b2ff721bef65b22eae907c5359e132911a6868c5b32fa652b89e1c5c153a1618688abf2b18080fa3a70cf91fc76fa1f9183ac0e00f3924a35b84598e2c89205410b53d7401601a0c87969c954225bce0cca3d1cd097a3c377849448d67cd7af5ce58706c07338250055c21111ed18bdce8aa0565cc847042ef89d6e0d8006c52ffe7504284188e2e737a374d4a3cfcb01b430782d26585ffc926bb02a6074f5801c13e25682f0c735541e6fe2037925bada66ed6a9838be550ffbb7a52cb0f7f9fc0fb8e8b2f1641784a4fa9f949c68d09ea61b37c0d3d1bdd47343212a1caa9c64138fc99d1295a9d81d923ef80e13533d73dc8c8b61af20ed8f5088d61fd5163012c2fe4859e39f0315982a54c6e870d7166cd21cbc80ecc6369092f7dd64817b10a1bfe449d4230574e62aa7066670bfd64a7950d456085538be4095936e04e0fd263e7a4ba3946d497e02c5fd2c8e7ef786affc12ffeaee3e97d10d6e5c332dba444416df8322c6b0f36e2d9e5a3a47f9762610b35a4c9d1a205a96ab6ff9aa087dc79100a5a78ef0679ca120246651a5356311e5de0d6f244f3871181b5e596d57960beba80aa7c11097deace45ad21315afabaec8783480e998e2882b93931b9ea5123ffb9c9e69bb722d48aec7414158a0039946db309b05bf1d6ff78c52302f00b4bd5072884df1f28f07e88753b4ae26d5660e313e6a547b223b2b75ad601b7735a498570786a7387b9c9b6e78363e0d090644f392d0d94c07360d4cd1ad2ece9859f5abbf3fa37dee6736a41d3044f9b829d87abba3cbbf899f4ab72c6452dee5cdc59193f052b6c1849ebccb8a4e91f4086f41e81f18bed19845c41cfb1fccd0b951a02ef99983fc5443ac88393abfe0176678e71bc2e1e64795d63e626ca0182520f456e67036e28453c189e031a6f7feaab1954611e6847953bb3602f32c1746907003c426de8a3d0f77277287341445e4c0683484b99f821014664377b39891da65fd0849cb56b7c59a24a626eddccf56e7feb283fb33721dcf0aa87ac032f107a02a9d86cba041d1bd9717952244fdc864e8d2c79452fc7b5185c7647eb0f4ccd751a02562e0ff3da73ecc7a94dfcf94ac1111fa34dd37a6ec831c4235b7ade03de1420c9d85fc06477254beaf71064537454ac4f6a6b17a471ef74a5ded1413ea82d215391d765c83bec523ae4504284411ff8feb819d388dd3eb63f3a7e606cf343312a9ddab28a2127b1271f33a192a63fb1f267ca1e076353bfdfc33203151a06e90df346acdeb42a2b6144520e9bbb9a3f95b790b8d9d06bb8d57a848a053f2c51c44981c511f937de9caef8ad96c82d033344cec938e4f5bcca4609c68b0907ba028ca8c71bb049644e1a8ea1dfe6cb3b5b8564211d63ba58ee03466ea2b02e0550f5885b912937c88333092cba2be91588cc4e107341c64965ef40345f577aa9427baed4dd4b7490fac6e2a7b1f82a2050709263091a69141515e665015cba353a0bcb2aa903bf29d058db8f13ce473a7e938788fa9227fb302020949f4bfaf0e080a898cbc0f1c30fc40e4ee2d60cab4bc13fdf40b42810c08b3fcf2238c0c97d7622eaea82094ab6ad2439c0045f41e5c690f304e8b41648ea5f571b00b9a5d8287a79c614501d8548f281175695e1a254f6dd05eff9ea833cbaf3833d2b4c23da5256bf1508b90fdfe3b4a807de567c80f5a2fa1f9e64573591a9bfb72ced4d8df01fef759e431f1177e791b337a38124e7666666044442433d37249efe84d45b8b21f0e9444752b3873302b506c2683dc7309ab7b517da39663d64b22100c1c03f31695c7c0f8d59a9d28ea47617431490e5ff6257774c315d8ff995f4a2c1c382e7a7e5015561708220266b69269e15f915e03a6ea40c30d90ef68260578a517b12027d8851612e7b8ed7a69af4c1f6e0cde51a43e94c1dd13176f9dcbf7d0af44b4cd71dc5bb4d1fd0dbed2a6e4c968982a24320718d55a42ab134fe75daa75ee03bb65d6ddb08944a8f1425315dc11acb88b911e1b1df3701108a1dbea336a7702ccda03f01e3b185d5ca6df19f6ee46bd32123e23ecb95aa9cddddc314038df1839a166c5e3e36bbc8d096c9da3c5f975f78bc65d51f86fbeea8dcc83f0bde9c5f2c84f0fc71fe2a73bbf56f8aa83bc9d083af9827648772d9827be2eeb55937e3b09b9b4b6ae29ef74742a5f347dc239d31035c2df1e1887346e5ece3ecd12d85c9e8e9b826bb65adf7e5e063ff8af7c9fcc375f39c22ec36d18a0ca9bb0b4dcf9d84e9edfac3455d2f16bce372b4162a5423bdc4a24d5389173043d6bd3cc9ba625db90a577c7c31e07553a6b3f302decea789cbebfa5dcdb71e6cda13b4cf1b3b0d56036585fce400671a88c862a3d9072d25d2d6bac084014ab82c4c6291a98239f2496e606d7d0c8b68ea9ce37cc63d0f211f57999d0cc5d0d25b33f7bdcca14d936d2b05ddbeedd5a4333acebcc40fdbd6043c52ccc400291cdf46adfb788a849585639d4b16b2ed1bd40da35a0f139c654f845f7079cd4717d7878d8cd9b1dc4e0f022cd3e5500cb7217af823c7253a1dce0e793baa0331d303875c9b384b69ab6acfd3c6fc92efbc3ca543a38f10e736a7dc839ead06496a0d20a74209b6b6b1b8cccc7f4e2893a12c4542ccafbb0781de58d3dcd77a5d8e3339258bdb9f17ec40abe6f35944600984a61a389ce350f6c36e401032f7dd6852ea22f205675a63d79b98a9960b75f53ba6e20cd9c3e92c002ab131a5b02701ad419d982dd0e4024528b9a88f4b314b2b74ab09045b24e4738569e067076c996826a5e62e24a09fe2faf6b67720c66ac6faa597c714458750fa5c70d01c37f1bc3004a4e61859c47695eedb58668bdeaf06a87ed696ea0247cc0b793d81cff4bcb28be36987bbf13bfb89d53456ce68671de843807d76b84f63a4e5eebc565123c8f56bd1126e248ce69001564883107c868386c06c5c7566ad36b1be435301215bc14c3c46c2032f169a0217ad4c0146dd252cdb620dbe80ca271085d29b5359bc50b3748dbac0d8a70f0b2f8d386ffde6d44a1849f7a1f5320a2d48957c4f9f74ad6f8b8aff6d95d3d74d229a58970f63a10c666784d19c96310bbc44a85329b83128f83bc8c5088bfca29cac724bc987ba504268be4336ca2962cb39a0c7fdbf04d9470631b42cbf224164b5ab178518a41ff01157d3225f4126c91cf9b026d84fe1879e93869bc46b4d41ab27233209cd08185639060aafb2b9b1395374cd32b0060f70b5022c16ed79a7200a4534e15952f18f9fda49c14e32b2c9f9c324e376101da3266aa6e088f131bd61b330e304ecd6bde0f37066e8a9c543380b04ca68b26f60beb6daf12f47df503e4a7e2ba63bd356beb5a67398c7903d21692a87b14fa9a78597a47682cd41c70a907809314d6167982b0f830ac40cc93db2a6ad620a0ba84a26b2959ce067368d5eee97bf142c93e5911f9d122f19c259943fc2c3ec0fdfdea46153842664eaa98881fab7969db481cbaaf675879a96d0451b85a4a99eb2eae92ab2599b22a23942715665b2e5fb3d0bd2390e285596943f3f677555372950d446f3d865006677db170016a6db635897f97f4f0be8143e2871c7963bf9b9f90a701a3d2221e1ee825d43a1ddaeaf09d9831b6167d7deaac53046d6f17f585a970566a2b489d2b1ffc74bae9720d611733054d34ff2d5b79db66e94708b9dd7729fcc882682a3c2d02cb9e66c7d22dce356dfaa719ad10bb6bdb723377bf0491e6e41a5855b899d6ac001e6f6fb045d7b16567aa055fc30ce9f261aa9450256c72893f084e0ec5ef16177475599551e136d0329d8611400550f1a4e0f9c0e1bd648d475a0d17a881b9ebb605989ec02b569d87450d5b292525383992e0a96b1a8736329d9fe4b1b0a38f3d05bd39486caf8828648c1b6f2ccfdc8350084048faf20ce8996ebeda9ff2bc78aab9b4fc620d901427a53573c4cecf17a2aa0cf283c2ee412f95c1ce3d23404172cc60bba15dd5e6351d8c98aa1f1c31836fb10c0840251bdae1fbbecfcf5b0449e265a053e07e2a06dbde6294081e7340b81ff0672720b93813d0b1a97327a0fdc4a3927e6e79b5a70b24a590508e19050b0443ffbed23b5c8c330c1d2b813ccdc556f5e401c3b7b093f412db87e035a23cfdd2d6a449ebcb388674869ac631d47ea7e6f5d0e9eb83e4541cf01935a48b9061bcb4029d770c70112ab2729e9950c213da5a72d2c38d4418f6853b8abfeaeb37154b24646db583df93f78cec7d1cc39e7ed901807f32f0fb3faa8656abf40baf2558adc1ae4d9a22afe627d9bcd8d6f9daf0c1a2ad3e286c9a6684b0942ede9112b4deb5e7481e4e91a9746f7d5195ed735b17ef8866dfee3006f2cdbf1232d36d353d0879cf0387897e4e5f8960dc6bd4729829e260fbc3170ba0de85a7e219bb73b13bfd82673b46276893e4080a880e4611032d220232b0bf4eb208b547b4be594c442a5b7e107ded31b6a57524d92a2029d73aac45bca7dbc436d503a72bfb8a95d8ec153660ac439bb88c5c43d98000a7ca6a3d638179a14fec06c00b8f6d71ec58fbf2c54120c0946994d3c27f2fada744726ba86f76f884084c597dd9e385016ce645b073d452358c04444fd372f0ed5870ef6a2c57a2d891f4e07c916e2c3718069ff72912633befe07084b24e620424b305e6b498033422efa115a3b41d7623f694cda47d4940bbec2900c26be428587e5bb6d4ef22dd3a661f29041abdf316204d1f94b2791e7db86f4e636d0a8df9b6edfb95fbbfffce12aa479e77235d7e2b0b227fbac3bdca6c02995df92f604d648a61012c1b28763f2238cbd8c08fab05b6d67db60c57c76f017bca15169c7fb531527ab28d217b9f589b599ac4b6ff0215eff4449178a8de61eb785eb83036a64d33820b1492dfc846190dd26d35c18ca95e874db11abf47bdd8abba601de6cbf3e53e6a4af0fa35a73431721d4228744ee5dcceb1f1494727105ce1b8586f5c8fcad416547609870692ae6b1d2b4b51f8261380e0d60d779697894bbb4e98f025102304238c4b181bdf675f90dfa5f434c3b80a0f6333c534dc8ac229f5f38262994cc975c94c418a87b0edf62c03628b4352dd320a1eaac460c7e3806810af78b0ce3aca455eccded7fbac9721aa9201bb34b377991134fe81f988a40c23d4e328b59a990625c6ac42f775135a4d81908a25e75059d7ab50a0d86d0ea4baf759447e6c3595c5b628cd79d09312046245cf8bd449fef62634fa0c2ca35b9902c490cb9b2fefc672955081aa1a53d6b62ff0e47506feb120d5ecb0c1ab8e781a51721ff5f1d69ca163296024f0b38c8e681a8965113e87ca18633a11d9d0a087cfb9274333565d447b3be88e57c356d15d1678d24a29f0805ff8436f4b58ffa4bc3cb81224f2a47e9f2ad8f2c02d48f8127073e2019bd5eda414469d251ca8c081a749fb8e135241275d409845ff114ddd50667952c6e55a0f5c29cd70446adb51f3c8ff7444b92bb64f4fa9ac667a4281263a0f7471dd8959684a205fe7e84ee2c954bc0d1cd50ff0b527abb80fd5c6576cefc95366c31e37f0716992e13720a5714fa64a594541c35de5cc432e96ca68a0dc73623bda4ec223b1ad63b1efa7be2525a750d776ac01791c12046fe569e52f6d7f9c20bb281479a407791e585bbc50fd464dcb8423a29e02c371b089f06e5f7ba014469ee90d2f58cee4d3d9648bad94f9ee8599d0da3841464aadd857d3aa6a4b2c5d15b7c0dc29e6c9cfc209b2bf1204edd43299040dc9fc62bcc2e52ae958d5c6a788b44fa1652997af1d38e0bed7dd8a886740081e35502f68f30b347b6e4083b5c17b5df59ae7e0082b0ee47adb967f27ca8ceb2af73eca166c093929a5bcee4101f8e925b7fb49ae6f483fdac24a18daa3d68e48a8db41e7b750ea0f871e6071de19e088ea4d93470e53093149b00ce72a31254669aab31af5678be056a751a8c33ecfc0ceba7ca04cede82c1413db4dea2aeced26b100ff4a04e2322a30c7067e96f7b3f8c9d3edad536de9543e41b4fddf032f219df6dcc9f111c27f28efbd0831c895c2260693a8c360f2afef33a564169e9e00c53a1581b01ab42cc261f6f325da0b9175e1b206fed2d36c10c46388609315dc66c1188e1e4432a79637601e84390da4dcff0254635e2a9e30a0970338ae1f3010eb17e0795192d5d4086200898f96f2c784014346e0672af21f03cd6d48d2c5a06a79a768dd3035bd8dac1ddb56c81fd9851b530c5e824a6ec9f88c765de6cf3bc3d7d634ec077aa85058e4910c63b3d3875cd2401d08fc1e0463f972d5a511543d607e29b5561da7fb8ef84b4e9f8717a22017119c66ccfac371d81688f50e82ae37a7d28afbd1cc3416f9da7bf2637b4b81e47bfd0a25fc18f4c8a54fa4f0b33085eb6fff38a75674b4c200fb72d6cb347eebbb1f89833ae820f0e5c48f479cf0eaf981214e2cb5d44b48bc14d25363faa1c06eb47af649a71496409bf947183027d654be6faefb824898ac8ba4f757ac7ab3188880c259c324cc4b1b20c33e4e25958c2aa7c1e18057d8558909a30398088d43515f7842e1324ce5abe4329a56912e92d42002353dca10ab7f1dd181fc10db1d911d1cce88ffdb766db5512a9b9f93aa68b9a27a9728bb4b0f12f921a8ba64072e23d555fb3de396ac643db1383d64a896e5f60bacd4b182065c8d38a4bbc80adf79eaba74a23355c5caab1db3f77c7c844b39e8ffb645f648e9cb5b037c5bb021d7d5dfbefbacffff56ae2f733155a995700ffcd42da1377367949ed18611f9e32a0de44d07d8342f132d317891e17921705b9f24dd80f6b78366977a842b65c76d6d3cd5e822457d97ceaf7c3fd61a15e215b2ce381b3671826395a9584e50555a57d89a8f5f31c2e8a10d990fcc8162e6665a929df2a2dfb2a88216220559f25802a3d07ea5cf24ffd07bd048fbe25ad28639ae97a6aa7e2ec0352324b9f8e62c1885a46397280e882b96037103c5ae90de7ecb34aae3dd44e23bd55f6a2d6761871e4fbc8598ce33133256c29aa0680b0da97b8701659e6c7da1a080efb56e4134274a137994551449e53eef3d5764785ccf16c57553364f115657dbd01b7f3a0b7e38bac23fb4140928f62e7b9b0a3bd6f8d9254e25ddf0c2c5ef738e967b53be3f6a206e00da99f3cf5e6e629a151f137b3313076e8042be5a86efb4a76079e211b3e5d91974d71031ccc9484171d7df841223497239757828875310976bb3c50edd5d4983d11a866b76e70d7fbd4c4647e676c763626dd7bb7babb50d0d757a4754e2a9d83f5432104e624f09522c09bd4225be7bae373e6919391e3847a568c4786ebe8a45b459a24fb2c8fffe3871e22aec9fa7132c93ce0474a27be3c623bc6c5cda1b212861e336a618741fa7b5695c6392d8f3b31b055e2ba26150f6148fc277510ca9f5bdf6b06bc0797523d800596dadef9df853d884609a50576cf571834692c6b5cfeb75927e8f34051de247408b0cdf94a9bab84f06dde8d3a5214e9d0fe24443c53dfa6ce97b93de5cdeaf93a753716b5d01f7f538bce444685171732d7d3c2e0925d3b1ceffa6e7a5c58434d3bec230f7d27d54151dd94c8dbf9f459db5e8141acefddaec98e7b62fd8df994d4c5d18dfb4e307108353379261103e9cddce4406ea81947cfc08bf919e73eff26832b0b6bab7d1b01da36c9c18ba39504e0349f9f5b7c3483cbd63c9347e9d83323897ae615fec0fa479de8b12261ca9eebdc00fcb477f6e83492fed0d046cd8c39255a87f8f00dfba658444ef1c8334028c3677700de3dff9dc3d42bf9398de21f73b81093d14ed954535696442a5b211973b29b4bba16b3ab317128bd751a35cc700d6d5dd2719d64f0d77465939fdb57f4d39be72256aa0efc8261634e2a2d5f79a8be95875278efc300413fbdef61500cc11f945005a2e9071cab945e4dbfba8295788f95bb21c8bbe2f824a08263c1378b42fb90c6fe7b78a053cb0406b61d2e03629d65c368b893fc2af45aa3bb9a441265c81cb708abaebab86a71710fee4f0c047b9c47836f5723b92f19151badc4d9ebdada454fc03d302f709d9c651d2a27332d04f7d8c53d03054c5689f5e188a1f48f0a32492cc747f4639ff5b0c5b4050e53b25adec97a656a2dbc09d9c061cfbb13a15835225cde69721c8061d91fd1a69e57047a5a43af0406a1cf7fe266c4c7a19acfb539b08f1a2d763428175023b4b388e54c02907323015e121a738e41a0b6c0d13a8be80363542beff216f0044d18151b87d813ef042c02eca9b23909d0c376333da377283bd831a8889adae01604fb7a28298ed3ab85d0a48a1b54b54ff509c5b4fccc250129d78abade1433914df88729866ea324ff4ca206ce24f083c9e24272a78b4ccdbc19c7a5c1b14a6a6794c0195a94a6ad133da5323dbee47cfdd951eaa790943c3ee34caba4050bf5a8166ecad1abe55de3b41d9908d286d6ea13f9c52765ee87569dcdd54d31eb40276093f294e09aba61bc2580f76529dde917ac93e4d74af07a1885f9a8c101d17462d1912f419a96e51239f0892c2fdc3fd48474992fbfac008245f8baa04b55886b8bad5bde4e091747576eadca63434467984e6da970802993766644c15a120fd686e07cd6e56a69b4340f402444060d5020d2978073764c8ee1c4d422bdb69ed7760868f72831120941363bfb15cb50d830cb9d97f78264c8a1bd856b0ec6ddaecbcf0fbc6180f5ec3e1ef4d9134120f329046c0d7bb5c6c4606c5fca5131d279adec726d64a1b82b198b2acfa92c13e9c278bc969e976425f6e7f6a5d1e011794d5cb64eca95ac3041ce8a5adb862dc69ad577d9ae6f84133445c0b72d71141294dbc7a093d6f8e45c985c597c4387dc7c08b292ce07a33be816777e163872b2e5c004a8a7d34731334b809b32cc937eee016f1e4cb5645b173bec992cc7725900f14ec540deb794cb0b9933c6d3e6d3652843977838cd6d7019ed0ff96a2e640a3725eca5f0a25ebe8263dfcd96faa4d3d112da9619cd192d006b9d09b895d06823e9e851254d0194a7ce7d858feb549a4dd24123a4e106229a80cdd7a4e605e35c3531de46e9d0efa53d1d022dea9df7f4137bc337d2ef33ceb5ed1f00dd530432cd034526b6ef76d420e38010ff8ca20a916d6feacbd72d932c3f508f7f4ebe634e697f1c3476d9b67ef3d1146f68f8e66177d8fd32f2aa1949391cc99c15ec6fbc2fdeaf380cfd0f1ef07353530faaf002158467a5ac4fb02908cc64f826ebfda6e95eb643d74e6ec36f192696658790042594e482ab660541d33feb2e568e59a8a13e886c2905b5012264c2b13f397abd107c2da6fe072b3be65b617b75c323f87231a3a00523829f7381eb3f034e0a1708baa16fd1e1c825d122d664f61e8f52ad1b62cfd9cdd8d9c526eccc5b79c6d614e14f2d9380c706896b604203ebb696a885de62f9ae86a687a68148b21f308d76f429b26132c8b5e935619d1a52e8fc738a607d6408dea2f4f88e770fcb1afa2ac33321545302a4916e027101471e6aa12da4117b880a1844f3a7dd4d772d4b5a117b3774cb5281a61bad54b34cf9c0008ad393e4bdc0d9e5dd9c816ccaefeac7bc02af361cc5a46212139b4b993fccade1a067e70323d391933f2d3cf6eedcc07499c31bd4df385f4939bd815bb6f330695b902229181f95593af21023f87554c8c4d96f859bd98e1f9702b50a545b896d382a8fac4cdc7c51ec5541f364f490a202510d755f9f4130490232f4fabd35dcf2871e69913e65394c380904f551f8cc126ee7d061f419d4349fcf18ac1490fd4ac92ef5beed0ab3362e8433b60fbaa6c49d8e27b05b1912fc3e008163e87c65dc8c95df9e07863ba33f9f9580ec0cd60bda5221c68c50fd7c49df0e7a9e9d5ac7dc523f7c902385b3802ed69129875835ff3b8a439e0f7a6d88f83cee0162b3f2cebc3513ddede88788f61ade6ed3b5c40bf8ca20bfefc2d5bb7f44c4f71a8a5c85300bc8d0034050907ede276b1d63cb46297aa5bae99f5e7d4a1e2499cb1d15c9ceff9f67ad3fbe4e8c62ff26ece7bc36cb9f64df9332ec088afd0c9180b432e37769facb5f167df4a75927b8c7574602c0232c30f3ffb545d52091ebb4009590b911adc55b00bc93bd20ae759f27638e4a4e9e8e174687b5f03ab2cca7db1718764477af596126d23df09aa03607ed7aa6d490fa5f7506b448b275ed1ad3fcb7932503081a0441cf612612376377a2161c6ae6e89e6e38d9652ec536d10cc8d31efda8210ed22653597e68150eedd6765fe1e79de7dca4053357f7228ca6d613a05c3e56229802867e6355994a8c186febbbc46018b6cdab6581706536581f79669d56756fc586847b695f30a17f1d26a6105ef901c7812168f5602d3807ac7729bc2f0ed1e1b89d00cad47d92f25217f2bbda63c7ebf9552e94f717e672d95dc680507117227046024511ad29af64906a5a3147d4ed653dbd56ea15d032e68dcaae6155867592383467b4bb727f9be1f5d88b6825b3ea152ea0a6a22d67c1de216d1b50f027db57363bfb86864e8c35da4f497e0162bcb1a00e57319ff86cd7c644266bb01ebf7a8fd9787c4ff64323396f521967ef421b2c51858f16250d01938e51c7f6a1d0d944e56ee7eea509f81ecd92f874d44541e4641c45f6f62b6bc4f8f67f5d20b553f5c616b2244d6a2241af69bc4df05e131be584f3a265cda93921339aca3850799ef593611000c0010d13bc887c27e3f15bdb48af553519d6c30792e07421f84b4e0595dd083363cbb8c5b4a77a8f630b6b1962371244fef8d4b1c3095a9e6734e3b96c10c7c7c90fab3a5eea730bd7e11c4f0e4e93e3418630abff1fb77d0e2138521d48796ad828e629b8b4048f07f24b025dc03a19aa26f21010acd43f08b1377e14598e35fb0df805bcaa1b498a35fc34cc6d9e0b823b691a3c17c8c5ac22f3a4272ab1c74f889f5b13535a5317c260a17638d5128c4939c9dbeb914ce133c91282d838ae760deecd2a47acf8eb0c8536a76913d5f8b3f026fb2a988ebbbc604747bd64c6df0930f76be5886577ebdf1aeb838e792b6fee72fe79f72e9416bd69b4062affdaa2895c6af831492e7f161be749930ecd5d519d9527c8287a63172e0ff85745cef61322ed4de51250f510803425223b96f6dd9e0b83b9f08dbd3cc1d450170d946b2a1ea86f77e7295a23d069817b69913ae0c22c528bb38d226d3497b6937ba6bb046c3fe02be1adda8dc6e79473354b5a15b2cd2a40c8bb99bd7149b68fc6e4d343b22b6a30bce3b8dd59a9d0f5874fc35de331e8ac7aeda733e6bbc57884a0b6cd4460efaa77cd00070f1db9560f50d9038d3bf575b7608b4f3489993461764910644904e68eb2ddd728812eef74357a30ef9550d1412cd7813929ae4f50f630f07228f58192bfa1efe6a47d5d235cb0287d96156d56585157d3cdf9ae569ab60cb4c2c07fbd20584be7bd5a1783493fc7ac9c7e94b0d3759037760bea03859da93ff7af5160419de73e0d2d5f5a79f623f6dfd6406d746ad6275cad5bb6ee4d364d0f5899b729a31c6136b648c7431ea671730c60225ea6370fedf73f539e58d8b431c87f01e1c191a3c790dc3d85cfda379810d0e14f830ce1c1ee9c1a5b65606455675b509d6ae133f1d3c564fa7b77a408c164086e53de4ab826e43c96dce9dea6841ac73181ec3a1ab470748c4923fbb4324ea5f82faf169b7301eccfd710de6c5584ef73b11a5f43bc9b10789fa3db91331a5526a0b70aca620eba285693973c9310d8f709712bf28c7b5e49ef327b40884618332f9f50be126f68c5b5ca8f91ef0b949f90f8e44027c8f48e4b0d499736612dd22a78f9d0770aec37b07ac086207c3358a8cf9e5d62b7db49d685ea0440961dbecd057f3854ed27d5cecadf1b77f9314ca44d392b5c92ab2b7d16a0ea653e31817325d3dc4975d92758c404e2c645ec06c149b885ca2ba9fbe591a6142a580b9784f951a79934369922a335d73be8f46ea9e2a85955974c645358a560dcf82fbf0552e81dad5aabc8c5a994dd4afeb1c7d3cc0b7bb17ad66b8503acb342bffe46a488413d283f0d58de4432cd37708292b62edb349302011c9c9f482b694bf08cd6bafaf1e28066abb12d1dcd164efde675663814850b600878823fa82bf3ecd507d1939cff8ba9d1f2afb4adc12ef62cb908e5038e99afa56e9c82de5bbaa5873b8aa1da016a06556a520a6ecaa7ccef080e3f4ef991a4161f665edfc1fba36030be67742019406369fe4b858cdc727c69408b8815f76527e26dbad1fcb0a3e64ebc04dd6758c8ffdc69f29cfb25d1fb111dc690a472d63281d8f016de2f03a9169c06c22b63e5bb04c03cff4ab2bb1e3fa70785c8b507276c5a3db4dec71679e3d4e56e43707e60924bdbed1775228da65c0cc9a93691ad74707d9a895a54e155284c1605b8c14adac1fd0349c6ae4f3a992b4a7046c88e027f415b21691338b3917de62c919d921063cd22161653b4a73e525e25835f5aa0a9e985289643f82f73a2465aaf6de0aeaf04613d37d4b6c82ec86b2b363464f0990d994f706701bc9a96c3f9a7c8a43ae1319382181eeaa5961fe94b42294bd012a33113c5630dcd5a40d397010663396edcc4ce2e4fc108031371a4f068ec3d1316836e7734a192bb37296ce4b63ee9071506bb7a4480a3503cef27f3eaad4159d842b7dba53f5832863a38f9ede7ed2a84922919b48e4d29699648c03ce03a3036dad03bdf793d28075c34418d18a6126094651d3883e9d92fc0927dee2cf18c5381bc3d04992734ef718350dfd59d2c4851f0a42155166a0038a49e7a4bcce490c53a934a574565a981da2fb297f62f9d15d197d8c22e97bf8e55a24a79fd2cb8f518a130ff1f27d796da5439c20c3f040fd7ceae7cf49ca52c2388c8bb916fde55a745d8b9e072f6e344dd0f2f042513f9d9a59cc15d77dc4529568863990bba248769214e74f30333a39e724fdf44e8acee529e79ce6d3e9a6299389a8205c9ee1e0490aef14c50c33a27005880f64b80285dca0ba1076c36e08a3c7fecd88e04e597e6ddbd0c60861841042f830fa676d5e4359ebc5b2827aa7942fc9a7b3b65d8074f9e564f51c5de37f511d238ca42923384d749a6e77943276b641cac8bd35b80f892593e3a82edb63b3d65aa9b773b23fd1676da48ab21587610449962f757e768b29a160ed16d3098e07e7aa32ca08b1d1faa0aa84655cf3e0aea1f1e2aa0b770d86b53713dfa5edd7e04e279ea7ac031c6084076ec665eaa9d218a040e5d019e7faca1a61224b4f2f96e95e363b2918c171966559cf25b59520cb4cbbaa6fe9d059b1c85a1ba9a26ceddc976aad8d24717d99d6d55cbc856aaa37cd69c29546cbbfe01b24be86e5317c63447adec57adaf55d8b324928ee395b582ef957f6d283697c26be859ddf30b3ed069623f6b9756a122523aac398715d1a7667709bd0299f465104231ff07d4c156de10ffb548947c0881a2bc1c89b0d0d1da4ee9b89b2f93e47113e4803ec7841efbd9dfb4e56bfd4a528e838a4a4dff92999385b3ded7b295ba76992a629c3615ccf4e8b2da864fad2258e81c2f2135b4fab5a591b969f31502a67ab8eb5d28e1124b3606965211a0bbb318ec83d5c5a2db6e822cba7b5462db60023cba7933ba73613649add702dfaf04ce3911de9baf7f25054a74eea71ed32a57b07e3b8fcc5386d69f5b4ea4cbde55db0f3998ac6359c96af629524d9e5496942aec9e4f8321aac924991bc21409af1facb18b75e335b62881545927025fcd577b99825b7734c126ebe4bae9b315580727f12b0c24c087cdd59143f7a2a5ffb35e31581f0bdf7207c317879c50b426ec765996ad040c33a079259a2b80ec7b2eebdf7567bebbd7f6dadd95bd6adf7de7befbb9dd6e6defb15bb5c59caa22caadaefe1f5de7baf45d55aabad2f59b855aed43b65fddb852259fe6d8002bae0849b99b933cbdbb95352f7de7b6dd4b528cf4befb93c14455916455154bdf7de29a92cd6a6f35787a5aa3a76be84ad6fc15d4333215c016447852fa0e4d09bc9b410dc29876c6416c5ed5b5b9e765824f6e930a96225cb97a8ec9854d1821830c814b6bd4296fe31a902a5ddcd9046a3d179afcb5225c9da964aa734eb945a6e4d8b46c3a269a120dc976912c5fac70817c37af0047532d4b9fc4cfb711cb5868d774fbb7a9b2bac97b8f316cbaf4e0027b7fea683259a75de2babaaaa6c2a5bbdc4d55f2c2bcf52ca7b5f94ea0bee9a1a9f18bd3c9d30dc3536700c7656870e89837570e716cca3522b69a75fd73b97742cdc997ab6d3c9b13c3cac0e0f654d55b0aac455b2363a2a1e15f5ee1e2e5159793c5f54654031b53f284d917a8003c57fa912b7fc64bdf52e4b9ef7bccbb49a18c687e7ce77de654aa3ca328e90270e86f3f2d4a5b2c0d00d0a233110aefde040f16b50e2f6788cc7a5e3136934dabdd5bd36eac49e677c99f8d31dc3ae86056f2ea7e68a928d32a5a483f29f84b10f5679be73e5a9aea52c100e14ad0d10af7a6ad5ebf9aabf5dfba28adac037462a988f817924be86c6d7c037462ef61fec91f81a978cfee05a7c28bd89f23cb167dad7599d8c070cbaaa6068483386e4fb725f321d9e2fc670027c26de50659b6be2a0e4f83f0061c92ba474bc06299e841e0f1eac475027b3f912f9eda8f6b7972155fd26dddfa6df68de61b3a3b2ab5cac97df3ccf925d4b762e2fff1b0dfc1b4cf6db0700bfd590f92de6371b35fcf6104238c4f439b8007c247dc4f0a387b17300b0cbb48338907706b4124d89522417f38994332da149ea110b0545a462e2d6897b09d7de7710d7266e209e3a3109ae3a310858eac41b10c2a54e0cc48f973ab10e34eac43d60eac4a11a75622da64e9c558963aaa811763900b8730dd89198988822b01c9f88226e9e4f04fc22668e6c64679d0536acdff88d1962ca1063fb8a0c6e31d430a386ed32de030077950f183eb6a964b8b900939ded2d38d06b30c0c8ef316e2cd0e88286ed2851f2fbc7bdc5cb145e6c43796f03b7130c0bcc7693f731b8ab70a1c2c5f614ef6be06e420b135a6c2b79ffc19d041624b0d84602837b089791cb7691220d04cf0f3cb69f78c1bd03ab09cbf6902136e8d4a0639b062eb893e81838d06b212db891a8b2b3cd0207b27dd33729a0b2b328a0ec092e2c029b9d0d8103bd223cf803353beb816a3b404503343b9b01077a18e8600b385b01077a415c0c810738d0fba1c20c7076010ef47a68e243825e02dc140770d6000ef478f0c01165676f70a077e3c6009c0539d0a3a1c9ef21aec1d2f0ac8c4c8c67676b38d0fb38d0fb4f8b03bd7f6bc382b9f6b22c28a61ce83dcdeac4170075624ce5ba26644091375722bf7739da83535c7b508a033df89688b299e4cdd8a8c2ddde4d7ebf4520f9fdbb711c41844c2baf0ac4a1b1e3bbc8e9f770d86e890eed431e7ad11d0a9f797f5f8e06127a39847833ef312983523a7be288bb392805b0c2dd1c14201073708a1cbd92f9423c0c930922f77b04ddbb8f7c41dff994ddefb2339f13c3dc0be0c5f5df6a14efc1f71c86cd39a38826ea4784f79ebf0d7cdf4f3c0149764e9c909305909d13270cc99f2892f9a8fd5907fc0a6c58799ff9b413576658e6f88a7cb8e0c2bfceefcc1d724218c29085912b0d3072869472527ae7bd55555555ce9526785575554929499214a78d61f2aa8a6acada5818fbd44a145b41c141900c850932d43c33cdb597a9feca59e7add533af099f8d6423512ca54facd00a2a2e39a8d58792f92e10285de458216409eeee772283524aa935a9457b5a56f69d0eb528a594d2773ba9f4167619b32aacb5d6dba16cad9665599618921861586fbd1406289884814896b27c99ce5b5fab7d4ad1a94eb5d28eacd3e599b24a6bb5d65254b5d65a2f4952ad9645ab4ea762a2e4d30325b8ac5cfb2571aeb753067b199f894f9b8c8fdbe13c46f1d2aafaeab3700208f4c8bc90a87a5e8a9556b6fa9a1d1655ac746c2543869580152ecd2e0b1f4cc9b28af7ba35bb2c7c4046964f29e74e6d21a0acb76cf5b34ecbd3e978ac96ca62ab9f2d6e55939492a2b00e13af91c4bbb5ba86047f4d508749f71e7defbde7af52fa6468b4d28c514f939da6a7f8d5f7dea3f451fcea7bd04ed28c317ab5b6cb60cd0bf4610c0689b93f2c8c8091e5a3596634aeb90c0f5edce93b76e6bdbc2955df8b9e925414fdd6d17b929c334acfa515e37bd21427854f6da811f1e1bf175f8cf661ec24cd2763f4f4a38f64ac3166118c1e0f7d4a298d74488c117c7e84db022532b516a186943421c22b514513182560aefd7376073fc2afcc08741c47a0fd3c58e1de2608c9ce09138464ff1cd93951028505db27e438b6fbd99f87dbf12e66843a1fae832ff6d38ea2c718a38c31562179abb25b1f2f39c6986d23c83ec66b2b1f46cf6201d4d0ae5666d7811cfbed5e51dcd74fb578365256eeb22ab7ab8ba34e2746093b9d8b5dad52d62caa526fad34aa72da58a7ecd0db308ae41487e4cd0632a0a0e2baf5721cb0deabdec7b4b81bc4ea05e7184008e1783ccfe389a2f86cf51d793cd7cabf41135a01cd14a87033852daedca009d1581e4fe7a5ef589d7a51b7aaf0bd990ab4abb2224ade10b0c405064e5caec4bd17f3dc6ba9c5945afac4b8c9540c19644aefd5f2b4d22e8d76032107ba3e178b4172b138a4fbdbed08515422efc7a113df638c1146f1c1c72e538943bd84631cc87fa29e62ff644149cf1f1c6b657270b70b53c9f07d92dcedca7e61fdb26514bdf72484d154230c062e9abe8e6f3bea6f081dcb0db22b208d1fbd896e519a1d5f04b303e66d6d1a46fd6c7f846de09df3c2771b1fe2982beeebdc79023de3af85ecbfe9f8427609389003e14051903888205c732a40b8e69fe4fef801733bde4758688106fecf9f944d256fe8fc1a031554903416ed72b41c1c38a221647fcd9f2688c6217a7f0b507193a7f79cfbb71a2df537cafe166da6bd197fcf36cd256fb36d1a10e4ead038ccf7a71eb919e9adf4c9d26f08c80e925ee27636481fe1e76c6867c3f4df1c885ebe0e0be83c653f7aa072a38c88cf524e94c300f210ee0c66c833872da3d234a7aca3b9835be25966a1ce3172ffc1060b777339394a1059871ea4c809b94f2e93e052e42ac277d4351ad7ac73ee448a1cf71b5a7cea30e6fef973e7ceb1e9ee0effbdf71ecc28e0c494b6c1e51e2e06f5aff19e93fd89e552a6646f2bd9b1cfd1c3bb4894e9577e7c9c46ccbb8df766c9b6e9b1b2ed3ddfc936cdeaaab3cc6563afbd6c0bb95ef272fcf73f222fc76773469f0c3f4cb6cd7f1ad976ff25eb25d9633873443ec3dcb71427d2ee5db26d3af72cd986b9bfb2ed3dd9a659d916b292dd775acacdb6e988508e63aceb765f7b0be5a9dd4bddb26347b05f7f0de72c90fcf14aa42e911f84f08903c1fa98c8d04a1dc3e5784cbc24eeb920c377ee880c7d0c1184ce058459cde69437f3e69127e5b97872e4c894fcfe31f136ecc523f366069940e694fc7cf8f88444241ea136aa70b7f8844484878e4f44281c4791ba44744148a33c7a24c0ede8d9df35753e9df33bceefe1351d70edc51bae6d0003376ef478dd3774f07056a2245b03c90e049e43078d77df349884388e193be03822ea37f785d5b1392eb00b381c7a7821dc0e79b1b4b8bce7e5ddd3e8e8e8a17168246dc3d55121b1953adb564669f2d1c4ed24d04da7c18f70751afc268224fe3b9271e7bccbed955d846b2f58f4b0d317ee9aa8053f16d2b410017cf0f45b1dcafda3bbbbf2a981388e9b0e020277c61429ef85deccfb612fe6de83bb89dfd039ae35911fd38c624f118332a628e3e2aeb170bb99fe0e86f161ecdb35302b0263f77d5b9c7f33ef0bd0c5dd5c193f1cc8df62579305112aeee18c387273f44da47b44dddd112c82042778325d9e419dcc36ade4f7f48c3c3b4a4b79bee4e588725e8e9993f3e409175c489132c5a7e46d4620707b4be407c1f090f0a8344d5a4745e81009000010002316000018100c8582c1503820184bab2a1f14001174943a66449aca43a220457110444118638c210400028021001864083373ba01195553a057c6bb72809a62654f876000dbda6090171c9dc6590fe73fa1d80b08909861deafcd2b61b9d8582d317a680411b76db0c7b85876b4600a24943a51d99265b039eb84d453d9af8d776573b652a8cebd8aad8c46337a682a5f6ac03b1fd7a2995b59efe0826076b9955f112001b9d5b7e61f9d3269e1ccb797a7f528859e583dc8844af7e73fcfdf35cf53658b4694902712e8a817ecc9a1ec4c1c99165613e5f364439de56c7d82757357c7a4086628f1e19783d5603666a68a904d60a05fb20ef3030f21621029b5c88beb8439234e828cfd598209e4771040c3f66b1c2b32414f9e5b7c9b090eda473aba1b70a38273274b7dfd74238ae594f16af7202aa3e5e3518a03da28de82a810e762bfd6b735b315b6f34589cae0fa463a73363d7089f50dd6128f484cbd350d522f10d21da76dd83b5b2599102e462a97cfe64f503cc15f5b4abd945049b9c2d54d565b415e0e72d5b046d468cf6140551037afba52dd3e54bb319fa54cc3592365740cb1f7c5d4d89be2c2849b8e964d2d683649f6231516a14dc1d3ed3b8b350930ee0c2a94d2fa4a1dd9b77ba92454a923c00f25aa03535d04a19c0dae011ea0230246ac8fb883d53af4aabac0237cbb244f8d241653493ffa9d733087e378d7d1ef0e93d753b31c3ad9fda35728638be00d510aaf51365ca46eb1788b6cc674a05222c027b3f2db9c19ef1016990cce299fed8b76827cd2714cd32b4200a4cd8694871ef6499a72673266fbf2692c7640517546af04de322ab26a6a561ada7e8b367b2cdede4a8e5fed084c214512a7ce589d398053f09535c5f62069d61aa6720833a398af5ecca0e6330ef93c5e1d91faa05d6ed5c7434090195159e5b718571ad3f3850966972f2eee549f5a6eecc31471bb9bc259c870422da7a911fdc72c84fd05bf42a9aff0f5c15c7957b5436da5ded7d2ef2ac1319173c62e44d2a163cad66a1eb393999459b807fa056be28e7344cec2278906abc91e7a26627caf1b27da2a56aa011411d94fae256a84da0700cd38e8ca99649616993061e56bfc13f07bde6f862ec87bbd0c888d3acc955938685f27a31ed0cfa697faedc8a0b78a41e0e2dbd06de5106d7b7a42db1e4d9c77d05517a4e868591e81dd64722bf0675dd73f5dceceba98d106ea0b0e72e39a0c30cea34ff61300b8ea0c938bd3b271b1666ef2082f25eb7abf8774a4873a0cdfcd5ec5e444a6e7527b908f3b488f352478b0e87a32748f68b54c481c8624bbcaa5730c288ca5305d48fe7d19730550f66e1aeca769fc1d422698392574c7dc171c5786b5e468b3c1f43bc6668a72200bb62cc68bee19bdcbe42f4d6fd65c83530c0ad8a94328986ecc818cc3b9f90f8307871d2a453e111db5bb031620f981ed5184ea38b1a2b6b8be07069d6d28014364c11ae499d9eb60b9af63f2c08ccecc9efed8ebca78b2989c8239b0a6de20d7c27a161022c4058a326dfc9cd9a32f46ac49e22d745775d6dbf201dc70a2fcfea30e454c5edd396bd9cc99a3a745732029c5b30879c1a94fb04f3b993454fc321286f6de2bf3edf7d138542a29c50dd9598b22c7783390ea4015d73e2af59f4b5d8ce0d36309c11b09d1e3f482c983b02b7cec34d7fcffa35759407b7ae21f1ff5cdc1b04f46f5ddceafdf09b8f9a98104388e72ad12e92e8729ca9998eb3439f6b4ae817083bd1b241112609d75c2b96233d42f76adf547273347a9587d229b5bc038e8e5fb3a87005fed7a2acdd445ba9d97faa7d505170768afa90a3a871efafb5b98d665c2dbd2d5f063d32414e3c789b7fc305374e44431a8fc4c28e53106390f07a05bb203b93bf667ac29b1dae5532981288e509ec8d3c8393f5a5bb0684c45fe00daf5006dd4f2468cf830b64c030b9b4e9e6d36eabb59885c711e1ee18e3e591025726aa3f574055928b6473759e0b5d6230e489d468678754d1d65daa845b7302cb0aa403191516953689330bdb94b42319c4ebb6dc6d132f4860aea29dc61c1902cee75a28528de14b09261c417622836d89f4c4231c321be12c56a76d7981bc92271bc6b48d5e2192b66f7517f9c5f7a2754c069c5a479dea0fd08a7106a9dffc41a8ac5386f5d56734405d5b0400f338f68346824146b35a0612a3c90f426e5ed36987d36fc56938b82ff458e73ff4c902395c29867173ecfb6eb34b7c1c157b90a0e18c7b585f57e584f9819e42000c1d50a009182eb380f2ff25bc759c1b6256edfd9f2d0894823a1d83a9d3999770d1060750b96d5d2d81dbcbcdeba5980c8791d67a5dd260cf72035ee49a7697b3abae82ff4400dea38f9e1c58c3c3e08a9fac6492826d568d5c38da8b7849b47a3240bd7661e8feb6f723a556227c74df183629c5d25a138a4d93661c03c9e69520ce33690507c822e33ce5d8ed7c54694b98f3c149f6312b539ecb99b6039ef3e6d2d5ae10ddff480de2d055f95e7517168e68a99224ba024df659eb9e97c7a55c8cec7e0cb69bcb113a16f72dff4820379263fc4f5f3bdd2eb78cd5fd18a4de400742b625a0e4cebac5978618320e2e4aaa84fde55036f6d0995b67fdd5535528be19f387d94e4d162cdcdf9120346d90d6990b9ffa175e0332e81daa1af04a3630a8610c4059ed0a2d2b09239b54a063229d88896b69b9a3e1f72669028a3245fa58079b2609fa20380252d86756425f7652ea6e04b21e1395a0989f1926547dedca29eb1afa2e2d70f93b486a217c37d3f4411f6194e4cf84a0c243ad35244aa1bc5201523b06b9fcf6dd0b471ec6a5eee56846ee5a25805d4660261454fc550009a21fffa5c39f180bf53144fca0a802454f646d066bb51d88fa320be17ed73c2046c51cc4ac1b9b3a57ac1908f06110ef49b5ec6300c491e3fc0b61468f6eef4c3f06fd45a1884f5d75444413a0082b58d5cd9da8fd2c68b2cea5807156876369cf174e94882dce0d2df6851d42024ff60cd94907564bcea4cf4c0e422b2c9f8f48517d24adc7588d993f6f6425d825a1e94f1263ac891259cdb3c282e04e42c1f888484e8e72a4cb55f6e2e2897112b200d2f7b46dc69ea9be5fbc7fda826279fa34c234887b61645b17213d5aa08b322d8d4ae175f2d7401f37b8222e573336f674ec8935fbc2b8ed3b0601c1e62fd1717b92943e13f8d59552794342f75485029aa2acf8a82ea5ba845aedaafda0b85560353d295bbd8091ecddd8066275907554b7be3eca33471fc2630342b06412a08bc4be0baa72ad0c8961696d09aac8146c7f7a1c92c1728a19bc16daa5d44a535fc30f41b38b6391750645a780bfce9581299e952818d3b9f01cc40e814d3ce5f23ce0082f80efcce45fa09b4a06caaa66d1914645b6198517a9a07bd72855ea06d421a8041334ca41f297b384e53158784ae59e1959735231921428894d69399ccc8d0824a1c4e244888f6e8b5581049b5d6149e7b36b9c0161ba7188b24d9c527b3d1907d7cff58aefc410cc93b08d094239c9b47038d31bb0fb6a58d74c9b822fd9f3faa6842707fe687c3b237d68276033376900d6091e95c3aa2d2f6aacfbdd0b350dc9f6b9e1b1894a72c483ef593af6cdb8c8e30f564af9d1ce2dd3e602d7289c673483d98fbfd9a2bb037d04b902bf04ead9bc56bf1f9abc2656aeb2278b09043054681ccf1976ac21050a5ab4a46f063e0c52bb2c9ba0751fd40e810a57459fc7360416b1470acb006d8d5f84482f90b47c6a756c359a99f1a62237d21df2ecb0313c371769a20bb1379697e99f46aae79094e4769d6adea8a4ac5298735ab8826b45f0af912e18309deced4da0b4aa9edaa5659a6b0e3b5399c84b060bd4c201a9081c2bf45289fca904493cbe6574421b9db50e9889e0fcf7b17b7cb163c0db23e17bea4cc5cf8aec7889e89b4893285fff99911019763b5d3eed1c590f97ed58e6035010e8cdd766b620d6b0e1ba1ac35d0714a78628a9e8417b61915385620721d891e464bb599226770a25231e46f5bce596a6cae768189db7159704512dc3a0677462a59b11935ed02e9fd54bd2547fe22fa942800eaae1a75cd01eee26a320af4e1dd646b392b99b92eea273cee48770fd519550ab1ad734608f1271220c7722cb4cae1ef222a1e43e60df8ede69d5569d4fe3f8d976974f91f34e737d4e31b785114453db615bd3248c2536fd447caeb608f123a3356bd593bd0cd1af0062806cba2dbe9390afd6a2fc2ebea2fbc7c6f0f63dec34c61f12bd8b61038bceb7f173e8e6d815f80db5c7dccb059c1180f758c7bec931e569ab02d17a83e4599483466c80292a26535039cf1b929a1b0d8c4bd96a3dd68b1132335e1cb3402ae1d080b1d044da66ae86bec84f3e38587e58b9c2ac664a2084218ee6647253a41116fb2fe6cdeee1451a909f37ce82341e54498b38670176689a02492642dae3d37277b77e9f924013d228b0a93d063c7e7b958aa16582795a7c5a909ada79bc4203173f2b3b97c6d5811c6cde9033e33e8ad3d9e82772c18e683d6a37156ef042abd1f6ee7bca9da32684c282893819a2d98e29784437c3dd871daa2813cb6b9dd3605d722d090e976e75520dd3442341a9455610617bb0afac747486505fa505c51de53836bfc036438e53c229eee9f7db7da459caca504ab3aebecaac4f7d51cc6cabaf92f0aa96d28c3e672960204a771d330e0a7b240db28b18057a7f7b959b2acc11b19a6e0cb30678508b03da3cda2e2678a6a0b66c2d35050904e2fe423b3b684a2c605405d9491b132564951a25e2a01b1931f85cec792f586d4f412e9e398e76fc9fe9da87596cce0d4c5aa7cc61b4371030611123f1636cf2c3661f3c5c108ae2e2348814154c158bf41628b3d3e0039b60fae80115daca4398a780d1f6c5661cc85efb0a01b917f1e3c4dc07a13694a48d86b799e7077d91031996da32c9c942611e102784b098d8b58b28dea9e43d195d34af01feb6386e53aa0f01c0e797d4ccafd52df8ddf0758dd0b307e07a6b16f90fc338c03cd3e25eddfd920cc5db22555223f2437a4a334310800b0be32182823d55410edde3caf7ba7695be3eba8080843bfc3500e37f290da0e71a0e9c175467102a99adbf7d9af3b24cd276282fa8aa3fca401a00889a6b1d1c20ae446752d7dad991b5d2bb0fa919acbd1edeb9da35ac86b03b2724f39fdd1dc9cc082b048cf497110cee441036a84ca5c0396b468b40e8cf9d4b8a88760cf1eedaa09910d48b19b65fc2126b33cdeac9af50fb68198eef555722da9753cc91759e3a09027b8de5fc8772b3e1d8cb1fc805db0c329a44b6e637b02724eb58a27d412f86f0bf3ae67a83bf3b13f599ba77358013f117a7810227ea9282663761e6aa906560dc614be3be7fd179f70f5231964d1d3c7e8f6a15925737445eeef9a4b153c059e3c27577c4eb7e9ad7798db23f37ffe2d57bfde1becf7107add8787c3fdc547299be4bde6bac5599c790020bc3907b13764b71229d1ccb4dab5cc4bae9b1d2eb258f468953c4bcf02d61ddc23c8bee365c5114ba4a97dd4877d7218c9b473e6517c0e7195855353112e1deb8605c967e32f562351da065a606d52ebc15f3334e34f931f618a3173d1e8601b71a83856b6a20888668f516041c52ebb47d3c105e0700f8813b914731b2a17dddfa3a57764a32cd8414c4b641ea8b4c888693af3c1b436f4d6afa3cf5837eb248a6924588370ac199eee32c12387d8a978d381ba322872549b1ac105b7c513a0d679b45526d7719336034e84e11e870117494dfc9063e6f149784caef3924f86810d8393773b263da9e11f4ac93899246dc2e746d3efdb0777fc6dba408a15ee33f7c1a1748650e2918312249c2f7e73b92079ee2836ff28d4d83039f2c17246fbb0a166dc71e218d9ce4acc640b3e24794901b68c2b6c5282a93ccba7e4c74e574acff26137ccddc7a372758242a44a53ce60941122985c9be1cfd1e9d92682b67b3419995c7f2b2a4d3941453bed23469bc43b43ed95d7fd76d223eacb4b316f69ade291dcf4e96a285853a0b5e2a1a7f23d05ae2465cf7108a584d28510408c97e4cec739f74c06bbd952ebdab2462ae043ad8434c13681330068257ab487ae3e6cdadbd62a1383c6a8efed2be5a6b84ccee43b3aad35661b66754518d111f86b1da5ff9e87c347b4a243fac287a0d0ca26a947b7ba5f3a2ce5c960401077bcb2954646e998c7bf87e71f1d6cb08198b601a5ba3aef6a40f63067e05fba47457ca0a577e6ed41a7fc440f8dc4dc81145482c0a1977946a80b0b1922529d988e767db45c950b97dbd145099017c6e07b38f53ee59514c369ab2923190d90e1c267637c851fad8ee36e1433f8cac9d32dbbfa2874b1ec22a8185ec8e1715e8bde65f1b5c65907bb11a50237f087bb4361e97828761cc71cacc3e48ee082740a7b8c39924cf9edd5bc273be4fbafbac05e21e6a91927af806fbf8cc843a6ee45a6000a7ea0cb7b80e1c587fbe3d9f6341fe5ecdcabf6c7a93dfd2a49b869ab76ae9091436fb4be0c86ec6605a4fedfde60855488372408274f934a2c063870ce4d0ac3186e7cc57b4b30b8819bb31b51d5bceb6e486c523fcb7f14bdf29929629b1495cf008340e30a7a96e3640e9aa9c8d94d914d58c18879e0f9ef6b6c6c454dd24cb36c5e68c57041aff8550e96f72bd8799ef758bfaf9002dd62adc5ad5a0572c6e46fa79b9bbb9f4455bc75d82b580068b486a08e3742f5dfc3f92ea1b83df2316344d0c218fdddc6640a052021f6aad822312d7638e40b173f52ed1db58527f0560db5745de42da521fd4513052288c1bc050af075205ec14ec254df28cf38a9eeef4b6908fde0765f19ec6b125826be09e5531a2a3a1e74ebec714b6665a4fcd3a1346409c5decc0a7f61f1a7cee77a05fbe88470560517defba2128c5dc1d25364b1033d12a62ed48f916b32d73c10de529720e46e251ba212b24ea508e75d75f7adbfc7aed564c21bef3885fb6fed3526b72a089e80f08f3cc745015f22fab41398da4498735f810f6f0093754f419fa9ed501a7a8da10d448ad3e327b7b0a37a77bc4e47b079058bce8cb47e8581276ed73fb4c745dc5187e5ac4bb35ee0c0941dabd2102e04be73b2a2f6af60671cb33f20b38183bd824522dea4970cc5b81d73d3f19f7c1e0c3526787216ad05e45e79968a04ccd2ba0731b3cdd59e214b657669c71f22d5ad5b844dea1e6caae90530bf4c19edd55b295d172671f561b0531edd76f1b7942401fe83d943459935407c483edee18ebb57b0463e16aabdaef740bc82350d845b3b69add0ad405367df7955f365eeda6fde6daf34b46e4cf5b21ae5cb229051aa02d69d198b8492be45ae27aec517f77bbfdf62a387667b25f406833b0056ed637400bd1e4fc0e9e6ca686531a2046c4ca6e9232e9da7cc98dc27ccc63ae845a1e65ec0eb26885034f77c08ba8dacd381406d3cb79249fe075653e4491743f149202c90eb99a97513f6347d1a6177ce61725442222f9b82c29f540d14df557b74309231d3add8f3b85b1f9b87064ab5ee86acd30166b37d59d39c0384dec00647f7e1a4a0745b159d3993db1a98405b2e77f3d111365b98a774250c0fbc43f029ddfadb582dc39ca96ef1f1889833de38cebaaef92aa79e08f62dc32dd876aceed01adf9fc122ae31ab0ecf52008a1584140ce4efd468e9c2d4b8b20a8429ee537024b2edb2522fbd899cb41f0750af0607ac5e4109099855f9e456953dd8a6d9a98f60fb4aeeff622256ad7b36484b108f38f674440ec0832e7dca0b6a806cc19304227b84bb167eb736c0b398dc2b19d83d31a5cf0afcc54ea5fcc39a9848a42045ca5245ae011315d799b1728ed01b62d9f6e33d12ac2d89477231e80d8c282fa466e4a6b6b559e91bbb89d47959156e33dbe039dad6d1882a2b03680df108fe243b91bcac9c31ae49fec2a520a25460d6b39fec39e533581b1859b74708b4fd42b91d4b87e297233662b5d94b9af3ff4e7fcff853a312e1db0a03b5ad1d4fcfa969acd5043d50622695da188ad7a035e6b72b6136bbb33a74236c4a56d92899364801b48565c270a9f76d6ad29a46d89bbb6986dc08195a0357d59b38b8b12c6ae12e6d584456ff55428d10a46d5cdcc8f79b1bff4029ece2706527607520c46b8736474755632560e9eea6895298b62bbffd6de9734e6b7f2300338558de4f9dd38a8f5581d20666588100a0f6f38e7e027ba9c86579a700308bf2f35815dc3e7153ed52bbf46a8591d2ffe6c2f08c4ae0981d90d51310413f2b2788584de951cb4ba000ec3b8442dfcb1611b474d60753bfa924a725718237fb703edd5df8959613337c9d134994461dbfcbb295ae8854754702e26cd35b40103f3e4ec2396bf557b5917b5437e21bc6c792ddbe7ea5b525d7ccd43f655571f938f06548fe8c46792e6de8c71e445f220106894fb3f44cb36bf79d84ae314b53ef1c244b0b5a58f0af30eda52e73698663f76e9058e69ef90c7bbc752e7b70c607945f6aaad2d3d3208345f4a620c201dc42f7fc9ed95891c8f0156c0e8d50086f34929d4aaa0ff6f249b22f0d1aa1713421f163c8ff989891cb46fafd6234f67fd0c2de004d9a5ae4c043e333bf19cc8cf7b63237a54f58b682b52b0184f0324365b7b946bdb3e4b0c1cb21c619a46e88bcc724acd3b6cf0cbc0eaa015feb51317ce7d6c69c13a6ecdf75330d587dce6679cb69c79ab1481af14dcb9801813a726ccc0880c317913ef7dc36ba8794758505317f564f938933d527d66b3c8e1299b3886e5dfb85c854bb0909615b5545497fdbf4f062996ddd4fe192952ee8b5d893faccee6b0b5490c1cb80176547fe988d3ae32c1779b17221085c732039d58d247c8df001559ca5bdfd561e3220a3751b1e71b5e3d779f7d1c51edb7c3b8147862450bf7c35112fd8fd157f496be2acd57660b1f48ea996e52a1a4a989cc3edf94ccd1327af3bf9841bb497484f14993c807550ca87dbb1f835429bc0572c0f8bd3c2d37de49923579a489080c67a743b57f778fd33b050d8cbe1cff84dd421c3c8c0bb0f2b0415aeda747216f658f6f4f5ae6d1170f8cfe571cae17f08ee95286c007e7b2cff763c5cc9ceaf45bede9eaff6fc67ed5aff9234630ccdbd11b0f38e0d2f75ca1621098d00841bd59374cc6dec634469852295d79e54040c275f811633ffd4f1c580c4d3a53718d9e6f6c97da43f9ca65fac87f2cf17d6fd8fb7941eaa0f47fb1863efa193ddc54ca8ffde216b54939b994fab5627c318b36287d19c52cea9804b8475aca27cb01e67257d04d34526e58c5bede16b5fc43ab5fa5d57244b2c3ec5f46336631d803c0df79cd6970f3d3c9d4fe144a150e4a0b8d7e1e65ebf56b80d34aafe2055be503c58a454f0145522160e9d880e19fd1043844ac045c8d72a60de18297f12616099fece61013a9e7bd10e52c49c1a2fc0544c0352fde70205e4340f79c1fe7c414377edae696cddec7b2f76fd7e9acc1f5e793feb073d3c44297f5141d86fdc6092b23517dc05ac6453dc99e253edd42d394fa1c8218a8100a53e8125484b57645b070826f66f57f8c08e4d75723528451cca9f04c0de72045df123e21b824b7d075297239c0fc36089e813c33362eac38f8801ec6a6dfa6b72d7551aab678d9b06a96781fd3b6b992b3d5e660ab670cd39de80d3bb5a1212157f61f470bbd65ef88ecd4dda727701eed42577ca9c00bb1870fa6dbc67820164d1e5fa3b1a0805669582c136ac584672bc0d32c739c6e78d269463606f86c385dbf2cb7c0fd7a795fc0496d4ecda93f31c65a6067fea985eefcb7a350adbadd6d594b214b384492434dd9f878004310cd4760853cb330d9f8dfc4d3e244fec9b7c1180741dfb9f21c25c18c06d7eb184a7015b8974f99a4927fc2ab1bebd33675f278efd96767855e6a48306547d5b98c716604d6e9d5c5653a511c97d4957a4b944490742d5212662f14e332862705405a41396015831110a087f1abadc4b4ac16b0440d7d2a26a4d132ffe3665620e660a4804ef0914e840349f586990d0d7619d2b0ece56c346da7822d6edc50fb9c17fea547ededa6ff023d7f3082216b251d2bb55cf09cc00eb04aed813286bf98bb90681bb74fd8fe6ff86e967551bc1010291cd4e8f05ed59c0fe7edd997d0be18e4cf78af704e64a64f95391401b2c90e31cedf154a439d4b6f5e27aba8056b33fedc46b8a885e1180c39380f8e866610c70ba9d2735e41e8fe61dd7cc6eb9d56d9248b7f669bd16a7f81d745bb6cdf02b94442aeafa82a4812c81452132c56576bddee94e8c3b7c7c57a7976a25628a539d2a45bbff9449ed4121f1773f64d13b96270164dbfd4f2220c5ceb0ae531220185dd66f83b1f5c74fce1c9e54804ce007d30c20c63fe71d97c8b897bfcd50d789a70466cefe6a6fa8d8872e4f8287948e21f5e21e854e5101fd4d360d9ee30953a35e8ab43ac52c9c12d5a2e00a1f01549d17a2a82cf1ad88783a26e4afbb00abaee7fdf4f7ccba729c6355ae9b3430006e6d3581c3a981beacd4f069adf78770801cce00ea14914767c05d29df6bb5bce0c1c57b4e7fb2b701c90e3458b94cb97fba27169df13af8ede1899943ed92ecc097b4a26e6feb31fe1418f06d2d3527e45d25a31837b4dd9f901159470a1d8458e9fd09634345944b3862c0eb7bf265e747d20c6ac117118844aa149de40d93e83bf4116206959efb045fdcce3c5b5059f90fbf037a72e6dd826b71cfbd83aea37ed6f9eb07e3a462f86d92ca5cd49eb1d7d8ba8a459f4a5678daf6a78e24e6e5896631737ac1a36d06c3677d07878ddf3f2572f08a36908109f7c5e046e4b321d2f2cac297bf81c1b8d56e6e62e04cbb43d4e222bc72f401e4acf57732caab63820ac6348f714f132aeb85d7eb69d043dadd499896f7454b5cb8263e48908126dbe02bc6215c379247c1b192b5c52c012cd451bc22be8bdf2869c2c7d449a287249a96fa336426a36c39fdd2e7fc7de68791eef9ea81b1608f5ff3028ea020f4392bd27d1565c84d28a42afc07fc3b6ec127ce3d45269ab0a85dc7bc4de760141ebc2caaa974520d4952a7fa994aab4f8c860d1147932829ac563584df1c1e09c4260ca5075e3e606a25ea7856f2a8d19b692dc7de8ad521647e41880ef3f573b844356ffd5d9c027d3c255b085cd284f882b820135662d883367ea0cc1b9aa1029bdb8e8db83df216bd837c65760ba78d50debdf9f0d60fc48e4db71877db04938a1b9972f1d76f87988e4c8625f57b03d2192482ca412803ec7eced6dc5e6af35abc42bd99c0df0987c505dbda15e4e299d74dce1196d0926252863be49d7e04b7f2a41f09a23dd0066c442163883ae9d09b6789ad1fec35a5b27fb7ba6953ee60bfcb52e787065ee0b70b853db9ece8e3bbbd5150504c855c7220ac2cbc547a70b9c7f41d0e530ddae1d172801cf1778a803cf30406360a11304014cceb047d4b3c8722e2e3c9e462b3a156c4169349f9604011f5244cf09e8846682ebf2292e057810ab9ea915aa29cf80a1c4ee1cd3a2211808c85f0700ee5962941d81c46cb13d75f1ade924ea99715c505acbf4f0bf0304fc9dbce0c66c342f73f12cf00f7a718e45caf216038996cf8a41937d6434b0542f78cbeefb6580aa9d26d6e0b48fcc51a51c25ad36e96c3b8b98a3042b1fb57744861e0685c9d6b197e0dffb0e6186c6e944c2b5f48eb92276e4c947e5b0a5c6ac10c82ca19a4abbf00f05b9c48ccb39b2d2adfb0ea932a0f64ce6d946dfc5760455f40b0077e8991b831a9173cd047e9639d9dca90efa1b8b32434708a4232626dd37d26a012dac1d241902f8e827c33672b9865776259fe268fc9ae13d7dde975aa3548434a349e9e5702f5ab6ed4c00cc4035e79ccfbf07ee03dbb5b3c108859ba00fc104656ab41673fbcd2081b9af6f7ab6fcecf0800c613f08374bed35f618b0e87cd49b1a04b89efe358512ac50bdeb091cd1d68390968aa0452701d036d2cc22915035dd55380f30c69d098e7f8bd2f508ced72b33900b53d80836dc873846956d8e5e2cf2e1f3810297bb02120617a094ddcffac0ee6eac62a9dbe01f3c9c83faa11b0a27e382bb930e242ac12d6e5c6227de89a45c87c2c574d40c74b02db3ff716cf8bca3bed254d0ab1df503181e95d693d1efc0f6881f207ac39c48fcea096d04acee4a8996cc3c66e86fb4af3f94f60312daffb51563da28dbbf4d0a0ebb5745efe9c119ed7673f247e9a0d0e0979671cd0bc153e9eb6061927a28a82e804f0e9f23cd89999313df942b090cb538f06b5ea33199e787856775e7dc1db395494466afa0d99cf4fd797607cdc5a595e33aa58c53b78346e6abfafcaf7bde0802850573cff01ec4d8652a3a692d95dc09995e4bba1483122a82477ee01c25a65cc50eb071e29a663513ff5f97eeb4ee8d5c5ee812cd3fc6972241968daa04e8c2ecf807aee5c0f530424bc0135decee43162c17d4790a870cf27dde02ec38bc618336f373e95174a573c1dd034e8b452882844c2081b57d9d60d3be2b7cf4b9b7dd32b3aa33ac3cc2cd5abf45482e0d417da2a494a402a9e419988d6556cd2a1a4f05c13445d1b75ef9ee88d27e36308d6b225905df20d1096a5807c95d87d54a339c842ceb8575a3a9d0b9a255d73b40420e330aac7568ed6a20d2c92a2314a4e96e62570264b027b026401e119218267c9e908c4395997ac4e985e469d7a38c4d098099111db298e1524ae3fcd736a8d8594d4d0bd28d44bcc7ce7a4412d8437bdf7aabe0e5b65300cf1614a8ea86833f7fadf61aa5bb82b1fcd61daad2f0de3c092e3cb09d33f979cf5a08a842972da9a501e4af9aec021c8d4a5bb9d2e65fb0878ef406278edd770bf6f98aec1195a7069053235978aadf6bd9f3c82f62b928a22579eee09d44fbd3f8e73f40d16f79913225fa2989c26d5f7c0738e0936cf7a09750eb67a4d06de81a907a7cb3769602df2f587a7766ee460e3a604dbfb2617e91bc9fc3a47fe4cb43c2efce0b97e6c000a4a866f206adee3245f62fd80944e274cdbc137baabf88b88af29bcf8a044db1c22c049b623bf4db08165c06d0e7d42f1658e8a77d4f75e1ed10e1850ed544ebe38228526840f1a2f921e2885454e14f691671d0993f9d82eaa64be3253282e949335a06a4673241eb1a11f11e714841388885d310ed124fda4f159ee1ecf7ef684e30213847bcb7c85fd01a227f64f7a181c6159ea64e70f992d5ad21442be5927a2df38045208b0d4a41f00418c50632e75c3f84779ca0675e5585a0870aae52fa5f572c40453ef9615062ea4b69f3bf0c2e877bb0a02202fde2558b84c3a1cb8c90d94758070c773d5b8358104db2da83d587992430ace88dab1cf20927da49893d5bcc18fb4893ee999c46a89b8d5fb98cc7aa5e38239c3b25e150ed040ed8a763b10101c6d3bc0a46d276db1b0a055194b58a05040580de0908c2b66589052b809128238b9dc6784d4565521a94113dc04be48c97416582869f19802e1cc543c2db78e779386af46c7f3705dc0d44ee78ebdb21ec498566ad47713603e82c6e3167eb89e2d9eee5bb41c3de42813b89fca3ea6624f9ac75965da33eac52b05f9fd2f74329febc5cf5a237ce534c8c7a5722e2441ecb7f52bbb870f9612ef94d947d60065517545d511587ddc861ae79d1f37c73db31518524a2562d5488751e25f605031deac51ee343fa34e49c36cb4f967416ccc7f8cca082c97bb760d7fcd75fe4d5cc1784e562adb1f944069f2ea3d9b7c930f1f0ead184ac339e1c2c1015de2e80da57c8f71f0c3d176e624b95c8748bdaf71cb80606dde93880c3f76566618c09dcf137e9347e353a4a08c457852ec91a02d9ab1f8ea280b7bec56341db1db0df10f163c5bf2bdfe466e1913c1bd510fc326627e55cd6775ca8b03dc8c072f758d0a8d8e29899598f917d7cd7f102d41b36d99eaf1ba12a92da8ce5dd05b76ab8a6b4e769f5336c3d70751b875917b6fba13d1ff4ebce141bb36645a8bbdc3ce40693d60ed1239f4f8b44f56ae7a5da48ddba6c6fbbdd9d9eb266375b7853fa596811e5c95e732be71fc0c5beebffda6931701d31c7b1bdbc99637a0b3603f23200b15038eda0aa647fe68a19cfd96b2962338a3ffb4aa3b8024fb004a7111c52494f435c09c7871fc089f6c0043ea1452dc21a04e4e9c816e50f177b6f5fee0026085920e777af824f74418b555c0f0b86c53234e80cf5d1280499672740c482f105db9d56293fdadcc33b1161aadf3e6588f47e0df886aa60601a54e3f5f67ea1269f86e007dc13a1cf00dc401885a31028d08b2db8063fa5f25ad0056910523d2f52bc89dcbe769ea0f1cfe3dc559a3ee0a38a770f90784895b8eb5099b3b7da8bbfc1dd82c50448d6987f7b77c02a6d14d550cc3d4a736663dfcb99c2c162ac3792e3e3c801b947fa26e6d2fe541a1463d50bf047301a21513872ed4d537fab3686bd7db80ea410705630031391cdc61a44f835e5ade519dba13de141ec1bd7cc66ddacf0276a6a7d785da29e051142d12f8bb5421da297695531bb6659a71b02540fe1fe2c82101946202aabbb55e5b30cc59a539cc1e5a3cbe436a9ce6ad189c89fa41a8a483cc3b243dd91c10e86b829277545f3d7930967f64cdd35bc7b796a4bd8007983de22d02de28772a4792abfb3d28b10b3f096fb779e098e7ef665b935e5ada2449c89652ca90058f0593059b67a787dbeefa79616161617d2691ede37708cf0d7285d4a3fc3efc0e89cae5c7deac37ddd58be131f4113f2e6d48d061bd5ebd90a57f1ff638f53bba10c1f69e17af5e90eadfd7ebd50b36f4efc352d49e0bbbaceb8a64fa817e6bf7e9e377c8ce7d3a519c6138e41a5d7c3ea28b1c7d5ee3388ae2388e432239baf8b42712853dbc769e1d4fdce278fb6bc33a5c0a9530188d170d1e717f7b1cbf194f58c96e8df7c9258ea6b55b58b704e01dd2f387f7a98dd50d528fb65ae8f973949e67b05b1789ddba4f4376fe1934766e52cd3fe2a7454a4f6f0aae14cfc520861e2cedc86462c323894b3129a36b85e2aae859e4cbe0002b8d678b7c3b873d0ce59e275682fd3d6d93d33639cf6e9b58aa0b33f5977bb53267fe14b16fdeb18d7177b11675f746ff7d20d4a3eb02049d4ba1d2c56d1496ddffc0458cb101171d4ddb04cbee9b3eac132bbb7f82271cfa75da62a1ac137bde0fa1867effda33b55d6858fabd01b433e8d136016174dd7a6ad778316e12ee5ae11d3a617bd9f33ccf3b327a9ec7d96cbe90925149d6659a2cc7ed40e9b444917c5712f86991056212ecd35aa566e1f9b492897d5acdd4207a3eb52594f8d4deb03958f87c6a5b28628ff48a6550514b521c581a9675c2b24f5833b0eca6b5ea56ddcada5869b5aa48b7964fd566a34e23a3bdf7dea5d1fe25acd4d17296c6d2db3e45dd6ab5daed760b4b5e7b987fdb38f5cc76eb268db7dbed66b3cd6c335ccb0f55e368564e65da9fbfbb753e45260fb9ae57db2b0f25783755cffc3fbcaa67cfbcddce363b40115b7fdaf15c2d6a1f2395a9f6fc220f4f2882a3d106fa6d9475cffc308eb1ee993fc671098e8b3896e22494bdc4ff7012cafef32f4e42d963bfc34928fbce7f9c84b2c37e6986a9d4a4129f1f4b5526139f9f03ac746b355dc35a6ad2cfe7f2f3e3ab9ab4f3f9b1983a032b5da92ca3cf8fb12a53d14b65a9ad9bf574b39e30999a04fbfc360a675526f333ae6159fe72ef5994d6b886d5b3f746dceaaf63f81b487491e30d31177661163dd083897ccdb6cf81b8edb78695b81b6783aab2fcb79a4d4aeb9d391abe5559fe8e5665f939cce11957eeadf5cedf81f95c4562470ad1f764a87af5b9ed3e264a74b48ec62496ff431e12dcf69ef2e776bbdd7848121ff61071db798c766c369bad67137de833c46d178b62505050503eb0a10f4b216ebbcb8471348e56c646116c17faf047f4823a2db59be21dd53df3e35bde9f967b7faaf3adf6a76714c1f6a00fbd0e493dcab947cc50f5283f6eb33bab1e5b4705f4f6d3cee69d403d9ee822479eff9ea787e7f50212b517a44320d03572e5e6b8873f5ee5f287401d570a953e3f6fbbcfa8814fff31c3d838bab846ea91cf8743e2e53af4e9e9e1f5d6ee99ff76bbe5e789edec90b1d96cf945d8ab1437bfdd8e5ea0a0a0f2bbc08fc6d1b05207b569dd169b22ffc8a9fa918d5393b6c9a5d66bcfdf69a94750573d7feed0f4fca19996647aeec4f49c9f67ec6c4676dad58c0891e888a8a87adaade9b4f875a1a59be4fa69c56100b21f242cbb5daf758825a4f37c7c2f542d53cbd8149ed7d9f7b88bee023144bf5ced96b12cb83136c5fd2524a4f3fc2f2f540dea96b15e0d2be51b96ddf2ff3c91f22de54aa84a1d0dcb6e788c65d135d914f7cb205b85ce43a167332db95bbe754d3de5c6a417887e51d0d3bc4649bffff18ca6a6b8af794e536ff5c8c4baf1e052a8cc6aee795f879fd7ed18d879278a1304b933f5c88e2eb833a3b86bd7bd97df33b9ac7b5e1a56ca4258d9fd364ef988a7ee9950b369beb1e99a2c8b2c040addcc2b61abe7385afd663538329a7ce3b272d64d3a436e34563dd54c5e30dd8473193fe76cf36845052b342bf6caf77d25c6fade192664dd86d8ea49839473b6961bcd2a32677ae03c1263ec716dbbb5b37b8e1ce9fe9171347d80c0caee9b9042bf58b6c7fd403d9a418346b7e5a1c9eaa92552eb617280226e9b049a1f5214c79101dfeb5f586511b7a8ecdc309fa20fb768728b5a60e2b5f3637e1813612209fe3d11e7754a886091f8b99901c6b9454b706bc4473bfbc123c43fdc117db8ed620fd1f8c2761f5b423dcacf937fc7b03f13e2e786e6fa21febd10b734b3c902f1c52d68b382eef51637e87b6c0ffa31c717b6f77c08247e7cbfcfe88287dbbeb96d02321a5fd8cef31ea847f989783a0e2630e39e23d4a3fc18acb02d2d3f6c67f6af1c4386558f902806fdf7414241404045a2f6606c007a463fb717f18a9abca23e1ce715dde1a9d85fbc76d88b24bd1e4f8bbac32d1050a54ad7db5eba4890670ca12704f243a0ab976e06e1a74b5f4872cf04e19ef9b9a5bd5e28d837b5b096b662529ba66dba677e353d3f08215426db7f86469284386ed9d1534be40b6d045d262cd88eb6f7c14f6c5a22c61e16fbc68a8221271ed97918a73d0afb186fc2f128cca43dba639e58667e3dcaff227cbdf4078e2e4410c557e542fc7a859e087edcbef8e24ce9ddf899269cf66934feeb9718eed8d65a6bfdba6ad082de07eef013288cefc0f89f6f845d3ec05eabe4d0c0aecdd32824ff43d708c2426ebfeffb7a7a88402e8253543d3540d0131528906ea00043c4aa011020924553a92147327f2af625ae17403df3e8893b09e99ef972fdd6de10ccf8e0c64d71ae1fe97957086ad203ea99633ca02619b12df8c8b88723c79d67f4489204c1b1c3fafb5ca4d620f8fbc1073fd4dde862cca1e5e140f0234df013b5fe3efdf1a0978bfcbe4f83200886600fb73ec69073dd6b24edcbdaed09a026698074936260abb0877cf770e4de6b247148819a1482eac14d9af1410e43b0f3f967ec7c8e797ce4316dad1e65eb344763f2b70635c9dea8a79ddd184e569ce7ed0d337d76933cf8e0caf2df3ac722f911417389a675b2a6d6b63fee506ff132eba19beebd179ad67b9e9dd748eef09024f97a9124c9236aad7bb82eda167a7e98f891a4388ee33892a1abe2f153722479c4914a4a4f2d930bd050c9014551144511c418638c3d8c7187bbfc60288262500ddc7f5386e430638c31c6b90b7aa2dd64d9e1038b1c30529c94a8806548017860d911e6ca98f2c7151ac6f4cb6bf7f9e65c6bee6aced9c4782afc7617417f026a07f273cf1161d1f83fee3fee3de644537bb4f74d4f49b83035965d15f2fd9ea4e4f4d4005bd4fb265defdf889eb92f6776d9f7d358a9c4a1d796260d932f9e87adb250f5b456c5b6183b6371b2acaeb694949013b171af542950c28d09d8e0865b3d6be738174574fc1cbf1dec80bb0f7fdff775994c69f48c392fe7bc7f54a6b11edddfa9b3cb7bc68674b3e7ae0a7faf3ffcf4f7e98ad46b5d42fac7f8336dd979af4d9bc6aa4a2d30b6da763884a1d57225466750a5768923a30b8a4e1e1baf6572403d1ab1b2b9e4eae992032a53fd189685956353fcfd7d41f7f7cfbab93f12cd94c30acd5428abeba9ad63e55816775653dcafc3f5986bccb8d3e9b74e3dbaafc1959ddaa8a8a81a757fc6d21267a65fe62d1b350ecab2f3a0e3b7b8a6b984d65aeb01fb2488868482807e4a9f1e9ed80eecb55de42886e0a7bddc71f8d6a37b047f8b7b7df8f2c5c8979b44d5535717b187d778d8bac8d446097a7eeede1af7292c106d252a8ba39ae2fef5fece6c3fecbc635bc6b5755e18ca90510a9596c63dbb19b5d36a154386ada796885165ba4042eaf77d9daa5558f47a621705b9be3e006c002ad3ebebef54d8d7172d0bf2eb9316867d7c7c7cac8f4f398ee5f6f9108b4b58c93e453d3de1d287688a8ff7c9623d3de12d67bc3339760bced69fdaadbd7f5b6bc7711c7f83200c06fbd013456eb7ee12569af154d6adb21c4928bbcfdf2035c9e7f3eb6d9c6ab72ad37d1a817e839ee779fbc3dae26ad8165de4f88d1f09f44016abdaa82acbe5de58218fb889bed8717f1d5bdc10d62647af2d6ed8c333ba007acfabb1ff83c1fe1b15f0ea30f3d6ee1310bf43e004b58a160f27f4f2a11c68188a98dfda0960c0422faf68288a970f9100c59c864d01880f20680d520d5aef0accab992baa2df4f2222a342445cc69e021360079426b883a14a982e2bf9c4611155a63070bc5e6e77444122df4f28ac30e68b845ccc1a91b35352ff1f2124350cc69dca639488c406bdc2b55a8be2b30f796f4d0440bbddc8ac982863b22e69e0f5f7eb8a1616c07f6da2e7214397ced58633e1e14199a64a197d72b4bd01ad762ac3b43eb8756147979655cec9edce8a2bc27f7e2879dfe4ee75e7c93fb9d5b75077ef79ee7bd8d7e79fa1e741ce6af7bf066f58eb3dd4dc248258475ab8f80ed87a01b8969830e20ac561aeba95b7304dcad155610ddd60384d568f6d15ed8a9dfbb75768031c698bbd27b0b0c5fc45bacecbe97d90e345cc609df8088267e935a2ffd6e61a5adad110cad9cf33c4f3b03bb3bdb029fbb352890dfeead17d04cad976efffe0e3b9429238410562b34533bebf676dc3bf36aeccccdc50ff13572cf2c5d7f6a677806756b6ff6fef4d6f89758765fe23db97bda0e2a13eef65e9d57f5282cc591fc6a95ec16eea032b9ded6f0d63def567eadf1de443d7f4ad453bb75f5e2769789b5d4231e36064dfce682d9dfa7f84d0795e95e55a6ee2f7ed24cb51ecd746fd1fc423325eaf853a2fe5d81a02982ad6367e9d7ab979e5e315d73339714ab3059563a3cdde7613db21f84f12dcab2d65a6badb5d6e25bc36edfdadff6de7bdf72bd1ad920c2ad310aa5a22c152d36e040280b45b562c5616b24f4558462e5de980b576bad95b31c874da90caa6e4089422aaa14ac73d8dedf378cd8afb5d68e599ce5b2ac94cc10464a181f372b3052ea514deab85aaf3a0e53a98d8942391e2406d5e10c941b28e4e0a10bfe01cd1639dcd51c197ca860e0e098a11c27e23174433b4ea3da8a58b2025a03770902f3324846b7b734a1a19da9690489413973733b36a74288992894fbebc47a9aaf1082621a952a0b0a26a0353c1e51507d57d8d756d6d09004ad91af7c41bda921725c416b785523403db3de15365019dad45866f5eb0878ffe9a008e8af91c7cc50ef3f53ebad3b8769bb3385ee596ecc4d1a1587295a5cd01a7808d47b1be87957dcc7286cfbb9c3a6a87b8a82aa8daddf1763fddeee764284b5cb0a6c186ce58043ea4cb718f0a892426b586b4b085f2f9c41fff400ea99411004c1298b6dd71c7b96d31da735893ff0bdc75a835abf401ef4d21fe40a22f5078d1a04436ffc16371cbfef7b0d63834fb7502384124c8e20f81e07ffe35b707fb9c8117321377ada6ae923b10ff991d05549dcb9d095bfd7a3fc756c9103c62d1ae33062b450b33d0d43c3a66b8efb38d5f4a37be38b6aa6bf74a8c73bda914c6d74182d102085c113c5298ee34f180269dc61bca22ece1b47ec799e478e6138ee8ec9714c4feb0f59fc8c4b1c47974b74b98cead94f0b541617b029fe35f4f561dc24a1afbfc14d8291f8fa326e12d1d7e7e026ed0ffafa1edc0a54265789b740f615b4f66600cdd43dc23f7c10e883f8f843fc087f21fe32deb4843cf1e789c7f1e8056f016f5af2996fc27c1c8f163d91ec4bf0a625def946e7e378d48210ecaf63c77c0e64daa6af9b3ac807b9ee26c8131798f8e7df83dceb26f811d97f6611af7745682ac93eff08b2dceb0883d1e96432d3ceb0ece476c795e5b780d7bbc2f4617938241548b68a9e874ba15277f944717e1f297edd1b3d87dfdb31ecf0533bcb76c776089ea7895c23095a226b4118f8752471fbf7b5b8200882a0fe0b581620d414f973aee0fd7ee8eb089280919ee7799e07fb908888e4767461fb1d5d7c23496271dd8e53268b786e6ce068fb68ede8e22b2d167fb8edcf6d939d5df187d71e12cbf6216e7b588a43bc767088137d71e3d43d6e5f0c79d04ff9b5872f706c5bb7e391222e6ea27a1d8f98dfe2ce6e12ec3389cf6f692e60ff71a22f7584b929d2bd23dce7c30c12f1f4caa58d0a7a42f0fbbe270d361b0c185a23c1c89cd763a7d536030bdd116c2aaacd8ad3a705dbe0386cff0234dcceb43db9685dd6236cfe04d91368ad753d92d970262a2aea7f700823a0a86971a216e741054e7cb9595d0c19b9e3f27322d8187687d3530cabcc11206baa55290f45093a2a2a2a0ae9c44a48515869739d3e61cfca1c352baf08e59bcd667a169535bbcf611b35675b257636b3b3aeb18cf7f071c77126bfe8d561eff05e128081ea9ed5f2a4d47e5d2fc0d2e9d6bc5df64eaf54666a7a8b9bdab88004b6e370c761136c6c2f508331c61857bdcbb7b47ad2b0d2d6f59c615f5b952a9794386b8d9a4a4e2f2d2d2d6125eb6469b6c912ee6896e6c24e97962cd2d2d25216d7a5b6e3ac9794e7755cc7853eb02c3873888410a2e889f5e8048ef4fbd2fff97fe20756ba596b7e8004037f8095ba7f990c3bad37fbf45876bb6da9af37db04dc11729df7af398ec3fb7ae972d7711cc77de6b8dc19a00428ec618c45b03def2e7b9d19a535e6300b43c42162f6654bc98c478c23a654cde6c02112d5031c42de2a487020d991af95dc7158c55206df95128343cb54161482dc9a966c40f243cb8513449004886c45471aa05eab744cf5aed72a1d58e0287d06c8d2718a2ac34474b6771f7f3af6fab10654191e5f90fd9a31ea117ea31c74764d5daeca84b4ab12065586ffe70706ab4a690ab2e314f5083f006248a1a5fcb0c2431d2c5e982ca0cac90dab2a39351881e28fc14194895eab5620d24324523b5e972f778d625b2c53f45a25a4d661bd56e98082a5ac78933650760de8a82650356b9db819dd738f3b0a50a8c08063490f514eb0a1038b93376666516ea8a19ce94156ed5f909e9e4f3dad5224e869c502d2d3aaf5a3a796e66305fb344418179e56e094c606940d0eb319c044793323024d97c850c1c1c309b72b2550506c8e8132e50a13323f7c00835e33adb711ca7801030448972d3ea0a99d11808d0954769880c44c0ad0d43e1505f1839a1b25d8aac2064d6d936e7b68c0e30b0c38603941192250fb044c550a344cf17062250686283971a0c401e304b5519aa48044cd0b655c40399015a54a096c4aa80841ed14203a4cf1c0e6853150366a6daec8542591a1cb15d456404e9a2c543f8aa00384eeb1068a4b95312cbc41ad546f718f204ff07c4ce9e298b0022f425668da1261cb1497245da69ebcc1546c465a9736ae5a172d659600a1e1cd932a5c181b40a8b4b0786842810d737290d08665604093189a72a001320788e805ca0e5a5a38e3a3693cb24354559b1b9cfcb86956b0a142044e92202ed0b4442039ea48530d6eb4a85c58e265474d73a45603104878ec488281141dd25429020e55930d30f82033474bd3162c38dc746e727841cb4d181e9888800c7641cc902142662a2042c7849104368ac0319343ca089513f4c8d286b4553335079b98ac3537f800474916189e0441c3105ab4ac7993d95c14b8017d906638dab9a4072744007144123840c2d450035554103ce07c60650d981c5030c28b108eaa832d2130f0507344103a6c3e15be1b8a08810d8e1454f084ce143746b0580802cc16aa17dcd8e071030b5410136c190304cf99408e1a82a033658d0a66dae42d39a000872d45523027052cc5861123903c71523353418c9b70889107ae889a1c572a80d3c30ac8a0b161823070eaa401424d172565ca8019e334c31320b4a2542c45f8604414206ca2d0de70d9b8d72a1d2f9067f6edb54a47117c035a84181458d9b2b0668873a58b8f3831cc80e507c745870bfd362152650d99393de4d4d1a0890e215c1bbc8297f497908cf8241096fa9287b484a442bc59d2a4909f7c10635b1463423ebd56cd9975b0d7aa3a45c4dce34ab7f6b5fdb24af9e05d65b6c5d7e5a01f76ac14ca40c5520f3ff474eb1c627a86b373af555872e8e9de258ab38c6da1160880b1c1527a2255e968014dbf5558bcecf27badc2e2a47bbd566149d2d3d36a054e06a01e4edc34ed1025e4698519537aac0923048f1160a1a18de0ca89853a6b6cb0f04385aa1d4c6c905365ed97679fa2a51645cb0115258c8d245337ac7cb4f044ea88145b557880f1f283962c6ca83c395921cb981c5436ce870ba48083ce10408c647141d73a47e4e848410ed691262c0048818ea93838c4a0c6884f051b4f32140963e5063760cea0f52b06a2d8132ab820077c420de67490f1206e8b5a8e810054d4a3fb4b96053657d4142653bf7f518b92dde8c4909d2ef55b810fca25adf72eeb920eebcb4c58cf74ac6ecd112e0b314dc4ecb85f654c0c5a96c9087c58a17609962f365c65ce92a85a35a70b8d052d18b4b288f94d020565f344cc59707122a53f11f3bbb5e3072b50c43c9598a8842df80431ca10321a2800000400c315000028100c8643229148948589aaad0f14000c668c4074523e14886449100331848220c61863082004006388310611538416015856b787dbb7401626a5c68741d235bd1875daf2de68067da3d95718a5ede3ac3734ec0d3d5757f8a62a6a55e789a45e57519174557d48988b0a680d178b4ca6deb34347ad52a7fc37460a7566eda14fc29674565fcc7d04812e965bc5488777a0a7ddaf2cc80b61067846a92cdb2382d9d3a377d36c092b05be742de91c2dc2b314f9502097ecd15a19576aa528983f053c831d02f952a45d82ddc7c217f02a5adb34dc58dd99df255e272a6a4a5792cb269457fa58aaa4bbafd08474d8a3ae3667ce3061642e94925a481e6d44e088c04bc66dd0987cad73088c3b9370ce7cb583369b3c4236b160ac3d0268a38dc7b9600298f3a9eea0922f1e754a7355bac90c94900c1445f6d37947588406489917367d8d4b869fe3e7569d873fe0edd4e73820b0f02978f3d815b1e58f1e633fc2bb938340d423fbb205e66997aac75830514ab5f74bbe79bb8275a5aa3c7d0d50300157cd017cc020557811b331ae0c5e898f53dee5acc93154989002e7fb27dda791a0a4a9353a4e19da2c40bc86ead76d918ee96fb678612283429312ccccdb9c4da703157dcc2865459907aec6d3714011049910322395ea5353c04f2fb7659f1af4c13e7f34e08154a0fa47c10d4a2848e982e0432d0bd0d6a5ce05dea68e523a1331668506bef13343a0965e277dbb4bfc83976b6d570a57eb72d23dfc06ed56d82543e06a21c61f55a90f2e6e8cfd2ee505e72dd58d03694441e136852addfbbc066102c08cd50d8edf2de0a188f823a1b613b4f6ea5d4340bd6bbda1517d37556060208731e05c2a2bba7b6c410a385748dcd581056029d295e79742fa26801701d9344e66b92c7962d83828724a69aa9314ca9a6603325450723a85d4a8949170c25eafe43f5b518536515d5e60ac0f5f2a12941e43ec81a6de238453806ae3d6fa488e3f72d5750afd09cba674bcdd2244497e52d7d6bb26df8da1cfc81fcd818048e588399d0ef4e63b60a6d3bd2318f6440248030ac3ecfe77555e27b97aa000df4a8bc1e4c9c308a32ae3f3445e93a7f1bbd46905ac0cbeb4e854dc151eb0e91a17168a04a2ea737d97c238cb6a348aa22f3d7073830daf534ecee65dc95917ea3e55bad3b6cb12e998174a061a5579381adc48a8556d2bcb5cc5e079fddd7a8023bc96d02c77e35543f24595c45a6830be7cbad090731d0e83f9451e58ae2c856ab394280bbf34e0907f4e131b3eeb74f6c64707d678c8d6a26edf8e6fcd93d4a52785523e4848e1fd838e6de1c0046c197b1a0142198d05d05d3cd9d9adb1617165e42297c96f10ddfd005cfbec86e1a65fcbc9ac18dd65c74450ef2f7d35f260c0a9ce92e52ab0ddb94f2b017c91359fb0c8246d71b84bb3a5bbd330aa730a748c27fcb670f5672699595e924197a693249db6cfe8a9a70601b49ced6c6a1832cbd91253c31c8898666ce04a9976953052e9e5fd2e8d8d4f21dc7e0bd36931617d4097bfec3356ab8fa6f9e8043cd2640f0dd6433fa3338a4257444c5250f7b3ff4beb089cd1d64a3c5d5d787a52d6a8434c74f3ae876d2b25d18a3569007a521e750611ba47922ca727e11aadd56ac58bb6a51b720993699141c17a4dc6ba29a2d92a22514330f50718dd1437e02604dc18a771c01d8a5c27fd36e31d7a2d502e7aad15755fcf8a2d616eb6f78bd32b70a3cb784bd1f4b4784422d003a1baa7cb2bb6a8a5d2c77e080d8041c5cff3f7902ed6ff30ac3e95fa8875eb0004eb144277a325068f14d25eb5bbf0e2c20380dd8b68742430e92c47a2da2654ea9526b206643b59297dac8a6c5c40498192536c8d06cdb7ec48164d210523da2a5ae8951e643ebeaabba56e192e15c50f134db340d961577626dae1c06259924d9541d93924e4448bf5426113c89c309392807470ccd02b56e81c6c450985258f1316ce9cd2bb78ce10acb4425168ed288c3845047092149d78aad5fe0ce61dc0a169fca6f57072a590fe1052b06495ab18f0cde1668e46651138890464dcf4187f806a9167496021ba6bb2c82cacf9fe844fea4b0a4b3877831ccb8741f630c2c9c499a7054ee8306c66815e96e16e60668779b84be8c403899b563d418ddb7c2825b72220f0813ef322d20d4762534015cc7951460d4faf10f6a3e846584041a39087df3efa834cdd06b55f13ea263b30d604f8e996966acfcd97e6f88011e41517cd6f402163e9207969010d55e2141cc44a9c2ed4a1e32deb4e5bbc009c420f0c05e835ab99ed3120bd95a28c7553b71865045ac058965c588f5cfc5faa52f8536add56ef7956f42fc1928ad97fb1f70156a3faa17d05b35143a200233d53ebb2a457ce303351a3bf9d25314926eda06c0ae66a0f1c44ad5266a40c5b754236ae1e4bc5d502014d6286037af7c0fc32f967890460bb1eca22a3f5395341fb10395300ad34324b3a7c1215f293def9e760c04ca780acb98aee065646f43cc0b0c8f0c3378c52b2b8ae68713398fc769d0d0aef1c9aaaaf54d22fab48f6c381be4b015166bdbd112a9d60cc73876da529c77d62ac21c9e1d80b44d4b56a2c89c55a636996bee9d0b08e4c309ad0f14716a66790283e70552f758e82b24fe73f392998a9e56daf04768fba136f4832dfad2c81ce75134049e90e833c60164523964fdac0f3c96bd96b0238a33432daa0ffd8553bb418051b44f49d13452c4adbda1d07ec607c1150c4088f5f72bdca5fc429b98555a4185aee2fe91d86702e7de76b4d1bb94b6d2992cacc6e6424efa540d2a9a904ae2ba1473248a8fa33cbf7557b6d1f4ab05d77a310161ae85784c74bd2b99f2c53bea795c0c90414b15ae166054cb19b36f542fd9f5affdda432ffe47a99c65e1e71f8d338aadeb8b7e4bac57c9f4b4f2601529a39d3ed9e83522d56492aa4bf71e9bbf25f94cc5fa0094ee9a4ca77a2a55329616a682ede8364c3ba28c7137fa429798dcb7d2f26ea0f9ba747fbe17f6551af965c127e419d51aa4d9dfeed0989b7eef8ff724ab512493eeaf7a55c7659471efc75874f8966c577aa29daee62dbd91f522b99f41e54ddd8590cda0d3697683b267542b6443631891f32c6231d861dd309c605a610f73481036c53590e967e44255691bc9dd1e355745a57580d3db2f6cdc30fd14e9f98afe59f10f547e83f78ec57c2aea3fb1c17b89303d0661d75dbf7d995a6883af4c4d52972b4634baf3fb069122dd8dd76bcdad2d0794055ee14ffdae962213dc044d8d5ec8afe01edc79dfe3de47cbb3dda1115c360b55a65d4d02cf177f240f0a2eb3afde069e928627f7a427d671df33505142be10924b22c2848b5df9372539041799522c654fe1b290e146c761ddc71c8094acbb2d64dae060fc6d78d939ac314b89d3c6c06dfc8d9c30d85d26c9c18fbfd6381c624ac2ea294d4907fde202aec02c05bf36766fc9d6b8075c4130cebc812329c2d22d3e0386fdccb5a72f9e0431521ffbfe845b02b0c2d74a26099b203fa07f8f429f292a75a0178c9106321fe024f685b80037b13a59418788324eb4d422e34922fa74b7e3893a3716e87be0f6205c52fbff7714bf799efa3b2090af73476d249fbd267e6af3aad29645cc23358043d8ef537ee86a358425c5ef19c285090a16c2012a6049b9b0f999597f328b3f2b6e241db54dea265fa260fe73040b1185799f1f6b9c6ac56e4264fbf069d8c1e28a837f1e9d7a0de59dfdc5d0bb8b94948761b0bb3c6e7fb4c9aaed1ba52de178337d754dfd076ecdbd3b8e590a863a8adf2b86f2baed0c59fcf9d46c8de01352389b54855dc44123f174ab4a91c3b82d9af22309d0e233f2353fae1cff7c874ba00b9d2e9cc411f690579e1265135123a5cdc989157d015b1349a24dc68246d0fa5cc222c0d7869f77b5dbc928868d33da91f721839b7e6b286f2291566fde9312964261047202dc9039d1024673d75f34045e7336886805053b8cc76890ff7f244b65a90bbf57137aa13b5a4121074cd34a30d68b0ffa8a06e17502e844b0cbdaca96ea67c656668bf978f277b372a4730ea4895a5b61f16e67dae5106c689a3c6ad6b1da23ca6daa4ead7efa0616e1255407bc33fc64c69768703690562949b98d523213027e5c14bd20fdfd58d0dfc0047f09d8baac11e8362daeed8067e5c9b33101c2452c9840aa0139e0d51bbee23b4e0c0942d0f26841d655612c15b49c02d9ab088a6cef67fa65318ae8ac23c7ff5923ecdcae2c6919ca35fb962073e35b3312700d23af281a76e6d12ad693a883796c667fbaf9190bafd483fde669a9d2982e3a7c857cb39c235372d829174adf22c6431520fc3673532a4157df0327ec5e3dd670c4e94e93499ea4b73947921e79dbe2855668a662beff76f2f9f08440ed9610acec2affe01566d1e4b306273f48c9f5f77d1186c2b0fe6a76d94e32237c255481c9d9701a9d7989d70a792bfc62eb6dd97f8b3e193a6133414b5c241f5fe30e0004bd923b25ff61ec64c224b16dae085ae9f07e75f060bc6ff4856a569c8cf69fadd68385f2f56b2df02a22fe24dcf5a39d1fe75026875bfd7fbc1f006df3843c1bd405883b64e63b26fc9c9e690369c8e8a00f1d5c02d11ca8e2a9cc9e03b0013e18cd19c700962a4f44c8752cd4d25a4f1d63f06cbab488aef755770881bfac77107768c3ac448a917030d7401c6839e1a941791c0f0932f238559c2cfb90645780a86a757d5466e7541860ba2cbff63008972a01ee4067556a0084b5b57a99f9ae4f19266efc0685660d62dbe7a27d43ac0e841bb97aae96d2418d6c992ba0d51a4887cdae5f8a7ba82854afc810866f09dba8fc4496fefa2bcae0c7a07d8e80585b938b7110355549fb22ab31ccf9c367c2ec105ed6d3c39450233ca58f8a3882944dd393586601c416a9c4693ac52f3a2dbba9bb0fd0e94900507b4dfc831004ab91e48dc48ecc813410476e7996a69f6b57b7103bbb7c91557e0892f0405b7f0e02abb6fc68596ffefc7660a60e75003cd4cd614a5864faa43b47b922fede66f26b1808913457b70d561e3cc310801902eb2bd11d7be385c6fd0a596e38023c1fe97aa2f338190074065061a65f9bbda278d63d64814a50a6016113967926eeb8facf8b772ce676d2005ccef7e9ce8f3b3a3a224bef2754053c9501d75fa16ef0bde921186973e23cb586a03184ab4bcbeda4f10308cd71834b9524a74212283a693c1dcc19e0714e39ca7b446e841e72507502de3b2281fad746de3b2a04c62ab257a5af314dae2f0a0c4f0ba4c901e533f17cd7e4c4406b9951f5fead807b5c5947348bb17ee134b8fe66e3a19758770e6c02497a322127ce4f47f8b5a181cea955c3f29696c0d8647ac412c7d7a8adbc783307649816ec4ea71fd37f65f7fb488d90d4b65669c58f65a712407d5663eee2278f2aa1be0273974e0032722065c10187d832de6d750bca7a18a1deb01d8516013caccb9989b4f3ab089a64e1a4764d12a833a2d5b4e979e3d9cdf940f4cda95db18efed0ddaa59056e1269f4314ee1ecae1b771e6c878d53495879cac1e75d5d4331df945b391c68f827490ec6f6ad8f31d49c34775285327a00d740f13c490622ef588004693f02605f48fbe35d4ffff47c622569b36b255e261d4c77403ee749d1030cdbac881f4070026c9627b307a09d419ab7ae9b2cc592f8713f8a1b0e03381d31e403640b154ffc8d0c9b2b9976cbd1323b752c66a06a2414fcb4fd57cbac4471278207974a17675316417e314ea5111dfae6162eb7b9b0b9a8d6543974a9940ec24a9f2a3c38d9ad834ec7762941f98395f9224dbc11e45edadbd0c4a072c0f3824faf2e8b50b5f67f2d32cd5a195ed481bc1f1fa7698a6bd4964325881079c03b4c3c3517135955034195542756caa122a4a656e1f4de72f0e4137b4157f156f15054512313ffaf902bb6f73e7e426f719201ee5e84028e01f3dbd04ef6dbaaa29c0443cfae133e6ce87081fddfea210da7742f630a333f2d2f56658f9033f580385d867b1d41fa983580ac245ee27dbd289202551634480db781c72301152e73e1e7decb3cfd39d1e13f215b0b7c0c9d1bff48a4462a312546119e841ef3352cc69e903dd38c6cc363d94104a40aceb41856a0534e761308e5b1d63ffe8ca9d05f0107ac707249e7af2888ef8a5a2d26ec66c8ad1d230fa1d7b5bc88230e11a6cd593e916c59cff0117f8fcd2eb576737fecce367978c689e6af15719d502f377401b9813660edb9c2204f33604f3ed15c0a792b93714ccea45593e1a6539ab7b526c3e1c5c2f4a8ccea54758c6671a6951f97d82094584a496f236db5fcb0864755b79cd0088422ddb48dcdbbe5e80d3a30c4dc93257f3969ab30c8bee7814d52d438728ecb41758349585ba73478dfda0b99c4fa066d75a9f10bb786927e431bb6554fd02c81077a3b319dfdd5e1c0b35e7b12f78a01fbe119cd6e3c8756c6e95d8854034b09ab634af37aabc63bdaf73c5dace0b1a927d28bbf1caff48d13c997e6ef119e10fd75a10cecdda057767171300f18a8109ee73f3d03211ef18c52dc2319ad4e6f157801039cd1ddc723ab745046c76afd673b77422d7219f9632a4b8bc15f63bd086cad289a6eb656201dbacdcfa05168726632d5e9cff34efd767fddd914b1be706d2c3864bec178fd376faf8d40a393c920084ae4540a86920a8ed8dd94f1bc09a373726eabdabbfc1bab242b45575768431a7de3b36d6417683a39abc708b9e059dd44b3ac37c6553ef9b57d8e31bedb4c974b0421dca41dd3f009da87d7650e2cc62326c5192908637a718db763cb518c7ff7810066b53ab82b191eaf6bafb8b3a3978ba0ea15068a6ceadb850e3069a2e3fec8b32e31fd2934231563e56ace05c6ddaaa190b35e6455e2e323856d2a352c90daf1c09c3977b8ddea9f7cc3280c7e0676545ca93fbaf78b7f23dbac4f45d64f20dda565324970359b908e6ec7b84ce42b84a41656da5c67c2974eb12b3e6802c641cfbc1ab4c643c12c16c3421536601591cfdd2de94f459de3ed372c6779ff23f06cdfefb08bab7523b1d131849ffe9926cb1c77bf2d6565b4c55e0d795e5cc70a4f27c16dc76601e456618ae1250ee748f50916f49925d5be50164519fdcf9ffa5cdc0b0077accbcfcd2582acb7e1376934b098071abee3d8ebda32425dabc3d709302572761ca32d5fbf2ceea91ccc549cfb4fe6743194ceee28080616146cb0a6c762a01ab30784879afebc0273c8333d4c71fb603bc2416334fcf48928f761e76a63d5f2a282f03fd701f22b8649f1f6cfc3becfc53113650db2a318943decfb0648b2c3b822ba3adb01f9b335396fe05b571fa2c44ad4978297d83a37e2c609d0d550b43c8647f8f2dae677b429f3b5971b828423fb704c0f9a777ea1ec02c71c180952d0f5e7f09cd036fa458c1d6a2ff0db6e759abf9112a63e2c2c31da1524dc4229f1130c3d76577b0f1f375856ee13902e90f276f88dea6d2e628d4b50a24ded1299132e648080b49d761e4a2fe8a9bd2a8c389dbaa661d51c96db5b292969ea6eb65648b54560ee9fd372e198f63a3d6c23c88bab1109cfd035075b1465f7987be94822f8cd7b367b604bc821863987f6a8f5cab6cc8ea1c7065cc292b3a8853ef6d8eab16f00cbfd49297fa342c706574ce0a1e459766ee375c3ef275775cf04dbf3f42ed74070c0edbbcd2029ca2891fa4623735bf30809112093f269796440c1f9ba0d50c8aa2530e81f2a836d9737f3188e61a5028fca9ae1820fdb7a7f783d3dbceed45e66f1292c192223c07828ca2ec01b46a17acae23881d2e8d2609a43a3a86284a8d1a9f8235ae6ae3ba304ebcdbfa9b8439c7764099103665091bfa85f9bba63b1357b06b5fa057de5962f53b15d0bada466bf2d4d15955212f6ba86c21c928cf71d89e25793820e591e58c4ccaa8c95815c942d567f14abffd91d07d675d6658af28277e905a07f358e3d8c01ddbf6a05377e865beaf56653dabd5acb293c7c876a4a38ec814f56fff65650935c8ffe4c650ca83854763e7b07e7c2c9157d7d551ce1a074d54cfd903ca2cf9d3b25305b863feb6e2a0d4610cd9eaa766deabeedadfbe4da29e549b17a63f15e4204e684200dc01f6743d85882911426a44f037d41bc14f6feaf98e2c9e582c1c21092cf9d3140f587065d4a07c1620ae49eb02a28efc5bb6875161283d38c7e923e01bfa2d9a46261381c3fb0cc45b147e49fba0b1c321450b8fdf10f9124f4700d89ec8c257959b08a49b02c697a31c1ae5ba96950cf8fae36e3dd7f0a0441c81d83497673a61c04d6801d34691147c19d4702431b7711354dc742abbfccead83285b5c17aeb6615b83e499baca0b08fd36004ce836a332234706cef5761390695f6510bd11e02b0bbd5058441f808fac3084ad30620516a44fbc575939acc60111f3ce81b0bc76da318823e1c00b81e523dfa62ed1f8eb3385079c7f48eb5b8d4598544cace0dde2fccc9e7d3db3b61b2fb93f145a696bbe7ae15436b5e34c7639ceec6db5ff43187d690dd8dfb0a04ad316c807295b6d91c91bb6fa40c39ee65bf8c1e350345760b96f3775cc1e2c5ab4a0b7f262ec348ad317de1b042cfa45033a4a3c5b12d843c1b202e6832b6bc1872a15e522340823f527a91a21f6006b81584df8ae80cdbe2bc43d4eb3b2c8823e6a287908c8b3ef85304a5095b4cff446b5494bb3c94e2dd187a19bfcf1c08ac14153e07f3b7f158212ea0e9b216b567c12ccb0ec8979267507e92250cb026a53205cbc1a90324fa3b4c4f04e9ed9b4293e3649ad85eed59127bdf92d6302a80f1937185242419179eec321c769f79cf5bf4abbcc903cabe5315bdcb5054fea30126f420a477ab6ccc8da21c5a68d0eac28082c4cb81c89d536119a4ba8b967ea7e700418031f277ed3b7dd7c00b7c5d00ef5d5c4bdd226ecb671b94fa30a33f0229598a4f9590683e1ba35f6613e417b005028815dbf0b8a80a53619d6007158373533cc1622f0d2f99f75960e33b70bdc0691ebecc13870975285749b3e07c02b55249b83c26332841d7711427bc12b23e3797040cf35121138f0fa31abe2b07924deebe2696c8be73529fa24bd1b9dcefc1e8e561f15aac350d3077138fa846ef2900ca14697934cb43a02eee41177ac08981a44e9d73b27abf3f7b83956436c810b5c832c0c8ff271e78ebb300ee86f6088e9a24e5e5001ae33165c26e57d8e2fb0a88705fefc6da7fc333eb63d4a1896fe665740767248919df5a9b0e0f0e47b6c53a726c8be5208b5870c57b34b02811f8d58694a9781b86cafcded3dcb6c2183597f6b48985cb078c1b307da0f76ab899699723fff4eb8061ddb3aaa0700f893feaed7dd4f675e0ad36e745e70a7ffed36e96f7f8e0786a81cf587816c5015bbace7be376fc9201276f11a8ea1938242fe92f3e49ad56f572b417f721ebfe9474751bff581c80624bcb6fd294e420901baf153e1c62aeab7768e319a50d8535678d73225f5553b5ab05cb4ffbc28412bc44fe089291e60b261978df53909b5ee58e51586c1bdb0f4eb390ffb2af96e4d1bb25bb696da851a198991201f7ead5f924a99f514227c04f265db5711925be5238487d34467c6e071dbcc773561686e8e5af0929e9e26275ddf2cc939eec35d194b78fc1099258fbf730986ecaab537580876e981e5b78cffa4f20e88eeaf10c7df8c19b521afdc17c0be7bcd5f0cb16006ee422420b95b4ec0845e32758c82ed58b277fa4030078b0c3cf2ccad40266aa039a28b5e8362ce3b175181f2abee3aab77f5ef0c791a1af2da772bf19f1c8b7e7f9a993702fb413b0f0d73dac16bfcc42ab2d83c083acd609f4a612a7b15cdb35d6ac75dd2fba4c5946ce651d24603608b318844c4cf7af5f7c4d3c4e5085141a4a3fe72e7c92c7796e19088239f28c9d7f5493559e2f09cc2b066af6fac7ae16a837da4b6ca405262843c13eb372dbbab06e098eee488ea3e2868603856e2649794a59b1777689e6732d88e75ef885635159a3fe47528811b999286996f1df6a47f0bc7759c49c9b7b38537708d6b5efd4e5b3805a8d14eb4886307f7b0dcd61199069b568ee0c710bb69fa34edaf79bb876be5f11143746017e2301082c647a48c19c18a4906bad22819c71c7c33d3aff01c13346187920fcd9332c184fcf95add1b14be925937aa4c434bab8c3c699c23c18b2b728e6c94b0d0dc6639c77b31f54b7b9b96588f6e4870dfe53988f7f2cecb782fd04ab0732dc174fc1a9310aa276ccf71176ab8ee237072a07f5742659160520d69085f3f07e0c8d2aee1073d980ecf44207b1e851d45da63ebd38214944a5908786efccc76fd4e419c763a93f4fbeabc02de281ae57251559aa016259423a0e71d727c7bd699c028fbeca00c69363b6d2d923c102dea64978be45063bb1ba1150fb7cff4dbb2399318d1a30b56a79f7730942ac15c200bc9d0c7618107042b99bc2b551f4cc97eb559549038330a7c7419c80d0ac16f23d298bc8a3179554be2e11f1b1a3bb60adc3368d91e2ae964b11841bd1bf1257b1bc9375d8c656d6a79eaabb8196b14b32fb9ff5f481708c1b2171e760f0b863bacd858cd4c250e6436927f4ba6b87f520561ca7e479a5e5857e9a98d765c7bf711aa7b94ddea3b8cacf7747f170f67bad52d175bfaccd4a2ae05daf6afd386302544513a59936792834c938f3e0478618abeae49fb08310479ec4b3a0a34c5c2af9b6205644a6736118f7cae33e76543c153dcbf6c8694bae9f1c9495caa46a15e14142c2eb5c7c36b9096ae948da420e6bfc1efa1bdadc07a7c9b89d8a28f636f21dc8abfe594deba8f74cb6bf9560321a17ff840685fc017da3836492147b3c2e473b1214c72f47420416f8b3a50ddf3a49aa4a84248a5172ee9d78183b906362e8a41aa659ece570808424aa5b37b3ad1adf43edf647ad91024d1f09871f86fd28b3aa9b0a41515bae47f2a3d948086df505bd4af814bfa8ca6d213fba1c453bea229005c3bb631d7e9f5418b661222e72ecca3576cf2c852ea41d2de9e7912f552b21582de63f228c5c97a9eb9723de87a4fccebe052eb4553afac794ef45232a2dc1b9b112abd83be9e87617ab7f923a5d89b8e5e9596338e71bb345b982ca214953c49b23b7038a83dafdc12d7cc8dad6c559227b8e3c6994611636746bb1df152e7b9550192989acea9223d167bad8288901d0028b4cf3458a03397777139f1f9bdcf58e59c0dcf2c3a0d0f3dd75f0ca8f9008df8f6764bb3fb00f8ff797de8fc978d0805f9a62ea6548acd323cf7f4b2f07bcd1c9bdbad36964cfe25da165e94e656c8024b566dc61b42cfc2853311fb4ca9f8ecd2f6cdc6092582b354287c889037ac1e7041ec84a36635e8344ca1d3da961f67e73bb214e419155167c0c6d068abb784a2db3fe0913433825f1bc40af7bc39e36ee8f184ad2f18a050e9d11ef1c2f843f3d13e879431b3b566cf6aea882128ae26a1df6bb15fd2d6becda7bf6948cad74ed8cca6a688065f3bcc5942ee23071c45791e000d3cca9db6d057870942deb559bfb7958de1cd08f099cf8f6b35e5f206990ab96b5dfa2afae2447f0a9d84492fe348fc62b738bac72f508613f94523b60d08ecdff605a51a2523f8f5399102fbf50694c56c85f1efc76e9340a63104176d779a9ab4c02c2ee92537ea5f4ea6e6c71d72408ddccab6ab453fa40af85c871222f7cf90df3a14f1f84ac655c0e23e496421d8d4ed50e7dbbe6fd9dd55ffe71cbb87cd0bde8bca8f72e26895b707b93d9fa5871f7e1a94ed46786c0a50b0c68d3ee2cd512aef740bc18483324c6675ab3ba86209b1b8c5e578d07700771ca5664da7644ead97142b89fcb0c6bbb788fa7faf804df9e552315bb58ad5d66bf77add7b1b16084cb67d3224b149ddf66db2c5c1b3b2719685b35ef545435359def89f38d76da684bd52cbd1ba4237a32a9ccc3d9797ed0653e259c5b8dddc3bf80415b1ecc2ccb936963849bc4f8fe70e7430ec25ed2f9d7ea980b0c59e5f59a956d812312204d75458cebfb5c20bf6bca5a2c685713a84d6a67fd93b69bee47d31a21ef0df9c7ef4884771d00df32b5b11206ed4a347ff276ce7437b417ba5d9e5607cef0c00f8f37990d3ef60a9a5a302156ac2c85d870523aacb1be4636755fbaad647faa93a6f60c569ef914c9c14242d815fe12296ed239bb0c018436eac27361abee050c29f7f12163813c849b58bba65512c9f3959b470c03ce7deebbb820c45bac929a2314664efb6b48e86773a591d1939ece6b26d8558e2513b18fa206016b537865039966008bc69bbbaa64447b5bae2d089c3013d4892af17bf572159a2768af718acf6d5c26e3746e2f10256efda631cd5a5a0f8daadec811f1d08789ca35ea27cfd88381ce0f5ac5eaabb6e0d64eca42682114ea6e551d1e544266bcb8da1235a354c99af155c62765ccb9b43674298c16564076eb9091adc62bda295d1e7f03907303c6a2c7c197f892fee251562b14c6363a6928148d45804a64ff15e69c64e7e2bf6c9d413a8c3e02fe9f51af62b7f6d0b729403aa8723902118ca732b89b6f6f50b48ed85523cd3db7a3241f02f50a013930751201af0dd44b36fb3f29a5480a834783d3f5c73f4e4d124e29cbdcb27b1e6627ca05fb510fc14c88bc9cd58822eb52d8474231366687adb071aaa7d5100394d4a7fc26eb7df52f5e7d551017efedb24962de68e2858d0c07c0d7e10b2fc326b8c943ed745443c7592807ac9d02661ae963c4c66d3fcf7f805aa5c51cbfd673ab58bce71fb9d8d31e4efaa42ab5eecde59970ea2c38f42d9fdb1047d6de4ff36704cba43e4e5bb136cd5830e26d569fe6cbcbfb0b21fc9f65db541d17c7451d8d95c08f42ad3026066ce2d57e4387bcb602f3ea8a5b6b50b1cc5f421083a97822867694d053b575633022e6543ac08d789d557fad055147342d13d8fad751e2dcd5853f394359526b3a6fcdb432cb2acad298fa274adce03a2d11f8a5eb1b7c3efd4eec57facc3d6ab7514fd41b886a78f665716c5f385b633b2e816ca45d7379aa7e59837982608f9f715fba21fffe245e134a0530da077cceda33346b2b0c24c9cea66b0ee8863944acdad9ffa019cc24456f11187aaaefa84e06c5b787410150e7b737e2d42a9706ab88f7968b1e781b384e6360fb22ca84c2c5cf80188756e0b292bb522664766ca094e4371d97b150277d5b96d0bfbb47020a931eebaa5e6ecde025d89c62235447c876040565da979129b1bdef59a958623fa4e4f7bd8f84262cd2d246a31d7955470e4a5314c3c015fec2f9fd7467347492aff7fdaf81dec45bfa0a32ace7384adf6c2d4d54c3a0b475f0aca707fd758c05562287177a3047db721d998419c3fbe266d0504f6d5f0a66b988cbf5da646dfd1659571cad02d470c5eca4fc1985158c99d09f99efd563782a132729ab522059ca39525a220ef79934606d9ff528d4f00b27e46705acb563fb738bbde815f60faf0baecac6a1e9baf4598f66693bf6294738d46ad90b51cbff21e0717c15da0409e134e206f797992e7a4cf4a0875094a60dadec3cca1cbc93a1dc27758a97060ae26556b66f4a2b87c581c8e206110474629a19575552fb6e719c312924c7d93fb2eda424a4d2d95149436ccdcf738a14a58c1acc56041fb46b327f89bd93ab77db01baf656e74760913a0e70db3a3590d64da4c08ec583936ddfac299b75d51c6329114fd5708ff89bf4845da85352204dcdeeedfce3af92de154b0406094976137f2377b8317e0035a74b0c1fa2a6fc57861f2b698e4a0d2d87bd8e0b046aa02a102941564c1aac9590e0ff3656e51e42f6704ed88a88dd6bcfa31b956d20351c5e9b000e3d552ecbac6ec4806da6a8d33de7c06a57b3f0ed404fdd4fd139b0a44686fb5771aabf3ef4d3d624558577e62c0c9aee1f5db493383d8ba9dcf9556058c8803c9408bf5b2357f5afad0f3c1f7a04281bd4398ab0355517d901ef1699576afa67720ff3c2b4280ccf243a4bd46a2da6b52d6299dc9a7e28133b6750e8c3008c21002a856ed49430352a0c7e6a3c2b01673cf5d0571ef2ea1ed3a2250e8a01bda9c7453d42170772af2eeed1254afc442e871b788bd7ad0f211f893523fbf1bf73e35b62037890177aa86c4c44805476d9aac9e6a465bdd0a98689f400d995a20874381462acb47989c1cbf0c8a1eb7a9b7501b4424dcdd3f0b155c43631a30f2111b93cce2e9c5c3dbc645414ce025804befcb47bc4024fa04f6b5da9b62c0af813dac1aeea70ea476706f7befb677510c0cea5b2bb98641d10983a1753a68011e22112ba91b1c618a202e10801df9e3c3ab67d244fdc82304620bb3e95af8784713cc2a72685eac2091c4dabfd3dca57973b8382fa6aa21f21e4c8c541e1f7fe17a8842366a6bc7db77b3ceceab1e942d85cddd5a60194075f6d1484f12815775e90b88ae53988e4b6ad4c5201f5e476abae22e73e728c042f48d47e97c2f08589be08cef98c28c5e3753b725c2f1eb4e276d91785398d1fc1b7702f3ec1f1540826030eafee3bf5f1d69da0140054883a39b8e31633cf6f4011b334c464c2f848faa81cce05285ff2c9be3be107d735a1a4e99a1d13575065d30386ab8c4d420c093ff6295c177bac72aff0b0b82ffed1e21be4bd19d4f00a3b2ab2a477b075e1f7549c5265daaa33063fb10216b337fa89c9c2760c9ebcf4b9e15e4507c1a315152a6610a86c2377d3a247577d7d054c1d9c9e66a257c14165603b7fcf1dac01dc1646d64d3a417e0c5109b61aad022324741e5cb66e94930874aa086e37de7bc570892d3c54534976c96c8814a1e8d3149147df223058c1dbdee418d76cdc2c63e40f201ff18bb570b74f5ffc1dc19b830a8a4a9e1ba5eb68e7f6e1a0f46120e44f44572c419d5c1abb69bce52cef2ca8623e44476fdda0ce1568fc8a5fcd1c796059c6ee42dd250a569f5fd292fb254f6249979450ae5327352517bbd6c48bb40b76673d4e4468acf2cf8f3c37e8962becbc3e3f16ce382fd4a4a406be6a589e542486a4f114cf1a4bfaf13c9d91c9f4db96493686148f68889c2e52bd060543cc13f67fb166ad92fa6bc139bb8ea5c5bad777816bba796acc1595b21789159177303254f2e7e3015ccb35dd4a28100a43c99a441f8e14ed343c1e8937f6e798ba8e8132abc41950eb94a2b708a39569e9e9fa46cc787bf28c53d78118de0369123036707bfb3d3f45b000d03edda9ad21a631de9930b2d4522ac82a014419794ce05e4148333f9a6034e715268438271d437657abf4ebfc36a3b426e9b3c0a15c756bcdf480186be41795f2683577da2b435dcba4b544d44227e62b853efdcc3fff8777f52fa54a9cd62e0b9f280837e647ae76ebb24144c8c11e0bbf3489f8a65a4f8dadd1b5ea2b955122f6255c0dc7b33f4e7fa69b1a5bd934ffdc4c4a528de591f45a4d8b38f561e158d8d439853f42487b4e9bce85335a763890037837fca9557f962afb721b57fecdb22a203ce580a86ed67ca1c940b1467dedebaae4cfac3785b64838674fde96d1c0de491deb22405f8ed80f0290af45d230d077d78034af46647f2a86bf4e8318fba0e44032ac86023a05441bad912fe0484be291fc6f70b3a74c214b40ac62b3074b9d08746fe0ad58b0db29d2ab490cfaa292fdc435685ac660c93acab7d9d6901de4e476b90fbd9e7c4bf7e7342b160b06ad0d6046b5f92cec691fc5ba4a29ae4ce969c07581fc860d135cc855d6f02d6203ea26af7c0a7536e29009ef820405da2e46023cb41fea1a0298510586d7bebb28b871c8a374708a531d6e7387ac0d65010a24a922bd3627690d600f4b5bd89f737f6a62f17b0d3bba716ec4d86ea81140d8029f93b4ccad744f1a6724f9a259797baea83c367137ef686be88d5e4cb29935e7385652f5956948a061b0486abb3cecd1b48209243e8b92fe97be6b386ec28bce56331cc7483cdb1bb3913253da1b37293cfcc59557ee8d8829baa878a7549b0dd71064bab59d28f0f4b1818e054c66b5c187bfe67a6bc6285bfe99404893de5771f4b18160a24acfa658fd591a3584798b50e8760705d43b263d402522637fa1b5535049de6db683b00f77ea83bd98bdfc69767066de2da215cb3e7cd9de7bd4245201052a5421833c946365f96d6021e90844b23e4153c673503e6017a85d8c6020b9998c77321b033a6ee2597ac9d4b085c61b065a9958181ff1e64e4991718f89c77f079ae7cc2f13b7ab5554ff5045a55f0ea61cb12f8b4d0b944d87e42fb88ec0e5f600e5886b9642eca6516ae6c75307a4cc57e0a31a34e5ae0b80b89835fadf77d7887d74d26de4cbce33cd030192fd8b76102fda35ea39f29d41513d59ed41577941bb0e6e338b029220976ea1aed01ffcf568587a71cb996e0a750acd7dcf1a7f63e20a3f56638c371ae7d2a0e99dc2f1b3acad868a03db9783da9999488dd99a8dd132c7435138474f66cf679f131504f1006b93fe74907cb45057dc356834603932c7af790b6469b796ec6d2cd7049549ea982372628ff2c65ba3419af91a59e3337e0563e5badfce0a60b30d17cb98c1527bd3f8f8ce87c7d189c58b45c1b7a4cb449ca0c232bc8c23f96983d9063aef646fa2b8c480c27308746b16a6352c139a48c76ca68649ec2f18aa28227c2ab36e18673aede3b2ee07aabc6ee58c9698600393dbbd7b12245b6da93313857d64972682bc29bbcb47a51ad89876d9c35c8fb7bdf3ef9a9bdd919c3f8af2aaa18c411a680f0233ceaf6fc44d054cf909981e72f7029ea56eafc7386e2c50656fa5bb24a8b13fc081a81005bdc7e2e74d4ee6a752d3c826a6a4b017389cbd79a80758cc9214bd5f2df416ef14f1d81866a4adbd97a272898469ad4872b4edb255c8c89ce223772da38a6adee4488798450b2a390140817a5ec23b81e598cfe39d0146a140f897a50e6c14bac59f3ae0919cd331825cf2c431f645770507ba4683bb81d046adc033d4893d141ab967062b6bf7a24620d066b80c9568486f305f3ad81d23f40baa99b7015107ac277b89ba6c5c4f5913b4f713732c183a892b7150357d785b5c013b887c41bc2b39f941c4c56a88f90d28f57a0ad910b5dd7e9c6b202e07c3e6c489eb6e4aeedb3f3c5f9c4e2d1dd9b3a83147a91774d4115f8f1fde6f2e24bb9dbdfbc12cf432462e12e4fe1c9a298154fec3bd1e27af0ff25bdf28ea4ad3bed8140ef60bc76d1d81c10b1856580c712ce14871f0aecb5608cda78d4ceb9d589ec6dd22911d40478da22ae3c79ad4a992226caac84b62c4d4008cc9a79f20c201aa4cdbb85fd05a7f719f839a48e990fb3631f98d4a906289062a6827c06c6c02c155f68c666fe3ed7afb4fb628e99f5473e8cfb7fa626a239493b0820d0b102f7faebf95d7e572332caab0cbed88b6b82ed4b6746ec7bd3550b995f533eeaeb92c57a1fe2087cde8898d9b8019c9946a0a214fdba31424d32731dc279d3940f947cf51f487994be24dedacad949089ac412bd1367f10789ca535aec1cfa1d1d0797d3d89573ab7fc7bd379f6ea0dcdb0aef8b6fe8191381e1dffb90b78dc3925f5e8b22f9599acee65e920f4a5293349f6cdbe2da9a094bb03a55bed2edd3ceca8324499e67115bdc894268e656279d5d5219737fe7a44d1d6eeea48ee049379976cfe3c3830cb91ae24346c469d55fb6176f6115a384008869e0375e2a9ebe768830ab765197e85f2b232e2059107a1ee3b3ae8e14dcb66c3035308c5398aeed5029a7b3e2816281dcca3957e4d26f19ec8483747cb1cc759cdc0fb9eb94a55535978a5d63c4de46db5ff0c0172c77f5436eb4a389f0e6160f881d5cc8399180af5b37dabd124984bc82948e75bf814f0ea8aaa8d1a338b84507d6f1e0fc5fc715dff506ba43ed16ce9749034b787f182f6676512b1eb78c66ba87a12bf3e779d848ccabf36830cf6636749fe74752a0cf4f16479e0b4d6f5e72099df8f5192a4452d87e0c0e26659fc44bf269036cc4b7d0e1156427e444a9c43a7e5ced3aebc937819c94a7207c17b118471ee986bf73ae3675be9f3000fbfb2eb3c2e3c7203ed2376c74abb51387cb569cb1186083a080d14dac152fc27095e1c1b5e2bbfa4cbef08636ce20c286dd5b5dd0b02f9d6dab84564c05cd668b728d0748bf2059f52b03412236edfb742b466453540b362936a7e6e4cf81642ca141e7d2362fbe60489600540202a684ac4109256882af38523894f68c023f9d5aac168ad91fa77beef820dacd172c2aff8920a3a07a501bfc9e2fd828c430a508d6d6d969e0a16eac58b90f3a173a0d25e65ad9c4fcc595a8fd15c4136482d1d4e70e0813ff9dee532a0ed8987ab21b8e0d15d82176473268c576fabf7f53d65f42d8e88acb66acb6090afe449b2a0019cc87e785c8c7129e1bd50369e0672d9b334dd6fb7797d2962de2c26057f42697afb7336ace953ccfa670b95b0626f449b5f13b892b4aa9b106d03c6b58315d52030d371c74b3ac0b77ba7fddba60794d724327915e0257530d7e664672ad10474c105cdb29c0b9ec74ba26a63a43a55965e402e391cd07982b1fdf343b1ad12725baf85dfe82dc1f458937d1b837d908d365f2d82a1719f2211612db4594169ee3318318d403db33a2efc8902867e085f039fe77440b1115e3d0330f8e1d383c2f5eae2daace9ff1ce966eebc7eb21562833087010d5bb9ae42b88e4010d74980ba53aa3a1485f85cb22da399281882ef39756304e5f172783797b3e91350625ccb0943615d0a0d34a4d7d449da84f4991324d1f615efcf964b6815f579fb530099dfad9996fe9fbc6f726a7fa3c3e82c14727cf279f1a8abe0e44b926028782ba077440b81d455f3f2a0b9f87a3d3ec8328b3f7d344565ba04e0b34da017a0091365f40ccaada1c02b0842f759050924a982985cf6478140a968bec3d5108b1ac114fc79811de1b6f5af90ade9472b62c3c44f38ad99bea9fb01dfa5718a293aeddfb139502921a06ccaf5320d56cafac1fbbe82978787a8a1a66d6646f296592325803400341038fa3576e9020c3a6b44d15b0c9a907410332990ccb64b6b53b598d4ce74edbdd598f05ebb2ee36af3a20f5ce83e2078993fba53351ed4805d98c66596c6070effdb8b8e2cf3adb75dde5deaaeb708784ee553673d53dfb17910a39550763dc4316812a8e98b9b0cbd4bdca46d98b566132b294d9c069627d72bea10af8dd3f0c73d883fecdcab6dbfc0a54c86dd889eee1918faae384b086a1bd380c79b8dad19d1e893eeafe58d8ba234b102a1c74905437e89e91a86c50913048badf1a74cf2a1a60ba3892a3fb355284880a06b302d50c2a0ca864500d51c5a08241f582eaa512a20aa2724185d382ee590504e60bddaf8a05182f54234c0b60c680d902460c9824983060a6c0b060db686a7684e084c5da5855d46da3a9d9118213166b63cdf6cb6a4567ecd6da7ad5ae729effb6d1d4ec08c1098bb5b13a1842d7d487c2ec8ea7f2b4322bf7d92a159db1fb3e8f625ba6602d74a727dfbceb48e09cf38b7148637eff0041c714ceb911ba2af981579c10f103e7afac810a0f566dc0185f7b79d5613f144631d19d6fbc39e79cdbe784eea654e6f224901c3529e20361f000c29416801459a2240a26aa58873032d2d3e4089097135a8a2113e46840082f92540c78f416bbbebb6eaebb03b0dcac9f2489620a313902c3139b7bf50f9a8a5d6f3bac82a89c05cf6d98dbf016daeefbcffdf6f8afddf0ddf0d542dbffffbf5ce06b7547ca64a1fff1dfb7bf7d32f059477696f38a649d2fde2edebe2de88ca56dfc43efc3c5e11bebad3620d3a9116202e80c592b8da917652212cb6109c572e24b6436cb7447732e8184801448c4bfc9374de85e499246cec8965925377c377cb9d069c5da9513f85a19bc053fb2cb576ec3dc86bdb2873fb80dcfc837244992b15a62f289ee54b6654447344892cc2469eba87b25499ab2a99ae2323085f014cb26992ecdba944dc96a9024994992244992a44ee80f6531f0c65a161b1c8fc90e0f12f84747a2ad1111d12aeb57446ccb061ca050282250ddceb1c3a24023aa0db95f0fff23fec35ea6ff0f62cecbf40742fcff81ce005175b8c468d26c083f42d550558711f680e35c0ca0526ab81a16105d7db80f89ec3db1d527a6c471a00008b037b769cc5784eed5e75f3f84ce5c1aab89fdff5f8bc23f0e1aa0be82f8b10e3c10850c0a235847632e3d825bf940812ebfb515dd90502b6f23d88d13b878fec5b5d09dce64ea2ae93d2439d7578521af623df5f57abd5e2efde4be5eafd7eba5a3dff57abd5e212b3663c965e5d0eb929a51b763b763b7635d62a48394b4839303a413548f3000f5ea46e2470a109522a8c8848f42163473eda0b45ddd70bf1200bd4cbfa54c4990391322425bb5463d988df11fc41780d8edd8f5209e3a88bf056dd5927a759b60f0d416bc909f41fc14a53588bf6f8951d6dbbc86f173c7d553aa969fe225d8e1e9c99ae35ad0dd8e19c5d2f2c202ade7e2656147b0e411e1539c3e9e1d141f810ad23573c74df023ca5881b1832bd6dde6a0e641ccf8603f5666679646848306ff220bda4a51afeecf8b018821fecc75417c2762ddfdca20feb6e5fffbc46222a9e392f76d91f05edd4349397563bb1d45e851c36322665b389ea6c5dfda116c7196fb74ad92d08ca12f12dfc5e8a586a5667b7c76e88cbd78a33136381117785c60b04af21dc73f90edc8f39881b783061f16ef7aef8bde08e97d6ab55aabb55aad56bb71d6b2ee366f594de12cb7810a00e009c1c1a7245b1f71dc5ee86e473b13ba9be34e168451ab71b523badb99b5b05aed98e27811badb91db1de8704df1f7f7bb63693b37a3585a5e582fb55a8dab596bad695f9bb576dc41f75a1bcb00ac706038ce8e1608c755a0bb1d73add6aaac5663359f6ad6f8e7bcce2bf99def515d9edac217a5525975d89aa4f405a911d55629f3961a65e1a81fd45d7239d50ddf0d5f9e24eb190a684be8615ba51d2260c3b77473f7df54a791ddfc6faab9ad56613e6a357cc20ebad7b20ebd4ca7b4226dbdfa2e5ab975bbacfbbdba69b62ccb5259e2adc45bb61e67a27b2d4fb0de566e2557e692d64a97cda91a2de7b30e9121b1d75249dde19e46a9546195483532d6b154471ab312a28ea7fdd759bd2e9e654ba5734ae9cb00d2cc06d511a88e44bd8e75ace36ad43dddcf06e2412c1a74d02c9b50596fbea9297cafe7670644e3319af5358e2315facf2f35f70d596bad0d62e50f4869c377c3d7c929b3dbc4c5c96f5cb655daf0cda513be165febf980af459de7593acf8beb797195729ee7799e678f336b95d2f9e58fe759cf243de2bb729e67e93c4f1faeb394bab1de0dbad7f3ecf15eddaf713c7b7e8082c4256048fd8da812494901a1582d7d201db1a39ec7b67c6cebee7ab7ca03f0bb681a43b1d03dffecc9a34691ee53adf5548622d8cdc30621d1a2ac0c5befb7bcd88dba978ad705ef6d5750f8c515c46ff1711c59381a479b8f8da338723af3271a6377ff12fdc0521d14c8e2ee56b0a19bdf28bae60e66fab7a631b58912a93227b62bedba1b32e0218a204c923822856943b700dac18610240de9e288cd6f5709d4bac4f0abbb449d0e197922765a3302133b45aa327d979068dee9ddfd6f970754e83d3b893d68aac200ae01785f0b707bb300de77ff3e71b56e297a392c72e6f286cf1f18d03de70cd6f33c7ffcf8c1b182e84e4f2566dedc99b99a58ec3d2d2cc7b96ab89a1511fdd15d1efc2a3f35563d902900945ae4e94687d02ab83e26c78e2756cfa84137faa33b9df5aed3e0d025163084a686a893290094ef75efb6b92813db4a09dde94c854e4363f1c55b0d26582ed426fef3618496e7dbcaecc7e4f228f0d0b66a82c378a732cef97fffde9965c813b3d6b641ded5aff6df0cb3586b9399339366129935f3e5bd0ae5b45ae79e78db3a33831b4c72def26a0addab99cd9adfbf6dde17ba57d37499a669ce5cb655794cd3dc52d514a273364d73334d934b71ce6a6c6d6585691565d69d8010a2c56aa857370bd5b443792ca87c3b2bdb6632c95b9ee9fe4f6391b1446f9bc9645b65a17b3585aacc9c9933b6cd64b2792fddab29544dd3fa9844a6b96d2693cd8b41f76a26fdcd0f4b67336e736d5a03052c1836aede4b24d3bba1eda2762966c21bcd3a9ec1bfd70b5202d1150aadb51f0eec9a2c893a99c29af7ea96cd68497a460dca7d9c94b170d068202aa3b21c0e5b6c3911dcd817cdd4ab3b6f1c67afbd1c276b9ccedcdcf54963d118922439d2879dc2845e93888aaaed6806f9594248bdba635936db60f65c182232b55c221419819b244992ec488e2544f74a8e32254e9f72dd24c9cf9d5db87fd9168ff7ea2e3a8b8c907a258b00bd0ea9738304930db74b5ceabe07a597813ac6b390c8ba1aee36076dd7e25d61f432dbc63bbb84b8c391a3f5f2f2f2c411c691a3f5f2c28578e999d75248da6a8d2a3ea1fa4131dffbb15fcffd6c409a8db0614c22c12c23ba57329baa8e3bc27b7567246ea5055207f21f01c5d2f292316ef178d0bd92768f80c48d76511c877c555648c4429f902734c332dce9f9010a7a99108661188661b80244c6131d862187128a76c637d230996e4e5390eef57c25a44facc60f2f63cff34cf174250b2f6d7c405c4043876269796161603acfb334a5ea8984b6dbdc1d6f2128c7429f902734c3323499ce2926ef856dc35869849484a3417e0700596ec3dc86bd10c82eb761bbe1bbe13b06dff0cdbaecca5d3e14e368390a2ebe165fdb85ee4144c4c1f8ffffc7c9d1d93c2b387c2dbe966381afcd2b294f1b7a99920c6f5429975645988c38e5ae4516b338a5b3065fdbd2bdd058341c3428be850ace0a8d46cbb459a5d9d6f36cdd7eb3039a46a399f9cd376d0be4ae372de7d6e345e88c1d357fcdc8397f39e8fee69fbdca4cb41a2d041f67488e8e121aab229f1a39d7de4c810a9e098d96694ce892f96629531698cdd189be902063afec95940a32f60a364f5375bc58f7666d88544a5091f8325c56f60a36ad25a7124f756246119073ce2b2e17f8e00927a30d8ecf51f72ee59813af23a35acad5e60de2085f78dda7526d598293374ac63e9966a464a450225da20920510595eaf994eada9437553940a6a229ef1b265369d37c8b2b4570f13861e789d8a94c280562a742423d62a7329d1e994af95473ce3b0156cc3141e84d6d565ca84d1d6d8b867a7573344f43c41838889d462c5584f0506130180c0683c1603018ec05dd2b2c08c6f7d63ae7d8f1e47dec12d71b01e629d862b1580d0c0683f9d4d856256130186c8886c56c2a16a31be6882e20fac0f892ac6a78821b71291f9107c46bc28a6125c6476445056bc8171b2208ce05ef40131ec4d36175026fe803014b07045178189e90d95764c581ca5f781c2c4da7cc9bcbdc5d955fded5119b9704b722411112ec95bf304a1f15269ec3cd6f7f44bcb38fe695b49ecbd3981494e474d07610a78320d8c10e9eb811140882df15a0cf4f2d6d2b5b3363156f052bde113e2fd362e9f992cebc29dea3930cee827dd59d1e1004f5c7c38ccf0a1a436a702058aec8363e318a6a48ae3af2f812068220085ef083c117a5e349328092a4c16ac90d0f0c1004c17af4643deb513dead13cc0186d831ab10810043f0fe8984763acdb4700f87cacccd2997b39e0b8a315741dd701e95e8f7a062b08823c8a8c9092764c02317844842b185e02a06261c12c50e8ceffedb6d672ce8ad304502fa7bcb5701c2f4397409213ab609400a8944e7a45662400000063160000180006828563f1689e685a87ed0114800d445836705e3a4c260e866282204a412083400c820000c300800188020829a41c7c00014cfbbc45bf9b77404c233369a984fab6053beb12efafb12894c88608b80cb196274752d3800e02e216e48d46b87e7a08c4c03cbdcf6fc8aace4e9fc389fabac9ce8a43a93f610c35e794152051a2950aba14af5d34a9460730c751a6ec67a6e429b8c409728f6038c6f3f3614a3e8b94a794b24d4f578cf28c8116f7b654069495ddac86a3344f61da0b2ee66ba73f52ac042852999648b1dd3ea1cde3730b7df75cf5506da81cad9cc36a3387ae1071cb4f5839ca2f9d9acf03f00e5dd086c1211f8ef929a889c413b8d810db9c0c21fa1e3e2057c1138059d94d072068a7fc3a3358d319bce3fa5feeccda46cd800d7cd2ce33170962ba4603b6cc4a4562f838c2b82809b10a8e7b3869d4b4f861942553fec17060fca1081534ee6e5b3aba9297363ea1999f7b40f36d4b513e582dc787c919c6295512a3e8f99657c6076370200112d5551ce53cd2f4e5b59b7a9091706126751231e793d89526aae676caaf0abd3bd2599fe7bff962d64ba553b4ac3d83d0593868239e209b915ad329588ec7860b888165fc21f3e61add4a8fec1c33f5c038f038c295e958000f6603968fcc7651fc1018edb35f46aa7cdd4fa7a05f7a208f0d4ff6a4078ec665dc518926b3991e9a475aaeeb7a7403c3a54bcf23cb850a8a62c0993901d667600b9f61e2f289e2c66c797a508a5246ff4c7e81e2d7f0d6889239dabd520067ce789e8687a7f44361eeee7edbb19285d81080ca87c3d74761ae9aa9eb04d854058090670112f89edc053cdccd897d38906ff2c5bab5ec0483b71cb7d506b7cca38144ebd102c681c31667079d077a82466c81c654f5150208c82e4cd6f999fc534f16d9d7f6a734c496db12513cac542f85a3fc1c6530d6e99571a5b835dfd522c8193428867960140eef39bc3338e9611881e648b4cc156de800d5f7910d17f08169f343a5b16e72e64634532caaa5f5df912f1f23848046ec2f240fa468d1d074620d6276869eeb4a991a0244c3b905009384e4fac140309847fd010f70c5e822112e1e4e9ac31d9463c3cf1fa388f9cd5e29d1489bc083eb3cb54c3353d1f93ed2492904178cbe9bb6ac64b73bf82e93c285df2d71dbd65571b683e5df6ee9d3414fee1313385d3474c99b46a72701b4090962fb532344e081c2fb728eb76beabe39d9561be43b7db57348df94c56aa3ffa93a9149ae8eeb395f9c495de36e0207fb4871a055f24ac7f99b6ed37fd0abf62fe1e5a673cf2d2144acf32773af9c586d5f798094d54c9dabe032cd30541c921d9e8c31e6b78f626d4a0638483810152b99cadf882ba88c6110943725fd883a4a5c9d006c85ba19b0ee8449b3b43232acbef25774812b58eaab15ca461c1f1d97955ffdc4bc54f9248bcf9c9a63757b0960b18ed3d4ceb5bbe3c01beea5ce8526c7fe45376aa218447c5462d15bb15dfe15af3e58afb6846fa3e27c547fc57a39297bcb9e4d3e516db963f6ea26c7d2fd1f0395b8c640def80af9ff859c7b4e745ee5bd97bb883a27c45fb6c8bd496ef493ed1e5a0990096e6e243cc225f2995072551c291f36eb3ebd7c82c346b5af9c1a44c195fa3fb394528a23ffc11c8b809e646d7f9824838242b1be65eef43926ddb2ce531b3428d1148ac0d9b1bfb40b2608b0181838b60213bb31c9905d2592ab71003ee7cac0e99a0e8e4e2378dea086d073d0648fcea29439a2b0cd69fa67f7261441a939c89bc0df6d40edf9d7243cdbac4fc0f9599b84a839ed57e4fa214a1f1ec91f088da8d8f01b373e0576acb02f5b0635ae29dd34e60d4827288430f56cbae784f4fa64ac1782e2e7a9d8e1f2c08396a3a3d27f6524e297a3f814ba0f10586c40e4a66d257ddb57cae4941cf374191022102f2b122695caeb8aa50f44dddaec1cc94b62755321c331952a4ad19d528dda0b906773a5e5bd56ba3602040196f87d3bf075aa80299aff9caa4f75c84d40b07ca961352309b0c30164c973038c2c272c4a35c2aea622df7644ce1a4a7441cc44e3721281403a02c668a378fa14913dd8ca4d41c9a516baa38d6ef66e55aa3ac79bdc229c8ce4db120ef49a49ab3dfc2e97784fdc8b990f72463c48b670e24619d07b22ee27746b05f4fb4450b3a8bc1c4d8175737718febd1c192a53ecfb921342fc72e8d377d2ebda7038e3130fcba17fe8101a80110cc18e6372b07e5e2e6078731f6b4a1f8d9117bf06059f5b8ed7beb88082451249f596c19fa03e4fb11090d59fb350fc0efebea007bee40187ad5d1820a1fb1f7e169bf3da2ca296be3e728dce4e02b8fed600c9489e57a95b13805d9e931019e3f23c48dda1d82ddff6ca325d81a4f5159200401c8f3088c1c07a44cb6deb8e750a92cc047d7005aebccef5483f65e1805ddf58c0d87f9700683f4800baeb2cc200e01c07af3542c199e373626814f1534a5dc7a0f78e848ad98783763980cbf9ec4d73e8b303d3e0e8088dde05d0b023a8c333dcd6816077dad9410b118fd7446293554ebe39497f257dc9de07b55f1bf49ac37cba773b19fdbd620b45f9dee0062a7a37623fe2a61379a5e4f606ba1b314c7275127ae5200fbddced8576afd85f2e97d0b514bb1bee1b68b3c6984dc8ea3da3583a7376f9283a399d3735bee7166713b4f69f8a8e50e512be06888dc0edf96b334bd18f9801f80cc5e4f42bccd1ac27a1957f9ca75bb809813a4d5d6c344a5ba5cd6133cbb1a7158ae279383abf2c429df46dc40eaddac8f0f6c14aef6b257b76b736b74ee6b40e1147a1153ad23621c48ebfb736c17bdbcbd3e31ffb14a4dcd2a184312edbac2aa65b8ba85b6c8513bdc1c5f984e8a0030558176d97db5868e7aa436f26ee1c9fdffd217a310f292ceba49c3d3bccc8982d5279f6497e1bcd8ba63c5cb50f0660f339192ae2c3aef80664ffd290c6bfd9c9c2aced83a978a69c3a94ed31e3be3a142d05c2ea19f12202d8d58c84207300754ebbe64962979d3a50f4365fd5ba5edbeb952997f9c30e66382d49a272a510286bb6618157ec8738bebd6a28501eca8970dae24c9b9429e09b4c1ad0b04729590035474252fc796287c408165d41e7b4ea569c052f10c7e528f6be133707becdcda1cd42f094e25576b87dce8174f3722261c2725dbd45512aa6236fabc5af885cbc8aa7f8ea7f934178b4b2b09866bad6e7e87f295d0fbe2d8c933b7a3a87c50d221699dc9325ddd019e16602219ed48653f084adf839df3e6b149825bfd34166b32903b93c63df249687f21fde55c1e2654d29a9e33b6c45f1c05d0bdcb515f5b7c1cb9da1847faa7c44fc3e0b40db87f1ab360a6ff15278ec50e139e53aecd6e1dd201a51ab879fe3ee1dbfb4e2560bb30e2a34886d16d39e2f053885b564a711e87ba628ea0822d7e75de119a8f719cca28bcea7f7530c635ada374f1e0a5331607264b1fd852ffea3711fdcf9686f471a740c58f33ea46a431281a4505060559bb973267773c507abf60b614fe1519e75cd08501a430a55df1930d743fd7246741be3361bc5de37252e997c93c3561eceee1fd35420a2010db8abf129a0dcf214fb1704f60e2cd59bcddbbfe9136299c3587155d462a55964fff39cd5a375a36307c4cfca5abc1b6724230a2b4c5a594175063e7a612d2d9a406d4ec75528897716a5adf287cc31595f8be525e46fb67d4c228e5da5927c252200752de8957350da578cc247d8fb17011587aa8369b3f51d10d5c12f83d222f5309f1cde1aada9d1ec6228982c2ef9204bc3120e2aa362df2357a15fff49b54a1c11ce6fee781379c949a2216bdd021f82e716c60c2091c01e8cd13333162685ae5be323c3c76146658f7ca67eca90d5e4cb3328ee31d89cc621eb098f1cdcadb64d76ba78b2e7ebb2845c542ab9765f1573317bb7f091d20071a68393b1bba1bb2b0b38775847ee7e71921d764f6e57e2ad9c2e71dc246790be894c7a1add9eab95b54c6623820d4bc78ca992babbc3bc4b41f1291aee51d3c4c466f708b69b727e0436df3c076173c86612cc255cf0ff14a9782de6c24ac0b101b2c16471cefcfb127372fa09b6ddbe5f77e2bd3f47fcdc15b4e70cfc2458bd35839b846a73ec10ebefeefb321e75426d7d14e4f5cade5bcc1d9e71b8df569d6c4b5212172c7ebadd93d525f3ab5c80fc0053784048d2ec6ef0b30ddf37e730a39f7974ea386d9cf35ab674a6bab0cfba278b42c998551fa98262fa3a1bcbd93ef0b965cd253456dbedb3a77c6f2d61d811c58c7aeda71c2b1b8c7ac18edd32a99e7519cfef89e8a146373ae02efd966da667c52e799dbf29aae551fcd758d62d9653055e7fa08f7078c46843f8fda40400e581b9b031e243964f7bf95e647cc856f7232eb595cf9c3cf4e91e8ffda498e471d4eec5b6ee8d049af8d2990b4d0fc3a1a156590881165a56921a74e884234563c7426877dd3240db708927cb1fbd60d8f8b73cdbe50a824ca1b5ceb8842e2349de6b48db67c26a854de120d2e4d135901929f3e992ef23e4ea6f9b58dd2796b9e172f96f26dcf36aa9947953c4653c13b7cdfe90a10ba21c34986efcb0597289089632e1783091191d3fdc0dbef5fdb985a36afa199fa69f80ef6f9d6cda2c443d2098d4c8573b4a02dedc49c10122e28dbca39509b897d339edd7a4d8f4f150a08c40b66ff4bb9481ee96df0b026b822a9b3b0ef0f7d6a6c19b9859e066b90cbe322b1ad1514df66f6f7f37dac4322dc1c0400fa843ed5096493e31c425f6cd2e96a195ded9ec4fbe9528166fe9faccb33bbfdbf2609264de4dcc941f2f18b50e0ab5ec5cbef5aa577026d0dc26f44c77470318f329defced70e145935fc7267d67da9cab383292f68d14fb75ed3fe36d7850455b8d216e1b23abc6294b1840e61c5a7dd8d4607fd8033585345ef138d68ec6288391e7185ce0557640465cbef728c1cc19aee403c654aba6cb1a3ab5eda561365a84d629bbccc3ac030565c909e18c6fbd2eee14f36618d91490c20f24b50a55a17ecba9c9b428619847db6f052d8e60d76311a3dd442d9b7c2c87c56f5678ea03ed4cdb4bb5c3cbf9cc27f6c15541ba753dbe68d35c398388f1effcb3a8ad40defe07cffc493e54ecefec14bb4c0ac5de022fecffc43e5b01b6893d06a105a8973e6acc00f5e5911ea52cdebf73d4ff7c85a74a83515047b519e1c7dcfc6980741ff4e421e4eca82f7ca00e98695d4cabed1db8c51a93bb742822affb07459c39b1b93016a1e8960f66ce53b10821fd44817d1e1e1eb38872e2ae11eb31c43e194f3d73683c8bee1b89e00396f864e96925fb09b3ac4dfc81ddf159759972b8bcb1e36ab390bda3ed8b768208f38ca4bc27a848bd7d840a4942658eababca204e1100068736b11d6010a2eae8ada74b5420f1f9ac86bb81759d007dced8dd73b71b81065eade9c5303b3992d58962f48e6eafc2ad601aea14419d3e677ba01c6898355558811f6cb38807bbabbb1204d517741738b619fda41f340aa9c3e9eb324fede2864c74ef83b5707f7407a3714fa6f594f274bcb7b69bf0a155914df4e9b88244c4a7a8ea70024d427e9490de5d4c3fd875a34c2473bf4946b2dd5492190ea5926dc39564062f4ac860a2d466626e9a70aa586a3b0413e7dbab4c2d246dc8679f14e7f349af5259b6b4596cd0c36aa852d193bc2972df6ad4accb920ea85ec47c0aa8de9962a5fa3904cd56d93ba5c77b9247184e9b6542c18a61379bb0d296afb43ae528a84d94204be90ed601bfee2a9f5a0cc3912a7a7487ddf8ec2b4574943ec846370a55b738ea55350a164b48a16e0905aad089093d662272936cf6a18f5b866fdb88fa2e07e1261e09b17c0aa47a8d215e2a31316994c0568198afc0c22f083934740a003a4a4de90039f810acc6cd8b3c9e98b847a1ecb5496512b09e9173611c83b6f7c9a59d06348e85ce44891918590e7e4056938622542cef81b3d718da74a862a465b1a6da06b66535f6e4ed0fe321c6b668e5abd6f42ad24ef33bb8e74ba0015ecac8cc35c57c057920ba446e04f137890f89aceb5ba081090f011e615006048460dd9e22628148fe438e671fa267917b7922751ab62eccb4aa0d10299f0519cdc2e2c11dd22e5a150b16c5014f0a588cc1a115668133efdab9d32bb3ddfc13ca62dc697a82556ed9c0a36b63db3e3da42b276f6a2737828f69255b8732b65700e5fdbd36c4585707b2711d0838f2e0b14cf891d976ab4f16e051bef08d746ef939c9bdb944b104339dbe702cb672bb078d18778f953edb891bffea6cd9ca186d864e201029ea005d78a29cda729503c58aa41e4a681b13996aae4a19e29271a84d68d310b3b1a7f6a7644b837d97a76e3479ee9c455b2555ee3aa96c6d0728b626e8edf8a0c015e4223fd5f17b162ea00c56632c191b965af3544383c5f7d3e5f23bbdf1b567c4dfe2687a517ab1806d79c5877618405c5a812ece46b6c214eb1ab5ecd297aa2e084bb22d3c78159161674933f40c3a3049cf5c0d83afb5635ca5f5cd79ee5c04336ec45f6362bcfd1408c374c3c2dfd164d8aaaf5b15f4c3e5d50e6c2436fc5b59ca252f42a01a66928c1d339f40a6feb8c21cd58bb27beadbf3892b97dff3dd6c9b5ebd37ed953fe7901f17ef2df69ba8d363fc1143b49f1a9a62ce3fd4754b84035fa14a96e5ca2f24a18aabef97b79972830f538c8621d7fc79d536464702689748ebe6d750a5cfad6562d6178a1db88edaa1bc61a84a48197f5694ae18635822a0704ae50f7378e28fd20a2e4bc85e2a8f808768ee4d1013d7de5dc29b566fc5c660b875b45a2b751799ae6d0ccea57c8a599318a7b139c9bc0e4945286acd9ab48d28ecbb6662737d07451387d8518aa8922285c89a8ba229bd8be7597812ccd1c8c534c0897f43ad418868a3eb86618b7ec2910f279ece530d992be964e60496f3ccff4bc5f2479f2fc4fd9363d49c28aeda5e36cccdbff22f27cb48f0fa99d3dbf57914c2628336aa9350b69b142edc572dba6adf2a2e4f2a21a939011d9cb5124689161ca1c478a31e9887988d8ef4e444203e8740d36d06cf10f70010319b8c326f4746b1f7ca0d40b7bdbe298f40c611758257b12f93fcfcf31673fe8203bd53b52a89c26f3418244ddc4e0a2a501e203b5144199204a3f4cf0c01f6c5fc2160b535d80dc04638c7c4075bee23cf39407b4d2e81406f5272b48e7a008657f19889b42277c3ed16916671ec0ca239ab2ddab90294229d3a18078e9e78d9a9050ba25190379095ae0ef2b3c115488845a712da46e6c6e8bacf8a3a9d717e58aafbe1ca9b0abc6e25b64ecc6cf52d8fdc02337670c6a5d02d7e60675161c29dfbb2130a9916e3882b27b9ddf2e04c987510a793095ca28fb60cfd17714c3a72711fadc9d74db5ed5f356c6964e35ef9f0f7f607c119de3367f844923e7996f1609cfd410bc5f79f2114a5b7717d7f8e88b57877be65281322ed29ce9d27dce14478749aea7cc732edf33d878ec88802def08faadd3e594f0d62e06bccdff58e24e26d64e49d752622877ecddb56e9a1953822aa38ef077304fe854aa86c52de17a8c272372352b3a720998aafe7a5cbe20d691afb566e3604b430451f6e21062f9f6aa84144909411f63d1731ebee5cf8ad9c365164224397f09d413a6f73be0654887eb9b64c9e7dcd5994e5591b6c997af8192c909d7583ee3a60d80fd7b57aa41fbc81dc4a4c87abee85264704d935b0eec022bdcf1bf34ffa2f0f8c191cc18b50d9c4a79c879979ec244f209804fd8d3b1ee57886df480dd64202825965af6eec29c3458c26f89bf717eb5b9c49d48a7c0af236cc8e4a097b0b22cb501a0f4bd40c2e18796c0f9bc12c56390759dc2d7dd2ddebbbb00a5181483e38495d7e8739bb156ed7f82df057ff77bbc44523641015276ed72d08c90df549bea4930cd6eee3d942c71fddb932dc0df00c3f8f694adfa2b9c3c6203dc5e5d8605af112fe6e69976ca5147908017016e4b74c75e83fa93918482528bd2742ad386c0e4ea861cf7a4a53381294753acb91912feb5e30624e5e905b7149f4f0ba076d33d350e25072c39eb2488419c0113795809e8270ce59ae7aedf80eb6b9047aa678a5605005cfd117dc75f239fc9281783bb83a92defae47ca1c39e779795097ee3d4a284e7940b1d1ebf801d6b274f15b9c89700b4654959941674c315e4d7115fcd040091e29c7d2b1865f4dc6ea766a27cce5fe6d6e59e00675be12b5ec13eb9bbb90869df96834001507fe59488a9eb6e4a9c17540be294df2da5714782ce5628246b11603cb361b43c1035d9c0248bc5c346dfe6b489f3be3fa94f90666fa5ceddcfb6d91a13375ca88a0b926cadab6e3f6b2bb62dadcd2d0080fc2334a54eab9b898d564d6e099e1ff5d25dd5970cf0a9dc87c232c1e6f76d5c393edcecaca58a9282aa974191430bc79d1a5d9cd256ae906dcb5ef0b4d171a65c1bd92211f80ca9a86b1dc48f171cc4b33ddbb0c5214578581ca62f53d825576620f80ac2d76cc9f5f77f4189c9f43d0ef03db2f9f802e09249c564631d7b81066bf8187cb51af1933264a1628ce817cb12cd364657957472981e07d73e11340851c429c6ac8e24752f14673a2074f61e03a0d889fbf4eb1cc9124f9b6d2a7ffe09f5de6db09632894d9eeea8cfa68698e83eb592e4ba84c85ef47bfb6bfacadc0891fcfc9a498488e5c2a16668292be787e031c597eb72d030d398c5849eea88357b77d803dfa4363050d3f8cdf6394074427bec7f5b3519539a46152144c038ea2fa55dc66bc3177ab3e794a00603838221dceb97e4ff805bca29b8b4c6a4d3cd60c37e77c60358f3fab3e9ee061fdadd786179bf3b1cc7a1a81981fd0bf5ffc9efe78e72fdcdd15b288b8a706f53b2481407ad23f0231235cb92cd4f1024a616afb673d0bd88dae75fd0377159b2bc7df00bc0b366eb693063fb78442a1277ae814afc5462f1fa72c5b67537b891bcb512fb5830561f8481ec9f3de298dcd3f9100e90dba42d92771e8eb54a05be934d27691c97bc60a7c849f6ff453d4426f282ce71705656229de823d0d9c8dc73dc8ebdece3ef0dce10f558acc98cc0075dc4d74b7d7d8fca7fecbe541ddeef50dec60d7d624a17d75d2cdd5d9526f5b5f47e8fce69b7203b735d1f6b82043bdff72dd743508198547f62fbe2507ebd7da3cec39158af8bc0ea548de94a844f5e5c5b5990817d97dbca3578a994383070e033143cc684e72cd3494a9414c48f3f4ef26a212b3e974d390522a3e28933d5a6e66980d2b6e2ba785a23470a9290eac78588950ebe04b24ac592beb74d1d39cbe729106c94f9deacd22a09d1f99d29c813eb1f9eacef66b89bc10122527c967138042f119914070b0ad97aec9f888e5725396e091aa9271e3065d4664fcf8f984a683bc8a7854c8142fd754103ce06b63452c6cf76f325975f1b8b725f7f845589ab258a6bdfdcacd34e4b5f9ed9dc6f70d92da797c0ae99cc3c817d30446f4b2a62f7d7c49b1c82948cc8a11e4cc2c1d0face126b805a871ed3ae22ae194982a73e0b5bae7c7ad62e2ea11ab6538e0fa6ab54dbac228fbc5ad6a27964b9c2591d117f22ea3ff202cf08f145d6b346d2eb6613f7471bafa3bc8e160a536bcbd231c80566852c7439720d66f61034a9b8f9114e7598057a21c35e613deb51c3958ae19ed4da3f63a014866dc41a0d2b6eac378685a37dbd914035a2342bfa9063e7cf6862e4d13d7d9b4091a752bdcda4c89bf2a7160427810a6830224884276b48d3997b62dcc8b8b2463815d266ac3cb6032f7fe43c360efbb9622c6e29efa02cadd1c1918a481e1dc0229ab791233203d6185f8482b1722c8ac220ef3575d49b60054671ac6d91c078d2b70f272eb822a484c18d58bfb09ac4914ae57f2daf90889466c1954bab88e058da04a1746713a48fddc248e144dee67d680e687c5e171e8eee1da6db8d1c2967565a2c43ab4c4a14a87df4084f54fe548a2c710f437ae83a11acecfe6852d0064102d867146109f777a15239e4d42e0cef7a8662658ff0624fd2a0e6e80cbe935e964051f9dea4e1b31d410a62fa5ad3256d92023eb08ce2371643688ff1da9ae9e162457ef6fabc72b5a8e60eb8924dcd8c5ce939aab4906bc73bf40920007aef745a855d1560d19f076334c4eb1d53b2952359ec95f5ece3af0704ac4786c805e28ceff1d0ed7bda976c6efca80ab6ee5c083f20a2b603e1287da938d5440344af33236c5bbe471793303aa265216029c7fb98bba7ec413107ee29bc4aa31b9c6d6d749ef4773f1b2a48fa974cc1a7a0b930583d149f71fab4e4e17781315c67ab0b8f1034c44f306f543683574cd9682930b09c7d808a5d74d64640d4e2ac250dd1f3b5f4b5115a7d1e86926b79061ba1bfa310d4deced9237d9003d0e48014577e45e990d6fc9a1911c974f3a04f3112f509f2265c227f48f212285cdc338fe7b82bf5380ff5880d1aba22cb092018c03f5a7b952ce21f472e3bacbdddf0cf457a16c9612a1bfa932e642361070640e6b12c54244f3b8c3b6b1073ea2fb6e475cf65314e649750fab54e1780f4d6eb59c3f5dba8c8236926a4a09d072c9a72d1465d904e6ed90de9ac6a2e57272711c2344c9b27b840606f3f2cf926ee4f696f67d8b75e498261a4627e2f4249499ff03ad832334a81304514a9f28d2f34482c0396469ca594d724fe7fa85eb9f3ff9da03d8fb03eab7091d6fdf930bcdb31e2b37dd7634f3202980b5d632139e7763c9426790105cbc4c5f5c47040e95670186c37d1499ef794263d57f3c33ad21651c42db3ea96d71bd412c432df0b2e04b9c9264db4732d0f1ee74364f5256163dce9b9e8d51a32676aefc85299237a79960acc47ed77532ea35b35c13d2061b9718e5058e84794f11eef6e3807d395bb1818f6b7e32ac2d4d3ba878e6cc1b208a6bc50dcd5dce2ffea1a5b1fa9668dd6d737eca8f831b4578e00e23cbc697376fd9f4a4f8236e07d5e6f20acb8fd568fde85065ab8d09d649ba6aa8a2e4581d8b7bed7e25484e39e8fb2cb0ea8c57819715795096aa9aa9566a84422e16ad7230c195cc3b2064a1cd49e1cccde6bd44e5a3164e1e8899ddbc95f439aa395f58cb2f2daf5b01ab0d8f35c81037c1c2167557dc29d71f2a72c96899b05096e06eb88bc1f816f0025dce9bf9c3e4d6b26356df9e054ae8496e6404bd84417ef27f76eca9bb7c3666b77cf1b7d2103a467c276f79e4e08619bf50cdea784660e20d6396b7a9b67b6955cb9088204ac5fa1817e25144944862bf95079cd42ef714e5c9b0fc1100786e5063d0c17c1bfd2b6b62675b67904c75463a3ab0539081bdb0413d2a2ced21f0a4441752cdccd9001153e7a3edf9280bdd82d68fe76f62ab1bce451a41acc8c0031a81c53f0cadf486edf87bf85e9eb0ea698335e61b912a3e6c435ece9eb07dc472a625481286531511652c85782fde813c3f7dfab6d8d84f0f45c0aa25349564da062242cd3e74f553ba7570a27319a29752dde5782cd271191d9335a22c69c000a0a52860c20d6d5f3ec7b9021b32be214b69f815e3a88de4bc1a5e87fc6f893c01047297c4351f6b25f07ee571bbf0a43b5fc8ca990158d600723065d96ceac02c73f19a1f896b127f8f4ed47799f64f8decabd6b5f11f449d9a2f94e86a37ae03a6857747282ee45541fbc745a1a06931c1b138a14fa6a07d5bf2777b91dfc83ea019fbbc77befcd1ae2a72fb54c1e76bfd4c768f881a51b502c135429d84198cd3dd3afa5770a459b301f9846614aed11f25639df16556e943ed13656a45bd2cba5f14cc1aad0abd037499dd732be8008c6729aebf90605f210ae7c845d6c6f216651781af85bb483f1eac0dd5968e4c5397e04d028f33b0c4ef1936b398446afb4ef5f73bd6e7058b5c0030f7c21570bef9fa59487202c0042f5610a81431f9980d1ce17836d4443e1f751c0b033daa2931275964f202a6d957f7a93d43664c6a351d5a47bf055b3ae88d0b544afa9ecceacc08bdcc6cd82a91a46566387324bb3f1e72aedc17781019ae34c7abd2bf11b19dbe780f441df714c92bdbf506cda09fdf177cc47034c93731c353032e6033d466d39aac1d8b754067f474dcdcbd0a85d70caf233fbc7440327e4bc182e7a949e5dc850390911156a882ceba6684cb728a786bed9c01cf045dd40fbf0f0c994dbaf766fa0dd64fcd717af737c6467afa2415c7d86fd5b73b02633185b6f9fe24f8c0e94361e21203f16baca213e6dfc779242faae849f2efe4d9ec7e0730a53b5a21991824a6e1b40e52044e23fbe40924f44fbf23d9ee30cf42d7bcdd6a7ffc5d2f7284f8110ff52251281410f89ac2a2b415c36f3efec5d68adadc145e097c7acec156f6c0a7a238dbd2076907cd164f955634a39f23d7c0cc03e2e7e1254a10252be74af4a2c1bd8189e74a8b9f70fd0d66b81a31c0ae669a2ba0a5f8658a18fb78fcc55e02fef35e92a2f47fc7db39866317e5a4daf0401b0080ad0876a809e5d3cd76c44dedbd8bbe252d89660fc3bf3c259218b004d8ab9f4d5605a925cb963645d0f5ee87f25efe9f017fcf9e8321d24244db966e02f679dbdd182f17f601f9910daa69d29218ea5fbda2581c692b6f4d8579253577c6f7447c303c5d62e0e72cc500d539aedbbaeb99cbcf77bdd3deaf1c465a0ee2f2c7426ee19b2012117500faf25992f2aed5c1ef292ec7ec3939d6f58884f494163d663511872e628c1c1261be5d11bcea62533d9a2424ebc13be64b1c8c929e40377ecf83bc7c3ddf849391e40185e740705a9cac5f834729088f0efa68556aabe1dd5cf10daa0fa9bc1eb7b391678fd8d2a42cf3de69450fc436db3be089b53ebe363193e2e0ac5179a46c72d079146e1b00f4d236f0931ae256c50c82f804b66227ae25458a5e4b55fe1d660f1603e73deb879bc46bbbf3384844941cabb7413b93cbb328ec6e54dc7b8c94f91a4aabffa1659af909b78f1e1a5255df44593d630b2ceb2956190f4b0208393cf99b05d6411035e9739f7f8aa9306d18e928d37c4afefce3a410cdefe16bc46156220b549a3deba90926cff84a4cfef950f008d4bd1d6ada0831c2b8f59b203a7c8927673eff909b78bbd8f6a9abc9fdf8d3ac994f76435d4ec32f670fefac236b338e5e79cf03f67b12a7120db4c012c1e2233b6ebce5adba2af9149c3a5877a1a3426403ddf436d38cc5004dcaa4154d020c0d51c2c4aab65c0b669973f0b50b1aa84b8ab0540a8eac199b7799d54827e0af6987499df3cb8d3c9a91de5079b0ba836d0fa5ae652029ad0303347a99ad41cd503e10f9e8991a0228420dcea9a1a8e3c112c3df14808dc532ef34ddf15b236685e99291f8cc34bedbd5c8b3a44b1de0b949a6c4c6ea5a195d37b47967897bd609f0cb93d5f70de11d53559320737cd4592a8768279566686d2e698fb692205eb4f7b40a766b908754e8af50d96ed0f772ec9c35e10c2a32953211e213d84510eefafcb2ac0878d0589a0b01babb5f0024f322f5e554584ba935a4b3322613154dc04459d13ea8bd4941392f7ff1d60a046a9f3eaad447ee088a4a6e5db9d13a71f4a94078386ffa5bca14e8ba64d6dd96ae7596dd4adbb830e2c1ea530493709d9ae7290a5c207ab54e99a456d6325cfd99260602963813673b4c70b087a7eeb6755839e5f4ee24bace87969b4d3766d0adbec11bd102645629ceb32ecddc3571ee2b59198a26bf35bfd002d2d1960f466b17559263438b1994b9b33e2be6a707256993818eeffd898900becf40b7559eeee02ae08545ce8516f88de022b1c53919d725b41722aec50249789aa2860a016f26ddd15f1641495041e9d4d89a298d3217ea91274a0f3dd782d5d187538ce8142e17adb7f8b833b05dc3e017d6a96fcc8d65231a613e454eb58aef5e87712673545452928b2ff7792dd2926ded68aec7a8150c32bf8ef40f8abddc3ff09e760f2e1bb47b909112c792d4bf366de920ef847655264d9b7cc893b46677dcd37d3b79da14380e5a70e0bb88b7fa7fa2ec93962c8dcd216e9c3722377e1f50260ba20637ff0fff9f9aeb754aced500aad071a756cb9814ba53dc4b016735bfde1786c80a4591560cedcc424746b87399110f424c5bd08ec04ff75dada842cda12f45621b34d924cf9da5b21c334cd70d9340ff6dfe2fafee6ca4c1c632e6b07a5037f4a13076ac0fb1344fd59d5d07c9119ff530205214ee61345734266c1b7c969359af5a8e4d3e46efb4ef778460da333c8dc54ad5b78ecf721b249ff8c442617f9a3f1eb60e597b8fce7f50963d33240f0a9f206f7c0b3222cdc2cc0b46bddc70d440dcbdbd80a477a59b0c17266b00183e805cdc9aefe45ba3c04d4ba36c68e3ac86fa4ffc96f4415f2b59515fb011c8bc4a49ffe2ca506ca16135009fac16557fb4aaefa2a4a972472277b4e07df966cf7e4163901138a3fd835b8c8dead1e264b7a947d143219b1ff8dbdfad8d3c21f489d707e7dddb221bd1bf7869f2d77aa7ef27c525f697832e7f760c532f897ea7b26c089b0561207653891c93431641d394202fe124812f91b6b3fc39edafa59be1ff7c35b61a7f5f7be6c560a272cdcaa2b0cdbd3fb3569f609d7160c7ece89e3f4935f0671847555e69f70248f8d80fd2821ac3690bea8492e3ececdef0743580c5fdd4fea210240b7532df856dfa2fae9bcd6a5d62205c0560d967d3262202095c5ce637abf2238e72a7d983d2654dec7c9297f64aea390e3678190f971bb1c67e39326b03aac859c2ec767ac634217d8b581c9bca918975ab50d3d15c96df2767e6a922d1c99c39b3e3c0e0456850f4994d1ec9da2dbf3f4a5162a2465e0a96996ae95121e69ea5b28a884bc67fa950bc2ea6816d96b3a348c461ed8397bcac0a320e520fa7e5cfe780bcbfee471d1df3bf257db908b68e6e9db405bf29fb92bcbffd37abb104ba324ada8ad259dba1d8c29f33aff1d4e934f27e44012a9f4a1f5dbefff248c7b2a01946212acfd0efa7a2d4bd8e3020a41403feb603d8d4e1f46f3bb9fd54cb5ec0b599c4dc5ab3731874c11a3b42f2ec468f68015afcddc46b2058689022861604cb49ea5ca507309c76d8cbde21bc10e83a8db166a44dbb6854d8aaaf67871a9c0dce163198f7b8e40154025d305ba318b5f46dce6cb580030b7042f21b612563c907cb3f2144d152f502aa75ac7aac7353c2c75477dbf936be288f84444fdaca0aa48d52d5e6ddd63aa66014bf82099e479577672383577a9eadd98a8739a56f5cc3e653b4250f4712c7ec4b2ab546df1882bab15a80bb9dffe2a380d4e129dbb9366da2429a56aa6265e16c1d0d849f894186f43ed4143d7411c315f0b906b8cf4c19a6a88fd1920e3d20dc4cd516ade2d0d06e8377dae11704b01c64ecddf554ac30dee86cef0c35268e656b5fd70d1a97a89e861a0da5f571255c8fac26cd81d609c5080348298c981db34aa20f86ec719de5dd7ce6d5d3feb8667a709e20c67b00e06e7623ca67202975e074561ec8b0d966d5d1375ce4bbbdb860197e7f2068901765804e3ae4444c0f7261489d4b4a2ab3515e31b09db7005de4040c5360a6f9996cd6bc0eb73be298d31c2387164a5c4b6401d3ac3dce074fd281d26e31f854fadbcb87c315cab1a32532b59c80e587253492a857816716178a61cb01a06db86be96e205bc92a6d4c3db09fd173e08071e10c106d83d8fb75fb07c3925921dc41feb91e38a411aa8fbf51f8313dc2cabedb4a3d780a17c74d6ddef0c44c3db01c70c37288ca159507928376e78550a4f3df8409be531945d4b652743cea183a631f09bc7854c1cfa426a4b9dd03a7a2fa05089306820d47f7863eac8144f401414c816e07474a08d72e680a9b4f335ff29a23ff49f7fb8e6718b01cd93219bca50ef2bfee4ade8271dedd8f3e8e809fa097caad7d9ecaafbdf71343f111263c426bcd4d24246e05d4f9361fc2dc59fbabf053ec108c848828aff67d5e796d659db5ecde1618f0574430920ac913f1c4038c8c462dbd5b6e0f5ccdd84e5d2ad72cf306ab3ccf2c66df37e113d9fa568284594ba8b2a51378c778740dd1ce08da42769f14e139cee7ae01de21b0f3b5144ec3f45f3970bf647d9a5a565b454e8a69b7cd9345cf7c81185d7753bdfcf228502dce88d0b21cdc6568b50fb26738431833f15a067f12807df96316d51296865877ea6f8c8d979d91481fa47a6fb6c4c3c3dd6ba1424564b9c9f1112a85f87af054182abe753cfb2e1e2fd16ce4a71d5cec242ffa2941e6ffa44ed55b305176a9fb04a3e2d99c8960102543064a922eced19c59c12acec80b0f544cb36c3debefbe8cee3a940af1d319c5dbc48f6cc0da1e56a648715758164744820dc909a07ece602eaf70d675c40961571c63a21aa47b283321ce33858db83b73c827ca0531fed88c6a3240f41e15bdef31b42b3877f1aa001147031e974a62460dca0339896c71f691eed1fea00785cc6d22da22d3c8248aadffdee77f9d1d55e5ab2b27b4b29a50cf2064c06e905e3026a8a64a1880ec492d8818d2e1cf1010a27b0200821f2ec074b002106583cd1c40d5c6658b051821656e0440e8a4c0817a4808328f48022004546a0032cf83004082552a32da34822a6031f80408a16d41e40218915b15790298858552b3c4136031f58680215590040083f1421a7074d14b962659ff7f7bd5b4d0a15685a9723536badd11a5da748235057727997a0b1d6342cd0a8298c2d4b4344eb1b18a002cd45bba0d068321b9a8d868686868606f5636c591a7be3424343c3d17434de358a519bcb68349d43ce040535e93d8882a286ce943318a36a6a2f4880fef0344609d9861084080bcd8c0b8d46e350861072efbd3b8e50a2c3814eb9427b41e0d8d8b2b51a0f2cecae5c24dc28d20bc5ddf18a55817b48c2cdc2de2ca4f7d5de29a43435406438b0681441c6c282a291e1189691d1c233e9fdd8f9ae52723c73553c57c52434d9a58b42b1a0e0172e71696a351a6d66a3bd525ec0525774c705b098cc0b4cb3039f45bbc1a9bdb85a080d8746a3d1683a9a80d950c4088d8d0c088e5aade6d56ab55aadb6033d96474d50b4208bd5645c33359a5a4dcdf36a59f052b230b66c4d56691facc6be761ca1048f942b803caf9605ad5123d0a00eddc00015682e2e1506aac4d8b235584c6686a6c613e19a2fa6bb0d107282d07a1e6c882e8c29990d6ccb604ac59acd66aa22a1f7725f1091928562a7c4c66636b3b0f1a910fc30ca094ea44a1bb1336304ef09d19245a4486a8b3bfcbcec79b021bc141e63cbc260f6870c6c23ad806532f0870f8d69357526a603a3502d08b91bd76d5c873241109c9b2be4122982516480ca42085ac48546a3712d10a853049961061e41ae917b45eb8a9dab94fcfe1eb9575418f0553ca367cc17a50a37f8795d128d725bc6f93d14115bc6df8d591c1b998c08402c88c6f2c6757a861c594d8623bb91d18c20a244dc5a6bed1851f2e288114dc2831204931419a07052aa00a158918324c97ded08a16468ba044530213aa0c3d3e163b4322b63dd1c994c76042cb3c875059fa647dc96b92da37400735b26c96432d98d5d2032ac7265eec5375683b1656547649b2ccbb04c66714c1492582c168b7925cf9bc5a228c20764324f4683b155733cac9283d67e63318caf0dbe337c69d7ab265777297004bbbd72d7afd17d3b61b677d7278c8f16987af4bf79ad794f9306f7ed2ddcbbebf3657ba7ff726356370040185d3874a8585638b0dbc6eaae258203a374649a9d5d34c68e9165f78bbdf786f626df6e065a6f9b4c121a0663cbcac8589421cc2e6a04a70cf996ff6b2239e7bf8d610bc35b4a125a6f9b466df09f4811235d0c8404d410282b9ec005245040f0c24504ca04aa0a1414d021293359101b9619b1d8b7478c3a9a52d92de32d632cee96b1f53ca3db715bc76d283ab83877dc56b10d97e65c6ac6968d0591e98ea3d1689e8b0b1017ac623b6e8bd5c656a5c15c6c68b41b9a6b8bc5625e2c16ab1895e2c3d8b2319b188ec5b6588ed1622e7a3cedda23698aab952598814531725380f042eb171855cb9e97228087ae606ca52a6043a76c64b4adf44a1a8cadd40b8d673e2f244b2e5e709e972240e995468cad544be710d3a954ea05ce4dee405ba40481b241b149914931012a04e591f2044a86524418da1429a044606140516296d12c6c2f5e1c8792c5d8b2ae1e31144539d4a2d885c5489259739c0b97ed81246b30b6ac2b6f317288d484dca03875d12148e4d822ae6b3240a7a9c9c48b1220b9819fb3901acec1d66561164dc1e5b81d45702922185b764759ce80b7ed6cd5d91704aa4545511445511fc62b436dd0d935d2750780a1a26887ca8c57453f77ef324ab3a14150b6e8baee0858d7e9c8a24bd9a2446f542d458c1c418276a9111233b40aa5ffffa9705184d0e36c870cca132c33acab0d164e9555578c2d1b7302c7f008e4a23081a130661424b6142ab45e71e142bb00c2d852c176e0c462319b581021448a745acf2c9182582ca6c5d852e1a0c2365a6b9408a34aa562c136866318c7b075e28644041415366567b646a72c0d46a146d0e0e88b5a8153689051176c445002092bdb70342c4021c1d8b234ad739b0d980bcbd0ad02468e2049d2953b40c9c0ce90c964b21b3336168ce2c18590990b169b19c6287b7d517ea8d509194ea69391c96e79334a0c36942470a81274e81150a0982579edf050293e540f4014242f1fbe402693b9b04c8fa24c26636161b919736091c96e3a55d7298c2d2b2393419f4bb4ce38638d8e20888d10169b998bfb999046adb512c6969541ab8cadbcf1d40a60c48b10f0a0019fc1cf9623536b5d051b21b3a3a0ac0a8c22c165aff23d0504ad394d399333ca0e80e47c5f4e16fff72b8c2d9bf39aa3a98af64e952a73a84da752a95098a0fa0124bc99d4a82d64e0931795bd22f00f27d2d633cd5793e600c9f9506a25204e5c19b85457364d33da590f95aaa552a9542a153844980ac7b7302b6369422cc224fcc118d72e778370a5b35cf31ef4ba22b779b7d2c6b1618c4b275fa374f284f101737ae935cc834e18d3cd83a00df336699c0e7a0dd3c92bd210ee9383fbb7a2154d1aa783ee623af9bded2a6fd64bf4d0aba8cf9dec17e8a5cddc360e638c31c618e38dc318637c8c31c618731963fc123e087bf87c0e7d9add9feb4533c6f82718dfe2a830f0636031d68be6d0d727777d7d561dccee649dfc86ba3a39cdeea09f984e1ee6749add4f5e3afd74c298344e5e7acbc9699ebcae402fbdc574f3a6d3ecce1c3adc5057a6e7a0419f65bae99d26f91aa09f9c303e5a40af41fee427e70b0696204212245cae15f9ba226f9e7c5d65d6eb45bae8afd143e7368e77f85cbe68893b57751522edf1a35df2cffe5e6ecf45bbf3d0160fdae1c90d7e3359a109e9f994742e86075719ebc028dc29193df81fce1877d7240960beab978fef2f20c6157920f4ca07bbc5ca077ec1522bf2408cabf233462cac227a0dd245a210e9759573ce393f944fca39e79c3f640a206955425a871c8196966f8d654994620165f0181f969ecde77c9b4f1c17addd2d7f7b1559e459ae793f7a5d91b6794f7a476e1cbb5eb433699027bd067952e830a793af11fae8843979e8a00df1bea1ae5ee545ffaeabf2e116b148bfa1ae48278c0f96e85aac5e6256a27fdb1536efc5d755c9263d7c8dd1c513e6e4a3938f0e733ae9da8205f8c0f8223df46e3b8eabf2c28d8e9a6625f24db647a4b9dbee0d1bf938e47a3303abc4b83746fe77eab4a8fcd0aed6002d94349fb45f61e41be0c7787f8f4fd32b4567b960013e30deeb5061b82e8aca2fab2d40ab93566b8056cd22cddf89a3c2c88f81c598a38a3ad450d3edddb7894f3af9936de2936430319adec92a45ac97e9a5ebd3ecee429e7497d047c7dbec4e1aa4936f193d74f0b3ebaaae46e3411bbcb94d4eda251fedcecb2d5eb4c36f264b7c4d5bc28337249576b559f026e7409bdc157b3e96bc233e7c5de9e86c8c1a3df9267b9becbaf2d415b8635c19c68f9135e3a239cf4231ddf594c0458bdb35bda9123324123219cb6c7d3d5f88e20656c92d7dafca56c3a8ee6cbd70511a491da6f7ac18d58aa1cf17692b0668c6e68a92a8892e35c05b5107979bf41ec5678ecb46c3a8fb98199e2fdc776e358cba628d1aaf22ebf3768bbea7cfda125ec7acb67333989bb92a9f1f5786ac0e21810cd78303c205e16cd2cbcdd2cb11492fb615d71a3e3c754b78ef7cf15a5c2cbd2dce955efcadc67a8167ea2c31cad636209bcc863729cef7af9563a9b7cd16efdfbff325c330ea7af556a68655f0b8e594e3b75aad8655ea6acb71c1b61a278365dc8c8c03c2cd7034780a230e72d1cb838d9fb002905518d71e9f9c4911c0eac2c510630eab68cf960d034861cc3f76d868b04f851863293e27e4cad0c73c8618bb4a7302164510c216aea8196285eb4c8916e45ce1030c5c50835f19e602709ae2bbc03357c63d8f14e35d7fbd7387cd01a72db6d0127062bc01f831e21a6c836b30106e96d617623abb51810fde329556ccc5a4bb93de2d52fc029211bfa6b5ae541fa4f8f8c75aa45e9a77ad305cf926888e196c6c6c74c76d1db769141e66a82b55db8c3636363657a75047c69695b138416c66b030e0637447462961934942eb138c2d2b837e8724afcad5c829bc80bdd0f84591d0721c870aa271f7e2ce6c55102137dd10b4070f0b03a695b68891234892749d8c073da8e96a8c185b92dc203962440a63abce2c4e4d4d4d4dcd4c470d56716109315a18f06735b49acc42efbdb3dac3d8aab3960ce9c5352c3364a82b995676458c1c614951c458e4c646cfc61a5bc322a1e83a9c4e666cd999cbced81891a5428bcac175a9808b25725d35ec72b95cb3996be6aab9726833d7cc5573cdeea6b23098a970b22b8665f04c5661d56c369bcd465d8ed7655340a0d21dcf58ea45bb6ee6011058295c2e9790b1656738b39bd9ecc6480626b1b145d6d77cde91887bed3f0f788acf505bda0d550aa7bc2e4e148a1bd7558e5a9572e9b82d451b5be30d1c9c18385aebe040e542ed86be5161a4f8606ca56433a015b158ac8bc56eb06031c66236168bc5300a75031cb2fbc2078c6283f2890e45051bda046d6190e1c0b22bbb2826c65695e5d0752c5d11a3ee6429528cad2ad3b29857ba02ac2eea0590200226f080b363e60a49a6404207862c610b3380d552698128a2004205088004a106bde20813ae60c108a4500519a18b7e2f125d3c5f7e91e82f31aba3a1db7b6dcde6dc2043e7855d5c3ac6b748702d0749f15d253ef23ddbccff4d273ffd656b5796e273a19b80fd56cd016db8b78f1bce5d57a28b3b248a62e8e7b62bd08a3444a2d0e656ecf16fb02a54a4364e483168715cf6c61ab1358be4cab8b6666f845821f663a2c2c02ab03448f15dc09d96075757f4f16954158b858ac2b656abd5bed7504d1b2674f1df30e2433f6d98fff4930d7372d3f3363578f0645d1939cd91b76fb35e2ff3a3bf482fffeda32574f1a70d237ae727db478bf8d04d1ba673d1bd5d43f4cef5a6217ae779d7085dfc0b486e0cabd45a5d11538c537c5d5825f4ceaecaf0a5fdf17cb4c797bbc4e4e35f9e9788ce8a4367c52856a7035af17390c93d5fbd2e8a6d0e465dd7855d99cfa649eb2aac599875d55257ae8962bc0b0a22c7fd0e3a55f9ecde804ef3efdec098e6b35465154cdd537a62c907eae87b6f919b4b57747c10b4c3873678d1f6f139f9b9b7c997db8a1bbfa3bfef037ae8553c4f2b1316e00323f7fb9c52c6cd5dd77598db0758b10298e1a23277ceb37b44b202c0f776d9759fdf50579f57d1e44ed6f7791676d6eb55316afbcbd260147ef7ea3cfc4b5c0161ec70b8326cdcb83272b8323c2058a504fc768ac72d2b3b553176698e9cb64afddd7bc9fbc050ec94e897a52766bb1d1e44a291bd22916734227d261f900485ac0db9900bb990036d486ef1261fefe548f46f8f407074f0229044de44f41a1ddc388c31c618638c370edf7befe5b62c02475ab38846cf2c59347261b968d7992c916824dae73d79be3ea7c909ae3c316c98c47057fc01585de85c96a06a4c479fb2247d33e4b1e7d8ca581bbb037337e1391887f1472f47ff760982e5c18f405268547e5f075382e6478e131636d3a30608776f74bce07befbd36b08a0df7da5061e003cc58b128fc6f3f91e2832a55573e0b3184fd803e2d8c3bf7d1a8bc066252d0457f910ffd58c5c20e035feeefa72a462c9248a7c99df4ba72a918d5993440b0fc7798d159e3fbe8a313a63cf3ebaaaeb61d1eb44b4eeece4db677cf1e5f451a20f8a9ab8f8907feab2b1c36384353030476c3c645f1cdcd2786bb230a3af060a8310864429222715476483997949494e81274f222d0c14d822079107991791fbeae3a5b74f035420f43074387312fba975fe14139e79c35080a3bbd5d9fa6c61a0cbb9cdf9dddbbeda63e59a0df5057a0ebe089ee629ea2bb94ce90be3e6845d3cdf3c587f797d24dded962fac9f962de942f7a4b5ba779e4366ecb18638c31c618678c4131ddeda4207bf8743aa942f7a97cf29cc567d173ce9d5c6650ce39f7c8a00d4f4e0777a9f4f0a71371c3981fbdb3617cb4981f1dc67492d9bdc667a44fa5d7e9a577b7ebb6176e5e363b68dd7667d890efbd373fe79c73de72ce2fe59fb42e1de39cf34f4e48b3cb766fbb77d650d37b7db24ea7d2351093e2b3ccee2e9f93ee527acceab4cdedfcb61dfcc96356a0f77a041f82b85c1552cd9551d39ada5c5bd50811d256adb56a12970c4f6fa9fc18a6036cbabd069b6e268df0a7b7843f9d9c2fa6d3dcfe39e9e1f5d902be74be98a7b99d6677d2f89cf416f2a3931f3d44da9d8fb6f8728f17ed92837008f4d972ce39e79c73ceb986bb9e25f25ff7408cab303c10e3aa445ef326cdc5060ed0b149c5a939a1b72cac0217c5365c2e4aebc1d231446ddae26fe9e6cb5d57a583dba411b30a7f43cc2a3c5f62562f3e5acc872fbd858755586ebbbaa29b5e45b32b99dbaba85fe0c52fe0c888593666d8e05201adb5c6a512a6c12b3f8bc2174db4debe49e0c604409a135c68cfcf39ccee64955e53f31bebf50a5df417e8a601849b0016850fae9caa183b1aa59777313fb2228bf4ed8251f8a312c68fd14589562f5a62bd481fdddc30a3832f6d181fde61480f699417bda5bce87cf1a1ff427a797db6886e3a5f46179de596376dd15b48a777b68cce8a51fa04715aae3abbaec8b0dc9d8bb6f8d01e0f32d99ed70e67b2c2102463d810735cb0988c8b2a5543c674b7a408ece5138c4daf2b0cbaf91aa59b4e18d34b374ba5c39c0e3acd5b57a53d620bc3a103b42727a449fe4d20bc8faf03ab8001e4798f5cd445c280168cad70654b4118420e8c01a72002121072360565e03a5c8a5f52a6a04ab86d9102a030b64618c26d8740352fa830ae0bac0078dc28413b62b6c306bf6290c2d80a6308b74de22820884f1aee0484db3649f130b6c66d7b64364c8690db4d7c86450fdd7c4071a3a9572952fc59256918d39254ecd8dd0479568c223f22192afa90204bb8ed4e4a7ef06fa846b4490584db16431b03c1a87bd0c6351875dfd9b8076e41858193638711b3a066269542d1e394e38ac8d81a6908b71da6e0de80dec098721c0e8e26c98b8371c273db60caed26c887fbe27c9e3eef918bba486e920668616c853384dbfe527037419edb4dbc3e0742afc87fbb09985e91f77613b071455eef2660e58afc0d8255b9381805455de1ae163723153852685df3d9dc6a5bd95d2b0c2dd227c6958c57e406a55894624f8a476e004094ab7a0d70ad605529c60448efb1aab3b5ebd40ae3ae6460406a32a0f2009576676b03a9ae30f057527bb08237bceba298e5ba90610b634bb394606c5d1c7c3f56fcb2e2d7aa2bde6e3cd79a600ad08ef5da430115bc6cfa34556b4b8f154c6b117aa8416acfd6f8440f39692b95d6cf9881ebb5f80910acf5448bf1fe448b0dec30e0129172bf35a4383d30c18b35e474bca8e6b6bcc5f0a2b0115f5f74e7eca1008f203319d8a796057fc6bd3bd54a5debedb461c81542c8118115301cc890847e91e21757463df159667cd23a84045148634832b652a92132ec5336e7946506878454db55a8b74d6f39e0a08de029b2b791e4c77e3ee14892e0e80b794a4a722ef9c1ae4c5e42e3d9e1bf0dbea4e45332da76e5d99f7f9bfcdd39b89b7a745f9f875fc09131e79c73873732fc6ce4c78ab83b599fba024db65d61f082f6f7d0f6e06d531a1b88bba18fac4a3d1f5d21180d10222489672ed05717b421c8f3d0ae2bcff779fefdf385c80fc8fbacf75917786bc77ba7695f4c6c4c4cc605b3dee78ac9b860aaba7279a830700f1685afb2aeef5a170d17b43cb85cd5e5fa8eebe78935d83447fef68fe7f3c8f3151e74d919575d11c79a32dd72b0307cffbce5fbc7e4fb76b678f79c2fa3f71c603199199a1a2032972bbb4a62b6db59e2033fb084e3fefb5e3a5f48ffbebf98311f38a3994c4f89447e20d1e8a6765d377689e0300cc3d2c7f4214dff4010bc0924430775a6cfc671792b693b9bd5a0437e0cd7b4bd7ce82fd141074dfbf4d23eb949725d4adee65c1ae04f6f01b9bf7c0e9e3b5bbe9f9c2fe43ff0a5fdddae409fd0647bf5cc2517ffea3c0441939d83a571d7a406a269963ca4f1a3a924f29c98a39378124fe2493437e8a5bc7f3a9dee398d3fb9c933764afb55fae9fbbeced7e998a792d87967344ba2288a17596e3ef9ab7453d7895eea3fa93c6ff44a4fecfcd3e6f77574e79fee68d1dca6688a62699bfb747aa9543a9d66e7fb7f69ff343bff4b3f99a7d9394d1aa79baf71f32c5814c397b298b3b9ebaaa4d3ef9adf995285608cc163ac17ed2a77b23f376d939736e8e626453be4f18c27d5d5a8a43c5f9e8fa2d163f22141a192ba2a092f09c50c0c4f55783e86abf21b38c2100441f030a787a7f9ba9ad1c07076637166345c6299c7c12a2290ad5dd78dc910c2682f8f6b67276fd51bf0e407d2c3ff303a78b26255accccc133441006dc5a1c9644166446632dba3074e0f9c1e3d34f74385818110014d1133f6a53a4055b151583b9b9daa18b78a93c3b46bf917e8a29ac62a15cfea8a98665a5dd13a47cea1ae78c7cf4055b13eea0cac48f1abed5161dcb474d35dcc9fdc8aacd3c16d67b8627cd30efb7a8158a4e184f1d19927cce860f8ee6c790e96768353cb99e1b831c399759734e2bba311c92b2973a763924025a591c8f3f067f27a7c2cd367f268bed1fe9c94f70d7515fa8915ad6832995e62ea9c80af6226ed17e9269bad052d9873ce19ccdcf54626d2e775ae37227ddff7fdd3804db792920eebf51abdf417e926f8c9bc9449750ff546aff446ad1d72386aefd401a79d065bff46dbfc4e9386c9a4b3e71a6d1c538d44329d26f8d34f4e3a4ff927a709fee4a4d169fae8354e48379da3b3601dea165b6c912405bfefd44106afae48375f6315d2f399c7d2f6dcdce349fbf3d136b9882c29e9bcdcd5aec857d12474823a25a3c7e4436eb1ae30aef9ee67096075d1caf7ad32159dacd089cf1928be86e89d13c674d1459853d5a37e4ce8a2b7049c8ea8040e5974562a333300000000040013160020180c0c044462d188384df3bce50e14000e5b7842605e4a9f0963a130888118843106190000300600030031c6100df100ed0ac815f0aff1fda3b06290da8665d962c420aa753051822e2c82aa773728a1c9887d516cf2b2c1bfb07ded7f3be5c47b9ea71b896e0d7a1f158c66eff97bda4e63b202aadcdbd5a9af86f22dcae1b02a59df923d4d42500328a2e6828c05b79d35856e6b32667c7e92463e91542cb8751c1784bf8a60148edbd9e0ae3206fffc98a93de18c811de47c1b312df4708e9ef53a7f884c8dbe2a7b10814b4952ed54eabc9a21a1cabf25ec54b2dcbd57240322070398f4e600a4be8f807ec8633e38793a1a1cc48a0befb140a054ea1ce82d942fca68ea22f781b0734b641801f41d4a4c444878753d831d78d071e3c60e5273f88ceeed9f5107757fbd34aa4a6cd4b046cdb04bffa9a005af858ac112715b042d512f40aafd1696c5a2c3c80bf98f1a5073e25b92154d786febee89007133bfb7dc904ecc3db8fbdc3a390760619c6364043cca36c00ce646c248718cc05ea19294b1b9f8f548f1f157127e36794d6ff298af7feac59a57cc8ff0640d8095003b99aaba01a9e7d152e26de8646def121f5aad71690d25e24b80aa9bf52b4a08e0c07990622e9fd88066b8512ec8fd0712664f4744a3c80b3923b48cfbc93bdadc3c2baa9ce501f9c6f4c596a77413086720970ceaef0fd6b7cd0a11ac6b4673d9d284a3b8c51765fbb5d4bfd535708e7087a3d50e3262677573f6093ccedb38a671798eff440309612d7b0d1a0ac5874c8c68c4d739bd8f50bb88000df7b9be3148ac52ece846f039490e292884ccc447a393e43f52a4675154286d9f227caa8d50f20e13daee33fcd660a5734666232921ee981b40210d39f62d9b672b2e5b5f6f4553d9f91441db46cb1b066412fcf6f3165c58f4163c22f516743b76f81c11fc9e76199a4b40d198178e9fcf76f04a8bd5ad28736192a0047465676c4c64ff56e633ed14d800a8beb6f64868039c12e204e34fe647368091d6c8d31f269a0b0c7a8d13eb687cfebba644acbedc1d02341dda169843db79e4d0e6d83f29c5a7dcdf97a424435b56fbb8479ac2bebd9f385d6057ff1a8fc34e153972102cc72f9ab7643638642d9f9afa49c0f82d95444922721ac1b3c724a1034fb7b328a51561c5d4270d0240c390cda74439e9cd17bc3c9f8a936d60eedb8f1d896ce34c5ea09211d5cf98b801d59ed29d4858a8d8525afc240de92b4c9ba45029f9f26b132a559682098f844adbc5384854c46b4391bd09147b760a3775382f9758c34cc82dcd5f14c5be5b75df4239d6dd5f1caec614442eb1326d2e470086a97817f7edc830f1e91c3ea42c2ea285127ad824a49f94908829dadd1b65d12b8cb0136d5ac1a93c8185ea28861369321a1ef6ceeae29d6a0ba53ad5f39e24b2938118903036cc08b52eddcb2a1c421de3955f186f09ef8f7218126431b18265c95b83447a12d4b28ab0f5a1939f395a8f2e9f88c4e672860f71e0fcb46281763353aa555b1d598f1674c4353161c09fb06cb349e72711c8b69d96d1bc282f47f5386efd27bc2391f6aecaaa315b1722a3447071f10d6b03e9c7f476315b069009420bc0ccbfebe18aa12105048006d3fda26362a9a633c0b8993ca8d1fe81cafd107182be2ae82304422af608336fe2e8d7543f74d16968aced9a2861935ed757cb627b555130e3496979c3ada5c9be71092653698c7712afa4d026bca5811b5e8b02c84e876060078da2651f313479d482dad3a2e64d2867e83f6c4cbda86bc0b46bd0866f836168588b57b6336037c8fda5a500074dadbc6a8faf2b0c49abf001b1872897f75e6ec99eb3096bcf8ce03441df833aa0e9442f7a3c86115b86f1995c52601867216b55ebc17d7e052534a0b1bb035908b41c63fe08dc0f72207f44453e8df95c59dddd2883f23d437ad8b5ed0240a87d676b47ddb4f58e86e3080086b43879c902c5e3a3f2d30c71760674065b14ad2403c256355f8f870d2b5e15de4733193f4a22c1643cf54f3063f7220777b562f16c47c45ef37276b0d3462c14f86229bca5aa0aea4716d60336658338cc1c18787e9ecfb4ba32c171441bda4e76eeac572d26b4681e67d56f5c41c03e13ff259cedb8fae016f396f48806f7a152a2c2c433ca4a783fdca5293a16b5202bf51f3dd185a25c7ca05bfcf15c87fe839f264334297d5738a2a27cb776a49e442a93dd7cb7b569a05f9d230c2e7609ee43dee8528ad27a0735dd8ea8f72627a14d87497b55d82b27f4e7addea69bd9fd01b089aab6d0807378339d835e92383653ab9424a4f2f3e1a4ddd781375dacc922f18509a520e1c36fd3fbfc123e34da2bd0b320ce96ce943969477bdf58be7be0fbca6f7a99fc2ebcedf5293d856473478c495c252b328935030e57777df7a0a9ac3c2d23ca57b3b25e8a6252af41f62222956bafaf955680c8cb0d3c5ff9245cf80fb427f53d2091dc2e7aa3786a389c9f4f0c8a237e3b54e2db6b8d6a8f83cc49da0a8fc3e461597cb1755f1cce55e945cacb8029f9d40c3281bbec6562861ffb3f969847a098c34773cd8fc595d51a813ccd80d1751b223df1135d0e261d960fe21f4fd7e583b4e1a5537524587cac2af22ba9c2ca58ce4fa10064b8224d2ab5c1451e5e8d2289ccae0b35ba0ae86b06440c94d002f8642ad53e420bb0db13b92a990a3ce204fab3cded8a43392c8b927157e00869bec560ea0f144733b07a527cf84782cc5c269d4d7b951a382317f68123749c451011926ddb59484a63e1fbd4c524a64cd0bc32e2745b8da8cb841e0543d06a55c982b1e368fc76d7848ef064c9bd31bed289bd7a17e5b8261532459f6741e70ddd2eee73fddb3387be952e1091c3e57e569ab4eadc0f9a8dbf82acc6e18fff0027aadc0466aa97bb47cfeb999f7838c12aedf00092082d3cd09b4d5ae393e8a1eed0a70e5785a37eed54770af71ecd301b8496a08a28ac34117b6d96b261c1d0c1d1b1e0d3df9759158539f1e0f80d48900509d14f7f20318694443ddce347717ab889390f64fe72c52c551b24cb637150a80e0c3cff0c6936d7d2ae361a78f5897bebf7843693efe8250ac2811bdc01a3f7e0c401dc3eb0e40ada0d860f1e30025c10fe4e4a3e00161ca4817dffe1a587b6c5b8e927024bab688d1293345f98d573e9d1f07386f668ad780886e69ed31c6adddc6f662e895c1da6f5a643f276c796c19150ce8b0c91cc6e14955e87212bf47e1a3b1f773b165191b2e81c014fe173a5306c51494839d778759f50af547585709c52aba4466194a8dcbeff0c313c11df339767f404064538c528ec018d23a69c29e200edcd5f29a21ff6e17cd3b5af96f661f683a80fa87853a2ac85334495f6d8d04ac0a56f4384efca5f31242eb4548be6200ae1dd21369f108557e48b28a785b95bdb376ea3bd8c2a4a083127e849897d21df4b64405bdcf717d54eb089c9207148e94d5fe46b537b946c958c32e81992f145e53a0ee82c9604732bcf46e073e58b1e108c6f0e61ef6c62e2600ea64872ce2f1a04615c6bca8a97d7434a1b01310cd4d07e6cd3bfe8e4e6376f42d06da042c086265aff8403b8fa5118ea25595bd7d4de268a1522567232a96b2057514833ce0c7f7b55f228d200556f13957405a2d3cbde9ccc4d54e26d72120942d97e6324c1ab168a48e27f2cd6a06e895802bafae8b434c45a1de558413bef76fd24bc0e72f193f55744b1036b6d1c679a8292b37ea8db87b11a63f6ee9805482a5a3a4402655e684afb7b3c0222dd272a1d50bc6cec333ffa412d60d7a4d9a11c8af4e34d1f1cc52e69ea13679e2cbf2a20c1e8ea74e8676c9e33e44794b956a9ac255af74c1c7c277b45fac9fd20df76ba7e3a34de6bac48399afd2d3c9007fa1c1b989ef882a5c51ab225b0c1894a9f484c87ab3c4bc64ca0bf3cfe857072728bf4a813c5c3d9414cddb23c360b45982ddd95ad871382323c8bcf29a330c92eee9238a1628a0b4ee4029f59b6300b285d7dd1a2eae823f2edd5966aed78a2a12b2cb0dd2f0b51df8b20c4506d81e5219133a90b85bd82bfa3544317c0854ce3dd5a1e49b769025f33da70f5d9240e10557aea5c0d5ab0a6fb46ff4c0b92316db35391a202e0d8c52b3d256056b09ad58437ba68cfa74ce6ba14672716f45f913039a4e459a2602aa7a84ad7d4740741408fd6095b6ee775d09af8624c85540eedafa9ed6964ebca2370107b95bac46668aab1d32ea1c2999aaaac74596ef8844d36d53f2005dbb2c77d9efcd4c012c1918d7d7fffd4b7686198cb21426624608d368ba63e6f5db9522169c217f0dc8266554f12b2e254ff068885802a2a6a76ea962420527cea2689829d5ea62132277b67dd65507b682286ed88ea70de9c5540e96bbd3c5187f4f3bfcd9f7ce8128fcd532d2c6f7bd01ea525f90643250663bc2be2175f08c591417489aac787c745544caef68eb6831b9a6580a09435802e5878474bc55eb8194b16a364f2267c3b26c670b500c167d19c03fdb788c93229698d1b401b281e7b0f9dcbc45715cc8e07a81805ca930c2008c434be041ec82e42156d00340a6f1ea5ccb24f02261bdc83da0663d10f12cbd5e7fac0a0a471bafa90f5266231c63f43875b2a6ae66c749deefcbeccf16f6b6390deb4758e37d5fd94b6b79f11224d52098ead428d2ef51e8d0a7b450a31569663d93b835f2be82bccb725695c5677fe94417dd2f866429d9524a845b7bc6bb2f92411e67ec654a8fc147f61c6afe740941e3b409284dbd9b84c56948619b099241f648517684efe8984547b6c01daf4a7628dbb5d4fa5da71973aa543174a0ee7a9ae374a01d2483c7d3ca96017c7529854074f9ebfade96188fe73121daf4fd15d2dad09876762b8dcb498b8869fbe6e4bafab7a1cf75ca025beabd86b12ec7ee16185a52443b6f7dce0cee0f38f107798dbc8db7d27a42e250241040a72ee27f06894c8542743f8fe3bf43e282d6dbe30c32c134ef72b12ff415cdf64d289a4d8ba77c9163d9acf0bb513083cfad19a50acf8a4c3ef19e20e4f38c27d5a084fcc42ef4a4febe3f6fa221c2c7dbaba0288733b5ccfe68dfc41af00c6303b345b3462ac82da34d7380bb84a23e6a0b741d0ff0eb09c2bd7dfbad722b209cb5ecbeb18cd76cb3b1e296c0553fdd34d1352d15b7dfde4e2774304a74cc039ce513aabbee990d84f8ab56d72959e30967d2162e0caf400c33779851742874268ab0de2c400facf0ce1d960cfa067662de8d53b12103185f2be47b7846aaf17be25e8a10bf87d52f5e5b2073e2d791447bcc702ca237fb6744595410ca06a14d198362aab4f4ab3af7a016689b52f3ef6303f8c15587e1af0358db37fed8a053acbeb3936e388280598721538a99759fd4febaeb82f40b75ea098c1fa7435aa5b7ffcfd2fbeb4290afd1b658c25bed29e861c0c624bbd2928967e56da9d9cd2e2f1c49e8d41dc92c53b9916b0214cf72d210c0903e4f2a0e0747bb07fca13d5768fa0c0026a028cb34652aa2ef3475f766915aeed5025beb7c396ce08413f92331b5876a83bae89cbb3ec54c4dc8d34b3b0fd7fb8dbecf26f500fd6584e42f90af7fb0f2716f0f433225905cb7fe793ae30c7428c0cecb5f2f6c81ee16f8e78c64fe20263b2ff805bfd9535980958a4436202e0d0f33e17886c0c132a62a756284453c2d8faae256c7c702812924ac6707d9ac481da59197ed5d428bea5dac335b018ddc2a48a53263bc90605e1b0cf5c6c21251eb65c9d71df73cea1f90afa0fdbf919ba6a0cb9dc2a29b302525c8c412d7c76a873da60e2018b70d82f1863d05f0c47cc1cb49c0af768955b5af5fd51c628724d85f99cadcc96e826aa6da1acab186f679679e6545f07bcbd5621b80a2ccae5884668261448b6b013dfb10f249dbc057475fa56cc5f99e62c00d19a3d302a7af3c3970fc844d1aae091cc7c059936b5e7cfbb394da2260dc958c9789a55f30c40d9b948c3337204934a9401ed8369d576eff9db5424e34ced70b095a0ad667e6cc20b22462ed0b4c4674afbaeeead33af15350bca402379f9df3017362dba89cfdf64f4920bdf79117b65fbc46ae05bdda0da7541df7c7a5316c0329e733294117f856c0154f90247afe5ca5ab567f08d8b6c2d3b569b02853519faf86bb90fe85defc590574b62bd4c0d703066246b95ce90843b3080071d19d2b78ea14996e6a82967ccc063d17f3f8111552e7dc50ac2297bf0c89d37702116ce85097ce9963d2ec74381b9aec5a84befc930f0e3df6c9e9b15f54d9a194a44c6f1a455b9180202aaa53096193ac7d4bd446f3706db7b7497caea6a4ed06ccbdef314e9489e7301e7787582b3db9c2eecaa0cb9c583017eeeeba29caa8becc207eb491eb336ca412fccd77b494b483ce9e220820181b0d26eb55f5c1426eeaf27f38511741012bc73b10677a5a18d395f1290444f361dd7e58224282ddbd9ca614dfe3afede0fe706135608005bc06a87490c75cd5a6f6c8704dae5b630093aaf2a05c6fb78d03013bdc2feaa2ee02c64cc8c83ab0857c20cd039d3b0738f100a1d37feac4cbffff9dda048e45b8ed366ae14fcf4198817903d8a6d0dbd720d6e761ff4bdc7e96d94e16f29d3fb174b8ce6dc4d6099ae06c439f8ce71ce02d752df39c6908aebe6dfb830db655f21745f23deb6803590cd8fea12eaa25dd03cf90601812c352862792b5fb25f944f5eabf465959d48f081fc1eb3614ab4254a320370b5141283408e2be4c892fd2728e22fe20562618672b7ab3d0cc072b72c4732eea2ecb88e03cb4ee46e89272c1d6d49c6a55c9baeee6ee9461c708334f4c729cb5ebdafa5df2d548da4caeffabe9b31cdbff1bc7beff7225efa458c6f44512bd05bb20544145c96118edc88c7d6ca30882c677c098f7128950714eedffa06ac9c5b02a93450fb2e4f10a5086a85b53cbe1648e6bcf28b29b6b4e5d2d816c345723bb2996ffbd1c7484d1f7884658ecc9456021ddeda57b471378f5d9643011f5f4baafa2f2335bcd3a28994555fc3d86d2a363ac5325aadecf3b4a9e68b487ad2ecd8ca18442f2cccf276f10f7b8344781e9ea4505627934dc6a7063b56314d5a67eb41349fbd761cd1c80e346000412f9443fb0bdc175f9320f2f1c54d30fe820bdf4c2552b712282830ddddf17ee06ab7201f63f17fc398aef0ea2999d36a283053243eae57a4eb54c5aa085e7d5778ed9c167c6d22a1828d6cd70452006ec0ff78dcbafd0e183de49627be27d41aed7dbf7a7a7e2bdc6d575ff2bd0af59e12c7e43ab40876e697acca63f7922cbd6b4164a6bd28bba1cc110ed0d8a0c210afe3dea7e32c74f7a9a04ec29f0c47220baf9c4b7098a85afd414d032008d99b8d9c7801db4d84d318ab23514e758fff6d87226b96688a8117d21e78f53e18a89421b43b0523f01778f32c21cd5ab5721a95bf549228692ff051f1152237d5fbd9377c2f6ccb713a2982008bde37fa3b6dd3c040e730a2a8c267a7f72e71c15e5fb4e4d54bcedff39d0d5b1c25a5af6b6071dc0833d47807b60cfa0d2e0f6c77b16501aca66772b9f2deb3b3319f17a78bd58c661c8eb211f3e2b18d0e17cc35f12ea116364e22f942e417abb9d970152c1046d002ef0e1cc9bed13fc0c15677b3540482b9b5b29782db1c603e70f87d66541c21e0b572e77b0f6bd6b79d3d296d913217c913214743152e0f567ef718beb04b0be4b801036b78bae7107c0794d183e6af4fc711e1cf627713eb743b0bb43a1efda6b4045704bc2f050ff02c17bb0b327cafd7ddad492760f46e6149d193025bc1d6e08fcafabaf102a3d010286c6d802ef1ae02aee065d038e84dd085f94696542f60975cb83caa99f0bc69e6524e33471698419120d4ef3649e257960f9a2d19781a9f2389a646191cc812dd6636ee99d534adddc669cdd4b5bf2aa283aaa3f1353ef6d73ea5c510f363a515127a4dddc72e51a13e9794e2841187307378ba5b58e0308470ba052081e6a297abca1f51770dcfe0c639fe42bbbd612ab55d6d605acd20085b68e5f896eb5894c8136720fd8bd0e4f5c3d7305a9192f8d7cd7551ca98801301429a6104be5c1334d1cb64618022f3e65c8bc61fc7cc7cf21ee92f36b64f67038a915ef4d4c0bd0c7c1ca723257dcf3da2a40bc27f01e75a756d54378e973971df7acf5d3217f5a5a8e725fa4ffd5e058dee79fe07cbf94d9d4e3f0b805663650eed025faf72f3620aea6267a8d6fbb2888c2eab96a08019767506843a1db1532da7fa8932db41b534a9122af8926714feed9d72f812bda264c371a071fcfe0240a63849f25f185600ff4a28de4b6d6751e30c6f4a5b42d49e3806eb12445cfb37858c6e558b14f1a111679cdf9ca3e1dd74a20607f3eae8adfd88618cfb66f9725ac18776074c314b3b080cbec8950521b8596aa56deb295e2f7d19a8454a1cd4f55b415fa5a2e7465afce1ce2916b5b53654585f1e1e531f8aa4c57bb073a5fae6d78c9a5fda62ad868a88bc49f58b0bc205bd5b177996e3f060d05bf906943dfb1955c3055394be9eb33996c5490ddc9a269ed1015134d095094878051a2166a2a6fb74422d16c03e2ab21810fa66ee594053784ffc585029d31e0b8e00da1f8b260bcc48160a0591ae97bd8fb27ee08f759e053653fdb1a886609e92aaa07e21848f87c27dbd6b81bd3bf41840ef7a1bbf3e809ae5795c5f114a4a1d3e9df19d403a53777022f28bde8a8f233d85ba8570877c4c4302035384f5806411223ab67927f9c3c0e46b697b4c5754cf45624004170d02f30b88efe0ffef9df3141fb19904fc8356342cf20eac764dde09f184689a8688407801e8a201812c8880ec238ace09be3b0692ac909ef42c48390b1fb3881c01637eeccc400b9d747b89bc6c8fc2d7f65823a07547a610638e85b4285874825214e2f4ae8d8ac0df6ef602c714e80f842dc9d2cdbe8161e592f0f036d42e06de1acf2ff42fe6d9753a821f034e67405822dc883a0571b774cfb5d51cd376d860065bf40cfc76d00f9413938014f696738a6f737ef512731784f2b197ed6ed905acb319b717cd7efceff253d17f25d5a29c2e95eb4a14f6af3c1540cfdb7b01ee066e42abef1a06bd3a303b1a404c871a71c67f61ea200302797c4fc8311da59a53a5d130f55f95243298d639cb4685ec9018c2bd50f032b806e80fdb405db6d259f908b25d6409afee467c2d1918aa771b4f69f583bd8dc2ab49a06f0173b7183c657ed6e407a6ee86778bdc1bcb9c6626e954e12133ce90ac77ffdba01091a4441542ef6176ab804188125f7a019c77bd5aa42d404893058a69cc0a5679d46196360ace1b62213120ca32f6734a964784a70a5618dfa107f380caa6580cba0f38c633c24916bb06d53255c12db9f4882983b5aeccef7ff395be8e3584304b89276423c3b9d47a3fe0f52bb02720572d0f72e12da95a781ff4f7d7148d681c800536a800b423112b1e3c10bbc37dcb44ea8b69763e09e61f05058b2f79e4e4e410feeadb14abede0aff0c0a1e0455d764d6d7c2d97d6632a867a024cc8959df434a49a6cb94012ba984d1a736c73bbb8a176509d66c428139b21e11ee3c38cea80f10d9901a27724e872a61be5a2f2df6b54fa857f0b157e72eba49d40741d60eda0ee2830545ffff1272b80f6796683607763008efe99bd51ecf84ed6772d9e944bb51b09bf9af807fbe1b3de4525f5c2e3fb69fc0dc92738837a49342871343c2f12d40897aa38ee10711b151fe852bbf4829fd1405ceafc46714eda454f518468cd48cc5493b2a8b377c80526ec441e01c2b319ba32e458825e9ff7272ed024d78beb1305f193c387933e18d48a3d912bfe3756df8e33b4f82c6bcd3a4b50a9269c4a0fbbdca21e186a4cd990a31fe860b3023a98e313c77276c025d840a26631eb70d602850011f0e2d904f4218a2f0d1f3097056a9d80439af5b4ca11891dc9a7b3757462ca61ae62a9e1823920c57a614232be4b63af9e6e34767958f9db4c4eb4bcaced3a1667d9ad4b47e2914b1645b79ec0248af9f14b08dea6207d28dbf4b5a290cebaec78d91956d21d6fc210062bb0ae91a86bb34c5a5f7b270626e45c7e0075f96d95b718f09210133be6ff80a7af7866829eaee072142847073ca93603b1d238980c2147396e0e788faef60148e348e2e6ee285b1708e4beb164d396644b12e83432af886a2aa50f958da8a8ca6d881a31f7aa24386392479c2df20b54598d6c6c9c48e82b35b10577ce7610ef909ecd5ddfc852fb68a8e7b19ac570a8c20138764bd9134d21c0d394cfc2ee10df2d06999c74b21829efd5f1d89eb25d19c090f691fce64c638a37d8205d061137744c22b162ed736b9ee84ac30a447e2077a9893f510a04bc13bd8242c5f8edbc14c6f1ddf2673029825ea34677fb7bd9fd590308b47b93782bc0fa21d5285ec8329f7069dd303fc47e2618afb0d0fbb05e028f4dc497229556c68a3a550e3aa7c1b8c4f914bce645054cf654f68ea7dd26f2e26f506c453dc501063ff606d418fcbe8afa74659c04b2687b0dc95df9db078968bc73276afd14f5c8005f9ca69ae837fe8de66bcdc5a34898c380baa1dd9b00067e8a7961c8887ec2250fc7080006224fd8f13ebe2b8ced29cf1d7629ae110418a28d416034c21001c3e900dbbfe8ef1228dd7e1c50a4f745609d7ba4dc48318b5d61aa0c6435dc0e28502f4894cdf5140254158ce873174b9b799aec33f956fb00951927569e98d0ffbf75ee0545fe081122f1ac0afd5a2a13ee8a64938a2c829b8a32e60af972d2d2011a6c89463e9d9f13c165d39b4670c4b74195a94487e393a508fe1a4d17ec1f4dc4d8b225024a3b91c9c4b249873510b69a0087bbbffd83f3c1bf7ee3dc6c5d96465127ff0d6408926f072f86e7bf13d16b6dd9586a7f6c0de0c48596a5585f4b497421fc1f4175490980b5d9ff24a2c96e731de534353e4a40496384c6dfd02a33b7088a285feb539667641058254cf1d1afde1edfc0147d6e1719a20862d04535438f47fcb15066a815a6d54c04148bbb099dbf7e91c43e753a09841981503ae6f56c5413b38f5a3529e6fc101d0660cb8aa53dbeb1921c10f02d3f7409e165d7a2b445736a490e90696e28ba7246c025194c891bf2f7696a2e65a96504ba5fcca34d633836873c47272787be5c7b9e4f0c461dc78d1d7963ea138aa6b58dd47702262465bf09c93b4c7a0f8c2b56d5e7e92ab304045d2e0b08dfa643efebfeb1939831d4253285e79e5ead6133ef13eeb4ced5092c68fbfe1219314ebc644c9eccbb05e5066d956fb4611fbcd55161280243848b6a07492737a058e947025cd80b9e215bad3b233252b1e6303f53d4952c415b4884bde0c9be23bfad91d8f95c783ee0cab31745a1206dac418d1c0212a4244b2268bd5f31567818681805a627b90fa8a326b84adecd56e7dd7c58e2d38a9391d69c0797d66809ddc1d886ab9e380c8c6310c3f3031b4a79edd2fcf33f3133025ca00cdd738433bebb8e6797087fcbd636d0b33d8de52dc3da5e02fbe28e56539ee298ca8fd2fa61d1f9c4455da7a58c19a4fca421a56a767bff696b6e9ffd52dcebe61d569306428cb276efa8978cac0c68204aaa9651678405a3df1334bb0599d36e90c0c604190420443a0621828c4120d56472a90e466b430c424d1c06f16096c10489602d10e74b8f261107f78865b3f4b57e142570e50dd84f0cae4745d9bb6448a54ec902063a7d0f8341ded76afcc2eef148e302fd5dc3c973790eb124913b3990ed3c41508498f076cb4c429b3105d60cb70ab51428562830ce711e158077507444e2e97e24112132e12502ddc38eb2e63534cb80d9e79e6b4916e951caabacaefef34ab35afd9dc4fb31be44aff96691c1f4853bdcc070caf32a8fa276c4237b425d3698801645572e54aa1794d40f5fff51c4fadcad802d7fa98537bc7bd70ca5719877f0da2d0aae6c180a1e8c51cbcfb50fa1b4b6b4fbea496b4ba6f7c38818305e4a3a36cf3804d2bc03e72050d21e97c7eb1b63b696f6f10ecbfe5b8026756020a4c562f140ffe1435b121e05410220cf40382bc961780bc26e0f77f3b1c3550a98c227020bbd88cc3947b466b05878512dea4e72ca5a7741ec5e01b25f7295ee7bf7f75002695fe4ca51ba46568456ba9d2f049c1469e1702974544bfc9ae17e5dd99025fbe1ae41df42b3a4ef188f92b7ab0d9c40966e82f18c19eecac1db10658cef7c5dc0b91840ec09c365be304560b3c24cd824064c63d0282ec14919f235bb08f1d108d2eccee3c52866773d6cc826bcf4dc504b8add4c5589881ce7360ead8624f28d3861eaef75ff2fdccff4b22d90a6ec3f015dfa89295c9e3f1e73ace6e4e74ea2297307d21034803a91aff3c40c3381683b3aca38e9ed5f6a95b18ae251d2eb4ee83b68bedfeb48d11751a90bd4a3e135be1befe2482b1771817666f8c831816c053ce1e3bdf5753b6aa988f9dd38f03550d98f9c3cf4a2b6a98062a8980dbaace5852cbb3d9a179f8455828054fc70be800c2b399786dd6a884cd30dab3cc47303aa17b7ce2de035e50efb4a259337cb65e7b13554b17aa79c1a85e68b72c07f68948de7691aa0dd9860b77549f0be4d6993c0b79d32660546c6e0a8aa66f3178b019ab6a2b43ce6bf814c787208c8aece05327afd32d459559132d9905fe3422bd1b6b20b9ce3ef2609634e710b1ae17917efdfbda36d5796988ad9e1071403037bf99adc24a6f03e76dba4a9416c0c9b1522ec7c11730c385155618f8f8c35f58a5e1d92656aa78f04a728d7ab3a8189048bd5b0b3be446575a24f456aead8b61a4352a0102dc91c73d067610ce77fe29f027c694ba6916b50029834621b6572e33d016fc4795521d1bb3ab8c8f5c298331b347a657d0e31f7b87e95bf664742b071066d0b31d6e2a8830347c85fa9f33dfbc99130255405a482e8a4b7ae2d5050b1cc0e9c89f87357e4457076c9198b41ac23eacceee1339d958657650f3149155ea454ff8a8b7b3e141d1f47536e1c11d4c19fc6d243537c8390ca343656503e6f0e12d85800db0ba54eba7b924d676815de0034a4dd0e7d4bf0bd556de52f6002b158af03962b79d0c6acb6e743dcf0f44fad276d8aa1825ef2ff2ea447f0839a3b1e6aff3bd8353babf216b00a4ceb31df304ff70dce559b1e177a4741cab524a5c100fe2caa389f7c09ca40aebcbacca783b4f5c959b783e1afd6c61c8d12b00c2be075131c9d7a8e570e98fd310c84387f6cb63fc836c87c5518c88bc95c904c5664fd24e26912d04a2570336f63720420b714fe1e6b4441d62d92d052037185b663e162327c9a7eb2c724c70c7dc4a743277ed610f146bff21a35de9fcba326bca7feead40545282ebe8ddec0098968d42dc4966985d675fd6f97f6604a177c17c5c42914202525546f0889bcaddcc53624c96525186a05ab1fc024f523bc9a3ea7db2524f187e25be2d0c42f1df661a07953a920cf13b703775117e296795b1e2f0cf14b149af11029a11ad0322b53abc1fab9d136de334ae4c21c5c7f0337386e77cbb4515d32044ad3e6e019807e6037fe5bab66cb1a559e00740998c35946952bc2e6be298b16140c3f86442c497b543272392facc47e63dc854dfd2495178585f7946a2a145647adbde7471cec7b5552d3afccc3b4651de768c41a6bd63bad2013dd3862ff57f4748f53104bdcfaf575f5fdd29c6cf41075644b95c3e9c7194b185ad565a577f7617c69c666b5d742833987a0405d0b4cdc96f4578debc9b49d36b48383f68afef74c3b5552a157d0431d6938b2065e57285943a1c54acadd5fab1b621d73d8e2d237decaf9efa53a03448db2d74075bff7ab86f808e019a1d02c8ac3380e2637e3265851670118efc911acd27c4ce751e47ed54ab7061ac7547c17d361a036034d9dff1e417ce5a3b40a5b14cab1df08101d4c27b89f70e3e087473f8372390351d2eb7842e1b80cc496982ee5751e2de9b355d22a79142e424507fe0080890eba9810d8737b52078d66f97839078fc0f8fc8d4fa2dbeae85ecf55f6496faeb2f3e2b6d401640b9f16f907122f3011d54c4d6d9dbdee86461ec218516d3971f513b35c88d38cde5478011772255f00f8f9a0fafccbd8030b35a5d8841ae25ac1a77bc7c522ba5ce63eec2de62ea2cf277ace9c13c6eeb1297da9e205e1a5b527d4c6e6e1824040e007486041b7d5220109b6e6de7ec36b5f2b74544cf1125ea05a3e49477d75b29683c8cf7f4ed5cb129f9d3eab59afd7f3f5782a5220540fad1e7092682724e9aaae5f54934353527c1cce154d61f9f17f1981e8020955a0adc89ce81cb07797a784183c5bb9c7c796cf2c1febb64c01aaefa593a47ea4b4384e77d6c60f0977baebefc8725f0208f5fc18739a67488ba2d1809cb96e4ebf5a00980690d41dbac14ac3734d784348a636cf40b3b58a87e7708ac115268c2fd9e10a01eaace952cf92d870b55be5ce12d09a30f7cc95324a1426d321e4e2c4fb89440c5a3b12e4643fa852c63a3eba5eb5f8838a9a3cdbdaf39540b89aa4c6f658bff106d69ed0d3dc523fa63d8c976c526be525ef26f28d3810e689504a5bab584b31f9fbfdd183ed7b208dc9606739c715d6a205be7478f1c798818f3ae64e17455b3c2bd06bbeda25bfaeaf6233e85091cc571baf5d547828f34b9c5bf4963e0200a8b71c2cf09bee16edb124582e08300484c647a75c626ba4b84f65e654fd6b5e0eba68238445ccf0381f715b14d672c911bafbc57697a49a94f318b860e05c52e5c6ccfc5753a64f39538d9ae67bca80899645db2e1fb75a1889c1e90c75170c617ff50615b61d6384895a563811ccd944db59eced5d1b40858509eefff2fdd28644816c10a760e7be2663af8296904ef597e84caec967d8b29f02d01c10e64d0bd9b5b9c048792e1102ef3afa4a4644768d640f3306ea3eb4873b8cfe8528546eb2d213f287a50004c38ccff229515f8b30411b4892afd3c8e88fe3faaaaea393ca03ba89014e0450625279a3c4205f02727cd2d3926539a2da4f1dfd7a1b85be91fd4935db37889fded0cf45338162fab6ec7fcfc7d0576bb6487afa92e9d47290b505ff74a59c143d3d625b16a2c74c4efcb70bd04aafa760677bd30cc5610c6ecf403a4197a9d6feef614f123164006e41e3c2391b2c9f649e66e45fb6dc04326b1c09adf98d94e11ad0de02ce1738f15698be6d134495d0117c03c7e10ee81f5cd6e7af3d709fe2c3b0563a0a141ac7347887b69b0bfb788110e482cc8c1a5de69356d2bff7d2be65f2cb0c645ea7f1423dd719efc592964e8d08fde91620b835247fd97e1bbf550147ec4d113ced272d124784d637fe898b330648e0acdb891f31b671070d5e8970bc7f3f3960d55405570c256bfbc9e483e5cba8e268ee2419388e89a37a87544650fd6b128fb994e300f73d262349a44bebbdc62be4965a563b0a97f2e0a8214262aa97724fdc1928f12acb0c073f523d3de60cdf3013802196a8c377d8fe3ab043c790828a97da7c020b37108e3305aaa7633958598274fbb0d826adfd691b3b34c8d52b6a52e47dac2d4159800e07bef3f5ee0d9ff9d03be54b27c549edff2d2a1b70ef8cc343ff837c8a81e17abad21a62896797d6d2ab42abad0d8f9e5417a18144aa12917b03b7438a3834a255b94d4c0793118830469577b7fd9f06041d5f879e793698d69bf995ce868940715ad5ff9e2c397913cb307d83a0caa923396249b930263ddde1f38ba5bedf9dd1f0044f6e7560ac0bb91838e1bca1042b46c24e47017d5282919f73bb25205e1c36f1d4202120a3c16234eb934c15d706a9f81f3337ad0aae4f54055bf59ae95bbe63467c6c372adb7bc2819e6933cf918a18705b9bfafae4495470d0091557de2a0d4b32e164fd5d2349152cebfc68d5b92897e4649e178b5b70a48f0caf0b87beaf93a30003654f79d458fd91079d2901e1d85f1c38d8828133b990e08c8b1db8043f9d08906230b006ad02b9e276853416b641a7f1c137a96e7740e58e8909c7e01b4ead50289f7fe216cd50b08bb70d907d4ad9c24f795522142f71f8a65f64d667ab14c8c2b9f5396d61de39ef205ff6a4336787b20ad4f44de9c396e7558a67e3fa5c178b566e73d3902a78bacf71e449e1d75c033d7cd75ca8d0c9630bcd223169e8d791a22add4899d35ef7c296595649a47dc5cdb9ade75faff5d8d623b9bda7f0a2202d27d4acee50095abfad87391e22f1512667bbff60fe09fa5207c9ec18f69ba38e67ba622a824fdfa720fb33cc3d72bcffb432e210ef93337d05e338026114b750037f00e54ef335eb33b1923803774a1a72cd0a943d1386613aa1e6e1a76ea33d7fc29554e5cf47393cbc4f67078e131360a222847cb47d12191127a6ddc67466e328bf1f63817f2822997ae11e8ab452b4fd8be3bb8d3da286142b488555ea6f679c8e4db8b6c4c0b885fb866c29cfaf29f51ec5b8dee349cd1ecb62093c478d0018ee6609fa5899a2d9964b47f2f30029bf82febe00a8d82b386365c3efe051ecc3c0a6a0a4077a5b4d5bd3db6f6daee3e6872398735cf7f47a84f7b0ab6a0c61e9705c7147fb8af31f4fa713b848be842fee78ff09850fcc9c9c3e9383153ffe12ee5fe18dcaf2b8e2a88ce92a96cee2d62657a1e5c65e4ec8ccbe8ca94adf150550b19f6261ba4c64236f4c922230912c888ff32e4cab664af2cd1a896fadb882b89a989af46a23aa2235fccd3ae92a90bb4b6b1f2195192589c3579136173b87881f73214528f10a6e54f0db002a6d0860c9bce8a3174c3745f7b6a9cc3a0c56f81f85cd7c968d032ea1042b45b93978ff3a9b76dfae665f705b70103da4271f5e9dfd6a1adac4db31a503e9d7e274668c28731a7f51133356e83fb6b3036d953a2f292a60f97a32874e13ef69566d729404a242185ee0525367b77e3276b98d8fb7c362b5c679c501b9d47be48075dbd6ca10ebe451b1fb9a3917360418a4c390d1c57e5a4b63a286e47b1c4f247942a0a048cf8ba2194c7dd5502213e86e5c948351c1088d694842076dc3e89471cd74ed6ab6330dc70412048370ccf77047058e698d1a8c1c791c53b006c2162e53617e26bec2bde3d4f6f33a1d23f630f787c501fed0036135a1800f87e947a5879f882e406ec022db3d800fca961dda208a7e1bc270fde44de5be784d4cc37e3550e1cd1e44efcedb3a286bfd500b81ceecd9bc1f5812e24f7066b47a62e73e5f5a74e81a9c7851c64320b129f492bc2a9fcb5b151bbb8b09ab42e130753b6f1558359975580417d7594dc59b4b9fdf2b02319b5be494c27a4c4dbb514bd9f98a228242599939f739bca9f4810f67be6b2623c2ae90da8961a4ad57c05099ff1fa8394ed436d13034576ac8151b98f950b8162c3409b8290b2f1f902621ae0c9a84b541e8b9b20999541e6279bc1b72b5794419e4d7ed4652651c68fd52457fce60204e50d1765dd23f4bb4af0f6b8afe41aada4c1161bf29f1213e7463cd1313de82dc0be8726d487d48fc32d05351257d6e0d6348ef7e8c590566b99a40a45599434630b85cc7ce86e218945497d508f224bbc6be1632cb4812000defe0e48117f908de17ee1417fdcdc0b1e3e36a95b116de0f02cd51bfc89ed0476aafcc949d9db0024631be1a9e7bfa966130deb07bab8bc5376c48f04432aa251ea4238ab911265e6c047ec62560e390decf2592cdec48faae6e6e0f0529e5e6a4c7dbedc3f30a221924bb909d4877419899169e0c2df89fb65b1a61a4c42938e2bbaa3bbc62be442f0cfc1be1db1ac3cb0eb99a169b8236c64152761a466733d9051b7442d3d1e784992a747d047ece45619c66c7391ccddc9b561d22a77116b99048098680572a25929194a8dd1a8e52361ad999d178d9cc534f6bb840ba4f13d3ba944f55561ae0b108ac14814d957d159edbc25c4d0103eeffaafd22f4b283c9c40ee4585e65425c6b753e8c4a5442f08046c8f7ae3c5f24373c504faf03d2c7a368b5cc805c3886a32e644ef073564b1dfd52380ce472c2625d7dc687c8f2065d2ef4972d07b057a358fe51cf748be7cd58eae73789e47b2acbe3b0f2e455990b1bb9a4c4b8f4956ebde2900cbb92580b4d8bd4d3cda608b7cae58c7bc37dc61180175b5548c496cbde844c25dc49f71914e1a193e7d8e0000107951de0c7d6556d101133c8da3ab42fe24cbf682b33578b213acde23f380ea9ee061762cc1d99fc281fa07974038078a465855a1b496b64a67de54251df339ac524e656da1d1632021070fc4ce2326ee49fd4003c716ff4c022d3ecf47aa4293b195154205a589585cc2b9a66f37a84888edd83de23afb9833ecd8cb9e8a3bb020fbdb5d1d857e039c3f2c72c43ddcb91415d144d4a550c76a3f69db3bb8e98ffce43c11017d8cbced24757f0ec87669c25c22d78a74b202372f9ae416b99ae0ade8ecc390080d619584254ec45d06a84c9acbf81ed6005290f4584af9177cf6b1379449d289747ecac7d3ab023aa79665c1451d94adbe68236373fe2f02bfceb78d2a196714863d4971cb9a521462cddd28d15eb20a2a67b0dd1a6f2374e605f61b39dea3d3d62881cf4608a1c6406298593bf5355d762f297217220a8fbc0c8a4200a041344d5fad150341403a41d061d7986bcbcacb4111f04c4d474b50d025e43ee7853881dddfbaa02175f68de98ac73786476b30555314cf43cc1abd593d8829404802ea1b2fc23d588ee8cb794d02651d11f13cd01cc5c8c58db5ff0bbb2208d8563a3c376abf52485df1347985b5a7390ea84c506d584c0ee807141ce7f9c6592a69d98ac50873ebb96b5e1892da18e043604377bd1d11e2fdd2a0706fec676a9c4b381a51eab28670d4f7433248c8e906870f15f61f32c22a5ee1f0e18ce4e2582a90ea93bef95b90acb3c17e1275be1e2b419ca69c6e520d367d377dd321bfc97d54ff9e4de643b15833a16b45be4d052c0b83f4e4911c66ab9c2868c06a8d8952ed4ac5ab56ecf2eaf0c3e0be9b933a34ab48612bd90e241a80bee107132cc0e27dcb9c4e1dd941e3f6e312bb6658ceb7690dd020e6c73952eda913b0053c68e71c6448e95ce4a5b93983e918eacc8a93c36bedff3c02a961c9e912154bd6e5a6afdd0502358c070429756db2fe77308f45acd3b5693034b6f692586c2a7eebb56810d8fee5ee41b15d27dc37b15a40257d0ac79ce8175c3c0df3e20f5eb9b65c01c375534da41c409834d62bb50327074f93437c7cd5273fbf6630bcd1dde4d91b686ca9cc500b35180892824e87392652a18ad86de360661a2094e9ca46be9b7aac9cb48577bd69231ba01f88e93425d41119614e9ec4ad9a9ca533ec22542ec02267b8a10d9e19e16bd130b3eda96e87fb07a0a4ccd22224c11da71ead44483e956b02858f57801abe7d9d586b7d4768517c268baf34a840145b4158b870722f86ba8b0c9acd5f7ada7dde0128d9c8993f75e881fb452e107180805ed1585e9339db15ef2a5e931fb0e017918c538b046d89bd5fbf779889e79acf4576a01cb979adccc20f1e342bc1955f0fddd29f093effab8711fbb62611be8097b5d0af723afa79f5ee3f4a6915e18e63e2ab8bf637acc5faf8ad5abc6d37b2b42a864425bfd99abff8ceac2c5ea2395bf014f141a5b250212b9d837c23f5397019fd2f4b59f91d22194815cae9e8d16131b7f67d6a4666e969023e1a057f9b2a8d72e03a43d9f9a7d3441502db528b52581e7e46732c00b643b680675272b2280e00222f88ddc3a8c2be46f128e3ab35b1c806c4507ccee43810005b3d931bbbc84f9db81505e46e34baff61f545ea203148fec2274fdbc50be32a1236844239594f485ffdf7d8eeb5f3faa66334ce684fc2ed8b035b2045f2c3a82578e70e6acaf85674b653ef3cf630cc97f82c5b8187fc2615e4ef008fd4faf6807189add0e782278571644dd714beed88196577968cf7866b821e9dba802a153833511b13cd57f80bac275d200d3592c4cd0fce7ed666776e40365a47d059386e1ad621d31d96c56457ede43c37f70686ca96d6edf44eaf916fa085bfd24bd9e33fc37637d012d07366e68f2329e1dfadd245c37ebe225d0224b73c13fc66c7198aec3ef954ec9c233ade87a6b6ff496283cba1c6f5e168862ac20a46049dafe6ba796afb94262378b8e688da8542519c164ade28c506593ef2157262e37d03ca0227bfc3c0dd6404454cc36c65afd8838ed9014a74cb5d2a5232e9adbf7fabff9b629ebaf3a20fd104c15a45e780d1a852219f45d63bd319b3cfae502d77c35552a619782e08ef1665d9e677f6e3452118baca502a263267f8e4944d7969f550cf1c5d15211584999155187c632027a5c11575f9b57bd6fb2fcef704e8a7bd487f71301f36b776cd1bc0232fd69b8f279053e5d2597b9b1211bf4be56b1acc325411d50a036d2cc6f7042dfc0a4fd06a1fe067f7b572aa20fa8a4340bc4487903f9d25d51440d5b18880a93e7f7d061fd88e412d4dcdcb2440d725fe52870564d7550c7a32693930cf3600b326bef6c1246cc9fdfc5c8d2acd4aba97ae5b45e7dd92b31f56eccde49d5cb2fadb7a16aa5690bed6416e74d550ff34b666584cdf574a8d06489981af8dd93ec07f29cfc8151644054f4072c0e3ae3ec5e106b0ea31c1ae7228eb3e32a8bb7443d9439db6b4e2be55bad49841e880a0d56d111e0874689d5bdf01a67a74c9a9cc91b9a2d42e45cf98a820956a372dcc25134e1b43597dc831861cf5e8fe2abf9d45f52c5bb41121bf04cb6a5c9d94c9d7398cada9fbfa7ca4dacf7bbee85ed1aa01360f1a8a49b8fc6dc93f1fcfc0cd8b7355854f9ae7ec25aaa735ffe051dcf0f043c050b410a7399285ea2bc08bfa51b88ffc562fad0bdde6d404f382a9b11d45e96cc7c216370e1c88b6ea03bb4a773731ef6a5825724d7cd9bdfddffe6b0440026f641430b524450998b55a6489660c45efa62a4149cfffe8c15d995446f7e2bf3882d79996dca2f463dfe56266718846904da117576a4beef7eb2fd5d2b85260c05da9a7088d91c0674274c5c1cf8c25b5bf98974ea5bac58c3c44bf49de5e341fe84e3a26ca91814e18fa1c3323958e0449f9c74e84f144a5b99d39d3909cdbb49ef5e6902e031581d9abbb130c1bb644b922c80b6eee4d293cfe775d12e32464dd0ce5deafbbbbf1bc25733c0c4440937e97701a90b6433f6ce508246e413826e602df4442f1270be77028ba7eeddf8e45e550266c753bc67d3d1b481dbe327dd07f9420ee3910fc0baf5a64b7c3a36c6c6cda8fa3633a63f04ea05a2b988a8617f03fd8477c0e30dae34c4cc81907a782ea82ebcbf09fe8771026fd7e3a4c467075da830f445be16f9491b1d4348f99a9aef17a7bd48a07d48022443d018a011d1ec30be1c1dccda41b7bd3e812d6cec27580ef44fc610942760986006390fd46174fa78bd2fc4d9a173aa149283fed24773b080bac556f9f8ba58b081549b0a3aa3afbbff8f64e5bc276d9c1fc4b532e9e01730b8bb082539e52ae098a8095a3cd56b2bd20d5a104cb1c3a47054708dea49d01cb9e69050397948a4d4097f8d21c83b330da2380d0b847e201722fa25d8ad80054a68010a3b7ae218101f20e02633540d44e15cf0bcd2bc64d37577ab65008ab66c913eb139a3799c0ef291cc0363c3e13aec8bb6823e99a653874a433137902203e767f169ddc9652ed68873c4988c6d646e74c11fd97f0a01661441af8242e6617f9c82771f0f9d5d1006ea689c7c8048004368a8008f1d103527bc11c58f6fdbb07d623f4194a0229d4b8881b2b9b1f35026a5ff81cf38a9616704393dd03acc08b352e304a127a463784d3a9b1108b5234a2775f40dccd30321e2285cf3ec45af81c4c12d89128a29dc399e039361c83caeca8d59646c48b6e556ad360b161025472744c8c56f003fd108b7a076deecc704d3a87abb8e05bafd34218756c6aabd04859438fe39b2728086323879ee302b7bc2b5561cd0bb0ea1fb60a764c250e10e00eec360958d54a08156f15ef9ca826e3a7346141e367e85b6108e06fe04f9f6aed24756e8a21af150ccfba6fbf105c6563c3e0e8693d45363e86aa0b3c8e1a86e73b901e5e20cb9750df1f138085e052a496280205e505a8462b832d292d1586ad1b3aa5ebb63e96d6795cd0808e8ac0c77d3ba0b4fb8b3128b03f09fa85781a298273b4e123569ff037316b3d4dc52610266183b4bf6002813e037f3146e91f728eea025be6333767d514336962a9bd39acd9de2dd81f1e3d6a96084be3bf571cb74f08b347ea2519d6aa62e9dac6b48f4791e5ce2bad92ad31a62569c4c22b326da3efe32f9d99a3f3ea1d8cc02f9dd93bbba5cd69cd98113d0b9c0858e7ab14a2e57eeb7976812d88b94cda544eb5bce7a2d2f36c8c1384d48ff59fc911e958fc7450f0cc9175435e311b1c8605b89e665f2c4aeb58b29876a9d81a8ac17f05b8668a04308a1150d487435bb9ca30ebcf5263c52a5948beab0ffab33d1af7235c5d44229d7f152fc64104694744932aacf38f24baa5ca9931dbfcea9ee46081eaeb18911f12216cc1108bf39963feba1bf5a4642cdfb42960c0e930204c4dbfddde33a7094da81edeb3040a3452a95ddade47e5d9839bffedb4a618429912d0d87256554f5855501513708d01e4e439093913c00c3e4107fd30cd64168ee60a930000c4ac03422cbc42d9feef9f8ade7e8f3d719983e2fabf615a96980ea59b53a54aa005bb94bc08b052108c7a909a39a0891da469539712569161d25c0f4e2a697fd03674a38964e81b88ad87c5a6f02c510407e72b3bc51d17ca43f9d84982da1c958ad34702395df165c56129249dbd6dc9b13bdb6ee03742fcb67f7564ba8168d721b72395de7e08eb5fcff338b4656328bb58ea29145cc7936a3a29b12c9bbcd1e1eb7e4a4bf625cd3e60953ecef2565cc45a9fb57da2bdda949b4dc618dbca9c68b01ffa015f8a4b1dd9ff9c41d304aae511caadffcbb02981a9ca7eea6a1765968dba03b183ba013bb8cf8111e99e7b34a97c8170d1564b21c7da3357ce36b69a27b961892750b09e320a14921525082561208cb81acf0027fecffb4135178f4b34ed580a6a323963bdfa02097d48bd41c0b079468b77f642bee2e37478c5fa581942ad7d0441d30f987114cd935cc16bb6a102bc697ac084e475df8d3efe7ea1701bea1c8404fec5400a7b8d0774e359a6a96b04bb9600a9f1aa2496650e9900a8110fa40eb16bf0168e95901ed02efe60a2bce7204d400dd89ab962aa06325661793e1f93786f022665f1a61d98f72987c0c4e2253164c1d93889549c1d5f0176b5c1e2f2572e65f5fe2d650b4a66c0dfdb3568da7e6147e64418bcbca319fa449fd2a3cec3954c7e5d02de375587b28bab2adedc41c57693c5d3dd115ca68c11ae1dd75c6be7c3de033c450958cc3e5ff48a01d323b4677eaf9e7768885f939a02d09f72023672a2ac74ce85c3efee52ca0a3e3c7b789f00f4fb50a60edac24969df45578b478dab1a1ba3f6ca49c042cc0656873f996d8e6d3e270028f1a18f8e6cc02a8224ff9eeadeef4f15991827cce4a65d12742d241a90c6d9218f734e364861a43676cd695a55cbb43f3944093c34ab68082624457f6a798c4a578f7a88710f89374f58a5faa9f71f479089e39869a01c06d10618be0cb847b4130d889190d10943db467627720d12f240d7b6ca574ee62a4fb1449d31b01c1227e006c2b92b10f015e96b1fe6ecc1adbb518e9cfb4fb9cdc572f0932643272578e2eefa06c3244333c55bb2cfea90a3e05f8e74cff72ac7416eeafe566b025be6cdc509831cd8ac9e2b41e96dc53e26eeaef1079b84b70d6d7b2ca2a2f5bd2c433ffc76e58235aaea751c66215ba43d37cdd3a5e4a939c07ff7fec4a080c5ef2ef5ad11f1a97fdbd1fd9658d8907b18beb803a850de6b8621a09d1e7276fd02b807e9ac9003a12381e349b643996db216de6a002a04309169cf472a0e58184f90e885b5c70b0ca060f6b7c5be275dec9681c264ae44a955c78220ac80dda01bef77267d1977902d2b5f4a51df9a6e18451cacb729c58364af27a68e54a5319ab37a7515e2dabecbef05cfaff817da925033cf9027a3d5e7a5510302b491d9f29de4e3c91d24bcd10d669b4bb1d35451904ca90b251995bd26345ce52a787a52012dea6ce3ecc3df84bd8705adccd4daeda545cf2f19f01740c4d11516d0bb12f3cf88d1284ec265beebda54c520667076a07e40736db3155b280e1e2a404509868d65a6bed5b2bb6b5d65a6badcf4ac95ed74ae9560cf659b2d9270d351fd03168b098c1b245161bb260d1e46493a2504d5e40fd20460b94eddf5a29798f4d1d552dcaf74a18db7e8f0f273498d0c1639f3ab697c9554cb0fd61454059d162fb15273ff26143951a766c1f4f7c3041f91467bb7f2d22ef123e6cd931d0d612ae4fb1a6c897550915079c5c9f01745c29f94502956ea562dbbff6452f3d78c960fb87f8f542434406692f8bfd7a790c4f0f36223d3370a49e68352558287163c41058887441f3275bc24885cd12f29543a6345c793932dbdcf66d9a2258b47c95f95539c8e5b0f10ff92c8d32152a90cc20485acf640a3505cca6504c4cfb24c3ecfa439b424dc191bc5de9cfa8912acacafedeed0f13ca2f1c45874a6a04f2ec0f6a847554569f46592b9a27ac06c102c67da647792c0354f6755db1eff7702b2318915dbcbc50bbcfdf7894c7ea73c0cb1ff520cf1ae121a8acfe114f4af4763513b52bcf1a51dad3ee45611d25c2c13a7955536e54d990362fa24a98482b3c34e548dcaeaa2932b72bd9b42ba9dbf56f4e49134ee764a7036f87a7283d292e85af0818e6e745a74867d7af58882dc418c5098cd03e6b0e4dee4d9c2e769db2cf4a67d76a67e7fcf9c729950deba2767d918e178953e29438254e8953d8866f18274ee15cddd51c1866d663c6235f550b77204f879f3658c48b4e9009bc8138f076abb85d41a65dc1dcae3750274596925a5969aa7044a6b4f25568a3fa93fa50285f6506fd503df9a33483bc468bf228bccb5923bcb33a58c6baf779ce1a515a936e87755656eb8320c8039fa2b800c36f078ae4af01e799413108d18122d9d7400b34cebe3f9b6d5f33a8da8ac4d9ae699c6d73725372c3e19c9c5589170555268f49c13a1e7ec23abc237f08920a9d36b7c3cf9b5a6a149a42a4c77c42ed3b2bf32d66fe47fe1fb317d0c9e73f9414a75df5fd20f23531b596084985285dd5a7bbb6a4450e0d581839c112123457531e243e2f98f4bed0e867d82c08b0d6ff4a8be8d70aee1eee827f0cfe2bb0b082175133887acc57a048aaedcf0245b239b7a6e286906c1fa2640c0d5199bb8f1b74cda64dd0d388c7f58161a3e0762829554a934a97c6ced33ee9542d62e990179df98d8f51b6f3e0420cfe2bb0c0002fa29f83d224310768512412e87e014689eeb7de6aba718d56c2d7f4e9b8badb5ebf92b5147510109386e6094e034d6a7dcc42dea7423a00ad5dc1b72ce820d0fc81adcc9fc829b7604ec0637fd2383f1cdc6d7ebd1c26ded2aeec380896ee0198619f23d818d308c7918e40437693c67b2cbfc81246c363301ae05dd1c2bf18936359cbb2a4200bd71bf47bb86ba118092459ce74b0663a4020d6e9c26ac562f5f4c0dc75adbbaa6bc562b17a687ef5ac48e8d9b82787ae5badd2dd2fe8ee35a7edb56a6bba5c0f29d9d76b753df6f3b30272b5803210101009040404a402021a31109018028140d70239105005a239586707b66cbb797e8075047c1f00455ab1fee7e9a7b082359a919f7e0b2ec4608d5ef5cfbcc0819a07bf00034ca7d3d1ea35c9f5f4ef7d922449505332fb8c192328f4694bedd3fab6ff8c2723133bb6809a96d93e5790633ab0026a2a269b209fd9faaccca560fa74a92576ab867c6657096aaa04084ca0a63c28f9ccb90c35ab3e3e3a7a91ae5d0d61bd9c61d67f4dd03314a9c7eff8f214dbd7ec9d612b5df78c7255778e6d3f49cc9ded389e42dd0a75ee5991e03b34b5ef4a5650867a155486ba24c7950565a855a11e55e34adc853ae4814119ea3b83c53288a2330c7864c063f77ca741096a1ebb957b582e16a843d8b35992967c66105eafd74b0b50efa892a483791d1c432a520d4b6cb0daa554cce73f1683e9ea6450fb01920f36a5327a343bda3b9e80dae8a10075d18c263cd8af577e911694a0d6b14bd3469ddaa795b2ba7ac3bb38013d5959cfb2f15894f511b1fd61da7f5a6c51bbf0d85453ec61b032f9d228436d6d94a1760a70c46c94a0c6b15d678da8b5bb12d41d6c7f22bfdaf22f87bada5aa5a4ced96c23dd78bd5e2f1b69cc12d41cfc800135d17e8dda7eeb0b7ac32f2b04f510a801b0a36ccfca1c0683c1f6181994a0de20870fa096c1b251977c665919ea2cb07f69fbc665fe3edab27199f7d0786c8c83719993cb1c0683c162b16de3041b94a0d660933a4b4fa95f08ff85f161280145925393488ca560ffb1d3a5885cca1a1d591aeb31496759d64a7f00b67391234fbbf0e0a4527e87128180810746b6afb2f83c6639b1ed8fab34374cf3311d0f07dbbe937912c2b67f66b04f972adaf64f7b6467c0bae05009ea0c62dbea5caa6d5f56620c7648beb4d37cbc7ce923b8b52d51f924b477f0f25982fa8219b0a8a9de17a9b42398167bc1a4cc1d5a222851171af34265fe40da86a13226688e2fe810fb867f8f76294ae4efd25e6ae782c6fc0454e69f854a0e36581af2fc2d9fe38d12d49ae6f47b46443e33a86d08c00750d7f0a163819428273d254f45784852a0a6d1d2168d7dd29667659ee4269f7956823ae8c5f301fad0eca00cf52ad4658e32d4a48e32d4aad1c98d667c7d796f16c3a1163f28431d82d786da793effaaae2377198e156c7a54829a82ba8ab37166002c5e1ccbaf55e9f486398e57c499d6fa96d258f8d477a5f6e9355b2e97cbc7faf8f8d897df7a44238b775f53bcd7be564ae1bf7e54ae191866170d66a544e3d351fc1e7e6b5b1481cc724d2200bd61004a7466137e54a32aa84d68452e37850ad3a52492559b4285f9410c228f9b4285c989c9e4a650619eb07208730b630bc3d1e58cc1183b8d4922e274a3d3114942263cecc405bcc126e2991524d707135ba843126b030ebce1e63e6ee05d24b72a4447c711ee6665143b0da1c1069f95519c44941c5619f8c976649f33159bec13c6aa4ef6f1f52c651c8581808aca334684224d1e23c6c8a3a5c7491e374d93078493c14dd3e49122474aa5638630c6d86fb5b319f500844d66e8568bcbd229c618d7d1b13866870e210c883ca83616bb1850220f4010fa398df2569bf3eaa78d0570ea9f548b12bcb65e1aeb3dfde1323fe147af77c28f5eaff7830d901f27fce8f568cf68c887fc635b284bbe1ebb3da2a1a121a2a1a1a1a1a1d96c88686868684895aba1a6cc267ba8129beca16336d933856fc3e023b03635af0577add6039018c360a6dfa27bad081ec3180633ddbabd21a56a367df06e0b8361acdf8627d177a7d51b15c9a953777777777777a7ceea51a2babd607843d18a20c623ad2655a4a72a931abd11ede1d6b45de4fa8ff1afa835da54e6b1ed37b65bb3078fb5c1d0b39bff7cb12f2fb9ea17a85d55b5d65ab5a86845532b1837bbcea8aa22504950d995825adf770ee6f431fe5457af0bf64963af9eced91eecd50a092c7b85841deac608933a6b30355a2995997c917f49f2b36d93609e802281531edbec1d5f9a84e1059d00a340f04170476583bb2e3678c4182f3fa2214c20f1c349638c0de62507239ad83762fd40c64a19be552da5705e02b5c08a90aaf8e84ae904b5fdaf1791c37989b51a5024baed4d8112d977c11aa92045f36c0be7776465f6da70b4cb1246cf124f16a244f48de4b3de2a921baa0e3d582ce0df56fda40f68920d72a508bd4714897ea633aa8316890f0695510374a94309909376d2eee1fa6abaafbe387f2cc3402db010d1a9c13f0518883f52d97dfc42368664bb691882d582e119db4ae563a4faa45fbf7e9330084d214a54c727f5e92dc476a8b227d1be41f5ef515035f126fa22efd091234eee72eb79770be50643bc493ce2717c82a42c9cd6ffbc1f82549faf1660377c7fd2fae91e7a3def9761185ef3b4dbf569b77db28704eddde799574ab49ea0dbb20c574af404b7fd330c40ada77d2f5d934eec256b0882a15579089ae7bdf75ad0da6aef68c5227aefbd6168cd7b6f088220354f1644d822d7b72d3cb557c46e84adc55e74524aa9bdd65a4be631c2d0bab1d65a7befb57adc758577035eb08ae0662984356edc607cafb5360cade5b1c44d39879674cc8ea3a34bc1718758c7adf54df098c75c84217015137118c22e0bfde311e45143a601a3af9c4bdfd81ad1715f108c655937a5225012a891f8a209e44f0ab5d99cc9970da54894548d65099660b06a74ec8ec734b9b5295417385d32de14aa4b1b551479b5295417342c1364d5a6505d96d8505dbc24f171b3f5907b3685ead2c4e2e5bc295417a62e38515485524b1886556a948846a2463ce3dd30e5a4c477c5061f44723834f1b1846762f0e038e3320fd9b98cf2f0902797d17d66d8143be47c1869829a82c6069e8f224fae7da2a8d242a1fe5c622822783d5e4a2e19b6691a3c440839c9bf691a3c38ac86c0b3d4d3436efd441f325982508b5c6e9ae64e1b962e939ba6b993a68c93676c9ae68e973b196f9ae68e102a2e777ae8f121cd9d28062062e714bf36853af2c4be9b420dc1c53e613c2dd55652acaa71d3c7e3bdeebe52bae00d4da0e4453eefbed8da95928f5e7bac9795acb514d59067ddf537e9a36b87b93e69af0a361b06bff7debbe90a5bbf6d5e5322faf75a6b9d821a3aa594caa8760b83616cad5bf0ba537d56a794d21a50b7f6f844a92a2cd5ad87484123d45dcd2a8263cb67fb1560180caf288ef4ebd78adb95c96ddba8da28116ab402ec63b2a22649b6576b9a308bc57a1ce178934d08fd6ba4c9210514a9ee6b52fa26dc38de64b1da3e572ec53c97de53edb83fedd96c3623605ce5bbd3a5c0d96ebd87d1caad4a405f6285a21a3c56a968ea8860f659a72a17db7d10034a0d9c2b8c647102306827bd028a0e77ea3091278935352f612c51a285ce1643d8d0ceaadb494bb8a85204cb921dc4a0d55133e68730bae020470bedac4f7c99e3244509969d8f76d65f1573d0ccf1597103af4773209078a2b754041e2e51ecf385669f34686cbab455af52e980d82a1d195b35049958d206bbfc71a5543a8d365b2b913b843c56ab09e3c1c316532ea3db16bbcd70474c2ea35ce45c26840d7b7c23528c1f8f2606b1658b0fae9444ecf22985e00936886991f3282db78ff1a263dbaf433de41356614abdbdba5271adb4777d43a6422f23b044953a77a2b802aa862871a2922c1144ee3686f600c5193aad5918f9847141b2edd3c0201a3551b06890b9258b6dbf02dc7b03a360a574ed1628f06cfbb0ec59a451f38334a3ae0102886d1f68a5645528a28926335430f90206c5a24c0e5d6c602c1973056dcc95e9e2a2483f150a2d516cfb2fd80e7902da324940dbdc0746e4d332edfa11d0b60902daea6accc9a76ddaf557d076f7006d793fbd7cda9d031ae08006b07e44a89410777c44c248d1a40c0ce4de58e165c8ae0c155a7d0668fb1444dbde160bd0364a056d7d3cb8c8a78ddaf553d0564a01dafe9ee4d36a3b95007d6d397ec8a79ddaf581e87b4380beb81a70f2796f0738e10027804ba56d09642121e5496aca1b1c982e50c345165f6c49e82006adfe0f7d990ca06fee032ff9bc4cbb7e01f46d2280be3a1713f9bc4dbbbe09faee06a02fef832ff9bcbb5d5f00fa3e0540df9e11b9047da348d0d757e38a7cdea85d7f047da594f4fdf1f0229f576ad71741df291f1ab47dc9e79d02b7066d4cc927d843833c34e883249f60081a0441833a12e4136cdaf5c91d493b92aecee5011862284185491544e4286f0b1bba00a2b765a90c5a7d240dee3ed020cf45453ec1ddae7fa4c127230df68ac8451a8cf240831fecf209eac8a123c7b844e55b326a9b104bbcd46983c591a6252553743f3051823168f5491c1de0e860060f63d0260731412c65510549ad4b18464c4141c66ecc17b4fa330d4addd0e0af4615f904a5767d0e343845a4431b9d7c8253e10d003ac48d517f031d32c974981b92cf9069d78fe950031d26d9f21936edfa19e87087810e795ae433dcedfa423a7c0a898ac86768ea50ebd017453ec3a850ca860e7f4ff90ca5c2290bb4680b229fe1d4ae4f438b415ac459597da231f9146f9b022ddaa8219f2293d834438bba1c40e4536cdaf581b4b8fbd1220f484b3ec5ddcbe7e5e33a4283235c1570f1050e5b1091d2142617d99d89ba0dc1660a5a7d97169facc8634e3ec5a75d3f6b31ca8a3e5f3ec528514afc5959fd1a59e4539412a7accc56453ec5a97db3321c987ce29b884571ce689b2356008a942bbe80228918286875042586a81923e58a181c0d0c414d69f80d7e5393fcf11b2aab8fb17d63cd334fa937eae337f88d1bd9e8e1383f6c67bc791185c215d98db83798ce681b8b8c4a4627bbfeb5bef3222f3af1141d76f2a270d7c760f06e4a4da2fbbe0a6e72ceed8ae378ac3ef6bdf158c56205e7de348d39d4ae0739b2011823b632b20220c9eb67c6bd170065dcb751602cca9fde4d60635f58f6249bf018e70c83cd2ec62950378fdf493e6954112fb229605894af74196b0c72cb17d6162a6eae1f5b124cb81dc29bbb59c9813f3961a4ee6c09c55099828871a5bb62c7d7448a04abdc103c3cdd11235adeed3d214516514aee9cb11ff02ccf481e3257c7573ae1eae9cc94c1998173a70d996b3273e68b19323f33667477e2f410fd78bea62477c2c844c85a86f7c381cd3e63648f0c939e205b1628bd274e78c078aeb0ce5897267264162e78c064fbd359b9e1ac544143f6c894a12b83c32345d8e23569e1e361081e2ac69e1f9a3a5af0c8595d9d115fe009c3f5fa3189c267e4c9c8a806d784270b1357ab67b5389154ece458a40d2ac911db9320624eaf11a77bc241d93d5d9cf33951240c5e183b343ebed81acbfaf9681082074564178548852ad76b4385ce095f16214ba77b42821373c68b3be30933482c21c63e75ccc1474ea0dba70e25f290814b9b9c3478ce2c8125cfca14bd28708ee0f017650d2f8a163626224c87c589cf49124f46d7cf67270cde1869a68831db158c949b420d0f0a898d8bb8b2fdee20e94dd96c4e38170323da726780a8628bcdc64615e67e7772bd3b5e6c55e0ab73f2e4640b9b1c978d1c0f50e2d8a6b06bca14dc94216c370867b30286af89ad88ca07a5062196968c3378504cc214f1b20405fba6ec33b63445e43da1e58acf0cdcc5bd6943fea2f0ec46255c3f3e9bc5adf961e9b7864a156ba6dcd654608b92e34bd3c5cd48d4f3d9a18227861416a40e8a295e2c6d21f6e03c2705893227056a8ef5f17a65984095a3134507147b3dab86063bfb8cf5ec0ce99511a504176f44ca848d77c696c8a880957b0273515af4f0da34d94f90e9c19aac7e3b16ae89229234118507044b03dbcd41a152daa0a02871848b82a71f9b29b2e8b181a2824d54af091c5b23de9e2da6c38dca659b52842f872f71c6954fe7ba34b8333bc039b3c3ce8b3bda7c371f7850b7dd1c91bc7eafb5d1bb479cfc8c1d010354ab975e54ff55efad558b1cd72ddc21176e1989c024a0a2187ba674e24e9b3b71ee84514922b88789631e2eebcad8258321d1d0508a3a52b192331a713161e5c2205e4ef7494463d750310a151535cce27a71e7d43c64804bf508933b3e9972c5452ed889c2c054159b2a6c72aa6d8a5e5b4f917109c55040718acf9571e752e28a6beae8060b710b3b87829b2eb1448755614d584050d711153721ae51b919e35c2f1e9cb3cfdf4fff6b12dd3434e9856dffa7bcad0359dbb5a3d9cb5a5b62af334a696c1613b2b398d0f51accdd734986af128b35a494bedcbd1cc93275c414bb68c1f06d584bd4430e71c0c1f4fd5624bc69095a5b5a7f6b4f4a29a522766badad16098e24accdb7f3e768a6c1a1bfb3987da796e22d82f7de0bbbf7e612534a29a57484bb2b25a2efbbee7aefbdf75e954bce057128e2f08237d1c48125c438cc81179b79a82ccbd5b85aad58f88622ce8537bc222e5524a9551a34ef0d459cc37704437c2bbd113e0d65b06178712ea437c0af61b8cd5304e1b69512811fde2b44e386b9f08e335c690c8f80de30178276ace06d342b25aaf56e0a86360756304548babd6028e291aa5eb522c1f7f8a5caa808146f0c95304491c6cf432e1a72357164c9f57bb808ce4a988de30df39079d29c87cab25c8dabd58a85592cf14395bbd1ccca4e0d72bde1ffb40ca0b5d65a6b4110bc74bb534bfd7241522152e8887c9f4e5105cdee8029fbd7b3f661688230d891081836db4179f4090cb315b8bce241aa4415ddaf2ba52055a2825489a275157ef5a2d00c5225ca633448951edd41aaf48254e9ed20557c1ea33b48952055e2788cee20557c514e77902a6c76902a3dba835441030b52858dc7e8ee798c6e514e6f09df0dc35c7b43bcd9a4c3ca9a3df6ea2287147bac26b4cbd46357a9d25a6badb5d25a6b6dd59a4327f786e193188813a1283e0ec310fcf0fdc604c46d51af4ab86e9461f07d75d628e802fd4f183eb54645b8b0fec8d3b8881f726155204d5bdaa50ac7b71f850e2c5d52f209dbaff049673df52296e9b8bf5e34be1d4dea4a318c3d6682ae71cbf516a34834149fd216f8d48bc2efe979dab4c117b151698d60a2d02b8825b2bef5359af874c532834e00fad60301fa9629840beb85f83c10cb04d26a6d52d4305cd6b34c20f5562d8822c72c8de9f65dfd5d59bbdbf7dde745746f29115cef7afb3b7e42f879fb030849495a9652dbf5593b6b6e975f57de7a147e1ee85b3f0f64522b63b15824f4f0dabe30dcf27bd8d593b514f2a2d52ff15be913f6d2d447bfde4996f8476ee4f3eb5129d498dfb6d68e297164ceec93f6c800b14ffac6c63ea94fbc5064bc0800dbde3646a8c7c05f99d4633de62984aca42649d10c0a3ae15130c2c1143d24961021c54e1a9acb486dcaaf0a1e9e609943254713cd7386a82d7e6d5ffde5ea59b57d61b87b653a937a43f5a53e6b53dda2a22b15ae612f3a6bbbc442f629c6b6daa517ddd01433b5e92a00629e3c97fea5f475f7bd34046124ad4f99428d61daa4570c35e6b6696bc5f2193788b9961904a4d532835aa690560fab7c97a97abcc2d3e547c3eff3b5195fa351f0355a908dafd1f4d768177c8de672b9de650a71e5d58ba6f8afafc1be46aba046abf135da7f8d667e8d563b6a63ead71ad6f47a6643c7bcd4d03d2cd0473e1afa872ee14bae4053a05328935d60c1cafc3710f9b4bffad5068296fcd215e7a3eb6d8b0d259fe16f93a2cd1ad93954e66fc9b82de1b65f24dbff1499b6df70229388f31799fc455bf8036dbbb7fda9d65a75fbe7c95a86bf5738e5f3407e7c7cfe650a79bd4f65aab9eb7fbd15c40a98339b4245f1f68f599f7a3cec64ba7d532bb33ed1f624c4822468ae6f6921b68aa7272c349f272f187e0fa69cf3d1d6ffd8fff9f919a610c79956884979d4c940ff72195edf7a19b800799941f75bfff3ad9701c80cba66d009af077a20afd6fffc0b08d0fffcfc9832d4df0399d5f77a0bf43f7f565f1b20f3c774108af068b6655a41897c8658143421ad77bd8f1632436502072f5dd05c26978d25cf607bbb3a5a682d938bd51b877cda1f1d2f3aad15d62765ada048f482d7862e3308fc20fb3f2d33087c145aff4369f4821774172a1c1b79019d7cda9ffd51a40ab6bf9df222bcfddec4195f7bfb40a6102ed60402f4334c212d213e35dd4ea7fb20fbb0a7347ff1668d7e7ec6a300f4305306d703fd0c53062e405c56869705d2de7b4ac0912b79b0f8c20a097cf0971904fa9841f783ecbf8cb8cc20d0749fc7fc29cda5cca06bfef0f9206b06a1e0723d0aad7ffd8bd228ad8773c0c4cf668d6a4990b8697a124797c70ccdffdeac910f133f483901161ebe10a1f9db9fbf9df2908ec7dcfeaccca5a9530ea77e3fd1668d5aa20d26daa81dbf4ab6df22dbadf529db9a4ceb5172a1cc62dbd5deaccc8716b97ea92d93b6392bf3efc0885cffb44cb6697c3591edeec1c82491977cda39db7fdf944f2b95eb8b390b6aa09bb60e8ec8f4ff8a4cbf835dbe6fff5a0bbce420e7a008230c304913258c2aecbc09c3802fb868cae2ca162cb0a0d59f1dd97092cfd96ee20636fb9ced333e28d9b5891bd0d41ddb2c937f27c92f3399da2924153ac7dcae4b35194610021078a0031cd840063070010b5040021078400382a8a0800420e00403106000012041c9c7e60142d207461ee4e8e0061100641a607081b661411005337e7c5a3d2b727cd0141f2cf2355a3df2355abd7d8d566bf81aad2af91aad32f91aade2be46ab387c8d569d7c8d56a17c8d5699be46ab3b7c8d56a37c8d36a4da66102282183e00c30b2e68a08593850a4c20022b3880010b4801052007f85100130450c20822d07a84b003e9a848078e1907431bc4321032bf068d0a60402f5766951f12f91aad1af91aadd2f0355a45f2355a4df2355a5df2355ab5e16bb47ac3d768b5c9d768f5c9d7683587afd1aa0ef46b149d9388e413efa05f070d7395c9278c49cf72d0b1247285a27b3cd1474d7275a27fd426ba0429f24971d02bd41b740a47649c76c106cd82cb897c522926bada96e8187268c9279d52a22b2e89ae37a230f9acb71a74cd21d195c9483e2bd34d571d0dbae623f5eb115dab115d7746f25977f5094f1e5297ea90ba84b73ba943ce753d144a079db5d5a66b544d57df549e4157291974fd2d6521ba4e8d40bb4d4e1681f65b08b4e3928ae4d36fbb7e0cda9940a03d67a4fe07b4377940bbce498641fbae03da794879f2e9bb5dff05ed4f1cd0de2b23bba03d6a03da7d404ae4d3a33490010d646034f23232d66f41bb1406b4ff9ef2e9daa72ea0adcde7964f9f62c1022c58200c82b40511a22933840b921c706c8cb8f1859415329e92f4eed0ea57405b0a684b249b48a8a4acf76545eccc90000c000040006316002020100a078522c128c88230cbdb0714800f5e823c664e32190e438118067108054110c3200c43310001ca1882904310bb42015b62e036010840a95f6a204e061467284419ade3947a4f284fa46218609498027332540f54a390bf928b3ca217bb657531a3b60d08535b595b8d84a56f8d12a7d43c3010a9267545ded74867d35186cd3870c10ff848c6966f8758cfcf91bcf11ba9f0bf7a305c55bc301c62f71dedad4a5e3b39b409fcafd7845dccdeb75f8b06c8b202e6a41598326b1667b4bc5c852ab311798674d32b03e4a41db59c3c439a9467441898bc054649331f80206635c6b756cb33a15bc4510f1f928447b08a1be42f16213c129fed0534f2cf0794fdd817a4dd1b7644fea76d8170c7e2202e5ca09ce2c25c9ec9ed167c3c71819972d05472db590b39ca517996e83798186b7325587371f76eb914eb828bace167039f0be62fdddf9bac786aa310eb35cd7c8a7cf117b440328b885b93ae1a4a5fb88cc4e0458def869e137a3bff8227baed4ced9f7603311ae7b8415104b444db4461be7d7003915ba95e5d8ef28b6b85d53804360cad98e0d2ff65276f3ec138768323314992f0b2f77cd91b79db581b7ac2e87146b4999fe20e2c994ae993ed4603cb699afe0ce54010f175b74d8adc8c1dc7bd14ce47694874ec744011fcbe80936fcfdea719d0299781f6dc0b996d601d38431011c7048a1d0d56715c321047eb3f10a17419e288b7d9be789c5f31d0292704a0d46920e734078a4e0ca864f027c7b97726631339c57d3a2ccb61a43f82b8a0dbfa0221719609e6644717bb51d8eb786563534080d9125200c31dad7a678a7ddeea585aea61b5a1e38c1d33c3710686fb9c643c85355a129af5eb95f0637d9d96cc476d0c98fbd6480ed8ca2427c28ad9e9d33a159827f30c699fa09c9f10dd24b5667c02742b870542ae5842a8d0241659caf0899a8ac485c269d49ee4cce0756152bc8e48ec2d20bb1967d72a71e90cd87d0f768e23d4f58c60b864b08d9c39d201b28e3920089c58b830737f4f624cb8503b419990b1c693e0429b5ecb312f358b7499f7a193e803910a7466f19a68f81af33ae9cb22e522a75b937ad36060d763430a048c554ee703103cdd55848f17b329541be4ab80cd5f45c4aece8c25a0592824071c4eccc08a6947fd39ad3e0a57ae44fb3ccf91164acb5218a5e2042b5b652cb21bb23f686b4efdfd711fca556588cc5d9bf710ee94b0def866293b44a82a0f52732a429f0edc7e30a7c3a52ad24373f706c6213c7ddd4400ab59311cbfa6986ff61166555a06ee61898bd5660d81eccf74784ec899577143fafc45fa20faa2745f0bd2aad77b37c606b28208ac05f8822d4e690ad66bb520f712130b2d08b6988d5ab13ef24cc447d278b37e3d4af641d1f003e8ff035f4b9bb4744bdd8e97b87afbcb39f04fd3d55580716152b02334c03cb687a70b00aba18a855f00ce1f315c1c6601db17a2f04e5adbcc11aab39ca6f5d2ba3ed0990efe5fe0e67872b60aa03e20fb82622658361db207ab42680245ae55baf4e27deeee2ec5b2622a440d98d4c288960b3b02d6f6089d01ea0a5db0288241586cbb05197e26b4aa7908bf399c7e252504f149bf9142b2844c8a8e3126e5b72bd9977623d821a628ea62b7c803c414d1bb2ec6d127271247ae9893465b88631d2a4d0c7e1707a25facd819b3e0e24b09e80b411193e5c1e7c3af725c464b3e7b2141f5c3340c9e3961b923e0295ad5f46c7743d555a28a53a7ea20942d9fcdcef1c4af0631bb1f9a87eea49f072620a36354dca697e88be8cb14f613fe4d86853f67097887f021b5f71882589b7fb12d44fe89efa6faac460c6437d440595013653a15116f312c04690bf08f7ae5833a83a405c297cbbeb851aab3bd30247f45952200f42a2e870622f44921de7fc0f236358c6e3c0e2ebf11a32799f643f210c040eb8580c090fc8c1db507c179e28a221784571da3aaaf2ce4d9b66fde6cb9e9df5fb471426fa8238f84fa6244ade99cf0a688409b205c4de40d61d77d0ac2b62abc42df8d2ab6c75d75d195e7c6688f3756f20d82128038666efe02866a77563742fd5f7d7f9d793f041304e7c3f078ae375c55a128dce8f92076c849818c7c7c6a2861e614aef1cf7543d81f4e87b3a94ede91977e3ee2aabefd667b9a8410b728148b56e78f60c7389aff8dec07abddc8f3d0a6175803efe67e983a031ad3f9c56952ce1379404e5e3c1d16d91fcc83ea7273d43ebad164584984d66e80ad74e9809eeec7bfd12f0bf23620839bbbd4b5bb0b107d87a036c4a4ec261d12eec785654894876cf9b9a74b546cabd2118cf3e7445fd3f45bf352423aa59b9e98d2955386142f63489e8e8680546f021b92bbc4645c2caded39091b29955aef87cf6ccc5cac12fc05d18de675c572a51c0e8cb84c6ceb7bba0c0a4ace782ecd7b511b292a5cb700f1c739a81235b06ec18a38cb31c11c78001f13cb726477ed645bfdd53cc6d5d8dc7d375ff568c5485ec5fcbbb74d8bbd9bf2ede731bb414e758b88dcd44208be9cf6798010092c431c2441b60106bcc8b660fae0b2dd4b061010692aabf9698877e7b016028143188045a47194ad61ad423faa29a1889dca187b1783385d2651d0bd4cbb75d37a34c4ebd6367622aef62fc11fb901ef9ec12d4b4e193992e83bb3f3c7e730a15daf2b56a876195dcd32da7c522e54aa4fff21d94f8abab4cb96f992f3bb4ab02114c6605854aca0cb63aac50d369d1c93034c30d91a324c5cdc214cdbf4896151b277e200ca23cfe6fda46d599609057be7ed4a474f4d4eaaa859da469e1656d740457469860d8f8e33f07f34939dcb9a0f74721f6d9dfa5fc688ab1135efb31bc3c41c1cc10ccc667458ed152dd6be75c2f3510170d3548a52af3bfb2dc01f016a03f253c5d28460539ec6cd5bae0735c1f2750016c48894eb32bbd48ea7ef26069b28b408fcf83aad0e7d50d5674710c22f3c9a62672829f84c00230615f1332c30246db12d87a373130ed56bc5115228b6690c058c59fe18359f34e2d331e23c01aa5fae6d6f171851d27e890c8da9cf3ea843508f1b3080f6bfd8c5e542ad9055172cc967ca1c4c9f6e52bc049fae4f45eacc3be8b60f4975b330c57b7d4fcd379d98955abbc100926c4888c4d34808d968cfdcc008f7e720fee95fe7a5198f763b0150a01ffceb3809e42db89a9d2abdcb6485ecf8a6123c05a8c5199aa331e31df07b45088ef8a58f97b9b98502971d061b12d38100a1a495cca4dcb0e4b198901b9a4a3e378630ba397d2a4001053500281c688818bfa5231025f6abe5f72554c22d674414db13dd6cda0fd4e08b6a573fd5c0d3543a3806c914cf80a2b158dd8885d74ded1de101d5e1276d5d7681c0f14ebb13dabcf94d6bf243fc3cc81e96305dd7f1a417266250283637b322d183665368c3884417ee51ebca205ffb7597af97efce63b11a8f2ade570ee82e4558c8c94778423e00d60ecac26edb55da75de82890f1007faa055ce16bb05abc3b32ed4ba498090b63390576ba0aaa7aa8e2666fa0644368fc1b297fb1e26c9c3ad12b853cec25106fc12ff42cb505e1a8ddfb647ff1f9c4440cdfe66bde51f45b5777ac130f30a8aa9f023420c0f74303291a7679278581c1d98c720091e9ab9c4c360d0401e8c5ce0d1cc643e1b4e03e03024624fc324f1b0381a308741127dbcae80432a596a85776007b2ae65cedc002651c71515583f2bcb81c0677beadb31cae4d203fd8c6cecd74d481e03460fe06024045fc724f730303a108f4716783413899fc1a001383899c0af99907c168faba1df77e22e02d5de8c68f15c72fa411b6b9fca614625bdf40ca7c6760f14b2b479b6b7231c3370664fc5e665dbf29cc268606ee5409c1bf1c474111347ea998215806f871dde20c3e5a90ca9570aaee3ff2997da0132b9b9d5b9880003b93ce4993d34546db5f580dfe781bae1013b63082d00c4a471b3b115d0452f21fc016fb1786e625e10ac58ed0950b1c10e79fc80b5bd9514d78ca308988518d89f3f20a3ee11e8ae30f4a6990bcf432480746d2cb03c1b9dd8cf76750628cce4257804dbb9b69a0872659e8608c08243475c871ddaee83b5d200a4975bb9b2a582d42520ed049aa6e585819a5f2f28a208763dcfa9e2e06951093a4e405c8b280109eda27ca3174e15ebd5795732b3b6cd94cef8e501a889413406f9de7685f3018f5eefea027151640b2034b77c0c55536c93ca4f14629ce464d673cea1759cb5f5c556618bb18300347583355bca0588ccd06ed4899bc770dadeb61864ee069f602fcfb263d0c32269a014bb07e30a0ca0ba6e0d0e7f7f6c0bd7d60e15daaa7e6d9d0a6b746229ab61d7dcf26b534df4ec56fbb9a67a481b3a48fb7a3f9d573703ae2ca7a87602abe837cc513856696eb0aa5bcc1857d741081a742dfa0704474cfdbe8389bbe64217d413d722a62701aacbf354f225534af432776d735d352fc9781d138617c5a4c725d5eccb6659ae957d05ee6a432d0ce56bc9176ab75df811534c37c26e0e020601f42c0088358dd50e910752c51e0f0448c6e159e5cf4e11b909c2dae75ad57252aeeea4d06cf325e7431974ad6712815c7fb5325cd57dc5664fb2120d50fda10b7adf5e25063c4672df131a8ee816d1df13acd591b7652cfb2f2dca335a42739a7fe816e34b3fb335de87366bb0faa68b23df335c713c986862477b13dd62eb4d62bbe607a69c62f7093a382c14eb425bb85d0d0b2e60f9e76946848c5599c2cfcf087dc12ec91857f3ea57f2f52812f21853fcbf2021b4765bc5f9ac8b1a76657da22daafa246e77e0e79b0613ff03364e7cb3aeaa954f2f8bca9915f561ce28f9e3d9ac8c09145863052aa724215c58f0e785469715a3bf5392f5ef1ab610cf5ebef68aaa857f9e0a1814be4b8822b86b60d9503a360955b4710fda7e1a276850ef2f2f35e1c6a3dbe5f4040db7edcc355f6d873e22d8d8a71a33c08c60ca4b4d713b8c4af385f7b4c2b4cb172706023762180868d3c656b4b8770497ad22080c1f07d3c5bd7f68962956bf76b3566262152c44a6dc4f3bf713f4c0e0541a66024ec48573dada30cb858b135bf1ea5247bff4136ecc822df10cf0e950d90deb540eebc399f2bb12b13b4315eb4192bcb083728244e46bbd5c42a7343af0e3302a89bf6e39599343c22b2767f7745600d6250dab84ea86e22a178c30a9051b8265716e1f71927d6686a178d8c54b87a6951180e6f102e1c7b335cd9d8429004980bbcfed102e4e418a2e4dfe52853f7f6df7fdc2941c8b3f4902fc6e300d4d65e02c0892163a48f39c2d9c5300822db79b15127dcad0a8ab51a616dd061db3a59f966886777c4bb2bc3cb4690449d17bfc6c5ae08e5f144bdc23fed84dc97d5041d6b3b66f375392f7f1c92b792f9d99c7556d7e97b38d1189fda95eb0a5d60f8f8507d8a75455b483923922c0584a66b0bac287cfa48cfa4dd1a78d2b3ba6cadeb37d849168cc68662cbeefe9c1836356defb678b822e5f1d285dfc5635fca530048b456ff5d815ed9ef5523da78973d12266c859de450aaa3b78e85724ef6336297189a83f49078b14241fad9516ffa3aeccfd2ebde473076a0459f049959f44f02f3263f681df0b71c01660154d55749dba9b069644fdc672a40ce3bd0f21e1f547e9bf0e4af7ca03b4b4d36a99f2affdac210a02111123b411f4cfc586dda8391e82c8443f386050b478bcc4f90f5813f18964f499161980686c35eaed15ec7fd68d1c5794eee3120b2bc40936863ef47622025be40d02f0b755d038dc22029867523f93fc83340eaea350d8da8de9da27e847fe055f7121e4127d430ff05b1a3fe89b79f530ac4aa8fa5db3c996ae376783589001447cfc30b95fd7af24d3786a9139d8a6ed40df05b1d56fa3af58e413cff6eaef8f3d6863be1be2bcd6a08048a474444304050a43e752c926e6e8fc06b6ed9ed58b4cf2263018e7dcf71088c47a50adb483eba778db623e007f761df8d06c05f61f720bbcf701f31b744072a0d7edcd0be23eac1dc8ebc6d8c7a6f63a37755b1eda84745eba8fb6ff66379e04ab4b4c55951dd5804d4610719aaf81492ec9125577fd748ee71c29802d48822d2bc80c03826b0f000126a851325ffa4c876712303af76aa353451bc55027014b95fdd06fea3ff418d7419c8630c7af027780e7cc165006a343574fe89c97dc1309c0e2f4eb9063c1dabbba3995f3de9b32e75d6fc7823e78bc211c3f4d1a8387bdc66118184011a41f41d87552ee5d60f0cccdd04670bd628e5f97ceeea945b05b740f238b2dc52ad8f15256547759b01788a05b72d7afa301461da7d77374a8517de61e0f14902ae659da3f64dc2219e0374007766baf7ea32b3c6020c38034846441fa221478c6fe47fa110fdf62f27457b7f20c0024d85183038691c73b3f30c7c014ac5ce22a00ba525600aedf088485fc26e8c06ea9184f90dd9e78891d6770760f201687f091f6718998b3449eaa500951b7274ad40d98d210bf27c933c56f14107dba65122b397b1f446055faff5398c84eb34633b534063e7a0769e09898b3532affc350cfdc8b2600377000cc5b74d141d00a9d3e20cb3d3128c7801b3d589c68ec099c3fe74a0439f0271e7ac544bcc7c36e208d90abca0b1dd870a28fed3934c37dd0efd67f119045525f7fb46243819e1e98083ed7b414d413218b3b109505b08185c391308322e9805d832889c56163534647d16a07c5d26122974c901f6805f5f62c0ec418a1864113506004ac079c4344168209c1ae56ab59112e96183d588cfa7c2f3459a901f323370084413a08b4f64c5eb5fc29176900c8c1c8c1180e7509e9862e2b021914b3eb6ab96fc7ba0b1c415000eb7420917bf79dea14b3b7480dd88dc5136163af0776e023455d25ddb4ee2c78d826c33b92d515d4ab896fbad51042a0db06fc092524fe78c3c1a5ce56b06c852def1002252bce74a1faebd231dc5385be8e9530702025cd0ad4920d03c76b382fa0081cbea2ff27b3e8876f4743c4edc8e3b845747674fa533c9d3eea5cea1f83860aacd4b9a3ea7bb7e8f7689d0dcb04cbc306c94813c8a3e049a0bf1a29f53a3044996651a2088d3752a0de9f6a869c6a0ce8ca614e30afafa34f75703bc1d14566dd576897d83b7998cbe14c5907a35c9e8937551805a7f04435cc21a1db21f38e6e38e3e8a1b123744e80752a0c0b8e043252ee51917e03399047d69c9116996dc2612004cc0352a234dd2c95761f8a147a8fc5f159a5545c922e922d30e5218258a8131c032290c743f13c5329351722903b9e00a7bd6b926527121991cdb292241d86649847aa39b3512ca4848f01c922d84e38069116690bc131084a152e6bac40d3027d334b38069218616bbc956f95a274d956d92d50915496ea32b6654502b6bc4552592ab84edd634fef123b9fab6adeaab75ad62e49141984671849116c83290f11c28e8a703010813c1e8be789ea525c246288ca89808aacda8afa2a00469a74558d8f21f3bfc80b20d15184854a4c7d89b452eb2e44208f50391128d1c406a90cf86cfd116c5d227279c0ac93075fc80e9a85ad388e0b8f55f36a7a40c0686000e216c89a021a37bc3a282d6e8a3d67b95af9a0789f66f6bcb0a780deee382ea739b22521c15673fc0639a601cbb5bb4970237d0dff333d40c9c29bcb5a978da22af0d8084806d4312d8028dea5b62d5a738179117fdf7e232026fa7ac8446e5c8be5e5632bc3c0e797ae62173be0a55f5c4168e896c2c7519ae1a0bb386084c96a0b2f0df6cc9d91155464aa37117d4d4c5f919d16eff169074ad7d141dfd499089b18da19bfe29a661a9cd894cfbd248edc073a9473292a77b1f091a956a65fd326491b74e93c1a3b318f15252dfa79d15f9445330e803dd30a731facc0d48802e034d552bdd8fd42865eb6c0cb0c48ab00a5c1df244397c87fb1f4b4ccf62222b913f5b20385165ed11e8e684e2d305074f199255c939e40f33f0ff4b761aa26d4929a57126198242b9fa81d1665fea7737cbc5963a8db403afe1058988ebab557e85d4d86b4c3c35737800440f7a31ec1858728fa948673e43465f6a8739a9a12ce01a1e99213b5340865ec45ab7c4ddb9fa5ed75cb010ebb3f5524a025845e845c32ec6ff8024b3e04f16e306078f270ed5318251a26da9117a94b5e792ab2de3feb5d28ed10fda5c0bfaaad63988f58a9d0e9ad693e0400dc8a545fa4075d4a38f52fd0e125e17ed0e0c0a1d4c91c4ccea6ed519ccf186257549d590e906f782086d2e611ae6e68e3839f7697e2b035d32e41f61b8fbc0f65cc00895980109fe1c878ed3d596b89eadb89be47a23c9d5389993631d632820b231283244eacccd97622414b4bea1e97ae80d9f14ca7f36afa3bbfa61dc6dd8b1189c3b978bf24906c3a42395572c98978e56a6dcfafad3ff6b8cab3312dbf861ef53ad7245a72fc2dff9a594bddaf5e908b2a7dc4c4ce03b450373db177dd17f78950874aef1fcf514e430fa0b8be72dad001435eccbf05242c5e830fac0e3ab91ad9823439ea048be000a0f781216df6fbb4415e1d47a6e179352b72e2945080c499575b3223ab35d7c07157bf29c41e4dfb2a42ca335bea19761998b9bd9fa6e128529216bfcf668e39e40b64a5608563ef5b73e98e1b1a8e400726cb2a140e3fab65d74204721768eaa31fd9608b71643cefdd2e216cb0a56781064575882d7021ac09969e1de74587d29f8dec895589c2d155bbd6519ae4861f2cff6a086e675d71e2850e17c61884709d47bb2035cae0000301029975a5f7b3478d381c11cf3f22c636af15045d5237a9d469d88c90af483b11d52efd0d0cb36e6d204fc372cbec74a6a5456eaefa27a607d0b8a936416e2d6c26321f0be9003b0dc0737c2c05deeeefdccd5b6649246068ebe8820281fd5805070e0996c57117a9e0b5830b3313eb950d0c12b684f6759ecb39ce6aa6c04535c79ed68ccce93457190df8df7dd38b09727b43b76c6a9c2557b4888417d83282c16bdf9a119b313ce60269bcf34666e57d4ffe1dfeea6bf689bd7132ad1249fb633219d1eb245910cb26ec9c532a4a61cd2d7160a11747d96d3094e444b90ee7b7f28a8163e2c8f50cb8ac3d681a1ceaedf0fc5d174344a31966481608c82bc2901d3d3f2d20a8f6264dbb2ec762d86a00ca57539ca37a4f8f787f644bb3d3c2edb257f875938461ad49203fcbf05621ddc0192d270ead7a1d4627e6494c3d77250eaec4526857944c383f3ba15e3f63dd5d5b9b2ca828c96028a5bfc822346b2367420ad543d442befac6b0b611534f99d39a8de7e1988f8dd10a0ae3a07df85cb8b8441a67ee3b3cf8c04959633903a8c216dddb62e7f411e721b430b674ddcae850148b2d7b44a04a1285e402688790f162e4743304b2c3203a7822a0b797d3ab3f8f68087e2c6fdbe95b41f5e2689aa0bee9ed2462bb089e61f3776b9c5c6b03da1c157266745e3656c4c3aa024c1668252294204cecca7e597673496093132935517891a64e5b0e9c4ea06dc336fd7155ca993ed1c79a65dd8c39cc6afae92ebbd3623d4942a0e498cad8d208e045481f03da89cf22d2db87f86e91a3ba79817f000f22ef74c3dca748686a3c47dfeb2b4a251429869231c834ff269a27c7d82009c72f853058f4df0d11757b22043adf54f6ecbffa5859add2d078264f6f7680819f1d11b7da17d762a6e4c150d1b878dd9007838ca211a14981612bad98177459c0fd3de578ca78d44169e311e8c5209a6f3c8a0cc4208227b85a7ded82630f9aceba4ed2265e73f6c2bbfa5ae912f96ae65a6ebcda38c3d8e4d86e1abd76e85db9878a066f45b8074dd52a8df694d0fb4aaac292a793803156fa39b0045e086d71a7f97103852e625835a1c6fc9530b704801ed4e5fd150a841b2648b498bcd691bb91f1f3baf775c7d7c3e8bd2c13ab0e983a1ec26732b62a0a944925ee8a499a386776a3801f8ae96aa53d5d982aaf366a61bd70365253a65067fca96a9129a1770bc129f80847f647c0b447720157ed49f35b3a8a6d8529b5f7269a2a139b0341452eab0b4ef6a4266f660c7d6ee2c90e5320f74071506f6bef933211a5792e731da5484227d224b2c574a2c19141b5628a13e78fb278f79140535ece17cad967a966a1235dad584d6c14f2eb749d83d921234eb40b276c667ba51339dbd4fb574693c8eaa1d4b41f238411be818a0bea8037cfea631db04f5b62ef36b37dc074fa72ed1935293c0f846d02855d01037a2f93952a137bed4774ada8b996c74f224a35aaf743464c69b0b7c5a0847b5eac51f4f65bb81c3971521c153cb5f1ef8fe8048fa2d188af22de9f8e332da0149e8601850eba633500c84f284314ac3c8f5ac41808d41509b8a64d41f653dc14fd3faea739ac260253b8af7b502178c7fad6c486de69f040035d7b68731ffbf38c70ccc9e1f9ecdbebee0d3dc360b94d0067aa5da63def22dc71a4c5edcf3bfa5c806f3622d41cd770a2d388c8a7bb95c98349931958bdb81e1a4db06acd4730be2b1b75a37d4549390a5632b3ac0222563635863e2621c0890387604c7310d1881d5a77cc2b1ebe24c30674bbf41ba7cd7c9ed06c2176e3923d66b157fe332daa04e0f9ef25e9b82026dfef61c414616d5c54ec5884128c6d0728cacf439bf2458246e07306dc28003b5b9366ef81beb5f82d938491c5e5cbdb08156501dc32e6675e4a381b9f12417a399e08017288d1d10ff34057b0acadd01cc57a01a8d5837178a9d8971851abfd6a54921d7290748c161f70399992308e2a4d198b8572d623f6646cfd1812c43b432ec5b124e7d9c6f5cb328aa264152e223e022cb46ec683226210a31d6da5f3fa4aa3e542803f5baaa5327c278cff7c2f6a5b5c400fb650d636badcf649735259cb0799afb6fdfa3ec4107070d98efcf6ad2d407ff350eea0edff5a4caca6d160c85a9c27f084c5d8a84bd909bd17fed361a28b684cdf9511d0b3685a4b589d0bc00c843d172a17b1634e3164d882d5921b1b7dfa2169801272629b0c3153334b2bd58e6c92e365819647edfb279753e7491276fde7151e9802fa0a5b854af2db76df033be86ce9538c7f9fa7af5e9f1ebdfd5c2a525f1535b15de59e550b53ed7a9a978cd35f91040c23c89e95510c5038c9755bca50f9b42da239e57faf83a07d9270bd3e89f892a127e9d81d416b9e9cca4014b4a096ddadf1f856876b456ca9700ecca25a446742d529845d7b1cd823f898f81482c30de69aa50de0141c2143a6446faa4e80f866e53dcfc5bc20545d739da3efd5187e2db7225dec900c77606ede6d6a55b4651843289fae12e147256168ca5d3be3f95ac230af79a43b1f7f6a9d2663606b02b8e27cea9ba751601590dae9f1a267605894af65150327f792ec9d45347a2503f8784883cca0198a62b133b639e8001501f9b1cab1b0641941d51db3675d0a681387c70aad86ee6400450729216db5d487178edc69344b585f9dd0afbfaad989a3e93b77cb002dbae00e55a34fd7eddfbbb280cdb248fcf915409ee988c66c6318fda8182f55e761011e9a456c6644cdf98a88d9636c7bfa6c480f517e77b07a0ee36e1fc25cd114e6a926110eb143684d2a3093c0461492176f7d51050b31d1427e98b20717d0624e9768db30e60b84017582c8f047b408536f29e999fba3a073b3c000be6b7a707f3842b1cd27ff5e4b9abfdb5f0b3130521bb58d0e70592bec8d82a88076d1cd03a65087ba226591e956ddbea8c576108b3f5984bbdd88124b19568f4d9084776252ffc63a5fbc630d806caa3ddd2f604be83485c85745f4104c4b8e01daa445db2782a35bfed9906c077961acedf3fd3500f253c90f630db432860e0ccba159622e4237b6052e7bebcd71226e307b030cda28b83d21abd2493537b2e467977aab6d472e2f8816838ee59878fd661396047c33a1d6f9685bcf7011ddc14362f13a3656b8a1ade31b264e258aa10dc48d368fb5b17da0526bb0e3204a8f3661153009bd94cce391ea213ee9708e648410582e459948b886c5b8b048301d3e76e188e0d0603fcfa3e44070c3b086611b715bc210a80fa4446487fcf0387dbb56f28e41b87045d40dc3f8fbb6a10f87b4f1ac7fa4b3cb91aa0c80c1a9dce17c0ccbfc7785063f0210c4d5c4bd6f15d93bfc574ed71679abad93aa7ce42265a51f55f503ff67bf2cf1cf5f5db200c5e5b87a3c88c130b05345357047679356ca12a5884e21bfa42bf82d13e5a507cf84bc55efc69c68c09fe8b8db46f9bff2c3efc3860b18b4c0e615c0991516d162d9ec46f9feab41d5370b895b82462565d7deb939aa19f98912de37d232bc86ed369a901d91a7153602d936cfc449c439e6f2fd45f97ec87ed94c2c6d275f7e711a97474ce245c3e403fdbe859913801f1d6b880069ce844f27d0278ee691895be5a33212e22d9e3c8fb6a75dbefc38ebf7d4a91d4be7041dfb0614f89b4bcef8ffdc2cd2db62372330164f149eae57014b0e58b90c2c5ea4a362b3217debc8a91be731db8e6ff00ec6d2451ad5588784ef8287b5f52301b99e94520e398ef659f0eacec29ad83c3894dc41718c5832c6b360962b612ad42ef7fd91e0e9fbf88a53d7673024ee97e1ca17a47b83632b7fa8c4cbfc08c25f0a5b9f493f00ae3dbeb11dd94bbd22ee50a6d904b2063339a77f0e9b75ac1d93cabe400e0b5afbcbead0446b2fe6b526acb7b0c51a8e7291756b93dea28ebf5da9901da345cffc9aec2945a199574571aaaecc6ff93a78150646bd2ac6650b356611555d84e7f75e5518712fc301ca9954c868d1586e54b9a8b70f42bcc975d616e7a336a46282d0ae1c6dca5f424802a4dbdc2d5c7bd9462ce4fb4807feb217aa0288ceb1527fd808f15e2b5b01af246e6f00c996abc215a664c7e1a7ca209e60b0f4c88f495464a0cba22e79c701b9ef5fef8bff7a0eef470cd178b8cedb0832112f844ae39931866650f36802025e43e01447f830f9c249d0cbcc3686dc4961451bee857ec5f4c5c394e87eedd4d9fb4af8b8c876a731ccf7ee3419202d461e214770f6fcfb41059356736e9119df1a7936791c6d3a90458043046f93d9244950232aad0adca5550722e03263cd4c8558562d7e6b7798c1a532f7c3c5d447ee695865fcbe3602a3f3e6340fa0d1671d2e431a73ddbcb99fcc6c00d5979f2f6e841fab51b279bb7aa5b45710460e4836a34827240d250ae7f90a7d6b8465f0125316411eea11ccb9495efc0fa48b39e1a606362b242643be67bc4203bb2e0e7209a43ec1776f89e836507d94d94665f80d545e162a12f166146f9e9508e1923096341bb3f29d54ba01924a09af5db6965550a74af6199667578fc8963bf5d707d55c78993a2f2e73925a0d15e808e1508eb6da19fd185f4fce2d2f85736e782c7fe04c0519a12b28afbe1aa080f3101fb2cac6a26ce0f2b56cc7f6923524efcd21c131f53af4440fcb7da299ae8349e881687c8b101cf1312dc9302a3d7ea711d6bceb15ef8ac3a22406052796dd29af471d3646557e20542faa295aa6761315266f8ccf886ba9130600eb231de82252d2646aeaedbb93493b41363b03648e2636bb94d03a29b37a81efe2a8349803c77d45da2e7ef0d5fc8fe6f46df9a8244280cbc70e8c4b4fc7b5475285556a5ab1c9eed6d368f1dbb191ff1d78a7890263a0c668b9f53db93636b09159f3701acc922e94321e5bdf23a63fe98ceff37a99213bddc773811991188c998e35d6a3d5254d83bf597872d8923f23acee59d5d2a5becef6854c28722bd85e34f8b486f0a9b713da41f87907daa84190e456138495a9fa9632785de8983bfbb18b94865156c69d1f5a20af13109cf437e2882687994c78c25e5ae04e1d5284a2e8d2c1c9fba511dd8989d551ad462547666df90669bcdc222e34441c875c19026b3b91fdea69e377dabdcdfeccae0c983becd20d234191d89162b2aa8c5669d9c02e9c5a8323704891eb0e180a29bb984bec177ac9bf1f46984f5cb89916990a5208e4435fd3916a650d7f5bc4eec8efbb260b54acaf690f5dc2cdb70ab7cc6de583cf47c1b5c82ed9110ca65f415d74b1a6af15cced849a9c20af1ed7652ff78d411392056807ff443c2239e0adbdf31358002a99f8ce8e84cbee5034a9b4c389db155cd1b3366623f0c2504022ef0b84e77c1d2cd07dbc98d04cafaa4842a29529c6dde9183daca6dc6d625d7aecc551eb6dc687902b5c7033ca96e020f43938395d86d350f01bf1835e19b8e43e99bfa1b43129b7c89084362305f1a56f7178219363713417ab710bacffa8b08457abef4140d61460089493fab55791546410a627205f37731e3db71cde4df48958f5eb54f11b17011dc9615582ad1f0d5cc2ec418020068b92e2c7ff3e89973326979723f620e95ca447b965d689cd6f9634c9e4ea43e9881393f2d72baadab034c9f9264aee349f40e9eb7253072e234ecc1992a3f15f14072fb08c5a001e2090c7672e6bcc2c595e115b69bd4f9d89aafb3cca0152628a223e1535c9252ec23efcf0cc5ebccf457071c43c2d1ae1610568151c7b56f86d5c42ee3da388afcd17a74bae1d70cc4da1a7bc834d9a694dc1bbd0c1a7c15c3612aff160342a4ccdd05360df72264337040919dc4f845956c8f63e105a76d2d737528f0d4930745714fb3ff144dd25741c0212f67b4e067e72d1d9302640b95196f469acce7a939313749e054a855f3442594bf53c836a5c56e3cc00833c4c94557bde351c3d2a70559886ce9ed75aa1be5710465c9df23d5b8a13c6ac57cd9c42291a98e3a57a3c7e081bfc7287a7d18f8266b781b21c6fa03fb04029e985a1be1b0eb5a09d67275a886e37a7853f421567ca923f6258ccd4ac919d24a328d063c135c3e50a4315d5715da360466ffe9a69cc109bd291ef357cf81adc620fc2899f6f6f5841eb3ca05acde8b3635eacd6609f5c89d74b0415f09a80f41869ddab68cb02a404ce0a695b6e8d1f4322afa827a74795ba617aa426c8a9527ca909cd98e28464777c4b5f2b849bb155c11d50cde855fc751d52e147e63d346cad7542f7a194086d5c4e535082bf39a7a29b13b4830ca584add2c7019f68fa7aaa75a5e251e69a727b8042679bb7cdde27b563b4665c3a8b759fba395426765f60ceb4208372c21cdbda721b66e2495f9e20cdd5a30e6b8cc2a5b52edddc88660cdd3b85bf0d38c7806cab2df1cff63091f8028c72c600a998f566ce9eb1cf8b82c7251c6b357f53627706484cf14db79965f22b694d524474f56925af61e23e6bb09e44adc55567938267ef298e5d95c36b10f4c994330f6f35ee78ea2ab3f14317bc727354b07d507bb21c2d9eb2fc034936e899a4c5d55153988db7cda3dae2175d02c3bb2d62118e4f85d95ce84ed59ea7798b9da96c2d75b4a409475bcb589bf708171e1b2bed3b39121cba760ac86cb71b7e77e7d98f9cff50bedac08cb6515039433af31a5f82cbfad4760298d3542eb7e74e36a5515d4b6d6dd394acc50824330af40290da798794f2e788e7823e00a2c8989ba20511d535ad9ed8d04ef4bf9147443e844239c6a980bbb8dfeef951d86b1de53c479bb905d1b025ac6ecd36846152192b74b0e7eb9a177702c4db9f6204b9deebeddb0934ba69ea2b8ecb1d0e164f43739150e49a82dcc1679d0c2750b773e0df524d869207de0e8c2351498eba4a40f6cc188081bed89cc60d3a6a8ff833a8f17653e6ed8b1481532e573bf969a88d4308ec70b771bf141366775f8895a39a5775bada41e08191e7193842312688eee409b8fb74b482ade170fb9dc0f5fed190cc22c25ef323d4db747a4246082c2afed4a8dc0d40d990fd9d8032f5e602fa6f770acf303304f7eed0fbf97750994ff43b1b56134357ec383b184fa7ed58829d1832bb836231c4fd8845907c2e80c9d1404144a3774addd817ccc98fa0375068f4ee40259f606b7e688c4830ae6afb676d157045701a7d89c702098567131ce7e794fc15d0b236a0883e17e18b8d341d4ea63fe7c8e590f02d902c0b54725ce03b1853caf9d43e54c5ca3be51df793185d093444043811656786577a66478676ecb05c3de50543c53313541491fbaab67f65738588af9f66e53c53e086749de1b007e51f52bc496dc77648279a2e8bae1782007407ada075552db63f3d524f367ac3477901c0277ee0e0dd0b741af8c4efafc7654f0e9be624aecfd160982afce0f11c459416ffa6b159272778fc5ac7e37eb9c6ded9112404ec7598f972659acb5e5d0e9b62f5c9058aaa458730eaa922aa0ca35d6e04a853b18b226781f9498e7aaff7eea795d07bd5dceb309bd73d6a7fd0454f6a32f4a033f1495e7c17f428ed4d7914e2aa22c722c9d05a070b04a0f25ed2e5ce59f7050a39db8e95dc1e795faed98ee17e3b9276d2036bdd44bba9aa1f33f1d21936d7aa4c8b28b9f9afa42330d9b36ebb842ccb21423c949ada1d47b2589f7c73d6d8157387551c175e0d85cd02fc4348f7c32bd1966349db6532242b029dd31062c00184cd72cc36a385bd5bcb68f66f0e4b357542614f2b4b3f225ef9078365672e5eede044fa728c6569200e3dae2d25e09d48bc1c0b20d56b9065eb680dc82a578fa571ce5621a2e54029bdd75244b271c3c42e51b3fd4b559926c04953c11e4008b54e3ed77ef35209c68eca26227bd8522d8587f2f94ac3437039146308671d6e0ddf391baec95ed9f9204d941d98a403fce4e6e2515e76ed3c6ebe3dc85e76425f03ba54ce73c110fd5e4a0c410efa594764416dde52d63f0ab71d7f76afc74301db3540f3df9124dabc8bc71cc79d4936a9555e279d763364bea078a7b967f1a1cb16f22af0381fb8490398760a891104969d555cd1c804857c3c60fe0ec511c43c9043fc9c49e73ca74c8ef37d9a43253627c86940b2061b7757b0563e1dd9cc42de30c8246f072cc512158c845173813b6c33f4cf3250efd85750ca61ea461da68762e404255011cfeb08c374c1cfdb8db8fe0f985501fb5384843ba847d65b901be4910519e612d30024a19985ee5f9a34f559a37d4b281f0f6dbfcc8d449ca18d6cf44ec5b0bc541c1a92a52354d641d5bed9ac8c5ac67a6cb6bf458ee414ca181ce7b2585a6d3da7e1199073fb17aec93c4d7e475bf1ff39a3619d1fb9876b98704991ece598f4ecb528bfdbcc61457744654d453275b98a63b7402c4f6126dd8ab41cbafe7e44a47de782827634421a6127a3ae19d560cb8339a2f321a37c2cfb23d674cd6a6d71687b5fc22f277cc97aa21f6883a9b7c4ed708d59eef432bf39cd58ca696527a47f4301be4cc6f509ddf4be63b4bcf314813d16dbaac99b067d4dec88878149868cbf133deca028053372b2f26e047436bb019da4d256fac4d897b6a065fa96bbe2f0010b2f0f813f26b8cb50e9fc3b353e40ba09d04a9600654ad8e3d81df24d0027ec6f6c6c9c8a12b7b8d1791267359c2ec066c45e7c23e11e9cb31050f60b77f4cf87047b35747dd49249405bdd614000d2636ad6bcff5e54035dfdb799fe5b2932c466bd0c6954e21dec2efb01248720454c2b4ffd65c1b3d06a42968b0f5129e8229daf28c865c6a0b47a949440682d8149c10682baa6ff09a3578a9bfcac59b2e40cf56c7b8886a3fb8880b1cc2509b6785ff0dab5e65b5e280580728589ca4bec9d9588957190b6b6a2755ad9cd8f5a08bc4bb434048947c8761c0eb6ad2c8a92efedbd154a21fe7b5b3d13b378182bcf2e86027b785810f9ab23555b4dffd928fc441410d43b78f6860ebe48d19c8f2308fed0e1cb681d693cf5f7d0e46f8d23d344172d4a1b895d70b4ef68997d45c41b063da01ec9664b1291d0045ce18e605a9504b65ca02f0848ec3446ee334e2074128655ce90744020385afbe55a46345a0392133564376499a31f82e54b43c2d678d47f4d242c61a14a75d7d25592fbd2714e3a2a32a4d8d776741a9c06aee27c50055f18fae37c0b80f7b2d892b132ce7b42cdf54ba0f5cf67573df59aed07779d073b00b1c60d44862478dd4fbf3c6df4558f17b188bcb8e805331d697cc508b3b888694944a50212a3ed82ca22a3e57337d31a86ff29b5159869d58c025d0c72cae4c4524bb3f884cf20906ce9185d04436b471562aa2ed5570274dd2b4307c1942906fadacf5e28a4b7624654d2cebde218b590981e51cc706139114511621efe40c5c409818d54a5f0e1e265ec2a647e7854871118aa74b709cd39d8a1222f5f2d919f6570baa22623e32402c0148d76f45c4e22aac2d938dae303b873512ca742cf1712e5ce26c675b923cf8baa9c204b28e61e86e57fe54e27cb6068ff5e603fa68d052af53142295c40ba861ef838e82512cac52f404686cface6a938df37465a6b905cbca9d66400ac835ce6b05f323ea5916477f8c5c934cb92f46175d17d270deb44d78dc7b65d62b617eb848dec6be47804a13d9128c5970f9e7dab57bd47726823c55de95980a006554547e8453d1947d367626bbe0c6056c506aebbf547906c9c81d6da59a904914aef1acc932d3dd4a776ad33830a2c6f14c49d1040edb4602c651220981d7f221f04012f448011411f23bf5cb595ffff7f3d7731bb50237a6888be0fda84a7bd6369ad6b8c464f44674ed326a3559012a24a16dd9afa9f40dde3ae909485475d83dec6257edf866c7757c1d661882ab31b82f35e23c1bd78d936546e258c84e1e0a82ac3dca8451cb396d61bf90d147f6617856b7c714cc01a909ece26888c371d7cf00b53db3380050e4a3d5e7c18682de757076380d0183a9084432c0e17064cab2ca77471d22ff181cbe91396836f2e568a531ae1252cd09e3dadb8696d5f72468966f4a6ab088386674c4442d476ac77c68cc8046a5d72c404b2a54750a36ed1d19e6021492f96fcab5b649741746973ab8d9751a4eb32bfe578b1b850eaa13d503b04092e29b44a080b692e15fe631737a9cb2b219e97670c51d6c590b2a20bcfb877935cd6e88974f154288f5a73d05bd894faea4edf75184dd7cab742c18b465f456f35a42fa26633543721123c05259443f3c5cbcc103609ac5e0e263af98fd09614a01ff0de53ce1b4a11831001f76f92a1d845e8b9e793dfbb1a00f6e316e88ec3fad388b0c1ae448af79af351904871bee1cdc0ebcd21e202de223b2c66a53aca7bfa06beba00dc0f9c80fbbf5d7a45967317749c5a5940a997bf8b364625618d8b25d6bd8212b7249a717a47d6d30ffb468f6493b4dbe01591f62dfb434a8cf2f22bf02711e99799a6d616b11656a4577d55838b81b38227f29c3e852bebcac03256c8ac3ef768c523b966122ad275e9202141bd7982530b283c5259a5de10e8da84d480a184cf3b126833a444f3893cc9a027760f4a72f038b72a1cad7ce140af708f365000635a780addb451d8f725c6ce69235fe6c4a18db5967b6771afaa4db0c59f2a017734b97fbe2036dfe731218de8893874e5bd3f1538b41366e123c18e91a088c5873dc1d3782dc96f35ce4ddc340ea54258f93e070d090c93529a93962fbeb7adb314e5b9a4f581d3fe47270e10108d8c6dd5cc4539a439574d9c089ba220a409035a9123cf3940a692fb050b541198ecd3affcd741a49e3d7cda3a46d6b4a5eb5c1ed7b0e47352fcba91f7aa39fa481d43a2beff2c44a0312ababd13ad4129b21f544605ffddc98c1a290eb817933626ecc899c0615b7580f3196208f510ae56836085891ef817fbdd5f5a9e9bc8099b42a486360569f24724f91f2fe961c520e5bcdcf6fdff387154f1ce3fffab37bc164ea2cdec42c268c21dbbb429309039dfb82f7342b1707560f30e7a88de2615b4051f807b04201cbbe14f889a30a023ff61239e499f55394dcfa7730754f9113688e5e0b9741af94893c4936c6b2939636bbe7332576cbd1621895cf23cff302cba3df1ea0008ee8e0e5a016c871d63179e9fc1b99db5d1facb26554b647643b1b78b55278af19c2d6c6eab6b146cf64a22e2065289f41ace39f2d2e850cf289df049ad3ad0edbe07912be1e1a1a6ed870861136faf77f21fec2a8b8d8e77b8f02a85fa55acca0055c9386ac0febd538a6130e65e2587ce8986de08d6c15b7d01023076771ad0098c4f073d42b0696c3249dd30a6fc0e494f26673edd2b48bb0e528d673db4eb7e8332b42b9951ef3d4ee116630609ccdafe1eca374e364b8cdf49796be09fb58f57c2233c695d9493bf890885a51a6703c8f42fbcaeb8bcd530e1f80afa648ac794cdadaca5371e807ce88e971e78e7ad33aa59698417c56adf5423ae6903a743e2cb40d1eb4e2f13e3ba1589f9cb34dd329420c7b8cc92d5f718dd906af2ff66256614bc2a2a1ddfe80fa263151f58706715cbf1f5ca349531324929d7523817a9e14e03b50b77929287b4c7cebf9d1c50300a00390168a836e8be2acf6894547180e29d79dd69d573d85ab7dcf99f032413da32e3e590384831b2f1a5e1eccbe5ed14b85efac32b393f8c8e329a0a7cf4ae48f88de385cd8484567ab40c5a4e77f745a0e49ad8967b929a4d5977a841a4cdade0ef1ff50f56ddd2662065ad9b74cef19f89a8aeaf0d95371cd985ce6e13e0ceb397e79db5d5e6aae37a06082350e50eca89478195a3626aef339502d882c2f3c90dffabeea891c1cec074ac447c6ac37dbbb442376f84936d81e33243cc96ddef3be0385408b1958b5a600dd8ad7988a3c6ff88e0c2bec4bf8565f08b117da551a780ab94007dcf5604c339b67b5c7956320304282cfedfd2dc2ddc6ee4363b093bbeaab30110d2c415d0b931cc9003233181cd9f10986c11d35c16cf4a371f82b150b986140ad4a9622b46e0efe5530000b09aa22b97bb36ef575794d6f69120827711e252a7bf98b67cca4f49990d4cdde8f204906e029a2db256b02811426cb872a3e5ac4fdd5055ab007f8e6104adb3a56c7ab22cabb491f589284f9a6815d88670d6b5f758db6b077e05bc0ca1c22ac972185354281fb7cee49e7cc1826af0529bb8cc60b4fb52747253425e7bb987492a7d36138d846c42ce3d19d3056bb53a5e802ed36f190ca491d92e89a1733abcdfdc14b6881a33a267993302ed8d7940fc621e02e626ad988fb54034b718ec1e03563508a0c9ce042113e30f7300b9a2b2a839d24d1ba39a9de408297b5a9a2fa31eca9bd42e99298c168f087524e1685735e859014e5376022ca762f9cdf4b70169db15cd49e6ebf0c1ce746c43e92f4d6c57b0bf838713028e3bf9a41c24fc08a82be912ea54181c04930887dd5a5057554875827faf6dbd799674beb99112cec463d048bbd8c4ccc83cfb45654cb65ed46f6d42c82c8ac9e1d23a5a4991a186da0ec94732c6d5b9283f188f7cfdca20159f7a330996e8a0fc0c26cbe6b68e511a9f52258d41c1e70b664071e277754e349659732686cbb6ab5d0f987439391bea67316ab38a9bcd2b4dc59b7212ef468b1c62b662c732bd44d2f0f3a28a7ec6d4fc4f25963a6a031168e2375795372e3b60c94a701f255c6fa235793774d44f433eb0272deebcded6ce86e7a81ede602d05d66b5db0c1e3090f58663e4c3c634e24cb7511612af974db62d9d26811038c4f92b16646300d734ec0f2001bbf0869b1482013d658192ff2cc0018b36e3366ebd686eee8966424321219e4644043f98b6a97f1b91e29cd457f4519b5cd0a139fa25681d0275a7335bd831e6605d5a2821b55774313110b3e4af09096420e65e398ef0a70f85cf5644e74441dea38fd5e9ae6c0b6e591a150526e608e3687e40858e01be674d83d327bcc5ab9374d294cf76e2ca72c3d741387403960f7272b61111b90dcf55fc5fd7ef0684f8efcfb917a69578c1bcc40e99be04457ca5ec88e63fc2cdbd1319fa8b57d45c5165cca8d46bbb94486e16f0e5773bafae96c926817c053b4d23777da210dca3e4be863244fe03680e10a97cf78eb19c9f8a307de07a99ea1ab9e16de495446689b3bd22aaa807b5f0243726e0bd3252b7a7215484e90518001145a477188c946ff2374a780560cb2df733a634bcc0b0c4866fc743618248c878a96c70736312939faf1b7f9e6a306d201c5b241b075abefa26f8aeef64a19ba730cd58aca29e9581cb82887128cc33646d626a9437eb8af36ce266b3c731035ad323a43bde9ad549b32f29a5b907c802087a904fab2cfe73052530ec60f19987a20ef554785401815f420001c6e09f5d03cc9f28f9a5d406baab975367c4ce5c2097e7db261acdf390b653f6be8c4690ba4ccf006872a00100470b12aa494e0cd8c93c06d7aee094346672586a359a544885eebb1c90c3433b1b0b5abe8b1975512922898db8ef2679a3c4e608497adc5d2bfa4bef5efae92f05221b26acd2599e0209849533a468a4493b633266a0b706c0d3db25d7083f230faff0e7c45e1927415be219c2fa55c49ac9f2412e872880a4d29bea55aa6c68c9065611ed69cf5a8986588979a46a2063d267433959d4104e8e3f8d03719111558277316bc87494bc95e3153727abbf18bd9ead41453e733df7afeaa0e5742be611a6714c397a1bb1a8544230e2c0a317c56df987ce3894b9abc54e54b4ba55d446419079a03b9c5f849a99662ee17b0e6d882025ad84364ba9834ae7bbd975f3c5bdeef5209d57b44dca2ea2c34c70b813dd622197c9fd9f968ca31d0d01303d687261657e33faf31c2ea40f172f71e2ec93f99654a49a63122abce9f773f9474549171eeb070462bc1b81667d06531b9698749bb0b4623d3ef349b66e48eee3dfd1b3203ed1e8d1509cd194712eef4567819dbe47fd076ea4d06b17fbc41a0618c67e49d4d13d171110a5ae389473d900770e052d63d6f957bf48e78f5dc0a2596c4b45f06f46e40ee96ec844cfb990a1d9b4b2cba1c20254429fb4b60957323925ea438433ad928f622113f4d472477d22e6bdbf7167bb25d3c333a2ab4fd9d55406a351e4a51a6f339ea241e273003124b67aa52f19f50c24249a65bfef72837ec09c99707cd6681d1c0c08036b08b0824c18add76dc3fd663da72a039546b536721688c3cf96e421b5b502cebd86d1b76634d5721add45ba516ceaa8d725997b53611d821afb347be8589fe9f539a702d87220ed541e339b0762446b05955cb4901bab2fef3dc29bab67eb779c12fea1b66e7d62988a367880414f34a5c96e21024097886ec4b4de83204530069533c03e434024a5311465d404c4a4e07f6a28165b90722519488252e42c70055102db0e75ced7349394fb5205d47bb9175bf6f6e542f3090fd8bc7c6ff54bed3d98989fd016c99ba549b829e3c780ff4babed1e2257eeff6c51f99f8412144f6de5b6e295392520649044a044e04e28bfff2d65432346992060924643196183cb6c0610357313561c21cadc182455e3369d2e012e07135019a83691c4bc1e32acac15b972eb01b1020d65a6badcb5a6bade560b5ead5103cba26407f5cae76b5b535c8d52e171f4c031e34e0e1b55a8247d6c52f3468a26e44ddb88df03466ccedf66e6d77cfb6dd73cef9849cd85a8ee32c0b3716a948456be58823644b50a028c9946432a4d7d29219334a3225990ce975f192162d689248e268cdcd071fb870519229c96448afdb8e921d2550b13364c8e09105934d9922ab4141d166b4d98c4976710d08206833da6cc6a4e4c5cbc5b3a6a6a85bd4ed0655bbc5c0aeb5569faeb5d6ee6eeebf192ed126daa8d83c2e88356c369bcde6828aeeb5ba4b6c71958a9ab355107864312d312d2d29cdd8c5b31b4b0d1e5bdc6437faca9225ea1675bb41cd2779299a98152bb017ecf532012a76e6ae9cc0234bcbc5b633679e6a4fb51a6d32d9b66c0157af34b2269a408a21c562301925af0ccdede909ca0665b33d4d9abc37344bb7adb576568ee3b85a6badffcd02d440bb6ddb98425632710910068f7209fae22852d14a326e5bd435366ab5b6aeb1b1842fe1e0705742e0916543cbc569a85099cda06a40d5b08940bb665646e091f534e369464d06fd19571763d6cac6d11c3bc1e30abb8360edda7256c1da0970e1c245183cba60ade9ee1e92b3599428e0ea950664c2233e62234313ab5205f682bd5e38c85c1c5323f3aeebba6e76f7deeb5dd775b7466359a381587dbb2fc4cd134310a406025bdabeef765f630a7561ab35188331256a1c8529919f7a2fc6365b2a46d7dd5035bae585ee79dd85aad136ce41fcb56496add8c18489ecaebee091d548b1195bdd5617cb6ea00e78c423d09f119c2faf9909ce39e79cd3db31385d8325b09cb139df2829367378ad4649448c928cdc98365a93b5b269540419737c464948f9eb162562a47ea76a1dc0ab1a2521d11fa41f234649b565946464095c5f7e49229265ca03a3241915652379aabb76ed55af784480c7f95a31896293e9eb3b1c5d1841a2a2ccb1582c0811191123321812059aaf204162b1a3579058fec87c72e7bdee654ae6ae55dfb6b896bf0184e0afd20020c0f3ddd6cabde5aab596737777777777f7b75cf57777afb556ae56eea5b51c576b75b7e19863f45cefbdd6bd7acd3b1910b8793cb44a5e2f992ce5ed45176db25882951ca9813e5903794a4c0d446b2049e448ad43c2b0dfa57eb8fae023f50e39afe4f94e79fed83d8ef27853e0d7d371930cd46d224d24af5dea95f921ea074a1b067c9ba74529d6bc25654f0dfb73dc2ba594524a29a594d6a64f29a5ddddb5dbbdd6a6d4296ddaf4f270829d4c1134a38db296a5b47d0bd8823cb2823a9854b07482a296e5982c9d4cb044364a6a922f7812f3d34ab8b8e7fbdf961c734c374a6ad2a4b66aa535344a62d2fd46494ce84f33619a351925cd8c92684d4d289048792853333161b24445c94445998d92985051e6fb820f7822f980a7cfae6d3ea90229482f182aa460b09b2d47208c96ba02fb545802a3c0bc1eb1cf07153a1f489e0e3c6e110c2a098c2be2613b628b548072dd2945aa2bc8e51314bbae29427af8c517c4453f68aeeea6fc90444e4477d6dceec21b4a61f3819b94277c14f9a049498285a21eb49dc7e07d0b6090334b2f772f6797702a4ba71e21d8018342b829625d931eb01d7aa470660a0b02ec593af190c2da8efa047510f45582c8f4e58c45964e3f78e8f8bc1b7b10ad5c0bbb75e7dad8dc877e643bad3d2b7cffeaed5ee7e586307dd6d010adf6647d687251df27250c2b656dc9d7a9de744a29a594d29b9ef854b5d6da9c7f9e4c7cf56b2b7f13ac2d243da3c3a1e6711d3cfd9f8486fdf933c491244702f3e5d3982f6748633e17e298e187ae3c65fffc10e8f7532ae4933b635dca3a43b03f5d5a923038c8fd9449c2a02c58bfbac7ee1e6a837f6229d0fb0f227bfabd05e69659f53d63dd4d28b592db7f4c68a01cff9bcf41043e0dd583ef0f827fa3fa1c447608f6bc10c70b85135ccdd35ff8cdd3ef85490200047baffaeff177c109879aa76f1e7cf06bddbcd712e10b45c0a12a1c21f5d43c6df360c27486609be5772ac60c1d37efdd3c8d2fccf19b9086f737ef79ff852724394115e6f87b2f8942f85ef5aaf00430fcc2cf0bbd3f2104efbfffc213c070845084e6b9096ff3cc1c88c061c7124a9c5d923da192f9a2ffc1609a47bac4848aacf9a29f6b61305ff46f900453267a0013e05404521fd47046cdf69e1279210e1488bc1fa2357bea83a319346eeee101534a972813659a5d2410e541f2f48b62abd5740947024ee48533c806353cdd4786a790c9d3ef3f4a1bf7745bc8ecfff9fe86e306799cb1e7c25100799cb19f24601dc92d03280ae00b3708fbc71fba14057f1e692c779b2636356db62005014294638632b71b14590f295043d44f63fd146949d586855fa42226cf3c85d0926707559ad871ce38216c99e3b8c76c32c7c2155ca9cf12e249ae549ac8f53d15a3bebb737904738b1d2d3414e47ecca29242ee7f2a4e3424599cb4ec4a90c0dd9d95fd8b141f6498f24295214418701a73e4a542122332227f19133b92ec597ec4b2dfeceeee6288e674a2ad9029a5d707eccb8dcb132f47268ca0290619a4b0d2a444d41d711a32c3294a5c07ab93fea75ea4ad5cbdb55ece5e4a6777cb59adad377c7267747597b3b5bbdcc4d765dfe93b6add2da56b74b930c6348bcbe5f2711db99e5cae2097cb77f8e6c4fd79457928c61e8254bc2ebf76f9920f4b21a2b8418c962b6cc6b830f461295f2ae0c3120887871330e8589242096c4035a21802e6479724669ae45f295f2e40151424616060bfbefd0544b178fa8b82a41669e54a0c5858a2332ee845d6d38b25edde7bab7bcb9d6eda596c367015534367d35a6badfd6ffaf8f87cb918b38a64c4f0699f02f8e04393341ac560f284990291eb5b19b5268396c10c62822b3afb51a3d16833da6cc624bbb8767bf244ce3420183c6213a0e48d9da94d6bad254012da6ddb8600681d10046178fcffff0fd3db870c787e7bbb109d74be98b6da23dfd7a3d45426a5b7c8746f6b6d4741b9db556bbfd42f5e17ef7377bf20375005240f6d80e714ea077601a70eebde9daab5cb8ded9ef8e4cef42a4e219aab0535f801f7cb29c4b5c407f3412e30edb73685a6d044d3542bead1e4e5b607a6d0aa09e3546dda53a8ccb561914493695351d34d59ebd1e04e5976c8a3eb045972c852c35151919acc020216a49c5f9397e33c8b447705090b3606d9bd32e4a8c6f0e2aef408e2445ed60a9b1f3d0456addc8e88285929a3c210262b5d5688a1960a02ac82bf2c9d74dc904797191d337c6574c0741c5590a5530f1c549d634031779060f73ca5f848b36d4ae9fb943db552da99767bb7bbadaf43a59455cd8cdeaf65cff4aede2c16d77afcb4feffbfffa3e082ac01cf3666ed6b07f4f4f61fb7f53decc6b4e7376d598fbe6fca4661696c2a432da57c29e5f449c4bd40f66060011652f40b2e605b382c48c88d935b014f5de4942e1d2ec527b9eeeee9fdb7c5b5707be8ae03fc2ac6027adcebaeaea14bf674004fef1ce6f7de5a11d79d20e2859b8507ce24a248e6b0648e0835997b8c450a0ba816e67afe24f7d37b2b167fff22b83b1269a72d43d49272e3234f3b4334b118c22987dc6f5f0b92cf9fea190c7124060d415fb1f5b5c1c30d51d49e18a2e44c27059b342ba83132650a51774a5570e072bf8c074818f2e2025cd12153da5dc68964c632e78bef119f431f9ce17d0e0d7342e8fefb10ee835ff7a2d7125d5d3d1ac539b27c9a668ca33db3dfade304db49dffe97f18a1592a7bf5158caf541907bfa53c2b04fc3b18429ce5a66b1037b00429769087688654f3fd7c2913dfdb6a5823aa64edf521754ecdf1177764417b761d8c6ac655aebcc9ef38197e97b99baac7c72075cb5805954a43e30e01bf4fdbbcbd9ea4d690d379023dfa09fa38504836a7a28b20214475cf9237337887fbe381fcf675d1bfa76614ca10cc817fd2bb2fcf2066a05759ce099257743c2e8c9fd2648189d5ba2c003f2870b4216902ffa47d96a31848022b8c58d32e3e3f0ef112e9843c8ed360be2090d508410a928420a2457cad8d046090b4818dcf75fe0d6d0ab57ffeb5eabd70bea38c19ee54cb9d7d9bfad9166afefadebbd6d953073065a1a903dfd9f8e13cc65eebfd6943d550615878a7c14e5f8cf1c7f99b94b1b86e9cc5cab48c6063e22b00403146a969822c31aa216818e254c48e1a1640d1427b873ce07fe3eae1cbce201df3041c218923d09904214902ffafb5b1228ebe8bc9ce1fc04764cd88d7e13fa5bf40d3c22470d604ecdf80053a12871e19336ae098985fa02978fe6a0a5069982a3565e9f951f99de64e954c5899ccad2a94a127964d5bc243ed953f449f943dfa507ae7e49c58ec00c49f0f7320932bc304697fc717ee0e54fce7044a1e52f532048245e82f0820b106d461c79926043924121d797b296842997303317624092c9210936e410b1ec2106e410b18c23d7709c5e9643c4bc3e5a52a54b1e5d57aa6c8955a9824315285a54aa23022cfc70a45bd5cdcb3dc619f405e72afb6d51fbdcf5ebee77ca173e6650ef8ed779ad0e7aee753b194cf1b618afe7e66a2ac64c4d5cabe355ddc9003ff129e51268962bbe2f057e1ea594523a8addb1fe72b6629504b294368b524aeba4945600e4933b93b657cbdd54d779a0f781f23f0f04535d65b982a44bb7e1e7d5eb1b56d7fae6b9adbf51715ea7b218571c1c57a1628563f1e98f145f74f5a7c0d50d169f8af4267f05373729f0e646d5428eee0e2f15595ccbc235534adbdd6bad584a79c5e6a1d6769c924fee4cdaf65a972d6b6d6749736baab8390f765b5901e5da7237754355b4c69a3db00359b8b250e1e05cce022ba5b415803265ad6d6580c572dba5723c9c7143d93c99869ce5a89690d7bd392a6df5dad43930d35d1eed1d77dd71f8757770e7db6b11152be0f9b725c28cae29103adbd06f2a46875e777bf9c0cbcd70393160777b4975b7971bd5e566b89c185557c46cb75cd7ddca812ac5ca81ea8159eed01fafde7ac00c65743ff07cae25029219d33fa8b9c15a3494ba7124a278d33b4fb3d39f162c8923823bd2c6b52924b2bbdd55c3bad77d62302700471014664b07627a58418d10a3e6b33d711fc1752752b43132aa85dee89a7ee5f90deba3f9add4375c0834f112a5cc902d3938a99280aa558942834636bbc000454352ec09121344e384ca1c4062c10a11262668636ba43137641c293e615e19bf2a1503ab56591525ab548faf6495d311b0acfa9b540c158b8ca75eda82b84d62a4b8190421cb2ee6ca3de215062a739c9c589cc2786004c12c31220c6e1eb5ec24b8f75e10688d113664f7bf3c3ce731a203f4ae56272c49aad5c0c60898928ce2a9090d513e7e50220d6bbabb12d95b7077cf41e3e20b1405d0f98a42e5c31d7ce99169104df402957556ab296d52135c8178f5e33c5e7e00572e4f89ec2e573f84faddad6fb96a5dc7f5cae3fbe61c6bad1dc81e19761015db76e843c5aef675469cebcf5abfa5bbcb4fe24e8e7bea8107cd6b401a9e72c84f36f420da59e3f459f84929d34cff822bf089c86bca74a64cf14207c26851bac280332848c3a4061d90f0f2820d1609262ce844d05fba284890f13e2341a2ec0e900c102f0a99219d8feb5bb02eabcac08fcaa84ce53891c6099b312e4f745cd83cc132fd1a4e4f2e642afbb274e20295659a1a2b4a9214875204c8d761b921cb8624518cbcee0bb08e6271e2224695a513975abe593a71a1e59155eb88f8bca99494524a5f520d389a1593ae6815b35496535292873e8b292008e680d49f863b3afea3051eeeece09b152b0ca65680a0f4317705a89a2de6fe48c379b4029b98812b8ec3e0aa05c88613e2e44ba284c90e243733ec9041cb0e205e0dd72c9d76c0422064f36da0db5eefa5627360ed7739e914f2beff6bd052ffb1877a608bf9825eca6a512be78b9166fff6cf9ebdc5e7755c77b9cad9da37ee5dfbc6b6dae9146af9f383e21b678edc302ce537bff306676be6569ea1ccb1e4e3a04c99f1faa8349630a8148e3a7cca686400000043160000180c0a06c40171489ce6583e751f14800c5578366e583a1eca4391400ee32008c2208601188a6100620c32c419a51852cf008b1a98bf1022a9f4a06e621a63c612ca7535b7e9fcf48955789379908d7fe9bea68985215535aa0ea5367fcbec69d021a7126e7cfd88fd07215ed23595d30870be6167ab553a9009c6631fe8c36005d1ca495fa5db8c85349b71a1cac9eb4cfdbcb08e8949faeaaa6bdbd966b18c7893d10b96618af500944b001fb8b353828907bece9286209061e7582aac318a916c9567ef75ae322a9ad2cbc090b34888adb07beb3b14e2dd339f3387986968100826fe24e7e34a1436ea2b853005b2ca74ba71274e480fa93b1dd98f44d913eff34ed40dc2db73449e92253a4cc518ef0a3c23294bd564139486d4d7568b938bd0b8a7983da637823235d24208ce29f7900e745f21de28c24f82a103604bdc6a5cf2c2c4e4ddaa6b8b3c4b2db527a5410337739f00eba8403162a8fce8420cc7fd6091d9d3348dbe9c31c2b3333b6a5b82972050c0e67b87f0393cdbab32cc5f427f121c9e8bbe36f52d3213cd64a733823ea65cac56debe25dcb443202742290e30c7e2090c4ea566949e2675adc67251c3650ad6bb9a933bc243777f1df638b4de1e12496c7a1c9a777fcf8539f5916008d4e5305a3a56b74a2334e92bab4cee7f68fc0e44a47107bf1a750e7e86f16b8c1301ab745ce52ecda10ec5281766d88ea3209212a31d5dc38fecf0556338b99d5f750c8ba8c1868ce0a562a8778ef704e35b88439521e25bb83682b9970a7bbee387dbd371a43857081918293db9e281a4f1341509a8e4b2f8ca3fb4cc8174426a9beb120eae30dda0333246d48c355c8e2635c9a86db6868dde520e7979fb29832104cf0eabffb8a8a3e58126ac5ac66ece8a4cabc408961808f57eda4185906fd2ca8aff827a59d71bb29880cd6e03d5d236a90a83debd8001a553ffe18be6bd1d9152ee184cfc603ac0a1a1ec5b0050e41310d9300068c60d4444346f254ddc22881fa1b0006302ab1578ea46bfef5ffb1630e777324bbe36818dcb0b04270f6fdd86099fc154bca7a97e4c055bc699294fea2c2dc341203035adc9981f0f4a2ea58e8e0d6efa907a6da04c33d7f6a3a9792e94f18771e6ed5ec9e3e0dbedeb524792fcb4fbe0e01025a656e1e7481c8b535e66a6c265b964abfea09ca1cb632c63853f4d32cb9d001120324f0daf9eca5fd6ca17eb272c128ad4e9ae2dbc9c38d919953532daa573a120bec7ceb9f30ba8fce5ccaa0c4aa16f3cbb6de7c94e75a0606237d51b8e2d12ebd1c86bd8cebfac8ed51b8e23310c05de1714200a576ef22b10dac69f2c8960889be7ac4fabe2d1df6aeb66ea1e8bf5c1e2cb84938297adedc1a9c3d3d159901a6cc5ad175a7d5e1a9b6c221ae5fa56530dca85b03ded16903ab733ad92d3df8466f5440ccd58255baa8ca408d4682590aa93ecc2174f4095f53581d3708b2bed61887b3dd8ae3c0808beae39d257ade0eaa0535e7813a4232f1cb5a652d94a8ea117888e6a35e8ff80793154ce0aa0cd9632d38ad123664b3705419fe5150913fe6ac996798dbe57bcd3df012442e2f58320dcd0965a3d6228b078b7bc64e5c8ae447b56ba2a2173cea65c0cb0e2c86e6d9171b99914c13d1e455c46c8e3be6815a52ceade03ffcb89d08a7efe92071ea946841908ceb3b0d15340ff6dd71caef6bcaa803fa5dc715b868d46000bb3c03a8ea97c9f95e4bd5c7251091176f100644c03fde5d72768c201b37236638f8213e164ad19552f1708b30b5757c64a6cc52e768ebed2c2732dc676437b50460248a578fae889b5bceafb4b4aa24d2218a7a128f6dd9bfdf1255f9e04cc63de24374184347a878eb7cefc8dadb6b0788d170a64caaf4583c5ddcc5f9cc257257b0d026c1bdf99573b19038bf7ddb82dec2f3fc13c3bb7a45171484f3ed497822eeef64bb3865914ffb92fad998b061e43dacbfb678879a7bc8e69d2c07d45b247f0e6f1a3e80f88a8874beaa455a2269649537f3c417c9997c989d09bc74f0a8ea0c33e51219d2b5db7c51b33f19cbdcce14e0105bcaa2c2473f4bdf7b4fe1db8f52ed165fa7b9394f99637d50ea6c6c36d019c4e9a85bc15e46b230d37ec48f1eb4857b4f5d8d097912282d0818d62bf89f8c7f66a90db424e5c3931af233969b380e2fc991c9c17779b74077c047d45dfa7949efaaf73025ea9c195c060e1e17949ffe7690d7cc553cd05dd421411746fcedcfaadf724e1231b660b462c09d187673fcece684b18f98c7a1c9bf856dda90d9a2df2e51e222d7ea860a63ac191cce04373a3bdf568434705af1137706eacb37be67110da399392245218c01c2adc210ccb465529fb69c6a1ba8505f73032023a465170012abbd0026dddd5ae4acd853a144ce733ac4643b2173ac672aec26222f1044e06bc465ae53748e9b1cd90aea091d5adb75056ace5d4e740bbee4980f43ae7558e849bede8a9e86b92d2d5593be70795173b627feaf560782c3ec3426cbb9590d8477e8b9d577314369971565eab5d7a55a6476b9cde85e5f09b58d744fb10c24d617d59100811996043ca3cc4ee60fb4af2a7aac1c481d780b22e49ae0052b8522762b6510f361542f8c41a61a9ecc593fe06080ab86a1bd572cadeb5a982cc62eca63cca89787ab263b620efb849d7df18e2d06c31b95ae8650a5ac02621b509bb71363b2aacde3f56e1f00dc9fd41ff1a2d2398afcbf8588b301d89f8950ab1286492e1e07a90b6678fb60120c45316176331799d8286f4572e34dca9510ba66805d0d489e452fda2c3cf65ed78f3c07ff356caa0b7ed3b109c36312a04aa3e47aec836ae5cf16c0440188b3c46dd55954ace54c014914d5ebb7e6d249c85afab639bc33da42d46c3704b334a31d7710f59714149a44cb46eee4955ed937a58b57e0adce710b1a5a8b7fc88a938942a377969b970b41c65a20ace51c76ca278db422725c35676ccf880ba94214352445aead9610c5489cd5e3da7403b9c539c428c7686c67d9aae444b1a3b2e74c65212b3942176495227c02cdec3861396327025e7e59799711c5601feeb80fce07cf0af0de14d8dd23da1f534dd90451976be04f298aa65f0df906cbab656957596c0e1783ace613d410e53089654614c0e211e50e811786e7268bd89036c9e2f390c36c2b712aeed7345a7ff45b63d8d47824857de7c6d43fc4fe8b99461a9cef5081de0ef3ac4eee2e1184106115393c454b52d6a4c814d2943c9a321ca84cfeb1c7f8b9a51be8fbad3b6162da6019be04030f316ac818159c8fa1fc32d1fd524380a06dd291a3cf34845d8958099ad62391b8849bd07270e8c2ec9a14c483f8fa86255d5bde47b0d9ae80704d160f22f7b6b384f49dc1ccab422171893fcbf3e4efdb63ecab98c1503d39dae764d6e5b99a773082bb727bf04f5148815a33c07f161bf53d7fea67128d12af573f2a7eb1e636a69b8e523d65d655a4132ab904598ae8b592e63420e2a2672990697d152e379f29242c442962ec55c601cadd34bda454414d56b64750d7a424e3825836164d59536d4ce787baeae67215eaf1318a2191968677c160a897ed6a72052c687c51618d0ca320a519617cad8e890ba66e027f067fac3a2c8c5a080f4e4bc6c13bb95072b271f364aa9a088baa0f665d199feba70bacfad76c77f631fd28bc15a161d10128848130e34b8c8c8c08aadf18c5b3cf1a4801091d9723c5b4bc5fa4e28288be95c0712822dee11effe511e9941d8970887bff72be0c2c55b283db64d1dc85f7adceef73bcc875fb3d77d5fc42eeea26fc4df0472010698d61cc47afb395d1078790be4c9578fda9cce0484a52b5f96c322e02f4820aa0c00f8e0bf03d1896114c55c8db77b89d885f467da4fa17c1b0472b9c2c0d0c3fbb4d616a6807a02f4f48e3a41c41818afb8e040c4462c5798d80f03e2a2f6a3367396edbb1a1514a5a0b796c8ae9d9ba8a1039ba46457865654c985a8dec79b0894412b200a70c593541efa96bffaf2ad2904f25e0fdeec2fd66b914071430e86b65f0feccd9239439a311064f758c89210bb87eaaaab9df5addcbf8810dd38228d1ca0b576fd000d810630efd0fd3b9fedc20aa14a5d33e6c7821b5c112058dbc847e4e4d6076e1332fde4a93018462a19570914ad70c35af96c0e9035e14468ac37cfa6123e1c9cdf2f3b3d861f4601c0eb34e65cd8a0e172b9114c37a01a9cb4c212042a118643e2b8d5056b79fb75a9c4fb0f46e983e25429b196965618e1ece14b4ddf9c5fe4233094807ba759a3d5d085e6b02fba89ad6cb5ac9c85344e71e33a8b99210bcb0950a88a250dc6d61db6124a555e8228a65841b1662cec3916e8f798a500037efdba1ce45eb59f917a658a6cd7d4c6b9202bde1090da3204bb5e967bd03df575b120c58f97382e5d15777c5d23fe2380f622a0d7250b03ad466020e71cdc7b26d80376518fb8b24d290db9f2e52c265fea166f7f833a70c90682e50ecf13b4c4c123b463506316e11440397ba74bbf620836411cc4835e542977a9fc0c85a83779a0e0044ce03e36460c9545737624a69cc34eab8d7614c8d945c1df55b98691a777197842c15637ff76d4605481377276e4d37276315597f9439827616ed8bc71bcccc39a624433ddfa9f8a655d8d9e28a68199033ae6bb424f37fa0aa291d651ad25915c5121bc6243262e5fdd38a176905f4d867776e7daa17a04e2800980bfcc61960927b59241a3c792b63cbd4d7aa08e53e6ad6495f728494c64e4fee13491f8b320da82f1ff29968616d629b3774b3c6e5f0192527792993bb87fdc917ec5f76813eb73ae192538965402243ec6235940d5ba950dfb82a0bcf07102e08ac0b07240c01dd01bbc0768b1011cba42a3581f69d26f9d4c5d6e80fe9200a507adbcca1894e5200a264cb711bb0229634fed36047eace429614c4c378176260df566bda152ddb3336a11e3a9c7300decb370b42478d69806ddeb3628a971e4c0f746820f9d1c256d0b905ae3d951775ea3e3cd6ad8ae80b9012962340c0b1c2b5b4ba830ca3630b2df4e9693b2046068ecad063e7688d4fe573e0d3e4ef7e0dde36bccd83b242758763aa1657017467ba2d32a12a73e6d4b6ad0633dafc17d6e09330859d1a9965b43d7f37122b0ddbfe51a92d2ffbad2a7def51bbbeb45e6618da2514e0f9f8e69e206f34bc37fce5a11e1d4916030810b42437891a8281501511ec746dff71ff7b004badc428b6578a9581002e3aa5050bc6141689166aacf53edd6f67715381511fd491f4a98a4cf75a605473b247819c9027b49df63956298d00077884d8fc77ffeda0a4cf1be080efe58107df70d73644361ba6b4c6711315b40653d37acbb4815a9e7d5674ecfb2989e294f6402017a60219cc2a9803292616fc56daef48c3cd9c3bac688653ebfdcdaeb7ddbbe748d3acdd651ee2c26ae1a654cfdc270595eaa6942e24630bf408903178b9d72ab3aa9174aa7e5dc9be158afcbf94936c539a7fd5f1c3948e68be29fe602bed2075dc2b6332ef8c0e5bce8a1ddbb64d600898ff8e8daec0d215a97da5c519a7857a207d3fe09b31c2b031403cd93802f278c8a91708105ef1a9f33690b3956be806ff105a1315a27eb2fc7770949863549b52a87c1ba434be465bf3c38caa145c602570b9f39898286c9119cb35ec02fa0e570f54335403566755ec4790f0e6c1d5a5da4608ca2b3c96f548f203799885317181acd677c7ca6bc92429151384073fd378fadc4a92e81ead316dfbfe3be36444995d9bdc0caf85c58c2bf4d27de6be1e9215068fadb413df92b4aa9b4df0eba0559b908b82a3982dd156c3f531aa4327913a2e0b2043f1474bbf5feab5c99c80a34b038fbdf8ea19118001ff1616a99a5617bb9bf6b53e68d29a33c1dd71d42a2e36594b77e64c4038e50eba4f42ca880ae426e33b75032090886322df566cc81337d354101ec574ed87d302c54fbc2048430a47e9fa9a0525b33f411ed5fd76738db4804397befe0719ea7c4242d89a5b22ea706f1a3f05628b610f65ebe55d9668e7e8f34f1df4b5541d27885b229a91bd9eb1bee1000adf6c4011e0874855474644ad78dce88eadaa479ae29e9076cd10be1484660443ccea0998e2fd7a86cedac408cf159f4f9e5ea132014ae439b15127466e657e1caf0607a32d53fe3d03b955007a8b2c9261f6115467da4f2f68f6ef8a9baaa9cc080ec725a416a8922a2ddcc7041405a85ed66be575659085e2a65e7627b51e2ed820b96976afd7cd81296c766fed6cfed70475d3bfecded99a1fb5de384402973ff6dce8938587d1a412846c71e72036f43175f4dcdcc71f2e7d3c4caef926d3655bc6b753b9639ea6c7ddae82c3d80e4c90bc48573bd3f360bd7a9578b55469b823d8ba28eb68ccb7bcc228baf1e552998699bb288511a67e3f1014795b5daed3e8590b4f5bbb04155062309fbd994b81dd02c4d1dfce6eb2b906c1908a6b651062a1b7ccbcd5215f0ff3fc029f54c010e2e740f1ef52198137b732c7c15a87dcd4add0208ccf4ccad386929777835cff0f1725fa6f62a97ae24c3ede14c1eae475c9ced3aa7d238b0e63591dfe32202c57e89cdfb621f3e392332162e7252c8523e30427c44854284e98e838f4653bee214ea7129e331254d9d5f480ed29d7a3db98880b9957d21499e7ce9b08e0857b60bce0784d5b0ed041ea524f14e74b1880e5dcace14c24a1a656ce1e04df1cbf34b1a9afbc89d159cd2e7326392e636ac77d9d05c8c118cffc842975733d97482c62639fe9489e1baf0471f2ae4dbf2d6626998fabed64fa1a9610a9e956db66bd0b1fd9566e7280ef21a16ba8a4ef19fcfcea9448de99217f99d930d7a1190576b08abdb4a7f29f478047fed015de31944685e6fdf31ddeef8f6df0703de742b10a0d867e49cc38d6823182db4f55e8b333056d0a9eb85aea57fead06cc50cc24be77e6ff8cfd3417ff8a5f7df741c33c027c9db511704cb064d68f171c83c7dc24d7d2d9e1e2067d604e24c9ced6dc16dfefc52e7c6666cb2af0c6561ed1bdb961cf07ae12beaf8731a6e578a3328e676c558aeb15cd0ad7e96f3b42d7d3c2babb824e0b7bb40f69d42e1ca74fd3fa34d1e97e1592b8de6919417662e512e2a773afd1f12031fec6fcbd93c682628f8133501eb4c4c252063c92e814cb3a552195efd09d68b8782c058066b0e80205f4185d30cf95560a0733858ff5a6b8a6dfd4643fe9458b1baa61d9b525e6610ef6fbb4fe75453f029f0a714c496703bb01e835fea1d7952883188a4ce41c847341b0b04038d5e85f99be152125210b15838b94c6bf9aca972c393ca855c4d98e3c9705f40d3acf94a86e30fee4f40875b3b787365feef4929f450a628cd33416abb2966b19eb05b66d500e8e22ae78dcd522bc65e46d75eb6cb60f5c41199c442cffe14098956c915263c14830a04c7d55c8602db19e1bc37d45fd07568ee883f731aa907588fc514a4597a6d01c78026f111c81b09e72fd1bb5acf026ed9f8f975914bef21afc93960d7ecdc92563a9c6622ecd6525460af0b11fe89994ab6d57d0b3468b8c2ba79c5a41b237bb3299721c6651abb60f38d2ef1d0484ec98650f894cc8ec4934f8cc06482795d8b80556dc788b0d4ba0c416bb8500487ce26a01dc362c7f8bdcd70ed356fc3d4269f7fcce8dade5323fad511f3aa5be5711bc4cd28930519ce71e5f40e1bb63c90b3a15973ce27c6f679ca87a39bc2b0fd4b2ad12ed81e1c7b4cd9bcb0d647db2ea0ad6ed278beb5a3d6e28c5d7fe63c6c364e4478b2be25b76e2af379246759d07e797da8a545505338a7455cb3319e046dac70a5a2c819caf38c8162cf5002bf7efada0b1773f58b7588a67511f7a59efd38ecb11640c6ac423757ae05bc323e9cce1f5ea2201497c138015b00de10b0a950042cc5b10519126ecf8e6ac546691396630bc11214d64dce3b15771415dc6208342be1930c67e7050f35960c21f7bf0c163f36dd8a14642547a5c873142c11cb7087026054b784a6bd1a36d8e6cda42890ab61535083396b0152cebf4d5d3f8dd5c139860912757822f437e50d0aab4efac460c67a4e97af5541f3c42acbba34a95e2ba2b741fe87c13b9db8a3731490c2d4d92a6383892439a361ae3f31afa842c09acd5c731dd331c4b516d12cc0ccf5e4c71914c496b6433a95bc12bdb4cf985484b956678a7a70d2241288fb268f33b811a0b90947d622700c4c58706007362e0c5916152888946c3235bb38f789f0072ef110d2585129a0f0e4131ac819b966015330fb5a7ee796defb2d0fb19dfceb0394c2b660e8895228121808c66149b6f486c5ca5ea1913d11ca817527d77d9592d329f00b82baa3b824c4ae2889f9a097aa6280c6967a6be7140b4572fdd60fb1775cb0a69235580cce1210b4ca6565708acb0259c096b32a681399ebecda4ddc53114b422b206b714482472546d6324cf7042a0c15016e222e173e45ea1402874d21f7db84626e3fdfb9a64d05c4af3e238746fdde1f19236b2117e45e40dab4216f0ccad0094198ac450b646132317c9f212b02fa8c53bfa43c48bc1c4833df6b8d5e5abbd5b7f9444261d0a2272580e64fed2dab0f3275f46565361902d49f787092de8ecbaf42b249928f303b48d87ce98df308ac2233964305406bbd4f630ad0e3c5d37df2e425344b970733b4e8457f74d7a98119846e5e46cd2ecd10287131b214d6d390d48fd87ad627e9c75b1c3086e3b3122f3b8fd36df623422c0541da1675a11f1f61a5d5ef36437a5d098aec7e0c3ed3e4a620306edd592558965c02e48a7f0c4f4c33131d5f53b6651886af437e410945198a8a7db9676ac2f10006dc23b51966512671fe8884fa624fe212ebc45e895b84fa6c63dbb592a8986481ec584783cc44ee4782a1b32f8b26b87bc973b73e7fc6d1b85891be0cb64046af3c22a625f08c270534a5510cdc26e0494828806a886d928a20a8f2065982379533690e19a147ecaf20c27b88fab0f4249c415b2a302e49a66dff1a03305968e7258efc05bddbea00f4dac8ec8b2fbfbc21039951454d4113dc0289922549f18b55460a210d5ec598212e7d2ee15104f284ff11592130a9458f2b5947aebe1734d274c9539f1d3a2ee5f20a7dc008b34f5eabf26e1de7bee08bbe3642fca133edd5c5d011037b8bd28365067c5917b5b594ee2d0303a674a96fa6c9a0bfb93fc12ab1add7546f40bb3a610a6efa5aa3cffc7c7baba810e5cb8a2dc65e4d2ab89248624b661a14633711badbe639bbdbf8ecaebd301529d74ff2d8487fe99fb58fc08900c5964be027c3ff4ca1d2d6db92dba7ccce06048a49a32b01ae8cc7426b674e5757caee455c08323d9313f1dd075756074bc541adfc06305f685b279bbe6f810bf37efa7b7a07d88ab7da17bd9eb01715878db77fd966d263416caf5a4e01b11d7b8bb96751e29d34e773ac05c2a422e4e98440dbcfef2646edf5affd31744b4e6c5320c0888a1e17ef9c904d5d78ad4531c070787869ee403cb13ba3197b2b85f122f5784597e3fccfa2ff1b3408ddac7a774906bc7c048f9f31d5bc8b6ca886aa5ed63e9de06091d3555bb7fb93200c16145f893513ea9ec6095c0f03add25cd8cceac6787a88f7500026962a8029365f9a496afb23484cdaee6b9aafc8e154bf279c79355970a54878f0ae63c9d82c683aab2c726c6f7747cffcdb4259e44069547d2e89f13976161cd8600d45f62787da8020de8a45059027a664faa4458e3e856c5f31e170e7f930374968ce2f2fdbd938ae4dcd02b85a8ee011a74f35a076bb4c03dad401202f403984c21d8fc0764e41391736c49d9380905d9c09d62abcf1c2be2dbc54f0a528c5a3a7482a47ec45fd72863d5674d733a7109ddab97ad4b985ae201bb2bd6081965fb031297d9415a36be337988beaef1f6a6ee04091a3fb2921d4a179dc9e59c58049a565f98ceeed2341802f4b8e0c785b4b411c4f3dca8dbcdf62c1688216ba53a6c601aa442fc7613bb1228489231f2047d47bb20fa2ea4f027c632958fa19d0b0e1f513f414848a1c604905fc560789db740f673fa038edb334948132ed29acf4bd9ea17fefecf62f309c992652a1a0c5c0c8adc3d9f495950a7c8a73a50918792b1406f8932b967bcabe667c893de94aa26124a6116731cb72e5013c573fafe7ebce708fcdf0412e70dd941d57f77d60706552feb334851d6ee34c1f22d70bdb542e05490cf9708607e9eda5f5959592d0c37698f123f2b01fdb4ee512b4012f6a41c1676e2ede7f2bedcc901211efe4749769bdda72f097d29d91474bd0e76c3c169bc3aa53fe22770df295345aaa07e5825e4b24aa1614df17abbb9d757a8d834d38d7610a1de7720d1a64d3c58313859cf1566c8c576fe8cb8984fdfa74c60c59283325e547a32a633c6a01fc24da4c8eda7e25102240a9b53a4aa29a9cbc5ac034e6b4ee6f96cd0d245f362a64d80e58a60e0ba6c79680c829d0087f48e188f22b79ac33c2b17061d095680f3edf744b11222a2fee17e7f5eacb62857d4f567ede95e42dbdb7f53601405f7a4fcb7c0cb7dab8757e8f143499327533cda0b90dec8d41f0d48737303dbb067f93599c5b146d4a4ccb14c5e7818c426a4684f7f42f11720b52a440c0852f5380b5011a621c83cb757e03126a165d1952371e34dcd04a72faa6500137fcab17cad3ce636494e036d3b8023dcd9de2c25fa0278bcbbeee7d4ca49a74876a98f4491fcc6c5672a55fe34d06077e2c03c33a4f290e80106ef70c1821aaea202e0a43940e0e19fc14200f9b41645fad38c214141174fb37aa197d8b7b8a0c9c6c9a72107220efa07a79ebdc8f6c22060f66103754fc492e35523302654e88088048822bccfe6c3021c7ff49281fe94ab8ed53c2295389407bb14d5c29464821b884a709875bb39eefd2727a88053659e4cd7b941e41c210485153fe162052934c026e55f8232b388ed26a84f555d38c3afd575a78b017e373805fb48a8a632c87436993aeb5017db7fa89718c5580047814244d5433acfea563edaf6253110c5a40fd6260becdde2b33f9fbb1bf8797c86500facf722b444c4638f057bf36c4ab1c9dad666f3e10f754d1ce631e483f36dba4c62ab33662e3aaac32de3bfb4f2dce0e82f7349007cb13cc3d282e92c052005c441a7a6d9c0cb614f7207631f2eaef0a83bcaf3f7c4a8ff21c0adf11fc9afda6a8a4f8a4cc6c5eb5a51f44b87d67c6a115450f1f3ef61a65418e40d9b95afa2f25ee68f0286669189c0591064bdcecdf2c991ea0033405525efd72c8299a3ca17725b3446f2d54e90552861f72d0af65d83dcce92e1bb99a3faeccfc47864bd8d537102c990be459d59d1fd0756dcb73c1e49250322a46b35a284e24083eb98a11707043a1e39d5b7b443887559c45133031d449ccecd2ab549d2642820dc692c4921fc1fca6d5cb2d29ac2e6815ea58896ce04f5f2c0f63bb6993744770d9d10404e34c8f824f8213d22373ee2ece4d92305a8fbc49699e5ca5b9640844de63e63a170839c5400f2cdac5c740303bb63c1bdc8c613f4ac5c9403edc6a06b2a3d0970603facfc118c1a4d1d0f9b26eb80367aaaa7dfe7a71cad9a70209c34775caf951af3d2ea998c5ade4e1645172a476a259c7a91dba3e9418614c7bfd7988378b75be3400d8a420836ed7379e6ad1aef2fa5fc731d0ce2e582d0c69839991944dcda1ea2785ffd14388aca603c491a4455af1bb4bde6a277d7743564597ee9560974bb2a0813669767c3169e3a842575d9c05baf2d1f02c6c139ea8e6d1c3eb43a8fa920f8aeca3834c2c515b11ce07cdba5b07dd0d3b7215caab3676368c34d98169abc8b2b9c8534cde8062343bfb09bfdde03c7b64a7ebeca4fdad7e37c2a1c2857700be41e2f4fef2d3c5ced3a34060e64402de9172c7b27688b187c4416053bcaaf1b3dd5849bb2a51a6bf4495aed2cfc7796944d3cd64b90fdd1c639c91d23cc65305b38f359443ad0b4e367186f1533d996233607f380dcacbeaf01fd637f9589482bb05bbd516ee4890c77d5ebac608ca29688f0c64159503ba8d5e2abfb420455f8136f822ab5c44ab5574f5882d167c4b98a0d80a0575cf076ad4329a472e11c445f2fee635bc7df484bcbcc3569ae911a4b7c9b691f2234f3f187296a0e48e441ae0b46eaa954de893f4a27ed5ed1af1a9f7192a418bcc2c6033e4f57e1546ca52c2dc6f21749bc6ad50827167c2d67bacd96d285ab0ed204b00700039e5316cfd6391a2fc12f524d551ce50eca9cc9a5337e0286043eca9d5bb49eb48337877be6ac6dfcd320ab25e3631f2341b94d68e475582bdcc7543bebf0a476b6efaff9bbfa44e29d133ebb8f9b58a8a12ed1d3bfcda5680082d8550f4a90ca558f6e28866a56cdafdc8fc174e46e8e238f7b61707b6494c16b3e6cc090475a5ea2667c77e35dca3bcc9f9792f0ec0c643d9fd2e2539574ed2eb1f231015538edf3ebf05d278b5751641263a8438a224cfbd394603123e8163a63a5fce852951c8d5c000c55c40848e3b42c74ea062d42c744ad8ba7710261141f4764ef79259abe8891fe7b03653098d1828874e7d380f0e93173aaf19039fdb7e391b7741bdd8e6fa24256257121086002ad2460006eae28aef92599a05614d8bad732264121285d3c7bd1456361a513018cb9d3efca0cc888532e8b517a02c86ec2e9c2c575efdad3b9966b0558f16acbf08dfa54a1229ad9746615f9a3cf43a690f63fac1430254f5f201100e3098f4d9cec0271c2809c763b0fbc006957527372f4bf90d828a72b290d242446cb118ee14a8c794730f9bf16f6103ad92e3955e44a59ffea13140f13f20b60b6484e5e0b51c24c6fa60dcbfd705b6ecd2112c647f5b08af2d7800358ff167ee6b2abe54633e9674cd416ea40d1616fb78e17ee9412dc0b51679cf17a18d3962479a4e8968e72eff3c52aea8ec3d07fff7231d2d667acd70427f82d287e5efa700c84cbd3816dad26702b2d7289faabf18d99e9fec60d1636cc110a1177ce5a70d64e9b3e0567d4d3421ff8685b01fadfb142d2fde2311f87ee2105c09e31062b0da44874861d978163dd1846ce2cabce1445f140e14018ea18bc65215022911d5b2fe8862734357263f14a74641d0f94588e68c237842a13372c83398aa41f249c14fc4649d10ba23c9b88781bef9b236a31e23ee79b7c6980d8534a5b57d770c052a65abc339379e454f9b38318d92133366f610063914185bb4da80d1003f5e11acb96c8ab322fbd083fd0fb21f83f2b514d8c630b621c37c0890ac68029eef14bab3e5392028eba0778e4a95366caabbae0485c7dc792a7238c254ee57ba86906f3b03c8e67ced666e054a9f30677e9532807b80e2a138b150e6204322a0b0f20de12ba8f2e36ee1ab9f01cb18ac934d622b98fc794978a511a8f1d120f0a775b77bc12ab3f5b1b64b2efc51029f3495a3e0c1cf01a0253558f5d04e5cb5070e2083b46528d45f7ca488488d063e290abe14f7a9502645ae26104630800302316943e6eb998f02c2135b9e0f2f2a4346fc63670a08613453b9080eae99faa577d0aaab1cc2d277ca42253933d60ca62183792ca2cad0f936db20df35584006cbd7600aa748b05be9b5f40baa394254c080346941a0247f79b6558797b0e0a872c238564ee20dbbf0c33d404f810ede6aa023a1d42ae2a9d235a49112ffdb84b944e5e4205b81ae65dcdd636b7a1cac033761014aa5bc7bba4fc7fd79fc635efcd5620cef59969581e2c92d00e40f25497583daab4dd0b0230c23ac57deca97098faaf5da9debabf8bd432513d82c9fdf27aa1b494c3d2248a860653c78b84c2d844564a5b70543147110d4264539cc5bca1162bc073a97baae893931994c7a7e11cc84193c351013f4d3a6e329d5ca893741bf4e6fe06a2dc206ddd7992081edab37cae80a082565cbe2199dde4da75efe16f0fb0d282bd3904c4a5bd0bf86acbf06823ce34c8c33ac0fd6abaf25845b21f50443635ecbbf762d58ec70a2d28eee9a195a467917ae49add0b33bcb52720e8af2ca0ceb6096c2a537b7881b5016528bb9d567a6469a14cca394d3fd4799f3a940b1d07c51c20646a80905acb62088ad45fd2609295b76b848dc6ae6f722f4298d9b4b64e31ddde1a491d40b8edad5a4eba0b0cac26769d8e8a1e8f974d9577b9674536e5fc8bc3c28544720244e205ed0b26aab3ef2d438cc87e5f5ad6a31131331cdb274dc8f69b5bf5509db95cb152dbdcde70285201ced83cf4dfe580a8f0e9e7cd04b7730d0c84cd20eb65638ed94eb939604abc125c2edb5c816cd71b18a1063ecf515d2806b54898e4dcc683288e77685ae05703f853b6e3e6a0a3b84ad8d4d17373480ba5054a728b4a8f74a21ad63545985dd28a2a09b5020a655a2ee310daa06724688689d033b4ad69f94d05bf9c08ebb6c04be492d8807c32a1fdc37cec70f7106f0386f3d746bfc7820ad0f6cdcaa15a624b31e9c022eb0b2e1729ba27fd5de823dd536cc80ef560d9893de9cee80a359b9a09fab6f5c8f13b100d90138423aba75525edd633febfe06af48be80b66e391f3e330f5cca497b0f8e3812cc3fc112a1d65a81052d939ee9826e98352207c0a3fd3e0d14bfa8e0fef0b0c5d87cce03031de3baa67916cba363d6e6361f66cdbd24d4ceb3ffb1209b9ad9ba68699c0d40a6c2d84d4f00690103edcd2c431d13f2c5bf1c8547219df347062a6d1b0644cd6c7ce915e41e66363d820d96cba3d0951594295f41478df1d218efbc796c5076253a9a6d834d987e2922191d055c2e301c5abd16896000bd1b1900f6de4cac14beaf57ee466768355310817e24b9bd1e271f0644f93629bfb3d35f2ae40ea333e2268a82a90cec87d551acf07411d63a720dfe9a15119c4bad1c98e10eaf513deb05e6626730acdd77479135cf9e38cb067b122aaddf979983498dbe4cf47a146b75f8987cfa8795c28510f26e38316d2ff410966a3544c4e0759657375ddb29702f306f20a86b9420cd51e49bbf07ca40f28634d2d3e02d30c234259c4b60cc59cdba17c205050481f3e27ac16f284edb62b934d63f0cb8c97aefb776adab2e8b9412ecea82a25633e1898c124d49ab4f995a80b9b290d495193c9561423363efe15435db3fccb8c91a50f70ef38a6888750bd66426fac201876bba565718c4968303ab3eaf8278291c8cf29a44af66e1884c13c5c401175d4d69f08354baf18b2733b1d2f4b9215eb456a6142756226078e86586c1c3b3935e4d43c3d84a1606bed12111a542605859ee6f6587993281892cc255aa5ca7c0803660cca484b57a21a995193c2ad304d365967b048a4197d616ac97fe86b796ec404653f13ac58251babaed95dc0665cd64be892dfa51b730755ab181e4c08176a91e732eab3b9b2254d2c1390ea85409997c30278ad40eacf6b40b782ba84f88997ff61c72007f067f28894a1168f7fe88232ee03f904982355121eb64cc4e4a8cca9ee410b4770f3356827130e1ad67fc449ee98e80c876973882ea3acfa6cc2be31260f69ea513e9dc97b2374c7b2de435d9ca0612f194dbd222021af600bffba46701e38026a3e4b64ad92d7c518b23d6bede01b8754ec8a40522b7e3dce7c60dd2a3953b80f4ec55c60de2ace33613ddb1db07a7ff1a422da94bb4023e2bdcfa1fc51603bb84f6e9724c1125f9267918a515455fc9c1131913cca8240127b70e70ff26ff30eeebf55b69339360d2ed18cc2d1c18c6a50bc8e82dc7c3c73440798f715a487a3f39d8e417c67dbdfe2b4d26d224263e8271dea65817b05ee9055293f3a206a0329338ccc7d5f5af7699101399619eb743ff05da9436130bb664e9b057999bc858531b4c5907c20bdc9758236d7ca7484d33e3bb7d845d39c04bf1a4456a45d4bdb9caca7a49304283c63b02bcc3f7fe094495be7386d5ca5a566035b41b271e45f8928cc841a372282604559cb32f1f13094af3d7498275e0f38dbddde2921e5c5435c03feae5ef05d8b640b080854060156e3a871da74085254d48a89d3f2900ac3005776134d0ecfeabd5e5a872fa23746858bc828ad0e1abe04d397a0159354f726ab3c2a28f227cc580697d3693e38a8a6f61d298172046b7cec74f8207ecbeeadeba9953e20f6dad35561fac5bb870b7540526b2b01fcbadb0c2ea902ce92eb7620943e0278e104e31cb672174e48fb76fb2c752bb0ee2932b0778941536fad4237bb1774d7061487ae12f651ec0f9271c9426a09d4216262b5caf02c8134e8029a062356890b36ef3c7928d752f974ef57e0fd1adef36cc4c5b92c445a329d4640d6ee9a87cc3c61bc6eecf598b9daee63678ea1a82f906d7799f1b125aed74df0fa3b1f0ae9361ba1efa9cc31eedc593404eac4c1a170917db4f6310484d5df6f24437b865d403aa7727c9ed0068e0d3f5b8e4f08089b7734308e389aef39800cdbd9d97750c963f7835fceb710bd709705d3f906e1d8f9f1a0fe04dcfd1c573633a4918195d763922145f3e250fa36ca5522b497812b26430509f2c8352b1bed26631659ca7edfdbfe73e7c0728205d97a86644cf416120da01633d21db887901081f003338a0bc8445da0b76cb0b0d670fc3742bc3386b145e7add9d5c2085546b6aef1282ac821be4e0fe458803cace13ecfc7b4a038c518a979e782f9cc95b465e499c5aa685904a155005b2387cd5c82b7b07a328b4830058f15bbe06c01ccbf333aa39629576e526cb75d3d7ee2a0518f4b2bafca05d56f5ec733c7ba63f9a4ecf45240709e6f23bcd24065aa9119446136dcb6c0161c0699522767ed98118e9e834d940e048e6cbaeee2f52e0d207138a88f5e3518061df2ffe112439dc5de96205f64f530a8596ff947fb9d5e1acdaec9ff4054804f4c57b6754792b9e8cc0d6b73b8535610aebb6e4c7acf08ff76bddc7e3a7b06100f2759f6c052a1a68155b188be3db9ae7c054e223ab054d11966ab048f3909c13b49dc5fbb1a5baad9de4721a04ac1507745e20ce6e310f0d85e9b8b7008e2f64fb6e3bed000a393162c61bb7da751c88efdb65838522ea5abb5390bb005bf447dadbec7189a56b4c96fe5b3ad3f75180af213e74e068050c72a72911d7c798a5fbb857d5f7e09f1c6192dc886f0aa962d4dcd7024c3258e07dbf606830973ab8ad170fec05d5351fe8367f42ca3b638bde1675877260f40294a4fc9bdb58af4cd0902ba24356f87578902bd99ad20bcd2898700041b535d01014d0fe6a2f7e66ff739fe0f2795620e139e9b47bc0451585c36f01c31f9d6e7df5d4a06a6421e89d164c2bffabd15c5d1e5fba35bff6d9d0f8bcf07ed489f758ee8d4d4de43db48603ee49e52db2e86ca28a640b81a2d0541dc320c0c18630114827859cf349bbf931414889d1f3a78750717a87227df637ff39c308b800ef0a3295ffd48d67cdf81b1f59a83384b1a23cb43df727161c6e61a6c1ec0335cac8dc02b4aec2054b966d94d2fb0d89f9e314e9d415c4527ac245300f2455a862131cae6a0ceab91d3a20e8357635567642b7a003411c0077b299668f4de73db66808b22237be784e0bf36922dbaad3383459b0512647741e9d84383f21005a3b427504b4ed1af21bda9f3cb04570b56e45937acc2d481840c74edb53154a8dff41eeb474ee4266c4d7fa315f5058440363883cc9f406868b0a56d0650b436978cfaf254a9cd4f018e45d1c034643be4cb3d5915e5ac5a046e4f8b7d5eef42572b1b90b81e366c9dc17d007ab47b12a47e050690d6170e1c8a9b51440d6d89e29a64a81ae4ea7402f2bbe3cac0e5d5e23ec8564043279922fd5a9a5e3105f758e3dd3b04a935c00f5e132a945bda52f62b353133d00abe75130e6104db72870a43ac5e73fe3828469d704e5130edf32729e0756545e22b51ef8a0a3197b5ec2b4d6a6b9997c492b06bdebd4f78db44e8049e47f01e8ee2e1c9a5c3b38f260ea098caca7810e9a8296ee22003b4f17a59072e2f3d392e4ade50b00a585ea084d624320bdf2925889cdcd912612000a1a428d8a38e104b7f43504e93d9dee721166c6079d01391788c7dbc1d71496078b017b659ca08f74b573c72ec78b47c7a6dda1e02e0abf97d50a50e1055e8f73b90dfe76d46eced36129bd076cae36168b7304329bf394719b0b3a066391e323cafb3748f1564efbce2d216bfea746cc518dfd632236923cf35189a29a50378b34e2ccea9d43017b6540d19f615f97958b9709f0ad38b37be28daf3842bd677f55b957737ed334a1966a99cdd1c8d948ef139efd60ad1da5f469709e6ae9de17200ae759e0f5d7b91512499653ac0c057feb4867f305abb52645190a17ee0824bbd1aa00b1b50ccb937dd646ab2d162d28aecf4037a18fe048269e313cc4e7257e753124c6ba08dabfbf6c2e3655cce0729323eeac0ad014121af5ef37c04bb7f52628fa946ef8a34e44c101a1cca2bd3a8a427daddfdda524982de12ab6577ce58cdebc8daf162d91d003843bdd6ae2b78ae0ed2a60b9753fbed9cd6a250f299927b8ece0a88155637edc01c0e141840226f26f421ec6958b5f12bc358734328383e845f52734ce155f25370e410f1b6bdee0b4d9751dfed80b35afb19e7bb6f161aa4c2c9578e8a4755ec6158c41fddf6382f9a7a608d139766115471dbc8f5658332bb40950147019aa181924baae2cbaa55070135d370fdd94d4635c70ff46d743f152fd11979431f1039b9bbd7447255520c947e51f9d3a026c8061aa209d7a6fb3ff2ae5524cc953286ea2e2652b07c19ab2b3bf25af44f06fbd88d2e44351ccfd4bb7d63827e26b68c5488b5829cf5aa212d2cf625bdba2ac1ff1ee244c9576b820e5cb12351b5357b063289066057ba0c33467059f0e9c4c6ecb04d8933733e56959a283574b05e80e1cf9a822e7950f645af04cf22bdedeffba986d85943b7a1493e57ab6a3116e056cbed9eed90aab4c0d349cc3708cb20c53b98a59c16621c8c2323516293fe6961ff6f88d29709090e3ec5aa64e3b2c64d28bc4113fa41700a87b3073e128e480ecd4edc485e19fd8388ce9fad46ebc69d9228d5904d92de8026420045ae51295593090ba4a07aea33faf4efe9abeb13749462f6d5f4cfcdce281f4ce7b9b97b7567ba0a727d1ab37be9a8d107934926b00004148412982150f65ae7e6652560f52523367e398495bdd874b68b9f12c64237b6fb2e59652a62453380927096b095167447df165631c2536e42d420d60e63135ec0e01a106fb8598a0638d8ed4076ee196c73c1ae006f00622cf175b9e7743dea2634bcd164d00acf84522902e21de232474345223907ef7521148ff8f2916024241ccb0a1ed1fd3dd9b7f424aecfc90b734e03267c1dc05f39849a9043da312a776678c71b6dc99d2a592cbddb83f77136f487479acdf1b1a3be3ece46ee64bff429047fb70ce3afdab75b59a9f7db6035bbd9005f086b35ae5231f0be0951f9735570500b2b8bb97a09af26747a43b4e2f1eb9f27b7dadfe71d67877dc6e69657d143cc7f188c186dc0d95cf091b729705c602c4d9c80263b9b5c1548f60b64719b38f57338ac9e2e2c24ed6a2c975a1a6e54d671fcee93f5719fd1dae431638a2eb374c005c612500b4cc2927097de59433c6abcd8f4544ce6fc5028723efd61d91ee48c8a60439c793f07cd960cfafc126733e95d43b81a8755b778b44d7836bc3c60ab0d9c71b5d661fcadbb503005c0eee8ecbba1be8b85be5346f75378dd3bc1c17c7dd364ef36edc9bbb759ce6d9dc4dc5695ecddd6838cdb397e6aaee66c3695ec7dded86d3bc2d75371c9ce66977cbc1699ce66577d3c1691ebdf36e2c4ef3e4dd76701c70dad601003af8f937f74a16fd3050820d22ffd338b87f10850da5bbbb74f78ff286740a8edf920b65e5460863e7ec185d403e6777c2bca10bf31e71c1afe43e33b5f08da5bdf662a085ebd95b332bffb22c625b837398082309aeecf60ed94cd4a2bddb7d0577e92f34c83d926cfc8e7ca5bb4be83b828e15367ef0c4074bd8f81f6049e2e3add58332be90b5a54296f6de65276ec822a17edfefc61bb232faf16a3764c9c7717d2e6b7e64e2f2a73c120c710e7ff546e09c10743cd0db89648ec6c93ed73bcc298d73edb91b0ea5346f47c68f452494f263e1e6ba0cd1876bd03d686265482fbdde21089999bd9bde0913a0c6f4c279e577151b3fdf7eea1dfe14acd87e6a2ccd3363de9a2f312b30d64bc7b6f82b365fb2e81536543f3138c5dcf9ec44017ee5cf18fdd5cada583fdd8904365fcef3fff257385f7dc50acecd2812a7f961438100eac6d7f54f4ea722b6da3bcc96ae7af2279b898e150f823ce282bc4114b18a44d7fce89a9f11d7e267f9c7cb224273fd696e101e983d838c518dd428682e68071bcad74bc2e49144924932e649dee449ce2546799227799227c5a81815a3366fa78806fbc4cfb7e01cfaf3653345694fbfcbf08e5ca27deef4b57ea10f1fb4d6cdbfd0dad4473f4a23266264721e56110d49eab55f721e6e727a82da346f687b24316c9f7a760d69bf7db60bd2be292cfafe729817b911a594524a29a594f6fc0c0932a242d00e96524a29a511849ba2fbe43c442efa9a47e49246eee450f49952a994428335edd3344dd3346ddbb68d861b1db26d7342ad10ab7e9dfedaff9307d513a9851b414be150a860cd6d9b7bde57f052f1031216ca4eff479dedb767df58e8b9a98f6bf0060f365eae5fb8cae837bfd0ca2f7c6742e576471b6b6c8fb3a341b60d7a14f99b933bf9934379942c92465ee448ece32fdf8b9c4708de712e0c3639cffc3cc95bf2e5dbeac38b6aad99b574b5fa3ca081eda608427f9ed4857dfcf3233847fee74d3cb258ffa8a82e6aa37e35ac8fe2d2125393d313548445d851444a8a29f113d20a2dbca064145f3d3d3f43828276b09ee42272499712a8c33ef14a2297fc666a2497fc97afd8d9517409b08f7f6194e14610e217933090fe189ab842be12c215727dd41dced52ffcbb7d46bf50e736f7d9db51d2afda98c1c69f4fc92352832a384f4cc2adfefe285186d8fd514ad6334ac7666e1b2aac7cfff9dca1305d3caab0fd3833768cd973d309c45c1d979b4ec07437e73eec1b3f9d68c33efd7dc039f4df82f42b03a6ab7e41dea2ffd33653340f33ec2c21fb6c96b0f3e5fbf7576fd11ffa43e8ebd0efa1bfc5d49dae6f0bdb4a363033b3f4e85b544fa04802898e4bd40fd506472339cedeaca29ed850420c2f2e6a86170280784a51996144157da9011ab44a1316e8b89ca586273ec4285bf6c76e59cae6e8d3bd41156c5172b376ed208a9d9e8d52c6e9d329cf497d6963de61eea6347653faf2374a3f7e4f297dca31b2a39c6d3f8e4fc40eddf94d33bfc9dd1f1634b3a764f70a4c6ef9fb4b971d91799b1b48051407339c544598d1f4740411666cc129c12685bd71394b0d308441461a635697b3dc1003259772b50a612504f4a11380cb7fe3c303ed79d29b4c880f0f7a56fe9aa64d1d0dd4b41a57427c7870c31f4ef926c391797e33fa73ce49e7a47cd38d2352baf2c9372bbf33ca4c46e91de3aae34a4aff706c8c36669e8c52ea4e6d6c4a3f9e2cd6cc5b2b9eb2837e88abb75d6b3fe774848245c4a594d1ddddbd3f79c4b6317beee1901fb6949c94d2f3cb52fe9671b77fd9369ceec6e11cfe3259cd2a9df2a86674caa3a323776f0207e7bb6637ee43c8c5613aa34b2ae78e1d3b765c9e1d3b76e0b04f36af34fd102e698614dded212ed10e514c5c0195c519585ae0f292d87286981b6040c3999bc85dd1f4e386383edcf9ca1630643c36894ec22885993c5ec112b7387b24e3e386d14c92ebdf5cbca348b9de4450b96ee58a7701a65a2f60d77fe50518d7ffbf78e2fa833a5f405dff9ea729aeff8f09aeff90201a8071fd8da8004692ebbf820cae7f0b2f80b1455198238cc2a0f1121305ec484c17484962ca888d5952822d318581a5c9490c1fae7f7ce22c624c8182a1086a8ad1184a5e634c0123c3872332a290ca604a8a35598291816aba2244b171e9b21362305dd692584129d12800a689261e7058238a138e22c91041c800ca8c5713ae36d228b86d74bbbbbb9b6cf831bcd1d14509ba50d253058e1337bcb90d46cadf0673e5369497a2ebe3f2a846d71152d22a16c522f629c08d4711c93379e42dff9fc651537040e4f1286ff9d72d2c181ec564c8277e24aa418f729e78456cf97729dac21deac9f522cef12f6ae11c2cac3423c934180406649436fe5839b9004d8c555dce02e60914304bc4a498b0b64cd783b5f9a28ab1344d1c0eb673c11936bb9269b192c560a70aea0f45a4acb0d9e52c5c2095714493700153a34a9abaa5543068b22d755d9048197148da067b55a854171b9864495a17189a50a0304a954b982713080ca68c4b930e12e8a989ead4279eb84e8f8e901e31dde25b9f4c5b2e47bc806850c4058826405f4471a9210a90104f5cbc6ece5c59c205f7c512197461442db902090ad59525b14e086b2f67598294f262692e67590265064b9adc2a788bba5a709ed4dbd803732bd35e59166fc73bfd59961d4143a9e781f6f4adf3b0a2f645fcb5afc8f6da6faf7dd65bdafb0b69efaca87df609a57efb865831c64fc8877efc5da9a79eea32918b45fb85fcdbbfb0e713da36de787eebe09c550f207e8c2cdfd654e216ad33468fc1faf0119fe213e897a9afd858f169fc84e6cba7337a3791b3345f6cb8c38600fad7388fd3dd475bf68cb3659e07b73a0f9229f591f4db788e6ff3fcdbcb2772a9fe6331c05fbe90bffc86a6643f24df3ff696eacb3ea19bf7ee895c5d4df6ac9a1a1fcdc32e8012f243cf14514a29a55fa3ca76502e9ce58c974b69166465b0f437ef16b069daa7bc90e8a67ea35ce66d97bb9477dda7f27e3c76442a179fec7335351fcb84f9355fc2fc9a27ba2a2f9457f599170eddec3b2fb4b78bdca0ea699ebbcc7a4437f3e216110847e572df79610b97fb1fe73ced372ff5e134c8dfb118d06fe385fa6d7cf5138a6ff3655e77198abe60e38fe5cfe2e7dbff03cc8a3d4fea442875f5d6bebbf7cf57c04f8f7577dc12e677f3030c33a9e0bf827f901122f45926d40a645fbf5590911e2c2c07979f0431632e673903bbd188d2cf0866a2ae7f507331c610843418df04fa1c5ca1de91cf3241fefc12a4e40e88a1321902db970fda150f3236b4575af611e14a6971ae7c16111fbd03eec0c26e70fd7df8cf2fc17f7e2ca20bc6be946fe5affc05468a7e3fd7f72fa27d7f48fab5f70fc914a17eed91f8d7e70de41cf947e495527ef77844ae94564da8c1f6cbd7711ec9d5ade4befbcd63577d8ddb40e9c20b9cb44f6c44128279b897d1882be5836c003045299d4f6917d5a9444f7dd6ea87a47e45c2b1cb5bf07fc15f05ff155891f334241d47e6de20297a8f73c71ee712638c48bae73ef5da3b60fb3a4568fbfa9c8724e5b16b8bbda59881b4c0b60a9ce37f444a8f521a7422629216e31c17430cf6e1cbb37229c675f961805db28b52461be3b0e2675f3ff545342d22d9be7eacf805a5bebab221de2f1c714e7f962cecc3136708d8607ffc9e97fa250fc718638c92892dfb0d870efadd9110ef0b0dc6ed9570dad7c8d8c4991b39276adde5f9dd3ba0e655bfd578aca0f92c14d8c52af259cddb3ccdc7f28febc792f38bd47c2c9f1f4b16a1f99aa7a1f99aafc6bd158df736ab55f6355e4ff6395dd830bed815e4adeca7c792df1057967d3cca3e22651f5fd94758f6dc0105d18ffef64ae67336091bc624377375a064e38b73b23f22a91001953b80cb54d4e0e46ecea9bcf88ab00e0576651f8f3c2297caa62633a1069b7d84c5a32cbe1ce63c363e6357e65d50121b7ff39dc7aea024356ff33fcd2efadb1b99cfb1cb25538359e6c58b4e0d667fe345256f65fdc439d9db2736f4d8f55815e6b1f1993b71b39accb5dcccc6c7dcea21ebb254562359a9140747514abcd9472bd973ef6431cacd22d2cdb2d8cd966ef629f757efb016249c64bfcdae73270d6636d9d764ff63c93aacc1ec539fbf1acc825061fd437fddec57701efbb1e4772a380f4df745e6738f84fe369f7b76651f93344f7c792bfbec6351eff867df429665bfd9dc60e5a7b28f32c27ae71b94aff26c4da18b1637662922d916062c7f0b2366f00136858c1a38b1f9828c3167a290682a23adbdb93b1aecf7175ea7bfa7ff41321be3a8fe7a7c49f9f5a57cff86fce537246bf538cff2d21217529a5c8004931f5c74872ab864b1444509052efa35f43bd65564c75a64340be552f6a9dd65fae1244175eb072a61fd0bf374cc2f8d652e8d63d0e0d2681497304fd56c0d730f91ceaf63f18bb203aa35935559b5d64f887b9a6fa87bee8754bf3d11ab3e914be5b1ea7744a87bd51114d8057a8b3e065060d7f628b04bbeea1b1a7a6fd1efe813b9b8f03b50b2318973e81f913726d1efb8a4f2885c9d47e43281066b69de841a6c18938c62fe542a3ddd2aa5094ae2c9efbc1454833455449fa68d388776ac0af3a89eb613977eecd298e43caaefebb8e4ade02da898d420fd1f2696359f6f5fc914e43c5b8aaea21395b6525f68355a6bcdbed62ea244b3ad185b8d8f4ac91e9137b4b7b1b02a5650ca95429515e86743495668a209a5d80437ddec23c23cec6a69b90c25a2d870c6184b701deff84b59737fba8b1a8c58d81b979fd7f0275fadfe75bce56f93d870f5e3bfa377fc431cf07a7b0ef3f90e6bb067f8cfddd4ee77d8c6e2efdb1e0de7c4e78ebf7e818decc3429379b5aa8d83c3e3eb2bb1d6ff3971eee4712b30fb68ba87f115f95f38dc0ab89928a61b4c6fa94936966531c60aab32d628b32863f42a1be38414aaa337d406de94bd13ab33f64e3e7166b5ab97af1b5388818dafcb379c4e148a2ed96263606e7c8260c10c442c3184d197150a6230628a1498000c1042d0c4a26e3424aac4188b95259820c3b44617333590a108337e90414c18559a7452548162b52370461872c2c684892724524ba836766a29622ed0747ec7aade7e334866a2dc6c065bffd64e38fe8e17c6d2cb59d2609f9942176be372963494c882461a691071a3ec52e892060f37ce0e052e43091ec69821c39727c6b8985b5d0a5dd298e1c6dfb2997596659c49cf22a70a5fb8fd91065b8c11033d6cb035c6d8277b3d6cb0f503bd1546331dd5496eb4dde4c6767223371846273a7d34956cf11967e35900a5f7d1337f84dee12c68bcee9c21ce9d5c121ab059e6cbb433ce389f36dff48e6644aae6014080a90d4e041861e7fc95f3b8fc9ff371789b7aa02052f42bfdc29ede66e7a4f5b51884d1bb52bfea56cc6ee00810e7e6379ddf6450e340cf39bf23dabb50efe41c7f1a7ae0ceaf1be8ab49cef1ffc09ddfd589a64c94282512f1a116bb9ecbff1d3dca16695c5d6c7cc9b2f63b3f5183207694418c7245a81b76518702bb6294cbd564637324722828b6a74999262565b4acd88e30e404bbb2655a7043904989520e3290c10d46408cf962c6134844797203146658c10513e7c5464bd209430a23c84c2be894de4a3d2118c515518a3257ca24dd9acb59ca98c06bb8b0f423d75df7b14ce8efbe84a1bb35c86d5cdfd4e7394420d96b5ed8606e26a5dc4a94c52eb2b1e2ca18b026446851c2666255e41003580e4b1451849308a2c0c890022e579c81648309102560c26509a6460abe88d0f4a487199438a185051010530329638089014b962972069cd2d4c2a96a937226b7e8e9d1000c57bc48c1c41532d8a1871765be5c21c30c6e08814b043ea83422409c1bcbaddc293618b14c94588604654a70fbab530d4ea6ebbf49fa621f11ae3f85b10f0d8d729d52a4eb1f44c96ead3467f6292772cd2feca6eb4b0d7a758a790fda9c939bd3e98b538dd3ac5f2b798bd20667f6f59bbee81145a22f0aa31ed7424861eda402cef167513a979a2727693279994fbd43664e33d75dccf5283a7b2af54e38557063d30a0b6ec8f99c73aa807dfa7a7c79cbe9c4d2a04f26facda5275ec9362f77403109e7f87b079442978d9ba5ab4ee08c62134c834e5fd4a34e38e7a3af06bd9fda89beae7f102aacc6bdb63e7a4d094a52b5eff156ff0f4d11a2bffdd094a12942dccf1f1a5a79ebcbbe21f01b7a551af6cccfbe087ded43a221496df215bbdd1de57637958eb592c7584b2e9c4dc2768c917a48b4a73f3d24a9afd9cf7780168da608695f8479c39064dfea68f6c71ad2609fd060cb1f60fa1ba9bf5f0d73d2511bc8578c3991f2d5607c6f58bf622c7e41cc57073981bd1a7c49a794104ad7b78f491af42051d8902a0551b22195d49b31aae43c5c3da44ad77b3061439d98c77ac78a0cdcf267a283e561f5c3f5cf86b8e0f50935bf23f3ba951e4bd8889f742b0dfabb674a41a208a264fdbfc1f841966c7f2958b15dd4450d761785b0b18ae714e1ce8f46ecd377ce39e50f6970a6660cc1a4efcef2ccfd13da3abebc359f7dea786bfed3fcd014eda750f7f61bb2de9adf75df104d4afb865253fb94d5361a8fe54ff3ecea3c96d37c1f12bb7584415656add90644cc3052b973ce39936ae62a4c60fe261f0b9bbaa14442f3dc771e12fbaaeeb77700cd73538468b84fe521e9563dbf07109645247bffec63fd34384760f933f7f4e5ff00637f7e84cd8f45f3a35173de0a5eea93b2b91ab2f734dac879ea0b76e4ccbf01cce9659b840d7ddcfe6dd29045c9a26452b2a4cc4ab6348d32a62c4a462553caae6458b22d938669349b4ca34943774041333b8ac16652b2284f44b9fda137a1c239fd73c29a2727691e1131af34c1727bc266d2b43295e652f74fdfd1567043cedd9d0afbc4fb328d7b644e6f46e19c862d492a6cf75f7a80c8b37df3c85bfd3d3da98f81b6b2a27eb0286e6713d6837e3f6ee84dee8479ab630d9eb16da5a93418a409ebb449d91827ac4e970ac1c2aa629c5ab8457b3461c3c9d4bd64abb576324da6d964eb2afbbc5c4aa9d1a54f85fc35eddd3ff5596fd11e303b9b34a7f6f8ec1f72734bd3fdbed9e42daa79f425141b6f503799b04a2578d0e3049655e9d7ec0718a6e9447f3ed19f4cb36904af951aa49ff22292b7e8cf08ec93c9708fcccb03b7e8ffb01ae29160c1a5505cfa610f45e21e99379c4cb0b98573688f25786c8de486442c126436b744ef07133b9ba6101c6cd3e7589d525ec40f12031b848beda20661ec23c29d4551ca8df1a706ab4383a2245e94bcac283591317e52924129895192d4d74fb2bde6f1c85b11a9fa6b71f9753618e744f9f2e215039518cc74f4262f609e942214e7c4973159859b9c9053482d37fec6044314189ca27717af2231eeed2fc905e6e43253519394e2eeee1d90bf77419993cc254cbe226c93301963f14a348a31caf657efc48f4646ee31e771a19271817322755db12c126e05e65702df0ee52bfe945658fe95e59f8c2935181f080c361e7d428eb0a17cbd9c27fb962ff9921d3bc80c6c7f902c6c7f102cac671f6794714a8ed1a373eeedd4c116495a18ad5c1a97b0d8ba3df7d4e657f016fd5a797e742798bc3489606212a54d977ec64d24972c6b3035f1ee80baaf7a5c12fb8870e9c718fba42ead4f97e4a76a58594ca2f4e39525a62d4dbd6373e9472ff4a3537c6a9ee8a29f394b24ca8599d93e8d1712d198a0faec4b507df644d7bd508643973fe5857f53af7961bc9ac6ffd344973d17fad6780bd7fe8f6fd2f33cee0ea8fb6c83f469bed83036b9f4c3265138cf23ece5440a87ecc45e56701e1dfb14a4e32dfe1104eb5861eb3db2e15fca5f102f96ff41e7999fc4b5ea083058566198b921460858505230f08e128fd58ec7f91932c2992ca4a0c20ba428964c510032c4706192a1862ea66c516dd1a355f1b1e482131c41010ba2cc0c834608ce0c0115c50c61ecb04309ebb12d6052841105c5218b2c8a86a8228608ccd4300651121929f04207a333cc8ca1a572b94a5a2c0c1334cc95ee51a2aeced01b681266382b21c433d59f50a3069b156a9051032a09c7a487a8c6531a6c6da426e59849ed046a5c7143561262fb53e3ca0dd6368f4c593586b0330a6fd1d31346086de330477050504992f91338379663213a3d21146d6a8ce0888d3d566622193b068fde520ba1775434cfffc2d01a2b38cfea999598b9fefb03310f6f5c67e39c31dc302ef9cb465caab55110799ac97b09333dc1b402a623707cd821b8dd506e770fb75b088f71abdf86d6e60b57b11794f378156ef53b51a7702db73fc639fd1f1ca1e37bb5b25687c7dc42c213ae27b945b923f27c73290b35f4db3df613f398c77e94943c7f4a29ed8ec877fded17dbbfafca8b97c65345a949ee8b0c6eda02dc4b182730dcd41719a43fb578a9c7aaf5585ccae2521697b2b8e4c1034ca85f6470ce3ba5dfe81a271b8d938dd6a79cd2bf3b96097d80fce174ab1fc72661431c1e4d6ca8739bc76d213d3ceaf58fab29ef86274e0801c9adc9dd38e44525c8ae7ca1a49d403e91b4a5a6c5188184a6f51527ac7ea5c60d349420c392162ec8f490c3144b6c700236c619435ce122068a15230410cfc286ae055a743418b686198c8852832d6268f08222a0a09283136646c0c3981d3629c69c0088a6020eec8045152ab498d28498061869f184166b301162c91524988b51834609277ce8c1cc13142f687082c312666290c4e48b2dc4346562b4e8c0abaca1445b8387cb142b5708d1c58a2c4014bdaa28a2063e14a920cc6b861181269d10dd20a58aa727315346e0b4803356f040c6992c5a804418b38c1c5a122b2530a68061e1625421439830be24c1e589eb0b13402982063cf040050c19a4c0f8d2511961c80967d650236a818373268a86cc0bbb5dce7266cc0d3959e994be62926997b39c01a3544311b7a59eb39aaaaae75a5575dbbc9f214144ae0dd409ff674850eae5833ada7391e352cf79ecaa4595c8dba3b0e6d79abd10f7d9cfcfb6afdf90f6db0fa59e7b22577ceb4f947d7da1ecebd3afdfd014fa09d5f76fa8bffe907fa6792cf944ae94c7a2df1121ed534750908f0114d8e59ffa8686b42d7c17b73dbbfc650b2f18798bc8a555155a78c1795cbe1115b2af9f84fb2aa7a2b79ca1ae64c7a31370b0f27d8a5037a5aabe21feac6565dcd01421d5ebe850f9ee158140f54852aa6fcafceeb90f75b8741f473f852adbc7ca521f2be3b822a9efbefb90709fd5b4ef27b5d10f3ad7bdda5577777773d7eeeeeeeeeeeeef8bd82e27cd6ab26aab46a3d9a454fcc4501c65c408e7c46a6ae39c93466c38ce8dd8749b5313377193916ef0074fd9f86495116f39d1d84c4747e7dbc056173016b72280798cb011f985ff71519a74eca553724fa7ec38b6ca3f23917dd8d6646ce49b9de66aabb1a1ad5d041c61641ae126231af73ad52eddd8dcf0daa364e4860d8e95cecb8ac326474c7946dce658f5581d1d230d4a233a55e72bff66a332c24d46d8a703287a7b70b575b749b9e8458f1514bf30daeeae52de4d4300e778f37af079de8e9b903bc222213220ba401603a2eb678bcc711d17bd23f5ba30bd6c09ead1f171c3d51768984e20ba42c076f739690b76de1b8e6b2eb30ee845dbdd5506dd9abbdd709135c44aae0eccef00fd1bf3a663f1bca177bb7163e3866cebc4869967c671ef34556e6aa91338875f888fa879d912d4a373434a29a594de9d3ce9cb3927c7b930eff4c28ca6b8b96ddcdc6cb417e660f1173987573ab80db81d1e5c0e380074073577be94525a779ffe1e0f9ca5eb42df8f73f8ad5c173ece839ba4065fca9dfefd3408bb2ef4e5c119531c6ee585f4b217a6724c16071ce0b8118b5ee8c09bf346c79a37ddd782b778ce399f99f98699b9795b5c0f9071742cbed1b178fe16e79c76ce3a3fff06c0f9e072b838008ebb397372e4f3fc2a203947c7621c1d8b6d8d3ffe4c8f24cb1107c70dbef12a6d3ec0e23531c628339aaae9802aad4b7d5c58ae4300e7f0f3f838e7e3a227c089e043a75add58ce0739c218db3a71843196c1cd65aa8b1b0de7eeee2ea5942e4cfe4ac3e4a35afe9c1e9ad6b8bbf37477772941bf11e1071b471863f9c68a83f3849053ce8cd62ab366c381e386d6dd9981eb34cb341a418d031ff4306f4839658c5fe49cd9545299bd4d967d8c5926e9d19cb26a32fbb694529fd25dbebbbb17011d1d11ef4a6d02c91e0e98393a20f9386aa6d2bad49c91c13b79c62ede5417af46277529abd797ca1ab945ffc6a35f73812b6b6cfadb74983922e7500f90c0c3d2cc6895f3886619ad475366f4c829a355ce8cd6239a65b41e4d99d12327396b26279db266f4089c72ca5933ea3465cde851736bbe8d372d70ddfda325e2349f00345420a7b3a65435363672ecf833b1537c8a4bec372e718e941a1c3872dcb8520ec915a783e3fc664a29ab0edec041392425cb866969e9c10f92b8c1e2b179fe50bb353597d9c663b6de0e8e03770e3aa0fa1c00802656c3ed282395b2ce1c00e0987d54dc7d08601f9fbf02c106e1c13c11291aa57869696929b67fec1109090989524a297d7f1d7483fa4522a0fac9068d96eadfaac24a47e4e82a29678e0ea8e2907fc3dd9bd58e077f74866c2aafeff67544dc4b182730c41863b3bb4aa552a9b22ccbb22ccbb28cce39e774970cca21293f5774ddb8b1d12e296d0bd6d9f56d24c8014af7d19648a841aebceebd0e48f59ee6417d811f021bc780d487fc82cb1fc43e9a9191119db12816656f71ae0a4334343434aa2e0997fa56d4a8c8c828870a43ece48423a829882138dce3643db2162cbf90e64162a71683a04204d2d91bbd519224750b18fe139a272ec5a54991544042ba911925895e6e6abc9e20747af4084044aadbe5d7188468a4695a8c4b316623000c72554e09726007241f6cc95af33a9c5d468a461148ffafc215537f9c8281f483f1e202cee99b8e8479fd8b4b3e008e9dc7e6376b3dba06e08393926b6c10ec83cb5100580d6c7c1b4a3c13a00c1b9f9f15603720249820b91a45d77b5861c3d5e51e55d8b09ae0c59661f9ab0eceaeca39ed1f01bad8f02fbff513d408c586b140832bc11037cb5261b00347c89d2104605e31d9cb9d5072b8538a3bbf5a285ceefcd50e29b8f31fdca18a3b5f870720eefc9ede61261ed2b8f37fb6dc3999a2a471271309aab853cae8c1c6c872f86ae52ada1e0bde40536b14cc081c35cb8dce0d773c3183670444c060b8fd373aa07e6bbbbb61f0c4edeebee9805cf21327ae7c1b1d90ac2e788282dbdf6f53b75021821da21081d3edafc1c27d71fb653bb972fbad7d41ac82a603eaaac572373a2cb13a4059d5eb4f4c31c64627bb84e0cc956f738822043f5cf9dcca0a1d6e6c02607a9579a596c850693fae48030721aefc6aaf1c55679fc85dd96587997080ddc0c4954fed12966e72f9bafc0d85804da6b0c187dbffa00d576ebfce0d2568d2c3ed97d676b79632b67b8250b707e0ca6734a4b5542c61abad9c6d2f1d83e6a1c66da61aba3031615a8245471d29a8bf316bbfc5e99ed2adbff59c50b74e300dd6a7f9855b55935b26396fbaf5a73745101a864a61b73ab18f08b7fe7c527da9ee0b69d1addc1752a35b9fbf708ab9f58330d9ecc3e914c574da2085185866ba7c8330616951ef24b14ff3f56993d4e7b1aa555a63b2fe4fbba0b0f5c3e9e431263da4b0f3f3a406ad379f64379d1aacdf038ae53b9d38a77e8f1dac1711c53835257d24c33e4d44151d06fbc45bdf9390ea3b0ecc53bfd188623008918808e48cb8b37dfd2623eecc5f05e126087d0497865b3d86facd450b370c7827f5f5db8a08426cd25318ca8b2f4d986a1276891614000536fe566d10a1ff33030bb5557f9a2fd2cf0aa26115a9f66bbeca2efbd9a7f922b6e6693e162d62f3f66d3e96663f167dae9af7361e58f37feb4fa8fa33aafe74aa3f9fea53afc7fbf1567d1aef8714f67b6efd9c2e6c7c111141985ebaea85084ae973549b5bb7cde9657a9973d2169a4410e28bfbc2aed3ea73dc9af3ebdc3c875b53cf3fbf60b0bef426170cd60fc3ad5704613a4520f5eb8cbaf5c3b8c4ad65dcba05e7d40fa5e43e9e9ff26a83f3839c272679abfef685b5562dc979a693b7aa53ad355c55fae29caafd788175a55a6595b2ca2a6bea63ce91cf38f5ab4075d2f1dabca6a7c116cee54ce37ccc0e48ab9f7aed53f17990b12108eab08f75ed43323465b282b447815ddacfaf4809aa3b3f9073fc5d50587685f52aa99a36e7d73bdd919c0897020406ab0336e8f51aa03ac8814bd65630296b22d6300f47f78e579a898b2ed75ed99abd8ab8daa2ed954aa55c3f239cc06d469084609eed65d8465c196b52ae24bc82b72494511735d364c28bb29a559d1e1fe22df93f294da7e7a763add4494149b44f75a06475640734d4a06c507eeaa9a99b9a8beca631aebc1a654a424f59e567f27f2cd98e05a1c28ba8141bcf1aae412f5b2e3f53165b2edbb8fc851fb83743b4d7df0e322c01a60ba8d48dd63539e9d49440000000e314002028140c0744229150282414f4c4f914800d78a0427e5a994aa42089519032081963083000180032323232449b01b655d0cca8acfe0c6d19886e316863f4ead31d4439498c04f9dac08515a228d8ac5444984e701bac254f6a8ba6a04944191df59b8e5a007da5d788583768bd07e7e7f0ded9a5a80caed74ce766de4f2df3d68ec370584eaaf09544d2bcec267b07b4971297dabb5b135db9007c9d7d0bf97e30eb81ad68dd8f0454cf4940ffffab2000ba87ecd015dada4304a92a0d9a7d754c4515c692dad6a07573ad236af51e91aa75e9277259d5c846841add69aa988f4170c9adaa7ac6810378f9793be08a6455a48875bd52177b0eb56e908491ffa0adb02868af8912e5b4d6a7485c4da194817a5a9f288d7cb540c1c530ebc88a77b7e89c6ec63354485caa7913ccd88268d8dfa6ccc96912706402c7e22a291978a510b2955b5cf7a810103709ab3c6c47d0ac9609d15fdb35878084132a6d3d6e704eb3c6c10987c2c2e2a8e4d911f29faa9122dcf504833bbdfd919671440bcdb6bff547b9e13cee86b90db84ae29a3133901c4e30dc6ea7a54de00d98d68beea6a18f798956f2ea69f043df823b10984a8a9ccbd1b53da5185b015e705fd316f11dbbaf89a5d92c5d45876ededf3d6b36f2db916151dc323b7f12b4da3e05ada94047d404321065bd14740c8cbef53c8db900f543fcb7bfb13d8c8eba551da380964c43e6be3ba903408be1bc40604dd6340e6f62ea0577ad3d4266f395584da92b0983125d19e7ca2be4359bf923b804467d0af8e392fdabfe2d32489a6e7c6626b72c1bc630b6f36789e9548ef09bcc00fa87db10477a5ec095d12b365d8286c283080099a0d72306d8e312deb80dc90e48ad755f5718a9f88196a902a20ff5643e39a4f68d39b35cebd4c4961b012047b5db198300ee5a81babd28d53f52a65e4b7285c0004b6102ce90b741f7cb8fc4749380a8e1dd40f61320ff199aae4af120dd835ad1aa74a9c747373635ab8adf5cc69540a43956b73681bb621096b02a23d59b99524f3fe9233328294fd8e811fface1e4615e813eb37ab83563069cfe2dde00529fd2073b776ec35e4d3f84532ab7453a437b58ea06e8ba846632624e9834e5b54cbb1d72d6641dac7e5dde4e8ef38fb1601012de257bc901a466fc40171630b1b4ddcdcb011854696bb079d374511e5ac195daaef218aca292bfb17e9398735c2739f2dfee54ed18cdc17d75bc3b109d096f958301784fa2752a9fc4a5d94bcf8037a036632a80e8f143026841fe943a391836c89e8c5649b77a3fcbe536c617d54f359c1ce9f24a342ac4ecda8607d8d9074f7a107bab8227127e274391893347cddc01e068b4c879420009bdc0bcf79f40effaf801a1f97a546a40ff3a82eb0a9279e030ea0bb8ee95817262c9f7540bed5dff2628ac358e425fe3ce5155f9c9d732895387c7a6c672cd6164da2d2cce0288157635bc87a097a828f245860aa805704d8e305fa880c93200e3a504a4c540af066b2e1be8779f3b254d32a62434672329e346f21a1f657e8b898eae53780b7f7a8ce100d38ab615c0f1d74f7aeb7e3d49a1e8fe4d4f132410f08688cecff890315f1a80fe040260037ae93f932ada5c7e0edc4f425d8234fc9a3510f91840a8c6a3b1fb7e0d847dd720978c2a70b1eade07e7bb50c95d2f40cd21b533494e656517a0091663ab57c46f004321828a450550de3a782e7813c7267b5614bb95157485c8676114c91f825f44ef2590491fdd8d7d3a19f7564788167d6db50fa238e919fe66c84240094c400d15c8e9541465254d6356d0f9818319212c42a8beec7c763e811e8ccbeaea56ffff1e4ef83d81b5a7a8a6fc5e3fb81801d99657e74cfdec4debfdd1f9ea0cedbcd099ba9bdadbc176d56c3f6958688296836e3256f7ff9715b8a76121d58fa23c320184e334c2307b5a8c757cf66faead3953c02cd21217a549acce1974906461ac56839bdf4a48aad89d2d5c84ebb0c1060b53499617b2ac3b3c420d150942a206b5fab9ae8c0a135326e804b0e8beb5cc97438592e0d1762db63ce69aa23520109d6b5a02e54b5b4dfd7a8dd7c2405e1c641be69dc2d0f0bba946b6d7f7f16360380941975f1998697cf3284399eaf9f4ad5ed14ecb68d8ff626338dedadca1bde3898827985322c9c1f38067f80e05f90dc629e8fbe7d00a4e6045ec18a6cfbf74536b5cefa76a997482cf148bc04b5e144e34c14a1e5ee5bc9c5589b669059272ab7e6727b01aafbca00217d3fd0d6aa8ac1754a0bf3725c616f0cf788d4cb05a736920cd453123e2f4c20af302f3f892fbfbbbafe3e7d09f2c8102e9815716c376d948e95684649fe334e26cdffc9a18986a18b786698816961e466aff96e9c7efc6d2f1a71ee69e8cb9e7d86cfe8507866804eebb194f91c3589fa151e24dac651c9486c8733e457b927438403c6a2c2f91635adab7132505a791546e19fc11f80e53e1fe6c974de0be2049d35c96f4183ece105675aee63a368576020029fef2c81b30f7dbbe1992e8a8cf7fd923080d9cecb32a6962d0a6e4bb4d039abf826843e5d716942c57f70bcd1957ec1fe833682278cfba280a7890eef30d880396409a54c869cfe4492993c547c4fe0d81f161acd56d779b0031e0be8a10dd8f92c190b44d480dbc6240a33436f227fc1d2804af1421476a104efb48d9570a0efaf0db2a590d3233a2c46b37b05936819e4694f836edb1e9dd40f85fd743da37357dbcc665823d5a9be1a46585af9e221de97bfc3858a84ac55ce73af8df6baae1c45c404b36c10df8cda53de6cca732c472496a450e090819c68890501366e5f6edebfe57ffa1ff3a7707436dfee71f38ef5376fa1ff6d790e896cfc67bc3964da1d233d6011aecf0ec55b5267937edc5f66aaca6cee23b3d64a6cd435a10268e742d0e009c5bec46890b0525fae8a3267c0f3852dd4900fc661cb06c15cbda87c7d04cb97f7d152ebfd815c885be1171cc8471caa37800bb73ec1ac20f29731ebfd2382643731b879f97fc1526cee14ad0e9849085a0ba43ab293aea12a7485bc48bcc99c1b45bee0c179741b237b8d168d9495ea85356ea61d8e2daf14b567838370e3cada4317a849ac9a05d870568de23290f88d28078778e4252efe7737691c9281f12d044c9c0a97f886a7805a3d7dc618a7eec034623fb2cfb4850f0420acab38f1ff6d6ad4e0222f6faf16b36136127cb3514fb34f2ac28b21e90908f956ab158a768c7eaf33b83d1b47e402e22acdd1e784b187105e218738754ed941e943aa7f5bf2a96c9b6c1600f7331478a0944a36a82cf7df13408dc525c835986b33b70efe298cabc023f6a6d5c6262aa7cf591408cfd914839cd25c6bbeb9d7d3f9af5f20d0926af6beaa567a1af7fe831346907c7118e3416c5fa3d129823b6885812f095e495c37ea68d5500f07d808ad6c9f482c34002e8add497030787fac989b14055b498ded17233b5e360245c1018ea9459831234425099517415c8f2235f81ed0a398c77a3d2cebc0d899385e26f1b80a85399368dca0bd843c97caa7195411eaf1c660716c9438cc498a8a0fd12325dfe3328b5d49ead7b604348b92c4b6342439e1bf63990667bb84c3162f6f2eb14011349256f7abd4b45185268d9f9d4eb8dbbe4cb7e77d3a02cb29dd6ab7471c11a40b45281ff9806b0b22382f86eaf14bcc03359e04ccd7691f5d1498a054535532c503279831819e50f3f84a8b77ba9c89a88c0d1c41b8efbc455e8e001b4b8f85c6e7eed12f13ffbd2b5ac95256082c9c515427873ec7ba6fc493fc1c4d8da872ea3d7c4e4d04d96cdab164f0b34f9210ab945d465a115d52ba1faed41b91a42e15fac9ac19fe2d9d036d4339650be2019c693d69556d3aaa88557b4ddf1c87d15ba3178ab277dee6f23f588498e63a590a1d2bcd783a49d68b842a96d808f6e1e5957e9d2fd54808cf6032bf634e17bf71d754117ee7d0e01f2281ff92dedd7c737293848e39a497cd7be5a36d01f3735d5ee7b87b4ceee6a29c9fabd6f3077a6b3fb5298a6ace2502abd7d83cb801d7a306159d488f000706ca6c6fbbb111107084ae18cf5d170cc9e42678cfc8107e9169b2d3744f441bad18a5ae07848f02c9d18c696495b5a28c82fd5b7cb63a4aab58ad46a8320a77e23b123b6dfac5385f7a154d12b5733c84ea3bfe616066f6062b40a8f0a5ff588a88924419e755d8f9e7fac9c0410fc28926869644882ac6246e0f5f8ccd8b24a9881f3b7dbce5c24b0258b8907a3d2d6b630e569317f29b6d1d97689257caba310a9e058bf71436689aa47441a0bf52d44ee3fd1f06fedcf01c9f53819f51189db52a5a5bf9bf45bbfbdb332b1c84e05713d171bd77e39e4bc74601570d6379a48943c59ad65066354cc581282c18100e435738e6056fa201290225e2f9e0a79c66c37098464435cc46d5dee378a59819e96f7ccd32759a0afbe934c7b069697eb62fca74110680926254f2c91d0a20c2df90bc90061a2c11f574df8f62311eb3d1f050becc8b6542c4f943371c24db3b87c3ffda7dc9e3b6bbfec1de3ca6964cc88f19ef96c504816c00cf096448ca005dcde0785f19402937c875c23e989a2e92a793f5a6934778469a046c4e0ed3c3d6331115cde51c27dbe99141fbedd194275e2471a369c41b84624717ff5c8a1ba3213d4660cc1c141f6b79043341b332c4921a7b2d6f3399e9898c85c81a90b22bd81fa32bc6b3a458e28784f8551095350689f5e9fe10ffb11af4220fa7fbdcbbe17c20f2f06241f433730f3bb922af9c7dd472d8b62810fcf38494482af3041e9c5e70bc1ada36d87e3501c99925c8ec22b6893705a386bdcfab272f3639f070a7ef3d8bbb8feeeb2cd2d0cde18e03a04e49cf64994970146f48834ccbde90c71d7ac88fac54938fe0e8fecde764f344ec68fda4c822104f0f4f9f60984a5fb80d03b1a2cb592ec8af386d6b86594273c4e75bf43e7400be68c9385b4be35a426fb3766df371edb4d9e2f6b323dfee7a525746e8ce37849438cbae69da2b4007ba369d2735a7a4cb33c165fe912ac3381ccdd2d795716184f90e78f38c1ea1a595cd5b7cab1f052109d150db1885f8a5d702c7e80bf4eb7f52263d023a6aaf82bafa05f17025b4754e55dcc01c4f2601610b61e4114325e9242136035c604255c96bf185f46781420d1c1b543f2020898d9201cca492af4069b5719240ee0561d40592d0aff7f0a0f5474bd7f4160115ac18b6c7cbf6087efd182a6113fd4b0caf488b3b6b00fffd29aa012f8a16b09a8eb66df19d845ba350173c21c51972ee44250bfc61351226c4da44d70ad61defdedf749954e8d82a33f2450e479aa3619acd188727bcacc7bb8f2ce74b29a181e52dc9533133211bbf08d478c899a7de7d77883445c72c44442227a134e3a9d14dd8238e9d797c0dcdbe7179c30a9e26a4c69bdd0b82828ae2cb20279da3e7d0a9ef4803d7965b89ac7bf69d2c9af16c36e29b0c3c655aef3bf06284fe86105fa804eb6a44b196032f36218e610e451d0f024899f6c23859d928954d7c7bc06f457f7500a7855076d263db1a11cb5d178a331f6a8ecf995df70fce3b9b3b5ce1384a3fd417072722434264795b5e4e4c6675dda1eb591d5fdf854ef52e080b6596b200b4bd6f8dffb9bb8eb5fa14a7bd4e46ed688e43b6c88808847d0c834f870072dbd18af6922f83477bb1706ebfdbb349d1510e0a2f92e1a38b5007ee844e8847b5d376b98706b8f1a870d672bb387641df12d61b24a403b58f6ef2180a21a57342b2b38d9d08c70ab326ebf26ecb1e43badd7898ddfde6a105250e77d9edd143a2f1bb91d4c28b1cd5274c58cd849da4b65c5b2335dada0bca21fc92339d0590d23710b63d8d851e5e1eb714bd0275e1f2cc3172a3c7e24c0f219a4a923d5f06faeb4a4fa4a3cccce6c019bc361dd15dcdaaff7b2bcda2a8c7e6530895335546737e718259f0a18597c1c3ba76e574f15ac504d1759c90155227e2088bdcdf1c4a1c6a230cc43b1857a1c19e246101c0c1ba123f6f6b0c6be7ce06c57d58dde676fde506b94177803252b749bfe044390942afc1a5b5529a4f8089363a2363d2f77e588fdabbaf721233fdb468cc6997984d54e8796eb4d4d8b18baa703c4c43e236b426bffba35ea4cdce4e2d7bde3e077b49cefb64b5b74fd2ad50d321e1dc44c4996bac7aa8870887374fcc16707b5e963d5eb0816ea15f1f496c25f7426289973b0bbb56e105bf0079e1a59bf80b0b229815568c1e20085f6f9bffe370d6fbef35160a23206aaa1d77b7c4669245a58499596f24ca2e1cfa3377946672f4911eaafc48a1d66815eb7f2fbde82cfb6e08270df0f061a8b8f562b91578d46042c08bcfd2cb6529f39aba8a74391c81086fb0c0fe122a80ee0d301821023d458d0ffd704fa153e8f7b3a5c81b8f329b62834e0c55e6f5473d8cb10e3e9b06c5d23d892d93a1a3594b5e552993fcaceb5bce41272ede1cbfd52d55dcfc8a57f7bfcf8d076279791ca59b27168cf1354fe7a858246f4f73d1036e59ce7fba114a61076e4a2f7cc6dd54fa928017cb8ed5d324e4aca1b1c60faf971184f1c89f9bad76f1aa3b5aaa0a24187dae22426f69b0c60ff654f9d4d9fb87a5f392eb0aa2f6607a525142e3bc4ec8a019c1eb5116ce84f2ded0d18c522f31c1f034ae96efea7ba745e78d92c39e2a78cb7b789c363ec6e7826f70ab580432ec942cbf01d0d4e81640115d770ee3272882e7eda9d0bdfedd37b0532fd098389cc8b1e50f8f4d845fe4a4672224804a2eb76b2d0d1472a5c64750aa4611bc7e0655d2f5d1324c5293c96c1ef42d666adcb4c5af68a77a0181cff8b33bb3c33ac17baf8d20cb501cd86a765e15b4e209db700bdfcff53f3b9bca7c7027aff72045baa153616897f9130e85ea6836fcd22920990203a46e92b527d1429d1f19dda8d51552419ce6651a4484bf877d10d3722a5d0d15d1d8dbfca6bd41cc2932b8c4f6f8db8905e424b137dbe2541e2596f25d4e1ebd0818f441c9108711afa429d42bc386a201ef11bb1f1ace7c375f8828b544e3a293b3e6cd412457aaf40cf967f0a040efba214e63697bbc909e9d51a900063852778177680440825ba168385739e1865f360135aa9bba2370fd0e830d96b81b1b4d4af08ecf71743612ae663cbf2f6f9c9e63c2aa0729cbfe5128f47d3ea826871248ac449c03ff4867b1c1bcc57a0c38960cafe2b1d5062ea6f0b357eea7c405bca321d1ced3e502a55195e71ee6f8c5e67bb1042495cf16b95edda60413eaa7be59ffba7e2fd392596a9bf4a0ff40549ac718ad1b6d4529c092b027552ebfb481d0f45ecc6eb7f3bb8474a8b7b1bf767aebdc0375d300d20462de5eae564e4d0349715241987fef4129b9f64d9a51b0938e42052ef4f39934eeb6da4e3a1bbbefd04881249ae45440b93ee38ccf71aaa38e0e0f81524073c295f9bd38b4869fc501941e3e3716c64e18436c17035cbe52102f79fe693dff4c96dc2409968d9381fb3f8beb2fabfc31625c867ea0634f23a1ef4dba23815c701941122cb4590e1c734b0bbf31dd25a08694c3bc58667d19eb05479c7d08d58d0da2361842c652e3f978234c67704e91e6631ee36c682f4edccb033b6b19b398e9c9f3df35de859d387841ad2f4e4558a0e36cbb59b4544317c94b037491912b03641cc7bc1b8a6ecb3a1fe214a8f7e9052f2b6299d27232a0d6a0cc9fe67c74716c2a183e0865ffc2cdf14f75952e4f8f75b6c0470abf560c333843447c409f5bbf994d59a807e05c40cb6e00520bf5555d49cba94c2434b5bca69c1e80312c2db6a19c4fa163cbb5f1bf3715daef86b9c85af0cd27817b5f08e45fc08c63506a071d44c02949e3ea1caad2975da85c5a1bcfdc280708f69024e1341057ad6997066055f333632dfd1596c67da72d915eac025a6937d65c3fa70803f3a3ec22469a6dc4e11ad5cb77084e3e6a6697e56a71f57916de5f77475a5061bb0d8a995e09836006902155366fdfb980ec9cf07b95f07886dee88dbbf841e300f11dbcaf822061161858fd9b27da1ef4f36dc68c688ebd513916ae715243dd979ce348f2afd4dd54bdb6291a5da1bd73f951c8b7c485447215f122b7aaf886aa7f5018d0a58312809fe1fe59cafcd010acdd05f35f9394978327dfee1c6b3d49d201cd0074184692e8586e34898b8f8b7b89926052dd78d6eb7d91dcc6595359bc26c8237cdf5d65d9b1c2a1b2fbc8d2ad4aa43ea63455595a7c5a0fb6352de98ab8d1699d26b54d169b1d5a0c04daf1f91fbfb813df0bf57416f0d394330da4ef53c26512ed34ce5dc87858685827e53ca4461746b29edc27e303f1835f1e4c8079c27e2846000120ffe870e049eeaa774093114c0b50bffa664051c22140fbc68eef01e269145feaf811acc64d67ac9a8266b5d59eb93c5017aca4b18b755bf58adbe121d3f7eb019bfe08ea42a482794a4138aa24229630765d27ee3a42682b75c5890a263130af8efd2dc1b22fd781c0e980a64468fdb224d7f7c1bbfd033e23d3f435e9840a93cf5da67ded0051071aace9ea550fee05cf514c36410615440eb2e05d39350dabd3eba6424ef7a2ac4dc5968138679bf702122d5c0ae014a9a738fa4a9c98d8970a932232992a7f13e5ef3689d0a396e9860d72db509e148f8dec4f7927c6f3ddf1891046b1221da0ed1dcf4242ce710c51b4699262b82b96c968e89843bb9876734885b2393124e6a465abb644a47fd26d1482393818a91f111e1192f2f6401165fe5a3fe0ddb956dec9b066ec92e9a434dd86ba1b9c535d80d494e45373b868f8ec7890293a4a5336d6e6064d3419b730dd8f63c61e6b265627bdbd945622f6d78a8c277eb81fbe5544c0f90120bfacf8cd45b29f94e1b381926627024d2c63434b310f1f83a52b29ff48640e74f317981934e267ee8e165f43449cf4e1829aed328696e902953cf1c520cd0ca5b26c5799bcb58c50fc8c8c5e36759e7f4acf1057c3adb6ed474924ae226bc38c2aa147c9c4e67eee48c8f7d49fbeccadd638d881a912d779c6caef81d56ad0a35b5687f124cc8057f33a83b62617b5102f5d776396bbb80a02eaa5d7d706005c7ea73ca22c8be995803c9e87b4347a60c4df9c6d0418201c7b7846e0e6c86f8c5f22cd82221ab9b24794ae52ca62d88a4ba883661e9609490830dd83066c1fbfbf8fe887fb55ba53b316b4b7789ad5661193dc1d005bb9691c66a0aae68e123f4d16c91e2fb7f4eb32f38519ffbaeecf3a54f61f73f3ed19cb93d2b5a774ed38824f800f9005b09b7ea9ce4e8a3650136b63351ff3fa6214d668864643100507f8639d43a276eba76fc3c263a17ea2a73bd693ffe01adab0af7b295f487d3ec4db42be15eb4074b8b295e4f6712b009f057532a607dbe92ba637cb8d00f4bc2288189d599654e767f4e7b49398c71c39c095253e0f0f30cc5feee1f11ea51335233217c22fefc6516ab0d30b66722f98d5f8370c1682ba21579679ddc4212b45d55f483717d61aad00d7870068bafb079c58cbc3106997a3a744c18cfb048830f1f46e9bb50e808deecd42b282dc280a1176118b98ccd19b5ce2ecd246b99f49c5654225968cc38777ad3631e33c2f8d0316e545b9628379a2f355628af8b3270d079199ee8f81598847528392c67ade334197c7f69ff42a845f345b050db4db0f4162d9e50e70f64f18ce30d0560514f00d72df9705d350112e71434a7ad063b6ee6b2506e375a609ec7fc590c2d8ca46c2186e78662ae0f11d5afbc4115ddcb46b64cd580777ba0b2f7633c8c19d98f379563b78829e44a32ccb46c0d751831550ee77406c48d789f6a77aaa542265eefb85acd5c7f8fe738563e7eeaef948c921731c0d079f3624786a91b4a9b2a1e31fe3c386132c27e63c6ca54acd39b60ac94671b226ed1d82023a28fdffbd41455b7466bc3effe7b452fd8871e89d6c231a7a591ea3cefe6a248613901035f35412f9c964b02af9dce2a6eefe8d28165b73aa5e29950c08e1c0ac98add84180fe0443b43750360148c0ed0aa880b5c42cbe69877c761f0d4cb2d5a52aafffafaf05892ed4ea810e2db10f907ebf8e8ad15b3fe1fa42ae59d46dd21b19cc6cb485b07ddeee9a1279d6e8666c2c1745817be153d3d4bcd9240853147b1772cc209bafbc0d1b01eec088ef7fd404557f570a3a70aada3454ff928281205a520a192676dbb1a7abc88ac4a0b47748409525420c4d753a3d86fe1ad07edec3e489896ed8e1cb8671d28c54389390b1e831840d2c64235c4e4fe155ceb3d53644344e25d45c0074bc62a241d1f9c690f2bd4955d0b3e37ca8271390c5a3c4d123a0cd298e87228868b39dd462ea2bf446403a76b344911c4bc43b1848fed0b2b15f55053da5b0cd10d2a987655f8df91210fe028c2e20c2146d84a0c14ea7f76c6a1f09e74e32be4406a5961f3f40f999d7ded8a488db65d3c1ae54579ff4ad26a45798d503f0f60d34bb2a18e89cbb11fdbd02d501001128cedd047cd877472847a248e6c3e394ec72e1cbf986a1845646b0841f035e0bcc7bf65c09a821ab877d604db52edd4efe7881b52036e0923cf1dbb0df06626cf08ff3fe9e534a2051dcb5e8cbc60bd3131cfe70b041cf2220b2ca61ed168dd0069db2883157b64ede63bbb6d1805f979e70fd8368a02a4e5628ecd4bca805a2cac3f735d1db9744000439096348107bb5349c1ffec9cc5030168a4378189374b776dd5dee3223d0abbc6b47cff168c135f229416f21391cb898934f3d08995f8ee7facb3e990b0b661ec211bc6a09ff7e9f36650722f41375fdc9eb08d1827d5088bf94e326160ca554a5f4670faf1095bdf6be4bcac79aa02dc954f0728acc85b33ed5e2180ab236da15ac9c52b3844e5a2347bc1e96e514975b7883bb76262641e2424e633df1ed810a70ce22822765ebfc75292daca3556273d1523e01073178e276f6b74e7e83c378257a114d274f766ed5231c7d522de70bd81da5ec3ab6ffa20d6615e0fe2314088d8631642d65b8dc641148f0192a86d613450847c7556d02b8a46d6be842c297063fb637d24736cbda9234457d72508d403dc46752f5efea475293ad0d5588de26c8d81d7f56c572b8027f1dbe0d41d21d594375601d861ec7940410f45122b2de8310b3ddae39eef24cebb6f0bc7ea3bb208441f36f76e0a038ca0599b41d4d195fa46d6e5a63e3d7ec0c9cd4c678b56e3569ba734ed1d1b63a5eeb214ed25a1c56a948ed06ab88ff4c464ea9fd16a298f61b5fdb19c8688b3a6d3a525b1c7335a4de56bba6ae1c833c36b33bf5c0175092015b58843f1a58ee9c05645d3c061631859b819970288c4dd983e46796896949d5b5324aa6c4cba7bd19eea5780d1d9aa442a52e8e95427d51044fab95239c6ffc618c00db714981a159cc850d7b95559a79f5c597d5cb0ad9b7a6e585626d0ee02f8166c821b4c2c4db62dc62c49fce39fca4b7cc271d9baa814898d41c245a46d7015ee09185616830efba3d2ef9c96a6e19ab46a7c52f6b0b2ce413f890fcdb178d0bd58d860dca1269ab9e1a06e5f65261efb4b64406fb291e6d5bafa61f7ba8761ed3db7e79ab49b284a30bde963d9277dede543eea2052294baae8e8c96e8ec6a3d7c1084039610dde7771198d8139279bb153d88ffc0c9a7bef1155ab1b853f9f1e46c3173f53819e6b1eb4164d8320908bccf99a126486154019f6823106b8b9617eb484091ac1a7591aaa35fed25dda7f5d5b1b41c21c957636d558a4dc0e1b578071b50c85f098914b969a564d3864c8c59e6794405cbc3026d1f62d1052f0d6c618beb73afac49732a06aa54e2540e85b36a34ed317ebb1d41df5ebf15e6d941443a12927c3930249295b4ccc3b36614cdca1e5cc45061be6ee2df90b11d5058832f87359f2d312669f9d9ae1f2849bfc39c34b5b1fcbba84314743b7ea4a750aa28d92f2fd6fce85390c17cf175f93dea7f96575acccd568b5586567a675200f13ffe8da573f3e53c7aa1071582864f0228660b75aa7eca0069f2fdba79c2ced70ef31154192caf98f21a4e0b48bb4cf6d8d29c36ac69eb6fbe70f4bdd516af248ba538fdfe4d2bb8ed07455f48e642d3eadc9e3954d6e9fa7460aeebea38547630542d011b4da93808b3819ce1ac0476ba995a70a1c7b0c3549d52dd0aa86d2b91f20e0b321422a97c3a9ddd8323238d2393795c6b54d50e55402936f9ca497e0ad23f94cda7fe39dcfd8b150b20b1d7877975e66a274177b9752e233f3282a8d4638bf57c37cadd45b771c02aedc926bf4799decda4e7b0f2d6f22b4016fbb0c5d760bfbe0ec9ce27c1bc9587000f571ffd7b8256b14c3ed0f87d5d22e6d94b69720b9b8d326003029ba94af8ff9ee77c01bfb88d2be21349b8e4ddf114f39302a61358bca27df39b81db1e737ddb1694304f6664b9f4813916f4092d9ce7e5c2322dda06540139c4599a19d92af5104244f9cb3dd043e0f93de125d506bc0ca212b2f896586cf8a89dcd4e8d14e20c2c81c3ce0a1dc09cdb324380f16028b0350513c8cf2e1f7bfacf6786376730c5d9b1c5f942c5508e177f5c3ce353f54d62a0063b285cff5d5db8418301a3781544606953cb5b155ba66c9efba388086336985a2be790cd299842153663310e4f38f152c6df3a8fa5e54191b5d735e4e230ed31c432ed575ef6f6e5dedf966b64dd58090c8265d98a73def9c2b236bebd3854af93d52b45983bea3e086efd96237b5f4ab574c1d2d1b1309d5c4814e9365f461794b6a2cc55a33993c753bf2762ef0f78b6b0fa178ead74cb2fcef2539005c1505910fa0392f0a40dad2176e1735a6cc682f3787e136c16114b391cbc03404218dc7398444a251702cd520fc328d3801f0b77929db1d35e525ee81db4bc373cf2fe08824fe712b67e68235250a0f4d5f02f893238e3d538e6a4019ed73cbf64af43754984bfb63ddd000d6a724c9c588c6ae00f1c50f4d5776b4f91d38271c939d0c052a57626991ba71bfe116da2fd4e1267c24d94daf09333c0a0f3d0331625c2523df07268cb7563e4bf3e7701790726016a1a7d4a9b18b4d58e906fad51d4c768267755d2b163dde41da9f8748e554213258754f9855b6a9d700533cfda6df54a3ecd8775df1fbad1a307fdb63f3fa65d937ca947419799aa996ef294b621b6513839180b8e789c2ea3055c665686ea5e2146c973fe07259ce4a96a926ee8fad709409ee8e42ea498b7c482221d103367efb9e03891a2a73dbc526fe56f63cee706b97283bbf852dec4e2b24ffc51004113ce2af1b13b52d260ae0189c2aabe45e604d93a5a13b461aa56157517317ef5d2022c48f02d64fca10bd2365243f310e3124745476c11d3186e26c0d451b6a1bc1798a9f38c8d6dbd68caa4ad736f827583ac994888f2c04e26291949887d1e598b7a95c239e7951ef3423db14de8d72ea4e3881b85a1965b859c934f1650c158c178270cbec70035159ec0bd53c605d9efeb5d2835963a661d9597e8150ed3b841c79d56907f7ccac19d5c766cbf476a348041040e14281999183b540f836bec715d407132b6eba663667e08d0cd17c8a9159436c02f8cf5fe1a313267606e819fff693936c140c78d250b4066f6aa1c5c014a0efebc297cbe95d47963478d36d8f2ab46fe313bd142acd06ddc42da296782c365ca345d7c4488ceccabdb0e1e9d3af65bc011200e747de443801fd3692ec42b7462ce731ad2c4693aa29586179bea381b20c1efb51cfa41d08f2a7755aa74faa6c160691bfb37cdff0b898a42026c3d66c5e9b03ebdf8251f2885d38c126de3dda09384f74c0f63a0ce061e88d9414afda4995283309f1a22afed7cf5d22c971c94298bda67bf5ca808dacb1f46fc324cc17c0d7b56e6fda3072ebe6ae986429ce221cb881b104aa19b6b5c466aa13ee87f58215493758bf4056c4b241740c2639065e2ddf3b8f0b98759fb640209e1e085962e3641c9f7b38db329ceb3dc2c75b26a648b8e50f37ede97e6f433e2a915c8676d2a87203c2e9f94fcbd46e5e8c45170b59233ca97c0b412104177fa815cde1c269a42a96cd8b5e12b1d9e6bd8f1937487e8d3cc18a6ec87443564b8d6a88299bd544c09df86e87081dc0233c5879fb58edb3437394e7b3f71ba55d9b94622ff48e28e32c989bb680744a316b43cffa7f24d9d037ddfd2a9d6d5130f9c5c3003642bb0c650bad322b814547c9d45226d1c082dbf526f480a66aad85f2ec73ec46d9a5c06610edf446e18c62593d260d5db8b0588d4049046a9051cd5d18765fe07c5bd413ef013f9796f47a95a5e24d6a0f2f95e03f7a039296a3e8fe762e56b19657c74bbe0ee24bdd8e3f7dcb7b39d72639c489718bf2cbd3c47f697a799d812d3cb1ea74d9db78669e3a5019d846a5dfe0561e8c25e0c205b585cc99a527b2fdd03d191db53889c16e4f2a90a4177e1aea590f1de4db961877d4f17342e9fd1a75a5fc17077d0151e0ed696f229f70670ca3053f0164a40218aee1c48a0a5f1330a08eb28836f1a9b7b7d5cc8f58257acf98131a2b62a3b88114f2b8ff640efdf35a7d0ea5986dcf2b1b47d340e745953d7cfe8c75b867b0ddefe7a704b0f9b8abef67f8d91c5bd7f9d007d632b34e9d154ff02945078dee649f31de67100a1833cf4640d5e78ddc64598c80cf2a4c16b2dbbc786e80d18b841294754c7785f449da6b10b0c388e3d204af72cfa4e0e4372e54485ad3f5fc27f40ccbb5b3fe473041aad8ff36742b67476c61125b323a2004fadb6eb9f3f19baade26aea1185b1a930eee73a1d776e973f4a4bd7530ba3713f1ea410db8d2d469e3f4c8377d9b248a78a90a4a05e3a60db8b61770e31693e2d6e0ec35af3870b17cf355c9f6e87fcf076cb00f15fbb2c2037513c7bfce459a65169d819628bfd55377a01508969476ed121e9de891f5f8c439a3cc134e622ad0c1a617a1310564156d654a537cdb958790d794085195075f607674423114012d3d3cbd59c5f1180340a64be1badedc5659c3a509abd8aa7e33719df0c825f594497d868c22ac5f69f8d129d4ce3606aec70a2196401c81f5b9d10928a3c0c1bc28f06a0f6aecce43fc4e3001e50bd59e01b5d83ea2d445254aba16201a54f409800fb5f135686a0e62d008bd5c5a9854e4b90e9163e48aac92c44885acd4fca246bfffad756adb1fbebf6cd067e6079335a55fb5566b3b603b7abf61b2a3f11e35ecbfe77e6543a8d3de1174e910974aa1e9c9bc94b20d2a9f0ff38a7f375fcd6b8cf51a2ba7b2f464af455f370fb202545d43a0cec266f1fa950263cf8996e8fad8b1f2e306aa1688d011162c05c09e06576bc978f3fff4be2f781b521b68feac93412252fe9f4fd269df27be05c0eacafa04131ab0e6d8b56278bab9dd5f0f3c29c4c94e42ec52a9b942ed7a703f3ebd9e5849649cd6bbbe4a4cfdb5f1ae5a9bcda2d8eed0c259c16b32caf1c350994495ac008f44f587b951f634c4410eac991457acd6b70de425f44eebf0b9712bdc10dac635c2c09a5ce51bc3eff0e7bfc7ea35a350276efee49527f17a5453b3e0ddc0892c576001f418fabdf701308436a67230b32813135b91488644e0f9caf46b3b176bb6e20cd68800c81a72495bfeee2fb0beeba3f6f47bcf83135d6efae5370b68100a21f2d8855f2d78d0fdc5203852763faf0b7f1091c462e091bce3f2c47a289375fe1559dd433d3a07751c3f78212d66af151df0efbef6a6dd4aa77630beb846b2e3b67f866fd04a2d5480aad9c16a340578ab7f5cf1add6cab64d8b6bcc3871c63f8e985e367d4f46b081eb2277af850a57fc56a1afc24a9e1be42170b358134cf048ea4d9ade90d6086172c3d14f1ae7aba8c4892bf4f60415b1af3db7ed78c874db4a1254392794a5ed40d246c773044927d142e134f21409c8b1f494abbbb215c9e1ee83677aa7006dbb17b20e7cf5e6c2e53731c90e33ab0ac8ee25c67280a8467e7b818be7fcb4ed9810b7141d6d30902072ed797719f253e37c88d6e831e76b24fe0480fe055ffbd33876e0dd1e64be881f0b3cf9f62b2382001065cd23d8fedb789a93cf413527e749a564d601df9bfe37829a75c5c5260ad27ef740a2e1316fc0da030b035e696cf98da2ee309d3d8eb5192e660c1f8426102361421382b9b3d1df4b3084b75a479148e90c976c31f2cb9526e848f5273d42d90eb76c3417a7da448e44c4979ccaa881ed6d394d24511405f370547cecefe1b90ac61d052fda3b39982e6106a79826c495ab739e4af7527d69dbe3068132621397746c47423f5f26f8539a8fae4fdbcaab42018d4de0d9f30c81ac2eaa74746929a08a16d34e2aef00c1a742e5504eac44008445cbab6125c9258818edef24a7e414704639d16d8c21d9ba70874f7e2e907c542a1878923cbeb80b8835c097f984c3aea3239a5a39aabeca77ca868befca0183e6a2bb9e14170f9f2f6c69f41f5e69b84cc0f0fb9a713e8ad59c7a8d5cb05657a7303d223c710e3c21a9624684137eac016173b2a1df157462a62cd28d3dc50431eea94ecc8396e9c3d0163fa2bb1b395b133f8c24e0c4beca458ea6a0033c8c2aff2b0398ff46bd1f6e5b67cf09c63588d12108290c8c06cb19201373d78686859878f18b0356259ae68f553dc0145d0f9880e9e943250960f01196db422af839cc99b361bfc10b2fa8bb4a8087b8b558cc08cdc58ae8bb7eac401a138f3fdbfda3a43214859950b6110a5b8e75e5c2bc93b39d65a71a7a33c2aa26e1a6c85a3ad753e2ed0c6c342d00d9893982a46c23604912f375734a7acf5ee9430d0a470971db36575ac0cf77e41fa5dfaab392c82a8d0a3feae6b0c2eb0bcea398d6992b4a784a9e59108e38c8e56d84cd91dbeae6dbed7c864f8ff28d2d7d1b1f6142f969c1a09cb5ac0d74aa955b8104fc354fe464bb20bdd9a4b033a3a10b73da6ce8007e3ecdd6661d7a4c14e1b2f75f814ccbc97e59933269d848ffe3ed1b8a04db729ecc43d34ec2ab791a5f3b41b399baed8f6883e902f844458b825a4338826bd06caf4746337a460ce423d4e1af713252da0e0cdf9b88ddccad169c5cac9324c2fb962c71cb3d5490250ea555b5014ac0785efc54cbdcc4bae0fa41eba9996939e9c9862221bf8955920eac6f90c3730a761bef779d9e6131b78b6225fa22dda4aab53a7a85b93651027cb91714d783beec4bd6aef23fddc7b22f27bd68dca696bfaa4e238d976f654a52e0e0177418507d42b5ce1c5951841af61609fff0a7fba53543ed3d48969a75baf9872f56e841d4af1d4abeb32b8ecae89a85e3551eb70400e8c6d403962bf150214cc558917cd7c331445ab6a9c5299865a48ecd8a5b69a7249357071c11f0e83f15e4f49d79e61895f660eec744e9233801412132765e22660c313095e6cce93ccc1fc28dd9eea03e68333f20728f4d0b11f73180607d27affceb1684f81deb121b2b5986b90f2df083f3e6601e6d9e53708d0894dcb648ff2eb58edb062ee281820551969559614bd223642370ca0e03bdf430a463ca788f84aa15e71eccfcb7694f03085f6be626172660dc45def7a48321f81b0588550b95d9d0b84a5313a8a400b68e7314c8f7e5dde72d762d4a9e43ebdf5602328879a41f60618a7b357b76671a0756f35ac02bdcb1a4312d04f6abe0d7a6f21e78443f7620a281e2b8a4f60fccc3a2b99274f0d2d0c9264ab27a051350dfd4f6b98dc37a2145d646481484d729225aa60a235faa293264313524364eb79df828c98b3d42677e67dfa06658e93a285cdf23aa1423f5d2ed901f33ead3fca037532046d476cbfe924acca224b5fc5de2e6ff730b815524f94f23a5d5ed7ce5ed7c26a570078715b749c6dab3cfc7728e170ad433685816bd38c6db4b72b960965d1a654ad536959c435de2ecbdb230edf594820596d05c4b1553104473f4852a8f817378bc9b3bb1344692b524f70c14098b6e99105a704a592b48ceef8b2162f1d6059233ef3d956ba401f3d81b5281125d4ac95d48cf041b248e623c646251d4e630c9265631c8cc607fcc8e8d03f713ce211789e50d342113d3e2d104205755a354f9ed108f736d5c8464e2c1115595ba5d5e55927075d0467d474d0e47b88f29e4fe89c601b890475b517a81a04e97a7d24f894cc37544fd4bb459cd4a9d47753e2c63628042ca2877229e8c0dd625ebc7d97772251bdf1c179b73d43d76849cf2d7a00493a541e2a95745f64afeeb1e7adfc7c8119d167b90a50e708a98289a94371529fb80883535c2c6497dcde8bfd981053d8e7cecbed626e8b0821d30bc0ec487da1088e561ac1c94f9f43bc559602b7063dddafc0195024b5375db97e6b01a85f7caa585cd3e81b33d1d19fae1e6d7c8018ecf12c8b77194cb283fae311676d2befa88ebbcd1872f5aa578b01581d6048d9a7288085a59b7dcf3a56d8072e2ab4e630807e8b158d54b2f2630f883f4aa3c62538f73b91d2064f43405b2c5c79284c96f047569ce412f7070637ba88bf2e486280786ff27127f0e5ae95759adc99ae13321c17df7d3619a8f3a45b4f6c57d343e1bcefdefe617046c5cbe96c64de65f350b79c8c23c64ecd9124155f721a17a7ca842fc5a398d9c0bb92e6c76be971909cf164a837ee8992e82b1d7bbba42bd3de025946e0887e2648fc6272542dc0ce83f885e41895349512e87a3ea053c62b9e370e8be7fdd4b178dee2249a17859554f823fd7c7cea056633167aec74e66a5b7f7b768db2a3b0cfb96691d00959750a30dea6f036a585e51fc36a7c02b75cd25ec05b8719169f17d5581a5c436088da3a946abeb677048f0621a237d5e2f0be2c06abe50db79ffc3494cb0b6b4ece20000cd5ed834196e0fac0dfbec9c8e3aaea060b7d27aba4576dd90d639be7a2026340eca252a0f40b1717d03c358e47cb33252eef01b23e0088fa274e992e714e40a257512278bda8b0d5532cacb22b4de5dd8c9d85019a57cf102245f9c50572aadecd436dc2d17879d22617b18a4a05db250b8ca2b903bbf9632bd68a36c302dbc9ea0cd7309f40998a00c1562f74f12ae8a99fcadd639552cd3b6b30f5e20e806ebcc25edfa0162a0bb0cacae98ffbfb6d062e5e9e9d14593df0eb59a48d6a5b3a9b2a714410395825e13ed9a42f3319658a042a58301340a0b47c3d6d0a80c1e0037e04b3c8af0f89797b9944c03e737dcaf8c18ff3656824208021bae25b512c3da6d7e025d1378acbe73e8af84a6ad6dfeb475263fd6406df44903fd669693780c287e1bf5ea5fa229bf8a781e29d1014c09445b999512e0e083a278150533d9047416e05522ab47543d0b78ad9355276b53ad318cadfc58f818459b526254c0e8d6f9b12875fc19b02e1acec997c73a4c0280de9ba509c641787cc5c5521c324b6ae0ba0957132225188522e54bac9c5d5ca10c61475333f5acfb6835d4acdc4976a7c2dfb9be39e1d7d5dc15f18855138e42a6ea9627c921153992a3d85d9db11d91bb0d347058864c8c1f3a74083cbfa4eabbf6509b85685cc2f7f2546c9f57ff8c49e898865e60860aa175f789dcd2bb7546e2df202e1097cfda391d1ecdcb9cdf2e387b7adf49a5332508bc6c141e3403fa3bd2d0bb9cb7928e78ae8908a35c7f54b851cd976410865a6228f2ce81cec7b1b0538319f43b05ff8e1f50c0f8b652055110986b73c6002fff07146856bba646877475a8bd74a0a6006939d572d72275b5b8b33d95aa24cbbb737afa93123b3ee8f879c24619d4f7472ac811e09ca9c6ce319d6271af8669c498a32248e79213d7de615cc3b4720812a6553b2995b0c7b9d64dbff9caf6847f03f045bc8822cd35967ede46cbd2fc42a97b20d7c04e421d8e31d88b0d9846e6e041bafafded72a1b37b3a77caeeb28e709e10b37cd43d891e20cb6ef91415f0ddb2f31425359103105b323835c8298cbb451cf5c9f3a1e89f4af81363da12648debda88cf9620a2384344fb22673c914c97090db24438de6a34ee1df1247665dbf2d5df86fd802d80027be4378a723bdab34209e161c807e441e5297d678311f48935b7fa3200b9e5f063f58274a1be0a46235fa07a027ca13a86d7fd19d5e74e0e2fe73f460150dbfaf9dfc33e86b5236c049cc98e7d5f183384b5fae31bf0ea3980dadbfd6ce6bda285aadb2a60d11c205c3aee914840da6045e09ec6f72761e0973b889e48eb492a71b76ad126bed5077abc023855191276d3f5c276da0a1bf96a3b9c7bd1d49a8c06d6a670f3cf71f8e08bba42422665a796b4d4ff0cdeb673f9bfbcdb53bf4c5649202b9a475f747da515ca4750d72e99dd4188a0d5c15e16111cc76aac06b7792d95051a0d59a32584cc33db7103878ae1130b03eb1eb9effeab05a34e47e7ab268c115b5d93252ad40221bb23a0e63778caa4b9c2939c674558725480f01629a45873b2cc5f2fa2e40536d71de5b9ca161dbbf1f4775a402bc3ac77ecba7c79b095553211e6fefb392fa8e979bdbcea5422cdff8ee0fcb09a2693c4427900b24857b16af2b7def45398239c0ccaea76ffff02456b04a73abe742b85c045bf0cd6930ed796b9c1692855c04c15e520853a956a0c1d54708097c761bb100b9496489d22ebb05128350fb6645e4a3723ce21652b333b78e0535521731237ee8e977e9994b73efd43caf403d48b5b224e5d4b85aa25e6a8b27945354963ec2975e77cdcc561116be02cfb5106c3c328bba4bcf9088562a37e9e854227684b28ce56ee8a4f320e9af6b2c18e3dd38c9c351a9635634d91e5052301a6a3a2b84732449ae7f7c4120bf5a028832260b586b75cb9ce17c255bf936082e42da6e4e3703e754433f40dfdb02a6f6eff993ac99f3b1cbc256c8cbab472ef060ac06a277237e443ffd00d8913542b7fd4263d1784e63b175652427acc1d3eae9d8a5ce87831c00bca68088bf8d71c404b5f71eb10b1846b6b49e8c4566012cf5adfea379259e456f018b248f34c1a76f5bbf3d3273f9754d62c75ca01cd22a4c859e81270e6e9b15896bc83d479674c4f5d217c80177e37fd7b0b8d81f8621b998492b92dcc55e661cca46d7b6bd447007fc8ad837e31518c1c71f2a805730f8564abef0bd8decbdfee530172fcbe16af97ef3bec7297229116b233c7efb38c4550c6dff1437a2e72e6452b0ad7a996385c3a7f2add265cf43f456ba34a7a21751f277ea77750b8596ff426ae438f4e688820fa4a2361d51bcb546ba374ea0f7a9b80f1eb4f0da85fca23cb7d1822b260e0c8043e31cd8a023e5f2cdcebaff0a75a4355d67f7448ce3f9bfea5b481b8a047c3e0605b06987ffbda8043712be32a3950cb41eeacbbfd74f3bbe1e231025636fa38472bc611957784fe0dc799da4c632d59d9b76356c8828221f63d4d29d76285d6706ad82a94a52f09054ec66101c53c7efced2095f55b2a1b9ff51af8a8ed16f20b7d44e6862fbfd9da0afb61d58e4dd8ec9d3cf8a242ff5125761ca06840029088a0e41c6366564eff5db3c1589363b5d366daaa19c087a8eb8351b7abf6e1a30733a10ce4a3bd22e7e0fe8d74707f622b09598038bf6c9a63e5869da25adddd938d9e4aa60599984ced983f73ec91eda50afc0fb3994ec3b5d8b87f00ac427ef9bb29b81f6be21fe45c8250ff92d8e01d450956be0a21759b5305dfcca972fe9875050342e4f90524905b9c52bebe3b0d99a81ffb4dc721f15e8202933c1a8a9ecbedc86ad760df475140997d65b92014add158bf9f566ea99558294cc0a564ad9981e2160c03ddccc9a403e6193352c84967d44a666b51a19bdbf488587829f44698264e92563db760dd1e82ad8ad82d5a03dffac136e915b67f75b34cd3ad02c34dd576dfb8a0e08967eb1662ea0e482fff474f4f923eba4f09922c23ad78e18dc6dc5e1117d0f96cbf4d22a441f3ef52d137c21b3d5ce01ca1cb654930c36ef42fbe111d66da8e6bbd8dcf6e381ab2efbb78c8679497a0026722b93a17fefcc98a1e99011b83a16609b363631c34e702ed8dcb20463357dde44143e8742d443c77c2ff7a62e9c49c217abfc935fc9b505bd29e0aa84066be0ad2a734cb81ed6a10558b6aa48740eb0bc9aefe5da1230f0a133dbbf5028d40f0ca7128075d846e052aa92a2622df7e4fd0358c0a5ec09e8f9e0b09430441d3d91b9591017ea2d8ff1c3b809588fb3459fde93dcc6935903836c1143ac61d84ab14465b88555ffed6c82fa74ec97dfcb92d6add40e7b002f3f6d9d68102084b482e6d3ed0fbdc4016858046142340df7f41fa8452d031a7522ff1840931f48d69d732edaebff6e7694fc478158457fdca8ba01c38b0001e5a05c7b84fdc7febc3aa7620a624202ed296622184befafbbe00f044406239e980be8557a228378588470edf4094e251cb0c62bdc2ce4595d6f437c625900dd096d45fc88cfe7ebf328506ec62120d1eb694e49aa983bf92786c03a7292bd9b61431e79f14628d0e3980a6ede583f470f829cf48a20f67234bf9c4e278863ec3a5ff1571d91a04deaa6f8749df5abb83a4b93cb2eec3fcc1bbb51f43b1b101decc261c23bf6de2ea25d4d82e68b53546668c797d8f446afbe506c5a36e3175bb2b21e7f291e2b6b1afcbf14c26731b9b691aef889ecb81ed42cbeaae674ef6cc43f9766bb191c097a47e9204e5a80bf2d7fb1178488abbe54a0addbc5d15394d402af3ceb3beba5a7d3b41ffc4dbf56c572ebacf8bed43bba07b256e132962d7295026276b1ae20798a35bb9979d1340fa0196abd69558128858589972b20f5e15d3accfa99fd89696a5aae61baf0184bf2b6494ed6a1e3d5ff22250403c90742e0a0d4405576b005f45f2a24991346e36c19d73a268688eae63f8955b48611df27a152c9cedc89a93b6e8c903b126a50800db00a4c9605193a3d1cd5114a8c09dce761632bd90ba5467148c964889a8d8c0bf0c0854d7905c09f96702fc7fb8dbd8d0fef411221e3baf15a716cd45ed58ff1c629cfe1e9b1cfd98f5ebca97a52ead5367719e667e7ffc79793acc73ee76e158d3f675fdc35c152e169f5f983426b572dcd9d32356969a95fbcfa5de3956afda64f799fd1337a91c8e2e3b068a38adf2272a05909b1ec40770814b15b9fe5241b0e71dbb7a48630d2d061952d7f50bb414ed9724dbcc1147d741fda553f6adb55a1fe6103ff82f8530f1dd629f806559a22a898e0b31a3f8fdbd93501ff49d8428f5d21b19a3a561d5583b7b03fcef76687dcf341c0817fc1aca0774736eeffd414e4ce0c978ef3e5cdd01a62752f652f4ffd434de30f17cb7ec35eed966c9d67bcb90facc9fbe6cde978c79fa4de8ceb5fbc11989a07fdf134b0e2b0f186755e16653108a87be87b67253a077868827e502162bd6d80e7fb747c01b5cc21396de26df047e5b8288243c6443e5be5cb81c1df882eff9eecd09db87fb874ee1462cdecdf3ff50d1fb4a75e909bd0e8be102144f9447241981803183daeeccfc3c39166a7f3139b7236dad20ae01e2ba618c42b5575797d701ec1f8579ffb9f8f81552d34640cce57a3e5ef1d457a09ab38105b9d2ceee862a56a7f20fd2b794b15f0b49872124e14d1257e11a9be8527c6b824fd9916a219bba0d2443388baeab10abc54e3e9110d98e586dd47ba02294a9a67c2c4b4e36a71e9dbd12ae4725ebe4bdfa2d08c252c26396435dd3a7a851200106bb79b0bcd7a0f7d76391193cedb7180f3fa3b64e936b8b292b1e28444d230710e0b3b79d33864c686d5e309c5568dfe4336703e5f58b7ec19a85a8029ac5be6aab23b520ee252987105aa0d86046261846f9c0e4d8cb4742f81f665c2f0dca85bbd109a20d4aba2369317db5b01aedccac1e8aff4bfaf57d33e6583bad4aab0d8cb45a72a5ef3c00fcf7106c805411fb0e4babfe2969d859bb1578ca79f0a5c4a48ba3abe1dec8db097ae868888d9cf047823f0933560eca0a738d1fb669e82e7dc3d5013fa44aaf588fcd418fa07d7d3151ad51d928de9e7c4cec997efbb3014216001d0f1c53aca3f847028d4f37d93ab6e966cb0afc87c2cd2d127c09fbe0b320e9c54c6fbe813172a4460792188f0a899555a20b0419140be450a2cc15cbe4163122dffb5964aa01c6bb3604f4cb9cab99b5a46baf8670fcd650d843861703cbcb328dee9ec69889815a09202020cae928af2a6cd75572d4e8e12afc698d440565aeb3f5812da2fcfd28a63038d7e495bd76c203ad07637b67087dbab616c2082145f7ee48c3c7ff092a9d733360e64591aa923f6d1f3235cc275697a1e18eee49236223b739e1ffd688de03bc9824b6c4bb4fd2fa1211c852b4d7c995d51c6c49788c009fd8cfc4981c054add2a4dae2af1081262c6c08dd843b88d84f7587ba8a0684c6dc29bd68d88c451943e2518070befcf0024ac5a11a554e4ed83bb8cb033c592c15667bd3d74339c65b70c6ae64de1ef2a04fcfff992ea5b6bc78368e5665e8eb387057f981ebd84bc90c85d0ce5c43c785f2b1cf2727e754353a0a723a94537c3ab5fae89953b688623661ef27b0cc8d4f2f1559dcef68e5ba1910cbdc3e5abde77c9cd4f10273f41d2193cb9360ce48e51a883456699a40d6894e8d482bf737dc097ae04dc2073de3a6eeec2a63b27d939c8ee7f6600ca00f267231ee980f10d8e5f6c4eae5fcedbb65ae11bb89606078a3081f172a211bc3d5ce6e55f20a5d6e1b5aaff320dd30828e599f507c32e366534be6ca5dac74642eeb3487a7c58691f6f0bce3a27583701edb40d7c6c4226806ecff26d1bcfbd499b735c2349c80e9c39a0898d64de1bd71648356f436f8bceb59f71a3fedeb350fd6118c67a8571aff432e10c4a0e6444c60db82e674eab6cdf13273ad6b379e67d3e29c2bc4b09b151d02fb68fc1188cc56417525956ec0978da3243d783c08b70d6bcce330287f9845286b15e062ffb84703e5eb8ffd6ee9e22fda08acedc7de4da7431c528766e0f1ee942d619e9cd5ddbcd407bf00e5be3b003753032857acd4f21a4388d266734a5e529491f9e22e5351c3bda0c9dfc31ed77e630e29854d1870a54e3e799b55524c736e230df74257ac22ebf33abdbde834b384f3392df55c8b9502ab193463b740ffcbdf6ab2e88f10cb09166dd084422e489540a5e84d28c4bb3bc4eb844229459cf9332802d6dde5e72d8abfb6b8e74346200600c708cc73d275ca70007c5b2d19e5800dddf9698d42dee1afccc2526677784affe767088e0e9af633111d66d248c70ac8f0e8704d9b5cebb1b6e865b0f7c4f966d2be989342d21ea595ba64f7a97cdfd88cc06d6042cad232e8638f34f74ac95fe11655c1b083164582400e37377f105b1a3e904a2eccadc20dfafb916d086246f97b52b7693736f9a5af215d4801dacf6fe7f66428dd038c2d285b32387fe62a0571fd2ccacc15f47e37d328e7b32d453825eb99461ec5cf85cbf20e97a22d56b21bd560a98725440061f8e7bfd39d7b3661e907c41e951314285bd8322d848be0ed80dc611eed7619c4e0f20004397f87ebb560449b710c096d78a4268a2d1dd64709849107e5d85511b8824a1ed6a53fba26cea8aebb9f24e26f7ed8fa3cf591418c6f9e6474f3aa5a7d0a3c5d62941ded7bab8d77d6b45fafa2147d97f3ec9a3e135712afdbeb6b80acf30e64e1f60affb4befd1a02e8723f7a72b3c4581059dd02abad76eaee269082852ea3721b9c12dcebd20b533123aa98e07e45e4b130c90a19f8ae1bb27f37e799d392d7301896a1b062f1e92d4f89d2f197b239b688040ed5893cdb851beaddf86c3c43dd92557eb1451c9c82b4801a9f16af81fb9b0ea1a39c4f59176c79da7b7e31fef253a6bf71360348604002577b01f188371218862a6fadb94b651560ab21557edc4aca92900d32e79a9d5eec2149dd61a6f54d6a5e319a16d436213b86b79af74921aa8868f4425d65036edc0e229d18d0a49664acae99554ada13be47818be45d770200b0d586ee9bcfc62af4debcd9b873e0cd7137c4b491c690d48dc69223508f1547560c7ba8fff6b83d1dde42cb614c15eb706c95a58d39b66573d685a7284aca5e58c210b9145083ef70206878b7398dc2bcca52d372317a881bbef2145a683aa260339e7cff032af8bfa1c004e0de128e390c8c539fe18a27faac4d5e62f949c708af2610d7e1b8cbca8359633580fd25c0651997b1420f45ddece6e86bf9f48a54ceff6ded9097db41630de4ce9cc6bac4cb61a66a47369913b5c40b3dfdcefbe7bed04395a200d0a9db05e5af5047118693f2891c2ccb62a61c00dc3799e584defec1c8e526458d8515cc5718d239ebc6b8297a78d8c36f6255e02e0f114bc08b2ca5cab7bea82a877baf2f03ad0c08aa67d2adf014c2a65a9e51b88d167c54710add4c3be23551a6b0598662d4d75b374bcd39a23d1b9999bbd62674a788417347b996e65d9981e636121b9430f0c9393a1fa83e02c8d3686796078e9a193800fd8c0948771b51739655d873e7679135a896c31adced466ca56f2207dbe9d062d08fbe0eded200e963b273057b99bad4b1d14804dc8db426e9409ad9e656358cbe38c2544113477d7c8367ab105a95f3a62f82ae9a24b2e7c2122e7f252905f6ac276309043fdcb46ed2c39729dfed7d0d25a146402ecec9b2efd3da5bcde58e007d8bb5807d1743e97428d248d1fa9ab5320d5c912cfb2669d491a4e27a9666b2d7026116bb32c352944b4f8a4c359fd4ca2b7a52f4f2f64cf80ff5e7e9a56b1255b790abd37863d1cb50f6548f48407a44f065252858b174ba8970a0b49f549651876e061cd51fb252e4971c95660769a1da0de59d0155a6598a616942237350503f55d0452cbd4831b76fe6cb6111efc42d8046f0de1bead925736da1f63015473facd0fa772078a82bfe38b7d13182585f6d5a0b4eae457b5af534b9f1a2e54825829664d4f5029092f330235db72572911a3189266f3faa8a623b17ecfea2efdd549444833905349dcc63e244380a377b030d0b4f81d333feaf26fd6810d362dd0fd0bd972239b420934b9a9c586599a6e633e0d68b040137de0cb3d295325171feb5b90fd73ba26b4d0fdb61b115e482606623dad72ca55db486470686d4403e6e3d3f6d1adb011f5d6d3da6cc434e2e525e96a8da4b87ef0fa9d86e74a806fcaf3492c5d82d3505b7b7f51af0edbaaf668ad9509aff7f110a095b2f84d58d1e6bb71af067751facae9debf89bb2afc09ab653bd77259d77ca020f97af9379f04513bfd3fbfbce64efa43dfd12aa8ef644b7cf840efedfcbb432a4b8bba71b58910aed6b11d96293530942fb5320eb991546950e7ebe9beafa78ee8a8cdfc82fb688785ff5363df4926482082ec7d50645a970a956f881ab1a1e174c8fdd6a933f31f68939bf826b3b9edb86f4f233cba48078b8c2af19d2d2902612b2f31d9d75ec85e50fccff1efe8dca7c82d30c8970a88f00b90849f288ce897b7e876d48beb5d0f6bfd0c450a9797e8ef8a0c928a15137bbe0dafb1d6c66915badb635fcccb24ca167997820019a3ce445da897f6debac8b92a95520a272abde53329fc1a7fa290e3819d4df16a8507766f884910cc111c234e7d5a8e23697f1e5e4c6715a4fe54ddddf413c54f833fea8b5c02e46d09018460ce9e622280197df7bc7f2760af1a5267a1a8d0566a331da7d286a870e9c32a25962b8c1320b81b5dba98829b155c0f1fa7e271651298f873c800a228d0b178e8fff456984eced3b8dfa72e04b26621a4ee81dac7f2a29e9e5a4b4d0b75a85c8251e52a54a9cdf324017b7af309d1f1fc8dcf72ed13b849d327f4681489e08f3d997e6998a60a9c170c8dc275a8310e79fe28d4286ab00d0dc612f40aa5f5a0684c669a87e116e162d31040c3eb095a48c002681577590ec5ef6f7bdd0e5d6dd6cadd1e8d19f1f106c7850a6a8b24e6e4c57f0beff23413e4e6e9806ba0e9a51e4084214b45ffba53b6b632486c281f81025378e47ea69b63760a16ecb93844908ce3a749c404decab522dd04edbd8570760b1c8f1f2e038bc0903a1905df8230b2df7d0f9413bfa9c1ca9f9469f6ad306d14568695f7ec5eb2b06d1b921a53aaf141be9ccf89d5fd00fbc6674ae911a8f4c3d34f2fb5131bffc57d8c1aed201bcb2253f38415bef8987531c3f27d117893dd75cd089c4380ee0a6eb24fe5abd792e26964121f6d1ac46b26fac7cdac90e0afac21c77f9ae6691d6f662bdc5621109ce27c3520c4277eda2a0d13d7ad71da31560dd3c3365513889b530895f4aff9415f53acc8c5cdc5e8318a3cf552cc4a15de8a1dffb6d7cf70c399869d6e41c397999496d4af23c36212f8b5082f85679c98105b1d4ed5f4b87125f8581f76c39f137707378c3050ce93a7aa7265b66a2e83b36a767f680622b446eb468475ac71c8d43fb3a30d1513faeaffa98ccdd7f0245231dccf2fbf06b047fb174782b1436e03842d2e831f8eb806f940c5f4914a5bfa55b8b5a367a679f0d4da29c6ca331a7c8d7f2856c897c712871d6af2cca44b7c95132ec812aa267498566ab037d183313070f10b6a099ccb95e1df25d7a78f37852c6a084c4fb07caefc70e796c5fae631b62e2c81852694969680286986cd9a30a1215df8240daf7afaa6d1fd29d82de85323a9126e89c958214bf864fe096d7dc6025e5b40375f651650211d78b87562fa32bbd302a7aa5a076142774c7cb627692483fad765a30ae0eaaba7db1198bd4be96591b4010f8f99e988d726792f1d1aabd983e9945fc547be03b454d9ffe1700e7e81e340d48c281a2b377c1c261fe07d385d8bb4ee7e84df400313f4743f123d103c7d4baec2098584b2f81357b1e651344c13646b024360534f71ff803bb115e3233e606ead1ad83803a1b7aed517230015387416be73c66c4c40bce62620fe9f796e837f887e6039c53a6eea64b98c7cc18674a575b095546422b0163708cca840995d8facd80e1064b6ca3c9a931635e6f94b899e79e9833ff325382bc6572866cac5e9f24eac0e8de9f3ed139b6a738d838890a06e1f4f14836fa751e899b67bd903be65f284980819c9279cdd6827c09f05a0df8e5919b0f22a0da7b4cea783317ad6f10e30a555804e586fd1a58a2dd8f867af302a690d0ed070218d9a4cf2e996b809baaa2a0cb56874424e488e4f4cb518c5a89dc4b80bfa780e3b13bfc6a95350db12cb3c2cc80ce03759a2c0be69228cf9a89f2bf5134eb3feb21d82b1552ac221270b20412d5344fb9d14ef90948f801c61fb30324e2c8ea4f1cea26e42b67ffe1fe5910358fa851395e03fb8c09a7756ebf9edc6bcf1be60bf20478b5975015af49d5790f36074c3d38e826e8ddff3d554333b3230c2eb123ad1195f4a89f29b53fd817a646166304e79d5d8ab9114d2e9fc06707174c3708d5c5832576d375c73479a3e14dea199e003c09c02740161b6ceeaab7be1dce0d5304a45f9f290146e5d4b9515324258fac723dc48b50695dbab33b3cc5e264691c0a136dbe25df2f37671401658d7563a1c19a5f128c92a5aa228d1d4bd12b033db3424086e8273330b9ae44a356927be6b41ecf24d76492eb3325b078f7d27cd3d514513a5dfa22de4c2d0d7bc52499c82a4c4f0e73fe2de29e0316303b4f821aad02193bbba35bfc5d251aaede7bdb3db0661aa4d3eaac02c61541fe8d6e410d26753885e9396dbf667ad08137d0565ab724600d38e0f086482ab472e5df60a1fdd2e4702b1e681b7f1300d5de307c44a651a6a6eded408be0833c04e535c1b24adeeedfaad26138256f736b99361d054b0f6d4a4d5a759887799c3f197252eb035e56227012ca9328afdb3555b93de560284e19471227b7aa0ca846e9c82ac0cb032d8d5cc365e2be80afdd3a97c3b8b49d873f61f884c76946d88c22b09a5133aa89dc60528d0d90b8a40ba85af90eff98efd9f54459c13411392db2b052bc4a8efc146c0ef087bc09184463dfc14fc7bc4d1b3021661d538e2b85c7ea18e7a63c369ea9030ad9934a8ed022961a249485bcfd1596177597f54b8536ec78ef55c20da76baa8fc4b5fe79e0e2af73ea0a24426470884482b13ad0a5c76a093ed6c0978d7fb5e94c5673b43bac3029b8345bd7178fe92c3838c0b99dd6440ce6b265c71cfa2f54aa8e8e5174bddaa083c5d430fc8d76ae6b25988cf283124c557b30d350ad8628a56a1977ae203f6245ac4cef328edd07241608afa0714fd6a4dc68820308647180dd3cfffb4b7ee0b5ec7bb89c204030761c1b9273a9b43b35111246f2a3494418bac41c5d003bdf1f6ed2f45d52669e58eb3b0705ac59de50c3071d867e6e77fbebd40ff3b2e63c002b590b23aee545fcaf8ad21b0fb8a3bf34f92fd3191305aa6b8fb7f45a371b347245d146e6bb0a0779a71f88a258d97e1f1a0fde23e537fe6f96ea91eaaef2a30e7e8d252c8d2090b013299884f5c9752d81ba5dd9eb4b7b9299cd6bf0cfe3769314ffa291fb90ea07e53630a9dea2f5f38b53c9819bd659dddbeceec7e2a9e029e6bf22b6b16897c56fa138a042d1dd3e2a723e5461b653d77e3da39a58e4fbd46e0626050ab2565978a294e5d217d9e1bd18675a7802628d6814b070062e5a24774f01bbfc0323c24d6ae59b56728f06fb3d093947218697d9515321e88683e834f6b539c04bca72a264922ae00207915c59dee8ce1168e82699c6bf41b6219083cc06b0076c93c56a4518b880eb873a261af5908f6504541345c45a9f00d9d1280ec95f37836ea2c73264b540a80f60d01dc06faa8fa27962acd00023b9072bd4721f155a5631f1a146e2ba94fd30939a172889eb140eff1276e19872e7f25b1274855827d5fb574887c1bea6f522f33033766b53922c7817d74ee51bb12a41fbb44f6065abf04d2375103484ce2c8ed6507c2e57a2641baf061a92e523fa81d882cf21c6338c3f66207906acb6d5ca57409f9547c7cee03150298c82967670f5eb5c46f6f071fe967f99131f657de49db4beb248399a0449372f29b5e167a824274acde82ca46d550018d6355e50611eb1c52b06c031c267993fa1c71dde4e1920888af34052ec239756fe535f54b548852c3fbeddd34f7754bde4f746046041baf031f13f5b981b44adfd5adc592c1db0dc780953acd58eb329c6da6435a9da201260509edda12698dc86fd4492c99dd1c15340d49e0282cc6883a419b5f98b8f16298d369c02720fdf6b9895432d1c8c47d3b0ff33000bceafdb10c81cc8de415cf2ad971132643949975fbf4a6cdfeb9e3ded090a49e4124ecd6b9e28e5695517d3ad80f7f8f151035cb59b337406c9597b9549b9926887add70aace7f2318d5eb35d0a5f345ae5214a9d3c75ea446163c23c02ebe7fb8437f57303fcde7193b8f7758919190342b267444c5465c205707f6946de1bf99b1fb37e6a6fd2eb54329369c8ddd425ec1144fb9a6e20833d8fc1b3bb7c78114bd57a2bfca86c452ede793c4b90079c2b7c53cf3bb79ce9723a621d12e60c93efbe01fb6a2649574ec08799807c573d0665c2cf708476010e8a16940f05789aace1c660f545e4dd44ded8745783894a521c04182fde5215d1b98f00611499b7c803a4824afecdbc7374fb7c569e710a7ba209ccb6692b803174e899aec83ff864bdc4db8821f513a17580341afcc3801d5a662d58ef218061597fdf086e7ff88f22a061f9777a155b582754d76ebb4e3eb51010b7b3359645703650548f08e08ca018d2889f9e66fda219cf61789ca26b7b7697e0b1f3600edd34b25f98980bd237538197b7d5dddf2ec09b81d5dd059a2bd4dc66e26454c2ed84c7f31e8f4f7db2a0dcd2a39254d7a369a8e52d0ea5dba1ea982522cd1a893216c46241d1b205ad4a6c61fcc0a2b098f331833a6ff41250ebec90a232a7ab928dba8e27fda88dd3bbbfdefe6a2457064d1dcaff9fd6445196739aef30c12ffd552c765affa6b7151d0d3d83b0422befa8c0f90e014c227c1856e4dcbff81d1f0d1a1d9bd2d344bfe214fb7c275700ccb07ae176c838e21960928a679b9b6aabc53cebf1b34ef3d940057b7227850600f2092d394895aa14a950099089f41557db050a84cb86d92fb5c5834b019237338317139a53b55497f5822c1043e4eb04970264bbfd267c18d0c00f6ac32ae1c00d83308d61a840929607f5a1950cd3a195c073cf0d68fbf90010ff6321be067f87febefe036356810d43dff2fab0bc64d8841896ab81f62fadf21ea1e5a2101ffa9e2ddef3fe811abe0595a4e695261719fe17dafe25aa71f5b3cdc478762f787b9afa3cd20933abed0fce71ed63ecb0a7ac758d438f3c806357b7ec9523429e6eabcfa70928a14e70beca5284060eff01c3281cf4a0843ac78ebb524dbf478aff9acd971498e06af2f44b897b6e79eea378187ae4c7b1484de074a04882a6e44d43b06a75bd7f3af071983414bf49008bc424ffc4faa618d094bbeae8abe157ba5c7226ebedefd1560b8bd5ac4f4f6121930effe058340816a8bd4598b05d25897e9913c546a2dd0ab549e65e8dcc22add090656c08376582ec02302908e980b21599adb2e89ae14200e12c5ce57cadd2cf957ee1d99fff50723b48a0fce6fc722ebd7c13624aaa974fd159a9bad85d2673b20f7acb8d5b852661adc4b466b1ff1151d1aebdcf5f165222c6b7336e0915500f4f09ffed623be311f2aa6b4185b166714b72ac659b12c514e8b4a523d7048162b4bd16deca8d065dc1141dc8c0e5399aca04a946f817de2b9802434374a081bc7c9b40b91953bce613c216e4e73608033ef93e176c99c43e1c876b95b7e9d98fefad3235de3f24e475389ba4cf44575b06a31a959e11e7003b4a09e8d2b134da54113baee834fde8a25169ab784b6016af83eb62fe3f57e230e7d9c55bf5c2b3c6e830662daf511122eab6eca641a1256df9d864649e3d5df6fddb0036e8ddd98ab16c0c23c5b1a1ba628839d93cb1167cd82d2de8ec8e0d5d978cfc33fda2300a4f0ef797c3c8bab8a61a3af6a20574336143a7e1a5d89ce0c413307b0269235fd113742bea3696700e6765a0e0c20fc30e4e6c24eef9c6b8e4b7b6cacdec06a57cc1d7ddbb9d974a84859e25a8a103a610329fcecab882fccfa3f0c61cbc26a6a0562c3065814abd2cb1eaad503cf3be046983bf012bd7cc2c8ea7a2ebf0edf6c17fbac8cab7419f178bf5e8380290e9194c3ff9318fb368dffad86c58f2b1e63a78bb6df06f7884ff975d079325e0b72cdf502ed87c2193c05e801090ea0f18a10590bf8143858cc2de5541d3430cce18e26deb1f5fe1ffee7d424375ba7addba197f4f703458c5b1bfae7d8278fee1a077ebd6667f1da6ec22f14da1ff37b658b7ce4865609ce6094419ce2e1596adbaac5b4fd5d7011d7b7cefe6015e71522bc26fabcb76c0ca1264d0fe3df2d477f192c3a5c25eebe24ab17816ffb78e8af0a505d6a7bf5919e95331b383c5da3ef168d48b21459dd73742c3be98745ca15df1e7fd8be3705970f6f2266b90a9a9e065fe4254f6e463cfbeeeae227400e55abfe64e55b6ca0d2108d48664fef02a28098cba08fc20a99bc793a187adf47d449a5b8da3a220bc3dc8f88acfdc18374c15e82a03638fbb9848af21ace8bf5486fd8d70861ec2d91330363faf411ab6b50d159497af6540a1a36795a1299b04e3c2818cbcf77213442b5f9ab95bf6ea881041fe76766c44ccac9c3c6b052e6d20a24afe979d1f188dafd362087e7ac21945a3091485c35af34e6825b7f1b934da62eed45daafae4e960b917e645b74bd1f3f0c7decd9b6a7758e66e1d882b63d3864ceb7038b680395b3194cc3b138971c21463e076f891871ca15f7ee4527c0908bb6195281f87c36178b062bf72e58beba8343a041596624ab76b41023cc014816988c841f2b634edbfe5ca545b5c0a8d0b2243e65ef855f8e02e73ee7e9e137832f6cc07f3ae72dedb969bff0a57c865e2950780af6ebc4296f1bcf3b7b80b452686d1dfce5748199767faa9e1cd22f16a269d42212a987317545142c3472532a8d754aca985c280f6a5788106776991c81ddde7f9846588a57e024da9c76d17d72acc30f59e912720d5428ea864c89a7653a6a33e0d88ce7cbbcfd483fcf2e6aa7366ea256a63ed13e82e0ae8152141942b9e2360d1dbbb37dc8903ea63c27e5c304ebaa20e063f373c8bee419b70ebdae4effa8823c73c38bc35e9ad41af0bd2533079c644177898fde4add14a9740b1ced0c101888228a8cc74a2cf5ccf0ab91501cbe79da63fe1eb8b5fc9fa2a39fbea2768bb4b88dc7b4b99520a0c08c707b7074f5ec4e87863458c8b90270f9d1ef37112c103142d70b139865b903084086eb139722cf4b9050e4d3117c229433c288b2de6020e1e9a2c89d19fe39096c55c6014c4684b0a4dbf7744cb50cc859c31616099433a886928e6024c861d144f4289165ddc622128d27148bf30025dcc855924c66ea314c1af511cb20b94aed8c5e6183211f3b1af0b4ea4dda53ca55d62964566c00070014c7f950e5a8304960c614521df4869e101f3fbeb651b81118270dd00169d741dcf2ffed0db51d4fbc3afe7f53a5d50fc768ba7cbab60f18bbf0057dcddf90b70c5b6bb3b0f6100b2f09c32be04932c9261b445068009db93bed724497a3446ce39dd65487ef99324d36c12f24dabb83573c571e67ed78058e2c0b623cd1e7c021145268a76229f4008892574e9d2ee347bf029e6c914611fb92b2799db9dc479390b921e7876572cd05bc32f56a94ce82adab85c7f15fb887e390b9227f6ce2e21df1c95bc74d963cfc3b9fc5eabf42af567fa5d73a0e5a6c82afbcc6005ac882bb81451e3d6d6501d562c0e52e6563145891388944b20c2d62e229c4164f919ac41a506951a546a50a941a506951a5474603a37a438b5083dd8596fce78b0b33edb8742fe64884eae662e6719e3091e32f09865796ae27994292d11a4026d37d00b54189492122ef0ac308102d28b029d75dcc549182b71c94dbc8bb203988b627445d2f54f4156e372ee87312e7839f703184f84f683f57876e6f3dec65b500023967f1686b1332ee77ec0e2a675390b089cc82813d773fdd58673cbc4b9a50e8e195b83bb3881704b06436fc96282849a49110bee5c81945c0f37a19c0f58889c7250c2202141cec88a915b4e0448b4dc085a90fb81caedd95e1111540525463409420645298623a8406a02871c6e6802450c65440aacc85091d62bfa8e386f4e2cc91029754b455d773737c063fed51ed335bfbe2eace337d20ca9f551ad2175c847244684355d93b664f06b7a317ecd0608d9669a4678b46331d55f478d3ba6abeca75beb37ce2f75a4f99e486ccaa6ab7e6aa4f95a3d825cf589c46602a84d51eaafcf43c94f577d29ee9faaef5f5b343e50ef8fa2f95a3027ebf74cd70742d8af3f65b3fe9cd5f75d7d7ff266d3557d17f36aed7408849de5a797b38411d34ed42c6660518b86785fad161083224d3c0102dd0c359d305c4e00430abe1459129b73ce3951484c2cb9f373cc39278da62e6202f384689d29f75a6ba5f3f331f55f6a7e3c53616a2cfba6649807f533a38c2a858b6a95f4837837f55feaafdf2c36f5f4c3d43845275b14ff7bf1a346acf8f341ef7f661dc5ff46be2208ce4ffc298262abc73d2af6f77defdf47a97fdee3f58b3027515642bed1e969c19ca441a82ff231544b8a7f7feec9d2e5dc13a45b9270fbede5dc1311dcd0555fae28e8b2fa89187faed5fbd902ff67fe781dfdd9bff98deff5e8c0b07c3fd96f5937847cc33ebf29fda982044e8a40718361894810424061cb3d012505344c3aa74fa73c10b1a39452fad3137f784b0527bdff4ba3c996f57a2084c0c816445fc81084939817c653172f2890dd10460962debff7a4f775f2a8e02eaf0b3b73b33cd0f3bc67afb91d72d7f372bdaf717707e2a4f73f5ec208ac7f7b5e77bd021ed9e1764b180c9683cbb91d9ca492ec2003a8646fb258b23649883758d61499176c069773b51c5245d8d5e55cad488864c330324b7051bf5895153336587105a918581413a818585412a8c456a4f0488823ec7739e764cacc072c7839e7c4a88793da5754adb563ada25d2d29b151fa234404e0c890cd91284900a00bc0911d90d49810060d00479080804656337baaa1031894686650e8c041905107b32a38b09838983dd161831d3228b166488634d821c36d6004cc0d193069e0469880b212d3343350e9a84c1675396724e996b02936ccb8ad8ce460838c1d4772342accc8111a6cb555b44a33c2cc3003868c0a7bc14ca6da2a5a31365bc4c988ca8418d0668ab0c00671662403ab4bec888156e48824eeee636a758c912d819009639e6a85ed706b7dd157f559b5de5a6bad6198dcc54d7567c33cb98bc5c8dcc54ee68ad068d861243786861d300cd52e66f05e48daf1c21258613a1c68b555b44f5d4c7872faac126dee98792658e23b8acc682d5ab2e303b23a24544d188366c55aab65551c2ca73281b5b99c6586da8c0e332449e1ac8d81e7c576704548a4e50449ac504902840e7675394b9210cc14254922f660bdcb5992ccbe2a561403fe60c32eea08ac88c5934571e1c1d6cb5984b61c215425254b85111a816a0cabc1e52c424cbe98610b2118c0279bba9c05c9130d09189bcb59966cf960308353b0d6c1bec9349b76a856f38b644ab59d4c730968ba50cfba614320c04dd568b1cfd7404b4c5b6e73d91d00a582930dab71fb09d013c2edfe6959214f8dbbfa7baed20cf9e3b1981d674699519cd1200319e28a4673b30cab414fcf4cad94e906e2cc5589a16aca904e7607a9ee0ff5214ba503d51b34aa53a29dfd7dfde07fadb24be8afff3351750c39f83efa1c781600403a9d4e57979270e890cfb23855889627aad0f244155eb66cd1f244155e7ad09e30988e0e0cf6621b236011c5cab5360fd84d4d8551dad30b165d00718e9970420a2f5874c1838a50656281e1e8e0c04070c1d887fb4b11aaf4978c85a41cf4aca25851550607e3b802c995f61451008a0010eb38d08dbafa22f59da79b9a95787992404e7b02a00ba0ca05850a1481dbef0fe4a58b1980158d0c3690a11ca7d64fd3ac92a669c08a4a85628faca463e38632628f37379c919191f11286322c9d7177777777bf917177775789738696e529779feeb0276cab6b77b73be89f7b247577f7272d6bce38f40e2d82a6817177823f3ed89271a5c5019b336b85940003f6ac65a91d6f986412e8f633c928dc763185db5fc5daf5036190946ec17a0b5bc29cd8923559ef0f83e92881445d2c588551269987c074c418613d4a08b5fd6005d6569d2a6c8983e3b49d8c63b06cf1bc6e8f83dba58cdbcd3c75ba5a06153d955b1d0cc13a0706dbb5ee80c8963843f387dcae348bd0f33cdc75c755dccee2922a16a3eb2fae2aad3a5cdd7517dc0ed75d38e87b1bfe7564d91bf8b31d3fa474590f4de3ea7fefa37e8f6a0d61553b5d3e5bde9087437db0e5cda6cba395f336639f996536cd9b1391659fd9dc6aa16f0bcdcc93c87ae5bc95deec361312a77f50c62a5aa5dbf55fd5d4da75a434d49de1cf97c13ca87164592f2c97963fa73a28058d2123092494edeb349e2fe3a6c61a036b02dff9f5414a53425b7e59e0f63421049bc90e7897d2b099ecc0ede7960205607a5a669222619d0a1207a68323a6345d0ebb9182355db60052d812a6f337ce5464e73be5a7c4db814141d00ca589b0c4d6a062cb29a35ba88ee63c60b29fec057e397d6ff7c3808fa6c46cd2dc86bfed62cb7a3da8c2fad36c567a63266d06cd84269319735c126d220c92c2955f3f3b60604b7b43c9fa8f07beed52dad5cf15a2eb9f63a9fe7097bf0555d0619deb3cfc2c96b553a7873d283d80c2d8b2de58b2b687d20abc0bd223c9e9fafbe0425b491c35d9723bdb5113921318efa01d4e0a11d3b433812d2dd5c1965eabdfb666e22e6ff2af11f15395d99e35a5e0e5946c399bce665120dabea5d6dd92849092388717b6ff6736a5e043c7e40186b0650d81adf476f3a1a17ac552977d31e4b0c2a4d413470e1decaa04255be210594ce596acabb7c4c1b95aedff1059168bc562f27220c7c0482b46d71f47a76536986c596bad55b613594880b9fe353730d6af76f0400a5b8a462815b7d98ea21c4d4a6454bbcd8a445cd20f4790b00209a12f5daa14ed7a6c5101080fd67f86163b167801e6b2189759d0c5138eeb5c388743baae44a1b0623f6b035c29c6b10fbed8bf250e1a42b6c4413a09a3b1c4963898660cbce5e6a888ee0305224b9b581870ca2ac2ba5c7f1d1c34fd342ed7d103e6050e8e6857ddbaa143e4dc90e21146d7dfb218d74d69103073fbfbcb156e33d9255912747a6a6ed7ff491cfd7e6eeac115cbec6272b564739049a8238c905dff1b1c97d1cc9e2d285fb7fddc832ab5dad6edd984045a9196c04a594f697555b758940a400c5b526ac5962c76bd0e4eabbc216fb3171406d97ebe292bedfa73f7b36a3e8fbda2c23ef94efff7e44541d789dce55f8262ae0f7920644b17eaef5974e63ba5cf8476388724e60b82f20d5dff92e58971977b4f50d8d285e8ac63fdd199e7952e54f9c5fdee62bb1272fbab50a57d50424e400d8e9a228eaeffb76c3e0d148fbe96ecdfb2c646892d6b704e6e4ea0f43ddf78b447baaa591c9af9f5031fecdf92dad0604b0af31fa82042e7d1de270234e641c15dcd8fba7e7f7c031a2cce77927c87be93d5a1e03ba8237244145d7fdfe23bcde53afd5a2555a2382793dae97aad16a8e7b4d8d293a847a3c2c877ca8fca37f41119dd9ca21c51f0c379ccdfc3af69e4a42d0c5b5a9b2a6cf90d4d9ef902bbfc8fd468301abafed648c62f576a2959d9153fdcb7745382b4eb8d7d731bb81d6c794373b0d43679dc56fb8684837473b35d7f12d635264e3613f23be8967dbbe1f18c6ed7339a3c1f918b334a4fdb8ce23847bafe211125fcf29f91c296d446917ca704955cffb2a3dca31ba8a48fdad6362747d1c98ad4c1bc3912b55dcfc8e6197944cef3117d455e9167e445f18c3e22db513e22cfe823f2ef286dab799056890883a4d0f71d03d886ff5fb1b305c4ad99294870588f471d318498eb5f7333852d61ab29ec0266a4b025ebe61790a332ee27875d31d5d0417688a4ebbfaa9142bfc8c7eaf3cd2a04411004c16eeba45321b7e13f43881b25d6460acbba4962695e8441453e067e7dbe293f99cc6df883e314c0186bc3c59653e6dd3c1cb74ab753e681d185e07b385752f25cce75a5bddc2a9de996b63565166c7960a607c677caea3d55f1937925c899a0a8c8c7bca72fba0ddaa4a43b994c3643fd1c6435b76e2b366c095b8a4c583256029cb0fdf4f611564e08d9b4321bfe3c9698d892958015581a6cd932779712762c8890714e6666e66e9eef7d2bc8109b286cc960e67b3fed6257b923a2eb2fa4db1bc84aa583b6ca968d428604f1da4d55f421ec98bf0d14b65c5d7f5a1d713d882e4c3a2673b284182c930fd8a6f9cee842e54ac8e996f496934665eef21769257cc09693a6a23224963ac92e9b31842d67d00c92c962234dffd31dcd22178451ae0433f4f90686b3127338e936fc4908812debbd5f76eee2fbe5a9e79e00258aef84324e28da720214a319b6e846bec3ba9b5014df61dd10604e8062e43b34274031ba47a8daef79b5882762e4b044857af4045b18551004b5000388a22e4378069801064cb1daaadfa38eefc31e476f2c7f78ff337fbc81b0aa0c3421624350ef82131571129332512365950eb0c71276fb2b6a44b538d6237dd4ec910a59af05847567bd75aaa85026a1c917b9d81cc32fb1b04350620532c45c580d81e14f5c608416a373a4f131e7952342b8d81c6b8ec47ef28d4727ab9d20c110361c2462de0f4d34994590bc20d11e4a52454c8c8e3848c4424fc948099e88855f0f554c8985a09844d20bbcc4c22a4e11638c5858456fe42c4b618c60c88d15312fc529c6b244f4e9f426c02730e914609703f1ee0a6b8193c0961993219a934d9bde399de354d8927540dede240ebf603a3aa09a0b9a8a9e9e9e9e1e92fceffb3d5ff6943ddeadf23defbd8d68d7f5a546e2977f0e13966d7036acdd4028268b6404fb70bd6299b84e5ca7e9bf3e683a365b3e429a0e4522b1c68963cff833a2c6f175643b09a9c7f3afbb4110049b5f38b09e9e10041f172914e557aa45e96e97c3631eb7adeacccc2d80e779dfe739d77f3eb18feafa4f313c53895d41ce42b2474c9950a21f4ecea73fb698415b6db96d16e07ee3dc39b9b3a96251b7a4d5a68a9d4a619867ee80c13bde2cea9c69c38e67453ba52a2e960284a1e4c513fce53a0b7d9d693679a65151df98494633a35952d1349a497d633a758ebf6a3a81315fc0e40cc3aeb9eb1c3aa3317851ab628b3aa9e4d43798739cb83e73496cf1b495835ffe365576f305dc37bc601fef03321ac35398ebd46decf302fbc0d03b148926fde7ae745bce6d3b5a65e6a692931d2cb13f88e6ce4b729453c4facd26839dad929d56c84049c946e3a6b9adce59ebfce6fc1a0cbfbce89cf905bbfca90c19cc72eebad605bf7c7ab1a4775a4deed8e77bffd90565c960290cd7ab18d783db93e6fd6c1c5845bfaf9b49d6dccddd871322a429a52608e1a7180cb664dd20e100dcd33782748effec010aa2d33118221d60d2636057df10424372fd7d38d06dd4477db381cf62b1584f4252230829155ce31a77e47356661c6ea5c43edef56f2c3ce2d867bc3ed3729df6c4f50f8f6e3459faa8c1b7f1832d99e9e78aed315d3ba6cb6b4964e856a01f0837ddfa1e377d40b8a9070f279d8a45dd7275c7d8bf5676c0e1aa28b1c41549310820d144b6040c11d85025c62840c2822567e404172462ce421317f450450e4cbb2331ffee6e77c7e168ca36a7c85cf286d8393ea46128525425e6c2082db0028a18f8fc2cc6519f4b1b03cc6aac8e302363b53584bd40117361052606d60003639fd5f51781796cbdeecf5a74dc46cfeed9a2afd33740e09c1064ae7fdb60624b6badd7b23ee784e9e079b99ce7843c37457eb18f5f679fc9e35a3c27baf87d37d8398a2851f41cfb10e0fa77fd9d8bcfdae53eb4ebe7977f07385bfacc91b812dea98179dc68cefa86e384f059139f390bb809263d0acf7993107e85cd5530654a4b499e6464641401288c5ab500bf1ec42f47ba2df46d81261162629de63a5a6cc94939fe7dcee939cf79221839cf52f31a651fff4cf01b845f3d18043feab5e954c7c9967d236a011760ea974dc5457dd957dc3e9a424812d7b35c7fdad256fa4633e91c7fffee1bd24ef8658f61c24a6a46583a3314536218a68efa8623813d345b4847b5c9d3337d748e37ad285445f22457725cfdbce99ecbd01a4ea56a3d31a152049356d8e57dcbb994254ec02f6f22aa0ddd1ce7b59ae38066646464ac8c8c95f91f9f9191919119e264b7cc5d7d03039cd33f6381a1130468f4c1affe9ec983828fbec100cee977ea726fb7dcea0a2a25c8dcf9ce837aa15aefdda1075096998aed5bfee774fd6da858ef96ff7dc367d777406081264dc791e59c154e974d90b9b335845ffeb1236cdfda3302189673570cddf22f6371a47301183818e1c52e063479ea3bf8a8f7013e8ac90708b680a60b0134ac366a5a0fedee0f271d68ea6acc5398dc3517d80e1a328698169ac62f0f626fd74003e738110aaf2e6c0a40fd64cb9efe3ceff33ccffbbe172e04138e9973ceef9b35364ed8b29bfe70bd697d8347e778e770bbc96d27de7780772bf40d1e17d0809fc03c210478a76fa4bee45cd85a61a65a55856a31bfc2152ab8db81b5d6d8595333bfb16f60b20626bd09bbfc6949c5f1cb07508fa65197015f83296cad738439a9d3c3078d162ac9e261b8b2deca572bf671dacf0c82445aa493a8ab33862d7b56ae48cab3a35dfe4c4544edf29527da54b1e12d57b456cf6eb6642504f0cee700e6f911f4c5cebd95702361b26b609773ed8b2632f0cbdfbb935ae9fba16a953db305fe8fcfca9eaa35f5e3a8b16b7765958e3ae2f04ba78793fdb319aac32dba6fa02e0b6cd94aae3f8332380a1f842e47e1c3d1e5da7ad0c5b0b57b5876b6a618619094a69305eb19c3da2071e2d63ab012c662d514e14490cd0c1e84be5dad449205b6147bee6cd94ee5e804e6fb0de05f8a5b98744defdce5f44e979f75c3d366d369828b478213db039b5cd892c562cff3ee960ebda27f3451bbfe2ab093ad69006145a6eaa4d8b242db754ed4f3280f2a60b10249853fe79c73a27ece1a2a8e640c6cb9e2bb721e8ed1b0d972555f443ccd969f72ba04e7b43ce7fabda2245dc4a4422ecaf5efa01612e1892d5ba6238aa2ebb34b20e25d5567b2237c21525dc809b0fc7d998bebdf83634796ddf5e7b1e527b7684a48d127b664a5a9746bd5e18552517d7016a4eb4f45ca54757834c717d69ff2601d87ebf8624b9dabd3c359a0b2cc688da241832d6b703ee054cea580e8fac37a7074c4d8b8ee57aeff8b5bac5685c3af0f96d8bf3492c0e04a10362861854f89c3c5a4569b62542baa1545b1ed604b5a73da9091acc6eac1765399b85d7f71b5bac1d9d9b2be5260cbea3278384bb9eb6f3daf39b743bfdfbbacd2c18207ee1cc3fe2dc557175b8a305dcd2ed1c41259d5aeb6844152b806e4c73bf9e3c7e4f96ffaf1b3a2f956601f2e7b88572c56139025a2d89be7a60f3f8f497ed152b045f9e57580142d102bd6847af6b3a367fc334b410416078d7d689a03b407a594a61cd544771fa150a8b6cdd60a4e8209c0173b5ed487ed93c5aabee426d4875f521452b84098ebffa36ff4a8005b8077c007827958ecd34454c1328e6d2bb909845bb68d9b44c0a918e0b1d6f9f2a9a09a5d86e0208a6097b74dc94a09f8e5ce0484820fdb0f15b80bea3bd59d721c7ec19cd4e9e103c8665389a9b6825fadd5a6892060828021d2eeaed3c3472a88940cdb4290eab5eb370a854ab5207383d43b9fcad83103f57e44689014bde15bb186e2f3c8c2903be79d330ce78b791adf31fb33bec4b16356a631ce18658c76c4e13b2ad4bfcf317cd56c957ec39ff9d438c7b2a6de8eec2eb1c53335aa7e666421f5576664a16f8a85899aad9a1385528df4863c6d28a65262984a85a9948e93389cfc51dab19371918b5c161b335b92e5ea7e5e12fbcc3f9a45312af25a931b70681bae13895e920ec60b30d04549ba972cf334780b01725cfd3332ec8c4fc2c19348c71ce220a288aa334c8932aa193b4383296c49b2d32071f805d3f10114845fa9718893dd445d731229c949252749325cf27d73ce23d7b1cb9fa66b1a8e55e079df47713825f659f29d0602c6a7934f31e09734a8a44277cea47efa31e671544b84db20b874ad6bddc8fd7ffd5570e738714ab810105d370192ebb4c9e4a87340b8a5ebdcdd754f382b3824a66e098afa71e2f805b6280dfcf2076f4847b8fae53cc2512a0508ca606bab6427efdb3c3a9a493069652ec1ae89eb1cdd952690983b2e4cfda5eb8e6ed304ad1cfcd2e9743adde4e9db4d77d3dd743da7e7797336f94ca2f3ca84e2865362025705896905aeca6c9a504c152881c3dd7044dcb460a9327113f7e136086de114db510dfbb8db6c6159f37d5f8f6aa5517c46f8e55f8293f5e7eb5a5cce55d1e5f6676484e63be557632afa6642fecdaecf39e767847d6a7463084a96733927abaddad88784eb5f6f7dc35f40ba4cd79be644d5dcf5236cdde23bb694ebb85cff6c1536d65bad36273d070f76b01ddc3e9baeda98c2565b0d0098e7fb6abecf16859d51d67c40b07fb57d36cb2f7f0f86b2f0cbebfbe781338acd568faa6ddaa69193b535eb510d818a2d6b5a0fc0f95725ff6aab375837ac610dfb2a08d63ac10ada6ca14d0618435e6e33639a5f385eecf23941c06259091288b93d7c8795200198ebef03c81f0506a0beb6686acc7ef0458945b5641bdc62ed6348c825561ff585294745d2f5eff14577fd7d84b5f5d3f55ab2bf802c745354316242c5099122c6b8a1c6c410495409fa649ce0039314268f064ae0031044b5274f8a883916b6a1dd1429a8886124e65d68010222c434b9c1c82e96e3486e4a0d065eb0d022e6efdfa7fafefbbeefc3c9f590a1a6d81910cc518175be2a1dde7f4f2ba51504ebfca2e6e4887dfa75c8344f09edf29f31431445715a61bffb7ddfc4b125094885fa0840311f2ca1bf8223cd1014c216500a1f7c615bd612e2640837cba9d4a73ed52a1d552b0a552b8af9d538309d2a3b2e06f0acc9c33a7394b9acc963835dfeaccb1a21c94ba574747faa1b4b567cd54b6900c764be647db4a2522954e8a93a950a3f35fa0d53ad5f6203a0e36f28b1256c6471f0b38347dda5bc1251a7e7d5f8e86cc939ef6130ef6bd8c72b0a045120bfba67f70461ccf48da1b2390688b68e79fa0594e7d54a856caad82973bd67ec336ff7b4cbbf27ca0ab222b6641daba70315d81ee22bf84eb7c06f484bcc10316d843b06242c1bea1aae3f0cddb60e226405272bcb531fa250616a4e146aaa50287ec19cd4e9e1a3652d93a55a8585d9576ca74f0a6cc94b3cd8a76f4c1fe6192124278f104b6660425f14087e737e41bc87023ac75fc8e4610067c14f4f24805fa10212c03e2067c153f8f3d8c00b611f9086232f74f7d7fd753fe9246c89474a2686898989f2649a3c9569c8d26ba38aed2fbfc6c929fac6d4a1735a0af6e9666aa6198259348d745260cb9adaf5afd1600a5b36d3656a26cb62391393c7e439a9b5d65a6badd55a16eb3f05995ad68bab2d5ccd0bfb849747480f8dd76bec3372bb5855d827b4381036b4b023cd0c4e631faff1cbd927047cc3a5700e0dcce33bb0cbbf563acdf33c06e70453f8c49fc9c3b15699306fb73c0a3f85cf596ecd8d540cf058d8f2da74fda073c5963dd44dd8493f619e765ae7f895b6e1fa075a0f4179c2a4ffc02ef75a5ff1201ae73cd09ab8d1fa4613f2f44429add5bc9aed82a6e448c806073b8a9eb7c3c454c8eaa53bfc27c03eeda5c05cd9f29c2038271555dd6037485515c4817509998a50480cc31aa46f1d2b503f254e3b45c806b09cc362e87a14552b8afe2c612cc792880c20acbb650564befe8cf167cc61471e33ad12083f9569b193f35344ee1457b81d44b4c159f096e29d0fbeaa15c4af47d33ffae8568f540b68094bb6dec910bc582a53bf4754aba4b7fd4e50b4c1592f04206cf9d79decf977199dd212f24d69c32327d9794e9ed3a5d4a065cc85023eab24d0924999ef424c4a7f534a1323c2ceefa7f99ec86d0ee2dd6902a594524a6b05c21b53038c2da70c8c2b631f769a4dbce34d4ef677b9cd85cb962d772edd7e4f621e4ff21af3788d5dfd464636dbec59f65366eae44ef60a2954b660c2d2440e3127a2e40343e0866c08423725e63361106d6185115898004aec031dc27082a8698b179088f9bb0656d8724e1cd994c964b2cf889c97b9a18b93797273c02effb13aab85cf6f88024154d5512beb4bcd894e07043479a86ece49a90845942c1a1baec12c26c016568f8f1ea0a0eda8848d77453d0ad1cc080020001315000018100a854342b1704c2047a21c7b14800c6c8e407c623a1889a21c476218830c31c62003800100000098a121220200d063c33b5657c0109904cbd1fefa98995985ff6fc0dcb08ff3586555df3c9ecac65fb0b23a9c33e89fa41203239c03640f431f0acb28b65d986cfe8a03c198226b8d0760258d75f44517ac4907f8d34ee8838cd9039a5f242a464fdbe1ded61e1860f1a3908cc4e7a4f7701606792b47652ad504b10dd86f1204e2a8d9bd04332ae25f3f8d24953ca71f35801fd8253e50211a5e9a520064707e359a5da7039510b0f2f45c8683c01b867821011373ad63cd0a97329e5652634e0104813a5ab0a4fa3f3ec454e65067b001d192fac460c18b0a1c07296c0be56e49bc664d7aa04b80a714d6a3b6ba9d420bf145b9036f4579b5872f0b70a1a35d6352e8a8a7f8c047199157ff5b7631f0f984e8a10c14467f0987a5174bab838df81d5d7311375d2bc18aec14079e5c52215bae9dfa97c8f537da0548b34e53f05796a33b6d4b97487fac776afa635d967540471309dfa13025c47434b650e917563c50b9c9e8d4b4c474ebd93a1c76db5f8c7f55a574fcc73d3a2ff5522d24c8ca8cf702bee5e7ff25aaeacef9a35141df12df63bacfcbdb7531d75dee9ef96f51e79f694685f081462d6913c25dfe5c75dae22b2b576e09cbb9eba82329db080e5cbe55a4563305c6100acbab8ae08184951ec23aa8c9cc01b4cd0544569c5597985c0410d58a628d2852d285094a1e3ca24b42dae1ff5cba0b62bf0d3d1e5fa14bf161c3697410155ad2897255de4902eec53964037a90f852eee36e1c44d419720bffc0e03fad1ba907d65bd00b90d404124890e04e538f2fe61f63c911b2730816058422dc0c8f76eaf4f581927d49b02b058157611f2acc782ac69ba81f298e656d03799012bb48c0aa81353c887338c2fdaa2b6f5a8691a73cec0186b31e971720c2df6de9a1c0f1daffd6a91711267dd86867441ca813d145d9719bf21b784fdb580ea5d89aee36672d5ca68ef2394acbdd2e69b2a308b2cce8fa8a47990afb73e053c34b2e9c3964c652d1885ea0072aa0aa509a47096646c746673564bbbc9b5e74aab2c8b5172cc5afbfb472bf25c3788a06080d3860251058a4b8f2bd84f6eeadf751dedaa67fcfa65c686db795341656b95f2d2d47e217d73c3b3a0a8f9850f2089ddbbb63e6a06a37ee5da047d85a4ef0faa6f5a53a3d2a0184dac31f0c6efdd22668324735e52c2ed3dba78444a0265d9111e6a34b2bec7ca542bc2e847ab09f137da025c9b3e27807ae0a6230b6602453e6e08c6ca1f7f449fc6f1badd522f5f7cd094b7172f4dbb9eb4a61fa30fa6d0e05f4c77b0dcffafe1ef544d2a7f7a1a0e247e72d1c928253b77e74021a466316db37aeed966a35cc0f7db2fb229de6f712acfeb5d219a856b5f9d954793548d81257862c4a54f6b3dcb96356cbe19ed09c206ddc2601f85f0856a409d3b5d9cb816d663186a2a43ba5c1c3fd4079b811c285a072c2496623a04d3613156611b0541f2299c90eff099c261a46a67518fc809175e063ad7222fffc00910f0518c91c25964d4a250d8b30ecd299ca5cad7737c61700c76b8c00483bddbff45d1c771ad1a16d7b026ae4feb38f0e7921e3d0cfe0a042fd337cd702cc0bb241381c1bb00440cd421015b2986d48f94d4d19cc374e06e67294c896c4e419c0def9e42398029ee85a6b27254223b4f0b7cfedc9c0a0a00e9ebf19660f5ab7d51e527f2c6f9ebf19da8a25fa10e4233ab899c696f24513709b525e68e6a97f0ee9d839ae158316accf7c2617f91bacaedc5fc9caedf6064a1e74c1d6d89922ee17b4f7216e513637442be531f1c4047203cebffa566c076727d28c5781b319368a82206022dd124a9a744594a4f7d3629983449f5b310524159107b906971d997a8e58901445159bfc2a02fa522b869b2bc4cd5f61adb96796846ee18427462c61e6ce14ce9363192d45ae6fbd8ab006307f12c61371db905531a0401de3591f4b8c2c9add739423675c650cf1560ff414c60a4ae2cea1cf1ca317cbc4b13db3ec489721b4d8cc371484871361d4e6547f8cce31913e85897cc3ff649fc71b013c978dad3a8617379a4d613c3f8031b7865c6448f26f6a5cc60bb68f5b7f154319ef7a8b08a8f505566493f112f88d6b50db51a27314a8dace420e09974d85b3b92606d935940adca360730bb797cd703cf413f81db59797e138c1daf98976d7b1b460ab28d2e92861fa42be37e5a0970ae1ba9cfefc6ea1167b136c6ac006947121b6f8c62ee07bde5f63d73d7fda4593e4226df32d46d3e333b212aa28ed017afc733bf795a1d63952bb48124954df3fb9d0d6317e5fb413fec001d52adaa9f16a4149234104f62dd013eb7e98367d0e4f59ed9c1c9e80d38d1f607e762211ef5df0deab9e011cfad0597d72e95d2d9c8c8ff68d823f3c721a9c929699a025a59f427138a098744f7fb62bb3703261b4cda21002d4e8cf5cc9c43343676edde9b1e340e6e1f192cbfeabf9a9f4c58aaddc045ea60e40109cbf2ad1db560d06712806ba9edcbd35eef7b4063035674f6df0fb2440c844dc8494c03add5fca1bb502288c36892833f281a4266aa38990e4de57ff6f493ca799f3f039ddedfc4d2515957f69a5cd7ff4ea46727e4c20a3d334c5372f211a1c55c0297bd16160bc1d049f35c58be82829b8ba4a5bb3beeb60a37f88fc5fa3e092bf56b6cbdb6fd953ecf9d5629503d4d3887daf330c950784e3634b31bde2d69c056ae37a90a5b0245adee36d866a4e1fd7528138d950f078bf2739d35bd3527a7a7ed9d85791180488541c579719d6a8ebf77614169b19b12526bdb07a0ff9ac78db46ba8b823b9aedd7b86d8b256cc18ee1193a3e5b3c77ed59715f65886c07702b5e7c941c1b173c9d0edc1dd98d7aa279afb64c9730ca7fc52a9f8f9613699febabd82127cbd36067efa4f373fa46306ca82ce6809435947aa584718dcc82143132729ae05a005f9e92768529503261fe66255466257c347170691ee9518c822231124394b7ada35b54d78ce452b18f42cfc3630df2bf64154374f2b7bd1f0f46314993593f18a8c4963dd3815d2633e6b0f2809790d0390b1e20718450e8616ed6de1a21a04bd5849cb11d47919e0bca7dfd2c3d88f96d5301fc1928e18ebfc5430632a8b1e8abe42fb465f4f4292a1585511b2db262b3169e23f656a7e761a91ddae77b058f6bab6e3d55562f76a34545f60c0a03b01c759b0cb9ab7ff5cd6e0d5b1cee8afc294f491da43e00f8752a1b566358f05bfd5bc455b78f988f11d71ca1cfa648b0f0a921d05b76dfb65cc45fd94e2fceddf25ef625778f77e09588284e308de0928aae5e88a8bdb5fd08aeed1d3bb6c0ca4bf43e530dcb81e53c03575684f1360043ee869cb236d29c7582be9417523c744a977bf2163ee54b6032af876e9079d37fa7e6b819d16f4e6ea8c7dc11f85d8f35aa6e45e8efa436ee1dca15bad11a33ebf31baaf48986098ffb49412b15c8e0577fdc66d6a4cb1708b05d78e15033dd8e36ad15838cdb2a30b6d42ba45a48b76ad6017a2f315b8a8160bd36bf11b2f6913d36243315dd4efc31b141621c363c3508d5fa05a604358826c9187d8b53b2cbe7c22027234aad2de107194f8f19efccbfed8cc594424c0ccb5e8e753d5221ca834c80c63a93061a08673c691be365d98f438cd071263f0767c5e475f6a55461ba8fbce642b3cedf2c0209c0db400f64a356e6674d9d0ae2822015b146158be73dc86491c6944d1b473c78c46e99f309c5df35a7508dd17495de790b6c7205382604f559a76c6011129deec8997daeb56c7aa9e906455390c599f4aa3d8b2f7f59175aafa2aab23b101817628069c467bf755fe4b85371f080c3a79ac54f33a8f1771c0b5d8eb75b849093918fc3dc9ced91d6689819e1a019ebd790639f9fbe2a27ec480ba5f878e97b76a0609ab868c6e3b0bed96dcdc01fa3fbc8c038bb24de32fadff1810ead09303ee71cdc53b48f7011005cf0fa4e2efc1c668aff82f453633ffefc6c61e2fcffad9b3d3464eb4c7b400ec379394cbf19475810d628625aba1d94df9a5bc2a2c9dfe50ee0433577fad5312e4682368e8df20d78e533cd0c2b5e35ca4dccc1de275b511e71000b2a37a6d27c08df4435d810afb6e0c26700e77e1653c30e326224c6dbbc5089a8f2492a196479e486a94b7669c019e444f6f3b147297bcd7e53c4aba83d95a7cc3046443ef02b067b4e345fc4d8e4097b0f2fba9c620eb8d601c4a97fee7f3adba4438911b1ada331614c12a2389562f9b39d6169418d9e1c0120b9b4e468b110c5a43d1063a9010dcbaed78e9b24f192e761e86f00fa1fa6cc9dc3b9882ca96e888a67395604e9ce0b396ad1c987a4dbd86217c653b8cc76ead3b3537040b4d3768f690700653b03411c49c482ba3f22b50a2a1b942a04ae6e02158187291457f87a7a760c7c6d4a90a2b5970dcb10ca30a2ccdcab8ad13dda8a0be93610d099838fb1aed8709b9abae2b0e730ef4d87decf911e540c386a42c38d25516f94709db399a3b5c5117fd24607da9cc3ab513a7825eeb694981bce9ca05ebdb74ce1521773c41fb84f52aed926dab3df6908c9037a0c261bd82a1dd685a680db12c02cec10f94f34e5503c5d920d5b454943bc171d85a46e5070aa07cd707efb9c5ce2f1c66f2279399c71b7d20c53921935fd857ed95c832ad56f9880ca1af67f73c30623c215a36ce242cfab0b1ea7e0be3d9e4575d74cb9dfbaeeb34459cef63c21e5f638fa42109b0c91e01f7cf785ec4104dca4a544bb1fe87c50e998a8c8c6f0b71148e60311e47daf7b4d18235acbaafb9c7b816865293202713cada7946a780c9766833660b2440c6469ecdef3b364d5c95719f7097500e5adc9a6fbcaa74c5df0db802555f0046e1f56137a905077243472094c4e80358a470d5109ec25084de39fb64100de4a345e81efe7e0085792289c4943d6d5f8e5127c0ebf171c2a7c8d926ba48e942037562c226c8db32bcd772a4b234dec147d01de59807e2c6b7bfc06db009ed84be82a1561686448fccf144d4e0d6fdf51624f514687e25690cf5586b2e8650d5f15fa19a1be8d25dbdc59750197a51a937c5b1bcd8f0e42839ab9f1828ab47ea4ee98eca126c0b60ad40136004b12074d247d90f2aff60593ab91863e90f25cb0285087b06233bfc3e7b473d740eaaa5bbd42c3d18251292b4baa9827b26d21bc554a460ecb7b77deabf05e6277d2d19056aacfff851142ef2aa9f1359f584e6f63701692f04ed1bcb250656c88be071dfad50a1f013ea9ad187c3b6d917c99e20aab4cafa583d2ec2dfac1a5488efc925c351eb03c32d0050fa779f4e71b9db9e037d0eeeef2c594bfd063f993aeb4342d96798735fa85406d5ee21b76ec724f4f33a95d71c22497342d7c70f96d25456275c7af2fc103d42b5dcd61ee8acd76055ba789c52888d342f437646bc584930f31062e788824b2b5a9365d028ff67dd1a3bdc5ecbd585eb4238f18059025b74f0c9371cfb753a5be9b6eb2b2b405dc31c405fe54e68f64f491c4decba5fbc442eecd31abea991151a36528497ee26fc10ce51bdb2100d51a844567445b5c8beae26b8c98264b09b4b7002597115ad1173d1de877336f63175da694c4c67db29f89aeea60062b829f97139195587c99955344b9d4b63206c44adb1f0206303a4c9fdd99d66c0971d48846012defe672bf47fb747cd3abbdbcbd7ac58444210de8d9e559a0fd9bd12a7bb3146de4a8e633f39bd37adaa8191c4d57502a70d850808802ba10140388ab336034ef112e0bec8f5afc1cc5e4b325a6222426074f6442e3b0c44a970e39a10f0916db230cd6c58e5e5995f42c09721d908bf208c6535636d30606d2ab83a1c00f5cd0c72100de32ac4e3e8bf4d2eb95365ee0a0ca8da6bcad5d2568bc2db593f1a17851ed8e5d0d0c1b490641dde3f885a9de65b4c6801a673a34003d1cfcd6ddf180889f2c59982c68efab2fefaec723429a5cc3c14cef8488c45a098628df95f4467d3244bb0c8451e94b4db1a76db990f9ec85668a9215cf2c0d2969270c636e3bded480239934033d543b0fdb3fb78bd9d08aadab07a85c61392b590beeaeb3708bb0704920b4b7ba65373e47661c9d3d13cb9749dadd3ee27208ba8a2dbbd9807efdd59b73c6133700eb30b3b6a042b1e35b55c30a590385eebffa9aa4b65773ecc5b87a02ef561503b4a29ea354c603193907f651a699faa31131c65340e36b5e232dcd75cbc93dafe365af7f3bbfe052b83ac9434498566b94c07c65b58fa5bea4dde3b302654f47c62ef73c8e5e73ace6b37ea464fd6703105d89f4062ee8b0cf98c1498eba44c1f0fe3ff07d501ad1f4edd6be1e974af8acb6b5adf21017299688b0bcf9f19013f8b3884b8a749a5522c6f2725c194030b612d93628e15e3ad5e9a97df0d40d1480238760f0c406dab4cbda68a4ff2c70858d8ff6ec09f5b87c8a707997b2badbc9e967a5b04608ede3dda450c220dda05517eef0a256c871d2096d39e5abfe6eda2e1189fc58eb8fcee99ae4c2638bf0234a8c92b0a4ed65c230c52ed379b2a40bc2b8897c43d8ca55ea9afd62df9cd601d256d407a6a664308ca8466085d966607ce492468cf094496b9cdc2e03a214304e75f96c976b7699098e4ddacda6f181ae880a38c6f2be7eafc4a2629d13012efcfa7efd5eb3ed99f9325a3c527ace28eea2690fdfe5c6ed5bfabc3fc265ea97b6205caae34345b24c35d45ccf1b11943cfe41b9c5962956a1e860a4fb0ef205b25a2edff1ecd8f50da55bf5cc851a54147d486a465016d9278330094a4a2cecea303e7cc75a308b164fc177767ade23f2caf003aa63868eadb0a58ee3b521ab0a848f38edd2a45326ac9a58fda461904e489646b89dc64112bab0da841bbe1945d8107587746edcab56b8b5d570c142d285275ef7066d5990996a6cf46160ad192369085c756ef4ea4ed3f0ec500c9a9a433ee90cee56399ee13b05f3513abef8c831e33d009f4b7fe7a78f31ee014e9aefc51b52e69db66a5257e8ea5cd48849c168649c0c0dc01dfddef50c56f23e56e10b1262c669eb4d59ca0b85086523cdd22c123c71ab0b9f7d5a0527fa05058b480d4be26407f948c2beecabcebe074ea598047d4b57194b812105a7ebe327fdaa81a5d7ab50a01663fe1155018d2a1884dba5f96eaedfa8e756113284d7041c7bc009eee8bdc09b84ff28451ebd2262f4c38d1e2085305de0b11aedc487d94c5b98768bff2df96c1104c80e1170581c8ce120bb2dc20c1b2e627f470407a77943bef1fdf9039dc51eb302d95c0689a6d1f085213a02c046b00f1ba549f8505113dbff90a4ee1d58b45c8b14bc3ae0d65bf787434291693e8608510dd11a5a08c833589541ec61f61d66e0b6995799ba7e8c5664dd522b51d0fc91032b4be9998a5a630024d42b6ab0950be23c65bfc03f535d80f00c11cedbeca7e796fdc6b18ca30374333f25724c86abc40bc0905aaf401cd0b0c7ec35968b4ca6428c7503ed59654feaefb4e9cc19762dffe6512db0148008e16bcd695aabd222383c7268484e3cba4ed2f211dac5dcd30f7995026badb908260b4a552a6b8678d663c592924f8d0c6a74e600827dd85834d35a3ca35a9049306399be9b46d07d8ba2ce8892b0daca679c870d71bd451cd940b3acc66faaf56297065c704af070fa6f28b3ab13bc563c820b5737a18fc45e06b18c77b0eeea688f47258018557c9ef1723dc2e047746af47ec7c171ad8c585fc7789b99cef21714199e3156d9e139a367532c192bdb42cd44764a69b32c1ece2b452c5b736d3236ed2f60c35da207314a7b4afedf289140f99d25973793874d5d109874f6f4942ef7d372928c6709368d61b46d48d2255e3925e20c066c97bcc1da72ce2f6c1e84a8cf6e9d6be3e2c70e1dd9c397ef14806124414591abe596d46d4efeb9c447a8898927b27e59132bac9295b57111d04c81d235ee4471dbc1225bac788a1c35ac1d73810f13747a45c8216f50c848e8887fe4702c33a722a3b7cbbd706f06d6a555df49538869b0023468cbe381477b9c89a626788437f0b6575f254056592b8751ec0b91ad204a7676878408b764866511fbbbf84a503e173af1522041ee03d6faf7275caaf5756c45db71b6b70a15270f7dd0042cd25df773582eb6fc5ce3dc652f4518be00018126521b8a64017892d6a00b6075e10db988a932512565104d6c136a052c64d97bddd68659c822a10a2a22bf2caa8541506aa060912be891e94b70ed147ab0dd0016060a474ecf76cb1446d42df716aa8732530f55aa8d9c1e8b5e5b1a213283c231d3d800e96c03fdae060a82953f46069ba9ffe4226a55842a35ce9efcceb1e5f4dc437c2a9e8082719c04d412f21073dd4a4ea04d6391b51aa4670750e55827d725dd328fd7e884afc173c76280fc3679e1b8fe88c314309a009083be26ecb14c0e54d4487a9b7a96ef22da0778aab0120496d361eb64fa48a97d551aa12054f23df293463ccf4c1bd3efa82e536ed92ff8b30a3da4b1707fcad78eb857b785a956fda678bb50ca803ee726b0aa97564ac9bdf066b6413bbc4cc127ba3bd1b7425db7c985937e91f9d210f87c8c8b647f051db608f1ea470560f5261b0f84f1de929cdf8381e59fa826d05a2d156df549b100c4872f817df7b608b5b343497b7a68d820ca11009a2929c2b70eeb2c4f9890d39c873b68fd13a6796cd2cca1f0c6874b8079d18871b9963074646b4d76a2fe9848d3f3e7e7668dd2b5395b7faae279959fb4adf477526bfa56034566f2f510741509e415349b41bd070e4770e679fac85a29b2c787e06b7e45f7f6174bed80f07ae8fe41257c6230fa495b90901c4031b0d989c07c322eef8d43a771b1846d75cd573788be4b4d491794bfa7262a5b4a8cedd5499aa65868bdcfba7ea2f4c6b34d2e77481637f0baafe44efc5d31a272d29cf90efff6eec23cc7d189afe45026f7a0fe047bafd8622bb557c590ac76c0e8aa4bd863da00ba42005a74cfe754d8543c44ae46277b51baafa29100c483cd44c594a7f00bef94398e67aa65dbdd5520fc0eb83815586b5dbff5230c9dfe35ffca109bb8f335867f2d9f9d491853467adc153d811a5f431dca841160c76e17ca2c88ad8f9ca9f02a06acd6c88e9a5fb40b2d8e33a7529507fe2dd0e8c30d909b6d1a2b22aa82d0a323a168198d545dc6c422c82b7276f3c2521ea281469840db1ee3a1334f33a982f0473ecb0018c870fa01a28fb76b8b4f38dd6eb9e9213418b7720d605e3649281701cfcbb646a4ceff6b277b78c23b20e7d7553eb488a37aaee0526c3d0380e61db5619cfd8d615ae2517af06a2796c1debf090b2a593e59f5d18fa398d5181f8005d8b822bb8ea2df28132c36adf85923cfe207b47c7b63f069854472026f31c6aa1e0de64c35530de4f331287fe5760ea5942e235029f7f57b77c1383cdce85e8dbeb63cbc4a394b3370c37bcd2d4c4e9d64c3b4598615a0d32370ab3932d2b7dea2c5c6bb88a82479c6b4432cb0eb18a63f53fae6fbe817a37c2c103aee76d5d72f253db7352f8e3a50d6b94113b85835549a09b565e4e14172bf2abdd5c0eed0d2a1f75313deecf75c9d0668aab92a97cd31b9791612eaf0b5b3e52488ba9c1ed70fa42cb597a531380d9aa1a62673fabce1743f264f00e8fbcbf8cb41536d35b6ecbee2591f42602db46dc87afff6096bff6ad0448ac4141bb73621b186cf9f61ab9d31642965c4abfa0b24ac1d74c3e71b6a75bc6747da6a8e36d574a261560b71dec7f151a868af41a9eb6b13fd0909f90a57c3d7999b1bf288a1e400fc28208ac7ae9b06c779b2e367a54665ea9594a79bcae83858b46da1584629a67e19f582a0749ad652fbe3212e400003c09416120223519c6d7f133acb59c2d0082fae284e65a26a0e213606e2c8bf700a49f5257fa12f51f82a907111869958b3aa4b294c759ddc24c8cf8d2b4aa8feeb3f548350a1a6ede0857842fc8b153f3cbafb2bc12f2e3c7492353ae34595b6edc240f184008eef341dcf409586a6ab7b03232c5360108e5ce295f54c3a2e29dcec1d4a7012b6dce13792f2d4f4ee76fca4ccfe245a4f30d1d44b97a4a02f4d8c0a95eb1293d6ca26f62af71098c67cc5bf5f2da6169d469746620f23184f80490e06f73428cbd2a34c186b002b49689ce4712210d7e7b2f1c74124c3f06fda20194bdaa7fc91a51b297e3431d847240e7d505b5775af863450c0f4d8a299b9c642262ae1311aba69aec25c0f7e26bcdac67a93ff35d96a823be10a6e4c5bd12d12073610afef0da2fc1b1e2bc92088a7d8c002b46ebcca27b914d078b7c362088f431e22445b1457a32968ba98e7d21ecfbf444645d937ad35d1cc4c21abcc9f769ab66b90d9e6182d023b9ed4fc8676a292c719429d39d5718395a89f8ee2d5f04bfe66d23d2c7d1638e3d577cb61dbd0188dc35ff00c2926e14a5af48509c3b91006bcbcae41755094b0775f92920de94b6576e0e7e1641cdb5e6a03002f2ab3164826a2efc0c1e5d4a436595ca1cea84a0b6150c4889cc52401e818b282c7885accb3a17dab324a851bd5720dc7a380fb20e4759d3ead6144026ac7493b3b6335f91af86bd4d7d6a7b8bd6a5c7bd92308a5f4316c8fbb8a8eecc1f0701126a5a789f5a8b33f912c659e006120be70e7408262331d9d4e2203ba64d5e29e7021778c2f56723a17f648f0bd28067b79c17c7f85806a8f165b4fc738f80d6f8127aa9bc77062451df6b1c2268c5788a908e6029b211d2c92d185812a5eb7bda7f8dda7c33ac905ae0d752fb0e7b86aef886c10bb87cb14fdfbe72863bb1e13aadd3af191469dde7a4bf98eafb6c0779b5eeafb07ae9bacd03f7765c4e114cf97216245db9c62bfaf176d2811cc55f967a16406f9b78e5fc849b79f454001dfc7a44da93b6585d2af2ddcd2660a71e8bc5cdefecc9217fe330dca2ae0765f33e57942611aafd0cd8b4b11f554a1523ab30e9bbccb17a8a7247324fe9972e0e729dc441167a041598f89ac1824079116c13d01cbcb0f0a9fc5e7b3c73fd04d4eba345f7d04ac34af9829ea97c9e2b06afc8ccf5378d8c2a41a67a6725708b74509f381af0c7ba709b1b42ef044c1831bee35c18166b5c87136bbae04c80fa822a364dd4ebfa5663623d511805a71382cd9788385073d660e0a6e4a44b97df1c584c8ec990e57120e9764562f68e22b86cc9f1c4d0e4b364ef6ad0263403e526cbc9e1fcd74e0958cf2a4c81c4ad40aaea4dbb0c31920f130e4a38b30b7e8c0b6dc5602089dfc701257ab3340d776a879f25e25220e4c9270ed0787c51ab25ed747e064d3e79f6d6a03cf3f4b22cc93da3371488b9ae0928c7d21a9acab2a807c8562f65b60dacc40b127bd7ce1812638a112a0369f6c40ae318d07fe1cb56e13a30337df238815e6917bae0b5faeb0e9824855e52100c7cc6fbe4736e9e4ee63877433a2980b5c3416bca3479aa1ad9fa174b950ba5edc747e46d5cd12019c31e44d3e79f40d6d223fb79d62c3d85036d0d79bda7225adb2d0b87a725c9bca078521f212563cbb80b11442a7736445275e6e19e11bf13d0cca3bd4fe3d42b95e26d85fdcda0a6dd0361332401a18bd40fbf7470e29ce13506aa7bd468228d283ea580014a21332573575b27004ce8f23543f871bd076d7128a57414712c233f195a0d3e52d7f8d06b272fa9280c3a82d7b2acb5a019efc8215a47bcfb3acb687fd551b38eed9383a4204dc65459f5c18692abd9a37e4104ba1ad7aa7fff4a3ae1faca4f5257e071d80628955cc3184552ce5520fea8f7ab807ece5837a0024d0979b4e4c89c2e326bd0ae8de01074a7f2f6ed6e8df8623a5a317842f7dc6423bb7bc93f522709d13a9ae6614a6f903672219c79cad0ee9a28f3ebe925fd62021d01cd4590fb148e102588acf2dc74e7043a237802e24f9620250cb63ea3f236d3698287058ac8873309e794f6ef9e2c3cd5bcc0faadafafdbb61469fbf6c7ca15e7d0beb252c5b6f4be7c4356aee17c7acad4652eea248bb0d32462aa38c0a416ddd66de6547148ebeff587c0f32ad0d9acfca26a753ed65620c19fb88a45c3748b87218250f6ac69119128ce1f7868ab2b2bc7a520f64625324e7773675c75c5f580944599688fc67a7113c13b19fd3036dfe243934b5648d6533e9ac9d581f0c73a178d04408c4e66aacbbcaa5acb198dddf98af04294959db1c425d0044a0090eae0aabe03c24a229260bb9b69493e014f6eb87b2e29b6b67b98ae26e741efa31d5d69160446abfd04233b3efffe065f81b9a5a6e6690564a16f1054d068deca781013b9bc5d0ebd92366ac28d941ddc596933023c29fd07cb7dcd18c78d502b3d2886fd20a5273c58d847a5c40fe0c3cc8e180e14019207a65d23fc9b15d0ebb13b84bcad24f8dc6af3a71983ff8817a670dfed10ea0b806d1e57312720826057652bf1bf607c4caab9e6fbef81a57a06301edd40f8eb40d73147725b369c476c52baec0cb14897122168bfdf23decd2550814377510aa5028b53ebc2fa6c9fff44f27ba15e39698f2da024d8a2bbfb39a497445c5aad6f1dafec0135f0171c324da65d98ac73ce298acd14ad7071cd0b64809128f818b0a735b2df3655c98d3991bda53a5b1cf285713a4040fee44fe9b2ccf38afbb84ec06807099b71429e45bd3b690d0bbbb50d2deceff2568e91b7c17a05ed96f19150544faf8dc8e1e6d9ce223fea94bcad43d59111732f97c2701308c53a7f744b5d03906b06cf99d652727c69dc68ee870fb9ff3b9fb9773922d7484ec1e972a17458c7e5a15eb78ec31ab0be5d8571c886d2fd21f6508706084b864a478ba10f351c44143bd8eeee4bcb3ebd2fd963868e8e194120b06aa01e1b7a0b98585c0226851089ffb671eeef4ad983cdb5adcf4b7bdd0e5b734e725f0344cc832a42e98a3f83ba972845c33a6a328631e366c27cb890200de2d3234c99b33bbdfd172a4cf84fd2f4346e33c912d74b5884e6255cc7edebfcb46d72d0342e605ee99e8341c0a73273886621da08202a8814cae265eb6a05a80a95360595029843a33e6555620e9482d3fcd33d54963264bc77f94cac9ed1acb63e3820d0e60711cfba9b42181b6165f429faed689e4b6e761efcbf6e0706f9ce3dfab3e31c258eb8cfc5c833794abb3409217f049a76a2cb787b32e36e0a309acd47481909ca5dd04ee1021d7353191505831943b91f35744246414fae974917640bfc6ae4d27db7133efaa3b702266a8205b167308c3c8e8c918d7df6333e157c0abaf41a97e22797dc35efd2344ccdfadc9fca3a1f1256ebd62cc634fcc174656de613264f2e17f14a3bffbac9f2827f242320d30ca4640f34ccc5d63034a1f0694706da791aac2b48ef35b5ed70420a3d99b0bc042d0f837bcbf223efada1492a18901ff957e2bb2f7698a0a6fdda2298ff98df2b9a60e78ccc179269a74e1619d4e3ab094f5423cef7500bd03c407e54b7e544835f691aa2af7770ffe9b9255a2aa1fb3acbaa18aa1966bc119cd6000b402be5575b7ac9cadcebc549b38fb41ceca76682dd77f4978401b14dd2d8003a59946383482a41066177ab81c82198c10791ab88123b8afed1f627728c193d3d28648bd50db9236513ed5923fb7a6fbc03538d1595465c8e29157c4003c4112b12956d8be9733b608a52dbea8bc72a8563be618b71a1153afb19315c39b381302f2d466c52bb0a81665d4c1355302c5730a8eddc365465d4492ec4d134c821613d657e80701b0179c6d3fc055f84bcadb4797c6c45cef04db9b8306a06b68226a859493c29d4c346a6e81527a12ab5b0d71af10d400e6240daa7e66d7e153dce1d87bd03bd9d06ef94b29be3cf5fae79a07e01e284ed95f4954b40eb022de297cb658ba4e5bbb5b95fcc5df451ee01c28a9cd92ad83101ea390c414953dc14f3d323344e3a3bade9c53aca62aa4d46c6e9a8fcf2aca825c90868d4421a492deb2fc95beac8163c18489a26ea134cbf04c0fdad8d13edbc9558a3c59c2ff25093008a8d5956ed0dfa447913d78ed657f6553b5be07b55bd419aadff75e4a899f28fea15b4490c265944d177c8dd7567197100eb6679045ed6dd7b2f1ea4f6112a9a890c56f3733f9ac1dee531b516afe63ba0407de80b67cea4f79e8b82ce6345d7005b45c67abf169e5120128edfdc95f47d9aafe30e2276cbab95dfb02ec574a23e6528c18e2238919749c946aec2337b3368334b634495cd89a0e62781f638afe3912942e4fea621bd5b37384c7cbabb72b8867368d32431faacd19f804469f5baf2fb2e1f0b77c398c52335d4c9bde751eacd8303beb17efb1be6da669709e3dd57b422186beeb24592c8491ad8e21cb7c9294a9939047c678d993f2a79906f69b3518eb58a838e4397ac200c926750ef130241f3ee3b318f03e1878a355a794b295d4d416c47aa64880d643ab7401321613af2b2fe441c99882a900766415813e5478b4c53aac2cda9f07fdabcda6f0d4d5c2315fcbb03ceead79899d6ec300656f1d957465eb7b1d157a5146b9d7227bab394fc72f8da03f9ff4e01b2f26309ff2034bdef47a9198e39e6696f2a2dbd34abcfd739a7a4c2fe798e1c90209eb9e8d4e621623d4f450b8db1336ba891e69b9a312962b664d425c8dcbd93f2bb65617f5054f8e53480927e41d10270f52392a0d9e0f8526196ef99879d3d933a8e3d1a05c26ab26866c5815800ebd5d2903fbaf5d71b01b7060fca9facc2c676d24a9a5b27c3e7d19e54ff7f2f934ceef1f8458d2539a1698cf18feda9bf32c701e1d1485005a158d5dfa2d2f501edbba5cb0c1622d38c97b62d5012829c5fb892e2da84b42a7a2165016992ecd5ca1454dd96cc0bc40adbae0dcd6b6f4d622122efdc3410860ce3997d61ea1ad4b316202d7a22451e21215f1995b30d7bb96e62d131d0f2f9178696dcba8e3c282db36bedbb1b61223b0a43a4a9bffb432f9b7211f75433a825c7b95a0b194b37b5bd448b920ca2e6d02aea2f1cadb52c76f451a5271fd884330fe3bdadefe02ca942e83e3a3bb77454b475e636e0a85f9705dd6c4e96406a3f9e18ba9525fb3392aa624434528f2f4499a173e232ff4abb44b9d7eb3ad074bdba427aef023f9e95a77b1a13f05e8e406186d0a90e24f0702d7110654b832ad3ba0403eccc31eb2db14cfac0c2bfd2e1c199eb3133ac8f16ace73008880b86a43c4d80612ab0034634c96783dfe270900d086117dfc00b3034e3cba1f537ef2af4c8d8fb89aa3f379eb2098b0bd17409a38e513893295c074067b823a42d20c36d9a5373a14125c18ccd81e04877b20d0581af8a597419e2f307dbd77bb4fb4d68b6899a6736b9c0066f2c54f7916cbd42629c6f0c0adce1da115a6595fbaed429bf6d14901fd046aaa56b292bcaddc71e3b14af53fe64b4892554ba5d5d272b62d1826f405ad710bc44cf2e06c28ba1d280a683916c068b4a00c25a7bd2e92ca3e768b2a65718701bde735ffba15376cccce02e32302bba3db3e8d07e87bb5b3c39d4a7d345be96a657c88abe5e19d1bcc45446e34cf63dec3542e4e071a1720efe68c22f992d9a89358c3552498f9788d04ec4d52ec53142fcdcaf2da036fe526d75193f93f20e972e1767322dc2dca386ebb83cb4b6d21c102bc4d791c7470e3d01788fdc389a4278cc48a19b9be81b8916c8971f08887921766c93330a668450a548094fe794cd6e4baa0df42c87e91005ef91804026ca9eb78bd2089cf8fc0c2ec123cbea23c473d52eaded52a1fe325092638e01a7a7fc9b170fb444d84d502c5aced1fffc39b496c499e61a8b72d8b8907d9d30074867fa68cba8055122f6dd379ad80e39b758dab863be05204932866c4e59756525ce3cf63c8010f22f693ae58b0c10fab072be77ad1391c3976d2b3570ae55dd1ca00e7816caea2ca2ffca1366a5d17389bd76719ee770250c461a5d3dc41c379260f97cef61d24a8fc1a3c869449947b57c944a9a35986b42beadf69ad44903bc6076ae3d6ff430452b94baf749ed4e112783acaa157149ea4c5213ed40e9abbe290bf4e517e6987dcffb1cb5b882299a2b1b5ba6cdfd33446ec71343c4372c63399cd82fa3abe61a9174768b830b94304e6acbda2e19352e276bbc033c7c82b672ced0664c4c067bde2469acf7c3762c78afcea8b7db7b7291dd650702f996596436de1a05c447844a09d6017a8c7308a001f977f93bdd41b527ad5e212e48517aa8f9ae738f4364b73b69575eef1b35bede8671c144519c796022683112e5018f4b710f1d4aea018a00fa48b54266fdc0cdd148ecd33928bc7141449505d3163e0856a5c90fc11a653e0d864dc85b222a5645fd30388c28d316bcc4d46e1dae20959cc9fe06ac889a008143799bef62afe0d40f1a9b63deb192aab93027c962c5417b5470704d9234a1f4359ba7be61c7f839e98b718c8a80d08349c9c5bc65cfb228b1fbf434586ef8c082743126ae300f080aed77f9caa3c624374a175b37037e5b2ff08b76247341bade58542f2ea9071e0510e90bbd407e696ad6b8be62023ebf324566ce2ef3b6764c8bc401b0c0e3ba7935738edd63a44793944fdc42816c978be627cfb3033785e72153a29404719042630849dff077eda11e8645e7ae50a4db99d95cd0dcf71a28c68e70a3620732f08bb6db4a2b0a8218ebea9f52b0c17461f17c1408aa4c68069142035497131f65f49c4362ef74fe9467f8a1c94eeb7e64476427da7af14f6f8483fefc87cf7b563a5d3a7145fe64d49d713fac17f8dc2141fa658e8762d4075e505ea4842d5c567fd17e745e91891a7cf03f058a86605017106272b892d15fa3cd3b825b52388e0cb33ce67fbcc5f4d88bc685d92d8c112c543794427bc76d895b6e8b8804882b00c34ba7c94fb0763b8aaf80c8f2f86d375b9d995b3ebc93c56ea985b0f43c3049555de1b29b0de7fe07618a86f278086fabc7f85dcf2040014ff65e66a4cfd19f780c075f2937b655ae9d88af9993e9ab09e27d1196992a1bdcf99f2647785b14e7fadc22015506d5669bd69a19814204049489f5d06f4085a23cd01542115b8cc379b088088c66d28c94803024083d53bab239e4c9d0a2e285239c29691a1205441ab010f13db33314f4d4e9692734894e4dd9fa1779dfd0a947d4c2217d38204d67984ab0a67c79cef959f33c6a7fffbd52b5bd1bd2676f8aeeb96588a08a638559e750d797d42d43147eba47cdb701f1c543cf4e789007260ad0579c2945b943a8a919d3f2504372c94eeced14cebeecbe96a4e9eb6b7dd8bb516a443a83e356df7019e175bf374182c2549612b2b9c18feb1d9c3fc1936f0b9da370536422f520e13577219c40368b7861f2aa8309b389468ae3e1480195a8feb233ff9eb70fe02f1f3eb6ce57463a6eb1d931e98ea3df574be0f21f6a8bf239b38285c2f0468de05bd93e043957d2a3bd8153d41f649f6b2a956301094cf2abe4955a45c6d2a05173c222c7d1598f31f80865e0b3dfb63fc6ab4346af4a347420a2a040a827a8483f7bce8f62a9ede045e0632be4644786316a6de7c975757b0856ac6e56022c20bae20c08845803f5340f1646782ef4d866ee3fea917cf0a5566b565d746ba4072f6934084af0c4bf10512bb2ef46f61b6f8c6bd6c0308bf8e072b0063453d601e45e6005907c264b03d7666794cacb048ff4b8d4af76b952dbe222add73260c107f58c1e663be9eaa9e3498ceaae1d458b525f72b73b40717cf654ee0161905e0609eac354c9a0b331668887aa474ecfe24011fb57b8079c1ce568b6efb093f0d1a9ed18c681f213d0094ae3ca57315f73ef24b145b7156b4350b7d6149924eb2102e25a832048cd9b92083b5882f89bdb3537a568b48d2cf94268ccb2ebbcc5a38855d236675e99164f5cf1e06b5dc38a0a0c41579f6e187f722e39c93e25529e873744d1bb1282414bc8503b529b398cd2775b183fd69235f23d6c24665e17c46738a4fa34b2987ffbbcf34447bec131337bfe9a66fe99899e31de14f42f2ef03ea878628c26a32f19adf329ae69303414315acf2e136c4f2e9d0ab2a10029123b53c818b193ba836f5d75f2f1c6e1bc5b12ef88488c47b1b17ece56a6c3bc08637d24c565a9777495c69e9adac13d56dfa4674658fb7609779b8628672296fdae25a95384842eb764a7019c3e688dec99d477a60c7ec4a831c36780e16e3490f7ac861618caa36f40c0f6341fd98f7866fc1ff970c2590a21ae1a2ac8826e65826fde93f9b662427f8b1ddcff4a13d9ad493f0a9a07d544130632594663ef2766d9a7c8c724b0ea79e64808c26ee7c73d11fe2138208763cb80809226bfea262128dcc5dd1f95327c9309d175c075aa8652375b27730a8a388bfe13a7cad181cbcbd249ad1ffffb7e1cb886b6da2f4c73c62943974577bcbef54f6192663afb30e25c10c7ab8af1024ba13fae5e52cb1cafdad3209335756d6c1b03c5f7a83f00080ca10f8416469759a92afeb9315e723f5268ca9672256a41de2cfdb13ee229fe8f063996b0db790e7729014584f255ac2ca5134d5bd3ddba8c42cb3252e803c863fecf4d04eb5edff2a31936186522fbeadd5385d5ea303d04baa82a425431e8d7841762cf0250bb66dda1dad9ae5577cef20375ac31b09da1cdd0d25d4378183600855a766dadddf2e49cfc21b9229c04479cd65aa2e33852c9a5a7fbd914a892c2f8a87ea6a991ae71f2a5911bb747e8cf74a4d9fc7d9e9b1150f283b0ce9be749bb50111906f41510384284d50bcd3d6d6bbedd1e8bc92d14e785cd215a59e884e14f8892a5bf496fadfd6fd8f14d5989aeb027c071f442ee3cb8b3698db577f22f42ad5caf0b8f3e654f27b05e8cc1f0ec6ebf874a84abf9c0762f40f9e60a8da8e036ea48f9d49a7beafc6e4907dc9cd7313bd7cfc0e0902f851b43c820fd04b79c3846ee01463cce664b65e1bfcd475635e8b3307b6ce3d4ae13a1a4f86a906de90c5f35ceb4be49ac934d9206a579f6a2c5dee2a4f7ef2780598c1c2a9360bc8f0bc0bfc52d8a50fe5b966a3f8202951aa5ba995739e619a1945bdb25162f2c8fc0cb77f8d4b68f93f3497401f4ce6e7722258e6ec7a8865e97d4fb4990f21e7a13590014fbe9e16e15d3c3f836ae60c48a193ce564a3d3e14ddad814ff2b4265ab1128eee3231b5f92fb4296220ad732279e648bd90c88bc48e14782827937997f2f59a032cde4dfd501f14866ec45da3a89b842f03a66a231a13c9b0069a40e659e3c4d7e9486610a1b6f0d87abd3559ab5ad38c95393ac65c5e2ccbc20cca91511715f786fb04dc7733f48d42623ee4189c5d881e5b04d3c8c899dc04eba122ed28c94d43e9e81e2a36f2681192d502ecc65c2b899031c73fb3c9b5938091692a988245106024f3aa77a9bf480b38535673465e0b29fbbd07558fc245e0af2ce78a2b7b046993b9a5cfa8290c84457806a4de2022603646552615e002b0527589e76d094301004a982036aa1a2fe9b6e704f2f11c84c9b5c50a2015111264fdc911fbf661507364c0d031102a9232f21adf5c2c064aaf20df8659393e5a1c94c82a632f6dfeacb84fb495d094423de58940555c82632c5f0fdf68eb11fb78878611dcd0977ccdb579eb7a5b282d304cc6cbd2c34ce85fa29e9aba0c4da2b85ebbbfc26ce80104cc77da15c5a59a8444778f191518997bb063d164ea6da4ad734ce51c79200ad9c541d540f6dc98a558ba91f5a9c4886ae120f4dfe3a940bdb040e4c0c2a1b89802588aaf15f04b072894006b6f2964e0e6cb85a1ca4a28b047c1f0c5e2f5c09679563051d47f50ff628069357d3c475785cd85a6d46424e2243dc9f2b60dce5916b1c892f172fc50467085742f35e62edca45cea189f390a5968ce9748cd85d77ec1c552d93786b364b84bd12ef0bc68aa3c60c4f25c75a906086ff876a5abda8d4d9376abf820f6d313727c102d5d7b8a3d5e8116377ce11f0562642b0884850ffdd791c9c2da39ef95d10bb3741fef5cb32a8029d5714962a8c1a4158a9d75341871583a3c46106c5f9576a64bb7352bd6cfa19869a1839645f515bdc7b890f30e7ad4df472b1f9b4531775c1ad4fd8bc7f5d3c3e12096259981f42d3293cf90b9824cbd6034d12135d285fa01403ca1cf80d9d1fd99fe16587efd5a5924e757588ab2f27e16a45a6c4b30f459f40cb60621953c94766d618c03af9f5cec3475f13e03d9515069eac8c071cefafec06fea1b24019ebc91b77a669f7a30bca91cb462619477093b26cf8d24ab7a477a2f2910d4e23e519c85e72ee57e776697164288e24583aaa3a5b500fea04ead37880a851f00f26b0bd475171c2d2ca0b6eaaf875d0d8f6f788f47bca15b018cfbabb8b46584c9f2a7912598363728c0d2d85b8eb3baa15d41c6a6f7a40760620d8047c3a3770a7b706e44b2e55a2e9f444d9d7c089ad80767beef4c605e348c38eb6ef9172d5f6c1bb44b085d2660b955ce7e8911e314497067b7db6bb0f9004d9a4245301a991f6f975f7ddbe56ca6e8d21a1102917d9c9dd7062ee297bbbda69f5e4def7cbe9ce6c30179fb39f9306f32f160626dbefc9e2731b4989bb7fb09286e61b1367a35ae9333cd392e14a7547b73e7b2bab490b465e5de0b3b8a65eebad9bfd7a4a38880b4acee80037d9f2e8fbdae6695e37e7421db5ee81e50691f3675be2cb11fd3109765eef00ec1259d5ef761dfcf39407f19b19fde63a6bf6f926603106796286625b91774c4cc5329cb42032e6cf1183e71fe6296500988c4f48cdb917b09e4c199d5f52168909555871db8ee373bf231383b0f4bdfcdb46aa3bfc92764bd8359f88bf2d9ac20c237f708a6f744c3dbff7b9c6ebdfa4ef8d9c46d5ebdfcf8d9b51337c5b4d53d324c105c12b3760df5cff02503f17d169e725e9bdfc8457b3dc87c902d802c073977d7c3e142ec947772e094edd4a460292be268736c2b08bc6347a7dc9d05875f1c7751da4720e26e5e67b3a3d612705eb7050c6bc5137d998892e7564ad654b41f8516d8136344bcc920d92490ae3ab7fdecff475ec7420e49b8aa0e424107042ffeb715d555ad855c5d376922f658974142f03055f841147fd306e5b78e61ab90984d796bca18b64381f9aac0c346f8b3cd656aac011ec6a842e8728efd81b4a580ef762318370aa6e47339d0088f3374be0839d70dcd3f05c83aa67449ae125a25df100286f0542d6956ef2c3a8481a9506d9408349b39ee0ca8843f9402c49f2907b72044530ef0d747fb8802d32c06c91b64c0e1893b9ea5b822c8578a0362e990b70a731fcf82646d28901085cc6d957ab24bb72ed34a8f50458283b27e3dcd06d8135d5feaef84e882fa0b09ce92a8c9899381a13cf16b6d5b8cd3c85c4c68028196d9a7bd7317460a3ebf0f852685a215cc9b21a7e95b44ab79bcc83f266297be366825de73044397786f6661595ed4a533f49d601f4ee95de045eb1ed406b3d15aa5b2676099b58f289033f8949a15510f94c0d630703fbaae26eda633dfd5fdff60d6bc581f849bdd1155b7865999c8667c832080a9ce96d1c19a43f06e7013cd091a1d25d54e6c08846f1944a2c7c569e16e8780fb0e65b245f6f7319aa8e6555a83ce31b2c76d90ed0ad7aa6c99076b76e05255890f5128c987d6d39dec60e509f65f446d56f3ac540ce57388587dd2293f34b9f32a93b00c481c010115dfdd81a979c985d94636defa66da4e3c0b52d24011a384c4e6ad2709e9c38e13cf024231bace4fd10434b54cc29b23092346402c4267b965ec189829e587b82b290a660feb2b57c80a7bbb4f88db33540ba6cd824f6bbea25b9ec9097c5a206e05168437e87ed8c11e463f7fdbfe83d63c8cd8063180568a71130d32c4bfc6cd97275f62c3ad7bc6b6c2aae843ead5647c3ae63092e94a39ef911268ba92c5f469ac732f7b29b5ef14d2c821bbc62f6d3abea7044aca3c95390548fb648b36b106463d6004e347012715853ab1c651a18ef35121f5b242d15ff87ef3ee77fdd9d83e61da9d980f502ce3e806aeeb1fba3b28a94e7bb2377c91aa2bbd5fc64fa5eb19f600067e0b12c83104d82fcbd52628e4253ab36f70a13714bb3b10e3d20a32f13d93cd7497fd5ef281496cef057c21177d0d3621e32838715107597d19814b9062c0de4061d80bea6d779e79d5cb852dc51dedea2c9b1a9cf8579757d839d9e7ffffaa9b96cadd9a9ca9aa0d7a46d811fc6f0d59de666eba548eb8c9776d29f5fd6217856c98c3b7158acd798b1969a29ee68a3ecdac8f5b7610b60a213b24d5caefb48c92c883cce05d83001109edce44725c6ba7274944ce915c2b6bfe1bb8a567b3041d7f312869e17c03b0b0f524f8bfd25346be60ebc52fde436bd4ab52e42514e2882aa1d13af965e0881708e4125dce4748a2f8f9b48f85c36d86827226b9dd86f0964b323432851281857523e8b73bdcf5a7bb14f8435f5058e16b318839641cc857106d664d68e2c28914568f59abfd62115ed6dcb708f8886b2c5617141abc7374190f564b79905e81f532355910e76d84c535c510e1e5d808305e0732c43457bed86ac91bbe797e1f1fff46933b148ba8ab0dd6df0fadee7118697254bdfaaa44634a1414282efcd025cf349b56fa340635db718622fedabc080f012f9a961958cc54385e8a147031dcd945f8c3936d8a84990dbb17e13db20465997885d2414f9685f5c2564daad1b3347c38d9770cf0407a5e050ae482437e9ac9e88d36639fe2db46cc4d7ebe16e9d5f759a510d7b199432e7d003c8cfb322734de8f4dcdfa5a2c2463c8076497cadaa499135081fb190450e837bcf192ceb917c62c55284eec8824bd60227865e05f86a17e90171ea9cd690678638e6fb06aa802c23bf598a3dab3866687b719e9bbc26326cdb04acd04262e4281969e068ffde38a8961a4936d3d5508b62e22c5ff9d6f1fa677fc8430c6b8852e9b298a09d61af47a2d065858f7d20b49519d30d6275da1de510d51ca25a721e2952ab9a1f3917c4892c136a6fef22865650f92788c38c22c60abce1de030210ca91bd917904a5e8fdaaca3b095934b7dc40bdcc9e522d098842e77856293a78614ac79bfba414a2b6110214e7b49704af2fe6d36835e9f27efa079cd5ba048c4514233dacfea2854ef179727a05f12b44aa5abefb5a816820bd2a7d1be0798cd3a059c36ff04584a0a42cadb19a060395fb626c86800beab860fe3bf6a26415555eeda93d090d51a51caaa80e0a9ff27f93f1b9980d8b77eff13c0a14f30a6f2ad61ddd0e25ff716c5b141195243a26e853434cc195cd18d27d9f140e1eb8beda3ded0906600cd7f3df35008d26fde4a66b9a4a1421a4fdf66696437b15e3dfbf4aab4bfc4bbdd5fbd1df015144e253f0e8e07741e88f90f9905c3f3f7ceb99b6eb6c80e7af0fc21da08857c195de0c8fcfa2bcfa2f9b3e31599fc0792dc87f2e1594d69962f1c8027f67d447093cfc5221e8c7b8d1db19f3fc343f534f538c9f80c5b2af3f98f80beceb576f66702a4b5d2ffccf4724c1fc6a07a8e56914d90fefc10135a2ad8601f63c5c87edea09b4fb2b4050af90dfde543a4092b0114ef098de3393824a65e836110e6f79ff440b62aadea69b0bbad6a35d788193f02c5d6c8ad97a433d4cd3746ee5c87b39674d71a435820c64fa259199ae9ae4369e87beb15f587421c33311bd2bc534b141f04750671ef2a91108651336d39c35df6ff55909ac66003496b1c4963b12ea191f66b59a480002b1510604570f90d5ea59bf8a4157d0377e2837b5d86b5aa09e02b12129cce74c00e125c25239fb35dff5d89e8e83e3bd701bbc1efa57a80242007e5d4d5275d66442021909f1d8a1daf1fca358ead9c3e7d45d5c64684b63936fcadc692f326e77ba363c4e6426dbeb7581f25d8be97336f0cb0d1cde130d0100fe979faee49fa2043dd4c72d9ad7a48da446a00e50aeffc331b2249e1eb7b496821f3097340509e2639529938b991dba27bbd17ae4a97a3574ebd0d60b0c32e6fb9888c45b12023f5c7e286cd3ad93521973881285c2b9614b2fdb7a7e212c0551f1c5918f50206dd3e0426bd912ca7cbd08d407e7fd531a9dd83e02160f58a8eb0f45a991f21517d79a72a057093f6357eefcb0d6193a0d9e70ed5f7cfd36fc8dee9de9d2f9e76d8617f123b916d72f629133176a57304eafd5c3feb09007a0df1fc5ee62a2991838a2367e1bb4751f46cc5d7373e254933dd802be8a875ff7d7ece68b32873e11e87eae981eaf4788c369a2c52673d9008e0d4fe49374a4765faaf2e287f0d2d7a4f3eecfb2502f0ffd5d1e76547d6d9b85a763e9e659f7b32a194bbf962bfb117e9c5b35b87329265a551b43c3b6e4c3d8d742706a01acb8a3271a2625bdb4460db44aca5a88963e6fc38d6e0e6351ec52e6abe945ce261e749e8adb313ec6468d5a263048b0ac4f1985777acd083eb91ff486af3d98e41e14a64de8a5978385a4f63d121e24dbd6cde4256e1563f8124050c22d0454ce16fdd5010f1afea0309246966c3efa5ef973e16530dd7ba234cb8784d456561668005becf4642d2e6ebc852ddaf441f13cbb1e0d98b32eb88f572c36b50ed78e5dc9c70f70f162d2499a33c7feaff8070d506a836ec2cb0dc885711742cb5acd46c6460dd8442cdce1daf46cfba2403f09c0e08631982004fed6512dbf14bdf6cfbf71ed74a95a755d56175502824cf6473ac6f6ae42c8321f3383baf330452008c091d869dfdfad83973420b0296fee53e4753611b442d7da02d981fd29082c3ab0541b50fbd2fb68e600b23e44e91ff20d4f613e20317483ad582b0ac51c2394e756019a8f03ceaa93adf99c13d68f26c52555b1e67bcbf695efbadccb83a8f48cc66f82b6bc9daba37371322fdaf2c0a46dbe9076a90aadad05574d14c3d1f8b976e5ac7d74a4f2468dd52a9eaedd568703aef6b0d3c6bb8d7dc98c09c6301ab9e53f21785e47744526cac79b2e9ee35dbb1e87a57f7c7faa5bbd22c6223d1bf139bfd7b99b23fdecb3ca6550471c75632ffb1b3db4d7b64c496312b20dbfdcdd331e859c99248462e6571c6ecfeb19939c9b83ff12080948c31dbbb952585cf372aa4ed50f576afd80b98043eb53a11d02752a007b791995dde0d2e584d91b3beea7de58b02ccd68556b744580174e8cb58cc0cf022f31998f94a6a5c3b3f9c72e616763c9f4b79799d96a217d630e1198514d0356d982ab6e083f63ca7a307dd986e1644c8254a8ad0147109484d958d42d3bb4aeffeac6ae7660b16943a3b9c6165aa912f7dec86e4651fd5cbcdadbc0d33ac47c5d3aaaf7638f13878173a170791402ec65deb8cae704f4467c1b0362e9d6cf490b8a3899e88ee279b11a4a24fc82649ddb897c7ae50ad8fbea2a641c8c2b265d1912dbbce16647cfc07a0ae9bdd1e7b88d085756cdfa06d00ec1b75d1ad39c7a6612292eebfe8965dc78803a85fd4cf6edbe722ac7d31106b1183930ba293c750f7140a2871f2281a92aed9fcf1ee45be4556709818cefe3902cbaac82c0e322f842e4e5a2290c101d91e84c7d7b9d309cc5ac85658200057823cab5b5228741b626cff72e616b3182d08474355a5d932cb3567bffbe6d6872420ba3bfd108ea2789ad81ca4c9da11a45747aa1bc577a2f340a18910c2e7cdf8c92b0ba6c9e85fbfbc98c0a9b7e0e9b105364055e216edfc03d911df1bc78af46f39868e307aa4f847b0a0ea336f660399793298421065e6a8f922b4fc1b2028021476d6297113411741ebc04498d4b14bb4f0051f8ada5df289f5a6eaae0ae3ab3cb2351571ea6bdc5a5c761be7c5ea8acb20f09c3cd8190ff911e4cfcf458daa45d6020f88f988b3c98211d4758345d370c47a6c6a2f2828de23a70c4b6baa5fa068dcf27d4a39c097f1f0579b2481f59beb7bf31ed8503027a51ec505ed3436ae4072f4f5217d55bf5052bc53f77fac62231292a3be00b8b0d06250eaf73f39a41c6a5f0ae7cc66049ce28222bd0f22fe0654dd16e864dbacced60783ec2638a68b45fc9c3cf9ca162e587c1b35423d5e130ce0669729c9972c9b4bd39a0b386898446b43e00c27e9f0e5972cc2c00fef7c4308d31c49f43cfcbc324e12ae89b4547b84872160d006ac7c457ca740f66fda6bf666003a1b473d4859a2e5ae89bf0cae69e9c87f1f035526392955a1e1284454475075be76415017bfb4511a41190dc70b4013f114a09c1132eadacd92c28b273bf4617c7c19d129e941d6d37e14d1f0ceae5040287b9b78c1085b301891c951db39aac9c5833ba8e793b82b2ddca07d4e513758b354cb152f691175bcc582de57d2d3cee8d831c55b46e572962881e8e45a6dfd9fc11051da1b64d0d88c3b52301c1b8c16f7688c5ab2da693fdd408d2640ca77eb1c7a5da00579924496c22a49e4ba73282a5a37a227aeeac70cedd7437e10c7ab8333cafd2b8876fe41b9f42408fa3bdf877e4cf05d807a521eaf8ebe8b29a871f4878baa63ed49f5ded6979b8812ded606de615d9832b0ef0b2f0fd03bede551fa60cfe324d6158d80106a9af52cf9731120c40d1e0d144fef52181c1f0e45bd8324f57a6ba0f7b221f8d642971a81276f2bedbd671e5e59e8abf7b6d807250f18c8b46742e0ebbaeadb6c337b839243e505a44fc7dcecddb469ec6d1660b9346a38b7f4995ccddacd36de4723e4509900f309454ef04c969a1130dfcd73b3b7d926f6163039a84c40dad796b9347b1da2fdfe571946df338abd11694470e79e51e16ce6aa52acc0b7dbf1c127d93b235bcb0294afc4aacd6cadfdba6a7c7bcfef59b6c598ef9a3b3fbfaf8ea3a506e3cea8fbddefb07cdbb82b9bbddcae9874df0da3d99b61937b4be8724a1e976cae2f5daeaf601196c27cb50c7c89736a3027cbd8d1ff9aebc4633aa6c3930720e1258aabf5df2f4e8f3ef8d90b19369521a887618fcac878a86afc51b6d3dfd10299948320a2e1ca475a803d8b9e3e3f46e744594d6592046fd212f9c886e73cdd21628af2ee25f9e17161c8ff85e5b35925c0ea4cfdf6bd45e2c3750499f0547386f3254ba7fd07a4faeaf5223789be11d7cdb99020d546daa8802fd7722de5ff0411faec535162a6d1b365c097fa06fb4dc5c57a41982e2191a2fc6c4a9406ac5e10d9c6f9d90c2e68fe7d5ca21d2fd0ffb0b61c2592975f4997f307dd1d381431b2b702b461f060a7372d8e17fddac64fbc8530227a07ce38be7bdd4ca9fb6f97f46d2fa046cd3f8cfdc234358681f9711ced1dbcb4d28fd50cb180b5e8f439d0954af572c68baeb9c23748514a5174c79b3b5c751720afbd5dbea4686fff7ea2da2d6cf2ff2e9b46d4b3ddfe0ae33d8c9d958ac067b4e52cb2c790973c40480ccc949a05e621029ab18c4f5f055152975e249b15295f60376b611c779e5ece3977f2be369af8ee365cf27bb37460adb6503e0445907c9963d2fbb44ccf5f739d975705b921c641df98903b13bd3a2210e3b00948621e0d72954737af68e0fc0de884333ca1c40831c8b124397514de1e8b950893d074212952d968abbddae954572be8fb7c4d435d5f9d6568763126fdb0be439895b114869ec8fc9e35bcbfc9af889c78c87b3ee1bf9aa7029be9e2bf21e11bf93d1865370d6caec5a6e2b288022a2d480a88208be5b3f53a0c16f1b09db86641fa722c2b0e82c261209eea350ccee377a86e4e4dfe6fe8547bf2b2f1f20a5e64de7eb509fa14c1e088870c17f64a46077cb209d6767b043b22a2fe9159a71225959de22c35c8495aa2431c7f7987c6295fa11f511e32c3e3249fbe00004493797596158659827c217840c18ad5b723d46ff08fbd24c82ad3566481bedcbece99d3057eed5d857981756d3b7569f501d36a5038ddf968a5496db3c191b8332349876233f21b700a6d648e0a5274dd40b7a51dffb402077360104f6c214558b527e467c1f13b648e4eee51cb90192998f5d771a89e3ac4a355e173fa838a67ac78bf8878688bf6a0bb880dbfad9a201e371553828a7640516785536224d5c091030c4d01b4c2daa084cdd39a403e4040b7b72aaed79ebf1d390b5aa4850a79c925c1035bdae91d2c666f6fc06a7e6a1522813e4e924a752542a457d89912a3ebd75b53c4a7f2c8888eb1c258f5985a2daa77d7487490193e231699968dad85579271d04bae5368ee136e39657257ee2f547130703c0fcbbf3e1a3b1238fb7a248398c5d7c91f305194457551194ecaec47f75a8247d62935b60c8dfc080380905e439950820a5458e284d758a05f4720a9444a3a09664089ea3e6b061840adc0eed061c1f11e0504e182319f0332184fc856e68e7ca2b0168578201b94eca436634f5d5668292b6d8f1b565c50498b1d321bd820fd3b5a047fa366da6f506cea379a27205b32f41c81e22758e27e0f69230a2d38f44ab8664f45e6183cd5c8d16babd609150d953f6c2b6a137592b356c2012f66e08e1558e74aa78d5f7f5cae9abbf5aa2a448b3fff709d4c0116325a2fe630e98abbeab369a6b302314ba1d6cc594023ea9f68e128a822c96b7ce6d820a55ad15da6b183628ea09f10f1627f7e1415028238652cae49722073f58e18975e7b6bc600f4e5683e8f43226fe1c9dc17ba33e6b8e362680d4db4ae985554a33567bf666cf35d92da463857bbffc6aba61f4d0c85335a1d9c0db3587ef3acb2f96d605bfac2d5ce9699b5b6ff3bb490d530b107f5fc3805b3c7994a0be4a9734a0a4eba065a41793746c1613b3b4dccc0d0e4acb4cdeb938165f232e78c23096b546a9acae789f94cf7525a5a523b68e98a70629822f3dcc1f126859357582ad277323d27f9e3b013baf7f3afd7c58372d76aea9fb460ccada14df5f4518e39d7e9b4ddc23aae53849fdecf93e97453f0f84506863b1fd6764fe3b49339077c2bc8a359bc4459a2357969d34982c442e157230ca942ef58215112989224081b2f8ae602d37b21286be66cb8d603b224544ece5286a4e1583cb9f3d14287ee2f24b7afaed7017a72d4583e9fb647d04356fcbb0406be81a7e1dc90770debccd32c53b0381f79150099fa9cf20ad40069f021147111eda348a66dc0c8dcdd1977921114554e6d32f14cdc1088900b3e3c1d38dc368158dd0d8a630e83baca036a76c655849dd547d46dba517df6c58726d87dfcfab6501ef2cc1ff271cb793cb1bec9bccdf37d2521991d8e656048f7a630042ad789db25d71db150eea3bc16ab389e16ee6e5a3d9ddc607ccb1fa478000fe4e47e616e3ba41c4dd5c1d2e0502fbc17039f8cd008b6442b4c286dfb7a29481001c490039a4b327b59208e42520745a71715254888a73ec979b2fde52fa6901276eec1396e8ae3295b3ef9a4246921e4f57ef79423edbcbe8f2c69cf99e781c064531a2cc42b6a4e63a12f167e74bd9ce82e4da04c5e03f220b6c9967b6f295392018b07da078507b8a55b923daa2e074363aa06aa2eafd59a545d270afb1ea7f2e1e6b04eb5ab4dd93f0606ee19c1330f70e5ccde2fc96637b18a569e73728db38cd86cb6829ccca7966a293706b57b6fadd3003d29cc4db43645f6f7bca75e8b51c114d6ca421ff55d8fe7794e55e58a385fb240e2214ee9ef4dd5b563cc0f6b54d145132329ca0daca9d50006932d9c805252296250e28c520ab064319303759dc66efa983c262670f4a515302dcd6eea261b29dc40fe55875570c1240951e3a296bb3a9cab7fd254ee39cfe1b0b22bc32976241f1f9f9dcfce7d6e3e5888ddcdb9dd1e6595951abda7d59533f6842f7ecebb3f929e30f5424e9f0aff34f6846310d4df71341a7352754811244450d815b99183d2c026bdf504115259bdaab987d430780d754abd71ee9bb5d6598d5baa45ae8b71bc8cec2f56daba21a561bd340429a52105e98794d29567f0a2b0ed6b2f0d65ffe475ed93bdaec2b105087c4f731fa84fa7d3a95f3d3c889630fcbe0f09f5e13edc87b3d6a2ea87fb701f1385a5be2bec9b5fcef35b9124fee1729feec37d4ce26d5bc62eb95dd2209b768901f5fbdd1471d2bf9d88558e2c73a1b64bdfd287b34b5f9a0ff799f9943edca794bbbb6badadef0b4f66b0c0662b83dc62ad35c7aae5eead56cb36018e99e1ce647ff149833d03c1bc20cf5aa4ae07a990f5a8508df56820ff00b8c14a188101a0ca40a030ff4c633dec6f515db84b9b334c11bb2b50d035daf410868630362f5f9425c85531650a9b92952b965c393344103b3668662a28fdbf635d344b65f37bccbc9e79b5aee853d8f72050211908ee1750d2dfebe884b2fca3d09e82925050d2adc0e99a0a174f14f9e903880c77fb3cc77b1166b035331cceab16874b05b1ab65b4eb741581755d8180fe1851418d5aebe974c3fb1501010aec3ab293946442c976624198029be42ebc44391284ab109c80b2bcc8ac9b18c9d58610416117be49d710e5c44fa1ac45a1ac45893e2d278308297242a352a95456707dd3a9caf10dc103bf0ffcbecf476583ed8b482435c44937005007d485426c0df9019a0225fd81545708869ca65196a39aae066469e9de5badb5b69b4edbb03133632b95f49728a0d0a1dcb1312601b32895f49051ee380ffb22d8b510561ee85a4ea1ff7bb157b56b6d11beeff1e636271da929558b6a6aace7d7c744d4d3dd3809c70d85899f531b87d3d4fa3a8f31ca86578dd359355350187c5d25a0ac7e26d7098e92bbff749f528a84fef47b7f5a991be47034bdcc7b2691aee53af2a090b079c4cbd7496bedee5e8c55aadfedc42f72e110f8f590b5f796a032b933244460b36d4cafdc22d07cc4878e3031b9f15a6b0301e183c3e63d834dbbc5096cde267cccf830b1059b76096cde323a2c29814d9b041925247cb4f88cf111e373f339c2c7089f227c88f019c2278c8f103e493e410081cdfb830ab069917c8e7c7cf0e9c1078c4f161f9bcf171f1e7cbcf87409b38f260aae11150aa524595b22d26e4772c11e17ec3dc905d3f1e579efe3ae23bea2311084e057d44529a8fafaacbcd329c5152d53abd48b3939948a4c7fc222b53a569164abba3c058e2ada2324f5ed8c80a15452c768546a4bea659e33be522b997873a7bb224790749d61ef65be8117f82323fbd722f4e70b6cfaebf3d6e4d0adb541af5d115a4ecd6dfe05250ed11fd43854877c4d1006576093363512f35657ce3884aa9f389ad44c12277d09dcada13a2239aa69c10d82e06d9f16923ba367727275d7716f75ad58b8a5a3475913b83e0fd8fcecb9e2ea19878669b47b31fea72a953dd1685516070bd1b0d9389c0882a0102fef8b1e0d38270423fae3ef5528cbff820b76761a476b9c09b6bca3d32a0b175493a159fed53dffdc3ae8f741fbb957f79387ee417c07199ce7fc5de7ef4cfeafd7cbfbbe8f460343dc02d32c2a60812fca78732add8bb14af58f742fc6ffd4bfa948a05d2d43ebd036a829b9b45e2f7f7549d38c318344a9c436a121c9f843c9c257a2462fe29b2a2a3d458aa3a31bbeacf6d4ef235e16c71edbaaa78e7dd45d9cf41d36e03f8a9101c30e6fb46c11274ce94d676c64dc208515326a4a8fe1cd520e67989818a334a187306848a1858d0e4f94fe4540776f05a160f8729f16b556a4aeb95cae695d92ef3f150cbe994198458bca89e1424e751df3ec6f4f3ba3b04a73a1cf32a11fec7cce9b7685376d0bd99f071c7cfa5636e362684c47e8f390c89eab9e545da934ec177e94bb81a98a2a8a3b6192c9e09cd779b37745a63fd95158386e49bd7f37c139d3a0b1d3fbb719f4839d7176cbd4fb1a09408d33f28c1e789cbdcad49bfd26fbdb294e68ec34f6b557ec0b95d27a5394a64ce852a4823faf7e35670bea6b0a025ea25ea462bd94525abf9c70043bf608f14a7cc72d784ca2045c89d9ac39bb5459494e5adc51755922dc82a1404a47d60720726a658f56b656593afac386b28c7294cef592e8060ceea65d9582a9933992c066cde572b95c2e97cbe5320d80127049e829dced0824d565adf5ec57ed47c1fddf87242582cdd1c6b39efdac9733819b23a4245b93ed034110a43f4d486e6d2a6a65e4c8ad8d5aa5eae8f37d357f5e4d91e50bf45379048a860a1a3e6a452babae442af4dda02eb2fae8c90da02450d29facae0750960369201e79014a48e88f7f51cf4eba44561fa9174895eab5012cbc4a71ecd9310b82017f0d86b26cb6a1d702ff0801da80bfb18784fefa754ca17edb1850c79efab44dad892fb5245ed8428c19c80853840e616ca96ebb2dd9926c0a049d77248159b0dbe1490d4d7081c50a25016240438a9a35582c61542615f1429a3662d0480101706cc29899d16931a2f4ef82e0ad3e2ddb0e0b177423fa7347377296bf1b5d376a266c52a637ddc89589c696932f193a56816820a7523d07b928ac5d4343d5559392983c6badb5d67a15fae3563a498a1e703be090fd732b1ec6ab5098e73df80e8e831bb9911192284e9874dbbed8477723374281a961c9fe22520917ec5a75ddb10467f9df7b42dd5a29ada9143da14aa81d51580e180ad66a4d277af212de6b868931a4a89141072f687461e60ad396233452a830b9b24486156630a20b18d65cb19403163494c6287dc922841a9a1ae70d64685840293d0b27665841131210649a924ec0744607242dc060b95181a2060c63bc8872c6891a32a4a14517169c91050423ba685263da01b7d4001e54d832450a376f9270418b2bc8b090061ba5282ab0a5694b0e43c420c54b115378496309da121060d8925030424b183eb459a14a14a53f9931bc2041e5cd1636201c51c999898109382b5ca1c244166378d18316a5dad1c5180a2660802a95192674df3fa8834792d8896db5a050a1cabd18d7ffe17fef136de0e436bbe6c34999933f42d4c0f0224e52153158815446b9648a99a3a2315378e1c20db5a3dc0d35fa5373a20723354fa4f0814ab9e4099ca52a5dd09086132f9c334a696e140a55abd9dad885470eee06dbaf22da3276bbdd1377ffbe5d7571c0c18e03fac30185b9d7bcdb511806d9a5cc40856880d33b141ac87bb7da612118b049757d545da8ef40d736717561610852f8c0908e9d46141ac87f6c281e086f30389e21020717b0f8a2e5484de9efb3ea5a02c60c2d66be88c243133894feddbd54734bb9a5dcb7b4f4e5fe0906bf7e43c91550b2d7c875ac773e8bc29be0dae46aad13c349ff351f6d9a9333720004ae6f450e4ff23fc1369b1c6408a05e448db8b2b0d87577f75777bb5d2a0ba73914ac83a23f23ca513a2375944dd10c70d05c9f301ca69515be0fd4d52717fa850a7d9da587c814b5126bad2894066084f4a73128031f113514d425ab2cc775ec090a13a915d9bdcfa2faac6d2665268b7764e607dbf9663a557b98a9ae3eeb2dd7e77994caa93527c75a142aa7e634799a553fd15134188d6b2c52ab4683ea27ba0deafd1bcda9c168355d45e34494783aa150a714eab4229d1c1212e4404e4bf94e8e8a3ab62f47649af4a5ce9b00e8316b953a6f6ea0d279fae2cecac6e3559776b565e77556b35beebcb79cb496665bcd59d192e4826bf78857363ea7a888852f739e8556a9f3f8f1aaa3501e4e3b309b0aa507307b86ec5faf80d4d5359d9c959736563d42725644b54708fe9cc7235165798f9021fd780cd2d3a3095eeabcce8864ecb39e6775a9684d9da7ad7e136c77ec2320f79bdda2b1d3f7dbf0cd1d03c88d23f76b405d40725021f0fb31a042dff7dfa0b1131a88c6eef7db800289868209caa2194cfde8d303f1d1409e1a4d8c1ac7b1eb595d486aed72fe4089a72c568fec22e823e91891adda725d3c6390017592838e018002bd32b880fef8ab6c361bca718079bd5ed5659dc2b8c0d4c92f3630c4a4b0efae600d5575f56ca69aa966aaf082e0bddf77c14bd403d6400978a26746643c0061441e5018f8c412635e2f27b31baa44217d5a2f9b94e621c5f3dc1dc96fb7effb40508332b067330317e3b75b06b71b851520d3a65196ff454385902351587bad15a459fe4528cb5f4553558abbd8c6630d6cdf6fe50a581c93784992230b304dd8dcd6751eb67f0b369bd683054d536a5fbaa9c126ddd99d096829da65a04119b8bb64fb79dfb46ac4054e092428e94c30d500858f71dff9ad6944348d8856ab653dcfbbddbc1baed5b030310d0d31310d31315925f023d34a23e4d67ad38095c644d3d53a0674e97cdf9edc1a75abdebddebdbdea2bf4c759dd23a54066d790fd1d0bc905f7d8c3c9efe3825fcef2ff7e28903f10aafbebfeba7d7a30c1669d9263d25bbde2ea23af42635328ec7b57db1c1cbb060a44850a75150a8e661bd5fc8d1da3828d8850584d6511ba08857d6f9489a48874c0031d0b8bb0278651039981c906ba914ee98ff844b95bc5b9cb13224363b206f22b86c2c0311d0b29ecbbe57c770af5ea71db3de5f4d6b812b989d19f4781fa01e0f596720cb6c09d61621a1a72cbe451d7ebd5302bbc0517fabc1768b74061fd31179a06d50b471f1ddda397780ac3d3e9de5378eaf30409341005689ba350027d7a04282c6c03869aa1155440292c14230498f0ded3fdd3edbb6a05bd86706293914f124e2035ca1d85da15e9982afbc7528087509c164ab9db03c00ab22174776b05bfbef909c0e03709fde01339e93914a8e7799e67bd342a4502e52283ddff29125629f4571168aa0708cdde8b40b3371ef17e040dfeb7da7247998344436467e0b367ae26535c1082065b1561ca1f4c63e2f0d0021433984aff0010800ad9efd8090dd4c1152f3ba1d2db15df870251284f7642134b8dc210a21dcd15f176457656aa164adc5e482f7f4f2737044465ea52a9dcb41012fede5481e10dd2c205a9fdea57c5596b6bb5e1bdab0d6480922950a2a6156080467321f53ce7f439a25c4ef4b4104fe2a8aa46eceb02eaf232147cafaadc920cf86653a5ba9ea7aa2ecfe248de25fbab282c2797a3b09783d1b1568b471c6cba18bb8eb5a130da4c365babce145cb4109405a63835703cafae4c329856d6ceb76c5bc8cae2e10536db66ab76657e08f86bfd3e7d5de5fcceca3ce2e19579c43bea417d67d4a7563da8980b38fc53cf1d3b4bc7ac6099dbda3f643e6e752c0148db88aa8b963c5fc5f5951e2ff778020d7726a043172f9b7da57efe7e18f9aa0ff69d14e4b0b53e241847474747617874046b02bf7ad81b9e44f184124f27510c43f12486a853783a8911024c9fc2500c5f0ce90f19f4ea819a42e914d8e4a194f2f0f0f0743749e256a8b5bb918282b0535048eac51792f3a817aba5322ab0bff831f15481532b191a6caa6451609348fd7e337c1210108623913aa64084aec93d7a80943d814df28673643328c543076c0f407f5a4cf88534196303113b6c11a28992b279020d2c5f14a17173532e7122c50a59ecc26481a3c502d058a306315cdcb001a2f4a74b41404ee09bf70e34702b2ddd8ac0b65deebb37d999bc89a18398d0ea244a155114cfaa02655579534fdfb9e01f7618560d6a687a487263f321ac8de44266cd922d15dddda9fe9ac585288e0b2c6b7010d8ec1bcdbd858ada12d9c553dfdc75e33ccf9309cdb44c1aa32e4c6598c8c866339581224b367b4deb7a770a6b1717a2659eb0d1324cb8ec5deb0fa92d649a934fbcc8c9d39bc450967f78772ec8418cb71be21db32e2d85a7d3e9a6638beef0cdd64d8dd4c97b653ed4348f22c5510a4a250910233746894aa5526392b6c2841a7b380f1faa4dbbb7ae7a38e91e5020ff18fdf1afaf520c4a7f287da571afb50ed5c435901cf533a0503d6ec0344573b88aab4381728eec4fa4c808d4a5a26832a5826e616d7710438f2c5b01b93ab234401f406449b793e7d5ea79d56bdd90fe5c235bcf46fa16265b6c1d80ba184059ee819946b9e7d96ce5163672ffc8cda0974125846188c9fe5c05e7354ed227ea7fa90ea0022c731c17b36cde06080962e4880914c84b70726606046f7777ea823ead13d574da38e77922352ae743af2254c37ed6abca26ca939c3c4f0ae3c93ab9dd7895573b1377e251a8ef4c400b9c1d31e06fec22b0d96edcb85057af9eb305f59d824097a8318992d29fd070d36653b0f918c482c0efad1708822f053b13cfdd0b7f29f8948dd8ea4536e2d9f4b3e90d6e386e9c0c9201876fb69bef87cc6f50f9beef7b29f87aa91f37a660d34f307543066cfa596b8e68250617bcc867a7d1cf225aaf27bdb635e7fdc4a18568932af4e74c280cb4d9bee93a64b7e231f82905a73cf7b37ad1cc497fe22c7fca4471595457a6d4d1cf15e0f04d3f67a0b5f6d67a53d75efa13d29f5301729fa777f28821426aa2eab23667736dad7b9ee779f42f407336e7830caa9ae5ff39b2674433609a236ac2a0fdaecada1e3dd7cb9efa6155760cc1bbab0f851edff892f51022cf06c1795eed762f58e644b95c2e970bca116da9bf1a3be66a0faed22b0c4c1bc87eadd547754649c32490a5a5251e1e1e1ed007c80f1557cfe0704182e07038080e57df445113280ef7010d1724280c9c85580892cae6e3821861f36334e0557defeb2acc1f68ff1beb7b407aece8a30427f38e33708c16b382bf5aeb791eee7403bdc9f22da343467ffc83ccb8d55a6f32ec4f481e175f0ab6d9e4c93c9ee7595b5f0af6282ca74f01ec6e4bb6249acfa411ea796946e70c894714f83c45b73b13d05214441ae99c5a628497177ed059f1858c1444000c1423904002892e9a28971cb94903a78718c0aca04dd9b3e484142ea039428d1037a860b3cf20d5e824c9dc69871a1677777724aa126b90aa52e1d3450053136e66a5127f41052aa5f8497a90b4944a74be94e2e8e5bea9ca2c605c0c067c1fccc00a361b4b9093abef89cc04e4fe5a24883686d1f53cef35fa9039098e3d76d8403424c810b5965afbb910b02b920429f7a8342db289ca7eda85d1944daa0bc34cbe71b6276486ae7994b5d63280aec9b8204be8881665bf2f0194e57f7bb8b6e01ee05077f7bdf7aa545f96ffca88b1efe9f0017f362b1601b480cd8a25fb7feaff1b4d56766f340f90dd8ea607d99f52caf2ee55ddefc130bc7dbbafc74578de38fd41f966df795617d6e101075fe1d636b9105d23067563cb50afae9db74cd92d1a3192d6d894ece9f7afd1393b4f0a9b754c749d3755b409f65e8c7551e1e47235a7dbe98c6eb24973dcca99aef0353af79c91777196bf57a16694b2139184e47d7bdfe94655b27f3d6a7280973b23156cc2ce770a02b6dc199328297776c6eff49a3c389e9beff4dce4effcceeffcceeffcceeffccef0d4f1d4180ebca7fffd908e7d234f03790623fb9b01880d094f4fff4fa757791aef063e58c0409cb4160c52024fc77e50207f1172f038a3f46afbafa269d0578faa6aa48260e500fdf1ffbe4a4d1a075a0535da0c51fa412916340ada846e88d8c2cc5a6b47d9ab9ca4f48768554e52ead4d54e662166029badcbbad6b54ee6e410aa73d2c5e8990747605207129639d9dfe7d96e6b4d9ed9ec0446b45f6a255bf55e8c55aabfd97ad96a3131911e94fd1b299fb8b3f87ddf23f1be8eed4c204b96fc7d9036b81f14cd2db35b26e938a5cc79f4a7e08348f80d387d8bdf1747e69f08e05f93085dca9fcc4fff51728bf8e205c5950a5efa8b8a8a66af52fc19598a5f345395e2cf6e297e51110bb76ca2d3749eaab20908e73c4bf18b5820cb26b50567297e6dcb369bad6d17acaaea3ac104286c361e1b743a9d4ea7d3e9743a9d4ea7fb4b5e1c5975c94fa7d3e974ba7b2f8bba3a0aca722c6e9a56086970d07d9e0b5d307cab44eb06b24aeb3e53ca248d548905dfd1939c08fad34342b6e391cedfe836476a33a2bc2a3349231c5b57595cc8ec1e67f3d9b4ee1de7375fea1be80782a04ea7a325030f947091cedbff8c8a6e093929940e51757580b2facf60413f0c8ffabe530614e6ad9c566abc517b519847d5ca697009db9737bb2143aa0b0765f9e3c02123832fb8145b43024161694d185e30f450e0edae857f12ad154f635f3455eccab8dd6eb7dbed766bf9ed76bb5dd55d22bba8be493a19f4c7dfb6b555007eabd5d6f62532d664264aee69babb9b0c0aab96e2d634712158f67f42e3a146565147437d6c5357da8104f6a55b17f85629cc56d9620b366ccc30e346a7e8db6d7423314165a81215d9df6badd66b9d314e21088267ad94e55f7120ea14079b9689a9babe1204411014751c575375019d2c45c155b08a087e7d101cdde6471da881ed683ae579f71e3c29ec051e81367ce3799ebafca39d5e068be36cbccc6bf6076b9e03835ececb8c703ec2383e47abba3ae72c7fddce6f153cc1139c75ec890bd9cf19f1088e660bb445e1dff75616d740fe3956f65ccdb2a5993a4e4b32c9a3ec353baeb952a7541afd795267f5e459b9aeb2fc0a67793d473f02cfea0a0206c1a1f123263fb231facd8db209de6458b261c3868d11fcc4e0ef03a7f8401004c1133ccfec20789e4eec369a049161b3d9acb5599bb591ad02f6b269c1d86c960014f60385f5a3510210ed2a4246c579914590ca92c26c1b4ea29dc8fe423960b36dd816ebf2448d96da59dabcdf390057409c1c91d66093ee38c0827de070d65aebee5f4753853a83f4c44110042b8d8de0e60f360295f5ddea080c007095875058b515ccf78708dd804d9aeb40d8ff4119a8bfa9888c140e75f37ddf0647e00db290d37724095165e9f2a9081099931db40013a1e02cff1e1deb00353fc823111f406434a7eaeefebe0ffc7c52b37bbbb77bbbb77bbb372299f7f77d2b331604fea8b5161ce132c96be07bbfeffbbeaf7ed5e7263bb5c8699104fef26bf0c3165a705aa6e8c287d2b550214c181ac0ac61a54ca3a8056cb870534599334a326f6c4038a981862f4d4affa639b2c0e67b5970676200efbd97f4f95a9e19d59ff0f0f0601e1cd4a58190c75aeb79ee3c14e6d6831bee7714d0e01e41ea33bff910d97de0e25ff20e5ecba1b9102121c5b1c9d694081b6493076719fdb10f044978c7169abc4059eea71bb91457a1c96d576a467e1a2169aa2d0465f98bb965d0a83a298715d8f4d3cff374f05c720e31c31632d2ec40059512852c496b9cecc46852a6741c5892988ecc9c5181ae04365c86d021072861be94ada033c5c53fbd44b2210d3c2128d8ec9dd946650d37e5c826cdfd28b1e0d6b518465ddb35d19fdd0e776a1287528a31aeaaffa521408054172d31a618ab9610e0af16262f75b5d092dc2f1a9030d5006fec19a1dfa3e525b9f6f92456753d6946e7ccf33c4f7442ac3efeaa1d17e5d3d9bb281f1c3b563aa7aea7b74d7f1a2443bc50aad3eec59866927567c7fe92d2f4daf5a36a94d35dff7ea750ff8e66f8df8bd4c71bfcd927c3d40fef711aec81c66553892da7d01fe232f8a6125b0e5170e393f408d9791bbf33aeb0a4e4791bcfe33b6fa35096bff8e6abe9a23a25428f66e36eac92a0c00a1aca9437dea37953288c4661628f101b3c6fe39794385ee63bab1e213bafe3758c4974883cab9a5b555d65ad7a84e4789ecf31d65ccf7d9ecff13a563d4254afe35563d531f6dccf31da19adb2ee688297381ec7589b464bf39ce57f2fc62a55686d280b059b366773d5656d3797b2398f05d8b436efe2d1bc1ecd96337a345bcada524ea3629c668af9714759ddb9b1124119598c4a1b2b5aa256467ad52402cd46eedbf888342edb9f029b64145cb2fdd305dff468d70b575e14fa732f48ea701d6916e5a447f3683a8ecfd8bed86c365babda5cf55eda9e883cbc6093ee28a5b4d401d34c349ba98870172dcdf4dbd48f1e2a6bd8a44ca9120bb685756c2efdfabecf6613733b44419778c86285943656d6e04176861261b8b88196c3130b854643a2f4fb3e9ac5b5e8f4a6b5345ac7ae513e8b320bd86cda8bdeaad0a51be8193847a1b234d8a44c27ed8eb4972c0c9c8115ec1fbe7def668fd2d154a556af6635eb5545008f7819b4e17bea47f8a72da2380e398b299f56de434d63aa1dd1578c0a79d61b4ad2450e4e9ff7dedbeede0ab2b41d1bc4554ece3860cfeeeeb40b05d872e8a254024a7145797f8ceb54d2bfaf1e3c825c41f4c73fcf60628cf1f781df0782df077ee0a53f21fd09c238f731f10453813b9b3c3cdf4705e669229454a20d0c857d1fab6a3a56dfd559dc75852b79edeb2a415c90343559fb1e15ea393dcde11bf1ee83dfd7b7560cc2822feaae4e50028ae443da0104eea4b6750da1a7fed736fa531f0bec5f5de106dae1058f4f05b6426cadd6d66a2d18fae3968a1e690309e9a181fcbb8727be8779bd448fe9306d6b9b2d8a1326dd43c7c2ec8f7d10916cdcd0812347ab4592189f4455f537d31c3878de7cd5a8e3de1c18e350a978fe6f8c36c6962873a22154015560ef531fbe793fc8a9324c05a14ca834cef704b574666604004000b3140000200c0a0643e18060442a1d0e327d14000c66824080663c1848834116e340c620628c71c6000000404466486a1c0419831144d24793ca8404357a5459bfe046e69a9c7c852d31b21b3eedc8c43ce80eaa0ffaf365464fc16e821be7f22e763531d40e94f54ffeac0a612078e2505d045804018ab840de94f1d12dae2955499fbaf1f2e4a14298c2ea0b1871ee4a1bb794ab823fe2177c4195d4444c3102c10a24f1d8bcaa7eb4e2ccd1850fc82fbf713d0d54393ed01474e3589b3b90ae7d909d67cf073db5e483b48d45890b8c253985c39939add8fbcc7de77e6b8554c89077e0b8f305b9bc37fb1bb4eef84b1ae9f4446090fd7b691b3bb589afbd763e50e607a254baa29e018f482bf25ece1d99931891acc1a2ad4859d5273cc7b13c96779f7c15942ed755f64d07f0aa7355ceb95ac1ec882e331277e176353f9d9cd9247409d0211312a2fadae1a343fe7745daaa97d74274a90481bfd2169ef2474200c14a020571d14f633b88524940946611a4ac987cb05a831d963a3723b25d6ef8735a906766440b8fdbb2bb0fad00444d3dd776203e5b2d833350cb5017799e585833ef2cf1617905562b951738ca1dea8a24ade3dc255bcf9705c4401fccc55448bca03d9aa1d3d1812767500a4603e0dce7190b1bc2af38a09d15f8aa91fa6f7dc622eaf38c0402baaeb9c8e3c9c977780c8b782907fcd1730cf59411b4a63fdcd7fda880eaeba3be3b8375be4d50e20d4d6bd6d5b84979aa6c05804847975ad3c917b2c9056bac91be86729ca964149e052b0fcef895ac095646ea8f796396c75b09cadcd06755f5aff9a129d26b0779bd52241623c25e296485c5604dbddc292a3a8e40d9f5e5645e72ab64fc462f966248e2ebd4bf9189a2496364f1e1eafa57f5b7c338165c59ffb2ab508716e6ec26889482e3f43ee62036147751610cfb28727a1f0498051033d202c9129716ef7300e78424bca85882dce1587ba014ddfbc6c2b052efff0ce00eb6fc21d5cf043d950d7f1ca7f3bffbc03525aef273c0e6101fd881ee320d373053e93b5bdc207a66fabc92a9c53e6dc79ebbcf77560579ab3a0d22651b0984050d38a3dcc2a775e4a5042d6c4a21dca73016096f506f125a3c7d077d1c30dabb0001d5fc7d679e80893356744e8d30307c9c219dfd9f292926194828f4a08d4eaa40901142042c004f3de133cbf047dd1b78bf9ec2438651cd5d10d8005e72c8eae75e2d89eeb9c33aa7dfeba8afb3cd624f000caa800db42787d0178f96f39a957411c35bc94e94a649a6c8ee5623a668a4708d032c98b65700257866b4772cc0acca9b6495e3923342dc492e64e8619945a4fc8724830cc60039b1da715887190d889f0b93a4a2242a60409dc8fb2d7eb20913aba445da8366e3968cf3d066f2d7a9ce35c5e1280a2c21ae69b1c639a8f7834b64375c18cb454fa3ae9734a046b9aa02a1a8cfc3084ad34def01a877d000012587d13ee7fa3d664f589b0cf2eb186be129a36cd7d0365ad043542bd9e3f6004caa55e5c3e71e26882baf687d34cdc48d91bb2170db7034c924a7303442ee4acc4c905ab511eb19b8bcb3c323d9128060101292263c4c536711bac10f5213cc024274e65378e21757650034456e7905ac54e6b5979acff01ef3124ce27bd8924ec6a0142cde468525814940ffa0e513da4461ddd79445679dac9505a9279a17cb4f5d5690baf84b4e006dac65e23e90d116e83cbb518759bc1144498e4e5b7eeeba16498f6ab45c72de2a400755b8ef51082807396c363a21716601120681a806b68b08d1b392e3245f1ee034db6941f22bfe791fe599eb9bbba9f9e568cc46732480f1405f1efd5811b382920a7dd1d2178988404cfb4a95bedd7f5227b221ccd2cb632e0eb4a132523f3bd343efa6deab2e44e1936d610b8deb54f5c1a01a3d5fe0b2024643cc6563b6199bbc015fc0729325c03c87cafcef3658847a58e1d8648b9901a127aa8b4ed8dfd882fa211d799dd993743ce6ab1d3e38eeda2651456c8f88b40084b41072befa8542dcfdb08de677c214a86c78151ed725475e61f8426701573c024ecff945d959d98a018e303b9c751c24a66a83edbd3624fe1b8074b2037997ea0dcbfc9c67f5732a436b3887fc9e02582a75b20a7f855bfde897ed3c30dd9f2af17af3ba20aadb1bb31374a8827acfcbf15bcfa9feaf380a376c08ba118034602fdab30673657da55341278c85ab793885d784a0911d00079971892d883596a2cc3218191d8f8a4402f8964d6633f69459a8d817e18f5b36d1f0518f95d09120997b50bc79e441f2eeab1e67d47d9ad319d83041c7c1b62f386ea5de28d1f8685c098474c0d959ebd30c86cd04d0915b51a51af2b721ff0695e2c05b36118670dce50bfcccfc0f3242832ad02b07b39484c77040a9c88923fe96432ce8ee30abcdd5e28fef0bdce4d425b3b8262e181870bc0ee0ffa25998a292f945f006cf049b1065dc2dc8f4b2dce04c9378989551284e1ee4935e163993537a6b486e13defb8f4f5df3a09f6531b542b253a5b04dd6435432d1077e0da01ae18f0c863a19dc0c996b439d5cf1af9ba18926fac220dd88cd9efd5a474b4ffa3b220c2c6d48de5294ecda5a604f4014c116f61e8a4bfb305dbc9180e6413cf9171592a32a59905380b720c2b3a20fca36de2af4fe81c2b6be740fe1706e95964e95ae49a0be833715b20b18f5f3e75367d59c112fb40d7453b18cf78b01a374957b9f83697499fe219dd9463189c01965e05827c6126a45c5d2e2d96518b66afcd53b8fdb3c03864e3dbe7d42fe92d281d87b37cafde3137538d420298728b4b24737485864b94abaec77d70c24816eb00898591535cfd79a73fccfbc99a1b62f6a83c32aea8df5cfdb588210f98963468bf36a600c7fd9b24816fb9b5df2b5ca0f8151c1519969f170cfbafb47fcaddd8344bf20533a770021df6aac70a26499270e119e078626e0c0ca7c5e5f9bbe125bce5b51e07a801c80b99eaef9f81b70e637c2e2fe53941280139700ad053b8180d04a95eaf3935ffa08aa8d44783cd6026394aff5b25ad55b7134c81ae76b0af19bda35b232259ce3e21a3fdd7cb1acfa36c4a692b9fdb46babe2c4d67759c8592167a23d64801938953f2429cc0613e70dcd8b77b9fd1c85a4d2356bdc628635c7b02ec7ceac46e35f541816de412dc198d5d23b4c0286a445969d37c161a3098866adfc4e76f5a1ecb42203ba1932644f68edd9faa92ca498fd4626828dd1fe9767c8b6b178e00a3f0c8ea941dc716e3f82baf94dd1b2c05a42c9b9498600fa9adf1de5c02e6502ca5bf30e55319676e5bba7decdfec9585d8da5dadddcf8c0a943f94f6efc4bda7d8464708e12d2b1617dea20f6d0127136281250f66090f0e7a51a5f223e697d1d4f2bd606dbb047e610ad18c117794577f47153b28c9545ebf3f22f0c435ed59af972d8ab820afa1dee333f07f91aa80ad790bf5d81cf41af0c1971b9a022fb8b125a7349b2296000cd841c5569ce3f4feb60ad1cdac850490463868cfac9a8264225e9bd15d77d85a406d1e964790a2ca6a3c5858b0ebd76af007a1833e08db26d2d679a9283991fb22dace02b80d6adb73b63636eed33fb574bdd75616e8fcedfeddbe1982f3389e2f82bdfd29eb14f01032018c5001154b6dbd30e79594b03a170f98ca76c5365dbf92d801b2e207a26fbea60439d1709cab442e2e212c2e5a9d2bfb5c7861d06309362664c4bdbfb9b052334519ed87e3b50db6d8ee9938f34b4f08adc8a9d162da7f28b1371e85d6975d6b305fd520f95b71fa96238f3726ff0bc0ef53245f54896b89b8f18ba7644e7f5402539e06f28b2044995881eaff107328a40a06dbb1524f83a59a4ba34b82ee47321b0ad4f1cbfb809b6b29a841f2b3be1ce2084244ccd6458d03b4fbefc9594a83fac89b07106d81879f88a0d66e6380a5153f5f52392e2c47d5b364a3cb76f0068678db4bfb6ad8eba0c15b50dcfeea6c4a3093440fc22bb8b8876c245aedb963dab841278418e87e06e5f1b6ec139303d1699db3de8beb6d501deda4155822688f118c181c4d47ca3c2feb1693cb60fc2809d1a3df0a8273ab9744b353798da797b5d9d2971aae90c659243256aea0756ca2142dc271d6842765284acb5d75384d7fbdfd2e8abb535dd79ebcefd5fdf52b9b155e088830f71169dcc233a9135551f05f5d46954af602dccc77c31ac4958b1bc6352c0dbf828cc6a5e67d10229d05a78e49efe3e52a0f7a835c6816cbb44a33e12e4402c602c0585c594049477bee4dc076a45acf68b08960f100e6289bb00ca827d0a74ee588cda29ee0af4740c7792d5fede098e65403e692bba153ec8b82be95fb11c230c5e85fd699ad88f1a6b87a0da3ec22c82b337d831fb4bf78122d775e27959f2a9c91b684cfd689dc7e47332d4f4f9cb14939746701c6cc30c815843741a0421f71b121d9876cd15701ebdb5dccea45901b4d8a7b7c8cb6634e4e1bb71e5fb4941aeddb9fad264d09a7fb060abde9f9b41742bb559f8ffe0c268d446322af50ffa8d2ac3ef4a0281a9a92b8401225c2f62f45881c2e23ea97f0dee1697b26d87cdd35c198bfaae8d67a4e44c4a862906bdcf9e1e89d593bc9af3c115d1e5ecaa38b20c3d11fcc5eaf73a86d9585ee285518848232b3319b021e69022f905da55d679480da81942137941087bb3f51a3b62028586ec15f8e333ca3cd9d80124c3f06994dc448d52dc35ca4f6c945d764c1c28ddacf1ae4275a00238d908a80e680edf68f05e2ea04bb17b8c92273c5c4111d1a642420c7ce5b6a8c6b00f54d3f028b167f5b57f3f09bdcabb1505fe1b7441c659ed6721db939ef2037625999b05443675aa7a67a7efee81ae89591d5ff51bd9f44bd468348a3f1fac62cb50c3666cc6b12b81407400d72c5722efbc120106a34e1fb1869fda6ff0f14f62decf0b500b63cbf708a1189431574595124564deee81c3d956c16c68cd86b7840169cc86a3306be8359c85af8d837d0c3f39a584425dabf7befad366e4f91281c6bbde027395744f5918211e4bd5a05994a1aef5d9b6762493db9f970b7cc23c370412ee256310a889baf645ca1dc9773245e4820c91c861dff253704294f6a56fac30b1d8be8a2898d84376f6422d2aab2e1364462d3c28e309227202dfa23e186f24a387fee5625ecbb52f9cdd2fb79f41d145cfaf3fd99ced52f90aa29347a33df5ea4c00e4213e6104502dd6fe0749ab4069dc407d3e3bf4d65682e4920d1431be48cc421c4cbf7237e3ec8e0e6e682cb8c8f2a824ca1a2d635757ce96b2d1c544f65b6df5f8ba092eb0086b94dc10fee90dbfa879b2eb80f72adaa791bc7c5d10225b35acc0e56bdf7f65df0edd03facf9eb91761aacff51636c269baf659ad81ae525ea2bc9537078b0d310a4710a877c7e7708d30a878e637e039cf4c481209af290a87959e3c6e1690ff3b43c0d1bb767accbb3557c0305869844316a4ebc4b59f46cfa6ccb389ca39d1a71015864a9e7d95bfeca0e10f223932c7a851f0b7a4cd1dbeca8c23ae677318e2fd85d5471b09760208af41f954e2a4b61ab92eaa53667cb97003adef9a77ad061590ebcdf0da99c620fa28eb810b25d636980b4b4356258feb3a5884137298438c838a995685277babbcb7081fa157e40e7a3399a44e97e3eab56a459a4adafb9e3e25db73992320fc993b48d1e1ea0dc8dff24b60fd5395256c3934a45451811730ee1cb193e3b3684493de18425709feb00c3c6a0fef86a008be018bb5f3d4dc29cfecdd0fdbbd2cce15130f90d8968b4690517c6e75426cce81f7b1887f826d24121fd1da49b588e27e5e98ab21c7067c5380680e88c6fe0027084259b37cea8e22660074e442f3947321708c4501e8794a58c7fe4e661502914fc3f56c6ccf8bb18b07c60b60625d91345b17ce1e02981277d449aba0630f9a91d0ec1a03be282c1b0f0b7c7198a94b0fa4f8fc39624adde0c05f430a8012c25e1000d090aa2470b1b39e83cfbd352359789cca62bd41044efa05feb307e308ba19d49b5a8be8c22883ce86c5c8c60d6387e3295764c3403c0ec39f6d4c109562b856827c202b245685c5594f134b0b29595e632842100c7dd80345cd274e386c93b6eb43a56c7c31663ab08d1417a3cffc705be86bbad6d1186b042d2162d72e7cf0903631f6daa3eb33db5f43e5a92a63e74c9e802fafdea091a2e7f895ee159abced89e0420b114608a08a755003060ee4fa82a872d42a217d949281026ca5a0557a8efd6dd21ea902fd2d401d8534b4fb406f8e4a2f21d403e44e37dd894c5c88134481b606724489de333fd0d626566f94b31dfa944ec0fb822a871d128c05a1d8a375dcc64b6ee223b91219a31d5ff642684c2e0a129f9e552f9fcd2fc45fd7a9d0d820902d2813c41a082347900a8617d4c754d0e4c82598c9830c9556ee010b2acc5973edabc94554c1e1f65cde725df162ae23de6e5dda0100a5085f24071cf424463acc6dabee0d1114d0f5b3cefb79a6376fd6d5b22ed91d8dbe9c86a740896f9163588fa240cc93af772e56d30ce570e65c5274c57260dd503c24a816e6d1e5363687bccae1291ad13a09c529a28cc5b71ee17a8bbe67206efca4c955f76b4f07736376998cafd0960b87005bca886908fac5c13d4f93119bf133242287dc7225effcc0fd1bb9686aa5d408462742abaad4c0764392a8273ff19603e35d0e7b9811d9dbe5f8e7a9d08d4866026e95ca02bfc73da94402e1858aba889e20897a7808a219c74778f34dca5645021759a4fc63718afb3447fef55dd512540ddf461a49b328689e15b1084a43aeeb9e34b05485649d1021ba9321ce951e3927811a55d863520d9b2a5b79a6d6135a71f561176efd9e5344bee8d4ffae0970b18fc8dc8738e3aa517bb27b531d3c6d15288e90adbe300dc38c7c70ace7ec825c4f8c462e956ed2fc2a1c2345a91b842fec5f0a181e933ac612090b9cf43e265c85853400173a4a4d06424bb5fdf8661fb02ed26298736c90e5ab51dfa77ce1206b502831e83e6d58cdfbb883e81431b75ad1cbb90c08b42b35dcc6be147bce7064b7cffa56aa8711b169affd9096116f242f2e9f13e38cb2d51552d4663296879c417b07356ab22561266651f54a659cc79730dc7c669bf392383fb7633f204a83ff496acd68013bed7f3529e2aba7f9e4909db77d3110c5764ac12ea1cb65099fef3ee4600ecf9d21222c1cfc7c2fc1ccd2481bcd6024742d60c50ec1f876230f0366cd949a5f859b32556f7c991facdad9c500b7f3ef09c03bc580203c7615304649d1e1d1146e921a0fd75a47ae191164211716229fe75e977b2210d6eef2964fc55583b06bab792d36418e4e666c28b9d70f30f7e7f4545a68e235f6a12b2f076408310568b660f2e63ea846f0a67c414de9149aab808a3810fe5577827eb6941852b48dc14b203e83b1f4e48a5b682e8b49139517746cd3d843eb25a845c2c198104ae6ec19d9cecf3a0bef76c5861210e90206d43331404984788a610c496043ced8addbb090f2ef53d9850e1ceba4f24cd0cec3003d8433895e2d340568d91c09818685ec53f653b5467d87d8b6baa57a240600fe8bc000d56c5bee6f86f729431ac124f0c7489cc25e5fbf44ce4627133e624ca10a75625bac846f10638961700cfd37c7897505cb9fc7365a929a534fd5323ac82b054d58e21e01043a1c0f2a40488da79706d3ec994c9495864b5ffb4014ca723224216ec0055ed06da29096b6ccdee24713ddc233f531a590ee929989a55e38fcfba000f93221549717709fbdf43618f1afbdea16a889040df4786800a3dcb84ed06978c72294c69e19d97e877ef09a81b5ebb8aa3ca20507ebaa12f4cce06af36259c91e5fd53d35547154737232b3a6d132cbd4304a065b9bd9a9587cb5b7661c45afe264dcd3a4f784e89a0a8cb5b8c47cc70660cba150ca0c8509a4be2cc500d460c98fd2fb2fb99ddd667684ed3eea19022fea6f76eaed49915436a8352bc8fef3f0cf1ad5e567a6fc8e003b66dd33e96772d28be6ad23cb59c97f8959148255cdf437e4d1dee05983875efecd035137f2b7c11bfabea3aca60098e16f001870eb54baf3621f4aef1cd40f67941febadd88245a8b0e597b9cb1c146a47be01a4ec8f8e4a263c14da58fa10be63cb344ba4bab69fb2f3873cdf568ffe4d4c926ea0aab891c83245cf44006c5b281694ce653ebfb4df13c9e2f43454bcb9c2229981a12a0055d3cb9446b133f23f75f1c87be7b51b429e11eaf57b85bc27346e1916370a6255cd3a83da9e2e4a643fa003085606ae2a00b9b37fdb20b13efe0c07b472b7483b729d115c1b244408e1258d62ddde38a371cad291f1987101b270959f9fa4352890d6c296a4730594c5cd1d90948cc3e48f833e29d732e65ea3477d494f880636721bb29881f2850a9b88ed5fb57328c2749188c112303692c583c33f417496569219ce84e3cf9860d50a697db161645ca5d151a92c7260e51f22f9c4d7a111e254091092258857aa6c3d0451883a4192586534a7e6dff636ce4bd9e93a3b9b3e04bbb9a5811f17db6dc5996e3104dfd53b6a761255f71c1702f4245dc285b7ebfcad7758fb4e2924a24c554353490fc22929fb9f5a53a2d458611fd7406c835007b273861dabfc11a5bdd51dc816e5dbf405d72b93aa768fec8377d4d9b4356d7926b04f08df6a402f17626399118c799a61b7cbb439e2722c0a031c06794d591ce9e35d6120b73c2c243b85096e90cb521b1ea7438b954967c9916bdd96e25181886e1b14f5576178fa15728460cfb05f158dcefc40fbd782ee9c3ecb7dd4868373d3c79312c2ca0f5a05c03bbe427c412648ee9c7c376a2f4518f569187a2f81bd57fec610ca61b55092fc800f17dc4e39aaaa728bc43b2a431d441f7b1a5e06dd6144036be7440bd3d768c192d4c0d1e8ecc184087d713473b25f92efc598d742737751bdacd42fb2ac0ed01e31417bc6c51d533e6bba95fbe6454511043b0c171b3a34adead0e41bf90eea2165510a79ff34484c626f65e8c077702db89e7a9d18dee251687a098fe68fa8fd3889b679eb077f73783b6a2dec787429941d3b5316e055195b0ef13169048265443283d458fb8e890005b9ac18b269a165502190e64d1b3b795fb6d206382404043a46083cbdae7a1b6eac824252dedb0abc2984665681866270537c9c3d9f22f21e288a94f3ea23420498706e7cb2e85408cf50f0a5b1c94c1b0206f4e88c86812e23a65fff7ca37241ce532460347443f1f50a84cdf76d8c039fe80ee6ad6844170d17c62f0d854e07fa7e86386b59afe0170241574d12f3137501034536662223f5f1829b86607d63f63e5c4504223d5d3e37a6697480b10a3a023dd798c27c5d993e0da7517ae5526763d0d8d6375827a24ba50a2dd0117dc1f2da67bd8346d443aa9897722a5274b0ee150ecff2518bf0d740237772b32323381363f3034cbf3bf70275ec3a6e91c6c6e6d9797db65dc0e2f326ce8be0edd559237c6071474bb80757507a12aa46023e9bdf41f9e9f7e390c979d0e61d75922862fb1ce1cf0071b6e9d0c71b52fdac670d014281c5ad9b41934c4b021043a777f636e69dbc30281e8a89629d0d29fe5ce0d9e4a9531db0c638f3f55c69e2161b44974c3ba8a35be2ead4bc31b0d9a4580589f32b4a4addc8eccb1f5a76b3141298410200c873f01b0a12cc90163e09edaf369fa8d5201d927c88528423810c98d45aaaea647f5732d118c9ebfc9b82b2b3db9e49ac8cf6813be0af6105e5fb6db96d579989dab2b28cbf73d911127b6ce491fad741507998d2dcf01c6f9267769b58edc03390588facefc16aa51c83979c77cfef0bfae2082c4aad31b27ea03ca8b3e1fe94a5fee0b894d36d6a1de489394905e23c43d3a86c7a30c39a7733b4f3abe15e4f52309d218407380c20eead6e5f122a2edff72b54498bbd641bec591f353d6e1c40f30640486b38a738b58ca815922a68c56f376ad60d1c43d4e66397f6c1fd61bdc5869dca8837ababa57d87fc00715a2d935e8f5286057973ba7159d86c6f729cbd7a61a5a3842d705f3dd85b4bf74710492503e2e434971a56b7598470c54493a970123978c5158d9f773ddea2e46053efb82b6d17b1b3a6b85d8da27cec1a9bff62ffab2d7f621282d06e01f6cb00ed7c9133d594e62d8d151da0e7ddf779186292403c2c973434290c67188966d384f4c22934af96c23206b4587f904dd3b5eeac373926ca542c58195528bfe42487e32b401012a6ec6ec9c5074e48ff4f0e5b2f99c64e76b827d0a001657c4994bab39112278c50318fcf95c73d0260de4cd5e20008d0535a878828d0b1da93f504ae88a7bef1ea779942cb4862cec7be69d9e03500cbdd3d190b27414abfdf6ec8ffed1d85b438a81f1020b0343b39234452182eb9a8efb8f117f93145901f4ef655e5c5d396534bbbb320683226e45e25be0bcb32572c9fe3080f91322818af202c4bc1fcf47ac84fe424096bfd2c4d734164f344430ebec47435754d603eb79d8260bf106d3fdd0d06b6ac0ad9eaf2039090d8e2455d0b870519b1a326e8f37069e2b955b18c18e990b2f904e31a37f92ab9313adb97818858f9890de21001876ac980183cb8fd8c3bb05588c9dca9dc6c7a8aec90938c35ce314282b4511e62ef41fcbe38a83617f6373410d4d210ed5024b0dfa551ae3772ff75c36b7d02d8dcc5f0619bb25d6f00d3f236f69571f56dd59d5d5ac746d5b5457e0975227ece7d4c07ff385d9545f4e14f00f8ffaee07a9916808083dafa743d02f9844f0baecec3872d26b09f5ccd44516352ddf399b068b9d28c726ad3dc0f844418d570311ce8c3d7b6d6434c2c90ba4e369d831e314c54fa1770c9bb2f0f852286ed911a8b4552d6eff6e0f3f2b2170f9104ad0a8cbe5f8339a7725fb34ddf9935577781d21f5497121a3b1ba2281663c5474004528aeabd5a07e3ad9f904139298ac11a32a80e966678b0ce876c04785912b5557fa3163d4268473b899af4cbdf8daa056044389e9839ed385ad0c73cb4d74c4a3a6bbbbc84fb0595e669f101ee84d60338e81a2892fd0a304689b28784ee49ca2917f5f5353c51ad638803fd9b6399186c5bca085b08479af5f52d56959fac500170fe5ff29511476811c331a8f84b77a72d713d87d5f427e8ac57ec6af03b7a94db6a855f0f1e4133ca8a662548f39fd3ac9d7292f5bc3b610f44a176ef234e39fdd8999a972f4ec150dfc295bef9ea8590ccd190b88af54cb8da39d1cf810b0597eddecf48d65cde8050016ca3182dd69d887522eece16b516449aec3302f96d14e77964a2ffc2d8ff44346ffa0b00eea0a44e7af5a90025464255b0e1a88a7ef6005fd07db47ae42a44a6ae7aa27dd886a650d7e4921a56a5fd85e75078b80cf2c2b5825993827e7da463ad2bfcfcdb072deaf1c17e921bfb9e56ef55f85fa7d11d52a0b296c92857937d5d5ac2e91a644d954016fcdc5694f54956479d8419c9d097fb80e0fa27b5b4e17965005a082eb33f04685f8125b308a834555983e7c651104f85303b0c5d57fc41de3416546db77a91b29ec525ec44724d315b68996965f3aaef1c999da8a5654a18b87639e1d98320e6dd998282e13f930a71df4c2123b80cc3e6ba0d57dbb9d273ce784e43f39b8eed8906c528fce0ba0c0517fa31a8dd37a1587a766f4a4be41309c432b542e04c975cec5f30572ca3cb7d54895b2368595d528c5ec51301451a04dc332ce908342c86ce03949e1a6d728a19c421f2c5b60239e22b3ffd19b10bc61c3140a8c79a78d6c5e8b5e6d2faf18b6807853fe8a11aad0afd81b330194a5b10249a8aee4293ac0afd4cbcb5103a639003130f48e7c1698c2bb0d23ed5329940cd3eab1751a61a0a3c6fb5ba3c2975a22105f7c5827700d80d9c42e445658d10e3b83dc77651680ae8a161695977adc83064eaec07d2429e01ea29c971ff980e42ffa47d6671636599fe57c618b71a540ff286b91a7591f16b43633703c0652e7ad466a7a8b426190732893790199ab59514c5d35ac3e70457d86963b6d596525fe5e7660138a659eb1fda2fe4a62457ee5a2d78bb419f19527d7ce6596f1e7fb9d6dc5c2b326ccdc705c3bb7f38f64437f5aa6303b861dcf2396bdab5cbccac2596637cdc547fd555311a87f2c1cc5b925f8ee2351883185f73d4f9b49d80e48691a2b315a9504f8102dab1a009a7f0be44a60a83028d8ced0ad695c25ec4dba14a357a351ad5cc01aaf17e7af57196da57a8014c993a8520182e547731f030dec8a06e2e2afd0786abd2caa473550c51c570cddcdbf003438dc27e5c3e259551aa5cb686dc668f30e9b19e1a42b82f341aa722dd8a6f9644b28b0a25c5ebaf1ca3c0d7b31c9f9a728ae327cd3bd3e76057f8f77cd16d57edf8bb413d64c0f44ec79ab871e3d86c2d423d148317c57b5a5bf042468186150b1824611dd925bcd2e920fe56b7e48f4dbd5b38008feeeaac2086f2dea734f6d707a73cd0e627811962040df55f030f4c33ca90d5748786ef0cf55ab4b196335a36946cc5d0c8004da5b86b55d0e7ee0ce2311c8cb6a471cc545c7c3567977ec0fb6ffd055aa803fe6798b418f225b052e94789bbf17c4277372d493f8241be34a1766333c0799fb6517a509b9b713b31a5510d6cd70865b0d591e01def53f5b94166a9c64a9d53905495a186dd035a6d75fd0617558274c1e1e8b68129cca22f7f2d9fcf0c56c8d2a697c54308ce8535327b4c944361f15b8869b32a0ba9ce6fafbc2f592a3a2f06b428f6e3dedbe931a641c90deb952c14c6cfe6ebaa31ca86c12820b4891c270810541138c65204f63d5b3821206a12296617d7a689436f5017827afa2c62a54cd05726c1d3349f1c99d2bbfa9a6a2967059a6af7aa81c7b488d15d5897d53023c24a1ec16a7cf116581588be703f680e2ec078171c64bcf9c1068f1bb2043d1ce831baa1f38cdd784f6fb798a20d3c724674843feae4e936da8b723cc103154f886c291740c266b4573a94e5fdf384e27f1bb270e0fcd27338dc8b7c381642dadf3d9212ae37faa3919d412d8cc37c6509a542ac52ed5b935e3a79f8977354e02196d8526d3fbf33637df27ad8b729d5daa1927bc7d3c951ea453daa425ad6d0b534f5add1a39e6c417f08cba9a37a4e304634c4797fad20f438ce002435395e90157483bd80dfcb4b493f95671cf3e2228ad826c4643ba734acc2d435c78ba9b4dc01dac3d5f634649ccb7124fb2832770d24b364034d9b1125909cb56cc3657a6c97083e6ed98d154765eb124d856af4ce9efca96489385ab74773974a89549d5ee073201edc53e48487bd5d22cb33cbee94af5c9e95b5327b5f6a14babd88839547c64375ca9087f79b5a117d300065d23b8d4a82bd60ff33fc532fb733620b0c22594dbcd99b2210bf92196d2b4abbfaed403f0acb26ff63a8bd50af994a25fa61a233d005ec102c21cc14733655b3a46c337cd2eeffba280e310d306a54a4b29a2afd22dae8a4ad455b3f615cb49aa0f52a5cd026ba8e02f4110e64d31d797e34be10b8e6f3cbec71ae5df44866ee8c94bdb026f87523bdbbbf25f9792ce12affad237a8c5fde7357f1b49d94940948d3173dd5e7bcb30e74d1a53845f11e61c859f94d022d001a6316df130d3dd9786ba78247e534ac469c345695a49bb3871d8d856bf25b08c2d8bb1376701ebb413641693eb66e9102c99931b6497822777e1d10eaba97c5b59cddcb9df21e5c8110267807bcc487a9e8aabb32878902a04184cd7868aec0f5a0c90080332ff1fcf76e7076e26d194fd7065829dadb07aed54aeccb99f2301db7b3a6acb310e95aa18dd8d2311b558e0a45c86aef1660777aea6d506050e89fe9444257fd19c46d68dde7be041220870f4573508f51d958c705424a82e7f4860d7b0cd101538341014446405524e538a0138dc8c8d3bd8e970e3958cee7ddeaa738300061bd0f69a0f7125bb074bbb2d6d5482cc511933ba18f39c2a41fb3002531a2d7275c9ec80b13494b92ec2b0650099261244cf1d3735d52779b881a433290af286c32f5f7f10f2e33e89dc04bc872ffc3c6259907eca1e5735528a26f46ec3f014366a7c296cf8374b7155f894b17ac314faa5b1cba1f1dcee1542a50ab9c645e8f1da7a8c79d3a9b4c64b6233951546699fb372f9cf461eca834a49fd7264fa1df9a14c2a10ff16c0809896e8066e955e6dab62aa34a87f63c6a7a29c7caf8a2306ecb0c8e2f8300aa3b8b36cf16922b1743358a541774c9f6e72adc975a5b596dcdaf0067628c3a9ddfb404ba788b65a0d0ca2aadccf41f6eeb2652577d483e2852d5596c59790e91f0a719f9a024984af3723b3ec51bd529be168416db6e5e90c16eed8e332edb863dedc67c83e3dc52bc939b8e2095bde854a297a8b29c7d4d3c5dc80a18e4541a5f69870fca63b194b245aca623747d806e6d198d634c321497179a3954a954756cf3dd068d8a69736b293e9d56222bb1b1d54e7e3c1c4b862bff919e0caa3c06d3a648fa44ac85b095ad3195a621ac4cd1b7424a8359114e3091cba556f7c42e2574cb0c4dac2192a37957eaad6bc6ce6c3d5b002bcae36fc3bbdeb531460169586be043b1fc1b046e5f995e76171c41f066785de7cd94ccafc7fac2d4b37168756a7424d5ba0bd0d395a830d8c167aa337bb1ce6c517596647cb491c7815d1629a0678176b777cdb656a70e3dcb6bd0daa8416717a5739a3ce88bce31078e28e004a3d016e4cb5be08d0721877addf076442fc5f8d5522941c68772205d4887796060b9a655248e04890790591e310fa329aca5c5aeb96d92abbb4202a38f3135d7e0fc383fe44a29bdcf30f39578e29768b9e81993e6067493008e46a019499d4b03350c48de699d4bb9fa0220cd82e2dba95ee043e77b6a97f559303b0bdbca078a888f3579c2a61d2a43247a5f0e69aa8a3cb9f7361d5febe6f56ecf6c4db43f9055780a8cfb5847ba5384a01789853f7c2d4aea0b7c74cfda4aca4ce931eca8211a89954941614f51c2f60753bcca8d5f92d89281aec293d0863c4833cea05820a59f9fcc027bd1bd029de16421a1d5f89573252103e32e544519ee39059dd20d25cc5b40ba6dcaa7a9136759508976af189758f0a0f34fa80efef0225f80ec93a2bd93051fb4dda136ad853a0ab58a29839aa40d50ea48d4a3fa8a2ea3e1f722ca983dba5e2f1c015e656f7fac3b6c870d3546776b2e90bf647a04e2c20625572c4c0d7ea55b8f7b43ed055777569f94d3ed0142c3792fd8fea36522370ce865819324bbb7435a9531711344c54a128e0cd40832c52a027a32ef35cfbcb0ee3e72fa3e7cbdc4a97e0df469c9fc351e1940946490e136ecc863a5e4bfa7112496212a22e23506e38cc400c8912c320fab1ff8056bee62dc86d01b8e63ebc5cf43ecb88b4e0a3cacd9d813069bc544a2513a53863d60c83cb78b9cec9420d5eadf848d47dedbecbc9dfe59d64e5d3cc6b8fc1733a7db37847987300245e99b98028b0f8bac593357ff294f5990ad02e0d32b0be80363aa991bcfa3eb71b778f8b28c906974e5fa94905dac5ed0ce465be814c4bab82416abed6e835d381454e1c1b378a2e8358350076d49d9096956763eabb513563df535384da0b934c7263bf46ae0d87bedb83e8194ea93711a5807aa4eccd90fdc41f15d520735d08b2641d56c89b0a8b98be9160a0c91a5f83c48fe322e7d6cd95befc620455df1773585aba4f502806d38f685e6ac75001f44caff0cc1871e36963c0941ba58565c1bfe6cbda458a0c834aed55e16f39e2c482dc416c9d3d86c3056a30df67695a4703d1223dc5249a7c5c37a018b0c900079e182491e0d16aab7edc59c287dba5c64ecc0272f04c4b9fcc84ba22f579cf4af898041c183f81487558f78689ea33bff73207f4bb681ffe2bacb1b74917ea3cb4a6e204831f2424f44359c350d5e47aa534f45fbe210ae63854dc31a0824e4bc7034c4cd55b8aeb6170acfc0117c94ef901dca8a58a5d404b8428d6ae88d4c86ed27d1556a14ce5214624fd6c795d9939cfa1fdd22067c47c2049bd1f709f159898d99a209222d1e510a4291b0dd5e508301e28ba4446409434ff1ab76b719d5ca6fa23d1fe2ab332538486186565e480dc9f89ce5c9ef6a32da2826d286b5402a0f5a5ff9f4556cd046f59dd3123623ba3179117af145f72595c58b3ee3016a6a72e8379761f1836939dd25fbad819e49a29b120bb6cf08f6ad872649b2dc2bbe77bd6175e810ff7f82e7495b520d5f8692c282d349b770815e282d06fb2d453d6b302fe9a1c7d59bec36935315c57938377d8c49f08511b10870f0cbd4036188068d810e3b9b116e711d2bef747d40d935716af14fd6b29d11711e5577c8831e5b5471ed8be9484bb0a4e5f6631eaebf2c763412c9ebf5f311e275faf8cf137e8afe86f34dcb7152e724ba3eea8020bb11626f043a1c1371f77c6604f0031a96d35332360b44a1b58544e9e0a96c46427227c08573967834b4afde8e38b3034868b84d6cccf5d5bcb04dcff3d155a92696720f255711c8af1c3a24c6926ffb2708abb242365020312cb921ddd65d8e20159641e1ae7a119d1d0dffc4f09846342ce24fafaa872ca0caef33b3f199091798462299e64a180a9df71cf7aa3eb695d17ff875b1e662f9917de52d617aa7d44710d57d813955bd568e60d6d32bcdf94e221ed33f62e8e12fec068daef4f7427f554a7f6d7abf20868aefb134d62820225436c86f4dff9d08cac17bb57db14d0e40169ee95d16132efece25655a65927d9c8bae353d7beafd71dee32cbd5d77d9a5de8f63ffc33114756b5cf69f1e0ead227ee3aa26b2c7524475e9097b6a6e277a44fbbc984dfea8c81ac0c6a463e19c322ceb814d37211d9fd4affeef4df6a3d505bd8fe9638614f799287690982521c9914c7526df676495d09350e481095d469642612ae7974f6314e071dde90d6cf73f7acc0a44aa7894ea4b78e9737fb803482b30c39b00dd6390e83f0e716c9dd1b9b7c1d59d65e92735b2d3c5a22696aedcd66035c8b8971ad5b635617e246fb2a5a4c4823b6792781bbc52ead826c469bbe785dba67e68dc4189085741995774bd24f004fcc206545d93ef39f8d15c1157a8a828d9ff11726f00764085ba16902b1111b6df628855174a773c93fd67c06f32306b9d6fdef6c305a0edbf39a41177b9550b49aeaab2d27c47a9ec63765c1282a772fd7f7b044d365d03e2852efba582a6954a14502bc38b333f2be3151cf5a8a7fa5930ddfc07685115dbd94613cb5d07ef7ebb4754bff6dfc5aefdb41fb595d86f4ee0feed635519b9b924e480bd251298f6b4990fd2057189deb6b8d3be7727711d733b2a35354d4dfba3d6834f49f4e6809784a4dff1864152b0ba3460af9d8c2095cc5101b86224cca15beeb833b82f04bef3a95dbb02aa21daa043d3ff90ba807320bc88331b3b610952416b6d1e9f4600a5127304b6a7c33c34f17d01a16b785ab63f4a4844242b410812854870b04f48156685bd0df8ad1804806c4f6702c6a2d40b2a6562a04786c85d2d769b15edab7ba9bb03ae4d5487ed2d7778a8f93a09ff357924ab9814c47262a598a6763fb4f0a53e6f4863ce7e791dcc89c5320e554db6a54a5618a4d8099656729ccc9c6a6184eabd6f393c8c40b7f88c03606a91ce5de290ea3983a6ea568fad55439d5af5089d64e5a18eb53ad41358292af3412e0861df1fa220704d7cbcb483347b4820f85606bd158be65d2c84130e8a3a6d3df87b60aefd208a9eb258066a4153b3014cbb6cb4a0ab7b281b379eaeee78973b79b3b88e8d9f063093322127a1fcf9110eb3842d1f4a289503c736623a1fc8d5d93808e85d9852a9709a060f6ff88bc0937b970934b8282e9cafce44a9e35c5499dc8ad888413ed4cb7f252abdcc68b1b2eeab1bd32e0b65a3fadacaf62bf41e77380536d4e3fe207dd14f2074e1723721c48be644c5c87bc40027813c12625e2fcf3ec009477ed79159f7503fb91df1a09dce125520306e17bd77e6de461ba964a7424cf4853fe511312d9205a32c7d715c8d1d71727ad9bd21c07435f0a71a017c29b61009bc9419831089ce3b0cb68afe7ef1965bae3b145ded5056984601cc3182bd16a54a035368381822346bb71482e5893342648690124219328804765f41127f8acca81650cd33477f28f1ea990e7156f853d75ab85419c4832526898f7b631d3904b2f4c7603790100246513e26bb71215ed8675985ce4a1c62342da192bedb133b4f6937aeb27a9e202a4373e8c96199eec9b50fe0ba7c18c1242c0ec8a569711a22701fad8ece18b58f06c890fcb29529e9cb249937ce729864fe1ceb5d6e54793e5a16128babd35fda3036f5d21bd0d74645e729d3d38fc22bc8ff158db4fcb73658f3deae0466e3f7e557e7d04fa354856d22e808812d1fbc38240947322ae4a5126c8138299cc520036e11d0f4de8db3df1093d8823354bc68e40ab6b9fcee3197717e8a9650518950fd62fca7d275d6c747fac16e1f858344e8af50c084549d8cedc5e00ef6875c7b34a17ca30f32d32b6cbd4a9a5828983fc61fa2d9bfcfe9696ddda70c4c2cf3fc387cef02397e6a78f192aa57b4369d7c2ae24e4aac37d76abc1c4caeac53ce390acdccffb9ae61b3198dc9ee5c628fc22a051701cd9eb4130f339171f1c05e7a94cc6d68b45d4ca9ac2ddd7fafbad206849ca2cb9cd802f72acb426b524953a6338fca2f928b0d6e3e7a26b48186df92681d648d7447c47bb5e0031fb841e537f963832481122af564a4f76c0038a903cbc08b2ab169627cda2545353d3348cfc7d15cdb050ea9cbdff76cd557a1c710ca54741a78f9b07ee0f873c2eed171193f625385853f36574bc5b4a2ad513d6775ac25c1c251d10ba0393430aa2b68091d24e227005d04e88eb7d4183016bdeb26605c9c9e0514bdafd7d69c950ee23d0a490709d45f6c7f61132058133c4aa024cf554083a38eb185bf9973e43aca41c5691755fa5cf11fde912fd9b251e6c7c5a43a1b5d1bf98e3485428849f441b5924410fdee859d297a0b36bd0d8519e479b7f31494d155901890b4b4549517c19b56a2704fc0fba5fbd13af0c855952a31c4beaad465cc7a00bdaa74ee2fa9fd042a687adb6ea92861ff4e59b1b4acfa78bac4164e61c8d1d19bea06f9302e84423e7292832702413e4388bac32feff821627ac2692509e8ee65e45faa797d155b09f8971b1b13edc5d6dec1705c1a425b44d3e2fa54fccbebfb5b7dc643503469e2adc96534e73959186141490a61f1f3bd13ece32419ce16331f2ded1c1ec7511f8f21100049661c93177c08167d48b65404d748504ba8e4e1c543133e6ba733e1b1bc1face2e12e0a47b094976a25af43e3f349301056d9e1fbbb0437a5dea2f28e8b07b47f3e6e064f61e04dcac6ab49035c40dfc1ec1dfcc3734dbaef1e82ff0fba95be75a8516cc22f1e7a89369ab32acda7168d31fb0e4a90d5e4af7a969e2d8fd5b712dcc3589486ae2e9852eb3b237adaa02ba583c38c7a865486b57325e182735a7c0a65a17b4814c42f2d0a79058fb7fa2f7e09526212b9b7459e625577c0e4d9c5cb4f64a60e5d056401e9e14cd330982cdad5f351a2d29899a73b1f8b4cc6e39d30dccb58a41d2d0672bb9ef0cc6b3bc38b198d3ec4fe671cba84796e0cff30c8562002714361c472b6b581c7d9c7acdc3426754a2a43762368f91c5e769b8e38558012d8a224171dd40a3b40cf0d963b06d1a8177021a8584543ba8029a14a39f648c95ddc59b13a95d27769043d78d2d5947a1cb0f46763ec0668f521726b7d2adb5b6644e14695a7f11bd0e1382d77c4498b169b28fae4fa14ea3a990ca397c65f5e959a0433d0f6a22522f603f96839d11b58a0405b90e1ae0532ca0e63db0e61b9af2e15900f0f6c4845358ad8dcf56534d12e2a0bd2258dcb83e4bc8e441a349aaa901ad9fc9282ba18fd289670cfa4bb326361a61f4d078cdf5ccf8d170c01e52832953a8a0c2a224db56d2a2428af55a25762b0490a6be5847b7be49f88e11512a62100b14b70f8644e014d6a4fab46615a88aaecee7ab29c61b118c5864b28ca9d844d85857bb25d595b06035ad5ccafd8641f583fbe6bdd91dbb7b4837044331b3f27f0a3b50b53bb74dfb7b18a38f1f65ed0bcafe7ed25dec7950927aecc1c268560a3f70863b4443b041820cfb236af40952f0fd7eca41641e6ad859f2badf2d13870654702270ec9b291cf615e3687880f73ef2abf1c46d193a970b0a15bad81d0a05831cc1b1495b533b3029d4521fc399a16b9a35ae92578473242ee0df9054f17070b45414c0e1bd2fcd77ac700f10a82aa9b7eaef9b0100f3137f43ef60e52d342f31cb3c0e9b51a5015a295cca355f158dbad766ee62938cde63f73230d888dff6d19bc48c780eeac17ad5082987cd74e24290b1b4c1d400f6a0f1bfd39be590d80b719a2c637785789f2f7321d8e87635e63fe46d773ad961554276932bc2bfd1c24a2a0ae52da0660801ed24df8af187be53799173d3872af583d37a6cd577a6e3c3b97872efd05080a162b9836fd32461f8bb9a38f0c4428a3bfffb3362247f98cf35919f73932900f074126f1935282b0d53ffc54f56ae7f9eff68d8b80fbeca9d9fcaa6f88c1f8c6ce3a26b94a8101944361667346b8917cf96ca412e35a2b1a2a4c756e60813098291a97b2aeec25ef3bff377d747a97fb28ed68950a65b312bd3fdd2eda2d09c12a04d7a01ce70edc5c08eaa8ef6136651d63f83a923a8a05b92e21773aa765f07a9d43a1bc4acd1ce5b3d759feeb6175716678f69ef1edd2a7de8128bce715601d798e77400957e01e97dba187572fbf1a8e784175057b39c1fef9b02c6817c847e015ef4d468327e5c2614460f91a112f4d1a0f218bfe240c693616d7b0732529ac17f0682ebb8eb12bd105db8766462f805c22e992c050091de41c92c5aefc90fa0809699c81ec992b3b6a1e7270c4ae6a0f6277c8076db203b998f7b3b5587d910c7c853ef7061b6ca8b8197386053602e9c0e4a4ac00b261fb0ddb5fe0b9cc800d005e4d76858003556d98f81d90cf464f5f0584f43e839ead7644b65a81675e322868d4da5baa9cd64876886de1c874901e09c23f2608c33a4c4181f6493a57f26de92a201c4603b25a70a4de0b0149368fb6b770c599ccf5edf0f5ef04b3e011967b61bc8f51ea4f6fb8fb68b4af0770644486527d7790c572fabd11320607fb35202dd09187ee7fa8129d3051b56c696ead4ff5d64e848105a0b7bc425e90b787a6f40b0a6f215a3ae95bc3f0e7383df42142b3b15299cd20029c3bf1cc769dfdfd1dcbb732c40109eca68cb7700172cec111319f0f66241855db0764af6c9af856dc1a1fbed22b756fb55f017d0bd79dba4997bce9264fa3ee5212b4b77450bc94c53f8fe0abb70a010bedf293ed7381a333a3687dd26b4736748a9c5b6fe69b8fb9e645f8d5a5919493b7a34fdcc081e0ffbb35377f3b6e74e0ad68528492d305d3f0f24522e44334eafb32cce9ceb988c8a3d9db4eb2ee511184f926b3b9428a51a370f7104f7ac58ec38ffb46bde83d50195e13135b7194a8b29a1b3da1f74e48419a0b8a4810e230baebbc965c5948c3e1127ba997f974d5ae20c1945fe282f4a0a10538d11005f06067d2d8644044b2a61e9818e28600ce361675f6b1097f9b0159a92d3f9ce12ae0e8989e2ab57ac86065e4be511d9ed41f23c2c06c8008578ae6f3fc6a958d36733bdf74dda28916b6adb30ffe8dd15d578da42b0e251062155f05bc8fecfa81d46c6c56e929ff44dcd298a15c2f74e508588e38a4371c00da618009def46c946438822ef8aef3cd36351b8d5f90e9bc1117469367478a67dd1217f6e86dc52a3eb01f7e2875c21ccd6d9f90f834e3bcbb39e6c109d535a85b0c537ebd114bc5e15bdaca371e0fe206279118158288d2f5caecd807cb31fc5dab7722120aae6fca0e75ad3af03a0cbdc1824a2e6927e8271a53ef35c2d97beee49d8055e7e59e5ca3b2f49d4eda9f63fc4bc1cae850fb16543db74551eaf0b78e9972cb013b1da013fb842afe9b710939658c20090157b452036fc8bebd4c3d5803f91ee6602d1ad3d2a124f6bc9fd5b750e9e1b7cf7247548355ce419f43cbba0e4cf8a0b3e33af20c5a0f96f0436025c0b968e3f97a07b73b165231461e34f3d256a1ec814c31d75b821b1c785eb428ab62cda309da2001ddd26129cad5c2fc3ea6fb022a6789302af472c9e065ea9b7f95d8ebd25e9d5afa31328b19daeb198cf35b021053bde0eebbd866ee9558e8e13443c8eca57145d2b37d61ccb773982c072d082d91b6601f1d6595625b6ed2c43c7fcadc138dfbcc3bd1c6a6ab9353755b8994f17cf9f790c42f624e1631234bc542f55cbedb4f3163ada4c1510a25a52be48512bd4a761448869470e3c35032345532a8ab6667332865f501cc7e1f98516038a36b8b74d24f3cf0f8a3d0843cdf602d16d8598abcc6d65ea767db03c06136d540664b512a093be1650bac8079cf50ede7dfc7dc8a62bfe6d79d359a2b30d7cc67e810943b0199f556faf15f09475c42395e7d59baf4eb34d9fb01850ba2443ab7502349c48db7b9547e0c922e4785911e2a26d018910d1c2a82f8dbfe3e39ec66f6cc2df9a564aa38d7dad6ff407d475930512e320be5cd256150930a55a992b6d931d8aa33320a62106b914144c429020c7821e9cdf608deabc053719aa1dc4e9b681c1b29ca1e99e3710625aabe1d3e4f6253bee1cd5fd120e7dc81bb88eca2aee212e8538d54468a30f94f9c323d5d7caf584a6834294609d51994fd4573524127014bc034a606c6d4df382fa298537f2f679a8b492a5c1c0ccece8ec1fc4a056da97b1fec36f038f7680417c65b442358ee1b86c11bd37711abfd015250326e193b30699e526b00418f849a41ab4a4bc7a98bb19da3af7ff3e85c428d71baa050942ebfdc99ad00c9386b84095857cc58ca1eebc51426e1a6dc4d26b9b09903cfecb9b8c8e2385f6a3e3e5e4d827d213012bf5d05eae75a09bd09625ffc8ee3728cc8a33806d41a4b872fb7a2c79784113a01ec1ca70b64ceeec0a3370134ad8392a645454834ef82e2fe435a74c2d3127bd17be1403a6488c0c6ff41f44e728a0d485c93446b039ef89b079724346be7b321b19f1975d30c7bd4252906d5d7bf52166b926a784c8c48da91263fc51c0f59ba88523d299e7b37af6118035e5193600eeb6e5e3a8d02cadbc86c5df4f5b784515b3b5fc0d38b2c492257bac09aa949d9de22e368326f3139b969895b1cf020610084c0343be00b25c4ef6ed769819a89bf08f6836dd11aeda02d06921c98ecb5236506395568444e4a53f54ed428d30432c731ca14395ae4d49f10019ab38a0996a4500c92c4ea0b421f0b0e4b60b05f3c59f2997352d4440a1c2501840e67c709bbcb535fe5b326075cfe3ecabffe1520262e1747052377ac9a418473d9246ffc8a48cb16779ee65b77fe11b7bea9efbdb994c8e97a459446e9eb46b0f37022069cc598edc08808055d88c8de29396758b0ebeba85805e8498a6de822e89a22d2f6454cad5d8336d700ae9fa49c29e105e1808e6e64710a7d104d9912f01b0b0762970691c14b61210c3d714344030bb5190a83892452b090b509d691dfea5a42aa60d53bfbceeb8551328108de94a9da582874a66ae957928a6c2716a62a7ea3bcd473ce3360bafca9e320b1be811960beb6627ad425f05392be834a40c5b045fef314fbef86da60adf3194dced0b85bf8be7d11af6c8afb52e29ea3cacf49285078db386a7ca553bcfacb50d5e20bf2ae4afbd922a3aa6051db9a3c8176f9003ad0670e9715e660325c1b0351b099fcae12ec6849ab3607bfac6261693cf238bf074a26972f01e6a02412fcebc06112c39d6a440c05ae5f8142625780a21885ca1752ca0bb574add0c5d504a0ad5bf33710ff31ee3a780e2128328345d886aaffd4421bcc1e220eb2ecb1464643961638582367beb4b49308c0886584d7c1205cce2cdf50292e0213588a805288b8a365fdb90d1d025556233baf1c125f2989608acb248980f94217b2fd2f210a9c88c65b206bcc1699302a82098e06b344a956d1070e821b4bf1dcc51e606075f4d94bb12c5549647373ef76f42ca9b98a0d7189f6b222ecb6e2e457978e6ae8e4653e98e2a7067e22124a2c466a0675ab458ee8da86809ee82d9e0fb9757ac4bfd04240baf3dc90950dbbf2e7ef57c17d57ff5068002d07f339a43d898b8e1706250defc3f9d29959a1396fbbed24da74b6980d70e0e06beb6c52291339378c967eb8a7c5e8081c1ef2d0c721041df4115045594fa470b88fe40c9460c28f4eec38b7c8de1641eadd95892d82e933317d07c2d588229003398f5e24869f965706420c6fac87cb116497e5b02b68d0072a247b112cfc8f076432b7c7de2165c0c3a13c6a5bbd35ef0501c817f1d8662e551e0b67ee56f4f4754cec58a1fb17e6912701c646c7af9076f3f4208e4b0ac2a9b7c1a0caa2f85845272a32974b89d0076893c81d61108a880b4e1a0296aaf0dd4c11d4d40ad1936c4190664c2254139e1857bfe98fdaaf5a7746f91ea6f99ea77a827a3349bb0438c70ab4b6e350127acf3a388c85051f404a556500cc05d4faf404c9cda53108c50b69ff734413b9a9d05944898d3b78c6f80b7a074faf518cb1d17332e28d6191955219627a822db18894c7f8866ed45c7e337ccc88c54d601ba85b45a3bc27de75966a6bfaa9f266aca24c2d60562934af5de5f874adf04ba047097fb9e4a309c68587339bbc184019f9e916ee18938770a9b32ba54675a9c6388a07fa123f9727ad6a719d290065885782bd30f255c64443a536d98841d3e605c4cc3d5a4668a0b295011a115ed95ed9cb78a6d4c7078199d2750fb576b214a0811916400e99751e6f9bf47d4aaea6313a1539840d2e5ffbcb5e633199dec669d1dbbfde0469912c3849046e471b2a7f3bba495b6875b261107114c837d5df850acf1c8f550fa20fb3f0a640d217dbc4604052fd866cfb22c4cdef594645af882a03c59be0280cbf7f5c9a0bef67ff512c96aa5843d7186cb2747461c3f47a92e9da144535a7f52992410ec20a299078f13d0acb73ebb38887d7349762c5c45a214b78d53ed64bff31fd5eb182a84c40072a62e699e5cedc55742391360ef452fa27c864f52546cef6e5e1d12c24226de034a5aac8d5ffdcc350fd139bf41eae88158931975c399410ac5884ae08cbce89ce1f6d63d5814aa3eeb229e813ac241ff8468947f8a5b51efa244779582c33a55f7cc8a62f64bcc5d166a912714a4f98c414a4b15935808260aaae8618a6342bb4579d65d2f57fcb222bdd1f4c3b6d57011ec6a1fd16dec35824cdac3c1e5b0022505558b1ecd46a20759896931b561665f18794e77d96edd2b54b85ac9dcb46a472d684454223748372a16ca3392432c8eaa3095e3c2b9fc34c97ccb1411306b3405cd27403bd2cb185f7bdf534e1cdefb00a9ac5b68955bae9d2a916dc1ab229362b72fccd5c728a5040b1b12b96c9e2bb2e15a141f15d2cf204fefac18b811b773eee87276a9724ae4f7b49a54ba163d3150b4ba0129fe33971df9df2b0d3a41af8a421c3593dffc5bb752856851ab73f34ff94d5b36ed0920da20a6a6db86cbffa35cb86b412f1e566ba9d3ade170dd63435fc57faa686b75804b726148bef061a76279fecd92df40c66326762e29ea5434d7e293073791f4ec156123abc0da1f94c869ab52c82bc18763b1a45635a37ac894ca1d21d32c3d84ede85a54d259b3be7f5f2356968bb45e98e1af3e836c67aec54602e28c543fe9189c0061441e374e9f40a6bdcbf745807cb05aff83810e1d3aa09c56b99a655993cc3a4dda27dc240ede393af6b02f7e5f73020401f7af468fd1b356a62dfe03a2e49f07800f37a0bbe584a1687c22d5ab8f1b3c7f88a0332653654a7216f3d109d7eea685940cfca91248c4bd26f00f73f1bf9fa8c6c564d91be6e7ec4ed31734dbbd33ec34391e6e43706f303712c1f404ebfa5a6d52fddf87f68fa748e06546878406aa1f3f1602fab3cfc44e23e37c4b6a289ff88aa3b30e5aea25edf071c79e14e02aed57092b24a727fe19eb688bb3bc86182c44c8278a8060a943802bb3ef97051654ecf300028c2079a8d897dce43631051a08fb22b75df1905ab2e8e41f074582ebcac4f199b977aa55f68881452b7275835ab3c473dbcd3948d68581e5322a6e3bba5a15fe28c3ccc23c2fdbdcffeac12aa0b0b3fd41f081bb25ba248877eb09f6e32c02175411d2d91ad1aafeb51b7c6307c4182dba94cbb2f95f01c51deab7f95463e9fb32fc455daebd448328e135b2665136b1337622b79fca195fa5c5c4bc46263c7cf3247fe641cd745c2f7f148a95abbef284d84e276a4d904f1fccb262d9aad06fdf3b9ca41a10812693098200c10caf183b83047be8581ca6d276118bafcbdfb6e4282d609c59ed62e4f3bdb789dd2affb01691dc95068cc1223fe79f4129d70e49827c31cd9c7b336a995a1f37cc6d09b190d4551bc1aa84548010f0823f5fe22cca31740434590d249847299cd6f68c3aa43dede39532aaa4b8cdad597d77e8e3333882dd409f68443dbfd587773ec034ce7128b0a198246c3e0d8245cd29bf62907321f2223eeebec95bb7f48b80257ad6caa9f3386e2355161a4cd9199565a5cc0ab525ce206efbd73cb28fe7bf3b0f701b97e4e3cf349a35b315c32468e0eec90397c539d4ba001244f1886d03f411f226ac3a68d08096a22f67117040e637d09711021a8372ca74c2310aa27f8325d0bf8129f1fe8df37b876487808a8d6e56c1866ef5b73ef46511b5f2580ec85976efd74f9aa1398e2fa0f880e261c85ce6a504859b85ab6aee3edb7e3d812aa0595124e175b29f8dceaaf44ed92e537f8accd1b8103cbcf9b3c3f872b2e91ea1b23015be11850617b644f2af4f883c0768cbb8f073fe1024bb5cceed87367d468b0bfbc320014923b486b7b3a0fbf1a2938c9927abcee4288c568ec429b676d83a0bbe6fdbd7eaa23703a3b84be34b7142d2bbeaa447221775b73089ea7905428430ab9894830fce8a0ef69b357764e7586be0f1287827ead8a3b09c1db67435658cf7b71f174fa28783f366f49d02371cd6c5ffba0449a307a6cac97ad7bcf1e805846da6df37a3166f2cdabb1f3e204a8a9a95d6ca44f45a4033a5bd429dab381c3d5b386192ee0104939aa9aa1e9853f85951f1ffe63f474d69ff6f1e8039622a9c3433e0b7ebbad89b0718df2c885efd02b156d8651d6a02abe586d2896e18710eeb3a5aac4c6a87f5bdfafaf520c0eb600e3e51d013d2c3a166263945f3843826f067ab095d27560aca7601bef3003eea1185bbaa0e628e2d36f4f5afb08cf1af634154097a5aef3206c107e18ec5c0e5c94604b243b21fb09615d52ff054fe07ed8fa91421af02cb815a8dc9572331090618a5963bdcbb912d785e9d2d9d544ceeb84b5d9c29c71502bcd92f701d285f8950b0a3f1b3cfde1e6f5872b3d44372f9b037a2ec7080b17267ac5e4694aca9a909a9aac29f90ae8689e5c96dd0ea9bba0f51ffc83cbf72cab9ab7331e86e06eef07f1d066e89013eade3da3d72392a7aeaa8aa84289752ee8353e17d6b0faa3b479f883f1c977f7bd24fe330f75bb67a672450724b8591acd5672cb4b6c04f5cb24226dc673b2288d0d4df77d93ae4a3c930b857e6f751dcfbfd80badac0caa4cda0d5da68c906a1412157f3efe08f8e3b82e9284681b3bbd6a9ccac737e831b95da8572c20005e50725bc520493ecf40d4415479a3dfbd98b9d892241677a9ccdba1e0a11583e1e96468016e681486c16f8832a87ae30e43ba13fb4c92fe54b24955a3155e23bba63ba23275b6ec3ae46f232632ccbd56cec7c54ad3ff882742e4494f3d29b7db296de4d087f8b51aff48b5b345a65be5d81e70729b60bf830b01bc59ed22f2971614c8632441c077e8908a596833c0f62ecd5e1777269890625b69d3304002befb5f8d822a520c453e2af0ad0546843883887b39ab1a904914d347d5b917e141a4cc566cebced5b212094e886f18674174a7e1ef7b2ca8bf2c3ff6782f342e204e383e3219a6e776f0f33bc3d086c40a06b1d0d411b39828606f6b2fbc9831bac6d8cd9c850847a3bf133c4caf42f46474f58f26f9cfc49139259fcc9130e5144bdefc1b3f754dd14153d79851c3bf5e39e99468bd766233785736dec7f3e66ff002e59ad24091afe4ea26b91d91330048eb7fda5136a9f62f684ee5ea76c836d23111964b7455420a51563009d939121d5511fd4da588c3b6384f2f694d134e6449c24a56827947346f5f8733454d9c1821cedf144e43655df91d1366a7f30ad129ffc04edab3a8a5c40a14088e3be70b83e070b20b7d9f5f9d97d642e5b1446ea19bedb30fd54d7b949d2acf1d432dc92faac1f165dfd097a130e00765cdb453b87fcac047d6f6baa4ee74097cae1ace665e5286744c0bde3daee2f13658177a6ed81c7a1be6f19f3ee1d1c8518911c8f37d80dd7f78cfc4d3837a4f091c35cb8a27a7f889a882b11e6983064dc2652d464a806aa3b9fa9163b322d9e79b073f710f0a24960f28044144b9665143c9273a2f5fe5cb7d60123a804635d5d89712179b5ee9c1f45a8d7f168ad7c5c2b88d3fe4c0220c97f4a29c258d6fc930d0dac3997324949a0d286396baf35a88067c16986c06963ed656e6d4fb73f612da39dc2bf6701cbdbab8d5a65725419aa2b0fd28d875845375d8225c012f95722aa97bbf16a6820decb2731ab035d4a8e438e737ad42b7f7f70c34325021211b3c5916064f9c88fc345adc65e2ab2bfbe5a41416d76371348b258b414ee177100c3aad2276046f395f6526a5659a849da4b75b5388e8438b16ee0f778ed3f22c6e452b23bb4e8f4812ca8013e311fcbdad63e904262241160090a465eea660a11090fc46d3da545ba3dc5f289c22a0c6d7e823eda2223e5c4eced88b2c228bb74a063c27850827cbd713d8b9526916f94a9b50ed50c5e4a5c1220ab3a465b2370956c65055cd8df44da833737751059eea96843e9c9de78f1c13246bdb79c8da9257fe8a1d0a8080a203d8d706c30aa99e8657b9e6de70417d0a25e14f21dc481dcc088603d0e1ecde16dd3e500f9551a69c2fc8591ba66e816b942fb47562affae7e3358cba306a190d4e4caaae081f5410f4f3f96d0a095b9748090210875324211319199655519329485d82ef110aa4dca90d71ca2062446a0589eb4056f92aa2c25cf87c8c0af8aaa74744ddaf812567884812fd066d417d8821cdb2f3f6c5c508259b0dfb50a82f31ead8e425d9a23c787dadd9c70590aa396029291c10d79949a24255a8c132e4a7c2a8b86eb2bf9ebf1d89cbef4c79c39d2652051d895f451c6b2a3b3c9883019590f21f252816188756cfe95ee39c5b691b53926f91559c1c588f49b482a5613727a09f0751abbcd01ea1e152b839c559cc2f5ef537c8083ae8df6946eee299487a151796c9b7b9e7ff7466ed4ed299a1384487d9caf15113d898d426d48cbd4377216019cd6c3d1433758dc3b53992e2b4ad951004b08b5241b1fa78793df9bc899f96056b1937a0083990f2eb2509d701dc1e4e6e9083556706043416a8a4a5cfbdd468230b8a73c8f7aafd4f83089ac2d149594b7427e931273d368a99f284375db62868de654f33bbadde6af7ecb4491e04cb0b1d3d53130f588fd6729d2f57b354bcebdc0e318fa21e9549611958458432b69c8660ecfe110ee0c8e4f3ba68175514d8ed9a2a7ecfc7fab67f730bc66a1e064e2e541c8d151e22261c8c245e5495b1dcaeb9e31a3035ab3db3e7ac16b525fa408df93780e8d8b4349d24fc95dec93bd2160c848c03da156e6f5b2050b2e21c596c4f9e7737defff5f71e152299939e2944a9b7f6f5af4fbc7b4dac5d6b73e2458713e7354c8e84dfa61603e72024846382d5d55f8c48889f8ba2135dcd2d7468982e62714cda167063571555b08934dbdd5bca9464e606e506e406a57b22555df3b4e6e9a7b5141f017e81c948a3e6c6d3772ede3f58ebda8a24037f61ada7d653eba9a72e2a2bc5ce6c1437931cc9cd2337bd04a2706a53eba9f5b6b45a9376ad73d76a8e7bafa79e76e90d8f9142c3c3e6efbd156cbedea75ac1deebb5706fd78b216badbddd7cb878f0b8ddea2b85abafdaefd5b101398cf6cd851ca75d4e1c2f7150892591fa6f58dc4cea288d742b653ab491c0be61e9ce8bc283c707b5d55ff0b8dd3e77c37daa4ebaddd03af371f35cce034442b225d9b6c8314d64e0a20c1a94a22946605810451145174bc8f0423773ebc1511942460841c12106e708463838629b2105375871c3d9809bc788baf28f01e84415a4bee1d2db4dc8756fb2ae2008822038546a10c49824ff4dd34716b8ba0982dff7a5d296a497ac2d95ba4b25d00897390f48d6765da73251cdb75333b27f6d5bd3e04af72d211fed4a1ea2994a44e00ecd0ed168a994d775de4ead57d494c488884aa854ecd49a2b3c47472e13c18a1d09bf0dd867eacbf611186ca8be52f54554246385f5f1b12a1f9e28b07d127adcf46a61305823a93513a8ad4e5257b518d80c1938c84dbf91a2e5464667be1fb6c328150b2a94c85655420c604fca1b5273301792d22c16cb3b25753b0e08900ba4c71378092ab4f0e19de72dc05aab42c7001516505fde933378c2078e03de111dd434bcaefbbecea4f14154320a6ba80f023993fafa6fb2eaab53aa7ada18159216ba8dd308f52e8067cc3b0e553d4314997a1caa3e6d916ac7e350f949d6d38aa24da9647a52558a1067aa9441214584ec89f1d6a8020a0bcea098520685182238828ab8f4e034f23ea8c829c96954fa225f92284e234f4cc1bbf158118186423d213f4625049ee48b6237628c1fbb60ec823f26e65d609da92731a942d51e1e1393fd532a7f113da1543f37d2ac060b54357bf7d780656ec4a84c1caa6a572bd8f1077e144675a346f0ac05552a81d12e3aca28ce387ec7ff876fc2297dee4cbebfcb6ceb8696fa1a5fc7cb80ff398e37f335009ffa1c8f42cccf9444663ee67394448c7a663ee689e4f8d4d7136d5a93ecffaa79c7fbef08800a009d46c58f3a0c2f3033aa8601d995100fa2e6b493b6c141cdf100ea5117028d8e54dd509176e5a47354d5c61f951305aeb9e6d4c73c8ed22802f5bcf145f834bef84518973a72832814ea511885c2a8f1070a852a31aeaf53fe2e2273d49a3ea944d83181a7c727851f1580044915158d465e1cc6890a6dc2bde2097e76a612f8796157962b1730dab119aca502cce50876baf7594095aadb71b3493beb588cc8fa77e4f2f5554960817dc32b969e6a85b66dbfcf7ef77e0de22e8c46aae483a0d7ba47471e71a20873d8a303ecdfdc3f3dd43b2688e0e6f5ac2908190f32996c48f681eefe7df78ae20e1cb0f8a2eae6f01377e0806f46674a32597d19a0be5e72e9bdd6bdf2b7387ceb4bc311c269a9f4e28b256a24974a2f7253c7096c672b5bf258995d0d8151cf653ff25a1037ada838a62c2a4e78a5b63c57eb1c4b6493d4726010d572b6c5b226b072392a442553580a4d39229bc4c2886c6c8955627ad42a2941a9381f121507069d6395d06a4d1cd56c8bc702197dc63ea94daa29445d29e91c2bb349ce8585627db04a6ccdb75898e73c77df8f70c0f6080465a4278aa2288a2ff6506bac0fbdf24f02e702cb021f44261aa7ca7a2093b02cc868f9849579cda920e30bd702751755a8ec4474ceed627c7f37aa2f512613cbcb8568c5e63537b30419e2a6cac7c43281c5a2c2536b589ec903046765324f2636a9c55111dded7996a70624013fa1762f9247466bcd6dadf180e00df6913d67cb0b1e350ed0d25856d7e170f138dd7fb69d108b659aff2489deefcf19a82d13008581ab5d390a822098419d4f092bb33c0c89f5efbd7508dbf737651e5def29051de0995413fc2f2b63073e94827921dfe504645ba91206045f30469527f8b9830c0cda55cd99000888f7aec2bd201886e11886a3188661e872d3879b3a2200896e92a1d6a698919e456a0f5e88e282992b6791540bceaf9cf11efe2800dc6de31b606ae673541b7f9917f0871bc1b3d6eb3cafb3647a535f9e3dbdf1973c76efb523d5c60a26a1da78de08817e9d2bb05591b955ae25014e60b4d21cd07d2a0716dcba5de16188140071b329b106113f5c01620c2b5aa0602a5100228d40616206453ce8228d2ec440411b66305922871c3c1922cdf5d7436df9949496d2525a4aebb4745aa76dcbb7da751d6ba4c1d66aab4fc9a07ff5d7f15b83d8f722b5df3b8e30d439293d7a875ae6a4be4e9d7363d93f33299265571fb97c6e2ed739d9f71d68cbd2a757fee087d7bbdebd4f42cdb7ac000df07b57f57d7d6232954066ce73cb808e7233da51d2e974818a81aa81ead339bda46ddc8c2540b66f967c20f82de99bcc7a1d50cb723224a054d3615057de496429fcf8f4912dd7b23128a8368eebde9604204046bb763faf4b3b546bfc7930c13d546b1c0a1230a82d97758ed38c5cd64dd03c0dc31b23fbdfb6ddf67e59da868a8343c5b1df7299d3dca849f692088d6a9a514d57a3ae1cd73616c6032fc36dcc4ad79a88a2d4a935fe34db5dd7f7de94e31c3783c1a14d5f357db5b5fe5579b6a1c964baa0c95ad6141d45e0fb6875d1dc5d1635bfbc3edcbc71ddfb82aefbfc77766898c9400cd35a23969eca4c21f0bd9edad6c880301d93445c5a5f27cb243b93fae2a1b6cc5ef9832526a865623d3585c0f777b081db9a3dd41a1fb28c74018a05b4204280c00003b14c98f4936e22445d79cb92a030a9b916cf792af3d432b14c401004471b2a58c1b2877002ebba6ec6be0dd87a75e6eb7983dbb09bde2ecb4d7135e08ec5c858785566e7e8ee57c666b88e7bdd3f526baeb5626db6069303461de63087592d2a76241e50d402db47c5eca7da0aadef7ed3dbefbae28400ecb62a1ef72989b0f3a39260829408b40d4fcdf6783e3cdfddcd532b95e1855b7bea1d962bf4ce08cc852b2b9081614392188f293a3489c2081f8a68f0bcdb22c0e2092588b03892048b7a8694283bd840b4060b28f8be1d1004df2b16470cd598d8d280e10c15bef8a1072990c8b20588d39fe53aa940bb2a95ace96d188662188a6148c3baf1a113fa2987ae2469ade7917e6fd4286fda2684dc7d60650a1c286e489224ad0d21a79a0da82b77d53e9022bf5e37405c2e97cbe572b95c57c052f57b1d00d97f487dd57c244f61dad6aaae5cd92d089708a737c9ecaa4ef98505a7b936c47cc5b760c9f308a78f046016cbdec2f3becf45d5b7bc05e3476b960673c03d6055b52b1308aa086a096a9030b2d836421e6dc3237be0d050cd0a1537a988aace1f04244081da6a5b53c152bde8bc5e41b70b1912c446a56d544cd3f45114c5174fa2781a4551148700811fc8838808e692a406b8ba7944d8c6d0e77d1e0d8c260068609b519a2437698aac507d5d990dad33d4c268b6c8da236b852c0c8ce1ef917ce5512e42bbcadf167208ba8ca4d63c2c0bee4adfa2c53ed152ab59580906e0676db0e82a087e1ff8e9803ea452a9542af5682a26879e988a49a5523fe45b99ee4d4fc0b24c096d7a0296fb8df0f88d0b1835bb7c73c0f651b3cc590146cd9c937c55a1d668f13c1b821ff6fb3330fea800cbb4082e33534b25944c96f1516b7292c068bdfd7848aca5b9cfea9c5bdeeeca5a6b58758929401c711629b530c5f9bd27f6f06c77bd6ae31f82338cb212505b15e7b640fb6d53697f55ad045433a7b2dac69fe68f80ffa935260d0f1e0fbef73a7e242709f7db00ac038882ab8de23397412c168bdd58cc85ac505b9d46ed18593b46d68e91313246969dd69a181367e23cf8132fc291c8fe7ebdaef33a2f168b72bbdd6eb7bef5cd1402777dc5be79a55194e911c5320886891533cea022a318a791fd229507379ce21b3947954c28f3b1d385ee144b23d31b39c3cff3c4efd16a6b2cf5d57518b5d5331e629506f08c98986603a8d6f070829f210c18adb60ad4ae69e06e6e628101f77dd88d3fbe4bfe036cd93753b65330da2eafff7b1df77e646c0ab73477034110fc40cf033fcff36ef8852153288e27d3fc2749b091c0920d639b0ddb5e05d8b2ba6ec74d2ab40284d129f15ccb38c0fbeebbf2dab2eb881250034cca5439f221e96c2a4c4871747a5ee070a2660f353a22dbdab13ddac068e7399b64a3388ef71f921fd51a3130fad9320ac272e7c01ca7da6ceb03418cc9cff61d65b7e5efa8233a52e2385e4e18b8ba39b34923785fddec94b8e91d51176303d725c4c0e55c57d41175b11fbbea01462b2ddcb1ad8ec877783aa2037c91003370add68e9fe77d9fe77d9e677d5c9a0843c85e3f5429bf80fd2bf8795dffb558741d124d77bb92c66fe99e6df6762bd45d79bbe518dac9c8d30387fb3df51408313495c0533982a0883149fe830e964413ae5fd4d6e915a08052a791bdc9a8abc664dbaa6c0b37eb835d79efd501b7f3a30376fb75ddd775d77a2ec6e09f24ed0cacd95a201c06ed4c0794d205d2ddc1c3edbaee7e909d244db0c5064b98c1c40d66b8e174233074b842062838882156858674075b3069720513a72f31458b2d5cc4d0c4ace72370cbcf81bdf74bc20f4aa1041959e8e0871b5c61bac1931b94e8428629639cfe15ecb6a5922d95ba5e35886658c00df7fbee053fd62743977668a4699aa6699ada564dffbbebba6efc4cddf863fc130966f4d320fbc517651c7116b93fe8701af51bc95d59a61346276a85723a042084654ef0d353bbcad51aff0faa601b2970fa01952430ea52bcd5b2ea2e5f1d05f3d5634e7f4b5146007c8e377df85dd770fc0d00945d9b2965ca6a573aca5a9ad6d74bce12b98ec751a25676a3446d514e07d932dbb2527ce51f53a2964af64f952868ad64ff9712c5a812b55bc85c4ad4629189650ed508066d5b1fecb0a50a1143207183a22baa5882ca4c4b142156701a394289115a0ce5a086a131ce1e2c5e8003285a2843072d4e5beff51d6ce092e7c132cfa9733c1f7ce866a1c9245c1043d78044c8758eef02789ade05d619bef8e3a3a4cbf649d531ef71a4ae7a843d43ad09b04a6c84b057fef8b8a94308dc5d1f216de3550aef84a456f808b1d952d282a5ef2b81dff7c1602722308b659af585805c6b0b5e5061382c60b465329bd18a737265b5e6b9c06e9d14c964b2db755df8050862fccf6299a6089ae8037350f2011a44b6639f1098a8eb6cdbaea910b7d6ba888890e43ce739cf85a95caebe6c6072bf17f9ca9fe8c7cd86e57c8b0cf8b69ac9e93aee36cfbb1702b8fb98ef1c76251a94bba323378bdc3cca52348423b9f982a260fee56bcd63298f63898adfdf1fd62572ade82a37082855f55195eb981addd631a54caa4440ae55e41795e760645e1ec7d79752e6041d2ff32890248e274b99979779232711f27594322fa58c0574bcccf7e4f8997ff99932c8e8a5ecd1f13265d08dd7517a8eb29ef50c6f3c8e279fc88dc7910b32eac1f1379efc7a12c1f137645ebe661470fc8dafa3cc4bc9437e04ea499628dc781ca5b545b5c673289c9447b7b99dd269e9725d8a3a12daa53554a14e845a190a82fd1b2a99efcf3bfeb07ebfa6e0a6df7eef3c7f2a778203a273ae0adac67fc8e56acdbda1d6747b255a6f4070387bef354dd3344d962b974b39cc184745b0bc491263d709ba465057b821445808245d4757ba438ccd16d201c58f0ee817dd743731a9b2f66b1a56ddf1bcf44216351a52ada74cb3ad4a43526b409c125cdb747481b3a58906c3a25bae1974152d45a575ce575f9e185d74ada4b67c600d43f681dfdf07886de1b2c14601581980df96685d237b89f692ec65b54a9a4ac39e2cd18aba6c5ad3787097ba4b0f84e7243eeab949b067d49c54cdca14556a694a7d45d139dffb3795faf27e74295718e147e9619e9e8a3a77d9eea337ac737c689efab4edd2eb38aa4271576d3ef8c22e79dbdc5a038a34dac963c8b8dd6eb7dbcf0f08fedf9266f5e53296cc94e1c080d1ceb9cb0b75ee6402efc86339be4b79faf17bb0cb6b698116464f0831a5969eaa3309bbe838818918f5887f7a22e18f4f44fcd3a36deb3a2fa33dfb2162d44fe4f4e257eb325df69c5e1c3ffc24a7174f2a213db8c0b720a3a04a832d8e2863861bec0c4ba3eebb1205db0d7e97d648ae37ac0c963e5c2e10726814c14310471ccdc020aa418634d6a8d1aa104167879643bd688b8f17d9868891c11445282122891d949c350c308e20e38a188c7164ca49c44996140d2ad440da3283501839c0218a273b1471fa7bd7b22ef0cd0fc06db3d65a7bef75bd48114551bcf7dada9d4eff9fb4edf7e3085eeef187774be07b3d3be00170d0a9ecf76ead2d896180fc927b7ae54256c00ee386f8cce61c678b65a3be7ad039e0fb87a067e60cecbaeff3baf1070f524659b91e8c760b2a37123efbd81872818ad3b580ec902c6358011a9204e656200169b1f7de7107b5ba80fdab113eb06083346c604871d61d2c51411618d6a812440ca77f05ab4da236050d7f9ef77d9ef7d174f70311d2ddb52cd2863f572d44b440091938f08005248c3469e209168e68f18205191ab084890aa8489979e1e4ec07625b0da8420c2e7041208df1c3f97eafca7393c0026ddb2efdf66353603d53c9fb12087edff77ddff77dafe3f7262c9542971093e9de52a9542a595bba1f7e58d65209b42d957d1c6f6b65f71ef52c9fabd616ad9a4ca2ca87affaed8d8b13afb4a6fbb517d2d497bb773456e0990da375e6e96481fddb094b535fb6d5547cd56a294b541b7f7513f67bf43ebc1747ae6309a86c7aab7a22f4a7a96c29be9a11a089a7417864fb5d777fe67dd64c420d70b6dfe51d33ec3d4a038e3f4034088fec7d77ab7b5dbed6767b5e09deebd870ab70640ff4bebd366121249ed5bccf63b566466546a54aad7e45f65a9d8bea799ee7799fe9a67d9122dce2664b8a8244946a0952dba1e9ea6eeb16db368b363c9807f3905cb67e242b0c6c592cd3fc27491216ae86c026f23b4996262938838a94b418711a855f844504164c4ea3d2a3f80a1e90429eccc27c113ef292b2bf3ccca3b5f6d3799e90079301f7578251c9f49fdec8f9a27a7998ef797998ef8729838cbaec81f95319747a980f72f99732c8a8e7e561ca20fc306fe40c6d5bd0248edf2ab4cebaaf675090510f0ccc1904f332d7c793e9ca13faac7655cf6a75ac5da1480edf64cf7085ce61580a0195742d7b548f76c83efbc14231046aa9787b645be00f75e56f94948d880245f6f72639049d51cf52e1c1ac935a4303ee4a1fb0a7c48b95ea59f3e92b3d35b02dbd2b18ad359eeaeea2a3c8c0e17043381c2e8b0ab5c6dd1d87c18f05fcf190c9849a26f37a408165686fc9a9169d2bd83fa60aee1a0e6a8e0d7d8404aa35feb296b54c2693c96432938b55845e541cab313386048218ffef5c8f99313316b3269305c40b43389c41451670431451ce972fc22a02ca91d348fc1622076791d40ee74b6944f3a22b53c57d69240e3384e304eea1f1afea03554aee80fdf171b65c6b389a4dae355c2c7bccda988dd9f16dd943b7f4b5964357e8de9a4b59024bf09500d13e2afda8eaca3e8a67474747a5253aa9d01d2fc88ec47be8bd9f6c7ab475dcccb5d6fad9d429a1078f19f5e0877922a87f7922f8617ed471e2e5514f04e6f1cb5814601e7f8f32b63ce1e5518f3f4aeeff669ef4b1ae7d39e0cfb60a8451bda8825429f9d644a9c10b555809553ec491ca637625d6d3a46a6c2abde8e64aadafa9637b8995b9e95f6f3fd6deeccdde7b63b19b0e186e5ebca0ee4b79bdf4d5bd3ae1bd65607fcd4ea86b859ad6b496ae087e3f7e180451ad55884c2aab5240e9ab2b971e47b68fe2c828d9b11cb21fd904d1c31d022484055cdd74416dee6f13be175f1a968f1d13fc765fbf71e988703351092105446791dac4113a4091c1f99524f852f1bbe900a00177bccccc30ebc6f5e1b29d999925e11222d97b597d240b6b6da5b16042f55593fd43563758faa0efc30780a2854aaa3f7fdc74a802553548d8c572f3ab7608b64449270546ebcd5eef4617f8c636cc94466d8aeeeeee06418c59f5e57fd3f4d34f3ffd34fd47404da8a6834324d3b64fdf230619b99441635983c42edbf35cbf6305d8bd9429c12bbbc8ffcbe8a34dcb3d044edd70fe28548ea3da9179c23dbde669c9b9991ed12b7f4cbe697a94652a519cd2f8e051d76690fb09af445b89b1968ab534b442298fd78e664ef3234faac20ad93adce635b2da7ceebdeeb597263ecfda5c811d04bb9b06a682a4a44e0abdeebbf77e5fd209033e8191da02d20f5906a418d268c9da493280410ce9079996ce75fa5da0e2785d9ada80d224b825b258522c75b95cedeee48df949492e312089431e159ed775dd1533ead5c44c7312bc1a0fe09429f6defbd56aa520643cd86c3e3eef799e8f8d4543779da856da76db9905ac08298911d988dcbd443b5bc0b5d6dc9ff9bcce9482e3801f7a9e288a372e1f3a22ecf8d8df13291a699ad2a434290d0d4d4a93d2d847692c4d9ae6eaeb943d1d783b0059c85f0c35dc9cd4977d3206d8888bbbb81f70b6e579a997da56ad35ad29089fe5628b1bf9c771eaebc3dd2c884b2fced3e2a5593c2ca98725fbebcc66336b2d0d0b84baeaef342da561cd716abc4d2547691bffbc57a289aed5b57ade7749aa31100631c58f3a3dea47c8162ebb862ac10b43f6b26f34943d46767bb3b5da5a53ded7fd0dd8e6d0bb737b7a72ea4614fc3c9548f0bb009ea7ef71851e79c838964145cef1514a327aa324b9891445094b46ede1dfa9ee91cae22a0869ad21b22b7b46f61f2d1ae88d5d59d1ac0a8d71e4a6839a0dc5c0b39d6a658b35bef7de7be28d039190906d7d1f68c9c0d123077cd3b2865003358084ea80dafa013ac386b36266435d9d8173d8961fa0db2df7fd3f8f90100c053319e4724040b91c502e07823d6420812ecc77b080c18cdecf7375bb3beb86a7a7d6cc9ce82e0c8674bbfbf46d829acb39b62693c9640203db3fe2301808d9ed3dbd8347ed3848b04f058b6c364ffa1ecb573a12989b37601809d908d7b3cf9a653299ec2aa089250e4b826d403298ece443305fe24a4493f86084d586f2023b50c961335887e9e071985de584d0009751510e2cc98c8a4a2d036a992c67b2a03886e11876ade90ebbc3d218869dd93158866ee18e1a6054379e4ee3e94483f8fe3f29f03fef61449d1c94de84b241cc8c8ac0483ebdcbbb7cab44375dde73890631eff8633c7dab7c72a7a0634fa57044e5d309675ccabc7c07bc0ad000cb94e03d7eef71e9f2e0a34ad0cd54ea63ca7a02ccc7f4c07c4c49da95cb7f1d47181f97303e2ebfd6b8946810339fc2eff047d50add06aaca61990298eb582a9be0212b2e18b96007596ef041a68ba32a3b30a1e48a1b9ceefe04a82b7f1bb015826318156957b5465557fd3dc59457c0ea07e5e20b344cc3344cc3344cc340767ebc8c569cb5358a2c4cb07016f12a48a751b7b5ffb71eb9d96a088cb4f303fe097d9e1e5481ed43ba1c7e18fea81255e1873574f1f3efbd2721ecdef3924ab6be9ca82d2f495df91b1919616f68cbec4d666f8ea4d63889dd6cd8bd773c0269481445fbff04f7bda24c5b1ed67c28d8b3e186db964b6506f535a3398e67bfb928208511354011e5891853a46ab6255bd85002052ea46cd016e97adef5367046c5d20d795eab00054b5bf2664908eeaaafcea3abbe6ace79872ec0c70d49de2cf9d911e1d539a5f7f7515fde0bd9bc8686603275b7dd47efb000d996cbe55201cbc5c97e638bda14432f2b70add55a6b3fd0ff561cfbed1ea1cda8e46e977c56a29111000000800093140000180c080683c16058402619ef6b7a14000b5c7a407870409988834994e43808829031c619040820008c91a1991a0b927611d5b519b12db6d136948f1e63b2cd2622139e3930147518ebc767e2035b2b1b847f6bd4084a25b1b1c12240d2725fd8d8d3760ef39c5aecf4dd930608db1466715eb24c79342de6f795671e2c1eca094a11bc90ff57bb121191da2c8a1e504dc6308ec358a7acd48fef0b82c1ac7d5ebca90555827f11108a25b716211629ab11a623ef7e0156d82ccb8404384d7da26e84034ff6bc6d2d85dab394f6610ee07245e5bf9ba761b1e5374fd1b07ecd9f38f55a43a5e8d918c38e3a1b51a9678bbe9df7fbd1a703058a775059369a718cde5aab4af9b8d082535507100c8858dbe589ed3a9b2111e576c163cebcf6430d68e5f066435ea88a0e016c5bdafc2d6f8ac7fedad82ac65af326773640751c7db72727cf517c31ceb8d2303045866bad7ae5a15610b00339e60cd418e9988d26af8e4facccfd70595eb8c56735e3613b29d342aa723b808634578a2ca45d702ac51b614e76842a8b55e04eb34f33dd21435e953d979dc5bd152c9010a167d9832211505169d52386bf1f15db4f96b275475c816862b30ee6d06f612b0400addaea564a285509178574e09e9e0315d20455f5cf063b7752dd230d16b239f9c8aded8d8e0ec743380bc745c9da0605b097d84aa8f3c237245625189d24421e6f51f468232462e3642ac839e5b95458f55db9b999d5a581cca0d05766a0aabf92463438809bce890fc8d9a533743cd869eb9a49d3cf8ff875718ae3bb659836adb3c784e6b67280b3ae1531a8e955ad529d07c83002168b3e1917738defb69f6090c137d9a0508dcb4ce1575cc882dd8dce7b7888aed44412e7cf32aeb265a49730460d3f8a8dc7bc9868dd4f1931a63b2974ed442824c8432127bca588908bd39abc9f3864115ca09b75c4d9f1c5bf3f0a1def0057ee318409bd3a2330e1e2ef1fabe46bd29f655293ac58d4b937dda4418f01ddbb763ead7487d9496a45562657dfb836786c61efd6a0f534bd578bca4cbed208a6491e88fafaaf5e8d6a7dd42614a57b88f79259bcc929ddc0a1455b4b4a1ca9909f32a907ee264a57b5116f4b673725b2239d91be65adf15591f20254db70f855c2438bbc6be777249be7b55e1add246c3361c83f34d3d30199bc3a5693f4706ccba55e74e092c8cc865eb31943785c4292a410159d9ff091b081ab701eeb74b2b3f67171f65c7057129701a93346e704393a083a2b46805f178a7eb169154e690bee104692342b229da3f7359ad1e2e36cf49cab9413d56f614db02241b8b40ab02383901b3035333903a9b1be474b240e5836ae3c0a9a7a8395e7e166a579c50d4cd86f788c39b11c086cf2f59f8c4f82aa27f104dab6044a558f08689505a7f3f282fef3e5a5aa645574a90204b85f73516117786776a68278fb9592d7d28383f52366243143a1e6246d04378fd7706a3ec694bfc7b72971e9635be66e274708b852172c06d6c5a0509a20cfa597f08bee503be1456c9d6640ea1dedf278c937376f53306e1e96598623a33e3ccca01905c3bf8717eee55bdb0ff60d2132eef0d1790c128065cafe25cc10b827951cb326a9f5612f2bbfa7352b2c05724acb0daaf39b389c63b7149986a7399a3c8ae8aab034ba4fd018efacbd67d6b6e84fd5ceb4eefefdc4b8744c6049f661d7ca57085db1baeb1e8f9378fbb0836a412fce6104647e1dc354146434421bb6da0a5a95e61bac4dd8f8dda89438b5eed065f3f12dd5cca5edf2aceff2220a99b005560f68b37f5463e16f9a550357d018eb001a2f77baaf8cdee325f6f7ebcda9aa454ddb37a38d84eac316fbfc2af237337ef6cb745232d19851f96320f5c37225bb62d5e856957bb9b80490d4fb6feb8cf4b3873ac404309337dcf90aaed450a9e931fd20a4082bd368caf05880ec3de6718acc386a191697caf0496b65883f88d56245f1a726c83d437440ea60bab71b1f35c49a5ea3faf2bb030254faa9689abf33738fbbc5ff6bdc2bdcfb11a96c5d6a4b4867cad151236b4f8c11d78524619e0634aae46b0609d61121225d84870eccc9976d6686415dbc5519ecd1fd50d6375a215437f5b0a1aecbb624a74dbdbe3279aa362208215173c435f50386e6e1d5074b6420ccd390994d442f4006da8230f6200d4dd20a9528030638191b9f009c7dfa461bcefee1ed4020e95204451e5056bfedc271473e016609309adcc6d36c6c0acc5d6e03171310e85b5eca88db2d89ee84b8c122d9cbae46ba0318850c3f20fa6b0bc2d44082118b23a0816c7c312fc86aaff52a57a93843fe62ddd71c2d5024cbd9568bcae95e97df4d2f61dd0171900b981437561be12cf4122ade5ce864913b5eef6a6ad280bd1d22b7b2ab21581bf8cf0812ddb8f7780c4723d3a362269900837f6bbebb79a5daf9c72c30516a484c23c5e0ac77e97acf7c22df568ee342a04c12f39a0bc2b9fa0ac31e532f15a54f18c86f6ec7810fbd8e59d4db6f370510d1a4b2e20f48912a97330158f0ef925106e11b66784b795f227d2bef0460ddf72b8378fb796519429fd0016ac045ce00d88fc6db09ff048998cafd38888939d0a09284a200f3e27f00c7f5d6ba986640dc66a96a70904962a5aafe1768644533dbc5ce35785471c381500ea8bffd0a1b6729e0aba174f31a306902c6626dd8e673c783eb391ebec219d0e12b444a28c337d3605cb932c1052e032c0ec3571463761abe427042d45e7c5276af20fb654c638a374ab6f10cdaed4ceffbde85d6067d8c91975aa0b1c006f7ae27ed0e36f80b246ff4f8111e9143848569668e8a9bef79dd6841f4ca2dabb9ecbbd01159d6f5a8fe80e167e8551d67c2d220577553a81a5acfabaedd9cf8c76218184bec4274ec59c56dda5a9f8b2e80157897016f497e923793b52e1a38a2ec85bbfca96d34f9bbb5f04412b038a3d2e93d0698cda9e2ce1ea258e1eb7eaab1130a1ad8674818b9734a8a58909f6a57ac514aa8c787bcc76a62637dea54f02893b02f0f7557badbcca661d2ac83fa2c133807bc7c52aae3efb134a5342e38628a69313ff1825798de5bbcb6653af5955feefe94a6d437cb95e74536faf3888e034b2838b671878163f3e2bf729e429272841dabb2861f802252f2b73f2809b452eef4f91cbfbe2796f5f8033beb5fc01c7c05651bb1b757a7741c667936ad734ef95c28ba1ab9653883db0d366e625f97110c585e015fbc00cfc31d9e6237c30de9d90b24852bf49d01ef8171696d37e6cafcd0fd76e90e871248f79db6dd5893cd7b9ddb0d22d85adbd550875e6f7aa780e5d2139273acce07d4882f1bb88831acfe680dafd0e82bc8e65854fbfa41eebef576d920884095b9a2844b05201147373897228f89fb4c82ab965d92da9ec1f294e94ca6637fdb9ac32c297a8dc94c14dccff86ef8b521b89bf52eeb047775832aaf297d1ae5ccb22e54d5167a70b29cec7e18316ba45d52ec71db154171892646f96ebdac38272e5bd571860f643a4ffd62b6f8a01c508088295f9ad3fb331bef9bb88ab3b9abc8e069d4196aeace59debadfeccfe273967415e03091c67d10a8f7c459867bf0fc2b38b0acfa8e42ebfaa4e8be1e0899fdf927679d8044970543e67eaeb58ca5c8a707a9226d60533634a4408403f90fb00682c22ea106d5fc94e6cd82af4b3870bb8a1b5ef0f9ac868dffaade7e67585a2349e0d9a945762ecdd9bebf940d6a3bfbca249f411b098cc9c7ee8e8165bf43aef5eb929d52aa83aa660f5f1367ea7a8da5ea00138166b551977b2e2f7e2c6ace7378d5c8e928e6d159f6d8f16e693bd38b1fd1bda0bf4ba372803e35e0e441a78c225ff9fb5806793d1a0dfaf2adb16004b234c7b99d1431e646bfb64e0b3e3106409913650e7c69e203cf051a5d16e0fd2f82f25a86581bafc65acb2fd2866a28530e4e21fb680ba70f01caee8d0213b9dea800861a885c80a01243ffa8bd5488b1bdf22c84e1d2500fb1bed5f77c02b201b4d7279d2bd56e648e6cba2b795c6c825752e48edaa73dfd129561838ea20d87a1971aa3c65e2e557263e5c74e246d2b773a80db9806cd6e44524a0db0227e4e7acd05173edd59695b635fd828b7556f09c3981df32f89b1729c49e11d2246626c37aefa2392e7498c55a304c09667c2db7ec8d3549487809ea74090fecc7a82b462ece4cff19d0193477852f8a2524830af7237eba2aab3427012706a051cc901e7472a4a742b262af4eae78b4234cf13b390571b0bd86f11ac99f70ec5600d8361ede56d634983221c4223936845c8062391c0dc8bb55d5566ac919afc7790108b624ac6bfa6b222b975543adb7fac5531b567923c3f0e55174d1773e5259f86c97cfe9bb3dc944d81b8f83e94d1b05117da902c28591363c079f9de720c085e0d5326d353d30fb09ab5ce577c58e51a671cd2a25a8b07b2ca5a9c952776520823b8997e970dbc6d4303e41586ac643d1889765228bfd60178da18395037f4c58515a67e6a443e1fe1b8bcc1eac6643d44bcc410dc14f36b196950d6303a91c9832fa2e346c2441eaa70fd589dbbd461e134da9bdeb2ce1b336b4f65cf78df47512b8d9935bd9458531a3fe886124c464e8a4dc3beb32e5ae7bdd1cee1a4d52efe47e263c649c9da10485ec065ad2ad13184635d69598b2a2d30de24dee51463d57f710dd6650df3a678733f0164df25b8d7c9fd074c04b155e30b823ac643a9033d60fe69cadda03de8ebeee41be44d08ae1ce3a42f76089ade484195a484309986e23ac42e0d29957e5455286993055e11faaad9d0f9ec865b6653a2f14b25db9bbf1ef178918a0213db38f698f4ba4d3cd0957270796f1a036218ebc003a848a59f5b257e66dc0a1c45e4c51832c5b15a09d8c55e0459164451bf0b19c006bc6df8c8c86c568796e6553403df38d3847b8fa6f603180cb63d4b01ab03424c513f9b1e3f01cffc6042a1aa28453807bde10b990afaf113cc2297fcb53a7c7168441ffb88ad38e81e8504050a5ca718e27122dfb4e8461e132847329087e22330503849790338cecd125f580768806fd48c7c2b2d6f0627eab517524246d7542e5817d51d57a8fd08dd06ba835c4eeba7f70518e124d711693032d52a8b7e577e8675a5927a631c77c788b0088f9e4bd7a3042bfcee79262c5f08fe370ddca4c600263b6fc018b611bd8671099e6a2028bc4dc4462db054f1e282dc69bb52b56e69d3bbbcc26675cd4c41b776e559e456e8bda5b4e3d955bb4d56f768c358c75e910ee018eb81286d30f44198e68156bc0130ef68f7d8e8b91a45b3370ddc68de3c6298b19e747025020d6d80fd818342750cc737f372cec20f7a3d47281d80b72c264919baef1125334d3d86a0de5828dd5de0e75967adb02d98981aef0f6e3983cc7080008078f2972b62cb696d173f9de2f52dba8680addb2e53636219d23938a87aff6e16ee42c7a796749979bac4d09e907514d073471f57226887f860cde28e14cf3c989baa9473a464a2815b52eb721c5db1e7c77c460a549f589c4bf590328a202c4e3ca7efe7ce5f3b38bb3cc8cf17051ea0a7f82d76cdb1cdb58038e7dd77f160a408ce56ca614625cfcf12899b2c65e024b929d3b83b1e80ecde627a6205c383eaec8ff40283dcb0d48c8f2b313cc9b066683eb7789dcf71383c29d7394083f9400d629a05af486de605e21149317006425115a72d9e6854091176375d8704747c572d174b410347106d9c5e33a006895d003985b7a0d06f19e8a8ca45ec3a6edc6fc46c4303823a426d3d29a4c20efec701056bdf8a3a934fbedc1ee4a146042a32e82fdf80839db2c218052c110f5de4bafb7fc08ede3d604f693862404c2298670213d3747f02dfe86760f42220ca0a7b610f2cff95ba97c8d2aaa321c58fa1584ee6740be5e519154004973b6b35f099028808dcdb239adc794b74f7230a2183d6122e2181e8832c7c34b07c58a7534f1d05c52c3321f15c1e853cd00fb275968e14795e67d9fc0bc3b35fcaf62366c00005bc8fcf78ef036fd921b50ab390112d2b89b4e255ea0371552d4033144ce62df04961f4f21103dbf2079438f08544805d49d83159fa95fd53ba2e132e93d942bf03a4053d28dcace06e3237c2fd0515863094f26eca0b0282da5e7a86c428063e8c47de3e2685a1b9167da827832dc1c9dd89d74573c86779d214697251b421f0d6383ec02570ce7ca256e2ca85d68c23f0ff5d4333441f9031ec4447f364833bdced29616764194ac14f70c7f663a5a43c47c15163bff1e029f531051a6b336a40dff1796b25ea4234d66bc21ffcd0cd4d273faf2cc65bfa72acfd1220faecb4db3bd83b74896a8f80b00f8044d56cb79b34008ff2f8dc82ffc229056a1e3682eb99aebbd1a9f9a9427285c015f73e0e7a142342eb674e4f129a2cc1b87fec7d715b6ece85446f630f3ed228cbe9804f0903e174be731ab3385bf99f6d23f3dc9bde2f87ab629baf1ba47490dcde9d197bc3e5eb59915ba0b7ecdba2900f92db5c08f62db1cf249e619ead358333c282af53d9b95b326f8f5596ed6de2c30f4d775a9f9794f27b3b3e6bd4c0e7ed116990c84d3ae3da5a5f88a6edcd58c2cde5b812eb63781bf0bb895228b919b54bf3b2ab6b1199a1f5f4e02789f714fc5190f50c172104607ccf52e35730905eab70a03e5b409612ee771ff789101f4f239bbd2c9d320a2048d109c1123f86d3cd29177e59e9bd06a45a7873f96488c756e274e152891c100b465728630eb1b02d8a3fcbb520708aee920490c13af8711c4f25ba253c296cb6c759576205f25f387bfc87cec08fb89e80fe3c70da41529ebe27680c6194e94c1e166aea64c68120aa7e819e9e95160e706a40e336b7e9597022c7bf87871ed2e520ac59c8c48287f46744f3be0a713628b9c024380ef3bacc31de351ce1ab0c0d241e06280f2704e823f103fb1d6d07dd17cb5e11871a785d21d36a325051004cb5ad46b28d8419cc7ae77384d8ea6352d4c2744194613f67c984057edb260074ff31c18551ab89e0945415d7e4a25c4f84e93d51c5f86a0f4fb69a70a03322274f7594ae0ec6d755fae868f8ba34521a1655aaf932739cc1a8697531c86a33e807979b8fecd9b61dc42343d4d3484c83951f34b41ad5353b3fcd129e061665c7b1414cd9b8915791925b479bbe3d0226560b6877a6806f78beb8b591a10c5bd280641ed6b2d74a59444662065d4b56d94195fd74cf8a1cab220cd1b837209aa1b322446f459b555cb122242bee3d68d6b362876045bebc33f7fa31b28badace88f3873c5f6143bcf0e06eaef20572cdf60d8aa2d7abde48a1c4221e58ad40b87ebda41d76c4c0687aa5004de000dcabbc867fe476e5b42cf8ba96ad7e78af31055fa2ddb4888ba3fb253d5e6ce9e6a47840d048008725bf8f473ecf85899e808739a889e770486071fd5ec3d1525783fcb1b346ca2c0c9eb96ec6824ca8870fff8b1c4e3240d6c0015f894722e50d7c4a99ebdec169da853b5d336e46c44b5f52b2608e64cdf278fb0a7aa49c963dccfcdd0eccc16281fc70c6957ef5fa5def7e3a6e146b316baee4509b0d024ec6f9afefe7d1c49a0e676bd54b86efc0ae38b04ec575a17d58eeec0e42dc97d36920824ec6a627d86395c60bcb63f9b91323b597bdd1be6f4afa229cbe77615d5c39246400f62f185be23d6804087a0d02dd65833e9e6a123ed00d64b76be321d757c9aabd459b46beec25a3db6f5d64575a8fc0131b1fc40f97b98431b82f06bd35527e6c5b48d25de1417f1c22639caa182b71bf7c289539d2a72eaf636da9c1364b2c429bf15de1af4b4b9d0e505eae3f09c12d0f9023250cccc7eebe2f295f029460d035dcd63cb567220db3070a660bc08eb1345e6bde0f858aaaa55a4491c1a31268c17abca9fc98647ad0ef8c3dbc8b3508cd6b2480d894868ef2d646d5b4db3405cd4e4c65a401114594a415723d2f2ca05f4bfa7943ff049e6849f8e4a31f476bcd3b38a9ba86c0669485d212957b5db6541142367b65e48fec751a4f5c215fe4f9e8d1e5652f756bd770696efdcdb26c38ebd985c5476989528b861a79b6b79fe193464ab182552cd98663d1108c38942f37403396969deb62179b03264c8dbf7d3056f3d4c4fd0336ca60905b7e2998c7449eabc7d4da346959b305d3be2f46367b07daa74cdabf7b7c0efc4041472c60ca1089a13437cc5fe3c1a16398f86c775f1417ff444de3e035a4b76376ca48dab56dc1d2ded5e89e866fb34192f3c04d986cf75abf9f5022544d783d361fc73d74b24912b0d89bb0b274f5adf90eb8aa116686d33a6a746ed37022ceb4c3b9e9544e75ed26e91f40897c2d663f4f88444123971018ce1b7988ff5a8cdcccc4937b122a0942d436cb53f334e0c3731d0a4beee9a19cf444ba9b0f9278544e3435cb643ee4a30514c2f51ab158cebb9b2264662f8b0788104b89c4b3012bdf46c7663a65076eb81e304d81880627b70e01233361c1f05c21221e85e48c53d708d14ff120a26a0ec0c7554bcf61ac883f31603b222827248cab9a2353db7b4579153dcadcbed6709730b6e55a13e5888b886297e5ab09d95a6353cd0a7447290c0e68d4b0cf8a3e093c029ce1cc4f32abc0cc48c5c81b9cfbed63403c67621329038382d075b98c9ad356657e0e2496cb2d5e6691227e661c8a1861e6695aa1191acc8f1383b3e98b690eba924cd91a48e15d4138f47988cfb1e2f00d7fbec0ac4209b51ed9d85402c6e318daf8dd0e07c0c8dbae04bfe16c9d4bc25625b3dd327b7b7f670e7f5ed3ebff78051c4f5dc4e09e4be861aeb71b0f08e0adb4db01f7944b87870c7a45b885084eff9746c2f8ae8bc97b56b6f8d2cf56697cdaa67dac43260ed068066e76564e5dc8757c878cae75035d450518beee5a1d0bbba506a2a416b72f64f58ce624046dc0679ba85c40fb3f063d9caa13b9618d36c82a7c12621f3922fa198fb8275a1604b02be0571d646c81181c62ef9cf1dbb4c8c8e667fa6b6e1077360cf9b81a7bc7b5e9f43d8b235d2cebdeefcd50d0426e406e08d68d4724d95b7424cf2948c346d2861139d74e730113454cdd0a8b963fab14818cbf37c1e69088d799fb31515aea4caf5797c122df087d023507477c93cad98dbac50267e8338c19b41c1e6c417d7fc05c902ed0be67fcb9629f47514ed8075c9c8ae8f3666a76bea8f942961c88c53d7a7865436bcbd3325d3f3af0913e94e237340b08aaf72af7599e106d437ad6ee2cd008e997f813210b5e4abf89974c75af8a5fd4352e4e2710a246285162e623a805a7be55b6c077fa3541ef219b2b83fea60044919342bf98284572830b327047d07a1f19b95c91dc2e0d2b0a9d6679401e956dd91a770b58756d57204094b58d552aaa8b14840b33d7eb3441299f0f649036f38392d583c98a6d5d65b7337464f1df2d300734802d98b46d6049a4b435ea8ba645a55cfda7f3f0818ad2efd7f974172e7d7d2e0f7bd037ce33c48ae08e2f0b5f9da12d7343e794f605357ef641d2c96945cd82ac01e7fb2b500694b6658bef7758bd2ac58b2ca3f8f15a67f4bfcd148c2747ed475d82cd37c52ccf49903f64e5a8756643e03dae80aa78b3f05937e3b8357cfcd320f015c8264f8f8b7a31664e2f4eb95ec6ac7a5a9f48cbdb24e2502bca01016d4c68c75e382a2f6e92e318df967812c063788a52c9b24aef794479162584c4f97fb1d091ceb764fb76e3d8493f134f81de23a8b76fa0cb420ed01f069cfd63bf4694fde646b08054f0c505794a5c93c879600a1958a836786955cdaa474299d3c244b7fb1687777cb1bb1d2c3c961ded618f476210387f927237c8e8ffad0edc67da2146e41990de6e94bb176f45473d37b72a0176f57b2b08e3360b208259f8ef35ec53ebea43bd34edff315bd532f637e947965ef3165cf9cd54f47e1d1ee8665615132ea4893851d66b79461ad53310c287bfa6abfcd0eaa92e35a255d413f97e7db7645fdea31ec800cf73b0514d80871a7f5d94bded2f8f1cf4132b604533f5e367040065c529acf4f82760573a33caafbf2a3157cd1e5b22d19cc19ae830918a5e3908a00a47d732067d5ab1032099cd9410f64d7919f0dc322279eda86b382782eecbf30974676add131af4e04a6774b1f46b30d8b286dee6279dc0e19ae213d912b07ea4bae5fe1ac6bf0a678fd60bb1bac8e2ccf8afd9abdbc35c90710f79cd6fb0dd87c9862552f3bc1903082b4de06a49cd20338b9d4080b2dc5f9a36f71720b54c9205ee3a77e9d40174a135ff14bf195be73b5ec4b7918ded011861de4bee706da5a41453951df5cc26987ee2407b00cc5071eb91a89b68b05bbeb0b12f8179d8662b174546f32adf2f85cb0ac08dd6e0069210db5594f9baa376838256844cee99f626fb4e77022415241d50a28ee9c91e72977d4245a9f7ed5cc202c555a976068e1719cc4b939fdfa7b8bd7146eb4e822c7291feea9c4b880adfe79a3f8bbd19820bd958cbdf03d4238de1091add8cf72649af3ed36ce97df106f401c740e006dd182b797eb710c05c7ed7b0f2515b599320c1e8ae961bea5c6ce06ff59c4bbb4feea1c10eef0ea73280c6be49cbe291915fb80cf4749636aa5a5090b8ea3c6d69b7a7d057e1116b79b5a233c840aeafa97d68a140c6deb3be067058f3e277f1a17eda8af4e4fbd802f65eb1bed3138c3323460cede507e26502d3562d7dd973cec3334a405bd45402a69124982f5eaa44cf5499f2869150bb31fa71a8c48953fb8321a72f0c6510398d0f2636441d09058bda176802a386b0b686d84938e085034673e4d97e6d698ffa5a52be02c3a0810b5112d6da9c23e6ce8c694da406f6c735a6d904b9bb3aa1c0050e6f7c1ee8a4ce13c0abd6cbd4bce5bdf28e113f209228ff82488c3034388cba43c42e7ef81f9ed88bb72c81baccd521195a76b5917eddea645bb9268f705d3158b454d8803ed0e5a7f96fbad415b7abf75b3d1328e318f5b30eb8d86ba399daf612a400c979186f60fb18147a43cb150f87ad34635ac1aee51633bb8bea79ea60ae4a177cf0db076d25a1404ffcac75c692c62fd2aa40a53518cb79704b829773253669ef61d438e67a3cde71b4157283d2e5c408ab18c47280aeeae2c7c119ad833a34b7d8f38b588c9681fd39b7960ce0e8ca147ea7357d6f96a1f97f087debf566b0d6c4b270852c20b56affee74a6a0d81f76e73a13943c244fa0aa370ae80d46a3f20aef9028ff5f60d5e63698a7850f74a8b928ed6800866d44918d2c3344bba347343ab3fc3326a7ac2ca50cf15fa66c363589ec247cc766b1bee183254823b2ab4ae8042934b324d96af3e6e3f2d22897302b7128f975acc973a3a9189cffa8b3af292d0be7c06cb72608b61b1446f6388ba75e9e23208f255feb58d6e4b66aea69c1b79f179825aebf49829064e92ca86ab1def055cf260d4b900019c3daf7471f727daf5acb1b9807f289c490cb90d5d8f81a3265a23b896af823988189a15166b93246ed294c18af8623169ab15db44532678fefd1d2ebbc29be7e1c0fc9219b4f53a4e87d414a4dc9dac09e6b5d0b3e6509b95a15d4b9d26450382c367a8fbd08463ec153c2662b9a5fa4fc06691b9a1e9aeeedeeb755cc0bb7573c3ce54f36087d2e6e7eac53d112d17948a393147366504453760c34290540788a28adc1e226cc2a91969343ec2a2e8c97a05ebd2173b5a1754f4e0a8bd8149788eaba523a8be8ea8be1ef09c49b137fa53a667c8719535ee5c6859dd0a9fa6c7d81a02f6dd0d1dd6104d2065d0ecaa02770c757a46e1e017e68f0bcb99adefb51c53fd7b1848d1cbdad768ddc78a2c20fe007cc44408d22e4988d6ca55ebbae8fffcaa0f086c190510c30073e9e4b9e6d6b455ee5d5753cbe47f07cbc533c161765213d62b153b419ae25866f0327c3d16dc985d1220b67b83914a5c2ed5b64097c5746cd2c5885d152c8cd3c342c7246174edf71bb76668a08780ec6784ab3427b80898522389f987498025322a8054b434786f59f7d55b85ce2b979c63c493362f5d5bdc635f0af8d04f19230159e2bf10002f57f894da70666ea3d82cc66f562702e44e8c155ef7c1e8097d548976ad5fd560899e08ae295d55c2903a716b10c0c4ff56376fe3104e55ead9bfdf17529a69bca270200696f3729cbcfaa15f276ca2d202c3b7a9744f45637998c0fd5f6e4f87cab4af1d4e7adcaac896ee6eb38f434e9c3f1175fda037ea970c7ffb911a19fc3684ab79599c384f0a1509df33be355950973cd6b6b96fdd7fa4adf3fe9da32ffb254edbc8ef3bfcb2a6d74e10355541cf4f5951ddf9d63fa29833d994ca83f7599e3d46f9c4c1755da36dbb63880dc95b63acf3214a99ce2e70636d47b399f7c15029bfda7572ad54556c8dc1b4469c92ffc2d2581711746c5435c7f64b47a5143d4a0ab6ab66356287499927c6dabc8e40cca1ec32876c0d0f67e690208cc92bf01bb28d53e8044f4303d342ed4bafb7ef7900445686fe73f6dba8fd847a3eaee87996c43ccda1d0426973283c609439efa266445bfad42b96776bf3fbb7e144ee864d71db99df3b728cd30dae492bfa2444a26112ee3533ccf7a022a3e2142bfedf9efad7d562fd6b60ee0639ec0d56a6fd7eb9d1eb1359c027ec7371da086457d04e2a50ee410c2d0345e0f658c1afac51e7f36b8db570c68f72f594d3364cc93f393253c0d265217942a1642055cc85cc7e473ad1e9a143b417531cd1f74a4eebaea27395ceb1ecb29893ac7f80e508e2b86a3ca05e2cb9852cbd48c3d817b9e4d43a1babe66060456b199c891af393395c9503b588e38a6edc9037cf993a33358714833806f7bc0595b6f4cd58ffaae22aed4be0d2a3383a0ef0855fbda6ce046b599aafabcf13f2d3e81311ad06fe4cb646135c0fe52e52786272f894d1e570265cef5c3d4398da80f7159a63b5dc0c35e7fcb538d6915306dc6438c7caa2105f2573b0ce02436449312c0047d30994c35ee9feb71e33e82a4fa93090de84b37585a2333f51e47dad8304ee96a1846fb8bfd310cef62059933d284e0e856bf2040a993844f3f586507d1dcaf28ec71ff80247627d7db1e2f9f3bab9098ea0c5980fea688b41790f5420f055a8daf67b8460ab1217d93fff9e2347e4754d3364c1afa06a4040c40051261be03ad27d06e4d3f4625bd2163f6dcd84a8bff028288963590412590e7f09be7fc02573d9ce79310945156d4e002c242ef3b5719441bbc2429f631e33f8f6905220318ff09da690e0357dec3edf39ca094142ae8134daac86e14aac1fb55a7f958c6c13b96f53355872b132b654518abe2acd763e779e9ec8a91f29206816938ece85d398cf7b4d61d9e8c0f98b76f762226d38e819f113a1d08ab6bb72b6e599984b445043af2cf70b8f782191597cf15a304b37a04543c7b404d170406895f1aec94d1ffaea12808283ca7530d3c0a43ced0dd42dbc21f292e0cd1d56a7ec12e9df83dc0883c88e2b9e28fd2a04a4c40a393d5371297ca3b38e11e0be65b89cdf2452a933416d27123fd4e916cdba013839e329db60a906dc788e0b4d1b62c2986ad0e643f7b82abcab1d63f83f7430acfece831ccf9384ebee7a42ea0e7c25677ba51ce39d086115fa67035e09a0ae05a741e6f9f1054532a573ffc294790683926eaa62c67108789de1cc525215341d8df748b78305b82db2b4bc37fd980d3bcd602c0e6373f19cb74bffa85db3c40fb807686d66ec57463737e0dcd762545108c1e405697a9f31fd4c74cff7a2c3249867315a1fb85f9a4db29907d0287353cbfdb600d2838300fb529374d071ded5de0d1abede55ea0342340f3661e99141faa2688ec460222d6320cd9cbc51e7de1e16cb3c81aae1f3259d14b0f0adaa5a624393796b562abda4841786da56cead6b43225d2eae13bb6f041b91b580c517e2831821cb5ffeb4c447f5f206176ca77805f41a1cb98d97e8e02f20b59bf7a4537d8f393d0febe1a3866e762b2b4a29f8f36953b915c02b03dc5c7eee2565212f6d132ad6cc932ae3a79bd28080305e8fd2aebcff18b4522805481296ca9cdd40740adfaa6272df1e096ec39ce9ac423ace44ffb68fd35da115bf7e6d28ad50d2d0ddc15aaac656bd196c466dc6e8ad246d77d316f820d186ffcb91eee475f5ed2a97765a6e0512dc6fb761053e5c7ce5487946a2755f0c03374572591ec18e9e3a0dc7437f428898e81663e0a14cdb16c57801303e881dc73e9e22df12b9475c2c1c15d8d86bf688380fafc2ed889178639068f9f3c5e07c4a4be8d5dc95a26a32896477e42444f2cea5e07544dcac08fc0e611b3a99cae482feffb7f764f4b74fe29a7004beb740119ea5378676b8fbf2b474f0e00116f6546a64713a451e6789e697581b0bd87a5b0d8c82e002ab6108f9509710214294a9c8c17112a091d2a8b8db887786d1a299fc357cb9dce1ef62cb15c59f1793c01b93dbfff63df26473cc986b10d9e8bc18380c28389d0ee70db41aaf1ecbef9ca5c3b106afb815b7bf1b8adc657b7704759d98b56f1e3fb3f0c64edecc796dd64c82d8a45171bf1a85caa1b95f7d83064bf644afa6f798e017da00b9c777a000f7d943cd6aef3a8bd828cc753dfdf8fca80baf95ac40dd596a669c08f36226fd118b791cc0b5774a3ca605c71846f9a9ef9da043ccc065f835f0f96b8d13e3061f8c3cca6dc76a09156ddee2078cb04f6c3f3d50eb76b4fff4c0c17749c8aa71c19cfee31f2bc8122ac019203d363151ac1b6f73cff543633654bda5d8c9e72e8bc8edc7b44f506b3c481a3f526bd08ef1760c1084e2de234a91184a9f1b19a6da786651de795252397c31bcfda57348c512698b52c8130cda8ee0bc0345f8c9f7526ee0b1cb7837e9c967307654e039702704e5128744691e18cd0222dc19438bf1c56f9ddcf96b277dd104a721699bda7d0ae3ff67198021c7c07b34f983bfbea818253992933c8746926676486bfdbd6e4bda754071e4b7dbd9d116309407743485af32af00d91c5eff5065c8dc1f8d166f4932f80e41b15f082905f84150ec624b09ac96a09ffdcb40a8f5bafdbd8e6cdd596b273bf8e2c6bd6bc7c64f3fe60cb40a20f1e3e56e9e955d0907decee9901da7460a29e2c7cb079f15be875420a60f9f4f2f902a2e869f484703951e44ff53fa4034e3d14ada9fb566b4a02d158d02c887023096d777b696a699c4653fcd4fefe3b3394bfb0df42598eefa9d0dfe56c8d71e767b559954d9da4627950a9761cd95defa04df8364bdc7ba8329d68e09c814a212ff09003696df7799d73f6f3552d0a005cfcd9443add81231ca4fe0678fae05261032625ad5abc6a601c5c807aa838fbc6f4808ced4ffccb5824b3ffa94b595e605f954fbfc8239167ebf0e94571395fac575e9a3dc8bb316cadf4d4a12f3b2b6a18cdd8aee508e5a78b31f2d9117c310afd8999aa7b931ae5ba068fee90f8741a3a87da6223047877af02244c5f6aa18fe055553620cda8d519aa14e7b830ca75ecd03b46ded1b1f0c74924ff5467ca993e8dd12f1bb7f465baf875818ca1b635226dab9d6c05d7464104be3c75c8fb7709ffff8c6e14c4389d15f0fd50feee7254fb925fcbcd3f822a88d4aa78a2143ea7fb69b7b308eb20496ad6cf739ff3fc034b2f8080cbad06272a400f3e81b2fd9bcf939fcc6ab0c3e016e5b855c38064ef11341e4b24ccc8f38ccd2015751a81a675621c598ff5d65e9707d2c4bfc5fa6e6c5214debe44cc292a24892cfb2862567002b55e49f3d684325eb32d109fb3267f12df9c7698a55fa26db2d62a4a18aa665d54f7b37f4ed90e7ac9a038c5e4d2dd3440e3f111886e7564cd80c32146c72786abe2362227f3e80b52b668afb4fa76c6644354d96b114d7f75424c467158b1de2ad9bad9158d97ad5b0577d5c0f7d233ad90e114cc6360b273da6c9cd3fc4eeab45765fb3afb662eb217c0ca62c705ff560a820a05255263f0f81831e239ee46b68d078cd95c2201e453d644b83000c1e5cf2bdaef0fa82e0dae568df1698e4a729a4c140bc15df941609f4cfd8b5c459b3cad7144f59d6e8e5d01f9150928e2888479589f25815e8eb33020022fadb8e83e66590c1e441dc5b311a37e3a3b1d8d8a63eef9a7d8fa1dfcf1c119a0e10948359163eb3630e01137dcb9677194e93d2fbaa3a162c9e4dfd43033b51caed432e225f023fa8521186ed1399b9b8d62189d6a5deb6f586305e7c3a847787b72b67f1811e59b1fca26409ab5871d7373eb00005c40263e96764593f66740bac5bd5ec6771290c562b90fb379ffd5844fcfc1268c2ee3ab55a752fdb192b45deb77f291bd20cc9c75da96b9d2071925300bf5c5cda570e1a809bfcdf6cbe0aecc256137b44b65f2406f4b8d895c2aa3889702528ee534eddcc4e31616aafca2e56fb556068566537fc7433390b98fdc64f15397951ffe7f70a717de5b56ac130d7e1e584b61cf89e1759e93de2dac5a36954f824d62e87f3bb2425b1452fbe423297fff6548f40a913da71fe9cc59c46f4c10ed73813aba477d1c3f0cf6aea8f2ba4f9f0439681852a1cd2520240b02e1e6900964e06689097a0273724a7f9a33d86b41404a8a09dee42eb9c65ddf3b28ff5d4cbcb5db3b290f70ff6f55efda0986303be5975e42753e6246f515598e6b3b5a293bca2a1b3d4fc20e463be83ecfbfb689d98b96912cdb65e2b667abe884ef3393f44cbc7e0399235c2f86fb8b949909770d51b4f14995505d701568b3d75c45db651f0d1e212c4ba6090155aaa058a9d50229d47c180f6901d929d8f35db96b6d17790cea6a350233e96fcc1b1b3bcd2d198ea054f801f1e45039b46104e2bf9387925d58f471b14d8c05a650282c09cca2fb02a8751d153a41f00c013872d5e03f491292bbe9d0f394ba1b01ea8b2122eeac26ce102d1912209d90ef7022b60fd92290ef5ba2ca4c22a050f626947d96d3c409d5f40735d1883218032e5c5de68627d107aeb0add9298009986273a800596aaf9c4525074baaefe8917a8765d1180e7fb3c78ff2ac3e2968d18ac3a8c34d11d94e73ea7457217c5a29315b0dc7514b63e0c053afd78caa92a43d1d0f194921e7d497ac4cb1b7cf094c59fc07c0f9eb282dda4cc3ee67ad589f126c96de0dd6c07a658ae3c86f1c89381c3b0b3a5b1f99c790ddd19ce72f31a464691b22a1419f04fa1d69563cd6dc2d4fe7764103588ca9a4a99568c31cd0f0682392a708d44dfa00cf5e1a01aa053ec870433ec88013913ae1b7f47d55d95d7b5c96e9809173c9dbae3e9aaa9bee49db213e0ed6f4d5a8301d7a8fe7b10b351efd27ec604dfbb0dd7e83fec830a47a9bcb8f52af80dd8d24324ec1e51aca0ec2f7cd6f5b0a637cbae9b4db09b63d2945817408f1d01d7b1972e9a159a7a11e04ddc84d0c83c93b64b44531f1b09ebd53c52ded58b7edfb21db7866de7d39a0ed9d2bffd5240d0758c5cb5a1725dc5ac81d643d1ec872eeea9c299c687054a5648b33f39b0abd1426e9e3bcd117c5af7eb9c057284028af6ed761a32b7c5c3d71819f04f460fb8cf657dd76514b7cbd64803d6af4896c37d39785ca7e1471ddee6be5a4824ec119e2eb52d5db4ceab52230abc4182d15209a3cd3ca350ce9130a3f290545aa0a3a87cdb7bc73891ee038513f68db8694bd526bde261416870e36ccdb170bef91eee2de17e624c0c6de9643888a42eb52b5492aeac7419e8301073bb3248dffcca216977965393ae89631a259d8be087940610a2db3b169438645ea38236188a4a3a5939170234c209dbc629be40990e3b2e2e544f57a2fa4ca646a8c2ebbfd00e771094c9c2683b93c0f8248d9d4f480f126bbf778ec2365c09ac5fbf5b8c8401c3315b77c83b6e59855106e7b3dadf536fc64ed4efe22de2b901ac605e6ef8da6a6c6ec7a56dece737f8a6b4c9157b0f25b04a02ee6aec636df13af8810ea9297e234ae7f9c7c6f9690e28596f667185f360e506dba10e18efa7e6f7fa4f3a37e6974b6153991bed5486dafd6b278b8a6438baabd4aaa4fff8e13ebb99548e8e1469461b78473803db5a031de45347cdedc43a95716684b7b0ced1382c1e5023669debb221f8e9ff39b740e2b42c71309cc25f51df50cc34b10fb69c135faa78e3326408b1cadd3e4652fb700bafee56cb475333580cc4a332a65c02640c19fe3f7740ac66f335d3764423f00ea323ee2167faab339b7d66b94e3bb3d1d556f02084d8cc751859a416695eabe208aeaab4e8e456e952bfd46818f2809a2937a1d47154f6f800071c615afa9494209c115e28098a6593c91a4bdbe8fbe6c41ee0ee2779ca1478d9d5b0f479c37b3baeb9fb01bbc16641ba65951298cfc069fbfbba53216a709fe69616a491253112266ba5f45f97c6b6b60bed29e17ca25efae0ff80f550a6d24b88c69a9eb67bbea4a5cc32cdda0af92da9dad35bc32dc3004f34d396a94d8ee99e112fb9c3c77e611e88f5f613d2a5c56619df1ee0ae1428343ba2a009ede7c8f5c295db3de4ef2a35e41b88fc7c95aec00f0896d3ca9fedb5f2b76f7ea85efd81dddf70998b673442109b126ea211f4dfed13c52087f2ad0ca0e6c80078f93e5cd74d107ff4e51bc899354a618c0db3ac0031de118284de6d17050522d0329e72450a2c47631d41b1dc902ac691842575c72973a786ee834870604780c48c3b99ee2d39ca394f3fcc33bfd1f0c2554c44a68e27550d179b885fdb0ae3e96d9d5e2293cb9ba78307d3f36bc29f17a0784cd621afebb27fcde6ebc829b497a7d1b6c0a5e8b4322a1084fa830d89670279a69562f2211e66e0a082a8136b3ec51342c1c35b93027383b758a27312e8b3775900de6aca6e31da24290053212c215221dcc4e629a18d00866b6d47378dc430a714ee2b60d9ab32b092012ea5e67d534760dfe4baad78f2758fcf5ab403fe8987be593d42e5132a55c0e101dd75e8d5bcf3655c88db017bdb33d63f36234d9bfb4624e900b7a61658a03eba961795783e1086c89cb1e25e1bd15840b009bf6a30729de753202045ef6fb25420f028f163b9d0ae5532664abc771bbe6c7512d5529e9e4d4b3a0cdf856f127b56df864769b9c113cd7b358ade8a1e9d73dab8ecbde52b83a11815fdc1bdccba142117628e0e0100a506ac1715110c718ca4ffc4110d1bbd897badbed87c6cdc9352cd5b7738a1148212f51d909e68fd235ae1b2b0ab04cc96e8c5c8e8ea2ac03be7dc53e381fcbaab47b0158d73c6632d12799150118af108d2f2d5d2113cb47eb6e4100adc76f0a2e5b9a01c8c02cd6ed7dc82298433d6c44a25db02f04b2292d2ec9075c74671a27c4827a7748a09bb1e3092981b484a0526a6990bcce0928aa23c60d64b55078b807312aae8d2d13737f22ae528b3b36468de09d82bd3f4dd6658d0762e0ecc153547aa75f46ac20156390bac745048ffd8bc2a6f331c54e327333043e873f26f1929b743fa018df9248584ab40690f03ddbe8cb5769d6b25b034577895f40df89bde708330ab2e1e968c8aff77a44aabb5685cecd1f13b3c37bec160b2635ecf2ca915e8a53c7249da612c14ba7accbdf3700f69c940bd2a568384451dce2a009842b8acd03faf1ca7f40a6b086bfbbe0807bae6bf46ce4082765edf73c6a8c5401955a9f381fed84dc440b7b372f2b7e4182d354ce3e9c1888196e846b318598d8f111bfe7158d6db6ff03462a0378797b19af2e64dc0fc38448466d985a435c5795bf21a599a0a7a7c170fb996c81a834867af93798d9808c135425485411caa6aa4b7061ef76437d11286d9b1da5bfcf24de22106cd3f7aa39f80f49f67b25c70b154c0835a32e039c03aa167373a5e93093c1a625ca4d625dd646a6423cca68b21d5ec55f43243cad7ac669c1c7b0b44609932244cfcb089c98f308b55a147ca41c0691b5690f61da69b313074ebcae021b15c523ca583cceb98231653016b505b3860f28b124afffb61232c4c173484bd07fbd285f96037e1ac74411dec403869ceee64a639351405ce7cd549ba221f9afdea816fcdd1926c44763470240541878ce3658c17b0f8974dba2dd41f7cd57a624e3931ba5870e6d355611b12a04c0727db70a321134dfbbd8d14e31d8617f4c85499eef0617308b2a377513b8294b52e4c4e37d6544de8d9574d3d90ae1749edc3ea3d4e95f0953a7d20b50db7f718d2973284283ca75901ea3e93d5045e14c986f33c4a6b8843a3db30780ce8f768593d7c509353a95860c5ad132446ccc8b302e6d2f4cd9adfd0f41c421c41f3414e2d1a25baca6d26bf56fccd40102ebbb1e94c6a6e3532635874a82cbd8a785e9445fa3167f919a934dcc56c48ac638eb6ad1f9cd12b69905af6a31f9ea3b2488646d6e5bf86e33421ae5ce05a7be1ffc8c8259be68a32a4243f656f7a8fa7ca2d3bd4dbe47cbf57247e7dd0571f6fb097eb4c0283199fa2b9729e815feb6d8f48b889c453fef026883a72eec5a0b38d17a17e1c901ff591a21f5a097dc85bc8dec92aa0a879ca484f21735aba3d9f85790d61646e56d012215d69770171a5964567b830f569cf01e34b8f56c94811dd02cf790a3d726d2d450113d42c14da5f18db87a2470db374ccc0100f8c136812f4cbe20477ba43e9ddc9bc4969afe892210b241e88e5699a8b7a07de7fb829c5f6f05dab8b9e34cce667be6ffaa09a3489f91dd61d4cc844a1ff16b5a3be37175650dc35773d4336552cb780d03604d512852f9b7432a29cf0fb7ef8e1a29ec8eecd3a4429ccac84b0bf0f3f7b669aed49041ba58f5f8aabe4eba13f0494884d88c9a1a7aefb44f34a42d99794881922cf04e60b754958236365a854ac8b4f8007970a2fffc3c91fc2431a04ca79a50b1a1a1a6b52cd44621e3c96deb67333524950c98ed0b284cc2040234ede7e8015b3ee14c815f3d3355c8cdf963e0958b5d5f157d0bbb48597c16486262aba711609f34885e1a510ff8296ac1fd62999cacf8b7070c04360f65d10f37d82c49e78c4574640c6f652d36de7c9d03de4f7f086e29f981110d0eb639148697f572778093a2826514f3ac36638ec3d821f92eaba85310e7a70943b1e243e7197684fd02c4b54b0fc04503674493ed27993beda08ef3d8ecd1e00d3d0462850310bf0db46d8d396bdf2fbd75a240c795791742ee922fe7f539928712d82a24f69919c712c0919e0135627286a908b58938fff79f16637abf44f6939e6f7c1e188be4aa6445666a86ff2b3cc66f1be1144e7619833e6abc875169ef2c8b2bd89c4e688af4ea162f01429fb84d99ccfe94f5f4382fe86b68d32ff77c555a38412cdbcaed63f22009006086124ab48f9bbe2045478e6017021d360946075a8e4b278feeb137681a7d09e16b9187d1ca4714d4bce71deaca3e695c1e463ed6eda167e7c8b829d91c3f43b178c911645961aabf9a3d751b056ad68397d0b28ee59c8047955990985063bcae2d61692c98dd14187c7a0801684dec1922830573e45012ff38236964fd643a67802c22b07ac656438ab71191693589acf3bfebb3b3992828eedf2223a23c2f21be63c1740488aa857d783f5197b8b243b0a95ae65bf86c90c348d4a61697a8c9ea125a62dc3349fa43b1a818b3a9dd8f922c9c68a4c0eaa7a4d7ad2ce0e85eca75eec4f4a81985f3d91e67c3425e69994e6a650db398449176293ea96eb1d16e1120e4ed7383605f91b62c644c24c00337034f504dad8a14e442f88370c408302c4633b068da3a0f6364f26fd8d16f866e89def2bccb73e0ba8e7adbaaec147f5ae75c650dc8b0c345f986f0c5f2169ae52f80ac5e85a84afc04057187c85d53928c62be20d0ab409f8b64e3563a2cdfa31e23c26774afeac499718d416b44eabc42d61d2a2979456fc847d094556f10f95c7e0ba9e7fd6d8e2a3f412790b7ae5ebc5c65c1d510c712a75e2ea18bbe7cf601c983cad1a4006afc3cfd0615a555a04b87bd3f856e39aa92aa78924b6eb67e4b29070dab2f4306aa9b0a051cceab1f12133bd0bc70e7bdd55fc1646548d8060ff41b1273ff2a56dadb9cec2a607378b89ba37b123e4a2dd88e1471d4ae588a96d45aaaa414abafeea47d1f5730dd4914f7d06e1af9bd1f80eb1b4f26f67f109c86910ccfdf2eabfa31a71c50abd0f52b200fedc0f505075c3906a1e235dbf848e8b110517628ce5b24bb1508c5c1f95328b02e710b9699e46f2b6e8af302b23a093f63e83b51a9972f350d59030eb6151bdab3007046c034d97c4c913a9b7a1a652f2e855e4bed7d5adef723a83fa1d8a5ce344466167d7eb75e321d5d80fc5fd7c5764543fffc0240d260bf31c6b8a94e8d1bd87eb72e1733750ae11006f0dc4cf01668573fd6d55707b5332d4439c4a7720c251fb0db8896fc005271693df1e836db93e83fbefa743b45edf5ec1ff5d0c31e3b8046a7e540b8e9e95d10281ac497e326a4d6e46891677a05319fda1711d18b30b7056f1eb5c7a518487408a50457bd081591e38e605f41aee4d8eca9d65bd33740d16f7a261cf994956e362881b426f13cb7df5f18e6cf1db53b3de17976f7c5a181f74e499f1a086910f34f776e50de4e981ff785d632d95323ec841d0197ae34c08ee5d3a2bd14379f27cd2760babe930ba3d1c17ab05d171ee55bd475c98df6d0a4edaa60830a569e9a35d35ad12cacaa5afc009f5c3db9627aad883ed88bebd26907a586ca686ab96f727ff21dcbe09eadcbe5ab42e553acf2aeca5f6b6cc33fde9fe60da1f56aed577ed7980cb42a551c31e19ee7b9ac5267ebd9a3b9d5c233b0386030ed35f664f5b2d7e98a623f82e49920b15bce56e0e109c91ab5ae588c553b0844c337dcd39bffed1655aa450fbaab26bf00b3fa8f1667c36f8ab30296e8a07370221efa00ea0ba237f67d7991d81322e649b5bc6243142aff2a5b0bc90ce76f4b00e4cc28e4d10f19d7b9a179b24fb0fcf50669d217a9498b05d000f213c0e6c648b0bba95435fba89b50bd8741ce2314dcd5f800c4ca1743fcab2026c851b49c3270d68c400a8894833e4d8af69ea72891e280c820138e32c8c57ebe844d2e84a694b1d6d327f16c3a857e050dc93a56820e36afa3b777a46d9105eff0057569870c220cec64f15c841757d995fb88d1b8da7c6eb47080cadd3d5b18199faf8a5732e91af1013c5147422f70bce2a1a5eabf4f2225402acc51772f3cebc4e7437672b18e3b2ba4fffe038f80e55ded79ba810d0318ac2518c458e1a9cf656b3b65f8cc8572f966f016902e3651e5ac64eb0f374b82996df07345d80d6f94edccff686752158b670b4f46416645cc0e92c5f7f06d6eb226b8e01e02d16af737074a855026396fa4e769fb9944dba0bf0b8692a41da01de63b5897cac7836ad650f6bcfe8e72cb8612c3147b6cf2787167487ae2280c5240e69e480d4ac32f86c6d474cf2764e480f420ef0ec2ea42e012f0a45d7b0ec83ad428b8c581ee657e370af58e6568a03968ca57aa702769460cdd7596833a38b27c8c0e2001a654730beab827679442093a00f4decd886cad52f66d8dd898ae35259e4a2a6796d681de69d3f3fa28679f8b30e022cc63b546d4df619bb9dcaef79646b8b0c95053e9b138c29bd600d3b9605064a4cce4b2398145470dd6797010f97d42f4e8135c0a48a744a430834de72b11e7d78b0f92487eb8e0a13f80843e8da27cf7e84ccbcc88f162421e87839f377b38997935990e8a56241448d516cb8dbd834c5b75646e72358e5d498fbaab4ccf94324bcdbaf0c3976363eb4fae6a578afcb80041ddecd48f735a01bb006b0d7a9bd2e49c22b538a2149716950086f3d1c7014fbfe7c56fdf560d0881e1e0e048f5e5c30b5f0e9041f5985174cc7935964b3280d067879f5b2b7de925595f92f358d397c9b90f7166926751981121be6a1ca3b0f2a78a7bad4d222173a8f7e9914546edc488a61f5c597da9a0e5516b55bfad53f89e567309868b13263eadd1d2228696084d776343b454396a95ba2c819a069bee49c032c76a66803f9c8fe5ef860fdf97dcd3e0e39bb7f31404d08020a80c78026514134645f7c54c8ea43061f83a99272c027051bd80a57e3352ed4d732a0c3e630be1549bac4cc4083e1cf283079eb31e935e1b645d78885aefd225f3dafa49daecf8c9a6a7c8debaa9f4d66e8e08ceb73f53237d0ac4f3acb68780e63120b4a272f9ef173bce3bbb73e7c174d6cffdbfa1813d393dd125644ac75640603146f3c2c2ffb0655c02781b397cd5fe9983bebf041ec9760abcdd8458ebc6c8d40435250e9250f148fe422cf6283c86a3a134c1ac0cba486de1ea8c8c0e8bfd6a8a50c46bc6210319fe62d14066809155b1b2d51aa6ea4a536c4f2019530324f4c2043a95a1b8d5274546df9d9655b59b059df4f067759b43e56d167990e0348f555d574b556a56c87da174b890019941bd139b518ae0ed2c3f13258e3b61f5f4b1caee9bc1b1a00530bd5eeddfa615105fc235f0e6c32626896b5c05def798751965931f31894f028d69895bda92b9c4dcd27abc1bf385436efae9fe374a35e4c5eb33edf59fc19b7730ee004f53333fd491fd53b3e6fcaa72ac2e223c2b09b27cbefcfa57252c24029f999c31c8081bf38eb0464eb93c699778c0001a393ff0ba80de5f291e4e19f760440e469bb39c01f8b52b0917867727e8e34e98073b8702314a7cb01ac174532bf016a2a2b30c7590aed3a1a12950a65deb8dda4951c63adc3cc2b81f2e95a106daa1d160321e43f0e980b0d83dfba4f9acb848bfcc89090a6d0721a712a4c670180703fb70a18f1281d6feca139bdf5e08c18d9badac864875d2f9c6737ae8a57befcc52a5f2a186ce0859f719d0b31870ac6bbbd44aeac4b646a181f83793720c8cc55bf8ae3e0c824d33a3aa08b658c7bd4a30ee9b85f418b49c85305973627b0ff4ec52ff49d468dcdf320813067e236aa42c1ad1215b18f225d9c93d2c5b356d39257d441c9f81cfc98d815d67ad691d82233b13bcf2dd177622afd1fe037bb93c340b4ea7b9f95d20a72689a6e2906cafee527ab219197b9dad120d52b4bcc92da61d1aaa441ccbb6635dfe9f73c5c5c42be7b4ea9dae76f59c7fde0d53d1a4c2fc51d08830ba412a57a60f1c54f7bfa411c12dd35596d90c51f1a510346f4d6038d22e3510302922101cebe7d89db4029d31744989d33bde8ef7afd0f4634c9a835ffbacae41c0407f64599c75f510b16844f21a8b543ab90d771f34176dff4c5335d9659057b22fd483f5f02e427698b0331f60409b40ed8f64220f8b439b43a35b7c089335118988a449124afac61fc168de930a2c7698eb59aaa4b625eddc6652d2dc03bae356fd6f7845c1f08c1504ce3e12a051f283469a2820c5155a58740075c70ddb50d4748e8df0940d103f0a083cbe7c7c1f5db12fe10991649203863801accae68322df30104162125cc64620eff520035f4ed533bb40d9cd2747eb213f4845970cbc60676f932601013cb3806156a1905cb745adf75d9799978011e730d13338cc97c9f49b95c5117a10d1e6c1a923288c5ae5d25f0c2c075372e93086d11a9840ad4968561434d951bcdc3759a22e263898ddb469480ea22715c5d94f25f0194cb72d45788267f9250d1caa8c835f175ab78848c5021d083be5c9215deb58ab2448f8b246d718d944217edbd1fe5c36fd04524509353a4a274c9f1d476894750b038dc9c79f6beae1b75a2c084ea3f2f6f8007053d138445dd8582264d1374482793fc00e3f0a872ed415d0b9af8a36a824a4a9ab662fa4b469b344985f9688f0000fd2ea9aec153b34ad102e0e3c1760107e415ada494642503bfdd102d40d3c6348ad67c036e2f023f3059f3e17b5b7fe24a2483bf0f68aacdafbe83ce1b938e9b77b13d14ce5146ca5758bf9dd95fdd4f69cd852b2af3966d613ce84111a193db4459c3c41402f24d48a01ffc6d44e7497071b503a144131966ceb15138d293f36a610d2e083dc466ac653914acc3baede8939656a2f804c079b809b7ceed5f92b681b2c7ac9590c125dcf85f6a075fdafa1243531d4b58e1bed47879696c197d15f21ea49215e6054902f86c22a9986c1c04bd59e34f352e16abf5d80fdb7b1cee222d80dcdb56c241f58d96c2e8249ed63b68a6e42da5373d34620824c57720bf6a46677a270bf94a1c1b6b5f64bb4b70dfb3ca898e4c860e4cef84a6dd6fdd390fe4f7915eba5d90b01a876ac4bc31a4eef24d353987cc7692c17572d87288611dd08606457b933c9e140d837a7fb8ab45d1dad4e2d50b3c775a142d9b67ab8569d13f79572dd82f97480c118e4446b600a011a96ab2ac35951b6d863e6b67ac366059450e7acd559c0cc4378e6a984c43140a2af9cc76bfd4564dcaaf2d44e449bd80ff61d090cf7cc7d836071ddc9c9b3290aaa9322b6cba409e1066de9c49e7e4d904b4c5ceb62596e7b4c367085bc5807e15e1470d2cc9a4096f9e033e05256306569be6b85d6b002d7370366de76ddc5dc91644ade90f7cde4bf15e3cb10146ba3e75e18d815617f6f1bf77759a52a0e6878a8d4e80dc17798fbe0cd2ec87036848a18586c6ebdc9a8b9cf12ca320e4fa5708851a043558f1cead17ce92c7dda3c6e727519216b19aabb56cb31644da87c8535e5b39553d28823a52d4c46db4cfeb45fd2b6610e91c07bfb9537aa615448b8c207f17653174f5800e0eaccf3957b061201052f9d3e9d53a8b9458030bc48d5da0c7b930c969b493bb554dafea307c59c482cdd13d9569dafc2e62e9199f5ee42ae52b78fcc9a96593f1fd2630cf6827f8d4fda9115380fed526e35c5a2267562ce748daca75a0ba8fd7f7f039d69501e8756db07d6daa8299216490712af10c188bdd66f5fe1384bae6249ecba89ce96df8ad86e0dc22b3c1b73a5b1b530b3a0311e7461917e5f528768e91a0866c49c93c9bb61c5e046bfa9982fd7dd5805405754d1a66bba1e7744f922720c4e4684c5dee325db77931ec69c32ff8da5c54d7d3ea204cf6fbeb2860748b6f9564fe8c51193e1747a64d75b366f816a6f21bd7df5f84a9c6198b807c90ebd2fcb9d41a0c37f55d0e75a94787a3f987b9e33cc511e0c7b9683048462c2b0a4db75a73054c99294798eb2e9c1c0d6311a66451a4ac74a71808573b6236ecf29a19dbcbf098d440443ea8510602a7751ae28ecd9df52a31da809d54bb3964d2903d66d0bd432d422161928b176cb7e3d826cb2b5f364a0ac332723533e7d2e35b081b0392ae954d58efb187c03aee092bd0e7421b28a0082dbff27539d54e2a091bb5df0ff2fc180ec29104677dc6b42497a3541edb6d558e8081350236b9531a368db68c209ab0b87c00dc423d9cbe6a8e7634be38dd8e8ed0a0b573aad1b4702293301d9236a185ba9d27d15878dee2008a86d0be6ac246e70f5927df29b57d14fd1f6c2b91d4562bc9593c1291eb02e64e433e2cbffc8272bec5fb420fcc2cd128f7bc80be0fb0cb8345a0e9602042c4c4e3ccdb11b1cfbe80449307641d441cacfbaed490bef2e0c9fcbbc96165bcc967686c3ef9c05f5bcb112b5b087283912302439e3a9e2a9448d36e96d211d87440f7bf76595b8d92140066e84e57cb84569758610aa7f1335020f84ac1da90b09f78c7b0cebc6e830c3183f7d54aea89865b158c69b715aa82a4ee4217c160db80a1b80122d3b37bd2d050a0ec2d389839ef2b4de1d231f070419ba3b4f47159d2e57052c2aa498c74e9bba86038810d638f67066724d0672b939958fb4055c2f7a079356a0ab96237e01356907f7bf260c53df0ce5adb8c604c013235e6a39415c00ecaba6564de8f5638f323f2d4b8fba7acb9d8243a52800084390def776e84afe194e93df98ea200ff1a4bdb3789aa5617f87bd4ab38f1228798f1e2aadaf0622a9a6f22c2e9f72f77b425c616d0574aa4bd94a716db60129869e5e945efc79a48bec3811763490d2df016241bfa1d67ddf69d16d8afebf5253db27be2546924af392672d7674aba0f1060af6783c4f42a8cb789198ec64e9fddcf0ded111f91c1802336e0c6fa78b0a9a851610d7eba5aa76f68aa561dc2a06468a2abc59ba791219febf882323eeeaad26f090a5ad72de4b4a675fe69adf5786d291a51872723c77f5475b524dad52d44dc750db8431ae9f269789710448d94073cc6647db5ac9dde954d5d9d2ac3695a4f96874840b8bb61fbef6e5c6275990055aba20c57b17ac20a895130100052daf9e3d6e0e3449a49cc13fce2bff828fa738738721c4dfbe52a491d8438b543a266ae5fa3a95e01092c1a5bba2d1f48f367c81f39765df21c5914209510232672e3784c328baef601af0f4e7f9363beaae9746747c42928ac210f5c757c2f5879bded13d89964bd7aafbe65b808a4904df0a424972532c14a44a1a3b62775ed32c1e2cd339297c153d8b5d8d0eb2c60fcf10b86bbd68161f0e487677acf390a15bd486f091229b3b6c79b59255c8a05aa34e05b30038bf69d9915926e8c86e12526a96178bf6c0126babb0b40d0e2201a096ceca041c94640a8bf8361082fb3595732c2c82ab951e2409481d7612d79c08ba3853cc721806f625d70116120531f32d3161eb559cbe8bddafbf21a179dfde73386b597cb1c9ca80cbb80254d6b5c8c9ecc807e82d5944747dc8a7fcc5958911456653ba41bfecd78e8b01fdfd2161c1e404cb090d20dee2bfa43b24690e0ec26dd8adf2d60b422a0d1caf0e6913cf0a45d35343b92eb230c0e486ee3f190e670d3696947f896f9978cc200bbc49bb9a9433c9ae81de821694800af06f1bb4498e722ef60a056049a63697b1168002d2115e73801ecad7071da9e8a62a208db5bd78378962ecc6c150b3e049fde9f4dc4a729e277e8c1dfee354221b735a1180573676cb0904c283b5d13a5612e31b71284eb4d270262baad3ee255dbc92ea92686804c5d8ed541a2fe0468eebd3e008ef273c08cf50392d7a18bca445237cbc9f54df0f072f336ec1e394ed9a4d4ea4ba41289ae4a1a2d290db226cdacae751836cf2559503a0418785d4402e9305c54da41e091064610bbe7abc4d19d6d8ab901462f3f0b480eaddaf88612db4b2020309885254fbb66ca167d1f44c63d3369655fa844afc6e5b6eafa33ffab225b6367ee5bd5aad86f39283211d6014abe3fab4a44e8a923d6a209e22ec171dedd00fa145a001225cd783f3dd663d6e7336b79ba4605222f0daa1a2fe4628b09e28d517fcb6696b5eb23dde59266fd3023b390a0f8281eddc8e2d5b08ee1342f339a433bcadcb72422fc37e4ff7ece0c91542d3b797b32c5ebfc1dba97e0965b9e6b2e734b9622f4a223ae26d23c969ec730580e3270f09c354d910da54dd8092c0068562b28996b81da8478eacc288fb875fa443525886630f589be4f1ee89caf78b43bca67f9e8f0a669314a60d50c0440aba325e17daa76cd8bb3ed1c26ee8fb2d0bf5263491d4684c445e78513a53ace30caa23fba022b035ccfd6e245139ceb9ba2bc3bbfb9e3d68f83948cc2cb439a4a900d89abf233ffe901741a93717ce3fa49a4a52018f33a3960921c0cae7fca3316764404fa2709d4d66b17684e4d2c4cb407a6528ab112bac0a73558dfacbdce9776c5110f5d054eb864c9006cc3488ac84886dbf9f26785888c76737a439547e2f66b069173be4ad4a42cc525c18628319676b8ca5c26a6b247fca253cc201def645237a435e01a2f08bdf68cad45a80ba998972e764fc4302f6d3acf36dcb0e87a187c369fc599210ea28c666587711bc597a410c58ada505d1fa005a2024dae16c8cbbfb1cd8c85bfc179c354d1535ec28be685bdc673ddaf4eed97b7628c52003712521a5158ed90e4200731fb736f30a809fd9191ddb0048b223fc87f1b0c61942ba5f8cf6f73795aaea1c15b0b74544ad6a7718ad966eede7fcc01a6d62d0f5d85334f79bc83273e8615306bcc7a1d9d46f66c540ba0d324fd4c64488e977895df5f4a06d0c81639f05de9e433c0f426bb6c67dc1d97d4bcd8f007bae04f4fc111bc06356d08f81395336740199f2ad73a723ee0a9730b522937595847ec0d9b10c6c2c6c60dd0750d8742ee967d15411f89ce3dab5c56f756ada1c6adf0e11f9829d0efe53326ffc2437d895090630ed8e7bffca43b1cddbba4b8487a0461d2882154ccdfa16710e009c14a3540e05cae4b3dd7140d218571ba6dd5639d9f3be1ab5e8df9500813e43125bb0f2a49b9e2f4b17e7cfce4abd38b0a8170fa091ff689c68ff29fd0b455a5336a53b2397e4e4d2aab68d167b8d6abaf7139dc69393f4036e5312503debf8bf18cfa72505706ea65869d6975cb0c88c456164fd9eea2cbff7734140d2543824765696e968af1a158f907800c8cd89d1ef8ce22caa71ebccf9517fce43e8389da02c2985aaacc5c0f006bc649b4e92d6c3315e0d2155f6e6e886a4ad5dd320f62f4189a7f169ae58c541e4093660c29a926ed6813ac714ac002231385b9974534ea5bc1a1ca0bcccba8a290504948e98dcf4cf0de328c969ba1213c2386cb3afa743666a27cda5529420d39c5ab4914c8dc64540af7e166cd7f42966d6f65b1e8d4c3ac9a39b6188ee2dd70b3fac8deb5c9a8f57746b54fa864087786eef92e43e4cd3b98008a40da72ea3022b54120890598a464e90b580975dcf124284a4a07a0d3221d9900a68b61c3ef3bf818fb3fe2b4333088d1ed7423ec595e28d1d6af277a86315d1531bfbe139b23f7553173dcf44eec07447b5e5bd63f3e28e337222128b4ca47f09d4a95e2b73ba220b82c4f89e03e695f3bdbcdc08ac026eba70497f7fb9eb3ee8deeca2ecc2fcb0c19bb97c10938d49c6e40b31759746103cafc75695b30d02a6e0e2419585fdb9680f25be68953bdd0fc9ed6bf765b3fe65b6c9fbcb167e9d2567766ec025c36d44b054aa40634d2070030755f5886f61f1b7cbbacc0618f66c4238341bcdea59b558627ba5108a58d9636096d22654a32720691067206a510b823fde527263da3351c85c9f53bd725db17b47160a531238346f679c6388e13b10c854a947800fa48039bb456a4aa28a5f45900010e4c2b8a23773ad05e6eb101dc07e9728b28f0340ba8480fc5a916a039dd84daa83a90806cd29af9abd50823a050e3e7dae7cfb5161a42a4859a964a532b52036948d554aaa3dd8b3d9292f093489f6752254ae983e4c58c52489b518392f43d2cd267c64a29c35692c87b6f6a5549232d5d34e145b2484595c8211555a46a2147790f39cafb08da4988e0d337a842484ae983043cc34a497a1f241f4051b690fbf047e22c1c4af14ba30f0842a50f121e48c652249b840fd342088d8682e72641da912158a447c890effb3e8ee3402745e1b65aeb10aeacaa0ae2fd63103030984d3a0b3d08c521b15814a782396a9d55a37a54f31aabad22973951f61e9a343b06062e65aaa514ebccde900557d5caeac174afb2688d0db0e9a74c1cc50fc7f0794aa4f8a4f0395605da74dc69d428c730f8fef5e571657540843dc37c8e3f4fdbb642f822b942cccbb4f83c2f2f92fe05971ee310631bf3e1af1013be0be50a3a3e7c1e980fc3871175fc3b78826ddbfeea3509ade907038331b3f6865e54553039789e07f6a017faacaa5eaaec5be157107a3030c9041226c78db11e0043beb4c80a54515e595db0e9af9d1fd2977e2b91291299eaec151dd6c1139866fadc93d65e2fc97f5f925a59b54cb3b3d34f1d94009b5de3ecb8c3d30557a0caf2538f25b0d935d683816bbf9a8d23ef39fbdf83206843c682dfd8f6eb784297fcd907c75c4f68141850bfb1bf45134eb8df68df1b4fa099fb1ade3b9ed0fd7603952329a535dc386e134571cbe7c2e71fa0613299acc99aac355993b5f685439099468a1ac1d444bc72c494f04baa34ea783cd2f2657cf9d2eb18f1e718bb7c11ddd536fe322f63c62e5f465abef028c3830b6054625246059ce3f1d3d285b234caf0f858366ea052a5f42991322a94fee55fc8232f5f22495136e91e4929a814c722cdea9c4e426d1c06207280d5d5eeaa6290bb56394ef1ddf5d977c8fea607e52610a0e5cbc37c8ef0c1ef292d0bcd218d41553acaa0aa9835bcbf1d8e791b54852baa4b35c8fe554b972ba6bb3cb0c8eaa7252b3ae98cd2603e07edd7cc36732b6aeb60e460ec7124dbc65fc7e81f23e2d767f3efad2fe34fe95ffea7f4f8e4287f1947eac31f8f32a4044082194226e1ebe8bd381a51fa9711e896a51066ac317b84ae22bd1bd87497abba5c2e5224ffdf5d2178dae109c28290163c1744877163c78a101cd785248a86cd8ed15ab3825a3b1d110ba8485579efef8d29cc6a774dc8a290c9747464321d19c5e92067e1386eab57fcc8ce35953070bf8e141c06c63ad96edb26d3b9332864518837f4bceb91bdc44f3784b94e1a31e454299009a049c1e5da26402350017a823120406b58ad2025a7927347e67119b2202cc14d642340f61f42cb4b5a1842e4c6063c84765de73d78bd053ff90b9101770e1f7cf3bba0e1d4dcbe9337d05f4158229a40c518c0a715d57f89a4b2fd6fbcb58520324df2d8d4d0cd30f5537f7f87202cc18e8237f11b93df701c97026361a660118a23e694873b6290f079f087df1f1e293de9e57d8e34e1293dc985f205b3808af4801cc779de756f0b3da8019bb456fa23e18b7f84f4a597e9e7113f7c17659a7c80f8e1ab20929854a144f67861279e208e46fc54a4b4e27544203be1d3cc23922179bb9d4aa46d5627095bbebb3b446030f31a95ed1039b7d0a47aecd43e17633c26d5c226add55aad71411c409a748bdc7f3b8f52b9228245d11c4a6d2cf8856f9ecc53ad95e36ee7c59820924824d248436b788218f16070d1f868238b6d73f721b7d6dad1b65a1447048aa3e383fdf0d3cd0cd8f456cbba075dec9a9fc0ff9e0724cd366a1a29761c9d53b3681b7f38284ef5d6e8ad2a404a7e5a3f4c26134daad56a5d1be06c597e6a2a753a61278dccc400819f0421ecdf2e27eb9fdc94697d5fc5a4187225d69eec0fd6de60c166cad48ea274046a80289c135355dd7821016a33d22b94308256924619354a1a62d263d263fc47c40fc3a731a2178c86442f5807c17f8b709750e0f0f1fbcc6451923e1c7da81433204256fa20b96b942412494e15266437424efdc4fdd643d4f4d533358d74db2883c2f6df6fef42a6de4b059828214f1f3836133f39d94570f11325df7b22a1a901b383bc51000cdc41de483a8b92457611850ef225ef2872c92e92f8c5273d0f267dea142c56a80cb15865f8a5777107f7484f34b4bc2a0a268eab8a6a56cf2b6de3f0d81236046db31ce55c77b3288ebb9348e802c358dd2416cb7f1ce5d67eb7d9eee9563b4a77c8308be27493cef2d38f122ec04a64ef38bfe9945075962c6490c13a6a56cfecd82c168be534d81facdd36bb6d5b8fed148415489c342ca954ca9432a54ca9aa329952a694c933997c50814d1a9ad50f2999005af0af6a2ac58d717e5a70a02306e6858333069f39ba13e64c751771bc91bb3b2bca29edceaaf2f2615ef0d825f832ba0d38604154821dbe8caec40913b11274da15598e6af83276961c8e7095302387c58712acbe6d4dedb66152f7323616b3368e4a985154c1599ee7acbbd2d16af5b6aaaa0b9f23bbb39eabae7563b56b5d58ed5a5d6beb468f0c5af3e3056cda2319d2d30c7635f40d103ff9d34ca97424b092fd372b688effb4cdb951f19bee65c022fb6f455bacaa1ca8a23656975f59543722d11e6df6c81e9548e30dfd74765de72feb0655bd90eebd5e2239024dd9a3aac2640705a532031cd9232abab383d29d22d941f94a97557a3fd2c457ec80dac61fb43de0d771207ed3d5d0a78e0443d9dcac9cdbe927df8a7e3a67b3826e1b163fdbd6cabe013526edd1d9c3c6c21863b2eb649d940ecad941e9ceeefc4e92c7e8e0c509c45a20544af7a03149c8feab1f3dfcd423370ebdb70848a3c089948d89deeedeaebb394bed939710ee7d1721c4051625920f7696d7237d4843a50c5b79c926fdf40f404b5af6986dc030740f1ab0bff921d09a6b4d3ec0bd64edbada754df332b2b6bbbb398e9375dbe56032f732abb458c79ae873ecb1c04c43c8fc871c6ee77d2cbfd97e86fc97de477c9812e953fa17da25ca9336ca41e2f7217d8e87217d708e87799e1c6493f08fe47898cf41c290474a0f23f300f15f9e47fc175286fb97a76548f2941e8694e1c89d52c7b96e75ac89825a49ec8d233f71f15ad3ce59a681b6138a45766bc7625d80624a6ea04a280ecd9e92ff6ddb686231d04bb09ea39e1b22ecea31c52aec75ef6a7523c3e68ae3b8186052366d17ee88012ed97e05a1c0cb91bb560d65eb69d92002283019149b7d6ab37a4cb5d6eab5d616abd4eadd54557964d73a756b2e6cfb8abda5cfe89caa44dbf8e374adc9daa40e55a21aeb1a4dbb3b4753ab7171801bd74351fe20393baa150471b260b35da7db342d6d032e5bf2973306c5f17ee382c492983951102222b79bed19d0d3185d06a5f551afd162d01a1f560f6da583121d7ddff781e0f7b5165a2346dbc4e00644456d46f6ef2cb4e6035b8c17689d85e27cefdd400d1ad09a467b42b485155140f0d483467b2902acb57a80059bddfac20f77135964ff22b6146e4ef766f3d03eac6a0a6791aaa29e9b28054ebc5c4b7ce0a195830e414d2a2c1c3bef5455912ded1e7a0b4a91aaea5685a2a4d5505aad86829ddcee5aafd5c7136cbacc96e028f79bbae5952b8dc73a0b3aa786f18242f692c1e04746ad5c80e2d4ead1513daa2a97a2514eeb018c16175758961462443102838b2b64b2d710af274e8eb0abd593214a2910d86e9bff0f534e907d0224c11b394342176cfe535a37cbb930a601eeeca3858f78e4999f2e1ad88b3ceb39aaa909501c9bb302c5e9ee187415f35cb0f75a5b6bb5b75f3e22689b23ad43ec882804f68aa04360d2a15f70626356648fd24f4ccf5e873b7819278753610d3cd964a22891e4c852de386a70628612493f59419519ca4b726fe254ea746a1a9b750ef75158ac1b2bb0d9ac161b50df44a1fef65db7f641033671eef7771185fe0ed42e5d440734f9b46d2cae5086a8370b067ac3ddd84055b8be3e60e16de38660fac114349810931893ef76acc6623199959999999930707d738607bf29d2e257c25cc68069f95c67b7d1a4b28e1b8d705966239b057403fc2c057081cdd4977bfce6662b380cec45c91d0626657386458f7e8e7a840cd90962b76de3ce9def05b2287a06564fa521844051fe211c8570cb28b8eb4a29b04c0e1fe4e2040caac8c08d1bd4a895fe7dd3049b74b6c2323660efcdd56c66adedbe214e2d4c45fd354ab4309962c394253b604088165469838d25a01895fe7f1219d019e526b78ee33aaee3b88eabff41dbe6ee4361acaac254bef95e10d0c0cef21bca04a895bf76a4d3287fc9664228aa9f4613bf4fbea4c5311c6b2a1673227f72a3602be816b4182b461b920d11c56820a0816d36c34c67465e48518320569252c7c34e015ce0da71cd72a12e8446778236414fbe028a728fb54dd10d536426846834a1cb625d17aab5566badc73cb6c54a5a9ae68122188220add9a82109d6799ee7d9679fe75313c8c1994a9de769ea20280a955a726e5c672b0e2d1a92d0d989c9a0374bc702f6ffefb802aa1a52518ed39ff304c5f11a8b298a8a865455cf664633a399512ba13535b4cd0d44cc808c78a0d1d05fd7d038df37110d04d0ec8b591a6464a1cd281090d3a0850315675a3fd02f5f1fc29d501cafd5b7074b35b07d57555557f746b6da956a9ced53ed3978ab0d4bda0e6ab55c9b75d25b9cabe53f0ef396bb825c36954ab9cb97a4ecd76c496f41a10324b5ca46e01a2443c3ee6a0de11d5dba74e952fa53f796b7bc257671efb66d43748b5515489bd22e752dd3b955a0aada9c5094ff935694ec0e6eb14b769456ee27731cebcbfed45b19688b6d318a43d439a4ecbf41f11bd99bdb99b7998f38b0b9c562f55e92ac5bac61b4a65fcca08b9b919faa938cf09e8a2af416eb5a5b156855576f6473269b1528fbacbe6e05aaa82d66ad8de2c5ccdd7bf73c8fdc6215e5bfc13621265b6cb5994cd65a9a542c76631805f556da2018579436a473729888629eba40b8754f36609d8f48a7a23148c10bce40410e50a8512b2bd7759cb55d67855c3140ae03aff781a7d33fc6b5fb38eff32ec61d773aed2801ee5c5d2c205bebb6d58a83ea5ebfb9f79eacb53cfe0b4cfdf4940d196e9a1e3f64d65a6b65e82a7107c129b8e260e06b55061ae5947629eda7e02dff14ecf9a7e00e2ba5351429bd1e5561805e12b098a17486ced099ae86089b291838a186093667c06e26b59540002d30c601fb30029b339976d083d608790c01fda3296d0ad119689c41713a9f71063de35a5aa447c8900f04419a10529116453ab55ed995f91bdb2dc99aebe6ba494c60eaa78fca6a15337109cda980ffe3ff4755350b480a26e8e4b2733c6ed6ede2b64547c6926dd1d9f23f6a4e321d0ec6e04e4e0b87bdc3607f61b5d67f8167d3612817a6388dd3effe7d30a6c33821ae09ade1849cc016760455796f9d70166661fd4e4b8e0550e00cb6184476877dd79885c18638213f7142f956ecb556eefc9490c4195a4322676666284edda2c5519ed35976509c1e83d6b8ed3a6b7718e1fba4130e4c1689fcc70407111bd48c1d9779ecb6b0ebd52b98823616548687b3678711be292f53f104237e0273c3fca6fb0e48a1525229146aa4344a73170f72c64f1ef880cd269ac944dbef9001ded25afcd4b419e07edab5dc1be1664067da36deeb782a95f25aabc552877a03fbdb388e820edae791fa1e0cbb867e7e230dcb8dfb55553d80a26a1553b049b3630536ff0343f0d690d298f0813404bf0f0c9b3459007bf4781004c1a70161b46090ec410128f87b4e3421fcb62ffcc68e5e0ffcfefd74fa4ee071f2537daffead0f7ee10e31f097b3046fef8d26cea68907f734aeb2253d2d20b573be1421018bc13a44524924d59798b1cb26e1739d43b7e812684d3f915a18ba8737fc4bc6f4c78c28eac351b4a686eb1c03d09c978f19bdc46397a491969dc3b58dbf090ba5bc5418b4f0302b49a48c0aa4203dce2845524605f1494f228fd08aa2549ab4c2e3096c36ec042be988e9b86d8d76833a0c399ae2d0fc793a3ee6c6a327ffd067a0aa1910688d0ccd0487a435ee23c644881393d3898adc46885ffa01744b91ab63771f38f61234097aea26284ce66305292498cc60dd9a1963c65b51f6738c30e10fea07c828f274a2356e60b361b01a3acc610eabe4e974d22981d6004961089122467a4822e8305b64510c799efd029f540ab82b8a058ea9f610bb5b6b8d19f1eaacce3c2eb6b7ecfdf77d1f4f90b6027370639c5ce18212c955d2a4f4dc874e0907f89180ecc2263d79764c2693098bda2aef5611688d3f95e978aacfbd045909b4865231e5cc29e38ab0da441833ad29c153d8d129dba696501b88cebdf75e9a5ba361a1d19c3664adbd1f057bd7d9e0745b4af013e7df9dabd7ff60947c512314193315edcbb78cb5dce834cf1ee8804b309d06c7ec8a5b794ba335ac9a85a2fc8f300d4133220d27c309adf1df394f8ee3ea122d0e8756abb666666a6ba6b666846899d9366ba308d1d2ad7a512cd40ad471ae560daaad1a54c7fae327252cc044fcf4e33df832558601a60b79233d763f7c15be17c923e091263c20e91fe9473cf23a51939b26abcb6f2a48a9074a60227e7a55215ae34f00294160227e7291055741e75825dac6534071eab75cb5659b38149711f98948e5325691131111715bad9bb5db469403ada93a34ca91a811610404cdea5099a0383954242a1140b46acb555b3fb886b0d65a6e4ba552a9542a956ab55a39807801a0b23f9014a8a9aa3245b9007ca400d7375395c200571d994c26d3e9e2fe8eec0fdefc657a8a0147767f8ae35d67ad0ddca97f9c0bcb6b65e0cfe70c485151735dc76d5bd76d3290451182a7aa0a491b8bc56cccda6de3429b2ab0c9c52c37e43744b1283476ef142aee0998c44e43b1588c28e627ce6bada713278bb96f5bca5537b6c3c24f36c3f30c21683387f1ed799cdec8feddf6b96de3366edbb82d95aadce93928fcf0c33034014e515bc4018561188661e84318d22a9cccc9a13533e33ef37d331487547ad29bf4acfdc168f959570d1af82353defd5e701e4bdac64680de7877070ea3168296a0088a723872270104ade9a2767945826a1d94aab5861ef2b06ddb17185bdb7527ac563e7030f9b040b150c185a2e1021a069d41d7eeda994ca698f712e2f5ea57fd00172e31dbb6c5bc86f07c8413caa4dadf68d39b8d6c18f78a11bd6046a0d0177dd1fa30c0f8656d93311bc771d6721fd0f10024c15c5e2f2ae018b5fae0025b8ee32cc759ee69fc0c53ad2653359da6544c4b7137ca5c0d45b2cddbddbb992a69fabc60c1df834e858a4bf113955b44a5aff8e99a5c80ef69c5179ff461e8a77884f4e2872a905e7c2aca5c5205f149e03f809637c8d5ad9383659f99ce323d66c4b3ad323b30e0527c5a6e61b622b9599a9f343f47689a9f2e458adf746ffa13f866eaec21244d04901e6c95fe6be1f75aad040a4c8069255a9f3404e41d1764c1ddb66dab13f4172d47a4f168b5dab61d920c51ea0f522366970341b03d4f34c103de1bb9997b0dd0ce65140c804c4de09752602e7f0f7e132fa8e2431155aea841e90fa648804d6aa548ab5a70213760f3c70e05a0e0fb9d078ce06c7f7bf08e1c116f4ca101d4e6874e57a306092ac095f4beefa3090959e05ea2deb5de53db31619c3b5e0a48a2b5dd752fe025230801cde9a1a44684631956fb6bd795ec4a95a22b2ebbd255bae84a5f91c9fa4abbfb518f5843cbdb1105aed90ca388028bd90cefbdf746d1e16854673a34b8d1019b94560681cd6e5199ab36d1cb36222d0ed09c0e82daf8770ea5bcc44acbc711241cc9c26c862e22de68441892426e495fb08ef3997571f31b4268b48ebb5c27c40c23d6ff735dd7f5d8e169b55a2f2d7809d1d75a5be2803b9bb65a6ea382e4e96aedac7065c856b002548366ad1e3bdf093a70a86bf821796bada74ee9965223f5f0c33777644a222fa5d7cf8deb8c203dcf5692481f24a5f846903e1c816e497ab034760c5c600e031162bc4a12e83f586028aa3164b105c8c220c6116d8b818a1f66dc14326451d44971bd717940a346bb28c112ac6fc9141a1896c6d6218c188a4ad2388018946038460d8ec4b034f60b5068889524120993faa7a8a204b492347ed04609fae8824d5b1b82e67cdbdcc03aefbffb7edad11a91416b40d2ac42f5456bea10d4c6ff23cd5a047949f39e155593e99ed6aa2af41b1b50d5539c8dabf539e42a1fa74285c751fe3c78d0d0d89ab9326d4dc7a6aeeaaaa2fcb454d6e1771886a49f1565b9d8236b6b96bb24c7751dc771f53c3fc73fb125c02322341b65bfa9141eb1a9a2aac03d7ab4a6bdcb030a36afd93b64b383b2374ee7ae5fadf5dee07a3be0d8a15d672db8030e9cc11bdeceb144647f97a2553d8d7230b8e82b4c4f60268e90b835f4cc75e899cc0c582663d93ce3c266d3da0a6db53275b5b35dd7d9af3361c71bd85cb5ec7b9174578d4255ee79501bd1927016add9821ce5ef4968bb6666fc4423c108d3642d1b8e4c5de8aceb59efd2b8ad5d2d136bb40c998cdbdc067a829716239ab3685dadabbaaaab8f032cbe7c02ec4f6d8d016730fdbeef1463b2649c5af46d1d1fdc98d225639ec034b7076e29344fd09e3788d48468e1995159aa07a558747cc04346715eb265e532284ef7352ed96f8f761be98f23fc2ca0223d2959ea53a9549f5505634619345c11c48fab8849d01b696cc966cb8aec17f44c43ca998695bc86944ccf3586c8c8f4ac2529e228bfdc007ac0dc8377003d544ae9d32ebcf752362a94ec4fb96c323564d032f155a3413ed5a092cdd672ca66cb6ecc5476ef8b5376ce644537752fc626d3ff69dc017b1b29c2047faef917190373b524d99fc6bfbd7bbdebddebdd5b6532991012a21843e53acc5182eb7faf65a4d98095b0b6bb95b80853d01bae0a7ab3a984bcdeec99789fd658268ae996c7887a0a2cbb4824d2a76ddc81da0d925254488e5122855414c9c51a6d78d15d641f6a4617d1681c26136976ab9bd84edbe69d0345792ddc2d6aa9effc74cd317955c5ba62bdb1625121d381250352f2d3fa61ad5806a0287fbc45ab752fc626d38e9f7af058d14b60f860c516b3d96ce6a148554328ca3d3432ea51579e370b0d200536a9d1d7f7de6c276eb6a06ca894ae986c1632120000020504c3140000180c088442c16058382619eeb37614000c5c7e4282643c9807a44918c34006820c42861903000004106366086a8a0358cbec775b8f0d626f3480865b10b1be4ad2505a10d71934ca689067afd2d3a611b99b8ed140ed30abcf1a9340e3220eb917cc5ecc9a2ba0064c4be75ed1b23a40d821f6b7e9f50f68302da42fc88b018374cf72910b0a2f0fa61fee615be109172286b8788f7b149c42c65a59614d38e6c5e4d2b46ed53eb13d06044229ccedce6f12002b522e3299c4c53cbde2361a6dff4426a66f69b52dc0969cd416e0e1e1e089cbae5500539514460b04257dd8ef59bdea71b145125bf05ef3ec566eda956f20c2ba3671424ebd10a40adbdf8ba21b0a874c1b17c27880a75530d5a1790561c13438e91578db3a04a6027f0c5d8b7fa9602540d23685b59c7f635ab047fcd2f2d738f78b9fe563992459f50b2e08728991a75f695bdc61cbb8855485be4be2b0958eb7d80947187968f64027466e4bca730b671ea8e7656f1e5563ec07bef012f7062d000fdd5548a08ca6a9e89a4cf34a6386b034b1a4b4c1769d1f44c36bc6e97928b69ab7a4baa48224dc4f982ca3531bee6213b1e76fa5efed4eb926b2d01ed373a692a7274d2f46dda1876508d05f3f0de7770fc3079c216031e6d3d90f49813ba0424bdd2cd678cd64e8fc2456bc06e57e58c55fa8e18fb12f73b5462b5bb79273c532cfe4d70238307c6972b539db0384b675dc33b947b7d943c068047d52aa10a648d7b6c698ebf93935fd16196828220fb3c835dae76ac74a10ae25792d23b3555ad11f6e3ee667b64e49b03c1a19f880e15c003aee1667cb74d9e67a78917a6540e8b78d6c94256e4af9b2c148398bd2ea3f85651a86acfe0f794fca1d63918e1a07303c11631b87cd9657e236d7020cab84550dbaba2645131a2717992db68602135a9b158fddcbef84280cbabceab751ef874a25a246af5e91c434a2043b20d2eff6bf3531eeb0a18f74d4c55e7612975c62cc70ee9145a20dbaac5c714669df8135a5f374a072ba1848d03935d4464b5aa717cfdb3b6cbb1267108b7bbca68b62415e80dce6a9459f4da11ffb895fabe3e024c2af21814ec47a9facbd28eadbdf99411f087307302de10ffc39330c2a6f2b2b7d722efa9705c9cf507ad0dc5420375554059adf9ab510786b733b0b92745a0d41459f274d068ba93b28a4a753f26684661644edb286a21294c560f91263677164f896e27f65ae6654626ea67fde3a6a0026cd43f5294154332a6c26b1b09ffc683cc4808de0c8ba666e4afa61c345a91d376a3719b0de722988b10a659f3e8452f61237150340318964d25cd81818bcbc856c39e1c0a71e5dd8ee8d856e1bda05ee368fa4a893d08597d8321241acb59a72ce50e8c267f44e8b6af8dd93ee4f81d9d270ade3b26b8542f218e1a6d139a8594831145d7b45da337132e44ac3e39a19fdfb8016c0a6df4dd7bbbde53dcc2766846f74aec19e42b3da53cd88583ee28d4722b382884f8dd22ab73ba85fc46dffef1ff338d847ad56827b981aadc0685e3ca4165573981f74aaf9749ca8ba8e5b0444391554a99be3a75704b4343ef561a90f3271aeaddd8241c5560d69ed7c9c155870d85d7258541fe258dad6cbf74be79b61105ab6a26554a0523430edce963dc72409e8423918b397e379838d52239c4de18448670a2260214a133b6c1358d0c47fd0b19f9fe4a4bbe9fc1116fd1b37f56c3aca376927f95ecfe1b533dfb4b416da4729655033fe18a046236570f7c7f44e834ffbf03448ec028b7b0c2c1247475a424ae6520f36fb7268e9d263ccc3152733c0254d1be739fbedd39cbda55d757cd4e1db0932baf90d420609a3206d0685305e1410bdfb085ff79e5753c851fe411e7b0c12dcf116af5cc4731db1d1fe067451a40c497cfb44ec8146f25fa1166e5e345f815a7bedc543543d23d588a745d61b52c81722a728f048e28c6b1932d3482ea952c98172d9bb3d6132b0990f24735871f10849a51a939116e94e17939d69cc9f0a4c22de51fb652cf138fbe52b017ea6ef45686021ac87c8b484513214de059722e05b27d160372f480a4c2f09657bb65a87a3b248829c363fe1f9224e14f3749d4eee3b8a0f5e964018cef58569c8e6be133f24d032f467ed9524435922650a18c33603233271f9733b9b2238ac24773b9f0f7fb9c436058dd919841a7962c1c5b628aad549850230bf6ecb13ffe045c794a6ac8b1473101670189fc36e2543bef753acb81613b4f7f33e9bba42d43bbd95cdacb97c54c0871e66b8416dbd699e916b7b215e018695e758c23b87ccdc3c200f9722f6e6c35c4baf48341f7082e8f89eabbecabf7825fb1f7b3d11719846bbb84bb19c6e90c764d1b1c30234c3df1e8c91fb21d3b6802997dd94b06b1ea6bb5e0d0f6abe3ce08159d6ad6729639d51ecb350258f0d38dd5b52d0814cd64148240200254ad6992cbc8990f6349cbb079f72317e78711491b623bae32c6d22316b4dced9112ebf59912ff5ae318fe1bfc6bccbb88f8240f824d7789e92f8f24302c63c4a87f5ee3c3743ae92ac0bcb9c205a83776b07c09366c90ee8f22fed8f8fa9758add7279794d79b49c003abe18a11dc729a31841a9c56423fa3c6975e58429706ba39bf6724ee292e439266e3ed8b4ad0c9ad8b35799f69bc88a31bab105c45be7f1aad970872e6df4e98bb630f74e5bfd7878c7dfaaa45251a1782ededd9f64fa0dd4aae5a12694d5ac653d9afa9d9c312e38654216225198367abba5175225252d5fce7e514663a86c658eea81eb1844e27f70e6b40ecda3a561dab267c13fe8a62811eb374ceec6f26a3e0a8b27484fae4258ce1f3d95187286d054ac4c3799f0e1c9dcc960518eee0a4bebff25f7697f2863481037fcce4dddc3761f83bdcd4719639b7ae2c30a2a93342b16867b6b33ba218b596e03942947d7b948a68e7d42ca5a89dd75b92537b16002f58e8842f5114e5708cb55a98a0d384fb3b26776f48ca135b3288908085e80db9d6f2862ae83c21486ff3ad6b75cc86abb34974c6e82bb63b106ed2b1879f113cfe0c4809b9efbb279b61b086e9ef0aaf1e61e5b534953ba811573b52771aca68bcf15f454dcb35703c4fd8fef3bfe8dd0d96768529d20e13d5f7599442a111834513ba9f81a2a872d4b829646715c6ca3b712eccb693c767cc59a736f47d19e0ff23d7fe1a63bf0a9b904be2b13e445059599d6036ffc20cd2a7343f54f96b4f9212afe4fea7ad2087508d6867793cb22f34e1a8152edc74dae9652aea5233e4e6ca8baf91746803e2bbeb0f5ab99d10597720cf562783392ead54f24c4baa06c820367ef499658ad7789093a4d5a51671c35bc38a2b635757cf4ddcbe05803d2053795c5b03696825f90182045bdff85f7258eeafaa7fcf4328d71d66b4c8e00ddbad5883f380f443531143ccc6806ca9fb8afb984b2994b46f1c0c9a0e0e43eb5ac79d26f6da811987ce7c22722ec78b13b560fa4023fb0ec684c66e532bef6f4d3458d33c608b59324256211d73b7767cfdf5499475ccbcb895c720f26106203989b4e01ca3f1791b736801d80ad14d56ca2942d657d1351064c851c18c0cd42531ffae5b8300fd9f9216034e775f1afe55af78ba9161b74150b74bb5fe4c45fdf16de4820e294af3c8723e2ffe3ba2cfd97e58e2c2ab15e248700dfe7e679229d854468d1f234ef694c1acbdab9d332dcef2aef9f076b1d35fdbf057feafb1eccb23ed99dd0915c95320c644678d46ff2feea13990daec15d8f8b177fbe818075a9eb10171e8720f57f3c6d34e02a2b31990ece006465a4dcc1763cbdcdb71b72ed44668c2c16e6e5bff74a6ad23d356e8b1ce70e375d0d866cc7841b0469fd916cee05f05cdf8cee7e3ba8b1b10e217c750b51d674ac2fc9449494d65864b9f0dd1a47666446512dc9f7a1a8df99438f41f8029ed48dd494650e2409f2300d30d0b805cffb55b39447325b8db74929a3ef550ce6ba01b76ac91da17add2ffd8b3e47a026ad4dca337609674adc816acfa514cc68b13552cdef987c470d0bfffdba59f8df88013d467a525d62b361994f34d6a09855432aaabe761d6f737c87d12ab15ac501a86ca6e59def1d47bd02c84a1e683df198839098bb7ad62a158de6361e9aefe7329b1fd0a524396c7f56459f1d54075fdc88bf58f35d2d14ff3ce82a623defe13ff94fec8f2fc7d623af6d76dd2fc6bf8e8389e061a16ac0bb179240af122410edbf92b1038f98430c1d79390c692938bf5dba602bb9513b003fb3da01b00734348566d569c2e0d1f4706a6fa718e280de514b2531d6de84286922cbc8f58744651507b2a13c916b9316a94ea5b1ce8564e1b48bb6a4f4021900bdeaa1c2910265ad21ef9a6568255ede454cc24c3ea5887e74d65ba3d4c2938afed12ec7225cbd478f9191018c44e57d8554a209a8e2930b59a130efe9beb1adefe5a21a47a8da2c87d471e30a558898c57f8cf3b930d7b0deb4b3e12ff15f2f143ff5be640b90aa64645a40c72859b293645d0895f57db6afb1ada1857e432dad070b4593e4a56c35830a01180c7154d08ee9b60b50b481b1e6074c0a379c67b45d894db5d04c91e1eeae16d271c6eb6623760991b40f141224e6daf4c5dacd8024762a4483c8ee35707a438cd4ee2bc7dbfd9b29037a74116b8558593a590d05656ba2c670badefe463967fa54589b261132685af51efd6cf6f3d50ffbbf0652faf146714c829d797e125714fb1a4fe6785322bafee52315b1e473ecfbbdad83a15dd4bf12d09e1b3304bf2d1c74d290bbe769a03ee1b09d217ed6adbece49d1b7cafede5a913f6cf44962a99aa1fd4627456befae9f370b32052b370859e09d2486143458082b64b0b077a6503e48904b98396fd80b835bd60c62fbfd9e22194c97d6e472c9d68788fba2c298c01c9f7605a43930ed68ebab620a9895dae330e74f5849283bb3cf7736fd053043c4fc4e54094dd9c6031da601bb0b66bdf691ba9352fb32923bfd897ae7928170beab8803067a58cca3848799a88991e02f9b29f110179acc9e7e2b9fdb029521ccb932f530d7c648b0a3ce8f057815ead4300196c2dfb585e204d5838f6039262dc24bb646e78b465527484c826410133bc558a1254fe6f8715b3ba93f858e3049bd34b7d3a88bca24091868997b13c1cc8980173092ca0e85a8cca06189ce48d5067e30253a61b6a26725e4f5b98083b69230333d84369a1dd40ace7b5154d018348f912a5992f941f14fabe7c983aca8779e398b368cebab0876596f1e0da3489d30cf0e83f94c76d6255ff6159f90168c9fe0af3b78c872484446de221df94a83faa85a676897b488fd402bfad0fa8e0dea7745cba0f730c230dc7a2b5076904231860561b13b119d857e578f6b0d21b02ff7f48cc3440c8f929f019c7f2b611f3cc9243dbc06331f511cbc21618091440e610b9c3873d77271a6dc7131b44c93483c459b9010b28fc8082bd6159520e51ba477d948560e58490875b646b589a3f4ca93cdcabecbb84aa778cba7526901baa8c571b05ff3542f73748312c6297d6cb8bbd34aa16575a3d458068936ac40583cc6d61cea2cde052f093b527a719ea97f58a4d8c08f91992b37f546ec5cc5aa6461256870e7c8d4e2e53e0b0ea52260d95cfc20cfe31a2a1694d60c54ca87a84304a6f9e48d09ca300a52f3671b818c8a4a8df2e95984bf2eeee04bbf732dd7969ff106ec288d21c1af703bdade72807753995feb7fb3a9579a06d4e5c7dddcca926662dd00642929b0c0490f356ce5d2c6e5287e8d27e1a7807f9101008c94b0d9c0e1ab648823bacbcb8c73aaf0fe0f2d3faf2a4cd0ccc74d267340b806e099de67101f9a7ce41235b6c934fc747fdf7b4db93180a0fb43a9fbf5f6bf762a0c025df854a3c44601e1ec5c07b1af33f5ac26194e4d63efa51c6b6ee90954f4dc3236a46980262099a2b8460495538ccab8eaf291a06a17544ab9222ef162c790846441607fd136e4668a954516fe85d7939848e8fb37a33fc08f333a66b095db8c098e9bd928718a3862308cfd0beecd25f0b887afd7e6b5fab7d6579e360745bce2dc4a15d257723a62e5fbd11e065a521a21f6b0dc48fa67af65551f1f337afd57816db04a44e8dff9c229cdcd58e9fbfe8186f321e1385b3d0f839a954ff5b0a118c97b096eb7934a92d1251dd3794fc55f06aa20469de2867705cf54ebd5f9fb614043bf7a31e626da5dc177e04d59026152dbedc8e28bf4150dfdda1bc9f081fc56ae92543e172fc78268fd77dbe48468410af12e17098154ba21a7c5bd6c7e6c235168433d3f62ad838b5a133646e5bbae91c8f3d97612580be6958b2965ef0f58777e0ab89b0f185e3b8781fb77c7c5bff9c62ff4c269741d99760fee18d638e2a164115cc3347506988b9996426b9e8ce7726a46e0651af5c2bd01d12a4199839f834220aa15eb040371f9f25820fd9864a07bdbe736a41434e53a14e6991113a49411357dd4d8c8bac4705c3652190291f565eba2fcf7a78ee5355d4dfee659ab493c58459398d6180daf99e468a13982cb06d8cb3acfab09f71a8da1357844113b321f86d5e17714a3a46ab10c208fba384e8c5ae6d4f508fb514dfc3d207d231ea6232c0c6649f7275e78a46380c4e97a1b483c2c96cf8477c37777c3236cdb405eb58a192d6954896b9ff8f9de9147bc0b05e49eb4801543e522a5b4b9492028175ef6f5a7b53fda1298bb8a16d7b665de590a3f2abf21ead78b31805a158dd1652fc7e7ad45030ad993b188a8ca85bfd465ca4db29cf81497b21b9ef0609858fab22aa6fbd9830a9cfb20ecc5067b37339e0fb8b3763c469ac4b66d2fc20e147cb33662bd579fb5e481d5b725f94c4ec5c61d53f49b0313cfe830878cdaa525d4c2c1af539239a04f0561dc2b047291485fdd0d069f6709bfd08ee44a66fcfd0e9be5989ece9d9e9aef820937faa7ecad14831d924766282549e6fc061d0c6d870178e3e44e865aa03b009b0300e2ed18aa0512edccce2536995fe359147741569bd7f497d2296c5ac0fe06391ed382b25b91fb30d784fb58800d87456d6e48f7d706a1eac6482b7e0b72771a55c6ab0b73d960a9823cc23307297818ffb1d2dd056301e61811a072a81ca5aca69655349a3341b75004a3ad0733a15dc2bd926f8ce124b9494269533a4f00ac48143234a65fee487744212d9c652ae011556ecd8d90d30c2c12e4b876d5a9678d96dd04b7c28ea94926790eda4eb02c0c71fd20d1556bf8cc294ec13071101d23bd2134aae6a8ad93d1e36211fd505945ac60da8b7bfe456326df56763c46f06f1dace70945fa1d0de0939ba698504caf2b31e9f6e6037e2273a302339f14529926bd59aa47a2c198256c7bb4cd55ca5edf8a1447e4647e55a97bc0f9c49e18241344f2ed7405f227626d02ae27b83406483583991b90b0de3b6d17cb42e075fdc47308b32141d3b5098bb4d7d5526a3fa79737be19cdee32cf818994d35438b5e496a8456c795a3e0b0aa4a24caf3c64d64f0a659afcdfbd2159051fccd1c0f6ed016eae649e36995a16b1000d81264e6d64b881861b8a67692622086b8f783b8fde09f46f9426f0249fbb261b69f4bf546014ef77bc7dfe67dfcec41fd97c298bb1c9785e2187e2e62350059d44cc9cecba92c3384bce86f6fb59bb9c0c9686bf143a8d10f9181c2b730ffffb475e85123a74ac5828111928a7e14fb052fe4a7b697d2f795e95eaae986fd2072f293184eafcfd7b0dbf96c2b274eb945e0fe168a4b20d2988e925b5ff1d66542761a065910ce8e51f2894b2db48d989354d2b7a9fd8c6ca0a302adbcff2b71dd11e3017ffb2684aa3c3182717b70942f73a189d2bd65a4e6573c7d08691cd78f54095d002edf689343cd42466c4727590f5c194deea5ae2d94d8ee10cc3718d8ef73bb634651e84e6d5415c92e24dbc21355d3dfc97125e446fcb926735c78a11d0f97d3cc6c0594192ebf1969c25a14169e62c16823f9452578539e44d23d0311f303cc4de5c81bacfe52ff2eb3a0adcc1a23f58ba36ac861a165c303daaffca876b1d9db9b9a978b47cdd5aa1d78a8dd8df3049c7de27f6cb5ff9474c77bb373056bc98b65da18c4160bb0c65484089fb57748da0159a7c434a994ff772f12444935b825a17158c79b898c62988e8d7e736e56cfad7dd9d1e624d27a659135d40654d455aa554d39468df4c6b10f6552764617cc3133268c5b74b22a480b2098c8ab5d87517a857b617ad0db0e14eed72a428fefee7de474cc6d61e03f783d37167932a3adc85d20c0e6ec2d84fa123d600befb16c1d40430199a70a8ac17c0e4a06af1973893fee2d3d0760ade256a6b4ba5f76ef884b20886202164deca28a2d4a42a0571efc4ae8c78495da0cc4bf569956291949eb215d2d42a4a2d582c11d44de33e96ba6d188caa9a54299a40f2c42009db741d16f5fb538d0b4ba6ae85aa9829012ec37dd1258a70994761df56b7fc648d3347de5fe85100bb8568b10e1f35669410d723e0ee4516dba2359ea369aa6b59c44bb0cadc8198bea9f2c531cebff356d3182e5ada72927e8ba2d88752ec5ab7aeb83891747d743bcd571ff6c1970f6b3aacb015edce83ebe6d1490a2620c9152dad0c73b6a422038b3bd37e8ca0b18861a83927cd411a99924f98a13f52d4ed25db86474fa44bf64dfb4e52b4dc6405bc5747748871f14260c0260d3882d0ddd639db941be05ef139f1452e5d703b6a3b372f2e3582c333ee7b505d5eedc0f0097c66c023203b07f29b2d51358abcc4f5e23bce4a5b6727e646931ca12e7e8609681517d1a7d60e308e00958943629ee9a252ddcd43e24c1412768870567164b2963abf2f0552620ed3b6bde3d340b9556e474cfd1c390712f6cbd39cc587725e201e696ec58f7704d54e12207b1159719176554c4c6ce4535ba9225581e7d085a4bc28a1fe7c47b57c4cb5f295f7219fed578ee1dc4946ee6344cd7aa18f6300eb4e476a29c004ab374d03e54ebf7c958e1a8900f48d178216dff0fd2391450e0801d5b356087285556385af74e8857b4dac41fde36dc1ffd78d6e48e4f88a45fd416d5bcaa711699ed60587ebe7c0c7904f715313b6d44e6aeb2e204b927f2f8168b8243977461139b00b6ce3c5f444311622b0f0364bed386d89e9573044c45c4468993fdc526937e712805d3d7eeb116077388e3ec7fcf8d9af799b0d281acc26d823c416836beb853b15069d8c353cb57e8ad46854638022610a497223c1589ada752b0c4eabc8b245802b3119f2a6eb517af69127a43dcdb2ee5f41736da6d3c1d0dcb6b14b12bb99446e2078cac62a240656ad733c3407a480f817d8fab3f95a5df8bcf6474147db78647eeea3da602b9c6505dce49b547a436e5fafe30ebf64bbea6f638abdfe289a55f0494ffb04b6f09aaf35e65e91bafac90a582600db4533370ae0f1e2ae024e70b664988c5161267ba16d828f79cf609e5757a67e5cbbb8c6ea4f05b04fcb9dfabf1305b23defff1b90e4b350d601210842090f8610e9ac03c858f1a55199931332c09efd71d40cf3a418387067852b40773fef7598910b91e4683bb0d202346883cf46bb91771c2658cf27fcd16621cb6434962fa4deeb0b8ea657391b2a11074c93010116a711af1140e083bd814c23406d8c3acf555e40a6a4cacfff8d42f4d09f7f45cd77267017a069ee48a4fcdc7bdcfe5031b1f87f855b54e75dc0050d6757d300676c3e9a6694958350648af709543467a4a66af830b8a7d45f3c3846cf38f86ab11e0111130e514101952586954dbdfb56d588a0e1a47a0a24c51a0210a57d4ada2e65227416645a6f1f2edd4286e1bbbeb7f01c7011d18814cbfc82730081b5f38ca8ba24386c93cdc74836ed5c24a76f916e0c05b1f096fce08e322002bcc14d1ae2b4345822b190f2d431aac0b13e58721003b3fb13318a6b25bf9c90b21e50efe9a8bfb798c995014906842761649b11b726be10a305f8efbe3fbaed1a34a962ac6bacc04830e24fa1d7958d60b71f8a06f52ed9b7f1cb17d36a167be50a71ea4b14494043e39542fc31fa15b10fa722036c63283c2e896cedc716247e9509e8e155e9c4e12ab6ac781bb10c45b63e52e8a994bf365419dc0d9cecfa541ebaec8b3eaaed727144e4048ef3faeee128fd67ee3fcfaa2c83bc81bb20212dca82b07917de6845819ef0923443c2cd6eb863902d39eddf426445bb1253927627fede69e83187d9d73e0ffedc13fd23203101e2edde240dbd2f09182cfaed68671fd297bcc76004a2be8cd26398e2ac7bf314325bef0aa421c38661262a260a649ac44575c511ba0f32e7f9f3d72e95aa1eae3df460afd035557ff9eb1a1e8dd370c3e06c750acf11d54157b2fa769889738d251741572897a15b1ad30ff79ebcb0c5ffe21d74e10f03a4588abe5a8a8153ceed423d94bf81f0f96c55662a695cdf8b60ee9a30a3c7186315f919e1758680b203fc8894a0f87cbd812d1edb7ecf3fabb86092739604b802c95bb1d391285123e23cd352834f968be8a1b44341062432056c439df1e87898b91345c558813c1eef13e750a43d905aa1b4ace4d9669d692ac0c039bdb14259ff69808ede2601d735f706e87f20de45d1110112168aa67ec0a854c5256f5a2c850ebaaf340bdc4495aa0587d3a0d7beac031c122d5efa1c3d2d872fd88f99df273e4bae311790fdbca23762860370b0316f77236e6ad19cfa8496b0178c52c031a424ddccf3f126b8706c0828682c3e704580b808f520bb83177b50559cf4189dcfd32ccaf8165dcbc6984ee1da8aba0c284614fef061e0e22126e0406688c337d7882b85cc3e2da87087c9c170f875a4c7bf228019815d8faf0753a4e1227156110969c2f00069c9e24e8dbec9ce4d4a2c9ac075ec0b8e4331cdc6dc93a1cb0ec91576811b75567d948c14df58a9fbdeb8b0c7298c012f62bfb0ccd19e15a5b67fea7df029273c8f46e26d5d814acf72b497cbea26ed7c12243d12266590f9925650dd2207b3558503e3db7b8e6cfc71ca8cc0ee3e6db17dbcbc50f042903cc13a1b3a3c1bd05ed86daec1b1bddac23090ae502899238d80f8643723c39fd8c965b6ff89613fedd3a9f0f2eb6917d1273d86ed1b6cd0e33499db3b124a6d7166e484f8e7d16195de95c20ec20e374e414b27eac72c33c3c9a0aaad1f5fe50b57da00ce8d2faa108345c77c5be50663dd3c94e0c9fa597d2f350eb2bc3f7836e7aa88aed50ce0cb021c7f0d1c77c1b1f4407e36e53c2dc396ea7e52e082522aa9cd92879f459fad9b96aa07ca500caf6da4b7254c0f0f3adeb328deaaec715fa231db70a6e71a59593f1ddb4c469fb5ac3396ddb73f0ada47388f3d6580b17708a946faf476fd8e3d5bed280fcecc1dd52043390339eb81f5ac8549aac93cfb74a113466476b362d229794d7265ea59a12d15c55f98834aa1fb4c8d1c22a8b219c5c7888408ecb460f69efbe5ede75601b2cb230b55f7dbff177149325b1037e9bc9aad5d5c354f300104a4d68d1418a901b2cf1b86dec0608b4b07f4c876096c984c7ce2170b527a34068db00995cf8a454cef86cfe21642c3e6748d3258a62d22dbd2382dff432cf2659554c21e532f9e2ac302f05aba491fcfb8da5538f4539b2f7eee68450bc856d7eb210829d4e762a7beb03ba12467afdbe457df5da24b23234876aac5a682cfc5caad5a50343d9199e0fd4364f7d2ee9cff9f3da4153b98e6b0143ee283e073302d60b4302fb2ecdc6daeeaf98ac9d56a35f5058f444474542aade0bcce012ea43a9bbf040b3941cb4f5f41bcc15219024f2db0f71b48719cb9b09fae4d80a499c094d14aafc94668afcaf1a0ec4536c9694d6fa1546c8944e1ad0aee9451358e5484002f8ae0d2f0638a92e024d40c10d7563d427405b0682ad2b4e765fa856da365cbc460ede115071b56f6efb7b9a4fe4f201e5d6ad1fe98aa8c71647d003aefe629edd3c55e14f5f8755d729be4e9730c5f430e9dbaa369352941013d1849a183c2bf7b84f7fdf1df18feb24555c3f244568ceae278cd4e34377b698b09c9b8fc2734385b5c712964498602b41f25294383d5f192fbaac25cc6c17d3f71e01c79499bfb31e318c0cbfc21b28b4c57cbbaf54938e41b214fbe7b46d72b42edfbf8f0307b1d4bb281371caf4816b0086b77f7ae2832d7552a188ba95cb5944388c51495fd4133375b26422a848a2488a51bbbb4aff8ea375c03ad9de20a6a89a61dc98f7977eff615608dcd80a1bf9765d014f57925cbf9392e45099b214884efb4db39dd1ab0fa1bab9369aa6245065caf176be4562a3b8f25bad25a2a4501d125544819b982ac02ab750fc4cdf78d812a4ba36cef1a8dea4a5624a0fc81602403db767bbfc7c716604fb1fce750eaa516205b3f76ac8f4099218d72c29a53a2eeb2b62b790576419890c7bd8f34e0ed4e451754f721dd3e5e1b4283c836f5ec4149e59d3c8a159541bbc86277c71dd68adbb87edcdd7b8a1394cc7e6268eb4965200a04419e2014416ea4fdcacc0ff45c06ef99b01224ab3c0d178732580921a5b4b3fa990fd80dd64680e06817f7218e14fa8445c33debe33ed2480d31fb04d04dd3e6a7c0a7d52c4b7d24ec6b6d903fc9f679e67f7c1c31b1fd6608dde99c2e0c6cbe8574bd500778056832e47be72c2087aa0233203e694c76b44ace83abcde141b976eb57bfea431de65bbfd81b5b51ee5c2355be4209af33a3927415844be40b56747e52a59ff8c687b9fc003f930bc99e26e844130e933e7391cbb8e36cb04421080f0ab1dbc7748526992345b209ae151c8ad3446dd407b1e1dfdd34f3ed2851c6f8e6cacc672ea3961f4130ac5ae7d58a168edd9c93fffd223a655eb4eaf4d0cc28d4cd47825e68e0500e9331511f4555aa18ac130e9ef6e8b040833d26d0eb64b5cb2fc8279b1ab30d9e1317bfa6a7c652b0a596e07e72f8015e2f26ad663083db3c036cd69f5551cbec24934924b231a65dc77f8721faadd61fd82707346f98cc0e1688e53efb9045329f3a305bb02d6696ab5214b4bd1c0fcd3dd727cb19d6f66d786e2575e67526d51bcb0500fea0b4f40794224cf68d8ed6bfaf8bfec4a418d1b378109d1957f3f2cd725c61f0670ba27681ba0754aba598a3c60120a1a2319864effb615f66dc280c788d44735cda160897eec811b86ef8f14cbfb2e9b0d5f08a6020d1e4f076b492729c5f6acb37b545540f7bf8105680e0508f0eaca9a3affe392891b9c9168d6042f643fc104897ff1a6629861f8f874c6bcbfc46c80aedba73930b4ae3f4af4a47dd4078b660dd56252e70f48605426d9474474f3a3ea236222103051efb50265b64ccee63d34d20c3d22c321ceac3ae903a654761cc329f8916ce01e81fa9fa70a84b859c58deaeab568263d7fa1265973854940a43aba5074ad6aaaa7d99fdfc551d7f7f7a13768c4542c0928b338146f8f6bb180806434bad4326832b425725c9b29e8e36e4a76c2a20936f65a83f6872a4e0d4ec4080977c8a0ec746badf2e41ecc6dc23c8be7194a5c3f23c3e346707401203fcc25e4a5f5055d7e1cd78e89e7fe0d7f2a30c3d285d708c50e1c4731f14afdd3793dc6732cfa144e6ff6838a70f0b9b50580a36629b59fcf67190a76849c369c8f99822017ce167424298189e94791b4064d41d738e19c3a675999db513fe36115b0e610c4857266e245211552aa1593efd6a05c3f5036cbba02ba53b3582fcb407920b61f443c0e8683470ecd43f74caa8324353e1108c1be4861ca859fe749aa684899dbcbb4c720df8a457c5c259d1c813168fc4e4d7a2bbe7a4820d010f97e90476c8663fd3b4f578ab6cce9d0c322e68902d5a21b03f0e57455c4dd3887643e72b64f7f9033eb44b4a65302c781db4e88e953e204f41727c6d6e1746104d020d3b6756e2ba3cd608a4a908b406ad65d2762c480b037eefddb7c38d92123d7cdf0c1fd48638cbae9b3e8661a661e67d7240f3160ca47437648643769e62ce65cc834ef17ce075022ebbbab09f337755337b218797bcaa8cbb6a97f13079fac1a92b702d035d27a5c88b9631ebeef3c4962eb8d51cc07daad58a0e5f356a12acb26411be3e93e48bbd0299dab043999c1476138498ff369972a6d8f0982d3bd4c2f1539e603deb403027f61981be36ac87e100e23a7d8fde8c43bc64bf9139bf673a645eb3b95217e71fb54bfd981c707338e564d6fb2a6a14e432b7637476223874f54bde7f9f8916965e0ed0e18759f2640828cf67289e782a025f5bd5d6a37cdff9ece1e9c00d1e84c33bc85e0b6cdd9b079f66d033c74dc9dd7802ef0e253f8ffa1d78e6891f41c25fd6aae471339c9895e8ae75cb4fd2e1d6365c1ed4e369e52794e2adeab7a8d2550fc359179574fb0749dc1a252affed02c706bef62bb3365babdaaa5630b89ecc5801fe4f78b8db5a9d368e276ed6f842c523a8adf74e7a3ef202c1d18f6af4745324163f5d0efadcbaaef720bbab5d0a15497ecdf991e9fce33e1af47e70464b3af072becada6109a232177c5058c878464b5bc93effb74465b2c532a10aca7737ed5797c93fe2421a572a948ad2d27a1351a0960744bce5133a05eb08679d626ba4d21679d5f4d81cd2b84b48690687349c9b68ea927673612227303556baed1a33cbffa0282e089d772286cad92662ac7753aef9336e4425fac3bb2374f5c276bebccc2b713eb71030dec28f071bebc6db0362e30976fecaedb2d3e600dcb037861a4e83d50b89e90f46e7c63f1e41a147529cb77d8f5623b4fc72aace80131d034190bb21044336284cdbcd42064ce3f05d1c6f8c8f7289a81bff1ee8494881b017751361a5a7cb71a77af62bdce7797e40c5a654a36a5de6a81d8d2ee210a36f73b8925100387078c9572a92c01eb7f9089fc17a4cdb6ccbffb8c342ae8b0d525d777cab5003c3549180cbd21794c30b36da5b413ea5d89891d03034a4d5238c7088e5caf15cd6e75931427050f482fd9d6d150688bb16e51bed327e4c8c5fc70ba47ceb26f1b046a1a26ca596e8fdb4788da7e8b23f4328d72272ddd1c4c4641d36ae9d4fc43c57d793e003c2f369a092e7cc60ff0f025b229b5a42a520e6d0206cca35cc41119658690ac805314339f91c1101e7d8d509075fc150e1884c212976272bb03b132588a622caf09a1d800407e042b80933df9111be6b0bb0d89c39b1dce6ad83cecb1b261459900cbe926fb2ce4b10c8d5a5d29c4f094789b5de79d9b5c56a5b30a1cd9c0dc276602f2554fb6651074b5984937d9a5723b1bdbcb2d52a88aee0d33f0b65cdca3f8b1cd792074111cf0be5633e4b3a4655f22b8fde88a004a38a5b3d69763f3d2836167514d3535ae8e366c07e5933c15560854b4889d6e0c31d9917479b45300b91ac39fe8d9ffd42d45c9365b9f3d26f5174f1b7e9821b61058b0ec8227c72d1705a0182a943d504177901500b055c86a64818f9b68ee5d92f8740964e39fc412d2810c83292094310a6d456586d5ca951e14401d68fd37052f5b4bae5a0b24680ec7bbc748a26b2259e7c85d95f53ca810e98509312f1a875222d6844a340e82e1dcfbeec4108c02a6f66f693bcf6bd1c6c1eb74b499c607ae35f75a531c33eb35b91e5066bbb12112bf9776036f9f3527001e2746835aa44b47296f16b08aef9f6026a961ef065b270f081419785512cb95d6354f54023b850753f2c61cb69005d40f5aeba4c56da46715413f41b5c5352cdaa495a75211462c2d91ea8e2b516040111a15beceb8cc00dbc9e5286db840408e08c1ecb70937f831886d4980619ae32630b30c479a88d7b2ae7c44ecb00583afea12c54be3c0211d7e475fa4ed394e071949d6697a8907460a9dfa061c98a824e952417f272f41f11910f8c135b824d02e77493cae21e5ff9e5d50d323cbab53bc2e927976e623b97bff59dd92e9b8555fabdb17b4ce97bfe09ab58f31a1a824f18bbc4c612978abdf1c005ad08350ffd70f388d17598bef7210607dfe2bae222b90112f5b133eff8a6416c0df8d208e029dace3acb4beba139b8475ea4e66e770f2ea585ecdcaee22584b82d569ffa130e98be03a297406fbe753e205114b113f91cf18fa30aadc3115dca104c7b9439b871291df11e182842cc9e323fa91a5174c8cadf121a86444c507692a5241a3dd929e86149574addbd44ddb9a268294b81f2aa3f57e37317e3007b2cf0bc0016f49de6e6e98f7c8f385a642527a8ccdd0c54bc4b4390fa4eecee4834251e10afae8ce2dc48f906f9c47aa82fa41288a5a6771cf07163e809015512f6c09c0db795b79b86bf848dca9ebe4d8331a4ae3793f482468df449b8ce45296b1fbf4807c930d9ec5d6727b9cd8b14523d57b20f348a9c050229a5c09368811d57c35fa2fdace1b7951db0afd5ffa9a4321154c6628a0a3619d25643e3df040b6a00aabba486d9f62324307c4bd84132062c90930d8d2732629052332934473cdb749496f7b7901c8f7b399e8177a359439397827f89778d945d1e32ba5cecbdb7f28ee027cb3b841656044132f613d2604aef92bc579a0a550839a58a8cb4cdba500920e0a7d546a58786c930b0b21a893a1c30517d2bec1da30303628289fd725f53dd54b27b9e94ad42d931c8a53c47fab25d7011ae93244e063de177a28b06126bd88d9b1410fdfd68e0b65ee9a766ee3df83e20d463081975a01f730449423f87e9e29e5aad709c0664858a1314c6f508acb4a2ab4469df7040bb9e1c673f3c2ee5ca663e408404dbccafa52a10061e66c22f703b94f868285c7bb98dd531099f0723a7b76ddd2ab6cbab314230e87598f01edc4ddc3cdfcf53afbbb9fb01e7224f3456abe108c677e23812ddc284cc3fff1b8c8750ca031c4a9b3fcad560e79d104bb665ccf81e304064dde861f0643d1100b3ddbfef4b81f29fd8859601b695d10182c2b99d7b5c553b1dd5a2b5525971526d561d678dfba2f30c2e55d5a07809d99eecb977efa4ddc46dcc8edcd661dc71dee1db6ab54e0a65c5ecc447eaf95d606881e1f72fe826c36941f504369b1576d7990018e8efb95faa1e7c29b15f388ad35bd927f9abd00ce7698422a570ba941ab37a58058c3080bb58c91ca7cb2a7aadacf3be0ba6e6225aba09900c496569ab9f44bcf04d26720677c8acfb8a4f6f3c1b474c5d7ec3b96b0330cd04c6dc752e2852023bd0bbfb29e005fdd85ded4ca3e000e9953e8a4e9e15f93a0005569d02f785f41cec0886dceff5d68ba57c3a4d30f19340bb571124255e56e5fc056f4cbb145a1a8220f8c1f42306eea1fa0616900c524aba1e5a27452e6d6efb6d103742d10ace573389756dfc1289b6daf987d620f40aad12abbf0bbc13a6597f57e0776eb3f0c6d45a104bf050cea1d066ccd97fbf725f2db127b7785c15b16e7d3c5d91f4058e5d170bc4badeba0fb33a7a39113afcb6ccf379dd2c993fb0703f9945303691c43bfe911da45e43249be2a1be0d1dd64874f1bec8d92afd0a53dab047bd573cc32ebc42cda2a340dd7682aa6a4e4019f7fd50f91a85fdb3a47db161d8572147384b23db9289559ae0b40639a236880386f3634bafe546a6978e51e191cd4c2e00e18793eba0151e231c8390dff57472749a1bf87538d0a716f564ba9de5ad1575e3658520b795610ec90b35d14aeebc988fe7f45e9677d7fe298e9b4f25e18cf6f01cd62acc295761cc861b66d9d35dc6e65da2ced062bbe35148d6b18652a839dbaf98430becce9651dbdab3a4b85a18b62e213d96f85982ba01ef105c41fc0c0a29fc6065dad9a21ff2657c2b6d562647df0985594139a5162ac2fb0f2c95bf91d972bf8462c1215e5913225fce25b3b5380ef52e63aa28b27ab5a03277f74f72bb2cff64b4c28edc59c664604c2ec028645e5119f05efa8aa73ee89d2a27ce1b3a24697046572811b3a492ed1c1a38a1f8aba4730ae88c1012fc82d54ec1e1d2d82d3ed5acd0e9b300aa022e0f3450c152868ff883c2b833b57070c252c6e657a367963c80ed49b049db7aa398e090458b572d452f09302fcc3870b721a93433207e0e8723dff2adb2729c73cfa3766240cd0048c1f57e45cd9c2b483c28a1770d0e7ada555f58cb7f773786e3120f9205ec7b81bafe4ec6927b4d4ef21816f31592a78977b16521d1851612d5d4342d6ce8317c782a09f70412310f0400371af3ebf0393d0fe4865263b7e868370db1661406baa9af8ccbd108d3490307cae02777032823331ecefc7b375ed855161bb06320605c2b006a119811edc25464bf1925581b8d90c9d3ba063b1aae129c834a060efc15347d2e151b49b2bdc244a65d4d53702d160e697d709f1b645dd0f20e130085c159dec5bd92279777c46aed8f817e68d74c1bf12aed8269ee817130d0f0dc909f919efc97779884f8f921b28adf424b189930a4951a8d031cd58804d05ec2b807cb43cfeccea532d5f8727b4a0b35351518937cf12bb563687d257657a270e4d1cd78ca97045eb04c4c519427194c8f7d010015af4ed6f129667a32b8cd464b46703166b233acfab8d7d22d801e27a0cccee4df847674abe89c625242199f41d20c2a6e0e5df842b44e2f758607b312247d1c64c85fc249e1bdf586bb635f7eacd33fb10e82a186147c01af059f2592b4488792e7085ee57cd04149bf2db08727e2c72144e1d74580d2a5d1bbbadf9595368ba97d152059a5724aeba0c00b9bd99a22b11ca2049711a27f4d991c8796f4fd740b73177e49a9ea3653983860a5d752080de67576d8cb80a48e1e939e488d3cb50897ee027641915c4e7885bb8a28c6919c93a6530eac68a10e5a144922036db894c51a4c027deca54855b3d42f971b4e798d2563593b4a971e10c47b41c5d93cfd117e89e38425e141729c10349380a3098e7a12c519c674a488bc94fdaf725bc564bd424088e412f97dfc023d50f066e0a9da5489c178569fb9bfedbf96b07f3fb4888b06bfb3e8f24a411b304e2aa753414380ab81d3cac9577474cd716b0a238ed2ae28634220e2319be83de3726a0efde67a743692de5712a2868d9a64b2ade8d6c8d5a854f2ef9e60039e6fd24872f35a29c33d223146e7f459df25b3d15e29e02526d325d44274c02ace250d9f3f6315af92007cf85831461ae220e7038508b82853a228056475d829d9efdcd60d7ebea7265903ea1d19f5c2df07c30b203543af459ad95bb51b8b777a1aae5ff3ca4119214753858a29b31451bd1b62bd32ab421bbf68b20f065881940f6d8f25d9b1e46bd106b3ba509d0b3d8a094ea159785a00332a00313a85f71222044100d47af0207a202f5c2dc101486c0da93c16705e6cad60bbcbc3642bf7cf822d9623e8697977d56ab7834b00081d08e33af0ba2e730730bb55827fd82d3c66c62c4d71e7d05c42cf4df1735cac7f3355f47983aa072e2aad75a1828718c6ccb1fc95ad902795f00b8e756bc8c6ebbcdb73866692183f7919b5c777c2dc53d195771e81cc5735d562aa383c90aafb71347d55ae284125ac8046ba44aa464d6203dc7e96e979fbc1a3d0a88ac38f3abc70c404166b35853458e8e59a8694ffaf419c8b5dd30c9db4691c2ed73c2528ecd9915343274948cf0d5cd7ac2338e48fd5d1d5cc85ab1967f15bd9d415733f3120ed41bed56b5e83f6ac68dac409ed498bb3890ced49e4bff6832019f26cb28c36908e0cca519ee9700d1b058cc2aa48672bdc3ed007676efb7843b4957a86221afbebaf65fd977bb2e8a26c0c18e11126ac4b6d33681aefe47799cccf6538058d7e3d601dd948ee246646f8b32953d718304480d23c34052ba53f2daefd3d2905d4324560fa230c11be291438ab5255dd42fce99363b0104f5e3c26c2bf7f8d5d823de67b973130714aa33ab0fa7fb1de03e1239fd2c401054d6f5969583c7973f5bfbae0069c3439179cf9e1ffcace3d2e84faaf0769a9db1d36f4edcf5fb089d1c710e5f51ce668f81c548fd6d9ffc5714f7adfb13e2fe54154cf167d4d4e3efe993dd3bb60c8f73a0a89894a3ab4be3c41c1e4398423c4f16c8faf10241d089b186ead9044ffeb5123aa2e813af3bf70438c2cdbe7f53a20c5b528e6cc30eec8d635cfff6882ab9c652058d1afc1431f212b3b7ffbaa2de0f56e6c2c40400b81c48c51d91ba05bd5d09a4f3749f14a04ac29300c6be9d6839c8a99e0e7d4d2ca6126532b9a8beff61a8bc81a308eff390e868931098090eb22ded1f16908154bf4b07c63be36c714f975a2fe73cc0094a880c0a1f7fc6794bff27891ac58bfce74fd4712c19dbe4c982ea02bdb2f0512aed0cf3d763b43268929589508ad0715d844d7c483d8731511e947845da5f09f47b5d93cf865cf0ccc8bee617d0c12baa70f150715d1bb81b3d9bcb5f31238668ae03fd71637cfe6cab5411eebceb31c65bae3fe797a9a0f2790612ec49d2b775ecd686efa1d28ade92373675bd8e7942d082624118bde894d545846341c5a54f8609b481421903615e0ac42088d5cc29f2b7017988ff91a961731acf8b28c32cb3c971ecd6d1216826a098f89b61cad2e29e1716f8a691c025683d6916da1b15330d397ec8c6fb38fa5d9791e9ea68c6c9196e2c6614c0617842e6375009e9580b69672623d4258f94f6f778a4741b0f1ea06bc10a37e87358d7260a88165f0f726e31715d2e67be49255a2fdf10dd1819f5a08060180e3c0e3caac1a92a3d997f67dc71ab383e20072b3edb4661e2eace90ac53b78bef6641ec07e5d754f57e2d35c5f2e598f686a4dd277e31d0e63c11e354e10004b71b300214d835f4ce2d67ce1d6d3b7391b858ddd5ae0a24ba7914708e6ede22fda0ffa3c760311a8f430d72318b03b40ebcabc58256c92bedfa1c967cf124da9f372fc1f0ddf37c0a3cfc56a24a8d0a9b1d79e60628ef1bae8999904cfe0c2cb6c7f500b330f25f677530a977a1d4194914bb1da953adf75deb35bd13616dcb66ab995b1b24774ef67a712103e9a42aa608c2775870ee56f143c52954a0089c8ac938584fe996a5e3cb7315d259bf95d45ced9bef79820f0b00e9a01b18159ec37fbb0892fd08691b8ffee335c50e6c1a47227afff224a0e994b0f0fb497832ac9992e53fbbe235121f227c4c52f438cf0ac5efc28be0a9e373c3feef4e84f42ca702c7621e7a0545e881d16a6d07770f6186656f0d8e594057b8bad95f556313ea50ced1da2da7de18ba0b3e2fc810572ebec9f80e48f56d75ba1be55d38e0ccc5d64bf3c170378cc2df0965bd4b0f4098c333c54518ae46878d8418a4ac2b89b65e90b7c59d77567ddc01d5b4d2c1dc032cca531c7be1ef7e18b9fd8a45cb665a428c2923a196dba485676e8828c570c856b3f7988681c5637a990d39f186ef9e16ed0250d2a9f0edae5fb058c8511f4cb08c95156809a39eabcd65b57d66d995008b390a3f97ef9ee00960b3ede6a11010d06072634df2dd5deb642e49b5d636c2abdee1e91ccc055ce958262c67fd0c84754f57e9458fdc96695933be7c2d3c2fee5409a8d7d13e621cd0147687dcb1e33cf1a4ecc425af350985872bccd3252dd86616d3090cdc2553800b68740bd8763fb87564a95bc8ec59b419b915d6181b53716db970f88cd33311729b920480ddbe3cfe3df41ddbe4f11c2cf2a44984f21578e2a9774297bc5fc0ad07b6f5455a5a12d3a81d50c560a17a3b81aff44cab18b2a360e5540364f83f48ec4c905559e25869ea0748f17eb00589246b5edd575a99135e62ee8892d9566680d8d8a0fb155ad7d100e10e9a72b0399a0c8f8a10ea1a0b448101ddecdd76dcf197b8bc00378b60c59838e2c4297c7420ee2c1a8d4124af486ce3574d40c1c66d2bc86521ab370be8445161890aaf944bb976d41e891f6744f12ab0a4a595316a6b80a8a1194e4660318c1a4633cf1d67e71d8099a08df7be510c7ff435735f36f720e40f3e903eae2971c0ea042d3b0766443a82ca2ea8448b5639cfa5a2f2da54de0fe38222aaea28c8ffb470c023a20c3bf347e0b5da0a45d7b2ee97a7482eb309596c6043d0eeb0cf2c2a16d1b317d2af0ff237adc377c7f50af66b9af5416cef7ffcf79f6ac0ed014c207901a1825092cc1077d4630085b95ea0890e4264da4ebdbbf5223ac098a52c6d0bb1e4f17008a28115da485fe8ed2d642facf67177bee9299cc6b9ce9e54a9e540a57a1a4cf5879d21e31ffb41d272b3c7fc3e2abe728001b46c5f56678a8c28a54dbe8353e4d58c9031aa48ecb456713cb24dbf2dbb177c93c78781ef3881a26155f8e9471c4a3eb698ae9f1040a212977df8a0acf020d0632dcfceb86c7bba31f3f67fafebe3b417962b046dab8a58eaa0b88e333402d0a31adfeb187d4e815c04cf0bff589a03b356a50f9291af358c7ffdbde6fcf0fc60fda31f8559040a8d346baa25694bb14663858ea7391d0b6c2eb6e9e7b71333e21505d54130f47512bcf5d0ea18f1d5aea02f15026de8f38369e1eca3c2f2006c66e477f1c70f1dadacf13f6c51c886fbe870c23645c0724d0cb997ff39bd985b911c4048e392f2d94d34b7987ceb0ebb05a3fa37ff680caa02cfacb3d570dd2710012faf63af9d73c99ff341734be5c9070d6bad1a568fb0c394d5a06c491b5fddf0c5e8e0b3546ba40e04e68c746ca7015bc5c2c589c4b1238e4448ea31cd2ebccd2a6dae3b22d33f4788e9b38447471a5f0835c1a47a6ea8117bd54523b3b890d280337d2c1eb527f056e9e51b1fe5c393a16f726c6c1895429e3a263f56e90fd540d24e4628800b338efa7a8494fd131f19c45424811c8bde758c5a37ba09f3069336e24e81d3276688516cdd1410050a6e376de27354f5b2649c3140bb2446abbd2b468a0054c9d00ff5276d043c0b53d9cc317235c100232e31b2b2f6d81fe4cad5282bcbd64bd9c01af7d25c0d027a7d95ca4e991800154dbf0052302a4ef4149308c61d1162869a6e5bc47348289922aa78e937c3dc5eede5ea1127e64b1e2bbe396c7a0f8a0c1ae0eadca6003c3d06585a77232629b4f50c117acdbfd996402dfc854d20620b3823f686c8c415c49d197de3e6e06d3fa5502d8f2a1322bddc45c1b55e56b87d20f81295807da055d46e5ce54d0aaea47160d099b9012367b1b835286aaf222cd090534794f52f5005a988d58e595d0bbbf44689ad9619a015b4273b2e772130e84ff100b68265944df96bcf67f393944c56bbd124753750a622ea8e7d61cc08dba44ec568a107382582954ce444696045eb6b1bcefecf53fa4a26cb43d8b2d07f78c33bae6ae46ef62839cf4766adc19cf45445bf0c442d78c2a31a33d173d0d3cd846222348ba0643ac4a512e5b778b42622e43620bc79650b1eb85c26750d6ad1c1674e49b2f5011d7e185e6aa02889d9773d7752444ff806e3d80c48f8265d32246037ff3b6e7c10aebaf39d11c8a9614dbf2c34028f6d65f28db533fdbb35f72f28d32aafe8ba82fdb7c91da62005004307cd44589dd348e30aaf95ef21c2c5d51a0bc749de3f1ad6dbe66b16d6e4926087e65cd996dfff09e9f21c6093a8f5f89957de6ac11c1238515ea6c07d600785833796e0aef0ceb4f9c37c74b6ec35f267e4c556b1a2069bc67e27aeb7c1bec0b1ef0149cf513c3a5568d65d9fd3980fc9d711992a635326143b781a3992da82f00647dbbe39302b37acfb8d37c7093ce6074a9fbfd23c63e5dabadc7c954922a39f936dc69feee52c70c2fdb4131954b4f5b93a392e4801cd602a982ac85f9895028297f8c536cacf522364ce29be7142e5afb0559b49272afb98415f1bb8035b1fb3acf4729511ba6a1b6384d099654aca23a97431afba36b1f46742f8f72b0f1561592a31f5908d4d26de5b3b8206f713b3c05cee1d337b49bcbd8fe3998df4bcc02bc1b4784aa9a3dd4f54be00b9371e0beb012fe4568444baf1d3ed9e088fb105549622436702b72a1570aacb6380b7b2d86d885202263beba105d186dba5067bd853c88f90e58a7110c7e34f3d69d8ef154e2964fcb585c82739832419ef33592e78e8546087051e3b97774b34a1fbbcef28b03f5ffafe3562662dd6ad8a381db3623ad85a7d856b88fe8d7f8fe31b304b2d25144ff68ac357f0017cb8815d883e1d771900cf18613fea667135b45cd271e14a0b3645d822d4660ac0eec1cd179dd9fe724f3e26e6c006c3a91ec36c14e0e1cd65a42e0d4e0c31d4622768581ea7042cbebe65c73eecdf834e3807461cf2c51df7455cb15724031e522f7d3f8c67747e36eefa2d9b48cbdbc0fdd975960011100da999236e4d21fe474662da4a18ac76b00463df7ca31ca974eaa6986b666a84ac229dc2f926c2fdeca9c88e200dea9c00157b2796205c3bcd4cb890a6f057f4fc5f732c221d1b5ec80af740935269b0c0c4aa8bf30c7f9218026cef1bfb63ad3c34f2a744b10460910f5270c7cb30afa6ac5cdf8faf801cd9a219af5131a0752aa8765a367f081dfe39e7153c56be942a400d902d2f08f7684816a7b4d028f16d927d566b946964bc0e5d79f5b546551e43f09b0143eb874582a324a70ad3747e416ee6d1c151ea7cd930430de5842596036a49f84f76858568de2e21b998a19027a7c23bf1b83fc9836ecebb0ebb24055aa67909f4408504289ef0001e5ff9992599607827157e7bc8fe40544a774373a054da156ab81b26af00b3cf0fde077c186ff1552c9d81e3f2ab3efeca312800d322d944b074c2f1a4cdf7bcd28a9dc92f610ef3f4fa1473cba6eb635989727424bde0a8b858cbfcdd41107e36ae22923b1997762be26be37027cd182bc168e0980156fa13fc0df19b7356ff25551ed9aeeddcf9262832c158cc6a65221722257f398e19ba3da1aa36df8c25009955bc191920a80731a68d3e57510d2c4e21018e20e6a4489c48a76cca3e3a5df1f3968dc57db0a1f6f6eda4306e63f61897ddee030cf6ea6fad410be106fb216d9903134cca47cdc400b4d474d6263f6f2fb0890c65495ff93dcd1841474608a1dc58eeb06f20896f1f1889044a022198e937fb5915609339965fe0fc5b9f393109060a6e6814e623512e6d2895bf0f5743e26412e07c0dfc4a9f028a552e6f56097159709807e311544c6f500d0da81c65159889b9d188624575296b27624592364ae5a03963fa38c13ee1dc8b63dff680fc2159ff690cddf4e6f7f5b2fd6bfc945e849e189db2c1caec10b752b680663031254e5303fa8813b18877ab16b1682a8ab752745f579b987292438e724ee307971f41396bf5dcdadcd097cea3f5b343569ef201a6178c4a88901803009123829b23667f51b53b567eaf2e9a548b8c12bc8a4cc33f4f54498a9f00f0ccf284e64e5d0e42a483900e6004931d095fe2d655db2c2debfc336bd04c5af6012e55214f4380aa06c431685c90eed8726a9cb50a98bd24121ae93d005a6921bfa46e8afbea85b31e8b257b04df79610ddd8c5ec7657c13a4553487b0999192a06dbe6aad836e20e0f1159759d15ab53f7dfe1a2b620f0a49f447e610c3e8974d2122703060171577b998c45ffc5ed286a0ce7a95e2317c61a1fde0b010e28552ab51f39fff86bfa0bed7723b6a3b5753dda837474b85451b9db0a18e542579ae7bf89e1cdb6e2f03d63e8db2e810f3e8cd75ae849c47382f09097e2aeaf45d667e6971ad54bf2b1d53da478054f4c5f60af2511fc4054ed8554e6af62fc0ff3b11f9e697109a3d275446aa67e692f06ad7a7d4d06ea3e1838c64a574fa5611e4b48d95c8b748cd3c3fe82cdc1d2a1d9c2667638874aff85941a3b34fdf53bfd83c6d3a82c1d1d2f605e273137a82bb94d8cffad8c16a823d610efd2f40dffdf5bb805d1a7c0f1a33e0430a92e677352d15fee12be518f14b35c0bd154133c8b697c734111600bb4adf68202c8513beb92808fadb018b604cf59629ff8e5988ba69da7fd42bd1ca11ba81bec5912286c5f720d4538accee518fadd83e2c373aa350596579c47105f5c4862d3edc8d26612799ccf1ae882158df1a657092c135c2dc10aa976926f24ecd8013f1761eceb0f4210b3b875028aa22f7035acc37176e25d197dc6eef125f6dfb614ec8369769d5e94b3093adb5dacf591187bdb2730cbc26c35e1129d1285bd86c2188f196a1961788bdfd18c13486d11593a8078c9ecd612f305cc4b1e501de5d5a06bccfb5644f82ed993439ff362362beae3544234bdf24cd2946c7d7f4be38269e5fe521bfa1ddef4d438e02b89cd351290fd46408e7891c0733e8321bdea3d19f70ea58af6aa4297e9a44a5485251ac70c546d36d257faec94d5915b8e3acb0f7fba1d82e039bed53d08e0f1a9a6b72ebb507311c5f2112199494fc1b9c9a485b1f6c2d0a8c11f5470a26de24f7f40f755de28dfef9c4150cd79c262236851e7bb36c47df7ae4b45b81456e361d7c8a24131486e7a9ec292459fc5d44dd6c4df2ae1fa04a5bc7d9d13dc1f786894573eee27c59eb0e7bfdb659c070ec5784a38bc41b1857ec8753b722c7fcb313a09e0a3cc0d51742cd77b5fb510e572cfce0cdf1f1d0d91b2ddb76850a2a9f5a92cd3f37abd6a1ece8a322e32f62235852373a900329a533eff588ece69e2d6e5fda37b2129b3e1780e11cec191e1b6fe1c1cda6d40308d0ebe35ede8dd23ce6f41def9f8b96bb6fe763d458db3b0dca7583a783e8dade22780eee5287ac50461e310390d05c4ea46a9cca3c4f1190b75b37bdac2faf90e517f531ad23fd7142739acb341838d92d376b5090dd7fb283a317b4c4b36560b8c136e43b6707f1cb12ec44f7bd42ce97eec831bf8a115919b69e1e600edc6aff811462137fc89ca95f3ed19b5d52a27d4e8945560796179db3384bca7a8a1e9cede775a3c20ba2f803dbc5825880de77e29f610a7a86cc931ce134b24d10cc2adfe81cc7390b37d18e75e246ed18f70a1fe21bdcda36ce508fb030f478bb815e8640de5aec78ab4c91b619eb1534ce4d94f2521118affcb928e92ebe831753feeccc315fec9c92b22f8bd5ce7a909f91a27561d807392ac0db480097999dcff472e4b374378885135c64f2691ad361b8816408f027c8f1f68048b44fb4f3097f84f5a63ee3a2754f8166bd13c9116d5b1bc2144569b7d6ba3e7a8da1dbbb5e0a8efa35d6e8ac97a62de4440a44d359fddfa436e8a7a63140ac2c65e6f9d817721c0ef8b56f8cac3fde8fb1b1a9d5ea362648cbf409ae4d02007a57e43d2dae7129571e31e14198faa999fd346ec4086ef60e50d4d673df706b23e7a17f73103ff9d4b347aea1a547a19972425c17b98b54430d8dc2fc284ea1387fcbdf4244b4a1255a75e0725b1eb66c3f35da3b18154c37008fa0c15ae9cd7c17b295e333bcb41ec94d6e881829e67f64eaed4c67f36ebe5ad1f7389189bd9007cf3db736775aca3bb24fe0ab95d075cc47dddc757ae4c7c333b4e48f52ee4e6fbd807adb662d6209a7986c9b6708c8faa25d782e59a3556ce08376d9bbb873c84e3c96485c06c40d86144575abf2079135a3025e8b869a3bb01fb04b1d4bf9cb6e2f8973208cb60d03b7cb3f6469aa0276efd625bac770e668288a85de3ea37090c08056d14c596ce8ef91bb05f4b99e2ad6dd59d8b3ee844f54074eddf23c0bac28aebb333b600b4448ccd15d6a238fd36cf24d4491068530f4e9b3afb14b36dcb4e2cf85bce5d17eaa85a8e5bf905ac283432a69cd185ec881d286652d6ec1280053be6008fac09f437b422eee667109bda6441f7cfc1587a20431912e1fce82856f7979dbf0eaeceb8780007d0a8fa49e00c6b7cc49ef40d92fdabb83535cc579d12e5b7454dc18f6aae537ecaf1fa79a5ca4abead9e16540d7ff5ae544258cbc094cbda772d214452b84f52dde77643400fed1a67c71b1f014af296d47a06ac852121afe2baa2c1d4750c044824f1cd4669054acf67af862af737001c59390dc92b5efe935df85383ecaffd1525f056b0fac1de818e9ddea16b779a81aaf72eadfc10c2659822195fa0af0303231e63bf65730ea953243854e5cead9347cda6bf3c1c89d6e3c8f431adc8ec07c155ffbb6b22cbd568369ace48bdd0a00c0f8df82b85b12fc2741659b1981869522a7f9215949b435d153a14f919dd5aa41a927e7467dcd2ff27ad943d5c43baa2e1d5bfdab01be6f1fb814fda892b3a83bb2f54a757923d619eb336c78a961b969d50b921caf531d6e13c76e28651a73baf6038299e1a8b0b83592cdcff3d3c668dfa66a226e8cc82582bb96fffad87133e16bb85306e092028ee24187fdf0723b949ba4092a9ce5718d9de2742545e1fa2164b40ec08e50291d9143dd812db3d944d1132c1751155f5ae10d6f0b5b2dc864b7ac4a8e145aae3f6bf0a770c860878578fa46b3cebac318cc4550f0a2c6bdcf7b165fd58e311513b56c063cf3946d3815b3cf09fd77b24f4620cdcb839e46bee8fee97ca245059b176ce7cb047bee8070e8f7654c492cec1f2389509a37c27c5b039458ad6c440992ff2281fadc48c358e5c68b26e01e2833cd21c7d5e17640dbd6150fd1b63d15711d2fe1b375402c4d89f10cf4e20b279423c094bff8a16c4e5922bbde54758f9e4b0a51c3c280548d7c723b9a898133fc24dff08e410c59a89d1acf17823bc68c0f3b82835050425ba88e106a634a26cc67f6836b30d3ce6da12fbedfd1d77bea8e3eae922e971db0c6e5246df2e539244ca95ad39f85f61879f6d6fe02169db324d30fb985d9b0d02511d7536feb09533ad2216b93dc80f88f69da700203c1a5576a85f4d678a8a3fe9c4d7e702dda389da761e4a0620bf897ff02eaedb9f3cc4f5d59c2796651fd5c5469658361a3a171be24e46e0f7c02f7c0abae93c2bd2bac19221a8d4194efda2cd0addb8170101a1e7b698945d1a3fc6507cd8f575ccf0daac16d442cbce6d2163a44c63bb01006c1d53df7ce12048d1df75bbfcd516d59de57523fb0aadb2e16dce503469c54f9ab488a9e71432acd6adad858495f2bf22b0dae13405782151e24989579c65018872cc6c4da1846e49f4f449ffc22158c99a875ba8fb0891f04057e46d854ab73566eac4b24c2cf644fe79be8b2d076f0f1279d0d529463f7ddf92d11a0dcc1d87e9a4c36b5e407c43d14ed751ab91fcc6f03830fba9a55ba4a836c49310862f8c4ae867bf700b1e92b0f250ab5416a5dd6ed94cef95894c1eba5f028ef799223ee2a93baaada9a12945c96d34b2597d48cdb9cf3911eabcde036ae2260c0777242ad82501a20681de26410bd490f871b6490c0e259da67bcb8d972dc35176be02ca99c4af4afd57c637c70542ba51fbbf5ead7e9aa86a541851b7dce4b9608239f28f182bb084ddf8ce302d18809b79d34d3af52c0b9e4e86bceeae6785a0aa43bd91441debf7ea568f3e9bffd2f2b5a2d2f7188caadcdf1839ced0f12a9ce2bed9a01c97ad11f33210319eb017986758539ca2fc3d38bdaef2a4dd9935d76f54263797526199e0c501ece302dab5695b5d301232e21ca93dcf89ba7e1c41a7cda00444f73c1bed050b625bff2b654fb034a34c3b6d5d256525fb454946af3a57c638c0027018e6315025820038edba7717425554d5ff81e0043b46183e7b038dd1eb313b21eda7a5252bb79429c994059f059d05ee5e394b81f4cc10135bcc2a20d4aa71271a20a2ec6608bb97d486ee7a9ec7043669502947021c90b6f941a9a862680b2a5874edaeddf56e2783c014d60e4f2ba8e5ee39a094b67156adf7deeac37ce1fe055ea0555eb8642dbb7bbb7beb774c2a125c455114a94cd7d18a5db5d714b483cca69523cf0aacc5dfb48bca62a8e0af3315efeb2e092448ad5d9ced56ad2d91286a51c1f70bc1fadf0a750897bbffc617f03b832f1a4d99546e0b780992408278b5ffffae73898e6bd0753b58201acdceaccc0b2baba1019b56666532dbdae1a9a87b6f50d7dda08abaf7de7befbdd7ca605405a48427b7765a16c8caecec0b192d4836a38561655666adec666545a85dcb99afb5de5b513ea8c9bf070d9bd42624c80b43485e641b80406d340c0bcc66f76d776f773e6156e1f1dea3b68e729eb1f3b4f606c824a740d060e7fd075af718306e10d9f9bcae71e05a1c5964c8791a6515a65081cd537737c75dee9ea7fdb6f0561744d8e2e91482ff5fad484618974aa99b4762044dac60e0c143841c56de17c1e1c40a061956ea8b14b5bed9a7f7e2432877a4675337d865094c44c84c0f342f6ca5c0d6860aec5d3d35f8c4bdb5d69807ab28cb713d7a54c62b0ce655987f8d79f53eecb17aad9abcc2621eae308fd523c4605d9f1c51aa4a64b7b54ec971026c654062b10a83da825a04357985d51912958858ad8adbbc06a456f3d8d75a61b00b1b65e1f2c1c3353ccf74b3bf8e5a6b3c146cfaff9700bbac81e8d7cb5adb75321910557916405e92496ffa0ed9df741cb23b0d253030174110f5132d4549c305365bf64205a92f2c4f3328654a57b1e2573e1650460b92cdac8b448e5a22d2469a98344b3132e05a7ab78c346b7da17cf15e006ad92c0b4f56a50717b55b1450a0b47414246cd0b220276870f381bd5af62acbb23cd1e0c86432dc2c5ce4217610815b07761791f84c51c1114e80a812c4598424313c3102e80836228810c2153934010377ccad7f14f409b69f2a551e37a99bb2d6e2ee7a9e77452b62214607d8a44396085575ef10466aa81bfad1337428f5e376dd5dd7eeeab5f751bace5a8bc4b62a0abb632ae3b42ca6e40f43813155b9e7799885a2aa1615d71bb62dab43dbecb87525a66d926fcb0fee5c5b16fcbcafc901db90ac372a83001998b6655b15245be4477ed9c42f3ebaef6fd23487f839c44be7440cf8720da308d9ec406e32b43cd9dfe5013ac06e2553db2a4013b721dbb2d60ea1aa3ea98c116ad337500ed09a3e424bff30cc26bdd22fe80ed39ec1f94ada1695b13aec58d2a453429bc4fe7898f60c8e0e3de36f2d5525b13f3608cbc4f6605bf6b4474e1e92dc6075b0d6dad2cb6eb104e1f2c1f36c16c2ebacf5bace6be5e4e47847c0b854f294a7c25577ef2aa71f405119a05df40ed434c5ce0e166021b75b776f776fd791426a0a2645f59e759dcd7a56517446bfcf058aa7f5fdb6511185133be0aa60eec4239228a77e4f2ad941e27516bca97ed52937a0366827a8c967b5c6218a255e4ef48c06bd6ad7fa23674405921fd65a4bd37222e6e19696166bedbdb7f680389b2d5fcb6d6192513ddae45f5aa2310dda8b410fb366128410b04967b4d5450c1858c400ef5bdac6592430c46e89010387d96cb1221fdc77a4d93df7d9af087c5f1012a45576131f58cff8d7387bce2c17848b9b4e90d3663bcbb2ddfd44d3626912528ac297a857020b9808c3587fbb805c40b556cea640556e53007201a54055a37c4206bb6935a8499001d36af27650812b479a9e875d2970b6a660b3376963026cd220ce1269d170b62c47840626341e253b5eee10690d0db55c2e97cb1506155155429cd7dddb751cd7dd8ef32e776f2749c1401bcef33ccfd3f3302e95cad24f3a7bc9a7939f18f320667fef82a27a54d153d5e8d523b3fa749602ad11bfbf8eb46fe8d35bcfb2b7784e96952f4f5652485ebabf12b35ddf866254e5372ad3360e069d71946b718b79f7d2af198a9ce7aa06e9b27106213372ec804d2f831485134ce061838014aa66074d090730c00985110af9cb21691ac994ca80ffe52a52a1c191a66db8f7afa12a7b42d77cefbf6a94906a7211025680f94ce906db456e616d93d333352704c35b9a5c6ed1964e24fceb05038e418643000910b44420ce447126ce70a688271a171e60d3676215d96b1d64c7165eb61ab44d0542cf781254557f36a33fe8166bc64275b5d95836968da50495715fc2d640e5ac434b5ca1c48d0a0f72309bf98cebd9ec05483ab6020e36d575b5731950e0130d8d1e78dde5ea7bb1047ed18fb8db799f0882a208822228e2920d2ad33d5ac0f931125d23bc2647e73d7d8f74ef1f2cb458c1d05df95985e1c8c377b8d77597eb6a46c1e5b8db7dbb76d752a9543ad104e534500cf3e0c1e3c6e3e63c4ca0a80c501e94c7bd97c709f95b75efbd49693d03a9548028b8928d4b304408a5fd4be9a5f7588346a6a22134448478c9719c901bd88328187cf1459d8b87df1786df17863798caf468a1af9318758e4b71dc97372857ffffffff7b908027b0f947b86b84b5ddddddb456abd5969a1503a0aaaa4577418f24f191b4c29a868ac364e1355ccd96eeaee38be2fb76e8e0cb7d9f6d1b259b63ed1585201882210886208c0a5e48842dd992b57609a6f964ad2ddd24b0216262101bc795a003363fbf15f946079a225cd4ca912ce36e9898ddc864d55a1bcac059778fe950957bebb48eb78eebb0bc465482b96cb68ee77960365b47a70059a7f27caea755b6458d1198fa0992459c78458a38f9de88e85db84324c062c992d979ae8c846469f420e9bde927e8cdaa492ccbd213d1f7468c88c81e292844f2014fc8192ec03362d8ec9a9f2dd30c93daea0f075428217041134d5439cfd537a46617beff485fb590cd2df423fbf959c966b4203f79f0c750841445e48089dbed49112b0d0411032268053540810dab181c2c1185099260e2830e371fac4822821038c18328ab2e7f932f448ab4784e96ffc028c1379badd380b39aa040c12dfb6161ea65d7752c2ab048acb53c6e64ebb676ad5dbf01345a47c3c929556f089fac141e418bf391644e35f9e3e0dc00572dbcf4e3dedbf578640a0d94ba490148109c1ceae52e75e7791e8e58853ab9511fa2619468db2aea64baad9e6aa9528a04b5c91176d0cdaafa2526b887fed1a1548fb816fe0302fff96979905013d86c2952e88debb4aaacae20a49abaf356fd2109f62ebcd534dbb716d9ba551b25b0e9b61b28aaada0282ffd4079a05e12efaf6d1b35f9b78dbaad34c306d8a642bb15d4e4ef5a64f7ebf4c84d410777135411f805e77bda3aa88a661ad92c794b696aaa6fa34476cc4b1b35f5dfbc3337f952398e540097abb5914db76580fcde857ef0fbcb8aaaab7e2afae1ab3004451d251d54d5f96b792b742bdc56e22af743fcef2b19b68833eaf0f7a477017c4c1a113df824d288931fa207df88f8dfd3d58be83fd2881323df8b4f5754f4d200f1bf7741f4e04b7d52ad0f820f7e11f1bf8f0157d3e87b710cdb43fde0171cf069ee79f9e12bf13d2ccf7eb0fbaca67eff6981e450ee17057075a749063a3790b5b67e3216936cfa151d20f1440748b4ba6d15cafe3f11e8f1f9a9286fb5bc490eb0e9411e54835c6eb3ef364779b54c3327a30d7185db4e1aec4836eb491b22289b15496d551ece36cd7fbe2860904df1e34136bd49eed74bedfe56f2a52315c07df7f276b5ea0ee9362b7037f1f2891400d12952cc327d220550725f89d1d65131884143eeaf38df87422a8aae562e0f80826df5ab5238192c389a1938a0571f29a49aaaed4d6c8495cd97fa666d0d654b5652011c8b2df7b3d872ddc9fd54258aa143659aa454a65dacdc272f86ce0360442535268962786f697bc6852e069ef0826656e169f272d95c3704c52f043d1f31402f40cb0dec38b580d3c34b3a7389652d4597f8a2d1683412ddecb620e2154f29c70d8164f414a0fd6d857034f748c14b27d8af0c4890545fb46b470f96c0046a5c0902fd41ad8a152f6f30f41739d490fda9103e0415c28570215c88a6b06aad157b582c9608763f3c185b31f4c48e85ddee9801e3376dae0155554155b6793a1f7c6ffa125de3bde94d0c45a14fb21be14eaea8e00a26a997221c960cb9eb50158b0df6d3bdd8028b4c6d285a2b96acfd3ccb0297c16f9efee28ba1da36d5c7a7bff03e9f1afb815558eac7141f91bbb7ba8fbae7442b70b9fb0eaa57daa6fa0405f9882e17025a77a82d5645e5545685d9278249e48ccaaa319e656c1289843189a4436564e8191abc87caaa3c38e4182ce0bf71199c095691be66d4830e2038fdacac4ca23c509b49a3111e3d1e3d1561d288d52252c4cbfe3c2a93334406a385d739c21eee2d5763261da56a2a71adf1bcf4b00bc74be26a5ae5c8019ba7930d445bbb5abb5aa5984049fde488da3019fc68c9a2dc752ee0a33084453f227dabc6f39e52cf1b895c72c0b4862f3efe112647346fac3f1d8e61c32a09949b60fb3d04361b06b3e10fa491476548a4e7794360f34daf05aff9ec8b0f34ab39d1dcf032ec181e6c459158be9737baef5c3def44d37556e4a384dc7df7df77d77dd8891e55798bba0f3f31860783d947090f8082452ad84a9dea4879c9c3cb1b2f9f7ab428b2141253f60fe271f7a3a41d4df4f95d8e2400cd2fad557fd4e8149caed68ee6b5d61a902126b8fe094a251729dc6fd7755dd79d52208aa21873c4bd57acd1024e13f11a9bbf4839a879a8aa7e959a0fe6c81aca7f7eb87bafb5770a2ae3544e1db811683e84995f21732a3258961bc187e05778cd6bffff6fff6bb59193ee7a9e57034e95b8ee0e6977f7d2085b1d060ef31712f15551f445c209b04923fa91d60ddda232495c425ef5096ad352aa26efb339c13a736fdd9bc140077fe9db09cbbb7c7f59513a4e484fe3fb5315a5e3a4e571bc8e13195fe3fb712a4ac7498c9ff1ad0abfdfdb46f4a3ef97cff1fd371565e3fbc3b0ab189646baeaac4863a42b4e04c31862a5b4c610516c6d3f3dc2f42faeb8151772290ee4325e40653036503bdc11850cc46305773c41c614d8b42e235d9546ba32217bee1cde9147c663cf8c1b23ae26f05fc63a62df01b29077b451b1dc8000295e9a50029278c714ea550bc00e668877acb10162878b78471a181b25f18e25bcaaacce700499c0bae3010cf0825a824d7bdac1a6bd21de71e6a760d38b110b008343a8060f6462606a0891b08317efa823b3b8f818208643bc230192c0a62d07905d3e0cc3b1cb378b3c83e58c91826118865d078e9dc3d2f455942f55110298c5306112ef1880224820610532e21d73e43b0220fbd0adda6a509d5559e562862ce1076c7a630c0c8a086c7a0610eff839868b02c4c4c8a1026cda3bc26416ece34036403a4496b1ca882ca387352c38f28d9156173183e00d9290973c66804d7bc7172525b86496b1677c3cf6fc93c69e986f197b605ec6f8314235acbc0d29f18e364a2716d4c8a39165ecf918181b2375f0658ce0c718a9837f63a46e7a19a9e718c1af31d6f02b29197c17ea24f834c0c701d250016146ae2c1b285a6a32328c0d1266d8f4b24abc630c96570cca942aee56bcf47120978243c84d7e23de11cb68cc12f0031ee21d492688771cc5c0f0b061d3cb278877146596b127062606260135ac10f3a4b1e7bf65ec195fc6d8437e8cb10700314fe371903fa39e00187dc84dfee4e837f71f9d36facc4dfe30a3c3dcf41a1d082a1344cff878e93f2ef320b7b9c97f268633cb0c164ea70a22cbd803f378ecb1f1a4b1a7c6b78c3d33606c8c3560d3f321b28c3d00783cf6904f1a7bc66f197bfe658c3d311f63ec81199de6350090a4cb688ca4cf703ce941356248b7c1907eab261f5a39e1e57005b11b8dfef2d2630ec57d1cc8a5b8c93fe6079bb634d2158d91ae70d0d58c9b59c69e9717d2ab26f0439478472eb3e01a336268814defa50016971709b1058877ac9965ecb1f178eca9f1a4b167c6df181de63f2e36480f6f9eb2f7a512a945413d54a2d92ca17dab03bd1bf87dde144bbda006bf0ffcbe0ff4321586e1fa7c70b95c2e57795dee1c17f33c8cff735238299c20ce5551a9942be54ab952ae942be5ba9dcfd7247563831848c1c3aa080c5e1634ac9c803e64b172e2a5522f21326eb3bed1fa16e4725195cbcddc531486f07bd7e742b931d2e8566af272b9aee77da128b2222b821f1882e0ab5bb55ded028aaa349a0c6a495421e5d6adcb43ab282f0926829ea80955e1bab980ae929d7b77b2ff8ddd9feb22f5e89217e6ba6d807a807ea0d27ac697b066a071b6de1e5aa2e0ae809abc6daeebfedc16e4cbe4d2faca50bd79596fd5755dd7755dd7755d34d7755d2e1a6088a62826a00898d6dc22156c0eab83a997306c3eb773cb8246a3c55a68349abb68937eb3a5a5041260b3cd920683c16e8c46a39568b4ee2c702d75d0a6d0acd460d5721c5769341007608427188608282bbb77b6fdb09a7c3025ad35f960937ee11da126bfa19504134c5630882f206225f26200de493a4faa6251957703a549681e0f3f64ff1d5d60d3dbc9fea7245cb4e63bc29706883f7a17441fb2e09d2223e1e8c5cf095f04247cd23b4dae66f2c14d9a9e128ec76bdc234d9959e6da75a4f9b9d65a6b252f409b524abbfb02fdb7eb064110bc00f74dbbbb3fd20c7b34c7cea15fa77744b3d7f2922757d7284845893e7c1159c485091dbc38c275aec45fd121d7171c1095f1f7744a3349b0c73a5d6716e2063de84276aee8ca3b7d87bfcd0bb0e99dde792393c9ce333c598cd0b1e3c6b382266043c02cccc2603012dc8041e99fb6711b44554217074fec80c765d3423d73b3f2051695b5127d4575ad8622c8fe3c2c25fc3ca2f6e4c6821a10cee3435134e64d5efe83f3e028f025ee431547350d0a219a15a12848c0bd381e8ec5e970ae8ae290387784dba17133f4803b87ec687fec13114ce12c2872c5c19012377b44cdc294b88bc7f258988559988559988575b0cf454b944ea7b2c4d8bb8c4b258c697f36d5f3f186d2a43fef337db95f9ffbcc3ebd8eda5a74ebd84c7ac6b9116c8ee3a27c14fce552459d4e2718601db3dc83051dee7e7ad540c2f3e8d39bba03099ce3b9bbece652f12190745d57f18b15e29ef79eac1d97cf193b799abc60972544abc9a973eeb810fe83574e49a1ddf33cc24312cf57a7b2bc3c63804b5ea9068d19b863f918cfc9e823f5bf50f42459921b4aa4d953d420cdb6a2b5e821544fa18d2da5674032af67ff406b22d26c20a8ad5960d2225cb2d6b39e95bbf7767b8dc63b48aea51fa51fa5f7da182a58465d79f78e5853aa79a16568012fc1f0a3b41c097c60fd1efc5e700004f7f7385ee67cfd9139dec5a92820359c1c20281042444845c55093bf006e62294aa9542a0919eda0b23f5099465926d665adcb5abb049780ca384f0a4a5d13570a72132ae37a5d97ab5a6beb698a30e62530b04965415015cdaa0c025ce98a08076c354ab3451867c07614656badb5a993d310716a41e1ae6eeda0367df68c73d6519d15b975d078a9c3468798fb86db799e475aca1643535cfd0354fbfca4c8a6d8dd7d8a278400777ef1210056e6de51d4c74725dbffa8f85863c8768c21e330cb58c1ef7ab9484b74ddf77ddf2773b9ce663200025aacbd09f1623461705509557927d8cb87259708558527245e7471b2893e4609a8949b6c64e8cce8f193587600e479ee2211934e3148164c1a89c410fcbcee72b69ec21cfaadb5313c74cd1578884584e33e161bb4d6aae3f4ed606b77c7aced3a6b5962a63925db99f90e1bb0bd5c07c3f67242b87b83ea2d6c6268880891a121224343448662a68043e87b6304b871cf39b1768b00656ba42501c64cb676a8aa661c17c80f3da88c8fa0b29a46d9b670d9d211842378740ed92c692c070489eb3879e9251024b756bb48ca56d96ab55aad964fc7bcc76cd683aa46dee36b80ebe32a704ca6b420c0b2153580ae744c07c8012eabe90936db25014a8584b05089cb42cf9d72b3ceda3a45029c04a814ee58d5a854230200000000431500001808080583c17040281c95cdcb7b14800d58723c78603e9ac8c3912c098210043110649c418000000821c620658aaa13bf705a6c5dad22db88c098a5623377a1a3a6f6a3318c2f22a34175d1153c104768a2d3825afce7e2bffc936ebbfe2542095e915443ee03a3e19d6ff77c28b5b458cc2c90df1032a9f68484591eaeb934a9d67411126868a67eff58e5c1bc883fa172ac5851266c26673bcd475529b02399d362d1dc4fdb3cbf87c9992a460a0171076704932df0ed1ae786483d0b517a2e4e3bd41bbd0f7f330d96898005c35a31d3400890b29d8b126f6360eca2bd3278b52c9c7022140f04714bd4f030f5383175e7a6732887f6bf1c6439e645d41489ffaa7b626db219711508568c18fed634e738aaac8de18d7d1d25731501cbb4b1ce088c47eed9532dc163153db9fe6d0de7dc62fab52645deedbe8be5ec4f4c28fa8924f2c60970ce5205f55879789bfe20034a9a81137acb5646050c4b2359dadb8fc9bfc0d75cc038ac27b3384316d4e4c4c126de80e3731db011ac5110fdd0108285ea009c5d60d2cca7ca3e9ea6d55cf788e609300c929b02c63c9c23ce75aec290c358df631d8b3ef3800f46b3802e41226889950005fd45611729a679c32ed6dc8ced67be32142f6570e8f62bf50a96793c85ed8cfcb700b9532dd45c2566f23618818d639362a722abaf7a3a6ccfa4e5741ea0bf4007346ac4bac2326e4bdf40a0539ca97386171dd0f726902884ae0e2cd121973b440e481223fc8166612bb5b34f18b6aaad806c8632758e0ce41b43479385b50b301f6949ff7c4e0cb6389f58ae3d00771e19c3f1d0670e2cddcc46e2c8d7b633a6ffa06e25bda8983a1d11cdb02c66ac82b0ff4465eebb5248c62d009f064e6039d6232b9719f3b42c5208f403a94a77324a8517453500a052d3cc9ead6515ea9f8e6ec770514a66680f08fa4074826c91e96b29067a86c1cddc68b29e637289606898c5af77eab559664ab4a07c39225013269279c79982f20a16eb3307174a74befcf272baf421f08dc5e702932f27e4cab67b4f31a8a005ac74407386da7fff141d420385ec08426440bfb95475fef253dc7538d0400e5adda5f1d5af0a590c5936a77e0bc65bb052905935b659e62420565909a511aa7295597fdb66ee7b576be92c912ef78fb9e64c8fb938c28f302223d1b4ea138cfe428c0a130a006d13fb0575c0766a8e78af23629711360a2fd6f31850f9e06ee03809b1b628133106f834ac779709caf71d86679bc79d6a50eeb7b13506e547a9d626a0380e5e2740b2ee3ae3d393ce341244b090288a378a4ac38c28360eae13975260c2146a01dcc3202649f1681b8c9825ea25b1779a8956b8ff66d97b0659ee1ff19b6cb36e48f400687ffbe2498e22507baa8c35e05c7f2ad6f01b790f1f41ddbd585bc908e13fa9d4886f1c0c7199dcdd09e0604cbbacf7368bbbce14036be99b1b8523b9e83d2f97c80b1331827b4f5f0eb765a43bbeac868fd8b6c0113e54cb80db6f2ac2e94a146cae46ab397d6a9790545be7f2e1dd76ade559804bedd5c66c471582d699768469407c9e698b3ba330e4177c521091ac1fce7e6afe27e16e319c7a7a874abf1aff65efa85b816fb8bc07eb5973fd07bc24af51dd0bac7f2062803cbdc1d23d2686a6ef5442f245f1c56be68f54cd36a52f1329af128d3c4f22caad3c8b0ffdb82057cbf7e73912d99e264de762214eb483363911b909da78a1f49844910fead4afcc9a4beae0c95a8661f4839d639f5990028528a2de2d8e9ef520321474a91a7cec327d4f834a3522d5294931c5dfa19d3841bfe64a8ea1d9156dc99ae825a09f7c2ededfc0ed47d5e430d4995fcc0b50c8a75cb26050a3af881c2dbdf17a0ece1612aa321c344c3e109abf873474bf1a43401bec9ba2059fb67d4460448b10322e4179ea3ffbb00cff3da5ec07bd2d0467e1955143eb00aeac08594582880f84f8346fdde62ad70f4a6721b7498fc030928109bf1f30cac3db6f079c2cc10cc97ee14d153a43f2f5ca582d9f5f4b40807cf0ceb7c749e17325ce9d27d12ba09074a57dfb1b57e18c58d170272502b06d207103a19f02bd987567a7090982945fa8dbe95b371b660404b658b04f586fb237056a2dfbef436733702d960f30cf980723be0bdc5533cc30a4c1ac59a4c3e903e38d57e6843940c3a02351af5041e2fe2e4773b02e8dc3a507322cb62d0a9d921d3a092dbbca4e5a1563efb6f7c49ad58c883577fe0bf7bf09cfad2ea427901550e8a5e5e46eb0143a456bbe3326e9db3f3cbd46f43b86067f0004f589303aef00c864ec88815f789dd0ce8b3149f4e377e3d67818b0086bc4c8035522bd922f23a7d3381ef77429b8a253f67e6524af18786879ad97e95170a35a6bca043302b2f384e0bd4266d56b2592811fa3737b2c7e2329349a226f0785ac3a547de921b3df34d555d259a4f9c40b6b9870dd3f42a029e8b18c81bf6ac6afbba87fdf98c85118431cf034eb3222bc4999b821210ee2bc25290a775b63e0af57f3f28f3989592a03bf3f6f8db9385ca8c849db5a8fc19581872d6a1fa963a62a0a9b7c492091179e376a61fe2cead2e7062f09e5feaaa0802c14069ffe3a2d9654f8ea05f61e1d6cb3eada57603fa250d176ec85999a4b334205a8e03a160aec912ad97ad6c37aae8953de6199bc8b7d13cb60df1f187bc5c45be698f1d1879f85d6be3c1e9e986f0ccbdd9e66fd10b94ccdb1ea1502515fbc1948a5e99b26a48b8d268341222675a69881e8c59d9c065036dea22c0c40d278e29a98cac65a2ca26533cca92f8575b025d52be5dfc7980c5c495306c6e7303a27483cd1ef924226c5e10d6217c035ca510eaa7a62599e0c630caa2f897880fda3147acd938b70590422039671f0572ed8d122eea3a45ee46ad735e3fa40ea11522adad96ed89981bda036d239fd80a927ed5177def3c2e2913e03057265966739d347fc2517341ebc898969d304e6dd8ccbb4bb72677edc81f0c7f4059156f85c9d1b25a00b367dab894a5a92bad70b8ad9ba2829fd772b8703fc5d8d0b07b14da09a0140815322fd4ad7b315bb5a18c25a142423eebd4e9155e1109185649c7b7cf11139e7d6bc478f0db38a6a2d237d9294d5307616fb04dd251af48e8a2c940e9907bd032b35ba0414d87785ef4d09bf85a92bfd3969cb23e6a62614a73ac2dfe0db260fe63637f90fc2bef5d18a4e3e0023b5689dca9150ea81d19538127de33f5756a913a9e74046f49b2265eb7dc74ac6738bdb525e8c6eabc806a96b8504bf71d6b674c84330837652ef3f52616ba75e114c1065342aac8fcb8952fa5f779e9aad969bce933ab13c60bc321eb51fcc97066d2d6411bf1b65135724055f7a1611d356562f0ee1bf0fd093d2a943cd031d1d1123dad560324fde4a4a1305ef45de4436ed2997f1b0169c033fc3e9302df86e8b1ee1287ad25091d284a5bebe60f73014230fc19714dcc43ac215e447f883731411cf6b249c6328e1520516c91007b40b4cd7ddea03152ebdc55b29e6c22523ab53118ba736f00009637a78a502147ce1ac669069a97a74718adbdc6819c0404087217ec4bd4ca723a779724d6ae8f08aad16f83ac9572bc817ad5056ed105ef4d02fff413ecfe50c93d900b981a697f1a4ec78347bcf4e4e7a35efbfc422e8b3637952e919150cb4449ee1eee36952c5dc079bb148ff648a3a28f98ce137d5347a36c6a864a256c47bbc871adefb7055a497ce7aa4dc5ce685a093248a5ea1cadd9f7cb48dfcd40e687385081594793df39ef8538ca7978cb95848bc565bcc8003b5b5d3255a5da8c23a09f39f24d458358d1719c5c90fa30e17023688bc686112fa786564ce2ea86987917a377640883a6650821666d59407b3e2d8517a84023b82312801e40a55b14c317e2031ac5946a56de70849cc232401c76399c8b61d1465f091e518847163dd028bb091a1edf0c65b4f2f6bf54b58843fd22507c4b748b4268bd977fbd7eb3d7777eaf2c89a5fdf6574450178c740220f217fe8b4130214342a21ccfb63df3800254680115fa62a3e7c2b5a987723cd6917e7aaef8e9a5ae5a84bdf59fa5da285ca583c9dfc97603d1d240eeb9c6ff62acc51d7848b5dbdf2d215dfa7aaa32d24479557165b5e3983052dd66d10d14f05d7aa4040ac1aed8ea4b3893d0455872e9b8559cf5fcfa0425a22d651668bf7bfadc5744540b53b920edbeeb8f715856ddc7648ec3c8c8d5bbe97242b54fbcdc7b433dea3024088a0c9ab3589dfe14104f49c31adc2453e3fea170451b1685ae8ec4d6b930616f79e760884d1a1d45ea0254f2cd5dd97938349200210342eb4ec6f1e2bf3b1db83014d7546d15546d84bdb441ac39ca7fb30b7e8ecd6e4a3297d8a9ec14dfaaa71e4f36d3bb16337598d493e7b06d9c97f884d4c89fac91b98bbbec873a2a188353627538d889022036ee63ed84e2637f93b60c587b8cf1c0c84f466e23e537e67b943889fa4656db3cbb1820ceca6c564321403d106fdbc9d3c36bbd8c7105726b18d4ccff379f0e33800718fb88f86d6208742ab4711eb424f57f420b293dbb8577b44f3312e1fe18f003875f19458632907e611e892f62d47593f3607646412ef6695311b370717d9f927a5f538588b4158d441b11b89b97d7b60e972a88fa50562d1c6344836b2c39a2c7ab13af38d8e099f324e4dd35f2e3c7e88cda082d826e2522f50542560a84d95de0b0979939d3da47233b60fc268fabb564543e8b7e24c35fa5930bc3a9750fe650e5c3da6999f2f3bbc42a56983c5d7b1c9565c37c41f430644facc9c13f0c669b2d0f67324a1479ae2e995c2dafe3054add67084283a7e6733c5a876907ee666f62b3b32dc08a06875d793c0b0804f4279d3b7709a3a4c3d583e62001195c95968b076ab0f8e4fd7a1745c7077fab38a0a6751ca2eef2c38d3c19fc8296ae8f4342ccb8e5b0b8e5d3c633814e3aef0bac145414f0dc168432201aa1609de54c0b59392e2f6e78aa00bb669d27df3f6a75cba787152b33a4236cf9861076d8ad855587f9a0c5fe432f93fe8247d64b87d3bcb580cae65acdd632810685ac2de28be8a8aadd674b13106f4ef17b7db03729a2a5c856986b5486827d4080c20f4c6e75d32a0a4ac95236a76ea281c8b779595a6658139c96516184ae02bd609fb20353a30300222fa4a21032013f4ab221ca5f0619330d0554a5937828f8e1777f1504187f69630c836c4c52bf62ef4d909d05fed669ca32266b7ee9ef30a2427005514b151d47c24aef4ed72b7234580cff4390f6a5770e8ab67b3a431ea53672b1eb5fa66fcf0b4d4d364a19e21d85035297fbd6a348c550715b53a78764476826e281614d53b30cbe80fc89578f6c94abd4fc5dcfdacdc0d70da1d06f70828467b3f38397f0bec71ed8f5abd0ddcd8bfe59ab895911f925a4852cbea2bbaaa2fe5ae5667dc0a03595e99918f51419fea338b99788a9472f0664724eb0709c1f425ed4b7b8acd77b02194f7afb41cc8440962dc2121851546e92292eeaa9605f8ec839c41aa3c8499a6cfc9ff103e7b48bbce50fe9f83214e6b3282a8d5dd213aee007e0008e33ceac2f9a461fdb4e46605e483b88464c8bed6b4e737f58966df42d5f29defc3764d0bdbc169ee8070c6b9b64f42d324589388e82e662d2cd0b302f20d1a4e5e8a11b7f1cd6267eb224a4d155ace38315a196516aa7f9550a5e5faa944ea81f44daa696c131006b7be4cf5e9b020c3f55e10b0ebfa12c70243f525c0d92c7aed956e8f33f1b314d2ad78eaf87e7d6499eb3839869abcb6739a6139aa0cb13abec3ee3f8d37752f673f581217c935e1979753f794045cbc4185267ecd642469b50d716239e83603f844624c77814514612df59e0f5938fb788bae19a122876a376cbe0555a2c9ceb3a236a32b6a1700e7aec2dce9399880db3a50d4484576283265393a518246513e0bea953a22c6de275be50ea1fc6159fe69184b7ed4136b840b6ed202cd3d8b6a62b246f1ae7d646f9aa5a16882965749e56368fc9edd839c4fe829cae16c3ab8754d9f13a413bb132d5178a34f745a3908d6ad243455327b78b13e56d86c34118cfa83fcc7b0894e341802b0e20a2562e9ff323ea46b0aa10ce41f7bc71b074bd3a36385440820c373192663fde549ec3d0e150be1b984bfbcc514d3826e7c526ddd60b1c4908e892d14d4885d7422b4794e92186f3b34beeadb47afbb28282a69d82440620ee1ad76389a9f762c960b34e74133fe6bfe8c6ef57545e202f3ff8bc13bea1dbd2e848780ea603537bebbbcfe1569169c6c15ca364104371b309c3ae166d71c28ac616014429a302118e2f75680e5ea28225a93c61205e0aa25ba4ec6eda0c304e259bbfb272fcb9f10be6563462ad47c97addf0795eb4099db049e5273577e3a5618a1424eff6447bc0d736638d3e2563413572312271b1fcb412ec090efc0c6a8cfe809fcd0c0220cc9e3687b1f895af5900431e7d6514129f26b31e2e14b1f278aeb315f216a57f74ddef4ef7db17b128f6706b7545765d8b71a3ff25474eb29a10d20478d8300cd0835186c96a73b63480a527163bc39d3df33e3aca1b5946712b007000bedb4663dc7e2df183ccb80e5ee1f687af76c55a5d01290c26b29a7002eec1f615fd73f76079d8eb4fe61adfd09a6be9d54b4e930a4839e5b051348aaedde5ac14493e59f5cf30f0d32b3f5aad0df3ae07cc747786be58ccd7bb95e258f39001c3a8a7e6dc5ac5fc82af9c7c3d2ada7a44479bc364225d6b0077343481552973a5edf57c286c13f945e5850e60e8e0ecbce4d039be5af8f630f7d367a6073f7f3d97a824d17cd67731ed80cdef60721f2cfe4d246a3fd34817e73d07536a7d111f326c37339692fe5e520e05cc0c6edc40b0659dcf8341347c4d9dbd54019c63283a29cb8af3ec30e63203546503e90ce9dde7157537b816192990c5c00d33ef7c6a7bd517c77f6ad02560e399654e4cf55a7c188778e2cc5697fc2b5c575f322d5211aee0135ada63647a6b5c7b8af870da080db40cba4212d194a18a6aed3170d3c2a21f0b9db2e14f5cd6aabc1726efb60a3c6327c5a77dac640d9e895cf1940c499313e662f2a43e6a4ff152fd7a32de4775b963d4160e0da99cffd34d1b27028cf367c94706f0a91be8327ddf26c635367dcccc5f51d60cdf22a1fc9f43d602a011730145a809c2b22f7d01589c5d1dd670aa10e4526d5fa38ec5114511a6de7145401c8282a00dfb8c2041743e16da31985d26004dd19eaa3991018b0c2af7f4cf686ad3860062837dc766de27498eab805ee854faefeaa5b63d1a93efc8c952c36f9a6eb7f1e4d123394e660a442155e0bfbbfb010e99701650ec1c1e0633b3dad68497e81379e6dc09e94ff47442db238e123f1072faf82cb7c9cf70a50c9ae7e000723f96bcb39a472b86a0efd7523086c0d42492ceec02e09055b3fc44e3d8a24ec5e2144eb84a3db2a3ad4faee7436d25f04c90c322ffff01e98bfedf3e45e8c4241a442a8f88bc46367ccba8681c9d5c5deace38c2db106849b850ed09f4e84dcd46f53152718f39d59aa92b59d8f5c495520229e2fd7c887987516917b597d05410a9c1bf3196d4754290dc10ef8bf85a177164b68e35e6bd0d2056999a635aa290116d8a527e43be74b1304c677e48381e00637acc18e8b85ab8646407a6dc19e0b6bf6164ba5ebf82750c692a499d2e96bdb87684dbd282e19da62dd78c90b9ce42c5f163031ab29e0741b360caf538141083b5c05df37bef170ce5a2de75e4223048983c2bd052ccdd4c8f9679036768acd31d29fdd605f5b206b76b693d29ae1cfaac06d6dd2f0d44d701eaf172c337c2354e9e6b0360ea6d37467c9994bac92ea98a389edb00331c1580e80e62e7726836a9e1f83551b17f41c557d90317b03c41d8f03c413e9007195d90162208059faba2f7b977285250ed0aa5c27375a19e1da187f418c19a2751a75a7e0604f134247c1c4661aef6794fa2996e4a6fb94d8c53fc82be467462525af326784ef90faa2ce1615de27c7e3f03e4e0557749333ba788bef65272ae887a7e5c6e8846a2b5901128d09432ba2c3caa533e573e4243ec579f46ce4f5ad31e26f317883110651596c62ed61510be3513edba732bed07e868e15c0e67903762c1fb166996fd85c81c0ceca59aa6456e236ed25d497fed121ecb041d19f8d3b4283b4142a14be3435b18884b190cd09828de3eff88a833eca34cc1cf6c09ac1dae1b5a0106c7f48b0659e682678d7ebf55c58971b0b3332401932fe3f2b407ca67b6f574b29f65f6bd1f8ca41e7bc7fc697ee3756784c79d5fca94a095b8b8c5e54b3a3564ec11db58946f47685c70f000b063bd4269db2b1169ca547a3a7d69283fba83c9538172b73212c4cc421ffdfb09026b402ed5145cd0eda4d3085df0901ab67391672fb2da8b48c32a4ea815fd36952c0ebada2fa5ef6e3496f44cf4949f6da162ec22d944f6dc0013aeaaebe4c383b29c7bbbdab5558e69fb57e44f115e1b944fc109bf3813f391dffd02b3f4e5becde14d5406a0dcbab16f90602924161af444ccaccdae966f28b6668a6336ea85f816d1cdab1d0b5503ea8d48e5a62b3d9fe4fdee87bf773f8e52e5b54fe16c14faf0520719c4a963ac198575077ede27068216e67a1ac8051dd105b11f2dd90778f7acd29b2a2835713dbbe560cb41fe1d58f08af4bcca961310510ce5cd4da59bc88c3f857bb2dd1118df44f548b74aa840674b39194637673ffcf695a25ee0c55121e527127fbf9ad7f6e2419045e8fde1c9a1482903ddb1a305d6110073334f1b1a8af7a5dbf7078e84c02091eb2e9d5901c9ce623cc4de9b6b89ad9376bc3e7ac47ba00dbc7221b30c26af594859dfa588461e190f564f798199b460bdcf2cdc4bc18b5a4b3d165dcef88b4962c64a213895c2888c493b1e0115bec5e6ae03c84e4dfc344ecdd73ad7495eb6a2b8cce05145ecb1042e73c10fcb69bfa0a215c87e0a3086de234164f2410452ceae6db4e51c7aa97b65280139bb2e6a87a9d19e9003a49b20374188ef4e512c5b9b5ddc82c15c9949c25a0531a658163bf1abb3b7f402df716cc8e516b9db0513c85d8838f89fdd627850d349831f1a2c52899dc40e4af192ea69a32dcc4604e33864ae8159afc838327c43c5d4e2c1e2c52ebe2d421301756e3403b838c1545a1992a775b7c69741199522e579116f1dec501a9219bbff8b339543e4d0de4cca1ce4c954c821a7a59c3d0bc79f4673850b9629888436b9f9d0501217f0ddbd4ad2a777919e4ccece7bce59f5e29fae61a162b8fd79e609a68f50cdc598a3bd8c3fceecf706ea3f8f5b930d1c11ada999fa0701f98e26f93621c4230d3858b9b640a462858bd06c05e22c5cdcb9f935ae59893abcb8a54f80a022e877d866c5bb39575d67ff5a8592282c530a9258b50f82c16e1b91034038d386cb3f0b0d2bcc8f458d4a236892860f53f16c566da3b936bc2ae3aa7b74066338f8083e34b2842688b7288ec66de90f3003fff081826e5bc2b7853be7efc7a31ce94cdaf94d3c45a40ca88e1a516e4524fef5224052b3226e494c2c31e2999e601fb37f480527628733f52eaef05ea717ce18e988937693c5be5390cf7e0e2263ffe14c28d7dfa5c4df206366a72c8893e615d451a7a9dbb03cca3c1e1d636dbb163d5b12aa0e3a6050a0aa513a59dd753f9a3cd641f50b2c546c5fa2fd3ad7a596cf6e86f20e00678c8ed5e38ed30e370c5a5b3424e6402dbc6bf27ee28ba69a90d101a5a2a83c8e3ffa043bdf6caf5040df82b1c8adcc58b7693e6330e858cfeb67a580825bdd71a39d1fb3f8a48b1a6702b31ca5febae7dd43632394ae00c3735fc6ee4ba161b164ad6126172c46742f9bbb773801e566440af01226a498ad047d85cd07923b0fbf21615f69ce4b4ca1a2300c26e711140097ec1782bf40ce4d5c04743f5f746c01b43d6792dc06200fca5d641a81dfca96f41085f80102b6b5986bfb9b3919171c52b53351601e6429f371be69497fee19df083f4095654d899de0273ccdcb88de1fc63b4b7815c08a552b41219fb5bb2db161348429ffe5cc80b138f6fe46118a7e8a9f978e75d347e4f2717791e4e8836b7bc0e2be1af36f9e398834d0b00fa594be5d5076d568ab04d67224e5ed0fed372d8a6e651ec4250744a39ba7213e5f6153ab7daf6e207bbcb0b0ee199f0f50900a9805022595685642f5ab339998838ac7f81cee51efa74a64485d813221addecd3eba7a3df7846a3c1837748f16109d91715bf45ca38eff5bec26f4f6c5a3d0091257cb85b2e7fe0a19933d6a02b68677782f76063908d803720373b9c61f639a7b36012a8c788b6ed1483b0a0458e0043556eae03aaa6bd2124b8eb0319c26e04d857aab0bb86a20e8703cc44be071eea5c2b77e0a02a2b45843c4a48f34e402846153accb657d56608b723837cdc831fb3b63265b8eabc75d52b1e448679215fbfff7e26e566b410ca25b6a5b15b4f28815d38d72365deeae5a9b0e1d0680e1cc2a32b2b5fcaca0d60310c570b157538c00a54f38718654dd655b52f32afdc6322e644b88720364d4c51447bf63a5653c66027cb6810f9994c14485bdf04ed6918789db8360d2672c28fb01f2d8242cf19aeefeebef191a8bdd091fd984df01604590b98118ef1013518a4e761ae379898ba454fe17267012201feef9e0b0a251207ed7c3f1478a39ac4a0c84a719ef6e275630701458d32de7aa001117bfdcb7bdc14e8248ef7a8a6d933e8d6f5941b0d2e8a14743bf153750097cdf9b90f411e3138c27f15ccf6f83d31a528e838afb256be247b6603463b81007dd85866172e48886dac0e484173021b498073238acb0b542795dc65f74671012bafc01ac26b6d7a3e9a2d8b40f7ec36b3dd78e8d51afa6ba38b405afc4efd6d2c9618bf33d4ddd85b84fe3d7368bdc7dd73853a20b3be01af3f32cef9b804bfd1a4315e4831cb44c39e9d4aff32ce659167bbc2d20630ff2c70d2990508b84911f94c61df69f6ac0c11b5ed02d149c20fe9227a79ade4b44d57199c5c4c5b539dfd7d3518ba5bf4854e55f30b639e1b6a9adc5475984eaf7e7d53e038ec82c689f04aff91085c55938c50c8ba0ad1893df7d07a1a3e7f08d1f214a6d221fd4955d53fb849087373493882536fc3851c14c0e101136d5c8cce421f6e60df6074c7c11074c3913645337f65a1d7d1c917cf815520f0475b23add58dc31186bd5824ea98e5ac81da492a1391b40e4d04f8e03f159c969fd314c5fc29ada2f37281368dc3ddc6f4ffe8dd57c0540c5962e4058a9f0abaacc07e70e9150abff587682d35450c0de4ee590647e849c600164dc3be3a0591a4ead703c431ec1cd9f9e08ea5c60aa9109f6d08288b6376580ee0d83aacdd98b63c7bcfdcf431ef77cec3c96f8461ccc31abb697645cc3ef0fa7d43a464828a2d46cfd251695be17ea2c41ed63f350b446e4aa34fa11efad0e893690919d5d2bca8034aa0d4826e0b5204d4853ca4062af576c386d4d5981557a95dd6516d8ab718bfa9e96415810531dd8c58b03658032848d172712274e25477e2ab31d0f0e5011b26b082e7e94d002c61dddc214a26a89e3a700c8e25b2a04b5d990ca7a0864df46f536a2d9c94b0b62e2af3eebb776147456eb1b5ff0b623bb0c4d120d823a2847e5810a474d43ac9aa4ded13f8e4e40012eb9c0dab2843ab8ab0060bd66f7c2b3d0fbcd18f5f5c6863b5bc923fc1b8c198278d335c395713848efa23af37edcf6e0743cacbd17f95fb1f9b58a4f524392f64d2ca44d6ee9a2e2806ff3d3f8f14933f853c82aeadb3c7aed4fadb5ea7ccc0b44daee0b262c4ad1153495d8e847152f48818e04c73b06d60feb604d7e3f106e313904594714570ccdf0b682a9aa030a5215d70c1a6779e0854aefa6fd6e7e099f42ee2d27ab04fa8af92c9e480c5950a48060decc2a548b66b03fcbdbfe1e389eca34cafc063a7af0f621fee86db2cdbae0c752553fba6fa716b2b737f92a0360308d29f31d26cf78f19963069fd8cd354aca84e0c3b90df89968b0fe475001c211fa194bd52f3ade60a656276fcfafbab910ce5968c951854c78da1549d24ed265d3fb413c46ee397b2bcf345fb192b82d77a1b9fde4513fe6971cc0d926d6e7093eaa03f789dbefafa6fecff746158fa3455beeb033d7cb3cdb394afe7a5a9e97892c3038dc7cd1ee322868e0efa8253c1eb393ec78b2d2fa3ff26501053972aa1867015413a2b8227a16a4890c90cc8d0232dc8f8089b228c8a9210ce52608d6f471e9a8c0cce73219a014e4d85a592e8d2a090beda6bf692733deaa5fa6ff07ad4bd5cf1675388cd4131b2242d9b410db5d1f48dc3572bcb09fa9bff5267fd851128a82bacdeeeeabf398587bf719f1984b46d8c3d499526ce4e2c7bc39ed6736681bd02981c5c1c301c8ccad3f6994925c147850c7a8c8cb3cd42faf32616441af70132f3e563a4d110f6e3b65e6bbdccd18eaed3e722a06a7cabfbe9c82e955d7b7a24f0a49221357df85b910fea2f0a7decfd6666025c0b946bca39afb950a94be5b298e6a3a8f384c641393fd0ea097d441ce48e2c06e9d01b69d6c21eb2febf2da391c097c187f5da19f70fbe89d30788f6458c7c50ff7278b892a88af383eec6d5d153a49b480acbc88040c9888ec9d71a7d523b8f206ba309caef62e6c5e3bc22765c33de380eea6844c8e7dd4b20592c68160bd5c4c32e8bc0c39136624d252b162dcc0c5ac414acfcefdb3f8774d1a224f687a57bf447f441f05244af12178d44fd425a908b76160ff818968e134f68ecccb8704a03aba54d3ff4855ebf0572fc857adbdc6c61be30d56e2540876d6d64400cc7be75190dd2bc4988c2cd36a666a2669c10b46bc4f5af360ab3f41ce42fe146ecc758252729b0c1b1ceb831f69db59eaba8648e2080c5511610542dbbd77994772c92958ad6a5fa800a882d6f20ee949c5825120a72ea4f23761478e797c96538668fa4dce7afd42fc08cb6509364a9e2fe5e4f5713deee5de37aeba9068f2bf09aa12a0c760a401c3f6076c43b3f5ab0b8a3ed0f1d340cd311ea98b88544949097969e170310b3212d69eaf382f56ce9e63b50821acfadcdfc8326bfc0d9b1118a6b7c3381526ec92306075c4bb438d5a61e9914e84816c12548ff65e373d66f5c300f185b9703442847fcf6983e54431c0c765eff5477592e18fbb08824d057167a9b9c23774e6cf6c4957af3e10ee0eb4ceedb54e304f02e9422652b626b7917802fe1f90724777c435b222429b6a87ec37b6d02b031c31702a058b100e8a3c0f2c95c6ea662185d086795e794b860a11f4819e9b30410369263e3d580ac981b6d1fd7f6a4283214020241cef76cd504ba9d05cfd0d4d2a20eada968cf6ca0cb6254dd4666c0fec0300cf0288ad8c9d24a35ba0791957fee94543cc4e410b2f6cb0917f11821e40648c86e5fff76bd07c41d6d5864aa2b0888eb378864c67223c30f7152f39635cf5ea0e564ff94d954c67adf18fe0c4f36fa45c84e61726e59612f6dac8b2b28a74d0b4956d263355f0df8c3b29902bd703dd91060b77510816bd64503577ae2036d5657d9c25a568a5e64aef83bad8200cd426de6e4e9c29252f18b02de8333d1acc522d06b3ae3462afb9163664c8523542f098531ec0d761438c141e00ba5abebcfdbb72175cbb513885099c524469afc67d83a638141d254c997f800f50dac10774ad816a84b53f0dbc8b5480a06b02148f0efc09d43dfb445bef7a3a8de6199609429820be5704896916c78811411d13feb11865b1e31d0437f3ea78b957c4a23e05ed055c532a501bd470d862bf6bd6141a2357405d31a454e16c91471102ded32197297cfc596ae564183d50cc5a2c24f5008ac33cb79909d055287c6c0641fb959d127cc03a6547624cbd9e913faf9b9e377145077014b151d492a3628509285d434c92e9489313264c74822dd25a83ab9a1b26d89641f8abb7def2d3d82c564cae0ed9f6be59cb7916c3ad68b7055f9aa3087c9922b47d9e4f042c31a2af0ae02d80e65fc975637ce44aee2754377364cd4a635ae4582c8521b8cd9c10a15aa029417c601a6c93cbe2eec6e2fd4e25cb6a635aca3bc81b33bd2021130e75e98aa2c67ee2c4d7bac72df93a3081d9384273b4076e18ca79b57ab6b17687d8755090de434e802b70d34d500bece1b3f62bdd9f5949b3d3254393d6aff7e0bbe9591845c84e7992401c8efa4ba0d9678de73f5147ea045824f83a63c042638b3b1110d436ceeee59e27e18118badaeecef96ffeb54deef939436407013861922db8701c1efeba06011a26e4d91df2ea4697b60c356b05d48d6907c2abc2a300cf810a21e3a23ed908c98a27322934826142179411e1d1181f0daa852be0153c5c8d9da7c31adcbe17841c58602278ff04ad44725e2f4969adca9fdb987ead7dcbae7eb88e1674b8fc742a4d480c9ecd321654c493d6d502ea097a831cb1b99599cff572968302363174741d7a4be302664d7232808a32befa828959a620a949a997d89a92a4dc999214c823a24ebb29e31d1a98548a4fc6d97f7b93219dff2e2530db4961da26348165bd69068f1501a6d499755fa09f09ed9b3a2daa585a230aa9b5eb265a65facd0e54866120507189120a9b825614627944e9e4aded1dc52e239706c4d35b0def6e07a5bc65916a3e8357d93eca13b3d74b4086ee2e4c9fe7eb071cee5f102d891521a052e863fdf3edd3f7163fc6a311827e782b0fc74f8b3df6240662d14eed39d75c01e01a3ae2231ad5683888197088a24db85be9bbd2edb758b886503c0a4406bf7d121c0cf463d84683f15b73e42f076de7bc727ddd709a22e81deec5e0df17b0b18c6a8834183eed5f66a21e73ed28c449751da97cee4e3b7508d3d5e7d2a3dc381ed8108021fba1ffcc3f80e846148bad2088fef82b5112eeccd5e25f6e6625024354ae0eed99d0994c6fe2f9c7fc345996ec3b27ec8a02e226a7d9c5067456e191907fa2768a4620071f2e853e0d05741c32e44ef8e62ddcc7b9e0aa0f3da920e28b551d600fccabac681179ef138c57648173bfe4bf897d120f957df91ca8c996be51f3ee3f05fee256168af5784a9b3c5af3b92a398243d5559aeb118a835aa81d8bce8b6a712d6a3e45b0d82ef3ee5ab9c7e7b6190fd9e3081a8254a0f5642cba578fbdc9e4502cd0c4fde74a8836af0dd72e45f920a1b4733ef6d4f6a5d4c265d4f4f2a6c95e29b46a4bd8cb213d23e9f149b248c229a68a8652c7514b9d7e7590ec22d4bcecf0463981b8460f7015fbe21a8adb461dac7c9f24ac163c1a89912436b8f7feac75156b74d8548eba97c07ef5c6bffda59059a29f5ef11569eab05ec7c9f836f0b24250973c936328d5aee0342c2e214f9ef61379ec3bd79c434b8fc58f20596e994a2c261a4f1a35822ea07847fe1f3210cf508b29124319a715b3161821b4b6ecf1f990620ad8f4294ac39de00b6dc75358dc2aed25e700b6d867b13421620f1a84b682e47f1617b3bbd4203047258bfc66c0384fd9027a576beca8b3d1c20e43bcb9ded4f72cfcc1d4f83d14874c092a01b50064804d199a9e6dd6a80b8d8dfea085f2a47c4541a0c60e801dccfa4815876b57da459c29906931f49e506b415f71e9d445ebb4ed902196bd17c37bb39efe60678937c7be7e506805210edeff7bbad3485cc33dc47d987d8754a75455c71d49965eaba9bf6ecd64d802be649953b2c18da6f984a7689c6a64d34443575b06cbd50376eaf5cbe4337ffe000d5468f05a43481f0ef0ee2de08f08e22d0efac5ecdba667f2104173f391bc24d2bf7b180b088502c2976b6be88bdd6641771ab52655563f81f203f893d7e8b96db64f7b55af26716c28f0e71cf0cb8ce6c14cf4c663770bf2c17523d0769ad42844f93afae80c0f82759be337709dbca8eebf1fc7b5f2b142ddd92d51c01f34d4a837ab63b84d23f00a78a26d9f018c4a712ac995d13aae35e559fbfbc70519fcf184f037404a41422866d62b6371956421a8942d6731aebfd85155c9e9726ef9ba508a66c51b3ff4e04b4833200cef0b01a0320b0fa3b806536c447ca3256d7a9e13316590b8e1703f34dd42163205048e45c114714906df18fb41e50d5f8505eeccab1671b37389fc470946729c2ffaf7d3df0d522ad6d848d203efc460560017207afd7c063412b99db0c8411d0664e04f9a8e0009d0f11c75c15d3d1340cca654c37a67e85cf2dcb4c0fad857880a2f95845e4dcb9e07c80970b4ac0b31198ab440cbe434d6def2396f54c8c3bab1409f8b2e8c813d5ace080cbf6f3d8f6dddce7b27b3cb618d12dc0546a610851bbbe54cc8dab9f68c81d451e2d0977f53393f801d34c60c8cc902aee88edd6b6db5782d7f79d0e4a07ed3dafb12f7e6b940247f4c8118e92aa75a5f24db01967816224ef18beaa719df91945b023185f6998f280bee65a249e67e0f3fe0a3705a814f5dcb4d58ec5241bdd4863f94be225c029bc77db28f81117cc800b6dd2e453bb947d4498b99ddae886f3f0551ec1da33daea909f178a88463a98b5c0463fe4a06781832d300a03e7245eeb1ec58a8d559d0d575019397d8e06001c2c809c3f7229bc1cbf090a0cb91209f3ea63b601250b3df6928af8873b9b3634977cc89fdbf3b709b4a3522c4234a900cad40e8b16a5e3f0986453934c3552cf982519ebde911a7347a5c0e0e2febf5d701371b648cb1f050fd76929f9f78cc32115729e17ac490678585b0bf56c2d11594d7e079d24d673a1bd468cccf4566beb002e68765f1866680566479f292ab316f58cda68f46845d76f2f28696c37c43717c6cd72ce4237283d9c3046f1a303b6d3529019cea1539af49dd1b7a66f00619f20766e350acc6cda40890b3c76932df171ec221941823a0325fff950b4639f61baed4d888bcbb7aa1a96d740c260e0f2a12a56d6d40efe78f9d05d30d631594fb4eba439cdaee3edfac8c462f8557ee4fc5583b9831a58237472990ec667d5945f8e8d1292a073d3cbd79f9c5c667717764ca8250a53350214a182402de4ebe849c7efb9093370021b19434d7f48cd7e597c1ce713f3fc2b6fff0bc8fc635dbb2a41826ba83823c61b0f5a8bd1ee2f38b009d09947799ed81ad5bf1bf72863d5e4afbfa05ba6c9fa16676c7669946db4baa581e4ec6ad75e25676561e5d5fa09c943a332bd902815181524eb31afb1fb41c8be2b0bbd83e0db45092d13e757a4f9e9b9ab4e28a9ecae633acbcdc8a0cb54e621b0c859d515e8547dca2643ae52d6c0e52e7d1b50c4a373c65839342eceb475feb485c48a0736af7edcb3a3421f6c3356f0a24eb5ee12272746ced06cc6991c162fbfdbae22c2bbbe953a0628601e213b98752502415c56e4adf4195cf317220e4002e534a96751bf1c11d615654d25ed91731668027ae5ae329b557db508f39ca76adf07216d3e9eae9a840c8a03dbb0ea3bc3526f976fe18618e7e1757da2453d04481a0d74829ae7514782558d481093ece7c28610343ddbf2db6e7c28c6f956084bead09bf1fe808973f212d89135af9b51b85ac2591074d419d59ca0ea6e7b71dd6cbec9f4bf2fb86153f60a21a9ae95b2bac27ed31d99aa7cb35adec7c04452359742882b3d27bfbd7187029dd8e22f87300ec64bac9397966173087df6d5d4e40df25db02a4d18ccb9fc804f126d30922a75cc32584bdc50780fad0467690e650832b41f32f744f97dcf177d20db9cc679d3e4eb995dd276197991e63dc18470da7f0cb5dc792fafd6886c123b2cca887fde0be0363f8bb6380f95d97401ca6780aaa7ed64fddbaf743c1d859a0d8d8ff77cbb3599054b1e03cc36f491ee5b436f3ff2da03b4d8aa752a97a6ab782937e3b8950183b6369d41a16a1fb8ea1c556127cf4586697541913eec6ea171f4d868df039853d2f24de3a12fe916eb4557519f43a2c1d42512125b191914f777ad3b04144fbf37115575b9150a99648cb5fc4a24e158d824b5d834c31609d4d75286621390dce830cdcc52b4449a3bf85ebe3e49674dd8939608b67c048d83961cc0965a09534bfce70bffc1ee61532fa3b4ac66b592d96507ebaea84943c9db7252c1a0268aa90b4149feda79958584f46cef0eefcbb2dece7b43e6a46e3a81e0e1faee055e9a5338e29d52fe07f26b1061d320279ee2dbb4c64b61112b2ea41045a5874070d9e8c84e96a44226a74ced95125ecd52a240bd8fb3769259ef44774d67cb6d3687907760d61116589f2f380fb7bd30c30fd2d04a8a18a3397837d40310b124d65152ff2efd32b8333267c27386ae34e0b25cf3e05a4b191654fab2b6c4c7547b3861345f9705dc193d14d44e4cb0a258506f69d961ba066ba59092c88408dd51513a51a5b7e597f2c5823c54ad329afc12a1913fd4260f4f57ea182988f94485fc5dec8805c1dfe3ad7a2d4f44e08308444a6b274167de0a633846de458ae62b0845acaefbc0ab63b111f77828c929a69750dc373bd38bed10dcbbd2ebe3ec815631a08b7035b9cf9375c9ac01f03be132a981c54d83510a3095ca510fdad44521ac6b5537b32fb0e807701ccf50c23b03c3d2007b9b4f4a8bcb3cc35b53d6f11b6ee990f5565cd447012c2c82adaa2056240ac01f8f7c9740dbbc8aad378efa8791739673ad57fe81018baea36ebdca2b480605ee282a77756e854e2421d2038ee388f670a7e59071bf21682e6280b164ac8a018b8b4f579ca17642bd358ba48945f5c4550b8bc5449781e9c3e3188c36c1b4db92de83af4f609c5cd3da394681018e6094aa8538cf4c5ee09a6c2cd6343dfe45e01c08d188c589abe72044888e7dd8843690e58cfb0370ff1fe3e1ba0a65c442935e7cf107d97ed8ddfba438d3c2e26e7980117d37824961a8220f20d90e3ec3854c497dc7270d0d404d99758ba3443d0dddca5f6089e5bd44d4ef1ea11270f24b2d44f61558915f678bcc18fe17632313926870af867c288dcab29ac9c82a41eec7dff35d105138a332889a2a86e9dcf8cd6dc13b59b3207e9a2db4d53dd91a2f31df2b6ad0002c010b91a1d788fc01b98d164698ef31ade63814747af618a5338b463044407817e67baff326d57500e317366f8407cdd288f91e3630fb4e8909d24068c798efdf73057b8fe6ef4ceb4eaaf2d5b2fb8ec240e4730230624d41041a3a3d23a12d1beb0d2ae67ba430ac496fa19f1bc1bdf5c301f6d61033c5ff65c4ae0b3903c61c2933564bf33decc903388f3ba210a4e9b018ac5b2e14ac9a99a54370c01d7cdab026a99d2691042c4586a5fbb7fd944a408d0acdb49630f02429092ed219dd45eb1fb3602c1a2b42e667eb7d14dbfaf75609553fd38fb321cfe079a6d8a82bcdc9a87dae3e1682f37da6d4328a24a0d18ce7a547687669a6fd25c87f2cb20262bc10448120c65e4b8158616b270e97b40142f7d3ecbd699be4100ec0c2527e7f3b7b41a3a43bacd347159ad1bf2e7db56a332a8f9c11ff5ff3492ca83dc5a3b75ab2db3ce890d2c3a10a90c7604f7b54e120026110b4154bef2a9f27ee76a51c74ffea3afdff6df904e7e620db6a0f1b5ed86f96e2110fed113b3350425224aab16d2ad72d5e2478804c2644daf054a6af17a12d23117d0e7a01694df6ae309d4395f81b4e48a4dd85b7a67e8b2f8ff80555d6d98b046f45794490016d360de811cf0fccd2233f30a15a9632413b6ef80e4486d7fdc0117e25ecca97e770bececfed6f469c62f589f0c5e3da24d2223b4367c6e7c95ac95ed75dcb489a87932c02d9029ec01937b6549c358fcff0ca7547db2e77b04ad746008f33c5641e550cf11556e4b251b037208165bd18961f76dbdb79617931b3e70b3fd7046da3ce3f7b60ada3df53cc9ff649c7c2986c92feb42f608d24aa1b923bf689dd43e677a5e118115a2e48a4945f0f57e9e400601342903e3dfc589b0e507a088e4a0ef708f91f10d57267c575e1482cbce24ed74e7a4a9688024cbd2a2782dabafd81c2b57a533e530b8906eaf4a500294bcbaaacec8339475c7324d45f9a04b6b216d60e6dbb607abf6d02f778e8e97f5df47215383b572ded5d79f1863d4e143e471633cdc74c85bb06e5642b1135ea05aa6820ceca10d9983917871b47eb09420f0d29d42074cf93fcaa3b61e2220fa9cec50f4552852ec4d6a941f84cd221380b8b473e999d907db9752aa791a1f6a3121b5604417e38eec1cf34075e16f5be7c0c0928712954684230fbe444650c1965e95e95eb682f9dda269a9286488f36a86c33c97b98fa114bf8523372f26a192fdfbabda8ed6990ecf9aabeffca48e066ef3e2b5d23da5e28af995fbd98a887783ecaeea0fcd69958a2c9e30f1595e5db683d0af59a64741e429fe7de857faed78930d75223d3d023e4c5bf8c598e28266870f28678cda4924f7f351f95ff0a3628255a26e31f555ce797be484fdf5fc32a086ef18b26e598d7813e2f06abae6eee640abe612f5b678854309a5c8c92ade107af0de9de551d40e47081c9f3664f65b75f975afb97b9f60fa30071d92e1cf3863be4da5ff0474724525c17c44a0e896654d5799656e8c7a713ee405a02c71cd2bbce66920ca4f33d21bdfb43193d3f2e6831040d7c0c5dd43f31dc90cf82d97b404f111725860525a05f8c52682d7ffdff531daa3786994e3597535c605bd1a12c1529f94b74d93f219b07867d2e3af52f87db124acbff4acaefb2a0352088cf40334ec91c3eca4d7d4a95780e3d65d235d7c0fb65a3368e9252268789922c2910ae0d427061c0702148168d308d8717feaed787327478cf912eaec65ee4b4fdd853414ed22d205015c4f184dcd28b8098462e9a95830ac9a19ac717371f3f84a18afa35ee86bf82071796daa23e4c1cd33be57154cc3118ba669457cc5d9852f68349775818b80cfbc134a4281f18d27850ecdd23c4764d6ada2f1ba2d7b9020e1660e094fd64b5a84fd62c0a8516f4192952669bf48d42c3b2a6932cc4fbf1026ada7645c59c82f5c8176712c54cc2103a1f1cb80a53a3004b32fa93a959895258e2f380ef8646790040898b022917b62b752c0582d9069ab36b6540d84ff5e561b3aa7544572e92f0bf0baf07126f2aa86ef65dc7778bf8700bf85b438c40f35973d9770b7ddc3569406cbad258260cf00a8c864705a2422e209bad3110f5a1a81d6b63b1169794f82db04b5f8ab7235b8aeb2e7099384767a84f1454c4a3bfa13f837e359676e1f84ef118fb1d6ae395d0929e58d3dbe18177c4ea8a411510e33e2c9702c9cf6bda67a9dcaabbe34671152ea75bd55d8326aef89ef2babceac802f53d31fcfacb4b0ed96c8bd282aeb4b4a985ab2b103e5684d21f1e432ba144e3a4de7ce3f52bf9b86a85d8af1a3ac8106d8fd0c4426828821b6389bf9a5ed4713fb9192a986ff9e8fd07d7c49996e58d04b1f3b9ad1a9edf905ae584defcd317500fd2a97caeb7514e41ed350d0e2593a607f9cde7bf81eb6b7bef5df71bf04687785f992d47a803ac596269f609c150c976110282a752172bdd480a2540b34eb07284a09a1cd75370f023f3d51d48db58cb341479c72f9d6c5c767e84f46fbad609585abc07a1a35af8da353107f5d3939a5313e8e1ac300513da402f4ea7830d49837282d46064f8c1d3088a164aea38fedada8e2bd4f353fcc2149fa003bf64e9c6b25e249b15f80fc8364ce7f207b038383f23f21d05e7aca06b0bec2f4d7c05a7519366ffde2ff12ee8a9c8fb6140f02d5d50f8e7715e56d173aef6d9552847046aa8be699c0fa66601d7ab80b1e110019f859257834fc925f0a31f504c9e54cd1a4ebe14aaf7279511a3bfa5b2f1fc1fa150203b3652c11062aae2289c961b03cec37b70f9f501f4077929f6dc505ece0a6e4220b79c2e1edb053887a5cf0d624b73d526a79119d6842e606707d193cdf9f1304ae8906e600739e3477df7252641d2e50be0c6c74fc8391fad6234edd6322c594dd0b6dfb2094b756632f8acf469ca80658d1d54057986bc21ec92ae3579481a3fb74af34e4d0214f4b66015c1db8a3e921345f10694b12e619efc937b654dbcdac10fe1300782270a20f2d7761133269daee3c605147d32960d0e3db8d13c2ebc77c976211f7300f7f30ba0699080381ca940814af0859695521cbc3c800f74f90b79113d153a5471e9d0cf0416a1aa18234131834b4c54d1e9b44f3841d5dd2d83bc2d94987aec2e79fe6edfbdea85147066a5c8a4af17a0fc6762d70e94ffc9a3c85c39a26208e056818632a1ef6c5ad97bc3dd0e2d710b01d16db85c0be006cb87c9ff5e65b00d0b5e3d39157c5efa45b5294e6f5c15cb9bedfff54f9be3aab8ac938b72ee7ad96d6f24f3d51d0670bc61ebab47bb2014f281af6478e8da5c4ba37e384540d659d63271b43ba47ea4260d4d3d7c5a821522cad5c9711fbf278e1ce806aa1ed55c0bccc30898446053edc0fe02149a37ca78b8aa1b769d873ba36355c7a507d48ab028fc7538076832e3337bc45bd642e2e061e91f9b394a2a2cee49d266537e40f5291d50dcdb5bafeb29410e329b5a8cee08afe9e8835b0ea5d7770553e83d7b022142d89e3019e30de841bd48e2c41baeab8dbe40081e701be113f668637a2b2c0bc71588deff4107a7e5b4612f395598f8729e9b190118bd729bdcd09d2cb6be7c586f6bcb210a28d7d76dfc08480d2558d5ae2c152b2ceb986b85b9aab745a255e23998cb58ee2b58d4d4f238bffea94fbee47c1828cd76036f0332c1b6fad0c19c63258c9aef3b68a543d8028c8f590dcd96b2e985486bd06b15782280351b2a2f3dcec21d2586709a8a5a0e04add376b20d8ff3885d1e7072c03f4afff00740ad649ed54f6bde2d2d74d4682cbf23a47b10cb79591e0fd9135c91217f598ffdd42930c3b469d8b02d73d3047414abcce78f24568d911e9ac74bd4973d0fdbb33078d417df4d9a0e72d3228b0f7a8708908cc95a7b3a625a7747a994c55855185590c898f05240b82eeeeab19597de710308f9bb9b81b6eea798e002ae5ca5dda80799d2cd8d82ba63689de3f5552f30d147b4986096bf3f3e1c2e5247911bf3e5a49ec9f6b187d0ebbad33922b96e8fd7d8ca43b50a2d42022488b0f325d10c7352d55c1ec9c7624c725419260e996676fc1141fd6c943b4c972e0f824115f70a586c0896b7cb159156430ae7cce505644ceb2dead762d336f891096f5cb3386b3f4574a4c538f1a624153376cbd3532c9d36c191a2320472baa7569f96849bb8b3b507387109b50db8e9d44edc08b5a5e919b1d7153932a165021134e77f8acaba3afaaa07a2ec850a835ae549165949b3e1d3d79e246caa29f0d9b53ae08f29bd95d1eacd12d85a278ab89e67dfb631a7cdd5639ce86b01242f8ae5c9f37b6da6a0daf33c9ef8fb0a29ff7b3cdcc4ef41b9dc4c78392110a716def8edc627ba2052ddff0936afcfe0275de7d3525b7c59fd74775298f1e222d80e1a9faa64d0b6c275e8351fb5783bd618547fd54c9405c1f6c2d7d5b580ad2141c36169575609e6dfa7f57d6e2d78944abae509c8e01a9f6eb7c835809a1c07f1af1f5b2735fc98b6be9cec3d327a272b61c3f1b5d1d747bb7dab2b033d59769cd8e4f5ab8162638968575b42c46670d457791292bb0ea54a7d35eea6fbf56109277a78328494aa05de1fec101e2386b4ab58adf30e8cba3a624232d59807e7699b1305ece87ff69aac58aa35fab11d7ba66a7ed5c1b9b396b30aaa5e055946bb485723199c0edff2050d8c77168cf575812c928e620d759d1c425cc7a507a3a94720da6dff6ac7d370d3b950e37432414e90b819afa85d856f5c567a58a52886808cd618daed7aca103e46d5301249eb2c919870d1a7611b4d9a2a0437f88d1cd9408d09013c52ede1655ccca87cf1887aef90e48e3d161d5a96a63333f48b25506188f53f494d23f9c7766bb5f2dbe271764e5d848dc26001aeece1ee8b4cca7970e28ac27627b3326a0e62a047892b2e46be4919caa4e70a17f1c146a97af754658831504c5fb1146501fa4b800ed72cce3a9d640e024d8ee66a15341f2a7a95676564ce8703a73806680456a0013b56350272a360ca5c78d3c592f7c1d281bb11ef60a11a038b14d149fc5c6859fb5c83be979ba58cda33565d76bb0c5eba1284b163fbe98af84dea55dd664ba0bdb81eba6c9138aa741ddc531b261cdf6a1153d7d923343015b3c246c846a2091a780d662520883075b27c8b6f37e28127065c0eb5249151e33cca7b934588419d7bc2613b5743dc7c94361f449cd79091368e1aa87b3ddd5497022ccb6d8b09492a723d76913b79f617bb4be95268314827d536f0aada8a45e3d0e242c81da715406f4988e543e5dc1dda2d6cd281d4e6cb5071a71c3af6c1368253653c9229b6eb7688c8bfd88155bcec8655f492ead43b3da46aa86740be9661274696d3142d4fdb653783703aeb8eaba95376a0c1db76f8d02d3ebc41493f79944b7624e00e21d54f9d1bada1f05dea5111ee89a5d30f1a38e39c97ee18eeca49fb32bbd800279be0c4089d6bef33ab73e4d21805f17fb90537f404917bb27c6ed93a26781d20571c64c478fb118ae59434988969947c878bfea3320449a0b4549132fc52ecf3650ed99e00194f1617da5db2dbe2b2f9f2f2a8511b7eac225ec1b1dc970d7eb1206d52078e4b6f130aef8f8cbff893ddff8550946d52ff03e8ba05448ae20a39a16974198c841e35311282cf1ce2ac37269223504f352ab048bab46e288603647e4d644c3270e81cdc04525574e24ec8c0e560ce043444bd0f5f0e23285c806b56eb82fa93d5bc3e585ac95831d7c5d7a8b08848005b4d6b7128c81c9476ac0e1927235608f3f71bda54d48229d126f76c4ce33897958957e92af14710b0b3981b619370c1b728d1955adda1301f25ba8a0ba1ce62fa8818feb21cfe3e0499ac95b3e19905f22f8b82eeb6960f17cdb6b6b5ac2b4abbb5166dad6f08b68aac6772be3e72a56fb3cace03aea7a424981620820e6159ac80b17dd51b03ccf702fae715655e301232e21c555352049ed66e5f49c61e4521f92b4a12fe0c6d44af15f716598fd4e6630455baee30860411c4afc313c5ac028601f0aee3705065c100284322d5fb7b596b0dfc79417586aa8e719b0cfef1b3beeda59b8810912bb79452ca22065806210611f87eefffbcb7b29c3f1c719ee4d126fcd088e37df838df587100e58a0e3658f2e456c6fd57ed1414064514063f04472bfb6fc43e5aa42d4bb32b9aadc93879cb7e4b156caa8e3db65a39b329293db65a595d356a5378887acbeb02fa62bfc756b32996b5c17c6a404099629c33c6dcbde1857e5370ab231622053c9431b97c618309a49870eec018d3d24a6cef9cb30eafb3cb5281fecc7eeadfff5420d9c0eb936ae0f9da6e159263e13815a84c28cff22c47a93cac4b08285a405937d9089a93a0a74c836e9f00427032dbd79af3539e7d3768a85dd9bdcd4a781c4fd2db2716f9d19dda7a4399002db0dd28ec0a5525db1567da15ed2cdaa22798cba6b418a1818493798643f5253c79a3dc78f2d6ee0dec5643349548232e0a85e0f7b8e3ed628b90330c502cc26ba73695bfc31cc7bd006fd0c0bb11bb6caa9e280e91443aca866bbdbced64ed4e5e469c165af796816e3c91d6a7126f88aa1155ffe589b470e85591d9ecf66f8c375ef536375ef5f555aa7f19715463c6b931d2ab22e1469e5d2bf4e5fad854226d8d7072f2de663c9cde2e8b6be5d955d94f3d596b243c596d359eac3ea2a9d61befe2ebe3171c07e3ebcb387dfd140e0b635731be6a117eefafdfc3ae505f1f851abbf2bebe8d5dc9f8fa3e286057dfd7ff615733bebe0a406c10bb1ae1eb0bb1abf0eb0fb1ab90c6d7c771fd4b04b3ab3109dfb12b9772f4d5860fa4af008852fafa37eefdd448e628248c64a6ddaf3192b9765f1cc96c338d00105d8434a249a4dd54a324128111567ac9541aab1412c4ca63c3f4247ce93f9358e34b214da9468d2fd51887e44e126dd9b2a5934aa4b1ce44117712c42a73a9f1a5ff48a2f8a490a6248a4f12476f1a9146636d621269af21d69d91f4e28ffe2389a61f85342393e947a631484ce7a4265490743ee2638d9544dc45b1c2def4a3ffb8587a1ed28c4aa5e7a531888e2e2af92c41451771d15875ba49ac3934f8975ef41f17492f0a694424d28b486310981e72c143133cf49028345617ee25f16604d28bfe0b89a30f8534a2d1e843a331088e1ec2b821e8871e86c271884d5dda49629019a11f7df85f48e41f863421e71f72f04d60088e40443f6ceabe0c310529fc0345914864127d6ffafe1b296053b473d10605bee8bfff4031f45f48f38542ff89b89b42a69a50c45d24f61021f4df7f9e18be17d27c61f85e380691d1f79bc2135ca82069d2374500388018de879e08fe06b788bb09d46fd25b8f311fcce9d3e2f7e96f0c62eaf84de1092628e9d141c78f471c2e2948e1fab588bf0b69bec7e310dcbb37852718a0fbae279e6ceafe8b9006ef6d0a0276ae091e9ae0a1e346934d5dda3d3105299cfbfddd73214da77137e5378527d08cf7ade3104b10e91591f04c7eef3a497f6c629e8612b8a1c58ce786a8127b28e1b9fb4ebfdebfbdf7beffc007c30f431f12bd883f1ffd88f4a4d29746b28ea80554d2f49548fe0b047effbea9f43c24de0f459bfa446aef6ff1a6b094aec5a6b0abdfdb1703148b70514f00aaa6db04613b6dea761f2f5878aee5598e7273bbbdc81c9773adb9d6dc7539ef19006c0942ccf0fc5b95fdc78ff1d36668cfc6dfc7f5c04ef67b22e7a30a781e076053f6757767ba206650fe4f279ae52e9318a975e89b7befbd33fb868fba905c64adbd39e7ccef8f39856962139ba2ee722ed35ab9560065397fd0b199038e878bc2cd6600ead4c4409547089faed7aa064e62139bd8c4e60c316c5e15ac8a352d90bd99d8c4189b32cc6081b0e90304c751e02ad8940157c126364d194fad235841ca39d7d16fcad2acfd9544c4877306348412262280a1b59aa208ec0a932db2c05a2fc50d683a6cb104969d96dd92f3840993189c5872a455a3ffe3c01afd34a4a9d9b9e3b88eeb38aee34eb9be967b79b82814829fc7ff3fef3b10f6be1018b6421818f0beeebd722344888b08787e1ddebdefdedaee137ce6144e6a2cd475348c0cbbaa975faef2cba2a12afb4a544140bd23ea7bda816a1052e6955891db0d110bd03b5373d8ed937d6acc472c458bf9c8f95e2e73379643695e16b5d6b4a6796bcc1c7cc81901901a1fb61a51125e6877a1cedbbadb332841c50b5a2dd4da0e0d8956180a85469c0c85acd5428642d60af7d6dd361140067ea23e3e3eba3bd97b77ccae623dcfabb1f1517394e00bf6f2533568b5f0c28ad60e175db50bc64044157ed8540a3487fd09d017fbd507129c7471815901efe761804ea3932e353ae9d29f94f19e8c7992d5eb48036fe4e178e2bad71eee1d8639873b442146078cc591b25173d8f7715903b02ad39412ba48c2de3664ba02ac02e092820f6a05b502e3e2e2d20108822015fc03bdeffb40f0fb3c30fc40f0034216574c338a19441426a8bcc0c78827cba0621c83636c3581095eb9ef3aadbf87e28516ddd217fb30889942abd1308d96b375e1743ae59c636272ce119e7b31f6f1f1f1f1a1621bc94b722cc3a808067ab99565199663226c61b352a7bcac7c242b916526b3bc43940c83d917a6fc66da4c8c8b9e87b2f2694a396fce513a2ce39f89a554a3273d69cbb256daca28fa85c162950728e4e2912b92613a35c735edeb9ee62d080b50cd4ab12abb039d52be38d865f5806598acc70eb5da2b8a7d85465bc24a5928140a8d19965f5927e7c0720e0c0683655886c1601b369281b6b078df05185a2bda56cca766740bfefc122008822008eee49c4d7635c49e3801e8f66ffefe5d4223e9149c9a7b0a85ec38c249fa0344051001f5b10f7d87df91951be830841c4a31c77138608aa022e4d4014130739ced281072595f6bad1dfe4edf90017b731c973bb0810fac609e42cef33c4f2b2a9db2c3932767162562a0427b7e18c2862c3f4e6081658b19e7333eebc1a970ce44ca2735e37cc6675a3869673217288f54cecb4552daacfcc6974db950e4c6ccc5492c9bc930101094959ac92a4dc6aa393d2c0a509a8cd264942693f560a56666a8cd7c98c96c0a7777569b4599cd6480f1609d23bceb7c5cd529735cae35db540915a0f7ce3e80d87239cfe33ccff33ccef33ccfe33c8c3d8c6de7fdbdf75e6fefadb5e7799ea739ad35c7799ee7799ea7b54de92e6fedd9efb3dfe781a11ae8f4a032f5450b02409004bbae0b29eb6f5dd500808492df1afb3eeccfd8ef61c313bc7e9d304dd3344dd334cd144c354dd334cb8fd61709384c0c90abb2fa6561ddb6ddc35c966db560a8f0991c701c9827adeeb788537578a083abdb5fcd7b4fa7d48e3b62bbe3ae2a0fca822105c7367543478298b5be265af67bbc151d5260a2e0e049cd5c7cb029184cf090a660039edf860a78f5a032d4daee64ff8cad2fad39bfe6eb55b94e521bada92fda8a323365fc4d139c3062e7496d0821662d5b8132071b50e17a22058c56b375bf5f02fabdd741715f81aeca72634d7de1e115565f26d08c1872485272305678eda103b8f1049afadae1dfcf115095fd2340af970ed33481a05c7243a82ccbb2c4a1b6e680950715c2b8252664837a484ac3d159f56555f60794479759156655b61b59a02b0fd8207ab341413c66b8e1cdf61f14a84cedf9390a5486f606541e1b8ba53f40781e373507b5dd942538435be54079e0a839ac96e97e5399fc16fc3cae5a1bda9e5a962894654f6ac6e946b7314e9d7bb38389d38fccc570d9ce8604d97befce885f1b7db1a3f1da6c565fdbbd174728f450700e631c5e9b0935fe1d14cafa61a40454e6fb2d9de46ca7233a22cc8e05afcec9ab5bd2d5d0ede72b2a2b2b4179907ba88cf7a7ee053e84ac45ce41962237b10257c5005446f72764f4931d10b409ace6f1a1db262719380c5417d154f02bbdcba25bdb4ee76c41b8656783cebd5edc8b7b715fb65d5695c96c329bcc569e68ba4fa4bdd7d7eb158a44da6baf3299ec41da695070efc96bf3aec53784fff3c4da7f884435514df43d59ad108da456a2e745ff44efd6207097e35ed7c5fd502f0e9407a539429587be81ca743ad4150f75c50d514d2b088de4eef549aeefed79d766335d65adbc658de46c35dfda2e017dd950a8cafe36c2024d846d1f61db3270725a5283e681eea12ffa8aaab25a09aab2bf5f380d410b570e4e5268ba4567ebaa74b69e3b851bef94fd2151a8d6900d69bc5028ae405f364055f5215055f56138d52236d0545cc1f100fa5231976b0e0dda149f7941c8d280d5b36251fbffda8bff48705b9b58957d1e1ff4de54663f95dad7425ffb01b2abfc56386a3f91bec795acd686e0b4d3abba63cda44af8a0498fcdb47121380b4f6aa7b7311c43a368d457456f04b8f1db0cb6a852ff453e5434d62676ac534a2a3f3cf747825f0670fdeebb4f4670347e78d5ba8ab7e78fa935a6c6d4982d92e2e2e2e2e2e232e406048b8b4b29c5e630f5fcfaa77415728c93959f652b8edb19e242e1df7b41b7bb4c6e896ff93330e0fa59f05e3f59651df580eff70794bedc1968118d8979c24998d3e974e272e630c6b8561eb06c65e1ad9353d402ee68671cc781b5e2128b5dff6a59962238a4ccb5b64265d51b3c522d45f85aba84dcc0a0251b781005a090bab526629579339b03cd612b0d268a936e71a02f7f0740c338e41cbe4b8b529d941bd000fdbcd7c91952bbf7416efffe8239ef057038b8464c5f74aa2379b7a1c03479860c09328386dcd83368ef6ded8f6bc8ea04fc24b2b737e278afc77aeadf95ac3e33d3a68a743da2eaef11559f8bde6644d5b186a4471c9cf09fa06af44380b6f4f6fe45048d46a35d22a8ccb5e6cbb4d55a2091f82f3cf6bff79ee44fc00431033356169ed880af9f057a55cf0238d65c95a5fdb8aa518fd7659a5a6331b53c6c8707346471411667ab7f66eb765d2dd3d2b2a8933408086aab2c460c5366ca4c992933cdab92f23a6fa7b5be26299c6b34e28c9e341269911cacc3c07031ee15b2a028f47df51ac1d9f3be1f8928fe25ef4d4fa4f5d54e65465816ea1ecaa8ca7ed87536a32f8d38a51fbd27da90de34e2944ca5d2bb18afcf55e92fbd8b77a14d6f2a69503f7d21e51fadc08124eea1dbfff64864495b6844541a8d46a3a578606052a9ff7a2dcdd22c8d867ec6cef4d83494cdb6d10fc2e0494b3f91d6877f30097260b59616290c9eb46c98001295e92e2bfcf246abd1c2910bc121405b3296f05c7da8271e200b073f1cedf353f5f9039c9c2b3bea24c3094e9e3228a2f27b0ffe77f98b5e02a49f79c2073555b0768a4d8196464d9148441261780ccc0e1d3869633b64a31195517944d588449f47565b4d68ccf1465406df7b9bb093ffddc662b158edaabc7cad58b182d2624ed062f48516b34a98dc6ced5a5aee66f0c06d8fcdd6f21d2dcda66a11bc96265ce1ae9cab13abbd32a93b00118642211aad858f48b62f72402302fcbedb0be706067eff7bf087745d90b6771c52fbe9743add6e683a98f2b229ec02c7114159fab9540ffc86ba85d1e8e5ace5f0a5f9c07bdee97fdef77d387e5feb0b7ddef7a1af2dcfab32e5d5c26941f7a0e58d4ff2090b203bc5236d53b5891e9d785f6faccafea8c38e4dd17acb380c7d287c1cd684be8642f0f3aeb6200e48f8b084909b1f408a8082eb727e2247d1ed5b22a88c7e3d5e8c6df5b73c7db16f8970d169ddd97b2f0e311c53968019c19273adb5de7b71c0e880c940bbba2d5a737e3afda7381d8c3198635918765596d3e965929306b17d578e6b6f7d21605ba2e70f3e17af0ff7e13ffa50e849a111378239d76551ad393f9d38d74d71ffedd7a32bc74565be0f6503865ef4e1f5b92af3fa742211351aaf684475cf47ec7a8535a86ebce7886536bbea1efbf8c87c643e32198de78d64f579e970d2be04606bb7a206f35791f650a42d1c8a2bd41e8264907c7a970baeed72a173699073712eedf22c89c7058e2fa59752cb55ba22b947e5a7fd769c8b2432d460090ca27072040dea81a9431357a880320317534ca1821aca2a5e2f093001a5c707052410820c623e557770e91987a2b5e601cbcb0275b984d7bdafad65a9655466072a3392b5cb4a9377ef80fc5df75937d97b0c69b6ab575197366582c9b576755297a1027ed3ca1f8f26904393fb74b5bf90e6ea31bf0829d4806b57494306e4efeeecb260002161a264072c35e8d09a4152831468d9810c451869d9d7a596ddb2db5297bad4a52e4b5dea92bb8027d503cfffd9540f1c77bf4eea3fb82f70525b6b73f7f56a7db5ae1507cc2924ffc0ee88e1de3b737b9841015f20f8ca5cb7b50dedbdb7ebea08e88bb54185e3ff7918ea08a80f7ae564bafac2c005bc91a44cf4fa5b7b3f281cc07ea7f6bf0f6922d1df7baf3853e3647d711eb316e310fcbc21f4e506e7f59a49b1025e9fcb39e79cef49890fc63c9f8ebe576b8f49595e4e8bd0b182b26a28eb2fff4116cd047f82d625bc3ecdbe8e114e4b1dbd75f9ded87fa0f15e84f79929b8fd0f5f90d6187476d509fdffd7d86c361b70db49cd71e17df10043f0cbaa53aaf4749cb6810f1142565327e90982b4918bd76e690fc89956d2587067638561021d28a86df7eb07df3e4d478fe8dd77fb41516bdb3bd1f62a663d7617db54cd6205c5fb9d684306e8118f582471c7cfddbf23a6a97aef4da3d1be1aa3cacdb7f2e034877d91e8c919bddefb044f0962d083560b0590d293a415128d38d58617024f7805bff2c827e01c009ee338eefea5e787c5799ee7799e27c8e9539ffa46653e2de7798aed7288c5b5984de92cfa2c398ddfb2d7fadc8842d5ee75a9cfeddaaff356775c57653bf116746230891e2c4954f9f901eab1d995edf9c9494080b674b6d994cd557a8ae064eec1e0c541dd7e8cd36750107dd1678dd3a73ef5a94fcc71fa1491e854fa7eb966a06ffad4e7778a5ec815a6a38a30ac5a6a144662311c3dc496600097d16bff4414df7b3dcfdb58c73cc13c9da98293d4348366b6e0b77619986abaf2be3e48596027e3e607100ffcb0b7691061fba5a1909b1f40bc5db3bd5abd7a6b2dc5bc5d7d50e00708840590c9d3655d81a0711ca7f53d754c56afd7347dea0c8afb649dfd787587b27e8c600f007ccb02c73abbaa028075acaf24e04eed9d46a256b3cecc997e0981d1a07b0999016661f5a5ff1f630ca38337512eb902b831317092faf8a03e5664c91ccdaf2431980f2cc62626a68ac501a3c3c7870744ad5587579a339d82e7ff2938d849136652eaf0d67a7f0a5ea94c4807ddb1a96e84d39e263bb228668f535e2d5a046daa26e0074e525b8dab004feaa84b9d4aa5521dc7711c9771780276b95cde3d8203565b105bc28a133e626a623e8e4a07ae62c0497a765d7777b092001cf80a4e3490d3ccad22a9839c7ace2228529b4fcc88ea3e4ca1baef6dc01f719e74a3cdf7e188f338e0cc153550b76cd9a2a55ffd1fad750ddc0c00e9414ebdc654f08675dcf1c3cb300157d3ccb16885d993cb34d44960313531954929e4668f30c7713a6acab22cad600605c60b17a6126904e3850bd3ac34238df22ccf4a6337229148255289549a552a4369558a5d71efb53e8f7976c759068aa299d01794e869073f27a93c68a83cb8cfe15c76a5c5aebabf4110faad666d79269685645ae6c94491a8419b9ad16ab32837dc036591466fbc85ea6d14fad1984f2093e51cf24e9e85c6bc13b3fa8b6d1a6a8e9ca4e618fd8ce5723817d672a32ff80734070e4214278ea95836c3b359d96427731c379b896c09047b6ffb27fbd4bebe5bff8cc51ec6dedeb56e4d61b455d9e7110427e91519a032aca77105a541afa071c5bd7746d7918610bcce70308030d0080f901e3f947012731b564b3ddd77c354a0847f5c059cc43fdd7e8fcbb2add2d7278e6895c052ed365ac0c90dbb36854f20bb3a4016bcf6ae9e243efbade35c577f2456d387af7a7810ec834dd9c7518270701615b4c088560b37b6a545ed0efc26c480931b5669dc9bd0c3f7bde97b6f5b24bf262787f439f46de0c0c94a2b899576376cc376cc1cc9bd5356957d72d36ade48725bf7e9dca8c76e2453b8860838994fd2487ad3e8e2496f03e34d0fe34d6f63c3b88d1d0e8e6f72617a1bd29bbebe69c47952471c176f7a1c119ef4445a2f4414ffd31369954414ff174fa4f5dd1b0c8cfad24740868c2fc97816623cea298da7a51fe12330e3698c2cb8f8193fc2c8c2131b173fe35910e14b4f5ba2ff5c881bb6635b561269b990817afb34ac1b06e363844233be14ea9a1cd4cb781144da2afd0c11623c8cc72ff1de44da2aa1c42a38f85f4d8e0b31756dc8788c87f1dc166bce38fabbd1d3b012e9551c62fb68bc486a8efdd3f77322f9a3ef9fb99e8877401cb3298b7a40e95fbc4de95fc418ff8e362ffe34e2c018e9cf5c914862583e45f2fbe9b2abceae82f22d6be972ecead5e97423fed11968ef4d2b6b1fa12a259bc39dfc2b837d2477fb0859591b4955ed1b6cc8a23b010cec369a70547e4afba12fa34e6e98152f14cb836e2f1637ecbab77bbb3f601996e118e021f00a72b63ac809d7377d2ec1ef93faecf2b937ee76d76d9865bd34d9b32d259f7b8acdbcb261342b21e8e4966d9e1d65d3babd9d39c8aef013e7bdf762d9eb7327d9308d009bdab05d5ed68da02118810324335481a1657fcb2e0b034e64b1528513570f575af6376cc760bce52fea483e498bca8231eed825e5339f2fbe042ec60d338d1b56da30d2a69d5b08b55c39a12b0ecb6a0e2174dbc55d03dd32d0d4360155d90dab39641b0724b24dcb41f996cf0dcbe7799e17cb5c9dd6ba66c3360c0c11e1b684277870e8074ed2db4d8ed5b149720c95d12fa0d2777c60c18da7d3e986562487ed240e1c95477d1182a081921ab44072c4882c7e3061a80205490411d482c18414576640c2081a946871c0d6c38bc90c4200d3a2653b4502fcc00ffc7a8ea082529082940b69c013ea96ee51c1759b98a8b4ad3805b96433220000000413150000180c0a0583a150402c1e936bf3dc0114800d627c42785e3c1649635194c33808a218838c330600000030861042604335015dc03c5f4f5c68d33a9f7a6b9bd3f0841cf22d846256b5a5fd6d4a7a1e8ef6ba8d8136c86566341f72dc36f0dfc7eef7dbdf75f290cd07970b8cef4f96957c457de74102b2b066625e8617825b85a9c6b04f343bf7c05af2a38704227ead8175cb909085ad089694205f059dcb9adb7add8b5cdaf3762e0d3e90846c60637cefa6a55ae8aeb1239ad0f6235f053d868203c9959084503c6f106b4e898a3533d3aa72541cf3d096969d8e66c4d37530617d0480dd1c94cf128ca30eccb9be637ae04cbbe893438e74e294ff3a2cf3b93396e1231ccbc2838a719479537a5d874f84290cd8388e57249d699c30769078b8755ab974862faa1c19d2f0b531cade60145242597839889c633a1a3fbb1a94ff0658ff87a00d18958181113d5934d29fd05bc7845e4d506d5aa830d5bc80110a87574d2cadf082b31bdf80968c61f109553c2ab168fc8d3d8f463c1b45d49d6c08b9b8b7326adca0b0c0317183f7006f2868b48e5f87f56bbabd5922e1306c315652e4089b932ed28dc4bb31343f872f1dc0c1279a7fab033e77fa957c14f7507abefaf3b527d4dff67c7aadac76bf20c77fed58eae7a29a6ed44d229efbab4e52ce9bc9d03851d3ff4d2bb870aaaaa910d8dc5373ca6686745d8a9b84b5350a4baaa77e5fde3a9be1e884522233128e87607bf3f9433b61a2db66806a161aba4b84d91e1aee5f9915dc05ff2ca7b51e27aee8cb2787a3d3f61950a1dfb4c41e486d5b043608a39e432f0bd8334f633e6660f7f0ea6431689d08864db4cd235fa8e126bc5dc9a766464b514862f02d5509f81b14fb28344fd48b22fb7e7d9a062ddd718aab14c2f5d2b27ad3b8e833df5ddb0348ba7ea471df4f15cd067d09f58f39ff418f9210b76adfd48f588e99141b6c1e968351fa1c08b60ce634e9a3921124a8dfa6993620f2ecf2684a2fca8b96ab0015e461b1a017d20018e086422f641134bf3ad45de71b0438d77d04a662cd85442c61bc769ecfed565d8380cb3802aa7c800b5d3339de5865b6c76f97df9152a87a43422eecfaf28597e3fdc2d0388e616878bf989041cc94522c9f3492b2d5103ce5d8a1c8e70a6cf14c2b1ca2f0969b74754c3e581cdeff55b69be54d8d63c11f4fd1f0052a1ad7b00958b43b249a534bd9ff3b174431186ff779c239792456d3b4f601bcedf770f0fd7d68477c47890aa7bcbf8637f38c08acaf6d56c793a9129f37f86972e93938a4f40f697c49455b863c9fdfd54f6e400d9e6846277e0910148e44483babe34f51b1ff17426bc5054d1d8d54f9cdd0d91ca825f457289ccff1a673bcc18bff7521f8cc7c9b3360cff3afe13bdb3174e61050b4284710cb81b8ca4f4260c16618a50e2232fe04ae9072a62d2fa3a36c23473bc530ac78a11081013d90e4e5cbd4daac7f51510d334809fec6b370e2f22767d4bb13bba0c219bc84cbbb643bf4b0cb94669128f3cc926aea253dadb00318627092b57db30738a817fd4e7443eb868844927ba726361f1f8f4499a4e93bd4a185239325f9c4431e7ddbe2187eb520b694feae3b732138755a102b09d81532c2b23535a375b4896f748463545674e0744234626c69b1a171f4dc1689d677edbf3ffaf755b654bb86e3743e18835d223a3e94640f3b61403a12e2e14b27585b54d0c1c39329434e2c93d7e34015527b28a716154013f797658802d088ce41aa720a542ef5ed766b0bf94c564d1b887791c22454fb2c3b82f23be7cc6743eb0097804115ba6d206d805f9e1ad0bb6949b792e68aada9c8b52409912b8947e6857c43eacd08653bf1b747a0712cd16115ac047b10267f38242de0d0f25c2cee525145d874a04501a4ab400d0c254d572853f90c4ceddf135c915fe83eeb9fb5a28f4bdaef0816e69dd52f1294124a9c45f0cc6dee69724f3e841954de4f65031a8cd31ab0888f94bb40cb0d07fc2e496e11d9983184f383a2ae6b25de9ee1b6379b907be42038417bc23b9bfd89960b1362364d03dcf8c5d9cce33ed142c17ff9d68a78314474be4e83b60df0e80c348c850f247bd8c629a9179ac6913b7b28bb1f622693742fd684633204bb90021edbe53aabd54d7fc22824381265bc84911ca2873c317cb320c8b8c4fc57f8767588a17454a0d8e7522916b9fc97e7c008f6d83963f77254fc1d48379b16fa0839cf9a1a006df7002853d360d13697b6d80ca2b4fbd8a99a70af416fd808678af0d26a91e286f696aa54830e8cadf051305b367c882c12f2aee76884823ced0a544815968a6e52ff30bd67d40b316a092ae4bbbdaaee328a75d6419e1955e1c2b74c5db02a77de0bd44c43119076699973ba9f85990070c028f1aadc198095d8fd4c98b9e9e480556af30d8ad58bddd08f3f2ee540195a87a8beffd8d2fd273216b29ca54ef6d21b1f5acf1ab358f22aa6ebb55e93db64deec757c5097191e84d35a51bbf32c0a802fd117fa064bad60940a05ecae4661778aed42306b51b0dc4b584323602903c45fcb09c557619f52ddcc6cc08acdfa583b9c6a3aa6ebdda88eec8939fafb0b63682314b494e05e5880e5aec5a2c0840115d58b0a7e66d6a2a8ec568ea563af88e563c074e000d2fb600a6c20b14cc2d49158723716f9c6e548bd1438d21480a2276d62e5682a4e2ce4754c10fc7a259dab01c910f693a3ba3ec7a767b8b9f52089dc9d1c6da8cba280cd0fd45c1c0c13ec00e58c69face579a9d9d25611ced17d1b0912b22b109fea6eb8256fcd6e326539553aa37b66046658cf7cdf499533d2381091bdeb7b8b936acb9e2ac17f144f282f2cbed11842b741ec978b4a076c10f50974467f59a27903181ba0a7e5b57cf5bcf933f035008d05c12f374e12acbd7169f1aae4a30fb883f4691687bd22daeda26e38c60abc5b86e2d6fb6785d6c509fc11663132617e34d5b2c0d4e6d297276fd74baea37f0221b9447f6c9188b60a1b8623f88c4907229b5d19b0995f8fca2605a2078832bae72f085b98d4e6e5bdcb3f4c0fa211b97e0190a00e76780f34aa4a002eae50fb8266460e29fe05db5a93719bc8ccfe4182dae98b9316852cc5129438bcac482a3e247196f5417435d7de591a37f0f410384f3f3bb8ef37861f888e08b3d8a372eb1858967f608b9237a9372b9c53a379f414fac5174cb12e802b630d6d5f5a1725be52608de0cffc939616a706360fe3413384c41fe15d6f8cdee550bf68caff813a87253948888b98bf3198605e840615d75a4a2bf2ffd2322271735d9096c16366e9afb3f192fdea76e00908d8cf5d5e8fb575f6a9d8276dfa8cdf83f1be8abd0032287701f37352cc6ebb66f67cbc1f9b6f185fb410e2aa57850beee4e0d33c212fa8ebd07e882777e45f907d2094649393df934c967f82bc50b33b48636f67408ee0cc820aec257866ad3e5b3daccd430671afbf72432814b02193335b69c38699ed32753c360cbeaea3099323d980301be71c87c30067c6fd203afa4d022f91c4f6915f4a3f0bfdbd5e44754734bc374487e8e883dc6e8819bf2f311d24d64b97cfad14d8a2b0b1bdb7dcbc9dee78712213bbef4a5cc8ebc4b408398568b0a4555f2c38cbc1c546dde6ed7ce7c5ccbd186913ff0bf2f14cb187b828813fa7296d91b17fe430ba09e1e60baf01fba34612d73eab422a92dea362bc5abb86ef553a22069fd89d7fc3e4a58b10a9052d7180716c0701661028cfcec61fa39c4a9279de3ee8ad2394ee63d6bc06e55566a98c248abc9c7c5463f875edaa122deaf551bf1e5ff1523d97f17bc25e8e7ccb4948eed7d9a1d4ad2fb326640453cdf7ed38a886e61cc0e30b0a390d946acc3447bf2686cf1a3b13398da5da4107af11f4168106cdcbc3cbc2a8a0d0a70e9c562010d227745474947858dbc5901e36b964528947527153c8683556f8575957910dc519e89a81bb86500e48246c04c45b1eccb050899020b6a509ec34c8a9ba68ac48e24e682864180b24201642ce84ad478183b1cf8030434cc80830f72f9e25882497157239723199843ba62804a3bd9b088a6457db6d8e358e305c2880991dc18f7153e5b2c0969a3e7465183cd8e3430312d0e6ceaa159f19261bc54e0c09920fe52c3986661826706a96b2bb41118a1a5db009b1c4e0a781b364e5e645a62ce47537bb337886116172625844ec2e7bc40c7a12bf6fd67d97cb48a08e20745821952edd618badc3013d0f483c126cea739e5625b630d73c0883013dd57348e9d3483372ce3cb9d8d4d5ed5b9520fe041792865849fa8a91c9f6eca62d327a213a7990f6ff2e909400b6fd55fcd70d768faef6b40de1a7342b6ada313a7d6eff9c1cea0e5bf98325e2d1c647f04e12ed2c83fd17afad18f1082b60f08a3727d79da737f6fb45403f0ddab02b438b9f57ead5003eb2247fec4bfb30a042c3b531da7c4d10afb73c43a84a97a09346d4787e39b448eb33c9f5c040128206a1b222229f574d6962eece9c6046c0003f041937cad71750377a1c5f0cdfe557b36c66b4464a6eaf3fc5561a626b40f5435738fe88285a1757073e4947cb01b541c39bbabd3ff46d37481da856a6fe3feab50aa59386f453c181c142b1bd205866e6c25d4060c843dc037bdf01f003a2d4b4183c37319f92dfeda1b7ce27353c90ebbd3fa234cd782a0d5b71f1b88065d877c1a1e210b2779aefd195c0fc35ee8bfcc0bc3af272a2cc5bbb9a4f2db50ee33a2a28850f85d0def8b8904f2c49b0aa3f6d8a093f54b34f08c7331323a5ec87fd3240e36b1b26166412bc13e7c26c8d9114785f9b4b2ecbcabef59375fbfe0eb6b1fb4d5f7cde9058877d0f4043298df08d9d1f796fdfe55a5441c02e9d8de1c460d2081bc6ece852a50f3f749e53a5174ee0bed1d15624114a368234c25a57aef19c2cd53cfa882318a633bf188ce1cd5120fe5ab07afdd2973f20c0d02383c924ebd84f03f9bbab5cca98a1587b81a9159fa062691af055de4e73e9bed21188431678203c4b2e597c4808e2273367338b98e9199a8f78800df24f79d6663919c49f073800e0e54c88f053cc8047de2800136a33978d8f51728cf497a60f6d6058d33a3df448e58faff6688f8420967df0086351503be0481108550840e1a44e36f723354687576a1a57168f824c6b9df7ba09b3c54ff32d8d1b7b11b548b8f2ca9fd8006430f3822a0979829806b69019b3cb11e4fd4328a9ddb09a403f5b20ccd9bea383a4ec07c0c220aee52f87f56cc85ea4bfe672e6ad77b1955b4548727700e40ea75144040dd07c6c72842114f6846b000d61102627fe6a372a646326d0e18800d33c485e9b8281b2eed53017fe2fbffb31aa289e50928f354341024062e75c4e045e20c71f94612defc422f2059f294cedf446fbe29b9748bcb928a3ac4374f993d631fd8641ff49b9a8e5fd197114e5f0fa982e0e9941db26d6bfc788e05bf02a579c39a918fa28d329135173f5a3e28def58d9c87edb25729372b1d6fe3f73d93b2bc3be68e33ad971f164d188edcf94bcc9e130404e0a9cef436935841b96bb8c4847d682b9a34fdff03faf1389ceef278947951c2f6ac30655cea7481783f5b44ca0a8e4978401722ff5da315ae38b89382b3b5d0a0e186620f07bc8aec5fdcc9c713ca906f5cc0b6c41cba450044aa3c508b17aee2a3c3cd675ee1cc75cf772b16e3e020abf06ad4455c345157671d382447b450e3020702566328ce624820c5e3961a6a61d5a787858df12ad8221eb4d89a99ee7ab5955d73973756edea13fd535c63803a4b6f5e27704656c9f2e0727f1a0e8c19aa16524fe056b8874f343d6e409ffb34c34421bdf3ce00d1a148426bb294b8626fb12294d6de8a72acbbf7a82387103b9fc4c7e570733c7c66ef2e822510517fe951ff81aa7c95a17e9337f1ab71166592958925f3688a68751849e8c643dcbf24dbdb804f2f9e9d10d0923b6bffd9169cd674f38347c0ee5d4b5733d9a64d3375f5359478dd7be1c80b232ed5a0ed507d8914a9b7e98d6359de34631abbfd2fa5144c3d256bd3ecf3b211cd96342e0698ea0869a2312d7ffafd329f419ede21af818ba36426bcb67c40d1e5198d31e52f63a827f9bfe685312c00f4aebc0035c062a41eb02cbf096807a0358a1635a5fe780131252fee382df190e42593607d8ff6c4ff6cf50c214a1fccdd048436a6bd4c49212455d2c517b3f77b9bd6c42da2379b63b917e472f412aca957e5a268361b382caf985e7189af2ba554143e1bebd04b8df122dc29bac0f49b56990ee07e28c28dd3a09d378e0f5e3f2b0acb064fa5a1bdbf99a258eb7c256cf594ea8d36e80e1545048dcc5a44e2c05e4521092f06d67cdb202a9a2bef6c25bd912ea1dfe65c43288af2f3ae7442d867a6a6a200c1f366607a8a62babc486723bf07074a3c702998b36107ee1cf7374c7f21350838f90ecf2b04c6d37a5d21243123396281b073a2fb646cd8fe597a749a52cab82e8e6adc90691cf1a8bd96ef5562ca4e74b5208f39b45691df827866f431f9654e29af312e69184f2d0d65f0efa115c92beadded8baaa2afea935df8e826e97da7db274f66685cd3044e27220e3e1b5b006a164fa6a7031d9a0a605eb866e8ccb146d0ce3aba8411aabed243692150254f8aca84932b389d11b53c28f315e07dc7e837a9596063689df7cb65a8680f9bab2781a0374886c1b902a4b44b44ad9d6e6d4fed151ee6d10c5101cf07dc69fdb3b307ae144aeefe0819621cd55a4ea96c546f45cf6c47f66d5902a350b14c2cf14448db6ae54108682562cb9522b668d683c35bbb889768a63857320c5cba14680f7547eb61f6c522a8014ebc6cfa89c8cd1d277bde852c98c2f6cdcd5ffb578638c764b76db5ad5e93a19b0c2c0283d6c5a0e72e60710f94ff30f3467bfbd028fcb35717e2162c5dd3836ab28828d5d23abfc506313888db8d0273129826fff415016e218e6d6002a9a14480de21b61904a9d863dc7563d9c2a2aee3d62cc53b3b1d7a5e7f0d8fb6241ff98954c0ee3d00363b101a738b35028b955cb9fcb84ad5341cac78f9c32c93a9415b46f5b7ac782e7fd38c0c38de15039fe20d2f6433570d503d1004ba656290033b41aed261582e68d03a278d2bb9e0331d26bf8fb3844ba756c749de3c6b1d0cefeb1cfd096cb7fd14778dce317c4044ea3454a1011bbf306d9bb03028ff9b9c621e984eb22e8c045499da93861156ecbdcc17e932322770ca2a44ea658e0d73824132481e083d6294bba241ee31ffad8b8a92460fa9395b41b81aaf6e1b46f01e6e2e666395d0d9f6403d484f4f767e01606d4fa571202bed76c1724816dd42e202dccc60d95841c97ef88b3f82e02f2c9270b454d6eef5361d2dfadaab04692c6d0e417848f3bbbf381a90908ecf4db9728dab6109006777c8eb972eb3c5c4f688722d2a3fa92e5f0dd5a8ef15db3a2dc955ed22074c48b3632089d7acf0d33b41945a2e0ce0f8c7a9951c73a0f550d317906ef0c6670c4bcd6e323ac439ccf7aa556120c3fd183641febb3c6df033ff5e87d387d316778a10efc44910e4c5aebbfd256c1094f3a6676ec4c023b8a6c68817227ecf88cc39c258b907b7ed5cec8864af9a7ed771921975fab558462e42bd86c9226ca9be13a3eeab6bed602ba053da02b92ac102848967b084feb3bcb63b2ea02840dfb70b2ce139e002a6b68f8229f9c4e59ffe931f22d0fb2549004c0142e1a05da141af6f3dacaadfcb232e8ace969315060bc0f5694033755518d9b3e268f303550a44f07f70857372d2eadcd13a6521872d0b2fe97482c609e613d53317d7249bab0462abda4cc9d59e01e3bb4a2e797ce4e37e377f515412f5b0452fff2b932e2ec8f821207aebe910674601d036ae1ac674247886fb43408024c1215062309b3eb1a2097ba77519c234c35968a58ff4c03dcb3bcd20c0228235da336fd7f1eb42016a053718b06f6b0c006dff4d28104044ae4c064a15f2450b3eed3a86b1f4f2b0c1ac9c20565811dadfc43e2b24485905331a30ac934e73940584624451dfb202b7924821e05516c222537bb81ec7f3b2910cfa0f6f47c6b9ecdf8db45e442a5821235089559faac43ef3bc9c4ca42eed4007c0256e0db6dba39dd3fe4ed800fe83198043bebf3702f05a39b8adb16420a522a6131fb8406621f77fab86a4f863bbfa8287450d56dc080d501837d2b4314619c6e8ca0587ed8a39f83e6cf63bcec007e6b310d84740226b0d8fb706ff2603f92f77a3b77d58214bc79b05dabc497aaf4272967c194a36321d6309e15681b4af20e4a310f23905bf6e17292e50e895552c16e3a68f64f6117efd755e0854709730048b3bd495f33248292a00cca6db74bd3fb09c10d4ec3ec170838d68f427d027202c9e30c13e90274ce04c03054b4a9e2d1f0bbf42b9da8b1d2e57604f4bd0c5dba44cdd5c38f0fad8a9b35060a04cfce2b003c652bd4a72f4106056709cdade018518f6867452a36a921a80cf117d26a1a9135c687ae9fde6a18f9c8dee08314c735f1b7ab13044d12047ddbe41e965488363dffd50c88f1f0e2328631c6943ffdab85244b2025910979c9f493dca5607c98bd9dd489055b1bcb59f513bc9e3abd0e37fad8c0ea3dcf16671305ae4c686a6dc6d765194ad4665aff906097c41b6bd6841551344e2e1af4e7496d779363a16faf860859bc52d96e73482a26c858002720497d28559c0f2ebd721ad6b0faa76343cf8f61aa072d8d769c3254018fa291195b7a23ec19a0bd4252da26822a853b3df52cc6514f2062b1839c2ec022c512c97a02a38b186236e4298742dfe13c652382d02d48404cf27845661c004968b0ecf2bd56498e8c235374df3476128421d64c85a4c8e80c25bc55a90345518802130c1e8523fb3ce93ed7a03d327943098fcc67e06b5cb933dcf5d234d0b3fbcebcf40ef5bf093f39f0861280cc40bfad88091bc4c57e7ead083a58f6e41fd70b7e6f1e7187d013a5dd874ee0c2d0c88057b59ba0829c634fe2b587296785382c468f0dd0377907e3e7099d47ed86bfee8b673183aae52684e6404dfb45697b6114c9d3d506bb63752672b9204a2ba94954e75335f5cbed7e19e5d73174435d7a58eaf5da41126eab1d76674cfbd757f1ca9148e86d371f210af3430fa61d5fbcd035102eaefef69938d14a2ce591e9f4b81bc451f0a78dce72298ae386a44e3b7d60235bba3202d78c7430755fa5fcc6770eacbe3543c0145a918bb896550c9b5789e27260f5b7cf3adab5fa0379d16a93f824c1ae09deb7ceb13db333fcb8dbfc6fac0055fc320962106a96121c7f9dfc2505cf17f188c13b7f4f730e0d233d5ae9218a0850c1451b460194a8b0f81d7216e2ab5d9a19f007d7b34b01f252ca3ec2b968c261c2a65c69a275ca672eca32c163f7bf6b138fe1f4e082d71a1219c086fc9be1089987c71c9b43a54e160a3d21785195d4714663d5fe45c4012cb98fd98f1643d7111a439c44316da13efd9399eedc4b2093acbc5b99920e4a0f74edc34530a5937b0f52ed1836d1b736af3d2fe4834cb7eb5b84217c4a697da92caefe0ba53c54dc7d4ee2092d98bb2f968648f850664f6ecf8dfee27b56135ee42d9bd711e2daac876605d714d2c19478bccf61ec0c3571df7c9cbb69b7f711113956148913279889b2d69f62e20077ec27067b79a2d814973cfb8bf73e339a9dab56401d426b7f06b564f16ed7b398cdccdbee650ca85e2c87656bdee21b44c9fd2c104d4b272d864d6dbd8f7adb58cbbb759f955ba44504a85cfbba7d8f0f3272bc85031f46b1d38eb2d6126c1986f26396996e2141b3f3c9366dc9ece4dd555fa06cf2446cdcafeab1123bd64641ae94c0a12bc890c904914d9d2f42416b3c6f5beb3b45d2f69a2d1bea4bcd95e126eec544267f503dd40e1c4b94b15f7229669b67a3509e95d794f6678787540534e208aa4fa33eab85e9471412821a1b94b8dbaa1c4e2641a0775c7b402ff8f604f857a2906b43c5e0f036f2255a0ac704555f4d0d10f4d72811fc03ee9bea447589816b9a7bef45c707ff26822c648af49166114144dc262a9cabd89af914d5a565d3019cf2649fe9f4e44beda31fb7df871ac9b4de237d9f726d165723bff96218a3e6d7719c7096e0501bd7e0dd19b54bda7722becb668f5456cdf12304a1d97a53dfb2fa69e1b6310f0f4c5be9ee5680297f878aa7cc3ba59b1629d56710e4799bd7d6a234b51039e4edfda343c95ca8bf1bfae5c4d061cc96d1933da4c35b83a8db30fc80021e24aa0842959c17e4f852f1bc872c0a72caadc6dcd9c2eb583f7fa7dc9fa2c7c004d4da0f58aa3086113d81c981979b8df1fc1c0dd091460ca562ee0859a324b2ae4a6af6a6531ce1f2fc0505ac1b99d467530ccb65543d2984822b1dfad0446e562d21f6259c010919f8e1d5a4843608a332a6e62c8141ec5c56e691268179e3b02f1d13a20f307d66cff09ff141f734bdf958468a9785a49852d5037478e08669831018b62263b1b4db69d11e092f9f7feaf79f95ca635e4fc7a950056d597cc5e153d3d236851fea71200a44c4697bdb4ea0c7a33104eecf392fb29a701e8f21460ce579b722413513450f68c6dffd29e77d9608915ad3d59a4c06ecf120d274b80d58e2fcfc869d4baa14faf159b2956049d52497d443c7f09b19d727ab839b22e76d098ec8eea8b6de9f421a760ec2780dea470c3cb49a5916d8f892d55c2e80dcd81f36c695af6330732ec7be6606b2c25ae39ff8fda519e36336b653cc782123bc28711e9bcc64696d1b0a91db3d8c34a1418c0ee92dd5f6cb38551762afc2c423d2d004040876494d080327fb15780b1e50a0ab5f03bf150724e33769d39a270219bf86e671e568f6e918fee86721fb570d4bf23a94d3e16d9e2fbe2fe579026b277a9297a09e1382948dbea2b913dd2fe2e7c537120465be777cdc90845b60cdc3454456db3333f16495fce3573815632da6e85a7f93d2b8652a1eea47d6eb5984fb54f45bf16f0132fe7cf007baef3f5dcb7ded5f66cf54a2f4c7a45018b92a142ba24f68a69e9d50cbc3bcf2b2cbe7c58f43b62918e5d1e9248cdb510adab4919356f6653b52d8d429ed5cc4e896db00d90743af2b74d3846abf0a9f7ea3c14e7f66d34d38fba093344b4e637a46325e8d78ac1f037533c7bc1f93110c447d9acf591aa62aeb7e82b6a3c22122545e6214127d44faefe93a9e8f0013f00cb161dc5d416cbbaa686890f55a839f16694497449759133cb9d719b2e8ed9503645602ca7117c0118e4034d546a5e41122d28be07205781e16d7612c11c8a8263f4c0998fd93f968fd53622c3c03389cf252c2ec51215459357400c2ce1abc1dc4745764c18e679d380112357f651cb4d6feaea98dad6829c083b10873ed5b774863b09c4144ff56b37e8b51ac5b2b99fa652e298ab7c95f92c033b2af3f205f4e733493c27f36975c87cd264b482ae550df8f95982699fd3746dfad6b2dfbb1865022fb9a62dd5b9abfb9cb0d0f34cea0c001172eba857fda7cb010e9ba2e78454504267528e18728f5dd7e90a5b67a18c4202ad1601ac78061b39d2b51115ebf792d7d093614e0f9e90c5f71b34d377f5a09ee723c5ed7e4ff0849308d95caf3dc44d9623c57f02dc931b9f1c1bdfac0fd871e38c8081cd1c874c6c8d60c5d150371aca07ca4debd098d1aa70180a06ab7d70b0c6cab5b2301339ec994eecb5b58893ac2c006bb6e1e3d26e848925475d68e11b4a5ff94165b34fdc5077c280b444d4862ae15336c6b6d8343654581511e6904ba4c5134d4b423eba9296c60100a39c262d7c6f169b8f2330a2ba08da724b05e2b9d9762cfabb0d2d3f74651ac6818883b86a23b3cf8b894c2663d76bc009382f4accf0c80597f2ae867a5296ef0e488b1e09b1d30f5da6f90169db862e15b4b6e58feeb7a5c4d7a65cefe8f8299eb6cd4c4cb7565a02a3197fdadacf32f12d01f77fdf8ac334931c3eb54f74d484c398fe6b33b780256b74fc456b98b05b98d3f8b0e238b159cf1bb391e5a8596a43667f6da035e76fd55103d97a92f2de7562ddd53875b9f1d35f6c81431eb617c611e8b4b76fe969f77af21564b190ed37ba8913772798e14f5a53ea35423f11c92bb04decc6816326825661179e9b934f75923e2baadfd20c49f065c8933d49b91db8b280df452ab8281d6098f14f848e7fc3226df9337f688e4ebd25c2e535c1d6a9f4df25a2d9ec24f7b6269237bfc654a7499840e87dc7bb4344fc0c9caf1e0140dab830c96ad798150c138665eb911badf99a11676bfd81cbae6d470898c2cc3bdb517c44d55e8e745e4b475c43e82060108fe8e0aa104b7bc4130bd2d0b6a30204e97d4d51b2fd12ca1243d0f3917505e11ed4f53e064a2510726455079d7e12e6cf1b6fa49dc6537a121ddeb36468b6255146899c652fb24966679e3bb10a02228ef31174798a5965d9d25ba47eb38290c38a7948add35bd6ed49bf9a1e4551ee1dce3bc32206f3de3f0085f9c2bc436158f0951ce7e8ffe2df557a1733bb56350dcee7cbe68c1869f81a224534d3618d8992bd825f1f0323a649431ab294b0749252195ac0816141e7c9c94aebbab60c54f59e754621ac8d8b601c4f80d53b36676539af3a5af23adcfa43df0903240c901614590af7ac93bde5132e6b358210288be522cbed73d6abce4943250ac27a92e2c5de68bcb13475258832ca2c9ba6f0ede6b53d8d31ff4ff0b2cbd61d9136529b3ba4598841a76ac1ed025117360aacfcc2cba03561882d8979662ab9d18ac7d2c523dc7283a3f86e48ee725d7d716071d29724cd44c0e33be441f2e5fd017a207bf5218b341ce8aa195f28aa23a8b592a08a996630a7eec687a5289980d92ff03a2177024c18ffc42087baaa1480b3446242722241802a9bc0abacf07086d0bfcd7fd575de02a47249029fc1374a61e7229caf12206dcd2b9be0fff32e4462848e2a57d438eb4b40be41f14dfc2c4aaef783913346c9317252948c6e0e290ef7be734cbf60d9e5cd5186905606b33a86535339db716d2d4ad324f4341808d6bb24ff80f79ad257895b964cc65e511f1834f1c08deca12d363ab53037d198d91a5e84351de72bbafa5e6a43881ba60d9c9390c9346e4b3e35168ba36ced973f09215743279593949f00ac0ac7a4cb8e8041bc9c58633d40ec0fb4234c22f1d1d9322f2068edf76a34de6e7efbea9c3e4bee85ad2484c7ff115ec99bd169acd9e5c0b9ae5e52749b9dda73fe00d732d25b7bba1d8daa9371f84e0969b5ff073fdd0b5b82c2d0832b00c2612c5471d0f8286bc9050adae09576434d560bf38aba4a4dfd6c5bbd78690f267dae994af6b8e67cb60b751fa04b35a2f1d9968b5fbbbda40c5c8713d7bfe3145453118a2ca831f7f827dad29ef2ed1661695ccec4864b0446e12816d02b4a73823a0464b9792106c3c3809bd9b1dc5308cfcf16b1a1dff0b6ac47fbdc73d5de85fa43a4ce892b980d77f22de710d957525d934b837825ca8fe66f2baa3cfe45fa1dd53b6c6f3713e6f682a52a38fffaa45925bed648a429eba91fcc632d0cc8b5d3e702264b7d191f7c2c7b6ceda5cdb748bfb3778e68a1b1d72064db20f4df205c1181a9ab2ae1ebfcd94710f409ea2ec48ae6a79d83ad725b01878b87f3469e0be538a5db9c176aee5135bc2bf2e8dfa4e195771c754361a52c5b47f29116220897f7d41ed703970302775652594f33e46825dfd331a2743214b038ce531e420ad4a0c16c390b0c84585666fa2736f2eb420152a5232915ce19df0762b20bc686302e2269d813ae80c994a24dba9868aedb9948d7c9bb17726c870c2bae6e27f02cf043d7be0d7071d47924eaa047ad768801ea9a1b7f8c29a60fbfc18b36d73400865b7d7eb04c842aea1b407506beb32403e400df8ab6646d098c3e92d2dfc4290a3a56efb5b82101b91b46ff8805fd5da5fbb341c64aac9a708ef3c476eba0eeea7648f8ab34d5523f05bfb4ec51f8703e2e9f36c5b4d2ebb623ce7ca39ce517a5244b1377f303e99f3a160988868208c182db0f276bbd711ba5fffd0ae1b8443260f31eb8e4ded1863416e9b7b79f515851a1f4de9165cd3a76cadac1d9b5394cbb22614a5d1c1a9a9830fede5772f39e15a2a843220a0533d94d7c0f3bf00703d2930b623fb90705c34ce2af40c6c0610820069915776f24642587115de4821ed44556ab086bbdc6788c51ccc4ebadfff9a9228605c9f4690bd753df61868f39abf5aa4783180a1ce22e6942317b671992a60dfd3ba7186dbaef1b4bdf81ff0ff857ecbac39ee93fc04c118d58edd8eefb3d86da05ae8664d4726d0689d2c855024d1374e27eda0b17804ceec28fead81514c3a7438638fe0120fd5bbf698bc22d244472493220146ba02cc9d422c91257a41f13697f44f873eab99772bb0059caebe396b3e34fcbbc7860f7ddf8088d1c6e763e13e17f1188b7bfbb13445186d16e77f6906f4c25626025f7f0c88f82db4f326cdaa3940b6e7d12cc56cdea9700d8331495dc52c575161235f3a930c3397e54408ced2ab02cc5b00a02d9880b431f52bf23fc574f8a96adc76e7c46a3f1e6eaf104f19adb7051db6603003394fabd176dcc7f7f3cde86bb3d5a3566ab422d7ec14cf41df4bd192f63ae0ba13355d57255c928c9af343ddc675c721db2653df0d2e6700ba99b59be0ee156e4010e8facb38303d5b7a8b41053745170df10f90d48b77fea458ec7ee1cdc243d5c59068b60bf41a5a1a4aeb16c111470a4a4870b7a416bb3848db4fc840f519169d3e26d336faeae92c9e5523149dd43fe25563260e9e25e0cbf87479fbf1085be2021dacd3f8a12faadf27f6432a297f6178de8b618d5a3354d4a8e3cdebc8fe6aa13e766e45f6c56d05794dd010bb501d1af6b800ed835f44bec1a46935d03d878c5b2d4c4fe7339e6e5c825d5a9bdc51fb3b10cb1e69d782b6517256f88234e4b48b8b98ca80b4e0a11dac990b01b095ef664211ae51f9a25d6b96a2bc374d12aff06b29a7968597982270e99d1bb5081f1e8c4b134e3b442f96b7032eaa52cbb87e9f7da6f147e13a54eac8c7abd7f8ccb6f9b2dd1a5bced81f7495127c297e701041851edcf9ad0cdc87387073a6615d56b1d50a9ecae7a72f241016ae2428c4f4c47b1a59394c678c0983cf13999ed8724133e89529a30400edf4fea234565071cb4a425dbbb6dc5c0b221402270bad9f6e2352ee79d8e13154114833f3f5426138b9196263432f903d89bc642647e85262193ee1b75e38b2d0bebbd2c025ba24e379d71cacf28de1cf3e0933268730b8c59cf9ef02ea72ad8d969250df7f8d7f233e90dd6830df0eb170b9402e831090c2c8a05e8804ba4952325b1a06ce793ed6b1020ebd867181bb165551e16045d8c58f1d888d0ee8984dbe16c0139acdcdba772818f50e1d8a8cf3ed708b47bc44859b9a065335d2e7825569018b9d383c00cfeaf3220ba2d5bc6166e1174ebb41ef2fb5407aa54c0760200bdb22e82f3e6503bfe7ce8f107ff4ee8b199ce2a4ca31c323f8c466714adb22484769f6e1877627089f4eee885e72b70275ec7edcdb264b33265873f8c7423f9f284c99e524f65dec1ed3a5e539b1b53c20ea42efb151c4c030b0545f0b3b6cbd240dade7e8c2c3f3c5874dab981d132c8887c827c63f0b8741ba9b1e248fc6b93f141b33410a3ed005a802b735df73330a581216cf6bc496c53eb63b8daa481eb5eb567e842853f2b56c2640f0538cdea68e0642b460339be5534109a68e08df961e4dc2771860632e772c9e5a4d6f96ef8dd1dd087e805f88ba01668c3d6a854214103050502e297860c3231350d34306a306ce9db94f5004aaa2957684b60ac9b179782e7b933a3b88605954edf51c1852b1c1da68e7a06aef94c374485b0979e458edd180b2beb00decf97a27db6691b973c4759cfec6c6cf23f52f6a1b16124c8b5f67304efd6a72edbee16ee760d6ad6c3169b7e3e699aec2f88a239b5f4fdfdc2fb99c9c11e344377412cf6cd27f3098ee482080a5fee3fa1746080c78aec7a0d842de9d2ff8cfcbc28c1aad415be8108601c0372226b8a2364367b89c900685224d3f045a00c3287bfcb261c3e97e62ffe977f27ae626fef12052c8d81a8faf0aba921d5d46578fd4bc1f9535243aa596badbae223f219a1dc0e1a36ce17d0c510889aaccbb46a4b678cf5b95ee0dfd6aa7dd36bad1a25f00fd8acb4fa56bbf9b3c9c02de039a7e7980cbd972a87a74a090926f63ae8f5e2fa5348baea882811be4d80728d724526e2320218d6f7c9f5375ed64ebddac4303ae2fd09049c5401998b7a744598b26c272fbd1f96f8ea69142ea06f3ee8c32fe87aa042b0fe64f069991a879ccd45b3bbd921b0457860d6ea116bd1eaa6a5ad41891aa88e4ce927f89c1757a82ab9ff53a0f7876e39efbd01c7a8eb9d7a4a61df5ed59874e12b9b6aa3a11174bc7dca274541d19004eb4ad1f3b1b4a0b92a5029e1183fdbb97d479cd9c7e78062eb6ed500d9edaefa04388f88bf742e1c7f2924914c4c3b1f95ec45a64bc7e4289dfeb62911bcb95006453c4ec56cdcefd0495077d999e64855a30c3d74a007868468f6c579f23b6763f756b4b005659823c29f0925dd52490269896e7aa8575d68d5ca5635010c4537c36c0d9970290d9f207b8dce77512e722410b7b97e6bc1631b78c62526b57fc64ccf015d0865844022c0ee1f77e51c16b6d3ae9d060f070cad2c84141af9e47801e8c4c294d3a71193397e1dc792794dc84ded4b91dd98906384acbd4634606b5f4eb98f8fbba5a9f12a92de817f10ff92ded17425a1ffa528e6eacaeb310b3d4262f98f108095d5d3bf77cfa03e6c23c8e6c9dd94615b73c9bde166757d7cc7c22a0c0a51700834f8f3aedf90b8d7182a18085d33e8c420e5944a4c515132e8bf085d629c1a9efe65a2ef29ffa8eca599d683a046d000cce616a094b94217358b4465f21493fb8a4c8c5166db9991eeb6a61c96110e4723286e331c7cc916630e7c3546569acab7f02444fa6f3e0317d00ebd5947e981d05491543660f2ca7604d23b4dcd4ffaa18f4c0ec07c9ed5cc5a50b3ebe321c3aef5c97548de440241573eb23dd8d18b9bb38b95b93d0854d29aefa79d48ea8f6dcb906ea299642257043960132230bc6d30d9ecf6f17abdce0b68e30c9aaa38c72046c8e14dfc6f5f613882a454e0b00e30513c0fb261420ce1b4fec51f468dae53df8d6613070f144e63fdc2373949834d461584672e7da29ab8de3fc60be064c6e661ddf77e9a3453befa9f9bd6dce5a0e5f1d7ca5e1b750610a5654e394b43fc31ac3368ff50c1393d540282c76b7a68eb078ec8f490c9072ec9d2438502dfe1d2d3303e334ad604c86bcda886b4494a146db00b7eac331806792917fc15ece6334897b4165b2e965e01f5d3e779e05c6ca8d9c4eeb8ce984c3814bd7fe783c650e3af843676b3d9a9a527224aaa8d9afc92aa837151af28b05ff5134252e3f3fc3a8d9f1c3e7da642801fab2da9f1b7aa940715755777299dfc7ce7bb7e0425a14c501d3e0afe9b608d775db3c652858a640ada48a7bfad97b9353e2515c5fbab5712e8adf1db1cb5f91883e5587c68c29199597cc94a7774613643dc3880b705ff1e8dc465186d9e3d1c1b9ef8eb505063a03c128f959b95f434db491b44ff7c9af0963e8654e101dda3ada4693c9d1833374545228419ac38d8100d7a8c48b317a82687816117037e74b375d23979642f4b49a64d0cc24a8e1c8a061813c7caea5e73f7c38e264cbf8c4c363e4642ce7783c64e31acbc70f36734a008ac6ef063a03c05521c53b33225581b9fa47666617dfa37252e8399ad296b5bd8572eaeae3d908e987b89efcf7e064752a9e688d189f903b7ba449b2b80064c5e69095e554ca9e7272d0f13e093c06ca5f025c62133597abfaed541c3c4302302de81cfd0e0f1438de4addfffbaf8cbdb984bcf255e647815e6a06b444330ce03706b2443516bc883aeb6318086118318f1ed1d1a663042c8e169dfb9d2dc1b0f3f904e4d0092c652931cb3751ee093b073ea65fc86aa4377c1ac0f2b67859579dca947c39ee2260d6066e9ea46a295986970fa11ec2e70eecef87115215c849e5cac6a2ce2f210004656b50fac995cde4ef6a17d6afe4fcfe5282717d80def363cbc0c06c119570a544e5cb840ba1eea5d29cf81f92eceb1d1a5236a2f34bffa89820e67cb8292ce4b4607688c864efbdfdf185817f2d62caf051a2e96a4f20202279a5bc2df8bcfd96a5493a4ba5503bf4badb4a46b18e9b492344b2bc16f8a24189f00a8244a2b84834ff9865064f012d4c3330273a61956345edb23b1b024108510d88669aebcdc53f3aed9acce81d10acb486bd1039e90e1e2000616aa0bd7c4f818e6d164c1afe7a4f3aa4e36fc8ec74622a1abbb08a7a36a83863fc613e99cd03274252cff2cd369cefe9954ba0800ca906083719bc17fd9ca1b1b433d6b1567d0139947ed649009007392679679cadd3d75551aab91ae5290e548509187caca0126c17c03f0b4460cd22b05094226cb53a573cf2bee776739c7586f75b03a46e112aea3f94e17be951b48c9e75e332b30f55127a7fc9ee24282780007cb6673ddf50f29ca1516b1679ad66013cb6d372c3d777673c6235d1cbde46982877b031b8c7c9d9aff921a52b64eae0d841d068d3cffd823e5355d8223ad21ff5d650048b4b881890b132c0c7e196efaf33f68e031243e1d6dcbe619ea71a52d3fd013c976386b6b0c59eb92aa21e74b2b856373ea2a9c41045c4ec77b9d4166266afae08b86edf7e7d9fb0835315d0d4e9ada95471a0b0d59d9d22a1e41eacc550b8371468d931f0b83c9e0d6fa2bc339489e16989eef4b042f9e2b7b93e427c60f11883de2b201df74937031068af885b5b41e56da96db59260ecaf74225eda7ed606182aa30c20522576e526591b6aff2ca2e365558ed1cff0fa589cc3f972382053feddd48a7df43f85291822e0fb8ea550a30b6302a9a3a1b1185e92edc56736ed865b511f0754231eaeed33c8471d71523d01d084596ab776de230004eb133f162922ae261c2c01f805a249d45a43493a652813d5bb23a098799558e6b08c10f61f3f2159cb856d878548c7bbdb5bb73602359d5dd73ee86c69e483d14e550460046d6487097e4e716ce6c1be0127b24cb98d3bdfaec6b2627924cfec0f1fbefe54af4b0c8068eb7cdc3088fc24abc70da698e3fc388557811ffca1541d4938b694892b0249cf6b1744651bf07379b6550e9028e505b9eaa1b9a55f2d687840d74a527e9629e0f3c3857a851d659293e335fd0b90ccb228df2d5f093888d918df4dbd7311939c593768eede5193b33741c1c15ed1c55b968bba4b97cdf0f0665664477ab70858010bf4488721a79d51f73800213a5eab727b1a629d44fc39f286edabe3ee8659cc978a985d1883d1e1b5877346a7e8b01baeb562b37717820b4576fa7c56b87ee5b35ea4378cab72f7bc6cd30c1da082d7e0655969eca73d8f73a438c2a0062a0ec5a3df78e5638cbb2d8c3f0f5a8917bcdef05b348c47f019b669d10f2f66260584f84b56bad4c2a23f9eef412a0fdff1de56970b48a9c5063c345ca023c61798038ab592dc3d52bbf8f943205016c00ce9e83c1993b49d8ca924ffbde038dbe8748761fe1695a5113015fbd9faf3939f75039189475deab113ed224ab62f9c71caca56cc306a28e9ef3b6aace1f459392b34db0485317612070bdeaab30775e1f856e9de949be4e1e34a52bd28d40429d58a8915fccd2b71ba4864c457f00c3b36ee83b2fedea0198ae9f3b8840e2a3c46b1771f7cb0c27222dd4b9a259327ef6da331cb87ef17728b9a6eb3d61d437d117578eea2b4922f3d3c162d08cc10ffd8d3ccfb0f338b89cea0fcc4154d0bead3d9d7fdc66dd401632aac8716eae910c7145c3daab59be8ded10737d23a3e42e4e73b43be61f0b06a75d013e38294ec6c204dfd53e5c9e3fbd57382750bd81604cf1bbfa3d5f382a1c9fa6229d3da5e3878067de611a44ea650177b3d05068829148fb92335ce62759d3a477f552db69122746c0d2dbc405ac25bff71e160bc766dbfba1f48c39997befd143d7ceefaf3ab1224dd91cf905bca3bad36c7bf956edda6a1c3a904e754f29d9c046ec5595b06185c6cbe01eef8af5ee058d2e9117eace85fccc8cd02017f2ec48a6a4091c4accb087343152a1320388ba3a72d932d12df94e4a1fce64ea709176ca1c0ef84c37a026198ff176eaceecd1485b9d43826083e5e8e6ca5e27b2c8f7e3513c1e48cf57ac53a9755762daaf2f20e276255677d15497e4858967178d583cdc7a4cbec1a189d9290c0cc3b21498b0d1e31be70c6931f38f1f049c48ede75fc245b533ce54fb6e40b9dd35dfb4a9b3b3e2ed89706d01e3b6fab5b4765801f9f0254666819866ed776192e808d34108c0ca4b7ab30cdcda02e7ae48bbacb6ab21e7b024bce21c3ba943de726fe1f32b6f2463e474116757c0d4122c779eefc00b0a76449d3bc1d87c918825c52fdfec4a941ae9dad6189505fa6d9217ce0a2ccf4e5ae1de44c18778c129868b40ca430a304c531593a6107c0182125b59614f90276184afc8896702266bdef7a2b3e00274591d0dab364607f4034a0a51ae4297a39662bd87be147aca538b752bfb3f873cfc60b021b25740f62ba3343ad0f561b8b1c9c0331f2a292f516b4b1fe29ae68a51a3e2ba3a9964c932c9108f0d5c9ad0872207157805c6ae7a441f9ac09fc0ec3df61e12a73147abb782e8bb07976bbd5784b8917dcb4a611d66ee57424d21e7e4d06c8753c83bbe5b7f1dde6a8b50d19dc6a530def01b01ac2bdcc67d8c54a2744fc55644e42efb0579e4ba44c9e4245a446c0e64e736a7cdb4a5f4cfa2e1263fa4fbdbf4a1c5b8f42c5fb14bce848c0dc7dce04fc5eb2c0566f9c61e398dd007cac3af52840c652235a22180166e150a779ee6f64b2fb7914d8a7d1af8557b7e45ca2102d50bc329bc43c9fdbad4dc48a0b9caa0e7f89acc54e2f227b59b9814e91f12744f0de09ed58f2c75989d2116089c42f661eb23d44eaed725dd7e3cb0a1a5718f35b40128c0a7bb83662ecfd4415024018988fce95e0a75337d7cbea5e6851ab390e6ebdea268ab6f694d5730054690f191fbe58f024331d52388c87d57a2047c5a1505ea052f1c52bc72224c09fb3c5aaf5b0b1eeac00c0e97a5bf7bd4be4f75e1af55df622ba284ab087fe3489914d5c8292f42f785e534b969fb38b093b8a4ec67144213e37b1031ce2e26d41eff833e0e6029194e8153110706ad6dab103240cbf07ef4c94881605b9d1f0c63d354cfb1cc2013bc5a66b484cd134cf721e89d8ce58a1ce0b2ede04cc6f7ca0d0113413cead62fcc05f9025884dd70e434e9f69ab4cda7ab07155d79db1a734cc2133661204f08bb1487ce80eb18c0ffa1398726d20ce505dfa75078fede3bf363087e36beb2458e1c8edff00f4000032937ad4d819672f9d9f4d89284483134120da6732490b0f5f15a83e8fac27aa3821844f30657bce3ced7b63873132d44d0d1b06b01c82104bb8f3bead1c1314528383c22f48851485fff1e3838779c8c77d0d8fd2eb7504445d5266ca456960b3cef41505db77c848b3275b79f6bf4053f21450b1f6743cbd12cd87fef1ff5ca0d6950c7237f7a3b28f36ee69f81632e7234eb415f37e4117f7a1892f439f0d9e708f3c0a31e733aa9b7fbe4bb1d069f3f83d25e0eb99a54803090a28f4ef8907800ae41ec76d6fbabb12ad4b7f139b34bfcdab0c6f546de34442683642a3ad7b4a3cce8b7b8ec6fe33dbb7fc1f15addc49a02c2b1bd77de17ff0cf14a92f93dcad6d57b38f61e2e33fa59eaaa55451c460cc7127af299955fd24fa5aef3e6e12c01c48601b4573867db0f54b04a35045c9a6c1b6d00955598cf2cf9b6feeae84a518e4fc2eb84f3071fe92d167899c7e4484557c3795b6d7044fd08874eba72645d872a6d4d192481fad55e322f569148d4b29094e018156a1f0a338a02a565a86711c06b2dc8589ac39c469546666c6789621a0d728a9fd84f65b028eebf55572a34aaef323ebb2e2bf4a3c974f3f05547a9fdaa32b5e6d4d2e1329b2ebe712432e7f481673357e3f4590cbbcc672a481b837fd787704df47fed247d13547c1b6c362ed53a8b10aafcd58bd3b87fdf89647185e570222dec82f4d8fb41c833f4a4b5850c6e42973f1bbacd5a56a1212fed5bf7baa1981235079aa37ef218828c5e76ea0551366d67a593a99a3e46425bb35db80dc66ae3ec661ab2f1004a43b540d25d39e741678ef256600a68ca256720f8a0a2e4cd34edac883d304d440d4b971ccfb9a78e0f8a8b24312d62ca6cca9d19746dea7a45a0b9a56fde5a826488193ab2bf5eafdbdf23afecb0a560a13138a6d9f28591f76af40c78ccd4162f168742c105d025eb97e70428cb35f2f1f535c586f63e6bea7cf1516482c7339b3e8a5d755c2aab182665814179618215088461cceb704ba84f1609d5e1932c8476b43bfd21ec04f0f214f7164bd0a36afb7372b002bacb7ad54701897b81ba5b81eeaaebcdc6a994f987382abfe2820e6bec68557e55c395570ce9c7484ce884fab7632dad820c959c96a745d5d44bdb0ed3ac5829821f33988e116d2dd7236410d95af9170c8b6d188a142ac7e0285b0a595d853586fdd67f3c8081f4591f3f75d35f06f1146c32c14f3fbb5bfed1169615dc28b284de4cd75df383edfb6b21997ff953e044d574f6c1bf32cee2155136da51e689920e7dbe27b47a31bc87ee7d31a53fcd29eaa436224be091b16c2e8efca9e4e98452ee5288e26713c8535ad6dca01b67ed0f70ff24476f24cf30de3ad746ec4f65ed3fdff5a3c7e4f9586064a43ba3dedfa47a54c48480c7435a4c59e04dcc5d1ca2f73c0eeb412a1088ced1d5f16c82544f262dd3c0d4c33976bb537c3094897a2b4b16f1c00b741d90e190eb584dae58d61ac7e1b591cfe029847df9fe7c391467feb604bc0657a90ef415fb4ab8d236a40e8ca5481366741e1f09af363265103458e98ca5155d968862a5a91e0faf9b04c95d7a2344ecbc17807aedf7ee3d87ce8e555acd4ca14ad07d96257fcbef712c74a88197eacd2af97062650c91c256af3b383645540ba62f02bce83ad4a8b6944f1b73e284cd41ae49a3d80f82eb94c1442385413308440407eca5aef80449ed6707957ea644099423472a2e246b19dc828c64a2eed764e257dd4829b0c5f61b24dbc008678a2e568c23c03afcbee81ade523f5e5f924261e37b7624659d9564254be7dc743b31e4479995bee305cc0cbacbcfe03fcae9f834bc39dce11c72820421ad82a8bcf83285d27255d57ceb775ca220ac48817ecbff2293315932d91d5a8427ece222479946d918313e30b34ffb92eb35ad1aa018c53266dc0e6c6742428a944bd3afa3c085ca06f5c6121be095e1a1c3d0e1e98f4d65a3450f90198729c40fedd014b6a51d9421d6fe1a2ca82854c1cbab8b614185c5233dc13b0b889bd7697a013428e0bbba2e483f0c6f72650a99e033f7fd7d62b0083972d8a19945f5c12f5a0f388023690da03473cff887957a1a3bb407c0ab3ae55f569bba5dbca904d1f98b36d462a0971b04f373b21300549d9624ca7ed83425eef377b0df63130d2928163b34d77669a8201c95a35a33446c6448fcad41e2ca78fc71228eac96a802abc5e3043723b2ad375e9ce41390bac25f518dd9381049cea5b3d9a00193b7ed479509ab342ab2c35e79f2fe17f6f4e2ebf5ffe330b03d0566c706df8e076f5779adf49ffa4009011398bfcd185d4a54f059f45254fd5344c030daf1287fde60908296b24d127e7120ccf90f8c49874a1db369f22db23a33b49f2e8d4f6af26e1e8414d2a1c362393537ca565a3ab389524196fb628492aa161121c5dd2adfec5747f6ea668af91a56afdf727bbd89dfccfa5051a99a2adfa86d8aba82f4914abc3c6678e4b084445b15523109046d193361b47da8d0f5810a25650902d41e6783d51d627316fa4c4040381d2348bca0e7669f23d7f86c261cb42cd0938c8281cb87721dd5af89ce1470f905143fefa79ead92e4acef4727feba6b413cf0df4fd08af973cddbc9e16573e4aacbc88b52358b9c4ba6b90a27bb87d275bf18b692c50479abb2b27375e36f1cbc64df966e611a2fa5ff62f04499feb459cb5e534fc71899a176c66ad45a32f3d47eb86c6bc7edbf38efd09a4e775635708f4145f47362557b7b189b2c8966247a42d7fc7d938d3e56a5f5ae0981e194de97d4e33903835e8929d362ea6c24aa1215ac84c1f0b4dac51a15489afda410a3f8e3e713f59346cb68d5fb791dd6345a41fda4b1df757671d37ab5cdcd4efd77f56b9d8a29bd43564ac79f878a587160e1659913c21d0027f08e69716ded09531100500977396c980e1d48096da4f69ed905576b0ea6cddac9587541bd6af9ede686f7009f4653732af20e5c6b2c5f293bbb46f973841fc6ca901a60cc64059ed31b74fdb24774f3cf10af660d79bc3b413f68b1b186c0a747760acad669227696a9fdcd6e0723f4677dfc6405eebaff1d869704f9f7e02eb5cb814c86d81630bd05accf8b61f002767d2dac8f67f7e8db176d0e856fd8e8812380dc4d86ba74d57a1d7285a31473fbd78d5c4c718774d18924af9bb12d24e4439be95e7f41c0301612336397b03cd21c2a72c2755888660a50f5991d97449e4c0f390c6a206e349d264b450fa01a3f8591f5ba58626585f781de31ed105adb130ac809c498e1ed31b9921cd4b3646175240e50ba88f48f76652710cfb194da8c11d5a4bac89a7e14f2d74174d25a18eac354c698e532dce52dcb48e3c021adb7dbdef8d43758fd7c963a09cebeead004b029020b4aa9ebd223cce76738925f3844819f56408c461955a0f497a082d82a5ed8fa65e0afabc370c7bc831b864fbcceffb1edda4da0016258228bb07b2d058daff665dd4b443066228ec270594e60f906464eb3ea03261acad145c31364702a1c460104c2021a92a1525b3092aa9a0e2d5e869c604bc6be1119673ead7c816061e046f9040e44cfb435ee873e6f490c1bc6dd1736b203f0dfd902dcd218886331cc4b0d416ba6b3d24ecafe8006d361f2d0fdf3fa9b74e2a61361166b6defbda59452269964080524051a0532d6f2e0defadaa6fd6b9be52ca987f67db29123c98548c5041e6053fe6ea492e324372757c3a385a384244d4ec89bd23bec5731b2a4df47b120d7d1abe58412dc942b30e2492c0645aec0903e4ca11f7ea03f74457da6f40dbd418ce904ed9944b3f5f298f9c48c621e4d98c7cc5834f2e18915312aad28703812a2c05c3fd15010114d209c1f10499a27a20d145186fead1c88367e4343072211500dd4ad7141585001dd7030bba6ba36d99bb8c0e20638adcc881574109dddabddd72e6aa6c68cda849412c412c70078c09f6ce1a0a0d5ab1882f7e303c9fe66bf655d83dae364817b70962b1e404dae4ca0d62e68b0877a090fd1c6738c315e793f47010a0840005a5a4ea798180420203f0055adb53a7c80595467dcfa36cb6edfee6b75dc2bdb90bbe3c08103c74479e6a2400cc653bfe2a05e3b0aec90903f1c9dce1029a5095aad96a7382939f796b736cebb47c825b064ef3a4a94f122ca48691fc4b0c598b5a3fc004d9fa62e70249849cf3b11691a26bd2062aa638d46f498dc156023724653efa4138c367e2fc626d3bfe7812ded3577d74ede72d7b35ce0488270af51cb5b33bf11949892170c4c46f621cb1fc207247c08228e88ad0413dbb6514a722451c655c084fb80e405dec4c984329b4c412203fc792bba1511cae6dba6bdbbbb4f27eeeeeebe693d9dcc70164d27dddd0d4e348afa49f4da8ddcdd24d49222ba153942c9344deb568b841e17104f8000a2a9ab628b08b72d6ad2b2ddfb34e188b3bfe725aacac09f2957aad3deedd6566aedcdb239e7edc1284f61196d243e82e511dc73eb1c8f4a2196906354a18a9803ef7478303990c09f71e4ff88400c94e410c4134c7e94183992833494f0e24995263b50c99e71125880234a260cec5e5dc7a532846f7ac41dd2c64794999b8f1d2323520b9702dcc6b3d3c46807c90ab08d1712d2dd9700f2215e89091912c21293690e63110205fe1aa83b49a4b304f1e6044914f183ccdbb65a6ddbcf6afbd9b69f9f86c18036a00de8c379e62d2e43caeeee46f9bd18ffa350118542997050ab5e80638e912c1b33c596b0980c790440fe9ef4c2d7b94156107681a186ce39ace80a5263fed7b556e78ab61cfa46603cbecefcf8feb19f7644e27707e344dc88caf4d384c2f981aa913d189a52ced948f026adb51dd4f50034cfffcd0046b83eada48c43dde5380cc201c76ced47d59c6f1fc87cdb153942a73efd22b448fd62ab07cc03eccf076281d48e87760dc4442be2786afef55ec26a263d643299febd9a660919c2138447ca8d89989e73d248c1ddddee5e4d265694dea49400934963eeee76f2ed9df3de396fb70e14b80dddd7e5361e4f71dd95dde1e81b2f297bff18731944a3537a43788244303e13787276707ebca4946a2740f9bd189b4ca81e9e21a6ccf37abd5e37501cfa66fefdc94866571105085bd048819bf20c39c55cffd33dd13c5faf5773ff4284e773ffdaa5cfcd93d63be42b000adcdd4719f971d3684f467b3ed31673cddfc300e3c27cfaf4f10b05690f5d1d49af07edbeaf617906bf7285e3714096e73492de0c7e85ae6030daf3a89af724edc181f6f8385dd19e68d3b028235b0871074d5781f5941c635186fad015ed915e37a94d695b3ba725cd690308b3a4da09235762b266272408eb28f4977c64fa7b3b98ec118024d53ff29ebad9ac39e757c34ffdaf7f6cacb5d25bff4f304296b7ac59fff3ef9437bbf766d77edb0692298da6f68f4cb5aaee18416441fa38f12417638c479186eeb4ae5918efe0fc781720f0d72cd6cb0e1feed974cfd1d931daa942bf493ee6cf094cb0acb4524b6b6d29e5d0c5d7d67bafcd174db06612168bc562b1e8ac73ce592b8bd537720a131758dca06b1a8607dcdd05969f89cebac635a170c4a273488d0e610f0e8e0c01f258cc81dcdd6f666d76adb53a50332c16c9080441100441d0bbef81e0052f78c10bb2686c80e7ab8868dd97fc79bd0292de8fac59566230980d22b640b067058be56bc59386526d05c114785ef398d3da9f8fc7509fb4326aa88146926622098bc2095a6bad066ed94f89871705d640500335d0ab610d3d951d6547989aeedbaf51dc02790d85748ced6c0f01f2092cc0d9942e7a8cfc138ac09bacaf6a242798599e0e0dd49068e0cb6bf737d5580d3d66071c55d914e9d5b0c50bfc6553b413800059263cc13a413b41e93388094e10c7a816f1e0a142c883070f1e13f45454110905b15a393584825b68cab4a0253d6e53412b9b2269282b77b7630a6cc45de14b4f760debab86d5c85b32489e90829e600bae12bc0450a50115597eb6caf2e512602d3ae109fc45589ea0bbab77c89f44c04057dd22d62ca2277f829eaa5dc41859c32322c2c022ca48dbd3025d1304dd95134a2973c210c70f6a0d431f42a13cefdd9ba1a76ed8f57ef8622daaf8c04065038b104d54a4e7ba3b3bda8551248d51b4711cffda856117b686c814e46fb5d6186dfa7ef62731463e14e9dec67296d52a973f2f5b951bfd80c3fbf54e8eeb605ee07ebe0fae8bd2dbaaf6533b0991de8b2569a667aceba3434c512084f115c697f4f0e5a115973b69e22cc04ff3e7959ef43aa52e7b52a793bdcc600822835b9e1ffcf2949120b210d2e20455d6284212558f229e080334638ca198cac808a66891640c28d0e002062a10b07000228908a40c2154c9c769b564ebda30b421840a3d2cb9f75e7b6bbdb6d6aa03f57abdf00d27b4f0e7e55829adb56937ed628cd7ced0b649a9651b951fbba78746a3c94202a0c0dbc74dd977f453f7ccd0007f35d9d65803ab793112021b42c44a6bd976dfe4a99a1a9295994caba9a18a96907b8fd1e6be719244922412d7e544199d9d979e1eae5982a0b2d2ddd78639358c1a0e306dbcbd04b2e0a04103c510f8eba0c630581bc1726c7c64f9926c29724411ee59bec8f6252637fce581b8fc0d977f71e1be057359b44277c03173bf4589126dbc060f7ca06fb46c461b1de28d8cd23ba400711f551dcc035c7e7b202fcf7545f0bffcd6bd7c919677f9a8721f3653919919126625cb2951fa0608597e1a525a1eff27997c116d74b867799ded4b6f493144958dc72718db72e21e3f90ed6f6c8fb72fc2f2409e7ae960ecbfb8e07779202dffd215297dcbbb94bea593402c8fbba8f2ee01dcb33c9023745abef4d1816c5f2a7d0c5155ea70a933b97c4b773d86e53136ba52cbb7d8f81617cc42727996222edd8fff6a6c743b2eccd2790f9397644275626091419e62e974581e3fee88909e65633945951c0a723924bd5c2a010926e52f5a99400e57aea8881851b1b090bef411268652d7afee7accfce831f3b3c09f048a568e608268e015adc060309869fb0ef2d4f6460108404b0b025e4724288180324dd3509924e18718739cbe550e49d34e6a21e6ea0cd8410f0668811be8477a9f915cb3ed151778befd1caf63c6947dd124ba7b4c85a08a264cc490820a21aaa8fa4d31654404433c31452c0553b470a2ffc66e77fdc8824aa452777bd4b4707e5060d6484f074ad3b6edd6dcbab805333014398663801773922693124331644b4afe389b34b07f7b17060f1e0d88bf18f2408ddc230dfce1d8fc645fe2b4f62db4f6bebd9feed3d35703f524cd7df96d1ffe33d25b3bdaf704a363933ca1838a88ed826c2450599d3b45753b23aa8d72b6470e4f10f88b31b7827a3274101e9c56abd54466937acceb31d6b265cb96ed0d91da1a30d890c33609934efad4808d749f0b27b54a949136db9c7036e6247139d2ad60ae01710a5743d25497a7b08ba7b89fe13761fd7ab9409a98e0a1bbe448962deff21cc96131db78fcddc1bc49729809aa77404a4fea5abef440589ef4a4ae88cbb3bc9ce2b57e4b55c7756e3c8c93be888de71e08e947f811ba22f849374e18dff9f2e2f21929c7a7a5f31849a7a57b9de831f82d29c7c7c6e3af248701491c23f5c8f199ab1e1e30fe96f795a76e48313a55041753105afac05fe8017f1ee26f213df772171befd2c9b77192411eeb60fc08d88f03f9ca09aecf52fa92f7967482a14f3b8f2a9c1260d209e531351145dfaf066bd8b639ac0acc93c01cec56d9fbd57ae5e702e34c0586c2d0d7185328a594524a279d5dffc41831ad95b6b4b4bc5e15a64901f80084154f7c603fb0dae9842309d5f5d303209ba09d5ad5271f31e7a054b6fb2cbd87a303cc13d610318203155684aaec8958e0894a7e0370742e8e245437ebe21a4c9a1052655d54c9ceb456ea51f5f54afb38a972446543d760882dc250dd2ccbee7f02c8b16f240db27c55a74c37a82cc814a4f723c71df21940820cf0b7c20a7d6332b97bcb3a716d96654ef0178d6a2683d4a1b9b687083d40a3bddbbb4dda165bccd19d6443a1b456eb6b57001f9c122263fae50f757a0a223de9f5b32034254a94afc1af410a822ead0d288dc562b158cc63b176a7b1582c36a934652d85d10b562a2259276dc87a50652520a122a2754051a6603f93401f04060a0a0aa2bed303c46bae0e320dd208217ea417eb3c16656411d9fb0df89340abd4f7fc649d5c22a71a3d78f6784c7a289c81fd85c0932e99424157f0e7318f553a3ffa8cc74cb158c805a18772e49039729472b4c1aca1bf02f12988c7e4c861f31715a8240001efd4dc5674bd66e6b13bbcb22f7e70f4baaffb22a24764aa5d442d2a4444946a9853a08f8ac08c9a49148b88828858442051ec75f43aea9bad267ff53582c9c67fdf82ebcbe735857a87c3602f5d6c853bd04a8964462c0b724529723971b58bfacb53f7f5baf1ce4eb2eaeb871b376edce8eaab1ad52845af2d8a5eafd7ebf57ad5577d652f17598a22bc0285f23cfc23f4dc501a0c325c4991cfe93e8b3cfc21f3178fc25974afbb87e10cb52fe28cf4e48f14c6c0dfcc4cfb9052d6d09f9ef36adbb66d9d7692a0c7c8df066005df283f76966559a366a8193c8c5a5174f79095ad567c516a2d0b24f8db97cd89a98d8adc3f24a0756f626a080a311569e8f7a362e9dbb27c70b76eeb5a0fdba8e5b22ce42f366971bf753039dcf630407e04294ae4400691233e20254cc152e1a0824f4b6583ef10aab6dfc04b2e62eb8afcb7ef10aa48cffd87a1903ace89394468132202d6444c86ba85ba857cce3993835f31be876a14eaff9a7e4a37d3368e643261fc52155f7a7cbc07c68508cbee2712aec0440e2084991d60faeeee35359da5f1f3ff7f7384e338aec7f49fa0ff38c79d72c05e698cb1da58a3b5d1de5a63be2577fbb4df6990beb93d363d441b2110f8faae9f5b6cf9e39a544b3992ecfbc959c8fe33c05cb06444193386f020c1535a6232994c586093c964aad7da7bad459950f405240067a450412889a3a3201c77c41d7133c88c18f88b4799cb5fb3522f8fbc238e23b5d06faf069c98b901fe1ec72b7d149e56f7ead62d6a26e728c876062b8991d1ce8e911196f36659b66353033cff33cd6ba3670132f171a43c6580ce5f21cf9f9d9452ce12be842cbf8405d052964f032e65f92513e40926fe67c30df904133b178ce4cf88fcade3fbc793cf53e71756c8f26988ad1c3b181756c8f257c8b29b57f2e6b2e3745ab24f6c94beff562f977153d2e4a8e309eecf5c33c1870926682de03c43c35af83c43bff2fdbe697983fc489596e8a40ea0afbd4f8d34ff9e169023e9051f0bc8b79b6101f9b6267d963a20f307eadbf9f4bd762fd06e76528c9a04e5fa2cdb7725d75f5fc9f74aceba6f18ea374baeddf4c1926737034bee19784a3c259e124f491bd1dd52c62851339d7570f8ce798a4f6ba24c25cd39e7fcbc2cb13c5d4e9eeedd2e17b304c79e3d784a3c2505f82103db7cfa40fa635724163942a7482cc3a34b122cbf5920506ed9ef9dec01eec762f8152f65ccb9f463726e6be59cd39970b95c3f2e4e7237eb148080bf761d491fa9c60a659871c3a377b4b554300ba947c3721fb5cbc5ea0e5d3d74a5968a930e5dd2b340bc40a4a1a9ee913f68fcbc68fdc94202fdc89f564b7b1e28af24c6b5d7ed8f682373f63927b5c2e5ba55e0a0955cb974499794b25d3228282868896b763e9e922b39420e343e7dc2b4e0394619ef605ca06166e7b2771a30659f3d67cfd938a4d0102008deac04b829b5f6befc0a586047c2ca9047c03b0414d241498f10475c45462118de4ac390d69d90ca2bdc098d428ddb368edb362e5efb2a9d418229b0b5d6dad83aa8845784e1d0cf9c73ce299d7414980565162037186498500002b7db2e729793262cd6640016b8bb270c5c6cbc441997eee50566e305c66d9aa575becc79cadf0b6e27bd5243a6300e346e58e81d927bb92207d9b5434141b4deb48f8b8d5597bf17d20b5ec5196134118325aca45114ab08a1080a1654906028062587490fffd72da5524b4b77975a30cba99144cff35848a3c98f36c32543ce8cebc84b29182afad1292afae6fe07573be7733a59ee34220d119c846db46ad87f7dc6abf4f8949da210f0d7797eb75aaeedaa116d62dff4111dfa280caefbfa072cbac8628b2dc3f102c7528e26f0d760172df899f98b452d8f1f484bf738327b232a99754654d7638070e76ff9224c5de089b3d73a1817ee8c949e7c6fd6c1a066505c8cf18e3bfc85f5750c74a28dd4a9b6ef506bc885780a3f0eaea9699d6a260e4274779fb1d7fa7d9162abdf39632b4e4a35ead756aaf558964d8242799e8947e36296e0ed775a70765ed6da2c3b5ae5db4462884318452a1b4c54ca50919eb544d234d831f23f4f16784dacc90289c27649afbef65b3d753859d2931f435f1c9cbf9f41b126dab4a965ef43fbab9dea77bb88629226557faa7003debaaf8b3c8a173155ab98ac269aac269aac269a2ca2c9ea265be0afc1997dff24c1d02de9dd26129a4433086727cb31d46b915421d45282049c45c4d982a924c6c8c99a4455cc255a930548661865b2b844130911914f24b56a9aa6b3c362b16e8c6102161887fe11d2d666d91ad8e6ef45ce007be9b2e7350e5e0a3dc0f265e07e0821e225014a61a525d7f871ca5e3b655d9d2e68d9fb9dcafb38d26be8f6da6b0f2604b605fd8025dab6f75a6bb3cc5a6bb34c6b7bedb5d6da5b6fbdd65a7bebadd7da39e73475a5d7ee40ed68b9b66e18c6418da966b55aad1a3bfe97aa551638b07286ca86bb8aa23a62450024aaaf590de49e6528ecf9670c5469058932f2513ee0f9a68c3d155514c6671763fe89d28b471ac8bac9aa819ac0ab6b7d5c3e8eef4c0e298d23f863a5b5d69ac5de41a30ccaa36a4889f2a19ae8a8644eb96cead0880000000043150000180c080542a160402c1c146bebf80114800b57743c7c663e17c9e39128ca811404310c649c318000428031c020648caa06004dd2a06a464ac8f09b600647f1e9e9cf64055dc0d0005d015b46ae3c67371f197713bfdfb05b2ae8649dbdee9ccd09355bd45384ce990d40c14f2679beddccf3ed39fa1bb737c67281451317d3abbea901d061bf32ffadfafe3347f1d7bf6b1d1a1bdf05678c7c1e17ee736d754aa5a0c15a3a0497f9b0a2b2d72ddda82fd93929405d8d25353d1180db27c74105ef11e97e799336f38e2badf413d28d66855ee92cf8a00d2e2be65863c0c3b95e1b9908e9304def6febdf7d0268ff86ceddca7bc0cb0112ceada910b5f2797d35a2c51f129a87d83b9fa422f51e53a732f314a7ffc2db517feb7459b8da100b46486a4a0f3df000ed9efa7f6c2e8ed278f8e5df97d249eb5df9b0ef8b80af8b500d07efda5bcde292b770f5ae6cec9733567c274371df7bd82654bdbb7c739bf334dc09bf1f510cafaa66d7593c681ceed6e9b78d2829e340def324bdd3022593f0c038759d8532726532a153afd8b1ace34db2492e261623740911a6bf8ef00820db976356254a9becf54ddee116ba29c4ea3ecae9113a78fb249279b9d5c11905bc82b4f10160ed164ea04e48e183ea6e78c9a83f040bd8526ba894b92e2da274b92becf0088e7cff7802a8cc4db884181da2e48c863957ae3a52eeceec8ac33376733c68ba646adf64753c97bfc49690f22904876a6bcad3e01dd26c5b709b538df215eb30902e827d47e9cbdddf109bab7b25ff7bbd5cb5af2652bd9359fee57abd9a62bb65accf31be6a7ab3c06c6478cd078e81e3df635f7c72cfc0bb264defbfb403c41594d4205752b84f5297155f0b400e79403b017d8ffb0d5c228c2a7edee8e180508c9d875148f449b61f08815171554b1668cf80596f6b01398a4ee8d2f3d7993981ee27266494aed7801e07bfc4110a2a5cebf896c5185b82a0016919e01e650205e6980edbb1e04e0b6357125ee147831d4f2948025838fe399430ee86dfa4d345d0eac3c51eeb291d8f7baf47515f80b7324e16e9667c420804a3734b1c7859e505858addc6748cf239124b9771d464f56835d630239cfd6688cb9321266d31206041b986a3eab11dca8cdd8963f5d23a60738cfd50b0573dc8a9d0358f35880f35b50a87cc1c27f1e7f9a9fd84c406555e86d029569d5935c865baa0e1fb9690f431248c7449dc2bd5c7bf6ec921b45e7f4c9b2caf1b9917a53318db3469535018233cc54d51a66c07c9c7f1e75159c5e39ebea7bfe67539c8c6ffb6435f0c73f5eafc7ba5e3703fdaa8383670cf9f2daced5da8b39d2915e4f7a233b8e7217f2523063bb659d9348c408372b815e7b3ffe48b405166fb9fd6f636aec7feab6249a73527e2e230b3614b2c693ae22623cc8a4f4a109e21d9712e4488b3c36db2f7e70bb1fb1f90c2c5f87645097029352ec94867fb3244c7805a2c36ea410816e299ddf6922594964ca6810ee2aff7176279c50360422f91b0a5563c7933c7d9e6a12e8398c6a7efda93962ad7d305053aa413c354769b668762fc532f89e95413d65ab9aa7f5d5b14a75786677e32894bf169f98645f531df36c534a9c259990ad0cfaa2f29041414d2fc90f26e44455c4201ab8c3f7057120b1e216add59e1f33306448298fbeb39d1fbde3876d5b2a60fa447c1b0a65da9f2aa38ad5066a015759013236c2f162a7a6835851d8ad0f47c670327056ec36ec8e1ff095fb9ab11c0265dff2765ca5a6a2f858a37a660d7f55c5fb42a3a0ef8463ea5e6ecf66b68e2d1e3e60615180b89805f7589cb15d04026f8d1b7e727ae579c690022ba6e0525017e3ebf07c4afcef3ee0c9576b91e6ed0a93a0e3f8e423971c29d66fbae4a09bdd28fe6d1b6494381dbc414056c32add70a552694337a7b48536311f24dc35bf6226f2f03a148e5f325e218f166847a913f7a2f9626bae819a6b3077c914e26f6eeba0b4c5d1e3ae25cb91ec1a431cfb1683304d1c5049aaac9ad047f359d2f52268a3e5c41e3e206790bbbf70ccc01af1dd4f58452ad6c2ee73191090d0d6de3c59da18a11e84bcbcd27c6249a07360b18acffc0b58cb4f14bc343a82da3426b3fc9ef0aee02067aa2e07be3d47767c588882fae8b1047c2520258bb3df6c48a51c6de904a3e335afbec94b96e7b174848d01236a07505111b1c0fb5dc9e161e9c9220ede0852bd773968905abf80265f368f3b9ebe813cd3bb5a721308035993e3ee246ca5c7d76197feb5f771bc0e74dcac982ca1dfcd8e5c05cf9325a2308edca7a37d7150a6b359b0f84935b05f9a43646c9130db850e8b1ba19f23283b8f6ea3e408560a3a252c935f1ccc578f692b468bef7df18d3575432603b07a6ff962f03e1a8339b8c8cbb0e24eb6761bb2d23302bef047e1774cb33aac4ea3d29b69ac59c739c75768302ff62e69a4447b4699adf6934b873f80ec9d035e8f723125ab7b47c793d97ef4850cfa82f6cee595a2b39e58b61660c429ac75babeb776ad129469b06e824e119a686c08626c4c4f1cc1f4a9410127bd55f9913c26e2ca2a596e82c39f71c102dbc55b96bfdea1c2026bbda5af917afe8d2aceab72b1e4a209ba130b5ec65090745e3d5e66dcb9038ebec4162607b859f6d4f287259beab3f1c770b928e0fe9bf75e871502083db3555af6377ba243786fb5bb47facec39bccc74044ff29e6aba91e31572ca5d72ea4fcd148712eb7a74b793464e40a25971ee6029f569528646d83ff0e7ea1806f0000c8f3483ce2890c772d68885d8f10be6644eb2c0f3e2333d444438789f51cb444ca441f15d5872aa2122bffd65bda15ed204adc0ff8141dbb65648a9f59269fa11b7893cbb4fd40f400473c033550d138c13790781a5b17867941dd7258dfc31b550f514a742cc36235c6386715426f6f13dd82e68232bc6dbe8815683326baa3dc18d01deb0987b7d4920b366f53ad6661a6eb001632bd525455678c5046d03eecd3a85197cda8a9fbb1888718e191bc130a7c110a64b48920bba234842486ec5a592ed9e7788c25f877c9a95f336148a180aa0108ff36c2faaadf00b83f83b9625c096a9c12f6c098b0653991f5edb76fdbf2f5c4dddf9db6f170e7dcd3beb674c195f9ff7f993cc24d286b4eafabe90b5c80b2c66ca371640d969f544de58bcc0a499c5a6e60a908131fe08f3485408db87b90281787190a5faaaa234d5c5d90453515f5d5787a21ea00f5aada7a4b828aaa9a08f335f110ff80046489e26aa7564365d6853119dc7cac47386fa73d2a82c2e92806ae20697fd527d85229c17d458154f0f2d5a4ec292b5a546bc8dce030832069df8fd0ba412691fd9de1f5bbd4a896952409ee8048250747a1f0f13fbb3bb534d4c6c31c6a4f11a484535f75aa999c52983f8ca3cb9210c2edf27323793d4964ea3c69e0790e5aeb36360111f37f7c59df5ef35eb0dc350232f9b56486c8f5698b989eefa13897f35f8af273e5e3ba76e97017cad68c8588eb615c3de6cb878626a9d623f5ddfb3cab2029fc49d0cab7cf1f92aff1ea4951f92295ea31dec8b159d15bdf23b0a2dff98aaa749a319c9fe8c75e28152ac5bbbcc008aaae2e9a49a7f88e3748de35981402bf17b2e9566ecdfe90daef8d859a1557c0038205e1ddb509ad644fdce43a8c16bdb6cf07ad115a2ff7df061b32f44ec18ae171150bc797f97b637464bcc1c0f5cd6a0ad89f17eaff800ce6d62f6db30613593412765074804e20ba0f3693b755b0ee2a34b4f0ec3f15188530bd6caed46be020340003b8b09f254ad3cf149c31171ef685971db3dd13219dcb1142e3b2885285194cb1fa8e8f1ea1c28fcd90388029afbf7daff210c4d977b1a93aa31b05ddb3663c1c57eabb247d734c6e8c36e542ab26f53bbb07e180416f7081809509bf119313c49bc8d1ec5b2127f709e524d32d9802b862832bac21e69705b74c62e1675ca2493064e9807f7d11bc8d354ebe8e872a69ef59839b88a78bbf9713de070c73394c2be95577ae90643565d5d4cb8cd7d62b460739b56d079fbf74fb88b1e5ba5d816095a7f8c9c835f7a9996ece9f007af1d8e987c3cffe987dc4bb6ce996f10178a53fb411bb3b84110ed9f218c9a710ebc500518953d2ee39f4ad5e55a8a8b3b03ab65ec708894939a71e938b5dede6cbc285bd8f3ed545f55a32d5a0c777beac0adc2005360e4a64539682fea539b434becbf22523d5f93e96280952f0061af012401d306375f2487f9e5d5ff0d08d95b1510ed7a54fb857f45cf1b7088e903e6da0800cf22c91aebad16ea57a72e0d5801fd8ea9ab97eee9dbc29589d719042981497179835fdbedda8d48f3555736eda9e9835ca459e76045231a40a12987f178f2604742739a9612eef280cd88001437fcf38386240a3653e6aafa36690195e64a8b1769d19030d5490ec2064d0d568221398b2318ae8e0ba7e08676ca7767840c4b997ea038a5c3db2c8226a0fa74f1c143bbd4dc7c985c9eb105acb599d53d8e5714fd7d8663e4f7d293dd77489526a0c51c92aa2d48d5c95994f06704a7494865bdd30137219d6f3e142128c614bb5250a1a6e978c9a17f0a791cc2146c98e2faae696a3368da673ace54b5c14c3a64b71b8b37b25b1f095f5f873fbd8b4f5baafead88a6ef90e121bd0f385ab5c3afd1f1c17989951ba516865334ae31d48fa0bc0fd46522386f32b095a331ce9bf0d86195cf01e198e0cf3048a8e5ad105d982aa35dd5653c17e3d765181fb9e2cb3a48023a7ff4494d16272190ab8d70f9f3a817f5bb5fa3de8402ae6fbfaeb169096a176abaa247fadcce0b0b9156525f1ed9f3be7f6965ec41eecbd725fef8517b578c0f3dd85d51fe9c630013a1403eaada46add7cb00231a3a5c14bab5ef56fa0b1615d0a40af6f8b2571f7d6d3992d98dfbe23a9fa1688e65b0ee567360376ec7af76e3638f78050f5e5c339b807677fff8b11e5781040f929c28a8bd7a0c7868eb91810686503f12b20d4eae34ddc146ec590d9587858d61a0d918355cbab462ba1b6542bd3733e488113e11b1ff7b78d9b2c6ec2e79c70c86c945e6b147cca3f02ca27e107f6fe07840c5dfa0d9c077a8b0eb2df7b464efd00fddfa9e8e6f3927c7323beb1b59693297b13e96744679ac3a5f643ebd0917e03f2760f800f410b1f62b3bd0fa93342694d9cd2024d9c58bf88b44b695270246b550ff1633b88714d116e299f72488e0c2e820cd760b16e813849a2dee3c91ed8e63000968880f92190ad3cd21629d69d6b7281ac531cd0773d6f8fe305a863d686460c614cdfa869a6dbaae3fb213d0890c734c12918f1f191e35d18cc47f7181233695f77243ea5f58d849f85351d8601c02c151470fe4c24d36ae0879c261b1cd69f24160076a3fd27ae22c85c4666adf4eb92064ac21438a322c9187babe0b104194459991b32f31399726c70ad4ff843347725d4820e9e4c3e44233c125758d197b42f6ad570b031ed1edd5ee5f0066a858331d860d11d6adaf418fbca53cd006f764db1efa64df86d9d7df518e87dfb9aee4ef26df801b51de6f5496bd3e38f97e33a8526118e43412921d8057dd88e6bc605bfa8fe57f9cc7867c87cfb769379af05b3a6d647a90b79f226b295fdcc81748b58fcc3365afe84653c3e3ffc2e9c2bb83e9cd087ad2d176e902a182a7c272affe8427ba5a3f65ceee1fffffd99c5816f08aa09daeec8e04fe38bcec1b767f9e76705b4f2be162eac1d9eadb3bf79f4747d894a4835a60200f7e0c2089f82e4ad143e1b1b35bf8869489155922e0105ef09874500457c8cf9aac27362726f50303a973d6ca5ce130e5a736f687c0c8eff5762805d74d684f1fed297676c40fe4eea725d6557febfad6132dcd2f5131a30ae836778013a945b204111a591403ef441104b21658efef2783b63a97f9ee956a83a2b4e05d121b6cb2a51df89c9c30175b5c381a80701b3cd4c132eff21896186b3febc11408e175097e868d7ce77de2e6de1d65e9015da6147a720a6f81ffa1fbf46940005439e151a07c69d91524a8ff811d80da68781d519e84a938aa5dd00aad1e705f0767b7a519cdbbca23f5f1a998b5f52dd10b09e682d37e63c9525b90d694902535d1183f36b769e076488e35f71d1707c2976b136a73857546ebbd134e498028d52a4c550ad0a716c42afb2056181dba661b8970146e7e9279f5011e3f902817209825f4565ebd96efebd7e9f7881172623bf3c8b3e2fb67055c59fd90083f5fd83e9af4af3b9e87e6466d0e791cd85de941bfb0d3772b29fbe1fc53da8854bb519eb723523d46f9502252afc0b7808f949e0865daa16414d9bfd16ef7a950dad30a900c6a11d0a3a6de023d8f9516ee95450e64f697675dd63e77573b87c34d3e3ee32555414ee2fb1bf2876d72492bc33b50fdd353efe9259faddddac930f0f31c8c40f485eaf26b796b5775cb699cd82937cc38853bb28873e7b6ee9212b056aafa409d3d1b2d20049eee5eb2e5912f155e0de8bbecd2cacb3a5c8d54546edaced48803735b43318771a2e0fee4a6e5417d58e5abd7009080f3a3a71cf4114ff81da1dd43382f105ed70c94140912e6148c10b62a7bdff0eb7d75a4ca2b1827ee23178ee0532b5b253d72e5547c1b91bcfca995d43f84a4b6411ebebcbfe3ad64ab52da6bd1d469521eddfb2453f599aad88e446fe26ca575c705aa5560a5a68cadee9aaeadefe1e27b49a9b4c91d54aeeebd899b9d36a6b064ebc70f3a39dc5b8d432c883013a7d242d0970bf026509f98e6e4b61e154b35ab4d9bd4afbc780801da8aa61bcb56e4272d5dd6955c468b244e553b3c8db807be55b6b795f33168f11bbbf0a6c26dab56a7ba82edb7a3d10371d05c45b6162b28ecc0bab78e732865c683399d451d2eaaf402587ed92d2b0b184e4dcf02e6d9f5ec53da8129d6ee8ede12ee17ec71254293e65ab31771f3ecc0cdc037ec41ca24bae3f4a071c2847f8b827705aabdca581ccb608778ad1a0771059763af6e9e133d21040c27059c7af7f025a5362cc390eaecb3ca5dd649e2ade2eec6eb0ab207f86d880543cb179baf3c7a15bd3d33fbfa6bf2e278ee87ab9c9af06bd54e218e081ed46a0941a19b700a9aeceb4f304bf7fa16e3cd26f71abf8295e2aea2fe3801e749625e5ec94e6986b9342881edf289e3d23bce2939e6d9b8ce55bcaedca0ad487023ac05d836f956091f8e2406039fc69fc23a19f1d9d12ade15fc0af48e88f4f85dccf79f4568f62d379de52140ca69f5467d98badb363288b1bebfd42013a35c392ddfced735c9cfb4ce93c9071c934741797b73faa6bbd48d98c44bf5ef09f026a8c9a2090ca9cc1ec2847f5f40b9bcfc35ec9386cd9cf997d742593736f3b0810a74825b205be90eb6a399563fb608ff8b6653ffd5ea8cd7bd4c72d027d7685c3c108d4a3e1c7895955bfc98ab1744f106ec7d1626ec75b2fabf0e5febca3fad46003aa4394e98d1a88836b6141b321dd59143078a662bc6a37e38f080570cc5f340002e32448640070e8c74268831a8bbc8877b23000ee3afb3e142833f5fa4d16624f4de1e20111d782ede2c7fca8d08699cefff001e439e5b9dd7e57c596e2d3771f8d3d08a205b95e415662f86885d38f648339c920cf5b5f452ecd3424aebed66bdb856edbff4f398aaa39deb4c92976a826f8bcc4ffa6dd4384fe1bcc28a07f8cb3fe5725fe283a853944a52db6cdab26e07e0a6e33064cd4c2a0096e776a92009c91335161c7c1cf1a1856e91a4b1b5b26775adb4ae1b829f1966aeff7113b693e3a8f21448f4b2776ad9a1ae92c2a3ff75f704747b9a14ac0bf6ea3f998edff902215cd816d2a3e921ac9a465747645a3655dc0df91788f3189514d344c7a6c6c889653ac8bb9bc8412634d5537d2de3048844e326126c1bef4666fb683e50902075257c86213b36a8714e66023ce93249012d0bee5560a2f9f54a5dd8a275209ff06d042f1f208b7019fb004ead3381605040e19837917c633abf5cf31f661aaefa2500b06d62e68db36400a755c95b5a38f9795683478049632eb6afb1b52084c4cf61088b8c5513025be5601b11042afae5a4bdfb3c9a11d046868b107917c54a1f0859ff17829ce15d72a16563d1bc4b04b9875508730987dfb286d012d85c2b9962baa776b2819739d3f583e73b35cfa93f09a5bb2425b393259b109fe9e171c9c828f7b85e276733738b6db9c850e4fe20eb8c5294ea13298a9bc0b535b571487812c23a9fbcb2d224c6bc4fa790446ec6a33b8a25e18df9dbcef69f4c6c6f7151997b23fd5e8cb7696f9ff06e0fa2b476e98d929ad5b1d358a26f407a57a8aca3fb08273b7cfdca688c0f789c38175d18956dee9837d7d4ea3a06d427dd6129ef198ceeb0e51ec96c69c1a1e91349878d264f8217f2b11616620112b83983f915bbf6fa2640bf86c9971c6f485f33f5f9a7b39c9adedd2cb083e68eaa1ad3c83bf3ba70e268f5cd48b329c48d2be9b7be96533c5dc47a948c17b0cc318e4370182032580474de18ea4d21162bb20cc1ef62c41660f3040bd5c9253ac5c8e1a82d64d93522de0ff1acdc9ca41f03b3b41fd2f660779a9b8a9e86909dc9d5857e718227765ab0d205100ff3ace0ffcf7cfbabaa7cef6dede322f06deceb08aee6d38eddcf9fd1ad0ef293e6a666fc1fcffa555d4bd7933039671026363286f0ea20177a2a851c52bc13e3eec3fa7b05472dde8c5a664edca0c24facac9d9db29a495ed6885a8d05843a601d2b8f63068c2520ff320033abb0f340563580ae4ba29127e91691ba22eee76dd3c5517650dcc7ee7daa33aa397c55b076f4510d20c6c3d2b4e8003bfd862f00c5c96ed5887f23fd734b1b1e8d69d3fdf3fe5cd7a9a53ed95db2defa8120351cb688aeb33abbac7bcbbfa5c7aca98a71f629377c0038a8455b1f89759ea50bbb997311e4b130c1cf04fb3de6900e106da97927221a01b7c94c90dd14407463d71f0a2203f6f99f2a5eafd6d50cd8e14200b02ef6e06f4dba3b233a6d3030208b2cf737eec5f8850d5182f50de479e505656c8b74b8034e9825d7748416305d8c8cf64561685bc16d9e52433d516234605d2700bc0db195e32650e9e577d1470a0c7a0452378f6ad5ba38aec20c905b92a6ac1cd889483fe41db91d942b644962db78373b5f9a86bfd031029989290cae2e64f6783f03da25d443f33c7c485012c7d2100824cf1a9d28b0f8bf7eb4288585410105d4f7cdb0794579f8df857b2814b42af899df02ac810106dd8b8f082f6461dc248450430fc63568aece2ba3cbb97d81421eb70954832a906914190a9d6443f3894219002cadf916349bfe82322fbaa8fb9ff3b7978c33ce83922ca6e0b13102822dd143c9c2ba39767070a84cd296fb1cac419f9a66868037a923282f3edba1b09ea537ca6c0bf279629f3b09fc3170b60b22f815037e3d92f0f3b60b42bedb77be6a62ce86a30ad0032f18b753cc435e3192cc58013d32018d916f9be95e217e4e5eaee3b2317ad0f57c21a55c3dc61dc504d8e9d4479012fd13fcc4a065edc4f4686cdac304919554cc7859abb829a3c76536786fa7711b2bba80b5a00217d8aa3443bfd9dc20a75df4119661629865c60ae2bb51b460ede131b090b46e6362de4bdc0b70f34298b0f1e202508029c168c38016d6001f584c052eb836e399df6aa2ddc6d5989834fd705937ebe7806103d7003c85d23295a80feb7c7c03b5d9b286d316ed401af8cd04df45caade506f9771380a2c78f8244692a31dca92107a78a5a0a1980bfc17cd1e3131acfe52baa41191a4cb69ee196f1e680e56d34b6526adff5d4ac13f73804791a3da1e36bdffc4435ff6d434e410cb304832495ca95d4bfe1e229f4f36388a9f27a250fe3603353dd753c38172c03cef3c7e8af045b6513722f30f6073e21c2293200c80b3ad4346e8ac3901100709a322f2bb079ab2bbfb04590eb6d0ee0a555f6641b1dacd1c5828492f1b5219c631746e75cd8bdf533a61c1c319b97f5a616516c5bc186b671f368eb75fd2353b49ac7ff4234d69b7829c1f9cf626e2064378c4bfb671f224345113339170547eafde6a4d91433b77e1ac23cbb16712a2ef9373a8ab60d98fa4c265cf0cea223e1bea108bc3660f7c2af40bf572b1604d274f3865f0976f8f96c9b8cc569ffcf9b4e7642c52fbb56fa1b763efdc1cd9f9227a07400c084c7ec150d1c04cb7b1cb3dafd680ad3e418451fb0f722a04568b4399ff97211d9fa5016f6c41ff01f5adcb8c5d72053acf88bf02952ee444403682a64eec16ce67430aee053fbdbf501cb28a2a189df4a94b7845c1d5ebab45bd440355a5c907cde115c18fd7a64cf0c50a9ce144f4dc5a08b89594793d6ae8a2bef6dcde0362105aa9bad105153b72d4292b33d820e81d565e6da5dbe975ae1a6b31c6c142c86cafaa3c3cd1d366491354159b6538caa0f2a7b1c317db711635058efb7716d846ddb9705d79d01204ec8a1cb6e5122461bd2ef429022df2b7273df2338ff80819f9776ea6ab6eab50e897ffd7f3dee56507fca2c693ad66a1eddbfb47a56c22c3b629a6bffb4c88fcd31d7e2e9633f23ff4a53d13ed6a6a63625f191a583c8d2162f2b45353913c9f748c605f7ca7e5c854432b16593835f80aec9017c013d529b444af2e23d582301996a3fcc42e9472452ee77e2617181dca840fb884cb61340510e43b77325904df848a69840096529944ae7a06288fbf206a14facc26775855b5ab4d682101cff7a9db1aa0972bf779d91559d30f8fc29dfd709ad0551b6fdfa912609ed894efe7018db24b26d00e824dd9d6b92ebfb38665569775ea3f8b3d6654ef519d895549ca365acaeb39bb778c98303fcbb2fc44f3106c350d14f9eefe9678c5c52f0776592b4746007731a62c75470dfa699cbbaee0ab16ce37fb107035ce48d81b0929c813bf24ff0afdc17be465cf4b5370400d26cc3e7c0617d5a83a1e12259ce7bf4550370be0528a6a6866d81dbfa1280862c0d74641b0fcd9a5690dda6596c68b0fabd5e99213b109425f058a87a15940c92cf7095e09a62fa7916e59506e9078b5c62549e3cba72f5e2a03c6289707654add41eb2e03f5a9a6d786c00c951ccf4b2506632fec15590f627dc605f27105c54e302a1023a011db2b4c7de63da00327d36067385f111733d0ea9975164ae0b0fe196183e1ea30e8a9daea57ef66fd3cc77c6e633c4b6dc139f40302339fe4ff07312deeb63dd1adc93256e8c728933ca12b9a77111965399945f7751d8827f10be763f17818d74843b813256da187793a9a68889f2e3e6efb237078cfee086faa4c396b7ad1f69aefb79b1f7f7ef6c75b9a8965978e568ae67c66e5ef66c62385e1a3455da981cf0483555fb83278205f55afa1a6f625647baddd564b381cd140d0a1cc436582364737103024b580624ad1c66d093c145a0001e5f47f1ef22aac9bf6b4be3540353b074ee16672111829c5b8daea813de19d7efa3a2a81976c02480b9621f4315d20853d3f64041c1322344ab6f008de80c11568130ddd251d6831455625c13d05052c1dfc0551cd5560940c0c61bc4bf88c73a8cc4141168421d893a8e3ba6a49b867df1800506f6685d15f4a22a3055e7497c7e18ac8e05bc7f70774b7411d88f09ab3714fdb2eabac238acf529c15cddc6b1ef3b39ddcf8fbf9683a65656b921e2f8e20cdf863eaf12a096f354607495dff4d8069bb418cd4150028e9398635f3d4ae66ff9af8428149dce220d2ba3cf1f7f1f4e01270baa77f5673d52335664edff836b7532d0fde8be4a1066655f7cc96884a0c7f517fb44ffd67d510a0e922bac172a263ea0b48ec084dd27f7580297e57d7f596a7017182ac8650f90a74b72f89243bfdcd9112a2e11d15ba1d197cf49cfa0bbcf1e1dbc03156dcb4fb6067e576682eaec20012ccd111f76642c58f5255a4cced8ebf199d5e243855063f67b9b6a9bf7d4b6f355fa945ac540da0799272b0ececfde2b18b046d520547e5965e9e39205bda9ba145167ad50d364212d035041392f0686911d3ba2552191b723f703e65513c62b001bff21d64b2cf1e16de42d13b9c07460e4ca6f9b2aaaf05d81a7552af56a0e9eaa9314bed95292e7bab447a819f5b3439fedcb6d37a203e4e9c0d9ece9517bd0bf4040f79629069ed7b1dc7a993d99e2bb872a303e0f7afc0310958d5d089df8e959b97097042d570a3e092c3d6bf6100667ba8452d545cd6b3164fe8065650c58345c11e0a2de4757aff9842445470f5ed709a4a3b1d99ee4f47cd6583bbecd41fa80bde86c6e14039cca2d87915a2117a5de6a3e6e8179a13ad1179fe5fd88102d881d6f2a10f360d674645ea2c4ca954d1edaa41375e60c1c2863d0a05d6ef1b9244b518438fde75b40d3453e5da353882e4c667faa60d562285a3a72f30fc05d489aae5074d7f350284261c9cbcdaebf0b61c47bddf449650ce2e4544d0e55c96236ea6e26563643fdae0b6bfc3bac15b8eb37f2298768df9d23c1f4853a5a1712cd1beea656b7da5daef91226ce2aa52187ca5553ba6fb1dfcd2a5ef44a149eb874898cb39f8a56c5e13a5ee94a850aadcf8aa094bd4eee4d0b74d70f25c445c70284cc6375a3a0169eba27b46585030836d6170fe8b4d8fd8dd5284a75855a198327350088ef894ef5d90f0c3426298d4dc1b2b7f114505784c0631255f2cd1fb7b8fb32209abe8cc642274dfedf1262b20e129c716a234785757afb529a6f561eaf202af0f10bb7f88868375ca2fbda0252a8cf13dad4b0f0cafe0cb0cee9208f750b3dc8103275c1db7caa8bed8026f20f8de8c7e7c8bdb50b551281778ccc01d708a8bd9f5c72f62e815f121e4454bf30b184421d31e28e3c0ed10f146dd6a70cc4859754f83cd55ec34b286bba8e98f94a67549db8f0418b765753f7670a2775c2e7e41318fa1b20d676e0508cf8d2f0db563bad00f481a4ce43aa4e9ba6953addc720f3a0c2b98d7ba36c8bf7e1b42c468f3948f65b3e4cc1b644aa4ecf5804fda4cb6c7cc5e3b0f2ee02aa0db1c2735e09fe8d2551a9537319024f8f9d4a412e05e1618e1189b48a93f135124af51155a0333f420d27bea83b91cdb66de713925ee59e94e3833552645e98d8acfca69b667ae5705717539ba57b97092c5097eb93066f1cbc06b5576f93e1f77417d857f9ae4103934c50c62bbb47a4e0a7016e9d1c32cb827b017c3e8b1edcc3bac70f18b2e57dc59813603a5739b41e0f3b2f449f126d2326039f3bd3cd9970ed187fd840590a801d1639857add946812ef1eaa7520ca96c021420d86322c0aa644a348cd99f1d72cb55dccf0ba8862fc3cb9d091190174c325e125dac814f8454869d3775de5be67fe240827941b6ed940e5b06591f8454b12958847ff006a5b0cdb500cf8bec001501570678f36a200fdfbbacd3c00043f76b2373a8aa20bf88a6faa071b49021370826b27cc2e801f6df891d831ab1085ee62440cab8e0b934fedf845a7961e836a9b8f7dfdb0c20e17cf94d76c3acd04f45097239fdf5fea24128543d727746bc6407c498f4e6dc327770eaf237ec295a0efb3ad1d91b4db19f2a1673128b21b5fae0e48149ccea05bc33ce60694f9684569d0d9ceda8439f031386e88392905878bfd86b34b6410b4d88728ec4a7b4dba91d043affd12da9687b2f1e71061cbf85c9f6c211806bd39a5dd14a298cca97d8e89623c4a41d826ea7aa7dd08082711c2b41c549fe7af7f47127a428a279b9ade201794a580fd194786f1f06cad0977098707bf61025ce50d0d5de470e49c6a98f44ab4405e6bcfd7570dbec63f6907163bd77bb8aa4623969f9661c85bc1f114b2df4c7bc5d5844560f0da14325da1eed40957a797fd0e6b0442d2aaa7ec191976c11f932ff372579f998f9164ee5d2ff76a7c30e79188694f1f53e25919d142a8449c750167a3e646c9d631766b1b336648de2ece8a712e6a00051db64920a8904a352b73c11464f22442877503185991efcee7564b15e8ecf68298cbf02d5c2f4c6b1c0d958bb8216f1e6633485a904e66ec6830c5049c9919348fc33336a59e87f1d4d51319c9290d66c385e0bd606865b1201737733f592e73d03fd71ebca766f867a5b33ca189012a08f8af3f6d803b8b23153bb90a14990d357c4a5f8b0c961b0d2dc223c9b0e16f71a82ab0de00851ac8e51be971635637c32b721157aed4575c49c4dc839245ff643025990612133a53acf955d61f7ab359e0e5c839b3510926f16bcfae67a534ae28375ddbe13620e873651c17d26df24247422a48a73e494b9846e403650d8a13f00a40cf20d98caac14c48d0bfe1ff95e40f12056a71e6e2581c30bf25cbf10cca90b9bf6cc4c754fd1a22675d722eca376646e8bf3b55e18f31ee4c49b3209827a6eca5e3caf8924ce01d27c9498f8a0d570c4eeeab33ee4538f92dba24cbae8987cfb64e14e01972dc00bd29b36671db32a7736c6f84aa468d0f920a754abf0b1b99582aa191e6f68a85f2bb0af552608be99d2087edb5124b69909db2ba4b50f6a6cc0e001a8f1754b04e6ab05e9824ceb865f1ca1179b54088c2a9c6dfc886afe1b8b984305ef608e2709f3a37821907f418e997ce09102c2dea35cca4e219b1ffe592d4ebedff81ed527a4c1e0be06358802c89c7d4d4d9984584ab245e66d8a528f13abe5b7989b7a579fa071b4fffe60f535ff8145c75f06a2b199aa0070188e6d015660d6237403a5949b5138f5a40471e7285b6e740fcf3e2c1c0c8aba77582738cfb24ef7bbaa1a9e191a936bb1c39454e35bdd86c33121ed25ff9f2c3eb38251a126cc3aaf51af0f5c603469d43ac8b91a70d72d550748f48bea76f73801c93338e105906f443337248a853f7be97ba0acaf06af8aea3c53afc4d5387ffdda2d4fcdb038930d4d67efd15e88052fd2abd6317b87e404ac0e23902b90001cec3a6c026e9619fd75433662283584f65ab7b567dc86872e8254cef30b30053c72bdd1302c6529088c558f33ff706c421168b830aec1d18d3fbc47391a556f271d0896f3a960319ea211c64c3b6836190b70667f866251fcbf18898754cac14c65787c92440303b0fd1179c3afc9a8361927c88092d23af0c71e95b805bcc9405016b28de38e77e61f049e98202fc651051a730e36cd9573f4443019e89fe01e6dc8ef8430b610d7e51fbeec6f7d3ed1f9c16eac93438454a5732585714af4ca3fdf117db3767671278bb8143d0f62da3e95a69ce10354d9e47c97f35c9d284bf12e0d833e20fc6702452cf8dfc8843f32d435ea2ec3fc0c4bcccfb262c46fa5022f1642a225b50b6e1b6c626d5ac0bad3bd7592d34cdec6980d38b65e2d32e12b28a3b81e249b2f9282d7a6b2cd90c8617e7adfd4f002f8c798f10065084fa5c9a9eec889acfda8159d0aa640e96269efc53a2878c258acda089208dc001c2e443a55a7ac3958469e719bd94cdc960c6ecfb6f6234c10406070aeb240e0960ed835d43a3e15b3d7bffa3051302ecfcb89e441284a33a4a27ee33769ad1b5cb33180546985a20631aa30a372bb5f7936bcb2c4fa609aa1d91db8e7b4f0dcf06bdd7aa337139392834cd5f23d0f2ac5d6aedf588434fdd32538f87de0f107667b6388c8fbe6440320061c6a6851dd90c84bffc97270a1a06eb6e07fa6515fc03efb185e281ef57d1f25c488bbc1550a075f1ff627464bbac235588713b2922708b7c662bb5788d060223299722932e8b066e8757870f6a16896b8c05a7425702c342c55c8c30d072888fe7be6778b73305a33601bdcc855782f2ccb1c650e15b30f71c84ec5e21680cc119dba0b11508d0728c45909e895c65b16056d317ab6bf6415a72773274805d7fa4e6b0bdbd7ee9a92acaa7b0ca14d8a10f94d12df822032d42d67422fac335d6c7fab3e8222c85be84e9d00284689278cdb69c1fec294c7d1635d8ec130645fb6e4a8a37892cc5c7a7e8148b20c5863a68f8a33899aaac16a3cf34e8258570efb9c5c4ee8a4893c7964d9a098f987c91755070cf8918b87453c7e003058412d951e37808dbbb2e3cfa21ee690a75a8b8783d5bee187dba7df21c334c7dddf4d67fad78d300bffb86acdf419339a4d0be203c09649c4caa2cb47b55e64533b70bb8f3c386aaaabd9496d60149d1ffeaa018e373ab5889b572bb21d9c3d02f8008a405713d986bd9c88a4813cf1f7bdeb4797883668f45a2b967f882ada3cf63d11e243de0fae0cb705173150a557b2a4bd8f64f87a8efa5fb576cf8da4c4513567227897478fa5b2ea2918fa1eb74c37d75dec6c8412f3d743d7a17829098d3b7fa144f22d78dd3f73f262bed3ed4662ea9f22adf92bad261da6b68534840f9737828260efb4524b0df8f72adfa2112f0dff69ae7fb8cf98e99d2be0b3a18e72c44bea09715ce8c56f860321db4e7c82bf31d42123c06f882342f7da76354f44b45ce0c30c8e1efad22c45b74a5c60395d437ffc393ad44dcc037073a3a9179b400ea8d6c32b7bde6c37ba8c47b9f33e370103713b9da86e74d08e393120486ebd7e7b1d7b0eb97fbbe89f617111d7b0dc1fd946a4471ee796f54c502bf275443b090bf02e5cedf377d8888e5b85111d1ffa0225eeaad6487df9801f5d3fe23b09c012c72d58e1c5610f7a38af239eff3e1dfa1311b2a660c0dc070b02706ecd164081f93eedd938ceb07d080530f758eb64504e0e772c98c41562a8474a37e40436d62b7ecd7b381bc64543325d3d24da60a589c5a6c1e06773d983fd2f161093aa39e6cae0772e2cbe4722f37cad2c05628b05c164b9c693e99aaafdbe926d3a0f88ea2d7c5c8b01463a6da8672ddfc780056811a36b64509a0bcc8533c6adba2a000255448613f43bf51d3097de6a345c366415fe344e2d16758c99c3f4774bcd63f35b090cb03dd6eeb0002819bbb179c9ef7a2cbe69aaf8285001b65db48556619f137c8eaa4ccd997d667b5cfd5730de0eba33448ffe827e853c55c58a3cca15b9c53ae4e450ec488adc0128aa0b5810cc58022d7c9cfe160e19817234a5894f02026709283d46aae1af320fc567451b1b9c79f82016c8ece28dce24777901ccbb41a18d377565e5e96ad20feaf32f75a03e8933500e775b3284245c6409e3e5f5c74498e864e862b231a20c013e253f70e7e27f8d35ebf78109f42d27a608162b9e960ade4155d4ac9cabfe3408a259cd515c2fddbb4b021b1dc17c5cdf4b68a3f6547dcf9548e3e3f825aa1c7d481ada9bc963dff51f1a588ec99c5dc20a4914e3a916c0d38bfa89091f9d0b2d5d077e60a3d5a54aaec8c2d3adb39aa2437ac1a994ad2304a6eb4f4bd5dc7c44443ef3494b36d73f17f459470ac137c9c09f3ad44f0252d4cf197dd92f9d93292e55a27d1bf76636568b4d86daabcca91fcb642681421809edb9b110ed68d19f5c884b090102209b65e9855c2cdf41ccd4258dff97aded92e06b981572c5b65dcd8cb9124c8959584438ac410f263edfe476f3e48acc9b76f7ed58cbdd97f656957a0a11c676ced3430001eafa0b40061181a190ebc885b684be765824a3b3f59e08bea1c981fa5ba7840d403cd1103b50c5de351f00bc22243a6559ad5e7cb865bd442babb3a502de025cb52cdd7993a85a99e03a196430504bd809386d86f67ae0640530b1c3945cbbff3a54b1623e420ed81647f1ac1633e2fb5a0ad2dc05994df303ab088cb23ad78b3866c647435b3fc9f96ce4533e459d4e0b3a4a928703c827ff49f75714266e4c0ff3a055a6bae0e44b027bd84d1c0de3868d976436bad242e53365b8bd40a2da6392d6de104e7f2455787ac51da9e3611838b638896d2a0498a415a00016b61f75770e79f41ccb710740ffe2216d25de6fca690335c9800bda325732cc95abb4775c8da6dd216a7256de90f7d482d0f5c701eb2b8bb3bfd7c6537e8965546a358b7d494de07d405c66861d99b03db635fb4ba276719ad501db21271c2e300e7f6f884606934cbf7d4d54bd59b7e7d19b47549ce2ee5017ef1126bf2a230bd7ca66a3fa3c4083f92937b587276aaa96654a86ae6b05ab1f4d066985a6fed95def7b6335f212401c7252f3b1eed4a6f9cf8e7f3c8b94e8307daf1719dafbd49ea46e1b91ea6cf00307cde3fe2a3beb4a85e1bde585364130b07a83e4abfa1856f3a710586c2384bd9e3bf3284ed6e293b5f35f9c014a935ba790e04f99cbecb2fef6bde470bf007a366fa0bf9c6bfc28a45c452c8889bcf55507a01abcd30a1bd6acf935b63828edfff8a3f8d20607fafce0623cf7b547cb1047dfecaad6de1f0a8524279f02a6a5e06d23ba80436fd83f733732602fa0a0580c04dd3207017d559665ef8274b1b1e3a44cfdf0161c4cd23b7fefb6a64f0dc54e5e1809c09827e9d56b63d0a4eff9291ebd378dc171ebde8be5e6dda2ff5312185c82dc504ee51fc96010c3a388a80ba74594777752c100ecc28fbf702e9c04cbede03f3f78a29f872dc9e71d4f85335c7bdc059064af9da61d82b0c3c862183c59885bdded2af491a8fa6988f3ebfc5de7d12766046657b4dc3bb8ef7a48488458d31c5089fdd026f1f7b3548201a477f7a65071f6f150a0c092d951480c9d704ea95c598bb92b4d4b698a0b559445d20a4c4b63320986dedce8be1c4c3391b2650672e263843ddf45df89f89f89e43c9ea5790a65227224cac0fa9a958c02e0f7a7e45f64a8dc2cd67488cc9f4caf20201ab9ff7f648455739de0c830fcd50596fdad4e1781e5c2695ceb81e1cc9e0aa35f41940114298546258b6ad64e6232879d3b2d22a18b023c4e13761a206e7b992081a3174a82e6a71223f847958cc41bc1c59b2baf9195a49134a70a02c458605af7614500b03d8f49e021f2f51957e4f41844f2f4265209dbc18881278e80a1a0509f108f4ba355fb492bc125107498ad8f161590614dd0945d2d2af90fa067724117e4e0f1a8fe0d5baa159b73e53cd1cbd35b813bc0e5f1d75df226fc5928b60f0981e300cd85bbb1c9588485c82175232e24a9ca168c3b4cb425e45b482d7dc222f7717928552ec9b5dba2b3383ba5c9e6c64ceba8c6054461a0eb0b1f3b90d092d5ea852daf3f8cf7b04695e56c9bc052f94d4cd4edef6a24e77314a0eb1fb9eb37cf73ae1c44e3f29ca05ec4cf8f3b155c028d8d07370f5423cffc78f2306051bf753ca12532b99980234941196c6faf3084b37df659a7501b43285cc54561f8b3b8295f8b8d49aab879670a1b432cb6b517a2877eb507d1b78be05f066ff1024b9179ba599c13f2b9a79030cb123c1eb630f65c9d41c3468353cc46c75e6d10eb9f46d14c25186967195112c1f797e63a2d7b73f4eb23d4670ff8f2db9822496579712583f12c9204a90b15160371310a78c99661dbabce4225de4157e5e971473304efb8220f4830dc9eaf0544b16baf904e52bad4416ca8db79193f54f19c647da05724de926dd3d0bd7b428b5893c29cb5250cc433a10c77282363a6af7541b27df1b47029cf33a9da73865e2d2aa282db3cfdfdab1b776191381540cb19cf1cb34a957dc3bae0c89ddf329f2e805f6055272055c18e43dd1c6286212f0b1eee49a986d489185d1be79e093fe6016bff57d12f49838c80a5dc8040e82a309973a830c188664053a9710ae89187cfc8029e1c274c12c8c670a7c70205c28e6b83db3a3070a7ca7001f643e43896314f8805ea21644cce4eaf8d14eb41f8b4087546d8c566b3ee6c21707d99ec5b587ba25f091262d6da157f0c27f794682cd1344f30d6b6e20a50b2fb66170a90b90ca8dfb8b1115dac0bf029ce2cb82e71504f78c6379a6da98218fd779185482ce9e75e06394a40effc3bb5506a9161b2957e7ee55de90500bd6b41fa8b58cd5cb0610f798c984410e781a9558446151e60c073566bb8702642bbee81ee6642b12ec33e7d4eaf30c634accaf0c2f16a73f1729d83ded2b29cfe5dab6695f49215c2eed98f69580e7b2d2c7695f7d0914fa1486cf84edce1fc1380bbe0009580eb28a4d04be88a4f18b1a9facc7a88624c0dc0c07a82dd838cec862b2b9ee52038e0a5e8a92441f53a0b4eb7ee9ad06df437d5dcfe6d9eff5485c0589cc066e76ddc887523778b8c7f9e14bef3b1a14d52b5e10c4ec812646d28e6d7298efc6f4a25351c9b756b20d5180a2d6be52434b4ae643620e0af5b2cdb988cc86cddee311021a754b253524a3d0798f25a917a4db0b389cb80b0021234cd7a6aa7c62b171f2102226ce2c8b0c9112b9166495f9276c390560c829292a5001321cc6481abf6f24977c22b86e405f0d8d8f73029e23ad8860dafc0a6fe15dd8bc1489887fdb4576b5293e2cb93766d14958c17ef76a76cef07f0f742603f91c7f911375b3b85547a584b095d6b7ad698e57cde584b5cb2d4375c280f102407916d70a21d200b6a22c275036ea918bbd52d78adfac41f35e04c6bfd71260ebe67491391532702d9fa0840d5d6953bf2ee439ad5a54c820d061e32bffa17af340849cca133b4c30257696381ddccb07a461c500201258fc3359e9efe9cb3194c637ef5d2e2dc16f16bc30a863aa44901e4c9717323f062048fdc8fd3a618c6692b5b22f546fed93f71fd598a559139ec5f89eaafb2ec2382465ec5a06ce4273e2606e755289050d9e909f6255fe5cffcbc3e0872d7b09f7aa9d930ad6cce511e45d6af8672dea40caf4a24b82c6d68161f0ceb787c8fee77941f4d41f7eb155512b83941a8e7b2f14b372154c03a610482ec417dceaea630c7e817a360a7810d0f7ec665d3beda17934172a56962017da8e058bf99c968f04fdc4b99f5e32e3c301cbecb42c87cd0ab207d50a929a82f79ca3002d3e757d84c3ddcf8f1051f51fc00ece2d69d85cd6eae969bf11fed9d01c3930a262eb1a52d9d29a09eb76e21128a617130d2f7bc5fa82dd4e0961eb49b07feb22371d189333bb6c193146e3d0cfb1a917246d7ed33bc37aaa179c49a28e2d50ba9fb1fcef7aea82164d3214972d5bc6a5c68cdf4714ab9821e528ba02e24deb076fbae3a6114e4fc9ace12b2eeb6bf06585ef309e8c61b69089626dc0945445a7934e9350b33efd80d8983f6563f399ba05d835692492eb0646979c5d7dd8cc1b8f985c4eb254edbf11f97a67977be9760cc99d12640bea554296f8db0dc9e245eceaeae7faa3a1d98070963759adddc0afa21cec8850c3c88cd2f69521eb0ef14e8a03bbf2f70ca2375c1e44df1d1cb3d4b45aff18581a7a76cde0cb8cc7e32c221918de7acf20b8ec6e3023c33e72200bcb04f3698ee14da536e50df99b35ffd2f3668545cd140beb4c9557eac40c1cd0480d6a9987bcee8fb77b5c7c8aa2cf73a69dd879909b3f5d639ad218e43123757135e105fed3d075424282d64d2a0d1a325d4e1da1425d1383ba95f9416c244d4770157d830a66339fb86ca8588ce2aa970ffdb0768c7f957321d73091025d552864c84a12ae98f446a02b09bb357b8d905e02391e8d2041d56d1f1aabd39745612a172771e3ab1d704b4fdfd3e82659caacfff3e21c912534e660e700e3669b3ad814846925e2be9f894904861905e9e53c34f0ec769ca02794e9c76247105198132338eeb2b3345ada92def180c07512004b089465f3612aa20ba0af3a44e99b2218cd243785df214eae4a241a4396deb9eee947fe22c5b6cb7347105e150470bc3c9872ad4dc6f93e8c24982ad4f1562a29b3aace693466d0dcd9a5113d43532f311145d2bc47ff97e65e42e9ac364cb674908e17118137e7a62b6560113f4e1034b34d789155c304c50d892c879860cb2d3a12dc460fa4aa3cb915a1e6630481a957c9766894776fa7dcb542182ccf7b3ef40d051e64acd554949499e031eb099ba08de23c204c8262154ac18780d1c643c2de55c03545284ee1282aa0aad3d057d879f944397d1694aab3b93455b43f5f1745b466fbd80d12a85664b775207c6f9f9232e6f094a33105104f6cf0c3bc69183ef5f1c3b35cdf896b9266210862f08ec7add11f00f19479a4fe3e2dcccc0a68e426b476915389d06cdf4905f3895d73483d59c692b73df32545d8ce04efe006cb5e79fb94cf19a717a9b737c8ec39c79cb6f9a5a038f3de5343a6d202e53c877e80b0808527d9afd932220ce221c4f0958ec349838595735f19bd533d99f1c61cfb13e7d44bced9a239a7a9f84e51c80f74577c38e11f77959c808b8690ff3c7b8c6fc4ceeebec58455aa411cb3fd35432c43f84676944367716299ad96e1c3eefc8db960eb454800035fb2df83dd1d2d86547068243732ffba48a455868219440ccbca0b943f6fc31af9adb53ea0eca12f64dcf6eafe9387c5387e0bce6c9ffce8153fbe31653128db54a6dd213191ff4fc004be58ca2cd2a02331ca5184c9b8cce881e8d0422b269ddd764efbe6c62b831e07c5fd57346a96a334a9ec8cd687992d7aa7ae014dd4c20bfb62831e786808917b6aeb9e344588bd20d4e11f4af1bad67e0dcfd8e23be57b984362060efa6a6421a19a65a61fe5222603111a922e6e10ac3786930b849cb6f2d54f435c211e9ca9be27222f60361a8e30c0b1af53422d29e6da05bfaeafab42b33db76c8d77b3b546105eb7ca7d7b0caabc799faa3b3c24000e2344a2f781325c46aa70d336bdd51a60a5626b7081a69fea370fee6f8920fc5b32c2230676007872dc54cca8e303a290e3b7a488127338a8b67cd4970fa9d7d1dd282ad50f0374ab0cd969aac8eb3cd1bac2d62f0f97e6468e200a1b961b7998c1f82129ddfed6bf5eda1dd3aedf5d91ef60b063907088d26b48396fc239381931c0495c99de4627a155a8f5472334b80b252040d2af44fb65adbe47372a6358b45add78393256a26c8920fb66fd90f86391206c36dee69db86412b6f0506e37b4aaf14ab6fa0d7188d1c5caa2a03ce0e73ae30a7748d2cb6ff973ee095900a3792a4fb6cc56010b2025fd99035abbbd2cbe520ad62b48ffd01a0edf86f697ba425e45f39aee15df2ebcdb50e47001326d1831a869e55cb98f7f378a7d015c91b30f68dc42f46db406b36120298fca0a7d0b6ee5fc925520837819835ce1bd494b0f68a10b7b11194dadcd6324cb24a77c50f75e357547a292ff545ac3a79c25e70985febb627de24a92e71b755a97582532a5b7271b083920893ed97a03f46507cc95edc9dc0abe22039c2895a946d373c2437a11f5e50108db1cc4ca988eac93c51eb89406f02926fce101be8d7453aea52c03428e11d578d3d731369972062eda26c445723eeb1bf52270353aa2b533a3b5f1b6715256c854d1ebc224eb26bbd7e2cc9f5e337368ef4fbf907ffa6afaa703f69f5eab3932a680887e53fdbee0a475617e2f0ce56d29d856c4a2f02e11437ecd31ae2eb8136f738cafbb07e6f84efd27bd12585f54271b25096a67f02cedf4f49084056fd2e0e885247bbd84e0d71631cdd3436b78865ba39762460619e202db1c92f1e2bc464dfb337493238bc26c31cfeaefd696a079c30e1bd4a4121eed90a1c89684c955da5604a5b9f54d0e7af2321504dc2da5de8f82623dbc2a213aa7af191d0d114f8fb24118891fce8285cc9b990ddf0fb1c8cfc295776a37f4f85b596f0db42228a98c6aa3b88780a92eeae7b54be24e1da9bc910ef7e36521798ac0e88f722b43a997e1695595fd660f4f5c4c80eb2b975f6449c22abed461e415f2ec57a8ba55c03a90f0f23de194b6f80a60763bbad5f52de6146ce6cbd8ca3df018800918690eb91d65d9c0adfff16cd01af2696499b8a3d3c5c90ccdb3d33a1a0e640ea9acabe115e270e74c2d4bd531975ef6d93b4aa57e5350b091651f110c65d658da89f74f9e180ad8383ec187b005989b6518d70749da1c3a9d59638d19cb3095c0435f3c0aa798ff0b7262900524308108c7527fe84adb68d5835b055628e6692593a4af25761eedfa596a8c619cb94c4ea16099621267455f864b052566af3a9d4c90c27b0d60aadb51e925310ac9f7efabd775759100d0faa5d5bceecf2c3dcf7699f4dec56ff771e3c9bc0f47c288b41cdb469400c07a8392fbecac9a52cf185fa973102610c9a074851871cd5294f23aca2253cc712cb16682def632db5c51da776ae384e77394d250b8e0d6fa1dd2850b6a711f2c597249c095c3b665ab069c3d79284b2eeb02403482f0b4b3791c70ff4b249dca4d94c984500ad46579d052de4743bc20c3d0f987eb589f97b5c5488f62d4abccf92254194ac5c84e552e8b912ad9edf0fc7ea15c8a71758dec124b2f3a59af28df8554362612089e04a1c411885ef8e4e30a62bf6d0c71b571efca18c7765d8d26aededf87d5ca015c3ac9ba05e4e2027a42ba7a55208e61351dc057aff100974b26a31c20a6f48ae019c5253c8674f3c9f0a5eb686e43e1a6a38a226e9da9b2baf75d0e64e7427103c0d0c4a21f512874b8e2e9dc64be9b365bf6fa997ea7e8de25b4a4ed2da54c49a667086b0759074b2740999c10a819e4e7862a3caa2018d83165d00b44b080ccb101a473c1e59e9398ebe172cf490bf3ec9f908d5a8946d4209ba800e79ea0ead387fade3ebfb370d1b75ea23c183ec0291f54bbabacee76817e48297d3fa294d22808d486802b947e8b17dc459f02b46721ba52c048943e535f114bdba5f403c0f46df4e8d2d276e904f336211bf50d698958df3a8d5157dea4b009d6e271751022a20be8746fee05c011a7bbbbd3c04e726762ad881244b47fdf9c20846933e702da88955a5bab53aa66d24b2483a8dd47d4278ddadfc8013cc405b8a193f25d801b71be3fc3f83bdd79158a77656d44eee976f776b9ebd0901bd66873dffad4eb766d04f2861f4e1b6ed86037f43823f77461b7b4b73e73923b6de1f9bafcb4b289f099b42bea2d8176027a691f8e59b7041f2eed434bfbba214f2622f77459de3ea3b3d9acdad96c0666e0a16c6272c3e7917b3a37773636dd92332865df1ef84bf0c05fcaded6caef6b1e9ea95330cd09d4c8925ff6321421d9e3ddf06bad7584d09fbfacb5947d0932164d335c6612a5ecfb692d02b277d93bf82159f2cf46be4cced4b3b15f56ba099a9aea93b764fa2100d1a6705a1bc01adc890943be44f93ad3678a0bb42f18a07a58e982f2452a544391444005204880dc79e33487d90cf90a53a6cd92242de400c572d834ce9375b1d0311342a548a8e325488e8e427fbe6c00ca499917c6b07400a255f59b0e98c903856a87951f5a5ea0aaf6f8f9b1cbaae3445001aaa4d9d2214f9fdd942b2c52909ca19ac24186968336c1800c72ca8829b1fae1244e141c52bd1c5843b472583b3964568ce696363a3fa8b4f152652a8a470e5994f731e282010e122657c4f819c0d418296c785598c82015dea086080b0d47e27061f215c30570e8c400c5ab0e8e1648d562a0503f88aa0c9c23527d98d8de84d1b165858b6a4aeda3e46a10171c2b1f7f5018a4e5853b529aecb0b3044b47101be61ce293a3cc20233ed8ac98b285ce1c2a3b5447742dbc973f58429a28a9936766c4ca9f1d0c7139d3458a66c6ba6112a8e969ca1b313345ee58c9e101156e8091faa2a50c140dacc9f41125769658e964d891004e96144368c23859410a8c7ba19345030d607200549525055b5e08bb51e78b470f19540e398ccd0982031e272c17b27c69c5b93af2ddd2c6719696a4ecac17292c7c5d66091f0f62e8cb22f3c9fa8c33589f29d9ebd6dc95f44c585dbb7ce687940dd403c6f13c27fca0f2920256974250b00cf1105465a7aa4e10999a06734b1bf3b450b9a093287b527310fd72cfe9ea7a6041ac977b4e4bae079dd8977b4e4a984248c1828673da21eb3909116da2ed724ff7e7d22ef774766a975a551342e185254aa1385cd2a0f930c31e345f6e8862648d545803ddb9b8cae2656a4d112d3d42a27240f3c2161132586854f46a022e180a031507cb8908873113a5cb530bb60cf1c821f3ea19f4e43086a3cc10373ddce400edf1da3283a54e9f1c568e773131a4d09329532d30611301267cd8e40002c6c820a9a9e6c3438812dd9b1a9ec6c84801a363458cd50d4031e8087b08f9dac2b503cb202c303abed800c667b747509e40211eaaa403ab27284f507a98597205c81a3351ae8c9112fb91a6298a0a847a5184e8f66c99c3eb5324cb0e6258aa745825aec20db4a3b30548080d3bdae0e80ad4478c93950f54548da11e60be94c123c3202ecceb01d5440c49172b563abe1d1cceebf075e5278dd3561e2b2573ee3871112a42050482c50607205f47921852c1cdcd088e1f5f5e72a6c8911571405b04853944c315317cd2c8ca5c1133667775054ec83bc280a815c68481b1536690913538e0485909c94187b6a32db8e07344ec0c1f3432d8d0b463cc912b215276486121878e042091ecdf8823f0ef24193f8b80960cd65a6ec93caf262941459aa4b08393d8921c13baf104caca48a0313d724d06a2927a43a40bd098273909e090840a57979d0d8472603d1b87300c0ba9c6f3e437f8a2830d2f48e9d85287d54c29f30503973045aa72f3438ec0e51a17a007ab88f472d721203d9ec479c5ae433cc0ae433874b41e500a061ccaecdef0047d99cfe07cdbbcc1c80888943d94a33a2029a33f7ba49c2945837272dcb6bded36f97d5bf3e3ebce3ff3438dd11fca428c52e4f653b06d6feb9df931e4ca2e9ff9312690981b5e5c58a255a7e763abc9098f2d50b24c51d3260b188a8562b9f3798636554f63ba1d7a68d7131f4e595210c4c38b1f99cf2098ae3343898e2c374a7c3c514d2ffea5292a074253dcf060c2e60500102ae3c3c9922d63b67c99cff3c12f6ff8cd9dcfe07c1b9899838e0b470e85b06060830205203d2fb1344258b8ddf9afd3e96e50273a245d3b2e5df27c72806cf9b082b2ab12168491e8f95248cac78ea814ba0c892f2340903c9173a7498e9f4140a12e7f8b15540cb6d2d4e974baa8dc9c1b084157aa8186345d7ec394311876c8f578620f584e0145a2f0724d26ac8a58aec7222bb9b076ddb0e7cab6d90396eb916b6400e5834cce060869e05401a04dce49b08a71e186a99c0ddc95162b599c3c5380e89240391f6b503a40d0b0c9d9701d7ab672dc0c08c338553b9a7d02e3a550ce06ce891138355a8f9cf3b186028460c5c9d9e0af1c390f364cd9f940f3b183363a2e5ca12eb91004cdc79985c64b2c04cd47366306cd0544083d99caf588b3930b893c8c1b407472366a79c4721041f3d1730cfab3c380e6638daa460c9e1b391b38ac235f72fe3dd6c0d9c9a1d039276933607e08009a8f22f0acd19323d723ef202417da683e7a18962f5d880118000de60e32e0b1d1b33ab9618f1bb6a0a73b137443eae7869546e7825073c38f46c799981b82343a7ad07243198d8e9f951bce6874f47075c390464710446e48a3d1d1c395badc15c8e9861e6874a4e930e6754bca5d7fbaee1445163d14b9f890ab3fab648d14e4ba767de4ae313bd7bbf184dd3483d33f81e9d66fba5c43313920288add46d7a5e8907c535bba13f303be274e4cdb095b939336a58ed445c52646a8064e03a6877a8ba29cfbddf9237874b185c0748241dd55c84661756badf396d8b94e8210d5e5a04d3171724b065b22e896acc7679f28e79ceb3401d811fb7b4bc6acb53fc2bc9699d2f8466daef47c449ff98832313f3f0bfa3d9626884003afad716b25adbe1fd13777ae9a53958a0e2a3ab07a3bb07a3b98dcf9443d1d7a2ef750c8724b3e74e717e0724f479714e5126d7ed73c48412cc58b9bf52f0083c839d9b7a09145e0bc189091508a564c1a6d269bd55a1105641ffe8bd9d39ed25a8bda8cda28dafc682251116980a40962bfd1bd81b7bf7ddf95d80d96311d6b7cb04095959b7f73a526255bfe7851d96395c38ddc1cc15396183835a42973436e72d9aa7a03e584cf9caa9cae3e09298ddb9fc14da11601ff24e4a4f47b9ce129fa1642df265302f89c608687c5cbd89e392bf0989015845c09d2c506ae5a8367f43802f6ba253459365ddd7e1e8b58108b56d8f0ba4e9e982dfc887fb2f01eedcb8041b55cb9534f519e68f245271589e2f75c13817992d047b33f104602c4884da660ea5b0777c4f2c4894e2a71a7c41224c498253ae93a11e7e3b857a5ebceda04f87952a6ee181de8619ab7059296f8574c0b67bebe58f50471e170b31526064914382ce4e6c3981fa3c85d6926c9babab9236b3edd4975e77b274d127716fd350a619a4003468c49a293f86b5d5dd74f1c9a553b2617ebba6b31c9a274b967c5e4f61cbd5b2032f5cd8b569046e55290236239abae37e08ffb7700479cdfbc9e9a5c7de4df35c7bcc0a28cfae64b17c5d295b8f404c5feec27d5cd8f66230a9f8362cbbfddddfdfd1c4b19dc75c1efb16cde6d9d4e6ccc0ed8d5ec25109c3626efb1fe1c3f4bedd71a8a6f5a5c28124da6a1e812cba5147ca2419851effcd93883f491fb738025ce2bc290277c0e611db2e2e5fc671c274b00b1c043072b39ffe93ffd433017740ed2c0b1bbf4cddf2792292acfd249dccbca727da98b33b925adab2765cb81e86e39a9b8d39eee2e0bbb3ea76cbbab49e51f7677e9bf4a44a34eeaae0bfc846c14f20632887eb7eedc724b0f97e7d69c69cdac79b59b514dc9e84f9d6c8cc56050ee62a2ff375ced6e9e5b97a9a7ada1004196f482b021de8aa2cd66c7106308fb4444f45dc43bd1bb880ff15c1b81e8458c1f9e48c4e8e189448cb4271231864f2462149f48c4587b2211442323798871f6761cafec735a88b1869416626c5a1b81bea5e0dbf16fad8d40df8a407fd644b8808480f5031546e752722bcfa10be2796b6a0cc418e38a63f9e1fa7f18cb29a59c3e4ac6e1ba999283dde807ce993d32b29c3a313ff0c001c992c1fc6871738779d6fea924a14efa3bbf75eeee8ce45fce5e4779891e6239ff5cf73ffedc499f801ee2f4ea9b3ff52f3d5cff0ee888f34b36f20be6056cac949654562f4acf2d69d6e45e54d89d4fa94ccb437a41e4cbaf45fc67de1228862f3a43b81c01932dc1a13546d00b6f84d49ea95f4bfc4b79ae6480ad222dd08064100c51b9e954c662c0a18e1d2c7c7293863b75b0747692e828939b4dbb2a7da41882d221ec506efe4f8996246292a6019658d219f5d22c4aa593b468283e3be1aca05fbc4cf930e40982cc1ff991fe5c1b819ff64c0e8efe1cd21a0a19f3d758345d266738cd427221ebe70d27ad36522a632f47d4e59ed4d87c0e2ef7a4b82ea572254a8566b97376b9f3792cbf6ca7fb7ddff732dae982cf6339ab8df3826449ef58824ff7d36119b353c4be5f02b602cf09d70b1cc355f22d300c4b1f7f633f8f331939a35e47e17b2ef77250dd599b9134ab6ff3915c10e7e5cb64d94e973fcc20a9899855029058f6541623cd47ca12d94c50eca9f920288a34a75bd22c1ad368ec457b663b97c5c4b14ff7f7f3b27589cca0962d4bbce297f18c9f66791872b864c38935e6c9cce3338fc1a66eeecac9039b6f693419ed74d9f242f4a6ed9f7f9b3cc76c71fa2380c9c1fc2ea294452b7d602e3ae9ce1e8eb0dbd4711806733e65c00a2ba914c09d3fffffdc7ae79c3b6998bb005488d745df5ab0980f4e55de07ff4942dfe6c3a01d041239279bbd55e8c68ff8b79cbbaa3b1f83361804128d5a29fc993496e823b7a3cb946664095c89a510c0c452c6789b0418319899fee76f4919e3ed2f2ac382f6e0002486ab05499ce4e6982439e6280993ea01c14d9c2b718e0ea02a284273c474f890e1c953143d586168961495c175090e9b355a02874446fc4b43c342971e254f3b6cd00085386d5408c343e8466e3e8cf9316698f3dfbc36ff461b451a083944eea170e4ce8985ce146ab0b2cbf1edb19f98e130292a5ce56c24e9caa61dd2ec18cbf5d85892e49aa68d6e1a67b064391303d701429e5f227de7335398dc12bcb44eeaafcf46d503d92d81df7f3233333397e04f3f64a416443ee3657793f88c17aadb4f3bd3a5ebf613e97255c94e5af6e57216d1afffbd1d8b2829c2bc64d452e3fc463f57bf285bae7e48eb08f67a9498abef3511beebe409fc5aa5a0be1da3c05cfdaecd5a25dfbba279f3c62807d6acd88fe6cc2da086bf3c00126c2071e2858c9a393ac668002509941b0215f142a58e13b19a2761036e717203289383a3ddf9b81201eeeed3a70b525e84525a9bb2bb57ea94d239fdabe539e7f45a29b5b40164f90e717e6843ef199425c2950912254a6b484e4ad68e2a07c52b8a2a17450403455bbddc5b410be4c9765baea85c1097b758f158103f5ceed2a10d1c71c4e52e1db4c8b888175ceed2c1090556c8e2d1eb1ac4e7d2cb3d25dd4a349b8dbb8e19f893efeeee5ffd9dcabf9770b7b7f57b24ea1b957fbbae7528faf80463c0815dee9d386a606730e832330afcc6dc92e87e23ee6774bf5b92b8df7390fb95b9df835f9238f7db45b9df6eec7e4abc5cdc06bc1c58cf54ca801e121f2087e5b0755d7affdc7a891a0f183f341a026e49a4428edb2a8455a1b9fdd5a644e896418fd19811c14ab7e431546b8a38b9fea2ad4897ebff46845cff9b113bd71f77e4caf55fc271fd99b8575585c2bb7a611fa88e7cd0a29fe162e1eeeeee4e410d8818bafd338e972883c2380ddae54af1ba138e28b02d56a8f4b9e3052b2cbad3231287a943ae22ab8f8bfc6d238a26d298f9b71e97c888ff37d1d673467cdff77ddff7b148d1377f109cac087b3207f567d82ead2ba82bfc7edff7f4ebd2c6a5ef27e8fb95c0ef471ab95127559288b402df5f742576b63bc0cfadb5364741a8fa543d5503066fcac506bc5c117dbe634f3555dfea7710489cd5fa483080a24dac5634ab999b2aa6e7d6c7a08d38f560104864b189d573e74a353a177efd7935eb183048e85b9d3b6ead4c7a8a91ea5327429e9c6efd529f288918648a4d5081cfe4d6ee39e7ecb73fc9b2fb65cfe428c039aed8a0056232dcef69cfd426d0e8243bb3f4519d5a75f2a682345557bd205bd4195963e642b2a87bfc9b1fd5471af31a44897f7b57bfafeaf754fda9d5c295665fff458c4e82513f85bb530688d9714a29a529e658a482c36ebf085044fa5e7f36e27a5cea5b7ddb4a25b29a2aab938650b9f5b9d6d91bd2a5a76ead543cd4da5cb7be9d258e57bffe14ab323bb76acd392737b9d4224011fb1b2c04940ff8ce0f682b09608cce77436ed9585942b26ed95a42a26ed95d9aabdbebfad39e734efee0043736d10aa8d2e5b85ef9911fb158c78c616299f4913fed12d2b18e0913e997b5cb75ae3aa6b4ddb2ee6aeffa1321114bcb64d74965ddb93feef6e20c49afa4a539ffcaf3af5cb58b4d4c23d7bf32e92410d79b729edb91225810999a3656fba3e0d394ba7bd7ea01384edd9c3e7dfaf4e9e0fbf7eec13712694d9f3efd51f4f109b4cd0a5fd05df0861ffad9a8b43b112c88bb5d63f17c147cc412e426c1baa3bb5a270c1ee846ada52cdcd5aeee5ca9d2dfbaa5077447b4b484c3dd6eff28fa88ba7b7768683a435621e683b552afb5d65a6ba5d5e7ad9452faf5563aa9d00f3ee2f67f947e5f0dc547bfb735145f0d994d74b77d02b406b7c76bc7f1daa731d29c97d64bdbbbc9ce1ae552dc8839e2036b28beaf7c3b1a4da2fad6edd31a0aabc19458d29268257982a85faf8ff532a5583c6ce5f9fab6f27c05a102b9f7e3cc9434b704afbf3fed44095ebc4e8ea0554246e2f263f7fc4c4da3939a2c8bfc9936592103c80b4c8c1cad3d574d006df5d9218a90d4dca262a689570b43ae049a42a78615ac44c103454512204a9cbd14c65cd6e1720f489a9bc29898095f339ede7084fab5159f9dab81232834405094d966f397b84bfbf071372469cccc6459f330fb1e1bc000240218dd704b01b8202e87f872dedaf3487bb771430fb49eb5fedad84ca1449bed7e1f4942d0d70d12754b1eebdbadf49e82d89d97067a0a69cf2643987fb32296330be7470e25b289c9d682d792241e48975bce398164b9f367963bc5fff02e44f20359c42e707e34bf88c91620c4716af9d12469f48d7bb2c902868310d78dae34e29dbd1f60774e9a9befcd34e6540df08aacce9d3f83741248e8ceacc9e3917e08f371f4e72fc9a021ee430556e043e887ae47952d5c28ccabcd953a48bc76c010c59f1f669c2653aa4491a27565e5060c6b0d99305bc40f233b04d848f598d2834b951d4c10a8c90c5c3140b963870446e2d7126ffc93d734e409ab909c2d2455a8e4669316ad3643b8109242c48906fac65997377f72f5f8a2a746bc21e301efd0ae4b101899a6167ac09982a148a03c5a778a5cf962b34309a01bb6d09df3a2b2a0986c15dad15600074fa03737bcdc61939b6b046929a15ad2e59087b39b9d677777777777374fefee9ecfedee5e492bfbe0b71bd28d605354584476b93a8e20920b27cd714e073035675feef9984626afd7a3caecf5889a73ce773aa311c9e8dc6eb26845778f14bc72751c91950b39450d6239679383f922e811e7f3ed152ef77c04b913b475126dc3c30ec5711766fa23f8a5585f123f729ebe062131629467cb99204678847d31a4e6cd9d14c4e63c71c139d9c108941f14b078c9cd9ecd0f9a44d222fec589224ec4c92e6f717a02e7071fee7c9e3a70cdb43bb142bb2b3a1bc02f496aaaa85499c2414a4d53934052513218c9124383ce0aa452d3891592ea1ad35101e783535b4ced57be93ced9b3a9ad14aa41b193bee79c6cac7c4465d752b204c18e21e40888469716f1108b401ac882316ed26439c1d1d3e7035788d84992b51588506e3e6e4974314cc21295441fbf6f13492b056e29598cc3eda6b4c5052b97c4e4c09fadb5d65a6b59a46822daeffa42108928c16250daef0b7181086420428c80886ff569e3130a6206b7be8d3ba84fa2e8d6771277267ea40d67e26c763f3e5f12f82c8a36dbffed86c3cd481182647cab5f33c1a5eff52341190a2e7db7c0063919a8a385114434a6948b548ba2df70beb4d4c28ffcead653a14d003e9325812326074d03bf04f0c1b72ac07fbeb36fba5f09e6d7d529f55b6723e51bd3f85647d4cad61680e7ad94fc9ed8671fbb001ff983e40b46f24f801171e92be83299dde193886c2049e3231aa39c61819a189435316099623ea220a8fbbeeffbbeef330282b60ab449f307dffcf55c929c538cf4002f31d804c81363adb5d65adb4a29525ca013a7a8ee494cac93cad68dfd11d3d9f9c1a43339f09f5ae65c2db19c766e7646e8f9a61636d13118dd98367edff7cdeffbbeaeadf87041902c4db8604896e29d91460e92b7beb1e85b0b94b6d368ff2599935229fc7ddff77ddf079224488448412c495cefe04a7491c23f26dac24f01cf7de4fbd105663cb7020efd3db76ec95c53c747f4a3a2a6e8d58cf2184e960cc6bc29508c4c6187becd767595a5c5bb2ac65bda00bb75eac098772d8cfec6a6744f6226e868f89821a6fb7f3e3a72d176f9c89fa9088c58b29d18329e4d74c5ea499184fedd3eddd979babb83f4f609d332ccaca8aeff3458837552d9651fba610dd6627d6bc015b16caff6ea2fd71559ea2466ab547b664f511b714dc292b06d3df8e044080d7880cc52eb810911661f526bc9250f46b83485517d4f71e9db6ca2c805b2ec6f31ae0d1ca94803fcc27009a4616a84b5d65a6bad48641bc13622912d398291e8885b6d44d75ab204e20836d17568d3a674d2d994523af956e957bf1e23886897dfa8939e6f5ce3b93c8e795d4b4c22543802dff956f4adfc899a92ec249300146d3f458c4d58b0b0ff5b092616b38bd3fc92b317180e37cdec02b3ba274c4b3e23f96789e5e4e29a63be8fc59c80b61b68bbf104e1a134e196c0845b5f8c63dbda69675b6bedf78db37ee3aca990ddfad48325d9eafbe8e581a5085bb86825100f82604c220cfef020c659d547a14f4daa1d965697ac2c3cae2e1831742480edb0d6daae81e4a46a4104a940f0fb3e1004bf0f04431004c913c2ef036760187edf8c2c9bee389ffac8dd4a14c939d547fe369befd8224e19486bcc599b00d5e926dfc07f61dfad7d3f4106fe0bf0fd3560df3f2b035f902f3ef28387510337dabfd70b0d4c2a7fc14203b4f74fe14a4bb425ae169dc47769098ca663b209dab4840f1c891394525a5301d27182f4c609db8d4ba24b712596be71894bf08d7eafa0276e5d2a21e3d6b20605c113532cc847f4bf157d2d293292786b096880df27b209a7515e388d71ccbc16fc9ca25c621959e2baaefd16b7be091f86605b393c261e73428609634aced331c11a9b55bbaba9011260f017eb39d123f3988b4e024917fee128fa91ff8bbe816fc492d380b2d16a016062c96968b892ff8b7711c20b259c0c77824d348ed715e6f3d29113a0f703c71354509d2eb4a30a7a29a5de93ed130740ed28e06ead9dce5b9a3bbcc43cca92604a72628984b5d6e228f0f6cbdbe423fbcc4ace6cb329809596fcc85780b8dff30b3ff2074151f4a6196eddbaf45f80e0df8f7c462a39704711fe65320ab089ded9fea4beeffbbeeffb3efb81b046fc464ca735e80aee37d66bc3ab1c97c96432994c2603c1671a9b983dcf4819239d6076657d656389822bbbf4bf9186e12022dff77ddff77d460f4eaeadf8706f7debfaa982d615d4ebee574b44dbd64e3bdb3ef84db31f8e2cfac81d7043b4b3b662662d790208e2022219b6846b4711d782e308ae1d435c5a43f181202982f85c74994cb44b421bd2b1dea6dd5f7fb4f956b9b66205b754817dbf61fbe44a3d3023d5ef6b0582f67609d98892d0499cd537f7b7b71bee440a175fbc31ee6f6792cf192e93b99b590040412c2795577dfff194d8467452188eb3915a1094c99ad209279408a2e9eaeb4e1627166e001932224e1043850ac920240cd309645843c3133f67a8b879294750c082a2baa183cf34c98186c8902d3f066d00a686a92239fee828c3cf0e0845e667e6079952eb4f9fbe25a91123313333ed1b4edd5a6bc9b29b7ebd81b825db53ea2477932ad450e3cca4f4c85cc9162f2d0065e5edcb872b382485b7b4c5595a6263d9844b56fa2b23f3b38736182e5261a8ec8c0db4b9d1edf62a6f5d3b644b966081d9de56b5646a4f918af9452a4a7a9976999441bb932c52d1739233549cd0e7363983faec2661d8cf037881c8aabba7842177924c2693595b7ff3d671825fe9f7a57dfe1ec3ef1bbb3e8f80762959ceb820298376fbef9ff60368876bfb1bec1bbbbbd7c7a1fb5ccb7eae9d6193e5dffae5572959d22fe9f73dfdfcd6d12f9383633983defa14fcd2beec7b0cc1b14805d5e93e1553a7bbb207477a65a45f5a3695eed4d650d4b763d9762cab1d4b7bbbbdc7b25eeee91e9ac009228bd6a0cceeee3e7dba20e5eeeed327b3fb9ce4bb0798bba8e4ec56453d2a95b2682000002873150020280c0a8743029158341ee7715c7d14800d7e923e684c9809648130465110c4300cc3401001c0004088310619641043e800a9ff087fc73ea4573c88bfb8d14860c8282e38c60a5e10a712d2e79ef390ba79f26b3f18da56941976f2c15af2949b3db4c51eec95bd345e3c1078f22a14f36d6c9eb9f0d70e81cb1d63a8f490559e447acf10b27db147344f6049f52e47be67c62e89447ea711213f8746351fd10e2744b70818204f4d0bbceb4efd0d06bd8802691dd25167c4237b7c00451f9ae17b746349c7b1e5c90c08d438d634e3cd02a891e29c87b825380cb444ed27559bc144265f052468f9c50d3cbeda13ba331ff57318fbd49513e15e811ae087b885c3123ff46792a280b04f40972793f0ee665f2b29db7ce8b3f07462618dcaa43c20dd488540713aac59215d3d732ba347582f9b00b07bd9f487aed82471603daf3513a0bae709587100d1d10e44be80237150dca53a3bf08a16e3adee6cc60541a85b9aa2f2fbe761d267d9c9c402a8ebcf81b6e8c083c91e5070408c462e9f9fadb766a5f25cb9119dd9ec1faa797b78408540c98584327e1af8d59f041460386291274f35450fde1b1a3eeb8028a069f442faf663d389d472a5668e8db87613002ffa171e6344dc1930b386fe58f66c3731a17f8eba8d4ad32d1ea2711ff80a600708f8a6294eb6b1c8128c5bb61b5c6d95ab8da9fe50e8d228bb2a980239e1acef3d4358c05c35ac2dfd533822f196db9ac98abc91da834ca36da19129f720f7932052fe293c426e1d990925d08c8e126a68cbe71033ab068951ad43a9bc9a900cfb31348a95388608f6fa2fe924fa5eef60289198627088cec2cb9e0b9dfdb4d594a5038670971d6894e8e1c1b92d6aad697ac45108f1c2cd98ae94f21c2caa2046439a14570f89a5b44d4af1cf61ded8826a5c0d459ba078c390a6db4c04ee818fe258d4c3146dfa519bfd6485ea9e04d98f0be73fbb4bb8c91f08d1db7e74bc125ddd9d6c51f035b70cf031a3957974ba938a8b20d8d8c3df0afc4dec3714f999c49cd4918fd95941f7d91530c55eb2a1c9ffa6257a5407e60c9ec81881d48142d2e0d9e24d477c988c5c15834fe347813c2fabe84fc6dd3f893337f09c9971487c12bb154c340427b5028a56c81ca7fdd7f3eb2da1ca19dd7adc2089a5931c7ad785e83aeaf19dc421481b1ac52e3661a0747405852004c83a9ff0b25ea20c1aedd702cb764f2edccd23467ce5c33fce67a70a62953a09f9b0212b9befcbe13e677ccc90616b509786d7d66cdbdccc058ef5f25d50988e915893f05a458481a4b8363f46cd8646e1c3e35dcf245fdcb17bf37943ae841a07bdb7892b594cd15db273a826b074ec9b08aec44b3a69ab9d8c9691b41b1aad0aab0dcecb90c5e4b0771859ba65145cd046e48015cdb47eb1628a7214d467ff4b863c671a9165bf869f55860892e605f706de31e6678620393ce3d319985913c478b5e2c8d8bc4565ece78896ff0f260701f17fc19048b3171f44f563c10a311228ec4ec449c354da3b74af0206aebf975340e3f892d016358ea38b770a617e572254667f17334206debe02eef69eb8d81d46888cea07d833816bbbe6cf93f714aad1f874c1622dec376f18fc11b45ae9386328d3dcd76bef9970435f65f69e76863a819f6fe6afe3664a959670318cd173a60c94943029e7a10bf8278d2f17da38354c4ea1b49923cc14a9a2d7ca72fa16ee8585a24b20e514314c1f1dd5d24746f8e451311232345de71a46165a35dc295b2e3faac9572b4b429c2be38e250012e24e90c0eb07face99c35d9c4f13ed6562c38e662b02f36d871a46a7d0dbee95c6f63f3ffaddfa274e136e00be61be11f26a2534dc83687b8bc150a34f76ce6000d00442731b49d2967a2f1f727964f1a9f61bff57a5f58dfec1913c37e46eb656313735d04338dfdc0ff60ee7573f66d3884c5ff97a4de8b56d30e07bbb9938f75dab73fc5af814dc23d8daabeefc448525864d6937ffd641422670db334623511338a7d3c684eb95741917e3e291d041525abf4f43ef705ca08476651032ea20383e8c4ddaeb209e57d5dd50d0c05366dd2515672ae4338a19da536481a2363ae0f171adf1100eb5a71d5a039e4a59551ba6ca32077adf8d79cdd1aae6513273333b5bbc6bcbfd5f268ee4ef04caf790b51c884d3c9e6dbda2c6982834e070757d8690f24139387ae378a9209f41c29fc4350c24fa2f752e5386e04ae632c161ebe7e49efa09cfac1c89a8908bdeb593d399f9398da19f20335feda82dfbacbbbe2adf1e923e5d66fd86d2bac502099bfd1048ffa8531aa98bb68ffc5a44a28aa64909c1651fedc3bea7b8268a310039c2f5e4f24a63c0e660667a734f19c3b85ec31a3d44ff63683fa14df593683911edee980857d7a085c9908c02b131c386935d38516107af6e2208120c572251d8bfcda63064b8b388359aa0f576a7a6dc3de5ea6a9f8af3a161976b5598e1e1b91a0b4b9fd7bd64eb9b7ad97c2976369a9ceb1c8842a33d86289f6b6ceaf798b5e58af6c1e2057c2b57cc7df8002affb50ff2c347c9c7fff8c0791393c097664e1a653cf4817bddd3fbb0f20fa72fc7f0b3567560c7418d8f7628d46266c2ba8647167a479d45f2d32aac0abe1351ed4b6909dad7d5e184bcab360f2edce48347ba834727649a4eb068b6dbab1682ac617b8b082a071bf1b1748969c354b6a20b138cf4e3775381ce606a830f64880604346d4169aa375f970af219400dc9d2c1c8bfe100f92627214446a9167a7d0e58ce9b26c41e690f95b88d448ddf35ddf6b9aa574419ea48dd6e2fac4203e8762910b777eeb6609cb4356bf68e1ac401342e7be9831bf51dbbc9a0809d81f0d7e939fc13e5e8ada390b44e355db953afd82bfa779e54815425a73e4ccf2a4d51234ca26a53bd703db513c573231692aeda305084002af201fa7f96c814a03e2e1e70cfc2cf609e97cb33a64b5d6a2aef898eb61ebe0d720281211f6b1513891c269b6d912c9238a86d24b8fd07120aed15719b62443957ee88e5dc188cb3cef7e5ba8ba055bac560bc0be356df250668f3f9d7b83f0d8dbc327240fb201240df5e2887f93028ec7bd5bd20af5f27e97e5cdb110105696dbfc01aec8a7356c53fcfd013b6fe2637ae688b480cfdbec162e72161c262dbef363ab8cd28103033868b817545669785d229bcba1a7c5ae374a920332819085fa20b06c59543f1d28cbe159dbab979e02d6688dfc8205897ef17fc433aba17da5345ddb0465977c348801b3bb8fd5610d136bd80cb4579e1fb889c03fc109ef4b00331f07b64a935c837eaa1daa822571724046b2bb1cc2a33894e81f5271508e8bdd6499236a991676defb92f0efbada3f12b11d4f499c53ffb6c47e7af83cf2f788304d391072f5dfcf178658052184f28fe88b843dd6c2ebd05e8de2b9f85e3b6e922f55a3f73a736445eef316bd7fa1972ca06a7f82f26cf6e67e52a1ac099496e904ad7816698f19820c1677a0c6e125345cb9174329aebb837a9ed37292bd133da58d4d14f92a4e5b1b5e22dabf5598de5f486baddadcf3e636791bab2a1da773b9927c8c0087e48f1f23b34f1e875ef614848bb786f7536d40feae57790b8bb7f1907f7813716091b8cc56cb7a7b4e6ce0a8c865ea5ada18bc5aa69c7b01ecdea3a0c395d3532afccde97968e4560eb6f89a3026443601afb77b4a636bd76dfbbe12f44c918326ba4d8a8d826f5e935ece5b084541d49b023278b95ec421546528f942975065dbaddf766b0d7a6be04f65db8801765e463eec6930ef5da024c18076afb3d40ad5ec098d0e6e800ff75125a25299a0c08d9cf1fea17dc54eecab96d079138d696321404ce675cab67d98f81c41529ccde3d66f257d6b5537be364d68cd4e7cbaa41e6713b6a72947ad8f99f223cff7661ffb7f2e6f9514060891e1257cff66f05e577acc74d4aa2edc62b6cd7d67c88e471702dd2cf50e526c5499179ad77bd1aa19da69091c1642cc797af516423bd9a88d3acbe4f47137b4cb5eefdaefa1f78b9629b1e20ad91585eeab01f00ed8dca33f31585ae7c34cb6d6800b56ab821413bdc5ceb84198435f10aa8a1b689e99097aea79b887de2f41adfa31b48315e4606e0bbb431db60ae9bdbb5e2c9fb943c06c7fb4d66f969e289c936d1b1473bc4a794997cccbdb41e990589fe2d21aff396e125e6cd98042ae127a2e1d5e0c6dda88a2ec25dcc60664ba0c3f23d35164445b85e09044839610970dd8831ce182d53d188a490c0a43f2fb157851de61ae91f56d46227f2d758fda25ee7d2a1f587cf8039472fd4a5f0b9ef2e1cb322c9a95fed0f225ff9cc7c6dd4261cdd1ab5ad8b1cc7d3df50e6c999d238663dd716795edcd08af2b2dbfd4331f62e225493976164786e583892d4a83ab7385699cb43b829b268115ae92a79e7e248c828ace825bc1b322aef69334239af0cbd12b9e9a897e5bec9cc55acdb18808438f31393c0ebf00cf179835f157f5fb86be1c24730f227a6efc86914af9f4d3abd37acb605a62f220a472a9c83c0efcfd0eb16e00f2fb14a43a9db73fa2c4ca677f3dff20fcf293ab1c6b558ab0c1cbb93c33317d7192ffd5b9aaff79c12371dc9a1f0ce68dd4f311c82a3c64915e6ebaee5e6d0b282de2198a19c3a0ff41ad781cdf637fd7a2209114bc883533ed0a8c7cdfa34c180e1b4977f05b097d9448212325d9bb474da50a54e1d990e26f8f2a31990ef6a2cf6492dc4542397c2ba51812006c5a33e92f1539c6aea20f01a39807e9a0851f6ec3a3be7ba8cbc7f391befaa57b38c76a5c516421bbc960aaa2ac0a0ba414b43d02efc50de3c3f5ad6f6f2a8b9fb28366378b2b27938849f787cd5334133c2f61bb95ec34bcec8cc72fda9f59a4e766fd3418d8669f6194413ea2d7de5d84f9c0305c60452dfb4e43dbf3fa687854fda2dc31c0b258743d648dd0dd43ae76e58835e225adf161752947194152986d38f524ae33dff9243e2c22f4c3061a7be2d58aa208f3f93a4162ba82e082533520c9eaf816d1175cfcf6c34b71d9d5e7f127e834f6cc62393e798284924174f297af92dcea693a42f485284a24e568601159838f3a3e280140ffbdbb68f3c2b11084bdfb61fb91240b3d145f425416d995fec1b317a4f02f64429f04a1d1792bc6562a090910467e6a3b955184fffc160b18abc267fbfe2ac4bef084861a7aaaf2eea97303800a22e3998425ae0fed37fa74fb98ee81fcaa059fec209704187216af60bc6a164f58bb8d06e8a6aeda5ee4283b63bf5d8e28759abc7e0ce92828238a3f947715a7b35effe704cb1afd82c2b84f47b595e98d33e3e6d6c8fa3543dea74c30b2c37a9fda1e9c1f0a0eb0dce6c1467edc8393ce27a1cba77bad462c128ec82c970af50876ea6e18625274148d7eb5d63d23d80e81739a55f93339dee641ce4e188a0b8a962bdb08c692187c2911541293510915eaf71f9c12602b19403c4afbd6d6af60742b78d4d96e8916dea873790a107f8a17d27129d440f6efe8b6b723d35262882ad8b1b410f93cbdee35e5b0c51f8dc719383bc72811e9cbd9f4716f9c33cf0b4ee01080c8a54a0c5b5f09c604221652e446aed79e8f8e9dae8bf5f3b5f23e2fdfc9ada00067dc8839bb042687ae85be3e241bfbd4445ae10d7224a4b843233e451159090faa1af46ffa603ad29e433dd1a2cb4b9f7250bd7082addbabe0f2e349437407e63ecae4174006e5c787e11c967b57fa1c183ad1bcec4b4428aa2df2122326a15c335336abd6a44a48485cda0937d5fd019f92217f22a7c7cfe28cdee756cf6b5d4e1d61b603212a31f41eb9118956fc6c40e301b80f6de03f0bdc9688b84a7a168f884174325e420cc6c5d1a8d04ba00068f10f4eea9b17024d44b343504261aa92cc7ca6a38e9ba4a6ba648cda882eae92a520ea73d608719bc43d14880d89df810245a6a9cdf485945204e46d1b13eef6403f7016f8e93bf40c35c76029ba878145a180a116abd36201645c7eed9e56a75bd912ebd0a22f038c31874b07fa8c05ac6e58fc463abb2fb8cd35ada56455ef3b945a387126de09732c5d887b120d8edba7052670ad5a276454852599d8030d918ff4c10826489fc651738004ff57b45fe25a1e128109bf6ff3359c4bbe6fc9a350ab23bfa5187e8404dfb1b60e7cc6a5c5f4ff25cdbb7a9c58d03fa28e76601849faf9d237af4e093d7101c04bc6eaa1000e4289b9e08427a9bc340017952e136044773335310308f512f4028679385495b3fbe81c982a1c8e5bdb5c56b200b2a1a4cc6928523e77213d00b7c0e2028f931feda08813a4415888692c78480292d144128ea35aa4885d9e143100cad6308ebf01365effefcedc9451bc3873ee13c954531abba09597f540ffa3347d0ac34b0b5b827e0166ec2911381e0cda1d9b0a34460eb98e91a448839fa3c193f7f10772993e05818c2a51301784ae362da9003b267fdb073b57d3d58512c74dc0bd6fe983d6316c927b1535f4e9d864507d124fdd21142431f030cf6221d9a2d449185a71077532614104b97441a0ea26348da25f7eaf4f290748d1b16ec07965a8b43cc62a2520e2e4a7aedd81ddee83ffaa7f4b2b1a4c24118ac40728adc1e229ad8189d83d4b4ccbafda23e8f30f32db0b99e3e7b199fee789626557dfacb84e2aec8db59264f51eaeccfc0939e86f0134b302a9dc1ee3d7e103b686b730e92fe35fa0c76c206390d83162f9f947821b7f9e41b58b87c6e9c806e8b04abe88951a57d06db485fae9211e705493bfab080230a4b6988c6af2a6d895f7f7a865c4e742c4bb8ddb51a9ba21d0939641a2358f66dc08c75f7f9e1c4dc69f30ff7402101af97fef915c4391b6cec721dd0bea215764d93ea197f1aed1429a5e6757f37f652b30b4bcfade8b1e7578485583bc1f8274d63ebaa6bf5d55f171d3987004307ca4f64e9e63777d3427b2cf76eb48eea6da7f7b71a4c710276e3fd19b976f0a0b421654479b04f2d85e82d3d5a234bb340fc3ca2facdaa2b6c9fc044161508e4887ee513ef739eef009df9126092c9cbce3d1429113c6f98e0187aa29f267bb218c0af0ffd95241166194a673038454971d1a8ab26139856aee178e87fe511162d8e9da82914fca267ee2f951bd10ca548f51ff072be239f9816ea50172f8987e8ca0d4e728e2f04162aead3b14cff09cac713fdad6a813f7b890a459853bff88961e626090267aaaefd6cd0d28ed1b55ac3588879ba69d7a28493c6ef64e0b2adb3366d5c595473d38f6e5aca44c9e9069d8979a2c44076bb7f5a3f27b296973267564f21fa86549ec382ba4586f22221df9c08f60499a3adcfb805fa38e4f990cb2241372adcf7a2d74e2ff4300d42ba949475c96d67c097a657832c20f2420cb3323cbc66b863c6fcd23107f3d29c99683f319fd29cb168df98dbc1eb0f4fc27da44427a2817620a892efe64033528dab2a3f146f891ad18265c0b2e67ba6ec79c394fb83f6e4b7c6ce122a5e2ac70aae60c23ecddc2226ba0de4ec40c4ab34b84bc3e5328026d5b3f921a0142165da76345a321421dea19a4ec0f8cc324c55f7d232b9994fe3b142f0213e6229597aa24e8017e9c7875c993a66ddaee811c5c04ffa4366cd1ecdf2c0acafce7893986510b0f00d11af576b584c26e780c57d34b238386ab1e461fcd95028bda7fcb29754d22f9415f9a67a6f100f345a390fc6d950fb6231cd5ccb2ff3b0a4d0afc2f8bea3b3786c6998ab4e3829a542215e023b9815302e51ab4f11c99ea398a5dd28ca6d33737218f27908110729689ca86e845925541d732a31b515c472586a0462c374ec9ac1732d0a83bc2a825e15b5ad10c157d361b6e13704d481d9d8d3b761dcfaddc087d607900fd1e0939213f53de8bb8cbfaf7c6b9809f847fe8c013228d050d4ab08e229298fb807608648280a8a87f1fb0641e3bff0984d4fcfb1396eababed00521161fa141191eabade739f31dafefa52130419e7f16c753fbe8ac87cc3b483c6f02f5ae8d49e64e70ec3a61e38cb79023d870de025b4a6d7686cb420e04321e0bdb9d967abd179d55248902a9c0a2998f0f6e843c1db7aed3734249aa3182d6507d643635fa5a75256587b5f2bbaa15b98d120866639718cb40f45e4007d1ca1b8b6300a1b705ae2057b6df815cbe0cb5dd9330783517f233f59ea45104a47cdbc7e18411acbabe162967b12d98e4c1cd164dd750489780a60844ec3d436adadfe0b6044a6c690b0c00c04850feef34393db3290ffe52bd43f0414b13c1d3fd162c89f6a136854679cbe2cce58490cb80a55ae3b297c6f5386fd1f040e482bf7529e786e5587ba5b0270202563ba7b6b43d8723d42a5bc08ef34300ac191705b944c1abcfb4ba7a77a031b9c8d11a066fe61cc16b6b9ecdb40dd3bad235ab4d5aecac495c96ddf988324534984240f57f0be90c0a999cc1c6f82715fdb93d9ef12199cf299b84915f5e459caeb87bb2cface4253241a21c370333116568468b73540bf3a8ab35de8bf9e3b021b294bd2e78ea8c7008e9a4a495990554e344ee4798f9131f30a600d803955f7588fb35f490339bd2ee6b1130d975282866cdd58118bf52230fa8f8696a400468c1aa8b52067910522cf1afdb9be47fca78644cc5d31cdb3b379e2c64e346004486d1e7486949761b68e2d557132519e295b27300e3cd5c2652bf0b72f2cb520f44f660a3750210465bcf1e939eabd629ad06f43e48c1144dc88c80561af48bb27d930c96b8c4c00ffd92fd9d84b6869697efa8cf67425952bd865196d22fe547629356eab6980752202b17c5338243cff8b24288e1ef61c0e8002431a15452001b608d91e01d133740e172ef68fc006d291ef8c3543fc787422186150939fe155f9a3fcdf3158a3fd951eed0b2bc9975778916a0d434f9ee45c49d1036de5e05888af2714c493c0ee73a248a7fa792235979e6acfc777d92a3e0a9f54221bd17d1e2e9f20356a0fb75c12e6bcfd9f46b9ca5c18cde30448409c00cbd07601ad898522cb5b2e316a3c2a8bc8a72ac843e5652e76f984548d4be4834f8f0ec7935ed02f30590e478a938ec6f07eba7029b858912546381e743ee7b3f0cbc1eeaeadb4618ff3837960fe256043092365d7464f1586029f0c1215c0443a8588019645599437c24e1f10f64d73e552e8d9f38827cc7013740a59c4058583e45919a33d098291e1869ef07796608468624c3711e0995b852ea5b7259c9c5dc916762c1d8345f2ccb53f2e0094133dcc48f1ef33e8dc83259047dc2772e0cdf45040095eaa2737e633a348a796aaa257db04f1aa7d8a22bc4156dd77a56d8c97f394fed28e9c10c458864d90e566f84a74e57ecf81f1b961fedcd26b50476a32f9daaf41fd1e3a69bb4d8ca8eee1f5265e69b1740f6c3b5681f36b53557dd43d0ee3a97499b76e6088d6fd5ed66d06bf465094d353c6e357506ae28e1b1057dd375760c9271eff4f3df35ce0a3e214794e30a8a0bd0c1dcf421f6fdb4d086ea8e15dd5b81e2c00447e563824fc672ed7eabf2cd4818b26d2ac16f9d71249b62e861b4132327ba18a39d2d283f18da07703f1e5f5ec886b14bcaefe653d4349d65be6022761c5b4b40b229a95e729589caf61ac34db0e31f7822719d7d473d86ff0df34a80a7211c289a0c0768a2f7c4486ea10cf4678840f96cfc2afcca6574128c6895b79134ed09242e8085271602ec0fc74a32afb8ab47b0fd14f423b9c1c7bae6576dba4e6ea50383f525ecac121084df6d71da0f8b2ebbda65b84acf919af5b288df297eed91ce5e0e64900b363776e30a977de1456c0d1f544617156daae885caddaf920a36613dfa127a9d06c0dc781d2a8cad6c8056838d22017447b4d9ce6266adfff98ed589161e7cb222dd010d9de9cbdc32a4feb7d0d26934c426e076912bd2a0be83ff94ea57387bedfa51ffe0321690e3a88882aec199bcb2a203a10fa79baef3816a668cd039d86d0287245190c6c4a7aece1f3356cfab0f544a99b2eb0abe21fb017233711519f7be8def50193decf76dc48a54e8254aff4b6d547855c4ec706e139381f6f121874f084e195033af4a236bdffa28f712430749a5b6de1be55004f97d3e46eb13f6052b6a95f86268b41d328598a3a5983d0650f880d230df16b89a613ad83fcdfc853e88aa221d633ebb8d8717031a729d0de408a3dbce230dba12bc8fec94b03f2b15f691494de7f9221ec47989488e424bbb332a036c90c0eda215a18ff028e59a51f0138d02c6da286d5e1cccf245c0f3e53ca2690bd5dc198c5eca08e798a4cea118cbd7f6a5dd0eef4444ea434f48e86454d953897573755af938c161dfbe5b85ad354456237e5862648e981f3dad6cf9833b6e6b89041a243b23180b94eff4fc84ff2c6cb6f55c1eda2091b44242403591566a6f6c4d579944a132bd232da7e959e772da3bed97363843310737f406e52247fdd0a5293545a13bcb2b7cfcd0e14957dbb712c5241ed22c27bb4d4c2e86ea9cd291fbf532c2cb0a5c7fa414bfab925ed14488d2f2d81073d5d09abe746b7d7e288bbabb323d7d3e240292cdc69b5382c41e4124b50b8de05b5b6eef063d523449f190e1a409c0928d7cdd5b6e6c3c7e9c004ac0f3cbfc0cb5726c824588da698a500fb3915efb59a82c7d34f2400c96f1d6d96bdedf55434b8e0fdce37066395e057db754388e6545061b9ea244f826c59b9e5ad4485dca71d7247d0a1c1471402807a7e5ca19b49c79311dad45ab783d1250b56a5a48d59b7e53efa393fcbe0acc72b1974c6587acb589fc3e25fe2fc6ee8be1d6bd8dffef7f4b0ac655fe0ad04d2685f9a878f619af48dda9918233949c8256f8877e0f54b44c29845b01f4d3ca9a11c5e64706e985dae248ca9db70197f43d480b5b04a0f38c2d0458d330e1221ec2a93c3a90c11d462383eb5641747b65bf50ed46f96daa9c12ea372da4f67fd0611c0897873ac4489196ea8ac22dc0e4360577b50205c5a072fd6088c59e246e1dca86ceb33c88244111e35f5a503342e2ace64bf934d7cbc52728109123e8b98ca8a290e8be56a270d32a3283db45c0f5640bf8edf7ef0c4ed2011fec32ab5641f9b81d64f88cee88965cb6f9cc83730e26caa924faa52bfef44a51db2f7384f924947e35ddb37b6ea33e15eed5598cf54c2f5ecec69916ba344f4b302d1bc8472a6d6ea9550e7159170d2348b6273894bb384ef6d523f5c5cf0780d3eaee0c1052b4a707f9393f56777063d52f4cfb1636eecba087b56484ae7900617b1f544456869db99cd53ace5ab1219f71a3c5afa631b854cc887e75ab14c28897f7b88aa146bb0e1a272651b6ca0aacb35fbe09259bcf3060bcec6914e27499b81f19becd4ec3d7926b0d04c3ab59afb58987a06e1b7fd5621e8db165c229f2b1a5b842789d31e2d37aa2206e086257beebeaa72457e000a90ae415b3ef4d98510e6272956048d5cd7c9ca07fe236c62dbc102206dfa824e729bdc37030b6b3d4a402e8cf9ae3d4a9ffcb9a044e35a616e79164abf757021a7bbd443a12dbe993bfc4151bd45ec8297f479037c66d8fbdf49df353444f26471eb85d69785d7e8eb0a97298faa98ad4f422947f4c8af4edcb1624fb375357fd475cab97ad8a7537da246596b2d6d15df43062a9b676e16405f3d7e44413d311a9e80431e2fe89800672f7d75e7187489f2aaad00497ebd0b8a330842acdf40bb42b96eadf832546b5714bfd2a3e7c6b5424801e4224a07537faa85283893aac21ed4ae0255931d45ed90337bf4662e42641cc5bc8e196fd21fc91ce005092cc080f6901d4f2d450aa6fc582887906fbc4c2e0c0886a5a362b07c309029a8b601258942bce2b010b654341a40acc00d57b93a003a8c38e684e8a6878dcf9937049fc28ae78c1ac75e2bf75305dc6e2f9d1f6caefd971d0320bf8ba8475447f58ae39ad603c8639b262a83f376b79f62c6d05a59f01c2117690569ecfd91d869f76cc08d3b3f5a077c0905cd2a127ce6b38e51dedbdd58f02f8ba8b07862f9c99dfdba72ebeff51c25b1fc7a18dfbd834d117cf3163e96c8ad1091f46e85aaafb44d38d4db9543a5e4036e53060f4ee902d10aa8877736393605abbfcedcff37eec32f716a01a8e64540d7247a535d3a8eb1e58dc6687833f876db37626ef10ef45974359a1b4a09f7baf1caacab8cd3f46090d89135b3178f9674269dc056724a8546b06fcf3524f5922018fb21a38d446378687bd2459c30f5fe0f9191304f65f4b66ada8eb79f18aa3b929a6bc5bf43a0feb63b3b54bfcbafadbbe8422e1c1fd2028c3feba154ccf50f92327815999e42244ec05b791240d21bcba5a607613d9afad4634511911eb61b2b53dfc8af3062b08a8d497643170457037a454883273a246b24044783e780494d93d534842f6803464b57eb6c716b3ad890598a273e3b299e7a2ed097c07b4c1e842ef40ffe7355b9ec228428c48688dd4b33173b397ad79db41f3e11ed8722176767454594960b66a7fb0e0c0f6c096275b00fd338842b6db4c84347cb633e66ca8d197ffd44d3d2496b324efb82d05c34278b92d7317ee41b431a9c57069380b98ea7d637ba3684e3dd881a5292aca4880b41e6c74285f1a63382434d1e4bb1ea02c59521f6f8531984a02624b7f2aeb64d36c7c0eddf39b19d7f3cf07b6ed33a83f4bf4b9ae9989d88857537a7c61b65d7c746eb371252c6a5b6af08fc7296acd169d453fcb0737c094dc2c76e6ace5369c3cfb356973dc08703c22799aabdaaabb02cfd6ed15f890fe23d77f9d521668e84bd5c952fcea3efdefc31f2c4d3bbc102f3e2c1daf5b6279184bd18a77cdd39c5c4076311b3fdc19ba0963da1d1aebf5f752dd87b85be9734f0e53eca1f9143e5b6ac05857daa1466c78a0d03f4942c9cfd572013ec754e154229d69cb4fa46c8e14f513f3cf541f5113614243eb40372a73a6dc45039a97e964ef61947b70cca593117e8a8196446e12637f0cee80d7c0397c354218b2493574e28583c05c420788f5b978681ea9648e775bfc0b8af336da6d17bb09878a0ba32829a8096c0595c9589f116d6c2967d838687bdd86c6ae7a1457c8a760c14ea024a7e12836c9418b6a521c99646ef97dd53153a55ab25e5a33ff59643f09d2f2a443256d524f314f13c5626944a0e415f1f6f61da86600ace922a2fa8dfd7caa94c107c695e5757e6f5a0bacd69d53bdeb090c66d45fe87f01aa3c5d43a9fa59f2843837b1fc9bc8e6e87c02dba347cc51c1ba9f33e90110e7f813a2e367f78624ec394042121e9f8b8e44fee8dbb116f8a49f41625ba1a8d9ad1d4afe1a98eef0bc3fb1ce345ac9879895e47151d91e2e4eda84059b61e1c904812e6717e830953d58bbaad652227c1509767f387b40f6afb6434ca608e6fcc5d5eb6c43874b8262d4f56773fb429f20d3db499e6876ca9d0d83977ce1602db595b55626480e535158ad335a9f86f6ff215112a31ab488746f2542c89787543062cc553c29a69e417ae3c710ae87385e595a1f8605c7fdc1aa5468535d787b149b9c38ba8d81b066423d87f254c7c251444306d77d402f254f8e6313936d817e7f69fbfc1841b423716c194d770c32cfb261cf94c4266e660091d58388a6218c92480f4c606836f634384b1b378cabfca08ea60509f8c8558a350fc6e857aa3227f90181cc9fccff8bc6958f4e5a202353a2353251cda90e6a641f10fc41bc62f95f2b0c3bb9b72514724d16906d902103b1caf974832c5d8f4d7fdea9d5c81c3f8e1ee2f5095a3b8879bd5d111fffc23b61db436563bf596a8930056313967bbf409fd4ee69147f5b25c2eb32c7c396fc5e265b01c211af42b49e69d0ebb9d462a76223a24eb178fccde99cd76af91c1eb02ecad47ce8e8950c0d75f3779e9ba792fcbf26b8f63fe76913a42205e3d8eb6bbc551daa6d18262a334d303785667e4523d8cdef84a5cec0e83179f1f971b0df75a07e9887d95b6ae7bfb79d223eb2df95ba383625217a98b473a66b3fe6371d52b86592f52df0f63962355c5a9e93ade295445fbc1d2d6c49d4b335ed7c8995c662c9f1d8415049eeb24b559ac9d6500de7b828c799c001aaee043026f8870fd1160316f9ae03030c1b7469ef0af1bd83478e844704bde942c3335dece198b854ce0e96f545cd0b95885a8e97c1624f5da483de288d8ac74d1285d2c1fd74ecfc8cb57e00667876c0888e528a27559b12ca4ddc487cda36fa6bd2ff4f2c736a5daed90761d64d980a92b357ef0bc7210dec05699f81a10b29a8b784986f37edef1a4f3ad68558f4b38e543a981d51f44ef7ea8d7a058102c428c3593857c740a6bbb40acdad7aeda4c06c41a4e3976835b1bed5ee16644d554f63ca80f3f968896d2ec521ce91579e04a35bd1de50fe71cbda7986267013143aa1f7ca22e0d99c61e0e8a72fa604f69312000049a16440c35ecc882efa6930b5a0c187e1d1cba96c2fc04532c376d201ed31928f8930800a19092b1e7a3bc32b8f62856f8356d7d601bcbf56625404a3e60b3c7bfd95115abc50077f5820282701237c8703d26bd18c9f06a00f89ca39e416dbb65cbde86c3a4480cf4151707cfc2659c1dda31860a26afb022210daefad2369324c2f9fa48104b931d3b8a6a2eeca453831bd70b6c7bd565a747a415c22d9d521266d583ba0fa1756960c462a2fffc74d1ab4a1737d12bb7a7374a391544af69e6f36dc18687d603d2643d1e5748005356932ad3918d4949d744e102fd69244ef2f0c50302cf0cbea7e0a7a23fafd662616b92e15564db9a5bbd0ce1cb044e00603cdbe6fb4cf3eaaac2cf53740a31249389d751b9ab747c4debcdfa955926ad3dffb9c13a8f72453a329fd51ca5c632b63f9e61f33fbfccc4d68fe40390f5f14422c0634497ae05973c481e773b462a1e529739188983043a5fb9757c51a571f26b481a63be01e5b4ed273d34dffb93034ae0746ee952d7185293e8c393aced94b839060faab387187bcd507facd92d8f78f176b48276e298c1236d3edb8ad44a6694dc5a91838cbccb68502bb4318a46c9281e545f2549a5493c026fb762ec6284ffe57729dd3922556630100966fb982f88b940faa5049dd9c850f0e8ed9832104e48b9d8aae8e8634125a9992207fa9202808a5b91c30e2dfa8f1cb30c12b2f6c108433c46ac9f0eac6c9d6c203d9d96879e4226afad1046ab89355876eee27d394d09f570ae79e063856d7fbe65d004b70c8dfe47f83dac4b6c94c61dd926b43cb7a24306e90febcc2ce12498866ce3f36c1d32ba3a50d27930ae8a7c913e5c6f3a9e076be4bc27990c8698e6a9354e9a70df1f2db9e6d6a7b6f783a6c535bea065b8aece8f4d052591752fdbd486453c9c611b4474a1490d3fb862627e8825725114864bbbdab015f1779a0658848871f371f3576add4d3b61fd281f9e953466e043713a290202bdbbd7f0cf016c9956084d96c56ba0d2a1002f8bd6279ecb4a65d5f6b5f812430043e3f7527430310f2c6681568ebae64ddc48ee4d172d21d76b5b35f374246d1a0f111d57c8aa6001b0095a952b9c415e3eb0abb20391f26bf20c599f4fa205b1269d97c045068df468628d3860b7501e6e4deaa493864122bf31949366b4d846d9ccd29c73322fcc6851fa95cd14e1b576e169763a959072fef05954b37ffccdf234571789743757a7c3b1b76a456d5f9d9b35d1c4d27453875abb4b0f2e3e554608083443a0e0aa98878d4b1c487ef06da1cceac1b5c0a9fc9a988141ddb04770cf0d3a0f2a37a979254708ceab78a23d751165b09d16d400a0f32c7ca269836528768ba5eafba13d1005bb8723a910b3593e044909de2ab2761bf97b1ec5c714ba0d43699e347e80ceeb4d05dab9028efa0e107437d0d2b7c7d310b6ad07e0d240d0b212836bdab9320dc0454f0382e8b1c8f0a587a8a8720edfc8dc3b26fb60303df3c7b444a4499be2a4c5785cdc3435306386cfd4d45650688397d292a042a0037e75d8a716e5a47081ee905c70499d116f3279a4ed867d944fa472088e39744571d549b5a5eaa474481d0bb119e3ddb40a57c7ce47ced0833c2bc090f2f3dd2f5733a2a2b12d8c0dc0a098ad25185de7d0618b70108d287b13f1b6f26d45ec80b722b34b3b8a9ee0a3a2da158bbd064de77ee1b0f4e715fab284287d652b3e8b4afb1a83116d859a0701957f27b8e12e31a5794b8f8466bff8b9bf9db13cdff2f0480d82cb85c7afd805d8a16d85e0c5412ef2482e977ee4413b6c377711405d6b5d293babb05f7740e39c50e95f51b242e73e3b458a428340e1a4083ff0d8961aabbe1916a298ea69e17ab94b025d6445e20eb3d2103b8231c3da0bc950647f891c5be9ed78b06c6bed9b96df81a971f005168b4abba983cbdab470193aa2f0856b6924863ab9aadee876d1547f6719584f525cef3d51b96c3e840d50ca997905ed20c61291983b6993d6b8d0cf128166df37091fad9ace6cee727878f025558fb6fd72673d54f10ffc74cedecd1e1cf929ecf81195b6b69c671b2fe93113e1bbd1cfebfe627f18091b6434c52badf00d5f1bbdd69a8e5eaf6d8314aa107efa01ec55da0d6b1b49bcfec08239cda2e54c35ef14ba936fa077511c28790716b0bcfd1ed0b81e2396158ed409de0bafa564844902ff477220aad92ffeec987501717a725555d3e2b2d709303bb644ff144e37d481591a41a27d4a3592faafeb8fc8d8c91ec1fcbc69f7d2c9b30e1e56180b247d669ec60f2a421783e3252f4236280b418f2efe30cc55c87bb9655ac1484ea6bf77a23af45f8280d3c7831eed64dc1abffa967130559f1b2a11627ef23836d76f45821d99fadac20db1795debd6679c530816cfc20177c0e3e2a75d1fa159fea01c42db7777bc8380243c6621f4d2cb95ab64aba6d19c0bf9db12ae7c223a43c6fbd254804338ef370d0c6354974669bf1a49740e047cd732536f75b86b3189671aec46e80af1ddabf3bc692170a5fa61dd9db5dacb4c805371572e69724f9df5b4cc423173851ef20191f9dd3ce0d4545a5cbb6efe33409aa476dd3530ddf246c838b5c3a97cfc5fc03bd9c645290386d8d62470e1ffdb41dfd20d1a17ce881c871038ab0182ece0d40328d70bc3273c19bf75972f7dd40fe4bf38f902b3fb638fd31a534d934b1206c22fa87180196a0e115588d0115b787ea3a8102e3eab81d49cbe8caa130f8833dc3101fdcc5b9c996ecb19371c70a212edaf8b9fb0868c8d16c8942fcb81bb7a6085a81f1ad507fbf50ebc7bf9c6065b76b4def9db0e0df8a0cef58b62c8affb3604a65ae24f4fac7b6294743eda36ee40a1ab6d739b56011dc682ace1e2f905d677856105b1b50343450466ae7a6adf05af7e608ce12fa52b041155b31a26455b7dd2f871caf9bbc938f58f29b099b47473253c373ca0494df4b456581399d494694b310315ea275f306d8f5f1e40ca1b8f038f7693f5dd304e154f9a67bd201ca0e4889a575a1e1cf7dec0ac18399da364bfa7aee77b483b06fe9d975ab24d3a4f1d1455466086134c5f100e9586691be6679b23302e0f8df1d4ffbd256f2c6f697fdd546f668f9c3169c9793991d20b22ef3e86053fef1eba001b98d851382cc0a5f1daf00f7c4913f1661e98b65cdf3c459a9b4862b46461e9ceadbd1cce991b22b2bf91a91d8473cb2588a8034fe44b1a8f4254e7d8e83bad9966051e000b7608fb440d020e53d4e695a46d145a69bcc1b49e488df8c66c961a6b1c5a8f9a1809262c60c00d469ae4840210f224c0d5062b02d2e298c049824fcc8ad3de5c82f9091b6e2778a6a4f3df21a093c926e6e324bcdeba3d402b007110bb6c61d1dfb51134ff27d7e9511466ec9c14a5a66354e5c80b7397f6d3f9fb46322b9ea8cfa08b5dfa8ec6afd44b11af1a7d61f80e057418320f56e15585a99cef0461dbf1327bc2102bef09b3e8a118956629c141c0cb2a2a26be85e7e136874ae216ad16451e330fb0497cc9ed5bccd3c560d2d2c05cfa10df63511fba98d46f74101bcb1051e7f4d61000a4b95600c977dca618cbfdf2270560ad9dbaa4251f2c02652ae1d5d41521b3256142a607b3ed1f698fb0803d4a599b4475c305b6cef50cf91828949c9257d8ac1a8b2a2cd0b2949a1054a501f17f20c643201f498d38d3f69fe1652c93469fb1e0b6516fd048924a632a7fd2a53a29ab9b38d79379212534d9cc85f99dcaa8aa0e76327f05a8508b70057567d120b2424365dbc37e23b6e6eaa4423e637b856728791568cc9b91ed533110075765a283d2601f8374bcea84e12bca06dfd7598b1ad8c2818039239506cdb4b861dd6c7be86875bc64545ed9af097df9baf2ab7a9ff1834d32e3bd1c3b3ee1942e415d1406fed18b393980a4bdb4fc414a1d081b92bd64c13c5fb2fb4e89ba3c8b6dd95b957f61f38e1a8b0b69f5aeb0624ad27f5703d05b813c64ad0db9e8b5d944ce40a5f301cfcf3c649e407443b92b905762ff89f930155c66b1c76e99cccd165b8da867a08143ffd523846656f145ebfd91b4c63d0d983a5a57221b7cecf21a370918da336b411f833ed1b1805a3cb7a8fda3db1d2d034248234b27dad3dc4a02abacfdaf3ec423773fb357a75bdbf3766ccbb82f8d5e8ed16b5da8198938e394569cc23d79a4072b354e4cdd16415db8cb3ae5ed57dc92dc397ac73afd525fe02c7dbb4444adef0dbd7045844dbf54eccb6ce006d333ab7dc4942b3aaf61a96adf47131aa643a08beabc88166bc2a04a7164c23bf36d33246a4b493b69374861885b9075452fbba5f9a4dbe6173506a2ba33918e3dd04aa591159bba28bea84c94abc8cd09aad7c2e92b06e278fd2da20ab82e9cd1c348f0058afd7d7734b07c74f3a644648dcc1abde18bb7f4a0ebd5f0dcf18f4f2faf37fc7eaf174b84c7524600823a520bc32d498a68e281f0670a6b514f5aee8c248a068505dd29b029ca2adec44960352594910ecd3b8d033d9e80be3b3bda954adb842d8bb2e1260af852abaa6a802a35869f5d3421fe44e5c71b53a497f76a4267d73a4d5e9f13f976dafa3a834ac4c227a9e657d1cd10f81ca5e56573fc27e14649659a88664717130be2ddbfd4a82ae379433be8c8380282cdc5bdb43c70b4c1d6489d0c6927064e7b45c46f665df2cac9f0702a1cb46095b188381cbba0793e020b4dc482c576e743730e7539a98d5d508e2bef894778ef4a8c76b2a20934d646e9e19fb0bee57339a47e1f2e188183a9f22e66c964133d7421610063efeec360f9e506657cd22c5e18f05570b7b6f88f89cdd80496e01b12f24bc9133c421bfd8b654644916340c8070329b3008b86700fc390a10849d74f99abd8cc333ee688eadd32e98baff5cff6f45c7b349ecb49acefa9420d07300fb54100eada486eb75b24973f4c032e10f6882660903904f87e6f9c3706a69986ab9593a5fa4aa0eec3dbd7960cfc7cfca3ab32b435f53ba7d3e152522150dcbe62e3a8726ec7dfc10189c0fd5daa15b5b4ba2526de7831f8ef0dbc0889f85c48e1aad74c69dfc3363da0edd7098d992640836ecf0dd10eff2ac702213d14abc58277c47fb21d9ea676d6bd070ac8aca07f2e58f37c0f8629d8f26bff39ea549db90678ed5eb6380d005630451b97a7863f1a11df5efc84b24343e9cae58e6d35eb2fc76885007afbe447a2275c1cadd4dd4f60f6b58a1250ac376cb4edfd872e67249f24fc934cb3716a2545e5c0f31afd0fc2fe02925ae67c708303489ced85c3f13bc08722fed895bf2719e5c738f6e04a899dfec5d852cb12a0a9784907b83347c76b373ac4f75bbcb503ef2fd33f4a877a3e8ab7c4af54734e4bb440355a388a6a5019f288143bf1c00bfecd7debd4ba26f78da602482b175326ba7aea5e877a19d85224095008bf04fc4c056aff7c88b3e640873e4a42024d88e77680de2a25b8d1ba0847e78c125fac0e3017a1efa0fa9fcf6d14dcf7499c65409706a367efb56881f2b675f81321ee9372a051598b65b7eda23eb9da3b48aca503ecb3238f95d0efbf182b04f10046f5433c7d88c797b8750778f0400fb7e80a212fd5971dc7696d6aef60bc0521fa8c74bd543aca64238dba22e4733c444787f8bec45907f8e3ac7fd50b7d9478e5b6a5a2f5fbc9ace4e8fb670cdce9ba8dd0224c1895f8738ac43928516b5466a64790ffc0e35f1de0230a49284447990c3caaacd82c8268715c2f0dd55503fa1db4c0e1e3a7a117090428063a50a664e56cf8e076e67a26e2a493faa8009fbd5dbe51aff50461353afef4463962d89ef509ac00d65298e971cf2879f04ed4817ccbd84bfae5ba50ae69f265e5da0f233b51e32ab394b8684c4cf3142e7a820f8d21c1a3479e07745d50c856c85a85427d81c2570713feabc44b3ab833efb56c1a6ac0a35088fd1a70cfb219b5c49ba6b00b24827d930bd8a44a419cd9b8c359e3df95eaf1ff4ab57336eedb873d47a3ca2bced1f821bdab1865a85ee1733612887904891b00f94c3ae7a446390bc1b1f5f869875578abfd2ad341f790d06bf225d5d9387f8cffa5a005d88c6a916b647ea430c5a71da8fb6ab468e5e94e7fc2c4a61dbcdda14d7e09aea2f41d747d37c22f7dea11287ee2c159d7e908573a3af4fb26ceda01f66e23f1981e0d7dfdc7ac3a589da47e49a4e5ef12338d20d7aa115cb63a45e81c4cb59509dc287d045a99fc9823e13fff622c3fe04a7af00126f38beaefe074409d32faa41718f15f1efccad8e28c6ab9e83bc2f3a028912f9aee1d3c32578c08c5d277342945b811fadc63c2eae011a889f974f033c15e49b8203dc24be039abc3e42fbfc5a412a7c8fc7e6e8a1bc3aca619f1c41c503fd125382d0836b697615203b0e6b2c7880c888a79051e08e2ca82b6fccff71d2a69f09898203ca2bca3ff3644dc53a2b096e042a641ca4595eb50a51e3435df9e85fcefb8040cecde7109b7ff969478a2e4a4b0715a0e3824b6fab95cfaaadfc8274bdc03a4267be3dbfdc18d811ddc2f218722de25bae1c91065137edd1495ff8779591561f8114b7cbf311213469d04683955e23d8477692dfbeaf0ced6574ba9366ee0a91c9b9ddfe50930d50df45f1b4280156d793008038682dabdf7b60440bebef207ca1738e076771e469d79cff30d916d375fb3c5a9fe6edba5040225df066e6d7baa26bd710cfd38749a8381ef7d43e4a52423b0a1e340f15611a38459644291d5018cf53ab1659c9ca343fd8a3eb3a483f901bd4b4fbc90672677cbd7f771470a3365ca94c51accf8452d6144cecbefbe1ada74b56c5d8293b57e5aecea33adb38b8bc1dc9490e70532f4aa804edbae3373bd0a0a030755761171f7fba377baf63a167a1d562c980903116d400b34320c8687711f8a75d3ca5d70639125a70e711c43f4e5c4dd2409352e4f721bee08b0631eece14f2138487205736c3cdd46c38787ae5370bcdfbabe6ed7a5421b95bda188abd799ce6ec4be0759cbe83688450f7e1a33916c60d01029fe06e17ab37cd3c4487e800e3378a5294c571f6ab2020af18a837fbde99a0eb6cf44734b6f507ac2ab0fb07cfd67eaaa3c593d37b95422ee565aa47b496507291d89cc893159a446e8e8a713c9f06f0199db6edc62da25dae4e6334ec44312f118c744195c62f325b8b9193333294b4547d2b28d02ee694c3a9ab1ddda66f9f81c6946ad9c5f8e9ce1deb9b8251ba6d14d0ef223259179bbe6fe33ec79920c6d9433ae4166dab1656bda102074375e0c35fda7baa53bf8dea30eac0d45af6dbdd91a4a278e981e8c49d0e150ecb867c3be3948ee169899d61e466f5f80a7861484437c5ba1823a8e0d26dfae85e9d676ed2683a0ef5a8aaa7dd4bd6a72e41917e9c89bd9a0b830115c37bbfd80c2de0e0ae6510c102afcc962135b2dec901dc860546e9dc80e79342dc5118066f002908472461f3c5d66ff2fd4fae37f2683ded5a417f4b4ccdce114646210395e09dc06f985b526fecbeaa6ff5187da2e8651653ef8261d4ad95787b1173787f26c5ef46d8e93118163417b7f4976ebecfd7273c8a6ddd2ac242078c2965a873a6607626f0808ae2814da74e9486e67a6d280063566e360134ebe82a3ab5db5d2617e337ad942f985ee8fb705d91f42eea9a63a51a12920fe0daeeb0cad1b07c7ce9b66676e1e01f97d9265e7de357ce3531ecb8de3b6075c092b0db5ba706cf51fc46002ea89a5505c3012c24a076649d6a3e059d64c4f9e1e197bbaaa3ec587b77ea692677717512e5fdfb2b9f4b4ee953cc0b45c1d5765dc98000c00597408846113b005a29e9444b4210051f00ed5b798b0bd46c48778af908dec4df696524a99929401ee04e104f204940b2b90bb3ce773774e8eeb4c89a85dabacb25dddabaa96ea6404b9e7deb78ee3361e0d6e1fb8a3c11630ccccd030b3d65a6badb56ab56ad45e231503b97a5a76d73c1772f56a9e9335df4170db26c581020a068827c82571c7eb2795441d039880669924a7942d7be29873cefac508367982f16af50f82add60dd60661c56ad06d4a931a9096ab0b18ab1f35c6045e84b7d600991b5713244fcc011da05c1f1c70bc72b4bf5aa4f12e09b8277e00224f8f1e4e4e9e04bc7b572b4f9625c92a5e0cb6ab15c127c01c6bad922b0479ec5002adb5166c2d8001f1d2003b116b12115ce1ba6d0fa4b4daaeadb5d69bdaae8d02a3c028f0da1f519ef6bdf5422f0b71dcbd5164ed5a65955d6bad40b1a7bee2ccdd278cf348e8c9f3815c47cb610de3bc1871eca73c6f2153094b51aaa2d9b4146832c5f752583da25a39a56cd973ce39effbf406be5db1aa529bca3b62844b508fa01e413d82ecfdd5b6b55ab328abc7af2146326d3169e5e0e8096adad20a682bf6d45a6badb5de6bc1562b53211f85a6699aa6691a8bfb98eae9525df7d1449d1bb6c022df5779339eec52a0c91a4dd6baf33a6bcfd108ce9733cc804ad5f4cb961bb3d65a6bad0553b2d381b306e3bc1a5561f8c2d2d0859aa7c3b8948d3af31b3627115d225a6badb5d65e6c73c8b5b76dab75ab73dbea56b96f47e3f89599b560bc37f0237c73e335f3010a120ac21a3373fa1225269261b52bbc117a1020eb46adb58a69977c1967aea4793aa9a1be7c797a9a619cf55276f7fec296e5f9a1c766441d15c11995871cc1c2caa106a04224623225aa6910473faa37a4ea96fa94601cc1084e8e0b3363994c44ca19751040040ea5945909ca510b870fa11af5430813274b50a2644c36212a92b21d4141f0587ada82fc48ca0194032807508e1cf6db3ca0a41c37805adefaa3ea4509d32ce9e86886a48495a31991391b1c21081c76b7101d3d4619a5b70b017febae401dad1c1af1526badb5d67aa73079d86d160b04a7a4be2d3246d3a226880b203a2c5a98b6074a23630a484989d227d55e6dc71356aa9bc958489e5d04692890672af5456eeea28e8a489e958b3af43bae489e330450f886a9b9f42c4989c969c6a47483a419933d610c0e1b09098bb5503ec4e0eef50352ce9892d804c61e4da389a14387f62ced63815f8d19b6cde996974fbb7e85c3fb7aa93c1c150a101ac9f4722106b49cba2debd2b5d65a6badf284fa312a451639264002c99d1face5c2d463967474344352c2cad1acd65aab4c1271fcbd7881028a29a6f8b00c87d2c8884a8fd8d354068cbdece5f8319e002d173dc042bcd054e4b5d789a6e119c573cf6edb76ce3927f5e8aa79efd401052526987336e9232bb23ecad2525a7604da0f749c13a8c061775b585b6badb5d656a96f3f05d4a0d71490c0d188279c7234420750f95e9cd8d3f5c3a834800048171109fa0f893af90a4eec69223a82dbe2056b63ccc1122dc1063881b528d8c183282ee1b014f4eab67b5fe5755efd5651e76ada37e448ae600d9d154c58ad2801724d79b40b8164fab76d5b19747d2df2849627ecb4735c4dcdcd4d8e37801a841183d50db07972448065a854caf568b07cd478c0bdde1701fb9e04382fe509b1404db34b30d45ac10ab672c05a6b4da53e20a52d2fb7ffcdb7676975dbac7f974ed6fcdb48aa1d7a569456abd5daaab9265390d9fa74ca7af5ca3be7cb30033a422499de2f72b3dfa16db34a42b0c4e404253b32ca2245260333beb0738b17e10b3bbbf8d8352dde058d8f2a459dfefe5f010ee31325f344eea722d890f1e12aaf647c88f3ea657c78f34ac6afeec766c4f8b0b388f0b2fb89459d7e9ffee8f7d1127480c32e1a9301f0fd5d64f336ef7de1b5f9ff426cf333be7035635ce4df8bf16af50f82366427c217defc06002fe69b69e385538617b2728c198b853364b9f088c81a2fe4720b8f88cc21550a670ea952c8e5902a85ac1c52a5192ff42c116ac665c9fd292fe472536ffb6283443932e5ea838576c524282ad24aec915c54003561d1075e0ee3535c228be293110f483994474d3c40bd5e2f7fe11c97665872b8f21a5d6303d3a7cf39e79c73ce39e7acb5d63a5d065e2aadd48239b4d64a6fdebf568a6dcda1947a92526b6bb4b67a34dac0260c0deeb5f6beb5f6de7bafb5d65a6bf1bdd75a2b238ebdd7edc735f8442d6df9749df2efddaea5d6526aaf03b0dcafddcfa5ad96bb757777a7dd8f7bd95ab7b57aadd57d561ad0f941b81c3faea67b4e8eee9452fa855cf6201eeeed6830fe0c73353a353a6524817aa1fbb65d5d76b4ab6a3169bbc1a2353c38bcdffdc41002962f14ad64dfde67b5c2d8737250f6972f8d5422cac32c490d36c90854f7c9eb4ad34c0c4a15842e29c906381e703d53dd275696d0a108063d68c10f38b0410dae402145882641c062ff9dedd0c5053388589480468be204560575a625c592b86e83d795ab45d1841328982042cc0b5f9a9a76e081e6051fd0f0258928a00801ebd5afba1c9b7610c10e33ac6c13b3d60b6cf92afec0bef287721e50423f8ac49ab8bbdf2cb3d65a19e030fb09394e53100fe7f199c162e7136747483addbd1edd28a7942d7bcea79eb5564a2ba573cef91199b5523be7acf776d17fd89281e28e7fdcd1385a47b03eabd64c358f0811fb4476ea175965fae9a099b6871ad0a9158965790dae419334f50bb5d4dc34cf8c385c111fd42aba06494bd9dd14fb0f21eda23351a7ff9bc9fee0a4e15076276483ac179392b29d1a70288960924812399122155913094b83eed43c3e830243c65bdeddee2edb299416929456ef1079b6d72212d9e3f71c42bcde81ec4e9d2891fdc6b1ffb4620987144af6a7506e725a4aece97c2f95cdae4cbcce73ce39e79c0a88335aebc3ad9ea4b7731123ccba9656faaf59626d1344f866d65a6badd45e23e0648173b24016b86d330552d448a13b88aab5d61cdba35df5f399f2366d46b1d4d8da83e602c6eac70472f562e43057ef459e78ab695784c1ad32cf39a7cf39e7f576b4eb7e78644e6929ad37ac760e69445162cf9115599212931351bbee6f324aec897d2f639248c8e79d67e5f45904d206f98108cee73c199351a23cb1831049984c27512a25a3c41eeb05c78d1cee06a85dac5953c50e4cb02ee8c2eea7e3b6927fc77141e6c8c88adc12a3d2c4367b4e3965d3d8ad9af74e1b46004246e4a4634b4c4e50311cb277ac8994007f5c090e25193256b4ccc6f0708080949468f2540a29503f7c2dc6597ed82266d679743465528888644541382192c52726ac0a1c4a264c9a1cd5d4b5f57e33ea6c1fc16d4e497d3de04ea5c4d819605bfb6e1a0dcbc7bdf409140907a862cb8ccb0bc7ebb56d1f08beb00e58d230030ea352d0d320af11caaab5d2afa10bcf7ad6b3b60d4a9212939394524a2995fc372882143147875caec9379995e299f17c228eeaf3214684de5a6d68764dc2b471dfd95b6b174d98cf79313c8c269ae022874572b326639dc96ae5e459a62cf56d5f88b54fca9040cdd88ccd582c06552b5485aa50329fad563ebb71e693e9bbcb5ce6b249270fb15f6a913c9cc46995e491518ed31f5f64f9d4fd249fa2cdd6643c76a19c7a16d5515146b99d28b7162445a4724072832448ca442f38183194e573fd6e1bbbe0c4130739ce99a50d4d40c890fd0a01873738c836b20ba0091f209501a2074bd8a05de8010c141d644da8e800eba0eeee2622775393dc2c72777783373f958891e7c53f50c9fe2b2164a7b225fb0f4db2ffed7e1ce4b8161441c514263478e1cb9721a22380b862056178008417683b88c194f9ca21e7c392dc3ffbaf0f5c727f7d822904dde4e6e5244e0eb9fbd48307b237ddc0299122185d7f20f92b5f224cf68fbbc137593e78f3d2a869c6e45457cc2802cf124080a5a7c49c3308779f4d2f350bdf936e7800873b594cef586950ce321631443896a8f3399699191b7fb99361e43933133f1bff76a28edcc93d931d8b13111d0b1619d098f512234ee4d13e09a671fcef18ffacf0226e540145d471191575fc758e701781a9cc36f5e9c7238bc44346f9eb58c16ec5a9c8281b7b1c88a85325fbbb535915417325bbcd4e25eab88ca292fd25145146c51e79352ca366484556fdb0355bcd5302d32bc7ccfe3e50c0e4e397c8053669fdd64e13ae362bcc5c5f85996bfff7ce1238e6f83b4d3865b382fcfaf50342532e5dc6fa0d60069c5d39360951747586c0f32b010cbee955cbc71fa8f5721dccd0948f4fbb260f7edd4b57d8fbd138d40a095d28a5943ee745fa568cb8158994fae84b1670e0f01d3be8cf380629668d1491a152a8748ff62164dd474a29a5945efd1db6c3d12e0f47831e7311296304652cd6d2c891190e5f9952fa2cfc10eaf1f2016a9e08638a4f72b6fd20e304b3d4c58a9c9a3514928114991fe38e06e9c783d2203959bec799d3aad57f7a43907843a44f8394d62f941f06c98929ff5a6b7d9fae3d04853265aec8dc572f6ce59c1c0e1935f7b5909381c8af41b97e4172b2c6e55a670d65909cac7159fb6913c4e60b78ae9ff272f490e10026b02c9379c0d0bdea6bfd800c9162721199a7b8d0a9baeeebbe7af3ebbce88543b1da759eb7a341da43fe94ceeb4965d7f40fa0054fd92492d0e5fec826b2497dfa92a8d65a6bad9f67f739c9b6fb69d2202512124a09111283091c4a2e993e0d2513a72893dab5d42eed6d6c2c7885693ce2c958834a3cfb42da3524a4414a3f7bbb869e841aa44cda85a341fa3faf2170189fa0d06e973fa5af233e9a8520f1690a510e23191eacc8a18cf14c187da01d5442b50813777ac0f153ddeed1b3fcc223d2dd5531eac82955c66bc5742fc6abd53f08f6f6f3d11a29e5a4b266ca0f084d81befc42fbdbab7073f3f601e0853203e0250b9a8f82f1a576496a458d1fe17bd6bf27c2cfa87917dfe253956341029c0232054964820111cadce26bde8607838d079f47c63192e507e4029ea7b860e341efc810cc060f1b9f8d97defc6cc4b24f1b356fc38361283693113151f24292186cc9106c7a359e446af1492ca99f2bb0f62c94e01b06d9a8cf2853e68a5cf3d263ca211228aff95a884c391c3acaf30372f3b306fb280789737ac9f1e6b8d3836cf7973de7b4d141b3e7f98547322543c7449dfed782c32a65c62a95764d59bb1aa9c17e21600f083354a8c274d2e3d7f8efff45d841e63e093b0c9969bc7b2f3ed2f86a91cb56d1781aefd3744ceca1f1fe7484afc617ae58dff78538d778df17de5c13f6de5fc5fb31debff1de6f29351b1df7e9dfa79f4dfddbcfa307e7b8552318610a6c83dadd67a4e2c89b9098cc224ca74fa8f9c5079569c5b37c153ccb18b021124cb1058b1327b8324510c6304182301ce0014c0c49c88c467044822069690c12ec081202e4e08913ecc52339c01132e40006e3fbc80c1d628021b1e101ec088c4fa84de87ff1b1d0262800df9b5391b3dd4fa7e3bebfd5b84e01f57d34d842422c5ad4e47454922c5a7c21ae71fc3863fc31f2fcf8ee7eb0ac8594b1f8421a9a54d7753f34cf22f6a87273df3e854cb248caed7946d519b52b8c5145b34beea614cc3a085dd7e1a7c1342c884dd3bdcd8cea25976ee64ba1f34cf792a95db2e6895188316a576ca424dc74c54a96b0fe1955d7c4a57d911d21c98cbacf668599bb5761e68ef3663e86671314e35f7c8c7ff12cb4cba67b99596850f5dd8538772ede795e7cf760bb587cd7759dea83549e0fd587914b0f1d33afcd78aaef7e28a7ba54eabbd4174a1b1ddc77df7da1cd0a2894295326e3b7d1d18560eebe22d4c55754f3798b0f7fd2090d148c652f3e1b1ed871da014360186fc3038684bd789b0648d88b97b017dfea657c888760367f238393dd0f0623c6934c2e6592cc2c9a45325ec2b8b1f9e13c32bed507e3537d2fbaee87860cd8ba573b05dc18de108cf3629645d72b22637843b0d855bb94c48a6cdf01b229f678b63e6d841544794e16da1585da156de647d88ba7f39bb2fa0883f1d4a75fd17164ada3a125343c310412474a2ff0f1b37eeb984f1fe8e61a4c704ddf689940e0f0f5ba17e3d5eabfc396bfdfc8fe73c98bcebc0cc2caf4b7a65fd8d26b8f939d54c91939a3ea384e76522567a4fc1955c76d3faf68ef3e95f21b82429932da26372935edbf7bbbe7ab00afd813734ee215c55828a9c82ac23bb9bbb74da5cabd331375fafb55b97f015d62334945d68c196e1ef924e2f84b1c2e4ec4f127c0757739257beca9806c250d3a13196bd0bf841f60ff0fc00c3894312a4f3e2010af16232791f20519b2bf27e5d4929adfa38b943e847a74f1510196df1fe77b2bcf14e68cffeeffb47fda46072c7f4b2ab2c00e74bf0ff84683fdaf56834dbd9c0fcc03d002ca2f93b291cfe90c81e33b2b5a0008eaee0412344e292762f31c4c90d25254037f5db93795635395192cf970d2a0a813e7e7d3a39cdf93be1c27ba7dff42ff76a7ee4faf75f76feff6399d0775a278c6c6afb1fb7aff8d4ee7a4f369c7e8eefebdcf9e483958a34d93228ac9aac15ce472c8caad4991c35714295b9ea47c000c114274913d0993449826a26061cbca589517e4fecbd57046e42a66ac6c26bdb13a0d1b96f8aa0a0a7448514c69a4b4ae2aa5ef350dbafabd3d243d44bb8f646354b39ff82164b2a61bb63061419559d193097ab862c3079c9aa077368595b117704162c10a6a789ab243a988871ca06240c306727861e610838d0646e604953db15dd64acbb1a90a95a88b5bd01aa59d4d55a6e800cb7288339eabbf7885abcc906d8e4d5594e4104c928ad1e5d3bf2b6f7f9203581299af42cca9a813032c739822622fe61a3452e2c09455232d31e0c06484820ee4b8818cd10d4f72c8988c40d024070e454088b9f1c2d11b1343c05b8e4c3f48ca360abe3932fd000b93154d389137377d25b9e4dd0f954b344fcde5b7114a43cc8440922f5f0432af620a3250b88c4c2d7ff96422c63849f012de242ab08c32d6904ac50f5d2291650b64523c22b717c3a1ecc29ca9ee2679a4130b1832d99445e934533187f21513569aad8eb01194ec069704a8048d1a495a09cd0c00000000f3150000180c088482c17050302410a4cdf514800e698e3e6a5a3a1348025112043108621808429001c610408c31c0286488c61ca09c917301d80f7496547fc5e65996c1e8f014ec5f8e82d33961170e62825cbe57fafaf4abb07463e4810c39eb04b9497e6f277956a278b1c120fdc05aac2d1becbdf99243e6aa8743b00416fbea99cc2193e56f2904f0cc719a51ae96521768974fa6cef1e68bf7b3bf60ee2a5363ac93b826112c96e2d99db716a5ff556f19d1903af5b6e49a999975e5b8834b7364b86846ab7fc5045eb46a83a09c8a89e7e530d90bf33896c12bfc093c3a630b7fbb542336411ad8fecc6b4ef9675a296e665693566f1fc24b8a520addb75bc81f47aa314057ca3d65fe3393ec62e648763ff5f77ef7ee3d5d89e91e97dbc1911ff7ff0b098fc6c1053ac9a4d3fa120fbb47b567d80d096afef912a82f8f26d812c9d90c5b775b47b1d5157477756ff4571757fc682aefe749075c5326659cadf38310cc528c83fbc14349327995199de2145776cc498b84ea7f5171a42d7b5720530c3631912c0dd7804d7556dcf9c18a8c9a21f1b7ea78f07872ac57b69822f48c22d4ad6b4a8e9f7e8b8e94a1d7de44ea6f3ccb9bafe3a7d3eae94ebe0d826ddbd03c04de2e331d436dee7766dc9ba66711eeff1508272b7c13b403aba1d8acd1d04288231061a42e48f39750cd072f3db3d86cb5208c98375a09512905529074d2ce58b4d157a5dfdce10a09ab231c79091d5e8f2487487ac3d9ab1a588036379af2097a29632ff4513e89e92d471b04587b26cd3e724fb71bd3ce415edad7e4586e4c47c42989ad2cd1d54ccf45c5008cca5d81199fb77092ce9d99b98bd7c96dd771114765e3a6a04b1815575ae9d7baf30984ea28421da5e7b3f45a910ea906c9461d7b65ff972dc7e71a5ba7c10616b97857e0924cf64319d59205a89492e12b4d2615f8dfbf0be09f22db33447171380c3d8ae6de0d51455dc26aa64b0734886b96aa8f1306ae9a9b31aefb5974a74a80dfbe00cfc2f7fc81d5d8607b1cc28a70f0d437500e3f8589fd5e3218675f31a17348316e1543d04484b245efc97c1fe43004d8707b7a1f7c001775311adf57074929ef4d307ed34ce24965b50b2684141e5977b1264c560eaa3e16c284a8739b85ce6c1d0590eebee731fd1c3add9a3717b15970f38f65c65bd7822499f5900a872338bc1edf2242d0bec08cfd1e5b10d2ae868fdba9e3d5766ad074e2b5e42ad788cf2eb6b893eca2fc594ebd25a11cd1f84db830dc4ce1eda6d08ec94613e71e25a218975758f84c8692f0ec81e9e8b114cf7008d3ed27f1b3c9d7c5642cb0327600d0fb2a9e69ce1cbf2dae5432857284ec180b550a29f21224aff7a4b9bebf040e759b638f01a61778bf5f375ba10efcafd5c63d073a55d6618ffb96f0b9bb183708b0a21cb700699c98ced40acf48c91979668be11c123e9a54dc8c874e813ca66c6e71e0572427fe0bac61e4673613b25b50fa85dc354de1966030aebd93c96fc03243ccaaed71bbbaf0a57d4652712455071d0fddf0a111183aa7d0975d769583c1d521f7245b8e1f11da9a81ff6d022bdb552d438d3cbacf221be4d62bd9e68c61b93a19ed0793d51976280e828bd8b2c295c8b2446215b468460355cdf1da5ce52bd726cc340f4d4a564652a5c747338b2012a13e7e57ee939e0930a73c7e846d71df1f5ade663da30a7e5d5aea89f2736dd25e32a882bf6da3d1a88fed9abaf5cb0329094499c1c515daad81b2c91fa9b85839ec80efd8efa96bc7ed59e26b5734680033770bb666ffc3214885abd17a3d801f4c04a26fb0b34104d2cc4df87b5fabe38cf52068715c543d0439f47f089cf231783770388588e3028b358618c7c33455e0c6cd79cf49cca361798564bd0f7ffec75d650a80a07027293238d60e701693735a19b8e8bd8780d38e0e98d4742f7b3b572ca7f09c7ecfb62147f57833637a007d9883595dc62c265489577740c9b7875dcd79498e403483941693423b7cc3fb2e003a4cfbc3041537bae1d7eb21e3b341ad399fc8f83ad647bc21805e2c94ebb40b32934eafd61aaf4b534791b446519718d0ee5ea8b063787c3126535f12161fc112b6cc754909ef0c53e4b6ba132ea6c0e5e4aae5abbd8bb3456d7a45d6ab5a56a40f887e987b89101d06d3ba0b91c2b200cc0f4adc53555260d2e8f8636d8444b15e832a1c6a4c2b85ef3ba4888675251d578d72bb141dfe93216917cae092540db889381169033d9411425785b6ffad2e195a042594b7fc7c23f748627524037ab20b19669937a9fc784dbb68848b3e4271249c31da51ad15f733a4cef7701335235f6275c7fcb495f75516efe88fb93e825e33e742323b0568ecdb52b7e1b866c4d3da0caf2dfa2008e103060c93003730b24a379e756c84930e0fc39ca022d3102a275f44b6192b322d44cd8ab19cd2fb9cd2d4ebef4ee03f8f7a8f8c4342354074ba6119accdf1e66ff43fb80fce34f2ad88990d23825d6745a7872da341eaefcb375f5e82e89dc3813dde255381d2815877f267309671267c8b7d1819646bad4ce50feecd86fa1de176f843c3f09cddd2131df4de77dc20da8cf4476d3d5543993b03bc1ebe159f9b0f1bf47156e7408459c0408b3b815bf36141cbda19e33efd25ec843daa5545cdbbd5be21057720b94f2859ba4125e8a2faad083cfb6a3be488b7f6408c873debf64b5cd9c0a8fadb0054df46984212a5d6b20d2f0b049bfdfb266e9a331f2dc815a76283d0f9c5980504e5ded424aeed3ecd5ba7e693a0b203f286a49e768033350d789049042064f88adc4de650ea909e26412667a08d677ec516e8ad513ac45c528413dd123e2e13798dfac4c03f4162c1ad4cb121dc5c3fa29988682801f0acc7f5399248865374eb1c8140b9c88e0fec8c41df1cbf8b655fd61e790ccd2f7d04f00da61a990ace1e154f78586c32d06dfe5aa6f6447ee37dd32f7a8dd16dfaf82d1383ba6ea82d6d93bb768850da3afe3eb711096a55a60cd95ee5f3e13c185ba979693ac4e3ab496f96fa1a17d8170fd73fc7a4210df74bfe677714512c98a3329560821d0dd32c4c314910991fd13bee6b56c442f8d7fc13fc9a1860f0dc10d694a1c23118c4d372aa987eaf01e2b96a787a5b75e6f46927cff331e25afd70e95792bfaa2075667121ba652559da47ab4ac0f78438f4b00017b6b7da7e8489359337b3a09681d94868b1141988973d5f6f3e03dfdd259e22a6752fbbe72b70088d689ed6283c7b208b6db6ec074b6dc408b19ccd8592ad7c9fb162c3ab1f17cff355add75c1eb577e5cf817ca996cf25f8fd0906eab4673de6f23cb30267ebece4beabbe2452cc916b8461972ef6f863321d6087ca2fa4709bf219f3223e13172ec4a410fc84245b882cc70cd1f969387e4c78ed19b2f1f588b318f7e794a0321c2a4127982c988564060c872832a7c9c3baf5488647cf431c84e1ef8b992667cea04108f95d70786542831805858e6a9c12e4069dc629ad52a068015386bdbba812abcdf85f999064fea7743aba0288720835ddbb2e10917fce7535a03ac18d6fb90fb21c76f8be100f03a285e552e969a9e5781aa95c362c57fc2dc54c3cef0712294ddab49010d0a6be9c6b1e383f8adb0b901f06503261ac6c7fad1b4ccfe75660d166bbc1beb63e56b5c95cacc8a2997101d3acc4434a029c697390e605fbfa2ce88834487a9eeeafce794334d7edf04273ffe922ed56e570b43d8b8dee6743d927e69bab3438016e1ef69e179dcd71b8162d410b094947ff02a729759f07bd519b095ca975aa51663695d12896483ce44a836f1a0e89a4643c514d5f60f4e3a75f21280bc77af18e52fbe0b96bcbe1f82ae7ea9d764a4562f9887373a03efa5386ee07b00a28262446b36ff8e075074852715ca138aea023b0fc4a6da827fee203d1ed03894a63702567f8562fa33308f5293eff23651ce229c3e7a6dbb6a330b4e69a38dc5f104adda60a59abfa10da002f9700c97a8975a6eb5d7f5542484080a01b9591134376fbffc2093741e78e444d6633778232d520d8178b3b37f5e1c3d7211a4609497bc05bcfdd2754a110d76377a1ae279a11096747d1aced5801392029fd3652a35e13c9fb1341325caac97c548994bfe92709b0ae6d676bdb01efcb223c8b767bcd515c2f3d60ffcd79d0664d0f8682f03c3e51b765d679e4798165f7f40fea52ceb9aa62ef5b732cf6ddf25f2b772c4893e7bf1aba7286e750e100037e00a0446e61cbad914387ee7c107a3b5089eead3baee95a428170fa004214356402721cb9f034fb6c56eaef47aef486e5ca283673c8d4a05517e06d2d310119dbd963163982c846a7c0cc2e466bfbc8bf9270c5e2afc4dc766ae8aa22722364296e139081c320e3e83c101ba83a8e7a9e93d39afc1f7323899472473545108d93a45cf3d3c028e9aed5e2b3a740b97c8a4f6f6fa74c0ab9fb5e10f44b5b7cbb09b731ce442870256e90d9f128484fb1df5edd067947330fbe48cae595c8e55e243bc032bf55e4a02bd1264a25a1a69c043ed606c4cb1603de2014aa70e06a53df928d521daa8f2b21a7cd8966d80456fd6be1df80117fe8151a70c69e22848b5185d54e00c61001adc5261a5c731f5f00039c3810d0e1eccfcaa890e34d6bcae99501b5b0baed6913ed1bdb9e470790ee92976c2101c460b340f8caa2f7ed3fefe06b30a2355b3942cab7d9beb6739d1b38b5c9b008b53dd8bca1c6b37538013346a0695a09bf10a4c47c25b152a9ddac9f56c9947e4b70585d9b6bee54ab113845f9c5f5d61ca87791cb51dd42543524c9d5201b8ce1602af6de90ae74f3fd7e72b6f1272e65aca737c37884b46da67fb1d07bc8daa3bd1143ce0721edb2327ad35f6fc7aaffc2b19e24d65a625163207f0ede4cc38dc8860466dfdc873fb38370f6b85b418fccc7fcc96e54e665429a861608bd924d4baca9e9997021ccf135ee9419a37a970473ec8f6e4a855a635acfc7486c5f4c83c49bc7f2c02ff187c7572339dcf0d2eddde450361a95414865fbc44568a2e256540ede6ba8051d5e69fe9e2a641e1e6b371e84c9098e611acd3ab96fb379e84716715c7afbe1f10c6585b60d2f69e7e3e13eddd23c7a0ce54909135377188a4092522325c8eb473f7ac1d4877ef09d2900832c7c95ed5355d20492411240aa4826d47f23c8a20edd1b53bdb532c085216ec5d7009abdd2282351785a282523d17aaa7803c48100303e40291b24f9bdec93f1561c4fb9d131a7bf46c6c1770e01a4b750fff4c800d699e0c42ffbf4331bd18d4b2ef7800368fdbc03a01e7cec27af3bb42fc1174bbe26a542e6464651a093b69155f937797f820812de01a16da955a4f825b1cfadb0497e518d1937d4a05873028ef9bd4031ea1d64a4a1afcef19d7bb71fea19de2907bcb866a04de77d05d218d16556b626c74f4de6ab91869eaad0cf290db2ae1118a844dd7836a76caa804aed35757fbae07b872448ba8154489a9109be5b5bc00bd711be978f795dbd9d0f6666bfb0f315984d7a577c28872ba2e88585e639cb9e4cd0e13be790922607383bba5de6aafed4fe1ba7751522732386bf6c15843f0e1d0e81597dfc2368b2f538cd7918597d9ac2be6c8c0fa2a8f4fb8f0788a7ae3bb6fe255fb5158a85fa6f4b0ff00a94ed2d10241023dcffd23475bec86ec8453ee27d8c3068c227e68af055acbe11d1fa166a2a7a57d448f7dda4efa4429af5c6c39df0225d3c0349cec0fa10c554925af59967cb13526af3633c8f38feda1072f5d2a7fc36fcc6e597f4c9eab9070326705e7f24499916092b1fd5b9ae061e2a27b209d8612d923e12aa99e331765307bfa03701b421b8aac2ec4abc340d7e84ddb2b854ed79b548ae56bf0c67e8de628674cc4e46fbe5c38c76dc1cedb44ae5a007cc2165a912540b85d64b2fd23511fc596ca66fa6a067d7837036d4ae6eea5ef84fd8f16bd714bba84cc719b7600105d782929176a0c18011ef54729ba7e3d5fdcc262707021cc3fce4bd661bc0d4a84fe4b9ae97417c27f1ed8f61836080ecb3f3170f551ab948f4d92bb27fb91b080c15adc76fb415c2ec478394a2e083aa8803eacf5e7a4668c2f0f202657d1308c16453b5186e6e73d84d790844a13c4705a6bfe23db667c272570548409193d7b40e2b29e0ec0d87f23b960fbe02e8f2e12088f505c9ceebe2001cbef17fea54b77285dcadddf1d336d817e30880dddfa407e40c9f78d17a870dd28c0afb8cee3f6b4284dfbe84e21af30b5dd8b71908cb027325611d0aababee3592e8b76b28b689d5c1679880594c92f2a5d789e4d9519b89b06ca7e414793828a9ab52fdee8e22d3c3fa6501e54a88f3b3593dc1c153e7e9bf829e0cfb39842576272b942aed8c6fc846c06a4aaa7e40b7129c2fee92fd099aa0f8ff7edeb81d0b8d58ed9df6615373b482722fea658262ca0e24888106b0d3b6aac036d52e4f425385c3b3eddc0e7a7f464bfc67e39b6c07612be7ded270d28d3d3701f5f9d38a6e0663f98386b2dd05f48a82c775b130613c090304d078966622ae547812dbb88105bc50e69f57b5a781f04a3b023ec9c7dbbb0856a0d654525fd754e40004efa779d1cab56b23a2142852456c81d7310ee4e7a834687f2402cdb647e282204c5c670c38d527cb44b2e11feac5e4c9880c11b1d04c9c31261bf37a9b4daec38fb32179db7d38a9a87f37918950f59b863ce8741f756a441951193822b44d904a27118b8de2fb16a37be194fb08f7823fbc17adb596340e77f250d5bd59d4043d40410cc33499ee1714944e6f91b21f4beacd1201af961cdf44c297954c47f13b470ff6b889b499c7ebe172e5b570ed03fe5c0c2a9eb3d66f3448b74301e5f6edff2000104d9752304edb5758f30e79a7828702548a3884e5684d80719ca2bc766edf3c1301b4a7a69dc6792a37b113d4c24315bb6fe5ecd8d5392ded88903864f855d4168ba7554bc8be4a3cfa1c2695f2d21c1d0c3517fce04b99263ab3a124e9cbba3cc7b80a7dd025a0cc3beb413f1a403bed8a5119a384dcc0d2ff6ecddad59812edc8bbb23c61b471ef591cb11a9d3d21f15f30850236b8c70937ae556e2257a18c8e0dc4ed37b723c42aa626a2f1a32c3b5453c8c7ca5ae6ec6e51476ebfc974c98fa52db54a5ccb51c7c0994e02b37db35ba1b0271b3fad9f22d462bd0641a9b5263abe41a175214e30dc79405d68ab125328ae8a765b3516c7c270cd2fe02695b6a73bf5802c88786c20854596dd7bf9095e14c28bdd941b7e1eb392767a7274ddb9f073513ee4191ec59a14747eaa5bf8becb8f57694ae304c4ec588e3f6d421c3d530ad45111feb5a0fbabc54e4eb701481ff2a4f6928516620caaa5427ee2a981188f8a2275c181d54f99f138922c4106a1dcb6a211b710be73a546caeb9f30335232f978b4eb623e2419c64f1288dfc7686ddd641d3c11db8707e27e08050bdd878b092eff67adaf3381ed2723aacb549979e5523b207e28a1bf3293bb6a627dce25a245214978c3295f13891e32bce79096568f0b330ff3eb53ae6c24b7f0fc0168eca5784325729a6a88855b890ae2075f455101285ac207aa40ead9ca4a7c249cd3c7f6caa6a41e3796fc7a23641251349ac90ed2fc603c1fd67d04ef952166f471d805e45104fd4ae9476d79dc29ab6c92226e1ea8e65dedab8d80cee63913f8a560453de7f841b82873ba4f3328f0ab91d5c16080f52989e224aa3c2b4279528da34809d927149ff50ce3f3df3f1c3fa563dcab1441b0285afc629b50a06205be91331e5d45adec572c39c180a8fcfbe6758430460057ac005425469312228c54f0b21d4e76aaa2e7446ce6b538d02b9b60c7db5026ee1901384851630b761195e35016d1ae07806495ebfc6b1acfaa17d63b6f127c43f3cc0c6802491edfd11584aa7e6c8510277ecc3980a918025c24b822fe5aadafea996497e8bf08984a1ac91501e92605e7ddd5f7936cb7c9d98276162bb792096ec4dc58d0018de0f9d979f9ee29c6e159ddabc8d9034518724e970ee9ac88ebac1007d1897e5e6a341bf14b36074c1619d31e9ce89b429aa1ca862fe70450da442d3aa132c9dbdce2da5d858f34c4f9784219b7600286605101dfb1b3dff8288539470ac5ffcb838710c3bc8d2da4d523ca12c39b12f884ceae12af475a943ce75aac2e5a8dd31c390e21cf1222494333795b460a1ff660a2426cfcbf3903973bed7aa0961e5c997587312751a0c25460ee13239efa7aa9b12b051812c166e659dae990bb40b00eaae0586c95479deb8779129019c1ebca31114a3244d761493caf040ea0d5fd066f3fbe38e60813bd57663ccf9562a203b44364e005116af00b1085915544644ef98c61e6458357263d7683258d83f4bbefc2afa080cbc5862e89a87ed5ca846ce9cb7595a88b2c887c6059b606e63859778c0777c92bc82cf470ec7cc5458834f462c2e77ca940c81c35e5bb8ed9000adf11193aeb1942cfec4983078d38f0d2d7468425acc05eefd28220ab9c3c1ba2a551c3fe19157e8d8bc1b0513fa1d8a793970ff701d1c8834d1f6c4c674027c60c96c626f26295923ca46292e7397e93b02a8532753f48c2955727c68dfdc14b81839f5d534874576d43aea83f0ad010e6a1b0444f382aa59c11869e1759a66310fdc16c335612c1f8343fd37e7e6dac90a75061bcc5794367cee3ecc1babf91b99580110127554cc3a78ab01dd0d2102c1cbf1607fbd690412d04fbae196463a9a57179c5ea4c0472bf9cdc74750dd8067b6ce7fe796baf8c050bd8180b1b66c5d6fdd8f448d98ab8d97c8716bbb36daf0ec3bc273b0dd183e1ee94b019ba1124a5e99d72fd4553c7077516413d8926d0112946232f34aad057bb76e54ff748d6cb7d8d37f6d1461d3ad3d94744ff1b5a7da7283a89d83c08d86ffbed21a5cec1ae661234afe8e258f9b699830d99cbc3f04026957d834257290463ca9ced2fc4e51792d6e01b1af7b5da8e5c752581f10f045944573ad4a382a6109a1b0cbde6e166a7cb96469470c254a40357e6744a71f14891820cdd00f92fcf1974b2a36fbd64c1549c08a3eb01ad306cd83c7275ce5e7921d796f64f75ca0d2187744284e1f7f7581485cf7ece163b79fadc0ddb064de7b0b59fb0975ff36689ffba9a83f63fc1fb4501726fad79512d68d90606ecd50d7b8a22c358dbefd93874000b6546e0142cdd0b5cc7fbc17fb2f562f13c62b707f17e9b55b7b70578999ee4b1beb09762fe43c8a1ccba1ed73f84570d5d30206107520865e2ff11081f16cf66eafe07886373b297041bb3d2068ecbe1753c11f4668554780257dfc7a60852faf9b0cf4d3dd0641c5d79d25581f76b80d9f618a546e1b2cdc47b5b2fd212c7ec80bb3142917de7edc8e7342010a19f1d810c116c06088907b70a88918ae660680fe558df1f4c6cdc46c6de131c9a7ab176f508b4ee73c2160417f9f68cb72f2e6924410f6bcff8f465a07d8d3348338942d3bebec74cd56e5fc65e08fe59b3e515d1d8f7631ba6bcc367ab81fcfb86984c5134e070c4f925988e030004249fe77d3b06a3f52f2e0427c4a4cde47c99ad1f70d128c2fb78b97601889c0471996c16f3f1d798a38c9f2db4100d3f9f668a3c9c722cca03ddeff2c9f0196b8796bfcaa9c6ab45b419e99f82814e14ca528bbda90f8e7e900679d68dec197a90a652140c1a5648c3b00160466a50a77c7a7f13f6fa64a925399a382ae5c793ff4f94df8640513dfeb767b442dbf8b8a32e77a20fa2d9349a3484d1ddabf49c873d5d90951a17061880be83ffed6e4d5c2a7d356a1b80698dc99e4aa90b3870ffc2fecebf2ba37300d0b2517762b177f917980cd9a909f2dfcf4215170ca186e60de5fed2003fb09af974f3c41dfad752a2edefc28dfe452734e42e11cd7cfad826622e183eac8538b54cf1d0b3df074d2781a35dd8649aa5ceff37ac857f3479893439ec98d802d181c174aa946fb9c86c6c70d131f9531ff76fb920affc8d3104a33c7aa7762fafb539d08235e75e989bbe1ef91d59c645f34215b02e631f91ee1989af9f053fdd8155560a82e9510250f9d9d579e6ae68bc072026f7aef04385d17843a19b86a415c45982d7939fd57626bc8f361a98a83c8251c3a8037b9abd42aa670bc4f30b1bcaed9d06934118f5b85fdaa44a630785c644c95fabc3384b7b021d2f0cfa1e4439620624ee1b036dc535adb75ab857d056bb80749119846e0344f4eacb325a097f6831cb7dae2e9a2a041d6d657ae0cf013a481f0eaeb3539b07d881687b62f7c6b6b8f0ddc892ad7af14160b04a639f7ac7dbb8f480533af425e5b18c7e2ded0a131c818840e1c7593c3cf3e3e836103fe8faa9efae51b4c542b9ca81bad4809f2ce6bfd25f5f43b4f627e7125651c6272d040d5bf5afb62797396f0401ed31710d36d8b11b4b251bd7b20d2b118d4dd3e36d5745cbf7afd4d9aab0e73c31438ee9d8ad5def4da33bae2ab577bfa1f911d7a14bfb0dea9d562be7ad06f1f3423a21b341b1fb40295c07bad2bd42662ce4eb4c2182648dac36adea744c1662165b8753ea20195eb799a9176e140dc71f35fae1ce3d4035630c70864fd7daaab81dc87e79728401fb8b5c01cfcbd617d472d67b1abb0db41d6a6835a2048e6e8436d1b80b435c614cec873b21d9fa66fece3fac468801a82f0fd2487494cee976f0030f21b0848b2df3cbb29e1b0d1a25e679903c097d18c1120085aac262092b1d8409f427e0172884c3ca1033ee1ca8a03981745cc0b34622b24e2fa997700bc90be701b16930512545915618a29184b17e296419df6dce16938ec43798f0c0969b9c3e4ccb61be5788706d7cfe642328d35876307d2d21b2d17672e9152417e1beaa7ffb50c4e3b554e507d9412987015e289677f6612d6f1823aa72e3fbdf5d1d60d5f7181aee4da9c6cfac008e57f40005e8895378b74f09c8a4a1b3e59db6bb96ab63747e08346714b75a045a1301d2c5fa8be85f5feff1634c823181257d49055a564430e7cd3450f059910602b03705195605c54b4aa6ac1a1278e6083fdef02b616abe64f182e58067b87b8ec169e8cf565a73d3528b8599a6234e86484d65fbd7f3c33d51354a245753058e8fa3a8c548dd56f080361e52667e9a543402dbf2edaa0f93202982118f08fb80b926320b079f193fe8271740f0b3762d3fa47c67aa246bbdcdb1c2adffc1adeac89008ecf7d55600c1828809284dbb646ba2d16726795280679a537cfbdb62fed6d43d298a62d43e1b24850527be680a0e924fe454e63375a9feb31cc30e7353a9e1d53c16097a27e7dec936683f72e9c7dcd8490d98cfbda6662204423727278dbb330b8856cb1e120db75fc3b7b1515c7ff393cc7888b9349b7996f50c86d3c683c950640f95508af8ef919c893adce339cac4132530e20e9c0a5482d6ec02f1c89fcc38041096a1c26bc349e04da4181280c1c7e3caeba86b0fb7f6e206b4fe99d609af04ea228feeea906d86a7a2c5fbbac8981618fe59ab35313f16b3db296f619e749e89fd2339488a0b4f0cb07dc00612a5b65e596a6b41d6450e67a3370aae671ed12bad11acdc56ba38860e661c09c732967dcb9ea9f32341aca45cee0e89f4e71eae8f7425af5e6b92f89c578cf10721fa3dca59f04590f79d5b09d5fd88e5329588e50bf03a6ad1183c6ebc9a847d1ff9f5b44c98e6a80a0e8a5c5c103cc633cc3220459569d31ad835cde37a286687945173b688ac003fa4e666f23c299525b44b0a82c6853e51f68800a0d4a12a6b3b6436022866afe37a9e225ee9df9539c946b86528997ae910b1a8fc99a3c8e331de9d6a0ef088869583f26be07106bd074b3f5abfbe1746ae8d4660b492f6d82179fc9b47ae833f09902a182dd64a15dde64d00fc7ed07efbd03f57840200203eca03454bdc35e8196aa3fc2be778743142b0d0d9833c0a6831862f4af79efcfd93b7393a070886f21affae1b2c7ce28d3b8bce26f5b4699c8250dee076392962ebe80fe06a761838c76e7370ab23d0b97d15ff6c70a29b44683dacf82ee3de3677041022041db1b1cd5b4480d48cb615f87b3b6b8f835b9904e2416a9f71d6bb061b675b15d50539a44adb1e1a6b1fe29b942c3695cfdff11562b4ac4738d81ee3a9a448d435016594c4b1c7ac64c66d1d5e76f32fdab51765c1f0fb3627a93a5dcb02eeda86b65c619e41077475ca4f01db1320ae5fc9b12def2366bafbcdad733c12dd8976a90020218e64ff5a06078e07462d543f9bb18e788c1c726c17e78ac21eb4942d0be4346350edca7ea8a1454b7a4cc9ca85ed68ae9a49409fd8f6c72be4919b099caa4858398e50825404882fa1b2c6b66cf91cdcb5becea1fe08b368a8afb4e5dc8a299718e70a32b96160a507b7876195e3ccf6b41f560f148e112a57374a4f6d0583d16e419bae4634e7e4b5e09570794c11db5491f73fe4ba537f4984f4294f066e765e9e3e9bc9b3482eec8737d9aaa13bfee9097b1c97d0c850d20ea256f3f54803416800e14e9180f5def17fc09cc160dd2cfde2d3a348b1e01a984de7925270ccba6ab4f8834a1c01b8bea2071ee8e8b9becdbd872cd765aa5ec95058b41e05f416a4a421ccc43f5cf8f6f0f99bac5edf33e18f68a2d0e0c936c024ed50007a4c380e40861353cfa304010f926ddaa528dcfb821b27b892bd6ebe09f98bd2101d4ecac344dfc69bc5214b519c339f96882d8876478b29c2f6ac03e208477bd78e04ba9260d51be6460a2a75471b92a149ea3cd174989bfdc55b4c7db1bd4462d645c2762085bec0eee5e2e3eb9c9d4933b97993bba0af7846f7bbea179e0bb24726e3ef2cba6a4196d671b2c08ebddbd4efb4a2b63d52ced242ae06e05a5947681c5da0ea9b00de19c25cc8516c2736922114d2b7ee8bd7e7be61d9015dc72f38b2c6131cbc66615e22cc16367ef111004d149a2f1d14283101c214962551fcc322f777e927cc4a57a46ecc6547b184a4510b8b5aa4c886964c654ab4a1608fe32948cf863d71803f106405aa0d00af89b09d6b2be5f49814de3bb6e3353cf79340177ab3d19c0e386326bb41507297c5d3b825d28ccdc96d38b2ee8ef2111a40a6d8c44a91dfeb4f5dc064f58b2a78377cd8dd3b131763cd3e002e25148eed8b83724818b07eeb7a61cd667978239813d8ed3e8396125b8f12c539852f6d79adf29966055f14951e22c59a0f61347bbca4ff472ebdb680079abb14b6b9d4f774cf2c8e4b791d5b4c9900a2e0ad1000191c8dca90f98d86968d18d040286d445a2cc5d9eab413421a7d3c4324fa50b37375f45b5130102442e39f461ce2f80825cfb14133cdec4e4a5adc0cbb83bfcd888414fe60a818fa86aeb7221fe334e99ab4612099f774bd8f3e4caead15f431089d62a466b030326f2383baf0257d49b72a41a1510769369aa56bf49eec61e1e2cce8290571c71327bcdff54def1e6ca63efb98660d4dc67ad64277c5112e59e395a423081cbaa538de056ce7db60c4b758b88b7a17c6422d3fdf1c831900e49fae32614e4889ea0d498488d527233fd8f27f39ae3e5e57cd968cfeb67d2c99b1a1b18096c91f53b13bd3051bc4b8c348f50169dc5d1be800154cd2cd6765e9205da78af10a3cf0263fbe518d788fc8707e8d77081591c714fa78e1867ab1fea83a30177fa9f8efb8ee219ca4b047da0a38947ad2004adae87347839b393a84d60a97978e12e9e58a4724b75582e539049ff4d8765c8d70a423aee30c4de1c780ac41d3a6bc3eae97da10b6e4857989a90f8083b592b59b452163877493aa532795b10a6080d11668691084e2619764ecfacebf383371e430b5e5ac3ee008171d34d9f72b37ad9f9571c66893dafbcc8c0d929fec9a57bc4a9951e1d0574b85ac14f7958f0a4d40a735a21b90317ce2cdb6c056e4dcb5299449ee1b2746aea915f15ab27a784ddffab756f7f4493d949eeab1444cc6d25bc1d5687ab5eafe15a957be0417c6aa57c8ae18b1cf0d5899acafd61302d13ec7adb1870c99d4ae00c61cb348f3d57b2a00ca1931cf2e75b41d6c6e49d6d933356157a07854d76e557ac0582f632ebd5bb5d2dffd0db9b58e229d9439e7b63dba426abc70e9df1f33e9b871cb0c8ff32860265b74ea89348de2982c0e4c871dbf92c1dcc226a3c081900f03eace60a8adb4727c93d033caf57ef9a50c93b17657814c16dc994510f8b890252101f6a4292854829fc4d2f0505073e7c154da792f555b09312b994d4894b322bbd8bd3b26923e78df768776b753819672378d12a297646aedc58c3a7d205073d2e3651e473d6ca5cfd3e3c6075f14223d7b3bd0b5e9095357d2bad1f8c02e6109e1a28fc3874eece1b3338db7f836eae16df7ae2ffe387e8844d6f926cae76098eb80adbbb0edb763003a0defd710a2270ea5f1417950cdbb81683167aba57216650ebb2cc7c8ea7f233d36fbb233d38bb36926f2a21c99278f56fd9378914f78302cca80f71af2eac431eb5737802f5498087092029f78c90a77e8bf4995a0d99dfdd8f4ac7ac16ba34b2d7156882296165cee0ba40adf1cba069d442d12f12a3dbe48bcdbe88d131cac538982b141820f71e620a12399e771af284b6bc8718d56c9a52bdb0d6c28c5815e1dc81a5dccb1490218dcd10fa3b5d2daf25f596804ce33c72bf9b718bede8b415fd4500dd9977c95af685c0487ded39723099d3fc772f6180d47b387cf3f7dacc2c7abe72d48b9bded90ce5141b96262b1c96996eb525362597eea501c9508b1c25e965bf1124813e578a2e6c0f385bb03e07922df28c5c03a964d74637f18ba137cebc13364405e436f3b2c401dd8466555abf32e0d6c5ce90d317ee10adc35cc9008853f98ce1c28633db6b414e2e418664e731175ce801faf33962a2d370981d22c3721320d02d60f54fc5a2a890e06e8cef8f6a775a8013f3f44d0a9e16856ff37e149eead85e8502287df627e7a2f16b95442664c4dfd50608b9a6aeaa440a0cb3c8118c3c88a38494dd27599b3a1eb059f49b59bb998c371de82207c4bda53f139581d68749d00123283bc4520f8ac530732bc66675e622a604ed5828547ef0e2111599074bc189e4706df6a98c50025059cefbc507986880857eb5ce4c48ae5894748295ceebe396cfee0856231803230f882c2cfae3c3779541f6eff38f00debde01b8900aae4a95a234654e24bf0a884ddf5eaba44b0faedf27dea9684d13b0e61c83507cb9b60629967e3d791f8889fd479fa18201015c85405c7582a4e37359696af941887ce5a462fb13157f126a6900547e890170d7c3193a0cd935493e04a45194578bcc9bb62a719091d95431e950d407859d924e00f5cfeb98a450095398e3aca922c09a147f8abd9d220c54e6960271d57883d18b15c8626e867bd45ed46e8bc36623b7d6fa7f82bedc2d7e7280b95d3209d33d19ed93f1f29cc71cd29f026c6e3fe0538688a2081410890b5a8ec4cde7272369a4688e53af946f2e76aca4b4422f0bcd8008f5750cb8e0fbbb2292a7581b5f94664e5061e83e3a8b928e01ea095f1505b042f8a6205e1c3ee95ae7bba813804ef08877e6a548b032e5b81731207eef558fa0e1f70c66597df861e12a53e52c2340c169ea59c5d371811fb24a390c25d14f531f2d82c55efb4973532e68c25bee1aded3835eaceb4cf42e08994f99c865fcb3ad5e68e456d776a19b33a2c7c7e2069a469eb76c5c8e43d1065d50526de282fc3d655e31c517ea6159dbaa5e831a75deeb914fca7ab9383a4ced678e574e5500b8be6874733e8a9110738c537255722619cf3070e239a5b3cad30be6e30916f9cd084506faddb188330810c45b043c014682588b9373ed5d84260646d5644aaa2fbed7765259e25e51e58044bf774251b5ea79bf1a203218b1a5830b4f02a0a3fd0bb49a65966c95732743785d3a124cdd43ce545510f8fb0093fc059e14094941ca2d3b1e50a7d9cd3620a5624e4843b4b0947ae66b680806c2edbc26327653edf4cb410e0e5722173afd2769a76c811559698ac4396ee7e3c6a702d4f190170fe9737c52a1fc29764f6e04a738b7bee733bb8de34d5241471a70df8ab5ef158ece745324fddcb171003eafa520b38081d2953e86865f4bd28986e900a199abe9eca66285b03c5d238f8c232656c8b0e1dfc3e07f28da6b85551422512729838c3b0265a556027d1be44b01407f265a61105daed6101ec4df189124fce4ebecb2203670c1813090d7abfdfb543e2af39f20e35e3e0a7e5d8bd4ef71faa3f7e78b8571bbe78f9ca9e42c788392d8197dbf467a71a8d51938a0c07f972949a2232d104d878a3420ac9414cc4c7e9bfdd71779cb1c5e80d966b458f4f58c0dd0ab4ee1c6d07701c86302bf60920df7717db2cae1d41bd5dea32e5e09b0147c42ed08675a3ec17911895bbb80c63006ec875d89e6601d9bb301cd65a2e1bf7185c1f1f525dbe07966378182b6b009062b48110085e140ada2cf7ba14e8a3e66f9eb7b4f5d54b24a083e3a556bfb62923c5419098361332b73a15a01958639f9b8ba4090ddf852027898c83644dd08657b106ae231fc89d24b4238280ab3222c7aa240223bb6465e0375bc5010cd56326d7136f27e4da977a9ba28306176b28ce8a84a721833e0367194574e9cb4ce8a0c8b5e6c3814bf87e10c0fe4ee901884d27525f19c0466bf11792cf0cccd75a462e492921cc3e03d3744b6ee1db7a7ae26041c7c5d08517ccfe6feca335b42b43ec24a18e1f2b2920052437237d42529ad8a0f7c95eab1511ed294f3579f2447ebe6c6fcc9498da6b5e2a858314e93e74d77c3d09bf5195b6b04475194001afd78341478b245d7feea9634e04fbc337c87f307d1551275b495b5afb6f789e7c9772e279ecab4ddc7d1377499bcb1e63f76e55f9d7306a4b9d267233e156057410accb5941881b727be66732eab42cc53650a35ae2a5381ed2a5334e59fbce10a6a03722f8af4aec1345075661c87870f9f5bc27e0caf0307749f3af8b041a84fa117380137fa6bfc183da3acada5d308813a20a017ccf5cbb7071bfe2c8f19c723c563a3475af6fbc55b3fe44b04010d63091e954dabf51d193b45e45a2b57f3c246eb02add24868a3b4e08252ca4dece66e6406079215614eb627113027782aa8daca3098ec2e729b44b41516cfb24763f6af553b01d27f1b4ab1ff936968ec284814f362261bbe73d9209a7e2c39a9280b211b0e147b98afcd89c97a581ab5f1eacc699ea264aa14c165d67801781cba80ebd002d211ae55415e6981801a0cd14abb4d1c64ae55c2219456788d2dffe957c354e32fc6d65a5d3137d9a1e45f47945128c97e1d47d57a948f6f22c7add3cd2967e6ab5c00f5dcd0c4c3028745baf43095bc540e34db17f7f5aca4ee6b149fb072456a91e1dd5a3a23db2433d52d491c3e0c68d3e4b3e82d29e5600b8fbfb0b92c6ff3aee044f7ce235c32c60acb15a6775c357354711fe7e5e8620084afa95578738561446794cabcea11c313d3479ee319745d257860316a46f1602401acc717e9ef84e1dceb418517448fccfc8394196dcbc6f7b34edc975966fe42c5d23adde78bb778376cb3f8b523cf172df9d5984eda0d188e4d685020f08960c6d08e59a65c4729aeb180bf6f43a117feac08cc428e931c2237562f6e4de7e1d3bd205ed95dcb0b1679c81e9cebe6b58cda38cc470b3f311e8433aa40dcc50ee5b5ed2c9898e4aa7d33552fac7ee4990980b809f35a4593c89dd0ee13bedfc7def36346d3f86d7e0fcbdb28034ae286f36f12866b056608d5e25596b3b0b92a2bc290a4e289028c589916666c716c44961d3a41272bc20692092ad40b733fb4861c1b29d3c6c25c2b81d15fb473a14c4b913051d4cda0fa6800a61e470a1a63fc9a0cd4351aa867c0254490efaa38c15ffe6c5f522582a5c18e70eae9fe0c28923ef75d8b573d664420fc7aaee06f3c5c9a8f1409f49022b3f0af92d0eca5389ad328ac5e2799ba78221e337317d9596e8e5e49f6c31ca023c574d781fe06aab5c56722277eeb8abc66659189cf7195d154eae6b6c968c9cfb8edaa7371147d853f38cced024a0407ba0347e511e50002f67928fcead46a9c04632fdd91d00a0beca6c50607a6edaf99ee9ee75738d3abfb61f61ba08f37068335c385add57af5c487c8b81919b495fd8f77ac00dbec2664644104072461fdd6608a6459420efae260f42dc91ef956965661d25f696c56f1c491536fca5d99701bc24436dd734e6e45eebcfebcc6858a2903881d4ce0e9439de9ace0206be1b45acfc34026a1b26b8c0bc6e40582a1d33b0359a87343662595289345df1830218f1b2d5bc7e4804ca63c633b98e6b442a9fe621b8287cc6c01d4190e1d87cd7e00cdeab3c659f0849f774f9e4885cdb42ff56b08450008cc574409d9c0ec6847dc93ce161b7cb10121568e81066baf6ba5b93d084977559117ca4069bd67ab1860d3cf584e83fd1707485b15b62eea875b6757db56b2aa97ce473ffb9c6da7f4bd27a4ac6922b42950e91c18d0a5ce6e5e953240bc8b8081a7f5a6cd3e95c68227768d6970c43756037bd7d91d77af63b49584ce64c564adb516a7d787c8ac0452f22e603446e9ef3aaf75a9c21dbd4f8354d9d8456ec2656bb8936e771cc1e7e17878669064d37fdca57c5383f6792535c0b820af0f341886fea7e17749e413090e136bf8189790c6380b2ffa7238ba671bcedecb9142ad66be26197d50785b64b8742e43d430b3e512596df815c5390d69c4e93fc5fe0259a5d2e1390816b3386e114365f24af95e00f41cd937c7dc3a03e9c19332199ee1e1d876cffda1f51ce088eaa807f94288ef4f211a51e9f67a000dc4591e8e5ba097ebd8712703695f02c8305e81bad7bac957158ad748cf4cf80548608cdaa90f56a118b92fad2e08e7353f85b5eddea3483c00300e5d320e1e7199b07e62090d1be9ed4d24a830065735b629b1ab077aa3fc9242db7ea9a094f6360784ab171412b7b28da47fdf2bb7753d41a6dbdc98f69b307942b130d9209e800e8280be91b00d0bea586cb25a41b984aef2664a4652c3f7d9eadaf7292caf2c3b1a6951e83c7a75cc588e11ca45b7253635f48af475c9fc90076938889b19a7b028135330ecad92206a8ca0fd7a8ca970685af5d0d1ed6d076b1e2e88eb7970be7c9f4ab8340fc1356c224d4b8a4564c923f06981b2d6360b9bb613302c275fb75609404ca938b269f9361d0b9cc97c9dc2510c53cb0001fde7d3e88edbb3a621e048eadf8263d24ba90a6baa73111c8f36ac478d40dad98369fdd9e4089a39dab3848d05364ae0e4a36dccb61cd3c000424a102536a434c43306dc499793918407310b828cd94a6604535cbed41a56ad919c37b770a0f7ee066beed02bd144fc857e0bb3bf443b6daf9d335c5ab300f87910481a2e20d9047587d04184841084f21846a3217a425866187fa473021df0434edd459fa99e3912c41b480b10b2f0582e65ad83f4a1617e2bdf300c265d778a15e197fefefba73f37a76b3975fba383cfd056f8915fec446d96d3c99a6e3154a0ff7edfc4fe74b3dae01c5e9b3df644182363eb0c23bbe35e1114230f7f512185d1472d5c9be484c708d771ce751f91840dad826a5752f3d8d08c502ddca70890c930a0478fe125d0a3b7fa8713938da28f92b20f8388e90409e510447bb607283017a178ecd9de3bc09498c6ac0943463552d42c3f865cb42e1364a7f3839b1ac6e25d0c59e7e99c39cdb5669c107c490c40aa3598cd1508afe552f3233e0d7408952bd80c109eb2f156aa726ffc8040f41f100bbe31715e1f6ca8d11032b6827cb30ab9814c403032abf0f2684840b2c1eb13a6212f4f275ca131bfaa4ccc8721613f95a55649eb6f825bee72b4f6b4ae7fa311060d931f69402db25c2476d11a3fd3fdc28ab367a432e974f8b593aa287f92f0e1f1ed4936d85d1a6f37343d80cf47a5184076632db4bec42ed0ca27d4be6bbfa973b8599c71d44f6baf3d7bab243336c6ece6690d4007f7b4a1b019c7c03aa5b9bdbdd9682645f94006ba6762ac7a6c525aac457ab4bbc92f5672c2c8800c33bac1f6bfcd0262f9da706ca2034aa8ba895b304cb34a070d2b551a0cfa41efc570aefed2f24e0ce2a863d4272c41261893c8d650d25b42c41fb9cc950bbeab01303008664f9620bc1607d30eaa50d0c0311cbb84f982e544a25c321889b0fe92112409d97bef2df796492629032e08ed089e08a91bdc433d007ff0518ff3e50e6901b1271925e16394d47f30cb28011543b02327e0a1d4a7f00947e695071f85678ce6f8d7a7de691023f5db3ceac719d382fad4d744a9a9c14348f54f802175fd2b5f9ee4474de4df51afdffd03f2fef6703fb0a35f638967b8dc0f8f5588ecf5e88ba32ca9457f2fcc68c23b263bbe1704ff55f869063f75383b6ad1ffe27073b8f447fa5d105cfaa27712cdf1b7f6de4e52e2de20eed8493449ef14c99e7bffce6ab82b62a473f61a96332cd2cfcdcc16c9de036ba4737f98752f9b4c8b4e936427923efd3429fb5317248f7f91e444fe448ddd49ea3811e59930ffd7ebc89d64f7a2ec477dd43fbd7405d3a2ffc4b54b8b5e8fba64af445649eaf8d7a3fa433daa4464af49641fab13d9bf12519b11d11c222fcafd1aa645ef945f40e5d631b83ef907c172c71622fb0d599da4287b4694fd9f64070aaa4f34c771d020cafefdf5a93e8d36833b62d7cb8d4706f4572c84fc844069d11fa88dea53f6cf86fc3322fffae45fc7f8b710f689eb1e6db494f9e5f2e578bcd9c4b79de089c76e39c9b4982651c4c0e89fe104a3f329c87cf2319f5cadd4122dcaa646e42cd77f3ed127efc91de5d393e04f7f4e21e97ff10519649c71c6182a75e84fdc4a52c78728718904b508846619c680cca17f0392f074c693f4914f4f4f4fd60c2050c88c95654e29a594524a29a55e29a5b4d65aebd34a29a5d5412f404c702b58298e75777777777757eaddedee5eb3c6fd5185b5943645419e53faa86e9e9f237de6cfef163ba9339ff2483092c4203f0b90d293e76c92ad79e7f6d4f322a5ce258925b25c4a428829592e49f1d23596e9cc9c7a287750b872490930592ac125cb2529493e592e256145ee58ef58d4534ac59009ae54278a2915cd27234be4402db045d4d21355620aa5f389d665229135eb50e64deb6e8df5aeaf40dc573c8690ab5f302e4e94dbf459093042fa606066ff6c86a20fa943ff470bb795625168fd354f69665238a570afe17914c5e65136de37b3fa3dbd620b1499dfdf78ecdefb6e2249cadad784ac4a13b26aad7848cddb6021f06b5ec8e6691e09ecde709fc0b06dc279b4323aa2e25628781ed1f9f43e8aaf1edbb4e2110467f0f87ff128e6a6afdc28dc837f7eba43ef693a1b7a38d2785f134ad85c32891acf22a339b3fcdadde79c39b39936b3a9cd9959aebb1b08182cee94560a22c5dd79e2f6c76255fc18b92bcd776baf88750efd0c8fd6563c9370aae04c7169e311491099fb2c3287a7931d14ee389b7cc6ac7e993d0cf29a4d84c8d44c676679901b73d063b56e7fbb797777d7b6592b75acc5296608cda199a4c36e12b613202d6c7287728a32aee4ee3ae7777777d79fed576246b25cdf9f3aa0399487d5f80776019518094678b0703dd0bce428440fa3e9a7c1b27362dd5168be86518c340fcd53dad57137712a464e4949529e88806044525393cea1df454aeed8313f638847c278e613234ab94cbfabb11a6b1ea924732f61446977692ffd549d1502055aec62adc4fa4a3775ac95bac8521df4c314eed845b9c654bdb346c7c4845296cf740223b2c4461a48f77a89e2bf17a924a483eba0df2ebc5e5c9439fe9b9d0927ac436900365cd3b44c2749cb2a980e6304267b9d4afeeeee8e947d6759d6f6189a4f938c7f13f97713a527d9dddd6ab51bcc549a56c87172a9b5d632d2a7be0365df607a472e19a144f61f57893b4e2f53c99f86ddf70bd1f77e14b1507ff72e44fffbb1a79df4a3de1f159a4045e8f142b18fa8fb8f19f3f4e4c58b935353d3952b4a4e690d1d481dff0d09687ae9f944731cb6c4a5df3fbfb3de953e55ab3d69450540eaf8df0064ff49c6f482373c6e7646d2a19494a219aa72a701063940b65cf94cb8f7fb98d68a1a38c8936a594bad62355c93c695ffd340b4b8b2054671e58f202dca9287746ae59039740b135d6d55a794524a29a594d2ea4d9f52daaf80995bfaf4d39a34ee7c205adcd9ae5614d70477fe4fcb166b88b1e5a43dc91430f3dc773b4bdcb187e60fadd43b359fcd2b369f7db63dcbbd6f23b6f0b6b87d0f35cf3c6249f6dda49d64df46bde339fb86927d1ff5cecdd9b710bd23978a5892b39ab36f29cd5361d9bbb78d69ea9d2c1b5d934cce3e1be70f59dcba70e99dcd8c2e60c2642cebe924d1ddbdbd023c6f349eb78ddb6fafd9fc16024dcd86419acd4b9bb7c1b2c59ad08416b3a7c95e442b2cd462d64b7ca872f64d247da8b5cd3abaf4b36fa225bd2366ae76d23baacfbe9f489ffa997b21a47e0b713c0dc71164def068a4f386b9efb19be4ec7184466a66a15421cbfe0c6609a11fa4c5ec53210bf533a3f02b04af2e13b7e73cf0f7f06842f67e0b4713b671c34668666d2f730f6b7bcfdb77216bc32f9983fca0e15593428c0834ba1803c3972d5998f83282325d50e1f231c0bf7b960763079cf2f632cbcffbf086ab16b3d749227b2e7b2060eef6f8a7c5ecb3978e94970dc116b3cfb2efa2ecdb49f63d947d13d521d4978e15441f09ccdf462089cb922c89a3d49f305690fb8451fa134631f8933e4c933f94642e0967110934674e2bf38a6dba4e794e2fe22b88c84f074f491d4b886445e1f00953294f5c0489872c2159f697b9886396075e84651fe79a3bd9b3a5a32e50f27a151957bac4b7f4e595f982ad7fcdef99ffa22fb1c9231023cbb71eccecb698b5fa5d2dd6a0e6916c38d12b62d5acd2cbe58365bd1044082262adb51907d965054c48819d807ae2c21b309510eb081546b24f0404b742b8f7be86339ef635607bfb9d6b66eb5554bdd57eab4597fdb1f53f1d4479c43ba412091232f3d45942ec38f3f691645aa64c993265ca64edad1003646de6999025a4be4879823aa7ffe2d15a141e3d3c82a20d5d566ef6d5c8ccdb671fd096bd677fb33272f62de9237316b6351fb6d0e008638bbb90cfa4fe76b062fa21fc04d3c5960250d9e285153fc6dcd9a2945231ee947abd01b3bb7b08bf861a6128ad957a91061a673cb9538a25a5740ba5748b08cca0744e4a84535a2bf582d25aa91765743932b85a5db0846a29c27249b17eb73812c9e1bb726d22caf3bd4dee3eb3dba7fe2745bb7a03a418b9c353eaf409b97f72d64e29560f548bb3b073e65f3d90fb673bed867529990a67fd3b936b4b4a6537ac9bde9433d92f907b26b75771ffcca0d4d0e05065b95ad9b0a23d6710d2e76629c5aa59eb457e6e4915e0872c533a279196d9d387cef6a8c4f94e6d47b11938dd49e507983b5b997a3f5270274ef6de99b37aa066f526730fc19c659af7e3cb9d2f7f9071e7fff0c2ad8804fd18c3f37ea0e0ce47793fc448793fba5ceff3f209dd023a587952fa703536cb16c6f00232a72f2075a0dcf9369e943e5a96df81de8f30ee8d57b3ed69b129e640eadca43b7fecf1f15a59546ca79627a50fd53270cae1fd0043878e1c2d164e0e1467a5b3f40937505724718571ef9940c144145b4247964b2d90612232e24ad3bb515f792309cfc7ab793a363434d4e48d2f50658e52655443e0481a1a1a52c283eafbb1a78cada424c70c2549995efe56f96be5cf953f1f41f2c78113dff7bd7c227fefdf5b15f2f7378afc7d4c2b60c91f0b31e48f85a5fcb52043fe985ac0227f4434e4efca67efa8e8bcce47ee82e4ae93dd77aeee650cb97bef1d1fb97b7b516022770fa6d042eefec51972c794c216b9fb9e1e72f73f1d930a25c81d531225b97bee03ea9a7a2873bf7d409c6f5b2b6fdb56464cde988694c85b1924f2f6f328dbd73e20ebdacb37ccb03bd5287beb8d28b2ec3e4fb86ca40605c08076d980d228e84cb293e57c2246854ce9db2bc6874c1f14e394e9ff181e327d714c1899fe8b0d2332fd9e1f36aac8f43b4892e907b5f144a64f248436d2c8f4454022d327c10437d018228304510a4552e4d20a5690e9b71116b9e737675ca0ac114ccfab54c8e899be3f36d2b993402570daebf63a68bdf37c0d3965f79f4eb267f0afbd1774d0e6580ab868138012c50a3a8060045c52404202252ec2984146098b30ce844a17289f99850a2cd408638d24d48021f76bf00135789364b1210d269e525802890f49482041310231496b509f454343432e885b1ab999a2e4eeeeeeeef980dab916131772ca13972d671c71460c0d1cd058230da53022500385eccff301b992952768769ccbd3901952e4fe017c400df698a08c29b2bffb5b339c64ff205704575861c10927c034b10209c60a2ae050430a612c1dc17c4abba1814505273fb6b8e395403e203a97caf02103db3242055760f00179eb87561e3d305fa8a088ecffba54f3a20a477f7c40ee19fc90538019025344ee97294022f75ff001f51391021630c8fe3ab68a0a70f8f880e8ddc07ea9e20b0bb9df826b05171c734700ae411e570520a30a1930e4fe1c1002438c81822c4655da580236de5c858d36a808028c124444e1336019637dc44993fb651bb93f001f50db21bc31ccf04282ec0f801e1c5080c6183e64ff1e97670d2531aa400110d9df25458c1cb2fff3f8809c8913496ee4b0e5c9964b7924e0c30d5b1cdda0254b0b307fb14ab75ed44c5861851ba88a3f20776e854c3ffc80686f41491f3c5d48200693dcff62bf2493fbff03ea03207119c000f2e8030c165e601c11860c6150c9fe3b5e24b0228b00a810208f728a16799458749164b84002001758b23fd88510d9ffc52e5e5e5c91fd7bbc1893fd7f9ac8fe1d043991c9fe4442f8024bf61781041374cca1561373c96a8b054d728a15120bc9458b1417680993fdc12d57b2ff6f8194fdc516b2ffabe7874b11d9bf8320225cb8c8fe399c5a3120797465e7400b157468b143762dd86812a2894cf66f7d406eb4e2208fad2c70c8220b33b23f98854af6677d40fe6dec50b4c46444041428b0f13ec0061894b4c08395299860db1957986c38592cd8c1e2062cccc01246eebfd981933ee05cb59ae94b6e2c503061c9fd361f0512354c2de47e9a0fa8af74d2d0d0d00c306f6c6577b9f2e823bb73f12ddc251777dfc22f705fa22229fbbb57c124bb57d143f62acec86ec512d9ad70ca5e2589ec57d090fd8aa7ec1f44c44a52f60fe10a51f617218cec4fc29537b22f2d69c9fe936816ad3e207722c50754eeee38669029a648cafdaa0fa89994bc98f9801cec41c9070dee07e4a00d5ce471e593c796142758a20243f6252a60b27fea03f2f73cf72c927ca80f88aea40841145d72ff074ea142e54d89828a10704db93d0f8b15ef2298bb7b6e3d7b95a614e57ead27ca1ddda17892dd1d0a2ea0fb90de7117ab58c1dd5da43c978a1cdcf9d5b138a194e58910e4fefbc419b9dfc12a5168e895d8189f2207947b6ebd5e8a2de56ef716f0839cf3e948eabd22fa738cf4b1479086a4defb23f73b2ae57ef71f7433618f2730552834935698d205ec8446830c0ca9a7d08228cb29b28ca992e5145980c8b34bef58ea3ffa55e252e9e3930d3994e9193287fe5855aa9f5161a47e59e5f68f9715f4bdcc43500f44ef1d42e4419016dd22fb352043c10260765cc4be8bb777b8776771f755ff414a858f1c51fde5f0cc9ce30666ee3b6b5321cb7fe625ec86a9ffa09bc147ee7b4752dfbd8439be3735430b660e8f22e40d8f00e68983b4224a33ea25d32610bc1715fe844344738c17be680ebdf68a40bf02f7de5bc29cb7861983b437c81d32b57db9d0220aeaee3de79c73ce39e79cd2bb534a29a57c570b049d748df629bb4d8d8a0695b2c14e746912117523e9238fba6f0ff73b61961182225c80dd179a6738c14ec87102d8c548da8fe0cf0d37f535df512ff34aa673fce557ffccdd23e31e267f507ee59edcab9e43fd90140a0b217178484dcd0ba132dfb24cce3b55288bc352cee628a8a02128fc34c7efd33cea55efa8ffe03e0a7f40f32a9ce43e4df79ab5e3ad6c8c190ed99f3e75ffca4686c3e4a128642e643164bfd90dd95fceac88ec1910d9331e9c88e6b83b913afeb01f562eea859086a45e2584b4fa2324d01c177ad11c9cc7818f04cdd427e9a3cafed5fb29ce9c64ff0e5b881657ab5fb1fee6c7971616f6bfc17388e62471338483917ac470efd33c8e5f3df8363fca980d0e81e624f1340f90c6bd011f8542a1f010cae8e6413c6d3ee1eff80748d80fcda1effad67fe0fa16fe233bb050889b3ec01f7e888fb43011cc03b32c2e6148eb79fc3feb3f78d6ebf8233cb090f8818e6f7d0b1f61611190c046a9c4e3c79ed64b186bd514be84edf8517c090b3112cb8322aaf79779945ebaf670a89e47b8e3c330c7bbc27f1ceaf8d9e3c1971fab7ec541374fa40746f20701f048603636363d1e0058c8e67b60a455078636368f5d7fc4069b801ffc1e1f012d3db0a439208f6fbdebf18f93c8f53c5e02f85b9815c483c74f5818fe8485acfa3d1e09ec266455cc0abab9697d0f2c74f32d8ca47a9c4702f390e51d4e28843404e76fb010d203242cc911a42137afe38ffc1fb9c13a1ee75b1f012d77c7b3702290c4ddf1acffd7f1ff3b5e023a9e8559413b76fc84e5c8f1139643c26ec26933979852fa49ef34a69c932bb12b4a5762d3a9c52e2dd29f4edbe6e2b1c281c31da1a439aa702674b5585f479823bc2388965a40cc45b8ef1a8f620d4724b922094731774f13b2b4bfd1b4b7a1f91b2cc4d2fee6258ce685c0b7f90f70fe061f693dcedbe02348435a8ff347580f228175efea9d54f797f2dc7cc77af089b4f0c479f99530a4f52c2c34bdd01cfa2d4cff0112369f581f4cd8cd4fd8cd4b18ebc739868591581e787fffe222da7b2fb384d9fc38bd747f404e51a8ffd0d5e2056d1772df8e3d942d7e19ab29479324c5e888b3bf7de761ad35fb9a7dd98674ee68fa8464af619be1562151353883f69d6c1efadad4dee61d4db751550399a36959825ab2a6690f73e2f6644dfb1ee9c3236bffd301e569ed25d5348d7ef768da6ceda9f63e5ecdc341e768402f2677fcacbdf6a0c63d17765dd7596bb3d0e6db3bf6b6a8556bed5bca43dffea53c2388d97e67b55fb171ade6012bdbb7da6b58d32c4cfbdb3bdfa2a6fdf4b4a83d9023bc1d4d55c3456892460508a48e6c97edb388d27e32b36c0e39ce30ce9a524af1ff8e3e6a4d9525131311b4b1a9c0e1807a8288a3eae5c8f3318cf8a6f8417bc28cba313d0185968c06a28d69264b26264d7e40e30b1bc8d4f0e4e88924438a3086f8e2430a4d92c8e04935b068103d28265e964c4b56a0ad8088a4269ab0b14df16264cb681943312d3183264ba6255b989658a9b265cb166b6f0bcce074c1b9304ba8745b5c56964c4b84b861890c291fee4c964c4b5010630a252ac8b889064e5ab7612451316ec6b4c5ddb2645232856542891315cccdb264526282573329417aa1a2c0a99d2e4e964c4a66404171bf2c9994b0e07d2903c3b559327d400c0f1f787ac007bcd42c993e30a58abd16cc1163a2098e16a556ac0825374b45ac180f45a015229c978dc1e6d5f30ad273a5cb153037d7be624331d4d86bbdcb25898b14f03e15d1c46cc670619565a846cb0b38b078a259225231495999a086992c8e70f840c3d532a46a220725292b334d3079014574ddf896a4a4bec0c1c3e284b222439725f641c135792f7b0493edd5f30ad2b3055107c412bbc509f7b227c0a1487bf5bc82f43419d1397289ceb14d533a6703edeb042ec490d96bbd8b458aa53caf9775e385faea7905e9b17245b3f665c612b7d77a778b239a23c140c0154a5930414016a32a4408d0e285891813042c3909e088ad4b199996eb65b994048c4e875b93e552122bb62c5795e55212258eb838592e2531f29ab85d964b4968a86e244921cb72fd0dcd04970bc36971b3326c1a17e5f4657169aa4091b92b24b22f4008a1c20d4f5458e2b970bf32dc1097e68bb6c305993a362e8e263c145c1411a819ee76c455b9b5072d4a0e3d5c9be5520a33fc7067b25c4a2185266e96e5120a645e455c2ecb2514d020c1f52c97502823c6a5ab5fc30e68ce7cd0e76660b1677bc3bea99498fa07412f959aa1cc99bf592d95f2148ef95dea5eca49a17965c5978ca1e8dc7a665eb529da3d2d76a1ed3c1c15973bb7b73d9a63a6d297d25b2b1eaf7358363820cdaa06c6aa69d1e4a03a76fccef65b685fc70744bdf66096a16e3ff4ee7d5b5fda0ddc709d36f49fa153ff54751e28570f0f009d88c3dfa1030bc002cf1b280577f4ecc3d3f1bc77bc45bfe087e7e281c3775514a76a633600728fdc3c72bbb04bc6729769d69ba1f8c220cba58ee336ab7959add5a382524a29bd53a6286d8a1aa5945252b1e7f7bf63b499525a27ed324ecaff1de1dc2c683750e3dc1df44c4a29a547fdf328ca7f56b053524a293b70779c27bd2970fa5b795333a8cb22339bde3ca50f0e677257a7f4a9a92c43699a9dd81bc26edeb5d975f94ed20be7c99917cff69a79e56040e45fd24abd52f73efba134afd42b45a5b2eb957aa5a9eb3333aa55ace54d0fc011777e57ea3e339b954df7f502df2bc5b1f2ac00469f2cef8bf2109139fdf68278e64b40cd447cb8f7fe6d5ad178201712a139770bad13a1994111914d3844742fce197eeeeaaa842975fa7bbacc5aeb32d219892b779e918a42a152de4ca5ae37c3d1f308ae3c5534ab707833f4dcad56ab158d47f3b1240e725ac34a0075fa1cf0a64d1b0739b5a9a159e150d9749c8dcd66359bcca65b2342b6e664b5ad5eae3854de504a69adb5565a416fce596d32cdeb910368b7558f27b11ef15b945f63351a5b3318c3e2e0aa8ad2aee22254d6998f4e5b6b4d81178f52ce595f7e0cd8918b542a1f854a7dde4ca7e270789bbd51b41a50eaece0caf26d2af8f68b3c29a594e234cbb3b3e5dd2877663006a594d21c3c6c68d284490a2f79b460eb79e4901e82757f559e59ae08fdccddbdd455e190ee61c7795de77137214e0eabb6727852b63875ecf01518a76ca4b1c8467af62865233dffff7bd46070e662239da5df2c67ae1e3d5a5e8e0f487a38eaf09c467a00c499e309c0024ff68e0f9d258cc8463a4fa923ff82f9f2e497e111049a2c47faa3fc5ae977346465b9d2ec5d5134eb5e1f90c45996490c2c00a2b343c7c7721c64b1cc5a7681273f2965880130cbef82782f2a7111aa23c7b519064080d4f70c17a99ee36379eb63f9006ed2e8628b10f5fe10bea37428cd52afd9c67d5e6adba414bb7ff6fce96dfbb656eb9ad55a6badb5563ab30b39c50d4ba1e8c775e1ed6e2c03f3c79b3cbe05c5195bffcaf780e09372c081061203a9410f082dde4ef3c4bf28973eac9d30b0e33ca033ee68ed0c372802657dd277791ff64cdf74b803a963a289c4d1751bb5dd8e29a87556ad7777b7a59dd59bd1d9fddddddd343674b3a9d7ad66f6334ed3c07b2fe8f4876696b35bfdffd84f2c16db38cec5ffff89fdfc7fec27e6b11868bd3aed38af6ff823633f4f797ee8ffd3ea1ef77d9cd2150ef513933ed2c926876e3675960326cc7fe699eeee9e9edd188416e597bd5cb95cb7dc652bcff69cdf3e34cfdde675e85e67cd0e7a2da7e40e5942ba896872e3123c8f209572922cb16db1c395d77d3d25aa56a7ed81a093d916b4715a56dfb590c8c2b6cfc2242cf4c036ac3d9185713893443db0ecb930090b16963d510f6cab9d4dad3bef43a5bacef3c69aecdfcdba72afb5fa7fa8d49d515994dc3e20fa63b291ce99d62eeb913af24190f25e9a99d58ac6fa40a9aeaa7e148f2664af8512b669ff4369880130d3950c31a0658a8b54acd9e780f6374b1f1afa5893d32c96608babe9fe321cbbc51632e6caff11e4940f48be94d26e70c49d4fe56a4a29250b676a9d829a86853800cb4020505f778fb8881432e68e3e3ae73277770d67e00bca9dbff1586b35ab795a4629a594d60cc668776a0019ee67f0c59ddfdeed0d4a70e74f9d1d640a3522c9d662210ea0a0d4acf3cb715ccd386b8db8aa65465cd5b8ec021cb8aa6546465dd775ddb6bd9cc9db05541df77d401af6ac1ab9164ab16b31d2d2795ee7a4c583d9de99b5f3bcce494b125a2c4cd6a881eabace888c4d0a955a0161e7121284dea91c029a270427116c83831f0de40626f4481fa75e8d280f0d8c83c9af1cc77538847420d3759d0ad60aa16a26dc263eb2d70f5e6f9186358ff2ccc0e40b91f9325885398cc21ad6cd70dd2541f509b9d9e2506928ffef03b249e6d011f9a3df0b923114834024e559eaf3294ca6280f0a26dfc7023ab833df4b147f663c98aa83c9e7c29b8117ae16bfe98a06262454802c3a1a0b0b7369ea03a2461ed01a98773535300d96047c514888f2d4c0e47729231a18ae3b78af13f94eca783730650eb8cc3c4942818088cf4a3926f7ce8e3c7a4f4e90bbee2d0864b82b874205d6ab64d7987038226b39c090352e324885e90625730456ba60233604f33b002754e05491c10d278cae93dccded8817c137224bdb07582280ee960d2ae47eefb73664c9fd17743294fbe9f3bc41a5e5aae1850b6a5822f783dfe20a5e1330723731d1a044ee9f3706bef2b89ae14bee6f62afabc009c989f0b6359abca17d68440163082942ac200858145f8af0f2841a2a8480098e8a013631d4e9dbd6c8a36cea716292218b262280618c2f4e1fc8828c219c38220612c49ca0e83a297db2ea544a29a5943d7d074ba5fc1df2fa6acb9c73fa742c99cc96b9bad7e946ecb670b52c99624821c8924b83d081040f4b5a50e2850b5c20b1418619460004d20b5f6e282a73c19bca92a9e8293b25e94a706f964c4527c8e36b4bc14565c95494d4e46a6268f0356299174ea81a46358b0badc6933b41c31ce3648c51e7c83cdacb04890facf1f480a2234e8c0c8d9b23cb2b62c2c8e3cb062cc05c9a2caf8869e2b3222689488c0f3888e1218d26ea547c3de8ddd566bdbb02b756d7d595e7d52b827613ffd571ee57a967b4c09513e449a7a720dc4fa7f96fabf636488f2b8703cfd49feb348e0be716a4c79593e777bf2c0080a87dae9a7d6bb1f5af55ab5eab66df5a2c7af36b715e33af59f64a3f73b75e5d66afee694e37b0f34757d18a9c684591e3369f54a422276f9ee8a43775cfdc33bf29abf9eff8a4d491d469764f7fb1a79b5a50f2fcebfffffffb5fc69ababa92527ad6bab2c45d7737a59f29edd923cf4792a59415359e50b9e83a77ea2ddadadddd3a3b501e28adb343eeee965256183a5f7976364d101fa2bbbbbbbb72d77453dae1d8d4523cd66457f364d82d3bec70c453ab9ed16979d0414eda830e3a389d4f9dd2eb3ae83083c826f59a519fb1db36cfe418f07a40f37aa74a71db80bfb679611e4c96b217d0d2e583c772603f8c91f9a3bf7b7ac811e599b7c3a3053fc8041e1e6c2562a49bbe6a9ef50ce9b1b867fb80b2dfb8fe97f6e7fb8c55b9c13cf2efca1c3badd5dcce0d38207ff43759e281ca75736812153931c18431a921bff2098631f29cc9730c0e1e874d39bd451f06a44ced7dca3ee90efe9e77271e89f040114770e2126a1e41b43b4c70be8642b0f2648c0c2880c012061136e820b57821c11165b62c412104cc5d8deca87ee18b179e0057ab55131cc820810217b62841164fc450228a2a52f0448b07c3605981487bcd7047579e4c2f2cf156354b7737edeeeeeeeeeeeeeeeeeeee6eda2df18e626fa1cc94520c7677d3a658cca074d2d55540e6f84b0df898d792fb2dd2115a1441c91541eaf88ff263002b0329c1f57ef77183ec9ea4c07cbf519a7d0159448a199014709ff3680a31a1f477eea4ac19cd1a95e1aeefd93b14e92c9b2f208b48310332c745983f7c1c4076c3ddbf7d011760b941b883161d4abffb8fd387ecfda19db3e6f9010525e930a6346f623aca75777247d39ddd39dc632027782da562a654943e3c32fd97f491d96bca9476ef89f4e51794a4a3df85adde691e1f9eef0ab4fef6b9b00423b7db42eeeb076439c76eb316aea40efd2ca4913fe8d7f0255ea3ac874eba76a6dcd141d617b7b5ba33f4ce915b866fd8ecaad9aebb7b7d96575cc2909b77bdcd7f801f071fc179fc36183c0262a11b2c6136d606e4f192f2e0af6f298febeb5fca137e7d1cdf75d84f5aa4bf85dd848d9bd130c492e67440736e9e157473835975c26c9ef5c1b49100ce83f808d2109c07df06b3eab39e858fe060a4156679b07afbabb798e581eafd55ef0fdafccd7f003ece832eccaa18b3bef54358dfc24248de0bb1ba6769df6261967d567d968787f078d7bbb010abc3250c09a279a8444d99143929119124040000f315002020100a880442915012068220b81e14000e6f943c745c3417c9b22c886114838c31c6100280010010430019a31a0bb068798f26b6eb7b7b2214da68c9210398e08d5018fc9557a4d31382e2d0dc2ed6a715f8c1a1fb7b6ff6e9ec4df0a4ba83fd7c0e6c5e2306c71d3eb0851dd72860f2ef5f530d3def372bbe8deaca1d9780b0f42748c0492460002dc926c2c01efac43749996aa794f441d7fc0a33e30a4431a24520ebe9bf5e4ba10450c9333f1960c3c89e13450c8c7a00b63ea3e03a8b4723cfaf8eaee7e9b6bd8dae00312997cdcc7d52206df47fe0bafac5103ffb9ef014bf821f81da829e815fe5baacc6c0d36b480bb1051dfb0115924d05dd1f4f64d4086dcacf8a1535d94cab63814034a348d7a57f89854eef08a6c276d74a61a265e16c8ad0b9c57934537f2c7a7bf55b5fd4913020a306048f3e2e5df9297968048ddd501ca4e02389348d1d8002bcc887640e3a1d9e36b66ecfe1430c799bb991cc339c1ec405221ae8f30ffc0a7eee8a8e1f4830f71be8cf38092accbf412ffc20d6444ca81cf97cdb7b4eb65e6e72729dfe813fd5d5e60137b01932c72bd92f0a06cdc86b92c82f5e9f91e8f0e32bf447a5710bd963b28d5e33ef0e421f2ab5b720a715b5d6ee71daa0f42afea3970ccaba1f3a1f40065cfa58784761867b4ec9565f4c7f1f5c53c7d937c3edbf12b2ce0777168ef12d98ce61125019af474290462d59bdc6556b6ce364b0810f8e1f6fda56aab6c1d5e8d8b7400c984af8e739186f5904f5d19d76b7dd7a5848a3bd6af4e732df46eacf0816ee917d16095c836a7d556f13f537b592ff4d800021856f33869c7b832e82f843c8a939a227568e55db5d26ffc83d0bf751065fc2d2649abb4c9344a6a6e7e49fa8a71aa2f28effa83fbd0a146b5220f5a88b1e271cfef190170341fd5716625143792521a06bfed477af0ef6425eed3c2709363de68d738cf7f71983a777ad10b9dae0d7be04b7a68538ba0309599a546422080e4cb28cf21c5d6f3a230298b5a896e65a5f347a585254651b391c36225373858e71999b349f3cc948c8b01a360369d4fd3a91ff5eddbb71193eabf51bd59f60a4c0e2bcf8e8ec0239b855ce53abf2bebc19c29cccdb3df333ae7590aa367910e5677f7a6cb9fb45ce35455465c5d4a7b6d4ba6f44670b7cecadfc3aa3c7eda122ce216c5ea5fb23b110883e8fc75f42246ee4607ecb7b68bc966c9fcac67a0e89cbbbba75b40ec4938cf902fad3b05d4051208628d18b088eb9e474512794193a6565503d974d120714ae5604ec12f843971a5377166871f5ac4661149cc4e9c1e5c89c9e2267c5c3c03db2fada49dc8661461926a33fba7c7b99999a8908a9971d1221d0a62ff4440ca91c4c7e8ceebe4f5a46f0206def27a65340329a5e4da2808763b0c1757fe6b0c6e4625c8c7b8c73453778a7320bd92e3234ea54fe05d97b738a06feb082f5dafd087213e9714a445b7e61d529720d58c4f7b35d551b872e25fcd1781af17691a1c1fcc0da37da42dc95714e1546a6de3118aff7d5eed565babd60c656b7b5ad3dbbe8ecac3ffb1ca2b00c458f32d57f46504b0350a1b4480a90d87009aadf6cab76196607bae32757f6499c2cb435a1d3cc16709764f3c449d556431b5aa06ec5d005ed9146f8d2c4fcd2e880694321987cbc989289fb25af74053363a3de5c1b065bf02d66a0c16a845ffedfa707200bcf32c4c355404a8a4e45a6328b0aadb6925a42e2a176415f530aaca2d25adf002b03d1d94518839e8be5a3332d396e440d035494ab851425405db6b83416f102823f4b81b896b9cb96b51684249e93dcd865b2d9b4c3ce04a67d326e0a6c20dd3f8a036e204f242605f974c7f0b93d4d447d60a8e1e2076ca6c396422fe0794107d6ea0dd855f2d82491eca3b3f45d61f6f21c9dcca691d741102d54c9549ebdc072a60801fb7de16e4b05956028fac6da64346bf3a06ea5e77fcb9be372e3cff820067dfd5a922e2c09c953c91ddd08c5b7da2c8c648498d92d6cb884f0dd3be8c1e05f301fcf0c44423d2e10900e4962a9a24a983b01d8efead336ea44a52e4101287d10f76fb0d99bd0bff4811a23c163c2dfcf62d7ebd1f39dbbee2ce6a4149c21397c38ea17e58da973aff284a766a3a1464699dfdce72faceb54016c9cadacf729948266f0d620994bc210c795ca22d08d061954f4450eb646a1c5206d4176ebfcd17199902e16255a521f7d83c29b295e799b0c2ad308376ea7893723a05e45f139620977dcf1625a4f17add07c626ea3148dd8469d36785e8300c46943115aa6db1711704d54c2d64680e784eaa5d629d90b28b5a4c428fe76a3c33fe978f3812f34b36eac641de8137ac856863fd46588671b1c025c47ccc900a7fe5cfac3a4b5c1ef1b39c45f0b314cb2e27163146dea9e462b9a0918652b3bee489ad4184a1ba57d91a2218c80f03bbd79e6ae72349a895963cb3f52edca69a54dce2ad3d682e9ac448d7399d88702795811661ef370e03f8e7357c3eb4bbfef159efb5825c22e339215b7773bd12cb57b1323391f85785bb6eba54cba9b0fb524bf2f71e160c7f0ea20357b187d597b910d25aabe5e4266d31e1777eb71c3b4dd34367a6786fd04b65911027bda56754067b936ceba16bc89221e7dfa8dde48fe767aad4af3d82616091460cb507dd43188dac603a37055974e1c1649bec338d3522f8d81c266e53e43d3b4c5bfdf01613dfc64c7eb4b9036080eaf62819e96411597a7c897a10d6e43bdf2d8dc8aac3031f2e18904e77f4ea34f6ec60987db4fe2ac0c2ec69df63b9b26a74c0d48b27e26df9c6e8454fb70ac92f225264f6cc1e47a5da6433fed44ca74f33eeaf144c744c012995e30ad22a32a682e481119f1c0059eef98fe35d8a6d89e5b1bf07e46aa2ce30721e19d56f12f55f915d2f4d8ae5f052a9fba6cd54bf161351ac8fb76986fcc0432de32b7870baa45c484dd330d409d9367cce04249f5f4b44890b2da0f92f855472839f121316637701bde0ca5290c0c5cdd0a1320dd5d81ffce55f2ac0c832e48ee09db39f8f96d6e8b43ffa1b14d65f32ad9ac3656e88cf9091e40d644f5c68511e266e9931784604b8080e05f27eb1688f68f220cb6c9b2880c82af62f98e72146aa68043034fc8ccfb75fcdbb04431d835ccd0fe453fb89d25df4f3ed8abde79ab885c29600a2a37414208fd9ab8951d44933687cd574ee32034b153991f166c9f0e52f01413ffe661c0c423c0a45e9890cd7ea63e015aa61d8d1e60ba1b783499538a26801372a805196def042dee6d2773d6384e8a518e8528309df76640f1a14ce26951c0c84a3cd85eeaea71ea8e7d0f2253c8dfb83873ab5340e509e034087d4030571421cc2753fcf2bf693f6c59c42aa61046e440256a413fe8da9a25c37f880e4327f450711d8582e4fb6bb934ed24f7e70f0191067cfe7d6e578a5402c933c2810b3c7cc91da1be0caea91bac13920f7b24f4bb72cd0ffd91748386fe8b273ce8df1e53a067b900823d8935dccc3084db03213e1dea68c58914cc0cab307915762a180feed7164f7308adc27d911b07c1bfcd80978e434cef226b31c98a4ed21e60b1e4160fe9c02196988e32a13f44f9db2b2ae474c3f04fea6830f8a7ed1dd2b30d4c38d9fbb2ee12fed751493fde323fdaa8b4956dd2d774f4b5fb0073f74a1bde189073fbdbeadc4f9b5e20a14c8ae683a695a031cf44afc7674c5c9ec436360053fe71865a6986e9a45db651dd81279715c780a43ea33f1524a80b705c9214b3709abdb18d0aecf2f8b3a799906d54ae5cf83d5b32f085954fc9edda6754312674ba5683d22dd8c7ff344d5e4d0a2f1f8376e3700a757c019c12f3c7dfec70d6a9f3bab3433871a280b8ef77db1d3841711e31c97b609571bb01aba808656addf8859d815227095d705bc1aa4ec69e97c55c6f7b6c4802cd5dad03099ea4150fc73fe7d1dc33aae6769a75f8d93afc9447f4f8902829f2717a171511f325088509bf919ef2313a6caa9b730621b57d20a045e8f205a8d83d9793fea401b446003962683f4347615029213c742ab8e891a5e78975ed5827f919cfcddea1af76533f1d904cf1bba004f5e76944c36bed6aa9355c6ef25a5312b98be891d56086651d1a9790b4a63fc8d27f462eea81db7f62d4de037da3ea8148d0d8fe2a7902b7a1b1b9267500b1cdf35824c28e04e9fb5ae237bd38b4dc8b709fb40d6d8f16bb4c68fda23aafc8725cbb3f8cc602b4540c7b4c3ad1cb18ffb80a3bbedc01cef75ed632974b2522925596be99ae6d3556d919194708e2609c3ac51f3ee5db8d9e3d43cb6727b918ce892b524cfa4b78f245bb1d1d78ee63e6e1b5748629b49dad144acde8e1a735ea4b99e02b00139c4004b5ec79f2c6d78318e536c145eacc6762ea90296fe9e8183c58a00e7b6f0b59dad8a74dc16a410e0e231ab2d46734476e7489962df8724d79ac5582e74e02cf3c6fe73cd06296d80ffa5efc1c507f1ea2d4e77e4634e7e6a213a18268030f5cc7a72509a406e3b7bc7eea06006accb28b0ea058bb2d8d2c39063e2cf752805e3cb8693fc6c544f033fbd6a32ec6f535c8f219f93018417c045b23e1edb615a1683c61c8e1c84832e76520e33a3d96152b81a59112c4ecbaba5bf868bb05dcae48474d4a750724d5f7b3eb6ad7d6a47b561b046bcb811b952e482b7f3b057acce67eedc11d04e0795dfd049aa80197f7385eac27a518a827bb4e314b9b7811feb3dced3f92b7f0ee5546b7b1891dace42fa0ee374f84f25eff322311334429af3eb813129b2a5777fe715958b363ca5595e7d1124d1e2a60a9bb6765d0c8bd2f305ad04c1cd41f01d59f67f50a87ac47a0ba8b68958e58447b0a9496464d33317594de5e29aab517366afe3865c0a46698a8efe1f366f8878c6b1630f7fe60bb104d7a0d3ce3645b71f6e79c1b2e795b95954e24657fd6bbe0ac6b11244ae06157f2f56a0fa4dee9d5b1300eb8072805668237b5741facaa866c80933ead7d32e5b080ea9112ac0d985e9f0c8753aa693884598b3ad395ff3be95888c86cb5d514320ae1852c08d2e0ed473aade52d3ce476681838b8396db01f87e17cc4414f3ac05dfcc251b9781260fec220e08dc15fba501ad5343a5d0850aab278ca22b044e8674ce1c83dc45328735f107bc1d78f483819475a421e0142146e44e0f18deebbaf12bd24488871f84d387dc7e36db0aaa1c388089c49122c37e8fe0023ee3df0378ad58a59d8b18bd1f09d4b78a0033406e10b63c1bce0fd46274ba4bed3c380b8daaafa889f17e930b9107778c35b45c1d704ae6602bfc5498e858214a34a74514842e8def320b00abec6fdc1e967d5fb7ee738111e2afb1718dbb656fee3df8f1df0f53e318e18bfdfe35f6736c6163f430af26c6219113cb27798badfbd11f294a059e49f3ab153a9ade3e3ec8dac4586ea9a6b3ec427a1821df792aa311bec35545d571965a97391e76000206a0a6d7caef36116603f04f2585885768394af4a2f8c8e4edb2d375a06aa94f75cf1392551e2b61ea90cc80ee9bb6bf1f273dfe90502517d1956c75ad87d7d9b86e9cfe2ab21324157eda30db8f82d6ff6e3055ca96f643182144716a50fc9e26cba66f4808ef7fbb1f74da4943b5844b4ab36b7f043d68cdc56910a02bbafd34acc2292a20fb2703cd4c5929993c841207f4121ab4da4755b2648e02bf826f4745509694457f7ac8228e419ef8f16e89c846abcdba6f36f137a3c88aae6bef6dd7cbd9e7d0d04d8e50d180c0b515881e17bdf2854beb00dc01b08dbd493c3df48c558fc02146b1002674af6a65b6ce53fd90f5a22dc2a8d6d13c2ebf521d95494209c3377ce25ac6dab939ab21d63e38e00ea1ee79fefb9845200dfce625e364ee0fa662bcbcbabfb3b149ce52859f45e7f3e2608773b9bed15346fb4e5c2dd73de000dc0249f20554674a733b31fcb11557aa5de7799e917da9350615a144497975625711e8ef28147d18e1ea58b6344c979ffb9ca9c84c557d872e271670ee2003b904afbe664c23b20d727145bb09f351ecc11635a3a30743cbf24c092d689cfe294efdbf07adde46fffbfc76bcba7bfe1f0ce282046d6086a9ed9afda08bb411ae57882074b8b37980a75acd2a449f36b4c0a67e9ed81dd93258602a4ff30e81b1e887d7f212b5a7575ac8b121daa56b8f19673a68475e77684618d88487cae09958f42916b07ae99cf06c6bccd9d6079b8e83d00fa94c064bd8659267c11de9ac5ec5327ca416fa12c661c4964747c7d0779b91577c6805807626e907fc5a32806bbfb37410bd3a7da038dce9dcd9de5a06e898c0fee310e195cb37086fc92d12a21ae59895dfcdf45ac1234a86218a3ae82dd395d675c269873cd3b2c98a120f42bc51a4320588c0412c6e3a075407f13049c91e7d8e1007df0a33e1e23cfb9a87ec1938f460f0e2d5801445f60d598eceb0815d12715e41bcc70d8ab1ef9f8508832d6eaf9b5349228a80952c39ebe8ae9a3a292514e2b3011f12b6ea9f4dc27a3564398a8ba697ee685c6d6b8547d9c29a98cd7d248f559bf3b8a7f7ee52f78a06fcf24f16b755ce12f464f9d077f7317e1a1f052d57286c5c38bf240bd1321dfa0257481b189c226242fdce35a198180e25f971130cad2e16295bc872698f9c1725e91dd732cb7540f748d1f95fbdc7d1144aa89dda555ad082742a00024f631c4ee3fdc85f11f3de4779756b7429c68ba55cffff1b25c89ce81d13cf8a3246b040056de0c9e936fe5721649fa5f4b7182234be1d9046f08e24907f2334cb3d595a9b9bcb1d19f5171b0d74a17cdc1d40d7ce6cbe7dd9e20376502694e4c2078988ed0a2f9dd57030d9b33988ecf95c090822043d749c9152f7330b46e22b4711a5ec034a2847dd7531611ac856e65c5b1ad8f154cff84bf3d5b082f61390ec2cac209ab202237217c3e8bb5b450f28097801452b2e1c1b953b836d5c129d4be88edb18bc2ea997cd98cc191d37d0fd2eff1ec2ef526620c3a0400d1129adb96047e58993e9251dc0c47e00c94b8427b05c024d4b486d671a731e6c86fbfca49129b0afc90a3ac8d42f8f4cd281f8479fe062067f80978b2891561eaa5f6c14d655eb9f86273efdbdad15fa65113212b9bec498927d7e118a25ddbeea6e200079315832ffc0ecee75a04dd2d061dacfbaee589069b0db296722119acc664a8ab42ef68962b86d8577b722fde121979099fd9b10bd2555fadd80d6212291093edb60f07a4516d9c6f3ae1c23c8cbc620dedf8454e83318e7a4ef29fa34518eea7766d268e83a343f61d77162708e1ae656075ed57315a0dbbaed93cf43fc9693ce7c9310891846cbfd6530302e92ebbf347945e45f1543a354ae7fc4ad5884e0738499f9a742c183bc35c41c8faa3265edf3bc2b34836acec425c010d5241eb2223b5be80aac2869c0be6ed7c7d1d48c6938402f83f06850b311ad6e090a42211135c0fba6dbebe83854c1929568c8a865b94b822c0ec36d470fb1136a71250ad730928a29e85da5992536ec9b99b1ce2930ed6bc9fcbe00ea1b7556ff30de9afea1b8d9843a7869d2737f791958e8154021579c38c7aa150abed60d08ca7dbb0afd42052dd0c0fa77a1d9ea831d50dc92abf554083c30068c97bee8aa16642e965e68a9804f5055062d6629c43148334be6e0712eb5c77fef2c8b508d869bf7cd696d1780b064af7e68a6105172c5694f8e4265aa8b76da3115b102e13020df1f38ab51f7e5294aa9bfc2d2e41df33c480c3f54267ee85325fd1360c20df0dc31dc02e8c1b58c9154d4cd3640fb86bfa4b34327c4711acd63c5bbd0211551d42f7bbfd14f822d03e1f4c80c50bddac451a163172c42df1e0a26be4fc608034b5b43740b1e202ce00c079abc9825bfa1328c799b772084e12366d261fabf0a62350aa2bfe1a8d9b0ae13f44f8567539806bc5348337ca8add34585dba9164c82080e6420a3cd804afa9dbb2509c396ab237ba1a74aa443f008248146bebdfa14256d50c3ee5ca0ba0533a64014e1119a805f0c6ba0345dc1d8827cb8eb2a315a91dbcbca16e2c22a97e994120e784a1f3703100d5a656bb0804967d4461ab37a6d9a24840075bdeeaacc86ae780d4cedbd9e5bd3ce7b1ab32ed9847ea387999650529e2ac6c694e6aa30370f9c41b79a659a520b1ae7b046486a2480429580022322982913b5b9eeb190e6567b509abc4ec5998e58159835f967d840803cec045884476898bdcf7fd49aa546b49c6f4b07ae76e85219420b9f740da060e4aa4479e894421863d71d9fe0991b66eb55805a26dc5723dcaba72d780e1796ce7d88678b1d142bfeb9feaab04a3dfc52a206b3571c088aa7b142593fc24cc71948066e9741a5356746b2b0489e782892125d72f2dcc116d591bfe20ab1de509c7bf6693c00800580681fe9ac7695d1cb2f44a08e7cb3303454bffad00c943b9745803333498e3fa0be6472e1c8f0e37956ea62a41345dda47f9a9ca14f08abc3c6f2b9ba79fa88131186c74673423025d3be43c42a0dc6f47f1c40bccd4f51dc8fd906ace6f87b530e7591b80601c88a509bc10cf1154da097fe4d68bc49f09ebf38e4cb9f2b8a012ba8d318e6bdb23c39809083f118b1424987999197d515c30805ab978ed09ce9feb90b3528cc5e53b2b5eec23a3156ac8674f27abde912023ede407123cf1d7735c468a599f0b8004dcc6a58d2ad03027ab7d4ae653de553f80a9f45585261f731afb21418699ac79137dd3758891260b75952035b8916604cb6aa2fd0332b1551021aa714543b5a0a21c8e8e0fd07e0c9b0f1c72c14b573ddd4c9b3e4243f7b336a27cd94f4ed567ed2e8829afa01e1be1eb44a07b3882e0d93840cc36d574e901dee4ecb0c3fc11b3f74546cca384845ef121f1f74ac0b257b029db3e8d8129f1719125f147919063d44025de2039e5fd26d6b39250e1889976287373fe38d667e259c5b61058a725011694d6fe0e2832b12e2f227f74d08dccc8f6abdf29c5b00e370755c5de86c4e34e9d8579eba569c17f4d2a1076a9f31bee0842294761077dc5163aa7c209bcd85b2d2d944d3ff857a80af2972c671dbcafbd301dd0ba0aafc5cf585f0637158435adbf0e61d60ab29418ddb1389609dab1e2120df2f91468838bd804bd2b13cd613fcd28e8f33f6b89c6b02286d938ed222491dea1df3203442a0699a1e27bfbf4865a8add602b1047901281d7ffa9390e2b66a07d5584f32060bee4ad19f2df8fe16e0ea5f9be1a96cafeadb72a9dcb0b7c96aa9195645923042618469ec3647e8f296bb68c56b944fd84ef738caa2261f444a22e704d994eaa82ad689a2bd540b474ac43e75e2e8dba1a88f8f007759a867f96d31ed11f3e415cb5b7f33d4a04de58b0d9f36618878d59d418dca9623623d7dd7a9d4547268d01d63b4b66e5dce2c823a21d22ed67f7ec1525d3e6e5d7f9d8dd5e96d710a9d405a31315a30c4cda8ff1a21e43b0dece3ec26785abb3e83d42cd846f4a03c71f23b4f027461997df1a96c828e2b81295900e77d14196c9eb3f89753195d61342ce6123509f40fa24c0fc18fefbd445a6cc9359fdcd3b7992913a8bbf95f0aa4c2074e78e280dc8c8239fd01b85c66e42e9e659f6cf7df3c1b4d250b860818a5b23f84580899c3cbf6ae7993d5c68d74332dd9ad899a1641ad7de5e804779b698c281f4f65ae9713a90af7d68a480503e43576a1a4fdd09c5e7f352008d1cb676368b560aabad7fdd1a76d7d09f72c6836dd1133d0783490d8b704aed2be4b9a69467c178d0e96e1143f0f17fedd53951b5427c1c42f46a84aac987882f26ebdd0500be0fdb06e4ec71182e4c6cbe508b41c851b9d1bd31b0ea02828ee9cef5b2ee157b6d360f0432a586e0d4bc5c8916d79223b2c698a809a889b9906f68543b603a808771962102b3d12d2c123a7ba259934952659fc79ea19e4ed5e60df0a3ffeae5196ef81cf740cb412b9559c872b436a9f3c0af9cd71411f16100490cfa3b80c8eb97324fee245b42f61197756bb11a14b2784e1975f3e382f1080b6d3a0932a3d08ad19a32b8f8229a52effa75e539026575944fde603fc7e57cfaa9694d7cfc37fca832d01b0569b59f78f5a911457ea7e5bbe2a14455f2e15ec03c06413ab9416b19ca92b232685c485c0bb7991e12473a1363cd70529be70f89835daba03741634a754b852be0b3af2dc32d0e2b56eb8adbbc042672bfff4456a4303a9eab8dd2913b177a0859a48fd1da32b31589c3982d44e6c8ac76a81c41b9e52ed39b465ac9b311298f3e9e6124435da7c9a0fa14d217532e8add241d846ee1bf9d7c69e963cbc502a841c0b49f1e5ce6d0622af380a7ed081d2427e44fc435e5341fac8825d18d963cf3de81a048b4fb92f83b13c41fd97a69e20f7ba988e76275624f8e3a60b7f6eac5739d78cbfac819a941a97b376a534d0f50fe7e6bfdc14fef08937a8c4d1a2b706ad79b9582a9d3b8c1ee22c95c2d0919961776703a40c015581babae011c8c6106f77ffa8c4da1a197e2d58e17ccd1bb13e1527f9f28bc350fc7bb47eebf1a807bc5f4c54f11ce04f13fefc7d74bd130b84fdecc512061fb9f2472756fcf73c0a33962d8040723d37f9af4c32a039edb8549feba7e5c5b8aa446c996184fda22cd2c26e5bbe8297cc63c0480f7715538526ab17b28e856d3d155ce56e5ce9f62a395028bcd27ed8d90baaf29edb4d7b1ba97ddd4caa50882ede22ec272df46aba69182e4940cede60c66717a4aea261157444bb8b926cd609b3232b1c2985401bd178bfe26b8fd42adb61b7bd02ee824fa1dadab34eeb655289fc56da997a63c328f3257dc1a836c55e3909d8122b316f813e413e562897c00f77bd7206fde198ec6fc418b5e00f9523c7bc302324a9c2a1bc31baae67e8e9e704216ca41f30a4ce8b0d951964abb182d30c0b401bb886f2557519872676aee195b8703492c39a7cb9e1eb559ea5c6eb32faaa201e39cd59e1be1937c69960e3b3851a362dd27a9fbc6c4b7508dc6bc12f3867f007ca9a1fc49ca0c637a68d077f6dbe991e721c838fa3b49c90d22ffe5b7858cd220d7ab7a62814d449571bf0343cf59cab79e5892ae7245a7ce9285a0ebda87a4e524671080722f18699bed10a450ec4c203efe3bf6df3240ab183f5a2da1111b811f8ea8427a9c6098009bec08c3fdb25cd04e21dc868a0fe3906f9a455380a487a9270cb87adb4bb21460c5a89da3f48aa4892ef5bbd4c6a1d0d118e803c09c1d8272943b68c521686ecb3612a7b0b79b61a317bac3786294dfdb6bd13f8fb73bbedab5042b1e4bd36c26337a1f370b149a6482d3fab6fa6396678ae40ab015eb3513d5864047898ea33b863ec78ceefda6e8eafb0b536be1e5327682d6c908cc2da6f0042db40b610131e515b438ed3f6be66ad1829fdcc35a109989f05b3728b959249b917fa7bde22ebab1836d82c878d27c4a9c9d5e0bf906108b79ada9faf8750c5219b83e0ebd835106d78f4d37064b0c201ce56944b31042983dffa1af6892e025fb3342a36a58a59f582f2fbd7873746c9808fad185f8dc349532cbfeac692d96998c4fccd2badce67d62be96e57df613268a56e6b39f685294b2f6ece7cd55d3986570f1d8ce41cc1a7bd03f9837b9300e1983bdcd95e3c91aecadb8673f0fbe0534473d55627b5850198d9ba7e8737a3c26fd31585ea0cf6b26d5eb652967f90df570e59e4ab882c573832932cee06651546e39b21379dcf6fc2178b64dd3d73424b9fbe6244d4be81e0b52a27af28abbaefd266940dcb61d96445cd478093c58860e2bf2472b08ec7509208a2be82ce532200a2bfe3a3cf6408c0e7d8004bb20b1ff8c3c25ebebe1c66d296326803ca7b46351a35e87e5f8ad2fa738f6721b7da1677b8de8828b4415804c28f5449a7b69f41283747c6128df1e2868b90c6ad7eee521b726e9f6068305ae3c219c6e613d31185c8a45575897ffcf5a97dcab47059b6e7c766fcc5123225bd96e65dc73e3ccf9ba1ac4a2b39649fdb52413f9c06cf49639c0a3236a71d61055a5a1b60495bc743d6137b77236ca2dd9893284964ebdff3ce759b7da275c413203ed7378891563adba5e8db88caf839ebf3d78a10794fc554f304e044ccf7f3a19eeb28c8a3be953e32e95f67cb239e93594fe77405201b52bd1d349c1cc4ffa11b53ad560f5f9989e8c96c50a8298f385851a93fbfb6083199237ea789167c5825e40c2346cd610aac719b69cafca291ac9cdcfa353d0705f76d56251b08cea3f17ea8102009a73c6490b9e70ade64ce4a92ab9a24434a85a7bc2c2a2901cbbaf524441664433b6cc089264a824ba438fb3f3e410f14ec31aec11c82ec0676a30895dc6a2f9cc62d4fb59d68ca53511169fb1b96b7c845731a4f4c2ba6f4f7758bd554ccb41a4da3bf14993752f703835e0e92215cf6594775c449288e9615e2419d68697448e79a8f8bb6249f48b6ef708a0eb054a0a256b5d8eb9516424fb23ccef93d77d38e063d0ca46c053146294c32becd0540a042238d7bbeb8b78938b008b3b78eacce0314a4204471bad29898d538f2ef0580ff4751bd10f584a077f9c4a853823877f650ab18ace0f226530c0666035247ba137e6e2246785ddab39c8799b3a10a3ea1f50c62696595e01ba752001297d9168c22931f1b2d2c986388c95131585602864c9b4f7dbe92b1ae1af7af94c45e576d79b5e642e907c8e3819b805b5f86b2158d4861153bf5522668307645b20d70abe0e3de8ed475f155ca35bf25affaddf4d281f0c49a4e3b87852587b4a7141841cf72b0a99054863a001998b9eb13599b778be050cc28ae5c2db047175e97682dc7e2ea25880d1acc99ec6ae743e34013a8d4031334f69720e7fd293fb26308398e1c56c33982bb1decdb12b194e3b8e78e02e907412bd34ac1374dad3c0cdb54cad1e4ed61d9795e36e39532e6c4566c8f6c991cbb0f30d770ab7eb3674eeef8c4e57f071a8b65bcd88e0038a5cc78dde770974681736df1b5ea494d36095a5b08d18229b049107605f0f31d6483ad6949a97d422a3457e8c3853c5c583a0a41ef7e02a4625e36e2150a138402c4f5b01710a5bfd6109d0fd55f4c53adce16d00fec66b58b1c2e220c4f597ef6360c68d5c165b7ca780e39e6af3164db61d9439fa22a90c6df86246f4a3d01180d739cbcf7d680a1385420ef84563f358af7b2a24d0fd9ac133fb386e6d4dbf495abc5b609576948fdda760a1dc46b60e85b270902ab762602021eaea2e64402385697dd9d9d26d362881566a49dcdcc0ab547fb7c1e5ade15d5ef538581d5b52f8bdeb5791f68e19e9fc3eea77403bff8b3b117d95537b7da0141243c8665dface445d42175e100442eebd0fd45fe069be449b2c7f03db7d6e43c5d7fadcd96397984beffa31c02dadfbac0a7b4dda03dcc1ba727f7f06647236e75e4fd98a0cf1ae84d712a04fd0b2ba227bc0ff59c20a0bee4081fc98dc1f5a11820fa01d85a68cd9a23141a22b8f951074886aa29a49a85830235ae4ec3932aa8652bfd3260154b7e78332cd4a231e6e09f200540a58c5fbd4fff3a7f3ebec6fadc25b18c017d3c0bc125c5d53ec0298e1993116a85a256767a9df6c7784f2b699211dbd990ce299c3e73b5ae2c0d6d90a526b0a5573e8823ec8b66a9bce469b199f0253acb36aa47e42b11287af8f269de8176aa10d230c841ca3638c87d0df1a33f60b868747025eaa21fdcaf120eeb52a542e3a2954fc185bc135fdbea0877c5601d582577904e4ffc430c18a79ac8ebb1aedfbd0661ba84e36c51782f1a48dcb839cd7c0327244227feba557c4abe8f208dad71f07df771b0d887981631250a984b4245ee568404a5bb96c5471542cd9f475bbc25204aaec0508872d1ca32238aa72a553691b9f7b6246025f94c0ae11f8455c3b60372c2524edc41bbf48f48dfaaffab213cbbd0fbd4c5aaa7520619f07db51b89c6c12ad97ef0b883dd58c2a028768752bc4e76a3708716d2cf88b5a312c9e22a571ed5ed6b07ac670b23a7343a3b9171aee8ae9737c1a3c5324da0bc12fd260d61d8a0ac08960a9b9578d08438c1d5e7869e005fa7100b22383a54fc0920e71157bc1fba92c9e534d4020bf942687f9c2cb06e26eafe3c777d778597647c386acf43698dc84ba1dd3ab33f42e021c00b53f66f6fc733f627269d6c00894557ca7750c6eaf588e015647a4d4ef424008ec9965beb8db3b4a730af2a3065ca62506b9915f5eb0dbf9766f391ba890aeda9d8051c776bbc059fc598b9684b29ab4cd352310e3e0b4c616eadbcc2c8604a6f0aefedd18a2f7859656cde4e055014e7401dd5a703ff340734a291e46959350ce629606ae48b9a6e3a4a12f47215093fd1a5069a4f87348baed94ac3ea76dc5f9c67d00fd4add3d61daebcbedda2da0fb14c5930492490897c4bad9b5e3556bc73583bb4bb33b7991cdf23734497bd23c18ad3e25b40dcc9ddcfa6354a3dcd6a7e58b0752f30f0f062079e6ca986e7e2a9a52f510d8c7c807bb4136594621e676d61ea52f446e942f9a7d0a02d3256f2d9bae517d66fab642585a4b391f0b6d8a2f4ec374024303f7c1672d145a572bcd23bb4580218839295c9ac9a9946d180b2bca6a14433252f838f97e3985cf1cdef8136f93a0847cb980b2e11398189fee9876aaa6ea3c9333e37ffcc20d56bde47f973d1eadd4391b9ebd2e9bc210f957d09e5ed25fb4a607d6de023f8c80eacf1949d9d008396a7a6163f0b8d6ef37e800e508d41dc04d99d9eea5794c7e61db95c64189c4e4bb90557b0068046de52a38f6bf094a0cc07ca953ff29fb8f4c6c6b2abf74256a23552fcafb0a089fefa2547d5c3c0a85e2c31523429d66882757d9908ecc7cca8773e94d327f19c6665cb2d878d8e0b6ea7d2611418cb41b6fa80bfd1f13319b312d4a6a02b2722d9aa0212780cc03ff69d044478669f41db0ef5e5b1f807c439823e3efca6cd25fc6bae13c1710bb3494564c5c3f540b66fd8834e21cd5cf78a488e9368729084d0c8d4651508487e86ce96d27e69c2c111b8612c82d6edf1ffd56d57e374d9cef13ed58e44c98fc8c5f08dbe75c8e1f567ec35880229d40b746cf81da54aeeac3b79f2694435234b316b95d64bdeaf020391ed2ec705e2decbe16d8731d60d239e0c122f413c7495fd132251d606de285995f64ffd3708e85b31f5dd82a4f2b13a2d76ad3c18814ec98d42af63008917461d44730f7554488050fbcd3557750f704183ccd6ae51497104cd02538872ceafd2c87680d1913da2deaa992ca244fdea0349a9f04276df889d57941e259dc0f57194e0853f4da8dd057dd80fd4fd2e2e2ca17d4a9efe34b6e7afadfd7bf0e49bc1207d22a9e9feeac211d0d5df323e76a53603900e88eccfb81f74ff868b34c7028681adf48c2ae087c0249029278cae2cdd0fcb240b129545463fead16ab7c36160d9d4feb4d35cc143eb189fa9500c01ecafc5898a0d9711f135e7139f636ac08d4df377c344f61bf6fea92971d93f8019bcd004ceaad08b234f8639856505e11bc78fd6277d0a46531fcd9a5918189dca36654032f44a3ed0d8deeb1f85c7f49ee9352ee6648e3b0ff47bc3cc8dac021903579597a689ea37a40d6ae7230c5c3bcc629ebc300b016c8b7fc7ffdb66e4ea7185c8c3255a0732a1c5cc00f41f724a5a8e4fafd9e796b6a4773737a54b2687a4f224b70b3c0ef2b6272a0fb09d3276da096511f81d25dc5387fe8bbd07de56306f67c97f2030e68f666dfdc38b980637fe5d4f877f5f29b02f0e2fd5956694e4b727899f7030eeb465e516110b41057879edd80ca22fdfcce8516c82bed2f942a13af33d1b78ed3b7455dfeb3b1e40552af1ae28161182ce618e8d90f913cec790b1f0af29ee6d3abce7ad147777b21749eb70b531fbdb718a750f9292f31d1070d0f7e8b168d0ff2b7527f047c9d171e14b19bc151f3f2818a2f1b04aaa829a2c55e2ffe6a7119a88285ced8badcfbc8d14992912700bb45709d3aaf76c074d0d84ab1c967dd644775c066cd8f7bd065afaf3c8f46f0b254b4c442de9dc3b328d660382e78790bb18a23642b75aa6acec373eda87febe5ed623cb60aa0e7e2484137687b7b843766bfbf0a9c8e6e2b2b72af407c4f26615157b86b0867cf853805d3d49827f5317efe0482a0a59b61f8cb21098288b67346602d37e7ff6e736b0ab770c8e7574a972031c34fa84201cb3ec68c7b8ed1e0892de4fcde3dd5433b1edb6ab6acb3858873465cfc75a844af5c72e47e463d85597c1a4487b363019f84c8e4214a16b8e27d2b883466e9fa0192f2cd06ab55188c81601250458a4c7172582407ab6dc717674ab4771b1b4055102941f8511ec7c1a710e7b3fb40094a110ef6883eb7a2a229b2320255c58f62d16e353cd53362c3fb9d2ef8d30f6f092a740891c550b67e1fb66e0b9231960521bddf09fdca19397511bade335686281a824807ebc6eb73b0eee87a9b3b57a4035ac3b3add7f90f6a1a19397cc91cb7c51f50b4ad756156c08c18ab2e0cb316b0b703f90db682571642358c2d27acc9fcadc0d9b672bd1bdf89f78c74239f1b5506d799780bc5628f8a443780d22bd2f033dcbf4af2b4b868063e728b2299248843c86e971f92f95cf87bc1de177e797870c47e9cc666a482c18b6977d33ccbba148f07148a1dc1df5fe2b4a6d537b87ff9e540c8983ecf9021f221458284c12e3dcf83280fb1fff38b847a715bb0489757e8fc82963fd3adf8dfb8931c5f0b18a20114594a86fa8f29b077553d5e745fb05d10d2906df7d9d4b6ef5c37d9e2984905c4675ce7330715f839fc9fba5dcff6b4d3f9860ee270b992d5921a804668d1163eaeae24b79861ea912ef8c932ffd8c3eee16ca2b913d055a4bc1d31de75adbc0396c04e0457e499e6e060f8f3c114970dcf3c3d360383cce389b649037183c4265a5c1c47e0941996b492b2671de618c41d6812bfe4adcc586363fdd2a2698c2aa111b39100b2e12836102e915437b9bdfce72d8ecd9a8506e61647357b6612ea6f9b7dc720f0dbc577a1c7b1187f784d8746dcb8eb76610e3cd9d8d3825259e4afae83d96beb9b6169c43b2fa87755bb0dee879390925ccdf5ed4c545d9442b0d6ed0d21c7109fbe8abf2245676a4a6327f3f110565d8d113725d51facb5d5e2fbae55ecaf4eaa94524f5e012f07803e1cc81dc18ee26f7a6f9cb2a8e7bd4ce650c101b400eb6680f4abb2271e8b8a1de40b99e1a81d33b315091a12cf74bf9835b81f3f47be6bb16d1cb79725f0d412b10c8fce49cbb121a3ab603b8c8a96e481546305255fbcd3f2fbc63b2d197f4c641d9246a8cffa75718b27f01eb25a077b4332f88e2612947f469a19f1bd9e501101e8e48808e20f46368e7d1bbca0146af4e805d6dffc30199a6bd879d3334535d249cddde8ef98915e03592ea6870f2a065d106a2f74c6263c6cea58e06b35d4bb00e36c258fff38f8d7e2b9d7541ead2b4f52f8475e3328fda11b8a015d3918f5f51149306fa3172ff26692904843df2e5e898bfc330b2c69c32a2f86c327adb760c0e8c2efaddb7a85e233b50f29aca086138a8f9b34324f3b5f29e2995d454927d16f9cee6fceb3b496897af17c11295c61a2ab1f07e4063ea0dbd72f5b8e0479f49a6720e70cd8912d9a1c525a38bdc30b41a994c38b1083230a1620b08a4a62ef66fa085902564196d9c072d8caffe117ed77686ea7abb6ffe71d02622ee1dab2ab1f18fe2a09930eeb72cb84760bdabece292bbefc441a285108d764bb0592a03e4c7efa2ab222cc2a92a0ea27c7148a4bae1a5dc5138d8bb01dc0ca3a01b4db420b84ebf34f61ac5cc8757a623906ef4d7e052b94fa38ea9ed564ce9dc16b80066dd5847a8e59711e09c4be695ea7467273600df73a74b4164b3e0a3f116a62fda9336dce35e5065987a2ed7de6f0bbe772ab76ac98bab0e967e9d5645119a1bcf3359954dc377594769b55f035180ce4399008e471b5e1c0f512ff762230d17183776ab29ae01c0675c9cf2b4b48e8157fb58412deee2406e41ac33f2e8c7dc585272c31f0133e3a2d977432bddb8cf5b5abc7bf0251d9ad84dc241f1f1fb6e952aca45aaffb2283fb967f01e3cf8197db0418ff6cd785b69b6dd2f91b90352efa10f18f989d7beedcd7eabc4ed1027955c0e295b5655871091a2ac8c227dd9d76df353763f7fcb880ddd9a2f5f40ed90a74f07e0f7bfab0562001d6b8c479ce66c85937dca5a13bce99737b1d8d9295bd2a9b7faed750f1171ce1e8ece8005caf71f67b859bdcd2396637336ebd7e61c2bb869bd7738d7d51414462e6c3c0b9ea934f4ba6c5fd08cdc8ec25b01c5d5795474ba6ce5840cc479d91c206ca09770522dd4e81458a0a5836b3ef99ac3028532e1422d6feec7defa1e353323f4e908e17e60d9c7929ceab4514e86564e78c97572925bc15fa51ffb86f7c0b0bd5260f3009dd78a43f4d5aa02b3e01817a85776cd86186867d3449b88d8f076dc5a64eb006f11c88015a60dc41e3b413209f78ea2161b770b083ad4b0a0217ebb91a2aa396b9eb31d310e7f7a3f4c919e2a08dbf14f56c1f41c0c25027d29fbe4cb7184ac10d570d603faf908b78cde93ba9a33eb483988ec2364058929f530d5b89ade262cf762fee05b0afa79ee3a8d7238754e743ea280bae2fe9eaac6649d32baaece75a7f0efb4ba41c0e51c58f5f5c3f7f4c2ad71ef9dafaa4acf26617c40ebe86857aba475cf9195d4106224101929835b1b39ebab6e0e6698803d4ed0604dca4e67abfb466d0d05871c218def3b28a8c2243177ad937448310c20e8c6ede8727df1971523397b9fd51900958a511c5579f9d550410b7dbb45425a2b937aed40143f4dfe368af93820a34ae43f4e27b7aa7cc746a364880aa0111d08d4f4aad979448c674397f2dc080fb629856a8d4edc2ca1e4b320627b3b805ffed97dcdc79fb547b43a650eab3e13880cce07b0633404d5d1c9b035f7a61ac4c950d666cb6666da9052098177334420046480a75685eaa1a4f8024b8a47d9853eb6c933b124353712a9d73e2988ed6004cf00bd77c618467ec3d9783397ff6b093dcd36c5dfc247431273b9187a320dcfb7901747376252e08e9559ad9950e9f5205401467ab12c6faa72b66ece6de02578904637882069f9ec262ddaa87754f4b3fadea89ceb5cbbdeed06595c8c2f4c3400148f9109e6bec60a9ecc52eeedce6cf22685d2c38d058c1ae67c737be7f3e47fb814e770edaa72a9c147114b85d2d55ad82d6c8be3ea70ac216683faf524176d511bb4dc36429a5c7df1424a4ad357942596b0af95deb6c85127c8e2acfed525b8c1247c706c11e9557096a9d91baef164960546860d9bd8699391f35a0705a44a2d94dcab827d07c790672711900fa0c344aac8cb6c2aa566e4c30305e8e9e70faabf42e25008278995f613ee8b19b64a2d4044fa2c95d1b419d64c4ba47c86d3637bdc839cd767a1416f28036ea2a2259dad20e85c9d4aac05931273f80ff09e7a4208f3cc126e9f435af39997e031494fdd7e375420df15dd2194dee085e90161eeee0dc5382c9f40765bb5a517f4edb4c1bdcf774eb8b5e7c10982446524e9a9fa043f8adbcbdacd1e24b049ceb27974bb1bd5892c7b79fe6ff360939497a53bf97c78169f59c3011030c648a0eaec919fea5127726ff557d70cd9d09ed719c96b43c4d37883aa6b384d2f802a5ff83a3b5fb7b1174bf19ad7af2c2033eca640abae67424264728ef7d41dd526d00908e8005f48125994af20af04312f80d5ca9f5d7bd145d889f870d99b51c818d0f887f76405167d89085569e6517ccc7f5ad247d53005c1c67f4ea399e8996071f172007175a963381d8cb5f8e820032c75344d6e4723e7336ed45d1d3255bf6c28eeaf7f73eb8a58e7cc75d487b71811ba5318e8785dc090dd03552b6e7ec8741cc18c8ca50c1227c11d0a2ed79f864e41b5f1c517cc1a7b55dd87598e397239cb0a679e76991ac511527965d17068548ddb6c181b1c179b9f3c8e1a48923b23ce89101b3b08081a085ee99e4bd9d29db4d7058c96cb0300e48d077aec68bd97ea0b9c5516522227bd65262b4ea35439cebfd52614f15dc8e875b73ef50ac8a33970fd7190c4e17541450c7200ed70d142f917f0afcb35d94a6266197eee23ee40547aa90304d3459eba8d0593ab52803fd7bc15c798f67ce95471c3897f424ceb661400b8755f9c38c117ac9188a51c042e53c854d15a9b9906b8b759f4a206c1aabb14cdfff3993bee06609f138f0c7fda4d141961dad0d4b3684514c5482e63857b0733fab52e9ec1df74f15169217080de27a1c8c2a1178df2461ae6019369223391f934a11798660708686c381670881e35da28bafb4d935977dfebd13d226a56758621a9c23ca557617b6433eb16af36f21914e44d0c1e9a2edf7b55ed1f2ed23d1a25e27fa85280a010438c8906a8d333479c5dc43262fcac80b66e41a9f235311aed29f0b12a1aee119015d02d36f245ba021fc5a67b6c645543855b924b813bd856189a2db1cd0a3184e6162eb44c95182241f56926eee5b48b7c37e0cac909570bbc9ff40b26e366dd9488eb92e1a02a15339f2e788af938172772e303f4aba9c2d521a1e975371c4fadb7566d1fc56a505218e8bdd2b599680810b4af234e7cc26e5c74da6682e0b4a0f09f4f3c7955c8549b9f8737139f8b339d6c9e6422524f28cfccf0325d35b5ca3f438e6bd9acaf332414e7d4865f20ea415f405a3ae6073d219b05b10669d736022177cb0c5e57e575d963e256959f714d902c57cd8b91a00d6eea564dcb5ca45e916173b0418a8ff3f0d9b995ac173b2b6d2f4aa9fed9b244f888a04367d6a6f0a9556b75b90ab897ee4b65947dfe62424f64d8d3adf13107ae09e8e4778571046eb121f9b091b674f3611a552a50f0353c0c928f60e586968b08810b296439d3ab4f751909823fd72d6f152b94bb4b4f871529d34e43eedd494c1faaf058931e934b1103f47faba5bcd2b86c9dd0546090bf49d8d6bbb34ea0df94b9d3706f3fe7800d0d60ddcebc249bc348924d5a1bdbac35799d1ed23e7f7e68d0822d7bfd8e813abe6a32fb2ecc10004e6763e43fa6cd6912a2ae8f66cd27fb18d55cd8e0227099978023b936130f2d6bfa6998d7acc49a8f95226fbaa614a734d5818273f8151ccc68e6c8456d0f2b2b1cc16465e56e6a8e36a9fd4427ddad06ce8d74fb564ef4b10e4f9bc2043c96d85fdc2c0841ff9a01b87f2a8cfa12e9fc6e49ab931d49d59fd9b047467537aa2b2a9ecb94b89f0a961219e207b8bc8448f5a5463a94100bad93784cae757836ca157b5b0a4554af813a911ca9548d61d5b15e374fb32c70f700fbb5c50de1c8be393999e1c5175dcc9213aa2c925d93b068f870271c677604e2c5b7bcc99515b0e123d209aaa183d39492117a2f2a36c16b5c6d60e45d23d7fd5a809b0e03719e02b88777cb7715fc5dac750e768dc76c990c3fa469f839ea95b366c87345b85e8e0a5220d164396974c449c8cd843c91500120f51564d273d922ba809f62d837ee0aeb985d8d7c597a608525c8096be9a439361498d6f45dd1b24d803460ff94a01b282ab2b33f4e0583ac13f3fac7580b5a96f7cd2f758b93c939f102aa28f96119d5050687241b34306150e36a8701c540c516cf5cb0b8566ede314fc94f48250b388e6247eed571b3b59c66c5b0cabe4637636ee9784731d08d7487dd2f9dfc445c595b8e6b7e23cae39fd4b4c1f7d1679d4e5ed3e0447f28b9310febdb12de1f0e3201785e80b83fd128e8cdb17e70c58afd5ec02da4546b4b2a46d43535710763766e0fa2742a0566e5b8932139963262c5dfff110aaacbdec6006b4c76381537697208026678b51a4d5bbc327b2e371817a11de42e19b6d9e145aa55084814fa43a970dbb29333cb273d6e9a8d04ef82bd13259615253603c7301f2f4216e34563c4239938d480b0f500dca8468e65f7d0304f68dc94a81caeeb6e4f99a3735f13fd94d0e527bb61e06f2292a3b6c79598530a5c2c07902212622fbb2017126fecb8d07e606c935c6e92a5eb10be282d3489988e365842caeadd663110e98c574251719004b1cd6bf63d013638d5aad005651396ffdb3414e2e746d43d42799fcab4d2e2d50ae25250274a44d28c4a38e4f03f44dc17edeb7baf90afd8d117870b9f4b5977336764fabead5fe50e4253abe6e008264a69979ae35c633443c7511ac2fac8559ed2c3e1db0b8f444c469ced8e76f3693551cf860bcef840220a052ef7a16aa378ec823f0aa95268e356e385c1b3e05650953cb02a9c9e1e7654f87db322383d0c105104521994b13a5e018a0065ccae933f7426a6e0ed933cb1e10b7761d11267f0901d76b32a2b81919ad15cb21bafb46f87560a0253b54212b55b1c81459d6eb1f15132a6da4d11b322b8417c58ea3196d879ba8b650911c256ed8bbb113bcb9b986c15a95aa75cb2f1ce13b29b80aa71ae81dadcef3ca464c34d0a6910a5a96e177d869a9b1b0e10b03d4fe4c5755ab7869d41d3583635bfeaa852b88ca17a3519afee5e7dce3a55606cb82dc17953a358c066f598d93ee6de52e27d8dbba8e1a316b783c64c509c521384f50d6a1372ec8ca407c4e423f81c7dee5106d57f739044202cf70298f9b1f2a4cbe10d82f5805a74c288abb0ddd56f4a9c5929194a2dd4847f59a5bc8e278b860b094f936dcd3c6f6c39b8c3acb6571e3c9c1c69a6163db23a3472b2da091d2cd422fac6326edd75bf5b344a1bc9c9530531ec7131abd3fc271458c8af0f6e7b056d8f589f5f6ed398160446c2746ad7c2f445c65fa0c6c901b39328ead2778c1f54ec3dbd5a6cdf37d8c63e9e4641fd3a6b47cb2483a6340b895f51c727663d86a4a1e8356965208a265c3bbab986050657947dea6c928e582b820daa5a17bea45ff04a00bd70135d554d47e2753cd6a9b3e06523d1b30b34cbe3f9d2ed9f478418e66eba52b718a594006ef4586c54b4e1c3732aa7b48d3b3dbb160a5f233c9d0628aeaa9603356ba133a864f3d93dd0091830fb966bc488dd34b741fe1436bf23218d28ac6ddc00ede14734523ed970f67648d4cd6f8c4a129353e9b1d9c4de0942210f79372c9a2dc79c3587b1c3aadddb88d78859f676ed9ac3e6c3dad72b6f4d1c6028465282325211ab94280f21cd0f1ac42811d30e2b2e1aed42cb67be79ac7526159da0fa3c25a35a5b3d89810fcd7f1706774f8a3f9e9274e8b5439681e11b2f8267722fd510d5700306eb600bf7a51e7e2223b12fd21fc18d5dd30c0df7b152cd4a6015e7feec1635d02d31e579700b338ecddc815026531452900ed777c47e3b1323f46b7d787f3497c2ef2a35abb9ecdfab594368d1096ebda8a4e083e60ddefd8a343559e9819c66ec1830ffe63c26153d97e6c6afdbb4b8c0299af151d2f8b8bfce10d038ad54f1cf5c81ca23d798f5f4c2b3425263f7df02dfc5ce1e34bd56d99f80d3aec136930b1e5b6682b811fdbc9aabc5371bc1cf626d05538dea6660f7e32d1509deb0dd363f628f99b5e0a333363f53b970f614198b3b09a8ccb2ba5401cfcfd781aa26c5714bb3bae0f12f730dfe4e9f469c218fa5d3fbf1ee669b815ec8764b538406a3e00f96fdb5f4704d693c3aefaf3d1ff610946e6911329a465aca16624b34c8cde2a38fa67036de22600523223627315bbc9aeb2012d2ad0e55197f72056378804239622c9db4eb62564ea5eafaccb23f8ef87905f11d677637010a14035a15996945a2bbf07033cec92da14815dfd58be9f83cea6b5c782309a152b419e6ff34c5cbb84b9741ffc9adbcc3763a88cbf34d919de5d0585db0ac28e0828cb5c6045642d67866b8cbff8328c618a0c7ac59892b589d1445d251169b52e2ac5fb7a38ddf43bc3d0ec60e858706c03a9f14392c91e62727226ab3e89d416434874c11ec4f5bd8f0c08169fb62c707a4275bdc8578b887ec8d2b8ff247eefcca7a886b1238f7803c10c2016d93f1e01b3d7d4601c6e514e77913465b4fea530a818c35e6157e5dc5bc90352e4af899e47445e9cf108ddba86a87b236bb623967fde721faa71d93a5a861bc68c82f70ee7d9f94ea3cfd40fb595b5787672e1150a41b674f0c26ab4a5a113609a8018e9d13bd7c0f5c8baaa8ee44ef2f00b2170b2551ecfa6df0a76b89f1be6da1ac3fb86da00a5b63a58b93c65aa3945b8836269a6aaad033c5486f33ad732b168c3f36c7869bfb2a4b1b1b7b93aca5ccb71f08659faf8badceb8af4c2f7fdf718329c56832d82dca75120c9d40e78905edeb2f7e24cb5a3bf4dcaf2ad88e7ebb9b28ccb4658058cfc58061a10f419fdb0c8b865ba27629486e191c3369e577504c2b08720096afc14e248c36f85a2f58088b7a9acf2c6fb2c53ea548c9b65caf7a36f9b787ca9a24db39419efe98888838d4e78d4c2129d6484425ee5a5fb54b5a6f602556b0fc2e8dd5c036b874984c0d192dc779e1bd6f734a8d54b5301b97e386ef66660efa3a9e7fac34b2a104e3b0fbad3b84728400b97027450548006b91613a2048b5c729902e52cd967571299c00af581f08d564b6e125c6f595c9c26700977ba98d0ea23bdb0903870a2c3bf3443a87f2d629a52fda02c7567093f9992e3959c82a8eb4b00dd9620da468955c27e070493fd40e304f8cf96b15f3f24dae8cd2430cb1ff7c5b5792a590d8cb6ee724e9e65d1d27683b69b5905300b01c83aed384a1f83439c7fe2c1453bd5bb3a6bb6be24b8c311662d3b020f087eb6ec83516ba672d3c0ef1075583fdc22de8a44512820d6d2e18434146a34b2ca8f7cd858bf86545bcd84c3e224418927320c645793bc25ca0c4503f1e74559dd3a6994c2d0f78d4d01332b72337910033cc7f513ed62024c91a566ac35c20f47e7fc49c754b8550f7a98f5c429466fa8a50a98e4a4a576abff3c80a2b41ea320454c25cc95e0381ca57bae87fad86cc1ac43cf55282ee8242af80ce2ceff5c0a14598d92dc14eb8830ec6c58071f49fd476530eaed59d04dd0e213f41d549c6f2cee9079c744c131fe436246f0f09aefb43c5bb74241ebd45db5848ba507444774113224f39e5893d70363443472baba6f0abd2363e3884aef5502ae6e587bcb75f75890634cd5c9d4a571600ab5b6ae95481542ed1627fa45ee2ca6419eee101ca5e3b81e40ad51f945e21aa49e28e715658c8b459958dabcab6e2cf07d4e4ac28d8516e776e483d28de9316fb76b30a2b5658fa411ea95e9c6f15cc3989c4854c0586c70aea65e44f10ca46f095e29985436c83ac2d443eff3a9a3d5133aac936142e872976e2775946281849814deb88ce7c0cd6b008c95b8dfa0e1c237374343c05f848c5b671fb48b671c55d00a75a08c72a4ac6ad3c703f2d330713a6f44740e3eaa76ac7394f5edeb06a335ea4e15d3543d79111d77b94c69530ccbf0e6bb1cca1e882d2751621fc88479cba553642b49721adbbd9897d8d09a1bf1df2630922c45317f5fb435b214f85fb5adb8434433e79f43acb1e2e13b55faa398874282189b6c2104719b3b0a4671518e945a47846eb1f59666a9b70e9fc6f647e3802567628b99d26b5d63a41b9351c8d672d14909bfeecdf779a89d6b2275b66aee0b050b585e93856144d3b01b8d73222c3e9412a041b0622c0514c03f61ef938ed3cfc4e22a501ce9f880e453154abea45598ef94cb1eb6e349decc0a5abdaf3ffef367feed04b85e5710e3624c9b14d1d7bd4bab7f91ef4d2ce0c7ecc13f16ba6bd1328fd460fe2ee40734061bd8a11660cd7727a0aef06fd9f844d0d88ee7ac3624eb8e13291f8e9f440a1cc662c92c8bdbf0caf769f0a86c40872a0d05f1951608d603f948317ccd4597f18c72b1e81efbdfe4836a329c22ad49b6734d0aec37cd0e1507d18406e998e914000e4859a0261747c08da77cd48bbe45154e9b2b18a6efe91be4669476b7051d9d64b3f9e1d4f8324fd28ea5f80639780c014ee3af88c3145571ca8690aea5a266045412ee02507b4c13f1d8f7089d89b5ca5ee21d84637cc97c63c64c5df78a7a05050bdc4068ca5b758255cd6f4a8049d6a8bb1983c26f6bceca34abd5d1fe890dc573f92cc5ac4c0b4d6d2258e0ccd8c03badf120193a1289141cc4c8e56c384697460a68fa1f4cabe296863bba61328209d600fd2739c0c57dea9b11ed2d1e9c271f1cd2034278591f54776a3775be1e08f523001af6e1b462453a160a6e5d6d7b133c3be63aac219831f19fc39a947bfa4894e83e607e2f9ecb014413776100048e5bd10f929be9845070fe9ddc02a13713e49d66e33cd35578045f01b66a44d3b9014d4d14f28df0353d73afa63d03a1554aa160702edbb514a6da4eb7c1f622cead5baf2c1b130227acbe958dc8a66dcbc01a0067203e3e40f226f66c0e8fd63bc68d1e69b681f9438454787ea15a80749b58d0c90089a1ffe41e7a06a26de1bbb412e68f406a009ecc3a4a68c7113441f2e4aaec6fcb14edefb69e0962ffb084cb923bcf63e03241b6e11fc2fc495bbac15071e57ffbd57d2376c6709a44c29bce4abda8b4840e9826a1f40f30532d7e65572c336f45983aaf373c6e062df8cc366a77e324b5341e58d37a340d1ac4ffaac4f0ce080c1a4055131551fe2f49d7042d175cde9ab99654b1645e1c1e14f7a5e1005b222c70ede57b648413a94bc26ca20aae379e7fdb80491ea8438ac54a8861734f97eed413d65170a726c67c193dc3027776e2432c44183d1aeb611a44144c5e05665b81bb7245eea43029078f75d473817b328345ec14829f21344154c5de4049d09cff46abe2696f9edba0647a62f9b7609d2c319856b57e8d2eace22c321d12bd70fe6b41d7b4437ae962f0800c7cf9795afc4fcf2a25235ee3713e0af3224d4a6f530bc08f259836654456b29116c21606204d8966e37eeb0848738ea5540e3429782974734faa0999440c915826f5b52120ff65f8f82f96b4123791ba89e4904b20cd3f61f9e3ee2e99c58168a67518421ccd7f790d330a317516346600a062aca85520dda25fbf15024a37448af11d28ab715827674f58acf31bcd35d7e66d70e7013a7bbd0068ec43841a1a0a4febdb630ad65904fb1adb8b06d3a6456d4e861efd7e32eb7e28ee49ae620efc3bb6b804a9e671e47a668b86cba6b1bdf97e826a90f72e7c7cb244c06f3b54778aaa41997725ac81899d4b3f05fe4f3bc649c2b822c624f98663b885e6540373b475d31a41b981af5d7ac412f687efd13b024838674c672fd71407260757f02eeb9f7c56f9c5dc7e07977347bfc60d7824b4bfa8699334193ab33f2d5e1061af9a5834e11a3d9104d346e4a94cf056f1a06e7d3b569a51acdb1000c1c725d007c8dfc31ae6c7d802c4aa2dfd50f0b5dc4f90f7a35c82de969edc3ba6e95c5fce57020cbfe08463154af261d86f9de25ce2c5cdbdbf0d5e0883dd32c06d1b4451aadf658db68c5eacbed8c68c0aad66d11624e9439de63532b3a04a56f1507a48d0a0217ef0bb5abb735ab6acd62c1078378f65faa894d112acbb36cea2599580a9b62de030db87c32c327e87b9df8d171a324b8cb7c8c9f5f25577c437eba53e5423f933ef9a11ffc2a4e94e4175188a53fb4518f01e870e7292c798f9f3c72c30f6d66fa63bf2657a84d1dcb60940fe387dd760ae1cc6076d9caac0d5a71561560c385e3f6e9eee80959766e2512133c38176571ef7501956292ebf0738b5593657c8e2feae65ec9a9fd53005defc3058897eb766b18838b520ea4d7548b379235e837b469b817c8f76fa1c9c9e2a6d6ea9e4fdd8c5359e35d649c626e52b38bebc3dd19b2c56f4ed0bfbacb45c33cb3c25ab3cff8e308a9ccc84b7882ed512eba3170d29f7e7c4e35b2bb678139411f6f3dbdd5b625af48d4726311476bde7afc17b20519d2b17ea6fd786921960a9cdb7239595b564476be9bffaee775efa0e8ffd64993a52c32591b1b922400f7a0bbf5b2a121cd583cb38228ef8d0a1eb4cee553fc85665b73029fbac23205da4f13906e38e9c74f1398e577ddc66005d3a8d455f65cf13c06d19e8864252057e0c47745402b297d4197599109430e2099e55882396ce3964c2e941e1115a83d0c209d6fcb49c34b17149d321a9c8e979d3b3336547609d4e208dad9689d7dc312d660f823e8c8ca9309f9768cfdc94976ec499d9ed086be767841c6dacddc418c62aafc7354889e28bccb1a9b4ccbee680da9a690e04b47689d25c05f1e9e85ff7f0622a84f3c43a5125d0436fc03b8ec3a1683f95bb9a3ca32c7ff04531d85d0630e1eb224d47b5815e5c494e8ef9a3d5f3906b5003fcb4d7197fd2085992d3354ccc4b7c871d4a4f75b3eb137bbf72917aa737624877792218043e7e1c5f8aa276832e937f0ab7d8a5770e21d0e4146aa040f62add2190902c08614a77e6c15420fe757c4969645252fc9513001692b28f21861222d454f8a582bbdaf2d2b17d757168e7f7194c2d98e23aae2865968157ad535033a7cfc88ab3449b719d4967c98a695f2e539a710fc94a28948dca158113f3505978722ad2f4e5a49e0f50c37d6b96a8a1a7e9ca1e0c6c0f7381f377b85bfb6e33c3144d4545938cd2a942abab4336e54d7a4ebb9faf3ead7f772b5e14f5d579749a2a9520949a2add8e6d4564668ab16fd9d86093f5449df4f7a3fa93e858da4ac9af3356d33b35d8b09713599fc235b857b16891b9298ed4d348ef5ed7c338dcade5431024582ce0771a260fcefc31b1e3c7d61d2aab84a0cfc23bf431c8343991d08209b0b7248a956bf0c6531002e7e48083c9996daa75b1fd9dac9e28d924acf7496fc1de27fc6c777e7cf31d507866a0075c1396e0dae9f9cd85346873ec3d01e319f610a1fa85298557c4750468b2f1ec4664a6a04268e961f5fe76a79ac6a72b23896eac36224e137fb7cb347e4e5bac73da347abbfd0276fb5c4be1d08a1bbaa7f652d919a47aa390cdd71954c77995e82471f7aab4fbfc6fa274f75b39a906e53e6eba8e388da65252fb3cf37cfbb861771af511a735ab8639c7ca3946e82786dd607cd2364669e3a7b4d1897659d1394e044bde97618c7602c8465b8e5f626f31847fe8f36ee3fc175ae8eacd41a49d4d70f39ed8fa2c5b06b86957f9c1159c82ae9ef775bd97bed7cfba18031ce0d2c15ed793a63baceaea90fc703e1a30015cacea023656d82e768e095a0d6ad71e24c6ccee6bbb51d369bfc1311545e2bd15391b3242ef10bf785da4ceaf335bc742c8178280deb756e4f4b5560ea19674792c48b54535abbe50d6845d564af8c93ceb01a805f726014e7c9d8f1701b4a115a1c202cb3e47b0b887dfcf95fd8c9c295c1ff9fb6084f674ce05de9d32fb766f771f2915ec75a9ab5d22336e80a7503c9d1d0a9ad3f2e82b714ddd73a3db688241628e13ce05b440d42c448903da8bb6815930d03a4a07d1f733213d401a51053c3ce60aaeb3a20756501e3ecd6393b7ce808e23cff1312b29546b14680b00d9f77d2f3da054393f1800969127150cd5b50fccc64f71048be52d6d4624b1a4d9ca6f646f42a49452a624530e0824083308ecf37e0c6b0cff9baba3b20f122b261aa411ba0ada3d123b0af8fe274ceda0e62f7fc11ef6790f8da6555f8093da694760b7c00c0d50a6762c03e385f246dfdc474791d1596d7ede83e6427b56fba9a276103524be026e4d9412dfb3d5c623a45240db0edf93dd1176cf399f7cefbdf78634375b52e12114517f15b5e6569a5df1736fefd8dd7d24caf8f2e7ea28ec7385db685121d49afab7e5b96e8bf0dc312a0faea3e66e228c51e8c7a77c10ccd70179a07cdfac1d32adb4ef3ddb7daf43465b8a0a21a4cd4aa3fe7ca91d7c4236cd3bdae8ff6ebcaf21f4716edf6f4ea867f0dcbdc88d3a66eaafea4bdd57f4543e207c720cf89a06f41e7e3ff81ebe2f825d7ca9adb4ae5245c2d17dde6448f870877dd8bafc1a659492e5596472b2ff8d4e4af9453242f8cc6c331affc7fc2bb7558c317e8d939db8d116d12e7428dafd1b5d8c1f4b805f14a17dbaf9bf47a9cba53d4a298d0ddb9ba8b5be9d569beb1bb721cd3da0083b6e8a60326766666edfda7251df379d0d21c32577677e2f7a31a7d69c0f8afa0e16a17efe5077a80d75e3f6832f7cca3c9e84167ecd55dda1d678bc63882b2d84222afc5503c9a71c445fda2ec69dcb1fed4f94da69d7570e1f469631da5790f80a22ffc5ecd375942b95a25561755d3e267bfd54b0230f0a4690bcd8437a4d5e1233970f9e5f7eed59151e0a3583c467f3544bfc542e15056a5eb34a5e441e4cfb07d32c9206ab7924085ba23d130a7bac03f5aaedc15a4504613596490b3652b3cc3a503fd42f437d134b3c55106ee2056126800809fdfc70dcbfcbe51d3371e9cb15f8ac49592b230f4faae91766eede2d8c6f8b60d71b641ee9168bde77f1514f1f155ffe9413d052a97d05913fdf3f8b301280050000e6ba00dcd3ef41d08dcfb3085a515f423c2882ff972fdf0edad75ff93006a02685679ffef85e14a3fdc1175a68adc860651fa613d2f9927876561a7cb71dfdf934a393524a29e5e6247ce88ec317b1571b67244a7f60407100438622d638638b1db4c034b0040d69fca0830d5462b0ee6700585a10038319622e7881f5731e74e482124c44e1f2450b4244817503c12a5ebee84408db69872e4f080628508b8126a5a6452dc2ee28b4e133e57662e3a39f79dec61b4fe4deff79fe79b8e1bf1ff2a1de71bdb9e93edee2436d0283a37670020e1c59d46a33e184b3d6cb83694c13178c3102333228230416607411451531e00256536716b3d6f97456192185c1d53a58e033bb70627c9da794524a5fc9d579ead2f98bf3ae4dc7d2e65a3bbc04f2d5e6ed8e96946c4c49c460383ec381a3d3790f1cdda863a3e540ead2961410ba2a8d34cad085194588f10206c6152c9a74418416345cc06c9ee18e140cb5306c740b8c46bbef128e1f6a4a29a594aa341d4a359dd75ee755d0f55acb653b7a5d8f03a95657946aefdaf8e2e8e8fc50bb36be2d9d8f4b1e6854a3544747d3f9a1f6a003aba483efe0b30e3ab0b12a347eb445fcea9ca08383aa542a1c2a4ad5a04f59534ea965bf7a4dc3d1583ad1155b91a2a8aba543a9abd6f796ed8e6eebe9d6fda53adf511d9def5cf4551f6d47df451fe787bcb5d5a72e1c174ece67aa1b57a59146aa5d1b0cf1e505371051822e31f0028927548c40238c1319301baabd6a6a68ea860d574b27526abb22ab87d4c6d7344dd3b456bc3aadeca16a84d567432b4a29fd57ea860d17fd167d1d6a571f591bdfd5363f07a7fe4db5a95169f3b3ad2b32638aa250daed2a5583026957db79fa9481e053aa4d19777260b0d13a5ab866185839f30ad6e67c15b721cdf1dbb041edb455037594ba5c5c1b48e563be7c7924be82c08fb72bf273e11f41088552a807414a4ad4c7ad2f87b21fef472fe0cd6c863a9b5bdfa51d96ed8e2eebe7368bdc6984c15ced3300a0a969988707d7ffa5e15d002ff55dd667cf7a0d7647fab65ea7f5373fb7ee21d5eaca957d6be37bb3a580e4b25857674b615ed6c3ed85e3973af86c6693c5faa1ee608be1b04a703c8ecf706cd95311e1b0b12a733eb445fcb22cc0dae17bdd7d67ebd13dcd3952acbe5893cbbd34748417d4ee48bc3ccdad68ea733edb5eafb677a9ce4e733cf3294f1a0f7a5eb8c79fb66c47ab8eb36ce7ba5cbc88d11c96fad07cd15cebdde6816cde756c7774757eb258acf9da43dbcd6ffd538d30ffe6875c67b3f9a9f2d1baf91b1f389fa96acbe6d3c01d23a8ddf39289f08533939125ccd20f2a78a18918bc34c2b89245931b50a0c4175ec06a6e7c478354ffb220f120b7f15d757de76a7df73adf713f69e6c369bb22390f553e58599665593675e05f960eb445399f7aa81a2167daa1e626e7412274cf7c9f7fc34e1bf65db625a4633b6e3ecb4e9bf3d0764277c8571bdf9c4d3eced680a37b63f375b3e9264f4b6aeb8a0809a5d11c92eef1a7410fe64840d0a276ccff06940ac6891a08f5f839e1465f9b0bb5bf83aed67962a58ba48a0306d5825a9dc8b01851440d6584a8abcb4e507ae852712e3b41490a020a0b2833aacd65271dc688a166979d74381373a039606ea84828e160d1c1e688273756906ab2542098a89a6c66d08ed85263c31312645a905436c420432a09256d8d26a82c495918744aea87969961fe08fdec103ae2c97bd889061f58c4e0020399257c6851ba02838f2c4f54907c20b1254acca9861a6af091c496170c98ce98219271c612d50c6aea8c1a1ad4398666a5aaba984cea4d153562d4541431064a6850ea3422bb624acd13f5e672931926d058506b2e3799f1020d66ac50e343d52e37a5216336a53903011dc8b42e37a9f1c2163032661e284ab9f8139211d6da1cf7f353ab92f7680bfd68e7506e41022e027c2e7f74f6a047dd39a8b774d62f6b72049fbdad4341efe7afe3d57bb8e66636a8abe41d75bf25d7650dbabbbb43267242c8cccccc3af287baffe67acdf5577cf9f4e7f68a760498b44842fde31c7c98a41722b96012daa7227aacaa310c8a9aa82c6816d563948f85d7ce536a584c2c50cc41477d40b67c5036fc2cdcbbb89e8286f2e4f811eaa247e425920a13b7b3b8dddb72032a5cc03484104ca828c18e8cb0e206193891041034d002d6bd58d0bb31e7ce9d3c2900a349054bdc3955f074271513dcc9ed7806e8a2763beeb41405e9d6ec3d28db71f7dd6ca63e15533f37bfac4acd212e4fa376aebb80dbadae7c4ee3ca8712082aae4cc1d295ae17bb71c5535bb87029cc8553982ebc72210763b129d70c7daf490a6d474be572fc5083f501572b29c464fc0a20658bdbfdb058eae28b3284f08206089c8080c1861a2cf9e28647068d0ba9403273218410421c2af7de93c274006d258590f2a9504fe31fc1f8d9835e43e0436bf460f08f605dbd2989e4d56bc2b6634c7d4f6a8025c635107dcac97f3da950a8584a03831b44c111b0d792da8f443ea54222b89254790fadab7ad08b88d1110cdaea3df219267f85a5d2ef842e1239e5c164eae53f2d26b8ae54d25688cfaa21f0871af51d3f69cdc91ea90d66ff54fea9ed9559154a18d29c7cfa3ffa530f6fbc29fbdc89e03eb7cc2f04b8026ba97f5bd1fbece9f60a423bfa47d755419e65e6509fd94e04f7bdb30fea7d6af379e50bf5601e46ec235f7e023828c9ce0e8b25913427a50721f11ef9925697ac574ac95d29a59452bec63c32c5d4efc9f7210f9a307f20244014ca0ac15fe150dd5f44b457d1d75e445449b457590a833e24d49c9077519603dd51eca29e57287a0929829fb22b9475dd1eece3af6d401a01fed23f015c00178a379ed4fe27eabbfdd0d6ecc7dddddd6975a2e67c478e1d63723071d3f78370a6922082f6fd5c7fed77f57bea26d4698d5e48a828105f5a23ee62060f5b9aac64ccd341251e3f9edf9cac7f286c469a8359d32b907c842fa4d265a71e9cdc171f85223e70518a12e17b435f5412543fe2a59186312ce820031cb048b1012c1e557972010c616ad082140c111f88a9b21e4888cab2ef4900b203b5a792cfaa1e0dc477fecdd62352c001f3a781e60feb86c5a2218975d303989f1ded43a8815e42583f7f5aa1e6228b95dd6cfcaccc884561b2e24f20de131ff5885e37ff62fdd165d9eedd9bcf9cf52cfb0ae297f57e5956c97dcf7df35e38ac241c3b425f9c1771509a42c5a987d88dffaefccb12638c4364b9410d8b8fc37acfc97bd240ec1485e9c67f39c4f7dec3f9951115e7339ced5d2e49959c6f59ee45a4f5ae7759a32358cb323fe835acaf79ed5311070785cc7150b0516536d97bd25c7c1cfb9258db934d601a68b2b6ad6fb4e18aaf964dd28aecc48dffa6d48f28704f7c94ea993bd745d9b841040eb9618d1eacf5ac1a62c31a3d984bca129cd56681e670a8dd672c1d1dfb949ef52b1b6ac75c581b0a9b91e672b65573d1d6e6e2af8aa81d7369bd5b97a5de036df5c0098d2cb016dfbaed3447d41c100f42a17be2dbd88eaa6c5735dbd5c8050510a488379e3011d72382efb24610054728a93004fe107f56290006317081b97e763417b38f4f69ad2e578c313e2dcd4510ce542376c798daed9c71bd0d22446c5823eed2046b594ad47a97357a6528adb105d66aa00795706041d27e286569d4c6f1acaaa669ab9d9dcb538c00290dfa1aa539b878f881e7c2ef5add0556e4101fad95ae78a8c1a964ef852f6e3febb213d215f73d4a0c14f4880b84f7b3d30b3d40a7175688aa179c4c400c1214d721c0658e2001152b5000050cba8065363d0131485f4cea5446da4c29a50fdad47420b8fddec3961cce6ea741a00b342f804963458b31374178f1e4a44b931918306567d41e5bdee38104da4a0bc06527251a288d81c290bd07fa2aa93e2ff27d728cff6ea492caf729df943baee67a05529e4ad552a375d1380a2b27a842893296ba58c119679870a046143bac8184154fd890c544994182939216cd4909ca4d5d76527252461a7f2d619ba81dbccd49195500ba47e485b11261630cbf817d6ff06735cab1cffb0f9ac0f9540de809fdaa115fd3b4ea311ee9245e5d9e7d96323640170ea1bb8435860a21a448d40e6a903297e836caef628cf159ea453496289496e34a66f928abadaa269fdada69526b9274fa0292e04348abdb265e4a09a5fc28a1fc0ba59412d2e65a07b472db244bb96ddb7661034929a59451bee01fe032153f0f609f2568e30690c6bfa1ca2a4ddd13acae74aeaee23f5f7cfce00d1daac0dd2333f38331ba7ba550f43565f46fdd10361d8cd8877d7a34d75e125084d0a5cdc939e79bef56befc1f7ce77cd89c86baa82b5197551185bab081a6ec57b4b93557639ff75672ac785533fe9ead64fc05a4fa1e05b0338e6ee65bbc11beaee992f42513021921e0a03ef61e1d2a9454659f2d727ed8b991d55a5e51b0b84ccb8523f0c220dd172754d1d4efd167fb3d94d5e0df401b0fd6be4a740046ecbee7292e57711b8a1714280d4ae9b64b89f8eb3d2dacae77f6a92cd426202d425d5645188306e01b27a3006e0ff609e35508815cd5197637f7357c373f6e2e6d8e550d7473731f7caaf838d700d7c940cfa9c26ddc23f1fa3393e3d4bd849a7bf183eebcd9ebd7354bf27d03baac22f29e191fdcc67161c78a1ce46220a1e6806e0070c81e1714fe9c71ddb8a97e5a641042f89c187045092d58c41863941709f721a5c6685580b7c8cfa5f6485fb74bf1354dabefbd7eb1bb1b4523dc611fd8831995c11cf1eb96cc96ba02157a5ca94ee090f802b8adab73bba3bbf4226a98fc86496ba404165f4216021004b7da618443aa2306ebbafd21b6fb946af4756f5bfd751e60fdae4aa1c30f59f61a420831708fc4dbfdaced52f97f402d193c026f11edf6fb0d1d54547fa8821042f6d7393064668ef43b7e5601c66e0a462bac71fb4b78d6037ee517f1fbeb744412f350e1e7d2efe477b484d47d2f511d3b1161e61e793785472d07d8cc3593e361c76ebf7f6f1d7be6c831723f37f77333c76c3e4f397fda111e6c41c60ea8ab0b6f66f3606f759999f9ca951fb78c36901ab77377f7f80e2184d0dd5b45a3477777cf713b77f7a32bb7087bb9eee5c2a6a77a56c714f4dfeda494f2860f14294fa0a6885d81621ff6e91fea79790a295b9ed5d1545197a79082e5be101a0dda4059502c2e4e19ef994a0172dba43e95db0eb21cc1c4605cf9b1980df7c814d2bad3761ff019f2129e0c32cafc0e1f3bb3f773a2942133a51442c9324efed78c71d3d827298b11ca09e55c39b3ed26cbbf114286ac710ff47796929da00e7f70c2892b577827e3ce1807059527d35c5a3d8aef75c9b8b3cc5b903fbbe594527e6ff087bcb7f8fc5ec68db91bfef3ee7e1fb71494dcbe293c17c27b74909624c2100ba0e065b5f39a524c52b818e3fdfc23eceefbb07abda362aeff80b7a90b79b1fbbc7869bafe90308feeee984f691058509d8a4769ceff005cd4eec5a25cff1786832600bf4c192fbcb0810ddcd99a7043ed15fcf10b4c02c6e14212646f04b52f3b119174df734df69e79ba9fb702b73dcf1397263ec685ecfde3e794458c1aeeaa3978b9698d19eeaa46c91e30028d75d9a94a0babcb4e4a5cee6ac70a28bc88bd07a5be95abca509fd5eaf773fdd52543c63c52fe7b22f8f65c73dcf517612ed2026976c206105aa8ec60030b332c993082d8155f9ebce0065c9c8888719fe6bee7c9719f37fce67640a92f21ed6f5f75f5faf1ff792ff4fe392db2a1335e438caa10f5fb1fc11cbe7fdba1211ed4ff1eba7d3d1f2ff5798b90f73c98d1118cf39e67c2101032af9f1af25f6e8700a15b6af79c78b94239b4d010dd8c8cc85c798ac1e4cfcd28043950023663d05b420ca108bd7948735b68ba13892b34019bcf2a22df218a293118e76a989c0ce3ae410ef367ae2d3ef119d4ce63b43e0df5e6eb6b9f7a55cd67611e368f7373f3381096818ff3cc2c66d623739f3f7ffefcc9279f94f3792c8d4b8cf7f1c9d554b9ac561e839f535fa7fbd5d6f11626137b4a5b70723ae7e6fbc63697de62b33516f6e9f7b1a562b9fde6bfd7d24090c70fbeefe7f67acfb79fc840499346a3f111a2f2edfa3e9f216a4d3f35508d6da6e63ef5fdb485ca7e16fa9ee4afccd55e99fbfc95b9f25310fad6cd25d793484384182a38137d20d3c4962e5c9cae8b792af35e5cb7c175a1fb9e34ba9ae657b32fd473596a7ba1fe5dd405c1044f1fb05017804675bd8def7f9da6b9f69807b5fec6f7bfadd1f40e2aaa8cd97886b598070ebf97dbd7036cfceb89b87ec72669b93ec98db7e172b95cefb24a92d878d7bf6c85753ea5d56ab5be6595b83ec98bfdcbbe7f7dab65877e8caa10bddec6b3f774441e18457489c158683d075277a9659360e06587784f01ae6822067bbd0d1bad7fbff3afef3ecccbbea4d81116471037fef5cc0418675ecf04c25486b9c87882064c6230576b7b4faf07c213af2986f4dade19046871e645c4d5bac1f49c9070024de674c4171c349da6df4bd27ad76b88d111cc658d922899676036def537ec4b33cfc01866c3c6e61998cbbe7cbce4cc50b726e33dfde43dddbbfda4b91c9a438a35d707f8a276ef2eb5bef3586f69d92dfdb4e5ed20861527dd5bc8f4f7f716a528cdb5122c87fa6c337951e306820b8e96761073c509a4a8c183930ce060050d9930a820810f99bfc73a88bf24c562b1159c3410df7ea7b2f4453ff9954766ca92db7993db4b686ee7516e4f8175eefdd4402833af9ed254fafd49ac6550df332cc66a01bc90b10731d70735a711f67b1bf441838c1f7373d5358d1fa5fed86bdcce399fc0db3ddbc122da7d1a9f9065ae2eb67ce8f1bb2d8b1142b745b4acd99f47777766d67c43dd271fdc21db6902363f7777f72605640913c661c7f8de0be3689eb43cdd639b5db502d73956b53a6c7e1a0f0f0fff946008249a34b7aa2b204b9ca135300c41c445b9a0cacb4e4354b99da6ad785655d3b4d54ea44c2cc020020b69ac846143929531363059918206a41fda440cf347e8678790124f28fa334492a4956a1509264aadfcd00488124c4dc85831811517928024412688343400d18214040d6400824493f730a5d5b5a2e208a4284e3ba092904e602f4f9134e53aac05f5f55ecfbe1e303f3e91f9d12649427f5a2232497c695fcf3245326409b531244616a0467d6c847d4650e5eb01f1e55781fff28f60f3a1258a46d1bedaaa40c4d13f82bdef388c0ec8ce35b72521b9457f23ee8fc46315b0ce80f34412dacb3e18a283200cbe051a886f1a553861831b9eb60b40a2763cf0a2a017262a6da5d5958685106308519d64a012071ab73fbed8142998f0e9307171fb88da693c1cd3960f2e844d740063c5982dceb0a1041b20438d19603983831c8849638993a6c385666ab2a3e64a143575d9898a19a91ba8c8e009151880a1f2051a51331d6cf801c4142935c4309d740fe710c575c613ca53e97754a3b64a79ea1e2643cf4811c3d57fa686b8843463c0042a790f3bfdf8210b142ffcf0e189054c7e4c698a9225062d3fa238d13d7c3b5a5fc86a68ca4109ce54d4e5a61c345963fec85a5d2eae07fb6436b50a755b2311c07a0c9ae387cb6cba772184b0c2afd9509755446f9b17ba0a021e2f84d6480430b72d86fd27073b6cad07fbf0ffd0ea7afa3cb8a1be67a1e6f82985352f2287a19e51d6480429335e3b8c725214d75c2a73c19c6b0e72283a334de3d88f7c7ea11ecce3bd581d23b75f728da91272cf711ce7faa9f6c55ecc831254873706ffc5e28bf98bc11a8e4be590bd9f550d36d090266a0e662af8f48a56af057911e7531f3f0524f7d5b779d6dfe86cb4399c3fd24038ef6f44e759c7b2659c0dbaaa8437a5b9688b34a7fa814273fe481a285309c1b1b43955909b8f9fb315dd7cfc4c5b7d7cf8d92a0e3555055915c5cf79aa0a123fe76bf86639b6cb799c8738399fe56c443a549ccf2901e78b721e3a20c7d2fa38b6bbb12f2145ef6bfe7db41a540579b6c6428d93efaa12844e68ce9f05d29cfca5d663a07bde67361a6c200910519f0cece3cf58921e95cb4e5890ae5f7fd2ed5095d00349cd1b69a09a8da8b9ba9960811c0d6e431ae875947dfca7d48ed3e0e4bb9a932f1ff5f0bbdabd262f7bb5b9f7a4b921576dafc996c36ad61d78e476abe6e017d16edcf155dbec90d1679e54a73ec888b3432219aacd96a37b76b455733ccdcdf946502f4604982a87718117be461a88936eaa553efc7d8b5b575fa9e7a5761b05d87c076fa44e1f030d447f4a4b3532a95817199ebac8a03406b54697265792e0a7a5b25316a59b7ad553939818950b80cb626248170c18540ec4cce045cc0c4ede15234394f79892c68c61427a549e30d04093c99cd040118b3b1f8506d29e0a97be53894ba6054f5a9014c6892c619640ba338c134c77de69a3d1ede53f8f3437d3b8f3254044a57fa3ed345057e40f359ba7da31983b2d5173f3771aa8a8ffa982f8438e37abe652dfbdd8a780e47647576b20beb33be257f535ff96dca96db4b9d49b405455241c5dedd9da947d4a25a49ebe051a88f296d436e50790e6e65ba06653a984d04fbda60a927dea555bd14e7fea535f9b9b9a2a48dba2d4d3d75441524fe1a7b69de6e6bb8ef83de2977e25d2a1f6d312fa8be8af9a9b0ea0d6d5dc7c21dfdc4c7ddb2eb32f21b6c89fa65441dc52225509f4dd8ad0dcfcf974cc0fb7dcdc928d85dde33fbb6aa4b9f90648ea588cec5a0954a9d97790fd4b38bafef3fb07dc692023b5db32260fabf21a6263f966ed369b0dbc9e3a022fecd1405ddd116aa06cc9e6771a88533f9fa783206c7ef5201b6ba47be6f3cfed680470a80ca36fa483a81335a97ce9679b90145d7510ec9ed46bda6ad5d53b53f46173ffcee345ffc170e172735c06f3c496fb0dc40eb09dd1fde652f04b5d77d2a7f6ff25b5b65083b5cb53f430c6ede8bb8064ce9ed6dd056e91addb5e10fdefdfe63d9cb92f0418935296803dc69823c61823478e31c618618c31c6087f7e628cd1638c114e1f787c014b41d2ebfe4a76766ff7eef6f7de7b46da9dbb13ae7c6e7728a133bbbbfbec7125b394ef8ba67cf3e17c38df0efbcc7fefbdf720fb40a8c241084a6a708c8fad74d9ee5252f6e1f9cb9021171182d279e23b94524a2993be5cf8110dc98c06a506ac4b4e1710c2c7c4f58f30c618238c31c6087b85ebee36e818a3c718638c58308f2a692ea38132c276791ca3dbc873bd5b4a296516348d075a72b67c59a2c9e52f4a34b94197bf68017359f246556f85ca5fb468b91dbc90e372c02bb6f07221849007ec3262af22703cb1e17b398a169a5c7ef831ac902afcca3e19abd87e70820a9f21e4aea2c3a9fac31b3f15a3bb7cdefca574e9996b730b216600c69dd3dddd394a89c58e5e3142c6d431aaffcd65a717e033ad173e7ffc2cbab46ec5904b296560034de5974fa57caa28df8a1baddc4868cec1cc1e6a9ca0b66a3f3841e5efe2def0819225f15097a1a862880ba1a8220517def081525397a1a842e9c28f27b08fc718638c8c64c6853246a98a568753ede718638c913719635c512899555a82e81125470cd8f1d3326a919c5346c8dfc90899a59531dee4fbb7bf9696031ce5c6a93ba5bb6f0cbf4477e71a54d565a72a4bcccccc5576b891a39452ca2a4f5094320f9652ca38a58c31560980171c32a494524669dddd3df2bb7656f2bb1574e7c8ce9193ccfcae9dd50a62e13da58c114e2c32e92b299d9d3d33d3b1dba5f943edcedc29b91ee1f4d52a42e8ee68446686f1a98e3315c5eeeecc91bd88bb84cc247394cc910168a4845c64f13ac618238c31c608b7ae88ebf66711638cf1c518638c1c638c314228c76000941e593040cad8dddd3c374777777777f7ebeeeeb7b64bbddedddd30875057a4df7bef6d0f8855c13e0f884dc1b481e27d2f8b249054411566d05c78dfcb7fefbdc73cecf3e69c737ac31a27506301512be0c3995700be704a19234cf220880adf75bca0fac30068a1230c7d7777671923845b304e195d045f00b7285a149652ff733bf6e28f9418d1a7298bb24b98f8c0508f9403a33726604585dbea763977a2643763fc0eda256634f8e34604f61ec2b89444097f4982b18df1972498cd7dcf2a0af09724d8b346fcae4b460e5876c0c244867e0caa60061f58e84109d812263eb0f74839305ec2a461f49114007b8fda901400a3465588de1b99e05550d6a80a11fd678d38e7f2c465b800c5520dc4a4a08c138c617c54022f4a4081c2c4d31063c018c6441f8bc11e1d9375f4f1bf9745fea44c3db79d92cbdf51ffa427a4005730b186d1e5678e6e39c05f3aa30b6dc7a9fb525742082384ee8e464c298b314620f73d672ea574e9f23b132e7f46ddbddda584ec5202b94584ee7bde32c92c7584a9fc28f8fd999452ba949bd63a9eea37d7312ca494f2a9646e4e4a29259c52c658ada8f1902184b091c8c912b309001731c618218c31ca18218422e3cb3cddcfcbe23d9e0fdda7bfbb7b0e77f964362d07d84c4a086f71a3656666e61d02a0f2a8a4cd776439e914d108000000055315000020100c060422c150340d645d4e1f14800e7a96446a4e960c845192c3300c420618430c21c418000821c418aa9a32005db5b6e153fa874f6c0fd58cb3a24012b178105999e335931a1af1266b43392c68d3eefca7ffeda473b2341c5d2cb0fbac776d17d32e09136429ce8d9338142af5b4f7de44ae361ac4574120bf3a9664e98a8518e63c8bfeaa68577c055b847afab84f00bec1580329b06d85e7155dddbff686dec120df6e1b50e7bbc087f608fb166cdca0e3cc67ab338acd8bbe0c1c1ea7954aaef3859b2babf3550b574e91658f200a31542fde0487600fd530fc6d3c8fee4d79cffca8cd9f5d82d5157f0e68ea6a9e3a41660091d3849279f8f359c0f51b42d44989133b2c69fc7bd3b538f79cd8ebecc1a5143ad343e69c893b21df9629eda6fa685409e8e0a3a7cfcebca1a96c4bceba22e960bcca3a8d2bf67dbbeefed1be424d7d0359ad03fea8f04a516c3ba79ef3e2c3377b407d8eba19de79440317589f05d1b4a60f356fa91d02bdbdebaa1facadbab2d610efd0d6ceaf5f4ad499c439b98874f0bbecbecab3da7aa0ba64568845441d4dd95a7a539be11e2874294faf1c337589a5f94b7ee151ceacdfb43d7983a996a642d3364e7497ef42bc4511b3102ff55a6fc895888a7800e1e1756694199df7e6a23382042b8302b31a8f039041aed2b3b15f0d6d7b40d951796748ea24067a9f6eaaa97c8fa3ca7e60426c90b7b53ff9a638a6e0e54ca41cbd1f5b3d4110945c3b03fadc187ab79258f11ad9105969e7ca103d2107db441d95353969b92cf13eab69546a6956a523ccbf0c7bae38648069c54aacf17c0f70fdf1f24ae2b351472d17444e394d439b1f9e730b68ee8c3f7353aa76cb7e597703a987d4a136c619aad00f1fbbecbf45c408668e2ac12de02757b00f79e9288df93ea2f4d8c27c0b01e173fbfd78c8c613343325e08e5befbd1f5739acbcada3a725061c1b9aec8ce879a77a60f8e11bd6b4856031b4ef3f2d3fe35fca47217ecfda14f8af6b9c78d541d0d0ebaa9da9e6ff358666d372cf359ce425073826e6e33e86e719323eeb1a201c820b006c50aac07e0afe8a4a6ca7200be6c84b9b7751faa1627e499bfb067a92d3e796c1cd47883dc4a36043ccacae86519f0830a7eb999997b5a9b7f7171ab4afa3cab224cc53672762b937559bd78290fe86c39ac013218b233209681c5a5994070ed4cac5d8ca5390721de5f9fd1882d0ed20c0335ff92b7d4188193c03b28087e5616d9c7be915cb57f3f55987e146bc543c84a1f0368e333bcd0f0d930fb786aac1858f806a44230eb40910786b2e3154ad63b67bd1b3de7cab63aad335edc7970ae60b10c192c89ae564d49295ad2e952f93adf2d823546874ab97f7df96367c4fdcace98e077b6071c13a0b90f96203ee4c04115ab737e4b3f4bc195b88049516803b90905ecfc9ec5ce80f80c8b8da4fcdcbf4fef6baf5490b94559e6dda0a23377edfdd1b82ed32acd35de57c53c6e3d55b6312591fe12fda09952d11ca2ef71008904d0d8263c4c766a0f0802781f146f9f3d5f1ff3e0547905b511ed9dda0d4c52aa52259a8a52c52ef8a592bdc2b1ef85bca33e8d0da3c277cc6af8e4a24d0c9aa48315ae0355ddb99967dabda37708e71e888363ec09c366fa8302ce0a8d7af19f620a085c01bebce107bcd3e5d717a058734af81d5f224c1005e96a46233259fa2ddda3c4b40ee5e834ef91cf97c9b7fcd3c94f18de5b531001a56fda02b02683ae64ed5353acfd4dbf96cbad78d10e90c47398b22ea4d4948c3fcf1b490b3041e205c9b0af55b469fd83ac176921431b099bab13ac3df0949d855bcf0d6d8934fff8e58ce738a2c91b032b7c733c60b433d2829dfee630396dbcab6573fe506af44dcc16532027f6b663163d0a55ba5860ee6b23513a1674260196f2ce598a540fb9a28a3b87491a5e0b9c2d9a02669884148da3727fad1c24642e63840729b7b64f56b84f137cb4f229af963e92e288367f247c845c71cdab9079a5e1c9f46bf22843ce236fc91129d6ec87de684143a27faa49373c4b5d1eca62b83ceaee434c883d947a2543e8c1f17eb09275368a04305095a489e70836c268021383c32c9f883667825b17275b95c9c97ab5b018deffa56d3e30b609c136768f1fb47ae8eec1955fce90f2ee74bfc572f4872d882af15f8b18c103ca7d9fc707ca1e1089939f7e25566c7bfdec2c71d4a490fbbe902724d8aa32bc93bc8a28c859c899aa103499671d0c743470389d6b322e98fcd2e3a3eb54bdbd9f645e8d72715aa357fbce4913349b4b37328fd52c044a967601dfef021606e599a98cb69ae80305eb40c5efd19fe754eb9358dd08463a7f161090158396e8b0e6f7140d55a7e1e6adbc2e1cd9181f51d86df362aeef850b3a8bb79fd4c61e374ba39403e24f7d779388b04c1716d298b9bb2b3e78fe3420aedb65dea2a3b6cdba71187f0f6ceb41dc8cfb7e9c0c099111ed3412640704d788087267f7d30d040b22e242e89450f04d480f45ba324162b2680da0452b7f4aaa4fdce0f00f19f7c3818383c649a94a2bc7625871b8f425b165bb6097194950b1b78326e5ff09af1be74e08de40ab97064c15c6bfefef66283fc91defa6cca900438f916a2b62c0341dc6fa07f974c41af7804e4a6efcc18b564d001f394c7784207078d670ab28507092e5278bc78f68d8230a36928a11025dd15c593176751f294642482bb64f9ab263bbbcf1f6c6b8c235fdb7b83f6a1954449a2f0c1f003d4ba57beb4738f08bb02687f479170288a3bfc933d60595d149db20d7120a8e2b037b72da47ef9d3ea09af9c39d36f37cc60a2de5a941eabb1b9126bc6deefb357a25024a315646645aab3226175aeec54d5c98e3cd9b3f64306609565153f1f3900704a1a5ad5b0c8c3a2f896cfc9c739ef2ec0c4bd2060965b413946eb37c3822c81e214313f51f6bfc88078f335db4ff2d06c11798cbcc17ba077a8ea1d5bdfa2b93c0bdf4892f29c1b2ebaff9dd5c172ad3371d95f877e849f8dc8af6484c609acaed6428ad045e46ef8c031c0df355adc34f099389d07bdb58721f6a03387a478433c73a057234422a59ab3f1e436f04bfc5cb8f9a4d8759c3b3d642726bc56812294404c9488457e83300405717f71abc1c0578855e6a46001cfc3eb823d3d60827edec2c05cea8bed3df4ddc619dc429b3c3bcbfc8ec066deb5dff38aad16c5f89acdfddd219847a82303a70540a98ccc6215c2eba47455acb05a9e5dccc185a302e3af9496b58053c2f7b40996f55fd9dfd3d7000f8fcd4020e32241447b800253c1afceac8cd9c49e76fdfbe137ec0697c1dd5ae3448ac7d22e3e186f93f9d8c7215a4ec9bf86121c8c3ab56f31fcbe0eb6b9205a1dbb2c25dc7212317e91afdac359597ba85d7dc19c7a60d9ee047563c5b189a8ae802f83c474dc840afdedbc66e45a5997cf1114ac86bb6eeb22be35cba06d3835f614e5097094f53e9a7002d22a67e6c1856aa4129ac3670c1d5ce8fb898cf253d949717e193630fdbc10411ab5d21fea1d1e18f04811bfa2d5809861e64554f1c586d81e3f57cd37c6f50e037da474c7ae69053dee608267d7eda26f420ab374b452a3b4b3089cdde99dd3c550aa326b03760ce978337100ac30fe942b1e0cb70b99313a25eb507631b6f93f911218c710c72e8a49d1506e32fa0ccc3c343f204a2e5a30bb5d787662b2073690ce90ad7bcdd6affb0ddd558f2dd9a2c93bd3910df525a75595815ac4c0b81e54d082b102dd1e66a43f411608214416db64d109aa26460856b5010d6d05baeb49922774bafb2ecf188013aeab6d02dee5bcc0294c501fe1789510459f7242ff919531cb8451accaa4c660ae0489c991dbc31167ab75d2eb878da7cb78577dc0d9c628d89764e31eb8b5582dd5a4c06289387c738fa79cc961c530d7d8930f806fced08f7cd3296baf78dcdf0f892ef2f56bb675716e9b0680f5dd5c288e87087b3e76fafce1fcf67c426fdfddbe85475121a0e802dfd72ee25646cb5f7ff64d67740d55ed843184d89bf0d2cdac33cf8d29a2eba8e11df96f088dd46b438e8e654e802bc4b34f3fd8bd2d5af1d93d94bfed164eeba0c2e97744301d58f8b40a4c10296cb3d7e6e46c452b70d882890240b5a0607c38a4ab5582074e06191f46a575eebf0e40ded311054074b01b9f52a8e071c2c6b2c6df888d4f23021bbb1bad1d32027c8131cbc96b0ba7aca99e1240955fc21f3dd66aef9e7ee9f533ba55a3214a0962d2aa9b41496025bbc7c95a6a60c8a33f9f7f5272bfa914d04c1adcc58ac3cc94055b6a3ffb76e915486326ba0f16954d85430ffc6f7ea619f7efde232a4630fd7d9693653c92464c3466c276c50cf9cc2a2f13b7718fe32a8c4d6fa692d4ebee100ece83b37479417e54dedc1d96ff3199815ba73aa56d1bd9bafa0499a358622fa8d544da8b8cad968b5b3fdad0acc91b4a0ad09856a8bec94f351b9325d98e8116e69bc3be63fc5d49f247a7ca83b00ef31734e3fc43756686c744b19407d39294b46d8790ceac6442c2740e9230df011e2fd283987a5ac1a02c611d14c2d31801b6ac54a8df17665966df48236baa1a6baa95eded8d330025e0573baa33bcb50991ccc6d1f0a680df812e24c3712b3c897e571955acdbf480ea39f4aaae5589e6af06965d2f6adb4b75011656fb661b1ec754e0a988d538deeeb49459e9ee448174a0ed9f3374c7b45c676d7210d39244eb466b762a106171d76e3f141ddcd4af49657dce17989a40015defce5a61c9061330154e319909d96dbe4aa65d74b98377931d4699d9d4afeee4bfd54df663ce338e348dc2d5204e4d26e10732102763143bc558517b6f5f7abf215ff66b34228e81b40fbd498daac1d9be0008dc64473b559cb6009b9e77060ff070e3f3926f9e31933e82d15a5b49abcbd64c0ea9cd3e4129f29d2a548846d3ca51bb5f915e41d730962febeb463a7abb372a96aabc1af4d0dd9a4cd87915d9f416fed2fe0a6c5a32e906310fea2ec1de921208e536442e78aa04ab7faac6e1bea5ecc2c5624956630cf4674ed34b3e6670bbd8fe0a0e3dda01603187c0777fbea1a1908621da9395952571a56a478383e408cd3ac039a4ed983c143db772a793be6a33176733ebf871633d51cdde740e596423ce173016d2cd6024dcb0f9a3149e72b22fca10eaf6c9b7ddb604d9b4bce54165f8e635e9e66e782dd4292db9fb3d0db3c74e5391bf490bc2cd35403647cfd6a686cb0abb6c6f316b9c9ff018cae0804d822c1fdbc8f13c94cd9476d08c8deace3c1f2332bf324d868ad31ce30378d55ba9738cbe270547492bf7836918aaf35c2de6c1fc0de01b3b3f1b6c004b9b044f77445d185f4cc126fa6c37406c3997821495f05436caa9c0b5e0bdb4d7bc84024865c0df923b6d7e136628f79a500160a4003ef4aa0ea1a2ff72eef5abcef63c7a4847573428ca8b77c58a74c1419451b70fffe4c5a08b1a0c248131d75a30a9a302a7ca228d1b4b2daf33182257c9c1677aaea673bca8b4fc31fafb55dd4fd9873c693f2bb67be77632662b0ece6143aa7578184e592383f209a12ffbb7364aa9ed7be1f1408b5bf83e58397cb871cd24e2a780f9ab9287bf7becf7c0d796cab4da0fc04e616a5a850ef580f44b58fa1e8d818da030c459aa111a66903363b74267b403eea61032e7805d53901fce3a599e9a5e31451066f0286853a17d13bbfa79dc27c7d806b318ef35c2172115915b597b5339210eff3f4d006f3f05b1a0ff43d677bf2239a94ae130263fbed4255dfc39afc922b3fee512ec859b2dd2c909a1a97f246eb1594ffa640b023830bdf0e3fe051cabbfe72517eff7e389f2748122aa75230932ce1d27822f40bd52b80a8995178ff2520b065d91a2dc541163727a4102f8bbdb9770e5e7ace6cb770bd69d2ac9157aca24ab27f701af9156857d0f953b3177917271bd12ae1500cfa1cc9986a0003742909696d506fc4354dd08069d642d3ee669922779b032658811348241340a807f9c30ccc26924810820a37901f6a3260206695891c5a98828689bb85875f950534b0ada027dfcee8b384f9535191ae0f949aaa176e01737be18021a32818983d9d0cfb18a49c26ae65d2d22f431a063d561a2aceebd1f010aa7538c416b430771a695d19c6d1917fd14c34df610bb1a59e070ab24b638fc7ce1501e014fdd778199bc226600eb6014463bb5477c37e26f14d9a4c2e86cb02bbdfb04f900e23cd78084d04fd80ea69681c539a03df69f84237301ab5263d520b33583654b0ac91bd1abff86c2357034a47ed7451f180d6c198212567b17e876462abdb680f0d32fcdbc3a581b613ada3e3c5c7881910800cba3605c33875aa111452062e8ea62682b7aa141fca5e08f3c4c552f0b0ec6a6e8908e3f144581e6c134b818d2e5418bec9245ff031c3e4b1b792da12c7b015666cedaabfdfa9db15e9afe946347d2dd6890f53f20ab828223ec5535eb2efb5dadaff4cade57471e602797d9a3832761b57d8665366161ed937fb9c46be8fa7f1df59039484c8dd761538968c10fe0c62feceaf5f3b2d8c40a12cfb04059f88809c20e5650209005d5bc72390bff0755d849593a05f1a902776d4124923b8f3fe3cbfae051a5ed6d2dc2adfbe358971ffb40c1e74ca0f8d9472f9b82262c92ece7478509a48b4d0113c1eb5c1919656ee92079febc72d8c081f540cb69b88131340ca569f4fed0f856478de9293af3e2c4cc33ac94a6b307162b4a52c78c153515523e0d3649e9115ac887e2044ee48a5ec8062cde12fe8fa8f271dd0e4668118e5aa820753fd6842a048b4e096d0044b31df7cba2d88802ca834640a1438d07903face7e8b343d3a988ae59789b0d9d0c1154164261483cee107e19950514447cd2bb6ab1934524d02fcb851b3b78cb6a76635163e331ff33b5e635678ec947f156fa79597d09c90697380f2a6a97de3ac74038e04454e3e43f7ea6d93befda232d481057b5efd1a868f8c3efadb122b2f49ac1a6c95a7085dc8c08abf6268141ba154731a457527e67a0f92dc2c06cf782a1419091318632a6beb0c6e08704f4d153e9dc80b34966a1f91c9d69ba8178ccc1b209280b99f89d7fc4251ef6527396b54396a46408fa66103b9a1cafbb8514cd51af15f67ddffd120afaccf022e0be15217a3f79729b88bb6d40a611055f59d4620e08b4e6818014653d9663dfa0d266498265b48737bbaf78c77836433232036700edd374d5f7a37a49b50f255a1972f408ebebf39c201bfb0aa89c33d9b3ad843d4632e82033f20228faf072c629381615fe7b3b00790d235de5c82a9bd05c348c3504640a4563c42e9ce070ea6f8761a78557cfc2fcb0441465bccd43a984f0d3feac6aad599ee5bbfee8c4de2bf432c12b674f81afa312ba99327ef30218a60adc3d49422fef76aee346332ad648a0b17aa905c3343dc623d79129b0f277732ca285d84119d5b568814677943b7ccd8c8d9b86d509b18313478853de55622b4abdce88dd0f3a99d17c85de8d9b67197f029b5c1574781863717083933f7fbf75a9a89e0a5e3c32eb3e2c94378fad1f96ba941a38ef3cdba5f8004f69962be63464144b27d6fd8f09c5fd96563de77f430cdb01857bb24a8b0f4f71db0a4ab263eb0755928a11789d9595afc9f2da4d7a7291b0af7ecd55ce921308b2f763a457cd50cd7da2f4ec060380cfe7aaff2a44c5155cc4050f7945cf6e50c102d806c6d862fb7303b2c17cebb39ab8fdafbc9dcb37f0d2510bf97dfb8d3918a6f70f4adff7ac2a0f5786c48b5645cf9ca3266f680780d3035cd369bf0979a2720d7dfff0247141a0ef1fe2647ae37112e87b68aa58537f81f33b19b7bed1be3300aa2b85124bb5f8f87e7bf801271b8b0a82fa065ad191cda49990c7eae4ce17ec8a98c88cefc7c5d6e559de7bbddb8b1d755e03b2f11912960f4907a890aecd8003662cae0ae931ba2f789cfcda1265f8af901eb67c601d4e6d4c36423aaa02def1d06e100aece649f4fc9e62a94dc65eb8354296a7f30af2a2feecbb317b3a6f45f320ab75183140c25220d49933c73466c0a3e84b621495a0711295d63ace60fa84af825947de6556dd61bad5d2d9c30ea2e15390741b77655871c20fbc9c1122fc2373c7e9be0ed2c20b7d8621b0953558ae372b2d59c0c6bdac9dd8f41237d24ae13c09d8b4da401c77afcf5e55e53febee7d5ea1a65000ca5a11340f6fc42dcf4d98d9bede8629970864e59c95918a8ca620c116763fa2f4efef93f0d6ce538d9c59976c3f23bf156e18ea8bdc27a0b238073fac3bec2430349575565a1fac82e33daa307093a9a2d623b8d4261945d801dea6700cd89bf4ccba4d1c84aa2a45876835b2c7043aeda5928e20bd6ee885fa31f6ede66529c1fcde747c68c83a7c1b48e3a05b83e4ab645ede1581c9e7923484e9af97b9480c43325880fdfe1ce99052f63931a3746e3fbc55ef0d9e048c5ae6d6a15e2d202d88d0ff8a0e8a303a9e93450ed5f360e3a882ffd4c8ca6f1e160c0ec950999ff75b5b77b5f289700cea5a6ba3f2e0ff35382e75e887cc61baa01267c5507a1b97de680e8072f3b935517e96e8f1b1565fd790960cd5b5561a585a210c003ad5175e30eb2c165573de68480b300503456c762df2b3b02596b42548a5245cefaf16a33d946a548bf810d0843370b1b800dbe5ff7a4ec3d3311639944edcac077d5c7b08a9cb44b48cff26b0e3e41a15d8880c21e1fe256ed2f3258e70d0b0e0fbb0139ad6b15cc06c90b221d5c79c7d44bbe3f9e272100d1e48e20b7065acf6a4f04b8824b3f22560303537350e3c376983cbc2152bc0293025862184c24eb17bc1bb5b1d012c3b25b61cfb56bc7296c70db18cae58300303513f6b43966bbbea555a9113509494a5d06b0e28a67f1aa2254e741c489fe0cf15e11461771df2aa6fb45c25a90410ae9f972f542c6a4d0932afeefa7a212fc6ae982fc9e783e9b3f8f17a7c0b52872e59ba1eba64c3a09434331b5d9c2cc161e7cc2d544020b99cd4f7ef79243a25bd5279d080130e25bdafba91b176685846797c34316a3deb3e6f69d6780701010305e88896b850bee1413577e28cf0994b3958ac82aa56750b0f34e045e405cbd1ccdcf9515456081e1b0e3901e29a5d6034dd0efd096e7592673d6c590a3f605bfb1a4241cdba6b3f1d229adff5d7f517fa7e51f7b147b20e1bbd6b85a9b9b8a48d0dea17570f48eb3669e14688b64fc62adaa804f32b00a6664450055458a0d16f422d8a96782cab0bd600e6a3661e69d6b0f9a2c5a4dfde33e67e9888d238d6d09fb26e3f4c7fd672078db9f71842cbbfb327c128560bfadebf4fd625eaab25f528381d82bf0cae0bc140fa2f48a746aecfb886935f12b65eccad902801cba9195a4e002866ebb48012bb3dc3a0fe73610bcc7acbe162aabee30e3107328e072467690f9f02f022ec28dcfe9c69066dab843925cd03a9ad1b9d5f0d41bcdbeaf562bfd37b2f32b3887c0cec0c8bad6158abc21fb16208e1a11bd02f72f2b17d210789cbc5d46e4a2ae7eb94ea04477e650a6cf63be662a914c70efdfc9e3889fb7e594e5d9aa7e16ddbc6c3684218705659fa1c4a94059a5406618ce75b85805e6d3547e2b578a7cd5c7bc9a958073219ef17f6a9beb433693924b7159fe43d42b44621e95b28447692d0c81cf5f6d6a9e157c2f6f6c4e8fd57d3d1ef52a606e653b8bc434874b97ca22d96aea640ab83fa707cc4163fa392c10ee8207c049bfbda820321c2d2357ae2702dc89d4838a0db4cce62105103c18f1f972afd4dd436a09ca1fe7a46ac69ef51a725e2a908e4bcdab609b17ae49c28d8d9133cff227c80195892e5677517a23f8c27d569ea8506964d8012d75456fa81bc110f865a1b363bdd02f5b32503b9bc7b7aa178f706e5f1ee61c50bc61700e286fb87df19da82a9ad16045309877876ba6d81d3c842ce0f67c15412d02f0613fe3704d85bc6903c39f4e1a93655eb810423d69872a8470946203432ef539db70f9748c9bd2cd1ac9be10e9390a687749737fb6428fa9ffb4838b9dc29836a50c641079b2e7b6c59af4ac5bb340dd8cd3b31a99a1762ed34a40b5a726841251e6310ea9bf12f4fd74efb97b09119ffd6a9e426b8b2d0babe2a5b976e06338326b6619b763001884f03df1f3ed9b93fa80c39d3c2a0f6181a8130691d0b5fe249a4e1e100180542dd3ed3b3a340d9f241a36b59ee037254cfe8c96c5f58e247bedf00b18cabd632e17741d29af737b58628b794896817cd5d7739fc4ce3896c8880518eb4c022fb29745f0ccd7d051fcb34614d0c83f96c8132740b3727ceae8e9f9c17c598b628b72c82cbd0d4ba20ee5f35c910cda2ea3b0186407e7a178aa700c83f87becfc6fb87987070ef5235234ca5ef934bbc5057d1fa41604b1565ec4bae6c153635ea2ae5a200ce75c297a29426b8d4b0d32947fcad47a680d57dbda41fd95dcc7774689f85c03707616be010be7b2aff958103a7a56d56b248062e27c666fa1f0ff534f8bf04e3db5e6dd0355b8ec3967092430ff5ba255d2179cb0bd74b4ed3b0618631c811a0e088551167cd5ff863359194ef3b03a046e1e40e02b3e8e369cb3714c0a584a034d51d7f68f8c5735323f4db32d5d5067d57cf6d9dd50f68167a0420c22e4f0aabe006fb84ba21a23e8bc9c0d69142d4aeeb84e4390653e0e0c4b474b1fa9e8567211088dbd8e5376265418c812a40bb025cbe2f5f4e7f94f4ea50b2b54cf39890610e23dc68758004057d0057844600725745cd64a5151213f16739ce89c39ff8df157a56110e610ec29218d24fe58685009eeec5fb32e9de1dbc34e4cf759555020643b4c08d29d9b577f71ef6c2817115738f77595d423be8e2e18140082ecf868efd36b8e17dc0b233ffc5c9a9567be1d233b27f401a4c9fe1ed6fd36efb23d89ed61a5d5268d4510496351a2690514be2483296e078811be21060406b91a4a37ab9e6d8d57161a9de61e0453769dafbfe68aacf8af2138f211eaa1635f80cc1d94213de5ed8cf2d13d4dc902c42bc53fb7ba566a03cb8797d36be2fb18a892f5fbc97deca64b0ae52bb3a36ba6dd13f64f2e115a3b6c91e96406fdbf1df92984904b66f13fe1f8ee049cee577c08d3e9debc1f6245406b32390432a91500f56d48737c71d4a1c44bb50c602089783485908354bf156c989b0f30383b7896f2df420560db4875f55ff9d56053e938228922bdbe3236e72ea2d1d6b87e4c220256392f5d83fd4a94ea89da2d4d28f6a4d8c65ba3d1574d1418a7abeecf5b8f7e759a74249c9a57dd1ac0ec544119f144ad68e75047097070329b44209ef21e0e9cd3ae2da357357a72e65180ed0a9c9f699880db5349c82319a793b43283ec81787466fcd680d6b88379e94791700b483c97caf93b5b219fd6bb230678f2828ba107fa002b502d302d889edc95ee8b90434400cc2b5a5e89a7c34e5d072cfba29f1dd1ccc6ca90a02293696a40bf3b82092f0f80efd27b56bb4039b419beb821cf9e6a3c79a19f9420c5a8c4ca626e3119217e6e18e8f7150c6f9ec8c7c2220aca6146a0467e1ba4b67e6a5c62abf7747ab094a18e2252c14e7a3c4889e781a7f0c94f1424aa4488a4f13ddf5e43d9d25aad0b5765964b32551f730dcbd08105ad85f6e250a4c6d6520df9d57529b6147a260896f2e6ac799c144bd8d8e7de1a26786ae57907a5e7de94e601aa7420961e3d21137f578f9c1826e215dca856ee4bfb47ee2ba7c7ecf1dfbfd4d34b8dcacf007c5fff136a9c6c0c52bc4acf2bd48ab81be57d458436085f7874dff72662ffd7a12275b5edb14cee8be79496116a09db521346eb201fd15735f54c8fb03a545af870ca8366571737016cd69879385a95a700811b9662e560b71eb556075f6c851ad4e5ef09efe76188a6690bc4e906cf385325a195d362d42312247d54c7862b51eb51223f6704efe89f0778447d9bcb79272dad18fe77de3009f2eee3e0247ca944487e9975189b07895cee854537cece69963a7394a4e9d7964b1c7812eb8d885d72d066f5a57482c466a88064b80e239d317bb8d323318eb776a8aa64c432c0a8154b9ed518c7da60e8e2facb96ff83c652fc5603a408284a104a5f9a584a85189077a0bc807103c36c7fbd2abaa970444ad41969a55848352286e42b4ab979cf59b5a2f00cd7391c07c5deaa728d6e62f7b3b4a0febec155f8c7da6628d6dabc0d7bc68177f921a945414a753c7b88f73671da9bb95bd9a5ebfbdc6ea1f4feda15331b1cdd467f0cf7aa6a0828dcb20802343bfa93313380de74339dd100cdf5cc7a1046d457a63f65256f31fd7be49af2a2f1c94a28cb49fbb34f0a8cdf2f9e343ab20d6fc0773fde35b7a7f1ffa7a44414c401254b5da62adda12c08bdd48c924a8bf0e5d6ffb981dd1f82f10ce36208aeea7dbe494ed540576f49357ccc07912ca8cb67a2344e3c8f45eaa0d153f52958eaff8c502ba81c533d8f54f89b2c8bab96ed0397bbdea6ac3a03ad6e3379d095d704efafb2b507f84ee0cf89587bda0536c073d0b71abba57881b40cc7d05154efa2f42bac7544e554c41dbc25a13ee2c61d1172e90d900302e0412ac8af5bfb89913ee763842ccfce4e75d10115f280eda3167a1f1c377d6d21e291587a3f4fbaf99d985fa2884f74013cf2b52fe25d2f34e111f10cfeb17ee97bee7ec337ef00590826ed1ab067fc264e2b2cb5b847064e25e0b917b9dd5ed3884522ce6f548a0ad9b0000305647e3573c597c1feb1c1be6dbe09234753df588dae8dc152fef226901825aa5989447b43185d216f97528745d9542977042bb97e7c3c1e3600f5b7a2d67fdbfd851b604866e0363768b2b8a3eccd32811b3ba19a5de8ff6d469ce01d431c82f6b1ce252ec64c5c8829dd2fa353cc37452ccaf71f45b558c119dba5a22e84ec8d2fdf5c23480ba9218b799e2218d5e1b5763ee4786bbb5cc6b8adca3d40abdbd3bd7a950331600f79cd71c8dbe8eb1805ca9008c61bd771154788c4e0e407759db825dcc93a2f691a8621acef40033568d5eb12745fc30c8394fe1063848802dd4c7ae585c58b678980a12809697a55fe3e58d75b213fdcd43644002fceb9669c11444f74ef8a55369d0299cc2d5da14416519b0be36a15863dcaebe1a233d8b81c18c74efb652c84344feaf964617e3a95e2a87278867a55356872312ebf73ef4dbafae206e433f107127977f6f311f600c47c4eb70808d822250c7a89492b912a0b8cf8154cdd9f1eea0c080f04282b37a12b32ba0f685d84e3f4597c30fb0a18f79f34234ed3955ea1599bd8776e35de1a814fc68b8b10a898b48d0851f66754d0e61b8d1e220dd50ca0882dea0eed2449871c2147f36ee4380c1912c3c40f5a1c2d8c951f54377a01751e1ee2dc8e847ea1ada4fef10c6c5fd7d0879b1f19ad1c83674b488dd350c4eb626db66e40343bd2eaccd2def12a2c16793c2172ae89ca30555d34ea73683f89e6b8e11cb0738b77081aaaefb9b9b2080e7700de29a11edc66f18740cf482db816485b14769c4bc73e7b9a6bcc568084c55d794ee113bdb0f613b0613ba961492daa0b47ad202049184c230a2ff8439418e5dd25887c1577a5024b09ac13a3c88fe7ff47c4ad537ac8df87185ff630df4f56161c7fd4c50bee6437a3bec0a9065dab22693b28f45d4ce76baf98daf9031eb79e7bbb0ec563875d4cc2f886ac388ee5887f6e0a85e6570e94178754548b924e076be52d83091a945476870d436f23a687b80d270908ae14afe7e6211149be07c4cf21809ec96996ecfe473726ad2a2646be4e371ddedbec2cb743a43a3230964fb8d34209c2b75294c7ef279cc5e1cdfd0e189f59f49618634f8ce798d72905bfffbb1ffdd0ae93d2f1affe34ec6da8a4d691eff1bdd0636960f46eb38d5710ff773e098cf0a5c31be100527088881f00c4a51c87847075c97c74815c97bbd41a6dd4039891e8a2f66532957d7eb88eda41c622b74b42703e1652ae120a28ab64c5ec104fe136a322fada09bce61048c4625ecb61b140c70415c6f2d56ef5cbe506a0aae9a5d3e62964b3d15bc522f5924d43f3451ab1c72c804aee00b1e70bfa089d939def7d3d95aff5edead90535bebfe88a9294779882c60841e216e6223abf4250e086e3f1b34a720959e94f6745261b89403042090560aab2c325791c110c1c3abfe45fa0e8822161847041c01dd9908607d918364d36ad7dc8711909f9342ac66089d9009e8275d0e8e89ffcef710447321504b0f54901d86f0151c177b9a747346c9940820a89783caac8cbb0e4bd14620bf3d5173b5f9780b0801cb2332c2428cabac027c8f4b287901b33e288045d47e20c2be90cd72563b096386248a497a5c865c66467830c596a07df10a93bf14860038a61832341d72d98764c7a3fbebfc340f57c128256e6b55399ce8272c1b718fc6380479b4cb15bf1190c142d9922a1b077a9adc59b75867e95ed048bd900c54bc1affd4e9633c9d429cef1da0f0bdb707be21d4c8443973e1467f810a1eb6fe0066be652d8211e0af53cddff5fb61dab65ba948407b5080bc8241ba0785919358c915b172090b93e91bcba377d72370adb89781e1b291faaf6e4064cb5263d3a833ff1dbca61dcafe231fb42d4c88434e5a589e4fcb9779cbe642cff2c3d263affc9e4888beed23bd700a4aa04ce7a39e739e8a2d5e86a02144d585f5f71c5d8aecf9fd46f53cd72e338eaade0eb219fcf9c0154d161297d5409961d5db746429e3bf8b8e0b63a329e0f929712d4a64038de7f275b3e268e4b524353a5314228f40686334b84207e52041629e27b22fe84b25da0f14c7244c2d8b48088da8c800119541291997789f266732884a821cb2a9c8edf1e21ec4ee5769ece9a6f1c2b7ce757d06396985fcad37fe37c2414f9acdcce4593143e5c1b8cff8eeb31ed41335cc8e0b0ac653274b3617e8843da69c6078978e702c773ac8e19647e4e6fa7875745d3465a35615e19af792f965d87d01589d5ce823745443ecf1e55ca00b8b6bbf0acf70e3559a57b150255d86393bda933f08b34033db2b844acf67d54a38187ce3c634883b638db2528a7e3cf46c4f3fadc1638a182b2dad2b55802d33a952b06488cba2cc49b2531f016d8ec60014e346d36a0c50b059106dc81ae724d199e602ba0da95b44d304173e30ea24e02757cfa094ba25a441c2520832ba7697774b593ef17e57cdf3b11fb803de2eec315204ef46d39a6f5880a45a16779afe37e4faf284cb88238ac1172dd69c681983e7a6fa6c107dc6f4a1cc8cd88c66743a5324416fd6accd33fc2cafabfaecb88d3d58c89b76915fadc8199487768cbb4859595d9658b9a05c67743f6c54a175915f65a849870b076d1db0586a94fcaa0d5eed3701b56ba766562415964a36b96920272b7efeae04d6504e5c107cc1cfe5b2f54503e7bb181ca29cdfe68325c7a16ce4a9f3201fd5f3677ac576fbf61c85fbde3dab389b4f1286bade2754ba246f8cf5eb9c21dfc1542dc105608ddc5f5593fb6823cb13132e4639b548e95047a22ed0c2c5ffb0fa735df453453f85cf3dd0060b9c37ec814d00e9bd9e0a69c667b2b6101c3ff7719d0be3e5e63f2380f666a6b1604be23948782c82f787f04a795886ca1ceb620f63ac92774203ae77262574ea85a0f047e803412b7441a852399a6376b4af9c759a87d4490816d92876f3472966ed2f63d8aa850cf9c0f49d245ef410a12ecddd44d6160e99302d3b46bfd8136e82ed6bb2f35d2937c588b4b1ea8c58bd69246a1543a8e59547d2f01b8959498b740dc882d09471c3603eb3b863c85f66b07c73b39dbc20e1c2c3f3ea4db5d60eba99e7ac1bf4c3ee648dc5854427f4f40aab3a42dd19ffc2355bc62e204d08dfe607f767653f61fe7d7ec55fb0f9c4155ddb716f3b8866718ee44101207ba7c7bcf7a7fb34309f209488e6c0d84a32bb04d03a7f90686adcca6adfb8139a7d845cb1a3cad332c21dc3200535b437422d8d20951267f011f3f744f575c4bd6edd2b3e987025c11e427d780a119ec1270148226ae7de749c41a0e84769cb6b81773117c6c7fb98ba4deeaa001d04a05a1041ae795650a0120abb3a27060d41b6c51c3f3e699ca5e9461b22bd4cd9d404781819e4774a4202e7c83572df486b4304e9b9ca6f8ae9125e70b213fe79a3ef6fbf151461571b79add16ed0484f4a2a860643716288dfca4f9b7f31a5ad41e573a271e124df3eaf0471cddde07c5a13e874417502c278ccc63d22e60a0b1d8c4d03c6ae59ca225278567808c8ba324b964e77a5bd01b0b4b329f8a104b18c902e3494c52d186f0b6dcbf26ddbc35083338c895c9c7e38745536e524403269079e7d768f4ce2da59119a98c5a8065d3847ecfcb769c65eef17d6ffbd2c9e4d48f152532cca742b33450b5f46651f2e05037873eb08125e29e4d12cb299f849e8095a352323e3fae036b3d16983232ee85d85c314497ffb4a625a00b2e26b6e22b221c3e5a4d1d45d5225a634d34a15a960031bcecb7e035bab1533fbf755d00b0e298839222641b3e0acd26f52d5c3b70f377542d578faef4f0d36036f56d3c12a8cb398c091bcf81c5ddb9740bf34add0f936ae4cbfb5a87f288034755c56fc63aeed91a7c748c24a95b9b2f74c09f5d37975fa030e19c6985d67f7b91e8f96d861bda38a546597518d3e9912302cd2e8c365a6ef8cc3e226acd057c5855e30ae0829766d590dc6504d19d41ec5c957c873f8de54a3068fdad7063b94d1f0ace17ade48130b0edc438bb9d7a9da0b493193618bd2cb17549d83d4424d8a7f90542588bfca023173543e584048d058f076e091da26df3e166af9145df3fb7a1b2f5389cd09e7e2c750400d23f74dd51b4e3598794881e60def79f6f9cb08ff2f35be2ad48fd609ceb7b2d343db15e9eef0b23b3c63ee29f9a264fb3103573df1a95354b9051993acc08c80e62f835075cc958e8fc1eb8a68afb5508bb07cb6bdc7e0b7736accb51e8b3fed81d84f0383359e38f5dd879d42096ba146b20e35c247c78d59eaa305db89662b55645deeb96b0e9368b3edb85761f667cdec5e413e130de1759acdd3ed695d1cbe02f045968ba37b91e59431f6661a2de217937a2cea617f1c11e2419b572ce40167fb387480457cdc8015556d636f885920223f891c4ced227561885e1b7291ba2ebcd608e7b22a40c942640da3ab41fac9c096d3d624d970d227a4807403a6427dd9a15bee91660be4fb0a29558b0921bfe940c6ba3af383d1567e826a20e4fde099572cf8c79a55a566fda13fdaaddb3b4623384f3dc9a6bccc225d6529c0e2b12eff805613c2b837e11ae1e4a1946811cd70b2bff2e116439ff8bea85ba390dea3352f8ad6fd531aa226d4f903306572f5f0f496bb62c9bde2cb1b4f3e6cab64295be4e44b01394fc552b5d3ff385317a7b8738782e7773f0c4cd3a0993610c2f577b63ce2a992dbed4f14ebb9ac0575641daa60073036b6c7eb4637c4887e2cb3dddf1536898077b107eea79e1cf0dbee5730beca6e1ef97598914411cd0c45eac0f8f595d9e7b8644567e875a4277405c5ecd79b06622bb106aec43d8fc8ac267867598db479a715157816fa00e9b1c636ca42da9339eb42bab4478760e82c514ee40f092194c54c7729ea01840388e4fc384db1c2b1a96592ab9c2a9df76adcd58997dc6b6a2b5bce2d6e2e2f2f6deb4c41081f7aea47702f1759cab870b5f4da39d3cf59c9e76551845b9713a85b070dbf742a6e680ed9184b74d6542d8ae1e3fb3013ebb5c491996de90a063877f8ef34beae835717762122947bafba2dcd69888638404d89d819943e48d45a1101bd08bd833475642d0ccefe2a9dbc5f0be419bf953ed527b4d9cff8820b2bc6f336a614166a28f5efbfb0a00d20d8f1053a2ec2b24a2b85c9a0bd1526731c96033cc968aa32848c0742f603424fc95da4a509ba8b565f56d1383fb5e44569191c0bdc9749c948fd09a8aecc4b155254d3e1180a439124f0bb2a76ec113a2702750b987a66fb290ce387b6dd0bc468e6a263e46a2f6fdc971fa33e50201f035876a59111c0feca9d1f848a2d6e10624fea4e403ea131410e0d8bf3aba6cc8cc603e53fa30dac4b31ab9efbec40b1a234cce7477cfaad188b491885279c541b771615f0d4307fd8a67546ab86d4c8ecc60356414c0b0f19ed624f7dd7bd2785d008349c25186ebded50d45944cca2d666dc5c432ed95db2b3ae2f099e67f679c1f8323ec4d90bbbc1ae7593e4fecfe10db7e9d57445a2f60756a35bbd27b444635b4f00ded169043ef06baf728dc67a1492b0ef58136a137aadd4c6203fbcb584cc6f391ef1ba9bea7388614c331054ca0444899f84ac8e423324c589eaba26bfb6ed63a0d73f279e1cc36003aa8b0686e9c689037d895276f10dfada010209e4be363d4ee7e659dfcc13719d2d95a2ed8ec9f6d7485821217c1a518a9d689393732ce2755459949dc981f6443179f45135b58593b4b71e30dfce7928dda22df267b7367be67ddfccb48a98f51e618dcd9eac7a3d14cd8c2cb81d6eaad8cc42b2c2c75ce35d6a986230ed369719659f92d4531573ced0f495fbf80aed44f6ac6bfcc2b74869fe8b236b52cf05d1810650f4e875ff2b08cb58afe6ab3f586276be1a8e1c68f72277f1374d153c8eb7e7e1e97ef044f334f70129c6ab1d9bf64bf515599a4af2598b814ba48cf97b37154fb519c13b45037dfc5509e46cf78663ffbc9884ab688567191db8d4925daa9b39ef201d2e7714407cea2a0a6fe063c93e8e5a84a487771cc13a25de1f513e8b4334544b5e3aa8ce441aa82c2b75c7b6da52bba4056b65e3de6038afbcbe43519211efefebd2b53aafbca949b43b43030a3dd92250bdddff27b40168b0825341bec009b24bb9a5e7f5fb3b98bbf7c60e52869781c9a90b268477a90c1f682f245d8cff09aa8aa7209129b517572ed29d5d61d0bc474fc418430d098f86838c8401415e516322cc17702ce43f47cb74255db8ccd62f7e3538dbfe0e981cb529aa480b84bf71e2708a7054ff7d9c7afabb12b3e76a5ad067f1b0de31d1c6f5e8705ed25064243401352df977b19cb3784de9110d37dfb9156ece8ec892d4400711045e284811aa536db782d462501bc65539091284f0dd69de26538a846d6e82aeb8f567347de9942ca262ddf5f460dd4f8992f43fee8752e336ff95216f2e9232a6ec295d103876c9fbe8fd15ba16f574aaffa87e72d56afa02d5e32260c8b750335c68da30c8d4ca6f9633aadb617dff0286a2e51e581e3e2e226494c89ef4a7b5115594a3d31714e8906d5d0dd281daebab8157df39c7b30cd9380fc764eb3579a889d230ec8ae6473752ac7fe0e19cbbfee0f7841894db7adfa1369a1c8cdaacdb45a4810e677d781ae647f409cf49b11c8c7f178ed0c7d168a8434b6096d5cccf5050691010e093dee02af6ca962013167f56d415937579eadc25fc920558d890a51cb1e7fae5623e5d889efee7859069677fb9a1f0a5e640b62841d397bd06ed46ce54578f8b079042191a4dd77044947dc279fceb9bbc403917bdb596e9f80e77a832ea3a83638e098e241fc05aaf9a64c74c900d3eac83e09117d9c7baed7ad4f1af2aa004bb3976941b775f7c2d03c0464b3b68a0c75a4f04163f7776a125323c3ae6a81ec37284b91afe711b9af41988e5819282a434ee7a7e2e4947b7298b269397c344aac8565656c236fe62d7637eb34cef5a10f405fcd50ace068f671c039c1f5384156eb8b17fe8f2da899ba3fb39b8e8615dffc30a75ff8a7f748f4202af28a38a301bccea5f6c4d57b374999fe261d462f3713378ec1ca468ec6ee0592424ae489a280fa51f83d264f4b9e511de71b1002b06249dc461418a62bfd99921578378a37256cc2848ffad4920b5b8fbe93a9c4b90d50eb6aebecb4abaf4829a6a35093e8d95539fcbbe3c8b48979477c70d0f879995686d18c81acc1a3634c01768d02f82741c2e1ac32b23c5a59469586a1f4ad072a794d7454a37c3c4322e6966954b7b3612c7e8fbad50196d4928e0f787940fcb47ee92234b4e5a6022197810a1749c245b63673d1230de8b5cd4a253de5469fd1ce8422cfa982c9ca7684d37abc498801488f9561208b6c1ca4b234abc54124d0d4a1b7f9a9ab8fc0d031d036dc7160e5a62abe6b6f091e0433a5983fea47fd5814f2ed8b45dfd325a942c18425e3716be38a7272d2823737d3f9bd88ab2fb73f59510c8916297e2aa3da25435dd24cf24270c3f29007d81739908e232204948133821dbbd9fc52ebe925a12cabad732a90fe173837fab0df159f6c0c5eb2c46db6ff34c56f843aec9a5ca9f3d68577c4cebf4ef85735b5270bbea0fcefe97ec5c9a3623bc278f52f41c255d2b97f93168077b6523c38ae99bfe94b3d2edc9168b4e741ee8bce62bffc6eb667c23888ae9f076d0846ee35418eb58ce3841a328ec725bf4340df4d3c735eab1415477570206fc7ac982b75e83f1719863926ca4b77921e77f4a54d01718d550654545f83e3c5803e6a30f67e28652fc07b566897ac4ff789af19a703755c63f60de953ab5d34ecc5cab9657ce897ca8482d11be5072d605a04cfa73fadce0066152d62c338e7cd04f6d62a1ab859c5b3b610a42a7fa27f0de92b10cc94dbbdaa1960e23a7aefa9d290cd4074df9b1e1b10b990a8e8b4be5435f7801c60df2c54261437d390ac5015fb1dc88a45a393d211c3a265938ab114b50c12b44ac6738fa53055bc8fda920dae15e455b8363c42a0b7eabec3b1abbefbc475eb57c375aa07850214d6e154fea826d51685b4fbdd688875a0d071640c8a963facee6bec8866a089f6c625384e65f48d9294240f21ddcc365237bcba1299a40124694ead7c2f7de68c0ebcc8aa392df66f330ac2658c6e41091c789915f935ab2e1987605ec64af1e38887a1e0bb25943bd57f099233a4b963c7f15389ed8e6fe93a0c340e35420e2bdc0181ee7228780749d25eb96952e8081eedd08b472cd95dd99dd94ce3da35402f7fdff75a8d596c275a0f6f8185877c2733a60e3b2f96db72564624bae4c90e7b0ce08250d544bd58b7cae04af17d1cb7e59f5c8ffdcc457281ceadfe98c63074cdeba5c436e55c51680bf7e450edde41a1a3ba7b655c046da85c1727dd362d9881b24134de9aab1102e86acdd36f8e5086feb8f8ca0f222bcb231a010b2679a16050cce6702fbf5c096df14b6491ca007151b5f5235241753192b36bd9fd5bab5c8ba48e02f2b68b9b23cf28d584390159ea6334aa08acdaf503311bdfd3da309245a6387597c1480590923f70ae6b8db420c0a062e0e31eed37476becc87a64b7acd5d70b2fc0b42f2a3d012446ed1f586c5a654c0fdbaaaa2c5be129c6ce6f7fddf7f904243232a87ac948abd00f2df1afa28b76e1dd755572d2982bbb9cd9cf6593c0afb9e94986a93f067fe301dbbda8574dace5e8f5d1080f32d295a4945d12f8c89394e2f8d717e560fc54fccdd306086f01f8d96dd144cff175f6131a8ec8c76e08212dc9d0264264c401317105fb3e81a50c6817941f6c0191ac62c4c07162959a01cfe89c0edcf2e2b7f2669adb990e1b5e6d43b7af959319d12dd4a9bb45f200e35295e7bb410e28eada54e8a5aa229c143fb83cd6f5336156378312e6db6aa1dd8e21b0bcc6220bd73054ac1b45b59137ef259f0614160ebf5993db2be5814cc716710d49813204a7d78c6370dfc2816f8d50f1e6e8b7d01b27635cf2f0e5996957e2f1038a29618f6ab1f784220694b1dcc017c2f03cdaa5fecca9ccde22f2f7068bd373d3f812ecedb6370b3ed06322f2f09c560f2d455801c00135c8f8259afe365548cd4bf0e5a8d655dabaf90deda8ba460df111dedbe6e32f8cd1cbfb08246aaaea3cf09f9f18a82adf9295c7f47c601624382fff9b371412047f06ccb532c0884b7bfcbfad752bb27016850bdcc66091c8a4d681b84e796a5a9a339e37109311685d2f73f321383e2fe7fd3aa5434b4afb882c9095578f9a7a61a3f76a8be54b6567181634fc1aed9fdbda8d42f762ea2362851cef7eb28202ea0a54484228a877109b6a8da62cae4521a9f3d1a058b7b276ec36059cbc0ab4bb3ff12baad82830354b97d4b082cb3ba71df39281943109f3b95757121ebbd78f841746d71e1e681c8ae3bb0180dadd3f9f909a216c0e159ad600670d08ef7d3289370030635fc723c1710f0dbbff40528c4961f1b07c385bf00c058ba584b2d43d235834ad1a2abfd72db77d2344b33f01c465f5c1f155f29edeb0af85db000e02bb1d9479e34cfe1d8e380d6211a11a8eaee9e7bd77ae7902514e56e58ba852505b0ecd45447023d6a1415dab52d57eba4349e3fcca19d1686d6a483487692733184b96354945df4b73383cd140241e6d2c170de21ac89500feeb80cf556bfa0f7971cb13f9935892206ff31ad18435daa5f3e64df8aaaaed30c4572fa281b99b6ca2c3bdfaa0dffb36e18403c1316215d54b243426287cfe268d6fa22e7cdcec6aadd94449657e1d18f245fd2042c1d10fd1f16d27a9b00250521b569e66c2ac6dcaf5d0988632bd5e203e3f047c2eeacb25423a5aae8fa4ddad06134b126f1eafa2111564e220ce1433c96b75ed99955b6bfa20cb8e4a4b491a48bf72d7ba0fc380dd9c839cbd82bb4d4c4eb9aece98d979eb765f03a13bee3b3b90868e9e64cdbadfe46757719a21b0a8b8123a45825b0c5ea0e09ce7aab2d0ee46d140ab50169701997806934efc494e65d33c0c3a8413dcb4d2dab4f21d5282f38896d2692f66a4c273a14c37131f7235f72b0eab04e25e7223880e980917b89b5cdbbed060c927da241112f95a1255804f62397263594d51869064cca13cab795569fe7d12c96c860ff7e24d02dd0b5278340193d5d9e69e67db8d1acf4d717a5399ddfbb110645d9e01417dc21a903c3eab56d15f75384d7c6d2578e5cc9fe263c5a00bb72d9929eef7e1ba9f494d852b58b740db72450ab79eba58795ec113b0b3a1b7778ea4c1becfd1b37782f8fcb620484d3fd244fdd24a4302dca13164b2aa95692912ab054a29d4c79a1343403498f03e19a0de6972e389a6cde8183296ca45b2f36392678b2a0f276413405e1fe199bc8396adcce57ac87bf154577822f7969f8fa36bf0b9a6b5f8c490b164e0d79243fc2d814a2d31133d727c39d1f49703b8d0afb6c44af50f2ab5d68c04f9c2c0c1a797d2badd558c8af5b51106cd03bd1b41f3a6cc15f4bc80c4761b72bc089e567fe667d9f174a2a0cc98463ca0475263e25948156eae70521f05792603021d62c0398be5ee63b62691a90630b77a3d05d7f6b4ee8d4aa280e76746b877edb493e65f6aa76271487edc366f74b415896c9a13d1b9b05523ebfbcc4c981610603ca0f7a9f0d48362f00482b0918ebda9ecd2e587968e3c2e804d182457ac2d07080ccaff1f4202c4c67551de00d761974e443c658c49a9a3d55014a0348bacc8c01bd52ffdadad37bbfd4288e6972e305cb4d37756cd9b6b9819b5272cc8e82b62668e070f139783c9f0da70737eb25ccec999f1490b6169b44532d5edb330457fd819a7f184830888bb1c7c979f8045bcd4d040c7b5a26e75c2eeca4f57f46a7b829449027eea3324fa9025ac95dced8146dd84550e08725ac58ff29130cd867374265e0cb90bdea8a49020a02f351496439c62e300d3060a253b2b3910504cc5e521aafd6965cc0b1b31a6a215bf334a88b55ca503395d3bc06eced56a43c0891d2e90536af031c1d0a9aa1349fa35c8efaa37b0165d36169acc99202b5b5dab0f658f167f98ab380f50a8097c95b11df42dd113797208cca4e78309197ed8cb2cb3e4c968757a244cdce34329e753581e38b9ad3e2af594b7dffd813ae8e638fc0a88da61938b9ffc704e05cb6609dbcf28f8391a144a9cc163034afcd216264bea2b3de8667515aee083710d16e7e3d1765b41ee4e24035bd38d7369793f1d64ef9a5213f89d1724484c3186375e0a8aa7927d638ac2c05829f6824610db764353fe7c907bd55bc4e474873b2f49a0c7d7f31eddb5a58fcc381cc2265eccfaa4978ae5b26bf9c116c4a822b116b91b71c62f3db478db932169aea2cd67a311ef885979c468e70ac90afd08a14ba80863b428d326aa1894bda86d60748ecc216b6f11d27df0f3f7665c4ecc0a2778f0534993da61b329783e4976f33ed82f51c958c7246a5a0acefb52458df822ab7bd65dacde9b69ceb97f018075b953b21d20722a85f10ded2a88ec59d9d987f57c4be7d5ab4dbada96ae63981262474bc1013b83c447d6942d217d01760a4668f329a17173a1308fc4b33b8c3fc69880d04cbfbcb5293f8bdf41723c3fabaa3ac80257c1e671b54305f3d770bcb842fd65ab33c35bed4b6099c644a9d402fad02103d3b5127d074f0147556970a3f830290628f2ce76d111590720a92da39088d5297545f5554b1e7e14661f999a3b4b5d4a93482f1c4cfb9f7992fb54a20697024d059e7224c494e835ec032c45d0e09817061585738bc666d2b80e5d350aa9c19f12e3746ac78ba84925cef0a7d7f9b8b100c6c99e2085e565419ebe0fa23cbe8f45ec7252c1406a82ed88fac7beda0f484cb817868b3f4bd7fd154f221a6f1da49275dd0e2fe0da88a9cd7c28ac4f79c800c85188d105de0048fdf42ecf65648de27329b4017b0d21f506dc1b3072079b7d58488115caa9dacc9c03346978ea8b130ff3e91191c175eeea5eed83c6573a52fe74bfb98574339ab80c4734179636f3d7cd6f18970bf41b8d891e777cc3d6a748be928ed386f270067701bf50fc4dabc65905ffcf49fda692527181a90bbc9630aa97d867ec04dbb7f6f45199563366d85c4af914f6d70077e6e3972e8c8636163f0b51797eccdf115a0a4b9d166798dd9cded2ddbbae53f5a0e7957ba35cae533540098a66041dd08254e919007a1a5d3cac004419944cfa94b0bc00dc9baf140ae73e5d8a9b2bd6ad70dd1616bdee7252168c62337f5c5f42193bdaf3bd9d397b98e2f49b3437990634f8344d551222d0b64694642ad8bccd754d292d0601c66220c9344ea6171711ce4349820be427b58521c8fdd1ae60843e2eeb97f55919902cafae3a332219e22b5115bcacfdf790eef0707b498fe83bdada328a6eea2dc6eb626a839974c02af2661555c553cea701465b41211ac55c57feb43a0aeb0c7e16363a3b21597d8ce7fa7909f3b13d3cf422959c80ff7e8d3613541087eb9a05ab668bc6cbcbdf6b99d283214b56a2f3c5c43117fd25b19737a4a673d7950893ae11f6a0aa4500a05333b9b68899b835a830f84b558a27940bb5f61efa2b4917b4f8d5e0174f994948d35ec23b0fbee5f3648cafec35160054ff812a94c0a659edcd497382b62422140c9f5e9459ce481649dd40bcc0a70a08d79b7420e9236af2a886a8f8be3230bd9e97529bb5b5f7da4c1c1a516a3b246bb6739b78adef3175b4d6bf02cd356d34a15159c834f023227045227b2fc2d40ef333ce0ff182d9ea7b227d3798ca658e8f42f9272977d7aefa9bc163c1c303341c0598e969d723e4693cf568e23d5d881beebcad49a53657745ca0bbfd8eabe0eb46acf198bd2572e103a4221b42774f6c0457c736998391ec9e52efe143b99c70c931881d62db3e9f4b2e06cce1fb32a8230812caba8654a321f29df60b35bff1786cfc0cec5fbef633702e8ff5b4014633ecd972d8438f43fa037288fe57e6e294cc625b20f946da6df7c6bfc707b633c35cb00e8dd34db71220caf55b35225588583a41237fb539d372977a095af4b92883589aa402b2528285f9d61b87e0c2a838b5ed630115130b38bea72504cd641c69310399d688993a6395b9d8221931139183b4509af1c50dab195f3ab56277efc34fdd8d93145e4a6e2ee7b6067134f5c6d4003f6c25a7da067e1469a090b6aca3d52a588dfdb19e879009cb807704729880d3f97d98ee06635c852dcb330b65eb4efe21e291723f727dbc3d88b0bd00831064741d822a6e9de9d67af25b433b75864cbe863090fa6709527d1446808834577f47190d6db58369b7d674f28d72a7f09816db0764085f5f4203b902363654526260b772c4464759a6223452a657c633210773f1bcaa6183e6ba1e6b772933ca8c55937932cd5035e0b99ac125b029e8bdfb9078712c47548b7e0c680890a48660b5521f2c73636888d32c00bc27b6220e6126577b20084160aba8cfde274ccee8b6734c69f9dce7411d1282676f6304addd4a463b1386740f398b703f670a0d7929efed77607006e585b02591d92ee779d09929a5e19aa7271804ba06d3b904859ccd63c46d8212ab1a5307c92cf22c90d3bee3fe72ef1153206fb3f6006f92488dc287e8085f69298d4cbccb4255b6a6ea259c5d047605a7d9ab20514035b2e85258e9cbae911ee1201462fcf955fdf69c8d6aaa3ffe40c751124d9bc574f3ab902638320a8df39ac80792c72968a63a8d8491314a1a8b26ad623202c71848c9c63fd3a814d585bd2104950cc60a819f203cab8112c606042c8dee288ec6b5b0ec612cf311b1bdb1c3c928859db6046372206e8b708fcc3ed1e711aecaca0b616a5d528bb3b379c725b0954ea5d5b688287547f967e5217a93d971b26cc0c0cd867c30766773b9d5d950efc33a3163ca26b35f13392d7ac78794c44cceff72176901381948ceb9d5644aebaa797dc0d1bc33915cc61d051a6b7d286db8a6c6a09b0e15fc6b0d335022993444535c02dfb0d833c98832c9e1ed421785abcc57a50278dbbe08f16176d7a06dead2ecba8f1a65d0c63cf5588fd791e97f55fdfa359e9f98a321ea087b32b186e48c305cd10588171b40357a5970492c907b4889462d74b88dbab98fb402f80960a08d071853f40f2656f54bf1f0678ca8e170e9223016467865d18ed2d9f3d4501a5810f9e02cd50197d2207957d4478fd117f64f7cd053eee52ffbe349af44cd8f4fd877dbe405f9d8802351cd03aa3b5c84c69e84cf6af49f55bcd617b67814671257dfb8c452f43dc68a12a3513bd6ecd335a9ff4daa9706b94c4b3d973cc198ab9aabf8cc5bd79a180599c2df30749a46aa5a8f3ee1b679f2a81c2bfbf0809e17101c34eb68c61ac3dd652f09f88748a32972b4451c416bdafb71b6d504c86f00bf007b062b165008e8c952d0f13226381d9880629374642465b27495ffddfbccc483845b3e9188fc392a2564650f91c49ad3b188cd5cf919e35a60d42a5010ae8aae635ace6ed8bee758ba800f47c693083a93ceae866a6213e25d525e448317dbd2dbdc68a13eee1ae8cb5b14e8cb04f1e0df0d0085c0036ceb1ebafeed606fa02598fd717541389c0c7076bc5611f1275fbe1e1e674ea1e9b66b246b691c9a2464fc1be7b17a1f6d0e6c6f1e3b525b47459f061336ee5e82c5b90ab1836ab550d5dcf708042249659d924c787cb0fdcc25b9510e2adffe737c3b835ff55d31feb3a3f849e953c55cc294196398ef62f7be63a7f358cd6e8ea194c7329d8c5449e6cd4cd5360dc8196de3dca70f0c4359384551c98a58b39f7d5cd922ea7113b0471842e7a84550ce6a7f12a0cf901f8ab1e311d71c30f1e7a2eff0ce29efd5bbcd447a89b5397dafaf133d1a8e0be1c719c2e874c35b2238f31b2e4d9d3fc5e4e71c7bb69060bfeec170a376111a0280bfd4c616e39f03aed46fb260d0b5e4eed3522069188ed2ff07cb97fe8e88cf59a85677332d9b3b3c651f46c72550ef4bb82e775ff4e2ad9273952adb1ac868c2de9014469b1624c9e29cb94e347a2439651ab635ee71780af7831efe155f17b95573717ee510590d56355a16ec0e705f88d8c4ea4d3174984ff24a9a78d3d094d2646524e8817d0e223f4dd3c6f919047ec728c3b4df5df610c3d2d765a6987b14ca83f5c424deacf91ef4e5d4b80dc9cc4daab9de8b225145eea6baa1fc4c85ab21ec2b698818f4cb03e2689bf98c82d4ee87f47c1c889904221422d678d6a8f2255225e3bd3f3ca04b2ae1d9afdc8dfb075606bb98ad117d866d797c5d00abe213be8892c36fbec6087289602e976d86111b3654ff3ff90d7c6f399b860919a88539eb4ccfe7d2a33f7637f79da259e04c525d11f4b7ff847d1cc2b5b0645685eabf0f891e9dd71823fb8316f190303f96fa8ca8f186466d07c12015149cd9e78c74410cf581c1da63505d5bb13ed6ba5e094b2226252e36510cf8e3ed59160bcc9045f77e1506fccf8166b15ee71c5466cdf14c2be70a5a6a10fad6821e767a57b21bd6dbc6646013c6a712f41572c8e0d5e2139a2d404b3b53d7c3805d2df8082203fbc8dc6689f656060d64d45bf35202fcf92d3a87e20eb2d87b7e80a29bf6ebdfe60de2e9735527a762a3426ba25882fb5f376dd52ea97bddfb2fb4ad4376f395409ba6f0bb62ffbdf45bd8cdedcdf5e79cb5b357ccd4bb58cfdbe2ec798f883c9de72bc45c01f688b203adb2e8ad3545f8ac32f88b1d22fcbc31f89e5d3a98beb329bbdecf79b4d704fbe1e2fb334e37949d063e9fa7c699227f6edb52a2bcd09203c6b7f8ed4a32710efe4414579876c89e24d6c8035b0b92c2b2f96286a144e3cee7f10c23de64d70ad4721e660785cf14b4644dca41d7e11beef3a12bd84046e942b1a34c4659d41a9da18eeea5eea04b821517d3036f8df33d8b60f9b4c5857557afa0c73264b7d25be5f422dd99d683ec8c6ca904368652d1b92588fe0ebe5d806d47efb25be8940bd7b8c16458e952018d9ce17ba71a908c5a3bc9a544b6e104899585f1405917f4b633b2a59d17f40a3384947a75d68907dec98d2494267db60ab9c0460939721381bc6fe968dff8156e48be505aeff7ef1e51a001704fb3fb2b90ce223c701efe5b56879103866042ab4cc7c56dd45c4e89d0c91fe93b80cf170ba9f394f380d717ace1dddc67abcd8f63734905da68f69e82336f6782af1b92098cce94c8509191a8ab99d61d29004090d21e1b9aafa46d5014d134bfe72c7567cb16f70c70974a9020ae2996456204a62950ed39ad3d17f97d649564acd46eb9b4c4e4789b5c7541ade90175db26ca152d9207d2ff4e656f1770d1c68284db7659c525cb7a2624a648ff5293ad41e1c66c122b33d793b6cd25bfb846c42f6de52269952ce052306ab066f1bdff64d8b1a473a6fb6d1026bfb0a460a2cdfd1f2b5b67429f7dd091aa74103cbbb0c3020a1741e801082085096773ad26cc9f9626206c601e9d68c79cbc1079e51c3819d6a8e347bb8fc33066eda3dffacc24dbae79f3470d37dfe99859d3c78fe09433f1df18cc2332278fed9843578fe69359b3078fe69643665f0fc33c974aaf1dc017ec23961879d725b21f3f79ed9b4c1f377d86ce2e0f91b10cf90e0f9bb8b9b583c7fc3e126089ebf87e0a6079ebfe9b09354d96cccb09354eccbdec24f365a697e6bb9fc6d85fb0b3b75f0fccd0337a978fed6819b563c7fdfc04d43cfdf4cb85be07ec24d52d889067f5f750a97bf8bb0138e1925ebb9fc23e4e0260bccdbe4a70037053d7f05b889f6fc2430153b45758917eacbf01a3d17fd53001e6ad2a236f8498b22a29134967d93de3f34b2173c69953e24b2e46f608d9e03cbf421d1332d6a83675a14d1eba611f90f58a697b2535fb3f44290e360165af25558a6efc04efd0abf46ef523664b10f7d96c2922f64999e869d7a715ea39f371c007ee453cbf45176ea6996a8465fa3ef6b547b1c3d3cb053bfb3e45fcbf411d8bebada514d034b7e0696e96bd8a997c0f6c5c0dedca9bf705f385c915d7a281be39f2cd307c04e79c9e0b0feaa223fa445f1d8d181eed2f7006f8c0f6953e07df12d9b1d0b7af1463401ece84017c6bf78a64525bd8cb1bda6d6e4d24fdea495e6e3c672ce0fa7ac6b61a41af8367fc9ba15eb32f06dc93a1586319fc9ba8bf72aac3447c7d2208963c5f09aed937aa55e25ad63d11848ef57b4c69f583dfee7588e15c33a3d936d7a6fd24fee8495a63fe1db7c77f2e496b34bd72d1d0ba4d1a077e9c325ebb52a8615af052fb9647fcad22e8eb4044e1c53ad562d19d52a0e7dd66465fc929dd7b11cf72579b3cf5e332ac1522c6bf7677cf9f79ff91f009fb33300909311d6e46df1b8b1246fb7c5338de5adc5c718cb6ff14b6359331ac3c8b1041b0c83b94bb6e7acb325cbd729f74ecf2ce34b10f7a558d698befc185fde96be24ef04465fe6ee049fb374074bbbb4d2fc264b79e0dbfc294bbf60b5106f0bac168ef51ee64eb4cb943196a0ed7163295af0e458d6c8671acb8f3196b7a35f1a8d3c6c7689ac356f360bc8b182e7230a3e14a25d18c67cf0c5e8580c637e632959f22fb0460fc3be48b27c5f58be5196772e6ce9566eb6046db6142db065ad025bde8e6c495260cbdc1d6de93adcf9d6966f4be7baf327b0a5db70e7b7b0253573e925b27c25b07c23b07cf942c057caf2ee766079c757c8f2a561791764f9d25e3773b391837094928d361cd04f7ca32cef7af413c74670fc466f9c31bc40aa0de6edeb07180461fceab2bffb17fd09cacc397d9c72e6d3ecd94aadd43cb4424fc8600bc1a194524aa9f70945b0b5d87b7fcff2e7a214cf09389b98ba573d2794b2bb4f2f6a2895d25b75c6df0aff560c0d5def87aec7338631e7e5d9e44966b32946cfb040fff36afff859773690e96318863cea84ec4ebb5a6b5dfae0fa5b46b23b2a6a42cfae132a79097e7f5806d82b4c4727e46c36eb1e679592403009dba698408a3995bc577762efbc5dbb10816580cd12f26c72272b22bff3be7a2cc35fe6e3ce6f5aa78ce9466020649ec1b43b4a961f4453944d10aa97de91eba5a25d81908f5aa9ca647564ee27ee38e117f3d9b5ce1e2f6dcf84ead169e7939a58bb938efc2f3ad2aeba7f9390afa8805ac71e99aa76cb0985dc49a84241f38a3fffeca7a0569adfb4d92576503f318d61cca7d1780609211fed7ae759aebc6b1442da7cf3a6f22a8b351f42221ad3fdf912d1e8eb5da208f2e46ee35f5b504277efd69a2e256b0ad17c3a3e55b751e8f4515188fc09ae841506b16368559044ec39e79c258811fbe79c73f6ec5622acba1da389389f7b7cb30484cccf3dbb67fb122102ddb9df5337b1286e9e24fa0f0981f51ec089481f0479f4d3087f36b361dfb6e508b7a98dbdccf6a03736d23b6935be918e363ea87fa394fa0b211f51ae1cb2aebdcc8503961b72c81c868257582c908aaff55780c5a2001ba1c39cc1fcf3ef2b0f83661cb789b0810e123d6e38306577013f3328d1e22325871aa8aea0ccb9c3268928c050d935d3fa0cc82c66d3a823379f654d40af52efb2c6f58397ac1fb8cc28122177b94b9adc1ec95ad11f1181003e5f1bb36a177bd108b82392db816f04dcc562e18356c623c462cf44c42365a2e7ec6e724a9dc7bc3de6b5027a8c06ceb0027ee9fff173ec751eb39e2d2d70a9f75f8e1e13fc159769e00b3b88acd5c4cdedaa771222e6e0aa79598bc9d7ed1a5d45fb40f4412f655b525da64f3425f3673897bc2507ba2533b75233b596f75574a4fe3a12d9a85feca976543bfef0c806b1046b31fb5e44f0a3e08d58de2e910def49cd16ad9df754bbf9a39fbe9b73a415c450e8caf5c8a1bec584c953403fa6538aaab6ca6375db6b9695c7cc2dbb491e0ddcb2b122e8b2b1dce6d2d46b40b0319b846e7f085c60586ee7c13253e196ccc49eaf34bc01f4938f307a10ff36202fad4fcc1515ad1d0b4bba64eda625b9ec98c8b97367372d8fa1b36b732583d6aeadfce431b21be2041c273b2d2941c076e1379bb6e8c8ceed8f3e620a9f2d3b1320b8b363906380ba9c38b39bb668879d09b35b8ba474144a422c41fe67db7788e9d31875e608fedc12323751eaf369328fbe3d9a9d99c6a31749f3f5c3390b3dcbf7d5f298a2f7ab24d459b53c426f2a76fd777516dab6b3d1f3a6525caf968800b49ffd0dda2c8cd1ffacc299b59abd7bcf3be6a5efc1d7f94cd6d7a3b682b131f4e88fce32410f046b6d433abb6dcbbbefe78df2d87de0bbb5d153bcb9252240ecc1bf111b6ff023408cb883c3f8cea5da51ede667adbe17adc0470012e20e0ebb3d76cf4bf3e93fc8bbb2466b30f56466a77deddffcff9ffd3c8349224eb27867e9f72e917aa053affe8e0ee4592b6f69bef7aedae974f4313d90bbe7341014b3c4b2784f2d0f3a5e1b3d3623c52a3015bbf36f18c9b2237773dc2ed52ef6e18ed22af644b2ecc8dd1ebee4fdb42555e5ddb4a509b4c68afbcd1a048e02f841e9376951348b8f79bfef9b94099870aad2f61e469d3ca6280f6f8a52ea795e04e0b5d29ca2cdc37d843df3cba36f094e5a54d7b2561bbcc7598efaf4f22dab8312d0fb3dc8774707721f938235e6fd3cffdeefc7a3eff4310510ce9ba39fdfab0fe6a8ff793cfa965e5fcfeb27be6d7dccbba3015d4a549f6ff59ee6f0be7a95d63fee35c6c9ed831ff57ed395fa7bd4ee58691f9450a3fe1c4b3afb678f34a8ee833e4b6f01507ded49baaec674a5b0873621a3a66be71627c6852e5e80f056142f4f7c466d3bd9c344055b16204042d42e3d5e59de0f4aacb00b3f38566d762138a396b5bac0c4d93110586b54900911030b5058b0041e259498cda8fd613b0149d89f1d7db73fba063e3b1386a2ece8c8534629cea8e5343ea08064e79683f8b3130ad381268ad8b91d0ab3732b215f28bcfc996680a09d4f20e423719694fbdaa5a48acfab54885a6b05adec78eb0cdd12450038e536282afa6fc2c9d825259150339e282d084ae7010818a4108554ac18ca200411748cb0e701085868c0614cb618976906a5d1a080820ade662db0fd0c6bf44fd6c58c1b1294d57d9075f1d4da6824140656f729ac8b17b2b6172716af171958dd0f5917afc2da7ec50d0904776aaf10fa6962f17aa181d53d0bebe21fb0b687e086e4a5a39f2616af1700b0b6cf5917bf81d53989138b97f8a2a8c9da5e8675f13babc3d977a7f64aeaa789c5eb5f24dd9ec9227d0cebe2afd5fd08b3a9b792c0bc386c66fbd90de967e378f423055bb36966cd5bd2d85bedd54f9ea495e68b118a0beb5848f63d0a47d94677e2a47d52af46d433aa9f37b359e69b11fd01d2a6e835b2cd6c37fb310cdbbbb0a11092ed4156b2b1f024b6186deaafcd92efc22ebd27e927bf72265749986439a141efedc39bf5abb3cc4846344bbc0f5ea3b7bd91cde88dfe02a38761f44946466f33b26539cda2591ffccdceeb4efcbf5613c5129ce0822fc97f76174e9094dee8951c4c032725db042cc07cb9b63702a3b3bc9bb39bede937cb77c93adf6cafb31f23d99eb43db3924d88916ca2db5ee9cbdc055f9230bebc257df92fbeacb9f852bc2d909ed9c9c11c697e8b17c16953ef60b69fb6571a1dccf61780d91e0698ed93c06cff02ccf62ec06c8f34da8cde48776d6ff41fb0d6b519dd2cbd466f64f4b697d1a28cc2701c99618ca32d0ef6644ecc067176990b4e1b19e09c997989b2cb5c707ca87844ef32179c2e70b21814e118b9658d16115b63c411af0a5c33c491eaf5ade13a427761573c12f4814f1617247daaae24f193b5064a123e70aa8e5e9c81a058ab97b9de78ddf22f6d0e0a666e49062521c67cf8d088ce831263b8641943830d639e30f866cbf38aa6ad81946b6f9230b8e2d2cb5c6f8cdcb2a6c5c767a5559cf68cfac7aa839f571dac0e82ded75abd5a1dfc2a25ef6dc550ad88c55ad117a53872ffefa345f57b5bf08b52dcfe49b6e8afe0477322a41ecae6b4b2768f81eeb1af36eb9c734e0eca52299db47a9ddf7f55c730e6738751a65ca97fa7a035e7b6ddbd6848644ab5802018e3e67010f43c0b82a047c137c6665f2c4504fd854215d03eeff3fe46d60fb200e83d68bfd924ba8f2213f137e61cc9d6ea43b5327f8a07541431f3d003b3b2d61ab485d66e1ac38e486bade0e7d5aac7b02376999bb4d2b15677ea5f6badb5babb17faf1dcddbf5ae9dcf1e8488933a5c4c9437986e731c07e95c94babb1130e479a3992c4512b1d4bd103415a54f820ad8379aba7152b4a21d26ced4bc7bcf5981160a5f956bc95c3081af556af26dd6eb29f0cb05ee3b0bf73bb8303878e11e66de2c8008df7b229db2282629c155d6454b8b9320b02082d08314341009acdabeed277e6951b049c4b0b9f83502213d5b8e13263a8db74c101eb545deac585073442a14a132cd141e702d286cef5894516d64c1b6b0ed185444dd1d884bfcf2d1cc03645eefc294ae044d614288a0863626627d2254a582993864a9e15eaec1a6b9a915db10a42f9d6483da2b3b9e56c680d9e2b04179b325b4b8864df75aa6ed975aa6eec99524a29dd11f5818fbe5d356ffc443c9a373a54349bc09fcda65226938db7a7bf411b11ece6f764cc3296ddaeecdf9de6cb3e9400015c441de4cd01fef7b20f1903f17bf0fb4f06be77426540319b03b43129beb3ef80ef6c0c636309be0f99fd1efc2c306f1c76b9a29957dc5beee2ceefef6b67b43ad49d20ce2bfbeff94bf61fd79a24973ef8fe579f2d01fcbe84d898a5ac11e38ec046e818baf42550ef0e2b2588b15136b48b8d46ec64de560cc33ff6fe3a32e2ecc32ff90c83e12022806c6447fa461bb15137be23f958ea203fa0efa38fbef42be841f4befabafa82e2f55563692afe3cbb439434853bff06085ac492bf3ac9fb733b993ef6d5066dc4b2af2c30afc02e94c104c21394c5a5262c8bebcc912b2e3168c004c243b9d618a9009c179c84913264072c031033c49e3f2e64408827aa6688020eddfa53e62ac43a228c0c6cf0043182094d9416ba204981035cde65301dc052c1b8d2dcd9e2228304d7973b5c64b6b0787d147263613183588252a028d66a6537b9dd4ff47d9e982b1042c0d1e34c6bd1b9b2ac384bdc92bfe26c85950cc8abb5d6ca4de85595d75cac89b5f2c63b4a5555eb9682c145f4119744e42f67595e58df38410475467c645241fcef1b7edf0ccc0a1b6b3e8de6fd4c367addf3f2fc0efa50369b4473329a2cbe56144d11158820b76430345b75fad1ad4db568369537a8d904fea93ac8acdc92ddb8bbcb6851440408fa146f43e8c579fd6ff08ca25b5f049e1113af80583d1639b9d59b5eb5de60a4fad5eb7c6f4e2fca53547114c191ea8d79ab7d835ee8fb67fda6816015f4420f7a916f09ad30d740c0a3cde0440e579a314002f1c04ed409134506fef049020f58650f5694347ef064002b0a2b01a78a192d2f90d1a3c54fa5b2c1961402e960070a297bb85475a100848c0e390c11f6c91074c64d0e5bb2903c3942c88ed7135da6603df1339be200262880e1f0a6c91e265884a933a7093a4698e8128a810521a0104245037dc8905cdc6cad90652606377d82b08292d0b2c7881df28069594aa3440c94212a40d9e30295e200ac214d5439c205853132c450c44f9f27ea2ce11383a1024644f18705353fd861c2c50961d82c5981c90d6efa7851261a2e2d3a2079c326870288498189227a9ecc691342a17a928416d80d44d89161871de26439b2c5ab4c153f7e644fc0a620a1812659ccb860c400605494a89375a70f9bb0f9828d24b82c31e20f1426498cc0e68a0b8e92392964e983431d3972c05a08631246e6c2651a1be0218a101b9841c915093869028636298cf9f2f5029d5df9363a312c818498346ff8ecfa493ec367c2be2562bddc050487262278b90b4816d6d2710056856bccd685e0721790166e78b90b4892302e038e27809ca00186405fae98d310a1012e5f451ca173552686aa3748803842cd12590b77e60c7142cb98336e5ac0c102e76983f5041461021d29d3cf60e906c806705842cb941bfc0904bc07c856a03a42060b893529b4d0e7cb97049e9d24b6c81ce955cfe31c8923495c8ecc25d1f72292e410244872cbe15871a950428724fd0879820b9218d240d1c5e27217923c342486a460854544181016beeb96af65450488982e3520997343579019822e770de1225231e8f67bece431123fd1139620291e2b279292a80cdc252409903d5108e922a2e4469239f2f3be8fc9f9b8dc57bd4ae66ad211497ae1b0789124091a21495ac35152122e09379bbcea798c4b229392489ccf24dcfcc26942a04949494945f49449eeba89e473eae6cddddbddbdeeee86fa238a47acee24724bd6aa0a72e49f7e83555555555a3b7e6ac97faf76775bf9d1b21222a7034f10b103260a2f7d41a75a5555557565c7b77e4affff0897eb6180e4b9e55f1c8a686922c4090e77c4071c4e2b09932a244c1020845801e140913a5f0f34b0305540debc31403f155112c51c1597bb92d8207363454997d50e6b5a8d9530dd60e4340f3d747be1eabf2195e4d14a755274de4a9c07385ccf36e24b77b7191ac8dc7a4c0da1160fd57814d174f77cbe543e9be987a6534a1784c8df3db9bbbbe77cefe97cefa5babb5baae7eba43c5aa9149ded3dbb3d983de79c73f697b0e76c8846635e91cec7deff68f6cc4f47ade43ffbf0b6f404a02a62734ef7a0ef20d98b70f9fbd2be654fb37c190cffc8dffdfb4866c5a1da057c446f9ccd1bed7056265d41ce707834fe9c8e0269fd4a9dd8abcf102a746173258ed78f2a1cbee6dc71a28892dd7c3267c5fb3f4222fa5834c4c425f2974375c9eb98f0d0e1614a9f3858f45c3a7ae8444125cd125e522b2e77196983a54e66b145f4e76f2f576badcff5abb556ae5cf963f6881ccc89a228fae43becec35176b5d2788019b4131a201152eec59b3220368daac5942cd952d4247d499218733377429a36606ef8bce9cfadd9f5a50dc41f42c75ff1bfe3a7f297fea551004df1b752008be078e0e3ae8e0f7a0bbeb3870f0f39c7a75eaee4e9d524aa93fc8ee742cc53745dee84123829f27734e10228b9d313fc0a0f5853ed5a537b146c5377385c89f231ebfe65f7bff9092fe39ffbf318d11cba19b4312ae1b0785f3a072b886f2bc3a94f7a473e272d3c69c3ee7f4d9c34ccae1a0705050b81c0e9783f28983226f5f449c9b1cbbe99edd465cb813771b47c7293be94876229f9dde91da4974a4660a13a526063e668650034507a5305400e9d16a020b09305ea78a3888ce41057944a951c7f44564b03e55bda193aa75d47d56ea939a4d9ff77ddff7a167a558eb93fa6ad54955d7ca4979c0ce5ed369695999b93e9f49a879e39f63aea976edda5597ebe6ef87ea3ae96c6e6fee6666ce81600e945dee42a22497bb75032cd2116b23149d7f9b2fd698bc88e5ecffddbf4b089cca24f480cad2391710c56a852c68a2bc6961373fe74e7cc4579e383994d10346a78fdcc7dbef308b684ae6fc3def73ba3297c3f346afe68dba1c54ce3f07a5f36a4e87a35fc4a43b198b7be7725c7a005d8f22ca2d735f5d9add9f9cb71ce93347e2feb20897ce769a075497ccf598346f47f336ff8b58f216081310a5949224d78618b93e962249fd84627f1f7e968e3cbce7a134bf47ed12318ce994463046c035fc7ab436ad83ee1b7a7c7dd2f914a82351bd51ccb799729809f154083d12266daab6b0c5425c513dee8f8a58b88890a3c545441c0ea43c108960138ab5092e731191450495bb35a6c73ca2c32f7d1db50a9229e508fd1edd53427e3e724a9de98d1bb389bfc913c492e530603af15cc01ccb98080ee019f3876ed7e8d197be0ebfb57ab57ab5820cc326b5d3ecca33fa2d68a7b191f8259040850a59e982328c7e3a6489e419f49bc17c0980eb3edd27dfe6d85e95315fb8a039d3a68f17223b187e88a850a70c0f35d0b0e367e63041980461dd9210d21282c94dd356b5204cca8809f2c2135949809882042684d7102d51862833c6d1b816856327dcf24a82c63958f3c7cb4a1d3c80bc3010d275e48d9d255d358079586081fdd0431ed0b398f842c3136402c9d08019601872e62b6bcf95d09cf4e79cb5cef7a741469cb53943887350e4239662918ffaf5c7e827beb82eb154baed7dcf3efcd63187cf0c847c74e7d21b3638fd87a6511fb11cba7e54549b77263ef19dfb8258329beb5fffa394becea7f74dc1bebeb4ee9c21ff46e6eea474da2f0668ca6f4975eb0ebfb50609810205daba5402e4a5638ea39834a854ce363439e990b911000000010053150000200c0c868322a150240e7461903d14000d6d8c426856329688435190c428088410630831c6100080318020a2981a321e01136e3f946740d236a4c3301551effc995d03d7c388c4f09e029d21a901e25b03e3ed8593a58ae20d7ad631f7d419298bfb103f74670d96df9296db0c5fbfd9ae2df8715a16d768ffd8f5736f493b9c6951f188b9b27eb899e804106a845b4a1b0595d2f635c494eeb6d80a129c10bf9f9c5967e5348c9e1e8169bc9dc8dab81a86b78059d6c247cf0cd39f232b993ea2401558afdcb829976c5c60a2a06b482558e305d2b12cf09fde9ccce9045355151202dfb1ecdecbe4e6876fe0ad3668fcd3c8d86bc7b4d7cbca27b6271bc58a9e07cc7b39e1efedeee4cbe8e85665ad54e9131c899b1fbe6d1632205829dd2f5bef2d8e769856102e76d3baa2035ac69c15dba95b2b31eb890290a16a4c1f6f53026c64364b0d22aa9e94545df368412f7717cc9d1a38eb38dac9aa241ee5cbbc19a6f411e666a46dee3070d1b99752024c43cd20d12f0df405b3358f41e6c8c33b951306e4ddeb9cf040c18d8b8937f800b3937a2b3270549b6858c2a2f713f2e8866e9049983671eada74fd80493fd3098188a90dd354d3de31b6899e493ac74275a09c2bbe6c1878e20531704362c0d7a3a43cdc9c36186f2e940c10452d67e7bab1bb271d46d8e88533c133e62fff440539a310a4026309a6049ce2eafeaeffe81c94484d133bb925bf7b8387c3d82cb5c093d3db546914be7a3038d56fefec8a576bb2b8321a798f11eb0344d3bf6210418709ebacaf73dbaab2af72848c1a4c1d3bfa55847476f1c99563fbfb21a0a3757f7d41424c6abebbbe942d0669f07726fba98983954fad0c91de0e8d342b9e7a5b2126bacc4822f0af5ca5387ccc34c32f93422019c7a31186dab2616817bb98526003396c2178662cfcb766cee5efca4012333580a4a8e8a1c804874043c1807dae320b8b7fe242cb7bb276a8965b206f13389bc194df2acd052e5078497034eb2e8257b249bb3f9ac11f24a28625b225e4d7a5fa0bc6ac3140c8fac8bfb1b4a8b8b08833b978b7c234112e275618b5bc9e1eb7f87239f0a2e75ce5071af59600fc94a5d56e0e9d2ac6957b061db96da0ae004a0aafe414923e82830b4d40758eb3afd00dbf77e312fd31d35fd305ccaebc6308d4c46ee7a4bd4614f142d1c1c1e2e4f78fabcc1af194fe736f1bc130cd621d955d1b9dc6ae09e3efce321ef34d527e2450166e6822b15654f7542f4fc860b046dc9ab2649ddc70a797cd6d5d1e49eebb5fd972a0193c63238a1c971c5f04496247d6e2e9da361a1a0d85e65f23e24260d9071748f0cad967cf7e5f43e5c1a44665ee45f65d9b621ceccc579460e961be2f10407ab70be952d0987bd4a3968fd04dbb313bd6393be39b9d289642b84a3682c63b04d03ad311deaba08c7604fab3ceb4044b947d035170f645c4f6c6e1846ac284692eda5357b936d2bd7931ab9b5e9067b4181bb1faf150052c631537a8cdeb06efb1da1c3c7d018df2e747d245859c203fb8b23f93967ee104beee58be8cb2f7c2775afc0316fb366e78dbc0a575029153e70f7e77ef8586202e9dc3082a4cf966eb7d73c0e9f7e64eb363dab1b9fb85d7c87e392bedb67e638ebb18e15f66b32397b9a077c8032962853693406926d52524e0277689b3507c7d7085ee0ccbd8f4fec3186fc5d17d10c36a6e464c9fa15e0187dac59526a61d5bb037028948e6d8ef4bccc8806d9e0197c380a6993346fece10e1792006f8ff03a5760ac017d6a93cc110c8004cca909a07a691b1cb149723a766552ff30f447d91dee7dfec1e3e470449d215e6491f77ebbad4e2901e7a20d24354693a43d4a48cb32486588c5494b1f5ff4af7683dc772ffaa30f0d74f2d6ad53deda0e84802b7522d92caafd0c4a5d3202ccd25d580a8a69bfbe36bbc557c94d4138e66e3e171780536dbf94fbb24d5e0f2c5a6c26eed976c2ab50842eaa733d7ec68350f84a343d34c725384be634790b1e93a1737ac001b17f92969733535d5ba0a7f385baa94b5df0dc263fab3f53bff7a164112014f79e86a0f45059fb39edf4cff1402f34e85a77a0832c86c2a726dd00484d2775e3520a0bcb4ac9aa590fe3ef71ad424c9504b739e838bd748bf0340f5526974436a87df59babfc714aaabcfec73d8b0174167bf6a8855b39dc88da86213d92c6b2c74ee8553dbc1a38fc86c58750aa20d129dad79149929311a01b8d95565d32e9449113ef66c25d8c1051bd4e8299c16f55ea0ac9d5d0c64e01ddbdf3969417b0624c11c3629cbe70ef6715bc42cc92f1adae8d9c2322cf9ef079951360884ebead65981c1d675e31e81ff4e85e97c84f21088066f94fe96a1038bfe584f417924f6f31c9a633e9455e750072bd72aabd31a1e6e96b97a30357c4dad45353451630dbbd561df4025adfbb581d432df33bc327e42eb2b05f47ebac25b654edf4917d7b5487698faf7a31ee8fca50e77815ca0792ebfe2db1b5412d87b0d05aa0af506016549e0b52ff1ca0eaf53b92b6bb1092379312b590bca4f464c6cca430a053b4e20cde4785a6a0bfd6eed1178178c03055e2729b491614f38e834ef91df0ebcae516c6c53d07dfb33de6da79eb93d27cfcc32c59428b2060bb01f4bf798d19a684261d8ca027c86f43212be78be06c02628a287d0088fc81e5ad2fb08bf44c81ca5f0505115aacd17c206b564154fe82dc9001abf07ca169b31298f71f14e749ffda172b13b8be806ba1c7667a8c3e22d1edda77ef8458308eac4cdf48d286ae33a6e0fa6e31091217d856dfb487042686a11c72b8a7fe4d27b4681120bd435f611cc1498bd94e89eef875e9e9f01aca86e5d49c62f2af10d8cc184c4c57286a8762eddc052a06ccde495b928875f9bbf2c16fb84815b333bcb902f53314b25b8d29206fd87ae10ed19b74d5c4d8b9c56a3f3ba1ae8382869ef1ab7860a4a4108025acd891ca43dd1a6c0423e3cce378246c284a96a9c6035a0ea0de5d4aa39eacba23088024dc37cda9870e6ddafa10c696a860c0bf214f3daa96fe6bc56796926f08a2c458707e43635f6e11473abc25622c54ef7198d0cd94d983e4b6f442f7234d1af9d6bbb3f31095f13e63d0d4220a3374652da0c320e81b40de717b55da9055d1e75eb4d09e983684cd00506fe65649852687eea258c722bf963aa02e800792d93347051294f89cbbc73c2235076d0f1f6ba268695131af89f4d5a4c9e7884353033890437e8149abc4f9a6523e93490b1176b3e383ebbd74cdcbd067785281bf8b236e8ac5078fe9e9ce9c4293b838e41b1131e22f929040017ea830f15c02249013801c746ade797f5758d59215e44938691ace887a06a6eeab08441ab9ff69366aabfdc722d79fcad94776ed3578035545383c67855bb5a03661db499e1878d6e14db59c719551a991543b6728c8ad1addb069df27d739179aa5c42af820169b63dd66d33df76320f016bcd15763e6069399a095f6294a25fc09dba378324545431c6f5d9f32227431c1c0a39dbd346e9cdd5e4f5cd5b48a955981c00dae0f3e5b0dfbce5b9fd3d331cc11615374aecf9a2685b506fc326be9c8fc7ed336142dd451052cf477ff28b1ed78fd2beb0cf293956613764ef9acdd2e03fc12d9586e92e612b37e273afda4c8388687ed804a2e19638aee3867224b15248f0eeb94e33dd57adb792a5f9d79c0d71a25ec568d42e70580468e7955d4818be50e79193551868b71fe0f32756ca66cdb1a8d18e4932e539f21685f2c1f085b5d6bad17a033789e709e3c934ffda5a1b29614dd9252c640f217818b0087bfeab6d4d2c85ddc471f30eed476d6177706541e6ac1042165d182aa85eb8a43acd1df16e45d711670a70de34ce2f6fa88ed6db2cf5e99853d8f9d3694d599a2a977cb583f30c2d0a250b0eadf57928e625b6186c8434bdd14415d14e4ae85a952c6dfc2fab7518dca310e10b702892cb02b0681a12d33884e589ccea438403ad033dcdf36c5b8b00fb73366d9ed9186e84aa55d23c779bca4c2183620f07818acc88f558428558adc30a448c6d54f2ca138cdfcd2ce273755a7fe49c28eaa44501672423edd691c4b9af9adc997ccebfd51eaa0b26e77c4762afbf59a81ff8344acbcab1814a0dc5041f7c44ef900ee4d4ef628e537c1a47f5bf5aa7395c7c80219356a1debeb9e8c3d2d8de6acc8c809e2017383a5c8809a6e944de4ff9fb0f3c4e22682b4361074da148137be0e8dd0e4db73387c9269cffc4104cec446163477a8d22116d453af080265a060326a28d48e1601e9f95859e43bde1b5ba00c160481b05042d1c13659c2f64c9463fa40c58fd43f520350149c22605d6a47bb870f853022e37b3c31b8f03a09a01d4b0b0faa99bf0d4cb07e2fc49e233ef8c6948af1d4d5023be4e4dcf1955618bf44eaf25581d7ce744ca5bcc16fb829948e316937bfe12babf2c2592369ed9d0af78e45256a6cd2e8239eba16b5314457cdb0452dcbe1de725ad206ad3de004e93ddef0bee85d3c1750b211419546d593358ffa34f2393b069e2b275aa367006426f3d9296a2c1b82c3262dffaa2409434e1fe104f18c70f44be20b86c3dd6751b18d69368551b7d53dd6f49eabee50053a580ea1559d781a8f1bc05e7d11082d5bfbe0cf22c5e654136b16d8924996cb874e6a0c14ead42ad3baffc48be913e0dd2d85c4c8b2d25a45c4a8e9f7cdf8b25f1283945f039173e0f8c68bf2a9115403210fe04c9a05bbdec62f8b2bb1385c778f48cc9980b1f0ad7c46f9782238a9de72fcbec49496f6a6630ee3bc120393c884b7c45485f37bde4e25f23314f1c903570f0945901d9ba194f2271a6f769808e46643441ab765c033a905b45d8ee6d42ab35c741a8dce6c00216d140ee781b5ae2a680892c4510663fbabfdffe3b1dd21e1766cebc19687914a286136ef25d94bef992e108d14f173cacf5f18f31bbfa63681bbb72fa4d26ea03eb8e8939b2cb39f64bbaa4ee6633f1eb369a7476571c8b4a6921d281b50640df9460f62643d4051a0eaffac9a788557e223184fa5867c3eb5a89c45bb670b1b0843120fb4ca46fd338719d883a7aa243903a351328cd1b55cede70c110991c763216634dc4c0da530a5264021fc7a39562f43811f49fa6aa034866868dfcf2d4bf0cd11a701b80d0c0307495d89cb34d03f76b37dc2a5d1f02d61377f1e4502bdcd9e470139971883b3129ec0781cfe1260201dc118d11b6f78eec9c3c5228879f030340a3af04ab2489398fe2f587cc8a509b8dc0824ba42e701269d263b94c138b86f7b8a56282e920dcff490007347aa765a1c038380b0121400c9dd40312fcd7ae1b69e84a2af1b0165f05d39e6d1ff4cb6d97039d7269af8576950c73dcc182f110266846719a84dc2b00129cad3c3f8930750aebc53308238301b76d1aed65701eaeda1af4a1b89521baf64713a637b90ca4b70de9c941b5faa8f99c17120962dc489443693bd77b86bf4a4104562262d2067367e523631d003f0cffd599d7c31e2fa210311ce68f62a3f2c56f766cd7f9a2b816592b98df58046dc7d90fdfbd49411a89ca49ef8f7d780cc1962649cd99c8cf1eca47c7c568e0b258c1f2a2b55df480c6b1502797bcf77095612c02de0bd0770fc23a040c968b3639a77dbe417aa3d127467a413f789897487c2c0eae07b01fba20f4d160c2f5111730a430576857815810899a904ea2b22d9e13e4d5914518cb5c50ca6049b157250fc0ed15d0f9e005bc12185acad37947e3e5377029b4a7436ef004224b58ca5f2b8f08c5f1703af892d20b05900420c9cde6520832cffff88c494b8dcda77dd9e09679fdbaac41faaa48eff7546e25423d15f2c9905cc87fcb3a28f52b768556e63bb9f523a02f7e2ac15acb80b7703ccb1cf02afd8a22715e58b8463ad11fdd6020709d5bcea7ecc970967b65739b23479200b100267d4959a298006b43ff61a0364624b0dc1e6238f563ca7a47286166532a25eab39c34866ce8ca38634d3ae4278fe1a7d1c2584499ca0efc673470a0848962dad2be370971f17b46c7a0ba0c6b0d63d73eecdc2e978849d50f06d305862eb9b093abce7722c0afb4e0a78e80de3d342fe9fe13ecaf3ab15ae3e3c38fcc22b36757b2eec924be3cdf423c71b3c999ca1d6b4c420c1d61681a2bd6e53441ca7ab8f5377fd48829b5c33e188b78297c66535a868401458b639476f1065971e6d06009bbe4b4eb8293be53cdb613b392e71521d37d7aac12cdde5d6dc6b900439576daa92fb965c5097f4c2c9d3043670e5843fc5ff487922ec8b2403bcff3f1105152ae389e2f8fb34ccbceb93ad38e66b7d3e999a86eb7c763e8c0fd78f040fb7fb38e2d27171afcb81d08efd2f3875319c0a85142ec38bf509d20999fbd3b98445bb27ece81cc96dac062c084bda53891f829f21912e6adeb87a18ee72de57a455737b0d152aff7c12998a94d6eef459797b27e1ccd95bb7a971e0691ce4811bf41b16e5710a6b14114068c3828a393858c185ca2e6b20b19443529c03473bc06a4bcaa092dfcff2dc7003d5ee26614c3c18e29ae47821a3b36d6cddc2688fa6a27237061c31002e827f33fafae6b2def8f328fcd4f58e5ffe8c092390a6d6d6b1b5d48376cc0bec792e88ed3a4f785c7ce56f85abd18bcab67de1ff80baf5cf984decc7119de0bcd2988a4d0d592260387d927aa38ca48596c3adddf10471c4acb0f6eeb2b7629987853f51b9d6efb9ec5019d694e3b400fd62f18248e506d0fea440dd38872d532688a8abf85cdae436760e0e0b8a7b042029893ed0ac6a5c539e08f6a85f19153e9bbfabd05a34f532521c3c2ed9197fbff105c688d86f802e5d9164a062b954e49292ee949bcf8d24de923e019d90d293723191bb71ee8a7760d6a2d34039bbd53cd9f5848a01b42142b7f162b2203a2cffa77a93fc92507f523d669ebea9ef257458478218b4bd5f996b39acc8cf30bb50211d179a147c290592d5c90a175c01c7726ec9f944df31d29d65ab4bea0d23708498080a165aa337b5ab90d87da33da0b15a211d7a916ddf80ce477f32e2b8fab9a2683e8a085befa0587b6c4037ee514b47cb97e99011dd82a44f9717d7992dcbc31e8f9a648bc06730f45777965efb50cc5baa5b4ed8580e6fee02a182b21524af8f04c811e85308014f9367f87eb1ac0661a7b12f965dbd16374b2087b1cb8247de0285bf8cf731dba6f46c42befbbb3d07157be79fc0a058b1689fd387023b44d5c720d6e695b12b92df4db62f66e311bc6e19271068098e2649119407c734c6f03e0b6ab82dcac85a8931f861963c0fda2a5b298a0e348a3d58f9ae0a90e22deb394fe2447f124fa99f75d68e9f4cb9a3766f29a27c671746e061b7484b52ccb38f86a0f51d4f2284556f75039a4bcc2176b8269cffd6b8e1fb954d718e9bb186fce8df13a1ca616a5dea8d4a7b7d3eb4e0ac1fe7d79866bb13108328aa480b15bcf26abb23af16746832e381e724658aeb788a7b0673961044ae66b14e8fa3af3f075016d4f661abbdfc586467a8f8e83160ccf119aa085f642fa6ec8c2f4b81454b75c3f5e39e62e0ddd9b21fb2157d4cc629f982d35500d4b564de43a72da2f1c60b620a9eef0756de246ab341501cb3bb6e1ee6eac2c1006ec968fea524530d2cf912098455865ea253d85d1df801ddb0a0b041354bc50c1af6e1f94945d7c150a6419ad421e70d8f20f351d658d0ab8f16eb2aafd49130ac6f20c5d8b6dd253cbf51117cd35a760be76e42c90df2f1eb941fb13c4e749ff5440a3c42ac1ecafcaed609375f006afd6ef80c0ccc4c2f4f1846dda808c7e865f3fbe20990c2c6ace1ed427fcfd3fd001d527f7ada19a46be6a4e8d9a193bb2ea62a42dc76921c2fdcd1aff25d39262aedc49e8e126118b1c35ac19d03ed70e850e784e2ce66d5d14727e9ac6b55bde3400be123145aec6e136ea47e10bde174cd3c8c09483aa5ad92c87543a990a56116a8e434d0213cc17ba53f3a1b3066496a5d453957f609280dea162342853dd9afa7a18e4433cb0b968149cd5b12da89cfadf1fdf7d42471251305301ee57cc1c175cfd167c2a58a5ba331c98163a3ac0cf2b06a013bdb55f3d699404c767491c48cd688a6b38ab690428bf0596328c683d7ee2f08eaae1cbc1f953230d40ee813265dd6685628e66527cc3ff8226bbe8ea02134d9644b054c851507041cd198a390e29eba5d974b0982591b9db7ec30333d9c8b509ddf8bd0579b1736d422c9a5cd5538d595096268c8732329f67ada3a93adc8867bd5916f2ffbf04015c9046ebd126d7660376892818c1f486165c7fde0766f0efb73ac5afb1d6996feb0e2d1fe8d580cef9cd0f54be2f191ee68370e1e8772783f736924d9b8613d529de8a056541b95342119e6ce3bca0fce55362a816d3d146889367790c02f36dd41b1ddc8c89e44059163ad104a927c29d03e9ce549c65611d27261076ef52b18a3ec6b0ba85f142e8a2259736e3c22b7d29ae831caf998239fe0df97dd5ccd0f654b7550775bb3610a4d29c6302a082a8736825a305d95988c8064f03041849a6bc83d0607feae52def9a269cdcc44e2da8aa9838ae0f0ec0b01964b6f47c602f247f08b9e6697528f47efef044bdad99e467f50fec1546ec8c75ccf9b60e1d2338c8a39a1fc6dc466ce6213ce66ef10fb6cd226190120208eaa8fc043c1afbaf74d752e6797317f756d79737075c5b4cd17ba126dc3256d6691f4d28c094c73048330c33720b024a008b8e56f51aa246ad2ef33b114bfa9d734b05e4f47d9756d9fd6c8037a8f620cf59e27497a2ddc101afa42bc8861a09d374c3d710e26566f965d6d69149782beb006b1f293c1540cecc99236cd70ec45c21dcad967aa4056b44a85350651ddc7038dec48acb7739e8f93e976e39689c60378db31c48845b2ee0c287c99a1d183a322b59d58a1306490185e8b2df41d60df4e91b6e72ca4d757aff4f385ab12c7b304ccedd6e7a112705ef9a1ca7ab8c9ee68844d3422c3a12c16ad43b341ef84d9e04b0070633e23b9b3d99e3747b15957fceb4d911a9e283cda9030f063023c68bdd555c5064d6d5485f33b61ba3d905d549b61d8b5100e64d6c572cf9d38891d022d8544008e8c4dcc7c321c862566d540709530ec17ee0f382a0695afbe5c3a3cdc1110c55d91db326e853318810bcc1986c83a270d08a70aaa1370c8a331530ada335a36f2f811fee72bb3fae041aad9135156c3fce683db300c53c2b8265461e67667cb5b319512f019b5e31f3415b5ca46b2c2ed5295148220ebd7d8139b7a12976c88bc372f302e8147048a7172bc61abaa662abe04e37904b42d22f1e4fa92d25f348a453cb315c7047b195316f3fc9d019bdc2152fc06b863ff4c6807d87cc1892df46d84fe812dd445d71bec8a24fc27aceb93600c20bbc668f7ef3c8095611d4718c0fab9900d60521f3752c80eee3f098015a4e0df6f22d5160dc81618dc1d931e281cd4ab10018cdf70c890d1dc13a9329e71e7f1c3067c94d1e6a34f3fe1f0723c7c5c571895dfa844c20cb837cd6d70fbc8d5a994d34757454366ad6a22f72755886676d0d2da30c68939c2a0853c788ad4ee3d428c7412f7394e51aa80b717330e17054f160817e3f4870e09b511e8dea0ce788d59dc3f97806217221f26085a9390a45d539a9e6180c65224743c6ff1c33d1a32dd03cc3ec8a54e808a8226439625ee8583320824a42f93bb8fa1349344d630d3d2a4caa5f62683150a546e5cb5fd0db85041e9899ef5ab44203aa36758e49e346f598651a47b63296a0f95e1f7747c24115163f2074e03f03e4da1212d02a8cb86d4202583cf8a4afb031d1383d27e600c77df44ff210850041edd7a58be45bc944f7e2d88479e2d72b35a9afa6671856e634ab8dbae6d1f4a44579c8220fddecee3369ef576995b76d6d39719053648df8a27f53af0bee7409bb4dd9397559dc7d2e69511d39c0cf34470dbf02f26719762c7111b9e57f3e3280b701bcb436017a7518e720aa598fd1ade7857413f32185bebe41470bc1bc3dc53536c0be2d96a55135ccd1e767b58a38c5d8465272cc0ec22d2557796c8408ada28da3622a822ddef6cc4618aaceb337b11fb659e4cf7c25c6561e881c405af11eca5fb5005f3aacad6fd6a108406380a73f957dfee34e71d859cf254372d8a8af41b0b1601b234a45fc64a65ffa1e9a47a1faf368618ea5adb8728737b2e50228c647abbbfcea3d340d295ad6335f10b60e21dd8d25c18b787d492eda744483bf5f4b7ff4c56dd661afbb9fe02cc0a42009bfb1f5c017b8b098adb9940fd89c3a33f9d27d343412985bd210d4e1fc665069f0e5a23c69f91361ce0bcab756be91b6fe194c1721ec9369ca87420632df11b4a94c20ec2d8067bda545dc2cc46f33c15f9d2b38db7ba09efd3c0440319e7a0153703a9a1ed275b98c5ec6c343c2a7b67ba436e1598cfbd525012d7231c184b0343c0ae112156b9c5c47f822eef847c66aaecf91dcfae37028412b8114a2e9a7ed645b9e8b89b1b0f37c6d6c906d89ecd1901ad218b9902f6b94cc53007d455d3b7b82a0b96a27400b78b79ff4e5588e18fdf2eb08b8515787ae83fa82b29dd655c81bb154bf66d3e32ba678ec98a4689965203776548da309c990417c05e65e0866b8028ef4f12de6c53addbaa90439da5e236bb00a5e337f2aabe9b972204df415028a1720330bbd9ef57395d28305767d2904db41cb3e4c0fdceab47f7924ce020a238308647f601f51ce8183d70ce5ce32efae790a277775914c9963863cbe8da1251fbbd66c80ee46f2c71885a4e308246229b9764816661a1f2c2b18f09bb7010c82a6260def4de2004ea6c405c0ba8c2c074c1d07490e276a5eb66d72dfbc526c2c019552cb4402c07a77a4c6a050441cd892cd82bd91a634b83a3ff7d4499a4c230c654e1c1f7a17b9dee1bfdbb283533a75b44970d0eeff5c13acac91167b85d86eebd35e54e7d253a99620825100fb38b3841aabda70336c654f87cbead6f66274041e9f2656ca7faf0e4264968143c58877b30dfc37de7fa27538e80172fea1b0ecfe2b915cd717e347aec2031738f621755feea81c80b0e8427e775228913baca1de8e484bb8a2d17acac37979ab329f0b8459dc388ad606b8317d3d310e69e3db15b42f53f492e54bf699f02d0caf916d769a30b111242c9e82dbcb9e2c0a579b3dcc02f45d60e1a11c893ba829020130ea1d3410b2d8de64f723b91970e24fdbd3f231b45da9c2b6e542876995e5711dbd1f49f94dbc3054d8f3eae708e354329277f8288fd13c57a86f47e8654dccc2a3f769ec860bb047dd41732b3e986af53fc6c60e6a70f185db2f6188c21c1a972465409507f65acf9f4812c4edc0098ea6b679670b6399b3e6aa3d5c99172650151dc78814d78eb23c713c06568b81416dcefed4a5bce37cc090a0e1acfa04b0ae8e224715c79dc3f453562e84b701920d437dd99d6c9b52fba79fae3a8675542911acbf523e241a42831294b03a587860d98013b627c1780c77c83be18bad284e3fcf3f9c9f19c18c37bf02e1fde6f66f20b653a547450ed03737284f39c6b3e834919af6569e3ed6c575aafafbcebd812c72f0241e35c83a6c5fc6ce5153301ff556a821de49bcefdf1c33b7a282bfe7f644e74f80cfa9335cc5f8b3c882ccff6b6ad324be01143b62ac4e749f2c00cd0b9423e5dd95133d8b955f031fe67050d1f70f563c9ff4c7124d7cbe8accefcafdc38f1f32970ed985e124ad3b9b67a68c9350add2fdbf68d92201aca379d12d3dd797273f9daaec45fea323416d3848375811dfac56b04a7e40fc4584c277e5f9774039876467b8b60943af7808da07fc21d88f44455a39db483020e7040d633ca94a33c81f54c8c0dfe4563a43b87e0d0a9dbf34c00fa42c76ad6fcd395dbf337911c691d5a3decc77af4006ec2f7897115ee7a17ad4729265b60414b75a9c966f8e0b2647e2d8ee916ce7dad603d3863ffbde976454af39a35a69d040075c4d4a5b946f352209730a9975a017c173be1a0b3a8f2c613e8d62292192d1f69938aece47729e2c8a628e706d6bcd41da44843877679d5e7ed49cd0f49144962805c360e720176883efbcf40a00d783d6dba52bc7511fc72202e08838985c5a42a94709b16b67718248fcebb92feccfebcc4d1fb4845f408da1818bd9357e991baf449e33516de72e1029b7ba3cbcbe9c54b4f30fa18ca998c64793f0ca317322a5a1c95b0c655988ae41a93d71b7713ba59989fbd306bd894c828b0c9035c4494a35a28e459f2c0ad15465ab71795a1544d3aa14ba5637e253e60cdc9f35e8c65a827b9635cee3821d3bd5ca5828e0197c47661716d344f0d81856897ad0aa104da512322de3f2b0c238a9324d3862c54e6b01b48a82498cc78735f19ca8c0702f35d4d6a8a9ed4d9f1608272bd78058431248dc59740fca1c1b1d66a483478eeb6c0ec05d5e11960e95070b62ca3ba10238fb4c446cfa26d09807c1fb017b16e7dd7dc31d06c933f19ddadb1db25b17b7ab6ab3f3149efc7dead18cfe152c6d0c838fea6701de619c3ad8a0e20de27e9ef2f3dd718ff2ad90ea3c9c65540341e6308ba9a6907fa796487b70cfa6c6066289b8133c7d6b0a54e78a65c873bef015abdc4da9d23b7993f523670ddfd559052ddf35f92de70382de5f0a0dbe0152a9f806fccffac2cac018a285fede90a4731150ea678fe8986c68b49454d883ffd50510b13b0100a49d43b5f476256466eb2e99213b46e2378ed99637119787c98c4d8e454fd5a2b1bb3f3cc5cbd281db0f98aa5436549b8b4d452c45e1018f06a7b7870ab86b9cde8c2019be51162b118850df95380fced6ff92c9d9d60893254416a84ab96e1dd7e053f655bf883a3ce41ba5f8d116902961729e8dae063afba1ece1a63c4493cd4745964234fb21609ed538fb61726e64cc0ca3706e7cb57c9929022a0843396996367e24f20d20954ebf304f1d76e7c37f7df7334de7573272f975e4e95a089bd7ea5a4882c4f1222cb7f28168da73982a28ab4ec4d068ba8880292a8a6a378340e1097b009f0aae46cab7d9329e4455d8023fbe2e18a73cf527242a09a1314d180c8616b2473958b991d486dcfbb9733d66c2d5f1da40722b7870ccdc10a16004f934d290569920b8d1e37142797cff330e03ae48147c822b67b0e05909a14567fdfe46979d25cdb7b3b8b3a13b013b21d96d988fe4edf1432d4c262d63b27dece90eb4fda0fafdf53db97c0b18d54b18384be41afd49a23efd1862aad9a913dd273ff7a92ca2302e85fa6e7ac2a1ed4cdffa7e2b04c26ac788d1fee72cae0b8a46ab3239ffad16d55f11440e30532f5ec39758fb86d17ae65aeacb32068f27c9a03b2978f57350881e2e5deec10f6a82eaf18aa961dd55aeba275014594936e359049973930d000b0f98ad44781102464c9c9706dc3692992d42b4720d4ef9471937fd5d0422531b342164299516d984b9351533f2cbaa22c186df85a6d025fd0b77bdfddcf9d7d52e38bbe360d3d116d22a1e2abf45f95a9ffc36e5b33d2e904c251b5e616360c42d97a39731f9034c40c8dbe9a04a164866dbacf6c7962ef91ae7eb0ad2e080f25d329cc2867076a2bcd5b47b7b5d751106931c9f53acc607a491de7a057b41ed307a28e793a6087ef4516cc3fcf427a275e044f1d82b794a1bca99b9ee005c9f7f000fc718521dbd131bd9310fb659cda6dfd5f50e0840f3c8b03be4a24969e537c9cd32e697de4de1b0de9e3ecbfdb207ec7f878a0b72f303cbc801d147ed81357108e1a27480ba3e2cee663ee46f1b77403a71203ab515d1798ee30095b2267bb332a708f5a231b55916f1d06a9af448ca1ac240cbdd467eb6a4fce5da007b37e9b00920a51505e986ceb45c3574fb6790429cfe0d8d294e7ccf02e557a0e6aae72afe3f781495f46261b85b16e8b075444807e2b8e26ac31185c61a0cf9d19cb3fbf8a936b875983332145af9bcabd5c1d0ea18c481654301f55a3092dff8217f55edb6b383748b0dc4aea6a245df51adaa59830036bcd7eee4b9f35b68dc0f9d2a1383d8495079d898007cd9782f5148177f6fd940a505ef50a3223ac5e920aa2b9ab20ff2249c69669c32eb6128856e577081204f740f725472d4e08d3671a243003683c07293b5efa59c94e6ef62cb2e261b444bfe31f9c7c4849d610ab1a8042c5220d6a5c53876c003d349f11eccdf9eabec1806164169ce519652e77e81b4024b952babd63676333e8cda6526bb98fb4862690a98249651341de2459523e9e480c3ff1a8780598bc4016679001b9069aecd12407ad033242cf85ba05a28058d0cc804e46bc0fc36f1b1ade00ce53183c808aaa98505aa766d98977a24c401ee452836b194c44f79c4ad9b9832e304c8f0ea6dc62e512ea3f96d9667262e4a8163c9a94a4be0dc806de5c1327d1bac8857dde2eb93f6e73b8a974877c01a0eb0e8a2116cc986f4df63c83386eb68c84e19cab55ac10f25f7122acbc8cf343ee191161cc563f5a780f67ba272ffa45f78e36a56a9ab030a1ed4369cc8e7f244b7c8a46500f861e194ddf3f5af30d8681994a40804596dc677d9dff50676ab8e712e9e3fe45ea1de627f130e60efca429229971bcf7b07211bf33c41fe86f1ff0a5574494b85bc08bcb8247e88db881ee83e09b8231494c3f5ff9017e506f88a0840fb2eb1d987a07eb0222ad75129823bbddcbaff7455739236cf00ad50adb7d0577876cdf3a21bf5cf47035f363c633947deabd3ce29f9b533cbb6202c567cef79fe1b4c16153ff01a3be51ea27663d166cb9d17e8d71c8655228b9eece14b291766bd2a472ea17e8d9afb5a1dd71649d1af87a95e7a668e4c646fb9bb3e73ac521dc81d58107543fe8134cb2e1de1d3d0d9c56192e29e8c7ad8a0d46cb0f3fdb662ec5d701c449edee4c95a84827349d704fc1c3efea0205d090122a7bb51dfe64854a69994f6a9ae2e4f8359fd0c2992676d585f314a9b84faa9a06acc2487862730022b4c4858d46ef6e61471be858a7dd64871a6ee5ef1d53b9784438a2724cf464fa7065cdac7990180755c83577e94e452b91e858322f9dcc893052a3f805cf6f403f0e46d8f8cbe2dc2927970711df54de6623c1a3329ca4a9c6053116cf00c7e2d0d865f2bea9e941eaf2caad551846b47e9abdde7099e623f51a5ab21bc014e19a8936b56dda4988c32e37cb10aec8ebca52d33eecbe55db2aaab9df6fd14fa35afc368db8f493927d9b5cdd4a6a84881e4469a53aebe5f976f94dcc9f70e1226e6e933e89d007638a82ea17be45d9832e24f6a3288e59513bddf5b2c76c86822b05a9c8336f7ffa51f1fa5fd11ea675a083af38139e506cb4ccb257d862b0ffa0c85bd08ab23a80ff0c31cf8ebbd6d251e95ff991ce3913c7a300d6a690c4a02505a4f81bcff03e69b72f1e78b300a19ce7da56ea1d112aca8df3607508833141854dd17b98427c7495e491c821204e3cef2bfac2f6eae6faa61561e115c385a43a017f6644ee0bd37efe1aa667b7526d03f20df6e875a4468036ab5eaaf196d06dcf994c627f5d573f2d5670eea2b3462295686b6c9b9301bc38aeeabb5f2148de8fce0964c90957ce16783b5ba3445046bdfc55b43f00d336ce807af211b0f08320d1b9a0bf1aec4f738f852956cebf53d8036c0fbed9847050d06e1fd360a7f2c5639f20935f26aa72412213907459e4a6bba0511b33f3f3686b92fb63cdc7193ae319ce77d2feae5220dd6fcbb47481328ff0d518dc66001a77fb26f2fae466f3b6784ff0b7b26c271a8184aae45e28fc031b90556d4ec72dc345229a2e972dec4f61e4f368dfc8bb8eee1b27092b488b271284b9416712b80ccc519fe6f599d81e0e4f1e4199ac880018a25f5dfaaf8c3a9060cdc1d30e469eda13f60e87367ede5adfdeb9dbbfb4aef14497e0a61b52e23ce06bddf12435b692017d60a578e24d0e423201549136a54f9efe4a999ffc848f3185aed76be8d2588439e47aaa84017ddaffd465a9a4ce34fe5c4910386b05844e4043c3d018d43577a0fc52c9410356da0df216c529d4e04e986265b317b625b059c21b999c6879840cc799aa1b038cd9044e3f51c30c2d98bfae8a890c2b039a695afd0b9e49e529947cd5cd5ab279958569c2116f261b02b0f8804477647b7d633b4a30e523689ae7d7a49130d6145f407e600373ee0ecbb9770c00ced268e746ab90487e4a4c54467eda9ae230531efc7ff4379ac1ff522a02c4c5dc0c8ab3fe23e27f9101e60944855d28bd3e0fa10da087de22414799c50d31108222034b276d8464408bec5682c70da995e6f595ed7f4cd412aab92339698b7c6c24a1f6d80bdc19363f643d106d5790990cbb1f487c61c59016113db15d5f7b02e5417896f743800982124644d8d18d6614cf44ab581c84628c3741c3819b6c6023fe15168f68685110c6beb59e8d243d66b12cac715a493ae300395e766b819fcb7ca27115ab82ad1e93a76c02a59124666200eb1a1672dc5b092c3f39b7a04f1d9cbd0a2ee2b466b0dd7510679f0e46721dfc11d268863cd50b7062c963564de92f460f5aa41ca3b32fdb8bb6af5027b7297b898ee315ba5634ba84630164a416be3250887e41faece44da8b8d19033fcf27e1eea20353d4aaa6540a32b227903f603a04666ec74b0efff437e1b37ceb7e98339151fbdf5d29d77f2569bae077f03c3b5087b88ab7b58de9d1760aa25f358451b70f67dea0c51071fcf07a45218fc1ef4ae064d68850e995fb987fe57b6372f6584a5e79137ff67e9d24e4d6d9b9b9ebffe8ffd3420e83024442ae2f7fa8d1f916c515d69b0060697e6bc5095513c51500e45320f6b5a38e87e0c358d4908c2c98a03118c9b2c0dc0516826424ad7d00d1e64c09a8f2bade4210d56accae91364a7e684619a1f54c749f77d59c2808d115552f0f923fdde3a04422c7acce81b4c3d6d2a3ff846b19430376c902e9474a0d2ac798dd589a6e4817f958f1a96bb32c2c8cd6a5eba256c5956730110c2ac93cec14a7a64e043560ee806eca870d7c7b6d89581a1e79e07ef7f93ac4cb2b49217ab9a2976451de3a7da8ed5cd7e05c1351719dbd11c23c741437b480f81a61eb73c96ddb861a6506f116518bd3b0b08c3696ee90a64a64e08d1f807af42e9570962e4d3087261c1ca3cf7624d83ea7439011eb5013902bd3d44e627bd8e50eaf29eb5f7f130d708b514fffb363e9f1a49c8c7990d47b528e199c9bc079d6bf980eede646ba9743f70966727f217589c0fe46673a482f49915d856ac8651df4e388ce537b144f98004fccc76eaaf7554e9b228916c99f41877491959eec2773b3917c58d90d64fa905afba1bb5f40222fb65180601030d98590ce8e9a30fe77d681624a65b92b88745bcba1f46dc0ed54868a9361e70064869fdabe6a69aae743bb0ef02ccac2b36c20039ec87cf2470fc42899fa4c8eaa1c44caee41b77e5cc1b105bed85d499ce742f719edc54bb712999eda4704a034f5c93912ba62d7fb9ce48474e6bfdaa90c4d3726f31901d3bb29b9511903f176a79ca87f393ffbb8f7b6b993941017f39316e63ca250120bd2dec072fbb0ddd66d1299255643299e67a44cbe5ee78895ff328233ceaa6b97f15323be89ee7ce9b1af8c1f510d3db08ec0d9003b19fa455246d4aa0a6248584e19e5eb3f36b193ea739def1d4b3df559c00fa2618c6978cff43771e8cf141becef7f8f12f2b745e1308ae1eed80d0b9abfe901bda31a22c90fc0f71402c22f8874e57fdc80326c3f4f487d819609fd48aa7d3be1fb6a6dbc61af799906ef61b2534573ec12a860d8efc381cd2c12fcc56d20e6300797ca4d9fd373634e1c8a0d4eba006250f23208f57e4eaa1dfc9e2891ba5e2909ab78b2dda2f4d4297a1c8cfe21e35848330bf4930682336fd07bb812fa1f942a28fb830d58c1fc6719d038417b8829bbff04dcc6413bb0973ec2a9ffce14f26be6259246846cb1c6b323aa56352231a387823522a498ed6f4ee02a1fc38c15a16edee70bf575688b8e173aa63ec5f526e20c7ab7c60fd53ceed2bf16829b886bf329a823188ca63d7c50d16ab697c7ead9ec0aaf39227561ba3581060e9b21dda8a109d10f13af8e27178757d146c905f117556128a278324031b1d2fcdfacd4f774f0b869aaf27095dac4ad0c235433c93efc4a6a04a679b21c8590cb3aef6993a5243072387dee1b2fcd6a335cec47c563d372e65b1e10a1c78f68f5d1c164009f466c2f630af5f3520b930d4ed43a18b6fefb1c25c8c7f842aa406204ba72056b8135f88a58ecec2708a03eeadf1545f98e14f6406eee8f145a35569cee5c019191d854925a2b4980b6cbb251ca878266ba14850f7bcb47274883de7690f2b6bf14a809aeadfa8874cc1088984fdc26c6f43b291705f8f1b533a6d984d623e2fdb33d11038e3a347a7e5764e0ceba32586f4cad634359216f96bc4d6161617b3c6487783b41ae028d92a365e16b1d14926478d939e76d810f93fb305e7a34eb309189bc88ab699def5def70406db6980865131cb79546ef9159f9986ca411e635d4c21129a18adf249d25364519d322f2357904aeb5303720a0591e0996898efc937a32c0138d323a478599f6ea274fc1077f108104f4776da5132cd2f8e8926bfc32ff0904ae18480b44e3e39af3760b5c94c36dda70502e2dbc95746b799deb772d04acdeb035f8b5de8205530dda81e38c683e577b313595538dcdf395cc1a54c6f3a635e9e4cf692b589f8ca88efb9e2bd0d6d9f4c8be300174ea0a24b6f12fc4280c6035cdf4032132637f8d722e0c80cab4514f53ad82af2bf544b76bfe9b699aa72bc85a1cc6bba762f0bf8aa35a5890c8ae454a10a9eb60ebdf7bb1d8a40339b13bae43974c649346c1830d5118a739b8b873da352cdf6f8f9f188ccbff257940e6cf551728ada3b9ece52d45cd2398e9e260682fa4a46f1973c6804ae164343523ff1965a75cc9e853f65f349a5918cdb5b6ecbdfa5e5e0f741db8ec662d07698b5e5e4181cb082d58abfd1030cf65d8409789d3f2c5e09c7459c08d49acac6233e5d504f6481f812d68629e3b18f954eb09ec14e6f14ca8219eddda9f42c8ac2b2bf82688e5dfd04364d1b3fd9edc330acd7adfd1c95a9dcf014761ca67f2a964a07cd22041a6c9b43a0232a947a0c18ec8923d06735138a59e458dad64188060b9f453f2efa92ef4536658659e48648666d5fdf897febd23df088b668224276ce1c79bdc180a56821f90e31b8ba552c0fc46dfc4eb8b1248b57dc7cc7647c8c43b727bf975a4ce4097f1850f74779d06b5fdd3460bedd66ea4f6bc23b455182daed3bc331b3d26b2f35b53722fe12bab8d1968d78961d4186f3ef839140a82d4beab99e1afbeb9c9811d26ef6b449da8e256edfc3a43d9758ad9131a8ac3d080d8e5cce57e8aaed4add435943f3267f947a9bbfcebd8b7fc2545e0a407e2bfc4091b9b60455f45c4d8e5ae80df8501e9351e97e6c5119563e8d7c759c1637b26a1557017d31bea118184244737d1ff259893c9a45e431ccf2a1a9fe3a9a745f260d09186f231b14de823733f9c7a5be9e6003c0d711adce9858c72e757e4a9e454b46bd6d70fa7f2b1080d7e6fe6ad6063f75d9be0e75dd86d60bb208eb2ce8d0748274e16463a21428f86aedcf4f3426a6e5605b91894cb154a963ea977bd5cde8c3ad07203d4acd77f0426962cfc05f03d3266441e464367df446586ff26f1871d040a426ab98a5e6a6195895617b74f59bb3f61b5e0aa7cab5ee3f7e73200e0611a41f6085eebb9392b05a0402bbaaae5021643390f965d05b6b7b3059cce0215569d95385ab3107be5192f0a1ae1723053213df655873b3cec7b24d23f8a7475b747e1f0424dda266ec94a45d9d6f58c62d04564d09b435412c041c999b52cca88fe04a7c90116cd0d5ac20c39e49210278d9443d12fae03e3ee43a8c8bdcaa975eaa894fed6957b2429e0f59dcb28861508f904f73dd4268b86556d6501ad75f24e17b4829bb6ae99f3a0c6f158cbde3eff64372d26c3c136f8676ea16673b24a2c4b75a9da1a48513617e19d8ee4a8d9609e5a413248b1226909c93b168dc205eab3715e772c5d3bcf9dfc58d743140816a1f87055415df7686bda0ca720d4462d9feda6a5dbd87289526d72d3d20a1b625019e74f0da22d45e3af384b04c22d92be07ffc56d246bf4c675ff66562a525e2db1587ded807d964a11b4e7fb7c02f2aaf1de11ab5a804681de2daca8a9de9834a370a340b261ad66ae5d90f056c4f2c69ec77729a664f52c5b642ea600a12dbd4f0088182493b598d3a29625773f6d1faa2e397d95830c5087d4cbc824443bf4991c1c88050f88ce96f9b4b42be73ba82d3549b9eaab5f921d390ab011da33accc624cdcbaed3ab1f48d76efd5d41ccb590b217db748f582554315431bd18dcef5cc5abe75f52125606291554b68bc17626912b5f122b95a84a2cd84616144b8ea309b7981f137a9b200f5ce7fac796b39c14330e2b421b021908827c5da6abb9dcb1c30b34102013faf06d650e345521f07103855e396490063c0d183a663f02b33461b4f308f74b46667022790b21656d2cca1ad786174cbd74367f10d9afbfa68a9460d8b05eddb5a2d72f09f078855b15c8808c675bae20a7c79c9ca84af58052a9ed61106165c7b53b0cc668c91e483400bdc190c497e421efcc407cdab3e009b5c43b39f0496bda435549d2274c87938950f24447266a7125525e1aed2c49b2cc91b82df7e27d17c42acb4a8a6983fc88f58d46b7d9469ea32b445894f8e521fdb27461c7852ea353f9df4210065dd35e2d9c75a85f2e5111fc3e0278711d6141fa1e21ac0ecd1c1675a8810d0e4d6247b9f188672863e6e790f18d23f0484f63989724366fd06fcec43873502181935e4cdab08b64609cea3a2b2331a070c7c1ab6d74caf676358beb4edb96744ee336ad1283d92d1877a9b86587bec80d582dd49040b8d97c388f1d2f88b973f44d3c2492ac786146d45d3277f48ce9b225240215dc04aa63dda3d6fa380be35dae9623ee3f04360b252dca1158084de417f80662f35d36aa17e4aeb14fcea1287c97de48621979abc751eaaae7c5c85c87b8b8e162de1b32c2bb1b8ceb3013b6cf582a0c78f138708ac02f82ba5b86254a804d62e15def2ad6ca1a7b4e27e1cbaeae4ff4c0ceccdf1525ebab522761d63f73065a2b53a352291b2712f53a085a6a69ff8160598abebd0d3dcbbee356fb9c72304a5fc403b1d0866df1ac25f10a781b3f5655784f5dcac48b098f314c6eb5560a7f91ba7d88626a262c3a92e9efb3c5350b97017cf251472eda927c9e2a208578d0da0fcd369b39f6222f643323f863003198dfbb48e7ea9f57c8c9105e3df1a00924f2464e48abbc92ef8dc6e193fe1f76401fa299d85ece1bc623de68cd575adb3d81ef4fc8c897aa277c9c8113dd49df3b89c71c04b5d052033cfb58c933b4a3b1db7a102b1e61003b1c9333a22981013cf36563c8a01740bbcc3337cb3d557f56a21522459034a6e867c5d3014565107f5993a3d7ddcf6e3218e3f4d2808accdfcd8523e45aa92b329bbf97eb808f7d7d8cfe55cac888033dc770106db6d6838144cfc33784185bfdee2b544a210ea5856d0a9ca261095cb90fa64a0a6ae0421bb84bbed2d534a32d2079d078907b41b7b161e27f62c3c3f0b2cbc8dcd9179163e07c7c77e08ad66ec5b1f699b1115c66661ec15c646e22eff19346237469dbb8a704dfb30657640cc977fd94e53e1b28097c7796b78c57214cb50421b2338e278992f411b632b7c3206e7c6c73e667358f6c64f9acc97e40d8be34b568acc8863fc7036b6c28fbd8d4f616c85b6b5e3c6cb3c8fd8dbf81b2ff3aab11543d812c0a98c00eb0661ddf04fb64533e4966890f4d46c2e312fea8d8f3d8e8ff9d263461b13edc6c7c6d6e97de0185b275b030e8e8f79034c5a8ccd1942fb498b7d3973382c0e7c04da92f027edc63b2ee7442e9b410377fd6323df18a7bb4e238d07c038e3e6c6dbf46c64264a8155a3921adf2705d49d9d9d1dda0dcb3877eda4549efd55e3cb8a53b1e209c78da71959d3c5af14d9084e17ffcc88c34e77a13e66c17bc3523bb60ffd03cbf893c698b16f7dd433c6fe7197ff6b6cdcd83646ff1aa33f2c77fd65c69dd71827ed354e5acc3869342eef9046f0ce1827edb35dabd10127fd634b2a7f39b970972128b40bceb9d908b056168bf581cdc3bcf355567da64e9fa8648ba8d6f26f9883f4b5d676f9c3909599197cb6ac5593b53a10c249806a63320d0d0d3903bfffa7cce4dddd3668ba344e1a6b4eff3cbf254d8f520eb43fe6cb69dcbd9da64d2d1bd14c63f9ea55a7b0e47dea513f7b86e5576a8b651967932bb6e423b7499555196793295b72ed565bf24e8a9d4da26cc9b6db606871208bfc7974bb64c58ab034f521247180fc8052bdff2c08e2c08a706c60e4b670a71435d8b9a18b383714e1f44c0dec8029e31f84751f305f2e03223a2d87aaf33aa4ff5ea7f4e0e7e0d7f99ef43ae097beff7bd2f300bff43d0f12cef7e0f3f86ce5675a0907640a5de6d551e52f61b118625cb64abeffe120c8c2fd6832a87a3606e6060e60bc4928a0548852214a29a544454b6813244c6168eab16dcf490a81ad4914ccfa2227e7a7f24ff5be9c5fe4d838514f8ffa7e8f06bee1b59933f1fdef94fd07dacc973f6af4e12ed75dd9f5098312e6240695eeacbcd637cb41fe2d48d41f73e74dcfe32576803c9e734ed1042e82f83667147402035610f81cd4320eda0df193a3db4c2b8124128934bf1f409a1c5940f587548444e28f3d8c1144a5f468c781ea7de94bdebde0beff709f8b102ae9bd2fbd34d9b15dfdfe7b1e2291ec64cad33dd46cd27168dc45fa5c824a5058f34ba537fda48125d3f308df14da79bba43fd96a69c4264d26d1863a263b69a02d19c975520eda6410d56fc94f7c67a39f490d3a413d4a29a594524a29a5f463044129a57169e9d2672e7a666868bee8f3a8baf3e450cc17fd6c2c5799ee947020667ee6259ef4c74553d01c9aec8a8a8a9aa350283a0a4507a56758d7326ec24dfc889baec85654a4d3cd59cca55c041de9703a5d8fae77743a1e9a2f286a1819dadd42ca3022256168abbb602c772f954aa5151d2aafe6f7f2f27283caa3ca0d59a422c34a2593c9f49594841606e3ea2c58106e04117d54708d222aec639b821acb75ba1f6e229542cef560800f197498889e73fe63befc439355b9e5d439e001a5f7ff3167a5f707d232531b71f1c365cca3ab256c51c7bb45ed1f0e983276c224f147ca8adadfcff56f595299c85d8ef8f78f3f8b556b8e65ab350fc2d9f077c2c9ad33e1889a9cee124d6fd34332385426c2b9d46ae93f9b9f5ab2976c6d72c81b576a9c151b17f2cee802c15afdc4a22dd4423df31500fcd20906d4b53dd4bee19b9ebff465e34a263b4f37d35d2590348e2e970d1b29340ee72effd816b5641ce37ae6b337ef2ef265f557ac6ad5064dfcc6f5c99327ce64f42028b5742007927193264be6cb59bb2741545a83274fe60cc5bb262ae9bf1c43e919b1c92753cc971ba9946140041108f4435408d7a43fac875a52212a447158541c03cd173f10e3707326733dbcfe5cd4363e32f213e3beec1ec67d3971a52f9ba7645cee968f9ac1652edcd0593487ca6ab2a50a35968bb95d56b1ac77759b6df97279c97cc950a07a34d6a4f2c3b8c81fd08e567001480885b0199b53853923139f41213edee0f468d26d58ee7277f7905b36dde53c32cc19ea48c89cc1ae3fef7ca96d8ce4c60ff533996cac05f52bd91204415b49b664b98ce00889cad73f5bc2163e6f6a50513dbb12593788bb1b4c3db081891206788082e290a0001138e839c31430e281d24411a0b8e17004d0f77d4e934bd2c30f92a46ca0c3103126484b90b881e87623e265f1658104053f12e67dc3fa4b583f6debcd72fe86790f8bd134654a433dffdc73184e0f06c0bca773a6dff34077eaee3c46347104a05bc2a0589243220b12113924a183d00e067078e2861d5040043926deb40406eb221663a2879f98981da2888949527988ecc09999ddd9dd9d999969683c0d908602a0446906ff4f29a51406839d0006cb75f1ffcfe38258cc168b318103096e446e44724cec60831ea6a84011bac8a1e8f3d979d4fb92524ae94729a5e14729f5cf632a38ac47a7a076ccdf320027c6b1580fb65811a0dc32b6a3513471230212518488a11da2a0906401030333e3303c146d202686879f9898243120724312277888a20230033d6cc054831e6a497c3840229764870bf4e7eecc4fc3a38d10d83a3b3bbbd3b8f3e74edd73ea6ef35dfaee43fb29fddca9f3c0c4a534378b1824660c762002c5f1081d818a471d71cbbf11d121872e8c409dc6e66b6eeeeeeeeefe74506aa383aae02450a0767377dfd0c5e522acc0bbc88188bf1199312062832439a8a03483588c482d166362061ab8de5db80dbec3751fc29945399f2865dc169f6d0b876afab25bef2508e3c79f2f6e59171084616de9b329ea8c8afa82508539f87e432799333a674ef4118d035f31654c88de4baef710d7cb06e2fa770fd7598b5bb20fae8fb764a3463dcdd1baf9f29f0d55bee1e700c15a57966d3d582a5bb2546c596f10088a4629ba5d0aca3600a7735106d3f4020781413abe27d4986141c67cb5ce6f37bd69b1b564d11b72ab4e39a1214db714d53332f57019cbfa0ba84b33e78b66ce405902686c2e9bb3bffe3ee68c74fd7fb8ccdd7987a7c60a7f08cd1f066b5201a60f4b259bc3b2436825fb81244b3609fb60f01d213803e8a1b62d8588ef3656ad9ac2d134f6608b45e509e57e5689e9592eebe16ec422270d0834109dc8f4015a29a5b3288a7528fc2d22a8de03632424ec49d6e350d8a53f43901c37a0c501fc9c2134b0f47cba29591c746e403b7bdc457ffe70179d010623c97f16ab4611d5a35588beebf67c6010ac3d1dceb448b7fb69e69cf16677c98334397a608222a827b8dea70fadce129cf0c5d7317df8a29d3dad18baedb4e58c62faf0bd6f3dde0382b5b643f15cf7b89115d78d9c3471fd430f9aaf13d4cf72ce0849fd8cc492e682f3821696b2a2bacf9c91da091193eb4d4c977fe94bbc67bec026a7ee368fc2db7c718ff7c0f0dbf5f9ea27d9d27ffa76e3246a6bd2e9116ac47b3ea736060676050c452216f96e356c5c68fbd6427d732ce6cc731dcc991e4cdac3a417981404938660ceacde9f4299b3d6fbd31c70cdcbfb534a82497b2810334774a34b5ca7435c37a23c0e84e94e78f0028441ade20afe712d7640e6ab87bac33951af1a4baf32827f1a492f8edfbb3b9117f58ccb116af8a5f35cff96911ae2685cc6ba26d23c3c466d04cbf8774fabc6469aecbe9dace842a3f7abd1f4479efae935fc3c960f5d5cad300856160b64befabdd1c4054f8aa7f2944070164d27294f3e9257ad8eb1a7ad98a7937705e9fb64ccd9556420f73eef46791666befa51a3f3cc97c7f80ed3c5c3352ec4323dcc19ef5b064234910f0ec494798f5f60ce7cefe510d75d89174c77c1243d06d3e58e6319f79c1234b8de02f7a3f972cf813cef7199385d420dc3fd89eb5acc390bdf95a49c08d7e0b08c3f8b712c3a3045e474db08ae0922c45d8e32e2fac9fb48e097148bf9f27f19690e58c6bf355228f3457124982e7fa21234bafe306c59734bd0dc4e7765a42098a4ff6aa42198a4bf6aa41798a4bfca487b98a43f0ed7d01eeee1320a4410aea13c2ce3ff81eb9ff2afb63c0d4179b8fe28efc1741d4c17e23207823b992ef737d9f274cb79e4856b71ff5e713d8593a180e39a7c2efc2b60cf63a0a0f621236aea67e9765e897141d5fbeaac5a71dfd0056adb12e6368e6bef311065222f6c405110992b5fb98bfdc16e5cab677d94395181c0ae67579f574ea315b8a254ace2672b8dbbffaa4190e5b6a4d445fedef34e39e88bd5db47d83cc1e04e982ee9c2f0274cd9b5eb79a0e9e7db742a4a93deceb2ae492ff645ad99b9de7ba6f71ee63d560ab326c632de7bafc36532defb1e2e43e1bd9fc165ae98f74ef8721291cf3c63e967684bd80d5f54fd34e9d9d0785057af52a5de7bde71598df782dce5fde9f5f5a73b0bcba5f52f3877798ffae97d8ace5d35c696cac37ed25e634bc5b676bc5ee679d478588d97a9f13af45f3f4d78999f3415136c6b07ec659e07ec65645ea71f66c1abf23c641ef630abc32fa3f293a6a2f25eea6dbac6cbdad196e04d8d8c43a5bc376d0c5b8225d812bc294f828d71e7b76c19e396ac73b1306cc96ab17ee7afd812f4bec610eaca325093deab2cfba4be649febbd4a2a65cbf0c1708e3570cab8134b73e4eb9a316386cbe59af193164383068d989898d7a14fe3ef2cbd8c134e384106bf0c7e19afd37fc24f1a0a636b7e8d9f34726c4ddbda41feeb79a0f035ac8e3f0affb23a4b70fc51781dfae44f1accf8c35d006346de7197f7ae710677798fc2d8c35ddecb1875b8cb9be13d7982cbb816f39ebc9ecdf36233c649738d93468e9386c23869278c9326e3c24c4b335f1ec97a1f5b721a12a3c55b28e4c89123ecb3fafefd03d7984834efdf473da37afffea267409bec0580f7d94c13c1beec5c0a5ff66e9cb4d93869b071d200304e5a8d71d254e3bcaf71d2f80403ca5fc98db7e907a2a6ee913943ddf0fd6929a8ad8b839f274325f042891640a179ecc64a57430e96930f35e94e641df7ab8f7d51cbae39106d815b9b3366f996af79ffd6f9306bba08cbf8db789957a1853f721cdfb9960fbdd6a4bbd778505d5ec505067aaacdd9e963ef369275c24f37e1615aff52c2cff9e3db1e77f98b3f5de6a9f0c3d8d882f12bfc10da8db10503060c8b13fb156c8eccc73e07070c976ded58e159f825aecf89b1257861bccb0ea1c1b02d1af8c2f8d27b8204d0a5ce3dbd4dc7c63662b945c17a8fbf07f93bcead0c5b826e4bf0a6de041b34ad2d63dcf0475bc6785bb26ef8316cc92ac192605f6ccb96608d215417eb46ac17c9409d4d9ebef422d71fc64803df932df93f4e8d650735ae75d73f650402bb2d7c63c61b6f635ce1718cb19719595081060d1a2abc8ccdb1f12a7c4eccd3f821b416647e086dc68cc7f138331ec7f3e368e1656c8eccb7f03938e68d19696f630cc0e318efcbcccb2d1f00167e088d76e363cf1f5be159b039367e85cf89f91b3f846663f3430226d37f365d7ad3587ace51b24141473b5dce888871df085e06621f9d0faa5d98e0b0a34401d25c1ced625fd49d3923d23290d6cf457a86e5fb5977e3aed5f7334e447d8e0664befa81a8a85f8da9f7d133d4b662a01f3eb52d01989eda21379c33d4bd115fe5fb7bac3ee57988aff2abd7099899635ed4d58b7ffafa25d7d3eac52f6b8bfe10da696cd1fa069834d2e69cec10daa48927d34fda8ac8129077e2f7777fdf0adb3063fa4b2313e121ad46aeb9cb961af93406dd6e206abde58c422defb81d800b5d2be110048d9ccd034370c2160595c28911774ae1c4080a774a818b72f90682b5defe767b1819d39d5cfff2759d89e64f7ff784c21bdc576fffb52d3d38652c5fb2e5edf3cfb2500bcb09088c6f4d967cab71ffb8f258275b5f68504bbe9d9e6ffe93e46c5b31d832e7da3408d6ca62fd93e43dfd3c9dbe84ddd369acdf1703298bfb3dd79aa4bb2da30eeb5b9e65d45982c3b22d56c7345363cedac68948bcbbf5560ac5efa7f3cd8665251453be9595adf774fa6aff9e1e65cbb725794f2eefefc3652cdff2e22db4306e13066b64b9b17ccb8335ef992395de1a76b03ceb71582ccbe280b692749734924e2f9074f7fb7aa34d191e8ce84dd5a927601ba069abba7a9a4a69adc6eaa6fe6875d90c56c5963434d5963052b4e53fcb8a947a49b82994bee98a8a62d82a65a396ed38ca51ae4877d4b58fc4ba263d6709cee9c3cf113f27fc936524a527f9f35193fc0591e669522772dfb07d0841e527b121ea674b98a2a218b6ca74474a42997d9875b026fb8be191e439ddc543caea4dd70a09f3d54f3f0fec58870fca7d3c0f36675336695e16ac9a22f2de7bf6a92dcf5b9ee9747a1dd19bb47a7baae99dc1db9c353165b719461b23992fff1b97d1b09b59ccddcc4da30134e9a42068e4fc08db8caaf7f5abcd51b8fe4c04f306e6ccf49ca3228a27405b828ce224ae97e0fadb380e02a68c8560db2c022ddb7474ac8d13fc8ea3529f77a87cea79a8d89c253829170f95b549d90a0671fd4b142ef832660d6360caf883a92fab0af83073667af055631da7bbc8fb00feef417ed8062adfcf3b1120c6fd9e6dfe2c56adb690a21e06f1c507ed9f40f061383d6861e62b65c82d8ddff3f72793686793a1355972be5aa753529f342a493dcc6529cbb66ae9fdf8d5831b506aa73ed5e00616151535f97c89fbb84f03f9fcf8e87c7efc88aaf3a2a229a68cb5d015e98a8a74eee33f3d535607729f9ef1dca7e6b2d6f7a59f34ffac8eb55c03df64d9c63ad04221d20a03ea134e188f529bf75e5a40d4f2e5d26fa63636ff35a8df152948493f95e402147e197a86f494d27749526777bee8d31f5570e9574123c5a55fdaa05fba2e9d2f0ac4cad0247d979fca4fdf4f2ff093accb0eaa7fdbc932cdb6053629decfb26a0feab7d3a4468584847a47a79833f621a6173167969833a614cc191ab81554700debfd69d19cb5bcbf0b316bc0f777db9c95de5ffea9cd1d0793fc41c2aa551e1db891af60720d1b9164ca98c80c885000029bd07c39b35075f910144be3caabc6d4ab8cf5c331e54d23eabff1f4a4517c705c3d0bb9cd6deeef46f40c1b1919f991e37eb87c03b17450505017b18c7f8b6d9c63b751fb60ba8cbab87e6483fff79d7a17825aba0d48bbfab900ab17691bd00e8611a054ad4660b0b0102a25e562ebb82be21a37022388a577416ca4c88b983e04cb68c008ca08d70c5cff301459483c710ab4bb365a89274ff253041ce386d8b2904dfc928576de45b8fe2b23cf17cbb0154f2d6ce432b0ae74fc7017d7301196f13f3af914f3e5cf1a29152ce3df32d2176721e9b9fe2b3fd77fe556380d26e98e83e922c2356ec432fe35967fddc1ed4e3a98c1f51753307d896903471762fa10b38849fa0aa6cbb9c68358c65de649a6cbdf054428b8ee20b8fe358c548fda86be5a0f61f5cb135c701124c87cd1bfe5e422c64ffdbef75aa48f549f07ea6bad8ffa492bc9fb7d9ffb7fffcd977f8a7e1d83cc194a082dd224a594a23e25c64fa56dd3e2d3ccd9e9e9a73065ac791a69e68b7e0a7d1415e95b932d652e2d91977e1ea51489570224cc840913005cbe5cd33c7ed43b2e763b2edcdbc17cb9c7c4fb929988cc64ce9898b2f6c18e99ec9830f1bcfbbf72869db2f01bf40070bdd18db8cb0f6ee47aefdce56fb23624a865efae50cf74ef1cf4909c6c4ef8a2e5d0b626ad649d0a003ee9bdf174e72987c73d7dd4bb988ff7eeb612f3e5f150b9735cb302bf9f6d2b1f1f2bf73932e7e3875a6add800fda1ca6813f84e663ce50976d3577f5afb8863730658ab8bdf297102ab515cc250122f98117d650a5d6443dd424fd90b62431c452a9d572ee2e9d01993eef3065acc574d1a7d49695f2f0cc17fdffa192a8330feaf4d3c5f7cb2f973eefe6ccbbb43d70291582f60e97b60d975215fdb24f70296d279772937eca5496e52efa6c41cb9644fab05627e56aae824ffab7b9acf5425ffe9c21b4fa93569ff2d36f243dc3b9262943992ffa75642377d1ef23660d633165e8d39e16b8a7a78759c73d2f2154d0b2117ca449fab124ea914b9f59375ff471e4503ba749fad241fdec4abc51043117fea45010c71243138c67666671d4d103308d373830461ad6ad0557c216d5c994b516d3e5385ceb4830770efa12be0277c1f5f71f7c306523607da076e07ae901b2395d258b7a9679764e2aa030f7cf6b21af89d7e4e320c4a07e9018d1fee319c0f430e8b7500ea5674a6fa1ec0b7d513fa9c021d7337de7153bfe1ec4a465447c2709a19ea95df1c4f5f7a223d7df7d4a6185ae654df347a5a823e99929450e0aada2a767a6145718b9148beb4f29a52d1baafff88a8ac5f37c8741d40fea276a045b5051288a84fe040afa11a29258a7a3485a31a8fcea57b61c72552c47b9f14375252ead7ff9d27f52d45342028fa691607326407379245fca4f47fdb4cb3ff525489f2271977f09861bb56e477c568b65b12b2bab52b11489cbdc7fa82d6b8aa3ace7284fe9ba5bfacfcda3b958278aa282f6484f56501ff5cf51eb884ae242e57210e88dc54411736be994257ca3a3496f018b5ab2ae4f9c0c2d8b791d37739672fd771860cebc180ccd9c7d76ce17abc99e7976ced74b9332b14befcf7219f830b7645d2f46c37297df528d1054ca1cb0400e8532d5b40d2827ffa4888da0d422366a7faffba71d1a731638bdcfb01ebc2ff3e583eaf6c611e352e0032666cfd9b37bce9e73ce6e1b179ab999b97904e014292d40b8f33cc4433cc4433f343444446d35235eabf54c7b05c896e7f3064131655ef34a6fe21f2cdc6d5394ec741768fd87249ab30e4215fec50ea6cbfda7f5281ea57679e7dda6818ff0b43667df13ede6cbbb89f972af68a849971faa13302f240f2f7487544510346a4104910379678b51c2d6240aea4747425cc89ca9e88aa4fa78e55541bac72ad730df71766e21425cb65a59b6f51cd58e6a47422430655c85d15115e2725455fff54f50cf4cdfa9b158beabf5d490d46c38a3d54acd68f7e44888cb5646b926572ff4e865f524a732325259d6a77a57a9beac2adf09b9664b61f2e4c9ef72d57ce747cfb4543fe4aaaca35ea5b26c345ffef138db5a06f5bed21168c2c96df01d36f21da3175057b592fad24fad1d2bbffafa382c0fbaab7e68fa4ad8a2be6ec946554c99d19c91bc16840ded2825abf7138fa6ad2cea74b3ca4169d25dc6f5f7227ea4f4b29aea5bc6366a5793290fda00d5d277a6ca966ecbd1c58e6ac72b10c23ba6934d07aaf37891399bd7891429f98e0a6a398f5a4c508fbaa84957f5cc6c52e5b3e1402d7dc789f44cd965175dafef0fd6279d76346dbaabfa872962095b54a6816f6abe5c7a507da76752ef1f56b1842d2a8cb7b3a342d5ab1e1c5b5e739bef388f4a6aac22db42a01f9f269d67be8498b71452b061c3e51ac79dda8ea6adacef18f98e110dfd7652eda2850dc816454e48c805a32745464517e49acd87cb6a65b19e795cf05a9394af0b463d7ccc99cba52f43ffe819b6d18791e4d32a3c77a709400827cc0b0e15254a420c46c54874840951f96f9c04f3a1420511944091830f1c410716e726e5514f535020ea9d887d42b9cee2f3f39c79cfb60cc2371c57620e35fc1a60084f31946e78bdf9e2ff38c7c98a76ce979d41f886d60f70821c0b86f0c31345788086001108c186274458d273019aff4d0f25a8075d86b237dd44b5460e6ae9c1c769929f447ad0de90483d48a41e3738373d43f29b1efec22f20039c32e539e90d114c87165c6a2751d8550b916d968b56224bbc81ad892d8a2068e45ac8619817148944cbb869b480a982eba20f19bc2660d6d8b08ca75ef52befcf4c804896f70f4516fb94e3f42ecc192ac7879b2f9fb71c724b9ff2a52f61b77efdf034ce1bce1e414df2a03613a00c00e9501f8a2ca6bee575549e95b2658b06be3497bce2a9e57556cf527d8b9d34d1b20b5c03d2bca8e534c28195c507a29e74b8560c6cfa95b1253eeb579e656c89b6b5a3e5599e07eb57bee559809c0a203e0d2a8f63cf98126c192190831f8679c113385f6c4b20b0907b36aad4b9a12500bff82962ca7798f2b61543f8a787a1da949427fda9f42963e9f94793a5d2cf57db64681f0c68926714e23fdce52b5265342299c0807e01a5715ef0a644ba84de505bd862c0d4908f607567e9e7b7789b64b2718d0100442db946327dbf2908e9f20b7e412f6eb9a260df10045b00422d63a092908382903cb40e922f2c1f54cfd6180e49efdc45ef3fd22934956e7c034d1c564ba90e014c197b00a7a3e4532b1de91d9e1b8b55eb8d75c43b9dada7a2668e7b1afc2a7a3831a5863e750453c6fac33d4d9a7a4c162c3d8b552d6dd207eb346f3bda086f2c00f7cc5ccfccf5cc5ccfccf5cc9c8e79741dd73d3d3da59d26bf68f2e874c3b70af372c54bef4a9d2245e8f3d3dd517661eb7cf80443b74f18daf073d8862dd0045a3227358416822e4b3d087ed8a91c1595e74fb18c34fd2aab4fe5a87ee59be5576c8eea4b1ad5b8ca613295b5b543a55a49bd8acd61f9d44a05fc9cd4aba87e6573545e659f65650459c8956791ac9e2aa4d58cc991384b07b62ec596ac684d3c52a19ed181f49d1186e94b53d63af04d0fce99587a81bff41f96be8652fb700dc85a812a959405439b7a9d50c5eaa82ce3eca485395aa657fda4a5522cafb23aaa67515996d729499e2f10b42518b6b05a5a58a0ca5cad4cafa3fad46a65649b4acba85a7993c559fd8a9dee52fdea4be6619b6a0cf967af5ee54d5f5da6b3726aed58bdcae3ac5ec5b2565e65abbb4c29abb3047c9dd4ab5efc77198bd5517996d68ed4ab1e27f52a1247e5596cb832f6f0d4ab7c0b7c21ab51f5ab37c0a4cd90a35295f3486571e023d0525f4e9d294c8d25d13bbd80baed335ffc65fbdc179ac795eba517c7d685a5eb70c32ffb28b46093e19bc60798c2d11483f8e0c3205ad80d9db8a8f40d564549eb108d0c0000000053140000280c0a86c321b170482a506269ef0114800c819c467e58194ac32c878190328c10400800600000000000800c06b60067e52378efeeef8af6ce3df661e3d0a0f6bc2d9c676f5aedd8c91866c5a8b36e1f9330f36dab32e20d9c683221aebf27eec3ccb6206a3ea81ad132ededf6d97e8735864bd45153fb930d12d4825951010a8fa3b2710ece8b44f8d8864f06bf5c0478811239162c6369d95a3a803fe7ed2f73833d4e5a64fa1d6757cf72785fed36878ea961f20b2d98dbd74785d91cfe0dfd1e7130d20566a5e599eea541922d9cd3c6126a21645d4371ed599ffa6760de6372935f202cf1454fe2cd2cf5f3c8d1a35d1149ef669d78810ed02892cd4329602180340d81b1ceb45dfdf5fb3584729f941d81c18e7eb1d1f53c15a112ab9471fd82f76a3953ed2fde2d2caeef31f4e4d5205219476a1ae5f687a6ad65b69516e41e02ea7405f53be2543414dd41667b9d4077405f8f81cc77acf262b6eded216b63983b03985f1988b9d79bc8fb2eb48785916d82c8f7e1258ccb94791eab0643b282491fb13bc47cab4d8b2734c77f291f86af4acad01e6f48eda0a19b5a43d3ac8e29df630389bc582543d07f34b072d282e831890c30712daf5a0de16f03e4a6afb25de6c6fef1ab0c2dbc7faf3861c5816a6ccf54f83ce53d998eb7aa4216eec29b3cfd8b592901a693d1b093c0c645239d1e9f882a6ea669dc84a8321360fab16a5f76f6f6646db277badc0b9ae5428f217f101cc0840790bab7e4aef40fde3d9d99d054344197387c6ea74af118ef8b5c885d555dabfbae5176561d768a695f2fc79a76ff36766cfbae2cec84f11dde73032ec007711e4960ddca039de2e9c5f84b5ab2d5b62a12d53a54b538f60b4a30adf2ac58676477f88608c816cefda72131e03715e670797ed957de115feb2a3ebe943f481d07bd0d12e884bdeb27046d1bf42fcf1b420d5cdbb9a3b00c12dd137aa5e6ca099058a6f21347ddbd607b2a7f508906a95d9627e228348e1e76c34fc094ddf8c3e14e4013b1476ecc64cc7343b78919cc43c91e2a8c768f75832afbe68fed0423cdb278f5de404189e14273e8ef87024735f04a6639a0abaf0f29eefd9fff8daf7c6f2e06fda1ee847d5150d15aca4d1e46bd240c372ea158e0c4ab630871d02a2eae78f583bcfeab966e1ea96ce3744358ddb5557d1a3fd3bceb8bae783e023211d96bd5f046f1d3bd295f4b7dc440ba8310ade9ed912ed4e882749f9b933c7360a32a979107ad8ca61a6f522b03f09fd6916c15d7b61245366683c8edc7adc35965cbd202ca4ef79867cb3a7c172c6db131d1d63f62130066a44a1e47f8ed86c46ce84e3cb6c54dfaf81177107a551db08fabbec332e7abeff4eba6a361851fa1cf4fa70f1d5d55f39cfc78b7c2795429d2a081f51d8b82e1796e67d5773a4d95971a83c268e71552bbf4aa42de5728846690177593c08337b8f6ec630eef845df237efb6b056b11d87416a1e1fd61680ccce4ac7cce508a1b9475a5a2879caa09ad4c87dc7a9abdd8838eb6d0e48110bb324b18221456c812af5a20b207ff9a91148f04ffcc1ce57681fda296c47860dfd76d9f0be05cab838f4da4977f97a8dceeff447048b12bd17c0e46d42656681328630682f42cc0237ccd0c32ac6110f4db38c48f8446f44e6fef0855e79bf71f9e6672b36b811a305d27e67466ae89104f785707ee0cd9cd517f8f1f3743b516b4d1a1b9344ba634faeca04bf953f819e4d2de32cd40de424d8c3850761e4b94ae02e2aeb8be30e6fc9b83401fcd5b911471f98fd9ac6caf0e2a6307afe2ae4e0ddd145b5c227a1db4601252c589a2a162f94020994ec15b80597f8f386dbdffc7f6e379440e344f749a7b069fd8f0356faeb976202e33e43ee8f835722e881def7c15b4f3e44a4dd235fcc367c7718d8ab4e65623ffa9728410a56def540212101f8c21e2ba766c32a7b5d9ad61e69bb75af1ac697796c12626b175c13c6f1d8f2b2d8a4dacf800a5b79db7ad58d97d810549750620b17e4763f83af65a6fbdf8b9a0ebb0da34b7ddc857fe715184bc4054a7ea7f1195ef633a05304cc3fbacd3906b4d63a6acd33587ec2db381208eadc3a4e77205b764504cdbdcbf0372b4c90553cdabea89ab8164204287820e28722ea5d4967a3841ab4fa042e7924aee3261697a89fab6ef86316d8d4785008ad5cdd506296c67982fad455d00d19fa2f180b93ee6277bfbe4ee644b3d966d00b5803cb6007ea1df0371776a6875c4d090494c0d700150367080373ec8ee0b2e7c03c207cdb8b968a3bbafa8b1f54629f8e4b0a4b81036c4233fc3b98a1613e56b4bc4968c98ef40c64a71310c60192daa8caffe129efdfba9112de9ee00454c583382974d2a9a1f27760e637a1b9ad0ff70191f183e73dea290dfdf53d7c00af2334a152215e7650fa00a3c4db4ac89c1ffe7a85e303717e442626f5bd45de840f8c37235d0e1148c2dadf6c82a8eaa4baa464438b3a7c095cf616ecd7776b3a608e12bb85545fae7b6ceadf800e3ed42ce02c66ed2d932e0f78220eff5afb2f941a86de118e2bc93fc7988779afe8298eb5a6c9f7452e454111cdea472339fc47680ab31d11df60312e3b7b7a32f9896461e5c380737a2ca0f14832879f46b4091d76d9578d17a5d126445a147e183eddb775c94117ff14cf9cdb317649cc8f13a8086ac1f1af9c33330170ee13314ef210ed60437bb7a50b8894f6804dc9641ee24b5ba164e9e284954a9e06e72bb41c9d4e6c7155226ea9949492be681a856f312d15a438ff75ed07c2b9b2a6dbe18fe4cd6f6957e918a854e3933c0f0b45122ed5ef46da133300b8e413c014742f5ee650a37b328b0c8736022beed9821c88895b847cc05e5718fcf398c78b88c0df2570987d16eff86cc0403206c9c108d907018dbfdd23cbcf9369357304af2575a942502232b4cefa43fad91d81329caf0f9f2521eda51128cdf43d23675d04a6ce5d64c8914831335c0e15817bee3842a2f25a2c5d3d9a00a39fddd45b3078221a1b0375d2293ebfb3dcf8c4a7bf17d86c82d44ca87379f00cc7603f619178cfc02715245a42088840122ff7c7ab46dba44be3305905f570970e3ded065d4a113efebf67b6457d0b7b928c3384b17ba00010a947a40239a759a8c2e07ca5925213b8f39af2f8877bde40586e50f30514a78885fd2676c80b5a8af5462b033e8b5e1865756d041fdcd8faf34f20030c6f43b85eabe5b58fb05a9e9f0d3e92e7c6200e8f68717e1ddc41fbf5ee9fc9c1acd236cdafdf17d5407590be2b3cdfa8c25257447cc04957cb1ebeeb813a43fbdec48094391ee3fda6b9446c941323c7c769cc02233ab2d3f21f017b89f7b9877900851e038d108829f69af3b27734f344dff24b0db9d5c1fe3a78d98d24b55ba4a1cf1a045d3e03a37fc031ee1b07b33c01b03f8eeb18ebc5c374ff0f20820dbc55c798a34d2b7677b436c07aeceb1fba096a84cc39635f7fce041db69fe6f618fb77b7a1cca16b0090680cb0b4a9fab3e50509838ad4e351ccdfc8abaeb1aea2f6c30ac89c81bc196e29a709d14127d11c411b0acc1c2bc90555abd79b08e5b474692d8e0f261de10563db9ea05af21527eb93ff8849872c1befac504e2d5a7c2e7b2213006dca588a2b2e4e3bf92162a10b6c980391478cbf43e1bd27445f45c8d73f6809bdaec0af410c28009f22b557f5e5b504eb62c24c572ce692456956c2c146a154b4c22b5cde73a486a95d0ff03ff92850b2ab66c8854efef002d2670592818d7028025f41f49a797789dad8d3b309e783f4259b1c3d7753c5aa10360ffc055a8b5c8193e9af879358a6c79f30a0eabb11f113c810594edb9c6b99b2975b27a31e0dc12dd7e18015f839ac0fef2d3732efa2a25673aa6bb023c228cd9ca6810b8e49ab8fb91cc400bbf5737831a2b2c1f2ef2b3742e735e7db9860c43c17a6027faf3c2f9d1bda2253f569113e4cd18af6f49a3fdc869f6b91e7b7b252274af223b81eaa904a00052433d759e0dca43c49c360793f1071271ab207cc525c773b12c8fb60ea81fa9a0e48e1b3e6f051815cc804b17931701221d2b4da0df958654c70e13dbcc1436834796bfe3fec59f3752656808b6e3d2e6655904b08218de8ffff318e5e7d02d9ffe49ab0a9ee1d97fcc03abe938428c266169f8dde85731ddcd39a00f6040d665580cff99665d16e3afdd3418f45393174336e246ef64a24ff9b1aa2d67c3f559a59126ee1f2ce24103577c17ec41813c8968421862d91c87fca88490cfc4ee3c0132b20d151c502cccdb620f483e8493d85a037125a19caac11ff08f089c278b6909ec46af983b65aaadc12ade3524c9550ce188a57ad752f305b170f5ac9ea826768053d09813c60d474417d85458acf9b7e9da9bf4d13050a227f8752365c7560cdfbb2b4d090d88471521657468884bb8b7468eca49a5d6ab1c03055752b2b07fa530fe587f5240e24c677a8155e118e4d7aaa91fbf9a8b0545952aeb182d9990f7411d8d5985af6a17029c0b4b990154984e36a5056923cc33e9c67dd7245e68a65dddbf66e8983f434dcd5adc75cfb96e06d849ce7ab54460a86bc390beb1a5b8523b87eedc8cf06295c1bd66f578c55f8d170f4f71577d7ed0cfca778f42c3879c83e3a5da4502ec80b1e6eb8160515800d7ab0fb52fd2274e7085f64f3f96e409a0c3b4dcf6ca4cd35df427430e498a43d324ec3820fc1fd82b0970194e4efca6b8fa13a7a814920c42d9de73299058a21423d75c007eab8b5517d7a3ef9d9ce3e7bfd565d1edae3c359e332dd9f5e4864166ef6c3fae19909bb19e5ecdc19e185eb9a0f4962ddb5e6c03fac1238590cf852bc2130ec080ec44e1fba0a8190b174b0a749e8e781f83dc9cfd68deac743a2f21027052cd93acb95ecfe45e04618374b87329bd6b5627c63f8293c16f467fd2f1b1c254ae4a29dc556bd1e829eab4c6439f1694701e80bc59e8c70a3888b3d2aa1c7588eba84847c07c38991c3eaa1046d890a14866cdb297e1ea66d924f666b5707da77d0e4afe79476528c45ea3ad5807347d09650730938ecdb79654235cb045e1411cd4a24afe9ed62732ea5a3c3bdf434f8671628de56dccaa0d873e907b8f1facb82567bf091975b19668f96289cb75d7256bc80c8155a4145d0616a67fd2bdec45ad325e084d5205f5871c6059ea8029169222d050ae10a9ae3a112ca428b2a16481cfdefebc0541714660dfb57d45d7957b457bca71efb5ad380adb8f478230fe3ce44c06234a43d8427f0909dab0f4d75c2fd19642a77253154ef3ef9d849a43dcc79c1fb69eb96c02805afa44cef945f6e281d1bf656285e1e00bc58108bf9a44d995ef3507f118e9060cd4269b44c06fb258204f6bda39ba59fe4e4fd966f249d71e9c5497f099ea46ab3c911a36c2c248e0da5a244b0016f338fe7f0b64f98159dab73177adff94c6da6a87dbb685e226688d63d184c94ac58184111f29bd4eb066fa13701d796ffbf97d1bc94dcfe94976299e7d3cec55a59c0427dfe025af371347afb9fbb25c11572ef28023cd5400cef3e01d4ba851fae1ac9ddda994136e3d34abf865246275037ef5b858842ab0b4da1805d7a7d24edb16f7949df58e52dc40d7a9bdc01307674e1f0dab8d22b6c245a18a330c31ff293e6536af85e625c672c8d4d69d6a8079bd644c3b7015da2c1be27aa8dd071219f81575a42a1f17a19f589e00a3a3a8a172bd2f7e3a4ea092c7bc77af3e6f095e36d90217cf8eaf28dbb93209862444c063b242955d271490db4c6ee2b0c59b17bf87193be75e95fe23c411a5f285e2537d5a18b6f63b492ece22b8bad1be4d53fce6d52951349d9cdc52c558b375185d5ab692b2f3bc742bcd3caabfca80657ebe5037d9ba32c065477fa893ca5c5cf1dc18070b67f295fe0ec0d8bcddf21786021454d3bfcb5a5fc31aa535b6fc43764d2db31234461416e0ee2c887e1dba873a8a4f943d6b04df983ef863b3f0a53624d2ed09f99aeaf8db381e0982ca7c76fd277b830195a5aa4fff040a2011851ccf4d96b8cf8614ae0d974a7455f8c9afcd35e54e41944894c9633dab9cd027db7084690ebc49066840ce4fa0d8862c883fe119c0e6adf3e669c1482c97f12cf1669e04cc47e3a0fa10f597abf2e62be06fd50423da27c915dca21d7cb1e528a89c0b5c780fe62cd3b173fbb0c3f6d045ad66fac122c6e83c988e5cb6e9b3ae453c99fb89967d14ebe87963440c69a39b5e7be89ab6e0bf1d77ce7585097e575304489ded53a39e6152cd2c44b0f05e5953e15993e6627932679be6dd8f49efc0089db8f2330892114d862a5cd3e07cc4fe1257731ed4f3a10d8f1293ba435fd3279861aca5b4ade68ecb3e9c143c31e916bbfa4a4698a49722d4282241e07909d04c9b3a9ada31b6f4d3a38e9c5a1bd4c6b57c45b88ad898a9f96b4055a00a5354c1ba5889cf4ca8d7673496a36fc42c72c921e6ad3580cdda203876891fa882cbf7d2b9d12b9d02782e23d535a67921d3b9241285961902bc203f510579115260d81b34f8444a1ac09b329a91a4f53f499e4d3c0df8a927d594b1a259326155ba9fe4eab4bf9e03c6d175e36a6cc399ffc09784ac99117916c9c9bb053e52c957f492d797a97c2ff6f0ccc5a539473ef27a206d2e2d726bf28d2a41ff0302989c4a5894a024c0d9a5ad9d8de452ac5d4bd0518dfe2758ccfbf25e490628edd1b73234f7c4375b1bb162e6cac86bf3fd7615942cbae34adfd0d3b57c673b5e3174d7e89d700c91c0c8d05c2dd4118eab3628c38b1d62088ab948180f4d7e31ac279dc7d9457264643389fec0f4e1559f66017598a7a9a3ef562eceb2f276ccaf48fbaa928193ca3fe7acd2b2feddda03226e9494f443d7a72cf10f141ec0884eb5dcbc3ddf0eca2697a3fd0420370b12277eb8fd474d26350b17d260cccc18680cfdff3d4e81843089f700234cc62cf677e4e7293545a1828cddb1d8ba48e766bd0499503d13a2ce7096367a28db0257c8ebf4e084be2808c80ca48981af432fcf3ac75d9fc54a6c0721e2cc92dce03a589a5f44e11f07887544502bbc1c3b3ad7f8de00feb283be936ba2680b7a5874361de4609fce9f6077414bf92c7274257fc6f0e21352b68134af1b1ba7f56e0929b60209a3d6029d15e14f639ae2d4233b79e2fe4f240d49782ffd46b57dceafbcdbe7abd257570ab83b449570d1aa4cd635fe4a7b4a3ca862c29e3c88f834837255dc793ad868d110950c13b0f9f3fec0f7a1a9d8fb5709b512f28fcb3666e85fd3d9d8a20854a3ed73a7569fe06254a9d5b04d78a10d03bf558f07e34c3dae486eed1fe8183ef28353e4f47dc2779a4fd9e36744dce91249481be123118dc923475efd8fcb4cdcf508c7011dcbc3b32ebb1aced0be69c53525691438c332c83397ca0353ef0b2f18ac70fc4c97b630098bc2d0d438eeb8fe2f91aa15024dad31d396aca897ab06c1bf4de481bf62bbf6e3b03232c636c66d9c84258649c0182b015fb45e2cf4fcebc968c6253deed68c598d34e7fb26a7b1b3d2c4eb3c1a87912fc3039c9a8424a926b26745afa5bb5723aa775afdd00ad101fdb69fe2d8a031ccfb13da4d0725ea480173950c6f347d34c9744a969a630e8ae295924d7351f4c9462e12ad58e34ca6f3e0b72ca25f9d4df01cbb6ebe4ce30eedb3d5f6a61093343cb31a1acde763ac0d085661fa3267d79605ad09167472ead9a2384f72577466f71b1ab5685d809c8ffaa8c99c55ec2acaa693da121dd8618b5491503c1f6b8043b2352adaeae41de25e9a1faab7c649ba04d9d90675644cf9c0f747fbf3dd3314f3160f6487ba50761a419edac2d73dd45a3ebadb01a000675b2efc25dd3f36255c3b192026dbb73bc4c061e1d0ab76c30a5eb9d42136e278a4eddb42cb7998c39ce4317cf89cf8ea190b360f7ca5e669015b7bbadd316d01309d7b838bb81d3b4b3f4e76d2f4dea261ed6d6f4ca16687f41aa8147cd4dd7a86f24d1dd8416cfbdc6a3c50bd995c91de9505cf44037bf6e5ee995dedd808b1be50f2fb715bf6b40ef8abcbf0803e45a8fd9b6130d7b18d63de502e79da1bb64ca44a2306f08cdd6ba2b4d6642927419fa0d02887b7b47c8eb6e335aa6eb70afc128a80c2d8e7a53545cb69aab3118369b586e6fc9d4ec93c8b685cf44b99c166b6a4e2951b780bba42bd382998a03d4b871511a243a0d7b8d363efa2150bc7c179b96783df6256ad7b9218d2cdba7e8ae3c6320da173e3391bcca448793da34e59e75ca613f3d19b13da1262caea79b358a8ee3e675a7ff15ceda90398739bd7f9d4edea3fd994da7b1d245bbc1dca9fc3c8cb30f77748a2c5adf18eca3a8308801903151532e7a37e7cc9c075ed2018c73a7623bdfbce442ea4f24014f9f6fc60b43cf7a8e10a2f5ec551760c2b3b9a1aeadc0347f2df42d8144cd2ee0ac431caab05aa6343016586383740b6ae99caf59e505e9da9b22e72f30fb3c1624c6103fc3d0f67ff1d532801074a55a898dd86beece6332d5450be432840292b5fe6bb2bc6ad08cd7093dd9cb0963ed70aa6cb71f1c7f096f66177f316a0fdc37f4c83a2e0829ef94b521adeecc2ca701122d15c796899202e4cccf9a80036950424e527225bb72f10df2c12b0196655d660b0a90d9eb4fda2a02a5d79af36cbac46c66878090336acec46ee14aed34a4ca1d7f188bee727b9f41a7c625eb5946b50a7d1a6243ad33653488ca0778021276c03b74c60fa88b987d27bf707a7a01d1caed95e3538be2e307b028d45c5508f928616fd38cb3b1863aed731c68edc2a8786593c5914763c1505184c4937b79641888f2697f6d6cefa55b86d1d55706de29bd2d68819256cb7b12fc05ae6a9fb079d3328fc10fb909ec3070a34d3354545afc765fa084b3fa8d54be8fecf114cafdf20918c7c71422aa29698003b75e96f56b5e4f15ca38d2e127c85663f64330df1f6413f1437a8783dd01507510e5fe35a18c06327c25b701293fb1ec10c0a1f7fd3471d85a5df3bf0eaaa53d419876a2b49d9b02e433505ae31a1ffa63d27f4451f14243aa9fe22b51a5c22e38be9f853dcc0b94f4811a0aef042871cc30e234540784253efe4aef7359b5310b40e5c5b4591287e9252d9bc6425c86bb838bcf0be9bb59a457976e40aebdba5ecb22f76756411aae38fb5a485c732d13afad82d444972ccde77482954e2568e37cfa1dd292c51c0a2f9fd08537fca06446f9d599ce16ebfd31468910ff384dfca9c514118eaa870a2d73a59447b6cb96e7c7d327c5e77a76e0a89cf6a10a827dc59c865fa1ab2541800f095e8cb465c66c58d8d0e1a96840efa2ffa93ee2462e93bac23b0f58d0ae6ade498c70d60e635249c07650f0ead0703d5715a2d70464f1d6fde6fbfa18132e09aff1b0cf26121ccb03561bf09b2f7f0df8b0fe2c540aedd071fdef3ee77b68cf00f2d68b2f0d13362cb49eed516ab6a2665a302f212c5e51b36aabe8ecda78ea63e3b58108aa2f782ad76528269dd77b18c84bdfead83ffc3c0ae6bb1d575da491fc27e4ea2ed1887e81aa415ac4c1d75b8888af0ccc3ba1f8ef0dfade0b4218291ea90873dcbaf763fe73a1aa7c8ca05f6f3077f3aa96ab77626745b2d1ce0f676c6faff80ed30bd032f93e01784a7ee8bd36801f3aaf1bed9dae520933a2071a310073776e380ec79cd86485e3799c99699dbd717f971e224d4330ef953dfa78902be01e4b1918b5dc068315b477daa2a8e7f9980fd725c51025dbb02136056edfa02dd5d61560973dc385787037940a6ea6317456e26b1374e83b3bc92a47ea3ad5d143a76ab1bb7dad4b52b69ef77b4ad5557ae50c83cc9d34c372d5145584d0e62455aa148b015d8dba210bc8e3309d3f9f88b45c97ea31115e52b2f79bf23ef3246860b2d3be34b28038c0553e4f6a773731dd77e8ebf749458019fe8d2bb0edac7c6dff146c28098e9245660a921024f91cedb21a708f7d5c171c8e3fc4f847ec3f43c19ef9175f7189e2e141158db7e1134c0f18074ca4b7b31fe050f6b4bd264a4921e2bed60e34acea0d844030383d847ef7e61466f9744a366813da144e455cd623ec16ce50e8063887c13098462180e13089914ef93de635ec66a2fac382828d2d6c9f32a0c3cd14ef5e0a378f218678a896fec546475c0cca0ba7d9905c0da0be2424a622c60958459785913e546d94f302dba5f00bdbe4c6bf37bb1eb296c435379beed73562c3f9ab35e98ea1608561df7b399feb7b4437110eda32e29129abc4bc38fe33b68c08117b72e0c10d02dbf32f4e30b93f0635d2dce35c1791114af1daac37ccdca6ae1b0415f635c140d1c9634ad8b554ef1cc2807a3f1c989149ccc36cb8b0128a305c984e22c2c9906753a5eea1000945caad5ba676a5a52cb46a55de0a9869e23fa53d143b07e3b76b134a569e82aa618713592eb4b77d7a1c7670524fc9d9f10e9eb2c8edea4ba42ab509168a258a8d2a28432050cae78afbba6c667d2d6452c0a692703924ae8ddc629143d823f8747efc0187d5d7ac9de8d828005db78a6aa6ef69819916a287162618abce83dd79dcbad8baf8e689175e29048bc330a9f43c0fa5320f0205625bd6697c9f1133c58f0cb8c8bc16cf5d901479b3854d7526ee32783ffa21f2f0ac83e0cc3654a7cfa1d814ef39735f693392407bc304793d2e918ebd4cc2bdb43428cf932132adc9fb845cd1d3f5b8bd951dd1b4e766eee775951598c4675569a0f6d94e8f42798f4dd2f146085b86099086ad72d8c98785b97daa99e95ff2aeae0967cbe61448b30dd34e0269d65f32e0a906084fbfff862c084815d9b67081e719781b1e81f873968730d576046d8408f40a5aabcc508084a6bd1de8aa5bf534914fccbada5e9fd93acd04928d5b447cc504d19b7c50a86db24c4f9d98a2a6f8558a16cdc0de9d5095c07fcbe147ee3449197563ba00bf0f3d09f6b64ecdb3ed0c407da82869ffb5a4ead4bf474a798a55fa1c5fbffe9349ec40771b6ce1cdf134da3ff8ce1c4e933ac14782d8744bb7281150b80e118833f6d9b016524d2d0aea4dcf01f7ad09aede1b0113f31e2e9deeac58bb438dbe6e53a1ab80021e1c2c561b31f86d0d97f3cc955ec89a3f942dd0633a31c168be06d61a2ae6868d011103923d61d4bc66dc242205a0dabf02f827c0547963cde934515989eb74e3034003582a2973d960dce8a33839f0f75e9a798a4760a56a8c85ca4dc92c62621dd845c76df37ec6c7a812556c3c1fa2ff42e6505309838270d657d89420f42ed1312030fa14e02b206e186b8b401a25fa44366a96a48511c474848c940bbe38200b3fa11c23097843b585367fc3253e0cd2c8c3a33a61505a36742f5c1e68e59f9f01bc6da2f92c37afb37f1627ff23626a818c87d25092ab897a0190118af5541d75955a8c191f1f5022fd173ecf60f70e40db0f9e91175a72bfc841665fff2298e67151a3741213969ab3a94f4c8426e98026e3bced3755da255077e67983d77e937fc4e68ef78172314c5bfe766490d079711b9f7997072891fe36fb8581930e8069934735e6fa3cc51d105ddac33d99e04381d478b1e580e7561c0bb0dd4bae1e88f958f7b23471c56a1450d36fd24105ce139d897d7ca406a297d170423893f66686734543bc420c42af17b4124cf8d5049b95d805a770dc51b377c6378493d67e0aff39863e27273229d672e9b8cc25ff752596031cc0d138f31ac8330867b18c7f8380a33ed0bd1cf8137947752a73b60e6649a03d1e0dcfa13315696a73209e1fe61c32a815c84715d2442163609532d452e8dd8e72532e4fb30fb29f55c591c2f3bdcb20e08f008de25683eb291b69b2e41553db25f1d0efcf94ae20687577aacfa92c267309a28619f534619ed073fd491584aa38c200cb3fd969501597d793e46140379598728dbdbe77c6b0c87dcc2e5aa254955e064b7aaba9dd5cb42c8892365f43e555952c3577d27998500dbfed6f5b3d15b8514504d0331b4d01329f623f6dbe83451ff3dc3107aacf886b605d141c6c9caa73f8bdbdef9b635098178e9beb7fac5b4b9d878a2f2db85a3582d01fd294589fd7520195ad6ceee4cc8e2eb34eab7a47e1ab56af079c254608487a81b720d3f454033ba4e4dc02463ef8599458d26632333b0eef932c53f112a19562777a92bd126c69bdae75709d6a933c3b5c5783c4c4e00bce7120866a360df59e70899eb880d74010c93134c997ad5a5196386d803dc7eb3642b77494dd12a4ac3c6d96f6521cbe12539b96c778251a51ad3c4b9a5e68fe5c810858dd1968c5f22e62c737d16a6133c7907bc0a040362b533c5b5bb1897816884aa6d0e3cc34f2fe6d34ccdc30dddc2441740b1675fae3859dc03e711278d0669a823a80915c97f0a5be8ee62b6fe309e13a1f374f16618e1f77339f3589fa64833fb38537dde719b5fb3b2201f8dffb2ac9261466353f211a7bb05bfa839361bd91c04044ed49400170c2a3f55e891303431166bbae9ba6e1351d88499accfeb764c9d003af29907bcd8079ac0c0987bd369926e95b92125b9ee286e36aa46145c481d1eb2ca15baae34f2c72cfe33d5f36d406b10c90555fc1d6902c47f89471a9fbf33825e0e5f023f55fe4c1a833242cc67825a1a9f6e405aff1bef24259ab4b06c180809746a697638fcf2b54dcf27b521ef9f3a0c940f965f52d393d4de253e49ca583fa5fcef9cd8ea306ed042fc91708a7b1eab7d8bd2f0b35fb8a57a9b0637504d6422164a1b6cc6756b7d1ce0f14a9502dc5029b6777d14844bd2a75ee428153a390ba4b86a889bb700f0b4f47954e3bf145d98ddefe75ebd8331aed19e759d0e939a684912935f5e54b163121b8e9de88ccf2e1c4d7bff015dad7406147bdd82241355fbd44b56347889fea1429586c91d458ac283c58c7048f7ba0322ce181b7a60b3658914a7b6e67b63edb877635358dca4f7b5291c00202dd0feed4116dab5c545a58d63a4e889e89cbd85a408b50f57ccdde3dce35e1a4757a51f5e85c6a380c45c202dcd6550f962939c42098fcc05d538205d25eee891811f0932672f3701110631c9106c84111361e491db0dd9a6b9784f22a385865d6cff469582867859ba9d3cded802f18ef2f7b03b3fa965bc849d06ae5e9d1d2af7e4c1553b7583840c93ca8c95c4dd9be48a197db703db0aef4954a1a9ce75e8af074fc8a3c3b61dfd455a304063b7f7bb25a83ed14c6632a7fc4812178f83262d7f61142ce8317905f69bca34f84f7dcfe56b84c69d762866fb335c7fd32395692820647709fcccb48414a446cee5e1e096624b5824bc7207c52356416be042e2e58b9f59d03e0a3d0f3ca851ed5b07ee3524f8004bffe265dff902f0512f153b06434c87f52a2ab063b54e138867ad9f2c83920bfcaa9d078b82de1af553c48960634bb701e0bf86c0f9cc6525db7fd69a69739e6d89e679d4fdd5fedfe620079916b82ac66e38b8f7935f3a54dcec2a4f0fa751b07fde39c9473020819a0b573616c4481234963992a6028e274478ca949e6b5f0846ef02f2997b39454e6e0e3e6cab934d52c993f1114e1c761a6c7ee4ab92a36abe971be6365ca3f4941643e699d48bbeeef8c8b14d11a4b2374f99e0111216ce03a5c0e5361f512b29ebc146a53062c3b839f7099126b24745e1a38bf7df726de344c8b3d092bee26f64ebc9787a70263a51d0d7b981f5c6e44dafadd0f0ffbff5e856971808ff49755bb1311a6cf36f8c46e3a1c39d9f8524ecc43979072294ef8016f28aea7aee490c6431637ba1f5d42bfec420a0fed4c71c2ff9506ce23f20e079558982e18c07707a5261a03deffd40cb91026c8b7a5e0a55815d7d9730b5c9e6bb4e1466801146d77138f279f2ceb04bf67f79151561da0e71c51cd7551d1c60fc2af6080eb0838f43609c675e334ec3f98f2d9d471c6f6c9e52d84c5cd39bf069372c7ff83f05a842b4581e7411bd42afffb030e99870a53f9bd3ecae37e096769ed4f2a57dfd09bfcdc51c7b738334561da05ca5da6b9d7de49b8c7f3a4347e9859d8126592aadf90988c94f883e9f754700082595c30af2a90ea039d847c2786d324a7dc9d012eb4fc22c5024b87313fc93bf04dfe97051a7e2ff91b108298a6bb50384103776df8388e1c7255235f238c37adde2226e288d6f02f12f990a7e25c6756e2ffed6a5083f016129e902c2701c8e5c46f66bf796606c64592b0f34819c1b744f9d7d47ed9e175f4487bd6c1061e7caa9b915dddac496ed40934d4f8e8fc7f2cbbf01f9193e28fc8b20429690d6ffe69e1788103a114f4925441da8a1e86a148e6606b0d30c15b702506f56155223e4a3e2ae25bc14466b404d5365c631a4f84558b49064b517d5fdb525e1a158e738cf85ca7fb659e30a871abb7e31620c902396ec059235cca065aa828e458f7e119dfc169c583448b389a4fece68f227cd487865846cfc6b971d47ddd49469a4bb32bf49593588bdd95e1445153843b319e20ecaec52d0e1f3723d030c6a9731a8e95d033aa193ed1f53e3fc1537f5f193ef50b42bcd0678e61982e163683f73d5a687f43555531f3e80048b926b004a0c50f13177fc857b9a88b3234f779609b8dc7524c603b51b2460dcc78b792ce141bb8d459f7bac1ff03288d96fe13e0bb8c96d6089a3b528787e646826b5d6c64563fa069d662ff5744d20a4ae86e05103dbcaf7764adc707679f986ac80a7dd1d43d157dbaecf08a15e78029750a8458fa8cce5072a5c58142b829c79c3d71c29dc26219ba38046dc6020b630f8d0e6a5c7cf2092d20634651de4112f4095c149664bbb67f5c45c4e78ecca6aa43239cb1e445067198ed7677aef0c50d995412f77ea00f89110bf54e5b32c931d22fa982a476f46ac3bb7dcf76c5ffbd74ec57a9e79d391ef719e08032e8e864fc9c842df8cd4452294d0548e4290003dbee0b212314a56af1a4e45f464c2b64460cb70e9095942f69003bb37481fbd69272097a61e47d0eb54ede230cc7c6b74fc44b10b0bb79376fe9b70b19bee4c5f3f33a10690e7a4d90d1473d7b42fda4655a6e28dfac69a6db8710591a0cd1ec13ed5ae4fb33ccc1f1ea4796510a15ec8f269bbbdcb504430949d966e9794a2e3e1e7766d11fcca98871cd7197952f789e35f3100c22e2a0d192a31c975039702ccaf988d255b682cb90008a52a00e425f2c3be5541708b54484d15337fbb4e84f9ed3de03ef64342e3e1b98bb8d67fe43a11e689ec8e2892a8a77390a1d60b656279239f7c683849ddc7e0f1444d7ee2788ea7d5e74db8ee50e0ae1d1f9a6b5ec413985093c10663b9344274fd7f5deb0ca0eba0d680c9d0f0031c932f5ae9b04a062688f010aa66fc728fa78709464002cf5412206be7ae39945b433ad184ce613afb406a83e35143e028ec22a8cb20bac9662a9f3b1789ea1b4dcdf3b48218699ea0194a07082e61b890c7bf343fc8ee93768c3c8759f7380abb489d9d47be1a60b65a1356fdfa93d708b1c7af36d6178182aa212e9a94ecd6db721800c22ab38c8d21f5f80399960893a8ea2874a483acea2d4e0eb9d6ce9f2842a21f84aba14d5509938b602d16ff239d43ca217d92bb512c57ebc7461f73e0133c968e527cd5f6bd6bb83e9feecce7ead5ace1c26e1b07a9dd63a93dde06ff775d1c1d7d37584ec2817f4f4e92f91df925e89b0cfd66a249c5478423e93236dbfbf9e9d11e25a1d89796293cd2845011babc3c99b60151d567a57469a96597530f785f374dca81a08d4bf895dcf7afeffd6830991feff75f3d55934340b4f2ecfe15dbe5de28b3d8798969dcbfcef88c40a088857f1e81e40f7cb60d103ef22d9cea672a01611cc005a96c58e67546d783fa666780b6d12babbd33f3bda612f67dfe22775b578439f00cfd4301043fdc237b72592326440309ad13a7f4eed69ed9bc488b51b9b345720f02f987a08f4483b56defe187ef07f39e0e4880c996f844a3ac108af298416087095cbe19d18229daa290cccb98b0c96eb83de8e8dc54259b73f9744ecff0f0a05292b1075954dffd108a5ab241c13d1d5fb915ac470b5050cc06b659f485cdce74ab2eef40cb723c791142af5caf1c5654c2e1d11d4231b9d3e4d7e77de87106e8d33ed0a64ffb95ffc86a4af0a72408520a7ec9d5a39c6adc594c66a25fbeb3fc95bf1eb706d0d11dd3bf919af4a74601d0ea4d396a4fcc6c2063ec89aaed2b8f7da6bb6450072d88ed62a223df53cb42c59a591790bd3d9707675cbc7b2cfa1c88a35da8698b448d377af72e23ab273aea50bdbd2415d78d3638539de03b29f67a34fb505354b32a9d96bba7a017563a1ff56acc22a36645931160f3f2e6d2cc639c9b948ee8604eedd005424e0322e848cfebe1c7e551287e322e02943e48ed39e48ade42b1b3c70934f13743924aab27041a7b56e70224c23684ac4583101e02fdecd426a39095ec1d6b73f3c23e2ed5f8a3c2cbea3a51d9132e670d05724181bc80cd5a6b14a6500eeb6ce7e034e06b111e6ea53dd4047b2d5b094bec246d4694e6f392022ca041b4e34e0e41fd4a66d0b1c666b6511903f81900af3e2817200d86dfd66081e439e84ca4b2e136526f7604e38e4ab07e87d95b7f02b3e3fdf95b624103d0d1ce551fd8b9d2e960b088e4543d12669fbbee7b127fa88370456a586776b042911388402e7865d35a660ec6b0484620a2728625aacbb6cb8784a7b9c1a387930f46e8e268fae4885982011caced53d4d0b75ba5381893652ce1a7ae7b7426b0d497813a4146efff5a0c3907b257f9a0ba2cffced716da50362086f173a9b0245a61906786556a89c12ee9569c7566add799421df144038904cbba86db67566852a861a71dd5db80e3dbd65de9a674c65490cdc3444dba54f3d60192c73bb1ef48edb9bbad444abe6459b9e283c60714231f0899a67195cdb3381ee1c314a03a9594e4f615ac1fbc103527509b3cfc26ea03c5006ad5f043d0265567df877e114fa363fd02c984b64a2dc0ba9dae4615fbbe1067754947825bddc2f5fb7c85762c30768a932aa1cc73047bc156067c6093e4e0caa0be72fe29afe838801a975e5b148fa51dfea29bfcf1c9fe7416d00a6fe12ffc83d68881a82e7be08f2e1d3043c2f2df3f23498942e086c41b12b6030213d3b92aa6e7ec4fb7d26ae2ec2c09ab22164bcae8eb4f2be76ca973858c0a025c61a303f85bf3c736baedfc16a7c4373c04479f34bb544543b1215ced247916b8e8381572f3307a4e74b1049497bdecad8b8d1538a0dbf9f694dc80d5cbe5bc015021f51c71ce9922a532c50e0be43a3dd0ecca9a26cdc7c2e2f6aefcd0d2086a3a8d05b95176ec401623630448e68497c2814c9151bef55935454cae84a0c7d06eec7fff2879c77aa6a734660d883fd330321bf2412421c2cce789ff9ff5faab39d39bfaf157f780cb560abaeed002487c61ad6c8c3914c27eb4c33aa16eef4c6891d0864d4c08a2e72412b2b52ab8fe1164244ed6aa462adc510e97fb258e43efe71979b200bf0e4ceddefcacb08f4e3aa2d7957c6b7b7581fd05d27a56735be724953947dc0bf5c29c117cf4cb9bf74ca8a81798f928bf750f6f8ea309deca5add751d79f2e97694c2e464881c309d31d12ccfd53f42a1bf19b9b049126ea0e040a2bcd532e76c301606df779717708b75125c5c0644d8c381fd87d1cc28091e3b5ceb82675ac82b755058dd5210f78cbdaacd8312fe316ac4114e42eb7f20d0145402b99c7def6907d1c74fd968740ccef398718db3b2be687f53f721fd350f40e7d50a423d90ba51efdc544c82191590089c7d66d4ca10add18b41ab9615bf7b3a18ccacde3280e6490cb6062246b436227fee81cc82a031583135aa1e4102df5545281b1cf2a028275563abd5326a9a1cb47a34dd200cb1b814d127075c1815a3de280ca6a5502dc76fa9f7f935fa50f5afc567783db61ebaaedb162dc9af07065bc0f393fb1ef03a6233c5074d6b0716dda86c408b653c71623fbd59fcf63b730bf18e1e49c7b908aea300e5e111d7a7962aa3c123b46aa8033f69caaa41c2bea4ff09cdf5a3691a407a9fe36a1f230115cc79de3d4cce5d61168ca3a93fd2dfe5c2f139fc1c4856df6dfa2cc13c492ef7420e164306ade9673ca07b9d952be094d1800643cd3cc490f12124e8c93768da91c6689d9c6fddd9fd35f54212d16caa01a24258ae7e51acd0b96a3873aece050a402d897f4287640a6bcb5c7647b870e6c2dbd4150f1260d34dc24104952efc8b6f2bbfb2555362074e67942c718257d3bc088b44d628379274b92665832d3d6d4f077172cf8a3848ef35d4dc888ca7e790ed9c3c71fbb3f37474414e63fc96e628bc2fc928eab55c2f210e178c5017825614c3ae984cf645a06dbd2ff550ac1f95aa7290deeb1a340a1cdcd704abe9fd89f266a794831dc444391b3a6e4ed0ce54f6b3405e13509f52a72d03fb140f6fda24995caf0f6b327caa2c16bfc31383419deac321024c428ca26a7f381c956347b16a4f40bcb45bd5a98be1f394104ffe0e058486764df7a59c335cc05b86ae4330665ee289c4c32b829b6621d173c2552a304be0167b59010291daf849fd38634aa9531fa966e0eaea9031c2a5ee80bf26292e9a4a107885d1a39a3bf35224a9e69844df83a39a22ce1dcd9ade97e085c61e72d362bde6f84d2b222619ce314d193a0b5486734c136c0512209873f508f16aef11cab4509ef0aae657a86ee4377952b436425fae087cd7f2f2e1f3eeef00ce983bf85b72cd618af0f3eb413638179556f62f80c6e26a08948b7587ace8ea193edcfc8c21083eb6f772d3e2a2e1f167f7199c6367ec8252600e0ca088f9a7b7663c0dfdc0b11fea5e673e23cddba65ae523195ee728e54616d9c52d3e3fbbb8c4822c27ae30ff7c568d247ac58cd304a012f3e35c60784b6213e7a299b1b40d41f0f8b1996af714ad3911bcdf36eab49149275ba8d27400007302ef59ddeee795f7858482af5907e66c5523de26bb93b1ce08e30a453e5445dba8f5ae0b5135f3cb643013fc7ac27c5681674ed6d512bb1b890aceab35c14d298181c034dd69de59205e7b09ff009b4d81e5b61ed8a2fab54ec6c6285b90227d66b91f04bf9bba04d6a4f5252e7717b8c7010c49a2868587d6446913db0ef2bc8c17be2993d05e871d67104b4e16d425d2a749c6968958959c06222dc28dc6c1d8c92236bfc041aed2ada3986481a034995f4864ff14bf4d46c8e58190d0faf72ef2c42e615077f4d0562c042e4cea97ab5af84afd7815b42899d123b2bcf4ec476eee5c2cae71f8689f8c49c7b8edf616175fdef2d6c1d8623dc9541d993e6349e7f6cf8769d6aa6260b818b0bb48de99487c6ecab60986db520feadd4cd54d006ef17bb0a5266b7e5df5b902dde5cb130e8559ff7d0a6323ab59fcb5ace6d6cc0b611988613f7eb26b6888c015f3febd1f6b6265224af1de4499e8428fab6790d4d57468c5ecfce6a263414798aa6111a3ac1de5743fd8ddeedd4ed2cdf256ec300edfcc610c95e4e7db83ee980cc143d38b72eda3985d8177c343368b9ca395ad9cfa184eac6f751c7753e1f1aeecfdaef2bb9cc656376c6f0d430d943bbd830e48e5411b34e6b1ab6cad9dcb91b61e52007bae45630a935000d944b142d10c060bfdaea7aadfc730853de0fa1179a6f887d7b4c1de19886c075abf752dd22e9a5c49b9a37b087ec5141c845f1227d97f40b70554e700f355917662046d950b990454d435a2647b650fa2b7aa3f45807e1ec8e0ae1a3decbc98ddd5e01d4ad9175bf8f4c23ff986307b12b803c460a2f276541d5d98c548daf187efa11d675d89f4cf37fa87e9ddec228c1c19db425c46276b5fe6af80bac64f9624a0963365fba8098c7bbf2b23079d6986fd4bf35c90705af3fabb7b2081beb612624d94b6fd4246b093989b910f5b855b22ff65635de9a33d9c8cc449dc584ca1fa8b16036cd5389a259b966bc3bb19f193e56e4c4073cdbe7bdc386d68e4b572e4cf88a7d9759f1b38cde276c12b002bc6eee106c75fde0d34891ac844c80866d47f192af11759fcfb6c4fc901a1239cc8561ca25df6ae2c1d880cef1822584af380c98b3cb6567dcf8196295625d07fd59af862a45da73f20483a19da877d3b27768f1f527476e2594a041052df198e4d84493366846d5f2c1bd8e13732541532dc3bfe576c54582af41200cbbd82ba9cdda17e819f6300d2ce010685e7bba2d807116a73cb451cc2e4dc937721525f6a0bd5d1cea9e5e6d9091b48ba4051e861403275e94cae0c8760c0d69f3ea64efc73696176af1754195fbe5b87f1b32a814eb3d34c40657ec492a9bf2c48746b3fd045ebb4c464e0c20b5c11f740d082470dabc140f9143b6d0820d98fa1ad8ed39a4fddff7773e1cc575617e52c0b118c0c72fd874243ddd3842fdec0a52de86344e48a8bb6112eb4b500ec057817dda916d0d68ec83382ea941e558bb827de2c2af4a242c6ce73e4088657d844ab76760a0969244c6f7c7dd727ea9ac1284af9ffa00b6965c094fef0ff0695656e087b643c112cf6bfa08e86e9f71944da6fe37c4f6c3cf6ace9fb73cd9649abbddf644f8fc0edf489647c5d7bda3067b5724f618bd46df115cfbfa9fcac3f09b91bbc0a2609c565620bca657e16f2369970199ba0134480ddcea277a906dff96e0868a08d36dfb473b19887f1779f1412221074a5443cddc1fd026b65260cffcaec23c5a0704732c1f269b179bc3db5a13e05172764c786dce5815f063bbfced5fe6d93a803d687ac346c53f87c31520213f49ceda8d8ccdcaba3043ac826758bb410ffdbef03409c5ceb41a4556c65a23bcd258d61a7a18bdbc1055a8b097656be46969d64303c60403e446c4419ef04055fe6dfd487096532094661308e344c0ab776b88f56f9721fba1a2c95faccc6b706dcaff1dde50952208d797cd75207f7555243c835e98b1a84509a1eddde40aaafbcee7e4427041ec5fe0b94c4d6146eaca10d909fc0fa0b6e7d9e5d47610028506e2a3f38c4abedb4250c1c21a169a39871d7aa65daa2960aa052b630a9bcec17f3f0b3a97e971921d57d4d94fd02b834c64750ea2fa5e4501344de9ca20a7f133e466e90dbbae6ee01850a8399017412e49b5608c9f7eea97b6bff1952296ab417673cc601281d380398af427bb4faa18beb1fc4cbd3d6acb3a90828c95e2fe765ec4b67481ca2141d121b97dc0ec10dba69f80b3654381fcb78db2debe07ead2330af56289bb18625b04cb66a733ea75f46834a478e6f82f04fa4fb5aa608871ab4baa9d101ed115f895ac236d20d3673ec6390b5612335c4b4f00fa9d5a1d78c25d4b4f472e06f746f3c8ccde2e8ae2be9d4361b5d8d3b5c45f15b27f74273ba252bdf2306b47e6175bbadf580b7d817de25a170c0e5165035ecb1577a8f486a4e199ed1086069bac221abd0a40d459412e9e47e441b305a90281bfdb1c5c7db4841c8f07c22c429641176087c36422936a86dfd8c52033ad78b4e225bcc2154cdcb6f2b6482eb9423408f392f154123bceea525aa1683a8e602fdf7aae60c5b5024ca426378c811acbf77747cbc53b1458eb17141faf9a7ebcf2e2f2fff41f4ad9fdaceb8c0933933eed90b9b2cabb58a4be16e559a734a80600a136a81b961a82b4ff36d49d12d4aa2393f254dc3427588f8f870f06d38f20bda26d33ecb2463694b89cac4b003cadeae13fa79569201f37b4686be76e708e5d8c3488f2892a5d8606b9d5117f0978f3e4e31a01a9500640804eeb2a3513a76c28f00321d5e6d1a3fd3cec9dff2a29a7772bd9a75f6041f5ad0e91d8704c3eb14a29a124cae029ed7e81a644a71adf61419f8e5b2f26d11a3632f3aae938df70bce6c00d6429f5978a52687e0b05bdf6ce010338c1ae439c6e05a31c94d9343818b8d38db8fea5d026e03999aba91612f978aa0f1c952ade0a4540830308cb5235c586bc790b09a60153532d89ff957b387bc59ad51ac8520ec0f49b396c606a6973249b1d92ac3614c5a7e6024d41a24c217fd324c4a8ad39e65f3e69c657917a79632b4cf28338269e1a307d9ced4a23e5b22dc3cfbbbcbc426ab07a02a68067ad6578b0d82e26432ee05619ea4ab50fbf6ea6fb31aeb5526024c685eb9003103b85b0a10f9c60946d4452d72d402aec2db7102c8c61687e35a3d5e8d3116830e388c40acf9eb008fd5ab24d545365eba744969dc9f248e509bcfa2a1c26a74e1004590cd59dea47c052f2cf70387af770d26d0d451464d05aecd5e608928db180fe8d549f64aedb9a408bbafc48f003218908d06368195f73f1b467647c5bfe275c299691648f41e254f71381b317536b6a3796320c42f81d35dfe2527efc50bcb6b3782f256ef68c92805da54ef7c6311fcba028e4c49df01196a15c0a567a8772444582d4ca3d86128738d0258410dae6632cd33b7ea849ceed60890ec60ac1d286339a6889866fd59702588e3bd5ce89152a103901052f4c248c3f3750985d34e2f2421ca3fbbda523b5635b86b952a1a7666863795a1094bfa80102673cfc34f9a356452bba7ff2f9a2092831a2445d00aa84914b9fa080a5bf9e96fa72ab0382c259bc0214a62aee9e3ba955c82ac00da810b28d2083534bac5f14b57963e89322507964c6cc0f4c5afe5872dab68a83c76ce3b1f119c0c03be558fac44cb9c1d3a79b32a4673877907033c7588505cad9dba0b4b5851dc4c14d47320e956929e95ac433cb9520926c98f5ce9e0342efe60f538c154e4a2dc1557224c3b7040a4785aeeb37fb29b54178b8a778acf818dd9b82c9c2a3296f6fed785785abc13f08aec18724f33705870ea72586c9eff24262f898cfa74a14bcffde26eab87eccadaf5da356629dc30deb9b6efd131915ff4d9ee62818074e682f4a964ae8877cbaf8ffab12a8dc5ed10865e208aa33ec9f6b8ec239e2a06c79907145072b52efc5188a3f4dfbd3e122ee9668c4ad10264534dc52e905eb13e1ab89f2092e18b4d1cd2d8a7a48a5259a61cb9dba30512a675adaa486eb9dd173495089cc7d3ee544f36b0ff051ea74f08de11bc30c41a8783893f4c84d988f4fb13f65aa48e1b1377b8a7967c45c1e881ec782bf394f01b310deebdb829b9848648161444078f38cecf64b3e730cbe0fe0c92922969f738543e05728fbc8f7df47af0f06d6e4009a9383e6346685ac4ec8afa45bc0673deb9d5ceefab816c862910167ae2269eb8198b9a5d12d9c6c2533429fff1dc0197761c4b9db3c8e0f547d8cecae6b4257d670a45e949c1c388f83fcb6489a61882249976634596b824519bce0dfe5515e52eb08259aead997542bd184b3dbb296a111e3975992a6ace7216c01bcc2fbb32b4fcc9bfd062bd5117f2d166a5ed22c7bd254ecee5473be417bc1e1f34a442ec8e42a6ab951842e2f4e080204a267cb8818a43978aa99b34ab4fe0c76f640295a000db5dcfac7c25c67afb2e0a8f5d9206740baa26e7536bf9db587e4552cbfb5ce3d1bbe70b58f7bbcfe3dbb6cfed23e98d4ef04572bceb3619da5b9e437c60032aa7d003607541415113af0c38d9278906c4bc1280412aa9fc9a95531835ddee53ab438e31ac14cd59c82fa689c3d13e6cf6f181af2329eb5d933063bea4d3cd57da6607f89c061717083654cfa7337fcc8d782bda54fb852bf3608649e5147fa4a245de4ddb9ab44f8c6c069355594f22a86912a028d35091007441edb088e10591cc53ddfb80e092679d7da6ef723b9225dfcc29aad154e6a16a7a1625ed7c8b852ec183f9758408841af36765ccaa11310fbc73533fd70dd367bbb2ba8818ab50caa516b0353d7f0af7d8562707709c57bed7bdf2072cf92c6837674a753906ddb1de177a669c7b1bcdc7e58b202500b3097262a2e84d9927171a8820c0e7c7b031969b5ba4e0755c0579b604ef4bd26a7bd269464ea7126f19638679a53e3e355d88d84334b3763312a377d341570379b8594c9fd37d057f775bcbecede22a3a035e82ef3423a859d72439f7fed32a31ec734568bc3d6749591b4555135c910c5b6f8720f8908e9c0c4419c3ba50a549ab574bda45f1d9ad3b00c0553f6ab58d88e802e0aa0b3733802a8172422d1beac485ab8e48eb0d704c32a1ba20da255fa4fbd2886cc3a72bc76cb05f3cde62cb585c8fe83a42ce97dfa877b1def08fe7a3fc98f327f6f0e3a659f94433919940e869f7101511233e09cc55e6d775d531344f6491ae6dc353925c4e52428e5ac138b292f5b711892784d2c253db39cff1fe552f09191e0a63ba697cd120928cf5061646420f27909b49612b4605cf2cc29fa121822441176106d00c064511b9a7c19ecc678719144d0b2f757600f6495a9a5cd2a0eb213e15e395c65b89eae1de7039870f6ce612cdf5bbc5c9526b15bea055a1ff001b573c694d6245e66b798ecf962d69c54ce753b4acbc54ec687538fb2f23aa076565f7878f0e7784f8b0eeac85db77792e37a8e51752f8c9bb37ec85dbe187d05f1d423232e7a02b2cf3c65a582753a9f2edc284668a785974c458a0e18191a9445cb8f2c60eed9f1a084a59baa376250957fd3ea31bd460cedf70b8346fe733b174b74514fb8cdde059e4e29534df3767f51795301e1df2bb855af580074accd847665c4e278a38f52d40afc7d1b1237637bc58c354769f482a79508d952c9120d10f5ed57edf64abe7d5e5d062868014e8bb43a216c3f67d9727a53b0b66c657253ee64c57b6d2c078280a40c15f614f0b1867f1bc5d3708159d5c2115d3cfb28788da8b18a31d75951e98531218af0c96188ca66c9dd3c2a176cb2710eb936565f6d41ac445071dd310bc3da710706675590f0e9d65001b44d31df70c3f218c969c21a34146eca73492518e0f3e41a9e5261553ce8f27540ca0ddf1fd782f8010bf58772137e1a9c43ef55183adc183d6072db31e57f25b0b7c0224549b75c33efe01afb4aced72ae4363282181d395af626cced19e217f362e0b812db8ef2643c198ee335f93869ca7c194c9ae4c4335657368a3c993de24467eeab7f5e62f1c7d30f54a188cb0735445c3c0483341b23da57e6b0a842b0eb34273636aca41adc7ac9f5b278589e6f4133d58c2e2c23e3be43a6b62e8c93aaff6cc7c224f0f11b4fbc5e150e4e7247c5e45e159cdcee13513d9612d897514cb6c031cb38c313d1178dd638507dbb4d9fe7b5b4a59933e640279b0d709d05a615297344d967c7ffce35bf2b7137ab5369f5123a66ef58bb22bafd62620bec56aa57c743ab5f2e4664dbab031e3ae221f0ad11330d78d9c3b0e9b96d04dcbac8d5cf4be1891b6af41392b0f48356a05e9300f52b264a1c8b0b983fa56e3682520bd83b4eda5c04a4040a31e51965e12e8f02726b9709fa949f5965501dad43bc88ea3e01bdf3ba9062ad5bb5cd2f0762aed759086902b6663cca361e6ea6a1d9c97b1a3d48a8d0f71b347ee0376750df7e9b9b7144979dd2b2be94bd23ed389c82fffa439cdf37d5b383541f57bdadb532207a22f43f586b199d6d93b31ee3b97227e746f4cb064cfdb595705610883342710dafcde08e694ba32bfc0724fe2322cdf558313164819f54c7956a7ffd522363dbe86e910ff85d591da66e46e6cb11f15c12c46d9072db79935671317c87ad78c206b06287de639dd0b31d4dec1bcdd89d33dc2642b7dd29d8bc2c87732902dbac706a6f73658d9964dd7ad5dc65a8e7ecdd1e752b6486db44a6627e8a1093088074db20843929ddfecc1d0d9d9cda92d8e5e4b54df2b992c38d93bd46e46de870410ec065ccd649b0ecc00752b9c22f1931b3f4690fc46083dbf668df0dae261ba92136b1446d42eaea1e0849554a27e1b3356deaa4274188a63510faf2cbca5b8dd8e5b1989d84b08f9fb75d6b09ae06b05053ebabba7bb285cd0da881073225e125d1671b5b918e0d5f636d1beb7f6830cfd043e28eca17426ea1cc0c33d9bd9d51f9e5d241f2b2fe06ecc76849345552739bf3dc6f16743560e2a1cf85d86974b41bac75ed27b1256636d670834996dfee7c918d5a1db1aa9ae7cdc1328a71aa8fd0d3a7d38576d7543c9fbf91cded31cc71acf7a2738c64de69367498247c3021a90fb4e4deddad0859695989f815422fb6e7d4c5e7417b317bd4939595b881c4fc2305951dea124d73497563d3437e0278b897de3ecec1b0ca7313e72556b7cea888df4f47cc6edb07bd021ddbfd204a6fef637c758b79122b10ead02319e3d79c854836197432da46fd0eec9340980d8f567a805218df2b54aa7a562a9db2f7745f7c6fe805f8eb69c5d22b8666f2bf12d1be9ec696229e82564b8237f4caa1f7021b8d9e3c0cee658ccaefce6e50df8a52828c4567fb04aeb17a6066eefab3c26229d46e4ac68a5082e243b8ae5abb71eb92c2ea24e283257cffa4da63bb98f6c7dd1a5c751513c702a11ddf13ca3df7b41f07e28c5245b2f10d826f3a3d5f164eec9fa7bed77ffaa48539791a3ec46a9d7243ef5778066a628615c5fe18cc7511fb5ae73009a61045ff9bac3f2540a15c2ce6c86b606dc0ef8e8bf1715bd94ebb898b9ad8bc46aa3601c3be38dd9861838c2dd396fac481833948e9e11ccfe7ecb0ab9506c0f670069cc26a9a3c2a1711f72c890488b325dac6cd488df3f1ed73c124d7482c3d6b591bda0bc22e1f1881ce7e428ea9c01452e74ff949eadd11afeedf2f3b8cb6b51d71ebe3ab8fbcf4962cef8f3b55cd30f59d47a6ecc5033222bd3c2cf06780eaf53c4fe0405b7a7bf0c9f5ee79934c859bcadaae5b47709fee355c6a8945417d2d05f0472685304d9c8b3df98631b939965a86c7e1b5b26c4e3e066523a91ba1e1859be6f82797a8b4ff04fee13551c55524ef6777ba8db84d3c7b5c0bf75701dd5f6308404a8a07d28994b8d20a62958bf774b83cba460736d0443253f13eaf4edd547e0c47b20ae213797f06207899b1dbcab76bbec102073383c39e099615c444b3fbe3c7001b59ee504b33dbb2de4623c90b99d16f84c4f129828f8d2f2703e047ff3da1af2069c20ff9edbd6371f9baa0bef72c860a9a8f6bcd984fb13e134231898e8e6a6545245fee7dbb7cc7b34568a003bb1d43a00e2762acf1ba194ffada5a31a3386463012ba98849c05a6c2ff02637b50bbfde36f2c8c214e2b29a89a8922ea039cc60ff03b87d70a0badffd0061ffd1b71230b6f4e5538db6f97018dc371ec8238ebf4cb25ea9aa38f3a1da2cda8dd090e0f353d0773f8819150a49834c561a514832f0c4640e1a576006e3b9994ed123342a479fc22ac31b68ff270590212e30d06b528fa6aff610e283ac442bfb6d43073e98ad22dee32ba421860a09e8f0b8329d4a143b04eae8ae94572018564d07fa55238569078969d54cf5cb956ff35fc8b9c5b564e27f825af35de81fc0b07094e810efc5ab07d28cf2f5a1afbd80c17c7b2e6d475179f9de2591d9502cf82c962bef9411181a59acb5dd6dcbbdb74c29a5490911090d0993b2fc0cd3c84bd1ca5c9ee57fbcd0d54695a47e652f3f5fa7b50eca522b356b86ef5b7e0367303dea353002a647417901256864fef728d008939e4957da7f7fa22b8dae381a0116d37b6fa22b8df2d8e0c1ec25a524ccefc3fed1a4b4522f292915292d152941e9a55fb16a8d66b5d2942a4a4b4253a477ffec60223e02c13882da8492e7c3b5a98b696464a494f42449a594f4847ba86c94e4b0af5bdd9a524593208d552d8ea7bc55b5244646566470367a01cae4dcfb1ed3f774ff9d7c53a53e55135f171bf753fd63424242422e0483ee2acdf2188322927e2db5fc8f04c5190ca6ff6eef1cf71b8db318146741fde2a84bc90979ab7beebd0e8c41cd9a35eb489cc5593cb23cb86dd631688b3fcd72afd2ac1947a08db36df94b29b44cc359e38c082d7c31fdf748b3fca7591e756c3043aff2d3af3002557fef8fb366b9185eccd07ffcc7617126636cc16c2aab442a5a0d5da8af70a1388b41314914cac2199cb3bd6f9192ce11b4a8831beee7c3c2b2fc909d701395a65f11475b2529b9df9e7e0c27ee2568921c2b4d21c6274f80c4620de4c993053223ea9d955444985c84bc8537e7dc5e47bf76541d3f79c2465e1ee68da45ee663b38cc0fccb1b91f9d4cbc37c4fea657e5f1ee66778791815ccc7a45e4616034355e1077c6acbbbbccb7b3ebf9b2def691dd812c3a9c7e93bfacd7259c5c0f29d4bd77d0c5b3b3a0123b8b4d090270bea44570ed161e2e0533a500108581b1d3bdef2582c0a53a337506accee90e0f594224588908874a346234ed3963e17f24b98b1235b71c444cd8a21ff082d4e6c212da64685842ccef6f139b030664268a50831b130ae824868c68d32d1d6c487e18a19ae9426444d84c8cd51309071a36c05142cb4c50c9988ad581c260a9a5b7fe3f38f941ea8e32d9e98b404291f0df16d8098dc48b33f0ec923d206330aed87634b4b4b4b5bc34b8bd3df42cc96664b356ac84b4b528ca8cc668be3aa5e7b8684830a43b35511ec5284efbdd94a5bf3518f8ad14590524707ddb3214cee48d06c0593e3244f478be9fdf7212f2d2df9077690d4fa286c26aa7f0b6dcd13ffd9d1ec0806ab252647bf66152d1135ab6753aae6ab583f9b813acdbad17e502a38c2005118200a0ee2274f8000d91a8f271e4b63cd5a4101b238a886c97720fd1ad2467cb6c68b00591cd49a9efb0671d0a15bfe9ec97bf93398e49b3caa7213d73eccd65ea7794c3171d00104fb42c0b2fcc10edc898c63093138e2080328f16fbcf5e0befba9841939ba1ceb57a76371341ab7c65f4764ca71dc33c7711cc771cce9ec881e63748fee1e9d88230c10a454a423e59c2ad53f8ba507c53e6a2747db4e5ca7b5cf6b2350403424733591715af5ef21e6d6ee4ddfd1557ff74d79bc377daf9a32bf6828d5fb49f54602c35e82802a33eca33e6a4f478bd9e2a28c656ca48509866461ffd4991bc8a674d0d1d1e2b42aefd025256f3594b97dd8473cc5c4d2636cde50ae1ba4a32ce6ced6f8efd0b1475e142495514b8d5f437f8cdc4b6e084ea4907ea0a4aa3175b498f181bcef5e8240a697efc51b0ed4e181bf37e277601052d6bd099cc5641d0563ecb135f16752cf44aaad708401a8503aa285338c60c20b24a446ea21cd356f248f48dd410efb81c443fbba2e8132bb1a36927f4fb31ca92a2d212525a1a11c1a2a8a485b23f5775bbb6f284da36c458acc13413dcd6a169785c0ec13fb1e6d38a07e6b3179df694a66217d0275c4c01b22fc2def239bb4e57be6b7b8fca42c3fe9f3b77d38abc61b826df95751a2cbc2f23a5ab0b0fc747996f92c2e39ccaab3353c321670653e64ebf22b9be165be0b9dc1e55ffe851a99ef42dfc79cfcb29d9d214c8dded4883951a3dba27f544e9c38595282c24a75abe69aa6d1d048d59efb1483564376e25b8d4e9a81a834fd5a699466259be59fe42aacc44bac2255a31fb989d44fbc42697989a548696f5efa56ab4070575a1ab26285ad100d790fd526da568c8d5ac9c2c23a8a1e622b435678d88ab7aaa9720f7537f8a347c5c54f0d555cfcd4ed63f5099aba0dfc8afaa8879aa8fb8eae66f8154ff7ebad55cfb788810427ce00faf99175b4089350c98c65dd03000b2159478dbcb7fcbb1e0200164232ef4d1f4e303c6a726f2b50241dc2f1b7cb11151aa91be5d99a9a33a616919a189239883b4f9e00890199b1e030c340a849b37828a6b3e38387838275002af2b356662fce3910878d9bf87047bdef28ff3c01528185b110b327339e99fee3ef4d6fc4fbee5711f8ba377ddf77db394286a2b6125b23f3e4b70d7bb24f80c4138f06f2645b71dfd775ff51fef1567be0ca767cc47a9819ecd1686c891a5b9bb8f0c0096c4d911f220a186386aeea355441d2b0edaec13db00f8bb31c0dbf2a5562373e4c38ebbd8b860656031428cfaad1356860612180c244b6c6bd3722df7b55b38c98be7b23decb57756f2a22dfa34578093488e2c40aa6ce0e1f3cae184f60719a01a85ac3426147319dc0d66891099a29720aa1f8b359cf869634144b584bfac55070cf7a36c6d6f8f7ac972c599c1a8be335e917d146a559eefdf258bee9377025c3f6de7b5b57a6f7a9261d2da6ffcc7ac6ceceeeb3da4b5c9266c84b5b2fe996ffd2d2e2543139863206cd0c6b4613eab62125a5ad7125d373e553bfc7b589884eabed4fef23dbbec8e93f1ad48342519fb9bb134f5af1cb4ca07ff14ee4317531b6c65fd290a99c86f850b358dec4a57295c5611b2cce149cc3bd0fe11a3e12d8c69fc1df1ae7236c8d3f539949bd93d450b452b4f546f98bf83951cc90bf78b27decf7daab2117797c014a51d1e2a0166085d9af6a500828b0a28546568cdabf15bd00e5c88c553ef73f24fdb1de6aa9ce5035a104e42d4dc8452626e296a3aa7b0fd68be52b22c771dd640ad7ceec44324e10d560c316ee14efc4bd9f780cd99e33ad4ca62e0a2477f730a8547777f73675ccccfcb58666b91055b3b478e49b4223451e0b1340cd02e1e60ba6a1a1061d4d262751d5fb68f8d1ac06816c527f566aafa77ddb27995d4f3c4cdf5dbd1c24f3fb0f0c53deb2afa3beade9dfeff9f4dfcff6de49caa424076c34987e00e9a84eac595cec95502de19346ec7ded46d2e583f71d3b5eb862723bdadd6656d70dd0ef8ded39106816936d14dc161050102ed9ee8dd02647d8aafe3a16a7b759ad511d5be36f34232f9122427c2d06fe3670c7d6cce21f49a499446977e2c1ae130f66b96dcf9d786cdb8907db1079c7e2b4941dcb5bd186590c6c61c7d6c4aed69431b748fba8452d6a45bb928692a352aa543cdb56fca805ddaf728931b5f86134751169b57fde166c0c31f97763de92287d1122448af08f91d37b46beefa51de799c358a75f92b12217d1906b9774b458f17ce1efeeeeeeae0d2b634939a74af5bf446866669424099cb8b6057de556fc1f5322d4443dea13ba56db9b561b95ef99c0d5f6dff6db468b98be4868436510079a6675200f7bdaacda8a1f69c5bf490d549afdd674d0bf644d8a71d0d674a4374c3622ef6dce6f9af50ec66e629cb7129389ca1b24a67ffc7d0e0cc25cf731f87734d4c12be7abc464a237373753e686c38c1b3feb75bfd6bdbd473b1f68c314163d62d12c9d39da0f67aa7f642f52d55deef939d5fb3303b13929b6f157c9b04c97df599c99da55d3661fb2ea56a9301ff28f0bef12caea12ceeaa2727917c01930b65e68285d5cded2be411d5ba37d0b28e39aab744c3077e8786286aba3eeb8ba6ea8bad3c2d3786f69df02b8c918887f645840ac8dbf3309faa3d424694d1993a333786979647a2e7edc623c746851e3fa61fcaecaaec6fac5a604cc5ee625c07b36d155b71addb1fd72ccbbbbbbccccec03cd81fc581b9ad529246618abdaaff88178ac63ec0907a9e8540094c9fbcdfab56240d7fdd027523e622726589ca50c84ad218273980bb661227e1b48a653a57803cf7dd09db8d32fed9b3382faef8d30e941f507808a2fcee27415f5fdeb33a77349e6c4dcba32145df19cfefbfd69a29ce7799e4783b04b902b03bc37bd04b972bfda7ba14fe5368e934de639b548bf18461c323517448c1e658c3146f931ca788af251ffbd07aea47bf74254adb4e23c507e1feac4f2a8ff6c60097956dccf80a29f0f91cb1cd63b08780d7d6a0e5e25ed80aa863654d093d473f09b153d468ff1fbe53488fcce412985d810720ccb36a65f55107feeb977291d0c55cb36fe72d9669bd537dd8a1fe3c78f8f030a5e87e4486a9c2f98e126f120491224c6e43a3defa3214dfd7ecef024294fb3ac70c14993aeebba8652f953fdea14cc2b356c65fc5e04e7700c7f0c98029154d4ebb40efd42bd783132df2998972f1303bec36068b74481486a880ab28f7acfbf17d09f4f2cefb1cb7b2e2e2e2eef53437ed4cf6ff1a90b1a11aaac835627f522d806f53ace82fa667dfffd995e7b0f1c126b381769a180daf4e6b9d9624a2a562451dae4eee006c2b407fca16486fb45f5d7ac2f6ee6e68fdba9d1a62b3dcff49e27e97bdff4a5aa41fae5cbef972f3fbe17411824c2f7aeca20bdbcfb3168bfaadad1b07f07aeabd3f257c957a7c35c27579d3f7538fa451c674ccd33ad121784c7cd4d554b6716b34851738cb9608637d52b3355e2bd4757fcf57fb35c7ebfa4a11055e53ebec781af82c2e47e0602fd9c0e2f549d1860fa659b7d1398835fb952a51015a7e4f42a879de80ddbb46c686e1a0e28cc6d6e59352d3c1f5dc3c54a1931c33df278c7b4dfc1543b683548f7df2fb8835655ddb7801df79d0a0ce2fdd7f21e8d0f650bdfefae5aa001aeb760f6531f0306d94fbd27f31d231313f3316c8da1f3431db42a43c3fd1db8c63c4b0a44c580a86f01c3af2d3f659d3354d5f9ac96ef96140d676df917ba2ddeb780de4f904fbf27d469dffb408feef8e0017b7e00d9251b227e9822d3ddcc63d8babd1f3971a3973e95034065f27073730f590e048f8eaac816dcfa2c57ac888b7e84a44d295aee7fa8bc25c4f25e6f5a64fa43cef95155474dadb434a58a49d54b7e6c520efeae686b8d8a241c50d6b5c5f2bb16e36fee1b75393b7f6467e7d57899b58d34aeb81f5da056f9635cad4ebb2a9229518b7477777777cde0f6398dbaefba8edd1b1debbab9315215e166d67c848754184770d7e2a4dc592e4735d77cdddd571b82b34bc7eeeeeeeeeeee6a404042c25c1a6ec6706ddb6dae168744a761aa2e15a2aa38ce6816444d8ba9d4862b0d6c6d4da4b2c492ac9dedc291f94525263f043cbee1647e11c73bc093d0edd6742d404249696347ae5d17ebb812904bd0ac61695b27263303978ea5bbbbbb3a7476b8bbfbe60314ae9ba4a78991a67a8cf1638cc1d3c8d0e0a607252abcf8a93a626e00063ab81951305a23be99a1492dccf5f1a5c346d19166f4216e6c61b12df221ce2913c98a67fb01d4980561b86f19478bf0006af54688cdf02dde6cb7941d28a9a10a6614e10a71ee608afd82676b78fb1e2da78c9c2a2968c25b1a568011532ae1015309031cac3afd38c6703253d9a5850b82704105ffd6dc0c8183b66d0ab8c18cbe3726a0e2abb9c643c9905885a8aaffa41207195168d68d2be68a69ac6dcc75e372ddc45c31772188b9cfcf4dc3e9428000ac4000025ed024a5d269275430bf206d0487700d573cdbe7a85a5dc5aa5673d41b244bd1e7ee461007737f079ec7c2271e2c30986086128623338c63c030c40c250c258041081866b131661849304309431031284000cd30fee0430f30fcc49610bb123b23968598951816625788592156256646ac8c58156254a83043398526cc304a21c684d89458146250882921f6849894181951624e98a1bc39f188ccdf64e77ebfc98123478e1c07b8e1b2b15153c300390ad06211600002a0c911000ae6f81772a8646260523972787302beab4d43239535963ad81c4f981cb5d5e2af0ba1edd220cc6528cc80363b989c52f1e0d97eb9a836aa4e83528bb940f038a582f9c5a5b919d826a8b85c37cb6d7477773752a10d8185629527e62d33263f8d8e984e4cc73da6e3ecaad1356a2c165b72edb535ac4b49877574474bda298e757deaf0bb4b676773de7c73cd9db96352ca2ddaa21063e48f1c9963e418636466ce821243380942be7c2edde10a5d747d759e309d7ed17546e4333a2abdc5edf4f0fcf0cdfd7ff0f420f1f4fce0f9e1030724a4f83c8fb448fc53461939f0bd79c2e46f245e386bcb0f63b095b9e4335339a56f344cf949f94d3919082808498c31c6e8302957ca8d0a25ddaf4cfadae041ebd8d9e1c3c7fa30dab1e363870f9d98d18e7ef980b2b3c34865a4325aa3227cc082e5b0dd90f56f2305373d147113589297a50d1bc81d3c3e7ad649cfff7f8f0f76e283a7c747cf8e0e0efd6a293a48f1e1e4df8976c4fd87c9ef3412c186121c5c6c8cdbead76ab491c5f4671e19bff8b1582cd627a36fac71fcb8c7474c92deee1f234b13232a6d4adcb88026da2862c6779a57ecc10a2ba0c2c60473ff071c552633c0004744a1b4d42db9b7a4f4abbf593e4855350d4ad84242dcff38fdb7d250e04a5b6dab2db1f6018bcaa34ccbcf6479af4fb55fc775246b37c76aa140b3988ce58390b20ff59302c50f42ca58bebf4d3494df35fac6bdd7696e6dab73843760b571781efd28138bc93c1c9cd1691cf4c7bade82c02923cc8f4a0c1145255e49d33f7c21a1259cc352e3f3139ce3aef7a9517e441cc672677b8deec075d563dbe88afbaddbd7f83efab59acd8aa966451ecef19faa9966c517520d11092d89ff9ca37d7cba38b2002c6c01db8aaf52bdbcd4f0abe7e9b04d7c1b38101af2f84ce4424b8482f00212932bcbd788afb99ed53199bafc3d68630a734a2bfeaefe58ffb3fcc767eda9e21c2ff6c7bf45e6dd969999b5cd81aba6451a75ff5953e55ebc80c48cbfcee29c53f5afa1d33a382b0a5373075fea6a77e01a9bb5aa3555b862cf72997a57ecfd59bcb3699d248910e74417308c7fb8d5a4a578a2c6671faca8911a45258492fca49e309224b29824c94eb84f960935fe326ce3167fb848903df4d6834eb37af46baf759224499224998bb3712fc40492193d9872c552154a5124c50069f6d3ace82da9107be80d3f2d16718e56e333160cd3e1567c980b1f67102afb60f5213f6961e6439652e3cbf8a30b9448cf502d52a73c537d7c3ec239343e3e13b1381f8879993f81f6a80fe5f62c1f320ab89f1f9ae4b77cc829e8dee5c3cfa402ef531fa23ef03dcc877c84731165a270abc4e78161bb453887068d4fa45f2abacd42559515452aca44a81eea9aaa9b7aa84430028a2afa4f1f9f6fb03839a070b03d8b15dccf1cc86ff9f8ac83c5c9c16507a67f29f23e75c5f730397cc0a7cad06d6bf863e83e0cd8c9adf17f013970d34016d0b7c61f05f6d6f89fc00fe45012111111c56ee1e3cb6e61b265d25081311e891ea744c1094b62288191e4458c417416d35f0e3c7e9e718eaf64a041e2f7f3125715f974f150ec8807cd9aa5c36d0ebe8a67fc9d9438bb3454e0b79675a37a04e24f90bbbbbb031569160e2b568cd8c5e11805db8abf48ccae2e1293a5ee7b1e3bfcaa86c3e93da4a8bd8c204db4ab818666c5af3e4ccff5d9a069b4039c13bf39686be2bfc298fda737d5f56fbae27e340bf938c15c19939ed3a3e429744d000c23a713c7bd7c8e0259c9c00591b32efd11638cf1ab21dbc4df6807d826be80c4f4aa4685b04d74c5162716bb71a3d5025d350685ae1ae4faa88d247c92383185164ea0a045932059dc2a5cb4808c2557e0e0891bc8e2e340445b23974bb68906dc473671dd9bbaeebfe7388ee3b837fd07e6c043e538990357ee5f4062bad47d9d18e798aa8e1466e8aa526adcc7869d9ee35e4e2893fb0fe8f441bcec449970d444439f6a7a0e0c5395ebbe5fcef13e1a76affd09f4c0651b8e6f02b7ef5275d3844487a53c153d653344ebf4eff4bb625e6f58cc0050994a04098acf4938273559a294482c0e72e962a59ecc9de810e0a8ce3f6fab254c0eda4e3c8666c84040fc31a859364073a3374accc836fc0ed0bee93692242e8bb12588c66c5929d761a8d10cf99ee42212bb665c31a58a1ae3af8d294c3e121f8795189104c5e725f139283e270932fd00ebeff39f296b3c55ffb83832d6d4c1e92da0b975eb0f53e176e3930924c46165f2f48b65dceff4cb9f7b95c3b4e77e9d7b710e3ff71bc37c641caa72abc44ff091f100adb75e035ddee27e6abf71b408d57e651a35a2f137ad21430761552948f9230054e6141f99cb6f0f38e7abfe6c04cef99e708ef7dc6f7f7aef4c9407a8e5e5c39ed140e404ea0032122bbd802aa992a1e4aa20c2921fd9ca989c7e654c563dd80aba92a1fbd39f681026da5a7d987cc4391f0d95bcbcbcfc0be58189f72fef1e5df5a02b193eef3f9a835fb972a2abef7deae99de3baf7e18273b6ead02c229ce3bd3f5bc1433cb08dff067e1fb86cc37f029b6d3807bf8e13e6ac5f414eff3d17640b7903431dbc6e1f64fb0f3cf10686928714336424cff70c0eead609dcfa4559908d2fb60c334a0086951d9401c6139900a0d08415bac0011144f081d680209e89eb4e2ca7ed4fdc7bdf7b1e0dbfe728f79bb76d9e89eb4ea8cdfb8e3bfd0686aa6f7aa733ea29d4a1723dd10e7c75a341ba97f2a5a77d7b8aa1fb0f5c79bffdc979e01c8eae7abc5fb9523f1af209fcde033f707aef17042fec7cbfd1f0f4df7be0ced6d3fe706ff268e813a6eaf6de096cc981af54d4e9db3e34ddb05b13deb05b13b2d4ed4f7be2e15125b397bd6ce5a07e6db0171abbe5bd7ba8ff3a10f51364241be524ef6ddf076ed010f36bc848b032927005153680419426ab841fc0200a298096b0c18f3f0f9cb3d589f48b8586a6d7a15fa6979657796bff05dcd5f63e32565a6d9407c847e6e3042e1ff3963f939e1726ac17a41770fb9531f1be884c862ad3eb0f7ee58a8c4990cd01ddcb16cf034355dd13cf7a8bc63ad49fbe0141b647a158defb664199e84db316c9f7811dd39f7e673f4004042fd4130db73751d37bbffb5a9d7e2beabde7130fef8b66d950627294930435eb6668723dbacfc1af5cd940eeca952b57f88b9ded4fd48523939342d37bcf7dc8485f540f94265007dbecef09021dc5619b7d4913c036ae66ed03e9619f2a1be623db361f474b4849a85ea9404a541037378722db6adbb439c5ddddddddeba64530c6186560a9fd8b1486fbec96f60ba5c666d69a9bcaade918bbbb3b0641f62fe3222366669927a1a1d9dd5d9ac5e16ad55e2bc275d3215c3882530f8ee39adb9ae3389f1aab772c32d25ee02d4de8e9f42bc66e5fe73bd0ebd8fe1287ea34723d664d400c66fc306adcee1fb5e81fb5f6f66fadbda51612f9bed4d788a9685c373a8a8c3ac618635ca422efd4e3e5abfb77463a7b0034981a8b8bc050412aad6aaf83a86a33553321b1aa76c54f510d6faac657acd03c7677779f64e0aaf64e8427251226901e2a1ce02a3502130863f211a021cca01d9a631827b839f2021c55b8d1220cee066fdad52ce6e5756f6fd7da63edee4cf33d3f802c7333737312cd7d7384c9df492d18a2956cb05f9cc9e06dbe1c4310edb7ee6a52b4e83e9130b9d7847c4c982be5dc7e30b9d7e4aeb6bbbbdfaf6dbd8171298aa58d4bdbb631d7bc849716a755bb3d93ec31491f99f60ab0c264216f45284a50fad54afeadfeee5efef61e7f14f068c84b28d05116d2e9d8d6d49a336613733fac51e517a754b1126899f731e6d26e5cdbb6aba4ebe86cd06582d9bde97dbab66d93db6a15810e0888ee3d0a8469db9e9578ef710734c8224551b471753f72ceccd2d4b8792036ed3ff6cbbd9bffffff976099ea564f17cca4d9734e9e9cb3dd02eedf55f4ce5ad8ba5cf34dd1c5361d5d2e971833b022263f0c05931f1634f9612798fc3022263fcc04dc073b32f961434cfe602598fc3021263f6c36f9174682c90f0b62f22f0c88c90f039afcb01f26ffc27c98fcb01e5e3a548a739673e4c7360dd3301fec67f2bfaebcce98fcaf2cbcacb4f0bdb0b0fa5e579833dfcb0a937f3967a6ee7b2a99981994b735fd91086f8bd395ba01d342f5ba8fc154f54c1f83aeea79dff79d3e0665f5501f83b17a2ca9ea427da17a2d73b2a04ed308fbc22e1d3ba7b9d9a6c54377779688da628c3146e73e4df3a2c9ddfdebbcd0dddd552a29e9ef0b13eeb4a13eaae57c739471466f59efe5db538cfc4e4dfbbc1e5d5ebe1728dcdd53934610cede9c6bb1456bd96e70f20031759bd560b8aadbac064398da6078a33618a2be06c396da60f852678b97faf6b434141233c6e46f21a9130ff697afc1d0851aae22dbec73f5eac1a450a14ff524a478e897eacc436f6cd9526391d899a677727350dbc0b83671fbdd6a14818c5b6494f79d4c1dea047e9e89673d9d4c26936b3c3c2693c9b5e839f0155e56d462d7997630ed6e4cd59ebf4f8bde2f4df540909d655c9bba6d9a465d9a877e71291787c99579a8fcde6dd73386d7bdc658247631633482bb775d67f23c53f7448a6b0040f13ae5467c7ba9ed9193cbe242b01fdd88c796aa75a669f2d88b0cc6ed889abf21cb355940d449fb5a4cdfe914bbd3a29626b53c370e50b507c88e3acdd34993c984faf673a95e35f18a015cf9bb324c4cd8413a96f94d17afeb561ae8e26cf962ea7e4431e774bfcf60cbb2344dc6eefb4e3dfa3bf5687191a18b5cd8e9b7c6077a9aa4ddda68f1970b41bb70b53987b57e6999a9af39a7656db4df97900360d7a879a0fa738ca6695e8cf7279b989ad468dcc621000dd9c21380daab97da2724baed7a91c1e4a79142ed94150f6294acb4483c03d221a5094a8a122aaf748245ed3ef6ebe573271e12949202a9f1d86a542da9ca1afdc948a24a1eac543bdeb2e004e6b879124855f8f852df4cdd8812a5f6d330820a520d9c50c2063750410d8a28c1132bcc6e009485144270319ba08a720219d9105184a8e044141c4491610a25328e18c20a2abc904501c4171ec74898231ed4fe5494217c504609a2a0a207339085aecac3145688baf8d142c90c9969080846d3fee5c44363172327fc50fb5bd893000a9233ab29fc5c82a208b59fc527882f9e98811432a848b1d4021d0c018a2a4b5ca10a0940c21251a43ce1028a1958200c29bc60ca93283d8862a28147c9817482523ac90b48c18ca01d486185143e18c1c4193f48c1628b2dac38143318820ccee584a4967d3aa8ddefc91563698a1c28618615491061937eaef003458913b2c0820d23218ac045942d66401416f10324883822849312c8927e30a92628841044120bab5c66cc50a55a1cd38987731398a8fd9d4f0ea45005165c607414831588400a2394a8d00413aea002930c8c964879e2e15b8451fb3999a31368f1042f8a4812e4838915513061450c846a607aa28b24b64d014c50a2ca052031c34f353306162a58635c1f2831250b244800842b84400329cc608c2e8c9658420f64f1872906677c4e0f20c614d22f7e1b54333e860b360c283041e5092ca87cb1c411164064d185135c44c18127692185d37ea96fa6b80050aad4ee2ff54288ee91dbfa9d8b313a07b66cbf5713a67f8c9b16abc084a5616ee666e69cae3ad7b2cd8adfaad60cb8b0d386e1c491ba812ddb530ca81ae9f78232fb8b1f9f0a9ef671abdbd3b7a12122ceb901e76c1f61301f1f06fc91629bd8d33c78b626fee9b5f7ffb6dfbe0fb77722edb7d798a85f1b8d52ce498486f237a2cde326871ac6518bac44b3a2c643bca4beb4d7bef75589388c87b65525ea1001998f61634c5cc0c25831be8ec35e728a1abe34d8e20c7991a971888baae20c9134701667c8f7e1cc599c21a7958ec519829a41c0e20c617121018b3364be02166748cb2fce90d4c76c8df72fa0e95db697a0ff07ee2077983ba8769075fb16708709f3310f84ea65feabd203398aad896f02598aad89df815c83ad69c24530473f449a757384c9517e09b0b6928183cc6645cd85231a11180f45ed599a4663b8151f00350ec5d46898eae3d768d8cae2125181459888879a45c33929b689da72b34ab3e2cb807ce4adf831e03ab71c050ce522908788b04d64a943558a8e8688865a966848d55195c563eabea77dda89477bb12d7fced17e1f89738cc039dafbf79386a1be2ad587196e12f395c5ece79eaee27fcff2de48db9a1251dff33d4bcfe9bfeffbfea33ccc3732bde5275ae4fb165ae4f45c6d212c8c81bae5db61547f16d0f50263ea843199447f3ffdf74ac1e4817392d0482107853ca58be09ce61c8d2609c23dff56e75165860c249bac0c639efe439a09b12f329605c44bfde2a06691b12f4ec1b224d2d67c91d44a9d82270dc6da109a5c85f29466f5731487668980f2c036ae15611b5f9c4eeae11f8bddb8d16a8160232175232531fd9bab68403648e214b6710da9ebd30b62e46afc9e1f0e53752b3ef34c75ff3c0261caad7bd3378006d9efba27f2f3f3c39d26a316ddbfc5e5fd033b2fbffdced6a5e10dfbe10ddb0b5dc9dffae2fe02fa68566ca13b7434eb66686a130440046bfc8fc6377502a8f1b701c477c5624e3f1792aafb315715e6a62425c3765137f5b0d4c75f196531860070b292611dd401ea742bbe0dd0e4d96956fc1b23cc90558373663e3e8d854967d9567c961e2e4bed3c99fe7b5464d2028659da616a7f0118b607a8dddfddee3745d1e9aa07f7da733e35721fdfc6125303c2e4ef231f8d4bf58f3d83511dc57a88671202a1f63f5ea7e316b76621b1bbbbbbf72be4a1eda2072b358251651635fc6a0d4aabc4838621e6d69887f93036f3a5199525a0548d716b9a0d69667d61316f796f202f154dfee8f25e0bdc9bbef35ab6a7f12da9a711f330cf8111887998f7560a1893a72c358b86a01919191a345ef546522fb3270778cfa55ee67fd0785511261ded81f91668111a0ff345521f2303e73d470354adbaa7f13eb2554787f4a49e062d2253bf32554a465b190d8eb250b37852a997bfdf8469f09a28938986b0985ba4dc73ae3dbf8e4bf006eec31be48737746ffaf006efc31bbe0f6f387d7803eac31be6dfc0f25ec3c4f478a1a10b85015746a55f3d8573660b65a9d968283fcfd4492ee6b0d4fb63806129ca4343af52cd145d6f29451e72184b69b672c4c6124a4945b3a55f96f055f52f00e7d4d05c6ba1468780bbfb07a6e6a8b42d175539eb14cd08000000a3140000180c0885c321c178382012f65cf914800d7f9a447c58970bd42488619442ca10630c01000000110091c1b409163b9551ed98c769e7d5baad3df3dbbfbbf24def67e21a0b9e115e1a782e8416f7b6b57d48f145cc2a12fd097deff5743a54a891d8d2e57f635e897d73790a349a29d7eca5e5858a982dea74c94af7d8f43e45b63de070b5ac899aaa188d342abce80567f699c4e22a94d56771f786873262048753cc7ce88c530b67e8a06a8a370723acc2d4c68fe41ec6d5bcc6602e66e3cd81f05836a8c723dd79f70386df2351b416da86917fb50ddbc47a723b7371b7db83e5bfda7a361ef5ca80918648670528357df0488bb85b968c590bd10274fc8176447871c68f9963a7a412cacb3f072a44feb810ea520ad38bfbe13032688262f4ee380fb0264e23f82bcd28e6f58be5f860f18329053035bdb5d201c943af1c0b323d771451bcfc5ec473ed518bd5efe2dd2d2f6bca2cf0b03c657e4fd7d5ec6d39bfa44fc728206c55aad5af535b5f75feece4fe8d51a19734c30588d9a9ec7b3fc6e3c82bafc972a343cab48ce4f2c6774752b59bc77f7e41ca57f3fa9b2ad290e5f5fdeb10ba8324948aa27c2c9278b296b0a530d4ec2cc6d36f1f53b36c120979761998841ccd1bbdbc21d4c168114e64c1aca2a501f502f6dab1c0cab6b05e512b029eea7a1773954f4b8beab37ed17b74734b5491c21470291b137b0b3b7e5df7dfb7850669465654f33b62b83149decdd561c402249d0731dfc333832c37df63af9ed0a4030d09b98ff129e208efe8699a220239c68c5ed9a8c78f0a707a9cb7ea5670681156e05ea31fbe471efd77ea2d9999ec66a7c09afb2fda4bfaf4c3d49035950f1cc2ceac7bd2cf4f0a932575448fc057d5e56c1871532941a9661dad7f238191c1c3b85d6ab499f48d82c70b47840337c09341969d2cd9638d9cb96bf4adeb1843f466bb8698340fb582b1210eae7bca260f989788b3848883ba8b7019ffdad50e043969bf4bc8c8e2b3933c466ce1f738e6a5f550f269f004088841a684d0237cd6d3348b18631aea710e34b3527c90998b24fbe5762d83f01ea34612c09b6bdb39667d1330919324ac0fb47692e9355ae6f7f0b961901aadd5c33f8b4e9b877ef73397c376ab40d52178829fcb6e62222fcba5523e204631cf4016d311ddb54a0e90b4f2c8c7ba2199d90713986a09e2294d88a2e9e0fad835ebeecea744eebfd98b4e978939362c71ab1240e5f8ad3e380079c3fbfa9b1845c025d83c73030b9457a46b60c012454a5544efc258fb561ef68e8e63efca41cd53cd8eb8029885b21c23b177ec8abdfbe820ff3e960c1791232f17e20fe5127d1c64c985b41b0a64d386a060fc66518cdc65e174d66711d5cef7bb2e64cf414674d997244f5c1ec7ba9193eef8f455eca919fc520abb06086b47ad21c0bd77f470b709707f58e7a26f0534e95155a9f63224a7eac807e5568c13d56e3a2175ce8a17743282cb4a0d4320b336c8ac71827ff36380abe25603eb102023d5c865e1d56b76f6fbd638142ff74e1e32ab9d790c57b57f30c5930320ed6c136c69500413fe9d89c5ad94a9139d00a18bb5b5037fe9ba9ef0cc4aa1cde81eacf75c466148890019c503cbdbd1b107e44d1837b7a33dbc4e76d45b8f10378fb80ff2d16578b7dba6cc9ff02afc8789d0e6337d09116d8a9185a301b91f2402da6c553e707dd651b5db2d2b2103d6fe048e7f972048fecc6c186a0871864d6ee00dfae7eed60661143c8d669aad017ead43a54d7af299d102d8f68a5b606e43a8ae1dda702a4aac7e87501831d8121228b8b63022b1569d82a24da8b9505e7fc8cca9cfa6c2e2a02e3bd5b3e393b3ba1b503153dece15934015085c788d9d8e5d9cd0f05182449c81fdaf52fbe20cb1ab40ee1aa0a76ed786f58b4c85593905ef3eb13bf3a17f20aa6686e91aebeadb8c0b3db9c52c8dfe34506a546ad45cbd628332fff195c7326ce6a82899939f9317625fb0c273ee4bcfcddd40215fe0282115fc02fdbc24db7b02763e382278b9de87f3315d8fbf050fa8291fe7a4e1d258f9e48e57621c62d7b0326a905769dd31bc16b510749639a2860babfd5ba5e95a710547368655e5161954135b1d29388c8b2260757c384f118756859ee612ed16061474525821c85632bbda6011de4066dafe4f8ead9a07a6cd144e20c5e2e6d5a0df53ebb8ea3bdcdd509dcaf872eb9fd875f90efbb389a8b37844ef3a5cbf72555406130f18384341ccf2cb99d484d91e11d64cbcc358a82426b19f95cf5d0b71c21dc4f79498db48230e51e1374b51b083f6b1a08788fcc666ed2e3fe60f5d0fdd1fbb370d0a0bd380d594713391457d0122acbf809a27f931f430da415c8721cfd225b2c84449c8263ef762bfb69de2fa7aa3c9ef844a5df40b907e47057f796c458c48c4c9d08effdd0963736edeec26d50c5190c3dd66d0ec378ccd22f46e1006b124d4ba3245080331e265acb929d6ff82ff005e980ac4f2729ae3349760e86dfad094cc3efc86337d53551b80900fd2f285bde2f103fdcacc612d7f9bd0cfd97d2d5330b27288ed8c58bfc9df0066ffcc0845db121a18eacd47c20de9d270634eab27d41ab26366f6c785843909ad8b39e1d26ab5ed4d04aa17c390a41487cf9627f63838f38a20f3910405b35e6d62dd4e3c29965a633d60138b04fa059d99f968e509865f67be994d7e3d0d5f2e45252c49300a5eee88d03996c633af0fae56ada28db32eabc4a87f5240385b6b4564c9f5eb8a9794238a9186c813ba6dfdd1ba4bf0df12d4b7f29507241db2d42501f1dc2569024c32b03e522564412ebcdbd1c7566620f6374b46b8a64a34bc8b56b3fc3614af4454e29a48b01324724a4832aad425226e2526bd8da4d96280c24a84cc811c756748b046a610f46d9803ccd88b393ee53ed6015b5dcc81b7d031f803a82b756868417d9a0072b69e2d92dd4598280e15d244d3d045e82c22426ca42b20a4718e21de249202be4bdfaf9d6d6808ed431f094e011774f3aa8bc87ca7e1902f2f0e798629bde55cbe1076eba40a33ef51ee718f1c6ad4d8d18fd0410c8001b837aa38f86043abea8615c5eca52951a19485e248f8d31a1a7cd12e23041f1e30412fab9826002ff7748ecf526fc335598f7b888e3ba0f995eec93363597e01c35029f1b98554e5609cca5812a4fc48914e4629ec6641401b98cea0a5d5b58f3371ae4e4f492ea4def4a7bcdc31ccdf13e90f7f0bd2eca2cf6c1dab1bd0696311b3451d8cefca57b9731a8e89707d4e3deb314ace13805e56b037dcd3d203e21d8ca8f17038d68ab9e857d2f0dc3dcc4e607edd51cf7e78f8e0d136fbd7935c94317d26a45d09572c90f5d98f800fbe57ff10bb91f3b63fb845d6e734fd56a7e04ef851a0460d2786bdb3d6a9857931d8c4149bda60bd4f973b11c6e5107e1320b81888411a276024a068aa37a469bd1953a4c2fd7130233497d2efd40492713ea7967fb6e2120fb83f2614082e77aaa20127e9f40f270bb2530f060142402fcdd1e8459a2a214024bb20f8f7f9df1af41d34cdd37733486783800443e05886dbf40ff24854789aa6883a0ad6666006a3d4abd229e7819c65e04bbc003db109ec6573c975631223716fa01aa86dd115a3d0724b3e1617c044127611424881c8bcc3c3a708f0f93358cf596e499f8974805d03065120c1d16bca7f95a2b679cebba8f0848e72a50453fab75b27eba407ad0b5b71f459072a715fca0d5b22ee8e8062b405d0033178b19f0e2e782c8dd56cb61273e2fcf54ce9225ccb54dfc60c78445c2276a75774d4a2fe774a907218d89e40703fc1395482a458ed11bcaafca04240ea2d69857e01992dc11a510f7fc4cfeefc7176187aa83a1ecef960e174b694663251dd7d98ae0daa99361fec17e9d8712b9068a7bbdf4d987befad6efbc428fe846ccc1cb49bb8cfd05ace50aad173ec8048c72a15e24d5d20e6113e307ff31145cfcd058a06e3bfab76b865ba066af9a9ca9229205fa52a3b37c0854f804438072e84a053f10f8e455585c8b371fab5aa3fd4c4d2d3d4401ad29b857bf88d8c3eb01e729fd767ac660466a2e3843faeda9e98a4ea5a035bd669ccb6ffbaccefe5520f1479312ede3607864bd4ed902066d86f06875e2894dd78b830d56ae5f03744439c87a4608669d137194f7c5f9feae11e74f1b184500c608618a4472f170a246346a792336327c665c13b3f82abcf9b79341ee9e71a8070834f41e58d5e98043b4322d4c28839495804c26c6ed220908ba8d9d790c7ddbe566ef69adf0041030b0a088e458812519044d2a499be8070702293eab277dbf536102d27e7d91702a92fdeb146e46101127f13d45330a028ead79ed09e8e13cf49e70b42d45b7cede0e1364806112bae4ab2597f404d1adf96b5d5958cdcfa4127fa968edfada84f5e5fd6fd3ed5e677de045d5ca94b0ac229307b56461305791539317a91f1847d119a159eab42d6c02705bff4b80a02f36bd52be6cd794021740a385a8c35553af243470947569f2e8b046d751d5baca7af572bd42b1518a18cb0a46cc646c7123fb76d7cc39a86d23da74c0ea36960e57672cd48672207513c48bc97d3ea631244d3f97664710c038ff16bee3889d4ef98b097af3e48a7d22abde3a7d6348e5741eb00e2480aafb7ca43a7729eee7acdf5d8cd37a1db3ea591870204fbe23e1e796528b6d3e8150ac1707e78bcf1ffcfd6f81af4bd35d6d32b4c8f581d95fa209a861d46e5e6c66d2485d982142429837e02eb7898230715e3651ad3c6aba53042c6c19e44bce40cc214383fc4daf4510da9e765cf8e947da8d909c0c2bab24b39f4112df47b24332f60c20e53ddec8c4abe1eccdba244039b8d02d4a28f18cf3eb8a3e30e7b1cb3bcf5d736581691c7410b9f419b3e6b4fb00264405786e01d1361b4980d9c5daa50d127a4b5b9d02b939f92e96d2ff3189338a6e5e152f3150d9b483faa5a364d883cdb3acf930ad848a149b1c0a12f1192dcc7f14144f9864e66cc328f8a8e98163633b08c213ec4788a1cc5601303e969da4d626fc5edc68aafa9f40c24e34bc20aa0a760e28b3ea745bd860372871113455dbc2a7b167d5ce4acb6621fdd085e885defc6c6a183b478dc6a0debeaee59bab7a5baf5565faa2250220291757a293bbecd87ddc1dd52df0fffa7b53764f15d29a81bb572533ea41ae45a6ad355454f5ce13b8a78af78d4831906ffe6ad22223813cc89999d901ca1a41cd4cb9004375228b8cf559cdf98f9c97b951a4504badd94e2aca27368133d68e609ffa7aa409c58ef8a244a119f3626e4e5842b54f9e9958caacee0af2356561293cb42c4ba169ac4b0bdf661e5c887ea2f1a6d1762eb09cccc7849741bc853838806b329d8f2b13952b49645fc6cbe71e73bb12d9746557af5fd9fb5489fa54b870d16ca9ba7f18a6a3c2bc744e35c9cf1ec74c232867340ea55cbc8d8fc08cca8c5d97fb8be303e237a590a0405b47c0234fe688c667402367d66ada7380ebcd4f665512dd7ca7e8f9a133f2e07714aa8883f173e85df2b2b4abe266bd6ce70d2fb02ee337b87c6d0cc4de5398d5050b0ef159cdb3f1476ac6a981dec4f2ca533f472aed91c3b9afc37b93b86a570eaa76af9adb17113c4372ad3caa45f78a72cd99681777f39d391f7a12b584bcc953d52185e03eb64816310a7fa42083549bc2c1162e15c48c66f5c5e52e98879cff3d327f51ee4d99717941609caee4921d463aa760733aa05531d5bda5f3e1b391673111ab11d8bad50eb32734dee8411e03ffa78942ab85c60e484eaafdbd64bd8674a3e1a5f63897266595e45a96023a0912ae192c092566c7688b9c8d6428d33f1dee391d819f5231bb0f2d5fc192bbfbae2b5f20b8bb222bdb673ca0d1ca010783323c8715b680c0ce4d76504c9f5e612143ebbb16a15a3cc35a7c7149a9f3f6c2185eee67899c59bb32522467a47f31077fa42f76c28670f8553c5d1d8fbc520b4de29e3545c5f950e66c854c02fb27a3c3156b4aa9f334bfc38358d56cd55a1082111af5e2030d4f92e253821861ec469ae1f8915875e3233eb1c997836948273d3ec822d283d76fa84bc9dfc30a426147420485ab30b18fc0a3e04397015844df6b11a73cab8648c63e59342b96a2ceb570229c5933dec115f6f5040088e1d1f233002f21ff43d658e45e1a045f72d882620d997911be4a9aadfbcc0ff29780663c210877eabd8b9a76ce52780acfa0841341f156f022d784fb9b42a308b3795a470467edd54706656637887eb9f722a99a9a3a3fcfdb112ec2fc272e46510b930098e4c4b47260ad9d1d66a76951de51170910cff8f10e697fa59d9b88eef5cd5046077c029a218779205c0f5908f73bb4de227b4b95ce4729a3cc291c991c26e97f111b06e97df7d4cd3706a06a02045fe26fc54151c01394cfb37cd49a5a8ea4c8b6f1534cbf7facb3891036656334c6145090201ace78238094dfbf803107ac6258e44f73086ed68a0edf8db2ffe75db1c0ad0cd5655530d035d95f32a792f1bd7a26ca2e8de477dd1c7200b2cce99d6c704d48ee515086f871cd3e7eaa8fe48fe559f24446ed6a44d1a4c898bb8e89945ff0e2a1970d4810ebb87ddc33ee9f87384bda9a8c80bb057e0e4d7b2cc77b4dfb471a84e334b7c47d14b9081d485b62e8ba429d0f726c6277f86ed76c2b6f5eabcfcc9213c21928081cc0d981b81cdbf429a967ea41c89f4079aff0e1ea54742304294a3a2ab46c8b37b3bc9ca8f3364494ee7cc177831de0f26d065656415a06413b4f27893f20eccb9234034d1cb13543225b194e9e0d0e573a6e2c5e076525248ef77beb6189e239def236cdee368191467789e8260a71a018e478d44d8e2e521a91d9e1f50d717a743b183cef1122b5f5bd1c255a0b1bed3d8367a22d6ad54b637300e5cd808e52c464734a2ad874fe37d0c6e1490a7e76ef1be8e34560be0862d144c319847e8c9ab7ba89b7c48f30eef64fba88d84bebb1a3a8843930a8c2dc965ddb32c51c3bddfb481a0d98b116def393af00912bd830589e5f057699fed9658e66cd153cb3d9c370e17f7fc377ee9611cd8a5e818d9efcb105de8fa763820f763342c2b2335679a2c1fd47de39737505cec5abec0e9b04d0f2dd476c994f3b9948ced2db7192ab604a616682bc5d76aa01bec6673a3feac9062da82afa3bc64921a9f70c571c1b33ebc24a8d57d1f5cbba8e774f6f81f6f5e487406efe4768206e07a8626bccfbaf945f0766550562a9d1011be8e51902e88d9403b5aac7e3933aa41d43db805253c472cad605faa4c6f74880d58fd576fb59ebf879d62529aaaf9ce68672a2af567984f56a006831835a7918cb1f5c76974206b1218276799dd6c1472e54c5ed382c1f1c94b05960ed783f7b037253ee3c780275b5f15a94be48d90398d16cae9d5c59f3ef582d0d1cf797d37fb31b3cb50e6e495f2b25ab0d40c251aa7cdae5af525924e7d24e7e2c3b1d21c309986bb1bed6ecb8a55970d207a4c6c7a6b06b16da7b6074ede10bab972442a1cbc5239e51d893fd01aa36401cb988a8a102955879dfa383557f5558ab7fdba5be959502a8b00370a01a900ddaa14e0db4f08445b52cff22b47cf40b58d563135fabb052b4add1737076d639017d0a7fcbd100a88482f4f9ff18d67fd49eb889ba42411532c47a04cecfb1f09a6d434d3f7d0a365c8f20783624f9c05bfc4d10ee0dd6cf75abf7a37bf5170a81518b5a55adfaeaaf042eae912fab3850df92235a3e36c214a72dce45367361e41a4c2749ef272010c27427a9140a153e203937bed03cc0e5eea8aec73eb552eb3c561e511b87bf80ccb5bda9fd03dd08ab95468bf14eff7bfbdad8de303838e63d10624cb99af91d2bd36e16632e68dd9be51273e8bf6a831a9ac44e43a2fe6983e1467b551bbec1856937324ae22c4fb2f76c18d15b3140d32e2d5539711081bd1a8b4bdd63ac98ae596083bd3f3a6b5fa6d53fc611d2a08450e33a5d52c513d81e10e4bf352d02851d7b00cff3e122786cbb40a13df6b36d2a0944162ef2a7c00b3024f488f8a6ced1dbeaa8388b8589ea5b4895dca6e7e701db44ead5bad532c6b491a8067debeb808371079da713777c61bad7c26c9370151f3cc73f0e755030b7a70d58987773ed9fe26b69f50005f24cf9992d12a1e0a24d4f9a8ec37d88fc11ce6d55ecc41436932a6a335ff29344d634a701978b9b561cb2d0644ce15c394a025c31bfad0018cb7aa66cf721f44f6b22622c384493c1dd112c473c514d08225a390a5e65a3009cf977448e99f9f9ddbe182b967200fbd1dce112a0d5e98b80d1a45e2236dbeb7f3cc6e726bc53a912089e15008a3b14f47da5fd9614ed7717f6eac49f8224038bd4e0050b4273071562094c1389884f9f5dbe2beaed5cbaed27f675318021de2edb3efbf9205be8ccbdbc1a25524439b0756abed5e5f2c1a64a9407a654e0d5e7ba33049f07f18058b4d5bdccbb62a63cba52c752fd289a2e83e3d0bac97a3437917e62598f39840b5580dd7f4dd93d3cf6f485afc31290d42bc781c433f5df9cbf9d81b8cddebe27d87469df606c01b83389e52ba51ce0cb2fd81516072ce7898f92808950d63f3f73f5930a7cfad1e21637fb4827929401e66e639697bc06f0060c9bd9fe385fd1c9147c8067bb0dc58e9e3c2d70ea67fc54efed440354b1c9aa19ec86e861abf5cf4545f04c917052eddf46e71bdc737ada115fd68906a8e3056dbeca11f3ac01e0bf980cdcb49db3f4115c2aa447e26856d0580066c99417dd6bf51f03f16aeb8a7e4736fd1e7fe5ca67b6e1dfbd0820f05066cf7daaa00bb7392e0d5db1f581744be14ca11ffe0465b03e711fd5a278f90372d2351ef2c2f1784bae1be838bb46a94d4f2b1bcc5b84fa328beb5629f0fb6aedb24c468b4fe73865638b3b4a271d63aa2bb04a7594ca82266c6fce6d3a0bca416957c0368c18be540ec4b50b8a18773229d76fffd4c5f679cf64cc321814910d1dafbe8e7699b708624293b6d54f074782848a9d7c1d15d52807413f2a8f37f244d751fb16b5fbe41f23007efeba9ea7de4f62ede5fd70abf78ab057e142cd9dae07e2c73ad0775c0c5ca410f6678644c003e5240df0c2ae16549ea6566cb978dde2511bc06d96378f5b525ee7aeb5786d7f80e4576e748c9e0a5e2715fa10caea48cd9282962522c76bc3476d9f87d328f23833c85f278400d3f42feb404b7bc06d3a875dca3070948668b7748282482a25384034e7bea66f3635bfb6b92c276672aeef00cb478016d6e7087a536a349696202981ee8ffeff0efc5d986e34051f1f60634344de04cfb21c8467294dd6784b819c6dfb5184a981cde8a8e536035ad93533ce2abb33210690c978e6520cf63d6e5dc72920713ab84025a5e0ba9b2636b9eee072381183abb7d222af69b8b5c3a6add6e82d7fd7bee0397b139a6de5674564cdf3c0d14c69916e74a1c3249a760f8c02eda8fb8390a40ba751190e3b290c38237322e5b326670b7dcfa6218e3481b7911ebacfd0716218d5ce32e45ddc4439d02aa135fb440e0d7c3d1b7a09e09f485578860dc06ab94172674110a879a0893c7106fe7e1a1cfe430e644387b1a24e10e2dc1097ae9d0ec772cb9f1ed3be167a9ec7c181eebb28cd1fbf87d7aba6eaac7f3f3f9d7fa510ec7d6e535c1dd6064399129d9ce805f88420489df336fd17282cdda256a43254e5bec8d532e9b69cd9f6d6270c7405021c7ab1812adc751a0befb952bc2e7eb8fc6fa51a5d64d3ca8c1dfaa0495c8de1df47f382caecc874422de9cd258de68b87bf7df14983994e14a85d0bb1cc437669a90f3f7421a38e9747a4f4a098f8fa59c437387b8fd811c1bb2d8daf1bc015c5d02da80a7e16e1854005c5ec25c8c17e659011a7c9fef8a45798cba3a0f5a99598c500d78e640864117d765a0fc485b1b47b958acb9be54463b0e37b134a5014e11526e54f02b50ac34321dcb69077f5fa1a2c28b82305358250a5c0ab26b83409ea6cab4d768609fa5a4d639dd57313fd20ac3c0652aa65681527857199ce7481845d89cb4fb3f4105556702dc56b2727d1f8931d04c2394e74c5c576dac1987e9d8eb8734f8949b29fc0daae39775b13467b770de0cf08b19b3d516a52eb051f3072b395ce9b1f2322d6549ce28aa941525444c26b6fc66b1047bd7d6b092b39c41fb0b47c1ca9130b088b2afd06710bb2f434df132d1baf7808fed4b16c2338faf1bdafa0b46da98dec25423599b0bd57d79f0fc1d3222ec595e9cbe4565fcb2a42a02ca6288e8578de5e255cc42f0a1359e06efcb98647a4194ed4d3ad9e9931c50f1db01fb896a90cabf9c85d10b4fa7fa20ba6093993fa3f2232246e95a36e888f4fb3532ceb03708b44d56f244db525b8e89414dfa6f43bcb0a3050a63f90706b862b77b4df8d4ff558737d9795bd74e36423f8bbecfa61b3e531de9ff08070194ca7823162b390235a6cede75a01e5a3f9b991549cdf8659b5b7452a8f1d765a5677e14eb615445c72952d1364bbd07dd44b5186567a89bf2e5fe82a80ad1fcc69471d4dbf3185b7e5652720a4c9bc683bcf3f790dae8aa8b49a91420000fbe254256bbc79c5a1ec43c4bff7e1c3a44acd1626284c076f40fb7d7477eb42d9f4cf40b756ef4980c694c0b21324ebe61a230b6408bbbf232196022940f736de7f5d8231e2060f901cdb3c6c318d59896f40a3a48ef3f33e2d38dca409e9128adf7d9443151b750250b9e49d9b263733d619f91b97e108c647f576ab3b5915618e51917bcba094f45fd1f506effa0f983ad6797576be0abc27c9ffc8a4abc21b0afbff13ce097c2ba9184fadb26893d8fccf34e56f44a09892f6e0f3089a08ed9c9b6e48754a0d36982764a03a1fab743f1b24722255420572e753e2b49afb5e4ac3748f0d9942c46c59d993ee99e96a5870b3300686c9f01e8bd2297b98fd2e9b47e90433d041d4c8f23c43440acee854753386447544f0accf6ca1f72499846b750379f2d9323266096bdc8cce4171222e8f7d0c01f75fdc7248d405a7cb41b7ff93f80d8235c9c472ed41eaa8e3d259e4cb0c99303e7972c9385ac989a530911c94ae62164338072cbfd07faae834b90650703ec10ed9d063454969182c0e604a4f579116a263902ff095aa8e74248d6f57137ce0cfebd02d53a28ef380b901d0ba181ef6fc0c878c13ab7ff6ffb0cbe35780f694b76b208864f773404060b7241139f006d99916b3868fa9d15c620d720d112000a42ca5aa0000e581aff6ee567536d23ff8b7281ae4fe00c9528ea7c1899f8b1f3eda4e8a853416fe3e82b8ea4694101a030479dc370aa5fcfd1327e9d3dc78113f6a98519a38e41a3d36f07ed1324e44337cbc5abdf329afe51340587014410114441806bc5ff3da5417fab1921f7c020cfa943ae1606b97ff20147dfa2626c19d93d88ec1f0980ec7e0cd8543bfc2c27e6620af915749143f021814cc594de1cc7cf606be1805cfce8d99aae54392ca3d144550e4d25a845c4e9db3be45ced948d422e667bd27b679eff42b7081edfafbf963a385f019ed093224c34527616a16678d5e4ad727cb0b1a71b305e8d451c6e5ed85316565740e06689d514da85fc1491b9785214da6792e9aab636c4d60920b67108146bb781ecc2a38c3fd207b4ee2898e0fbf192680837b5e544a353491d6fb3c200948aafae854d2e98acd92aeba71d45e44126e7d35326dda2cf98add39ed8c9272e02bce44dcc9924129e72b157217963b160ed9d9b406c270105620689ea34c800b2e17249c2137034cfdb528f5bef811757a8c0be048f3a980278b8a860285258ced11c1404db8fa00263bf700d0d3a6a9008b289fdc11e9c04b1c1ee03e10503e155949e795b29d82fe4fe0214ab5a935da5f90c9e358b501c23c3c52b90623a0673861405a6ac9361753c1e00200a80023458294bf3c000eddc713a65b9032e4082f00900cdfd24754dca8073f8649715efcc89908c3e69ef1a83005be23830c43f2776efa7427f716a468185a8034b691e45c71827b0015f14f98f5f6179e9e4aca13487a34db7141d696734d56d6dd92e066180b96a009b48a5a2e41278e0d0702be034c8dfda80f6ce841dc7d1b7b656c197eb9517465314e2160ec583d5689cce9217646e176b5a18f03174c1814945ffd3a9bea481ede27f4fe43153d00d571c5a11d3c4fdf74583072fcec06869edcb3fee486c0698063f824bf4f80d93d4c0d239518cc5905d0e12ee18d2f9c8100e9bcd21b32005d96a94cbac2aadc41880b4a03444c920af1d90d315be7039de945d8474474f0685ea09562018ceaaf306350c8c335e0126d9f6e36d5ae98d4d2a58a028e1e8d2bd9472fd6d6480cdb7c330b5f00429d290933d3d3f2ef925b5ef948f6a1a9c952609a956d39e1e3667805b496e7aeeb21e2762e543c4ac52ba4b5a23b1e8a2ce11faebb7d82b2d3da7ec60ce2006cc1f74fd22c32a947840056f729d018c4e2e0ebfa4f5cfcb82d9d7110decc17e8526dd21c44c64ad397270da39adf4468b9874601f608a000cc7471a0dfcf07dc0bbc3491f06a4320c7796859dd035fd6d0a3c95c3dd8dad98848da817dfb72d2df6072e6e301e768ce2fe6942f31bfd974c1cb3fe251cd04a8a0b06ea7cebd6da2ab0d1a821056b4f1b9462ecc6d30788d12ea0d52fa8c1cccc75c10072f84ef9417db944f3ca210f5b8a266cef1efe90ac025b9e6e6cd45f3b93350cc2a9cdb1d8493f052985b7812c5281ddd4566cad610f71d89d78f6735f737c10984b239ec74bb1e8c978482f30d99572f9144fa05e9f9dde892755fa5be02d70f6cda86a46e646a06f7e8a42725dc62d87f9d49073a0326986f295fb6728a5411b44e8299c90f201767aa2940160bd100c6b2cd3c3546395d85ce55a4f138b4b51b79c845b1f87db5ae753213af0419ceaa1365ffa8a687850ecfa14491b28c40569785a82cc1faf7aaa8e261fa2a9a8ec237e353e457c005ad962f4c89c677c09fb97e7971ce6bec131c7b01c86179cd0e728567118c779283262ff496352170ea6ae6fae346f6a696e96d8e4222b0e4e819e2706e238083d2e5b702bf3d411ec26313e583d601ea3125e854ff40b0460cc38e2eadaf46b19e8be7f24484aff31aab00bfff82b16c766d50f1c013207a7a3c01102fd2774d34d293f83fd1d5fcaf6584aa0edf42e9cfbc83cc44cf1453403ca3da1b1409341c2ca610521be67863525dab21bad16a0b5bdeacd84fc0ddfae77dbd70b4ada313bdc42000d62d611ec1f86d3a67f76937576c0ed11e3b33fb3cc36d23da22d5078288c1ac600b01a6a57e6daa940790c9e1f9b00e29c838da70e9f4f764d34734c37dacfd4042ef09e115f40ed6b6913af4dfa7d201b4f495f598de24a264c2e053d133b1bec45e2acacd7dd8d8c108aa7587b121741a5583852cef66861eae0505cbd3067062a7f8d3095d560d3b22cbd5c34057458380a7d03c1fa42dae75a2740e96de29952923c02960631f7f328bb32911a2d42f755241dac633f797266042deb468aaae04335bb769a40909bb7a271d95b0cad0c9b4797221f591f000b5ce20e98a81caceab42ff9f5be8a9c713e3a0b47fa1555fb71f7dc00dbcdf243cea9c3452e101ad5349505745ee218ef9d114253d50d08c2bad6510035f4553d1b7cd7d4db59674519b93f4ecc3aa4ee5b1b25582b74088c5ae4824ddd7ce8737e38f45103e7aa5d9c944895817d238406a50156fc0b483a9c3a5fb5f72aba96ea6002f90b536faa1982821d33b74126228e5ae2c9ab9378ca2c82e7b552802f4dd2e4ae317fcddb691c5b17fc89efd9bcf37be5ed221749ea45abf994c5be20da0b02ccbf6f083f707ba7b2ae4193ac8106c060a29111ef67efb9c02a334f56c7dab37533f75eabcc62b3c9d8145474a857932b77984745798c743e15286e5f5175e849c70bd3420a0282e140d8f98982dfefd0e8044fb7258c89af439eeec93db7feab8101c908067d1384908dd0708b310664cb2df432431a0fcef585478a2b06636fc4c69226f45ceffe9ebce98e4c9815ad858ec0d057ff35b9928f3a56407fcb712be32898ea45b9bf07cfb45ffdd76bb3a6b1f7625c3349c48cc49f322c75df108ebb02bcf0d8431f38724f07c52ea63d39183e25561a113fe470113328e5c21dab7611e0574985cbace51f28368f5f16906da62dbbf4a2b59b820536e1cc51c3186f4b124860d2f8fab7b425e3d69993757e13e1e858e3e8fedd41704b21446a6e3ba40ad79f0009ab3e47ac07b7d5eb8c1196bc8d5f7ba336ee922f1901ff22e27c0541e8bb1332ba3097967b2cf5a25423c083ef49641ea40827d6ab54453b6f391b1ef671c788afabc53784004e0ac3055b7404c593e51ef303786acfb66eb3b6fd18c605a0c24a321d296ae1b1cf4c828462dba46620726a7300cd7c0ac296964519230bfac14caa3b5e55e1ef81feea6f5e44d5ce82e5240968ad1d73013bff8ac051dd08de376d7490509a5c70fd73343cb4a7f9afe3a410c3d29b5233f0b9ec5dc5ef05108668a980d121235196b25cef934f97db918ae2b11805a21c60df916ca627d250a8003638e56590ac28f393f809fc7fb243cb4db18b73c10acd69b6cc62f23bb51432b1167d33137d9710c9941a32ce27c8514908406e2e1e4a4b0070790098a812ff4c03651ae3baddbfc0a34dc3840fdc39700fcfd985978537a1760f182da49c74a3a4b0798a2be03ca633211ebd17c41d63bc183eec26df59683f385a2a80f90ef1d93add32b09b6fa930a59c5bcc2ea2a9e7dd2da603bd88a6ceaa9c0ad45efa70592a3c2c514be4a7cc03e2942d13fe37eb0c9110f1ce94abbba3e3d2143c4e9a04b45113bcac509018ba5543b1e657830e9287b6a18e51eee27d6498000187c126553eafd6b1329ebae9f514c6553c28acc94a64a1b44b14aac16d870038b232eee457742e3bca1a3031689acddb851f0b5a85111b7311c0514a6814c01f9c594999072d3096b7d505cea4b4994e001705a6cfb8ee6bd14fc6cb496df24466d7bc0fc60c6e0db1df59d92989ffde46abea4ccd212551895f91d01d1b33c49f64da1637988ce13b82421d6443b922bd59726716e0defa2b9db4992495c229a196c424375fff4befcc510d691b2870cae58dbe8e8abe1d966689f0bd9191dc599a860127934e847b249837770eea1e0a4dc41ba7fab232eec5c15a0c4f035f8c627de68d5ca13d7135c0eb5d3715c276ce8bb99eae28a8f0bc69722ed8fd78418dd3ae99b7390832fc76507939f17a3744742f381526e1c160bb8df8f3a07773ab575cc5c09baf2b9f5e07c4c6321a8f1b879c62ab607de1d2c8bdb2905645b512406e5a905719ee8e0b3d71313ba60c8cd4c39b4d0d470ecaa44a6f44ffffc1080d255d824d76979e7d9800df8c6a123d03572999b78ac3dacd188a09c7527218128a2989de2d55a6c1f4578fc10a91b797bb8e36ef3ab00d6cb123861a8acba84dff41456ee16c4658dbd5d272a37ec3cf784e2e1e3686a4911b8eaeaf4350f1af36c56a5702767a0ae4be41fb8d1b90728668ff6bd59e42f1210ca5b149fb88e5dc2a9aabb032165b717465a5873b2a0650a23ee3789c70119e1264153638e84dd4f0f57ea4ea4c69da63c8c49ec712f86501ca387d1b50d7bd0edb138234791cfbd7717d7a3e8a914a8d9b8a1408a901d74366306e30805681bce131d43f19cca17bbd6a45f2345188b822f522d71b51b9b789b1c7c8156ddf1bc82ca702671918fbaad97b50246b5008befb786107970fbb5afb2f9a8eb7af54408fc07578b9c5d9e05c9874e16562cc22ec8504094b987337774ccd2e0fe0ab231e53daf8b17371e0ac24b98eac34e75bafc728ca210667268cd0ea9931fe2203f4b82f8c867c6c267b8dabba27f830bd3093115bb07f299067101438b11bb9b6a28e3276e2ef55fa41c965c3d0125a152079d545edf295a738eaf960178e481e202be07876257109cdb685d8ef807dfe3ab5949ff68a7af248e5b1a7ed2a46896ce3280ec961f41a14de69b1443463dfe33f67efb3dc653fa1e32d931ca564c76281b1c8b8b89c98b5e431169c223f1a55c662b2de6d512b27961bc45fa60fe0b10a1d8164cc3f54f7c7fffaf38df12afe756c98f8308afe695378b03e45d6c7bebb77cb03ecd371c3eb4b26fd15034597e6fbc3b1134f97b0b092d3ddb1a1ff6f5be9e947e03c33276a144771419e15a38be02e510c75e9ef28ae856135fe5fb51d72bd3bc761b257fdaeb5ae3029f486cf26213f33f0bb474679c46f47e8d2e617fcbc012d054ef4d45f0d27c6653e0a3e5c3de49f0c84be2ba54ff56e2cd8a1055eb3cbcdf0b1434d5c7f7d2597e561d6ba1b7709886a9b75db967fcea762c0882fdf4c447ee95e9b70bf5500d94ec7e5056290c500674f2eb519d2b782608205b261af2a0c59e20fad4388b89a394b502b254de69dbad983e56d36af0c12ea014949d4752b080a43021af12b4a5d071065719c8dc59f70208e08e9ee8184c820d2900129e804c7da1707c2d3d341d77f6ae2a17cc54ed8de049c45938a6bad99b411e6705f024168dcfac0b0413b28b50f7b47b9eb8a62954b3058c08bde5e381e232be760313a8d62073f0bbccbae0f91f3a063b6a461c7c8a7e390a01f3c58bdf453280f395f4d1e48bb29d8d9b75d35aa14a547f4ae86590ea78d97638ef4c3328124845468fff97a298f591d75fcfa144db31d613b3ce28b64604750713ada3168bb1a1ee6c07804cef098574d451465976e0b152587fe2f08b3b7402542c6a88120107d69c787e526ad9267c03c889b57c4808f8790ad481a68c34128e6bde84880286d552a2a9315c019307acc35f2589d12ed7923f4662cdb69863da80f4e71cf6e279a9e451d3d04f2894473f480767c59e069197d8e109c86e5df088c86dc07135af9d7d181daf55552aee19d1ea2ba3702d2c6fed065167260ee4c8ba5e7e2ea553aea2740745c990e7e36c0c31ccc9ced3c51fdafa552f4f077f043dcb7fc1d4087b4f56eaea317a599ee9470c9213cf5c10410d906b8dd64c86125a434042197ec269211e0c60ecddac6ff2dcae4ab80b115807f98488e8a7cc88c18052966bff92fb15c080680d9ccf4c4f65c584f5b8b23b4e024a8c55d52ce92df8e1b20eba0f2531b411428cd26f1d0f00919d86bc5fbbca9b94c2948043111d5229548966cb67579fa792b19dbc4bcc14c9cb084221c294405200cb69380f14564e58d17e7a527e855087af61a499e619782a53ec75ec0370cb2501b71b1c0f839565545b0870bf7ecd70ae34b0259ed206766776c8fc989bac2f58c495b4022cf1d1130560d329ea0be40d464642c229e80a04150c04f5897e6a3195ea6051555d19a3f49f3c456858acf5c5b18523d7261acf1a489108e73f78efb02387f49d90ed59c184c541770d3f773d695c632a676b3be7f3855da0d48504a38ea3ea643367d46c595506906255b889c4806f0281992f6dd642e3fa1f206e911c91030bf0314cf798e64bad41c7f1f9a175c7ccfaf2d197d254139d8de32d77d291e6d005e6397426c9416eb1986c252db5121f1aa261665a796d1595b18535f824f9c8002230ac194fdcab2542cb49a9463c60491e043a9de7431d6d209a6d45ae5302927936076e3394bb6ccd525abc8e2d44800fba1d600cb7e62fee7edeb9792de45601380e7b933839791e3f7fd0b2d477cd21ceb338c7dab1ed661c64989ada48f7a39db9dc3886e02a73caf02cb8c35542c6d3b950fd3f6849f52193db10322b0e03031effc7b841aace407be6cf6349013891ea3f9ccc08afd339d27c4a3d5149ddecae5ab365420c67658e42caa6c391ee0db61090a52630e7b05aa2ed9e1817fd4ec777ab97bd7c5f2743962097a16b9ca8adb77cf51c22b237758b31ff92652f0010960f809a998bba1c99d20ef73283fab9fbdee0fc3e40ee4a7b115ba0d7e331b20a59d75a86d7085ed4f6bcac9120c045ba43e53adb3d650b60de56bfbfd0809e34fbfbe13a949e2676ce226ee745a3776fad32975f01d4ae7adf0753a6b080990d8e0cec34841e7fdd01aeaecddf87d2b151d70365b4bb3831b4f635184615a15ca2c0c8fd2ba4dd1a1a4f4fd5cc9140e9e8b45f44a2ee8e1b390cfff95ab798b1926c994b82bcc98b17ff08d7fac0764da8a976eb0428c078c4222a3774952306e821fa323e844a8043945fba2cc732dd3b5d9cafa5bcaecb60502be1eddcdc969b8cf00eaf40dcf65a16283bbd94bb76a72498938a41ea504929d18a28cfa2a7eaa87061c810d6e238c4a196302a2cdc4c69be2e858a00ce4479f748a114f163f7c728ea168f25341587c225c112660324ea95e262184ecc46ce0860d21c40fbc5bbf3f7e4bb0ff2706c914f16a27f8dc047b536dfda6807c7a8e71ea723f05e2ba920091598d7e85e46760ca9d577b98c81d2f9fd0b732d616dc5a9ff79ff2342b83ffd1ff7dff7adf9678c9b9ceacfd51924df3a3be1a2d45cb406439b9d5cd05777367dbb68dd8d68b6f8c1fc45557e4863b5d538d98ebd0753172bc67c07c7aff46fc4344b81e552b93e419af640359860074308b2cea0b9c5ce242d2e7867af5b66515da7be135a58544eb4ebc2ae788d1f8dd64f29433f4fae04cf50d53762c7a1afb3d50870fe1c5c3656c96e8498a8e11407ce8e1464c39e0134243a9ac6b95f1c380136107b32de4270f791e5aaed26d25feef42df909faa691fcac41e66eea3fdd93ec4e9236a89df1ae62491253832669de318c699f8fe6d70e1408c2e06ca9a7350b65b8c0087a746999bc299d17b259be67190914b044d4fb52ffad0f399ae38a0bfd05fdcea8508fc9120f1f8bc5627c1634f2a221a92bd14ecd60011973e64bc2c7cc52011b4923fb4bf12a53811e0fd58cec288f51e21603a54efd881c1736a83d1980509643bc7034e507b012e34dcdfc51711f22e490833f4b7ffaa140d518840a706081db6ba52e61063ba206c9cf42261786b570b97b18a55817b1829eead8a8c07b50a7092034388030881536edabcd08ad464b3ab7a8381a2046e18d49d272c7124c4accb6aa6c6194ac0eed39f4d93aa68c2c7d8c1c6f654bd1022b24ba3c5ea4da4ff31e420a48a4477e8de2d9f2f203c7e8675859b1ecde1c12e759cb86d30b097c34af934454a620ea2a8ba8d0c9d3b791695ead3efe0c16ed3a7860b9e506725edf1484ce90fdf64722143fd3827b7c8c9cf49d7393060351ef028b25e1d30bca587ce79fd82dcdad4e7f9d1ffb7e5822442855e5640586c85dd3bd9c14ece4418256c496b819d5bd5ca176fc5ec036398699955b536c0b04ded53fa68a53792daa4e2bfea05d9cddf970cdf6e7e3f32e70872aa55b9d2df581a9c1bbe9df9fc80b049cdffa87855a68516552a204a03d31e24f40be34d6515a2b056986fe6095d9fb634b76da28d79ea224c64cebf4f0b6f7b2feee4c603e7c454180a206ae5e80a6d087a8da8541b425fd6506a11717edec2c790c84cf48a5d850511488a705a7aca9ebcd64b79eaa29440808d9861ded22b243f8e7be5d34dd73e5dac40069612813b97b9bbf7e04711f5b7e279fc4e0f5433fc55f8f33ff91b8524fb5fb7f6b35782b80442cf059e325c7bfbd61e716dab507c7767afa3c6b5e06be16a3c97c235b6b8aa866d751d6e382ce470660541b804452511cc7856d8caf63d84cf1442705beaf0b68461dd9be8ddf197e3b904d49937f263d7cbf63143b316f1a00cc8270edfc093334b1fe8b35ba8ab08c52e1383ca2f0320c1d6c777087cef03fdf5ba558c8e58ae14da1adfd756341a6c1cc60e3ab502c0f158cf8c47a7f1f5c8e797f1eb4371eac51bc47447a96ecb0652cc5877fd66c36f58efa849f6c49fe1ab3e68c49abc994b596c5a6079a4841b49877d4262e62316f45b86c2609a59073a0c58ab7ad58e7f0b0d871a28a5b3adc9f65aeca598b9e44a34a14813d481a657b58c33fb1315a64ccc98f19c47497bcc68fc6610dfe805a5a9073ddc4d58e316334553b1dbac645f7496d132df0777f6f6bc1c2740af80f43838bbe232047f7f647cf54f5f6bb6a3fe6e6e4208bde5c8ac3aba8016432d3c81e5092818a1397046ca305ad44db8d0d3b0f4ceb3ccfbcd6c922030d3a99eebc98bd863deca919885fcee6a09e35cafd2b856ea4d4379db71b92bc19cd6a343bedff6cba68a8efc21ace3d4df198de7c130d1e7d09ecb3a078ee35440c36c952ef8ad8a61f32bde5649889ab96a52716ed9e1dd6e32f691613f3f9dd817283310249072674b21e4365d3c8147bff9e260d0e03377486b995a856ff4ffd1698f4994cab3125d8836e6f528022514149ddca6ae53ab81f488f8d603f1bd368b48867137a83a104425fd8b670e9943d34ac4f87a01a7c5beff4b0eb93b732905d86255ca4485be323085f535409fb405f7489d4d5a1bc58727b7ee96cfd184282b5854c9d9665e9f8eead54acb8f75192ff1d64822bf9d3c92b5d46d552d44f708187186d17c11aa7ee971030da81d4795da9d6789b567cc9a17245b030fa7c450c7e5063495560c53c272fba270fc15bc5a2f9c4ba8bb52860a6e6775f03076b9a8a75b4b644f1727d08315df5e6c5850058e7ae0f47f8e51d6859a8542bd0cc9d100bed01d0747753d9fc21a7771625e30d9c885609edf66945a7de9895aaf599aa6e7f56ce6831e021a26fd000722c3c0cac91b258869850f47f504c3d1885ed8c4536e8f792dc42cea381685e2d767fc7e88d5169de239c33857270f6882a907e0b079fa457df3ce93c7fa1fb13010f43d51afbc7e4d2d5aeb14c2a6e8f73e0510e6052aaf0d0fd7bc7dc0eb679db823a3802315e9e2f080d7631f456467e3dcca31982348c5e16101bdbcdcbdf402c80b8797b7d7dad958e9e989b2370687be99a9fc5101d2234869cf5d481f3f490e94d151d6a353e9b85106ee5f7643fa529262dac77a0b951dca94880ba2c6bd57ce7305c7b87b2e5f20326d7751ce7f6863dc1d0ee2d2862517d4fc14a1e4e28c14e93e59caa815e9deac57d0990836cd379f3f7ce759beb2c31df6f9504085c9ebd3fbd63a160b8752efb18b4c53ed060490ea7955c654e345cdab386ba6381516c8087082ecea45021e856c2dd1b8a53d11a90dec4ce50409271a05f0166f2c3c060da4c9f02386bc5b21df3f63e2f40204464b2235b25ae4257f3e476a34c951a2aeeb3e62a36f0ee48f754ef4d92325ef710bb2116290c8d99b3e9671dd47f12de8ee1c546ea803e02b67748b96862ce36b0595933a4cca66fa47d8335f729e3b5e5627afad152bf1bcfd46880be45d8c3a59592b3a2374a2dda11cfc85e5e45f6d7a5a13d0ead624aad6d52f56312603cfa472fb0c17c9e07d6b9c35ed7be8b626461c6725928727295d02467ed6d652d64856a0c7e58edc60819bfebd165dc6fd6315e0afda1704d2fbd16f7eca9d7944494bec799a47246dd3110a3e3a925be26ab87218151abbd693018f73d5fc510598abc258d8a028e938221f7abaa051ac89799af54bdb5eaed3fbbdf3ae9250d1044116fe1bbbb116d2b9dd6befb3df86efb1c2f6857fa835fb927fbaeaa0b4ca08f2058c771b1122c7cd183b24f9bebaa1853ef5a82c275ea3ad972845805ef73aea0d31f7c469d18fa99f348f5b3ec40ee0256a305683d844b9427316f4a4378c4528314a051c62e6af2fc23bd030d9269012598f9e97015c19eeaefda59fed31b99970a10775788ac10af9afc96e028fbdbc0436b1a6d7aa4fcacd39cddc7d99069db99a592b934f83cd6605035abc844b88ee5e1448ef478ffef598149b724f5cf5a36a19474792212fabf5bbd8cd73b0d2869d9341599a2bafedb98366f02d410635c65332ea6d723726a9ec498ba4f00aa68efad5bd8317191f842dc27a161ea9ccf8f14cc31c65b1b90195ffd698cbbe9463dea8ca01c1664945476b87a8d089edecd365032e2f28adf6b72f2db9aac8b0bd941240a16469ea3b673052b92eca94a44bb3c3b6ec9a6b9bdbd58d0c6606c7862ebdbc539b5d224942c84cd5ad9649d9371e2145cfbbb87c96a864d7efbcdd8d6d6b87ad67b08db55b340a4401f588559dd160dd798df67478e6400ba8d270a9e9bdfdcb0db6eca513380cb644ad9ad81e66d3c3dc36e989e8e6d39fc6c7297a339f105df1f34f103a9c898c7842ba7e508200439e87c83042d2a0c33d826e9aed4088090519e8180bcc1b2f8df581f3ee61aa530d50e85e4fe0ca463530bb25ff11aa5c0d8cf1aa6e6a1ccbe507649d9506438fe72eb823cd8bd2293f18944e068d2bd0f928df0a8d8f51e5ca18dd8064ec1dae8a22731d10d8e7fa86b1dbaa0774987187ebec97379ec1ea0eff5546f2e40bb5883f51d1dc258b8e512a63159e2a4f6c07b03e5cb98f9bc0020cabb4d4901acdc7e7db10f26cdf085ce6a490c5b222ea2de39d56f980df007c4f49b26b9681e8ca0e6bb9c9acfa27544c7bb44e81f70d1b036b9c5e4815832aafa1614affd80fa93c650214f7936be6f006497bac955a7b0117d70af7427a7c5ceb3c3d553e7c1279375cc40f2e62a108491229425e704080a98eaf57a4001826b0e6f36a0e8983849e5b265b8bb5e8e5292586d5c5b5efd5021d4afef17da779ecb95244e58eabecdecdec127801b5f7a8f89e236f3d444e626f822e59832e73511072111c38aa422f2b27aea325de9be50a6430307a5381c58fa8aaf9ac29471b51e84f754b2bb8696d53d85f122bd84657206579656c56a46a81ce031bcbd2f53adf5b0d64f888177b3314fa6abaa107edc574ccb5a2588f2a325efed1bdb4ce465831ee934cbdba7bf47bbe6f9e4d5174379b579d301d93c9a565c544c865d42ece164d60fffd02d54571da523d6e742634db2eb046d24467bb17b1c519cb0a6fd6687712a68a7a0962cb134d3c84a4b37e66ef91f1c6741646ec108d8b79ba321bb4d688500c3dc9aa342d9e30f13d01e3346646617849e96e777553b2f8382bb971b822cfcdb6d39e02f8c3baba02dec424814cd6b1aa4599878f812f6ef0d87cef2660504938d1cf76388d0fd1536b5cac520f2801bd753ade9d2773ea771fdd8660b5bf4b021d05045116632156767afe0cb62aebc8cf6cf3ef9eb319b549f78d6295e016c52fb3135e5784c436735064d2cb7b9660da0e6313b3899e713fab12904fb90fffda3dba6bf36f3e705d4a3a43698d5ef8b08140dfd877df3658e005101fdb7da97016dfe0e0aefeb450c19d0124293f20e5c1acb84eafb4417fbf395ff3f7a084c8a06301f82e9d17af935b0d25d3a60aa4e1e8f772f49b4dc0499aabddc6ea78c2507bdb944881386e6cdc9223e0cd4c2c28c09a53d472339227b8279c8acae45d5c0fa72aa052e37d2da71a8cea72d3c1760779bc8c5c6ecc3356a55952806df8ddb05ce2c70b4dfc8c9e01dfbf1526455c99c9790b8e94cf807b80cb87135ab10f036140bb59d0405f0293104bf69fd8ddb2b897079cd7d4eced62bbee6f27940c0904c396975ef4ccca8cbd90e74b9e26af701e7a9ed360c382c4c03612cf76c3b21591000207d24861cdef6572289346913f9c7b1ecac1c834672d99e64335cb8e96e8ca2d7c3deb740e16a7fb8536f53f2a0f69ce0ce5e1e0342bed2ef63b31e4be6b0f0173b1f39c2a1e8bf0f3fd2f6ba40568bd66e1ab7d8b7a1df566e36e5bed31fca141a0425d5431c8b1a339b2f842c878c36827633f997d0445352cc7e0b7725ca3aa2d0df3f5bcdae04de6d6a770051ca6bce957fc0ef6fb055811d740870cade3684286605982ecefdde4b265b3f006a1fc1e0e770dc82fc584dc5a56a7f4ceb57081cdae127db995fae2f8089c873a0bb91f3abf4afb0b85ea8a000ebd84f31b3d710e71b670aed013c63683a10da7dd6be7b72fdd42a33c0fa684e2df8ae68fbee14568326e189616953428114de16095e75f3931703782cc2e9f8962cabea39d6d623405892f655efb2c9a6b12edc150bba45d9809375d357a6c230cd37c458f717af0c4c47914115a69da752cb8eef4ab33a9b7a00ba9dcb92d36e996c32ec35961c830f5ba76a1dfeb8e56b491fc1a39d25f71e3ad7c3887193704f82abd2738a57e5e32daf94578f454dcad93bd6be16935331321e842e03d4e6711fbf0f296873bce4c21748bc58d18091f4d9554c6f9a401fa04d61cfba1b963f4bc890ff57862744717735717e67d01d8b928344d88006e752b5c83a41974a2932b4e7c3b9248f2cc4026dfe26b8f20804bea892ba696eb7ee24550fa6787169d3d04ab5d00963d2235148d69cc32d5c032faa0ad7511514293846a482f669df176d6d91f71f75008a9823cb5569b5aec62f7733d644af3ecc6672ace3b04db8d18e8427b48bca328ffdc11e99bb36a850b06bd91ba0d0fc915da8fa08671433bc11141113f12eb7cc4a1924b99460302be1fcff8069fec783cdff3aef40d193d75ff1795dd23126e08e519827bd545481c7d42f76715c8b484f0e7a64fffc9b7c256be7889fff0e0c93016191081e8b3a2979361c5d6ca5564388c6d25ad0febe0f0e2fdcf6cec819cc6a63ae701a4301159b333e298ba236bca1f0004a5ea1c951ffe69c9a95c5441e1adcf8d86e55801f69f2b586e0ecd84ce7bb8db4154037bf869c28206cb9534d587b8d221ba14b94000e24f8808c75a8b7ab7d8a1ddc51295add39e7a7025e49850e4849278bf91da299ba8c09c9d3eea217981b1d16f5a4f815d4dcbc0410f387837fdb4d31dad7b278c1544455aa516c2cc7d10cfca2f445c346a3b157c9552d41677019e945bb4a974e4eb7a3b9eb697902fec912f06f220de50df716ecc18b29917928f982f7eb81eeaf5d4b4a613d577eb3da10226cb17f98c67c6180eb7bdabed1df1acd8b8222d42824c1720d14142652b5a17698a1013b7b3bda3de0a67840905b54c000bb80b44431483305f2d8b43217f6c2d4fd78e9f8390ae21c09e991fddbd9e20077609343714b353f937a7b76956c770142b670c127f2a7e43772a0901e462cbf699471999cb17199f3af013c3c583ee0d7c6b8a5867c3f8dff99983213d086ca3484a5117ba91e867bfa2b334670fc73394395b488fe60eeeb7fec8b94971bf92c19bbc2a825099984c744083e765950a87d233999c8595d3f3c173534624678f5a5809475a6e3f4e572be43f2bc5134e0bc6800cac1f271c3aec750bdeda9283c30c452d289daa596b53ea39a1046258661212c17002bce1cb36605c2bfd1118a112fac641a2e0453542f1f89b2e19e301c37e9e7f7132433af941ad7b2f5b4f6fdc34119d2b112b15924e6d2ab09090b15548d99e22952716892150e863b4ab6654204355a36420633ced3b66653e56e9e6ed03cd566d38cfcac766ea28cba05d5464f97115d7992dd55c29fbf27410209498e1941b625438178da867b94502a9474d21bf6102f75ff5019de8aa65212524e8a360eca96a521bb3eb74e1ad592b996e7c908579d5712957adb6c4ae7b5ba7b9b95776c154a5ef2943e6a79c8240a4c36f8c6c8e8393ad0a4c46fbb3801915a78917fbbd8d85a58587d802b8bc6bf8195e2930aaca1ea07ae7d0474b280d0478bb7d5d0a6ff6c63914559e6e7a2afbf95fff70a95ec03e116dfdd47112fbcd3bdd72c1947b9fce911d02c0394e17b1d9c06dcd0fafdf8c72ed72e05ce6f216e75f34c5942af47557d6f48decedcef2c2674b9d03a8eb645a95106cbea64e8964d73951fa1a9a555963d370481a91781371439d5e3ad04b7109e6497fb64a383c1c9459f07dc3636538d3141fdb6ecd50f952504b495e0c0b08732e7feb68b342c6a457c48ce1484799a5745bef5a664ffad022e72b5740db1595296a2198f5928db4fb252a468fe939b9b37bcd04feba0e1095aefb1cda2d47a979d0d5029b513b83c1973c5023c5df17eb2dcb53194565f658e851071c261b7bd92d4fe6392be815b18ad3f4491ab1eb4c614933bd98eeececa7be290e474a02cce21f91895da490d3678674c12255c827dee2be59bb5f01d731715d1aa276c69c4230182de5039004a74a424b3e23297e1533da4863c8c7d4e476869064d3f6a405adddd63bcb8dbbc357586b42102b1a7daf2a5a914e26d4861a22e7c6499d88606a74658fcf0971f7a691b9b44ca216e3c061069611e6408d3ef194df156d548661c5149b06d2d0d03e22bf6058fa361a801ea7640edbcd6e1828473ca55d8f4d69d08b66d61fb3ef47660765d5c1a1f5d1fb980c119464c87d269c359d63cb99b08537e77f6f66a8c549d28134029fe54d943636539dc7512f5f0bea1e4d8502ffdc0edeeabe450c2a14ec9761fe399a77aa06b6b91da88545cc8e02812c6705b84b202c32c9862df5c4a495e68ba0ae04aac527735789c0d20160b6ef5b31b767c4ea5b8985f71c54ddd8cefdd4e0d83b869df222acefb51b63aa68492c58f910b61eac1de8537fe0c9bb15014ed4e1a2f483353017f84b2f06d58f929cfaf0654e39294054b1f0458b984b6df7af640e81b933c41cccd36f30eda0498606542904f5e83b48620396835d2cfa3f8825c9f73fbfaccfbdbfd0da4c0028094a47cb7ebc9ab13da4de9361fb363511be1eb951f6ed8b3b461492cf53e31fe4ae852a29e8a95d19392e63853605f05da998c0c86613cc46d15aee670f14399812beafe3184f3e302958467b55256c3b09dd44779f67dffa953ddad6df534bd883154ad873c134c37a73d1c1ef76f6eb25046aa8f47e7b97c6b859a2223ba0fe630cd6d604b0269d052b7e1b083830cb6373224f44f10c9c918ed5c14a239a478778b49d75c6585d3099a12f4e1c379f97b5ee1b4b4d6ba14f35a312132b480132a00b3700ee388e6b034c81e2d450969c0102746a88231f79dfe9db701eab943efd013be57458f5143c08394422bc0ca81dd21d5cc80e1e242698979814c18bb36c37c5709cbf2a47465a5b0c3d655bc51f27e3ed9f7388c0ef5effc845e037c9a2320f94339eef2092158e6f9312917df96bee7aca62c6f302df9406073fe8c347788143a1e55edbbf62e2fa006310c092bfdf86a3c7839125a449c25c7a9280c04310fa9556f0b288d99ca823f218636470b4c988a8424263ad01c84d0a0a1b80fcba1b773528ec93a2456496b67050ec143f09df7aa90934ffbc73d5d8fb951760b4dcb8669b3435653a5d5df99f0b3bb836302806e79d0555286937b85d0e8bf19828fbf617c519358e439302c996b2827aec7ade1ac00ab15fac850a0dacce2e4c3daab540f602e8eb6169f26395b843fccbc3634b093f8e0c5026a664e10590a17f914e869c6c65a74aca3bc8445de340fa2162fbd6c6c6a6581fbc104d2684daa6cb88700b975f1de9b15bc39aceec1cb2bc1a65eecc9dafff428d367c6a3897141ddefb7bd70b465af48cca8c16cfb5b811d45cec33f42dd680751c3ce6d230f5c99c9b8bb36b05402f268486cb2858eef58449c8805949bb118f658835af11f610b75e8a0198762153680946fc163bdfe27e70edcfb9bce728670fb8526435fa8acb37acfc8ee3f9257ea3611f0b4a96995f42ce402421820b4a50afdb164b0864de3d4dcf992c589fb84077902b8877e6c0c058562da84f38b03920d2a5b341d856bea58f010f64b697d597e9c0eb1a3b604bf79844e841359d6fbcd42fc9887ec941dfc3d075cd46e6e9000691bd6faa24d03fe19bd031ac682fd5e4bdcfa8757439ef7a5daa6194e852a08d2705e20e8dfb1c2fd598b8b6c790a4a10a6f8778a8ae0710994deadcc3aa47be07807d3c7864fdd032b6e4910aa1631d97428ef531ab8b8fbe7bd26c610b483066ea58ecb3cf92f5e8cb38472f8246b6d026257747defd7a0bb28318ace949a2d528dbfad53ddd6ecd16bc674b567b60aec0bb774f2fcfd94a5fa43df3a9c022537f3ab8081ecdba67c8daa4b37abb4aefc9c272cb2bc9732312e95f3e3a787f9773721c515cd9bf74b9f3e0eeed7a6c563c7b80738344a2ee7717adbce6cc34a2a265916ef29e9160570538e8ce09268cf1fde6031c5230f03447dab3c4ffd3c69a2fdb63cdadc71a36ca7f38f46f15a31a34238c320d8517911ffa1bb2f3d2fa9c10ac6827d23af1e7ed304256d17b938dd01a4c5affb5eca32997091170d953dadd612a71f0d1fb0aee51e627b73e54e48e950eb26cac3965d1b7f4e430de11becb25ae3307b0a846cb8622b18931f55b7d8ed268ed6998d192771135834f6991801fa6cf737b9f4ca95210c0803ab1494fb4d68586fe859635e271489ce3201a6ee0ccbafcb51ec10ad563945db51611ef70bdba34c4f15d3f71326f7de7a99871fc52956527136857967c70a9ae32f0675d3fe44c6421284f88f9920c97268c8a54e610c976f8aa09456516d6782a3f533bd200600cec671b63c817c087416094789132000900809b9287d984c661f84d3032d380fa1f1b5003b1bf81ffda2e874b8a7f6b23c0d7f926dda479f8c44da7b9374552379185011082ad1dac54e710ada0ab8710f166ef0d5b5b521ed51895819b7389b52401046e9ac55e30005a70c3c09b9aaab66334e95e530f0ee03ce87b7082f7a6dbb1afabd564758a04d109c2773636aa2470443d267e3921db73a2102e5a3d60fb539d4b2878627e4a3ae05a6645ded88391fa845d52eb7b603108badfb55533349f7dc58963128fb30d180c7650ba5bc4aeebd58d678f283c1162b740674546797b937334603305d6a2e6f8ea6c31782f72317a1f5854928dfa15901897e243d80b080b1803fddc7510b96eb88dccb9f4fc9cdb78611dda5b0c612fccc73002ff43be7bed04fcb880ca8ce8ab840a59eeb14306d619f51f1c2f6034ddd04ffcc9b5d35f6106b92a57d10fdcb82036059bc1b4d6329c378d19bb7cd699babdb40f02531743d19c555fd65cad8808bec7920224449baa4e471b14024d147accb8f2e0940c33aae1615f3681a42f9ca4e87090b5cdba3d42defb00f3ba247093ac29ecc76189ce71d6ad8a8087cd0e44cc9c60cfa4229c0cb4564cbc9f20a5e5d7ef4133f45809fe9381a5fc961ff3b4fbc0cf0eb26b18fbba66f73c09662407e907b330dfdf1d40152aa81fb82c513edaec32e7b964213861840ae9aa4af3308afeeb1e2acd449abaf466a55cb0d1cc0b73fe7f44a864b6887ecddad534fc0380c7c1e2314c42cb345af8d54d3aaa4d4cd6d4d184633d3cd1f8f2e40b65e9bffef01441d3e9763692b1e291d009735b3c5a80c7ada927933357e8914c49d6ab5629894caf13ee0dbd71f3878d39828c6ab722e3fb6730152cc08780ad327a900cc336add73b14d48829794f6484a16f045664f97bc12aa563d76b7630f190d28aa9cad2654ccad584c6320c7e0686e29bca1b77913e32418d583b63c9a5d874b673df7b67c3fccc5b6ba79373d688c929b1e6b8a1546a3cf9e113e8dd6bea0b79659386a78299f0679eabb3c02e5194ffb7b6f201e6b91e2855282eff037e1106d92d850362b1052f2300c77c0aa02832ddff4e544b0afec0580ce75fcca3222ea657d197d38fc31a2ea76b9bbba34d12566a0cd7b5d13e683d0ce49a944c7bad1dab1b24b3e05362bd330c3e36a676183b42045cad7fe3da8b6a11a75205e1d54304926a3cbbfb334da00a0bc466391d9968d541492dc1a9998169748ac6400abc2a76ee0714274a07bbacfcb254e5d30cb57230f4a0b31804d6c58e44722b18e46060a77fbc0abcd74c7fef56a69ba22932820139b79d792753c667fc32e40294582feed1f6eb312563d013d03b7f73486f4ad0db758e34c60eed54c65006bdcab0ce7b06e74c529f608113809cddd34d3be54bca3e02016d13a5b285fd18896208c47588b287a0cc5faeeda3e4a531d06b07dfa4444be4c956c84b35e3152a51475316004ed821c25e7508d34b4907c13210aacb41309916ed495479355bdd4709a8a0ff9f4a9dd9899e33601483c1577b4b397500245fd12992da3602c122192596b6129a2958e73807043d3fb7257b4f603bf7a51da513b0a9782a0b578619454a83f51aa4cb862014b0684223e01592ab3e5acf7dc1b434ed68a5dca88683524347bd9c35effef0d0bfd7f570159679a6bb6d274f099fdcd74cb2df260152934596c7450b08f9045238570161c48c36992aee35853634356cd8aa353af157b1f70797aa202866d7de6275f4033fcc8500cdbd17cfe83fcd309654c0f55d8f540b9e2a0d341de6ef3e667cc31ef8cc387bde28159e42531cc026aa7fa51d84e108f7bf19c5881c3bb3e39049f658f824f770442c84b3fdce8fa22c90b51212c7cc69f08d6adcf35d8dd52d266e0c3f4909817afd723bb69f461bc3244a8895448dd71d21491b9b78e3a2a0d89ece67af43aeac0e19077e956b18fc15155634cdd51d3d4f9c3d75c2d6af4f749c7becf89b8110046877df480c04f726f6ef71d00b24da23d20c47c529a60059517c2eed1177a6da51e3eabbe73639088a8d73197829c4dcac56f5155f616fd73d4b4b908361e3cccec1dda58b9b33fa7ac987b0f7aa6625cfc2c7307a2952bde2b117a8d4e7411f6fafe682de5c40e675d95f07c1561df8b0e2cffac3059ae535abc4967357e30c59036fb690354dc3de047bc0346b537583a00a9ac940237a2b453aa9340c853da8c51c39d82bd1edb8e4e80d1e1b8b106f41852e641e347bebf1fb4b6cff977a81378efd1e94daac0855dc012278709b9f1232cb4dec1289e7565794e6c4655fb5995196502d33bc21518d5aec7aa9a5bd227e25977dea08e1cd39a7c279ded7c681ad0cf228606744b64b3e998fdc8352ee41850dffbb2a7febce10a94c7bba355f1f538dbbee222aafed256153271148e7ba456a9d25e75c56d3ca740a4eda7416d001861039b2ab10bd9d8b2798ec426f463bd8f488bf2dbe1f6ba7ad1ca69aced3aa1044b3070c87a26bde94401bcc8aa0a476df387effb433b0495ade2a39c11a4cf96071f7b65393ac39c11cc5defbdcf7d90512b4eba9ec24c2008961ac37f65f41b889e18c703ac4e5e066d27171d7d137cccf378f1f7e20f23c9e2249c9ab299c2c138d5ea84e059cce437404a635d03acfd267be1ad40fd8a8258a979bb07b445a43da0a1df03f20153ae3ec2a0c91a9994289fb8df6864c1f29b4b06efbe8312ed0a8a78349b549c257bce034c71b28de080a8a64e4a5a0c4de302d410c8a23b6bdeee800440e28e281307405fe5cf5eb7ea1007d5fcde1b57f895da36499834134d265198a14f907217c3d985f54a4399843aeec79a0e819e06163229e1c78c2f1f8aa325a28eab40d532720155dce911170767f561aac640e8315818f164a0933016f1bfa8b25985f8b82525877e1458ddd2b10f6dc779b8e9a73b750565511021659f309ab131c2043e1bb9c53f2e2aa5593687a1f7ecd7f7bceed0192b83afebe96009a431d896630c86b7c564e540fdb70159a9c76bce8f61ee781fef82d70729b2762a60d848bbf4a31c463d1d90e3f50f3c2c98e86a597d44cff511bbf4c790cd7ce5ec7283a8f54246326caf61c043b2862808f645ca119a4c2b61d14681be1d4d46c616fb260757ea2207050dac43bb5905c35721f4363d452a3cdbf693b462c3906845eb4ee046fe15e6854673d7830d15f8aa23d1ce75fd7b722c690bf074e05cfd6e926e03d920c37dc4897160bcd3490e30cbd3e903c22149edd61b28009eedbfca4c102c09a64170a3f55279cd4b6981d13dfc5d6698fa37ffa02c896195dae5ff2648a88e2ac5be16ee3798436272a33c174914f1c99d68473177161a80a7ef2b5a643046d7384481217db7bd11b2ac32a533e2a182f82726f083437eb5bc1372a115f80db5a21d6c4d68d03babe8b81a57920516774e65ac730635ae94212c6bcf69c2f33ebed65cde426b8f2e8ad16c8db9ce8fb2327fe4870d78f885f33cc609386bf94dc95063fed5565332936722dd1d17435b1912a439d33f3a56cf6b09bbc6e06aaf689e92b84dfaa299bd793404bfb927f41a3d6bf63bfee9bc068ee1ed8041c0a177597ccb134151add99d253676470261ccd280674b8fbb68c9e0bd2953947ca80296244689d4d8589a630309c02e453918ba95abd65ca7264c5e874ef99374ee999ee816a3363cd58201e6fa587b111a88a44a24e418b4a86e7d4340d960007db0452571b55d755bcf61e5a9e94f4d0b26a2db86cd5c4072121f4a3266ee032252c0957adb20ccd8bd0ec85a9e1cd50ef0c24d735c87a12f97be65e256e7f6df351109ef87777a12fba916378b4a25751ccf0c7b8944155bf7b94207fc31b869cb01321a498f96b5e7ecb6422cec5a83bff548c776fe8fe8ba30d7a8f4b9efd9df33f11ee85ccbc97191cabde4e04d926171c5f530bbd864ccfe513f4018b8d6d4d649c859c85866f9b7f24730e376239ea595536011306a7763a5f55b3b7721f28e038d39ad4d2652f82b073f9a5c9e5f3b4a6bd0cd228570d5d7e9f54856135c084231a3d151316dd4e2a230992d7df2003a769ef1faab4738464ee427ce1de5c31bd4a6a2b414cf5f2098f6e26d1708277135e6903c2f59cf8f952d826688defcd48e4088abd5045f147ca7e3cd61b0e2ef6556096fbaa3631e821cad12cb71c6fb807c0083c433261acb79977ad7624362e3da9951422acfdd04d73cb92a9440f22b55f266fcc9524adcaa8bf68d2b47a308df07d9235a5e451cb12742bad508053030a804aaed1cff5926a3ed530fad8464a5274efbb6ad4aa69475dcd0bf944a9dbe32c93b0f353a391bcfc3e3824f91e1482b9037e4526f0f81030094aeb500a41dc4e249a0556c371899c26e5e143fa0535b77735159fcf672c352ce416b08fac2cc9af559a071d77caaf3220ef50294e4c222a6e91d322b468f4a4e09c80bc97ab2c3db207820e9d32e50894cca3dde0d98fe59b51cd128428345d4ab83ddeeed864de06d3f0d66c9c4a340254978693c284c60f99523616426b69f20b7bc03ab08db3a2c436108a70b2ee0eefae601839d97a8c6563f44eaa8dbfd35b7b5ac3dc59fc120a0eab2e9668b1cd683e6931b84fc658916b2145063dfedd319296b9de68c4c1d59eafe9be4bfe5bcccdc5c4d63901829ad4aa776b64de8c1cfec80ff6c2232505d39f72d28f4c14af0487ca8e1e220033af17fd3d2e0881051122eab0d9e1e87214ce583a7b68e6ef991686b67b791cb1828581b039aed0ef6a27ccfa902522451b58fe46a3803a795aa9ff9e93076e50818f1c9fea40003b3be863793ae63159a3a296340a8a8e22a44b4dc5c628c5c2590eea30d2486f4239198596d87017e36fac5736bdf325baba35ba2d2e3d5b9f3494e2fca38fd0d173ef9de94d145b5aac3357fb258e8f54284910d6482827bc069ca3838a3c6fa4abe2d0aed62f3ca747c41cb5efa5b4eb7594d0df8ae8a434382f81205d38cb869c81295adff4d518db66f18c1d74a9e2f07c97dbea7c99904a8e599103c5b65b83faa611552be5b4e01f15eb2e38d7196bdd3dc0ccfa799269eee1454dabb882109ced7905a37d4badc3cf791f73d99c7bf89b4bc1507d4662b704eaa044075d003fc042aaa7992d42f253151666e990c3b7d5222705cc27719f5d4d2810320d4329a7362f8c38ed4a9983ac410c09cf15fe4c665dbd9c369032f307167f113e4a8eaca226d5fded90737eda9fb9be9f60e4bd98285178d525bc009fa360cd146e90e11e3b2e1cb4f1d539cfd5ba95e86654751d3d1c4753f41af830fba50b322ec1df0db640179824b12a4e9564478ca00e0cc017dc889d14d7fda24d2902eebe396db4134681ba9cbe2d624ceaba47f4700209ca1630138bb48a23291b943894881f175d2948ad7b27c4feda63b9e9e73e8c93458dd878fa3b8bd780f74928f5a914c6ba775a93817b01008a6d6e789c39e59c5b0b85e5e6cc99f7325beba56dd94d5fd6e2f9675f0209a5df82ca72e8eb211d7f3de0253e13e91cf2e2cdc68b130a04d1dd854fa0f750215cdf4489fc3517e92cc3b8b94f138378e51527b983732127b39519dc27e95f677cd73b498e8a132678bfb22f0de41b1ad63209aa85738ceb1cdfeff997446f49c94d57040210b7717759c3fa504a822bc16e14840e6087921c3f2764e4a17f27d3ba4fdb074c8edc24792ba325578cb47846898a8e1f307a8a7b283f11646dd0900a5e5c986c75df600c87421ffc70230910b1834a27c87646b43a2ab2acdc2859b7925ef9de782d1fa0a6a834b7354139ed87a0abe261b5f2170addb51e131dc5a95c99b7c6258540d4a236fed506dd0b1d9a08ff1b8e52c24b5db1f782712a3303f615a6cb079e8753613a2662015feadc348671a2da674786c9b957ee21db8254ee20cec1fe64384ecd69c637ba75d9780274f4b5df56bbe29cb58f3bf5045ba3989caf00e2a0232f106a0db4f2eeaebdb7ca35adb28d874e4df9d6208fef5be54709e5b72447039fb3bea29ff789d5008bec724a6cc2226b428332c3858a2d5cd54eb49ecefe67e24291da5476c641495c7feaf4b50ec41709287fcd91f995275b0e3a2d3636e8345b6e6e20e5758f4f3dbd5c61457a924d5c1f6f4ddf143e18e5e78b9eb5595afd2e32ad92e396d06c2c0575b2912472d98d0eb903e2ccbd5c3a919f692bf14036185dfaee6447d1a9d144e776f43245b6e230d5d69f4e68468792c3f735426d80a1d4a0a2a3ffc1a01371799d3f5e7afc358f9e2c75a3ddd074fff56cd8c91ef46589d3c3230a03b78197d8292eca3726e502888d76bc37f314ed64922fa4e80af347b43e13e84f276102f63a00daabe099a8e6194e80ce208a024e46939c67ffb036879606f7cf2b982c76e895feafc98d7ffcc9270880d74acdfd96e47776af607b1a16906c7da9dd78a3371af51816a95f366bc1e72b7f1285fc2a775a63a5ad5f27c97465c7d7a4b36026627f51b4396e8208bb43c1b61d5d477dec13e8ad0ed1e6f6bbcbd967a02d0dde8f3cbc7094eae563e52ca2c7ef9408a92d2dac139fccddbec420bdb4e2143d12782aa4580bc6680ce3428c9f3b21c1ef3381e85f0c8e9d49c7ff495f8953267057269380a1254b4d849d75c6907ec4bafbd237fec07af879597f408e94fad5931ca335abf0f5e0b151bf16ca27d244898deb0fd843156443a09690fbcebef522b7e3d25d8afdbd7732a2d271966ab88810dc5e437490bda7dbfcaf203be2bb2e53a6d782762100498a7ffa55685c67ee5b924bccc082e8eb9644471cf8f7b7459c27b7f9aa98c5fcc8c28453044224688b18ccba1b01f6ef96ebd9d41e32172977f6252a987ee3d0a3ce9d994a91f406de62e1792d07031d82f83cbaf37d7ca6346cc2d47585aecc880709368137b2b4e00514a4027addb9665530ce349b0ed01c7e6a1890a5688e53991082529571bfa2cb61cab1c68492697ec65a29bf5458117031fc23a6d36b1d843e8ed3fa8ec5ca02a3669ed0104a1b839345bc8bab08c8a7815a48db7bcb2da594524a290323061b069505d46ba259c2134d49f1833a7aa5eeb08fbef17fb0b8898185c566414a8c95dc2f7db4dc3fdf6b56c0df44f10ee3afb0e429841eac11716690a8a366099b404dd8132f2246f0a9c24fc3e0fbb3eca054c5f2d351db723ed5d9b2ea7cbd7a6c9a8eca19a1ab43878282825a1a5fa9feadf75a5b9e2b6bab920622f8f48b288a22c65c8734c59fe28757ec028299f43d955f561e825f3fc025f8a11e9970fdbaa375d7d350290a481075f775c64bb97fbf7e4bfaeae391097f80cb0d64247b4e0253ac43d13c54f3da4a6905a658118deea3464afafbf5e3aa854dfaeadbbfafbbfd1bd6659bf3a5fdee8495b467832c5f0ef47ea0f5afe49cf3a89b4b77f737f2e062726749dc051fdd963ea45afa9e96177c74fa2199e88582a6aab2fb9b2a7dd34e68c7aaf451a83a66a58f52d94a6aa3a4d7566bc57a2bf37546abbcff25bd35a91ef110708702682ff0a1ac5ddf9fb5f734dcfb6591703fcdf975bf6fb78f7fcf0b15ef4eeefa745f506b8df29a4bb35af8b9cb16d73e8ff6579be9d2937dc1add4ca8f8b0626c43dae4869bffe026ad139933585c285b5a89c5f6553e59fd287f3da3af4cc3133e2033547ced79c362494f019cdcc1133e2f383a2d5427d5a751c70d22dadba4a3bd8db5abbe3f5fee25e00f4da1714b44d9feea89c3e06e0707defba8ff7e12aedb00f6133c59e49c0b22e54ceaf395a4a1fcf68c99cac237394f4103282e9b4727ecdb1018e997362fcea4179c2177d74c397f4da182c564434729a9c9023e4841c1c5a859c1723999c1463913f638a7e7343d3d26b636a357ab732e6e8404bf29a9e93e4a9be8784643adf1156e9610c167150f0883342f402870f149c12f69d737730267e5976df7df70f80d89bdc561900caa8a0f04447116f8b69513181d7e325f5b058e49eb8c05529a3c0db62575344bc1e2fa937e537610b3931b415042716a34a088a179430445d2ceac50d2b6c88b7efa808e2f57849bd292ca6c810ea642980a298ddbcbcb069b108dabc2e147df72d762e1d40bc2dc5448dd7e325f5b2b86c7bf3464841db7d8b5d8a59df434e8c5d5c3535214c89558e6ca8a2a41ecd92d6d5d42821430d0b141bb8b8d4489dd830852ccd5989b034652b36445192464d8a0d54ccd28899dae0840c4b8a0d527e697e29363c214b7345b5c18a8c34444c6cf81d49936343978e2eee0394d95d7cf674a0365dcabcc0da026ee9b6727e61fd6a34b04608adf45a39bfb07e7cc19a01eee8b79c5f58303808582b42c092ca671df493617047ecd2719938a56f329a991e96a189e86017b08f950dd67539bf7e5afaead764dfa90137656c2bd45abfd6b8397f403dabc59cd6f9c452e707759b66a069a8c34fc512e71cbed6ed2996d88b102f42ee28fe4fa0d52c887537641345a15b90ede7db74db1efd5bda1bc79aadf79048ac8dff162aedbb5cd87b913879ce66eb000005206a31eb487100e2ed1989dba82325d9a24a4eae4a1bc51d86b61cfe7e5b0eb9ce62bbc37042687fc2a5e9aaa8141240ace5bf1d04b5b67dc8c390f4e9cf6fe31bbf0ec99129ef7183a7529314f08849da75b50288f67f0a60acb82a3708c85676ababd1cadd6e144bab0bcb9bd5f1122ce94d0c43d1eac05d222115f944abd365aed10cacee9656674ba0276bf9831ba4cf759bdacf9603213bdaa7f6dec737a806178d6e62bf4daf5c02ca8905b493ca70ecb45dbbe178b34b19deeefc09512829c9c16d48a4baa955864140369df1b5307293088758cea7b64eb0167789f0b4435748dfb6edddcb47a5dafb5d206e0bbb581b296dac19eeb5706dafbbdd166ddd8640360e06ddad85ac98872ebeb1e8f7e2e69cd3f6aedd96c2849169be786d864a69064a5c45e5cd511899e65b0bb766b834d76bf7debb2bef2ca2f5aa72341a8d66400185a29bd88dde6eb71bcdd035c1ce7ced0f4734545af1ee7be78a5924646f5119529a41a519ecec56b71bd4eb93f947957e4abf5f982d13567a0454cebff4c2fefab85937c9a1d2f70195be5aee5a56b2c7a1ee7c740e1c38e038d831dbb4477393e835faf8beafef29da28eebd39e8a2fef925a519549a01cf0a6e3c67150b79696ff7766fb75bb53071d03aa4a91d0a19888a9dce4e7befbd779a419db75ae0817fb7b4bcfa70b8159dbe0f57621c0e87c3e170385c0f5bce59a7bd5f79af7bffad73a51b5f5eb510faaa531b75a75f2751f54dfa6855a92798ac1779bafed49f4b77e23e80a0af6bcd3fc26954fb701ce95258d3355975a8fd4836f5af7d13a5d16aed50f4e2579246a3353d3d0505017d177dbbd1f6a3ed6bb6772a7af1e7124d3797424bfb59f4b5f740f434d2c9f6445f13bfa8e8c5f74044fba7095f7b4ac90eb8a7914d448ffba6225faf1c75b9fa63add54a12bded9b8a5efca725de58ab8db5a29ff0fc3b0cfdf84af56f3f9782bebf07a0bf919d74b272126939f03bdc9ef61d8438e0a7644e02f7e9cdfff49fca71ac51f81a85afbdd3d08f3f977261d1d0508e74aa3d85272229bcd3f8439cc4c0d08fdf812132c7c7ef000532c76b148628100d9113c82132c78168e8e7128e1cd2e5f8cfa51ca79f8974736928473fff2c431aad0b7d17fafe4eb7a7715d8e93390cdc5e7c0f42fd855eec2ff44eb4bf8124066e4ffb0edc3a20443ef5db2b8937b289f70b22772299e3607bf1ed5128ea288b1c086575ffc8428d65565f98346101855fb45d9243dde5286082fc5487027bf4c15e51b1321296292992db92390adc69646d4f60ed51e1340201221477d033605ef8dec46031fe6d2fdc1e931f6e7c3afe2c82ba9b5b0cede5fa8d1ea85205017e18ce2d18636c31c6a42f7cfe6f778df4ed910c451d2d95ec96f0f587ed40d4dd7ca1137d3fbec0264d30ff43dd8501e9e8523834443414f440a11d62ea10f4408f491cd013bd07dbe348a7dbdb6e4336d2c9f6b707babd13d007ddde36a49b4b4d410f24f44a35a41d887ec8369d887ee86da493157e27db0375c06487493a0d3dd1d013bd1310e98188dce4b64739fc43987cfc36db0f914dbb098803d02bd59b4e48679581b964fb205d68bbe982741794007d5d02229b5eb0d45fa9761237c55a73f225065a47b795930b940f1a9e5e2b2717a818bb4aa795930b9489eca7d3f6643970ce9c7973f6256e9dfd380f11a69cf5c05cbb8f665c52701da259942ad02b9cda5cdc4c84149a09881914d8cd829cf899d9a082c1cf4c850aa6206579feb060125266830a4f589e1286e8c8f3c5060cc8bab86b90d6ef05953be29336584f17cbe03e54b67c65b5a092e409951e4d628477a898202ae75795273ffc23fcc7e12a49e9ad412948e9cd2313a696eeaa2dc5d9668a29be9fc39189524c290e004e9c20cfda7dc38145e13832d91b5e7b6fba7bc31581bb0feba6bbe3426e7577cfb12a7461a2b47c8276eb9927ae75beb5e4adb5d6ba2dbef8565b6badb5d65ac95a2b07435acd0eadf6e2acf9d4e0dee00635e7390cb178cbfebb8903c790663b6ecfae75bf74640a431a1f4a69ad75ce79efc51867ccabd55a2bee5ab5d6f4455c67b3a9ae19df39e79c165b5e851db7faae02d05c3bc510dc3e4271666bbb734e0bcee9bb9fe79c734e5168de6a734e6bed9c939673cea39d73f678425457c39cb3b562cef7e6fbb9acd9c46c0337aedb2320df53892badcb0b304a2918a5144c0718a5148c520a16a6038c520af622ccd2fd276b900310647a8be043d8d61ed80028e6dea9f4e8c5f1061a84f7014aa208bef8250fdfaa6ec7ffab64d4143383fa942aafa02620804b4b522a4aa5a1572dd45da75410b8d1e9eb3618d640da9c15ee8351b8db6d252dbf5bb3f97bb2907842706580fcc8c0dd2122feacb1553295051414540baf3317b54b252be9d7b26a81f6f4ab9ddafb6a1fa892be35d19fbe25627b9fbdb24a4afaf61754faac960d5352a0a76fc582de67e194f4a7cf9695f437a5d30c6a06d90e1e2ca0c890b3e4a3475c2043c5151b5777cec2967c540925ab80133153c66a7841a2650d99971533376e742cf96a901aa6fa2c8b925a1996cb7a95f483828282828280de363201d96cbd7f6d64eabda8acfdc153d69e3632d568b41f47265afff3427c6afbf2736483257f3a2f70dbad04c1af3e23f8892ac1391f00293a727ca4e0b240dd2f7bba60d83355daafbb9b9541b4bba19747673b25e1e1e5a30f191341f48471b2c36c2aca9b38f78d972e3d6a34e7863e52960c9516f666490b367fbac070d84231d666cf0a162a7043a84200ed8c7856bacfc8484f910594a0270b8c4f16570c967cbcf2820baa649070e5cb08ae104b3cc9948d2dd5c3a2ac5f6f567a84d4825918170b6705fa4433e7c47054e2a7611e7f58714d12ebfba9d6151cf23024f57afa1c7f06243d462f866486db2aba75715f05a0a95e734e250dbd241ed2cee88b70b72e5ec8eaf4ad907bb1bef7627cafc618b703cb6bb2d6fa5eadafa8c59cb31815fade9bf3bd99b62f4d6b0d160324ce6fe69cdfcb79be57e9f7fbfd7ebc5f591818dec2f9cd9cf37b39cff7222589091be3fc66cef9bd9ce77b7fd70bbb9abfa2c7897fe3fc66cef9bd9ce77b77bbbeebb89d984cc6f9cd9cf37b39cff76ad092722fd6f75e8cefd518f3923480956daa1bc84371c4341a8d46a38de3388ee3288aa2288a62188661188699732e66a4e212ce6fe69cdfcb79beb7df8ac4e4369cdfcc39bf97f37c6f6f4f9525f590947ebfdfefb7e3fd74997bb1bef7627cafc6185764a45bfc909234e0ea5c9dab7375aede7b5c52536bc7e3f57a3f7a54b536dd53eba9966f6af1b47a1aa2f411e08f90ea4b51f66c84d4872fc55bb2d2a2a8b50643a1efbd39df9bafd65adfacb3d6fa66ad6fd6fa5eadefbdfa5eadf5d55a5fadafd6f76a7defd5f76aadafd67aefbbb516c3300cefbe5a87e1bdfbeaf0eeabb9d6376bcdb5be59677eb3d639e79c75ce396b0de6acc1c8eec5fade8bf1bd1ae33742621286c4fbdbae8867742fd6f75e8cefd5b8d7ebbddeebbddff59084d3c8c72bdabde38a8a8a6e4560bc3c762fd6f75e8cefd5183f4fa3f0da89377a547f6ffa3c71abf042dabde370ff3bce6fe69cdfcb79be1709090909f7a50fe98d90c4783dc9e2fb78f93e91f63e5a99c1be7beeb9e7de6bb55aad56abd168341a8d461bc7711cc7318ba298b3b8f5bef98ae2e7bcb7de3767310c2b40cfc230fcfbd6d63073ce6bb4f6a64cc3ee38dcff6ec7e3f538bf99737e2fe7f95e0d1a3468d0f01a76bcd2a78197a461af084bc2fdef76bc7bb1bef7627cafc63829290997f4bbd297b4432a73d6be247eb1c6fc62ad39bf5883f76aacc17bafc618bc142c4c8d071dd80f7a99a9d6fa6a4ef7d6fcde0f33ff9cf7d6fbe69cb9eec0967a829482e2b8bf507a815ed8f6889e9574d76a61cc61de4f3f4f3d6db57be691e9d2a3fa9b1a9595ee7cb8d2671481a212d7327f36da7bf37df3dd7befcdf7cd79efe7a48fde5aa1ca4b7660cfce4a0fc0af50a9072005c2b3b3d2d7a4f5cfdb54821f625aa7d5e5d5e9aa70ce0b5bdf7bffe268b7d75acbc14b36e79c73ce39a7fdaa70ce0cb5d659ebac348359cb7befbdf77e50ebbdb7fed8b49782d06003663ccca33b565e1ab89981b9eb5f848cbaa5aefb5544a7000c7a4a7982525a8dc904cc0af76fc7b8e38efb05f69fc06675926f83127f68348ff4f3acfbb9c34fb5a63aeb8c31096493b78ea557716f7c6fae3a0e852a77d983709e54df8ec53a0f0b63f42ca65f0a057ecd30a55795b2be1297105f501dd77d3baf5d2dccd96b75777befbd18aa07e5fc0f74198159d25961faa863e134f2f55a75de5beb66aff66faed7927d4d589f6adb3cba936350812ef3cf5be7d1fd3a31e424a04bfbbab43f7107f3accc249d156e7d81ad4fb856349a4225f534689e85dfe24d0cc12487cd0e740e7f875bc2975eb203c8ada83f7c0ff945d209fcfc21f8f927e9941f04df49ebf7007ebeb9ab75b94b76f89c3f249bc0cfdfb45f73fa1ae4f977be5c67abc5a4ce872b2907b302fd5a3109b95ab8bc6f5077f95df409e5cdef1bf3fb6e129847b90782e0e34010247d1c7ca83b107547ffc6a7df4b363d2d3585f43548d2d36d1d35a8bb5cf3dc960cdf03077b4443fe4d561dc2175fc95ee06413051766486484412df1cfc0e4fc39f902279c3dcacf7bf628ffa52ba4b6a096c0c49d3dcacf81259cfc5d9935a80bc85f5bd37d338cfefdf94110041f04f5deafb7d6d1721a65d204536785fa437a010475efa2e36698f175b9a93af8e3e7a807f04732c78193390a7a183283248aecec6c097c0f9c73b0a9043bb2f401010a8a74b2ea809fbf537e0fdc093f2773147c0f34da7b183999e3007e2e0334e7e1c91c05490fe0d7be46cea5a9754af6488bfa413d974650377bf6283c8d0bb8e4886126058d28267af0bca8b886c0b96ae164cdd94483e206cf0263e30b892e335684d0d3af66852df56a62a825f6eac3c18f911088d8a072d586ccc69d104496ecc07141e061286460263e6170aef8b8281185460a9d165bc0ea7829416b161d22dce653d0c4c7d4941c297a8ed83370342082551656141e5f63ee3d51a646a77c4dcf153b533b688410d247068c2324b8a9c2b36f703327ba8057c795293474426061a3038e06115729d470d1190335a7b5b5d21140c4d070b30576e2480734579a3c21db03c34f6d73e207b7704b1b56e0c4e08e99b113bccc891d988483034e1834584ebe54ba2b951332403e3948ce3d813fb7b933e9eb7705afa4c3a74f913c5d582a2c99a93d1df0c8a155428ccc902046df47cd0c1205e55545366606cf982938b40dc07820e1d2c749151638b10ae748084676143931e7a70288181b095d497cf41993c5450970ca40e0ec919e23374e60e70a19167b82ecc0c1c1d81051d3830a90255e4660a035ebb70e3a429c18a16a9327cc9419d00263b8cce64c8153e28a8e580bb4a8b8f25244c9949a09660a8a9b155c59586682cca812457c636a09ae5b533f68d34f082fc66821319324c597291cbbca559d1d6366e46049ea73f3e2c25921bcf944c2cb1629194aaea40133bd4cada87df0c3855995b1116cfaa4e9be5e2b6f1a8dedd8c346c50e32661cb242f885d84286a607ef323522acd265cc1b144660904566f4444e1d2e7ec8c81192ddf44142e5ac0b0c332db898f093818b1aae255a7490cc104507bce83e719762af423420c1c6911872b030b1f265a26c1c4dfcae6c718132c50d1b1e9e3008fcd1a2b145c5620d19be45835e429879ddf8814546f443a94fae3a04ac534c58c926b43406cacb01829716322dbc507999784202860841c8a0802153a7da9966f4c2081943b6b0e4a003c56e6931d1836785980adb5223471409fad4e289932c116a90c06162ed94408343d03507cd1d2a35c8e8e94934686298203c3d620387122c78b6e84c99594a748929282296a70e8a1a7ec47271e63c9814655bf4e8300347c9c652424b4d082845c280a8b032bbdd14f0a297b7bce1ae5d6144480a086040162682942f48c2f02b256adcb6d8d8c305889728656c645d5a42c568e1e21927451d177bcc8ce16832ad942001d600fbed0961850b9a2eb75e7778306f0d9d5276349542023934fcb41053652b8a7749b129a16b4a0a860a1d39a642c841adbea80911064d922126661529242fb2fca863a4440d319d47ef687afdd2a57004ddddb1953a5360e0f9e5f86d308e54d538c308923e574d4e600182598c76d288c1318386ac8b4b4a45b670f8cca94a23c28d3eb382d0026262a89505d56cc057952e5f9618f192e25448fc19514648d5189337584a3c6e56e0ede93e1c6e62b8253cc9e0a233a74ccf902f1a7c8bc4d895254fbaee4871d1a2c5fca9289275d504ca0514fa85ad9038a377602ef45421093b237237afda2a4aa5b29132d2aa0565002222e2700df901828fc9a790b8a29523e01af27b72842beb0ed90aee7c606d1d33768b44915cb548aca861a0952ea0059912949c3023424c8b441416c0588e2258a6aaf0ccc8951555ad2579cc48e888e1234f6da38747c04f96ac335fb4bce0b180383c3e13c32c331800a4d66471d2c525c2889935c20cd3991d7bcc708c5539c1df012f614c767b9400157aa95a18592310c1f233060a9a1952f2069a009931429e3875a8ee2eeaa298ee13c52c628eb07a5336b740593191f3a607151126c71aa143b7e047086f7e70411146cb87ba1341dd55ded7077c82ee6801f6a409913d5454b6325a606250c68091b3f9ef8ae8d3011920564bdc08d94a43022c6d808cc1f86285c918c5139042a6c80871b6b2c8d85146c8d81f1053d2438b89951e6146464c41bacfa8ac6fb4ab14572feca58ac3c29f1237a0bafe5009016584147ffa01c6879aae3a28e868fd68aeca07d5998f1b5cc8267f92957744628080670c8b8e2e77d7a4926884eeebf6025dda3d0ebb18da7166ac44095b58679c44d5790a92250b4c9a165b64d4993c32dd27224d0cb9d2991e88190242941b47beeca112c54664c10db039259449a3e44bbe958c85ab4515d0d5444a981622b0ceec26515bb669e7c79c1f79a2f0a1430297232b729324a8d2f2f77b13c2961667bc44d1c144c40f004491d29af1430a888c0b49494c40ba2fe9424ddad84ac9c01aaf355777b66881b1246ac8eec3f58746d61454182495f2a619d7901950be623c9932b992281f398a840c1c547facc4fcc9c9a9954ffd9a316ae16acd32c3a2a85e830db2a45230e14203454c480fab256ac49ed3858bac8519235b515b45b09489327566872a450de1e6e9aa45d41cb03c4068dc5d319c12c8b080e2844c8f924ba336d1136a00cb903b25d8d07073a64e21d305260b11212498f1a016499bce01ac245578aae8788933e5c9182e2c3c5eb0ea90a0267f1d2631209b42020c123c85427905657da8d205c2092d118ce0a1b2e4e3c54004978ab02049c2044161c5a4aee9385fcf5a2b2c5d5a5c94988115c4c50852f21483126b23078b1e1779f0748056952e527af2906959f2f1caef502bbfe222c28a6b40116248193b64988c2dcd7db7a5554bac416ed7094f848624ab6357e52459aa5d71f46c8c17d345089a72a8e4ec1bd92c43332a000423170020100c08860462c120c9d2400cba031400114f8040665838960763915020075214c64008833010c4000cc318649c831022b201402eaeaeabe8cfc4c7118253ff80fb509bfe77cbcbe70caf2aea7dbf65886a20cc5fc52629be1c846eaca637b94a878826eb05e64c85b14fcf74a2cc9a1538d617c93bcdebec14ce2124d6430c468a6e4411c92e0ca78add500af2b63a2847d718ab9b2d3b0e7a48e80221ab14ddde0bd207758a83d3cb8a61ae939803415eb4e5996f49832798ea5bb860d0a8d13cc879561d4200a24e13f772d13a4bf749d61440d9fde96b3bc27d33149266877fd19afa0bf74bad62b72c52f468ff0345e5209eab2e7cbf773ad04021aba9ccf8e4d969cb7f50da9eecff78556e1425cd02ffbf938626866e31f5e69400f27439f2a984b8a83a4bc60a6378083b3490c76f4e4da6100d2f78a524f887b82af210d458762cdaffade2329ab81ace6778df010c0e7df570d20f68da9f5f60b0071d192ed2b77324b48097e1c934c71e2e06034e1e5db92c60d634914390d4dfa5b99cf1f8dd430fecf105dad9cdb772576bc411f97f76b2881695080644405d045f7dab7cd633914c9e9b551d938c3a40e05d908016bdee2ffa9edad0d0664cc046770774ba4d96170d731abf06685a7938229081e0f3e83f3a11f663dadd608407564e848337d29ab28a3023c72d118f237cd4d476fc574a6e93c0b3bd0fbe6b95ea1e3edd9b4d245597d0b3a8283cae7e2975e29d228fd9c92cea368f7e9857895c4621ce82ba91c8cb2a8a4f6bbae71963a98f82e9908ea5903a543d315106bb288de0e0cd7b38b9f866e612236bdca296220aac48b033926a7e3edb58daeaca2e3446e35db2e82fd51ca23b9ffdce3da477c155db2232e40b8e8fd43eba296fb367ad455225dd8b140bfbfe0060ae913cc5b1139106682da4af713b91b19e1fa955e18e154b35c7a4cecba870b1186fb3a706f6dd38b0150df6a238c1e67e5ee9bafcddcda1dd478882ba54ed3796cff518d203bb73a878bf1d0cb318df3159ff97a17e955c281198375ddec3633a3a6949f4d49a3d0e22aeb97475036771ecc89cfbe16864203d1460cafd25bd93783ab66882ec5c8a77789afb089056c716cba0ecb718e007dad77577f355bc43fcbf373f9bf176351460c2340a991c31aecb8a59dee94ae10ab18e1e5a9f17098f8fbed150ae950cf649fdbf38a3af29cbdc501e990cd9fff98ab5d1c1da6ab9f024d5ded1f7612c25a34be9bd8d83f559e9624a49efab646ff1d39621a545e311584beaa42b870fa590a23c9300708075de5547014c20e73b020ad54876de32f49a345ccc5de0fd2d23d43463da3cd034c65b17bf7050369a7e8b43045bdadd2f741dd419b18191d9126f820f60db20d4f20ab85545030e8883e45de59627e798970eae4c6f0fa45711f67b6f6c346c803d671b7d6918325b7a4f3f5403a14786863643ad1a4c187ff131408e4972bcfb775403d95c738c6a726cd1b03bda5272dde7b74424a7e48335b48e1f0e7047ef157d60c946c75c6f095fa0aaac10e723b05a0f40b87271a06e930d139f8197920240728cdc4f656af12133bd8bca2f465a35d4a37bd5c077eec893864856062a08c108c22aebfb14bd496130483f92aadadbac5082eb2d4b0be561250779baabe0bc00244761f099fb52fb94a7ebc67a43f782cc2ffd305283818c3475edcd17c431057777a7909648143550591f94bec08a166303a186db6d287cfa9771eb5b261be5e9072ae8a61c5a402555d100111af3c724d8a02d583b0e2cb44491f83216b2107f912ce3eda189d696f0c9da21d1c497d03dc1bf0da0a05db64280b5408b1413b2d37fd9591049b78428a709abc116ee34416838ce84a8b114f15d1b78b69f5d237f2bc533d6f32e5ff291d12c64a9db647c8396b8a18784d48b31a1989dbc849d544d848c5c4ec9656d24a3b1c8eb72f27a7d0b80c612f7c7f5f994630834854d4b59ce5a8ae617d734011b7c8a15d3bc8673ca271e1992317a7892e29b1996a309645960aae2f5efe180209aa8d074e2d5c3734bae379a512bb65ff878d8808e2b719ce5df330287c7d823b648208048f5178d1e86438e2647cc98030fdcd91cf61503d92a382cc15548784c7fe0de97837330229a90cf89737a709213efbd7ac688595a61caf582464e8d12a49a3287b7f355e4b24c6f8b2f4bbe9ce396705e8705edbb264081136b0467d5b8b3c494392e63786389699ede25f49401374cb7f0cc6df8bb01cc382eb14d756e072fdc0e203d5d5ceb11b5595cf369753c6d3b879e9ebe7cb757514a379cdb49a2c09902338b1d8a39383f86e2563f26304e2ec2ebdcc4b1446163e95fbf988557beed95fb8bf38002e2b01b4b1ff913d0b396076802119940d066d5d10490eaba34a6285d8684c7cdb334c29eac4e32ca33d5833fab1e02ba4026687b0c7ce23e9b9d957420e915df37ce511f54e6f53fb7c033a648121a764f2b268faae1ec77ab73716c7f117c36ffc710fe61041277dc4eeb236a12c39e99a6163f3a8d0033b906b26b5271af8ba3e705c21d44475d8923ade714d3e99ab489a48b8c88923f7d63a45b568e2e1a8488abd71348200d2e5c22ce7c2e1109e78e1f72370c3561f7e13782ce724d3a3f7fbe41734988e54e7daa5f61b5a94459378412d619fa289e4f557fa7043272ec740baff64cb96b17b35c3a044353a16f6a3c44a6880ef80e93e0c1eeeb24b04039691cde73ec272cc2017de904174e33cead3e843b5cf298070938f33e83515760949ead9b6470af67d68a8b5c6046cba491e6355062e2bcd5b4063553698c52a8cc052ed661973be4d2689970f73a4705e4df5c3a52355f1eac7a06bb63bce11ce86446d4ef4faf4e01f2ed59bed150402ac7f7b8298fd9b8ec5017adf56e45dd2690e3528023ffd49bdf3aa20c4da6773cbe96dea0ee5ab4b854bfc19f048b5f7622cf43c1a1b26a29716af7d6cc45f4af45d03a46d8267fa6c0d77412cf80368d07970966636d421e14a0e31b89d0e700aea491bdd0b9fc515206c24920d558d690729657e62de018a4321e574b1a3c71d31eb4dcd336b8ba56ac35342ae2cebdab57b8f94e6d99b57c1e084739b6811c80e177310f71cfccb43a3011859393e01ebf96122d5fcac14bc761978cd6c5c915ac93c4b7d0b3c253197681cd09c1f91748381743e49b921162b06d5dd18c3a849a546caf8db88532dd7f6cde502cf4a8b1e79ae8b43eb7ef2d41bf0331947e3294fb9108c3a5b7cdb438bd06d4217df2c31a032b7e3918c09953cd9a84e5d92ab13a4134ac4d74fcc87bb00fd009922954b666bc33c4911109d9cd11fe13328f69a22d0e63fe7de627f7b940fe7bc06c44e538250e78a8d05ef573a2058ec0f463907aee1544d9715be3f4baf468a49a62a88859c59654658b9cb4f2ee1ffdb47461c054d180a8cc77d58f8aeee5ddf6e00d9c5f461009bcd245073a4849755aaf0ad3aad2c0e8b3d49f5488a35e6f9e8ed729648f0f8bac6733c38b4fb9809f2e9aa34eac64ea51e6d92913458045539f546c2b309e3a3f2f968016bd28c9677437c7e864d2595db9d6735ae826da883d498b15abe18b28d11ecc3787b6c54c9e4e283eaa912c891f6fe0a78b90f9af23c9c5c797ee382c4eec2c1016a1ad103f6ccb5a0b3c51925e2205eebfb8e3ba39541ccac854b68d5aeaf62cc5519e92c99b969d5eda23abafcccbfaafac2d34c5093b968ff6c552c07ac59558e214a7d94ef56ce2c17877f8aeac578e16b0d6ee85b065d48e565792875886f8d60d5a39c9552154c4e46c80569389e724b110751d96a644050cba5479cf72282fc1647536ce9b4d6fdef93974e18b2ca4e9a5383005d353b1a50197b50eaf7eac1de76440cb32958308023bc638398e09df844522e35bf8b9e125dc199f31e546f6e948020e6a2a6c86809675b11c1776d23254972711cd6b5f1e943442377f0687a0432a3f44926089cc8130283e94b0040a247ac16c11d985f609858d59547266552483e37d8005a9de669888030c5816f344e79141e0503b2b7e7a6cf745a1b2b63ac04a1a9d16c609e27f23979885a75f5c0cbb7e0a514d30bcbb22271dc2c67c3ad065a28c52f1f9bc9e1e171dcfd236e9f3201164c8dab180d762fc45a001057d03d6a59f4fbb3bd73993502f2e8dda64bb90ced3ff4432e73d8a9760055596238b753bada91113416b9aef4d064a6ef806144b67f7cb4c37a05e4e55237ce9b36f12b094898b5986c2b489d2bac09c546948fb7a22a7506d747a55cfabe81348c37849bb18701dec74be5532620f8865290496052b6bf20e76dd2b578ff806dcbdbceb8e1cef2eee58f025f0e0b21fd312d310c5086b7fadb31c29d8db9785b1a204a02fb0d94f142201b8a006df71d0c9d5d6a0a690c3ba33cdd56e52ef314464d3f4d44682032e7a797d47f0ea120c0585b64b68b8e703c042839f461e120e82902b8116dc2ae5f08ed06b5cd07f965719c261ef661e98bfc748fdb07ab81a22239bc00ea2c3272639b86b234af3f034dd3ccb053aac794d20285e76f44ae7a444ccf8349daaa50402536a39fd56d5a1218a99e2fbb31bbd8193c00e00cc5363309f74c57b10d7b2a18573d715647a8ca8784a4a578f480aa257948ae9616f5b145dd6d071699e6ebbf596ceed571c341ba1fa011997cd49003f024ce835f5a93282a698be54790fb34d9806d7ffd0d3ce8bd733b7b7dde8c912776c9b804d47998fce0418f4e1fe370c0874e923ea08470f23e75f8ea653344d17eeec40f4042817571e12a669d597ea65e09883ffa66e0937d79a65fed0dff170c05d3aa7528c88eb9895fb47aebbeeb234e03ad52a80599375292dec8cb0eb275b7fd3db98b2eeeff390c158473b9b28b3356744f042ed532ead4b0a9149380f6e8524feb1d3586b8033dee12a5fd1a3c7c50a7b6e4b74eb2049c5348272b53cf8ed07e00e296d0fb28a5d3dade6748a73d5f708ab14af377cfcb32d747e14a9973b2c62c750e1703cd8a40381f67caa035db3a3e10c3d5d50c3e91390f06ad3512706fca963bc84d6e5cc04d4383b283a5e80a49e0c4f3123f7f01031102030f961c5edbce59c13e83cc893bdbea9557bbbb0fbec310012a71303bd2961e8894e464ee3b210fb0808045a05938e08f595d651450a7e3910024e9fcc1257913015f0d5b9b13bb1722854171006177f33768d4681a6bb21d968ac8f3341b5a75aac9f5267c92d3484ebb624d9b7272461dce529543764bf41b4d7b8222469e552ab66b30d941ea33279c5854bfce8d75968b94397192ffb24afa403a5f994f8b839a2a81b9b4b60de88850a8a4e360cac5ffbfb07d12d788629280804b81ec60e998002b7e3323663bc5042d86ffe6563dd872702632cfbd00883865560616700520e1b7d50de9a481b3046a1e24ba3f886774d8090fc20fb0fe6cabd2c022cb361447bd87453f1eac5da203c05152395c1dbf701edb542aa77ddde9b4f5ca888ef5c16c8ea5698a9643953a84c6e2a0a9c8de69771c019578a8fe7e32f1b349eaa96806689dbe8e3364b9c19d787ba2188b3d564dae83b87081628e2201b2a49c8a32d18f4843d5970c3e96890f0e8c3d0d47df842cb4157f3c7f7c5f5ed1b577579d71810bbdfa644e71b03b6a086ef78f0e92bc300ca39a32167459683c60c958637832e687cbf3e46c53f6ca204e297b4bed76561976beeb65067f85339f0d1bdca78cf6d788b8f93302c68a32293f2ee30124914c60eb2cad44f332bce596f66c7908822636434b0d48454eab12b0b68d0e749f17827c8f8b0ad6bb8ece4dad1de5ef302a7cf00fe5bd2013f5f2f81030883d321a49533266c76eba47bc3a2c8211ab5358ee1abb4c408a84cf806c05ee7280164f5b15582a1253c6935e424701f82e6c43836a44118b3337d0b46d8a60e8b66572adbc3406e19f33b877e23bd44a98c3be7277a0a2a93cbc51d7b0a7509a5a70f20c11e379c65505311d407cb09bb008faf5e41c09e6dbec50860721dba6ded18dba916086b4f8649b5b107c2ec137119edec80d87d53a199ecf646310a0d647010c54beaa2a889184ddf843697b4619cdee898599d881646b384d5c26cc22764b2ef8555e0694d0b3bbb526ff88a29abd98f43ca0f12ad460040b25f955820469b11270cad46d1b8e849a5c10e02793030a5afb1218cc2ef843b015cb19c7f0df1c61d9a3c94ae622b619f21d70384fbc03af1ad08ac926365be23217fd049f5434e02b900384dcc81210c3f349d0fa14dfa6d6607b71a95709365f8b424c596d0f6cfa4587393c964d857db71229b88ee8102d307856d0c51c4c2e2e47be6f5b035a22212fcd36c5762c1cd0f5f55ecd13daad73735b0b17d47b7cb396f2277e9acc2bf352e97a649c4501227ac2d743724f9159dfd4097e08350373511df79824dfd619fb9e5bf162f137bb3c9b6e0aa7600dea756975293c1c8e1b1363198cc4ebede62a07439c6a2f745f147436b1f521b8f8af89c2fcca2c061962c8ac25f1343348ed456e65595e120c71a18be8435f69f19cfd01f8af6a6710cf2958692b8ae7fc0b04d1983faa67ed4ddc5742643a10bea3123e547caeb0059ebeda349ce3048085f741c775959f1ddde0b8bfa52b77a15b0707031009a048e91e2eee91096ad95687f970871a6ae5f2bbcc4759d35e41ce36e4e64fd5de66d2dc99006273ba96ffb63a9af7b0584e4057d01df331dcc4f1171d41112e61f211b2f420854cfd4445a55ef1bf3deff265eaba1af3382f3c32d1eecdd19c08c67a2a0c4e2850c597e255038820ec43aab689320ef5a55dee45245c035ad2ab46926dd193dca0442614c86dd3cc0e2575195e3047dbbeef1e932a2a4cc23c47537c1907312c6c14ea4459d824c04f5ca59b9b1fa1e1242661a3465c75aec5aec5c77047650f0dfb3f1f82b3363689a7f94e9428d88385f218e300d04531d8fe0b945c3374f4408f5b9ae8643b05af9e48e6bfb7fdd9025f3a635dc2d403a0f69cbba75b8e76c4e3e09d4bc088ceb292252e769a296b90f236326faad10f58834eedd7cd60abb92abc8eb215b2c57b3888b51d082274d54f9375fde9f8462532edd9dd65b7ecf685ce1c8b40d6e7f47a85b9b9e5ecc01c451db39c32dc670834afa5d2060773e43c743fac8220e4a1ea31143b085be0782959d34ea536134f7f94667e20d49368ce3c7328c3121aca0cf9a24db276b7097a518056109f1bc8aa2ecc95f8a649f5cf39989c9ffea2a840bba9876927f9c11e9239753793c0c32eaaf5e243a54a67c2d92925916213a8201cf32a89bda80364ef657a876f61966ba89d0154f092e8c22da9780297c0cee8e28028a519580340c08141acd0b53b65ccaf10615df89e25ca780642b9f2015a7976ac121342297fa0f3cc1ae6bfaa31c3a51330324c8cfbd7c93c760b0d2a5ed06cd0a0b7a23afd57ff677e6e07104b53bb2b026345197aa969aa0d84c4be6c8d280b90dc182b344f7bd9c650d99e0100faa8c4520fcf892e42eb3097815123b9724df930a56b9438bb9004b097600831dcff6f2fd2bc9f43d2e52a2130bc47fd5afbfe009c8fb5634cdea59539cc74ea3054ca8664a2a49f07c9993eb99f92b95a298060f7e52aaa88b166e4be6b4dc986178de8c65f3fdb3684ab97454c057c172da7a5108a0aa78042bc9585ce4da446188c5aecb8184cc887e856189f5eefa3d0506d6f26cc67f0279de33c491ba0abfff1c30efe9436583098c3adce1f4a2e9b60eddc1e0f8f98b209ae8a09212d2e76aac32f53067311e23b931c3bb596ec346c2269196175ed3204d8cd13279a5e53ddd18e63301279ab8c9dc4a37cbbf6e2478204e78e33c3b6113c20761e44d52f724aa4a70d628c47de53bf10896232a0b265b8e30f03e88406bd4e33aa20fc316e6c9d584030a586b92ef825f0cda7a821af1ca30dbcf0a9bc04baa2476158d6f5ec177a7aeb1ef78f883eef9a4a7fd5fb9c51b8b19e1a3555365e8c95ee0e657d89cbebeb47a2ad21d8e5574a44901619b3a4e5e57f3058b36d3317e122c863bb4c154dfa87d061e3e1f4e74069cc120eba75c616743dc1ebb0e1192bcefc0d4b3999b0bd39110a0e4afb25974abbec30c85f8403f3a74368c6971d3f096ac1d0c305aafbd1381051f3739ef07ec74b8ab977f05b0bc1a1af1b346d61d1e712a660413075a191b997f347fc1aa9115a7f2f8476e925086df11c311c7665aeb72eb3307ea734bd19ea3035a091ad27403253816f172995ef7d54bcf2abee44ef6e9beac1805c18e77863bfc4cfa828f2396d96f14eb583b5e335b0a8fe2d724e5510c6666a4971643e92fca4841b2d33e8713e573c33d531c643c9f1b3ee5d740851ddc48ae1c6c3a2da76f2ff3bff6bb3afc5a2c3df901963e606c2066c04bd092222520d077da0b8d1c83723c842d2156f94306085c606ded8e17cf885346c7b87db1268ebf5057c01f7bdbf275d5b777a1954e0d46ae4c819ec69243bfe270e22f8eeddecc11edb65dab1d1adec839dac2354e5fde6775828763a37f4b5579ce6d30b453ced773a65adc297b3e9590dc2facb2f1aaf6750ce1f92462faf6831bfb18ba74ba6c16aa595736b7fde01bf066401f5b996d3ea1521d9becf31319143d4f6fbbffb10d711a62b70c0b938702170945d86d117b6d37218b44afcba88c95e548f5063c56dc8a2aa08f146d8c3a7941db6e12b4513a3754dd487d120d0c4aff3b580063b8d69993c4fe1fc040569ec01d32a9834119670e3c8c12549ef3dc2fa1e40d9f4caff68a1967d528900c55fd3f752b8617f03203f282199004a6bdbed182cbf73d17672d3cea61ba9886f311ddc255860809f2704aede2dfb87a7b296c0916ba9086b3a5b279718065182a29a49e9adcd7931d46ba05b6395c99912d73c1161501a25b3093d845b0512b9e19271d1ef018cde0151a36d6dae73f5fc2d60571002c2682e5807d84ef6b03b698019d233e7512d085d7d5f99656be3a92129f04a2582c6931b4d6805e47cf260c54f8ab933ccb84e8e019c23c6400e5801dfda3741c14627fb0ddf3b429c63b16c7986552f71c1087ef80c1131d840000177872f2aadbde83774b8f6f698058380f61ac396ecd6c283cc8f5b551bfc8978e6d8ee8d6741d37124e5f60f890c4389fd1b9a6fa2430dc24b1de40500bf7b323cbbe8332c73f2387dd6f5197a1e5345e926bcc880813579a1f50a91df8813ca8eda5cb99de51b02357fc332d8e750b9f979ca30a6cb9e0897b1abb54200e4988264a83707b7b6b7286c3df54e8be8fe8ffb31daf5dea6090ddcf5f27f42e161604fd7f19edda800b0e4c261b58794a2e1a79d687aa8b8051cbc79f633b33511b2dbb09c22c13ab71fed1cbfcb32fc7f51c7265447be5ced7b45dfcff91e4e80b98e6622cb6c978c631eb0eecc799351c2912dfd09f266e9178da94c97733076bf9ee138c96bd21c954b61b1c29772111fb0a722bb079a6959a5b9965a98bdfbb9f1b8fcc7e6d4e1cdc230d76ef1c31ba3f1d5cb3244374fd981a23e649ece107597361a3ccf30a0f2c980d7ec68f839fcce71fcb0132b840183732353efc76710a5d0939faae790ba4b5a7fed84aefdc0b738fa811648de4a0787c0f01e18a8c98db7343c6c42c876660626d35b9f2353f488a039dcdcb17f1f3199b440d0cc52ce5193670c60be645a1b7989d116510cd19af3b7339e3e3b971d3745cf97b58a50b31cec86d4961b6426a99a76652c2448ba857ddc1c07d37dbb7a241a8957440a79a06eaf1c45f962ccb4e39e3e285a9e82efa58db5c9895fe4cd8cba839e70b07fe1766ea64766f82573386eab674a5132bfe415da59d2ab3cec3dcc6a1f957abffbbcd273fcc79f5e291bd8d19109b02761e03149e467e4adb5797042f144c056279ab1f92519dce440eb9d98d3abf552c1ad27388cee27212e4021ea207283396737696f6c0b51b76ed2605c15fb283f41ff23474a30bcae82afe7a3099c2e13581ee6c4eec5dca6adfa7a1dbedf19bd77a356cc104626dd1872f4de66dd2ab03cf0de6aa627c3efeb2899efcf6eb362524263e0a6cb6dc2872f6fdfe7831638cacf7050a8087fdc9f77b3d31c602d62c2ce4fac27898108b1e9e8008ec97c9a342c51a81a827a01dc7cf0683d52b4da4c2168e3c3fb277e5b44473cd4b3367b4d3ad698a52495a487ff322c4c41a4437c0d814ae97294260d1b4ab5f8e4eecd00f759aa1e40467d134dec35dbb1407ec5864d4830bbb9236dbe447e6b3f2d168bb1d4a562c12ed1d048658f85af589e70321f4a97b68b5dc0954c4a8d3ae70e5c6bfcf2717f784c4be8e4e5484a62cb527902cf2d7ec56dd68efbe09c0b7065f533a92f498b963e4d5601fa44a310bfe302e70e55e44243c38b93ae72c10b5ade2c4d25a5dd24b441bdb6af6e98d40918ed2dd69824465cf29d3c89be559c5ef9f5c504baa0f0cc419ccd7fe597c0781597f4a110e3f1f427ffa9be06f4ab885b555cd05d71647134eb5fe02a04dcd14678e1471ba29b76408be083603482d5d8ccd4c098cc9e882fa505c051eccfdea7a07134a204bf716e2890dfa85c243f4876138a9fdb4325b19ed88e9aec66fbbcbc27a075155e7d1ee4b7fc074f9faffb2fb09fd55724ab6036e385832c2af61c6d8e8045fa3b0621fbe57a2b3649f0f97901119c98f519b488da12c861117cd79368a8c8233d8552c6e359ee6261174e2199474a03ac0a9e7a810a652b91849f52cbdcfd4bb932c414b7834d1ae7256788bcecfbe411719d380c85444e31ae9557f3b94904a2dc7d53a99c875f49c73ee6d8ece37d0f804542230aef226b502e4b0dd7dfbe4945b2ff0e61e6e87bfac08bd842d22296db8dcab51b9d50529c1da4a8fb3088e331d2de3fe5488976b7730bad865ca2e5c3dbe78863e2cf0d00bebfb9154c4774a676535d9e6c464a3ea57b11f75a9ba94e1710b88a9d697ada8274c0dca117930654b33a313eabf4fadc3ac9e079134a011c67bae1c3daee0d8c7ce92f0de160e37725b4e6280fd78488966bb5532f43459c49f95a43d495aac55e81d83e9d92102c874af7398a6710db73cc0455d0b6381ecec6dbf736e338ea3eae5a5339bcaf8fa1cd9cd92039c560ce785393e6dbc79f2b2f4e322c98018e86cfd4560268928d52d19d172ab95085fdd921136e73edc09bb19dc9cdbcef7b6ff8171827e29c0321c47885b0ad2e6184f48ecd7424dcf2d84545ebfa5a70d133e2166681f7c8a198ae21b6233959c19f3ae0671ce82a139142e512e69bfc878cab36f6f5c0aa5a9a1b88f80102a112182fc888e55530d71ff845316c251cc6cf218b64f5a518c9286d4624d875152291866142872c662ecc90fe73f19da621c42fb142e2be9ea78dc12c0fe245c3361592fa1421a7f6b7610f353ef2ab39cf1f3a30563cd122c7151bfc1fe41af0af9d245f94eaf3cfaf7e79279fc6b79711d25175f606c4abe1a7e83c8945dcc43de5047be3831ec63918a5e66a82b0cfd76b781ca8e4d371b3f425b1c7b9f5d7eeed0d62a990dda2a7fe1fe2516875599c00df541a0e203c1327011e08e189f808fbff2daee41151a1217b575d73299d6d9bde22c5cf48afe07894c42537789bc947570cee465e13cdf65e16ce4e9aa24d57d0f5f5c9d02e4b4e250712ae17fba3b06da94a65c740e7d3c29fd9be112a56836c9e0208fd7293f7ee302b17403b7bd182e81c11f9b9cdd4422a68be1fc715243383dbe0ef444879857ae1c080f21c36db75377412a15bd899d4d1f0019aa8c6a59d740e70057b73c8633bfc92e52334ea5a50c61b0032072cce68a732fbd1858622db3319c6f1bdeb7798d809b183ec3098e8dfd453337f3e52ce0fdf830cc0f9feb5ce125442888b1bbba5e2779b6b8dc826e4603d888d7c722c56871a231d3cbc061affdb2268bb1b208887c276611f3b52feccac1cd0d2bdbeee9eaa8687b9ad37e253ccac302efc6d1eef3b1c2ec5eff3a57961d6c44b43b4380843e996f5532650433e481c16389e693e2b5d5b91cc60d04f3374885902f0e32b1e049b85aa9a553085637bf55a3622081c6ce439069e54b8f654f391a3d5c16986142a183b6f011baaf9eaab4259b7b7488e60d88d4c344f574dceeea24ab0c2a6eb650953daeb5eadc788f488b9638b796dd53652b2c9a087d4668176f105025ae9a12049da199c027b9a9706f5061dcd934b39f15d00bae8bfafa0d3af7dc05798cc6c9aca22c68e9aea703d8fd4b0908457df2e4385caa35605ed109e4e7f0fd8181e6bc70a9397a663a3adbb9c348f6021c812e1114610a6d8c6f097819ede8074e7727b558bc81d3a3cbe50acb4415e98ce26ec9d78199629bd9d090ee10e686a0c91b5aee24b592224815af0dba67fc9164eb9652b8c7d0fc1025c67f9bf8f78e3e8637e9e9d56592940949b2ac9c845831204e5bf8c48a0c5aa5d43cda3ec68870274de6851fb768457363e5ceff8b94760b3883e693be7e8847ced8ae87c94fc2e69044e163cbe1ae8dd1a099908965c0b2648934411d381bd55c9568751d388f7d558d0cc087c152044dbd7e8c4b3de660def06cb164c346c38914cd688592218a7a64cf65f5e7c71d7fc1a2c5f30abf193a8c381e7fc2c70771c145ef55e2661a2d10cd48f3b4467a2dff030a958d2701cce704004d41d80de4e41d60e6b311f7fb8a88abe51b70128974a9c34f66124dc300bdc46978a182e27f86a9757d80ab28ca7371cffa459948c4b93858005ce478ca69614abf90bf62d95c3099ef6e3739b966be59776ea1069639af9659c1528c270011cade968b2619ff5e81ad9015cbff8566d1ab0f75ff9b0ee98019c42ee9eacea82266e954bcf662ec650a09c488aa667aa9ca898da73f033eb4ebac4a2bcaf19ab529af4efd4024baefc28d952a8277bb3756e31f94c133d54481a2fa85da605e562a0e8963171a91553142ecda4652e1a27821438b051c85b94962dfa4cfe2c961c438b6867e8d451fd29c1aaeee6b7b9d0d563798c9bbd8690cbc1e79b7bae8e507cbaae846c9bb1db4043a6241959da48ea53de5e9eff7ff6e2ca8721b1ffd2229af4d490db9eac6804cf9bf68376889f4d6dfdb6155b33d7a1ec800ef56ab9bc8e40d20486a61bd0841cf2f2eef2ec6095e073b399ce2f9c43a86af27835d7824bc00e3258c4cabb9953ede96b04ef00b62185c99430ae420b1dbb1e187e97d779d69e7199823898e1b270637818a7226b9619b0c025190690d1fa6c3528a1039c625b4be077579ea790e9fc1121681261001082bed042d39cb4a30cb9667492000d5f12a48dbb11e1cd4a99412981e014850de0868defdacf1c22f068a3bfa7c8ca27aa78595cb3c48260dbb4b2d56df59b95e9ec13b91f0a1512d05fd79d179085c445337b1400c0f989d22402d5405531192ac9c3e3480005d827e03de2b05faa156705c11a9d891ee58d87f56a3d1810495766db20e76ee4808c5983eb81079da1ffbcf0ddc2e288053b99bc4eb97b714ffa28fe07cced4a1db15726eafe097230c3642c740fa57c18d875d6cd1064619f527ea76ee46fe8cb36ef776a1f39e6c19dc06b721bc0ec8f3449c92460cb6ccc3aa7b18325f23329ea8ea861f834eb69dfc7db0cb814553724089ab316421be448454cc460b5a2e369988efeafeefb8f2c72288aa41df4926f15ec97db005037903c35eafd5c58003c49d72a3aff42bf72710b8fe74f9b0e231c63ab8550d4026163bc989afc796a0a1b60c3e89c3a898497581372e4af5930a1b82776b8437a0e6ca48661be07715ab492879ecf267fef6aa47cc181d5c78f983f6f836ec34e9b9653a8e3af41e1e89942cdfc191063197ed90b190d158f19aa124f8058b24a1593804c71df839cc07151c023581d370684f06290488e2af10bdbbc8fd1b19b11e9aeda79e25b9c2226c6ee8d69bc6c826ff56ad804da1ff70162e294ef03471f1af4ae6e96f1f88f633ed6dbfba35c7320a8b3efde124561047e954e1876375234a3a8b8afe70d7dc7919ce6c42a3e432cbfe9f99c3ff56b24aba148243848a76e3584815b4caa2a6a89f466e82232cb72c07dc0158f3e1253819adf03887d025389f05657a46260dd1f4786601e896e9c2713f10f46586baf3b33af6b81fb87e9f1007c2d97e247adc8f059f77cd803a1a0acf2bd9d82203427f6800e9130326b41a86a483306046befc9798c0b97659f7056c27442d1b5ce7d0191a12f864b9054c6bbf4a9c75bff639025e636ff6db572295b08823643870aa62108f84947b73a35ee621eeeb4b5342e6e711fbcc00218c341ee777c38c8ad978dfa9501c2c63a268e9c9317120c58d0caad49c8fd2057d8290066e314e30d64fb5b2bf0d999e2bd6a952e145341e737f5a450765e6e778341bce4534c018b96637af1066d87d40ef2e6bf89efc4a34664a7d87d13ce12423dc7fcf9360e30404c36a7207fdcfd4f4cd0c16eac55f43ecb0858ce9ee6284c1888ab838135531cc7b656b368c6710fa0b0780ff18673bf37c9abde372cfcd2942663af8a13344569308489d9b183d43aacc1e85d5bb70df9e338a62e2803b3828af6520d610363132cd74415cb397d2cb7e1be46e2069ca05f8cd3cb8b0588922e8b2a998dd1cb8b33ac93d29aeb729b665fb658b1731ee6f86d2b30e91a61350c2adea749b669fdce8af12f0d4f06c1135e777d4a1a7a4b8805948811f6ae7032a583048fc07a0aa60a81669995baa6e968e37de369b192052301959f8798e2bdabbc8018e9fd36dd43117edd191fba5d8ce40a02053ebb37bae198f6c1f708805405d620c4d28727427a29334343a6065436c506b64e1a2bdbf446ee1bafc9212b33a8d8b756f97b778380d341ce84973fce3bc143434048c84d3a84939ae7fe6e176ef730c69442e431191ab662d93846fa4c2059b848b24eb6a519245a94000a61d14ede7f653390ef9e2af5a8343ff2c4ba1630d7c23ca1473959b1da9c73a89f9eff8420d3a89b89670d022cf9b4601c8c4a83527eb5e85437277efe39c76b1b81b133b2c501fcd83b35dc909746bd71d8aef7c8ec0279a401a940990d8f651c32d87913774e3bd7050164f9183484b526de9fddf183390bcedca1231df76c63eb541c494fd4db68ebfa5ed32b45079ab5c46f1c31a5f9e44c3a616982e9f8ac71f2eb7be05bad8ccbbf7e158646075708ee4114ac4a57005ce80cc374243f067cb485ba1aae2e7333c98b35c9f4b211187a26aaaaa84d52952404fa2ccd23ddf67dd1a8e24ac2e683cd75bb801d376f9e8bf2bb5e52d0d3ec700a1114c9a55086ea11036dfe2bf1a86c7293b69600765bdd08f430ea94ad6825e8acf623f9aeb67fbca71f7ab14a142dd69e0da62a66a3b4f03166ef9012827c90228701d624fdfb2dbe498e989436770cf46fec6a3c8d7021d95606c8e7014e90b31f2eeba7768587348bde1280f8a9633a74501a89086a7d65ac572391c9d4318b9483974df8f1239ecdc1737b5182cce3bc6953ddf6a83fbc3192f4463ff3748435c790f4e5909066994da53946a1bd88f0d10e5ae9b1d9f00aa6c1cf48c7f2852d025acfbf7e54407a772708af7c41981af5d02da2662a71f37c52ab55c7e64f154df123726ba7b555f45694e8f3f2593ee2fef104df79b00031fa82ea132f37672e2a6d5d2e4e074d3b2f25bf98226d9f086ed2bfe963e8ecd664215626ed4c391818a20843516ce51f2b2038c9899cdf40f3249adffd8968c72424f7a40070fb9e4760a2ff760fb355b388611e7df7c52e63d71f2a3d40402e9fb14a2ec0d3a30648828c1fc7e83bddb6887564c83ed609db60a131b21cec45f8a9c0f6bc9ed6bd248867b4159a3d1e2393231e4995d22c75fc6a87558508cb0a96e4612c0632701a6409c7d4554870b949f29717fdab4f089641b90f4dcee86b05379bcf80b88b12ec1c347430e05e265e0e8a44c5bed589519c6aa719d638fa7882b9301578a18cc6ba0d8c1a862c06de041c87f80b53a50d21884f131aea2e69af4d7ee2a5abff02618b6e5d733b04d6749833d61835d4c5981ade832d4b5ba5ce5174c355176df342289dcbe323a8780d86e49bc9bd3adbab40440d60fa538211e65e10c83ff3931085af9db339ea68e601fbdf7097458d912908e394b06b1ef2a7a38103910c82ed516e40aa145dd5d14c898c6a1ca56aea6ea7dd18bcb621364720ee858b326367518d6bd694e0acb126252a85bf19a4211d4f9b94a4bf7fef1017e3b466bfa5e4e3baac4f7387c6778d116bd7c118b3ee4eec56090d185c5284aade38e18a8fdb43554b3cb0d5613488eed290c012c20d1ad77ea399fe6c572a6d6d58f487c25ec8183ff65f8cc4d5d7534f825cdec552c9778167a65d69dc7088502e11f089f96fef043951adaa37c8558adf2278ac39c83ef133b29889ccfb29d0be008f74fd3d2f583a7699aa95c15881b642d926d02cec45603512a118f26de10912cef08aad0eb908a485115598c7d15f3dc54228f3cf839004498e1e571a6c0c446940f46dd42fc1c2dbd4e1d992c288f9140bcba2b63a5839d627e585e02fdf14b850826586ec12c89d29b088cf41b71d9ec5b90c893ea404c58f3ff4ce8866d3339bf333ba74aed4088908abb214a7bb1be10f56fd7270d8cd70b05e1bf0f14247a6fc88ccbedba7df444956e7f352209a4a7c588b54e275e3d4d75aaeea447b507ba9646996f360123651aa8e2e776d25e5e3d66c25ac0de777cd5274cdc82665c5248285e9165c8d8d4c583d3ca8ca9c0cfaa07cd4de88ad6aa9594e61d6a1d19648386b7c64324445396a958583f5c28202f5880dbc6512e440afb848e8ec7114344ed8b55950d9360f0b63cdc874b2d9b4e51027c6e5f44946f796d108a84b0352b47e3380f9fb1b13840901607d9089205c29039ae9d941d211371468e424f0b4de6a66f2bf06a309d5ef1a4bec519dd61b1730247ae5dc9d637ac870759b093c70ad946c8978d441b43611589572549313161d27a357a5ace143014eabb64159be888539aa7a2b2b0e270c0d740ba4d4a7edcbc5daa3c64285615b7f229f9155e060e1ff56144b9ba49ed6056f9d5b255cc49b2e78f03affef1d28a0307d13a13c2b87661e39f3c1b7e0978fd5d47532d2e1cffe244c624a9ad247666287c5da8a5109752f0272f89f30aebea1940ece6c0f5f3bd759a6d0cd28a13f0272b52ce1ff86354f8d6da32eec04e82e4dc1025b354c8ef092b533d1895f0d0e2b97e7ae1452346739d2188dd14b0ba9f93af9782e35f9cc49cb29a23bdab3f56e54cd9da52d309d9a2799348eb10ae50a616112389e8f79b0d4bf5f30e1158acaf42a3a70d137f428cd03e7ca6a650ecf796db5085a38f3326a78d1e3ea246e88f1f7cfbe5de3a3173c4b571c78f89113ac287b4152a87afad6effcd288d531af9ff3fe7a8552ce8a89b398a9a5812f5b0d31a7efcb74af3b15fd8ed73263b4e3dd11ce5eb45660c638e42aaa8c54c36b322a488996c2fd392b364592b1cca3d7d72c985b66c88f030199b126f7b1b39842e7ba264364a0e45401592cd5e0eb6f8645ab28aaf0c2f1c14e54a4af6b1ccd348446494790a52ed0ec5fe83bfcb5f4d60dea55283fb9351ec7c053381dd0676af15451216ab48c530a3243965080cdd48624706e840bcb18480587504f26e570e4f46127168557e41ec514c890127b1c928d641be7615c6d09a937704919f822d5427986fdf130cbaa09a2ffc8cad9e4113f62934ac4f4a2e3a0bc42dfdf868ec5d1c3698b2f4ca1063b1ed35c0178d381c76ceefaf93e4971715e126ecb8a3de6745b864ddc9cdba84cd3692a40434942ec105132b886b85cac663ea1205c9131e45393d8b17c8728f233f4c3b34ffd406ec3ad75aa22f684291561a111bc78b9c2ae02260fd0e674224e63ba03793509ea5e76cff0036003f387a79f09309f54220be22c4468b1233a5dae575debde4b10898c8813d83ee317cf9908a0e915ba2aa9e2f7a8e61b23353c8091a3aef0f57ddd78b3c87edfb3d8a1918f9b783db03580f5506b833be41291a85083e8abbe620436a9d359c943bba747bc4d34d8f1c20320f8efaccb27fb6e887c7246b51728067497c13d417588fde6252c6e9dae78152aaf3d85359aa128d769b248773394685c2f1540a99dced487be0c16f2a76dabf6043d0c59974f6ace0ec4d268364a51888efa102d2e8fea603a26efa82fd322fea359b6f671033b00d0ebbaec1fb1ac3e82b92213641d581f2f3d20ffc17a11c33d264d29cf0de92332a97d8a13023a749550e7fb0598b87929cec5295d188c3ec4489ca1154d86e8ce7b1d2bbc4dd907bc6e880a9320b12286025156bea997662765781386db424b71590a6f0067f6933d1360e2896e0c9789af01dfab63f4c60047f3387720c865876a72c5ca32c6a2da740c567cb266b7fe139f5b3beccbc1fda2fc721a5e10604616e80cd9cb4b4609a91cfa2f7d9a2e42d55d8f5765cc42fc9d8102bc87d9d323cd7e7d3ffa61e22c16c7c5acb4e08bafd4692fd77d82d48eded9d4a26eed1a786d8fae806597922ced03844853f8871a77338e38259379449b670305628a53e5b0b9a2f6ed36014530237a28c047f5bcb6dfb8734b95757191cc7e094828bb76e0472cf1dbb46ab8feaf4087313561be3e2db80b6778731de3e4407d3acbc5c63e6171de72bac6d9f382989dd24eef994888ab86c01da63276618c14314799091a2934e3a675b41e56f81868307b702ae826c8b22c6e3f7677d2e89aa2103dc29cae5dd2524a237564d5489ec575c64ecd4e15a084787f1fc4d72924b7ff7e924ab4655cfde41712f437e5d7be900e52d71bb4794103e1d73a4725beb145879a7062d9542b8dd8ec0f741882b46bc882edb79738f61933f4ed70d8811fba361c5b38cdca09b1971e44120898599004e43f245744a4c4e6f85a9208a89ed13407d258e0b757a0a411f6d443f61974624a247a58027fb05c5be9245c350c16fee78d447103a1f34313469d682fa7a4e6911f97bfaac723e07ed4e978bb4a29ef1a042cbbfe212f6277d0e19383311159958a717ed1442289ab1a0a724f3f5dd785bcbc6d5a640ff067ee32b5f70784bfc10f841a30f12aa8c45348bf969d5223d1b7a846d81c8b2b78bc7a6f55c4d69adf1ab2edfa0e9b445b269d4dd36d801f871a8488590e1c864b87b2c4a3460f9ca727e1bd23c8acaf0f566a4d13ff2bcab3c4aaf99c046841c5a3fe1da5496c8a616ed8b4010839022398a591ae131915f48876c40cc28c60e62180a57678521028037208959cb767783150c9689a06148c9c9dd8bb14463308c538ab6f033b3920f7d36dd376c45a1d4db5ceadaf1df6df824ba391c7b610dbc7ebd0edf20af4596dab34fea6fd56acb826db6b8fe21cb8ad1cff79d2f1c32c86dcb0fabd9b04e86df55c98f31d62fb18895239ce640c929c76933ab2dcca8b4c8d8960f4fe1dbec711277d226a99f2176405b191d00df744afd972c258724c2695f0e596557801005a722bf27822e62a6c97bf780c01459a0d268a04a1daa42fa3d9021af49629ec819febb0cfc78d976362dce3bb061ddd24c43be6c8788261cff13643a80cdc1d1829d9cefea93549b8671ca5375080af1d6e3b41686a33ae92729f9fdd08061bc425999843da024ac6f37e638feb73d38c93693aa2db935fdb3c62e08d36a836c25e86c85225493f50771fb81c1f352d320c86d22450e772b7449c91d60e04c02e6a6852cb566345c69ef831f9304c159ef48fc3a304c1a00212c7f695ac8dc8558ea310005f1ab65ef80adc4787fd118cc25260e601557b113ff1b1ffe478539a64d568cb548d03cab6016232158a4818499189c1b7f2399b8f2bc77b5ee834c71e893bac609935e45699d03ba073fa0e125e1fca699b0450446a9a47863d25a47b8570cf3886aeeae5de867b72b93df3f6133025ffd669613012a56fd03150913139cd31e8253a7c7b8046c4262d11a1cad5e692ed71bcf39ee9d26d2dbac29944682ed5016af0ee8d827afeb67801be87bb851ad98b9687a184c9640ea5c5461fd6d1eddc5419d6ad07e6f0c90225a2233a0fd38ef5c6cd50ae10760c1f6403fdcf71a3e83a9701892041bb810f0da22d7e9f4ab6db090be4e4ed558f88a116082594677c1fa85f775d57635d694e43eb4e21ec8800ea683b3c0de1278e7fc44bafa436033e3871e0b38f8930cf5fb1e30c1953db719aa58cea218acf3a8b095e5060bd40f3c402d34687d745f9eee7a6c9288b2705d7ffe962ea8d059473079735a6ecd9c1bd1f4a36a9e20210ce1bde8f5b74a0388c61a8aa56edf2b0aef737e3df0c3cc3438705b8aa8777d31a39ae650098bd8dfc13be1dc6ac368cd17500e11a3331d352ebe4484051c842d7073b12b38ac549136380ed0218310c84bf3e72767cf4b1dec7b63d5a3911593a2a8cf1c5454bc9696fd8705d97a54002610954023a4368003bff7ecb8b68e49dc19b638ab6a970809fa069e680c7a6620898a533fc3fbed3f14026f79bf29e53e128bfc7e90a98411164e3cc30e6c6a4e8d9f3b01d145f42460d060879ba0861ab9992a50b850efe80af5f4cdcd384e57e98e12ca87f0cced6da40b0244547953705e3536b6c88a5e24a3a68e4c3bec45f4935380d08898efa176ac6a8d6a7eb8e599f7e17a9fe48490dbd23a21dd34954cd457441fbaf57866dec09170d5586f977f7cb43a93b1b8f29eab8171ca31437ecc12943366dd863d3cfd2f79373cf9b4ca0bab4d5f1e30903874052e0d6afc2b489314268b17eb3365fc89869aaa8dbfa3fce4b258d99d288739cfc03b1aea60f335a482078737cd3e0c7c59fe310cf3c4a4b931ca14fc3885546f597cf6d547500e96b3421df8d94ded91418aea45bd7cae5cd66978d083149e032b7ed04006a20f01bfb94992f4ec240cb2b8a2313381d5b91a20e37f7084854d9ce443ed0c663292819ed2a8927bdc4e06b20d89e5074966179b59a8b0d4b1279bc5a5975e92b8b35f14c875c628fbfdacce8167947fc3c41840010c81c62fccd54b813211fac10f448cf432aa7f909aaccbf877675b94c201c44a97387198d54f09682e2bc04db4ce4bf55414f3f6251307dab1d4d4dd67e2374e317fb76ead5cb78f89e1888792e55ceac5aa5eb15aaefb72b3eeef8c013c7b03fa80868457204cda4a072d6644822c9c7ec79279210f48ba2216b84860323261eb3da988ee61ba5ea711c3c8a6839e7473be71015cbc7691d537596c6396e339ed1ef1b86c9804bd1edab00f1d6872fd7c4b4bc8de7bcbbda59449a65d089108020845ba70911ed6a8434e2a1ad65c911e1a01417e1e9e394e3e28b2d2648146ae70911ece8e203f184843a721072b4e480f8ddc90b3aa089715e9213e42f6982c240d876c2800228b8b7ca2a44f00ccfff098285ca2480fbf28c8efa7873262b4da072678f0901ed6b2c88f4506330c11457ad8e4934fbac5c87e0775c58a8a8a92423aad8f5ba9567c4528c02cd3efa0b3ad327bffbbb6fbaeb541b8ce76dcdf6bb7bf96e3c46b37fb36dbefa0a2eee27383fb5d02e1cc2c26ffe4269f50b4f97f991bec5f6bf5f2992203e0d499e34e1b33644012b8ac5fb4da88d95ac2954b30bb0dff92fd41af3c77fcecc03b623b603bc0ef2ff21d3bbcef37f21dddf78fbee37e3f0ddfc17d3fcd776cdf7fc377d8ef5f8a85b0f0c3316ce2418fe6a447f5a908fa08cb9406731c7670d8c16107871d1c76704ce151cff33cef19f321e77b21789a5e4f30f29152998f4d7d76f5c066ff9acb99bd1cc1c4f281567b9c26107cec3779031dbdd4481d7e1db7d9da35f5d979e4fc6e8a439ec849c134d83e52ea75d6da5b1548a9577f4b299d7466a5b4ed04fa4ef779e79ddc76edbdf5de4b7dde7b1bcf3473dbe6b66ddbf6be6ddb94f271ce24426ab64fab6f4ead95c1dddddddd7dab1cc7518e738ee326c7711c575487f87a4e77a7b4565aeeb191bab78de36adff0359db469ac7c7ac0679fd65a6ba5223ce5497d76e0cb7d76a562d3bccdcac59dda0da4c0ee5d423d0edfe720add5fa7cebb4525aed06eb3c8fdbbce9d13438ec24a5301b4b8b88fd017d94f938b58a8850735123c11a89865cd9cb9d264c10790a813b4d982fb9bfcb9d260c965cde0c83e54e13464a0eaa138aef7a52b7fbe6d5bd525c65f4e82badb5563ce6ae94525a8d989f3b1eb3fbf6fd3fceaf2524817f6a802dc1b12717e44ec345a76b5073168005e8d30de5f90e8238480606611fb7503041094f5875605051d6c3aa70cdbd85c29239281ca1c9c89d86cd9c260dfa913b1886e40cac56907a09e4504a29a51998309dbc68065c824678345265f33a195d34098f4b5b4786a094524a29a51cccc94e23255fb2bf2de2733f437d88e359511b8278029ed9527202bd94523f41a648644a29a5d4e8ce8b335e1ba57406791215d14459c73e40a0e22ebc3ea26f371f0c5812f0a40fccebe08479f0bd08f48a2b72ec67e1ccc76c46e979428b9c3d144914ce7c107dd11789438c8020891e8afc8862efef307fd85782b9defa9c58d2ef7e0befb45169d7d53bf44d5e5b3c154b70aab9afefcd1cdd57a92477e628b9bfd386d00bddaf3e0a6ddfe43e0a8973ea4e1bf4bbd09b36e83b8c039ab716f58764e1fc4a32a7c21ad2af4574706963c8fe538f27513d330710709c7ae8971e0dd027a3b21e1f7d4c54a6e26cc2090d9e4f34e149a28c78d28c439ba02f92500fb4321527d7d4e2800a2e27950fd9df4b204119e883de7dde7fde3195144f62f11ee443d76a6d66750d88ae71ef3fcd74ed8c500d4dd786de7f0ed135d9bb0bb184ca2e6a18a4de20f6836c4f9f0b83704fff8641ee07e99ebe5018442896e9b70883b478fa436190a1ef4692854164ef22c44f439fafe18683c219fd9ae9b3086714a86ed6a38c6c29e09891d0a5845ee55345978a7a8263ef3d2c1432b3f7b3704863d9a04216399b421259696145df3ac1ee54514e9e50ea43b4cfe33951ca8c7ef8d91a4f701567d5a49a8543b617ec70fd400e79b27a7a4c1692e893b8f026fe98367e4c1802dc732a7af402fe3ce5ef4ea2a43cd100f4ad1567485c30101f874caf24564491b3270a87884c48a2ff1a08d91c2afaabea02460c296d709d45ef5f4eab2fba0abfc9172ffebf01451f8a2480f145ff22096ef001e38b9e0431fec537f9d1281cfec3b0e8bf67b9871f7a153da28af1309ecaadb8f52fae253b0c304638ab1fe3a1c8591583f880f131c42130c4a6fe4bf4c8bfc9a22f97608837d46ff245d8248c4d6c72eb30a2a2a8bc6a283b5580933060844e154595bccaad4f5119792136bdca6e5dfcc0cc5ee523ac8753d1233ab874a250070ee42c1ce252504a58423ed1482aaf9a39baecef35fc20c0b4c163daf01a34648530734ca5dbc4c44d45f62db987d42c9c594720c14512855f86fc26ac03f7a86923844945959c0810f72fe716265426740d2f1ee5369a585d517995cc6580e9ed3ed7fd0c6b087902e9baefc40dc8f2fc69e7974064b9fbadfe0d4b5abe7fefbde5e7b247d7e20664b90ca1fb12c4cee5ee2705ec1fa3def7f752d689976e62874064775aa91cdfcc032ef773b945ae690b052e54d0e1091922b85069b976a4aef86c90c70d0b414c8152050e402de0b2b1b4e04c21116a920492395298a820e6aaeb94a0888f0a97198a70324396312f6410e56686b81244e97542c10bc99715154a9ce8ca0649155ed79b1968b892268c0c4374fd201fbd16e14672d2ab5b3765de088930e5083a5dbe88a8109502233f7099202a89152b98c1010bd6e1082580e012d41c13335d55b8002706297a091350f06448494d61c226cacd185cf45544691d336c5e4811c1224b4b089f226c2c103f54b1689347892d2545c4aca1d21e9d13c87456c43c41a60e192f17a23053d34c21d4ee17ca8529146cb150a607203c2fa916be0044a1b0a58936327079522f9deed50722403e1c845b31c8fd4d2637124aec89038589269210a3dca0c3151368a8c8304b012e8328ad779240613126cf1102073d727a08a288372789091a6bcb962876c29c004ed59ef14e114e2881e28b1e29cacce0c9f9ea8ab0b480664d0a54c8c963c98c600a365b6e10024b6b89122734b1ed9923c50b66b89ca002875a7f082f4b589922a2ab0420fa0e0953605ae487234b5a5801061436329346d6992954649c5499e2ea84352d7ccc09562c922a991f6ed8a871a14a8b1216dabd385c05f0bce99263268a3759ca4c2f514ea0a45025052b27c0a9d225a1250618b644d163478a7b191aedc104363610e1460a263cdb57580144a0dbd848f5b7f082698306271a813d9763aea1376dd4af7103a68d505019513b156456549a743501a34277d55f4ce410468d1226dce12104689690c107384478b5a922668f1798d5d6143d5e5ef22c12850c971a52d8c1090decf9b262052553e6309912e3339b6aa2cb04512418e9b680582778010924174a052e2e479cb9da9ac325430a0d26c4d9c14b1e3c5566563725654b4ad6d60a57595b56b47c40c7062f546658d205072a350a686aab062ab78232b50505cb1614a9d693a71112a2f20c41979b266caccab8f0869c4f86f0b2031e3a4448d14095a8d3a93b45a848a7e2dcd3441138a487b3305d4cb8a122270aa65898223d9c65b9fada49169395a70862272f5592f958bbfbe047604a9956720ade077f04a1fb96f1138129756a778fb3a8d22ff5bbc10313e3a7632fbd0eb8ecac0f9c07c632b17c4a7b24e0aba4db174b21dbe5dc37c8ce71224c262c78f3de3d71c813e97d880483e0a30f1f4324d815c0919ef855e012e320fa3154f0ba8b9f084cc14e952a2e00fd928e4d7d9c774e09622b8d2a9e2c5f9a3b5579981061c2c31cad229880e3644f913d5d8800c1584f8aad2a82c818e1b3a9105bb2cd5027834e4e407fa092658e0e7680008289deca6ad3c5049823a2b042a64912d507355fa0170527de70da956d5b6dbe6ced9933947b6bcf0fb9cbbdb5e7885ccab4709407450f285f52d081412b892ffa8208a4f2a4a1028938509cf01f7ed021678d1d3955c4a942e33d0175c50725ca60e192640911a35abb067effd7a111a5ff2935d2fdee0535a05aa214fc94cad7713d2988f742ee4f2cf6a550ec4b988e58d26634d2e03e302cc70cdefbf1e091c1a70f3e98056665f0bfd01f0cb9efab4fdd8fbe9fe1e5fcfb3ea5aed59a9f2ad5fe82e7074f2f7ddb36e86f30a746a2ff7120e7654f5ce2e00c2e3b6b6949497fe9fb7efbf21385d0aec425068f409122883d0946107b24938c894326f96dff85dcdfb0b3d7fd154273fdd4fc5fb106e15ac10c995123f8e8b3c5d27a7777571bded935eab58a3f7c746bed971d6146750df12f103492cfd99c33892b6940e557eef34bf659694b41a3e1a33b8d31d70a82ae519a47a04a3fba2e55e2be2033fb3355e1ce5cfff0910d2e5bab6b478de4efef53e98279e4ffa38f3e36927b7ee105cf2f472deb1ffd267d59ad756a40154277759c3a753a06994669c8a8d29049cae811a647f3a132065d9b11a862c547fa820b2e75647ab33057575425e26b234a61ffd5d18894d4bd629d54b97e9fc8820654f37a4ea29e38992cc060b00ff6b150bfefa0e66f46b97f16f4c269a491c40eb83ca35e84319a55b5fbf51fd0b50c203095349847f5ff89888080bc5cd2726d2e2f9c518d54dffb72567155ae0400ad9e59f5a79afa26d7ca956b7dee7ab4aaa4566bf374526be40ae3c0e9deef60e63b59e89a53a51bb429d23cbfe882e73badc146b97a5fb9af9ef7756a7df9fe8a6572fd4efc625feb0fd08b259031dfef40d87bde7f61d958f9fb6e258f297b1964ef287bdef77d9fe779dff77ddf44bf707b2fec60db5fcf134510c015575c914bf7bc6feefb8af43bb4140f100f6ab6e8519325882421ec49b3736fddf0c651f8b6a758d7895c8213fb2522d3073d69c847cffeb6735a009b5d6c7200e71c57b9ea20b0f9812501af899adb727efb39eb4d8dd4b59b038056cdba3e55053c63244e2e679411ae5cce2499ce399b4bc24a32addf41cdb509044fea2d2a5eb9068c03afd5015db336375125da16de68243a459a185c36570642e8dabc79a6c8f4270999fec5b80343128ce07b2493fcfee3662bf9706f67d95801c08124231b8d34779fd96321aef62be75e75989375ebbe6d6190d30fb86caf1c02900e08f1a45208cdf55da96c3d408c72fd929bd6ea7ad094faf3e395ba4fffe476e1a21b69ba12600b50b8980207680a11788a98fcd5293ce4cf82325c199a4265ca54c6334f719b6242be028b0babc9d3f0081eda904f3f7670a8017d9c6aa88e60c983877c7ac103391b607fab13a5c817f934e486b44784a1220cf95444a5a91358486b83162c279035b4400b49c39ef9b0571cc2c28a3c31904f3039a47d28728613b28a18c7b4a291e398b6ceded8ac51320459c356a30349c3999f5e7dfd849a306a68369c5dad1790b8229b082c3d5491dfa48287ae2984950c57e447378083fdbf2aa70623a4661920ee746da00ddb4c145da6c81abe90c29360c9c18aac216c8b160c5c348264df5e6ce6c1cdb34b9819aec88ac3d746dc97fc4d2c59e849ae4ef29dca9f8d72247f1b58c38f8adc224efe3279052b9f4cc3dea2d221b791bbf03598ab3c9f8727798a42bc2fb002872bb8663e86cc189c905566c55903ea5b3a328861433e715590f5ad3864e2b942e504f2896a9155bc8e834a0d0f48c827ee8b080c6ab2142983440be453cbe9218d73b1b026ca89cc61d345d6f04613d2bb4ca1e68aace1e4b285fc38d08693891aa6b822bf0bdab0ebcce024ab036d38bbd63091226b389544919f3726890b541f68c316c315658833e4078236bcb1440a2fb2864d7e3050006ef0cc030a95a718036bd85d66481b0e99607240b3841cf2c435f102d98ee3a9b35a12361d29a40d87b8093a9499229f3625e46ddc3f2758624417b2862da7095975f8da2b0ba1b91b69fcda8b579eafe64b559ea2109a012dc281a450bde7cb16ab49a1c62eef323674a9819af9a0436edc21a908458b4c51468aa461fb50822216c81a0ef12498acb1229f6a9a1dc8761c5b125e4fb131643b8e279f265ddc1336d09e7cac20db710491e73f7147cc90ed38a0489f3877c81ace7cd0a745e2a8c0455291b665822d265f9eb57e440c113c240d5f94b155ddc40f5a8c203d7cb10299c60621ae203da43186d4ea62e585f490861452061b928643260954e894403ec1d290ed384a30cf941cb133851bf2298806dbdb1432a4b99263258710396091dfc422831912899a2b3660d128a8de4455af1daa6809417eb60838287ca571210929d2c3a212c821be43172827904fe00e597086d0b450b13a0e1a3a985f81749d9e938edd111a083a08ce35df57ddfd27bdee5389d77df78573ef53aea491413a7deabb1bf5f964eded2c042ed989dd477d7f5e4bb93eeee9e6a58f0cd63964d346d7a8520cfcfe0f3c09f698c4a14ff87d3f3990bb9f3fb98b7d1d2cf41ebddfb22702fb1f05c5d9489ef7d4fde7ed91d38e2f968a40b759de93ac1b376e643dcfb89198afba6c86f51f1708812a81df78ccd2e2820955d1f5d83dcc0399fbedde46ea361064eeb706c42041b1fba8fb3b42e67ea31d95a961d0486e94c70a86e90e931da63a4c29605a82890e9317d31c26394c4ae0f9225f4fa23060b0080632c56182c3940413124c5d4c28603a024f90c9083cbf99de309d80c90d531b262e26364c4530ad615283e7336de1f94c69f07c2622f07c262d3c9f69083c9f098d11c824840c9029881920d319fc59003299c1235881187e0c18165821aa01401fe9886543265829562e85b8fd3cef3be8ec3d54eec2f273f71e963fb2ff7caf7f43a8eca1109b3991829936fc8d0d7bf8dfe948607cb7a97cbbfaed136ef56c52d9cbcd08971a7e8c68d096b87ce9e852443fc135a9f202665a51d3f5856bc6f9c02f3d49e9534e9864ffd29ff8957f897de9655c8b871e5c8d7be527f097ae874a4991ddf31f2b408e6543f698fbd32e1ae74b5a27fb37fdba939dea99ca424f5a7c59a5545969e17259b5d4acec5fb53c69e8fdab1ad997f54df552a2d689729184e84bdbc40995550ecaa59592dd5e657f8be549b3f7b7658abeb44164b75ad9df7279d937d9bfdcdd3dcaea2afbf7c44355e55cde35e51e25758555f1d4afecdfa5adca6ead32b8a14811445878a10424c8d27665cfa2820f48bc98d1938709b2b45ed9b1ca64a3fce26730a717f35ff47c219637cc572eca454f04732a9abd0b98d38cc84b267a19cc89e87e794565173f04737221db0a6342967d0b9893cccb432f04731a6ac125b7f82098530ba1670173120ada0243420e7a209853d00dca2cfe07e6c40288072132d0639813d0cffbc09c7eea98310f3064fc319813be58d9e76130279fd8b79c1c7b10e61483fd077382555a2ec10c825faa32e8254d06df833981f8fb0ee6f4adc91e9decfd8539795df71ccca9dbcab74b91dc16e6c4e100e48d8b97cdfeedba44aef56e5379be982ea2f0c559b9fb6f51159becfef8005555412c59b3030a469038a441862853286162cd10a4b70c88ec2e042ec7d1e72a8c2cd38f5d2a5754b07bd76c85c9eecfe303107eb8bb8330a7aa23574fba71767092e97f30278a8bc058e1154d59a21bc01534b7280a17a1eccf2d6dd9120351f6df8aa8ecdd32ea40e68614d9bf166131d2d2831b1df0006c98a929624b4b0dd9df3109594c9825a0b195431e174a77c62ca7f495bd4efd764295aee8529413abfd4101ae4f7812cdc72f4fbae1e313575aaa75562ae585590b98480ffe41016e714a71f55d8f2fd1257a54a9915b69935cbb50b694a9156edab284c7a388e8e0f206ecd223985315a22770d406c25802f72832c9260f8f32a894d6255addcbeb7852798336f1a4d28dcc239da3045dc353299d4eead75a2b8d7603bbedf290f8eedffb5da3e52b94effcfb8ee565b4b852bb935075bfe4eb5612b8f76377680b2e65190430fce1e3fd1b4470908f4d3960eeaf57e53b6f90042e10c2e7c39366e043f910faa02f9b0b8414f2bdde42bed7a3e47b7f0a8951f97e90f89f07897dbd31b14ad0836137d2b492953748fc6f84d17c2655d36e62d580ddc8fdfbf3cb93e8dffaf73dcaa564548902f3e8fe95e12fffe7cb1148962f8b2f973205e6fda06721963b841e482c935afc4f733d16cb19b96cae98587614f98262d977e40c796239ce6821d26a088949e58efb458feefbfd26af51c47dbff76fdc7b450d543c3dc072996c6f2cf9e84934a4ced1b5a6ae396d9a0137d19ae3862719d1255c1e271c9eaeb5c8dc539fe73e055a42e62c67b98d7b9f90871f715fc3ca3987c7cb476e684b0da714f73788e00d7cfc9a7ac04d8fdc8b03614d3d6016fff3e5d4e266d5e781be01183f90d8831e718fc5490216a28f38bf32f70eabef493c898fdc77e6569847dce3d8974bd957983e1f13cb1df83fb14cfa794f2c6be4d2a7be13cb19572cfd8a8c0a762840e38c1f5a0dafa4a9e42356edf0a2475d3e72ef717ce4de457fe3e30d2470d965de644e96fbbbe6a346e2c646e29e88093ca5b82f52c9257ac4c5f247419fa24a589c5357c8bdaad0e811f74453dcfbd4d4cadc7fe023f7dc7f1684b104f6e951a4924d8fc2a329c5c4e45e8d35bde811f75a53cb93b81ad012f388cbdd48d6e93412f7b32606ffa41389cc051182f3f75e8fffd1b5fadcb5402bd112fa887bce8b4e0b99fbb2f344c91c47ab32c7fd177a0a1a897b2f743a6d83fb2e74af46e2fe865ec747cef1d023eeb96fcabd8b25a66279392ad5485770e95399e3a63ca9893b712adb85a550a631b8ec0a7c031e1f78d039dacf645a41d7bae9e4fada68d28af2fca207c572fefc713e96d1f0b5d198279d755a3b77706973e5073352477c214bfb53b497cb1ab07fc1bf5fef571febbd5cbe5fd7f4d8b9a4490bb8214d8f9d3bb1bcdffd7743d0c73ab9dcb99c7fdfab8f539524de4f04a8c4f1b167ed07b80933e8fa95567f2240a58e8f5de2f6d97509c241acceaa28028dbd1178daf09fa1376df8d7b8014381424765d5722e9b39683e5a7b6f77853971f665968e33fbed485c9c09bc7d394e5807dbcb1e0361ce84995be6623cfb520dca419e44bfd65a6bad33e0f941321f67f4bba8ca98c04d4519145394eae88dc09ddbf799637b7a548f1aa9fe4741ba3d8773c533c72696505c383aad52a51e6b5f8c6bd6461b7de4709480b79f3173044a4d8f3aada66efb7ff7a8573b30b028edbbf82fb7fdf4c2a74778d62c44584d6f877fe89c7f4536a435a3b6b8b104decfeb3eafbb5540d0dd9d4e9ae7d585ea30a76e13a295c68d251d3ee3cbb047956830f08389e5053fd1bb8acfd37c6e016a5789bd065c31dab6d92ad268b4aed168768a7abdc062c68c1940b4da2a041640125ca1c460f3be8e8c8368805b6822ad0787b1560f2d2dad1e3e564feaa1d557333e590e006090df123550f6babeec0d56636dd04a4d03e8daf6dd5d6e7697f36d76ade9e95f6ea397dbaa9d7e2fc6b2effad148febed5f5a36b3fbaeb07a78477ed147d7c7c66d68ab1469a5debdbf7d67a04b7595a695091d10d1dbff9d329410dde2cd639e9cc98311bc603d68c195836b6d2ffb5bfd9fa1fc58cab1db6e8a0254b0e58acbca23a236bb005cf1908d670b87283151b6aa0a1aa8ad04f0b2a433eb2da949a94da0c35196a515e74306a54b5186a506a30d49ed45ea835176a2d7c33626023f904bbd679fb419c75bed9e327cf998e1cd2298af927dff2270be520350359ca1be7ee0ef67091bbcefb3e1016037d6045411877f70da0d0661979f6c3472816e00c671e88e5acc947281d41e00cbdfc09b5e864181c9ad17c94b93b0665e00c73973f1741dde025a2feeebee4ee4d7f7e73ce393fcf990d026f1138c39abf17305a14e231bafbc119defc85b393753706457fb7595d386518ac009c61e90e76f9e6be9f918c20330e3c67eceeb74ea8ea4558be227166d08fd164723f0cad1646f0fc0bc82823032b35ea0aaa0665686868e2c64368cf9253ffd370c3f7b9095e90e6458b010ae981d1f58b4c43538bbe9e814d046b17b10e0293aa0c0f61f0a76f0865201f3cbafa6962eef7b1d65aede089552935f291c5fbac55214c4333655937e6e25618d59af568a47e1a34be6af3ad49e0bdf4c87bd11d8cbe31c06e219ee96ba069e5ea16b615c1eeeea6d1a3fe4a695e9366d44d438a826b123502315865cc19a0901e1a1a3c7ba34735448a620107537c5f7b92063ab0944b1eb9bf45204b65d9a3e91137d3d1489c73f4fecc03cf734c6e3179c6818cdc3de4bf6149bfbcd45a2b247b13f5b00c02527e99d66afb02200773e2c01b7e17bc6119cb9472e205bcb22b9b03cfdd484079e6192db7c81f08c2604ebdb968f1d3dd3220c7ce02838de46517cb590f1abedea4e5acb208023d2c855a801e96b10cfb82bca1ee2eeaee202c7341342b82e1a26ff86889fc878f62238533b7b97a697359ce9a7c2c023d2cbfdc61d9c18011e382978558bcc008ec62cc683ed65a6badf5c7db34d63ec242b10223191678f855e06f64549f31fa377905300e6c76b147adb52e39cda98b341aa9cb59106841aef49bfc36d296ab580191d10c194133400b661c5d9bdd0826c3c3b2e436ffef488601e89e3f1aa0875f8d2ebbd8dddddd17801e667917d0e8d18471810c5f007618f8db6ddb401bb6973b0fb92d7f3490400fcb9bd5e327cfec36fb9733366b1f67b6b5d68a6badb7d6a0350655e69c73ced9f997d21830d3fdde7befbd2dc613b79f1b092d4cd072b5c9c780e93193d66ddbb66dcbdab2b2a0c270627fc38664c0f49bbcc99f789f87d57f665801dc48d573ed80db3102e9cba8f8d348dd036d00d63dd879e7f7760eebb1fe0f07b283b05c3d90fd4121b6162100246db04c16c2b57556f1c08f867773766ddf050632fd691f04dbac5342547cc1b84254db2871bb6a696cdeed3cb176978b519d6a19ea3c4bab3b9d67bc6f6bd3e6a3b4b37613b7eff2566d6da4cde68dd2c738cc9632e93ccb716d7698694329a5f727f793b322b53d76d972b591ec5baeccfcae916abd8d54bb11ecd402fad9b86a37ee5e8ac7e36ee78917d6a3b5a0f540edac1592e94f1262b77a5fe77dddadd65241d1cfeba8a8cd73ac5435b4f9e601b5ac156b1f55305721f5521f81d7b1702ffd2b34ca514d126a8fb58e402b908dab76e3c46c5cb51b77efbd62e5b61e7fda276ddac8dac8e8f4e10bd8791f488577efcfed6777efcfede7c74daacaa5d6a466821a935a0ab5a9da921a0a3525b524b513e6a4b386a26a6b26d44aa849d54a5043523b5233522b52235223a1167585157bf45441c5145f524401c5134e3491074f95e56a0110a56ddb46273f45a75414ed00dd36a5ec5f237c7d7d7d7d7d7d8df0f5f5f5f5f5f5b5893dc2901945fdad8c52fe89b72082b1a2504a29ed166ffebccec8fd17e06427e8fe01b452f5ffb81f0366cc74077950a5a5251aadb338dfc264eb418bc9f6da3a4485e9d3aee782e864dceafdd0d9b4ce4c7d528e724ea918615aab206fb77bb0fe389d3f1c7028a7faeeb452df9cda3a25e67a77507925957948ab57f7e1b9fb3464bc68a1dc0f43ea237f1c38003d4c1a34bcfbe1c00fc9d9b925c6a5474255d43d30664493ba9005d5a07a7f4ae15919fd7eb695d1cf7a31a89921adda6269bcd1b4ba535be37c5e9daa0f102ec0e3831ee0770e006090fbbd8256c235ce470f100c7dd41eb5d268349ae779dee7cdbc55db5deaf7f6d8c25c29149e6bf57537dd91e881bcec0e86376c5bf17b0ddc609a92925680c6ca54a49446691f8d2a759ddba7f569cf396bcca3e1cc379cd5e61ab3b66a592358d4bc563ae7b6bdfb7b9ed99d7a7533403f176fde77679db62b0196fb346dd094528aefcc5d57ee5aceb376845cedb5268871d4ab85298df4e83af6beb491fb919c46d7ea1bcdc143a7bb4dee4f40f7f878ec9947bae6b559ecea49b7fa78c5e6b1c1387add065d6d9eb7f2a0e3b4e14fb38474c0c71146292d0e5c903d9feea894ad975435ea14aa110000000063150000200c0c87c482a148164569c4a60f14800d6b923e745436150a43490ea330086218c8186308010400648c514851d10a00badb33f6415b41bcdb8dd500d7ef236ee238dabea1f9e056ad9de9ab4dcdd34704717d0060f8659b906c85f42f22f1824c9cd8f6e72b4e09ce47b2c721a784a458911b83db15fbd1f8fc445ea283bd730d21a820516ba0fe7ba0eddff515144cbf138d8d09d5c61c30df43adde7d3cb4eee73509e4b0cedb74efdc86ac4a2c8540b306824e06050eca84870f4a5a074cee2e6c4195279d7f6b7964134ecd424e30b6c6139e6ebe2d302769cca02946c89f67426a8718628f5a81138a2177acfe1966679f8338d7b7991a7101c249890ece5d7eddfbd795d92c234d9d83458e580be41a622e0df12f79fae22980fc779a173f5131d69e5b2f116b2f6868dd46924465290b88e92b9a98eeb8845dd64808188c57a6835d4b8203925da83c8cc77a7e911ba26824d20b355f0974992c2b30c5d4f331a7f2ab38363702ce576c0eebe1869bf57fe94c7e6dd628fd087b94935a1620bd878cea5533e4274d76de4ff6be28e09084dbc828dc4530735f390db814227d5937b0083d3bcad5b71908fe83d3ad26e2e4a81c1eeb12582aa71b64450057f842dbb017296db401595810e5af55b91d76c36c82bfe6cf3c95db38792f31a01ce82ffefd19d8a0d028afdd07b3376bd2540ea08d3eec5eb6a4e3fa0d2beac05c597518f85d047f57cb7a30f483af88446ab7f7f024e51264a209cc12dccf2e6670f1595fdb5ffaeb0bb0a3de1d6d042c42dc5f30cc46a5d326b6d4620158ebc7540b9bd058d1ad17782f3344af928af48087f2ba60fc2369e3b313fd8ca46817bcabba5210b38bf1d640a11fd2c448b903130338c414d101b3bf3098f3bfd2eab4c96bd87661ee8f644fdced6a238fb9b81681ff55fdfe38c21842e7d27e655afea803b03f5fded418ef820a413010b187666859b2a85914fbe24f5d9815dadf5f4dc1d12501fc01df43049026f8d69bd9d55b06e1231278d0f90cc1006937dc114ef7790ef8293444f28a157cefe31b33f0af4f5ea9bd53245c0d890519d6908057a4bb5901434a97b687d30526c5bc4888efd488b577e0cad8531e1ca150b27f07a9c9c4af202974fec6223d9768eeca5334cda603394b81770fb1d6529b9a762fdf7e622343f46f52a7b8c077f8800b68f9ca4c653b69d3aec6a4a44933d4c41219382d7ea4e831ac66fcbc658d213ea98ad008d0cea66171cd0fcda0cace04a923d61cead1b5728a64c8c737432686fa3c7da8e8f9ab6ecfb5eb30d9167887519bfc2e7ae3b1b5f9cbbeaf60da9c085a19417422a45b6aa454c774614a92b29341d16a26b2c0f409cd6f384db5ee7009b6be8c85f38eb644a0d6c6b0fb15f3f45e2548541529a90bee945d134728362a512c9e18154f77343e34cda253e32982c8497426b007fb0e696ec2c1d9a53b5499a9c4fdce4306408815c29d35d49a9794be547c888c54b8f66ef963fb4035057893beaa6b48219c9dbd4f42b7debd8bcffcfdc679374108c076d78035193531cc7a3d74aa95d3dae615d92ed4f3dfef15afc74da4099779331a976658d1c6f874582c94282e86c9e1ca0695f3b6bca6844cc4d511d5e576f32bf0a9d49376d40300c79298a1dac07a4e352f2af09e0d6f8fe7400736109b88f03b44e07f15c2f22a8ebb0a03e08c8c1e351e0cb5b4e976ac208bcb1beaaf46188dc5dd5901ca3030288384dbd9592056ba92685c003f7a232908b35783b467b9d604a1c599df4d025d9ea261465fb8057cf14831c2a09f50c015e825b5587ffdaf50727b2d02198660eebcf60b8fcab34d18e9b4da7bc4998bac545716da3b9035bc36ce4cc919cfb046343e8dfe7ad5f019fc9962ef6e5e04a1fc009a278197fa04d53e3fa98acd09a7c577ea9900f1fd1b8432f1f7e7195851c9a9d12e26a8c31be11c6ca593cf968f68b89dd80506e319f9f5a8180690f9358aeb951fc255beea9a4a6a8a6f9555047c914919f9d787701595ca8f67f8289c7168d22947e15410cd483cf4de11ffd9e59af573780e8126849b45093bb15991fdd4fc1ec1ff5e2ce731a054f7bd7ba6dd97d5940a8af04ce3cc76b42ae328cebf69fe17a02747e6fc96fae1e2e5c0f0daa81db3dee9c02ed9b1405776257da8dad0e854957934cb10083df5e8150c03459cf7a0c901a6cf9e4f530302158e35c20d6be922fcdc138e0748b0ba0d0fa118bc41598c21477008084dc87a4cf3aa751bdee89a2b29e10f167d407a4b204b2990d348213f42bde747c878e4e70acc72ceb176b4e4f4180a2b0280b60cc890824031c71d1244e947645933079658be24d43d4f4b151070244a33b0141a80b3e3935584da5dbb840e9a2be85a2716ab5439be436c87d3baec5291a56903a7eeb3e16411d27ee86b33c959ef0e017f874b104c870c4e33818ea033b81cab5f753eb32cc1c51508fafa475c98bd8f270a966504529e3a7e2970023e628aafb9924574c62d8cf162fc29e70afd40cc11fa0ebd002e36b6ce083845b14449c050143da785940a98a169e424b5d4767d1c5eae52449362b410dc7d90e3edd3874056fff61c7b6290eb869025f02b63c30ce9b8116efc0524faebb0b617ff233d0277337fa5d96de1b33187cf5c73fc26765bb6c6194045d0576236a34a56c520702a35482e1d3fdb04468eff77832ae19db8a098528f099f051c68320c070c8c6ac28bc2bdef196f8f0d19768e57db496e69426dd28d01d61bcc5cdeef4b998fc7eed94a311c68aa19a386eebedfac2f8a2ccdcce524eecc170e65adee08e09eda9377c19f6d8fc423d0a8a2df70fcc34663fd0cda659a97180653b084a2f930f1b175aba79e61531a16bd46a53a45e64dedfe0f55dbeeec571752713e3c9789074d1fa85453009867a7492678eba7b0673d7e238743681dd6fc07bcb32eefc3b259f2b75c81fe5d8702ada077ae2fbc6432149a070b41dd28a96f705df97bf91c90553616bf52bf1593f520fd20d06844a148e1c3fd1caff4dd8346225af88e7b29156fbd9b8404824c89687fe1254abe6721ae03e232f2fcd4eb745b32c2ad3fa075eea3c506359de0f4b3cac706a0e046a5815c9b232b14c43fdbd2c4369409a24a0dd84d7578c056a366231da931fbf900ab704ede6da8791824394d1f73ff3edb8a3a7bc4cfe982f7461cbcd415ea4ed524f188d632217f8d37474f4b39f849cbdae5a6842b31c93ea9ee1afdbfd31a41b53a29ae389ba7dbbe861a0034dd28877a8e2b125f6310ce58c99873ea0188d4753222cfa59838394c66a73f7e335fd6f60791998f27c57356e6b409dfd5a53432a58958ecfc8978d16f57c692982ae64d3568e05229ae84e68e5a3d792f03feedb8e463ded8f2c20e57c8deab9c0f8802d617e71467521a5f36b67ca2e548e17342220d2afe3a6c54854a7aa5210e1c648215a1e8ebc0822d0231a1d34384e3b364a11c205aecbfcca0ef4259ad6c295c9abd9821c3b8d8a9467f487a2498f0edaacf834c65b6b480b5307916ce9a25a19cc4043eec7254d2f01963ff873b3890ab49fce61ed0c5869eb7c558db1052f9960640b3dc463e8dd2244728c324126495bae0ebaf73e708828de81f1e65a9a04126b4fde0ef098b1b0f8859610cc099a7cd479e843b24e0b12b55c70b7273a2a5a50867817580569209a670a9a31160291976c399f1da92d22a97efa488b4fd0e7c6519e1c84514d8387657b088e6a12a96481c599cb686b633b82bccae367a85794da2d0e48bd1c00a36f58a89c21b81087e39745dc09d2db50d063c5b877c782588cc969feea5d22af4c087cea693d0af8640442624153279ba661ded192d853b2d4f1fd913795a721343a086318c0179405a98a0251f3efbcd0f2f3ced4e040f64020881a7fda55567ec6b219a2cc3be4fd264ff561d7f1b3a9cb8b80af9b4d446c517aa65e727714ac7ada94260d262e3b982beedd707aaf1fd4a87803ea9deb8a109cc2b00ec0ff282589300bed360a8f76fc0c3c934f2f11efb14311d8528616cdca55e9d15194bcdc2b11462f52857eae45156b70c83c69dc1941cdffb5cfcdc8776be970621533d6989ff8375dda0e63d35b0e9172c0e5345f9bece7f4c88b940854d84ca30081f263f600cdf9b0d7f3a6600d00ace13f5a33748584287810490e16e97aee8427b9b6b6595875d8cfdb5815079c79603020e51d76b5003b63c22ae005eb2697cab613dc70f6a7c79b2795755325e087ea0d399f019a2e03112471fa3d085b8ccd3d404d6e50d6d1287383ce63632b29c6d38dae3d4549461473844b030513dcdd328410438ce0d03bf58ab19cbc6d49af0540e85923dc409c75163c81214638a4b41b12c197a47300cbc05a183533a54bb6d3f4f33d3eaf8c960748ceb2e6fb44228da826c0336f407357e11fc5fe21f0b600053bc5ebc988d70091fb78b850a617775e0f65bf23a803e44a8d20aa405012122512acea55f52a30c5d9828254b0e76ec51fe8b93c4ac96a5ec83435afd31f51f36762b3a481924e14bea352b6c7c1e611d4ca602af05bc4212ca27fe8cca1a1f07581c4029b66a4cb89880ac3755cef44484d3829e0a7739c9628e3cf4b90e9058efafa4497d18130a0fce72328a7ebf78969da13163b192397a611d43311319be578380b25601793b8a79a00b585606025dc73c62cb284963dfed198352967626d2045a37ed0f572ad969681d8fa9e63e2088eff6a69de8a8b9f99c758c6ce432eca959f8885f66b00072143b33456723cc147a0d885ba8c622468b84e1729c050f40d4f4d206e7a29fa3ca43d325ae583b0b857d90f2a71eb9135985dd43c47c0d02a29a67a2edc961e8579ff08a88d3237558df206d5d2cad79f86085caa08f211d79e352157a28665d731fe9778b2521fdf13acc08616e0dad1c22f2dfdbc50937b896b9521707c6ac31ab6a334bfd9e6877f140ab2b678b95b5ccfb500c700306509075d4534020126fd331ba88666d90739bc87ac35eb133bc9e19a4e5f57e5fc42dae3f0ba062973411f5560fd1849a2e33591d09e64c7c9d7f38f5a210c798615fa3005657cd66dec44982bdceb64b253e8fea73071d60e041b9d23842ea43549172e1bd90a736b8422ec4e5ebf544dc1d89b67258ab35f652583153d540da33567f393fbde163167eaa69d9c32d97c755d8c1e41da67f59805f13b72b6fb764f295f2ecf2391813180d1820e72e0f2f4eb5cc13a1bb1deb0efc7185bdc18af4a47d186c18e95c2ed4bb64fc0dcf94f0b418c2936a94322d6d503e30fc169799f3dcdec4699853ba9971813fb0fadc37a8ce39ab636027f5babc8cdd934ba9ffef58b04dfaebe6b5086dc883b2c4af4feae432db85085ed9c8dc4dc74a16bd4a2ccc265b43243376ee95ce906934d72ed079210de6a7b1528028055d408d2cb91ef2ae13a83cd336b2170ad08569bee58d213e2e31399d64d7bb8c99c2de590f5188d1f920c3d09bd8a7dbed3337c4376af957e6309bb784fd178a134f48c83671abb4d2c0aeb35a90860994d7bf6e9d3d8b5a30c9e7d4f0a3636f8c85750e9f63a7bd1a8ddc58fe4d7e10e952a2324286a68feb4ccee064a4b6a9bcb4ebd5783974616d5d3793bcf1ba2b6348915b7e4d7803e2bd94d74b4239bda918d2741aa9085d71559953448e19deb4c410d4f40a941695a1b3eb9a17d1471133072200844912505245a8d102180a09df1c5e4fd4cb17515929ef0dd23ae8600c91ded40bab8555949964c0558fe4b328e4beef046fa5edcbea878360fbceb316447121fcf2d06d953a82ca7c0ca2cb83cff1e5bab65e998975b4a46db6091d1e45ab4c1eb6e09941c13a827a286dd80ce918ebda2905b2a9f78e400add531bb65e7558676f0b419c25b4f012b642471e58ab6cb307621f3bb44c707a85e99a4bbff61aab74d63d7e4b94a98e6c3321df898702e306f20d78a649656eea4f5126b0a94d719714e32a7b14d4684ccab7e32c547e727407b6a2201360d960eb9714be444012a506cf6e3c29ac09dfadca44b3da4f585982e4ba5cafa1678a3ac5f32693fd84068cd7bef572342a62f78684d48f4f37719aef875cb2a7525b3f1db24b933f8bbceb9c2c61c376c2fbdb402e06bff41f6294b92a604260c72e3643b05e536ea48b9ae64cd8d2aa05d05e528142ce3fac20091a349092924b909db56560b932eb613b46472311a2339f3587e34df6b4cf95ed9600b185808ac897dd396029b1eca26b074133e79cfd29ff4ab47b186928722019b7f5287e31bd127c8cbd5bebbdac3a47015799057dc3c4f6abf1e3665f4bb26ce98d836c67dff12aba8442619e28d37bcbcac552c5a4bd170ae33e7159c1d27abdd4db271f36f323f77453b2bbc4d9c8099377c0fade6551ead222aacdb0b246db7473af40e3f2331b91ae3df6a675c578854e5da186bd0ff89df59720da881a4c8e808945746bc3979415e5420a7a7f648b0923ac9c462c401dca2b7ab49413e015c1d9e703f3d5e5db21f2044383817ba1d1b1815a51b9d002fecf1824b0f3960f78e9fdf4a043a4ee8b0488077781dac045236c419b202e92042d6df54552eba60b140df8bacdafc5092aa7cf01668359ad24c318dfc80ae6cdb536f49bb4e03996b927c8b82633815181e40dfe41eaad4806e1b918fadf04dac29d66cb60582b40bd4798e04990e25c43fd9cfeeeefab3782aa7b8a5b5e849172612fc01ac581a5ef5a72013bf6074349c5b562fde1e214b31e6a0eef9971d9d24bad5d5be3c9555da4c814a81623eb69bcb58326f1c57953d7af48061a2552120c8f2f9281c4d085428fc55b96043a8a2a02a8e95309688f9c0e0bf7cdcbac5513a28cc13e25675c3803324c9fc24ce55ef637eeba46e793c7d1c23d00f29b1ac35f1c07527756cc7ca88429af009ba97fa772085c02da4bacae1d8b25aff21537ebea25581ff067d27bbaad232e2ca778b53b08f7dd9ddcdc26c99fc7822748395ba2fc1b06c1b7b0f83a4709421d1bdb94d83c655fbb2fb23455e3e76b762728cb50fa084f8bd472e3fdeb8902e1f3c2105f2d7fb2342c2bc2a6ad2345ef1f3250d21a34f2fb21e33c3534bcd200b756124ccca3042f9ace34fb9831541a60bacffda7806795fe1dec01e0490b6c6c12befde29a691f9ba0a614466926dc859460d10c77df205857191909992ba91130fc1503caac1c101a621128900eac6332b44929f26d56a5243be1b096d21a545e31cc38135033f1a756f84d37a456989596d316983e5b375498bf1ad89b405d831f3c9081aed5de443a1e3c88011a20297d39c37aafce8740d8369745dfdb0ffe652ddb0943de30e826b6bd690126b40b229afc8aba0f9323e12a83b8fdec1b96141643860daff88dfed8d614a7130344e4ac97de1e07243e2889da5e7913471a6013a3e020d3caf4e03565b238c4f7a1235f798700f2a092e334558a8280f905cfa1d7865642e0a881a3ddbc9100e5422f45d96741b43d59e4489c5eab4556b2f333bd9ce3cb4aa440aa78aad6f23a64244c0272f94be6095e3bee10e7bbaa928ac485d7fbcfdd89bcd10c723d9d28912a14f8e4c4844e83ab47405c9d1d6cbe47c2ba8c9bfb2b5e0ace3736da5658c2855f22c5328702e9dae7eace2eb11c039a3bdb0388c693444c09d2854a3f76061a47f4c1003cd5fe6b01f3ce0d6188a72443a28978b77e5223bc54bed8bcc91a9549d9ff9bd88bd01428fab213bb1fa585c05190dfa40f7f7d66e783bf574f757a6195992e21999fa92ef8768721b498a10f350f94a64b03acbfe78083b05cc1115b970bab638c7d8f343c7b92c590fd5966f2ce0c542be7723136ee94a0e36578d6dc86336dd15c19bbe2b35cce196f196251a0e4e7ec6d734c40b631708d06e564a1e7a4440a257fb5644c9f5883cb5114ba256b320731e3d489991bb4407d2709fed2d640dbe41de06cb1db1cd90e6a951fa779c71b485265aa5410146d38f831db1527b5b557138a03236545cfc76b590aa35c2a379e28a5af83c31bb9c81e734a1dd3dba9c3d94f4549dc7e0eefbb5b50824e2586c64ba6b116924861ebc95860f24be76e8b5aed4afeaa819251352ed8a96d2902f77e4fe0933fa2f669d1ca54bd684cfd1798c3fe1838167efb44f5f887ed7b6ce184af514da19ed69c7d798332365b05c3d88a4129c1418fc3ed32007bf4da04e9eb7460009c7a10b6fc001c8646bfa874821002528d26d880f97bc0df8b7e66ffd5aa11245d9e442eedfb2e1e48ef8f4b7d48a35d2da77c170a9861c44b27684af4ea82f4584a98a31ff415c775dde831594f1c7f385d238d3e8429f3ab7e74ed17efb4c0da7ecb0e7597924ba9b9cfccc8fa6dca2dd478b8e91ee06b9a2752b08b874d90de91a5b141f451d166d331e8c30d0a9e78d778709e90c8dd8d8f857cc5b29a4a63c302b3352aa6475c8b101b8ddd321f57c3cbf6e6273f82488cb4bd0a47af5cd3a57eab831862aa54b12e2891709fb2acc5b09f567bc8cc4aa4a16aed1aaa71002972cf0018c765a8295b5a7d36dd30067ec4ed15c61f7b9282c76065b39de7e1649b35a19a2a9f5a9d0754f5ed23ca6c2740e8efdecfcfa0be1a8436819ca8153b6e8bd38d39407263f7dddbb02b885447b6eb7783ae5a42ac5b0e08c4b6c843f27dcf93802a41efa7df69899b5bee48ba0330a2b1bc095d04c82cc4a209b7dfd19205ea325be56f19e93f5dba4845d18aff5084774a183bd665e3beb978c937c253c2b6a3893280c653bbd0c6ba7859696cf7ce1d7113a472711eedae25ec246adb182581f488b9c1405224b94e1200256d9f29825b26824cc8eb4981daf9f12557bce398bf5501f5dd458df46bf6e4c98458a5e2c630c10765312610ba5c6581c9416e4f458969908a744f66c7a0cb7cfb10761b298b41b26c0c05dc1c4630ada888615baf509512bb3046885f5a96862b2eafd7f081d840596045d3a3831bf12a7279c4ae913a3c70510a698c0d295aa34156fae56b85b4f182aca0b10f15ca119aa5bb58dac9a0c0b8469041ff195e02bc671c40e3192bbfed106fc17afd3e00cbfd15c4cdae33945a6f96fc3f0a8ec0617123f55767b586b2fc9f9c232e32c95c97879d29093fab748d08a70520ede62ca285158229c87f30963ef9d88f869f32ab96d6890f44c376df7e4723fd92313fbb7351767dac8f74fb4097f6d67e72bb58c92add9bb531b503d7349fd69f1711543389f6b4675bb41ad8a38f45afa637dbaab5da0d49961550e8a9165087dea51be981b72cf25813499f7e267b718f794d20a912e46b2c28f1c7011d10561e8d6569d326b4327f90448814c2a3aef73af077ed3f69b405b54107b0ab4620ffc06b5e271c1f018c6bbfd0531acd29d4983302221dd6250cf9598ba7aba18dc4ae43058344eee8b3b02ec1cf9018f8343c4ffc7b58c128efad8c072fb8fe7a19840f4b860b1bcb580e122dbe5ca0e3e4951eb7f68c6d3c387801d45ff1ba050ebc1b0d779e9810707c4c818e5865759343b05ff00b84dfa6ec7d02bf44f1bbb128f1df71c18fbe9c97df474ba88d4e37fc029aea110c2e8013e60020fd1682bd1e7e1258c36dd85eca20edf434d66d8ed497ebf3068175880c6dca31bea15aa407d5a478a6029f00a8dbcbb4f53c6f04c6bee51148456298f6c1d7c2cbbe664dc0a7bf9f098403c2780b0b472322a9167ce497f78dcb67361ebeff3010ca817dc32e4f5ee8d2b7323539c260c6bbe84a173046a34e7bf037d66b11246283d0ebb3275278b3a54509dbf07ba3600a34a36aa141146f47f906a54f9fa9cebc8952649318278486604cea1d8a3466e4d306e0f7f344c6325215a368f6d8ad9d8a38dac6d633e23f4dd76d4976394eeef214833da79e68b0aee3442d9244bcb616f916954e59ef60e25e22f728a1332992b6895b8316d811d3f777d5a9f4c9362259ecf85c819fd1de269135e1344b81489bdb237c9ae722d2698cd724c0dbe138f103a16d96cfaee2516f47f9f8df86048ff425be1cd28f0f69265839eb1cddad6b94fbd1c41f2a5eb2aa4c6aab4c7aec3cce33c819ea5a96535d2fefd7c97a8312bd763d98d6f66193b3026730509c1f0d47112ac7a04e50ff03f9ee075b38a3ccc656a28feadcb79b745674cd50e587584c8f206b03e9d3f0c073e4e1bc1a12f01a944a6ba427526356359042a1515c3f8a151227bfeae0b7d63a50acb351d2a6cbe61ec0f7a93635d0f801bfa5f01308b90e64695de982085170a812a0b69c4466f97b92deae2212a7aed72e42ee4e5a27aac4c45a4cc64850fc7b8994101ba80977cd0e4c25b6454ad01f8be8b843f15c65859f4c23a6ef580f4b11a97d03c5247f0b8b216625727d3d5419df8997ea75245c69a66a751c5ecc8cb59c6f5fc99ecfc64c5b4d170dab90049a776dc838f3dec2f823fe9d5cc42ddf9354399390024b200d2c8138fdefc3581d9351b4aa872b8c01b49e3aa3e5cf1e353543ff3e5706d948986ab1d34025c0069b367d7cf4d7e874b735b1ee74a6bf9f51a5597460f2444b99547fa24d683e3cee4f81b616e23032f9f6e4460caa1d226ec7fd5c655ca774118aa47750cf173558281c5cc214921ef2b66a20fb69789617cc1d1411787a8093927302b1ae578a983b326c5c51612f38eadf7f114e9e9ac9ec45d3d53349daa66a908bccc34478c6c3985c6a464a1594f7cce51c5793f514711fbe9d90185ecbedc0d0438d43edd30bb53cc0bf60e3102e517f1923170af4b02728ac32d98f1d40616538042356102c8a36ec656388ad5d57f5c98d5ac6a7a6aca1d36f46d492630ad5c51c3e1c83586aaa6fa653c0dc67aca3cfb691d2bad0a3c74d96f8c048bafa40e932d6290b0be66c12f4aa622be87afd9ce9208623fc4a0d80a3c724e86ceeaa3c2225a5544ffaa26b672a83baa189f2cef065a808a05cb51539edc1c8892f213915a09253293f3955a0ca11b8eb855d5d3fa38d313187d4c66e9d0322f1a4bffcd472b921ed6837094e9586ed5618c98f867809408ee97ecbc3b0adec73810897084353a87e6837caf08afb3c48b03e5fad4d3b51aef146cc59e7dc585ab737b5b712d3003034d4816a4bfd6020530ddc2c4430ee3e1136b31d89a971a19f2776fb1feee8a47f58a6e66c86ee6bfa72037e9822569e37af9094546b5d0998d0c93a6837ef0daca1142000463d711d28b7593019f14912a2b1b22957469c933511ca44995706a0ffa2d1cc9221e56badf88ae39460b6aaf13267cd43db8e40c22755a87b5b034a88ce69226e6d512ef6e86e6aa370ca80bfc6343d4e1d87c0c1ce8772832475c1497e839982809ff19022fc4aaca2ca86f573a4e9517d44fb94deb3b3d7336377add288ad15a813836f29da496f109ef2b2995f10b288259fdda6f921b45b6f021d5047ea922f534567922d6205a74a96140b67a92ab25e2840e26554278f160612dfa00e9381e165849b09b33faedf53c646e81e111c3d0c64f009914530b97552f7c645aa5ee1659fc8673ab0912fc128aff79660b5ea1ca3bf7a4339e3f5bf937fde436ce5535797fef4ce5cd10007ad435d16f543a348d48aa2579b0871acce9ccb24c854f18ecfc1b4b559d978e63a14d25f45013cf302ca6a35a769d0c317881a6b40db7dd5a244c6254edce3a1ad9d84a5a188405566a2ef2873e37fbd7331769c59e345ddf3f18a3579566b093ec5c076f19271a418b483bf18f7f14ae6e02284e2621449fc158951df63a322609a2c951d84749c979f663e0af342c1c98dda1dc2ffbdc42bffcd7036329d4abbc42f6753bef6687f8145315295bb424fcf5b65fc89f305012d03804e481b4a30b2642c55b4b2e845050180a4902b113ccc408f43a25b7b99a47cd8b4a95741d8a173327cfa968ba0a19ebc333335039b5b38f369a1d08dca6d3eec72781442924829437b0a6018b8895cf6fa100e1546e945b326b0280373dee741123893073f635c75b1781715e16f206f25e86455aeacd4dd3be99f85aed426ad90d881fc40235e09b0863ed3d0f90a55aa2390fbf99b043189bdac4cb819382905f13829529565c69989088d6c999852485c8937bc42c87450339810097f26eed25125a9684bcaf06a50233d72d5fc1dbbb0fa35f5dd010b6a52e3c5704e9465552ace99d1654941a23234f681366533674afa3bd5f1eec7dfd2932ee84db9a19f0629170c9426d66a5540428b03ddba4681556652e74cd6d514e36922569512f8b8babf20642a3d380c1c97961df3a997fefbade5b147aa3e31f7740b46ab8984b91f5b545adb829f5cd6dac28d4fc2c900dcd51fcd44705e0904166e2fd18bc71e4859a1490b44f3d517de6eaea6fda737c36b17292b900682758f2e17fa1c027eaddbaebda10411be5a24457a6a823c210683f260ebcf113ce584ceec21b0493b4fe43e718352b4db75be02397f82f75bbb5540d640ab1371eac84985c38def65a4420e856b1fb859c67a0b0bec597ace6dc5c57a2936c34558b6e2cfa3e3739e8d4dfff09070315faf800031f63c4c38d0f594988437c52d7ba45ae001d60443af6b2048a6a3933a5d1f6cd57f41942196b6680d62d3fcea3e3e37beb1f354584a87898c26959641c00f2549256004a8d961a423cf5e78ba556f2b5ee857b611d4244a3e2eee524519d954a746d352c0f355e1776c91c112ec614ae03821dcf3c7d2f23e8455180e982b165cc274f709f31fc7cd02d5431a25b87ddc76abd990f986dc6e35c3ae21b133204f1fb5375089c15d1ac2a5c1d2894b4b885b973ea5cb379f8c6faf0cbe3d72a715ea293098e2763200cc2369c3ad74569dd0deecf55973f74e63764ba02b5513945146fa6d58a071346aff31e842488ff53bc34ce51fa8b3b683a47d9759242b8ce32cb81a573939167b66640712adc099132fcae260abae4ca0a2475ae72fd2c1c243a1c3019eed2549833992240370e1cfdb37b389f83d86e8574599aa7aa3aca62adb7b4e4425bb5a3a00212abcbfa9bc27c257c50c6718a12c79007953e526a9b2cba6c13930ef896bdb38798781493f56fc0f9534fcd411bd75c0491a241f023359609ccc124d733bcaaab523565b726df92be23a3f9151377c71d1f2089cf6af01fb4768e45baf84028c19d0e84a99404ab307fe71ae7f346661b72679bee7765f06d749c5bb8e78fe88f453195e9d33aa970f1592448348a45008e3025dba0988db265734f1d0947b12ec8073542ae3aae0d74fea0e2d64f463667d10e49b9946b46489ca3297a5b4cc2a0fa48b2e65773aa5a92c8f9f3ad35d697ef89ab1f1571a738a5882bcd3b5de19a42ddfab2fc25d28e32063996c51e468bf08c98717e7556afb9296f5f6ecd3eb139f914bc8f770b0d9d03fc92dff97f08893fb2ebb9c38a31d2a5113e55cfb136e89d3a6102088704b206b03082a481d52d242c2acf40b6707aab1ac7c3c2977e110675619fb48006c0a6e2bd281ecbcc2a7d84d48d66e23b681849ada2a4dda9c7b0ec69c0eb3d70dfbdbd5afb0baa472faaf16dfb6cb4ff14c7d81202d0f4bfc3244d30800b20b9b93a2985d8ed0d6ba0c7a00426e6d54b7c5ab0a14745470aec89db6b58887e6b37e6262feaf55001d668bd215bf33b937e9d68d64e49b5623df3716138ba33a0dbfdd03b404c17c45893c03879ff2974715416cd3f613d1e11070f7600f64b8898c9916f8abcd82653309ea6ff70aff124398319a7546668be4b9af994006b8ed2e02b3b28fe980a57b000fef55dddef26d1a184ff7b1090169f1feb6b7a53224898e341406be08607fd3bcf901291c0c0ca0340c026cff383397325b69db04ce9bd30665f726d3f265557120cf2c89123b443a2af27d892b387003e3e59b6488c7376d5d240f8243acb43f0af9482e08666bdc000b3d31b9ebb0e35e6d1689b365e9ad59630e851c652ae29500fe44da8ac6bc83588a3b06f3f36472bed7797ba21e171e6b39ee09945fe2c2b7809741f8d3364ae33c990ff79641687378418d2d2bb9a61c3edc44b9a1a7c9a1dbd91878b9679a430480c6e9654ebeeabed6cfd1c9d309c77b425d826f6d77e156e5aea7528bb7b4268d51000b40c351d2c4f3f1723abf6ed4e3acf995f9b5d336c9a1a869491240b11a02352cd168597c01c7cb5a74936d8c6337dc7c95fa783dddde2824c1f401acd04c1ee80bfb23caa4758ee63f1ede0290ead013105cf4a4f85468ef91a8dfcc92afa161581ed9c9d4479f4c3c3863b2e4fece1aaf09f8e0b0b3765b0dbdfd34a5cd444e75347d39921d60775c0a6089f8dd31a96438b45f2e5c9a2f443ad315b15fbbcc5028af75f1519e30dac1121fb9ac8f44711973e980a8d4eed7741645b3468213c0c4e3e26247006c4dcaea5dd87994d96aaafe911fe8528f20137db09d9f7c5348b5807ae262009e6b397bab5fe5995ce475492213d716a94372ad31ef67d5e32e25c1ae838644c0c708066165b5c8fc9040cae991c63e7a337618eee3565fc517116918430ea51ef715d98bb0e4f3276111f321f6ef8d31e5bb95a43652f3711725148fbfc4258ab671aa46c765c741fd80f3a06f952a81fd1b5b899f932bfc9afbf23cc046937f819e31cf0ff143aeb1a9325046092adad6c1f027a8758aa9ee13c7e287b037091dc74f9e7e06664ec6440988b10900ed26ac4ef7e036c45ac85e13c8dba7e16110527d8340db7547d4f80b06018fa98a2c99767f15f266b5b1c9a4085680117edb3666f18b9cec75a7e731ddf9a0c996c062bbae0b39e52efae80ac4ab7b1f9e33575821408074137f9e44b6b30e0e6f6e797467bb3fa3c52970e8ecc588259e9b1c185347280cfa3638d0e73bae92a079dd7f224ee595442ad1467fc21e3cb9f99832e76393ef630d4391e14fdc31fc93779e0304de0457815422a300d9030e100f4cc4a18205cc7e1f7290a0a86685171630a193f8bc96a751289f143e408ed08ed516141a7b7bc1d944de2de6ab5dfa7fe297056123066d63484a80363557427dc9b7d340f0522c8e9d5722b344085e7fc91f5d7a36be8370e4bcc56d366c5e1b56f8770de03ab8f3785cbc7c538c6c7c71a8a011061cae412a84914055707f4f2a5a4060a7b264d3a6f7f602b34439e4d033580d356f8b3a2b68c8d770e4698de2eb2b4c1e24d998b130a107be22c1cbf9a30707b052f667634e214ebcc5ff1a1862382bee937f1d1cd98e5c452e29f5d4a8e9e9820fb92cd886b6d663af42f42d64e7aab99e72ccaaf0635dca0ea434f441fb597c34013c6960da9fc97dc0982c9434d9c2c7076d8d9d37ef9c46f2510d3409cb0cd9790ce172f8e106728d66a1265ddc3c4be28fca22ca2d433166b2cd00bc250db2490fb4939c76aa501509ee27739931fa3c3abe1a55261d50d8c618ce0414f2d0704ba4b402b6f6e56e140a49da9c90c7d51a644ad9fe875f5039696635c55a76c741f0bdd7f5a6ba571dcd34076f0ce573e2b8e15f25426b348b990bf6a7509b8e6ae2fcab756498cc14e77f7654ab97235d9d899ac582e724ef80bb29686aa951a8a13232dfea5a87d89034936433ed3c93bdb1ded3f87356fb7f5a1c2d58d0092c85d7ad59e8f4e49185e72456206f018302e89143846d5dee7cf6e8619bc368a99218034ede8d07d587e22427d30720b188a17ba2bf5d46662e15a718d6a5afc1d332a70be410b9459e7e393c9b9804e99beb40c7329bcef63602862cd20d599d7e16bbb76958307d7ce117b3257d52a9da223002d1535b4e7b70ede9b1e74dbb20d719b245537b4a4db90f4b26d3cf363bc81d26c8c6d525ee291d19cc632f943c3a65c6143f13d21bb950228fefc223c392ef418ffda1e502c612c721469ced1ab730a280b75e43cc7155f9e9711f2a25d14f534f136108ad7338316eb12aa3233de53cb16b617af41dd938b8484737f6e909a4a4016ee82536dae9ef5c5b74d6f83847875f54f54ff61bf38a4eba9334d7bbea01b8cdca7e6fdc19b18e2212906759acc5ceabb269132e0c91c8d0f8df336df6f77c8c4a5c2f3336c364fec236cebe09a524b3ca332fd1919c7ad2ca658d04b9510e968f22541806aafe76c631a223012382cbd908b0ba94cd6523071ce2fa42282ce0e02afb3c71cfb77003df999709b8188a4a92e9d3e40340ae187028ffdf15f41c0ec1edd4f96c503e445dfa123980e52f26f8ef9a40fcc2e396d2a7ac00af6ec2ce006efe6a60af85ac7c7b6aab4e90c4c062b6f7a4c3b9ea38c04126b9be065600de2eadf31b9327a01def00d54d31d1c4ebc6a6d48889802db9ddfb5ab925652114a051009df1986b83d6cc11feb348176159489411bed29b9f3a52c8e16364b521f4acc3cba2aad724f1b2be58b571655a0149a70b307560c99a84dda385d1152661a44ba18fdd2a705e3f2b2cdbb82013153859029c9f6f417077c708d2b5033a8b12806d374e86791bf13466fb6e61512716b529d41f9a123e574a9e1806ba59fccabc43ec768e4b9a0c8f2be2960bdd1e0078a2233f088081791f9bd2ce6b11e8d3e40d2d8c7853fc6975b2e1e3070c5888148726483150a7f1a0f8c577a22f269d54153e64e2bd196f27007ac060d2b3fc0e81046cc19baf02b42557ceeecd02bd2ffc276a600afa97fb7f7934c4be8a5f295295aac34412a5c7cb9152e8f92655d6954010a63b2ac76d761fae97a95544a0f312666031d2c61d1596a0425b7832874ade37c470e16b47896978cb0e10e4fa0ceb5c5c7c5f50bc65339ce5e01f9956c4a68e994cf986a044ddb651bc5a572cf2310d4b43c5d2661be5574309b33f3cd22198ca7d8959b83369f0d72985156ca3c9f91bc11acd402a2d960479ddcb68a55229d294bd4f76dbd6cdc91200e76903c1154a7a1ee92245ec71064e9c724f169d7607a77487eec401a3c38e61062c7af15ed343aa3b4617dc718d9a98d01b0072120a773dc8ee49bc177e766802f3158295ac9d8bfc8c254f202a0b57bf7631fdf4b35e001ce0985534639b85834d7323aee44f7de0696043efb21e983c161a9aff578138432b8ff5d016d4f587d91a6f5bf29e8f8d165280cafbebc10a70d85d7adf0e61dee964f7cdb9b068bc243f1d9f513b26437eb5db1e4a86fa3c0abedc6359f413b7fd8d692c56e380078b383fead9c52a70f4c139aa3fbbb932c20e86f216cb98628ec8d892076561ed6c899ec63432dc46c917d098f94a63a7471f0430eb8a80a941d02b20997e6069ef48953cbd2ee814cb7cdaf3d380d70382f5e9833a63a8f5e6856aa65df1e98cc3ab2a603553cc64da13926f1ff45e8fdbb3ef75e55c86addc23b97bb1ed00c91439d4da8edb50f375e5d0f11a0455f43b3ad017065304a1090ea0d36aa34cb4fe8ec24263c6f36dfb6172dd96e43bfe729baf5fbe2724e7ceab4b504a32e1de60ebca2ea8c8d6fb4d24f355a5bcdbe2595b1e1e66401134cc1eb103cd5ce1508567cc3c5c5a5c4adcc00ca0a49cb4ba88b95536f477812cbf2c5dc0ec9c068a9f8d01d6617336be4a21b358b6f5ad32cbc33c0ca5918e8200b52d7c051ab00df3d83d99ef3e597be9eccb7a11b9c725a0e03c2d46bab682f6bd8bc87913567049451c29eb2e313930647882a0e7470efdefd14ebbf490e7cb9e31b5bc847ec6ddc08a67c28dff32a840db6ceb08ba12b66dcbfb47dd87c0703cbc170eaffbcb97331af757a39c15098c521756f6030c2994e598d8c3430067915700653998952d6f55872be2d17c3cbac08ea060705754c9b2ab5bc29fa134b9bd7931a2e4a47dc78853f08647a3307fbc48ba8174fdff0f0d8602af63ac48caf76b289cedcef2ebeb912d3b2089f5961904cf2c30b0332c59848d934cd9b3cc45041b464cc6fd8004f1869106ace06b0b63259052d386b2de1a53b0d1b5ad82085f98cb06a1b2c0f61e6c7580f6c90119f9d8c15080543ac45ffc8365e1b602a71c3ba96e6ccc2da7349d2b435cb18d2c76206bb828140fcaccd80f0eaf7bc0344e12b730deacf4b53a060ed3f2ca853ed4e5f9ed7a786b96473aeee04137006771bd9c33ffb1246d83b666673e1847f4ed45a7ead0744607eb280df3e868b58f301700d8a11fd68082d9368ca46bcf2c25ebaec74600903043b0fe654a6bdf5537abc4b94fd2b7e6ffa5e0140d52a8efb09a1a1f2d25b96782c04d9712f53c95147eb00cd91ac2144543764a525928497d026f28316e02c028b62cb5cfb8160d28e42f1d7cd176fb90279e027393fd551f59c98ef34cd88d4f35b43c4163cf211eb1524380b7255a3d1fae9460be142d81f69b2ee2cc45795128381c64b2d5fa0ed57dae19dc853e01d7303332472756525e7af5d67cdf318c7531b82aeac59c5f4efcf776798c00440ef318efd93cb297b7218d6ff833d0c6e4863066c8b5681834d11c904eb455b4a0e9c7becf22b85520976d45537a00a704366f08bbdeb6ade34b45c5606e6c295405798c181270293851881a386daa5ab98ff92fa9568faecea51d2d569b1a5bec5d1d46238f5433681814ca99bc5c2ba3f0a8e88d5e5929e26c38031b3fe07ae7ec48404424181984c9458c7e153a6866b62da184a6ec5cd2aa1d4f960b949e88929f447344f2883280f60f03ab18115cd007a03a601be18c75405017300f1c4c62c19c51577e9480fd7a3ed014f17785475bb0b2ecb02155d63f8997bc8bb31a1845939c56c7283981565ecb7ea5003fa891e95a75024879856d1b37374a938fcfe7c532abca991878b87c0d430943d42917f65a47c8dc28ddf6dd4c8c5a1020935e796768fc8e0cb3b5c0d10a5d1bbb03b8530cf2c9cf3b4e0ad7bd56e0a9d7800aa132325ffd3028c4ae5f3aef500ad1b1b27a8f6a82a9e560466195d3a4a9cbb2e50cfc7fc01dc45074e52294cb1dee48b6c12f9f483093f0048844ddf76ac38f57627b137e8ffa12e044fd8868693c8c888d5b67820a9c40662c837e26c64528b6151f7ff436d59e27da786eec6aa3fdb7274ef7c0d6d1b8b28e170ea7a4524475b425d565743b4cda3b8e49c7c3def98fbf4667a256541cb08d60b41833d1ef149341bfafd3ceff148f57562ed8b6b8fc06ea61a808c10dd00919fb9aeda928b88b86fd1c9b087bcf73aeba8b9c9a2a07e60c4021485fa69aa272f045d0d93be4d37f577ef5bff3629576f93b4bbbb2346a725a2e391582885ea0dd3dc0bb9511b500fc26fe2e917ae8125a13a0cc1db4137da57724ffa6be85c09292beccf2023a61a1b4c12e11d49c0b24d172060c397d6f1c0fd97e10d6262eac189bcb726b2fda5cddfe097472cf1182ab896fbf322599f6b308bcb5f89e482a96c2adeabdba2ed6867f519697ce1cf76720591e619c8cc6ee68aa9c0d3236e3840bf21df89da12c6e15a9550550aeaa3f5def36b24076b3191088c426369032a5d5a7db66a2a47755a4972eb423f07f403fc535ec9a167052dfa3b6bc1167077ebc00b0972948f7c48a98c4c37f0242a679749fc5884edf137a12202059f1bbc52188699a45eb42111688a8416afc2c22f4ed2b3a9671adbb89a14fa752d59a659f9f6fb53511dd0f3792ed00047a0e9d5839edb651404eb720a267bba603d5bbaa7c0fc1cfa735785a69dd53d104846e2449f3aae9b0b32d58eaa37a1ef907f434495e50967aeb5970524281fdb596b4cfda99049a05d873141b1da75a1fa95b3f3e7a1b95a4192e9dba02538eee603f4bc57d80efebf00247a378b00d3fadfec96b684c3857afa47ad9783ef1d51bf02b0c2c1e552b808c886e197acaffe32a24c8bab158e5d34090f3702530780e8089321b5f0944916de4ddd76fed48f33591f676523246c709b8aa0df52120a5cdfc827c4ce9ad38f62f5534e9f0e6318217b0de0658960873dc2caa31d0974763a7fba776d1466a9445810844237f5247b22f4e1045f3fcd195cde093fc3166424db3cdc6535b7ad39d1393111e8f5c1c09f67f501c2f5f92a597f9f1f54cbcb90338417cfc17be9b11357119c4b87ea2431747feea825963754d4e71e396188f2809783a21475e9370199490aebcfffaccb90452489e0c6502d513421faa93866bc0d3b5cb29fa48bc40e88ce80aeadc1ecf2728415be32d23a8c9d80c404a260cd5435185d6a46bd5d6788f888f26d77c0e2b58ee61bf502138cb92538409df8de0e68cee22018bf97a293fa855c830ff611cfd7fe9d169b1de1a8520bee360aa7bd966e0885e76126e406271456effb91086a7a9098ce3eca83e7e2f020dac6466988fd6544ec48bb6c0e7db7a1af51511487097cf5178907941eb84886ef8a85e8243f25ac1a23d561738b8c6293ef05aed96fcafee3b67e13bf817c8b4e7f8500b0d1e8275ec277eaedeb1eaf43515e7953acd028f31d452aa4ce3a1d14b2334cbf5f23c45b1a42e40b2d0439dc9bf32a9feef0530ed10d2cbb275fb4f9e5aaa4f98570df988b1578a4637921b92d2945482073ebd19d06071a5f7bc5e3764594ffe9a203d995ab57e95d608447e18c46a56a85f43864ef55142ccab0aaa07a140b6bb1ed78e3140087d42bf40cbb59e347d9375ae6b2892278717ca80ba4a479111018c5b33bff75f372993e967952cd60980e007d4bce9279bfdface09fc2708341c25fc5c603d009b75730ee3a19784050d5dbe872af33081139e13c7d14ae54414a07168d3a14be4338376d5818e9c2436490738a393849ec6ed05dc7d269adc2acfa0b193d238f7298fabb85d1c6ccbd07a4ea1e95abdeac116621167108e75e6fc4a8603077c0cb89732e912a28e20df79252223fbd8e77f247106dd20a505cf09592c23e3f0e74eca87a51a103be9b5e3d5d145db05e04ca60a6e0ad18274341a30282cf09926b95fe506de3375d7060251163114ff922b3a59775f512f470318b485da93daadda6b3fe158aa76db2b0524a8c25f6f834b58dea983e8313654b2000264582b575c68f2d0d93dd0f1c13532911ea615559d9c614a85574b309592da44964950fdb5d937a033c876b5fca86ff6003a0c6a03532531009b05019547ffe48403552eb9c2816cebad23c3f705483544ecd068e2ca837045d66386e58df8c48201f1368375272ffecc5753b7d64360350622393e51636031bd2100878b976975a2a38566f52bb5f66df73ea2b820e108df1bba00fc32594e49186d212c4b945020c29e1ed1e0c02b79d50f50835143a683d42ab26ebd7f775d6970a1713a8bbbaac6c27cf45aff02272d77f7fd98b682371bce7246d8f5ba04667c8ad44bea7c764998587386ac688e89e9c1508f7a3b33a8ef46526c61588ed45d80febd2224f757403e76eb126b73599b78be2bbeb143edeeb732b6a5656ecb867fb6649a83afd6ac41869f5de68ae89f6ad3b282c1f308996b11770b7af65585413bdd5931a95ac2eb45db0e239a056206c50effdd72f84a85c708600833c25c402abb9b4941a5e46a54691f03b8f7459406dccb5cc1616c5b4dccbe138215eb850d47cdd153e1c3080ec5a653f89865365adefd37220741c7c47dce48a3e3533fff8c344a78f1fb794f97a501512fd299f6d874caadf86645f847681592c7024f7cc15e2d645037bde537d4e36581124c2096eb3dd840dfb8d00dc6a502685bca96dd0a48a0e79384ea1bfb7b410265f44f8a00614e9b112e0844908427680159240d33752e69de9dc2dd17722240ea0dcd127cdfc490a15023d9be7b52b97ffe2cf35c3c18e6941d5ef7eecf6ad9bd8a93a2f8937fc2d18f5d6b71fe2a4551b66878012e2a82f411185a641f0be11f8680ce09ed4947b497e44f1cd7a4c9894995cb705e3274955397fa65d842e769697b5650e6c3eb2fb1e75c835de1f2bb4013cbdf6ca0e010665a3790b4456fe284da350812f2568018711bb1a93ff93e31bb4a950c8c4def8b16155b6b836125ee1c8664ea47602d028065d9777ef4a9232a7681c67b27b520c0660593284630d132d69145c9a2195149503d5b29d765e4620b006f3b4da155d16bd1d283fbb7a71ba0a47870fa262a6283ae72611584a35fe3028e301c2a81e2ac6d0d0d5cba6a2eeae7c1ac231cf34f376661e342a20523a1f6c9960c8c8c3204b2cbf6d2ad1542c73b68dac1ee2722742e06e87467a9e911e5dac93bcb11fb4a9a3eef89c302dd27ad87541a5a09f5dd8418292da26069c52edc9a2ee095deba8189591d2cabc5596f142629d434f2fb32c2e0317c69906c37fc733b9a3707defcd5c7696f9ea1b87f76bf3e89902b2fd9fd8f58885e02c58fc4beebeaa7953ba3544c63ddc29bd136d7fe2b178591bb1ffd0796c523200b21bbcdb58114fd70b40503232c3adac184cfeb295836f2220a0f32a3bd8c070116fef0386114c8e7718d2823813ed4239c41b8be0d964778475faeacaa8669921f37fe882ef428151a7fefc07e14a7ec518f705f2db44af451f5005ee05c824cca1f3386408a1b8a0acdac650c8dcd53e12732f29cae659575031475845d2f220ab4f7465b80024114b6454ebe4edb6579c5e54bc6c90edad66bed01ce07d6eb85a41427abca64195f262354d09d1f0a2fe5c96c59cca50b36c9d92938d371d4480d5be3c77d55bbdba173780b25d99f22c88f30033e57a02be384112874776c04de2399eced7bf90541d507b85669290d5449fbff547d365e77cd72280b9cb81ffa43abc4eb644ad4d40a1af902bf312be7e3bc764a01095b1a84263de11517b9a4fe48f7e8cacc6a1e155611f7f8797208f5683b8e3a3916ee8934b193042dd5e4c5b9707f5f555c21679400263d9ec7053be6af37aa5a4b661fac7b93317108dfb7d2e1671a5720b77b6e60de607c4e675369df2efeeb266ad29778c349c43f9f4f84aef1a13f7d1b97b71623a5da04baf80caf181cd524964b3e632b2a8d44eb5fbdb61faa407530d108e2b00040814128417f5e0d632f37797a5c37f47a74865967de7e9792ed6d661908e66ec50f5a367c48b526935c0d9c3997606637db51020555ce6c4baf428f4b4bf1e9425d080958c310b5925e501bb0e14a0931c4ad047e548af3217487c0cdc8c4d1061975982d3d8035853bcb071f5cb27a0a9892927835ced2cb393d9600fb106363d52ca4bcd8464f1dc2f6e29d8c6c00b3c8100d7717ea16bad8c30d91f9348d0b985bdeebf85089a65433e7de73f52cd10b2c6314f007bb03b51889b8bf54a0cb306d86531683e69a28a5104972b2975df67e0d328c8d9315f1c09aee3983765171c8a382d0eb3125bbde8a82a5d78f34ed6618d16667478a113217e4a25c0743dbdb3199f1f93d6de178d2369f329e473410d2ec7cba083d340ce0dfcf1babd292d3e458abf2a5ae6c7e17503b5795087967ba311b4886914d6ecd93abf2956b2e974b797b35a847aa467cb0c03523fbd4e15aee8834f1cd327338eb5f8e05ed918bb313b0693c0e593beceb6a616ed46074fc58baab840be430f89ef0265d34f7a1d6d51327cb39c2a7291d8100dd5d70dec1137dd8cd4b2e7fb66a9349647b09515826558ec2695db2952e850cb1e728e9167d47859bef837f9ec08397ab61638c1bd75999ac3291b6c0273068433ee6f0c80f8c4665f706294569181d2187511b23629ef9acb12036a4fb5c94d49874d744b3fbacd2df364bb91a00f8749e8e1d097276e527c7a39632b28bbc8fcb07a09fa033d2df40ed0646c5cba6f01cacb00f613241dc0414e3ca3670ddac4cc15f470bf44df508a4128fc055afd96b685b73c9c68245b4dd72fe9fc11c419086706cf9ac0863672c7fbcb03a3f7e03095673b51123746a4f5f3e5cd0fb795df56fa8ca30fcb5ce06e491e544da6f686bd511cd8521de4390d5a25498bb31133b21640940af679501748dbdba231f23e599b0fff275d08cd6da76069241ca0652d81f410e8cf7062ed24754114aa9ac89738986b53e4072c61960028b7d1640c2f189788c4a1819ff29737e3966466231d73050f6e6e96e2884398d9ec410bc3808ec934927dc490e90ebe4a5a344cc28a2a21f647014294c12d7ae18706b573e33c1940738a69c3a67a0b0b3ab54da36a2ed87592c27cfeccb1f9825d6cc3f6f0fae1403440cc1acc507a46ce6ea09d4be529587fc08b191c475edd07f49179f34631e3d2869096cf615ca862d0a342fcf7398d6ee07738a494a938ec8a7f3ff709ad2c676d16f9273ffb39b728ee919bb8587b57754eb5b10f016b9bec33d8456aab9e2d00c586f344658899c211302f5383f98fca34cdb734c9a8b6faaa0ad086ce87338ea025f059ea721f03eff9bb4d2c242f898679723b6b89521f0ef97e3ee5ff2cce00c9cd52c19a7f919572ad23006c121f0a58132cb6b11216866193328bbf730f898e697c265bb1e72833607cd423bdfa634f2f8cd0abfc26585ced3ac8a19840e794a62cfdd2ce56afbd9e6661c7ca5e634e972c8f30b1ebeb83d8f2624644cfafc3227ef4a642e5f7433f9c27334c389ddbc20c9c242c929f2ca58ba731959d3ed5a1ad4385f7c41ecfc433f14523c93b8f32b10a6d3a34decd8a8caa2b37cf4a630544abc18ada3d2dd67c579597aa21eeb4dc73be047e2dc7857468a0b3c6cfdb4804bb13d516f4a518554448bf1a5ffd1bf0dd52f69f317b30a065a064163549f86ff841d62579bcee64478f8850b2cec589ef0e078d7314e15c895eb82620cc4d10bf7859004da910a4e02192c88bb61821417245979928b26f7cfac45921abdedea060b08860aeb269e85b49e10c6e13b87cd55216d6824068077f138e40459b1285321edf2c70dd30b18ded0bac9ec47ab6db6b8bc0a69210cd0ada77ac1d00cb952c653db3aae5c8ab2d9b5ede6b45e276ff6bddd13590013eed1603bd2000528d52e355aecc1917aab6e382d0269a8c16e3cf455031dfde70e6b6b7934848f190999d875a84c40e8531f30f94702072c201ad01dc745a2d7be62e35632c5e2e23b55978c0fd8b01157b099265ba0d8ae58c4e87336f7f6e0a349843e2cddb3f0b4d1c77b28ed1bed6b1a5c9ea1af3825ec77ee894d561c4c523f088eb82a41d472407390b3fb87958d890de4ba414013ff5fc150eca7981522dcd6659f31b730cb11216e27eea6cb0ea897fc9e192d7ad7dcd40564bcfa1479dada527cac05af369296fb021e9cfa4383ba7661f9c0be5a386afef4978e26daee8b9df5d8b8716aa8e9645eff1aa5dad156a6179dac2214b76652285347b6a30d980324e646a6c97020f0cfc524c5c86dc8fc9880b5b60c0260276f1d46dcf0460ccef67bee4306c11da5575c4bab151a4742dd23d03aa617faedee28b3e02a1a8744a26a79d05351d31d2dbd3b1dc6182d9443350dfc7a70ba419c924e3ab441b1e2f26219c40f19136f353f71dc12272c7a3e860fd184b6afc956770825355f9e243874181509cb0999dfb9b85e4198dfaa0ef427d739a45d79e8aea5e81d3194510962c1a2504d067848b9f2cc926e5311ca754d0a9c95231a7388e9fac77c6c01d2eb0c0227eed170e3f07d84ac3f9a70cd0fc544ecfbdfe6cd0980def515c566f365381e725f0ac195706cdc35bced7d120d2ca013a60c1413937e56bc6e8d3a4d0f66aad1c6a1d16e73dac5767dec9ce19f341d256e95d5846aa89177f270eef9772cda8603b030cdb0b50d113df0112af871948d497db825205ba6d4078789183b323c2099b09bc6dc02f8f8957517f2afd965c2a49cc67e187a00fe915239dce84283b171e18e8a89a8e9cb2bd664e95d308c03321c63a8f23b86db44395783b15cc4e21339feb443ddf11896eb93b27ed0127c99ea40754a29ce0e9ae148785da1912349135b43b83319e030a6fb83779f4cd4632bdef3385dcb227cf337751da95718025cc8d9337325c12845c1f9f8131a02c887403a6ae059889e21643ff1fc8d3a334f41fe918b1c3a5210e5c321f640b0d1fc0ebd7c94c3087dcfa8ec021980607ab1951ab4165215da2b17792d7b6c12c0d70f284033bd690fe97b19610953ae12182c4a5bb8f674086fdb71abc298d94467477e975fc030cab077b0970311907fd55465056da42d2c4b966e9aa38137928d0dc391b7f0f53ffd164af315c4e3439b1e5526cca5083ec08634126d03f2db315caa359cfa7bbc07e22c0e71e904bc0c03adc5e568d6e0857f6ef805dae69d5483a004b025e962efec9987127d3ad1eae44dbc20cc4ed55975fa8069fa14a71bf0555924515aee5248ae532cf79b32445f7530226684d53856cdebbce88af827912bdc7629e9afacfcb24e00f63f29002b733e3406f8044db2229bc426f60d05d92053f08eac503a06c1f57834c480d793e5c1917e14bda1b44be10fd255612a667235502b3268287316a2a5114431b65b11a6f473c2391aaedc8b924783447752793d4ee0ebd86759c02ed27c967240b0342d6f5680bd286cb5c691ac07c9a74f614a4730776ed0c01b7464983efadf87c34437e3803a93ab8e0899bbf5eefaf74044e617ac2f4221c3872695ec7fd9a25828b712b2ae3eccc24df2a3c149f61449c8b25f7f6dae9656ba5521bd9c1339871a856fbb1030cb2a2b161ea6ceda6341e95426a56fe9dfb1a0ecc41d6ba303d2c864805269f99c00d12b2907814bc17edf2dbf46f3b8e2d3a6a901f80bc72749c9959bc7a0a2e44a942c8e53a4f17b94ef31361cfd86f59ae40fb230c4a0e4fe9e86e7aba6482ce74aedb3f41a1c30d22cc0538d02b570f4f5d5f7ba0a75de05e38ab0873cccb1b2c54b6011b9e4ef33295e1ee935775337e9b8ad4a5989ae5cdc44b3db118888ef4c5732ac141dac928c8c2657859d188f63916558235b8a05667c9622963093cd7aea482cc6483fd73efb9187a3bf8a5ae1281f328efbade0fddb95c83cf21fb226bc16be91f12bb2d2709fe1cf4ffe0a866b1a72d12834d52b54c6a7f1eddbbb4981268baa040a90ffe372b62c6fb9f74f274aea5815e13d7da4ddc06258339d4be886e1bc37693602f1a296360304f0f1cf7b5a7aaaad291dbc9a42f9b8e2e73d2de4081c166df9666a9a8b17a8c95e9dffc58c7894638a22c7029c8cc7316282c5bad57b3ed4a55a09199b0477388ab4a120dfa379b2f474f1e335837fd7518643a5667c4778cc23909c2d4ec45b59bde1d2991e527091521c1a4ff55d7fb4481da07fb44609dd0246e7f58fd3d54d080062de44ce33dc91a468ed372b1641febf4b2a3b8e7db8671780bd1086f604d365e66f0c9f8fb2f965aed0b9837223f9fd5e69321a03399a86c98d1cbd85fe490462a354c6dffcdec14bd177a38c6e6f7c49f3e8b855117b4abb21dcf52ed36c35e8124ad8994d1677348eabd07b836084a45779afb7a4c18e2d90d39a3764bc5162c239a480bdf171b8949797ccef665160211d530280aa24890d4bc5e56f05524133d8c618addc6e1b2107338d791c9492451a0931f357cd37798d755c8205bdb808a250defb51eed749ff7d2c8d5b93fd40eb71dba905e88866af1d41b1abde438b85a34b830c494991031d5763c2730f75617134676e79b9f92c2f44e534f25322e11a49913203c74bf719ffab9699458ace6202bd3dc2f16c8ead99f8f5566f7eaeb02b151793bdc6c9fba65246b627fd24ac8ac7a6d00a3be6c44d01beab1321e70373bb380855ec89f4a679a293d8319be64017ae340c1edae89624b574c4d5697f874453574878097120df200a6ac87401eebc96463c9166a13e488913f9152c1d1886724089d069fa6a4ca53deb6616891dd166265134a80c5216f1c1a6f26da1148f80a1b6e8b2c1bb684a1ea9e7128e098a55a85c6b147d2d0fb5c580b88f29496db2443219ab1c049fe05c988020ec3b8998e1220744b2de4ea069ad0862304e2bba2541aa76cfd01a475b5de560b3b3a38d80706a724bc1ce5503fb13fe00a02c57e1985e88f44d87bd1ce03a60b4dcd3eacefaf42e9329ccb2062b05c46f2938a80348a95bd02615127220114bcd376fab8c8438a92f91dedfe2a2c9f9534a1293b273c270d47ae69c4fa0791b72a1e9970f57200a507b2b936ff255a39b9f21ac72c7427f5a49645cf13f46828470511ebe06da372f201c7bb874c9271eed3b682abd688e7c1419c433411934a428fc755b3bf13733b191ea74d4012bcea36b8990f73b77a75279fe1f93dcbf029b24aec864edd68c08894a0553b71774da43aa6a07264a9219d0700058615271083867335f0302222f0766faace8e671c0b6347d0358c66ac281d6832781014dcf4a24ab4a40578e6472b1b909224b0b7f2264f403aac1d28f5a200eb39a0ef52ad6b7edef94d644e80a77656da101a6e208b8e2d96b1d117acb84c5c3187e637c4d0d50ae670a3bf75c8003350785abd111f90fa62f4a411bac6e45f95dc6621b7be98884eb310db590b677b72db7943225290355098108e708e175492a7d62985a56b3b2cc1b2670958e35ad2feebaa38cf1e68a7445988be4b0ea535aac1fd4403a50df6bfd9b2878a4b97ead2fe99c7d452ff971a1cb3474e1e7e7dfad7694817f64f913fc6125cff0d26943fd4e2607bcf513382a71cf76873844a47470fcd14873be3d0595640b1ea9990b5b8c0964fb20bf607369b1b6528bf56fc2c0e3acb1bcc0165caad205b906f54d183cb672addfead8a42db8d0b9059a39b953ffca9daa546ba58ecdd932e38ef991c7d1c9d768a50fc91f9eccbd13c91f9acccde7b8f7247f82c43997cc516fef217396fb0f9c600c067c02122d2673db73aae75c1e824b82bcc431e99815ea312d66c9efc59843c2a1b0c261922268a87afc49be6ee6e56c05b25833f86570c801fcac70d675c520128771bfe26631e00fffea471f7277f7eaf58f84590c18fff71c58bdeaeffb074581bfc797a38f02feef5158e1d0d000f8fb04ac5e55c42c2a7227997b77222fd74548590a0ee3fe729845a5ef2729e20b4517b799aa080c78f63d48396e42398c7b0cf692b9440f2e0cca59cf26948e4d28610b9500fb10f7dc09cebd739f82cb261013c6bd749a404c991379e118c20acf70fc317d0805993322737388cc893f7836f0894d992a0ce12b428f5ae49468917b1a3695167bbec0dd4c8d32b3e630ee555f5585f3c961dc731f576754e6385596efd46b903bdc53d06d903b9c7b60c2b8e71c88cc7d87e384ca9cca391fca2e749612e430eee537448a8fc3b8e7de6716756c6c2a997b0e8516b9e7bea35e7f22f741ed1f1952e64f248c7b8e4603010410b4b161cd5ae65e0e39aca70cee53e818f519268c7be944ee70dcff58e17ef4a1ccfd091debe7be48c7fcb947a163f4b9972f2ea48015aa09a344962679e4f1827340dd2bc220028b53e705cb1476090b96d50e38952513962adc0f58a8dc31588c68c012836d82753c7552708e2bb836f00d924a0bd6912553143f746a609c2c99a210ea8e308602411298541a495eaa24613941d212642401c11d25396901146b581b304d964c507061a76056964c507059a3ca19501cf1048a117862a0d0210d2896dc1d70eb8caf0996f9629fc0c25e9122892b494c5c71228c2b26a8625c9972c5485e1c954717b703907b3ddcba1809306ed06182da0089251c34a062ca0e12573c908197211d2448d0030c8b291a2051f444d46228032466f00006594c811d11070d3fbe208947ac61838f2f350c2e0f98d7c5d7c343fee3882f4e7a6c99e2e388293c106a71f43ae2891b40265a8f235030f4583c854718edc0c38a29e011506ad8c105ea8f68e2011d5740f1387223678b1d4765dc80e3a4a4e3a8cb4d97a89ca3299cd83015e11c41e1e242bb3942e249cd17219ba32088723419b98e78a081468ba59acb7354030dad8baf87ff7e8e379ecc484113e606992e4aad2d88584d4a334945d8cb910c1238acba10b14c50e483caa9089b8009946fcbd2ca05de15482aa819ba29689f1833a4b60c795e6ce0969c3a2a68b84d51a926a06c593c71247862675e9c2e08ea8c8bd17679749861b644c46444931baa1072c386d91451f73e3d993c3e3c3d3e5d38b36289a9882d6a9855a10475b1ab66c96445298f3f4217463f285df98189aef68309b210e2b600775932fdd083089e746bfce0a4b3e107a15593301c104c1e0e3ea8e093826db264f261884ec8871bba23b02a4b261f963cf5d086bd827964c9d443976f053da800861e8e544f78264ba61e3e60b9e02f4ba61e882e0db7c65c1e704e964c45b57b4391159d0830ce92a9c8cab604d764c95454821508708e2c998aa07c5a14d56069c0322ed890f0ca0c2e0edcca82db8265a2d8963057c5e3025f253ea623550a7818e2033c04d139e12d4b261e7e50d580bd2c9978b8010c1e9c20c00aed52f9a289a1b5917b264b26219498685042509ae7ac9e0ecfe76e96ca0409497a790eaa758ba62087f574ddc8a45e865c949ab61841ee44a0c5f9228fcfccf24eb9336beb6bcdc473b656aacf5bbd5a1daba5f0d43c3cff37210ef83a3aef3d25a5a02933eb9b72e725b6c8938373237bb5cd6b0155ee751e7e9dc78aad1919562b95f2419fd294ed5edf10fa2fb1b5bdbe210e56905ad84c0632d57ee7e31b627bd8cad2c13fbe21d5475d6da002f29dd0b2131a369f8354071edc0f62dd7720ed9e1e9dd7abd502c1fbf1fe5d2e8c83b85c184b1fb5171addbc73fb34683eda726f6b813c0e93f972d8e779f5507beff4e69d3c2c224e5151ae201e68d0a37b69efdbef56df108b51b82a6c89800030c2513a8bf4c8f33570f22007c94342b9335fc62342e2d27d8464eeabea1b52e7ec5940956d73d67782923cabf80a6a71ba4ccb2fa417f9b3bd04fa204b1e2ed08625ea1449e3c9895caab9735166f1e1d1d1913b60118f274e968010041eef953b15a435af9c6da625434f98a1d96030a70ed30619a68884438aa99dadbddc2ce2ae4532a70e790e39038f124c77d35bb630e529bf7c1941c266d7b9b3ec3cdf53dde4f938cc3303a30ef29c8f45f629a2c8fe40d2f53a3ccf4abdcfc880ac222e5b855f1822a11f85d01459c8f6f739cee6271d720616797a22e023a7c78e1bd26f8133a0cc06dea75dcd37a4baebf0c9f7757c029011420b0ef9e68e87e772f91db823cc79e150c7e971f3c366c3ad9c6f489d3e669d18f088ef51707aabc5b2016158acc1b9b171e1d450d59441a60432a3d3edb0745e1888284e178f8a034f7c17967f3b3addf3382e0a8ceac0eb3ce87a3eb81e5e4095ed33d87ab61e6a639bccf3f1745e2d8ffe77809ec97c343a3e1a1d3e30fe6874f8f0ba1f4f06692a85d8bca4cd8cd2a9e647f9945d36a0e8b0f92eb026070dd89a324439421e9d8ee4e62417c90664cdf25b42e3e4098f063f30c08d001484234e2b67622ec3c4c8128bdcb974ba38361984dc5d7a715e2dca07b38fdc791f8f2a5c6196d79299992d9a1c35de04714e6851bed492e51423ccd0e6062747c70e6f825229773cbc098ab97bd09be02b77614f4b030d1a392d9a335eaf6e39514c7bb84743efd24aa953faf633a53c36b983c78b3b8ff8e272521247f250416d3e77e92e95d39ad52b87d7170dcb5b32333357a6255912e790ab1a77e92a970ea54e3f1e2a30a5943aa5d4e3f182278f9719810e2795c3e9b83be4c683da77975e411d4a432f7b0fd9eeee4e7db88b94de4c7fa80c60867cda72e55ccfb6bbd56ac91fd935ffbfbfbdfdf9b41ee387ed51535852baef9a46aeeb87cd6ef65623d4c8ffd78cd46a35233523466a132ac4a0d33a5d52ce6bc199b729a5cf507ba7a017535cadf56ed6063d18d4b4a0205aa32968a73cb0e80aeee4dea7a008e6802e3870d418f9d3efd291c78ec236e4eb31e42b0447be2de477bb77fbb18b868845b0c3eefd1b317816dd0661f7d27acae8301dfbcede7b83bac3b478efbdff2ea37fef7dd165f52b1427a452a98acc80b47638fae4769ecc7dea5bbfe16fbb45ee777e0291996fbdccb37017b67a6442d92a0cf21e45222abda664d84afbc9c6db5a8bbb267f7864fb0da69f58503d679d285bdb516ddbe9c74ef2c27672f7097a0dde8bb3740b5582cad257bdd357b593cba693c3ecdf8b9d6e700c509f7e02ead390c990cfeceb30b2ed31b2ed2fb2fd04d057854cda497260bfc99d7d617b9130db644839d4025f02e546b6568d6c7ff693dcb1473678032361e1091e3d276bdb7edbb7d6fef5b82a3af922a18b69a463f81b0031d6cb3c412c3b31b984faa9f0e702dd4bb933e2bf41938a105a08d12cd099a7795be00c38c5e4587f0464be1f002da3c9f1333fdedcfaed73802e103bac9fa761dc7728db13a37aef3f705492bf11bff79d7b32a0eae7f77da702470e1465fc2c16eb4b909915b27ec413c4e038337e1638cef7561fe43d469ea0cc2b95f741fe7921f77227c5813209cc0ae0d6c58e327098651d42bf1394f4653560082679e619e6b464be49028f18af60c32902c39cd587c1ceea8fa93a54a4d466eaf239ab4fdf1d46a5189c93a9ab330b8b634ba4cd06fdee832578a4fdf2fd837a82207d7c5cf431e7aaa1357256876a60d201dcef93288aee7e27a73875baa73bf7ba5a3b5b2df5b6d3ca1caa9185d474b20d0ddde4fb13ca6c41bec01c923f3c5dbe3f677883c4740fe94c79c006be384ef036dddde7f542faa9af41014e8149c0c9e4fe1c429a535c56ffde7b6feafe2c86fe52cfa586aed0b562adb5d65a6badb5d6da0f76c096f674ccdaf76999b4d6dad0c9977b2b6f3412b6bddc84b4287f78f2f63cf2c7f3f63d3eb293b86cbfc9b02577b60fea0f8cf028066ddb13699d16226b77bb9b1b8940529e9a9bc761f47d94a0cd2a4939522240ca6c78a46b281b4699aca0ce28f4e94789be2140e4ce10549e04a1c06594c3e3b216287523531684e8f8ae29edfd7d81c89f22f5e9bfcb6a889d052a97a2c490644003d3a888eb677323b0aa30b48fb3d7515ab4ff819dd37953c363171d8df2c9a8632306482d93b285a0bd64a9e4b0a082cbbeb7a36b1e3169d904d3b025f9e39f2444484f8f8ececb75ad3d32b242da97341040e08003180cb4a150b2fd86d2d16f4811187a861d66a5dc88c12acc175d668109b36f2f16b3b5c094b591c3ecdb4fb5e29e66936c5fe016ff586da02a8ad91f43b0450eb3ef16a9c5a26cad7d0ce4cf04313069b6913bf6e737a405fb454a634e51ce770d08e758b38501c81d6f61c6b1a323f3058f5ecb741ae62937b2bf989df6cc14d44902ebb80d71e0f165be9b5e51d194f3670a265668f2675e0eb368a98f754fbfdd905192256d90746ce6e977b5bbbb5be218a46cf6e05e4d0d424c32d879df9094844232994c2633066e86c98c7a42a265fc4ceec558b2def325de53d5e77dcb7bfa9d23794e5e78e1e4b2e98617cea8efc719f581decf4fa5f2fefb26d265c9ae978ca9f91c354ff32d2485d4f837c45bf5549a5548d8501548a61b336a46d5d4d0f0b66d5b8dcafb66728063c790e9d38063cb90e9b7c0b161c8348f738cf7d3adc36ff1d52211b94347a9f495a0721a4dfef03417d98c72187da12d869ac849a9870ca54c67d4925353c74609354ea52427fc9faabd64fadd30e1fa4ab5e6e9cf288a9d883f8b62ba0abb8686345a9417d2a268519412c99cdcb9332aaa63fead16692f39d19430681a05cadd5c0690922d26a57a4ba6df5a64901b8a35df495d033697865128e40e6d2b9dd422a5ed288396e2b814084b853c3eeeddae3ad336dd772c2fba97b2e3c91d98bbef306252df71dfbd177914976ddf755df713aa6604788a9961a8381313529daa351817eab6efa26ed77df70dd57d4775dfb5eefba9fb6eca9e2fb07ff741ed4f2d76df61d75accc9f6bb9fb2fbd176b349ee7efcdcd51cd6bd3bb5d86dd162f71e76538b5df73751702b779d0e1af5b424a7baee5d1d7b7521056acd1a5167d7d0b10b6c4b4ef227ccf436987e12f221da51deed26a71b2a4b173882336da72d5850a453cd2515765227e148daddddf439b0b3903bf42fd85848204d7287be05fbc903dbc961b4975aa4134c48ff860a5daa27a0357d2e4b4a8d643e35556aea1876ea58cba5b404c599b4700bbb5ad87a384aa84c5dbd45cb66bd605c62dca5346b32caa5d4c24a63ab95664d69d694664d69d67ad6945c4dc1048900d356ad36c1cca719c61c63a91b49c746ac04663e515c695c1a2c2ff0389532b7b4c4f5c89c9273b9cfbd37d129f2873ea7e2b89f208e72271711964b42b796391ea8ebba2ee75ab8933aa9a3909df4a384fbfd8ef7862192077653ca2847426242ee70dfab7e74cdce1940fda02fb89bdc5fc0a39e7b09db7f1f837dd56d91cb313dd0ab2cc91dee1b74a716b9afa06fd122f72ad0690ee33ad0532081709f025d05728773a41639a50daec0cda593a874d23c72259cca8833c78d96eb2273480ee33e498bdc146a917b0f913852e638ee5bf87a1df323ef4a676f9ac0a38797acb50d26db0e93ad7dfb94ad2b5b30b21d93ad75a4166d95d09568d1dabf8982476bed7bd8695fd0ef96dc49febc3215ea9817e9fa2253aa068f1b997eb7988e71324df0d861c6707094c07d8ff9a1e1b185684499fecc388bee95b4edd2fe6e5b10176ebeaca7df35740c3f75e5fbdecf256a91426991dea3259638bae0fdf9b1581813b98cbe5c11b5c2f1666b9dc81086ee8ce6e9ea29cdab68fefb1e924268debf21d7c861f45d8a84d1af60134919ddc8573fa4d07c50d3cc801e7897969cde3be2d1d57dca699153dab07e166e8dae5538b60d63df909b860bcc6a94998c4e3b4cc7da7e73f57bd63abf9b5303991c702f91304f2607dc427287fe4f121e7be95ecaeac20c7c81b961b9e34d2bd42265e28d3d26d39c9a3ff9923bd91d65e00c4ce8720d482848d584b61875352945bca00a2e238e1a8cc841871d6448411155e10217a8a14614222b32439b103da2d2846a890a1743322658b2c1280b1d88a8c2440e4fae6083054f40392308a22b3256acc8ccbf5246a09a7fa7d08d89a6464482255020e88269439a7f392eb8e0e6dfc9a24d21a3f6810ebc00864e015b4e8043962a52c4a8020ea96484105f7258c387378c9805b591a589158480480435c4f00697a63cbab8e4f9392f0ea4c092890b943cbab264e252c34ba6088f547a1e48c1e1fd2c1a47084aca0e4b3a4079c107ee965a530898645793d198dcdf6a24fc5584eaf7d270f4af3fab57f7d99fd722102276d164d8b2c5855c080cbcfa449842c8653a77be2a8f2e2402173c4a9acc851a36ff5edc09d1e29cddfc6e12e9c21e1a70f72a1e60e0d48f3a5a9c6ab264d27294b2f37f5a80fd7bfecc730a4082c9f639ee6bedba5a6bed38d082476a4ace4f4a6ba5209262488b9196223ab395c2294fc924c5529e33334961942593162557964c4a5cb20b39131ffa8648e9011296b9f51d28c1f14723999352ca0eec4f81fe12a4cf81476a762aa9f46fafc525b0cce3cd5347fea8b20853e0ee53e02acfef0075e67d0a54651192c0f7bb09439de138183af3421ca7c99df9de33e99917165182cc1e45eecca6b9900accf454e8422dceef0902773f3a98fa8e03c7cfa96d08275fd62879fe76a4ebcf4a277140b9233fccf24aee56579cf2912641956548e58ecc4ae6ac40e75282b97b4715b8bbeb134ae9fcc91d6400b26c82fcb91b5a5b69a554feb8fc80541148ee20b9d3bf830a1c04aa72d0936ef421dcdded4d7cbb1ee7d3ef57923b4ae774b5e843985236a894f3e53b21e8eb9aee04cf97124bd7bd66bbdb5ca95773e0b992bf33c5b5722d783e75a7549ad695fbed55ad4bb7f547eeb72c5c6edbb6cb717733e252dbf59427652ab3c0a4bb4e4068e0f19e81478a250c1eaf194065009181058ff4098f778c28c408038f14cc0ac0f8022809a806e4055017405c006d01f405480b202f404e4059007501c2a2098f9749098ff40aa02c4056002d015501040510154053007101da0224458a7b758c764eb7eab66ddfb62139d262926e4102e9c7000b12ea86774928162406a4ec7e3f1197ddf0d5b09e39e4fe71d290270cf28dd4bd1cc6617fbfbacdfb4103fb5fa72e7fe8d3ea4bb0a55caa691c169d3f1c7452da348e4c3b5882e57b964c4a4fe4f1c6fc86587865811279e4692e2cc10cf2d23b53432849c9c866816b964c4a3f6c5bca4659c1a4444483378372f25a08501a72b5d7caa163fe9a8153593265a9794b5e544db25c31254b0a6a5998982e2080a0b974fdc80ee487e0c5ab55eb7eb27eabdc54e6fec0ae53365549173397accca0008f74ca741021cb174204f610b29cf207878409e41292e57736c80f14cbc97d8190e503f1c0f9a464433fb2e862597e1012781f7c3e3d59fe0781c7abf220cb071a5a75703d0eb27cd907583c50f048658064f9df84c73bb341528d1678a4ad1d251f59e091661a9d2c9f0325726890e5b7a2a8f1640659feeca6875dd5abdd54a3923ce5ce7c17ecc7b0118d7e9cb8c16016f1980287c6099ce383081daf1d3de694dc068f50c98310bc0c093c5ef0dbc0e30d792cbd7a5c0fb75c39419270373d771f3d59880af0487fe04445c1e0864bee9741b481b96a4764009b1afc8881c7ab430315c4cb8e8fda063e94f07833101e25e0618d30041e29072384d1c1ca03214f3db4113ef06e80288163d7cbd9b1028f54965ae211f2019b80e0c99b19d38f47afe7cae18114440876c9a801e45d771f4a84e05d777731bf7408014848901f107c64b10f7a3c10c10411b8ece1c8818c4114ba94efdf3aed6faf56f6ebb4459f955eefcff9bb23f7a7dea9d37fa7ff4f9d52ea15a4e0fbad3da6ac74d1a53cfe8c81698b7389564aa1ba2ef8debee20a215cce2c45d46b2eaa1d6660f91d0b324a684801aa101a62a11fc915c5eb740b20777260c1d373987e9dfa3b7575c1bda4349b94585ef8cb2a9882c39cd226342e2da9abb448a911db869325f7dbe6e56d53c291b66ddbb66ddbb66ddb6af3693e6d357cbf6b5bd77c4b29c9dd9c737aa9b7a092eca13fe1ddd6ca1bb7fd05714cb0b8c5edb76ddbb66dfbae7b6edbb66ddb4f17ba4279db9e2608e300045a37e5cd6edbf6dbb66ddbb66da96aa1d42fd7ef30502da665efb0fa543ccaed315576ad5f1f8cab0beea7da0c33c3b0cac0f4ed4f099bcf3d351497e510ff5a104009b5d6ca39adebdcbb999ba9ed3b5049f6d4f65c6501acb5d65a6b7d574ec7bca6ca2cc9932fbd3699fe66ed04f1ac1e2761d486d78d8a7ba4b849d45a6badb5dad62261b556a73aa6d65a69adb5d65a6badb5d65a29adb5d65a6be5d24b4a2028615a6fc8e8b65aa3906cb5d65a6badb55697abd65abfd65a6badb5d65a6badf5e5ab76a79adaebbc10e3276a20682bcb9f422dd2a6955abad14b39ba03d19c460c01844afcb101bd5dd1a5d489fed842ccdc990441188c030e6e7692f4e917e9d891bdc2d5b4df0336f0787b5e97a173aff3c259d485441f5cc1e3159dd5d3693a4da79e4e3e61fe8e7f14471e024c59f7a9700c21f6fd0dc70db650e9c57075e15d54e28f8f67032f8c6559174a8751a2e9e430ef292d3a15215a74a7d9fdbb79930626a27d14d5c9174bc6c232566824349a1fa40057e949bf573e879830fadb4dd9bafaf97388299b50ab700c41158eb169348d76e4711ab5d08c9a46f4d08e3c4a27a24cdfa98b8ca4139e52643e4d252e610b9d8bc81dfaf273b96c1a3d951d6918fd7e2a9d8408e9e9d1d179e5116728b9431f025236d5a08100020730d009d34e5ad129ef13ed5e4a111d794d4542923f3c7926cfd769918a2dcea62121a12a150e392023f3ac1089c3e87380f5aa28304bb57afc32ac9f3548199a33187ae672d8a454a8e8645a73190f4fcd796a2e4b81ba3efa940b479c0a698a76d4a31f6dda4767dea31d4d518e5e8a87a0117fb478369809636308799cb522ddb4a988f4efe591c759e3e1502db2c06642c2e86350ca0f56609628326d2d4f717c41ade85a49ee500f6f4680fdbb0409ca1d4aff260dfa355aa5ce51aa3d2fa0f2fd6e47beef4c86eee3f480a90fdd8eb2b46dd843f4debeb7f6108397489974217c4a940bc91f1df9be1f8520dfeb4f0203c09f67ee56ac5a5d1b157d7e03478abd577474c02bd7e71141903bb8c22bfbabe8576bad5baad69d10d45a6bbda9adb3b5e680c2b3d6fadd5a579efc2895524a4955df10f72a6badd57aadb556ee8623ce750b4757aeaf2c6badb55677526badf5cabc3167bbd3d101afecf447e9bec2abede6f95cdd6d678ac8e3f316779ee7b1be211d7e74a32d5296cc0c6e5d1ad9a2c951e3baa1a9719777385de30273649a992c5d32b94129efe8df2ecfe61b62e33938d61bcfc1d1b2bcc72bcc52cac60f8e748727c1b1e29ccf0449732d587e833c58325fb8eb85bb526adbbd736af172ef9c5abcdc3b2f974a71771add3b2f974a71771add3b2f974a71771a6d5e5a56888f8fb5dc4ca566085278494958fdfab325acba90fda7575bbd542fb5da1faa2581973abd7a0165aa97213cbf7a095d4373b6d36ab9542779de01294c1a5291b9330452048cd4b6ce5ba150e48610073ea1c5fe4ff5a9bc152bc592329c0c4f4f4f2a48d8447219174e28920d2850a0f88402054a9ed90010d4b2427c7c686abe2e4bf98be00a5285a4ec610f0f0f2761f6ed3b074e09b37e9dcbd4da2ec7bf8e28d6b8dca5c20c7526c7e5f26c24544a46b90aeed367547097ab5fe633e16d6ec7bc0eb490f986782823039e4f41d627d353a6b6b54d07a8bb67c9d4054ceccb3e6b5d0f39600166eac24512f752ea459eb368468b6e061a2a567342750141ee9e760c081706ddb020226f1bae6cc49129c5c2d4d4032dcaddbc5ce07bf1d21d0107a6313ac8fef6480aaab421e60b33a060418f29baa421861710403d316907aa08d39a3862c8e66cfe7b4c30306d817d88ae10fa72c597ec4fb18f932ed9dfdf7da61401f31cf0e859b124a693dd26092d556c0903065412b311672531acb1858d2e61bc68a1032dc8916882862dcf87870b1c5b9ad263694bee1b65bf93a9eb1a3f4c42c3249389863126982579c14b7a62e69fe4859c2166f45fe8a121662d1c146892d08449fe04de0a8bc04f67401950c8163c62d6d795b2306ed6e7d525f73cbecc5ffe284a4f42ca3cf426ea5b38119b211828b27d99970993789864d6a8acc06896e4050f8b11cc663ec90b355a68f96226f34a66491cc961f66998e4b5cc92bc20ce6642a7f507f693bc20afcc64c222f0fb2b9909d982c7595b3dfe699f5541d9aafa79d5a83fb07ee43de66a38ba58e188f3178eae826c435f12c284e9bbd74926153284a16196e405ef8c2d33997fa1a34049c2e30799b0080f8bc09f573faff6e755a91a57dfc98ff52c70015a78dfe068a4b76fd08f5ce65648987d2f485f388d0ca56c2930aefef325b9639de64a47484926cd4a0b9c66495e48c5f165e6ff425b01664679c8304bf2c26be66111f35f905666342c02ffe8474576f658c1a31f2d6121ddb9c8d6c33823dbf7a3ebcad66bee4bf20728dbf726f963b35dbd552d61285754b6dfd52d17c07b9c9b7798b8f671048029a07afc3207f5f7ab6f0cfa91d7fcc997dc6905ba538bf655a083f1302ddaf740876a910aa6ef4f2d5a6f923bf653d6fef52cb27dc74202b1bea404100fe02df4a316adfd1e3fca76c9d581ae86e30a2da594324bd09f5a098e1e7debdfe00a1edd429d0d9050120413587a10238511516c388203175d6c18aac28833fce93f0932eca73fc779a4661c0f65d6d9a00dfc996a415fbef0f4bc75b27febafaface3347c992ed805f373dadbbd8e49976c9ef92d94207309327bb0842711c043b73bb35771b32f9dfaa25178f27494aea398b67449576e21ddae76f59ca103e4ce9c3d34e0f96060ef97f31d5c65f90d11810b9eaf1ac3b72033e0faf65d2dfacfdcad167d8336f0951e2061d96346189d7c1da0679d4bc2642acbf166ca0cf223fbcf12cc4fd1701465c29b3cce29934a18d383353e48038ff3f651e7b294cba9037be6d3a30f386735f778bc813b8f7403a73fb5473b36f1a4d23012482044c81d7ffa91302506cc85a94f8549aec3fc7dce6fd9ad92e27d507b619217665d3897fc48c9b585feeeeedf0305bbb2fbe8e2f1460b092d9938f44797edd40b7ed0c0f33bb99333236b64ecfe6c2d2aebbe86fb91c6bb41ead310bc6f72679d9021d7ac1367102ef49940ba8600087fc0d4ac03e54cecd60cd23373f47421118771a1d8f5bad146ee4fc1ca17e4094858ff6c92fbab149d829164b78f84333c70c835f3be03877ee68529388cc8343281f483913f12648b25703d29c77192e33cb5028f37f0cc7467032d9129e178808cd57085389454903b61727f901d3a30a76152ba97ddb70a4e54f0213c9f5b81cfa1ed0d206bbf816d2c889e7503b95e0f3138005326256c06a143482d7283d103e58416bbfe093324d2a20b60661bce212672a76f1410354432bed8c2200084425aec8182e7df045902d7b64974f3775280ffde39e50d1d96418288c1045184e14410209849a143932b56a891e58b338218d0e4430f514d448c40861d4d4d9821e68b0f4dba902f43e8b024c23e91343c30847d22698c476a877b9b5bb76d175f0fd76eb6fbd673f6776ff7532f73aad656c5f1b004ee73da4edbf2eab5d6dad559fd2380dc7ec8465338fd1287becc5e6bb551f63b5711700cefbb4e7e371c8de4fbb112e00d7cbf17e323356f97b6c8eda0813f8f9256c4653ad0f8a286952c5ec43034b334174469c287254f7011c7cc7e907d22f66f487dab63a9b7efcaf13cee7297bb5cff4df96f9eda52dbe6b2d984669f887d232b18652b26db6e32da9247cf22596b9fbb9bbcad8e516cb76ddb5e768d0e5bda8fadb5b66daaeb5236c80c78befc9cee9c14cedd226db972debb30453d07dfbf8238a9b084fbfe204e87256ca0f71109bf0eb1df90770e1c8fd4d1e2f8e7fcd0e1c8ef2c5fdd4a8672257f240a9d7c8db89b4d4d4465d9d4c453d620cba6256ac8d7e3923fcb2627a8e4ce61f7714cf8ed6fa5d7a3dbcf2f004a72b50490f423a11f961b675a1c133af7bb20815189ccb400f63b0cea10c77e7d1ae2d8500062ae2fe61a8af2e5583af972224a6665d9e4c450eeda931df57ebcf5a9a435880cfe38742301875e2ae50eb8fd9c24f44f9c2bcaed29ce7d31d32c0520e62d145b946fc31a8e344b244242424b320d83c8804b00071b3b50b42934c0c1860b597010fa6249972652cc261459bed0218a2e02a573a8142db84539e9d09000000000004315000028100c07444291582ccd4345181f14000d7b9e427e589a8ba324c8511032c6104308000020000001022456340e0ea3b75018128b4515e620379ab624902391998b432ba3d170598d4d8e501be4e488c29f0cadc2adbefc2c5a8aa32af140d2fb6c7a2aa96605bb27b36bf8f9901edc0c0186c534b914b572bf0c81ff607048f51ed1b034f2af5a019c9b09f8e0d0d52fc621c5326473fd84452112e72221fa4de9871d5311c564ac84343dd3a739b08286b5381ed6b812545c10bbcc1445213122962ec6d4f72aa1cc9b7b8eb4a45dbcc2888917b3c1e62685f17134e8bf7ce86983e3c2546211ae5653932e75dd03c9774d697399bbe3f8310570c969ad0d3e7b5bba25f12f6ecc48a6c2b45517a1e609c744e74661ce722de05147948f6a82c60ef9352a62139a48c0dd8c391cc19e0251d57394d013df77b75067dc386068ff8afef4c2d7f2501bee55c23d85626bbe006ba5537afad72e5968a17f4fba8c2796cbe070192e42b72892a78529e42039ae1b2f613e3b836a2450642ac767316197985ab8733b1ba9e6a908bf5860e84e324f5446feebdf9f87c672db7d072891abcadcf99671fd3e83d46855206ab4c48c170f34d64e0203622a7668f88836a3f476e6c2bc254ff7b1ef8310848842880b9f057b5ce08a4e498840bc7ce8822527f167d9f08a665d4128d50f5d2e51f00e0b32ea878f8dcbe016e4e9fd7e486ed7a3400d6a9028df2d925c4c1331e4ca3dcf645c082f5110b6173c7e966a543177a1a9a2e33dd532240e15f80e5ce95a6cc91906a053072cd5d73e2017e000900f6be2d33ecc87dab10e0db4c33b18ac5cbdb3d6d419d857e06684f426f835fc813c5dcc98fed4aeea363be3be12defacc52a3944c49aea92781fa779636bc8879466758d550200c100dae08495aa8342e87644aa78b5565693d9b58a5e514934b2cb1b4b27cc1b051babb0a5d38b410a9e4e50a1cf6ae17af947259d3197736b1e9d1c395f10fae487956ae838475afc4114e191066d61357642edec2d89642b174d782dd8d47fe94c3ac07baed965e394fb1c07ef60d4ebd10f32728568ba6394eccf795dfd134146068af2032ad31f17c8014db954a925f6578ca0588f1888c5387c8f0bc9e3256da3c635341ad3beb72bda9d197ab95e52b0f52da2593d54f07eaf71d83d92128edfdb09a9ea11cee80885d41bf8c379091d0884c87d412233c33944b62ffa0303378f1ecfb054d1d4be46bb3e79e30711335b13a1037e24fb3e70e0937511399e075143aaa2ff8411fa32632c126a46ec2f152f8898be1603be5631ba7c6c18d131fe00d5446a89340424feed48e0e87b0b03220a497a4660540d35f1f58370a9b5ee9d69ab6c6fe86156feba27a524ff5d1b629e6732c88b2942a1c9476fd9d7268e96db986a82b89bc90f44982a4d00fa960ba4c43418b2c67d9209594bba10b7c47ade8d0349a099b390dd39958741c430b4e8e34d3924becdf1cace3d590043c0f770a661a9651797a2ae34084434e57b4d2d296b5dd6245a01ec0a60eba82df2676cff5b80d98b539b70c976ba9dc03544839aa0a47e64b022da9cc7b84053161751adfae439c37e0dd621a71b97885d5760ff42a74dcd9035c2a07a4fd79e7b97ea67c971cd3141fd86afb611575684f1be1387899e14aa59e41c1b1617faab172916bccce3ad7a083ed8dbfe3159bb1a0b014503554f230b79607a3d47bfdbbd5ce78b3e53dd6c09fa2415497e2b9e2458b3709cc48fae204602da146706bbd4dd1e2a966b50fa369ba961a94d702604fc541248df64bf57b8961d218a3685f7cefa5b31277174d46798af7b263524f035a4a06d9270a4e46854a3e026576692c9ed2e0d24a9d5466d8056ee79f059a6e0fc4a1a5f43c06a08baf899b6ad1ae808f7ac2d509334d1604959e6578329345333154ea6ffa684af6a30731a68c848755a0b3d56d39dcfad69f44270d0724fe77cf10da0b9a9355275f1e2aaa1afa28b710a44506a2db845a0cf951a0006ed229480da33b3f57f542becca06c7c84e9cf11c93f4651450106ab26c555923d582a80b3a07154aad19251c5b5ad633d60413c9d4803d496ceba0d2888b9a4aeb787550e83ff49087de8a9500fd5f5be67b6b13b8fc341e54c1e7d94aba023245a49ff4013d3712dc789a8e3b16c4c83116f159ed2bc17c61a48457d49f0dc944368645b0b82601a01108f761b24a7f2afa6373ebd11ddda4c457d8cc79b9768a06f4236200ee21a125623ba3d7da004da6b6b88e7e2420035f97e08876ac601a09f9ece72588cba59effc8d992095a38f892c9679581010097bde0e211eff753c172f1069189de085f45f9d761ccf5979685f725121e4f58430c2910c608415e903b5d8093f3d936fc148e6756a108a23561b2f8d74257c661c76a71cc9197ed03351bbb630cea4c755244203c46425e9d5a1345a44c106b9d607959f05b1e288ad43c835295175e10d756ada34aef6c3682ef8024b876beed9f3f3e5d8099767d0e36311b3a83eda1974c4ac2691291147cb60e888c1081e994da585d20e252fc26779c4efe403723cefa36ee97851b4dd61a0f307bf8b243213749c126ffc86e68fa47abaef4fc9edf3c9eac359b38c5e37a452e3b7df47e92524568ac031a75ce170771e4ea49bc1a705ae1e80f13b131fdc33404f3b4efe647760328b50b5d9966981953ce1814a3b85d57f834fb69fbce62010054c554fbe0c003ae32bac51e4caad6259a02d26f138cecad8867b7f11eaf1d54edf0cb3225bdc5bbc22a2e16bd078889c542661477f986e4eaa5dc238a58fdf0af21510c5f481edd8a61735da7038a02bcd1bd4f7fb5202cdda574c765ef7da7d1aa1f9268d338d1895750bf922fd80d39f82eb452dfdf567f8d711055dc3bd797d5b9428fbbd1461369bcaa21179612470ccad83ec72e1f7c65a992d4e727f239a33da7ae1c783fa12255640a3e11afc7031057022a4c8b707a5710c1c11cf7b064d0c138daed8d999e2b8a3b2a9f719501800a9c0b60e980e00d1873645852edab173384dde771b1a7ae144030474dda9e336162f58f7545269a54ad75287ec2d9f738c5a1be509b8b82328b08029fd6348fc2e7a2791e52c700d12c7f4500e70112e69bb239585b19a000d0d4fdd233c26f9fcfd903a3af3156c482079a368f2414f12c2f7641b0b53ecacdfd2c8e6feb626ab242ab878fa54542074196bc2135a5e14fa0cc4f2f16a75851a8a99af35194f1f4a8708998d33282288980e61759259413c439c67a066a533e8f5f5de55e743ae28458cc8fa378ce59cc877cc1e786908be5458ddad3e537ecb7dcfb27a5fc8a677c872578880f8ad69c2168aad24ad3a21ce66046f1bd6bc57548807d8e072c3e28642cc06bb364af12225c2bf412b81950cccbd402b5dfd035ed34cfb27dab6e5cac5028601a573f3e8a13e01cf81b87acb91cfb18c3f2481031b49504124e2ca9ebf44c52c5e10c654fc4011ca24e1d42ba8c27ffee08d1ffd549d8b3226a849a248b340ebd5019e2cdf5d3ced0e4621f50c463d4b3094bd038b9980b9a901a375c17814bd4b76290219a58820dea4e3992278539472c40125e4f2289100b60bc66155ec9d77c96bf8938493d879efbc1d8014936a74fbbf262d1dddc4c96434e334d2fb2f344c0a543c78c0c84f00a802abd4f0843b83e23e2750589a3a61d7e6745775a16473f58da25e77e0d7c4dcda9590f3b657b9f5232f082285a7c4efe975c4f806b84553da01773afe89c2a75fef94167bf8942acf96423c2314cb977bf50702302f24f6d5ed04f4d7faf0611426632281e3b6789f6173c20cb2427f2096b8e92a8f5ea6a5655f9e8363a50e924a959126c7efd4ec119504b01579ec634d66577087cbf39caa2db9d187b5eee4bc086daf81a83f9318430b967fbf8e92e184f140fede03446e3e059ca08229c3077822903b8d58172a293629ef1783b7ef8974f42c3e37e398e21cf6020b096eeafe7d0f66cdaf7a100a7db98f380e4ce6bde2c1164079b6802a7112e95dfa743d7ace35b48750be34b8434fe16d04bbf05ac748d3c7c8044a7844fc8deb8d1ae184f0a6b11dd2f38355ae5a78f348a5391a148c341df9da895839ba31134e701edc91f853abec366b7825ef6e294cbc96231b41327abaa9929a6f4d15227e2ce3f874f59e30d5fba9365da21bb989061af97c91191b128ea0ebba8847aad0c1fedc6489544590ab1750aa4a8bde76784ecf92390f0af465fac899b093781ac7e6716b4bbdcb4b53311354b9e02569bdc934ecf847795701505d7c7d646dfeea4d6427a732b1aa194bf892af3e1afcc614014b1c04c6e5841ab581588fa9f8cdec9be584beab7e0e433580320d7ab8acf94c74b7295a04ccf2a0266adcb672e1b000b8b630a39ca4b1f60150902f29e4cd5ec64d30b37425d5fc99f1d9c5d9049a14d19d57c8c71338f7e40ae17d6680a2db01b6a22a34b7d379333bb0d0c824b3b37f45d880bea63cdcc6f5754359b80f81a18e9bc0217d50f9de46f6c5884779809ec1847959c11b1781d1433002863d4680399e701a865a2862a380ee0ca973735f2d188faa046b82fa59451c98a53d8ff48625013cdf59970082c030d583624aad5660b8ef5ed4b7104c30a54d116a1f6beeedfc474190d8e0c4a8c443a33751f7d3a23dfc5f9d208a6fa08d8238f12cf4f006f349946fd4527812c4f3ff0f3c6d92509a99b019e8d795a0ec66e1d6eaca898fd4a540eb03cb2e7cfeef05103d21d479cecedc00fc4a26459b5693bb02e18820104a4f9e53e3de6f70a82554bdcd01fa3b292ee36f4d46881251e681509595f0b005d34ac493704fb5a3ccb3dabc6c1de1ecd2ffc399600bc314dc5762ea4c0b7466478876226e1ab8b9e2b3c44a29dfc6fc8e1f8c1c88569ff5868e8b934538512e1994bd599ddd0602ca45658b66281e895440375451d8e2e7b469ef70c0fc4eb3f8843300a2711e4b5ac420aa503d50e72a6283dafd77482b195bcdf8e62dc52596868fc53cf6b2f5f119a4389233039a1694a9e4cce87576c3644e34a93c2634c9c228c12f04a65784175c8bbb815a1430147a80dd14e19a44cc3ed7a1824dbe0b2f3a080c8d1d60484b158bc65676b5ec90e7f254764ed41fcb9978a65eee98a70d30cc0d6d1aa3e7ddee0d4522f58528086954e2389d74d548d0b0aba30f90459847691d4e1e363bdb331da62a9d81c1bf383286c36d8c621ac01de359d699bd3b4dc6483833144defcf22454ef9fab4096b395b88c29ab494d0c58a46e65869473f9ef7dba0a5efd95ca61ffab175bfbf5ccdad0d619f123bb0d7baa417d2baf6ac3d94bc107463e9b99bd3b4ba2cb88e9600551e2e88e5abe65368800f50868d7616d095a7297da53820ecddd86c96722e2c9a4350f8ec53da2cee08556ad9ae6db884aafa6b80d0ce7ac1d625690ddef953e518cbcfde37edc7ed47647f8e15d3e1534f84adcca27e16512f3a57831e4703dfd792652419016aecf73d41524e092f6fdc49de4be39d701ffe0b5e1952c4e82b02c9827bfb00da83545129f02254e3744920e5cc4db2c353ce45b45d9072e54c6794f3631d5c61944869801f9e008ac28ff652bdcb64e822b4fc52b486d35da6aa47e6c18e6860798af602db4060eaac1e3990bc98585dd66ac12f749d633f0329b63ab826c24f130028dcf549a4fed12b733991c390cb9df0fc5f97ac4f3489c06f6e374d6bed08be3c1e35d093d86a1ebd3127e0f24fa1671e5f5964576bb161a8e4394ca33ba5d53af6b836c61e2400654b32461aebb56e4b4009cf343507d86c03c1c2742f7a34f9bdd5c8f2d12c4a12a93e5db4cffc266b39782be799e90fedcda6bd50e74cdc326feaa5722a827121f193c41512d95122b6f3092b8caa0a60331c4fa8d05cc5f8b59d483637dc882e6f1747970bda282b742e3a01efda79cd3934473b4beeb44217b4768a16b4502891a886da089895c10fa94cca704d28f78b4e424522af43e1a827a06e2ad97b686d2d79db4b4c16b186d15fdad83cc88652004965ce80142a6111e9037ea51ba26b599e6cc5720adf3c06bd4ca2ff5ac33c4c919091ab6a108a6c69bcfa25286eb1f9a8daaafd526849730de535d89ae6443015e949bad3b41c2fce05c78284b92cfa6ea00a77b6e3e5e1d17c8e27a4dbfa8b78f542094bd5e30cd92ba8f9b09b7d0cb8dfd1a741893a4ac740045e840276c59c662cfd04e6942565fe2aed972cb97ac3af773943608a15203e55841c50a15f59c1534c42d7e3de87c8217323ce1ce33b24a3672f74e235dc49c4f41fa5448706af9cd521f5b9857525234e87d40f5e5ee9c892088c3fab30e2abc8f58a0fbc715b61accf99d98ffc6f60cfb98dae742e4b6fafc0f8b282115bc14d7fc6e809a5ad30e2de6208fb129674475ea797ed05c446a0a6f15cccd2c1cdff7075fe78c3d10fe1601035c12096cd8159e406dd04c79eeaee23752e41f88b1e8e0b12a92d1a1d608bc17609c19e1d2083ae8b179464aa7fea8c1a51876405c893970140bf8a4580497c2688695b1a69231a5ed28637aad9c9d43c0e540b15d66b34725a1cce643ee11b2b5c23261120def97f3a15ef96fd7d4499c3d5fd57053861ca970f7fe30d7b87473f8e26c2215dc96ca31abec841202b7050038153cea7cf6f900f33cfbaa1ab38d4ad3703a7cae4b7532af6450947f7ad82cdbdb19e0a1e2b3806b4130c9f1ebd3fd45bf7288199e2358bb8870a53ab891834f297f55e40e65003115bc89eab09324f09da0c12ed16d9d98358638c30e387832332f57a69e8ee4681c29f7292af13314cd28ed25109e61c0882e51f0e86d36d1bcd470bf69859bbf30bb9f6c35d3675048d42489e92046f0b162189342d71b8ba1ad12a21bba6e3116d5f9178cc044c93c2632bf2317c08069bc92597dee98338259971672f4adcee46b2690ed1c7e12a991504c2836a8223e7a8fa818d7ffe063e226800d82d60e06dbf83b7bbd115ab66471c522e4a768ebeb592269ba03bf18efb2d88913f2a5772e39ee9044ff11f5a70925aefd979cb3eff2b2ef54e18f862a7ee3b6d3a410e2c277e50b4f2cb45e4b7a71c7c809b0e223b9196de8b6f237fe92442e219d218797fffa4f255f6154f6ca073a477a36a5d8802b5c4520125db245508d932f64be97e976263880caf48de99508234148a9d22804d33e63010fb369d7572d6dc5adf0ea2cc9dd8054da07d84a2a0e83e7f59224cc18117180da459f7821a17b18bde5fbc2ed6cb22ef2ef142f71124fa95c9885016111f4db4d2dab842ecec92c2b08feb5b906969ce4128b458511c0df56b6f09efbd7dbe9fd48f7bd6672bfb60f6651d1f163c3ca8c56ade0a3fd52d0552afa8457c9a2965862c4eef39418a6eb9633ddfe1f0f33796c95e4c7f41be968dc0b6711b63c27ceedd0a04465aff09b5e9fe16e1a62a3040b8cd76e253a2de7143b74e283feb47e384c9fe1380f424631d9e49a745a3bec7ee3ac9bdd8252e0c660a88d8a3f844e3177788f697dd5899362e2792a03e742d70bb52e5a760707fe931bcc278cf0a32b4a72ecfab78c7a0fcb6a94c112c1d6f85ac189c2227db8cc97376c042a25c9da6534b756ee4c3326bc331d29f3bd7a6c9fbe2ffd2abf573cf2de87ff9b805dcef2d367ab8d46d68fd70650ac9c6a09d5a05de777aaf7b8892ec5415a1bede6f8428848c4e1102ebdce3dbd75c036c818e6ee8e1fc7749d468c2b7764e8e2b9d5a30288a54176af32eab8a5e5db6e4591ffe0aba9ac1d3422d116a8280be5e09ff7e5811d926ba2d791a0850cf430172193013a2b4dc9918040a6bf16fc1dc111f7f4a761800f7c80f00b1089a27dcd0581a3bfdcf8381802a821e67ec981d3d982a482166f138b879d0587cb2600eba3d2e2c7835c027e5d7f2f1484c45c209f84e48ada3faadc10a85537361aeadaa039040567a10c7da68bbe856eaad99c8598ad68bff9f5a7c602bf414f0805c194ece4b2c314fde9efd6d4144233eed298f331cd7fad5103ea8ccb49fbb5e812b56e7b7ab7d49e73b0b1f11dd0aef8afa5ae29888057c5b2c17b430ecbf82129796498cd25ac49bf6041f016c3fe737f9bd791185639474e9d90a0e61ffd6b04940c0356c4274406f1977dc2299914e7abc950b1e6586ff01b0e608cde41fc0eb25dcb45947d887d206c8081306475a32fe4bc6f4310a76514bb940179f29ce60f32f9b74d5cdd3d52d4f73fc18a2c24649add0863c7b9eaf60ac63d911b9594f42e19fe541826be6d0f975e39827206c934b40c7d65d1b4ece675ac1e167b15dac7eca857e72082b253ea19295c68eea7d87406a46b08d3c070a208f3ec830fbb5747614f2d4dd79c54a4b0838b507e22c5a578e257dc266949c5a8552beeff8806cae1703148a5e4b00d553a6b601e70333c4dac9294a6911bece2c03c42508c4171095cfe548e08d95e5a4ba0913789f1faf9d7433539ea8a8e6a13246defa08983a79461213af5799fcfde39331619f3a4158fcf77a1477e69f99bbaea1b932946b54d58d9bf2aef70a7eae0244c71176594e5a42579f7973a44d7004fc7ed92fcff2400057542b52eae12e56856637af6f9fec452a3a6a0ee7328c196b37e9d3799dfabcf687253910988c3244542461bffee6b301926b8f4006c212e288d645ea941e3511f208c46836e0ab6abc19caa81823e57d98c3f671d172a8b5705b6536593e33145b30181fc8b8c92267e02e1ad301889dbe7d771acf31a8721c1303a5336886e574ab6b7add60080ef7e817aab713edd9d4a971db7d355f54a47e18958b34ed6c66316c0df5ec5ecfd25dc7524b61b31bb580c1bda29704c34587a6380c2af2b1a3b5e33af3d604c99a6c96325c33b2dc89fc6d8fd0f3ac07cff87dc48df97186d530208c5141f63a936a0183ad5769d45a70007329e172b3c5175f0e569f0e55b45498f0bfbc7c4bf99f4e84dcd1d0e9f74c4cb81e05e73cf9eb5d5839862a968995836360a5908ae511ad0284d222f97053c7204720fa3b7c9b1ec2c5b7be01fadc5b06ee159d4d99670622186b2ab7f40146ec8f665f9ff14d0de81904198b313ff4b9ef6eff995ad408a982c3e40407b65fc0bd72303dac5a3e48da64ff3ea895783d70a13bfe783c5a40c480ba313db02303ba95f3b49edfe8426213d49b4c21bc1110d5cfeb9345352816b37ebee3082abb38873418104b274f71cc368725bd5271ecfc922a631ab047604700e2f9f5c6e2341071708f9e5beeb43c27ce33cbbee13f6c714b091cbfb603e4a2a9370be590855bfff20bb336aab14061d62f3f5178fe94df155dc843872d32b0e74a570a46bd8d3d5ea397bf163007e53edbeff5c08fdb58900db9ff42baa575dddd4b02597279e47449b3afdd589aa4f85fdcc712a582b6133d6101fb2b422cfe0c4548273056e40aa46907ad0a0a755d9a2083c357d561949d8eef9de99446b056a4ebe8dc697066ece796f4ce8c37956eb1c81ef51ec10f50a3dc18047c907a45ca8e33231f93ab622978886c10bf46a58ca8c6f9d320b84aff8900701455403b2362e3381f1605f5c6c1ed545d9724fa8a75bcafdbaf133e8809831044648192e5ee0b7ef908973814777ea7d711f6299f3d8b4cc4df4d50cef64b222807b6785e08e91a88793229f8eb47e75b10c21c912b31c2bd501e1749f575155f3694b5384d21c07222f0793881a025a090dfa6c294b2f85e816b07d419e7bed7b57b5a8df0d2d609be2b68e2bf2af1160c3305f6b07b3465567002d5b8635926bf0ff546636baa3101d076fd7f59e7b62d755bc11365048e63960229bdb8d201d639df4c744ceb9d1a448a15079294438f92901407827eff280707d01886c7ef09315945de51d27a9c0521a68923b53156f7258215d0da07673df27e23016a04ea9d25c32468b815d806e6d8df5d76c0f6663db1248415125e628b6ceb042ddf5020e00575d69c3e6d97419f59ee49e084c5ff0cb1dc3d73c47495e04494a631e33067f9959b9471ad0a642162c489ac8dfd87597ad64fcc736abb88f61380aa37552f5f6975db40191482e2341ea65a53388217126c2bf7fbda84a56a4f5019e00b96ef6fe5a7ea887a051ffefe14075801ce12f7beeb7cdc7bf231e2bd4058b71b34109030d5d4d4d42c384254afa8fffcc9b3483a1255c4d2a4c871eb1105c60032fbc879e9163d41f93ab4adc4d0b8a418b1992c11f456e3faca3a2ab5871e7b0cb5ee8c700a93a5f817e08c431ec8b27f8b9f6c991a51ebbf437c74087e540ce8ea71f4e67432b0fc08d46ace193a69efc391153b9cc48342333a2f222e327d24317444e73d8d75052f5e3421d0d42f92e352f33940e147d58635c474ebd27f6f910dfe258a051838e35bd90ac4bed0adc1b63790570c3e6fc340c515e264768be12a2bf24d13c4173c25ba765854d8d14869066c8a49103983113cb6eda4c52bfd44e5c321414b17211662357150aabeef0a14b8c154fc695cd3483dd4045d5d7150b4c9dac8781f0bae4353dc598b58eb50499ffd38ca80f17bf3a315b77674f9136af7c73a43262ba40d85afe7724ddf5c2e31fa1aea092a331c0fa4784d3566ed7574bac4609bf966e338d5f4a21cf65c412a73fc9fe119a0680516931b030e6e4d5012db339193d385ea3dcc0a48049cd4832c897b58283c2e0cd238e09ec0e70b8f87a709ef3fefc9be04d411ca228e0e2e4817f69ec7eb4d77477455d24ca0ed2c3368f786a14ce4b2da69aeab81456951e73164e9f6c9f06d985548b6a5ee1379b4d7e80d043219ed0af6705e7f5cef18f01d7f48f916f8708a11e6803543a9488882d83319855abc41e17611d72c6978f8645eaa0706052789a13a966d6f1e12bbb2b66e9e3903b8a35c5ce4bd97d8e114993be2664cc0460ed4d98854d9cce1bda25f878bebc7b3678ee28794563f27e1ab0136dc42132b3154c41d682b0455af61f3b010e4e144d168ab7e9680c852bdfb0f530e7bad3e79b146dcfc64f39855a55143e49cafbbf91aafb1d7814e5ffc391ec49149329657b34017f859b19cb48f1e196dd8b12bb93d888e61980204b43251dd671e67518043c0c7583d26202b449fe922443b0424087c6f4d0ee64cb6d99e282a4d93993b29fef4de798a8b4802315f464fa09f81cfd755e2f5eb603de1c06a722832b5c45514d0f2b7a01c9c19daac99d3a9105910068545581f28f416cb1095f564b640287bc6566f4c7bf50606ebed787b05d739933519f6e2f79ab9bf5a0e951e3585ca06f8f47ba401a5f0face1f589f76468daa63e0ff02f143a14974f594cabd3a6b0f01c6fcc38fa0efb95038d7a20f287e70563d6e3db82f64dbc64873cf5ab980379a88c701a477a044621cae8e0aac578e4bc56a8d6787e55c908a33c5f7f91678c02eebc412c7932b197225b8348c7e658a9f808509c4959f4295ca52769ba7c7e500d3cb3a50fd9c640cf3d459b9548800a704f5b670a5045a919428c4eecf005900c9aeb37811b76a95de6f0697063267b4d4befb7d3aa1405036756de41fc25e47ef97d5e52e9bca3d3b3d9832d01d0f36d0bdb5934206e5b6bd55d9c1159a2349ce0e676949f298493297c0f6f352f8a8dc917931294639e0e796f57ed399d719e327482cf9760e5ec8dccf7c5e05d5d52d0d0ceb8b5ebd93182ddc3a43d7d68bc7e76dd34a93f283032de65cee7bf49f491a7debe6f5004056b00778a1047c92785736e95ec1bf1d4507f5058b6915707a78cc38734c53c5584248224ed1fae2ef215bcd292abaf3874301ed93407e672c5c0e19e3321c5850912207610e8983bc14cb525e28342b575030b542cced396480234e1916d8500cde06f4ba3826d689698690b9939b2305ad9ab839101ba540aaad3272fc779cc118bd7ef83fb0e9fc9641089e47e39b4722ba7e4074e90ac70017f8dff3868097f811dbc51404d704566a8130d38a1716485d031e33a9e379fba4f5896641bc7874ed978b7f7b69b064f0f54bbdff960ba404d77a04b85bcf4783476a280e0dfbdc4cd441cacf841b3906108b9bf25b600faf3dc32886502676755e5362fe57b8f067f86677bd827459212dabd962b18084360d444c85669a198e8f9a66af73a3071a21c060d3f5f92f158c7f59b9b923e8dac59020e8140badf6df3c4b5924f224bdce719c78a0791b12b98ebfdb4a41644d60269ede0e03aca8fc8ca5621ca22892148f20d3475f960ee968112f36eb53aaf2a76a8509d41b13e88cefc4ecf41373071f09ebf41b48541629525afb74d568163c3cc0eba7398007c02195f1ad2333fa546dc5bc79f09c9cf9175241f8dab12868c32636d2f47b3f059ac344e803fded527339aaa851949039e20c9d95788db9eb358254465de4339823d67492a27a07c7ad936423e7ac82d9a6cf67afea1d1c96a2376a45c8e3b5424e1d5cc091e7a20747abc23dd969456f848ba095687de03a099eb25d54eea1964b2cf529074c7c36d81a7339bf6d941cf2a69bc5d3f674c0aecae5db031e4658f018f654f4ffab87006699fec9102ff47157c43bc0e0cacfad541df1a981ad42fa12db72a7a2e573f1c4f374ee0f96f086d263f8b4aa5ddefece8bb5df02aa8c20e23a89e73e4e686d728f99865407634dd88de08d77a37a33180af6c56a932ee28e4666663fa314b7522ed94125e1c78ee3ea2be3145768248773b45ff61f803c4ead90c31e83ea1994167a1d2ee3637720012ff26e4beebf0a7aff5e01022085d2057c85f6bc586ff52bc8c8dc799b1ec4502329236870648700f1fc8ba765e5adda77b4512f5d4fb8e0dfea6130e62aaba964b334ac61a0563410d5b70dc51bed53d4a05c56e3800b516170742f547f7bd0cc763da36a1ef60003ae49af014fab3a335891bbfad525d6cd6836f69446e36b77592c1ece33d82cab16107c52dd850d186e98fa8d1b466b182ad9bb6515b7da08d11eebae6441dc009dc9e42a0c7511999819cfe404297a09571d9824dff381095c678a5d110c99d51cdb24cf9c81a51496cf833af6b03a456879052b9bcaa86095e02b034336f78dd40d86b3ad31ab04a6abc361ba2db49145c369f9ee6be987cb592acf994721518698a0df3aaa20a65709d85bc4501fcad0e212343123c83b8ac1121236aaf75b15a88ec1922a17436a8b164893aa23d45ddef6f145d6138a1d5f35c827fd935e8d22a4e7aeae3d2151b78c14ac4828d741353ed7adec3b4dbb023c937d12960ce40e6d1f3031fdb459680f12580a8dde2ca7e7d3890454de6b176efda6012c04e61441e357e09452c6b7b2b7c689b7ce1fbd685c7db47a2ee3e1949ecdb6052ade64081a39b49166fd1703dcd0138825c545a26ac6de23d6c03c5e61ee9eb1e4968a493d86a08cf1f130c9f4ea605b559c38232c63a04cc47a1efced834bb595d203d8ec2d21a390d25588ce682823e752c380f9563708e334bb12a231e7aba465f790a9879d435d2bd2c8319c314d812a18f10497bee7a46c7eacfe2f9ed44992e71a8793471ca802960186d967a2cfde2a85adb3afa8328308b067fa63e782a98d578540ea7dcb1938a20c4732f15ebc342eb086be23d62a3a692dc5771aa69e8d1a00b0788614528f8d15127d1924f82156de7935bee5bdc031483fa968b28abd131a9c66200898bcb3bb35526fd24c857a1738ccadbda9604a598ddc234e99c0cbd51baf7490ab3a25bf025e1dc07e643913ff9e7ff7e34bd1e1bec6191fb8955967f37494f05d31228c1916e87797ef56e254faf0bb624158368ac9682fdab2b2c46be30c89fde966a50246c81643dbdaff42b1c02a6d15ff9b1e56c1ac1098644e11d064e86d6a3ad354bfbd0820e418d0b850a20d82e5ee7d56dbf6c3585a0a620a116c23b1aea6ec4c3733d77513204bca244d5ed8f4245cfa7d5f065441fbcb6d4979a2b3439777b6bcd7a03379367ac88ef4fe1aabdb2b6bf406c6af5461a25e15b2767d381ce8f21070454909d6a2e1f20d2d84924e5d9931aaab5f849257bee49c6157c56a5071089b23ba28152b4be4854d377a4256303a48d61b5c1d175e695a88800a1b0cdf4c7cf86eef5cd9022d6f83f9c3e318c78708da80d72a3e8012861afb22e09caa8c1428948965ac6b629a9a807ae4d9ccb0e19a5792dc6e19ecf0045489b250d65951c4dbaf64d0c813dc1c39820e69fe6867b0a64cad1359102925d0cf6720343551ab98d23546c63c8f63e7974e8cd7f63802d05d054006f78031e8134efb1f629b1330c0bdbba2ca9f2207a6d4cf27c04aca9722316f7676656561fd12be26fa3987624a3bba1c43ad6eae4621725f040c60f231d0e9ab1f023701c600f41e2c91440d54ce30a6409a85d9d7e400d6bfe7361091470f96e135bf92e4b3034d31dd9a1a3345e9deec2bdef99af6643dbb7a3a4293a51a9b443953243a06a1168ab3c907bcc1a1f7d07f3882d0e48196cf0eda75abe37601f7fa8e867e6552c947883c36140f10cb42130811a5d74fcd9b0f6ee236104e4680a641624532ed706020a2bd41004c34d7a83970b6e209978278b19927a429f127fffffdba243763a43b9cb8db59baa4f19f1eb19d580a8ecb8e87d70635002567864b4260a98865c2c40c8cc100713c50d2359d38257462ad3aaec9f4e19d462147a5f0732aea711b7c7c03f888bc70df0767864b1fb79d6819c342a1e39f9a9271980e0d57fb6d7d6947336c61f011efcc110a7f4428e4499da71b544fa220ba9d8bee14d15f55a4cf67c27a9222a17a079cb1c21122234de87f7c15b7ed27703e7ccc3f1c6fe13e661484deda398b3477de532071f2c8d3b1308b27a7deeb829ddb652d246f7535a5f4ecb50349b812e61b96daeab1d224e311b848c52a4e39f9fc5958b386b6d98a2983097167130d3b9b62037b9f275f10c8b07564f841fe3b2f272c520b38c99ab3be5ada72ebb2379fe58924a9858503977b360b873f0b966654c36970f9c5149b7f16639cf9222814157efab198a137eeaecfb5ec5a2733e1298e803e99ad97170a9b17ff320203025fdd8dbb242556201764836de8632e176f60f9720f0dafde309f9f42a78e9a378f756ae4c1c055b184afc1e76128f0b26ed2e731380e8e97f6cedd3fe1601edf8ae2cabf4da00294b3a035120b0dc36077b433b3910004e8ae2ff5d03bf6fa445cf9f432e5efb5995dc2f06523933da1ce4a8b18423c0b3db421dba1d7b1fd8e7f69df26f762fc2b6c47dc34d643716dfa6cea734b86a7a11f2ea0aa57242c861b9f04b3cb6100ce80c97e100cdf926547947b183450642794e0333176b7997c455ce0d835a1cd2efc0340e868d88cfe4ac4b85324baf9f3b984c7e70a71bf545a80c470a0d08eb58224ae26b2cc2bd192c7dcb244c08b4491b6826d8bc79903f85ef3b203d74f21e8c95a09d7102c78e9bd691e8c4db00d0385d2c3f23b22d800b0b688997a190199738b27e9c146531fad88e619bb524e9e6403a3b11b76a87631b76bbb312b0f00a4d12d582f40660ed75a062b7dc584c0210696e5ace97eceb8558ffe5938e183ada62b384eaef1dbfb74aa55e66d574a484103dc4101da001786b93de5eb53c9cc19705bc36591c76ef0a3f5f33e789c72d49657edf56d6921998a0b1d3b74b410c41d203825c1d4c0bf86021f05e89d752459058cbc6a441f32a0ebaf9c71e1ae8b79c15b7427de3811f9b7865837453877c4870cca40774a539e39101a12ff686cac4a3599fe942e3fa169b7c9cb45d735fb958f81c2aac1cebe40dc6d5fdac9ded4b6e0643e44cc0be78f9e3bf07001f3dc70f96a9ce4b1d5e87e9ee31a4b0bf8031d10cc1545739e50809667960c9aed7d3b05e81c113b64ca8f1c38950d1c143f984ae039db00c83a0f1aef3ee1e2a8b1149de70e9c1620f7d4c61b4bd4342a05b3171d8d0e28b4f6a034328482a7b861eb471f23458e091af3adfa7a4757dd2367b63eec7b21009838657c235d5c9abeaf627081184708665780d7dc5ffc02da4d9a8add4659a309ccb52788b7234f28c040cb3f98d8cda6f2f0cc87f6eeec978c208d4a2c9a0c064b566a7085e9255b60a04d19a4238cc0b340194b06e35936f7a35887fa119ae10ce5102c4c10de907f9930dc29ca22dc9dfd28faf8521e58b9536ef633da0ba03efbcdee0550988ad42058607dcd7e2cdaa99077e157c3618100e371f3f4d186fb8f4678340ed40f8bfb32f7ddef9786d5f71abd1f51dc65982c64bb18c9bb066ca67f864f11cdd85017f4118237b739ff5200a781e8e13902566f95e22424606eecaeca08de1c82f2a7e80ee05dfc6dbadd94f08bb5eb237f6eccc2c47d2a2546dfb4f78223e1836e3a24333b37dbdba7d323b233a50f4b1c570d0eae553c0aef8ff05bc5379c76631f0f24d7378752706f81c9cd79e6a984d650f43e4b59f44d43427378a726a360835c03122bc35bbcf7ae47cdc32da9c4082ff00e7101fc1d4fee33375ee7239e0f7ed561af1694ee8ceae30e9bff356bbf3013e8815a8666c8dba44215e7b7a0e86f69fce3a581c24e9842d1bfc2cefef615346db0739a2e67391e8c23142386ce675276777257dc6dfa050e216aa17a6c09d921027987f6dca1cf11c0ae7abe7429461f209839cc13ae9d3dc2f0766482f8f8af3024a1c9286affd481d27eaea7d00e3fb323b9d8aa930b3c980e1fe466d2f680f8e0534080d519f1c18b5afc63bc086e2186355eda77a15ee7d43864ba49c5815f7fc634666e2b31beb443c15e40b1bb4b0dbc5c10ea1f24d5f514f7f354122726b6621cc19aa07e3e2cedbfe9620e5762aa88c0f284d43aeaf283ce779ad0a06979be8a8b8f41970fb278b68dc0fd9c2d14e6a9a1489b83ec4bebcdd7f8a849e49b7701bbf6350ca7a1bd0c5cce7d34a5c23525fe4cc32dabd83705d8492ace08292e9d8626cbf87c11375ec5b158c20804cb621c292bf2b110665063a20309752515056c2f48033361db68d97fd5504f84836f0a56abf0bb920f12aba6abe2226cf7fc8a8fbbac09c8b31c6ccad2dc6fcd5849d870d924abb0c0d89f3de475b4c1fd7b113f913cfb2d4901bad24b3518970a049ed058979086deae7cd9551ead4adc6e31e0547237d84c20bfcfad412d51382ea60bd9cfeed343f1a38a38341965b944b649f1cfdba2a9cff2ee6baf0ae836ecd48024d9919f329920c4ac65b3a0fcc85a6df02826ed8ad02a9c00f7093a504ee3b1f2ba92923c9651b229e0d452ac98f7f4e1465004ba7c58f4318b3afb46b786dac61ee5f9de665b2224a953a01bf3e7bccb5945c14521f03a7b7e6c027b2b5a6055bc7c35bb4f8dff0347781eef7c48ff37260873047eb353a501f601182646c0b98f3263f92ec2f0eca189bfae6d08c6ab972448728431a1475bab095b0f0331abcc83831bf8ecac52889cc1fa8017d458326c2f4df7057c649776a6959a723dc2e04f72e8fe9e9b040440fee53b4cd972d1df96fde30eaa187ea267825fea8b61ec67d541c01037db7e8529c497fe9a14dd3669a312f89844e998ee4af5d25d5fe396ee0eb432beab53afa9fd384c412b53ac200bc4f1973a8d3006e62ff07c821c2845c8b04234f63483224ede35e2d533935ebda751da22ac6343e3e25568289769a84eae252c401705aebd31234781223a2555f8f9a8246712b17637f6d193172c345f6f520873952b9e098a5631855f0223a6d19db22281ef4ef6bc3d37c169da9f8892fe9b525e756637ed605e902c90f7f3b29e6d4913e8ca1d929e36edae28758d1dd73214f356764cf31fef48ea9dd1748d1c1162a5a42a2745b77f542f238f047d2b1b9eb885d7dc4bd402222a62ee6c03c05305d3e6184085b6a338e35a3d5108cf95b2f184fda3debc4c153200a9cde374ef10a1b2aa0ff5f0a792c8d42486b433ccb62f003f5272f00b4fbf6340c6cbba7c5c50c75d03046426d47fe29f4f7f06aa64d2ac540ff9a150ef01c487f857990dff510f7bd54a13e35ea16f7ccacd3861c22f3371d39668e5f00d6c7a82e4eb743380143631a10e48705d2e702d66c48b4108ac5fb9b2e5cfd5a01d707158ae416f5cb5eeea81451dc8b641b6604515b88f6b940ae254bf4587501d847bee9eca54f151400d039bdc9d375b6c7ef8174dd4f793300a3860a787540f82c09f014906c714d8852f393759c3ab55458b8293650cb8886a60301df4cb7c1076f71713c53e4db0d7fe6433b15f40cc269dfbc40186f0e364430e8b7d19fe86ec02b1983dbca702ebc2563c4756921d03ba913e897164e7216cbf90147832134387ffa104519ca76aaaf873630f1a4e39740decd24f85514228708ecd597413a096fa073a2dbdadc9ee0f078667154d10cb172df9158d6e32770896be2b783b289aa40f72f4d24e7b4be53dcfd21625bd15c0a74dc4370cf8683ab3218d8dadaee3d8d59908560ca68f50e860b6acef0d453f8e20de210a89856079b88315788425e1e52fb9bf072e684f6102081e06a02c80eb2df8e37c25502817f104acf2336bb4b64fe51c12e73a22469ebb157006597f90bb6584889a975cc65f03b86be0b80471dff850661f243b126c83db741ff70dddcb197be9717a59d51b9701c136f590973318fd2c8367639cca5342c3d3fc5d68feac316f9e777ecb25e14e4fec34d69c2fd95ed0e1a65ca9ba871418c0a90040f6d087bc430ab034886bc4b7a2355432b93baec160e89a763a7650e48bf4d5e8a11b4184c2bbccf584c809b319b194438baf37f49fcf3d26ce5aea22af60f963a93df3572c28d789c54da3144882c9fe63a8d8e5f06291492ee1f73f7c4f8e33117ace2be40d63e74366194702dd3d96f7650df65e9d2a9ce9ba2a00887cd11e5ca537fee370e2d7481a17ca3a84604fa1dd1a1cb0046a77a579e8d51d261d8f5ab70a6fb93b2c0c25ff295f99e9eb63e2060f1a6665eab0f0fe76742a535cc895046611d5b779887e322d24bd3b076f44cc90dc11602517fd042433100f00f4d64d45040a1d8779523fa7eac6e1e90eac72bcc8d257d05ba2f3f5cfe3ed65256bfaab55caba1547526ad1be6c1b99eaa878d0f374ad5cfcc060f00970d4b2436fd82cc46183c7d830a2dff8c8499393c957b19b7b0f64e4555a39a3526e9811e4c28c8757e1a1dd9187247541a3b63d5b4ed338bd9b0af9952dc2f8f614224f5311a2fa4ee7a10e73451773d2488f80f7a17562968b2208e813e07579ff1c023f317be4d1941b97504e4140d901e55e020f13e3749559b1769af89809f3e972ab74478b0ccebb23c584c8f2a016c2b41861e178025d52cc5eecb111ce0544af86617ba5649f79b575c3d19f42311cb0d14457561ca28a1de43c2ac110c2a7602dc4ff1b679dd641f567ed3b9918ee3a1eb906d23e1915e900b11b23d08b31547ce0ff23ebcb05a59a1bed9ee1c1f797210322b4e16323a0f595ed50ba4582d7475a0fdabe5dc81649835db099ab203f54475ea5b3341ac0d11d0fb513dfb3301eaadd16a1e68ac7db1b67af6c8e5dbed1ff18be9e653cf179fc53183654da6fabe627c41633fb82569db301ec3f6a0871e470659ac2d9127889734086ba6266a638ade10a47ac8edd791e55077e11a10f9820b7802c877d15b2b3131d64da76ffb9dc431988e0444bc5bce97be2e65dc560b40795768b3865da5ff9fe5b768c7d5970a13d1a9c5777686b2f56518279118102abfc39a41320c3e8acc1df3a574fb5aae71d28a2572542ce082981da933c9a975a8573307a41f2c76a0d225f71a84c17e1e228ac3f6a1f93d250fced7132b0c2d379d48574ead99b89d2d00592c456d59462f3391fca88d4395b9c55e76fa8f62050298995fe212dab437fea7751c7d925b6617484cd5eb43bda330c210d2babc9d4032992450daefeadb61ea031537f015f5de08b5ca7e00abddc538789ef837a674826e7a094c373ec8e893143ff46db0a6dc9bb08f59adf1da748562da0d0d230af6977e4196ad2670c1afff201e0e6f43f7788f0ad82621a3c00cf02879f98b4117ea1584ca9db0654caf9354827afab5b24f07b09bdfcc82ba121067139795d2f7cb25d0afcbb93c290f52624450643e6d537c08076c740f8dec75785ef797fe13bb0c3f03d6eb2d85c5794bb2ecb145c29fc67b62d7a3625beeed45d687fba608fb20b51617243d540c1070af775e71459f6f0f96695a9ccc9c8661696a4c6e23d1ac056e2fb439af2144ec828d0a12231821663de6c2d58b4f422b465c0054ad55208087f42d4ee18868a5500a20e025886b2fb921779d3d785ce3d0184a0221e2fbbe50f8779afe6dfc62306709ba4fe165b389c91822a51eb30dfd051d14ee694339bec0d30879d0bde74c3c3aed2e78bb6ef19e0fbe23b310d2f6e28dc1c92f26261c22b9fc61c69252201fc38aa2437e61670317d060d667e07f27916b488621b9c94c666085b4be68998115c248c01521000ed30e03be3bec336763f0c0d4d552a658eab3d470415f4f0c77bb29df80b5c3e99168319b6630db0d01979ac130becc781f3bf4c395b8bea74e2373c89b19b234f55ebe1ad8c5a0ef7f4ebc5c17cd0388ecb3374a0cdb0829c96bc8972d695014fdc1ddef1cf435975c1ef3ac7e93af8ad832fbc7f1dea5006c7bca66a0c9e78e59c17ea3c50587862132cbbaed01d3e86c73aac661e003d2674a8e41c8e7e39eb0c3dcb8899ebd166f74191926e550eec404da0bf5f019f158206b8f79efa08024044d9cc6c697c9c6d4a14287e6352ba93f9d5b991ee8f44fcdbf4a454e76237095c6e01e6a43c7e575c95e13a4b35fe377f79cdd614923c1ebcaa27b5684a236142e0dc4f1de146ebd96406a42003b2239c80fc48271d43b961e885d3d7595e149dc7387bdc758ebdaccdb743022df3e5454595e8eca04c2b6711f20743077c48733380e2e557ddabf21464673551b97e6882258ad4a5d86de9cdce94c5eba1063593d9ce01a379f7803978a16377d4fb40bbf4c084b572526327ced816ed5ca5931132839283cae0665e8cb85cf70bcd8d70784b3f6be4e012ebaf8ed44c7c89ed29828bcba0fd64bd213998c122b77f005265536b6db525c005e94b6b2de038d8aa66c3d299bc3e66295768984fda24aed3096c4a5896e2edc5bb1891ade3705e4f11412e4543c5f4b845805cffdfc980aa2acb799a7f4b1ae23480cd9ad70979cdcc0857ab218aa424d67256a7f5c5c2fee00e54cd85270332b3780d09c97b81db032d9fb418960fbcd7d5d63572c1e8500fd8bf2bd9f1d8b999a0a16b73ca0ae8b461e6c4dbd38d3c7a0279c7665fd7ba17d88ac113f3b79a4dfe73f994b4779235db08ddc59734c8242bce09e59207aaeb40ef9d6f66dc2df505012216b024d39a752e437776069004e0418d9a598a7c703c11b7fa964ad2110f615058a55b1a482b145293a2878d92f82682b09345a8a94d8d657df1915c6a778d46e2320e78beed80b7b478a0bd436822f5f987d2f8600c2494865ca84de67af03c319a19c06a706129137f95c49a5d191a46e507b8b44a5c9f8efb833fa207b0dee8d0be5d11ed1dbbb083450c7f6bd517b34566ffa4793beb0a8cc9d87c8160c4554295719e92c47e06d3c338911f33294aa147621e19a715cd86d4e279bd0f75be5dea179147b414d44a3ddb264ed559f85e73d006419b19a5f32afb8158d13ecc05e605012c7bbd26a9edce02a7b8adf15a5a775d3173caf7596338ad3072ebaa586f93a4a3c68c602d4fee6a770b9733ae4cca5d45ad7d94f331d3e7352049081bcb2e0f5569e7b97efe33ed73503c38595659afb2eea465d74145aa09baacd56b42a9472011761ba669aab829aaf7cd1590813ecbe44008d255c3aa0132cc79989e1ed592010d335ecc5e59bcebcb584a1ba5864e79fd929e09f00d63b11b72b92b80b77823b26b117e250fa6cd1bfc328905d67419ab31e9bc7cc57ea7fb276cacef0f5d03b1a557e68ecd270d63a5cdfe3ef0928f307b8242808207ba6691a9f8b04d8d682d379875f3b827c8954d123392badecccddc5b3b23d647cf431ba7cd4894ac33c12b5356dbd543f53ee5c4fe9512bd018604eec88524519d4a8ee47ad9489a143cf209e988641fad0a9b38c1335aabf4b739b5017fa20285d5ac50bc17bf87382d5e8de61f046672b9b12ba7147e9a9d337ef381ab3079276bdc8c0946c955f5d8ac36cc71327660779258da3eed2abe521fca31bbaeffc7809c3991612dd6cd630e72a330185812453b703145265210a9256b1b711e21381d11b41692319c31a4872f19c4f88f5e6d6e5e7e01c5bbb767ca3f076b737bb894962eb6b923b82aac900548147fcc0c6d7b1e65b1b6ba483845197d875d90e9d66041c3b3cd7de2d28d8a954fc0818c4b20630f6c73b9f9ed7374457609ae6d6e16dc875ab42afabb026c2d79c6657ddec293532da9e815a86051e7fa8b6d0cf954ec963cceb9e03fa39d2e372c3357e02c5dd1b91cae10d2addd609cced16671fa20495b29a77835bd380aa0cee5a85bc2408b4a3a01dd1e48c249405d700bbe1f365f087eef40d3a4f7d5b9bdf5a386f704663ebed4de70c245ea71f34443340d3b8cf8a1726017ab4085a6d307e843d41d5f2e49906d04a8ce7df613258bc0f71c8d0ab5752ebc691a7bca7718e83ffb7bbb5f57ccea0e4d4d4da5e740ad0c1ab06a54a5c0f5dd769a6d8f3a900d3ca83ca4804aa966b44e7eed5a55450fb288067efbb94dbb4788cf2826328bae0b1b25b38d51987281407c08214a21583cfa199cc54223c6ffc5187af70a90451048e756cf96521f6bd45b5e2c98f812d77a40a8aef89d0fa87b97293b8a6407f06d87c5656592bd623293c34f99d8a5b744a36679d112c92eddc4bc0994f7fac718fe2af55b388d711f03f3b06831f3e66922e3f862b733591d7951be19e043a77651049e44bd2b032cb8a3c86a45f2c50a27d8a3fe8bfb60c321d4bf1e143f05190ca1060898701d769e35c1fc889fec425e548a619b095438ebf1915d4529ea8b88ad8b75386e47099448671c92c6f06a102c4023f230e6d095038659df9ec3a8883ee57e6fa68b40dac98a120d3a00e4bd6d3369ed7eda7761f9101da04eff433ff9af4ffbf52fd80dd6f05f220d105eccbd70a107db3fef19ac56400ab333b448ce27bbd77f4b5500bbbf466c0b76993252c373244d016e16b13c8609e720304f9537894a0aa99e0abaf59463912c4047e2176c6d695ec4fa1c93d21c27dd527645d6d2a846f5ddb810358efb72539108c8894843bfef3066da6ab170535745c0b1041162e04ae81af330be21aa0ddfed7d59cffed2b8a1673af89eebaf3b307e9a429ea76bd5d51c59c711443a21377a518c3b304652805a17a407d7f49592ebb63b945b536099aeeb5f21f117a4a7e342aeeeb833ab239fa35f12c00c59e6440c93554e3515ea77d0dff69cd6b48a55acc60cee599c18caa2a73fab6ea405efad31919bd401f6e902836210192fdf4b2ac4a1f4e66e3c1ca17ecc8ab52c4c25ea7f2aaba9a8e3c9d3221b2d0ac68d9fb289f43a6c96fe1f711fb32ceb0305f7ff62025f1549b779f4862e07c12e1557f9d40f56227f7dc1cf3a08eea6537068e4f3458b61ac8bf47db94d996c092415367b4a6b7af06b598e693dd4580225fa83c7e5e9830eeae9f566e12e2dd281081db3f02ae0f5622fbb28e167aefd3bc52630a0102455e603c7113f37d051357a33254bad34856a0c6cd44cad8e5a7569c46a5d59c8587d51c7bda30a7cd9daaf49e1a36bfd675264c883a23306a070cc690db61a5506d2bf742008634a02dc940a4bf931609cb644e3cc59d969643cfa46111a352e4d12fe435df2e8499206645cd9054ead001dd707c0f51a3e52d1bfa38d93000b2f03b2e73435229ae2a87b5403fcc4c256285796763fc9196caa63886bc30638c0127eaa14ea2a5d60352a2e2c7ce5f1e34efd1c3617fe0ef24269f62b8bce8aabb8ba6a7c8cc2079d14500395794b7d9e46973d562a5c1f71859b71aa095dc3a6f80178c8c59b5ed78adaebd7968643707088b968b33b1821327eeefd38ba08a79f373ae93707f3c6226a23e9a9bf9556cc9354a2b0a84b084eb82bceee23057fc159d128759fab3fda75519dc049cebe0b871a21a5c77c22f0974654613ff7a0559a4c2c6732313b253b7223b345a0970979a9e236da1d410efc816c02bb6909c8f893a44afda88e4cab5151926a2408b754f8c1dd340f6ee739694bc70891d5ad47e547aface76a6b29cf1844855dbd254f7c7d0b10ce7feac0d9b6a6b04500dff1ccdca496e998ab9e8497b2b94dcd9a58b8eaa903a52da46760dd46730459d4ab89abb30fbf0e65bb4abbb6f84e9e918cc2e15810825f2e2876520fae1456516c98abc00d2e0f40638dbfa81b3f166648c38b91692b1b4d547190a0b981a4d7577dd94e69d3bf6e3fc79f23fd6a58a1d8a5c8674c383692d17ddf8ddf5b7eba1c8fd5d159032c3025c4d82a3469fdda9ab52464f9bdadc0a2ba8e6f4a0ec372b1c889b35e7ab099593b35436c6b65be13319357e1a2541bbc27d27853689171cb0ee89b786b4ca371059c52fc51de09ec0a9677d0a4e52ca4f1688827397d9ab359c7bc41f05fdd530a185682496b1080caa316143a96832180a0d1cee822c0268374b9ce14fc2a7b697edc8354dedf51fb8f6fa24ff31ac76b94bf71fdb763b05468ceab1ed7a73a95cf7400fd2d96e82c2787f0e25d70e02fc2c4924c212995aaf060f0cf2bfae0b3e0e4b31d8b2180ddbe9305d4c0c4847596f08a753fdd5e30398d5a9c1d4d84dbecb732220553caee4f950745dd5be3d032cc871b834ab7bf9ae194ae394fa99140a5a754a2d20c0d7b6a36ed7baf1f0a77c4ed4470bfc588c9e7bd9b6969dc8d36ec1f7e763f79057077dc995240d88ed8c45f91b129a8f764eaac4ae05205e296377832f1ca750c6712036cad6a8263157f53d801956aec48c2460277fa65f054052b14a05ddbbc690fddf3a489b5a3445adcfad14a91d8724f26a594c5ed84f38ec3be7740c1fa7a884f9b4f62505b4715bac7538197b5c02c3307c1b8c9fac9c0476d85decb2e605b15782e6cf6f0f08aa7f5291e3942a2634106575a9be2619055a95c8e84a7ff2ece17e863f5ab3fc5dd6cf5bc2e29e713fe6b18bda72ee02fbea902511dfbb8896198c8f83a04f51e5d3247cd227ee8f34e3a15cf0126aa1ab677ccc0ce4252390f770649d765ec4ee3af9ea9243eeccfe5bc68b24a56e2fa337da06c2fd6fc8b050915eb2427bf2561d67c78ced91f331201c5e3d8fd3ec668cb596cb9c3415a0224edf24a554044f2a4b09b6192f9efd2134104228a0e5276164e91e2ba281452445e542d6a42bb141b32013f58715c87866ba4dce603e416cf04dc7f0921127d66cdc4762a6bc1b89ab9a339f78da246b21f0197a0677e110c8bf8cfae19034fed838ef46e769b08a9cbc3f257064f1382d81e94843fb426bd79d84126f62bf44f0514dc232a8991d6a0b310a965d85bb4e61c93aa7ecf49cf695a7a9f0f4bbb637ff87a318594c76af4b4a76f3839bb3fab481a3071d5701f4f1a711937684034dad3312993233dcd01610e42bfbcbd763002a2aa3bed1fa33cb8d5376ce3f982d5692d8df4a9e271f7cfbec2e29314856c38cc1548897b33e23b51880b43627fae33727172fe103ae307666e986391aa82c22e5ce297a4a828744c222f5ab513b6488cc1e698b3ef969cb416543c25e91ea728e991b196ee675e7328e58d7ad7986cc62fd6101ce64e2f2cc5968997f0e7a11b8fd08376a3add3d9694b3df95f5247ee692a8cefa5ed02919a7efc8cd2e11843b179c483605f97047f9233f272b52f7774141df8642c9b58f9ce9862b9df609208065ef4cd8ba296a229ea587ad829d0e9548e467223f5afc094c3ac9ac527146d511fd4626a3e8cc153c0b65c61c83234fa2143ca9eaeccb2af601c0ea06f5aaa5110dd3200f154f792a70a97118b1a3f289cbe05084af962b325b1280bcfdf08a837d7044ba544df7a1a482710e019bba7541a15de378b5524a5e52c4b117a4b11e77213eeada3d4432ced2af16402f4abef62ab1cdbf647cc24cb1a909ea4a060b9a75c44181609472fe721e6352d8f08dc39c9ec56d2b7400143fb99f97932ad4b345c7a1283b14e2a34eb8f874d17b9f45024c8dc3537c97af4b107c624039d87aa3590ad9d0a6a7257063e692f8d2b723ed6c8cdd4e2594806d95fb83e7fbd2bf705954d5b2c959ff9e2b048a6b2be687dfe7a43ee052e4b9b58953f53c567914c65df0b8795bfcb636c76d6bed2e6ff165fd0c98bb4ffff7e9b0c052c63db59288359c5bb7059a470497dfeffae0c0a28d3b6b34c0ed38b7361594873f1fafefb4dd914d4a76d456fc47470e5bd40f6a25cab701002c82ac54bfae79f776558d09f6c14bd47ee852e4b1b589537b3c5b1980cb27d69fdfc799b9c5b88aff27f7d84de161e4a8503f4489865faf7bf373d70e01c17c9543797fefae75d7a28ecc63658a20753e75d200bdd5cbcbfffbca93705b5655bacea81c9b961a0322e34761bb2223b93e15d5016695f9affbfef92bdc098dbca52f94c0d7751594a4d17bdf5ffe71dc3a2a00f1e3fb2589e987a4c217f1769bd8ce7a1e0e683401e6e312f6369eee59e8a8ce7f1c759146bb65761d8ce74bc2306ad0e81ed430233bdfe36c126f092174963e8c91a03a141c42b472f03fd0a33db87a856b81fe2703a2da67253e150c6058d646a7fbff916c332be662d5e1c33f14eb811e72a72929009b7bdb8539422ae0c31b01969818628efccd5c2ec7d173c2853561a2b8a2ffdaad882fd0e577de86e6e869e803c26cc42dc9bd1a11a2dad4edafcb440d6db4163b4b09d61181d47c1bf9c8540cad30300b3d829a5dba43c1d553230c5cf4c44b8207107431b8b1df8baa871b358d3e13c4d61dfe372b29f325b194860e8e2592626abaf450990833ed60a627603bbafdbe9484216a1fa40d8d2740a2a397f52e7dd2c6ff9c22c8b73bfacf52b337ab9dca8074ebdf3c48cc3ba1105b9c42503a40f66b6fe724217409b1dfee2430863c864d9e97ef10b8f4f030b82d4cadf23a4ffe3cd4602134c60e6a3f907a83d3f6aeda5ac6e5741f0289c319b01c6263050b277d0f600eddc36226e94aa2e6860cc650925150ec59b53294899ed64741422aafe5b0e47c8118f13e7b2a77e732809dc17aec952179c00e862f8c036f85190b81fc8dd39065cf98aa667102ec571d0c225c778d45c90c87b627c2dc735d0cc0e2dbc6d6e6ef43d13b7515c2844898113ec8a0743028a8c2b40e166e6e0f04f0804507c75a00426287226c768ccf27830e6096732d9972e832813e67f5dc0d3be02aff1a12f17c4c6acc10b3a02f76575acf458ec98f313228a61a6d813ea48d7e8c2b03b3853b14250d49a8fa1a260fcfa518bc30bce508b45d71b52492633318a3b01993289eb0f4397f7ce08bdab4b00d4b0a1d23b240495c1f6a107d265ef44e7b8aee67571485ea230fe5888c75fdd91c34164e7bd896f6c7fbe6479251341f844149172b5f20ca6af0e77660947335530d05aa80fd7baec12f8468603269488bd70c5962c0e031714d61a68801216a3021b2d317341c083596594e2d05de0b4a72f26a9f0b18d03fa3692c0c2e00b2580bc646136bedc6ba07f7178e5ea6cb8491d1df3ea4af20a3acfe8cdc0e002dc39f5d7cf7f3d1834bf192b8bf87eb64eea2ccd247e34e08f32acdb30c5f0c9c3e142c09d7b728afc31d2231b3ec1031a607ce7283be54aec768816df45341cade5c78a324e23afdca9c705e558995a505ebb00ada0374a0aa41c78cd58ab05037798125ddafd13d151914a159832ffd54c82a1f29137af38bbe892243604a72212a4df02d44200d96c1bda6d288d45023212107c38556b5a0fc34dd37f3e33877b900c2eff3debdc159e98b881e856c32a985a9289d82fcb40c90ca3214d1a44166f9d3a209676ca8f8ffc74d050b179b20c437d27b03ed804fc4bc74d800c99ee189d2fd614603b5d35e7ec3293c08a935faa96c70462904bb39d590a3f8e7a37a721904430fd621288782114c8ae30a824a379a735cbbcdc1c8a860a1593e6c384dac1a7c5abc5dc541273ebfb0649a34508af12e9ae30624416560a6631feb0bfb51809b7d31482e2c9d1a730173aef164852586eda4b528e3314476406725a248e6045015907c2d21135d8f0d6d7dd9998d6510adf4653d4165a7f02457f569f0623f7c171daa1a9c0856f1030bae69714a153e03a680221114d6ba50c9edf5bd57c7f62073ad2a508c35b51100d61eb23f44c53122d6cc64eb3ae0cdddc6a292aa6c280db4b688bd418a8c16daa6cd340fbe94483d4422c9368b54fb140779e374bd64a2f4c0c088074b3408da4e38a9e14c41cf7b56014f71e741f1aa610cc188202b03667f2d3ebfd61838fa78eb206e2ccf002a10d54a028d86e1a9ad86d18e160307fb903eb026560fa524b0a8a09f457e21790e9402405aed90c790e19ace49da0adf4df020de22e7afde87835c5a7b771ac1b7113aa7a6d6886a2a1d3c4715af90e16955aa3236f201526ce21230f3100d5e27483ce0ce0dc6b0a4d7e2488d0b000ba61b7c3839eb0bf83ea678a6928804e7da93059503ddd91f1e46026a385264cf717a7c0cd2e61b37ea6f374eb3fd189e3262e91ff02ac673adfb8e4957d32c47de740e075f4365c50545929d38f2f19c4cbb1c3d049aeda9e5b494f09bf5f9dbd5f22bce66276d9191265d2d00013eb435c92f35306c089875e61290d965538df08a43c32b1218e2e5a244f6431adc163b8a2b475a51382cb600bf78294d44fc655c62b8a8a977e5f191afa1257e471c4125c00de8e401cee7ba2170f7ad134908eb7fdfa7a92656a0d4493e43c35f0e6914d42d0e30951f8b5b6d073c64119ef553485188daf4227aca8739c4506e85f38978e32aff740247e72208ca3f4ed4de7334d5bb29634d03bea3ab9aac44676594c41aa0104e1bf3fc0761b61be6cf27deab505522ff8507e39324a0846e1f0c04143b8750ca520e95bd5329157211d3ed15199594dbc55758a9ca9a9e858273d6e13ff62a944e8173377a87f4c78796d61dc09abba47ae8d84323ecd94cff6650bd3e4a472be133067ab785d72262bf9aaca18eeaa82820372d5f8d3be0deba37d20109d4dfc3f69e28a45449c16d9a55ef371fb07227eac8051d22a83ac5cf347af19102b218fe1211f15088612db1d7ab93c27597adbc553119d8d20a5014122d109173b1995691a2398c905427229694edb16a5b495b7204cb8027ef34c2d51b39193eacb105bdcc28a6f108b71c5fbe04bfad02abe2700ade8bba4add370b239a05edfb4578f155589327d6d46b505c6d5205624877df1eb06bff0a57ba8226a95099000bcdb2162d179433a3018917f706b525a339fda60f54a32f5054e7db52ff1817dd7c92594fdd276177f91410b221e0395f2bc1f8629462c00c2095d14ab8242997c96d5249212171d98ebd2b3d044561288c7f54c9ad9e45907d4b59e8296df318792f727a71fa6282218adeac14ce2e6c6618a56abba30dbfee3a6c80d7a5ecd2e1346731513c3dbc3ca44a612538b38413f7168cfc192cc65680637f81d599e3a5fdf24688d29032f6c7fb4f7344ccd4035fc0535775a5d370b35b5949a1e22d0a9ec675e9015234201101aff08f45e62d7fbae24bd06eb642b14840417391f25a7aeae4490527b260f55b4b0fb8bd6288741ba1a5dfe0834fa10c0e734a8b4409929987745961d85706c0fcd540a212b7e136a0354ac4d30ba5d94d466559bfca90bd625b5e36daee76f60446e06fed0d0c2d449e04ff6bfa962ea6bf0030b3e94afe27d150a5c6a03d96ef3e188ac803465201a263658599c97e423caecbb980439f6359027292a64414571d8c18fef3e62fc2e9455c86631450fc8371e1ea300fb54ca8f82fb5b791ba425560875655fe26d1b46692caecb37993abc6d58801d30b0e0cc88427d82bbf327674db57cff4cfd5394223eb3c1a9d884b2f699a500003812f334f53bc893a69d59f46a283e5afb86d14413cc0e7e06e5377c47c8c881493255b3e0215a0afc1a10523911560834f43b298bded7550ada710fad3d553d0ec09e6cbbb38ea12620349a8babde71ead7bbb448098359c5a47272e5378a71a03e37c06df4a2761b4c9ab0e2d62a2bdb6d42e5238e829d1fb961991da9e87031b464010d20677f0ff194787031f4583119f3d931e4633ca01620ef49bbce6313799d28d020dfe853e459f6a3848fd59d22c3e2a37a809913a7380a774d47152e40171ee4c8695b98e210d15995824b012e67457c6f9e07529e34f5de554877d2f4dcd86ef14e2b67621cc5b610f01653a91ca736ded44a19f99b27403834de60be46be7318203078344ea032b48e227db8476fa2d5e795297985750c05381c28c112e7a9ad81c7b968c2e71280b9935aced3ff8f9b26cae62cd8663a09b601606a69f8dd58184e1938e80ac7330fd3e5d80834b2251350112728f69c137b61ede395a0c80ab408f664a0ab40af51183b6425c2a8fc834f987513817e089fed1bd2c7006ce1ccb11924c79660f73fb6c1fa4a1e5f094b0ee3b0c3aec4779d8cdb7267b3483e66bac980936d7f93e68cec3bd4d917f4ced9cf134b11e6740028214d0b3cafca96eb56a55c94d58222add6b4ab93923745dbcdaf9817da815b942469dfd167c26c56fa8a25dd2e41fbccd1473283bd5b65a296a7965238aa83ef3143f70f5da604b92c821ff70f6d4c4bf9fc518428ca3496f8986a22c25c65acb2e2f4d1e420a11d0ecec67e0f654f9b38a09915d006f0c2b8c4ed8cf009fdd8e82604ee8526030853ca3386ce3964c885bb7bdc8e94f7aa5e0a46bc7321d6f6c738162253c8fe649135efbf51b5f1738e8000f9d02f50b9e1c4feb6754368a9daa9870946c4e3cbd1c2389d84d19a15d469961017176b3bf9389ea18b141f67f2fa1ec8c63c8b7f5415cde30443e1eaee92f6473e8021948f5a6f2b861f15f2f46fe79a427fd3b71fd576f2f2dcca1367503e1b1a8588eaaf6785fc06c0f14351f6d67212159e6b8fa3696e0cc435c0f90b25f10b74b7087e8a1efa7f92250c688d1784a2103464096770931487be767b8b996b7cca4491da6339dc5ca3acdbbd8270942ad2185f78fae4cb6091411d0bd47f2c236ea970d3466a043de1c0caaa1b94752af6ffe59358f135467d0e15c83a4c0bd7e573839b03d5e99429279e8e8e95a153e2e02bbb95b5a2ab2e557b33447a2b1fc633d37d5a0108fa2007608a293ca04c9284414adc730a2b313741fe44095ad30c0c5d6265de0a81dd56126a62b3dd732fa13008bd71265810d6f147df230c6946b663e06ac2f77b9d7c99f0cba72084cb5716b510f205482d45c17d9938df1a100a55f96eca4f500af0683f9483790b331d98d3a296ac257020f6c805724d24ffaa268355129fc1a71168ea1458317cb3c494d503121d9166407f5d087820088c90a44622c8a0df429d15eab8376547d0a2f41653bf8090af7b2da5b70e7713fb16f4b48128a58ddb504fc3ef2fb1011f64347abe88cad0107c7c5cef4e3089e7ee544aab165e2bc611d3f359843476be5173be39288863eabac59efad0171b1f0dd283c2e65cb70ac27df3133d96c094a08b88c3a39932c00cdbb5a590ee8a411e35168645b0f9e7627f6fa23aed8bd5be3097e38c11e13280a80b7a7c18cf10ebf83e514cefd08ffaa2663f0b98f3a57a18f41c7ad4020dc6f5e69757063e1072e80f4a0cff9fdf284d1f3e44d1507c74d1531df0c594af5674e6081ef7414eea7f6741a343afe66b0b253d0ebdd176093d2a2410aef969949b7f7dd0af8643d9f8222b049bb3456ce36608f169e33be1beaae5312615c0e335f779d1bce7ffc2d6514d65f32c407fb0f38a6ece071d078293c35e17f819e5e718e1b0db33f3b3afa19f34ba1ae355b7456c584e04c0ff10873c6a3ac45e9f490706902302946f204f07014789c13f0973c986714bd113bc4a1741bfd5360e112652a820ce8cec8b5e0541ed005be3b52f510427f80ef383a80b6526a5c12358d869a2202313130650dcd317324615da6040d5c88f82637578a5a5b464ef1b042fcccafae4f2c870228ed6d2c9b7c5dc338d33de31078627c9a1234ecb0256e98d09fa4b7667098b5b1203f082d42f8a798fa115f65e0ef511dee73fbcccbf470d3aab50173389a2caf56e5487c00c6ec74600067200920792639389f2ffc544f1d7613626ad08e377b8826158ed155e45aaba2c3d473a2f6f1b8ded1ea59d26849311a0ccd65ac6e6e0c8923d3f99b8da19c6cece181b21e6b629994a6dd2f32b06898da4eb55ac546fc54dd4feaf62a3859293d6f4ff8c21b1782c4d2c6a74c50fdb8e4ba9fe5b4424996dec328c687cfd631b0ecba7c27ce7254e0413f940c484f4c7c401f349a618177230ba248bf4b3360c786052e224a20e02021f4678f30f1993f13346cb27573e5aa91be95083d0c5d3bd50bc5148772186a9750782f4d3cf0911e739baf5ee538083885c223f3454f05675737ebeb020df96f5133106f7540c37bc85409aea1e040561bc6a0861ac536ca7c0234f09793ce72d16b703544d941e4c3d03ea98be8b5510302c391df01b829d4d5d026102aaa24d3545b3ec80f49dd90592a5fb30565470797b78386599a193a87c0e74e8076de98f161ce0f73026af9cbdc0c8c95c0753c4c4646008be01ff7193ddbdc9967b4b296592019b086308a708e19cd37f4eaa69b55c901b2351187d8c2975204ec0392202cfee00b142ddbff45a6b1b4cebeac5df1f821a829944ab905a73abd607ed9056d35a472ee153f1045a86afca3e7b213b11f3922239215d6b0d5ddf0d2ac9911c082d824c15691ca9caee634c223dd14ee8aba4d9f565d2bd5e8f54732daf0ba9c2a893d80a399f084813e4ac507688d0845ae22322c8fb3e4b12be83b9db0ccf5a61f6d26775469fa0ac50db14fa44bbd031774a93955a0f1ca0bfffc630a66592eadf6a95e0e5bd38a2666e8ed7d17e5de7bbcf3ba256b4bfbfcffc3d8a871fb5b2eb40fbd3a79944bb509997a13023fcfd291233c9a3983cfcfdba569a0652e57ac17fe65290e03b59dd751e655dd4855d7eeb000c92dec625a4c4d4f73979455fb4c8941212b4ba9973ba94181f51a4fff6a63933cad67babfd6aebb5362a8a1975877e3c84af1d56095479f80b59e46a14797e7e8a24b8eef9905a0fabf0d0635189e8b148826b20baa2582610a00934849e33295cb1c8e7f9f94cf468fcf94d7a7efafcfcf9f92ec66df468e8e7fb187a447434a3516e54e6388f6afd76dc121388ebbc89d9839eef57a8cc6b5bbae8f95e65027131629c509993d9fc15a61519920aa3ffa68815312a5b8383b67e780f5a716e8e8ece394443385d8d966b933f5ac8850b726daa815c3e2746c66d55e673268cfe9c39de1c277eb2d7f1c9beab89a1d159edf688a313b732e53c240b4913d1b5e94caaae3e8c74040929ace33bfaa25314e664501a9d953179b8cbe7642e455f8b3e4686f42fcabea330ea739e207d8e1c1f5b0c5192cea7776b8c4fea72108415ba2a689840230541c8408687272f6178204c0fac2da44a05b90b25054e05e342e9f0dd60ad131a7031441939b513fc60c437874e1753c00431732a636608951450628c54778cb00943d5fa179b2bd844a159558a8278c677f05d7f36dd6eca82dffea6e8b7e76efc763966d89871a3e79099e9b6a0e93731de6389f92e662611d1a80df4073d9fd266d20f933bed9ea084e66fafb53c8a57f1283ce809f448ee4499d233fa307132f49c53869ecf6426adfe8339820f4820959b1377c4a9b022497c1cb307fd3da5c031cbccd7ce0124c97bd0df38f4fc3c8188b307fd7d41788dde359f9c320fbbeed0a17cb51c9bce0c9ba9a8ddcd0d9aa16cb51b3443b96a47a369519ef47523bb4d67868df69f8a7237da876ee4a2bff116585054e492a3ddf550767de38d1451be3657dd041335c6687f1bd99dca8859620d94197f6a82c8460e0afaa2aff1e14a54aa11141474ab915d1365d74536319387e7a987b26ba7f953ff4d7fa04d1e7e81b2addaa508659e3ce9ab953d8a57d1fe504f53ce03502bf33ccf07bd90100fcf15edae81b2eba0ec4d9387eb55beb6ea4947d3b10e923b4cc8f0293a8f922b43fbca278f63a812957ac671ecc9ae57d9354f6622e66bab9e5ab08e509c152299c1271a9fc5025d8bd9f548a4e66b8354addaf1fa918443fbd332b11c499a5e5054525def5e5d8d260fffab3da775e5e1cfe52e4ddf127da292271a7962b3d721b7dfd1fe375c4708c210df7bbd39a7b59fe7bdf4e779d7da7aaf67ef755d4b9fc4784efa7a0b6aa5d6291dbd36a9d39ae8a5943a21b157ef5f302fa9b049a9b5ae6bc337a15de2648e44e6c4397aa348b1d6b7e8bc644098788f2cf375fff57a75c08d6789f30e85063b168a92f9ba4fa4ca964cd8772985a26f1aba3e7625993ceeec42df21c8bc3461f759794e58ce69cc4226ec5a285d3facf32644d727ef92aead56927715e60e3441ae5584e7055e1c3141d244aab061072b50e46c3884d9314185d30cb6344410450f47785518a9ec4c61cd607d5268a1539f89568d169923bc5c29b6cc3011233921b9d6b798d0bb855bc17121d2677a91f6f7568d203fe8cb91acb03142ef793b838d16bdc92f0a1b2b9aac3a48a164ab0ef943b291628dea902ba0915466c91d3f642563526348954053b2e546ea0abd5fb82f0d5516244b4f3552b732248f9e6aa49250d1400ae9a946aa360212484f3552330c818234c6b06d7106b4610b28c02eb610a3c242f6e8a9660b225422d8820a972da40ca1c59d3130498403428806a7211c941f8270ad2b465003529a45095dd186cacf54d00d3e2264d9015d3185959e19a07eaeb0e9c013e5c9a703a494a99e2b76e0814543140f8e9de0ca8849bc22a3e448346cb08837e05851ab1976239a26aa845068228e0d51536112af481b9a5668681c006f211a543026f18ab4e1061519060fdf0e3cb30515ef86cf50a1c35592a1e9c3313235585a94e7011b2a94dced920395e264d59cd90108afc10c1a3f28d19ec815c6408691cd963066b67809ad90437aaad96245750519b4823b061996209481f4c8c0222083b608eb902b2baa0001192d604235a48f9e6ab408b14aa3c58791a6450724b4d4f0051176be108102700622765c7cf8124ea3eade6aae7e42116b21cd24ebb8e291f495d20e1c31165bf77e5ea8fa1cf6884a9ea752b9eebde0db8abfe2ef5be15f91618f157dea7857e24a2445a5cbba2b718a6f3517d1f5420ce5caf563165e71ad1612126529edc86dad78bd4f65145a1eafd3dae9933a10b53104aabe1e9ed0eb5959d22b8fa814fa882e669c47900c436bad0555e0873e6405c22b952a0cc3107be0f7b5a702017d9febeb444e313d72fa3ca292e5f151c1af74486bd112aeb0f91be8ac77d112459a3ce6673da1d0e15783c4a0ab3c54a9ea5bcda5ba5e88a1a42e1a45e8ee8e57b5865555abadb532317a30a6c338a6b3d6daff3caf5677777c6b45b2b556d56a8a73cedce47ee89ee7595b55b4d65a6bad551c8b8e88e5f75673f97ab2705aed1d3d9189be764c4c4cf465bd6fc56489eebb914a926050b544840596f3a9cd6d48311f42d86c365588c3959d4c3fa758e494b23e8420fd774b63d235846aa62ba4d72a553d93dddddd4e14956e258f98564d9cd0177da62148921c599645abec6395a1afbe4ccb59774cde1454863832ed987cb2d8f6ada59456a7f6ae486cbd0f03e9e9029daa564dae76570b5637b93a0c43a355a5912e8af8134930872380a3e98f9104fd1dfc756774a040b7281a3365d0dc6c36f3c16228ce64bd77fc202a9a66e61a2cf49e6fb4986b681abaa26ec5af68fabe65486fef92b383c92ec868fa2d2f66d0f4df8b339afe0b084d3f86e4c4175968aae68b9da6bfa4464e1260cc34550386169a86d145d37722c66c9686d6c485a66abcbc512306189aeac4680ab55a512f69484981ee092d3917ca50a28b9c30bedc8c28296e299c498142a529a594c6c8208dcc5c14bae228e4b6b9260eec2a477a80f574a74787b2028a0a312210234514e387841e916212cfef790b41cf9ffb033d81e0bcc7b88324853f690b060c3e38cbd7fdfa3fbda223e0db07dfbef7403f6948334bc5126209b9480a1b7dccad0a1b5f951d28ffe48abb9948858d379c43b146150b6a8ab9e779b2f89e795ea57a9f798382522fe744d273d43eb9e757397c9ebc7a56e6894d1ee3af7ee8f1c5cc6307d1e3d3bc37e8c0033d3e4fde1fe8f143323bced750d8f8740da5d4e803e4765c4b8f4f6f6e469b197fc8620498fb565ce31feb8f2fc594cda969999924fe38d22cf448cfe8f1dde6fda81af74a8f4fca66397ace758e7329ba138908a7117ef1db3709d69ff778da37d69fdee8cb5d73cce4f1bd100aa40a92cea8bbbbfbc7f4bd93ef937cbf845a3446cbc27cf255aa30742a4367b222ff5962277a34be12123d9a73a797b46ee81d041495b8d06f42658ea3b0f1e71da79c93942e33da82e8ddfd1370d1116fc7f4a4474b5a30d8a213beaf5f5d30141db195ce70e19a30fc39f10c71f448057ef8a1a8148a283c292975857835240c29040bb91de75bc627a76c82a104144480b1b363c4ac647d6bca5090f3860c0d0929368c29593f27ebf1647d1595582f8ab0f1dd35055d61768dc452bdcd37cf9fec6578ff09f99feb052fa4ebc8f7dfbfd0f3f89fd87bedfde9c945e47f3f4b9f5c44ba5c307ceff3f87b9f87017f4fcfe33fc167fc57858dacf15579cf9c1e3f1cc707f39e385b059deaf8e3bb6dfc1aa3d1f8e38faf6fb9ab6554c38a1edf5d1b8f6f0402d28d16a8bac34d55333369f523f823f9e3cf8f413f7ed55599d08f4fa998180b36d3fbf1e9138502fa51f5e3d332f4a888f5538f7afc9efec8e3da64e8da3f8ef6c7fbe30b654c3b083f28674c5faa07caf5cc04e236ef31fef8013dfeae57e871cf9d0e7ba8f6c9b3fc2a1bc1711c2d7d8dff93a9aec2c6273395435fe38399e6e86bfc2f178138e3fff913be0772c1e0f3dfff7c0f43cfe39fa5db1c0885337b8c3fc6d1e36f3a8eef93e92e8f4fe99bc9637c20559045abdf568f3ff5f45c5e4c98de3bc624393e09fef823c8faf14356768de91457a46ba6c7d7b4697c5a1b9fcec6a7b4f1a7d1e852c1ce2c0532239c463bc469fc33fac260148dff7720bd9f9eebef8b7f82fdf1bd3ca4b954b0566118ac3279e0a62325c81d96d1f8b70a179ad995a1471b9c45d1a38d6f2a1c26c15d95912eec5461f859188f24e984efcc24efb10aa62cf43261f8311860ccd9d849e337e02e859f9e4b8523af0b6cd2f843fcad9e7eb8cadbea95063598b4fad54a95b758a4ea90d25fbd90ea59f553f45c2c540d8220f8f4c15781be4a0e7de1d94c171501df7bcfb5a90b74a974f485ff890ebb905090defbab701affa7abb21f5a89ffcb5519084bfc104589ff93aab29f2f25fe0f5765208411a54cd4adcac0236e28f17fb62a7b95f83fa82af359024c89ff7bfa9caa2c9c218912ff57fb9aaa2c864389ffa355d9dc95f8bf59951175918b52e2f7a6aa4c4789dfdb55d965934410257e4f5765f34c89dfcb5519101a26a0414a4ed4adca6e90e00c1b549581613c3955990d23a828f17b35afa9ca88d294f83d9a37abb2d81d27a6aa6ceeaa0cd329f15f5d95e112ffcd5559cb036fa47055464e89ba55190b8912fb98a0c47fa1aa0cc89930b712ff7daa3220244afcd7a9ca6a193980c04d89ffd66e5395e12d4afc9756652f1294f8efacca6896345c6628f1dba92afb3953e2b7bb2af32a7020b053e2b7ba2a03ca52e2b7b92a7332a2a85051e2b75255e62355e2b7b82a9b67d028c289a85b95dd196c505506c21959b23c3955d9774689a911257edb5465631a20ea94f82dcdceaa6caa99da55d918751381ce96f8ab5495d12c25fe8aab3210ead48828716b87127fbd5599371561c61325f6f2cb93d55262da81128700258a1194f82b0da329f157e23752baeba6c43e667055f6c197204210e5ba31564afcd45665aa124f1550d1a5c4b01d4afcd4a9caec9c33b92d257e5aab3594f829adca7894f87daa0d19257e4c569908a7ca98f2e74e39f670e74b09342bf1c7aa8ca80738257ea42af364a10f3994f889e050a7c42556419a12ff12a62a0bd2428b12bf9309060e5e683fe86a4e55f6534598a79fda16dbcf1565a2a654113594782c318f131725f64a8caf94f8bf5d95fd0cd7e811065c349ecd66b459b9bfa98d671acf66331966e5c6b41994d9acdcb829c4f14ca93534d5a5301d88bbed69bab6097d5526211dc8ca54bf899317a88b0bfede7e2e979a4ae891cf2f76f56d669a3c743e47ce54811c3dabb53e53adefa4eea88853dc70e08c3666441ddcece07920bd61954eca97abb0d9450d6bb2505333630316b332342ca29ac88186449a5b9b0e48c141514cb6f06867d5e64a1d9cc5152f5858aea491e24a146dae30b1c58ddb23fbf5439aafcbadad43d46bf544a57ae9ad6650ea95d6ea391d624e77ca43dd6752e5803ba554695eebda17bbe657eb73ce09f20c79b5773efeaecbba9d53d585b51893ad2b2acd17529d525a35fd59e9f43ce9abde7be6de5a9568636bb5ada1e9b5d67a6fad6dec3d41a8855c616a6bb5f4be9d4f6e770abcb3485d62357054ae00220b203cd085155da4d44c704bc3c59834681082ac53a992303722a0a0c0860ed854b73557b001f3a6ce0daa15e060068c8de16de818794b8495921a9078b5a3923b805a58034d2feb5b249e1493ad0f55e007e2eff36ebdb6de1aa313bf1295bcd72735d33d1f8a4a3d768befd3dfe39d1bfd3d694618fd7deb8c28fadbdda0bfa722658a99e6795054e2b1f75e7befbd6538a15f2329d2d9428bef894a225eadfe8a4a2b727ed63e26ada593031954d85748ca660d4d0617ad22d2aaa7a2920a43f918ed8fc7d0a3eb7d1854852b7164913c3d3e3f404142ad21a2a21a366e58f0d97581110e0c72bc603a32d8c143831eb10d7c70f0a383231992074940827c004208427429c2084a43482052040001302280011060a904130a70c40027a080e4000848400a0a5800039234008a031ea004021190c092096c1598ac40810a30b1d082059a5c00031970e2820636f0020c313cf1197e82927d969fc49061c82fe40d640db8909de40c640ce40be426d902b9057f163253ae40a640defea4fd57c84cb20a396f8fd2fe135892259023902190b7efb4bf92fc80fc0ec89bd2b47f03fc936406e405e44da1b4bf02f2a636ed9f424e40de344afb23206f8ad3fe07f0479237cd697f144ec89beeb4bf01f2a653daff482e80bf09b984bc6b4dfb2f6502e45d9fb4ff00b200f2ae36ed6f24ef7ad3fe01c8bb46697f00e422795729ed4f24ef9ad3fe24e45d75da7f4856cabb4e69ff11f2b633ed2f42de96a6fdcbbc6d93f6d779db9af6179243c8db3e697f10f2b650daff83bcad4dfb07c9dbdeb43f90bc6d94f64fcadbe2b4bf07795b29ed8f94b7cd697f99ff51de76a7fd3bc8dbeaf48fbcef4cfb7390f7a5697f1f79df26edbf41deb7a6fd63795f27eddf23effba4fd35c8fb42697f1e795f9bf6df9133c8fb46697f1d795f9cf687e57da5b4ff2bef9bd3fe39f2be3aed8f41de77a7fd71e47da7b4bf51dede4cfb5f90b747d3feaebcbd26ed9ff3f66adafff3f69cb4bf05797b4fdb83da9e4dfbd7c8dbbb69ff227fa2bc3d9cf61fcadb93da5e6e7bbaededb637b5bfd9fe68fb6bda5fed73d2feacbcbfa7fd41edcfb6bfdbfea23e9cfea4f697db9f4e7fbbfd4de92d4e576a569aa660a82a86565d18caa63786d2fe530c8e62a347f608cf1e436131aebd43ef27bf7df61b86df31fcdec0ef177ebbf05b03bf33f0dbc9ef0bfcc6c06f0bfc6ef29b85df2dfcaec06fa6df2bfca6c06f157e33f93d81dffbb7047e2ff90d81df11f8fd80df4a7e37e0b7037e33e07792df0af8bd80df09f89dc2ef03fc46c06f147e23f96d80df27fc2ec0ef23bf4bf86dc26f02fc5efa2d80df03f81d80df467e17f90d80df24fc26f25be9f790df22fc1ee1b7fe5dfe0ee1b790df1ffc06e13790df417e7bf03be9b7ec37d2ef0e7e1ffde6e0f78fdf1bfcf6f1bbc7efd86f1ebf35f89dc1ef1dbf61bf75fccef1fbf51bc76f0c7e5ff0dbe877feedfa6dc1efff6de3f78ddf45bf6bfc1efa4df45be877eb37d0efa0df3ebf7f7ef3fceef9cdfa4dfe167f8fbfc3dfabdfe06fd5efef37f69e3c79325561339fed7c965d3f810106183e5d0c31c4f0e562c8ae61d8c00636f049bdf0c20b1fee85ec7a032eb8e0c217a5010d68e0bb6920bb76210319c8c06773e2c4c907e524bbcec0052e7081ef090318c0c0e78481ecfa0216b08005be5a93264dbea626d9b505586081858fd6420b2d7cb316b26b162a50810a78534c4c4cde8e29bbaec00a2bace0e92840010a78390a64d72ba8a0820a9e1413264c3c1c93ec5a85094c60025ed4dedbbbedec7a02129080043cdb92254b3ca825d9b50420000108784f118840043ca70864d71078c0031ee0d5942851e23529c9ae1fd0800634c0a339c0010ef0660ec8ae1bc0000630e04e254992e4ee9264d70c5080021470750b58c0026e6e01d9b502129080045ca9145248e1e252c8ae137080031ce04621000108b8370464d70740010514ae0d091224170a49768d82010c6080fb74c209275ca713b26b0314a00005b8b523478edca623d975014a28a1844b33c10413eecc84ecba0402108000766a6969c9ee96b26b0208400002b0ba010c6000363780ec5a0001084000ac941123462cce48761d8022458ad82800000000f60680ecba08092490606d448810b15044b26b12949494ecd3902143acd390ec5a49041144b0b5114618c1368d905d8ba0b5b6b4b22cedacccae7508218450a7840811527742b2eb103ef8e083aa030104106a0e84ecfa0320408054a9204182545c90ec1a88071e7850a3929292ea2d29bbf6402693551b1212528542caae651d74d0417d3a3a3aaa4e47d975071c70c041adfdf8f1a336fdc8ae39d860830d2acd870f1f75e623bbdea0478f1e742a168bd15d2cbbeec183070faad340030d7215e69a4706196420b563c70edc8eec3a03180c16a543878e9b8eec1a9623470edbebf5827a65d73970e0c0f1840106183861905de3b8e0820b6a4646464d46d9f50539674a73b95c74e6caaeb305165830f5ffbbcfae2db061c386eec68d1beeda46515191548d1a357015e63a1c1a1a222222d243424242b656ab05d5caae858080809e8282829c82b26b201f1f9f5a85fdfc34fd64d73e3c3cb49e9e1e9f55180f8bc57242922413995db344515c328e63920a73d76218864856abd5920e411024a252a9845498ebf0fb3e8c6315f6ddfbaa30cffb0aabb5b65c8607f5148fd8d9cc6578eb32b8c80af36fcaffdbf97f3aff2f2785f3ffa2fcbf9bff67fba0fcbfa7cfc9ffabf97f4dfe1fcdff9bf97b53fede4e9793c245dd6c504f4efe5ecd6bf2f768deccff4ef9df9d2ee7ce8af2bf37ff6bf3bf50fef7e93af9df9aff6df2bf34ff3b73a09dbfd5f9db9c142eea6683f2b74ffed6c9dfd66c93bfa5d9d9d4ae569d7fcdf95729ff8af3af51fef56683f2af4ffed5c9bfd66a937fa5f9d7d9d4ce9feafc694e0ae74fa3fce9cd9fdafc29943f7df2a74efeb4e64f694efab7deffe51ff347f217e24f64c91f4912ff254cfe4e66b4a69a937bb65b144eca73feaef3f79dbf4ff9d3993f9ee12777af6977d2aed3f80685fa0c6690de82821205ac6caad852822eb732a03c09238517da4e0c19375496282d03a529a594d21fd28a1509eee8fa75ce1a5d1f1495ea6a85439c3366e83081458b11e526672ecc0f6634f18131333a6508650d1b4d7f044a29a514ebd0f53109d2e8fa330d5d491c6a8c00091f0149448d60a6f809338518a6ce171084f9d2fa8206ebcb0f2d306d585fce0429314584ca61a809a22f37c2680993a0fd88c142288c0fbb99f522078bb901484c1aab24aefc84791342ad60c8cb1d12cc0882a68011bf682501d552e287f0cb1741524cad00ca4c90189d5018314425b67861d48049d8612921077b318281e22a718478432d33a3b342c3f2a286878c22b012703ea8dd08060c3945125a8864ee8801959813be90d0214ced16c64a1a47044166d705bc2386de2ddc912e3e2548233dd5dc8942ef18983b5af01972d453cd9d1e9eb8434574227df45463e7ce78c68e1947d8f1228b14143b685432902b3dd5d821f3183fc6242649fc38e2949165080db738b821a4e200e114a72644539c28568670e0890b33781822a5c6851754866071c231acc594a21852ec0752d3ae69aacaac0aad4ad357a9bdaa38c5aa3c51d8b4c1c514443e34f950f3c1c98727fa5c3c61c310ad888b2c575a5366445cd07045874dd014c483190a9b6bf01b0a9b3cc869d18f612e380014438afd4012628a105684b822d43a53e5671604022a3e43aee08070ec4b530f26f18aac014761538ac2a61e52438ec2a6fe69c5309c2c39f0c490623f9086dc90f381938315f287a79e187e93062b8614fb81346416c583df88511b67709ae1897cd3268737565019e283d49b277498bd0983c39020de10d134c406fcc68729b8a653bdb961ca17a5294a0d4c41933704081b8e613178b831a4d80fa49a53ede973c346070ba5cc102866286cea8d49375258192243cdcd13b421536c6ebc340dc9a1c98d105486e000d53a4336c658cb32060b3204630409744594226d0d2c224b93195968a0810cf554e39482af062739b808f2f554e354068cd3123f9082b4f454b3e58c2b6ec18bbd9af19cfe1ba627cc1fb446d641b7bea3d27b5db462ab577fd795243d6b6fadf35f3171fcbe5aeb57e728a9f5955babaca2631923f64d4e64d91c92d1ae3162a3840889c249d5d7b15eb4d7472ab0702ab06033cb5081059b15195aaf2b7225ae56ab15f692764c1efeb55aecfa6f55657fff8d12fb81aee48e600e0946ba1d79f6ae91baa3cab3235cd5cd22d1d58e5cec65edcb49e14195f58a6315842483acc4b9029a36260effa80d1b26eef33f99371de2cf71b0a0abc06af19c737eb5d65a85a27873ce69a9c05868d8ccdfbdadcf7a3b8c5a2d8c3f15f8d605667bafb5b6b628b60ed66aadb5b556950d1484d3c869b5a00a54617b915aff8a2d911463174992385c7db1582c7655a2472ee19670385c8c2449156e0987c3854b3e93a66af46003588cac308a412ab0d0ae96a623cbaac87a6dbd96f522278cbecf94a99ebef32c1569ba9403484e598ccac8798bb2d7e6a5ea02495aafc5f55a9e1eef51f94c1c0eb7845b8a5519adbfe47347bfeffbbedc1c2ff6c2f85b15e6b446e5eebdd6dd2badb4d2baa2b9d6fa7ddf87546b2d42dfddbd9a1162299d73aef05dd14c279d742ee10aa3393787e69b14a594524a69f5eab5a8c89caef9d37b6ef55cb5f7292de10afbbeafd6ac82f7bd0bdef3d822fb2d792f770f027e9f277402eb17bbb5602c8c970f31700ec91a2351423e6be728410a637a36c88e6bedb5d5bbf8b3d65aebed983c2689df35bf394aa6adf8e2afa52dc5480eaeb05b6b53a0aff9a10f3148b7d6fa08e33da65281a40b4d388d2ebdf7decb63a5ccdceebdd65a7bedbdd75a165af662dcaaf14613d42adcbf45ae212576d19068acbeec9718bc1f8d2cf15b71c8a7ef477d8ad81573d9bf734ed6bcf7decbd393bb6becdd75d3baef75cf02ade6d4df54cfbbefbce1281c5255859fea3f55e8fabeefa3b5deeb53833c9ec295f7f61d671a2ec3077314294865e8c24fc3e5ca05be900a6615f861a6214591824bf0694865f821f52a595bab6a83f27812455506c3ac7a90c552a954af72b578288fcff509818484425bab108bc1a42fff11a4cc8efbd65afb736b255b3f9f28ac61ed9ca058345bb3de7befcbe6b7c0e5a2388c6e8e1c2bab03cc9f2a83ff650c5bd57087f7d57361f05dc04f56502caae04fb1a8ba96f0eb7d870a3f1843f97dec52fd031c385e8a8883050b162f45c4c1e2a5883843d8216aadb5567bedadb5d630cc8ef3d2a3e278d51b635dd5d6060b162f70e260c182c50b9c3858bcc08933844a174ea35de7b4d45eefc35715aec47025f2f4f8fc000509b584888a6ad8b86141be202c71ad332e74cacd546d12b9545a85511f6e48faa191d18b8cc291acd65b80bb61232aaa06d515895c688ee6721695f06300220919818891a52324ab88883a0dd11aadb528bd71a150503ac70ac79048d61b232310d133a9be6dc712124ba0e5e8729daeae6a90a8b45433a571a1b31c3944a5fb394412a8aeaf55a8ab981d3f82e8a9f2aaeda7ca54d92bf194ad7eda5519c260a2927d1d3be891f57b55363bcea354b88eb101899ed3a14354b219d83a65d566ab51b556ab5d711295aaab565b6db548b2b2b2375558adc8fb38cd69fe5461f47b442eee94dd76e3e250b0154c54c2bfa322051172f187bf3ba6de4425fa4b2c918825a3c82589132e4c19f05889ac51566b4c7830815431295059b5555bb58d59c44490fe1baf442eef062914b9c46e754ccd81540fcc1ef4d7e86a46d34faa4e5426865cfa3c9cc89047a8fa9e60fa64b09b32c27480046edeac600c08536e8ed072041a1f7251b0d290a1940b72e8c2881054f1849d207a7ca1b3c4113cecb0841941f87c010a69a04f9a0853c50c0f68ac90428ead0d145e7270e490808a37c5123d7861143c4217e4084ea4a79a3b7534d6530d19507c373ca39cc4afb72ffcd2e11bd454054192829c329e56621977c671cd194bd4a864284f942975c650f594314117d28775020f08fd80684c11a2625439158d353c41a49d26c270068b6b501909850cdb75bb46695a71339ad63db4514326ce0f62dcca6db380a24c1a3b54be4023556e7b03c3cc07b250628c2b53bc287398400b175de8e444304689cf600c86c618a7e08bc629b0a3f103894af84934b468f27f44251207bd8fa814547f74ada16b9d5555678d6112055674fd160abed0f55f8caeff8aa5d1f591a6de9c00a76b14d0f3884a406ec1c72790a241138cd1e093a21248befe7996a8f4c3aa5347b37e14955878a67d5e14957cac57437b46daf3bc1240d15e09b6d05e1d1ecec0427b019eaca8a44b5b2b7a549921110000000082000317000020100a070402390c647928f8f814000f5d90465e5830184a05418ca62886611896018000820000c618830c535575008cc290d61b918a4e087aa931bf74ef8baeb4206852228a6390269ea2fe0d441b68a34b082942e648d4c413d2bf23d2d38004fa5337374a26e4c723eabc805c6910e1a442084e459db821edcb22351db4147dce48a343696931bd07d19a564842b6a8e044c49a0e9b88faaf216aba4419f9908223912d2e08ff9a68a1878652f655cf443a0d883c89f62bf55118e231ab49a34b260e10f6adc99686521173a34f949180d4884336256dedf49cfef82c9524a10ff534099c9dc462461eb2a9fde3dc409e5de333bb37640b7a3bb056eaecaa86dbc050b573ddb4682ef36737ab803b5986cd5e324c3a9ca6e1b0a5ed70e6ac128af25db56988f6a321752778f9ea7bb47bb8964cc6707d4cdaaca900fb45daacb51244644bed3f97ef4e2ce43e5d54a34627299610ede6f6e567237451cc4a45f7a6bbcfad23a4243d33a64c53465c74f5c5d2b0cbf21c62305d38ef79fa3980e3a754b397cb37615b96aa58a19849338248bbd7e33737210355e254fc1c69f634e20a99226ac4fb248af08334dabe2aedd880d30777ac8f38f4f5c3a028508d1b6c49d5845ceed9e499e4f3a3047aa5e5c2590a6a95fc886db8e1c8ff393a8a52f21541dd5e557e8a17930bc0c45c2180f9c6b395ed1d394de14fa75c29f97317eb658414b9bdb2a5b17566a5066ed174f3fae13b300467a3fb2303f259e26da6204a04a72ed25e09a28af106ca8f887ee1955da2d8f110b00178cb79cfdadcc098d856f74613a267e8b6a9a3224dc43cc270279a617a2e5bc320d5d181e4cd801b53a098ce76f28ac0f40457b29deb5e7008635fe2dd4a0fc09afb9dc0e9ab042abb77d095b29c9a7c85a01fb0cfa2c6d9f013a4ddc7a0720b27a2d973e4aacc221878fa1ca13b4d53af0a2eb30be5a250117db0400bab79f9fa93a9b6cde1d97370d7cd9815acf1250ecbd5257035235b31d2319ffeee7551241428e98ae34f69b367918b6482c8d147edf4e989097e39c25e35a83b4d549d2741198482f5bb845824bd0c05a1e6c7319016e2d3fd759111083cc60bdb74c70682782f45d3a0ce544557576f3c035aa478f4a818dc3476452f574505a81bf91740973fa3eced2cdda5d176ad77ccf560bce5bc87f09b0ff830084f3dda0ab593debe6cec3d8f9bf14c225130439d791fb71a6ea98454e17a8eb0f0ab8318ad12c719a467e2ca7ac9343472d22832ea5a6768971529330be76c8c41b7bc178e7b1e8d1155d89d7a42a0ec9098294702378e8ad32469800dbe9468c1986178c833bf55c5fedc7443d5101853c53e6cf64b7de6458483a788b4d3d334ecb9a91a22ab01d86f25500dacf520864a4c9742ac4e92f66f2dab032cacdec6da3e2e367b453d8798772517a1da5e2a4610d929e0ae00e4ccb2be3110570c05fd100dc9d0946130a7b6acc39b1b1438ab7e37889fe9377b7f3db688bcd28ea23701a63e38083d3c1bb3b14512d483d3040c6796f0354ed272106d84dfc48e99174331e22725998610b3de20e4d82990dd1ffa3f809e7b4bff1bdcc783880459aaaa6e176e6a8eb807cb67654bb3bde86bcf3aaf4224aed42bfc15786f5af07442c0cf0cbd9b324ad7cec4f7eaf5027c9d5c8217f0f569f9c97ff6820371ec89c12f8d8e40adcaec0d58f6d4fab6ee48d7c28d5c928f15d1e9391dae726d7b662e49380032702d9c9abd93b74eb900a615ed374af77bfc015873785f76b7f35ceecdff4fdfc80bca0097f99affb3261c371e8c0295bebf508f56c88bea34d4fdbcd41ac4510be34cec9051eef01d914867f58674eb53a322b92d9299692d763e8172a23e963f1f73e0be3b9220634cc4ed68b4389e320823d0c6f428b4c583ae50ec35c11a7cac882e6df2b267b90ef111120ed08b05fb547b3192468dc0f8c06750889c4112b932822af87d54bbc9da9e6cc88d737f861f5ed3ee732a2a0cefeeb3cc32bb1954e55d6c831afefc8695477e85aafc9366bb5b4a6ed6a03c7f3e80bbfa4749013bbe57c0452ddd2e65c29e89405712fd17b36da215c7955e86fb151db5f7c364f9b912b1bca9f5082c7a5297ff0180b0e8dc87b9cd520c50078445b00727f6724bd4c00331c0d022bd54990e87d2f33ac7e72c170d83e6d0d13a0468300186f49b0d90c549825644791cc23427a381e70943e94723c78d505f5f1833ee8cbeecb514bc98097b4c8b0236e01256d30279c1ec2ac53a643d30fbba52efec9a8e2b2cdf05e9b21cb457a9f958edcbb6151d407c1a5084e9bd8ba716994eac520459e2b7a048fa01208c166e25ef2270856d737c3b27c5f7b6f1f76ca76493c1949137022b74b7fd3a2c24b614e2e4b7e2eb5da021679af56ce9a1d1aa2128c5bd4870ee8d5644fd58837b094a0991af013f3da923b474d6775ccee3fbcb0fd68c68c7af121abf7718f576f6cc363fde2274726df5ac6e17513f028524517179c728c4f6cb11fbdc255effeaea3ea471520008b39e46367cf3337a4c8f90a2e82e1ad322fcef96a9f0148e1394792b5f7fe5d7ad89501e696e6723ec997cd19c11d6bc442b5c09fd650bf1425e83206b04b362605f07a415e3fb07432a11a596c0b072340c06e8ab6a3a7a68fb0c237a048f4433e8a9d328ec1be67fb3b4850eab5ecb7d7329b38156f8313e964b7e84bd803c018cd2b69dc0dbf573e8cb2642732723484939a07ad9d63ebbb5877999dc4f638c3e3c00395f3ae3e0bef89e6aeca814381edbc1290a6d60368673310a839e02a806b91d6644f1e44c107d3416a8a1f47a98b2bbc54b4b66a824e4ded4a26e1a37da1f9153e4594da9a9260faf15ee0b7696b5c3bd04fc3a45d740e5991733b921ad51867580155b1c60f39e03fb49b1d0f475b8407c16301e1c0dadc9c5bb5d0d000586dc63e3016fe8d0072d24c12478c721aa891472dec8542a5a33692b3967967736168a51b6e5e5885e14c662bab3c3e6104efcfb4a64030a45a8c324bcf57e33f273f102233324f0de3e25e3aade968e0286b641206e9668499f5404d27120d9f691a3d131d4ea787ac9c8aac80104600a69df13afc906c182d9b181ca0a5436dff90ea4dc6c226cb95f0f6d33e13e0a58bd94740b8d82eab1e4a9c3024b65c8f4abc9086ed36a42035525503e8606ba28fddf31e6d97874b341ddaea5c3a0c92db09fcae87de65ba74f53d264c70eff8fe1bf1c8b45343e2cfe8ff54da1758ff7900bb738bc96b7d0c09626b6bd07490a3ce961ff100b26bd70ab885f817c4299c5a386f0455fadcc45e1021cf87fafad73f42bec7b4ef6049860248da26e7a86251e9d94f7c4952d5b65e5bde1970e987193b5b63ad45e2a71aa1ec364c72a9ca161427740034e3077b38c5604d0cee04cc8f0cdefd1216de08e5b93f505a7e41da5ccf8b3c6328ccd57aeeec14401a0e68fdf4d04422ee747fe1b2599aa6de69052af34001260b959bcf288ddcd0ddb772a9bb1c6a83dda556084559b880ddded3e6d01703786a219937593d985edfbafc19f0e27110fbba5d4861c5eab6e3b50a814b888ac3c17608b5017ee229571ba1e6278acaa15f74e250b37bbb3b286336e9ae660d13fdf20de10c15b024d51440df24a208dfc2c96a3d3b38fd9a0a97e534d522f151a254bb3d1a7c959bca3d3499c7d911db0825315c5f258eee1b2b3857dfdeaf2885029b59548e9d5705e561f9999dc6122789533a71012177a16854ab8fa123c476309465bad9bceffbaa189fa42ffe80b1df0b657de27c082d6750536cc68b9b7f34b12d725906ccebb6e550ba90ad32edcaad75d4f0df86efffb48f96191a7e86686bba66f29dfa6d6093c87d0671eab1c2e51c44a955e7c5dead497e8c0f7a76b71eda23ba11bda48047d22bbc0c81ed592f05beec8f8e7b3b55d4946fd55fd62500ea0cbf6d9cfc463411873baafa6b0e474c12549d49b3e7ea8da1049649ad2aac186e42dcab3a9f34513e37c2fc8f260a5aa4ec1febde68370bee6b83f76147693187d5e84986acda408986bc1358cdae09610960bcef430ddafa257390dee0342b2658714b060182b2d49f7e0ab45bba9d3deb35d3aef0b08a2901d79a1137c7055b8aa9e5e4bf585e5b0bace1e315a3afbd848e2815e9450ba65618bda391b7886f64a60f81ed4738b388e43f1c79c87267dc38fe0929ac378ba5f0dd96763f2aff8e64ec2e59416d441828cc549268ede896d48d07c696aa279cc60d9edd71702770d1c673a7a0e78d310fbaaead33662228566d77f60b861777b6e78b10e5ae3cc6849d3700850bf171c5b1075109d443d51cadb5021f770f5f91af1774d3b1f5aa2192df26f11fe9d9f4bcbe528b2a39e0ec6a34366f7646651735b73ef21ff65e4baa3ee69e620dee5eb4b37dd678efe763acee0c239efdcd9efdaf8e7b9440adc758b469eddcef37f5aecdeefbfc780e4d04809c453f9f5c31e9736f950054b79222422d4514a74458894498c88fc369a25b0021f60308e60f137055af9e67e29f3d17ea7f6e52279246543b454518dbfe92ae1f41f797839bda2cef50a19eca8ff0e48902dfcd06d52f2c9f8646e61d62471b04be73de396db20d74651a129243f0b9ebe9192785fcd0d2a04e8ed11f0ed90006f80a454324835be9cf1c19040c1ee2c02ade37eaf1e4f05198092e51b1f82884827223903cc51f2d4c3afee4e6c539c33f75ae34c1d75589ea5993a66367a00662a761a726928d1816acbbcb96792f6d2972186207bddad58a7d7e4eb8bacc4f61bd4e118c442fbc2d41609cc3af81418ab916d06cabba306aec1eab52191777497a84e200cf6bd7000196fb494e2e3829a8fe7b052b3c5040d0765e2b26dcd767f83c72149d45b2b47bb838ff7a448ba4205dabf9b878e4bb8ecbe9b883d52728d5d7511bb5aa3d36f42b5a267e055c789d56626d50562a043e4097a09cf9c4c0b40197014aeec6e8cdbc88479d2f7352e62f0367d2776749a9767cc749921f6f5ced268b0c285108bfdd2943f0a5d6ab4f512d3244c92f01841f24586cd9139f8c778501dda48ed77b523835b1f4b7893ef9cecb9630499585c46c0654bf47ae9dc87b89033bc8b0c55cd66302fc5b919b75a88028c70cea280ba2b0357f9f5b4fa920056810ff0b3ae795c2f731de0980843ec6db53257f270a039cba0472eddf1c335544581edc7db602b49353936a489b4bdda1c7a714835f970226a4a5c81e89d644e86f145d1673140d701f8c28feb93abacadbe5314a0405a3cad5fe8b7ca8a9f41af97f6dcc4e24dba5eec13fb948c770b77b4d09a0ff8ff88d53a013c0aa833363df6c2bf6001bb8719f7d4daeeb24f6ed05f02e49786bd6a4ae593874230314b358920b0ca6f4a31e25f5c8ed352f419e3123ecf2cb86e5d832337a3ee2f1a4ee7721b1f6e764147803db8bd675da75f89fa9a4b211137f798faaa41a8b0c5a529efe58e5654466ae8025fa55467a5769cd93d71465edf5520d84de44df1c297f8919b4bf281e4f13a4683b20f42279dfdb875bb3b4d74b320780fc7c66a26553805b50f89a64122e23ad91925952a0af0f98e41bbcfd7862daec76aad5a1e56e40e10f7d06df66ab76a38d24108c6787e9fa7ce47afbd74c146425eb9456caa0e0aba1f1b1b8dbaa98e88cd5d6dd82228943114ae35ba05ee20f95a5aaa57a891e70e205f1a49cef574cecbb865f47e180a1e0b1ebfad2072dc44a06d2a792e1de8d3dd9badb19d051bd668ac07c3352d0e4dd8b068c74decfdab930f6fa21ae5cdc7c245b7db7777e364b9b5a5664f43020a9efe5640eb81359d4b51e54b112df2eb5db810194bf1c440c9405790ec126414e76585145f532ebcbd83ad6d86c939f7c0f214d5f621dc0512db229392068c0f4e56751ffceaf6bd8fe5713518bde488c157657d0ecb5a7d76c9e13db381cbc854b64873a90eefcbf0cf115a6dd5871633ca56ca2d5d6bbeec3563f4d8b846813baf3b6890d2975e696dda7407c23696f9b214fa52d1a1b35be9e43eddfbe68d8a144ebd77331af8e8ddbba05c97b1b395b82d7e5fde8c923115e4b484b11d86f075b1258ce27a1b1daf4110edbbb22aef92a7c56ff815b02058795584dc7b04cebe35ac7378d5d4ac2f1c973fdecd1b17f37b5d4505202e86053fa11508feb0fceed3ba51ace0ff91172baa0d5c20176f8b6e979d6a7ae150478d5fd739c37b0c3a8dad2183b8120ddea6a90f54c0174f6214f418e854664b6f05c3e2e531ab6a67b4db5b0d8d5001855f4f89db12d1288b4af728386d88157b85146826710e3a0dac8a267fb9a9e0b69a999bf1da5817ae573d0054e3b18c8683aed7cc73b044aec5f87b026d0b1787a8fd39dae5060ee930cace7e9915db174310150f314ac0c9a098994bc37947e0e46bf3a29464a64918c9e25ffcd8fd8da74f422a02fd015a687b17455762f651d74c05889a5643f6ac35ea23ac7e3d98a36b2eeb6ab4e66428a624ab795f17f919e961b7d302f5286ac05f52a9a348a3a7f3f45574579a22da131301c679c8ac5b8766b8217ae2853694e3f016ecb209d6651c6742e42cf2f7e38614a6dd9e638401c9d69d91e322ae92473a402d221657b0a25d213228e48443a8b49f0770a0192aaf546c0767520983ba464297dfecf93c0f09cde0e2983e4490a3433f3387367b9861e73a2c7a58c39de181dc1591263f6af3d2f7d09607a12ba2e5948567e3a6d07b93974a0fc586b03a23b72ea16c240c8f7293f953f0b54f445f247cdcd271667ae4c974bc4fd741875c4fc935093955dbab786228add7672b5d5133f166583871e8d86bca5b9f0bded7df5aa298404c603fc09da7d224832f4813edb9c8835b8aaeb83cc25cc8db277b977143dce1debfafe4bd17e9b8554be27b93280948d3b5d9ab717e3f060a53647a103808c043212de546ef3c294b9c83277e30748ba46d627bb37f7b9e02b1a6324f44d1dccb83a10cb5c5d625937063ca0dd382a196b8e7979306f17f28b8a806030d62a5123407a1ea97f4eeb7f7ab81b1de46bfcc388c42744be21714f3d88687dbf389770d1c236e2eac8268d34aee8c772bd3752f999282b15c934cb5d477be14644dedc3778d945ea84400f8eb216f40a4a753f4061522ec092392d46d5ad5c740a8c054c6ce71b55978f34389fcc78add545a3a59a32b750a8c3654d75cf2712a7d5df0947159d75bd7cce1a0472d907ea3886bd6d85762c0bbcf052406b26e1a4e93f96fae2faf4edd1481418c64ad5825c6fd1b2e588b878c513767d3043aad336e00da660c1f2c92ae04fc2b3e8a50339d3468d74a1ba1946ba22bf06ec46629d68fa1581c2b9f7162549affe234a563239744c48f5b91667abe030bb1d094a23c2d5bc9f5c03c291b6ee9d48f152b822cafce0faadb04702151c3c4aeb8c89a1c9e4d438dc0d120f56d52ca2996d43f2748f3e851f8160d0d6feff95e9d8d6b65484dee938b331faf69deabcd6b01cbf95669bdd9c64f1135916e26660ed8e12d0ed80bfc2bd78f992e749c2c69106e4776956df95273bba0b4e2f9425da364dd86e436dba304d6cfa05f32e5cc0d90a3e839cd8b9eec9934c3c0c18f4476997ab586630fc4151935cd8a5e3fa1c28e8a3121eb5d57bbb07ee1c51e8944ecf8e130e00e03d426277339cfb2243e369b2b357394c29a3564fb591703d5ab928311527428bffbeab4e7dc822d010d0628d8e97624caa1ea1f533041a814f0d14bfbc1d5c4f24e9462cbc37428732b9b8ec4c2e86f4124891f4cc4ed346c6aa186a6bb70ea5a3ebe5be08efe643d58ea9564e1af4f33ea0c291dc76114c45f3fb016373d2051d1f3c1c6b6dc0f293e84a61c99b9965a2c6eea16c283108b964f8961391276475489e6ade7ae1ac725d0791a38897f5e3213abea8c03bc723f6d89ecee0308ec262034d17a8d04cc24465d09b100641b9a7257c91c0cce9fc60e28d73ec073951bac8301682fd325ef74e65f6ef60146a69428998d084ba9fa7d9b7feed9bcd318027a7d00b3f609dbc2a9ac76352366aeebb714f1702e8ff46007f13f8665724c7d00127608480ede2ddead0fc06079a349bb053f708d49093eea03183ebfc3f4771492ddfb0055444ba3dc0760557f4472726a283acedcaad203c8a8f061bf11b49e046ce25609c2757d08829add4f028ee84aebcbb07e7a050c88449d804a02daecff15c50bff177ed2bbb4a0164319bd786e94fdf92468ba26d4b603d2f0fd9c1c4556fb01f3445453c7ca16b28893bbbf02128e076814a850c91db7e420f247ff76e042fa75c4b370a1d6265e9120d16fae0d7fd35d333272387bbb2210c4ad8260ea7a5f2323fe6df4843b0596a26387ed28640faea8172e8e986d50beff47305722aab779c21d88d28c3d132f41502a5820bdc983b8611d2854d62121be0b4c1a65005a342bba05003a9212de6e8183a05a17f9be59cf30fcf211fe431d2d09412e4a34d19aa4ff48f98479f023ae019ba0479ce1ebc1d0572269009055c239b6ef4d90711264d4aa002459279624a77baf4009372a43b24e22fe6147243411824a4d0b9e8e128d72dd574dc49b67c6fe634a6db6d914b2f50820f1aa01af062403b260c60004623a5a6ec4eda511562b2687b488df24ac10ecface880effe4017ab71a0e48a0c6f7e77864ee83176a31834608b49c40270f584fa048052ca750888316d3508420abc9857c400a5b398126072c9e4290c32ce620c8a116d39024418b0964a4a0e50c219c9810b69e81200b594e421087ad4da1086156a69084d0961348a290a509f412906171cc1b623987220eb498429105594da149822d275009014b53d0c400622d68924d089d30dfbfe6f5d0955c0bbc066f0fd8cf07d42e8efb9851b90b711cf2ad64a1fa296de48f29bf3e1dbd0a5722204ac3f0c9afc725c439a6165ebce6cb53e514801f8ff59021eb62c1a050ed00a8e320a59bc24f9552150d487acce8d9464e719dcf87c74d80454258c3885282c49ad89da2fe1af207e14e292ddd52bb87e7f8932e0ddec1d5df34c065ff5fce36f4d29921a007684cfdea01cbcad7829a5ea73e09f50af1dfef3befe77a5f7e7d2aa11f78d24fa7f9666ebf9024eff9651468e38c0781bf77491ffe00b610c57b4ec0cf80b64678241b7e400b4611687fc64b6d83892a7ed037c5434e63d8e9a2941941cbf52cdba602722b7fc0c52222c6e1c2acfce514ee019f8b363e3cd116a834ad0d7572a95c958b721d4a62d029c3c9a441640f71d7d7be01f41d059fddc6a4855bbab57019b065eb39d45f4ad581fdf25216ee0a92cabdc2140c11a67a2ce1d373359700167269e665953e6bb0972d0b40ff16fe5c09378b5e3ba0ee9d2a6d1cbaa7fa7a13dbd0ad0ca278271f0322e54e72ba605b8a0919c5be2c55f45e8c6681629f145d7c279b6e89fa4e8cae602f9d9534f54e2055b025826b996a5b3c55b811c13481722f805eb8234b9c406927992ed82ecd844cb1278b2aba17a3b948b12f4515b793a55ba27e2f462fd849c74a4abd13982ed88ae04a46b5154f15de8a605aa0d8134017eec8265ea0dc49a2156c4b3321a7dc93a58aec89d12c52ec97a68aef64e82651df8bd117eea4b39250db09a40bb6457225536dc4a30ab722982e52ec0550857664891728ef25d1055bd2989029f764d345f662348928f6a5a9e2f732744bd4f6c4e8853be9594ba8770268055b915cc9a937e2a9822d114c8b14fb02a9c21d19e209947b49f4c22d6926244a7bb274917d719a448a3d6954f1bd0cdd656a7b315aa19d74d612ea7b0174c14624ae64ea8df874c1560453228abd40aaf0ae0cf102c59e24ba704b3a9312e59e0cadc85e9c2631e59e34556c4f866e99dabe38ad70278d3509f55e00d24a2ed8be4869db8b104f1d0f65f35eee3780eeae4a153cd4f79f22847e3ae442f05055d9511ca61a09cb361e1304e7c34c4546b265762f895eb825cd8444694fae4dc8dbe79c554d1be0b984ba403136159c360e8cccfb743ea92004ca6047c40c0d16ad68b88503282032840c5145dc6fc382e9d5b0b3f9d3b79d7cfd9f3c040aa2381fc18f57a381d47883e420642cd0c9b7ec80224194901f6945039fc609c84321041f41c7838473ee564816d90a948928f652aaf81e840f0cbe42727651a8d84f8b8a9178999b492fa74328d10fdf0e28301751c3b9a8eec9ffc704eb462ad641778196f72199ca5ec1812c54c2610cbe4553fac9e0cbfb901cbc54b5b3e49fb4066b10e73820fbe1870ad350d890ce5dd87d5cd630a5bb814a27ad9071384a4964bb6410a5f44375056b0b2c0650ee494b7b135422cc3475044d051441665d116eb22b4ae95d6331504a32bc595b13bbc17684a3949ce8a20c04acf02c7a3810a5bcd9a8b0c135425346292f4c14734495397e1062112ff336844e0b444626157a518ac9868206a5f4f9c70aa5140e216e794e49f462ab0dc8cd510849748f237a422909df8072ca7309e6a83cefd7d28571fca8da9ef43b7a99a20fd2ae0c82f441290f5fbfef4ce41019510aab2a1a4029833ed004a530f7513c0ea5f4a01a3929e8e45ad8c2ceb16952f20f2c87632c9fa78545f14a058b4caa1eda128c4ed7db8e1c99de4c908c7047a5c821a9904b0a9d4931950c7b12fa8344cc3d5de792fa2a28cf72032380b0fa76b21a26c618d7d1e7f76233874b69be048a7e205b9e8ae68ff98d00e8b976c18aca39715674ae451cd4dc278f255e7325325c5fa68572526627d35a75ec513640e0e915a32303a651eff7012cb08207721eec44736011acc809c7ebe575d2785bec69e72515404f7a2f2045da7928a94653faaf146f69003b21e7e9f958de9b7a1fa625f8c989e2cf5f4cbc90751c10b4384f26fc164628cfbe4125235fe8d7645067c264e323beb8064ba81b671b84f0a10eac4e82817a1bfc73526f40ed59ad6b1750447810d65bd0037e344421a3be49fa697484f1dbdf606642193f6ce0e07dc8a032810b2259c3bf4b441d47ff05bd907b108b286e1cde463accad82cde658222eed8b10f18d559b05dbf3e1450555c9056cf7c33a7528077311dda90a44b7d4a097f58087f77d2b2180ba82dee0020873a224ba21a746f9330554802588a3f841bcd9cdc5a9bfe13bf9ecea251a7d58fe3fdb7b48831ef2720f9b95b0075c94b8f41f1b39153ff8ca223984d3537be04c097e27a4c05c59bb16bc5a27222b45c6fa310687707827f2b36b87368c610726a905b67b9f2e88bcd9ca7496d78ff56e2b854d6398a568916dfdd70d2aae90f958f51590d9e8e0947f02df54cb5960da00bc3146ee70ee2e8a783640027c6d4396c4da2902a5982bfda171b600bbeb8e0670036279bc92f6c9c8282abe8af045a0e21b6081ed4e559899f311f94dc63f9fc09930ca2abf927f664938e50c94ff02193fa551420d41d40abc56c062ed9d0941c849e93d7c0c92df95d89f3adb5d96a4d87d1036b3c7f7c4689bab7b3e980e9557a0d5db44ec7c4be2f01922ecbaa4cd2ecbf0aaa52947ec81be27a2115e481ff9abf781bdf49026230886a604f6506b6c2c3332f709bb8bc1b16ffc430a4bf210d0abec009dd5aa2eee112383483e63b44f0b0940e0bb035f7b3e8f82325495c76f0ef477d308cf7e0c3fea72ad1f5684157fa0ec87dec0fdd44527b7a2e5bd3bdb1ad73fdd43c69fdc24413beee00429e77819b3678e7485e112e63c9e9c1e94ab7be2b5682bfca82397c01985c7a61fe49e6549527860ab7817b095e03d899b5a9670f8ee86cdb92e9c213038c460b4990a85eb2d3e1d273b29d550e536c2a82876b406ff8d816a9787807d1b16b8061de8c8d85d518b857d1b94f5cd17229660d3fffe572d4c384708c720339510228718a7255141ff0ccd45c05abf7d84b47d45c6737de26b567e0abbb56adc7827ec2a5e9016696aafce4d5744168e42c509fffcfb084f207923972d8b86022f2068195766c20222cf617d375af260f3edeb793729130e8ecbd3adfecd7d3f080270e87426eb80ec918d16a0c1de54f7a0b9fce8c9a7ab2f6ed2a035ccb6f382707e19fe4d397233ec086366e7c0f64e6bdb778071d085b29674720683429330fc5e7a81eb77fa0333881bb6bb2acd977f46e821931da30e9b642f435b0a155ec3d24f3c3247305c36db6ed5ae90a34333c82e21c7f1ad80eaf5f215ad9a96a236768eb0f154753a2497ebcb6078e14ce8feb90b9d4fb0da7543849e007bb197bb9a90bda4cb1cf11212caabd0382f0146af02a0589394e2e3a4b2485a45034607e98308f3906773151efad111dbb1437bfe247cfd659edb955fe0958c2e7b1bcea8f95613c92fe7223f8f608e4fa69fd768c6b3079e746fc5965958495e0b1f2202d256132d5640a49ba7f1d9a563514c15c8c02ffda354bf060dfbdf4a0d181a25e14c47664eee4568a56352007b6c0bafb7eb7941d957059101cf58cd20f23115dd1fa3e62d37fcb20b76b182dc448914798c54fd67f67509c5cdee6e6d09680d12bcfe1d746262e1265be9dc4552920b884723da4537dedc668ee445b5152f9b6cc7292072bbe6fdd8965b0ecaa03828fa9087dc69e2a79dff64e269896780bdb71f6b3d5bdd58e9e8c9803d8d63654f40d87c02deab5dabf432e17ac46a1c25f4c517daae8b81a81b4e590681180c8db9c7366e6d5c5946d0d01fa196e857e1203a86f2da0401b7c907a37ae17424dd3f05d8d356e9c5b75e07085b2599e3fe7f9dc00fcc2fb19d6d7c1ef2eeb96f50ea7f0c7703d8734921b60f3c4f89b953f814afa687f002ae5fa7227fd7552120df63330c66bf9ae852dbb307fa0bbeb3b266a4ba7d44739aa26d75eded566cdea454abad840e73cd8ef4783997c1cc2309863263fa04023018811bf0c1d134f7e0eb224db7fd17d100eb1db0fa8f33f0ac9c932d4b73c8793d9c53a5d7ce3a9064b1b7814b6306c3b89c40338016fbce91bcbf186f5feb70fe5fe46089e1e2116e24dd6c8a21448fad31ebb165586e8220347369b1ab3b74e9158a68108d0efa2735b93fc3de8dc031f359a5605d5c9d76a6e6ab1c8b26e53e4031053a4c8ab65c2098a7d26196cfba1466954580232a792d7579196e217c938536697293e5b26cfb057570849cb2f718ae025dc730ed978ef06ae44db476904f237ec5c620860ff3665518915132e710f52970516cffc1f1e6569afb7eaa274fc37c6f13f7624b8c469de6159273b61a1866869250fcf2e336ff277a4453c2aa309e969d17b88b51bc1d8f85e1e1cfdfc04238f3126457cc541935d8ff32e006a874ce2f437f2f1ad692b1b10b2147eec4b82a8391cb8c7acecd49d58fff246da6b1ba06d7acedd56f365ec3297f96b1a3c2b8021144ff2ba5a7b56f807295fe8ae37676f07a75dd6837a489e2d3be14d502607382060ce91b603ca7fd4bbaf1b18cb56f665c7792784b0767e08f30b4b663fdc610b02f7f505fdfd8ce7398eb49f8fbc0fd678b9909c66727081662dd51145acb763fde61fa710cb3e75d6284e342888c399e9c70d3b59e683582c3d1cbc67aabdfbd21a7c37ad9436d305ea38a6b70844b9567e0956fd65a864a166a0e01678fcecb74c9b75b4c8ac14567b166cd6ce94efe89b6dd18debaf73e570d46861f854fe161e7e2d7851b4a22de7738b0350d9fd3148ab518205b30be577815b5cb368df665b77d4a7816b5d0979f9d2894d3acb55e166361f6d7bc70319796cf8f776e6c9a95701ac8fb5ac892efb47947e4c6a2f27418bc9599337ae31a1622a7f08d1be1f9a77c96b55fb56b0dbc8336ae10638aee70831f120e4107324dfa0f6e3831dafaf32e1805ff8eab7118bdc4ae07a647e970b06f97f83f581c072988f24bdf57c3d5bf2accf742bdd7f40235fe0c9d2270f7b0ce51eab8a443515f0bb933d09ac26ac857a0043d7b7fc97a849b52c729c5e3dc450426305afcb6cff0b0520016b57e8fdc202bb14870d50b64f1803e4f106a384bb4b80fe630d22067f18db351840da16a7f8efbc7810cd62789f388b19fdb083f73b39037ebb7f45c49c3a592ba6beac017eb4b291323f3b22b5f77373c0a2e1b910a36d1cf504cdbd3e6bd704e37b93ce8a999078fcd3c90b499417ac01534340212d6a9433c3379dd934f0a363b4671549416d91aa88c953e840f763de42c269731fde6d33b025ac6cd20ac22d46b72329c815771605def684182609c8b02ace1bc17c462bc045b9610e80acd37c58e569edffb8f0aad1ad779c573e108f71f8dc8e5ce18f99da5ea60c1731ee3097346cbf5751002c12dc56dcce7211dc6757d0a02768ca66635d706a77644279c8adbf2edc869193d179ede4aa31a6e4666f1d1b06e0513bcadd3e4efb6f8b36739240ecaeb3ae132a8729e8f3fa39b6a7704d835883b1a92d7b95f0b72431e48056cc84b1d177d814331ec9e2ec24d109f2f149eabb46e8c437773971ae781ca34b21d1c0d651ff4d4a37a408f235e4360830aad5f84d2424108cef5c2f645e8345d00076244160ba84953010ac346df9c2a0576c240e672b0527d64bb79106d7b688aebbec7dd7653b20d8c158f6bde36fcce77720c5bbb72c0d3ed2b01d4ae8f589e82d8d63746add07afdbb161f7dee55a18e8bdebe64e02c3ff1feab3a82e507c17b5547c4d25ef771931416f71f23e2a78aa029197440b39769f216206ea861e3fdb5cb7e6be3bb896d66820e77da373835c02873a73d0f4cd50073af37ae0e496698107bbb9b4e84ef0ab155ac9e67540356853bcb61975b7dcf4773a7e19b2cf9434201b26b41ea0bf30485ed3c058bef82f1c1ab749aa82c546ce14b1ff74b74806de8f2618881f164ed3bbcb358fc2011568564cf726728b94f937c1978668f6c80a182b59e15796710a5063630fd37269fef609fdf72e78dfc9ec8919c92742fde366eb797b27c32205656931ac26a75a03389b35a4b6ced3ee1262bdb7a8689ef3eded0fa971d8caa421b673c913e4a607fbc08d6dfdf2615937869ff132273cb0beb622cd13360678b4c4ffe21fc4285c62f4628d64fa8a61f231008acf39cac53fee5096f980c98c3ec6474eeb1eb5ff85f475424a77c7392c2b74bd07119490e4a05d5b29d6712cc6a4a474c2de2f22dae90db4be802829ca13b7d10414f6d9e8bb8fd845a53cb821421aea32d073ade80ba11eae8ed7f54a3f5818e9680407fd0dd2f3b6a99d06fc657b00649d2c8cfb423c40a83bcc6f0249d1b8242ef5df632d5c70a994b790eb7a5c5de2be3cfc1e81acdf43b98138c025df4802b9167f3f821378816b82ec276d7a815f78f52b5c0603ca6bba9bb96cc94f731c3701204d07fdb1c7309f96d946d255816df4cbc5be67279163d5258881b746aee91e3546c40258d8da8ae3af88e60b8c1d9da24378482544621c3178015da828487be77ce5053480f01f057ce3fe4da3daeefb0776c2071a64c5cf9bbd035fed1dfa22c3702248f098605fa44d490b8d75f937d27cb67ec09179be0cbe8396b98b11ef7430df9d846b46f70fecbf7f7cf7dcdf154f85a0aca4b734379a17c2ea6b722b3fbef278464adaed697d59a1141e676fdcceac591b43bc32e57dc4b1366e2cedc599cc9ea3088a2eb6f197a94247cd29e3373d9ddfa3500e6ade6414fb4fcbf96081cc5aff4f7746bdb30a2028f3c27b66597fe47b30a90f805a86fb45755cf46518067e74647aac7922db740b3ebf555549ab64ec212896c78bbfc0e033ab12cc83f5b5d0d12abbec9591b4609d1fcc9c15ce91974f18b69edf3c39e81e12af656551acb82086062ce04d1cead4357f32e2e28d877f49096e225354a6846d210cf257b00d7b13f0a52d99af4d362e6c57d7958bbd06faace30870073ef54c127cda58d84fe283ab4907df49db4eed54d9ba59daf12e363b54e8baee6377515e17c316f3abc318e75d7fe5263673861f736f12efa90c571ebe20e9eadc0daa4b42a798241b880bb4caf765b5c2abb3224cbf05a906f358faff69b49a42d94f5d55afc746611e760a0d6dae13e486f54aeb6f55df6d30908e35b4027cca1cad853f12c1e3304c18da2e5a6cd964ed3ce7307e13b8c79963820096340675131ef2704c516e84e14b0b22be4222fe6acacde41ea536b344a50afe51a7cbdc976179ab84c7cfa80bb93b738a6812f0317d596073177e51e466ff0459c66a4bee900b764203d173c9a749d1eead74955b396428057cfd9cf1ba714628c4312b7eb786598b86dbd37c66799b051874e96c58f8479be09246cc5a6b69050378a18dad75950d174b9e8ab6966e2f453d24ccd2a2fe6e063408d5b1c7efd3228be18bc32d96ba5afa89b4bc7199ebbfe721c38885ea0601939bb2910b9ebd09494d203dd2c97a2e3943477d385a353b3460d10a88e777122e2383232adc77993584fa8253d7a5aeab4659d8665a18b8cbc1d3cdd0dacb24bf6e104c399ea11f0cead411f3a930bd240f95de6bba58cc402a71b098852a11c74d772abbdd2a39be03cd93fece377be55e011105de400f6c2b878b2d03d4e7e8363f0d278f59c48fa1411ddff5b7d1e6bf2b40e6d59991f174709790b27363f1f581e7d39d3c13b39c204e474abf0ab41f3aea72ca0db9df66ea714b425463ececa1c7d5025ce5738420434bd551996bbc4729cbe9d6827cc0bb68630edab465b63859b555b411e67f64059193ec14a2d5b3ad0097ee8ca72c878d57d82ef8d6655ae7ebe3f492ab9e9065d747314df9b69db5a9f7a7047a8fda52f025c860a1cc0c3766b6c2ced55083c5ffdba3e0b88d7c450b3d2631bc2a099e29fe7e856e82984084e86fcb70847ee69464a24659aba3f717584dbdf5db738c4312c090f3da2ef9dc7cd3eaf17a17913c9e916564a0160e6ae8c3d0e3aa17adc290cc569087da7d9f2bec45c36f3e0bc38b0716c7513483dc8dc0754b7ced0afde800f61cf0bffe03ed45d8a70ae57175cb38f4dca8c759b895c9d6cf9b8a0b844021c9198a42a379783347e13609c22f461b340412f916739735e04aeb6250df1896e267faf1d1efa6bdca4cc1a29ef04fdea56e1afad0d695215c8082aa69a731be4100b9af4b192dae4313781a66ce400c2b3951ee612b50e0557b996f984674f6e5bd62653da44e63b753bb8ba9609d16b02305b68adb41f7e6c2dce3134d4046806008c7c9bb05a03cd162c358baa7a1d178da680a09863d33856bc30b684ca8d2f15a01eca10a630ef9307fda7289332d5ae061521176c3a5dd727e9417654bc1605ccccc6e52b8ac2736662e0acbe4043f095c14d838bff683ae4c5751578e94457da431e4fd7c30e0e24acc06919fc3d93b50a84d3fed4c1407ae8029cffd605d55c1e7f9d96de84516e3d23adf3d79d1d36bd3694f28f374ebecf8a6b6d4d87a7f66e42bd2f60efcf4f775349d802e982b5bfd4c4564d181c537606b94a1a6f59183e56bcd6e1ece217174e1cfdb3d177659ea6082fe1415777ed54aecce113360fafaefc1ddd0005e5a1c50a399dc3d1a25535237a3834d998f9bdfca2aeff4af23f1cd3b27748d9e631a07f8aca6f530e8d9e3a977f6569651c46a2a75b78d9ae36398cb7d3d172ea23b0764978a8b07d1f483dd75070365de20821621704c0073f8021cd8dea08c1b985b008a0da1c2cf98fa9e198e3744428c4cf40e0e0243e03182128005a0c9f6eac8e7110e007b59ab81b83e4b26a8cb7e63ff8c695ed05ea3bc6a3d398534ef9cab986dbb878c0da7f2284083f2fa4a1662618996a856e2f0a056ff47323bca1fa5a316d9b4740e57420f651c8c2b9ffbc0431a7a13dfae2822550bdad1b717202fe06e202d5665f79dc6069c37614bd8d4a02e4f6dbe81088ad28a52fe7f9b22b3a58090f46bebe2409841803e9f3cad7fe16ef070509623521d055b20c33b506d30453c9bec9383fc411dafe9c1e8f3a9b58c88a6ee2e1a28ab0f8725a690c119296bd891b8f18d9166e2e655430acbd07a84d8c99e91bfe4c7ef54d35be11a07f959c92a01aab0a0c954ac311460ea41b72c1f74705c73954945c0b58e5259cbd8a6241bd79d47330e5ec4f92043700d0aa9290ad32959ee320c41e995c174774fc2a5b1dd44aec31502a6490f04d384adb32019b5c5835c9153f4515f529a2d6609b2485c9f0ca0d4caeaa8c6105923f82a32431ce7615f245daca24f54f734ed447d64f68ceb96a3864d4e5f98e0ac65734745e5782e620f896e1b0e488ca3fa7688aa21d8452d135cddc4d6e42d99b2e34f642f078c90c50afbd3982f1bb938fa778cc2e94b2d15718a91f4e92d28949ae0117ab9a0b7b4508a6aab9a18baf3c7041883ed208b15872a3ff2a0766df2a2a5535540b810589e7da3c316a861308b0bd5e17182cdce3bf1195905978ed3268fe94d2b02e78846b17439f5a1b1e35ef5a842b4699eeddfd8c5b7147b14d4f05d1f7d0662ab7c86366575e6721245d3281ac5df875284cbb50fa973b35238e21c00b129ea332bed49d1de8545be2b484e3c0b457e5800f86789c6c3b97235320cfc25d1f50d994a782fcf2368d3662b4a301f40bb5501565b943127dea31778a98618cf2ce4ebcaadd03cd05f8cc94d412d4aa7b915437b0a9c168a53a3220923ae3b107664e165baa9e4bcdde838a2df39674c1e769e4383d2df0fdc229d44116ac8cd20d54c1f21ec19869336570c3973e53cf5df5305af112081a682364a26491521063ea1ed0c7cc8cfea82afbb587aa5eb262d9afdff3c4591617e6eb3ccd70760a8bb3d3b8302b1c6fcc83b59e683f8e0b9b4d89d1d74628318a28c5c795819a8fcb5d918b39858f1e90524752a4e8df90503f6a4ab26def1e02042db4a498280c092e42c8be47802200fa193bc26c005ee0537720ac66f579aa509f8fb8e6d714c0bb13c2abf7ed7d1cd295fa1ec849e46c4c8c2f222e8a1038416bb428f1d4d113e577f9579288a53f16f56de07313f1c389a18d4670b91101f48f044159533fc1beeec4ba6b7a5a1a4f3a8313e8b678811486dcba62b3e5a7c825635d9cdb10320028b397708f083fb4503f5b044144b8913b66f5c979745c5e090ab943643860a22628bc9e780801cab7614e2260811eec1fa940571e9f2a43bafaff264507a9e837f1514a99fd07453cecfbe53e9e93a5f9ca57f53e19c3dd1ad5c27b2aaec5f32f1a5a02a3def897a25eaff0307e96fdcf94e27584a95c7bc3c276d26951d1e3d901550b173b46b62c68c8e6dc6d8237332cc6000cc5080c17c147873f9383edbc234816c10bf82b7c4fe09da4b5eaec1e7673b2268c634f80f45eb0129d055e81c321175b4875468d3f512dbdaa3745f4f89cafdadd16c403801638bbcca6ebfbef961e88a6c16e3ba2d8f3c0e4929b8742740e782003ff7148950e17057101ba42b23b5df430a955474dc636fb1a3934aad26b252306001ced50271cd7707f592136310eccad4c8de0db2d650099a56540f923e8c9585a397b67f3a556584eae9caea02fa46e124f31fe721c994bb5230f5b673607f53e67a2074a6f8b152d349520a27dd95f76a85b619dbead014953e4c04a07735d34f3a38674427e050ccd0e30fa82d950b601201d728afc72b4da76ae14d1ec25d759264e39da1461cd3d7f516a6530e2c9763f905d99fcc4a19d6ffb1dbe78ad5e72da15012fb3553348d6adfe992c9350a38592b96d942f994d9ae8b41a7a8ca083a830111104b147d9f867843b56feadf4164d1f03d5b24960179c4ce06efda17278e512bc5420d4850b863c4068c305b88cd7d5600de0c03ec437db37094e581dc1a1e70bf6a5d2dc50f5ddca451991efd183d2066923c0e7a5a45a8e173a0eec31ef9079d1d28eddc2ab87bf19a5f4fb671fd5b543580fbf786d3d8487275424783ddc86931f7854f350589770e840f6e39a575e9046d7216f202abc0daf64fbea7b524813468af1339bfe7891b4ce5fa13fe8a465b7c491474310610050dcfb6139d089912e31e188efc225b8a99243c77204ae947ff2218fa32a7bcd640eabac0f77f66bd4e061de38ed0a4eec46a0d187dff904bcbe8c16be2ede5979beb2f9a01bef7b191ab4a12eb60b39909fbdf3dbc32b800957bcdae58234bc264ee6a7b96834932dd67707cf5526e6feaa199d166ea306434f43306db5805d24d7fbcf240210051dbc78eaefa1fb71c11691d9a904dee71abd5ee06d117385f2b478cd05a1da4488364f95d6f92601aa9af512bca807b22110e4fb98bf16e96ac8047a72dc17a5992d92cfc4faefc700dffceb03f8e7a715305337e6c2745eb166fa13c56921888ff23385d93b6f4aecc7137913b1318b6ab6807cc8e88ed5a61c457df1615d043dc0eab236a18752776da0804b7385ae016e0797fab6739f69bf3c69a807f83b645bdd0b560b0bbcf3923bbe52e2160ae7fe37acfce286e6950a4ffa07ae3ea0c3886c741bca74009cd78152d14d04bef51b72a93af116e1f538810b984a20a0a9f76cabd06e232661ad04d7f801ab9423d69f50a439b4ed687cd05d6d01845ff10a74cf815d323573042f76cf713f60339983aad2e942f6262886855fc63ded31c91ea981c8028d805cd84a61ff14ca4120706fbdde3d076cfc4fce3b55a3bf49faf16874f66b9baca308286a1df0158d472633c8929add2a52c5c4afd41e5a1f73f49cbc70538d80cef957e8e775805489dff8059e0fe838a3a73ed60838794be4ff7b07c7bd515309932214e13b1958f55d26fbeea1d602ea7794e0c71a232248c88a3f1920afa86c90aeade22760309ed5aa330e96048e83c595b0eb482fd41f74bac698f1e809378580560090705f129989bb8fe81ed8c5634a9f78e6135533d066133d2ffffc3a623b223d723de9e8f8075ad85a9be81aaa30da8a60bac548efd66dd8980410476a1020c9444f7357034e65a2f65a21a13bd681dbae456a5e93fd60e1fd5d05033f20f70f6acaf448e3b07aa3c6f3401fa0ab6eb92837c958f1e79aff0182599f962df17d93a85a1a2b722b1ca6a157655f5a5cc7e40b7dc96c00637e3eaef6d932cb40c747505cc9b9b02b4e3098a7c68053366b0f7ab87423a1594a099fca9255cd95e456fcb03b06af4df06b7ab5cb8439eee111f7f9993cc90931d1039af9e3bfdcb943bbfc125ac4d24cdbcc03cbf3fb10c036733caab550fa13280136b7d3b688a3a972187c5ac80acf69b0edc600849e160d220eed917b99c42737c234975677be8bd5f4b8d4bbf8c4f4f0a8a6f7236c37b330bd8bd20ee93afdd0b98fed9425341b7beae423e3776d94c1ceae2908af60a6bf7a0c4eb47eb976aec3d98e7b6ca7d0d1b76b160ffa4fca42ce96742f06f6c5af04f856fecdd5ab7afee3d06f8e9756a54337a62ec02aa68b403dc10884e3b7c191a89951a4ba1fd01424993557062f7c70b7b51675828d644cdff79b822efc2185c2be6917d289368b04d9d300b6ba06e0e15fd715dc87a9d05736085e9a97ac8ca5e55b04cf74c35649a526617faee01c8dd27dbc497fc7196ddee25ab0b1fc8f3fbcccfe791d09ff4a9ebb89eb82144aaaf2b7d48a16ee44e31beb1b07537a8bbbc40556add6f5b4baa191ee62589f56699ab097f9a79b6c27c877f7b70414d312c423219933a6a42dc3ae7c0211f45e25ed955759754638f3f716364a5b27b2f51c519c40253569a69139aa731f96b729b15d7b509dbe6b0ee42badacb52bc7ae1571d1037359ded2839fa5628c514110b084b301dce26b4bb1733adb957773d6f1a7e544966988cd576127ab93660f1d87540568e8e64b5325e9073ea610aff19e1ae3c1eac6b0f3644aa14ce3a961e460ec48f517e2e7eb20bb9d8e043ba3dd00f7781ba4713c5a6cdb874ffabb05aa5b954fb1c5ca077007bd11486a7dd54a7a3bdf0e458b9f1fc015fc563099bbd40e050bc901d004d6cc02c8dcc5f6285a540e016e56b98fa23ff60eb51ec199b1d57a73b22e580f604b18190950b6ebdba170717a1e300de672d7f2da8dd542db4f627276695d6cd90bf303a0d584be93bb41620d095108b61c2ab4d49527b82d872bdaa5a038683850465e01ef05316f5c45f8498e03ea6bffd845e503ec952fd82515940bb0837861975a4c5f40a5f07bbb6e3bb92e6a3a0b0e27f40d268d0ca8d575245bcb12a29404ba60e86663fbd99b5c5accfacca02bb538080ee314b55c4cf2594a4b895983a6496caaada31ca2e37becd7c24351c2c403a704e1a68758a971f2111228c7f4f3ff1314584ccbbec3f1d0d8b4e7b402508ef30f3a3ad63b5f38efe80c23cc50db6fe09e596617309dedddc09aa7d0cf564a77ae18244fcf0a6ddf283beddb856291221108b057089c1c42cacf3a2bfd5078d81add5c3b4f47e5b44139e7081a15309f5f93c2b252f3ebd3eb9c23a0080d47d72db6cdc7292645b2786d64b2b86afeec30d31055cc4952754366d7730128d3232a0e8e3df29bb50e560835964a12fdfea65ccc4dfbbbb827a91e4a8cdca2bdc049af47592253d2982576f43e6059c5f6945a67db15ef923538d20ef106a1a363793e7e9658351b6abdb47a4d7bc149e1c2df2c8d3b3419eb6b06d1a027d09cc47f4c8887478d0440cf3cad46e083c24c087bf069c08f342d41906d58c16760522931db3ad6ca94ee9dab92ded1796bab1427219e455d3919c9d8f790f6f71c9e7b5f42ec4d1776d071fada167ea23fedcfaca0e3f772d3bd8af38b6d0d03c4903fbc9b1b8e29b5ad28694e3b2eec75cfe88f2c594261ecdab9ee9b5e47b080b9227c9ab572e46c241ad8ca310fd69101421204647784301cfc9ec13aafde221134625b0edbcecd986fed91fd0e1e163b400d21f06dc0faa055e0a1535a1e0efd98a982bc2dc8811b69613733e93aac8daa5109620c797ff794b5eb822e7ca2f01e6f2d6e86cbbea296b3dcf8e610844b5a80966f28bd87967725e66e9ea2e47c514bb9eafb5ea5f947d0595f98a78c7976abdc5025b7374803dca598420e7ab68bad74155f945849e96f0c9f866aec9365d20a079c9c2aab2c6f3236bab674e7e54a3a651fc27c7389a726306c523fd699fb1a59d67068b4f0a1d5b65b8bcd99ea4a976bbc2d06d501eb89c445614ee5fa84d66138115db0976a6a97d15f7c364c73b11abf0131cd09af62ea099cbaf50fda60b87c633f9f91c85a1816e285e2422513a5f9d5b22331bc82fb56eb22ebc9af1605c8206b28c260bc5a2c598051c7ead9bc5970ade41e716eef185228b273dd51df16b2b4c64ec823e66fe170e021bb79d0c6305a6ec418c6c31b9b8d299afe98784e6a0f15a933f34ba1e1124c61a615257cf52325dc695871bd1d71277e73e1d9b365c945c0d60ea1a20c450afc0ee8400b2e87abfa1c0f41a3510fb73769d9c1e1796a26cea174081a1698924c761da1e15949a6b27454be917e4867d2ce7f9c3733830617b484fb7d895a3e068c1196695c17e50cdd0c510ed9a6342a61282fb4b4280fb265005a48703a135037c5af89fc2d014b570b61f5b1a87a71f2f73cf75597546fa144bd566704b7542ee001a9386c9c013da8d67092ed61a5b06cb4a865b85fd9286202181a8dd2c643b7c5d758a615de8fec451583bb9058aff86d92920f5d59a998dfd34823383a0e9800cd92b3690573d4120885e5f588e7f743734b4e0d29f60ecbb5992198258b9d3772ef216067cf573d3178beed7a74aacb1f141bfe00186e1791d446082a0bfd8f940f1f0d4f33f2609477e2032e11bcec945244cc5ede4090a17768f7f8327bf45bdf016164f846ee05c17c3796bea5a2ff45d88fcd9592d4d4a8e645aeef70e4e22fcc21d90a2b1eb344aa613ced9f532fcda9bd4e0354834c6ddddfa56084b156248bad0ac2e012555c463742bc82ddbe2e08ec0b9984672b51eeb2e6ad20eea61824289086673422832b4b1cfc0d7722c2490f19d6d93aea01924aa141d1e148522e07aab975ec540049524be56a2ce241ad3446108e1b336becf4c169838ec30863d90e8e8ec76ed818c2212f01a0884ce5322679db35d85a7f75bfb423dded6d23ba2becc5b842e2fcaeff66bd8ac2506c36fa95c020e79d16d5b190d6a69c9545355b34b7fd8810728f3d24102922d9433a83c055df4e8a9aef1453b7112a96d2c3824bc594770c40383d76d28312e8bcc1131745913a31e5d476abeb6c28064c838313f859c34277aa9e093cf534725d6ed6b6db5b9020e51502b460b471f5b2122ce2c2bc980246036561a6a75900a8197ad0125d9a494e146a580b60f64f5e4818b023fb119a5d77dc5efdb7ff87117069c3fe11138ce7e2976dcaadeea8df0f3d370685dfbf2037c2ac323516502e61f72923c7a7d7f3be200eb62bbcd64a5e60eb8e7c187d8024d7e027c24730b3ef4a64eadb09c3f52e0d2fe17fef2f0d213a62055af037ebb2d2b4c2396990cc9f3e61ddf5a97bba6ccdc682c29ec17d481d49e39f9a1348f2b47e9b6cac885b3b2ed5b4b428962490612298f7001a60b3e8924bb8cc41fb3d7b3083c1e8cc670490d6ff955700cda360647c5175e1d2db9d979107a3388487fc37ff31a709f434792e3148bce6dc207c52809e590e061ba41ac6217f8f0ba9184ccbf7136b0b9cf04b6f2743ac4efad11306adf914c6575d1397b53f77c4e8c549ce492f3ae6530ba4e04bd20eb4326f6a01fd0c192db110a256db51d264ad9640f376dc69650c4b7811eef8f6b1b6b0b5712e4a51837cae771599d58a7bba0aac6a9aa9249f501faa1ecc7650586cd771f9756108a3bbec81d9e6ce2c1f03da360e735a300e3b4a0703750a22239ac4fa911476dab487af0e0b6691c73cd9e02458ec75e7055a30944d1fdd1457a9061a15cab000c86aa03b1a80399338a05928ebdaadf54f21f4daeb0d31ecd5dcb08869da4a42f6de7b4b29a59449a61907e1064707f177fce7875173da6fca27f35edbf46ff538788223c501cf9fee8a3d7acee9df4e91b86f6614f91377b99478958c8ca451cc5b3e04837174db382de3baa9695b76bb9384c160b0680483c16030180c0683c1603058348a303030180c068bc1603018110c0683c160b09899335ff8130f4253060683c16030180c56e4b5bce5239231137de4f7ed25df89464611c977a2d28a49a65e6e914a25f09c3153c21831b78587522ef79a1aafb22ea5359e656d1b47b78dd332ae9b9ab665b73bc92cd3ae3d59947d899d87fb8e475d700d8f007d43df86473f1ee984408009e4aca39f68e3d06f56cd345a2a0254dd6e17c4b30727b85f37cebd4ef84d529823cff283117c992413938d2f1e75a9e1ede89bed6bbc0d7f98daaef6f1887bfca13eee4fdf56816e70d3be70e6ed48be1f3fcbd77eb70b76079d4862c24c6a0b16348e3ffd3870126f3c727f99a47b50ceb6502e0024bcdc4023c3c2062e5b94b82229880a214c6784f9228631d0cc30460a1d4383b7316972a9124555507964a30a164e7839722599018829c0882186c885316480e56a09c036f4822c525046972698d0028a8ec10c76b86225091133a4913402ec82a0014821a6a851468585142cc8969e6001031130207d890196b0480a163154c0822fbe187344b6021b394589a62a7789314653cab0a43ee9b6173e29aa502970b0d24af693fa541aa4d48da62ac64b02c6249991a58a1746a0826bc3141c7e08b28204144e1cdba0b5a39d2a2ad23471ba01890c863445d82dd270c921ae45f8e61633c592ee0731697c48f10053365807bedeeab617eacc61cb90c3660a9247398c4a4425d412398c216e6549a24c50104ac2c860054a4ba8882282921841819430c6c00086284aac2f86a244e1c2a1290c56d8b1a1e83a428c2f4e20e9a0c58a195618b3dc0044165cb63c21040fac3086f12822c5589a24565a49c324fbff98f08aa59921fbc7571a2bd9ffb6700a9fc9219841e1a630556963808618331a172f361c062b9e550ee72b3133a0dbad74ca9c158f0fce864ba388bc857e871c9e9a165b67fea059ab54b07da985f3b50f28377650eed8f84dd73de487146573d38ffb2ab0fd40cc29cc0f6318330af4b58e3d3899c3995bd3be9b7df6a1905da0fcdddbd3856d3e2e07156cbff935e77f82f61dc9246fe4cf56cb558786865c43ae21d7906bc8d53d3c535c4e1cb95e4abc5c45595c4453fc4a963664e9724d4972a5ba43e54efde694cf956558895c6670286332d63d63441f6926f638e33aa15cca32d63283c3e9724d99e2a09c442e195c75cb7dd2f2767139b03d193c73d7d7deeb6b4f42b5afa986e08febdaf549d0beda6fe1defa5615ed93a0bdb5df8246826d21b3dfb3709ef55ec980267088b3c437bc4f06b72725614368a4d56a65165299a6a6077ec4c699ef4f3f6f9c39bfd9d19b0249af513629570012b3098d237fd20f9a70386180fd6555aa4aafaaf4aa4a4a54f07c4d25bef96a07630ec4df4c960e73505ea4a9345ff328caee699984caa7b40b12b333358e9c5ffa46fa5795aa52a522fa4ca34ac6752491cf1738fa781c7250aa8a5016fd96f368bef0cbdd46a95163e3818a64dfbdfd0ebf8defc81120568d1a201b3650df11d41fd91e6803aa9e09d9fb3b5b0422f6b07f84dfc46a1bc77e2873ffb559f7b05f4f9b8f11bef2c6febdd6dab8258b5b1ac7c88b5d80883e914bf7b06f85681cfb6eadb56f3f2ae1a01502873c72563ce250f7f460c2dbe7f18fad14138ec16cb5f67a219010cfb3b3bcf7de304699376bff6fb6af1272558d53047efbf6e32b1ec52df6a391448ac90f6de4fbfdb57bdce3b297d917ded0e1a0ac1fbbd838219883480f92659f5d903b71348efc156293cdfe5bf5d8b55659ebd44efea9c691ff44d873bc5e8d3d24f5b04de34c1f41e0d494456cbd23a41f34e19f453194dcc18fb79ce41c9a44b1bc85c3dc8c17dd8b712af560c833ed536f1ecd20279f2e706ce5904ec9924e9930b9335f7e23ff5e8c53a9396159fecb870af622bfe23a354b1f2e30fdda01b1612b594fd5398c197b2a7ffc2afbdc372bf354fed96719c6dce36f8155e3a9fc6b7cf7271b8ffa54b6e6374fe56fe3b3f1364fc2f6a8ed6db64fe52d6c6fe353f977ddfb16a322cf22956abc08f32293bc913fbde889e01eca6bf91d96379e82000993957d479064dffd823d8be748819b03aa9ebde0b6a79f416326f688612452421107a3b32470048eb1ec5470cc0f2061b2eef58771c1d28cdcc241ff9c2d64cc9b408ae12497401aca386e6b80eb441d7f32700f4591524a29bdf46b943fa7742b5bf73b5177bf1b75bf1f75f73bcc63dd43ddfd328b51b7925c92b07ec9d44344598cfae7ab7f1e7577ff8c757713157577f7d3a356eaa7b07eca344494c5a8bf1ec99dcbeafeaad4dddddd6f89b274f7dba3eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeefecec864b4da696f0a3cd9c6c1219c4c3959cee305f49b6893cae1f15123b798346058cab8d09083880d8428c3460e292d663097a6a636014263fca0f309a12912fb6f3125db172831c7d57dcd09e20721288c3ce79c738681431d3272d973689377f0c8ee4a82c8fe38287b52100992849424116385c3272579cd4b2400a433f2fc39ff4691e7e3241762797e171dff449e3f5d0727cf5b0254d4496ab990fd75ad58f950fc1c7dbadc8b533e94a3e4b13efdab1f10563c5f624ee455a20d7e339fe815638a19213a138bc5bc4af7d4eaa134a5a125174ac66a75291f9011739de12e27b231d648b1f8e4d2d793ece8e56054625322bb9e4a48967dd9561489b25c0f679ecd0b2329bd8e62b1582c4684098db70090044714ea6bf1f58abd62afd8eb7526a52315f3a018139a1af31653f4c9d0c47832986beac1574c75b34814331289885e44af48f48a44b1d5992cd6f2a118532c07148cfad3fbc734a6d8993462f5cccd2276021cc61893dc89482e25bb993723538c21208b180092e0b03e7ddb0da94fbfad035285d4e73e435d4dfbadeb6a473ff350a85986f163a19a7aa241fcef9fa069b57adb6b5ee74bbd1452998b592baa2f8f2faee8e5e08c4c5f8c3938115006d393cc3ef321fa286fc56a7ccde3b7f15ab4a03ed4dbf88ea04edfe779fab05f353e157dfc40ac9a4f455bde14391d3949faa984cc9cfdccf13b538f250346f2964bf127de923f639aef685d192d57b9fb5bb4f1de7bef8df2defbf77ebdf7defff1b8e5de97392bd7d9fe3e0fd7c9fe7eeca17be8df8f43291df2c555f2bd3732e1a9b7de7aebb5d75e7bedb6b9bdf7defb4d944dd9fd68aff3a6697fb5ab5d6dd3ac66ade6b9bcda4bedded7fd78743f6eb91f8dba186d61023bd2195bac7b3a40ffbecc5e7ef2c775e8cb2ce74b23b33efde982449d5affc789348eec1e31ba87fe86f2288b7aa8b824b51562538e5bf5807484a40f1a665ec36124c6a24f0e17a49459525bde086cebc3051cae16905543b2a79f3dfdee3cb3143978c50b0e6351f7f3e315dfc1c19a4f5f2584fe7daa1272738723ff786cf94e9be185e889313f3cd10516acf94696b2ec9f4a21c96fdd2124f9218fdfc88f3d2c9551a01c733cc11105fa9d0f0c30d294458d335ffb7ec76b52dbf2f562d57ecb38942759d43be5019cc14b33f3e90287b1a8355f95cdbf17e354aadf48e3cc88c493a7f58948d806092fc190947ea447b38e2af89ac9dc77aaa8d438f36dbeb97a2aa01c93d0605a91941cac1e50ce3c9973e80c81e90423cb2e1a43e2d74f25a48633d707ca99e779dbb81c4f70e801a0dcbd11073b07d021f4ebb77540a89011baaf5f6cd53cb78f9d03bad367decc9bece8fff8b6753784a240bfc69c65dfdaa71aa2fdfd205af68574e33ef3b80fe29ffdd6791a05f2237f9c7adb7761535353ae1e0b92fb62cb33e2e0a4722716796c153938a31252511977e3328fcbd7eb4cbbd98d10bf1ba10b58ceee773724fb544372f68532842e987e7ff16228ff789548d7e30185fa5a5a6e5565df2974193570d1caf4b509aa8464fadd8f1f9522124895aa67bffb41a423188d23df7a610736b472fd22192407a9fc89f465642c9ec9618cc598112a32c82d8cb020e7cb6dc86187d302e5693fa21970ccd489ec349a477cb38b83fe3952e0facd2ed9ff86f7841c762acb9f5e08345f25402aa19e61bf02fd659f99107d68f63a9b80810cb80e51f7684f3fda70c57538fcf48dc89dd3530d9ef2c42af4e9873cddc393698b526a85e3e1b898398de329f2ea31f2c6a5546f84fa2174c15af578a8a9f94e9037b40479435f8428d8c6d7780dfec66b2962f335aa07d4bc065fa4e635a8f98ad4fc8def48cd07ca1bfa36df45e1ff54b5c6035035df112db57e45f0d76c1815232c842e58fb54952503be9fbb628ff8f6d380ae673d64f43fd06f6816aff54103cfbf8ffa90c756554264068032cdb47a9dc1ee59459f99e97b107deed3cfa1ef837e03baa77bfa20b8cef6f445709dece913719dd3d32fe23bf47fb4cf8ed843524a1fe58571c9f3bc259db64d92d9923aa5bbb423962315438980d13ded8d607ffe66adf6dd0d89d97ea1f6dc6b43b6ef3a6bb010bae0ecb9df361e30fe5a5aac6a7b95fdce99a77913a708bcfa40048481ef17cdc41ef4ad67c2d20ebab965da5abeccfe7ec84376dd5f4bfd719baaaec37e36fef7bb9bc0fd5a5a6afd544372fdc2a7dffb195b7f088166b580e4befd90876b3f245ae26b41218514e217df9f7e1b909f09ee853004f60f3f84213065c980dd12c1add68fbc9937f3458882b7d7a2a5e5cd57c4fe36eb17ae72b3eccff9a968f600fbf78b58fa473efa15a93f3e3f147ac95d5ab1cd39e7bcf6da1d7baf753cfdab71ce39a79473529f75da285d449a447ee44d7f0761cc3f5d072affbc95b51ce577906302321199e36f118d7fa60212b319b93f66cf48e3f4cfef2965990806144b1129928966363aa57bf005ebcc69644e000c8163ec39e7cf9c521aa79f014ce0e801181cdf832f38541211c1c1222ea47bf86f416648e3b8fc4000e1e81edda30bc2d1d1516fd13a51440615bdc411497cc1a4082c4c88c40451022523965c6982e20c95d399117070c524038d7b46498d7e017765cb17a41ca800d343bbc088305c78085346931690e1c55d828c30b8b92445776c5dc33a36e4aae245caff7f4c28d32ac2b993aa4891b3dc4955c2a490b8a3546a721cb6497d816263b0582cc624535c52952e502a67c3619b318cc6788d7194a2e224a50a968d04b823ead0c03587dc11beb993aab8322d836d0eb91d3698e3381b1d4c1c1af7de21284a4c2e206596602e206030397a0114335b5cb004480c8ac2bc00c40cec6f874477c50e31e470753a03a3728bd9218995810e619cbc602db7181db868a2c3145ae82026cd11ea074c738bd121092c68e6191b9dff71eb6aabd0d6aef3390c418ef1025b778faddd54565aa994eeeeeeeeb1dd5bba26c5ca49279db7df7ad56bec52fe3ffd6f1cffcdfe77cf3be83777f7e31b27feeb76d9da75c22f68320b1e806db3f50540a7f4eeeeeeeebe64ae95d4bd1b4bffd892bacb69c4b55dbd0667762d077952a0333baf990ec8c0fd5cee24223468aa26559392a26b72eaa146181b61700e83189ba915b7c46dd391b7cc236f3979dba86091b79fdbdf1984c8dbe39450de687841de1edc7e45256fcfe33a9d44d445eb48245a59a3d9cf2c9b9246cea61891b3bfdd8f8cb27ae72259fb788a241988521aab66522a85884cb748d5583a8ac2c16babe1df887b751081c39bb92c0a9927925c3d648f6149767f8c997882bbf872f8664713305c116508062a17cf23b68e91739df8a984c8e8ef23074c595d460b29563086e8253dcf646cd2533adcfb534da0f666f67f10a7e4e72307acb12200c6044e80e082b3d4cbf707fdb17fcab582cdfe67f93922fd83363aa6e0ed6dfe11c2fe3636dd5383bae74ec861fda617daa72c2e88fd2cf35248a9ee7b2a5a77a454b7c70c187c2ff0af781e9c475b3f4f37189aeb77f7169770fd885042065ca7939c2079129414e49043820244eea5a4274cd993a05cc9fed9630c12a2dff246a8fe4f773c0ebef0e1bff5e1a0fd7e78724cc13c5b2895cd5ffee62b22124c96f4959678564beac70f7b64f93dbaa78ea012d23f9168e5fec0bafa0161c5137fe483207f259f27256fe453cf710e19e028e598cd578899872125b189a5a53fd56ab55add101fdf17b6901dcb08819c86117dd3b9fb66c280fb95baa85eec15ce878c064dca9684932372b8ea016fb9939c70b162308edc494e883431706de254029c156186154cd78b9328659cb8c04941c64d8251b9939a6ca191814fb9939a8ce1488037c89dd444055a13f846eea4263e6c5170963ba9890e1725868b43e2758231d9aee8ae60a21dc99bfe71ef936c69cbd6e48226d70a97d614e605204b4d4938b122d6e4050a902b8c80506aca1204e4054c4d454340aa689aa10910325b9a9e34016285910657761003e3c82d068b163d608962082c5f68195850a02dd9a104302c24c84e8035c82d068bcb0a2c4db27cd1496e6e54abbe333d87c706d8d6be6163539f4ae98837727ccfe1b181cda986bafda752a914c6a7d50a04ff31ee243737aad5ccde54ea1f0457abaad1cd951cc927f7d1cb474702786c4df7c3561f3e742821f9f070ffab95ec7cb50241147703d0967af4915fa9ed5a6dba1fb6daa8d5524bdb0310bf868c87a3e6d6601c5ebc8d636d56272771cdde75da7957d7f35ce7e79873da74aed6bbb166af94fa1881a983ab30386f5ee36de49c934a29e594737aa4148c4e8ecfb3da5aca39e79c724ae971ce1c1540010514504001858d44f9a4d5ab539f7eeab84d6a32bbd2d6a60c6082c7a7948e316a4eff54969183273ed23df6909d6389255a5383ab6163b361a3a16c6e6447474da6937e7cfccc89654abe04895c7973f4f3ea23950eff51f225551ad1e5a4d5de4cdbb8ee8442459f13adf3714d476b6a70b7868dcd868d66732343ddb8f7ca0deabd130787a3fb411f471724e6f93966c8b3a2bf41eebfd13ed386014f3898adfced57a3e21c58a5d2e1353a00802ff62bebcfe88303e0d1673ebef75ee7a0498de7f0dee823710d3eddbfddb3419aadcabca168bf679a69ccaa0924c6ecf9b78a31d2b06d1eb0405eebe31e638f4aa774777777af7572f004872c0c02788de3707f2a51940328f40630fbbc98b47a0004388fcc7ae791691d89df9a516d6e721e991cc79d84901c3051824f69b6de1125b5186c106cd08320707c692f1501bd36cfe813bb876c416655a3dbe4a4e6799e73e6ade3baee87f65d1724ce150fd7d17e3ad85a067e06dd87013e100cc110ec9d99e7073a8aebcf269216b32f3e66f898216366605bd8569a7269cef7187bbc808629df149ed38384b0983ff840a2664c97d4c44add9a5c77777711a400ca0b430441c60a90605f58d1831098325678c10a636c076b91b7df7eeb7e6cddc7f918c2f1b7f7000b8c63cc6858114d668560deb6edcb9628797b114c903bfddafe04b9f3dbabe03a336fbfe2b9adedb10b600cd1448bb56dac2d3369dfa14dd65e1093356dc887ac317121956702ee0b4c929674c11dd8d0caf669f7233794a4f1c58b0f3efca0c11133c04910f1c30f5bb62843e3d00f25fd18ba07fd7e9ff4145d714af774761dfb4a2961a47c449f6680d2cf9ec4a024e91989adefb6cf9e05fa978b560e2f17adcc15a980fd54f75b85fb81998e7e9a6793791853da501cb143932a4c80254b162c202e626071c28b184af0c40e2cfad1453f1245171238ccf16ec621079f04b500d39cbea17f2fa63999da49e4cac9f4a717a73021a2365a39846586faee48f88f2e1989e487d1f54060cd25b38b1382fb13eab9c7df3951c284c32826a72e6c58be91e9736558390201310d9a6840bf55b2fbfe4b4425bfc6d7bc4a7e0f70d6e9f1a39ecb3060f94d34e7778283f473bee0f6b0e7ea9ef9f4636830454d6f6d1cfa3cf4e98a3e0f9d4ef00929a8e03af1e977de09dc7c82e70fe08c06fe84ee5140a69f42f778a65706328d4cbf3095a3505e9a668050809316000144163edcc8612cea9e1b4cbcf8e0036c73975ce8639503f2f81d291dd84616f98dfc5ee5803c7e870e1e1b971a64f9f14af7cceef1971f99e81d1564c4d23ba9a628ae163c44471494d0381280356529a59c5170131fd2c70fdd223f1ac98f45f26316f9def9ffe41081c35824efc55266294a5d6192e50a75a75e02feee48b8657078ab379fe0f8612cbaff03d672884728924ce03062b1a142ed0b6f77dfd9b80ef79ded77a74e9f92d38956ee5b21fb703bfd7d7a3abd1010ebf409e1efbe6f85eceb7450856cbfe601f518f53139755dd7755dd775a7d3e9743a9d4e8fe4d4755dd7755d477f76a7d3e9743a9dbaaeeba8e6b54c8c915a0760778ff187749734ce68e395dd0ff9dc8f23d9c6415fc0110e71fef8f958f174ca07181c3d52ba43c7ec298123b07d95cc7e7a61cc31b3d98a8bf4558f69a5f4db2817638c600a3cf28de13837d002ef70d0a3bb0eefa6d8b0dc995fa842f68f9ef633ab94524a29a5da977ddb17aa80c272a7524a29a5945a6badb5d6d24fa8fb263472859ac9062c2124d45a6be79cbf8487355fe888fc94bce9afb5d65a6b9d9fd0fc5a6ba594fe121e16fd84687f107f1e6904740721500ee3bbffd7dd41644daf599e91b45296348492b670411a2dac235afcb1bce9078a48ae6b556cf325f5c2ec0791233964616614b4efad39e7fe08108bbb0ed20f051666d6be15ee87fd1f90998710706fb94f09508ba5e4089226155c11461968a4d1c4e25e0888c57d42dd6fdfb7c27d6abd50855c3feaf1c07de72189ad57916b2828890b2c25ddc41ac2c1e23e26dc0b211102626dcff1b0b847c26ddb965a817c2c778490e0a8808b1e9008238a1d9458db07010d0505050df1b0b81f0259dc070d5d16f7d488a34133b458dc8704880729929cf183151f5c68012be8269125cd155650d092cb5282626ab5522c25164dd01290a544a669b1b617da910315510c697912831896161b4fb258c192952f5d28c1925782c204ede0041a2d90589286148881218b22a660c292df5fad6843493980d9bcc0a7227ec8c18721b0963b298722ad8c1c88aec0457270dd6b6b6042a88c17115298946a28a2a18c560d444365c06a187231b9b431560a6c43664c980c891d90e882d8a14b97446bda81042498a2b4d1193fc838fe17e703ec6383faf1d8211f5cf1585b2b9d1dca4651279d33833b78ac7240ba83474e8eef397a31c7eea136fef74e0723ad150c59a4caf24d9461dba8f3c83c3c48c2a97f759ff4738fb2ab7626ba9cd5527be7cd244f8ed5f672e7e7a7239d59d53c478dd70f2aff1480cbd79f7a6db594ce39b52d6edc8f83fdf3d338fe4bdd171124403e4006ba9f8a3b65a0ccc4b649ea53823ce6949ea5bbbbbbbb7b944cdefdc5796f5db6cd031dec50c523bb35872a2e8302d753c76db8866edaa66ddbc6d53ae9a435d67a1307f5ec94435a91d7e09cedd64e10c421ab3538ffd401af3638b50fd0c699b54e3ae98d3abb14449793567b336de3ba130ad753c73daea137dbb2bb6d9c7624eb84cc9af9267c0dadc68c4e57feee403cefc832e7957176acb1c60b385e4a4190d1fbddcc763f68bd514f67c058be2d7180814d05fafd26bedfe024fb0d6d76dc4004e6862b32bd818b4c71282253d083b9c3776c6cf892a5fc783b1802251838c6f28ffff8472ab97962b0d16145872ca5b4724596360c917974a8214c9662ee18281c6518dbfc4d520b34c2fdc29851f8ed0b815a993e0b56f536a5a2df3d801858877f3947b83fb47121daecc8f245f84a5ffbfab375b2a7defda0d50321470b1cde2bbfb0abf0a14ae2913ba0dc344dfb1fd791210b36670f66de8a0b2c793c9a1c4ecfda679e9629a594ded7bcd8ca7e6406daec41aedfca41f954eef0f080e08ae700626022201c7915681c3b8327c26e6bb49f3be137f3eb9794e73b1997d18fe944f744474a721dce4717ecd173b4c0a167c99e05ca162a7e439eef418de33305c738449ebd6344deb84efcf845237227bae4cd7c997227a6eb031af0e4f2fc4fa53c72558acb792bd042f7d4071d74d077c025baf66980057ae7722183eb032b71b403020849688359068229821c9d26a8e4ecd84445cad0d4000000008315000020100a87c3018140209446d3aa3e14000d718c42785e361808a32047611003318618030c000400000021c8206445370038cedca38aadd0fdf7d1fb804c5438ea82341b231000d17d7441340a1d119fb98fca621435e2feb16fa3b11907643f921b57717d22c6127b9625f0f09e5eee0170fcfe7789766f53bea69cb1d399da04e621834296c15ab750ea1ab8ecd8341a2cded7b635d3a526d85fdcc330b258e51bfa7d5d0831e00a7ee1282ef90e1f41932ffbd2bceaeb60fb22181effae6cce677a0d2914ff90211bc06a07d83ab134ad1ef249908e461e3796460812d8297d62314a08f9149502e738ed28187b4a3b9b16bf45f4d965904dc87bfd2239ebfa7f8b4b46d1d013859db7ca12f13ab39542cc9e9745252a93e559196b5a162392ff149a03a35b91438d1329caf8332aa8453b73871ed8d6a4236f125b12d64444397be4636956e8e71e8777b68e1a85fbf341152f9e8c477ee6d3fb775c3526a6f66ced54ce2e6e957ef9283a0d5f8a880d689946c561c7f8293b103b2253ecaea3a3985c3930d655a84dfbfc9fe162b77b4f62b7d96f84b68189f74ad659b242dcc5ee4ac0ac01c2ab95cb958e67408c5e78110fee097bb4873318ac56f621c9508b49340ad1d5b9e1bd8e893d0922d2a64b388753cc5434724c9056996197115a17b9719955c530e6851882eb25597215fe529b45d77c1472c35f0c92e238e8b3be23e411f37ed9b16081dbcfba6131cb0966d619cea3198a41bd8f8853e0fa47e2a770fe94707d92d1378ea88396209ecff732348131a5a4267e18eccc41a06de78d646922ee4b93175d8aab7a3975cd87055ff88632d9fa7b0f854e7da68ba34914be2a6f0654f5c5d7718d3a032ff11915cdd2601b2a6696676dc06c6a20d85da2887edad17dabf4d35b7d6f7d9d2d6b39df943d2c09e4a57284dc7ef7c112c03d546daae98f1cce5165677ad8b9d034b1fbfea561cf463ed92ee3f290efc81f21c05838bf2a729e1954ccece93850728ea2976ed01310fc0ad17ba317d4ef848d694ffd1a4fd39d2b983a473ff536d143f4457e26b1b195eac0516450637e305a87218160f03837f024f7b24da1a61a4378bbef74c4442177517e2aa9078d0e9f6f1962a48f3bea5f42581bc904483f4e907c10f223b573fdbf221e07f5ec3cddcadebd447ff7df3c8f79c442e4d604a26badfa41525c17a05e71b8628e2295095ff06c1d455108a7b788b2b98c40d76dfe9c31849b15d5d52db2cf4446abeeb1f093e212cf61ca5b3fc88ab629a5081b868b619450eb02e20b1ff4ad29161121207978bcce86aabd5e9493b6b125ed14ee1712421d846ff11859f6eeed56b95d95b1f7511e7dd696238a6d3a64fe25eaa11aeaabaae98961a944c6c9fe914bd738b86c73b11cf3c8ae03e107b87bb3df1c7bb60fdffdc65ceb7d546b27b9ca2d76f4514af20c77ea003d7724aed69b06f46f3018e13418526266a8515268c05790cb201cc54d2920a8796ada92b9117d58129bfba0299066de27d56584e77ede28dd5286383bac30f101df6977b63d97d809699fa01060899d473bc45876027848c00738196679c3da20c863448140e14e9eaa100d8c85453c0bc8600d7b10f0b9a878c81ddeb7667187d0256eb8a1410db65cbc8454a0265ed109f70fa0e7e84bb2d1235fc90e141520c21632a19b84b2f270581821667df7e4d5d74e5c31f75c5fa8f6089d86732816dd906559faaed4edeb060ef01df23ad99b958b9055760e1bdfd983a5372c5677e98e16f63adf6831a812eb3d6f1aceeab7dfc024716a9cba4198e930a1664fa4de5f4b7a3cf7227dc20f64d6b67d147f914fb39a9f66c5b7e89b458b58e42b538f5b13b839df52e101e7d58323f06be245c34beba8d91af857617d1f41676a56f7ce8cd6657e27fc0f83a73931bce237fe8b61cbcff9537f888e8694522745e641d334bd400b88a9a9fa500c20a25094fa76f21b500b153ce5141b97e49cb8ab368e294c5e8a1eb4f58b661f8dfde62934d250b734b6dc0d5adac396f5373908909fc955b9620b418bc39c60119dd6c4d427c477ebce49027e83f1abf9414aa54c1f628473aa300d2d8d8accc124ee57774b40c622303a16bf85229dbba65989f909ce9041627e7db315ac8210c18a5ce444d74881d1f485841b7d01d537ef1f503f463ec4d7ed9e2ae50f011e1e07be9cad3240f86155dfef00546762c3ab1805e8a64b644aaaa44b1546012c8d6db892ea6d2cca89253c5f6b12ad04ebc740e9a804976ab2d973b874b5f744754950d5ef7865d478f7ef4b7413361a407b03a3c771221583874e025d769662a5582d67ebf44f5f2c1da0cabff898cecfb4f5fb299d8cf914a7bd27f80a160a862a6cc16267784221e955e263155a1a6ef82180f5e48e7311bf92760c041b1d63de2c0480c5a224676f4c2773623612d4bfb537b0f4678b2ed44322a3d16ae072e0e19a54d6b812ab40682c36350a89e2a7c16f1d946235a176f2cc12cc83cd3c6cef99b327cc2b7bd30ce328dafd154f827f46d438ddfdc0481e507d3c70dd8044d4a7430a0a839660d5268af3870d516fce2a84b233f3b24f84a92bebb104530fb5a1925100231dd12f3a43aa8904c8b4f4e7035642f6f6c70cad9b008159ff759d544a2e188525e5dd98084f41c5bb429adf765f4004ff9a515e5526bd04980cc74b8f8fa39eebcb9bacd7d30c9eb4e6857dbe958b55f4917b7027eae674c65c4ed87261ef370b10bb8b596bdba750b5c4216d0ab0304a5d5bc5de113c5c1d6e6fe2dc01e723bb124458f4e7915442070d0466097694c5dc18008799b104032fb94751bf148d6b1e6a206020dba7e4c91f24c749b8bafc221d974ea4520bfdfa4f536794ffb258d9ffdc8dfcffa01088f514b3b44e89b3a3178120ce49534f1104d7b3c6de28519669e08e3c0a82a8cfd428201b7873948271b77c7e3cab11cb6b2fbf5f49a6aeb31d86384abec3f03bf01552ee133b69cd747f7d3e59e22a3d3f477085bc9f2e72d50351a4830eb1f36f92b300c00dfaea747e0f66324993d5dcab203bdf2bfc320154776843187ff014b8b12e0161de2dd304fda83bfc4e0267a13b1ac87f8cf71c3890a69b7e977ba473531c21f304072f4eab677cd63b7fba72929624cc3144e5b512d9c9aaee3d5b35df80a4d392e252e9e09df7018ac3e5fc7a8fd7b449712e592ce50e922eae90a69019bb3ee2ad85176593ccda502af2e12cf3e34f11dede2484eab4aa29e4c30d38fa3ae90e97247fc25b474d30e81af54d9cd36b4aac7f21cac0bcccba0db256ba7b22aa92f86db6ba0231b244a8677223e89c4659e95fbd8b6018f5fc7f4cf9d7fa5e796e16471e49a47b8683d3b05e49095389520f992da4d77ce3e434734609bf2319c688765f0206d37a25370f72ec15ccec96462d603f5d31424420abe9bacb35bb87acd4137322d53620c3a1758395846c159d2c70c87542c2514c5df33681f219d121e2a30d4505f9aa0c4efc219be4f9494e88286da114ea2264b7a10ddadd12c9b6576506b55f79191557ef6a5658b3aebfa42cd0db1570f0448a65138fd0f1780b30666e402e8b1926137e1d3136815734529457cce4d6e2a3084d2be429c3ad1fa39227a3b03da59d5252b4badd12c9a797958fd5a81efce59f94aafd09a47f27fdb0bebe45b14f19e92359870d4fe80c071bc736a1f7adcbabe2ea112035ce199a25f8191a3b409f9596817eb0f5f5b0ebffb9dd06f9dbe5ce259e3e1cab1474e864bd6739f3f9a8dd65508ec557d3e7446bd3933ec6dbf848de12b21f87a367115f87cde3c17ec6bfef4ea71da299e9a1d2441698485f9c241add886b62648443a592b1f99537873489284b64144ddac2331ace2c2efcf103686e46dab0f23760c6e36073a26aae2f283436c25571f299fa9db7e495d6519dd79688beb01e4362d54fcf4e43e1616ed5d400e63aa0fa84a643d95c977fbe665eebc65ad362434cd3a86b6c8edbcac4e1502fea9184459c6df589173d8903167bfd8dac9734fd331d4b0140519a5b68249d3bcb224e50c0887313286ae804961e411f60aa0a71c4bd7b3b968c14a0e710304697c34d1078c6580b51e3c8aa3f9f94f731b947014360207b8f2f2e086f4a574c8fe5da11505523325b38c292e07ea20c87b4d1c792fa1cbbd14b2829a089f281f514bd1c0c915a1f26451735a6c088158dfd3746ba2cfe172eeae70f721bdd0524a11b8482f9f3160ddeacc65ba51268015e4cb47bd9547fa516585f33172263eb6a76884949e0441087dde1b89a033fe090829d583615bcc9d6532a9ae2d1e50c0bda9a38ac5612b48f59b61d956d3c629ed9eaf2c5eab00dd4a73e2c674af4848ca5d2b8e9ee2c84c7f4b710cb9808fed5389c10347feac332c4bd56f842dc204e25eb548b7983ad1159feb559b5aaae025eda544395c6479dd978a8a7eb72b1b3df7b10a01ed0e2a2bc0665d0472f8d4fea32ba52704eb3f0c167a1ae89b56a3ddcbcf693dd9b19017984943c171402b5b9c31efb1229fba646906d46907108987d4d26947a1a8cb50bb7ae13074c9673a5bf0244a317c612adb85cee81f115e471c508537071aac120524812051f641aa409d9fce3c341dfbd6ddc38dc642ffbe1934ea60d6a8faf1851a6c639371190c2e260235b052dab77f509276c0eeab05afb31181c7279e2498237127dc11860075bd760d1fbc96ec8781247bfc3fa665d580378560f92dd53abbb59843327a8ccd4813212381fa6a93ed55b213308795b76a4c8bf0d857635fd3a946742434c63bec395667805fb3ba6afa94b50e1a5222ac96d4830a059552ec597623da1c120b54e0cc1075ccd44cee46ce59f4d71dae96cd7385aae3ea8973876bbbeb7748942fb6d857b8d0d405f6b90221f8c7c3e2fd214d356946a203a7bfda0c58bb14eca7fbabf59d0ac72d7fd1187d0cef818ab17bc1461762d67ee9d46c15d2f600b62214ba52778ac70329b3de93569f39cda41ef7f110968a70813d8e4f0b6ae71a3c2c06d9c127bf90e13d5259db0ad67c17e3dd16012c00a2f594148e84107935a025b32837a74cb3b7208170f7b585068bb7f638097b57519002e134e2e19fca0e3a02336f2ecab8546152d874d10941acba8a6f3686638f0deeb1ea5411e9e07adabf9ed1daaaae322e99d8d873bef2ae749ffdd99fca290b8c849a2333a9f9ce2f8819bde4674e991412f620d665a962ac121fb55d18b3a45d79205fb5a4144c9cc48769d45cac04bfc5cd916e097d74c5d636fb9074915ae38f3dc97184bea653726910a470ea49ee6fa196aac42c8bd582f3b736c436b271bceca30918ef5fac324985f5f158f54d32da5da70e0c0c89f845a88205b02f5064c9b36103575469bf23782f7adf5f0e97bd258e873b92219a134e299f802e042274b2d1309f11b4c9adcc9ac3c9f8c7385e6fc18546dd6590d8112cbd8d2b3d9cf04ae05b1daefedbea51f5c81c158ab0530bb2def01e53666c0379ec8dd9a670d648dedfcbfdb4ba6b11ba558836d25630c53e2ea0790076b9e9ca8b1ef4311eebb06ec7a15e9a7358b3e9e2a1b2d3d21aed22a4956d2c2bfac2ef7c1083e5b86151ef828b8a69c4bc9d18e005b52bc75308ac7321869f88de5cf3cd6538c6afdb26464ec72510ec35465dc53f08f08cdeb88904085177f8483e923781e583ccba2e964e283f2c9c9a347e661311b55e3ac1f43789125d429e2439660ddf965c278ff0692282272214d4334c51a8b6842ac66e999c41b924aa01de3a52245e6fe2cd08b353ad10ecbae0be62778fd683e72f0a57a0a2c15abf15152af5a4d0f1928a0f19f56d97cb040cd12faecfcef77afb0131f659854d7e1d11d45aec35016cfe63676be1861fdada7b3e06cfc5e445465668db7e6ea04b9f3d416e2b32a67efeef43235c60cef7a1d637e75d69e272941b9e7fa9e8d5cd7913affda7559d730545a3affba12bee1b4fd41a183a9e3a436c7206f09ae054d1fa6fda377436b05a84cef070dbecdcd24ab29ee82839a0f5a6d828023e442c89d9d0f83e5262bc59635cfb1b69a4c5dfef1e4c01704b954059a7bf28f5177e5002adca928c8eb11378f84256f9d2e0c448ff8ef8b620486c519364699a6782854d1fde38601bd8238a7579a4ab48f76e130e21ae116b5b4ebc92a3c1820f7621f77debca28535b8b1ae4859a5e720880da0a5fecbce76c34d1f5c5d162d25c2869e9fdd4c7757fa575df49d094fed2129ed165945e09755707d7cc831c56d2db634c2c217a8372c30f26104a67060ff53dd6a67509b15acf7554f4c78a795ea32106954056be37d8d921d4da01951d1fb83c048f2b23418988f9c340a854b2f8a1a074544e28d3802ba49df810d3bf869c687ac8b2f3acad46ee9218cbacef65b7ef79ddd506ad4c58fd64f80a1ec53dffa2d26859007eb00e2bd97d68451a148211a5e034f0ca0962823540d460ab6d8672d3bd995c0a003b95810cb2969e5fb53cdf442ded68fefedb332c33671f103da0a9e0289513c6b14f23c8347418eb53c924a36e56849e8cca43a4a66b0c3817c770d3998d7f960cc9b7674826d48589b1e24d90b39d6b0411269227b9e260e0576a729bec63106570ee1e8dc091bbd55f4db503cc054b8afdbdeb5f5a67bb9b09cf5abe5a8bd99125280de92eed7c0c158ce5763ef55e91a5298de320cb118858a71f28e3a35fef8ea4a5fe59581fddd2fe8ca7fc9de4da62381b0223328e6312101aa0821a5c2da32c104a22d0e52e5b0d8827489816d11ccd9eeeb71db5feeb2c3efe8ccdae0a39fa714624c48ac81b893444b7890518e2cc6f2ba449000739d0149b1fee33d1ce58847493989e2866d619a408ffe4b6677ae4d5ac392d0a8edc684e49b1ce628f283105208dc0bacc94688238870450a711813ba57f1f75543569b20f7a14dfd22277340c12564e96f095df110ec851a9d3b61f2a03b78e3f7e33143713236569cbfbd992141361dbf2b61566303420667085059356e84430072f450a2005d940c6dd1dd6eb91afba5bd1f866198344f875fc3a5b246b23cac5246cc3f23e9b0aaf016d487d205bb37b39f94b255646df780aa4352b707b00a5b311be48afb19abb028215d01481325a48d8cdc05e5d74bd5f33dad3f2ca7a0292e74dadb2b6567f898da0fa584ccda7a2c376584831e7a86d5a32d4eb9820ae370497edb5ac7727f7d3f4de41abab70ea325b26ed867177d3448fedb5a97e57a7d3fc173f7f28022a4ac54359818c7f5a04243988d39662a8be8cedd8cdad07b1a2066994a6168924b1ba056c32aee82663220e244237f53fa30053693d9dfe83030ebf92a7f8d3fb3a38480ad0868ccced4038ed96e1efa70d466596ba71b0860b6def3b8f57e488cbf4d9ca8d3f63cc7ea6b318b4edcaa6036f0699f7a0fb7826a301c14e7730f4349d7bfb08d119a2c82b4a90c7fdceb97bba0a8fe6365382bf9aa66f8a2bdf28eab7d4035267899934bb0af330ba648a6a4e1aafaca90908f30912d37ad72be17b9f5ea96f9ec318e573268a9d1d7c2574cb7013794792152c979363009ef97e29e394a590d7c726ba6409ba2cb1d995d2537092107412d2784b388ebcbb4b671b6100922e34081740402a48fe9cf555dc3d7ad40fc354312f7c1665bce46e7ede23daba470e250f6a38fd61fdaed41bf18a4bcd0a3449bd9b87a729d5678b3d5aaade4242beb6dd113e801035458ec7b50361d709f3edbe9e9e854bb887eda939cf2d702984d4feabf4e167584eb37e8283b03ee5fa71d704272bc67811c596e6119b554e24b8955190a4f91f475bd8b1e93a6b264ef7a02e0c2ca08ca71b9a5d357acf6df24d56b8ae26b38009ea7def70759ae96bcd59a19abfcda881d4b70ae1e3efdf73f29b483c64c3e4b4685a143245df3687f996ed4fbc63bc83ac9e506f55594e375d5975371286dfa05d0ca0c6ca1c55f02c270f4460c9401c4dff12723d0897f3f7d0cc1d565a0ac3c7a03e29f29162bfb17ea9c99513b02e93cc7a2d440f7c35b8359a95c3cac55eec0b7a4557ffc0f2eff1a66a48ab705b4574fe996cf200dff7b4d19fb95f5596d9e892d3b4eef55b44a8bc2b4ca4a3281c22fa9cf34491938b4ff8887b2227cd8530d59619ac362e78f15b7ff8792eb5b98f1d6e70d4a7d4e44652f1489d5d88a7e39e1558cca6f6948d9fa8332e1c19ecc73c717f81ce417187d5edd09a16a2a94d523d7e0b26ba4650175c9642a70ef1a71c65e6d56ffd40914aaa85cf7b0a92d060ca04b877f60536f5acd6e2f1213cd60b3316f333358030888be6495082d66298ec3833f68c59ba9de182665afa53689988e39d67022f248176494044970a8b86bf1c593be03f9efc577cf138eacb4703087a3d08d7755b3fd830a1a233889ea2fe1c66afee017997a3c2af8827b2a570115e3ff9a82e1aab007010dc482d986efc4e2910c4da7e223539b922f06a06c802bc1b00c91abb2ab70d49f1cb0ec1db739aee3ea35a84d8b601c50319fa3a53c80a7302fe68c71228908b6bf61994c1a73287b725c46e706c99b8f481f85b154785c5818a3199a62fcc0f4397fca0b3ba0b5870d85410e0de1f3956ddf2f5099bae06bbf1b28f2fa0c1ff59ad94b83a653b1fa6e900158155778b14571a0e1d9688e6b1117ede26e93604557bd28c8c007e78176815162edc219878e9477629c1cc062bf0bd0595c3750f38a2f75d1cd101edfd22f78a008c0c2c34861b8547a770d6d3ee7e4fb689e856df9b8741d68892f40bfb4ce458e4dfe091d8c2bf4bf25362451c659e9cadeab1620e96bb733b0043205ae3aa856267d60a9bef2dcb9b575d8792efc1bc05597bdfbcb3fbc915a13a4a591302aa119531bc15b9f9200823b8d225cf34b8c04fd12cbc6589fd0b500fa19f930f5506da87c93c262b8eff2fed015c912bb4990b9f6eb70fdaa09fbf69fc3ddecc99e02c58916383abaa1921b4f61236b47da80547defa07ffbb630c36c7947f5d697d94efa437eebabc21b46b36d8c20254d19be11539935cb024e19af22b7e5a243e163bc22f7f6e6c49cf26938c7f31fe930201bfeb74c8be4b52e713c9d01f5b5d4663c00bb51e097fa89d95567e7657996d580745e70a059bb2356261999e08d499ed7ca54064897bdef2c01bc1c707e8c394f01af617a906adf35cf494fcc930333bbe4ef985d0f6c0b258b4397fca2662620054199e3e81686e7586b82f759e498aa86cea926dc68264df3fbdd424614056f24c9c01be5739ef9d582d6a3dc1b41f20420f4e4c6849291f72c5dbe93fe8e25c9487a6fc8551e450e48f9d631eacff02696075dfb3837bf23837184f76166942dcab9f33e8a4c37b53ced11088c20618746ec2f22015f657489ea2ed12ecd42a312698af850ea2ebf19dbb9e7ec01b2a64a1468e43730abacc2cdb136ac74a72d21f0f10472aaac1e4fc8c273ff9e8aa5f96f36f9e587bd410e3a7e2ac3aa44dda79974813391cd1e2b433485cde9340cbb77c5fa883334d469b89923c80593e7fab86660fbdcfce80cb2de6238e73bb726f91d15a23e34d1b9e9f1daa8064ac5c0391d2da4789dd66b2e50659fe987e7433b8b1321a0e0a5d55542071fe2400b405a06653921f0c32db69c11f501d38faabd738cfedcc35a1ccfd34fd9ee9ff7a22a564979ad784a790bab20788222b56c2f211532fc5341daf36bdd6f7887e1a2922799127d6ba750abafab9772a674bc3867d0b8199e7937803650fe597d6114c37d11be49f2c699c499115467a1b16f0b7ed17a8aa90c31e01381bda803d5ee22f62f9b68fb0af3a7ec5d60c956df5865616a995981e0306278102b4ad1fb047a504c640be40f88facb053f2d543c173c642f8c52474f4ee81e5b7a142567cead6ee306371da72f13af6079c00d18689345e6c1dbc52d765d161eef19f6f1e024c2cfb2fd19a78743b34e9d4135547667bb2fa11a6a31ddb74a7034f6c652bc50516d780372ff25ce601aa04acef46e096998ac3b33ca5a4946638f56d71098a84f5f1e465f9f33e6a6607904ea73e027d2f793c4dc24c767472e94f7f386dcf14074cca1e33708ef539d20e3443a470f5c9539e59dca5ce54fd97aab167a3528fb65d533582bb50af7ec3276e6d77059acab04f2205cf5a91390c9af0a359d804ebc99cf79f9c5db8c16e339841dc157d40021bc8f9e1411e852383c903d5a5841ed1f5a9f53ca38db70fe3ef878e9fd19c5a1eaf9e39ef9eb243681709be69447e8e80b40c82ca8a5c745423725013227d1c82b1791aaa7a1b508b8856cf4b671d0a21de9f2026ad6d0a58c4f382f004ba11e9eb55e4b58611b1bf70e821b0e50401b12a87484c98dfec6c5f2764a14f8b4ec70f8a6e1b8f3690a17b4c201f8653010cbcb0c925e12a1c81c56e56c5214930356a0548b2e56ee9518aa4a3eed11ae6c9fdf6c3c93acfc1a1e1e634151c2e69c72fb5a2fceca25dc1418d850cfcb1d771bd62e01b4390de8ce6416e1601443ecdfb0da9f56a6722448f63e92be39c587256dda6bc1ef20e9b3dd26cfc582c27050fcdad4752842c68fde370701524c242d43a36f51e2ef18e559e35eae3cce5cfd9d035b73a5c4341876f2699027ba2963bfc07ef4e57a0fd99ec4bb05f6a694ce730932397cee5f348a1705a007198fdb7b68d4122d69a795ffdfab08c886ddcf82adae36483af83d58f815643cb465947bc158d309c39fce63e366603cfb614ce7ac23192bdb2253b2c184368c8ca40cfcc2a6daec95d4f8b10e2d59fba2f6cc59ebb5208d7ab9c8dcaa8e830621b43559d6de5066f2648beb38a77ccb00b5b0b0cdd79e69af56441afb51614428075129fc4ffbbd9f7d080b0a26aa90d8524a7e3ff0a201118130fbdfd07d3389aa314c06921c9b920b856740f42a67837928003f7107a658c58ebf9c1825b2d30511e073f8d126b459f249c8643f243858fc422ed79940a96486188cadf73034fc34ed1d8741f59af6acc17b360c941021881077d59a9d5e5ce0c089e14f420c8f3ea6dc0436f4b32c63b128849564d8c91714b1f1bbb175fffacd1205fefd25b133e716fbb023befe75b08111745c2ba229ed252bb71620608e06b91166089e38df053f36f67af78fa812aa8a6848392ad69343085819cf58454623d9c6055a4744f402e916443250b9b61473cd5fc26bd552a3216f76215e864b09a9eef72da2aa7cf546843675f95393815ff8affe6171752a9968c3548280e0cc05fd55d8f47cd08e6e1be86088949f1651c7127e5d7b2c98351b5951fe88f189a24dd868404421e8bfbf93715b34c28a815cab22dbdae7c9ba1cbe58a22fb298ed54b4839a1127832352bd774f11b422ba56edde7d805bc095c01b5ffaeef6f5144b2dd5d59c3f4c8d8859487565f1ecf8b7c86feb135ad5e869a2c6eb42794b065e68760aa1b1aef911c87c09ff41fd43c11ae442dab881dd01b61210fba28cab1506ec23dc5bdeab147e98b90f22435cb4de53e25e6460eadb02afb1c5e7658ce2608092923b8941a2f323e9a951186002d07041a4580c883fced5cf5c269ce8c754fe4de9da54eeaddee0753a816134325423110ae8226502970d4949380ed1c0ff2c2f08902371c3ff5c700288a73fb4a8b18f1480971c202693eac73a09354edc3eef6003304a5c2fe04eef9ff321383219217a71b389847dc60bc07d1f5da9769f2692b86e36c73c5e02a570b48b55a16ba41da8514792c8099eba99b652138dd0ec66ccdacddfd1900cfa8033698e0d74f72577bdba4fdfadd229618193727838e0d305c3d1e46eae29e886908ac709c6814f8297786f24dcf8cb00ff8ed539940d56fc216809044222a4d14ee30e5547a33925aaf15befc680d834318f7074aba5a57d9827f5ab8007108664e02acbfa627e3fb4d606e8b21da6d80ab4abbec3973cae03589fbe88e0f0108065eeace7f18aa748fcd817c6c3ac8483b9c8e1a1dc04af38319f196726842901cf7a0b1bf02d0b229c0effb2a1371729f4495d2058862af597c10c8ccfd8d85d831a1613cd41324f958e7636b3ef0c2b019f396cc82f8b48333c5ca1f576085dad6309e450407c0a43f6ea6a3338611d5136f8e21f2ab4b9b01c642a1d0227400aa2b5ef990e642e0803dce65d8316c97ca82368e254e1706890caabb4b0c7702f26f9123f4987b68a55f46da135ad653cf3848f71a70134ec966d921450e572f2127729f5c9f3dc9536899fba778456c852ee1e483af7d353126dd1eac7d81104123a97b9a9307248fedcaadb78e3be14a092f66ad7abb7ff9ed54be8943f210f95214674f8672466dcb6f0c314c1c31c0b145d45b48e95ec31b7e027948caa10748a76c4eaaf2835ddba9d92793834274e687cc566aea512acc3b2d43fe81439f8ac37f63c97ce089224a4525505825536772b65b29348932fa8c0a408979ad6a4846d70ab90ed10ab335c43a255df562fd619ed6914f0fe39a202c2c65c2a18a80b00ca5d5ec51b66eddf60f0372fa6a3f4f5b67ab20fcc841f65f70455e190c27c53360a8a10beba9670b3bedf28a1002600efb01705ec46da167ff1fcf00a08477414c8a968fc64d1103ce1ff5bc9e63d1114edb1b0b35fa841e106f9c5a8139939b69b994236c4b9566d3f0ca2f2bc5d7ff764afcf29be517e2259d1f4ca22da64beda4edf40505c6c370703f3a18cd8da94b3c420603b0d19f471096e1fb752b7d87b7fd89f07f0172c0f9c222114523eb6ebf753f125a442ddd9e1d544e159d6ce7fa7bffa5b903975c8a288a6da0f3b14970db0d2100e64e57e1f71a9d796449a294eaf685a7a5f1d97ac7925ab167da367ec6f4ac6e2fa9c7c5d964aa6e4600095d607e916e3dba588a6b0f5f638e99114416ad8e31ae1b3ef37244012340527e1a87037c439384679350c56df8c91aa0a2b08d5b2fe482616f92067e122d1eba3ac70a0af65f0e0147af3c948b95b50a56392d439ebad8c27be7dc3b4ca5551ca5d4d06540d8b405cc9bcb167001d06884068692b21ef868418d8353502ad4ae78b4d1ab066c7d40a93cd53035b1943e1edc28aa2c3c6a6486b1a193f5f8c41506426b9667e32a7be16ad58754926ea6c11e87ace7b72713746e38bc8075bcef2a6fe590e0fa146a7de70d36e4e1dca59ae0b64184c753508a5b03d266ee3ad607d67a5e48a238a0f74557ddf9133a7a458669d12a2c9f98dd4304f3a31c26e88d7b75156d810fa9a8d9a03802f5e369939a606253c56d2832ee11e176bd5a452144be2e3bfd19e0022651507e10ccb42a4b3ad4f3cd18e02b384c9c7fdd18d19109c3b3fdeb6b1c7e73100636154b22ff4b1eb5396fc6084c2d1d33ab0993c0aa3a6b4224afd6de9365166afcf36c76483562cbf70a2e912943468ace78b0f3c79b918575f8867d443c1bb4f063dcc88178cdea23f959a755e7bc984426c330fc55674f9720a956fedf154e8f599927b06228bab55d9e5f1e68be5aa917fbc483ec366f912a67d1e0140e8f85439e7871409a4372726d0bf964cc282c0a111c3f801a8fa79b78f75b2ff94571abe7261f29f43d65ccd6d4bde63f61b56995b59cb74be34d0aec815890f2d23db6e022a4527f5e663ff7a4c01f67d4de193078f20fa301400de418ead52b3eab2ceb1f523be00161bba3ff82531cb9c15f36ae8d9aeccda381be6ba6c8b8a3f98fcd3f9cdb1d814ef6d25d480d75a3477451e96f5a2b3804c86db3ac562d4907badb944bc82a98f4ce2bd02d910b05dc762f3f53cfa0303ae7cd56b0dce7285ec9f2b7d3160bd516558b1912d906bee73ad18535b87d892838482a8077bd8a6d690942e364db451567c496bf0d4b0c9216bab94b0776ba6d000e5a11d558488f4b9db407fa4546c996596830ae0869c3de6bf3e915ec9209607666a7efdf154df2d0d49e3fdfc4005225a5f131789b639961b5198a00daca75fd773b778ff82220fd46009b8769b98b2b07cd5901dba19bfb3636d8b8848fc26a26b73a0db9e4a3188c53bddd6045217ac4aaeeb6bddb64740bb38ee3ab7a9ed21ede92375de57aad9cae8b6a5759cef5de91ec5fb2fb2f97af4cd2375dbcdd1b44df0875c51f5211884e904c8e53b6cc1b7c4c3bb84eb666c8cfbba640f92a7ed3def365a535cd69d34b889d4907ef242e58b16726b2a17eb612259041eb08668ac53fde5830711a5ee9b6372aaa436c00f8700256d932d17ab451598b22e662b535111268a9cd46b518a27f6992bc2e1f5510ebf4f14b11232a393866457f56dc959dbe1b2abb2e354d6e89e10c1ceae7956809754ad0ae1b148488e83baf285a18a43036392e43610235101b01a6d5a313e4a754b6e776115a863a75c4e0cde215a3ebd782391c03923934f7747e51765620ca76a683936e2133a60cd0b370dde8ef24f95b73cfdaae5cd50995e94294ccd8577c3698aea97b3b5552418a94ef50204e9850bd65b6fb4359b4596ff41b8702c6764dff66cb68a59e0cff9d245bc243155ef7c173c616b679db270efe26f8899e1282d2c394a231933b41778334a3fa006e376704999ed708e5c7f6428360879b30adb21572463bd6244bc82a2673895a3bd0e6b7c753b36fece55f16601d605da3700c0251076bd1a4e68f78c3f4be24036b9a77fef2315a2abff1651692e49ae1dd9abf6d973b333f752fa82adf3c7ec4e4755e26f1d448b078257679df6ab1df040de253911318cbc115087688fd73776de8b254bf869a881fdfdbad80813e7a83cdeca2d6dc9ec359d54176be5a1d115a4851fb819dc2e238c4dbbe88308f604a1aa8a0d22df93cbae5a5f2090af6964d74b4ed42a940f3208ca045b79b953d9654c5f9d896b9164a16df1d92505bbf27f0a567cf02d5fbc9090bedb3273e0a0eaaa53bda3eeba46e613176d5d8ff22770565d83f3236ea2aebf5039e99baeb49efd2c91c351ff1a890a83ba8c37692d97eb1a938dc5132488e8bb8a169ffb4e83af59c81c05b484c1d26c1e97e667622836691fffbac633cdf63a7a8dae4fd8a530453a463683e2c7567b487c456230494979a0f5f6a151c3a6eb43cf8fced8cce4b720bf753757830e49eb34761b47883856827498858753bab01712bf52c8171df78976a072fd71aea05b0d6bc2aac960d1e471cf15e8b8470cd628ae2e60df9412521d8900198dff6f2b80960fc6fd1979afb7068ba30dc00d7dc06ca88a8e71fb05d69b4b9a8082118d4e5adc14428a7e5b0d06f9dde3c07a10badde7ae630441d9de0ad45c129af6dc6d6b7f2b067be36846ccc6f8207f0ec597fa65913c1637c5952ba6c09934f4be1c50e980d4d5abf9fdf8fec97151554bc3daa4d8b263998ebbfd79b67695161923d20d627e0c7655bf81e6c2888dae75c0f44caf47af5ea38f80c6b9b5f5da0143d8a4d46115a3f40054e3a6621337879c3e008a492d7beab4ebc6aabc2a24661826300d06567de5bb4efc325a536880c6ebec7fcba8225bf78afa2b70a4615ad4aa12261a60e6716af9b3c6ce67fd1b3133ef50447b84a754924621b487f8413840b292bdef5c40c89da7a4242019cf13fbe6e1c4925280ec8db2035102c44016cc42bc12ff7158ba51a19a4331cf81c8d35abe671cd6dc1ed7524a2463f5385a7b8ad911cb1ff32d13d0e7d8205c65d1eba0d512ffa0496ccd236198712a075b9fc4690cff9dd72dd5ef208612fa3f7f7b88d1ed980f6534fb2e849e5fa154467f011e84d86918fe9542d76c3bde34684fda19b7ca9851d3833c0c30a01af7261df7c9ac3605e9cc3a8d22181f003ddf73910a5f69136e360e05cbf8b8994a1e9aefb4f2181f43a8e1bbb2e283737db8b12aa8acd3d2f59d1afad435c001c70cebe8b1209c1675591ad95d694dd27640eb65526a6954eae5a4c7aa382f6d590c0d6d4a87d50fc7b8e9d616741fdd9d53114e467447d18586a9f048028bada56b61569c37332721953fae595a570bae924c2a7965cdd57867b337c6ab03da5f7b4ab7e386a16002a178a080abd65f763b8c7bfa10d9136ccf0484e1f8ce16f2fdc9bba29e7f1c7758714ddb2f46ef95e696f555118bf666b769391e4ff066d4804b4a855c01cabe6c367245b18804aba5d045771fcf1d88d8df19eb7216dcb02244a2eaefde4cac5992fb25cd6923e59636c53f03865dc63d907870432e7ea76a3536724bc90530d74ed7be3e819931a21c51606e9d28cae905f617a83a9ca20b711773f573d00d03283acf264baca200534260cbc7ad0f4b8d211c43b3ab2f0a49dc9b238c10fa5e7631acc3fb3ce6bfc89f40d04eecf60c456469ee96b8cfb763919bea01505a204bfbe5598b1ca54b5952c1f0e11c473408bd6cf13944381732cfd94198669131dc954ee9dc69a3e14b0ef5c743a664dcb5f66c9a418e89f2b9531afa95113ee5f92680783aec0bbe81c826a18a09b610916f85fd7810f0c015920c031d8d8fa7c31b64378d93ae4db0910a1b93d61ce32b6f6245b829f3695d41d72b628e8896cb95ea886be023be35bb7d202b0a90661846ee9de550251ee06aa56bb9a94c29a117ec41ca1d345b1affbf22440d9e1dd0bf5a6e8ee62c72a68b234417e222f6e300125873557b878cee1278f963153123cc87d7d7fb02d6110aeee5060e1048171439e3d0e6905518c480c1b1769a3e94811bd892f528336c08ee368e57eee5ec7b2492a8ef3b384331b905daf60e87d0d3f2eae621fe9c9563ae76025caa82f3a8019dfe7e8f71be9fb2a0ad8968d20d892c9c9facdb140f73d012b0935b5d781f51d370d2c778f7231139e6f08ef85333a39eaacc9164fbeb7e85348440b6ed818e64908928ccea3e62c327b9c2c5bc585c3825c7155771dec4a7ad5d73cddaca2c3ab740a409c8b1f328f3ee5af4de3312340cc8a00b9f0f0dbabe98c3ec3ecdbea63c0327d6eb45b9b031ccb95a9cb2767e8b2f1e51631c9a43bc5748f88bdad63a86b94a14d9d7e1a06de5173de0d56aebf32b6d0f8bd0ce3b26ddec2158a0c7a6faa4808044de9e0d22f04f7f8106c6c6d6406d55c6db03f0620e33a6ab723e23b23e48e1088b7f61b925ccb01aa1e41ada27babfe2fd84edd9a57c5efaea5a3cba191359e0638c5b5f238eaadc6d3e7ba2147ea93b2d97557b0ec89b8b0983eba44a610684531beda3b165cd7c7783467a61095576f1bfb34227e3283ac8de9972fb90679926fa18ab224256c06679f7b8081aa4fee1311a3adb4c3a241f56ee9fad7b28fc5e0754cc6815325f4a34f57ec3fbe04538cdcdc94fad6e814b272d503721889b1858dfbf5dc717c7b02040c24f2679d2bc61dc75ffa92f7bd735eb1fb7cfb38fe5a5a45c2356617959c43145a4329e52f48411367442a9a7e6ae929eb3adc338fa6c3ad6a8fe5a8f039f2a23af7fc33d4f643128ee07b314e8c5c04b08a267cbb5555d71d2964955561f64fa84703d7d04e1006a0a1a8e977134d7e48175cfd4ab41941dcbf9beb3f2539130459b42d36e462753a72e91af4dcd025c6b39e3840b82a897b0d3672383e08f31002fefbf3980a003db96dfb97827dba69bdfe13a63fa39662cd37009c73100801b15a8ce798897eb0853b2ead930bf542ae2bb0ea0777d82208ff44e3126f5df53367bbbaa8a4c3b9f088f6bb219791e7b3ef7f4e20285293d56f26437eb8e1cff8f4798ce693faf907a803042c6244593e0561904d087d097f0c012920413063d87bab79870ee00f2294dba984858756635f435301c171095b15cdc8d27926d10e99fecd28316e2a4a55ad136a65019812bc96efd0cc741e7fd7053761c2c2d1439a0fb43305e76775a7cedab8b5c64d8c4610da0e7984dd5cd33943f8d28c51dd495e26e403083e83172650d664645c1436053c81260de47ec4ad6d28cc5e232f2bfb495060e0d3cefe997e3b2c2dde7f26b50ce22f94ecf0b96004976941ecc25396461c96601bfeb72a33366ca6cf65e9fbe69d97d7050dfd64623590ad2ca479d420cd5c483f600400bd81ccf51c6ece03bdefdff4e78a81c818a35b097327e44e840b57770f6d1794b2dc2214bc73b406f34715afac4047ee11dc5c0ece5c5c76d7cc9a9904de3fd0d6ee4371a56b141389a822c66e5747d9f2f5fe7c5224a0bff2ad808b214ab167b9c5f31f75ac60a78fe0acc33f12ee1b7d2ba7ea598cc7b6f12279627d3df053aa4259db989969190cacd1cf00eb7d252117582bc781bd9cfbe327817cbd093d6c753d2c123f38eb51d7a26c6d05fc03aca6dffbaf250cf670dbcbf956c44eaa01758120f9ddc9a50b765e683565735321e5a9ef4a45899e9457863d12b3ab5546c7cf346db92615728fdd08d17617e7dc3951d92d3f7ebc19fefc327b81a0137c5ca13375789fdd8eda03bc016595c7bf67708610ae78b939b8ed4314657630aaefa562601184ab1d50befddfbe3b5b9c83e3320b714d20800e88ff46204c87de887fd7ad12bf8b8e37cfeae91d73b6de6e766d7bbfd8b4e3866b61b9b00d3474572d9be074c7115d530824cb387073756500d03e666f796d2fcc8ea8d24bb3670162168320ce50e3ae5c76a346a7109afce5da1305d7757edacb0a5779f54c7720004bbe82a893018c1ce48cd1a2904361b6e62065a5beb8983f1a97b782478e644767a1f611b0ee2cb4199716ed04ec16e80b6bed883fbd0913228ce44c2faaca78451e723c69f1fc5c220dccf1db032c327ea06de00dd2740dcd5d6e55dfc1194ea6d4085aa00c115817e72edef85f0af9e320e107af4fdf671e1308c2ff71bd2cf616698de9e9501b9356baf5c443547ee19c13cc7cfdcbedb5bff1c950a5f554091a85af2a89bb59b1afe142f956403057ad18e59a86d65bb5516a5d0d33551af94826f6c9e0c4b159ac6154d9243ea01da91fb9540f19e42219e1acee909c64882f6c108c6d380673743b891f053ba14cf20757eeefd8713b1a139a512dd8d03a0cc033ea516bab3a109fd3e10ec9e68318a1d0e09ece3d8f4988aad4887e7d11e709ce7e82101f17d8d5caef497942b3c08122dc9450ac7f3260f25f0c2abc00a58b86908de57378474cf5796ca023ab3449914e2ace904b916d03de348b82a838a743c3104872e8dddaf7da944e205ecdf987d266a0f20af547910db7f38a35e015eb6bda71d9b4cc5f8ccbd1af6c27d6a151291afc0d872c7568aeb7d8b4082e67208d04ef2b53049d8b942d7890fd57ed5d97ee8cef63a27a47119da186d608e733723029473392c2c8b0820de2cbc14f46b8a6a7493c6e553553cf3371b62d75ba481f742fbde81e911efb7b96e0c445183d1f122059b902d135274c1a12848f90dff21318aaab97a2f1a9188af4d220540f49838f5211041f1dba8a548cb7f6979b38d54650ce92ed4dff9b3ad3fe01334b2f1074c5dac6f464b903ac5fbc42c296bb85b7a3215bbb50c773f997ebcfa1f284e6712f83fe68f40d29882a42eaf700b8283faf49e1be99fe216c4e047a13bde18dd8c5731cc6d9d982900b8bfead7115e2064c9ebbf86183c942c79c7e28bf434f2b46263c9a1a77833756e1465de1200a2b41f05289451bdebb46ff93a42a7387f08ddade52d30ba937fbba67b87e0ea4c61cf7b8ad54a6279265f53b18708275be704983a35e08510a32c79cd89ada77958ccdb56ccac70dad38fdb0c0d42e5b844eda92dd94f6af6ebaa6899a3cc6a01dcf3eaa0be482f140acf209bd5b91f6d61f4622a7fe68e243cdbf9f0e7b8b83858109fc1de75c8b2cf1372cf1763d73bb8e071e8fbb599398ac02e65a1f0c790390435e480bc4f8d12799a13e7b46cbb0cc49c092ade5e0d8ddbdc7f184e164255aeebc724b38d49dcdc3d452a8a05b1ecd5fe647863272167904a376adf5c1f0525fa26cf1808ce18b25a2f4fe26b52a7ac5cb45a4f4f626b62af2cf5e21b1ceb398a882733217aaec01ba0d5da27518800f15381334726afa0e186a660a58094f351ac98dc1b0fd2d91425e2c808a57d9901498154f7299309c0e6cd71c6683de28836b2c45103277d0b4b48b9a82fa8769284ad490f589f5e1dac007ffb1f8205db389f0041b1b4e27fb434f325da3e00befa06bd733a5d3636ce1c73986ba22ae310c70f7d90dd8bb908f8637be764f458c1f6764c2642b9ae9833ee29773fe82307c2e81c65b274ad8f8e5214accd0e2aafc45530771efed5ef8e3a360570b0bf257d3580019cec03e14b28e196733895ce214095de1eec0da0b62ab99e2bb6ce408b3650cfbb4be5dd9eb17e60211bdcfcda3d7679ca5e7250806b7d8fc34ce909c0773896d2d7e413100b3c51620c00abd44f7aafb13c03217452894f46758557a3af8c0ca14e7352025d7b88fedd88fad7c581113137ce935906c04d37e790f58bb1628d77200c258cd47b4543b8344765a6f6a97b9942dc34066bc3f6a97b9146dcb44eb47101c33d88634eb13db3d70b812603824d6d352aaf03d664695dc6c7b3f626e255e90f00657acc05c518275630e801cb80aad12c92ff965ecdba8019f0f3df4beacaa423c7759055398408a494843b586d4c475a02b31295bb957ffa020c988b529afad8a037571cfea3523a8ea05c331246a53302191c15bf037497d2dbbf94bbb2ea48021908ebfb95a0b9c0c5d782e20b4b908a98a26b73a548d0e88ad33a44c0f00ac8ea791699a8188d620984ca04ad411294780d4f528f47fa68a7f84692ed16ce3328422f388243d6907b94d076cb402347373f6e849a2f5ff6fc12a992c755d3067f8ae4c08e43b1366f93235266779d54d063c6c24517bf008a1f657343aa1552d3dc5ac0f22c3559824b4043ad09281e8543d90bbd88d8b7e05201940a0ca9f1e72e8916616035abc7333a5273e9618b41b0d81cef8e9e50c81f776fd8249f00646ab6598892296a395a51ba7dd843b8907bb34c3a2e25876482fe1f8b60198859db033d91fa583e418d8253655b9609eece4a933ac3214ee340700824e09f4c8aadcde30c3db88274a29a63f43271c30522809b73726ff45a1d45011868e0daca6b36bc982e1fa9e8687c71c7f2d22e9ff919c28d38234b44bc0d07e74a1da6d9a380e019504c53f1012a6059701d8c0f1fe2ed664346a92d39e9e2b3697ddb590ac7eb149c8d0b7c15ec6596d913b89ef0ccadc8b30d1e00a3ef7c2f2860f1a05bdb19a0e14d60d1fe1ee5af9e1082a557bf29f20b2a37ae0b274971e3279b8d3d611f3acd8b9fc7420d0a7197864c47e409c379be03c97aedc94cea9a0c2bafb9e4d0296a2cf12a3a295fd6547cd819c637f693aaf41d768cdf33f950490dbbb0c9bf8e6ad8d76397de47094c4b952a86b72f7dc034314ebebf9e639ef498a13b7dadc79ee00dc28568948daa0d8e1dfd7942897f74bc9bbd8ced31cea28438403ec4d6fec3a79c13e2ae17e7dfc308b26f8daee31524efda5f7dfeaacf462f2a90fb3ec43a64289129c1664f5c11c9db90eb419d93d11e23837297c1b547b1a29f4f6f5f189245ee4884e61849ea8996f08c8e0bd109aed93c95706b9c0542bb95cfec0ec143a202e57d517982a3d9357fd04d1aa5f2818fd14699202030c8ae72facf156213928c13d241fa762a5ec4f2c796739542f67777751201c1cb3099f93e5077d5f9df31d6615ce98d79537761585fbbe25bc65ed716fd0af00d0622cce848a2a64b2cb833afce97e5a259c469e689048782e65109907518936c173ec22ab4de23dc7165fb676ac27d6f4778ec17387c812bd73f8609cecf48e6eb831923fde8c9f6be1994ab7ec53c1764cf0f394597aeaefb1bd2b4f0cc67ae05ea8772137866c4a1ae397daf82e849ab76af00f5bff937902f37f8bac95d82367565d9f085b8149092192d34ac1fe197a9f4b99e1886c03195ae2e39ad3b3fd7fb3e3518eb1e8140b2e6bc4c239067b539fab50adcabf26cffa9452a9d0a47c63f8d94d377d8a4458e4d0d0f5cd366c7df1c3e9b89fe57525fae571b59add570733957a9da8c6d57c187ce5bada9f3efcc3c4e9b887b55dfd3a06b3920f3332748039a13efa3c8c25a613b5f7dc731575a4d0f040a41bca92dac218014222aab3af10cc078c83ac5f4a7e4c9e0d396d96b9ff22d68228a3885b92282069ba074e63ff21455a2725b7e78fb8b542ae865f31bb46e54785010b3d87db2cb0c44e2313af4ff780055b554ab438673b59d20e5ca835960231d0781029616991f811c0539530edca704787a710d8835502568562c95f86f47c9eb95776e2fb5a301067a4d70667134b448a8cc330f7df046e279779a7143ff010f5e61f07e5c579a23659dfc45bf3e96111708b8c1262966385b7ede95a15d5132af34a3a7178047eefd14feebe7a0311201c3e9271a1e5c00eb3ac7345dc8e0245a4360bdf1098916908114333336a7d396249992eff8ae96db9e56637190c0f9446e5a702f4034ddb9e54e9c50baaad08de0ca1648e45a773a41c954d8843416beaac5f1305ba6f377514b4d2617c925ddbb4353b65822ca124b7b4bd36ad7e2f239a9770d5d5d0a6c7708246c02f1f7b72e3b98d250cd22dc411072d1b527e2a1c7b4d7968e4b43292b688eb0a1d6a85af93caaa8b7ea23838e1774afff1e4ffb8af322d0ab827200e717eb7f23e3143102d1fd097368a918cd1db71b7a235c3186ef158740130da72c4a06bee3a2d7c059a9ea503a3c4d34750c516e35256bd3b0fa4de393c1a1302f2c3def297f9b8391873337b9d14f3f8d7338775d0da6586df917a284583567f1333a40d959d269e824c8b71a8227670c7758146fdc822819082f823e57384be7832b59565e34aab9955ae67af0b63cbae5984063fac305701e7734d079063440ac8c1f14522a37e2b48cca49d140b93c9779d3263de579b1e6dd70890fd402ebb091ad7dad99bf2b521170d8fa7650e58f631c1343adc2e50c5452ddbd7902247daab2fa1ae7d5f719cf05786c1a5c28935a0304df069dc0bdfee92d17604bce6204b089f6105c068928d97cdd136b47af87aa6276a5645dd29562d38c418365a58d39522e40952a580bc56af6a728ce0faeb557b36e2227f881466c121f3d387b381b73803e44b46c58ea67dfe32c381b12a320c0394e4b975d7d7fc6584ccfb72c1c52cae146b1206ada0a8d9ddb8645a869a2d9a7bb21f36ee1e394c7284b2514ae77c4782fd69da9ae3db747f52bb8a1459581beb786d6a3f5cf50bd01a20948e74ff42f7dd90d6184237d7ef8b8d9f5fdc2092160fea89eea42dc20efba09ce641ac815931075f161df1dc2da89dc578b6e06bf4b47f557f6e67dbd0f47b6b6018b8dcad4efa0cdd41477b0bbdc42be30d54374ef9c51f65c23d1105a8a7e158e7ab91f41ac632d2683976143aa1dae47edf8e87d48a2ae3a2dad9a93d4ac0dbf1146540c5f2a5e860ced1bcf62dd44f843da8ca5003a6649514a53cbb001d827d912921eb38dcb3080d9931ccfff847bc88d22a3f0d0301bf42a0f48718469a5eab4fd61e2406a47b10c991c5d3f3e901c05d422b1ff38fd677aaacc7d6275a76dd48d8c5f7e9da66147a6061eda109e87c6b054be36f2dd3b6bd89699adc29473271ac801bc4b4e562967c054e2be8d6f8b12108506a8cc5b50cee4025c4a60ad8195e78575a77320415c0561050792609b07b5b0456ef2e129d4ece235e131bb4da498a2de1a6ad05478f899e1cc60360cafef239648cd8b9d6c13efab21d4490df90e19a0c9c66e076d69d06fb2ac7c4a60135300fde6eb91cdc7162451a99a25eb9145497f4a4f7e98413b67cb1057dd7c239539a7e836ada95f9bb9194145c821124f5d68914a056b1d0527ef577dc4d2552852a09b4f76612b1e71f51806874564b9366f476e4baf9020799717b798af14ca3fab8fba9f9188b630805fe601d027c3a471ce6e454e36169f591145ea32d97d9b18e72607907d83291c995cafa238be2a8738f3969501d90cef7147d3a564916f0121b6e99aa5f948318535ecdfe4e9a834dfea29ea39eeccc9e9da1dd61534453b0eb12e0e4c5c853089afcb35ef710bb0215294a8531e909343e96c66f0b76ae8ae7146458245989d9a118a35d1257308f5fbc658a047f4224b0d5f1ecbfb8fad5c76d6d91edb39abe10d057af9d89d0af2c359ae8c574ad4053ad08fe7723d4ee6db2c2f5f2e986c2208abd909fd2cc8e4702cc5ec111d0f9c2067ef214ca2b6c7b66cb1591169f82982ae24f933eaafc08168a02a31933aa42f74112c47ca75811a2574a272c56a6d30e5ea1e1325cc01973d188931a830ebe86c374e90b7c1051f4de931c3c414e8e2375e5d737b2041242e043c0cfdafb4245f5d74e19049a47cb24748b8db88e9836242050a753ed5de29e64b8660dd0cd0192293c11e230c1960fd1544c1ed670a6cb8389dcd71a7b4accd9a3ffc01a47f51cd2534a1a0bf9936682164aa2dbf87543c6e25d176179cff4450b6c828ab5ec605017260b1dfebceeeb15c886fea4eb89ea057cc7bc6bac8ce2d82a44a2136338ffea019f5f1d118fe419bf19c62f376a6a399c16d1f1629808ebcbcc1969069d1da347b739bab76e17eb442d51d17f82cfd1947445b1808f8e50ab05863b39da71b2a24b50a45ed5b70b024b256d51790cf93e75d8faf112910e5d25f55994b13122cb298a0f851245aecd3e6ed384391c9c750b44bc9c3aa23c3047c042f9b30367a528ba71e12cee3f22befd69b2a723c94fd304c08c046019ca250073957c603f384c28d45e5ec6f71539248f4f37ba5f57f10e1b84abf5721ba186e4e673db5b909121e507f0e45f7ddc5476d046087628249d1266ef83553fa4ce4c679cbbd4fd387a96ef1629666b5bd13b0f18ae4fc5ad187078a4f6cd0a230062d3fb3c35ce6200e9129b8c5504f0ea779d8f1e157d248c27b22041c4d5e4a4ef92398af429a45d916b27d9a59e2a7573f97e1735d71495c589e476ac4aad31a6175746940af39c5efe23f094a640aa65b61698e4a99447e945491d8242559c312e727786f519abc49c64413fca51be6f13e10b683b81602acb41f174df8d47cb89cdf18e49a8c01ed2cd66b4be994788a97346c942b490cf1f2948f7a71f41474364f1e0696463ce1f99d2809dd696df0093b891ec753399d98213a2db59dd3391bb22e2987414e9e304e4fb4101d06a70bfc26db356f9ab99548dc64469093f5d9f4a0d8e4b06b1aa2910e0dc285d3507070697ad59fec43686ac66472a69698e5cb24ff318ad564fa7b60bbca64e3d3c9e216a19f98d674981e2e61721c04d390b549c67c89d9e8a555dea54fd52513a27402309347b825bf5c4b1391965261b30423a7586aa7928e5772297556f2285795623a15a25223909729a520a59092dc0713bb7d285d913f6933b52cec241f71d268b049d99d49ec149336da25bd812cc9f0a4d9119414a0e2b87524c95e48ca473e123bab30d4483760a48dac489f98489893ef4b2017bd67798926526402e30d94f37021f2a9c5f653633313ded671085cb68d79529ad525917c4cbd1a51808fce2e9dab3fd82166c537f5cad5ecd725354933f8256da3e9fd49dfa3f309f43859f0a108987b2106774b54b3831c2453846c4d739d595c97003ef03a3cf0d56d383e707581c26de03399c5706af057044b33230adf6e98387ca40ba9288e1705b1b94d387ca22ed4908937037a3d2501fc15038a35d6725a3090ba4a07b608a411862faaf59194cff3b18a9537d24ea9de745fc59116240fe5681dbd7ada68f40b95a97369ea6d44588e6c9d5528c0ad2ec227f01cc4b621b08fa8c5e3a0266b2ff4a10a6a5abf88dd7b932de596292529030407f4064307d24bd5d7f48c6bacbc5ff152e393910f35116a69ced695285c64dcf92c2c5fee7cef844c9d2c82bae56345892b39345969f21e34a53bb1c5eec00ab95511135708314588332eab6585c5e3865c1525b02822c1ad96882b6ac0b8c15eb844394137171ea0d84b94256c700b5cecc5dea620b03405212508262ca62bbc6a4f35efb5cfb5a9659a46b3e9cdcd5a78fcfe65bfdbf2ab27bb74ee73d862ec6129644ab90a9d8ceb36f739f8c5fd64617ede0ac6c5867e397642daade538b461211bfe21894bb7ab142e57df0a97ae7c661fdd6d4a6ab24a49bd24f34ad972f76c4eef2ceda9542af5a1a73ef575aabba3478fdede6c8332aebc93d22ff48f1f673f8e8bfa261eddf8b63fcbaf8ee257cdec0ca5d28dbf55fab0252efd5afcea55131bdff20eecc6f81f7998a86fe2bb997813dfcbb8ed65dc327ef6b7fcb8e77afbe637e75fee7ec2628f5256675dd9b55a1bbff0ef066cb19b77e8edd5e5573ff7cfdddd6f83a93fbb9b7da73fae3fabcb9a5d2e3667cf97ffb3a15f0b43b888dff9651ecfc065afb89e3293547ef6ec711fdb1517b9461ce99f67d28f66749f73ae7c224e7c9b24eccf67b13349c68a730037491619e95ff6f7976d73720d95a6346e8baf8e405cf65bd63014acc6ca56f0ac3533b9810041872c20e800820e6258114a33ad0f655428a1747c289d84628f8d9d96524a29a594524a29e54ba4d873e3e5cb24dec9f1f2e516deb17919255912876421d9817c761279a49393744a9254249408443635e170e577404a0b4823b2888cf11c9100884092c81c7e066244e6f0cbe6277cc35f757c61b51e7ca16d7dfcf19337c618a36ba9acd24d65399aae8683558d1c36379e7643b26b938389584802611a7044b1be0e3e16ba01631a7a70b211c28a83a4a6a2294d35380abf8688901ea9c6aa3a40f399e1380a0f311157ea54c6168587988869288a4d611bf8c9f4aaecf8def13021ec10dff09311cee027f1c37ae4015ba72dbef4e28d328abecca4f6526eb9a14b257ec5d78c296f6631a16128689ead2cea655e9c1950badc35b0f1c30e6a1cbabf90bbeb4be72fd6fad52f9bdddd5e13b3babb735679ba7b65cd49c20fbf5ca9099bddd804441af4091051549a80801a03082cae6468d8796313104ed40ca734aac7c9a4db41ca9017988470209a010e4e30181a020316424398103d71430c4549d090842403111036043595200a94214d9e9c0c8921a8088d864c4b1049644b4f2c8d7a411028c01204161c374e21840b34d866075593ef00c0d1f1cfa552a94208a1c795ab95cb153d9b9487c9ca5183c58a59d7382d9bdaa77de19c4fe767d369d024bb7adc4d7573b7e9cd736e60f39d55cbc565d333a7ee349bd3e59a9e3975a7d9f4d66a7048222430f788917b6efc8fc5aa9525f30ebfc7c8eddedd3acc3f6877333333a5b981c5165d94524a5fb058e479cfe8a4b1478b3511c7c5b951a5c313635575d55aa329a65b4f083d52353ef67edae57d7ed5e2629cde59fc79aed21a4eb09492a5ec2dc6f84d9f9ec5166d98e565adbe60b1a79b862356666e66e64a9d6ff34bda1591b5a613d2cfccdd199759b594466bd63d6975af547677b7cff62c7377ef9e5e7777773b875c08636477777348442dc57534aa8eb3a2e3b82a5d2ca6e2a2560315e5bec2921faf392704bc1a5c8bc562526b58675263a5cdba69b43da35b9df3bd5b6705bc85b06245bb3047bc23ebaa5bfc626de3624703f59471db0a3a30d8e6fdf8c462345365a17c851faf17ed3a212cd6fc7e9aa9af517542ec538db882c681ab33ff99545ba159ac9a7d67b552af02fc6209f08b57e0324a8f54434d407889c506c2881a2a6134018695312c53d023615e90420467aa6879810a6230b941162a3670c2073080a089514d805105132d351c25b144071bc218410c2b30a28ad309b5c2587063e45c0a2a9e60c2a5154d54a25c7eda850bf510c6fce01de94ccceae54ce71f7f40baccf549ff10c3ed5ac3375d11382e053158e2053d08f1c30e5a4425b898a245072f94ca6001b6ad5578a14273ce2bd77a32366c591e093699e0c8b954185f6e4871e5cb0d2976b801831b47493b6c1121eac68d2b57b6044161038c15286c8099a1e36c1c25cdf082131b4c36acb49395179a6c096fdc1076e3ca952d675eb061c5ca0b3eb67ef6edc3afa98345c2908abc3ee257d19d3fbf566b670a7247c27406107bbc59656c17776631c2fc285bc09af6b1d89a6519fd1acfaae8c73aa113d27df57ec53bbd5a518fd33ee48658eeab8fedaf2bdee99f95f585f56bbcec8414f7b55a9b643ebfe6771e6bdb366fdecd37202ff7b21342f3b2a3d9382fde154299f22afdaa7d5c6543fa5d7e391b7b74224ee41940bc99df6a759d8d1bda80cd2dd9d748b0cb1f3692d26606162c58b0e8b0e0ca952b5744888a93fee49aeb29a3ddd0bb23fed24c9742bf8c7af2f3bdd8c33fe76b806ff8578c8823a322cefc2510d0b0fda5bbf0abbbbc159ff1b6f835a558b90136b0076a6d017d3e823d1f3b23b10ff201d98490f3a91071fc833c104c892686c0201ffb1f963788c75254b104fa784602c87998176f100f4806d120490954a2dd00fa7c4639bfe5783d6e3ec70bc244e9c69ae701f1c63fc70cae3f085fc80ae3fae37cfe3fbeb086aceb3ebc1ede089ef38dff8dc7451c7f494502e9628e3fabaeffeb0b595e0fbe505e0fbe5dffc3feae2f4c422f8fdff1b253808ee7f1c5ae840fbeffa73d165c2fef4f07e07b00b8bc25f7032f4cd2b7fffb9867e3eff3b1eff16cfcd34001a08441031028f64a6c90c00834ea0ff23ddfa2c286f4bfa741bc136a673eef5f54d8f00727a157c7ef78fe1fbcb3e3f9753c2fdef76cfae3750f98ec70af757836fdf5d36d287ef1832086a5421f0de217bfce92cd3ea4412900f9202fbb1408f03e2f3b233d1fe403cab4c801ec79d91989bdcf0714bd24d1a004c6fea75b5ebc36de929bc30b77e0f0c22886e5850c832c2aa241fd144e3045e1ea86f3285cd17861d779e1d3e52c1a1873f9b550164d4a83625e8fb78101637782ffe468101d6a9e0928b1431a4362cadca006203f256a9e0fbee0e288a0274d9cb002e4a741fc5468030302f9587dc3dfd3e380205f70880209f0c5bc0876191bda54d00efbe0613bbaf1bf6c6040a52730108136fe95c0d7c53b3ebc13a3086aa2907b5dd6892979cbb073b8fc613f6922de8951b880c6e56f1e78c7add86668a2c6d239c49e27bc139bb220f14ecc822fcb21dc45d161088cd2ddfd3b50b04557363d46cbd280bf3c0191961b3eb8710a2c48b878c52fb731c2401d111851207f11887301d85fede089ed2d6e2ea374a7995f0accea1bb03d9b14fafb06fc69810d63d3f5232a380fd0921070698209e4f7088001fb48bcc116238630d21a02ec8f79bfbfff4f3b331b19200a2bdf005facfce8deb59ba3ab5616abe5337f5ffe4225971621b927f7b296e5a3a3638027acf38e9c99cf963146692d0cc6c576262ce2f0c3982a957a6de5d9ce1fc618b999999967185fa831738cb1ce99d1d4cc68addb0d2ffcacf65cb76619b59abda05d7aad53a49c22e51429a59453b6246ae6b365bb7bff64ed48751d6d7524427d7c523537b3a6cfc251c345d5911c1e7747079c8ed3a6e394d2894e3a3a3a1ec4094103668c2c55ccf0004516284a4ddb132254888ccad4c0c4851958bd4286098bc174624b7d138da0a0818809a6a46125861fa6187191814809a09cb8f04483926d628a2b3e541858afc11250c6d8eec629ae30e1bcb03434c8c49051d279f1bb4b0271c91cf91cb75ab94ddffe422565748b5e9f3e373abb7dab3ea7eb70f64df339dda54f9fd37d4bf99ccec1176bc9b031245a2d2498df2b9668c51063aa38b2ad238670c2459e600b1e35f6026784c609c25c6647c1d075f75a27bbb73bd484f20cca33280722c5c2aebbbb4f6f67a876777766efcc8b0c2a870a6c987511664abc13724cbc13665d7459f22f5917128827c91c7ff7292377fd61c9000ad66fba2be9546139f5f58f6847b437425fb399f4cb3e23dcfc50e89e4bfd0f779e2bf58d3fe7f966a9e78f8364e7c745fc72f7df5e7dd39ffa8052f49780b57eea8dd44ffdfc54eae907a47dea81e8d75f02b646393ad4ac9d1163b71bb7d850f515c8de3d9e2273b297dd0218b47d938596524a3f2eea9bec79895f59f69c65af534597aa8a3df39d87f8327db978fc604963973a40f6489e189340805c1ac7b8347e71e9474925b59445dfbd578e226c8cbe8af321426f9c6f24fbf9d9b891f936ce0f64e3cfbd3fcd47903f23aaefbefb806cfcbb8fa0eab3f10f05bb04fce18daa3a1c24fbc345ffc558ee46df9c535b11ed533f440b93788aebd56efcc84920fcf455b67966763439ab61abd50be58c31562963cbb031ff0b16e3d16c0d0bc7cdb3b78760a32b6e5e7a37eee6a45cd918630d5b9062dcb0e62671e946eedd8d5382d93186e084f5eeeeee7ee194e0c36e698023bf319eb16d31bbf1adb8af4a19da5499135f5e56bb7c66aeda35b7592e3bfbfad04dc2dd5e734fefc832a3219b95e38b520f64b35639b3997d4c458e39f31dc8252b993d67e633f3309ed129b341d0b787b022db8ec8b2b89485f3fc4c1572e8e7f49dce09844a9a65dffeed37e36eac3c9b8b7df9caec5371a31f9965337055a82dc4a8b0f34705253125ccdb5f55c21beb5fb0980194acccb82711786194e4c46a3736190da1c5aa6ae581853e7752b9dd5a39bb42426823c2035437c40c29256e8a0d1a17a68d48a876894a55998106aa94a4b560094aa6045185d5346898b0184c27e625c98b12dfc41b561b069415106561830f4f96600a228c10911ecc10f1816875835416b6e6c629acb8200c2b4ca92dac38b1155951828195241efec6299e98d2d667b79cb32b96d6da36f7e92bce39e7ec8aa5bdec365babcab9acadaa43d656ad3ab4a6dd33cb66d756d5b1b5d45ef35edcaa9e758b7a7bd6b555ab777bbb675d5bb4275b908886a2ca4012719837e6a0eeee6e668f13a2754364a4617aca48d1532666d9c7fd5996655936339ecd5f8db2a3d3844bae7c9692f906ef597b08005c58f931c6e8dcaae5edeecdc4265fba609fc53be18b2ff33cc84f0401af2aa63cb97cb71ba494f24a17632b9d894273a3d2192635d88aec50444a104ab8421a75fbb7286d1776b67ab0f2b72049369c474912acd6b258ff9a4f50b73f9c646e73ec6cb6d8b8d4afd73f8b556bd3d7a50fd3a19452fa9a54b289f3682acda5793493a2c2905f0384ad93ca0dec0e141b32d42cf249c34e2cfc3a616cfc1c508c747390b9611246c249377e138b06fc860c35a9f0eb0636e449e572e4b8bacc9fe557fc6edb62a713c64e2a04c862e5a472e5a4c23ba1bdd10659a5a72e4b5fa4138be11deef89795e4b364179b2de45bf92cf9711e51223a191464c3c8f4d328f08ee4970a488e48a002dd33721c287aa2d4451630788812b7988284123628ea12c507a6255888a6c8524498166c310348420e4ba4314317475a9001f95168fe23cddfaa4228c80536ac95f562d6894a506e1897b4d75af64af7314411444c7cd8e10722c07e56e45932a50b2f465fba404171447f8d9d7931a2e9c6a6229a746e6c2a62caadedc33bf46bb596c5fa072106cb5fbab04e184b73d48c0993b0e6b1dc3e1b13e8cf1f42812ecfd492cb5e12bea92f049953bf55036543bfb59b1f162b7726a4eea4998702e51c0d40b2486237dcc092cb9f7d96f11695932ed1f67c74e5d7802d569a611d9fdb4cc442bce5ceccdb8c0b354ff7fc4ed43caa67f6a1cb3ea3906614bf10a0eaa7e119c5725a8e956a6f9f931e45d1a31a58f9213dbafc5a6d7f2226aa511994a7d6bb7e8890f0c40395413123ba69092b4660061a4d8c3873801b4e20040dc698e11466490a2adcd213151bdbd05116da08788a4e4d45105d7efa71631312996bc5a44410638c71c5b93f1131963e896c3daedf5cff81735db217c290c4bc90b913d2efe1bcee92c5c0e2eb0792181104cca7dbb305192373dcd7affee057915d590b6b1d3629e3bb94524a195b5012c6a8ebed5337d8370fcd47f9c1224e1540a8809b7d44e1662f9fdb6c4ad3b48fc537231461fba12a654f41971548a15d92f882a64990a3294b910e63801183267cc874012385135cc684e1050718b211d46c36b856968b1cb7d520a58c143001834b0e59cce0a9e0288b2845445001c3c4458c2d39dcc064031644f12207141a64ae9811262a4b0d4de812930caa168301285cc0524314146954e1812f98a85c01c39723b688a95c0460a3e1870422084869484774585cfe9c3edfa7773791516c5b8c3d1d63cf39dfc3fe6c6e1d638ceecf5d658bb9c40cce984c74ad34455d8ac205f2c9f6e4b2d118274da6b022240618da26a42b4688e102991f7238434888edc626a4292ed8e44b767257ad1b9b909848296756460762babb334ac4179b1b9b88389a734e5a8998d244c41321372a3109dd15bf687cda55ad490b1a396e6cd232a60579a6057926a4009581d4428b9313ee1f224348204243460bd36d9e1f279ab0bcbce02ac39bb42c71f99df52cd78d4d5a4a70e78d4d5a78b8218b291574bfe7e36ffdfd6d6fe3854baecdcbae085f9bcf6c0290fd1317eefdf475efd8f9e76f28ded1b1e36527e4757ce192abe3bbbb7bc7c74e888effe1ee04c8eb7dec020080ffe16d939d0734c8df5d1e0b1e7c741e1edf9617cadbfa4d729ec7a4e751097d79d43c0f6fe2c0810387cbe5d9f8d8b5caf09bee73baefd1bd8fcda5fa2d935b864817902896070faf03d72791220e0fcfc66f2c9b9b86c9441cdb85089b223284bdfc25b708e6492cfc6279043b415ed8278ff8c5f1966183628febf25326b48862e11d1ecf4f8f628feb19c7fbf8707c8f2f64dd0dc7e77ca1bd61bd5bbddccd87aacbe1f88debd1c3c7e77b7a7c011efc9ef7f9d8fbf8203e3e0da400e47b3e05027c90ef8937c8c76c7a7c557e7e84f7792ecaf9c27af3852afe0df4eebbbcc91471f869508de71a1faa6e48836a7c587dbcfb3f9ecf83de7479343fdf3cf2f1e6f5a6920d3664266f62431a74a9107d4283628f8fe7a72ec41e119e9f864002e1797eca44290261313287bf02f91f02fc7c4005f8a850dfb09120eff33e1fd0085f90cfc665538214e1e5900b9240698397207009188b77f3e1f575ce470f4fe67812ea8663d7f1cd8db7f33dbc017c8ea7f32e4f5e566a1e1a34292b89e1f16416f2c9935c7812ca939706cd23fe48e7110db7d54dab3e6a369b463e451cfe1b2c220ebf085ebc3ebc786d5cae20dfe3fa0802b5b68041be27c64c220ebf8fcf67e3fa7e8a3d37cfcfc1c7dff8368dc0ccd5f13c7e63bef96850102f822e2fe6bc7742aaf8fce6f2e48de2ae3e9c47973b99f4210d72797c6577f3d1a0909f6ecef333173c42904fe8419f2f2727c8badec68734c8a35bf8e5d1a4b845a6a9122405090609723114db781bbf45e9b16f6e3c891471d8e5d269c2b25e4808ffc3cc24f6e4e4f870c765b158ac8f9175a3c7b30fd7f308cf37af0ff9daa02273f86dfc56b90078a1bc01f8adc7c74e888f9b2304f8201fbb1480bccfc7ce48cffb7c4001d1c51f0b32080a4f2a3e6dcc35c62a2bcb2a83fae90f09f4ab01c586abcbb2bf66d1e94a09ab1f5b90d52bc02f9600dff0536f851400c91ea094e12108045212c1141105a65e894a0c0b96c0edab27811586b0e13fe9b87884c803087d2ef3fcc0b844676234bfc983db67943d0f13a3fa4d1e4c7d46f459c886486217e7089c31f6ea6043186c9b419412c8c384824d1e34aacf1df1a9114140f694bd263f584e1356057e19e1172fd9303ef553f745ec915cb378ba78d3b1c50229792746c9856c2fecc0955cbddab3f492f4a59fdce2a7e733194ddb9da3977e985dfae1bcf43df6744ffbd2afbc137becd397b147f5f439f620e12e7da75e9f6638f3551e8dc71e71e6731e4eca9baf79b3caca2ff7ca65944ae79fdc751ae9429b6f3535db26e7a281e914f1627c31b3b7c58e014b763872810c113061448516207bda17729ee4819070d756a9f1b6c6f7e21b7f15cde77262397e798d2f4dab1e5fda6f3ea9363b05f84da576522ccc4f699a46b5aec8fcba2cfb5969f6f1d22ccbb2af05a3617a440d97dc55b844bacb2ceb84b45a3eb4ecb56aad58ad17efbc8fb8f381f641dca1f48b31631ae39bfed7e1573f0931b0f235ae3b054c5aa9d615995fa65db1a566aa59a652a9a8d1f895ded9acfc922b564b32d324e7ce32f739e79c53864856d2e3cfc52feffff103487c452ef274ef1fe34e8c5f4856d7dfc5af1f33b0fea1ebf5030624ee8810a9173df396772c96538faf56e996daea2a353bab553a3b4f8991bf08b1274b7dbf003e84d853bf9fdb5e7e0eee8bf3b5ef8af8c76d59573d8d33bfee59f6de794c8ce6bf9081201122cde817e7fba77c7eee915fed1a4df4ebd9eb4767fe36452eb0ba4a5b14191465431f5a9a435366d1f5f7a7e64952e29ba11964e6ba475d77a8ebdfcf9827be89f7678c33dd9f314cb19f314b44d75b483611e5928c3dfd2c564d8d6311f22811c7a5c41b7f2ad77b10e3fa902433c4dcddfc320c1bca2519d8b0854a20c34625216ee843d78788a65c0f5be828296ca5eb4c43bce4745b7296465437442e5df985f34a6ff6ffe9e85f65096480d57e4c6463d86eeaa274fd4b10a3cbd1751eb67ec915e009db802df665c78008ce4e48d74f43e3859bea554250b0df0bf6b7ac2ba13f6543f3dda370bbb7a1a1799aec0b971cddee0b9144a6cb420bf343ce7ebcda4b14ac7d189680f683a1c6abbeaf85f90dc58d6e339f7e26bcaebfab4acdd7a8f99cd88741a552a9542a954a65adb5d6da6f1203ed2bb12a954aa552a9be490c547dac312c3f33775c83b6d825e892b9f26b81a27193f0070ae053e6892250491c238b2b37b49c804a564dc0fe9a98b9620a48051a5e1001c534ce18830854428386f43863d8f24212175264124e76c00254129f90924315910c134374e90254129fa07245524e127f25c02f39c60f608a1acc1827208a523471010a640f4819709b1c7b91064d60012a915135b0c0e328d2e0218a6661460c946a151f8840f66ca400374d053a38815b4a89a832a254006e1bd75e1c63872527ce0446433081ecd93c815bf7431292120dd79e1ce2053a2481ecb5a4809b4aee6006ea085432c20ab488f2bae02c5308c2305313849427a06a30e9c1a88803ae3d8924831822903d1d5ec06dc5746688241b529e28dde8e2844650074e3e24b1b8f6a21249481481f287303118021988282b4c207b3949809b0dd79e1ca3459623706b71edc5289c8832046e1e1859d1c1b517c164f1610ac89e4d0bc06d07d71ed00e14ac000a5412b98c3182081b2c402539845e071b28795c7b2d02a22e86be1bc0487afa806b8f71f0c28722903daf0b10a8ad40aa8109324025236cf912a5db63285f6e180279f008cea8a204b2678305a8846536464c41031b03d92c801755a2c04d3a8941c9c5fec4b2b2f6581187bf064a13336006b48501662ee35442ca32059cde1606185ddccc489a9394923b05623abbb1498b13f2ae22a7b14517d338716bdacfaff5ca6e9a409fd2ec047ae6cc193345e8993367cca822f4923e8d13123673b3a79c0ba922f460ead9ab92fa94b019d0a8feec4aa845b25bdfc68459fd6357699c1ccb0916b6c98faead491e3112432da1228bb3455b2ebb2ebfb8e988a0cb0cfba25fbe4d7f26bc9648f923cb6a85c11a060b63e5c7ebd4f9e5c702f317d266fec9ff2c64fc82d5307b58965d16b2d789d1efd80d613acc23c1d565be215ac98a60b78afbaaae3fc7efef1c5c7963c7c1b562737ec5f826cc2b3f1a277ec5af222b6c661b11ded13ef2581eeee377dee6c9a07e1a237520c9440ab5fcba0ac7ec194bff2999b9f97540061bea705e05f8a62530021a96d3e122842b6ca8a3c42c3f671fea43f418dd63f4e8d1638cee2e70915f72d5b2627fdc79711e98cd360f14377e967d310a208c5f7c96b0f56de8ffecee36aa9f0d7dfab53f3333337f9318c80f03508a04252862045256f0c41410c83fdb37d2dddddd9ddd4eefeeeeee6f1203fb8321f2cd1256323995c316b9a74c4f999e323d6580ba03b75f973d299c1fa844cd586439e81091080000000063150000200c0a07c4016138241652656def0114800c6d8e46665e369849434110a428886108328418038001c0104390518aa84c0022bbf2118ed4465a27509d35a67b9de8ee7649978c1b15e92f2325e8b7e0a9629160286172406da3f53e01b25c592b01f602458f56546a21c20a9bd2cd419436d6a58f4aafb7a581c27197f703d7f3c807dff3702785d228af3caaf425a458fc3e431d3d51642d780d78f0e195c6a4e7420d43611127ec8808aca7415b61a41ff60cbd38d3ab89871ad61955e3c6650f22ededc8e9eb72b538356323d7255219755954f055c656fc9d747c4755ff022d7133d0b1611e8205b25c43bbda8912dc61be8aa46845f2107026c84fbe8dd50c3e2dc310ae392d96ee211845740bc4d46ee815eb6c2f816dda4f47d8fffb0ea6c27558750601fdb524050d94631f876b863cc6135ff4cb5f22ce7c1165a3a1e31b97434179fd376ee3108171f759ac0f01d33fd3dfc211bd0c7f156f1a244f14394d0dd53fe1882757e344819f28703f2ea37cc1a3e105fbb1df970b656c40e1430a78d418805b4a9e197d5019199158314908c06d2475a4401ec1028631425d6546e6516e765571c7724328593a541e43b19d1a899a5b2264feccfe20f44d6dfa26e7c378f8fcfe1fd2f30168bb4a12078ba43639276ea6a1be030b4f79ef985badcc7bf6dd2b371761b440f891049879929d4d3b53a659a23194d856ad3be2bf318883c529a5e838bda5a574eb21211063239ce3350536c6c6065d44c45558aeb5b7656fccc293b9ad81c11b9b84de943764db4871f748021ab5c459da42be1972d372f381129a0bd3265b16cdd4ab1b4f1cd89f10ff7f0189f1414977b43d97ba77e327e27c3ca057431658fc2c36475c7885694aea2fdd7ab82b0023d55dd9320b64cbc6ea32622bc63345482de4937104545b2407eda05284e3cbf6564db49032530d3490947457bf26a2f30ff90a6995b270c8cdc1f40bc15843a3785bc5fc6192108db6759cbd115adbbce76919fe4d58ebd9940a770de2742c1d05fc0b461980b3a2d1ee8cd23cd69c597b86769e45a5e1c8df97196f01ec6ae6fa03f2096b144fb2234737a77f6e11993c3ae1be76196afa77fe8e53e6ca3df0af994ed698e026c654fba971125ca1650221f16b804224b038422db9f876ac1682849b26df7b00155b57db196b28ca21ad4fe53f1c3aa1b71a8a75faf17d7c6ead41a5980259afc03c0228814b4bb3e18bc19b693c5a705d161634c9b8757c43b3a2b7d224962bf12a8f166df303402d1e60033a2e2ddf105010970165f009eb7fa8ca0e9675392552bec667e8666f56b355c44aba6cb44c1ce75f983aabdd1ca45f740222496dfc9d3a6890d07046332e640f4fe193380a166d31cd1d1b48e27290961691c4dce37860ce89a1f2197e753e6d46125b11ea2bd68eebc0d88adc80f1c946cae6acfc69c71818eb5f7e0af66eab9463f27df9650ffb6708625c32300d07f8f3d07d0236f00f8ebfca9c0734558ba5d92562c6b6b3a27e0b05b13d337c84dd74a8c78cad2b8822be32760ab45909d5669ed9d47a898d6a2f07be67349ac1a476a38cd54045aaf47ec30395430cb81fdcebb47822293a8f0ff122597fb91e6119ead869f6ab4a78cb8d21e621a1de43dee96dd71e56e99eb1fd0377ab8ba9518eb68da2eef1769a52f2c4505769b7a1138b109afda393c7aa5e3e90d0f14a4c9d9da81084ae585bbc48cac00a41b9c18e355f81fcb5ed73cedfadabdef61b50131a6e610751752f0f34ac69f6ee963cb1bf9099e06cfd57c1d4f1ca5073383d42e6b124fb9adcc6c108cd9d7dd585229c4328855c77e7f26374eeb4b2f09222db46b5b83be42839ceddc108eb5eaa1837083a96eac2be4fff0c6e6cf3c8a0a07e89fcb111ed1080896d22a11146679aba3c08e108d7e043cf0fc0b57970f70e274b408586050b29f0255f22f962a6f13a89970b5191d4399ebba6c5e6b9598e419ff8361a958f6c2e123f96e20a523c8f8da105f0be0df778c4b217974dae592cee9012b8de42b9d64f167268429147bc280f6e633703f60e4f268037813d96c9d3b5d8d37879d814c561981b536ec423b9b2214e19806f2af53b840321182ce4ef087250d61caa1376a8a369028ed8ab344960104b717ae84f283e5a579d65af64d50b6385f36938805ed854d250e7a734e348ea20384958ce872eb60b06098ac9c1e31ff50b1b08cf3c06c3d3325ce2342c992f3d441ffeb4f93aaf29f853c8a67aeaca76ac5d67e123b56b9f4ae03ab48cb190e15239c6af3694728f52017f4d15062740adb52c5aabf97feeb7fdb7ebb0f64bfd02a320a83ad5a29024ee5a361fbf194eae4f694665a3684e8874594548180ed03e482748fde598caf700b1854b02c203b30d11c87d5e1bbf12bb7dddd6933d66e6f8893fd76c0e69c2a01db8406830386058349dde226a0bb411ad0f616ac9762e444176e3e2acabb21b20993d2ce571fd0f820d3b3f8131ae0fdcd0930a79e2f759a24e70fd0845acdfce54b2726dd0cfea10a39b39f8ca37615b85917a72f0481843411fb325b214421c418556c7b4573c1d007cf50c321d516ed82742e065752284d2c4c123694962fc20b22ceeeb88959743d6cf4ea6993ed19ccd2c9531c366ec47d087095a0f5bbaf19c0f2868c3493553e9235924adb142213af378a5ad5784d77f58b2e4166dad872f769abae98922b02088b035f68e8e62f7b517a2c431eeba287f0ab7b02913124d23ffd1454734fad539770ab29d593fad65b78f66ca33a83ec628da80a1844ef4567a657b925ac9bb1dac8cca067e911737bdd1abad80b4e2de4b25ccd7e580d703ca4d8db6d9105e55409acc17bcdd37c075cb38d29bc0657343ae40e34db56b5fe4d30d93b0874055c9a2960340634761ae889ad135b5dcdf6907ffa685cd25ebd89e2bfd6a05a4bf7490052550ad80f1c7bb946ad9d8af1c3635277cbb57bdcea20da98aa30375c6f249a121f3ca941f2252b2ef9625873f2bfaa6f79efb174120be2644567f679819e501964e542fedb2f0a65c0dfeba047479a7c4156183b13f53bad4885bd5adf248fb592862a186f9643940b34025aef58c402c66d3f3bbef9c8260784643bc255352490a2a0f9d06bcb7e9b388eabb53a51ecca63bac84493c9bb13e05cd1c73e48a7342d8314c8a84a81f66bbd7b660ac61cde0a8b4c13b514e7b5650eb040fa8da06da9e4475a3efeb35c5721429f56a0e30bbe929c923b3b247a01fc00cde255649d27e61ea9cdc7e42133cf156bdfc2068f4dc085c590761487b223bf1ff99814085794af57373fa36d4fbb7d7adacbf3daf20cd31a5ebac13ba2ec265cacd5ff08a873a53f1079a0475cef685fafe4ca7c15d2c5a80c7cd37f5cfb3fb581f06be2782a05f7f32c55d1c5f8a9352fb1cac91d6862b1f1dde0e47e6efee6f3881909f109e3589d37c0e61735693e3b9d60ebf4f4e048f8126323eaa7cba552c5ca35a2e6396566f88620d559c5802a94f1626b2fae62ff150fb137ca8a14fee18f5b801fbbedbe997dd3fa5a071f38636dd598af12abd62311970e672eee9ba24bb7f7200fa86251188d67c3a9b386f95626d21e17f0bfecc6348ae297dcdf2f7572275051dc15c382044dbe0c958c8a9f9d3eeec197da486405fe3fc2313f2b17d8f6b66bc028f65894072d706b50a92e08b781e1ed68fedda5b0abd04149c0192c8c525f7201c692be21e9eb6fc0fa3f91df4ae7754796f6438721269c0c1f15a01c2ada8cbe21b0eeab860de60fa8e3c267970311f343f721fa948ec1d7906b3a420f86ee2f08e2cab670995402dd7fc8ecc3b96eca1aa9f7cd5471e69862a2db296cf047dc812e84221c382fa6ba1080bed3ea2738c68a17ed1c1e73a8450c39ba5a76d95bc1c0480310e91aba6ede028966a2912b54f32b6a26c11a381aefa35cd7776c574c532e9321d53cdcf9a676c2726bc2b2751530f8cf4831011fdf1918360b5203f607843a47d5751ea3c100e8bd282f5ab0066127a943947dd417ff1518102572aa19cc8ee1809f824c4286e4c801241cb50d00e16c7e64e9304c1824afca814f93d4b850efd865e757926adbc71994429f02e4e3740f7b3ae401701f3772a8c184ea4c1f56b857c962977d9d16f0b85d0eac65790bc205643ae6d7ab1eb81269e52b68c1e8293bb4a806f98049eafe0e2b05fd935a72488a6598c53db4ddbc19545c3ef99a40bd1b3ecc28b8d17a7f0ed4ef451f60728e00d40c7438cd74c69040fc082679a62b3141e258911e2f87ea16a76152dc61c201dc5046b7ad470e8dfb9f0ced081c9950ddbb2e6e0c3d580827ec41840449023fa125486673ca89092ad84e2512da95b4012ca1fdce9a24e8082da0484011580cf29731075bfe104bf47f80449c3b60916211d1969915b388e27074883e1726808e4724e903ca327c2d80d37743dcc2b449a49e8a413f208b07439c578a0a96a5427f7939693ae72173370d4953ef06ccd987600a055fcfb2bd16dafa020312fecdedd89d39ad0e0970d8d6ecc50818afff2575e1d063e2579249a8fd43f9c174d8e6cbc5663f05b23707d67ce37c48e9d84b4cfdf30b0d25cc8ebc408fb957c1df338766697df9f88d4f1107f9a0f020d0c0150ab62815950390446b2c64fcd68a0fd943709e396b6e99bfb512f8de00cbb12100ba00f09addb7f4e80a22cadfdf5de41f21dfda398ef9f494c3796c358d88b246eed4177ec46c34444486684fc8ec842afc9ad799cf6f3fbdff7610987964f43ead0851c70fcb5fb8a3288be904aba9d9fe14a442e7d565af7549cc80d993aa9f6cd6df644e6e93b96e0002fedbcd5846741ee031f92d8fe894d80091120647f4bb619e7c32365f18a0f1b40fee786231333c8e20a5bf1fbced0864aa01152a2c540a9fb3764acc9ef388d855cc0f359487754d9dc1d21129e5f532de3474acafc6d86bf85b1f297bd4a3b10880541da0e4e86d6b93810115f1b18c0cf8ccd8a9a9857db1fb41a402d0adb94d9069080291276a7b0f5ef841bc7d62b7b96ccd6f2d5185b563799f808af7c99ceb33103a203a65187075349269edf54bd9f76a0dc764588d0344c674719d4477b6cc1cad7f7c3bcca9b374a61420b8f334eb45cc9c1f6b6c9cbd2a4a962a8704f4b8c8a08d3ebaa7804cdf9b2caabcc9e44cbf4d3cf1e7b3e5343d240687b7107bf1f1825e574432946061089f6662dafdb66366b0ab6937b3ae8f0c941c15d06d64dd35140559b68f6695889a5bd987df32d24174495ac456c88453f09cae14b33d436c7c3e3e53183ffa64738ac757742341a927e4468890c3dce74e7cd27b74aef63200604ad78ebc758470bfd3a821d82b0eedb7aa4c93c1025925e047bac6d8b5131bec75e7d84bdfc196f51ae2270bcaac5822604cb0d44f3a65d61d6cd5d70d38ab5ec6272527030441ae8decdaf594c4ee69e334998fd9c3e6c84a6dc5e941144ce450ba636dbf18146cd3318f3777095cf4a432f93129ebb1384f088b21eecef0665cc621966992801b32949aa303b0c4e9743a2de30e4b638b98b5b1cc430ff5fd3b2293ef7e6d798e11d6a42b6ac9e81273471c4685aa2a20fd0b01bed53a7be34f16bdba4e92741f58aab4c0641a6a3842b193dc3522dcfe0b10bce7cc1643a09bb7495be25ac74c50970e1b79f3f1014102186c7c3b7a1346d7e10af3591d7f953581d0354ee48f93358585e7f87813b3042030f1b84e2804ff73a5c22f182ed551e5452527fefd7729eca8269b7585240149c11b4989f33c58df511fae285d89552b0cab6845413fb9f1e34e945461b59054d1f88f6c69a40694eecf211af999ff32196ab306a4d42db703a00a35f2f53222712ea389e1b87daf63e03fbb6affa17101ca21dfb56e16b8a680435ff1bf1bb519229fe33d11cff647cf63debd64bb4291ab5c74fbc3effb965204465250675184ac1543a19a47ddfce78e65909add83ebbad357fb0451bc42d156db031bdb044328aa7e5624006af128c229d42fdcae25c9e833acf89ab3a73c53ca8459671324f5afde61e6e23f6530207b1ac3dffd5570b3b5faacf64f0a9aff3fefa21147b8fc863e824d10c764fbc48748dce0a9b74cb25138945984874d36b2d1e3b749f26b05e962c84836825c55fbede0e9cbcb130a3bb9254a90c753f4d258a2b69a114cd456aac018965aaa9f478b6366e7661b553e0cae8669cc26834f8f5b0d2cfe6bfe8aeb7580a1338aa4114fc513813da4e9aa2e3fa35b8a24b7337d24499f28f3e518bef050ec499ba239c651fa99798496285065d3ff0c161466cccb33f452669cd53ca3ca6e5f5de49eea71dcc6d23f730d9919e1702ebfdae2018c200088b8730a5b3a5532a55d5b9540242a17b10f99ed621f85411df1311806e4b495b0412ea9897d94ba140b17d28f73b53686ce0b693f0c72fe47e6d8e73a1fb439c177ec7d962ecbd72e2c87da21dd5f36a9b025d2616f73d2c01f004bdfe6c1f9b249f5d5e5165f1c867a9163f4871d6bc526b1df6dd66897ecc7f8ed687d4f924b5d42f3935e00fc9644845895fdd098b61079e9a3fbaea4738eefeda5a4e9ff994bf74ab2cd5a8f3e0225945555b14640a4e04887289e15f91fabc868824f7f01c6df86b235b7ac69ee925493491641f6e6a3a49adebc7485a2d3af2c4ea4eac3727e2626fe98255c0c39389526c8a7275227957c7881816d9a73032965e0dc6a87d9b95b073478ff3eb94d95b526031cef6fcc72a1623dfc45116e81f959eecc943feed588f12abf1de89387e77a4d211a8941e38cf24c389960a03bb9cc256c3f9ad5c0d7c88555fc0bdca5118dafd15d76301286c6e178f441442093175d0f6a3933684032a7338fe9d8ae6c661b5a8eedd5bea56aea5ec4dd06e38c0c7fed69633b786d89ec3c78d77fa6b170664ea3e3eaf81186a5acaf63989cf59fce66af1d3cf695a8c4c3788efcd2d8d9e4da5a17b9eba6e7b46f2dbc44e8f74c6a7d494655c88bbf79e247239fec11ebb58453e79768a43d9aae22769b1ce4a375d621d0b940897d4d75a77821007b5c9b2b4726bc81fd96955d0d0d7a7d7ec94822b7c5cb4247200e47c866634d6aefce92722e02e6607843811aa8b3fe92187eee62aad0642a60930cfe33890c9c5838419e96dbeae63955472ef96d360da2fbebbe8ed21dc111b10fd05e5449d981d0db5f539268afd3e08fdb6e40e1819d79462902f9f14a9f6882a294c45a8cc8bc2c3620a2c9e70697f1c9c36d2ee976b6fd63ab6f2a99221f0cb2431aef9dcc821d8ac7cc085476a5fe6c9b96d2b8dd7287958161df25032654c355795a914bb7ec977a2c1601812bea5350d9cd8d211584d8481c717c27c7fd5b6f60d9163a7f1cf57fb83217909a02997cc1ac3544fc3578992f75eb1a09ec245dc47bc868887ad3353dac4ecec0e105fc4cb40907358fb167927197ad743965f88ab1156dce3853350fc4443b4ea42ea587aa988f8943ca48a32455ce51eb75c405d3af73553fc70e0969a82a7061c0689f86664aafdd05737458a6c4d5161ec202a95cb783afe0bb2072f0cd785f972d96349465a3191d13491162a19d13252eaac4361888ab289551939baa3fe6fb7435ca83469c50dfc487431159168d00ff80c0288891855e9ecc715ee2bc1c403ecc1bb37d2e7cb5a108a358fb156a4798877c30cb2442ca07f45dcc45682552b890ae827f40579f09275030956ac07a87c515e84558354e49791d03f6ca54c65fcfce6c2a58d7fb8cc25e0e413e3b72296cc8f76c4da23b1de8d67d1632bea0b8be518bed39902b8d2b15642ce1303189302da80214a34b5dd2adb6890963fbd6f903bb62e08dce0bc8006cb020afb8b756132aceb1569dc179bb71fbe1eaf89d1d8dc8848d3fc75fd958cac53a0f708d22bbdd581871e2a31bc3b69d869ec529c71603a7ab9816fdf8c1edad61798a447a41bb2b2ce24db6043e6aed729aef1e2875492bc4e89f520e2f31dad69805d4f753c7a920dced593313219aa16035e3aad1f6abbdb21bab680ce9080ccb5ff66ee36a804349e124876673f07c8ff793034aa5c8f511a627e5b29cd5b86348134309f6b38c2af09eaafe63c0017af9dc0283c4364aa14ed894e20996fb52bdb192524375ad19e209451c65d957ce257c791b33ef75ec0269f316a63e0b90e9cb84f639f35b4795944e9d8aec895f31a101171d4086ac37346de12b89ed9ec5fa689b4c5f03c9a59a8a2e29bfd15557a303d9cd70d8cf48de7417b64f9fbd207d616b586f23198252cb18ee71b79e63b95382e9186aa93432e4a9cba0e58ed7da3d84c070dbe09701dbb5ee87372e14473be46124a468f540d27747a887415cae160debc68ce35c6953d15ac2705b36b618b3527c70ac60c19c3eef75b74e276e58462b37f5f95895674f33c5cba5cf4c87434c017935222a98172dce157f47ca7fba3eb9b6a054529a6bddace09248fda91d0e603f8933eece81f5ba768e149748ee89dc41081beb2ad5a72292eb58e52a31e07609c8a6f0327bce92216dad5bf01a901a9ceea9117bd1fdafd7dc3a6210ecc79a8523872ed3944aa8f00f189e45b2897f8fb9941e6f629b206ddafd60067bdc3fc7b0072ccb9059f2b3fe61c709ae1b51163858176a2f9a6353e0530055efd4e81d0aa29176d82c5414cbbe0e2731c6f9a3433e26eca43c739e19a8738a45f9c1c5e0c4ab4b1248236da287195323521b2798e906f2ec21df4191c7652058da55554acc2b4e13c2cee52f7252dbc90ed9739f3000042a5d8efed741b3497e34886b482010718ff89757b74361d51eba1010bcf40daa2afc6cba5021b0d7d743f77ba967244a3f64eb4437177ff05e9a02b2ea519e2324b97460f1c3bf2b936345d81f56351c9693f349ecc0295ece06136f4de4b44481e7fab156526baf2440843c2a6aef8c31cc1e68994886b6027acf7a6d88c1e1056c5c023363486715458d5e7fd0437a004954d92423d88953842907f241d23e37b6dbb0a45d4412b154682aa3783b203d6e490b40631f155c965f69dfec5022d193df9b618a22359e1ec7549a1764ea43ab9190548b037de00a8c440a0dc3000e4187603d990e3ca805babbd1a0fb08bb5173e91e2aa3f4bb0d50314df1ccbc9aa51b381310b2b2cd004535306ab8be8bde9da6a7d3468c4157208fafbad34634b9da9a3552353a47f0808390961a011271819e5f4fc13821d85e83a6002027650ae5ca04d042d552db861f5b4f404db0cc91d52931b65d48d465967b6b6391c82770216c3a047165757fd8d6ae8dbd245e350b8c07ad32d3998749badd8883c4491537652b186306f5e139603402867ac3c05c959e00479cb49c6d0312a8dcd9aa9aa6b765d9e5dd8a2dd1134ebde98e7b9e53315026d42be448b2bd1ae1c5f690af16c22d2268bc64e375a8932781382502fd7c383d9032d5a8541b510ef66266128d2f4b369a65cd86352e97caa1969899adec41e9be292c42185e77f540883084a59fa3302741f1c7400dbf088f5928a7e121f6c6b20ddcc21a285cbf96ed4a5a06c9af10a90288ad38ad3fc638d9b5483f9b410f73716ba7244d84431ff37b57b0c564c2d4f1d33f69b48728ecdfe7441fc00c8a66561c6fbea11e109b9eca21051e8573b86309fb8f128969c516af94344e413fc9ce53c12ebe1c10e1fd1e951c679680057f6025caf3888be6bfe1b75121a40a1261e4a5a22172286c3f246b012460bc00cf4138d44bd1d656f0c455113b20ba8a540beeb7813ef98f434d73d8c2e796e786630b586115a16feaa5b2664fd7cc055beca73dee1ff84c2627963cd2ed1cfbc27f1b5a7497e20110a08d5de3de443e15473b3126d751bf5d05e6ad5068223b61fbb4d76a1e2039ae104a8eacda2a83e2ca44979cefd2ef925edc8945dc0405c1e87d6f88dcee41a4a1de4bcc102d1f7f0a178017008e8aca0a5f3f40af31050dda06de0681ca1e04d41c41c2e5aed4be6dd749053759735f3a0f6e93e34d7f7f3b15c041eb400606b20447c710aa5963b0a0d111d2e92f356f2b1301b3463102074bf6e1d0d75b9222641cf28100eff7c32d78121e173eaa1bf91681227049f5ada3698ff63b7d09aaf19339dabcbe03d72f00a3d0ba009c0ceadaf33bdf85af83bd4b7fdac3ce1de0f2864fc885f532b21fd571bce0488004cab728f10b7a1988882ca5da89decfc01fc0e6a3b1fed9dbe13f68531d0ffbbd477bc3ce9e0c84cde0e3c1e8a7f4b2c0a3e155de913b6468c4860d4e26048afe0f703ed2f55c54cf3a7e0edb7d39ea4be8176b53f19ba5d41363477e695d513b4110094d13ea66a28e66432cc5fe4398b50d43d2f6440b12204ea3c9bce7eb3fb8900bba88ece7248f18d9c79e185261277fc60e8e6b31f558d329102846ce07db97ceaa7089c13de6adee1122ce5acec09b51a78a453d572476443a2c1e720a7b7fad9b782e70d60f4b8e37d0003d2196bb2d06f72a1f9c3aa68f10f11916dc3c3e8d1bc60ab6f262ec498713149ddfcca9fdc041b9efe35488efbd4bf7a0ae65b719e95e9b3468022b9dcfbe297b3465cdb4b71f2a8cb85e23cd34bb7068322ff2731fbb217b1a26feda74894d88589645986f8b565cd63aa83f77dd0ef9a3c385053641b13a4d92710d9432f7bedc7d78dd23e0dbe0a07e141c4e62861a0fd3088fb4f0d259f4f09b012bb4c98bcf461500b8aa80e93d264c663bf78e45899bdb7b36ff32b5c47ecd5f94fae177a7a956fc5a408946e60ebb5fda1efa1d63e74951c1e05eb06a6c0ea9f497dab49d9ea25a5701397fe520d270a76a41bbde614523e7fe7bc710a766d5503e5955cc5453031277427b83e97353a18bc4ef4c282885e50d8eb2d1375245c4821f4bd72ee0da7baa6ab7bb23f92c1756362ae647b7e3b050de190d240d76fe0f879355e71a85424de25b4f86175942124507cc18a090cf4bac8cf795864de6f363134d205d17892499d32338daf0bcdc92b485e1778e67519d8e22b73b8c5876b5f3199de921aaa191295a090565c9e37ee58fca20e8b7f2e7af855187aa2b38eb5e217aeb506a0fcc1efa1922f511bc5f2c556b7809664f651083263bae2583f5fda3dcc986600687529da546766ad830fc16408d3ec7917aa22f098685ae373255a1109930f9b8534464644a1ae1228ff47724c44186b9fb8724b8fc59daf8bf6a2a4018d1d28fee47091d4d5629f4ccfe0885893c6acbed612a359f0068928b893731b9d1d856546dfc4766608e061ac859d730cc44362710467eb3fb77619f8fb1f740db970c1d7c25a59e3177ae7584f0108d5d5bb999ea79c6fc07df575a10bac79c092f897c65b94f0d5bc1b6ae3fa1bb7e70874137391acb9f75377126931325cbf1e999ea8407ed607c5b23f045b57c22088d175a22e31c91abd197056b887045cd662f0bd5755bfe3f808462a00e4d1cc4aed188b254229413ba68ef61d125f67494b670f89b5c0b673e655f13a0d321f78dcb80ab706a968f8fef3dc13a764b9e87b0a6826619a545cd133e4e23f9dd2f5e9c2e16da0601f2f68480d7a0539a7ea9bf16d6112b57b8ed8ee8b567f4002d7cb55bfbc2b598ffca4c1565b06c28e696fcb1843fd27c4f3cf7a344405c8f896a58c49950b9f897e75fb654029e7db5a74367a47b23ef7f1485cc6b28fdf34717c47265706dbd4cabd14d02e47fa105cd04a4dbf6f12cb9052303495ec84b3b51ca5cf66f4a948f466d5ad633a1bc5a46338632dd967cff67f1ebea432a0300adcbdbe6aaf84778aeb0acd3be2b9f1c51a74acb6bed9c4b4ea14416c55d2dab26af6e9935fa303983ae4740fcf75eeaff6cb9f21bfe7fddabf679b7271692f018b7e01944bf4c81e594ea4597a02b9fd4153f6207657cbfe6e54a4d0647d43a9941f7c017d1c225369b244f8c48f4386f29a28f9a7ef7bf34563e975d4a93ac7679d883d31c081ad5ab9d1f87d4fb511aec8f8adbec4d1cbdf2059f5315ae846e6220282f494b26fc7f20de9b2537c0ef5e37aefbba74197ef7bf64127b3129c393d187c9285f13f316e36b5869b0825b3c9c3479aea30f03527653ac9d7f7e469a8c4624020aac76b8d7f0f782818db61d0965ed15faa3d8c1de31498057160e615e32ca80edccd93ea890335a4c1b3e5915995e2fb9dfa54d319ee9181eef8cb94a358406007727900f0fdf7ddafe79b8f8047cc31ca889152363dbea34fb7038ea50fca0180f79e234f7522911b5589e0ed7729f90ba07b56964713ec312d7dac905e9fe207f06f3acb78726a2e16066ddc295716754a465297b6ef7a6fb8203fd5efdbe1ec9b56d3631dfa25637f3e8bbac3a8b10eb4bda599294f2b2b50ce5dd33ee28829a6b109c99c675c0b711d7ab02837aaacf3b228fa1ef444674b05e8c7ebe919ff77f3efaf4da5c2f02a74e82d9088d53f4eddbff86fc76b43d46137a3e586ae7c31c9550dbe452fb20121e47268956d743249323ad1f4914b97ae171a0eed2d0e7452c8ff78fe470be36ef09f8c3d0e61e1f990ed1e01f83590e450a74fbdb011512b0d56d631b8822d0a276d5e4262052b1c1ea109956311fe2bcef7c7b5253525930b464dfa4214d4d254d4d07d94537328ee0554b4b439942255fb7bc8f0e2e475c262f0378cd93fb8ea1e53b1b86dd6a48a100629af05961e7f296f5f12bea98007424d126ebd07f4b64e1cdee4b8b1810902cc4d28103a111708dc4f9e62b3da4b35ac0d14f6cbf470e5bbfa513495cccb0acc3c7b7cb93a25f854e2ca702575758b02b4642e4edb7bac99aec327ef52926c72ad28a8039b81215c257260b941001639306f6de673cb32916c9e2166e746e2c5a413f0dc38f0b85d856fba917ea40bd577aba8e4335a2f37f49b83605aceedc9d16a32869d62c00b16194d4889f80d10eec591f51c5886ee5eaa9e8438403704dd98f1ea7d8b4fda10f38985552c315bd67e428c4e85d89fe64412e4b70b6f06f6230cb97359b09f4214b366ae1b850de28f360492a2cb33f9599d1798fb46997bad99f868247c87cb80b5e3c3bc3128f2a1ff9b56bf651e730ccc994fb62f1d4ed60335498ed2a344166e17f985b91062736fabc389bbd20a9af4eb839d243bd9a94006b7b5bc625f1815b574432c519c8c0e6d325d0d107030321e70dcb6f63ef5b207e4d4c1545487a0c71eb540d8e1b29447d485dd0f66200731526f06e3fb9b8b96723b4fc8d877e5cd47eaa3c523c24eba4654d561d7ade42ef514a7d3307d0a8fe8e13bdd21481242b3452a498d6f9d0d67fac861ae8695df2a1bbaef22dd17863177b63c990507ca490ebb5e1129a4cbcb758e41e6561ae7e88a2be31719f61eb9986c545285f10bbd96e7ef76dcc3775ce60c80bf9b62442d6d993dfd89c460a8e726748897c47bdb947f33c1af4faa5f87309a6d0bb27597bf5b34bc12e4d3bed8bbcdee3e7f3745e9ee88cae4c19c46caf54e4a523ef914c66ddde554a844c694ca5b97bdb452a9bfd9a208596ba3b5126011f476493920c0774bf2e68b71abbeeeb0bb72a80fda166f640bc39d9507a362c5c8414a53aaa2e8a6dc294992a29b9553111afef8a3303ede244e6b7b5714083f34e126245b5ada38fbecc4ee5b875be0b3c30af7cdf3c5b2cec98a812eb09f1d279fde9af444769b42be0cb3ce6ebb2a46d7d4c72aa0e48aa5136f8899fa02d2db11da1fb0675bda0c7e7dcc760b782938503f64443377b69a35d2f05f469b1d38f93f046722dfe013a51f1513adf2617a4ef896abe444bd698e2fcb4d45a33e4aa1f3024ace8a071aa427e4a9591ae83d155828f9f51d112236f3b971034bf2d3b1fd797d469ad1a7114dc80734629322ad682c0c17031abcfbd41cd0ccdcb45cbc7c2d6cd3018a66c243f167760ed901921b0b14a2f5c985c855478441c2c59d146ba6782b77ed16b8b70a866d3e92545d36821fe24c65fc34f2a472fa878ba161aa74e7deda8f1451418ddcbf3dda510d3ac9df2046e1dd50d306fb283837db400005c129eefb64509f37d20b1bb9f40bb1c0c47d81b3334a04775bfa8a7c8a04c3d3651eb2e9ee66a97ccfd4866ebc8f9e6407381740d3f93e12168d09dcc606806350fcf0864e1e985c7b031cdab5dedf64296df04402daf680e20188df75e2371e4ebcd4cb6dcf044a8d2bc8756b04865addcc7e5250888572f5dc49603e323f346b50b49359f0775b9b440db3b4210775b97f5385488bdb4d40913c9b923b7b6f218f24d74a6ce19f6553a3e101997f141c708f4253b704267832db9568b4152509bb3ce0479429f1a9a3432f48a75b36e079086a17232c1577664155314be45ea3aa734f1049934d60eea058134c07907f149894c8b350e67c8346da2a46ef92afb984fb6c7c709bdd4e771a153cf50c6c59a884866b0b0ddd7996262841c7ad6da9278372319010fe8435df4e51cfbc3e32688bd1f12324408f18446d67d1245c8abd346549c2a0c488098568a4968cf4b0131558cb15e3f1768fcf1d1d44aac5e091e6b74dd67440b464f228abce75142cf8b8592f4f206feac2112eea15e6c718cdcece796bc71f3333b98fa79993d7ab0089ea4e89c65e0a8f6e1bc4807110b491e617962a8246a444dcf9e2b90df1bb53f02a21f87a25585baa444918cf2fdd251c37898684b53214e596dcac0990451afa4db62678c028490f201eadd1f3b9c70713267e8921a7064bce82d54661887e3ea4a71a71e24eff11fa164543ea458f462b2f4b1a086b67613d6b01bf34af9fcfd8968035797c041fb8b2306a3358174a743fcc0d1ebf1dcd253f34f4e46fe538478fd240e648ff32b06243217fe3e15c2596c85830a7f314c050eb7e7ddc42a9b5ad57d662602b1f8ea508963a0aee242f254129eb4c8e3fd36421cfd0de080aa2772140e59aa7312586d1ce2f60a7f2b6c5c8bbd9e5ae01a3b57e3e6d3ff753478e382fb01a9f7abd3dc648ae00c781cd30dc844bd6435b403c08a504f14f8aab092728a89b5b5029b0d27e25b667834ba906faf71de932be9975660a3a316e269ee1e60f0c5e6305523d4b78ad230c9859163ac611ba8223646e3230b7d2db7a6cc6c6eab84843fa27ad58f27af001e5c66675d997afb3569567ed32f04281b3b6a3a14880fcbb7f22300f246823feca2db846ebc38b5310a7b014af7fd004e8bd4d022d504a6d91a0efa107745e865e527d5b76a4253a8f44fe7083690c67a97bcd1f6d4c2cfa992d5fa8bed62672e7b1a149ad80e41e822315790187d63c91aaa027ecaea77789b7a2269db28062ea9e1581c00fb56eab0d59c87952a2f3ce13cf2e222dc3a5e42a5f9810fad8411af0339c6fea6830cfb6de12bf7e9e255619b273678f46b748f93c0cc7781719810c59fd520abf723e5971dde1ab490afdb0d5777011f7ebb31bc31a36a9155dba8fe0a589474ef4a4b94e807b76ddb9a91b27001340ea012df09f8c0d6dfa057b0525c705dca2c786040a5326e960393df6da1faa9211dcb18829da89228491eb0206002d5bfbe57f6112db6cc57a36480856706a460761de80a3d709723122f9e38e2934b46263b1d6b0188cb9af04cc5853d0dafe9f305e26bb59fccb70a2002a48fe82451367a38014c110c659507f8b2f9744a722f52cf5e5de606b33dd5d046cd8afda451d78344cb4fd017bfa2a364c308cee0ce534984e19622607899559303e953754effc444d3a24007cc026ed0687017faafffde13f4cc052f2a47b5156cd45ef017880a2204ec336854021f6e8863b26b62df7439f528b202741820be46943ec8df1385a3efa5c278272390e5006643e9f6c9388a06044a1188b25f4367e59f5ab41c47f52e4b2307aaaa241ff269b28d82091f036a13125314e74af603dd1b2c1320a55fcf823b0e496a0fcfec98c87172d4f507eff2840b634bceab89adf042532740b4579fb557032344579fc2ad1c994238cb8f7aaaf5ec9399cd089f6cb88123392a6f1547f199309c9a4536fe9a1fba3b5558042f1ec04612d99936e1ade2450c6f0fb12e8b7a544773b76b0a755c4cf348b88498bc193207dccb8f018873a87051d2277712b2f156620092554de7fa3a301cb21ffc5e722607bbdadd47ea6e50a06f65e46521833c49c80bcec09fa66f909822a2f79bd9fb23d1fe7060fb26bb33c8d512faceb4f1ccd403a1992dcff688cd71aaf425a338469ffb2547e4fac79966c118c17948bfd3e9be4d80fc288e76f26745448f5f4982df4de20232c749b8230cb6a0692c67ab656e5f2d6b2b2950c7163c5aad52fedc0211d81097b59cb4341014563a8689c2106db6157fc5b3488bc02ab1adb6312b493b64c48a1802694aa605c5941fd10d14535e954d46264405353c3c6a3516243f2c50f73849d24c556c5761b813507e8bd50ee7209df0529537d5b9a25496d96da82cc1f163cb68eda9890e9971c6d5b01c085cc585fb9896c4c1e3aed110ebf648f31a19c0ac6840a763483aa51a2215a00823aa58f5b14a94fae5a710524e239328d810803ff4d55a1693bb59b6a084854f9a89446066954402240537aab1a74947c07451e76e20d7ed08bd26243c84594caf142058484de938ed5a7269faec1373f5379b0d7ff4c1e50bbf1e6ac41188ccdaa269b36005fac7e8f79814e9cbdbf7f1dc39ca1ff7e9848ea608dd729b430a8cb0b8443301b777884935ea939bc48951226942c8eacbdc918dc155173af2590ba543644d77eb5904ce9ea770429942e0def0a6737a176b8260733993232a90b3422e28afcd830ff5a356bc2b268489783cb149b569b59f84cd40807780d67a7ec011ecafdfb7911ace189565538f867c76caf529f544b49be6075a112497a7590a11d6ec757015c0769385f08a4a93b526d1a73d585014a555f237fde5df88fb67c8cb00304613649d5b76746dc9d04ef0c2800a7f7d44e2692eb90a04aa19df09f6e89f843e7c5077484e33e8188012e5ae4f9f0c97a9eb331839c92f22bed91e2077852eb925df25f708a323283bc149a3c30c24db066f8b3fc1fdc7b26ef6b10cda4beb2b251d8b1fbe512453bacfafe30701fff72e706189768a8f21acfb84447e6ea04e30b0d39983c21456b96e13f62d0a5bba669fec1dd66970700b52ccf926dbd29a696d8e7d73159f8df214dea95ca22d8859e8e54c9a5d615e81c5906303292e8da4c2d57402587dadd2525235a09be60df89dc601592566a1f98dc60ac33248032380fda0dd1bb02fba8e9229291e1ad9d3509e65308a8ccbb583f638ca9da4b4b8769b7fc9b2e671a7c45d1f037b1270205ccee945aca4fee73e4bb1c7afd4119b4b97c84f61a8ac4e0f893cdc031642853765b9acc83364dc6b4eb60687633f835e6217be421b33639e637f743ffe1f2fe7b72c2cbc320a75ca2f46f5b1e90e89f53bf4ff3f20ebced71f4751b0824dce59057c8ec03cf8272484c2bf296c31cf1ca89c609f7f060ff3ff2d49a59fb96a4205f23abfd617928cd8ed789ddaf6ee4c0d9145d6e6eb0ce8e6b25c6b541e4f80ce7a25bc7d98270252a163ffee3b35b5bedacfc130f22f8f2834e1224701a4cc29d2e4f04bdf8e449af93a873ca6e6902fabec04a617be8220f22f86bea8f0ab2955dbd506cb262b63b0cee0c8e6c0c99d6ef63b9a31ca78a1ccc1e31dc26b51575a038f8aba8e5122b4693df8daffe2312dcded83abc9cd3d4c9eccf91a05d7472a3ae12af7498f17a554183dcef49be6e6cdbf335b132bd3f29e9ea48f7d937b407799c67bc896487ef77a108723349ac31f8b0d86b914374858590c2db1fb8f5bf769d7defe17d4058915061ec07019750f8e2c9096dfbbb4a1deab5e9140f7223f37ae980813a01dd6297d1d5b05a251212eca298dd853f56ef59b81a68fc768040d99dbfffa3545ee0607e21d42d95b32c6b1baf2e9b5aed56c57208e223e70ff6f0e4e5264dc883e5b09febcd36b8caf194b997b834373df5ad622407d3a13c370378eac0457730d3d5ef30c1802aef8f66f00aa751e148d53f29178c2944e391c657e1315536ffbbb83910089030696925d2ef3326523afdb065b024d28a62c0ed7262054a9f780a40300928066074a5d8e0f83030caa8d596370e63fdeea8f6d0215a02fc665f77ec5ce5d9d8159fa26623c46451472b905a366d6b1303d0c30e497831a1007916ea01e40dc8f7c67566c9fcb0fb11cf27a75200c8caed5910514c6e824e3f03078ad4ad5570f397d4e5e0831931adb8ff689d6afa5a7d4729a100ff6b2766b7b433c0747c6cedd34de9c7fdc3b3f47ef8340a88599b0b9e2c08ca41297c5ad2a106e98523d486bda9a0b3e02d970a4051aa835020055ad1e085cf37ba6c47c60a4f1147a07a7385cb0e717bf401c9a3e7500b393ac17ad5ef3439a992ff5f844878c81107857d343a9e9c2d6569b6c4b80f0852a92899ae5a9095db732b03b881153a4cc81112c9ea8c52ba245321e80859490b6612d3ff357cc44c6139d3f70f9a6e749b3e8a334d5a21771f644165719ed67be1c1d6df45dc617714932724c8ffa0e59a01442fce40f290ce05821a74d1d51b545fb42f23c30f807bb2a12870ac789a0491ed78b3d5594405175a1d1deca132e7e977d981a87c2c6a58a588b37b2c38dc273b984d5ead4f48a75bb02c46c4e70f50f31798faac6f9909e52d16473ed4495f8cc4fce51d2025b91f3abb7309597611970ee94d2d09d8fc99ccd422de364940127b26b35fc45b4afc44bc22120f59a30d447225f15d855acd78bc45352d0e2c7aede8d0681ceba3ded26df046f111b862fa226141d5ecbc9b33020efa88d91d60fe6e15ed38c36989689e94c2c86a2db8f9ea0f14ecbb29e147c2f9ac08141f8f922d0660d5439d65cda48cbc162fc07a84ca831f202b7bd32517e9aef51ea319e8905bf821b9574d3aa8bfde929ed2ac77b66369fa274fe8fbf58727b1f65ed4cb008314ea9e435c157269e041e3a909c9822038532e55ab152e97116ce97d0c8e600e573d509e367ada90bbe4d2e9550527702b281c2f5cb6397c64125e72a10570cb01c92da4cb881211bbee12843849d72b4982961c19873885f450f5c29f63439be48974f304a0b0558e055b5d3bfb0e4c25d44b2e17cf5523f4f381231af012bc2cd15a5008ac00269a9d5288162c98c7ed60817559e08b89718af9e8222bbad451c2b28edfc3ac768773fa5a268f4954a794a5162f76e02633096b218716b9856075a2c8cded9ed51b709b03e95a330491d705aa3e35b7f3585455083112a96291dd7659159a2182dce7e188b90a0add2ca91f2b68feab401f85220f6e446d5cefd128e0fb392fa18ec06fa07920544b95fd0a3cc2b3071766210729c3c23c0e6848a66362dfc2071ac0dd436b09024e9e168a8105221fa427b7b702ea9f8dc08d18d9148b7ce2c336ec7eb9804e7d3448c4cd6823007747306faf0a4cd141a70c59a51d142d177619d6da9c00a0d79022cb983a1484d4cdd3bdc62a782b1b26111d2af599afb3e011e87263a3a70c65b3deee151fe4811e84fa4a4a032e15b323b1a4c27c40c10d1da6bdad5aeadf143064efc1f3f74297640f1a850e4995207012c3a8f793a69480ca3f2f5a2edaa625dd9a649a73339c3729c2f072d14b94bd4d985cfe2168eadcd3b97f224c0c8d70f19ecb90f528625107849343a2c8d7812288ae59012bdf38d904da205bcde6bf2eb62c543b30887640edfc89e2f962205c402330208209b24eea35c4dca2369940d7f42fb7358907537c20e2d26d90e17e539c9fcc4de44630632ebbc5f39e2c011112f6cca0fea667ac63de1bdc16f04400e4f8851378fd1006c918686612b513044ff8c5fdb0b3b6c3720044472f33bcdc085371a70b7dc830a092854e04b59d613e8868732268d2a277cdb07a27fb5889c7771dd58d8eabf6fa3539cf3811dec747f7e719bc9a08daabdb1129a54c4d0e8032edf40173c15118fde0ce569abcb0ea7c4510c0897e232cb4df8f55f0763a744e9629d0556890dc21b07e6745d9e10c49f7ae8b9a3a0491e058fe78369347b18c8494f81e764777af299b6092a47ee0bdfc66ae11faa872578f843c4e7bb049784d3ee92a812ce269471939cc64444aa96aec686d2e2e231be1b65dcb3282f4615e973f7614369529a91955fab55a15cf2dab802186ce9ed2d754cdc50f444a276cb654ef7286f6c88d9ab89f930e29d0484de9e7423dc2d904d943f0c68420ec1f2c51da5678f4937662e73b3ed4d14683e1167a76e448b20dc0c8d23175d1b57a17a0e120b9f020fbd8e5381a9c8ba139df1f9c2e9c0e6650cac0e6cba5a6cec0bd362f114c3f3a4d6fdb518963b90557975b09a0a0fd23efd6af2bbfad048193d006b83be9f8b7faa05020393e831c7976ab4a280318167428dc943478e29d762790f97d00613f3264c10ae034edc1a946d54d8168ed8fbddb301e93c55f40a94d2178a89fa5136da8c9d212e9c749249428e8bf6c98980b4d51e475931070249ee9596ed414d0e0983404e52c195337637d89e015ed06439a2b714c74b322be48874c8aee7e639605db493921e3f5c21032b11734818a5c958511f31e9353d816fbb4fd0a0670a1dc96fb68fb2504a063e66efdb25342e327f77f391187c3f46537497f0901440e7df941d02f6100e0805f7e22a9973080c8e1971f38c03f30ce70f0fe28f81be8b02540f1f463c9c0ff8f7651b34b696d893d09c629aedf88eab6b347fa1fdf19ff98e90da56c9ee84fb95b8cf51bd21afc3f3147053c9eb8e386eaee83842077330d08ac50bf3d03db993ae1024f02e1e07799525732b069e2950d406097a7b172656160b64f05b1fde10e17ccb703c2cab1255ab2eec43028894840c33786e1d7c46958de9e49067025994b1077b4b1f13c158ed6c784361ee53b9cdea53dea0d7a63a471af5972d8830156af29fb32779ac6ccda05fe2a66ec629875335efaba054a90532fdc7a7611514d0c387e7fbbbe3b9fb5081f2002bdc2476be7472cb6748fd0036f53f3d94fdf9571f7c4e832e18490189456e7bae1f7e229e0631a9ad700a2a29eb30bc823e64c142bf1542b0b49e909cb81bec0444d4f921f661e8aa489999d4777cbf1771b5284a2060ab67803008a6073b0f125a979c58f93808ac65aa8119d5287ea1a797777c24cebac7fdf8ce529acd8e1f4ad92a8feb9cd988268833113144ff5cc6d991e95f62a7bd68095515ed90e1e56ae32e126de38035faddf2e15e6d031c57621f548c1f47508c44d1000a54b3fed71a44f5e875e0abb196b8637184cc194f6f16b6f1dbf2e17716250e5db2fda5132b23ad61f81ce8f0c2d3b35fad555ccad0c0984234c7b4e8bd272f7eb504ff1bf68f69dda3ec1ef1fad2dc1c1ff5cc4153ab0a5779c257aa9d7ee7293a31b034b13eb6e921aad550a08fd7af282fc17fb111281b087ea6e69a01d414a20281d57a13fb1943fb5fcda73f486762930da310e449d52dd48110baf91894ac6318ce17ad66de18bc45427ddd70886ed31611bd0b585c8ae9b1e62cc16c169f340c29ff3e6838700e831db59486af9d77b40384ffacf5ade05005f07f27d4aee0b421f92294fe6e14f65ad6ecf706f3cdf4b8a1c0797f85e9d9c9c3f66ab53c949d039dc25ea1723f45fb14a1a807f08f8b63bfa9e7e4ce234892ba52da0d46cdf0045421db36ad927dacdb931c329d9a231ef5d2150962df6adf8ce9da57aba00652e48d6a25b1cd5dc92e361a9e6db0087866b1c848a0968cc4d82d2a5b108a0d9b51dd51424fd1b939c8ca373034d5a4c9cd9d00aefda82046be32ecc3df3b0ed706506af40c0e666f7ca430e688c36bfe961c4cbdae6db508101d00415cf4ee4d909092e77394ca064e62aceaadd746a139fa5c5e76cff9535499d1e71e680745a611ab8361359d1391e0713ea4c69c5f0b2bc18da1c043bb99480b324492d0db7da58aa72c8801fcf3227cec6e0f9324d549e35da645ce863d0cf08299c28195d46b2639e985cca8ab39568bf2174d0fee689990b2da6aff5f1012c0323f83ab48ac1260127642e4e520e0bb5f75a031ad4b6cd8290f344ab1eb6c82dfb8816981321b425f80a891c8a3d2fd326a148a6807d673727511a5120534fa203cd1534e8a7d25b9a10783512ad40f66ee768607c20548be579daed9448bc7d82ca57328d329d214efab9e27de2d8b03ab4b22a05b26fe5630395fabe644868f35998b14ea43262d940247b58834036ece2b0027464d2f19b30f90eac84fc5fd0efa495e133c9902e01ecafb511dbb837018ec40d30c9a50048cc3869bf948e12208d6701e3034e4313209f633412df04a9e74d036d963862fbd9f15ab8fa7d168615bb4ddb2a5c6aef0fae57c893da9d20496fbb9f35365094688cb3b81ffe492c54ecc68adad8b489af766e86cc31605b0edc0ce563a57ecec2b907927f8afad50b78cbbd8396255f9181b482c6174a9457175e2684cd8a300393b8ae20372d1269c5e45c61e8c4cc0486293d1381dac765f7d7a2adfdbc162d5fdb8ad6ea53dfac9939a3151c39060e1d34997ffc8ac01c1b069000299a880cf3ffcf32c93b18c55de1780c86ee972df0022719e6eed0bf61c46ba594d0904799b37433f3b2c5ddb6cf423200ea59b0c6241d7c2347f78fbd706e00ebd16e0eeb462b07f645581f4b7719f9ff2a6b710620090fd5a169d2f5c9856015eb3281bcdd504c0c871988bb1152dce5af9e2642cca3f8477970db55850bd462ea31f000d543da8f48c6334e4f096edba137eaa161abb44d6833c3c57eb61e80c7ed25102f285be0e1313fe51b6afc8eb5675b758b65726c18df08bbcef42ffc6e8e994a8d1d7c73566d331659ae5ad4b954a8aac648c76d4a2ecfa82862ca324305474526c50f361640010d20c36925a653a88b6267ca8be1bbe32d6503d382d0a51f6aa89ba2c2d1b74a3083cf0dcb602ccd22b9a367adf54e468967484123b6d3aa9d5304e813482b22e8e6134569589dadf6b4f27fe7049b0e51dc9a09cd85951c9576ab5da0d34df19b321440da8f1b5a91954fe6cfe940cb0fa8db84a472fdebe1a50c1f778824abdb69b6ec6b8f3c0b805f208c22366a0de99afdfa2123e74c252ae2a53c22d52c8321acac5c6a44db98e957cb776dd560d36346394fbb611b223421ceb17901345a555560bdabe9ff2f1ce90efa1db64f7d1b2fb88a84a3a5c2b041db436af519db8647e7581ec29a66857d7d862248c1e8ae1eb70c745ce2ae117ee8b433116318986e63fa5f8f5066da6f2c587fe39551ce081d7fce4ca9a20a813813be898b6c072748861977c95c51f8f49b5ce6ec7a11479b5facec6ad030f6fda830850fbe46e235b5d39f2b0d9784361040ab1a1a92f0c99aeb3cec24c5eef0b48e15140e3ebcd1856b7f792c42390c5a6ce9f6e05e0cdfddc3e0919a31403d8523fb4f884f935c2b341a15dcdd4e8b01c1c926e1911e7cbe034c382d47fdbe5e1fe60030aa2a54791748284546c39f1343859b4d4748104a06cff1966a52a96cfa17ef272943566a5ae69bc45869662757e68f3c82a94330bae4f81ec11f69b50ca2d6d3f9eaa679a80e80f465679d690d51568b296d9467b506cec0251d5a8d0a83e4e11682f13bdbd4a3d8c317882f267019bd36e03928a9673101f8a7c157e954937c0139b986f748a4c5083bbf60d1e85f7511ac677890b04432a0fb30d322615f4e2b549c156817646a76bef66fa18d35396625f62c03f774d33bddb4b37a15332be4b220b6fd17071bf190428dc4b5774cd8c3b7c43ba66a6ee67eb42ab77497f0e1f12435e2f90f1d33fd2bf3cff000d6d9111466e67ff26b2d76233810f983ef589a20b134fe9bdf231e490402224507486855c6c8ede59141354fb10fa9e786deeae3d93a608717eb462205e30736b8909af472b8e5d0aa0bc9a55da593f1a4a0889f0caf869231c769652065a73f77c06fd74aebdd0aa58a0875ceac6edf1bc9248a08b30d06933d33a6aa883ac2b44d0db3fe46aae862feb5bfc197ef1f4395b8845ee1b3b8067199ed12e34b4961b68e21fc899ff028663169961cc496d419ee888c52e45c2c07f58a56e2dc44bf33bac7ca1cf7389614debf2b4259153052d83bd572d01742e06ec9ca23e2566716dc282581b5dd64a0b98a1bc4beb98b4266eda4c2257cf42f309f83f60a2be3bba9df29fde3ea9cfbeca88dc58aadd716088cbb7065a16b2c764a3e4e71b72ab3e01ea5152b3616330d11ca6a83e555ebd2662bce6a2cf061f468fe2b068b19c4a187562c2bbd0622307d6b2cf006fd98c4ff22fa36e0c298ed946cf9920a430df3f35b046d0544bde2b21fb9416e87316dd20ba157b8f63ee35f01065d19080fe0489365d838d9fabb692d017246a20b8bc0e0ee947b2f57a84026e650637599a78f22502837062ba10ad168ee1a99838fa4bd2b59e8ad6fb2298dcd104dc7d01be2737bbbb835bac9c221553a2c9256446f393469d9d0ae3eb48570d9933865c246fcd5ad73e8993d059cd379bd91fe358c051d1700df621ab0a183d976c3752526386035fe2cce2630d05b39af73aad46ab1f153617bfbf336afb77c9e8ed2b13787edc665a7917dd2b914e4a2b4c6a32c598c1b8b0eb477cce570427c789e874b86185daff150d8c60f6d9d5d995b0b84a4b989c0dba50f9ce39e64db11706e1cdf6a715d65099b94b42b7c1c4b421e1c542eec5a0ce306337641bd7ea26ecd796aafa3fdb3957fac69a54645b177c014cfe60a4f26aca750982d9167041707b162b127849cad20367b28e26ec35c905345443b29d63a097875d9571f00db1d10c7f1525ca8e319f8467350ad147936f5c48de7242058b98210e15ff50dc8f626c67a9cd824cc1b58ead4d4c8811a1e78b294cc7a7d795007835a552cf6133a3fb1c98dffd68cc0478ec07a244a5db73fc5ec5a30d08f4f706c7a0ce75c455b77d36987d608a9e4ff2c55425fb77bedd59c8eeb3eb3f9364d7111cec7782bc3db08a54ff40c6e9c66f4abcc7f80ed650ccce8f10423b86fbc21b13a4a64b28211c1e66f7b437a2b34ab68e4ecd32f2302a085e4dc5c480a7b64dcb017976a227d0f1272e5ae6ce5a27bfb325664236678c34fe486639e7b6250432aa39380bcf077f7ad708dfaea88a815f9b9d1aada247d8da4f77cf998910925496cdd3efd02f302de6a1802c4e4deca88333a7594be883ef57a97e7ffb9ed23a9255071a3ef586873cde54a310728d6f9aa9be33eaf809807ba5cd0030a9fa2845b3092b24a07ca0127e063ae6c8d369a35f26ca411df7492d962d008c0b9362efe3527dab45512e13c63ae808d3138ad9ee6fbbf872a02a1658dc9c927e63498df73f3494381914028c843300e2c428b2811d972ef2da59449262903db07ea07c908bf62e5a59d67e2d5b6ec174aa0a0c5040777af1796e9dc58d2c98c30a3cba852a329de0d1184d062c40d5fe26e67b4547b6d70515eedcc0d4c54f8c175875be4f81d842d1b34545bc516b7c8f46a5b689020a9b672645282f97302a156faf06d5629a534c8a554ca39e95c452999bb942fa59c52ce39a764b5404eaae9e8f76aa9d0951ec9801e6d78eeee8eba59a5c2a856051e549b7222542f2cb33c7098c1e3e8e8e8e8881edda38bc2119384032e7008f55097b20bb3574a29edb61369e2ced5da69b55abecac212409629fa3397522ac6a575ce39a507f294adf990704a5f11c1927266524a89fdccb6cef4c527cff72bcbb22c3970fd6343f27cef8139ca6760e4d55a61eff39aba81def7efe67ecef5f4af97539f3ef6722617afa7ad883dfddd6c9490053081ec52eb71b30d20a73cb3376dd394e5d76d08cd5886bb10b2ecb27f0f9ae7d33c7dcc3cb1cfeb92312c5f0dac1022404e97f46a19c4bf94e7b521ec2dba27ec974daf4b4ab7d3351d943aac9a8efe884ac94828faa1bf8cb2ff757bc323d5522925adb5594128518dba93dcadb528540376e25b4acaeea82fae7bec52b7282665563071829a641491aaadf2275cdd7009a7acf55e5aaf2bcf6879f2c9274d40bd9af835405c58edd5f244284bfd9bcbddbd6fcce6f589ef7d395eadd794ecd8050e6bf556db49a18b6a776cf62b164e165e6d0aa7212842780ad96790f9ac745e98e4e2b3629792baad94686bb664cbb7953f015f4eef6951d6fe08a7ecfe3e93dd61b45c3769d60413e23f9af8f23448bc79c118c04010de95947f34490c853a884357a150aa8335d88b9a917152461733d136dd32bd4ad93fa594524a085f42c7edd65ed41717faa4103e28e68479be0d1ba853d891dae9d047ec4229cc127b07a1a1a480e386cccb0c4e3d2a8307a210ffc6bf2fd5c688459ff11d33b39e50e0c74ba2495eed51ee9f4c2851f1bc7a9442ba4bf9644cbfe88f7fccb3cb8c3104557b294d5b11ccf459966d93939c73916b0e72da7c9a8f17122270c555f9780122ff4aaca22f67b0fab82fe7dd464004021f7e77e57488535ea509dc7d957db2d013f304643fc1b77773dfdd3ac599a6ae5a134cb8f0cfab893f629c49393accd22d9c4bb4942d1d768be146b4ae5067547bb7b828e910ee905db463bddcd3e9bef4b0ea55ddafcb8429591ec455270b47df6842a686a5ead451610906cedab93e64ce28e6d778738151a7d7eab5b51d0bc8efd5d4af9e678e49a75f26ac399b3a9e73c64c42adc7cb775a9dd2f953fa0095823f259cdf5206a2503232d55e59e274522add7ffa805db2a35232318bd54c2ff7946116ca96d37d316936c357adf77a4baf53429948c839e79452bed75417cfab7bd1a7663f8412b68cb4a9d84b948c0d21544a66897cdf62a0eff3232494fdaaf86573caef21b374d99ea34b972e9ebd57591a21b1ec654aceebd220989d6eefa99473d299cabe02a357695dbd6e29646a00538898926a02bbacc6e2f276855d17cb59ffc2d349a9ac1a60b53c8cea5e234c0ca5f459f1e63efd98ad562cb7d6f7aebdd9c5fc5d927ef66aab90f9d2a54b973a6462ed585c6b51d57ef7a99e0da586bda9542ab55560b31745a506b618bfa82814c513cba47d7f771d3c9b521f2a31067a15a1af7e64f93acfdf71f2d2a4417738acee61dab68e0a6da3f53b2a23c35db53027dcbd560b27775785b792bf635b98d77aefd4a9b276adf5df0bff8e4c3f3829e31d65c77ee1cca2d6ef6896334b99a58c59ca872fc7f4f2fbe5682f3ff572e895ce14bf20993eac996fdae0ab99af6dfd6ae6db2dc3aef9755219ea8c5f2d95124eaddd09da03bbdeb7895d4ad419f761d95bc97ff1c95e2586b12c4b0e642ccb2158f6297b508e5d87e72e1ffac05bab5b982ba821ae7f3f7f39a7bb2d4156694d597ab3abfea45442c98a4fbcbad7f8cef83ae5e63146d3c4ac66bd632cd3d789d4ab7514924a34b37267b1b2fc991b5c665637762cee2a66dab44d8901b40892831b64696675a3875535c022923454292d465f588da36db20903833be7b6b2b84b6954f270c04bc69e15a3093fcdae7e649bbf95c42eea137ba4543eac1ac07902adbfeb612f938295e1ab639c9b570b553e80ac2096a1c1ab4f29a59c737ee7b9da9b74515eed157abb796dcf979bcf4f963e51cba490ce7366b973da682fe15b51979a8eda5a867dccc77ce27ad5219dbd575786a1542f0ca7672506ce4de1fce70e27caf3ea2ef4fc4929e5acb68abdcfab10e943a416f0797d815b641b45ee16b9832f49d089d6e21aaf267ed472e1c7244fc5d8c53572d4e13680420908b7903fd47aabe4f85dcfdd52edad82d2c1859fca6fef83f282c3135b3c2810490ede7a3d3259ca205c295ff49abac141879299896204495c261ae12ffd6f4effee1efd5dbac026f5a57f5e3fb253207bb3a48f8dbebd5b207845e1ade8cdbd58af267e086350dc9d90e37bb5ab11a27ca1445d65a524aaad3555efbd3d378c6a2f0a95a272eff3a8648b2d64acb55726f56ae2a36cd4602f093a5256dcce2dcaebeb00e1c75496eaeeeec1ed8673abb8e5f189468245cf90e1773d3d43eeee72bb21164774d0b3a9a183a42ae1f33cfc1d0c611a173edcf5f873c224bf7f2d1f3e1f889279b14d1d506e1c0467713b8b3b54df542ebe8cbd2e24454aad51d321f36ae2c7540afadf94141795d2e1037309af267e0c9d3b19195cc5edeaed6a5f4e7f1fe17701fec3401868094f04822fb12abec7ed7bf539b63c9afefe2fba5d8efc027c55bc91a63702dce07eee72308088dbe5c81d6dea88e489a19096858a22eb3ee351b0e4cea3283d28837e0d898aa1ac7d265bf0a17e0cfe3eb0cbcfb40d663f422df946df5c4a5efe7af9685471b76571c767edfd7d608f4d686f88cf4baeffbe75d1281a4549bab214b90c194152841328ad2a58daa6737cd7d2365d6489f6373cb7c43f368173e6805a63d8f1f2f53b60f6ceade978af005de643f30194b38f4db48df6f135dcb58fe913e49a0fff0bd7eced06b38fe8a4571a8e4df44a6af78adbc526ef9b18027307eb06331547e08bb225377c0cfbc0d88413afe67984d20165ff178d6e48b95d6c92e3c7266de324362185aa92c7d3368dd4bda761e3ee01852208e0f51d5cb170e4a4af36847f2479c8688413d27b3314ec54dbbc4c9c120dff1d88a0102ca2650b962c55945a4829402972312c045fcb162c59aab452b71a690c0c8345fcf0589df231ec319e8c5df2eb0f32c9121c9ac9988cbdbd4326e3b6911782b40df657af7a7edac6b197b1f797310cb7932d5cb22c295d414a3a8a029b9cc4b8d785bb6e92553d88640c17e523bdeac14d9269b81836d2ab78c44f59a291f88314924532fcbf5082f4482985e4906bd9b2cad86727242ef670909e0a4397ca5ab864882567c959dc4eee90e17b15a5f74eafe2fc7a55e54a0b09ca9193268a60822409922223478cfce0433b3811975e5d18db320cc3b08745328c4b19462d36904e51034ac65e36049edcd72477f14af6737eff40addd56908fc9c75690f281c8c71e834cdc873445932c1ffb296a34c93060c9fe2fb4cd9b728652767f59b2bf096d2e0057ef050bbc1a7f0838713b96779f6baa5a6c933f371df3e30664fe7c0ceb81e10efbf932fec440b0971f9fe236d22b7fd946765efa87f9982b797920d8f7915eb9f0f2524db87bcde28e35f10bfe3faadc975f86197e1be91f1a49096b486114c5263da428a2e4f8f5ba4ea71146d83a967c3743ecaf267e4a07b77f473e864018b77e0320a0743104b480af94e4b39757d33cb2d759f6de7befbdf75e8bc78d18638431462e11462cb2d73618969334c93939fbcc6d46647baf46734d874fe7ba754159eb361094b387df5df6f16d8dc59df6b44b972e6b64f81a108887c0fc18866b97bd7ceda1c6424ecef07b351aeeb08f5dfd0a25fb639f656d61fd88ad50b10b670fcae03e241b2065fffa36b892fdada63dd6232763d9d7b7f55de598fd0c77adbd863b98b32eebeac70d484f4ec6b0067232f6187eaf267e8cf582ff904885728dac7328c2c2882636f2438262e461914496ea0416463829038b24c6382d81a9e0941f12142058f54a8c6775add83a1add3fa577470c21cc6ebc8111165df8acc8debb89fd10dffb123ba8a104b21df1facb95fb8e5b7b35f02d9cb9c772e1f6458bb2d7ad8dfd1e3d4a77e91dab401cbdaf8adf4b7c2daa573d29e932f7a49a0c0977e0783550da4c8fb1d2d883550ebbadcd4cd5d94939e786dad9c1d2faf3bb7afd97ebce0eb743f9a0e14eef3cdbc88e7b6cd334babb5b48ccfd56bc748b72eba89b8a53ca29bde3169225e9854020b63b486ef7d93f9b691bb7b0573633107773f6a0327454b5b787e53cb84dafc88059f6705761cedc6c86b006f51dea7a8695c27f327696f92094737e67279d7462219de7933f6fafa095120601d66cfd3481216497b2bdea24beb6a65cba37945964591624c7963fb3e7ddc19ffefd8e85788634cce47abdf7170632bfc7965b31c5efe14bdcf3a0f410b627cfce24fd2cd2bfbc620829a55ba53be843e1bd02484971cb2b039172eb4165597bd563b3c8fcdf9b1357ef183bd8b0e17baffaca5215b18c6aef948bf26a675a314226b28e107abfe3e8f168c95e297b09c91bb6b23bb1286b1b8bc7a148e324de64ef383ae9a51be250bc8943350ecd38d42650497592bda85eea2b2608a29796b47861a8e08557eb6aa050d3bda78e0aa84aad663255fab088abd92adfe5754a8a4ac9d025747503895c628616cbeb8c2c1c26edba4124f6d794d3a55f11b2f6fa8b327bb34e4ff76546b3d98d77938a34d1a662178d62638679c217a74c9acd287651eca202d061267914ad89961851b250ada1560783a6ca40abf3602dce09345b66af9733b1d49aba56ab02140033e00804f451b5b2f29fe8d55e2d2ecaabc5d18252364b88319e5725affea4b8b94114a2219c94460abba13c08db75d89fac164caf96a6e04d3a6308247477772aa4b35c3fdf219557a5754a19825a5f8d702e65ee98bbfb4ebc527eac3a5156ca2a72bdba5bebbe0295d85970e1eb44aff6ad71e77bb556ec7d5e9da5049542d158fda19cd3abf4c8030ae5feee2edda9f44b52e93f7148c37e71baa623252387c416017a20400f5ead1f65e1fe2c16f63eaf3db82fb5d62afdc724e19332c3a451149e8219adfa729ba9b8c261616171a6ed8447233f013b345b4f60a15620fbc3cd696df9a4aeb28c58fc79cd3aeb9474522ae5944217754aa594524a4a29b537bbd8adb506b9fc290a8cbc5a2af23dc93c672f317a8c110bf1e12f5f7a3483e5b5dd5ef16a676b373bf06a3bcbab2deb856556db11327970e77bb548f63eaf3168498f3f98cf5fad172e52a47e0d3a4242373c475ff54a370b0f10bfdb5a6b75e059462827ee01dfe14b88c3d072e77bb557d8fbbce218c9410e9cc85e082184288bf2c248a6b18990209a9e271642b37c48b3bb1053cac7c5f34ab31ff106f5d825592f38302cb8d89ca86fa5b44b665eaf0d72a72d5b91e511d91fca1a6c8f3b6ddba539214b16fc2b3027962b8b12242a16ad6b13cf3d35c68d349166a6ea1274a7eeee90884ad3abd0abcc6a41224d0b8d1782c49b2b976e2af5012db4f550d733783948e2cd4bea4229a59c73fe3cc1e0f76828ae3038ee8008690743485a2821593942d222a9c8c599cd7020f3853bc804167df73c2231b596e42a23089e1617172cf181346820220d248e2869811431aca8c0bed42782bda8140b07479106858806f882cc08421c3829c0294896e00d7eb094fbebcd6f0a12a54cf39b82848a960cc9154b208db184075d70e0bacf700727de38074496d285162e5c2cd1828883568048e20524f00287308ce0a0166354e182055480d08208195c9bdf142a50e4eee629548c64975bf39b42c5099dd291b03441b272940190df142a3d4ca1c2039523b29523467e70c319527e5061931bd280d29a820748504cd172840bed99174588182c71418ea5062d0c2e885573941e488084eb0d66065cd6363003290a212e08e6600c17603103022ea8041ac097c9817bb8a110a3881097d383144546425ce6b13d9a70f8c00c4eb8de485882cb241823b0010a1744a51089400617c4eaed47003f7041afb5c560043330c105d927a070fd31ce400639b8c20565671cc1f547fc036780849224b820cd8631b8c6f44d1f5a5088b8de04f0031714616791bd78f3d368a08194c4fdfc04bd1d1c514488f30fcace5832e27efce5fffc0451252b4538ffa0192c4170f283ec096e50829bfff394a4e07e8262c4e07e265e025fe225fd412817708e97c47f1f14e105cc28f201fd7a31aa6d24edad6375f5259b15bbf022b63dacaa015606d2117b902472b56f91bd782382185b08915046d252d294a51da690617403a52e493fd7121a94b8a0f7c4123a90817201143ca4a088cb22d192235ce64eb0605202182419e27a6335e11e165ee0a005d9cbddcdaf84d74a4111475c066160c41097b525c2e8499524489e5c395204450453b4b86c4ec144042daa240726399080cb10975d573c192a9a6288cbb22ba088b185cb6c15344831830b42b5b8d708e864948888b8cc74c5134070e1b2972753cc50c465b70a132841c4652725b61ce1329827474c29e2b2182078201aa208212eb361c3133e180a81861f9cb124828d5bdb00a54889eb8d65c4652929671071d9083d50a1c46524583144e43c30c1a18823ae3788a4c80c4a8509204831e27a8340c8e0092e2be10a2b454f4c2005132e33e16f60c28922ae37191d70410ddd04edad179471847b4f6090434b460ab47153412a4c88e008f7b230038911a7f27f5548b10225eeb598584112d79b0abe8a069cea0a97c523425c6f389470198c0da369a657f07dd8018b1117bb304388238a430f465c506fd862c4ca9554448716604048e27a7b2728e121091e70bd9d8c10610026ac504308aeb71314455ca6d9b8bd333eb054f4248b505103b1058c25ae37150db8135860c411d7db3ba1088c21aeb78703101c6971bde13882ab811768b4b8de64a470bec10c7740050a25ae379c2a5c16c229841838050862b0c4f50643a00347040675c72ed915f76df6fb673e3b62de71e30497e742145a28475c82940e8747bc49354efc2bf428d037379a06720151b8927d43f5ea6fb03aa3584e8e1871031f5e20450b17fffb458bdba172d4fc5b5be1467e18460513ef9859e2f76a8088724f2f3da071902c45f05e0a4227f0e183eedfa564fec6028fa64510e1ca2d30f06e66525cae9699226cba39c711ff0df7655a61608ce26d3b5e0d937b91266e2fb3921c4adcaeab746beb24108decfd9bc9722871fbdfd682e4aad420b924ce45ac7aaf26c6aed2495e0d7c0da58ff07b213825ab4498e48aebbfec52b840c60bf35dcf6b65d9fdacc63c6377c6defe7b3970bee963c45d7dadeb21c2a46e4498e4a7adf072aeec7d1c0f19215fb07ecc3c8bf19f9fd5ffac629f0b8542a15028144a013eb8f04f30db6993fff2cd5eb22ccbb29898ec8a898989c9ae8c849ed78a89898941a15028140a8542c5c4c4c4c4c4c4c47c500c0a8542a1502894027c705bdadf784384899298ef181cf45adc1298864122b340e4c7ad8b5d64cc5e5e5ececb8bc9f4724c264d7b399af672aab52fa7e6641986bd1c0c7b3533e7ba5ecdfcfa726a7d35f3e9cba93994cef972e694f2e548f96aa647f872b0f8f1e5c4571363bf9c36cdaf97e97a1f37d5c7361fff0d00c12effae5e15fb7cc51efb0b4b018a1b6dc4b55756fef57603f22294258e7f0591f2af9756fe55e34f91d7a5063b20e30769a8b14617eef435406e88723610e14ef8e12efef53a314eacdbf1b20f8db66a3a3cc3b6b8ad60374024c7aff57dae68fa2ed6384f5f4f78d61ce369621f135692c3e9de7befbdf79e4ea7d3e974fa1b70b8d3079df08d34f0de7b5fa75380e2ce7ff7743a9d4ea7d3bdf7ced71e4208ff693c5e7eef4687bd7d6deb82646b3720fdaa1e578edf43f39098e35f11b8e25e0fbbe4ae3e864d16e64fdc5db8ab425c55b36727742892e157241f3892e1bbe6e3453c24031d91ac019ae713c9adf5304121212121950f070c819962558f9afd7ba863872f1d0210b2da140311e216087d7f1ff99d0cb9e221236cd7755dd7857d260939a2b8efd18afd46573185f2b7adab4f6b86efd17414fb4cac04c718c017438992f852ca88ab6c8f31e277376f54f647a5a67c331ed748814da37e8c9f7df62095fba2c0602893905f941764995348f6b557f5e343391383140273632f193e1b2d85a7ef26156966fd3c3f859f26ac6d291c88bb1873c4c95f9f840834516b6d9b09f3f3faf7528028e0bc02cc9f9dbb14f2fc54bc81c13a3875f1c5d534b5894d8b31d02ba9b1f019e29ec75db8ab54842eee84b9b75a6b9d6dbb7e39e70cd2363a92d639e79c736633cb66ad55e7e5c4fce4556b9015945cf837727075200a30cf57218890b6a93f7157e7552b8544579b96f8b793dc8fc9e0287f9e12851884605f7be5032863df5bf68dbb2d86fad7d34d08cc34bbf1650412a1648d852dcfdf893295e5cb77268890e3cbc767333fdebf1f9fbe7cc4dd755dd7a75e8dfc930aba07c5be10193ab0d39990e1842ab48d0ae64d3f5fc2601fab0cf330f846afb43fbdfc067cafb4d786d45c3b06986fcab4759e356c7764d8aff46eff06d26f1d060db9d336f2539bbfbeb76dd470310cdf5ec9a7313fd933c078b3235718e2c2bf9183dbbd14440166297f87e765779e87c0d70151a74fdadd7a5259fb974d65bf667bf5ea7a6d53598c815e5dff72cfedd5bb92af9a1fd657cb210a3d0455b5bae07fc2404b8080eec77f2be458e3ced3fbbb70615555df6afdf1d7587b11af17702a72c373f1879e3bddc834cdf702fce590842a2a70256dbc6cd9b2e595529e7e0876712f871d4d4a4278a8b9d05c08781569e4fba6c3e2b1c90070b90d8ff4ff8837301ff3f2619041661343dc41a28c7f96c0ffb91ff14ffc7be92665a6ffb8e85f7d035a02fff410f3c4bfd757a0f821bc6f4036b20cda9e9f1b10f874ee14799186666ecfc6b6842762d5f5f16d7c0858357f03525d58059f874735fd437817e2db78ff101e7e0836207c6c7e96bdcff5f67bf40a19ce7e3e84d835ebd69392b3ab72550013dc177ef44af64a6e2fc4937c91daf6b898ed7130dbe34c44847ed434916fab980e51a0f9fd9cfe31c71ad7fff440f1eff43f3d8f63957c7f55fdd3fb9f1ec33c11abe4ab5a38bd3f4ffcfbd967a7edc5bbc1909fb62306ece9ab7a74a6ef63fa97efd119fb17bc42ca6e8fbbdbe334d3e60366ecb5ad2795b1aff99af30f00c6ed8f56646fa612b93ec33f3f447ef52af9980cefc2059461957c8e935bddee6cbd301f86f93bf37f4c099fa77e56c907eaefbf206e217e7d9ef8f5e5032d9198a79f3e5074cc43b1ce03553c9fcb41c6952f045b5ab1810837bfdf06229c54b9fcfa3c723ec53ff0a75f4a16ceafaeac38bf7a5c6b91238ddbbfa97c3e4fff7c57490cbfbacafb715387070bc7274b87070ba71f7e1c41461f6a3b14ab76e484f45f98ef2d0440cbfdf172b40c43d27dd8b5e28d1569fc67dc78441a7f999aa1e1d61feeb115d7a0ffeabb009f62a0ebe1570cb48407e8a5fe85fa44b8f830f4c3e781f02bfeb91e62d5fb81dffd44b8da04b841fc1f3a3c54ef85f0549855ef8196f803f5d7075a32310f7df840f5fbaf4df5b04ae216faebf3f457cc039f3e10c5ac1c40602dc920b2fe2caee48d082d2121a11938c883a788faaa7c5165658dbee892bb67f44594dcbd289e39ef47461619feed6a86331946a2eed6444872fb9d28b390a3d2e5440422a79225ade1e4024a9265890c2bcc68c285833c0c7981c609a45092822394b8173b641492174532cc2f278d7b03cfbc24713bcbca7f637f346596bf27330c219944a22a464b52889861889828fd99d632436d87bbbb9472851d33be688a3bdc754cf86a1e7eafe69d20c57d48579ac81deae52619feccea46c3d6fddc3d0b3ece4d0d463eb0840f4cb2604247d2932e46e0c04319495c8e1a37bebf4c0ff73d8abbf75ec68fefbd175f743168986204263a00a35585151aa6a8f385d42c3fe9c70bf1c6be0b59661f287bdcfdc73dbbd548801bc88746f2e1917c4cee60f146f51efbc7496a32bd3c8681b07fc1ee1017002dd7e8e5dc2c1f1eb54d4b83ab192e8c0287b27c09956409a1c81f32f46bff38a96aac6ae174d2f08d799807baf27150c9cbd9d243b26a3a5e2ad2c89735e2eee224550bf74fff23e6615ea7b51d2a2697e66dccffc8bfff308f06b73c11ae1ff2907e372caaf7a725d5c3aa16ee6bcfa3e19f250ff3687fc249506adbe38c228d84bfe3e51852afa6ffb4d2b6b765d06a9b8ac7f4da9bb086efa6e2d1febe76312b3f8e0e0e0cbd7aff6897358456685cc211d73fbebc94a6aff5627946f2ef3777f14f1087bd49db783c9a87b3690f700ec39d8d3022b24dde0b88ffe67777a669e6b37a01fd1366d90d21eee3b06aa7be8a2753d22f94fd4c692d3c2e005aae0c2f47cbf3a1d0cb199a708b3f184d4aec3fcd85e62cc689343b9b4efc116188383342b77b5b324e856f42ed00309f046e890be77c135e8efcf90078391e9760cb231944a1857adac66f9e120fb75f5353e29c6d91d3b6bbcd9fdf35de6091dbcd0f865ecdcf41c67d59b553e4fafaa70cbb88697ed45646ee4fdb74af0a19daa6630999f62d9e0f434f4fe8244fc824cf22fce6d45431a85a30bd7d1e937d1e15c52a09646f7a1e8c3ef6a637e11f229cf63ba67fdccf67b1f072609e2f5f6a3ae48c3473bedd6a9adc1fbd9a2ff14eafe6e3d8e1367d9a8e0cab2416f916ff40244438c78ea81cab5ac8b2c7de2dfe09f2e2fc0c13e188703a7660883453e99e70c5351a755f2ae81c24ada4032b8caac8416809bd32144514ada229559e706184c5c50e193e8e14bad882c3ea6229c3c7914286aa9d17697cdb3ed2ccef82283f31f243e22209cc8eb6c39453af06be0066b8ff020b4e126c86b8efdf4bede83f000bfe5337ef08891a40586305581061c1c1e7019f051f27feeb58f67b5859fadc3a6834ebcfcf121efb633f688908121a9d48379f9fc7c9ed659fd8c3ca8deb5b9a53261860cc0ff8c088152c21e20a1296071419a24b193618010a76180109152b4ca85072a28b150c891d7c0002113a18a14405078568d23aa2061a6cd1032125f0ca8204a12221a4a42f949070a00452522b8b0b49a9480b129724468084193e2081153f6021b2c20a2b7610c9f44f10abbc35ffb7c1fce4ce8d34f2a12ca2932499aa16e2d777a1ff52b5d01f9fa73f7613d58a7ba88fbc1af96f93b91569248aca4df54a92e0c3854778b0ffe9c73024d221a97835f23312018c5c988461ab5712070e6e67e5bf1919db6d9816d2bc1af8a88eddab5723d34929e59572ceee5019c68f714ed8c4abb1717f3edf5708a3bf86f3755a6e7006af264624453146a218e5c46fce984ac59731c6fa85951faa0421672f6f269a1010c4ed9a684b07b564086de00ecff1c58519e64f3fbffff43a0db770f991e3c3d3c3e0d306b5b44d5ce554510849adc591fc90b41842b232467e3e2dd476585ca5114d939fc38bdbc1233edcec7900b1c8b492da263ea44a57a011e7c300ad3dcc14a5f930409e0df38c568eac18c5efd819b66fb242240db27f3469b8897a05bf89da080db24e6f01a438a8f4ed573439e8d0cc000000004000f314000018100a05c341b1784c26289ade3b14000d7c98486c52194b44599003314a21639031840000008008c0084d6d144000d297fcdd9f685d7ad3f019449d5ce087b404118f2ee5bea739dbbb9384518401c443e7590b026979b9e80c1819a6a4186f05715789eaf8032accf12570201605e068b89a29be0354469f4291daf82d1798b50acfc3207ad4c1099f1a07c649ebc74bf70d1ec07f66439b0e24cdcba1e550be9fc0b4ad8d8852b13fb3eee083106be3fad5e10efcdb087618fd8e89cf234f4d4440c524722e8bc064c623787894cc0a44c780ec2480ad0d1a3614a4f6d76e2d1e27ab0faa5800c1be9750f0d9c43d698c7f2d36f85914c364bf15333eca09173fc910e0979a93d4ccdd9ab6553e691234e5d0a760690c667a89462570aa03d7e989691ec3b168c7cd20617c884e6bbf6fd9e395369114c395997716ec8b42c29e4a352cb33a48216b75333fe2440e77698947ca9b15aa7199c5a156339fd5eae6588b152c1bba776274c5d8e081bbebc519417e87515066547a5df6bb9a570d37f62180fbb838e14807166e44aaf9709e83562374033901f9e2da695c6d9422742de1592b0f5e8612548d40d95f772b0a5c0a2fd882b56ec333b889813062f8ae10074c909effd8dd19548261c50d1cb7593c1e181f15ac73ff08e5b45a42345c1036489618c2f94f784bb35225fdda00bf7e0414d62b7429f82fa4852cb40849c6a5db3038515aae14b6a21f2e76435793185205faa05033926f66915aef3489b98ca9e5e813f43a2f0addbca9fe2c05573434a0340b95de74aadb6f0aac5bc44c661bf9049d25df6e69f1a7c1f736fe55b8b2fe91582da0b8592bd9444f0dd1e88193ef63b5ca185c824f4132a349dbd0460ef9057003b0430d6e2fd2496e0f8d8feff2bb36002d13313023af234500fea7565d05205668f304f4c37c3881d15b9a25fb4ee260f2bb253ba844486880731ba1e088d2bcf60305d561a03917678e08749149b909aad47c3e20216f8e00a183aa44e653057a11b83ec36fb7766a769e11fe3d7f7b98c17eb66c660d9a0e687ef5c0971d96e29f5122d90c8072c523265284b2485b007e0591463da1ec710cf620e3ee834e5d6d47710c43a258e2978ae0e1beeb77ff9e941a3e902c1b18885c658410e9f35b6a838e392f5760b05a2d5a6d94d6ab2034f6c17215b60fee55d473728206750f7b011eabd44bb53e1494cb5c80f24bb53af45d07a782eb07f4b36dc043964e000ad70009217d50f43ae39407b708f4b9e47ecf1420dcf9e4cb4e04bb6061fb06ca04955e0f117a85e38eaadef2d36b630451875f37dcc35ebf2e285fa704a392e031ff6615fe3c817df1c0f6814ec57e860cd750819617fac370bef6e4f608522e3d62489e1c03ce85b25ca447fbfb416807f8e44c7b174ad51b7366b8e022573cac97572c04e373ac3e1f1d5b2b3882b7a3bdbfbc2ecd8e786ecb8b3d66a7625fb7299ff260396956c1f1198acb2519dd653b6420b5ff4aef8e7e195e7ea0349544adda9b83a343080aa6589e75130558e0c4c85d978afa26ccda601325af88aee9ffe458cd4ff4115e510f29f5e0b11f5cf82d23509891bb1d237cfb3966d3564e5cf1dd2e8128837ea60af471945c17654460292c89cc9d81f90de1b832312e9c6b3d87f855530b7dca88fbacefdda855bbc23eb95da85cbcaaeab3fd5d3a1a438be64ac933889e4289c6a5f1cfb5eee7ce76a0e915fb6f908bff77ae3a14d7dcee829d02614c41a5240991fe24d63a0e788cd2985d59cd82c052cc781e254b717f80327eeea247a24aabb1924e6f48608a3e4cae6ab69a9852704d6ddc1b6cb1260b1bd7f2b9ac2ae2459ec6d68888712cb75a475eb3155562c610a8cff66e8d051e427969a9657b3a2c90d11e0ee287a40c97830848f85d026509ca09408b2b4ec33315eba36672234c963eb104a4f13a91961fbe6346fd3e578e67d6ec7d4f080eea91d18e7f7d1ec557d4106b44634b6530e93d86a9e7d290abd22cd85fe6c02c71f0f2cb00ea0a3b802f107210c2803235af5994c831c97440974a295d4b480748313fdfc59eb825645726d4a452e09e97cc1c3c270823a9e8bd17340bee20e3bcc7d06df209dd4f3c8e8eeb7bd8a859365070693f095f3d925a355b40deaa113a52aaa2eb732698d37cbdc0b580b8463d69d5544880050655bac9e13b5a42a286e79ca99550cca58b925416013c0a084c61c690ffd837ad36f3e0332151e1bf7ec533e4ce97d7968101ffc129f818bccce918138c5b1746fea04d03d6c8cf4fd7b535b43ac164c3fc0f1c5aa21cc158bf03b1917b4ec8785abd0614cf9343fcf2be3ad2e37ab1a5548d75969f13f05849b7bb6760d311c0fa13593bb44c17c3cecdb101660304169da4161fc1fe71d1216eed8cb405602c3cab5d3683c69c00222de9f2b1deba46225372a9d34ed713849039642d7b1d12771d9e09d6edddf55d217190b4f9016b20e3e8ccbbb8969707ea16fbd4869922743a71e264d011789ddb5b309151c166e40ca07096682ebc716d1f15538bf0c796307f33181647854838e811b0bfe0dc742786e7c331bca52d347bea282b3243c5d114970aaf4391dce67489c95da90575bda2e8be422a7b68169725247683fe4d6be2d2713d71052d0d5c6d87117c6fc8a3884121ba2b15fd74dbdab381065047d080f9baed169a9b4e7fb16987071cc8706bcb7787a3b626a8ec1d222dd0108c8c2deefe259d607c5729f05dd97d2abc2ed7601b62b9f964e2fd4dac38d4604b121cc2d640910f31e8e38e4d64fc9842513e6e385ff769ae328d4e0229e11dbc9180a5c72706f9ec71c32534674e433bcaa5946d71190ac8e670d0919a0a51c2bb5b6d4654797d384bb38d63cbb733995ae58ce5ce40134114d2c43050dbcff009afb4ebefab830eb297f5952fd080f5b2e3ec4950bc7b094ff5b845968475d65864895e91a95745ea1924b8f52dd4d7983b9900a1219d2a0d7992fa4bf56d0aba7ac1c01b852e64bfaae8747f4d2c8276bb9ec9fcc2b72cd0b4d443cbe8c50ecaf31f99e9600830374f25c6113d4268c8028840f78281cbca2a3fbfd3ec689b0f80611df44e2476f76720590f1e0d5865d9618cb792adc19de768e693a449f62065d8e9b3896259bf6610825ddac2d4c2e4e6e06eef342c2e7318875b3909e9f237f17ea29135682329ad20b493381e8c03147d84ccd626cae2b74d49e208a11b0052e0312e39bae78da55c4a9039b28def56a0ebf791a474b293d6e358ef2cc1e4d8c0f1de1980f19f4691d47ed441780dfce823eb0d40065827e947452f0e8f18b5b26b071fc43842cfae238ee5aa0ee019eff551195761f1ae16f07df0cd41c69e778d0ccc93771fc3bb0548e6f0c0b86daf3cf74d5f4a12eb02a3611896a83480c56b21ca1509af25cdc464686e0d993624a27b206a07a50f6ab8876e135f51ed14256c014838c296dd9b93369e457cd29440e6b78450945d7d14aba3c1510aeb59d4ca2b967fcd90aa252219f9dbeedc63d024968abd601dd3f600491bd26f4447b718c0d690f909398e9cd39d3a03bd609962e596368864a76c0a83d8740fd0973e64a1526cd4d16dd106979012a1ee99eaa877dc0139ccd5a0a55f5dba610c80c2a029b3df435a909911c989e84a9a83ffb2f51277c133916d1cc7ad97f8d3a5bc3de3d5c2f4e1fe046e9ed2ffc8e2e0cf3f6e4ede21384f99e96cf65443e24d88c14574582751fe612da82af8b84996c2710791493949b625bc08171326650ece837ac9a6e5e84441fc54091759ff56b0a3fee5ceb3a5ad1abf058091c976c233ac80155ad009d75d03bc4eed91903f6864597b9a4e4736b6802cde9d6c2d0ba501f5a4d1572582803cd008dd3c76c26b3b66f90777b495c0f9cd5a0bf64af2e59c60c5507114ab53b1b108c0c66319020f9aa013624d49d6c279c99f98ec397d2c14b1e63b03d0088e6da4fc8d7757224f6a19fa841d1c461a52057e4aa344eb76ae10cc8a297967df54fb1b712aec3c3318f9517c6606f2908f25e25506625df043ecf05abfcb05997b59c4cf7ca5d0fb758fe1d4ae2acfe28e2056f7103c8e4b822b7e43be017871511554a0541670ceef9c07a15278714401b5a1221fb4675aa5ab041a8071fa4ed375163e619163f6e2c1f9854d12f4c070b5b2395217d7154400c23389dd2d1da612d2931f16f04de62663b11498f3b70866bae6e5740773729c9fdeab5ea94ef6f5683284843d2c0d9dc7b81d073d1761c3962a085eb0b76a85df0decf6ce274c8d19407c0032289c5327569fd0d6a664ded26f89544086c4f79dccfffde4edd96b26b68bcf0ea95fe7c456d05892accb837475444deccd61e40f6216593f705049c2e29f72b04f378c93c10adf45084045d01b71f72af7df743858d87a633cd254d35b66c4a2b4ca863564e93c48262d1c013f27b409ab00f7bfeb24ba7e85bc042b31542d3aa85ba1a5efb1d248c6e146a6a7d967c6882205784994930c048c4ab6135a6ac0d6daf1c914d9efa68ca09c0032a347663898f1e3e82e0f95dcb369787b06f8331224c6415ff5f5b8fdfea4287307e412b3f5d23b07ef9d2f462a8e5db5d153cfcc7234d46862e04f23a07d98ac68810c1771583f2eae208e3e421961639eeea7931ee477e388c7f105b8675ea6a8a7017e8e3f25d4f828dfc172f97e10e06498c7ffe6e06c89680d9c17a6d997ec4807f69d12e9210a247d5a68b51bb07c39e5cc758da3bc6088312e5eaa99189361a21fa9e9932f618fa9a399e102de108f3449b9d880261c7f8c31498552d4920f3a27f0b1b074911c8a649a5686ecd4c9c01f4092d2e5f68d85a3c7c60497a1830277ab0b7b1bede62c597fecc800ce932491d9ff40c518de77b9b283a55606ac4a2b104119cccdce41c916ceaf77dd9ad1802eca2a92cb0a0cdcc4f08c44aa24885880ad582cd0306b8451135560bc3dcff017ade001a6892ad4b80b13e5a0f60c6b7f981876bc1f6e1beeb3ea1ad91e3124faec8343f7f21979d713eb532a0d4329f69a228843770ad39015fc4f507211229f4a2d3c197262b98f3b22fa2735fc7a3d41f0f4caa565dd5575d8b6aad6f68022e4d4232abdc3625f7ec272f3d05efcec49d74bafeb45526e7e6c315e6127e676921c536bd44276a983f3d8c6abe95041ad01e19e10cc878f29b067eed6beaaa53847ca879fc44bdd8acd0054afa95b4907a5fb565a2044e1d77f463ff62d9286da05ea784819909bf8afaf2bd1df21c73a2156a3d0227b4d74b8397437c35027a92f1afa524946fac6a62f63837e763ce443d076913b169d36f31333d3904ab87a61dd47e4145e9af688be8b7dda74fce44a6c36dbf0c4c022e5ac0c088fc32b0a93fbc6521c197233e5088db795410c60db739ad4a78fa6b64edaa2f21e2b5d9ca470db47b2c129d5df6586c12b97fd90929352a7978052abfd23fb04da6206d3ec750d8c95b4d79c2c0e4825cbbddf2e05660c38686b688cfba9d4312501106d058c2cbd6a7d0a4916a0640b614a55481887e908fbf490251835157d15f4d14c8804419a31d46ee5da3529e2e3459cbdba0d359c220be2cba7073b6085fd9dc0dc1f18b3c93203ea55adcb15094119a8864e98f19815b31681bde2587b424bcbb21ca0a0c84e147f27243b288eb3063214ef178027f18402369cabf5596fa0c800d5d2b0cc99c93e493cc0acdf4dca1194ed3582f9f70f51da4657b31678134a7dcdf831aca9820ccea8419612755d51dfc77f9f8d96b91bbaad34c5e6e6b3ef454fae918a337112f1cd30a2e48722dd1a61aa03920c82c33f42e034f525383ed6c1fadf20e7a445303a7004056c2d01abde6313f87e1cdd7980b290b40faac75c7f40e8713220629c77ddeec3acfc09f5df757c4381cb6484beaabb43afc4046e93d3b0d2d2dbe8ef0910a5b8aa2148927fc6b9f51e6076da633755a2f97273294bdf3cbb849834ac9890cc9755c556976656c056888920fd36fcb80936104f7dc6217b4b4762da97205cf822521e1441c9b984dfd8f218641a22513b76fa9da5becb5f7cb04132503e04ef7b8c8fe2bbdf1407dc917d14088c55cd82980c28a2b1ef9151ce6029a4161419f145870992f81eeb8bc3d07d42f2d0e8d7c27826e11946701e3ac592e6b3a527b86f047c25a5510d9cab18cece06f51fd27b06641339639a17a580dd292d49e9d9894505bdd41391d2c757967f0db8c03617a6ecf99a6aacb752f18e339a1fc318616d59b2915653eeba4a116371ae5a0816e41316108d6a30881550c80aefda9e347314731259e049f33a716585ea0ab1f22a41975bef288dc721ac896d4fa0f72b886fe6a9407431bb3494170ff770ac30fcecd2625c0e8f91affc6dcabcc7b4b8ef22bed169abd2cec1f4dc113ddae97d61f21e5c887393c65da9db34545be79539eab42addcc068c46b042ce5f6c1f4ac38c2d0fb768d1ceee2f859a3af392e5faf0d8464ac1dfc3c1b100188d0e7f0faaa55b965da48ebd3e4fbb4b96e5f161a165d9073ea0afee3fd73ee006e8d16b0b8fc54e0907146dc8718be7852bb1374b1387132f5645fc7aca9af049834e43343749ced93d1f227a0552693ffbbc385a27c96064048442a672fb63089414a2ba39ca2122a153e162fcce3a02b444cee46a61e45ba49e50c3c4e009a33431bb929fc2eb6762bbc98a821bce5e81ab0f89c1c67f7a4dd87a5372e719e42441bc43a2bae14ab93f82a4f99e4310ac799e1bff0553378acd1601977a7434efcd24df500bfe6aae29bac55b35a02432e0ea826c78a3e15edd580574dbb0eb2d86284310d60d587506c16965e6f40fee4a93a85b3e8dd781ccb316b442dede26400187bdd4732fa1b7db3f84b43a8e4611a3f8a1b2e1f5f42b2a59b8fc7d90ad7986291c1e199dac8e3f64bc6c6a3683cb1a7e62a29325d4fb33ebf8493973f00c738d052486c71269ed540b2f68c52635ae7ce00d79d112485e83746e0d54bd00cbe1a1cbfa3ff9f949de46fe3a91cb4d38f78046e696951fbe8fa43f69177dbfeb61b7b02058dde4d80cda6f57b622a3606449efaece5d903bca2589b35a3e87edf4e1e2bcc6f14dc2cd8542da68a8849ecb491bca5064a323b85612b4de0d84670d49d7a72c14e418a03fde0da1e8e38bd0486efed5e92fff4d2413420ffa4eb39e921c4746e7c483851b4e02c8b9fb8553923e76a4d376f2b909a4e8b8519c80008ec389c5c732be6a19ddd83264109e138e4defb854e474f279ef91a83b4ecc2c575267238dc1464d2513a54aa659ae808127fd2ba6172d38615b05872926200f97b097302806b525375e61ed6b81d20d71bc4f4e973903ac781e362dd39d8f47ae5acedbe233330a9eb262087e0b77e7d3d72ec9ba707e59ac2c4fdeae4983c13c793bfee9e91b83bc06fdc066d8bc6debbb8fa56b73db18c28577812ea65b77ae7472d83f721df0454458c06f57265b6ad2b682640f2c70425912d1578a628e15fb921ab8efac16e560649e667de661d1de02e60bfe2c125c6a7f1cb8b56b3bc03370b7d8083d2d6e07063d1836e5be12d0650beddd7cc532f0917259d306937d35fc12df035691d9463bf88faf997cccd7797afdd926f0535ae07e4893a909fc1bb9742739059f21a846c78a59edf9bfb25aac07f890d5eef9ed64c96a81ffbcda43ec5e2d562cf0c016d17b1affbc5a923aae6d89c3d95a23ee83a4d332c97284362b95a211a6b0cd002c215edf5b890f194a3e383f189705abcb5ff65ee7d02a3bd7ea50b824a3512c781a0acae0ba87e767d00d313cc04e997439e4c8f05274193151afc2162ae077e33f45419dbe36ff7a79568ac24f8f09e859af70b62cea6df58f0bb85a26ea604ec5913ea2b9a0a17800904bbdabb0da8f98b53e2ae27d288371d970e4e53b88e41de38800cd3548fe9bcd02edb9236c210aa29ea03b8e88bf28d6cf087bb3ddacfbc23befcbaa4ef400942ecdd45101014e55f5865fcf0b900f68c3b9f4e3612d0de40c8e13c9645132a550477d62fba962c2069ae468eda656545ab81b09e37bf1a2cd29af52b42d74b92829e1555165e548fbfc29359553012d7795fd823e28dcf54e2b1681a8f99e380a377c984256e2ac6c30d469b3de2c7772059540a00d2f5d757b553355936a69f0cd6a64d7e1f36c873fe6ce18a108f6219478d4f2cafc8910314a041465b85605d50a196b872fee11df5d86db84f448798df9a6fa1b0d3e2b8b3c338202031540878b4c4912a1953e6ca5b35fab313617ba6f7d3495db7c6cad8f804f5f4d4aa52d231279c35202fae6f4c3726f18e9e159affcd355856cf24f7afc8e53708056fe7a663398527715e437d096b49b43cc0a12fd81a03d87b5c22207f4b52748a94012296b3c39208c9a6001b5b44f57c50426b982a2f91716563181db7720548c096ee34594a402cc6a4c90a6be02446a1d05709d4b05810625cf2134e77b65d513295d4ecd9cde2608df67ffc55933f9028c4ebca0625889007a89b5a2b8138ed98b14d41561befd0374db1d92753f171447d728ba3a6d3bcdad5828169a558604fd628bd2a5016cb156f2125a7d2d2b0c5dc551abb54c0448cf3d3703da94e54d120731603b792ccdba85f2ce47c71a983d04ce230f04c4b1f84097f987231678d2d2b26003c66e783118a1ccf5443aa7210cc1aa88f8da248b6b1b402bfe3b08e7a4924c00b132b1261107c2a470294a3d312e4ac9ede00faeff5197e4b893c9fcaaedd9fcd16116cad21bb0173371624deed36b38f5708e42454148d94ac422832eb5a9433db1cea90a2d289926efd678ddd0f81333507f9b1f83f9cd942155ed891537582a267e1305b09a6e417f4a67d769905eaca9981165ac2f2eacc33ca9f87c2b0ae9b294d6355200f2628a946288f2f9e20453ffae2a54319c89ab722ba6b024db8233a8f3673f6c4ff85a41eda38a8d2093686abfb6a963efbcf9c021105d25d7039fecb3248439a89722d06d87e0e0ab6774d5425d4ebf63b6e5d368fff1c0717430ce7e6fb9c0441a691b68998a7a6afb03274eb4cd21e7a9e872ecee0879da2f0756833b0e183f4d61c8c88fbf752734e78900a08b53e9dc810cd83e95f56c4b7e1177dc274e650cf056454207bb47089880760fef50269015dc4a8eb279f00deca3d2e72db6edc3fb81cd3ddd715d510c6f977f71a1b80ffb472f29a78755db8759e9543242135b07581c7de5947602a08e77fdde8706f36916b55a703adf5c44ee494325b27095fc6054a4421c297c4c0a140e8dc8ddc31f4d7d105aaf008d33dd636aa1666dc0a638595f03394d1ec7e4e32722d69248080a7f8b574c19648cc1e200041f4980b36b5d69f5cae51583d0960c3fbb3d3459dde41b29920fd9a2b5b73b3e3460da38084e51f4452fcae41f7de803a6a21d3cd2cf4e66746a8a1ff131400fe3f36094fc63a6bb7a6fc7ddd3d209c0124c8358cdb24c633bc3056e704af21420e34eab7d5d878ec34be71cb2f30938bde984f1633bdaccbb71be4e460c2875b34b467bd8c271810531f41fef9cfef32f9a48d34f032df59f7ed2332047457c29637e19b2b5893cdcdffeabd4f911c569a49e009e40c36de672837ab9af45ccf76ac31f48838bf3563aca89263619165a705d3da6cd396cab9bdd8ca789be4491a2089315080cfb2531637cedbe482c99ac95fac81389d6a37379cc509291123692a20285c77e8b70da1ecb699dc62926f7efe02823775152f163cd9137b162ce817a73292a0df95de97d4e5251123174a8cf590dde9da888644862d5c1f99b1ea66412cfe0f4aa63c74b949cb53a62ef7adfb5d13b20c8ef175067fb1f8b2a71faf7b4a31f6b6724b643a4eedc8f100b6ba0f701ee7579a773a71f4f428fe5d65f89beabf50e06fc6608164c82d65c2350507a0a4d43a86ab340b8365e11b5f39358c0d2490fd217f060e2ca2797a5f9aab874d97c2063ff5503b41581f59d1b4aee5a40fc92a42ceb2a2d1174c480513ba9cdecfa6caa5cb055f2c9d0ae8a224a93b5f9abb79cf56a882902e6931d1acf4f28198b01fe332c0600bf5f9b57e775f44cf223459d531901aa3c0c52fd505d9c70274799c114f2fd92713d79addc013ecabf2f96462f47f2e19053b1299d0fe05fe600f1f6e2ff26b34e8c99f771d7f6e5a31e742f35bf240598abdd8d382cd7fd5ca2399d32b442ebddf8ef97442007dc6f0a44346fd1caa8fdafcfc2c52a68904cb6b38d32630bd4b96e00ce7dae5b442f172538a5d49719bba0583c726bb3440a66750a5f0a340ee2a9b500c61a3786cc7525ac917e16261ae11059294181da6e6a873563891a64bd37132e4ca286d2e75ac19271333e6e115cbe6df05176b7b2522d208da0838ecf2a49ed11ec980cfe430718c826b9035f884b7824b5e48f2c1d834a75cbf46ea4c770efb104ed10d7fda25f5e2362fb63589a98162baa9e8c454a436908508a150cf42b03f74926b02c0f094f646206a472530dac15a076d00174e5bfff6859cf6c05f721f51f3372f076f0a3d7b50941d96f3caa5d6b38522a8067a05b81bf1e0549cdd4472187f46ec8e1de6494a71adbc500e05091d22ac5469ad679afa06015138e5cfee417c27faf6ebc9b281bc12fa179e8602bc27136bf13fead3d18039d82187a504a797cefe9e9e427681e420659016cd9d9238648b6636a12ff4df953437f0e9e63b273d6ded3d435ae52438ae5a7b5eb3d34274f1ce59f0603422f8ae4e5fbedeac8156f7bcc35a15fd5f43a20f985a73061dff36ef91260945564bc8f482e7bde4ba2bc9c93058607130e29159e642fdad71f3136108076bed2c33a654dee0c5aa0655a54c4016ac0ade832e25189dd0c0349cf28d8f60d2ee14b53c9681ca44ba6f36a72f0be7232b392c4a2d9bd058d304b5f4a2010b92935c804082da300905589f3d2237e0e9920a276e9fb24b8f35841a64ebba84af6c6543d155d4a8664472e5345d33605c4460a01a575b49dabb637277af61c93912d7bef132ca1c9b48b20a76684e5e6576a0d111c1d5932ee3b0278f022b001a423b76d4ac4078a94a8d66398411ed91b875d1b847ad6be154cd739cd6b01a0c58577bfdecf1a3591dfdc10758b95c2b4e0eb5f4e592872df78c9a101eaaf3a8577f856daff03cf0db6ea88a576e59a41baa3aa08a0601ae6fe780ff5fc80355bbd9c0852760221feaa05cc28ef2027f7201cb279884a03ab143577df4aa61b9da8ceecce8a90f5c05cb3a9f4cb015010722928b50f9cf763ba436357d1f079283e71fe6cea28cfd3826c116c10ea26ae59ab4b240b82618ed695bf87ee82692c098ba300d929cca420e9ef91862dc45ed550499e9d0a4117145762e73114ae9bb9bb81bdd6435c457ed6e668ca6a9ddcfb049019a122e4cf999e9a4c24d59f22601072085b6f839256d74ca01c1d1afbb4348a46543a9bfadf63e4fb9331b735dd4ea4547396e9b8206d43e21b288bbd4301e331f8e23ed1e0a302b9a153a89f5597d9379c56fd96f57afa424a9de045edeace0e2f7b9cca84ec3d044b5790ee7eba30b249f8b1368c64acdb9ef8c6cc721b0d2160eea23476fdde6398aa6339bead71abee27b562453e75b1c36f9f5077490568d1b29a01280c53b3375e4f8940389dc6d8c0c982bda8b51d567b0109b7d5165b10a1c8863cd1fcfb2ba0e8febf252c7acf71881814e693c74be38a2560f868b48320ce19f66d7fe3005b051966d00ad72d4fbd411ea0bdb89de2bfb8e67cab6607c8c4128efd11fcbaf9f88fea7f679569bc841edb02bd5a330b2a6faa4217e62acd3c2b51e5ef1bf4b78b55c4a9c66c11d2a41ad5aa53ffde97b134893db6f7ba185f360e53582ef9ed00d4e3d18d3e072204be56d61f5c33249b5d5fd601d1fb08053501eef0babc73b99980085c9beade1ea236a16151de9ba9c1a5fa2681dffaf77280679aa6af7973713e1053bedee38e9f45e1bfe54d5a4db26a6577e469e873d48c020eaee14d2cdcf86b4ea2488759dd141828f228e7d22a5a9405f4f3f804f5d2404d11af904e4a1ace3f7507f17487ad2f65f0a9af7eb34185109071c272e0e281e780fe00a3c62d7fc795b63ad504044e7a6086ac11093bea09127ca8da310de567337d31e0fba32239356d31d84dfaf5ba5246c84008727a6e15f80c7fce826fc48602396d3af8c230a7de700e5bb060a8480ac47670a4d21f9b6beee83f1dd56a9cc2471ed1ad970de11b1e6ec49e9a234728325fdfc01d3c59fd44a251061f1f82954b4b698aaa29b2597b5c4ea403818d57256ec975910bde54a086d4bc578ba9ec15a45f69302044f4371bd3fc3746ef4e201dcf5d20fefbef06296131cbd246cca7e75b34d1f9a7d872dc63e1ff18b4358bc324ba21f668503d89aaa777440c03eb7b553d7f86a5d1704044f9161835d6c1b3aa19719539458452ad1a654d97ed1a46f54caecda5a06d7375dba2919326fd9606527e88351d12b9485df10044013806b078041608b2aa5039b354857a60fcbb629201b80a54a7df5b001c1c3afd26d731a6f9c047fa715f6047686a138df46fadd795986ccc2f7cbfad3bb7d75ebda8692b9d735b6356eb8db61708a8073dbbd2c11f3dfa2ce2d786d24e7b3ae9a9dec5892bc51bc49f84dea31b36beef0bc91433da27a4efe4c858309f52d51add20cee1e48589483918742ef6da03af5b64fc0c28fb11714780c59b2e860925bb2f0602631e169f9fb1319cb4ba63381191a0e02868538295d995aad364130bf1b31d1c4ea5dfe4d9e802b05b80c7b8b7bc0fa461ff1da67958f5922bb192bbbd5cdcdc839b871d0f727bcc97546cdc8a292e68b429a62971318a6a84f430a0e58b9549fba5f7f85fce62955cc1f62f613c8a90ec3f1876195e9366a2f8cfa325ece83a1a8353c4ab66414028f7bfea98e0507354d19103b520203a6e2d8b6e5d59acde8d4e03070fc01c8ba73efdd39519b269ee9d5b2e4bd2f462c97edd243c3cd5ffada122681376b2504b48a163bb93aaf5d8164e0599809fb45f39804a51de0a5564dfb8339c096ec8975d9fa5db8062c6910a3ed644aa95da513a31e8acf2495fc68118911a0cf845c18fb1ca02500d350f5e0f3ab767c1ef8a92bdee44a2af05c2ed54a1e6e71942abc6ac22d33a86ca00e634a6735f13f185d8282ccaa69c9b4b5c0cc78d78bb5de9e2a8d1f823a2b8b865e3d952d525db84493088e902ef1aabf84e0cdf71694741c030f73274ee30f579c200969d7a68c0c5e134403fc54dc588657eeb006ea622a128ec772ca0c8341b183aec28069780fbb69f05ed7d408a4ada34ae54b78eb734bb8f516ef7f1e7e64089c20288b9550bc794b9a5ced7c36ea06ca4f5d134d238b4067ef551cba2cc0d6f94226532eb09eec397089d8eba2e0ffc91854612a26487e67e603e20183d6442a535c226eb459956214e84b348791298259c3d97621ac746d69a0997160e422a4860823f0cd416025d87a3d47a9e7e0ea112713b11865d05f576a7de806f1e7e013145be60d5d7bcb46fe6af43db393850a7dc83c8431097694cc61e962b1d9c1a692747ae6301f6e24496bd1c6a5af1b9c55633905d4a82cc3b49e0f3d0f070c16d632b7e1c1804dcb267c729abae27d56aba119616d1f7596d605e414e8d644cda1e02527b643d3369bffc75604a9e0f3d8ffb662d59483d4c19db5ef0ab622d76df142dc726e6130d4cda7a8224f9312cd6682d579e497a7f765cb6aa4ece260682aab68cc956d69f871fe783471a742dfa887fe48e7f2858282acf65c0da824042525e2e4be4d06b5b68ec3dd05ce6fbcb59de1a67cebda99e334e668407e54383061f6194f86bee556c325d6ef9d07965da0e4f1d92b0a46555b34f8a5ef542104e9329432d60a85c6716f373004d255d55631d5bfb3763d1628fa2dbce4cf98dc7580317e59eda722189d04c4cfb3c021682162551399747a6c1578217730ad8b2b2aeeccffc3a3bc5da181986bdcd70b7bd285b6ec4c5ff6b614bc2e34a49d27b2e591596a8a1644230b9d1da95642184e1e42cc4c28d1672b771b32a2d2070493563bdd0e577c4cfb67746adc702dc6d7122c70750ec8a0054762ff377a133815a368f4170ff4aa6111301d642ca1765d600b3d74c3d1d48d1c5194d6ba5c0008b20091c183a243c000e1497e5752ea6ff87aeb655eec0d4c93bda05600c9378d2ff19d6be180fabbb7546510b5032fd9c4f5b93afa2deb491733745b92e96d7fa7cedf6644bcf2cf486eae4901c0c210d5e85383e238a9f4e69fc5e06e172495a6f8d25c747b17ba3d5ea92ebdc3e32a99819c1d700ff29fb007542e397824ea887f23902e2b7862d6a8020908cf35b58b6b107ecde7e54140831380825d9734f8192abdb58527c5f87a81ed2a7bbba6523d6b8aaa9f1f6012ea4e97aaf1e739546ab0020fb00a1f8a7a655ef9cc253a234348ea2115a900daa37f5258ec70799dd9818d02b59db75e5784b4d35892aad01e0a7e588f47d7e5dc5ca3d266da035ef8e0e5fd27bce6b4be227a95bc2037d1fede8d40de692b8a41495971b525d6c80a48bc227f461cb163f79d56349038ff005978a32a9914a6331f2f9e31ee6eca2384fb7b312e68a0aa29531174e0159d744903705c3fd20761ba301632675785834ad4dd950c5f7829a16260e5e95e42c8207750b58c32bd0864949ef93fe6119790ed92e3258de2fd7877342b23beaeb2ace8b43812f687dc736262bd3b847e5d403302daa8022dc265eda6ec7fcd82fb14501adc1f74e0ce54aea7bc4dba51a06ffc9de62d0fad6ccf26f5cb9bb16c3f070a61680d80d874038e43fd0e2f83710ed67510305390416e0280b6603c4898a1a6854554b5558158c837d13f3f6a0808ed800963acdcfd7729122728ec8129cab2049792774524501b680b4fdddcae21f68aefa4f1a840c858356e3e60e296c519fe6fbbc2d83e877ae44c2b2ed05eab17dc93504fd9758603aebe1f3957c40ab0397663de01bf6fd9e19c3588da28b25dba93f040dea874facc09d8f8e225a356a82ba22b680cfeb830c7907521be98d3dbae8fc6908e0d2f63969357a3a5e5b7daa041d9e036a1cc8de70f900cc34a8df1c367bb0a070ce909c5561d7490f82847303d76a2ac8d142f1ea08cf24f13f867b3aa44ff4510a823b53e73808a167b86e1eb005733693a83dd293e6e1e0dfa2cffb4187505b34e835caba770280933d70ad81e17a5617343e6dbc0d2953ed462bb33ce59e9a55d5787c78abf757d32dae96e4ccf1be02247fd14bf6dd680aeace17c205e0ba3ae2bbb9e1a93a6c4573e6031f9012c108f46d3c4a03d54741fcdfb0917f7cda12ee7e10fa1c9c5abe55937dcd0e81ac7397fa1397a4be9507cae6ec549ba721404b91c653499beadbd65b717f125661baf50f10c1bbdf47bcc87e9baf08936ff39e0327d3a9f962c4b0a746e18f1e280151b29efbcfd6c577bfe7005debd84b1b710157b7b80778982be0d038e4005662de5c44f1a79de8c21deada909daa490b39b03ed9c0234841805e7e3f59cd6b471caa8f3ee3c608793fe81b90fd3cfe898c3d887a08e777dc7449e9db0569a5fcf3bad028440c01e519594a09178241db24c69db5a05f0bc6530d21e9c59df37a001461f88ddfc7884ef3adda46a571f5238b81adf05f07d9910edd0ee4c3b1ac87e0ec0b1fa12ce9457b861a259709d1a2f5c9141331fb20f4cbf414de29403153ad953812c05f23379b498cb8867494fade94a29d352e7a3efc7272ae97a4d67540927f0f8ed1c18366f852cb60267dbaef2c6e22a048a706714ff090f9b80d1f225f80bfc72fe2cf82d10fd4110cd832aec83930700477af3bb5bd949532abfb28a4199a5f0c720c92c0fdd221daa58a972b1210cb9e09fe56de8ff22e6acc125cd602086e82ab0becd226d5b82eaf56f2d8cccef9eb7caf968d412360664226baf43c05eda89d87382a1aa3ba08bd5dae92583354128d331697eb813b68f499193f948286aa8e39fbe5e18c16c42de1956638f1761d8eb971c00ee7d8a0f79781bd380782c7f411a99c4dde1846b206677c3d3692e916c008185389451d2460b0b1061d8b590fe5d770d07fd9059049c11ac59ea01168bd175d76c0e91e631b4f97f9fca40f2001805c418c82bdcd427364ff3f9af454afa8ce9eedba72088d30c7b96bf34bb9546642e2a200a692e091e5fb1a921410536d77fc03a0290c7086d5ac3552e8fe56be214f33dec5a936eebc43e2838013bfb011552f512ab1f0c7bd722f21cd7d22c0ef718ef98e4dda9822ff1666e2418e859de43f23b0d9c7b34aea83ba462e03c077c3842cc583419018154d4a2b3d63967d4dec9b6d70c189cf03a757a91e977392a4b049fab292a78318138d88c704f6d533d31a82b4f8e7cde8436db1a7c9d8999ce9dfcdeb3d3e93937a4fe478d4b5d86ca5b0881f6bd09b0df5013b0fd0e66eb8463b2d51543878797ef1839ef844665bb7164aa9f0e844a290f1f2365803dbfc4e44f7ed19260dc3c282eab19a382cf917dee1a564450afc00fa97305fdce3224130889848638bcdb2952833129568ae0d8404c2ccdb4df1394ae43f3fb637b255a4141c0412fc1ea4511ce8b843e1eea11cccabb5531ab10719c4fe46ca460485ca5dcdd879393f192e66f54ab5fcebf01ae40b6ee00700451fd96872110b7247569a278a850980b61b5d0d5a31c383316b3cad8d999398eb92d7ba9f9d99d92b2c7bc4ef231372d12206d4d593911507d363df14d2cecefd97c017237de799e9f71f03c1eda7975f49cdf67d772a8ba18cdcbc5afbbbe57b7f9b3bf0ac6c9511fbada5fe368cf75aa586cf0989602284b716f962651088835b7011118056eca5b326aa8f90e3724963c83cd2f995685990b5530684ab645361c9c163093c0d0239a0a9c7676790a9e9d2d4b94bb51643d2348eef255d6451fcf3010908b857f6b8a4031c70545fcec31ea6604fece13fad6ca8e262e794c16b3dc1181496e959eff1fadbc1f5b31aa12a1def3f725a7219ae64698b92316ba5ea8ca3b119f2abcb911178712eceed9b7408b001fae8919455c5236461ca7d59829751c35ea78a36e3ceaaef2be8611c963c8d2a2696abfaf02786bd5f7e1edc9b61089df1be0a677f9c71b88f7a8419dc767a3d904411b97f9854901627ca75379e8d1e2c16149a140ab76bf718ff7e87ad63f9652a47b45e67d0903445b393bc007e548c7478065359bf8d342deb6c4c7d4682b126585a51bef14474f1520731a064bce9ca87e10b103dc39a7bd62aafa7abe53aeedbe0b36cf7003aae99b7c0a7b24f30d42ee3b0d981ebe36ef3ace63102122c05338c6b66df9ba9d15465bdf50583fbcfc8ec0387c8189aab47a03952e025d4d01c48fa3c8e6224b2b8eb257f53a77477a6137b04447ccbe98682e99d1748fd5c7af7fc8e06d2417a901f8f926509b35a9610cda2f77344b2df0399d42b8fb7ad1b2b7f18814cdb0eedefa42538c70b521fd7c3941a41bd8f5cee4e0cdb14706afd03358bcdbe93517350c1a33ea10e80662596d27c5d1483b39633f8bf41404704dead99ed0592ded5b685de16c634ebbfac6a153357117cecf517b83a9c107aeb08e8ba61a74969da9ea6e5d3306afd18d763ac5279b9d657d788dd52fcacf76a6bfb82bbe3192fa460f693fd44e7545f5376853654ebe9df7d3736bad1ca9da5ad7b735ea8be4edbf85fe85c0af720321b344b01daa21f3c056fd5efa7b3efd158c0e7f93f8f3d9f912e6a3559c29e91df7995eba5934cb4380d379940c04b011c48a52a11cdceea10040494418bead2982a8db39672c362a486b8ddd7e56adc002633d9a304218fd4da10a5540d6e6000da35b277e6b3b7c1934e469942110ea55a2870db902a96c3872f6a39b5eee33f4ecad974da84a58aad5efc6a5a4d331a9c3db5ab002a4076ffccdf6def114e64158d29f99fd20067ee184950629a568af2ce18d160a66545bfb295a4bdf5cbe1b7359b0abea3f47868ac6ec89dd00e68a45b9544d245005b80e0e789cbc75c52351b4220d77d2e76da2a298e6a1e27e07e97b83a00feac8efd7dc486ae900c57eab8afa0c44553ed87917ba9e847d11fa4cc5027368ae22e139e3ef33377b3a01aa97e4514405c012efc4c5fea9b3747bceb2ecbb52e7faf150edca74e1604a15458bf41736d514883d45d4041d069a7b5781a852e9733acc5e281037a86edafdc15557f0bf90968c60854156a4df833716dfa345451f045e8399f305efe486f9c94c69544886d567f927ef5208bfa2af0c0178380d6060e376380f6ba01489a40eddfa08ea1be471f3e47ab2a14204ad2044ef4e380c304e75fe992379ca20a6b7c2d0cba0b26eaecce8103dd1ae2fbd3db313b10b2b9c65aeea125f99325df7ee7028066415c569e55bd20ea72ff79abc2e1465fd939d9be6f997a23909a85c11e29a35e723e796b5b60f7f4005814cd37a1314f5d77a93463e2f31945e8794f99e1c9c08161226240dd5d16b3026089dc89336ab3dfcc072f3e0ea0cd0221883dd27cbd3209b167b0633b1b7a85506f0d2796bec61c95bd1060dc17a94e72f2a4cdb6be96066b1e420d238d28bb5f8f7de2a8ffcb7d7a456a1ddcdf8e0028f54a29febd91be3c2377fabb674e347e7ef74b4876f4c4eab83ca8f328741d8a579e312fbef47166abf128c4ee1f664728dc769e715ccf12404efb2b220976897150aa6e59c53db96117b1eefd8a898b1ff03a045c20a326c3302dc4729a96e6d5408b6ae06845c06a28528d050f360e72ec1730433246a4c4a967052a9de5266d144c7158daa1795a5e703649b8b7fea96ac0d146715a248727aa956d841876b196ba91b70f34fa35ab230bd2fb441f93d87afc60835f8ee924988bdf5be74153a08f1152ee061fc20b70caa4ce9978014db908c3e619d1fafcd06f44d1444b3458f14f1d71627dee669d4268c8b9fefe5622d6f21fd7a924221ef6cc9bcc4a7b8ffb311a9be11a1963218d12a9b9de2d926c92535d63d91e9774fa124eff3c8fe2265b00fcfbeb410560690b13914198ab29b8ae4be12d60d98960623476139b3665b915d3ee345ff8bb7f6fe6ee9e89d4a2b8118d9a6ede164776551ee89a998b540bdca479817b7c7615b265f8fec17028ac3029575b06ca9fa29f116d778d3822a08b91837bead99a62cb98ece13868bd39a5d85734d0539a4f536094317954840bc9fc0a45d0efe3bc0b8f4b2ade0ecc7eb5cabfd537a33c85508d868c96828c2c896fc3ff403653e91fe107e186ff2f345bd2327f6bd372208d408851b65a291c9c86c4ec21a32b4a224822bedf7ff7dda041daa734a52c9b6a41226f4b791c8b0bcd4588edc9b0685f92ded290a924a546bc27cde61422a0830e41d2405dbffa1525fdd60688645ad36bb56a69639292c8ad606080f4a91610f769f93b7811e70178ad9fc0ba9e644817d7b77ce4d65d5fa6e55953607e8024fce418e35bb68935dfb32725aefd59aa9caea6129eb8e1ae8bcd8722063c1fe6056581239520b6b626a07ba08e78a29146d3d1fbc6d149608d71ac0916a3fc17a381c13d0a1770a734e8883861c9abae70a9c83053b16e9fb81513cf6e903ce25645e2b6f423fca91c97f908a231fc21007fd9cebb6736d2519a1831330144c78ac71c6739554b95c3429ae8258775ecd12b1ac5e895fafe5abd21e6e0059bfe7108cf5a149cbbad118e59f04571ee7031c429affad4ef411ae6015203394f8aebaaae2997a36d67edc1326a8a3353b659a4af27d4d24b0733149719d3b16cd1229cdc917dc87a8dbbb721d9d1c101ba534725cc5ebacfd6bcbdd25333cb63cc69f39c7989649c00220627478d436640955e6b792fbd96aab321088c829cf405793ce49f830275ac91c52f8dd993495f74752f9936508b2101705d49e246de57e406808f191cce9ac0b63a3482c4e0c25653658cd248ac8a85c1c4562e3162aeceaad169d583045734d598e46c04957c79b02cc8d0e633ee6b37ac28d1493ca01b1aa3d5c1145869322c7862fcfb8123e180b2d44712ed1c4cca1d78140003334c4cddee398c59b712b768eba17968989d84ab227ddc7c086aa7bdf6e450fb7ae2a597aa817682f7a91818630f6628f4a816a5beb38787051807a66a6b35664d2c3ee0e58025dffe9e29135516336ecb32c82f43420d4ed0c72243a9f6724623cdfc90b15194cbcf7fc59034fcc05708ed761503b9a822e0ef8f1825f893ee8114ff6b9f3c62b57ecbe5066b3bf5c2a4cd6e8f763d877f97c3ae8b633595f52acd1a8508e3d40f32e0100005110b0f854e07c5aa91fc789848f834f62dd981e1253e4b1abed2d36dd3cb5e6fc3a989aa343630326fb59454c6ab0cfc1c8edc76cf57fc84b695899a9fe6562b3ede2f913d8da35908209452a1fa3027c01e362e6dc5351d973ad465b59520c03d73398e6460703fa4290dff6dd9fa85326feb946d432fa4a4b6058b8c65ad8b641f3f244e76b393bfe585400f1a11eab9489363c371e9c61edd46bf5b2169bf5dd5141345631aaabceccd4a5264915bd2737a239a5c8439617ac64ba93c75f4f6252751e2435c8895cc2c5afe0cbea561d2d19bef9a3cb4b2d1efd01c122715793b7f98007bddd11a7c8a31d5887852ea60c009ea81136e058c7cd89880c0ea9604a3cbdfe44036f079eb4eb15ada8a5d11ca34b4a3f397ce043ef0ac3c18bbc70fb2d9e008a2f1465ed0f97e446325425cc16842f94d38d3d2d8c09e84ba8e24501ff29a22996a3f020a5b6023ce42e3f5a2d8c98036170ebc22516e6fc691364436613165e8209208f2cb0c9b1706a8078c187ce2dd0ade59a346244f89eb162e937d31cc5607cc4a7ac9f087ad90003d83e7c5c243b35d46524a111f5c08b4396ec344dee60cb5d10e139f634cc6f85122cd8b2275319a678b0337a6c8e373c750e70b21b6c10ccf437805e145e0db2e032607e4aafc61393433c3cc4af77a0523cddc847e379f52d2b49a2ee7da4c39105be552ad9b08b267e241426dcf677391ece65e5d44009ba704a600b34dec7d03f7ee851e70c1def90247724e1440c089fb49b906aceaa477f5f28f8c0c7fe7aa42c933020be0e01f420faf4e6f54600ce297860755d62844983087feb6f013fff6a0d67baf87b9b881fa5294873f3074c836bcaa7533fba2ad40d5c743107147fce83bdd679fbfc9279247774b4b784017d23d51143629667549451d1c3686f735f2a5174ce9b3759603add45bd033fb17112b978fb7d616c8411f05d0783caa26d71f48225ee7951d360e75837c525ccc3b17a65d8c0853edd36450c0afb00a5a745b40a0405ca4896eb8f9af68417208eba12c8f944459badf62583c56885772cbb474d896ecbada319498b082d7eca422ac9d4291138cef114087c0643ca8c9b8687fcb9f86f208190be8a44c8f362cfaa9bd692f300758493d09db79fd42f3653f0a0055616509fb0169dfab3bf9f696fc08764fe188c1c40c8d8340c43f0a28230f22f88de14de3c5f4754983713545cf24b4799b359dc9607066633032c7352f9ee221a662f6b0e006e6dacd78df49944cc3586afa6b1921a35a8930f407c548b65593ed1681991400171d2cbd72e9080c3f15d702a2afe1ea984d2479bf1cff1e041dcac36127d0eb8ec137f004511ae9c5eeb13a0a2a03186588cb7a5afde05fc8b3a33d2186e492f26b4a0eb060a3fd8127457375bcb74f94029dae8d0ecb004dd930b6ced8dbc8022e289fe6e3df2b8d1d360185045c5fda9f8f468c0c8f33a5cdeaf06f2ea9856481f42a34cef555bc380a70dabb20d9a977fdfd5e921794eae973eff84d22557496a561801c2a1d1d0d7a19c509941055572f1de724be8848b59ddfc72a382c5f998b35a3863d415f83ea2bcaeb1f59892b2b1111bc451a1a8808127639ab1dec57e941f3a6fb16572970187cde6860b70cffeb19b33f22faba862bd23f13d9a459e005927aac5a95280c5edfa556056d3845792f8e6959fbe99aa21700d99d487b579c8d6bb6de3329fa8287887660d6f55f95c413d8d46165fcc45f402aca9852bd26284a247234fb4e3119f37169b58d6d31e8794cfa495d17980543abb593184a047c1e023ddf5b8186c2b50e0dee5f9b1036e9360edbcd34a3bf8e94267ad570ee707694d380cff8545537f1a5ab2304c57fab01970933003a40ec999fc622162f66a1852338c59d6c1626e3ca4b0863c41743c6e473599de17e831210d20e0a5498155a27f24a1cbe93c5da6ca2f15610fb06673c5a05b132474514a55317b827c60137d2133d6c5ed1be0a94a0145d60ba81a415b1f38001fe6fa34188d89cb144ca64a3efd11be95957592b46037d37c79ec95caa0a4f1f29e91e768bc7f1736524c4f89a10b3bd998b682ec9f2cb54038b3f1d7d953ad72eec0d5bf95956df53ea8b37055ff650602d4191ae3da88807261403c2bea571c9ecdfb372f30f0418fa4dc6ca5b652f550ff1e08b29bdb9c6bd8c9f29faeb18e347e0bb998db9a908b1f9145d4a470eef540470279f554888c1df9d8ebeb45a4377cd2b78059073d6b3cd092ab907b057e0f537c65fbfd541d23f0fc3a1c16ec482223c3c2d5b5319566c223d13b3cf5c00a4fffbda5e4ce9cdc4990f177e550910097659f56285bd0e54de077b1b134885a672c27c30fe5c66fec7f76a59596be1a482b4dfd7ef7570321e5d1406a947a65e226b5616cc1d0587f09857efce0bb4009b153fc0fa1dbf69dbba51df5d885fff8ae306734a0c3521152586a44afe5be1200160adb0d644ca66a98d1299778b42f832237c52b2a8ab809c233d51b344963e96d80fea6584e683be862f4d66a252e42b9103e569f381eee766f23de8aff3458e7146306d72232ec00088d77a35868bf8f1b9e264a7969af73a802f297412a990c8ad5ef0f5b17d86701c773732adc8ea0202abfe4f9e4f3757fe36dbd9c06f9d09195153414d35a2acb6ced98b4cb161d6e5e08b3d4afc1e3511f0f39d019c53858163daadeee46ac19a97bbe69f3bb87f1352d6bfca9104f3a409cf7df94d68e018b7df786ef9681a32b77d69e3b7269d8bcfd014bd95f8784013cd5360c1088e01c616ec7fd62bb02799a72ac74a9fbf6cf93af54340d3588ac083ec050eefc72078a50ef76a14812c7cbb282cc8a5cc12a382fb1e6e23962f514405535200fe3de3f323f7b8721918be098c58bb776a7ff0e3b4022f6fcab2be2fb08c159b4f0e2c24f1527ea8246405bc1f6e6285dd23a5ec01ccbf9478d959b2881761208f2bcb84cfdea82c9bb499ce551317d3d704b3f75f74b695fa5124d88940d6beb569c54d315fc0a6f07a9fd1114e0dab4600b09e195ad949d04049238f9e437c4d6a33fb7fcda7387f948f149c5579cce47ee6770bde492aaa8276cdb688c2602f9b3e552d9888ad08f300c02b909f04480d9c8191a3e4d3132c4c699d815d655718d6959aa702b0440cb1909b7e92095c3b92a7c16da84382e691cb5023340e2089e2bececf24843f75eaac6d1ddf3e90e4fe4210724d0ffa67551d45cbea2ae82171b41e33b5d433f733d8708b809216de3de15f4529cb29545aa6dec5768722a22c1613efc4256263bbbb748a39869061ac2a203c14b1d2fc31de818998b4a5c0a40cb445f96d0cc3d410f25456a696799d7f7159d235b1d55b1b5e56938e1a4f42a7058b5473d0abc47c17490ec764f92a2c8f3044891a3316a532b42d28ff7e39b9a146802b24dd0d1f16f14f34b970b971d21750733583af9df02d31a599aab30780b13622f92006e03eb6720f6307158b1a7d3c9ca5bdbf21d9fd71f3ef69d9dd61e3408b0bf918e662d7291b79b8b3ab828310b8409f546dc96cba0af55e1bb7ec398e9e40054b5db1591e0c8443c4fa03eb49e73fa6f80872fc43e4e45ec0ccc9337ab04ded428e773b5eef17e11f362391fa8515ddc50c434af3c386ae2cad5b7252c492c032c4f5ed1505e8735cb090382bb3313308d5140198eaadc9a201206d3618a4d3abb0aa91304cad38526a8140cf84036ad5237b43033583547375e81e9210ae360f11e620ad03fffc68296d2b798e548fc65b43361b9655208c8306baae0c1f037c4c032c27ac6fec2438322cd91fb45d0b13023a24ab8b5918dcd73e8053417010c81a4bc19a46c7ae747f18a842d8e1421e41a9988b8f5aebee2742d736471462a8285e9090e33736f07798f94d1ffd92e228586c1eff2186c50c8f97b854e628a6d617401ff33fac1404f2003e4fbdf76714ef7e761e49b8feb2c8c827c6ef7faad19ca04d98470f8ad8dae372288e55580cfd2e50c09ddb78d28115818f60c50a1ebf2cb840fa16d075ef1ec8a1d54ad8c6b27caa2ef73da83186730416d6460bfc2ae2c71d6cb6fd709057982775961c787e1a21550415bb1f2397801fc45011edca693c0340d3b51de76dc11dcf8055a9ad21a9b2301b2c81c567080cbd332667bdeaca9fa189a1a446d676ce82c4867d24ed4314a2e387c97f231629044343fb94a118bdccb05097ba4ed6c60a8a2fd5f5c169877224b59fad41f711cd8d3cd16c3f85dbbbf253a60010b93d90509f6343edaade417fd876fe578ef9f0ab3c90681978f4e393a4c48025f56d3738bc4e122dea3b2ec94922ea0d2da980e4961360cffaf9b8a0d18b02be4ad282183b0b21b1cbd6b6ed23c5acacb9a2e122a9fbce30fdce4ed793f3ea9e35bc13ed39edb6243c4aff8d1b705755f42437acbc2aa80c4cb29ee8d54f4f86780550f28d323c750045335fc06ab2e96350fcba4b0e7c35874d276e40f4c9d974ccfe2c9177a07aea5a1198808ae83f7ffa7c2988ecb9b9d5c1a640eccae0965ddd4c80dca1b99bae3f336ed5805b83d74b71f425e020882d563d22e9263929bb3a3282cd62b80d6298c07a76665a6b328d5d91caf4e45b6e33f199cbb406d38c9be4616ed6bcf63b907c416fa5d80c83df9f31669c116ea46fd8c8c9ac4823165dd2189abe3f17d4d5c29cd2039458f73091bfbdba209b6b57619493346ab02a91bd9c6b6d219fefccf291f965a70843e58bee5dfdbaf670ce10b66d1ff4db8ae45ec698da85ffcca25eb20d403ee4b16e6a67e487c6ee834b56a7d560ae57c7b1a674efc9db4813e8c2130466444d290b2670135b318b24b436fa5069b83f4b1524d432a956a2eb2892adf8a675b525911229f0b616011783ade0a7e0cba664564b9a55b3ce3110f2d7e18d440946a7f43840d4c524e9c3f49cce0722ebb39f756c89e6039b6c1e5681c76b5937013919b67122cdcf0e83e8c158df5e6ae7417bfbbc08cec36d968a8eeaf2f912c4e151338c557b7a40ef6cf5a4f18022280d5621b3353543c893cf9a77c4fa4dc37dcd20963ebbec62f39562d901894035b2cb9aea5e4d46b28a7c5ae8b34fb94a0dbdb2349caad46aaff4bc9ed4d2d1950583c56f300619b18145d94e27c145a9f1b1e15fd151c242922bbba2d70e41cd4c47b207c6fc46d7695734d73474bcb201f5670488c180dfa57b02471af0eb45266a858488a4671c672c94350084c1b4d54c46624b22943a509643463d6ce31b9c43866d659d1cf046e942458815cc43d5063b9218346cf680cba086633c076fa00aef7531e8599c9ab44de90071cd852f2075fc3bc06503bc5db2949303096e998eb20a3983c059ec69f7a27d47ce8ee18401552d3b68e462c34f8bbed513c5af046a0668db14aabe85dac7dc86203eaddc46eb202c1d6fbce44ff49bcf696ef3a420038184986ed1f66b42eeb3bd4c0609eb61ccdc20436b901fe6c6f58e62b0d40f73ab3764f0c9b511b332b9d8c662f1865c92100308f899da659284c63173a99c21c992a1983b89696f1c33bcfe503533ec30737b3414d8b82fa3f95c1a156943b8c33ee60edccd1074d16562517ca67ca17c4ad4ad82ce23d7b35064b6eb37ee9bae6e5caa983ad18c7806a4d4da38dd9606355174db9d420e4f7d57e15896b5bd5b652eeb01b913f03921f428490ea3581fea8c65dc711618b7625c6770111229296f99e3eff098eb68cd36f748e0fbfe732d87f596ad06963e3aa766615d55d28b665d780f644692a08d2f25ed455ea61443d7462e6ef85a45800d03a5c8c8b8f6cb5e355380c3ec53ee8220b7c400ab2ccb311bef6b2e73826f376fdc89e39bf3f9919c6441599ed6e5c89f661ff62f1a57554cca3197c6e6b226f56458d096570af35410e314d55197bef7daae7ee1725175a6c5e53681b5cc1c05b8a2dfa404a5f50586942b37c4b46574b712bf8b95cdd6165a78f1bd210303f53c315da7574740f064d819243a1b61858dfc3f07b4793ed0a3692c32758224614f0a10f8c42c055f1d2380e9b83decd4d446837862be7e47036acca002ab5e5c8960f412bfc9259f2c657ed06901d9525ef7d0f77500cca53b241d203fdddd36c8a819bac872f44d8b89bbb498d76365e42ead113e3892b3c85fc63c081a397950fdb5a3c63f7d64d70f031fc4db642cb836ab7a5d76538ad5c3531df9101e9683406b2629891095c77ce307f76985edaa2dd01078ab70b57cef0435a5ce65b6e050afd3b1ba547a2f70fe4031e91c433ba3f8d6da801aeab8c34e76abe5d866696b9c486fe5342037e37c8ce21452d3c0bbd5491c2ce84e76ffd8bb7c1c333c3236ec1eb5c6302bcded2e63f68969588279b57a97b98ce3f8b481abda7e30d1e75e557375f6c688f2277c14128a07ed5253425c29bccfa18234ca2dd69791a94d0b10a5282c095ec6f289629eacc0f04b73840677a52bda14ad9c5430a62e4ca5e3667bd56694730e3e13f26cd875deccaa46dc4262b591d8afe4807ab201b54ca6e05e4c25e88714ae795020d2e0991e8daa17455cc759edcde901ed09ec9f2dafc8c90f6fb310c1b8231dea0d7baff95eedb03744ce8b51bd9bb37947793fc93ac5323397572df2a7b51d506ac121ae4f53d99f78ed226a9dc7df070ffd988e0d679309e7718e292981369b6dfdb464e9e9da866b6f55f43f6a29f9e1afe62591d9bd238690178f7cd2bba51efedcb5910d98058617ff3059364418ad3cabcd8afb1c40c1cc0b16eadc16f2c0cb10c44d74e1cb8806725a60ac492673db345b849c11a37f11c627732312dec92501643c15522208e9d73195a33ca625637c966786cc1634c9b924f05096aaf5dcc4a51113ffbc1a6fc5b03234784689fdc0dfa562c4bdb6976429d6b6d07e0b6a04688b85bb16fb81ce958c7752c500a80992072830495b947c5dd20f258a8eb8ab9d1f3d7a22d2864898b95e6b4076f07095d3950ea101d9b8f1558ed4b7d04f888b7d871c8ed13b1317c09c3bd0ba2a7cb3acec440121fee87fa80c67ccdfeb01b1bbca754d7e5fb5f1a85d53645579a961bed3d5f7f589cf809a1cfe1f6e0f43a095d22e684aa54cac400c6188141036c97dd8b730533b254983a0360d91c8485088e646251e7b011c6fc0296f68cddb137a93049638764edd123725b91f9c038eb96e9a88c8252377f8eff6b3650ef96c1283b6bc4b54fe8e40a34ecc6ccd9053a4dbd1d6650468b314418bc73a9c6bcf19949876936f31ed4bc945224a8cccb25e34d16e813321a13005d1ef2fcd919cfe4b13653c7b0fc9bbe4fecda89db713bcfd8add43792c34a9ee4ed73c42851668f8d868fdcd563848e1d63f003bb9bed97b162caf22d92c39f25564ab11062958d5f10882d2947e19ee2ac08bf4ba5f4d56dd4a858f90d7a068e85876ca0659c0285a4dfd4ac6fc86cae998c96881108c15da2d117dbb2c4dafab970f54d23d831ba64427366edcf6c8c448fcfbfc582daeaf393c4b2fbad86055b69d81e1c8cd9dbabec74566459113e62d78af2075e2ac3894684c5a8abcbcc074ebe410a3a390ed8c6315cc22ea0ee4bbc886e48ad3ad73da7da60726341d52234bb25e7915bcdc067afe0228cbd08a9ad5802dbcbfb91c28cf3cecfe0533023a971306bc148c8ec7ba05d08a993adec13b49f9e07aa42a0d27ba2e5b7eddbbf4fc1f80e568fbe8da5ff6ee39440b396bb948afd072c2612ba5e31f67062cbcc35dd216a1c070d50cd8aa002acdf41441b7525d025f20c06b802e451f6066dad5d2ca4f6ce59e9d5802bd5ff92a33370139b7e252018621abeb73bccf63002bb468bab922f22ebca6890155ddbabb2f18184d415c1ff42f6ed8bd5518b80d99a95473ba36842494936c7c333eb708bb5f46b12a936e34d0f3a3020b47a897e128fc7c069cece6b0dda58cc056c8f1885804d9422edb765beca251560a58810de6a68881388054d0445dfb14fe9de593916e66522c8787e2403b1850e433f1a925a69df5aac4d1b38b20d4aa0b6f98f4597572ebd39fe3dce6b288b7302c6c5eff96f0f52e6987a861e5dee7ddb4835960840ec0f193fa2ed09d780ee47af96a490f28724f57dc289ecb4869ab1add410157360b8f0e97d2e6ed6b164c9a5ccc1ea5c223e67e0863f51e96dcf41d6fef8c2c608960d34e507cabc4992402a2ca1c24b03096966db914fbf682da42111529f40a0901082029c65ff102beae2b082e6bbb9c03ef1c2a3e451f835b3a749811939f59e5f852fcebe516a6bc2133061e34ce24385bd71de6101024532de26300e8769e0116e53ce12652d65a442685c4efd1ba2c2702b155ab7f22f412a41db77e001fc01d6a33b8778c9b8048db5bec3f1d4be087f73e9bd1908ce58c98bd7fccab7512db3a75d8be389e936d4ccd1178ad15f1ec05b9bf9461472a057fa6672a60bdd4603cf82d168d60a41b93eeef88900818cc5f0793c113f9161d10eebad5e6c3d5f0d8593f913e10548305ee373c0ce2e81fff96c0a5641ee85d375357759192b6f2c4b7f9711668f4d5f436763e89e878dc130683f60390b5ba042f4a4d6d6e20d5b2bda4100442ba02ae8a905020e74a724f521d707e6a09d443cb4611a292f3366687a2c6691bfbd1a7aa15d9343ef3c06568493b7fc6881623ec1cf3d346f88ec8b6c7f6b1e0ee443309668c0bda21bac8984aa978e2b6af57c2fe9850c14179795ba0060365422a14f35b7ae4f833bce9d80aedae0e1656958536f9da212821711ec672eeb8b44cb9a5bfd1c5729ad193f4f7e137d885a4d9a46020444ec81544126b71d1f291ede296d979314a330ec79e3a626442a14c1ae477677aff364344c537014b4930353350d628553a9b2c4694e6f1e2e6e6b8ca5ad936a1fe864e5d9ba34796e50eb30b20a6f031979c898c608fa98274e865fad24aa2d7c3a42bb64e3c9d2447c35be5a746392b1d396b82eef90612726dcb3adba7011393741dbca499155bec6784c63b4749ae67223f16e14cdce3858e50f0d449169cc07a93976a28a2996ba8c4b188b6fbe43a8aaa40cb54e724fc0454c367d955bf75622d16459c9af6c718d7cd04faa8dc408a91834443e395d31b3aea04ea0d324802b91c46c28bb2ce1f27e90c3c9d5848d2864ecb4780db75ea0fadddf4ac30ccb98c84e0430fcd3c8347b95ac571d3dc96c270d0060698ccf07c13180c225cd1029bd168ecac9564e017881d46ae0e10228299ff43e0aed83e677bd673a0b1e97f2903a7b6d59b20d5b916c067aac8dc4af3287b5f7212ca6a6bc3511266ae3be89b14d21839411b1537b7549c8cb2f3491b46354e6d2b5f358ef91001664ab4936af8c13338ab4e830d3d559090a6fcd20470ab7a8061b3da188edf5662a65004cbc6f5384054ba3a3f6913fd6299027a4a0119b1818273ee237fad1b33e8dbc252fb3823389ff0d99db64ac45e07bbea76a20dad4718ebaad85d550ba1d8a28d76ec68ed99e7f2df393596392e835856579aa5207bc8828d11144a08099e3773ebfa7575a0c239697cd3cf08b64222c8a93c51904245a17296510918f694096f83f19d88af479c1142afdcb93862824454fe33f64df1100b5af1232bdea59416339fd45c779ee3667c0bad83504e8d128188f288ce4c8abb1b49f8db652e97511e191a1aeac868e1a4a48df26538d2d36ef9106ac54eee5da3d9724c793d81dd2e616ee66c3b8d0832140c960f13af1fedc199e1d278667ec2ed2370aeefecca7adb206301850ed90422a68529908e7ebff9ff6b0c2739818c7bace2972f1a37d1bab29d673ef240f55554d5def6597583a43a46e329deac53a4d8d76d9ba9aae4874c95df18f343d903f0bbb8ecbd9bbf5a049c46f351f8c66490478b21ba625eb19807c3d8b72d9a944eed8e4336f5403ef2100b9f15cf3b11c797414bca717e551f171efd4999b68dc8b3942bdbe74041b20ba013ebff632829359c6a1cb4a0c4a07540203e576c0bdc613a9f5d16364548b3b8c8dcc7074ce740da110a06c78a55a4ea2a84968b1bf30b358d95cdd6844d9b4ad827d5fdf5dd6a674485ab05e5c2dc0403e0c493275996c153b331e19e8d9e5883b24d4d33be686f959228051e4c5af83925ac668596fa269b1ad92bb51c05abac2bf35a3f56166322aa2471894a9fa3ae04db6a669aca5418c490769165427012bb43cc7e31d34b02ce48903edaa4e1e6873d0ac931dba0bfccdc5913ab28dc339ad53d1d4efd1491b279db814ba4a153a9d3a2e3f3c854198dcf5ead06cb79ab175560c56c47b8b8e65b356f1ad318c9f2166923f42ac6d29e5207048ebf5b239153b6537debcbfb81fbeb6a8c9fa1711b7a0e147e900df9c3a97d64b3f53d9bd7567a6017257ae336da108b7ff867db7b0ea86cc221419c2de3db26f59863145147cb8a10781fa8343444ad804f4e2dc7ed739b84047b435076518343bdb18170b4a9badd024f038cfe06eba44f33cb021722657ef84dec87d4801cae607616e293da4ab971f72faeba20d9724bf227340c8f4ec48412e6bb8ef1a68bb2e48fdf5b2fa7d8a6c591598b151bfa5fef249eaf6560de5657a7e975365b0425d1255c5d4786a5262a1d39607f73d249f5bb8f1725de8261f045b0adf654ab186ec941889f0cdbbd2a6aa66012b0f8ffef9e3c38768f85b8306a77ea072f08190ba16b00c9b12b55a7ac320718b30d5422a8ab54f60bc22da028a268acaa5920282e9837bb0371981a9170ef298c3dca2f0529e2e67367dd8fc2c4ddb2b8ebe2dd6b8b0e811f4407fd033cf6fd019ecb80a0a1e45a08389b750834ed6c38202c28059afc890ff186c25852800b3e54d306514b18abce840d329912420626fd6ac3cd27d3af1249558e3221cdce83375c16b78408ad2fd80772a97d521ae42feb9bd538d9a402e75b03a83f2cf9817233728dd110a8ded735c820861ba2382088abeaa3b1901e1372072bcfe3283fb7fe57a828729d4c8e34e3741fb7aecbb08a36cea27cfe68e585d277533df7925c541431288cf101f24ec5922738806f1fe22374a592120c5a52311fc2688f8c8786c9ed1287a4417b82130f2dc69e69b96f2d2f85f3e5203655a2e85b8143623bb4c05e1572bd278e0c8a3a783ed989309bfb9a63e696dc5371de8988a45a38f6c2b4267d8e353dcd35105f578a42186c5e77feb49f54ca2dac3e6a088882f6ba6e7d3278da10e464f153212bd8a3af95fa38d8f091af606afecc43cf98b6fb082ae0862bfc691b758dcd473772b9e74806e4c9706e95e0a2fae95175c2da96a6f6ef8a624f7be59bda42c05ec80b9abfaf41538ffd602e4c0d52f3f52a09c88a026d2e290257bf3deeac872f89702e25e8c32b21235b9377422665ee414154c366ec1f72b3263d19c41274feda4944efbc8af0b2b00f23e8aae80013546e33b2226c2a039890b3e91c26240cdfe6514cf941a53b551ad90c5cb76c165cccf7f5b65b67a5c49222abdddc2407b6ac7800977c0e715c6596b195e70a2941bfa71795af7a50b265be62d9eb513a099c29ea2ebca00b48684f2d211263f655179ae4d2d431a910610959197236feb14f1165f9fd34a2bc64a4a55870243ed9316d3454e0aa4869c815d6b2142e32146d2f9fcaf4e348a26c456d1c78178f7caf022e986bd6aa6332e77eee0080ec531a6e053ea52da9d5529d25b4a3f2ca52ce83b59283bd4925f16d5cb9033a8cae8658204cd2d21cd591465c6b22119dbbe32cc6b94323bdb8917b310900fe95b96aa9b3a0c04e9db4f571d037ed9ee6c4b9708feb747be667795900a087abd95fa448921e1fb8428c90c9255a39143c2ebf979696369152a69402bc07ad086d081f63247fa5973faca520790d15ace8497cb118bb116bd0ba5f5404de5a27e5c0af433d54cdb9a2aa56a5faaf2258ad15013ed82febbf5ed38850a758fda65a2d0013d517621c75234b26aa5f14c7d6ff2037eaee474150f3da3ca9d6da6ed7afdc77cfc47d57b927a2b19932852a68b922ac39ab60eccfe694324d22ded3777a6f047f8e3def2377fbcaa88fb5f2b755ba317d0f3281df43365d57f57adcaed36f7d482a4da1cdd668d356bc9163f4bb8f7915136df4e7834049574f727b103ad2d5db6f9bddb6faee5ead4849b920d5c4d4ddbe8d529140eb6f5ff9680316da7edb36ee653f1d558f7c8128718ea1bbfd12d38f79d4bd9c3b08e8c1ca984a69691e4d90fc9ae84fd2ea672b31d1f645605819ec6522d0d111e7f0bb44432527b62f8336a4accf2581decda19868db810413ef2602597911aa18e58aaa6c3f088c46c9cbed975898dac0c0bad40614eeed99b8faaefe8f74cdefde7b1ff53fb269fbfadef69554aadf9132a7fbc34ea12b2b5aa55dc544f499a051349931b4b1daa70fdf4645202afa1461e2f6416ed4f43704f86065a2b8791e483651da34df23e9f8225fd1c5c4d465984868b33fe01c5ddce8e24817f74cf4bd67f2b84adf7b10e87ba48b7b8e8130c99f421b13cbd797d419e4dc6ddb9a6ede315794651b6bfb2d4bd65450d15654dbfdc1d6b701c5fadc2f4c048689b6ee2cb2b1389f79b6ba6db46edcc817c85680bb6d5fd44ff3ce94337d6e5f8d1ead5b32d1f64571ac0ce8b7ff205efa1ec9b7e76d05ab7d5fee9de3babb3d6edc9d610fa7dbfda4611012ebdc23b9df1eb7fae0ffa034ecd1973e4886a081b3e7b160e703791985971c698d5c0e41003f6c7d53f84df45bdbfdbae741a8df43b6c810a610377a46ee2773ba237c5063e514dafeaa460bd63fdcac3ee0d84742d5a75630d1f6f77b102a08f47b0a67a4d93011b759cecbad688c9501dd8d7a67c4c7411dfb1a1caac1365161aaefdfa4fdfca6fa0540639ba8f437cdd7bec9bf6acf345f9baf7d11ffbad5a9ab4da127a7e1e320592f71b93ef8be7ba6ef3bd2d54cdebb9a0c7f7e934cfedd772411f0fd9d623d5f3bc6f51b102675df336a31adebaacd6f00c75a5bacc6384ceae9215ddaf7b83419df649b7a5ec6d7e3f3242471bfe4f3ae256bdfe563f3199fe30deae765b8344d93f1e313a3c76afcad47f25a7a56ff5033c64cfeae4a7237c2d817eccb2dc66112059daa7352f8a3dad0043520f348a97c710ebfdac3d80a0dd209d6b5ab75ff711fe78dd48d5cbfddb85d0f9392e8fcf0919cbbdfa3852fb08405019540577bba8dd6c8fd3690ba916724aaa36ec419b9fc1bd7da2e5292d65c2bf2b1bf8feefd7bffbec9bf7bfe260886cf914df3c3f921e9d29a9cd229ce91fb6ff47a8604657b3285a4ab9295c91fac3ec0a69e07df47d8d4faf0057bb55aadad6774e3a69e9f5f291526ffefb5075ddd8dae26bfef274904fcef89cc9e4d859cc30ba9ace8b7d43c7269dc33b59e7bed399208158d64e2de238970a44b039f48ab45d51ab1c0b1a7b47ff8fed5906cfadec91262332bf45b0bfd9ed1e7f0abdfe8d2de237b4ad733927e4b2da133ea3d553088fad88ea8576cbe4c469780f9b2f0b214ffc4fec063feff2d9192c2bd3686307623144fa1282ec6914b0d88023202e79847dc739694d875e44f21fab059224d21ea05a00456c6591788e5c47934a77b53e722412321a9fe12b70501d968578346582adf671174bae6f63ebedfbc6fda7869dbdee543e3a06fb7b7437d1af412f7dd50f3b96d74cdf7b17df73eb4e7c826eeb5efb46fea7eab96721cd3a808d40a964389688d6a639197dbd36f82dc3ca2bd641eb9b49f2fe54db289fef720fd8f7469316ddc90b657dafeb53d6c7b3ac25e2f2fb7d77c4fa3a34ba3cfe475ddfb00bfeb3cd2a5bd8bfbf0fb2697e67deb7d741f924de177df229ba83085df7d53ebbd079f639c13d80776dec873e358f79a42db6ba695a17d9d52303c22e177a48b7bd00b9f43fadd6f2493f72149646edee8e2344e7b4dd3de7cdd3d83b52f7da89b846482f5ed76cf44bf235d1ad37c97c6bdf73e3c6e74096900c738ad56cfb5bd9d4275236b0daa753e0e9adbc631f8f37d84936ca2c2e41f7adf6ddf914b3f8536d1cb8d6ca252bf693ef84e36f9871f922e2d247d74691fbe46ba3e007f3e53f8fee0cfb16f92eb83f9e033851b525473256cef8de214dabe2b890cf172db9e8336f7a966ce097633833c567b4a567242851ec9043e11fb604fc8a107be4732856f43afa715825e37bba8db66b471b5bab6ef36d27f7eef7dcfa560672dc2fdfc22ddfbd2245d94745192d26ddba891cbef61926b693e5f26ff49643275ef2411ff8e7eb73da7553b2e71b5b29c29da03b9d5b5815ffa42f835a0e4067ee70be93c97fe24818938e86bef36e7bbfab9db2006ae08405ab0f6006d6c73939b424e74c58a80018ef37d235ffb71d77e95b9eb19e499f3d340a413ac166e75cc008c96112413ac66e4320df13916924c339ec8043f83747dfff31ce3d0b544832442257c22f5677c4832d1f8094822f4693c92873f760a754b9c18ce4a5b8767e4d2d6b1b93ea8fff320d097517fc633d59fe1fa5ec6cfd76792f194a4fff3959cf1f599683cfd195f5ddf8c51fc1933c807c004dfe4e2def591ae0f687c8df731e30130e36bccf8a61a4fe339c631f139f60160b453a8fb1ae304dd8c91c6c81ceb7a5ae0f77d4ff8debb84f87c8cf063901a78df7ba3ecfb9efffc430a4f4dece8f0c48b07761832fbc59f47149072478a0d5c9ab040a5cb192a78c42ca1ca8245d50e3bf6d79420892c35587cf1c50ead2c5492f8f0c4841729317f2bfe8f38010f073883440c54a88a18c2ca046638a4a9e2898a144bb238c17295a44e93246d98cc6ce922cc08b078e12a26b2d17c6868e876919743238883950dddee7f55ca9143fc3aa980294fb0aa9a2cf14591189e2c31459c2b80c0e14bacf14085e1660d9d344a7401c68e952c29c8004395113c717e24f7b1f4727a4972564ca18aa9157098a289162a624d040e5e6210a208122cf49a7eb19f45187a2375c2c8caf366aa8539b166a24e94a821dc5ca19386033f88e9a207189240d1c4180eac18b343160f47aea809e2c995254aaca498c022c40622c898a952024587993d30664e921d5290810623bcb8a2c6ccec8a304f74ecf08bdd5c501015a8b30516477cd1448e101d7071a4cc14292d607142ac9ffbb986c25f7ea003669228628919138a9889759c2f44c8c0c2123b272861335992584541b3450a7130a006071a961002ce1739ac10c41552d490c5072c8a48c9627c030b761aa28d0f6fe24425a1429b18a70902cf124754e0328be2a598622a073b4dc08921c679a0a8d0408392333330f9007fc90c821b4dfa4510be39fbbf9c42cd59f1ff8694fdebc4450a2e4e302147ce162e311276b8a2031a1e92b0c148ccc6183150c000a686199ab09c19dc305901c91369c274f17190d3130a50c0305bc34211a920255eb0410c961aa63089f55b31c8c741ae7779df08f32f272579de44f1e2421d293dc4fabf5cf2b97a24da52c1152d5362ee203103556c088c2d4aa45a3803c417b105547dd1c31b2d50ecc4899d50a5c59a24508a781af271100e280cf0e104294eccd0b193c4112aa20083021e375fcac422d018d8c0444e0c8422c6ff1f2b4961f93f1eb5c6315bb85c468a933baf66cbe0f0c5752bac681d4cca9ab60e2675b060fdc6987ff9c3fcdfbf0cf26943b791a149e406e91fe29f83fd496ca5cf5e76b7bdab9797e57860042654a16526460b1129e4b0c5104b44a9c18b0f02b88282840f26b4b12185983fec09edca2ca4ef645abfaf568fc0605d04100addea7cec81a5e0f6fd7aacb50dc439a61115d968fba6c076b17e6556898737bea6907bebf028cb5150cecb06bbfa4252823975247f25ff176c921d30917f912fadbfe8c523a1699af6fdf6dd7bc041f8b9ff78946dda77a48cbd3ed7d736185b97a361861124a8e2c487216470c2664d163765bab431410918b621f5d607fbf3405236a4cefade587fcafe6edbecac2328a0277f7f201362f67b0b3c64ae9c4042852b40d029b26d1fd00bd687d43ba4ce305239602be653929b60173587ef0bbfdf4aa6e0c8d0d0839ca3d5fd1cbbaf630bfcf0c39f74ce6f8e32114472edb7ae73fef7db1804fcb981dbf63d7abe8784401aebdae0c3f7be45b2972148cae67fe0ab32f0ce1781f3b247d7bd0184bf92ff0b8cd9e4effd1c3d929bcf532804ce51ef04e291ae256edb9ebded03d6344df336e76600f0581907c5bdf650dd6ff44708538866bd9774fad48acc09a6d8bffe42cf3926a0d70017dce66f19d20d327f88762bf773b457f33009026938f2ce211a90fdb9e18501ee685165061db258998af59a254d906c61c78aca8958ff977336cff0e00f03a2071816ab39a186866afd1d2cc75951b4b6ab185e73a71365e1afe4fff28701f179d0af601f8e4ba13f8f28e9201b0b5e19c8395a93e45eb0f2bbcb9f2c3bdfffce9feeafe9af98c77ce248629d5c78c28a1916b600238c1992a474592305a7cd953b31ff178c091f7a15fde01c9ee51fa0e62db670c36a26043cae1b4518818c18f0b2c27eaa0c267b39e1c0890787ef25e555fde7e7e7473b82dd61194c09375eeacb2e90fd0019808f20c04295fcc14461ac0cdce14215e6657d28e0d35472c3f8a4ab0266c430fe17456b8f82bcff08f15d04f22902cd496522b8f4db5d14c9fa9bd6a1141695e65150510ddfcbf1c9fa776da76a6c78303c298238e646abc178ea052b5f5f2e4da1faf60a19e1d2a5796459a83eacd6b06734c1f6f49209a686cb6d341f8873ccfe306c6b6d28194ab555cd995651d4e9948a1ad9aaac5c65ac8c9999d9060a962915330529d87e9f4e2251a7f459c9a92b79e9ce4389f2642425de51411796ddbdddbdfd57f0c6c3d475865362d2c8a5e7e7e1461aa969da8f716964d2b8f2d20feec04b8ac732b5fa7eab6f92d21b7e309112188c07abd7ebb3aad2da604d9f3c6153e8c693ed9faf1d3024d81012c759cb7148b01d30d80e241852911df7e94b34b99394591816dd024a898d1428951615d4d9aa94d830d255e13df832f5e1bc94a2bd94faafcec18829c696937cc1ea3cadb556af934e6ff7c2b6fb3bfb7cc5a9f4b74ddbe8f695be921b6d24dde8a6342251ca836e55ab9456308732ad94a7b0a817456c447555701779d9f35fb0201853ea45b0176ca8823b67a078bdea689ef6de5f8386491ce713811ca03a188f8d44e246a5d7aa2595906ae5a1549194ea0e2febe7b175caf2d4993757ab5851847030ebc8c19cf3e92449a83f84bb17841ab45667a5b3bfb4332c73aa8451a40b2bf2c4ae701f3bd07703faf401270147ff10f1ea60a29e5f5c2749a04fd45ec90bb86ccdbd524ac298a87dfad7ebddb0de71fbfbcb7edb2ff67350bff074db35ff3ac692a8eb72f80e85b9d10a3bbcdb4b96d95b02bddc885d1bd8a04aba6a2535e8cbf96f4f57eb7c2290037d19070133d63edda78be47364610353dccc19020918234fdce83266872d3a78c104074e7b9eddd3d17bed59e64ff4092b4b0e9a3b565453535456530acd5c32a3e6d36c8a15345aaca8a6faa9a37a894bb594476165c94173c78a6a8aa7a43a8abe64b0cb31731cc7b92624833c79eedc8ef3f74621dbed4821362837929044c9212ff993daf96f7861f945e6d7e71c1904f860d9df49d707f5b5f74129e9f26fab29d49574b91226eaef6e8f812cc2b24cd2ff49fe142227e03245b125e0470de7a7390b21d064912505e69781340a7da77e7ea6679208954932f15392085792dfa9298359ea1fdc64533ffd4a9be833e99a01653fb595d64267a0b7dc7cec79468270cfe3f65f90217eb9e7aeebcba38c1a71b14d72dd3692d34696c3a489294768e1e48a33599c9254451d9162872c5d149956e018a1031760f2d860811ca214a1c2b24267c9d4d7455e368b65ecdf28462821042043f3c8e3e1475c5b17e2ef466f98971cd7ede414ac114a08014815cd354dfb5cd3348dfde946376d1b800e5616e49b085c756990fad4b7adc76be357a3eaca6422385de9edbb47d77dc7ddd8832365dafbd79092431c444467860d48a4c0822a88294ac4fac9cc123162a6f082c4484ca3d374d65ae7a4dd93e3dae96ff53957b5b456a1945964a379a43da5149473847959f4f2f25fb02fd98adc826cbe3f7d668ae4eb114a9847f45dfcf5394647ede9fbe0be924d75f2f3457262882fb7e50c4d6d69e2ca6077cc95294cd5d38d784c1053b77f0837d5e79e8e4ddd6f1fd0d71e84fadc5361aacfcd26fa1ae9e21815d59a1bd02c1104121bc41798b89282eacad40eb1fe2f2b9d4eb598b2e2d45527b283ba2858a4cb473ca7122c2efd40522221908694cd7eeee6c944632c2bd1e4e50f739f5e50a7378a9dcfaf438975d5e7cb7959bf6fbdd185485f5e66b73e433163ad7640f2f0b295a4d80e782855f1d6524ad77595fca68fecfefb8f6cf2c88ee4624cca4460800862d94c7252d5c4d7652ace96cc4288cc2b13c1e5641d70ba22882e58eeb5ef20dad70fa2695f491eae0dbc87cbef3d5ceee19ab1b0d965d8ec72c8c34b218e188195277ac0c2872f4bc4bacc183658d854a13ae225d6ffe5c894cb231503d94e7ea0d87eeaa8114ae81867ad283ec75489d0af24c7f8edf5ffd8dddd6137aab07fbd099624aaa83063e64acc5b68420d132d54d0e2853b317fe626b5439d7b325d77f71e9d2e1dbfebd3a74f9f3e7df2dc424a141723d2796254e857fb2ec42f8ad6725c59be5e53843a9f5677f7cd4b9db47bd39afe18e4e5d7b1759f8928585f1c5792378dab314c70db285801086c1d406d81988eadfb9a47dd3391972ee43f328e003091bf7765af912c6a3892581898e7738702fa7a041e73654edddd56b76ddb2e82090b58aa08218495392f10408b0c3554e184942a26318f9ac2440b175ea02ad325e67388c0c24489246fc03ce1944d7d246a7bf905c1c0cea773beacba4fe766abe90ca4ea68c11a978519ace370c2f60d291335d9fd0c9384741e6f9f2d99d3d5805e219de70612beaf0ee0c1c108aa21a8b8c98ab96f20f3d1596011f3143ef8322921f90492228889c0638c80f174b98d923df836e93da5dd7f9d12dbd7f30ef271c03d7f0f7e8efbee9daef7dce8bdf5f299bf7e03893f51fc61ee7e230b77124830c505cc9d386c6a88f99d27353c11c2c99729a862fe5f524e888f338062b5be9c0ad6df6a7e83b08c7ac0cf4f67a860fb4e0ec2affdc75b0fff5ac739e9288523e7e5ec5cf38122cc28c103174e5c49f3556040a1872252272089f57fe9f48a8f3e05462c5025937eb0b27f6bcb2538ca1cf84f265bb46a2c0328bb36a0181853a589138c80ea220f1563b6c83913c50b2194c41e7065030a61ac90c4912ab12b664c18220c385d6879220317ac8f16bc4cacec79e478c8bcfcb221d3e918c4bfdd9ff2e8eac1b2973c67b8c1f62570577b9edb36645e7fea0169b5215d49f0e7a7e27842e384a91fe64c7167052cd298e982850f79a6081345acff4b4ab52e957bac2a0192c9cbfee1657f0643580930fd70a3f1bb30d8ab2cbb9b4919ff6c61797bee32c9bd1ac6714c75f94390e7ca883c7d97e71113cbb88dc9cb8efad28a5a19910e992b7b7e4e083655d77dfa07861b4cdb420ffae90fd16eff5c62fbd2ff0ec291ae1e7c351202699a56291ff9e3424d7f5efe30fff72fbdef9436828f83ea1bb151e5eabf605ff2df88c1fe95fd3805d142141ca0c043840c6e62ad15f27cc123058b306e88f17ff9e69b4f01d40c52f9e3b82dc8907aabf70db23ddfcd4159dfad7f1b8368df97f392b2f75b71ce33333f07f1053ef6b1bd02554ddbb620aef3a837dd6baed192395dcd9fb6dfb81e6e7f92c40d44706521d8401f3dee031b0441ef033530629d948960f8411f1454a98f8f8f8fcfe7813e8254a08f61ab5bad16d716370e99f531ecc15d211db67a2c6c47a5d1928dd02302c9a0d37ffa87b7964c488fb53e61d22702f9843d7aac4f8c182c234c9201faf8e3eeeeee6ec59fb0875f2e4a9a11f6987706e8a34da211faf893344118c347b4a2d8d3124311143f5114454f143b4e14374dac229da28b628b7c8096ac0397bd5ca1eba4ec0365d9348eb0b2a2db93c99e5197bfceac8b9d6c1e2ee8be6e911b5110d65e24db71db49e6c260a1654d9e362470812887302740b903c50b3ab17ef6e2c5ffb7ffd9f291f6f4f9f905070b1fce0c21439d16e224cdae2041d3444909c088dcee65aaf473fec307fa0ff98bfeeccfb92b2143870bae1014ccaf301fcc18fdd6ed2e5bcc60820e2a7881831797053677aaa8a2c2093452f495e1c0c139c42ab4744142668e973a2a0cc0cacd9ba8aa2c1c8ad8c0e7ff2cdaa3d784ddbe1c562571029514a02c21930587165937e0a1426205c61b9f3e9d9178bc76dcb932e7d4c1a78cde210cb0e2421d2de08489424707a820b248020520e82011eb678f9a3e5f4dd8202f876e49ef0f9d2e2e2770644e16178eb48153e54a183c20c96ae189257066d49caf2b6c5019da575fd11d5117eaee1cbbebd3840a59a4d801ca08a07228819d2f5428f305cc149a46ca26b5fa2181314e49c8a04005082fe03ca921d65358614286239c949943c5ffb9257e340184541549cc04f124c917542eb081014f1348ca1f360a02f9489cfc6549a6d63b675041051628b3365151208ca9528526ca113048f052b84faa892e4404ee9c8b8a7ed186b1ef0400007cdae7385e104465d982ca1460686105a60a2b2b30c07042c30a2a689ac6815a7d24ff6677bfe6e6a6ad4ab2c59a3e1d8c7e71040abeb462065c24602468989af2226689355f1e70040c01a58cc95cb0c444fc3f208700a323d805396aad46ec46cc0cbb20878e1d18d45ae7053974803f3b400cc604d45a71e8a006781ba18bc9258e5caab55658adf53564c18e221b15200083a30a28802520070540b5561d19500c805cb5d60a72b5d60c9098f932738cd271c6baed3b1e3c6a6566d86b0af177adb5d65a7980f307ac9526f97863a3020a26033db3ab86264ed0d1f02c682335e3fb0199889fa332c21873ce3981986bb7408d6cce392768e7ecf169c50043f09bc1561e8d6e024edc5e5a8deaa240d30235d482366de3454403ffb7644ef69b985dcdae66575750cc44f3ca096b36bb9acdae665758b32b193de387db1123867d1f192433518c183ea4cce9daef9ff133f214c29acd66b32b0feaf340f0039dbcababab89e4eaeaaacc6c36bb9a5dcdae665758b3d915d6ec0a6b768535bbc29a5dd5ad6a1db76d75764565761595451c386fb0e8ee2b37596dae60d3dd575674f7d59a2ad474f755775f6151318514514091a6bbafbafbaabbafbafbea0acdcfa939f1362ab09382d9290071d3a652030041b6e48a767cf1a1c98338c1c651ad863d7c03ebd7d3d1b03effd3b37e72673b97df03aca3a54a20328473f4bc873085fc0b228dc3ff07d312e7f0a290c00e9fff7c7c7c7c62c4b0ef33fafdacb5d6c7c7bef5796b7dec8f8cbe61ecd9534b7d4f2b0c8108f86179b5a7b40cdef50d332fa7b40cada5adf40c3b3a868ec1c73d2bbe39eb8ff7f5775dd7b147769fd7b97727e11c836adb5052e9a5a7b135e8c75a4f33b5da559fa397bf7028350e7ffb3334c4a161391d74c0b4f443a97578f07a3180aa832a262f7f0cb50e0fb22c9665c05007552087c5863f20088220650bd2d82d3db5dad56fc95ff565387610b18e1f8d63e376540de9c777405ca8754c8071f86b6425652ca7024ce43f25509f3c2e3a2eb83a58db731dcc320fa00cb0366dc27ed3601c8f6d44aa55d3941cd63a30601cfe5e66c044ee7787ff3cc3cdce947adf96ebcaeec6a29797b0b2751091387a688e5389d53563fb6f19db7fc950f03e61fbaf139aab03a53be65ad9fe4b02db7f9bf8c0cb04388307d2ad6ac9d801bb4b5c3157899ea2d74b466ba8bc5437cc4de282b95f6c5f24ec3dc2a505fd03552051a480fe58ce91c60678bdd8fe3b654770fcb7d2ce7cf34b0ac2f6653250585df6d20067ac4c4433490b8e58ab0ea9b0fcda65325c88b94870d472d65ace8a334aced3d393112d8e582dd0dc1d72bcc8d862ca9c1768dce931e2632caebbbbbb1d8b0b23b7e75b61520fd7fa304c6a8573acdcf0c13029e4ac7765e0fdcadcefb9394beef7bc0517db3d93b95dcccac1a28515d626408b17383bef7c9b051171b2c42d2beaf674d8a48d366f8b5c1e29bca32ee238e1041ea8286ca008c3041131a718b290810e9d2c4cc0a14a4cf69a22891d2894d8191346ccad84c943c4122f4b74a813dbe1d36189269dd7be27cc1c57063a71e97c0e4e1277be8df3f446ce1481ac0871c1f56f581022993735d437dbb66ddbd35a2b27132beda931939af69ccfde58e3346d5362a24dab9556d752f85c1bcccb3fa78eafbb187957dc886a2182737cdff57cf7ecc91038cee29058c65422ccbe4affc8bbc56ee92eb722716763d912e6f60f5c562c4bdcd9916d8589ea0f24f0197bc653ac58b5a4665877f6939ca727a4d798e8a7164ca82da0509d8b93162f947c3933664b1830540022ca0d557401e2082eda3c418200df940e4cc14203104bd274a9d3e34d0c39ccae48b2c20fda133a9f94381bed2758752e7c87ad388be5707123e6fa87d04f6011547c424255889b47de0785cf5f0a718e9ecd44ddb31bb51b85a4e842ce8105b73af8165cd9518cd79308070cb1431b26cc90897a2a43a7091330593e44916707cdcaf7e5c0a63ba20476be89f5840b379f24095df8b61b362d8b0a2436284e2cfec268ac90b860892f8297c9b80142fcf182a77b7202124f8e38175a15f48a70f220861a88824486333a4c3163c50988999a19c2387103250497961b1cc417dd48796eb82d6e94706456182b7067b2b8b832ebe6889a52fcb1a4ac446345db73994c96125756be9161e587cd8a112d6deba71d532d59f9dafa298bcbcf653259b3cb5d269325a5d581c2c51826b3bb30913f4fa1eea6f2d2bbaabf547db11241b501c57e1b888027ac4369afb1b755961bc1e93b1ed5565ced353a5f5ced899bb7c3aef2b9967378af91d0b7ad984853c244da94f2529b314c275e6ab2e9e46aef79cf7136a058eff26f70805bb7aeceee9994d450134d7c36a058eef2db80623598a6b5aec669da0779a93d47027d676085f6ef475d444c1bed28a2a16c7aca3c92e2b695152d1d0544899cb5542fe9a73b1da3b1fabada43afa231565666e19eefa573920d7632bdfc9242691b37e23577cdfd1c9cae39fd8899e021012c3856b4152657067a6a62b832a65203759ddbeffc1e7ee708770825b907afb9fddc64c84465921c84bf92ffcb1f9684b746e7618a893bb1d0c1daf3fddd14840064e9c7b746cf5a72e629168eaf2bb117d19610dc7fe90791dba76f85dffa2408a4097ddec1f7de87ba530a4ed1a7ec75656c258019ac8cad469842fea1931e69255e01d060656ce54173cf91b28d243130f68c617feea9a9fd1c349d8797fc7f95bce47f5d61fbfd88a73ef0587d59035591480b3f8cd90a8e8f26f6d1c4969b9ac73ecfdab8f7c8267f6efef64ba4d87b1753d7e1071edb3a20239490259595f58229fdf0be39d681f29efb6fe4983672ecf3c611b238c6e6630facf77d41ea799ed669da73ef799ee7799ee6cfddceeba78672236f86499ae79ee64da73bbb7b6e7f57f91192b70e7c14f5c3922db75bcacb6daf6960a17e1d6e776fe9ffbe9f238184d0c562f1e81a9afdcee08eed79fba40f6fe48d75cfdc6978b6c49085141ab4af6192365a6e9e778a0d3f46cb7ab08e62901f87e40dd537f4142d1ed9b31b6eac467654177db17573ba728368dffd367263f7dac8b3d9cfb33d998350a5ac67dee8df51501ea1d1a864ae564435ca10dd08032000b3140020180c0a060482d1603820689a247e14800d80903a74541b0b855192a328ca2063082104106208218608cc8cd1c601485244e28b35ac1a40710843106203bdd8fdc8ccc04f0a9e3caf6e3ef05d32f64f27afe5b1122667bd452a94746e11160c66d5850c102f2d3616a817d6f1a998a948868ae5cb3a90eb0a884ac5471715a59598a723a6199e44805dcc997fd852744665209e36de8d939e09cca72a264e3b03fd627921d29c3eab2400e50ee4ed98089f4798280bbcbdab036e82596240bdfe76c61b6af9506f6f9c488b5a1ff4da8b13dac05a5d536f225a30a000398d229b363beab23368517b52c125b3bdeda2d860ca81adcfd29d1420f262131633a10988f9824f31cdadb0fe3903d09db37be63b03580a858d94c13bceaeca743b561cdc080b5bd1025e40577b560a954f3dd18e49568afb0ce5508f584939e6466b03da18cc5ca6713e12602d2190e07c3707ea02a94726130a2ca2b69ae1200410d2674291ae86d70d46579d86a212d1ea9808148bba821a14e364237e7cd23c002d234cee844b7fbb5f818e41d94bcbf3a80b138c9bd60e6e5daa0b5c64c252ee00ba1d75d5a6b1a2c411168a780ec05d3cc92a4a0293e79f5233407a439ce3cd36084c7b060250f818dd7cc605a26d253688601dde693398875807a1c77949b3049e934b1004fe6478bd51d350b3a21f82fa1a3346c4264a4d35db0fdc7ff9f241f85aa5cd8384ba7f7852a72bd10e5498adb4d906d2785196523b1c3ff03dfe5b0f52435cd3f343b8375c2aca17d3315759b14764296d1c97590510ec3f428f32052dda600b43b0e50d223b2e16f6ba7923b57b8c5f586f240727c64d481dd26cc62007a73fb3310673db0fb945f3aefada0421eee7072459fd1fd7360563696c715a2307a081ae0ad0773699480431758016348c4318c0b1d853268d960891518a77b04d1fc096f498346eed3fee94362c51b879f2624e6b551163778a091451f11a2b7b701c3c0e8e83a71d8c1d672c859db4988d170e4f323c345779270997dd07eed01e8043e340c661ea0aea247963fb78cda1559a6c906b505ee1c4d1b07e25a68111b6aed9b2837fe16de6e3e9ba3e48c7e5eb1a1f0bec96c93f0439233b42e74ef2b4754c87a5455da79e0767142f2b24e26bd46523a9a24f447bb622d0e3759b6ef09a8d1bf0b51755ac94a9e4c4aaf4ad6e028814a359e79d1a6f1e9a4381499c07adc1098b8dd954525bb65ed24af1cab05e516faa9b69f87043ae6db9c971330d924c5c4efad515167a5f3d85e67ea467bdafd3da2b9cb93f8b31697b7cb8ca11ba2a53bc66988cc1d142ce705b73e372ebe246fd5094cc648d5b4bb1bc3839d46bb9266195166f0613fc9120df148c3a88ca325ae60da3b2d6b863d953948f4c2287fb77d2821ef06bbf351023a6fbb6ede603ae4a45247c322d7c68dacbe066e426ac3ec5ee351b3772fd861bb91e8f1ed24a919565112696b3523484bbd1e9268dc2dc88b8018d6137bbdc40936d04d26289e903ad2e0e8a9ac432b622fca58e5d82395e6350bd8dca37a359b64638c425136c7de1053a42dc8e58f5251ae18eda27931ea99b6a6cc7090d0e77c70093950ac45a992289b045a11a8d51380411b622e640323242ff00525ba361fa5e59c5a7933f9930bf005355a3235949981f80a9ea29413d95e95359acd58093b0a36719993e82c98da7bbf88a5d985e4e84acbab2f9f312f061d1d25dd9cc4dc6269b616afab15ebbef7f747126514e56912a79ac5057314ae8ae899f3f91d4821f913370b5caae70f7550cb50d12bda09f181c5a86103b46bb81817a6ebf40b8f328c35e8d19c341dc2f2a64b2e262046cfb865c0bc1a0b96da6930895221a55b5851ecf9f520b0550c074105a24ee958c01d9561a5d4389413ba21ad3cb8ba507554c0c5bd04d16d507ad5000de701e05dcacb7cd27a1815b171dac5113f2da235a18edf5aaa612235c4cb5d66c1840115cbc329e4806bc8afa0631d850893bacc499ed4e3f20bf9fbe002a2a18bc42ea1b8ac188a1aba428e23f506f94c95957699bfab72e47ab9a5e46fa451c0f1358233df327c6d2c62f01e683a3ed54ff637f138b432952f2d999889af870a7b67469247315b8f1b80b1243e546ba793aac6da275aa7730f1d91fd382e44eed7db8da0d48dd39f2a96abb21b92a15f3177610d1b90895ccb617ae6d204ccdd98bd7d077cb150ed808d2a00a60d7960f11a367fb04a87a5494d82fa6c02f5451ff2dc45f0c24f8fb36b94744450684439109ee664e898c34fc3337e5647b79def320e6c26f1223abf08b0c64ebb80a92ed9e585c68d005f710bb597c1efc7da604b7e53e7e2bc0e0ef8af680131b440818d34b01413012160ac880b7a61c2834f81b3df9b3a275b4d519138db07fd6cc01ba981df4b5e84844ac6c276a03d74a90f701af4eaf9dbe9e29df111185e16650191c35a63c9b671ec9ac932a0f59cc8d8cb2a305f92ead9195dc9ccfb8fde428c945483d8a9283ecbd1efaa4af2b2f5b593a1b9244e1734857fe969310693bfdb5ed4cb13410cf630383ec8e7dbe4a87a91d5ea78bd76253e00b3c07ebac68182753b8dceb5b16c0eab2ed2869a03e4de001222bc3cb11389edb3f4a7bf66601270b97ebd9beca42de060eb8e66222420825a28a7a262d67d6049b1aad1ca50906ef881187e7d150be37e5b5674240f788c846d1e961020d8f0fb6294db254a4a82b933a2bcbf69c85ca45e108042d5a0ccb1ba4ef477683e112e15c02b49cc40fccd6e0a373f325b567e07b902695c0e40dd25f7c19bbdb1b671fb850a4dafe4da2c336bcea52f4db65254f8c0bef9387d7efea94d99f622f00e40833c4aa580cda8fa01d604688e04d2cc4ae9b2e2f0ed07639543921e51cc0b8f5f71abd4b7dcab18804049191fcc94dbf52c9a44deb9df94a102e24f9dff6374ace789ea6fe1a6304a9906ef65d583f9f8c868b0e7805ef30275aab876819b3f77b730f55306498ca2e054f0a82dc81aed069aed06352a953dd14e2becd286fdcede72287383c1106550c15cf0dbb0464315478dd60970216f3dcbb576934f532bc73a5b835eaec973303e3bb77acaf261684ea29c5ff132e6ccf53f0e06da905944f763ff706fb38dbe1001e2edb45a1819ba06b684d5dfb3636cef50981ce322acb937b371571878e5abc2102cd705d09ee9211140c6a1e0050834c46bb376a30508f46d5f36d9fde6af8c2c8d989bb5e31bc7680ffe254739dc05dc7dda2dcdfdd137b5b1eac490d0ebc5fbb94480fbd3edff9be3a96524728627d67386624d89a11208e96618b8c110324c99dce3867304df18328b910f6e1a3e3c01ba37524433101b0f5f2b91a3a3d5a434062c79ca2fcbeeddbf2e0ef13d31d34c523d362895eb0e377e9c0d7f8d577fa61c1929aea196ecd60675f2e18ccf35b5d6063e10812101e162d0721202759de06daa65edf8298bfcbe19a2b79204b421e4c63c1a0bf1597536de94057f689d460af94225b8601bab25689ff5b447add86962a5b0f3cfaaa3c9ef6bb39371f21ef14b46776ff968496d30720d0b99f25a8fda1546e8c475e8016d96e3cb9ee01b9caa586fd3fe1405d1a6a7f1ff71c2108699d67051f2d6ad759b1d279871b0d33158e2a90ef970cb7cdec6286e298750a8f0cb3171d10eff373e4d3f5425c3db5872bc044d8a283f5f25b93eff4bdea1c1b5abd9ad11ab4cccf91cd5fc2943159313ee92bfaec8a094273ef5fbd570a3366ec1f2443a3f1bcf17b6b65c3b208a3bd9237002c332a148589c967542c4cc4490c6336a5c97a0252c7bb714276f1c6936be174ace4d80dc437bd76f1a6dac0723f7496400c8394010b7bb81a96468824354382cd9063c5ce22948f2c4ae87c243d7f90eb2842bafc2d55fc43520516caf4202a208b0c391a3e9b2011a8fa9a01bba10f03a0f10563c26329665fa5daae4bc31e968a4103506f6dfe6e1d4b3d46ad1db675933a3641bd778ea2249a46c50e263de53a96bef2ced11b86aca7468128e75b1d072ac74a05fcc914453af634cbc0a4b9d269c194f167a070cb5f266f8924a4bf51bd29391c09d476336cfc8d89286ef2d46825134a66510529ad1b3ae5746ac60447c020c4959e37a4c9bb386856cab01d1c4d5a3f1de0fd60a61b06ee129221537b7e041dd670e735b5599b0453b131b62efebd9290491c1e22b5b01c365a89ecd508dac118c379ce3af5f6661c4ca7f9865f8d82d7bd95fb0af06e94b3b3964d0b083381e18b1cbb16692dccd29e3e520f791f1dee7f35f177a65730e1d6bba7fef4ddcb0d2dc3dc27349d550e159ea01484af2a1862bf14dce299f12273a0ceca14f0dac4e0f1f993eaba5fd55adb8e051b0ccb4355588e1fe849ce602f5fa09f9864e10e41122f722875716c8bdf4e0df886707971f1a26a39c99f4db1909e5f98364b53d84379a11c51e60a3bf636b30657aa41eb8f0be9a594c26d5429554981f5479be68d185677d643d7d5c856b46889e54e20e4911676c3453c7c829d8559ba83aab301d1d9ab3616bb7744d9926921971375ae11268159c7fe916a5ba6788cfd12d73b7de199b7658cfb12a117a6519b5d04198693eca870168e07a2b25d885d462cd32bf99e09948cbfff3277930a79b3a0f0f15192840abb6a4b006f386c44332b2ba90b4c57e0f96a52d4513cd00da99055818253e1efc1e3564157197557945b455f6ab61e8613587d3e33318d6ade7472ddea3074e2a29c90e16808ffefafeb41868a05f5a1f2819a800f6b493e8d43528836112222b700db3e0d861a30d9efdfda27e8fb44637089c0933c8015b85b079906a1e0aae0a3eac0e02a7e8d089083ebeb5f8d9ce72139d36c8253bb634da21e65785d2a03f46a9ed96a313fa91a528f5fef7d690f508808ccd95875a3734fe8954b0b4af31b176d546414d93fa90c2be74ea235c4dd3f3be1ddedaabf750a1cb45d18b1f582dfac660a9f9e64c8cb18823b4342f665ea7c39749db42c915f1144753524788c4ba063e868f8010de2b193f4fc0fc035371370008f5b4352c72b717be16933684f7ffed89ca3dd0ac2a7f71c04bbb39231b7ef5abf56c54819069c929348f6323fd10fe6c3354223d2c45b19901a3f2073ccf7eb4e56efde7164e4722510853294539f6ce4391495b3979a489b6699768c071bb2d7090ca64fdb9a573809088d689b0064922d01e20b00abc886abbd6fef1ad3ebea920f7dc900283830517fba8ad2ad3e24ed2d205c96a4a58b6bc67b1e79f8605efe58bf981d2ff34ab3e50481c61dbbd1df428d66750938791a0128e66b8b641d9b561cbfcdaac5557c97c20b6b16e73d20912e7588c2e58821d9f6ecd16045cdb48a16931783674ba167f1130d1469dc8656290eae00048a8906c1249210840b2d013eebe4c849dae08985a53ed4e619d103c3c0dafe161d6bd32826e5edb8107b500a23fe93154eb554e14ce5b1ece7671f95e3f72d226bd52ad7fe9482907691b725b4b41bf5061fac27645cb899524ae2818b529370e5342d7fb6f0e72621aeb5ed44a5b08e35854dfc34f7c17df870621e61d0435c4b7f983d7974393bd260ea70a42aca0b5d269fb28d3344e9d253e2c3d4bfef3221fc90a20b6e5f90b39f3bcad744691ac2da5a822f31688ce1313462691e254b97efe90aa245b5470c8941c4fee0152cfcb87146ef9cc781688b8b801b2c9b4ede1e8e2113c5d0a0bebaa32d960d8336367bd91146932c4b121e84d523fb7c146b3b805e88baf4168045aebeee51b4943df32894dc821131fe4d00f4cff0a0a14165556ceee211eb51fa55d6e473f8c3af481338428211464a7668dfc7cfdfd6690e593b8f2057c9b791d0937a674cff53e842e01a778f29b3b17ef1c1b8f0aa5f7705e4f8f5881096f6c8dd3633a1778cb0c5da981e9981b10117448f845aa662af6e30fb7e1282adb987bab7f8d49bc03979f3f3808579871edc7baf35c7ff20ae23c4dd7916c3db33cff9a3ba44be4fd03dc2c9476e0256d6979ee04616c62ebd200df96a693056ce8ecc4bcf830f9c66c8d713e34aa5b69e4589475ae5c0914ead3dbd60e18f02366d097adce64421df3f77977753edab047f6f6fd1f7152b0cfd1f225927ee2006a024889f1565bd07a47017b36074d805be22f428c76a3067c53f75879e5f4d4d65cdfee0cbc6ba5220b86aa80898fdef77ed97d0a8c9b4f1695886a679f3a078de7a0d6b2091aa898d7ba108db296ab30b326c96b7931527ad0a25aa6fe4ca7ec106dfb21af027a9809f7922dc3878c55edbe9d0ec0591b60126b0ae8c013a20c8270f13fe9f44d87d93e4d4737d0299da0acb17459fc266da3c05bc04916160ca9ec597f2b30be587f85e3153b7c630a5e3c2a72b33da8db443fa52a68a827420ecfa25ad69df9d39570db0d33bbd93e97a835aabf4e50c1c945782de33050d80845c1083e5cfa49957eccd86542dc01bc6bc52ce235dd5e99bd4f218d16f0b081138c6a7a737eae626e0b3959e33d8dbae1727954c7616ab8178dd83f158b582ca38fc14a8cf9ecbc516c9284a2d211f3c1dfb88c8592fa10f9e23f30496b1e52631e55fc1de331305c013627b4f484c99fd2f9aae8f8be38f55b513782b5616dc94140bfdfc2a16b594d13350eb779a7140208b8e68be9e4b1cf0a06da3f21ad2108437a2bcd13f3d85438ab72d319edddf0ab1409468e40dc6c5786fda9fed56c19dc3399846214fd4a41a188eee4707844c4cccc1ab9498d7db1ffca7500a712306fe494d651c26ffcd198bdcef8701fd31075be710061f95490eb7c588e6bdc270446afd54dadd744b526f0f8b4ec3133c0f2b14d8d988b880b1020f54f2ff768a60c50bd25a1977311846c12898819ee9717a7a256b01df081b262718008fbb048ca1a648b348078315f078d5d8c08ea4ab013e62397c4edc00cc41a83743c52e477ddf84b59bc565a09fc925850ab111146df58f8302c973a296c64747b345242a3632370e9e88ef385923e8a60fff37b348511fd93228f76af7b2c20dce5c6139dfdaec3a4b492737d282237c111adb0b8604b9daf22f7bcda693df990116d7e303d8e32c9be8cb5f8babf9a6272c6ed01a3a082cc3cc0072a55d79da7d9627506842184a666a826fa1f8ebfe44579af3e5382030fa00eb8bdcb3852e8f0904f530de64ecc16d8bc9672437d26493c4670679bb2a712ffacbee1807a50ca2744640585e194893d4c4a6089082e5173ffff4be765179d051506ab68c6f09611601152342af063a07331b84ab90c19b4b828e09c1b8a9caf3741ac9a4527683881a43c98628b32350848252e49509cffbac7bc94b043a7e0c489fddb448fcf9a2a59487f98cc20e4dfbb69d11374529334bfa9a61418206b0aae7c0ed42692f1a3c0c390c307289a54184f70ab8817bec81d1ab1c910f1636a290a54b12a4f3138181d224c53a347a78dbf3f7ebd62051100160ec29a3b2b98b5bc781218d65b812f2dd26b55d8f4a1469af6cbbd7c21f07e0d8c201ad74897439c9fb669647d11f659deead678ffae12edf07a66792645d3749c81d37274b19579d6bfcd7ef447228213148c04ac1792bcb9cb02827825db8e9ca3abab681e83745e3ca292e87a6077a6fb79b96994d0037b11c5a6ef32375f19d748da8fffe82f355f1524b4030f1b9687c53828de4ad18ababcdbc7bcfccafb47e74125a0601980549bd0b1a3a2a0c585c7e73f9042c996d4cf4edb26781e8ed011428ef359d0c5804229a18c518ae37ee2a0bb50ccacf01c406b7ff6af8babf0e8a7913f228a1fe83fa8158318ebb32274839d85ee08ce7920acd84746aa7ac867855fc08a5a9974d376a7586bc019e42334d21c858bfa8d3a28fc990dc4bb48c5ad190b0b283ead788e3a1b3602c418179fbca5948facc16d6139602da2c1e052bd8bcd112836b2a2818132d43110756653f465ca21ccc2104b8232889fca97f1717f78fbd1f478c16942a4f5c11fe9c9fe8225cd67e0e13a28092e79183e5cf1904316cccb7af46c99600abf6d34cc3cbc47e26960158fffa91598f20c25a9819c2686a0eaf8a10dfd362e5010805950d479ef060d17920c029fd0259f865cb99e7c7cf040b2f07957095382702dbcaee94a8d3b849146b2aa7152df48ada73e545b1929db68df10ce27c4ad362ea2763da652881ab260a2b6aa4060ced006bf022b4880daca5f270df904922ea8defdc57f0f87b2cad42f640a546d4582ea0732b1cfb973e87200a39bfed500ca9fc1e3599fd852036ec240a255f0bbd6de66a9367bcc1216f34441ecad012d5efac5b4a49cc0820d0e70a1f5094dc2d17a729e6fc722c2c645937a4de337f7aa27e40ab3f90c2573da5a7453affe88602abc56abeec33c05f6bc1eeff233e52ba8e8d5ca1b5a8941ea4b087656ad9f8c7dd773fb07d3ca0b977f6d9add6492fe7b5411257ec7e6e7a3f20b61cf10ab88cc389bc6f3ca11b87ac197f9e1c4090f22c86ce0525b2ecf3754f99e29e4b407205beed200e6528fb6dd135da161a0b6588b46e8a7bff1070a90ce20313d89cb7934e35562a1fe39c384a5ca784220abbc3e47fff101536ab0534600663fa0b9eca1cabc554391194b148f4950bf7e2b171d5b049f6e6d31ca9c01bc2ebd366decdd21a5b99b1a25fced80b250a0bc90ff03a695ede0b536b389c6a6b4db5f9046f11e4ed178438556428c170d1ca14996a3063d10c9d9ed382a472dbd24193afe2d1a13a12452b50a6b3db01614949ff4a097ce44e4216c668427d72e46d03b30fc13b420cdc72e9839a361d25c066e3faee7a9365041c77dbade52124f0c010476e714091432871e05169e10ae5dea6490b70ec0d05e9dc0ca091bec74c1e4b955469cadabc262a4f3125ddfbddc45780de720c50fa870331958177fc86750ad8f579d3ff3ee143007382f92835a0313e067207c880fddd87cdd93096024427773a21d86a29881b9b0abf1915fbda498bddee0a6a623a0eeba3331fc9c2de703a66e2c7700b87e1f857b1cd5df0f5a37d4eb3d8250b05566cacec86d808312afb1d6d551f7d3e48b91b9f99831f1f60358ba3fc47bfccacb9d9e5fa5c1bcaa5beb9d034acaf1b67d01d30f741d74dd5ad1df9fe733f64845fc0914ad3875443ff55243970716dd6f28d614a08a1f76c2c0987eedae57d6a666cecedb5516ce827061d5d88d54405dbf6689a3ac45a7f382e5885b88e2cc4a831015a436a571ab0c1a243c56980388607689c095628b8d6b5af561175d9e7e59f7d7b5c8bd9d73934e890a131ca6ff6e95b47e8b2aa8419b8ab73b0d26c60ce9c472dce57063b0b3825c69bd5f7c2e919f55b3befe12ba35106d455400da7cde5ac8df1e39182dc509010b5cf7bcc013f4a524c7dd87da2ce8b87188eddae093166398bfd044421044a5a145175a97b61684b6090c93eaa946cc5771efa9c445ca7a58b2a48fc8c2075427d0129f95a1d1123388b7e3ae457057942d38be4315e89bb70b406f8c39771cf5911c2d04adc82880d0455e042b0680deeb57d5025220aee41cdbef49bdf6b51e8efc9cd69efa57f2f5c4e6112395c6d9c7b6117f07aebca097527fa80800501cd777d6386ece1646e946f6249f71bd6437e53043516b4dcb807ee7058c88b435bfa3010eb860e1afa555c26ab81f4e6a0e61584537fd76922c4e8c17309129939f55e840c562846ecfdf902d0c649984b8610cc4a7de671ebe75a2f678d565687513de83fb0df11b4a76837b3d7566ae18325d9ce084e0a52ede90c152032dd0bd480db24adc68bbba6816e9ced3947c701e7a8c3d45836b41b89b48ba92911878f7f7104e35fef82b892f1c0c77affcdeaeb7122c1e9c3e8ff914c224c2e5945d0b2c64e7a61dec2a8a7ebf64ebc1ca7acfcae30e6d10f4bb536f24dd14801afeceae611792762460f2f35ccc794f5340a85f88e3cd2a45f7823e8472e70e34c944ccb405a807b57dd2d56dc7d1fca2ce175f3ea282f46e9521b8d9a8758726b62a821a87a4c92e95bb968b2f5f698c011cb9cbfbafe864f91d2c99b107e184e53e8146ccd0cd99a029ac7946753ec0981454909cfc97f40328408fe2f52ca40f3133f126cec0090c6260746377095fa3f1809daba69f0837f2bfd0d5db4fef1c188a0ec83bf61935c430df2686036b0e01e56aa2e0f533121d0d5bfcb53d3acfacbc8caa5040a6186b7f748e1acd0d91b365a822e65279544dd653735ddc4064714b4ccd38724f6829f058083b2c86dce23422637622d1b7043d87511844851b5fcc62f23a4cccf119302d54548cb69bc3d264004cb4c530065b891f8ce25c73cb848768a16571986630ff38712f96bf4de4bc7dc3af21aa9dde7548ec73340a0e549a64f13933b5abb8c28e4af97631d11414e7b9be40c1eb77b9ecf4be0c206269b38cd422c78603fad76bbf7760e8cee8ab77b5a78ba96713ca0e9b3ae8190c4b78a65539cd1a4c73636819cd0bbc1f9391a9582ec4668888e4c2c6b424bc4fe6f013a3d17606ee58d7111be021acccb19a4d2e0047a647eca360ddee012e85a5a19658f86ea06f37fe1b560239e489bb74b76d97c66ad640c4d5809eb9a2581f42c1e0dcb00c9d0db840b04b140b8dc9525c3bb73ee1be5d9ea49cd7d577576cefd0a220338cd7da482b1e5ccd934a52defa8c04a03a2cf2c677439e2059bdf0c04ca9792561f7708be81105b2c6de8cc0e4c9e7e5a92f5aafc70b0b1095abd63de7a23d64697d25cd79f781bd58496689890518912b9fe4708286643c4357804ea66fd3143da2127581bf961d650547e6e24e487e8a859bed18187098efb62e3ab9306b12f3382424d3ed7018b48fa5eb2cb08e9505370baac810c8c385ae14ec5fabaee0088c0b7fe0a77d711ce17e5e77f2fcd1d82a4a3d3bb19af63b3b010e8b3322c861764e8480abb8901ab5ed82cbd35c78a3b13541d9872603d375d891e724686be08462466636ccb0a0f5ebf044ccd8193eb222a3f645795566cac58aa8871c94ed46a711449384dbd29ce6433da465af9d913d68ba9a88d488d498595110b0847c4d841c0982d85b74d852307d4bdb8d61148e40b5565ccb8657a395c36cc1bda682ab3b1876f067dad9c0e102a9d292ea6e774113633584593534716f7da0662d15b7a8fcca8af71fc7f2edf75847d83a09a9a5eadeb7e788ec594f89523592a6349b320550d6e556e91421acbacb6c622b0b98e55bab68a61a0c782c4ec3806022d4d532ba12656d511880755dba6a34cf93154da6b757e024576a434b78e0ca0e980430aa2ecef100a4b5b8c071e1830ea72c348c15b95dd7b53d0ff66e801f98834d756abaab4128581130aacf0f257f5eaee62a92d7bf8543cc8e721b1b0c678e08307336d04e18c0863365c624276ff930ac0aa3a689a9971847b0448368842c5a97a504240b43bc79320160194259543e91abe267b70bda8a6d1dd6881d5837c3b3f42f89b4b4860b314919a05bf12d070ec0042e5e2728f635c32ff031bace5aa0bab6920860a867cfd0a9c41b96960c3aafc70cb8692ee83ae5ce68bb405de4979240e3c5896f031ecd594d0c02b8b9b5529d7a214cf209690ed7e180dffd842ff237a8d8a7b47d03a9e8a5dd104027cfcc31648084a8225d4d9b0d5b81f4921fe1abdc3efbe4f7670f9b5c7b44a896327765c55bdda7c04c0c67c24f6b15830b480399908a9f339288b6f12b04e679522b762fd6ae2fc0128bfb36613baf6d082029418378b016bc11c30a03af9b5e347202cae7fb61507e3acdb97614e9e598c16f444625e036694069a533aeec4c31ee434f0952d803147c3b68bff504b0cfa5bcdf77b0b8b184e74eab949236c38f61e6d5798abaa6122ddc5e3b058f0126fd1ba723b2105fb74d994557aa6101b1cfff42f5b3cae99bb6631e9da877a79bfb57240fddb481ba29e750b244087feecf2727ed128723e771712c6615a7489420463574830114f61df7b3cf7b824dcf5dc604ab32dba66109b6037a1b91b8e4ee276607efb653dabf8a58e1f20e12bafa559701b5a10678ea1c2ea8d18b5cd544194092a541c43843b01ad80a34fb6b553a0c011d91b143a9f2024202c7cb9549c06891ea804a521ea57c3f45e1f80f144a3190fe329728460f86cabcd04b3c0a303fe924557a1b6ab33fb7ab1e15de5b374cd7859507ce516681d2a08408eb45d9a20292d883d4fa6cdaffd53f99d7a0b47c32d93bacf181a10ea8b5500ba37d9eed4a7d4a3a2a89087498536f79e1f0aec7cd4d13542cc8baaf5d19853e94ef0b973fbb60f9d5f94b8d4a22993ccea22fd4ac7a4256ca19f60ffd149a9cb96d24b3e8ff5183a2c6b40a7abc14b568fda34a04a68ad5e906c40597394a263129943211df877446d6276a99294d45aece254e2fe9c98aff3c38a42faf2654ea47e4ab2e56823e8a6653eaa3c9f07e7c8ac65e77e442ace5acecd335eb470ccc9163e62a35e1e7c9b630be7db240a13218edb4ca7560e6cc6a4156499182052db31f4e6168117389c4925fada91d1e9a87518a7a9f21e1e2d27c934187b53614e477eabb8e1ebaeb204d2330c44a2c5652f4238a91054e931641376739467a0a4697aeee44070564de48695e5ba63a6d7fc328b4a7f6bdaffe1a75451ddab72967b854619227e2b7318a7885184bbf18b0e8007440b1a5751ac352341c428a373ce1bc19f59e8692b4775ab1589153b33dcee3a9f72eb951d59d806a729cfafab2fa3092ef0f1afd803890c7b71173b9a5ae2aded56443f7af1c920bf0282cffb619313e7018482ac8cb5d041d396c8fc5e0972ec8f16cf824e575eba3913a043c368c3589bab336b66a879f3119450065c4c7bf14547bf710ff901e0732cfdc35aa8d3895ee5512b70a3e47d67f7f70482c7929178f7d28b26d9bd2b81b78edbc8c9aeab4535a9cb8d7d80036915eacc2c30658e17e977f9552d4776b29919f9dae8390296a1906999647aba8bd05f0d16222cc69f960cc3a842741e39be5bce17b580eaccb8b6d36df95ded223f0813e7a27a085268f43ba903f42b100d79e8187b5bfca3654294e0cae2739d6278460834b58a21c863b42f8606ba66e1bc88fa102e56cc872650d0ce35a28150cf911cda99b3315328581366d30f4bc5f41621bda2d2d96cc4f8fe888a3daa35dfb24acb168353245ccadd7c02e80618fe1b710d788de60eda2d25e4856ad1cf73c898516df05fe50be81563d06e4521f3cb4bfd3aeb62ade0539f62fcbea21e00107f2571b4dc206539da3d3f59c5bdac6ff84bd4f697cedac0296bc14d27b24d51b6d1ec3a20436cd0daad13915dd84a9033b17155d055e398c27e79c3f1227fe4f8ac07aec976b2a86e778557b8db579f05e6d17a4cd9d7f20e295630520f40a750c823a67714aebfe05445274173a83d053be484bee06a9a62778ba9e420d640a3751f18cc2ef2b8644380d834a21dd3a38a1653fae9953bca4ad99602ef0bdcac021cee334297abb42517e31938ffda68a7183f8d6d60b89c2205b1d1eeef8084e2ac292241726b3fa24b9dfc2e856fd4ebb43b6fc4f6c515a2ed6deba619d10f09bfe5c9ccc0fc284bdff20df1d6aa31fee2d36178f3850ea916968a8158721dd706b2d72f579bdb27111b6e7bbe9cab9a312fa1d8586c82e9d806230904b2225ad97e7ecf62cc7de056f0b24662b3170db766b2770d6437ea81efd7519432ec3947f6c3712f3f6468a01ed50b725f147b658cbc9638a9388ab71120d5384a1a198219803ee2259520696d38a73efd6deb990a3cd5d9a6c455c3510ac303e15ef1702ac70744bc7b658ba2bf7f01e28a3087b6800c7899905b8e50ef2f86fa8eb89d15e4a38ff5b3a21aa1264e8fcb731cdacf8304482fd50570774d7c9c9c678252733d78a3d680d26ca3d927ac91dd5ba3ec72e79f62aa21ab0081dcb853f29dbb184322c9d2a50eaca96535288f7eab014636eef30d498806d7845e7b775daa3b5b7c861e71f3818fcdd568cf20009ba78a9e5cbe856e876da9a18cc0b0fdec57e82cd8af990dd3c361227b71db436e1c1be5f23b212fda6cb324e2675c36ea039ecd3804f8a51c8005d99ff74d66ba36acf35a22de7bf1b9ebaf1ce88668a5e67f996bd26856d2f9be5e28c8dcba3440924f82828b515343bce60f889ae7ee25c57b7ec6f117fec203a0971c86e641006fac84b6482c2438fc046ab39510bea2cf480793cf55d0edf74cebccff3b5eaa11b7be1891cce11410197e74e50f4d8f89b0a30899ef9dea779e1a2b635d083db5778569d10ff10a263a5eaa6f386619185ebd7e05170606cf9649be75cd1af00cd3408ce87ccecc81c59600a5b83830fd5eed4d66387280ea07e591d3c5d4192bb58f439a490018dceb38a1dc0149272418a7f49761cbc8705e6357931c7a7cce66c5dc83714090c1d416056bbc690b4b488468f54d3fe0674ee6b7755ae6d07673a643cecce41f180deeed54e7162fb6611c204747735bb89dc25c92798c8c902fc5583726d2e700a68cbd1f1a3a2dbaee35985c79eb5c4e43ce7bb3296f6e23cc4c9da6365dace6278ee608293a80767c0cef9aaab826b5cb06eaafdffcc43848a74a6daaac5656082a8250398670a2d440c44ce2e7968450d83b2b9436df4519556d608826076191f441657a42c6f775d067af8fece3f34b8834ad4f7f1038fce286ab706e5de946b43c08a300449104bb80a38f428c9eea2f31461406996ce8bdbe32adf5f61db4385bf5ed5f83f2f4cecd3a88200eb285f04fcad220dce231beb02351c16299cca3a0d7cadf45300b0fd7e1404854b17ed074b001c6f65a8b2fed9ed7bd020a76bf684f3a4e0d45b245e83c3d64b6309ddb6c5e223eaa328047cce7ae3bc29db063de57b2e6e01de967220b29bbad0b4b667efc8c2dfdbde204ed9119cdaee4f9d4efc8af2fec234089da4d750d6f5333c7f0fcd30b46a150b265f56039fc5855c18f98590ebc7aac4faa0ecf063a390ff7959c8bc246278c9d1caf1b6d25db924acd731fce52a320245d94e0e55e4de801335c23a598924f8f883cf8cb70f9f267659bd390bb4be3eba7b228aaadb504b76ef2cfa3832c1a87b4ed5b08fc433dea34688f4ac923692eedf6761ad908e168794ad8efe6688aa8ffd7ee9f17276664c0526015ba2d063d6a534a1b5b580b79be10884ac9eb7818d57f3f4fe54c070a1d44b697f9b933ca17ae51c8ccef76b825839424656795be577dde824684a71308f61b81d4dabb59f2d8590037a24e9f7fdd251207e041667ac086996b10e1fd351c1c07da74746b36429461de2df2bf17c49a93efbcd59bfd1785fa514dc2d318c4d6a1d4038f5397007cdec1e2802d4930f536b61cdd474cb3d295e91c6f51527a61a4736665b017f49a7a3774e34cadf8fa15ffdf148dbd53d1843db83914cb1bcc93c60b71b7e5a0ceea69dfb11a8e5f8b5f3ac1c4faba68db8b9ebaebeb51db669678f07ce3f123b626113ddf91c5d34dd57bba4fbc8baf12ed9c5b7c9b871c5cdded75666086cecc190f39447c86a1238dd300ddb71a6bce38cbed525d5ab3182d06492c06131befccb4d189077e2536103e68cf8e76ac3d7ab8636f93832af4f6518681ed0bb9264f39b8e05d926683d8b3c068e3ae0157684e8f3b2a95c09ef1cad8e2e32f296b78cf4fd07acb7e9dc5ad7a4f618a5ce0303013003ae6e3802be24bc6fd83a1643924294a96f5efec4bb7f7810e96ea627a52571a6e8804156d464cd21e066a6002719c0d0690bc56be4621d676682c61d1557effbe9e7ebe6a86ef22371a9a37cb5b03a8b0a3ea47deb8495b56eff85df32fdcf44d56da2cc00bb2d1bf9539fea0e82c58584740e3d5673b578968a9e09c2642721c3c9c24f50354173fc6cd7d731c1b8c8c0d49295133f93caa1b0c9e06f1382a2d185220a0bdcbc5cb6516d15ca56a504f17347525df9e884bef05e81c67cc6c86fa362cb321431313d2b9b4c2b924ab247e44f83231bafad5882feaa0f1fcec50f09599c84c9b582383ce87be488dc1f44499d9b037e61fb6c376003a19e9e6fe524d17f7eaf5c57c01e3ddfaab55bd539dbc0e6a7d4a821a975c0f5c75bee8b0e5dfecb7830a9d86f0daee9350c70286dad04b4b6842b127932ad55a58fd8b7be53068f6f7e7480fddba52f686f6d21997173dbb25654949fc5dd47779851fd36cda13eff1f3476d28f8c27b0199091eac0bdcf67fef67aa7aa8f21e0b670bd7eff8a80c2ca0f844b4870a171115be68d72aa97ffbe14ae051da6f6750e7cae2a3951143ffafd9072ec8ac4060c1652d2342bd628ce3eac64772c2618142a16315e4a71980bf8987f35f1424c4ccb8065da48a47d3457e4236f76b3a6404e591631ab1d6a21af4407587996a40cb4dd336dff867a71b8382af844c954c62555d890af1ea25a189f51760f653371f3d16cf29f76b8df40992069ae8e0a83de21636c6964f2291117867abae66dcfb9129896bb2d26d9e7af82da5cf3086b86571d50ad376278822f8bf44ad8986814e0673fd82dd78b2cfb50da1641500496768b439e81736943a750a5ab29543b2979358f745860cd9d01208b380ad800c55b9e2b4f3a72b4ecb7fc44fd299257cbd848a26a036a84ff3bcfcfa3800f920c22b7d00abbc3aa6fdbad09546e50166386464bf30e1ebe7e5a83cc67f8ee16e01777849f40b0b526047ecbeb6edb200ab14f277fb83f26d096216ded6dac2cc1ec39fb869c9f340d51eac8404f939f9458b1be2fc37a8c2635b46062ea1175b0a82feaaf6d96b14f14cd7a821bbf67697dabc4bca5316e0802b88f50034559cba3707f02f4b1dfdfc19df9059780bb54f20a802cdf9e05f3570692bb9ccd681f88fc155e31b75debc0bb76ce07508c1f98830b4ae730851d7b851ec0d420d55bffdf7e2b5e4f469af1e358364d82dd2db215f96c1045d6c8386b209168a62c441f4b21c3845fe9a91fb5283b813742690460a1ef8f6aea01fa52116b7fd004bed1366a95d697b5c90d24849e6a4e81ec9e2cd6a3f3eaa2dcf964df8ce809d0e217d29e5a989ad5da1a77cf0b02ab3c2252cd3ee6e5cedf6eb1e7dd8b9a635a0cd7433f28f89bb965929109448914ecc1a87ba6742fc088f833bd92f4a90e5344c4ffe31daabc91b42b013df96a559508c5916bdfb8444093413600299d89d072fd7d3e9ea0b4f61d03f3f02aec633fcec7fd4518d08a710d6931a409a168cdc54b88fc02365c75cdba96e83c256c8648121b99489871a440f3a53a8c1e839f3c6735eda9b08a9ec78f3de2bad9bff45b744888cc24b187370ea12e1261738583f2ebf8428cc44dc7f6832360ddd81da3fab24399bbf522242ee034c5a42215616e256342541b31640447de487b81d12261e65839a1aac25218b5c0a6fb5090ba7da5d144fc5807534b5ba0c9572f9ab0e5ec87bf1d79bbb2228d40edec3ce03e02ab3b286888fc3ec35c3a819d9b701c36a47c08015cf350adde108e903a276bcbe78135bfa62f209d0519f10c5778742eb689ed055e73adfcedd2b83ebc40c995d419d88fa667869d2956b4d3172e6fa5cf1aaf3fabb1040ab7406c9fcd084d1c9070de4bfe5adf10e8f7d86f70192dba761979d355f4950deecd794c6194d82a7e6121003f0301767635f32e942c4bcc2208a55dcc5689b61dd367fa6ad9d559c8150d281f13f9e243743bb1b20e466a1e67b165cecb2fdeb576dbb79a7e8c1bc443c47f66684f5631d89988c9c475dab6532c345d3054e0e8e74bc9896b989ed12f2da2ac472a412ea31b40303ee63eb58fc808e518c784ffba5b1280d44a94df9bd7937a1651ffaf3c0a3db9fa6c56630b9e6f02960d59eb372bc39c62d36c86ba4bd239fcdae182675b305a4fb5d832d252c6ef2d200347dac04b47d2c1aae1010a0bc10afa6efd0d26cef9a9f39cc088873b9418109393af43bafffc36e49d82a3929532da04ab1aceb53b1ff882560d88cf6daaddf961abbf49f1a6ab84347ddd459cce43a1e6a76532a9ac18811f70d40020e000f611e75bd8637aa48ec5e4afabe8026cb46a04ad204efdee2e4a98bc09c895c67d1bd376348447da2f4abb7971853fa9c631b5dbef922403d0c6ce053e2ae19cdd41fe8592397cfdaf5f24016ae71f28e8f1ccabe2dba76a84a554413c0eaa0103db832d626dc98c9cfd41d4a7ae6f004c4b80edaf720fb95222becc8da1acafa23ec2baad49acd23e704ecf2b9214c53ae15e61efd99a34c533261b706193f18349a46b868b3940fcf90acec5c3db5db29213000b9178ed9b8d5151955a4f7daeef49b45e90b2f1c9f99a2e17df2320fca2964295d3cad5010e8190b6b6579bb75cefd3ba4150b37576fe954eddf46855dc6f47f1e5149428913f3467fe18a37131922f456a07a369e90392b4e717c1a9085dcce9e5c15f1d5c82cc4ca96d122ab2016bb52b282ae8c7a5372bbcf2e928d7f3607af2c1f0ec7dc793033fc82e0fad1c60ce2d542ba9e10558d90051386df12cf8b9618d1303c334f07e3b05fff9c4ec11c84f861c2ab2eb393b9e8b66490ecb2406884ad3516ff5991ba195421784c9b09f8f514716774722e8c0dbad3d842045c2cabb2ac39d75a077bd20005e56d30b7598cac0653a1b4ecf9f7cbbeb8e4a8a81d6ca029332ea03801ac286580c1d4c15c7c55340c6709d34d92b3fd25cc924bdbbb4b3c88979ace216e11a779b63dd4bbbcec7e16554f7822b0a8b6f11069a60936222562914c395238b8a598af8785fd728ba9a1229d0f688f1ae0d8884336056ef8fde7ffbac14ba461c9adba99fc3e4523667a5006cc91908f2a3a925ce3ae7045532119b62146e5f6ce88959bc6361876377dfb55349844ddeeb3580db16028b34f7a672b5eab7ffe02eeea90dd1acf835abac8ae7221e01aa495c3600cc458ecd65937c52f0cf8a57d7ad8e3cc8669452af2eed9dd40c7007fda69d8d662fa4c92e93b417eec7365f29f8127100fdbb233c0f0235f4766cd79c1fb32ee355b3ba5e47aa69ef7635edd9cd61ef593e4af2a3c12f789be72aadbec560199064539c1ac204e50a81ed8e9103449675630ce75291577516b5bda6a86ef66c25d874741248b8d2c68abdd976758a694675ac6e9563438054c1dd12c52a046eff194d66a6812ee528fe49fe935f009480565d4fe1e7a51b882ef983900dabebf7d3b32dd09400c2d1d68aa4bd7999b0fd27ae5f1dae818e349161c545671dc056449f3842e8e58ebde5ddc740a0548a557433d0085465dcacf982d50f5c11265ffaf31c2f65c11ccda58a3806edcc7b4ffe368b665737235cd93f14072c2e9866eb296c1ab524a9f0704ac04eaa6be024c84f340443872a95e80001a9cb1b7bcf29edb9cd8f4a758ab7f60bdf67a992761bd15fb83b3e9a0082591d2c177c559ef75857c0ce69a611be83e10b29353da3ae75db4ca25b5e832b9486938da27d6ebb100f4673eab6e187d3add2f48926d7340d4cbeb5627b4fb54fe52bc8ff96cac845c56ac6cb222bda6654772fb9c7aff9817f43f9f7b138004b075d2212480ca4df28dd3b60d3f603efb861e014affdb8604bdea9ab1a66a77b260fb333fae5b3f527c924dc5e6bd6ebb974da5e4d0c6273adc5a304b621f7b6c0a2ef68c4de750b1da3e37cfd96c3ce5032cb1e1766c9256657066b139369aa0c6168172514ab40d896c3aea18efa229e104094c673fecc279a01bc8747615300d2927c0117722a4eb270eba5269d1a8144a188ceeba49f6bef0afabfd0d75978870ba2627a68c4e5b2730f0e6902fb919d4fd3c19cdeae1a71f81106ed19d045880d3e527a4a874843a195e83a6b2d784b4cd09303b445761fa996fa5c8c024ef00c9c76d928b017ec518c9b1cf61e4d511817091e828b6901c8379eea99f92d77fd9041f096fb168f4df37fb2b5f44b586cab2ee227af6bbd438c028330a385c7fa838534e0e1041ffe6f9de4da2ec7c08cf68f05612b2259b4cc0ba65c6ec6b13e1329d690d1d87d2805cadd3373d428addd1303dc5d2f5dc136c99e5325d6e0d8d436900aed62d7d89deb1ab0816876f20cef7adcae9665bacf494d3c27c534943c70541cdd560d62a168796fa0725c2981a0aa0190cd6ac737a91be75699b087e933b29fe8fc8654c29e9c3a6914b0a44ebbae74452fe3e42f9ae4bf9d1eaf56e223ec51f0f8ab255973c64810cbc79276ba949d5301242e65ccbbefe9be98963d6c44b55cec3a5db25a1fde84cb36e00f0f90aebe861a968677420fc35f409b9dd51e8b6b01fe894d0de56f53792fc374a95e7d3001a6af8851bcc3f6be7f4790112923b579ee24c191621ebf01a58e8ab8563339ef96c37056986e999a56589a68b46a04b27c46c61cafbc73a0d873c3f81c0fd15351a98d2e8e294deb49cde100cfafb5aa8c648acbe1644bd367490e1d677ddf85a47721e81ab31d9bb5be6dec37cb26a1a5fbb13a09d46f01879f7a24fce5d06206d74b3b9edfd584e2b34424799620dce64f47512125ea1e84b7885b7b38a88d3cd39d7a9e8925429590eb6b9a45c6850a38742f0f4edb5607041396a110e8c35d64f02963f7bb5fe9407c719ba03607cef42573390be073019853b15565f46da773224a20a1f3e86fb3a532be3a4f8bd3a43ae06dcc8e031d685701d523a77c9867193d2ff1693091feacccdee74ba447064b3844c910ba9b68d35bcc9ff945630d07057165e883998ff357fe287b2999b71901567f6baed1431406f011133a0d96b5827fb39bcbb35dafa77ae2a33eadf6d81d3550f655710aa24013b824007bdcad5fee88ef04f7b38e5196c9b451dde5d5b5825e5a284d1c2792f805a54a19aea081dabaf962eb8815feb1b9a940d3b15987bd48e93c6632ea521c554c7e52643b6ba43af5720099981d4738e0380eabe6e6f5edcad60275ec60c345ab319564ba59789c07938522acdcb7de8fe812b1d1bd3a3e5da153563e7bb4f69d938324498732dffdb8e2f7a7cdefeb0d60c6db25004bd61af37ae4b5dbd20f0421754e73113d9a31b61fcd73ddf10fafcd1bda0e8c7698f9ac6e650350b0e6b2e372aea89b48d212efd6264ea1ac2787f0d4b7cd32fd978816b32608fd5d7f1bee01183cac475cc56c0ba03aeea0815548dea16fbd914d198a0ffdd028140e20a1cbe056cee6fa7aabe996fe82e233adfbdd000caeab39ee1daa0175f91653ee3d0a7b341b82db368efe54f104ce8a4fe69e91187c8286bf88e3b3c5be2ddcd641f0033b50ef1c29e98fba0ca306e5000e50dd67163f8519f8c25c48992779d3986929182b178dded5f6d0d2254caf6dac6700d2c64488e0207e47c05d70f973fa074c17e589aaa80e362c280ad79bdce63a84b92c230e56a2dc654b54bcf839e66859056fad85c220875e40760ec71be179053e6487481cdae9c5e755bbcf114b6569011a225c5837693023155e7b6b38fdc74814f54be0a0dcdb4648c4b4f633aa70f27d6adebf2d6fbc5a7fd08cecccf05a3690f05740194d476fbf664b6145b440dc3b23dde54f2e0285e930ae3ec2c9684c22e7b77b6378d04d4762e577becc27f90dd3bbed53ff8898c4a1cbf028633e695c906fdb91afcacf8be882e2567058c553c328c340728b93a419b2cfb5e7e6b24c91b555401aa8db26d1556c24600632153a6b9c8ef245a799db4daf17c5c90aa984b84c1230dba05852968568307aa3c7324f935fbaa0732959de83a8a73f50ff97d851a0e23f134cdc9a82002eed30b944ff920eba994e980124e9ac854e9119c3454a90a2b9e8490bafc5725dfafd1ee8c29b821b53fd57ea65fa17cff67341f2553a30471e88c4c062c222ed0b74b2df6ea9a5f4600a50521f98ded7f0f33f3b76edcafa4a58c55ed1abbafe4c40d8c579c3751814d0e9a2a0a444e79fe45932802e1f0e06ce81f09a660c3fd45276c7cb8458499ffe7338ff12363e9764259791ccc4f8a854898c7c38a7339afebd753ff9399559f5f1bdbdd1c8f26d0f895ffb5f78a1ddf32f9de8bec1be2217f2ffdcecdb957851bcd13363a49bec8ebeea18c05ab306a7437d57f89038a37f32151aa18fe4d2a1d23f32649cb9118b118c2edc719d05cab36d053f073ab2946187d90e5ca1524d434aaad5451995c658f9fdb39870e5906044068545547211fbca9c3f646a1af39e8ec3542fbe730c2240d7fad10cb9d80bdcd2bb240014d00179e3b310646d06f001b120ec8c05646b16cce2a9e5d6913b84c61fc0d6ff6a114abe003bcb7f9a60aa9dfabb7f47ec30fa95ace0133f4b4bac11c7b391c054b63e6d0ebf0d302f2f8b08fe4d49b15207cf092293d03dfc622d28a53b424ceb4bcd188665ccd9246c290e1655f2a4fead6991854cf2862c5e76f0c1a887cc88e77cc33592c91f25b7a74ec5e9092d523e1ecccc4339403bbc794b58f3f6332d04ebddf38259da8731d1bdb8a8a49fe8423bab39879f49e1c02deaaca48397714f7f9aa69da1bab9b6400093c646998d8e6eda8da85c16c0ca2480c801ba82ccf5065395bf06e093f9cfec96358cbc084fa528a2ac15e549db469e97086bf69a0a27a171d5ef0c7ccdd024dd4eb42183c9b01043661dad61b57b9081c675a273156b6b8cfe219292899ad322f4dbd288bab925df733f35f09968ef1260d18e84844b62fb64d2adc097b8f01a81738b453e6b87195032b112beef13a017ed8be53891a48fba8538910acd64d56e6fe073d523885a5f992a17789ca61ade8bc95883993c679b5c9bd63cc13291ffe9ad1541fa934fdfa4f1351aa39613f289663f709deecdd797a329163dc7e102842acfc22877276060bca275261a99a196ee8dc568983823adf6eef1d60472df124b9e31867fed5a4abaed6a85cebb6d49a00f98ae44fbe20b53c7336c94c9d4f87de1d243c00266186acca139faf5b9deba541d9020132da0d804a791cd35e81e45f5e7e3dd00fcb515cc7381679a41c580894c0743affb31d3a4cb6f62081c664647ff356c99c9f26d6cf2e47f349821739a223af320c3201a2d9b2a24f5bc978e3d8453fa1316b2645f14f4a0f09d2770d59e412c82759301dea8cfa32ce44579e73ff49536dd6446746b2662133ad723ab2ae167012e04f072786952f2cf89bad0ffa06ab15e074f3e5e88084f338efe5eb8db15bb725a169f83547e386131c5242741f3881149b59cd0c487c9209fe87fd9497dbf5fa6a75bdd1631d72f24f0c6850171834035268fcf7a4209e17eb2cd823b7683300387a86f8783e4e15d3ef63a24689bad48f98226fa8de723ec6a908cc627b7dbea5b68fe299d5ef2fd2e7906821d49a9faa36587cdb793005227f67abd4936857437869bc6c3f493dcf4faa747a44a06061edda3b5f155debafefb16e6f7ef189a54198921e55656db6a152aa3c60a117ed3fdd5d6528a446fbcb5d399b426965fb0cb3738f6ea2405a1cf1ca52a26d7a7bae5515cc7375eaad68ea263a844f4560c9f6db0ae4ddcf3d95552b5543f1e4a9d4bb21c994596627fdc222c9779dee020f322216f664938c327a1c2702011de1e9260b9bd034156b7df2de087d9414b965a35133bfe667058fed01446d1df94fb434be40f8e5c884044248fbc2a8dfbff56a0a93e5ebcd242fd5b6fe178d55533c689e6e5442f3e4260dccaba68af192df61cc1c1b6a5216d48da698f729c804e688344179e50e38f16b474066887ab4cc027e3fd406dd4e0219478e78b6233c3b417fc458d070ab023c926a21322f815f9b546818a1b451585172a28ae34e382d3a4593dc1d59342640f127eda3e7bf25cc86d9d74639b1ee0f5c4dbfc7bff51b9edf7bbd91be43808fd16be8c3a811aeaa3608964f3512e794f6ba5c47c2a09317c8e12caf0c3f214cb410676391061b2f52407e07aa2ea362e444b7b2c8c665feb4bda330beabd8d8ca4a6110c6d93067737835c752ae4cf45bc6c2a41ca61cf9c43a0b344c432647ca63fd32ac7d9fc490c47e35abb8a84d3e8dd875c860d4a5c86b355f31f4b647c00a94d9ee0316948590c63d490b826148af26b35fbb3d6a56a6d87fdd4e7d30064d5b8da9fa8c75819b6c7211e786266864f86f88a8b9e72b8fb2400d1bc57508137ab4d6d6c922d2d8224999ca7d1c92cc550aedb54e182ccc9afd9dbb9ed572f032c9a6768b4ffb8f4b4c03f33bff89de90e5257a05317c0c1250849c2eec208fbf2f1180c3e1e6a7f0f407e7769ebca1bc585804e70161f5552d753150b2d621734ebb8952e85b5c230c3b601f6909807d268dd9c2a3346fbbf646b0576e090282b551c0e30dcdd7d0635278772da2abf2a522859a1fc9cd2f80a25340ab2023f4996720a78fd092a3512678e41aef9920abcfcc3fabb9ae4dc60437cc26792e7cbb78b3159594e0e4a1c26bbc7a48293aba1c46b3eada411f565a430c7a10c30e1ba5924a3a8b8bd8862af8664bdfdc571eab5dd4b21beb97162c437eb5bb0cb4b5cbb73d9bddb3ef971dc07173fb7235ce381c98d60584c40239932153e0f007367fba9ed3e1263d75ac3d59c11cc79f4aa14cbaaaf9cf3bf31abb313a89f8a0fb189785154b74c8b8fe9b08c19b861ce2aa1ed701f4af3f701d49c1070600c80e25d644cb9129246ea665816836f5d0a6479faad95b29567d398e8c7e8f4a9bf2f57bb93d1d5a53feeee7f6a4151f520e358624179e76c2ec00931198dcca9b4834b610dcfd50926e445324787d556332f7372a6a1a40ff34e417477f9a52c0b555c2a3183a22dfcba6c6a8d903c0866830f36fdbe6b135316cc43b1f219356f150341e23162e423c543ac1b36a975a8cbd58a1406f63372a33615ff05c191a20be8c20dfbf23f468f614ee1e8e3a7de604ceb0219ac8277c089c630d15472fd4f502523b8c3d6ec92ef50fe3c1ff4409c37b9032878c424a8352513b4ddf472d1768bb2832d039de456ef7a118bc841ff49a9cd5de7faab31b1f363a2f3454e016065146553d083aa6fb1955e015fad2e468839be4fc73c4ae7722d357fa409602a24eafa605aa9036a5eab25fc7de79d4636f4c3f67477590e7883436ff753a055e80fd6db4acca45b77b661991a3bd403b8022a2a247085474d8fe484b48a1586baf85d60029c6960c82574683e82af0903f7a16a0a27684180403e049ffb232747d03bc9742458c9699acfaf3ab15ac3629d097958195f847a7d15bc4af3233d5957e090a4808819865fda9929a2976253028cb96e6392a2c8d008916872229c618233a2028ef2d3b0efd4cf3601a10e26897b376708f438b8d1d00fada4feec098a90a90b2520b06564d05489231d06104cd8e906a1246d483d2f7ee79723b451dd32bb97eb100a0034d39880969c8ba9a4c1ab06b59f101081268815d573fcaf204b968ce8238888afc6db63146cd85fa1edbed3b3d46e711bbb72c9e50f42d67e6f863d948a07630821df176888f389414b6f1e231ec33d4a1e1a75f9c13fdc1e8399faea14208d85cc1ff1174b2be0f837f7030b11cd0f43ca11248480cfd9500298c9f3ed78ab51f5178475f3dd769a8a3b8c5ca314303e16680100a150c316a0907f454d232bf88d36b00ea0797aec498375a28dcb74867b5b6c0bfc519ed0d3750e5073a332424f93247c77ca43de779de73ce8980b87a80682453a6c86c163e63a019ac93618189b4f3594054de523cd1415f3c2a33aba2a0172c2acfe7e37f33f47dd44d642608326779088450cefd1a78f7e4021b94929e299f31615210fd35fbaadf0c51dd54c41b166d4de2dd37f90a95bf114b15c7be1b0e46ef5081d76b63ad953a22053150950e5b618ddfd941d73007a1d14307280191bc714104f61794c52d6520870420a619335f29203ffca329af4b9a1b6c8987591d2a376b0b77975be9c3db0691fc0fe52f9067dffe5094883ae5587286fb2e0edeb2fac62e14de749248066cc7c524f3c2e4163a39099002bd586c322d1a7c4ed19205d6d90285a925bf7ded076bf72dbee812ea6da01127630e31162f27f0c644501ad8a4b326bb45f9b42146f25f5bfa82f7c16bb000d5d86efe0ca523e26d4ca80e897058ec04987d628ae2f62b11d3ff0c59b3d36e82a150594a9534f651187fb804726c73898b68b24fd908f75a3c1f34f06d5d87f8737c24d604288625b9c132783ba3420949689e09b4fdd8adff17a925872910a1c2228ca1f7f7a58a91054c59e5a3ee66e8b8080395355397ed3300fd28e02ff439ed031528e276a271d882e75a2174fcca7784f799b41b09e2c67c04d5b28e28196efcb0783df0271b7637c8b96eec92e8f5764b6d59f0800359e59d3ffcdc6e6bbf529dcbc396944c94e6b89945011e3424d10eabcadabf2aa730c73ae6588641664ced272ff5eab52a411728dbd7e328165a5ebbfda518344e22905b67943b17a3e412cfda228cb341a0848417fa1a9f87bc8ec100679d80315c8ac2c4a97a12b910fad7c85d7525bbce4fda4c8616342615480704509fbe0bc622345e6a00c4f481d05ec34a4cbee7a7fd6b3ea0df455d8c06f174b0ee65f5bff32898e3f8a40849e93ea4d6f8695c2e59757a9c15ba995c23efe35a7a1ac01ea4ccf67775fcff3ec2a3d6b5588f19526476ba8ac425189f71390720e6b4234f179029c2e9761259d638d501894e60668a2f309917b6772f0345920a2d15ba363468c20b1cb8c04e9b058044832339ffffbe93f44358789008b6fe09ae3f2e92bf515c459420965e791b75cd0d5991c064292143c74d343be58e0dd2c59b8e10b6c9348d33958169bc4b20300bf69757cac65d70c57b592d91e8ce0c20884b0de134041c8e4da034ee7e3fab7af62b0b727a0e1f3059374dc8de1f973a267a9a8822408fa141aa3abf9d764e72e7da75096c236b2ee1b76734802c658edff577ed4f12a8cd0c57f6dd5821397a729260cf11f23e89fa51a4b0c247935086abdf3845930d1a7b0a3579fd3aeb518985d0ab5f0fb9a594587a225a3cc6518a571103fef4890f0fa108af52aea47621d7fd9cd4231563e2aae5e02483a437a3b23fa54ecdcdb2567fdd84a0f496589861d0a53246155eccfa52174b95b3ba0e433c907e8328f37bb2565103d7de35eaee9b6bba439c67c57886ed98a456d0adf4229c934742e20f0969d14e192de1791db826185f305e61df23ac3f3a0ac543c6a7164b3dc0a68f92e560b5cb2caf4e14c2d745c97a7eaef8960f0edf10c68ac1df0beedf8e7a54d3df8e2f1fa950d091ae8f99797e6d131f1aba10c2b773221443dba51d79898fad2df9c0db992225e3f6af8293af9cd8d7c579be5a2c824f723c53b386191432b7c46008985054a8fcf9b9453be4fa8030a954ca5595dcda38b85242f6470b24ca9697b3629149a227534e978d3feb7bb88c711e28203fb94fa28faa201f507df51b8ac70e06cd6bc26c85e56d29214348ade72ec9f1e1e9b04ab7c0ae5220e2f9d1a521317b81b1fd5364004a5627bd00196c138a9c85994e2f70ba50b1afa5e9dd41918dd90622321e40a6f05d1f59a8309e0d9509ccb165562a79049a2422dda8db56544fc86db051997c018b073df647d18c5472fee5b156856603da56cc41c5df149e82e15626705c0f269b73c74a643bf391e30b4f513cdca383dced5daf64f79bcf2598af3da2a8e5ebfd3cbd617ea77c141b9c9b166dd9f1921e15787a883ac02c9e324455ac86176f65be8e67454b6965e66238c5725106e818312da83999649c47ae10fcc45d934bbbb85bb48a3fe14a18fa0c3dc63c0f8546b66d38e5358dfca308f2c78aaff4958304b6602c96702197ea59f2e7286ba40833ef233b99b8a9617b61110a41f9f2258033d24bf57b88433ced429b9e95e8b3cf3f00fd919cd6cb835af2ad1e3f39e3174c49e4f56d69376b376b14560501133ecae0302b72169e4257877acb1173ab3cbe60e5a0323a5ac8c9878a127302fef4ac923d2cd0639fde3fdd5c7cb5b4456607009c3fed3691636cd8917eead9599df30a1dc619868708ce911509919ef68004c01806d81ae1c55d05d712944c0cc62ac1edcf4bb22614664dc6b7d22e50e7824f09dab24ad29a704c04ef4a91f621738517c7f4aec3e977c354853b9cbb18f7e65a01a3631df5eddef1c7b9b06afcb6065bb189c4075de8b94025c3a635b256a2ea258f6a760a7c44009a7dfc51aeb0fedcd545c79f240aa911bc9624ce1b85e3df942bb8564bd575db48afed5ff7ba34885b4ee8d3bf4e6096ab05480b2b0b607271ffeb5813d0a5ebe7cf0aca6588525ba4909889c477a9490f59502500628e00cac22dd0cf5c952f59acc201cfb0916c4124c216b8686f55f9a2a7888cca5ea2f17791ce204ac2e81247d38ecbc4458d81a80644193a491854710f7a4419131cca3ea66d92af4a6c3d075bcea1b76bca15ef30ca0f614ae52979381278195bbc8e1ae8106ec9ad82f7e0f82e2e09a48754860eb54707b41c20485b6cd3f74ea6f9b91382a6278ae9698ea90eb0c540970ee11f856a46b8cf760256701e6219c016538521c412122f3f3d72db44c922a0dc5fdaa08f96c5dd8a42316bfb2d65c35e13831a8e3b61e38c6ded23955534431491ebd31993e2dadf2064735cf47c852eb937b65729e81ac6ce5abbb498df1d6fc2adc741bb6d32a8cb02a13c3fd3e8cd9417667268375eebf3b8a02d695903da527baf56d450226aef714e60a448beef7e4dd7ec1ea6ced02c5bab316854306b8444d178e71d631611a524946cbc75c19213aab0f605c860977ec9a2417ece00c47b69b14ecf7add1689cc527fd0c67ef1e5a888d79390d8829c28df3abc27b6f1df85f3e8364ad02cf4e20c3b57405187d8fc4054557b6507079e9f075fd4198a9ab04b92e56214eaf5af706159cea3b0c5eae0bb9fdcaab40311494c13792cacb51f4f4cd53cdc1e426c3f3d6ef8671991778ef808de73b640a51fb199f6a60f92baa04e325f97262f3cc3900cdc8213b11a3b64e459ba5428cd8269a1416732e93477b3f3ad86dbdda94237dcc4528c2164f1814c227ffad6c61deb34f15452e9bf4ceb063e69812a670286c47087c11d5ff6993a0b940211316f27d2178e06fee9bce1e689540d1d28d0c33e5a3f72e0e303ca0b15254c8b3df52188d75632c5635aedb9b7c09ca88bb9b41cec675c9d2f45606a39c40a4edd141d25cb91b6d2b0ebcb21b98a06fabb204d1060f390326dc8cac0a18471e3f0a58d4dbf8c4fa930a7bdb0972ec36d18f091bbcbe09e75d0b5167e04d728ac133a06dcda6454dc00e44124bcc98b875c3329bcccc193559a6896c8c1b7c220604e897fc32be6fe92e1010a5e887e985ea9534b30884f90c3b80186d49b55b240b22d4eeaa5c80f989d00780acb776fccd54cabdba263c080813fdefdea10066a6e071568ace914648e5f818935f5fc72b25ef746e36227d0df57f37b27a38e1d7a4a3945886a65c6fcfa59aa8100586869bfbb0aff62a9dded2c6d19e251fde98fcff9ceba70a448070bb3ceb79a2f1a0922b1c2f22fc357c8cb1711cb36307c706c0a49533af29bf05cf5cb4360b94fc60595b9f400c7f26f7a605dbc343547f3e52b75dc9d19961dd8bbb58db7046490884102b6c8de26e47d3f1b3a6cdc1fcf7317bfd878368077c7dff08296b28f4bb99ce14d29b4c358a3f77f9e0c8ca17a64f5ae1c2c3c646c0038b89fcf47c7709cded496ced8816f30e015fa56f82511a4a97dbd3d2086ff49d0380604f7121ce870bef98dd134a67619209892e2eb6d4fa3d60aeeb50e1367ca9f810e2fb34380ff8cc28f507993c5a0d5dede589e81c9a0930c61911429c9dd99127c725e93dc9a693b1df387af181ab927a7600b7d172570b4c2047241549ebc23fb3f662a2b9d799e61f4fd6d1af82fdc79958b0a04812d2a310185461e0eb32b9e400c191f2589d01fc6fb597c8652692121fc8fc0d8ca896b04a26a7e60fba616e3448ae7289cb7032977cb79f806e6adaeb9000282c71af2c6119e6ffe9118eef56779bf9405087b67cf2f09315f821ada15d18d4ef84a2fc847605019b6501cf253bd04814a4fc7098925a8bee7e9f779886a76b36eec8ca66bdf7b099147c0322ee507a3832535687a1bf19094e3a689ca218d35ad69b9017fb438389d9eb37466602f36d8493a6ef629af9dc3047ac182064182011c7701129e52b83e3bc0baffe66f0c91438cebf74324878bcc044fc62d30b2ebffd3c3269c918d5d823cb8738413280ec02ebf11d3e89c32b463136adfb9085a25655ed21606d9e94fa579c855f1fcd9627f3049b6011f541fdf48036cd4040a2ca50ff9cd784dbd158819d7a1f8763f74932596835bf6c4b9306e8635703807f91b356c0d9f488e8c6956340390b66a2fbd49c18d02cd30dc19dc72689d89ab04294044369732478744f21550f3e7bb595f73e84e6386f03ad4f36ba7025c090565c69f47b1d0048d057a947b8d6a7821e9831e516c3d0f617a00e770dbe6dfcca8c1e5c2506c9c807936dae25e95d067ad1237a0c800ee6ce539c61ce41c3d77f592a367691ad74466a393cc7d720931d492570b148679c8c4643ea5000d60022ecb35dfe13dfacc82e7ed26073a69ed9f5c4504750522a0956d8871c679282f40d53c87ca231176e6cb3f16ca0f8e15703f69905ae71b6a86144333a8c2c0b3d81e460ffe03ffaeb7b389f556d57836999e562081434c3125f105e97612b2cde7813768be2763a76632aaaa9ef9885e72a9855e2fdc101a0ba18d00573283bd95fcf152dcd3ff2a157c57bb292f097c7f24547697ffd81fbc0207f07841953bf3c72c024d6d17b43f8d52b58433325d41e628c7a4222ab4e7a3e6c282a39692c3034cac274cf6025a013e6a5e30ccba9a0e851a92145a328fb222d12071c03e2b20318b1151dea729d1a3e1b25b81767871f0f441426607c7eb2388f0ceef57510c33bf0eb32ee67708171b0a3ab99f1f6cae2085d1c7bad785e75b8b6e2224a4edbdf7965b4a29a54c01c50677068006535c80addd2fad75f2997da74b55469fd0bc608b2e0f207d7022b9931389c60694f6f79f56a6150c52a034c80d970f4e249ad33d9df9d6bc6dcbdb73ac7625fa46a0b2caf097c9641a49ed72d6a6159a33add0e400a1e70391ab0e9eb6b99bb8dd706ea4506503597a9edcb258a49d43a83fb4a9a5b3032ecb34777a7e80967964815e1883cff27bc661e7b1406946d5aa032bca4fba6899f3d49fa5f82cbf8d2bb46d26cda4fcd9e6a239b69d217034c706bb4273728ec1894e2f4f95b44da81983f3d09d1fa8eadccf24d8366f2f55f1835bbbe4ac614a7941dbf4ce47546788fdeff3d190fb605975549ff38359e480c8f61e4f3bb4e9d8a53e7c1eaa17eb0b497d48e6afaa0fc9095565f9e990cff2275559fe184d8d31fae0df8e0709b4434b2fbf3852a72acb1f8e5e40780be8ddfda4746727ff474ea5bc71d016c81b043ab4bb0761eeee6f085efac5679982f159fe9979d032ff2481689973ce1609cce2c3e1b68d06468509417ea265b63385a1a188302b845dc220e994f40a4c6782d652e025b48a8b4785068dd0801641642edadbcea4050f4ba48023d022052b5a90806f1ad4a253c20a11098c144c50002673a1c32e1f5416f008ced30018203a26c0f4202ee96e3b1318241d60a8308119eaa8640d937972428bb643b3b1c301a757b6c20496ab8a314e56ad2aa098e827162d53a14445dba1d9d8999234454937b14114a72625385c132225a20da450e121ac820613bc27f096819c750eb50b382af3bc810b4e1ab6e4840d62b8315531c4c5911b18241b74a04805493698f20405135c17251bc08063428196251bc890149535ec6e67fab2b46dff38255a50a1c32aba1068d0890e49ab96f20f1a97a08988224d56b034b9e0dd9a8a86681af2a254104269971262124e6c41a77ec8421cd1025ec294c3129ab59d89290a13143c02a625494c48b6601ac225e8d40a3e2774cb09510a9d93c0f229c1848416308c4e6d674222043908bddace8404920785d6db99908832051219e8aa60422289f845e3ed4c4890a0e30b2e8b315974a1a45fdb6e67ca224a2923cdc8bc5c5ebc3c3d41b15694e24ef4b91efd2afa60ea51aa714a0c412f77f8c2ecd2929393979faaf35365953e8df63fcbf27f678746fbaf254b4afda05c0e48502e970b82120a021294cbe5a68ca05c0e48502e970b82120a021294cbe5680cad6deca5e942c7f9c1e172fce070b89f2b1efce4f8c1e170191694cb0109cae582a084828004e572396fe6cbe0899e468200d1ece4e5e91be7adc6840da1818df26f1c4c17f3485414982e8ecc26417eb674a93f573cf02d2800b23766a5d166370c6067756b7d3af872a552e2addd63dccd0aae449f4e83aa10283b3d5d1942e36e7e6eac3f312b0a8298ba80790205403f5bbad49f2b1efce4f8d9d2c59fb0b3de94657843e3c679fce6e646eb554b74852f2027efca101ae070389c0ea232fa3f76565ad0cc6f8031c09e948823397e70b81c3f381ceee78a073f397e70389ccc37e3c1721946478363b7c6d2202041b91c90a05c2e1704251404242897cbc9c8e572b02f330848502e07242897cb054109050109cae53c372d046c0069bc1c8cb841d595a26983aa1b1b5439111bd45d87f1bd5aeb69823a3373ac0c7d557759276b5b37b3b0b579f2589567539f8ba087a105456b6b58ed97724fe55977ab5a31eb65dc16aeccd6556dadaf0e77d85aaa8375b5b3d67b6fceb1b0d48d12d06a2feef20786624aa557ac96eb2533038331636560d0c854191a58ec6585aa4c47c55c3535362d1894eb00396cc9695aeb779c334c6b3d83af95b189c1baf85a7cad4c0c192b997f8932f4cb0865883e1d6c546158cdfc46cf67d4673b745e1d838820d444cfc7ae914c611729ce9811dedcd000690020141212028017800064a11256ca3a990030be9646001684308fc2d7d258806377bc74d892fd797af112993b1a1838b35a972cbe306617d0dbb90e50764b81966a15b2d1605c5043106829d4d4e26bf1ad01a359fd99a67784aa4cc8fe0b61a80b0505b342b4d09d079612f2192da245014ea794ba7b7d6dd7ae15b4e1b475db7b2feedcbdd6306777f728a595d26fde6aad416ab5402008864ed688a2980a271115139076f7d56ac562b15a2e777f596b31d04ead95666bb5b56e9919188c5a2ba5343434b158aca6a6c6c6c666c698f7e25b6b9541c672ccf92e770fdf4691b3a8c5f9a39e6ae55d77cffb9eea8dee795e8bbae64b26749af36d0b83d2cc18ad993634c694417f8e949c33ea4de8348706000250ca040080009432015810805226000b704aa739ee0e0327362343c37185196776c14e0d1a6d00f7ded90535680320c0bd37460dfbb0997cef1d67843e6346660e450561a256a01d1a8e2bccb40150026010daeeb6b4625a6ddcc8a94c043ca95d7b41db7e8af6c7580773079935d6c1b66490b92bf943cbd0675868dbf7f88c041b0c854ddfd2a9645325288ab6187a8188221338f126b218651165850722a26af47bf8f019102de7c77cd05f447fde28a58fd402483f841c5705435b086462685bd75f6a18069cb44cb1e2040e2e28d5a60a4eb66822c414286851529baf614db4ac7be9fe66c075bc665da5438c095eaa72748821f2d2f7a4ad9e676249fb64dbf9d6755c0a2b4e2908b302102b80f2993daa4e6c4e323687d49ae5b10514314ed4d005182935bb0108a42812c56986255ccdfe1cb23f89ece754b11af8cc1a9961a127917d0ca2b4db9a2fab4e8d82bfdc1bc579eabe4f5f701da82afb46e1b0ef78c77dbf8ee00d1ab46de2f67dafb2993441a214f801a5b7fc3907f9d3fef17df7b9fbbeeb82fc097cb9a0e7eede8736fed448b47187d451a9b2d1db1fadd53035d617c7ef728009f8f6f74d2fb4b2fcfbb7ede5718ae40efa41fee4455909b874e36eafbbbb7b757b4710e6f7a0c9927c275de3018df9fb86d11c4ac6fce77612c7052d4c2858045a34b211850212aa61733e25611c883a4299a24830a24b984b4f0dd3e076a6305ae89abfe9f9c1910516e355312e6121850f4f2b38e962870d909045091e4e187282d34338718ad120022526b845c289e3c7831b062a0c164aa9ed4c61a0d85a627861117305524dc808b4870f44d58eea8fa03aa24bed8a25a80941726b47f447b0556a973c9aef3fc29c3ce0fb975c07377942d1928fe8524569d7d9a54ad2aeefaad9f569d7292903fe3b529bab0e3e007ef75903ea9ed42bd502fa8f32d4f7a048e3afbfe3bec53127614f02fdb6d221232324508c8cb61841b1932ed1b609355b6f9f12559d0fdfb2de4641aaa9350a085629954aada11e551b6606f9eddb5c29a6810e3edf3436a0347d0c52d029194224b926fed17d24b9b67afaa1f84868b5d4ab54fa59df58a5542a63b561d6b0acedb5069fd91b36143ef299fd9a543f50ad6cfbad91264dd64857e314e332fbdabe8a846d3f9564db178f6c5be4befd283b37fbb67287e484c2616b32c55f8c8c2ca0f142ca1623a32d509e40ed2bd3040e459e4a20aaf98b625c762f258a721e9c7d9f0e512333df1b2341db66942da44855c76b3a738916d5a071b66d462db1b02f55da9726edfbf3e62e93330a0151e8a831ddccd1f20b2da36a47b4d72aec6a6fb4353bba97d5d6dc70c845d1672ad1f2feed2e659919541e668d8b6546f9ecd61d7c767fce198567142defd3aca0efb4509e9105273c81b6df18631f9fe1d75587833933e0b2f17b968d3fb531fe1e18638ceb483bfc37368031b6e110e17f001e83f10d73ee689d7ebb2932c6760823230b966c1c8cb6186dc939832ee7999fffe53a3e2ecb9fb1d8ecfc005ae6cfd9da8ab3f3f7709ebaf34fc047ce19b423adcaf2d7d1e27041f3a03936da037ad01c1bce04688ecd45e0836698139d4337ff063b3daac8e389ee1e7fa9e78f0738ca9d7389336df689cfb20a3ecb2e9876a72c75890b2323a31bc6602a8cb684e9aae0b0bb2e29cc98da54c05dbb6e4ced8c801874605586e47a42c366ad7bfc610d54870acda14cbaeec11ce6f4a09f961d909123f8c33f72bbd0fe398fa7c61efce1ebc01f923aee8324adca4aca8496ddf750cf7b1a077cc0fb4a969e97bba775396b6d83512a0fe691369638b4ecbcef1e874673bc5a764feb66f745dbe698dd7565594ed2a6c7d01cdb0d35f2a017cab8d11a2812a5f2bb7b1ba5b2bbff1b9a43dfc38283546bad16ecfa341bf35db41c757923086d83d9cafd37557bfd0127cbed33c12d0b887fced0da6d5f044bca90bfa44094d227a1ee2fc5b556dbc3634694b61ff464bd5ca65bb4f127b1f1c4d11b754aa2371ac579561b3f95522b26435a628c332df143d1f28996759cb94ae93871e3ac4b95c9799c87cbcc203ffeeebf874e5cd5994f13a752e15fc165f8e90b94ca7753bbfee73aaa181803c9d807a9175fc74ac8fd941d6b47f490d57b6d88ea6bab51c8d10ead7f015ed324fe1d2a92225559142ae013d920699bf456ff036951183e0df8b6f03f324afdf0c3ff28135a8638e727d2067e1865a4b71a3ef65d6f340acdf96264a16d9309261bff7caa3af4e632fc394f26a2a039f8bdb12ed192cbac811fec7ad821cc15bdf90cbfd7269fe19f3337a1e613c61fde2211875b5296dbed76bbdd62476e8429badd6e59aadc69698a468cb6d19a24da46976246b521eddbf635b47428d5761ed587cf6418e9d5f62b34cbccc09e802584b96db3882ef9cc3e6de233fb4f603b15dfb1663faa5b6bcae6eeee5d98350cf4becff31e5cb5d5566babb5d61a7636777757595ddd571dee94b4aaa4ee2d77c1aab8de07baac10eb61ebfa9cb6bbdfe359b58ad6d69a0ac5943886b3c7c32ae935bc135bdc6ab940eb02288637ff37bab5d65a212a3187bd2e58eb42bad659a7ad76ce5a6bb52e5c7cb118aa520f53a5a618dacebe93f8bae0423a86eba33082002daeee7de0bdfed65b9ecf7b4b8fb5c530a5b74ab5a7eb88ef9e3b38bef6b591c0ae2f7a5aacc0aed7bb8097175fdc6ab9c04fc6fb7a70a58ced6f5353862eeb6c35b609ec9b59620e1d06d9b7fb9598a313615f2de6b03b67d15a0b523279359d67c20861c0a0b9b5eaeb19dccc1af6316c656331d1e77eec6bc2d4fb4d8dda6516b4d9e64ee635a806ac4a96259d314297cc0d4a68ffbabd890913174dd66a9b6dce511cc87605548000b42264e2022ec1a272e1c3d255a83993e6d39e73ce39676d625265b7ded29c9bdd7a96e8d362fd4af4615911ec1513fa55a28f5699b04228c390ec899caa226968db1089a6252508e369d99e925b135111faaa60685b237697851662df0ed0ec9aa4c8ae4f7356a520dba9ad9e33773540d826245bb625c0b62f43f4b15774988289091bc44071000817365c11e68b156240026fb89201cf79624c2e367d1bdc0bad1acbe5480736fd98e7a07092240b0d60a0a480410a8a405a01a9051e926aa00d50324d97996d7319d961d3a623271471f2a1309d2d8a6cc000db3e4cf4b1f9c852b1adfd1912e43ae79199af128ed8f45f59d0b294004549133825311f00c20927505614f14592da048f9a46b0e4aa3baef93f34c75da28fb525dc5afa0a952feb1c6a96e8534980da1489129468dd4402924aa70b9fb26d12db360d75b1eda7b4d658b4803347b4477cc144f3ce90fd8203dbbe7d50f4b1564c61e24282a32b460851d32b60b901ea87288e1c55b086ce8b6fdaf469fe990f6bd202e5669d43eddaaf6d0b739b3ef542c360bbc9c2a68f2dd31653ba2bfad4d9c5924ddfcea12b42d459b52ffdb0e953599123253f7c0113c5113d96343541e56684c2096af50a239af8acb5d6daa933a6c8a6ef339a2656520aa25fe6571dac73055cc76b3695adb587ea4a6bfd8e147254491ddd6752887fd7bd904aa48647ea4588be08f47bf8180352ea6119ae3ade18be37aa3e8ff9bde6efb10facadd57a0e33853951c80f2b8116e2070dc0b0f1fb9c81c418ff1d6bf80c7ffe18502a7f0ff5c818d0e7657208f8f93f32d7215e7b88d07f1f9c77d2940ce25371c7ac89e4041f2955a4fa9984b128f210528d3f3daa0cbf378aa053ae34a30b6d9b44369f4c6ae04cc6baffbe3ece998c75ef6532d6e5df017ef63219ebbe1f12ebbc9cf30f1141dce159f4e1ec61a22ac33fb4c4383bcf7d3bf44571e348db60616d8af69dafad4a4abacb33ab8ae7c667f4fd314ccf0c2a49a3c5da74e6e535e8fbe06dd52c22045dce87e433ad74d8db794c806f9bfa1e3a913aeb39e0a7480ee8b69fdae216470cb0d0b0bcbf91ba5cce93523da53b1447cf09b3869e2f69fae03a228cdb36919c67dcf435a54510b9ed1ff583fc69e70acefaddae1dd9f345c54948b47c9a83b669a0bd7b3f7fd7c1bcb1c7de9f1e5adad841e3b73d175f24fa13879444d25463596537bc860e8f8d99845482dfa64840f479d0eff9b1482b2b41e81a6a3f67188c5e1b3b687aabb5df398fe7504b9b9a8cd99ffb8e769cf91044adb49efa3ff5693bb5d6d7f561570ce837e29e5152368ced4c514a7b6eb0d608b8ccfe047cf42042cfefc1af312a922139644878e97bd9f31c6c451f7ac7494b3cd65ad0e1c728f9f52925717c66ed4f293097511abef8f3e9d3d80d627931d48147b141985f78f981490ae0af489676049c27a6bf6c5bfdb25d554cf1459212292c61e58a9a7d72858a1121929862c90b4222f4f051ff73eed75a754fb52124420f1fe01d73fe5e1cc1eff9c004881ddcaf245195d9a21ee3cec36017300154752600820e58a1c30a8eacd054b3cfa3ea68225270240215c2c880829afd9e1f9a5a14ef518b41d79f48210ca08c20744d107ad6a4ecf0a0358c34fd92be86813950b46d473ffd1f0f8074ec80b98ae2ef587d480e097ff562f82b7daf8f21ab0f5f1c532fd62992e27fa48e15996d7ae720980db633908e51539d5599fcc144b32622a0263ed1ac85b07befad3dd5d6bde7451cab8fef534fa42604246d40fbfb2f450a095f487df189d47aaa387a0d0421fb7eedaea8000b42bdf6f3b6ef41cc923f4029f042ccf169d0b3a3f513d974c76734039fe93a057019b5edece0f059856110a5bf20407f1d1edb678c80894c9a4740cbe110f47a5ef798ccdda8a9d0be6d39a4e5ddb521748c83fc239309f0dde5b226864958d6b4bcf8decffae2dcd0f2dac841df3a439752892d4faf58b8ebbeaffb70f7fef75d30fbee2ee33e535de3eb65c69f21c69f3369833133ca8caf77915e6556e4a06e9084f9cc76e14b9512bfc5f256afbfdd85610e5bac9556a5c45bbfa6a47fe0cffffd1c61834ae1973b0cc30f5cd65a4bfef80580e30fff6c6d33e710bfbfab877ee0fade8efbdbdd5b5818eb7c74eb02a7f85f96dcd594f40feff1e711b67fe5f7b9f776013fecdbe6f77d3fbcb71f04b93fec63fbdeb4a3ed3ff02ab33bd72e3ba57f63ab2f16eb5be490d7bbbe450e39d2f17a5775d5d5aeaf7791435cff7a96eb5f3f84f5adfb3b58dffa1dae7fbd8bb14b925e652c72c78b2c49589555d7930fa2657d1b52e87ccd22d8066a7dadf58544a83aacf2f6d4536595c52277aaacbe46d738e30b1de483e6f8d7a75afd4b1aec833238c59d1a2468211fb4ac6f2307ed63bc3c89b26badb6c9827f978a3e6077bbee93297a32846db26097904cb15346245962dba61149986a51f7ddea24ca7eedda65d77b7360b069f77d4f9d47fff7adfebbfb7b1bdedfdbbafdbdd76fa5477a5fbc309f7d2d6f64e1f979a4d4ee4b29ad5e5462c07b6b4ada3eeb56cf3fcf9e7aef1c7c0fdffd61cea3df49d0b2465714bad5fa1a9a9380ba41985f6c4d5ae0ee1facb77fff3e8ce6b45ef5fe7bc6cbfb369d33c3835fe6ed8333abbfef5a91f7ebc6638c838d5f668ce9a72ff3af31a6c9d807f55fbf83beccd77f3d1539a875af46105c5c80eb675ece7a1f59afb2cf7ad76804c9d73e2f7fea8f42082188dee20781edee83e41d7e6b8cf9fb5ebd1e63f8f5fb668d31ffbc1db61ac331e664f6ad39186320d07d810a5a25450c67eeefe5ebf6aa286e213441c7eed3eddb3e1667d18c30da1694bb22d64565f69f1e80bebd19635a3bfb7d64f9933b8d6f8a689b3f05f978b2515c5a1f9c9da7ab4c979536c30b6d73a707d01ca749ed09a0df8027d074d3efa15dedbaae73281ac00610a9d99f0f8a29bf39a24b5a0f0c9c31b514a182c4a24915a95a99eeeeb7aa13deb6cfb4d0feb63006f47d2cb6c39df0429b5020daf36f4c384d452b4abdde688e2d5716684eee61cfa754fc1e5a2bfe9bbf3342446480d72c0be337763b172fd5ec486468d628d50613edaf54e93754bb5fdf6bee23d771523a49e8bc7a14a48fc3099d6d41371b87f4409498a626586c79ca573471228726487857b4ddded4448b2a89feb637352122a583566d6f6ac2836a05cddaded4444aaa88866d6f6ac244034d8c846074d745a843d4a785f6b63731b922f582bedb9b9854e1f1a0ebf6262654801b6862e22567724c121936388d56a0102387a767c226072419589cd4dce0148308a29895281b0f2ca1b1e156938312183410c5684802ab124533e5c8cc0d516070d102918c152718174f96bc70589a61e23a8292e1c20851ab869718160e432e1598b0b232d4a222899e81650215129515124b52549e340998883644a97a280aa928a58e9680558ac429493ea4a1100623de5114700b2719c83a50f9b61872d2d500e561e104d39094c59ce0e2c001aa13b30491c541831316a38549c55105e98a1981128a4307229b7d6832c3931824253866b80d20866ecc11e15308be1392d061862462f0220915c4152461e448eb2fe0924e4d919fd029a794175a4608718ace3f381d8563b8c060051716a670719297580a620917220c059722495e14a1eb76a6262e64b6332db145298a5438fff372c733fa6c7ead3773de3b6d73cef0d67f1aeddf61c098ab5437c2a46114f346eb7fca5ad91b8a3af4c0ef0335b081b36bb08ef7b899c369436366436376e3a7b5711ab31b3561a7baf6a626aca118be6cc4f0654323d43a145d7cbd6c68507761baca6265e3429021d81de46e956fd9a06a001b548d1bc4f8da5a55c87a56154dd5f0800deff6591db705f1d74d2fdbec8d39c360160443777f6b7dfc2b0c9633066f68c559533bb65655b5d3da344d5a6d4803a2a5adf7e2947b06aa327ded8ae67897c315c833bf00b2edad467d6dedbceffb400f0c73288e9ed2eada2aae52b8eb6eba3eb535a5ba2a6df5ea572ceab0afac5589d3b4d26840add5067a2027f7b29f58ab79694d11f9a6668396484929fd1adc85f3896c6ffcc239ea0de60c821d06af052b052788e44d1a74acd38e1bcf2edb786028a6ec57c7fd316cb6b5d696d6daaf09c554e82a9bcca60faea86eb974b63e822df75ea8ad69597455b5bb0d9c92a8148d5aa85ac8ccd00000200003160000200c0a88440291389003a9bef80e14000d698c34705a30974942a12087710c44310cc30006000800439021cc40e7c63a00c05c9fae68fe2eec09d90ca7bea418fd2d40ca7bab4504005c71cffad36fa51977e464eb22f419424c2d3d38f04e34298664d9abb1d4f8793146e0024afc82114fca0586ed4a70cdb96af104519545404a66004e7ca34eefc301c384b0045928828390d0894e0b4b036e2a43af8b15453edc4fc1ffb5161a64f2a9dcc7d94c8c0a01d8da2e27e719b74e5a559470158960b8c27fd9622fd38fcfd27b4f940f63a4c3790a16a53352d99bf6c42af6b4becefb7773ced66e134ae83ca5a9f67ca25c260011aee88e76b3025f9326d7a21cf7759ea5340ee32badefb1f59c6e2ba377425db1a9ecef9bd2330a55f291f6ee82401377e692ef69d1497a0ffdedd9f9d781caf6f0b63bfd243f04587bc275444ee650c3a908dace285f08fde0f78ac6bef98df1f14e206f2e68a0898bfac46e83e5f2cf187413f2dac0ee5cbee1b1f43f828afe3d03f32afa3053283191c2b6349afa65e85c5e3ac66981558bb7e9ffb51b9d21215e91f7a26838a221904a728ba1718904cf4d4bf2c17c5ded97678a7a3c218e2285738490b2309b44fa8ec610c01f27dd040fd9d7882c78ee6c1eb65aa0c47c7fc118d218034b3a29e85c8caff92b424dafa0e5f42a53917a1ec69ca6b05ef986f20c61f2d90cc4805e5c9da9d1522cf35200ac67e178b323ef33cdca54cab19fd6198e89e42605b94b32eee8d4863625092b1957a8bda4119bc5eb483a5db4c491b0e3785f245f2875cd0d54f0842f0ed32392388cb2148dd3be9d6c57541a9c01650403ffa689bdc27dc94622602408a00da19a0908e0076909e746c3913e72ac3d858361102ee9275ff41c8a593351d6d83c224eaf0b7e74233c955fe1276d2248c6e19557eca7a9aad99aaa431e872246048c3e22c88464594f1aa3c10dab1a6984c3189b5a4b6d333a133db28431f820a8d4f7356204d5adbcffb858db73676e34819012ecc515279c0be777417485b1af0f91f29c0322988d04cd46e43fd72832fc153fd0b2a7da1b84851b5a621f09b3d74df82b808814181d583d34fadd488456e5ab9f98f93037ff9aa3496bea5d2a90296b78f188d53c910455ed591f5a1b74e3ae3ae131485b1dd4097416c77e4f20c90267f9ce1973884c7a05aee79122694f3b9c546492965e95663a6d6b980681d31bb97f30e06b44251da99c4d32d7e520e374e910adc0c57faf158b79824aca3fc21729011f5f6c2dd41196539896b95f3417b022e481f59e734e13d1b082d478924910ae28f864f8bad74cdc15e3aeea0f000ee20e40482dbf8b3e98a527fbb5066e8260001394b262ce1624242f0c9b2c029631e89f1e65522e62f2ca1c11639b2340c87eba922d08a5a187301e9474dac2c0119446b8f6dc5e38f761f7ebf6050b818091d14953a8add1d8777a591ea067cb116a76d87ddcb53d6c3a3a3ca1b77af580cb2f18091b189b8dfdf28e77b41d8de71ea6e97d423f179b3cfe9b2c44df26e3fc24f133a2df5fdbc798647e716b34ceab3ed7c4825183e96884773c7085ccbaf4da04dd6a854137d61e64f7deb5a15466414322c261dff15b5bf86d7e838d8bdf7f1abf731c6c1027d44574c609d5a99fd5b406f995441dbfca3df6d23abf7872fca24aa56f3268a601f827e265dbb1ebeb13ddd7b1f0fbd9111ed2a97286ca5c4e02699d50c47c5525b4a510db215b5e157a40f24536a2b2fd7fd3c8635f5f31b81bc0ce7fe2b1e5b6f49ac36ebfc12bbef7d9537e7a4afc748afdaa82daf5f67a607cb290e490dcfa5171d224388877f64ad21c3ba123caac2c449d9ea31a57d7e0ad4e304859c275689296cc76ec240d2719913c40fd512af955e3c029ab57085e30e1b6de388cd0f46814891205ed84a83f34f8a1fffce1ab17e98f8431985aa536ee8fe9a82a04e89a53de058de6d1ef971af9ec530908b0bb7a4189e411f7c9eef192378d15369a577eedf46f7400e0bc6199fb1f7445e882bdf01a22b37e0cc41f12974804ff7695cf12e8608cf62d831dc168f511798ae79a5bdf401eda80445b9be2002370f2acf9d3f5761da380f46d8ec4f1f5a8d7d84e7d7fb5d6b2018e7a1977591d03d7b25c35242b3a348abf9d9c64f8982aa1df8d56e91949797fe91eed66c7c873289694293e7fe14fd6a9ceb936a22a4cfa42151cec35490a5369020b9012353a5061b224b06fde89d62879649c856e0ebb6db9a039aecd92a0538c861abfc0072e1ae78b41836a28b8e2e03cc37819d399419cd2f0cf22b255ea0d19d1b5a1bc0cda835040dd6109f4517c068ace45f5c88ea2e2b1d47c44eca4456985a0216a2481edc1da14fdc6bc463fe39099e3ded34ceb8f7e4a7d9e491fcb83fb1932439c84a43e1acc4827bc8cf589910acb9e3fc5280e25eb7f6db74f73c62aeb4b0e3b28d55932cff89808ca1f92793d630194e127417db59c3665702e7b346ffd44d37a17e491d2eac6fa7821df12c5e8fcdfa7eddae66ba5b6cdc2cf9860406c778117249b312ab40bc635c9722abba97492d2651cb93b925ddddef15d17101366d85cdd6b2326c93dd49b406c556baa0be9b6667551b9d27d3f7148a100ae111af8d3a1f80080ffd98b58c1e48f6d12c7ffe5adf69c4acfdf7ef09f4e9ab3424b851f2433d9cced9913c38173868e6fc11aed90ebd9b7160b314594fbf015ab938680cd9e828b00354f05ba2b61e83cec61dfa5c15a11bc06cd9464e40176026a05906a7186ac5899134e7386279cbd4db0abb3959cf66743e71b4377e9db9ff82bc6994e017a716171ffb27e84f90727e60a681f76d3905395b52889902a6be781f3bb17ad00e8be2b809c8966905365f5f607f5e2289bf9fb68e7e67b288ba4c7799beba3a32d7ec047edf7120d03c0f8eb60761c6f58c532ad6e9abed19e6aa308704fd0b67ccded4cb452078073b26e2b498f0172979c8a3bb19907c1673babc1e8c64e7a703f415316483ebc94ebd8c364674ce6d5f2710b32db866959703cb4fcb70a0cc4257cb65e22defcceaa24326f51d1df9685aaca9cb175a2c78fb93c4859bcd936ea30df2acf3a890e1c76a57fba1b72af4b31e5125ac28f33b36fab69e7c1fd62ddae3c0ef678d28a95f0fc6672d7bea727b6c5861268dc47c412b8809cd55c7112962f616fdc61401498ec81650bfa8a4e9c8bd1665811e44e5a0e4c46d0afe7c142c06dd33136dda860dfbc7179403754f58d0297d3ade8203417a95edda1e26cc002fa7d51da63c6be97cce2f3f82eb98043e46e3ef044daf07d6d925615f7f759b3aad695f6b34d662a695ed53c16b5a77cbfed325249e3aae6b0545b4afb6c9729f53456318fc5da57dad7da64a692a6555d0e8b5a56dea786de6a5bd5c4f7dacaacae53e1e2feb9dcae305fb7cf5c3549aa9ccfe2b630c89d9fd1e943c44a93b7a339bfed65544947aae662695b9af86c2f53f57450558397b474db57d4bf7abcecea9f5a797c566dd25635f3abb665565f2755f363b915cdded7b38e9ec14522a38af259d68e60fca86da6548f8caaca65517b83c8cfa410f388d4add6bb2067050e2dce1cb34aeb1c8d46df8f9276804e3b510fd118f2ad5b0cdabb816c3170eb118ff3e9b4f25bfb7106a7c4c6c1a1c5a040027876c555e0b632cba2ff78864d825a7ac1d8659c81af9534ee893c9a71e9611d2cc8884bc1b907871dfc3a0ade3c3a8257055780751f1f834e14338de51b6d70189b6bb00a9a9b89c841384112b88eb7095ec4ce0e862d68e3014092e1d96f545102147a9fc551159626b7455119c105b25de4629ae50299857084a7b845b2357c1a5dbef18022f6e3b00c091b7c8bd3432ac8690d28bad157ff4288f4110e3434bd50d91e17e2f75b0f66b4e50e59d78790f693c60846ee2813a8fa4a2019765fa609da98679a61adcd22bca844fae23561260be80e1bf502bc179fa98bf1f24cbb107e1db7581b84adf5465c12cfa306420251d58cb76c8a2e7d21a0e5fae71b10ae62db549a4314cbe13daa8ffca28a356e8331208b84e254dc98d1361050e81948628f0e2bc6b2a2619dddbc71058b9e0bc98555ec0ea11e739be82236cc0bedb9c6b447d13371005e7cced2201c467e590970e4c95e7d8f175e072d68a60f9bd70fbc4d80374f29cf963201b66680653ec46d485eec6a48ea94fb3899694a2295b63c7a2f63d549e6ca71f209ace3ca0000fc8d880338c1f6134f17548e838cbc0884b886a6c4b52ff6c3a6ab1da3645caaf07e8eeaee61b33c6ec9974570b5620644feda053bd155addee87bb0b36bcae9c817a0174479032559dddd2c3bc2aeb15a8391e1702168e1565cf4c00408e76c326a7468c26925910102cecdc07e91de58e55e415989878e10985bd4dc592ee4ca6a07e4b773ca19773341f675b0180d8c473505250b18917f10ad4d97dce1c0a322c49cd7ed0733efded126442598e3e29a4785462019e8c72dbfcea3d9c050163d04505011a630eb8fd7bb6fd9f186e247dee811be8a4d81035d51b1eb60f0d5bfe3750af257b9fb9dcd860c7e284f45b09848d764cb2fe4efede38caef95e89713991e3d85718c6310237af0b6787b2c86cf945b0b5c7d311e03e1a852e7940ae8a2aceb77a25565f079be7947e5946f2a687f904c7c7b2102d96cf9260f9a6efd4b2e4b3321bdecb52399722756418391deb8bc27ff68d74bd062aa4482ed530bc1044a0015d462d9fb30c05313e0bb2169a930fcf51038a5240ba0ce0aeab00b1d125d2800eaf4d9525020a9da0f99e138ee7e7bfd181c98166291e2c058be05be63865f4fc628951e4221ba6ac6e374ca017fc22e81fce555ad5467727e18e20af3d053eb7e9d75262b793b16a64e53f0837043c769680eb5b5f4bfd3630a16b9b1e9d639070d27b25432636e5dbadad7c2ca9596daf75d9dff269c469f4ece6e0f6f8466a143538d3ab3b0b4b0df284f9e3b71e83968e08fc9619f07c88148de67111aa1f9e6cc79605bd7cfffaad1c6bc49a492846d11603392cccf45ab4fcc86b4e611e0607832ea79e26e92133adf5ceb2c9830cc93673e47c13ae6acfe7daff95645483c4058d0eda57443230176280dae3fd404e04692a7877a1509bcae0780442b1a5d336bab18603766166569636743df4debe9d789f013e8b7e44e34bccd2c14955c948095ed4fd174127aebc85eb647333766511e3b2ff76141889966195416dbdf22579953886e6f205de687ad4d082056975c3fc70b41704e98b04a0dc87e2afd0b44b99c5d8deefb676f855b3202ea8d8fe96328bee15a199a044d2b4dc391d164973198bf9fde2c7b6fe58903d5772b8e39ed46e4219a6a39b4dd9f331c551d16ddbd4f1a67ad1e91b49fb88736f3d5b73add1c38644131198a0aa83e114ca4cc8d498d6d441facf05709602b1ecb53ae833d1a23258d30108df7fb2ac283cc323487d956616584d26c2a1faad67e76532b26b638ac3664d31012d5533e934ea31a597abdae1619035198e0b5a61532830e864bc3a40aa3102837271b847a751beab1834dcf7624d9f86edc8a2a26bcaa219ac72b605fc226e33b0a128f0df83b1be42424d1d7910d3c440b8cd89d9f9b84a64144762facccdb937b8331f521654ddf0800bc15cff67e2661ea83f4c63f7a7aa75e00dc413200484afbc10a2b3b93f2f89f2a61f82dcf48263d43743fffa3b75be007167cd9fce0034dd9d72bdeb6e0aaee509981236978f2a73737f1adebef0429a61382a8a98c528e678d4147ae0de22fee1a75f6ac5a6bedbff95228117d99f718ea0d97aa945f62319e4990ae547bc227e78f9b05653ac448ae6da8c3117b0003820783a8ed6461ad548934343a92b8c1aa2e9638ddd599f2b4b1c6b51fcb3d57604b8278698428f77505ff86857128b28f820f369aa354a0d7fac8e3635c1d99ff5e3ffeac024b757a5059e160bbb0f6a8df941ae8384c5af3af2b926f719d47881c9d1304702a550fba4b17a3b0a88fc0d44b02c3bf3505e96b8218e96a60a8d8007e374bbe1c0abdb36dba28bc0e3d7860ba3143b3cc20e61e115dea9f77b39ff4642654a66d97c9e2be6c51b7fcd75cd2640bc2a0a1ea239d79911420b76a8f9032f4b86f98d49fc974194d42d0db35b5fa0e873f07ab4c7dc6979fdfc44f3c46ec3bf265edb57607e453d8f47d1d47035f75c580c76f964b014c70e4a63b6a5d624d7e82c631e256fc7ddfeba480394ecf50422ea120c59e9dde518a08e6b43cc93555d93173a586e096be66994a913b18a7807bfe53e20eb3d937d08e2d3fcf883e52d19ad570978a5959931b59e6bc4b296de470370da85b24cce46fb12ae706c44da0da20b17e787949cfc3e068c970f2d29659038c1984f8c649e0f8546cc229b6adc8d04b4043073dd3f9e5deeb4d679332d000a70d18dc78c915fdcf98dc9631fce20a6ab3fa974bc2be84ffb65b22cafc8a50b704b05dec39d27f22c513306ac32bc5f0399ed1d44db340bf55465ecde7f3a954079abd4161811380c175aa6cc0af538f917c048469921e8714582f9378bc107cb30ef27dd7a9a72eaf3a804babf4cafeeeedbee6980a9da17c378329dd81cf43c3705b2f8de849eb5c43eece9ed13ff1516b70935c9b705afe42bf31ed703b3e21c4aecccdff06f9bb42f338fc62471b11f7f70de32dc19a5e9b533d79deb88e60d391930c0cc46edafcad0220ee80c4d487fe3542c6f73c0e2a6bd3e791223a7a7d6886b815f2a9c086d7eaaff35e4e3ece3d8b7b71d828b15a7f9a0498dda30312f9cf089272690001c059e7d237c7a9ab077ca214523366612ad9ac42eacaf7777e5e2848d6d53aeae9866effcf64670820b2b6aa7d9ee3ed5f5bd389da3753d6a1da51e579b3f270c67d9edc9c945bdd0c8969c27f5130fd100022b430a0321f7fbf6c37878f5fa687b93b62f4d13e1e83b13774db76128c70029c1bbe907168407e029dfa2f4596c11f3497491bc274692d4a41a72b79621ae1718d86cffda72b864bbd6d25b2b72f5bcd2cdff70dce0e65e69e1cd59caf4ec6ee7e9b70f3de5728952a48836fc1139ed57cab8f8063ba495396324e71f7d6f4bdf11eed4d577d286a91eca4c01a10e2d3a884cb25ee20a72bdc23eca56f9346d1278910754659cc25de978eb6555f18d8632897acc44ad47cacec94db57da064d86d0ad98f92b129f93149dbca98b5ab3be1fd75cbe2160482b0778496871fe0dadf7b742c15b3969c8535145c11319d085ee7ea9c464ddfc5c15a64733ce21faa066c4f2a5bb752e1bbbedcded995f23b80c7191d91361657a5d68a32ea3bd64289c3f403dad87ec948049c574e06446417af5c633d455285cf92bb393728ea8f7fc113645c7e26849c74ad4466dce3df5dcbd61941f129ea7b87b54908f05866b81c9b109192b1aac1e00a0e3d5cc7babf9024cba7bb53a6cf612318633fd6a638f3c8d64c674be54511675812676a5565809c8db11ccc6a45f927715ed6275cdbcccd8a77069504ea08b970c8c19ad7806f4516771fbc7a0219c72c152debe06d7ff64c4113e984c80dc31d298ce4535e845db36c9a9d6d642c0923b880cc6ca211ef0049b9c7bc35844bd39397af7c03e11ce868db71edd188a1d50253971e341ef9a14a431fcee359b384ea612d2564856cb6152e58ee9ea19b6a9b02fd9016de3b306e34404a827549493c3427c291007e7a0c71c82f2ca37717384bfd49c89781b5e70e1a09ba4d5a6ad0b76efa0434d9dc48831b6f90bc5a0316d280e2816f325870a9c2301b84ba2e1ff961843b8f9e7ff571a5a55f51837f555635f05b288296bf16e7d94d5e0e89743030d82606fa4accce391ce90797d129e188b090af6f786d374d9dd41645cdb84208902a7b0a403da09b218179527ec2d1d7b7011433e5cab1d7b493e43f53f14b54304d32ddbec48345e27b2a71bebd4e07206ceb6d0597329e646ad29026d3e3dacaa03ec34b6523bb9c7c4d7faff0b4c7e52d09782aff6c966c2c0d2368125245939a24c4c69155e922edbff10e69a9dec9333e25b0e0e6f52ea5416b0004dcc6fe7694b3694240a07488c81f117fd27bf3842f83db2b40693439d5a349f85f68a31e5b518ad27fd4f2b9521a00fea4ab71042ad6fdd40e6bbc8b9a2da0b4c5795b45c828ed4ef4a3ee4a0395fea7d39246279ed2866b2c09866b44d929bd883a8c0cb32a4dda36dcb0f875bb4c0a2751072883a3709a4b43a7e450690f231da571c0371738ecdbcc864e372a1a3054f441f5228a34ebc97bf4b4ae256f997365eadfa6401db437646661c768a783772101881dee1e4ecd49ef1857248f157f73103d46a3cde741f74c7a512525eef969be483dd14120b16a8b5e99adcb2b35f682f937d3765d1f495c822014b495482d7cb64947aa1b9439119c9d908f06cc500f82595d6b31ddae02a5e812c54f3cad946ca94de3d8ed498cef15232321480f460e7dce4e4387d1112a0989b039d2790a2d509aaabe5076044831d2b303ad3c7a21cef0c3d090d330add88f7d7e0807b6a7474efc6489bbd3a2215289256d893c9858c9898202195e20fba6291db5ca3463e21137b343d7ab2e120437306cababf4e1f80d89558f19ecac8e39d9c7ec60966d7956517091e48eb4894d092f2233540678ace202c5c896316f54e848838705da9a7570e85882f1b384393ecb1fe1d78f616a9fd399cd283c02ff5135da1c29676e2855fcee32966daf1bf2cbc1e68dd468ce65749d9cb740c8a3ed648263f0a98ac1d69afef1c66217ad2232f91df036ab1d811897af1c1714c66a22873b9c0cb47067572ade0ebbeb575014ec89eec063e42939fe0136452cf33caa6a0084671c5128d851b3fba9d135dfa9f12adfef89c28a2815ff506e0f156d13914ede5fcf6f3842acb4bc95a9e516588edf01af08d8cefb1117c843a9e69e3bfdd8d4fd36c7eb0242232fc4abafacb2312b7a1efe832b2ac5f16fe11564b8b16cf8bafb01847a93bca4eb9f53b1358ad94088c505ed2bd88d759f783162bb59b220f4fc61616f641f635bf4c09e687f6dd5506fc5d5e5532cda1bf4c8e7338c8b90cdb010e2bec7926d472bad713e7b7a13c9c6cb5dcfcbbe331c0a389c9feda7431c5f2f88b3b88b65d95458a6e4954a87a0998918414e8dd8430ea0282286fa017dcd343df1a1f3cf3fe3237b76e122ea163e5ed43f9f2b1358b7d4df8463ce4a8f77610593e35dcb599e589e801224ed1a584614523d14e66c3fceb906307b2f3e5d79af2e8a8c10c025b01020b46dfcc0ef31b2de4537ed822ff806e994cd8655f9fd56c586d5a0058f281a42dfc73e627302d5b54cd7a79d9b3c1105cab772b7b13738d44c1dc6b73587c0e1580b8e522ed68dfa65f0979ac86d5c27703247a03028e41e0b7a1325d2ac6e045909faec6c79bd6e6ec895b30eec94a7642c89b543e23efb6d6b32080b511c44bb7360ee23a0356e4d3193b5ad073555d5423b2c6410f5d7151cff55b833c46003dbc06f2a13a8f796c8bd4b2fd1b3520c03bff1b89f2118b13e59072c96e9f678926026a8468885b86669b86fd7ef28a6971c5306acc8564321092298f8258cb8c03c45d5c55e65da669a58e76920f3026e2d5dab0230276a5262412756f23f532300e8a1cbced2028be84fd76c96f607dd7138ee34cc0155540292ffad24c782768400a27d9e3425b98b5ef928e729a0ca671d1f3e81bd45cb288839245d6a65a2da652df68ce4e274b6b4c1a561af265310f0e6560d90015b44ea429f876774773b564aa06a832baf836a6864899b2940462ffffea8aeae65167941b0e3070fb9f84816ad976eef43a60d340999e3e396d3bef011436612987e605b52f20b930a4724f2016f8a8f01d108d752ceca680bfc5c5c087a3c280bf726b731fc94db76d6431dddb97d76bb04c2b7da222577e90a763752adc146e9096a03d962ea68972abb024c10daad602598cce873d3c9b231f300c332497968c3909a6b89292590feb8936fede9a2be06f832cd5ddbd14181bd04d2d5536d28f9d1666c0c506f83338003545f22a01012d554f2d56812a8505fd19f7e5e2b9d1e6302b188129dfc886e572719148ac520aa2996395f914c379fa145ba224a900cecf494e23b4b240a319e9191908205546672bd0d88dcd2a2174f60a6e5354a73e600f2cbe9259a84861e09f706f23c04dbc972e88ddeac7c830cf86ad66b38e307c5f1beb6913dc51bf82b8e5199bf572264f11ce48b3846ec17f1d438be9ef2261d43412250e9ef540a5defc3ef7198eda74b7a7461dd785cb98e90f492ce4b50744101e8b0709720925b8bcc256092fe68b22eed2f31f880a0a8fe715c38112788a045ec89bd6fcbe33d1f50cdf6a1cf7c3efc582bdd4281d781a74f8b47cec551f19185f6d70990705f1280a685ce20db4ede6d9e8fb838872f6914d0637158940c0420e0d16feefffd59835ed468fc39da6b76d1ce13db53e3f28f2bc8dfc603398cf8143478b2eaca89ac16c842e869af85a030a2d98f8de041025e5fbb26d80290c2fe04a6cecca55faddb75abc08c0fd4ac07ff4967f2236abc433b6712a0ece36518e075591cc37b7673b32b556737d01a5b907523529365cb39ec8d231dad2bac8241aa1d392a8b3ac461b4e28c180bc337925e863077809c9ac507e75778dd0e251d4b62ece61e62139c96245dfde907e72dd7c156df1c94d803a77b90169c919005228a42c6b6268ea53df791a5a9b2ed05777f4eb37318838336784834b617b608b43a3dbc720bf8e151bf6ed4b0580c08159005ed9dce9b0061f774c4d821d3eb955e46cb684f4fe387bd95ac6929bf277f9dccfed1be173de9592016b5171f15019da6923ce6e899dd0c3b9801cfbde7b9e8967e8e29f9b6eaa2b6fbc525a53abe87b9d138949acccc2017c9e9df65c0a6296672677f3b7923bc221cf316b70cdf87bb735dde3383342178ce64fa3ae64b3477c339420ad0168c55edd007e68d10e887a3a41274d4f64af1c87df8549523a9107363dffe410a00b87cd8ea044aa742578832447bd915ba4037ee24b4da4e65a4c027d53f24531d9764d36b6978237eda9e51bc28ba75b995c5d52e298bc30974184df39cf22208a8383d3e238f35d87e579f4148a6b5d1537d793d3a9b112ba9227ccddc8ab0827471bd880af59d20f127237a7e420c89e27813e8fa988dcf61145df12c94ed2c5e97840fd1a3923d1e286618471cf82e3b15325d8e7e7b6231efbd0e300a929b4fc93e0352e0d360df27c362ee1cea28b77505c257d777dda1d1f02b71f868f523d96b2452cdde21a5793141ba400b053a1afe0db98c576e8ca9ad65bdb5cd8fdc84beb8bd90c41fc0276304367b036f099a1be4a962134ca9b48fc1ebb028bad4c63878048ff482d3dc95baeae3441665a419c43cf9f2fa994a2b01fe0a90c529ead926a83ed074599875237cfb04363135a539e1261e0b2ec5930baee63e8d5ab730a04d4d2a82e410db89507260d227f7769e396fd204afb4dd7530ae8c54a4e7ed78b167bc051a40ecd85b01e4f0034878927f6131a79cd73c6f7d4ee92e060de3484de0a6fe4e4262af80712f567a58c4058c09c38031e5b0e132efe0c7e5a5b68f16443751dc134d0700276eade613407f21156ccd4670d5b83cd7a1b9009d33e05b2036fc7fa44cd5599f0971c45d72e65a424c2f6b2b84c62dbdc689593b3b680fc2044aa0ab4f03b0a3e09c28114c9638929daf248d89180d51cb59d28b1fae86d59648529989c13bdbfeb1d83e050b1967243597881e1a4e54b16bfb1918b4d6a0c0025ecae036c0f31a4e0b55b87c97e25a45db8e2a6debb54f987383583adeeba6167c0e3af1d01d662d3e349751f05a8fe351e28d4f37bf0a56f882c71018ccc01c8e6f059451937286d43871281e65196925ce39eb00e1cefbb80503928a44921883401bb08e91eceb9e7b80aad06926536b44cc14acdf67ce15a4f83273b3bff23380a26a699626e5252afc33b70ddf85180fb980972862aa4c02acf3c1d9a2536baeb3a6b3344047ffee982f895a9b93791dc6ac0b88f957e48ca880f9911b2f6d870a4f07a13e37d99b774ed59241e30eee656fb8e5aa21645d7d82c3cae04a66cdc73381e8d9fa52d7c6e68180ee89b3813c2965edb23227c7dd6336c5ad4ae811eedb0bf14ceb8bdbd41787ec00a824f3b7d86ce9b38a2bb8fd364eb175d12f6ac2a5640749cae40de910f27da199673d5e83ff140037f2d82591ed04ddfdf0db78174216ecdc8d3beea8cadeca650a31ffb7a8120fd20ef337aac9b00ae04656bd0632d71b33805ce2dfb5c3ae3a95d6f09bbc459263f7ff2b295aba3393d5e07c259966caaad6a4a734316cede8fc475963d232ea247e65b32a6aaf32e49b1e20ace67a986be6de43841017b8e90e15be551021fb032956914cec09a849350dfd1cdd4c2abe8d08921473cda3dcbf9db85dd33037aa468a58e44559721ab0cc5e20b271fd254e03166a161b14e0977695506c87b320aa16a2422f0d4203ccb437d1b5fdc97db79bd8b80be01bbb6ef8d7f92f0f109f2f61b6a83f473fa98afb7882b2a7a45b490f759f755bd260103ff6b8ac729f5e7ccfe8420e37f370b392a92ce132c0a255e389068be67396e4886f3c03e7695807783b77350cf6bf6168292ec3b75cb43384b96b716d5b1099cd767624dec7a0fb231ece6d04d8ea06304aebe1e7a10a30a215b8fdeac98dcf67662d883e2743e3a56d32b020092ea6a0244ea2b704f062bc34e259d1546d78b22b48c9e6e028ad1a5142ccbb829561de55466e5ba4b3b2a0ca025c346ac82af8f5379e4caefa928e8dc9ce7cffb5ceb0a0102dabbc2bd0c01d974a6c1f873e8163ff9a40d8e482c32a448102bbc4bbdef320921052a7f66e351f2132440219c877eb785ae8a50048b8de6611bc631694fac751578614fc8fb81393bfc3aab34f59d9876f430e879041ca2755f0b004e8e362d58a14e65b3ef4cae0c1615d5317aa99634a818eb50b82303c489b67f681133a790f3d1331babb2c706d2f0bec6dcad5c39c1e4387e93eed0eb915a852bb3d218bce32aa62cead41ecbc383c60744ba25684148384620d9e548f33cd99ad200cd93004c0dd988c6812732b73a470c66f44c39182404d5f761632a21512a8588642cd8318fbce108a898b0b530bc68f77c01e9ca09453caed7f3cd0bf61a93132e72f4f42a7f1872abfc921fb66ae37cd63c1ddee038316f106b012be5aa53bee645df8cd981d22abc141c8042c89c1ba959bc7fda8ae514d555ec58632913bee3baedcbae500ae352b47bc15ff03390e00e1e0e463a25c5eadcc0b2d05be2c73595dbcb39cd883c6b4ad0341cb184747ea81ac8b93519d41a055d43e03558900a378b217c096f3b4f724ac8668ede2142a4d8e2f75e86e8d4e1f5c29a3f38a065a1cd299d33c4a1be48e100fb380069b9875658a14d020d182bc9bbc5fa16b90ce1b6dc30cadcd1c68f11df688f2621818714634e0eb60fd1b552275630e627452305c39ec93f68f63d01b1ba80a0261ba2d0005b09846905b197383e0ca16d6468592ad3bffce823b4f0826842a88f33ec90adc3451ca7e5fa2030758abddf5d363e2182a892ab8f00e6fb5d6a83f96ff89a24552de7fe908289cdd16aa686472762ae2226a31b430ab855f355b6961772b21ad25b7d29763b3eb6f8f587ca28df4652b07e16ec165ffa94408fb454372033b84aabe62717da1d268808e7f179d9077051364a7c6a37489a6b9e5317342baee1cf3ae14ef4328b656b5f6c610d989bf72ceb97b439ea13a8d9197ec64024cbc0ad456c4c957b829c34ab7fa6ed2655b1848f7397f6ceea55d6173eabfc7abdd6ea0b64a6c2f745cb76ae037c62d0ff78822720e6e52f548c9d21d3312576952cd17cada685b90eb55c7afc0deec6a3536adcde91a1f3d90a150f8c2f82dd40b6b59901bcf1c4228541a45ca8c2f77a3bf186685ef6f565dc13e5341aab50590f5e5a5f783c5ca618dc77c6a3dd7379c2fd3a61bb89bfb19cb8c47f2422ea213475cebe964861166b1e7985f9e43c07480c65ebf7db81b3c2a163982d1037d96777ae17b8cabfeb69f4f7e68349e2d87d0e7a6ddbe87b9d9eceda07fd5aabe3a08f030291bbd7f7098eefa61859002344a178edf16ea475606f107280483208d2c51b3b1a20dec03e4c87b36eabd80fde487269381bc7c2c20a046481e267c5f472a353ee3cddea4b0c955129f7d11e8c54b43fdc84ecbc48b956f7715bd7c3614c5ea63af1f4a9f73904bb16e99659952326e05759b57d1601a2622f7d09d8bdadcbd33026ab8b043659a7ac7b7f690ad87341b5b08386825402153460f231de9c8d175f5d1967ff684f0bf3d6258e88aad351c03b09046ae75b43d60346299ba80f43d0abec94f1b7c7b1f1df5ff3ad02e173c404173cd77c2f0cc46d166a2eb8d4b05011dee2f1a558ce466066905f7c64d7a90560b2003a33927e4dd444dd6baea7372a87bb513ff962782024397774269c0e8f58d4bb3288df68377e6348d428ef53e6fd7a4fc9c3445bc39edf86d24bb2124bb18405ece731c0fa3166ba5557a627350ac062b419d328b900857f795cbb674205d36a813c6f928513dca044e1e708e2295db08c44fd59d40972a7c22ca7b24a097bad055b4ae0cae54516821af60a9fe1910998bd3a543f0f3ea49261813172923ecf2534df50ad41ec8d51864971efb8f9ac96084b470f5b6ff467429b8e96fc009f8778e481f5abdf28e1fd8441fe51be17dfe53af80a33b6ed1a71446f0332db884a2bdc3589695ee4a02b6a1cd37edeb59e49f5e36f513ea6517ffb30938bffb34de828d9401c968b9c3d45f88f14a92c67c40d4e2bd190752ab7295b16affc87e087b26007d92e1c2a1851f9183bf9dda53c626264b00916cd00ba2d9091097d9a66f1211a86e6c87e34747a5972cd79c66e2ac1bcea95894fab5190f131d2a03e8d5aa1c6e64dbfac84bb6c0099f976cc9abc72d98cf5a8a7c41be9570cc7e57e1c283137cfabf19b48cac70929cc130ec883429fff8cac82460dff10bb00b6293556237ce8e7625efad150b4ac50cde2fb33d9d8f8156be0e1c5fa45eec81d9916a15565959954dfa9a00fffc5195928a4c3e418a176f556d69d5e220afde0a1d3d458f131f393f5274bbd6645626dea51a932f0fa1de52b85f00e416454da9438e399f4ef6bec6c3dc7d26458167d2ac1cbf26ed52dbea56c8ccc4363a68b9f2448932f911bd67f9618de487f90a237557d15a25464cb26edc28ee0f99bab36d87f1c3fb539b033d4f969796eb5d50d037138366b2b723dfac2f08a506c5ca134adc0034b23bf446689159558752ea1849ad157ee626d59bd6c798647266d45f6f0b15999b80620d9a3b8692b2d15a2a986a5d6eb37443cba2f2eff19102ed3c32a9b3f2449b2a016570cad62f270d04861809d216d488bc660d83665f7f0bcac95a4f09287a31786af4caa746650fdae9524b65dc63394f54f364d43f509a4636213890c082623daaff17730dfd36bf12f7a99e3be02d7bd30ba1b7cf05ddb70d517bef9d9e3985b706911c571266d971d9bd31f478a2fd83feb1e14f2bf48084a133f4bc404b9c8bfff24fa405c857482e5f2e36f8b9e4b1150edc2f772392cfe3f386bbfedf803f1a31bf65765d89a1e15993b2cf56527f25f3a81fd6b474106a1fde938603fe592df79b835b67225c093b203fab507a5996a53fe1a015799d209e77a967b300aa534641c3c049b4e5c8ee483c5f6893065c9188c0235de14dbc1b89902f38f72808ca52e17c85370015c149745793a058863bacf14619df43dbcefa407831fdf21216ab3946853b559f83563324a4452657e8a7865b985442dd6c972bd2f99b226db820cd18373488a9a7f24e374c216c41f9295b0f707d1e65e255cdb0e9bd45ac2553e822f49fb50052b52f6e7ebba45adeb34ce38b546d56825930155b14d72ac5d3696e0adc7eb4b9bc2ab278231956ee6dacf2becc09a77859c3011c9b4a5719290abd1d7434ce37a3e4cf627d616f19ae5bb466ecdb02097b450ede4b38bd2bcd5deed6764a51753f36b3939cd2605a40d12b85ab289bd2643173459c01eae6f46bbfb4972045211d582227a23932484419179053b1056eb02706129d18907b1bfd6d5fd15ca7577aed77d7a019ea16344d2d50dd0f2b5e51e03b994898df1108344c9afb6c59065ff33bd761f2fecfefe0fb2c7ce37914a782299ec50aa91be0388896ab0ff08535fe1f9c7838aab2ea5215f50ae0b74cf004b2778b7932ab137c232e1eb4c30ce3a173b1fb90c6d0da71e614802e79f949b6f941f2addfc02cbefec932140c9e34e4c4a059a7fd008a911c5af3c4dc3eaf400172f0d9f022635b9fa5e184561a742f73727222284416592d65c905183cdf07cf0c9890e8dfa952a02cae307a25dc4944d5d6215ae43f4cd6d8ffcf2877829a58496eeb3de047aeb20bbe444686fdb47be2176313fcf7d47740d3dfe463faaedc01a783c232cfd11f11836bd1358c8af08ed3251eb4c070bd21469d0e5fa584ea69ed94f92789566d09d56817251699c9e7ac4ab5274585eda22a39a384ab285bb36ff8e64bd3d9abdecd8b353f69ffd20f3366353d33e3d28b9b7413a608b43394afae3c7b6eaae773906fb285df33132bb1a64cc991bd0705dc3e76c8fdcad78d7ddde0d96d0a27084c914b71aace7ef58869b8dd1ce47440ebdf4d15a6a9e0f64cb7c0c9fc6223fc9ca7c2f01dad07c75eae0e942aec78e7189f9c4390be54c123ec91ff0e81309014ccf0367bd0192e2a8563a324e2fac01c8057a676942144cddad4a54180623034fb771fadc3075ea8190a4a9e094e96a794e0e06c419cf326d66bfaed6698bb52c014e3752b4811a652907d1b8e416d2ed3d4c5a1e781f9dbc30ae31948567d826e400f8add09595994ebd13cee926b8dadaeda306178bad4fe4cb128377aeedd766d4151439fe16345f2c2ffce350dab48e59ea854916723081e4a7ec50e15a684591ccff91a2a7f5468271c20815abfa4ae21e74989ac57fe1a24d3d53222f40d384d90632888b008662903eb0e43b590a83082c24e81c6d6dba2cfb06d5322b0f2c5be8a9816cf4dd2c388176a04f52fcfa2597d1c4892ec75a66b66cb779adf6dcc63f95e37618079ed0b409c89ecfe27bf7b7cecafc58b81c3f52ae9f6ac65801be66b961f08c2ff9e06ae543163a3ede2089c1242fd77abce5a80f8f25ca53bbe32adbeb1fa7708d93d9cb546d64b9b17dba4d2369212aa672a25a03e6a58a7e25dfe1d24ae12e935d37dc1d0783556a5f577b3f2a96df2f7e4253d873eb67a63d7871a08173516165d4e2a1629c887a096d04a31a23ab7c2e64c88eb58e057f9f288bc01c7f5f27052a7bc8862fc61b4c400dbbbf9ce7ed173faebd05626bbf0fad1a0a7262a1fab65b66d6dcf8436eae896e821b1d250905b02bf081557b341395d158d128c7628d28650e6775831aa0b483d33453444143e71624977fd09093846739880bbc11c6edeb82a5520db762f7f3fea8f50c1824e2f62880a91d02237e894b8fac953138cf162511b3659f6b7a63ce7f3a0e32e336b0e00addcd1d7ac998a4535ecdf09123336455fa4b506aa970a7bcd76e3202e1c8d2abf9b404bf3a2dce36562a680674f54e3f1deea982c1bff9b985f993870cb3537dab515ba7d449e3d14845333d657dbe9e2ce1f0800ea61c365e7d14cac5926d20ab49e7f2603928080b028d8db50ac137800484805e349a14fd75fde8654af5b1e77ff61eddd758006335604b140805b2d1fa4b8aa3038dc3759e070f9909bd546732ad4257f64a96b1d11de08dd7ace4c7dae2558b3502d69f43ab75ba87c4cedaa71794ea805da0ac77eee6081d28f4dad1681f941d2fcbbaad4f85cf9acca0db3835729bac2e49b12a46a391f87eb12f8168f674edff1dd7bbb171ce100d31f897c43faf45ef42db12e485dfea49b0ca47158dc7a1fefd5adece36a28169e2b99096263ad302a7888c25e67bb695035c3304a31437c72d6687c71671f4937a3ac9b11b3b85b348298a3498c84491b0606bdacf1afc9339373006bb36e8efb4ea3bf53491f4df67e5092564bb6e42a044bd2470ee4695c05bbbc10a76e91cc89004263b25bed8ba2990562e63971f158d51fbf3434fe6cadf8e01cd38ccb2febe0322d4010223dd0817f1f6b12ecbceaa9804848b1795eed604d5c216c25fbffd4e97ecc1aae93892eefa33bd62deaed805c777904acb18351c41c1d60baafb541b454668a05bdf21b1eb5d41b9dd2f6f6fd5ef4d5266eeaf2867621fe91d7b0276c4db0784e7b3a1c1aced8bfc496412f0b7a78899332a84c95037ef643b63038c82d122e6e8458ff268ce03d9457da938124d3250b74e28a3318e19652668c6682dc5414cd0ab3114ef5554d3b7bbf6110a554f691d10bca0f502c2968eeae8b3d22a08b4fa0e984c3a2d41ff1f6fc15f8a8e2a25ec0e4c9a341d4aae5d6e0c6276876cb4fa1ee4ca02014fb97785804c5e815d7efc1acdb1e40471d734a1d07df6da55c9ce5d56b4ddaee573a16e6d62d47e3b2c1a51112f55f413713f31aa44468556c29b6c11812f63850575f387b883766446cdce55786c78197291aac637b19852633d0f2f7237b7d88c8fe5e318ebbf39f73fbf138f79f1ba5a70c740bfcc8b7d50ae2cd10c14211bdc6a4294829f214baeace35029b95b1c704648b2e1223fca730a81a3343c0c825e8f55b7b04b16e194bfaf1f1599affbc1de70216fe0f1101b723d0193f874cbea86dc2ab90246b540b2833372ddb7ae2cd0b950c701e067356e584fc918480f037c1a4828e85e6abf9566b012c006ee15069ff6f361e130a878da86e2aaed3fa5c1c4aba6684ee5d513ce9d4ea530aa0affa6424176b977037057144c79277647d34847e7d07eccfd4f61872e3c20016d08e46bc6e105c2d15d099a909b4b0eb257484e9b86127a21dbb5eab4bac8544f60ef62ec3883396cc4967e9749a045e1d75bb9a16259ba9cb3724b46477ddec1bbb430bc8cbb68afd7dbb7551c54bc77a726f3269fa8a4d6f9efa822eccdb47403d1ecd09c92a5b3922e86495cea03443285e8c852342807c86a75e819882ea2fd2fec85e1ae04351a7c495f1779d7dc2a4123da9a2e25a0ce600edccdcc280dbbd8d3169b7e2a24652023912b84da0545bcab4c1cd90235f0fd173e4e3649e4077653372c3de7557c3036712cf736136bf76cd53e962ae4d58fba71a38e404761c0f4526903adfbbdd9ed49f66902149f2ccea75d7004c9d7b0368fc626d0c618a18e3901481831fbdeed2b05a2fe324fe3a144acabf143411522f8f6e18b9bcf8e5bb40930b9d337479326a5fb4bcbf7f36f75b6f7c1c4676beb38d47a31992b4c33286b8e33cc43c7ae5ca6694894b6f3da2c26870928bd8bc06a18c7c9b8539157dfd75d3c825455e6ce91c6666e957f8214675b08521842b85a7a1c20cea6ad2272bd24a624565264f03be1e933ce411c1ed39a8c43b5be832eca7e4c4e60bf67bf70b354c3efb386c36b75f4fea31e604ca8bf7e06ed16ac9f62d851427848396e75d737372738b3c65786e9f4865d0e845b26996a8d3482c4ca68f3fea33fc628ed60f0f266cf5b1b8dbec690cc9b4821601fa3c7888db8219ebfba312043c2f29648d0af08da21bd36d8cc2d5821d5db288ea6e2cdae52f9c0fb9819b60b77d10b0017b26ce4e1953b10c66d53f550aa9ed190c8499e1497823b35b6d2aebc19081f8f27e0f7c6598818c9c150960e2c38b1befcdb7d6703bdf0d0ce1a808d55ea680f5f73d8e916023440431884802ccc7084a8ea66cca10075f759d3e5e381bdef9ff59d16a05d2429c4892d158cf9610d97dd15a088e597bb4bc45a582172837163dec0ea540f6df76c74356e1c39d47f850031471e25b1462bfa2692c0d646ef25d8a905129d314953afb16906191829e688f4a00e77961afaf0fe57c6f60501734ecb67bc185058ac831806098c12c34994127f4ac0222542943d4fc412aec104897198478664540c3a2be7b366cf6755221ce4bb068f16f0e01198f340f2cbbc28f7c576d2ea81314f6aaa732c9be9ff77a6391e2ca35b98c3dbf6046fc03aa323f4ece904131e22a1e551bf85e0a3388aeffdfb92d5b177d67742a534346e2b42c85daa45be3d23e4aa78a0455376ab0ab22783a5ada30c67e220edb2b7902714bf7e3dea0ef2b3fe3e2e8e4c906bec5698eefc3ec3c96ecf0c3774bc7177cd645a0c8c91bfa8683c9953e708647a82561d599bad6e79d5fdb673dad1af2ecfd8588a2d41216732a30af2181cdb3aee0c42b8d2239aeabfced25264adfe40e083ea70f18b748fa9bbdcedc03e1d0d9a6a29f640ca5b0f43c3af4837cee5bbabe31ff15c12fd77ea6f73d0e29675e199c43ec12fe8a281c9af84c06b96c526c04694f774031f102e60824669d104c43cc73627b32b90bab77a86c37c153887a4f02d412a82e704a6cf2a5ce5047425d720f8fe505b70c3e3827ef507eddce3f6260b26169af0c34a9bdcc2d08a789606d727b5ca792a29d9fd185e22eba5a6b4ad114980468f048d72764d5b0bc30753cad5bd3b65d19b9667282d3d5a54125f8b72d8733d759edac8e5b3878dff613829fb387f9a1cae9a7383ef33af04f9729c13bf59ff6962dbb4ef1d8885deecb08480a03f292a9667ec34b4b9359a8ef079b5dd937d948ce72780e0261c42b321d6e28b02bfe1a11b53fbe942cd2be607b7fca9b45f59f32cac236335fcb0691e633d745315edb50b0d60d2e1c57c2922ae2da21581a920e26d32594a96af466ff10e12e4c54411d94bb0a1a796a2144a1ac44ddecc926bc23a54aa12537041425bc42f5997c8ccb5e7e8f3ced68bf4d93a55e37d94c1f8e1519cb186a6bdf4f5a11515b8dfecbea5f5645d5f965d943280722bb4fb43b44d80388b20d24e8c30eca10cea030197a8a08f427e3930fd9e133a64f4f028b39498046d332a388da9dec4945902f451a3b62911330ee3e48631a977eaab62c19cb62c45e8db51f41fdc63c2ddc993eb4aab5eb000e3e14b4e0f62a3851d927b4d3c8fba0b4bb5eea9ac3e3774251d8a27e40929d4584436f629af3cc1ebd969e67c7a2ad97b47d209e22056d8b50696a5977b4577a3282a21103afb7a11e6a0570602aa88f8be685aae5743e900ff935fd8e1c124d40578a4f2919ff33af9184fe91c0b12d3352c4e961ef438308f8a3085793310a4a32e56d92e508eac8413644de29381915e5795edd24117103699b05d30010e8400f509c19d961760f7101822babff2b7165bf58f4f50ccde370f7002d8b729f7f4d04e0026bba6da3d99b3e2d457ba2fbb1e8b8be2919df10ae21bc3e0939876206ed43a433407fccefb1c24c175b3d242e879365c73e7473dcd0f73d3f33d168f22403bee234ffd3cb5a4a58a86df82d2104f568bb7ce48b62b0a8dc72c41e7e386ed3fd1e9c7bf17452920e4d9450be31c48b23ca39d3d1eebcef85f9665131f744160133fd95f7713e6adad5362931715c6628d0b3f5adab3c993219fc5e53f717eef55de01d499292ebd7ee3e232683a0fffd1f5cefd455b561fda31de7eb9516a74e2d205866183a7859fb017bc0a3f7075cd3a3d1ecf4e0692c3b08c42066bacb53b92360a503582d3962d137b0443eccf7baabaedccb5c1d297fa5228520b3f1735813854cc40582999c34835b51b4ac8591420bdc5bd5fd68c4fbc07fbe9bd6ebdf072cfdb74419ed7ee2e9b80ee5a8e7eb28ed7e4566de7753fed365e67d95c29d7499f15e8502ffc3873fff803bad9b7b57dd5e2f7734e912a54a928cfd29abb5885aa2cc72b78fe2afcbd9f75386b150fc98ce8f70de5166be2b052077d5b5a3db307f0a8e54dda003537bb101063b57a36a9cd23085c338a16f24162f79ca6d0a0354b684c5abf9fdc852d9273ea863c2ca902b0cdb0a3ecfd8d1d10dd3baa924cb49f1fe39f1794ec03c3905570711bb7c6c5e151b0ee2c12892d4280b78fcdbb41a02364902d8096100fcc32114e953085804fa03383fe96a2dbc64410c2aeb3e91eedc54fab9c9e892bd39fd0d8d9a3c78eb2a7a0d6ebb36b3ea697c56e2f6c2490e6171dc64851123343340b35ec120fde5cae1fae3a6a0c0fab55c3c57ffc26ba8bc1af5d0dc60a66af06a71cc238d9644a16d1f417074f9fb8371c265f29ceda1a56a801cf2902124a0861437ca90c61d09246993c8a0ff60e9009652bdcd090644b03a2639948ce40e42b4dd1115f11c4b850d0da2f7b21c1464ca4c55dbf6a450fe712cb292ab15796e83301f41e59dbc6c62352f07b381a52c03f1bfd4c28e14fbde78ee5250842627464cc1cb1eae6a4f69828b720cae2bc382f69e9ea05868bf94293b16421c7504ac2686e7142635abd4c0a187d209575a8b27e182b627e857243db3e016315972a896231231c6f3de011c96be9c307c39a0387bc899d111f06aec9970c42a4bf054938ca79e103913c616dcd51568f3940cfd406c0e0e9812b46946fd537a3307347da1e4024a2465f8936befe9fe853c986b6bfb492f6f4aa2fc6a2910b86f411296b842e3fa3422c367a715cee126690ed86d3653142f181d03affb808659a5e7331385c27513ca38b37d98dbd27d18a05c91365d8d06a83119422044d6a6fdbd8cc275d63f8cf873051e3ae81c0d468f2472293680d63b27f6e2b982507ef9f0b679aaad0da59f485c71219a9bb3dbbd616f3dd49a45cd6e855420505296570b7322bb3b7857a93e1cd4bd689fd6a2d34d3f2f6d0e763ad195c2eb9ce08081b14b9e3633972ddd2e76f85861bb8d240835ddfde4c6957bff7370bad72f11723bd39941cf253c14907712d71ddfb1a3fe897a517e17e774e963c1c99789094a4299c0189b77117310343d4369dfe7801a4f3397a436cc64029474186c57c822d217c547cbcb4f6837a128bb8a3f7139aa5d179d5520a9776cf1ab93ac89d4453cbaa76c74998883ba8c51b47e7db9b69190ef4219cfc7deaa46c51f8856be25d38435d31b90464e858b7e03351b1f02217dc5e06a18c23c3a4aae45ebd829de62b26fdc2125943fcea4d30ff927b959a31901c704039d03af87a3efeff821fc384c165d630c63511a29f2373918d23910f856b0c7f2e634a23ac3895fc6a12562244638df7c62d4a240b7e625e5647bd1d64fff9952bbfe12611c84a85ebe1705c6db0730a8e549c1a29e0e6a79e950dd10caacbfeff416356ce45a0a0b55c0fcef68c6b5ee059a9a422b172173404a1a4c4345d71759529c5c980458254bbd34a4c7520a6ebdb2c9a5517d57180535180982c7da97000a942f10d61e29eb932ec3937a5fa1fe7363aaffcef84da34e0078494020c3e4c12c78c832fcf0c506144751c1aa540ac1d9079f33c9c6fa37d887e476c354718d884065cccc22c8a2217c5e083bd9c647249473a8ce212b128b86841e0424c9fe8482c0c0fad8ac30614576fdb051ebf19e2ad34dc509487003bcbcee2ff76dd280317ea22eb7c40a65a4910164de1e480564b735d17e21fa5e205b0986fb401e0e037be5de8c69ba4fe4e1feb2444ad0a2dab532058b31afb81a07f5bd6b4297e14231488cf70f3de005654a684004af016c14b398419617078e6a0415ec4c05a341e0022422fc63340655fbcf3d7fd201e5dbf8f1eca3fd409d14dc14eeaf1a97d88f1b0a34c3d82e41942b9772857f99994cdaa9392c1fd1a0688761b245af16dc0b0acd01d7105f940a70b7218b8b1b67d8bfd1ec7d2f50852dbac97f4832d817a4817255f6308c98616db92b105091a3b9fc2d9a0161a8ec9d50a8970b10dd6b0eb92701888f050cf0777db483963bf118bdd4f8f00c911e0fb967ffcee4b175304a65e7f31f1f8cc82e624324ecd04851bddfc0181b7722a9a29e2ee90c0c596b88eb4d50cde915e0edb40fecd2d6adbec87de566456f5a98e2333eb8e9d7e0b10dee51ea3a6fd285138d716bb262eb736479bbb8b1b65b812a60ac3310ec8a9d88ba5181bef810cc7e91c018059828699da3d7f7874d3e5af478e8bf198676722afd81c8120faf17740af0902576097c2cd280110f28014e76e7450be899835d123a34a941055f32c81d3b4cda3e0bc14b3475331d21128799ffe9fe582747031b78d00cba657af26915dc8bfec97829f19a08fd224fcc59d5f670848be7073a6676896ee307c6135153f42e159b8e64a34c2f343264aeb46be102d632ce17e262c0a2b6f8f5b2264c5f685fc235a879f98076fa3cf259b286796e507c0a85881199b9acaee8224b4c2de04a229200224a2841561ddf13d35e8b4dd43b8622068815502274b00d579db863f3f809f27d6693191b70a11e4479caeed8bb84504a06d1ebba9a8485630e852ba5f7e8e966689f15b51b003074ff662538193519357a53d7c9de2715f20b62df0762390a5255bc99049d852a0585533f3fccc908bbb56323de50120a32e75746899915e4298a3eeffcc81da3e577cba4c0334c48051c43032a5cca7c5e300cd29a0e4b1172ce70a7d28adea8a89898351f71d200f689174e1cfca2df0d26b82c280e4ffc1d5dab5f0ae0d661281b38ccdcd7f74b35eeea905bec192f916513931a2843bd4ea6b1be091b706079eb2624a4edbdb7945b4a29a59401c4077007b107ac2f43a8be1f0441281b12896f2f52dfff3b78b739ced2f683563328fc3da68b40bb08349cb5a866cf7efe240453c91d5655723f1d43aa1655df9f0026781952856fd5f78356b676e2f78357f5e7e6f7836aea4fecf783fb4136f587ff96cd686e46d5cce85525cf40695d3fa8f283eafbbdb1deccc8990ad8cc871abd66af17660f50496d32f043d6bb9e83a38cf55e25bfe7b35949d7b7fe078997f62ae788973377d5f7a4b1fe4a647df97d93b5ce4a7a95c1cbc68f8ce8588b627d56a9d9c3fa1a52600ec1b034d628637d38ca38eaa52c7cd7585adb076aaeb3be352b6d8f4e59a32c1c39c01d7c709c95fcc6d265d5e97ba38515dd19bccea0e4e827222ce41788f8d0716f9f53446e48a19fb7f7de9f67dd9d7867f77aecba518ff8da592b943927ad47984c364fbaec3873b5650c8ec98c15accae038c146921fd480550110728181961e4c4e49141982081840b083d40c4c9290e1614d9427f1abc16628f45b62e58420688ed071631a2254a2eaea0f326e3fd08842a105dc95104a192e4a3b9e7ed000d252e204395f9315256c803923f2dcd27d34c8804081062d4a43940441a1068d204ebe0889c244070f5a98a28c4c40c404f45b42a48409e685363228e191e5cb9a23c0305d478b76ae8cee7cccfc4d9f532e74c969f16c5b6ea0924311294cd43092440c34d8ce14e9f0a10a8f25723fb4ec9316224e9f532ee06ae8bad8e04293387738153917f94e9f532e2475569f532ed4e0974a56223e95904606282fb6265838a93212a6860a3768513244f47c54515500c812391e369248f181028d10358e9880bbb19005f79099ac30c1a29f8c8ed43253c02a45567607fab940bf5b9fe1048815486982ca94344f4325ef754ab98042995eff8f7a758146873d897921cc982c5ec20c554ddd96d831df49e3389428f5546495cf9c38077438e78e2e59db4307a14628d2bdf78eb89edf013d84fc9dcdf776f77e972f3969f331c673ce2962ab75f79646ebd601f6f83eba64e79972aaf131d2dd7718638c31c6f9d225101c4b12a448e0f2657cf3ef8c2fcef83e257bfea0df89bb8cef1de9d08c4d42ad79856ff2502334086dea734a012119916c5e8d788607a1b914591aa740573e5664d553f53929d49c57b6a55bc5d12512b87c7fab0101f9f890e43f52c724a8e9d685888bea7846531645ce279453f742f59fa43753af8247ac261a60095a72e8a0e4462537d12404c286204bbe317cf7c945892b59053a0acf7d4edd96aef017b6949b100f08dea5d1686e36402d3713e02594d03144054b43a0c051d0ad991a4265049863078eed43eacb8102924e82f292c8d1e5f6191bd9c74d4f01c13f3aa81b443f8a7045781001b1c2e183a8c7158e221c4449493943b8dac440452447b5e3d34265020d2f49a48007272f637286984131d8cb15829fb775571f5f4b2709b4b6d2586cbb10e77b31c658e7dbe57cadddbbe2ee929a243d7bf52535497ad786fb929a243d8ca3021ffcca02f0ec3c0fed628c43ec61bcf1b5fa7a17dfdbe9d77acc2449e26bc94b6a2f939a24bd0c8644f8c318939aecbc0ea7c2d7d447a87dc2becfc6602febaabcb66aadb556560856f1f3ead6b5d65aebe862ac19d76b816ca562adf586652b0194a0d5de18bef66218ceafdcb93aae3516da37509bb55d425052ddfbc20f04c1f0c3d7862c0f5fcb6aed16d7dcd5b95ed9058b234e35bf16bf60185f0b8bddd88d15e2f8efdbc70961dcc559dccd0d4e857a11ebc78d38210cfb6b314e0ecdb911e73fe71687c3e16e84aa7a92a8b58a70fb08b8cf9873da39e7adb55a6bed8a7baf0a4a29a794d24b73ad3e64497badb5fb8e7cf3567ba7d6dafb2ccbf5f262a0eec290c8be0e37a0f686cf39e79cf325c6b6b6d6da6bafbdc9b95d7e127459e7efbad1034b9b7fb342852567cf7c8cefbdd75ef1c43de1737d449bae36576bedbd16cf5aefb4b693ea74a73b9df1add25dc6f716830f2191fe0fc49dfeca7597f1bd75da52db69d108185777f6d6e94e677cab7497f1bde19b3b8d6faeba18df7cd31dbeb74e773ae35ba5bb8cefed09d5b7dabbb7d781f04147c3d29c61d6bcf74618256dd22b8c1757dff78178efbd370882e1d5b7241856d39bbe6118b2ac101010d0bcb2390c35a8bdfb15b5bead2cc055c62c2812bda0760f831e91ff9922c1d4565f7730e811654191405de1aee851eb7e8bd3cfa7564c6d30e8059ea64dd40906654191cc0bea43511b9d61f654bab4d4e98cafad9a6e29d81137f8d4101cb6c76b03bcc75a83e0016b2db6f63d60ada5faf6ec2d0dc845c697c78857295aaf0f8e9bc2c1e4556d42a6e816905a00424f0d81e2e55a10a27f54575a0092ab08c1a26f8d011d0ba911240b4700552f77ba0860450ba932dd4ead90d4ed932c14d1edfb04d1a1c20a9d7b26f86a0334edd6ceaafb0190900b6b497e05b0042f815a581bc571ba041df491dcd8efeb1c40f4fbf7682aa9a9df0b046562e92508044a37001033449703f5a07fbdcba382a2d0cb15d78a374315bd9c6cba05dd5edaa3a446faa54bfdfe2c6953bff4c98ea27effbee6e293738ac709fd3e90900b0f7aece8f73f00814abfef011851fdfe0876f850e4e5c8860d47bf4f936e3dd428f980622ad2ef9cfa81a6e3b45ce1517afdcaa528e42974247d6c3e5ba3ff3e404fe670fff362fd5aadf5e7da00fdf36b2d6a03f66f58bf9fb3f732b21d29d59fdf027ab4340b78e38fdcd26e8c2fdc4507452358c2e9dfc7fbd2a37b73aebac818ca04bc9cb992e77ee82af5473647ebd4efb3fa7d5a84e7b74cb7dbd7e0763bbe8ae8bdb8a85f8c54c98b6d95bcf7666917060553c949ab2a3961807b16c2fceebf193e0957bdda906896328ebaac7efe590878fc40cd751c12cd51565f365e76b97e8d2a798ffadc473d92b4ad923727099f6da38d54c9fb096082db2fa955ee6efdd69af0faf6eaeb7a743dfa5502bf216d53ba373595bc353755f266a7cc64ebf75748e1e536eaf782e3bd6d239cd4ef5f5c8c18ae7ffd7ce170aee7afe9646bb217ad07bff5e0cf77cdf8ec6bcd580fce0767b2f0c1d1893547d9f78db2e9cd4a5c85affa6502af7aa9711f90cdcf3fcae6c801eed3d662cc18a24333ac52b347d6fdee46991d39c02eab4ac61cd0ef04eaf7d69167f61080077e6ff5a7ac4d46ae92adcd7aef5bfdd51beba19b55a9d9a34799fedd7dce9ff1b6e97aa3c437794a166ebe623fdf65e5ba72a971e55c6cea8fecfbf92a7abd30833cef7b9c68ef6f91f774c6454bf3be278abf2701325461a628f5903264c89b714313406e599ae030c568c84b63e68713362c0049e16a08031a5233dc564084106686bc7f194d8df4eaf10ad2a7913effa5d4a7b5b234efef113896fa1b2f9ac9e24333f391ade5f73e4bcda0efbdcf5a6610eddee71eee950da2d6e690f7b7aafee8eedd7c6854d0bd6c3bd3bd4bd5bdbf4cb6f65d75539305ebd651d59ff0bdefc0d41fd67baef7bee33283c0f7fe8a50dcbb72eabc748f8fa5c8c1e45cf73e6f9935cfe68de95e36737573ddbbdd9badcd213117f15cf7bcf2ced8e3bc056e3e679491f3378f33ca40f222e76f5e06cec7fe6626a39f436f9efecdcde78c3172fee663e0dcc4f28d09676b37494a4e194aecb119b734d8ac0e692b5b8b8df7c8d22ccdaa7b9f54f7622f543f0b42b0ff1b35b0fd7bcf666b61ced2bcd79a73d68db2087bd00bbc67ddca0da6fe54d95aec4126d006dabed6ec7b584c1785395b63b182505b04daac2eb261ce86391be6ba67dbb9eefde71de9db57f581a9245525bfa9cf4b0be0f871993d9efd7217eda25dc4bab182b4de1339a52dca0ad2bde91975efef91ad7939b1a87bb0191d72cdbc234bf39e35f38c2ae97d38f38a2ae93d38db6c668ff7610fca6233312ff0dedb6dba17f6e8deb7c2a4ee3d68b335d66dd2bc1745ce270bb475af0499baf7b1d95765695e4eeb9baded9ba579aff5cdfb9fc24bd6ad7befb129fa8aea4fb96f5ecefbcfa8d660effd87546b0f9b01bd66af39dd45dd0b595f90eedda3ee1dd9da576569de7bbf6f9e51fd69bdc7675e6ef678adf1035349afe5f5a8a4e72555d2fbd6e8d9bc5cf73e014cf0d2b375efbf0afead7b544da71fd2ab339dbe2eb25a735ed4bd9fb5c81b4360e16439bec9531280a983fff1d7afcfdd7c8db60ec67a74f0a6a883ffdd2055f2c65649f0856aecc6801570ef3fad533891a50882b5144e9506feec29a2668f15d75fd26c201d65f5f97b6389c3d4c1c761aa24f8a38c8f1ce0ce9fa338eae0e33489fd666bdd835fd26c1d3ceafb614ab6063ba2f595eb7b2c1f76646b30a5b1e49ac38e3af87384dd2c0d1c1a82cffe95b05b079f1433c9aa19444b92880e7e49a6e960492ad1c14f51557ff6839fc2aafef0079f749a41b6832982e8608a331d4c71d5c177cd7425f5f34f41656bb25949f0e9500c3a047e4f541579656b0568e284440e26104121cd10f864ced684b054e5586386c90f1686c027abc027adc04fe1d41a4bad5963c9793896299c3af893071c432000539f02d051b00dcca08a671e6dee1e51599a47d5f7d3ee3deee12c6d2c3f5073bdce5a0f5606ace16025f733800da7dde5fa594917f8b8875f47193872807b38ce6f795495aa97dcaaeff770b666bdb1e41eae5ba85e7eb754b6667319378358bf3f4f9941b4efcf546650fdfd38676bf6371da9fafe5cb4a6972c2840f4fd57cad6f4d0de7fc1cc20fafb2fced6f06fa8beffde6cade5646956260b108a7650f527e7f77751f547fcfd9d94adc97e7ff73483707e0e894e9cc949a9ef1cfafeb2c3a1eff7c69acb5566edd33af02df9871c0bd7f763aa2b5ef19d34d3793c3bf1940273685a40e7317e19275ee72d806564f0f5eb3c1e65a0cebfd0af33cac017dd9ff8ee4f8c3210ff0b9dc7630c24e0c738f13a0f8e2f707efc3386e88c8296067e9e694b035f07fc13b36969f9084cade97cd22d2b31f59d9dfaceb6be5f482f23366abace97ae337dbb82e85b86ce9f78f02bd3ce83ff511a1289cf9dfae64f7d972d2a9b7351d99acec8d5d4fae53dd219d954f5fdd365e4a2b257610670fe9ddf61eae0cff0850efe137f62045b54f6448b5a80f3330c8106f3f5ac5103fb72a22c5c5ce805fb5daf2a5be35a7b571fd4cbc9d65e2f30f482fda2685f4ef6e5645f4e3da47ad97819e2fafeefb392cd388e3fe14e95e435f026613e2b9c9137cd1e2de09720d4abea0586f5afaa57551f4b34bdbec0f4cdfa194a8551f5877e0da3fa6e5159dabeea2d2a18745e360ba52c6dbf380ba32ab93f67164255723fce2c7471a12c422bf382fd3bc4a16f1797be5d547d3f97b2b557d5a4ed1745cea57a4875d5f707d1cb1655ce0d7ee2b3b235d0cad2f66bcdb955dfff5378d97a55f5fd2d305055f5677f8baafe4c1e928efafe5610ad33a518e2f6874da193ade93c97eafba70db7a007cc9e6944af0f13c2c12c68d2afaf48357f4d5e7c7382a453ea040910bca109d71330ac2852587508294737529008a728699b3bc2b2b937c8cd97d748a73f2fd3954e3f4a719ed21c4aa7aaa4d0298b52f129d5a1f475d19153a7392a5abacedffaf3d3755e0c8974c4cf0989c49c363de77142a21c9cbf0989706ea630f59b8f8544373af6b09028761500b30253d161b0e7493aecc5311d862b6106412545088b285970910bf630d6c3bf2114293d8c02e4491991667992c32526cc099a30e27b6f9ebef7f32d7dbf78c3920d337c376583097ad7e99c9d3ce9584771e9e9254fb74daa9c96bafd7752d4e40424be751d8ae344f3a757e4e2cc51240d135b901d47e0987182910e48669c683861ccd07d524837d1ef036d315281e76251c353af4c7ef45a9938f5dac4470d347af5e1d124a5dfbff7022da14149bf4d27f4fb2c0e82239a54787265873336a830fd804223446a8729e4646a099c3476001b38bba3a4ca12157a9d5a5244af3400e9f5c3af437449e12608a45e17254e98c6f4fa1f4fe2a5ef245933430ffd3e678aa1dfff412509524f1227fd5e114b55a843228b05c91412a45ebfe39a6b90e7250c2464fef4327684887e976af4fb571ce1c9aa85a8226e8092e201252a2f446e48a14b1821271e6c7c42b1dbed11252b29685d06c8600667ead37b4f0b8620186a5beb3ebffefdb3fbfc2fbacf5aff1e6f49fad45ced1e45dbd997e17db73fff8bfd79ccaf6574367c915f8f77e7efbecae8bfa555115ee8df4f813924c6e076c650f97a28537a2bd6e1d3f567ead933a7d4b523797d36f020cc9ef9289038fd0f2a59a7c5511fd49fefe7833083f673cd6728264def28800390b6663793a69f35d3f7a762dd637377430e5a2834d0319e372168ed6109d8be759751d820f1bd95d69a858828e8c8342973311072d101ee734a09d785117f278c103160c995a025051c88d4b082448495a321301656137c62c792238cbe38b190d4820f1d3c20cdd0840d0f4da0d94fc29be4a98d0ada8bb63c86b09f28bea8c4d44b51ea4b522565390ce749bbcbbf2825a522945ce07656e9f9a484e39b5252c18a8b5ca9a89764962b4d4ee8ae30b1815b4cc14044fffa9c8221cc92aaa6923747af906cf4a8d4fd4ae1b22eabbf5f66699d5504b3f68d14a9d2eefd929ad0efb8a6df7f1edceb22dc3ad3b3e7d2ab2b9a2603968f3fba3deaf3e02d4d9164f869ee9bc9f0e801bd1afa5e96f76cefefbd3186f7dfc7d0bf7f86ede8ebb1bff59eb5fa9bd298b4cbdbf4bbf1284225d345a8bd86a16966cfed75a45716ca0049701b659f7e3cf5ab91d8aeebf467acbbaeebbaaed3f9f72c040168d3a689bea37a39a3a977bf4710cca8de3d3db5e85df7e50a9edeedf4aeb32a664dc5a4cddafcee27cd33fc5f37ee0ce89393ec3eef999ea4ed5ac892a38a7c3be6a9647d71ea2bdfe4e140adcdda678d5a2dd4670174c55802d19fb785d08a1f1ca853a119943b7d0c98ea122e46a8b56e02574cbfefc10ce2fdfa70699776efcf4b3798b47baf8bd973ed88410b289cc7ea8f9d14d7a700ec9a0fffa545fd1ecd201a33a83efe7b35a04745dc0373a8e4fcde7bd9c4c8b72808d5db0777776b9be938a9cd96fa00e1a8cd7476fbb6d7a758a2be153e94fad82324db07575655b6db6b2b9d41b4b71873259582124b486942868e1cc2acd1727444d5017cdec7b57be9d3ad66cf882b29aea45066444162a306ab1f662802c7100694e48852a54a1521b20cd5f701fa4e9877bc434bf0f2f60fcf6e073388641bdc05f4fb333abe20c663ee9cb2f9720b9ec1fd39d480e6fccd9979f0ef4cad855f9faaa935d65720ea03eff5972a355269f57106c7528f4038cf28ee5bea74caa4d5c7d2ab965e7de8f57b4c71b3e71be913da448d3419a93f4a4bf8290b8bbf023d0d15c129146ec50f8ebfa438d906b43c4090a2ba224c1108b48836e131e32aaa00a6cd0c619a92b419aa06a052c39a2f429890d445b4b4162c7e16d07d15b9d4188daa3f5235e32f359ed9cf21510bfac49a851fc555b20aad78e29ec5185b10638c31b5ffcd424042ff7a161a812a490710032f817a15fafa2dc00b8233aa97e0475612acb41cab5bafa02cea4f8e401ec94ad6c72d1b38970e2ae91ac2edcf4a7bfdc08cea7814bab31695c451a9fa940af7555898a9e273f6a9b4fcb409cc03cc58cf394f313e2c604ace4b702a96ddceeb0c5c2bb32ff2e0b03e6710aed5a2f9f4e3f76c089602f6f72c04fbb86abdf7defaf7d8e19fc0b4346b67ddd7ce23caee18dbf1c1c9f15718e1f3cba7c265ff74fe30e1f39dbec953d270fdfb4f83e058d4ab51afb1ab5e636c2a598b2a596dbd9638b75e7fc88aeb126683d9aa54aff5edc3926ced95b3b4faf7ebcc8e258ca97ffffd2b676bb0244bfbfee3db7be5fa67b3b4affb1266ebdfa750b25a739e42a97f0358ea5f492a759a0cdfef0877eddecac2ce124104b4dbd75a145f14cb8903e1844eff86f6d1e94b48a7ff329a3df4eb91a5754250f7a332fbb3cb38eaf9cb6aeb5d37caecdf3c967694dd9103dc6d51d33779ca0d63efbd4b6d71f72dd47dcba42d6d66dbe46499ec979649db7452ae35e1b23a7a00e6910da5b4247dac2c932b5749fa202545f2dfd2b8a5cdd1a5864b81502e5ca7617562ea34bf65aa358a029375aa3f4fb7dfb7602e1135bdb44ffaf5a68ad4e8a5852292825e5a2efdde4b874a6bd5efdb3c3353fdb99f9beacff5c1f6b6698a488fdefb881ecf0cc224bdf46252931ebd98d424e9e1cff729fd281e6fbe95a4176bb292dec4f88e16187d8fc16a3178473d29cdf2cd9ff3739f636bf650224a3710e1f61170b73fdf67ce49de7b2968679e7169ae622fce9df6aac5b9d3bbd67bb37d3c70ceca5ac91a3e98edd5dbfb58737b1ff896652b9d20aee37ccfca179471bd179c21c6f7de7bb1bdf779e8cc9de5c163860c09f3455f7dbb8c875cdd653c64c8900e0afdae77f1c63c33486bada2ebc06e8793f4826a55f0acd8c117db4e671e152a54a850a14205c8d35129ed34d585cd0bb01878a58349695db610551d8bf5255aa8a1a349083337864a8e4311545f4c38a1c697a112c8d021dac5050480b12d1b2c1159c14a102d4f45745aa6d8cc3801ae0c9820296c71a14a842d648e78a420099b995965ca0c6bc6932455369401223584099f1523e49eff5a5a248481b557fdda99d084bac1eb773083b095291d7a22b164869c18272b8859e1a3a226cf40c1881f5d8cdc50418c113290d7c748a7dde7f6f001a4091b58c64449c272d9a15b3b8990ba51020fb829430419b2d65acbc34304032f796a0dc8c85035d27f6c0d05aea8a884a5a1fa76265485aacf0ab8d01053ba1263244b103694e1e123048d125c96a4d880e4062a3cd7cc0a246594d440e3cb94102af002440d34b4b92a5204990e071f687ebe293e158ced9ce8738a8a86973548bfb528f1a6a543402c1142093329f0c891fb705245683d34f1e0e40586a61e8488d26409187cf8408608295245e1067e2ca185082078d801f7f7c230ca7146054945b838b9519aa80107131922587821072286eebdf756fb38df7befbdf7c664697819abdda701cb0f36344e6aae38a5f9a04459c9e9009a1e44d2740162a4c4ea940815a498608997a5312b987749072633765039a172e35665052543d65a6b2b09d630c859e235d6506575a1aa424a8616be285193a609245418470e45f94c0a8418b1c4c6121e483c60e204dcfcc71a1c0b251c5992443fc1120317810c8d15ce340121a688eec618a8ebebf933a75045c1112b4bdfb50a20a288981a88b449a3c210082eec77035453b7f64bd392a2281f5bc4e03064adb516e44eb3f3e0290a0d1c8d1344a161a8e4bd7b105e546da70dbdbb72a477dd0e48aca0043246640922ca507782af761deebaaeebbafc621b5e8aa217afdb55d7aabd241cd6e7d4d38d3d657bd14b70ce041e826b2492ac39411855a6bbc273106017fef9b08190fa98e01b074f07df51b40e4e66aa28e97bf4a95204479dfaeaa8249d9354110243151f3ba2beb33ba2f9891f6c3954703a51383854895652b8b972cb6112c3f1d130e480f900f9ac00c2e56e861cbd9eae623874b8a450c1b48f0c4635b8e61ae419e0f0e249b45c6bccb038191da194a416c80a73f44d910ab7d8f0705420151dfbe9f6d5704353b9f28ed4e8aef62d8329b6a91872e85062c323674647064f38303932c01d65c96153b2729441142b14436896ad6ba1871ca18f1e50f88c701712a011fe9501a7f01c449681e3ecc0f2f194022d4fb410eeea938b96233cb4b480464b0f50082eb2e94ce03a633c2aceb7544955c16a5856a49c9820b54414fbe4424566c9376710f751814715956cb1485b3be79eeeb2b6ac6c5916143ff1b9e8e303044423802669042067cf2d75a7dece98f2d972b16aff904ebcbc59619a8b947ea4b5ac3bf254928714bfea4b2d086aad758b833196dedaa5b3b54b67a641506fedd299851ff8e9ad5d3ad46a0d825a6f97cecc636ddeb9f24e5763e0d554530d629e2ec3629deea8a7670f7d209f52a6c99dfe62ed3bb49d5e7734d5e9f42b50afbcccbdba5e1376224829e391a9b83c0ae8d34aff3248673cfdeb403afb8e8bf50fc4d7d65a2938712a386d553cbb393f002c1b5e5dc371aab5287e597b1dce18676b4951d45af7bbadd5faededbcfc81d75a6bad65d5395b97523a72dee2f691e0dc69be75b7bb0eeb9db3de2d97c7ea32f6e9403d5f4d67b5aceb85df07821e80e1c7c5d73e4056fc5a94ee3f6479a44f6b03f94ccd279fe2ad3f535f52eb16d723108ebbe8764dda3cc02449125f4be26bdf955f2f0c8391b11b6b2d50c2e90d4e0e758993b434eed3a74892a4ce12194fcffda394ce3e0bc6407df99c53df3967d7e9ed7dde07823cbc32dd672c16ab55ef38bba53c22e75b73cd820e9c7eed1068c36f2f3140c369c7000d9ffde5d25ae711637ee7b4ba75adb5165b6badcde09c736a6f7bf35a7bb79e136baae7c55aeb7bef8ded94e283219105738851205d6badb5355c458098478164adb596c750305db5bb7753248efa08b57be0cb78b64b87e6ef4ed05eabafc5214ebfad392738ebcfbde3c86a8173ce39e7c4f567bb74e853dae5997f3f7651dcc0a2ac7657c718eb50d985bd50dce03218ab9cc1afae159a6dfc37d77ec769adfdb2f1bd42f0dcd38e0fc20e37f87dbbbc2fd65adfbd71acd68d71ad1db22fde37e79c654bee1e62adfd62c1cf7b101e9c35a118d597da160e8763d1a06151d0d0b931ae942fd6da2ffbea2ee37d5170b7ee32a601801c60ba7ba83d5d543a5533042ce9667592f8e2dce9ed8512b83dff0d37b893829645bf570b20bb02013270fa4277e456cf368b87267d1d06dd7bef89db38560b9700e71647c17b1f087e1e8c2b0ebe4222fc2f18783f272579b4cb9470fa42351482792ac818f873ef3e67ed9bb51aa34228268969e505a650d5408b8593d3e58899fcd99e0f48f2ea0fbd6ee95587f02a2909060a1b5ce784cc42e1703821a1d903e515beacee883be04e48847fc782167d4527ebf379b2ce640103d70e7a109d3281099efba8348db9f434e9ccd8080000040003160020280c0a87842281408c04c2a4e90e14800e65843c78603818c9625190c3280882186408310418428021c620c3584d750004df988abeb3198a56a7683730dc5a2d97d20be5467b9e09b554ed8621f6348f0087d2b9ef1de1d411fb8f88ab9ae4b2dbff687392403201af1b9d0924df9caf1bfd1dd123ac273817ed69bb56bfd151770c7538e069dfbdb40ee2fffcd2d17202a18efefbd1a800d3ec26427c4a4a7f94a16d11f78ac161a20c2c28057df3c36ecdfdf60472a7327c77758ac1d7d597a6a0a6dba2d97831fc28d113c1e6dbff3d1ac6cc457e9f11559937edb5f3853fcc77358bc76ea3ef9e877579dc367a35e26a6e230076a7b1c142cf8148910a59a0fb27efb5a6abd77db7e3700d7263b798b7fa1c2f21bed91b48c63aff9315fdd5ba2977f2332c57a29ce13bbcb891eff506a7eb9decfa74a8d270b9819e4a145b00e6dd0ef2ca188452646807db3e074b9f9a2ced5c432fbe8ad8731a1b35927a5e06d9489c941c73046834f4577e804dd915d5b750220f581eb34a66edcba0851fd9b810e9440de6a88ce66686bf1d86c6505f7e0a73dce605284b75a3915d4c44e6f517a3752fe42916b746e35853c938024578f6585e1fd2d8f881b134e511a9ccaa7e22bfa155638d812f9c2b0b186722be88da9272aeb442ed1cc090668144fcd9f7f7ec960cef7b66cc4748e75a3156e81e291da60c0e1012501994d374274d4b40e9efb780878fa5615802cf905374cf266af2b6297c3a0a18975a3ba90923913fe8c538c6f8088784a3a6037da5e53c1bc97501f31208e285a20390e18d7b4c183845dc9a6548f932098a3f7d357407e7633920986e7a535ac8339de87168f06597c267dc7025f7c021b00c4fbf9c9e421cb199c734caebd41bb955ae452152889b267c020576dd032b163f8868a79586ae1257947ef07d1f46db9c754b050ac21463c3d246646718e0bcf7bf89d30c106b02e79dd229756c00cc2e04e06e37019f92bda8c4308f206df4e6697a9751c278f41ea84867f0bdb35021216ebd877dea825e1d0428f9909bf35b11f057946d3fd0012eaff18a0a49a3413e4b0d879bb97696b50ef0680a15f5ae6b52959bc06828a76469a040f6338943f4c8d19a6d3a8d1cc6702f1ef788bd2fd91068214e6a710ee8ae0f68e9123877155560cfe9998f3bece6f52f68333f135eb0d00391e997e15a247973cb2d184db9345e0dc0d226c7153d1b08e8f10322900d17b395159ad2e82e1ce99048c8c2bc366f22c1b099aad619982b850f90a4ddfa52c98cee43e8068e050e56aafe801b744186553b8be6043a4e3fbed0b8bb8a348bffd888aeafa846fb287bbce71a3a5c409abcb3701b6103c53e66e210a290c978211d8dd44529e0a33b3b053fde907f5bc0c8041383d9b9268ae652e7b9af226a695065996052941c43a8d234c23da498888a46c06e44202e73b02163ed971c7e89b57670d4f80aba862a041f1016dcfadcbcad253388f026ffb7dc962342a2723a4bd492c3f7ca196fb17714a459490e95f9c886c97a847cffe7a0544d8041a60edb3b76e187ed15e621c0c4da8b21c189d3a6683d37e3d6c7cca7563d4b38f1fd3c64033f4ff2a5c6462471ea1a4fa5cb0c58d9d5f88f2d6592e7e00619b5612fdd162d8e21f6426b283e2892a84fe8963efb4365fe6574d60d0b104a11d5f9c9e9121d1bd803093a5cf415c8224bdd185b8e8c70ff59502c9f90a58d4050349ecd88646a4ef8616ce23a6838e1db3b23c2be20d2c6c602a7706da4e4a415e0351e48453701282b45f361f36bbf74abbd097b59c8749a7dd7249e17342635e208b55bb23c2291c62a10ac8a0aef9b2b912eca910e94a724d4f1a0d9aaaf6e0d52cce355697bf8d285bb401b747391210742abf71b9bfc7ce1ea52c23f3a4768098c8825eea612f1d072786e42f601bfb84417e782b0976055ee382f2dfb4be92c3222728e532dd3a1485081a3a4893ec143125808f631300eab11cd4ca265b6ab75f03bfffed06f2e2a1a89f03aa13769ec0bfd8b44ea93227c01bad7d34f25f92f8b9e385cc6f95f61d2c6cf23a75184f635746255fe2e9410dd512d0bd7f947384aa1c0d106b2f8bb4782cb91518cfc4465371fe914be58805fe4b9ea13c2974e3c1623e326ad3092235932eba4d38016d1605c8c879f0e612730e593aab098a2737ffdf4da6eb0b0b3105b0e666d961c517ec47a32c8e82bd7dbd125ef27161b8d4734eceeea68211619222e6e9924494720005c97c42e2d72cba0876fb77130915122cd0a56c26dd163c32ca117d423fa7c2b27694b63fdf14d6c9b99d55a5db19de45bbe8e4d8830a57a391159cd956578c41ce8a9df760cf63a0fce3369672eb9f6d1ddafc1b6efc2da762c34d6b152112e96110db72af67c1821287df0b9a9d392f04522042d7353b2e61fdb2df725c118cf9c4d37c1751b6f62598f097116c4f5a6a98450fd702226248abc8d1f98d94438842dba65b6b55bf51c4bc612cac4d7acdf54eb1bc2432623abb30e7ba7bd3f9739cac9b40d0b34b130a4028e44343bc60ac2d94be3801a6fc37fe009f44855d07304d433399dc05e0a68c006654eb2ae0277a9e20d92a8d2000ffcc68ab47469437b6a39966c88130dd0057f8b43381f4855ff2d6f02a558dc455e2cd1dae541b3690f66e528a7a716e97d5fb8fbcaea21a5ee9ecc59cbbd7647db90519809aa5fced2ae3e20f492b52be028c6b7bc4bba24d35a646848ce689b554fe20a04d1d9d3bc2ba06daed3c5ae091a08af2eec8250ca0cfebb2e3402d958443086dc81744673bd97a0b56fb1c06ca20815aedfbb00a4749bb70ed02d30dda41e073508080df185807562ead6ec9021e8dbb3e3c157d2de021545bb1fbf2a4f220851d9e6747ef34b1cca2dd1a47273e62eb7d4e3308d00828539e582b7b28274aedb4ab70e0c9831381c5595ea768b1cce8ba0332f35c2ee12b1462c8d28e3b86c5920da8b1728d5a9951198746d0f8d564102a570ba720290aacd83d1f8c26d01520ab6d7dfb68d5c35cc64f8088bcd86fbc4f795a78c1576e001c3bde028ab908be55ff9947de42675537825b430f1361e303430c28edc349f91ed140aad7567e4aabd8afb41234c7ed77042e7705121ef4bde82aca8ecb2569118cf3b4f92a125b50ceb0113591fdee406af568f8a3a911d1e2b26845ab108c1fe5bd0a30336d7b138243ca2d0b610220b5f765487249287edb664ce032dfa763946f45dcc63177cae2fb9758e6c4cf0d667f3e1e5ac82351f970c804dbee9c3461833cceef0efad4ee4e996aa2fa54eaf7dc7c73e462e958dec905b66d3c074520b848723b4b55ee9a33a0c6847d714d13e0ffc4ff0868ca4159ad12336c4821ba54a6f5a86c6e8e230fcc3b2fd301be4eccf3bea78b66623c4e472c7b41e2083b25179b1f7fee52c1cd183cbf2a1237283e72335895ea17497dfcf5cd269348971a1163a886f1b6eaed77576916cd9c999928f5612b8de5f324a17884b8a3bd7093fb3793af287bd0c38e3fa5eb583ed5de01a66fa24cc04dacb573e952cfb8d2dd2060e934b6d26582979056d61c9b6bb6d426882b71d2b8b09e797b8b47b3d252b2d8446a52001573f95e45a356af3f36b450091303fbe08115a9a28060652c5441a2878af4dd95d8a0bd5b04694ddc52b34e9f714ca88350a235ba5525076b06af20ab66e2e0055b6c98da419a5b9592b58b67547913c04206070a44a8af01c2c515e327b066d95ee092d581ce86a36894fe5d4324592eb7ab7715ab8b0ee16858636b0275a97822d0dee104dd574fb83557adeb93f27c39beb28cfd181e4f9dcfab60562ae036573e69aeeb40872da22de8c8d57ba45c446d788173234ece7b1c359ac24c9f02c34cfd850e353b30f2fc6581a79b4c9e48695d5a5078d94698b64508800ad19889d083ce940f2da9e740876bdafe2da89d4721ea72d9ce9a979545925faf327af232a6e0385d6c25bd00a4218666e72a54ad8a767277b780cc9539674d34559644560f39d5dacbf79ee4538b88f591a328f1080106a64cc3cc4b1afd7b0759b97c5947841e5f970a1c0871556ded01175d5cc159a137ea36331c88bf9fa80ef350016d6c74f4d503c8938767e992848337144ff34047d271897e15d1f1ed12842d543d35b5c7fe30233265802f8d28f767e5bd071f367ff62065f3f84a4d30a5a18d1fc7533b4258f1d951563fcd2c037b5dc51d9822f97ec9e6588b24052dd30530124f1671ae8e7a138bf752431164ad1e83ba5501aa0edc80b73aee438093f0a7894b98be84067153038c7aae87205ca9e7527213306b100833f822e84bf8b483280ce5a9908203f41c7e1ab242953b9e9176587e9f42c3c0570aec0a8067b2e8f89d619bb918ed9063503239322082541089b08c563f5a28b5f15aa9a1752517b181d8f3d8c2dba8d5c5d1dc638c5e44dc6b32e3382dadfa1f6ea6e38b684a2e41b42f3b7f911b940b005a7c81dc284a28b87fb0cd9c5530edf14eea3ddd1a3fd7501f8e8b360074269ee3c40feca9ac79a810a03e2e24b3d65c5b80917b63a9c51b6260c8f57b88149a25d2d941d89a97a31d0b3409e478d077bae0bfcf98a659b5a56dd7125fc10d452a9d46ff6184e2d02dbb24e852924c681fbead04cd8613050c628d3744735ce2078a76e5e068d7993a8576b51cb4e3722ba3ca1a4a9fc8899a042b0d2e4e5a17a71efed3959027cfe6aa6801c4ce4568dc2e86a6b0e1072744d8cc7e5f35180d86121ba1c3e961aefaa721513cd309c99796bff03b8ec4d2dc70431e81c722e355dd6aac6f4cb413207b4c05090bb75bce8330dcac28bb4033ffbc5cdb77b0447d3f9bd9b946edfb30fa011511b29f4f467313dafce381e2f0963445bcc5cc2c45c5626786e2a57204ce06721d16fe6806cc75a7afd64c62c68715ff2c8ebf3c00774fd1c482c0fd539c9f9cda349a55e43b87d22a66dd7173f286cfed6d4134479fe814c493659eeadd3e7e53fddf61b9aa173d74186c98074d95683380af156a2b1800a75ed99f18d832d9cbc55b2f8870a1a8812095e29ecad70ca72cc1cfdd3cd07380b0d0d392627846f655326d41db34e793a34da5737f282c467dc189730963c1c97d93cec026afbb665a529c80099cd1b90cc44a3a29f99d0af615e5898d82ec1a0cc4a5957f911d9ab912c8bd0508e5e4385fdf25cd9f4f78bf8e962406caf21d1428f4978e559fda23718be33d1a46f04e8f00fc81f283a97e7ebafb08e36bdc9bcace258413814813cfb744408190dd2c07e2e62d18eab456d386595b8df44983c957d01794edd592214d4d7db8718724828680121ff9b990f983dbb55eeebb521399d8551aebd403c1facdcd932d61ee37b6c8cfeb44b0cac005290ce89772a37fd59f00868cdb4617b3a271ee98115253955b472b36bf51fd6fe0af837d3ea32a0d0ae5d1f5fb76da671135ad08e44c0d3d8f259646d916831bfc908505b1215a6a4a9531eb53e810f2abd2e317b570e7ae03c1cc69e205f1f99818721ed3b5efd0f96b086976aa6bbecdab417437d8d41fe5a8d25a58b67c92fa21f55e827746000036e1b6bfa63bc988e03709f597b65615e79eb67e8f7529be9f1d52e641527bac2bb2ebc66c42ae47802dccb707f4b301966dd10ff811eb2604250d49c75fb680e49d4ce9d6f08342c1893a4eb666e0cd450b5cdf8828d2b7969a02c220ac4ef001adee047dad401d5aab038c66e9b4aa078c172ed91b86b7f40807f51319853ebcb4810365085c99f6c28fb3e771eb0cb61855a0ec984fa92fd525133f5f260df1fbed423bd1d70877ebd624bba8aec941a427a2ce41ed72b680663eb51039d9d4b4df2357f0620009e0b5e4f6cd711516988f42076bd88ba69b49b70da6d474ba7e9aefa46ecf0e826c4c7ef1084cc755a74bb48dde29d3046975872640977ea4bc0e8bf3efc144256bffa9332e216667d328536dc2999375e5863ffbd776dd5c4dc0ba0c2845bcca8d443793d23b556729842d2872d241065043341a7de5cc5a7825b5f292ca34f42cfb083774255c11fac944a448433e5a7a9f341e4cfc480e5cdbb27ca2d1d5c4c4f526303e7298df9103dda916180d90a2f56ff663e431ba9289687e76c5f740d089bfbb8f38c0b91fad1f3d3e6539fc9f9c53f5e887eefe42de9cc06533dcbd8b6b4fc51bb8f754cec69286aec2341a8495463ef0d2ff8a88839ef42b1982513638975031807d10b3ccd6b8d8934360a4b08e236f99e1bbc961e628068c9af62b465f1881423e22e5b568fa4b4f5e41717ce39d9b519eadb94e97b83b9e2c31b76e1ae2df06fe451e32911be846abcfd78bc511eb390e7665fc3f10b3bb3f35f84d91766f85623af08998a18441d3c2b6b67a022e160b5ae953c2811f34e84a430f31987d8199733a4a0218819ea9b1d1ebe225627c92892ae4b5a6882a58f7a51e41670c4436343169dd00213c5cc8908d4055ec0017014c789a4abd63b899b0885dfb2f3304f2fe6182feb77c82c2e8c65370bd762ce502427a49cd4822cf89c05ad0487984bef152810eb18312ac9c935342f53f4844c6de0835321944c5db9606f352896c9b8c3d884a8cb31d566a04828b7c3aa3863574191963fac0af1ea8637a9888ee3ed3957b29c7d90e03f5f76d234021b8d9dfab71b1fc535281c7805fef13ee905c10d8dea70052a9dbf0a8093bac934b48d8864ee4ee5c774a66643e261fca29b23a35303c1813cf624c561eb35e2e24e61a9c1ac86bfe288c16b9d8b0f158f12c54a1c1ef2aa72635a8d82e8e62116b1458cc81479b9a4d084568983ccbd415fc1aaa45b0bc7e3a04f79b0d8a8102f000c8b2c3bb24367ac5792d4db8fd3ed4944ea04bd0767f0e941715516d571a20413d376d045c3f378568708d5c038b3d277ee2549742a8583e95eb5bcb50c9b7ba37be0b8f17d4bb948d97103d66255ab63904a5af9344db685dbe739e544b06a5a68bb38313ea91f42e1976726d10fa06800d8b04a584e66354efe95d42a60b68a070dd16b877278ad75a04824aa727c8f5cfb0ba66baf24ea8023ccd91a5c0c1e206a474efc56e3081b85fe4477e2f6ef718406addd9d8d6bc91956f28bf73fe0a45180c5a7bce5e1be0527d6dce44d6c8c517c0282b3e372932ad9ad96616f36e501a2b9a97cadb376fc53d47c29f165a8f506bf59d2474c0c1eeb2b3d1c200f6427622de294a769e2d921a3970ee8bd91ec7a7f1a5f1f02b817726b94e62061574826800bf98b9d888af9a2fd174061c383066060ad2bfb892620d5d7de83e8dabb402e74b7c23daec8735dcb4fcdae2e9a04b0f0e6ea9ccc1bc1159448f463bbac1ab7745095c9766229f2670037e337b9ac64c295b1b587299cbf857db8706d74ffe07cfabb2b97a496d8ef5f2180355b47fd24baa319a0001a88f24850ae50a691945f22f63d4fd57a04797b1d5dda54b4b23a2b088cd7d794f6677d31062b51152cbfdadfc70069dd97fb2fe26fbe4336be570000a24c9b464d944d9ed4dc363b4cb292286eef889327813e5d0bbb68db728152678e866d2f94d06051ed4938ba070d4b767fa9c09659d31102db316744f51713bc798232758599dbdf8ab45d84369d61a11f69fb9785930802ffa8f09f15b4e1977dbbf8d5426ba21336a81e6ec30fe608f1b5595e9ba6f82b6841c7be44678bc31b24103abfcd3e5db0f52bf12e070be629d3ab7e406c3a3a777fffbc38f2a8f65a901b6e3d7da119e2fadbe176173a161c0abcde10b7add2a93d9f6f7a5de85eb579afb2ef8d05712de2be5430bda8d31a82121e4914815eb1278d4b2d9001b7ffb1b0d4ef782901a1fd1b0d44571165ca49e340b38403cfe202823777d139114810fd766d9937ceef524411ff006f61ffd8808c94173ea9fa7096d31773b7e57c23274830778176ad1abef6cbcff5b192746d590606a4f02f58ae38d7090851bed54aa5545b4f8278afc2ae4dc6a6775b30a0779be44ca30abb1214ea219b3b50080ea9fd22ab6cdd9c557d9fcfe2b686237d791a2f817a9de6c7dcefcb311085ec653fa2a525a16653580be6238e030889056cb7e1dae855a0aad650c732f083d65eabc5e345dc40e58941acf143589b97fbad235fa9b400d4660ae0beaf21f4a2df9f41174b2e64fb99ac205a6988e42faa6ad17f62aa0528317677e4bc7fac01cbbfefb38d4100be9762ea419edc9e1a629322df73ae6debbc07ee032f9ac5462960590ea8b3ad16f0a87002f723ec304d0377a9abf8dd2db2d51063c517b9d4c7f59f3d6394d583fba07b1656055417d1301cf86cb87badda69c3596986621a8805cb04c0a2508b1fcd7ee8fad80dbb144a603b33879c6a8e82e1f430c0d4f020affb816f1cf12dddc7b7ce4a7e22def39be9ac3e027e25c0e570d728d18233b9d649e1ec77934edad8d740b646513746a8d138958d989d357e6b6f892ecaab8cba266d248a06ea64bc28840ee35642a28a45e493f58b7a46c81317f50a966272c431342bcc9b500743b53529be8204c5985cdc13dd4309814659fdeb63dbf3160d92d8806460580afee027aa21fad904cc1c3a779a28939230c24693b66021b4900928be31cca9c005f9c447079a70d1ac400d2f639e9e1e4f21dc82b845034e9b62d3d24ded35a3c71313ef5c23bdb2ecf49f4c98ccc77843961330a1207d0251c69efdc10ab271db361cf153f6498cf35b807c8ec595ebf1dcb72d92cdf12f97f7852fd2fee07afa231ef9461e9980c1f988bf04cb6f9f38d2b6f088474f706d6c509963f26cae82d27d73ff2486979610f7be786a4d2bf7048fc49c31457c0a360c4207df78aabcd2e634d828b40819dc81dbd33fad76b477cf2fe253518e7d7d38ac68622870f877ad69d1c9201b25249fe8a4ed04e222ff1edfca0ed0a95a81fa1c274c745d2e5b2c43e785c15320a8368cf196a1ebb0a906d23ee845ed18d1875d56c39d8585a7dee72a93f478a07dea41ddd50facda4e94fe56604164a87469978a9ebd98eca6d8200b4e288518d7d391ed542c0c7a5c21f3b6c2fe273bbc8b82ac99fe3b8557617fb87ca9e17b514c737ec098e3d39e709d3c87b0f1df29fb9ac0daa6304d28924acda069f0b43b092a0cb541eedf12668daa0c40fbf458233a9f936db49d91cb330633255914912a019f9a63c52faba7ac80e55837174c4cf6bd784703f80557d4ce5e7104a0e422a39a1e62e635a8414462d000e00e08626f92f7c8ab63bd5f39ee433d2a0f5e3cfb990e5794543a097fd21b355fab3828f4a1bd37abbd68506788b6b55d9c3a2c007a745660ef395e1a3adfeea5930205ab2414c01dd3bbd9409f6ccb3534948b1171080551d9afd50447b8ba15a7d777cb95c2b329389dc1ac7fcf1b7b1f134e020360ccb8f06c42e879e5d67e0625ff27524998de3a65f78ced944b1bf72117c5c8fd8f029decb7762b48a90a037288ba0b6bf1174da09812cdce65b82c0861a6bb639d6f1c6d0137475b191df73e9fddefbfbd734a648b331a37a7fadfb1c0f2def581c0e92ad98963184a0ec8c6b2c804db815d9cd2d5c89fb8c7f4eb279202caf0abb3357745aa25895a41a79e49b024bfa03fb72188bf919fea4c3e611198c85ad42bc3cf941b07d2691eed4756e2e90500cd704548910b19f36328cef41bc982984d4fda903c83a408e466b910f39ee3c64295b7d19defb08194f9e81504542caaeaf70bada00728c353b94a58caf992aef65e0bea48e0fa3d68b1b4cc64ae5c07593a72b468d14318e34d633316b216a799f48ec121dc79173f54482709f6bb8a1ac61f98ec217c71f21c0b30eae12e32b10d33d50c7976324754955efa646e909cc4d2fbd45795fd889d687dc71c18c4b278e19872e54cf0fbf3e24507a2092c0da2b26e8b6c24fa4f0af5e45e81518e9740798591f21bf5cdee4441a31dd77f9c451fc895f55aa644b0235f6c78ac7302167e279c657df833573734b8bdb1986f349c9c50573850a41c0cd5234323f955c4ddcdae94cdf6b8c2af722e1ab2200ae500f6c3d7516509148a7744f04a50c46818feb9e1e42f9c496bb91b0530d63cd997a7fac5bbe8960face443f7e365c48eae65fbfab28f91de52a3489dee9f4a37ba581481a78905971cf14c9ad74fe13dc2abf82600ffe1f90f637440292585018cb5628c744fbab9ce7716ae0affa8e79e0de3edf6dc15c729d27a376b96e3e3e804506d0f2cd85c4b89aa35921c070f5a2c0710fa10a59927febdf434ca1892e2d9af5c91cd1a1f043e81a8efb0c88f1af3d6de469fb20cd8b7eec54db50ad0f11b342035ce0da5598d44462c70e0bc0e62120c45877268bba9361bc14451fa6ef5d5b96465ec7b090ff753b7f124c68212d3f15374b4ab00bc5d6c87b4522c1029998f9218db6694a150238b6ff4dc4895cf96cf8ada859447742ae5b656ada2bb6d7508eda67a183af84f15faf1b71bda6ec220eb7e422a1ab7aad3cdfdd78dc82dd2c94cf6e61bbfe16a132530802f72790bd7cbe1aa452c81169bbffba489b8ff4bfd312986f80cb2ba2a6bb0300c8d72abfcfd2af8a1671199ba512d3abc3eb8860254e650ba2fb1834059fb8dabd1c3a3fe1a150faf1fa62480d210fe503968a2d67aaf273b75406cdc7ba96633641e0b8d8f3e69d2f0ebed46cead7c9effac0ca37123e6160ab5d2df53a87e4b1dfa5c3ba3414ae6d88e59a23a6880bd47918c078efa22b8f4890951072bf70a34717c57096976705a222c70016eae0c822c9dae2ab01f6fbe68b54e1965b71f30011239d0015773c3ca873df85c93d5cd05b66443c46115fb69d08fde41bb9435a72345d108061f8f47f4d2b06bce8ccca919b053594e9d52dc17185fef53dc652350b2c50cee5c5edd48b458056ab3215be16241b2c1b16b31e430d8084923b880e92107c22a7f13871cad42d769a96230a68973e68ebaf399b9e8ddfc0d1f747db2a5f35a3a4476bfe7c2e9429c63e5e64345431ae8499aae332a10bb389e2165d37de3e793ded8d9a344850371d0b3f20208a350da3f4d9aa0ea31f3d3ed06431d859ad4c242d80c164a949ee0ff9d3f4754a64020496e26a5729d8158f36b66d2babd92647db7a7bc56bdcf130a7f40e54b5d1d81a06ede8c1e52c3954ce83374065dcff8ac73c480512ba036febfe59d6d626e320615272818fd6e17bda24cdaf0a73b9b61489e40fef6abe980f9d20f62869756e0b14ca43a7a727cc0f45b1f58f419d5b1a6ab7d328983621f42c9b3e213d61b4b7364d317e2638499ccf534e051a685b8799f3b277268b12734bf751157b1b6d3cd274debc10c182d706c1b637187e9ed082be4347982ebdee23f49ef253191f63b66fad65be6c1526c17469371fb85d76fb74f2baf054d5edc1277a8cc0a2badfe263122fb22fcf7f5451417dd7e6a9055f240b5064552b5adff49c787c3af15dffee1779a8b340cb66be6fa0793d8e0beefc859dfdfa5ee80cd592001b0df39c4e762a8a2f8be6c09f0abd51e347070592d9298828832548cd1acbbd863e49c5500efec495f6c3d5e5f0a1d72927be9caaf19ad5f79f7d86174b2d9cfa8317085fbc189b918a5d08778900e876f4f01c0dddf16e954d3aa302d4f01c031ad1dbbb913813576bd0c317e8a76ec06573f043a4920ca37ed25dcb13d5eef51d0cfcc5877a0d75980719b8531ea88bbce32d94a76431cd27faef724beddbe4094c6a370799c23761546a643737ff87e0ef9eeaae83374671ed1c090ebc113bd00771e6de203ffafd51a2287e49a55209c09249164b5665edfa9d23813d065c968c1fbe8a46d7f9be270d337c1413f966692aeb80b3231f24950e014241c3edfeb203f773d52da478ea585f68dce6cef3b13e356e05a197cb7c9563cdf6e73a835073b142bfe7fb121f7d5875beb24c580b841a69ae8801fb8263a724e40ce60cdd02f4a3f61c3133b7888cb5258c18688c276cb072d8ba8fbaa21c7a50265a7af5fc2155a0efc3948ba9590df0b822ba288b5a981395a11a721f1b338bd548f953ebecdbdea79628c215b31a3f44d5493c42a5ff2c26fdd43468b89871d52b9d28a99be14f01c5a929dff61fceababcb02fa83b25fb2cdf6a847838d8de9eb4be35110c8530b7bf888d16eb13dec597cf1994724d018800b30b1bedf0822e50272016f45b73342d6c737a857b872ff7718795f0c643589afc2955a4720d9155fd5b0897584218fa83bb4b087f89a1d72b16f58d30eb84e4153706d9cf1fce6275a0dd82173c146cd2621ad541558fa30794b1875fcb2ed67412dc87d63c771318b6f67cbc2490530c07b933a48267e0eec3e2e3b386d018e67b37224951cc6f75f075f6142aac2c3dc382780cdbd39d00dfab65107cde96d15cdb8ec184464b05869c64bb64b5a1f94f027ff66f9aed8e4103e9afe5c0c38621660b5ac61749076c5eb9716a3a1f263e8a0ea69215f000ebfbef93cb421f32774f5babbf803a8f4833aedb5bfe88c2904e9aa6a8231b1816c4bc8d0152ddf808512e9c83eda316cf72c360f976c13894761f3dca9f924cf42a1a1803c1d546c245da60930e22b34119c9694653155f0dccdad18b59101498c76f99be8f08be498783d854a46bcb38b2252018c90d453cbd9ff71f912d109778366c4f579a619c96b2f85a7c7b66ef9fcffa6ab9de7e959863ae7b4857a9f7fe59ebd14d6e37a039c3c70e2d788e2cefc54f1f6e31251b9210b0492c83f073bea0e11dbaf099e478819b9a48f0d2aa28039775f3bb083dcb0fabd907676673c0c241a95dc480fa81339f45e971e92fd5553d1083680f44b907842ffb95f8533245cdf8894a8bf26c78a96621f27d4db5c376508e21d371e0a2efbb263e53096bb6a5b1f5b154e5defb182fe042ce2154ccf90cce41d0d493ba9823578d53adf237f11ea4f20a247b5e2e1d89943ca9dfcadc8506fe004301431cc7978cc83a57e7ec9c7c789bae0aa3617c2f60bda12ea56f90958783897e62838fde05efeafec353fa958da0deb130cfe7fe041e77a6edb2314a96f8660aebd0056284b00b45b85cf62965e439b537738cd8f8733d09a282231a56c3b6dd1bc57dd98fe368afff6334bec868946aeb9c1852e30b2d1ead4de15b0a40e0007bcf7e974a31110c4f203ce4be43cc85303858d5337c2b02f70788b4d93fe8518d02c0df8c54476396a8c8ce5909b3b46428803f8e13bae424527af02ddc8127c1d7dd18d23fcd0bc7b0b457caa8701db8d252de83a6a08e07b924a4e15fdde638b5ee9d9c6693237018d3fa9d2a6dbf06aa4c33231e77187ccf0b69365a5c1a7eac06b9ccb80947b3b6dce1168c50fac8dd5bac2b264d4700bedac4286f2689f04f35ade225edbce7226dffeaea56d43cf41255c13599cc990713eacb0fda6352556e97fa47ef1e7c96bce8b1dc841486e0004054f1a4ec379ef371d6a2dcc589b72c32f3d00d3ed0fa373e88e6a0bdbf40bffa6d6a4ab2f743dad5ddb90830b5b04de37420f46f2a00251129ca181099871e1ac7f89ad9827c5dc47e8d5e8273d425f8ddfa0bfb79026d26c88b5c4bc981cf03b4cc8b50e1c9e948af03431ea6cf109e641f9218408b8101c98db2954401351d6fe089dc0175ee5040de8e631cf331f4735f7ae321e61ca619e119dc76d8cea73e700ebda1811113e1ad0551cc28e5d95f22dd74993d3070fb766041f69027a5f86cf46e94bc404d38e63bca3c7dda97c0b83b486ed984f1db608bebcdc0f98c9161d6e4f4f0349bc4e58d79f0ef7608401adc5500c00a6dc728ab2b4e4450f83313071dc63720851ec77424b219e5e5c81d40c44ae828fd00d870e3f0c5bb73a08160fbb92f92e018c876569fb4e97b560fb55ef98edfead006e72cf7ad0d8c4dfe157c0d44fa748c953dca494c33c74b41bbe6132088facfbe0940022867716974fa913cce0b9e80956bfdb792dca5aeed0d624b92256c977e9d2a9e801d3eaad543a03b67acc3825e1bf1ed868803d4fd9ca5e8a42dcba757d39350a02a5e87145208c0b88d9a9053fcdda8edac559fe712f4a44a9060b7b89c5fe506924208e00468ab2692784bc36e0702237225c5f77123e717f04b9cac5ca13580dbf83b5c40ff75cafedbf049c18b1240c064e544d352becf6efa861bab9ff9704ede8ed88cf6660775a7f0e054a88af36d998a563b80001ab2ec4f719bc0c3e07a6eda11025f37a37b924ee19faa7b2de5308e9700f610d0d3d29ebde7e4d6ad735ed7738d40ff5ed7b61f86c4eb3ad3081b13f6ba539bf71d1d60662450d753d0e6f14707a712aa132152b644ddaa7397622b48a4461d57b7d5d3e38c458f35e13efdd7f7087ba2876164d661eb5c27c39079b6c4f81b79c561717b4d2fc122f814d43bd11a4d9310dcb68b3d5173ba633e618deb11b1d9aa602c61c5f9b5d42e627d986efa4d6ad9fa271a87d166696c3adc8245ba97ef6e71e9659dbb31662adcb5d35afa0f0e82f663573a20ac7fac6cb6a90a05f510b0bad7c3511dae0f3c8619f8b9604e64ca38727cf29db79e27dfee9ec17b2503bee2e441043de70e97b1d77ff5462741194a8eb86117dea99824f4c63e7746ff58810e2be95d62350fb77693fc3db29240c17e1b1f716fa5a8a2cc3839ac952648a56fe63477e5d090170cccbee345182a6c98f801c1b928d3834a658738f605b0ad8b7ffd1bebfb4a7a0e053c4812d25c4438eca246c590e6fef6ee9adc44e53b41c12c039740b15357b35eeef461d3b6e5d3df0c8ba27434f3a19a77c6ab80c0c5db321d330785a5b8bcd023a35ea406d4e9ccde51424fee20276d08e11173d37b86cfab13cdf4a262e9455797998dd9e44e684fec660a450a7c8b4e7c0c59eaa6bb46757fde3d856e39ae472c545c1b80df14e9eb2a5d22c471740d425d23782751c12e16d65dac7161530f2b7a71d87bf00f72e66289f458022167e982bae19ce81f3ae30173bbfa1176e324e389c88afb7daef339efa90e59b6b7e1c7cee2eac37b4e3ba8d2542805ce49a3093b0ac552365a9df10ce752cc92e7b49128c469c39fd810a2e24633fb010f230926c7a3a64f89f988242f127df25b6ac4608623932fa079e3c5b0a10f898400816f40a4310fc8ac07afe75459fe8cf1fad3d97a99249705fa376c080b543c8b7f1c7b06c91a878cf56b84fe54bdb43538eed959040a5595689c2b4d647246221af176669b489f1e5b90f8a8c9037c4ccb63067605d777776d097dac4e13b13cd948df8b9605e6f9879fd53cd4f7710db253ac76e46e538c9e66f96cf79dd676984476c9a4733687c9f1dfa54d05a3993cc70ef74ca5d5bbd85729fc1930a2553b59f2350b67a60809b37fac8535a4ad525b6d95d232395601058189737cf29f22fc5faaa573d941aa74787fb922317f3773219dc04b00ee62505036803dd59a2c95c697726b0767b5546335c9b13e2b01d6bf8cef5f79d45f85536c7c186c3eb0a261e5af5acafc0f83852d195eff38d553642e9d317bc5a91c014ca88a362305374bb00243ab6524c8801d5890d7f3c80287cba7ac135325547ec1b1c8213ebcb989f586ef802f85220300fcca74b677ae73913dcd0fc0db722784abe4e83eb93c7de56a8ef300c5a51372c8681b43b03fcf62354e7d4b1df5e304a97c3dd5849762432abf3fb31ab47982f46b1c4c33d6fa8eb27c39f3456760005b77872717586e74361720bfab01d4906c8cae2da6b9e4be45c41d4cc7ba399d6882992b91219b7a17ce3f29610706e419cd66541745f68c73776a60831da00bb0fce8439bf3e875ddd77faa383a87bcf554e9a9cb3766238657551c736fbf9c7e733a1f5b2e620d53bad0be4587c9db8f4940ebf5e4c2e6afdc48208a928a0275640e3a08283f53c48a8896bd46f42601650fddf1d162ba28f313497c6d6e59467ed89a5bc70f18095dc5e3122017dc42294cb4dfb9d887ca20075adc07c911368e42bbd8ba15eb5977498874e61fa6b112b9628bb45f700034860ed348de0bafedfd3f3085227a5f0b50ac9ec82ea5f2949f3a5768712174322b76309e4db3a5f702c5190212ceaf4d18ca8f98a0641fc0adea7a5c765ddb8949d5800eac82e00e68a92e6e6acf2e26daaa3107de7545bac0cdc81107b4b7a1c83a91063c283ae076a871ee0816fde6097c30e4ec5532d751c1bfb484be6f0c71cd1151041d329f12576e36d5609e3cf3ea20c631be9e19f8c7c11208e555450366dbda3ea35738166f6cedcd98ae64cc86ce3243e9af29070f97704a277adc2bea8de8dfd17342b400e9f8f06f07b10f373f650034ef03f568d84954f7b159104596ba95217550019fc56f7a128f16ccb8f1336e173ab7c21e40e5e6ec38bfd1ebf5d63f865fecee5459c8ea0c4791d4e7dcd3675790da546f8b95e77935da183820977d466995a98c8aac594a65d984dbc329c39aaf808ec6f9a2a405b682d2b91b480a6d9269ad8a15815f4a9fa16a7b7b432d4346c6299118e684c01a1472e22237d6a5f30706badc40168b00120747b5796d5a9ab294ea9a29f868140abd99ff9bd7f77f1774b6de0c4ce9cbab6ab673ded1c462301718be6cc6ed6c7f47b7f09524918ffa3f2d972d524e5be14145426c4b66d1563b10b6f0e16ee18b8a67ceaca183c1a969f553388c0496e2ee6ba7b329218b2fb4885e87ca9f3425fe3337db8883964334913f711644882af10ba84b2117aa3601b8fa9dfef76c6b7b50960a835af9a905336e1c6206cab3001a488d34a2478758d7632897ef4f1c220861da9a78f30b9f6087df7e940b8d802776f55216fb169e17620b14dffeb8d55bf6b94c18ddf34da0c3ef76b3e3c40ff3e76f81f750098b510dfbc2993dbfd25a2c42a1e3be148625b3397e44a91a5c229e3237e0e93d7b96a679d0b7e47a6dbfa84b9513c98948e6c5e2a4aab7e6f7b73e0e9055fe35b8a9b5980cacd1fef3d73f8cadc631e493345ca78f6a4035abd398d98d3c5f83a5458378b013d37286b0c7f6616f522bee5606be1e61510724210b5d46bb88178acf75bfbd041cc0302b7fa2c08fded90cc2043888e2f9e87a87c2dedf3b75bdb176c8a8beb7e39b29b09f7419f942f59bf816edb3663e013a0a223009b4c6aa7a37048706446771389e0cb238dcbdd46265da21220507c0d8198a98687bd2ad2e20c3515e1ef27242113b50d1d36ac6da26ab05b04f0e92501d713d7b55d946394fab98e8f649dbbc1b3998ca5d9627eb13bd046c0a79c7a2dbe411c2c1c9d2087fc24144f60996df3ec69b9e0d4e9980416d064ddc8e16409548c5e734fcd9faa9de2ae300a5b4d8576e800bf139ac21ebc98cf01623fde0a6fe4385808fbb31591393d594a2d6300e802e7efc639c67c4f21bbfc9b9fc034370bd18c773826713ab2b5cdb5b673b53b63516a64217e15857fb273cc2689f4a4624b6e29ec2be3fb6e3069169e30612f11079249099e9b34c33a2236783e243bf6441b48fa45ef1c138c8cee11cba6bb81a16dedccb6ca52da04bb3da24c88670b46e5148c5237024a6f0779b483b180c5a7403c53f9a795a4654f203d3243066445d6ed29f2453cb6ab322ae6386062b330ccac20be8c1a32a62f0d89ea972c10e3b1a53d298ac44b0034f669755975da31e574bf2428c2f99f21601fae43258287d7b6e4562ee036c75a937f5bece87a2892ca048f75823586b5041e3c6b4e915cb76cefe7776fbffbfd7c87704dd164691708130c98c407a890a4f089c6cab2a01d3631fa0c8c4db192fe055ef9cc113005a22e2780d8f23dc087a1ff01af5c8688adc9aa1333116b44f1cdfd8071a226b2c5c85214c8faebd2e2f34f70ca14c644eaa2c125f91e2d84bdc1984984a4beb85ca2ca886f97ab24760f4e6835ee6ebe3e79d2def0815e9a54f24baf7af08de72f2f5e9008f99ce21781dcecff089065dd4737d3bb51192544eac668a68ca35a9fc56a2ce1a35065d4b721694fde5b2c889b2bd8063824fb4ae881f693724293178b8bab33eed5f254da82f9320b70b2cac079137da816df46361bc6bba9acf424a7b9e3963fb8579c29e2cb2856106da96cb2a2ec9e8ff0330a1c1dc6cc795709a909c3ce2c4f1ff037ac2141a3a62d24af050e3cc92568c137ac1a00383483804f7bc948c5dbacbcecee230c685c13de5a232afa989cdc2dfad4857b936c7652fe3de8703fbea2917a3160f76fdfdce3f8b21b433a7fa972e583607b8766ff83e409aba7636433544561ade48d44f52a579006aa211a98e5522f7b62ee5e175c8e2908b5d7b81da2d5aeb5798ba241558cb7ae6d6ba10f63aa3bef507041b2e4ffebb4a12a34f0af0e50258e6e5b81561c8abfd0ae61a53519e3e6d4932f2ef458b78c1a4e67416c3490c4353c452b212725aeb90f7921031b5215830e03c43bfe322ebc20ea4e38b3f16d73f4cbe981ea709c407d57cd39f77bc714c74eb9971665005b731603b0bc7ae05a6bc6fe0e0851e06ea20594cf83d9d449bfd9d94ab2f9ed87eef3541c9ea308600266629f761df2eab779a563ca30717dde96295b25929bcf5ff7dadf55a402c5e883fe828117a3789bd3042bda385cb07877e4c7cd0a9566158c7e822e052d14ec4532b32a06206574805eb283332d52a223a6410fa215fc065607b09b8ff42b70b261254003524a7be1f3db461887d87956014fafb8b6911c2ed6845c5eee75ae72f005511a8f540805e4432210443f151292aa1ac09644941f3deee5b9d35958ed1dd05ce2683ffa68a98273562c849f10fda3bd62dc69e68ca58d4bae32b1f459018c8e63936c9189df091a37aee8728f88626796eba3436099d2802bbf384bedabd9367704737c9ec421a15e5e4a89c064b2d0b0343dbdb06c2b22c65b0985135256df260424e4d486ed021d51356b81c197fc942c3e47208bbdf269f5e1849745ddd26f6929e3f1553f4a7f666947738937e4c283881576d4964414dde9a1ad7efab604e5980bb25641918128865e77719ee46c0afaf86f1ab13ff7e5604d0f287de9584b23363be92c25327bb72622de13e129cd8368931ebcaae24c8a52c0a80fee2d3c999b8c424325544531db04282dcaab440a968e7e09c5c1124a0393963c86c8bc9a53bc94a5a53e0ffd6499ced387ead6309e0d9ffb0ae50ce3964b306fb43018d5530f183cc9a5c756e58499e17f65a9897a3e2e45d05b5332c1427ab6d68f391941c65589eba65faf4f0725986b93690e906ce32d7cae275ad0a66ed1ec7476fd60a4ed7bcf4861add8390eb69b0052c327126e5a70bff0880797b6463f247ea0e170edd42880476edd5ddefe8a83f04c573b4102767994f971b14ac193c4b74d1634be6fe22fae43abbc6fc71ae6e1bc1cc70914e5f7e1713af20903b6a1363d21e36b48a2cb584a3ada8449746b8381d00f7ec1f323cf41ca9dd4c0d44c8bfedfef097537629370b5f18d7dc75ce14153f65b052baefc0f30101c81075e0d9b0e12c89906a46afdada97f9d5dcc7774160e41a2233f9e51a49973932f61a0e454236c38c7464188fd291c8c473e7a03d4835384ae5eaa24daa0272855080147e7d7469b51c7e41d60ad1582e5c08288a89d636a91e561d0afde75b45c606aa1814733e944525f58c84c49c15e33f9d41cc36a99af19b646cabbd53e9edbbc19cf4071d345b4cbd53efcc7493686a28ba0a1ca27bcd35237e7af020414dae9999b9cb28c966d379763a313377d17b770c3a1cb9c1364fb185ec1f87b68fe03926e7a8f3ab1c449c3949d7b223f45a3c247fee725d413c64cb5b19a1c961733593f0affb667ad44169db4c24264a3a98df2d8cef772b79d4b8468c9ed659195d35259cc8973c0f60a2b216f4308a7b99e73c6343be27544a055d08a8fd80d1bc0a0f728a217890eed95d843025caa8a4e5604437b23c729f81c7596f3da183d1a25fca0f5320d3d41befc1f821d30fc230014f5844b8e8ef7cf8bd6e5a807a68641ee05bf63579220bedc59a7255d7c740a3c4f88300bff0372efe84ae8308b0e24f5389431ac13ea05ba07274309406d9649459487ba16043201eefc8b2213a7ee83ee607a2f8877dcab5a8a1eafd16c6de0b5e13ecb164feee09d05d322d5c5101f348464d91ca6fed48a990338ce600795a639b7614486c333d61e0bc79d75251c0b973f3199a22fe5ebc4b090458bb3f4e2c007ad1b484661b0f5ce3d3ed09841ef05bd92963609e87135cca6d9c20d60efc4b83fe04cbc6847ec4b3afe433ebc952039bf9acf57cf51ef4386191125df79ac7e333df16c24e9658d707c1def571712782490ad4ca8ca09fb20fc6c6c8e81a0a1420dafda4a69cfe301cf13e92121040d2e8772762016fe4eec9a8cf8c1ffb110efd4be38f8664fd08fdee4e8c06d7afba674e02581b52a3ae2b0a0050ee6ad64e40b12a5299771cd78d921589c87b618f57d53fdd863ac17728bde946ddb61c48f58038bb66ca761643a7da5198ce3a38e5828a408c23bb1e0f775d20b2c95ea3ad5417a8b445208bcf14dfd133321a18f9267be759ec260b06b5664abac287a303c366cb17509432a397042b00beaa047be30564aaf5d24c543194ef4d483631de760e8ca6eca114c8eb0e6fa1217edb76168cdefc448ceadaba8e8439f4ca3588b59bdbc8a65728c188ad38aefc5ed261ff40c887990cff18b3d9bf787379f31827d8d6ee5ebcba992f470d1aef8b37fd27947f31325fe39bb65059522b42af4acbf9c76607a186040844105e48da1061a9d52c010b464decf864681be2e27c330bc5c3cdf1469a50d5ec902e6d9e207c72c3c849a33421feb6fc43f1a06e559a6e8750d182598c52aa01d295ad18233980a456ec60af40873c43c4f25c8b6335234d7948a7b206245729d56feb2721fde01422330694aeae06dad973f2612d3f21abe757c399a606bc287ab74c01b2762e7549daae4249cdb93016f7d593de48abbd5a8a42538d3107d1298fa004342d985bb6b379126407f9ecd08e8e898b2957551590546c75475d3ac54946a8ccad4efebdfbdd36a2534cb0a1b02ab7aa3c2d487a0397a6ab841a141da54a41b7b70653b983a46e824e64516840366240b6123031e6db3424ee114a8f4ad6ccdc674f900c84d220e2701e185d8ba31a564bb59ca4d91280266eccd369428dde30c877af30c97e0acf7095cba1308f28e2908c2c1c0cb476ab6b237a5c47c345c16f2d6168e5b58495c83ab0a78977981281163570ffa5d838cf97d34e5c268f501112a7bee21a0f801b159800693dbf63374f6b0e63f04803d133eb5be9d3805bf714faec589987c75674c913131c6d5bde7c66db8d7ca71bc21cbe62e767f6c86feb699b0c8ca7c498c036171e440bf2d9e60b92465a18c562e77e62f38de2f6a67cd2d7a046f4b88d6250f76e08227291bdb152a5bf719b81b8267a70ba9d968dc385044a45a1952f40692d2e88f6a241a98eaa6c01486bb940b41705ab05de5a81f3c5afbbd6e5354291bf1423e0d74387297e49a92966430bb94c16dbd421ee9bcf046f32e69d67612496811ca3848ce663b3318f49d3f850647405c49698f9dec58a1081da7617abbfe3f24a4baa15a5e5ba8beae49411d891448e48700cdbcf2ce943ea8fefd2fa45fec1cf14e86900b6744e2abcb8c422739b7dc8f2f91a6c8aa70fd93e7f3198c122fb8b614f4be866b58caf58d8a48471ebaee405020a1022eba9a1072d7b26e6222f9e7bd12f83dc22c7b115befd369c8f520323bcfae691babcb20a92f899ec22b216b173596ef544e310f12a0960cb6f5c90adc5a76de04a3161d43958bb3a7c22bac9df86d56c27afb9db14245a6cec46833425bcab611c02282746237405cbd75348aff92a050179ddd7fbe6f53574c516b30c2f3628fb39eecaaa58f1e639159aa5d72b56a48ab6807b16cb8fa93e4cd98322d5ff9fb6a8e7ea0d3325ee4de732186341f6168d93690d4cd98b2a55ff12c4c8c5fee4622c862d9584db43950afa9f655cf4217967069ee8806e473346a877f3a21f440e8eb9afc9e062e27a132771d510299f1afd71e170ba6361a4a64ebf90e742fe57da337b3dff4b215fd9651f34ba9fa78c70006d25ae7aac866bcff927a03fd80c62c53bf27102e6c323f69b59b54fe2aa67f17dfe983bc2c0ad3c488f3d55759e224260734b80084187fc883126b8a92a3b8aa219c5dfd137a8be64c5ae84eadfb871df8ed3caf22050f99150511aad6b56f1fdd8b3644de61409a0a56e29f168fef317e3d941a5ec0776cc4af56f1dc99f4df2fa67bcaeb93f8cbb8d59ecf4f6b52eb3318c3f14755bf6fdae18c878e3f14e4209aea9cd38c3b7d65b6804c89040e0edffe65fdfb6b1f9bed50d471ce3168b8fea7a9e4ce49940bda3722615f72a1431fe6ffef4062750ec545789fb376eb838a5437ff54fe9db40e88ae2ea6ec0144eb2790f94664c133e9d8a40207401bcd0d35c99b438e6c60f2f3ac6dc5635a2fedd08f62d625583a97b67baffa86d08d972623c3ffe98582456fcbfba6342ac3abbabffa2c3f69333ef97f8a33b7473076f54852ea13fc78338a58c69a88aa7f04301649ffea718571b5478bea33c9879f4ef5bb44c41d462524e5b3bf1321e92abf2a002ba0ab93ccc043ecd9134a055da32b80234068102d7e5e7f402816d9e217155e051861b70da986a9f4dce0641148da5d2eb96beba7a09b50e59c2625e83a228f2dac6a21c9e0f3c51beb6a966cba0060683810eae184e0e6ed2f5deb182e69d41a279286fb4ee6018a800301a2c81301ad04209227cd4ebcb5a48895d4a054a683e8b7b904be469c02235a0ef266bd6df6e5f9001af603e0e1a688d778cd397abbf91386b7097d7f44e5a730dea2bb749f74c0d3fc4ec09f3a02a155c2bb78ea1b1b962905b3a12826fbdc6619740988cf52f1fe73657f926532b91960a6cc098f7cb780f924cdefc4f1832845a914f356775e16657aed485168d6fe116079eeaf8bfa066ed745a81421494e2d5ca4e230d4e060bef1fad55b9f9722b6f0c84df2a30cbd5fc426879b4122c1b25aa3abe9cd3b761018e1adc310f6621f247b92a0a1a298a1b649da4c50f0bdba5181243bda13a7f6df1040ab76b820fa35135c1ce203ddb826605877714a65baa3833f9d2d8a69268101b2bb2532e1109483a16a0adbb8f0bb81ade207ac158402b66186fe7ed01c533a71c29d92afcc71943dd4aadeb5b4134efa6db00ecd7776685a72a2c1503664334bc916f419e83d800b08f9a9b553c0268574d314b42a72ef0338626fc58c3e99ff413e2fbd347cf4907f0205800f701034219a09514ef0fbae6e19e1dacfe6beac2e12d43de89fe5c1bf19f3a35f56d36a5ffb05d2a00b595ced1513673115b1da25debc80076146ecb608447d4db185e6f29897844d686baa57b3fa396faddf030b69f663ec96e63f13edd8a6527d04268b8ea4091b42a078c306dcc719b885458382c1e5a04c46cd310cfa604445cafbcb0d76f093e94478e0c016bb66094687e200cf0f20a3ef9519d8ec1395ab78087ca7d1451bc9d97ac55f1b711a20935baf1f7157d6c3f2901f815493b35751802323cba3a30239a4d6749d6f1e0217354708477a3cfd93c2b6f8ab0ee239a1d19fa10fa04ceae60e46f750d894b1664cd850ad68fdbfab3d49ebd1d31a7a1f6c488630325d528ab38574104f85002f40422c28a5177c010cc4d6f277d3eeea20be1a8049e9f93c6f6682425646ce9ee4e45e3093c0620abb4d2d25e0378667e41239ca04ad8ce1a9662ff82653f8a0e8f71a7012af5eb9b9d41f5617974d180e695ad5a2d28686314dbe6bc78628796b82168aa543e0229260b9290867e6368ed98ad95cf9db9ef635d93dae715475df751c43215c06102fc1d82aedfb94daab9c67b320afd81c66cefeb127e48ac0409f3eb8cd77dcae3a43ed6db11d1a4a960cf34887e2a133e9f22fc3b604d1825c489ff8fab0a1bc9844937c3000097cb7edd6c82902c579a1ec159a64904e1a9a6876c94cb77b143f852cd5cac4feadc8936c7558213250b58371b743f5d7138226b437931ce5fc5c29ea52539696c3093e729b4fcf26a084d8b8af710ebea40f1bc6aa7676053dc0067a64eddf51608c8dad6e5307799eedb2264a64e9132c48c9335c71d6c1696d0e41c92320b0bf09de1d4badd0cc1939d0f1549cf194559fc74fd1fcf66f45a5c42245be5990693d4cede8afe094413fbe757e10ec689e1032b73903468eb60669369f9196fc3c3522995b8a448cc6f0f7b1609d31c84590235eb1aff4f509a5e5a4d49fb0b70b38726d525c39747b44116b886acf1637e819378ce94a66781867c3c6b92f32bed869f91c8721ded694ae8840fe0258239035306ec4475521e8d04de097d25d044a37eddea3a1a725e6ae6429d08bc0d06a793cf901266a65066acb086904efcf8f7489a0a4a8ed788e00895112549a39ccf3b9f458cc820a36c87dc1690e8df4c3f6fafdffe1f58b5cb82928a2054e1888422fb1b57826d7088bd7111a878004aaea57daa1e85d50ea561536321984be6fdb3297d8570b5e3915e5873ed295959a1ac9bce01941f5f9af03ed4c3a13428af028342c86a01ad06e3dfd22b3743fbc8b30a4f08a604cf8aa7b98db5406b26c388c06b2b5d14e6b6020f27eb2627670d6ed6739a4ecce0662ff173d3abd9072cba91f19257cbf84e23d3cb6afaa56ca845be97c4beb7801ac46aa0fb2c6dc98169dcb6e10a6c345c4f336dea75ec2c9e0c37de9a332d4c7efcb05d47ce0a071cd73dd0d7d85fcd240b28510c1717fa99ecf463e9ca66d6e7b3e08d41b61dfbe5eb206b36ea54808f727a4c9d2c4c62b7106bbdd4f90a64d518325c33944c177342290f0fb04d6016284b40c1912118f58896316ea1e4b84de281c04c4cf4e509207e4f7bf6c5242205d2b8db1227484a61b86dac9700d1d5bfaddbb61c851cc44422c581513e865bc7a250561a970513057bcfd60bf4b4973e8aa04888ea2f408d0cae504a590cfd25180b0ca047d8e696534f686995382c81b70ac31eca56f1bfc3da72f6b3d422378f82acf8c46fad4f0805fd2d0905370c9417543fabd609180b2ca96f5cd56f71e0f9b694b8768528fd426f793a326f8d92b371e91b1c69e50c6d3e2c2befa84816bf6c047ea3776779ea35e6aff7324f1481876c0f02ffc27a170766042c62bab5582be0a40e03b7c58053203497beb0065f4ccb5ea4ed38b568a46b389a4a0bbbc4d26222210653bfc17d79fed01283fb86c8f29cbcc0cfb36bba15e0f23cea1ee4ecfeec5add477c1b24ce6e4400473966efd2b3a476d3d89812deb92bb0ba1d0c766e5259eea187b6b548ec6cbe67f784ddedc1c06b4356efe780cfb7b44f5aa6e2643fbdbb367430ba5c54935fc35871bee5ffc3b263577c2c26c640bc5ef893fdb1c68f1e1cb617afe0e633c3feca745d3e78726b3b5fbd57a647bc5f7c375be991b832a04ad6f268f915b1e706e4f4614c933f839d2e0c5a588d0649527df54268172fe891b95886b00a44ee2157c5ca5a669cc1ac5baea398e9f1aa2ad5fbdaef419d5fd062d655b065e1a401af65622a97fe8b769d237fcf47abdc6b605d0ff33f68e9508dc991762390539680e5c0b45ba8da2cee1d5ca9166e002fb53aa3739e9f73c1ddb762f854f510a350e54d0b72f509fe72435cca64fce5460d2a173868bb7f537fe8c168dfc656243dc7f09b82a6a6583c2cb76265c71b86edb592cb6c67f7e8dcc2980f783b53bcab040e7e778c0367c0796a9b84ebfe189781a399dcbc6e66e7037cbd0c6e2ebf67ab08ed12b75ccb927e602c21cc495a7575fa8160b91066becdea66a5b994321afd3530456ab7b957932d1033a5537c0292a9c043abb13484e9db893ba56b13d67865fd0ab00e0951781910dc77500ef39adf751b02ebc2d099a77951cb8ec21b7f228c56417ab8437ab99ac69154b45ee17c22af5bd1c824f3020b69ceb966c8b865112cd0f307012581607c5d880bd8b06d84d693a1a98dfcdeaca28a79763e854f410361bd26fb8b4af03b955d192a90d13ebb6f8e2a31d22fa4012221cae36499785f13f448251e44c63230b5ac2e777f9bf33bfc5fd4dda342f6b699b739a7eb023101ce47e333f6d36aade497925215248eae14dabc8a025f64325a7a50e16cba3a266d692a42b5f824b08c3854c96524e3f547af132d9bd516bd959d59a4c8df4f16a38856be90b488eb45858a5f0bbd384ee09835a287372037bdae8e2cb440a3da94dd6864cbe5e9d108b085c069046821a3d725aa94cdd5747f74746d08d80238ee2911d13087d16b92ba99e5531d98ea6778e9294e9e24e173780fc59f5575ed94269f8a9f477dd3ab542d677870807ac16bd3c3bea4f3ce5244a9da29a7291141a6c8bc46043a7677bb5520885a351dc7880b8d93f406740c1f96c08e077c6dbe79e50d9860a3615e8260bdf2e0204b0f77e725c692aea3eab94b3176d4a34cb00178f1286ba146f7c89c9315244abb102289a1916d37b2db9adc5b4a99a40c450b820b2e0b3f7502a9a6c7c09f8063a2b7d35bb497b1ef9351507ec91f1a1a82f2a287f2152e3ee9a15c9cb528fd50ee668fd8811facbcd142050f3a0082e0ca963349c4e88973a5a45e79538b47fa5aa3ca90a59395d9846c7e7c85163947bb1be7e50843960eb6e997ee66d3d2cb6c7a949fbeed412dde3aabb33a9b893f18bff452319ea789f03ec62f69225b3d781f43eb2a91180f43ebeaec2de51cef050f8a07bad0bd679dce5d7fc0866a23bd6724a47f914b72e772893705351573ded83642d622b306fedc1392c9914ddf861212e9c367a1ab122b9d94abced379369290b8277aa40ff3e7204c5b579f4832970b2b12d28b746b558c2b121e0b75f675e12eeb42fb309ef74a7aa7a4c4d33aff180fe395b4c7d09a8773f9b5ed8fedf795b20e7c18aff4bbccfbdd4bc1d04acfd3bb20b99ddb36a794715d9afd2ecf30d5b36b6b6d02b85d03d137877e165576ee032d4842b8c1b77917d2abab365ddbafb8542eea5af8cca6d5b5bc699723dcfe63cd8a35d189638d4af98129a65459d5fbd66badb5d65bc10dbecda00e04ef579f3bcd29ba7c3e5f112759de8485ac4d925d5625158bcd6f9795caae5a9b56ae4d2b17f05691528a77c5788bb531cc482c5e7fcd3a69e9a1fc3ff7a2d253f5c0dd2b7d8fdd2be9eaf39eaab7237bec5ee995f494aeea127a283d4f4f855097e82b690f66ef475da23fc24e631be3cbf9d35b2f7ef660d0ebceb39a0ae92bd2e774ee5f6420f8c90d557339e97399f4316054b1fade92a6e14b35cc483f6b499a49e72cd6a2907eac45891f66a4d7b9f62c722904dce2d7c0dc51ade4aeb5d65a8f90909082e436d20c49f72e427021e4822e405d8b67f1506e754f6b512e6ebabfd532d0e5ff9f3537fba4ddebff599d6a922e79bb6a9d75895fbfc869ccdb95b607128469b378309b40b76eeb1eca5d64ba8f0091487ff4d5e74d9469ebbe0cdff6b6163f6b51ba179132f831764a3c183078b55ea43f42ca25f836245de28df4f6c15c56df06c1c4c6c87e65653fb2313130cf722d2e2f5d5f5f5d5eb87e65ee732bc7722bf795fdbabec0c4c6c8c8c6c4c0bebae815c5a259548bcb8b172e8a55ebaf8cfaca7e3ba6fd34bb62f09e94bec464aefca38f0123f332f8b687aa48796e700e1a34a8ccc1f6fdf792ee0830edab4b1e9bd6a28e8230ed168f8494e73e6aa1cb405a68dd05b5cde26b9bc5b3d01160da406c7f796cf069565d2aa1c7ee6160d525fa2578307bd4aa2ed12741e961e8a9297ae5d3b32e51f54ade85f1251923571f8cddee676f89f7b3a754e351a5b4d35f977cb6afd9f6600ec2b4c3e7651d8fa5d7cdb407b3b7447bbbd749d1deee696fa7a97af4a9ed0eda3467f4d657e4286c677fb3919d596c84dd28d3bd02e756646a34c3657fa51dee897045396a86d325deb8779fbdf5d65b6fadbbab7479b7d6dfd5dd55babc4badeaf3f67d52cabffb122bf1947619aa56227712c2ed9a88ee22e7721eae28d38dcb731365bab586b20b6577e23cacec51b267d5b257b995923164e9577bee6864de34cbe33f6f0a9f7e03d97d2e017d06321d7309e8d376f4917220bf2af1d1b9afa0ab5dafe84ac0ec5cbc6839efeada35c44649aed2dd973ca5afcf44c39f7c5ee53c57424656abfae53cfa4ab966d525fabbab5d89f328fdb2fa6a97f3d87479d3ac89ed94d5a3ef5eb3c6dc5cbca9de0b88f1fa52270c1150fa1c9901cc106532cc49531fcf5aabdc95f828d926fbaaf447bb8a106f15726b2e83b84fab2ceb773536d6356bed62c25ff3cc86547546c59c47ab524e8263a6abb7cbb347576cfad56ad6a0978ed50fc2540661ca4549c8fa545720a0a6636e7ccea39f630be95eee74facea5fe7c2a04dc585fba97ee3ea557cee55a58028954ac3ab99618d6721efd7a55b1aaaf5a81be247740987881dc6b77cc6d5fc7dc567fc0867c7087f62dc6ce24bce2ac89baa42a6757f97b16ba28d27e367b3cc3339ca5c525e605ecab8bfaa815bd722c8ae557561bfbc6c87e6265605f78f635c16cb5118fb3dacc369bcdd99cb3b7d5c60c5543da05e19efd8bb41988f596e13cfa7857bd732010f9646e623375eccdc2dafe95252547a77b89b1e9b273cf0b6343c34f6c233a9ebc3b0af16c3105a82ea552c61147d11c446c6bf55add5d10e76eee5a541815e220d65f9d613ca3d57e3ea5d16a8e319ef3d27e16020f3ca6750f9ae66922e1cfdeed6c4c1c4571a4b55a0b9ff6f36be34ca4b45ae913c1338ca9ee31f31a0974109e61f2174a21626fc2cef30c8338771787b31eceb33ae8bd598b2229204ca9ff5cc25ff23c477188c336323071affd9241ec3e85b17972d3441134c1a7bbb9d454c350fcc9035fa41ec28f59030c79bcd95273c97e8ebc1bdcf6bda3782f6d76ef054910244192835dadd0b612f85125bc20026896628cc3b7ab1e9d67c71fb306f6eb6117cdea81844392334cf60b8166913912dc336c8d9f5df2c0ba34400bd9972a29695a3843bfc8f913e58624596cb85f50bc9cc4247276366796adc1b3fd43f0ad99f362cfb03581f4114c8079028615ba90f990a10a2c459c30d2a50a89bbc40b1189a4aa3f5b5c9ea0a303983131d420860a2346aabcc0439e313c448113cb50c0c48c152086c8d266893659539a90a2ca113990f5a175998256a3ccb035a3b1c982251447dcb8c6cc9838ffdd0592fe888622316738ddd3d19821c7314a84f814d861801fee15337d1295a7017dc0273079f7710d7188432cc50af64f121a46a93f4dde7d5e75baa101fef2a95e3ccb84ed9b43b5b699a6214106bb4b43835d71f7eb0e01bbdab9749f96c98d0b62a72c1876dc82145534118420365631f491e008b23a3dc0c1227302dc4265493ce2ea22b6c4501353e508de4d3130a8b1dce7aa7222172db46113b2b667985814b628c4faec92acfdc4e2ccc2c4983082b1a6ed98bac89cd8d716da334cac875df2c04015c48c87a47b862911dbf4e7076c48fa4d969cd65a4be23b77fe8b11b416bc548706b6dca75ff54829d6f75ef05e0d0c3066b1d7d39c117e89260cc3d0da7b7fb728221a0a97d411004890e5b85d28419623edc52167e56c36239ff64c97b3afefa3f3a69fd9d7d903a9b330d415d73a67504c0150872c475ccd3faad609d925dc1da45e6d41544eb610bfa1bb20b45d4fd5beadba14da25f865f8330d8220d30ec35aeb6f6bf7e3195e08d26d49ffde2fc9d944ff5e7af575fa46146d2e8771a5d47105ddbdd65aad056dadb6ea5afd5af2c7af56038cdd7b6fad3b9aacad1498c1709be6684726bfb7561c087e2d49100449ba4baa5d67f94c37ea5fab1e719ac4157091e5b81d07fe0866dc086a1c54adb914023ee166b8ad8339c26df58f3983feacb34b08c01602ee9f5df9d3b0fb57b22e4d9a5b5bc35cb533ebd63ebed6ba1e248a733ae19067adbbbd61ffebd4e9ac178b68fd6998e792b50ac0b5566b2bfd4a75dd56b163379890a16187b026b26879c091256f7e7bc888f90157194126ceec8f2001b326861692b44900970c4f546db921e2c9d39c01c111b2cc3d5955a1609f90e20e146990a0c3a48733338d11487e90723565cb145f45e0217351a8604416953016ca1c11449aabb12e3cd0f961f71028799a91bb6708cb14352f00813503561460a4e89304123f40e9954cdb5a718c28464d9cd93e2a63440a5b7cf89386ab6797f0c1cf1826a2209963a567adb5d65aa6336449d6f7aae7f6c29120a24081c99a2da2979a3661ce4e152b209933a84c49cf3e6f628bbdee4abd8c48cef9b9397fee100c79f70c539366974cb50c129b057629a94cb86e55a3c5e2ab31cb54f10d2c34f15297b01a2849e6765d06d9ede9bc999e3a98fca687210d1453b86a942cd13a62c5828e16beb091315c6a5fe42c075a0f244dcae5c3c6891b3647c624d60872b3e609167ba271d375efb5f7525a0df4592d042dfe5c9d2068afbdf6da5bc17aeb9df75eece53768f064ec063e5795668fc1fa21b6bb27bbedcfa89d596a9966996e4ab1f59d57030ce0c25af787e00cac153fc6fa826538dc8d7f8240974fefcec35d5de27e82fb5b0dbc007eeb49973728c843c25d650036be876640970050d2e5d0633d04ef2a03a0e029025dfa006cfcd60400d065048f07f05b43bac44fc100867e0b00363c8800630c00086ee89282b7e1c18ddfb211812e19780078f05b58974a7f3dd046aab6ee43a04b00fc8ddfa2409710bc0d9e2e697c037a08c6e1089e9e023d64f49f400f1929f8ad0968e892f711e821244e970dfc901e42e27e6be89f7449e329f82dd765043fc1d7dc8176f1441b10553d64ac80c8852e89de6eb9d8a0d6c843c2a7dff2e7a18f749941c84158418d770e3c035db6f8500f21f7d6912ec317e240e8b7a25e9739c20a5ae0104759f015e82163d56505ef7ac8587fcbbf852e8f3e4a0f21f756a8cb166f05a08d84bf65df025dd6b7e0b72ad0a57f0535fe490f09a330117691e3a3f490b1862ea3fe490f196bfcd6d3bf2eff5de821e4de22d2a58b17d243c85d65036d84e8b7843e872e6b7c8edf8ad2e5d3473d54c52007e02fc84ebf2337bd8e2cc1e788b2a0825e0ec0efecf450b9e97164099e821c809f203bfd8ddcf436b2045f2307c0c99eff949dae9a9448a0ddca79f3694400000898f28b7f2023bd0359f733328b97915f7c8c8cf430b2ee97328be7e517df40467a06b2ee95328bdf25e9fcf9c57c1719e928eba2ecf92d328bf9b94cf42bb2d01b65a22f22e2b2e70f6521e7a2ed5b069384f9d1d9b65c9f14f9dab36b393cc28a8d963d66704d1123fc6c31d3f26c83c71c7c28800773950df414ed6df03757e1404f796f83b7b98a00f454ed6da0aba64b50f56ba055f8de74095c978e65cf9fee13a2cac0957ea03b8b3696a7c89f1a5f88be05b329e79ee6bcb47eed31b25983b6fd433bd309cc63b346c6422cbadc79e00ffc45d12fc3acf91fc2d9fe33a4126a8559be31d8672ef98352881519db47fa4ca72b064a315664fb253bb2fda5b8f21af89b33aa034d2ad5d85cf29fb59ba33e60b3cb302b2aeade92ee114afa27ec306bcec8fa51ad23f7512e176679d305ab4e20c6f782c1a1349492e54013079a845963643d2964098255fb5edb40fcfbd5ce71a08a0cc9c231e7f9b7b8429620d80ec7a89025c8b57506f7c5877210ac3add1f069b815d855c988af3b4361dbbbfea84abc2283927a492f2fe04e5fc5c8579aeb6bf037848aeea44e5421c1870d80244a74c142fd5890a8958152d332ebc50244a96960c2a188cc410041d16e6b8f99a520320af21bc76a0e2c3086315dfa664c889a6ac6c1fed89a66ccd1e7db86ae5c3f52a0866c1df0de1cc257f3bdbfb845284637386fb715e19f81ba17e0578c8b25ed1701e131397fbbb02afb8a27420c3316f2ac1393f326f2a6f1e6f2a41b0f0e74de52db3fd7d827913e8457781fd0cc0b76f7558e63c0f0539cfb91e8801e4aa4ee00f04b93617e8c59be60ffcdd32de74b5ae828162d589bcf1f4f4bffab5a7aa5a07c2682379e87abc4d57a980a357d3ba6a457b359bed898ce4dbc6a7ea81686c59573f24ebd5b2ae6a1ee1585d02c54030e7f9833fb0edffab4e35f0970bc15f98270cc9daec9179475d2273115d62ad5f7f615656750ac942aded64eec3311e561966856375c90137e02ff4f98756fee00f2c4380f30ce03cb10bee1edfae7ff7f8f61caf9e41bb6a5d0823886e7cdb01bfb02c1cf30fc9ee95375dacea547bb7bdfff572b32ed7f6aeed2d3e4843ba6fcf5dd690ac2ef9db72f8ab4bfeb51c8e8565db3f57c9736497e1186dcc012f716e408efeef2396d5d6629c736f9457fc483002f3b781842fde5eb4f9a6c15c7baf45d5dcf3fcc8ae668d8a456997ca97195605cba654e60cff1b45481c5b77012d75196cdc3f61a22121f22919b5e1c69be6763cf425e9ef57d59fe8e7a4fdad45d1469bed71d9affcca6e7f8f82c445ea6e7ffbd95bf157d5697a8975495e913992746297b36d7f7c9a3568efe1db7239eeab1d64cc25d09d4b9a692194f3fcc65316b2f42bbf7227fe944cfccd30874c0e0d744912a3cfe5a22f29d9938d4f0e3d7a48fa4fb386cdaf7a7c48fa7f053a30266b6a1e516587197a27d480f0814a6fc5e7f29468a67702ce4f6f85deb21044f1e932b840783278391da82019c361073d717a4eb482991a5ee8722106197afe7ee55846d96a15592ebfda442e84459ca48d0712b7271a375854c8e3068a203748666cc8714f346daa18bb9056882e3170db5a99e6ec69ae4bf0eb8f9932d5a2aa874c19145d09bb82c119da6e0d0f621778248f30ed1eb9b88f69b5a8d90defecd26633dad10e1fe1d085b5ee6447af78dc39ee8757c418db708f08c1166f798bb712ee0ec2b49dd25a6768132be85eaf757777771a75c3c66344913ae835f74f50f5bba06a575757b5d686b75e5baf1dc3b0080ce28ec00122b15808651d8ba9ee5e6bb5b6deeaa5ce19764518100441d0ce504abdf55a3a73a5903ab37eadcdde446fadd6cec09006ead5ce8680d4da19b520e82068b340f0aea194d23597265edad8b556d6803288d4ab05dfdeeb5dff75efbd985adfa0b516bc645dfe54cb71a7dd16cbe0dd79ef05ebeeff6915d7259fae0158cbe566f806d28e5290427b86e1299b19419264b718f03471d3c27366e319c3c2af3a1e304728d313138d272e2cbe3437e6e2e24b7397186b21c33dc3f074f1bca62bd442d4a60989a56cc80826b72b5c423f5cd9b4c64826b49ad4aafc6ea38d89255044adac1a13be2534aed18f92991532510e135c569726980b566292eca8e2ebd2c28e2b6258907c6139d9918395921d5b5a53085a6187152f616e7c4a7660e1ca7ba271b3068d1fb06762ca614c3e69b9ae0c7272d8f4c61c35363a56483a61b63a454827c0463b65b53b52ccf0e0405aad02d4c1a2c24496335128d1a3646220c3e6481144504abfa8a8080f0abb68b78b8a8a9e2422222292b1899e888888e89f7787883b469884705b484848c6167aa1c7e40b5be8736479b6d0bf901d2c4eb861c2dddede1ed3d93727bed461927341470eb647747cc0b56dbde6d08971268a375c6418162a854a3b0ce530b1c3395ae47879366ebadc69618c0c13e70e9e95a411a70be6da5445144785e9bdcc702a4c087689db158e9a5de318d93527068d6dc48d24cec25961fb5f2a3077948c15d1e60c1333c0e841909d2447804521d6f31e94e744d81241b8bbbf1739f70b194dbce1b2eb93b931b25dff7995e9081966d51fd8e5517eb3a6891dde78d9fefe4e7b8098a3264dd611afa5234800c14216b02170e8894af0ace6f16450eb00d2f6374898d0b37da422ce5d09fe1bb2b627a5521b9f6e2314cf84744977e572ae1916facd19d4f6f56b96897d0813850d25e42ee96fd6bc09fdfd6af6c370662d0e7188431c86427808e370180ae1218cc3212efca1f08542213c847138c48f0b7f28cfe9847b8ccb43592843d5f0fe0c8b0f5a1cdef0ee12a2c2a85ad6d11e6f5a081893642ef7cfe3317169713931f1be562effcd19d5fb686d2729bb3e4d974c4f784cb0feb914e1eb40104f3b593e9faf085875d3a66cd72fbb7eed5a6bad3d1c86a196375d8c9f76d163fc2290f0698f439cdf665d51715e2dcaf52ad7acba547f280be56a691fd2688eb1ffaa73b98bd589fe9c9c989878bcff5c8ee4aace559dfc47e6bee43171ed3afbb072d5a5fa1893375d92b9dcbfff74c9f454b93026c95cee9fc7c354e55399f3aafb715ef5ca356bacd8f5ab975903dc75e8b1581dab64bbfa0ff765d5a9c8e8a58888de88c8e889107d91d6853f7b453f7ba15151edc2e527cad5a5bab5847ee8a99637d1663f9499ea12ed85322d7cfc6006123a884110a499105e9bab08f9cf97f4a654fce7bcda55bf2a57ad5e402e9b336045b4f87e0568c8f9f835f8f84908b875a1a6b16fbc3fcf9fccdd0a9620678efa93be838db43ef8d873b5d65a7777af1ecc32107fb056fc13fb835eabbb9f2c6bb6c6e44006ec57eb0e0b34f05cdd9169fcb49ac90117c8aa35a051849c140c4b741bce5a062190f0ed8ba18318bf8eb9b1d665087e887752fc73ee5ae8cf5995f214ae224d9db21eef77798af6a7889e12cd53273ca066085f8f819f9a3a616af70cfc093094b8a1d7c09f80bf580deaed5e294f9d30f61a085b9e6062a64d1419f4746044155104a100e80c11221a2f307c00857142d00c6c04d0050a2496c8c108170489679c60b0d28488296eaac07af3a7084b6c9aa543d71b3e43f850438fbee1e186384ad440e589208a986d7010bbe4a5a1036708324da43c41d29ff4319f1cce5029f2429cad2d3e10a65c89e24f147fc020d12bc96d66e3ea44b5258a3b4ee83044941d94e8cd9f3efc89282964a86873e6872e4dbc0f6e02e7cf9e222b845942410e2834214bb3040d572aa082e68da02b489410549da66c5d61c094f5c09f9a9a3ae1013543f87af7a7a64e38a2214e0ffc135ebcc1eadd3fe1263605949e3d02a2377582510c3d506fd59f3a011743ef6adc0d3d5ba90962bdfdd0156983f26d8fc65aa5a07da8992fe91a0a87daa15f73a9d6173508e66cd929c618042d9a5d5230fa45cba0d915d4d982207803c1cfcdfa2008f2705390e03be08713f9a07d3c9489886e4ffed0cfdb902632f4424f6a225b44c8bfddc80741e8e910d153f5c8a1ef41fed0df1f1a7a223d25f4433f757b52280f91b93ad1b1f6e3287ee99b263e8dea9ab665466dbdea53ad5a2758b526a0e572823dcbf72687f46529a151bc09d4d3abc0f726f00716728c0cff867fcbaa934e2775bbfdecddbebe57cd1a3e6fba56ceab57c99c51ff96afaf2ed5cbc27ca07e05c3813149e672ff60f42bd494cb477d15e35a7d115041e25f918494babd9026b2d543eb4092870e24f7834feaa92d50f7205f484f416926aa1e55cf7eae0ee53997dca378dcfec51bfdb2372c208e7e59b09b1ec18261f0bd6c831728db6149c9b6d5ba1b6a9dd5574647444ce6287da6ed4ee9f4f0f14fa13d59ccb278ab351de1d7fbdbe24ff14bac1b9fa4fd8d467b9a38427572b1ba243e49f6c8c899a5326bd0dede309d2a0f73497c71e611dba2a82b9739437cfaa58bddaf2d8a5fbf3026c929be5833ae4be287f9eb9228de2cd2c4a7d5f278d3dca28f7d6980aa59636ef1bf09b962d71ccea64f69ba2462f5c1ae9df0db232dffac4509695ded6936f1c74cd3370b5ca4b1c51bde243695248d873b3d0d6fa22f8a8fbf3a852f3eaf3ae1179fac4ef6c5cf55a7fb39b23926be9b993568afb33df9c370441d7356fca33bd12d603e9faf488f0f975d7736c4a9d56bc573529f6f4eadcbc0eef93aec9e78d674d01dd65a3a755d860f7e79dfc18bbfd424542aeb1a3b6fa8da334f57b450bb881ef5011b3fb3c36f9393b3433c3bf41faacabafa384779cca7f3e7d3f9e05095482911ab5ab52eadd6d54a63f0912cea3e723bbb3a9c5d2b05dccc7632bb86d9d5875dab33d9d5a5ecea5676fd39c5c0f0fca2d87356e8003754d1eb3ee7552fb629aa9eed67cff6f5dd6bd6a05f79f4d82166da20c07ca07eaee20049f2e6660022b1f62a41392a2668570ad4a5fa18e724306215fef8a1ff29379deebd77cea67f6f94be4894296ef66c3ff452e4e32eeec9bfe19e7c2243a21dbf0939dbd3afdcaabe2ba94e481ba9dd6a4a0dfdeda5702fa489908ffb9bed876a4dd781cd463eee45702ccaf4d66ee4db5e4ae86f9ac8ed85de26f4446c4ffeec897824cab3279475f7966fdf63e86f7fff867b213d453eeea76cb416c583e84952d781edc907e1f642194fb7722ba18c572021ef2dd3a75814cdac01bed59c519f864d1b2e663ef0643af991b954bfe2787a820082a5a59c59b01012722bf79a33eabb0144d231e7e9309b649df76d99625d521fb622e755a5d4f37cce797afc2624d29e64ceab55fb9c39a3be0d41ab75e1ac57ce7322fa0a24c4b9a394526a2d9d963aa594523ba7d6d5b25eed39ab10d99ef36310e7ae0cb9b67522df4681ea446a2a26e66096a2c1cd1a37db4dfb974d63d18e3d32b28651660dff7086e9e43c805ddbb5f7e890d3fefcab3ad95f5db26f6d0e0e69665b1f996d2d0f16ccb637af6d7362996ed0579dc82775ce3784b11049eaac6dfdccae0d19d914dfa12a7f91ea7cfcf069adb6ab7d8939a3a6753eea32d4ba7bddcafeec6fdb2b1eb61747b0b9ad62995d27178b8ad9f40854cc9baed6bafbd83f747fbf612ed9b75bdb72d9d6562ae0e3fba106b5eedebfce25ca597145febdf75e8c2fbee0bdf75e1c82e1dc5d2ae30c17e250fbd8cfdf9b667835fdd5a5f1c73a8eeef4e3e57224497fbe34fa585d1a75f8f83d3272f6e5bd7ad26623fa9b67d600ffea994e8e041d3a79ca7bb5c71fbd4c8f4ef8f4693f823fbe1d9b356a03b68a8a3dd63f7bac4af6e8648fd54f59b1f6f84219cc730cfc11f7e013e9d2cbc01fd225a97542e0df84b40ed453b4877b1137fad8f8eeeeb82ebd9b3d82994be38f62f658cbecf1cb06f638da74fd72d3b5af8d815c338873b76209e9f3c36ef0dab91bbe4c1e3d1214e2bc6aa9125a250449ab7605f5087549ebee5ffb9686a7e7f9542a23e797b8fa5e6badf49f9ef746a49e4df0ed3e5fd18a39c36bae8b6ad19c41bfd67250af396a83f2f16dfcbec56af73ec01432fac0ac1b296764db13dc5f3aedc08ae4511be0579f4bb4e8c5beb986733e807fce074afa0e84fead3f6b1bd08d35c843525dc2973c0736097350151b7caaa3d46258020974d02ec10470e317e224e098350ca8f604725b486e830fe5fbd25aa7972f854dc379516f78e50d1a73ebf1ea02b9543a751759d2080059ce2e0378d3d5210f18dd4cb489a4339b6dfb6d2ed92a0044ee709e0d4a5f2171102735829c688ae0da134d115931f64433c6cfd6c365fbfba65fe98bf5b510e40cd3e3b5cb7acbe731e1449ab36f8a3bda806ed71ae421e9535d7339cf819a04eb9c354a985ddb04df2450417bd628c104bcef0b01b76fd0fed524cc4183b65b207e82ee6f5f8a7ed55613a944683febc0be3f08f5b77a6422f6fd6310e7ccba0c80cc5a33105a469c3b0c82535b1583f7751887f7de7befbdf7de8b43f05e1004411d74eb3af0b7dfc3c1a7e929dd83fe4c4fd5a75f95803dd5e8329efcaf35b3a5be8ba93f77394b9c1397735e9712536c5c085bc8dd755e21ebdba0d5a3f368ec99c6ce6f839a0905b2d4e9660dba7df4a639afd045b2edcf2812ec3e9a33287885aea64ab6d5b82d66cf30b129242ec7f44483882c2de022ee386931020c637470b3c4135bb28c6e7c30b2a40bd8d618af2a83ea9bb15ed9e1c8718e7acfb03c5b1bb767589e274b44ffb92bbdcbdd577ed1276753294113ce291780f2a8a964a1f3da21f1f60ba6d954d6f8a7f7a251a3aca1cb275dd6f9354371f0f4ddca9b5a3c59e2ae9c820df414fd7297e514782000fd250d0a9ebe6b390502f8f9d329b0fa9e00f494ed6da0ab36780dbec51fb93872df9737367deae54db45fd194fb79937d5cee6837f4254f068da71bbb3a21e0e953abea04c2d3a73d9ef2f80fbecc11e04b5e07d4a763c75f80018ea71f8237d978fa2378933fd497b832d7fbf2e8c697bb09bee451f0a58c92c6d3974f35bebcb1cbd9f5f42d1ec9f72608be821297f4656ef7e51100bedc45f0167c4963974f3936c8aee512cce7c0852e9dcb74de912e9dab46eac843c20b328e3c24dcd9461e124e903d0f099ff290708714089a497c208743c74d6a070e1c3a747993da81c101743c02b403ba147f851e8267e81283a71d8036d6741c40c76f5d20ea727cda016807107580a043d443304d97e2e740a8fd16eda6878c3b7489c1eb0061c76fe9b0e9d281af81f05ba22e673c0d04da6f89a32e6dbfe3b730d0e5ed755cb0b1140e0ca42e90c2e0b72ed8ba647a1c520f48e57e6bc5f818d4fe8287f2e0032de3c11846fbb7a070fc53f640c6d64348280fc0df8a814397323c80ea1500c71b40c3d0655ed265ef6705b0b14bd2a53f8e02e0f8ad9d7f5680d9db2840110e291c5997fa8bf4100c4ae5df0265e8b2084a97bdc72105f55b38b42e617c96faad992e971e949afd16f8bad40ff55b3d5de6c761f431f4103cc1dbf0a0e8b76cf4f49071eb2163efb7b6912e657c911e424ea0cb186fc303a3df2ada7d2fe9f7df10000134ef6f03babc1f1644a1e593561fc95aab572f4146fa4e6b39407004219776857a0e4bff52d71648415a3aaf581085e84eabbb3b35429cbc116aad73da398652ea7846d9a83bc36b67750a868e258ab7a8ac1afe44d140967886a828513258f0872c2d14b2c4514f2cf0831503595a185e7012e582055034214bcc842cf11559e216c8d22e61812cad922448a28e5891255e214a0523169455010244963805af18316a3ae82d0a05b2b4457e51be41108c1654418520b2c47b0ad22918c88228c89187af4f5a0b20d21965a79dbc399dbaada472a758449152f75aadbd170c85a0d93cc2994bdc9ee3ccb49a0edf4c3464d044711c6b4c3a7ccb9833e678bb91a490d0d010112e17611c919191d19010291a191919397d11b620d6a36a416c71756cedbd200886e1c5e08c4669341a9ee59c379fe6ee9627c3ef572a8ae358abd96ed7de6eb7db0d04316d4613997460717cbaf1b6a71b77acd56cb6db8d2485866cf5213a54b3d96cb7db8d244921a1212f7b2ba5b9a19a0e1f8788886a3aea9e73061985ab4de7e1a28a6a46434246a491d1cd6654331a8d44232323239a91d10c1b1985a0d135b2d5c88d8ca811d578ce983f94848b172d2c51b2aea8932ae7514050905f08737a88ed2833bb9868ec7839b1e2112de84382200882f7576bbd59d087f44a1dcbad7d9be7d35a06d447b59d26943b6da65ad3813fabac70cf0af74ed8f36feee1be1efe5956e1a9579a60f77ddd05346bdf5b3dfcb97b903d0c829a84dbbeba0ab6b5a8f9be9d2bb074ddf2309d6a9dbaa43e13ec0555cd66dae51cb4cb4aaf902ec17c5a23e137e9498873d6987302dc48a9069fe28a031f0805b59db50c6ebb56afee4469ecb282b386b370166a1e343d2b6df615a0813370066a1eb43b079784a47f6b18864f6bb565c439dfbeffc5f4de6be55cf05e8cf5fc1986a10def052f08d60bdecba6878b434cfb89c77bdff6b466a3b8d27befbd955200d7469136cbf886b846ab0d75535a754bb3f6be78adb5b7e21c669f33ee83598c5a6a03d330d4d3799603faf652fa38cff9c0d5d6b56efd59eb83f5b19e6158c35ab5b56e2914a2a5355d072d1ee90da0fba3b779f64748ffe2a58edec523fd0b9d1024ed452cfbcb0e9362cea648f60c2b63f355c6cd16272d829c6181a26c510c477ac59b7475d653f95f87401fe3ac75e3d5ba712432c946516ce093f4d4d267f2031f949ef7259941153ff4602dc77cdbdcbcd953ca3afa2f95ff3511fd494c44de83d9e3d5257fa6ac75b487d2e7a79f779fa4a7f2ef7e2ae99598485df696f40fbdd7381873159d8e7e147d2906a844d1476ad3cda4ac9b3f3feba9ada97be47f3dc5fbfc530d7cd25329fdbf94d2ffcf9ed4eef5ff4be9fcff44925e3f554fea7fe9973491fcaf755397f0da83d9db5197fc79cc1e94ffecf13418030de85a0655943729cfde9d3d3197547bfc233e6439e70cbd03bcc9dff6148a4c4aca4f4497f3933e4913790d5597449da9b0f3e8d5e5fc21327bbab6a02dcec6592d4ae845a222289fd5741db4f8170f428b7fa1751404ddbb48fafc3d923ecf24ada39fa4fffff5946ee69752faac896cf5f8df3d91fc5244fe77fa7b5aeba8fe244d648b88265f2ae9f56b4d444927e9599748f126bdd24b2529bd14037f59bca84b4fca4a3a33307f7e0fa54ffa1e0cbcd6e9a6eee03ed18b445fab3d0937a59cf40c642d12113d0ba2cf3a5d07fa935e4abf148b2fc95df4a42e7db378a3a7b97c9df8f475f7e793afb34e4cca3a516bdd7d0692b4d227bd1403fa95f4d4490f55c95cf42cf22c7aa30c8404ba8d9e8415245016796e5df449459fcb24d04d7539070d1a3488cc452fb28b4c7b91d6c4c7d17c7f452ee95ef146b9a4dbe8837893a8e963f18b5e2ca281a45ba41c50cd03ea6af2e98ab9c5a22ffaa29fd5a28a349ef48b9c6181f26c5abb80c7acf1a8fa9ba916e9d0cf6ccb494f1f27853c8668267a320fbd08d6a288b01662f7f8b396018e418306edf1b38ebea694fe0f7d7eaa9e483ecd5977ff9faa9773d2bff8495a775f8b3aebfc49df237fd2df4ffad77a0aaa2eddff9fd2f9f3d09399841376ceb337f3dc4f8eb3e74228ff98e21c6db9b474dfbe968378d3f8a510dfe33b600949f758d3f1c3793e9f4ef129b96dd9ee1add0ef0a6eb446a6dfaf7d6a2fcecfb349753aca4d2e2201c3468d0a03d1faae672ea20536cd3683f031f29cfde519e3da86a4b9c41adcb73925439d709126775f2146c889355eb621481a7204f3244e0c9840b0563132e0e2390f1cfc2bc677f8b9a90f8a775273a8b40dee1aed4e608ec36100fb2db4547c8f0e77d289f39d91ead716002dd54eb08ec36a881d89964acc6065fac632db365f84afc804d5657ad6bcc7b80b36d0e0d86a965de43d91292c4b56cfb475087a4bdfbd5cefde65275af3793cea37abc63d7cac91250c4cc5973a68cb80704397eba18f9f2052805724a145c73beda586922eaf1610d162d4abcf400a60505acb0039a22ba0c12e3e5cf0e708c3c3196e54ad71f10b898294226cc141a58c8a3a4cc0b64bc02bd1004d7123fec48e125858a23d49c411226414483105e53a4941943e3e3833129e80102ca147cbcc2b22a55b869018815decc20848fa933442001458d13236e443c3c981984458531265570e698085450d6f429a3e384cf9ddaa708962c5fdc7889a325830f0ab879120686df9e22b6c22a0e60e54bd70d5e390caa12610054fab8006789227cb0846df40411674b063f37d4c9f26113eb810d16132c28d161f279020621eeb47963e585277c3020832017da28616264cc9d2a7c88a8a14816288c10416acb9c3855b2b6447972ad605dd10153e74b136ed0f0f0618622509081f323e3513ca04b9a15be06a55153254a0c081da88843049a332e48083d67c634a1039434225c912150154db889e2e70f5e61caf1e24211b22850cebcf961aff86800cb22c20b4f28a7499816aa6c65f130c70901ecd4d9c3820f498a3811ed70ddb9b2120316a84e1b1f0b00426b890f331c49d28348968021c0c08183c49f3d604478eac1ca0b3f1b8cb0908377a940e688228e3c21abda814b861b6a88d3658f135044c952c44d951a7c5a7e68a9f3831b28a460a100286462471424659618f3458f94098c61a1e149201bbcd488758e58a28a3842583902cbd69712594a18192285d04e1b167aa0b2e6cb1c1b7c5c20568787346337fc2026d2f9e345258e162680ac94d9f263b380868e117efa042168e67920105712605a646c00e3a2071b94ac90a489234c00f1e2d28587c9113556423c5536301142cb1f414ad0f11143505694316c7e4fd2d82a274062ba3c9982431b2718e0e5c588335581ae84854e54c04b9d19c6ea48298325021422e2f8e0e54f1910e15813577ab89aaca1222bca8f0f5a00e4848e9e3e5cacc43965579e78020927eaf809c2c7971f970c5f557298c18f2827022870081436c56b09d9c573e749561328107185aba6ec89a2458aef6b4b880fa498c3040a5f9e29c8c23de4123994c9c1073a6ba08840b505c31612314a84c911140a0202451c2e4037d0a0c49c212377c28e84b103840f21147bd00c81756507ab89241e280b74e7c8923d7fb0c4385a02a500c5d79f1a8e84bd99008e151d9cc8b3840e1a383ee6a8e0e709b1417e9088e06de61d25b400e9899305cb9738b694421476c2daf019228c8f3ac62b852a48c829224bd716b189b9664a163e408c6df590e4c72e8824588842501b3450de4c3f5b8c7801cf153d657e18a3c6862e4f7e592a884cfcc6f0bc50832fd012187eb81d1d5424414413699470610a0d6e7c88c3842025b4d484bf15543831868d1616d668f181825513587af064c16107186e74526833050a126260f021812ac6ea5011d4c29614ee9511c67cf121d01f1a5e5842c99629b4c480a5099d991c08844d0145133c7461391121871f9e848f3a368ce9b2c267092561ec0e4954b44cd1c2953b7bb47c247da5c07567cb0e2bac808d28b14706416c50f8a1aa888f013c69a342d693185c808291ecacaa9a24f91979822542035881bab6f021628c1b371cac10e648123230f0f9418424b05461c5c393377b6010db8c60266b86372b88f9c923c2708394344cf8bcc004a292f287893150c6ec60e60c903128c01982ce1524e41cb1c49d262ba499e2f526900f0bd88007cbc80f525899c1280ca5500497122a5ac4b411e10a09104a6cc1724510a090ce44c386862969c8a8c061881f5284b08365cdd72f0929d8e703cd0c542ce1a10928bc269b1fe29209f664d09d2f4accc0031d6b0304f864a912e68d1a397dea9d69041b2e5bbeaae8038585352ddae851e1cc97415a3d6c70e7ea852a47ee3861831806585a81ea2cb932041811aa964db584852a8e1054e54543113503d00a0363840b191b347d70c8e2840b3c78f10121a629810c0c75e6d8f19d1944fb1224852a5bbad8c04213416159965439d1a70c192f28ca5c958531d246ccd4d380a4cba8240df664494a2a65cd88000000006315002020100c08454291408ee5a1aaea3d14800e7a944076561ccca328486214a4903184000000300080800cd1104d035360df3f0f5522f4701ad499d7e338bacc7de485eda06454eebd43c7b9adb9a101170bdf5928a61bf4c88b8a7b8a3c30af5e252606235ea510b723799402e8436b05c37020467ecce66bb46caaca0c7384f6998185716b9cb597891f5cad046acad908f48cc0fddd0bc40ecd48f6fd51e344d62b98f1c86fe0be226cd2cb45c12b8ef9e4abd4a6376798da9b768e36d12b4ef6a2918f00c40007f56df3fd743e2a7a7d8baace25df92786251a2fb5cf37573c559355ae21163595bb38cb5f4c0e39d91e551fa8c5a76c3a53e14cec385d5678b79a009dc6d6576dc472978c8850aa753ba565e96076db66bffa3ad66aa127293aef28ea4d4aaae160284fac55723646ed9a1c095d24870ac5e2b96900fe1283874764e50e98817b4be4eefbd92ad392b8e718db34c155dbca1f7d46a64340436d9092addfd75a47905b151283c86868bce3ec62b8c44310e7f8400ed53e0b90b92e5fb6c49700262b8bb8899c43e73c100734a39a52872d3535a85469f7b74f90789276ae99cab8513fd84dd5cbb78e5f2fd29f69ab9106e10347abf9020ab6134f4fdfe3b8b40da6d5e034c0461685746be61f8ea09f7298a7ee7e51c81038682d3ce497054f95dc311e2f4aeffbe52d63865fdf7469bc6ed655e3d657f81b94c922238ae717b7044bd0629391d5b1c05e6c9018b036217a08fd41b2d19c165b59fc9db879c2e4c4fd3f8b0a11a5ffd7b328895893ccd96654ed727dfad3b2e093dcc18e599e44184ca7b71ef921fe8d7906af1a80c5dcd216bcaba22e44ddef4ef16275e31578a837dd6fbae6bc7f2f83b3bf9c066fba45aeb06567e9de506588fcf6ee6c63474ecb7e721eefd44d93312e818efbb8ff171b77091941777993e218bb507289aa55a5054933e2524aeb652d5c9c0d2f4ed0dd43aae7630993ed259dcbdb83f8ac064efb27ff67ab82bf645f0d2d66ce9df954f9d6628bd616b7e7543a938d1a14c3e1580f3c0527fbbdddb5fbcf42a32e891d1d5648b62b512cbb4d768e2010ea64af719ea0d056fa49e237d87792ff9919559dadf53f2b5a825e7a63157bbf740edbe2cc4428001e70e50f987b6132a9f095a30cf8d5ccae26c08a3a5c10932ebf6c1519f348f7888f41ddd484472bb9662a763ce459e93f72d9300fbd68405f18c7b39ab680193040d7f51f6b54f6aa2ae177a67bf4e3d1cc1a9e34c3b5858d907a4bbb99c2b13e14241116e7f55b7c3a54d9a243cbe60bccae84af73a82c21592a14647b80d0c69942488ffb1e0f985a43172f5bb7f592e684e095299de1f0edf29188074a6aa67cba5258fd184669c99ac6e7ea277c5bcc07498a852b0acfed811642bab5284d585130c561060da55a88fcb72356b0e17fffbfd34042238abb247650b9b97e52238330def4204c4f286ccea2f4de2e6c875bb486ee4c0fd19a6d5a1ca0df7c6d75a7ceb216704dcacd781fdf988f4cb7213fbdf776e5e6abd868a06797646c9dc8977291ab78463d3968e241914b631d8fdf3c8155a48403529acadc87593990f9e973f8b4fa4e7990b9653744e276016e7490290e3638cee63e4483c6d4e42dc701db44152834e6174b7de02dae1357beba68fd9b7d61e957a22d1b2e2db20e5c092d4df45af000cee8ace8792fc40d2c6e45dcaacf4c37a4bb3ef3a546c97bbde2da1b4f6b5701aeb7d891d28a6c35e30ab0b1a13e1cbf0168eb2b3a4ad3f3f77d3e0207ea51b373bb2691b7c79f770e2697a1731835bdd8c591928e3ffca2b089bc025553ee3ec5497da979af559041ea96f8b4c6cdfb348555bc742a33d19e6bd16b96ede85a2e0320bbff47359d860c08746eb26a628c21f4ad7f117db70f0cbe19c68b4e695eb1909a4cfb0248148c831663d681f7c82408812f0ae14629322a56be66a9c11171cd220cb764fa2922d69690e752a1be56d87c81c219cfa7b18555cb61b2aa196a9c71d15abd61ce2f90af01ca5a99ba60202bd9caa5d65a36ec440f93d77f7f7b5ba10f8b663a0802627155fd2681bd5ce73d4a200ecd5f4fb9b6b2f948b6a86528cedf7f0560f46fe84f9d3838475fea04f97eb8c2c4a4920b3585a8882eb6066e4d665ecf67c9ae698d8764c55a3933b8b02e2f0d7b20059a0c9ac4b1a92a22fe30dacfab323de5b44c7848d034e642731cc59007bb1bd0ed6d64a564b020af7b9444949f6776b2cbdcb342ef321d12080693a40b97c61948e1a7609798bc93d97295442ed80181de69b2d2f1144ba75075571736dd08714391474efb655955a80eec17ebfdc2b75aaa037277038ae6dbd674d3956378305b278bdb577a5a61f1ea728a912799ff4c80ef7604716fbdab334719d1a79c746c2884972eb08e625dc180160a55213b502cbaba59a693fb28010104fc954090a63f96a26f6bf0d80c026ffda06224b7df62babfb15ac63e44e1cac0edc71628e97c4f7cadfb4f4a3e3b232d487166219e6905dc9ef016fb6886db392a0f4e75f00b4a184aa82c4f06e4f75d0878b303eb61d30ff2be60b6e8627d17d5859fd71581d617f7652651c75fb77417e82cfb9046989a056dfee4930cfb4e92dc9d661f1fddea5b3fa960096202dc77dd71640c7253f7554ac999012f02e82973626fd033845c630f47a15d8df70d18bba481abb6b116ab1186e43f8faae928eaf883533131fc416dfd2561163b408626bc3174dc40a3c30d1472e4bb5f571a3019688f60bf70c21a47da0575dfa1a361073a4fb76c4b6b5073102afb3602661a4c0da9df2e3887e4288d6058985743bb3832e0a927d0575c2ad5be524cb50b645057e55c0e6f2aec1cb11145c64a9bc31097a0e4e32c872c9cfe17413f7addc6f0e5320e64c3fd60d3ba782ab183b33eb4d73d4c11c159c3fc636737a5aee9bd6e65ee6341a609c7eedfa4630491e6e99adf126f67e0a046f85c2e4302e2a323dfed5fcdfa8f5b3bf67d4b3214519853a9f946539e72a3be6ef8dc30962b02a4b62f309a25f13b3075f599f88c6fbd1ce9afe2bc95aa81f65857ee415a3ae460a957d4ed3e0233968f7cd9351cdff98680453e129f1d58d3207fe10ae12b0c9a1707225b231298d90d42526a64e8c38544bafa4130fad0651b7e777c493e6774629ef94e4829adb99190afa79b7b8c11b4fc39828302d7d6040cfe04107624d85d4d220920bcc63e1f1ce32293f7960df2a1962d448082c4f6cff9a610bd45994c95f738f585018a1d540165c7b142916cc4890419081425397ae83b0c70a6e6106e89133d3a117bc5fa06e216c7d9c9c4c1ea833bcb54b0983940a34ce3a6daa560f1e3562a281206cdc22430a42de256d2906bed6c18b2bc2f3bee165af8d45e8150c16fc28aefb5b434507796afbfc4572f65184670c0382c21880bf5711e0c796c0f08d0a6e2dfd0c1defa82270b7bb481bf175412ea196a35b1d082ee01d2f50fd8fe14ecff81c86e25e559b4326e00a5bfb22cf54c72b6fced27ff51a0a059e744de77dc61123ee6009cb1a5ddba6b9fb669b8a2b5de9d8bcbba67b3a55a504e196a98aa3ac12aeefe8d361a0ac5b8a6c0301a36f349b71f2f8939d2a98af3e725507c02c23f40ec0dc030ac3aaca9d088e82dd54762e2a8c5a40134e48d709eed643abc529449309effccd0ad335022005fcdb3d38ec804548e565019797c602c3ae4c60ef4ccc03fcb4ab0a3ebd197e721e27e7a758651542e9f88d4ecbddcbf7ff0a8c67c623d60b11eb459dc4d19d4bb70a9d9c65670d0056e53189cb1c99c6add6aae8f5c07af35e6ab5800f2860ce9d0e2e1b3462527d1370a56dc6da1d1a814cdbd139c72ec43307819458ad494f7535dd35b66627705d3bd6fcf0b5482c7828f0f97b98949668efbc6f339a35646809a187333ecbcf33d8cf6c9d11005cbe0b3cca613b621a5d8d81806daa8940f3d3624b12b744845a4018875368cc3a5971a7e19ba143d8fb16c02ff38b323e1eb6dad5879ae723ae710f4fcd1b7a8a0ac6c5e2e4a2fb378486d27f31c92753f1d50c2c5b4d9536659314807afbe74b4bbd03f115f9542d956b1f9c3e30000abecbc3ebd4331bfff45a804344982af4542249ab76ef130c6dcbbefa3531a3b800b1c9c448fd7e70055428e7e589c732ac9623bd5152d2c74721999a1dc61d72ab3eb4d72b05c853b778395af1766abece4d679be3048b3e24d322b2d39c8281589db0536de5a20ce4a220d020225b0969cc532c90911012c9ec5f2621ba38df861d467dd86d3faefefea7614224f3d01086b77fa11f66a403db7506d4040338b7165b8f03e7d7909d1f82586c025cd6d227d8bf296d80bd178af665e4a134f9257d5a66f2d00c9da1e8f6ae67a4a369848491b8b31c1030dc3c8278a016dc783584e27ec0e6ff51051cc8d469722c8d2df9158d5cfeb5a14741542e3b747569251742454ff453509735d50e35eaf794ccd3c11177b28c605dcf77f86f3a41686bd745f8654842153747d9b4cebc0d28561a37ba316392d84ffeccbc10eb4471a8bd3406f4bfce86935c6f461043112321b7e4e4be1735f9c6be25924528bb8db3a7547d3345f50d86eb7a592043253f838edbed4f257ba2faa1af00f60a4ebd42f7007c2a07174a10dd659f83ffadc0a9855ad709d767f62269524cfb3a3d04ce0617301b82aa98ad2f654074ad32393d90ce5430c1f5483f5fc775d211196b5473b64766b91969be392ee2756ad5b1f095960aacafe8933613623b49a70585cd5c15145292a167889ac2a933b3b489d44897a53a535856c3b91a837c9cf63664570a16e7df54bf2a233d1df88a06fda44379e69d2113c0ba41e5794320b923745b16a606c34846d79408dfc0af5e16580c331b7b74a36c67ae3001e03da91a4587f8bf211b2f0ce5afbc4408869270fc216044a45830140668e7e7f7c9adc288eed77ccdd366fe21d77c334f05d56a25fec3b839af0cb2a3944f7dee9eced49e884355021d162620213603dd9226cf22414bb43a8d7637a4d834654217dcf33958f6187040fd9abad950dab911a7d24207d8081e914b7fa09047bab535f0513a3ea7d6817671a2be74a30e34820bf12a2d42d1b4f31329a4ff0a0023c0a10876d2904080082b44aa057695947365817804ed5a9c40c8de51250ab6aec9851d53df5c61ea075e39ca83d486389516aba0135835e4bd475a73dcc1f747a1baa318fc9ac829fd5791313594ae936bf68e0613e16cd2cd2fc50282ed6d9bf39818a88bf72843e61e7acb11383db2daea7e6be5ebdb01c34a0829080554710de03d3e8a083651225a8cc9410ea539ebc03e58ef7a456515e4dd93484e4add34dc8c551011dcc4b7b4503058231c9d9b049b5f0ac50282e96d8bfa6e8994e936548c8a15e629f01f845e8becb0d891c3363550580bc86922d4c81efe1dd445352360774f9490883ac1cc46d2764ecd8def1d52b0a92f6b077522d1f2924cd6ee48f4db0458fb2476c8427fd554280a98e0908d08e1b640d5119e1233862085de81ea9b9e88ef68dee3abb12389ca5a590339ea2532e2a81bb5227c482d0424b531559aab4162148ad50484cfde6783cf7d0f4acfb25d9c113efb0e6f1ef4ceddd63f8a3d73d277147906846af2cd1fc1ed6069829d34641b6084156152caaae9d9deea4844b78a1507912044374c6d82340525e8d44d27c5b186b2da121011e069829d34f044d8b60505158b65172ddce2b895c27b3562a137d2fa43b3ed2ad557157665d3f3f04eff4697441eea58a89fe191c84e765a2e997088349f6ba145d56b8508a60d85b68423557371fb3f5aef67d45c451e01b5d5860ea64cc8098d3a9a9676ef90fb05f0ed51588a912a0cfabfef2b9c56c1a95dfb4f99013641269bed055546de6a8ed0cd63f031f9e48921840f45bf0951dab2662c59a9d00798664056839b91b3dacb8a6584c0d243820ccff9029e47187ee2fa31f30125d1bf8dd1633df1c2d02ffb4c9379d8a15aa61912522865a15902b76e310ae430b098fd7408bae698d5def41784abf155eda5f9384345c9eb16db8ab3ba757cb357cfcdd6c48dc1347fefae0291959fb2b08439d546c790990203c09723ce9c59042e192f7f1e1677f9b0f8e404712f347a564a942da2bfd21ffc6c85faded49bb220f4bb78836f97a3f0c62e59b29de4a85ad33e8b1758ee27a934db3d42d91328dcb25b062a077010610038934e58711c378c27683df4f6cc81591dd8071dd39c2337e25cdb6d74440085b28273e485b5a9129c8311a6e9ffa0a5e23c1035b536f8f092a70a1533e825ea80fff6318341dcb260cb480813675c38d05ca1ea8fa021402caba10ed2fa10ef4a97dbfccd1c73862119b027084c7803ee40d3873c63887cc949c00adf83a86afdb786a5835fc514446c24eb50b93e4afafd5264227b924bb7eff1fd498a72aaa7822ef648a1aea79098f4cb36d18e71f8166e2a80a64d89767c163918282259c695ae2406f8526ae1ecae7be24826897ae1eb979654f5d13d13db3a40b05c763477594756148abe8476c82314c1a82d7e67c198161ba29e016229d1d4b653aa548f09d3ed6a6ea7a36f422ce9caa1e7acd8b8562b6197b5de48b3626f994109dc18a972fa8d532ef8027ae202e5c856f848fafe2f409fe10cc01abf32094138f01a4bcc829b9248274bb29d99a0f4c848b99d53fac5281977c9003253c0da7d457273e216135752adf22cfcdd151e0762010f925fa24abe685d5b03dc969e21065d45bbfacb6452becaa6c85194483619d6b94926e86f628c3b8b7e684d2e786e1e1fba56fffe61d17fe797ca8310a3e208bb0f6cb97ff0f97a6ea4fd44e366068ca1d7bb406b12dd52aeb91032eaad60265b3589719aa8066617b299a8399c1dc5a18d91f08ac2f7788d42ea9d7cc0115b1f4cb0a76a27b1d3509466444184b918a3b090a898148bc02190c1c46ec0a013f2ff98bedb560aa99b13c8cf4cbef7cd49182a49ad22a3de15089f17154bb4f0b3b4206da00314c7d04990f76acb1abea04efbc8f1ffa09ee78a3694a43d6db9fec409f2f192dabd3894fa3985451599bb201e9dba6aa0e897a4ba9868e0cd6cf56f291c97ae0519620abd494f0cd147a98527cf22ec8039d3b8acad6c82b0b951006e81d8dca4ccb745e3ef6bc62997c483aeb0c12aad430f575c141d84930455c15543acc3bedeca086eac93e1f9539e84ffaf8345fe3b21cfb09137e2c14282b66a3110ca67f743180d6c813aa9dd676f2bf03dcb60cca44e395c7834204936b36ddf2b3be58b3f48d58f2f4d9d9af95efd0a7cbcd45347118ef97f3a0b13216e42641ace7c6bb627ab3df43923425c0453158f4a3f4a84bc1013e6fce725fb70852e42ea8d6943bf2869970a77a4859ea4832f07a65a3042f559ef74cc9904c437db9c3b619134f2b1cd6fd9f948d78dcce471a788812232a11c03d9d18479840042ba3e77c86250d9c10521e72165ceb45e0dc52a61a42613d4378e5e0f1857fce344ef09f4558a204fcaaf673cf81a3ea41a9e06bbaf36e2dbb924dc5e6a7f6831e9a5d473aa1c6dba8b5e9d0c299e7d5421cc7f262edaa94be4a1628173dab827cc15c3b60b097a1857d19f3c858a0dc2029aa7a26aae869e80e7944af11f732742a1a10a3f0875cc5a04ba9e62a577d48ade996694dd5b2b4d2ac6cf10439423e6c938181d712ec337290792ea05ceab300461e7cc11cebc206cebd5036e09994cd6632cbbb82ef994f101996110c3a80b910173cc3f13ad3cbb16a9c2c5e3adc679db04096e38d5cbdc02d34250df77a2bc0d3c24aee66ad84f3c30894f473652e8cd3e8fd02fd7f148e2581357afd89c52a1d6a96bac5a0007a60646c9d8e1f3ed48287ea082e47c3ec2bd8dfbeca935d81de100317105efac6d3015bd1fc57b5b41d78a074725054d31b5596f0f763857d9503dceabb04059468c4c0ecc8c7435a15446272d1c155fa4768312c70aee6fb7b21096b5b5efd6815305b56975d8aa8210ebafe20f9cc8822277a72db4f9ef61a13dd6b2b053d5774aec25c099b36238dcca066d69328250f891c25016c30e42d48a586a9ae63d9051084b3152e7decff1778cedc056a61c8a05f29713b2a10db1c0874c3e1b5f087610c7111f0b26ea2c0e0b8836750971d8110c99135a4519400f86145836a410701f00120e7d8984350a4633332e2af0be24dd1d628742f63dde33e35878da6ddf2d87831489087550670fca4edc2ac159c81045d157594270c9810308748141028344854e520021c39edbdc2408fe9a781224f6a03a5ef61b32a1d8635449ab42280d98266634a72f18ea382b42090d52378e485e6fbe45fcdffb5e1b01d086d7371ce8f6a4e7b1bef48b52f63c0a817acf83d95c38b96e2d800a5737dd1ef6d15a8d427e396ccd31051b8b9d9401d4b79271b80c2da418c110f84fe5ae1e88144c2b07605dea6b88a41e0287ff84ada77c1985842dd881a88ae7b209dafb66038c93811f242af3af505b087c60e0e31ef51ba4ad413d2abc6a570ea20ac0c51a7e6653a41a17e25137e294ef99e5d9959b9c067a70540d21eaf44c86bd5a76a95f47ad05ac338f30faf6d77d2718472046de2402f2df187590b1933781db2156359a3f99a413e19a7ceeeca638e960154d843c50e456d53245972c102dbcd9132bfeff72450cf757a9dda83de1c263353e42f27884519badeac26698b9bdbb95fff3e01230763d6d4b78828a00fc4c2f98ace9b00d22a6bebde88da0ae9c4014005964b8229cbcbaf5a525412f33705f34f0c151796b08b7954b34be07110236d316a9e05e3466c08c5fecde37a6f033a5a7bd5834743de73268b616b0d8bf53175705f6b848a3f09da7760155faf0835c036bcfe9b5ed2bf7f740def0e0191104a1474c18d0471c1fb2dd3df57d593322deed0615162c858e00c804273e0bea6b07a1a71a854972d9f4e71fb2027f844437ed8f0c2bc9188da975b9bf154049b45517610737e269ba6ba058b3c3073d2d8e580e118f3a3cf1f718af07d2683a5bf2fb850813c6e04e7ecb862f2872b61a8ba1af3494a4189043142d86ee08fa16e1d95344037d4dafad4f3492b1a92f8d928ccaf8d192613c8171344ace9b4a30bd18be7a04d714127fe1bed795922e4a808642516b6f0cb77fcd3ffbbbbf48b413075c3996398722fd97f3adf653b7ee042d3e4dff003d64bc31c150d9b710706e46731423b68885140b76e98f61143bd1d4466ac4c381faa5b7cb7dfdd8bc8ec1a81a3247470c3a4a15371fdfc2585db0714166256f094f50638249f7e2dee33ec450ec01db14019f4966596494534a1885e4112be455b54fd209080886e8afba813c187efd4f93f35f687b5a956b413b49b5c6dc8343c8514c1130585969bdf8dd4f12c3b01ac4121c318cb09fd9973adf58a575a6819718ca33bc4bbd040862754b50affde976a05afe0866a2d0e8bdf2d622d3905917ced04213d07e6b008223b9b22028fa550c1c970115ee8ceeb98ecb43ab48695e23bcdab1cc30cfe65ae3fbd3a101532b3eccd53052954907223fee50a4d7b24aa2d461148483f5624ba9ce4d88b601bb411c0cdfbc0b75b9f1b582512727afc03d9cca1ec38346dcfa8077178cca789317dee466e8038e5557685393baaeab7f88f1bdfe41565c38ebbc02861a43e44f3275b4313504b9a6b2969026387d02589a6e09f5a8c434f539d7b174780864978283e72191c686fd175ec41c83b185ae12b1cc4ab0ead5fe2a5fe2f3bf8164df5fed2ade8b065f216cb14576e119c1e29ef61ccbae37a01d78042ca4b7cfa97eab2ab7c040522dde05afd1a8dfeb73ca7cedf18a415121c2436ceea45bd7396d5f72639e7e2269d8094285e203005b654b988ef48e77d9d7401867ec29ba7e8355241abd130c6d6a51536294e7f816a8ffc8430f4ea81c4d01e499506430903868a2ef1fec10cdde11e9083b412c9de8b10c4893f41e131ee379028d7ea013c92a3788b7b5712ec24707242acef4f4c114b7a96d7b2ca9f6f3cc2d672cc0a618851a4b24378a1c414c2a69f13c653b1f8bffea2035b55d607467c9dfad0e561482b012ef667f6802411a3a267873253e94e703439aa017cc355de63657ff3d0f76f9a04fe7c0f4dd3d3a38fc29a38c4dbeaaa072dd92ef86a42e11344a64211090f82d00ef844a857be3f137ea54bc19061d71607f22d007dc8026cf9943f00d531a309d286dec5612c9408d45498f015ed6ffc6a3af23fdec55b2e480c8471344a05555b88d6893e4d98e66ab9e3179c169bf394c6ea0123ce6ceb5db23f58f5fd051ac0787280492af7d705d7cc1b7297919e39260322244caa4b6a4db153195d23244516bad65403967dad029ad26fd043b8a7aeb16730c2a36e52da553c899a62ce514a33b6404ee35e958fa328127ca9e6ef5a073c70ec947b0052b8c01df534192016c9b38ab9f42dd803724de8f7a91a65ece9515306d4c1743acff6dd681088b77ba61f083611cfabcd32de827d81742c462820682700e6cd2f74c0d06e5d309427097a8f224a7fae82ee62db8a22be6eb444e9a01342583fc62b58012e4e75a84c2a65e59daa4761e583c4038d73b48d1654c02f67462ee823e0a52d0320ff39508e1fae8c76773a1bf0e0846952c9edd50cae6e1d18a77b32a278eb736b465f1de033f927c53889bc0c83ece7e8c30e521b903428178a3cd863517beeb88eb045452a6e8c10f8fd2c71856467af4d903fdb13832230e79a772a6ceec4af29ba3128990698342c33583cd8f87accd8c54b9cb565f0b3441a7bd4eb1f49ffc1c13b9a70e18e86ec3e4e759e35d4f0e17928a27a0570c01a1b6909bdcdaccd0c2670d3a3110a81fd418229090ff65a20d5f2770747bae9f0f8520f51cf9155c744460b853c84d669f80ee5317115c3d79717143f21ec271db7c14aa7aa20adc3a911fb63dbd2c3af420a85212cb25cc1401462204b7ade9f81c314cc0d7cea4b1f3ff7a5a6c4477f6ffa49f6d67ced50f210a4ce4d4cd6aba81069ad45f12c93c0c2be51f4af9191b413e18b07d4cf444a060a83d40c71242f2b6973424892a10977ea920b2f95a31818edf39f6cd7efe035e6d739755a2e4dccf07e0d1f2d5323bca38197090c7cb585038fd0585658abd4f097cc0944299b8de83ec00a9fb56a9d189c19195f2e739344cf1110c2c7e4a8d28ec7520ac29faa2512f08b2d3bf3a2a15e463f055825f7fcddd27b4c59cf118637a7fc9f0fdc59dd8b8ef7048f51750c80e80a0ee2f389542d6f51f315c6ad2ac7e59a9f71781878627a01f5dfeddb29cedcc73ecc8f48446e79eeefbeb06061b60aa94133d1851a07a19304d2d8b91908c3efd390dbdae274c4b0e70260b79992bca0b995864ed42039a15270bfd3213c48198fed4fa65110796a4920f4d214034c09a6458790e15031fe94e90ab888d2188a33a200aabeb36030f744a6944e7d1d0ecac2db1ec19dda5125af336a6b5700807e8c31140ff568703ea073155391ec7fb1211697e39ab34cd53d9837f2b521d75a9fd22c348dc8ded7652f6870877ac74571160ad7a705ead71203b661b28cb7800de5ade1be69dc717463daeb8181b655108da7e4e133ba488b40134684260a667ab39c608a50c5f902cc959e1c0c9a2502e53bfcef1429ab2cc59ad1536118c720e61b475f98bfca71aa55dc893c660339f99a7d4d9a16bda53540678ff0b1a2ac603b83d7a63bc3f3c05ab9669e27db6374d288cd98492cb13c9927784b0f4c0cb5cdc322031c5fd0d7ea25f3c93c0e0e04ac94d336011cb2a60c8febb28c00bbd5a6db9f04bca7006460e785e921e2680c829e240e37e9ba4ca6c6dbd57e70aa81d5f1c6bd2ab6c30375f70e55ed615bdb87d5f6b7dfe92292a510ad8e6537d76c238f370b8dd43417a5f53963942d9b61eaf12405f600830cc39491b8e3f322c92d1875e600acc6de502ed060591a60644c08b53e4fbb96927ea0f9099e84e8e83635605244cc6593d0011b1b53a2ad0353956601dc71122533a17e02e8421f0ff6be0800bda0218fc711e2b89166358830a10b41f6a6a3a6d6e71a68333eb3d34fa4700fa538742cb71708638b421c99ddeb4e88b4e840f540e8c9c5f2db4fb5647d37b39f84f32640fbc7199210acf03c1f7019265a7e429ff86644c48a3388c47596fbde5705afa1554b065ca7ffc0cdd0d383d6710c73dda8ace9a7db5843f1b83c91de82f168538d6d01fe7742e68385db28b76d78624e8fe940cda7bc3e84da4b23b23af0fd1f17515036827f0455fd2ca5dc5d91dbcab9fa49dafd6ec4520060ebd95b42a44dfbc6f6d1d83d1f4615fabc208bd5039d2956e96b6cf58d8f2b9e856853b4158b25ba07d0b1d14884ea347a379ce0778517f945880aaee93cc6f27377f06f542b9b420253ec7c7aeb8e8472fbebc7a795baad717be7f1d3c3c48f03ad51d400d6f8d40c13d55987ab261566e686aa749ec534695f11f663ff947b60da2022ce597fc0fb34ec15f3e3918897ff5eccf1f07bac2e362ec7c86aa73cf85944bd1e6ecb20c307eaa1c649f4382c932530b0c4fe8264764312710083d456ff2a47bfd1cc78793840c83037aa3d59c1d0f81cc6d9eccd30ad57a0c0e6d13983798a996a80905a0c8d90a37ce066f73693332a7c8efc200522ef1e015d69360b8494997d333a4f4cad936cfc591a5a3330867692b3e26f8bb810959ba5dced6c3d3ed4b7f5c636ce9c04a84e4f11f929d49d4d4511e5f21969ee445d0e0165a8afd473548612b885dda606ffc7c625e995c3d240e27552f08ac2b15cfce5ef19e512da9b5133e1838c87161e93b24e0522a760a1f8c48ac5a4e4d28853c63d9c26435ab6cf732cf2ffa8c5f5c296c12d0e22a19837c4cf5a1b4be55964fa4bd75c1e6bd46f823b1d7dcb9fdc3004bb589633a5112158b2ce8ec0b74eab43b4f99afe9bce21e88c703046cc0e902abe8940462090e1766ae49dd80a3d5c10592f67b59d3049ef19b4aca9703677ce7cc7538481eba145af590ce15ee1963807c51deb81cf9658f2828f0ac726074ac72be304288d6e0c6a640108383ecee783ca6d41b2233e0850005022e68bac2ab4a4865f2fd9e967689315e403e330169b530c9f1b5a5016e2ad6abda1fd8f3144f5f8bb70c8a10aab62625b930624bff0ed2cb2bcff5ed87b6126d77a7c4762321f65c2a284005149073bf312cc9897567c569f49a555bcc5dbe3bb7c4e222ec34fe623ca6bab2a5f8b2dd85ec3a321b57685e6634814f5173103ffed5982da3ca96abb2598009b37d14b00cd3588bd9aa522746652e93241e31b7484092cf56d8b32cd31fcb56f60c7fd26091175dcba06fe59a0c5c497c6f34ad37eae4c3879bc859504c09f0210c1e1b7f5bb8dc67ff3b9b596b3601f01920b57fe6a4e6de4c10f7aff55358f9f36dcfc4a3f4c070c769366bd02a93498c226bb2c19d5c36317f5cf50c6ebbb0431db02d3c0765e331ddb16636c16428749ce81d0748e56cf2d3933f8ddeccecf1cbd36ce0941d5c948bf7bbb94c9cb6ef0a9ef4ce346af930657bb82708347e47eee4c42370434418b279a80464a2449cf99d725f15975facc1b236218c4641878c75d910976070f13773a5a259470497e848835025954416d5e37b1aa1fa514855818310da5e68a4492a093c7afbb4f792dbf1df293ddf57066a85f80b409ae4a7cce42cf67363bef90eb49d439f82925b83b92a45715c3c75b98a552128c36f7d2da06f077c33d90250c98a0870d17056fe8a5f13b836ca7e5508adf8c8277c6eccb3c0698f071bfeaed4293caea8ab6a5493eda8f32df573b786fcb38a2c102399276336cd832c4b2790922b127dde5d3f1f516945470e27e62e34e7ac04bffe2d2b3cfc22f0df40c2fe939062f5dd3b9d353a529e2837bbadf93d51a5ed13fbd7abffe068bfa30e205b320b53040ba9e64149d40a392610754cd660437ff3b48a29237cd14dc0e944b0090270af7fc8cd4beb764186f2e6e13d0fb9fb73772ba89678010cc8ed65b30ef5de7d4a3e40f2113b4dd9022f0df50cb7ae3b30c96f16266ef381f86ad58b922f6597f2d1a770890b2e81f9793ea185a8a162d0131992fcea24e0710ab467a49dc02aa631e2ea66f7eddb5f2b2a8bc3064d34a5798843f2454e12898400c2c08eb89e0b70bbf65911f75ed06a5a2966d5783a2406c27b13db449f8b64508cab6c0d3264d286897739b101c4ebc90b0e9c42ebe9726cf26d173f2564e414c58bccd4976cb550810c12d9f9736368b2e20e020240fce9b9e0adc77f7479b1f7fd67bfd672fa34c95c75546f19db2b47cae86aba52481b449340a7613fb2a1322f2558590494847e931452093b234608271c462ca31a972b4b6a2c1ce102878246401748d9dfcf86ab65577e4de1c018df6a6ef889b3990486fd6cd1eea6dbd7d4596dc9a8706e615931ee039ceccce7ed5394a1ce33322880130fc6d82d70c54667753a8c3dc03a75bbc7c1830bba73009250cd9f12fb175bf208bccb8d6a43829717a7c26fccdce67dbcd38a707c5be3b3e2ff81c30c342c79174f37afebd8949f561856601aba33afce703db49d086fe5d7d9b2117ecde06e04ea6518d09592f348d23295c631dd8bfc4a3afebfaba3a9bdf441c4a5bab5f8e7d0f2bc43822b7b4d40a0f68785384f5800809ed7042bbdebc18b47ba7dd0709927165897d26e0fffc280496b8989a78fc82a3922827134d0379e34723732132439b069285bbc3225b5c69735d947910238a9be754fe3fb55ec8ee8f1f7ea25de2f63c5c25ff893e64bd03914444d3f2aad3b3b4928811aec53699efbe9e2bae7ed9410341813522d605b0456f618d2bf4ecf185dce1578856ecff3e666d2ff82152dd65747415480fd74b724c522aa5e4eb1f12014a9201f9f284a1fff0ca605737e58d7f3c635bd1374f59533c6481b1c69d4ecd5b751366782f5f6e1b069c51e9c92ccc7972ac708a135555f4bdd9e80a0f0dc828a26cfd1ff7547121364fe626fe00f6efec41a2fd33774ec33eb94b107fa917f86d8db62f833d23fe42cd237a91a4074d9a1645a99709d8ab5dcc69a79da584516d16d283f3ca89b7a53ad56ee410848c460874cb20a7ccd30e5d6492d7da04f8e2c1fbf26aa0506fe7f471c7865b926a0a1be1b0ab038e655f71f179a08ef40998b2df39e6b60cc7d796d6f99ffa92aca33d85feb53d93b5aee22e8c408f2f34890dc352df3297ac88b05c539aeb5b9d4c7702a42d2ba45f551036d9b7c9a863b6893af9d320423aec1c8c974b9f6a38678cbe64b94ad350127773b0fff9225dd27bdf124a38692ee280b7e49d0d6fa646d81c5437f9a95e555770eb3b5117ec72be469180991aff029ab20f2f91de973dbb5ef4e4f69ffb9f75bad01138a8e9fcb0341a35b1edf97087d6ecda132dff5d024993fddaf763375e7d4383600e27be7f618efb7a89fe2211c72833395fe292965febb7a55a22f306a3ef82325c281fe5f271c750c80f4b45d71f7b0bb887b2933103f392c891ec7f53f22baec770b82be68367f6455b2c697356536c7754e74d873cd0013856c7e08f81912f50cbe49cf0a0a108d2d94dfac76405253dc07b632a32a953da5275f46faec723a770a9c7c87dcbfffe87fda95afbc92439536b57cfb2ab16cb71bf85ca13d5a96823081373989923be6515ef4f047ae78cd37fb49f366f16446f793cf066639c1f205d565287f64936d70ec5587809e96f8ed83011ba5658ce0441e560cbcb8060563a973e93925ad6225bfb0b10e2405ae395ef2d16f973c298e891924208c5290a851c82d7c418eef4e5a09df5d8ef2f79477d9c993182f97898cc0a4563db3f8f0c24851426e93808674f098b1ee0da719e38e45d6a57ec9e151bfc4943056bcbf45f05bf1e94ff3f1a72c7a620576a26a742951ccb0eb5525114a2a0e1af4c8b5e32b7f6fc285da2c62213da4a000c250f46bc46928e65334c4bd63afa541f564c7ac72b4c486e1235e714ff418d55f05cc349a30c88217d46cc87777582a49a3c354172411dab32f317a36b4bf15ec8af8e5009f8cf5bffeafeab6629180146c3001eec45aff0d6e07207fdda676713f699fa58560bd0559dfc614820a40749fff886b8c5f049f23b415b33073c131f3f5ed9f875431aa4840604f651c6420077a9c8a67028a071e3b09ca5904b9dd2590b9416860c05f66fd50305c33be05773edfcec2f72f847ba18e2dfb5864a170e916be5e7cf727d8d6e012eb6e72c4a46425a5f5f0e0946a86907890aa7bf188ce0748a508dc2329752e2d3ac6a1d7a28fcb7e41e83746269ede1294585ca2cd20ce4aeb3584e551c4cda332b5516f121c14181aceef9c2aee1ac20711a282f848ff61da4190def1ea872769a7578dc13b92fdee4d1b0225a94563eeb34046d8faf62de039e45216ec7d4a76a67bbd9075ff3efdfbd6f509d3b63ba0d152dca69c04ca21014c448e25a2be2f33c4b9fb1237e57d4687d7554974a1a3961edc607af8588dc960128747cbe7a75778a3c02554b1011d5e0f978c36823a4ab84378b6d29aa96e8b513a04c56d2ed729186cf25b51058399a4451d44c36a8c80efa6421d1614908638f5e1d1d324f97f8c4f0898f83403d821fb9a3c0bf02b9a00764c7c8ebbb1d347471403ab7d5475975e5e2a416e1857621bccfce9877b36862e031245c99b228036b2af0e3815d8bfd048a1e1c1130f146219402d3841efd4e8e0e0f2769da99fa10caccdf3020050f73d8bd03374864daa2a8524257e04016007fc0d79ab03dd3480c06d6226ec46c485a4677f90fc2b197ce238ed4b97efdb1176e99dbb86e84c7d8bb2bc92b822d6326a649861437c665a27d609b91d7cf94384fc177622347e8da54b44ec3cc3ce1eac1216e563c920e786e013e4ba92128336ad1c6fc0468eb580ffdc1c42575a346c103c44b27b8b1e0068164e7b882554d1f4287f3f3e104b7de6b9ac7430ffa3a7f4ac0f068879dc464d402062519bc6207177ca12a386b8d49e52945f680ba93d8355108737383280a1030f806890141d398c6f347c66e08478db52f98c8db96f8ae9a060aefa4a9091ecaddc5b32fbeddec4bcc5e30a8024355eb951fbfe5353357e98902cd458d66f15ebc9f23708987ea1dea707117e9d0c308122ddc533a68ec8ed060e27a351e712f8a8319e03b194723d0b5c9f4fe3263b0648257c017d3ac38a103595772ca55c7a1980646385ff820564a087066a9701acb4f92a1f2ef91d24808dece54ac72099d82c89352b637fa6efb3b2f8f6004c796d6ef6e3286b146533a04be7c3c057f14bd1716cd37d7e96bd5ff2ae6dfaaebd496d3503a7210420a7f0e9e39375cae789ef91623d739a7e3c8c82e1c73c165c556470bc2bd784683580618a4083dbc35d330bbc34732b20c0624ae80593a899dd4305c63a985ce292cc1ea03b69bc226761cc7bdd2833025bbefef9b9e4ba3befeb2648d75f2757287cf6f421f9acd411818e17fba652718d2cfa50eacb2b920438b25880aa9dd5c1bd7bc2b1db7027807ef313f3d74ca897a3f4962d45b07ade0de23ad87d367f11e0f29737ff51e013440de8100f645014939a31b46c7335a41d9e3e7ecab6e59d1f3fc767a9787fdb0a41fdf38f921f6e2805cb9c39ab68714d07effa2a8c265ce69343a9ced22e57dae6a6d36cc0916c74c3a8c8cf88f69f449efb2aeab9414b2fcb5586bea0e873de68a51e96a95b73b9bf549c9b87499855d73b861c8e9915e66913b9f5793c43b119cdfe031f1ce9b9552bb51e3e26b9baf82618adb386436744a3f80039068429635883c6d493f12d23da32fa9826349f1768837cb592f503e5c299229c0158375e04c44ef71548fec1b4568012c7ca6e3419607005cb079f451cd42d11df57fd8d32cc9806b1b98d343774822b0b9266013350fc32454b137a4c27be3a7c5de5cd986f4ed97bddfa2607e861d5f5f77818bc930b470d2d06f55799fbde53fc32afa38f89b7e0cdb1fcb19d72ddb034fda134b85e57479389bb81a136445cbcffbdfa760b552f8b827470d13f8b833287bde84e2933547239f63c34b44a60726ab4709223934ffce97eeca27b8ad2e48ee3648318e91bc9449e3482f80ad2b100dda5be18a8e154f5075e26fc3062a06123b2f667f2f709e2370129cf5c99a68878133fa67916d0d9c825518db75ced399af4763a0175c19ba1220b7bb10918150fc6cc581887ad0f78e3b37951a01bc293af86c1e458969d07087a061e0c0e4a5b07bf3ddefa7ce8ec1b6578b2e584f522b9b268766e4ed097eb75b37f1e67f012457e916d1b3b1b15224b1a4746c1dfda43c83814df20bb65ade9ff3cb37cda03900bcb7d64faa5c87e390f933f0dfd64cd821730202479106923b2f2ebd57baa8542b025edd2076951c38083cafe9e9bfdca1261f56c4820034bc4da5440a93e22a1513536983c3782f2d3c4178eddbb8d5c59b70a1519843a7351cd973e175aa17ee117f9635489b395c5b26119133666d82a4a32c53f271798ecea55eba81e9d876b81b52f2c8a47cd9d1fe7f088eb0c485182b8ba44ab1ce8d37b850e96e6162cabf0d7565dca3f2947f9a0204e853a15107e3b8ad113878c8da5905d42daf3b2be2db9c07bb79d15240594e95a988daf425461949daa0ac78fedc28b9f04a2d8e9412141cb9087e494551ba8c9dcc0b9f0bdf0431feddad7e9eadd457c60a4cd8d6aeeef6f6fafa9c50b3f32805e448d277b99865395a9b8afea114e53acdbb5849ca99b3375677d7916aabd026aaae0e440df5f114962f8ab105b6a2d3964ee85e4965e7270cf35d386db3d02c51b69ae6081386c3c700b33052b5c581d076759f1d250a6917a51976e5a56855cf79f6ac9e640631319dc0399c61127fd47eb4e0be4fa59356fb8268323edfbdc3a11841fb592175cd7f98892c9f8d6e3cd9713ac135514867593843f7bc93bb82638d2fece5d074af1b35ade1e176d16994006d1d42bf0df55ff169099d57d9d52c9819e477e5925f52116c97939ab1af1faaa42b77e4521a740df87ab6a20d5624978aa3c8a6df579a67174146d6166396e71ca971bc1775110dcc0c690b998fd1f5e5dea9b631cd3eb6853a1619559790c06b9c53f6b8b09f7f53a65c9477a12524a4882921b265cd6d25d2700212e134605ab5009870d8aac5a23678bfdae47e31636b8d8582ee1322731619a167f21eaaa951ac0ae22791b8a3bb259d38b3d197be249eb3e06fd36bc2f3146e75075b5e5587e07082ed457d45a30709205f8d52b5b7432ab85d9d47993b546c1911846e33ab3cad2331a2b2d5c88783479d4cc9c2722ea2de9be350673c6760cf8c0334a00cc9a8188acbc152509cab6d8152ca3dc05cbeac31d6183f568f87b47d40aab909eebd031820f4bd206822223f61100c50de2c46e9534345ddd5bb14a6860b7840ac2d8f18a4f001783ac7f7c4db7cfc3182f2a1b4fd083d8428692b0c808c2f349471a19190f52fccce24f93d13446e1af745f3346a61d695f4741e98f4913fbba83d47036dc39b15a8f8ce4b2f20081a8b3836e83447092381355909194cc026aa72501d7cb94ec448993479ac88c1308bf627fe47698db06334613e2db3bf4756a2d0341d9337bbb98550fa2cd428236661bd8ef06ad21c8f16b6ba87dd7b5694d4efb15f6ef091201d15586692b2ea84ad90166a7b4c02b92df270b1d4a203bb391139e981b2e5430dacba359018b85a1517c972e5514d30e9efab297f29a04eb8af1d86d1ebd504d9463799529653a13f7620a99377af4d248dbe2bdcea5cb80116a6af855408eb6463e89f27f124b331428b138f06cc8a30b5b9ea1464cd403433f7eae101d437c395edb3114f0d0a16a93e08f72ad6543ed3b5b6bdabbc59893c16523489ed71b55b08c09f74fbcec227604f6977546d6f8faaa18da7d3481f198174b05c952795c76adc80bdc3424e8cf707b9dc828f4b54664207ef9d972decf16967e979a79476106558b225957d40903f655234ade272afd6b19abae2d366ff98243f2868cef3e1dc3e6a5916804f3c057dcc4e679d6d63bd4d2765fcd301190eb2dc3de0f5da31fed49be2ae35a3100c51d966343e88b3b0c7c638abf1af094b802916558ab6e91d960641957b06d2d4422e7d560f0c6506d6cbf061ec68ec206f9a146796793685c967be1db53df4d5d831675a1d16a27651504091fcfb71a9b80adc75e672eef2e633defe12c715cccc67294e0f00610722719ae635da759f83960a1d8137d8042c4577b5c0cea63cd982a3b07b73986bc6ab04ede19e970b3190b3f04a8d2a5a70e55768a95671adabb4138831232b1f3d9311878819c8d0cb0c8f7f99c18bc808c468c18d87bec9c4c9c40ce47c658e4f842ab491969084b52731f8376924f4b48be239b2676d6966911f21394e0f7cc8d08f6d3566403656d3bf1dc5285d212d23117b75568fbb27ac698962cfdcccb5ea2a9ba279b598d00759e115a870723a5893b5d177ce767182d83c764439ddcf5aa330e4214edeb5ef9ab7d79a88b4c898db1ddb2135f3620953b64c8504f5bb82980a34252222a12adc87d49d2eb16354999ea3605fcd5b01efbcb266253f9646b1f6db5458d83a97607f8a9264a374b6c334faa8d946f27759101e46dfa45c0b8f255dcd16cc2a064c737628e3f3f1b018009263c40c83b3c8efc40d01f5234d51f31a338f698ab0c31b6bca2b6117484fa4c9c4a390b419cd3d192facf7eaa4813d1977704f41bd5b0bb7f707417a5e025f1851dc42ca08b22be2c905b1b0e022799f1f66d305279981faedddf6fff550d855560b06fc1f21c2839ed41952d051354f9ab83904e9ef7b818376a26cb06a36d1308aee40869838460575f58a70f06671b1a69d01f40a64b6884d93f7f359c971c75b0d5c5617cbb47ad4afa554b93055ddd9c47e8bc0e5aacee15aee0102054ac5503bc1da1e4da5ef12322f5c66cc35b88440c2cfa59403228fadf566e815f7d7a2ae45c3eaaef13b21e774f3c0ace009d0a85eb56715cb74d061cac3773d1dd25fb33f3d987bbf252dda64d14156c4a46f3906523ca376e30dcfea6dd8c2560dcb68e226759afb45b20d9a21fadada9ad1eda91c0fcec2e3f0b216192e5ae47fe8ff31a8c1f3e025e7e0fe1bd9ee9ddbe7954c38b2b0bd01c4e880d0e01d3238debe82ea2706f38992913e0d7aba43517aec891f8c24a73414c8d9e1bf22a091b0043e9083b80405a28b644b003a4a7e12ae1d944c3fd6831b825aa85d6bee7ae7f99d857244cc3ce301f651ee71f61e9bfd2b88427c5733fc4695b42240d855c9fab2c842396ec0fd15e9ced8b85b2bff84b3ca4782d7282774e25c5d2f43bab2d6d70f1c1d2b6210d89776a722efe97e6f84125f89c7dbf8974120ef66d615685cd62df6215ebc2fc5ad7621e5d6bf2153697cd54c56adc5e45fa36156ee84b3d770e97f085f55fff9b712503616a411e4b5dba9903301fb2850e5505b354e414146b68ec6dcc2728d8836aca36d98c6df50b542af543359268ed85bfcb7fd50c08a0e4c3d725cd59e3c2dcea3be9c41a35f14cd5f7ec47c46a0ea0b493977eeadbf63959edf75cc332a7ecee656d77bae600c6a71b48613ff7f6a617ad5b08c4b9bbe6da03b36aa9cb20816056cc2fa33d3bd6295fa8ddaf0e2d1fa3a96bf900a3e4cce1be33836f0bc5ea2e3ffbbd29bf2238056948b546f4d683cd2b480a419f4fd800880de87ac69e0b91c6f4e5dc0899c4bb58a3a9f7a7eab4a28a2cae798a988678ade1d233c3055623fca2b11dbcf29e60a275b963e48bb68a477dda827f5b545f4429dafd4f09c4c75a3413e6f9572ef9d7f1ffb6306b84d6320b4e4ba5d02034549e810e65705a78712a15f07acd38feb9110ce97881b49843fbe2ac05f0769daaa6876b4285be5b08b297d730ce06a7058976090b3b12086ed5585a5106b66e9196bf8e82375a197e581d3304a7fd01b6976bb6cc37236a39d9745ba67385b8a89a08b3401333fa5a3c386d491c3c43f1e3fd6f5a31cd66876eadf2ecf249808117e2435a236163d0f2072dc76f65ecd64ef2826b348e8438038c9b023889b151d96725dfe431f793ec11786a0a9845b9279a5c957e747c1de588fcb2cc8adc5871bd7e7b674316745e43837cac7f93bdcf169a47438988d126c0ce5f32618d04e4d53d7cad337b8633df2c9e29a559af3929a438fda89f7c1be45accb8964a0ada5512a1ab87f498086d935be700d0dc8693283d91ab003e42c33750e92942b0ca240a3915e26c7d8af711d48b916095c281ad17f09c5ce078f9927ff1e3251386b02fe2e13641fc542a85df3bbd8b94e1fd91bdccbf256666dc506e6a7118bc674edabfd52bca2705ef42b9cdccd5716be8454ce16ab1eb936fed249f01e17b6935523d73dfd022a873c0cba8f06b1ccf03849453919bd10c025f7dcfe5abf9ce47dda71f76944b83db10c6f86ead0dd92c188fe78704cea3a3d343bb403fd9f5d358960e3421660373d20cbfde28c26239bb15d50c58845c1c0ad73f3232c8ffdbf11f689a24ed8b57b67551047a4c9290deca236a096415217c234f598dd867ebd98fd61206febdc7584ff3085ba2f0ed3fc16564dd7c0f6c8427e1c1486648f727759c3693d8a8e17aee846f1e500958e65d066235029767b43e8f423f2dbe144a39b292f19fbdc348e5df3040ff78dd2c410a03f9d678b3ac16ac19d84b1d5a9ffd873080e5369f858c07133cb3db6ba0efbfca0e3b0ffe05db70aa70537311ca201e6de3bf16bc68bfd8ecc995a72ae8d28a30368d2bb435ebac1f45e31d31d17322bb28b18f9c8af88d2944f78660b00e26f22b186b7f2843fe76762d5c3bbedd1c334285fe1f4e8c5fb687862ac366b0089182b64a16f316eff471af59ee2af56080521f7f0240727c7ad8bb43fd724c8d5c1efeb7e55e209dce43720c2faa428014d07b08dbec6e7e6800b92d0f498a1e23bb815ff77cd3d330591524cd041fc0e268a4e94f706800af7256f2baa60f2fc87999b1774a53885c174ffc2d33553b417ce47294e07072ace858ab547d2b078a3bc789604c775ef89a19adc88f801f38458eb26e8ceb610abed0be0610ba72089f3c8919e30f3149b199a11d4def828f444b603ac4ef5e69b470e0ee8e06a2cfeefc1d593cc1cfbb6c30506c5d2ec96d326c30da84abe4a32eabf660b2b871adc41da4ae70317bda6bcace7d28b4b5105be15e1417557d467c950f874c51d50cccd720935457952e73aafa15e5dd704bf56c9a7fce9c309c57a103e1d031214cd9ef8e1b56956339e8124cc8681cce5ee84c13d561f2c970d719db12747c66c4caa3c7858f7d17d39297dcb1c2f30fa708dc4bd80f4083eea6a6972503dc5433a0bf0b27b2172b7dd4fd368603ee51923fcbe6c6adbabadba04a6bcc1ef0ed085d3eff0d11dcb81dbe322866c58d93c9e0f7f532154437a96a80ab84822e4bcf7c644bc0c5d9a320b9b71f84ae9e9aed41a53115b07503fb9dd37e31c7e02fb0ec10adb5e638ce5403ab0259ab8bd581979f6b8ca684ae7dea09cad901868db54f3b764c6d9e865b9e2cb2f93b75c4c77413a325c158adfb22a8f159625bf6541d07803906c121d7387b3c6dbd67ce4a278e943540838289ce6e69df593a5fb7d2a47c9a853539966423e5f237e1c6b282db3d555b67ac493aae4803c2795657ea1ce0698d9f2143b6e56b9d3f745cea49a9d3c2827faa4c629a3f7fb4784af695a753b7033ceb48a7687054b1ad4af1a076d0d84dc13d21a92488d7e407a44442deb6995d8d5c5eebf9e8a88079810c48e394b34bd4371890bd1036dcafc751d5476df0652ab1565fed8e852331d52ec1eb854bb1625d0c8dcb468a578d157982b45bf0e111a087508a879a1e73422146896b194cd39479dcccb2766968c8314f113c151bd20ed0d6e87a1a1ec492e06424331186664f7670f34abcc91ee0b0230d6fa75bc034247f81024d8c72a7183d930dc539453d9521fb18d1282da1f10cd3f815879e3d310cd33e36114cf3a6ad422fadc3a38463f240f7c7084c609d692fb051c4ca7dbc4460ecedc7fa34dd3773b7618fea51f08237e6f69fbe22180f10035fb4b67938fbfdc094e211b49f5c8381c5417902af069ec7f66001e5a6f71050ef68041eaf0b2ce0e66e3ae5bf9af8279a4069a05fdfbeaf49d0935544af142e1134f2516ea4e231582b5c6bbc7be033c0f6a708a2be9525174700643306c86fcf2092881f3373d059893598fa6dda2e58f887fd7c0fec0e349400aa02c84d8d0fc32c598c461fd0c4fdee6508015d4bfafa52580d3d003fdec126121e1c4411b6756b3ea0ef3d274bdcad48baa2e64c745650b22081f7f8ca597f03a757924cd2a7630210479c809c7b6a001ccfad2f09e2c82dde0d1eacba427a5fd7a908f588db265b0795728026287831dedc81d1d0fa8a628a919cdab9e0c9d41d6ebfbbde77cee514f98ae8aae3ce09a063e3cfccce9585b176765cb5a11bde31ab2975e9dbdc02dd315b9cad54c4d92695dc3434654a0d4e61c7fb8aea717b0b4f151170a1a76c6508be74dd46e1045cfc24a7486d2cfba048ae8baa28aafebe16d7e8605eaf5811473c9f1a2093efa8312fed2d68902d619b8e7fcea13c6d04372246661427a98ea654a173a931f16f69dc9ef6349e85710beb761ffc4d3820d8fea5bbfefa556ddfeb180b6d695f26f07e9f1ab820245f52057a5b4a56e19b36d671635334900d12d37f1db77060352b3a317f9521b3ba46d6f12974279952bf540f7692dddc6359a5f0ea9288cfc412a654a092889d323b951c19238c555e74221724418ca43927b8755a62fa0f4393bf242e9eb438d538440072f8f65c6cba1ad201997d73d5a0495b5a86a4c4d10b010dbb703f2f112707267efc656291a232307321a30cb7b6702d4a9ebc4b2c954ef15ac00d4540de4d8c108e7c5fc1262d58de278e4a581d6d3f971d82f65a00544ffef1341696ba4edc7ee6c4d833272c56870593f22150253ea751f07d517e5290258b19dc8712b1c6ab778ca29fed71207265639f85a034a2e018528f70236a7a5b2a6dc15b1184cacfcbdbfbceff32cc5c6886aa8d474419844f1c93f3ac8f88fc7c8128f133cd6c27f0bcd6dfc321c78438086fd0bca2739d0945213941f2802a48e8bafa3b9325ea796ca5caa7c044e4c729a738ddc850f4da4dfa2031bdafad6243ebd950c0d227f6237ad047cbdce96a7f768a5b29ccfd628cf69fd0545891d7133eaa0a23ef348a99a76971ccd8d94e5cf5160fb27841d357ed318cdde1a84a89d2632927eea4b1e26bda7237f732240374441155e13155ea77437eefe6321acafc5c62b664c5e72739a47aabe70aef15ab564317a6e2280d2b8dac79cceca9bdf10622639e74f34bce785ff4c8edd345ced2e33724000bbd931e2650c59bf48e8543ec44d37dd4ce2074e4198e1dbdf6e4ea59bb696bb94250c847319ae1e11f36bf2a83aec870bee10a5152b666400edb7ce39c456c55c11aef9f4b31642dee0508d2582d275043b68532938f7f94a7e1ac365fe379092ea852e61ba198e307ba71d7f24fea3135966adb11e28b601f7906aa23b14656bff94ac16fd26865d0be09a67a4e1d434d99622f783e0e9853f278fa4ef3750911d92e3b3ba9dd7f86dd94f7d96a1849ebee4c2bbe1fbf174fcf4fb7df8223fde793330eecabc3f66f39feb3260950b51ec0aa19b0c5b1874a01ccd5e2a19f10f10febbb8fd8ca1c09ee69bbaf2e79f04be4802828bc0e64b6b0bd55cf57b12db8b2ae9837be2ea0d5cb3e3aeb80c23cc4e83d396d2914b0851a927fc4e7e2e45dc7dcf2388eda72e31344f20d9be44e3ce7c1614e0dedfd131ba2452d924d1a3d7a0e16892710f29ccf500219ce0981cba52781fae9e450ecac54358c3aca75fc0bb1afa43ad47c638a5ce19da592656b16254f6b74332ad0139b454e6c74c82ed09da304eb3c206320ed41c447d0e26c791e6330aac86e5ba2c86ebbc04527d0d697594c452d262ae8ca873e3105c9766fc15c1fba05a39d35af63c0463727d9e7f231189e6af342293cd06acc92b2c585f10dd842f1c9ce961e1ad7394b72489fa75a3b480476459b5ab42d50349d472d33f0979b1b3cbb016824b0e20c715f90c1525cd43f6d8fe13fbe5da5d3cd7b4daef1b3911246114c7a58f0ad5454f5b102ea1c151fe0324ccbd0fdaf93c91065842cc69c67c44a977f4e82ec2e66c4238cacfe0cd63a62502af2db91919f81fba9dbb15f2ce3ce2878e732e37788f416983c96e86fe1c912627ad9a1088a7ee132e29b1a0abc14c2da7a33d2224216c9bef60c4163618b19f4a99ce8fd700182318f456947ae0043129e5e9870a93b5e88b66697320f54878fb230f176af42bd7c511d22604e3b1b60c7d298bd1783f908590453d241e3300976c162950ec26b1aedd83992f877e9406e5b21dbe3b80f23a83d44f1010c22aa15ca1af1251ba310837d8811b27813ed951e11ee6f8efe11b2581b4a201b83e90a9c5b8b88ba3e007fc2a11da087ccf6ee95d720e5e6fa181eaeb7c90b636217d34cb868aa74203a6451fdfa4f49b345af930f9eaadfffe6e116958adcb977608cc58332aa0138611a18f837646d85a84f0264b158326b37165014cdbb73e0ecbe41d7a4de85d313b291c5f1871aec8480be7914b78d062e4e93431d5ae0830f1eac3ded695eafadf4d1b34d14b56318a36577b853f2d20c5fc6873b243cece275d21988cbdd60ff4ca0b4641688d814b6fdd7f6e8b35f5f492dfaaee36928e3189c71728249ac4264c25d1c628e56877a3fe9cd950cbc0e98460ea8391e26cd2909471a2a0c0dd5d222a1bd1f04c3d0f693382ba2485ac910f4603c18bdfb4a9b3fca1b205073bdb0701b774b11406199793f1381743e0033d62d498a0944085dbca1ab4aaba454abf7d186834631a17653638cd0cd16be84c3c99a34c643af2c071f30a6d0e98aa7dc29bb379ef70de3f18326859a12bd9d1cd0b68773af1b2f482e58d85427935ce30a3ba71a39514ac400a8824d6f15a2cd48d89629a98e5e39632497f4c716102c67281196e6f2753b91f0844263349333517ba569c483954e3a4af7bf7132300e914ba6815d4f9d07d113b72710c79cf8fd673845e10040fed5de6046ed9ba625863e71b2a7388b3b52e1b48026e7198f6382f6d374389e67bda5321ecea975011380f112a4ef0dfbd9dcb9e98c59cb26b8fc18c512a9386671e80f2a7a02776e49251db1d255719849138d9ec21cc2ff152025f32e088439b7032bb39c37a0474bafe18799f4d32b927d112c18eb5ae565f5dc2bb660bbf7232b7d7bacbf79fbb1ba1fcd600a241b61b6c0e00553e2787cac5fbbe1ac8338e14f55290611676169496ab0bd04d9da86fe7c54f265ca4c0eee865ae01077d75f1354e2bb43e1a265caf29a20fd6c8c7e0a706f317a3d8c65ca26e0b83ca0ede45e7a8789c192fc63362de7e76eae54acfcda396f0789401f5885c0a43f751bcb2275c7eaad91757f0815ec04c9db3a2ec5a59b039164f743ffdc46a56ab7d2081ae5a7d78740b6ce2231eebc5ec531f8468c021787d192969a1c893338b5a5c15f1c7d89e14b29ba3523265e228da863a92f27e4a8feefa25a6dfa44fd7627adfd04d3f0a1be452b9cc48143081503e724af47526fcbd610ca2a73de36a926436970b1337210f1cade2e91d385e0b123f91e1f06c5350afdfb402c31449b50c849d424a9e235649f904434d8c0ff5f85a6cba70007cfb8c3d2bfd65066afe8a0114e6b724c8675468aa7f2105dbb925ebbcd5c31b9418904d59714b88e379201b5c19163ff33a3a66983caaa6f3ed65345872f4333dd52e28cf84b303a44299084287330c305673a6726fa9414f419e7daf94cdea20fd057faccbd2c6e38329a43e04c4e17895e0f7a53eabd628cfc93d778d9a252f5d3b808a7fffd04bf0f0aef51d775eb1c4481b93708aeac67e73c9a9db666ce1603fc98bf0bac76a9218b854fef0bf957c8e75c611482adf165232ce1b7d7cdac92b4efb5dbf1ae571424d5e7c7ba8c9a343405dec67322e44e52519cbba69b21a6fd361b279fe3c66d1251cb08f91c26eb97b6bd8ab9384edb3062089a91c7d4423a3178ee911284615c375a572ec4cd77e8062fb352472e61016e8f7d48e43fa150f561c4a1f9d9ce015eb3b47b3bb8daa4c97d024bcea9a50804120ab29860c0501e039921addfd8cd949d6cb04dc32a0dc6685d8b92952f5ff6c49524ea32c4e7e7c8a818a906e995549965bbbcf11398b401f1dffcea887bfda5770d0863790550e2c2a9d38b6ab21e363ff93159df21b10187cc149cb65923b507ba2bdaac43ed2d5655d4cce9659888f3018c928cb17c1b5b7893f4fa26f3db479fd0048b8e1aa7a667c057b7cfb85a7ac741a5f37119f3130c95dbdc484a58961b9323a256a8ea39806e514dca792b355bf3567fcacdbd4f86e128246a2c317721853ee932086a3da1e64c469f15a90e9112ba262b9dcc4a171452f84ea9047546d925f1f2a89f8636041fa505b1208f94af2e3abe3f378ceb145883062f82e768d2cd384d5bf7e3bb613304db88aeffd129e4849e36425d14e41f8bdd87a1b4a9372eb46ab103fdadd084e7aac3b788b0c7b6c42a120263dc6081e6dae1f403bd180566e275ccffd99fafb55239765a4c17dbcf86bf776f68492aad77830f3d8978848b757dd58c31df1da38f720d53c657ba21238d18e15462d6c82c11ce75b81d8ac897dbafd921530403ee9c36021ae7759d59bb43ed9d64f064bc0178c9eb9d90423e03681f2f837dd3a9574f76c5ac77c51412627d0dedec3280625c3bd8739b7922d4ec95e63f62e5450c18f78923f30208fa4d50d5d485e7f8c4400417ad1683c58445812ad90d83e077600e1bc587370638caf873ba43c5866beadbe55afc162db30ac5cce76c8dcc9d801153ff86ad436b80f15b158d782219479e863242446e8fa569e6e2b6c9fda9cdc32f46403142841ce116b2428ce29b1f0d8880880b4ae130d0f869d18f93434d24a7b9b6ab8b6c4430c77bea6471ba4fac862e32479cf6d4c8820894f404267228982ec13b3dc1aef5a21fc5a1a8ae621e6b386f3e1c522aea350884eba9faa50a4d8ad32e33a5df009516d1655cec9bfd178fb12c34a2c638ba376e5c4e16eae698cd6829e7da4544233c0cc4356f1fae2e765882a46ae1e35b28c0e4615fe14eb0b6972f950ebb9f2f58642365faeb6f4fb35d985530a8309a08fb6201b0a440a15af6b00d75fa4fc2928334613a94427940b4231afe00c5fc0847c4619a92188b79c943859a64dfccf059ffcfee2559f8e22d535d2f9d979ad83faafa75ed9170f31e35c322f11bf17d397bc449aa8211d2b1291007874602d28829ab92451fc754f45d605c0a7ab5c8881eb88b2f9b171c4ae7791fbd054011417dd3e09997db9004bead72c7f09391dbaff80332e7143e8f8d8cf1773b51044f9b9534cbf10dfd9f59aab09857f36017607bf2467c9c920c71dd60c53fb452cff77ad2ea22f9d8600a4017a0ea2121289e19a49ec01f38c749ceb8ccd148e48a000c976f34462df34021c623550333a6b6403ce40b53c37c1c3fb886e7a307a71f3b15a6080fa8f60f6b566feaaf1e4631086e06f3889313d34ed67a34cea12d53cfed7570418d30889c36e18a4714ce7a9c636beb40cac9257486c093224c26fb2dba328f0a903603ea02cdc46ae16a29a6fad406c81ad17c69765e5b7c218afc862f4a182a8f41ba5cd395fc145ee8c0c852b36c1350485262bfe7601147a082408baef83a8f661587cc6805d781547af5e197e59d58c1c6bb2b32d46208052ea882711b419ab02ebc485d987952d839b0c23098ba1a9bfdf07df8c476a4a15811c81506f79e07393ffa25ab074a892a920eb1b1b378661577f4ad84c10e386df8b90105f493925819e6782da71d8b12c31380368cf293bdebed6c03eb401a240946b1121c018d4000da8ce39708e73f629ca422cddefab5a2c46a71ad1a0d382d832212673c8738c191c1b04cbe925909ebaf7782e6c2bb926311cf6707e0d0fae6c7a8ae950a0d59d76d8095e9f47c70645738c1118408110ec9aea086d673502b7fbd0acf8c30f00a1a18a170acdada314e83e156d2e66147cf7a696614a67e31be00f89f000ff67e9fa0dad44a31745c9cd3f21f56a77cb602eb7fa1c2d8777cd6f565601923e098ca852c5eb41a9cdf2c52d293dbe0b9c20e3a3296e6d15a366252d354072b5a1e9b0a1cd91a7d27a87af14e57e23b9f153a879735aacaf4afc69ccff1d818ef2b28f6f411863754e2099df2dc3e31479458a664a948c1f9afd202ff640a332beafdc2b8f76cbf907b6831cf555854c0742adbcc5735148fee72cc64db2f962699ab65b04f2539e726cdeaeabf0a89450c8a96ceb908ab1d2afbbed0be94050d82e282e0eee85403bb32443d85bf1246df604af826febb9ab0bb2f2c67f6712bd269bad77be8322594f59d6c7f7e825ce21b7ef5523bbfd6045f1cb97f33b4d6334956d8570dc7a5791eda292950c914fad0906bb9da480a7f99b37b9846ba6e09ad001eed8870a8d996322c058b1edde2580bda085ec371cd0851384eaabc819247406862987aa34247434c10df075489178b3e2a3607c1edf5a91fcaae9c446b6f615517704decde29259f09eb76b4a655478abc2445a76b8d3f27852e5ba1474e4a8805bc2426d5d62540fa54e03b1a7f42fb481adda52b3ae4ee70af7d18f6fe176d064114485ace3bd3c572a5d2d5f13e7294497390f7f6a876844138ef21e1a81a7bb8ac329c47ae5a7dfa49593a7c5f496a8592414e2e3c6a6623325374c701a9e6d2ed9ae04ece59880910b84e330a3674070d8b1417344a51237b865039e1ab4dedc13179e487fa476af856cdc0348c16c2ba1bd11e6639d480cf1bf456a4ee4ed2bae0f2bc5ac491517a06fba40ee8d501309d668b12c18209fe7d920c884f7bbf8e5214b967bdc183035b0a85d3ac044281bc85adbc263990666b82956dae078d276879ec6c96a2710a3c6fe25d23d23d8e63396445f0ab37f0377ec9b1a79cbe6e96ef8a99db3fc7f0a3954dbf69cf79dc9bb0b9087119342b0356edd04ac97b01af9d11055549d75d8cb11b3cf8851be573344ef676d24fe805c25e66a1160f808528e19490990e1991bdf1641cdf72234176a4d879e23b75d3d456bb9132e7dc5f09622c0c358adce7c04ce90d2f48963a9290d980ccd05e86c169ac2af091889a6149f2becfbb1d33ac5d99c78c7e702e2402f8bd2662314337e1d0940583baf5510a376e884957365d3e415e6f9556346e1f0224c3d30840d61051cbce2aae1de8b987c6e918222697a6dc9795b5d344c9203aaf1872dfb263aa9c40f26f19a3a3fbe325943a8cf006d4664d60f08f90d007cfedc3770620263a96d5f0c084c8102a728ae77b5a22b7b59e574e0b2a65a01921d491ae334c84962874f0c77f0ba2145db7a6a92757ed271e3c2cb1001f1eab0bb9bb0283daa616a407145bcd60958aa395d65fe54e41459e8f283bbee217dd10706011b4e08212d284a093a4cfea975036c27bf648b0844938aaa0110b8367bc6dc60ff1fb8693eeede426f15c70109e1975c81b4c32e471d7e48be36cc17bf54d9eb59c86932861c2885132eb4beae3e1cae086e805c71365ab446f6ab12d57fb07384815af8b7cff51e0056e492c2349fd229852a7c58c229d3a00b8f7145b0ffc5a93b2acc1be91d8941c2d4029a093e014b020f3f953355935fdef76fc1cc0c9dd56b3380df5fb56b3f3a8dec5ec14b91a5a771da8329a81184fb0c3357e522bdf46052b6e4f01a9fc032930b5ac01b77702b5003719e2ccea851c7b705e6d0b03f75a85fd6b340928e4403640b259e7259308f364c53acc70bd8b43895e46f5cb7e331ce5e85bb2c5470d8b388f2f61cb40169567e540b9c9e934e21ab5c9ad201738fbdf0ced0068e57a152555736c9af2201d9957683fdef1e81132ab60bff2bec82cd09e20518bb1690c100e135f7c39657ee4971c6da58cb92c94f640ef30c6a3c6e5435c1ae87214804425da7a58c244fa1881cc396079d260ffb909f222a0119c62842b5027132547f1c3c4774f17d83abf3c3e0b69ee1c944d4f56f024ee502701e13f6357295ce2a4452d9d5483aa0cde59f219acfb778f98679beba3c24ac1de4d661932abc8c7dff298c8e55c792378f386c4e88cdc320ce46b017ab276a7a5f38035207a95f76ee24ef0d2ce9b7cdb9312b8c8f3bbd2bc5c1c1d218a609a955a577d121456b6b5320f5c4c14d981b1d2800c6ffdf57b6935f8e0d74ac06612a21179e72726ba2f666ed72bd021cc06049ae13a8f59309c19a5038d6e1e413493ca32049671ab75b5f648a9e5e3254b8134885ac295e5a3472f731f8cae3ede2fc2e3f23e065213f4bb9cfe48715ec560fabfed52b0a795a9927ca9e0b711382c89254492bde5de5b6eb9a54c4906b30806092e09230a50b982341e5d2030f4eeccdfb15ef6cdaf48ce9b614636573c5a1982fbe691086ae3baf25de9e6894bffbc745b48948442fdd5352c44a7254b48774e13be7eb837e57a1ca7353a0d6a83f37a8bcebeac9f1306671ef30281c17d77ac9751b3ecf59a6f2d33053bed2bc43bf7970ed4ecb56f20a741f9cc4c9d3ebbb07c36b5f84c71ee1fec8f23fa1257dd28d5e45dbf0c832d59722d0971152d90d50a47b8ddbc6a9b53b8356ed41bf6549183f1b73b5f4ca436bf0cbc43276b4fe10848e1022982b0253fb311c88a3a9cc273d953ac83c9e863d82885fbeed0a7b22986b99cc2d9e873d72e7093705fa0272702a49f8004488f81ce21dd219d43fa3cfba9b25fb1efa94a36cbbe8ee87d2f26b3dabfed86f6d9a58fe3d7579b3fcbc08e3dacf9a673f5b6ddbe405278875ed4753102e21d6c5e7ad989ab69651d01bab88cae3fde3abc7d5e61193ed7e08df4b986d31cf120cd0c9f27deb69f410697134b8b476d2397d1e871bc814ab5c5cd28967bba40a67b447dff476f466925121ce2e01037f49a0669cfeb45453e0497c0251e65d69a7594a028411d25a8a3044d3a972c71b104d54b1a67b6888e225d9ec3288691b08a8db0896558876d8fd560580da48140b486d6906a6acda80602ad806aa07fe7da05ca267781808080e66fb791d400c50c45a9813fa70fb9fb90fb90fbd0d08b2cd4de1ec7294c628341f4422015d4ebb50c8170cc146a8640d7b77cbb40b5bc98d3c5bd56c4d9838a8838fb107620162f2101083b141999dc8304ef68bf83bd7ccbde34e6de4b9f278de9bf67ccef3759922dd9d73c176f568689da98fb2c53f338ee63ce5a6fd66ec67e6427a594d2acd26cf4d99c6f569addac3d36b2130772d8dddebfa6b77fbdfdf70cedb77fbd6d4073a2344dd32e0be415799153ab7ddc742636833ddc3ed336d6ee1152e9818055aae490ee43150f41a65ff99703ab5429bde98128bde93e10a45fb938506595ae15f2ffaecb2ba18b5341128e7bebce36d1aca0ea69d4c610d4c6dbe7886f6c8fe375ae8c68d17a4d6b9235e92b64a49b68287c26eb2746fea3cbf668c8498152e00eeb71e066637a0a538d5ef429a549764095ffec24aed25e96f50eef30ec661ecb02f2a0609a28a16c7d89c0e6d5847749bc7b42e70715a786e715b93fca7ad8c3f2f0ce7a222026c5b26c486b739a85c6da28955ac9d4dc448b41789d32501bbbe39830eb288fdb7a007b7be0c5f8d758ad52ddc4715d3e38e012f8d1fab61d4c77bf95c25908695d20a96aa2e94d8911a0001e41b9079a54171860f74092ec0748b030843b955dcc7a8be36e8eb8ab1db57337f76c37a3b49f3e636d3622bdd96b364fecd9c4cdb3c212099e18bb11a37577e29d977e54828888e8fac1ed429d657dca67b20a6ae3ee8e027e9b0e8d17e3df751420bc7e66d37831359e4003fb4f21888388b5918b4f0ba3e709b47bc91f90268381e1b70ac326126f3ae8b07bcb92f74195d0cc30fe07a4e9259ecaff047305d8db8927300c9c5f94be4de4c5f80faa298adcee5a5f56205ad5dcdcd4ac8c9098431f3cb1d6d4695c5cde0b6a22413f3e73c516c24e1ba8fd1f853a493f8ff2e3513c8a47f128904813717f077279d8cfc3fb77dc1aec6f59d00708ea5025470dce382e901adc7727c66f5ad3176ef2bacb106aee24409dc47bce5a5128e8ff3aefda6a2ab01fc9fa6bc54247784ab2cccd232ad9e7aaa7e4eac9dc7970832f2d628d62cd843517ac7d4e913ec36019acd5682418ec5fad8b8962bf913d997b0bba4fa5bad883796361852ffa796e19066717b31ceab9ca557ef3051d092782a647ad5e780da7f981d3625f581716651f5495be8569d2cf3e40eb11f29a6ee9926e16f5e69a1fdb90bca32d0a763b0bcfc2bb28511cc84f4343d71dc281940aad4c6a1d651dceb28c0877707433eab99bbfdb6eee70ee1cc9aaa606a3501955eb35b3b88e8039d6cdbfcddb4ce4a0e60ebb3b1054790c156a762418f59e27cb09755bccc972ddffbd8b5cda11faacf88604cdb508dfa123614e254aa0c8bebf330cfe934a66431b73bcb75d126b9f82163ff3f44081ad8f32462bb447a3426df47850fef1336a7ebcd33d02daf419f8f0c11d5a724058a50aee9b1b479c9ec161af815f033fa7068e887ba6a5ffedf09996ce1e3e8562caac0bca3bf874dad7a626f4adf14e56d2a3a97915ea80e1cf7834d155f0e1f30186bf514bfbe5bbc1a92952adbfbe5e37ded8337a704f4ec47198240a6d478863ebe9afbccb974fc32a86fd9015ecf5e46c3daa1836b12cebecb18cc3b039b25232fb22cd0e74654040cfe60576c7eefff277dd6ad5483c3b132bd6c463e54d2b73e575f8427d500a543992a88a714ea0f4a4bfbe579e87e9ae5cebf228dd26dd174140e1389e0416d5831cc83b999faadd07d4527c905c5789075b1f1b3f9b20f31bfb95ec4dda9fe8b36cdf2208f7a8d1bba8ff02fb1776bab017caca162c369e2c34add82edd5c39ab69a49b2f37053145cdf05b82089ac0b2befff56c82e0f8a320117b3641e26fef9f519b2038520ec7cfde7fc3de9f7b3641701c3d9b20efc564128e7f6d16da682dcc5e2fc6622f46dee7a22d2c629c13e359e19dd8305a1c0f6b9acdde7a382bc0c3414c511bf2ac7ac2ace113b497daf96859d7f7e0d1cf2851f3bc9ae51d856bbd48ff208d0fead24bf6e55c364ffc2f8280a2669e1e26f0cacab6fde962e146d7bc2d9713d70f314129b1dc0755190e2465f78d6cb493de67772c4c733a6794a8f2ab10fffe9e454d5dcd92ed1c1ff0661f50f20e2c1f079625fb725a0ec0f2a50782a564fdca6bbd65a63ffd5cb92dd9b37c4f4ebc2d198fd2af7cf62b2bcf72879ceeca0f31c587576229d744581d9b81367d6627f3f420b9aeb703dfad7f3dd8929788fc9a3c9f428c733e8c5a47ab1a50ef6e4e619bdf53f83962cf3cd0f1bbf3c76d5ada745ff103c79be55fd684f3e241e1f733132394f3bafee2e954b0baae9be57bf3e5673d0cebbdea3498f3bae675bd9c89f2bd97f03517665acab7de5f775af3b2fabdd7535018e60c1b65d6e7f7f37a38f0659ef73c03da7b52656a9e0ba9a8ceee9e420d2c6a6051038b1a587cd1c23ee433450899f87e11f08b1052b1f54250987bad2aa9d6880b3512244248643082e486f5f0be1773afafe0c51879312f46de1fa4d0d87150011cdf877a86fb3c1b62580d00bd2717600248e85d94b31143791d095441eab99a5034722e4376560f70fcac113d1be214128dcf060ac908c1f8b82a7e76e1acd74868255805cca0720fed08bf208b285e00a5096b0738be2379f97682a4488848c80892262d48a25bf083c488b685234f4819c3142c037e5288210abe02b3340eea7b52840a76f19048129cdb09154f42b004ca0f49ea7b52840a9cdbc9c3edc4675e92a025d193c0d17da870a0263c6962098eef3fd4d201ce143f31c213d805bf274518c2dad35e687c361307f8f93ccc9966f8d0b321be56a22fd69510490cad86351ae8103e83bd55c57b1f4f3c212f7c224692278e38e2e5e5e58978b14778a0decf4fca8bbdf7df7d1b31bf3cdd7458d6a7febeb5e5e0fedefcf2a7cd87fbd6cba75edeb4dd48fd7d274ad997fbc3bb7bedf36ea508512d6d3a47e61412fae11de792df1542ac217ef4c01ebb0e43a21414443ee4507817df85927ada6e68dc75e103ec82b2a2661f22ca28eeefdf9be56df9a10a35fbd01119cfd91fa6f08368ebc17aebc69761bbd1a673e4c5e0047e7e2691bb1614f7a3cfbcb8fcbd3fa47f94a8f2f3a382ad96f75f2cc48ffbd196a7c3962ff199fca208e183e7b38dc7bbf84314b55f6eeec12fbf62b3e395971609920b8590c86004890f197fef63cf86fb7bbfc7b53e4450e1bbfcdb6e0801af8ff762565e93617f647ccb0e1957c6cb90f1daf3860f3ec9712fc3669bce911554c507420bf54951a5099cdb493b696ee571a08b959607effab6e4900f8d68bcb3f2594863faa5160f6f91221cc77d13f1ae8b700f8309ee769116db8d895ffe5ac78183e37e724f7dc6e5b997e7643cc73d0e6771c4a8712f0eefacd4952eb6a1bcd8ae228aabe2fff0819a5dc84772b6866c26fcc769e2e963d8fc8858ae4d07cb9fe88bbdf04b79c703cb928763097cd13f3f524a29aff53f6d3726c78307f72e2e3f9d46c6bbc8777993d374ef72338f0b76791e5c2c8f0fd4bbe371dcc5decbc3db0927c336145745efe277b6af70557c209aa8d999f8e476b2a38bdcbfb79978d8815cc88837f16ce4cbbfb76128c3f68bcd1b4ed9fc98b878a8c3c5c33b03e5ac63cfc19ba1e1230d4fc36bd7cad764a0554995c127280828e8930822826f7d6f37ae65e589537f6d9e98861897061be35e6fc2810400826a7dcb67f7f1e1c697c0ed467622ec4a641729d2448ac060a2089326a8edc6c4a9d75cd0de6c4c9cfade82f410e36f3c9c6ac2c5e643f44102dfd75ed0de7a883e3e38c67db1e9883e3ef85e8bf2ceba3f44a9d99930e12cc42f3978332f1f5f9b81f68f35c4bb1feb67f0719f1fef6e4cdc83fc18d28ddc265e4cfcd4e3b82371216bd311e3ef0b7d31d6c7b8d6fd610a35bb8f8fffb850ee5fac855f8c8f71fd5a47e25dfc94f5266cc0171bb16b3250d760d018d68db40df15face3af81724a6a11d1bafee35db422f4c8b5e488f87ee37b3305f0cb3dd2bd0bf940554c7d8cfb2f2fed11196fc980d25e18db7a784d7aef8470f1d2fa1e8c6d3af0f6b098f0cee26eee9136a8831e0279c7c30315fe27713be8da9b1befeec3bf5ebebbf1ce7a1e21a8f0531669d371b979d3bfd86b4d8f035336cbe870b7250734654fe2b88fef423e03ef8ef6d90f1e372286f748f7323ebe13e9ae0bb92a7e8c9b67eae5e67add07cbb0d15596cb5b8f39ebf23f28a996ad6f6d8ef82d0c9bbb19ac0cd685fbfa2d4e3a4afccec2674a2f5c5cd49541ddcc4331cbe9de78d791c784e15b9f67d17dd2e74afa587282e35b240be3dde3ecb4f9a9767fa0a2f663972752934b8a48c6716a3c1b9e2178bcf3e731827afd75a56c928b7743bc8f48aade59ffc367fca1bcb8cd117a5e92d68c3ea4377b5b9d478374fc7181dc9dec63ce6ea6d3e6eea893e10c4be970295c2085111cff06108ae3edd11a5201646559281ca872dae2ade7832613a5b5b01d44cabea544fa9ee233d5bb96d2b5e1b894bd2048f1f1f14182e60726290276ffd182c210053bac62488a30086187d8bfb3701a98e35f6a62a6e56952700403d6b4809b28cbb2bf01712624d492ad9c9ee5c4f21338bde9b6643926cb622b54ad602415f52d3e3f281ac9e688495fb23628a9249b87e0ec1b925a90ac8f167f42e50eb7b00f55d985aa6d85b32bbfe363b67af7385e92634720aa62089e5afad216c481ea8f056df7b9f7fb7574fd792749d24992dc217e38c183fbd1cfd11d620158a54a8e13b95f4757a982777880f4e5e93f3281d17377a569413ca9cf39d15f6f1037a85abf6e4b4abfbe7dbf6d6842fdc262dba494524a4d4eb96ddb9c9493736a94529a4d999b0aa6611bc661179661159bd808c3e46318b6dd3cb97bddacab2347e2459cdb681bc9a2e6ca28342bc6fb71a3dfdddd188c8ef4371ba4313542e24764594f1f51dbd150f5cf5e7c6c45adf6960c0eb6e46bd84fdc9ba66197e735d1216740022644b28776ec8290c9f4a98e0242a82b14b8d4984ca81e353d8a8a8ade18607f6e148c0155d3a3a8a6e6c5497b409a9e0c1429513482220abc181f09a1c2cf8d823706ecff845c90fdfb39b59aca8da9949cac92244b72f41390c0e831d039a33ba473462fb1543d954f950afb732a18d8e71c5118ec16945266997c6cdeeb4aebce1999349519ad9926c4d558bb4028ce3f70b6d257d636a368bd7eda205d85e22c24a3d77b3616c62c4ab3cbb95acae245b95197ba5bab0f9fc74da7af76f36c3c3b1ce31cdd8c72e1aea96e2f379d2da81e59791ca7f6bd6efe0ad2c4375f9b9fcdef951b5d6539c9b12cb0a8021be178076acf9a4638de99d34eaa49ab6afd3de7cf39affc86f09f77f0be9ed92e86201cdddd531a98cfdd7dc683621c55a962240949c09a086ea3da13c1ddede63a8af53af698559be7358124604205a189bb8b4658419bc323c8c0ac563299fb12dae8b299f2cc1c81b5cf43b0f6af6770afdd7c9d4650736320263ca7a671ddddddddddffa865c2d3e61eb1b78fb36764afd11660edb6e880587b88b50bc48477fa66531058450ace2e8fd504670790eae8c558ef006ea35af662accf0e982fc67a07602fc6fa67417c5d6b0530a90e26734762ae2c18d49c72f9d876e2965856a952a509b6ecc4aabafaa959c9c800a9914b74a5302b1a4534c630058d1a4c314594a217ad189f18c17add11ca1cd615a20356a942af9085297cf04449118d29532451a483125178f2683ce1e1200184af97717e7eeb7590418dbf23ff82f2afebbaf275fdc4ae9fd7dd87eb667f697515ad7b958ff8417befc57718df7bef3d293487317e775fc1145f8c99c784fd22515aa29696a8b9993cf10414445dc4b2608adc201c631654ae9002a58a185732a92e5e2153f0de7b0fd0e047cbaa7179cbb2de93ed5cbf4cec6030191829715a968c11fb793d283b785c33e5d2e138df4a93d4b23a17c5a8bc36faaec7de7b19b5acb6e9508a3d9bbb47c4102cdb9e7737f3b860ecaf29ffbd37047e3ff0c39ecd30f8ba2c494acd262b42e7e2e55dbcfe8ef58a13de9295ccfb14c947f0ededaf9d5425f5868d9b3b1c5f0c4c61ffb8ddb829ab9d836f036278df8bf177991c2a1cb9963804bf17e3b7c5c67c9f630c2aaacf009ad6f3de8fe743853af12def78c54aa64688246ab1623ab1b460399956e4435507e7c82395582dcb826f59d1fab6cf82b1c3d031bef5b03bc2f8967dd1ddea2678d61034bab9078f7c88e6d5f05d83ea1b004e93f3fdd32afd981e0335a7e67f9c5879224e0535e50a219ce64f31dfef3d0386e5fb2ba4b9f919343e8797c1a5e5858befe7e133a8efefe1332dba096eced2d899d74ef6f1e089d424b1fae9a8fc14d4155856418557e13a5da8392e41d11a77619fa3ecf316f6f9235aa2e629f39615c0dfd805fc0c1bc4af581c74c0267ba4478fd764ec0282e8619fe3609f770260b9d13b79b23494ac44e16473c031f6c6fef033ac026eb0c91e010288d77eb015aae42b0008fb83fda93e00f9c38c8b9eac0d4903274b8015db5578e75f5292c3084eb6e6646956abaea381091a3dd999192d38d901dc5804fc0c7b001a3601cfc3e6f0272b834df6c88e5fb1477c7892b5ec0d3b5ecbc1f278ed050c2fa0369d12dd617d48807d10425ab2ef21e0003bec7baa1b6c1142aa66830ff6e7bd1b2c40019f1c1f4e16871c804e5600256bddc03dcb6b2e361d16140b899eecea8648cdf1646d58a1271b0052152da638d9185215319850733cd193855172c3132cf4640150524285e9072cd686bfb13d3c8c5dfd0ccbc39b6c006ac0963d628037c06b31f6c25ad3182bf1ca0603f4c043001ecb98989898ab636c630d454f565505cb1eb1a1c136393859193634308ae0426fac8e93a561e669665e83d1a23a0660679e15a1cb7ed7c9c6000af2814cb4cfb3898dc4b3a1097a36d0c7e7d938f6d7f1427d0dd2f6f969f2fea92395864dc76a927bf094819e6cea645f686c00603dc76da0d85802d886626b6a56abae83414ff6621c52f0f4642d8d0c6a9e969eecc3e842cdf3d29385e1d2f2c205a98a140b5ee8c9ce50523243498a9eac0cb80096e6351a5b80d7fac662e073660c7ab22e3f3dc507e039fc4d1435471ae8c9b6e0af4564d0937df1828acf40474fd645ce0c54f46451781583936d8159deb24768eef3fb5ce5629fb7d8e72eacab665897e1b94a03003d59161b2ac0d0933d61d4cf7812434fd64414034a00e8c9aeace88dc5f1336c8e932d618da573a72c386c2bf1266ae233f267b8f7d7c942cdf40aa1e69e153d59d2153ec5a9b8cf0e2ca839de404fb6e21dac10003dd9110ef464b99b2832f46437bc03066a9e3394c5d2f031b6fb1babf33056c6cfb035be859de15116c6bbd8976fb1f75f58fb2eec3f8d9d7900d8184fc3e2bc0c36f539581d3ec7de78cb1eb1f1267b64875fb147f0976c3c09efe03e67ad28d47ff7edf3d047bb617f6a721e03ab1c1a9fc3fb80340f894a3f67ad28d47fd7ad563535bce955bf83fdd961c663609573f334afdd6c3aaa1a686c3cf4e01a6a68262adbf8641b77b65b867dcf061aec7b9d0dab63df53d5b0efa976b0efdd90d32bc0f2691cc1f273e81460f935f6bd1b62d8f7e43f1222eecab72e12f849293fb7c0f367d8f770c831b0fc1bfbde0d5906964f63df1b00b6efe1d8f774b0efbdd8f79eb5ef756fdfeb60d8f7e4cf60df93ef49293f57f9588ef571fc641d6b33f464359a1824d41c4f36c32b9f1a7ab2182641b1182000a5613b07db32d8cec2e7c73a90f5243cc8bbcf51c2c49a0d3dd98b85893b7125aef22755e154b8ca1fc650cd71063d59a9ddd093b50850222a2a6d21077a3a424314e3091af474c4e64df608cdafd82304f81b3bc3769392cd6d2202dc860255fe3516a8e6d0dc2e5aa2e689650e1d1ec3dccd13c075c6d27c5b0efe00eccbe17233e92ba2fd01762bb0f78cdd4447f442088a260ca2a107070f820ae91b375e79bfae4dea519b4c3132140a85aa7152184dcbac1521ae24989549869591483ffafa9ab6e954521d7529cd5a18068542416b8bd821d620dd388a8241699462196d4ca335ad8cb0c8d01656b5370fd0582d3aca66b4d7f967efb011c4da9b09028a4a7ff4189d943eefdab10c73edd9641ab7d539ca46a35ab9c69b968d1eb3c1b24d7bffd173a3d1d6f6bd98cc6211b70dcbb24c3a702001132a58315fcfc86ad6b1b36e1bac9f360a89d1df6bc0450c23aad9ba0cf362f1cfe99846ad152dc43385df0866e544352f7464b9cf7edb388ce360de06063fb3f2b1a704c36879e4c2674fa986b38e4b703f7387530387e9bb2fa6e5151e59278bc56a61a12cebe6d1d377816ac1721a3db7fd8872947bf916679956ac9570e2d7c41ab9c5826ce6e3531d2c629187467f77e8289899cf4097719a708c37cb87d2cab2d8d863ec7879503548e1022962d63089d1379e106a2bdb7333dc778d2549a452a954aa1bf7bde96c741bd511c7fddb7464e315fbf2e62a6d587242386312eddbb23288fbe6d7cd88370bb1f69bf673d3a1daa5518d42bad9c6d43efcba4c1bcf37257c6b069e14861ee506228cb4b398c91c168ece65d79226ef762466ef25656f524757e9ab734813f627ca5efadf78077f35af0cc3329865ddcc1e0d2ad594e714c2c16d8513217289154f18d9b1b242c9aa01760a8ff5f1555421c412427f78e89068051121de282741d0e20bdde87f84fa9854a10447dcd67b16c9f4ec235a824f917733fc79c3ef9c96d6f83bf0e767f87fcdc7f1a965af6536cf25d48733cfddd38779e17b29cb09d4fbf0d1c34711155050ddc40fe69c557e5043f054f1a2a070e0c0c15103071344a8d5aa5b996056319ec9e68e65f570a06e6e646e62d4dca45e0c9b655c52162a9572497dca65f2e0c1030f264d9c388949e04704d749813663a05e7cc8bb38e339785df40705ce5e7b528409a62f5f8b346e373aff9066fbfe9aade09cf55dbb19b65dd7bd6043b81159d8575b0f5fbe25038ae9a0e63682bd03f55f33f2330ad7a07040815254d4a4c9922519852184a8eef6c4ac961cf3ad9f77e7ba2b1914401fa7132302c3aecf450494f2861c0a7fc29fb8b21b89133e2a2adc21a51ba1c27ad1e4270cb5817cfa02d58994a0412f5cf15d88d20528d853d0ba7908b65e7e9e00f6da65e75bf60a02f17c400f966fedc8b7aed8f1dfafe7900f53a78939b107da4bf5503d098e5873ea4e65fd7c83a50c9652ba6069c252ca978f159918108a77e65f52429394524acb5a31addc1df8fd905a56da39bfb4c34975c46d10cbb5d64aba4aead55029ed6a14ef3c8cd3ecd0b42418c7a5bc59ce87190a5f432e218d81a030f697d51808c5d8cd42f07577e45f42f0359fb675c121f0a33dc2bf7d5ce53f8442c2044a48890753569a7ec063dce84322755a378e73adb55618ad3c7116d218f51a471d38de96f83df847546a3fa7f11115224aa569c48db6111d8d6ece34402b0ae350a8a6b5ce793d7ccd6990d452f8b244a89c56f967b3f4a2cb9726f70c33a050b5f2344d137195cfdc265e18c9ef0add45f2bb02f668ea4095d89a33a8835e8cff0808f5c16723d7d9075638e2be3b4c43b0a48dadcfb45e9687ab1c370fde3946a1508daa70855d1c1fa13e2860d415daeba1c98da7502e2470f925cd44c96bd24adea33e73272922765dd7c146a2110155b2c70e29b8f3fb3ad376a3714d41859f6b27895852e1581bc197857fe679100a9e1e05cfcf520a9e59cc69fb3d088c2a55a8600861bc421a43c76e1ff607f2b2c03bfd3e831d59f626da9b3579c8e87671a835b1069a825f46a1e644a1fea59cd8cb9b3b4cd33e2b9ff1293d4663882e05c32944409a1d3f86dad811323a1bc60cc4894df91e67736259d57cbafbf65f3dc50fd5b2df2c8e2088b3fa8c5f306b0bcb3df8baaec93befab5e0fe10fee96f75ef1be1763f15c1b98472956b4fe61b2e535aff9bdddb0a86f12c3b07949695119ac489384e1a86572b563d404c26dfe4ffb4f85fd6677b4a5056a03d435bdeb4aaf6b25457bd9c581317b6d07eb01fb88697fcdf9f2bf679c364f6cfea55d91f663dfd9c74d07fba8d538e9bca426659e2d39fe922d39a411fe0fcb8ba93cc26b827db4a62c64088d364f4ad4c62d6b44a9d767546373f6cf2638e52af7d835a2d46b0583ac4c5edfdddd6d9f678581acf00eb6c2d75ccd7fdb0d4c83af65cda2bd75634db2dbbf47638cf671a33a9915053cb1f5a2454466b79962b75aac7fd8a5c5ba261b4c502b76718042cdf17dc7bf2f4b7e4b6fd1e16fbdf5700aba0d20b47cf0c451fe654d4bb3a83564590d4508cb256a63d943706630fbab879e5391e1135c99f800ce328804ce1e028f26fb239e4dfcec623e183e41420397cc0e8506c3a975bcb0e8c5c0bf8107b5fffba38f4585a969d74529a594d28b5ed745b1ed29fdc78d2a690555f44bf4aba53fc281add948237deddae865512e71d2e96284c43b3bb37bb5ca1258ee1e84ad2881ea4e37d6018b9a2b6e97504ac9038330f42030e102185ea8f58c0f93507275c0a276131a40ed512c8b8fbd6988477304f4f166b66fa0ac61f8f4cdf48c36a39d4008e9d393506d4ce911a4794b9f1b68e56e36b08fadd9d85a3b65b7a1683ec5b378b17dd6349fa23d159fa197a679bf46ad53f129768acf74f654a7339fe24ec5a544f1286af6293e85092a3e932111cfc267eafb431f9f19bd37e1ddc39088cf9c6eeef12590c6a73c954ff979739de2171803e6b24f31add86c82a2e2ec5320139b0ff1b31fe2f97833dc67269bace1ece99bd93efbfa66e8678fbd1942da06ff2cfbf96cb4cf324824a46764d9dbe0ae0f7515517e9c802c780258bb0d454b22e836d0bda0c0fe50c8e454071afdcbe614beb85aedc862dbcd17fcd7c5cfe237f6127b4a309dffafc3fe6654760991c2d87784d81a82654751d4ce3b37410821bc3446d760956eaeb7a61f2fce0f0c51a05ea5754eece65a6f46cd9b1fa8c72557343ea455fe3f495811681ba2a8d5bb06837cc2122cf00476819f1460f0897e59ecafbe30ccba2d39e4fbcbf78731c6b8c323af0b44be779ced4978abd168f4a3d103416d197d0f1ec55fad56ab95e556f3c5d799f21aaddce2cc6119305aac56abd56a75d1408bdc4bd4108c614fb27684dd2c4f10638c31c6183d62187c4c30e79b0ff0a5ffbc32edaf0b7b15b3afc36260ec9b01f8fa9eff62b0f7f17206d74f22aa4351cddd65510db3d4f4fdf2750664e5919a5026b7aeeb9252da2cffa585167c6845fbc428c33d1733d02316cda25af445327405c36f21560fd3a311c255f0a7c0c0cf29f8d905ca14c914c914b58c0cf6b97e66600d93cf701c37daa80f3ca249d416ee7b30775df292b2d6ec2dc1972d22ce39e79d39734e795db74547c4f22396f707c9ba350a8fabe0d778d443253e6b7807ff39296e7ee100529f81d76fc648501b438fddc5d79cb68c12a27016a7367f421a1a9f0a53651e7c7d9bb4a63a46780ec1d7f715dd076b1ab4dcdd7e8bbc3e93e0f84238fe122a10841f7e395a6ee71d8c311621e4faf7628c90ff5e4cbcd93f6e3d780fb9c78888df8b6999df326f908b7ad7a2a3b3e07d1172c184e1253f7b36cf667bf9f4d9702f7f7b36a397cf3d9bfaf247cf86f4f2ebb329bd7cd2b35979f9a59e314d589e94a88da5d4b13ed3fcc5584fe18bb1e28bb19e1bc9abb472492f063ef662acf72f91ece8c5c0af96db36abbd18f8d4662f06be66b1f962a62db50df032951a6e4183f3cdc6d60565c90bd15aef177e0c32c2d6d367435fccd5fd8538a3e597457d6addf3e963f7480b8f51952ada4b4b7f06e9761afbc5e9da8d2ec30caa13337e748a9a35472c7d001193d24a41cd650b1c4b18e7162f6dce8861727ba772c6ec61952a92beb4db53c1923ed6f206815536efe718b30fc74d87de386590410d02238c0ea5cd421afbeca5cdb34a1ae76b1be4f7f56dad0c5af8b2b1ca2148e18994299240852734a6d0515a710a293af84cd182272498c28a272808a4c8a8748db694450c159a11000000200043140000200c0a86c422c16038249336397d14000e88a44e76541949a32446510a21840c21040800000000c0c048da000288571df742b7621445137b24b3e80261382691c04475410f524bf395691bd49648b9db2e4557c9633e6151f436eb6dc76645478374880cc1b4016c8f822e7a57fe254410fd296872fd0513632732753e6dd064c353210c850213a8ed25b2097cc60b0d04a5aceadc7108745ec000743940a2490b95574f6aadb3355519abded4df4aa8f957693abc6429c80f4c2c033026fc78090fb285d0d6c07fccb8179c04cb35bb1c1ce0368a06c6b6d57bd75a813a8c2a9aed3a96cae795ea2458bbf0250a2576a307c1f4883c3db847e604f2cc8d5978f6c9d30ede379b00393708d77d11daa5794d7d93b40be9879b3b73b91cad933a57d30a3b6f85be5334f399064bcc6a22a77ac1483809d664e476f79d1c26235cfd89c8e455c12221d11d6652c172ea1e24bab81a6adfda6510e2796c9c6fc04e495b08e824fda29e38a377415c847265f088912a4854e7c76d11fc8f113d9b65e62406ec21b73cc1a11328143b01cc630aaabaa68f9c99ba9f69b040eba9d67d4d0f93c3881fe6a4da8a72779d9dc8abce681f0d9523406ab292d22874d32710434ef06bb351a745e4b2e0488ca56910d20c8f2f6ec381c72c6ccd3e09158e68ed297aee61f21b7b923cd13e157d849ed6ed7a3d582a2cae4917c10a2e7e2a5485ab55c9e6b0dbef5323f5657b4f48c1ea73129cdfddbc646bd4b15028aa907af2f2127d19b975b341a903607eabee9115255692e45f2e2c1170ed9a7b586fb1e4aa530315d6428c191ab235e3fffa9f5811b87a668b5c7e2314872046e2fc1244598cd2a552009072115d937f8a27aa0e7c133724dfaea717fa83b625d28afb94b83331d0f789866ac8de6271922afc88b4c6586638546f1ef0dffd84303e9910956e76982b62e7fa40d802b8a2dfed01c39216b91a3dcffd129b7107fd1edec3003456d752e346931db25edba4b3dfa368b5a4c31dec8c3f552e1c21390445dd347c4669e8644d733432ce215a99fe3d1d9c8847a71f2fe7ef5a23bddd9b91e0f41eb3a465bc4478b270d5636b59eddc22e9da54d430af6e37bb9eeed034e36cdd8185891f61ed6eca3a30b30a8f788173f49765db70ca87fc1d24596a7a6e46e99558720e6f28f5d986d532a841f235cf46134853a87e91c783431ccc96507601e8ae8e89d6c21aec575cf98c99089587e59f69e6b3268264932c95776f9b7f70a645bddd2e6b4c6c6f24fe9acf5412a07d55829ae44d95637e790091da7de1c3e0423963d84ed82997718e637112b803860bba226aa1c5851b3723b65b6f3261c62d062d6cd213379170d116dd1519320383a99b543e9f2cb6c769c2c438ad4c9da6c669728d9ebf302fd0491a014c033341809c626397fd05fc20c97e04314f3cb37fa3e4a56e1921501aa4920ae5f27e3d2a69e35bc0558855d63c1045c3aeb0e63a7ed13224beb0560254b95d1297b649f9162582691d3609196fe3fd6516a83574f3623728ad6a4f0cbd9d53ae263e91ab4b84291cf2ee8b7ddee8f60356d8c1f36468b6f9b43e5a659464bea5a999289863ac39cd80cce03e2057175857eba116e146ba84e4078a02349c4323044a024809de53d8d142d3ac4fcd58c8c0e1810a32a63ddc7ace01da4b1fa102eb044bb370bd0141720034868fa24b971f634b850609e4622079ef98e312a970caeca24f49e5e4c7a0fbaec4d777b5f3f2627339a4a39cf2065145182a0a40c08e7eec98c1c0b9e64a5ff118966e89267772b1dc06679f53d5c91681650edd8fd9e0e4f206e901f88de82bd6aed42077a851afc56359ba47440f588ea7d004826639c2fc47c68854ca2af2698dc36e82ad8a9cc5ec479d2b2143833921e3c8dc488b0792e860216c5724b32c1fc9e52098781d15b19191c400771189f94931c7703ffbe793ec08537c2408a4aa8dbde39b7b864a5a2f81ac8f39c0454f4ce86e157a0d428727c849c242323fc6272d00ed09e060a338549cf98dc997a865841e4781094796af9218926f1009a3749227020ed62e85f6755cfa46dbecf2eb5f89e22a692466c6d3f89c69c5361e54006e34ea9c1f029ced0b953d1fdda777d94d8a0e759f5e706e529e277b5608418136e5a67b4be41c0d1e4e2949e4e5e90e84ccf50296e80e3101247fb40ce48c4d31de576a4bbdeae0e1a658b56802552bb2cac74a0b18f1b6705d727a67bdf596ad6619ac0558425b184106468359c63638e82c4c6dc959d8dfb5cf93eae82a1c1102d1625a7f21c25c2105795f9c00eac98194bf5d0adf859454ace477b5fd3df314643ad253f37ad13d1195ce40eeeceb059a50e8476f87e23b67e18e46813086dfa33b46aad4c9eeb462ac93daf63d6f929dc22f01c4c93706ce4b22775fe31581239d1c661a2e932197f36175b03b2fd86e3fa33690116b0c5ac7c7e0f5a2e869905427e3a0145c0c20bc32cbbf748419ffe01213912e6ba38edaa5a8edb408d614bd902600427ce9505e1009d3cfecbfa648ffcd44c0ae2df5f83ffe4e572a8aaf7575680b8f68e96c5266a67291fb923874bc574cd36a1a7a90bd4329b97cf2638f3eb26f0615a3dc761096b3d82d59e1460587d90ca0a21ca60704966c82b1b1db1d0c4bb18b4f1231e42f26ba9fef781d93f988221bbea620c09be0e24f18b781c33060b900335ac788619261085505f2043b50def7c71f6fcbaaf8803227e65efad97069ae40cc5f375c4652347c25d974b12a603244062bdfe3a5c8619998c44536b152bb57db91419b52244aa2642da0b3a0b3718cb69204ac19be0addef6c54c678a1f7325b6eacb8eef179a85d9613b808e253ec0901fc696c367dab9e26fb0fcbe121182a87f3f6e204b12941bb43c11f48eb9aaf97c752e2ea8679cb9ac245c91d1df512f11e892d9958620a8339a58029d0bb2e03ccd6b3b1574439084df9955c5c16b7e2773062604000940bb169fa2352ba2a442b9e6455d26921c48cea4fd7ff26ebdf0dd983add066cd2da073f0d9bbfdcb381adea7042199476bc6e51b99d4bebc811ea6070993a05a73f50e73111ddf527c2fc137da73237e2c00a58edc5d1f5a89ca21fa10360c1a561a4c8b169e4b3b12ece21a4245276044303b1de9eca008181d76b75b0f8d292e0152e34e2378a258db08fa9e57b5b4071b86065f7eade542245a36a81afa2dfc16e60e8d11b1e01ff04c3bc21d46c46d48994ef6270e7e49d0b0cbc0d2b40021efc5c86eafc02a445783d35aa94a2abc40aa77addc99a28cdfcc8dfdb0c2abfbd9598d7f70e0790e90087b422917d10da45d510f306e378693ca5603512d76aec8514e9c1386e3e544d4327b52e2228cc848f89d142db3ff21d859100d764e8e5dff15873d0ab1d6af630b8969200c454c96f12f7ff887a17a0c1cf65ca0d3fccbf9538cb125bfe9ea44cdb1e113f48a6abd98a26b73233c9e65c6dd67ca4029adb9293f762954865e4de2cf11a5db57ca36e66b20ea6b99e8fab4c79f231a28e3d926f74993fec84d1d475cb3b21167f9f2062c9dc046650ada5405e109157a9dc89f965db67e3070b2c6519206372e034f1635b8d1aabd66555804ae7a786d2678dfd664ed380ca00380686362568f0fb77e6869313d96701cbbcf5d01baee7f389d5813c10f1c36389b80eec69da59b79b49c5c6f9af2804a8248bb81a9acdeac0b488553bd7a700465176cae0478ab8e19449ea14f0ffba1e76312ab12237884035103fb7dc0c72566d1cfc72e4fbc71c425242f0d20a51235eee9fb07420762f148309732a56909d5ec9a8f01aa5b557719357f86d506c4b83eea07eedbc666fa66a3b63ca4a445683f511d87d455e36712742219792de0437c86a12581c093915987f0e79259e27785167117a9cd0e13d9dd0a94c7c4f483c8601a0b01ce227fc5aa97493601591b0a340154b6364e12ab263dc0543cc1f473559599cc820937391bfa98119e8c0dfbdd03a559464fb6a1ebf0cbd544d4b271c58b01aee81893908a0ea194476f9753a1755cc1ab80aa6a4f940a25e53df205ef27ca663432fa4e14997618326a10fdf82a4c2d8344319e0a32c5b73cdf6e7e7e83715d43c94256b414c56dc1877271b32e4d6f97787a5f3fac82157e1c587a8b685a74692da03f53a6ae42174c1b9508c0b2fb73fe865ac421633f14765b410204eb78c225b988d076fe43dd35294289210870782a12253313a143838f7640a72268699b63b0aee5e816f7ead6c1dbfa5c02f98683142b4fb681bbf0aed686280b6575251b26086320857b0cc9632090a4a04a447b9b3e8b0a3f7814dfe4a086251b84ab955d8f2c43fd9a70fa06613facefa0f0ea8be8b5c1d086e848f80ae67beea86998ae34e1559c669fc5bda5fcf43d8651373e16868b7922386e90fd800889ab5d468f043652e9337e31f0981cf7d3e52590822e4b32fa710c691641bb97f439fc4bbb815640fcf0054cd7e60909de63d01835795f31fc2a7fbd8f5a4c3557084097aa4fbd273d57a21e5b5fd03517686d4a01e314cbd1dcce246c8ab86c5abc94dc8d0e3286f8b29a295c823e7a58fa70b2991e37ec535a138ebcd7b3b9df99ce264aefd25e0040d9afeaefffca59d4e1a9904a9fc6b64a8c90711242d0ea1e3a3a4898e5bacdfeea17078544ad8ae287aadcffe0403dfc1045020c1dc92f37e43158bacd6138eefb6341fbd92cf40df462d61f2cbb469b313b814176c1a34faa421c719ea808d407a1bf1399dd72a2d5b7e2f74143b1cd4128dc67fef887626f069a04e7e7e9832bd567a0cb94245bbcba5634e5cf2dc0930b099b888cfcaaa2881989bddd435f58f0ffa266c75570dfd23300aead8eb45ea01254396091d0c7e781312d84589abb298396e33d8f6928c6e0371dde12865f3889239eb6eb7da35be9cb3bdb036571b2477369f7003578e129d6077e8fdd82192f4ec3893aee40d122f811a0a99a9067e4065f76454a7d6fec37ae3e6342fa9d62c68cc1865d77f0186d3d27a2bdd57b26feea7173e264752c4c7fa265f783d111e95cca1cc6fdba79023f51af732c218ab2141613196d592d48bd81d8975b0ac0a382da22740651fd8bc969af634d7cbaa6ebf20f564047feaefd16c2f61af209aa7e41c66290985d7af6dee3bf06e999d31499dfb5abc34cad048342d27cd90c932361957f7ac371fb03c21fe1a279721b7f4b4f36615ffb7170df145b6d3f481133d3085c8f16a824bd6fc06939a9651940ccf186727d587f90ff6825a8469ac812c28b4aba1cd1da8b372154a11094ca228cb637d24e701af777f4800680e7cbe36f0a2cf54209f7d08e0b57c02227dab8c67013d0b4a4e9892e9e055e76e3929d65953b942ef91812a6f155a8e1c8a9fe198f8affc8901b64a6fb3a7c11bbde7969726d3c15d17c81d2b2186f8292fb93f6fe6e3e5e58d3e6332fea994e22585add86938d854fd8a731a7d74da20717b8b2435a492235bf66877eb03cf0fa23e120a43854a1c43d3d35496c11689b8ba97e8624fb441b74df56a0094578a582f33c599ac279290883a647fd2f89838303095fc4f3fdb9cf51c6175bbff186107efa04f14ecaf47bb4a9822123dde96807481ab98d7540c8debaf4b8aaa0b9e8ba680bfac6b38f0c17ad393944e737d99047c4c7d530389c2691201ebcb730c1309e462a741715fe800d1e35b8e0cc6dbd55d43f38f80e3f82e6f0b0ba8c2ce7ccdc8897a2c497dd3471c7fffac23df8a4f6690c7ef2d23df742ee81d9a3f00e36e9d78c64f358a84a69392c55151b8dc4cbdb9d3b72c80ae1ac157d9dfcb24b5880d4f3eada4cab6ae5fe9a4162fd3f0d0196fa423556c27d140aca265e07ca746d9ef2c840f0f832adb2e83e27f34265d90f438836dace0a2d485786c8f7b95b3494a6fa2ae56c9a1b1835b71018d22c004044fab31eaa3fc2bf313f3ffa8909b73a862732abc52fecd4fa086005061c071e80e97917def80a9b1b7fc08a0b3747668800a52966a28d437e22d3a22495eab15627bd1d892ceb349b8624212533cb043b40d04e80570708ade848786e888f3dd1331932ffa474054dad9d8462b7954d5a9c92f71e548973148821f73f55adbfca07d5029f3d26851d96c531f342429eb69a6ca3d95ff8c19a60c4d48e1d1c41d31f2c4cc154793414a9d25e64deba08d698ec0eb669203145a9996ce314d817eb125ec14acbbfd43bb0c165f8228898347a8dfedb6d8c6f0896d97f60c95a358898f16347fc53d2878c328b4e0808ad96450ff9b3e9ef872ba0c9e4281e801d8c3d5e9828f179b0a226ea8a15bfeaef40ef2d7502941eeec9f77dd9f767d9b57faef81274f38b70c74659e329bf355302f86f17fae90a2f76626473ee841b39163064bb8e0d70fa8c568e89a6962b2a0a9946dded5e98f182e648065120f64b3fdf996fcf14e207e905118fcc9f452fed26a2eeadf0c0ce4845d7677f1c09a798cb6e54fae517227680a11c86ae4b3cd62895f227d21c3b65c1e47858882544ece8b8861e85b7ee708f0ad5f854f1dd039fdd0c1f05c3d337515001e0f90faa52b5aa18e81e5bbd403ce30fdfc480a659353e2c04a3bc67c31d7066ffa9dffaa5231c72f6382f18478a8102e213e64df2ff54e342b6dc8c4badc6e58e3d85ee195112edebd9be4e3774bb2e8bd8ce73e55bb1ce72d46aaf168c60140e10574c043d5cfd235946a0180640737b3b03b0f76668871eaa7eca75a680aec696afe44521e6e6ab05884ef006b50a7b51d36b258f8cfe9acc42a0d8c825f35eec13e5a86831071ee1e3f93c6f2859a392ef6b8c6434a7f28e42ee5828f30abde08c4d88ccfa1328e89ce2481d11d44936b0e8e48a5210ae5e061f4b685923c7315265adeea0b6988c8d584198ae443553f914785ddf60d940f993ffb270df89b733d6cbcd62d72458a6a642654e4d00f45b997b0755797ab6dcbee1bac6f92b026f02a3a194f9d28503365d2aeee48852b430b3266254d823b3b28533322afa3d41960614188f0d128b833c19d065c89ceef70c1d2ce6245de17a09031db89c2497f8c35a0d36523033767bfbd33caba6c2c1b7b9128fc0945bea646674b2b889d4840dcd4969ab34facc3625464e47e2be225cd18e2219a7e066490658ba685f4ed54ab2b4292a49f57ab770124f73a73d0c742828f17f3db23271a6891d8622b151e01f15351318f783d27b869c7baec8c1e70a6b3f6e61a38ed5154e316912ec1393f6b3d99e160c2d419ddfe81ff45d2c7cd441e6d07c51907a0eb3f12fef441309a657539919b1709a455127a8511f7b3901ad39b9824ef19181c82692646b3572f3f752a8c64f196c99b8be4b10af119e33db77b6ccc1eb72fe769306923ec04c98b669c238be4d454a4a4f74c04fa83e5158b8b23ec7d0c22873463aab9a26b1db770e1297c1cc05cc13012afd7e92c07821346d08d183ed09f67469fa71b1b653caa14d87f558c463a6675ee8bb372edc70e1cb8ac9c5e4ae6a1fbd48bc6473ab941a532f4e76eafd8567b13bab7788dec8619e49c2267d12a4f91562947e2483369cb15ce7258a57d3dd4f9e807e2b17b4124e49d2ba107b0091adefc627e8264ca08917e2b043820153b6c675851596d4d865c362c2dab1434a0aa49f0d2e2c8cd9c9d408c7c80133981e7f06c642aab25097e506bbef782214fd6bc4902cf3f8c0d7aacd5efe45bdc8821227dbb9157f8763728ca68179445644aae6b799c8b908fa36c230cda34fcc00c5a550e6e425553e9ce84a8b955a530a1d1a09d044151bad169e9076534751f0c2641b76ba53939813ca6fe100f4df60fa30f4f24f9da2d58b2405f4a20c8dcc8f8d13e4618925a3d4198acc5800066435c12919d67badc0f556f54431993c86720173ba5d75da6d26e04b7279eb669939b0c5346ff2452e2ab7b553b9a1a89fc4b7fe39512b799a437fc2e2b7e211379f177ccae901e998b1a8c516b6e19a24530147c73172efb6b36567f453af20338985dd4b9c71e04037aedfeac9a480bbc055f5b166e7dd681d8ff72e58b2535a6a3629e58ba973bc6fc5f920dd5122fd4b6a969cff1746956d8d047265791762d50d865856e437c18f7fce949d819764f9cc83f0079d3b50e5af3995b7a750e80236fb0fc7279b5180da8e5054ba16a4bb2a2b3ba4549ebcc7ff5d595226ff31e81a40d6d03deb28ee0e4c3077fb0bea28519d890693c3b2cc0e33fa02b56862fb00b9321d2525d954a8e11a2a4003ac84a2698aeb32008b4278251d8caa4f65929fca5862a3476cef6abd543cfca380ef61573c04f68455ebc69bd9c6160d7372efb2bc0e18a268d92855235dd1b0f27ed6f9b28f36565b3b9ac1b60f2cffa97c3a9986ce6a1777d36933b245b66f968cd2f231889367750c4350232cd5148441239e3ca3125db0a803f8f5eaaf294018e0f137e9bbd3c4cfc211bd6e7d981ed37d2d40bc26ee78b5098d278a0bdd433557d9eba64b13b8ae09b66f11bc4d3b6924b22f779575f719fdff42b5b4498b2a89e1627734e0f9d7d420e4b1e0ab0996dab681daab846b5612387d5a54219778401129001d64c2266add4518d5776c36403610365863e06b8c062c6bde56ac0d90df572eda2abb09c6ceab2cbaef623d5722f7a4a70498f8bffbcbe4b1fa9a5d03ea949b7b787348b09876b1b4dc9afdfd29d82641ca501ce852cf4223c99b4f58c4b155b81eb02d14c0d8cf86cf891b7f03fabf2086b721daf73a00d4409adb6e136977e08addaea86d40b4a7ccb91e18c0254c816789b786c9b6c7d3d5dfdf63a6946e8d0d33d94c1588cd2afb2093a1fa89337a47ad4aa67b09a6c4e157aa84b90662e81dd354cb1bf9b3b447aeb1f41530ede531a1485f39a0eda7c16d71914c36c2dab9c6f4d38bf5c0f7ed73094e688b474cfb1255ec4a2575b34cdfe80cbbe328525f63e09e45c7debf79897da37c94cb56e41c55c02b38028fd1cb71153f4bdd682fdccfd10bd7abb23e413c64be272c24fa019623ead602c22929bd54f58f7e88309d5747ed19df368e22a249756d68d93b656a05e22c4498df95741a1aaa50c9acf0d41b281b61e1a5ea9951e22065b44e353b831a2f6a80ea84d5fa4e7902f3e621c7837649cd0eaf94cf3592ada512599d455133f58cb44e5a3ee67fbc471da1a5b6adb5f0da6d20c3bb317f8ee4f27cbcd67f8a1885db7982b19d5e8348a7cf16b816bc075e4c87fabc7d0fa13376a88ef503ea24a3c185546be46678ce600239f9fcdb901b2adea05e8b49b981995ddccda91bc69b0850020015b16d68816f14d59db9941364cde7b5a5509faee174294ebb350833fc9e8572de0fec4f832f66f116af85bcfb83da65e76120f7bcee2cea65fb2054463202fd463f2e264851d4e8df7eab31b2d1dafa5e66812905b2d7d8465223426f0e07826f4e62d13980f43b8d1034e12f769d73409346f367f2a83ca7a2f84ce86e22f7af67325866cc449e09e405a282ef4ca330f99422a293c23f5364ebeb5ffd8980c08b33abb64051f546e974e97f78eb571c171e1c0d3c6979478047da91235dfd0208fec2c45fa2ca08a2b01369a8fe63b3a4c97d5900d2f91dd43046922567bd729273d92c2e08207d382c4bb6d8281ba71c72ca1167610154ecbb2c08d6abaebe45571afd12d49629c3c2921a9127f1c2f55b6e139f8378e17b64a8aecbc9b4aafc2b5df36a0c2016aac7906cd5dde3945dcd7c943f59bc203923a776d3b07ca0de19d92ec2e735abbf496822350956d14142107a14bcc57b6dea1f9379cae88faa326bdc87e6b53aef8f2c4a7321fe6d0e42d8782a96d282339b59fef2988900f040b33a562384463f7bb765791575fb86aa3b749c05111ddfd5bc7a6896ecc1a8e67b6b8d11f8f2763693ae5d6d0a3560ba12bcc8cee3f805267596a81c987af3dd776522c6066c4cfa50628c37a6189b28ab844d8f3847a0a05158edf91e5ea7094c41030215ae677112c2d0885a2c7effe464cb2a0e6ff2f8a6cefa1366d6ff5bbb31258f8e27a7afa45005ba15a41d78439f2744935c7fd528f77cf2f87aa44e03fdea41d3f0721fd114caa3226853b7c2c74c63a8228b0fde19fa53384c7950dc6502a5905774cbe48b0b359a886e96b20108ff69c817346ca7d944c0b9694a060ac6049dac29497921078a8ddcd021c7621684606edcf0d4290cadbd5707d8ad73d4268946a454fa05e135df2ce28c68186a79d2ef489466185543bc79b84ff898d5eb6b6811d51f7685917703b1ee752146f579a0f5a92ba40304fbf777b21961a4b1531cf0bc1e16115378ef4146632c77207c78c645114fa16d99be834463b7ef1f70747fbd17070bda07370e443d1dc07a3ed0f573206bff01abfd75850f70fdece0b82f35eff4644af871d73880126e6d790cec7b55badf1d5e5d326f2481f820e1b7d0f31895952a729ec1b8b584c5446c35b8baab2dc38f998a01273f2226c8bc3715c8f5c89aede9063735e01ecf092e19282812a301b172601c5ce139224559cd42f0a6627da60e7e6285d35acadc01acff035d3f07b0f63e90eb73806b9f5ea11e096cd615a297473215337acecee5a9ed3f4f858cc135c0788163e1539562d36f7511f1c735c98c1adc7629671ba14b4ddf2042e37bacbe904ebee8352e7f2d1ab0cbe228299c6e3bc65be94f8ae16ef8d683578290dbf54a084172a658241e9e1bd6b13a537eb7e1fe32e61b7022fab70de02173e0de1b243cbb4a8fc1e8679af94a76f8259161ee9b959101567b091e0e051bb275a517c6a1b5af32df53123c239567bd7370747bc14edad086242dff44876117ac578e4b165c7f6ab78c7091049afe4cb399d3499d269b7474d342b351b3c1ac2390fbfddfc5c781a3c2ac86e284c450b178b73f32ad90e5e0f13a0f47fce0120db2fad153c4e7574698a7d6dd4b7bfb4ac3de135c40b37b8e96900d104a7c6b38511177ac13a178e5a24aa2f5d22df05d995059234af60fc196065a262bae2e175144d9e973cb2a20ca0b260aa0d211ab48241eac04dea8e712523bc81cc4a1d77fd339ce1d25eb795a8ab1d4d9b87be9f15c4f0cfda193c58224c9fb8d69f88b7a988ac21d8d65aecb5cd45292d04f5d998dd929c89502330c67a0d57130e7ef29f02223c3a55b783c266b155f0c5c4a94467f42ddfa7e25f3c4498ca3e46b65cb7e57aaeb44553146d3c22b150f9035720e9092d73d7128c94fb625b1f5a0f051b3c0c90e9134fa281f46f5698952e7c65292544449deb73cb1ae87bcdb643a599ce5bf27d32c1467d304c25bccb953379171ee11d342cdd2e4c97574751320a1be1e2ed5fabe18e5ce30e3be0990b691b61f723fd903ad95c93ded7d5ce99ed58140eb7e6fd5117271d2c899fabeb13aa45b6d8e58d2226c03a6ff67ee0a7585b26dcf8c4eb308c912c9e3db393b361cb54e1e65f428578fe3e37984a77ca851cdbedb372258ce237b33097bf0e70f5f05e3ff158cea8f63ee2902af4f0742bc7d6afb585990f06b4302eccc249f168d0c82fe8fde5ba156c1e63489a5d3e2702bbe4879894d28372009764caf6daa29d3d5039d155ef481d7c02c6003c31d45965ddb6a30c1517f6ab52aaf31285622050888c38b42aef66b96e2ddb14fa08b7c33a197a801f4fb6a09c05f32006056bbcfcf58b990d3fa9a780811a4650932117ce35184d00ef2fef480d9cff2cee99b6f8e7e13c8588f6d9a0dfa0a4569c55882f0fb6f1a2f7612766e977ac619fcdcb2f3b0d17cd8d602a6055d4c5c70f3089f3ad59fd1d4fd825238fac323faee142a0d94d19ba535d3bbd17185b99fecf5a9ba8a45049be76198d754ecf66d64f0f8068baa02727075966cbe8c6b2c4e6795e98ce7754eeacdb87710e4774be942808dd2368bdfa5b9e16b0f4c61742226645d400825961099f083fbf98064117c6ea9bb2c4c36906e2357de393d49a648e7e7ea17d639b8d06d94350ee6c8d579e1812784ce7405481ab234c15d824288cf201581f48c1c91f9ea9063ca2d5fd0d51c4864e190df546cba01a207fcd8f608d1e83710abc2818053e8a4969c800f3dc457fdc51cc7d61d1118e6442000c1ef6244d6dadb54de4e8ce589c8b65a380945d873970039373382da6584fa2db4d202a756a464a82a2df2dc62791049f547ea87b982fe4cdaede3ea0a6b10d84e865ac3edbb69cc58f0f8f3be7464583c6eb8e3be0500e9bfea8db387bc98692830b809066b0cd229a155c420d7e6082d5d8f47c84bed4664705250b5caa0a2e3785cb9253a208cafda192bd332a2562f28ff701633c02c960bf671711e9ae17e4d58ba44a405d4b64d969c774f5d1586dfb0e5d114f72c0b0e97aa3dd0eaae5c7fe767a30d83b050298c86c0c61696602c65527ec0f2a229bf02d3c09b8895167fcad6dd18eabafba250af19bdaf8d059355c3701f1b3b19553f7efc8eb929a431f605d00873449e7f3cadfb26ccee76f1b860849caa95cf586004e085e9032cb05cd9098cd37bf8187ac46913504bb5525ea302719be23536a0f2fd3f2b3c38be0f4ebc66c204dc8ffe3b26dfd3f51d99876ab9345f707d8bfa41cce59a192273283b2d4f4744109e8c8c88519ab079af1b38e168ab0eddff858a7cd42d8c517f06e1bdb6fb59e36b582efd8c810f60d01c687a2f638df1f68aa1fa46280fde591b65df1bc90ff4d4528756c3225950a0eab9f5857022bcf6eda682122c322684e8b91fac2085ffc1d810021c73cc2e773b114d766655ff882396b7361b330637ff39d397b0fe1a9dde502d7d3ca9e4eb61561ed9dfdb58c78266655a616fd10fafca53ea49a292011c50f32e1ec20da880251de179e4c26eb4371aa605e034c1d8cfd213d4ed7ce03809cc9ae53f938def49cdc10334cac97ee2c3706967f8fc4087c13d667087598f15602d75552884ec1b5f6ef02ef414077e780bfb480530377dec8cb110905f1753311b332a10b43c5013afb62045ea2846dc80dae67aeb41cc55148a0d15402d645149ed304a5a5bdf8a50b338a5cbaeb0f420f8f616cef170a012a305db7cc877e77a22b7911d24e307113be69f6207cd9ae3f2da8f8c240ba601e2626906c65796ae977b08726f2354e1513fda1d02c14129094406da363c429870b32e2b9be49192fb46dcbd24678deda2fc13e92e2f6efbd8baf08449cd4a9d4125715ebd961c1ea1778aad58678d8499bd1a4977bb8b53bc03e9e607422325c55996405a4cfbf3a6ed7b3062828e6e6fd1728fa4b3c1bc58b709e771f143859e4ce7d7eeec84dff11ecd2d751fd859b861580f2caae105c78645c4dcc1faf439a57c093eeba590fd9eb7943df77f9f77b50cb929fe74248aab653c1371f13545e4a8025d59097dafc16b26db83b64321ccd9faa4fee04a4d2ef21961db22ab41e2101a2e2e537f21b44313ca6b7cf3cf890d8f9b887fdf00efa52ebcddcf60ec0108905bfdfc25439b150b4f3a0a1a92384d3ca93cdd0c61b559757f2f19c752c2278aad4094ae2723861d0b86089f2320db6dbd04dcf29b054384a6c189312e6717b11fa33ebba831dd3ffebd31b0af46b94e2480b9a56a5107f1a4dbe997f371b11ab47205153b13320605e49641a493b1007bafe6436d4dee2b52dac5d9b5af0a122f82d73fe0667c11b98d06b94f497edd1763922c2197a4a290992cd8d6c0ea67dc1c30de4d2e970204ef8859bffe8334b0b2d10a41a7d1fb453f81a5726f75bb23fd2f664cf73c61c5a82ffdfddcee1ace440fe63a4af23951d2f0eb3d2201f023c66f18732cd3fcc5a868c2a89c56667888b9571e80330e0418b6632fb2f65ba9f4b787f10f0dbec6dc7f9ce628c1595790e526b99f66db8f44f0adbeb522a06e99836510241f1b0c1492d7b8b11f414716d33549480198d227f3b693c602a1cf0878c8bab60829a1c84b434122faa40d9cb52f6b03ed2e59ecc8bf20f487bebfc319fdd781320e08d224d4bdc0edb32252c13a5cbabdc771e0ec87addded8e1ac94e74b7101210cdf4747d8f9a9f7db4f62470f917a975ac5cabfcd94d43b81809a51f3d5d91ef5c1b34d6816acd8d46c207b43ef2fd5473c97c4f5ff188d7e8d9e83b0194f1c094ad2002cb840fab2256e77ccf968eb2f4a7f87f25f1571f22231d2dc50969fe014c918f9b6dbc1841742988c6237182e762ed05973eac80f240ac9ba098a4bb1c8929610cdc34f1e1ca03c802c5a3d70364e38a31b22a40f09d519aeb92bc7e4e36363ab84f7976f27e68819ffec250df01f51bc523394c36011d431dba20691bcbf63bc7cdc29d68e601d996613597ab49a8810db82992e541cb54dc645f6b9e07463833135db607e3aae26e9b82885fe0a0159e07785e55959528241b22c7b5030379b0ea5a02262440a24835e5e503c8fe6edd0f5ee41ef605b7d551c2b9f86c2e14dd514a0e06674bf5e11dd22c72cfe9c8fd75a60746a960654c122474c8176a513c1ada8b4983247dd9f8e8919fc47625591117164051094d7788014eeb0553386ddd670587da5eabe8f05c319761e1e52986771f9d514d3076d9c41ff612c0ba8888a140bfb3d41a0b537221a3506866ec28ac037b7fb48173b93a16695b61bbca559bf7ce583320a004f2edc9fccedff536d757adf6868334bd303e386440d43e839409d43ddac3e906b7579be931db174483e737bc70200ab9de66cc0cf5296e5b9e0509faab05b76fd281852a6f42c885f37479e49f1b6c2bba41f351e8ed1dab676d4d1b3cd2671fea6f624054b4a092526ec43533fb37073a6c3fc2e07f7265f0c7df480e05e18ba18beb02c69bc2a8848bd2ec8d2838bdb6ecb4ee50d0babd8f3d356fc5407f77d6d3531ae6679d13018a1894ceaf89220d937c51b778eb287984988ecf23d5cc9c61ffd8c12b0e6f82177154782ab39c3eb1c98bd0f90891b2b46aa74cad4ecf8fc4355fb91f0dfa4dcb50ab895fa869298cef5d9c354237d96e9240075e07bb91a4d4addb2b9467d75b79376921ffc64f102121fe7b524e309fe3a3483b515a32e4b5f950f944465ce6a9724a7c7d1b90d062acba180da5d48e0fd8be1179ddb6bc0f387a559b4300946f4faf99a8e642507c40af5900371e6e5857eadfb5d09865513102e65b82f579dbcc073ce1e4abf21a1006401aa1f45d0eed6a0858be89d35011b36b689a1bb9175f55d5c15bd9bfb67419b3b350a1f20fb52077fed3ff00fb41e69451a5805018f4c5704bba9d72320001ddda7a040a4871130baeb7c8687f018af23a5406a323f7a3f82fbe17c17511db15c724f58b355823abfe073d0760afcb03d0d2e8960122ca769c093474a7dd838534770c79fa08efdecd9ceec46e5f04bbb9fd250486f7bf9284f1fd4e8aa9c2c92ccc3edf1587193468214c08448119e4d842b09f7edadec6befdcae85545c8f9f453c343f3509a2a1990150ce171f9c210eabff156e6e73f6b61ee99c354c03bbb5e2cf479384bf21cfd7053f86f2e91dce89f9d5a0fc193a3d991eee3eb9f4a102bfe1e7f338646b2ceb45061706314c2d74967600b0ddb974de10115a48bd6e407b65b96fbf68801e16f5676c80f909e8d8c44bcbb59d1fbe816aaacbda20fc079ac463705265eb3f5bd6d5abd526012e1028d04d5d24267e3dd5461eb76bf75cbd23666f71e4475e5f4dd2569e55f10f2f62535e9e870d87526806f24ed1b5ab23ae38dbf798cc7975a3ed26e5f8088986708624ab40d162a06577e1747bab0702c45180b77fe3504899689ff66bb0d9193e614db0e37f35a1a5d6c25029d431158bd01c9e816960c7fec92afb2e61541603c4166c3cc771b8d9671f7ed8427c703acae392c8192e7a7c9ada887ca4c672a518f4d5a694829292130b5301c5fad9c9246556d57d965fb34bb287bbe7ec2a6d828443e3c09b9ba2589a40dccc5157a8d35c531f21bed419a893940b6008c09b3ea261c54b37106e8d3ad5c8c3ea601ae7abb381c15ac35caf2994784835ecbd5b267446bb6741a94620319a945424fa09a31a8f20d9a8529d5979a8b82a1c3684c907fe17ad4c6cb9cb7d2e54c11eba7a2d064bf8c9c44fd636e5c83a6c901cb70c36359552a09cdf10bf1eaa884b590dc56bc280df884d5db035a089e42547bf73e58d4e920ffaf971920a1d5d36b3dc8b4addfc27ecd64bd8bd5108b8d750be0d4d17ff84cdd83c05b357659fa604a9ae226bd4f29fefafaa4a2cf7fb5290c273ada42530f5789f335701aa06d0e60337ecbe8e53add6a876b8d2d6424ae37540e3701469cba69d1bca698763a2d8eaae7efb9cc746df6fb59f70d38151c36643d54565fa07ce651a5fe66a18f1e517f26ea4d3e33c3764cf8d52898ba0758ea1abb93930601de3efa36a681f8d3a82a62e3d6f36029c93a04713480d2f0d5063f1a5451cf3bd6c6b243647a06c051c8ffe72e8649f0d39419d2f65cf88a35c7c3ccef4aa40bac1fbb1839f02dc0f4cb058a0b46f84910cb5a7b4a1f67e128df333f12ad6d1141628fe8087bd478ab2a43ac9e6b5539bf46b0d093201b0b8b8172b29ef5c727115753bd166debca28cc46dc28da9a71091052a6fe4050f2ca8945d421750bde5b3eb674dc875dcda387854e86cdaea3024003dd2da178788129701abc490d2a60e65cd6e58668f3e6acc663ac5a582e15b6186607e888f5133227554cd231d65b0355caa0b0b30fd609c0007864bae7dd4b7f94b075e892827eea01b48e145634a961b3ffc4668ee70059f3302a9c75027e318bdfd90ca0bb494385980f4b07ee641a80e3796bd8026cbd7f3397abb27daeb2a6e45e64a09c7998d48cbcf51242a81136253b9ccaa550b6d0d738f41371d1d1374e91ff953eb06d2994347c611de66838785bc490d4fb43efbef9830cecb99b9c28357f407a33940d2741ef3e1e6d610d623de8f5e869f6a369cda5f07e5a97a9404f39aaa9514c7c5f5cbd15dd6d48d656773c388be6c71e16d17533940d220c6062ab4e9be25914ef67a792908325e195f22ca7af4fbd90c7c513fc5f6a7b1591c2b08864b99055eb97d28a985397070e0003534b74a73cfc9b64b6bdedc0e7cf413a1d86674c3069cdb7d57f19671d83773c9831cafd8bb5deeb2a249ffb76bf926ef89c5633b7cfd6ac915e1e3ff16fa47e0d5cb355fa7e1dad9a17533593c00300c094d7f47e7ccb7deee9b32ab6c3e7f82f3a744435e3edee259df40c0693e8348322cb221373c7d680d84e36518bea05bf899c14a806083da78a9ae98971ae80967be23917d82a7d806315bcdc13cf70510ac45bf14133cfdfcee61c26523a1521bae66845b811e7a8ad000e6e248d0b4c1621d8c0b88b7941431061f2591bed26af37b311f8aa1f2bcbdb89f9bd62824ae124cabfbad8df5430a5c5f62251a159848164eefb3f67969c365232b806ea967797fa94f5682c622afdd3d32edb039569e6c1fc85de75b6251dafaed7ecdba1070076af31d879315d968c52191c85aed0811bac2fe0997a223990188c897b5c439ce9c3942d1214f697c11a1ce7880301910609eb2c4173d7bbd2ca8df3399f181fe75cd0b9281b949b1d3e95158d806a51c6f1515d65bb9122dcd08dd18bdf4aa94ebfc25efd0a18bdfddfe136b097556f6cb445c21aab47f1c20245b9017945f3318bd7200b4b83f786d30dcd6de0de2ca60700aa8bcaea7b5f90ca13ad2e32b2d511b719b811552beee15cfe03d266e3b2b86f1b07650ca2c40f1b597e5975506475a0bc571d210e584d952da10057bee68ec05ca31a4c5685e82701887da45a0d73a810f2c68cb1aa3c5b7422c45fd1f2a9a1c88878e9bafa1b3f6219666daa573a15287ba59f39d52110aae65e51bbfd8a05b3d8d67ced74ae9bf1bfaf568e3cfa2c9a4f85dbf428d78f166c27abd76826a745ae53d20ff771f8be029a55b21cc3d342e4781b021d9545207506881bbfe03158ac881a69fa158c53a754c18e13ec8ce7da8d9c38aa1b02cc2d4791d7808301ccb3d4326123305520e8bff40e5b236d2352a1e5e99415622a9faf03269d5aa5c4452631e4f0c83145892881d489b86a60c02597f26db2a71d644f6888b95691a8c07e1eb59e32b0f3972b7543c5ed30c461e967f80cbc254bc128979da7ba993629fd87c6afb3b7ff6563398737b1aec41bd769b645c83871c8a6bf6ca942aba777b175c6f155762a85883f2ebafb1f65ae5abf6e84fcf06a301f9fde430b501a34ed171479ec48da03d8519895422906f8e6eec296efb83a6317e19bba83ee54e7deec75e6cdfab17e46176226e11276561f66ab7e5be588d5bda4f6c92c9aeb996cfe248a563b3c6006eebd1779ea6099d4c8ac3d0c70b231d7dab7f33884cc021e7e997a121b776526473d0702bab457bb723dda06699bb87f19ea6ac0a6935a8da8b92db5e55420ea9ecfc5a4b8f85f835e76eff1e92a5e870f2f7643b04e80a622e8a41c5709619f65a11eeebf2902dfe2c6322b463497f102695470c44ca0360fc78dde875db9530d6a24cd16d8325d84fce0724961cd2927cd0d0680876d60e1490c15c28a2c42255868f82e0e7007346d6ac2bb8001b675a92ff87209b83ced41ccd9143e0bb4a5ee445507c2aee73252b13b2cb72b578fbe4dd49fff1d308fd8c3965341ce42616712e8e42020828f3739a042893bcc291bf8f7be2a25223e0c9d858308eded7a86174a2cc164ef3179cf2d9375dc64111dba695cdc6e2d804de67b721971953cf4e9deeeecd39f1b627ea990728d2805811e4533ab14b0a14c54f18503ed2b29d32442d58c183a47650ff5cbd1e777e9705674385466d036c8caaa16ec08f668ba1e8d5096765453c7e7c63634bd8a76a1d13d9370120058d0f85ff1433f4c6c0a44c765d21fb378e04acd2b4bc65e36e0c21f540c59aa4867bbb930a13a4b204c24c1390042cd703c1da579f5825e4e8a40178b1574c93be497b04fb0bc0e6d121edddb6bba84c2a5642ba8d62a661ed9e56faa665e7de2022891ee3b09394ea5643a44b5fe8e7b6564bd0227336627652b25872d9b4f0d75d178aef953c97b33d876d57141c4f1b34108baee98d3a3ed0d7247d15a42f630fffbe0c2544fa69a197636f9a105588114c9c09f029e4b57ebfc1f8618b14c01e1225fd5c2accc9cfc37e585157ae1827bd94c5c778da377b6eda86b5443f6fab6843ee658a0909475ebe5604193213962638a8073e039a4d03f07a02b63cfb0abc64056d8ca7b59e71ec05f034775799d2516bdc4085abe23433d529afa0ee6de9d15d0f0838849eec5424d4b89b68198f7a9e33f09cdf515adcf0df72a72f811330b0840364a8399f6cb927cd62dadbf0152720dcc8790acada951ddc4023213fafe40adb4c30c30523a985d2907feff0a0adb56ce2006fd5545e848a94e61c5f235e1432bd6647d6b7a29062495c858a2a2a5646eb0bf9cfb45638002f1efa2260cdf248648aaa126d6a81073c53977b5574cd1338e2fe9b651b970ce801335f83e172d19ee1965ecd4e1ef46ebdf7d2a66cd7dc353b196737a9cbaa21f371bbd259a0f5e81cf4ac1169810254b2b4c18227fcc755e854b1f63f7ab08f2d98314692f8e209506b0c25f1f1f954d9c44d8abb4a55acef92439a0a1c47ded26251a0371e76bbf838ae424cef55cd5a10cd0635c70ae91aaa7357cae751dcf65a74dfc132b4bafa982b9e70e0cd008b8a570170d1c6bfe7754cb694e77b37b9ddf88fb6ceefa35d2200b273296cdc7b88ce09e2206a21e0d80db147b00fe44764b385e29b34c45619caffb5616543134932d8fb56c9fc68b6e19565d9fcceb2946f909252fe50f843a55aea15c0396c64c46c1c81f5b3bae1b1d9ab8be2a49eefff85bb76fc0294a9241649c9599f10b7c790a3b795001d7a742d008023554703c41f7f976fe8bc1bba829a7a59982bb813fa1a272df2cb689fdd877b8266df380e7148e0311dc482d2a893d9b30670c0d95da83823d9a51d84aba252d584f15287a8cd4868dba90a1965b7516a056506407101bb4c361410c01f44ada2b50fb148485cb6ac863736ebe263bfdb51bd7d1166fd208434dfdc2d416f8ecbb250dc20e64f79143463e6e619a4567dedd0c242a6916debab73b45b8d1eca850cdaff861bb5af151ba00a1180d858332c1a81cc5bcae9bee2b0c23e32020ac9f592826abcd039d5c5626b85dbc3955abee5c27cc40bb0c88f91320e1fa1bc5773ec4e84d305cacc5feaac7bcf829b42a0ce8a6aa2a187d3b1b17317997334424db6ebb11599b1ca4ea8384ba8afaa809f5320416aed186183c0214be82d6c3d49442780551cef74a138fbc2902791872a5025058cfae15ffbfddd602960f635232e557b4e3e24388080986b63a32cd3ab510e8e57305bc7ca3db7a974ed4174924191d6a5c25230921a871c385309c9148c574b36f811dbd7b96240d4ad5debf356b5776797d56e4fcd7fcc8e1755d2e218af5df52f81d8c1b316d421acdbd4eb1788cd3ee83b161e32f4750e3c63acfd3e590f6998f5dc8c1ab982995d31c8511ce743533c0fdeafe10834ee574f0a3072daa4c271c5d485ddce51e5b7636bd97f9e087d4e060767ba2f08757901f39056e0e3ddc573b6e469eb82a0f1d86c47da50e860913b35e5a3c66c104f24cc793b0420db26b687fbc3fb6787c669a20cd5bed14c563601c3bf44f53e9a8b83828910c636d98d880411f741787cf19179b44b4d8d9305b9f83ef00e49ef1bb36404748c9cd678523f7605317fb1413e1626602e7990de4b15a5d206028fe80744dc8a904759c0e691342123f68bffd6ac3d64e08b778c2c64f65c41bf13cd27ce92c4fa10660ef4ea2fd1043c763a0679801b36241c1017da492afea213b82d5a976fd6b0cc6776df52b25703b698aec8dd2ca7337b517e38a78f5bcb86d3738725e30bf4fd9e3ef8fa84c35e16231d94a4209dc0b001da3fbe13baa9282dfb61af5d98920899c3150880532632d8401e91660f44eee4216a22182a806a0e8ed6f32746f6adf6aee162ebd513ccfb08540603d67ccc5fcfb238e12946c9973ad4843300ec8dfaa84e4b3efd8c3606de70bcdc2c762d7b3ea6ed387d854d81021fde89709bc935bbe683f722b1c50a38b443c8d4913387b4ec010c9287afb919aeb8bafd430f148e92659946e8b176d18e54962323f957fe81c182a7f9a21a35bd511b9235e7e53e66a9f9bbf22346ff325aa3e5e36ac72d510c21e1be34d22d50d0a753cdce6f97576ffb7c8d200b935f27b8d16a4402e506684fddc2348436eae57a2c87153058aa740bd48422599175e177c6f01ea203cb7d5baff31bc72e42ee19a5d8b32844eef7ef2daf54956d70eedec85e5f9b7d114f06f378c3940336f99314ed5fbdb7ff62ef9e6a4a0ab739553e8f9e0363cf02ef2365d16497960aa93571a031c7327bccb41f466eb15c35b74c221016343cb6eacf721575ba74c89e2ebf70d3b3c65ff9fe7d341ca4f3dc7d5076741c329498b8f165f33593abed24cd20da66e14be710b86a738a3b945e73bb147d304c0d0bccd09b03dad138bec1fd44e751a65e3b11faf657ad5aea85788baa4ae1d25a4421554483b3c6bfe11727771c2a3d4acf699518167a848a1e48b9105de9ba5781f69e451edc069e004d0aa342650b8f146ac97f3ee37e3acd9809ed66260b30b69895fa04874e507a74a446fe9e9669c14a05753cbc37198f1dd97cc529c89f65cbf184c806c025ccf245db37c19c5a5d74c03a2aea7cbe2db5def57fd804b0353d1bdab3c87b91cdc159753878454504f202043e1ec4f9402c6833a31816b5f60a19eaf378a0f627e9bd02b050ae0d8dd6c19a1255122a82f8ad1e4716d1278c01e8b17e44ad9d3a087fd5cd6c7e9d3ba59216a97e089bf41774b658e73678734a0da05579c84c6cc51b88a98c4e32b5e43a2ed4c2208c7c3ad42ba7d02348f80ad8e1588b2214573518f241ebffa4efd34070ac481300ec344e9059c5102f6a2d03dfbbb967ffc5e84431f298cdca963141c6b195d9acbcbe187d73e0b30fb11531d797cda5165097ed81ab2bef2f2dcb974a74f5ed1a64a2e8bf7f5b1ed832cd78399cb5b989bef662e04eb0e7b65747ed8963a9602fa571e30d141d5234597ddc1fab265d04ffc61fc0e5146c74b9ef1c39b8498b4ebdbb1f4aedfbd418463412b39bdf4d6c561f9dbf2361ab3e62407e029c4cb2bd43122568f02423b463c24d61df2472273b20e60c5455c66bfb553699eaa587d77dd435f573c037704ab182216071a168c60922bc47351fe35c60741cc2bdacd685cdab70f5baf74887fb9e089057d6c350515d72aa1da9cce97d1a64bb184bd671c154963849f5c24038d3564f2a42cebb6adbdd624066ae9abca3a19a4238e56e149eb6348388ceaf6bc5007d7153f03c69e79864a07cf57d55e086f0fd806110edd51cd31eb80f82b791c5146467fb67377ac3970185d1bf09e2c2606d9d457b637aadf664c74ea125b5d450a708ab1fb62ed4f012ae37303d832e9b7d1560f72ef954b52adf477cc90f9259dc2c8f84a4bb52c5bb95b9d9bbc494f4f42926bb56f5124bb226ab13e24fa2d2a258f2c66fb49b9c40a0d6fca07be48fb41bf05aabf454337fc2226fff3a97b005cfaa0340bf68dc5f65de108d69f82dc5042c657f42e48db7306d273ed10e2621bc70d020275b788864a5c2c32c169cd222c166e4f9812d2dc2ea8b65281e2332ef9719ca67f5306d0b8ac8e52c2d9edb90e95697aba48f8930a2b70d364d11b73e131de32243a0149721ad78a6fb5ba0806193253a0cfc4a78b4fdb7f14c1091aeb7e360add5ba00d66de109fb9a5fa75f32220ea58e4b2ced6e62bc816591294d915df551b6256b60a87f7898b26d2eb0c0253012dfd65d12080be54c3dfe7d1348bc77bd135651713123451492e8282d58f3f2c42897faa1983ad3e144e09e006c3095555633a41002378dbcf82bd23bf66a853eea0b9817bec31ba4125025a3a32af2027ed0200b2823ed1d4782dcc67503e1a3152fc46a9ea53dac194c9518a636fc065025c2b45462cf30b31b877695e064f2d050bd6de114f17cdbe05187d760d4b9916d0644d99327db072c5d1eb650d0de6cc829ac62e4a0d477b52620d8f0dc20aba26c171e95176e0193689e41b10db92298c181fb14f9ebc30acb25501509ace5eefc025caf986d739a6ae473f14320c632df0b2f1c8436ffc9c5d8c2bf3698161a47ff484d569bd208392fe20b950ccfa5e5a334d92091b5e33bec8c62b495625411ef61dd54ccd8f79310942676e2ce51fad52f443bcaf428427dca416b285253508a5ec7bd0a34ee1bcf21ece66a8d33da8520f80aebd315cbfc5575adf760a591d1ee98f4895ad464e0e7893b7dc323faf655351cfee326bb6f7f46c6ea9c6fc0e52633a5317c5d38eefc61c2a4e382d11520511a2e14bb0340a09bf43de119191af0db09938cb9984bdadca7629845a621b996ccc564c63c846848302affe8c54645d8aeebc7b5733b51cbb0a17b1043ebcfe0d5692f7b5d5ab437e1285ebe2ddde51bd1230823a2fa991b5128ad3f2f40c114f7debf80a8e695a7537f7e22e5b4f12ab0d399e536d79c43f432a7fe92bfd366d7175ab11487de00f26162411683b93f61ab2c819a5b7d53e798c8592d5526444d83ffa590dfbfedb9fac2dd5d244bf7f7523d15f4ccf2d148aaf3a91ac5ea4d554fd9b5ea8ff929bf8cf50826fb3fd9b091ca67e697b75b27c4882fc39fd0bbad2d2b2ef66cbe30771aadf6dee8f3ba625abcdfbd19096b8a3f224a2e1f7f350ee4658b487bac55ac475b96a0723a8b1380892663098b8bc383480ab5b1f4ec53ee1a7915321f7eb9941a9a9fc3449227febdb030ac11cb3b58b012b3c23630e7401efd33b451b8f4b46e9a62e87291b9b8c57d11ecda22c3da2bc1cf386729381e7564444c74d87c8a24dc1d5d13fcb67917f06be75f41162752a81132d7f0f49b5c9a12f7b21f3d21cc8e295f5201ebf506c754131bcaf4b32151993eb67f0801a7330411eef24565a355c2ee2d2f4e1603e3724f99085ad43db0ab192b9b82bf67e42fea076012b73cd7c489c911abe2363f94942272028215d4d797af06637a2b27409c9e27ece956f61b2c0eddbde5f14a5d7ec4995a6692423a3fa6095a394ee36087792bae88a8bf9f543ac4fc8440d3135acf91a3bac0b1bbdcb438fc7212acd3541236ad1a44d18acbf1da6871153a644b19a7015527e07bdca395345ebf8141731d3b064900e082095c3fdc2a7c01ce2f5c640a42b7b8f860a372d41eb314a348ba2b1fd3d2836dcac9c5771726406da41320e13277516d3beb460614ac3d0283f743eca2075bb8444e58d35d25b4bc93ab7952716bb2145170e1beff6a14b44c3b9b345fc2ae8e2cb73f1916999e64c2c8be0fa1096594f1a9beb36a70a9a94d11ead3e18679dc6c70fe44e355ad4152e5d886f195e698fb83579ed1c77709349875176ead0512b651df9ed87753af3073c4aa94b794719e55228260b9aa96929cc827961fae2453e735b43de7db5c08c5db0e18b306520a9cf9ca780e29c6440a0b0fae533432e347bcc4213027ab677a8cc841ad43b662556f58dc12f7d4e9226dc48cee24e38d454ded9e2612b23a9251e7cfb4138a0b80655485b192409d7987a5aead5deff4992b0425e176640e838a9afd2c01dc5d6f9b729be44c6e906b031d2eacca7d195d0f23f7537b7c784588591be071bfcd68c7cff4f24d9ba21c94f1570d6300a679c20f9ce4802f6c146f814cae8e12d6f781e2e2cbddf71bf5836b55cbeea5808364951252e1cf9a661420ddc8b015706d09da62e91e1609f1b65fefeeaf62c24bb68e342525bddc8f7403a94e1a8879dbb1b14c465fdf27fcae4eb95d6ed2ffc5f377eb9f2774028e5446a3b417bf0f20975bd5cf6fd9cd31460ed8334ca296b77bf923441f2851c82e680b0d7e2982372a894592c756138c0f67865a85c73b83d07ca92c309bc0222a3ba1354488d66d0c8b68c4615f513ba29eaba171442cd9cd8cd17675e2de4fa4b819c2332530ae3744c53504dff0f7e52322c9c793c2d363abdda780246b88a30452428e22cbdca1747847521672782c0bfd907462606c2d7e2b5d3acabb36567730e720188e66fbb6644171b6a4ca5e8a8a2e682c942f917cf84a2335298dee4f45fb4b5f72d378d8eddc2ea0a832c1671d5d9f5e1084fadc1ca57a3f55b9165e935177eadf26b213a6e42e79b91c6435b00831f9d5310c767db0c507ced63f41c84d752501b9d4281dc14a11fbb00f3d0bc24a6cae52cb4dec60ce06430b48fe9bfdc07e8a3f9fa56249d767181f549881ef6122ea5fc2600447819b68a763563739647e0b81c119ba9c51603b05ee342034934661e28400f8ac7cc6bd2b984885560f6eafb86047e6688967a497c8199224f33a0cea627abb70f6d29725521a396abd345919c253c4b2899fadf68ba1a29704c3ea887ac48376808336950d3160f661e69380da3a1c09554566040cdc4d36341bb51abc3927f3ee8edf3c048b829f6d00c732dc593791e7859a24853ff8d741e1881a0d846d733684c322c81b9c952b5221bb7c98e92c50bc73df7243c443238c4aecbf56853c8bfabd69685728b8b999bab13ed60ae1c0f4345409926132f7bd8b58f0277a46847d545faed429e03fe767496099560cb511def501034c80c45a9ff25380dd28ce3bf335a7d0a4b1b8216267ed0462e6083a90fd778347d0452aef40ca4e906bb54f8a77179fc8917bb306e2092e77a934c8138244c8f51f93fc896a648f2337fd1ff0cac747e423b4d85a6bd7f138e7afe3be58326f025c34748f1f1ea0158be901e91624d221aebf1a2cb58cab64d66fcbd9d77614a521563328ee761835cd70c276aa69af308cb49479925c542468cbe3e94377c2fab76db1121e852b896669b051d1a5f0df9a5e61e45d324ad0b7602c4c0478316cb22056a3943d35225169d9996700fc24d58868f7eb540bf256991d75c7c256cc77c77c860486ac70b58cd9e8e81c122f7a5b5e1c39d9ab8bf2f94f4a75116c38e6412ecd20af6b78525327c7aa703c96a14132c795f673e95513a43e1b40c40996773f3672a42ebb682260101d8ca93e6d0d5f1737420b2980628cbce2c4a464095258a1d976af41e6e05ab4e3027bfcc628697c5427ca38e44593948735dd9dec65adf9a9664dc5f177b83497959bbb4b0644eb3cb640ff16c5932f34830023c44b634a4c3668697daa3c4b48e4ada781400abbad5a92199cad5a508b01d432de5247b32474513d1c5b2b3db3456d3b8efa21dd7dbf19d64d36c159bab4a6b1a617b9963da24d2fffb3f3eec3e84f6c277e837395aaf5927d26130badaaed8d3a0f8e714a2efea51016cc469fc0265e8fa7829d722199b03bdba49ff2b89edb791a4db2e770edf26ac9ffcc6ba75616cee1778632d06029414707f5f6b368bdd398ae56fe0781e05518141e4634486ac015a5c9519b3836163e897d1fad3a4b84757be2ed6c89aa4e1fe8adea21e7a2c14354126d3cbb2fc98613a8fc7ea1339e74afef8bb4ce8f76f4e4cfe41f75fdd69aa1cfc5b5472d22c441d2e9a829a92663cfe815e7746de265693fd7eeab23261eb32ad0bc9f219559882963a959540439d5681c79a91953742762ce9cf78a124a7c5cf218ac18ecf7586897a96e4f20ac739c52ef7d01aab3a95436e800c1a5ced538762d23edaaa92924ee66e27b71f411b10643465c542e6ad7981d91215a96c86e0739688b3cc121e33fc322b59c813b261b6560aaecb003d8bc98cba970683cc40c65117de212fbdbce8a1aa0306d564b9ce41ad6ab3e9305345d958d115e7bf74ca095a955a8e56472cd3575aa77724b0958ca0c15392425ec9a40e3a52efa0ae53767a1df5ff5e044ab4879079ecda1157add15173631339ad49b78599ba78cbafb248dc789030b5d8c77b218f864d0be4bb5a2cc68c1e62b1050650a6af06584be07708e071addb87e100b1ba0a490b14c72478fb5df1aaf407a6685c326b44b75d6864f1c586fe3c167741e5a09672f45345457dfaf076dd8e4e320ace19cd56962fb4d2b7b2b0da2cdf92c84431b1d48c13d68c484d495cdb94fd80b8149093f71377aad1c898327b30d33f87984bbf21b7644f86e2a19d1b6e4d19cfd1c6b7315be74292fe99475b7668b23230676ae4ce45040f9bdf82de6ee34a2aa55ee44dd7d4a3a1dc58716b61dbfa2063badfe34495b0283839dca7af8b0a673fba79c59b93cd9758cb98d49c93391a497d72dc36e53bf9a8c0346b5d600500366426aa96572523fa247e06dae685b0d4a594540201806a40ab634864437a494d84361d26102a4fe96c083725765ad965efd04f297d63da1a359d4d22456aec0d2a691bf42ed908c4fc9f43a027e77c4757fe94b451bb5affb9ddab0f0a828f24f608d76d14ee13f3caf0577cd9dccb5966bd25e409f4d79784841c11074e8294424734c7890b56dcdd9809be7311a2728cb8532a5e757e0ae9df0b09b6a6320fb9d5f950edb0c83d3251ff01257e6cd3bdd46a957dea7b48843ab1fdc398ecf8040c2ab7e503ecc1c09c5d0ad3f71fd3374b5b63107a90b2e6bcbf25391b687732c683e8e4f2dd97ec76589070260221eaa56773fc874c301ac264ec81eea7cb7bb1d2884de9a3409db788b8d217b784923f100cc6ed9d43198ca79231cf4549bb3743df9698530134e1c4ca85c9ad34af3bc359356f87e8a8a772f73ca67b6c0ee35375a022a0cc1d8152320c0fa57eaaa81dfce540882aeef1a2dcd6d04a614ab863e1db97133d23a86196618a9097bafde0511435b28c2e36c9e475610736dcea9debdf8caad79c50134862575aa20c4959751a60581a72a51d612e06179be0e9b3c3c9b74ecbc20fd0863c5d000612396fa307e09b17b3a8433832c64704bcbcea6a44c16effed2652877059c4161df64a5a494e5f6313e871f91e261541ff829a144dbc20c6f9912e3cb11d6b3ee836bfaa963f1c4006fe9653aec0fa28fa1dc498a94bf82f91494111ca3e728072ff6352f8af1a39a7be20ec3421df866d2f0778b532970f9d7256a30a23249c07b91628b10d87a8422e464cc578d7c14e71dcb5dae772c51527498eaa33495f8f78999fef8ba499b8fef88e75e7ae4d6ce31867a447c144aaaa67eb87b0c4f49d448cf76d6a04455786379cb87f6a6aa5b1a0330865df5509760c07383243e9d03ebe5447b61ccc1d54de96e2bb3cf239e6639474425c44687b3b94c9fbd11385dd744211a299c0105927662c1ef765d0cbd0a8eb45a0f620c982e8423956d413dcb4a59989a8720e0740573147fe0350f158f67b281072b468f93a4fbde3a6b601468090f5b1c0c570bddd4be80701b950e6750e0050d53387c270fd9f60877ad269b3a6753b508146a43bd38275e028388fd51c07b0263481271253a755e93080877bb4e4ee25904365e2db67c104c6e0a124e13113d10f27837bc737f2560243562ddcc8a2750b96694632dbaefd32e04ad9c6ed82c3b428f0f74fe3ac2659f47e02b07db110aa444fe70dad05be53e2810ba503fa7c01163d010e2e651202aab1d36e9004d4e6bad308d2c716bffabff8c134d0de7018332a00e0d4fec11775edfa3b247831ed10de044004c99d507615661197594f0df9c6f8634db962289dfee05860ab557ad3469d5c8315a3f9829750efdfa5403ec73127be38d10a18782fa30bca08052d9206bd269112d7b174a6c17b30641e990ee88f0835e8adb471cdf42104df06efa56b98025445b8a3889e9639a6c7186e14153601689698233471fc31d2153591d3f0927863244a4dabce648aa8497c855803b5f1246771b9ff399d60a030b855bc871a6a26130626cdfc90bc820a88aa592b134cd9677a8beb080ad505c3f213c0693c44eadf24a0f31b2b5849aff17a726fd3f48156a3e92aec248916fd4e0a53110ed4475a50abdb6b582d7d6dde8746baa7a2aa859cf49a753ac5ad609bea6f78273c5b6b4798ce2e08e9e97c2f77474b27abbdc1f8ae2df844f1c3c57f6ae71a638fb17f9a037a2e9a4dcf32836b43900a255d69aa0b46e374baaf93dd2f00be110e3be7f45d35faca73fd63b7a8dedb5143c13fb1bee16f9fd96ff49144d3e897528a207bd74281861de1a00d41e7f0627c2183957be936764a6307d3983cfe627ac5d181a2ee2e43c4461b29250a4396944a99a1968022dbe2fdfa2f9ab0ec4d090f5492ad173545c379289b889fa394394a25f7d074ff9efc1504167b0c72dc7dc4bbf9c9e2feed26c6e69a41cea92354b1228821aaa479a3aac320889ef7968c8d8ab698f91be67a428e1cb2bc8e221c1082c95bc42dbf4672a8ae814faa2e1db905b11621cc1933a13eb32c3263ef193ca854d27d7ba05e0022712de952b16f6c4464129834ab02eafdbb229166f4e29541109323c1c0d229ad3c1eb56e096101f9ceb45427ba6fc3e45511d016f521fe0baba422b846ec176206d29fe0628fa59d27f801b11f8a2ae79645485296d8aa65e04c36a9c8a60e84fc0b1ca42ec1ef58b700ad8f72f17bccf67f0f3514f66ca2cb192072e039c43478b0818e6c90fc8b4f0b40978e5625d6d045ff076015434ff120cba585bd251fdb281cf41b24d70e317c92a9b849dc82fb4908d1e823291e516666f0bb6b4183bdc230c9d88caa30d331a72bcb4a742970f2493d9d38c17273dfd31c94d43a817652aed381436bac530899f356b566df43e4cd3ba98308acb9aab23ae739f32463e150b0103331cc8336e3d74a59f5194a0626710f6e6ed8565fae41b89d3330f5cbce112c05821f4495071d91c3e03fe41efc7073056b43e55c128e05f11b443702f32c35609fa73f747825887d1de47a83e6c0a5268ccadb05a120819de8f32aefad8282d633c5edc7b8f29070646efc7a7deffe545eacbfd98242c465a4008aa7208749130aba8c1b4ccf010ca091f4af41eaa7cd638966970a99e76822dbd59e3932aad83d42b37d6b04b6b5c84395ecaaaf212d06aca1e4e63844a78413ac1b52c7b2d6607ad2e4e82bc1598d21ef6d3e1dcb1f3a6ae84ab58e1a6c29385f926476cc0486ba6fb8cc137d0c4ce3fa31c6bb37884e5a9dda6c79f2c3ca7f49a14dd849c7488bc0f4f73f3c29cc232277e29a947cc857eb2f78ba900f727e891913890ed204e63d88c6f69118d480528c5e4a0d91344d201dae535b647f604ed4d184bf14d21ca366cd4651f0f70df7c4aaff880d65cbcca27a83ccc6c544027149593208acfa4f9cdbd35cd2efc94a7fe1b6ef382475d8a5479152d8381dae8cb247a1e9b8289beca33a45425c1d9216012d179ae53a20cbc77d6f9a9316d9f7cc2b7a691d82a90905a7a2d54fa438f380cf97e8186fa1c19f240dfb22500f2871886a1aaa78bff478f12105dbccc4b9a216b91782854a348776f83ba2f31d60aa6c47b87243cf3d9b2c9054db59a0646ffd54fb6bcfdbeaccf0a1c97074c7951c31a796501cdcd857e1d53f4094f89e09d56f424517b9767d2b3f48c5d064ca3cfe59805eceb9153f268f41c7dd92d74594b8e4c544b86189ccb0e384b48351a268727dc7fcc61b9f2cd7de7e3c954b7f3501e8f033f2726cad2865c5802001a5cd272006e0555585d272e78b5c883c42391a88756270f29bd8385bcc03a280aff67af4209ef75b449486dc6648ac449765ce12fdf476b6c5c1424923a4566b7d9c389c26f44b041ef68f531f4bb1e5b666eb06d3145da5835ff77627b5c0050df730ab36c9d5e764508fccd0e8e7b2d7c13f07301dc1f4354c6ae863fb6aa470f7b684d950e2e1ffa99a8d539b7a63a640dae1dfab9c13c89540a8d287805df3b8f426ee1fbe47b241633ac55d8ab37c575e77ddc5cc7bdbf7a47d5ce30c64f67cb3cdd201c05de8620f4a7a5b61106008984f1d6fab0c8d8f9e0e96d06e5dcc7a8bd4c0e3e61a41a1d972627b619aa08152f8f53e86d1e3a6837a77e8d0d20d43d6f3bca966cdf24f13a5fa2b352f4afc3ca54345aa8e2763509f62ba7b0a579602e9af18b1cda6b0f1bdd12e9256bab025b364259ffba7d0588bbbc3c95b7aba257a55f2682cccc53e80315181f40e3f6a4280b28a078a7b529ba50fe22b98df61310351ae43cf475f84d7cfa025413b80102ed9db172ed71fa9db750b800476d4bf4c8cc7bc604e1be6b1afbbb05e6a12fd18de6a991a610c0df30c49b6dfd3e18e18da6cc50d7ea202326299f3bbaa411fe5d0fb7a1ae8e54ca60c27619d25625e9a0c202ca6d22a8debd07c196714f112a399cd85a53a79da938fde91b37419e6b4473547057a3199ac0f378d3b3377b990a88f24582f83fc495e7938de7bfefeba9922dad98ad199d58ad55caef030007e5496b3ab5f1634928cd4c081dedfa1bd3815cdead98b74b5d9d03184b1125222337d922179881b6aed65876e021a4c411fb15a578dbec3cd8e0e440ee83b2764a08a69b0a10bcdf676b6b60fdab0036abcb7a95ac7f7f64a53603974586af87c60d5e4fc94c9b53f8b87fc0a783603d562b29c1a660651741694c4f6095938eacf4c92b02345138a349370bedbee4317ab42c4d7efc9a19fe41751980dcc3c9c759c4050d5ed1f8129e72a040985e56a787306f46b2198dd3d09e192c436108cce320083206d35bf217c5e70156554feb437d421ffca8bb0baef75faebe4da5ce78db2c51ead485c03c582b7b9309b7869ded9f1536e1f581cd9abbf34dc3159ce52f2485111c2071884b8225082560415fa1ca2492b7af0b215ae81ac5638fc4893ad94a56494b4f7a25c4c375a0e8be9b36163523e6226a35fcecc3d772c6d6dab0ac098b336c577c7bf20a05164c092518c8eb4e27998fa5604aae7763c4f21a7676593b9834c9bb11f0e1695454a1a6331dcd4d2f9560939d15d667a63adf594dfeacdce95fb465062d0e0051c43421d84c8302d38c2b904efbdb7fec011702c3029b05c47a69797c77ff5bc0c43e566ebe68b22e47f4282ecaa90019ce041623a1c6d3e53c0e84a404cd45ece0fb932ab3e4b3b666ec1b7311fc73e14ffcc71f6f7a52c09e766e294d42cb6f4438763906858dbec7211dc87acbc7f55b440f5d69a9805980d884433f7ce261ca350906617753561d9e229f2c5f8519a1829f4f94025c6e99d403627cda7a866a9b8502c24348a413c609b4a02001bd59dd833dd4550174b14ea8c36279b311dae5f40ece78e66ac812f904d2b981e08391ec8f66553233c54d1f7f51dfcd8c6c610b6774128ab618e7b1a17aff7aff89f4d53b39facbd02eca12635d7dc74da1e8b6847d5607701846a9d264c49a0ebf04aa9f2117df24c9e6e89ceb30e7277ac34159fb15f2a478a8063f7bf2dcf25ecea2a346d5be84b6348c7c955912c8c8fd3372f3d3578d82866ae430c9e070cc9a2f9b26835d4bf9c904ca0b10fb11bf6744ea6215f127945ba264679d9e3e12f30c3f4a997d2195da8e2e03018a041f761086cadc49081c34640a1aa6bdd8cfe21b6d95f4ee8c9edbbf34715f813affd6894354487ac35ed704a5e26483af04c22a2b741508f97e5f67e479f5bcff8cc7353dfd866f5b68a69c5903d858553430bcdc1088c05d33cb8b070d6a8093d46569673020f1432534bf86f57b0810ca779bd1abc6d40397c2723e2563418822ab7c0df032d244644646495c8a58f6703ded851ea42ea1834af2ff298f550b6019fda78df6fbcfc10988b61dff172479dcea861be74ab924be2c1454f9b17e2e08c8be44d35e09383071c52b49c7b321db49e4bca24cd5684e3c205a2a1f1e35a474f835f2c50ded2ef0dc8f14ed16ced62ad5e804a17e3b381a61da9b1d05636b9c5f6420186b26a37aaa2858d639d3385f5541874df259ef5b954a1a30ed06cf1b75f867fe61d0b17749335283169af187fd21e9a9e18d90afc5c522c57bfeaa2a28957e8c8eb496e65c54e1146600deb178ac6ab17a7753fa8bb3bcb684bc4628b41c950d2362d029c17176ba2bdc4e4677e09e57d143e162b38b5b889ec6c2b19f4e84a8b5b62f02218a2c218a9c100466396f49966a017ba30a4506ebe480d217e5aea7ce3ecfe8a2e034b1a431214d422f9d8dc53d256ccf2294d9262d595478054a462a8a76ebf2367f865281ba6b0b8de8af107efe0b3a7a05041ecb94ce04a11420d1f91f64efc1407eb914363dcd58c02facd1479004391dfbb373eec7b029eee66e099d76a4f43bb28e0fc47b613478c9ad6d834199924accdb623cd277f5387d599bdace578b855dc3fa116f059c4be5579248621e91f02117d5933ac27049b46a434f5a4b13cee56286c353125bf4bde46899c4be71eec2aeba082c617489946ab1ea57bb58bfec987d01e8cbb7519cfabdddde81deed345f705da9f89b39c69fd54e76d2a03d8565ee7481ddfe80a1e3786a4195de25b797c68a2c66607486e1307160e08ab576ac41074e4234dba12081c1f494435c0c9b0398f4d5e91320cc9e02b687da3858470f175561f81597c29a0aa904253f339fbbec634c4eb09cd7ca35e309301fc7a01ca1dd13d5f404e6951073646295c87158dc8be6d67aba4ea6a80c2a5bd2195def525a157fe6c0bfa4349a32fdf3cbc3589fe94eb888a683ec8f75916b4ac07b06769170a4a0f4b0235bc492b21fb4d372d08dda61114b6cfd5d26bb24bc8de5b4a29a50c6a03bd0302042b5e042c0838202aea57187081a3833d67f4a01ab15ecadcaa0b45e9a27469faf664415582bdfaa73c018a87699a3ecac23e9add9533465d7761af3f828b1cfbf944f129cb8ebdbab2bd386b2bded166f292a9bc55a497bbea4cb7ab1b63b3cc25d19d9df70c893a0df6e0d7b3eb58d67f7075aa0efb759d6b5d672783ff009f3bf657b8b4e37bea58973e3dc88e755cd6cd344d9ffc209fe806eca32eeb22a469faf5f1a9735df64c914ad3f4f3b9a3f33b2e125a699afe6e91a6e9ef68f0f9445dbc78173e53e4344ddf3a8b0ddefa8a7b7ac07aea4b99ea657deda85e4f1dd5eb58571ed4b739aad76ace089542a9be54d6d84edda31796becc26c64232a935f93a8157286e3e2700745d747c492f4f147bcacba06d5ff562b15f87f49dfdd55af2c38589a4abc8b3a6ae35c162bf8ef59dfdd684f5546abb4500bef6b4610d00c7c69ecfc7283c289ae64ac7b2afba8127cd4d3af613d5ea74963c4510ab0bdf81fda23665ec2399bd96c03ede1b7cddc2559fb8b55fb4ec0b9d38642457905e7a89923e6ed1d12cb6f851e565f9225df4725491c27785339abfb4235013bf4cd75ee6e05f615da5729365a6289d3c51ec52a1b2aef2fa2e15e3eb5507aad4686e96cef9ae52b8548c2b2cfae8e3b9227f99730f06b381b96020ae880bbbf73f7061f76e8034c90a656d0bd626018b30b535cdfca4d6a74b855b8c573a2613dcd64bd1bcb007dc3ca08640915f1f46206d54c45f51e5a28f7ad5c188c2662f3d96bd7417af5faa32e575a55dbc7eeddc4f9d0ab0081045dc11f9fdc282363e51d8dbd2a6a878ce26916d9f7421926f5f771c4772a686b8aedd5ea719da7567d2ef0c2c92dcbbd5c2b02c92362f1a49f9d5e7de39e79c372b9314a8383754369a3f0a597aea85c23e959d3cd1107c8ef10f7cf6c919e72cc2c678d47d69fa4ac649f2c67aa556e64b841feb2ac5ce2db29e717474e46fa6529e6d6492c4e71db3b5aec3986692acb55835358331c6584cb9d633e6e37345ca718679d6d65a2b8aa6cccba6e68e98d9d98825e65bc59a3b22fb0a85fdfc9a49d1783e519c5d2952f9447362f563f5b7e7c4509b49d1836fd167f44bf45d26e0854dbae915b8236648dc552eed6ae65cad665ed96944d14fdc0eb69fb8fbb55f362fbfb06ab45788eee2c5bd374cb4b924687c3c715fe5686ed1b1b8ea605b4bf3b2f5c6e0d2c63170df981f3246660735f59e3f5151785bdbfcb3bbd1fb8182f133fcb90146acc60fd38f5f7d3f3f2ddaf8f9d07043860fd63672f011451b5e68f0d808cee0b911e4462dd750563de3e4abfb6e187d3d590b88c168818c5fcf4a05a2f599d5a8f9b84043747cee164bb4dbc7043d305b6aed43021e983e6329be1cb0befa7c887cf9d5e7637b7463a8a81b127f0a9aa1283a6ef08a34a136cafacbaa22d43cfe9be2439197a6af797bba54d8ecbeb2de11d69e1fb8f8eb3dbc4d7aebc30c21b35ba3c38c1f3c353acca8f5d4e89065befa66c4c8e1519b27b96a11373566e6cd0e23c081e886ee69880a48c2c4d48861c288a981b7c90f2d8f29c1c102edc90c5e886a7037044584060f0b55b4642e29135a4e833e21d3e7cf87530c485cb8c189072b2cfcf09802acf18295b105a3f9a2d56a89b021f157df4ccbf3b4cd372282d96b095ba3437ec167137072ce353a64a6476bdeae60eb51d52f113639449d30c3171fa0a208ec90c078f284e58ad213d1041fcc1476936d6cf68ac2e726f84ec127ec5583490da27c4a4743f4d1b0fdcc57df0c22b301bb6ae64d03f7b98cfa8c93f3898a70836207fdaac9f904158b6fd6c25f27552cd9d5bffa66425ef5d537ab3dda7ad47cfcd4136b0d31923e23d14884faf1b5b6b1b9b92348388e7eed1f4cc0e9b59bacd73f123b589d5e3bec8ed0ee52bebaf61a0df52888d7393bc658dfafadcd82fc8c45511445bb5bc568de4aa921aa8fb504cdeb5b8a62f52b5617922bc85eca388af1ab6fe6f3167b697380043c39972c4e5f680873c3d410d84b8c807d3ce5d3564b645b45fa5a43a0369fd826dc348f5a9ecd9af8514bd8dd63172d890bf4f0a81cd40bf408a9b06a55f8fa28cde31e5acdd6c4057a6a1501155f6baee064a8a2e8b2ab4f4692f7f5343dea9331f4d717c349c5e9317abbc36e8da49f5faf2460779f829c9ab7cef376674ddca8dd2a3182e5796ba486a85e620422a2c7e7ae9618217bad21b0d714d828b584ddd510d546a921aaf55a029f396436a1ac766963bfa62fc6d03f03ca7a3126512b96c066913f9f1557bf350156ca7d61aeebba372f3acb41d4ead5d1ba4bd55c0eaea75ee49863d4be56f9ea83b15479c15bd6afb9acb76c814789ce0e017ec45122b03f7ace8934fd1d0f2faa3cc7be2ae6e2551de86022d5eb19543dc56b8785fdbc82445f688e072e3e25ab4fae48413af615d7f54b7b75c548bb8a79705da73c9f6425a1ac2bd2f38b8555614777a5524efacb953a3dc8bef3d2614180c72e9e28092f5e3a5597a69fe380a8a8157927ebec64bfce62453e5d3955978ae03d90e380a8f2be58949f62a73b19fc3d03b7a1dbcf36c48674bbc5604d6c01fa0002858043a061308844eb412bb215f56eb6db928e48a7341c3254f2e1834a0a945a6011a012ee869b0199f576b8dd8f1f47bbfe96d98c7684a694e2522b3b243b1c119cafe884a2deccc84cc9e6c3d613f61062d9f9d8cd84cc7a454145f705951fd14f0a0c67290824d8c30d713f704a418228fd7afc9e824682bd14497ac5c3934dc8a6f4a8ccd3efa7828d92598043804833dbac472342431af218f682e0944eb829ed76bd1e3acb13c2fbd990d87a44843d223aa150dabb09b1e08ee072457245428a7a3e723c5b119b5291912225a05d15225c8f0750e9888e0a0e88f4e3d7b3059178413c2ac1a1a012905bcf08cfcaaedf0b06058342825476fdde905cafc88e3754d42b9262d9f57bb81cd2ed8704d8137243b201d97a4a3f84484333dfaedf03ca4da96f47d497790a9af18efcaaecfa284ca9c6e603ec8a286533e4acad3d2ba0636b473fa0565fd46acf3abd302b43c1ceb9fa826e7f735abc05ba9475a51d665f9f302c4bdaf55192ac26549544c5a1c9c2b2de2d217001660186f0a5a60b086140f01202da6a911e82161050f78d396003085d0d351a10f240780a0185597c43c058035cf6755d0186bc2cb02d30e1be5ee3651b20ccbe6e53a3655faff992bbeceb354f60481b4c77dad76b6ac84a720ffbea4b827bd90dfb1a60477b9aa63b1a5b6bed8ddd30c6f8deebf9efb5d6fe6ea92a6ef0b11c23398ea7c92ae14b1724a125df0947381b9370d1c40b16db8f051c704f38240c3fba69caf8711cef19c37163dd647d687df5f1d8f1d0e59e2b8a464471870eb3075766d1144591cca2288aa2986342bb3e9a499038f922c1e529220f223a2583c24c47561136374144183c812285461726341e0b689892b402120075f048471e323430635c2153977d789bfcd0f22f313baeb45258ca3e32b36385bd6388aa25c2863479b478a30d5584cdcd0e2059474f9e318ae26bb76241f60e1f03dae3575f8e302060fbab2f070c1e85dd1fa15c7341aebd20858108d57aba1643aa0285a82cc9312546500e14d40822bffa7218391113b2f3575f0e22398604e500c2130b7a7df5e188010ea7476d785a3a70e4b382102a2f641886c0870b744740609890a5a633797068c1b1e52f0e29afba2146243654cbe960a18426a5a0179ca2c400aa4f56825060e487684a915a0eaa1d317a0505a0f04b41464d052635aa93901e488e7e5ae002a5d625d76c20f1302684439763c99b5f7d39b0d40a82ab4bd3b48653ef0d5139b80e02c425a1caa569fa02e7c4071930bae915958fa6e5d16a74f468e5f59668b4472b105b1bcb6feddb95bd55364ade4afe97b262122dc428493d3a9c1625d813b46096e228b95e82ca8a0d47894b45d35b57404d6cc68dcd256b1eb18f36e3c5fca228bacd28ea9375c668e0573e33560992643466b666694f98c862581a90ad246292610fdd9e1025c970f686b3164732a52acd558ccc9ea1f1c0ca40830d5a000880eb830006208055f60f49701a7cf53da111d9d65d4e724f7878db6a0f0094a255181bb60580918e8686dbb6de3ada9931ccb6f50d7abc0c8c86b6d560e947d3e467db0c9a8031433fed2ceb64834e6a494bdb03182b743283b62d8d85b2435554926c891dbef6199e34c60b93976db56f9f598c1713b6d52e53a331c1407bed3140b62d436c687bedaba11b4d52120adb9a4970291898806c5b3ac9a56008b3ad0a4ad1aa04493eb6d59e32d2cde092b26cab9d3cda31f5b6d53ef67819e8488a5511977e3219bfd7ae9b8029c0b0b2adf6ec146492dd08be760ce60a9b788951b9c20b75874d329e3be449b70c4c33529f591319624cb31a2d005f7d4d52a0830664dbe0abaf490e06b6a19b87afbe2641625c6e4970adafbe26316439704e708ec90d49b11a700e4a1113196448709191ae7705ebf011de318121490adee11ee63129c110ccb37809ff983099827fb809039910c574c040ec84834c7e74c1410c060b99d8f88285180a0f595f7d391c6427e0214faa456623a73e332c31a83cabd1724735320dc8d642ec28db866e660ab21eb7241997236282d3d949cee56c483928454c4ddb6ac7463a9aafbe5ccf8f6dfd1eed989e76af732ff35450b1a8cc5bfacd6c49f26b02ca2c25c56e0066a71cc45f7d4b6290e572104506938522152619511666a83c14a9243dc9439e74e685242cdb6a9fd96882a4598d46a6107b010d03d9c814622ab00ddd56444ce96d85dd26c12d214ac2817392bb30bd64882c88ce41d145315f7d4b7008d14517672d8e644a955a616da4754b5ee4b0ad8f47bb1598d80cbbd72ef678a92d3130bcd7ae977e2530b6c3efb5e726a07825c9b6ad63a760995424f8da2f18a196929482f0b55b0da5872917644ef4f0b5579e34e5428c05290a9f59932c68f6dacb8bf30afbadd198b46cabdd02d94a15623118baad8e2401dd2ece5a1cc994aa3457658c596f36b01168041a878c4363105fad5024c135c948807beda6935c2e12655bed2594a25c4476a4e8b5ab8c7464101c74af3d75b43371c894ec5e3bd9e305b7d53e2efdf6571f0a2f686802964f3127e06bd74ec1f209187ced5904230a575998606cab1d8b50e270952529b61387affdf2a44d3cb6d56e7d664c321566afc57304aa21b4cb96f658a37df529e9bdfeea539204f4da633edac8836105253ade093ca49c506e05bb3e4f9a72a111d17a372337a534150611f280f0b2e87ee8aa0c8586ba9b4e7844b885c7ebe17ae0864586588648865b70b827219110490e4b125a957448da0302017f3f22bf222045bc21de95303ba19da505a159098df2a8942b996f7214a2a1010010041443170000100c1087c381240bd42c0f547c1480126d842e56402a8b442251883410848108844008030000000008c020000440100364b40e68975639f4b1d279c6df040856dd27f71f43bbb9a107565bd0e04faaca28f26fb812267c71d6c1d75022f42753acb9334aa6ca7c66960c9df9cc5c3255e633b364a8994f66c9783593894fa69aa9663e193543cb7c324b8692e9cd28195ac693f9d252bf9bad28304c07af36993acdc37f7d41a2eac65a2046a59ba6f68744ed69d2861719b0e7e6d1718030655459a8bb393b80c2e98f511644d3310940c29c2ceee2f697a53acdde3f307288f60201ebcb93489907b22cee61cb3addeec9285e00e5b1aa2c5402cae139568dc08907d61b8f6679abdc5ba383c360470d663c1e2d1d9c333c2b3052c12be3cd33d4453d0c1da6aa29506a8339221e224655dfde9598ab90ec2adcacf442ef2a477390c72ea8bb8318d6a2c5e23adf3e02026d6a317bceec97c08ee50fa18986033f243ef6b212c33507fa2de80eb74275a3877d44f67e7cbf93a2343f034648b03364fea10101ac11a0114c6dff052fbd2cbc1357443d03da3eeab795ad3803eebc47fb257baff7d4b55d9c044bc336b96b9d8427614b569f08c263db936f759f897c4cd374a1002dcc2e175010769e58e261e2d1c281e7a2827a22657fb1f25069b41e9b3df833637fb54a7cb48886799f1df78b06ada1818d7e549190f70f4d3dd1983ae81ec9b54c791bcbfa76af0d53aa5396eec0f8561cb8c02b069687006bdf9181d541baf5a683c7129889ca1155b213540d8a7db14f105343fd32760b4013a077460abbf0bc502494a603f016461d202d979d2fab62bcbed65140c31ee9345a365dcbde07129cb1aa2db453507e4f016fbd6cc0d54cbd0d1acac3d89917ec993aae15115fa1c4aa6ccef2dd5fa2b1df1d4164e51e74fc02ba342637f99e3948f48c2a74ebd831809330eeafeae173bc723f613cd6becb93ad7b395e8b30230daf5b8d5d540003c2e7fa07d07ae44d9cd44a1817324d7a654fb1bcabf906dda5d627a91d3250aad6803abd2807a101b6e3a63084f24afc87b604e598206062b7cf9fbe072acc0791822299bbc3a0be1a9dcd9467de4c9211c9e43348463c631d37434b5d91f406bfb8005c0f5b4a7fd6779d667daecfc2ff4199733476feba2331f2885a1dc0f33e2900a28ff4cac9fc52bd5f4581abd2e9e0c086a9eaa5dec22d3c6b9944eec4974c950bb1f2ad0c8065ee1e784833cd99845f88e1a146c797ef6ca581d271ed24c001541ffb136a28ae11a4f20d0e9ea311a88678cc677f6b040e97c464129951a6cfa433e24c9799ce8c327d269d1165aa130ca86955a3430a8a967a93f126d0ac1069b9fc0d3715708e8936f4554fad139bcc7a31c72c653dfcdeb40df30df01e21c2888dd4eef31d9e026d806f5c86fe2bcdbb3e600c2bd15fa2add4cf2c0ed86208db0a09d2a87b1bd93ec01a722f9c009788e060dfb2f32edc32803d097b4e3dc902f0dc7255aacb90bb5ea008228258c079625bc7d0a85fc71d80da2057a648008dbb4b34e3c509cc20d6a2fbfe435c2725e6ae9b5e248031fdf085988715724200942197df42107c13840d78fcd988197b2b084b64ddf1efd2880e1142aac76195928137e3008564c341b427dbbd833378591cc2a63f72aa69031406cb321cf28bf234c76305589406a6a31e7848086a791a3e2576db52f3977ce2695450d9b28101967dcbcb474a056e89c5b8bcff20d88999db9f32a538044ce97d5189700aee94e527f03ca5631d80c602197f7f1ee5c620cbaff8ebd2e28afa1f8abf1fa2a4c1f35dd1084c1b1dac9168b324bced1f05542b833ca4bd8f95f840354ee38fb934dd10b3f8ffbce4064305bae4a952c5878c03ea1f0ff68477e103ccdde4d42f58ba235c75c3926ebbe58745c71b9f74e260101545f93da5e2167d87a27fb554584396c7edaf9258283db09b262c66c93238154b4aa5fc083d3180e4fa2c4833bea1373a9659f9f358f75fc0acf480622cc24ef9537a1e63c9a2dad39bc2507d4f63d16c7cfff2b6b5d9882e4b4354fa403b552532c8350ba501fa6375427fb0075696069b09b1f3b078864c3c80a78c685e10ab38eba779b2f05d4db2b86e9cdfee759c25ae48fd15a4d803875263618bdfc7acf70d445e2662f8c0f5a458b1a403f6bd20598a24ed2fe5d3ea80a0c982c0217ea5346c915fc9f9af3d8e585e1e8a172839b490e57ad6f8a512d025655161eebec8e9fd21901d96575e7ec253d6c939682c08e5f7f3121f166d1a4a1e152a3e204c50cb53fd3f25f6434159f49f8a4fb105acba59dc11f31e9b4b0debbfef924901c88293b57e9953ea1a99ee64ae33cf037fd665c15966fe1b271d429774451710384ada9983cee2c73e7f64cf681e69c3c2618bfd3953aebe2852162ceef4aed2a8fa76dc533996851fb4fa71257610732d39c9c83267164a406a9684e7d406ed929f034d935d0145bd2c118dfd4f97e2d6124b9a7ef341a57e1de1ec59fae9dac39772140ccb1a5bf247a7028e6b3c71e1acf5df73baa22b71c2edc4fc753f6db0688645fd0099aae2d73c3e217672fed83c5d5939e858e0fb7989efa109a3f8a753ea638b929386d15fa5519fcae79287e1640cf58c3d1976e2f63aa7921032dd495f273c0f2c756421cbafb2f905993de02d9f341d301455287e7ea4fa89bfe684dce9fee14b330ceda7e57ff4e94a1c71b0a466888fcad33f65014e767bbf2c01fa503d6fbdc5a55685a3e684dce9fe317faa72e3c68905f1034a5c2079f89b4a7b1f7f4e6e5e59ea0a8c364edc3d93f86089e3c3b16445c9d3a5b80961d917653c1a4e01a5637a32ccc9e4f14e65199d39a1d479e5ff61a556143fc5125738fcddab31965541f331ecd2551ce84faa3fdfff6753011b359cdca43f58eaf90843cf50daf9d47bbe7dc8b23405c70c272d820f2cf13ec2916f9e7b7532f1ea4555c5bdc778c8ec133d27ce079438b6184bc00a3fbd34b079ac8f93b5f0cba5a08f57273baf702e95cc5973d2ff74f1b0a5313e322b85117e4304bd630f8993c9c6374b3b9ffacfb70f7356bab2c73ab1cb2c37de2f834ead43a9e02a5ad339f83c95b30c99ce3593ac5730b7109b5c4a39636c52e2fc953b8d8c159c7c40aad89a9bd534bd3b075104bff917bec04d6288e7bcbee66129083968d9b971c25de1336ab77c1baec3aaf45ba01c533a0805312a4646535fb6f4bb2b6a48839029b4459f2fa8cf08b1d622f43916694504f49751e47b2a2cbcc39d0af25c09a035637e6d2d8ad179886e588389a92e49550a95e1cff1f9fa0c465f65336410f9d979981d9c351ca8391fa1e5449ce55928e883236d65f60d009d243a139891a1305e218daab4cd6b84e535cac8cb9313889c5a833f271b2aeb6ccec99e7a48902fa3f8069f8df22e2594a1186f0e6c44b6f2c7283c569ea740e3b9f965c6b89225e691a366ccba2b965e768c2361fc9cd6df1fb232523cbad9632f80a59598eacffc8878a90a23455179051ab769854eb01007a5d1f629c9e9b4475fa3caeb6670557e843935ae4778dcf89c666beeea00189c54e8e3a70dbee1b3e2566df6fe0bc10811b7105d659d47b6ad14510ca542501af59801162c72b2280f4f921a0bd69fefcf3f63f0f88e245956f67a6443f3263c8be913a7c6d404da48ca97a0bf7ee6abd64120d56d8bec13d82cfcaa4004f934b6ea7a0bc119d30b91087356d1dafdcc492e1659ec0a2bd5e1c475803ebbafd4f9db29ec67da0451d8be454cc28a94e7987ccb9624162e23084e5a4b36e9956abc1b826a2a16e83ff40a0c278552eaf6ae88bcc9644e7d64b982aea997b8bd62d2c9d3585fb6cb61e9325e0def785acb678bc048bacb74e84b6955ed9aac81e0c547ce06ee14d3d2da0b84d44d6ad2a3218cf87876af09b734e3c6cc907c30b66e0ce17208b882ff0b6384229c1cc35259c6ff7238a2d7c31dea5fdeecb6340487c0d29e490e208a5540634c23338e01999b77e4e0d38a247e60192387e7fb66343cb2f79a89efa645def7a641672be2d1e230b8e20178a317f6cf02d8ae50d8db07a670846d37b1ae09df889d11206a678e2bfccdbac5a0c3814102c84773df043f141c76d85203c025e42339d2a020f43f854405ec284e6aab1acb2ec46ac8c6b1b3ddf0f02da83305c9477597fac751a4d5acff13b4c65ae1428a590a76c920871d24ff1f0d76a9d850db922ed21e204b435cbd26518411c3d6e4f311787040ea6a39828a003938132015819fb9466d3cb720f9d3421e0403a6fe24299ee08a3a4c5f8ad82a71c841a95acbf82b9ae84d4f96147d293977b80dd2750acf2935be331ff8a517e1e1823fb0c11c0d9cd5432c28b94d1eed377463996a0807861a68a70aeac6e8c0d20c21d760042e81a48a6a86170fe9b722184b6818da73072a2b15f3e6005dad252229ae214ec980c12bf614cfee5fc7777bae061db4a4c352a9bee02b0fd33932644df833d6e3455886d826eb5fe82a47cc71c65eca2e594d87bca9659eb5a8a754c74b927ce93752e2e522daee5a0daacf3512de983c3f70cc5bb7480f82ddeb0d80f28eb1f850dbb1ba7c1a63181dbc781a98fd20554f3c20fdb4de00804a916ef8080a6db7b01bedc3361bd8263321ea707d899f6b08fb0791de5cbca273782282209fe41fff535124a05376004f00ba4238584ec32f251334bab86375eef582721d4538a44a843545bd7098a0bb0ebad0cb1d1e3826d1f10691169f77c61c1b12eb683c749dac4c91a96bb18dcf71afa03fc8511ae611e00e8f472397dc7ede8b959b2e225c1ceb811ddf8edff74e7cfbba90079f706780803b142607f290d6e051813ced345610a6e1c1c7b4da4e162d060c38cec866f92b21f2c7b69cbb5245333420e0bbbb37b0aa1662e6a5fc81d4a2f68d216ba5f671c0a24da13608beca76a094e5c2f74608e41a97a820e1e378de5073b1238082984b8dd25da307665304f650586efaf37fae9de8c181c9c62232caf209bf322a2f9fd1a53c18ce53dd68ace9230832111358664d75a9e8229eaf7717841aa20150a008a1b3d556a1911c2d19b7f91fb11206fc52ec35b808c09f03f21479606c9b6a7733472bdc8cf2907441dc4e8d155ab026cd6a8ee5736a6d716559d84a53449bc3c58e02d3b9708cb9eaea0d7fc69ea52ee816e826baa86bab6bb0dc25e2bf9930e204369e4a21f208b366a98a51c9c1f68cddb29d35b77329127aefb1b7807a03c30239b27dcbbd40f299270e7c091cf5bb8caa81cdd79dde31df8bb92398e7a136a269fc205786f6c61894fe77ecab26023285cb0f8c46066eb9eef97641bbef707e669e7a4f7a4d3feaa3151a490cf401bb515f0eb73f42a842dd1572ef7172673bbdfdcf0b025c1849af38abeb8c5d54ef570f9d256f2b9cd90c08dfac6c2b6115cc0f5d2c64d383ca0eb54c23e1f1eb2bef842130c6093f58bd533b2147c6516a9dd813e5ef29a3b83f5bb91815ff15f2bb1314271cab0637cd0f3cc001de7e890d8a75bfad4fc1ef4f3a2ba6911dec3ec6e1a4487d0b761c2144aea12be720e8f5642a91c12e597fcca76e8b788bc3b5416d5ba451db5748e8af485eb884c6cd17061d61ff243aa3e6a37d5da9fccc7e74f67bb578247a08b071ef63b7952ca3e40979784220877a09d08a8c6e756905c836ab292e90bb9c4098de92d3e56e6ba2b3cedaf7f0f19bf17a42a599a626d69c44d2573b71297cfbd59decfc603ed29a3a6a2b2c2d7520e4f1055154b1e14055ea557eceaf38c3d6cb56875e027fb88fcd073fc97c9f60d8082726bde67c4610af24f7c21ff0840d005931d4a0e2c16af232f293fa00aa9dfd166cec107cf870faab86bca5ab1d43f1f2117d2dab02d67c900d1610e2ec5333ce260c2e48d925bf0f079bdde886acbea4c5da637bbb840274811cf26c7faf54be1db4a8fde65cbf4a92758e1822f4168b3d0ccc0345e1d09dba57f9d1bbd2f836dd80ee3afc80bae5e33c96286faec3c7a737e7e2feb52e5c8c82286fe2ea34ae106ab4bf163517d66f7aa188e6de54ea7eeb402d29ec95b004cf6c3bd326bd989a5b5d6f2517c4a4b5da3c2deb01e48454d512bf0dd86321b264a1fe74504612b36f69079c8c363a951573211470e6401836447430c245e8d6148da01326367b2058f3c374639676afb4e4ad5c9c5c5bfa03a873f5560857e409c367e8f5067bd8c7169a0ad0b7bf04503c009e99398ac56e8ec73b4f77037950de04a1b37a1bc4f3131e2174c8ce8038496e2a13f9ba07005e1484bc2184d448f590efd326bc3902893ce391ea6b21478be796782af78c01f8155adc48e746f09bdcbe346ae75bb234ecb80f6bb12d2b4f49bf8749132c430c87130227b880a86e2404cf692f281e4b37f213b5c9516066c02daf02038b21f27a07c5f747a68cc1f4f3791a7339fc9c975f820280e38bbfdd4ee54044cfc226c738022cd86728f5219773bd24ab827c3025065aabdfe86fa9fbadf1966fd7f32f4095a5918fd1c3d0e8f2826c6e6181f53ffa845e0e2ea97d18832c32d6b04e5719b2679dc1920a20297a2ea6e460e18bcb80adc74851ee850e9bb2c2d349368300a212aba0400cf12f649c67a7c6d0f61d45cef863a1bd04dd20051f6718b4eb45991223ce098d2bb341fdf09560d939760141c06dd919eea0578493aec0baa09ccf1d88acd6b0eb60cfa971214b661263618b162b25173474ae6b0ef9de5e388919b0a43c59a9a660b015837f4859d19be1560ce125e54441dacb863551b3aa7db6fd9b050d2388f943caf045333795a643947399726457ca46249f239fca0dbb3fa23b6881975393a40b3d15263e0301c9e0ace32d1b52b31443305f1f18f2450009a67b7bc8520dc534af5a49cb22a6a0b20a1b50c4c79552b905cbbf6ba9dcfa85679480a77e61f1dbc5d8574f3b233e091a866810b5b5359431f8681efa87015d540abe69a481704b2b604b4a7e0ab872b6bec5d6af119d863c273c1171f687a8eba551b0e23ff259633af5047e33123fa231f689743a639493c447ef4f1350c3723bd9e79b7e9a013c5b70b5b700cbe58215ff1604cff138383c9f83e79537e840ca36dec21e241adf34d04b5da8d1959d0462ed6f1215b898f9c1ebba78f1ba2596fc5851fbb6ec924ec2f99104933a7710edd90b5c9311562c026138acd74222e9119ea24bb08c7fcbe6544a96b6779032e3254c68725239f83ace4438e8220290fc70a31bb4fb7a4988e79c61a366a5a9f76df77563329d09731e7b4d63a19ddd2aa9e2cff2354a7225db970c3b2073219323cebad2aec72d8a8177d16c8f86698f30d2730014263c19f8a4e1405f25ca573797093c87a46c2d57979660bebb78fbc3b8b079eef5c3272feee8a6809b625d0bfcfc399119d48b384375347322ffbbd4a7ca81eb13136b05d30a63b30a26d6126298ffc89bb9014dadc2298732229cf9521b45ad32f917539abd144f620e0b2d8f4c3abcb76723e67cf72aee3c3afc9467aaccafd7e74f40ccd9a98c883cc0320b10734ea91be78586c9009158227e0973d28af5491d95f9f4d53f7a9ae729e57d3ed0d64750b4b8c2392557e473f212c281fb077d861f4009e90a7c0425c4a07b7d589cb7c7dd0b26c9fd50147fe96a1d9e09a68d6921581993598f8ac4a443217064768e1e8aad8b03f9e3691c83767b60eb2acf208d0f3a8f848740b90dffc319dc3b2f24dff738cb6bec8d7e994c5a3d083778fe5c90249b997310a36eb656d76e1db2db93cc3ca524639f52bec2b55061d61ce2d43a1ed187c6f6271c238cb830ba95e986a22ab55f4da82c2e87f76c11f5f065ec1a5081ad62eb2484daf60bfe46a932ec15940b4d1d6246251e14634d9920811166e98738074c28f34217873914dc913c86dbeb91069f10cabdcd3cc94ebe9f7436c6644f2561ec3042cdbb1d37b252d02a3c7f47756654ea84d666a614a2a05610219cf09e9ed2b13d801b0d629b9f447c81dbf4ed86e5441f254b523f9ed93f416908d89afd296c43b4de045ee36ae36cd69c40ca71d73adb7c2720ddb0741e290c87258e4151ac923a4d332fa16e5164636106171d38639cd1ad65160930ba5b0bd1a6ed73952db680eb85f313d1389b0877b0eccba71009a3818cfbbfb4115d75a5b422ecd0923c6c20851d8fdcccfae59b5f188176e7213dd84e4e56ea347d8f8e6e776dcc6acd72d1d4d99b343eb4adc71a50ee22778ee5876908e60159de5b343110b08b3c56ac2c8c8a688400fc4372bed0b7f652162ce5e7a0304428b0bed1021e5865d7b1647f57514afbf9ba0d7133c23c99c34322375d2867c4bf3026517006fb6abe1e66d00c5a4a6a2df7d95340f5636ad934abb505912ad8f5f5ff4852745c1527c50415309c184016293d04cdc31af7dc7c2c148fd401d0636ab9ab2f287f1f4e4f84d405c4d474cce9189f8982c00e2529349177266ee53b02e4b52273773bee56379b1d7855a4b50a90ff3b48add3831fd124ae6514a789da25f200346a0b0fd50fd9ad5f3e838edef6137b10356f459590a0fd6d977639937434920d8d3fb3d9b49d569933579992382a6cb0f603d86b5f95412d4d8fe286194b9822af40825b861341a4426173d93b1e3f493afadc02eaf33e8c133a67912e5b665b62fb833322e6351c411b9aa2500e91b4f1900e59aba51e546d5a15e67470b6e3f4623d03fdd0a7f7bd05ad31cabbc329dfc88170a7da97e4522062216f28ef19c93b8024ebc99745a2f846a9aa5a9738237e898598f5593c2a1711daab78bbbb49ccf2214b041746e6143d6c0f2e51ef2f63d1e8f9ae3ff5bdf4f7f07448e45765e5e458f4f4713df088fb82e67dbcbf16e23e240cc17c2bb6c1ca1871a494902a7658922bc0f2b4e2cb2c32a6e71034e4cf67136e3fd35a22951fe5683b8c4bda7e2b5506bb7a4a1abe96725e39e685f9889ddcd012340c7b64da8a9c39b16e2c0370b342a6f6d864c63c47244d4623ca066eb2a648369ddaed5172f8df7c58d64586b91ad469873179f836e341e2ba9457fe2237bb66e1e8a6e6b95a068e0a28d24002669fbc667f170880fad33dc72f4b0a0008dcbf514254517b5d0bffa08ca1f92865b7735569fbd4053cc8a467050b56254787b493e73b2b291a5794c95dc66a7a3c3ab406b6b8e6b4f0f4028abc44bdb44c3df047a036f15839c6c016ba50ca7e04f0b7c228de843364df9db92f890914ca25d58ad4bdf715309bb4cb91d4022d413d4af71321ef256f6875dd34317eb547c7789a864baaace326196fb5bff96979ab2e693f23621aa2610f1fd705dcb6df6397e60aae9b655779c125267eb07e783981143ba059a91429c5233bd7fd62cd65eaff270aad67415cd7ce90e578c8255064b18fbf665642f0badb4d0c0cd4b666f356916acdd5f25384603584522080c667676e31950fe23996c15d3a12a0d670f4820236833513ad198ed22305e5ba3b148f8389722d122d909397f604f4998621ed5f6da5b6fa079502a9d103376e16ed454d1e8c7eb1db80696f578dbcd61c425b810df751c9ea8b5d3dba84a231c23b2beef89a06b7714022f3327b38157b3b49f5d2f2ac90f9432b11d7bf30c2cdba302cb460eeb47d328d866840acc118a37e96dcbd40a49ed6e8d881036acea16a06975fd204f99a07b4027ad29912d661df7c7443da106699fd52d4a73c362c3237f4760218a8594b26c91ba8d0404b26d18d0b438a425d14f01f7807fd319a34ce39c64acf7dd789457eedcc051a29f03ba1e94371ee4571a9d3d939e9281465d8bcde9e86c751f8738c0e143c7ebf65ad21f09e0e18e712b81f7732dc364f070906ba968cd25db71f347ec3d9eda165d846498445592a1a814ebb01a065e9829e87661b0ae1738e8cc09340007ca7d25edd9c8009cdc1642e2182358394f55a52bfd3d4a401e11d49d896092323fe341f78b87416e2ccea28996e5a18e2487db581e4ef96bb0a58b2ee47c26a7671956ca6a01e7806776e1051b496896c0ba1068b4aaf1e30d705f6c25ed46e794251d74c56ddabed67fa41f518930cb9972dd6a477faabbde0e69d90eb3bb9d092db1a00a3a9589bc840130fd34c45d257527d29dac1e676bee00bb6269b030b3bb0ddb7493dbf44f002b2132ffc7bed0af3e019a7844040cfe6217fc224d19cc19e838f4f84126aab8e7ffab854bfec275874a1ae58026f155d3a85e86738ff73798c38793136003c19d903d270048e2f5236157b7f21536d12e960466fdd9626fffbfe514ae211359996ad375b219de5f4b138857c99098cb45ef89e4d87fb67cd86682b9ce736fdf7421ebd11cca9f7e2f1bf70b710081f459548512fe49699e92d8c46feae84ef1785fafa352eea4fdf197521417e4d8430bc1018b9606b977ec058e1020077dea42830a0d090e19458811e9b2a35ef67bc40df70d72a57d3385255c98a30b3d3e554a4226566180a4e5376397b7005a9754cac2e81986c3260440ec871f6fab77a39e45c7ff28e81325ff30524aca58025972bd5e4b5dee89fb0746de30b98b4b3c2e8713138bf70230f22c8faa222f9d14ddde049d28730724cbcfc092408e2115e642082fe17b88cd24b3571402ea1c6db6fe65f6b1a2581496205978a500a2aa09924eff0a4063c0c41fbfae630f034c82e5a9005f90bddd0e18e3725e0ed6c924ac77c54166855d9abe32962a1f09ef6b4772b7e48703aa8ec133393c08390ed1f3af22fbc92b0ef79b88addf691ebdec2894aa3719c238827696bbaf79b66d973895ba260a26adda8a8f31e0ff501436240dceed94189b14d55e0e4d1b9ced679a45c788fbcf69abac59378abeadc95f2d9a155db296d7e6482e539656067cc2b2525827b9f781a89ec921d74b2db005d963031f18551dba53c5ba05609c43440f0ae6b2db92f759ee3716953699634c30c489ce34ab4df084bce47e3af9176b5f146abd3ba0a6e837011ef3891b6e14302a468744f17b35fec283117dfe559729881b45403f9b1a0985607fe144398232b13c74de25dc2e5be320dd5f163194162db2108f1dff823d71242057b572018fc20c69111d73836a9291573aeed200471d43bc13b069c78b6877cffd5aa6f109acd8ff417842f172fafc457924c42fc31e27e249faf50dea285a92e1326a54b5a1686b8cdc149d10bf613c7c5d9f95aa05bec095be6f37eba3aadbce7ca55fba21cdb6dc0367cca7390b4e200fb15ae1d68eeb104370531118bffb53857ef84d6501800656313bbd02ace3f936cd84e7d6db9a723bd4b205233ee71ced7ec72c6380849d25d2d1b18cf1abcb9fd30f5282e625ec5119b6a7e571112986145e9ce4c8ac239c285eac368f0915fd6b5e4ac6d35f409cbc02050163ac8ab6d121e128faebe0978c2d30661889eb2eb8cb472ce7b4b4b5098651c53cd62d77cb49df359ff5e3adf249be8793d52c3ea612ad0cfb42403ea7f168859308a69351d0049b4d61120f028c0e2c475a2940ca8d7c65416aeff140d8479bb2b081ae0302b62fc4b8cfa70e03a0c1c068e358cb87f116f60825ec7fc141b9d4204f446301f99f207dfaf5a137f5bdb7b77935b6e29a59401280864097a08667290503263a38a04ac8b9ef2caf8293306c6fbd240f738db3156a02ea7fb502377efbd63b6fe5eaebff7ee1a1a74c11b9335c6ea2b9792f2c2f83c0dbbf3a7be7ec3ca7cad8e8511036327ecc7958db0116c84cdb011765565238cc50b1b39ac85b02299053254c884594a7b63bd30f329afd7420f078f0748367edff7c9c239a519100443710b8f97442693c9c4911704004f7962068dfe9427260de9e1294fccd76c2449929cd19e7e15a3f535517c15751007b22622b5d52b8713786444e0915981f57c70ce7c6dcc171004b58c27a66b8c95312b8c01f2352ad3e1ecd6147af0588ad824020d5c130d1d0aae720c8ba1556794d5e9a64562b276db1118186480e1a205868916981c60b09af054a5481f07de7ac5f5b31c34e1a9a9e720572a016ec26f474bde0eec675771ff93f27aa135d5e53ec4093f9bd3e53edcef0b44fb94ee56f3f8b1ebb12a317dc9231662fc42c60a873587a7bc2f53be2801cb78707fe29e1ec9433e1ff8c6fd22e34b9595972d2a5c9355f612c78bd89f39309d824871676e031db5d84b16180f0d74df74b5e129cf4b112f4198e0dc45ec853936eebdba89c558b349d52f188cbf57031c52138b922675e992a7cbd89f351a4d2b705cd458659b1f3109b291f9be602d978b142b5b363d7371c14ae9dbd2c6c62408c43de571b9c105cb851886c28e5fed875f30c325ce5312dbde4bbc990295f44f9c7e3a527678cadb52e7f153de96387fda943001d2f295658b96193e6bf97399fce0b494d102f6a58f4ec8a9d76c478e438220f741a794d32931a170800448726c2c6bb62347aa693d966051beea0a353d96f7c6508279c4a7cb7b63c07a2c7569f3efda3a88623d9635db919ba5cd91723aad4d804024c750a61d87449a54973647cae99464d7da16a82e6df8da7a67c457afdc1179c4a7ad187d43883392ead2e648399d1253185619118e9069307f5e5d973647cad7c6e065f1daf2d6cbd908da0872c4386244384236428f0047e4119f53cfcd4c72346d3749974da68be22661bf4f3e6951ea5a0b46a4963ab5617921c2153b38705270952bbd2b5c5668d917006c38db911f394e89898445aa56664dba4420648e18a38eca9316a18e4aa0aca3b207d451019db879107482e7415047451b3de55d59e1f353de152e9a1ef156bdc31ffd67deeabea9a8af9df2aaa0f95a07bdf9eb62dd7444a635e5755c454cab9d5dd1b3e9e18a8ccf804c999ff2ac5cf9d04193ab488b34916340222586a71429747d33bdb373f7b22856b8bc6892b035df99e8d934f2f3e2be35e1df2708142859a4af9b0153ca0eff999457e54b33804e7996650e5b6ba37f35b048d55d9ce2576b2710a1acd33fc13fa9d056a1813fa5fe560cd427385c15252f72badc87b1ca112b9c14ac1b6b4755705489f1270e0b12bf28a5390ea36d2c6b4ec00c8248d50c160351003d67912a0882590a489f3f28c40964a50aeb859b3532b0e8534589d612e864cb8320cf899707c507c7131e0441262ab85a396add583b12f4a5dae88d8650b249d5992a08b7d689971796677a026610dc36b748726c589b6732344010890904410d52e9f220086a80cb4c5270fef0b53826284c52c6fee8298fca0aafe1298fcad69f39b06f10151a52c4665fbd224150a3e4f95a675504f50cc0c74c5fa5f6d36bafbd4e25719ba41d8455894f741b22a7b3eba39af6230b82742d9ad422912efa584973e6f5b1b5b666e055e27bf1ecf2a26cfde920b46b4a85c982f86278fde5f5da717afc3cdce4756cce4c13e153e8d7ac4fdb9814fd135de98ae276bd3180517e8ead89018cf2bac5e90d45c1f21e6bad084b9224d8f7913967046403586b29bedfa518638ab7b6d46add7baf8bb85d30c6780a0681ab6ef8d57507e5b5b592506bad52643259962c0cc3adeb3aac135451acf8abb5d68a71ad9f78bbc0c7188b96a7b5a634a96e19adf55aeb28a2fa2b59175f565f4fbf5e7c7dbdd07aded7d4531e94a93f69bc2761b0e3ef53b1c37afefcf0a658cafadf7510045d6bd0caf928d8d4d4940b8c41e092022b5fb27ee211d6fafd0e500b70e2b7b63ec1b7b45eab5405a1da3a43a416d70e3c3c06a4744c516cd48dba3da62838982cb1fadc539e0b61cfa4c813e029af053d633f7e91875f8fbd96fc019ef2bca6be09589322bc26622f7e754b654e7f24c9289b159e35c9eb8db7cfc813e28724698228c434746b95359225aac51629a4444e35b82886fbc4e5e31abac6d5f5c5503307e1f106adad15f6ab37dc1a6e3861b334847b56abf5999f759f3834cff243506a074288cf0ffe43cbe34fd0b50945e4207c35cffba163b2e9fe0d41d7a16babf52788ef89d33e9187a076f03af69da4bcd84f4ce4441e9a67bd1c7cc305b36aebbecddc691734855e3dc4aa22aae37dedd713d44e44234d1479dd50d5897c56649ef575cdad0c1de210bb1612da6714499a081d0a6b1fc913e387ee779f1a8b6409f26726fdfcb57ac56fcdfa9508eb4307491344d56d26e91cccd23798421e9ae0e844267d6b6591c0da1eaa435af4a1a15a75d532aa88b3bef68a9fe63307691b2a74eda4d35cac24e933d2dcba3e891e0e793545d743fb26f3ea9ecb3003af320a3f19755ffb8c7421b334b145a2ed33ea9eb5cbc4593ff2c498ed3ea3f0a9eb3e674eba25ddcaa822e8938ec91264d68fdfcbf2cb4e0f5e3c39f0a2286e8dbf497cbdad8c2a0198ab5522394c577038a62a18e398ac6ca0ab35ac981699215256ff5c366a2d68caeab5726849096575f0c8d6c2102f65759c173de5b51003abac0e01521f3965c51f7235365565f54b81aee6e54b59dd925082d28549c911136ab0a44031c4e34a19018bf4b903945c7519534e4002694c8c6960913eaf000b322c89a2c5904685b27e1aa0c52002e54335b5818b56e9018e6f3714d9174097f2c6804624ef0f906ed27dda53d2ffc0a66f12c5bd3645bee8698f8d9849e4439180199f7f4e97bebd43ba49f6694f597f57de24ea37145449286e299ce6ad7493ac7f9e8019e54db27489ab9ab7a7ad6bddb7a77b2362e54b9f7f1b04ae0db057fffe1e809644a640c8fe1de08cb2ff443714f56b9d2e89954c517e7b8a0b3b084b5cd7e6294cbfe4fb4207ae952faf90829d7c5d4ac02b654e0541d0c7d2820041a7252508d6ea60fcb5d1383bc68e339e401b3a4dbc8e74b5e942811677ec8c70644d921682c21e1484666cf32008964c4abc844bc7708838a1900315f99c8c9ce0d495c32985f23ee501ba01011220acaf11280b108f405b9f0305713252d27ff327cf9f37607427e0fe18f1e3c29f335645fe58f9e34524882e081faa196ad8bef4a7f96001b5909252d9248a85811f2dd0fce027881f238fd960ec87c7633f5b785c438794f42bc541c0e7cbc627071fad3f6d5f68aa3d8dbee829870d445fd3f05488f4b3a4d1fc9c3d9d40c8a99fe4906bd050abd7219396248d606656274731946970c357cf1cbebacddebebad450bd2894a140c9db4363cf1e1e58c79e365957c79e3056c71e2c58381d4774e8d8b3952bae8d7af2ec692103a703eb59a327ec4f5c933c5a60d83c535ee481429547c99f3930219f1e2c79c2e011444389049e37376c78bedc70d281c70a96930e0ce6f99127ebcfdc8e1c383c5932f0c0e30563043c27e0d9ba21e3af8f314c50820947e0f47a70697900943d2368c93023c4c797311a2ec660bc18a3aa9aed916105a9c60259eee0e14166861d49340801cf1e372da448d1f2854989849d3b2eecbcb9b2830646ef05a9e54bf2699045c98f332990f112010ba9d292c29617805ca1a3f58c5f96f0eb8c1a11060a7ac4e1f1e60915a016940d0c5763a6e88191a5048c9d2458764c50e1031bba187b8061e6825fc6f9bbf8de81f257e8ef884ddc1ec514b0028f8c215d5338bcf0ec5c1d408e083ce0b4b9e2076cc9edacc87d012b659851c24043d7e952037705250b7755e7080ddc15aed3e3cf5c3652e7c68b3a35a89caeea50ddb11abbc14268c27807c7e33b43ee9846e764a5879ef2e8c840670d17cee985aeccd56a3a73827c7478326c7b74a22acf1127d1a1a3029d227fe2d2ca706a81cb7d78aa41d828cdac4b2225156037bd4926e9593bcdac4b3313ba9266e8b4baa42dd0dab1197ace321fcdf22894edd12245dd77701b4dcde16113f32de7af68ecfe7507f0f92b76a7b0fe1cc92d3941ae9ca93bde9b3f8c33f3d72140c4c8595a3fcbeb35bfa2cd611ad0bc386151370436adf012f66ba62897f079fdd614fedd2a684f04db3123961d5d5e7396b8f13365880cd7d51db12f7764f0e812c70530c3117b53c769051139348680d9b8b174da3e0e0ab4710c911f5853cac8f1c2829ea5bccfda9f12bc0278ca8be302cea04aed1dfdd45aeb8daa6f377629f7c3a576cd9618c2723808de84bd09f367ee48296651a1947d5179e38257293ee5bd49e14fdb58e5842542fe1c9bac6cfd691bb1ecf873b4a570e34fdb3885c69fa36d05ac3f6d63d78b3f471bd71b167fdac61602fd39dab2f0f9d336ba80e7cfd1c6a5ce9fb6d10b9c3f479b94357fdac6af347f8e362664feb48d5bc4fc39da9080fd691b9f74e0cfd116c5ca9fb6112cca9fa3ad49f979fd691b9d2cf973b44149f2a76d4cd2f5e768eb80913f6de395227f8e362541feb48d5db6fe1c6d5a78fc691b59c0f1e7d8f4821bad1fad9b2caad18efa48c5e14c2d2bc6a6194c8a65c537cd509ee38fa695154d3394d6a935299515d482f88c7006bcf2faf5cf7393ff75ffebb566b244edf39d32ff3cbcf7f3e75aab8add7f0e9ed53120f55706b201e466ea4fdb1a3ebc3563d7de3bab8d4d7b4a99acee13ea7a7587ba7e6534820a6630676fc250178f57d308a890263c78707874f408831aee0346b60d99760b85661d3c901f916b59e550d68aacb8c1d00663cd01305a846d8d00088e20307a449842a3a5ca46d81876458819356eb8c040a200ae213ae6a440e76a47cf07fe92c5c79f307d786409538444869e1867ae005df16a8f8a913333b4a8d1228805b87c8159e9f9fa73430cd1043702a1b0429609417a1704a9d38351e38a8e3f61ca4140c664a18ac1220ad70362c0d123060923648d81f10146d045a3cc113660ba4c6831070715921e566ad4f9728db4b6a848c983644e9701783c7eec90c14b1e3a5e7a70a06b50381227ce951156644dd0b3b1a6cd9c2c3ab2807578c2820a2d64b893b5e78d01c64c8561632584333dba64ae376d90d8b0c282338856315205c38e232fbcacbce0c126a408a030535db0e294c0a5c58d205df4d0a1c1c5640200263e8e30f0e5042b429cf829b34304096964882226479a295b7a68c87205c9972871568c99f005cc980d1a6239dab8e9c00fb2ca70e1020f95979e370308240647a0155880e1444b8f210d4d90ccf011274a0c217642289205c78c1c62c464916199495d8dd0012e1673ba58397380291750c85123cd982157429a67889733488a8085a06343921472784d1149c18a95cd44acb2819664461b292bc431c1c7d71f357bd870c942634545688a0f8f408b313c884859c306cc07ad1a33ac80a4469127527ad89c0c92c2c29031557a4f3288c2e7ab0a989217b444f1f195a0a3cc95ae2654e808eac1c5470b3c364db4827cfdb019a8a2c42a899a11b2aa48cd10abbaa21a41498f0e141f9a466122d6820c2190996243d300116302551e2980d83cf971937ac142cc9dad15e8102961cb40c2571a2f5780c0718263421bcf8041f2c29229407248364576d40864670d1aaf1e46032873020c5c704a18244747d599de9b1e42d274357980035c584c413921ce9a315240ae6c2122468e9729515c0800131f454d7a928c4084aa6bcc0e231168c1841b6d50c81243d7b8a4294f0f18a888817dd1aab11a23ffd99c4e0776d50cf9efabbafc308861cb5a3538fecba07f6e7322e5e767eec3b7756ac26e1205cd516a2b89086150e8b3c29a3f4ba7ed3f3562ffa9a143fe931a61b6a684d4f15afa5af8effb7491927e4ea726cb71308ce1c110467f1df9ee77bfef9321e1ef437a2adad266851d27128df3d569755ddd362a19a21b820302e4cc9619ae4c822c6179d0ac10124c625b59ac881896ef86c8dd1c9a2b0d423ee8d27ce1325daed418a20296913020560c2a807932c38b491a2c609a2efa6ea519bb4af60c9fb1acd9a8102634603789ea124d180f0d9ac7b80629cb1a0669b26e12fd4fbf65b2213038337693e8df8b7b4aa1a46758f8ef29ef4cd79f38293f7ee8be7ab12d2346668e19126424603327dc9185adfbe97e2d325b54b0f4c1032e3a9fa231a337477edd8add1056ee37bfbeeb91d646e5251d3f5942e642e6595f48030f6ab85ecd53ea654f86d8b5a84b5c433e245ab36637072906e0454e8fdcc3007607bb73907e9d3991cf6a33dfe033df706b9a79cd675ef3a36d734a96e0e04ad6669e1afcac63509f7fd9ad596472e1cd418a22f7e0293a78111707296e5ee41db687bd3f28dabb22bf1d6dd0adf965134a4505830609fa5b1391874e54c4c15451bfee5b53e81b3cf40d5b4515f2d2894c15b529f49a875ed3b0a3eecb1ce9696ec36e0831300960b9c04dba5eb4775c298afcc8efd1ded5ac0a003fa9181d0bc09200bc7a9179e4d54c51e4477b677a911b993ba925a3232f720c8eb63fa06eddb6d32523a57b333fa85d198ca137c968d7afda657a911f7dad64be97fa4a367d0f3087aa9129b5b4cf99cb7675d285caddc1fd13e96966537ed20560d6005cc79955ec265d078059dfdca4ebe636e94d3a35f0e759c140f384aa3bea9e750c070e1c76cc83dfa31bc2e8e6b7c8afcf444a976e5ee54e6f523d3277475ee56eba91b933f22af70e451eac8adcaac8cd4defcdb42ada5c78aba8e0f1691f4a740a7643d8254bc0a05a54b074e41dfcdbd48bfcb6b33ada1f3ce074c9c83df868cd0ef28fac17eb486f882af7a3cfa6bb54974b3f00fdd7120b82f67e785179bf213eb8f99107a74e731dfc68fb91dffc2c3d28dda4eb1efcc8cfdc98a28de2265dcf804949978cfc03108cbcc39e32f2222f720f37f3c8d4a402e892116902ffb7cfaba28217ddcd16152c3de01e76d503de61d39b947d043707f63fbfedaa07dc688f550f78d1a6e38eba2f6e220f6c0f8adc2e09f7a96dd78bf6d9417ed765696f14bca188dc1cea73faf595b4808807f4265928221e18f9f775e447db66daa917b149bffe667a406fd2cdf4c0c8c54aa230da7aea8d767993be9e9225501479d1b69976eaef144d6a832d42227ed51ddb10aeb170231eeb4a97ac2bca33877d1879dbdbd27aeb1f282087884f551f919e0f1ed84570501f530a8203fb9f7f379bd466b2a97e6413bef7f2c05eb4db64f729f5d552ecd73f87fa76f974024c23b021d4daeba1f5b82308ace3226f5ddb51863f478cfdfcb010b548d422551c42982f187c9ebab6e4f7f9b5202a79c1f50f04c67e9b30d2f979bece81ef71935bbd4adaf381d5843f9cc90b8eaa04d633f9b4a23caa75027b6dce2e9c043905a25f6bbdf52d69dd4e6f47584fc79a1e8f29164e7e7a3b04b170f253abd9768ced78f3678d86531fa73d55ba040b75b90f62c62fa7cb7dd06d690a46c8181e5e991462c090a348eee5383286078f1d536d7e086231de293b106ac72498724c91253ead9fc4b838ba6e122df129dd21386620c124a6afc62103e3068c50e4fb7a225895b29d9b217703cb0d30124a37c46eb029b1eb1b61df8d333aa76b8008531e9a38ad2c5a5a66695d6275b1f6741879b18e79fede7b2dc677f772783dae1e8835f2de59590afd776da538cf6e4d1c3c0a3dad203d1b2b6459fd2e56d251a0f5e4af63a5eba78e826cbb4f3edd0d41226f2dafbf2142bf2466286998f7119f2312944a0e02edf789d00c32f006312983b5b5d4a7ca0b5a7d4e40624584a533a7e5826dd2d36af2d6b5236925a9c1c85f0d311a754c08753b663aa7311b367a36703cc6638f31761ad3444f7b3504d518fbb3c477ece8f247732f2bc7e78c8bb39ff666cc3083ce9f3814c0ca4fdf4c0347161135a34ece876994798c69a4798c31c6ba9cbb8c3a2739b6a75124a4a1c23f60afe8e48054c0cca09299c0d1c1994125c3c60c282c9cdcf46628717253abd98c9ef666f078fdb43743ebcf1a8d36b83c633d2cb1a75866e80c1d0c32ac704f06960e06dad31e16974031f8c4a0c2ca4295d37d705293eb614da91a9dd46010004f7b585b5f3eed6165fd894b410c27a6b360a526a1c44480337a960ce292e10b9a0d98308707902d2c2340ee7c7bc8718e2e4c9a215d183153b42e8c5507422b1664ba30faca2b84375853606e4fa5570c653dcb40994ccb340882206882aedd6e4d7e6ede9e30d487da6f6128f3a34b01d387325dbb6ebb5a6ba8ec18f3cab3fca3bf51f6f3b620b0b5db29c864c4271cf8816006f3f77ddf87b1fe4cd1494c591fdf5d5a24ca13bf7a30eefc898341055f0ce7de7bab29f594acf673e2e58a852b2460ec0b575d5727bcb1d545892d92904871a36982beee40598a55c416e7a7ecdabf5a6bcd97da3bfb2c98535624088ecadacd39677aefec73257babe06eba649cbedc7bedd4d4d454941df3e50b18a73060a5665222f1624608174cef45d51518415660f2c000033eed55d169a157c5c2d58fab21547854f1f1d5e388981120516408a9d3260a982b19e1150e7094334bf3a5e9879cce6aeb85112b2955e44ce942c7861b2448fae800b3070f9222564fbeab16e218278c55d767354587a9f2f2e4d35e15952b250c4fa97f92896ecdb3be95faec779fe33deb537ed182396576fa15ccd35e08605f710f86d708e7f195d763c7f7de9b7706434a3ffc0216374e59aee8ae9060aaeafac65c25268c8d24d1d3674d0a4b88c0f10143903e3aaa9c003a5243ebd830bed165a99a027b552f445d163e1810cea2f3d8c40696c5d409d9c83ee4ae19191b1995123079cccd8205ecb9e8a2cba2f157b18eaaab0a4b112b2c56583d2a1d3d174b7a5457403c964e5a7a54547fe67239877b54538f31c6383b61c9dbcd5bd9f983e5ce955e921796cef2eda0b773d2bc28e2048d0a76bacafcb4d7a2cf08070a0e8aaeb782cf0b3dedad705162fd61fdf5588085df1705cc26d106b408d3a089698b5e0b3aff7ddf57035860d9f0b4c722c67f4f7b2cacfeb415e9ad9872d1e78553133bbda9ae41507a536a623429e9db9ef6a6b4f4a6beb25c68a1850f3a0a046d05e242328805a7154aa1a7bc41415428cba7bc415a1020090a2488cf9f4840c49bfdd6b489e40d02d706d42f17f6dc8d3afd4b6f4f17db038839ef1d1738056eaeea79fbadf7f3fb5403e563a716c428ead067d92fcdc4fe912566b8745c96a318ca6cb596566f0d9a533d96355bc5fd679eb86a6a07c91263d6d8b3ed2bcdd3bfd41ace1a08a2a122afb9cdc922d3a6a3ee131d346890cdc4cf61039169b3486659d2489ad3669e7f34f18b269599f4c1efc3b6fad9d900875d87363d92a2d88fa0188632d9e7e0a8a194a34502829f9e7c3068d0202c38a9dc4067a784d413044160ff3006ea832e1a3549e02f0427ae50d8eb49c37c751416091cad0975dd82bbb71209a6263ac18c4e503feb41bf3d55076b387c4464eac1de90b19789df58431ff24f9b1e41583367aeaf8b66e9a159f31325664e9e68519764a336453dda7d4abdb84f8c7d1636c91c43cd5ce635f39c79e81acc73e6d987cc53ea8299cb662ed246902c714d4cc53c52b209f45b5da8f46b9ea45fed59932740d79b3c2173f2047671864d501a41986bfbf624faec9a54948de7dd43f5ba062702c913e0751c112b4a0b706acf4e249a34d7609e43fb94faa82a6442cdbc7e69429116483d8dc82cc913e01e77f52bcac6914e508394b44764eb3150bf249da4a054d2444996c015e3bf6f5fd729910315746c6aeaa3865ef41b35be7881e74045056f6904328fca1f9a1c841e954f48e0557878eda1a9a282af34029953d2490a825c426326a5a71402f18e778321798ba05a60ff3e08554a832579b57e5b8fc9b12150043de37befbd77e74a92266af9e6ec78cc82a89e7d244b644c96c0a41799a5e79aee86a0456ebb1d3dd0c12d6981cc56f7e9779f489ff729c17f2e8a325114c5286a248a32997b158d8cbc4e15217a8df270c2689ff6b42fc3631df62981d803fb441a73b44ff772dba72d8b4d57b473cebbda53830f35cb3c2a834e4aed6ead1703fa9374d084aa39089fafe8f84907afe33c7f9255ac39071274528fe592cca25a5df47abdee33f762f5d3ba11a3dfe76701be9235aff935ab79cab668bbc056bfdb779435aa456e0fcc88dc37345dcf9ef39c2a227bdd623e8f9c04bd66d24813b5e633f204b8c17d9f1278d81dc6ee03fbb6edce4e56ebb7a37df1935e9a943451fa58eb2e375c279a5d1fafd36ef6db3e734fba0665df1be53732e9cb7276b1cacc9c8d6ae49ccf0e92266a2e3a695e57ba4566e93653c83998a0d788cc994933a9ee8670ff24f853a7211cf24a9ad0a5d3cf8724404272bb4fb7919f06915c3354c90d15bacc6b9d2aa2965f362c37179e1a7ca82ecab6e8a7ccbaa82174d9c675ec0fed9b76d0b35fe07e12488084e46eb3956345c6649e3f3ce9a7061f9ee63392e6d54f6c91766952d204e950b47d56903c313ee9b5c8fd72bdfffcdba7061f729fc93d6e5ca74a901dd7a922281e1365611886a10cd7f98eaa0f0ab2e5fd69af843941bc3ef7b41704eb4b30f30478da23c148901f5f3be8737a4292f48450f58298e909d17af3fa85b259ba288a3350ac1b388420cdb1e3907e08d63716448803832128826005c10ad6d1417890925da15fb0466e5da1481f871cdca77db2b6cf28fba09f600541bca1481f1d74300cc11c8279fecc8e4d281aa85d04c1da5545808eeb9c1c6a1acd41acfd243df453d737a10ef729ee287b923bca3e080e35d1ce2810f44a5e30560ff7599f74d03ca3f06d74ec190441afd843af62a1d6279167ec3493469ad0349fe10afa49b46b18d418d71ae8501a8358147190e368d2274972a4553113340f3d9bd53598a20f6df06b7270d0ccf46b9745ca5e9ae158cb5ac7524d1591b396e91d7abe21ae8761c55b6799975e655eee9b769a67d0f348dba467179d8349a3ed330acf32b9c7aa06f4d145faa25735550415dfbc89bf2c93c95c26dbfa75de1a8e3cd978a2f1444347956cddf227adf21cc71a095a5b5b9884207acca37baa51d23fc747c2f930f263ce160f35628d235c2d62bbd72ed12f4c96b50c827b97f76e377a06fdf314420ebaf825fa6cd73171ef3e9acb66fe79ce2e7a0a0d9e7ddce0a3872091832e24e443bb7e098db2dde829b47f3e1bf299d3b290d35cc306a2dade6998cd2430baa6f99050b977b4bd1bf74e147df4998cdcbb5194e90fcca1cce952ce59a6c1fc6990aa16bc23529ca84b290df483cf5384bbdd2713fb44ff1ce7ece157e8e4ae63e1de61ae1433d7a0a7201dfbf779e82986fc73b18bc84597ed1435cf5ecabc74a15dbfee2eebbd03f76e173ac62e7a0ad0b1935b424efa6c57b09b34b477d9879c68d7f6ee730d7b37b477b3bd23c14809dc24ae14da4507f70ef4990bedbab5c34edbbb59b877bbafd04527378a1d570aede3de897ba7b4cb8b77fe647bec2bcb9613ebaa53a50603eb563ee91876baf46d2d06ee122c6f7d93be4db11d92aa56b710e90d01d21b02fbfdac3577dab3d714a0e7bd035da7b89ef72efbe59265d0efde9537c9eeb864ce8502ef5d5dc25c32a7648aebdfde5199b9d337e9665b0521fd58f396666d68922ed29cead2eda5f9e80ba0f93873d117307391f4d017407ae852370cb4cb7c017a5bd5a521a1d267a55755b03473d2a4b2aa4b33afaa6069c8c54b5e1f32b55f33c590ebbd237dc82f59c912a4f6a1bd1b32694ed27cc6759df4d9de913e64ea68e68eeb3a178a72efea529982e6427be729665eee1dd2d38bd2ba1d7d16ba3665db45b7e25251c1432d81f7eef346dd5cf5ed0e96ceec797700fe47e4eab4075aeff2267dbd884714da175097747993aade760abc225e29ad71d83492ee5693aaea924f52389c1da844acf76549ea948208000000042316000028100a08842291204792385bb60714800d81ba3a5444140923811cc7411083310cc4300c020c200018830832c84993560010c888823999fe157f5e5dfdbe04bc4d1661cfe86d00c4d34434681f1ccd230431bcc75314adca758d6be05d51e801904d9ea4b392175b54b05e5d54283fa78b77f8555f0a360fbe54afe8aabc4e0dd36ace4866a77978ba9d6ea9ab71d1468e9af14307ff7873a506ae5cdd1caa28aaf2301d7d289df50106050b89caa874e4b8e8f29cabdee768d0c4a56859825c88f9a8171b5e3330ee65f72663d8ff83dcbfe43bca0fc4fb1039b85adf13adfc160fe14da62d8a2f5c6cfe0e0e52c9e6e0c8c479065a045f641ec3525b8933962c1260d442fdcd759227560f1ad2eae72a75852188065c2a28765c7b8b0e515ee9e40e12e7071dc88425b67958b2ee7d98eabc83313e8686f1510e00b5e0a92e491146d6730d677708cb09768d526ad83f881a395be7afed71484d774a1fe404b11d4a92a1245179bdc491b5afef7d80e8c4453ed682f2c00c75afe2d18c559207a045a8517b389a5d5f1b0dd5fd8db89d9d12823feed4a7d62d5d9b9621502968061a7a604cbb269591baa23ad261054e612053103b26850ced7323e962bea3b8764ca6611d3eaaa04103308e3bae821c1b1f5729f1f96bc08baf03b34251c90898da4732596b61abdff155e8b3cd715b1922ec187f58a5c49bdf9cff8b092e61f494f875b92fa3ea13e5e417f7ab25283be8f070a632f28e81f598d20d08bdaacf9a6a6c5022373562ec33c415d6b3d4b5fee547d8a30d6a92e8636242ccbb60aa6dfaa9a52991f521065d1482f4802dc24523247a4358f3cbd9ae89219813ac3ddefe0e4c0e654074facb3a26e8ee08719d976437ec724075fb8c069b2dcc6cff0816ae3689433ba379a51c8152917a29e26317a0b52dc8782119b77f6b5d783377dd591374c307d4f0c41c367ac5ca40fee414499f109633f48394df1f082d18afa974a266b818bf567e0739668a2f0557a17ed02d3dbc69b155ac46f7467eca06911e77541d8e6cd15d5064f80613aa3fd2e7edb1b2673b6ad885dcc177a5d5ab3451eb971fb577d0c47f89c7b15f43f924314619a3a977271d8d9ea3a44ac307d218bceb55efd7f0464bd006c35244fcac360219dbd2150926e3fad649701f6313d3fb3e72810a0868b8b7720bd0441f2fb88e229a1b3c54a281039fc6397cfde52c9cd40082490113040f48e64ef489a595b099b79afdbfa612f9f30c3f9f73d6f39e1a66cc2ac94e1b0c007b0ddc90282f9d7273bf2e068192a3445f69f81d15c2995a1a9256bfb1304c7e1d2ce41ae4b6c23a07c08e2ba97109056a847c6a8ac5eb2b28fcf56fbfed41da3a6f6e3d21e1d08dcb7deaa759e256e9db7516555230ddb54a9ada989eacbbe65826de75a1ef9b42a793478f756e0dd7d8bcc1b7d72eb85f4d5882e8f0aa08ee72f88177043a4ed857248c55fa5831fa0947b2d647b5871a7cfe3ff376d23f52ee13d88f63d2da8632926f3a84beecb67ba66ff23c34d07480ec53f162665b04a27c109f10029f7209d6ffe2d72a7c90ad06024ba392596ad14d733ca13f0fb6348e4c2e4edbf4f4bbf3870019760bb5cb0e814070b5f9cd52da491b103660d88a7308fae60005470993fa06480497940aefc4044ac49df5776baf7af0818a1c150caf6cc7b7694cf639b10664f143de8fb41823c2b670e808c5a05cd408b2694339c0509655d8e5fe94908b716740ba6937c79ee2e3b8b5b385a58a1bf108ee34cdab7c0def36d65d534031dc3fb52c5bb13a8c85911f4be1b2ef7341ca8f6ab8bd9c2f7fa6610c933ca3439c159ade413ff63758e81e93dbf436bdced6befa7e6780cd0a65e3e334dca9c66a4ed01b529f92bf7b05198b99a2084fb166e8abb90e768f815b5b307d38f95db4694bff5b2fa0256b5e73356270939e06ac52fb4fe63d7f3e49b5e4e869240f80785b9da92a69896e18daf2daaf84c9b60fdc107ee527293b50ad5b95e213c85b291bc4850e645c44adc9c25568d0efc1e863e9087df44566471b9dbacfb20fd28034d5b886e723b019cb3e0ac9f4af968fc32995088982a19223c2d7a2dd339236c4d5a814ab02ecba304ed16621c9f159af0355e662d93383a58c67dc1559c387d93c3918c7a4fb86150d6263c48ed730339f0febb56bf820913004a46bcc404f4a4eb559054fb7ab77d4c130ef079a13a629870bfbdfc567e617400ea5ced037f3fe997591808f55f1f4dc0bfcad98193f448fc6f71fe84d819314a497e2eef0a9b3d96de8ac4ee998b1d8bd9747e83f3afc1f29beb5ab96fb25ad470b93fafe752c6e940ce9842971a1e8093c88a81a919b3b2c7a1cba435844a6b95a943b7fc21121f7cd0201a276a59fe94cc776397f731997a0096d5e1a7d5338050103b10d854ac2602eda101024d13facc3c994bd1865c2389e4e49c6c0e8b727f98237da6ba40fb2758a782151926c572f5c48772399fd918ad5d5cf97206e7f7901f3d8345758fcc36513ae1b92b13740f6b477bb91aa61c90f9cb2b9930a9ba9c6689925592549e7730dc6b60964ffa251e5f2a794269c49cf87d3d261abe3e01dc6a8d077811b61f0406d84509d64cc73dcd5b2ab0cc3705fc3dbbde56a207a9b4978eb4b4335a158dd0f4231d44bcabf2c4cb4c8381d47ce072aef75d14d47b76ef224e4f9d4239b87e8b019cfdda778380876783af519787f77ee88220cfb3201764f69d2a16347638500968991e5818a4376c3d5a9bc35cf2c4906311b136555eb8cef94e40c8db848f91f4b2f6737bc8ebfe920d72182aa43ee76b0007558a5f66ad4ee4245d85f0af8ea1299d4c8794399c3948d310986b4ed51032e04097dd001ff4745fe28659baec15a773686d239269015e61c801300bc7b47d692cb28b7d7de83e48942e75d0e660ecd59fd26520362972ebace1c28f7c11b2383ff82677f2922023a2487c9ba3cb6d9b11bebe514e09bff1beb572287750ed8bee28c84b7fc890d237fb7cea1a288e2b96cf9f1c217e079ef858a094eea750f42620ea736644ba0c78947c5ca07aec61de570437da366cab29f497014a6821b32ada8fcc597cefa933f25105bdce870abdf10f0a67d5e4b777f13c8af55f929eeefa1cc560cc0f7be536efea6e0f2c388185a22b3097047f7d262e1bf3cb9f9117528117e0b48831d7128929d2ec712e295b2cdf513c3ad818307a82a6ddf96920f9a0bd3e3572c3dba08af52f7e27cb7df6d7393c7fb9812e6c254f2ebdfa498a913334e4f285a5b228dbef0074f80bd812b31f7d5a26e6e496d9fe34aecf1c8fe6d4d3807aba3d9e3be5fc5bc688969850f88f2624ffbe77041aa4bc2c45920a6b4f0a4c4be2627970e54a48527fbb1676cf6fd07c4aadc8f7961b34c06e4444af130c85c9d83a5de1381f139b43d773582e673bc2721a0f9ef97c130357babcb6d30bcd387aed5928367950d86836414d90e530d862dce9919d7a405a237890e83e19789a340439c5af87e004f430935479201deaa7ed2560b111976624bfd1a9772440cdc86d549b1201786d3726322a0ca226c782ca5fbf9def9b314d95c42a8bea123e240a3b2003e2c24fe07530bff68981e2a7c46b2951d0d43bce91579f1b8aaf2755daf14a202b158db19a2cbeccc14e94d95d798be542fcd245cf54d199c86d19118046bd8cd5d2a3e023afe6219eebb359d75c3400954e3ba614c8be7f901fe2dd323c793c820ee28cda7639518c634b7bd725c4de379b476ca60145438b75a5c08e43b1c0373e4b394a5fb27b394815843c620f00d9efb22c96ea9f97891f2e45f587bb801887fd7e53f777ac8d7d0e6e368bb0183ee8f14016a87052bfc3e859bf890ac8d7c87adff081c543f64ae298adf8588d87782bb134a9b4e3b16cfc3934a82696896b1b7e3a1b747a83058f11070089ef5f0266d731e5b0f7bc8fe30c51653d19a133c022715a9f9da42a55d6add94ac9591b3b2b19115fd4d371ea10decb40b24398a95174e6c0125fbc38b19f9fd3947e63e28468a674800d63ac2d1147d0910c7090271d3639f80c3b2bd438027822f75b838702a2d03db71b8fd5d94a329a71166acc0694b50460f0f3d18655e4c0260caa19444b9bf732382fe4d18a47559aff60c3f6e6ccdef561100b99bad3c1e63f1061fb72d4fa182c4e5b5c7e52b7d8c4c1399d1ecded3064a2805477b6d6eb946686c2a0b9c8fc18bd2b5a30a8510e3c476236c9c220b5e858dbfc8539eb2114f6505cb115c0eb4f2ef6b5d6bf552c16b1a7835d71a9da095a289e704ad291b6be6d047ff1accf56c48b4a1d6c637b47f636d466c3e3333082e6e69880aa3bbf6d2f4e1483bd95dd692595790d8773ab558cd827fbcf3e385804f6627a4c201f952a2fd8daa69a85bcb41570a54e2af2736daa9148b6bd71b8831fc4445f63377d3add893653b260558e747627bb8db027be68039822d1c32e2b5fb611debad5f4f86a7b247505db015f0fddcbb42fa18629102339912740bf9fec8cd38aea8d3033ca657afef2825adbd59aad2898eb7029d61afa00d6518eacf124c59855faa17bc547198fb53d3b73f91919b98d6277fbd266f2ea71be66380012a9ab223d21108198ed60d90b6fe0550577b4cb63912a473d428695e93ef1b3dd1ff1606e974b847b6af9ccb20b30c4fc3520ce8feca1215a09f105357d300c325f40cca7f0654304f595a03dc9ce3c4fae39258e961ce536d04b95ecb271be25afb40a6b04978e54e49e62e41bba66015129ff7773ec98469dd75ac4d772039f1c99b9d4df20d67014dc586c8bbd17bb30d653cc85170383bd5cf289c6ccb353b05a818f0fbb841f0e72caa57dcb640dc18b8172f3e1c51934fa3a6233446561393d09e05c00ad0eaeca001a90a7eb1df6579b93b055af63b2c1b4a2acaaa89b97505570312417a5312420db26af57aceac3936bee04630d470f1a6ae0ac79dec35788c60eec592fdc49e2ddc84670521e9553f980973e782539d945cde352d7a721d57035d1395aa0f075154f1385dc4b1c683b8ae342cf07109e2352a7dc1e6c8ad739dab14d712f1ef34e56e164d3943d037ff4a13e1f0fdc386c6b7d3f66b617b4acefb9a3aa9317112d5283a540ed2fb0ec0cdf43c87dcdc2a0770b9ea6ce83d6d760c5483c01aeb8bd7acddd3ac0a98e8ab70c4c281d809c10b72055829d1cbd6fa937139a0eb6eb18a7e77c052d8fe3c51242c47d83a88b6171b890e694d73ca73d1256d22d01d00ac893ad8771695a4687cfe77f643d181fbd1f845d55e9b9a1b3328c7bacf0b63ed0987458276867463552086f5e2a2d6a1c055e30f69482ad2cec8a41d0238502a8da5d292a6c10fce44dc9f6968dec86b8204d21a8d2a2a6351d622f0fe1617d8164a79509082551e51118a1d1a54322c7b9bb50649610583abf4d1cbb9cb38e94c503a73601b0bde3516746a59f43bc870a4468f50ba40f91b33dda2a611712eca6e5b34b25b3c588964467ff93a769c96450d31a6a27b18b9bdbc3a3d01052d9d8212604f8078ad38daa23e7323d6264b5a776bdfeae81c0a4614af6dce689566e9550bbd5a1191fa6d403cf86766494d0eb85c17bccd3a4a8316899fb5755d0eb0e05411f7db889e565a15a14c03b508baeb9910e841b353a42117d0ef3665ff347b74dcc1563a21c39ee5aec6f64c61d98b184b189d465c9eeea7620faf6c80ab36c268c2c0987e8aaeb3b0836c1075ccca7f9aef7838620a0405e9c7a58e41556c40d01394f9a9e5dc87149285e546748df146adca4335bb22aa38f9c69fdc0a2499914a5c7b0f57ec5475298a443673c625530086a151b0668ad4ea69e2cf9c37852b18a084045aa36e0e7e211b3db2fc44cc5ec0867ba1ed3ad36ce4815b163263dd373add1fd9491ad2f6399204134f5ded1f00bb5e509070b2ae1a8c134e1e424d99098657db889031f5efb455ae40aaa78dd8d1b3d1c5ffbc23ae31573b16c747b27e65e59908c7a00e3cb8cb78d22f801f59569af70b01f205a8984635e8639e80a642f4c7ae1a9eadac36462043cdf0d5d4b89e76d42adc989198b8f692cbd89850ad4cc6d1689b1992a7dbf605a955b25592f6e5881a59cd7e07aeb484f6a54c1d24268d32480c91f3f92f38437162a3ae8091a9956d3887397b7dca223b748d8423ed499bb7d2905686d05d79d0e325b7cc97d5a56898b961d65dba916979ea1f900914b355dd588f0ce4927f82f7dcadd748b31bc2339d5da499e3e8004c51d871c35481419badb4b597df1656fb57e573b8e150d2921aa98b526e3133be578efc16b3bb2b4e5b88bcb2467e54d5700a07a4819133f68c837ccbab6c91d7c4003cf08f87eca6c85c95d9bdf218ef7a5e077ad199a103470dd8014697c5aa71d3d36fe9f27b1d4cdc0521838630a9ad82b3237b1548bc677c1e9b0fbd48183fcdc4c56bdf820b365a1c936c5907a15015341c693f9c755871dba50c8bba35b34ba3228da38eea5571035681d071c72d58000fe95f94374a0a82435ff5f4e3b9c22f88539a6ffd454e1d4645c6d02865160c932e43cb142ebe67567c007211fb8691245ad93a2425af571d4f80d695cb28afd156df853ecfa5bc96cd905e0f467d9d452a073a053799e129364a0f4d71e5437f7102f442838b5054d974b00c1c752dabdfbb0bdeaa33cd2e8578f80e4415d015326900a26e8c9e3c2872a821b5f827e49963c44a10d45585588364e486865fdfe7b3f3b65dd1b6e2425dfc8aa614d5e07db640a0b3e56e3ac1edb0cb119a69800db7e12d3a1412eef7a236de11d029fd788eb09da6e047d45e7fe145eddfb9a388a0ce64a41823e2bcc93a27b0447c182f7d52a990d6d20d8acb81b1c0d1ae8a9864fcb892be1a2ccc58e0bb481bd9a662e7e62de8218f2c0261b1001d436c2f2173b640e43b756473afea47a8da5e849afe962fe905e291138261a8aafdd0c336b80ac098a982b93ab5e1dac349a3c18b74533783da5c5f4ba6ae31884e8d9cdceb0bf311369c2ebe89777cd15f040cf3e117eebc244af350c9399b31a0697de370ebe338733c7689ac607260baa0b0c8bdd04ea2bb35f40cdc637303877b3fe27da076bf68ff59c668fa044cef8d635c82132dc34257b467916587ee1865a3ec20ae1b8ce1fb021f7dc6d217c71ed65140018ffae90b1932af1280dfcc4682d6184b57c7bcd5325cb787348107eed15e3bf38d6f59dad7bd2e6135b0921003402425fefc0dc4c845b4d99bd50f69fe0a499a646f184dfe645cfb48d4a07ae85710b40b71822ec42b860ba39227d957866d08915604ae98aa7f9ed7dcc54ecb10746d18bdcd8427fa15e9e580ac764b037e8f14b3bbe84872b48be10e355bc88c3ca48c703e227e41bd96afd2fba1d2ca5b561b2ad57e80a271321fba46e8015628396f46842dcd7934486c178b4cbb1e74689d1a7d563e7ebe571e0e15244c54d341368bc2b8a4e6890402ff4c533c73a509062d08067427090a99f4340456b7e93d207be6661d4cfb7017d28ac4e04b956325451893257e40bc603510240656f40038c7c4b289ec0b5363ca57c6c870bd1d1f4b22d9a12f1fc3cf09af0558e03dc5b310fa434a1cbc7e7a49acc0a75206ffa818bc9efe0e7abac983639b221d502d3da6279479ddcf8f28f6ccf524920d461ac69fd767845a1ee32a76a8ff8a9134d17f396c4b55c4cd4feb2273a878e8e2ccf24923e1966d571f58703bde5173ac33adbc132a5784133c6dfef1c853a0f54e5b68908b528030f897772d49a29c70979d79b932ce930238cad324e6c41aa995b88ff29dae8addfcaba961bd81a60b9218ba0aef7b87613fba903955d04f707e3e8901eb4fe16cf794678f89209d5eb7c8667afa41e5a359479e6dbdcd95869d3309c13c5d458fed2e2573f67601e0b9a3606884d3b2174094cba46ea4f2a18925abe35110f37afdb1659fe5a54595398031d3e2226e51c88ba766471195c8f1793be49399042b0203b143050a6eacfe9d07c48a82c18d31d2ae697ed996c5e9e622d6741f7799e6eb9292189ebf24afd26469462e631241274827803502c61ce1c674f06a89a0eeee00605514ac212d0410704605c60aa078727432b8c2d594c686cf8d32bfae40748c171be15ca541a8c15b4ad92f95673c154ce2c01180758f0704f534487356efb5ba5c352f3245ae098ba786e60089813d99061437a0f42f244a9b75d5278056405da75bbe0e81aa3aefd38c730548e49e066237e371be07c5a530d57d5ad2296feed6d50c3eddb3628c5f3d0d3e6e9c37008c222d30e71d798800546159f86e9826534fb33668a8a3e3aaaac1df46bcc3f44ffea1f1bd286650da5a4c8eed44c9438b70a588747a8be72311f13f6ca285194a6d28fff9d5fa158fc49c031a45ae7366b46e25330d394c9e64ac0f23bdff69cb3ea3301b93883eda59874b6e263110bad2bd34949df619a143c7d4cf0302f5432df81482e484a922ca11c26119a99b78ffd6dc77c8216bcff215e9140595ba4aa86cc15001d96fb5e583f89407a3434bfa564eb7ac694c1a545aa19749b7367f3c947580657273309a51d9bfdf780d06212421d0a23ac52adcb6ecfae4f87104b47c51d39ccca207a6f5177fcd1044736d81d407aa6dc097dff86a7d46d07f15b78ad1a72f0e515047a89d0842a018aafb99093deaf2920a296ad65b217dd49b32cd09b59ba0a916df86a1edca5cd02bf83c58d3de35e09bb1b76c8b2a23db734ec07078301c4920141884604e0809a8cd6de4a0c6c8612f90f21341066967076dc8d4f84137c2a87eca59458b8c813c4275836d4955070b191729f9915c04b3d6ea88e8182f8941c9561981c8bb77ce9c5c166a5f6ed369d1cd5dfb43cf383aa119c86177ac4e376ec6e5272219ff3387beee9a15f20322c4c1916b015384249d9472cbf40d8b041ee268d8af755cd98f4956fb508414a717de845bc015e8794da0e062c585b05451b4f9f83cd5c56c694b888faee81c369171189d6cf087de5ad214ad8fc3325ad0793fe7c510848671a44b6e45fc8842cd15c017bf2512be78c74dbde4117b5c867d6e434bb4347c6d9dca13c9a725c361e93f79e54772c436aa60c4459112d0d1256490941b5a930950c243e412a41c1ff9110e5e90e01d063732f92c8b7b79667893f7034e1d4ede9f891492fac80ca5cde874e29dcc35425dfd1c8256f3e4079076ef956b8a52cde6fc783382ea383071a61a616769c204232282a39cd5ce1ea042e50f2fd4b53ee7e3483628d15bed17844a9904203230eeb6daa967108f804bc49c3ce0719a132dbbd33f3d5bdb0ceb35537d935bbd9d2e23bdba7b4ecc3c4141de1fe49c4d023c6eb75f8ffedbf27668d1572dcf1c12e087f90502d48c097a6bccc737fc059b4a1843fc14de5a71553bb5a15896f1a862624936649d6715d1e8e061df387b1f61410f2adf09f1a83618053ed1fbb0b749beb6a0874ab7efb16403076e3c5c99a3a3228c1a1479a9b3e26745f13e92112541415abae461be42f32ea4c304faad5187a5f455283b42876c172c62fd9af4bb1cf70fd321a14a3273bc8f3e8ee5b9e25f3ce9f29f09e9b2095057bf5273c34f35b74062c1051cbb17f99e72c7433208ad652ab4376d96e49c228f6ced5373070c7823cacb6df851b02d2f6140a022aec492da18bf70f8a154086d1b7507d8be58b232660b94f552eb9666fec61e511a5fe4188d53e60328252657117a3138afb62029859cf0f385291519513f238b06130b36ac3db68673cb087d2c083b8834578eeacfc75aad78d163358a065cfe09fede0df4b4e0abca15b00d230fc1cd508ee22baa2b2f176e165adfdd7cedf82095a0ece6a2514dae0e328071c6020e1848c84bff1e7cf0d0421a0a03e3ba7ba97c2ceeee761a933e3de4ceb3af17d0753eda2779ab6638775158642aaef1e8149327922d772df067b8398a7295475ad6acdbcf57d679bce3f4d3ffdad43b68bcc04f3ef8d88b3a5ae1f38a4e205e0b61ac3416ceb3bb6c280d7368f6677cbf74cc70b4b3d238b9f3ccfc13312375cf75520d245c7f11abf3f6a95fea7cde28b040e1e20b43f41ce81a74e80df72666fa379fc775a1c90217c7ce2e9c4f45c018c1711b0a06f778a5a84034a55d3a01da31999baceadc1f220706c80785eba89e8b7dcb319698607b739b4af588dc2976c43d4bbdc4abfb168bb4f3de14ea1a6a03134405b80f74467c0b942fa56fc2f53d1da76d10b3ec20ce6696cdb2a316bf0a62af6deb5d8ba8001ab064d2a158ab69723e1c44e3f5323fd9c7edfa1af1b2eda7d496f9ab86aa8c0f2eea9b5a9a80fffe8ddddc384f1f76c3288b589058a64fdf39541802e3e6069c0550d10a90a16e378eac1ff93349638421e0c60ce94a942a7af7ab9b8131ac10624c958a8895b3d1b753f5198770c63fa78db2222eb86b682f4036085dda9484a80b68c891ded1e3ae670d69109c4667b0691ed2b4c703dd529032de0a197c08c8b998078e6c74db4c694a46f6313326fb00a1f161c4605fa153469f40edf53452868ce0c19b22ed615512d82f021c3b520dfd5a627dbc9bfaf900c52676a40c79ea33498dc252a6558d8f59b0f9ca9c8e0d127f41212dc7d3ca55f76e8c471b78a08a2a6039705877df38621d1b61ce14e7aad45ecccbab09ddf2611b0d36272fa0a4bc72c9978a997669b93e400eab650d47df02aab5ca6ca3f97e19f7df505cea1ae2bbc1f3ee4bebc8614b5cc360e1615f71ab24dddd737ca82384af029b399ce3a62a56ad7c1d560abc6cf76a5a36a36249a37b027f1924201fc4f7b99953f1c7cf4537306b5ce8c25f77d5bbbefd9ff5004f2047a63e7f4ace3d4a4e04d947eb49181fe4278cf3e293ac54ac67f02011780473c7e6c80697666662c7f731be4962fd8e00710b61dd3d06283baaa91c1d835a387b908fe429fd960431c2d2483133f7208ca01d729a19da6c097f088cc6f385d79680c351dd0010556f8e98d346f131ad96c5de97d9ca2f2fa2df2f07bdded4917e83768bf2d20ea2b02dec55ca152fa4eb152158e68c28bda60effc2ace7a9d1372c4802cea25d78855665e5acc56a2dc9dda6b87a81e2dbb32824e2f8af61591cece25a846f493cf92cbda3c49f241f502debd85952f39650f10eebc0635854359fedc0abdb7c6decd364e1e8f6c89754f2116e848b29abe39cd4406f915783e2224d5f2b72e0ad94a9db41ff923f9766ec14bce715e677c8bd7e66c4b13fc16933b334a9cff0fe200b378fec47ea086fa87e4b84a7b61714dc1c29bb28e064316a7f6844f04b8c3233466a176fd9b57b4e672384a5eb9ca8dba2c8822151bb38d42fbdb1001c84cfb090a517eae92cc5e203f9a4d3dac246c15b2a4a3e5db9a8279dc8690ba6144f345a778df40028d3d1681111ace433644701cbbf8966e7a32f1ac058cb8af2eb1652741d0d2f9f8abcb95697bee42c49a455e65117b99c9641047755e6a2b4ec072177dd4b352a430fd2dbdcf89a7e5774d31b42ff654417011bc3ad7e586a2cd62bff5f182023e2125b5c64346b208ecbba0121d5e81def317f2657caaad870add1dd9f52aa86c5dbf1525c6508550488fcd0b602969087116010a98e87679bf22f41f4500ecc08621e97d124df2bc92a48525d37c50e4ccdecf5eb4a08dee3af6aba6caa3cf0f9fb13483d16fbc26ca63b062a7c954f4f6d64f43a4196bce635704adfb9aa7ed77f752e513ce43535cdccc4765166b016f5b9054ce91652e1f12b37f65a883ee0161f67ca1daa3a8ce4f9a983f6dd9a617ea52aff8fad3d7172d8c37f3a03438e1afaaf57794fc86f9d0f4fccd1c564bc7e7b78ce9c0240c751624508979d086edb6acd7d814581a4e2fe75b677c556e23451dfff67f36af9f4aeb56c92846aa0e585f696dccc8633ca82456548086c0d7b8bf2c91c39bdaaf385b2ad8304f06b739267bf8bebc0ee7db2168643b74feef4b3735b0c5920dac8796f8bf01c9f8816f78a1da42ae8e7c20957ba05c7cffcf9c8c401f2d00f392c5adce9cdac857a1a21c94bae37c4333dc32b3e804ede35db817b05cacf3ce1f5d816f444edee4760c8b5ad0f10dceddd143e7e2e17968266bbb6723df8ba4f0d8ebf045ca6577a3992ac012aeea57f80fc89ed661084aecc9e808e280c52ca209a5cad02d790a404b9eb13aa008e6330cb2d5206701b642d03c5260e8d6300906f6746fe299bd3df757dc14a76b8a42e6e54d93ba8f4a08294c37950e4c22bdcd1bac1a06ea3d182388138a1a261194a50fea5eef04e3ac6c5f63d4afc9828d26a17323f7f19b7828273b507d7103366957f1b651c9e1566fe9b84861bb5d67549b25f2fdf822599df055d72f3cc46adba3d0cf3264c81947cd6fcf8c7cf74a2761b5356753359060a80462aab8502582752dd7c8091e2ac188f85e661c7c4221a2ba829362b77e6859b6c9eb2552971a7e1ce36c7c706ee400d3caa5b8da13449d08f63e2304e9ed613d3c26f8f730b509e96ffddd2652d74e1f0864d7e9c9021b00aac13aba7929c5dfda6a9b4a5fcd22f2cd474dc1816e985632188b0aa1057107cb45a63b6a87024e30a55255ba1ce4123b573ae9b15d9df47b2009edd1088645635912ecb56b6b658d2d709c658e4d42fd5b4e09b7d9725a9af014884183cc58313669b9d1734a215c2d8b256b06b3ff75a6a7e0c38451799673980e4047d94158896c062238eda717163b546626ceeb53e38c325df3cb9632b5e9d1833fa1b7b95007504523c65f5f251aa9dc970abbdd9f769799d933b7dca120b28964cbbfcd903bda0439b1a0cb15dc914d8b6e99c9608936103097a0d155afb037b41018d12f1ce08646b9318ac0aeeb786ce5ac0df416a0e512422f98c7f2997239395e0ee04b5d166fe574a8295de01c10095eaff37818b016e4f8bc394ec31d0c3fc9f288a62002890adeceac6762acad7f45e622b05557b9a3a249476956594f302192d59d9f02ba513eff50025b27dd12e4a826774f3049a68cc5a4f7dfb21353ea20fcf01fb2c873d4e66f827237174caa6dc4ab93b66a7195988f177e3be4aa0e1b89f116fcfc94aebd149e1b4c35ef77bef85a616ef9a3eff5ecb5764ff2eeaf22c4900feb3466b9ee0c4cceff8b02cbe61516b15dee802b9bf0f1654c1d88adcb0cbd6193009cc8710370d285c8a7b34c297cfa4c0a750830b87104c52888d7f71257ad360841b7cca803a3ee09d25b1f9d0b88178d788fec8e14b2569a5ba8fe19a82f24236793b93e2ad8bcbe7dccd5263f04ec39e424c338df56585f7db4f695900b0dd32a4aad812be24b111e5c67888c1fcc63e8834bd85b7b129b291faf8f479486a5438b1ccd4a2d5c80209eeaffcfaac00a5ad009aad1c864623ef160b62b430cb7109888b9a5646eae7c6f9ab635b58fe4791cc2643408c8c9083a6153f83edfb3edd2740e9754d7fcbf8ec9becd0fc204086ce6697499874306c5852d4988e88840197c929ed3111f61d945812a9f705dfde281f3c5213000331c32e148305c847d019950b873d732b005ca4a7d9faa1a7b682c475bb2105a00a2e502f5f1ba93db6a816e328fed80236198da274243ab6c46f3d453d243dad0f8341526d53d476c9652f16b6a2d4978ab4b7d52e8c723c75e1ba882b2cb9528059b44be37c37060f21186e166e2f14bbb883b588ffa55e99bb2225ab0a436ba994e8d95e488b18dd3c4b9e9904c6378b211cdd6ad96cbfc1232deee920fb2ac6645120b81c93afbcf749dea6380b923af7735ade5b44552d6604d92b280bc61f33a207f4f15bc2a6da8269709067e0d1f5d644a647a47738b39ccfc5432a2a719d6594e8bc15fd16e323325c670844749e5210dbf3085eaa4c5afc709850b323e8253c5c92a594c96cb9daac22adb9542aa3ab334802eb3671a7abc9313105108a7f8ea16113c22dd3ba953f42d4afe9179f49c51d1b2ad423acfda2fe685e3083b6423272436e338706f03c6d487bb8835a628ab109ca6a1413b20f4453084cba8137e8bce9c324fa3743a70f6844416c031e438f008cab59b174938a19e27dc5706aee6b726c91cf526e36d6d81fa506294b23f7df28aaccf0b21d172f13f0e7c0d485570f11c6d0463e0ec6ea950b2be0f281401d6cd71152a4f12199a097516dbf1281ce2753f8a85663e65ba65d3a1e0264e02f51a15d24c315bad0caa8960e887546e5950d6fbd69eb25c25519ef23fbca55a7df1ac2fc6e81517027c8e79f81f1ab4ad1b0be1f94eb9478126b52034f19b97a03ab85255f34878245de2d02483380e577b0ccde72ca56e5e86e6f5be6fece73d630359926f99f90d0590739aefcd81ead1774f2f1bd00d9390bb0ab7e1343617f9ac4564941618271bb3b821b3f96b00d6f40afe0d3c26177ed4d994448f9422844059d0c8818e36d83b7654a8e27cf17e9de7afa4245ed315d8c161a65b594055671c7be538e91498319a8a71e180d7699979364af1310e67a93c9a3f366afc80d39fc98e90c0e7f53e9547a7ad9d60e0aaf384f39a67c4e1fe3adb8c7fb14e7ca1892276edc244e42525e58594f2176cb851de9b7c0be60af224ae2b1c1533a781d481e8a85f64542aad246566ab8235d3093901fb8cbd3b2dd5bfd1f175919d28dbcb0c79efcee67da0dd3ae11fc9a808186606f68c77a3034500c0d6d8120ac7e283198adce81e57e631d830266eb102433bdb6c26c753475e004806a3c0bee01a56605660bdae593744e4e6e48c50e8e25333e516bb2d99422cbf88937d69fe8819790bb0e691806b0c1fb9dac5092451a50cbc69549123ae234ab5af738bf98ed4e51738419e954e5078b0bfd7fd66a0839828c2e923fe535e5ce5f5d87f4dd6dc4f6b8662a18c01ee0bd353c9ffd16aa9b940b02a6bb3725372aa0297c9f7d512ee23d6adb851232ab61ca51e72fda32e44e78a18557b862867a79c4db59aff68b190cd6d89af743beed7de80907427dda40e927aa177eb00bcabcd08f1a045cf784ff43670342b217ad00161a984d5344f0c4e568b30a2090208e5f2bb6cb0d47f167c924fa842139918cd75b935e55184ac593e528aa656bb22999a60870a940b7a8473f60feb4a4bfc589699902c549919d845bfaa04373a8873c429e27a6cc8710e5c06ae4a1c2f85025dca81a420e5a98830ccb629cfc10791eb8521e521407ab818f14e247a9f29895b4f83d8a70609c684cad3667cdb74966b2abdbc96a081cce531f4886db3ef2cda260ba7b97d565fa07348f353063b5522a6c71d114d175f92a7a7112cf9cdcf745880f13d0f99676b597665d3b4f85aef8cd59cbda4055bc82cd0cbb9c47aa581624b3acef0e3b7dfd71a9408c0f80edd32b72613e60a5276bf6a58d6167ee857471a6c997b8e1516cb36967e73874bc15388a4fcde4495e71eabe7975a84d6d4c29de253314b6a794d0c8ac53abf184127bbb50a77ba7bc804aaa23f60235dbef854087f74c92bf9807d611c4aa9c6a5616b68327637ad5227498b35ae9731a6b46aafc3968aeaaeecc95d5ae0f660e202ae08be94dc6fd1ce0bd3516696f33c6a82026fe9bac24ff31983855d2819bacbe52f734aa09051fb1d42ae9cdcf1568c607ae89d4fe9d9b63701e09b0ce8587cc7362082b907be195686d91c69159b595d49ccd625a21c0c1fa6dba4f756dc89329c8a38b01ac96e2694e24e7a68156e3e97f32f8b0e9ca5090107a97108e0404e20ba26cc94a5843cc5f178e8448813774587e2d9fe5c7f25d3f56dfe5b37e2fbeebe7f2b37caf9fd577f958bf8b8ff5bbfc5c3eebd7eab37cd7afc567fd5c7e97cff5bbd28f32e5a5182b466064ce60ad01630f1012d30c59f20c94345c5d25745841e6b2e3b4e1487edf3a2e2669d481f80c2de30ac964da4aec265e7784b68ab1ae6201a3c5d801ba71207f3cd11047f3d27525560c0ad1dc0f6f839c9c9452bb3ddf51326222b6c578bcb792c6eb4b8116b7e2a62c29263259a55bb1583842c9d555448702a1dc6af227f7eb28724a99a7cd2349dfb7a3bde10af9856b0489991231bb221ca40d47f22b310e77585ebaacac42cdf7dfabaa64bf17e0f4153146e2bb2374f440fc4468eeccd1ad702c245ae5572bd18135f715790524e82b142372443097d838dfad065d237a178ca917082ca686590f1f723f9422879e69da74407e59d79423984b9b47e2be6fcb1a2e2f5c7390a04c8923d8dd119a7924f1cb224973cb9c663e12fb6551903db790cce9562c160a92f2abd5e88ec8a2901ca4cf07c487720d7ac4ab2eabb8a23864582cc9a7f756838e11bd2b52d49ef194a231e06e44ca880910a09e3b041c715ccce962be07f453e0fd61400069180fd055dc60519957af053724be41dd7bdbe2eccc1717dd38e0354704ec8631d8adfe1b6f8588a30d6b8cbb43072c0687f4e6dcb8152c497dbd1efe7b74f612a20e23a4187716ba13dc69a06e24ab9d1285b428b858b682f0a7130cec103397224f3028a89e370ad95110fd46ae4244b98027a8479c6f84a53a812a1b8d57c8a3d4164ca5ba138f7164bc925d4c3c8691dc2f12474e4bf8570313a9a1db804c6b8e62433ed1d8bdd5fd43b02d0845c565b4b7482262df0e95d3181ca1396350372047e99067da1b7f481a37df520fc14340c931d677fdfc5c9df904fd8d38269c016435e88229202643f1989a96b7338d2d19c40d9afb5a5f544b8ab66912ca40940cf62e24452328fe7527f231ae1a8cef6a33087c3bc11e604abf149301a9224f14400ef10d0198cb4aa9240ff84821601f3d0251bdb234e726a607c2d9ca9aae4e1b8f028e42bbdee50395c582fc8317c780a5c0b727df98e6479a03e0b4b5241cdaeeccc3338761eee4b941eb23e05585524f55eaa6c54a3ae34a61e7d011eec946154b3fcf076cbd264277a9539fa8582b4e7a9ff2c3711b0b264c9a3dec38ce4107b642f6ad8048a1c385c5142abcff1d7f6f67e498a92492a87e2ae744ed1547f88c2fa2a646c28ec165cce29617c61d1afd7604af5d8686ce9a93b528240b348833dc9f92f0daf303ba32be541382ddfac3d0c219362eceb14cb704093e37ec94cd2685cc8e9c9fe677af71d468eac18bff34191c411e4cbb0bb709c0215a0da0aa5187831ee54be450bf9533e5f9e8b8355cbece40b091daa5294bad242f5351661386570550d0c9e262a7b03ad7a910857e09009942eebcd43170effe1c40f05a91813ce95676b57897bc1e08266b1e2eefa5e71c2af8b54bcfbf042efe9967495c9cf042029939353fafe987c577191915cf0751cb71db6a8b8d2825e66489f34b741189ff06910e555792490467ba7f434f028dafc9c9c2caf0f5178d9a70e43012cc157a65c4f1a0555a23777a27bf069ba5abb4a2acc4e94c7f0400b44a2ebb88b092991c32c1aec48012ac5b6cda56f8c13a753c0aafb6531d9b137e015b9c0a63411227213723152f7902a07ef0425340b6d82349f2178ebbcdf671c21e7ba480235bc8e68a402044df6705479b2b9a6f5a6bf9208cfc7dc0eb5f54361d8fd938464707b4ceadbb51b2fce2145c612ced71cb9b40e852e2c705554f3a4ccc968b76ea4413c2c2b70d084017a40a43f754cfe2702255dda6f49d7077e7c3cb11ae6d796efb3334fbf372bce7175078e9437aaf81d9f2acb19c6a4633b93cef7b681d347f43673ddb9cc2c9e1c6b8617bdd8910267bef60737c065cca3a58c13f0152eb0d99ab0bc34c5cdcf13f37930522665e62ca22f2c9a8505c59e994b51298de99c310b5b05fb3d66cb37442eca52a8c3fdc899d723f38a1433519a2886ed97e713daa2b3c441c2d2b958748a987a7841183a22ec76e25b22c54ffb0b44b5d090341b672e2d4f80dcff6eccdb4e0970d2178daea22e184144d800802d98d32c60c1fa52da16df8490e79b52203b44431da7f1b792ef4c9a1ff236089cfc0aa4522d390f08ebc2a6453ecf1d651ecd7e5384302f2b90b24c4e9346bb9016a9e1727abe1d88977878f755b722bde435a4b2c5d64a22814d0fa9463bba5ce46167606866cee9720f6d2e7820d765042b9affd08512888514b120ae48ea478df4802b6562b475d0504f7883f7d88c927e392b6b1ea7c107d5509595011109dfe6361f9ed16e68c4e8bbe4aee980b4108a475a2e745a4af1fdb9012bdbd5ace05b641a39266c6681d16023deba07d63a43bea647887f93594ec0647c8a79835151f42b63ca26af4a09f494dd32df42356b8b1ec81425e911bb47bb01cb48d7a78b3f66ce5d60178bfb01d3c41c9324629fd8fc131bd4aa56584fef237b6bb62b15c739b8f2a6312a40fd6071638fd0667abeaf5bd92077b463c644f519bb8a04dc1241f739f10abcd9d603fb5bacd5e8f8f06e533b6890f6849775fd123d0fc598d0660405c897f3765e15f4f67ceda39fa0d944213e671e8a90953fc66909e1a3c8a6d3ffd2ce70c41d9044921657c9417f95820a544fc264125efdd431d017d603aa6f7a9da03a6e7f5dd4e69e9682ff3e338e24647fb02408132d61b1e4e8b0be49a1851bfa71f17d7f7f337dd57f9255f62ffd61e9b558cee63603a934a2ae10b9e7df322d8319c05ab0fc7100823d43ae25a1433f2a51bcc0b95049ff7b8db3477bfaff7f78b423e1db0939f5237790c0c04c1c7e41ffc0fafde82818e8bde129594adc63c0421560cf9d9c6e628faf75d3b2976e8a9185a7e664cb3c8a3e6c912663a0537fba5a7eabf77338e2af39ce62319617f183009f641a885a3282f7198fd25e432ed7d9cd347e5336b5270fd12ede32807d8a080b34172cf6f19605af24ac52905ca5f5901bbc73f17c8e0cd6199595c737571f915d25cc2dba60f40cb39cf0434fb7780a2511a250d510ef48cda83ed9943d078839f382b3c8498b3e62c7a4320c49097a3a84e109ecaff09e38e6bb64473ce55501e4d638aefa26b16a9454d25574d95cf33c8b2267a12d08ed26a5502074e8eb8bd3be1dbad12ed72b9f4708a34fd8c41b10906e41fef693c80f105a4075577c630f6ec40e697bae890c60f85d21449fe8acbcbb6bd4bc8c028005a5fbcd65cb7ea4f37bad765f87083293770b1fa33a5dc9df2b5ddbd8e188a53d68c8381afa10a23df35f3dc785cf8ca973b27874209834dd25d478d8ec4851f43f22995dc0195810839f8225458983edb1ee9e859248ce19f00d3545edfd1beb6fb62b32901c1659fcbb82d39213713997153999d42f2de016ac6a38feb9aead0fa747f08d29913caac6b7bcdb77b62c3e420efbff1cd0724c287b1236bb38008c6cd1bdf2049cf388a7a21aed8d3481fae924d60beb951d107f76898586717eb2de1da2e047a2260755728d366dc6804a559865cca9cb42527d66c4b131f71a6fa4d1e0f506b48da77cd65379057e5050b88465ba322e4c241ecca5bfa55bc9ca458e78f0389710edf8844ca96dbb329be32706125ec3149f667cb445be84b2de1c0bca999d7f225f29312731573a06c5252b44c7333254f92b46ab1c040149e4fdf1973be2133025e0e4ab5796bf058fb07a29b3d4f08f8b7fffb260c90b712c2c613400026d3f764300f9a05beb204d3341308c641b53bace6979db9cbdb1781987eaeed9180081d795971e43096152ccc1b5c2564dfe61ad4fe25c0099665321e2fc795288d1451460d85fc184dbe8828e1d801b350377b28107f2a6a6d44b003604850afc5121ad2d8addd899dea71a954b9b3cb909b1027c1355cfdb4a8372c8d5421a2a464e14d49aea86161a162aa4ff453b8f4f016b4b53a84ee51ce0170e7172b39d6870b5c4e0a8dfbe6ecb10b6f1a3d1177ffd9e792c06cad98b3adb019b2492784fc5e4327f09bcbeb06069510022f459efb425e2d6c67df2f0ff44b764a51a65e7bfcf26a723b1b6cac65d746156a39769d2a0dccaeeca2bbfe2741c42c44ad3624d10d2ce1bebc8b3ca8cf6d4e52259d595f6044b9c1a2bd08b19f44ea75d630635a87e8f2bf4c1ee6cd5514f7203e453950d16e84b0da5107a0ae4bed67f2c81ee91a853b7c2f967a483b5deb12891db0be7553448ebdbea36d37431c33eab85a7e0265f4546b05d59a86733111e3d2a49b3b1c5ace33a6609266b6d74f50a793d633790b04fe5da6b90273b04c249cad06e8ec19c1df3b844776d7efb9395ed151dd394c0f879f7306e45691008b438684f16b09742f0b4ba4213b7ec085668273758a267560e523ba8ba699e14ee6cd95a1633710b8d74cf2dc0c86ff17e26eb508fc885c91f4baf006f362fd1c10574fb47aa74cd55552747f9ec2cccd21822210f08b783bb7cce6d723b8f7ae55f458dcf0318fa674f848c2ae4d97314c01f4da09e0f9300b657f857419daaedc9ea9ebec3e6660b6846d5a7944bf0da820e7e5c93dc7c12177520ca3da6e6ba7c1f8b213a455401d8d6173e392e263e44a77f772716769ec326628bd8b3628942b0505c4c7e3fc6abbcbe0b1d06607fb0b135a706731e4422043276441a797cce7908416dddedf2b761a315047dd34f0a44a8daccc611c0476a21daa67c8f137e46b74a85dbcc9152dc69d7d87618d0e3d590e53081d4fbfd61360ef718782ad7696744625b0a17eae873fb740f872cf667ad76ee3bd157b472ae18d2c87a4fa98268bddbc4c08bd91eea2650fb8f87ab1c0e2671e603bbb9a064cc18d24ff9bf2da02e546bb1aa812f85a660b9e4c07d295e89b3960f1d121ca367b7004eaaec8c03186d3de02998509769544e040a4625d14ea4b6f33778920c33f97d9ebd8b70a41c7c25a047a95bea62a0fa9e9504528e7451f4ba7b3aeeab7668da320e5245e2e706ae4de69c848934e98e2d3a831f83b1d98b4dda2381e895541534b510b459929c0f2104818a4444fd260fdd3114b799bb38ed5c9f729ecba9cb7d5685983048e8e3837d8c2ce3942320de1b5fe0e03c3e692cae43bfd1bdabcca331811339b52874978c861b426631273b20996201e8277a3d5d519f0bf86833f1a8e54445bf67cac3a38dbcc6a09080efd377b9ed6b7d4c1cfe60414d3e193d439febdd33ec65c74c78dc6d30b8394edbd7a838c6a20ce5cdb8c120e298ee29ff82eedc3587ee6233828a92e9f81955aec661841618136b029315b3fef4d3172498709b925112f363e2b2fd416a731f7ddd2f16915fafb82dd53c335a8d63be30dc8f19f41f29f77a49290fb8259c2d1ddd52969dde072e98aaa70e502045c59fcf793c77492f1c798902902610010f70dd5d7881528950f119a02645f60a6b56698efab72174c75fcb0a4243b4980d3913db8e6f5e3391b6ba1a09c75c0ea048011fcec9c28312d0d58ca137779ab7e49e035c2320aad5d2306ea8cf436834253278568648b23c1b7ddef1ce39ecd7e12653fb90456528dc62c9c68a78ac16756b61e99a114f42d3bfe4f3d0673b62999a8172d791689535110332b3836469d0e860e2bc4d35ba61970cd0ff23109c0feb40d1b6249ec77a15b2e1c7457c9e33f2be14af8b0621edf4d904127072da424564826d7117d8e32c6f5bd992ae25c3171f3c4c3c138f07bec1d22b57bf7771211a1e2cad8580c91310efc1d6b07918b4dcf58d4f105aa48efc535582b16a4625dd98158469133ab2a68b0706c218c93185d997993648f8d06d66714096334d54a9f6868c8116a3d5c85dab5a4fbc228453c2510864c1d2fe81422eb52fd388c483f7a2c3a0a0a07f2c70152f57d3b45b4dc394a07c38935ead75b880e38a927a83b08c7743d7bf2921fbaa017292227383c6139cc023dc7bf48eef38b9f02d92e1a91b738594b8e861dfa5c3df2be9b2a72ce51c92d7b489d772c0755f7d61491f0b62c6b82786bcad1cb385cb7fa7f969da2b8c5db5743c296869ea3897653648af75b01e8e3c9379dbb20152b2a6c54d55a9af416664edcb123a35cd747761ac2740064d41eb2fb540f7c37cafa6ee5341ab20779d48474092ffa03fa75a9fa804a25720e368a14334d2572bfaaab8ea54978a5d82fa4e45d419980977bad6728c9d30a749becf6a7a8885f29130d0457a0ad3310b759851b28a2e942b6e26dacb785fbc9bcc1afc35f0a2cb50bb3f77996940f4686004626c56fffc1dfd4d0fd536cc6ef1a2f3528f0b3a6be665909df3b201db747bbff146ad835ed6bc24eabe71aa3fcc610ce3ea0bb13293effc4f2f18702f0ea857e4671312f380600d7ef5c6a6b2877b4dff968e02bdf1c1d03c37d9e11f85ef8f06a4346698c20205a937716dce641a4cd01077360e55f144d193662bd09321fee955e370ff326c62023ce5469cae59dd94162726fde7191557b3e410d193adc591f0707c0c556455e3e613416c89d26ffd10a0fbd1c7d9215570606487391b069c5d5611d27569c0a1d650e67b7b4b18c66fc8ebcd889c5b23ea319f3b16e1121bc8b72f551fa7f48f09315320e7d98c77400529a11ea94dd68e9f7dd10292bfcd5f6a6f2372fab1882e7c55bf5902192154aca0845c857635761cd17ebcdcbc3ae3fa18cb971561c4091a3952996e7023f5f9fff92569ab58f058dabe2ef681c85fd00dd78b60f63c32c74903bfd7f0c5f94065a4d87ef50c6cc2b8dd19d154ae541a1afe2adcf93ffaf4d99d20f8e3545833bc78909525422b5f77683f0d297076f19687081541a0ebd2bd8b5db729cd79c21d8cdbadfe640bc764657d57c3a90e5fa506e8ac1f7812dbfae616e9611c94692ecc8fe8bfd207f8b72ebfb3e5fc0716c331909f6df684ade7f456b90d7b1b55f801213e1e6a26906ba0c99c170b4e5a3b78b480ca3a23043882bc1066b1cc86718cda270a8e17e820d8e0a42d99ba80ac621622dd24fcc21964006d39d17182cceb0910972dc7651bf2d85711410339832ddcee8066635a1f232efe7d6aec67de1230939d1abaaae0000907adb4130370845ebdc61ed449188cdef19d0b21a1f852a595ed34f34c4970429e83da880b4b0093eba55b81f617f0edb900cb30ce6f3116051cd39e1de913d4fbafc182702eec3b46c2b1b026a0419115ff57e51e1cf767686675a5ef02bc1c24ff0f60f9741f9506f20d895860fab69c2df7673988a1c8a9ea470f35104db5e172ae71710f7a01c8ed2b1a74649cf9cd32774f1eb98e89ac8b168ac2b077fd58af40ef34ad41f0f8a873bcf1f4da053c547e7112d584306ddcee98cc4849ab5a9e8b7a1b78e798e8e4e0c3b2b310e1acad634d74ef4dc36d53565925d089fcc6fc0449309e0d534a461095207a6497ac75f21c983cb3c0a45d24f0740b893b52daebfccb6ec312bcbba50fd913e195bff25c6780244d0e15fb85f01b85d6c9ef7ec14dac0eb4dfdd320555a9cc76ba608130669522ee015e7828fa6b22aac5611ed2cd101db57a2a98e631052b48e2a94a7fc9547ef928919918b14fb09f824c3a14ea93753b3270b53ea4c2a993c51c8172400aed0058298fe4a06e10206b60530df7b45189b1ecb84788b4d311aed84e23c845fdb8c373f6fdecc80f4ab6d23fd282c76a59fec52aceff0798458da6d6b02c2d0b5ade52b33e59ea47bded95a2f1d8a9fe1d13993b67f01917353e12ef164adf5bd69a55e93f14a8502bbebd2a6970e56b14d5110da7b99777150494eae634f58e72f448724a928e31f9b300705b0f4a886a2fffc66ec0a040db7ebf86c94d6059e4a761b14c1888ee55ed795ec4cd416a65f3fbf2be6975f4c251415fd322cfbca85edc2947186948310e12f65bc69c48322129cdb2243f5413943b0fcee468833efd1a83c2568016f04f2ead224239e02777bc7ef2e2537d8cdb81795f740663dd748486fd7e1ee093a10e6de063c2c0afd1a7881911f2a0847bf726e63c17df7407ff3bc717d6f6136795792daf5351d159bef08947dc70604054cec71a9edc3ddcf87c0727c03780783e3000e6295440a2345f170b4afb6e40e851b568b025cec5f1ed1e2a056610d869626820a6214d40ed0f26148e87ec6c5b7c629040de3c9818544051f82b8c1b722f482039ab8828d59300c434a07471c7c5c549861390d03d0978e09f57a8f0e2367f25390876de7e90749f9a9296a2b9e66bc8861fb2830308e729cd4ec87db918297cba643ee3cb0ba4f9511d7b834168921cfca6f89dc7b6fb9b7dc5b4a29a50c570835089c094e7d3281e535af51bef36c0938df7966a24975cdeb0e41b7ae8939f34cb061a2cba37428535b14afa7bee3d4a7add86df65cd4ad96f210f5d7f39179ec74a84e7a3d3ed0f381e75c3bdee3a04742e6be7ae8b927bbcff3e1799ee7437368769e8bc73d0733eb99a691504e5d869e8fec7687c7ce0e37b714a57b76887ace3f8d643d7e0af58147aa8ef2c08ba8e1072ab6208112545a3102818ebd1ff735cf30061d779df47af0f8d0a40e5a476d1e1d6e1bf5e91161df7c80e03b0fb7e740f0d5b3b7c3edad5724ea16048f75683d1e1b8947abbcea1aee69a41a1bca339d7940ac6b5e8fead9add7a3fa059dd357af5ca0f738e83d8eaf5779a8bceace3d8d943912e8de75ceb7cd2510cdab4f5a2d52adde79b657aadd43e93f5ffde071d0791ccc9c477799f7e8ccbb6f7a8fe699d56db8d5d946eadc771cf480a47c88e2daf5e8cea30fa523363c498c0890ad216a435fa4cee3ef68a4cef10e9a2c89da422b57e7a0770eeeadf3360494bc9c00012522252fa0e7c36d686bd217f9b879d527fce61c87b7ce89643f444bfaeb6057648805bf79797cc25f6e6f4a7ff197c3bb216f1f61619c9eaa26ca05d7ae2a7258e5744a6365408e11b604d3d7984fe0e6234c0937bfe3234c09a7c7608482e9e7d24f9feea22287307584d1e928c8d411df5f892b1faa648c6070742d51c8aaac3af261c8fc942a1c2e2ab2ec640f58750516a6c9ce9b6fcdcf09707c843d51438e34a9311a7c848181a1823476d454f181e99c82f8aa38d1c28e9c6e0c1b652af0b2fa086ba2ca83b0269a54e0c2028caa9e1a3ca91d1d1b5fa60447ef52f1e7fcf8e3d3a5264be948d4c973a5c994e2d93dfd10ed4bd0f140af84ec479067be84eee508f2f5433678e9af9794defdb8e24ea75edb3c9d9352971579ba6440a506884952495269050e92413801a2cae3b9b7fc749fb04bd5a8a3915a77c4169a9feea329f52c553d147e0641e5a7dcb1aa8288fd749f1fbaab12d8022c5d4699402c5136958c75cab468572e942dcb8b6383535a629df71223bd395b3e392288c2804b0d0076717235030775a380fd70e64654063f4f87f34222c9bbc60f3e781f613f4881fd0085524aab85fdc0b4b4dfe038b174e3fa9223aca9cdc39aa0fc7c693b589287c82741e9edee60491e42bd8325d9ea21d63b58927bbcf422cf19679cb1832519024a6f41c42189a84ebbb71e614d4c1fdeefe28fadf5abd71c6076efb3f86a1ebb6d4351b794cefa28cdc218d4daec409dbd673f6b192fa0d62b987af3cde3e16d1bb77115d415d4f403f57c4fd7c902b5ace17660acae28996e7a6a1dcd75f49d409b7b3e89d4efa6cf2652bff3eab936e836fda00bb7e9fa95ab97c69cad911f5d3864ce25fe8121873f40d5c31cf5eae0ac739c7ccea9c783cba806540326bf3e9d57ff993a42ec59d6798e3d4a277510c9f46f2bbda743ce33bf9bd2632db33c27b5901874320d8e3fdacf63cfbe6b7da7dba1bf6b861ce278eb9be3983a74503a1e0a11b29e818e46e96e47c729b153bfdd0e7d88621d3fbcde65f69b330c1c7f622844e8a56b544af79e3e032f2a3979cf853ee4e0bd8dd43992e63714aa61b74321893d46df228dfeac8f3bec5cfb9fbb8b350c96366f5dc3a0f5f8a387f0e0fc0ed90067a4ed503e0f6e57ea5ebe82579af21fbd1e110524287dad68defaca45dd3add5f9e73f79c472371cee33a3ae45c070b99b71adef1aa95de06f6182fe8fc6aaa3badc30ac42aa5341d4a7cb556bdd3dcd53aae5dcfc7f58c7ce6f4d147569e44b636cfc755ddeb2ad0afb6613d2076f380704e37d63afc833ac6d3f3e13a1ee3051e90caf9f5bb572eac0dd10a7ce558c7dfbcce63e62b1f9ad7f371bdaa34128fc7eff4082aaf81dd860e3fafaed24038cf5eb7e743f407e73b5e43fb88cff94a5f24cf773ca5c39d1d2abdb63da1ac4325a46f735ed5abea1aaeb57617d7cef17522d9e31170571d5f1c97847bf1d649af87b6b975cd3ad59d46d25c8b59d3d24ba75b9bac211a26ad7a44ffa169bd21262c1941e1f531b2628c386cf522e9750f49fa904ab7313b2934597d7a782fb51fbbd770b5577325d00f4d78223a14a2b21e0f6ebb95be7671e160ea1892efa2e12794326a598644c5b3eb30fee2e71f96b873afdba6949c7bd8c97f38cf351fe938eecb9d7bc85446993b4250e3ea72e593ede330875d5c7274b90504f59d409eb7551d0fcc6922f67e7d6d1f2d4d54ce7f9d72bc66c07c7082f9b025460df3c18a0f502a92aac6d7713743f2231d603fba51ec5d50b2bc19f081e93befca780aebc1cd534a29fdb13cec7651c9a18a7abd2d2ca1f2d1a6a66929970d59e51382c68120d201f2351761ea90af391113b4d76c82f5b0e5238c872f9f808f301e5cf89cb259add32b09729caccca9dc52b2d19105a403a4d421ddba7579439e1f613c38f9ea7446c171c6fa645d3ce4a8452db376d614585b9fac9e16058c71f43c0bc6d3a31ea29d91de0fedad9a900ed15e9ef051ab91aea5161283e8d3a58ed3e311a509536aa926ea1a6315a376384ece7a4cfacc6dec3edb91fae8d3edf0e7b31de2f86c8741f7e5ab9565599605cd2ccbaabb62c861c5b2b34a9dfb98deb9d25f1d56acbb4c2b7d2624c76fd64a5b4980a5a6d1a17937ffb99366d323629dfc67ce58ab8c3646a54ddaa588baf2c4c3cb4a963989845996e9137864da13a51e3d4bbdee2831c87c6a36b5a6406230bdfadc115b26d4a7c99a3fee675e9f4225bb87689f65b30b95aa12d66d4cbe6819d70d75ba6e20528954d8f5faa383c6af9c166aa4a75a76d9d5768fea7496911e0e2965c8ca6475e560f4c372a1f774a7c34826874141414141dc0ef3b643d5dda1b3de5a60d6eab1c6eb3a22fb4cd6cfcb1d3a69d5fcfce0d07e7e58f7b31c069da9659cf8b864c8d765e675fb54c92bf95ac9a5c9f2f139ed9c7eb78ff3d02a9ed57e5045ae4e3d4bb964c8e1ad53b22c676ff330493729683f55ce634bb662ab84cc696c693a944c8fd401eabee9d8aa63449961d06899618b2868aa582ddcbcf51cd6cff8f020b664f420eea426a39d245bd235bf1dd04d013a9d49b6a86b7e34a76f7b29c9062dea4c4314c85a8f5a065120eb442c64eade74a42535c92c5297d1a94fb77356a76c233aa2691a114eb66012b341891f340e2848a30c27416401fb6206ea3971c9c9420d1a255bcc8182e90ee92d3c75112d7a1e4cadb9f44898406c699b2351b2414bf36d73249a4fade44d40a975b79dd464a4f9d6d25c7a464b2ba3e91ec4d6740aac3a903efd48eea6a3a36c271d91adccb9cd245b99cb3a6b75a98328d0ac55f3ea52c7167d2c67ed6cd649ef83d8ba8ea5cda6466b94f7b3486411cd91685bc906ad229923c9b6920d5ab335678d0253f3044b03876889cb0a4230f5b0e4c715a71219f13ec2b2b0220b3040b226fddefbd18bf1c94f9f9c8bf09bdfaa692235942e357d6f100882177bb62df19773a9ef0e833c0fac518dba9e30ce9e75912623946710d429d26404fae7772729b58c96be1d29a0f21ed7fc5ec7285d84a6bc08e83b8ef2241dcfde135b1fe89f53807acf2eb253a467e9a7f7e8223b457afc73e9f5e826b98f769ceeab8be838b835bd79a6278f4b8138af9a9b70d8fcac9ed152de459a2e4a833b49a985f2ab8d50df077ee0f48c96be9dd464043ab893644b2e6547b908b33ae820f4dc7ba6ca4fd7ce98f9017c849dd1f2d2e371f43998a4e3dfcef611e87427ed38b82f05bad3b595118fc73faae129efd1557f6084c57e543f778d9143216e0394ceba488f67c7778742543dbaa9f3ac8b64e7d9ae0e5d1537e99ae6b26d7aa78f509ee234ce555293357ce703239aa6f3ec224d47d9515e64c7753cb58b6447edecd5d5d92b0d49deabbb57d88f8e507ba5ed15de1d805e9d024ee505c087378b261f1d737e3f9d397d043aca37dd41d3dd479fe79df47952a49a4b07634b8b2da76de618be5c90af1b76103855a4b67aed1c3b0899b641881428e376a4404654499b730a32b0b739e89b7f8e37ade39fee76bcd3f1ce330f08e8db0ab57d9fce5ea17cf6d1e63776e7dfe63b3acc1edd73d4a637cf87e6b63f1d077dd36190a2cfc31cdebd42adb283b0721f0701007ec3e3070957a8bdcabb8395fbf891cf1100b608dff98d2dc2839d6fd9b3cd735087a0ebec0fba64707bbe6d24cf51b9d321e87d5d8731eefc73fc61ec5fc69d83fe619c71f7e1cebfeffbbe8f0cd0e583de752ebdeb400c7e9f77dd0ae5abaffbbacf517a887edaf32e8320083aa83f0902082008ee50fae81bbed200b8e1473e7e631fad4070d5c10df7f1a31b3b52209fedf9d16a0ba9e67726f607f808c3e2ca6310cfe8350209f2995b5a6f90ba43212e44f53354fa39ab74e95c62c89758b080f2d7f11560ae78bdfc544882d2f3b8a75a798fd7a80029fb86b3def14e834f2f7d3b6346cc6730567c79ea1d7670c7c10c44c7519ebb6e67ffd0d971b2b2a33ec73a44797408ac5c27ebcfa31701b9ed0fbae4ec9dd7a21ddf3ceb30c867cfbca2cec1ec31ebf8b6c31510947f9b833b5ce9ec1fa81d27ebdb9bc70ff2a0e710e51907f257bee970f39dfd4197bc6d21aaff1c04b2f26f23ad5c6723d9406921aadfb610d5abbcdba110d5dbf0e815e8b07e0da79e4bfeb0b1eb64a9b65bdf76d8b3e364d5f03a5935c0227087f2798a78dc731e50da6ed39e4baf28ccac3084ffdc7a45f43de91585a067ef367d9e1d1679cfad5baf68bee75b11e85984ff76689d087d2fac9395daa1d27b3ba553de79b74322b4f3ce394d44fe46a4fee62e31f2ca253fbbfcece046c21374f918097b3fb8cf170ba6c7f111768599bf1eb5f46bc6e9afe34e87411edcd1d9d961be911f7494fbe8db39ca73b004f9d9abf7637e76e97787d8f30724cecfdb418df24e53ef07e8a8f99d9e9ef5f41cdcaac9f27cfeb791b0cb6e0b513dded763be615018e4a3578f8715a2fa12e40f9ef7486005152ba058e10466c56b090909ab42cd478f9fab8b2e7298aace04154d9efaac585a4b698d9652af35d65a6b8c34da1ae3a4b59bb39b2c8981f428299d74ab71c63867adb5cef8319bf407f56c73d5bb4a69ac91d61a6bad35466b87d0b7d3baa8ef9f7b4faf3b4a4c254a29a58bfa0443e618638c31c61863940e901f6747271551a40342e944ea87998744ee6bee72f3995d7a3dceeb91cba6ceb6bd72d559a70eead2ed8ada3a93aae6994bcd5a5f65765aa9636ade4eeada9529c03ce75d9e3a34cf324dcb344dd332cd87f5eab39399a669f53bf9f8c796d1ccc480deda592ef342ce916a176eae3419cf5a6bd5f5533d9a567d1804dfa5d48585391f2a7579bd9e041ab91dd6d7ebb53dc212afaf4e8413f3caa9a76e5e61747a7ddd352406342531a01ecbf8ca9372a538aff2539a6b3aeba478b8b89d4ed3ae2d72cf5333b2cb78e349d5c05c8a27bf2c27bd9ae995fc211aebf5155e6d9caf2c9765b26655e37e6835168b6179e90151eae2e4f5242879c9f27aceabd7836e797dcdf2faba875037afe7f6d7490ca816599ad1a15b447575ee50cdad0b9bef72a6e59b73de329773c6d9cb5dfe8ebe50031fde6903acb5725ce52ae636cf3c209687cc21739e7abaa7ccb22c73755e7df378647b0a3858d5c5a9a366d5eeb0820fba84584d46c2dbd5adbaaae757cd358dd361e6dc2a1b425f0b57f8fa6a5bd9eb2b796bd5f1b9a4afb5f3a149bf765c8ffdd8cc630f398c77c879845181e5f1dee6d77da98e8229a5af74e5649aa24b0dad53bdb232dc3cbc1e6a1e663e9dead5b67b70efabbb7b702f7da5ed1edccb7801f7f47f88da212ebaeb7e810c98677d848d71faa8836386ea26aba63c8f3fac789178ea170a364fbd0bbb32d9a987048a259ea6be36c1049cb75ebbcde3d7acdee93bd3f2c53c3d751e27cf33a9fc8ef70499ad74429163cc08950f6bad633ae001218278e9f14a5709118411506a48410634504c0f8868822a528c11e28527c050d18a1e83d0988646fb61ce171ba899bb831c27738698d3036c0e94394c14c7a972b6904326f3786459a65d989c2f72788854a49623c3a7262b4a0ca2c7f0135a2a4fa7acd25fafd7cba915a5474f8aa13b2a156e8742db0e833ed776c8f2b25db798a06f47969779e8aa4a85ee984242412c96ab54934aa5f254a935692c3620be94fefaa4a6599dda974c92afd61005a24e89689fadb4cf36128fb987c4393fbd0425252f01bb43f96ad1372fbd6a3f5df1cdcf0ac8711259514705e4bc1059f1c3e8c4530fe5124fbdea0fa8c8f1cdc70f23144fbf587a03660e0c67b8b0448b7211628d98d80e3d84e1d2a24574498108da8c79f2a1455d457728e960258e151ddcb401438c1675a73b62144a9e40814618342089a2456b3052450b489479139bd2a21e4477587084194378a922091a6b5ad48a27217268a1063748bc69511fa23b628bca9d17081c671742445d4ca955913539297cf863648cd624e7c87f65448929c100cb0287129ca0882f2ee010660c228c48a20c1173e030b1000b166c68886920c90c492c4901142796108d0007296a96b819420469ac711fd27c58c48ea82c682f1375d44ae78f20bf01516a2253c7f4307aa4734697932a89b3c4cf8f17b5fe7ca186c279b270cab83da481530507074de7f190c6563acbc411228e9527acc49142cbc4ee0e69cac479c559210e93130b5ec627c779fdf4d48f77c5ea1d511046e18418497c91a20b2ee03861e50338616e90228831395401070927d240a34c1a66ee0e69e0040107cb8cba8218134f624cac105b22cea7b0a83b9bb1959a8968bc114144838ab75688a8898bc61734b2f040c444126fae68395c3766de3c7113070c19148e78018c2fda30bdf93663886932022fe6fcb046078733a4b09d1b306758f1c4142d69a66cb1821671b0a0d104196c98608121093766bc1b9438a3ca19469c21049921b4283a1f6167b4f03d684499809532348031c5112d2e2000a6268c2dbce042a5091d32152e42668841b98c600d1919b85471821adc2451f20225892e496498e10a29cc80e24dd1c2c58c2e66446186139d53a5617289b76ab0329680b5814534965428e2862f62d0200756061a00f0a43481a1f0c597248e2041145a6e19282823f60411424243dc2b644311657c710a22f6e68d0d3e60505922a5e989112978513e64bd74e9d5f0d2a3f42b5d25a51242082124845008491c298119166658a18a0cbef08105187038e20ba6a730d913991af64989fbd485ab639e80c06da458f3d48346431b2e3d9daacba99c520509e510ea523e6d98a08842861535c04046096c80818c209afcc050c9d8818ad7d43dd19e62e09ea87033a81c831bd818d9c204b1a614e29a2c48a85892040e61504183c3208007656b9ac6bd10eb6898210ec258228c299ed8c040c612c7065fb9c20c232d40818e602246914116c0c70b3ee6f80204e0234b7ff4209fb742461ec40b6293b5791824cf58210f62038ca403241c89814fcf05a83957ef76586378873e67e887728e84333df5a19c037e28cf781fca397687f4e5fc9c93449ef3d3e596cc04372cba43d5674ec50256f5310f6152e9e47d6202397979c14a991c7a906203302d7828a3430a6d584881173d3258a1f1c98a262728399c09d3e6470530a23882cc0d2a9c11c68b27862b50a2842103a70997265f5290614c162c483c39a3a54cf660c893076badb5d65a2218b2b59d76660433b4a0448c2f28b05bc680e2081ea6c072a6150695309abc27b793a206229e5c41030aceb442d55b2b98b042c314629894d1a515060c328c18de5aef85b7d612c59063ca7bacb06913e6d49924c4e4bc13770c4599adb24f949c52f964b073f090bb8f303664887ac8df47181b259ee84ad63ec2d878f93067150e962a957d7e38c82a6743c4872c31340c2ce79c97ee88b95a5a83881066305e309dc8872c3d046d04aa5f49781959f5bead96b66aa55a5c1bd8dce0260a09ddcc563a6de8f90863934298284548288ec185044ec230f1448d0a5b98625872a50c297480e2e43dd1792e10514416304a46107b938291238660b3d4851723b6d42e758e79f25a0a72e0b93670b0e6e9b34a4c96860d295802c30529b0308c784d238ac1863567d8c061638613d9b0a6024a608982c9182e2824d152ca22839133495cc1a586245ad355412fb910128272af10d10c3f3f32d4fae3b540f484e8c90f910b423183ad71827df144adb03562bed65a2bd10b77f511f645105f60099a4fb31a559fee192d49df7cd541b629d0556fd541b6ad1f59eb5ce64cb2657d73aa65cb6aadaa8d740831354314e8fad0246281f3200a746975ea95bb9546a739bd4a8f2d9ab9f54bd5e0f8535d524e635da4e988db514bceab1f715ea773beeda3cee94e92deb9e7dfdc395320cd1d44f538ca7bdc939a8e6af874291dfb91748c5dfab68f54aa6d2477521005d21ce53d1ba5b94c9a3bc92990e63536d59dcbcd93b257dff611f56e2749271448933b6bdc9e3b49beb693297792e733e9f34881eedcd1743cb6a4b6c393e2f1d8925a6a88561e9dd4649442f98e2e829d731d5da4e9086f49c58b7c5006b52305ca9ae61f1891b322494d1ec496f5cc638bdb45ac47cdab839afaa763cbeba64bf742cd17afc771c6f959710ac89675a253230253369e6347f279e7d65b75e039f623efe8db423ee88e4a2f7558a78ff00752f5cdb98d243df3ccfbc16939e7397a9dc8fc6d6790a3d61887d039994c59160b7b1ef6e855aae4d775b4235221872c16abfb3ea2263947cda1410635003560f256cea09ef39f779af7ed4891743bc76d6e52607cb50c4c9a2e9f656a3d4b9a5987499f1d671d2ab499d7c33ad2ca55fdf3ea9f6747f9d448791399ffb9e756237d1edfbb4e64864426a8e3d440c781643e43ead933d7d14cded2f14f8749fff9d4a15292063a3b29ce05584fd2f113e25c00cae35cc00724fb5a1885f2eb9d9207a43a2a7b75cdebe179de9d5b0dfad41f52e79b7b7ae5aa5dd28744e6d32c93568b3686e0b431c0d2980171a5568772ceb891ac4bef87d2cbea75bec20e7f847521c6c9a8c809d5eaeaf4ba8aee30c2b5b4fdaa6ee6886b59affac5b564b68b9c106f3443ed7ecd49c76ca9ce85181e484264d4d269979a3ac21f9f8cc345e05edb1e904e7d721ee03e4aa1189a9f9e632309a12e6475d0d4313d47063fb707aa164daf8ffb8b76459b52830e94d6907d8475318396c36baea189bd8d8fb02e5e5cbc89e29a438402d10b0e1c22d605c7f533a5cad70646cecfb14bec494c1bb43a9f3ba9e968fab7933e9f47d2e74eaa3b692791ad6ebac49c5e5d576ac9175dddadd48a1448033d040a54dd933c4f6afa76d2e7dbb7938c2850f56d9f0957a65c20c5c94d9229d2a5e40a2ccd9b335e78934525a82002092466de7021442bcb9c2cf9cc937345b610ab90628a3c430a1253e23831458a04134d90830e535e53b250401a4152cc4c29228ec932650052a66821d74434ce4833229b23809003c31429924a2c634a97292829d32849166301cc8c561821f114728cadc0f4a834618e3115dc7c74ef3df933632a2cc59abc900685c55634860a48c4548042a8688cab02102a54114368882e7260d852e0e45ed182164513274aa0c296244c8050a28649d3929a18131b6aad456a543982aefd186302e5c320ac432c852d5200b324968219cd7be3051325bff33196421ba13454fc146d219441996ce3636c89171c2cfc31b644cb872c99468dd647e561d040022742a8b0254b09bc2f9a28824a0d66e2201147878985ce732384e6e98c0c0d0a3635d73b038df631b6a4c9e9d6186d8e20a12ed46031440b478a283384078028c2cb9614b668fa218c1dd379660cf11589cefb185b42650517624b8e3019a3052ed0acc045fe186322f3ddc718d31239e854b1798929598a257121a6e449111a9e8f31a61e3efb1863aae295e1b6888b1b2c530d6f634c528ad04429a594524a4d4a29a594524aada34ae06aad95d24a9b655266d2da5ac29d5a5213e01c387c52d64dad9a46a94629a59452ed6ad56dcd649b2a19ca4b974c1428ec389f1e242936a0fa740bd01dd86718dd681edbe8ed5ea754d3e48b6a6d67b6c62228f2119d32e0f813cee873871c662046c76f78060ff871eae33400db6974f20ac43c21e439e7dcc7397523ba43ab9cbad4121bb0e3d439a03b809c7a087407cba99b407710c0e900e495a9636345271a4a2ceea15be0a1d08712cae69a16222444e8b16f5b2e417ba4ac08965553870da78e6de850beb0f50a4229a6884cbe1c101949adeaacb3b143bb8968afedac5369961eb280085b4a27c9d78e4e16b9849667da4837120e0134073a0401fc68498502490f80965b2890f42d5d7ba44016dcf0b9f2d2574f38d4fcf8a438981c983a3226513401c6c78f8eb34c4a39e79c734a4d66b34adebc02f7f1508ac932d63975d9e686d3cca51ac9e6a97390edcc8ba0c8210e1c2111ede5936433592f6d424e9a2ce9d2372da14c96f4aba59bc9823359d26f4826e944ba7919ddda2c9b73ce3967b62b9c972e259ba228f21ce1a798acd433412762121b0c4c20e941a6c097ee586ad23c8c668ee68ea309c4010592ee814243fe75ba4ed6c7c96be5f3ecdb9eb6b186102f907e0255c273522175ccd8b9e72a11620392e205d2439610063a5fe9eb3e3491b418fb1b72f0a13cce1d3ebec3737b3cd21d007015e819e8e19d40aa7d43c709d4b36be838593c3b54fdddd961fdeb413a3bf4f98bda71b2baeae9f0db4284aea7bb6d34592bed928cf409347d1689d134362f7b66063313c56499d164d51863bcf129c864511c705413c9587b79443558d33eb05b1ddd148dc99ca379ebd7359d3a435b984eb4ac2896c33b75d03a3fe8928ba4c8a174b2f9ac6f47a8dc7463c2171c5a78dd973aa6e2042a419b4ea240aab5d64a3d20f448f76a38e60e94671e33576599b3b20ca5e304ba38febad769d5645dc7fa47df09743d84c7126f22f6b1739b355997db3e59f36e4ddbd7d2dd512c7009f69168c7c56d0f4d8c31c618eb30e8ef646d9bedacd78bf1dda13fce792b0a933d68eab89f4f17ca204f16fe743759d8b147ec9d754e677b7735092a43e64a7767ae599bb9cd9c4a0ce68f2b8b9cc8954791135d77efbd40cb9c522f587afc4152e5636c09cb87e047cff13176e48c8fde8fecf702721cc23986c839af1590807d337bb3d4645d0fafdbdbdd7bef66b78d007712d4c45a6badf52226d9c77f5838b24931086a820f8024cf8fb1244e5e7afc36f84933c7318644cb4b1caf8ce3679571aaa6ff8c209ffab6225973cc8cb2cb54fa9a7775f5509a3d2a9722cfa581af4e75b89fd2e9d3358f47dd3bb7802fc0912f36409ece15e0880ff15b1c2fb0452964fcd6ba1106acd3492b5046529424b308706f7640c83dddc145202e5e80a3a80439c4f1d47104e510ca600079ba2402f7902f804c9de7de9c553f5d70f500e4a5264b8b98f27430b887bcdbce9a67ab797dbb77facf25826bd6e56adf8aa6f3f455b655b40849b6fbfacc0247a969d62bcab24ed3b43b71c0315ed405aa8099acf85decc8d3cb2ffa2187f9bd266247d4481224a59101597a8c1d51f35272c16e010024e823bee6f1c7f3215ff38a5a59aff1367e65b794725bb92eefbe91979a668c3e34d7e0ed9389f02ac71bb5d65a6badd57fa4d711e44b973ea59cb4822025b887fce899d3386de4a5a66a7da969ee24deeae60232d7f465ca34fe642a6055f621bf2747adc60f4fea003b3af74615ea68c60834773e00f879397acc709763c55c5e6a9aaec2716a30fdcebd9d202503f0cdb1e22ccb3c4f56e6a14a173549c9afeeb34eaa65eb4b4dd47d26c11df5e83e3f9345dd27ab88490e7d9e5297d3ebdc56321f9ab6ee2c0719c1455eb2cd3bb887fc9a698e35c9eb630cc91312279b79368bb2e4e97604f9999f7162c2e6ad683e34a58e31245a3e7ada9e79a989bae64333cb8f626203a20e89cadc7ee671b0cc1fce4b4d7227f1d69d0b98bed4143d89b79aa4471d73ce39679c3fb7e7a3d24c4a2d947e17a150d444deb98c7c21060421004865e36eb1c678c154b27236812595a2da513aa79c73e66a5fee1b671938ced891d8c79891337f808f312359fe5e23997a982a613ef5e9fda835697a406464d910505a696a9ef09407d56145fa943e347f969aa427f168a5b6b8ce4dadb5b6084c0ebb9f4560e8f4a2e8480e53d54a3ba668299331c73a6be6144f3ba7239d80688e5012a233a2d3a55acc729752d2d2c598264ab8a0f202194a2ef0d0c51364ecc0041a3e785b82a24c771b7efabd1f63469e04259155bb199d48f4408394131c41860b4dad50f54656c876e88e38b3c60c21b0d032822a53b4543ed4c8116cadc734de7abd73dece34574b7d8ca190460ab637568dc65e4eb0394f28f5c0248d3170b21013c3a2049fc5504042005a945690c28c355f6448c20a238a5e417cf73186c20e643045e18954218ca1b0f4d1bf8fb1579b975e27d39cd3f3212fd53ee20f9173648cbdd0c45e62ca604ab59deca8c4ed74953d0c992a1a091080008314002020100a070422a158401e51b5b0ed0114000b91aa3e6a4614899220875114045110429031841062003004110308ddd4196848475aa04346e6d0a02964d2416e3a48eaa3114b3c332d0dd54e4a0b82d4a039c7203b236eea7808c2671cb37707897ab4dc48c0b74604e8cbd347b869126d39ad4c9a25cadc3a4a3fb20bba712915c5907369a399cc0cc7373a76ef0e92f469dc5d318d0f0d3a25ee1cebe928373888d04b0bb1c52c19694b0adce2787a7718d28d26e89291b969a01533ede0160ebde2408f8e6fe7a0671cebe978a3e31e1d434f0749b7344e5f46e2a4811e71996a24ba2422d6e671234442c75e2db46233694b1097cb230831c83e8bdae9b1a3e5b45c236432644d99a8c61cfcb10583a2f5ff495f37fc62414e69b1fe128c30d3564dde2e9c2a6dbb916003c0da62590bc5d6e2ae9ddb639e83436e930cfa1eae990f10a859a6f741fe3e66ec57882b0b7fee9290d97ce6379f49b4af779d5892c4864b8af68cbd59a4aca8f086372387f6919df163c6f332319a7011b2a425d05d45024de8c92991f63af5061dcd6480c80a32cb44a0b6df7973f3ecbccebed66cbf1614651e6ec6d3d186fcde6ea8fb15ac67efe27cc2433f48e330015fed674d85056207bc0381b4dfc4338cc0fdd445d904e9987281f78bfa9e93f6de8d12b14c6e2fd2c175edfd370f556202357bd0b8665d9d50e1346b5b4550f05395ce39b2e44b5a047f4da46d0794706c49943887262d42a37eaf1c500fae87e796d1ac027df39a03697fb1c669ab2f1fd12e015ad2b720388bbd4a8f3f47b7094d8f68e271da274c02396c0243cf6ada86aea7d6ce757d13034066df74ce68f1faa34e181fbcead5ee32bcc7a8acf982b7b6e87a91bf6709c900b18f89224a4634dbed96d3453e4d2a8bb7b27dc8855464e5c13ba49c40ac5c9b37d7779e1e92c1adfe4c900465403a7c5f3b60a74765e1011b4ce0cccbb4020c58ee2019c15743b993b297a4cd8689273f8fc850b0d4fe9448c03442a2de40dc96c35b89045ce3b485d4c475b05f703a050b765466c2059b5f485fdb57e07ceac3f0db3cc9fb4c056e511226cf4f11ab5cb5bb9fdb55648115fb391eeec5aa37c59f214e08ab342d97f6d7cb5c6a9edb0c333ece03d6add53ec153a19af47788f53266788bbd6a1d19b812a121f6d006495f4ed1d3f36a09b42a919ac575f09ee2588eb0090d92733ef28dd6bd13d40e5887aad52f3969bb7bfa2f9b14ca21b5873fc6bb775f2ebdd09d59a9b4820515c1a16d30ac24f7a9f25ff0dea765b257efe9dbdeee5d308628dad008e3b15a4148a01a90d273401e4860e0d9e223a5e5b1f7138fd9bafac6dea98bdb051c8047ede4c331c461c5d12b3398cc8761fe50c2c9c286aa5d209e7bc08b8101835bfd633cf5ea20d67e0342675fb45dd6b2155df9448c76cfaea0620a35abd63c3f22c1506d003f3442e815e8c727cf3cf893d1618e669ae144c230a218ae8079e46f98bf47fab03f751b49186951e75184d2fe1769e388336c5b763168ffcc7d436811d04f49c70d78c3f447a6ea44a309d414353d5cdf5d0f8d5bb72f38a430fcaecff4e686fad995bbd444e8e444b43096c6a803cfb9126329e360d87b25d6d9cb5896fd07f1eec41d13656f7703a530701f70499c0bb23e815e7018e46fbbc1f95fb129e9886443e7c6412f22541ff9a713e1ca4ffab81d261b0f3ff3bb42969bebfdb9ad60dcaa6801b0ac2bc2ddf54965f40e3bd7629cce327e5a607cc0f2bb0ff1957de2093a524c7199f9112c3d220b302b8046e4a8dea51622d9dbb0e83f95e42b8a9da43d645b4a5b49182eea84cc7f95393e06ffebdd4f0a2f8d20d3e24234051ddaf91783c5b170b3b0df5dc123a49551b4a2a3fe7a5f8e8e1d2df6874d306c47bcef399ce616f7d825a492226a89523bf5007bc6992611fc003472a794102442c0a59a6dfe7605b6ed3b3be61da126441eac9b8f6e43cf72d319f2e00e0064132388b11235713d68e2d0f0991b31f2f3142a61f860c5607c409c309f1c7de9f3e6e60f7763ab90ab2f72128a2109e25f27ed588bf8b5bd0b7e285787f0469335f3910c70e424b8ba10356dc32f5ac6167d48218316906f4e996c3918043e18fa9b67531456de1c63596f3b0e50eae11a620be6247ab10d8bfff0b7aa24c45c74ecffa3c0f9f86de75a0194d1e04d27e156766873d4325cdfde96d2db77ff94d5ce96663e562da39828ab7550c17ea9d28ba627a8ebde0ab216033522c1c14b8c63e05d44d4444b15ad10c89110140fe56a889f30e031daadc1a9575e276f8a61d71bebcb81e351a3afc0f54ed1b416ddbc61c0ac510a988a2c3cf1f63751871e19209688bfaec5b65476daa90fd383cca15f714623047013312d4be0c8d72edd68de079419daaecc64e52193271e3a23f3d5e048f8f5f341f7504cdb2b12251ffa75f2ee8dfd39edc999a9737b8186181a11b068a896c8ef93803b6a0ba87da9ba342141a9e2cf17e36bd1d0deb6c62393131528c25e9c963376f1d5567c011d1b5a3c974a3ab5275c16a38655234db6b491bff6b919112b96459d061b67bd849dcee27135af3e828b8c34c0a7f702e3546ac26b418f589a109450dfed42895996cf93168a40802695fc4f2d6e2369a131bc360cb75c95bcc462659b5c10a48d290024d294c54b3bbaaba064e8700d5faef9bd031c0bac46ffbc8c363ca30943aecf2e4dcc4d89f4f6b84a4382d9dc4d7160c4f697e3e34b0f3a23761aea9cf43d029bf2f5ace4239b4cd7edcbedf22d14954e2c87eea66f704de4ec845cd7b9bd638472b08850f1b331f0f53c02383a54d04335a665d5519d0587dd28f9f9f61a066a2d7a03dd201d499e5d803df561796b32b02baebcbdc50a15bab66db0da763fe101d96971f4518c12a6d1b40def959e569340718f626eb28bf0ad6def27746a5e6acfc903b264820e63e94f375d78a017c7ffece08bb051ac74bfdedc040e402619d4527382f05209bb649e5f740c15792858af8e33d30ea147fdc07c8ae6657173734c0b264433080a4ce26bb3cbd7ef7eeaef5766c9782f38b1eb774f9ea9e3e030387255e521278f1c51bbd1bb7a5dd415934793003b62aa1dc43ca5c72f2afa39da1e4018f10435cb443f664c7129ee93bd57446abd495f57d6847b622f1f659c7c56f5ae62ccd39d3cea229ed1fff4700fc7bf1a08bc1a592905b248fee77f8e5c9748b53279f17eaae614cda198c71e15bb46253768205958b169f8e936d1f57964bc6e447fdae3497c4c8b540ada6e3cd21a96ed3c28f64e20db3e18982592cfafa4289d822a40512cda5e5fe9024509179fbce8fdcd85c2e89674798edc04936d5b8debca729dbaedfa3c3c7b0e06961e41714b19c18c22970e9556a30ec669163f9b5ba2d83402ac32cfa1c5be30ea6479c1d7f9684ac90c1bc84665551506e1ba1904e7a229bd2260e310a296a555f317fd1704a0f4324d7178db42e889206a1773471ba8288a414b4c9105ad4c13972fb34c6321c256a5d8e8b53d354bc96bb6090f7cc749a0222879b3f56ed830ed85821fd5977a33e7302fc8de709bc1ffe442b1b095a595717b15a97e9bf7e34d93e19b025976be6e351c86e5315ad08dfb082c25465887468e98a854ee077af2dbb999ae818e0532d076379aeed6c8b3983c2866abd4537d960a75009af078d9981f9f3b5b88d308ea9584f0eadb10eda9881ef01b5392a3a3a3e18d592b9d8c271fb0b86168852af5d3764889e5b46af61a2663f1cbce7fc9b3c1bfd0e1fd41cd65a0b2a960a0cc37f0323ae1841625858117af39f388ac773bc1804ff8c7a52bf2e29737297e249c87475fc16c26edfcfe623692298b19f2da4d456e0317376ebe37b68c15b0286697a9dc5963040415a655e60cb60c35a62bbdd3c72b241b2df063cbb72dcd11d20c59994d9a433dcb3f12f2a20f17ac15e7c15b82f383b3678961094704496ce3fd6e18988f17e85ee3aff946f74babf72181e3260f743b563fc0a6cf7a717d15a5dfde838595ca129d5d186c3d9e3166b3c5a6e0c704812f818c7b2fdf3b3dab6cd093e599e2f4d79919bd6d5411106c4ac2e2aaba36dc9f460f3b461dc74747f783f666d442fc75bd7a454da3e826d0be3152d68dd464caf2c9b6a7f4790852fede4cefc144d9da20bd7c4d88fe1802130002c5746f16e96fe107b74fdc9f8312e2a3413d41ee6c42c5236907a06bc2df01ffcc91e3ffec58ed6a3dd9df82aaa7e81ac9b41a04335a4fb6aa7ffd9f40aa85ff06b3f692831a49cefef7ebd27320221efaba069a0a36d44f3373814331e188e2586c940a8b58b314dd7571ccdea00c42a16865aa9a7d149aaef405e82c689500525d063ea7b2bb2fb7d98b9fdef637594ef0aa123beeef7277e2bee8cc919ab9d0a7ba7b45a8b65cf734238614ac881cbc3709cb68dc066c0fee3ae02ceaa93bed500f671c1976e9156167103e8e0a18a8f39b9c1bc38b3dd8af353582995deb568c9ad2a8df44554d9924002a791e7de8ccef2dc219778513c4ef0b8cf8619cf4221685c2692f6aa82c8b249ac0a2502f79912ba47b735c7bc306f9a9d7431bf22ade854f19a5695ceb376de3353c54df37074b2f353df366b34b4fc78f319b5c5ae565d0e40ef21251f94082d6398070d3e895ba62e624803c56b4245ef6ba3ea3602daf70be38a64a21e1443cb678d27a2c142829cab825c55cc7c63c003d6a1b3d63abd1f288cfab01c86903932ee8a5433357663f154c374b2a253af08df50cc71ef1f9963ba24daab508bc7205b3f4acb6ff8482e2fa10141077281f7f11f9ae5bcdadf21e73b30e851a6666449f556e19945b9123cacffd0fbe83722ec0ebf3e6ee947e87fc1c9fc34e8cac9cb7de278e241a8dd1fcc69b4c5d895fddba9a95f0ed1e0127c28215f61f3a6293834569a30e265c10c51a13dc40dd64bcc06c8df42a446051220f11789a0cfc2ee550d0ddeb89f6073e022444be21b0075bf151ce007de4e283e7e060cd2fc2aadf2245e6ee6efb1fc4b1cd650e24f8db0ac28feaa9b84a593d94d3b0ccd0e31f376ab8be494586f04ca50d55b69e4811ad54cb16e609a441a91105cb06a878098300361082c7a3ab14d15af1300893309311c74bc741a599e9d4ef277aaf98867082f419d8bdef642342f5e51a2ac75b46ef37cde7c44c292d27e982481917f869521b225a5bcb45d5c87e4ac272f644ea4bed69607cc16e6bd8c897579fcffef8e5239398c2f86b5824d53a0847560e58d39785cd23bcf8ece94ab4084510d1bd3101455e597f12bcfcacb9b3508bf00aa4c7fab2d0f72f044db8cdc3d3d817e6408afc4a69b2f6af13c171b84ff00a6caa6451c478d1748a9b3a9b82e2200105a5f28584024c43698b85b08933a2210ddbb7b033e2da46bc7b125a8f9cd1c94502b1a30203ec713aa9b83fba7ed000af2012b2199094ba8de08e52cd120fd7982ad274a4b8d054bfe014e050530dc4d463af707c64b8cf4a21bc7b90e6bc40bbee1178c725b2149821e1eb90181ae2fb8aa72725109de8f500c72631242094933649b405215650d514081ec4dd2826ffd8a2a519525d2a2ebce1b1cbb273fcccb26bc1290e3389d18c4f88e369300825f70dfb4525b2429e0282e5adf86882bcde7f60f4144c3ebe73d54d033358bfdd7fc6ab0323ca9ad4eb1a3ab7c74a5dbfeb04e9de2c597bf0a0bc6c3f222183a9c2a086837508180e3d524cd455948ac93a639859398cd21b332b16ce2181bfc3cec321ae67ffc0f8c3efee3478091e89dc46af93247a2e185686b7d12f09e2841e75e4530bc57cda750a4e84d100b29ff047036189ca5fc86348e588c92c2bbb28f6e5123b668ba1b5844603b08ac529803788c18d0d2e869c5056b29708989248d494d4b6fe20ea1a9742a9d90f07fa9140679c5b862ec1c1120828a6d28916fa650639847b2ef4a3fe436ad5dc15960989876eb29d4c021c0d775a11925915f0d57061f5d61a5cc935106810dbd817abbb418bae6abec1043506df9371d33f574c56eb41aff228b73455f6db1ff2490b55c699f88040073428620de0034e2064c229753b1c185f67ebda092df9190dd1e983eb4f0ff814839c0a8fac6147c8f2666bb592a3bd2ff297eb915409ed0be182d44fcc1353149fc62b5851b4d017c6541ef18aa5e5f6e5fe2eec8f9c40056034531581c5ca49cb83bb0ba2b4c488f7b3476da19e5bd2ab04b6b59570a75d806abf8467374f6dce0e9b1d479d6d39db8e7d2ec1bff9f6fecc49604ac3facfff6ee1da02086789cd9a545cc783b6e7124d3f01a730ea62382f89e078af40297046ced302f04012bdde2a73814e6ecf6049a1aa7e5d1edcad2a4f9a80082646c5d79477f2d35b28013a55e3cab908e505a7090ae486981b863056a303b911bf28baef5e30f1f0f76f2770c7a19751f9bd76be2b9abf604a5b37b01ee1f63345059a094b2bdabd4849db9db6bc4d62bf3eb8c41d8493c57c4cbd018b4ddca19b2b7c2471b8e1e30bb1e267277ce8f7dd9f63806753224593c3834682e94625894dae5100f457cb5a554a766787b5f8add37614c7fd424bea617b03c7f542cf52f0d980868bcc76fe7e907cdb30e2297725a6da77ae8d8ffaa00ea322add32633cbb53816e8e72d7821f470835a99d1f6258d6f4ee73661e08e0f141abd41af663566b9098ae9d3974792a45c79611039ec4983d52dd33952515c1df684e0f474648c9b6df72de3664e61cfa04d018aad76a7c14c6f301b3b9a301fb7884a5ad8c8f654b09275b7a2071400ce967c84db5cabaf98a950d7b0629f274484cead6236bb7c2d62974fba67840547fe735a8e74690691909b016c538791aaecf1110595088615de4c08b0eeaccf3e2456355087f95c542eec793f8ef6379de2782e015abf835196e25b8f1954a931d58a5a13d3d70920b9facea2e36362144df468f0e9d38b9502f9f94d0e0b18a5c8b0455d8cf03c9b61a19edce72cf3bd6861a78166a4c2c2506aee78a01a589ec283cb28430e0e1dc057b01d1b7fce9e891af1395a8e27a36c0a85fc7f21e3ec3948068dadf782ef3d2efa2dbbeb6e6c4a6627c5fc233408b9de440eb94a8b05f8d46b9b01a175b2ae9a6b3b77426078f0a70edc0ea8ac101d7f15f69d80acc39499aa32a45c15e1953020ee39e4643690c7ef15c081de62d07d814c13ecb5dcc10aea2445dec791662b9f4a3452142f1247c95be69a9899337c99f56e10577966c57cd5e1a18634c126b04dd6d70cf6d5386fb1d41120c3404bf6c4aa690a27730f31a5ce69dfb3df9b54a002028d7e747c8706b1762b2fa53d5ccb835abd43c7aaf003dce2d8591c80ba0d0a85e8c16113f5662a1141ca3beaf4127bed23ea8d1dc7cae0527d9f22139e41bfba1d9460e887a3cea1c58369a5c3e8c803b9a44526d3006891387fcdcfb84bbe29bc31b4effe3b5998f9c6be9d49ac30200ed1f0f1d709063db35defacf189ea8f1f1d6e62f2c976e49a40915278c7ba50c4d358eba14daff8c4f3a15c4a3c957e66f406cfbf45c82245d08772d6d2b5c9a595d73e0c27239280f3b362a41f328e3244764b4498a93cc7c618e76eaea09bb08b6679fb9ce55e64de1fbe29c0471f536f0eee461bc30b1c5a1ad99f97a6ec0d1f9e83297436a43f1fd29c5b2712433c69dd63ad19080cce9c58229c2c84815207e77cf43a0656af3e687509c3e8b12fdd64a61200f1dbea9a65fbfd31560c9b08c7502458205bb73c47ebf0cec3b8f3d51b8be243fd0158a0821bc4f8eda48db3e583cd99aa3a01fc2c60c82f0665067a6af8e4dbb4192d1eb00e2e5093d0ddf4fe8af0c737817801bd2ea8d5a62b276a50aada5e9c7fc87fffdbbff60bfcf5187bbf0ae7adeaa8daf148da1850ebe83258add429c938b4bee5bdfb44ec237a293850facf0c3b35ca7f5e5ac3f35047c67e5032383b0ada32b20bc6466513330ca9c73d323bcf463a26d64452bf16f0778f2dbba3afa40b5d4a0e039961608847368ed851bb6b65a3627d78a806336b2962ed5fd195871da7942f26d7c05ad188637d90976626276f0a86bc3865181c28e626d8061773bb9b22a11f542f54fdbc626c4f53784994705ad50207b9af7f78d2e145b7c071752b1607cdf23bcd058e96b8b86058af5c148158b8ebfdec7d095834ae16c95a913261203ae4420872801684d16aae59ad138d1fe0d89882b9d3a3f32ec5363b78bcba54deae7da56c97b7101c1119f1525d685cc5e1d19a6ccf53e99697e46f99fe268b61537685e9cef8f3d1aa9a5d5b8e173f681c5830bff6cd283a86c5f18b35d4a6e1849198528e6ca2f9c0416ff38db6d424f88440ad6a788c040b87f5400f3d46e4b6f3628f6fbc622d70e48b8ecda8b304a0b2a9628e01ab19410ba2055da429dabde55efbc07bac25eb83e938280739e8b4c173ab5c44f3d826ec6abcc639d0f63703e4666a386544ec2b0dd0003ebcb8983d82b688d435b126247f647a2561a46df0ff3cb718cbefe07fbd67ad29718c6a13d3a0ba9250ce3172bbf1f42a38e74098334ffbfc8630049c9f2b49dc29f32d9e141fd2b5d150c0954eec582c047f52763bd2d404ca952ee038adff183c537e95898a9d67d3d8a2ef0ffc8276b0e95f54351287fc6bddbe4a81265e172ad1b5d2a2650a88c812eddf43f70788453862b2440138f0f41e622e4422af1913dda3eb158f63214feec650499b080f29886c4fed7c7b40f64d62925542d71b62443c943838b07e9e03e9463375e86e6b7d8086621cdc8d911cde5fa71ebb0e969420cea12d1056e643623991766af16ce9a2a8eb18277a7f937ac86cb57218c01228fee52839e7c02fa3979624979bf912888a49dac9c999b13f68fc7889ece24d93ca2c935ee0e02a170612fbc73e391c04c36fa146791e768571a8d6e39f45caeee44b7c4c14c24c00b10e3030ce99556ee03cbcd2e5087c04f0c3f8f7921bea9da1dcc2215637e83b8f209d4f2240ddda8a797ff3c7bb0af66ee66e73043625f73865ba87a9bccad3119e53f2fdcd7e37106a9bbabac2331757405131ea62fbe117d2324e7883d3a77c9ef54a311a830b4303fa1b8d457dbbff25f843ceef265c19073d9ea7edde1dec4039e6aaefb75e3e4453c5506b953934f529b83a88ee26ce17577e773a6ba30bcb8621f8c3d9fb9943dda612791a7afc30a21fc4f7f480989952397c39c5287a77688035a2cb4d9073a148f7b47356f77c8c718ae0049cc881640a6e1d99689f737c40ae2ba6e1ac9bc6f2bc64640f764be5c11996d28671ee5880c94a4bc4770a6d77629ce3e0eab8a7ace1163869ddd9f9a049578e394f124a0bff24755ffdf1e785ef465d9f48a500cd509724ee324f0e31de593bd10e185e9e3c67b03b4572bc54f1e1557232dbd32c857978ee030e556c792c99493429c03c528080cc3ddf8febb44c66192305e8c0e0ac889a198e3a3942d311faabf2bd0df82b68466cfd84e3b3fe69cb71ed75573445f1bfa1f4635eb664c646abecd4093952c4fa9129ab04ff84b44cd10341b67c4f56bd4a78054c65a548b89b1d580386bc4b310a3e3eaa2a419ce6e3272ae03cdd763e0190e785ccb42028dc6e85a5a097321048f089b76169e213d77329171de3f48ffa9107f3d495bd639a5f15c572d57b930c64a64a24a6a1ba1f0f4b58ca2aacc050c94263bff8e226172daa322182a46d64c2b2e6009dc1dd0a66894f09a03c88191325a9ccaa10ac9f8c14a649a532514d19d9e76627fd00f6f04a44aa618b7baaa88b2e7cd0e2a1b5fde2f99bc54110ae4cdcb4964bb8ee2127e27bbbd10a3e28894942e465a8e20f0caa3323de84f31c49dc95c986d2de343af96514b4b09b75d4f859bdf02aa439ba67a1c30a4a38b1629c76138c91485c9836cf6afbd71a39bfd1ecd9414cfa1f16fe5017d7a2be0204b6eb736dcd09c0c0726d42f9c48dab672ade064e6787850286147ce06881f0a882312a3a53adda882e64891338b6d21818f1c04ec8b5c6ccca14cf873b43199a8de7b282a418e785f085dfa22e093896c43e64f1a88fe2ad09afbbaaf7942655dbd4c8d55cef2b30e2527020580cb2dd8aca10178f9bd84870fb081721c8dc7af960c529463fa65e7fb339b0a7841a567a3b2023ff021fac3a5bfc548c0c105008c78ff29181ce6115383e0d314be1272b511087f4410eb0a8fcba55181c1271ea7412213cb564924487412bd83ecfe2a657f3f0bfa381f220d0c860e26442e69e4dc3b2e75fddd975911e78a2a8f918e2a1aa76b591d1fb6855968f32c57b154c478d096a1bb12324583b0874422171bc0f7e54fb27b15855430a04658f939fd05fbeb687b4eb47f92dfb685d980d59c8a97b6cefb84591c8d3b3b02139118d2e7397a3599698a96afcbbb12cefc2fadcbdf462d2f5cde2bbb404a48b3daae284dfd9765611ee6f699f8a640272369bdf6921f24a4bc4ad5f607b1859e0dd4ea8512a95d7123bb5b0b9c6f4a5da63c3f740049d0f78f8839ad2a150a6f2a10fd9c54de22a8874087f56ada5ca6beab0ea0b00f9551094d4b057464bc85b0ead0b43750d55845b8586ea56b9ed07581f5dec449aa9562b1b75080a7861f300413ee72e5a0579e072000cb3f7b6f345518860f5fcd3334520bb3afdd7f0d2444fdec1e0d49e4a5411bd1f22ca39264f5d0ac1aeb3dffd12c77484a9a0ce31c095a0f704e5a3ae965b976f9de968f99a5dd149ee9f8a497fe90f33dd7f7f300c55a92c4a436aa32ab40295e781fa9c15154e85b7705ff70616e1f4f0076200cb76d096e601d9d54cb25421facf390fe9318a3286dab12633a22c6ac9b08e3b6183aab53870f7203fcc07d18d42bbf4e8652e6e88287b0c38a1049f7765146a9c874d5e5c8d434ee4843d8775f1f5c941923b50fa85cb8dff607bb54f3760b5ab2a7828d0aab482a16a77755b55556073c959d3fd31608418acc129ba0162c99410eaf0c1a6f8ffcc1c619d55888961a25f52080c9b41570be2eecf0fb5048c7a95c8f55215a82f94f962a92fc18545bbb9d80e12c5a897139749ab4763a3d352dbef696d2a8428413f2780d6b5d9b810724d2c88ebd94bbadc6251e007043ac327ca9b19c21c9910e0e40a71eb53823fb0daca5b3479afce9340dcccaca4faa47e83c04d5d811af27098fc81122cbae542682b30703daec0c5e55417a7130fcc42fa03e221cdf2fc2113293945077503c030488ca7d11c02d6a0b59fe0127fbd4140f607a25b83b184ad06fb4d49998d252a4302e9c5485555d1264ca326fa0a3935e733d2ea220b32c888b44e1e4c4d830d94ce66e5b8d920f4e68c4c87e2ba3d13198c2694fef41dcb879d84f76b5b899f0fdb7d22661a6770c1d6183caeca3a1e9ff58ce4e6fd017c33f333429cdec7b05afa425f72757bba4fe80f3ce4cb40a036a454797aa333e308d3e3165892460a6703526502709d6bef35b66ba07a299199922a1f55e620374b0bb3f1f9b39dfd5393617596c15f83fefa44959bb929f625e58c264b58bffdc72a9b3e6e82e79196bf07f3d781d95981aeafee0fe341aa46253709fea5bf0cc225c728e259a5a76cb5dae371c3ed66f2e7f94370340451f6914c5e3b6fff6993876f108ef1e51331fc50e474f96244eb5cfceb593a12f75b9f6b731f5babc50958bf17e8dac6f5cc7e056d8444958e311eb2e095bd8bfba1106bdb986e32b8ce30b45af3f0febbdef1aa9a943b29e0095da95c77bea834ba82d2368478c9f239ceb5971b05e2229cbc1ceba224874f468cd4d3533f13511af3bec0a69e6409ad7102ea4b92e779d6f1bd4eb419f6b8d1c41157ba304fd667c0264018502311eed6880cf00096bc985482febfc104181eac1ad6ce73ea5b8fdc4115284c022a754eaa374564c941395a6a913afa8f262aa9b691077c472a04c0e191d9bfeb0aeec0049608b6c278da3d256d5435940752f460b5c9570ca14c524110bdd3553ff122fc1b25e3e376319beebc37717adb9ce3705a7ed20a98c9fd61409d0176b5058150cb65dcd2d30ace606526b4a492ba46d75cd96c6301eb86faec71a766deaa182a14ec5687ddf80b42b6d51832ff9e520e46bd7c94a875de2abfb5450034dfbcc66fdecfdf40940ed7a8792b9e34acbae3db27fa460bf90d22213dd708284de867f9154ed633f41abb8b8c8044d7caf7e01cd04159e1c6d0ad4da71643e1675ee385c6dd8045a0803cf8d084028ce991d0278fd127fe2e82fd2715cf9e16a651cbbec951c046662344f417fdcdb61f9d5209cc46fe7c5dc3fb10ad9a08e746170b4c41144eec03667683c0009e4619b094bf06c87c7b19f466f820985ef4d3353ef0a79f129f4d40095a9b4862683b38c9e387e010ff41e484e76bf4aef15525c909c990ad2f7293b90a23622d018c256497c91bfa39a112443b5f831899c1242039efec05bcfd87e19005d484691c39f6712f8d4a2743a51cb04b7fbdd19ca0dbe0d11c8975828bbae3d0cff4a417440b8c35a180361361c3833fceadb558a37c0c379700120f113ce70812d426b80cb52a2071df559f4d6faa4c67c2dd36afe6b08a829825f4329a3d61db08f41a2bcde7f8a1512a85a001c314d776d49d4a6a00af1d4afe5ef8caa729d3bbc907b421c16901d78228889f07cd4043a4b087555a579f7a84d45a64e3e3b708321f861d42599b03a2006fe912242ff9ce5caa23118795dd6e0930773bda3be8fa8e1095383ae0111f95674ee5781a652ce963c2cef8db6bb02ce04d733809f65b855d90440ede3eb517d931d05e66ecb8274265922642a43120311ed21cc401587a2c1a6a42b64658bc33340445ac4c43017643398423f0cd2c579e62438edc54dae8e013eb6c9ed611b527f677d98cffd1314574add5d3f4e0cc8c923159d4da323bf42564a6863cc0165e126b4b718a286a1ec06154fc201b35aded917b25493fedff1b31270d83101721732c228010bebe3627be325ed4d71d9b971fd11291a4f9514d40af7f04ac5be20fecf4c01ed2844a494018872d941a03964a07d9aad65b1fa09f9305c6b40f868d5501f9a68708644b1b7dd6b67641545a16c8413924252dfd541dabdb8c293ed3da35eba12dd931be6e6bf98f6e353e99e9161ceb3ef240359d16cc32f1f8aef86526a6a92056709a0cd44eb89926c57ba89ff26e1679e411fb25422aa08a45a519a7d25536c643a5a95d0122a8822e34c3139181b41b8103912ae3ba10d9f644082b38515d727032f13cbdbb83b35f0592beba09f84f3ed5f72bb8f6237444c2cc3f867ed81983c127360167509aa32cd13f23225d672046229978b2c35dd61759fc1243d4b97b097642fa3d66e94580e73f07ed9469ff321b6ca6d517d90164a2643632033f661d384f10225ced0189214fe723387780355b5168b86ff263ad56bb77686169e24af8c73b250ec690c9e1f1bb4e79b3e84ea82b6c23fbc09617296d982093b90f9d49aaae4d1b52d1ecccf667221338f44eb124a7b5721406f420a0699376723ea13cc2fce062486d9e3c2bc223848dc8bd85ce2f46221a1ff19d9d3add31010c84f3dc4617a0d3ccb8369cf0c726c323f148e4a4d00c5b06e77a4286e9c189db81a31286f27c8e6ef0172b68630b944f9454a22846d40ce9d7b02182effef2c3b605939363b6c841daf9f6281b4aa088fae051323bd39bb88f78caae5714a90c16b92540204c93bf0c341ad9f8b57cf00494c714efc5bfdb39c648a2b491d5946c6f515c5e4123a9272f97480980fec7a2bddef53dc24fb86bf76af7fbdd8447162c03da63b919905f71930240d12c673a5c8bc18ef888c08890e8a80397023ea26cae1c7c2b23285b0a6fc2c5ddcc01b6754fdbfa80acd514bc144b5cda665fad0f41d7323d0b2e25eb88e1eb17ddf1c0621066f04349848d01d932acf583ba0599fc8e12863fd0dccb103ba294f8767da3429566b1541c230b7c3533e5a8f62c24844893b0b719550f778a97768a0f4758afa115e193e8ffa337cc37c519b3d207ad887ef92fe7f8b618f892fe79e836909626f12373f01dc0724520790fea3c358dc5dae0e4fe46cbe9aa43439e0a072f0e86d969b95210548428191636d5ba95da6836291d80a947836ab4a39afde001706dcad525605b531e0c9756543db96743dec63b78c56c3a92b6b57123df8142c73ef4f13408e70e2711b943bb91546f2168d11d7990198f35360f5a48401ede8c971ba8e47583e8a3e240ea7be7f9ef71100c314aa5d2f251bc190d34d6f86ebb528209c16e378533359f25985e5a23c8a846a2a5b728e1abd12d84e9f55a4efbbb40a8a3a9152b6f86587ec0cb4a1f3148f6ec934ea41a4fd8e11dae7beb0ea512dceaec47c4846873cd9a44c260171a9812ee8253c7bd3efade0d0198b03798125e7e0fbeb0672531cdf3c3162ef92a17a46ca97c74ff3cf3152d98e2e767e6b405a5ca5b0b6980a3ee4f1601958d629e5511a4851655ef29edc0795369e0f1d9efbffc83e047d2e55fdc3dfaa8390481f230ed9ab39e3eca8f0d620504ff353add50d2a7daa5ed02bfb7e5e61f18db03b2eb8ad7af04362350b1ca26cce2028ff6b8a2796ff9ec54666a2df80da961f6c7d9210cac4469564292c38b9e8a7aa57f5f66ebdbf8a542227b480fafcd55f7a262690343c9079d47d2141ddff2787bf1ceb4a97e3bd32c2234409f6b14cb0a606c2ec6122c393b7ab1d07d115c3f38b804da869501d70fba72837376fac48d70c8eef41d7daaaada9e21fe5b3e258a71bb34da4186a993d5cd980f7e43ebe8c83b1c700c5b91c7ba0f35c4ae80b63d5fe14b2016b290496d64cbf18776cafe72663aad6e6ab3277f1079002e31d10998928d09267b2cb739a86cd2472a2364c509ac1e6b7b7edada6830c2ddef676c9966d03b48da3f0f4f3100a3b81d4f865273b6db7ff59a053a621808d90f03505a09a7fbbddefe13d9a5b63879aa4b28fa416db14e79210cf56080bfebed8ac1114b72e85803b60b2a095685f610508016ffc180864113d63559aadec101312613979a534a53d3a231d14bf8079b249cce2a083b901656f1cd658b3386f344bba04a9390690f077bf6ae3a718b2a6af1303ffa0d89a91942982b4343a16754934b152b6826347048c768a8730f20bd9afbd0dc8b170985e6de69694956a860432bf1a4b3654f4312036764651c7d7da8f1cd29a80060ca182c7760aa4292d6abc857b8be6a7917c4c5d2a32d306dd776bfdfa8a5eb457bfe8a72c98d54124cf72d3afc50da204f4a3fcfdba4d2181362979f6a25a090cf7a0b736e85de272c308b92307dd3ff84877ba300067a96520c67e5dfc3f0a47f2bbd96132c04bb8a24502b154122e859cc28337ca3a504beb0992c8c98e2156d8044f6b858ee1a1a0a18fba08059c4b33f49dae45e5f0416d3ee892cbb29e4d1cabea1ff6083a61b462717633ee629be6b2afed2d4ca97a7ebc0f4f4e0c958f372162866ee3036af138ba0caa6b47768264280e5994db1873a2fd773f50d6d5ea53cfe26a13d9d213bb5e0d970d84949d25589af309a4495f4c616275144fd46d1bb2e149f6a6cd4d27d127c1630d33ccab6a94b65260051536ddfdd9dfedabca84cc0a2e69d1e101262f7cfd76551e281a3a169c8e824ede641827625efa83eb94408f9ed82913c5e2024af570100f832db65dc94c1391e6c8ab9d53ea0da20942a7fa301d0cfa51f8c9a2e211f577acce290f68975d6b3cd979cddb1a9bbb115ec1a1626b559d2a1901f748a51efacfe2614ed7d3e82e7ca2b8b65e9056df096fc89ad118e695698d40b3f12063f89cbfbda71d9696201ed21ccea3bc5f603ea827e66e5c95929dbebb48966c026880d7c712c4709b88ff554e7228833173b2fd3b76f522612e19f9481cc6078e99540547a32754d2103ac49dfeb475fe6d43b99c4e54a97a4bced2ba7f39731a04b6469339fc7ee3cba4d522c37dbe19240e5b93a598d803c05d5881482d3ff09de280af99be658281b0d0a9d712e11348fa8ef3a6a03de717e884f74f1c8132d7835b75171958d8f66ffa773117e2493ae30b537db46e86089b5bfa94521e27138a7c96b0a13a552569bab9d7d4b3fbeba2cb6f2355a49fb5487639beca570a502c66fbdff2b3f5a6ad0a75fecdb842b96b39e8b0829f600463718725ada5d69510cd53cf09b346bdee5d188f7b4eb3e44717e5d47d3e5641532568e9539f74044690f7362a93a4493b2d174e3de177a151f2d6d3d0b5f4749b1cb6e1fe3c09e860e7b5741c99ff32f3db9093daed2991bd70a59d2cf5118b56b729011e0e357ae4ea40d002f787e39817001bb88c319d92d8ca57645ef3ca6fc17ca8a7bbadddeac3be907ecc77f24fe0e8c8e1f8558dc9ed683bc9580b331176531d87cb76e02cd9a89953c7951c6fa47b0dde41f4d8539d7752db99cbc81333b6999ae562cc292a578e6c37c09a0c9394c95c0197bd6aae582638af08c9bdefe5d1e58120b642675ea04e1913d2d800483452a1f8f0a738160d020d56ac71bafeae0ab6c08b234baf5d2eeaecb1bfebd64f4722517d075127f2fda4f6530b8483ad9630b68ea826765a96204060a0f3c4ad8c4847e9706af00b13ed7d3dc40b539eae3400a969ed73b1508a056b36fd4d30edf9249c2c0fda21e7d62be24a01290c02c8453cda8c98ba327506bbcf4769841da024536c7e93750e3f512fde1dff623cc175b7f03c82577f4775e50c4e430571e0c0010046cee780426075a3b387279a03841e3c5c5b13d01d90c89c1ebb43772579c881511a2170e64269987be568494e9b02f9c78df92ae491ecce2072809dc08a04b32a0629e5a5c208424e0414cbe722bad9c984bb7dd011e124fa9a08ca142a5a166569a5ebb3019d75d46856dab93521f5fe43068a9a4102c0e2033d54438ffc08c14cd93d1ddef82e835bf4a84abfce0fad0bed7ee434ddc21f12bba44b90c54b5cfa827da1dda7c6bd43ffc9064a8b1f0e50307d3d28889931c21190742072df297a3025449293fc3a795354da846728f27bc8f4d7c16ef13e50570f03328f4109c02609470a3643be206d601a5075735406bdcb15aba2ed9bde334e967e051711d71980430876ef80c8446c968da3396b14065ca32e0f6dd9f2d994995fbf7874958938975c2a8d14677340d1815a1e59231c6db37189adb0dc10d09f853c97fc4244a890ca2aa9fa779fb1996ddd4cca811020a75d1adbe7b680631f49a5fc4b2ae9895e9ed23dd6c15ffe836ade3d71902346398bc4724f4803d8cb7d6b2ac954931d29e84024dd1fc415161288789f7a2801fee5ecff6f0450a1c8863976884237600e2e7acaca69a46aeb08840cc1ce1d0507ee246afe88abc8fb9f40cd3136789e9fe5144a80663b4d4952046fc4b2c3ad4c9b67398080fb795cab3fdcf674cd74265b08141e3219ade141a951983d82ecfb3ca685e0876b7c1b97bd177134cc25c049b25737cd36965a20d0b06f92339f64139648bdd8e676af01695e0746973e762610efb4ca944386ea4c7a157edd8fb65843c8267596e938540efab57b3d90660c6cbb663309b777cc5e338b788469aed12294fab9387c4923a5e8f1308f4a401137872d5d3e6a7a9ec5c68df56152f618cba360e4371ae140785a04c8ec8af9a090b7c57fded052af15a2e02d7e8263dd565707082bd31e8b5b43d53ccfeae12cd987b8395b93146017220a31cea8fcb7ea878065350b1ceaf86f251650bf156dde21900314e13991fdec74ccdbfe761432415222daa3a7480f00758a2a0f2e54eb891a02a42741c90352deef199ffd87dec06bae1dbbbdcb193812707bd05b63f7977e40b4766aa04ca254398c001e461eefa505021392aed384ae57252495d851f51ab176c4684af3aa93312f9e7d3ea7a5e12421efd12687773147341e53547930e83f37080c760be8ed21d49c5267dcc48c117c278c3a7e2f4e73fbedba5ad7dac3ac39cbfe77508f2b74c58835648b8d4c4e0ba9410b2c9486953d51e6f1d8de43a1c33bdc6be5e40f5682331d45c909e6835e6796a81f6977d10acc564703493c6f632d85d2390193e270262ccacd6a8aecfd54889312f02d2913be27324cc2dd0c187bc222df027f80648af90329c23871b16f8867854dd07384a41c7bc6db25dfb450f5385c2814de3ce9f38acd3e44e0f817c24b6fbf460760506aa524ff7e71be08f7910c6b38d0b8139296bf22d144f87e8f1171cd983fd7df0f91ed58724cd503b72de7e1bacaec836622681baab745f81f9950a095bff4ff6192e0f0e34366d19069b5553e07c62002d54dc8d948479c635e8ea91443743e89980b4d273d52e406be33a6953cb3148c3746029264f868d9bdaeb8e00347ac37bf2c97e89df7e19f58532b8770e4ada5e8fb1a58739e062be189956ef84124e82f0c0cd0f4c8682380c2828b562dabf047ca0131069f9b8b2a969860dd846b7051a2a2be67e05da9824f85109371becc87c144e909284e85b7912e0993088b561fcf3190fc62857522f54a70165aa7b7ca3c1fc9806e1aa9af0aaaa7e33e90be40a984ee81c05c38723a14867a7b82ceaec74d6c8d8f7e5cd4e54d32f241402ca9465b5fc5245b01255607680180e86c26a678c6d14a2a832816d4072f1b6bf85f7ec08a64f50ec37a4c6ac3133ec366e62239e784cb6b5aa259ca3e02a55fa6f304056616dee673d1ec0c47936b0a5d4908efc728f0638c1eaec0908cd2e5f57d6646c14d7cdfac683e2ddc0b5ea4394c49e5aa2e85b515880f3824014320ac65505cac85859a0d4ce527ffa087196249252e1e5d641c72061a0f68bd7723009fad9359ca1cb617c1d6d26dabb2e3ab6905df780354cd376b585dc4f10f230f1267b457781c71f1e71608074c5433872c62ab47f74a462705b203cb7d38abe841c6852ac735b6968e73a150f29c8789ad43e5cc08a6dd04786e18137208d2929e61816ee0fdc8b8d0d4b35eb0babf282bf38bb9d995398f5740145b990c86967c526e987a4fa5459968d6a9dabe4e50cc344a1c838915e79d0858404b0888aed43432363c8986c8217844c1ee2ee2ecbbbbec00e2700dbab6e9b8552d38ede2b3e825a5be233906741999ba096b30bcfe9016f74eb74d6c6dee96ce3248d5d7ce840939d369a71afbded86f5bc19ceb26cd9306cfd10962304aeeb912c0295b66f3ecf93bfc3698ec0c522ced8ece5d9d3ad5f0b858fe4d0c4cc4c8a4e0f3b94442a10948aba1b8083f7865c3930291676dd8d79a97f4e09bd442263cb3908d607a421244c0073a5dfa71857c9bf358d9f4212ea4b5efd14662ee4e7160c869421f9de6dd70922aaceb499f42b8759c750fc282afd2d8715f8eccb40c965037134dc2132f74c196d4dab70b0dae42a4adc06f234f356c71d94bd9571d9921397544adf8a915c4ae20e86c4c40b5df82fcbdae40d2d32a6dd35f6d4e4da12648be7d150bfc0f136bdfef6f5e158a6178a2f3c07cfa15a87089a45c0ffcd4c1e1cd36a5f1446938cdcc996fcf168882021619ca51bbccd2acec8d95255c83217c44d29f955bb12c97d5c5ca59f20860fab5f49080d8ec6b17268f7e74e754873e00ee040d54dfef921dc1641c2626dd035c24026f169e715fa065c7ae3b16336979b907109045969a541a5e5920ee873b3763cad199fb46fd41c2e35c93a0c55812237dee8f453958448b229fc3d346e64bc4d700e5a37bd564b5659be1f648766d50f973bef47b14137af92116e5d79d4884b0daf0dee8f75ef3a8223e55b16359d3f7b414a98393ef149b20d3179eb1c91213dd459dc95e23170c8b05803b9aa9cd37f39ae06649ccecbf98c5f23072cbb9be1b7f7e6a9210e80eb88eef79000487f3aef5ccab8ebcd9482489fd2774b3f6470420b53c62dd1e079b6d261f918ad062d28bdc16464a25e61354cc1ee75cc82049fd215c8d89e46f088ef7d577d5fdec9fe1c8c9e9a595795724fa89e17930ec8ae5ebe5732618a65f721264c62c08e6e67498d84150ded8831d8b8279dbc28f2389df2e9f797c96b498f9bf834e58eb145986738d9ded82e41985ce585c56da5c5616af9826fe1619d5a74c93ba6bc71de39561e95b488fe1da7f60954e29a90926dc4efdd21043a8be12635ac7edfa99aeaa9580ce17c6336155b3eba91cd020813aee4f27bccae731bf2befaf8dfda329929744277ef2a9be10930f4461a0cd6734b8beb18062818856ec75ea35f0db36d850bc6c5d27021dcbe890964b5eb7ed781ac62c8dcd182772a47f37ab8987129c89b81e9976fe583f3be49a34ae4b1a2e89ab6541601865c58562ff1cba3819ee3d8b8ad2289a90b8ea9b8926827e09b0916a93a3a1b9c7c9bec53b0f0f07b247df2879ee17ff19123448c5764f918c215d215f7552b6f8222e320f91e9b48266cfe83bf7f9e38037c0f14ad98f597c565fd1ad9643fee401a1f815253fd8ebaa701b196791f14f0213463fd739b12c38c10755228d86b0c3761af0b3feabe7d10282503aec93206da9f8ebd08c59d9e872b06e55c865efe1b0f119f2173ae70672115de102303e6a9e98fa219495588ce0e5e813d7922fd18b60831ac17c3d6efb9a3dd39f29a1515f81189f3fe1bbe70e7d9f1f6221c79f6ef0941b342a0e07a0921d788dba4b70c5cd1307b85e55a837ea8c4eeb226ba5fd3dee6bd2a7aad8849370617fa7cf8d99c4fcb94180103b685c51066620a942d1bec678c638aa00992d60fa599b865b983e2625c65589742afa521b90399e00271ceddc520120f4e75e10a4848538b49246468945026a154b658eb504208a79478775931ee1fc6cd04cd44bf63dde63f3815888d7bacbe75f7fe27297948fcf51a8e1d8c95f3685be1be63645e87a99e770ad25186d2b1998b3d16f7ee7743470671091e900de403c64da3d09d00ba0f5f471211b0d167dd5fcb6a919900be00cca448447b164277519c448bb4cf2cbcf8465b8f788bcff22926e191a243c3cda75238ca5c76230e708f5155c2d64f00cead769570b91b447d663825925ec932d10456727f2eb2d8452ca810419ca9836eace87571c0dbdc471f1c55b07bf38b88df878871c13cd5b7d54036aee98afae717f94c3e90381fed08db7b661683e1dfb8856b3d0912c05f4520b9ca4d074e361a1acda0cfbe79d82fa683ff6e25bed08c7d45bc06df18985275dbe96b8086ca7f29b01a0ddcad1a79359a80e69ee5f284a68b03e182c89f7c7f1849037d4bd718b496a7def80a2b86e9c16e3c7e363912a4c71623be9b270d2f623f6c9025147e3846aeebb6111eabcc177ef638398ae605ad5c327d7fb946725f284ba51a4255105421c81e70e6c0f37fc8695589a0aadf21ab0a5df5bf4f564ded45a30a8aaad3a89a2e54f5df54a2976887f7650f8775f5ae70f921d3eefc4158f9249e9e7d64c8560ddb6db66018dd6f07c1f8db8379ea09cf0d3face60370da10926f4649d0ec9ea226d1a2187a2b6ecfbe1fcbe1ffea53968b44086780df67a93415335e40d944fc41596818f3f857da7c635099b4082e921166f1df4d49bb1c0ed284d41fa87b2a6ee027fcd17e116023293f095c06cc01da921dbc559bf22a436f806c167a6eea5e8d43c4b9af1c84be3d491d364162c553d1687f3e33c753e9e4415763d491ec69f5ce8ca11af4036aab844f22686314be32e6599d242cb91052f2b3862c56d8d2c663e23f3cec51d8ed1516778497aefd0dbbad7aea20d6b06e6da4e924d97f0a2d26f81717d3257830341028be72462312a625dafdc74dfb935778202fe5e39b6ffb5bdf187e61059b31f3112f20f6f44354100c6413843068604119cfcf5f57b1f1f1ff2740bf71da84dc58471ae990251a63a95e263bf0c4e3a73a91f2c60c5684af95a1d218bcf61c93e11729fa1ddd4b8972669f5a13e1e1803d446bba2f68c909c5a5726e85ca46fdce55162feb6e6787c4727c9e07a0ba56c500a909851195f2ee57ecf8370e42acd645c5c6b071d06079d7953ffe260822acb92e422bcc6c4047a50d401af2d63e0b08d6c2026ba0e26fa84448bdbca9e44a6ba3449dd0507ae087458665a2699108f18621f4caa8c925d3941a2c6ce7d1a7c1e5b9ea7d9190a83e0ae2ab6f3be31ae2f54c9154bd2c2d20d2735ee9038edbe756b69c0fb78e719fe2ca146ced748792c8b749b6aed1ebf427a10c52f358a673402255283f47ff0637d086ac424a19c4d9f2cd6edd182536ce6b7f278cdc4389cd0761ea642104df2df7636c065b68746363274525c3ca9c4fdd7596b77f1a46637606057173c456304879ad36a945d7f68b268d78359001667f75a763d4aae49b1630f527314acb71de36c592bfde0518fe6f63bcf5cadfcfdb7ac1491b83e1ff6aa2a76688447c097e9198530d82ab9a385c31f624d6ad7827193b733b76f2240b42688b140ef60ade86480bb77a0a63b4649aaa264ec41629499936fe81e124291beabb399a68b05a302d5058d61c0ca4557d85d2aa4d59e218c196379d483009a3cf1e2170eda93b8ae51555d1f1766316b48275b9a4bb471f2ff78699d7158b5acfd3b1490b8aaca8fa22e0ad7c0884191da25136d5a24d4af3da1086154902528ad29ca2514c32bcee104e9053b1a8766b85b31cb91a6c63a931090d854b8206c7002c3bfb55c67d7bc4516cbbf3c52217428b593f823a3fdee86a7d3e96508737c6e6e35cd841f4b325f5b6ab8afc7823681b7ee293c0ac6167f7c1dc2c0f659acf682ddedda04ef0715d85cf22d7f4127aeba860651002a766920326b7aa56972750db222aaa4eb31b223927f2062d4998520c6854570ef27e1edf4333831a8e21c73d90b0a0a466cfe667433e8d8db1db430c4b20c58e7007be81685defdaeb515d81d8ed40ab278e466b87b4186a885133e0a5d407ad339cd4b48851115896c30bfc226547ef592fa0746741462a7fe6f01ef0da35cce5ee96be7d815280b6d3144d380d6b624188b04e0c84c0d64e81f0343a879cbb600befb4bde8db6c0ab55db322370c4cf60023a0de2c7929572702dc831d496db0d48dd507dbdf51d8f0a1d37e0122fbd83ba22c3171cc1913a7088b1d97f2955ec74b220df5f7bd8e06c14b3c05f293f9f612608b13f7216be02e7d58683ec0429bcf27746d561661233007d0d0d7915ae72ff80db18edb6258b0230d0c1ff1b794ecf2d52f5b896eb719c6c68197a4778ea9ed6416666b646b9c9757f872ad979f331092980da93b05215f627dfb460111337cd7c30c19f2c99690ed09b234bff8a522fb09484680d6783123b936d24de12ebef4b4c8cfa0f4d7a35bf1649415ef5955c7e8621eae69452a2e89870d7968629a61899c01422421d2e68f4103537220650f07a897873f879a8b2b399f1be357e52d2cf7293fb76f624b492ebce9d1c13807f72021eb72aa3909a2c1f1faa47683a555e8a99efb79255857371d36f85ea7819d3e37d754a9341d3e7515fc402169b1bd70260b8dd6f2f5ae61fafa2a17bcd9f6f086938c37ef09432b3b3def176509e4caeea060640c08dadcc19806e4a1a4028fdaefed95e2748c404fab39d70948520fa3c7c14ce8215121b90b2513b73437156323392660eeb514c9cf1cd25a09ee2efa0eb342a3d10fc919c25de3543f1f7c618ab5d33751021e30496fc2f962e911337ae99841e2c7a1fce7f411e4b800733cf809bfbc848de5869c1b5d09f909c5070f3f69d2282fbe151d5cb26a1602ebf5c6a8b58fe13adcd03781b7d15c8237b50e8c35a12adf73bf92ab66b7dd350513f4bb82ee0f4a44f6c718219b438343db2a55f2387198b32aac8b5ec8cc6720dd913779a38b22e32d99e699aa89800c3badfd91931b6bde4ccc7b51c8ab6ec87b5da9fb53ae482717cd39275fc39bc8fa77e38fb0c080661e8ad5270fa83f5b1d28b16119d59232297acf25048b2a53d45b91496f14afbc6915f2aac4a6096070cee9c0c4e919345a565b9099f513195cdc7fda5c784515ea0cbb0e615c1991794d0d30ad9609555338653ae31ca24e4010466c11afb05400643bcccd8eeb2b536c11aa4a1c1573c8fa66301801c24e36d5565efd0754b31fe4869cb05bf933739a826ee104327bf6ba4d85fbd3afac0a0ed4ebb4fb4afa6d7ac52f3e5661914ce29c7edad359c00c26a1928637fc656914647ef34870748d8a6312135889081a4c3e8bdfa873239d31ced9e0e9456ca7e8e7c8d09e3e8e2d12ce845d6a1fadfe3bf14aa44c694b29d5fd69059e308bffc730ca12c129ab87412dba6428fa667972a6988ed5416af328d294bb70f93dbffdf02d1fe0bd661d54432fc4c85fffbbcbf6d987b06c9539535030690b112120cf357381e705514387f04829989aface27c2438a310f32eb74287f845245fc1f0aacbb65bd5aa4748f78d883cd24dc044cb26e27c654e04a0f7ed113644ccdeaded70197201c08bc8330b3e2a9229d05704a9728219748737c85356196ca55aaec070d27e8781c4b9c48aa645994af8d7c58a004cfdc7137c79745394ace3011e91bd8796634b8344a5eebe73061723e357c89113080c4dce895ba1859116a5701c596c9e6a64ced296efa2912366b53a25bc47e1270c1682989b6fc3315d6dbdf1defcdfbde716f09a30121db886a183d0cd3a102af10988e6377753e03eb082cd07df8e85a439e0d7e8538467da72411c44422f0fe2c9135e4c67d10a119150de43c55d1068a59b5f5b43610cab57d36904e6d8b138c83056254ef46834b213d34713c3f245b5e9c70b836e2b4fb001cc32d54ba189a5241f7395a85b3461470b4e5f17ab556502a0e46a8d16457e95dd67bff9c789cf50293e42e297e7aedeec57dd042d37e093808d87bdd885e148e4901b2da15a2b97c514eb0f3e4873ab66bcc981e15ab657683bd503b03c01043a1813da6cc16bf8b99bbe39f684ea72b1a5e38d46e202c94f0e597c1d0ed09a44156844746e4829ab9d28af7de47904970eb36ec68b9caf771005b40d2ca5f33d052cf087700fca6a5a5edb17a5b082c4fe5a2453c5efae64aeaebb7057db75b94982c63c04c8546b1b889cd995960082bce015883df4d939ec28cedbff1ebc75f5d5581c30318a3fcbdfc2efe38edc8a46e3229faa93be75c7fc7e763419a01f691a3c76add5ec13e2a0120cfa51b035306aec1ab94fa587007adc4451561ceac4130471b85c836045fb1873df13e619f709d789389af384d40a80f5ae4f650c2b2e0fd8a0d953bfc9dda3743fd7caaf9d775ddf7b1c2819c885a7510bfc81c0909110fe8da0c47e4847b49020d8f69372441b7e705e758e02013906439fc91e374fc21333ffc0a9b859121c74d972c4b1f6fc08817710c8fb193c5ad1c0bfc92f233be85d7b398a402b456db636c2401558d070d30065b5af4865148155ecb249e907dbdcdcb387d8af02da2db584875e8f0261f69584454c8ae589d774ec7907919c74a6c5f1abcb887e1021e3d582271cd8527d1f9f455b8629c6f4890ec465e8fc25f309cd316c36393962ac6d5a89e48bdbb06ba92fc7a266a7d1a74b32fcb7bf96e4f8f666e9695791e7a6df76d77dc00d51b2cc2953f4316887e26c131440cf14699cb2ff6ca65648a6a32fb7bcd3ece522372067e75562a951eba95a78de2ca945a8e8ff15c7af0cb902dfa3591ffb1909645f644ffeed0d3cca4083dccc5cdfdcb182386028a3242e9fb5156fee0c66495339ca753b46344e3dda2a2467dae05638a7da4f40cef7d486d86bd8dfd869ea1ff76b240050fc03635dbc27a197611e39ce5283775876c0254d5cda38e0ea016c3ea7e69ee46909f917f7a19925d825566684d3a1c800ea7b17ee72279845ce60e78be1d34614cb959fa719eef4aa5c1ab60f10adfa4631d7397f6a1ae361068403554d9e0af5845dbe71538d50ed8a376c74686090e76760cfbeeaebc5b91079f889b8d75eeb0427484751fe97836da5ebcad432d80982c78fed71720b0c3e0afca100c087fb78614fb23c134fc0fcd5837b25b416c8542540011acaa3b8958796354c21bf90c848c62110261630ccab788352afe6e78db5c1bebe23706aa0f9ab93900d0a20e36aa30a3fe813bb88d5e90aeea7a6ee2c057c0425c9cfebd856cd8ec050484a2e01575a4ec9a85b098634eb4ecef5053421721072b170af23717d8a20658c51518ce8741d94c377e926aae5a17bd3ad04c9b4d2b693095ec4f6176058c962100aaec933fdb6c0dae80599a6c58319dd0cc528cfcbb4b504eeacfa47506a320100ac51853aa524465c2b77b43d2df2ab526c00b2434fc0e8f62ff271ea4fdd82335e1a87c0fb69fcda339e0509b27ec8f2c2792ed0dc9123106bf7ad07b7819f00834f356daf3657e5262ad3f8fe9e738834ace594e84666016883b600214d97405c1cc6019af7e12a3dce6dc63aec6dd0d08e0c27a4e20652cbe0dc90ea5ce37a78662c150ab8545ebba21003efc0fcea75f928b3f68b308aeb897b7210ef101f6f1c45832eef353e2bbfcd98ae5c4e5d95f61756c0c0b2a3079642e5267da82c05564b2c561a6b171ac1cd5878af0e179dc84a04414678fea7cc2e6f6076d4af290f4947e032c697b575ff600ef4e199a7426fbbf806d5c9f6e6423c0626aefddd5108043a8617d4718576a3da7eed721d502887bbd4d8e8d1fc2c973ef89bc7c6e49f4ce2e5fc92e2f00607874c6c902775149c057a6e47b74567e4d6c84f3ce61c884cbb560ce7e2f39478ceba5f89836ba49dcc62073410cc904a30d12c9d3ac3c3279060978242c17d2f03ac24777c0f5bfc10de8cb7859bca22a97836b70466c379408bcfe59f0c13bb6a2ef96a052dc8805a2c1bcae61564915b3183e0756af3eefa8f78be6c3374e14a04dddf13c83d199c20d6fd4a448c3d4088cdbab8a937b05de9ffadab77c25c400baf75cc602761f3a8b60f253395451689ed4d0d5b8bd607d0516de120fb374c485368f789c3d2a5af8f634bb3e42ea3fc0fb7c42ffe620c1dd1d1ab83676b849bf5a6f8de8cc0324919850461e916f4d9e8b88280f260d7263b3b08a2311a041d5db23d6def6a131b444521ca31b5ef02a056261021c5d46d26ee06b437be1a31f17f5c427032b43cdfc30b572a88ac6c12bb1e9a7763c8278c01fc457cf43cef4eea1297205ce250369d4f24b86b06fe96f5d878703d61080efdc1fbc2cdbff55e6a8eaaf384f1a5e7d1d53a02e345f7cf2bfa52f11b6bf8f7bc9ee368e6475132daf7db311911a0cb25e59173e4ae9be2018736157c840e9a02f4e10ce393d6436ece222874737dfdebdb9f5a131aa2e78255b2e0854fc231905899f64cb3259b9400346f43e050623cc9a032f8faaa17d1b604c16cda14e162484bd1a3775dd0bb7ec5ec02613263e375a17750fef0e61af3384b2a31c907a7799e0c260566917c417c732199d9d92cacf38ec53dc9da1b86c091b1b0769f908b56f6e71ec7e7175d69fb1a9f02c72ec5f1ea20f1417a0f884fc2a62e9991efd5cc178e04cae8d7b9229323c9497db6e8b6b08cbff666141fcffc3487a0f28e4927ac4cad08f29760b6cb87b3a72e7e601f1db8652d5625b0b045312ce0177cc79c6f0d95aa8954a5bd05a80afd8b7a6aa54410c1c01769c95ff036c1fbf14c468a4b25298a5f1273fe92e18dde7881718ec6be99422c071cc5cccccd31f42f62422c40d6cccb02cbf4c8ee035beafac7d7faef0d087b132fea473c00720dbdb9f28cc9d22936dee6fd1366c66aa34853d6537c0fef78580036814b1018a3fd9465b400c25d51caa17d15355dcf5c73e0731a675bffbfffefffafaaafafbfbbf3f0ded1d76b6b6bffa2ddf814db66565849983e7744ce6906106d423935817485e76794819739d1c2caf3a900a2994e82245366bdda889881029a594016f04a8045604c20d7c8b5aff5201cf056317dc5d5c7a1af2e75ec1b680b77391c65b84817d1a45cb42c160908820cf5bd409f2f0e28a32a1a92f09f0e50c4d5992259849c37b8941c1b248a1be4dd18e5ea4c423629ac274a39f2314ef7bfc1ef16833252225ada3b9876bfbd6447bfc1e75fde3f7c8eaa8c667d503e80f77de97ffc3ea5bd479fc1683fe4501fac45bf1b1335715e50caa02494a60949908fae90192e240542d3e12463ce88bb6905f72ce39e7188cd523fef20283db98d77dff8bb6b06130d69b8fbedd43d0bcd4e6d8c7b2a761f373d424ba4b31d65014e5772f43c6c2dc33de1d4577dfea0c2d0f6618803d080e799f3577c0cc0c0d07c26861d6c15db4f69a8504b4d6da847444834ab9194b979e8fdf22b0678dd2ab0ffe1ebf4548bf7bfc16117d0bb3e7b2993137f5b839b0dd39dbe4adc7dee69c739b55b384c2276868ca29675d92b5d3c8cb0f9a1d1c5816f844d0ec18255930dc619173761155e92192db21821341c4b6f9264dd35c8968df622d362b2d1fbf4464dfa6e4c8b79aa6301de6f14b74e3dd30482dd0bb24cb0e68a610210da52a8efca4693af2add314a613057d2b8c915fa09fd704d1502818241231623737742af931fbca24251fbf2b8cfcf600e68710a9253452f5f0a89dbd2206cf9288770592ce3048c591ef8fdf1520be82c7af8ab86f67cc7a3ca8fe5dc0346f74d7805f187376b39b2aeec16019130cc6c4a4302d1f7b0ad3936e2014f3a29ca29fa6d72f0bb4d72a8efe127226e1438ab510630c70169a8b7b85e08a01087a59b4b030f409068723380f0e4970a0a826c5554cb156e499e9c193b3634347c6091ff0e5f038e77c88a3efbddb863a22e0e134a7b42711f05e18c0622cc94b70a893c6418088a11820970580c899a4ce82106188380bc6022201616e317fa1708948dcd77da20062e631e6e6242e314301e637eec443a8b81f10e17cb85945aec349f01137db20495228c59364d31317934500ca159ab93a2c1069965c341257ca0d6c90159fec88b204a20beaadc8e5c3ebeb84db93be9d26cce612ab70151858ad82a52d26436eae8d120950fa590185890ca320202a3e1d277c820088515c0c886998ee440b77cebd801886e7ce097c882ac194250dc855912040c89094c8d1254248882f44130aae1597986f602ba30ff78aebc2f5297189c405107390bce666b9ec26c4258542203d6123278ce3388ee3c833c7711cc771046ae1e203d1f79712977c85988e98cc5c6c4297ab01d1893bca103f64ae151805351cb90498dbe5ca7089580c03b952f240eb6a8aad4814255056a0784981e54061e20448c993be0f4d5f2ecf6f1b10a7b80820e6c84f4b329221d724b23519e19a58e212cb3213578a5b368970b15c0f0078b8790792fb8094244992244992244992048af1a42fe7a9014122462346cdc06d1dd7b1708bb22eec04b92a91eac7157339e880e800627672c4d579730f4004c24c7eb829b86944d86b63285c4a4baa58fcf83852638a0e1e2933da666c9d3dd9ab8391b18878b9c41ce2870b969d3c201680e8e64671d762642397888968b93eb80808c4dc83cc1d82b78401a699a61dede80e05feaebfcdae9f586c77549f5bafb1d6dbe87eee80eda9b5ce6ddfed763bb53d812fbcd3e6ec2f9b86666646283ccff354773b9b5d4737f8dda9bb1e2ad1807fec2d6976ad6ae07ff66de20a577085dcb50b5c214e0bb170850c2324181c82711e1cf2081b47b9176313a5bed7be7c49c497fd16bf86fc58f56616bdc6b16aecc7aa3413c9ab6fb6fcb5ad8a50ab17db4ac4ce4a886ebf55594e5f317f2559b272737a321557a541c9dc0aaaaba72224be23afaeb76bd815eceaca81820a09498b145f0eb35d0e213c9f3bdc91e3aaccd135dc91e3cda1f46dda9f6c1175cf1fb24fc54bf59371a059bf536d3f84c3b8253f0f5fd0f86918a48537fa78a729cc3bf54e814d597d2bfc11287eb2b79a54db9167c02a1d752f81e711f8ce14d48f2e82cd86d80258e6f3e66c66c31140a0c166c30b8cb081183df31dc03c7ea74efc7efc4e017d0bf3ef14cfd760c1b2628e056bb29630b2638da56176045684b57eb8b13681c291542c62ad7008bde1e81982a863974ca9e144ec08cbc6a6036485e3b152d16299a64e9031e505dba2058fa1ba1b24766e7c00aab282786285843d1af2026df5e9b1caed707320d13081894d229648b16e49fdb03ca442b05552588da0ac544aca88b04f6a6c16b2a52e14552b938db50c469223a9152c8928132844edac55575815726c10932326d4d4bd451f6bdad77a75a5235553e589e54262c95858b111b49ad910b192c8f22385950167e56d6d13c2a6fda8c91296c586a327c60c25d6cc68ad7202478d115b3572d6242a6c0a28889d20d4c686385b4f88ad6f5bec13aa9a1466ac3c4b2b0a2e581828d8291a3e32688050b3b206895bb592b0406e6b693557c69c7049d1c152d570d104c45dbd54c4cd28c1faccd0597dd0394561c39640299224c89232d7ebcc6a0d8b5a7338b1518aac10d11a2403687d65f0cc61919b639d9ae430b286588b61c6ee00638760ad576ed4588162a3925625456b8d1842c39c183d45eacea6b0269cb0288ee4b04501b276f1589f68154d0591d1e4058b959e2dd4d273680583f2615d40856057d0c1905ba19ad87873631372c67af5585b70ad34aa9844517962b592581d46abdbd088279f9da7102b171d4b2427a4c9eae48d05c286e44c450f1eae13aae2a2a69e3e246519b12386869c7c889c42ac4a74eb931cfba3c9f0c39b11b6a6b3b5478f158d8b6dabea1175e3894d2a62b48e0dad2660f8b04a3042b04ae8d61f39b22650de90d8d81367743dd62fae354b15eb238aad7b1291b44a1911199ad1e4f3a3298411ba754d2e45932b6f576c4b672f7a747161a962a544553d2149ba61c462883dc2e4b3ea600a5143856e18420e4b93a6b775081b0b772622357ba4909a5c2c11abb91b6b0a196b0ca6a1233687053be5c41ae5f32d36aba15bd23133b7f9beb8d2d37b2f528187128f8833c94a093369495099e4e64326bd3c63d2d80fd7fad949523f494d4944414a25be9d799283c12412267a48753e3c2429245024b8113bd646ca82485b18f62b45ea09228b587cc6229c10c74ac7823c45ad9f0c6327c8c34580e942d74a18baf7de9bf3f69b4402a96e03a5ec17098e73cecf5d5b6f8c244972875aed6898a669669487748444b45fa41e148bcf05ae85d76b49db8a696f71ec5f747d57aa1e3256dbdd31c6bf0d65df1d273f69a33b4efe51e5196ef273933bf15ed2f89a57ec153be226467356db1f07e1cbbc99418715e90d5751ce39b087813c7149f6d88c66b07923de426df630f0de860d3eab366437b116f26e76b2b781ece697e56833aa264e7ebe4726af58d08ffd26ffcb4bf05b99c7bd438bb41db3cceb9e3978c8bf559db7d0165c21f7167c01f70b36ecba2c7fb3994660e404571e7feba14a6bad73ce59ebacb55e80af2da1e9ec7a9c018ff978dc732f03fe8a7bdccb80a32cc148ac1e7722ae1b1d922adc0685d7dc70590e4ce6e3f1da10b71472d88b0eb70f887c40621c4b5fbbc1ab88c9ca38287b6194c75d35a2c192104a063b652e2b347881e1066fe57c781ccde1e5b5da92008dcff8da1264b9a8b0e0f628dc63b5bd77bef60466e5dbe3be7b19c814dfd3301665d85414205198691ab612e79b73bef9de9cefbd39e79be7325ffb7bea716fd1baf058c599035cb6a8cb1c6406ac1d79c3c4de30b4c7dd7cfc866585997162bb99102c7191f6e2f8a193c23621041622392a4b6212c832b7541630b8b030a56e0acd9fd79dc7dbfae7a05803c12358dbd7922ae3304bd8dc1b06f67befbd69865954fd65f625a40e0b69969afb6babf755a62780b564585082175a33529c205b2b416504aa88c44cae684912672a7d515f2b785f3ebc5d647b5171f9ea41611c45e05eefe965420fbf99a5579997168c199ae563ca02920488a7ab46093e42ae44d9a9810508960f48f1a2d165f5a48fc6708a8fc64f49876a6a8cc7d28db7abca0334b2e2122d33a3acb78b8a379385c9f1ddf16e71e970cdf8bd67fcdefbdd5137be5c4da54fc6f049cce397ebe73178fcee509272de35b7c0b703c6dee64c427e1ccdb590a72deccc4d0c3ca700818c210a34c3265b635b568f5fadaeac55e2d1963df738c769217ed542aa1343e706e43e544bf1e34ed4ead9d1fa706527f8c5b39c64b4b46030ab4889afac35115f593f7a825f1c2d6bebdb1910bacbf4aaa23aabb676112f341ade4b8c068fdf2ca42c1463632dcc92c48ecc42d8b9dc9d649a87696559253a18a163ee262042058a593dbaa7306916881f5d98f0154d8cb63544c362323c636938e98858a2028b8a0640d972a73cb140ea79e2335a7c4e1d82008198d2c2896d880059735c387888b481b83a415e11c1a0f1da573cbbab202f2b39d38a0ef53579590d29ad8eb4307995563a7c5661173079a96e6a60625b4e504e28c352d4ae9ea008794184d434c6e8f99668865e260c4c176259218156d5a4e346dab0c7dbf047ea7bfc62a57d9b0e7d60950dc9b0c0d0b06e60d1f85668b683e2209a978eec5c34c0f463a67b9be69c0d937eb0a5d7c2f206fe169202c3b607f9438e2994e630e087e51c5c81bb68604967840dc414921af9cce4733f876a2dcf1bebcc7d3bc79d43280ea2198cbdf3ac72cef98b75f4fcf953a02ecd8f2f98bfcdca4d83d439c8ec2590c7551cf79a739224494d344dd3ec2dcf3475b94dd3d45deb8ce573374dd3345b536bddd334fdcfbe4f9873b7c0df052e9430a096eade8220a4a80d0b31d2fadd43c8a5368b5ea603106282276f344da04dd979e72846c7310383e7ae9b642ebbcfd771cf07fc913df62c37da511eb0d751b43d7f64f7f5cc2b5b8eb6a5da4296bd6c01daf43aafcdcff370aa3f928781ab3f72b741a1b0a792fd57926a05b450b7c11db0d41fd4315de6efec641fc936f83af87aab37d997772850ac5f35b8c7af5ace9b8616f70631dbfbab830b1b279477d344f7eed216ca30b3a3e6366b46dea89f247b267b2ecb6e66b38cf639e538933d0e596adc907739e7dd699624d947b28f2874aa762fadbabeeca6d4ee639ad28f9d74a9c0c5a50763308a7916f43264ad2fd596a7b6255027463b766d93f6386492ece686f1eca7fe10360f263803820817e8800850a013d4a2495b90425f7817e81e4f87779a00e08d5d9bbd24bbee678f434e93faddcbd2ec6d307b99c71e87bd8154f9ce588f3e5f4fe658e51a6740b11e5f34a2c72f5acf7bd6a67ba3ca5111f0d58f3020448f81f43cfef13eeee48f2acf7bfea1e4796f5bb8076ef630fcb80ac4b86760d9319043fe8cf9d9abe9d5946a5be68dc3c94ef66ac88ebbcc8853f6b22c7b35b9a6fd953c7355e64d93fd3d4241b12e73e741e9eed8a6ec1d86d2963fbe6076de477ce1ecdc86dcf51378d372f60c6c776a9bb1c9969d2c3b49922539e6ce339dd2efbecb507cd9cd329dc76f76ad1fc0e337c8d1e3e46fcbf2cc65e627da71f8d84bdeae87a12c7f6517bed979a5892b946ab9cfed817fe6bd1ab397ea2fab1d43eea64deee5cfec6dc8bd547fa63a9665b97b2e7bd90a3b04a5372d9f7185dc7127a9a032da42bbbbccdc91c78f1fed777dec24ef42cbf94bce6a9aa299e793d7f21ef89b1d87ff1863c2c0a01957e0bd3e661f093739ee31aec071851e0f7893bf25777d5733aabbb39f26efece809243bdf71de7fa7ba4b20f9e325171291a1788ccaa03fde5be1e31f573908ff26c7edfecb5cfd6595034ec1e75e96d9d4bc6f9bd604ea8f83f073cf37f947d52677ddb52a83216f1fdcc974fec2e3772cecdf20416a579e845cc2b7bfdd851bed630717697eacc78e7f631f550ec2c75df8fc71af71b6642035e0f47a197ebd13f71ef026d79cbbc772536df35639901d6b90797d3646f5683779069cfcb977f8495bfe5afded6ef632c3efdcf59f07feb8dfb43c563bef26d798aa87ae7b2cef58f590bfec6d3543d977c0dfa97210bea90a65b430e3e44f35588fa06fe1da02c6bd872f8c2d4ffeee3d72c6c718e8219730e61c55e477e73ac47c10fd38769bb26f48df04baa3a806a26d0abe445bdab1e3e4adfe36ec8ef6addaa83668d7c016dd8076ddd1cfbd9b963701c6155ab48f3d567714e821bf465bccae7b1ad0b3ff6ef2e3ee817fee372d9fd59060a894eb59525ac7466a000083170000180c0808449220c771184ad9f614800757bc344c382016cd258128200883188861188602108461000682180882200a6548f003f85e541411b6f7471b1a1ee4a6cdfb49cf48f4591f13ee874fa9f232a5d44eabd4c87c1d205f6a00903ecbee47122c5ca0b18be7b0fb818f9d756a30e9e00d404cb5ea46551bc81c9e614c15146327275bec97ed50c2f544fffee7ff8ed6b08061e9cc05c10153276b97f0ef17741c1d8ad07eb404c309f8652872edb0d39444a00990803cdfdee637669f3fae13e4935e2a6a922d8a6f784f91152674ee3855b2e5cd1990bc55cfbfb873ef857c87578f6fdfb90eef871d3f600bc7f63d7c3aece8607286d531557cd220853fe1c298de71692bfe0c172c76f9cdad8826add82e8c4cba238a7f41107ae9af4f8783e606d310ca7cababdc418df67b26369d7de6b88d571e50e6d096d8e849f2dac495e5cfc6bfbe5663f5006b0caadfc8ec8fafaca1ecb8cba0be08d4c060a33c993b87076841465f7f83293163db7addd1af62142e8c6cee9bcfcf81c399b4ad3b9d62d5ef96cc04104ec77ca640757d832b922a1bc2d4095096faaa00880cb112a2d8e45007b619d7ca2361a405ae4957cae8a2f9a03a5608775c9945c075e6d5c2f41d6d62b948c0e42dd553515b8df55644d651ecaa7aa601823c22044529d41536eb8567d41a18f24cd3fb09d4c98ce54efaa9967341800ed6a8185e3069a96d8a9e697a0ffa36db4aa3d5c8cf23e2ac00f523668a74ffb6a1de8a072727909826e428fc3fb762d392a6dcec7013a0245e6eed232cd3e2a18216c8641b1755780f521c34f8de2da1517a10d5de9ab515bae26debc1f3655d3f813776dab6cedb4769c95a084c5d1925e98c775c46246625994736c1fbb896a097662ac1db103eb763dc9a668ded22c0cc21acd9016d88343f52287687616f0c38e319017671b3748c6c0f30c5dbeedf58f12561379c032ca14bf017470cf31a23d074cc489db23a6de39f0c5e18e020f20a98d7f03f61f53d256182da606404830b66276c30831daee9a91f00167cf5da9c9715301619240d2226883cbb92fb79d02b5e39ebef0f909d03b7b27ee5794c3b1bfc078a843c4ecc4bd2f915f561119a74a4ad8512650a04df8c187d046d31b2fa3c5e862f5bdd1e973d39f681b6c891cac92f5651e3b7d4e4f30d3239474da7d3ca70bd69546f9d3f6cbcc7f44cc6e59f25dc9a1272eb84d58a0a7ffbd736ad61c13fb3163215a11913fb41f99da192b475c7bce96e4ad03b5bd2a55a6d766be94f32ba27a5422412c316cc7c28721457a22ce80ee3f446a101a1034bcb73473dfdb2a8aeb1f03850a5cca5761c4980826fbdf51af22026a280dd249e792d378ff671cc22b90824a12568a73cc5f1c868de07047138c9129d617fc017631a884db3d64ddc7e9a6231750eb86a570cc3544c6f0eba237ea5c774d003c6308d2f88f70f49166c4072c80e2b007d3a4c186928179147955fcce494d8c9c7a408b5357774419d1d2a1dad407897ba4b05c68553660a0b8b065d9ffef5d075e3d3d14b2ca801045fbe70c58bb68826d2df3d6f528003e3e42c5f6d3b69c6f35646b174b994e34437e409c1dff487048dce054533f3b7abe0283df9987766c590736bf63489ab8b19100edeec60c63aab71032644d90804f4fa2ce97392da9967d0264288dbe71710b65d63cab3603f6c2f275c97044f524e365a1e1c8e81c7b31d5717eacde91f43d3013f4b070e7bed17ee79d15e31228d57f2fa216d048d4baeb9262a5f61f84192ca7db26b15c967be97c76012dbd1e8d43662dcea6fa741352714be061339548ca0c68378ef97e13f5261087c142d5683bb8f8a1a28f581ea059eb0fc38ac923cb0e8c2a34f05e10402c3c1293bc1b7924ced9f2bc56b88bb9c8fbeb8bbf15bae70f683c206ceb4eb5b359d0b75eb634e632e19b5fe557f3b65578eea6be42eebc61dd0879fcb00ee1333783b0c79f2cf4da2a9d461681cfa93895ddeaa9aadbaca8b45e22b35743277b045854ac7f113516a72bacfd6a32377eeba0e52bf0c81ce4dda698d6e3e20e9c36be2dd1f02e60e3bf2ef444dac33e8fdd7728a83b3ad3c8d3db359b4fd2501c055d1b1a9091d2fb73d6e28b48f59b7066f2053775f899a7e14ccb57e1f5e819241193da229e854acf42e1efd30536f62479938e929b53b48b8532a731754a72ed8522d680064c99264a33e56c39d155d1968b8e8d95aec87a4837595ea5041e652ec56eb1b255debec82207006bfb6918f64f7ef0d0554b4c0afcacadc93fd40b2d25f255eabddae6403bec77066fb5ffee53196efbe989abbbb5bc8121764664cce7cbfc7f4ec5f3fb222c526bc0d4673c613cec560a34ad303f815b555ca5cad5d11a16b7d81c4377d95802f446d056a52fcc2f3c2f9dc480425540f84fabab01725ac94de46131cbf4f833cb197ea434d1735bbe866dd17cdbbd60236d4ec00ce03873c2cb0040a9b3165afc8fe6ce46f541f9059b855587f8725e85145e21200883aafbce96b6a9a0aa78aaf7c668cf87d4227fc207636d5da1688f6ec2d1c2215e6f2a9782190b53cfb3fef21d4781ee6d5b85b37a346a8a9fe2bd9fd2d2abca315e3155c8f13bcab490b0275d51b0ed05c53329f3c3ba2acf7ea62fe944cd35deb84551eb4097484bef3293c615326d8eb77a0362b7562a6ab72656f08236efaa10f6154b29ee1482ed768553f1cb0c926882ef730153b16a1c6db73829ea65996d033d4ffccf89502f6147489e90499f910163524a86931c865e50b8d22b4830278d87dcf488d07c85c30f40f422a7638d050ba3992090573bf16f4c1941e27fa89214d6bd156cfb1164ce92fe280d0491ad55b2a857d34c4aa547a275adf2204b9821acbc184c3af85f12015fc8bdc0adc09ce428a17296615430403d5e4096d6ed61976605dcddf5a943f5801df3f2366128c5760cde4b833eeca14d98d9981c013ea3dc7780046f05158a83cf200464865fd8bcc27698dd67eba35be00a775c953dab80b385fb7b9e25355999fb81eb15f10cde7f66f1d56e8af346a8c93bc03b9b37891221e8ed4c60e1c781e8fdfde083f27ae4f2bee4c0e0f0d469717da67e7609a908b59af2c1f2b4617bf7258c39ba34bf2eb5662eb139480d8989605a5ac63443f1df914230d683dddf996d97a030f730b3646282ecce5533c775093988f6753a04051f48d6e2d2d31e42ecc855dfaeca45f2cd0707ad29ccbbeb09472dcaab43ebf3325c9dd8f8fa68f42fcc51b3c0a96368beefb39d048718c23ac99f7daa0eeef195c1d78e2e06c98847f6b442a9301705d824987c126e89af68c6d59e59f9e693e9882309885bf3edeb16f13cfc50fcddf1a69e32f44c19031ddc2091ec09b3d843a92a95daab0be16d9ffad2ca602851b90e0b3649a03bd3bec5a2da2c6e56eeca2631c5b3fa4e30ebebee3a877436bb558ec736d4b1b954f7ff5993c93c5c1ea199ea1450027cdfa1d5c349a3e48ec88fe22838beb2915211c1dd1a78472e467d8754342612b1dc5f9313cdd01c88557255edcdf36d907fe2afb8e2b714619a0a9756a138cc4e69fcdd4ad308215e83ea7f8086464ead1ca4597d16fff994f238a641355ca0a6c4b67c16437cacfd82e877c06b3099c26c36c9ea20dbddc220eb17c6dad630f6de63233687c18e512714e6c6c71aa83e5b9c1a60054f35afa4efb75e4c57b63c8771febdbab8e178504f644abdfec36884bd6fec33f2d2fafc6768b9b7c0df3e2fb75345e131a1415a8df35417257dfb6e01c4165be8f04fb71da80f1719c4452d5c89972e4d06e190460681c8c73192a13cef98cb6b86381e665e1a469b1dd441b8ab24c3e4c9c3a865cfab70001dfbd4238a9b1d8db81b81735264fc72b0559483ca575b033677d9dec4b0a44c0c2912812d4952e6bc947aca30fe64b4cbe88af69f04e31eccb9036c51c7cd79a03dd3f5190ca9faf87fdc12a0904e7d1c31747e91f59e75bd718c98ce219b4f7432237a8fea56d2c96f102081dcf576d423180918971c1f9b33df51b596be0483babf01129f031208904b88989cc34fb7b7ecc2bd2b53107eda07d5b90dc38b416bf917abe71635239988aaab931067ef8605739aedd3a4da09c41ad4fa46a6b2fc5028ea2f9f2bc70b7082cb67ee88bfffa32c8c2ab8cc5def1668b6f8a7ea007d21bf52e564fe1dc38677181b277a8dd7061171fe3b6cf3f73757042785fe354ed07c6eae19bf9842269fb3f9b374f94d32734bedca9532153ce78842b48400100c0edeadd8037f60193202935e1383b95619931a62fbd307f8cf2d747d70576db8599605724960dc1abb6a54481e0abc72ef2701aeb3b5cf0d94f60896c1c803ff84eb4ac92fd76ee1509aa6e9a6c4c62154291e4dfae4b39a4322af6789d4a3ca01ca7cf2a1ee1bf928995d8034e4bd0e5295858cbe29c3412c86c98de2c8fe8669cf6fa27ded9a49c8446fb557e7327780b5fd0dc5a38e9ddb10ddd303e4d4568f768150cd508a0cc5404cb93cca261cfaa8e7d018ed8b2ad2075ad1d031b75a6557262afc94b70a9764d6b84fc7b166339b1eca91f1ed848b8142464c1eac0ea57d54d8ef9438dfc8281db5f8ecbc81a5a1b18885625f3f1e399de0db5ad8aed44e1243870429b92d37f8c0c85e333f4c9ddaf79be49fe4b28cc328ced6cdbd960aadb3724fc1114e4f1ab1075f847bea2954252cfa683ea416dcf5c05377855881ba6261598e51966d8264123b621f77d555a50b67532aacbd94c47744fce402f356a67230620a87bfa7994541bf38b0cdb18ab7064d7b5cd4801d5e3287878cb42b9d8fa614f9a5752c01448f461babb7e9c52635abf6d5c0b226b2d6446504d79f1643b8fc97b424a407443c3000df11e1a25e443a36df0c2b6521844e3c21693179cea564528a5b3010292cb973640f9aed827f8c522a1882a18b2a2c1796c4ed4084dd1d7b55cd0657348d667fafe6891c4e6770ba57375f58c168d59c7113b617671473089d4c0ff3fc7ab805bf9904bf023eda650b205f7bdb9be8d70a0bc034a6509f3ef3b1f91b76c0b25203426a200db9410892bf2584ecf40632ff40d951c9ee4970b61555841a51d376f0ee593fbef34b9107f25c1bb4dd0b2acc100f824131e167c98d3aaac069719a4b321339422e8b35c039c897790cb95929a20370d810e8c1266d14038537e75d1d336504e3a148d2497d2a958c819d20b01facf9d17c7ae62e4b7f10ca931a8500a7bae0c288ed4a25121996262505538d8c41a92a558c5d84814f72e9db82c90391678504a9a43787c0e6e5bf8f07b6fe1a9f905d346ff40aa4603327474f085ed20d6b988c3da093fc021376063205f484d8b7d8460538a923d78752a5db048fdb34e424e472af6e81aca7619dcca8280826db0131c2822c122f3b4f50aa4ac0d0f4e9940cc3c36281d3b2445c7ae154aade364e3548c9bc2a040d7df7360dff1081a9dae42b0ee1e54133ce0ac294e38c643751958e09793abe0f807e0e96017714daaa5f9b44b3884e4d3bbb0f62a5faa09bff38cc7efccd3ccdbfb7d18ca228581e2733cf023f9acdb57e359a3ca275a615283dbf75059c882ef7fb5dd86f059d4345f75109151844a7c7a596d84bef5751dae1a95ead41a883acb38a26edc127b9e6d98ad42b5927e6ce36854fed55518f428eb023e0355efe1964ea3e6e76b6bb3eb6a9dc1fae5302063b136ad382665b3d53020b7e9b2e70a2ff5a1e541b6cb62b964401742e2175e13e0f09db56e10c8b4953dd20caa072814b10747c0abd89186857a7a9578906d3efbb01d6c751fee8537b9f607277a4a189a98e0e2242eca51006b2671a05a9fc4756c61c671aeb99bddfda0747ce2d17967430aa9d860221bc48c2f3bf09726886331f28a41e4c2c020e4ab941bbb53d63d71503201225c9e284427269571f80b393fe42548b5325f08ea9a66bf83395608bd8668b1fff31b470da7fd42ec24fcf438beddabc8d3456355b21b961d591b5db1672af40dc119414d3380ed34dffc706187a4ad825b0ef493535741c4d347dd59b1f859a404cabdd51b288440fd4efa9e8718230ac9714545bfbafac6199a3821067ea237bb4ddcf741a8aeb4f4d918f07720281506b4766b2c550bec69c711166f5517ba7d29b16130176ee8ee1dc4d99ae6025711a5bf571570c4fc412ce30067a29151737a6c2c9407df073e7e1a42d8fa6ddc0dec317dbb6b97800d43f93e5db7bf567e4148e4d78723d9d64fab1eb1ddf3159c75cbdbf50a7e5c2da56637cb1f57a5d71167152d72db070a770fc54b3b0f5312a93a7b0b340b3e882826678c6c61bacaab2e07392ace388ade4dc8e2a504a34ec70a07f5579788c704a7ae0245842dd06cce582bfd35f65c654fd36645b08c3f0cefd3ff43bfe34a383edc76afe867c19de476bcbf0ac515e1308ae34677200f806123c0638170fab2b5b640c1e91a0170ed607f45e409106c3d4639608818d639908a191f496ccbd98ca0d2d0911707fba83f49dc877ca680b562495ef53b1f42e0e86dc1894c7343a6784a1b0f07aa51c9c1bc0dc30d94b2757ac33d42572ada373468a18f830fa3c4df19e22686ec005290727db611e25501c5797007b24131bcd1bde4b600ea0a79035ff9936091ce69c63dca168cf15f42f18885fec23bb9424542aa0119201001a89a467f63a193a0dc8f241f280bf86c3ccf27f351019f343a710f9056683a80017fc2d6757f51bcfba6fa7d130dec3e68bcfac06278fd35d16a5522a210a590bb1a24490215619375bf9310f246e9c713732144294f4d038f27c3d90f93a86863d3431578eebf654b1afe554b2922f876db57ff0dc61f9113b203be2433f43449788222752528007236b4b3d515e103d8b24b07462c2be52550eede51203cd50ca7da875012f6036fa1b03f1bca1680349487907aa4740753c30543d99d2c0946a217bcf41c124eba6b187b8cb63396eae994067cbb26734a6e1777874ad5db918e9d31a93c5a4ef392c7e4342816c84895be4ee0147bbc6f8c7be189dd688505ddf515245953d5742ca8ab8050597711515cf64888e671aeac186d961ecd952170781e960ee711108b85a2ada26aef4f568f109de3fdd58980e770481902c3043acc8901f9c9226eec1090b6f4dfe5e910d812e20b9aa55d0f673414d34204b644f479ff0d0172f4001dd881368635e19feb7941f349d906fb4bf9cee20be4433e8fdfa19174aae1bdab52ff40d46d287211d77052d28da524517715d22abf12fbfdf4f6257e1158ead493843f6abbf11942bc6e39b97e0c1f3998289a628b8ca837b113addbe76dc8af626d8d3ca408fc0028f65f9f1ed2a5e7cb9d4a79c126a2135e6a746169037a8ea6d0ac3802481c17b86348c739f5a2ed30c99be2292ed6c6c224fb5c2d594ed113d64278143fae4e04dfbd009a7c39e165ebb01f264ad74bf712391fe9a24a85e023611c926d6c07473ebd5de6192913cc7280446c87a20aabeabc869ddd8a36aec71c11e070672d9312d8e340dc117923f82e4049ec4f47e46bb7b22fabc721426ac04e91a6555dd223859f3c4f206876779427bce66d4b23e52d44563799cfe0341f396caf0c8be4a051b9515fb45ee68bfb9bf1663064ad10bf6e661e0f2415a0e135082d441b930ff4d4c0b060cc932c80efc9b4e4b17cdb33033386ec4df00bd1d3406c379c49f104d1a1dd88c510d580ee305931284df595ad28d8d9f8bf182c9df2fa27e0b2f220dd5490611ec57118acd4f6f6693a53ba757cc6f5a18f33c309bde7e38f8b1228ba24d3fc520ed6ae4f424d90c7a206b5bd55c8baa51fcc710885f0797e0347a6a69337321bf406ce0fa5e70fbc7631d14f3d2c2bc14726009e1b8aeca3581c407a0df3e3820f3e60bc1e2d2c0071e6c14c65b385673ef6d47ca4b90b643ade60af3a7c597734eb154cb9e9452c1a1a7407d38a58d28cc76777563c90b980c9522359d5f0c372dec7c11857212e43f7e91667192319f3279447e09709793aba09f61c5dbdef79e524be688661fdd8fe41f5f1b1236f77bbee8c87386ae2581dc19cbd3aee941235641b19ec66b7482ad96128dbdb5a88b6fb828b90a8681327aaf2813a44bddf12e6640a814ed6d82b04fc19b05316118854c9f0a080d19ac6aa2c01764e390f92238a5457e2a8fd3415e83207395e9f871c91b768d70ca39dd87eede26350cf30c67b79e17a024576223364b4a3400bd9b7763ca216d28e1fff2e3853c963c37a7f7bec0183951e939d9cc9028cb3576c17dc6e24be75c027e1d524a3fbc39ccdd355873a810bf68ab37811f2d36b24a7132daf0eacfe568456bf743f3546ca7ec2f158413ba7034a5e1c28f9694119b650baf834fdff10cb3c2d8e786c4453a44bcb533003dbabc326072d3b4d01ed6f0b8e0f1f7e6ea759987221fc3bbc57c14353bba3c2b257ec6f24f9c8ef4dcc265fe9b05c89b5bcb6f0f36555d7432c6f171dfd6a58d2d835e0cf4722724972ef8dd2099397858af139cad5a1c1d0505ad925cf93d82823a622590c69a81624c31733b88b59fcc5059d43ca84df2fd4c5ef65b4bf96a3c6a94cea950d77bf31e14b15fa67ac4e70cb55f118c7d1af0e4df308b097af4ddcd4406cd2d19e7cc52fbb340fb1eaf964411dd0a05a6050ce8eb6eaa58ddb1f89f03850a43baaafc729c05abe067d523b3d8981be298b5e4918db164880c74b82ef23b09d07313a271a88f9d2410ff2acf104b054ffd6f2242cc1ab9808bd381d2e16d439120dfc7ed3c02a5adaf34092cf488ade99cbfe9995dfdcce6ebea7cd1330c5199e06868472cba671b315ff8c6f4a94dfee282147980ad421a8b98712ed3e22db2202d1733287ce338cdbbb6201faa1379dbd4cfaea3e8fbee6880687c928e5f7f8c1a82c5cc9d349e717b8273bcf32507a777e81c184114923304fbb539f4e64d49731a7cbdc09f51d51ea0f6ef204facd71b76aaf858ab63900112a15516654dca80564a5877be01868f72bdaec9a307615322712fc26035b1a73f449f85a7be7e67178382eec981f741a2472c33b8a159ac39c7f7a1b5498bd5251b396e497c298570645219aa08b0e60964e35c2b4098ba6dac114b3b080b5a4425cea270642784eb9fdc1facd64b44f17e108795278010d661207fba8d11e5d2a5d451aa3cb930bb68fae2e41aaf7321a550dacf644456c0813a05a0fc9581ef01f4498e9509bfa54d7539796417681d89a467d25ef5f839dd473336e892c1866902ee6ce6553605039851c7faf9453f08fc82b21063c6fcb4c3c16072d32f864cd9bff981e541ff6b471fbe7f7dc5f11df9382b08507688857f6b7916f5dbd217e013c18d910afeca7463ada9aaa1ddfbf572a4d6ab4cad4af1805fcc77e1fe215725f37f0e0f0bd22e6895c20656dcbbed077de8c044e15d065818374bdc2a3354e9005d7c1831040503b4e47eea68d41b168a6ba77162d98cf271f560f0da1daeddee0945bac29d0163d91d5312ab4bedf01980301b267346cce9ec31bcbbfe3e10611de415a91a4e4e3dca241b1929e26a9d811e147bc26138de45c97aa72cdc36932b501476702bcf55279f832595babb0ce127b2983186b39dc95fec0909311a4fe5a106e7c9a0f7f3b64df3f8154b19ca5fb3ee82aff0ee9b1f735cfc877cb89c3f72c9f7e48c3b22f48de8796517e2d8e6ae04eef599780c03abcd6c523d603ad1c45577d49c2e96b7f40014f3fd6ac53496a2497f12a2bfbd8dcb4473909bc2989dce3fc2b612c7ca05f6fef8b9b0c15d198cc9d8d789e137de0be0583877380ff185787752cfc93bde45b990400a6a0dc301982d86ea16c1ccde5cc7541021574543afa2467080fa60d31139aefb235ac8b1949eff26e4bad2dae34f0e2413540e0b70e3b6766f6597966ff4a0f6f733de31d689f061682e0d9905374207e968cfbbe9d7cfa8f9c60c1364258246ae91f7965dcae324d907a1084c507b1cdc3a14c4336ac8a29b06d69570e3686d74668166309473163477cb9056284deb36f36c01a6cbc61f6b3b827493c7d06d60b11388178b7cde7781ad4e238d31bf0c060c92b03276d7415662882d85403b922b123c14d2668dd90aa5f9362f9190ae1599fac2863bdf8102eec0cd2a5899ebba7463756e9784313dfc86f2e24706187ee97aff80cd99f5da8f57ac0a8ac8a7dd46d069b7ee055ea360852b5a6a1cb627c5a448f21c2e8f46ee34529280c55474ebc0d91d51045ff9dec7230cc5456fdd985635e44f6f2bc099016d041c156ad03b2ed011aeb34d0926b5ea3990646d21f7babe63f92ab35a275d9d990d5d62145eae6e52f3fec08862da741bda2524a1ad16db2fda0d122fed3f054f55240f0381df87e86240ba9f1019c0784723daaea09394be95e57d6e8ae65cba86482971044a764a7b8503b3d228afdaaecf5bebf704b7661e1d7f187b1fc6d5e66ba52c4fa672cfc8e04b3a4f7d6e798e96966272f7e571747d559f1ee15725a07a98cab3b5f9d9bf6a576626bc00c2b34981b01858c03a61fbc34b4e04513ea6bac9fddd44244a85a64db057427c9b8525e74cc3a0bb7f425978b046b6cc203eaaa703a7ed97cb8b1c9d357c001b3f6eb3f86134a4c57aa9db6d6535def3567e4a56a29d9bfe65544c49c5914fc9a5558010af3445b92660f6ba08108062e426cf5900f49830e12df860bb2986cefc7df4f4ebe2438e894dfed41518d0110ac3b2b0fc202a8358e1ccdc838eecb7d7c98035ca06deeeffc1da1c48c663ceb58787da54ce7aba582b9451a67d89ef43c705b6f798c474fc6e87c34fc598c2a839f36d464183b904b525f4ca8811da45e0c5d4bad44bf6731b2ac80cb3599303a4e2671404c9031e737d0de418f7a5cace9945ea356bc88ba53a3de26e1995e46d8591709d3cba7f7204b609c5de55914d496809c970d88a1e6e5b35f704eb0ff7a8dc3ee3a06d8cb935a4d075165e430b2f4570f27c02a0585c5eca052bbe94176227ccd4d99d4282dfc70c0cab0b1dbb91aba30c7c1f87b6dd9afb01907fa3e5237c1cc7434480edbe3a06f663fd406ade1e9d983faddf7be9b29336bd15dfe037f5e139eeb04ef24547e6b71073d1c6c7d3752a3b4c5c57d5c5140ede07f22f833f26b392f7e6887e25f89961e4accb362787820c58c4a360b8ef352b54763857c660ccf5206eabec98c7bfef9331cfe34af7d1542ad0a6c827c89afc375490c2966d29144577f932add267e7e8b990cc6604d33d5b76e14846be76664d9613920a245281c82b0ec6a4571b1f65bcf4aef283e9376e39cf32aba9cc4ce95950cd8142dabb0b68abc4c16cce9c071dd359450177bafac59c72451594f494b3702f435c690b645ec3dc4e11d33d1538f3b228f3b33e1eb2b0aa7339b965a7c95ea0f7188fcae85e975b7cd7d011a11e0757bb53936715d83c99e4881be95856c9a876d35e2e218754becd86f9ae77a7d758eac36e20d40292736d182a4922c6bade054ff288c03958c27925f2cd9c21e73bcfedbb9d2a05439d1a2ca6bf639bae68659a4fe587e536872af74b3b5f538bc92d25c652a0b9de5dcae80c9921a6b4b3afc4878ddf826ba1a6f2d82e31da4d59725e9624edf6b4041f91681c3d6e0914d52d84eb230c214471d52f9c627ed0e8fe228249ae646be3940726088da1cb04b16589788ade063627b05068d4786bbab3deb9576477407b463a23b6aa2a268e190b22f3447e29a03a403cc71a18ed342d29ee29623dc1140220971401d450582195a570b4919cd28cb62e7344a093907114b5a0522eb4857f720b5a63c8173a48524d29a45dc0200cd1bf17388e310ef107188e6087147d9112d7d93913fed53c0bfc3ac88f69df8e118c7318a438b1dc6809cb824e46a4ea41813b32f17787b098707ae9785beb13efe59484034a104c411b51d44ea342119704721b4348332200eb2b534018150c7f869698302eaa8eda071d43fa82537cbafa42efd629e8085a0f944525804f906d26ac137009fb62df839b81d1c386677c87de12eadf1add6d5576f6ba68c494a74c741a495c6eb729a8ed6ab64444753155d1cad1dc8ea20a92d271105534b81ad8d464f32f242738b1b0e1047288b1bb15d308e886aefcf384ad9681aac4034122db8a95a68b16bae734967d4481b0e280784748d4f44e99f4351846178c1f58c569585c89c462123ef20045946462a315531783ef8c8a5d0688d62fe3d9026dec4227f9a47f28b0347ae800d3131c95c0eb1ec3897855694145a94039359b98af3fddc19457e6742b2eb60a96d1df9e4b447be3b5fa57f68d7fe34d768f1488d10e234162601676f1acbcb9543f3287ea7b5b7ae7f519dc1622fb39c47b9e7a5098ed65b0334e7fccef4011bab138e23dca711d3771c594874692ac8e83a8c65d1548d90b5a399aa1cab475b11d8718cb468ea451707bba315c77647bb833d87b0761461d3685dcaead0685d6644fbc8d4d6d1a344d19ed1a890f91c571d2e1d65f1a8fe9568522c64512543019fa0d49d1984529a9eb6263a39d81cde1621bb2a21445b9376d8d26a14adb1c810988a3c83b31360a3133443b9c291ebc8c9f1381d2b82a785818c58d20cc5da91eb405c83daf92296d775ccbf4d5395dd0e761ccf0a56b9dd7247b20d67711245831188c28281f01b82721a8d569ad03b4c6a2472f58ef9cf69e588d43a2ccb4c2b2549abc12d9346ed81f1265bd55bca156858552c9fe47c0548e38cd4dba896d12316a3a74714c041768ce641e02f8278f64e54f875a4310ab7c31f8e1f0e3f0ef1ed38ed4f6314ee8e1fc7bfe3fd3bcafe69cc202339348692dd0e123f8d980a215d5a934817c7881f0d18a46c078d91405747fa7f1aa3206747d91f8d1864a493c628387280afe310f711d25bad8dda4afe56ac3958914d46ab28f20eeb1c568ebbb20989ba4de41e70cc28774f915bd016773283487d87b9239823ac2693aae5f56a0e6d93244e47912e4d5bf070440747695cda96a8bc0e6f8243f36d21c1a391b69c96a76d0b6e47178ec08980ec066d1493a000da77e2fe8e2263344ff9cfb1638eb223b49e647c3acc8e69dee2874334fade6b455c6d028a923d4c5b50d41da5036a7830f8808fcc72481756b74e3c50ec1e62685a639b979b0d668e54de513942b69d2a7a9a2dd799f80198376b14408c31836c420d41c0035f92a6ca63fcbf5fa9e26c953c947198c6d16cf7277b6fb2a59432a594523805750457044d449198d6b4dc66ccd0716f25312284f45b3db41efb4a83332acdb2b00aabaa0aaeaf55bd25884088ed90be7a8b84c1d576a18661d7b5cea9ea077ef50ec301e515311e4b0e059d704a4f924340224e49faf001e4719c2e801f880d0ed404f0af36803f6a3372acaa776d17425f391414714a4e66efc395cfc18f3b500ef9ea563d54929c8263ddcccc7e3189882b32dac2fb33560c136ad5b47608c3306109a6e5239896bb4230ad079f16192999abbde99a56311234a1d646472602a6166539c2b4f85acc06a6356ef9cfb822257a4cf72727d3892bf3f5bbe9b60bde78328763444ef9d6c27b1bf729f7348e63bcef694116ffe9c409a50a7bc5f4ff79b28bb591537a59219244097c6d8264ea43f8fa55b6bc11284274a0615ad5b599d6f0eb2892c1d77fdf3d23467903670ec7a81a7a4eebdf70aa6748a635640ea77ad31f7df811c3a1f2da1f7803be62382015572602a61671842073b11c580e28bd6fa686e5580931e5940f0c3baeb9dfd8ceb6bf213b38710121c466599e5c4008d1d3a387284864d9a1079accc40b84cd0e7f42cd645b663aedf20a21824a11459b44d681227091e2888a234c61842e3b4042f3a05dca0671c58699796edded527e444104289a60628b9656c20521106558b8b8142780e871a1c785279e5862892774e7142874a50ea34ce7fe76290ba6ec1336bacb595830775fa74ccde10a2b8ea40445f143101453b8e81ec124c77eb70538a59b3a31f38fc9d6e4f7fe61da20451098a8a2c50a910e6468c2cccc59672c430e6c7899b034313373c6ccccccf105d304cd87a982efee97a2bfbf311bcafa4ba8f6767747145c331be0809979090e4afa067d744377b70dbe8adf245c850d7ff435e03faa6169d8ee6e1a6cd6249bc1365919ec22591b8666e8ee8ec11166e6ac490603ddddcd9ac8d02f68231d4317691734916e010bbabb7b05dddd3da4bbbb55d0dddd29e8ee6e147477370c275813fcd812fc58213f96043f76043f44102404422008fa2a7e3fc0ccdcbc581540f6c7fad817d603ebc2f6b8c28a25ac12b68a4dc22261a9d8234cd1c408bbbb4dba14818b1447518080083fa0f8f1c40f277e34f183891f5b7e68f9b1c40f258c3a0b8e2ea636dc062c495c41e20823daca10aa14516413c58608b6894245084304418820a60021e5878d2283ec03507ce8e1090f40d8c1890e20b841a63fe8f191e904810f7090649bcfdd0f644f78085abe21d32838467c8097874ce793a02efd5abab71c75b710acc5ea29c2f6f0c0cc3d4be420882b91f137c9f8bb3b885116255894644149dce04a1684c40d8fe48fb041f6488c5062e50643a85244111149a82411c21041b041081b82a8c1141a804822c5861f98f06e86c490c97f45c9c9f1b7f47b8664fddbcd6cd92d2d0005073e2ce90107de23800061a877c836356aadd9d75124f387935f799453db063438a1cb1b4ec525da8562d9870e00e107d90cedddddfdaedb7d3043b65d52870b7ac68c120f9c50c21b8d67113249538398fa57267bb873e2a40e1d64fcebdc931862faa31c8a2fd11fa1830b7430838fb5d9dd1e1ecc20dbe24c4a867bf68561b3577670246ba26c5f470f82b889d4e183e8c3890e3a7e90698f073c12b5d034cc2d2a3a32777b72906d6ad46fb5a6c348364fa819ad21808e18b26c89f8052639e0e005bc4bb22d461d30c8b6d3a965f43313714a9f61c4c0294025d3cff6e32e510f0ed9a6464e30456127cb2d85b9d978105467e440806558af16b800cb28bd3e0676b00cecd59280071a46378c7e4b23691b6018373518467fcf3e3dd9ee68bb991dab10d9321130b54a0b9e4cabaf2632b70b154f48c003d9cda67a6cc85c6e6a34370ef64d3fd72db09cbe74295c395a6c07befec21dedf7b6dd9ffd7d11c64bb1851f372e89e41e8f191f623b108b5ac34b22555bedaea63bf1498f184f9443500e596fc158edd3a7d129d47defc1b7bbfb225f5d987906cdcccc35d8a7623a3e9910e24a90bcdfdef78db17ad57baf77e1ca1c19f53d793196e3c9c85b0b53f6eb28d26f5755d55909bc3b36d84d2d3930bfc32a96077e93d63433af5badf1ee08ecb22cba724539d54958feee8e61bbbf7edd1d91285a5983398b298b5984316a10c6f51bac185f64a6fdf66ab51817fa6ab1f4fb6ac2c764aef282a3f95ea566f13cecc67bbda1b30f2bb9e9afb0d34ddb7ee494dbf490dde95ec65caccd76dfdbd5b9bbeb196be9eed65e44ad799abef73558dd73d5e6c6c1d2d774eedfecaebafbeeaeebb2afbbbbaeaaababbbf3bda1957842d7b508710a50c9fe94315114dc4f003b694d0e4c6bfa2fad69f72c84e5aeeebeebde53a7ea54abb4a6866c85c859b9a5d0db23b0a00e1a64fd7ec3291b5762e0eed1ba184d218fdaa8340877611ec23c0c8cbfca88f1b8219827d1d0b8199a2be58019fa6ec6ba5579f33ce65c0ed371d239f7d87e8d76339c721a8ea1349cf298777228c65d9bbeca1ff74ec695de188f5ed9dcc7683e621ec8e3d4f02b5d3ac6e386622c388420bf3a70bec8a1ee55da80d60fc5c887dde069dd64bfd92460012f2fcfcf80f7f2d68ba63cf07533d053051e3de6cbd790a138987ba8551f0188f3c25e8103f32f72e810ccab1c9a98ff52a04bb6c567941635a7c16835186ad593e48c1b184a6385880045610587eec11937ec6486d6f0cfe0179609c23936122c77226857951efc39fd5c84931beb2aacdd730e717c0ec78e4b58474fc61496425b0e426c27bebe735bbd35c3b9aab2a0052174eaaab98dc7acdea95b6739cb22399273ceb11df8e370389eeafa78edfe6a03567fdc6503b2fe0ce720437e4f2f27bd3c4e9d5377bdab0575e1259561ec6252ab18f87d1276ce39f75e13d0eff89784e1e0ada22e7749fd693b81441ce79c73f9ba7ba7fb411cd7746a4dbf23b21cccaf1c7a51d5ec4536633854d6688510bae554e550e90a134f8eb857393e20ce0b3c7ae0949e84dd805385a1d25b7b69e959589cd23bb6a339d6c278e450c961f1316df32d4eec7acefe3488fdd330ccdf93391b7ce594fe0ffc07a57455b94ebbe2537f0f73ccb11b104ed51d7d88e580d265e4b93e0396a6028f1e93245fb8bf993f549219c3e0af64d41183ecd21af8ac345668456185d364a73990fb43e99a99891c263374980d1d451ade70ca9ff38bb11fb4bfa9302264d7dd9d479100926c0973b5024c86b258e66a2f66635e654a0e7335391de355750e96566bd6bb862b498c08f96bbf6a52a59122a9d262bc2e7fc776fcab87aef1b0d85d7ee95c56655555e59c7ad53f2c074956f2e2d4c31e6297f3f7ded3c664c0a4320c8bdf0c47fc57c8cbfb21eba3e6e38514486f69418fb3cc9035affe613bfa2ea3bcb61b9ea1a0134ef52a87a2041271aaee5f6d403ffdd72afd77fc955335d8a915381c83dd638a82eb3141e6749c330cee611db9d9a5a551da13fabb9f1330043146f8e40aed092ee3981eb8ea3ef8dc2e1596ae0e8640e0d930e0bd77b914de63e0fd8e7709f1ebb252294ebd5df9ebe323db9f49a150a6a851e08a2c7ea58019258a530fc894b94ff3fe886239dc5fdb6fd1f5ee6c4e0e5f4be3c669399c7a3753f630bf6cf676c920fd7b0cb40c929cd902c4326c6820c0324e37ee379db25ddb23e28072f78727d2bb138904218424773ff9bb93bbc32a9e5033eeee2e83cd0816aef27bfdb234737b0331795b8bbf26821d6f41655996bda7eaa62c7badaaba11505597eccd2f0a3333337777373373962106d043b6bbcb362e836e6e2f62a3edee45d4db59d0ddcdcdbeddbedc5c5c8a8d37b1eb9899b915097666564581b50c7b9d83ba707763177165e6cefa08ee1c3bbb6aa6ba0276e79c73ceed093533af58cc0b5999e1c2558e7021fc279bdd99ddd904ade93fa1fc994ea8999662e4dd5b7298ddbdfb6f7b9ff61e9c4fd739e7dca53571dd09cfd2a454e44f5a59b933cf6832136adb48486fe7f0fc4b09bb2c5215e173de8ce51080ba2beae42777d309c54e0acbdbb3eca9ab9b32cfdc5d992633a190b0ba93203277954dd01ad4099eda31774ff1022589b5eb1a333be79973ebfb32e7f8ea179d99af759acc84f2d84f8ae5aeeaaf5f7f96adbbf79eb4869979d7693213cafae1c90b9dbbea1c43c8acc1c91e39f23b2d46f742a7b2b2ee8bce49eda6c94ca8784561ca366bc7349909c549983276ddcccd349909c554babb793233a34ebcdddccccddebc326426d5b76f754ea5c94c282e2ea58bac5de5d4e2a05bd7d9d9fdc4bbccccbdcbccd7114cfc74e5c8ec476d33b3bbc7d7c4467b77d77442cd4cf102c58d685777f7554e412b1247bbfceaea7b7a27e67ddddd7d839d5e5ac339f89d7c6d3aa166baff396f67659a32d70ba335a62c459399505c5c0a11ebc549278a53abbbada853bbbbf69efaaab2a7c0eaeeeeeeee3ec248e50cebc0bcecea4658d1c829b681e5235e4be3cd969b4df7bb1bc1a45f59982d67b4669f00eabbbbbbefcdeb025e26ac6e2b4370a05f6091e25ecebea66a96a912684ef102858b8daaaa3452e8ef75d6b5cd59984afa16a6babe54f5295ea0b8234a921811f25e5555bfed1e250b8b533dc476fc7ff69d741ddfe5502581449cc8c28526801f461b304d1c43bb7785d80409633c976236541dc529f6573404229deeebbdd74e00ad393d20ddadccdccaccdddd7df4a25572587d1b07e6a535fa3a2d6d38d5fa2b7f56794c27d40cfbc0d26d82446d3ae7849a39b96d77870eddfd3117116432affa7b9aadaae9849a794547a2bef3e1c8872b3696db7d1ba38cafb11cea2e3641c43c04f7703e6386c76b6938206f13645127ea5a31515a1300add11183a3c94ca82df2b960711196a259948495b933cea8eadeddc5ab8467a87a9643f0df739b43c9c2e23c7f87c3653b8c6788e5d09340220eccc9e9df9c9d9f5c21f23b77ef70d48d5d5aa9c348b64d7dc0fb7d3569cd5e0c8385d6ec3f1e60b49a490fdfbfb92149ab2a12894482ce3d84ae8af0ba2ccb415845e70e3af820f65c073b5226445942c98e54912bf2ee227697bbbb9d7b42d0833e291161c2459f14796f333313713a80106640e5e440be0335d3830962b00345c5dddd1d0a6883d87135113d21d8a8c4b6d16ec37beae498989898189877fd3072dbf978fc2acab61d66c369efbde7fe3dc76cc0c824ce39468c924dd2fdb6f0583346db245da601a6161d4591c2c834616a91143ea6d5978be24fda09e7b0d3c9244e2e134ef503c06d3e1d4f18ecc69a7ecb9ec52bb388f97dd7323112a867cc93fee5b7ea49f2e55bab00519649a096403dad5f9d1f7f9f2d7f62beffe5b7ec5fe4a645f35912a83309d413e6dd7c31f207e61b078cfcf177b3b785c678dc74d94cdcbb786573dd6a15f48a2baeb062f6b75cc1adb7beb10a54c9f687643efbc674de6f246995e65ab4b421995f997f79d14a5b76c37ad7e297a28ce6a30652755d596bb2b5257b427fbbf7741edd42c62f457a898204a99597f71612c27c848260bd3e413e413e41432207350c472116116e1c642e472eb9fce18f2427918286604d2205092161ce414cddbfb12461ad564818568a7285a24f106973f1efb1c65a48c8450b87edbe2d5ac8b22c228ecc1cb107b127596fd2ae97871816532a758c905ab1482412894412827d9584848482545028666560e8ea7d99b82cbe4e0b32bf5cae647409138ec15b2aae54e615e62dabd4ddaca6ee52c985c9b46469f473e95bbca985dc786adb32996c7221f9da9661b6f4d76fc5fcd8c98f4c55550a7f952c8dea2111b78ccc57b07f2b3db3dc96c97c7f3db704e29204e259f16fa66596f995f96a6b98e5afe46acdf2c5f52d23c3aaaae25f25dcbdb5f8f7db3299f065b865bed430e677490b175b0b17d5fff44bf5dfd58bdc2598b4b6944aa5d225f394ccea21a623f3cc428395f6ac97918991312bed66bb25b9a55db21b1073694ba56b77c99eb0e3f29965d7632f972cc9abf4ae84c95db2347697ec125f26bb8445112d20c330dda8b27c3806fc5209fec2eec5b272b1ec09f0314c677de0fbfbc07ef81766033a66c3492df8b44fb7dca3f98379c9dd87fdb95483b194e243c858843062fd1b5cf8f1b187fe7cdc7ddc7ddc8f7e18c2f70db73c8fcc0fd7a8ff45b846f3fde9fd4d3091599c7ed32b97fbb70661de844987fd0f42e8cc4646b39fd4825b748b86debdddb285c310b11823c6fb241f4e41f99e8576fd4973f126ede561b4ec4b9a1523b325e6a7baa6f5db8e6bdb71c5df803a46991898c5be04d3fd72692e34df71a9151f231896b1220a22f3a71641411464da4c2d22829509050d4e28a1cbbc26fcf745474445473e8aa218a2280a1a8aa2301292bd7e7c798b44daad5e29c6ab7456affdaa5769a5b7acedea7ddef78ff53ce6abaeb7aa0a5632af82fcb9dee281fb73bdf5d37a18b9f1bc6064e406c496bc7e576e2db0c0e3555b077a730fc4f3ed836f59414be37dc3e02a58fae700500125bf5592a42483f2b74b02f17cd56f0e0647e9fb696ced57f285f58de3fdfe56bf4115849be9dd975e301d58fa52efbb078049caf4832bf3fe07f6939b0648a4bd2c4bd3795d572968be87984ee9ab188df4301af6acb1f8a7b9571f4ebd64b3b2f665ad17a1a5b101c10aca9ff8efabdfaa5fe71450c77fe917f04befde3b20161aa656a6bba425643de97d849686da20398c0199e6a874eddb26a95323020000450193160000180c08074422d1789ac549d2e50314000e71944868542e8e47429120c6410c06310cc2200860082184010090610a12c406f1aa297d7058837f8b1b6ba6a3b8da89d1f84a5aa68b30e13d60385e72130b19bef353782d285777e3bd89d566e9052d618c076c4c808e8500728c8f263a684805390b015d0acdfbce444428b4cbfb0f86a096e182ba0791435a78ad3dbd979bf5724751718fc17e493b7bd46a4c5151462999718751b334a9b008287b845d690e402665510ae7dc076e317093071a124bc8174783f64a5b7d8e745ae5c15166fabedb2bf5b747fb077332f64217482da436a5fb07ba04a95cd6931ede4c49c1021eeadd3b99c01be9461087682e8cbcfc22e0356a558965f15425002f19baa154a91c6ff1fb49aa6e207ba3d6d0741af75ac4034dbbefa51eb864f631084ae52be461002f6f6e8208539d893d6672ba87cf7df15a40878ca5f90782498f7a24db0365ca3af222b1e5c51a7065ef2e582a19fa29cc43bb45d58198ca7179976ad19587758125487c092826a557702c42741466d2d6a2d4e341fdd4fb54ae27b63eb3779151a080d0f83d01bb1b6d17bc62a79aac957200a35828c9c2f2c4007d474a70f84bf8bc5e099938c89c821ee590c6094ca0a1bb517b2f5375eb4fc18f852631266cf9f198566cfa47c02c04df6489964ba4e76012a1ef892d5488256fde05fb9159ab0df7f5be07661c81e400d9dde857733ba854fb80b1d0eb88c08490951e422e08fb3e8ff9c36587d2a368ac38febda8643f72ba3da01ae40e32bda8c30b3d3e04f9316c4d0218c7bb76e38c00666d68f5d0f851081cbc539d666f27282a877c33926ec27b1a2a72f53a6d4f49e924cf03b6c93234e8addc105a576a3a245d155571a7e57ade80a5eaae159affadd15307a1fdf323ebd23bfdd0d41df1ab9892a1bc612c95d85a73749e2577999523d279015efea0c24817036df00c1d3b0e0f24171651f8e371b98c1c041698571975608392b8da919886024c379bcb3bd654173c928b169d6442dc342d87a587c7098b6b1fda20fab51f7490a56e2110204efecd23031460ed27b558f93b03e30316436b0864d7ec293fb36e78c9cd36c48c6e348b38f1085c2ced5c7953e8944ee44094d88f46d159b1e356650d22c3eae2510c821ccdfa28f074cbb487abba532896739b645a4084556515565fe82e0e94593cef402bf53b290061303509286c9fa877e1920b9feefc52697b99c4e2e2359c86e5d380123a184ec5c8a539fc1c14b4360fd0a1701db54820bda9385cc04ecf9cd839f1855ce143789da8752b4d10f49c1625745413776030ac05ed42e0920e1f46f1f0fe9a07e14220e3024e8f1a6a83a4874d840c1e92064360b25b18ea5508620952186ee4bb268cdcee469e32c41902314b6808341ee860598eef790d81a3aa6dcc817657d882e1530a41e0f0c8542d71f0136678678e4f6143e00a3ed6566a56f861b9f1f16bb854a85b3719fda4a9bfbdb021d06c157023086ac699e1fe5a39b061bd2078d2d0a8432037902ccc2499e61d02338139509b232f18702102c184fcad04767f2a37c75fdd34e70e8106fb4afa03aad5498f3a7d2fb07505e7326067bbec08ce7e77ac46d662952ac54edc215056400a9f76d86a007708dce721707a61c0a0a94ff4e1b6fe98c57cab0d0f814b7f58b76a58e2a78d831c5e97a41f026593c41b4f6999129485c1cacd6522b7301a794364571d8d5a601a93d1c4177263e19876c77e4cdc38154420d854e1544c8c8d260b15040411c820f838bfe74b18f69f26eb2c47b35e9d85d3e48004f942474544203218ac222210b5441e1b9b8e8b08dcbd110bd5f2cc214a03801d657bb38b5b6e6fe250461a5d7953372ba5a2bc70aeb37ac727f709bd4542bd3e491db35f39fcadb71d0b844786e5967bf45bde123f4f55163a60354f52c7977c270b68217fede7065d8be2bc92165cc567c219465ff22ed01012798b33b5747624a60d3acca201f1c5a6bdb3fa27d06315f58a1cfbaea4d1c465e2c42aff5b23f435a0631daac354bb2a25705df2bdf38ef57e1ffca72bc700e163293633940990b038e33d7e995d953aabb74bd20ab9785690f07ac424dabb6fd8b302c5abee19e4a391261ed6289ab4a4bf6070e8176b92a1fd8570b2ce3bbe1e767eaef77610d549edada1f17fb6211c91ac71d38653810bf6c5680a2de393f36e9ed5b0796a08086ec44691d2e31bceaffc707dcdcecb3f862122eac32dad881177f2a4515a068847bce0ee0eacb1f7c21de6f98910a9c490c28f13bd2e80134bbb6699625caede7908fc03f915c2f66c20d65633360423f2a67871bb2ca104b501745a6fc388e221640562f9cecf92c0c7acefde7ee1bf21f58bef2db0ea057f697aa762c0ba936ff7a5c21d5ad98006c532dda13e3201c14df00115fda881f9144ce52e2d3527c7400ea1d8a396767527e8e7aeeb98ee81565dbffffb40911fc826e244e9a87b06d2076ab72ce7f49a2a60ef4e33a58b5745c7bf0267614e4a3fe21ddca8ad2c5fe6385f1101f9a1d3017772494607bffe0858ec2fbb17329e13fe79b007353df199e0ac836f8c071e88e776952c35e4cc75c161bb3f9eec6d83aabfe464b244a6f7e6d74096badceb9011498f1dcf4b788a70d663a2180596afdcbda721f720ffddbd7732ee5e144bf7dad078aadb8b9a120577b8c8f47acf855e707244a29437897a129018e41053f5d7f55e89737475dd2c97f56979eb5d79761cbb3994822ad2becdf46c2b03a715428c76fb5e85a0bd870045f46999471b4dddd8cd65829ee306d414a3824085a0413d8a4fc51f1e5588f71d11fc1c756897b7db57395c75613b29bb769df7a63bd29e5be3c8a5a3a63ab1aa3d63df63eb34fd8f9b5bfa86d074029d8e3a9254e795e1d8053085504adb3198ecc0a5155986b2ef0d153c52a9b22be2b7dd548dbad72b661029bdf63d0377c3ae55ae9c27dbf780300651b46310771c32e9eb1d930380b187b4b37d4f522ceaf63dd9dbff8bb69d79f81caff1a21a6b4df34c19f168f3e451c22e02ecc9e699f81c80fb0728a7c990ff22db1199dec04a7490cd48d048a10598fe928ad42908f6a9076614e66a0dde42a3be6764c3a7be37086077d8b95e570baaef1d5593526879a24e51c65e60505281a52675e64dfac36972f5bda2d205aeb24b89fcddc89901a0f067cd1923109d9f3a5a790987d69c9eafb633374e402b7b93d0f7d4d4ddfaacecccf41ac81b272e8ebb1e766e944e699b481b8ed4d3915cbbdf40edd46472a554a6d3daab6ada0265d16e4572dfa07ac3180234c01eced2d9841ace056f5ef5f0033b4abe77bb03b9b91195b55c7f7f6ffd810c98ae44cb3b55c7f73c26707cafb53262eb9aae7e3f03ec5f90f848cc4442fcf1bd42a67944a84d81b66ee0ac2106dedc0aa03f15d4f75e18b10fcb5443ca40c48df85d853bbd8ab9ee10903b86f4d226436f3c7c8f9c637665e7bc5183cf5f696bc82a0c09cc2e790794e507e7fd1569f2883364254a40146aa627eb762807f0d961ce0871eff55866bf37c97056dc7b32b3e2422e575cbf1fe8fb14f7de1151cd3e0ebf3a0adc1e9481956d71c96d94bf597befb20e4106db7bad51512fc3528559a37826c26053485b1e97b6363140267bbc0fc087b7bcc414125fe1396b1f0efa839807f9b89a4b4df103e0d4f85f3aac66e55cb614a70c619b050d997cf7d0342eefb45e1918dc39ff576b59e9eadc73f6e1d8767cdc006d15f5be80dba6cb34b2c9bbd511da8b12d015bb2b3d1a6b8df0439fd50b01cadb346847633b7e4ad74a1d52ef226cfacf220128c61c67540031ea32f3950e57e68a9d4121125bff0cb962a7879fc89a3ef1a25ae9cfcce3a750e46fd17afe1f31b4c7ecad1d1c1344664c194ba21bbeee417899ed7e8455c5da0200ba6b19d5976db63e86a947804f1832f8c7e3542f9af95ad0213a012c719d222101772ce158cac31155f4d9d0b871efde4e1e6c07db8137eef554915ac339a19c8ea83989eb74353135c6382bdaee017424dff859d29806dad02e4f1eecef495c5748264e658b2b8dea95def39a0a5b745834259635036c67940747d7ff5764e5ddcb1b4ad2916d536092131f90f0669f885fa2a198c3e85399489dd3a22d3a7864c925379d802b031970d327e679575281bd2c06089156fd18ccb57b04465432877c4b984f6004832a1cbebcd0e5f40cb52ff89ade584fc991727ed45a169d96a1cd1ae511b0735cbcf3ed64a1c21455a7b14665e62fef750ae87b139d328d36bc9d33598dbe69306fa9135b862536e0cabda9d55f5ef35f3fee55054054d17a0971343cc8e5220284de932052f25913d1aff87041d432156e5b9c2b5ea4e7b47f04f4aee8473f00f769502884b777522464efb6db63c975f124f85f7a7d820d35a9d3f53c51c44c567b913182c368253450af440ce169f251f3308fbe85e0615ef07758a9b90eede85957f551d5dd1ab8289e42c7fc1aa9a98b287aae5ab60dcd4e163e3d0eadca41c5bcb70279888a79c7dbac1bb214bcfb1c62a2bfb6ea5058ecccf6d1d4d8ee030ada008b3e745b82ad23bb20bef8a5a7b43d660fd4363eacd8bab733a294b6bd08bcfa2781ef286566740b629b2008ad6d7f88988a8e7eeb90499e04bb7c596ec7376855b89d62bdf040f91c360a6b5cb44da441b567f5fde1d40067267561a985dd508246f403308a3ab95fa33234e409b8827421f3db301fd203b39feb11d55ecef8b5c8ef5833148761e1c2638d6a500d00d09e78800257c8bfa89980777b8ad6f974646ab90d6dff4fea9b41a7c3aa091b82e7051aeacce5f41840b9fc023c50a5a00319c4728de0795489cae16fe5c4b7dfb9478e05015ab7eff3660a73fa8465ab968cc78e1f1cc840392c0ad7963d68e4adf01c3de3de5c3850824e8206024729a88808b6c37243beb2b739084c9f8d46642b4bac269fd0ae9a5a149c559dc63cb90359b2f5abb55d7b3b43a64a8139261c97ce14a683769e12fdd61eb0a3600f3ea8e6601118d8a3d70b1477a9141143615bd0499ca247b0bb8f54c40077eb27898e2b5c65f898198611ba7e36a123d67bf3a730ee23ee2c24c5dbbaa9729801855a18141988b69278241dfaf14a5aa05f79a872d6e1cc567804aa1f3402e6aa01c076a1ab90e2437f4fe1c5b23148c29dcf3b95cd74b6302a620d8f78794c487863e06d08b66658813fc595aa9982233e541757c4f578767586c551a80294ae773f91c004549b4a254350c7fc446c350ecdf946f945169084fc9a106baadb71bf1521c0988617b131008174afe9a2222f1ed3096ae52bf430c46608b919836842300ac0d4eb56cfc3ec97ccc1f4474703b741e68351e9a4282cfdde6a4266ef65bbc586f80899e0d8aa2711bcb08ed56189bdae174057fa1472bca20c33621daddab6352539df48ae4d1d62bc7adbd5c5bc3f9322146d906be5aaf96cdb6a807c65873f68e4a82f14ca4795dfba20fc59538eb0c32066bc6a3231f0b3e50b55ee4999ee027108ba4f94e7aaad70eea4a8554ea6b5b01d357d21d0a3d883ce9371e0de95a000f3b0c5472fba931d2bf72b12529fe89b01099fa552ad4152607eeb61fff9115e23009eb9efc97e5c1b43fed8f2ffc3272f251292b5f8c442fa56d9931b1fb8a71f659affb0ce803f4add86782a1a456384fb4c37d4803bd56a832253032eaafc4766f875314885ad271ba52b41f2b97ed8bc184cd28ff12636108c9e166ba00c8d9b59e67e70f843aac8d53455f3414eb14808ec9624807c2497c2bd6b7856edf3dc97a95b37e43756d0581c073d4408123ff55b2e4f95f3584c2a218256b8d458c9e1da4d4d6612adbe236b9ad39f21eaad1d7bee0606e077d5fc259fa8e4922b74e13fc2961c4fc4467ece269be8213eca93eae941a9412e00622e6bf194157a26c0909de8771e9fbca6fc08f05f00c2d30841fdff46b425143e84c8f426bf134337852b7d6dc827962095960082d5cf43fb0bfa9e2cfdd74eca45a418b91d778bb4e847d3a83e22e01924e74972f61b004ca64d9424207c18735508fe86426b2f6479ea65a7ac009c223ac622e4b2efbbcbbaeee5815b59edbe9c113d4fd959b7173829886936e0db61e0ee2e2f34b374eb6f1dc066f61fa825e0a3dffe1943bf8452d6990c1d1301f9a07cb4f3ffdaa600433df0506b2da25936cfaf521f384d66b220948ab035949a21b22194be95e277e8b2a1febce1770751124815be31779dbbdcc8a8a4fb0a21d2cd2d38d0e282fa307c012523e4e748d016c5439a7b3cf9040d10101677af34d1c186fb05f2f550c86c7cd6e5f2c95d8f7270ece6296837b72e18dd5e329bf5bc3b5f148bbe2549c250afdc0ff33fd1496919bde40bf21ac1bb93fc134eafdf54f9e2ef548d50d4184e38a24fa785c38f3d0b90ec02b22e4aff4791e0d84f44d79bc2943f3d6ba05fe81b9e8c29735d73785a75165b44e87f97c855f1bf2243941a2476b7c546e1bd111e8f32d23ac04295164a30ae3ea323621d160121315fa477a009e0f8a3631a8bc0f1fe1f31dfc98c6194f9efaa4d1e11c456c3e168bd69a22343c14b9fa941dc2b4f5189f661524d16031cf4b80ded9ecc1cfd1a63ba2cb48f4f205585c9210fdcd8f5303b8468a578aca753ac2c3718a95422f90978484f6b8e75971df8a7802437da2471cc0d32e4f9da06d16f5f378b7a07c9044265ccc30d2f41a1d9438e698ae03ff1091b92318bd03ae352aa3472f11a92a5a4c4c953ffdfc9f5f2535f32096403073f577e78d53a9846f540ccb4014619cc95a510afa1c2c45dc9bc923575d99f86336cfd6533a17fa163a103c71e32d184044478436c4478cb4c0aaef9855046077bd3f01a658b10ecdc906f243b6ef4123180a6ac5f6c5c451781510550ad0b3f776a403bec80f55595c61f5ae9fe907e63981dae8a25680d32cb6d79479293922723454a9684843c12728d0472039494f9768162f7abd210842535f11a37dac89963af80755a33e8cb09dcb392c4ca679e4bc7eab544a2de1e356f231f485dd6d737dde8e761403121e1602915b27516e43f3d09e7d49c4f9d4a711d53e1709cff8168058de9a6d3a6441d24629549e314d0a7ad95f416915ab7f9f9b5c64ce3769ac82a513dc0b39269c476a6121689b77fa09e4ed8b57f57ad1e454e3966fa53df61d9481e38795ed03def61e9385ea20d777c3d0c4ccf4e7dab6f8647ed4578bcc3206889967c4a0cc01380f51769d2a05485ec3b5ea8b5f47a7e5535f8440208af7475c68c74887a235ad4ec67cfffb955996d405fde307c0224454a26b57c019163ba9a98b1af1644709ea283f9958db02faae7dd27ba56cae4ba0fccf2bb98c322837529080f85ff8deb0f52fbe82f363ce746f265da0656fb7d7005b100c023f2c6b3b307f92b77653c32b5c07d069b7c4d15ccb972ee8c25a193404cebef7bf3443d5be6dc253ccb7b27ca9ac42f286d959372c1d86833c4ac4ed5cb09409685306dce3a3523959710e530e7aaa346d468f30f73f3fc1bbe95c10677ad977ee6a6f0843333d9830fdc7e3cef52824d1bbb09ec9c88352d6fb4e596bf4447617472fa0c9f09729e8b84d48d507aaed8d9579c5b0d5106bed65287549b49b88a9be1fa79b46eee6f94a143c3b83f6cf7ad2f8e14ab566bf7fbc50048dbfdb489dc12f20a5625745ffb432acbc42ac2dc9545cc8254884866bed6f19dd620b78a3d8752cb94e211dcc8d157781cf4f98f3df22db1926163c44d5cbc11ffa5b90fdfabf97d213fb25d0290ef5e09a085e2a10f8b29905040489c9b928670bb0ab99f2e5f6692abf674af09dfe01a8b1b2570dc20f316d57554749cf73ca66b8e60f9e6447f6c3acedbed20e6d2946037b1dadee565781040f2de70ff082e4e7f7571e47c1fbd9b94101bca4677f1036bb5481d9de3b7dfc07b63896c8f30669ed166d2235c60328fddc9c5ab42b5429769c85e96a6b9eb6d97b8d12da6f0c2b7b4b125f0cc3f9618193d9904db3811e87d324c0d4073c209e10c0bcb572e855cca92d17c8329198b6a6256149e4b3c6c317228594eb2756b6aa1493da7b0bc9057cc1abfbfb8dfcb67b13cdc83ecfd007aa2f605f0b29b60ec33e9a3359e494b5d798f89671c56ecf004f45ce37d5dd2bac0aa8dab3a04cf3d683b1fa7d80d0e20844a72416783e75ca09cc67ebf808293fccbb2e4521fcab5f21438eec964cb8250d17613a8cfcbdeadb8ed15b2e10653144caae8bf38b2caa15465abca16e79258e84f8bb531262ec0040f378f58ddceccf4b320c47d04abdbba5afc26a49c7cd2ffb6b96ace21877c70a9816edae02b0b308067076f1b6675ec21ed5480bed64384744fd808af4398d4380effc261f080c3be8242c91925d2ccb7edad2a3dd2a55c209d40b6518d8a55cebd2fbc244eb96bb5080dd82f918c5580e86a12b847501e10ad3ad03b61ee6a03ed628f8d7c3e2ec1ad73b0bb5789bc6b27a773807eedd88c4e92ae11cefdb3aea10478030e1051f85365b6c8eac24be9d003dcf8017c2e00abbfea75569643d3ff59db419839bbb3aa75a9380870929ec1aadbf6e825132f2255b93901957a38d3a77f61b05229942c904a38447c102d8b9c4fe19061585961f3f938a814902926089c222f70d1442e0d5ce10f87bb590733201815942cde74c20509e5a7e5e9011bf35c1b0309761c224d663661adbc10cc56f5324dd2b5a509b672fc54881810c22235756b749caedae0858a4081afdcf86fb47306f7d406a61f0e019bde2de7b83b6f5f8a3ec48513de8328d85d2e3c8d97a6cf9c2ba6318a818a5c2f76d9cbf98c0f9aa17175df68a3de374a8627c5ffba3a4d0498cd563e9683e9f3ced7ab3fced4188c2fde4f8dac2b40e075d17f2cf69dabff933bdbc9189e3108251e803094db7a4e25b3263d8d29cc628ad3ec942a37690202f5a14524ccea7fbbeb17887d99b04b72a2784445acf44044f03f92fc297199e5032e336c0f3f24ee3785ad4dc2f156a5c451791603cc30b545ac85959b7f0c6e076228b017a2ef2d9fc3dd9defca711cdde4a322f65ea891c1cda8d859bb36e6b13fb45194053250ff13f10cd6175936ab8ab94230db48beeb2c01742c163fbc2e8cd61727754542ce781e141810ddba270484dba7ff9a19cd6bbbaf91347ad10dfc7918c7b3cd08d32988e3f0285eb07d101e2d488be85639714d337e95086150735b08ca8a8ebb3f972940beef9e6e75c0d7e746f1fab476fd2c9dd95d4e66a41180ca87a6d27fd8b1f0322fb6a267eb1ea2f93493a9f5eede015a7eebcc36360a62bf9982edbf8f5065b008a74d56aa152385273f06e2bb88a5a1a61c5759f982637ef908d4410e342ecd03968407f24fa2c3ea2c2b7c536913d231aca1d4030244edce9e1f0be8263bbeabadd8c6673c88e70bae8dbda922e4204eb99562949fabd097b7255f89e84f8e0275568b7f643c6c4c7f823f1673afb25682a8847bc0c57ae84aacbf84a5d3ba0d209ffdfcada1d64b5be347ad0f9d40d7ec05f72b91ce11ab384c9868097ac7f0488003fb086f9ef9c512b1c1a7b0fe5cd99ad528844ec922dc3b7214de776672332ff0d786e865d27fa34eca03a3aa2c49403b139efa949677256f87d06059f0bfd381484ab9c1731f7edc19688ad152869a3dbabb20e2c3df9b289ff214439c15b21d79b152f6595a2e421734dfeb17ffe9db0566aa4ed4edf8b1a740d0251530c8d79752c592d9038a1b1506f41051a9c0f67b820c5c592a98c3000fa59c7be13ba494e9d9b6fab0ac0175e50b88a72f38acfe16915faef8db303f60f1be4162248690355823ab15a742ff15fcb293fb096ec3e56c77181e53a3a9a8216a71e7cd856b8e6923211384bd6278c779940fcc9bd9561708127e4559d0728db2c912f6bc5db394f771a031b78d2b33d862a577928e4976418c2354849b5812a754a83eeb0967e75a9b8e83c31c47cad326ce86ae74b6613d596b8d121b564c36a0056ce4a14996e4a4b9ec4e43d6f41ee02f6e8319fd1711f3527e1aa729daaba201553e5ded94ba843bfa74512e7be812e34420fe6f64b829f3c9743c5b459d559485a82852a60abe83d423d71c35634b8923ca31b3b223d3ffcabb8231b5f3b427f5929121c581a1e75ac35d1d6c0f2bd21412309a3192bad001fbdda9b089daf33250c02de79770cf29eb1b0bf7c2e1e48e9aef9aeebdd1c55d1032baed57790d606f1118ab52ef44eff45c190fa0c8619983d6ee3779ff925c9022602af2b4e69a01ef3e18ba5eb2ea401fb77fdc140df2ecc7b773a1efafe9d445f44b50546cc49387f0e88ac357e677b58fafa7947283918669464214686093ec26a830e465f3b84d395f5100a6e13a16b3aa297bfd42e94adc49a95b2ee085bdaf5ce06b59578fb047db6b2122dbc3a90d7f3755cc41395c8c468452697daf9b69a49edfb787689b54dcd036685d7ada809a83be54dad6b5f61bae0c3fdc934b6a8174747857f2791972e43f9d6fd276708456c0586c34101c846ea1bcb799849f625c2efc7d86c7906da8ee855c77839c36703f8ca5c5d1652139c3a89d3b20e6d2ad9304f66925b65cc3a484ab53e4f97896b828966a791a995e17c8a371492f75bdf108c9d4097f3cda84a723109a55f54227bb7f3bb1b8de473a1daad80496c8ddeb7f3a81db77b23f0a017d78761044a3721310f239bf9388465738b1145e0885d05e9d5f13d1d4e4bdc19d588a1da36067a32d504c1578d85131b324f6b57f02dc1f8d8cd76fdd870b0963b90cf11e23474dcdee4bb3f47e2ca86a2282ff9710caec1ab54b34ddf32816dce851f81d09d269299720a1b50027a48489c515f9e2a938ce0e38bee651220dde2998957573ec2947114b3f45ce9fa875fd072e86df856597c1645ce5970fecd5e83c0c1741d0a864a903c139899351f9352d261419d141f235d6dc2b88e7ac82c92735db13a4ac61b1a339341c24deaa442bea0c29a9a1cd37754def2941dba0175d14739d07b5fc799c3303ed6e9bce1e41209430484ead526fb86d2bee5024804e51edb07be4b922341b80719e56ec9ba7a3487b0e56efbe3c44a2b5d255b26a288f9cbd14875bcf109358f6d94a2b187e8c29c9e0e41b45cbfa41a57e59283e2f95cd09a44d2273426f781aa13d127527adc23157c233d9769def98dc85350b890441444130a6bba5dd0a5a93eaf6570e6d9b1d60112cc12746b14819d481ee156f4ef1a5979bcdbf41d0b63bc59dd3496131a0a525a53fb462d31245d83657185a1f25fff1ba5bb4e025e54b122a16bc9a41ea06ab7cf7116e2f165b035f0c8c5bd1b2bf9501f0cb672f044d1269bd0cc5c3194eff5c33183433a808bcebce0b63238f382e3d0e50a6c3f75bb3beff915a75dcdb65cf4f4ebfbad1fd3818cc98021b97ef82719880e3a543458f670ef2e66e659c7ee3821a0a5f7477cbc788450f8c1ac17f75377a008e874a871f270447082d13b735c33fcd64e893b4543aed7aa884e49ede04b0a5614d690054598c396a8553adf8cf04516375e71a97b5dfcce23997010bed2407671ccd6f5c5c34dc85f37b8951d8b8c46490f3f1f711cdb54351c371127b701ae90b5d348714fe1deb44a38016b260062297a0570382882456d8eb966b5642d7405e67b5993acae0f4d15c0056961bc3312c83e2c239c8e50c5db9a040474834b2b27385abfa722b3f835f36cdbf842978115a1ef4619028885688133ee7ee296a8ea8a376fb238aaa9aed3eaad7377d9eaf999c30add212e0cc28879e8abbf4d6bc6082d34505a4a3472eb368d6ade9f5ef218bfc3b0f4b79c5d64a595309ec4a458c365d7550b046887de09de7da15e09dc94ecf8a81645290d7c1d827ce3a8d59d84e0c086174547b4986db83779970073d853cee80b1405b3eb135ed0772ebc36e1b0072f4e4dd89e72604917ed6a1a09721a59fecec341b88fc71ac1e1202f88dc8c8d64901e1c22bc5121a6222d77d631c75a952b86076a884b58527f4d3dd81a8fa2000c8cbb833a19a96586ed27f3453fc133dcb4bf4f950a2fb54015b6504013411768187bb49c598492996830980a6371ae895c39eab3b68a9e26105b63b2165765d9ab9c9c1dd296c93707a25841f2653c7ec810a9e89ba380f009aab99d3aac5a55336f98cb023ddbbbbf3fb62e820805961d2f7a143e848245fa28a023c8bef25288e0c32b9259cb9651c6e8337b2c9221ed24510bd6a75b48d11d6e15f88e32958a2d36cd2706a1676778e6770d1a16332704b3ae8ed081c3a56318610939f982c22ca64632cc2a46daa4e88348fcd8aaed0a6084bd1a761fb42232f37d25d4c141b80efacb88153b622be74d09c355d39958764b572d73a64cfb5ffc87a5886a3a6c306d6635e326624a0df57e32c7e3c8440199c2e402688b22c2224477a6810213a9d5b85576ec0bed1cfd3690d8b54f22355ae79e2bfaaba2e9961c523bbda57306ba8076785bd191d78bae262bed344de3d5a05629c3b3a63a1ee42203c0acdd8813cc7e6274375978cc0db3d55358020ba6cd237473a28562f7dfc6db5d9247ce3e515e48459dfd1ee7cf4e799d536843cde88a778e77eba2b604c747605e24dc513825f80e47ea52887c1c7ea15f623af05608cb8b6d289bcfd4d606bd7fe56e550698ebd801ad51146056e2856c8aa9c997a87a7026b0bc015fc31aa6cab23fce7b081ed2a96982d98db58ec622cc9f11e2ef00e07253e5c4db2ed5bef18c70a6740852e028bb9e058a32729617babe66cb817156a86bc0f78c05cffa62c81981848d056549f8b1dc64e41e7e381ae3798d159603d0c61b20f9bb5e447515e65f3861cf4447bfc5adb01a26f4ae111f85cb587e4717096cb5a8e51b037b04a3bc66d88b0ddbdfe542c502da96b077d82291ed1475621dd916cba0890e78f52c782f89ea92f462be2dc644f461951583558b774c0cada65222fcf8e14a4671e14a3cdc48bd919790b3a9d1f597f3758ae9daf3a95814a9cbe7329d7aeddfa0405049dd4c2e38c003a4efeb9a209469c2fa21386c30b01260fb6874ec62d16cde0a7e5eb690391de80c0c31fd3f8af845e089a4657d28e20ee19aed1780efd5448136000df9b664e29a20d10725609dd0b0a984e890d1e47db8798e3817b1ebe99688d5ce182e7ce39f894ce7ca8001bb761fbf8ff9b7e5500edc01a12d7022889fc3927e1d6e0604933b93368261315ba516c5bab6dcaf3e32f25fd3bee28c9d8eae48c9bccfe7884e91374b33cfe412f1913a088573d15fbddfe164fec344605ca1819240443ce2ca1051c8898a3c2b9c2b01d8f8c3747d69e26d9eca69462c8a51cc92cea240a08ba5347f0549287ebf7288f5ae12a67226ef20be9b9ed8f53d825a3d02c1ca8693c4b2378057c3438138a19a4ef1636d3a7778224c6dcd0831515fa10b0ed96a7926d1ef04c0eb2eea7ff08333a9691f4970a5a44901a7ff9d26378d1d81c2b2a50b3c851739b5ca54bb29a597e5d3d58a9734e6627dde041da2817451fcc18e3a2f95b85662761454c716b27a1f4f8874380d3590c60046d98925725a068433650513ce2b2be4e81321d972e87bd6972fe16d35619907a5ad373c9b7ded7f2255f142ea67e31c317a10a33c5892f1d849a0ac2e59b4e346576b9aa8107e2c68c3dd4403f9d9041db3b5c5739ca9966f0814ccef447c69c9d724cdb2ed8ff56433472b317ba3189e3063e1505f6fb2e40ba9f9d6bfea8c87e04c3f4ed6969c58c21437066724103a7564c949a83b04d65cf5fd512ea8d6bba2cff41cd3ad1ca305ce4d94ccee8cbd0f73d0c77855933c0c329570e567d0b9135a122dad6115162c33844c00424ebc53d1ac6f950711e9801c5a225307e903755405a3aa0b0c40dc8fae59f4f286f905f1276f90d6e1f23274cfb54726fec389543779abfacf69a57b2f3bd84e05291843bb7ab724293266f8534237b864c58a5c55e497cdd429b901268b02143eb808aa76b2f806f563511813fddecf2127aa69b733ab568d84c1198af4f265b9014774397682cd35212a09526661552281340943040913a69e7113c92445edd73f18b0e642a06d69c80bb95ed3a0b34dca92959fcb8d6647471870ff16fcafe86194fbd45519a116b003313b6158aeede3e7f654d8430d0e4350aee2d952a2f6bd00c00e58a0590f1e4431c21dd444f01f2ad1d8aa2f607720ba18655fab147f3f7c10797dc82eecda0832947814f0a8bfddaa314f897cd38144c7d7c4f8db7e1b7170b1cb6024141718291b55871c74c5abb20b39a138c827f31921212c5d29fb51de02a315d0904cd39c382277b4529b36f8c7a91e0b25161b008eb617f4b0f93c0a30289ab849ea08b2a04945ea5a43344891bc1aa74573d1078e474277861fbd63074301a366c550549f897c8f897c341cee3f94a2bf786fe937e9dd528842547199b6368ab957af20dabea902d0eb9ea646074743b97daa0ef46b8094dc836f72a828ccdb174b09dd8212cbe7a2d2341aa59886cd13ac88f0d99b8f523eff0e99111efc687fc0967f92bd9353a494f21a835adc068d6c7b80f94ef41bb8803e50e10b0369b2bc797bce7e77115e6bc45d0d11477df845b56c97fbe220afeb296680e5ee0489661939e25cc1beb580a7bfac299a370857d57717e0d932a059c807c42fc713d2e80b464565d2324d6edc8b2be606c3cd2ac1b07c78e961314c24b162076fcd728824a861d07cb20d1fef09fc1a2d10e58a62b2da500aa0dc2355831b452e458d5bcf569b52c870bed62af7e585bdf5ca173706af17793a34c622d147610524bd55e459d0b311f4d797b803d6c71dff0f40ba999eaf27abe3cf0c8d5bfeaedeca4550d6d40e9742a8ec069a29b07a7ed27a2f6afe92f0f9801a1a372fb818597847303a733af21b79a46af56fc680f0561b858e72ddf1a357eaaa4dddf0409a5fa573b0651c148e24bf1b0d4ce29d06fd3ea23a279aef4a45e0a604b2f3ca81ba45b71ea087868e4c45957bc090e0cea27909c80f804dd08a35cb7c3eaada0ffd26e1a1392853ce6196f4eeb8cfb28d748473f99a3bdc2d4122b8e5e209694ef1853462080dab833235a726a66c628bb7bdfad07ae93042a08ab3bce4c819d73d399b1841f3297018d39efc5f8a8ed65eec8bef5e8c44462a0b43f3fe59550ba09f91b48659262f7f68428cd57c15135ab97288f73fd893896bd8e7f9a68953b088917d148a1d61e5a9729ce52e0cbee1f605a51f0cd17c56ac6d9ee450684a53faf7d87c2a2f36121eec289ecbf96b2b0b88847aef2accb08ac3ee4ef75e7be126d9c3dfde95f7c2888f7ced25fc097e9d77681c05be95790dea26439008ee49710984d26ca312faa33016a436515fa9ff8c0ae7ad509606b44820841768f1c29de61080257a3c66ca9d29b1b62d07dc68c43fddd8883fe56545c11cbc418428a2529ac08745fb270c7f4816d69e3f6bbc1fd3389ae59653d9a39f98c8c01c246e53bb49afd7aec93168d83bd149f8af58d0e9e56635972e4e1f2b2b9b19a451776ce694fe764a2d2f4e63989d5b87766eebc9e758c6b08911e20760f85e36a5dc1682a354536c1a8efd1fa573ab17bafdc04f418396b88fb7fa529597a64c2649fb488d0efd13846dee12b70ecca404c8a0fde255a2b164e9e97c1cb6472e1ee15f78a436468a01341800d11e140f4614b254f3944fc04e39ccc0d9dd076bd1ec4834354c23b3a6d8cd17911a04dad7def4403f90bf6601b8e5ab28844ebf4e5992ff4a576c4c7a00f252ea068865be3301d90b8e842519660d94a96c10056f85d7885f154be2b57215e688dcda1be9d3c473f9fa3e85b725c76e962e6afb88b11a3869e283bca18c31dab157a5040ae8283a1b6df63cc78dfdaf23346a61e4b7df597169b6f6b9bcd24300234be2ab9ee8b67477c36f44b3f36ed9bfd7c89070cf0ae1bed6ca6d9b54b46b251d984209f151fe21abbca0ad157ab94f6d2e4cf92767c792b3bf941d84d1323b61595ebbb98c5c4c1277b127ca4607f0a53e6c78124786aa5a5a29652cc6abb557c998ced856a18c5507abe698816fd113b816911aa0d2e53d1e820d1aa7c73649f8ad553dce9f5901f9374f32f02149242e7730965d901a123b43cf9a442cf7e86600881bc62471e46c922959e3155fdd44080f699050c072922bdb033144ab51b549625d327b5b4c3801933561b2ac38e3f8977d0f9388af06feda81af5eae07f71f7a8ca7e72b9def229c18d5c5eed2742b12ae3b47119fe08a4ba982bbef40286e80878b700de5872ec415998c120470b4fa0490007890466271bd5371b2a95401fc4411a1532e8078c08035a25edd909241e7b707c2a9b05a3c09ae1ae14f16a1596844acb9373898d14531f12755da60e28e6791ea67f359bc3da6c4fdc2a0c56f882cfbaf8aa02b953295bff3e647aa8bde1742b37194392b09ad9f52bc061badbed7647f87b7e2fc96b097d636a6a4d46cfc9605b6551aefddadae20e90ba76b63539403195a1be5453c22d5c55ddd1fd6a1b7aeb72b17558df47d986a3c70923f55151a61a651efa0cea684b11e8215837b03fe5498b49dfc7fa4e5d0ddbc25d5d83474446bbe7b7dbadf174e9eeb3547b547a2d216cf724809de28f79841f14cbd7a1c39b64f6d0a67b94b6ba1939992a25f63e1c220e1b1f5ff287b20d4aa1f5a6de07ba3db23c41a632af4809d425f1f2cc1be8e6d3871eee9e7834f139ddaf3fe5753010d9fc8a06a59c54338fc38fbe0646025bdc6fc0f77827111c5a23635212902ef77c3f1d3710f983571469f01f3865e8109d9448cd91b4a28ea60b4f1171b39d676c61dd19bc1901f5ddf34a4c8e69fbd0051f5eaed917944572cbf26bf822c03ad3d429ff70d170fa4c94f178a74c5c8b97bb658e4a8a871b1586872239ebfcffe5e49ba74289ee24ab071a34ac3864aa880559d42cbe8654cd48660a269f27616e03faa270dcb1b59bb4e0acfafa942b1460ad10c1109b8c5443943370a7675d9b3cdbb1447ef7f0f6f66e939b99522caab61a0463612955cb282e311162c4eae124f8596047006ede98fc3d9e34688f5349b6eeb2e5d70a4ceda2ea51ea82f732a31321970e195ee6605ce12e341b83340bcb8a70871828a09ffe37ec551851e5db8c57d1fa60219ea48b68a64c1f844da223123f604adbbb91b00dbdef8ba542266997755297dbb16e63881ae972270efd917ba505e815e653f33b6a0a11b8258cec370119e16278c45d44a81e9a37d9cb0cfc61e3f663e5a6d343a9323af74df531fc734b377354edb75d2f7ed63a0138120171175e5dca55cc1a79832e389cfc81cda97a2ca8f2bf6d34832bc74702560e2e11f11bc45a60a2446e0a85b8308f6e7052415da44f0394aa1b6d4888485e8f7c306ab40ecc36fd708cb5b3e42b1472ebd75cad12bf17b06aaa6cee63527fcd744a836556132555d9f11a2d74dff43fc38834dae95b6d0a9537ab521bfa4efd6413895d51812aa879725b06492c984054a23a2e12e8a1a76e40abb2b2a436531b915976ba118fc8c40ba629ea418d9cecdd29b6c697c823d044f74d765a8506ddaede2f50d4eca8214e542827d4c3f3445ae7085c2507853bf20dae4e76804a544653a690323ef8aca5655546919cbff0ed78c46fbb6aadc13275c529bc41617ddddfeb89084b1fde69164b809c8023eaad739b0c07696be79fceb34ace1039ffed753110211ee87a782d88ffac45d47fc2aff8a1ffc75ff39b4918186ba2d83f18750b0d8a04283868c9108147377d30373adc9aa00e863b965257b1128ea524ab6f2ebc3aad5a96795b3443bf71cdef03978f19a592ebcef0351e8b18cd767b3484b83bc57bc0e04c5d150c5984c875cbc887ea35c0b07719050aa69c0f62bd5c4f9e60be30e432aa8e2b3d84594487a03fa02f2a8cd1deeaad2198133bac1fc6c5fe0cd0c26b2cf06ccf80f57d2169b50e5c13d57b35f1ba81aecd1b17c4362e6056d67d9a7ae74d0114ede2a8e1cccfe46f1e035d1ea4575a1d260ce59bd4953c8814670fabba5430ea861ba116aa483fe7f014e8220c3d74b71beb91d4667eb9905173ec07148415241ddd72cb816e4713d59f21e3408eb366fc82c8e3d6b1a9e1b7eb847dd0a50f9de6dc660c53033aecd5d7cff17bfa7684aca6987826f23673d8fa28ce7d22f3da9ac5d0697e2d6482c52c2067c0de818750340ed6111a9201e506b8ac88d7e00fdb11299ab71f2aaa07868da8c8e2d9cd5a636345087e1ab83fb232232a3627062a6849ea1361397c0becdb7f6e627880b61669126b40868068c57b52ac919b5278ad45f3684525813eb65e85ac04fd3140edd3d2a7fcc3f7ec6551389f9f12a5486bf8920ed78abea852e68cf0da2c450b72939129db52c06d2aa46d620e550d5ea6ea1b1ad370d9a900ac305343cfdcd12703f4b4797dadb8e104013c1a97df2c9d3141ef29e2304890858106940dd6dc79e98d3f2af7e148f216c0a2d7a190dc613a80325369b43e4e08307ea7bc8d130297c3e863c6bbb669486b4c7b0c75f5ef2b2e222a9847cbc3747a300185e058b69909fa37431d4dfef30ab136a522018b5ba75bd039281b1f5743135eaae0ed9c78f03dc2a2760ff5d5e37e9cba10ca81aab9920b475d004d44219afda36a45135c44d467a91b9ba7a6e6fe07ed6363702887dcf9e4ed2cc97732d9ec580a3be27f3b1fe3b910e0109db5261e74c27b73684c663fc4ca921d8332a36858e38a9fcd81094c56e2cfa61d4c5eb395f867a863936f6e2dd619eae0e5974932e9a2f856b69c2830eb7ca5e115eb8e17af671efba53c5110cbd96a339091e7769e9e3cf5e6b9c9333d2f00e9bdac2e88d13f4b5dfce53ad80c5fdaf85e7ddd7a43f911162f1a4c5211c4e7305119ba0f809497e2a8151ec2e875036e0d7e18a08dc167435a0dbec3b407f49da2d951161253fcc714ff30a57f5ce91f53803fe6db2162c1d9bad00ff7df8fd2caac8cd7ef127b9b16de3b435efabbbb8fd30fddc3eca1f2007d301c0ecc95122418b5f38446ded30224f456b7a61ad29d2574424f1f446963a0687cd7a2ae344d2ba4f71164e6ef66bb257418e5bc97cc18368ce1a43a0ce092554a74d40d65e713bbcd21caa0d711d99ce9344f36effb1ce71aec953f253aa55f394de9c3df2d2b452b71953e654a83d10a9a0e1779ead5c1b4b58b195d03cac8b9ada249bfcbab63da6e916a6b06d191b07ff81fd20efc87f4c3ef21dac17f400bc62af963a052bf434a13f10e8b43f401eee1774877e83fa01dcc071cd814d67e2843d16a3e178ab8b0d8f7aee7866561e89d8de1d410776a0a2225c6c609b54a7c7f80480c9afe685d7f4c4fe824ece56d7cd47e382f8dc08763373c0700174bc86c5e5528feeadf321d7400623067923f2de02c3428549036e8cbe891c668bc01ff0c41f8e578e2b4a46aacbd3a1f7d73884046fe9453037e56da4f1b90114ff388d8de85e18a9b06d71097e2fd5c08cb3e6ee06d2e0a5833029d3de98d39a8dab875919a91145bc7f4082ddae63ecbd723c6092fa961d5e279e7e5c355aa122959c72d88ed0a6cbb060d0a0394214e832fef75cc731d0d6886bf3cd781e7edc07b1f78ee47c4e30b9a3e0e7e4d542473e0885bb5ee8768a7260bf4d80fd4e28782b6cae2722cd210846ebce9a87ec63c87e1894e77cc09b3ac11c019232b876ba5649d1cdab92755757a3c29c946981a8e7a3c06370bc954b8b67513de0900d68d1cdd50f31643cdb707f8221aada9c0f5bb4ed794ede12dd1db0e79b0419788170d382fd4ab570ef3939b8c7b3888688c640f2bf6a8e862fddb3cc249eabf24563141e4fe1903139afdd60431cee36aa25ffb32d6a58d2c2ce103f384dc0028e708bf473dde24293d5009c9f67e494d404ead12ca3414dc05838bb75693a407408b971b1e850b88bb3d1c91ffe25308608ddf7014483899ff38d79afe319d15442c2ec9eb41c03a5522540284480d8cfa11f7f72e85218bcfa8b49296c0a1527d940afed95b03071ddbd84250466019d74bef2fd704c05517f37bb91084a579764adba08936fd57587e4f49a870baabf0cdb058d557853f750e3d6ced9b205c15989dc3b26b493eea134a0d17567889544ac59162d17e8fcdf56d1d5afe3ef2658058cf89093631e0f41d3730fb351849f6a71046e8d9bb08afd58497bcfae6c88e3c533fdf2664164432d19276e05b87d6d29b2ec00036a2b94a1f82e75988a80b612bd30d6d8de73d3cdc8f6599918c4ff1d5167567f0793768bd3e64a859bb8b86413d895e91fe12d909ed1b78d6cfb93174bd6bd4ee96e9aeda900202c1ad416a96f5f31221fd98b72c5de788b4a952075146e410c5767c92cc2ce363ecdaeee68d87abac86355af56994c192f52806ac9812a9718dea8005be5676156a9c57f0a8be7304fee4a6eb117b683de734f745ca0cd707b0a77894cf5b84be1abfcb949ba9111d4c83343a02769bffe277e04de70270fbc3c44d43dbbac02a8a9990f20c8054a0c64bb93986fabe56b482cfff5eb296e8c1b092e297d912a9009ba05590c0072c026521450f571f62737d58ddfd2692a57cf2155ec9b4c31406086a27f2de857b6e9f0823081bb3034671bdfe1bb3d2f85b91446ec3884c6263c204cca6d173b452cdef7035e5bf24c0a202414cec2271a9186773695ef75e6beafedc4aee5399c706cdc4bc1d5256854c80179f4765675d530cda0c48ebc1990d136cb5d61f32f65da02faf65c3cb9f13fc9b511fb849d3c6e5fc7c7d707e5dd4295c11448c03dbad978294437e82b6f08ccce689b5dded1f7fee2df43fa00482fb8c264b31084d3c2d041096d7a2cb2e1924fc55ff26bab0a345288fa519569b2323ba4f8ef589cc28172e88aea2453fb5fcfb60e4cb18edd3ac2807db3b94574ee48593ad022aee9ac7237682d36c2fa570ab5344a6502bf4622d299f4daa84efa17d82eeb60b5115811d9b6afe9a99a6da7da8c2ac51afe1767acddb12fa18827917027efd63f0f286a06647c815698c9caac06cd931c8f0ccffd5e400a65afd56123efea8b693e66931c2f5c5a155041074d8036a4803b15310282d2b1d613099762cbf801591ef8664043b488ee9ff7409aa38b00ea422672ff2d955e2628df8149f075b4121cc7edd76785a75f615ce76ee4a15d5cb6dcfb6c8c8268180022dedde7213b2f79652ca2403390b750af00abbcbbb840848a26bcef97322d981820176f04080274de3cffb601a1d236965ce017809ad3cc979093f78931b9df0a8bb3dc30e7ac0b5f16b0408405858d8111d5fb37dd00769a69ce3205da5e3679834001674bc1539569e4cff127e20674e3fa2e36dfa6ed0c1609beeb6073a5e0739690f356b5e4a930f5b6c21a5e9072c6a1082df71040741e40d260852fc5abf8705d8f13b7e860680e02120dfecd06fb4950e6c72d002040e414cb54912469ed5871046f810afbd7c6942aaaa164c29d13291bc79285efe355953f2c290c87f322144d2df84446af249081211b67ff335e79537617bb435f980d823b9a5276c535de11d5e557dc47e87ae8d9f031defd0b50340f03b7e2a83afa91d0fc1cf50c90b43d27f44bdaa5a000189c38eaf8da49426a4ffa9234a4c293134756468ca07049226bdf484213d0929c044b2837c23815979301511c66484d3bf176f7e5ebe2fdacd175f00a0c98fc0a2bee38342afc30d075b59c70b81d4c30e74bc8e9fa107422f442221da9080e10d8e9ab4470f2c32498c99809b2414c893f65002532922cfeb704668da3624eec7eedbc81a9319b683be8452b66ddfb4836ce3141ea53c8708e4c961d4733761028f6f7b70d45b48d892638f6f422e97dbe5fdda9239f71c75cd43f1a8ef7bb8e57e1059c24896be839e290440d3be4ff32ada23f65e458bc6442037e7111d4de6197bd4a191b80ec31e83c8126e6c5b13f8a3433c262756784205289ee2a410051829bec871d2f232050a54bceef20f3a15a72295fe298ea449131c49d452454e4a38078bfa36fdebd73f435c13d2ff11d5595670b9020b13b46c45800b020f98950753164c751ca045095b9030e9edc60516b5b834e9edd6f5a50b2c6ad169d22174887b31e990fb930ef9420b939dd76b1a607b7082e0542c7ddb5e4fa4518381457d1930fe150a2ce0bef8b6bb9972b95c6e8b3f4325363ad8c730b8789de015d06201055c2084496f97e94e0226bd316120032040f03b100001b9839cd5871807f8ba32ab0fd7800166f5e1c3c728c0ac3e7cdcdfc092ef117cdfc783e92e7dd7ac08bd8eafddda253f102275904d7b6e3206e0651060d21ef727edc1010fc03a98b407ed6186003ac08107aae4a1f281296748f130a5dc065d702844999587170c65561e4c4e4fbe04008c931434786aa202005660c2c292304ac460518b9f64d29b48b680935c78ef0a9f787f49280b8cb0b4c70b960a19e37388ecc98c2f6a591aa3bcd8b9e2c117435e08e9a20b860df4b001327ac013051543f63278f032661e1378700e5c4159b579baca75c9208e2f92d766cbd942c8227a89e24b61dbe777184227b62d4225414134202b57ba6c33780ca11270db1e04e79cb38b8b2a1ed8b66c2e80b69f349b8de632b80c93deb8089fd068b62da02869d9a0b04fa39800f4937f442fd697677f1b2a8b680f248a22ed471a592e5520bdc5c3469b06b703bddb34ddae45f8c496b3d5b1bde76c369b5ea2812dcb66bb34886f7bd0f3346df06aef42b1a8dd89de62b93a591c219958e4fbfb072c56a3a4ff6a4f533581c4fe88566541a7c848d119a1927e92d43a476a4d5ed140c753d6e4efff47f1694fee5f2534f18a7a6848d44286c4515369b286d9a6bdf83e277c12e455844a6c4f415ac88f30e3a86f3f6eb70c2825977ddb9ab68d1cc923ea555481426f4efbf13d37dee8ed8eef5ae1135b4e4ea884166a3092367401bb404155ea45290d45e13ef9e2f5aa28355256de462497a4280618e88fbde7280624197bad658ba3a537d90d58d441e0145a729c9c9c9cbcc891220aa73659fcf23eedcbf169ef71c4b7bd431136b13dd0fb132193fb406429fe1d45dbd32f36201a49f5a4962d0691650866680a2980a1e01f519ac2bfcdf657e4f183bebc3f8e8fe53eede953c8e43e8db4f4b6419a8d5ca2377faa27c5203d279051974c5378cdfdf141ba82ab30814c289ea02b986167cf2d33e6c4cc38b3bd6a1ac576ac1239e15fbfff24e7134e501642a57f4dfb23aaf5eb9cfe5a139acb6ddb7be909cb93cb2181c948ff9f044593414f67073d48b187f1a70924f652c6e4ef6d5f66193d2b7c42fba0f7dced9b087a5ad0c79e060681ceb583c8251b49f5e4ac3cc6a60d521c667448d08bef70c227b6bfef39254225e38f41fa6f33f0419a43993265eed5c1061b6c3873c30da288e6023321136ac6cc0e46f497f7c7f7a92951a4228243c8e4c301872a0c720899d81c724843448790c9a7830eb69f18e82fc51fdfcf887fdfcf844cc4bf67c471d4fab5961e86a04183468d901d422676871dd654404545358e3e50505555358e3f4c9026cdbd563cf0702f9b0a7a0899d01e7a18472028501332a16ad40431c19a35f7b6f13287cad187f089a537eac3bd42f0f82164f2fdf0c31043ac4226d6ca8a081e6c42261f1b3657780e29efdb3ee81d88f1fe483a102193f12f5952fd8f0fdaf4a437a533d96d64d02d02cba83e23b0a847285ab6f862c9b44521a86c5b0ca105549d3a51e2b58de338fe11b5e932b3c13ecebe3ea51a9f52854a66f9ed496fe3037ded6dfadb9e45e824e86d16db3b9df0c9f8f7923fef5ca1923044326a0d6afa672b7c329265d3c62254428ba25461d2a53d25ba24d58f7583b40adbc6eb57844f687fdfa1ac0895d8a272369d7f6821392750d43f86fe6a2134b1fb42f46602250a2263b3ab7d4ea8840807f2ecfcb2f736a193fc32d9d3ff2912ff87de32bdd1a769ae38277422922e4438e94df65345f864a4377f51fc2431f64e45a844f662e94f3bf6b117b587a1b7d8cbeee5210c251a3ff6e0a88dcce82df6a31ee92df64a3be4f1fdc717426f14a46f70cf3b156193fc32dac3141cb28c9c2274729fc67f9fec2d25b2bdec3f4a34be8c14955cc8a268d3a32e3f3558548249a81bcbfcea438e35366a33996c8a1c6459e3713cd0d33561520d1fc2241c4037344d2b544264e70944f62e878d959c5aad661526d5d8d890a24d8d20a400aa410ba24d98f4538b42092c6a9a11a2288a366ad0226ae39dc97ea6b1c84829806ad09e161126d920dd6051d37e863f479446964c47e019da6c3299ecfe07d97ecb7ef641bab43b68362b3359ca9ef6972c650ff4473568cf6a359bde5277ed3d8a3089efda03fd90658d567bf1a99b30a9464e0f428f08936c90d483c81ea44b9ca0ffdfdf8b08953469e910d93f39a904b03781654b76d7988c7f7f24cba67d65bf848865fcfb228e4be1d8c85fcdc6fd9ac652e3c51a35deb56ae020cb1a144e9854e388fec861028b1ae87f92a0ccca03882c99b2f00c83c8b26907fda8afae17cbf8e25f5dfe482ed54d0baa3d4d9776d36c5fcef668fb32efd1f6e5b747b2bc0ff42359de9ffd51a5e9b9ef961c615d7ba96e1b36fe88d2b6d46de35d4e98c4b78d9fdd204b1bfff3e203692c4b75db78f1691361920d727a109a1526fd90d38394b22dfb1a5a8a5009b8bf09e4098702cb6a5066e5e171b04c9751306d29f0336df1412a078b5aa6cb0fcb52ddf6c507a7c371257c029e8463f91b47c28f70376e8417e112f02b27c2877021bc8d07e140381bb7f21fdc075fe36abc07e7c1d3789553f90e8ec6cfb80e9e83e3e0536ec66f701bbc8cd7e034f80c2ee532780c0e834739191fe32f3894bbe02db8180fe32cf80aae823f790a0ec6bfb8937b7114bc8be79ab89c60420420f00026079440c2d208226cd1d200062c200b96520121240004045c3980010a60e503020cc0830e04c041152a53a4286d808b02e549009c68d004004c9628499284e408d23ecac0971069e8cf47cf1f8d3f7a2bb3e49d47a19809f404caa536ddb03e4613605e087521546bad5ffdf11eb1c501a72a2ab1eb8f65e0d9b556276d51158ac562b16a2f5519521328e3a9c848fec1da22e32a896db7c8a812b1acb5d60e596bed6d52fa6499859256237902eccd0ffdb166198528517daf6455d2213b165b78b2b0f8660b0f960f5e190c1fba7ecad9b5b329fd1bfd1f7436a3b731cb9154b20b38a90df7c9256439e350ead4dddd9f6813a5d4cb764e4095d6ce524b3b928e017eadb57af130a43535fbf76d6ca7355bb8e4b62593f8124c64e59ae8daf5bd62ed6eca9dfc7dadefbb7a18ecaaa9be9fe1941e13bed934ba60d30f9a187c4f6b49e8f625b6910d565a3f9d2b0f3a458c3cb9baa8b32797d6d6ae64c9446f7602f1fe66795273583a3cc32775894dddfb68bdf5de7a6fbd5feebb36b4d65a3d093b349b55b2d65ab1844ceadb492b1428c0d9980b0537d6dd2d16ff5abf4259426f5dadd5566babb5b51bca8091eb740112980f698dffadb4d25a69adb4d24be99d1f2477f749b93875ebbe6b20cde9d4adfb12f7ce28512cd65d1a9db6dddffb1d96119af6b55f7763f77ad7bbd7bbd7bb37d6dd6db3c8a9d93af6a4937baa7412a9593bf95c2cf5ab576f9522ab17d0fe149a57f6b612410241d0c9dba3bd076f68c17bbfeb9ffdee97c31dbe16b4969ca5f5ef8b3ddd31fb59b05aabbb3ab6c9b6ced85729b93c9b81c948dd0d91c03cd2a4434a7792552711a97e6d77124b7daf7a329d032f88045e59d5a575cffb3c295a9834f320746c9371d5aa73c0efa3f3b3144c46a23ec4c32496de9c40245a9d3a24308f6429988cf4d1211e840b753fe327bef75e2f32b717f17ebecc8bd49f5ec4bd48fdd9751d5942712a3c64fa1efbef63ffbd7d92e641ae7d0f671ee47ed5239b5cdfbbce7ef767f7c7fbd3fd2d9776d7e99269775dd9b43bb2d26e86dae5a0830eba137e301f52adb647bbe86dafa0bc517c09244cce3981ff5215426fd308259a46e86d7ed83a7d48fec9b02329615225acfc420f811741bad1a74f8f3c087da537ffe5699713cb8828c5a67ff425b7e92331420e0d819a0a9e6cc992c6de1b1f3ba84beb0e3edd6075fb75b52bc60358ebbdf72b4d0a9717d65bdde6fdb9bb7fda09bb7db7f5765dd7c51cc455bb95e1aadd6d67adbdb6d224407f10a449c12297b71f6edf7329f433fba149d9caf53df00b9d949245fe9e4a554eca7d5f98e4e99bedbebc7dd6ba757b3ff073b7650f0f4229f59b07a15ff50f2536745410a3a0a38296955dbf64dab5ded0897f758f02dfd3a7d40944725ab394b77d308f64bbcfc97ecd961a16064546fa94873446a9f75f69bdebb6d7c5a8254b9907f187d225cff62e78b63ff6ea41d8644a964db708d03ec552a0725964e7d32fa21e39290fea787b693faf64897f7ec6d26edf16e3254be86d2a4d232557c9884c7fbaa7bb234b2edbbebd151999db5a6b71a5e3ae2ba8d9a52dc2516ca7b3c299edff155122ff1eacd36395bea5a4634929914ba26b837a16f9eee3973dee79eb5d17f28c065139b36695080d3d8b6071090d99885fe5fd08dba73cdbe93ce1d9eeddd71a39e71a35665e6b90b3f2b815e3bff7696a5bb0279d14ecec20f0ec0bf6e402026b8317633c7d66919907f1bf99088dbf9fa711ddd69bd1598d7bef252b9217cea8f090bf1cc35be3ded0c925e77d905e7ae9a6b7e96a97f6b3086dfa35aa53d5767f310ed1e4729ada6ec12c923d880b29e2318bfc7810ff2e13a1d1f35eeaa8b1cb598f8cbca1128af5beff71d9352676fb3cdd3e64c9e5deefd17902b92fea9fd9f813c87d992e7df6fdec45f48f17f19941eeebd8f76379dff77687c52ee094c2264f3a29ccd9e5cd3798399bfe0f3a5fda6cfa427abec6a651f77932c731fc222631bd4d2f4c32ebd1be31d6f57d7c3e1ffc4714cf2851257d6aad1f4e278be4e18d0a0f7956c92917c83e5f2ed52e7452f3f7f43c987b724faef9e9ce3db5fa4cbc6bc54f8ed8b12e47f065325036e7bcb11bbb5dd775b687825a6872bbbced198562d333b94dc34c75ef1583310f6f586f4c8758bc172445f136df0b93a6485e12df9ff5ea5963b12fe6d7bf6277f72e468317acf1e6a56ad3ff21beed7e7efe99d55a3ff6cd72c4126aa1fb4734d44c645f49296172697769b76c09bd4d4aa99ea0c6d665e1d31d625916a12dfbb9699824bb7bbebdd3a8fb6262f28d5dbabf0e3be9484b6f3fd7e97881b3e9a0b035a9779474f75e7050691acdbdddddddba57b75ea953db33f70cb1bc6875a9da3df6e4cae5d9f4ad755ad6d9448949e7ac35a9754917f529cdb316327d72ca05f2a54e2869bdda5aa7d255ee4e6e8e57afd38b78916edbea45eccfb0b02d827d4a62b14f9f54b2caf45d4a982d454c16c1eef2dbeeb68a96ecbe23eb15f72c56a657b7a2256b74db4b2d598772d80acb83b7c2ee5021e60cfd3897106e663d58e657304c2acc696bd9be5463b2275972f1603b16ffb9adcd4b2a0af6e96b29743216fa554acede3e8b040abdcde954a099e26a5367cf2bf6e46ae3b4c19e2917c8fea4756b6b4cf6254b2ebbcc825de7fca1d02193e4e2d43d40f534ed68a1444e5c68f2ecfb592e94fafe6dae26b4b67da771e02643a957a0e82af4763db0426ff7a5b490bfb9e5c4c9234b4eecd3886eab24265b25169ccdb2d5b36bb5933327191298478a9d8167cfad0f7c6ddb9e5b1fd0da212059a51c23ed532d34eb926ef60d594ae4fe92b9a7d2d1d02d7fec2bb4ef58fee00de58501927383d958bfa8e8f63f8a8cc0296f3f868a8cd422ad293ee4496ff856df0805dc85c659a787b4e670817560ceaeaf41f5b8e4d45fe2734e29a4a8be91251ad436396442ff864dbcf726737af49d56249488864abc5caa37efb1ccb7135b2cee1f956227973f6af7439488cc56fb8cdeeaa88426dba7df5dd2edbcde8df1d5bfbd998d4375066e5a39bf767f724581edf27bdca4236b170bbdcd6bc9e95b4a05f2b89574c87476b3debd358eb55b66446dbde71658982d2b650f8a1ae81d6bc7ac37c10fdf31c9f897a461928c567bd003719db5f7f9dad39045e5b208653fa24c268a3799cf572732f169fc14458f92611b9f0d8d457cd0622f2830a2ec4465e1051565035b4a347e9068fb32d7e6118dddf19b405fffa3fda4b7abbffdd16836decebef6a113da5b7ab3617b227b9bcd5e599d9165d31e95047d61d2184452e518be3f32d9db9e8c2f937decffda46992cffdcc837681f7b1048033dd8899ef8c5409b2d0402ea11459f7b6bd8c03e8d621b149a05d16aa30d470eecd368c45b829e841cfb7e1e3c778babc506b6b23690e505c6939d9c5754571417515d515c44754571d1c50598d8444e64626b0c3c534becad3172e21b2f309eec60517a95556e738d716384ed813e106603fd05cbe5de3c2191c55607d4cc3c229cad0e9c01c34e16505d515c8851753697d5934b95a144378b1d7b9fa24498522eacac4de3ef831de481caf314b372050b03680ff4e0080ec0403ff340996db5e581a81d7b57136bb3630f32a0015ab6406004bb44022e01fb34b2fd7cd0a6a977a1a5e05eb0a544e2485f050c9ec0c291143240fad2548030b623623e68425243428e0e5ac035dbf801175fd4b830425301a0a852c8c0004d5fe40c3b5e2021c71ea1a9833135db28f456e48ce09190c383a6dc9c4784481674fc11b521315e32514ec1fdeb30c4e012c830e70f292326ed314311344860561e355c95c1444c7ab36188597ddc20849936b3f2980a62d21b130e404c7acbe1ca1131d81c212104e1080925e870e508174876581d510284235d0e0811a04497339d21c00748ff4df3870784563ec83d00026808d084e4c3075c58f92002e1075c98b0c3102a21f7abae6c31c2c2c2bae644b2a3871d20cc79801084fdd51422e0cd57ae0069ae6c2ec2c2c2b0e644b283871d3fc3a403ccb0038424400873cee93dcc39a7e7e038cc39e7f4a839e774167c8539a90bb4052a8686a12cd015a80af489a640c15028f7329c0cc7e31bf0315c03fee56278061c037ec72fe016a03088b1bfb55a2181015acfdeee8b8138ec0963b9f3f168d4f8b10174631644ab8db21ddebd210801f898deee7dcca3878f087e682038240012265d09c2a4506fe0c5dc5e900c4cf10d5de0ce894d70e75221a3a08b21097c801574652c848b20407a8443bcbe2c44a22d80f8b8f510b140be1f0b43720328f2cd9e5784d322cbfefe871abfa7655a04d92f79df833ebc98f781a43f8f3049f89db765de77e1771f7aa40c244308c2279d4f98a97091c3f7f07eb5f049f7b2072d3082635444890f1431320123172491e7020cb030c8e08d07323842e2084fbbb1a70444f62390ca69272437e8402e73a63fb38db1d8f673d5ac21c63ef6f641d9dffb312d42ec972e7eb0bb21f6fe73d0dbb1fba0ae35e93cefe767c91dc02954d6af5da31c91cb09c694732472e94f4f50f44d2e5d4a6aaa62e5d2abaaac6c12b9f4ab2bac3b815c7a569656a7442e7d6babcb83934bf7f2f2af6f895c3a9883e5624ce4923e3d41c99ac82595929a02b37249abaaacb013b9a4575758e113b9a459595a2214b9a45b5b5d3d717249bdbc7214b9a460142ce723452eebd313140d39b9ac52525335b47259abaaac7ea6c865bdbac2b241452e6b561610b63a4a15b9ac5b7babd62eecd58b12d5ea55ef50a219c5ae2f38edfa48c0203a794f2034ae2858e4259587ed521c9ee788cd075d8793eca93a7ca8508dbac30604372208a2b71a0f9bf7c8e143cf1f3a80ec70092208c2630ef9a81300a11404a91384497432dd1560aba31091f70452f7e482aab341220f95d48460aba300917d88557690085b1d654d2e671d0f96489845389841acd01a2e27168e2a13c811952c88541561aba3506523a31d72595464c48222458a9cc9e5d09090092a306244875cde6e3f78f8b03a4a0eb9fc2d448990e859644f1dd3e8c80452bfbe934754ee5c807784f9872a638021083fbc43a619e008c269a5a039c25647a99343bbb1d5518edcc2a4a309a43e075f8e60ab7175327d1009b61a9745a60f2661ab7174327d3009b61ac795e9834ab0d5b8ad4c1f5c82adc66191e9834cb0d5b82b327d1000d86a9c15993ed8045b8d9b93e9831a60ab715564faa0136c358e8a4c1f0c00b61a3745a60f3ec156e3b4327d100ab61a2727d307a360ab715264fa200e5b8d8b22d30737c056e3e264faa012b61a0745a60f4ac156e39ec8f4c129d86a9c13993e48055b8dcbcaf4c12ad86a5c13993ec801b61ac744a60f0a005b8d5b22d3073bc056e33cc056e394c8f4c10160ab7113c8f4410260ab714964fae007d86a1c56a60f5ac156e3de64fa6001b0d53824327dd000d86adc11993e78006c35ce4da60f5ec156e38cc8f4410460ab714564fa2008d86a9c04327d3001d86adc55a60f8680adc61191e9830ac056e34a6c354e884c1fc482adc6b5c9f4c12cd86a5c10993eb8006c350e884c1f6400b61ac726d3071b80adc65965faa0166c35ee874c1fdc82adc6f990e9832260ab716b327d70046c354e4da60f2e61ab713d64fa2009d86a1c0f993e5802b61a9726d3071d80adc65565fa2013b61a4795e9830fc056e376c8f4410860ab7168327d3002d86adc994c1f34015b8dd321d3074fc056e372c8f4412ed86a5cd354ce4c971b50b0c14b19a71abed000668614a49e64502186156060212a0c1931635a78c1052828175e68618c183261a258806185185490e1492a8519b0d53830995a8dfb92a9d538a74cadc679c9d46a1c0a995a8deb92a9d5b8dc54180e67e4f0011df29cf1009a0eec600615581507d294c103193de051b3813563f8a0811fbeacc4609301203010c49d361710c20243548008afab3024408122c030c28e9b2f8ef002892ede74617191c41613d0024e551870b0d551b6b27d4b85024c204913261d81c104b63aca15d9fa20258726acf8c1ea2873b2b572e20b3656e3bc00020a3741c431a24d1445082185048690734584d610530841459b2a8230c20a336eac60734468b1980a939c0a972381c50f6fb67ce05293049d1e26105aaba3f090a9d551d2c009ed16fe8e264c3a42a243f6b73a0a9a4cad8e8243a60fceac35b9470c3dcb79f0baeb59b652a7f22ea68789dd27c9318d3af2d6af2119402b72691fd31fdae4ae51120074d020b1271d3465b6176ad0f454979e08dd2fd1df32c376ecc11b96b0c5db58e84f0d669bdaffaab73bbd6586edae76a412a0a5444e058b8ca97c914908da4b4164e90ff830d1b539a4f2fe7a3f7b864986badddd6b1d6b9799a81c9a6121c9d4abae5279d08762cbc9852c0a156797b905385c2db899964a0bb9cc1edcaa4443f62abd744e52152973ce99dc94b5cf42ce66f097cb5991553263bf1093fe556442966462c14cce397f5be34f158fa9f2a0bff53d5325f24379d08e2cbf4b82816d5ac9cc82993cd50571dbdd5309f3d4ffa8f2e8a6b2ef2f167a75fac7ae0e6549aa1ed0a17a5e687b24d6e8512247d39be46f6fd70fa19639e3e56ae8aea44385f1370e851552cf4a09153179466ff4876ea6ed55a90cce326d441fe925e3a6023f52044bce66b3d9c6b35188de2af954c4e42fad0a4c219860e50abd635f06ad092605570c739cc9d21f8b6fc8d493d85d64e50a25b2afa401147af39db4444a13df97f36c7697541ef4ef4db23683cfee25f436a357ac48690205a7294eee947e0d006bf7e5d9df86acddc2b46fc965fb166fdf72a96e251be80a25fd12ecc6f238976037162157ce17169e3378e2ecc9b5c2d62eb227d70a356c7b37fd3b16ecc9a582179b8b853c7b72b15087823db954b0da61b2c2608989da540c7d073b27a9eedb7a2fd57d1a0a20d7a00964022103aca33b570a75f6e4025367973936e5026375fdfad5b5e6294e546d29d5347270139167dff6e41ae26b5b2e15a4f6f7344cfabaea3d8d832bf2eeea7b64fd1263a9dfbd935a3b72296f9aebb2e987754abaa736a6c16d7fe8cdcaf68cd5aefb5a13ba94778cace572bb69df5fca5f1581c97dfa4d6c2e37b31900897cf467466b13efcb9f4924e6f3f3fde472fb8bf9607afbc8a5bcbd6742735db647d69ad0db2de51a45f71e1630fcb223a9ecfb6474ee4f168bd1c7e27d0782e42c47688ae9cf9ee9a916044b0fc4a1d893dffabcb59fc9b26efb3d6469cbbbed8764d995deb60f7adfbdd7fd11f55a13fffb35d6fd3bb5f5afb5d6da1ebf2f80b3d65a67b8d63a3598fae696b47fdd3ab56ead15aad38b00dbfe154b7df2b364f89c8d6367d069214e0b511bd31173a6c749ab446f13fbe40233b57feca744f3e96d4bddb58917f6f3bd6b7fbb9c60b34964c9149ab73a5464c4be065528918965df4a085ae81225aadfe349c422d9ff994473dbaead446f93d20ea8acc80ea8ac9aacd33276be38593c4e70a2ee759fd39dcecc298565a2ee3398406fb72aed49a79e378f532efd69fb157af3da7ace39a54b9e82422e5d6afbc7d1c2125274fb312a9d913dea7e8125b8972a1377c74e4ef192cbb1c9fd0a38c54b2e85f6945243a664f9337d3a387307b461f973029c149c94ab0529ae16a0a69491fd7be84465d1895282ab851c9798ae5d7e5c62aae012e3044986feb8c47089c1da3f1c00a2f3e5ccbd56cebd370337de77d63fbf9dfeb05fcfefbdf78be27f84111e39c41b7f7a8237dddacd90c16aff4e2ca40ffb673fb2a376e68401129847f2eb555bab3f0d4594302ae2a24584e8845a6d572da8b676b5d6198668094102f3b456a0c404b5d65a6badb5565bbb5a8728a594567a295da2d65a2938412b0852adb5d66a25a8b556fbf56dadb5d65a6bad407ef8e8c1e31601045057ece0027585900e527f0e1cb6b1460b9af90d24308f148f84defcc36cfad58d67a9a93694d9f42b257b2625ba7b96f6297d3438feabbdcdffb928f379bbbf18ceecc905c3995de228b00dcef9f3952811ed3da044b6cfe34fafdc81a5d09eb73de4f910c98830fea9f163e3817ebe0694e8c64f1c5ffbf1c530695cbadbc71a7966fb4f95a9e1f8f171fc4866b9edf16b6ffb304cb2e120b3dc76b6e5dacfb04926c75cfbfcb4c76112ad462e519a48d3f967d8442427bd3dd972e2f12acac31f14ffc68361d28d7c03dfd0e2cfb00926f33081f8815e1626012df99601c98034fe1936919178beb2c8444c66c11bbfec6d7c2c4cb2219259f0f6b1e163a3890f89492b3eb22f4cfa91914b767b3fde8ff651f27cdefb1aef854935ac777dde7b9ff7c82c3fdbebc2a4cf87ccf2b3bbfbd39bf2f077f41ae9f9fbd427fb944b76d320e90d6b28fcd1eeae8bc5625b9876096e8f5caa1b874966585858d813cfe5dee6221358d895dca03d0d6140fb242537b6fd7a631d50b32797196aaa1425f2bce88d8b863a60b5b7f3be98ac07cf79c19a12beed46d694309b444bb38dc1a6b375752f9687f7411a787a11ea65cf07cb80c9e58502cb03769d6c97b54343fd294eb9b47776fd395b5971dc6059d936f68cadaab6ccae36ccaeb9ed8407cceb4eadb36bd5da73e0d42c2928e4b2c2d9d5c90a87deea5553db9ca1b7aa5dcb7a66d7af5265dcbdebea5495a244ae661aad99453c2764a03250a85dda5dde3665adfb925e9627912dbdd1496f240d2b97454513ab863844758a12959ed79e5c35b4d97557cf0e58c35753d59ea69f3ea41a098ef8411b9e61e713a321abf10302dd9805bd102542fb1f4345da0892255094b4075642c8426ffe34f41253ce9db487f13bbbbc58b70dbdcd904bbaf5553c94c88b436f601403dad7f7ec4825a1dbb3e32597552aceae5f7a55ecfa73533d3d12ed4bcfceaeefcd99446855f5aaf0eaecfa5e1c4a14839202bfa627964fce2106a79def4ec633cbe34e370f33e451ef200ec5efc93e4fb72a59ceada24c96536ba8872c67d6edc9b2686b680b24ebd3f4bda23cead3aa4ae4263179542d22767562d7bff5832ed604523fa66f1b7aab5f05895c52a8cf69fb7bb58b12957e237c72c9da053585c37604a6361c3de40103039bbdc9a58381d11cd8e77093e379b0d3d5d51564442ebdabcbabab7b50e334f97e59ed746495226e1b4d56c5c9cacaa24920979e95a545eaa06a63656545bbcaa55b595d59ed102222972e2535e555423b767027cf79ce7343e4d2739ecbed80004d9610bcbc84c8e5f40ae1cb0b8208ce2841a1b7fa5a53ab4d2ea71694b915c14d07a1ffaf0591cbff1b4d571b767d304348734e505633bb7e9d610e71b24a4d20b5ee293964af7fb5a6d1dcf5af1b4a04df3694e8eac6f982c24b560122971f4d839921adf1ef11263959854d2e6f9b7ddb7810dae8c3265af2c3ba41850c013a943f790eeccb6bcfaeada955b467fd26a4f9b50bab5ed13251356b4fbab5d8b3c6d9b34651a5d855ce9c6a45bd6273edf965a5b36759b5b298587891b9cb4a859a3dcfcc20a557b1fd3f2cb6bfb7b5fdbb2bb6ffb562fbdb29b67fa562fb53ad55ed50a2e9f505f6219537f7b4eb9dfa55c1724f505253555616a9b457130b2b0ba9b45a7be6ecd69eb62bcc8ddaf39b3cefac488395e6aa4a2b4c1aa74d691a3c4bb63c48736753fae199142d7239b13a2146e86dc8df88f52e74628b8484fc8fa1395df8ce88b327d707e2ec72c88cdc96e2424acace7e1ad5796d19dab5619293227cdbbb5dacdc0f1c7239646dec28e675f7eea22121462a133bc5896ca964e44879785125c36dadd60c1728c54b76cfb27d5bb23461d7d9ce76de90cb71a4434675532f70d2211144e8defb89652f93ddeb1f7b1074dfb719bc36de422a0f96e536587197db5d6e839dcd6dd0c31dcd6d3016f3c4eeabbedb6ad0e23a521e949412e5b4e63e7ecf846bb5b086fe62ac91407bf1d34d854913b820ed294465b4ab620a0ed7949b3da566cfa91da6ca906498f9e232d33515866b2a07872b0a0b3261cccc996301d7183864cadcc1f2b4e8f410a78726e6a4d3c3105b8cc9e335c60e79862bca8b2bcace6c5bff7e56ab143885ca4fcba1a0a468579757cde59eac16d5ba5f5f601d165696d7d5e5f559595dc5b4b4b66453535520d6c5ba59505052565657a297cb3df54c4d55e52fefcb03f3818292fabeafca0638eb82f097fb72dfd3b64f69b11aeeea1a33904b4fcbd3f2b6b6fd6bc3402e3d2c0fcbcbdaf63b1c9e9567e55d6dfb5e8e9ef7a03c284f6adb8f691ae4d7978eaeabebc2429d56a7d56d6dfbe18e0eabc3eab2b67d11825904dd5437d5556dfbf956e3d1e5ba9c7d1a3dbebeecd7f071bb6ed7f5daf67f7e5cadab65df06102dc1b5ba56f76adbbf114468e8425d28fb4113dcdccddda76d9f46c1d717d8b65fabc076d92eebb5ed8f427a0cb15816cb666dfb38888010b15376ea8b2c9485b252dbbeb6c0e66cce3e69f4f5655f47910a8c602dadad6d7fc705441854ab6a55afb6fd0832a85353f66ff508ca3e8fdd03c9c811dcd5f503490649186b5b9ab5ed4b90e44e2ea9955590aa844e4d0d2da150db4ec0240900f8ebab82264b34c05a5a439c5820978e8545540350815cba951591273e355504250051f0d5382f231cbefa6b436ff6a38449be01be1a178691a9e475c16725250c0ca65cbd0046815c7f8654c038aa55ec6c0e2ef05d7d5848e167050a00df0ef0fdacb6fd2febbba244e597f5c5f9acc694d9f6bf369f1bb7953e11636fe90c5fea9f169031e014a2b1271d1ebab6a77162e432e799ffdfe8d05051c53acab25a50b66e9795e9d5cd2f2d33a6815cbae79e6463e4d2a1a05c0af4a929afc26e657515e2c9a563618122f634ee03b9f42e0f631299bd7dff62d6a86ddf92b6be3083b818db92f1a22793e15f3efee5603e65e468e47234380055c34249d5009bfaa153553f6658d9c85615eaca4607b0803e2c8a05e4811b566b6bdb076de499cd234a450399d22e2fa00de4927ed12ff006f634ee2bd72a5579d82febd3b60fd2bcb006de0d58c8f5411cb6e6e8e87f5a46621da250ae3b6850087e3c02a0795b81870a3d9e7ca4f0030c902f123805f13284c2041474a9007b7a839c902161b9be30818044d8d3b8337259a16e9846e1dbaf364ca31b6fbf969946406fbfd6308d6cbcfd4ac334fa79fb75866954631ad178fb558669e4f3f66b0cd328bffd0ac334ea79fb356a1a896fbf92a963ea0bd3087cfb156a1a99f1724fd823de1043a010dbc0e00f28ab218bd1887d3e9f97bdaea7bbe20d2d8dc56cac8631b2ace190b0498e0d92327d65df11b98d918b7a580b7e1849408b0cb9110ae61582015106454746db081206f5c8119d6c9124d59044c91226006852460327017802250a6e831a94a44ca142439519381040071e0c80001f58912a80010e70050120242084310a28b148655900031aa0658b08238c5922a1042907303d00021130e1042e4db92e28788972fa024686149e5458810c0b616210d3021917a05e1843260a861864909a8186a81acad820c30d66a6702093830e319c41436607aaaa343cf4a0668d0f3f445949b101228836420c1145c495046428c20837479041e24d145612314c204a09384b30d144161927a29e9082224e145244c9d1929a828a2ae6587145141658c8b0c545270ba93a5a446dc1450c5d5d7841e60b3b5260c4400118c2f0aa8005a22e40e60e063220c69706c6d8001e32cae0c01830333ae0813c1f38c3c3725d50f0e2f4054c0a4f2aacc04218312db800f5c2183251304449cd4069a8c196b181de60c64ee190c3a7c31934358adeecbb186152859a40ec53d140cedbbfac50675e40833dbd0154ae9edec0855c3dbd410bb97a7a0331b97a7a8330b95e2d7b272364f21bd332a113d977d7be6b55294a54bad69c0a1567dbaf51b696f10ab89787e1147030dc8e7fe15e7817dee55cf816ae85d7f12c9c8e73f99663e157b8153ec7ab702a7c0ad772392e8547e1711c0a7fc29df02c6fc299f0251cce0ca2d7a8248bdba8821c3234230000000004008316002020140c08c562519444619e15db011480117c8a4258489fca03d22086511cc4514c2144002140006004464846e30031c958d09429e149380e9a18cd10b66149860fc81709b6fcb3106ff15d15e8809fb4d3b65810b5e72ae8614ca4e35351362580f4271baa4cdb6118e0d88bf99deb30094bfaea69e1fdb4bd0cfa20bdf0668e64302cefaa268d013a155fe8ca8038fa98459b9b136e5816351d546fe02a1a33c223907753f849294138fd03f7a97a92e633c4b1fc57619ffd2a843f1bd8d72ef8014cd705afc876838e73a35ae1defc600950e14a7b162d5e77577a919edfdda6e175953f43fa8541e6708029a6b9fd7417693b483792ea893b5acb712be59d948558a39e0d2ba59b65fb3e951239232b54010b60a88d3f3e278835ea536b770033bf530ab62762e8cc64f199101369723cf1c423a61001c2691e5c2b23522bb64f8852d5dbb513c5b3bfcfe9eab2c7719df6598e3d5facbac5cbe8f144130088868ace706fbec9a15de7694ee48f45b626dfb952279b1930359d5f32ca664b45c04d3a05e6dcf83632992740734ab80a2090546a5d6de830ca8104c1f6e1a4b32668848ac09edb4a96dbfc56d1fc24239fa40ee68b4efc133ec485230de8021699de9120bce4c91161295bdc2bb71a12f50c2fc2e83b1de8403d5d907046d201823379b82d75e6b844d7135e989df130937785c0d01ffacd4e12251c2a0ceafd16f07bfeab933faf8eb857795af9b9006c27cc255fb3cfb7e49cf85d8d6d35ffa0fc74f2e4f0d3b590e0c016c0123cf6ac7075e3ebc94cf6a0e737c85213b9f04a181287b6040060d074238c0925c634e6dce05f36176a041b0ab6041ca4cab69cf16928c09482bf995429abfdf58584f5c53ce5c335ce0581f0c8fd5d885ec559df77a639489bf5c3a8d5de45257527aed497d03275c517af187c53b86fb10442099ed8c01e42be1df4099489d08e89b92864db9952c165a1035cb834039301ed50db574d2d8601aedf672ab89459709c678eaadfa452f6f765ac56ab196f426bdfa3730ec4896d166d303ea04bcf32802fc9ddbe3941d3ab49b44295f1c7a92c75e99f2207d38b2b980c1c80fd0eebad869ace5d36ffd9ea235a141130c9da20b68b791b0f79a9eb2c27d392d4801fcc1decde51d1417a51ab07544fa1ef17e1ea471e268a09139ca475ddea0f7f10c2f4dcfe2a7ce79b25622349019414d877853781c7da18d10a3cfabae15a8f4145a50ed8ebf57efa4fd23b26d6bbc43723108c24f8dac105faf0f03e8f553b53ceb707bdae112c5410d9c41b27f6037a5d0ccf28274c4c47ab04f23781044e08f0c454a157e8a3f44e145cb15c0ed715301f59173d99acf5159ab6f6d088ad0e673d466cc56805105bd1807d145db5ff5d97f3a7d49c21d0e53284bd73402ba57510f5407af35946e63887a4c6e8276d300ebdf969aff306d66c3b867b8215725576458b1b84a80b9ae6d643e92411f04992df9cb16bcc45811b963982156de46e7e61425cbe904554ec19471d7757ccfc2c4bc8d14c5c1d8ffa06624d8e70ce40bfd524ab8158f4b8584454cbeda62621c5598870ca2f5bdf5da726c35262deb2ea38b3424dbed0af2d3063bdf5a349ca11a593853fedd36d6dac9cf3f3d6ffac22bab3b46562eeeef9388859a9e12eaa62c64a01fd3b43123c7f34e3e3548c7c4bb14e0aa2fe8a9a4896c90420152896a4e2bac528f22b0dac9a07d0c6d23bf3c8499f4f11045f747e0dece08ce9231eb0012e3273eb7274cf6a6fae44cf951e4040e3eac08de3e680f0f0368cf8008b98e1256cd52c16ca3d024e9880aac39c7bed0fa891e6779df0e7610c4316eea493de8ab0e6a539ff5e8fdd016a8ccac2e61509f450d7f5583d6b02a44316d4fb20e8d9d2dea203b6468d42f9382bddee0274332776550db14b232563a47e9b664933393f666fd1d071cb0ed3640f2a8458b7a376a9848173d177de607fafc743acec9dd26b774f660f3f45024cae6242949c4e498b07cc7317c971cc0eb4bb9dba941274cdc8dcf45ecab42820cf9d108e34761d8112af4f73919430ef33691725229d1e2799dae3b674aeb39ae6dcfe48c673296fc1403cef48bcc7b06bc4178fe64e810f604a5a5800debb929e64ed1a81a02a0db88ed30d9c6e576024057fa4642dac75f5876dc95496b799da4a83ba4721d0b91e3a354691e2e9cab7b87f24ef269bdb2c88f63355698bd69fb911494bb611a73596629bddf36890a90b485f3f0e8c55be05fe242fb7e704abfd61e9bfd23745e1e6ee87e6a6490ee3d39d3e34d786d55ff7e7c2b3d80ec63b741edc324fde0dc6bc3d60bd1c8e9c443827326276c1ec47550dad3fcb0cb46ecb489d51d80cdf9583e204b8ce3516aa7eda3bc4b78b76d0b64ac54d12ceea7a820c2464fd21e3cdaf15c5e6ada52b67746b928c04a3b28fa147ecc3cb545a697ae6c6e9279112142335a011b3256f40ec41913472e2a04e41a73dd3e61a3678fe9501cd8e570a73100b15927a65a51a7faf7f910cc91175aceae154c7de9c88860653115342f5d1393bd0b5a46b111b7023ab206ac4f4a72d3af287018d10e0c53610edbc9c05f3b19c452e6d5027a2919a48338bdb417d98cf30f0ae301a7203b77ad0c6eb2fdb148cb45917ce765ae9913784f30a2dae51ccdb68395fb70456747e436d1600047bb6bc8cddb69382c82e5568f6ef38e98636cb0245de35f9981d24d7ea562249d84039b42bcdde774934a9266d220b8a5586caf07a514abc8b16cc2f15cd9fa0fb28a5c4a5e05d47465b944a0fcbf920ccbb3010a3ff213526547c334367d6e6482dde56c0fac6a88709287cb9cec80afa86a8164c68f55fb19f4be3ed65ae432d86d2586f290afbdc70f54c5aaf04df79300761afe1d8a6156eb19e1265ff6a990a54304dae285b2f0235fa163763a2329e37843f3259106bd738c4e233ad6e20204144de83cd3358bedcf4738537ca5a4a69e0da203720197bdcdf71fd48c1cf3031219e1f054e6f9d9370ce9fa19af1d4b3e3e9d88d1524a9269a49788a0709f98168c7e66d24bc9b28f67f06279f717a85554d289acfc512d7dd2a66ae78cc7f3d39e2e99af82c5aa688ebcf2763419b77055c64c779fe7a9a40d6d3267479ed9b726f4cf92103284b25f595d88abb47094458b697d410fc441e5975c87816fe527af711c8f7ce32b1202c8b1402ed9c59f9479cbb5eeab268a77dce7c7a539a6bb537787cc6e3d538be72dd1f41e9fc3a1858c45fbc47d79c212adcfcddeb00a6b5fd462c309a2077ccf1dce75a3ad775e89c1e3609981d0c37e8d7b55b7742308317c018a2030186c879485950741cc1ae5786bf44c87cad0437d02db4c19e88615b85f0efebc4f9c2db268e92fe82ef84ee277dc8dee644703bc41a79bd7b8a2f758ebb02ed665475c3c6f12f68252b74242441cdb7bcef12c4cb21ce92e39f37b8dc8d86d7a570d86c3fd4c2f76b5edfb2d84fef641533e9e05ceb1960f6882997309a9bf5955ff17881fa42e102836bdb395f41e46fa668b67305a844f14dfc0562996b248075bee4a7f29cedf2a912a7d87e9c37f99a51eee696c4d3d1757039935d867519bdc41d97cb2b498d50150b802303bf8b0ef1cf51ab081aab88277b93b402a710c30cd4073384608110d19128348a205036f59acd0a586b086b179af7646470549b8b1100cd48b31dff9b8a1c65178d431d05a74b8a7e610202ce31cecb004ebf56e027690a91a67af95ca4cffa670c506d80b785933b28811c34eeceb8e7eb93034677c1b7a5a341bebcbdaebff080c0b5daa2a9e81fb608c4fe2bdb74685f6326e4568416dfc1949233127f6e83dbc4ab62eb5415d1135c1f6592513123d51e338565006f11c30bb3180507ca0930edfd183288d887e85701853c9e6fa24201671788459b96eaba1823d0bacf4ab44b4f16fbbf889ca0f4c800ed3a9274c12ff0406efc40348544ebca6c070e613ddf5467a0d4ec464cfcf659bbe1d84119ecd5a3b10738686c1560f5c3754fd0568e5c5c698d36e8c7c808c7bae5fec0f3c5bb4981b842f53cba0014c4febc41522feb1f0c811ca83f17a8b540331b6ba4e1408c291dc53412d9579fa03e2361229fe49829bd09d727014e573e41411f11e01eaaa087ee49a07bd3162d40d028214a91674913518446baf5aeb67ccb67e426e4c47746093a014ad1aafc37508722f7ad3e7c213c870c13fe6cd114d4b2f0fb629a00eccffbb91e6da06c54eed86bb979f7b2e93804358fac34d23ddfd7df0138a4d56f6c26385364129ae00f84d105b2d25f309784808b4a738e974c5b298cd568b7854aa3982e99a6d24cabd12a039526a99482a652c8cc75940e8459e43bb13a78402087fb0ce0531a385ff3dc482c26be647c0df87ec924456ac8770fc60c27ea716abd12d7daaecec5fecd7d55e2e236d4d425c96aa4ff73063288720af97b79510e4271fd9b351d2890052923447e91c51f960ae2b13a2de2eb4c27dfadca345a6b01ef9742981f2555e7a99f2403689ac25464c521cfde306a36c49f67bf955b54260309432e5a57c27c940238f34212a48923de5ec903682dedf387e04c26c18606f73360a6404dc6d9645d16b905e8c7312beac50c216b479c3d12ae505561f39e41333866d9a3b52178da6dce9086adf3d44f9201344d612ab24212288e2f90c10d8df0f2571470ef2a6f6fd138d87ce608b6e229c10313b60658e3e91222ea6fd01af0543584ac1d2d2bd81587e12ed239f7f7443246d3b4e74d7c0e7750b22112cdc23caf75425aae37f20ba5ee4bc015bf37f69743f820322a575698f38724cd01116655cd50ec2ee1ea41838a6c71e2e69b2b292d0f11e08ffad1066e2db09966e3fb7e5bd521b0416c0d45f6ceb708896251296273993ce20c214a729d59970014273f5dcabb122f2565660e31c8aa2f1f219e64338647cdde4531ba10a99687b8d9ed1367c806f1042f7e51cb699af5a599137e549ac07550abdd3213986be70400af24258b92afc4dedca6fe43418c1989a9e300cd6933e3c44518f2a43c132a842bf0877d6f44e1afdefd63abfaeda904f3316b6f15fe5f90458eb46a71b043653d95e7bbb6606e38ade3dfcb400096bdf4cd0cb10c9c279ddd83f257b696ed1ae2459945aef06bf4127a662bb150b6deb84433e489727fbcc9e9592f45a436b31d0ab0e0f769b470f249ca03c75b88b8d130c74363f8789c75ee88f78cef9ea4f39c79755ba8eb08f6f298a49b371aeb862e0c00958188c7c2c210bcad4915b990af6496b3555759cc5e81b7f3f45df7fc84a92f26cbb7ad6a86dbe11ee4e0a3db6be3ee999e22144aa14fc8f3290d717bd73e57ce2b918f4cd4181538b4abbe5f9acda9f0616bb8ad2b41fe4066b91e001c50b9a8e57db50716464698b5213895261afff76be308536944e6f3fe2d1c75acccc96f0233093f440c759dc543072a5b5a0ed82e8b30bb061433aadfb5ec7dc063afa51906d0c7e4a3d1a79c0842bc77a1e50336b60b7ad541da43a5e2d94b70a8dfc0a9575a63abc9fd221f0f1815f1bd8ba043899e366633877bbf1a038fb2d7a7cd74e8b8842fe165a97f50fba5f2698a8b0b70575998affd80ec42f30213a1b4f4e66b72c7658f4f831f517c7d6dd8ade7f7704766ba0fdc6ef1e14a9e7ab927fa201716cd0219b276ad6cd08fce0a777d6dc1dd638d97cc2f5cf9426f4c7c0940e255b33721bfa0db133e2f389c126162d5262fe15fc137b2ce0bfb03827e9721efdedf9d3270695ea55d43d60e78a75955419d070250860018cbb479d2711a7dc0110194c482d7df240b60c6eb6050ba78c5d53fbba5a5acdc232c5514ac1bdcc954c682696aa297901dfe52f9a4fe43eb1e8506ab2e65f5ba71bd86765021c29a5a8df6e5b80ccababdfd46f51149e2d6407200fbfefe3f5f0f263a56a8d169e8c92fdf615a00a2699180dfc78f8d1d0b1081c358b6dbe9f52eee2e3dba4790c40b754f09a1869b727d811227c4b08d0abf0d3c5655ffb1506c5056fa420ab4299625af1139dc8b6551f9d8c3727d4903075bbcace24ea8b9165d237598a4af222a81435d3c8b928fb1b81b9c4158a3fa27d23851fabbc570a2bee0a7fd8db75a0912ceec36aa95cf511e472078af389ee125e23868c7b6565515007cf0ef6d54152776d96da1d0176b9511e001bda766515110bb521d001e90e3f9f900039e1d9605d4c312c03d5002a84324807ea0076580d50f54e1d28841dc55289768b94663a1b50e5a34c9ea480b1bc33490d8985ad5911871a8b3d32c8969c29ad9a2c465d50026f6d9d2a3e7710d039e238da646a2ffd59c0e83358bc4f87bfebca8f0fc3559e6e64f229abf68cf993f98975cfe0abdf2b709dc4195bff9048bbfc0c5a6913113aa5efad438a1e3b72a58847103bbc4bf39bd8f970b6b320687b9b158f5f4342f7c8f18c2dc196f63b8dc97e60d1799f67071d5914c909f8d81b7750e8e1633f05baad9c49001ad2b8709ae1abdcc7d91244356a4416aa61545e2559afab74037d718c959acb87341ef313552e3d9dcd910473b04d188f57d8ccb21b2bb21f7d3487ed2183163ecd023b25ec167ec668a6d0f74c801255d003f24b901ea15400743617efab095b3347093e056d2207eae98c1a098377d64f528833345770f460705cdbcf5512bb7d4c2e5e6b01c90c432e55f667e345db979c1d7a9d415f7f745e2e188ba314ecc224df4e65763781506f0362211ee84b39083639ce2df0640a5a8748e2eb3a499534436b00330bb1921493d431b5318d5540adafcdf5311433b9b997c117c642fa0ae64a3ef96477c296923821509d5af589da1ee98d9a14e6d4acc0dc9c04d1af23c3dd80d49e02e0de93c3de0c64a06e249d02d2b29548e9791108a356ebbc09dac1e7b1f52df987e3cae0fc84d33254374cf27eac79a95c5e81d7f6c578f1bb8570f62d321f3ea7dc8be00ee03eb29c97e6d3e7575c75c80fbaa53be5980e5cc79a6097d12f06bf389e5d66b23c75825e3983e2961847bff653708c0da6434a0071de5b6bf8599a99f2c2d9785c5e1c41753dfa62ab742f28fb853144def7f3e798bba26430f2d58d6f0041f39100d3bb15fe2bbc4d908caad20cab07fa60697dc712a751c00256e4e5bc325c79842e4ec241514174094f1b65c0d269deb54ea56004ad8bfb6864b8e31957a5c80a2f4c7d6a0c804c9ef4ef8016ef2212369cf46288176f81a7dae469f82c16edbe8c655cf0f867278f3b7955e5a1db074d3e1be7e815a94213987d3a748dbc4c9a2537502321ab67e0716c4b339d590fc909f2c4668c507ee45cfd1ddd01a26284f58b8e1740ccac1a3c1984ce99f7018d81c3877979d17e7d2b1f3c83f3a063cf8d73e8b07cfd567e413a804c76cd5b139579c4557174d2dde99ae8986804321550a0da9d0fd534522bea7f1d7eaa57e1c3ecc0303706155c85ae8883cf426f86e8a08a37e7aa5cc7fbf1af6f9d4953e233cd365b9dc8b6df50e2b3a7fcd481dba2726efe05afe2d30b0110d8824015ead8383810c0e32e775d875668c894224f7eeac65a2b8c87b6d3b7310405675cfcb221e83206b14cfe7f5b07901dfd1afba40645a2bbfd78d7e90c082d43f2e6ac58f4d0f0946b629a89fa37fa022ca0ac8f23334ee148e5b16adaf7aeb90e9f20ffe1284ca6f42a754df22c0ee44182644860e694afa38c779c7440a90d0081bc128bfb8c32dd608794210868faa5cae575d86b6a2cc2041b519a2439d01b4f819cae6d0b06bfb7a53641105b8f48aa150eb7dcf790a59c14002c885aa99cd0ce77a13c3309119f0a8dd92e73dce3b1b1190da842f80ed61d1ff30499340653443f17611573c1d8d53ae2681e7c8eddabe53d95aebfd6210b054ecf5cd745da8ffa5bdad2cc6a67bf5412dad575ee71ad551281552bdab26bfe538eeee7d814ee7a1f76170e170ebd197fb210abd57a22318d8725bebcfbd669dc6198118451148a77e803ff0ebab0c22b1cb1849713748d658a55451b0dfc774893729fbead8725b7f19ad03cf0c2962554145a6bfb87021aab274fa55be9e86f4a9f44610a87028531d1ef84a74ff088e143cf8cfa726de19ecf7e78a5741d068e5b405a95f05107148182cc1c1be7a0ae2dd3c27293d65880d274f08f25169a714d0686b8812c8aa048f487a2971e87228c74ec82de7014641b36b56f545a337224f33fa016350da6d2770fc527fc52441d5a039ec3b0ee93f55efd917627ba1499de40f68d63a3a5cd49c17512ed33c2a9006f51c327cbce74258a220d36e29c2813e545c827c61e2e041309928a50b36fe95cc58867df0af623392f5797862d7e5ba3b11a4eee93b75eb5cf1f635a061a15336db0f65d07a6039d2490dcff3c971bca2e526ab0a0ff4d062e7c39284c3e9baa36c0647c94672606beabc23b7e5fa793114f4ca90b1015c6efb6890933e0ddc1dfaba192a65ae10c50d298e80c8efa91b07661d8fbe22855a36aa3d69456fdcb642c1dcd68c6606f28133f3b8acc7ff17e2e6d53003aaa9569e3c7d5f080be51d27f075fd6d368f889dbea8abfdb531ee31c1be520ffd8bd18f40871658459dc98ae8596f00a68079b91dd053e2569f8ea65e85b10d208a9c1d5d236802ef9258e06891d069e498bc52dd7ceafc993d66a06eb9a8ad0d00e467882227f50006dab3ff8b845d61a52b3fe63411428a5014452a43522dd62dc9810024ceb8e1b63705c506c7de2bcac129b9444131213f6ba237671d06717b0fdc72127537a2ddfcb4d1dfcc8aff018b2e56e61bc5af3493b4a38ca7d3cd403e11c34103cdf5169610b8c4b076aa155d2ece6b1a0470731f8f445a33a8a9d5c114e31ecad4dd4176401f00797dede25c42e0315f27017cb12411844360ed8fde4ffca6bc5635be89661faf0dcf0c3c26754a140f0ed281ac28db1439666aa7975fba94a7752f1a45bb492d3ae3d4d6b15e26ed0d596a3f3c1ad21ab1964dbd3ef8c0c372327ebc6abfeb0b88cf8503a52d3b96a6f9382a99cc518bb5016a669bfab1b5667f1e52379d3ec00a97c3ad3cf2c0e467273e802c5b926396f7325067c65cbfd2ea10bc4de7cab68660a6bc96290411b21c829ae3576530d2decf5bffa0d7a63e53b9fbf949fdfb899229d2b752caa0e9cf983b907f2632c64c1959cdb3dc390dd9ba2b59bb8eef73c1cff51666df19ae8a735b9f720d90eb9006434560934b84d83aadcc421d04842a48f521d8ab9821c2d262040a085a1e47836a669d86cf8ebf453a63db7f49b7ea97db50a03e3f9d0eb7039dbe92278b892ae9e936058c183df824d4adb6df21752d4410d8638bd4832db7e1cc89d92f2401782f8406c1f01fe04611d70eedd144b861ea971cacbd13dab54859f3732aa848d4967bc5d7528cbbc12086cba7ae79333be9857cc3508817973d58bf7c8ad38d3dc890f3c361d221f9d20e8e1aa6bcb3805e0a0aa11500305920453065d99f79fab02e578ce99966bb74b3f6e0fcac6fda5f5aded8fc41e6e376237eee7c7ac003f9a9b4333baab4b133e66064a0dcacb74d2dc40891d1e96707a4640e40f77369684db3a2b3a97c7475d889fe9cda45eef20e52b7d1bd14c85a81199f16fd08f66cd233cd5d1b348c20bffc0c176c57c8db8679afa37e6aca9b5b15ea7a23aa90de20848dba78e9671a2e9f4b097aafde4c1d03e275eed286113dbc026936d8b2d6f93c1da1b3b7749c83d5948546bb9759f15a7ae40c031e243ac65766f1b94465048f497a3e7527c5432aee7f2fdee6dd2cd9dec3ca95d249360716d7bb3989f94c6504d3b4c5a64c3117df74f5073094cecfe8f3b97af404ecb5162c78336a84e580b28b4997cb07872ae42f00a5b6c19323014223ecd77b514742338e8af234eb64436a44604d60bb7a6114f3f00132ceaa7d7338820460184c7e009f52383eba240c7a2a4e1b8c1bacb026d173b5c9fa43b2749040343e7462158c4aef4662a19071087aada720a51bd827fab8500ca9426064f8105810211f13042dbae0e4acede26214946b3df0f4abe0bc5ae5b062dbe161ffc50ed2abf531d2f60a1e64c795544b7e7e1893db30b375bdb824733f3c5570e772ae5b70392010f280bc76e135837d00c2cdb4bbabc00391f960cf86fc88a312d28892ef0046258110c53ef0bba3628201f06f1bb62f2824ec1eb38f9a286bb07af183ac916d273cab934ce3c6dff9c27ba787e26109d4a6d01d9cfbe7126d918bb6ae028097145ec972b26531e52fd308cd060c1877dc35497a65b7dd4a9b82f31b5fc70adf845c8a47d2bba1561de03f018b4254e5cd47d760f5c5496fac4ef1a3e034c400769479679e450b8565257f622d57914d37c75b6e105bae1177a707c4413b295e3e238983fda01f1b9c65c359b3ffcd5adfe431e584ff38103fea0843ea3f5ad085378bc5afc6f06185a86114d2bffce38b2a76bf1e7a5720a6efd649409a65675b07749d1a613ae620f121399c5903be1f4c6d9af626dd396dda8826d50d84b6ede79acbbfbe612b7d5296227b36bb73fa459616954bbfc5823e008466bcddcc071c318352171b848432f8f30fdbdf8502e675c49e628cf1bf0638837e0b4650a48b5b948137555d28c7445bf2315a8c5709d943a040194e8f2718cbf4d0eed81f75d9bbb3f1e47a421b1b150a0b688b41d767541753f99b5d19c3b7d95c1a496e7df175a81433885dd4dc8d5fcd525bdc8343cf089703329d404c7563f0b0a5b8d6acd6b57a155c2d08157a0dc52b318f7d3b3a68fd891f78aeccbe15591df43371e1469812a04835b1919fbbaaeee21a743a88bb9356f5e805569b0f2c93362327e5c5a71f362566660fcbb5d4e01b83885ce661189e46f3d6fce925407feca6042db3be79896eccb70bf4a328d27d3a2799c53354de88d893524b0ae309ecacd19cef53797f15e2e79661386dc431da3fb6de38e7f96326b100cb4944e85f79476a03a94f6f438511496c1ef044955c1fdb163e22a14d5f64f5b4633118adc48fd346b61b60583635bb6c300a6e6f38546aef4a11735e6e86da43a083ccc6d485c2dcdd37855767579ee3649e5270109b749297b9fc2ccce94edcdc67a7acaa54bcad9b8f214cf59279cf2975cf6aab6a6d2afc467f359a242edee73a371c9a3177c923ba7e5b948fd8e8fa9be482972a715e3e929177cfde685f7718f8d4c16edcd9c0746c0634356c49b4cd995c59da8347c42e3125226d45c7e563efd505e59f4a40b80e8e5982eae4bbfb0530780ca1fff24bb19bc6cbcccaad4e6cf817d36ac9b1b638851ed9e83ff2281f937a74e620a5ea9be342c805a331d39bbbdb7d6d356e5c71135e13097829a5b9c2c2e66acdc9ce19a131631088cabb7bae260502b9f5dd3c77fe50a9a376d329dd41e2d1d78d5858461b45a7ba5fcf615f81746c77920ba6eb241b69e83f1999118166c3f34ae1549c1848c6979e66af6cdd805ce80fe29b291a2f39080a0c490de071aa841d3b9c8f9cd8edd0b18c68ef63d8d2ee49cac01280a9cf357655a238db61087280765ed51e670bc68995b5492a9bd4553249f4dece62d4957316abbb1ec7308713249f405b33625ec8408b299d7808ed4c6c65255892bd7c62a62bfe2b85ac930a1f010d1bb5baf321897bc46233e0573750a9282c3faa686f132ce007f5d39a2bc5936152f9425a6527d61415ad88988565f62fdd48e9afcbf85b39cff92362b15213066e8a0cf0ee0d933dc78b7a01e645888b69385354c74ea0289bf18f0a5d35e587c4a30af7b88cc4178bf2a48b556868dbe9564d06246639f5f89adbfce65a959bdbda4a55d9d461539d0deb17a132d85b1c54f7577d01812c0a6f20b4ab0efb39500d48d82d873b8bb2fcff29fbdc75a4403722bd199eb63effe1ce1881ae447f0332bb21163d95af8836e5dfa3dc83defdef31ad44383c531c4698920acd74d970fb8f8db1b84993055b5753848c3fbccd61076b09528feec91ea75c0a2a45908b28688e7b0bd2d9213a32e0184b02ef629783632b637d6761f5381b35f8d8e73eb5d7857aecf4bde6650097d84228cc463e74005c14c37b4f1d667eaed57f018b37a76b6b016aa48a2aae5ace098cce3306cc7797aa6a9058b36116fd3452f862fbd3cf707830bd069bd6965ca66d03aae6196caa8a2a8007e27703329a50bdf350733859f395621eecd1ab0f5c24f674393260afd451deb5864134914893b0d787d9d00f5fd1493c083c9dc05c44b3d4e09a5bcec135d5309e131d2442f6cd4e8c452f30b8b1c4ac41752d53fbbb8bf62da5e06347054ea05499c4afd30405f0841fb83d53ec92411a1fd05958288c1bee73275049f5a8c4d139b9ae9e0096cd57cce3c4cac5fdb9a28e67113113a771cb597a9ad72d34790b8c0786792a43f881bdf49465309bf9f30d3380484eaf2e8c0134564d5490b7dc539476e4e344f30319e00de61c6d5ee5d94c920a648fc434ee2baff8252efb0d28feaf2e90a6bcb36967a3a93ce315fdce385d177d63957bde5f0f7d4b261b365156c9dfbe583d3eaa90110110e9299989e24719565264a29b9fb4300889ded004b3776b9c8a04312d57c1c793b795ea81a52d0eaa5cd6b8fcc2273ebf58f1478fcf7927053a6596455944e7173c1e3bc50dd02234e8a6a22b7480a5a3b644ef5270c1870342cf2211da2db54108f7438aed998f70e258f8318d4eaea701085454f73f4592052baf4d995976507d476589f4c031f077867a40949658d40881207d07cc42fce1b8e07870d3654d708119f35fb040c0e85b03f920171ba43b6dfccef6d8117071e62e27afda0c06efa0a10aec13630d2a6cbc3f02f8cd1b6ed35256a141f7d13b43af67986fd6052f09381045404db2f5dc217077fd48ebfa7d6e062f4904a995f0f6b50b2a470c67ce46de38ef1c768c943e86b1541d96750dbe791aebe10acf7adf7cf9180e0aafde689086b557862884c807573a41eda8bdfd4e46246f5ee74526a32e27e8d548713711d35860f8a97bd70a11bbe0e986f7861df74ea9339eb8b1c9c47a71f595a6882f7e17c8086216d61f344f4294fc98366ecf7ee48f351262dcc480a0cb2606e7647828ca1b8d7ed6582f857057a558efd173a4e748aba439c58d6c7243f7d6823c56f19189ad4a44ea8a72d83ef9702c384afa7b1e9ce0cdcadde0adc56c2c6e165cde32cb468506d7ffc1bd7dff500e6216bfd3fd881abf16aa3ab3114ff8b9d155b0355b7a2807c4971baabda9f6a2b217d5dea8f4a2d29b8af6d84ae3815e4f78777aa7daa64caceb2d3d6ed0c4e70a337a9bd563a65eb37acde831534fb37acce831a3c70cbdcde831fb7ae86d0e87c25ef4a11af07ae9697658a081a58ee4e98a22d316140a8011e6d84f619f332e2d0c51bc64960550e606b7ba5195bb911f7c0d233848ef93d1afeb8379e4aa23a9b781714da7ed51c005d233379426104c2252377f9355b2b5da81b504b6d1ca817e81ad40b8582e12e04c9bced64700f55c50e784b8e891cf5bfb3694895e352b834cb8b97124676f56352964fefa554dddeb2c2e7d2c3fa9550689bb42e3461e7c12420d924dcf07aed38699a5037f1c6229d45cef12c1baa74f5854f2e68078e3bc13581e08a0be8965b34dc86be33f1db669e7c1c18b13ce79c1f23c9ed918ddd607bc3d01a87bd4f7595ace0ea2a2f81ab676e55d53909aff8911fc461048bc42f5d3ee36d33620298f82035f31ce3717c6fafeab4b88d30840fe60afb11569f83f28a1e007c63461ea701809f05ee9946e0ce84a1982a76f5204d59ff43f6b3d7ecfd60365d367dfe4ac9af4625193e8904fe571aa04effc02a986e7dd5d64eac421dc523cf3e97f3eb56d20a949d0081840d8d04c59b21b163f5bd5620102a970e9898c11e2d03ba3adcc3d9dafa7c7bb82f0ea03009af8c97a157686ec6dfbabcc302b0aa3a05267c2bc99e861f5eaffab25ccde261d9626aeca158fecefb227b5fc257d7be083c227362d4790f0406448438de62d24e3bab5e776d90f5adcb78cbd2349a75f55e74345adf64d691f4c752d1ac24828bd427a9a7b23e38d02495bb6d9e308bc6459df11f9b6ccea7b8458d32d34707753a9ad618f8c55d47722df02a0a5db7c339772e3244c5284c951a4926b617fb625da45a55f5b0b4a0cc57ffbb9270453558350df31c36d80f0319837069e8b70f0db3e22d25b0f5e0d6d4ce20730ca2c833aaaa47186521d678c17987872039740b7dc32ff1107367572a3e6147072e47b2c1b3ccc11469124ddb4c0516d944cd7e276e7dc0cb70bbd4dacf580be8f032bb4759a4bb18328de658d414e48bdb723721ea3ff59a01936358dbf89fd1a71d46044520cccaf7cca036fde8970bf449339f4e5149cc52099d7ed2f5995a474a2fdbf13fbac3046a153f4ab8bc0a4993327ee88161b37086ed02e1a659f282a2df632be811b2c0a04e52f7b9617d5d73e81deafbc69ac2abe51b85e79d485d073854f809418f4b9756646c223ad9a0d2b1a581c7013f187b14094222d5143b6aa1f0cd863013c4ae51589e5d9eddb03c17b892d64872b39d38df012a637a84ccfedc7343bd53c7e8b8866b1b4659bdd5f751eda0fc0c8547d29c914eb69d66e937a6c7afed45022c2e276a1f4ec01b88d87f99778e7f86570790d9de0be251689163dcd03602050fc7ac0dd3198d52d94b09de2b76cf922d784b6235f799cad59c26dddaf77e78e0645a8b5adb331f6c0d712efabba3487797d7e3c35b87ca5c70fa5a0b0d28e423ebac834f60032c0f89bc352ef26b0941cf6bec5211f7524fb0f8aca84f7b7487f3532fbc96377602497790a7f72e7102b3dee6dffdee03e788c004e7fb3d626fc85c9a8006ab39134cbea5c2cb968a0f3bc7df88f5430d9d1d8c61434dbd4dbefc923dda7086416336a86f02a1e92a2849b794d7655a629c162af130ddd49c980022ab65e34a32062214eb361364300fb4e942c34e077f887af7511718bf7b100fc1abfa92141edacb505131922496f951195ccd54177d93d139b43fbe067d110003b7c7a0dd432d50145c4ad2b2f9ccc24ba358a14832946b858618120ad4d82da2f44101329024876d9f12bc172562e8b23587a780017befa7cb9bc4daa7433d3aa69851d20122a99908d10b8de2a18a812ef5410fdc6dadf3f0927724112c3d723253184c47a088a4c45b4b7e0050ac81a91b9dc81f052422ed40be17c4390f21bae824894e9fa64d45572ec9d4d82239eb25ab9081f56de23219fa49f43a129cc240d49c169d1b83160c0026a474a9319000343a2833866ac5494540358437bc2a9d05b331567dc7fc27fb51a4c0f8cd60a6a2cdf74d145ef46327842087f18e7510a3bb5e3ffa16d37885d77f10b7c1806330ed2b02525e4e86248fafd65056c0526c1606ed94c93cdebf51c7048fd05e983519a480774e53a5c93bb51c839b4cf89aa45da91010a7ad37077f4e274b7a236c1d506c4b42825e968d0f25626c51998d783c379377c44a4fa2c4c4ed833b524f3b193ad6fba0e68eaf7a95f82b82853d30eb1fd7a88471471a3350e8532ed385d1afb1f189c685e52aa8849537cd005373dabe5ecd5bc516f8187226db69ce2a191b72833778da2ea07cfaa9f5d84e288c49fae3401d1b7110ebe99a54df26cef989167a6f014d8664f23b8508919bdfd6b601b93a3a9af7d6b956b3f83d833517044dd8cfe0b3a27cb8a44c2d3a455fb24a53c535958cdc79208121d35f90889b51763f47bc3ae83501d11e8fbb0ab8bb83bd453de623277f5a9eb36ad23ecd4d6c3b500e488848e921031071d979cd02afcee5056459637b6187b968046f3aa71365e44ef9273cc9a6bf4de3c7fb29fe47ee4cc5e509dfa24bcfad6a4339aa980f26047a18dd20337da976cdd39a0063ab3772c78be7a8be9eeec6347128d7df5c996ca35173e5cc627b0d3e670b948c3eb7251305459fb8a9b0bd0889d59f932623304c49a3861743bb4283553194300f54a188691cef065e497293159a61639c850457314914db34dd4f0af256c744eb6138b918f7eca30f1e81acaff24763f06fcc73cb5eeeb6536a8558680f101ad8041fca948599659cc40bdf3f9ea7fb7bfdce8c0a170d65326746f64751a3e99def018b301f6319fbd2753972f0323ecef243858c40accc1ea56967f1dd63fb91479558808ba17cee57a9d8d027e5c7cfe391a999a7ce7e432a98d0a836f49ee3fc9894714f37ee2573b2b620e1260f36840ff1ab1ce09fcf8d5137dcf090b242413e9e2ccf50f752319690479eaf6f4b19d8a77937ba2d43401e012f18a4e0da00018dc4f382abb1102a2b927be5cbf20790b919a351186a97e1be665cdc40ec00aacabc6d58b0d8ba569ef576fc65f13e05752abd72bb19ba59ee6a3b8c92dc16773a238ebe4eacda758253fcae1f42e491ac7caf671477b7c1c4b8c156ccc4a702457e5eab400dd6e08ad2f90a9a56d6e104eab158ebe13456c7a8a0c279ac6fe6e2a6c4dc1cd2646d683a03dc473a2d9e062db818e22f356e9455257818cf5f955e3797f87785b6ad8cf56ce725510b6c598723d5e7a070397723624a373296c6be0843273457d5d247c567baa8ab3a06d6da10d0da8048074924339fabdb07577c337a378c25eda4c013efbae09cd16d872fe8c31ff4a66f1a19d5bd720df05dbe7cf0627959c5d9d2ee6ca25c9162b2206fe63ff0a916c58491afb17047c8a0d186dcf907235fab4d4ae566ad83084301e592e404237f3a98089834c508704d95dc51e2d474242439a073004a88d73c1700e10105b851573e607c149c32b6708e1480f6fa5f62e490e282bca9e3f7c2c7bb9f31081eb23d398ced1c65858fda3dab0041578e724b582fd306aa0a512006652b35bff018b106d2d8e4746ef2599599be81dec1f6796818d834b1d61065550a37ecfe98a7c546b625c0ba0b362eca4953127fa7c4160ff8405c871448007bad716a26c008a257237ba3517003b3470196a74683ce6b701b918352e03230d901ac5a23b86343ffc4e9608d1d65e708956185117e02d1b1f926f2e46b73f7a50407d93ebe84f8440276c91d70bdd4a008cff78fb2d4465e252ab4573dff0a4ed5bf4b4e6f087a89e03adcc57b55bf30be64039ebe9c6ade83102000b4bc67dfc602dd2e93516b65b6dbe1a8350a180f5187c251ebe14971d7b42ab05b809e193a2899e3347221c1308ca6d89723ff96d341a23f89c24597dd408b4230edef83d1339d2d8d362f276239520fb5ac57895204ac88b2f376ba05d7805de2ace9ae03728ae6ddb6126a260f3fef35add8b305190e66e8dbdc3cad9077a76becbd4354b83ae994e3e54ae53423c8c0458c04c20f18f5ee9088ce6c918388e5b33102708662056688a26c238facdaced8147569c3bb558a1abeeb8a1e410302a4ab8ace0f3cf3e742c48d3b1493d0b8c4b5745be684381ba4a6fca3469b515317abf81506596407ab50340f71b97c1d08c719195c520c31bdf10b1e3d272d19ae4245f8f6522e388ef3c99debe69ea976a220b08be355146f4012d0e5cf501eec4774a576904831d21b52cbc94beb2e35c78d548f0b1cd848392fc55dd5801467c7e225f590961a4a5c8d73394cc0c69f50d2d913ca159d3b83e98cb9618a938488a5135793afe36dac61ff93a2151e0d6ae321e7242fa0e6151ca074bfc377ded90758b012ba7a0c6cd319d033efeb359833f5158ca6820e99e2bf6c3532da96ab999080a58d2ec8c8a5a1ce849bfc8c11ceeb69364e37ea7a66de1654dc2680257dc972d85fe839412431b1ab2dd7f32b7fabecff91798d75ded7ac7712665cef00f156f4ba9430d29e3e5934a34f92cb59e29609cde2f1e56ec4e335dc212d00abadd6f736f16d13d36e915087c8b65f2d91425e0a977095fec06f18984690a46e93fa1c2b3b92cb6b743a433568ae94a78b20d77fbfb28b6f47b09b1ad57c45af9fc92cf4ebf2e982035a4799f3456ac1e47f790af3b9361d5050b7d050b6f34a534244bb3821a761d9d593640f7e8defbb06f2ea8cbca4049ac2bfcbb62fa7f15266070552231186d3d215858668b79e5cecdd998898525b40bfa97b48b2963170397f55f7db39bbc8cd91fb56e755702b7f1c9f73ef36111a3b6b58c44375dd3e41386c8b5d7377983a0b53595d3192884f142912a38e34abe567aa10459492f4da1e14bed288e013dd1c94663b4bf49d2096671f2070909a7c3992a2af1b612d2a45d4a016089e0c7b07ea20ef9e209dde51b22f14330d62a56f178c1f9d660299785a5942d4134ec98b3f19e350029d32e39232cfb3e4a3acaec243938458884a262619f14a84617c7c6d4e0a1f0e8c22d1b65eff14cf6c72264ccd377b63e56c061b191eb8c12a8bea403a6ea74fa3db8846886182ebb36ed2c0e2583232f370483e8268e55dd648b9c92abb6c0290aa68cc5bf7289caec68f9ca8b2aa5f56fe8d40daeb3e824d3b48283f9b9e898cbf8ab44b024980e26e307c9799283e29d2b239aedb98b8b2e9a79b97c129a3bf2438f7a6d00045967ec573e9091611de723ebe72952c066aacb0972239e6b2b4703c4811fa57e726682e5103fbc609f37ff042f675a29d723746d054359c5ab0cd5cfe0eccf01e713e6884522d9089d31b3308957fec8b393d3e871e0b9af81158e13069a5d7b87e0a4954bdca1dc2fbfdcb46b90b828832235d87e5c1caac76f6d972599f2d4c94ca08e5f88619a6c0c71d057274dd63d0eea150e43b9323c90463576fbd6861bb35d286003a493741987b91c68868fe2f84a4e9569862df2bb0fc7e314ef685c3e4a233bde75f4199e89bf0bc2df77976d247e890f524deb58edec8fa6bf22acad27bce53017476f065004847a1551b209c730aecc618c88205767cdb8a74e9bc3f6769e651dc61555aeacc2d52c51530e82a3e5dab3ae035fcfa7e403a1ea33eb8d81857a14ab5dc119906751413126a556aa691de92fc073ff169db5ef28056323b8c7a6da27f5cbc40d17ef71949324a10039ead10fd3fb14f263e31196598925b3c2b9692bf3e25a6d60f35fccfed783e89feee8334d443c346f445a7b8ec4c9e2f3832029bfd4145bb1698bb70ef32b043ee71a1daf39b0242fb9d1d12e391d85803201f0d022cf21f85779a6225f3f7e50ad565d84f6a677f704e8780a94a78982f8bcbe88883a220aa37b5f0322827abd2689ada76b480e26e5ac45ab757e561a33c1b9ee4e0ae4f8c506fc47ec4a1862a0cb8c446ad822e9b6be05759a25011234897954ba95094083d59b7bfc9f3e0263f7d8331ea6cf519849c8a2e1d036e3c211532448f5b49fe56b81089acd727aa44a4456b190f2f8fb30ece9d534cdff61163f7ba545126f22c3c6ab9b0478554a55c48d3d2b444386ade28a6f83068ceaf23a97aa9dd88a39cca55208475b0d3ae5078da0e783bb283616792c56a326b6813cba889762e485e111fb9d6291d8b35c1bf1f6ca01f84d1630614140c4991c15f9922bdbdfad621f759114dac38475578b7ae20b36c63231a0d7bbea47c28d5620db82380c9f562eaf0ecc08ea1419415e75f6bf79c3c7ee42abd2c02934415ec43204c056a9b64f286ca4a899813a138c7db34ee45c062c795cb36458efed1ce860ab676a0b3876807cc2c852559b38b296d5d03d7e8603a7a9ee4141943ffa4f0f91070a9e081fbdd3211161096bc89bd87d2dc0ad210e428122b57d496214f2a529b256e273bb00792405994327c0af71d73b22190cfcd072b38fbca3dd4da737bde5b4f49b6c6aee37f911178423d0b91f7f0e065618b21dab5f6ef87a19c44bdc4e4a423430741f932a417a52e3c7f1415c88c8d83ce9eb510b44a45d662418027d4613de6ff041f9b77a4016c55d52b757efb75f2834a627511d35e796ccba1a212b9be5f46386b4bb9869763851085539d054faf608f00aeb60a64af5e90d4d36c5af9a592e51aaedb34b3246356bd24a254c12337bc6436e7e2d4f8e28281a7514959e93132617a2a2b59d2de99426303870d5108bb4ed782dc6e68be83390a65c892576254dd1eb563c5b156b245f22e6fc96b68bf1767def69b733185b1ab49f875b2caae471c7910659770f8e0b4948fd7f7e9462034b37e0c015818eb0669655727e769157ce312bd0b7cc9886eb15bb9d63e15270bab8679aea500842c7115d5d6733cebd9ad6a42fec093a6db076130abbc5d8a1a35b17a85d060fbbea545a0a9a2f60b94e9094cc6bcce98966a49d51c866f88c3e04a35015844c2c26ee3ed7b77bfb5dc4cf0ac5d1a09b6ef4c3d965b64c32cbc1f7098be51abac66f9b9c542175b8f62a88ed53daeb69f8e1e4ae4e2ad77bff16264ab17b5b8111e43b576cb4a3fbf6b3e1c4bd32ce27e8135bc2cec2df6a390f7aa072865956d290f00d29f902d1b5caea9533e95ac3ba46a7053b9a0ccb167791e2d12d7702c32fe2c84da1109f83d1d5d402bd86bf3ccc62dff530fd4914f8ef888292dfd7aaa66ac513943d1c9996406a4aa46ebd74e248a665454f4fcc0467543dc02bd36646b46e953367fc3924769155f6a8803aa585f5558068e88343d99d5af0e7b5d54a08acab6af7e7881bd66e4be7d16818a9276eb52e5b5b2962e2b9854443c83dcd90e92bc473055187d69a3b34ce436c570ac9365703d65b507a7fdac0be144cb8602ef751a1b1d1f1179386c1dc13b913359e72c43b9e90bfe85564f58ebf7d338d56ed65b1f6f3f7c018ae40b23b294423267ae88ea69983bd1d50af6a24a6ba8d28057d479d0d7972d567f61d737d618d6850c768cc252ab4cc7f7f213597fc2fcf28bf01a5428487dc4c212c6aabb2c5dcbebcc2ca961671b01572c3d4a519dd91500eec411966a1e517fd45ad41ae96d269393abcedc893b426c93c5f326d03b6a1d3912d2babea29723f989f4481ac2fe7ac12562ed9880ee05d097530fb81fd2afbe9f002ebaa86152a9971f01bdcb0283ef41262257b94265974b5e4125dbc6600e8ba5e42a16f8639aee74de2fd0c243aebb7a584b315e28aab5d9f2031d2d4ce0b3132505ed2dcad84eef5c48451a11783ee95b5adfea3af90387685a29aacbf9fc872c8cc895bdbe90de15a2ca111dbd368c5850e3d4410f731c4708d314cdea0777d1d43b1fa13b14e2b27ea559da1b21c1dc0c42cd16191ff9ba9653507175afaa1ba8b6e2778f32414638bae10819be0a1e5231c3e09f3e9a4a3608cfc7c3e43d45d10a59689e768b6506e4f98833ad136bdc99f18554563b969961aa1bce34f02846318898d65531b7f3d6942a88c579c0513f024a1366c8b63183b32374c12789c33374a2d5774ee77e7f2d603f6c71e0011cc01a8efa21b7be9f2d1d32efd8e0c53a712c803806af37cbfbc17f11cf114d14828ea37cf23949d34b007aafbac098c2d4c0ee8b1d7993e5d098184b333df4df9d023c322cef19056162f75d6477b66a8e202519e20407dee7fd8d10cc65f2272b5cb2efb9983d6c82c27d0cf9d31e1ca77619a18d3e77810ebfab2c9ffffe310e998ff37413c447c1e65479c3c17ccd6ef9b68365d69ac642668dfd75b2d1a7fcd59dbc4c7cc3fdd9a4df0f775b93eb30360cb46707d348185fb1a1a1264c6f061c7619e71ab35fde183e6d4b3b291dcd0afe49e4ba98f4f66de8e5fded63fdefbd3458abe2a885a24af427e011c0437fc0c3d139de6dd7f9d7c3a7d522ea53fa9134f5006944b345342186a59daffbacaf80754f93ddd3e0a3feb4e40aeda44296e510908214f71a03c0a5f042b76e98b351e5912f4f504d9e52a02a9d99ca76a82b04b3ca9c82ef14cf55691ce3171d4cb2fa5e23d5256328308f46168d72ed74545eec14cd74787d1569bb550481dcdb14cd1e13a6f6b429e8ec699d50c020e07b84d574a12d0f15a263bba987217e8d6ea2494fb3410008a0aed156b060551706b4374acc8c5cde4466c98ac86d1aa4e86ff779587118df2e0d276a5bc124f790e29432b8187ef5f213ed43e2a03f6a4c257c89b0a5d074e7ee15a282cd2cd2ffc8e8f672d3fbc0ac4f70f2908d13d28f8e9e23758bafbabc37a927e8ad6263edbbf95fc79e727544f24e90f0751e9c041b6149f68ff0a9f534a379d17ec51a63703876631c9127cfcab4080189fc083e0fbfe1c143c5f9b31891b8b99b3ac9c0b0206e76577aa387583bf13833e01cdcc621dfcfcfd7c5520a1759039d144c04913d56fcbd27005c3c4b458ba0ff6044e83197c31d93ed41a8afb80cdf59d64c6f551f94e54e646e6a59e2815b7e95d33f692dacc1d5af2cd322e2120592fe24a11405617754b0a20eb8a040535ffffadf590cafc89bd4b9e89dd84c37eb24ee7589426c66f43434791d8f30cf2e0c461d8fd6ffcf791952a7a9512d7091bf7797e85050ee87ddaa9c7a2817b0fd5411b3bbd6646cf3bc5627a0b744603c57e37c9adf486f2176e15f4922bc87033543da38a859126329b83162ebdac52296a173fb8c4fa6eed64e73302afc8d8655f8d2dc007a85532e6c8f64ed782bd20a762ff2b15164839eb4a8a9c0b1a880ab2d76474a07a16e47a037ffc7c2c4474cb4392b0a008ea02f175477c92a9143ce1cd5e3dab4a998c1f47814a978b1d78fe0d3fc5634abb61e390e547c605af54f29b132134d11aca02e6bc1ef45ab8601347dd9806e75b42758d267a45b7c65135a7dbb2e97633685284829c245c69a5ca6fd1cbe0c4ecd91e081cfcb64c1cf141ca190aeac67f82665c9d0368b0a6e627492d446be2a6ee729bd3412675a33a6d3e5150773c728e5335152c575c1a5c9ece0e3e3af653858057c641a08086a375f0ffa2ce8b7ab1c615cd26a3dc3acd88e0a8d0b788706b685f96249a0f745012eeb371ff9902c3fa9432d2c52a8a545a57772ab4f68ab51c096bfab9d24d2fa778cf178a14d8270f97bce776b1ac39ef924ea31cd54da9ed9504952a2297cc1733920e74f0e440cf62e2a42a5f19b2a42d38d6a1ea71122dba0d2a7fdc15e20a6953ff07dad51bf8a7b9d603fa09690ce81446b3f1abc76a3bbbecb46d80d4f55dcc7c0ae40fe57e4c90611a4dfc3d3259d2d80529b2bf7b81251c0b08506f956171b17b1a2fb794d001aba0b83eb0c5feca019d8be88fe9fe9dfd9c68d415440054f096234521a93e4ec263bf61cc33e99a004bef2f0b494c63c35d7c439ee6103947a4e9ddfbad7722b995df1e672a91f458a43345d245de330a124245ba4b243462309f005ee880f32c562fd2a2ec13cffb21c1b492c24e0a10f5813c00f729fc6a44f44c0d407179b433d25dd40d207c85299c8de5112126645545e34a895015b0e8e5945bbeb724dd97801c32962e9ed459351b16155147014fae1138a802873e10d37894dbf9f97f6f1524386987bc2742b831261c302c9bcc7e98c1b15e6ff3126ab4775924c0f7c624c37092eb3ad0a458e29396661813fd841f40d3554d2510fade0195365249132f83ee8fe9458928e14b17f4c3d13cb774dc894abe1a31f03d78f619b6aaeeb09e4f13463e16e1a72c34500c31e405f3f2e7716ad46a44b238773542c4a173aed0207dff0b9a1244e40e97b9b883b2884b2f36c4956426ae6dbe14eb58dbde21b680cb631571c00fce45904639db555e0059747143c5419c6de57e46c736df1724ddd9976d08f4f9738b15cc825b278ec7298a281edebd1e7143e41b6b4861c00b95f6d5526c730ccde5e308d586d35e93713e6ca3b832d1d40f8c207d325086db4c838e33e1ef7d64d166d9c40a8fcb8b54662b467c3d53eb9fdce1a56f2500dbba3cab70360cea33d35a06e15d409435568b317a074dcf3abf9c09bd6aeb7828bd6e0c98c6390a8492a1345819c7b7292d280a08d1b0d380522f220e01f0d934a7041cba13f80044a531a1ffcbccec20eec9410bdd799d82e02fad0fea1b79d158dcce658f426872709f28d4e9cca4e4e62c91b9ea3fb04b3112f3b94cb32573bd86b07ceb44831ff3e63c23a132f50b897941dfdea5a050226e0346c74e6dec3ca670d95787dfab932bee4b81e0fd5025cb62d2ffe30c1889a5e193a39b1f41f613b31d87a0a17f5535bfd0e2bf9c9a07ddca761452cd7e99640ae26c029f4ca77b63c0a9ebeeb5123d5f38394432925db2733b8f0f90ca1195e43f4745db1214668495ae6eb3bf763ab1353f3079ea7c23a99314682aee642ac8bc462ae9a067c9bed12f451eaa02c787a5e62400b9543608941a8ddfc6afd988ff3f73fc7197f02420186208b028ef66e29f037eada4099f64451f66ad7c2b7f31fdd607c06f2aa212f5b1f4f1b67f45aa6d38d678d6a1b3d3db58ef83e4b213119679888a4273170be3efb4e6e456ebee2913e05d1e1bdf3aefadd0262d041d8def1bd52cd665172775f4069beaa9f992a969079f4dc6070fdfd43822968a4089235564f028ce69dffd5386b19a8b72668fc853c9bb3d640e330cf4c0ececdcff447b37938fdb22931999197058e82d54914ef3fc20fae27a95a51179bd483639a0d11c82997dcb04946bde680c1d71c6aeb1bb1c081434893bee0aafa0d2489cb16fdd4625b886e8f72a1799d4c84ec13558bfa32c88286a8a77ec9a2e658042a9c1b863f6fa6f4a13c923f09bd442a5b4918a7be40469799694cf9f2f232ec83d7310805b57c0f8824c41b1c737d6bfc9d7c32bb776cbb272cd2674475326458e09a17d9b755125d8cc3106653bf22a06674f7fe9868956370e6561761e07510626249d5f48d3242ca2adbc750545f18e545ace6acf1cb6dea2196101ba006b6c69d33f24938e66db12c156886e0b23729efe1c37fd291cbf8c1e31963fe10eb0cf244503c005315c88a0c940e92e6410a7c0299cd359d6f26949cc780ae1655036f580fbde64300777ae257db9cc0742104005075f56510aea80c04706bfffef1e9dc795025a482b2dbd8f585b048a1e7db7311678e6ad988d2ec13beaa233075f335e020e12f84cea6672a9be82170ef04bc2d46740ce199654845d517ef164e763f260a6bd201d40c1b4d94048f02be9c9e5ef62f82780da73aba57c122f0c829ce6bb97c58787150b8df29710c3be227a00c44e3e3e2ac82691d6f9084470616479c5f77769fd9005fe109f519f2356adce391b31691c74c89c70c87fda1804d5718749f0f48a7831a7957ca9233af84679ac156258ba1000a94f652abd453bba8fe6695c3cffc91405817cce351e3a3992285279623a52c99b414b244074dd4468ee4aa8764176edd957d2f5f148011d0dfcfe0595cd43aa136985cf2352c35c7f10587da8ff413aa6d9b2ee157a58ea1ea892cef577429145cf0c1ec6df5ef169c136aa55ae0a99e522b116bd7baa4571a36f37a86258b9cab11b47437d42d84178506ad29302371cc6a5f46d4ba143e6b78eff1038c39b12a5f4e2e9602d4e41e7a43bc2d6cc37828e88669515a81f5e33956dabfdb562d4060a75c864881f895e4a563f082728f92eb474c6224c35b07eb5b6f08a8c6fd5dd64ec819010ec93b0019977f6b48f558c6955170f7deff41738a50b9876704bb6546a78a28175a74bc7fc9ba9659a2b7bf2eb2442b6dcd9da4184041b5071934c463df2d6ebfa1fb1a15f35cdddefd3c0860115a56b7f58f79351c906fe7816de7491d66bb3e8a7fbc2900d7cc1bd721a630a844b02dcb86058acd1d2585159a3391a7d4edd0fbbb1371c5da5f7261ef86a6e54f87377363b30ffcb1b91033bc828786789e42dc0d5952d02a3202c69f4198441c7208d9807cc3d18ad862d0b9d2c6f2d52dee51966b03b0f01b418dfdedc6bb95e470fccac99b740fff3fd5385576c854df68a812107645e975ed4ba36fdc3311568797729a24d8447dc3e8aff6cb9214e6093006cbec0250c093d3da982d3f3db8234f359d398fc6666967f85b39b7278433cb178afbecdb0a5398cb5cbb8994ddcb7ee798a5938de50a56ad8d3afdaaca54e8c2332b6631166733ce4047d6904b5df1bb467759a16614f53a8c45068a0a82ae4a8cf333d3b6c0522d413f90cf994e6b13949f8d39e118fc30ea69ff30bece948b6d3b0168c3cd3be887c568112f18abf9111bda5c400364ce41720a40296e80678d912ace6478f21c10cbf701b6bcd412ec9b8d9c5445e243064986061d9b244554064f8a33778efdd5ef8a6f7724e7af15adab3a621dde0dddf9b3ab032f246cde5cbc061d86c23dab88d66513ecda7ec94869523356c2c918c7398a67e38051f2138cda5708ec36ffa5b94314d5200871edbda492a2b3dfd8c05dc48d58fef172a1e9a5580349984d2011422bb34e7357b799956bc8d93c6b4f9ee949136cd22cb53ffe661361b752df80d944a15035f5400c7ac9fee81b68ea5b70686ab3a72e916d5e6d7076ec905f9b435d2fea824d0df4c44ccfc61792d0fb4c259f5e955a62a26a65b4df1ccc0b255256d3da3390b4776248cd976411d245275738c51830ce705dd6c937eb66f320d7d1c85118efcd885a3477e64b52c01e0ccc73d1a9d9ee2e930cd368481ef0f9ce3ca8864856a06dc499ba2f016c96844232002ea2db6a4c31209e1ceb845ecb1fa838fd364de87270dc057b4618ad3722a7f5ae8aa703b7f3994078ba6a8a4cd56192a1e79fa8fd507fb822ef58a0bec958a0a613a240a712c7a0fd54de642fe92f0bf9b4bdb256f40d84e49e25f04439687a1c230f55e685d0490b19b4bf538ee4af32c04a1d1d1de81ae5ac5dd26286a445ff47a087ea420e89ffbddd31b85992b0e77e32d74458d31593981148253cfc330c8b792d12bc78ee2d138604ab43cee7ba6dea36fa80f70e8fe5517e92fddc44e21a26405cd3e8c7ff20a1f0634e2e82c8fa82aaf19c4f0df85bc86c69e492bc697827298cb310ae9a153e164907f81bbcf1fd10e6c7b18d23ef3e068b0ca5d448b5ee1ac98b3a1a0000865cf01ad66c812c067b727c809047658899e18ad6520be4cd9d98621f68a04a9418667bd8bd87c8d330a07a6bcf22841b5fdf2cb13a5af968b2b4c25867e34a2605b41b6da99178b86a5a5a706ce9f9186943316f04eb8b54ce3b048e6232b483db2e615a76079e3221046fbcce5cd47a8b1f22b658df91323684b5fd96656eb9438fe69d0f0ab15f7eada7f912cb591a85cd46b0580c5716381fb9a7b392d76c5411e05fdf8e8687ec28542d08f99624b44dc7c8de68ea51db2978addafd3aab988664f5c0ccdec0c57189beccacd56ad87ff3ed750a59a8548081685217741e4454928a3a6f88f6e8d309cfcb6643816b99a1f4cd71a4203f5546a9b8c5e0c3184c9922513a4ae62b7892a9febd425b65f831c2dd11c0dcdad8add340a2b16e2ee241d61141430b951047878ad4d1fc97bd9633744c64c3932f4227f2cab0310548bbbf909b87701aaf4a4f7f073c0ae501d051a6f1743a864ceb503f1955c68f14571719cbc9a1a5df223e8f18b0c2aeb0a7ed3886e89bef947cb461fd3d8a60f0128b7fb23ab7d06eb9dde4f14cc5c2856f5e8dfb03660863c8796f5e4dbdad12c92c4807bcc0085a026d7a737b51217abda524b206f9826d9a048aef3661f50d096a322c4e6cda480dd1ee52ea3f6a422b550052bf5b38e12417f005604df8200a18ea221992810295c8e868c8a1180ab39b99356052050bb3e3da9912cf62245e1405798416603a797b9e64b1f6a3b6a1f3c012bea14c33c14c9de21f0db3577890db35ddf9951b35a98dce01576304a61ce0598d1d8354e9cbeee3052d7ab1b12dbf36fd2979d14a5486cd4e0632fdcdc262fd2e4e143208d2bc139e4904b4b5142155552b16637bc9b9e727a9d5e1609fcbb7c834d09af01dd3c72a8698688343341fc28f4de9e77e0c1eccfa82cf4095a3cd504c367af9d7f23e9ddbc42c646f1595534a1fed37bd8bdbe200083fab4d3c0c59484bb6df5065f66a4f2dc82cf771626096599a9c83af8f8dc553a7af4f9a4ac71215c0944296f2d0da8bd75dd5f6922b53320e217cddb22b1e3581d075cbceaece5a23511cf9729ecc49aa6dc14db75cc9088404f5a949752a46df7e1814ec0ddcac261f84df76159c66912316aa24c4a9d12dffbb3ae69d700975210cf3102ad8d33b2130886c104df8e885e18257c64f44c4d31100d2b123bf1ea95999389d2e72f72f2b9400c632610367b08f8ae2c97dc9f7000ae3a8b4962791da09ce371dd6103c5523935d9db9fee6b0330fb135c9227423dde2d950850717ca67d2d8579a2942adee5d6665b483a6f19a78cfd10270508909a2e318d6af860e9ad9465cacd82c57ab396648efe6c06caca38f6a8b22c7e1b1a35a8464a78d35159b78ab8513077d2f4f89d62d692cd87fdd0d29f38fdbb8324bc3274f98977113162fcd522d2618798b2a7f1cf691604a1b8801dfa730808e975fcc90485505112c601ecab035ed95a44fff83144b7030a33cfa35110382c291d3d54d9ce12a6a23b6afa87c752eba0cde3a6a6962875fb9b5a375535d9a9ee7382e3b9178e474f7259604d3be3f37beeceb82bd378fc3ac346be15bbdd8cb359b209d932edbdf7de52a624032d0ad90ac709b18718197e5c4dd08a48ac7e5a24bd2bcb02cf67dec3c76730bc56c3a3e99f6fb59fc1200ee438b072f61a48b3d904d066cd71def9a669524a29a594daac50b4d7c050ca779d7f40407c9d7746997326641950611610bba863de51924c30a88b020589e69c1f89df793f7b310e615ff7149c9953a7ed18872473b0073679f8a861b3b70fc85d449db36799ac50b4cf406de3886ddf48dd091df8cdb2ab9b14eaeae40fb8a53cb7d1b0e533488b85a66331c846a1e911fc64e4581fbba6e6610bdb343082340eadfb1c588cc1c20b172f5cbcac091307282e6d160eb224243d85a62ffcbeeffbb68ede376e9a8d3768a2f8f9c3157abe078fa997eef113923b86834c5fdf332a4cf9c21d03543f29247d4b01cf17f278c983254b9649579c218a578c79e9736367973c32654ac79d60ca0e30b06b8f8e360e7172c4ae9d9e1d755c05815df207bb2483442a54f1858e61e0501c921be843663ee290f414ac704c4e303af668391f46a7cd55c40a382f5d04124a686fc105762de61ae8820b2ce402bba4831cc8f2491984bac4381264100fec40097011058b486e5b2106a7c5a236212e3b1bcf2c7a5a81a4c733d2230e496fd264723e1d85e9da9a991e3d13a68bd9a494eee3c7a41886f9acdb06ba56a8f2651ebaa4f4946c8cd3230ec9cdc7a453c598afc24b90585405d36a2391f851e9c8b54a59bee95ad22afdf8e103ab3f263338b7134ec0a66b4f60d766d864e70de9f7c9c52ee9a16bc61e729edd67029be7efe3ec1b878849da8a5a47ab4261e963573d3912410410445815e97c82ec70666fae2870c00521428884508dc5f28d83ec7016cb9ba5390a583e966f4c5860131f3e7e7e7ebc07bb7cfc3837d9198c580927b06b7deaa4ecf2719742d2811ccbc79ec9fd1f312ddf517fb050cb49ab728085a4af3bd272805d92c116983e222924fdabab1a8230151285312adad976ce03fd463812d88a885278faa48744cf1b131dfde949ca27a79772a6b0c6170ad1187405e15cba0f76495fe20303c9f8844ac442d289240925843e5efaac21ade293dbe745b5d102390fd50238ab7eba469a6b1e1ec9cca54723f97948b017626e609b3b1f02b5916a137e6c981e836293f498f7701a83ad6a78a72d992fd31be9fc63209d639a6fd873669aaf77643af5d6c69ee6ad9e59e6c9229cf56cf5f065debd20df6882119c5d07729fb7a623b3e03c614e2f443763249d04122c8100cef8e8b4a58a95e1c33e3a6d71f3ebea08e70c998f505ae0f98f5070c67c848233e5430ae7cb731fa1e06cf905370067498532be75da851651f423941671a0d660795e9e4fb841a26ed069da02836a6a0a4292b14b2ed154869bb87c6cd2d2a4e44c70989c3edccd474a6e1c37ad8f504f9c717ec2cb135b3e423d91f433d5434ac5f93e42a981e2d7b7b5414dd3472835653e6c7d641af33b3e42a9c9f2db03cbb04c0dd287112a4d969ffa100652b2e6c41863a6d1b8fb264d1ba83465b2283c4adac640c0aeeb3cc6b8d5e098949d945de7b30903d1bc7326364c973d5e769d6ab5f28060d1bbc5306f22eafd23141352df926a55ce0eebe4ecee0683a81bb5b35329dfd570cb36d6c9aeceb92ae5b77a24b35a4462441b958e4b3f201e989c12939bc496a3569398bb3c3a77e3c7e55927ad941fc3beab733ed61dd6ddeef42cd3344dcade994646c30f88c7ac733b58ef88bd144ceecfc9d84bf0db5686515252b221696d505aa51f98484949d1896242476a0bf69b13fa430b2db010e7b0d0420b5c4cecc7fe600f883c60fef163c2e124206ee22656c34c9cc46ab8899bd02c2d53c68435816168b689658a980f4e5ce4f9b0c747272de4387181e7d95d70640c3cc038c41e87d83735beb0c7ef165f7c2165f985f3c51712d287f1a904125aec52e38b1bc123f137161121fee6d8d648243efb00e2901b3ec2b182020d5fb8853d1e7320c79c82d49b50ead499504aa53e8c6e9994a6699ee7f991f81e18a47223cfa57b2e5d456b57b71aaaaa5727bb689775f5483eb7d530c2c1ca74fcd19401dd294cf9a201e040adb9b3c6698d124c4a4c5ba0d67c7942cf1370a441628ac1339df9703f32b5f1e1f6cf64077b09c514f5118aa94e1a2e6976d85a845d22380a367c617c622212f6ccb7c317027dd4e23f09b6d8c514882f04d2d3abce2905690e1fa5e00624a953b047d217f608e31390cba31f7dea93e953ead333428178b4a4c81d3b5a985782945d4ac1d8254951d1e79caa7efc88ca7f5ccad31a4a89433e43ac23abcfa3475d73560d375a833e10c9caa7af38ead9fe7a4868c6791109ca6d8b93b6964bc209fd2a2545278a099d959272e345893367a2be576078249769d16c13cbb44c6b5acf7d500423d419a78f5067e27c2b0173cea9c337cfa823159f4478b3a78d8a0ad5146cdc75829c366cdc1506184e6813a9a830c0c0304c0a738a61d8d3761e1df3f143c9e6f388e6b1db5a5c15418299c4c2c81335e75c33e7dc68af5a5b7d346197d41b483c7d08443f2498a2887e4c1702c403888839f3d6fc6411516238e1e1e3071d748e88a2ec1f6fe1d1fce8444ac015c2aee8c475409d613aa20c9d617ece39e79c330c9144830b94993bad337e429991fa39897ec8f08542bc07108fb8a540e5dbb8d104f6f55674c6d874ec01c37a9442118a0c17ae80f409c2b07117ccb7f2daa7cf5f695c4717210ed96c732206b2f2e8f9ca35cfc8eadbd5ae360e1c6fe59eab3cf38ca856ad6a55922ec22e26ed791ba11e47390a0af9c1b573dee091ec38cdb5b9f48c6c1c385f6be95ab6daac05ecdb23853abed0f5aec99e916e23e408b1f3d30827333e04e1a7d46394824124c4a77e243e05833c370257787d4148a8bbe735dc4e10d2d7bc1ad9d54e375931efaa94e7ea91fc0d738dc9745aa39fa2b8221c6416316120f17fc4ed2cf3f1314a297d69d5a4a67dcff7adc6e7b19e91f6d8ed5b67cfd8267c4e9d3d239452efba790947128967647359e7b6377d33a5ecc012be639a75a01895cb202af0070bb11791323efd0f37df8fe7cd73a6ce9cb7875b771ef8835d14047645cc29280251cbc79624c32618b5c54a8534be4d014bcf7916c7cbd78f502ed0f32eb8c3851c2f9c30ac0ca8173861679ed31c7331102830bc0a416831fa7e0c8f24a639e640aed56dd36ae889e97c862b884a3c241cb8b9e61d9790f95aeb699e0a23384107aec04c067ec07119c8812d766915a849c3649c33cead18b821654b44afc72d4e7093b22c583ea123439d190375c64b1c5b98be8c79fa62074c929ca4707ec9d3e9b9f3d1b931bc3833e85378f309c1f403f80825c4d36b92c7b36b60644f8974f618bd24d2c56c2bd070c408fcd499c91c5fb8fdb6641e71c846d1f4a79179c6373fbeece87929a5cb1566f8a6c7a8979b4bb952ded012d08a36df0c93425bd58abaa5cb07089f56b4814cf47cd335e9a1f7b0f34d30dc582b8abec9e82b7b20e24584d3cf8d1ad9d805cec9ae237387ee2518b703f62563600b2485315f38dde92314982d1f6e4a288f38643f0b3c3dba4c0122cfb3b7e212e12fdb20310e59ecb3faf9ac107360e5c330df2e4e5d98661c9a990aa8953445aed0f48e3a8f870a028e2a2a88a7acf61801ec4159663f4347de90fe06d3843c1dfd75c3180af5ec40777ece6cc53d8dd52845d04d7d1f5f39dcf051a08fad8ff195c314d6c79715a9232c4e58dec868263ebd96e6bc96baf8c5e28baf25367abc3b31eeae8c4861b030edeeaecce2852589179632df62d7bcb2b9716a00083e9e3ebe969280ba3a5aaf1ccacc570e4b2f2b6fbc10101a1087bc96cebc0f06e23fe636256cb578f4e0f2216d7d38993ee4f1e17c2d7979e510e7432249e775e5cdebca1c20f98a618b967199a6f9b67d72398ee334e7bcc581234837c2b275ec5fd3a4672493124b92a6638f703a8519f39ab7c645d3344dd362d05c6097e624bcd1344dd3b8cc63e621f693a90c4f3190709e79cd359f671808e79a4f347c4773c6c340f8b533413c0fbb34b9539b8785348f532c012f5f283df390efd0c6e8f621f6f1a3cfce329ffc1d3dcd5308f385f4b527e99b67f5c89dd2988ed881f6f3f3e14e2deb89439ac3f14d0ff94e06a270c4b739691e12e998568681480c5c3245d8d1acca05194f1c8ae30b778a91d8a53956790abb342f22398d93360f07613c2ca4b9e63bc5406a88442495d881e61a0df98e26a7c421cdefbcf14d305cbef35ae4384076ce6bd3f70905335f36bb305e54b27cb8bda828c9181e4dae89ba8f1e7a8c43e1f4cd7f08e9e16a71cc41488c42cca387d3e311f62c033129c180a2a3098a0e25cc330ed2fb5df804fbbabacf423e8338e79e1ccd168e2657e18568090f7a96f49c818a43e9c763b94fb3aacab9faadb3f44c79966f80678ea887ca23e7034328dfbf10f4ed9f679e121f6781212b88821090f2cdfafc7396732c57d5907af415abb258cef97495fb38ab864f9ee5996702170401294ffd033ff72181945f812510c05330a8dd88824fdec77d3ca42c9f1afab80fc8028d3c5f81461b38eb68fa80479303c3a3c9627ddfcfcfcfe72c6fd6cfcf8f8fb3e88f8fb37e7e7ce8cfc7fdb0582c168bb584071fdff7f1eff3f5efabeda3e7cefbf808a5c7e97b3d13b6bd7daa6a7d9b03ce6fde9f470ec2c383fcfb7ce53c6a64964766b1bc886455cfbf1a1e4deae3e3e3e33e55b51e04a4f8f8f8fcf857a9b3aaf44888ff39fd9cfae7d457fe03c3b3bc88f4a9fc2c1f12e207f9b80fb8c2eb73d0f3a3d9e3c984a2edd9b307cf1f49d51468669c579595d7a1e7a77b345aafe3ce875f1d52df0ab78f1bf5ea98f32d76a5e9254b0c64dbddf51f67192ee8235991c562adfbfcd4f0c90af40137f04786797225a7fbf8f06a5bad563edb6a864f7ca4cface37e346d5bcfdbc2275a33338be59f8f872cf77c556b6cfd78387dbc35dfc7270359f90fc872cf49ebd9b7276fe4b94a057a747215a8f2f01e2e1f44ec92e2c31d13b4c54030ec7f0b82e4f90c5e445d7af7e6bb65ce99779c71e75445330d46d9765acd64ced1a715c94cf64d397ae694b3f4734a4ca57911ce3c231dd771200f764df70d1c017b0dec1187a6afaf30e5c33c046ab18b7eecc2269c9ede737ac8636a98b66d1cc0d8c949d334ac72407b0d6c81cd3725b7208488c8e5728f8a6292e7c3306ceff0988c35d1b1c746f493721097149ad8f3f08e64bf094d9f18066271b52902bb36b0880e5f368d1461d774169a727cdacc66b6fdc6373fd73096afb55d7c8b4ee5f3409723b013b8eba16bc6f785304ccd3338c61aa21b77dc9003e5061400f808e5469839e7dcb82c5996719d1b4878e2b66d5db711d5c69baeebbaa66d34b581266e4148b687b27b56f05b171b17aa8d30506d0001d5060edf9ac37ae292a03f4ca980c6d7fa80b68ffefc80beedcb8881e79b2595cd8e6bf97c91259bdbfd40356573bb969b6c02ed8052ca00ea8e065061805e6f36f862eae3e0a587067d3167290fa838dc960180cb47a000a011c00b89bed3ac46a82fca7ce43ecf885ca93c3a55dd7119b769d95461de32c3a69c2accb3a83c514ddf1ba7e4c554714e8f9e8541b39332688249883e48fa0c926012c979be98c55834b7c88ac86d9baf96aff3dd4561862f6c4921b9ed6e4bd337072479113b8039ef5de255819dfa04d8a9368994a0ba98e22ea63c73b303d62357141784e183c872f4b68161679aafd0f4c4c598f72617505c20bd6b3ef38c8025c17cf3173e20e583309fce350863300873f9d3b5e841189844fe0489e4988ebe176812df4c21c44b43a4844b23e39b104058972fdbb2bd61c5690b9a37aa3069720138a4621c14dc7c719ebd156e3d22d00fa90f81de98fad0913e7465f99028cc8742d07c189ddc7c189fe088f3619c78ead835384a6e31a3c096c8c2682b2d1b1b3570948eaedb685a06ed2f3c2f0b151ea7151e253e3c61587876f0c163c38f9e961a3ba2325071a1c114406a363882030a2648cbb7b6ae9104003d01c0230029a7726a9705d8520c604d0f2708904401c818600857168490b6e5009d1504a831838fad8e212d8e04b0d1419606514729e0e5419c0564f1e3e9832880644d4134268474641820c490ed07225a1610ac34204b72000ca884204711375ebb5354c603b22811b02f8c645d8c90c5112a487042a2a581c01249cc9490893181eb12812d4a322c27dc20813b4813a083021a1c28e04921434305acce924c0c267256d8a20256584093a2c99a0b38c142960406b8312d80c940c645033c6c000b0770e8409207d2a8f2813a5c880108a6c2358cd0705227045894085e2388f3240b284f51a22041d3511325c8cebc40c604181127f082021f529045055660485a011a31b0408f1438a66478a8a4110356469533a290ce80f324c3194c332c9d51868633b8e8b0499a520d6720d96067cace0d9c184a5ee0b06961658a1cd62cc191c3a1b9b295c162878b9d2b3ad8a1210b1d5adcd86ac6193c88b1a5eba207ee8d0f5d143f7069b8240144115dbe04b1f5e025872f66c800660e213a36c2d819821383882ec474578c89a2082e8d114a902153268c9932b2684a4794516522b1c5963a726cad33b5b50e1e25a496985168681c26dc28d1049c3c75c63851674b9d2a4c76f2701a293b52ac460a8e145ba5989aa4c66841acf1b0b0d96c682355c549d303c51db61345941472b6aed217a1c8782283cdaf5321675a053b2fa438cccc7b81de183be84e810a48d491b95590e18b1eb5a8450cc3b0a4ac22611812866559966172b08ca5e40fe8e3343eec0a9665485986a940db36243359a619c92ad0d7da2aa8a6fdfca47c5ffc584b86615926264aa1e92da01610500ba8f5b1184ee3b4edb9ba45bdd539b76ddbb6f87152c4300cc3a246d9f599d18e51ccb32dcbc0b96d73fb607a51f46f4e73948b1c076efcc1f42f9a2ce95b56a704e79c9b44471964a327a323691a08c41fccff5a5b45631e6b2b6a240c035bfcc194405268b6f883e9add1de9869aac9a252a8284a566bd7b9cc186f564995c5186e9cb08bc188fa211fa1e6b40903ce47a8309c7e011fa1e628bd0beb06f8f852c389b37c18edb0186228ed8e8943b00de3cc7318639eddc95477f83db665bb2bbf08bb78128db0cff219a48149e4af8f303f68ddd915b46012f927fcfcd09164d174d8b07057baa50f5d053cdf2a870f9d36d775ac0a55f098b76af5b9a0021a5f18edbc99e9ec2e8811356665e5d9778981442831e49c40066122859688511cc240e636c58876c76d5a16555e0854e10b2f3d0e3d9142ec4c629eb9c34bd085ed608cef041e7148a460b8e82032bc7c842203896f1d60e372aa37eb719ae2307d387f3b884e372ece19563ae3898c2532a84ce559e14c2766ca8e9ca92726b951b40a4ebb3be5dc2269a2d9dd9dd854980c0829a5c4323b535bb24c9b4a72638fc6d42ab0f181e2d21803cf1874a6e80f9b0e749ee0d003471b2a359ad2187ae824410016b440f3411fa1b4d8f24e1ffa673c5c0c2463da2cf2ac360fdf2ed0aef18b6f10d0aef1f51dd2ae11eadb88768d72be9dd0aed18bef10d0aef105df22a05d6317df23a05d639cef27b46b74c13714da3572f11d85768d5b7c9380768d70be8f68d7a8c5770968d798c5f70bb46bc4e2db04b46b7cf37d02da355ef18d02da355af19d02da3556f1ad02da353e7dc340bb462abe5740bbc629be5940bbc6167c4ba15da39bef9d42bb4629be970aed1aa3f8de1868d708c5f756a15da353d710be5706dad5015d1bf043283979484c0005e703ed2ae4698dd1156a60784a9cbc243f6c1b4ac6271dc8d35a820dfe6883a72ed9482eb4eb074fd90041bbfe78ca86cd049105125e68d7c522892fb42b8f25c0d0ae41cf041d2168570ec43841270cedba81983443d0ae407486a0402fe6092268570ddeabac38b4820c2bc63bb2afe22875558da2f2234aa9d7647823485f791149abf6aaba92ae1aa26b06dfab8576ddf1bd3bd0aead6f76aa6304edfa138511748bf0cd2377f19464aef29665ecbaa953867665c93153702a33b4ebf7aa223cafb6a0be5539575baa541ed71ce72bbae23c738e7baa7304edbaeaaafae62bca3843bb523158949104edda62ba76df0c6709da95e3020dedba711cbabb5c475955bebbbcdc9ae18d20dd5bf72413b4abf611e41de32959216857ec5b3a11361116af229c98e80e4c1b668558300b068f200e7677777793d8b46cb129970c0f2199768f8af3a01a8bf60c71da80578d35cd98771d6b9aa44ea7d1f4aef3aeb9769d791e333bf522520b4a8271579959a3cc75365dcf487cf66570c918df3ae79af48c3033c62c59738cb94d6325c93cb1e952f29c55dbd69040cf6cce8ed2e8f39bf1c39c9a60c439c66595db6a94cd8f6636676b5c9679b775599629d96496b961e648da1c4733ccbdae9d1645f3234e7294f3224cb7764f7bad4e6f4ecbdceb2c32108e9feba65cc765d8469dabda77d3f6224c6b8c3e42ceb58ce33c28c9e4b8cc356e629ac4c04dceb77d7c8571c16f53a6605c74e63d31954f06e269ed717a90a6791e5f442ca9f1f1266b8728405af90c66a084f09a57897b8a3e6fe94d20162599a9b27b4a10f255339ef4ad3b6f04e92a14fcaa56897b8a56ae929eb9acb27b8acc68608c3ee4363d48cacea398ff7c7c8571fae8ad0aa777beaa66bc8ee2a9bcb1ae53b5977999f432e97d71689f735aa3d0f6f6ba5554c5a293812c09a2d3739d3bbd9452252595526a320329656e4b2ff1e29bcc72e364c7cd6dcbea922e82e6dcba2e79c1a7f9b6daf30a7386a377db9cd3f3cee6364b00f44740ef8152cea0249b9c9c922dcc403ac964207d390847c9a92814c1e88942b10242c41085e287aacf2088b85a12e79b724ec960de7cf4a42a8a7d6320063aa17773d73705cc1ca9f22269dbecbc8278ca34adebbaaee3eac66d59b64b313e9321bef508cef9444bf9c5699774b1adf678717a8199d2464bf9fab2e44bf680310eb9e40f26587ccd7159aa8290f04f977130d9e28b2f2f715e5ee0bccf396f643b4b76a3c96d9cd434e6dddd5522c18dc119372e2eb76d522ed9f349cfb08a6572825382dbe693f38e7fceb9648e6f4e599138d00c2f79d298bbd29f080b425c42057789eab2058d3b75b2f899711ca7699aa67191779bd9cb87392f2f5330cd8b92b78969345b4285966993c37c623830785e4034015166b5e7d52529cb0bcc99d51e2636cc38447a648204f2f0d5922ebef5027c7cf930e7e7c6ae257bbee998120f3efce2f4e858ac05f88d33d6a0e73863055fcea9a9b8235dde626f40dfde8540f5487c15f5e845604e074395ca8fc45781419d1ba93cf34ee599abc0cda34bf9eebc885c2740bf49e9e5391ef31d6e7a4a358d638d63354d0c84bba331c773876f3288901f1683deb26bdcb26bfce455a395b3e05972eb1ee71e079ab71ab0f415b3b7924dbfce01181eb1c66b247de5ecab498181338e9d9f8c7678cc494c4b845d63276ee70ee72366359e87929b3e73ea1ec77928418ee338038ee3768773fde115c86aa42f18b41202e41b20e19c9938cf0b839a5ee33ccd5d0611b20190b79cd58441e011bfe71c68ec710086acc46ee45166d50620104829df91ab558d2fa5dcb1ec9a77648706957a0655e55cb3ce5ae00f186e200bec7cbfddf53e56c34a2b5e81469c6beed1f5bcd009d07eace60383365f49f73c64a55f812b347d4e9c00515785aca48121e629a1984729e43156e3d43989d52c116eea3856b31d641aac0650739b1ba6a9b6d958949aef71dbb64d3fe2c7b26de338a3230f9608e7730bdb2905bbccc306335fdf0e3ce270122d916d863f360cdb9c68c33cf8c14036c6364c7224c2c2e8f4461db6c2889608e699900f7d7ce315689479b7f26089b06fbbeab21fbf65de39966d6050e79c4f0cc38836e61f1fb29cf3a6de91f6058d38f7206481dd981bb11a730f9608068624e0b8289575599675bcd8e6b3ae7f95f355a58ed5393dc0547533d21cf30e0c8fd8f3c0a0cc399f1e2c11cca773c039c5bc6bb0f360892c1876ce71eec11289cffdf83a3ffe6b9af6da6718e8c17630575cfc34b68eed7a635ac779b8497e7a28f3fef1c543139727faf8da72e77928f308f8f8d2a2c707a4a7efe3d9d2cb87372f1fb2bc7a907af5d0f4ea612a46fdfc5651ac7e1dc735316ac9715dc749d068b328169648a8712a578121e72a8cd7b59073ac5bb91cc84d9608e7ddfc8ccbbac9724b1997b5141858d0447235d29c05bf59963559229973947a1f76e91cd57cb51cd1fb80a18f73b2e5a18feff050fa0eae056a1efa80a10459d80ef6998b4db8503ae6957a477c7c41a3ce5990deca4009eed8215b9d0ffdcc595822d9e619e996340d493f56d759b5f395e759d7f82c2c914ff34ffbf190ba8f872bf70143a2ff5860e621f5f590825f38ff038334ef1c6321a4de39185270e5a1afc0703ee62a0f3c625e1658e89c8525d2453d0bdb01064629ac65d9d1f246ea9565eaa5c5cb86458e0e5326d06b30de0d84c0cb6453a2680b924cb139412fd3316600067e991e24e354e2598b980662644f036d3c7a190821035750f315891a08e14b96d536552237a3739b27c1e015692ea5a828abd3370d4cfa5114bd0873b04904ac63b54d15cd659052b4f986f96abe711b075659ed29dac0a41f451ab80603bdb4410a618d3d7bf654f109b681414a91122ba2cd346950a6974000cfbeb5a4927f4a8cf1019bb14ff0053933ca1e14de6a1b0f02529e5dab31c6f8804c4b93361e3d0b843025c6076ce00a667c4562116e12820edb56d940612cf365c7e4dc6ae692336f0e281f605dab6ca0482781949f4e355fe9139b2f68f0126cd2402c6ca2c838f6ecd9f350d8302826fa0ae6340b58b082f575ad7d7de952c6c2058b9617162534af2b637677625bf8e36be90d29259625b1f15acab3748767e0f2d257d33bf2d8c223e98aec25911354e1cb27c1d049d44b29ead7b7bde25749ceafcf9db1d50269cb0a05a5b762308f1e0a4f6038c10acc489ffcc10ce174cf3b7422823dd375b9781e15284aa1d0b5e8aedcf48d24891772b4ae0c78551503000080310abdf60b09d4f9e6501a8618514b788c15968e0522191758290cc43a1990656c80cde880b4f3813340808611a711823b23581840518304718d12e031c1b28182365410dd58819c92c26f50915b45061a6ab801871caed4d1c5d7defaf82aa287efd5c2c3528ec183c07afdc24ab542f2ba78a1817aafaa6278380036a841b5ca131e608b85d8e9121142c0b37300bae2107f5f7c420c21a6882583436665e6f0aa28acd801fb11d0ffc421feee744fa179a389858329c6a166f334c518b0917238ed1c51e871b3744c11eb78dadd63459cf24652c922063855968b45da3851867dc1ceb072220dfb92493b876bd8306cd8a8bd61e944a5955a1cb68c6865edc81c160d5eda3b57568dc513dbd8a90887dc3cbc72f0ead93aa20f3c657fe0182217469240ccc05d9238081bd68b52fc6205cc92108c250c67198277602278cb8af1218ee1b245748946789164c07099304cc48e89466c9978843cc3ac848724f366c2095e2436420ea644a5f21628a59b3403553d00cbc640eab0737096a5436ad93dbc0395e5a14adc22430f34b00f35ec0f37443569989c688209344b2891c419248e3053e6bff05bb1562a1f95f7e3d116ed1ddd65d0711a6419976d401ad5322dc336c0e8e4a0bb254725e522b6ceabeb110c4a62e431196a94b9e7649e83ba8138c4be41e540ed401c62a7d50371881da87e200eb16b505d8843ec195410c421f61dad9feaa486200eb1b3aa085a8843ecab9a8138c43e8238e403571a8843389037101d90045484348317998992fdd25f9f7168ddcc11d0cb0fc4201f84fdeb66a24439fafe08e8d7a31c6dcfdec212195a8f7168413341cc23be482484e033436c1262a212452c41068d192690682209279690bf5b9989a96566993a4c2cf3ca3737d1ae73e99bd7d0ae33876f6643bb4e2bdfdc86769d387cb313ed3a95be190ada75def0cd51d0aed3866f9682769d357cb31bda75267d730b68d749c3374f41bbce19be990ada75caf0cd4fb4eb44fae62a68d759e5670c93ca37bfa9e39bb1a0e39bb3d0f3cd5accf1cd70e4f8e62d62f0cd5ce4f96617c4f1cd71e0f8e62edef8e6174c7db3176e7cb39c36be198a8d6f7ee1f9e62fd6f8e6396a7c331830f8e630ee7cb318667c735419df3c469d6fa623f5cd6490f1cd5274beb9ce18df5c46d4379b21c637db09e39bcf00e39bd190f3cd6978f1cd775ef0cd30e8e29bd5a05db9ce37af41bbb2d437e3a15d998c6f668376653adfdc06edca637cb31bb42b477df3549c6f7ec305df0c0717df1cc716df9c07ce37c7408b6fcee29bb1f8e637df7cc5375bf1cd557ccba76f49c5b794537c4bd9826f29dd7c4b29c5b794517c4b09c5b7944edf52b6f9966cbee50db4ab5cf32d956857d9f42d71a05de513dfd20aed2ad57ccb1c685799e65b2ed1ae92e95b5ea15da513df120bed2a9bf8963ad0ae92896f9985769568bea516da552ef12d77a05da512df9207da5526f12db7d0aef2ccb7ec817695665e967949e6a5112f8bf8965d685739e6a51849c4cb215e867999c64b212418f9e55b8aa15da5976f39867695417ccb226857d9e52510df920ced2ae50fd287973d7c4b246857b9e5250f2f77f8964ad0ae52cbcb2c2f759058be6513b4abbcd2552e7d4b26da5522f12dd3d0aef2886fa9867695397ccb27685769e55b36d1ae12876fb9867695687c4b36b4ab54fa966d685779c3b774a25da50ddf120ada55d6f02da3a05de519df520ada55daf9966e685799f42d5b40bb4a1abee514b4ab9ce15b5241bb4a19bee513ed2a91be570eda5556f9de39685719c3f7eaa15d2595efa583769553beb70eda55cef9de3db4abfce29ba7d0aef2f5cd54685709f5cd31d0aebce79babd0ae5cc73723d1ae4cc737cb40bbb29e6f9e8176e539be9906da95e5f8e624da9563f0cd35d0661b6857b9e79b6fa05d39cf372bd1ae1cc737e340bb321cdf6c8576e537be3907da95a7be7989766537bef90aedca6d7c3316da95d9f8661d6857c6f3cd5968575ee39bb5d0aeac465786c1f39dae9c465746a32b9ff1cd3fd0ae6ce79bb9d0ae6cc6370341bb7219dfdc85766531be3908da95c3e8ca607cf317da95e774e52fbe5908da955f5d19ea9b87a05d594e57f6a22bbfa02b77d195e37cb311b42bbba02b73d195b7f86633b42bc3f9e6236857d6e29b91a05d398b6f3e43bb3216df9c04edca6fbe5909da95aff8e6256857b6e29bd1d0ae5cc5373341bbf2d3373741bb3215dfec04edca537c3313edca2df8e634b42bbbf96635b42b4bf1cd4fd0ae1cc5f7c4c10ae7b034af60611db24c2d3bf0b06de961fa40d75b3c1e928ff7b015b42b43f1cd57d0aeecf4cd6f68576ef3cd58d0aecce69bb3a05d79cdf70c826ef5e4bce299e0797667a73c244fde7ba327181ae12cd3361991b4b4c5fcc2ab727ee24ff05040697b92aa64910d3b5c61821b78a8e205a52d549400871e7697bd56adacf8d0710b79c4658b2857e41b1200f1060a9609274a17384f74c0b48012841623c8e2e58aefa2f0a045b3e2c9172b44b003982abea1f4c003f73402219e42b0250c154f9ffcd04337dde54430c4144f3d27bd3e10d182f7a4c811789e47849b6f1623c5378f89e29b8b80e29b8d60326dbeb90c5d2d9b18a5f2422afea8385ff32dc8dd6541520fecbc893702e59a52e7e82a35e90a42114f49e65d89fc90d768d76dfade68d77de29ba35d57cd7747bb6e9aefa65d97e99bd2aeebc4b747bb6e13df2ada7599f85ed1ae8be6fba35d77896f16edba4a7cfbd0ae9bc4f70fedba67be5bb4eb22f1bd8376dd23be33a05dd7ccb706b4eb96f906a25d97ccf706b4eb1af1cd01edba457c07d1ae3be69b07edba62be0140bb2e11df01a05d77886f01d0ae1be6db69d715e2bbd2ae0be61ba45df7cbf70068d7f5f2dd8376dd20be0940bb6e97ef02d0ae0bc4b70168d7e5f2eda25df7876f21da757df83e00edba3d7c238076dd2ddf3e68d7e5e17b8876dd1dbe1340bbae96ef0e68d7cdf24d44bbae0edf0aa05d17cbb707b4eb5ef95e00edba4bdf3f68d7cde1fb03da75ad7c03a15d1787ef20b4eb2a7d0ba15df7866f06d0ae6bc3f710da756bf82642bb6ed23708b4ebd2f0dd00da7567f87600edba327c8740bb2ed27711da75ab7c3fedba317c17d1ae4be5fb01b4eb4ef91681768d7bbe8dd0aeb18eef1168d748c7f711da35eaf92681768d737c23a15da31cdf10a05d630cbe93d0ae31cf7709b46b8ce3db04da35c2f11d01da35bef1ad84768d53df27d0aed18d6f09d0aeb18def09d0ae918d6f0ad0ae11cf370ab46b5ce33b05da35aaf1ad02ed1a61f0bd84768d77be99d0ae318def1568d788c6770568d778c6b70568d768e7bb09ed1acdf8be00ed1acbf86681768d75be3140bb46a9ef1668d748c6770668d748e75b03b46b1ce37b03b46b8cfae600ed1ac5f8ee00ed1ac3f8f600ed1ac1f8fe00ed1ae704a10ea814ec582a631c2a3422020000001000001316000018100a064402714018e7a128b70f14001077885270509ec8023990e3300ae2388818638031c418831080199219190480b1405a1a38666e41a623b341afb10d99edf763787161538e975fdfaf633a22062b834ff782b15980e69af69f7786dcf9fe9a8e5e8977c17eea7b03c6a379366a833454f075c8ad8c9c0de8f49636d95279cca1be6f2ceedc5e19debdae6f00b7744979ceadeeefc8e6aa50ba523e4fc8f1b7fa7f90975f29cb2364ec51fd5fc84bf794e58e765dfc8da73839c4d384457eabb551dd4d40db19dae33fac1d31b31b70dfc13b8c627ec968024d259938836fe7a98706a046f567c123ee2674968eaccd4bdb4389e78cace562817234cb767f68aeb52edd46624a1f7ea640af01a16311e5d76ec941828e262ad495d439838137c8a6faa0f98a99e9407e64ed00b13701a74f82f0c18b45919a759a63a842b392c6a954bad69efb79683c5a75a9f6f141d4c32727bd0738eb26c2a0abbdb86897a77820857f04e19b51b3ab6aa3a8b4150ba3ba642fea005ec38d18cdda4fa439ab6d7342daae98e9fc5803b0d15c775f15b9973731cf72b02a9f052d8c2515f42b85a73b98d063b082add5979cd972cb81ada9cd18cb6ad4fa477ccc835ef131cbc4912f674bd0f3b2d2a1386751557e0ea2100b8d60c1101c0ac1412114123f709a4124e470ed4eb6ddaf467df7b07f8bbbf7c2732fbeee83eb7e420b2e646effc5631efe129777d07fc4f1f18444f9bcbb4823eb8364060846c143cf1b9ee526844cfc7c27afffe917d64de92407b478dbe286eed8c03d754a7a8dc8cc60101deb01b065dcd34ca19831431f73fdaa5726b52552b7dfbce9edace5b42cc4ef83d0a830c2cc22caa89ee9318afe7ce21629024c6c2af96176c68c52032ee12449c3560c1a53c5692e887d86f2a4365f42f3640fd8316244e50195252d12f6949a6f17b2db8a32468d6183e73a6e748755c0095329a8c52e2abe9d261179d2048442f2caa181863ab010ce7215cda5344c4cc9bfc18912a452e116517161bdf60bb51277a6bc07333710c87499b11f8d468c250835b19e1ee4760a751ded7aea43b4834b929b73a0ce84e7404a835ed0deeb4093cb0b0abdad9870076052405bfed276b5be3ec309359e51f603653ee1b6733b783bc812f816f8b2610c162c63d86dbc3d6d13180d9094fa47584c2b1a3ee5704d96e580d23f98a1ce39d9ef3df9c1ef3de903ef3de103ef3ff183ef7bf203ef7bf283de7fe283de7fd207df7bd207dff7e407def7e407debefed5ef1efcbe27ee2c7469147d917b8b4a0f4604bdefc90f7aff893d704219dac405feed0602f81e146858854877088e8913c8223da6679558326159ce2ee3a8b0468c8089a77c1f21c5fe4d3116a4854e66988d7bb3d9dea573cbcdf4fc57020582e1c142af4a4a8cca570b20c4e9e6d4ec6236ca8ec996e2bd388836b2eb3f5ffabf3842ff77e7f08fadf625d6c8aed61402730df2079bc7b247b13dbe19cceaf8ca344be323c32c8fcd8cb36c6c331f4b701dbb5426914ebbfc85833d0ca1a33d49dc1bb2d9c7578b4c20a205f415d39b6d144bcf2f1a07281a054b1574120206cbf7fd2ae1da3a0b57affaa10c215bcfab2b3088481a93e077c6647c122be534267094b4f7f32b29fa4a8a7b622c2532bc71a4ef787aa3ec7c908a0c1713d09ab8a9e471d139fb4305af98ef580a04fd7c2653c6035d5adf3525538d893292e9ad642f238b9a9abfc984bb569620be374a767636ef9a8aacb5a81c9191cf26d4d30f188ee0a81313f16a7ed1a923fe881793feba3d80a73ec111476cf2f57eea714d09e8559db564010974a5eaa716328c544a60afd5ad25058e802fbd3e5d1cc3dc5207f6b67574017a28d9b1938b4b822e83064eb2b784f361ccc97fcdd1b19803445a3bb697610447cb7fd603468fb6f068ee39335359885619c2782e2343b182158c011ca0749d823d51e7360458613ce5464b667840ad8201d623a34e0eeff7b5006f6ef86c0478217bc7c921907a58a13db1bcc198aa0d297dc7a4d538d94448a96dbb69c44c2f9eab9b69485384b56354b0651dd89ed6b42c1104416fa5b9424343394e46f6bb115e0c044d2bf2a4273115b5a11188ec65974870386923ee1188fa3d9af8146ad13aa55ac1a67a306fc337331c10316dd3b508533a01e480eab663370226cede37e16baab1971077af1af0a8a750488f269d02c47b228a25ac9891225a70c11416aac03b49f8ee3fc9099f37577849a147ce8d4cdcd7b8f86e6aa2d913a471e65315b74a9562aae0dc6f9cd1db7db0db34be13c5a415f53eead544134bbba2b754fbbfb482bdcbd3e804208b92208d7d974137baf370497ed90cf055f5cc6f80412472023faaae22975f8491e019cd998075b00104f9bf02e5e65c68993943ed4a2c665ac1a58ff4362692206aa9390b512d1c25dc8204c5cff8999ece3af5143540626a0367e9438acdc0527d1b967431a889d9e8c19ed5542b931bac7f0f3db1514227bfd6e568fcbfa26f19e3ca2d60aeac2ec417bb1733d3d447565f60cb0670f490a00f3b9f4de20b39538e8963ec483181e123c4c3ea28dc55f2c446727479faf0191aa98a1f1a0220475ff2519ea6ce4e143bad98fbe89858511c2a7c769b98d6ef26134726b1b1f0979b4cd9cfa180d297cef5ea24ae99a6433eb9c9789021d46b753eb3c411e5a398825c8604934d653e3e8f0c4c72e147f00381a803dfd4e9c6b49cba71cf7525e37577693a331c230332661277c9778a4ed7be9226208b70698b182d5b7325a7166a3c79104558c0ac8a870613da76e187cb5312fae9111a44ba05d032111e82a3fe343e8d4f75f6f4a200fdfdf46a9636f6582eb300832a2c7da8cf84b8bdece358a0a5fdfb88eaf5161a66029d93ca73036eacc816b311b96895c418d32eea8d65345c312a4ac393eb0874106291e8f9bca6430b9ad0279877a160383a0e746d8916c01529c4745c31310ba2bb47210bf26fe18759c86d44406d7cee265bfebe2fcebbbe263b55fb778b913968a0fefa9925f81e379627773aa65d6fd27256602dba5850da0e87055a5c89755cb545bc5fbc3c59c68a9bd411dec74b357aa8761b7f7274a367ee95b66b0b5cbc520a74fe6ea8fe9e11a99cbd5ef8e40555fd5acf710f23272fd275c8da450ff090feb4860dc69fcf6b301a3950da6f5bf4b8b7d4d50f535283cd943c12e5da69f28898f2b817c3ef26bb18ca14b0f67b7d06a2e7459a349f152197813cc4236820ccd579a8df888c1644b162396ec8d00870ba6462cab3bc954a361285299928cea770ed4345e3ae4614416c4fb6969a072921a768d0bcc13de06d8eea64a5326d76c1c03b9d78a3cdc1880db5e5049928808baca20d4a8621bc39023806c832ddafd93801984cb2214a6e031d6d6ce7208b9a12e818fb091750d8a3a33a5198a01145fc7e00f3a06ac445b403cb36a29a316235daac9c6e6c563615ac9eb95cb399949dc941b9549665aec5b18b27379d633b9c0cce706dc910c232caacc08bda0032b9b6b858d870eb9b701327060f3126f53d520248bd06004e36b1ae39287522213eb9e7b83871a588902d3c98dd8dcfbc0c010b1116de0d5f9a586d45bdc555fd9764b31ff1c617d8720d7ef3d1212c875736af838097799959fbe1ef1ed6cd1d9bee88b98796575860ff2a8dc13ed60f265f674f7442e1ed6574c08b70f077fc48255ec29218a452660a00c8a5e3510d491f845ce8d111fec1ebd2c3def4bf16fe9b273485a40b4d0213036a844af4a993522e149b00c780bc842fcbd2ad6115346ecf992f8406a97cb23f1f3d3f523570d35a0a048790b5d10fb3e2a9dce4c3784625f947ddef45004ae473f1bf4eb4e87a9d0242a6131e6c4c600c4a086104347229319b4e8a76b3f2fa852bcb0a26584cab0a13efc49010aac7f8b7d54692a34de6f8ef33ba43270e5e4dd3973a6c0c093a3e4f1f13fea7b432514e8617d9f81b30c6f3bd9927be188e0edac7c92dcd8b7c20bcb079ee580d4e27488d59d741bd41394f53c94cf8f195003dc4db500487223d211d1ce23995a4c8356eafd210f463dcf3f818e12157c71c5ee6a1a13b4a1de1c45112c723f9b3a2765e1f6ae09ed6ff075417d4b2e37d6415a3da39da52ac01be24c2aba281d77df068695f4e2b4d8e9e95e0d1a68957c489410c6640e80cc175fab9b8d5f77bbfcb2e1dc877dfe16dc761107af177dc8ed5813d0d17f42a1dd4c51e2f5cd769459f60d9f099a61b1d3ad5e64a58f7c267995aefd0f1c166b5d4bda504be7ccc4fcb8ffb96bf7da88c23b206ccfff10b147503ba2a1a07fbe12ac344dd10fd95482a7b6b895961dc160432ea06e1f2eb05cf47f9b643121d94a16e70f01962a850c66a2ae1d1a15ea739989ce5b36b09ee4ea50eaac05c7f95845b5048959b1ea2b7340293a71c9326516d8fd25a704f31f018dfbf4566e3004c41a2ac35d006c541ff0287273e18c7cc73dca9a604fd2d9329c4453ae2ee962d0a2949d7709a31257aa9eaf24c3af2e378446584f5f614499af3993d669ed708d35aad43eaf738765c7ca6b0ea6bbeb38a06472145801d406429b921e30ced4a9b01bd44eddb4c8e9357398a56de4aee380f2c5ddcb499dd375372bdf1a8d155a8580725b075cd2635e8348da39616867fd3e888810319d5de4705cdd51e2ce3860b48cb29f48bdd7cf31876bb457f19ea6d9286e60746889683cca0fe57824b9d33dcbc5f959ecb640167a095f090df4d315ff62d46f5569a56b8721be834454b2f4c61cc454a5ff1aecfce9437d9ffef0677026db1d09327d9f3ae0e69b4ca11b83872ea459b26b42a10749e3f3196d1c53e0099bb2a7dfe7e0b5e8730ae8732cccc360d2bb9320736de0e4ab2c1b4bda3033ed02a01ee0a3c79fe62a8d3f88a1e288eb6cb16f929349171c6cefcb6d326f5c48f177a6d49e34d53fa5cf4beb44e70d0c4e7c69145d44a7a012cc6d7da51cf5377d829b88517ddcb2d6b164acec059d2fc0fde5972064094e90b53f24595093ae4b715d00a316bc8cbd2717246b799eb25612012490eb254408279330e0e4a2a2eba863553ccc5ae3fbe728696fdbe396373bd762d6eb0820f83af19e35fb8d8b26e623a74915b483b74ea2eb6b4dcb583eaad49dab3cfc13c56e4620ba63e0ca5e92db6fb69e1db7147724238139b314e10f45f738b20635b5e73ce847f18c409892fbc7aa2822032d62ac19da222b079bacb18c2fee97e6716291ecf65543d3d29305321496fecb7c740bd1275c8a62f7aff54f2e0b9c77ea4a5732caf0c024169018d28e2fdf1554da8bf3b282d1ccc3f4a6fb675689369f79196be12c2b480e7610fc832a6b0d054e9cd58b8b6def7a0a7b5e00030ab25bd9b1ac5bac2b43c3d00608386233390e50b20031f9fe4dc2c4ccb48a127a057f681acd36214cfa95d92a39f781efd6f9272a016bbc49ddecf5c4f25d4a2b39279c92da9c5647f705e8dc0e282ae3ce79ac9136f6d6d9e61e7d43faea387136a99bd8da33589508cc208c17568c16e7780a018bc844e9703763f0cb60422e8ea707fba93afab542b2f902dbf23d4c209df3c698188b4ce3c5f6bb751514ac5872fbd4e8e37ab5779ff644c44e49c42cc76ea2b6698a3463f49bde432686001594119e30261b75e441524715e4da75c3e97d2ac1b3b4fcc9682df1d4494cd4787ac3320e01561fc9862affe98e8ed2d48584447e6cc75cf8d4223eb16e436aab2dc46a7a5c2c65146f911c338642c1cba35700c670f05dc7b0098e85b78c5f6455d71ff514fee9f97b1f249c2ff0a9236107eada62d4b95eb0b72468f3bdcd42da5112c1201705f9dda5781e9c8e2282cb47977d81ca9f737fd11fc4bed47f76d8b4526c4f2bae32e7073998aa33f14ed8c3f1c6482b0979b0d49a4995469af8d590a491f671b4ab9e3f3fcdad1f25ec84c19d5c5501fa501a89948c76ebb34c34f80230ed45fbb308a953de160f86d063926d9de9323d542634033fb2b3301886386709c59a7c145b78683b2b2d188136e0fa38ffa4def1153287b4d2193a08796e9e00b75ba5370fcaa24d994cb900a811424c2448738c03428be4e44357fd23ce54ba3b45395862b79f1ec523023c00d624409e255fb2fab2e458fdadf58d0fa43a9221fc63417b77084ab361f3074db3fd08b1c1c8d3f340378c65ecea09221b394bb4052a5c816a4ea96791d94826a5d1f129b0f7f587bd77b0f9b890129492461cb4819fbcbd99d400194f0143b77154573db5ef9ca6da8303a447b12adce0c8f10802e9cab545f8ea19d189ac3c3583feb822b69c6dd78aac07bcf7188fdeb7fd6fb4e6a200969bed8f9b5c2a9271fc5da7a26a57131f521682d02b765ff77d5e9d6108510cd77b6c9d48b4bb305af7b41970e9efc5a5911893ef021673258e93ceb5098039eb477adea77900f78128dfe58701a08b68c5feb638718db44192d358f6d2a18c5a1c1ed8268b79699495ecedbb48378f941343e3264ae5b9b16902fea417439ea3478c814e69856ae21dfcbfb9f6826c460abcd33589409146cc79e6013239476079e735a75276b564abfe01ae4b0a1f7b571b8ace98fc6d6fa1c7dcdecb1e223856856546ebf019ec5e4b3f8f083f07a5f9e8b050fbd74dd9271611a239deedce9a1e1be7060d122a9fd2640870ed59a4f7529048a1be46dd6dd3b9f33c8d5140b49e489a95349c6a61536b4e543de7ea9b619bb0ecc591927e6465bf54a43230b62adf2fa9d29a413d35a827599d69ce3c942fdd5e0b51b3146928adb284387d4d75e7143f25da3f4036bbe6595314367723cfe327f0ad1bec87b3dd0bb97f63119792f2c0e54e25e37aeded36f31f957affb2c9c01840a0c520d5fc4b87b22f3ac469d5bcbf4c03109c17ef9ad42c71e7a61ecf970da2d16bf681caa8053c0042c1c5c8efa797f38656b315fd54aa3522cba68dc547a8f01b8c32237aa0fd9616a989ac912a1492ab784f0ae8fe7dcd9a4ae89a579dd0048a6c883a8ae6551494f88f2fa9c54c01093c879974ebbc8867eeac90cf50087195e196ed14dddb538d0175823f9196eed8256c1c6d3fe10be4dbd6bf0ba937fdd860b437fae4217d6314850e2fa89f67ff35d4ded4780ac4b55f88c6c278764859903bc9aa21e1a26cb4e6d94ab29381828b649245c57781e1220322f039b58f6f7e5fc8be82dde673368a7b78487e5e1bef97eea92c0d235245137aa28d8ae3198dd3672da790646ba4c7252ebd4051eaf84d4708203092e0e6bfa577be0ecd821806ea5d3e5ee9098ced982dd89c768a4c363354beb400e868078b2962410cc82f02988a51322b05639cbe8f52a12181921488b91db2fbbb193f486517693d17fcf1181327878bab46e9ee06e165752460e223e6626f13f7c96139c685915688165ba124d8b2725848c134d746c6b8477f29e7dc352908e7d0952dfe5d27b93e894682360ff8851d58174735f02dbf6a19341ead2982002f2c389371d4213d551b2a6e2d9950e9e2b2011d368c3e417f365b01300fd187508183fd53aa044712e2c6173c3ff86318a1d9c4c8525363bf62b8f1da1e3083b2a3ca385c13052fb57c6b1ba8fb4a193a1d0fa68eae087b348d4f0a4770c3319fb29dfa258996f3ced72b503afe5ba9abf55e081c5edc7b16b01493d8dc98088e163937b6b1d17be8defcb4614be7381baf158a4e539a3493a7bb7dee69df54f6fe8d05f96f44d8e983fd31f41a760975d2d78e08a7bac69abb735fe5ce6b2a7851e14a49c9546d2f3192772445e8b86e529bd5f5762ddef881ef59cc85901a65e3ecea37eac1d7fcc1c3991ff488a6545c5197117b11e5baf968471a491e6eb309d60106c4c8d42e18664e22a2cf2331fb0e457131490d4bd164ae6b1ade792f256fb24e8e6e65dfd8cc6375f692c8817a350570a96cd21640bb3b4da801ca9d8876b9625b144493c1aafcae175f6a3f1366cc1a5e01910546066281166780104148be75db3e2b803b075bed98f97770f6fc610e2c5f3a37f05d0eb6aa342aaa3c18e839845427a0ee4a0e258d29880cf33776715bd21606878282d0c2e549b348e62ded1e2fa63e9ff7c2a614746f087dfd2bb650c1c1aba451676ffaf5b9a98e36fba502a3c09fe63d81465986267953d8ad692db33ff732b52ad98cef517d6c8339e84e0986675c74dfaa27d62f813aead19fd2b6280ba925ec82186892ec7f2c1c801abdceeb8478f979d08626eb61d63d4c66594df4e123b21ce98093fb171dd7152589890cf4382a755d88b6a62da05c6ecd92a5cd3e12e6f5a1e0b97d058bade6fa7cfc0c803451b1f1113e4d86314800e70e7bee3a3e3d3bad5fd287035d387fc8fc017ef78b263c4dd55b68a6209d8db6a9521c0b92e39e321637142faa4ec315b948fcfd9edbbf2974b68230066ba22f4afc7de0cb4acaf3b1d8169c71adb8a986bb6837c7c3ec8e9dac5bdaec8c732c9c7142e24c823dae80ed31fb930fd7ce4169fbcc7356960ac878d0f3ab928ab2da259c359347a7af2da4fc6512dbdf23f05e4a0de2e551d7128f6fc813e8ac3b00a4538eb1ffa690c5ffd5b28b44f7ccde5b3170799ae799563140a529bd8213b1958761a333bd49bb91746eb70f1c7166c017ce429531eb19dd26a426acb3df184aa03d815b6346adc30e5b5621c784377b09e13300a3fecfa78f19fefea732ed68ac6a72ccd0c9119eb5761454fb61e1d3752bdb78b8c2d1949f59018fbc7b9db0b794cd01e7c41d6182c2ae0ce05176e701c557d5c75964790148a7a3caaf89fcf0aa9e39525ad6b96e5276768e14c495b8cb2135559d2b2ba7433192ab3327b57ad3800ce6707f214c8b4ab8f81d9f273eebfb7e6a3507d82e2990d5788e03143eac42d2ab7b0fa73c403ed13cc26bc10fce475a7b70b574563aa167d6f9907abc7768005b4363ed903c617ef1e22a9455d2af1f1bbd07bf9d13fd892692ed0c034b82bb76134b0ffb9c1f47700e39d7992e163fd5d5d8acce481e08f83dce224309e9cfc881cf8389a423ef4caf98c0fac9608b3de40edcb209201ee3e6856cf190e90cc4dc90a117dc341a0d9faf7340e7cd3a4c2334e7786fa583123b583f7e183c6da07e099e137440cd5f2b4e48c00a55bca47469e2d8fe8cd4d6f3e8edfa16963b07c4f6209a4a976a855e6c0f50813eef0c0ba7529fe9f7fc85fb4b3caccc0ec08f6c3fe5fdd9ae57462a2a58f47895a919888086a49adad209044954114c78727c87007439c222196ee13bfb65c6950753fc3101afed5cf5c98227943ddd6678d32de5c8e2df0a2f95628534769b3057068cd3f7344f0a8c1091830a80b80545ce50592c64023964844b0748f2433501c2e65b4cce7cf406700cff4f312c5d3835664678d1d9491b279a3d6c40fe57184314c9b2239f1f9727ec10378224441b794b6db56335aee511fe3c8f8e6258391156b8a95ab3479cd6c5dab87065b8d05e8cf6af5207342782d97063227ab1eb9421855e8ec03d6a48a4e62b537fa7ef7eae969d2481569ad35bdda63ec05b8b357efbc69168304d6c326f3d376708c0d77f646b9156652dab731431f6b0f5342b17c631e24ec5311c1f95f07e04cfbe052c3cef014556099b6a1c9862d344fcd25d432401f660c6d54a3c33a9067c4bebc19f28567ec053fce4e1a105d7b142b4bbc99ba76fc4a19d727879cf8642ebe56b7fa3d56c117e7de2b94fc9cd5ad889233e1a880d21c436b447ceb32aeeab1ff114b7b7cede8c2eff3b942f65a2f2f3f5c42909c89499bdc9f3c02860c903df1821154608c75bf408a61d3478159c2cf001a449e6f930b4634573e5ab8ec3d7f6b6de03f2acf59384b571c51f1a9901264fa75115bd18b9085a7d45a038e44634f29e01d509c888919a8338b652365e8732236907877976a6deba1fa76064ec7ed711e4e01fdaa35b5c03f875b5b6520372f3b042548670b9c2e0de62aa67f2c328a2a891b3aaf98b139d5e1ba8a29c5aad41036894d566d7aa50a43d0568657f52236a8025ad15a56411ac68a1418ac65c03980f8fb3ab162bc8883e61347931706f17cd483e92b7b93c38720139af47c49cfe88a4912aa26dc7cc0620ca64a31e1c7d4bae84ae93d2f80c1dc49d08f50fa29fa8256e44339545ea4c41827a5caf3ce0f496ae8eabdd1c21a0cb1af79ac8e85f2629d10746ef6d3fb2f7a1a48372693a7e1f16ca76bdc41812ca10f37a56dd6a311f8d3083e5b4a667c5eda0793d03b2acef287f84f999914c334a22fa6e4ec95ba51e3859d131dd0f3da4898236b50ca93f13c370c655e1ffaa1ac2f3ccac6842feacef74ff30692da87690cd9516adcc8a10995741d19503f55e2be4d05a96f112a2de31c60966c9e7f050a961a6948784763e0b8d37c24b69026456074cf7be48d4b9e7ec3c7c03348cf7ef8600dd3ffc5992b4cc05572e6607482f6ce14bd7508142ad8a4b63314e55ddd97ac32c0a30c6cf20e6253a6384b3891c914407affb5f25e34457a935dc8f2b51f25de4cbd271fe494521c724fc97e2a709d439f0991432cba14aff95ec7ce37f43a7645dea96a28dd173735a13f896a9a90f8dc83c93f26cb219f0ae9ab47269874d9bf15179a39a8594083532f216698bdd21cb2242bda9ad1deaeac7ed647ab572a0e9a4a8304afa46586c17c239a1fbd71704b05a5d13b27b2b0e70891ba4878de5a764973227d40bd49d9656e8843e09558fe3b585b86652c7fd88a2cb1acc81df7683ed9a2d15f1597c53c155a784e837b1c52349596822ef167b90fc28446ca643b92d23a4088fe27c27f14e154f411cce627ab90c9e946720d5aa34993b145b9d75c4736d322f7a24b209894f950ede2ea7a2faf6115819789574fc0b41c8d66c2951c9174602b84e7fa85bb732f9b1ca496b265f85c987fb26345e71e56d48f9dccc6e99e91548de140d07031a992a790cc9f0e462f95398f040db3510c8986f07bc4483c417d862f83da4eabe574cddd17c64a45654812e8c1cf0198f1e804de9d222a63d47be748adef1de9f36394956c33a58baf48c751c9b9de62f2ef288f60f35c01b22f431dea63f0ec292da607d38cb458ea050785a527fe93f304eded3ea1a6a4fa12612a38bf98f6b7812d41af7312a9e12229f777da7d62625cc1c39f5d9fd2099f02aa1a386e4e326c89685694888f42297b0ad4cf407440a7ac0cea108e649ba2b32dae1b186a34d3780120a8722d2ba3281864cd89eaa84f98e13dd7132c2ae60d3a16f5093df0c46b1b2ba098d0287ec81f67db519f285428fc0230c0f5196eec0fdf6c5353357fd2530772e5716a5f9896845b3b8105d52d816086946a0022cf9bf80e1b5a4eadea4d960cef24b186ecd7c1a7e478d49f21047ee9b6c4792dbbadc0a84e304da3fcca677bc920d205075b9427bb2d4e8e1ca0500ffd75d26728402f0c4fdb619b2f124645ca3aec869f4551c16e097469c47a242439b25bc2a6b393089094ebcbda03f20d2ff131e548eea062e758c127fcc23be200c5e0cfe58de4363c94f157900bf43f479d2a26755bf431bb256efd3d710645c391f6f90c92ed8e7394d300ea48002e718357f16a88e1cc5fe9ee87128c1a79184213b8f0092a7267b0c221824eb20e8770247aa03989245b33b006f89c56e813c5c42c28a023dbdcb08054d0200be7b2e313054702b480bde3757613edd0ebd2cd53de1243bec630b15c77d12962f1d8c442769a2cc8ce193e7bc20e80e98e51ad3c317b42f14be0ab7482cdaa217b02e9c0e41a6b33632c285ac1fd5ad19d5e69b0321fc47475d61a97bf8e4aaaa4f60384a70363f2c7a12717a3a6d9f9c24797e531de08304aab6bf1d74fe804338065f1051358800305c9e4c112063d1a99229bea251d67d1428f14ab883c0f54e5a4ec96c1cb367d749de5061a03915ce6f59048ac2e767d5f3ccef800d2d6f18bf34d1557b4a59fb7387cb4b780402f08aeecc45d9a5586a662fc0f2aa5a474d555d75a6a881ec415a467b0a01b0a2e5ffa0fca08971984bbe8403641678bd124910a282ae99c6792e98c95683fc59f42bb9f69e8ee0d1fd18bdf617bb699a4f944255e73d256cc04e4965546400a0dff27e5400518e18e60a8af9893fa1a216f5a88bbdff3317212717155bf3a7e450c30cf332f7bd6b0a505986809efed4ffb122f56beb476af9ce4c78f5cf5d5ab04d879559506e7c034c9f2a39b6a94ba05d514070c673cda64b0c0d78d1f9c93a3f984270ef8657fe207b22f86b8cb360b4044761b2f7bc6333d50a293afc2342be60ba509b403dd45da1f3432eebd6fcff354cdba283d7d9c7f5146b9f0f62adf1016b5a8df5482adb21363e8a476df318b48896ba2b8efd9b010ce01eab0fc3298dbe3e3170f79d0e8d7ab6fe33dfdc58344eaa4d2f2aad005c990c90a4e18e0083fc0459550f3c55d073555cb83380e8a5c1cc30c3a80067902f1123365aabff68aa5d9f718d9ab1d7f362195f2bcd5129c39c51773f2aa1c4762bf454058fede5532010e313f664dae4b6f63e4a60a7576cebf04b15aff3cba9a424f152647c4048e2bb096e9b60945f33463e136befe9ccba87007f5fc016cb6debc3605bb78dbb17604124fb316d5d6161fcc8d975c456f1b3224011fd0544330834998932e29ee8ce54edadcbe92d0b69b3f07575f658eb66595cc94c1b79b00aadd9adec21730062ac00ee633da21cdf1f24a27e3ae6ba43d4df60ee149f0c4b481bff544cc86f351c0a91d2e548a50b041bbe06084086b44fce5de6732a6720bb67d1baa68774ce980a3ddbc06f8e4a0fb9ce55c71609788cff4e9fa53110156000469fd2132bdbd38f418f6434e0fa3b79834bfe1816ac5ce404c4fee2e5394ceff438f09872cc9deb9d9f906e738a10ca957127f617135985a29c81b84e07617573a077cf4e33c1cda9b9ba4a7dc54632538949c2f83374d219afa2d98b6b6a5c2e19e9670039909e26eaa29fab23b8490d9817bc394ccf86bd63a8504bbd12ae6af8f7b146b3db8a9d441be19e34dc360c64280bf8601815af6415d423837ce855f99c10a4299518d5c1a7803fd76fd20ab84b6e7ea17af806249704c13e0e83666191564fc6b7d0e63605910c1117e538da5fd5ec3a3b7b1427a8b727b1e4e83a74a7ba4461e878756884100d6810be95edadecceac5717dcb48857de56b7eb48628418a6511c2e9e01ba99103f6e4f9f756e1bf002f75e626e6dde6c43553d70e68153241e1a480003e6db707176296d68efcc595ebc54704838fc1a92651d8a2637e0f877301ad3d0b25be4ec82e30c2e09d739b5a586f2e835959a1cae472bd6a455bd14470832cad31cd3f6cfc0d12e99f7bbbe0c1c0fbf9c34390adb1219271b935d4016fd6408ddd1f014de03b7f3c892c5647b82493005b553f744540674e3279a5abe724d714f623c730056e69b72719c481b3d096317b76809d36308cde11c0884e4e9123051a77e218eb36ef61b220e895a0897d648c29d9e0fc19c6b38e84f948b1f1a76e7eba61c0f8b5235a836361e4d22715f294e5377bebd9e81f8eca3d39e33987a0894b64046d8d1142ba04205ecfe01f90b37e8b6d720118aae5dcee8c6817b236cff0afad0814c7e99244da69987e376cbb899c76b82a9a6c54b62dffebb261d8b11ad73f06912210cd0f921761bd23cc00aefcbf985175e338b735abebbcb8bd7fd2c0ad5c3ae8975289a494a8774d8a46c1e823239e1394504c269c23654548360994b5f0a0fa1f7157ee65807ceb4478db3afd04c6129390499da2168b5a8072087432841f234e8339a9d735339c099a8e4b902784a5c0454c85f857ed890cdd72d09771a928b9bb5534d45fd3387a8167fd6e8f8132fd5d620aa60200d7fbc6385ae22f6d3035dce7b8206d0d2803d2b2b47671bb046b6dd9f3ec33b6f3e2d7bba80c3178ad5f1d1f61fefab58b82c6d83f587b51a30ee7264440c3fbdb50600ff5d2653fe8d36480b2b3492b2725df332801cb5d68001f740d22df56e902b38ec115dd83e484ca525a16030593501923e64914bc6c5a03322e8b1b15c65efc36d9a94ca53707ddc555f9dd095bb656e1628cb731f2c47f376ee9251bf9aadec5ac1fbf4b162bb8f5282d3aadc49c3b934970a09e80bbd2574eba8d7d85b95efa7dc6fd47a1593c99afb0fdedd109f1012c78696db072d1e83fc873a4f763e43d9301ef4550e5b8780cac4cfc8c0f21ecbfe586e21849f79dea10d6c81dae18390a3c2db7a018dd1d40299e7f90d70d25d10a9d645709b6cc3760be72a5b7ba3018af9282b1de149dd707f3526e4c361e0c7707b22b7478e9dc8b20c865f81bd9aa0aff0b10035adf36ca56bdfe17db6ea1391cb3e9499571a44b4668cad42e4c12a96d4ba8242229265959d5baf8f9fb03a227e7e1e8db52cd628881de986f6ba2a704b739210522337d2c2e2011e6c0b876ab72686f2c7941a5e6b7aad5bb2e2e56f613054d8290ea803bb394d09b5d26858ebbdd522c12e7a24c0aa9b7e17829156c75b41e0882168ad159c67dc586647210ad86c6e5bbc1748edfe6861e12aa4a108a412cbf62b0fc4a97c895c08f0ce8512fd651270315a42c0d630edcb9f507f2ded9d0e6e47bac08aec8e6908a31a8f467febeffce7a76b5a50a1d6a87d1f0319e5eb6640860f29b50b6446874d0ba77810f62d830b1962ab90b3c219c211c44ead01c8909221ed0436587bae6ecfa40d7dbd8aefbfa07f999cddb13106e75d13619d500c4c539d2a70990a4efd28e686b5be3ba80ae9bb8970ebce01e534828f8edc5664aabb7adbbaa5bd5c7c25497626b3503ebc603baf0d1ae7cb00b1fec6ed52a3a6beeacb96d6b7a366bd7fada7a5dbd2cdc4d55bf55bfaa8b85a96e8954e97b567df4bfa68c1a290c9d69820f77c5075df1a1ee5b7d7d5dbdbeaa6ea93e03eace85bbf0c1eed7ad71c1ee98a04bbd2e3ee88e0975edeaeaebebf555f57b7519507716d88d0b77d5d7e1815db158577d7d3cd645b575b5beaa2e1fecaeabcf07bbf1c1ae98a8abb2beb65e553f0b7751d5edd5e561ddf960b75e5d16d8adaaf3cada523f1eeabed5c587baf2a0ee79b8bbaa7eaf6ea9130f75d9ead5ebe283ee9850d7ae2e3ed6bdababd7afd629d5b764b5d5abd7add6a9d5afea2e75b1a1ee4b5d755dbdbeae7eaf7ea953af170fba57eb6382aefabafa7a5dfd55fdaece6aab5489f5d7c47e5331211b9fc360ac4fdaa3537ecf0e2e35d574e64887206e88b42c7b47219e9ae272eab35ee72ae91453f73694c2c3efe879705e09f2da8faabeb309f7db52d54c1fd704449fa408991c1277cfb553cd91987fc49d9d357c509927fb421bf03bc313cab71c373c15d80b8bf8367cef086de3d78621681b6f3d26b00dbf2f2cd176b8ad308936e1ec854bb4097f2b3c814db8de23dc86f4ef2859ed247cf1a988722c7196c97f1dc7e0aaa0142764bdda38e93a3813356f09116e71dc7892c6baba2ae279fde3c1e9b94809b65f28b4fe91de81f6ff932e30d491775459e5531e65aea996f46f9c1d9f1d0ac52aeb0a2411c9b51e3b3f15f40f88a5dbdddceb3a2eafc4f636f1e531374e580a076baadffc32f2308cf552ce1bb22dffd6cfefe076519dd310e5fa01cda36efced9afffffca2eab1ac6d459110fd5ff8b96e6a057b85bcccef5926297c852dece99fa8e1000052cdfff2e956dfee138b796dfdbdf4211a1469fbeb6bf7b872630736d4643b05f5e9255c9684576985103d3f8c33c41a2d55d8395e015fdfe53d72a4af9b0e9165001e36be273e1ad735b2a091127989acbd2307a1ab84e89f2ba62486a34d75bb369953181e7bc616d922b9099c56af200772fa5dc2b452e5f51113c25b1b0bd5fef84c121b527fe80ff14eed232d28d81dca945c5b000aa5630494b25fa974d4a20be93eb2fcd91a60728746b5e4ffb824cecd6ed51934de537a7366f12b691d3d3b7a196c1be9443c1145e614be82da4f87c1e5d1e34388630b181432b61471717033b079d805904cd8b209d55c822abb3e91f74d5933227cfad56cb6f15fd2faa36eece58b9b41c8cb69be0666719fc3e94d81e5313442340b06cc2c10957b050861397b996a4f676bdc487592cad77588b3f3e308e9dd719c2aed283132ac02177df02c23eb010e07e9b3302dc945cc33e688a7be29a3c978e27a2562f8b34f38fc1fc096290042034180065a9faeaae84c5bc767535243b59fd5fd3f1cd544f6d4e3faf37980f3a93b91a61ee29351032408711be5acbe595c852859f57489b6159f0adb281bb71459723be972c518bfd8d0604527b6d1e1fc2fd20e1ac6fc06b40bea757fad0897043fc292f00b3f20f3a6e8d210605be0bb1d52c981336225f5cc0fa13421eadcd52048379cc4a764b356bc468d98e0d100c4003e6341653a8308f8c587a791663bc56a1c57548489ac3686ff7c29fc2854b5502922ea6389b12ed529cd2ea6cc8f418c90ec03ec8689011d29f202ca45227dd33aeb6089be3959ed0691f1336aa27a1a8f7467b792a784fb4b53e436ad74122c4e9d9b899a5a9ee524f4cdfafad92004a2dbac68875e8edf328b5bf23602a97e69668b6e5ff881293fd1c5e8322ced9a2f174094d35bf9bad1b13f1ecb82504dcdd400c3b74f6e75ab9ec00b8bde547e9226f5559f987ce793df7be83c58cd11ce4ba1e85974284aaef4bd955f73c26414b7ea9e2a391a287996d86f9ccb793cd28d7213f4a09d80ca1031cf273e70485fe4b1c548f0b43069d8010fc46c4ffe697b89251effaeb57a91df55333a9ddaacb1754c42c54631774b0a98b81877efbaddd9a463e817dbbfae7dd9a0bf1e2f947978b75d57d8a83d6c0c0ff2ef4ff6e5e6f9996b16f8f56a6d68d5c8bd597ebe47a55d0bafb20569e07284e57dd8f7edd4ee597110642ee9f8b4176d195ae10a39aa5de0d7c1ed15038a847e4f70623120406584cd0d9968de400958948448c0449875aabb0ad9e4de81432027a4aa75cc08ecae792fb96461a0fa9ea32ea6d32817dc171b0d56c5d67367180a466418392b5f7dbe5c23fb41c473bea9daf85e2ef9a1aa4831f0b2aeee4a8c62d8d0bf7322e5c9e0cdbfe569bc8440259df9dbe46ff7ab607301855ad4cb01a29df89712114d5cb0fc85c9286cb857651b976d5efe50332da3bb02cf0ec3a3c01fab252acb9d88526f0be8307c33782c5f33519c5f1f85992211f81e62581c4be8790ea169d1e34e50204e62ccd44a6bc2ccaaeef5966ac295bd7bf558a56a443c3f3b5b01a05fd739ba955045f01e3e8831115e13adc04f4d836e01023d7e67095d08f7a7efc5629930cfc6fe36632cb47a2453b374f77bffb8eb9b7a87bab02f9964c7ee73bd70a2d43d087cc097699fadb24c7959847799aea3d5d24534b29a62b95a6636c3a61cb4c6d5ff470fb214fb93633012e8345b7efc87208610a3fa3c480d858f782bb4318c3528866c8884a7c645226df5b229c68b194db408b41aa35d5c6199b1a27ec9930666e508b427ad833e22c347dac48d1e669d1e985e7a6bc8643cdc0b096e20da85e7971ed73b27961e88f5fe6c3001d771867f3b527c4c82eaf1d2bb6da54bdc8826b9092155f69b28118b5672c2f42613529e0b757417b250b5b76c827ab2113c5dc4d6508e834f31f27efd141281697c10e140f79c8140ed40a1017cb740e41aeb095c8f259ee8302b7f9ecbb0128fc5873ff4e73a54c04d6382d4c1ffa53374c30bffd331a03edc3ae0e2d42429da23957767e984bba9c6f5c2123ebd0533816f4b29bd020496623ef1ba84fcd9b9e1daae3759eae9175c85dcd03632437c806ae4a6007cb0562150458333a62d44e871f7d43da09b91d81c6891749fe6a445ad30497d34056d434f746d3eb89592a70549dcaff265a76b0e35ba805a0c8775ac20f6821c06049c725d21599a62714920e8516782be68d2833c7f207fd2e2b37c08011e298caee601a22be3c097b482f15e84f09ae79284368337e5aab78b19a4ae91b36d2dfdcd2796916872f0e70a3d123b98fad97ea045d8584eb5a2bf28856808c77e9caf9e5468329c6cea1d789350a8eca1fd1a53b4249d974356a4d0519a4e391912ccb698deb5326c6cb899676084a0193ca6d4adcb1bb6c0055ea0b87f5fe886815c558690e0ad6db139a058c01b2d870fd58883c80cda635719842ecf4ef229a8776835841c4b18bd0e043738b2fd8c47f540bd761e29540343081495e29421b460a011d233209317383224763af518b7563f8f451d1811e3eb15b6281b2c79823d9be46774639754b3562a8d8075205a43b1f115f1f59e601b7617255adc8872607ff72dd704a64bb583e524bcad93d56584387a3b77676b2c61b6f675b708d74701e05b011e2d3256aa7039622fee019b5537044414004c432922493d5b9fd106db5cbb0587826f49c5b7f70e93bd277b2d2cd8b964dfd689df4816133d7395e439b599c6a280637a1746a9e49581dc1950bd3ed80ba02e1051da955628c4606d175c6e3b03704788e272805cf425f9b972f1c5d992af6e9b63932e5c00e99c4c62aaed30bb1dc4b4d5a7dae6c32d656561d8529aa3f2a1b8374c82d904d8b8799e18d86add6011ce2b717aa337802766ccaa664e2bd3ca34fb93b3bf305468500509730f801b79a4a6f726bba171dbc34053f9fd2cd5d58f6045aabf34f74e55ec6a2c0072520ede9515b5553f4d584daed2ea2c536114eadecbf288c97efc16992d98e202158677edc0f2de0cdb60116a672a64c754e3de833b4c8f9ff4edd346ce2657347836678197f5a52703aba4fcfd3e047932a349171245b44d63eaf26dffca06980bae401f22a5b680de39b35fdb06cb1d3f20598e7cdd21c4198ded8c56bb8f687d8c375130237413f5806c4a81e68d79baf032b831175a7f05c13cdf114ffb0220101540000a3ad9f733d06c3137165d2f48a226c60624fbf1fe63fbc8c67513307589544b251361e0325a94638c890a9370d63e12561dfc632314bce51bc3d181ecbd53834ccbb533b8b67c79cf2c9ba4daa28b29af03b6178c8d613fb8a3811cb10bd76aee852bc99eb638effb3680f8183f16f1589c42bb93384a642f6446360e8ab2344c880af0a7c2d1683dec809ea22f30c5d3224aa77035671d27d3726383cf9164991328b99d99428a1def3ee3a47f02210ce0c92be2752accf4e60516095c2b1d1693a89612adb145d309b2b82820579fedc03deae9990d5a27b6bb2ed23d2c9405c73dce6e4cdfa0104485a5ed8956cc3ecfa576641201c92a026bd79acda01781b0283501722ea3a3e3a375ffe6a8077d958eb8a331f0870abee3d80d1711ce92286f8246991e1151e2d2402a518abcd23076c44428f0d9bd48a18529ae37eabb4c8304fb5561d0563c52ea9ed75642a2409b2b5418f090ad9b75e86954f642fe149f7207801bf6709cd563d6b41a0bce3434f8613847ca807af894a1f9e437ce1341ca7118b2a8a5057537f876f69902b2939efdd02d406512a2643019af2f5b7fbb03b350c5571b2b4e99d29201ccd58ac136a1253ccfc438dc806c857243bec155654547886eec7bbf61d08f88cbf9de49ade9ba6329f71a8154ec0bf4f2e3a7a491bcfb48b433d8be56a227d5493fcac557a2dcaa9b0fbe62478cdc4de9e4a566a9486332196392a4e82b580ea33c6a6baedf74b106fe099b8f78cfad7d331ee2610ff324192d10210cafdbf97ddc58985d9adcbeb79d4209caff8565aa8bbc6953c035ba522d095f1824a0a8cdaef6d7214269082063d7a71cb2428f4d34e81a4f29d09895a5a9c1d7daaa251862668f4c94644257c26212f5d88fc44f957c641df279a39acd38d4b939e71447c51c17647a94aaa4fcac2410963c6f36bc755a2f26fed79fbfc46abfe15e7724305e15f782ab4ce1b9a1bc57a8384829503df923497ea86ba74d23614c73eb3d8ebffa32401d7b19c02c62f4bb2a7c26bfb486ac46af4f073baeacacc0f0e6997073bf7f4388f085c20f2b0d0ebbf9085983476fe850ac46e3ba00abe579054511172d0b29055b2523dfca1d3d02d606521a60aa7a1795b4bc7b8f8679f89544e99bda932a991eb2531056b9d181316c28cf100f90613df40a2b72ccdf9aa7e855573dea8c8ce2c11c54b7c81d7d10ea0bd2a64a202b23597435729e16f28ce7ebb5e562f8e76e5aadb30636af8d2a535f2efa354246e6f6e7823a21207476159d073c5a452e247c2af92c7981021f2fca6e6f442be0d9785705daedd7a58b37b63a3b558ecdea9c91dd2ec9541d7a76b652a71310431f4e9deca61d4100deb05c68553fcb2168b2d78fca1f1a6f92e43e98dfbde1edb0c682ae7336d9685f6203c19d3b41e4a48223138a8f3d63d4673b166dd16e1a14456c534396ce3de482b9e4a10d08e0188617971f45062aa0079f65920a618df39ef913acbbea96a38c98da197980bacfadab768773ab1f2962b1ef328ae6bcb20b376d1c8481b88c0c7db89796eac8af5fc1cb58cec11951f17706563c885ecf9d04ed08ed74a9ae229dfc4038dac8827905b1a50a74007fd0fe083da1f16cf3cb7bd678728c564e34b5eb595b35d7b9554ed6e3616f7238b62f9070e42f776bdc316c1312253432a3fa35a9b6b6829569f30754c091d6c452f84e574036ea5109f7ceb2fac9b6fa400043eaa8519fb8f20f2f500359c1a70700597ddff9aa9cb2f08946c2b7674d38169f885e7704ebc37b582021091c1e00231e5f600c8e84649bf804db74526cbfc9abd7bb6f2f112c51a5978d1939a73898e2bd91237368dda22d1572e66fb0cba9a9e4285b31aaa48dfd46b86b41865fffa0ea5cdf1bb45f277aa022e02270b5eebadc69915ce411ab5a1719b9a609898c46cdab4f7087c84e8c8236e9496b7c9855eb945d40fd996746170697cfee9ecc5b7d6f63a8212bb10e41285d3cc1b9104437afb3f340d07bcf97d143133554553d7c378321884f8ad109222eaada366082ceadc56e9a0d39a3a5955d9cae2a7edee0d88f2808f8903fadf1df616e2665e9b28d4156b5be74516ee9f5b30d9be00a7ada7b856e162acb7dacbd07f28ba0272c06191b3c4aeda84bf406fd9af6b3d14988a581e5a02e591da2910b64992086769cd4fb6b05d8cd065aab53afa3a26c6cf23cb4d825d64720d8713e720dc828c64c04707984ba10f6c71b0c7964be941a8e966629fd4525937efc9f95649c7ccb3ae9dbafb76a7d0a2de1d6a5acac49af41a4899d7684bb8b9520397a9ad22504fe00b20cef688e225067766ea6821fabfc463a9906a0e80e5ce2a1082dfa76f314c68b5c6107c3bb502cc19af577f840f5ef66013bdefc22256a3c16e050a92f8bedcc7dd398b9233f805231f98833c7a43e0bab6103072dbd37324e4e2719a9e179610f726c1ea28dd0595153adcded7cc7e3ebe795b738b00683f30960e26115b6bbe8fe51c900070cb5b4f02f696b86951539482c1dc09f78cd110d0d4ea47e1179e8825fb9f5b331dc31f8058c535db46f2fbcbf81200fb8cf1e1925b46425bf9ccff08aa72c374a888670d82f00194e89104d00e191640ca70646efb85c4f83e0dc6dd2eac990588c089ed1af7c4850002e6d7d16c37087f61bc440c328ea07b9878769603017b174c3fd763d93d7fc420349bb4f97cd0aebd87168c1621c92ab88d072592205c820eb40a8c9fb35d2316d83792b0604979b2905ce53ca8669e40b002e680075740c4308aec370564dec00ad86da32df054211420ea39bc1233b62f36d7668df3b4ba80c19d28fc94d1b399fa2141666d4725f247d41691d7c398a386cde619c469667e4292ab9a33a3134e88db3b400dbcf522b4b1c028dc51d61d3ad645b59058d99d44ce06efb17627e37b7655ad711bfbfcb70f8be332a01280817cc491f7baf30be8bc3ca710aee674338d8633b7fb65312f7819a76e84a4c1df716c41f91a00772701ad5ac766983b00f4c356b4a98644e387d407ee44d39e8268043774c8548c457a0d89d14bf958677e5a5ac661d4b5c69f8291cd60a6789a08d549b81d793823b5afbfc0774dc4d16ee6d607150b30504bc6c462f8849b05a9c95b2308d2e054c9db5374dc6bcc950b2e212a91c494e9deaafc2b6f0425644d4090993adc75610720fbdb939fe3e6f0f88760d29bdbee41faf188d2fa4dcef1472a3ae2493a9e00d9120c54ee0a35bfd54fc49a8b89e7d5488da8f958c4996cbd38388a7502153db4abb571ecbee7e37bae84d58bdfd5ae358a3f9033db0014ce3fd5c13d7b69c35849af651dc17c64e84c1c33762d7735bf623fd5bd278363f59984215313ba0674cd5d04a331b264a8319cc5be454a6643a3ef299f00732aa972feddbe35780f3009333febbc86ed823b0a65b481555870d7d90b331bc9d8feff9bab899015c144e989faf7fd43a07e3a17f174b7df4c763cafb7b79376ae7e9457e9c293573f99bb84e221f8800faafedb26875c3920a2104dbef74d4e792b947c28dfcb8287466fa332f58d36a44e7c70b942050c80d3d97c3da1fa5429dd6b93e8721dacf1a71eb87e9b7e8aee57eb869ea6ec1ea39685e116d9a4ee430e81571d0400f7ce5c9d8eec063a5cf5d6a504e763940aa84db193860ebd481ad845daa8368d1b253acd317da9f275a58959fe60071530f3585725e75d0d771439dba09516755ac0e02f1e0409055baeecab3426bf2c9f0ea0075f8a8366e9b4d6db1300b40f44e8bba9795b9b05834253293bd44b0b81edc4944cb9fe877650dd058ab06dc26ee7707e450e6f68129599f9406f2ae8bff3f5e06ad9b943590cad277266c5df6849881965fafdb5f5ddb10a654941859bb1b18654e94ccff373f4eea305f063a63394c0f5da23ef75683c554ce1aeb20e36687c59781561d9e0c5bab41450d08423528759badce0191299674af7b921ea6c506716535ba73b19778c40924f2bc874364eba29bc1043621077a31694fcc1856dfe4c0d257bac060e42a77a84cd6f4cb11c476446061dd5e68a75fff917b3648f012e0be91dfa6a127eece8eab590993b67421b2d6c1c218363b3d3d51848681b9883cd5226d71ffe11fd116d300c5310f5f67719b27492eebb5ff2fca50af989f54dbd373fa4ce6b69f1a808b2a61700e6959e1ebf6ce70412c40d9338468ceeb79eb76a6d41fcb433381bc9ed075315c97799ada270fa54969b00eae7d5fca97dbfed9f7f936a7d27e6f7767a3e035e9e904f78b5720b2d45141810d31f39228df83069b3256869c60d344550f483d04e7ce64723567e09b08212dca771b7ea201171b26c0127618609f2f803440c7d0813ef1e4234169fcb2a9a3bba51d935e193496309650f9caf875e8d06fbb98fd545be405ad3985f0d815fe20c2dc314b6df049c2c3259cc498b5b23c9b8bd824086fb6806092f07b3fe3c94901ebddcc660310a2f9cd05ad874fe825248da97b2c3249018c2f091e8a7821ad1efcd9095c3d7e2f885ee863c04d7fbfa9d474d0e37c7e25026220d0ef3f9035712f9b29d098a0016ebad27e977a25192816666f2714f68899897369dfc317c80438ae83d5513504e6f13ea30f2414253666e4ba6b7f4ed034d9222ab2a85148d2924d43dbaa3987b5ea9e8b133b1e0b932acbbfde58a5b50d364dc171c7d0832a598a9235ec1c079320fcb7130d7622504ebf291ea9c3211c7e9baa968c26027c1d55345c439c4f245f72c000f384e33062e2630d2a941438bbf33d92a3ee84d163e45d90d6be59ef73eac02a06700f50a52df2779041ce4bdfde9399bf28ab286cfc082f5b2886aa4c56bb3f2480805222fa4706b498983f5a83b505f5be6f74ec4014bfb7bbb0d1fc242090564b898a691ccd071ac1ab14d6e1d9c9afea7b8668991fd7a893587204b43074a943d4b8b96aa5e73a0e2da49227eeb69b4ab98c3dc75d5e44fa232c9e2ca64a8e26c46e7225480165b6529880ca2da40b0082cc68d5385686b4bbf074d43d2e23209ba3278fc9d1aac01cb9ee926d51c390072f63710f2e317a30821551d8cb7e00e4c3f2ba08ab8eeda4569c2c831891469c934203ae0c5fb52780912fa84073500aa178420a80ea6a9715af04646177691f55a2be25fddc9a9b120d526a995d10527490c7a1914ca70691a2ff0f6c99b2f2a90589fa83f3b992505d8bcee70e513c144474b63109d0321435930e9f6190b8ca978795fc7f2b4a2364f524ed754825e2782d5ea72722ea28184efb8c35970b642b65f25e13e72e8a1444f36542b1a6a8895bfe3f77b9662205753fbc0d8257da71b82ffefe7fb5a42627c05184a6dc1c8d2900e5f586d21d08aff5d11f4fb13a636482b990677a6f908a8356d8862d00b95b09ac624b3d8b05f2945da73bad3863568563a2b99dae1e17a2d80de2a3905294fe1f0d783dd60fbd6dbefdc33e2a96d25754a944355adcadec93ed94adcfef2f4aa5fda624b32456e3c3b8fc9310ac8c9beef0da39e8caf9a8f02f8a2d6284ac4722c04ffe1852c2c358481705fb19bef04493de59b23b6ab83c096da72218576f5e27299d9c572034b32cad1a306e3a0bfcf5a56a2719fd50e66a088ec40f3b852e98eb2af1271f03aef7e45dc35becdf95012145bf44516df1290df48c420369ffb6e91b2aa0be90cb44b62d166fb824b108644495cc82d4e0d2a1d45877df301882fa4081a55038defaaa92c803777677c578c00b60269dbde4f3504be3167831ee5a8886511bf109038dc3180ea22c4d397c48e9e60eca1d2d46adb21f3ae828428440224df3a8617b4c887fa2c55ffe877ae9bde2a5740f40bc06d6e630fc06e2c7f5b8fadc6bd3b7cea6d8e37f7e6a354cfc7a6c168eb854e4c4899210ea8278ed2dfefacb7a15baa88c1624ae90dbfd49cdb344f87d40b20fd16ba705687b5b51d580d75f97e390b19129724845cc3c55d3c9c1b017daef129956efcda6c8ecb00270a19403f327dca5d8c50f3e4cc0960ef0a2ec34a251cd48924a14104621bfb54799afbc7d6432b32ec424a98785d7da4bca1f698cb7727cf2cfae88680604c8ea8b7cc53e4f75165559a8f35fb1d361c7610c0502717d371b5d3dc0864f223ee9269808387515e5c5a958df37c90bc483bec6d275c0eba041b0b189668078fb2f0f2df44518ef8584b35330de5cd3927c815a665940e0560381b821af835023dd1fbcacdcfc0f2aac0d7f7ef42f4a4044b151f60bf8eb0980f471b1207ddfc4279b7a211ce187a6546141e462bb1100e467e4e3bf6c1419d5051080e0662027a924b803043ffcc11fc344b19e4b22416b5e8799c9fcd70a120928f3b47d2c5cb22692d1200262d089e9fa89ba2384380c6b7a09997bc5e78f67a64fa0cd4adf6ef4705c34657aedc553ec3e223758840b3b48e23425fe82a188660dc6a7537f3aa621973e4cf3b4c8db0bc7b30fce2b7884085253c20c4b24a6b5a61160b82e1f49615ca16d0cf74a0abf9ca28f5254d03d26b880cb47c5ac199d43794f7fc7f1b6a980681d080e14422f0e588fc383c025c1677c258425926a378a206a03a9019b184a86e7a3f95be325e359e613592800499304268b0d46db897716ed15d381e04d6dc96c24b6a29c5247ef8f8b71167b29d2b76581aa9b2eee1548c0027619440c062c62521ee1b0fc15a23bb985cf93dca0b4eddd369a1307f23adaa9f2cbb88cb7b49d5ffbb0309b21322e35ea347bd7cbba2ec6607a1b27b16acae3500c21b04f15550cf6220c10766531539e79ff90f866e93f8b409f31213fd1b113c20a9435c60d2e085b272627f489565d261c5f92ef81f34ec05af7b08b15c69948bae87834f90212dc1283f709d411d875068ea6473f2e1c2410e36e281455eec1c2998e75931cdcb6513f8ccb099be8bfce4de017b0131383b6fb1dbd0eea185c239c8e33dda75ba749ac362f4957b8bb5506ccf773323fc8bf08a5bb4ac4f9d1545910670040e66f88f1ed6ab8b43593bfec86c08cd9e40e1db5a043edd56aca85ea83878e71a2f4166477216e2c4e0c290b722695d773c3cddd0385644425cbd7c8c6ffb942789b01e7280354d41df25d7bdee59a18aa079b15b8e327d3c3983073ab726f2b99717a6b0ba019d10362f4d9816e1c18e406699d14159dc290c8c58957c42d6119ec41b0ae6c0283143d6d02b2b9930555a82bac728f49a1a19e5ce4d67fcae26ae80f9f4425602c60a45e5e469b8dbc8c50ef06a8383f7bf2b3703cf24cee3fe599416132ade5bcaefe2dd214a91fc3621af3f7b8d0784fc718a32e5735ed7fbae5f842f85b8d761b6c66eaa64e255058cfdc2e251cf31a6046fd2e598592705a0dbfeb1b4265f1cc5b8f01bad3011798fe658daba8ca2cd65c9497b67a9e6d71d2f2874a8f8b200ee6379d96cd5fe30c8facac73b631ba647e71406b02608636596542bc032fed518b3e5c6a9d61e91f288b8edc8a6a44483adab16a4b74e8ed5540f8ece1057c81e6360567e4a736f2aa193d26fddffa1f97d20f0fdaad1d92240769d55f95fd9beceafe0f89ee3d225ccfa5fc7b955ad3a885a3280afdc36847d61b26267c193ed4bbd723bf64dc1baaa2ba3745aee272831eedf5e40f8dc14fb053a6aac72c2355516c8ecd9c250793a6e6e0f9133422058f37a2252cd34597db00e25bcb78ccbb71cf8c9ab5e94e7c8c16a99f46bd1fd698c9030f2a5ea578bdba550e25a2c9ee8ae105d530a26230a155bd2403d4ca0635d93177f1bd55d60b4317e24151c627e0a658c3d7ac38a005bf61afcf2a0ad03fdc609e753f4ae467edfbc88d9dcd6da1669be160fbd41fcfc900756b8ef2267583f572bd253645d9643212367302e3655a4a6d9de7b5b84526a28abeb4885d895627fe5bcacb802018120968e9ace8122e1c74b5931d81799cf6ec11180995d12aeda599e79eacead0bc89c8d6a1cba2c035db699754150d9ae8b3f45e67facfcfcb06610ac49ee93b06f1bede92d7b73ced7dfa2b3357ef8dd77237f62d33827ef47e05b88752fdbf0d601b85a83c417b3b6b85fefa9003fcc38a78aa07d97ff1c3e2e56325f21c9f8ba4ddc74b0226c121c595abfcf2012e9f538968d6bdfc06a7851f07462d60534e3e4a679b23f221671b75a8c88f40ad3826d184d7da988d0fa5dc753bc53a941f7abd3678feb2cf01be3beef8cca878e6e57e34a8faa0e22d0587b3d6c9a89e38e459efee759084a10d097d63af4997df34d31e45ff4f483aef95dfa1acbe511b07024b9ea8b2a4dd94cf0077068af9ac11580c1547f79bc381365b9b609d17ee7ab8528592193e9c9895c81dd0fc5c7d83541d596e7afee17c4d20f49cbab0c24fce13c78acdac630ebde1a6b770dcad4104d73b702996d15eb1c11763392312e581be68bc72df19e05358c4292d59bafba0c3a8afd221d543400965eb8f175cd279085e51600033c0b07b4e6db96542973e8336b0bff15b47340e542b0b51308c9479272a23b9a66708a889bb37b28a1d4a1bc1edbe0dbcf02b6d1e24e2645d9b44e21000c2d74d975c6cc4e8e7b99f9b8cf95171b27402366c1035e39eeaa0e854d4831fc5cdee34bcaca9a0ee4171a67a137dd7e19aa826815a69af58804e418257266c89ca5fdd88128a57a94b504648cd605b2d21b2f894716c68a138041083c88bd4789e80d174df410a2b0c2cb8d9e01c6a0a030ed600a58661115c9b016851634065e1e7c1a18084e7f01b8b21c8f3f4cb24182021b75b398c6e8b02643a52972e9bfd047f0975430a0a1c24557087bc346a5ddb2b2dcb5a77efa717e8088f62351b7d2dae0fb0dac9ed03d82818d3204fab3678358c80c40f6a88f3822106f823939eac4855cfb9e8af3755fd94063d93a8025622e9a3508f4f7dd3c58dae396fb0a46af4b9514b710f79fdc2ccc8beff22520e222a9ca6e743c250d8de832cd2fd06898840d5fce0d13c61ffd6c682f6ab116d9b4c8c6dea6e8079277da7aae1d2bad416d508fc15285edc85c11ab8e697a10e9f71b89752087f7f4ef659158aa98fa251046e0081a7bd1e371efb5d105267cc50ca72cefeae8c5b3cf635ee3f1108c26c6a2863d3d0798ddf021292263cc283c2ab8b3926729cf54c6409a4c2465e4109390f01fc0d048ad38e9152105809291d6062fda7645cce9068a4b2ad47c14e098c7806122c3dc8b4d560b1e37dce35fb45f7b0d79f763b920264510a7ce2d14398b0fedbf709e7e83f6d62af014f07ec59fb25217befbda59452ca94523c0aa708a3087065edcf53dc8e68c762e2537d11516ca2c55741225fc59def2833d23b3bad39d36b3b1c907bfc288e00391c8e3d7140541bf7996aca44e7a7da8b95d6123f9ed6b891055f6e14a27d779f968409fbc53bbf3ead42a67fdd6e98bfcdb81d51f91bf7dca7c5b8ba3ae5438dfa2e3aaea30743681304967b4e9483ffc4f75048a060fb3fad51ac278a2011f6f1f3b9589783ffc44f28fa0fedbe5abb322c2decc76e6e19fb7123dd253e5446c90a2b46259e036b8cfdd1c4e72e41890e9be05afc4243e3d13d7af402891320ec08d1f8f47c39c21a9fe8d18bba4db4820549e83667543b557c6185aac80c184fa413dc3d7289627ac2e9726b4b9bcbad2d54b6acb9dcda52a6b565ccd52eb7b684b9fdda0532dee47bec34f72e7f92232c74db53a243b9b0ab5173ef6e284c7c508ab8b28b91fba0f41019cf07a5c9a852042bdd978b95fbc4bb0f0a13773e5543c4edad08a37167e4ad888cb9cec9451e7748b9be7ed51823ecac288106adb870b95505122efb7fd083b8d0a7193bc8c25f7613e1eb65a487eb164ac66cc4902384b091a694ecb27b3a5358e32521363da3aed5de2e3661a7cc6a1067f31c93eb9c1a657907c746ce0d1d9842398e1d4fc146f3dce09e540e1c004801eae0f1ef712e477700601574f8fc0a1c64a1f31d2ab8e7d33f2b700b2cb8b003c883413ffe420bcec3855601310c4131bc10001e5048e532c0e04331345100b848480032180dc11e44eea3c8671040d360c435f4e81f3ef8ce0057340cc063ac018783e267407ec0a31b64155147d602c53337c629e784186683bc5145462985145248218514524861a66d2c15d82fa583894c1f9f8787a2c9eb1e3f3b5ce0a0f85f0a188ec5c9a9393a5107e5a81dbb63a3de80366e0020ea985f218779a7b50a26f6b12be4380ba8de6183bd9f165c000a7a81870a861802202483e4f89e4e26d3b56dda956d18765d5bbd28dde625b7b8399157d442140090d10b3d543e628842340cd550f4c3e8fa58d10007b01d79408e820821c0101b8814b9a100468e18008703e480001d90b0922440014a16c080062c71c00320c024021298c00e14f8786852010b5ca007273e60e049067ed000101be0400782f00084481f188288a4228c384209892494882205044b4c61a289105071e2091154190109a0b05202134471458a294e8005055464d192822aacd8c245052be8c28216b8c0cb0bae80c19718c8600660b0a0410dc2d8200b2dc46c71031c7091031d743166073ce801191ffcc08b325f9801e30c9a1610d2044108435013861863ac2102194560538611cc6873061a692c1d01094970a3842530418d2638a19fd06f1a0a1d855e03e90343109154841147282191841251a4806089294c3411022a4e54198193008a68a5046e8228e21529a6a827c002e46141011559b4c02d55f32d4bd886fc2d417777775bd1dddddddd4da5bbbb9ba384f106a5f60bc64bce8b5e55528a65da663a599c1c1dd48e8d1b291c29603c54ca1c590e00e8f84ea31c5fc83c38f8860a30d5367ce20ddf5941da80281666266fb4b083ee481daf6ad406d0cf85a2392d60dbb5f3820b746b1d1ba05c89b31901d2a4a41b679a66dab1d900e5d65f613332ff92dc052b6a0b221f5361127b41a33d9a8ee9faa732472b83b11d463969bdb04cdb4c278b93a383dab191d262ef5015f1206c0ec918dbffc341f0b314aa6069b1fe594f0e1dd4ff6a2ee36e6b154eec830357d0711676e08e1b1e8e1f1e6f21870b3a1a880b52815f5881c78e56fdc0e002c7100403c0c385608001d88e3c1986888ab4e65854580118f5f0f1450d3d030d3f8450c38f159a3b006f003f803000204741840c1962830d448864453ca12dd5b394ba4193a191a431b455f7d0b04cdc336205d1111c88b6230f8703e480001d90b0922440014a16c080062c71c00320c024021298c00e14f8786852010b5ca007273e60e049067ed000101be0400782f0801050903e30041149451871841212492811450a089698c2441321a0e2c41322a832022e24e00285951298208a2b524c71022c28a0228b96145461056b8b55c10abab0a0052ef0f2822b60f02506329801182c6850833036c8420b315bdc00075ce440075d8cd9010f7a40c6075ec0a0085ea46006647cf18508cdb1b2d816038c18a0391383edc84383a6058434dd1c5010a610c2144398424dfc9e623bf280d48421c61a22905104366c8c80023350d01c121d003913f7fc0c349a8aedc81382edffbcbbd44760e25e8b065e6ec6681acd0a2a9d8d4646d82970ee354cf1e30e368acd6486baa041ee5c6ea520e9f2c6f235d628ce2bef85379bd9a5d54adbe115e5c53f4cdf8f6b24da26f4c7184f6cc4ec13a330334f57be6c6971e32736b26d45763f28658512cafd341b975b5ab0b899d4dc3b819d382eb7a8207333a939fc24b7119952ae5cfab5d60a83c08cfba05c4c3e775509238c4d0051e13b0fd14810d77bc862527d236a5871f1f9ad2c665ccf008e356e8544475c6fc4c52d2d52ae3bd6455785a19e5aa0365498397aa4cf4e9c2e4018c3aa7249154ee95300abca71992ec330f646607f3d275d6f44cf8acbe5569619780672dc2738aec7ea3e3b2b2e53f2c7872eac2e2ee97a234c2b2e535e8f1d8d6175714944f01a2b2ef38da02b2e35be3c42002b2304b0e2329f81a8c33299f4a1fe939e7b82dfa2a28c0bb9ee3694eb5d067aee131c1766c0ff897f7d6e6551e2424e759bc61d6843764d91fe94dd3397732be7c3137a9df01a400c1f12c146d7ffd3e1c3937a4f495c4ccff3fc39b21c3852e0726ee619d4727034f48fbfc66551b2aba41ccfa57fe37ce8ee4ae1f44e3a4b4f52921176e79fa42eea6ddc7823542b2e393aafa45ae5e88cf855ca49af71717c0d6c64df9f0636c2c9d179ff1e6c847a7f2336da31b271e3fd89d828f5fe436ca4bdbf0c6c44df5f888d70a4f0fe31b0d1f5fe30b0d1093e0298873fcb3dfe82d3887127fa091701ac1247204930a1a0566a092e1360516453f099939fe0b27c08085603c702614f589090729092702c0a94947494947270a8983205e553a8e8e464a95265c756b182d2d172e58a8d7a05cb0e2a055ab4dc885ab4741597e543ddc5bdeef17597cf52dc385c0e2e057fb4eed25e76aeb8145787cba2a45ae5f81c2e8b52d12ac7a37672bcc5e952dc0ff56a7f83fbc15eed6d703fa4aed665c9d1a57ca86bcf594873e2f8b5eed15ffa0bd75e749929c678f9e2f266468231cf5034b57501014b93054113c23604939a5318560c9c3172d6e8100145c64e116cb0b95146ca0838cc48a10dcf193d68e44803004b3a8ef048e092d0b95141093e4b5881092ca8b1a3099e137e9ed0c21b17a0001485202de37a8d1790787c4035040c44c490148022848c90e188212522248a9210801246517a48f101821996a0614a0d4cfc68e28660a5659c5359e28007408049042430811d28f0f1d0a40216b8400f4eb48ccbe183967100d0f15ca742c6f9acc0c20eefa7051780825ee0a182218600a4e04fc611a5e04f2bd12af858005e1768292058620a134d84808a134f88a0ca084800455f56503b366ea470a4c0a3754f0e00e878ae53c167051676783f2db80014f48206796430bcb9450a7004871c746025400903963ce0f4191309ec7003464a2d1fb8b9f1db4d12fdc6936ebcbd61c05f08cb8d885fd9f9161cc4dda37dca852663a1b12c34f6eb315ebe7801c342d73da0b6e25e63c9819959b3f206199b3669d49029c30517ebcfa8cbdfdddddddd9d7499bf9e72f9bbbbbfb02c302c333333ab847cb2242ab00e615be9ce5255f4802caa072e719d495b2439b0ddac0307edc0b6bfd690db4d9d921d28c04154c067ee8310c228a6704cdce32a9a2fbb13c99ab3b8dcaa8114174917d0e8728b0645b8df93fee17dc5bdf831e6e08bbfd09cb153c2c47b00eb470e488c50763c43a05cd931ec326474c0542cd70805764f91996e9c6526471cacb9b03f26b37151046cb9c69c1c841f23f47fef7e4ca609134e3772728c5d67047645e017795d6ebcf1c890df6fd2438c8da414575f5ff97a4bf401e243dcc2410eeab54959acb9f4db1fbebc2c1f8ad63e8dfedec55a5950d8f89dad515e91559fcbad1b68b90f74b9b54515770b28dccc371de8eb40b92dcc5ce7764424a4d5c5714bcc9bebdc0b9737c88a7f842d1417227ab3c9c4a0b91c74b985032bee31e7b8dc1203e67ab7f77b478d83f8fb0519a440aa2ccad0f70a7fe8c3a24bbf222095900fc518ad54baa63bd63ae9533af4558d7e11a5944a89e2c657e243403ec4ad2cb05cfa2a1fa297b2ec8d83e0ea79d321ae6a17841094d5482dcd02c39f2fe7f2634d94f2b672e1bb0dc05cf851cc96dbef3fe5cab9ca4dc4cdc29d392c29acfc8d83e0570eae1c00360589b0fed960c7ba62a556395f39c7ed3fe94b7903336e8c5db5eecd871caa755c6edd60cce54de320f8504628e5363948ce8d524a4ddd6990f3f92c286c57ad8cd7fbcd72754108b1aadd749765642ca5853dbb2453ec97f2ae04720f482554e444dacbffd1e3444b525c0f0b487347dccbc13df99c42b2856df3a5964035b503f24e5f52fa18770379f563f46e0722d7f8a7650fdb8a7bfc45d248c96ae40e94ae944e95546e86a43037bbc262a5e08f3cc22253e68c7497594cb9f4bdeb2aaf70b96583316ee65928ddcad1db57ae0809d10a24c47c3907351032cfab1752fade1b4bff7b1fef8b5bb9799de3811cb4e6d6af5d45f2045b2be5960dc6dcca5db7b1602952847e11222c176358d3a4fc0a89bc2f957529f8239f6582a553994c6bcddaef6a8578ac1f58967bf3bf1ecb1d813ff3594fd83bad0f5d4feb6b3ce6722b0c1bfada111f9a2c26076d075aee7cabddc964eefcde6e9821a906b71f880fcd9014e64e1b78b9f38bf8906c1e6ae69a96414dcb9cb9dda5e913c2a5dca23bc7284d9f1027de86f8a99bd3b439d1ee13d3e684c7b84f4cdf57e34ea72d08a669bf853933afebdb8260af09c9be8f9a6abc098998c9b76fcef41b8699e076e4a4e99cd414b73771bc717cb32d08f6da67dbd1d741b2efcebeb9eba536398cfbea47ffea2a3666fed5e24c6b5a58811ed01413e5cee9fe50459f7dfac81102b877840b4ac6f987534a1f86cb2d2cae5c0723c6fd54aa22eec9a3ee80b827e50f25fbd92ba5122ede5c296536b54e81e585f5da9452cab1a0f0faed7683fff53eae0ce55ee55bb4f5534e08daafaff84d92844dd5970fc446d9cca80a975b58f8e0f636248ac1e50371a39f4f5f94c300c9819babd21e54edc97d5d3f792eb7b028e2f626392882d1c19def123b42b60e5855521cf43d91cfdb0d957bf766ad1565efed343238e54a29bfc8c7952fe59194fdc589769ebfc3f81013a1c69071229d33699ce8c6f3f71a364e64e3f97bc987d8b449a3864c1931ee311714cc0dcefa8f7c1b5c8fffc8df4171450ec47fe4d300cbe571b985859bdbdb510f1c243f83d03d39c4adf622bfbf84b952c6332c1be94e029184a4c4462cdf091bcd97df44b249d3a6db1839df276bda3cc1c2ff54f087b7171fe24b0404d01be94957ca06e38cfd6753a8eb25aa6b2b40582fb96c35aefc5e235fd6cecb950f0424d279f9fd4587eb2ffec3395bb6c2723a9ceeab9f6d3297cf5cfefaca95fc971abd74f9a9fcc93ec5e41996ee7e1f405845f868ee228c165b4c1f14bffed63b56150b9f85bbc1c9411e7dc32084d424ad4391a1509facd5da54eadff35473b286b0107e26bfcae3a4a1701f66f26794905297cd1443c18f5faadcf9d32794d8f1888ca38fe75ea7b49e5a2707e97cec8a17f7c46fac335e6cc618dfb5940f7ddd13671161e57f3e777e8f13f14b3bad13c555cf8c7bfca7a9cfed946629e7d5bfae7a03fcd96ba6c8cfa4111efc5b0645973b1ebc834ec4df7fc80f0de54291d117e3050b951824b959f3a5cce93ab1b2ed48fcec7483c641d83d76cfb40de1f720fe0366725abbe1102d0684f0ad9583f87170802b9ca323f373b61c2cfc49a572b62042f8e2e020ff231c1cc44f371c7ca5435ccd8ee1cfa9efdcea36c47550413a1b0ebdd2899ac7eb1db509b9ea9fdeb41d5d1d8b8a85bf6dbc1dd58e4505251fb5e9105792caf79b45764108b18a1d14023a6522eb353ed4f62f17852173660949a9ca152ddee50b737199532a27802f01624ab36123eea233eb43a8f93fdedcf940a6853f3349082651ad421ead6d73e7a3666b076bee9c1c661b32a55cb9d7e54e3bfef9ac068ec9ba4bcb622ba0e2ffa9d477d6d3b21891af6265351f2fddf9d1e7d121ae520fe566f171fbfe8099ca02476e773c365e07e7f499b448742173a10c9062b0f445cb3dc30ac6023532154a8b95db5728ddee9ef84d9dd658c19a1be3a738863f7635375608acbf7d7f1ce2a45a6f068074c3c11d6ad78643afaeede80811a9c7361de22a653fc3d150512c122dd872a3ca22d1535229d467d53dd497caa34dedc9a5502ee59a68d7d4f515cd63e73b09f5d26aeea150dcd7739ba9d8e81e0ad555f7be26ff59d6dacecee770be1de57cd694be10beb4e3a95a735b367fe7330eca9da89ddf763cfbd5fe89fb8aaedde97c8050f66393a2db6fbbe89eceb3cefff0de8e6c7441745690c49b4ec7a262af4c4c6bf1a1ea9e6433b514c77ac2b2e2771735b8a8b999a675cfdfb2d9dd5d392742dcfabdfdc6a5dc8bcf3263af6f245703be004c8c2d17a8b9f19b4afc4c889daba8ed347d945c45944e2a421ae5a59f9383035590289ed2e264dab40cbb2a9d3242ef33d2dc4f8b31ba00763bcf19bb591da58a2851a224a1944494250c60c0922552b24cf6f5026137840d9b9f9b33f27b0c1c43e1fe17f347937f72fc1c4f1885b80f3aa137f64f277dc44925b4784594327ab9228a762178d98efab38ca9945232d71fa394f1bfa4a9926683f47edba3b289633f6a5f73627761751382fde933de8e268642713daf53e45e5fe97634619683d360acd44ef2c46d47ded532d6f485fb8af893a39856bfbed9cbec66f235b91d651188a814af54ea2b9a47ffb51d49da03afb58b36b0ee5abc4231c64b48ff753d944bb92fce8772a9ec62809121bb1fe114b1bf38a0fb5d2f2f2461506fb32baa7c0832a07bf4bd584dcc5e887fd6650fe5f6f5b25e4ffcd28e01308a561a3745d88aa395c6cd999610cab4d2ac6901618c0f333333ea6eddc52e8913ffc5baf2225fa3b5a54b860515e572cb8a375620e1dab8dcb2228d04e49417dff941b915c9106ca55ee9ec2d5a9f4143d47f7efb997ba4fec3c0ed4f0357fb8ed06c3f9675776b1d1007f5e4725cca7d41d72facbb7ee31ea9e7e8da95ea1e3dcdc37f7e06bbd65a7bba4710f3f00f226fed8038c89f763caeffd773bde32395f41246d36ae47c7811fdaf684acfe283165ddddd92eb49b9b15f642d31d68e0e6117e3ff8013c9126c7767596f42fc4a8ec749dff8f77dccd8cff31ac64d08652561fbd60c084af13d46df8a301a2d1fda783f6badcb9f3308bd5142c901751e07215142dd52615f49d9ec3efa526cdfe632bfbbfbea50f33f94d5b0af4755d5e332787c1ae93bed5093e5c6ca8ee11beef6715434040bbf37239de79ed481853e1104b67b5e73eff3bc5a236482edcdb2740005332c33d07d6ed41e8b19f7fdaa7a5b4564a78a2faab80ea154f7a520e21963bca2b9e24b177ec6ea62c3f8d0e74917fa900f35b75a539cca85ef4968ba403fd3e66651630fe33f4d340f0a960a79da55ae775f105a6e7c0f7cb9b1fbaefaac272cf4284ee461e00f7ce84a562e742c177ebee542f772e17bf630ae321ee36c5a8c93b9f08b97d951da7dbde54230fe03cf5cd8e4ce471d41da0475e94724f7e01f817bb852f7121bcdafcdf066c341f15da97b7419cc233e6c336e947fb9ac990c975b32107333aab15650abb529a77295fc073efbd713690fed522c27ece74a5bb051ec584b58772dee75cca4165d064db80ca3907ee3decc2857b99aba5f4a8d1b833495d6959b41f686d1b4051bf9922645d660facc95a8f1141b85a0723ff8aec53dfef9b5893095ffc06f0e08769e7b49b032c2cd08aadd4a1fec925a2eff6449e96616556280aa563df994cde58d0865732b6573a6cb75755576d4b5b405aa64ba5c7f0dd5cdd0cf30b165cdc2e5564bcde58dcc6c42c6483c67677bb8638dc0c297b44e02c4d3c79329db22e7e3687645ee359b8ce5048bd52ae98c7163a38d4e2952fc99a4ed0ec58db758e443cc19a498f95c02184b9c9d22180773c5dc762f952f2cd7bb7817227de7a40f37231d0f7d89bab5b1b8e7473d67cb2eb6d61d3983ed0cabc669b2093094180c2c9863e4ee6ed5e759ffea4e58f86054b9bd1db51635a82af2c117c218dddd1d0c22228721c34c187733646e8cce71e699bb9bb9023b2253e3dd9b11544fca27762c12d87e4ea3c48776debfb1f850cf2b4b5039d6f4ec4438885278ecd989789ea76b2d29e0e852db7fa91bdde779b2fb54372e71cf773a25ee39a33a9dee5379dea9fb9e3b8ca586adff719a5a299c3d4436dec7464cc2ce2733e6ab4a96a4a131be192aecf530946297314ec344c91236310e71cb4c14d7517e99f9c24d9925334997b7231ffadd7a8fb9e2559d234777f75ac685afc1771f18a3e029cc9dd2dcf3ae67f3b8634561f9f64ba11e20d189a7dd0c4057a7ee08c772cf9fa5a2cccc3ed8c8f4fe45b0ec894eff798fedeb03758fad3bd23cd868037a723d733db8e75717445e53170407f9fb1fa14990acf61f2f69aab9b45d79cd79a2277a4549a21a106472e8e189f3129929e5cae529e54a1931aebf895de5dafe4780c8a187276f5469ee948b0a35ec2302cb5f51d1f5ce7eebfcea7d32f016d71f462124ece7d3f3952af9101346abf40b7abd564a6917f97cb116f910d38339843c7a0ee20ec51d6b0adbb293526ef29913929d2a899da5bcb85e3ce54f869e4fe4397dbab8945239797a2a2166201f8265b8289382cb5b9830f163849a7bde5354944a3d915ed11b1b7f138a5d51ec585258f86e03301cc4ff15c5186311243abd3f139692253f64ed7f4884d3edf0f323e7b33380af4e5d11ec3e5bbb2bc910d6f45f9189cbb8afdff00471f8b13ad129d573ba2212767efc4f55244463918fa2d83cc4bfaeabe3a95254ae01f7a98a688c53462923b389453ec4c4b8431928ae7f13242c8a6c9511c5e5cd8875cf51cf413efee3ef233920f958c7ba627daa7c4f0868832f61e79384085b31ee9a14beccde639447f85431d5c7f3e9d8f15c9d93be4edce973d93d662963f4587d3c959452caffe165a65cf72d3818dccbab1284e4a0a49fa5c43d96eea9ee9ebd550e328ae87a20d5452f0b049f065524d4834a390f940a9539e2fafb1853bb0951453da8d417ad712b3d41c4a16395c04638e79c4b605b9952df29331b80aeb08f5fbd955e58a7823ffe49a2d8cfbb8ebd8f0ff1cb6a3ca0254cbc4d13ae5fd1a245e624b96359b17cf9e38c400850e488b330aec87ffc85dcf3674ee59e6bdc1b9e20cf3789124044d8f56c54dfdf8b1c4b8a4d5deeee3ea64d17646ec692ddf441799612967ee5e7a17a141eeacf9014e6f2466486a430b72af177736be456838dfa421974b9bc1db106846af500c95fb8dce2011437839ae476b07433ceda217734753c436e04f262e9faab6af42d7ee0c67f80e5eeb8dcf2c19b9bc12ffe72cb0b32378b5e70d1a54b9bfb35e936b7dfb57817d6076cffe75a7ccbe5f72e4dd82f4e2fae0cd16edf762d2e771b27e223dcd47b4ec4457c84b564871e804072a24652b25d88380c174ec4ab5eb16d354ec4aba1197ba9975a3e1873b9e5831fdcc8237fdeebc6f72851cc8deec1cf9522d1afe2f73c07bc1db17bdf37841d1a3f208343c4602000ca2abe07e41721bb236a58c58f9d97e168180630702c0775b95f45438ba7804695fbf95c5f22f6b773613f1f1f59398efbe2653494ce50e38c24589c33da58912589820504aba5a1461a6cd2e0220d354a80b9dc5ada72f9270ab6cb4b562eb796a2b4968cb848b7bb274b6ba29a34b260c21299d61217b12394d72769c27e7f61c5b086dafb86035d9d3a4e02c6c6ac6e47a688e2b6ed356d9ab8be04a8dc4aa3cb850fc487e085ef03f9d23c9691b19f5efe151c9ced5fb290ac94ffe33f0bfbd9af916223751f0aa9a56c257924b1797d2abef53edac7e1e82a7b4884f3f17ddcb3a6d495917e0e959476f28d9cba7aa40713998d8c543271d763f527f625fbb81d65a7e7e1f4f5a1dcbb99fe64dafe8743b91bd744bb1af692fbe2c5b0a65734c7b06c74557da87e29954ad571145c75045ada49d5a7bad98bb1f25550553fd6eef3b9b1bbdc68b2f199ae549068fba8baee36fbfe53ffc9f66f9dbf09a849d1adcfded51d94201167dd97ba6654ddca5d5125d458b6dcaeb75653955feb51cd5e5a94f63146a2ede337e5549c5011e783fb01846b2c9c962b5bd84f75e3f5ad71f2b3abd3aefd54d7cf29e5c569421f5fcaed88f60ca369f9786b9675550bebdf31661fb318b32cd33ecbb2aca35cedb3e74cebaa9c73c624a212c05cfe0a26f3b9f5596e46b65cfe5a69965db0fb9a702c232c7fecaa7b5d4a8cfd2258ab7bddbe3dff44712519748fbede936aeebe94849ef5ad9dc791b3289fd232834ccb8c302d23bc699911838b32a30b904a08853d8544ff6fafae2b0b7e112452e23f6bb0ee086f15fe0ad2ee887b9e83ec6243c805d2ffb4083f6ef121a7b917bb3ab3389d4b7dd5a39c5dbc4788f4b31e366a89040c4be1f3b8d7eaee5eab76bdf5a18c62f36bcff46bd60e769e3544835dff4fe7f2e3708fda3cfcb95db3dd4393753ee59ab3eee508e217763aaebfec083fdf12df79c0a6cd15badc62f3e5c296b07f7e7777c38673567864999b63ec7a1c0885f2fee1202f63256197883eeef57ccfd1bbe7908503fb7940a7cbad32902e65736b1791bb330c1601a9423823572ece192b2402af1aa5912f11423aa9a6c14cdb7cc82e6da331a31f33396146b76b72d94308b16cced7306d42fa7dc950c3b742ad290c321c6ce4a4ef0f7db31c1cfbbcca3c835083518317195e56fc55bb24a49ad62fb36e6d4bc2d1f94cea70d1360d07c7b4e570bdc2d1bec2cdc87cedb7ed08d32c9764250ec5915cb6aa5d7203d772260d425b5b9374c3de725cb4cf3296a7cf20a52729a5849a9c9993769363583e8f9a1932a640876e620e8a7c5b6604e152de8a301a4398d053caece5f3cc5935ec79ce096bcdfea259f6db963d9daeb1919cd3dfdd1d7b7f8bbae68c5a4f9896194bad36517cf021fe93ca90c8f473053f8bb3e766e2920c61fba92657b3c2caf18d70b571eefd3cdd52e37c55b91faa93209090eefc0cfb1863166346b15a63fc4b8b3b3c7ff68fbe63c3648d509ae62c634a3aa1cf197c84db9c53b66f493e80c4fdd853fad867708bd9a454831af614fb264a32fde9f97bb6e7b4215857631acb5e5c6ead41739bcb89c35efb3038047b0abbc8be6d1a36b32bc3ae8d085b6eb669b03d4268ba780539be58d59c4ef1905e50421861952cd7684139b6947f754f3cca2db6d4e5d61a2b2284f08a18ac5032817d4c35c3a9e3e3726b8c18ccedb30d334d88a3414ec88718ab3a279c2236ca79fe2cc7b669db86e8689487d26d6bea58f6a72d08fc4a397a21d7db910ef76d43e089833ce250ceaab1391cce5604fb8ad2205151cab144b9fe3eb26d0874c2c97b62a31ffcc2ce4934717d71b86ffbd8691bf6d84664767f6d43b6c7ba7a63831dca360f7f24616c198665db35b559449bbf991e87633f86126e864383edc48dd47bbd8665d01405cb46ad3524e0d71ac22c6a36301a174a230dbb2f8e20631f9ab3bbbd7bce88cd39d9486eddd9166476cf0c83700bd2d30629bbc8503cddf0aa713a1b49385b62b05ef36343cb417eb5d7007e2739c2f67fd508d6c6e5d61827b8f273ae846468854fe2ad446a67690e62bcb623b91dc9ae49ece05308a57cdf88c0cedec0f6a0e8864af55c6e89e1844bd95c88411869e59cf01a3c4468652466d8ed726b8c272084ee268a453b94b4625a0af1290ffdd33bfbf4e509de74a7a57ad8d8d850421e4c1c180f9a8c953b1e20c35aa7949473c26bb44941869367fd7ee63b84d0c884df04085144e647973eb8f02bb492b14fd6f974f4714f6add2fa3277d8851e64aa02b9fa5fc232c5b542ac6ca041b3b289d88c3547e3ce588ddd2de2823e47c8050cee884d7a8dd171f12911f7b3694924908a3cb009f7f4c2b05c1e48afc274ef42bd94945a25cf947c0f0405b9b4afdab52f0c73d69d43de0f758d30fb6938ea2e69edc8e628e9be220a97dd6198fd1f552fba9695ac742826bac23408db5c44a8385c6d45867d0ab6aac369e0f7d9fcfdc92dc832c33b4ad792034693e1435356b52da8d6d07f774349611688f0f7d9aa799eefb5cdf6fb31b548c256e8669362eb7c458737b333279a0afcdd7beb71b7ce8cb5ed334fa3cb3be48c0b0383456193c2936caee4b26d8e556186a6ec6a3b1d8d81c3945b05f275df92c326edc27eee343f0777820276ae23fdb11ec9810c1668fd26183b5c6cacbad30c6dcec7568ac3174682c3152ac3052e034969a1e6f3b8a8fc48cc5fee335dc0a63cb95bf830f452972248b0b39ec722b0c301772f3662b68ac21642c682c21743b3456106cf63e9ef63ec405befc1ecab3e6887b140182837b30611e6c045f8ec1410e3cdd0a894e9d0770fe64bb2070de1289d97b2d6856c3c230c2cd80741a4ee9384ca6fa1ad7c3419dbd077072c0e9b8cc3f7d920f653e3465b605d13a7a4d3e64ff646ad334fd66d73604727390bb7f0d73a4d8a8e7663d39b62326489260b31c5a8a8d725cf97c51975b613ce142274799cf76581d42d3fc2c3a8cd034bb76596c27516cc4f76797e5f431015c603f16a6aea8d46c1aa872e814c9080000004315000020100a070422a16030cd43796e0f14800d859644644e9e0724490ec32016860c83060800800800000844d33612dc812e86c086694ab98f852db23941376fac464705ba095040d5b851e52c5242ec9a7aa39dbd70a6c3be4eb3698018e82da4857ab1ec77303819924c419e13c4fb8041e206c1abb44b59eeace894f59d2e91f51514aee42be8e048b0c3be04f3daf2830ebe38645f05a5575e852fa975e13361820a14735fd0ebb4ceb60cb4d49f661242b3d77a8b3a8d7434da7078cc15a165026eef548583ebbde6bb6418f8344bc3b3a6252497cfaa01011aedb12cb9e94120d997f392a234f738544f467ef8f571e954dea3f046d6a15e9409c63d89bdcc9eaae08aa30360b751bd090122b5ac066d23c3695af2f172e08c843cd304d66d037c61827a077bfe0441d002ede5267b676e42fade4717deaeaa37025b5d9ce48772a07655ff10c25b0d6fd4454bc6a78bd077c6365e16efb4c6e060272b6b63eb589edd26533f20774244bfaecf825bce795dcd5883e30005fd0ec8ab4148427a2b7387f34700a340e9ab24fe7ec1d5543f90379c672e10d313be7e9d128d06f5e413901bd8523c86369eee56464507d7e5c782676d31e02403cfacdb78434f2d8126657078383dc3052b9b35833a31bed312c0f25780721416d5defc8019f2545d3d3af75c636b0de0062381e065fff8b215416bb492ad50d4e8da7e3c522ee24567a8ed8f864eff783652302060c48d4811844d83a97d92c7ec6f6868a53b880835572cfc41355b21ab5f8f1c7f1f4bbbc3507f15827c432873c83e8b411cf67151316533b1bb5776e0e87d7a8ff485b15aa29d561584fcde6f8f3e99a683e7b175249474fd02ec2352f7f9d2e9d5362024dba136ab9c7e88a624bf61d1d00c4cea29efc620f2ec42e0f1c71c68d09b5c3554b7a699283993f85484f2a5d82ba5951b55823f96ced225cfcf6022300533bf1c65d65aa0afa42162430f0a97c1952de4a4fb7ac8fd4583af030b300d4fd65a4f4eb6c1c6e6cadcc222e30f2113c3b278f725f8b5c480663e796d9ea27a38b9e48e95ebc24f4772b91af245b49765701bcbf5e0aed2da26c0f074556265fe15f94122d1cd8c500b3c78d0e1a0407212ed26db7561fb1532d55692447601856d278dd8953139f8732c3212dde20c7b0a06c124d08f87f34741e1f26a0e70ab4953e6b876f2976013a71e371a241e9db8aee387fc74f4874bd8d0e603736dfdc9b3c6a7b05016fe65d388a00ef711f8e6cb019e8d2b755eeaaadba78d7ef2f969335a3be22abaaee1735f8f30de20b1df3f949276db6f2dd5913b7e1616116bc798e241c0944841ceb9f26b1ff7fff4041d12820d7bb045ab877d368891745f65a1f3c4168b979b671b15de8933d8324d105d102aac6c58cdb51eeaf92739784ac4c4944ae544ed32343e2164eec9e3691b271a910249de0ba866560501f034493fd70f4b16120ad21aa4b9c15822699684b4d1eff1b306c01035dd2c96c035d63e260d58f42ba8494470239155847e0ef1a6d451ad282a2c288ddba9b6872e4a81e43494bf2b188289980857aab6abba9c9dd910c23ca68359953e23a14f69ba34e8239ee36ab144a8cf0120b5570e42d40ed05c5010611a42144277c482557c3e5a36c84cf0cca4e2d84eae57820a8a7c1ae48841f9c49f742c4a011d7397d5c3c378781d99ed57a9770fe47eda7bad8763ad9de8a330e653630c77211308ead976a547cc88a44658207d1b5ec525e00efdf1ee61c57dbb4320ab9171525d9da613c8701d733209054fb77e29215d60872d027c5d19f6aefbf2ce879acd7578a28a2f8525b5e34125541d4020af429868012515b8ce137a43e847516a693f89bbe5970fedc0eb47675c6bc3105e03e2c4597cae0d628e4aabf07b251b772acdd4c00cb66c0d5a0a18b97ebe289c248e21d41bb9c74f6707df38495ca53d3f2bf3b4ca3976a5f013434d1b38e6ed8a92f584d4bc319dc844e6d27db8d38ce3999910fe4470b385813582682667001edd045c17ba0cb7c002c869f22fd14bfa62a0085089a74aa99e9077daf63f1e7f61d3f291a3e991a26824f3daf2483c30200d3a7301147a977b447294a56da73869fee73d00fe5d718e2b16801644d2074cbcab3a4199f634f37510d004860b0bde6cbfabb51982cb945ab56d265438ab724ff1e796a03a300be5da5bd8dcaa4fd8b4df459a1a191c4356ab8128ec5def547355115e91211c8f9aafde37c83a75d114c4b7e43d4553cf2320ba9620a567fb0923cf3f018e3f85388f26e80334e39b14dbd27342503406c188166436b848e58241ca8ea33ba28f3c967148187750f77339129df1415aff44b0fad44d92cbe5aa365836604976125c8c680644dc18390f4661c63129ee2da7820445d2676ebefa8419358f7e3503449addd3ba5fb6027f253bf26487ba60e3fb57a5aa75fab4dc67c403a5f190aadc85e8e6e7d754d87d80804a1bea9d0d98c2824ba9f9f773de903730ba6ef0425d55ed75002889283e4b13feae70f6b13f1fb1d6f329ae30cf773db2b358a6f95198cbe95c47ce4c5b338400700168885ae4086026707a37053d36058025c0c73ad0d437136ea0c87cd6ea45cf2a4b7a4fdef4f0d426158b8e7445ed771d21ee015c04843f37c42b14df2dc22ca6c45f6bbaeb28686b8e4452326369e393906338bdeca2fb07f9e7365836c2792d7132838371b90f742e58a14e75cbccd011457f2c0b5f1445074ccfdac682084a54c776906921e7e9b755a46b10b23be13c0f248b7d33e1da9867c495ffe808801b562f73c4a4c7a6457a3e4990398f2b775318666dc14f31ec2d07514a24918a05a137b49b020ec80f925f7b4074e00461b81eeefb5e9acfefb10e7d810da758978cf868a2c7e15ed9c45cb24929d41385a854864a236884631111c136e419e1d3f3d2313b176675ae96fae48cb2ca1b4c67c5f76b1377fd9bb7abd7ae013c4bf915c301184a77726495c49ebeadab10afc91ceb9461849de3c709761479b02207a10e8452dcfd7f0d6c2a9da3794597483217b363e06b2d5f07f6d48fd626dfbc070920a473e43ec66bf7c268ca362d05801718437310971f8c9b3f0d0a976fb0e7742041eb4a57a55cf492166a9334ae76e91ce007a039aea9b3c3e5486f6a78db58dc1c75200c397b0495cc43308732c622ae4c58251f046b38eabf1e4b0debed4b7c51164f91eaec6cf372ed18b1015ef2de7e22df8cc61beacf42804a9cc8bf8032a917cd77a263a6ef40601d05e91ad031a3a650cca8f6d438ec85a69b8db46c59ec51eba214887245a3a5653048f2b928bbcc0584c32993b27858870aeba030c365028a7002890dc51a09656f0715ae4c49e14fb779695f39b8d8f0c0d4441024dbbd5fe57aa67c58265321d9b991ac42c360a2feca4ba2dc1f2464c80b6903d874e28b67eac603f43f98cfc584b0330a40971942c98f50fe6eaac9188de07a8789035fa818f6e09fe314e541a2846bf51105a2245a84ce74494774891bc0fe460af1be5e43c2e4c1f923a1313842ef89ed1afec0ab3e91278e3fcd6ed8d181274f5a7e516f8f49dc16c11a5e2232c715374258793d1d39d9ab9f8a3bfb03b76547471ae2a2a449ae2efd17e5166158829c09418dec527db721c215426aeb25f99f47f1b4a71f9c8779c9f05e5bc8e19120972438151f56f3f7198514743b35c63ab38ab9be64c4e76d5972f729f2e51179489e16d9035e93c537a81f137eb0253bd1ff8191ef8c98d487dca025e0fc7dd225bda045b5f658e78f3980c6a26c3226a8be7ca0b3c8c31156ecc19ea29e74c97f9aeab5c99c09a41ea60c8f4638ffc3b7f4c648b07294ded1bff5d677ea686dc14b556952957a188c7660a8390dcb4f47401ffaa87a5439c9029171a7a06e934cfce3771fcc98437e4e969e95fa3efcfb4e7014ef78bbe0891e44df6f482e806a1362d4e8ddb02599c820b5ed0590eb9f4470d4af1200c0594e62bd013c62824050df3eea61860412c3d5cbb6e6be75a2fdc22a9f09da1b2c39195e6a76ec36a2e69cc4b917055aa2b64c1ee86be36bbbc800a120d805e5b43adbb60227a6003dc605662a0a9f6c4d71c83b2fcdc4d63e494922ae23bd947e14e181b8bca28ee3a9537ce2bceb4868043d2032dd531663aae33f6fbd02f426c3d142ac86c8653d17cd5adde09b2b45756a757843dd0ca5b1cd112f058abc9c4f01d12b6f46a0ec61c969f4846812c4f05002023b282ad37980675063b5be00c2267007411ea23c225fe648425da787d5ddd24add73882c06cb56ad5c87548e00a5d46f5ce1f1055b2924a4949ebf83fd6f298c0515f658d3046c370cf1477caf866dd884cd8f89c52d75ee033d680fe1e050e226bf47c04c6def9c11a830857d9bca48aaaa49570ec9cf87d8e41ef5510273155fb378a59c9d613b85ab6f65fa04144186bb552d1bed52b015ca468bfa572dfdaa573c2c1f9bec698a10c3440c12095f4292114d2e1bedc8c15917ddfd0a2f346e7c1a103973a8021e4941b70803b62e0b028058d1f46eb25a32928ce25e816f68eb167900be53f830f747f2c58a7f59e4c3c76b51e026a310faf8145e4562e4b989c0b9a525d8c31c4cb17d45ac88213445a7af1452218d59f6d8b7880f0bf69af24f459f28f25d6bf9677dd04cc6f132d9920c11b1dded924400d574150d0c42443ce7f3a9846a277bb2831d6895f77fd3216ee81ded95d5055b46b2897a7a0fed828813354f4b95c512d88957870bbdb4d99340cd00f8e8618a881374254c05e5b688920a74a5600a76eefe4aa3b0f914d38932d8600619052510b1ad540e502b9f740c220a081f13301e80816f9e394263130d8eae64eb5eaab694ea76c34275d9500f93ff5c4eac7f3ce1203ab30ba718b29e016de95c5533a1dcb1970b468af10b56249414ab51b8b65c9255dc9cb68ca5e89a654b694f30b80de347b5acc761f9b4864705c85b4b5af3d29c57e62d66417671a1713084aefb6aa140bc6b6b825a012a15bf4480f34299efd965218d4e87784c60e280230170dca481f0f7d27b26de497a370368d08a980310edf5dad0523514b9bd7ed6ddaadf041ba01353d489067275be6eace19d28f33ff09ab59e2d1d8ff6660d4f3a1390327053ba17e683e42dc8c71e3d3880ecb8581ba34b0b01a96086ca87b71d81a6ff54287485528a18fe08e323e41988a8395c3c4c057733dc03863eb6c006c2c608a1baa778b8607d2aaf4042fc740e6f318eafbb1aef4bbd6a9c2a227b6c33d2099b191f23cca56ae16ef113016cafd7bb8d152c46613625446ca1c0bf1cd56e7962f4a6cfc0c80d75fb5a6ba8e306a85f446a9b8db83d166ca3a3afa7cf5f3a933613c5c545ae8508098ce4517d375c518a1c30ed75041dbb20f4c3a35c06b9f38f1fc5ed45cc87fb00fd3f38825595f74c67d253dafff80a563d85c3522c35b458acb3833128871631eb656f8e66e416e5a538dd47837698be5b6fc5097ee01920f7fedb0ff3812bc290e7ee5d42cd5a69904612ca4b5540b09f2509d84319f00e4a98d50cb326da46f8a818dbdc71ca7a782746f6565f4ab989df47b5435adcf0221cdede56633285166149c2e934141342c73cad36e817966995225270f134a849ea7285b99ed3b25b710a4ccd45b75dad2211309b8288a266547c28c19e86c18baf4bf5eda0d40c56bc1128ad74a69015cf5df7dd8317efd5e42bc9bd240bcfbe9d3aacbbb1248272d2381db5d58ec5d380ffb12e6338afa50f36816dac641c1e1db62d4f9b27869b91b06615f9018453d0150c20581dfe10cda857dc1ed03fc5d419d6b328f04c1cba4c0309301335a97ffbe9cba91a115e8ce4ce7e93e8893fe53ce5953286446f6fd4818ed50809def633e9df59b2bc92f2c230b36451e5aa23278c41a8ad9b345ef1d0fbfb733ddbabbf8f2f81f19fa22e29c1fcd17ec0ffd9955fa8c315a4a15daa8723f9f3d05d8a7076bccae41ff00288a10a718c804434ca699d1b1a16857ed65bf7a62d84d9e163cc1cdae5c9b86f292895a2887c63dc7b7411edbc2c90a19a56b23f9810023476dcdcba21d34afe3bf5ef4e6b0665e33ddfde948d32203c40cd79ec332f8d67ee21d143824c48197f1182b176a9d3e39dbc381ab124e3e1b5638ec26c4fb0763a5b990f7f80a57b5668269d3273fa6fe3911a86a57464cec7da6c91d0a4007c65ac1267d7c4d051d3638ff46bd4255f6b0063964c2db91e62806539d3eac9548008b861f4b7857174805521a435ecd208bd1e90de3ba0a6b7a1ee22920a2720f19b409516263b6688f6ec9b1b6230d0c449422fbe0f62b0272f6eedbf6eb7aa2b462fae7f3811c57288c4d8fb52db6f1900f9808248fd537b89633a6a7b4ceea0be9d2ee69b9442f0a71fe41204021ff0100edb47d8e61576ff15ce04e8d6d0d630814c591a5553f99eab7de0b8561ad1f0b6856bb33c39879d5bdb0c5c42e681160ba987abf36e53fb84e0ee8cb3cab1589adb9a7c05995b04b28245d47e01b0e9019a29c3bfc21b00c4e0abb40c484f7b251ac32301361bfdc9a2a6008683fd3f17f2bbe54fbcf2e546dffc61ffeed68bcd2c3d3c7479bef51796de36db28068983120bfe777d07e11956285f26ad0a643ccd7f028cc7ee957afe574c04b7eb06b15f044d13284d49273cd3d1258666e333280fd70659d19c996224c2a6e621896d0f1e2d9e811555bec5951baa2ce91a27e3edb7e116ff0da0a40188c6fa42e04edf100e9908c5404552d65c83e9d56ecb942dbe91b22f50ac0ff0d5554ba022b85f9c1cebcd61beeae17e56acf71516d68072ede173700d786d1cfc139b5173a8b60dc4f82b6568c61d6883e0314ceba6d839c6950d378260def4443f3563d306cebecf309f6bdb00493907ac23964a69e096259454593056862bc788fccdfd4814d0c42dd97e781b8021145cce3392bb8e7cd2031a6ff6d047cae1b419a9e20765000fca89317219e018b92046ad441e0f2c837dba71bcb6a8deceff546ff9c1782461d84eb337f29da129624c43d5a1344104d11737fa187cdd48f2735fda5faf2a1423d12a992a94b67f7a28b2ccb65801665ec63325405a7645c134160615481762a4bf318b5440204a7cfcde6e8a80404020ecc88db70f5b503857bf901195301298bb3b49bb3fd5c0012453302a18a637d80444911dfd1e348024a0fc028219e7614691523c9b5e83e4315bf7bf420bc04d1bf26ecc04fd79affbe3767ee605c7008057ee0cfbac35b720cce5bd33724dd509717818969686c9a48a6ae7b4d96b6637eb99e1a59c63ab7e98feb2e86252af79c1e3dcd2072f7d6a12c52289d2ffce47181dc35ae60a50d8b5f98a58402fc8e5324889d2bf820631623c3586985bf3508ca81b7df0848e04de97dcd5f80e92895b51cdbcc0e2ae8c477d4e8f0717d1fec88972e29063171216f87382f7024b3f5de25a3f5097c5fca96161e9d5c1bc9a8dc07a9529c277aab7b20c3621361c1a9370ef0b5d9d6760e0fcb6d10ecbca3d80a24f06118ca6e34aed17bd38319876eccc981c1b96a1ba1d9b9653006108e3a60d368785c05442ce9b97748ac0ba0167d16339fd9a24a1f45160341587785bb9b03236295a58267d075c398c01a074be62de63ab462006f870f729b26053497c70c41117b434aa4f376211da14d730a2d35467f744efdb772b62bed359096d22e91b7efcad4ff3510c321436e8d0cd319a158307d2b30ed3026203c1fca30935494bdb05aedd97912d823c80f49bf08dc5bd17e9bd482f8b7b2dd27bd1f44620592f82bc41e076f69e6ad84696f700ae469ec9b2b112e585bb8f1e3dcfac9ec1d9376464701ef1d16f7cf076e1303b279bf0108631646173980659d8f859ae10c8303d172f90f5b96acae6be165a5f36a57ffee4b43402d5047bbf88348f7031ba868620df0828b470edbb0778fbd3cba1244c2c7d6315973f7c6d10106d023716ad5741dc7bdf50e19f46513fb1caeda3c0c05994a85697980ef74b15f9a97ac8eb9e33d5598f7bd220404bfcd2a3db773f5657d61f538c55b1f8271c34f8e5f39eee5ca5fda91f4b60b609b4e46fd20060a80c6a22eb6307dd3e96d9a0d026eb1121ac0e2a22981b09064c9ba7f45043dc39aa30fec9d4eafb0cfbabb3d9dc3f6799e234239244ba9d9ef9d76e203b246a24eb0303facfdbeb58c4013bc0ce46fffd5d102958d9459cbead7712562bc8d75f1c4d8947ebd130813618f7120323864f3de8fbf0e7c5b514d71fe965d2b6b896541cacaa5c5c755831ed0f640c6305b329b25abb10978acbed53650785a0a0184b17d862a98c4e7745ff68c30ef7058fd3ef7359ed52413df9fd599cbd13ef45feccb5c9b26be0c3d39d0152ad7e3240c2c2a7f19b56d8202f00e5eec53c45e078decbeb41cefe492b0b214a29eab68cc2a24caef8de8cd855341db8b548ce4012c4f7d4e2ccae9a751671c31ba75dec84b08a18bc29e931bd8beff692d41636c1cdc57a2fd6dbe2de8bf65e84bd17483e0da16e00b512a93100078209c37ac554b3747d7f96a10072f0877073819d00d0d9c1a6a6147699f26dfa96feffb67ffc13651001d358129c6711b766caaac69168839c1fe8091b875b34e17d5e1a77d61f71960e19c444845909b5a01d8e7866454b67b91f2fad72c0eb46a2bff448337bdacd1ce589c24ea66a2a4044acfbdad6d7cb9ee5f1afb5e346d4deab12cc5dd19251715cfa01e143b8fb6a7feb4ac9dfe23b5fd10cb8fdcf755db74233b3936b6947bc0b6211a8549a683970e7f5ef7d463cf0f6f203fd82d22c6951306d1227453f2a6acd6a072701b00354d3946e341a6471ce5a02c638390118a106c8c58c13595c8296463b0f99165f152f5c3cc91ac03af1c3e9c0d68d9979af2d44dbf2d54e00b4b8934a00e7d7e69ee0934547e9548b5ec23668c2d9528170810c4a4a50ead1dcd2de8f478180260191466036cc032813d47721a27965276ac7fcfe9d533ceac4773254144bada95b6defba612d5acbdba1686ed2e540ddea5aaf98c6ba07e9029e139f98bbab1940602b962fb48fa9fc4558c46bb50fe50561485699a920fc6d0c52ba3f4b749b519213432e2ce97e1ae1af1eee56f50d0ef88f3892a5ede72e7ef8e64c01085c08cdee0a788af9f6f43d7bec9802ddba4bdadb86a173895c160c3f74be1f196e0e6c7cc6bef43dd98ba71c2cc9912af860de6db5f7c130c6d091c3994eb49c4cb0f827c7f82de81bcee76274e4736e9c70982b5c63491617083482f2344db18a4392b9c58a56ca00978c8165f55f9daa3298fd748a6d2fcbd6aea1178532221e78f0ac3fcaa02c39929e232ed91c10ddb4812ace00e47aff381a792c4182b7a028d156f7c75a68f0c1482ba9bf8fe1bc874f10691f04840985cdec19715f230f0dfdb473d6f61521d743ba4a8122cce9407ecf708e1438b394260ad21b678dcf76e607afde52f8aea64d6e4ac8a47d84db5c0155660e663928c8135e76fb06699a213ae6a6b927824cac0fee0864e81cbb0a916d8586b2f6614103edcebdc6c98c916d7b81f281060143c00ce50c0a28b8da368270741a250a94b113544968a5770b6c582fbe16520522b5fccf82a26c855c880f2038ca5ed0b2657bd373f42ce226ef2f96a95edaf00c4a029362800f5b666dc043566f7c27a169dff14d0456ef06a5abf36bb2434fd587095e4eb7f99a2ed51778c5eca37a070c3dff26ef0f4c31c468ec7b596fc00940c172f6274d4a82615f46ef949c261f56fa72f137e15213a751fbb6e086b1894c4b74cb1569a5ca5589286937de180a39192acee9e67402ed82962303ba3bd3ce2a066c198f387ceb7c91d52f06c38dceafcb2072944afa19c4dbbe5ce348d5f784974ed7ec59a1ad6aa7dcba31d6af975438de2c9c74e3a02db49557dddf4237633fbf72652d540ea6440f3698b23cc4079870622736d12762a2133951133d11133fb113c3f37389acf99a92fc554125ba76c95739052476bde00c1652f066417e5f1c8321bffeca24c04a05396a2ee8aaeaab17c92e748b5128ba10d8e2a3b56717ba961e55fcc9e1135c149cd289c513aa00adf767f0fca78f6db10f6ce64df83cf4d0edfffee443d89fdc2161a28586eca74e48c01f7b38dab53299ff9014b501aeee837fa49b7ea46b5ba1cda42973fff1c666492413f00f3524c5d3e94a3d97127783c86c4a85ec5b05f460b471ee19a29ee1696b7ca2a6141620def034aec59d4c202e3010d172cdf868205ed8951ea8709ed19c464318c52bdefc19289f6002f91468160e5e3983fd7009ae840ea256e4e4aa6db8d820b4cfb5341112acade6d2d85103dd5937457bd73d6b13829248a10d615c983ae39bc153461bd16ec6a736b06432b14ee4731089549ec0b08fd87130616f6e536ddf472d62bf5499e526816ebdc9077144d5e18d10909fcc308b0ce64d848944f9a5d4a2a7632234762d4523d5b0bf092a530cff673c33742eb948c62ba5d41542d759458d558c7c6ec500d50157516658ebcc666451b2cfeb385123b40fb4038b8323ece9238ba214ea7537ea216276622831129f6b3a5ce7f38821f69e340bb4779fa69c4305872ca4ae65168a5fb4111a714a1f6c84b443511eb3fbd7d41c64a0460453b5c82cf5c7616aa56a2562815bc6320f916bbc430c0e36fe79a6017f689343581bcc391ea238637176dc47ca9e55680e70dfc13bc4710965b3d6f11047bf9eb8edf7bcbc08de23a775e5c3e34ec3d5e473e057e11d259cff5d03964bd9f67604bf35dc9de6841f9d68e8874f83a3d4284a00c41ccd05bb82c03a0f65b5a3b90e57ccf36f3eb33d353ff2108a5f3e3308a638ced21b859f6f26205b93f4de62c79b9a5c09ed7f44fbadcac1605a0b77a6122965df368d02012cc0ba457c1b26c960ca100040dc599699476ef787c8b41c7298080fbfbb3d534acfc4ab40132e13df095522a837355f8f37362e88e2b47a09b66da8526d45095ee0ed537147585ca681472175e419be9eb43b4e97f40f7226da7caf72144a516a3c0fa7d1f18562cec090d5151d7c2c47e98a04f766c936c82fb3590fa065b2f34f6f6cd3ec4945fc96a50b80c56b7677fa7b5d8ff83b0892fc65166f3f3ef891847b6995a0ee4888648365f17c2937c9cf1a6854db3b0ca313c0d51acec610403aa62fa3ff29d7dcf611420ff428dfcf6e13b25f856aa62a30ff4989bb08a201faa62ab8926f62c4299beb46c838ffdea8677ab6ea80a87d3d4ae86ea1cf490a71ac97747374ffd63e2c347580aee29c41cd76c17f48be50721944c949cd4fe268943958caea1d59a4957dd3be5c7f0b95512a3c7e65013024c85144c5dbf33e001ac97b6b8ea38808f2a47cba0428a904540dbef568b676a68ad1aab5ece34e01093f8d474853c9279a98673672d0578c50040d434f95776e5374ec8c1806da47171940972648fdf9502dea31783d20a000f6803376050137e287840b3391a2556db8734a5b32f0d9bbcd0df8d1cd3e8767caf20bf6f6e15f0204eb5b7755fbae546e02ca22f43a3b5f752ce0422bff18de13b2e0b29a9c196815b8095e0532577d981230407e5bf03bdc605b5da7abef1302b2200b33cef4cbb0bd793d85b6388a9cd670a4047455ff4e707731b29b25e016da18e8cf38fa674ed936cfd3fda91884d102266a4654af1556d8f471a46b530b071df7fd7849e4719ff861ac5eb450d2aab0b0566bb0f57aff3600b9a7748ca93e7483751fba32c40ccda929355e2dc54dbe5879a9cadebe58ac9ae006c7be0de4bddac2b0315f682b726108070f873e596f1c60df022d85001561fa780b84ad6c1a8ade6e1c8138503656f69ad21d286b6d0e11f3a4ce0a8705ee6c5463821e4b04818b8424d6d645c1400beef28f3290036b66d291e31407ea4f665f0908cf8a478ba062e170b930697ed3baf14839b33901be26b0d2d7ea222e6616227761816c1631674dd25109506640ef696d2c01a8c18da882dee8cc4fa97f07998c8ebf0be1fc6500c27ead4815244d8c40060316fb458ecabaab1ee1b97b20ed9f506caa91178d1443cc2c544d94074e19c123e9cda182c6b30b97a03960551f9789bbc7aa38b4c472db9c0f4f277683df5ecb924d9dd0223ce41cd2dfe95807c0ce9354fcd5031e876429a55691fb9ac1a31e1d6796a20202378366fde984065db56834ccf65b1906e59583cc9f3c591d433a97df6310c3cd7f86c9e69b50f57ef91853a1193875f1cc97368455692d6b4ce78de2202158ac4e2f5b81cd5ac188898a49ffa73556754dc82278c4986c04fe3a440626a70ebe45d5e76a8a2fa404f7d7561822a466b900a41fb5dd5ed72f44a8de571ca16efb2e1ab94bee4f0684a1ca658895b70fb10ebd8fe30b0eb620ffce4363da2064fb09712259d278b7f0b838b05e51e0f9094a23c5fd35b2523373864f566148f3755fe4ca48f69ef9182d677d1a543239f95125fa0d00d5fd41ab455a44bdcbc92f145f2f2d4b902f03f523957b6604e7933ec72bb4e66ae2b48358441bbb411e01f814102785e327f6f0eb8f07631e2c896f3fb067a172c1b94c2e1b0daf48c47e26e2b8d3f72e2a478a647b4f4e79719fb6d1464464692c991e36b0d417c37913c6443c77375f167b39e6150614e7bb8a303de2e169ed4a99ce8a92644f81b2879e298c642f48d6a42fdfe3347fa540c843ae43eb6b3affb3a145a8bc7ed5f016a4b2884f47808d82e391ec94852ed626297a78e621d754fac5bacdf863834a0b43bb825fa5021ac0c89c950b25096c93b371663583dbcaac7ccdd0409d679037d2b30f928f156559c17eb9c4d2c2a7257c5f9b1c6c2be8fe741c4bd324350efcdf41373b2af964b4a9983a8d825de9809e2ae365f663667b112ab18ba27680e83881266ca43cefbdb4f50f04328905b273a5b844645b0a3f52fbc41a54daac219111056807dc9212761af1fd3a756f8324d3d6d72ce3c8925b208bf7d4f220f0b2acbd6525d0d6aef1d14471cf901eeda2cde81bf378b2588d74bb12bb0379c10e37d37436161aa82c150b0eaf68b93e1c4f8b95240cf7ab9d8dd0ceb6d8533742ece3082c56b009d0355630ae65b67e14c7994286ae186bab9007bb46ff9b3fe9f0a07dd0b5421b049d7d9bdd269c65795fccb0cb3b6f2041211dc8c0f5ad2172c6ccee0d7b799710aaae48eafb33f22e2478d4d360db30efd1f835421b5f6cd802e0c9ceb8deb630af4f2fd4ad453db9c46451612530270ef5eb8616b62eb88a31fe5788d9bcf2d9d096b639677d4f332aff30b46a8b98ada3611fc42eab7d354ce1e5a2b80256e86d07f65e4adc1e65ac5f048583c06524080c71317d4d572104a381d2660c8f9e405d24f77c4040e0372ae418341a78fc9aec9e4b48563ee4220ef0006511ff7c0c46bd71331794391d86a6d5e1a4be7989e2572eb90bc4e0db146b3157d1a219e31d766ce44ec07b50f5e6890de73b2ffe2c82be24121404f19ff80013f6236f00838b96186c17915bb4cc5845d705746cd70201a4768310eb2340c130d5630d282425fdf72d190ff00271fb267eae05ba83d2906006785ee9fcce877fbde855dc9fc9556755091604beda8971de329097de09e4b53b74702d89ada3e3c635e29014d51ce91cbd4e854a89ede70e212f0e53cf553c5c3ee328bb6e90b5165a7dc00e3d2d13377c5be5093b6e69eedb604bba909879516ab3b4de758f9c62415f7138a6babfb009fb8a6c96c09e3ea15349baa51fb5d5883dd341107f4a9b4b1a313256ee0a3557a63df1cefeeaea3108ed4224bf2b3d0fab0d77316b4b71a674124d7f8e97c1a77b35596eed47ed55888e32f547c8bc5a06da3579e1265db52517e45a7aa053213e5e40e103450d09d9a2254e7c5d25dfe80ef0993a657a1046d5101ec94b31cdaa44b0db440993fe706990ed0cae9503c847f9d6829f7d1f28e41f65289a5ca68a6a5e40b07c87be4d9476c9dd04d399e27dbc1986bb545093e53c0730fb47b295526287c2fa89adc455495a8965c9142b800e0b9cb5ca8af359c115f142df904e068d0d6848d9ddeed508736fa9723aeb812d0cbdf1d29dccd174b2881879cb3e78b04073316c431bab1a7c65aca4949395f402c01baf4925b97d024dd045bd02f45dfa7c8b4e32050d76af5c360f68c853837f35219d206c7ea64fed3e8ac674bac5edc364acf859db599e0d1de466693065432b78bb1132a71e8e729af5698efc41ba4a765310ad624fdfabeb21a336f57a7f39a3a4d73a7933a8c33fd2afaaf2d1269edbc07a555ab76518b69afe03506178e12fab7e411a7201b78698be1066ac61cff4cb307ba75f77e15735b2a2757139c3e1fb59b6695f05449029fae82a67a8698a9abd5583f00ca762dd4a91203c4bed9d0fc2084a1bb78150d21ec848a835c5132813c23b0fe5353c332bb1d7aa60c42a99663905b8c497c8696ecfd80c211c15b18fda2ae20548bed70170238fca972df0a02c209b2bba3b0b0c1072b3265cc5b59e51fb90df6c4ec1c1d6f026ea93df4739af20750727cda9c165fd0aa67e4caf1766a6c0246d34c147600ad133f6354f02335bade2219331cc3f64cd9c27dd70847092c1b76ac570e10133175b9a2f0568c8ecc6efa364e48bb07c0d18a0cb5d161268c2255b835bc836008a89f0d74b0733953995fc0107a0b8889cc6509c70b0cb690dae5fe69cab177688a3afe5df196fe6acf86b490b9a7554d5fd6be731258a04fa35be083699716d471f6f073d166a704186bd927243104cf1c7e3bb88adf8da847bc5025fe3991662b0d0002c203dcf9afe5fb3d78c0ba3b976672a2f29503c64c518f0c7b4f9e28e308e21a7b198781170e25482501c303b3ec660bcd69601402ded90b341ad86a5e0ede43c25d27e7f476092d3acfc9affa09b4ba482c8c30eea448f565a5da1cebba0e3c065a7c3d3bb40b2c4923ad3d49559b90eaaaef61e9d8d03be6d85d4b29d2e5b9d2c88f6e5282f2de8532cbd51f51e7ca61d541a9ba573ac1121ec7890d5eab820900e81fe9159248a93d510c921ff8787235bc342756605de0c078287e143a0a871f98ea13f9d598c8a229527c96209865399f53802be3c9c1422aba311b149cfc9aa26b7bd95302ecb2a2921c9ca5233dbdd0706fdbc414dcc8c041470d96c7b8988c970761255118a393106826cfb317ee119e06ed4e4b8ff04141d7e65f58ef2193f7094affb570a33656d147480cb521d987fc4fa05a4b43e0c6939c097e71d0e073aa50329211db70156920a8772e1271aeb509712bd6627ff74f4805da45e1f1488c9201cfa658f977854c50e43a8bcd21ed84edec229ce437f3c020ca5d0f29f98be6e0c9b548ff89a1c39c5d19db5769d1f90f9099b1e89004f844778c65c53a8b5b839aee118e93671974be19af17209a0e1f45d9049647e0ba9d3deeee72df87bbc1661949b451429214e4984af938bf3fbdce674154db674f6fc321ca409e244927f0e7cb3f032737071ef333da24ea103214ef6eb55d1094c6e881e2a47a16a6c8c2107d1f51960760e5e52dfe76ea7bade4e85f67ad68c0fd56bd4c94d556d81fa849f5bb0e9f48a719d6bafc6b050d2ac6ff300057b42c1984f0443c10525134d69f950c11b8e9f2db0a7c6760ab766e8c07b36a5ae50350ad67f4cdde87e4d13addcaa2fdc9e746635299d57724aa6aafbca4e6bd30347bcf76cf9f16aef98a11b581b751fd4db2b756ae97269914d7a0a1f9d2f4ea6d44a49f8ff01c1f1857112e29f765e5ada2f7e1077cd8fb054439a011dcd42b7eec52f519037c468d3fb4890967216e585cb912b5e2bcb4ca246b9957e00b436cbe690b265d0454e52b9bb78928ef08b8b6d772b4b466c231fc32c254ff2eb60747a846423ad8934d3a545b95f646cdff781cf421c5c7e53af84e3345e5acad6864951f6a4915f223a6db58e983d1ef1442e6e12d3e06de0826bf796b13caec89ae611319a7c6094c9e50dbdfdb850b00892a1caca395d6e288f3b7bbf768c882d96f67fb2214812abd4e1dbd31ed0077e546b3bc07662ca4c94b86997ab50a85ea800511a50f51e9ca7c778ff24debd2ca5924c22b87b584c8ede39f78ac2d1ac68905b8424f1d374d424ff96e57b1e4339ef2f49e24a330d66deeefa271460b46a8685ae470ad93094d54b323fd1fd4150e41602b100fd3d467fd9a72ff8e23deb57bf22f945b104e34e979f02c4553a70da895e472dec7bd951fdb1f815215057836671ece421e8b3aa1fe4d617551e773d627db18d829a50eddd06d84f95860ad5aecb7a71d8efce19abfa2e3d31c5ce701dc54d5945203208d98945324944e2e3ff72bfc9608788ec427514f32b97f53e19b75acf91c2e038b3e778884824f31840ba934a787decb587bce9cabf9290142adcdd4d08f54b35ef7d618735f0dacf1f32ced922711d68569fe0c9a52d8b4b7022215cc5b102b0f9c1ce7dafcb4aa3a0dd8e7cdde997b886e4af91526e1c807f2b2963656016ea84c88b51ea970b4cc3c4d6d3570bd74c43273d952069c7bb330ffa17b924952a4523659c659c3224a1f698360e2aedfa80b3b15548e6542f3c2f5f5886135e03b022d8ff8d3140c4dbae62b81cb8fb85f90b59b3c6e9acb4c8ac5c57270e0c788edb303bc455d8dfa10a23def5f09aa041b63b680eba4648037dc503ef500087f77e23c4418ecb85eb2ee902224594d5551b861ce20777e325c23508741964114ea4ad003974d636b3176284a5c6b7c0adda1c5ec272bf59a2cba1f4c17b6a84041dd2b15fa3524c32eecff9bb1f5871ffd5942d34887472b4813ac85dc1d429470af7e305f996588812c9d516d0c849a1704fe60d22d27b729ef4b088d478833c71d5c90cc08ad0114a862c55b797910587eb767cd8644ad68b2e7463427cb3a477447fc0b704c8fa0d987571eaedeceb76456668866c02e520dff8b01560aaa8d8e63743626da42135a614ebe622f1550d800a2c0312e1926dad25e0812d174b3e2dd50f46946dc3bfc71d3ed25840c88864587ae3d30335d4dd78dd76e92c163ea25ce14120d1fc65de409f6985912a5fdf38dcd4dbefa28e20ddbebfcd49c35cb64e4e9f63cfe57d4a0268c3f9457de52f3e0d21bef3c11e1afb3265a92545742bd60c365a41fe204d489184727e3f381420ce9de3359e01ff96d0724c0c1a1c899d847ed3c50fe0e24261aeb9fd7bf1019bcd52dd3d512c1d7481f26e3e1cccf49ec9faad03347ff66e5b0cb70f7ed79ef397066ff368f9bcf8de9ce3b4816479c8f3963f8f6ad3a6712d182817b379c8c102360d5132f6f4bd0546b3d4a7d4cad098a18b3644373d05119ac4fc60739cc23257c38dad381ee15fcd476017a9e349e1312f9ddcfb9515f9773a0ec74f4bbee38084edc7c75c69f83d71dfde1d336df0a780cbf3a7d89e0ec6806087dbe8fae1461a3e04254ee3e2c8b51c1283110b72012d660c6939ca696dd59890bea3d8c8bcfa293e846a4daa2b51e4295084d37d7c8e1a4921d3cb5fb911fea29817d6a08d28dbc8ae8afcb2bd2e96b7a8a4d5216db3a51cf6855a72d2599364c5b0353dd4b424ab4ab5a63bf8c24c0aa6f3f4b7c6b6ced6d76b1b1ed9cc7d86ed38fcc1f93da0b1de0bb2d36c0e07059ea3b4147b6816d99bbdd16071a3e533babd6f08f3a5a7ce67fe516207173ee597a6daf0abd43f8db5594de12f0b35e385c0bce1d3c88e9e5b6d5edc115000e3bc813f4e8c7fee9acff606a241e8e39a3414f6b4d457e74008668dd25ef98f5001af81de8e1e167354a02e762bf88f1dfd78e07b2e5425d3f98c110290488f569c32e007bacf26cb485328f5d6c44ad820d580b6d7aa7bb0a7692e16079a437037d1bfb2af3e55505f3de43ea42d0e051e0d661b87bd78f260a8b51c1a6a2005b7698bf994b1f48f6e3984e115028d88397f6facf4a7362198132627856ab31b4bbec0480fdbe5f29ecaf339efb9e10ac60e74791198412dfc1ea818d0f8504f551ac54588c38c0c2dbb0a351796cb1fbd6e6ea31719817455a32765f7611b59a151be7c2657890c062a32729a9679d9d2d263fa4c9cff36ff91a52b1189b6a3549104b0619712ca935da93ae5c2f7039a1d5ca71f49258327e957ce655a496591ba92dbf6fe566845fa5b2b1fe5daefe2916699c582ee5838b135fbd1a9903d44a4d482bd95fbb72275480019da142232c8fc32d806f15d8f221f88d68f57cd02a1f29ec4056e30760dbe05f65964b8686b74cb7e0f8fdcdbd059278b32ea175ee9ba68430f685c10e3d61b69a19a2d9effb995ec3764b50ad768afdd164af7977202cfc1ea1db01487d5ba12e25d298e1d56f018439317b218a1d5a59b366a25ee4c33cac717615b57d15c99e8e5b187e0ab833650d4b4bcba8175e0bb8a72d8198ec9290a14b74ee4cc219c67c5d114a1f821b7fc4ac4e22476f1e1226c5da7eb9f209d1d6e912818b9cf96f8e5c4b8fcb5f9101d65919aa6efa239bebce261afddb4a08d6be6524c1ba7a53561d98ebbf061479c1fce5e5f132095c63f1407a496a52717c4d81e286de1eb3fc345205f5b0e66b4c0fcbf9aea3260971a8cc8b781fa11edbc81c460b38fa7fe3491c106f4e636e850cab003efa2ddc2ee82df5602e0b5fcdab1a6ff0f607cd407872a96a91671e541b075071d37127d2ac93af8d7e580223df2a8686061a6c62d2d4f926030d5b0c6662cd7370c8f173f1b76087a18e724bb6c70c7de02d3fa36d322c1ebbfc1c9ab5b5549878e0eb846bf2875b89fdb94d2d30415e34e552e9873275bbdb91290faff0c3314d5fdeddcc0b5709bf68364c0e8c2d5f6e0e9d550383e9be40077474e68b0b59e9f8acd336894dba1748565ff5f19caeb01a80c640440a663d9280d0ee55999cd1bfe09fc074835112ded64cd380c966e47b19a1c3294e0ddb52e4e69f2745a8626e34a1a1208ce2e849b98ca8b283e0a097605667baa55de551bfb826da6375225cc3bb36cebf8ae2db80532dd4ee46f194d8b40cf7626d15a01867f3457d26c9995e63143daea7face1bf67ea49618a9b8b1e20741f3c1611b51bfb173ea2790cb740bd4e682dd10ac4c5286a85e292d200538b15e8734f656bd2d3a825a6b8114a8d3cbfdedfbdaf13905e2aa2ee26a76591fae4a9decc801de894b20bbc1f738b4299b0168ed7333472aa899fd752ec11d401e19b361811a5fec071916c8ffaabd2d04d9fe97bc823337c16f2110e3f0cb2adec4e595e455d40b4e246e678ae1089916d560dd88c4985e019d2a4591fe6d8b369fde30590fe8188644027a8e2d115268200ea631edc81166a5182de0c7bf11155545e0184d49bcb84e35cadaa0e9591ffde9d78f9f4d51730a059a960cead8a95f1ac366b636dec821d047a112636c69343f9a00adce37365c5bb753b89bca90fb4c584dd409eb24b1baa83ebcf24fa9bca40324cc6ce0024b7e2f6fd25d0bba83cba32d24a0d773ef285558671ea926867ab7a04a4c513c1c6f2e82ef0992a28851302521fb1992ac3d706d80498290b194b4f4444d36e5d54a4269f4ed2770a2d3d3edf5e1d3921a146a3202fce4829f30af3566b3ff41df435de0bda7524e71d431cb11f84bee2bd70571c34c216182ce1830fcb70e32d063e745063890b2bdb9493e23b1ad65df1b8889d76ec1575a427869213e27bd41fc45bb18a4ff5806f62ff7b10a1335284cfc1a828abc12431885e3186b9c97261b36d593e92b4245f59732d206a515812757e8286f0964a3f5183581bc6a3adc863785af653bac6be8326d5163e5b17c63a4300533e73cb8effbec50b08b9a247b3108e55e668b77eeb84ce1d015e612a34c8172e85b2e199c271eb735993513f7cca2db6cae4a643abbdda35a67e7197bf7b190edbf17d352289af9762b864007e93358b3664bcd5116f2c94b711928517e788d319c0d138f95df511d85efc469f012fa121250a035a1fa063192174c578b383ae0b3b6822768e4702dc3a6ff5e31d03b64bae819edc090d8031733d0a837ce1d7009511069825c393052c2cd6c62e1c20071a56e201c62c2f8eba8f7b48fb3a45c32d61eeeda023cbd32d566613ada9f20d970138a5d811852515e844e7efa01a31c7343f3b8e0ea56a63fec6b33aa521615675c447b1521168af93aa00323f489fabca1af91d536e39595bfd83f3bda284e0c462da92681a4e75330b1bb458e3a18542f0e3308a50d24b2052a8fa9a02b80289ae5ac4ab69f7c0071fa7cc6ed6ec39ecfd438dbe8f7b766fb4beb3184f238b3170e21c0d34bef7940b0c71e461793ff414592751c8ddad4c10f88bd853402cf2d819573646091e933e9c774dd556638bc14c2c442a528638b1546b8b04218bb9a7886234ee93e2dc8f4619d7bbd435eed6d50785f49f02a396d03efd04fd5ce2bd189a9c055d34597527954d71c36f5f0ab7f41394df29792eb87e4d0d0767c122836bc110b0c73b7d868a297b5bb70626a9676f5be5660d32aa2236f3ebe2aefb1687ca12b8f46e7a137228ddfc9ac683dc1331a1a348c82caa68773f32d1c0831bc55bb21b429ebf53a7672748e24501fab4dde0ab971fbca773abbeecf7b4c8c8fccf8415ac1cdf8b9b6293513e579cf1a5dc234bf59fdd5400be8f2ada777fc65e7873bec2d97d8a6b8a99e57dedfa8eecccec6e87a35f09e7b0265c6c7e8ebb1921721ec99ed1c7127db2541c3cb92f39f6b41f5abbc965e419e729c6b37813c56af65000f1cab53f2147263ae6d469f86640ce70ba4a23d3c0792ab0f0336c25cbd69a441949fd10cd28bac898f82656e526fd741520909be033e63bc583f364803667236e1f9da3418c2e27866064ed9c3c292893e697d9a4e71376d0d802aed9ba1694ff82980718c3446d1ead79f101c53a706e095cba9849b94832be58fae431f851984986a2b9c50432842dbde0439a2a997c86bfe9e6baf5df52a61a2e1722744169605ee5e82b631f27e9c4b6874dadf3d7cacd1d7669e9383845cff6ca093af9b4186c160d020b5318aa0773ad72807f0d108a3a08f8475bfac707f51965097fcca759dffff3412d5bddc8f644f78c83916634ba1b2e8521a4359b9a7a766d6d606637e5d0052beac86f8f1283b364139bd10d7ae6dd6101d6f82b3b004a54a50441b4765f4ae44a57ebdc289e74e3e48d7fe83da5d9ed73bddc4f1e9fc4369741793ab16b6283fab4ad9a1033d766f591b16ce18c1007b2e99691587f49896d55f33cb8772dc006dbe8072ada75a1e2d8122404dd704d28b2fd725889a4411e51a975be61b66921990370b2ab575ca37d8b2ab7084128dee302be87c364196c456b47e3239765b7ca232df736c1fbdc54637e697311d52ded34ed47442e18106c312a0d08b60753e4ffa2db0b04e17a66f6693d016e3e98a0f99351115a0c41d1391b2db45aaf19e1642d656dd8618dac15dd1a16dd200aad86d8e403adb1613570e5cf09b7a65e1b35a6233744afaac61d874475196938eebf3a0c0806ee783f9a94469bb41dcc476931b61d467813cbfef58f59a8a3db3f522983b2ee2be896056f9a4880f56d3ec7613d2afe7232991e6ae59f1469698dac00ca907bd905360fc5328981315518f781f29d8dc8f67eabb059d2d67d4528c1e3922b5e8662f92e9b3c677f4d14bf1c451b9585b2f09143d8d8372f2e1d754e4a1ce472271b06b5dc47d7221701390e955d3a4a8de22795eefa9c500ae98f7428bb652feb02e701d7880d24b4691250c2c51fed5060dcf78e8302453ddfa97cf80abab6c7c6fad603d7ae74a550b368091a1d79c6360b6f2ad94b571566314b0e413bc5ff38bce3418f168e31e162973e995f663133f0e2b3a02817a3b7b9cfe29ad38f25f47f78e6a10dc51f8d51bee6286e5b8e587821473e80a874ef4f3fa1f256ce013b61a55b0bd8e8523bfc03d69981b8b7b3a287cb5feff331272e8f6b32e76eb9380cc832959d58c5f8a9566308b2e09a08c633b4ec4a0107dd43dbb46e127f87dbd1d4719ffae5da4aa84f95ef4f8139c68b2cd069d72803efc72b382851ef03cc5f1549912ebb3e4115029c04d9baf1ab2757396edcadf49efbfa56163669df9e22e17bca99a41b36499be81f45ef5dd196d46a23212fdbc05694160b1dfb240c36e9404ab3498149d39f411fbadb57cfe355eef71703f3ebe533e64ef373e36c078b98dd19f4403db8f441bc1282c1df2b29d59e7adaae129eccd9b656e8be44a7e60be373d5d7a4b97406aff04c83c4d37eb6489384bdcbf26d89ae654df5258fdd7636f38dac2903842e0bf97c8d22743056b9bb7ee06399116c1909683ce25f5cb15c9081f330f500afb12cf186b7e474534ac5b34b10cf55d637730a2fdd315a9474b6c9a7e13e0f1c10dbdb2fddbb522ee9797db37fdae20db64124027dc3157f459726bbf34a2a391ac1b495c309b02c1cdb7fece1208bec6d1595d6c374d122512e832e4ac1167a87d20d8a53f9afac66ae549afe48e933b9539a4a12cc08516819290b32fc8c47ece5e410dd6da7721f7b0a7e5da49aa1d7e8b8b1ca0a56bff9bd4f31f3633311979f34ffb61677a2a241b5a2c9517585ea0edf6b47be15315108717f1986e9a56989977b22dbd6addea996231bb688218dcd693a76b06cd70872ab38d277a1d9a86faa3b8c4066d7aaf0b72785b00dd64fcc522ecfe63f427a788812510d33fda5b606d03e1f9642d03e369fbe5655ad2c7fa7700f0a45b87e00e56a7bde5697742aa046f86136d4c926fe4776b9b18fa33229a8e8faeea690424ccee4e3021fa11358ccc1385fbb2129136009a8b6b00cff30b7c61aaecf80439e9dbae30fb8a08147da38541b49c6be8d221372719ceeb63319ed855bfc036d666264abb7e5ba20366d83b957dc317ee1bf1ce36e3a7c935fc08dd396a97be6e78fc079ba8d5c5a7a8bcce985216130540a252143be4be9ea3f623deded89c79cd3686e11c84a34f18e3875783d2feb1dd13141f0fc8fab3a74964e9fcfbab5db88b5f8d4b2d364e5d6ac1cd0953a0144bab9b9af1e6ac3225a6d169f3d16374bba5ba39ecd9804a0399ad59d30c5ba882cebe14db5f72f125227035c59456f0f1cadcff00480f319c9c6ae954fcbf300dd2d3215a97329240b891c29ce777e21c7514754009e159133e22827f07cfc5a429589073d94a6de85cb0a382bcb971b19c09df76095083bf1e906b1dca71840b76114381900de323c2e88b68debadfeb7f54a45d12bb728167ad56bb4fdb62b4d5c754c6444a1b2408308522262124c34f90d62a0111cf694ea98ef68d201a389d98e44120146a8f32a2a60fda92147a2a3c88cb37f97491d0e48953194d2865b33f87a61c68a428d47e2b9b61e28faadb65bfb3309dc9ecffb9f820300e8f431156ed14c514af3fe9f1d245eb72a075f614d6ce47c4a94c07a663edc39a2df48fff1c5ec06758b1ee777416a2f3233afc31ced13867a8a4733ce6b3285b7fdc1b81e7e97ea0668272db6e9000bcb52d20456274f017b701597b68b85bb350a66f780109d6c83d716ce5b576ba8abc45a078f6cde95411006ef7b0308e4c0d29ac3dd0d3aee5833f714d3cc0d35d0e827bc0bd60702527a7cd4b0a4149b7c1c44ab324667e03adaa87898da05ccc32842aaf67d957eaf64bd755f1fa41832214535e37fc2c2b3469bab332304e093895e3ee7dbda3f05e49286b637ed3f0e37718f1ccf4e6d2c07c54cbf8c5d8d511e2f113beac2673c3a2c7643b59f5428c86c996238293b4faf00c8c22bfbdcd40e12b33e950da54abca5b71fd29e813c0ec7fe374b7aa6a8fd0bbbe9d257268e233b35ff2e68683674c8e42e9e3c5261b12bd3ed12d326a2e3c327261a07c83413b05019d06abf6c4ca151f67ceb008d5605c5b4e3a51a502cd21435101d9edca440bf177b4f8a60e8990623466b5c0953824f4c3598af7196c35a407f64a71dd9c12f2b3221804a7855f80fc4b6dbacd508cbb304db9c284a424034f496d7d087eaec12243b200f85a8f947cc2c2f2132177a618ab7c05c35a6afd7dec6c0647c8c3aa23af1030798f0044b7b0b1930af3d4468b82a1bb732178fdf3d1bc9b2df9d355275cda6f3e80553cfed70763549ff06453ebf6215e941afacd9c4f08823332365cd065af4033ae63c2a389bc00052b94886c2da48000a7ae923eb0e31e772e7f515ccaf98b785838928734e103ab1ead67dcc180f6e1f364782c67db33b5c88601b9ddcb17114c3c590c18b84aac966dda0559004c31ac1653910e058a056c9e58012b49d9a717d5cb5cc4558141f3eac16943c4d23c862b210a0c04c451bc3c90f3afd8a8905ce77bc335bc868047ac6637b024e3b86b8d8d33c17375cde61d76af4718f7a0cc7c41e82760b380fa7ff5e1967d0a41df364fff1828d0a79a4dfad7921cea0983d17e09e9900619266f34dbfbcb4b2c30ef16fc13b0680e7707fc491f0ccda0a70622a951aa7a3dd04290d705a5219ba7218a8b340f6590b40d77524b2f355aa0a93c860eebf13e48d66d946115a2703e08004c5997e1fc9f78b3a2153db8d6b18547244dce58abd0c310da5461d8bfa602f9eaae2a04c8113ed1ee2bb758309e0ddf4d567b364a855e73214334b95243f91fa8de83ee04792d4aba5e523d52cc6a2147957164c7a872faab9200bf4c3b3f65ab6a78e2fbaa7edf49c0b7468533369fd63319ac35c4935be314d0bb109cd06f358340652b0604d6aaf3aff514296d7a85332ffb139e733d375e2a34668a6291f10189dc622e790bf004e4fcc1b316b0e559908d32c712ca84543bde895105e6e805f16c4a5414df6fb2e1d2d646933cac4ed8955d06388b6efd9745556dac66835cb249b269e1af24cb4deea03a516f97d1b126670b8256ff7b3471f752eb2da612405f7bd5f6905b8fa8976d4c4363ee457e7d95997f8f94f4cd89be053028fcdd2469f485b6b2bdf016cda7ec470c2de9898046c5a56cb1bb1f4116d8ce4d2a0a7adb41dea6326710d6687e0b4b89443ffaeffac420e11006c09d7f72c5b53967bf00f7eeb4979384fa8118f8591993a6f1a49fc1d265479102ef8c3acbaf18bb2982eebe4479cc83e1e7cf36046a817d108f2218b7217c6a17151e88a4b98f3ac835079859526f26de8f817a646c0528ae248caf829dba76fe202b87f42496ace2b60ec97979283b5933317cd8b1c150305205137ac90d442e4b1f208058e5e2667140f334d5c3105220bf10d4c2deb070f5e75a8603c37c72603c8d1f77aa35c3bd90c1c0e890711fd5b0373fce8dabc0c00216229563a6e48b13323d5a7d8806aec246e3e4c7ab46043f81be270ea73b2a0ab45de4461746cb12adf59b227ee9d315602b874930a1161c905b6067c863558a52159fb7a4729667c20cce4bc29409caef5359e67d31755a98d151a80a0485052db52e94e49869fa06d9b5022f6135d1345a6e2f935d604098f21eb452bf510d4ab2b35bca281e992bc92dd472707f211cc77113431fd22528bbb7ef4b238ef588acab66201773219a500fc8821ab6af9bdebc5936a3fb7f1f56abff42f4168b7a7fd60b139449d4682c0b01b33703f57a5c24a888ebf04157871f9602a0f689492b7d30acaed0e8741d6f8ea2f7c70b972255beff3e131a0f9b29b9177e8adec526e1d6273ea785670c34d36ca3ad009b8318593d0d60d2c37d4aa60dd62ebeef2b9f31011c4036f7a008a13e78eaeca3a790d0e68c80661d9c017a0b13eb739f007d60f0571d642c9ef4b472fa18d460ca0a60c1da2210b2e01762b4eb63f8e88bd1cc3441e388ea29d94a3faccfaeaf48cf9640331ce414f0809153ba18887e4e75344159bee975b2db89f0374c6dcf214f3b15386e876724b22906946542b21030890951b68665637fcc04a73ab432dba5803117625351a3cb0fc0a0f18df5d9e4d8f740a3ce4aba86542956b7d1e35c2d9e29d5fb6e4e02797db00ce7bae4e34377a70597a5b9440bc01479301d1c80bcb63328038caaf80fd15a27b0288030b7d009bd4e1e55f38561c831739c856bd5d0c6b75c8d631f00cc3d91df175fe11b57c01b2bc460058dc4b4196371a841dc1eb268cef19ad17b2de8f3c8abd4d5488806aaf49532969474f0c1eae0c52e819e48127d33500bb00e38241d193faf2938b164d9e137089784a8f9aec09499c0c60978289ac4f9c00b238660a214a1d3264b83ec94a7903a2ff2f17f6f6a9b3a0b6f2291424736ecd7ac1d7088977e1734a7f65bd9d6537d2462c4c9f7c1ba6011ca4f4124213031d6cd40fa7eb5e1d2937d1d24d30c7e48cee360dd5f0ece89d4ad6b7a28774259eea258dc804cbec821063266b6dcde9009b2498d4369fa0d54b44b7c6622c472317f1069f8c9f56bd13f5eafa2b9bb2dd4a3dc29301dafec9580121af444f90f512162952c40df0f086f8c18738e82dba408136fd89dbd53b320c3a56a2c6a2fd4b1ca0289e626a5fda093a193140bb9ea2e4e264eb79c831ff30c6d73011b810365a295f62ac0750553815f3e7f810498c6dece4d31b142cb0ecd5de80085326840092809fda9adee822e4df63afdf35898ae1ac20f2d019699b332b94cfd375c3c165e8c25e9c4b60392c969615017c778d4baee8f5b39857e4b327e2b2e5c949f115dcd95bdaabce6195d9433b7f98b67e4c5bbe4fcb01bf085c02b110764fee9b058547659b39354a25bad8bec4fc05ae78a8651fe569eb0d30d7ed42cf80075ca825bce7c7be68b0880149d23532d5d282d95b0c8c9623fa8c77fc12166b371e736c9b0ea842f0a8a4db5b6f0c6e986d1cc0843600c95712deda44d8561cfec0067620364a1f4ea4b5a567fab7ca4441e148ccee4738b2e897877ce5b7cbbdcc8d56d94f87f05818c2f1eb16f284b3c52263830ca4b42b198a43fb6d3905801905b115d4194af8e04ddeeafaa3c1307f3aea3e9d02cab3cbfcaf36724f3bd0e876aba6f155322be53fc5e11343d9e2aad9cb9133cd14d18ab6854b3721d1f0166a607e30580d95f0a617319b60e0b993131fc91344af7595c2a11ae2d1d068ff58f35b6617688222444da30ead11cb78a60b7b831f85e135f92f908faa95470d8d3fc8579dd2be73c13e63b5cedaaf600c8872847bd9a8a23029d892d9737b62e131ff58c066261ebca1d9edf5560018c2caaef9b21252de06577dd674e52a925116f3b8ccb921d574d6c34e1105db6b6651f32cab6d73d76a5211135ba31f5cc40ca2077668f81711573c31a5b208d28c2f7a5213d8428dc7c63f103a69f21e3134dabb3c56fb4070ba4e92c1924f53ed7e89421608f2e7f1a3c7e8fb24a845d1a42ff96584191c70be8989fd5ac0952bfe1b18164d628b6f9b94691da96f598aaef69e7b14059eca5b0fac25f50d2f2cd486e3fe04839934ae0d7b71f1abedf0ac4c3299abe1d3f9036ba2c1e34f19256a506575f03e79e67d97599b0ad89e436d43fd31457de12de8fcea3eb8f57e3eedda301b32e548220c2d60c216b48cf9b6f41ef4a72b89e5e0d2134a1d7b2faa7ba5d78e93c46a373a414542b9ee50d8b218057deece03aecb6c47aa3e31143ad077ae52582ced860eac28e8aef072d85209942ab662456cf6a812290fe6d1fa6fddf6e15971de488a3225d7e0f69450945205a2d48a022032383b43c979c04395617ad01bdc92bf6d813dff50b0c6c7c1aad90ed05461372ab752b9ef40545a5d29d62aa5955a09151b8f09c76ae5f60fb56ed4fcf108748482d716c7548a41c5f6256b6d992631ea34f41bd4133c76dd023ab2eb56d8d59c62940be8389114d19f2c46b7a2832f0ad0a5e961b1559bf419dbcb693a89140211e7b415e77b73393151e91d9dfa79bf647fc8d5a82724b6e0a214d5075596ed7180c733620886eb856559351adbc98af524110938a99d95852e7eb762aad99522cf643ee314e5a0f8071a4410ba11e5188c5a3e713bd10e7034d81e56c347bdc8ae7c5990d17f23b9b003a68e039a8052fcc81478b8027a59914addfa375e3f890081a3235efc5b389868af88fda6e08d82b4783a43670abc44e6e7fba34143c2acc65b82a06967b91d60a102895b9216b77b5a76073e292a15d04888940f6c42a16025ad20c0a9a013bd59d43d3716bf40dedab57b348f823955c913a7bfacced3a0a4a67ae6fb01f52325751a0386042986220a36d8084a28c91d39d93320df9323a9c6d0e03058a6f3874518c0dbde3dca0296eec8a8420e5d36ddf819eb87ddfbebc98f6b6b46eac6c3483a6eb5fcba8785caef06004284d980b91af2a1e5c6f0b9e71767649289856e48f2ca21d1d1299eee0301e45c7da94b8f135c47262ab4f2ae314e94f9a215f0a9bf03a53355982f31c18e8ade2c308754ee4fc1a31db6d869edad656ff94ee6615a5f4a876723552e677664b72e5e43307699c71bb1a2bc30d1ae4dc9425ec99f74d37352d4211d936d202d8fe23071d0d2fc326bf93df5042c8a19b4608278bc6fbef6a8d9a9eba6a2c7983bb6a63cd4a1e9fc5743ba8b57c04e0a23837d26c98449443cebf84a46f303ad4eba9163488c9431d408bebb48530d4ce23973e63c531853b82186bb74f33684fa1bd36b7fc24dcc520ae7487b7125282c1eeccf64c99b447503b7b4307a28557c3f145eeab47fdd875e60c15ca15cf94c201c83d91d46ddb7df42b05cb32d0fe5125c14638637febbd1ae80250888140c908040c563ccf062ff37cd01540e011180a025084864bc199fe87bafb88024e1000104540e8110c59acf8b7c17f5170809082c8180a4d0209138b3fcd1c34d7b0d120020e51088040a2e1663c61bfcdd68aec00204480a07914060c563261349f382e260b2060a4648bb2bc5f054f7990210c081a51060125b4f067eb9e710d2711c5b48cb005eb064b483e65f3f06108a484966cc22e7769f6d33a8de8fb0dfa95d342931ade2cf52387af00f9d8b436349d39b98b93ea9d6f4efd722b55de9960c2bd57f3f8c1dc5fdd93170341c241578d8324871d0fed81725735a99da57341016d4c6082eb1852c49c41315848a6d73151ea40825c94feb4cad5d731a6a67696e9cea708607c4ae5edab06c56479ede81bceb5f0db7bf59cd5ecebe28af539503d66e53bee29181b52e0eac75dedbe89f04d5215fad310bd60aa5ebe579aab3012aadf019acd0804c336816561a37e84b0341f792c44c4cdf506bd5960b1cba64cd3059f7148f441b9cf0fb996a250292b6041302a52b9863d7c08a63521d9571ca1ffbdc34f73c83ca8080121c8430d2b6a6b919196056b16172fdbb32b05ce7bd2c59d47e8f4c5647bd77c0c204b31d8286d0b6de6b8c58831f6b8d5bcf9c51fff0351d888a66f1353b8f85c9f1351a951412c6b11134940896afc1ccc0409baff11030f069c1e6a3e403107d4d07a4a271fa9ac56716d464abaf71c835c0ed289ce3fa5a7ad594ae9a252cfb5ae17a0df83a51b4af496f5f7b99054a8d115c5e25571c83b86ffd6d38dca4c8aaaf5f33e58033ee4fe102b48b61ae879952caaef80360fe27b336343aa65936ab356f968565dd376467a1f69b3258afe7bd8cacd57f47260bebde9685c5ba6f64ce42edbbb2b15ee37d5959d57e836c16ebde2c0bcb5adfc8cc4afd7765b0bece7b21cbcb3931e69f4579e8c228e02e25381ef7e5c7c7afff3e7e7cf8f5efe3839f4fff3efcf8f8eadbc78f3fbfbefdf9f1f3e9b39f0f3f1ffdfbf8e2e3d3bf3f3f3efefaf7f3e1c3af6f3f1ffc7cfaeee3c3cf5fff3efef8f9f5edc38f8f5f9ffd7cf8f2e9dbcf1f3f9ffefbf9513ef856489a108678c291466e5204f41f69bfa9fc52fed1ff43fd97f69fe227ed0ffd0ff49f54bf29fee9fe51ff43ff4bf961d521d533c3b6fb07fd57ca6f9aff947f94ffd07f52fca7c03f0bc51faadf4291f99bf3ddc488bc373192ef3906e473c4c8fc38df21868cfc8ef8dfcf98833f2315fe2cbe49eb1ffe08b4f537be609f71c6ab5124d2cf1c6404fba0742cb8b09116f29c6e807459df8894ad67bb02ec7ac67082fe71377f2124d92b774a4092a58bd303fb6c625f7bebe5ebd37ee2831c0647a401543c685ba73f776d5ff7f8a69fdb21d105a30639df96a655b0c350ab7a50c3137f26b011fa7649dc81d85d03bb69b82b1a76a951f735d25563bb69bc0bd4209be22b70c868885034c41eac82b7ef2fbd4f86ee5f7fe67bd0cf2e968852ea5b8f8822bcf1b437d03f00de2589b437d17884ced224da9e09fd411709b7b1bc961e74ab515c6ad89fe81e389318dbe5652981db1b05a5d4de88e6b80f89db5cbe940ebb058d629f2de1c2497d601ae40a576cd1b8f6af24fc3b44fb3568e5e270039424302c22ddc38709c2d95958f53330908b69ca82617fbba2824fab5851115b90f6f1cf421502809ca48bd67a1e6f31438a5e62ecc8354cf5e229ba7ab25e957d19f51c4a8eddc1b77cb439202aff49364feca369a1cd7a47bbe1f83ef1db4a85420f7bb124b01525bbf9a3790530bdee805052a292d75419f34c039c99cdb066b4e0cede8031d314f64c1bb831bfaced59c8a8434d227816dc66a8f635c7cc5866c9eda1f60704339c9b84489c3ed48ebd83c43213a15cb2b13cd38d98ddaeb0e5b96c5e5223110c428482840160290458000794e0004420881802161831cf137d5ef447d85b8acb05da23483c82b9a55d5da0de02e4104021005a80b0687c1098404d2594a7b93c31aaef0a82abcb9393fb2a9c49681425262670daa84742eea9abbb1c6c001ef8bd50450adf86b2b86f9e4bdb47fc2e31aee7432117f09311c66382097e64f64d4d013f3ebf47eb8eb4997dec28f66eb45561dda2f2c93f49dc4e2b7f670e444b21b2a622a1621f4ce6b448032c75d41f247b898d975b4e8bb253cae14a81b2e028ae903eadc1bad933d784866e47855641f03ccc76238cd90db0b3b660cfd08439d31ac66c5398f92db0673660cfd28439af1dce7c43b8f92de06736e0a6f3db9a57323a0f19da5ffafef840ff4bfb8fe287e67fda1f9abff4ff9afec2ff249ab42955545c0415a3e421a7f94bfb47ff0f5dfe0313bb6fcf865023afa88550308a1731c51fca5fca7f14bf287fd3fea1fda4ff47f343f13fe50fc55fea5f143fb4fbbfa1e12f43d453b8e0a0b86cdee92b921c7f1fda4b534bf56b042631b78310253833323339ee1e568e29fc6b2527a4bcb25cf4b33756d79e054acac8415e088dcacc15991d660e64ceb98c8028829083dc447bfdeb8e1a75c859ae3b11b76e6996ab978b9f322f48911f51c2a2c2e727a25b40854eb861f61902c3b69317d7500a0bf7f42febf1fb085ba9fe99df00a3ec11929e61c1e45f16a1525c814fd8bb560021ed0b345600fb2f1661bbfd18bf44a92dd88f07eabb12c772c403233b734687faa379c30e56bdfcf8e939c2573342932da5d6c13551aa177ea9270fac6c3c44ee5613b9d926736aa80d72e846bfa9579d3358ec934e1da65b8fa5ada3391395769a33941f810f164f6260483879881c0b4534ecb4e467dfea0e08dce2cc469e16e485798d87c56e8689ca1b838c2860685d8310b1cdef001cfcd13f9891d6190074f401430b80b22adf81ca19689b6123a471c5719874052d450190656866cd90840028130177d23b58c3b3afd7a651e4ad007a6a96be5a5f11e2c59efa8d089a93627d1808cba433b630d1aa32c0341392157a1e8f73137376a75b0618f8f381ee9a17e4415a70fb81845c8e308328515edff66254dc70a0beefd8b972998a5012071321b4c7148f08da86b626065f4140ac1dbd417b40f843fa7f3b10faa25aad8720a498facd61b17a3210663aacbe2473c58907f32d4f317158d2b0f69393e0aaa17fb11cc86115b2e0a9c9d5d9799bb2b25329957f0779f5c096538d03fc18d5fb42d8d5aae8284ad2663c11b5740475cc393e83c71f3051d874b49fe99b3ffc037832bb7746225bbfcad5259bb05f6c40f5c381d9aa78374cfe49865d323a67145a9aa829e2b7b453421cc21bbbfa85e106f0524f9a88c1c19d231178ff1f81718d8f747d5f9237f5c9659050ed2199a842dfb41aba4da3a3d784327a4c6a079d760bb8178bf0afb7180b9e0f97b3ec4a2ac2780d229aebb5a2710d0ee36714fb028c99004e4f0372236a793800a644f67ca3aea84ef4d9c869e247082580cb6fb334ada0b036825c7ecbf335a9f0bc7a788d38a151c767e7f420645c010e7a9d5a81011c1742d6aecf3a4c4b03805782fdbdb2c389234442479687d9982e215ec84d8418c7dea73c785c3902e563642672e8b5b0c493503a02aa708743ad743bd06e9bd23f1aaa855dcf1b8ffac077ad0dff35d0e88c646f633fc748f06e4c7141885c870862d090815cf4e03d825f965bb3e44825b01b5a2feb7abdd8115a7ae9e2fa105b8aa5347efa03470eceb722fa0e0110ca162e58fcc925f0a291c4be4da16735ddb71cad9ad003a895e0fbc392d1c64f3faa18e927a1e6bb11254eb0e587f76a0cbb1f487c6e7d74b226e68a022c6d0f9d0a130e7bac7765fe9e975a26b72e7100ae8f0a4e76c12ec35d659f1c84b75b902a09b7a5b38f55e801ee05285303869d0bb794d95d7c297ad15ee01db45a7f2e83babddac3b6aab3cd4d857543ab64a1215f7a62735c7b5a1c1bf840ef671a99f791cf764c3402d9760cc13eae4a972bc6ea11d74638f53073a077ceb774a57deebee5c963760a17f1786795bfbd8adfbeea6a5777b4af7ddb55fe762abeb48f01bde62d8a83298ee3bc72b35d2dc85d0b615bc70a4f50d5e37c2715532942e329d737300220e60c40b27d3d632ad94c2e57322b1f589c1502275cac6465a5ff909f0c165da08ab5c057b10f8bc92cc109296b02ab111bd06091942630a1b23ef0056205382c2eb30427a4ac09ac464c50a18be40fb5c968bca2df00815b4b2afc1ff405fbc7c1729fae52e55655bb870299619ab8dc4ea1671d0ecfc3b47722730fa3ab8d9f7d4208db7ace9d7a21eac4e6690c0c3ec6a12215cde2fa2078fdad82389c637862187f70f95c2eca060745261113bc6158e19612262ff4f2587d1cec3093e7a14473ce114108a37c47e36d6d342abf0465e8dbd60ce2ec208cce999ea30f43fb808e74427f823c8b3a4738443da01f401f221d239cd19e90cfa04f1187518ea807e807c88788733467c433f413e441d431ca21ea01f901f214ed1ce11cf5847c007d883a8c72447a403e413f459c473923d913fa25ea85ca729d45ed02fd1275416db166a176417d81ba54b75cb15cbba45e405fa82dac59541d8bc5afb20b64194d6000934627180883b1890fc4c04882036fa6caa477694c943213ee300a12e5bf200857785110ddc34541ba4a8b82607099d3d677a51507d9ba541c64aba53888d687e2205bf1c4416c4d138320137a2d7190e797c4029ccf2316e07c8b5800673dc4029efb2016e01c805880f3e1c32a80526733c021d0e4341e70ec3c18d6c534f15161e8b485b5e84a79d13d2ca9d8eeaea69a425443f6b2d6a3c821fe3b9c62bfe02e06bf26e300a9626ae96c5fbbbee7e059b332c9ca9c05b38390b57a6686c5c13367659d253bd38ccc59b267ccca384bb6c8089f7190c550ba838d80815297018c3037f21967cc148800424c6425408408137e04880fa19b3cf94e1e4334fe06f4f1059e45c60716491068cba603e4b8140152ebbaffbf004ee31f00a578cca099959f120552473a0a895b2acf16d9110b3522db5a74b2cbda69817288e27b5f67456474a8628862cb650a8d2008d4f6de296218f0141516513eaaec6a550d8ba2d24b776e6c3900fdbf5393b0a3c09be3b8eca5bb1d3166903a481d86b50d86b526450954d1485016db0a4322a225230496c8523341aa76632985168a3418d69a20019024008e2d43a42935084802947ad1d2d192a3a9a224f2088e24a22186476d864c55b2201521cd045ae233244a1b122de54062b8d479e83044c22163343a420445e481171b4a0184a0a506663863c78c1de48f1bd4118e5b9a1622058ea68c909033482447290c492e29a8a2a422354352a92847ed49498a146b4bb5a7a425440a184d29ca51945464658969890909071200465348435a8a72906bb410c9191e60a506acb90306a8512dcd28bad544f2078955f35aba51341a3d60a4c3a88bc8860cb1488924aa2d9124399246e411899424408d34826244638657d2cda8c848248d6a426a5035f12800524716a402885a18ca5093e55654d371a4444b8d8f161eb9fa6987a850228f9d3a41c8497d5f62cab2ae16485244e73f5a40f9b0cd3832a2028193ae343a778c28204c9459085664f8245104103bd800c319a8120110d21e866f415b00da83e78e0f3460b120822a104871d2c564490104dc00c04d0e586078c1820a720308a0730132f8347105384c3bf4851755a8dc00e09604103ff0b0830d35c41086830c72114c79c049d75611747e20e28d99969e258a00c2871d745821852f176cd90250127876d0c18d0c5c86d7dccabac5002445147c82f021071cd8a411b3c135731154a1f2c056d6112aa75b8c22e80461a68c182ed78c8081ad2559475e8a288aa023c40f39e0c02686346338e012c6c056922354456a9f2645144d0811c40f3ee480430c69c688e160032e4fe4c2aa2c0055160aa34903336430214019982f521e883a61832f42321790d2c843a321a23046308e5aa8b130a619cf88404629324a2c957e900a901580024601441d4639c800441cb51b2200483568d0206db5194b326c31722c05a02440d20dc9e8a8c8682c2a222222c52fe29274c01043232423a49a8c23224648e4004b6059ba781c3515251d4dd5966688b5a5a25c2d48c6206fb53c5bc80c8b648c4648b5a718034cbd304c8ab264d69e64641985e8208252138b90c0192669a2e4b665ac25d59a387d319c424b0275b2884454b702acb28cb51ce40f54dc5145a4009e615151015e5c6cccb8ba80649205836100480f2c312d3149b0c4067ac493bc1822e9484c74636c4648640c22b15a0660b21cd564140d20ce0892858a1390124082cbd1a010648c4a4456372323b5062e95355a6a1035252d4942a0a84a2d0123235a6e3081891616c200608be21283d744833843a5b457664b0c2033c4280290478c02209225c9c84851d2910cb2c816137280a4255e0c938cb6627c1d69e9c85a9284a4b5f46522b96178a3f64424a988aa468ca224a52c1e11ac304c3ad22260f7654844da88c422078a92888e14255075a59422f938d22a4a320a208612a41eb52ea41b4c0220900380048e1468e0090259928e4aa320318214d9f2325aaa19e520a22289202dd57c542b2324a3a41a145103b5292b914807b983088028a4231e6924eb088ea32400908a64c1ea521272d454eb51eb51c4c23001193525440a101180d4a326c00c2972002dc3124a247be48f1a4934018f083ad04167185ea883b606061652d0004b05645cac7779ba08aa4020250a942faf260c68514d056942e000036aed071fd2fe6041c5025507f0c81180d1191173ceace040d6025403d858522a8ae3060717d09c49010513cecc4069f20155962103f69556a88b1d047fb4d821a76f63c2e05ed59124233462ca8a202991270d1a2a23446e3029251d1909a0c3861aaa5cd34917035b4bb2a8844839d1b8c988512381830c30a0d167c81b185e6001cb03518a10c1c154b353878b28554988201915c5d00507194e00a1832f1394400209619c74551df1b124864182310eaa01aa5a8c7e6a548c4e10f511971893189140c2b37467b4331631ba1963206118c56a56c41e620147031009102380f1c6684364bad520a231de445b4dc6a8449434221d1d8d464644634d24455181ff4ffa1c36a624fedcd99ef146a1aea97938a73164880d8877cb03ffe2588f7ff1ca92929844d6649a56e8d474819ae7382e9d9a7629cf99578c777fbc92c8bf283e183c48f005b6c5644b498ec9d6574e0a8eab26a9aa4e4df99e652fdd054f74ec9fa719034bf3d3ffe7f2361a1f55ab6acf16589a7c9759fbec36a184bedbedee1c8a774d20fdec117d7d91dbf3874e17398b3dc33d407c01c54d53a04be8cf8d3950381a2f0d4c0692ab232018c006911e2efcd05b83800c57329e0ff2cc2882818c8a35e1f5030d1b5018e451a284adc3111850312b2910c7ae2a0a40805c21089600dc10b1668938b53d47471421080b037a1450336c4c1922f98880547e5025e2704256b100a12e9638134216792a0b73072b05885afc00e2a85ca0e64f1603ba04d23cfc078778f04a57c07951eac73f015c864fc6b0faefaaff4675fe5fce78848c104f24c8897f3310863fe3caeac52e67ff3e6cffa49fff37ff3fe9cb1fdff31650ef25c20df6ff4fff22699bb21df19eae3dd595e36a9b91c736a38e6d060bb61925fceb6a4f57a7da54eb3531cfb8725c3bae4784db9a39d5bbbaed8f576ded3a578e6b17ee6ed65dba9a35eea893195fb61958b6190bd86648e974d597310f9fbce6fb0b56a79a04496daa66be3509929ab1efeec2cab2a452abd56a2469f28a8634115dfd7f7f5b8c1fdf65deb7778b42edce93a86ab7d5bc623c9c2d1a55abeabebfaea38454249577ecc36650efad773abfa8c6b6c4c5877750c0348f6f5b0afe7f593a3521353d12d4ffdf74f7cb4fdbfb7fa70388b050ea511dd86bfa7f1fff8fc001a21546a46a55dd3be52550a9b8356264ca481123448c0c3122c4481023408c4819893262646a6aaac81491a9215342a6824c0199929a8a9a325264aa489122448a0c2922a4489022408a4815892a6284c814912244881019424408912044801091221245c4c890a921458610193264889021418600192235246a88112153428a082122648810214282080122444a4894102341a68214094224c89020428204090224885490a82046804c012902840890214084000902040810292051408c484d491591222235444a8854102920525252515246a2a6a28a4411891a1225242a48149028a9a8a8a85d147e029866a80eec91451191f97ff46d483a609aefd63c1b928eaf664e75affea8ba302241ea13102aba7a7dd9ee7a7fbd665c2f3e6be729b052f58c7364d8b43bb73bcf01f5ee75adc497f189ed06e3bc8dfbf9529db3baeefa755fbe4d4e9b769e356fe75d942cab631f56320544ea727be5c3575a83f1368eb72d6fe3fedf0035ff5fda8ccc233147c37fa7a67d710ff77ccdadcebb56764ed0fc7f95b71d310179bc79815bf74e0bac4ab69c2081fa0f7b9b91f9bc6d879446caa81f26d63f3acf9ab7a3faf6e5e277ccde26263eed58deda7a49be4cccdbb746d1f4abeb2e7e4dddd5d37a7b99b7a3e9de1aebff0b20e0ffefd6fdabe7db39e659f3f296b0a3c0aceca46bfda45f26fcffa5bcade8fe0e9f7deb9dfdff01fe5f80ffd7f1ff5bffb55b8d2422cb11c0ffe3f8ff1bff36fe6bfcdf8494523ff8edc2f3b4c02fadc1f6edf5d22b1115b9fc3f046fab61714dcdbb665439a48cfa313584efa07a52515143a4ec6e0704885944aa47e487c625bfdd6e5e29dc9d63dfdd50dab72d6f04a0e6f5ffb7b7d578f80feab3b7ef98aec28e7916b53cbe4bde1dcb05ed06f22fe6ffcf6f23eb7c1672db8cbfe969c7aa6eef2c5dcdb6665d754e4da8ddc19c5251f533e5f789ae9af73c2defff65fc7f8cadf7ce9aea752840bd97bcd9e18f086299ffd76f1be33cdfa56d54a1ecdfbc27b6bdca6f17ee6aede92adc1a78814a49ff8ff4ffb5a3a39f8db78d4ddff189f2aaeb5647e36d62a1ffd3e2b9f136d1cdff33bd4d44f349f6e519ff7f8c7f2235ff7fe56d620f5303a17877cc261e05fa7f00def67bfe3fdfb322a97757cd33d53f5e9d2ac74d95ec9a19d73ba68177e7501be4ff5fffc7ddff03dff655fe9fefb2037b3c7d9e164ab8eddee1138ab739d40e9f9da71b6a874fa834fb7e90a5199f3f725067b19cfe10422447648aec475429a4482905c533b63fdea9758742d3ced35d4265bbdb97435da0fe41fdbfd1ff8b5bef7d6bb6d5bc79a7fdee9a35eeb6e70bbc270ac4b563bb7bf565dcbb056eddabf6ff89c8ffaffdffd2ff8f3a5000a3f468c321ee491d67ee28294d71c286845691ace0c0bd58ff4a696907b924eed03256712487646d690909a9d67670a9d525a4da2f15f1d0b1c4a8168919f138231c6b118f3342b22e703524ab58c7b156c7185eb50a94aa58c3321c2aede8b2c01559937670f1225e91b5cb0257b54a2eedf82b718716b226552ff54aa91eede0a285ac4a3c86644de2c1c54bbd129f1ceed012c301b28ea317f12aa9222155a5a4ea45bc52aab5a5251e15287139aa48758947051524d5f168c75f29edb0ede8e2c29505704555bc9a32854dec8c70ac6784b55af31aab18438703b53a5630b25e55a23094745409e3c3c343439b27a29892840dc9861d6c6355823385091d3a7862fd293a28cdd06113d5dd6fe0c86ac568cca8a812ed30e2d1c5ad71381c1a6589315054491e56b028cdf8184695c888875893a24a76b1a22ae26a4646b5c8884747c2d5967880d5c5c82a126921e1c418642ddac1d545dc07621579782056221e6ec4fa31aa90633770230f375f8b44720a0b5cf8ea82581fe9afc46a3be3a55e9df9fa444a3625b17e4de9ebd7948ec82214b8004656b15230d61a0f0ac44a16a06441172f2e5c5900378e5378b05115d99c888cea143a453b9e7422aa5153eed8a6fc609b42c756aba4155a52ed52afbad42975745380b071f152af906a977a85c403259d88a61c6143aa561e9038249d88a614619b7354938698632baa48738e764c31c23665089b519d3284ada81aed984244d18e2944882399a68e6d4a9c20a6c4e132c58720e24cb1639be283cd8a15ee49a72942d8b80411c72646d647c34df1c146d629726ce3c7b8f26838910425b22a91319810f16840e9c71d57c871dc711e71d192451ceb5813451a945e144531d188c715128754abd56a45d508a96654bf46d6a3a35a13492b35b1d648b23652208a15a98a5b447b6cec643daa443cac50803b228f28303ae2d1492d1167c5a846010e898758511d2b11513dc22256c4e30a798502dc58c72a8a89f5abd548b446694a0e4f8e95b472544522a4fa5bb5dd6b63632daab51d5770e0c48aeae392785ca1e00a0e5c118f4e6a89b8239c68c4432caad52b244eecebe3c60a47694a1f5b0d361d55be7ed511c684c34634458af17b1021519ab10317a21d5cba08b9222b0564455e8aeac780f25764dd8265381c8f7680d58644f56348f12aaa443b8a8a78545023a11455920705589466103d80e5ca884705b54af4405125ab51add5ba545054c5ab9a91512d32e2d165e9aa6654777039da623456a5193a1c203ae1bf4b056415af462858882ab983022c57e4d5c7f85aba1aafc418595e6435da51ab1f430a512de2d145bc1a2b0a6215799c40c4a38b7855e3f146ac1f63e7c08cb42b92c7961969575e845c8d3cde7cb5a068aca5a034e58d92d2943d36243d27fc394189137e384106143cd073c2057a4cf0a28f106cf4984082091ca49dfdd173d6070e01b8d77396c2999e120095c0441025d07056c2972ef490c0c4107a48b861053d2474a0010959086d5185134ad8918366a68d19352798310b63a68b21415948c1041e22e2b81981cd0868481861842f5e3c5186883237c490c604b33261ca6010a809324190a1210d19331f90d9605014221421420e7a44702185326344c840842c84b6f063c6c72c09382f9889607601a110b290220426e284d042082084a005842c40500284227e78c3068416500801842f206cf9e2832ba058e2033b1f04c1e683331bb8d7f3c1173d1e7c31c5f086274b105a96de6cb1b9c045850b8ecc74f1800b06015ce125c9890cf26850c4971fc0bcd920060e9654087364a64c8c980e2e187364a8832e3c40bae2832328403022841b0f663488b094868c1209654018610c0766c66c2121861725fc392baac284243e27e441c14e0a42a8d0c30a6eced080e685346758386b410435635cf8f282182e3018195a2328862c6490620626d82041431135006143d90e6dca6cb8a10c061ccacee45056829bb210de84d1c1cb0e6559d008f1b0059c2a7a70228e123ed8f92108208e7890834310463308d1c21028cc2943440774be1411664b9d30ec1c7161041647184971470f1e3b480091c49b3c33884ae8e1208db8841e0ecce8e160833d8698c8a20926f810d1e78d132e3c61068a0d3688a29014b72ba6b0e9a142083fb71baa00c3068c157ac09881d9e08a4358fcc962461f2d8cf81307500d5bc84093819e2f29e05ecf170fbe7419b94032d4858c3f826438e185115fcce861d00c368464ac0086062284a101984231d20cc508241e5a9a626989e19111590070a3258315b66420860b00615c60638a2e476080e6a5860b197821a381172f5f6a080243038a0d6c477060eb210c8d18ca3028410c061c8ca151a883db151eccd8f3c10c2240b8b909a105b32e6544e8a201191b1865646031828c26ccd09843020e25a439bb2004132ee872c21728ccf09302122ac459618633344c40732b4bc3250b0b3302b5d0470d1d17debc40a305186e64d66cf912c38c42326031c31e3644d0607b53c38c176c386b2363cc0d5ab4e010280728dcd88e7833238e0e316cd8210b0b687ab294c043960de08431f640a38aa33831f6f870c40f48420001470e0e4120c52004129a12f40c4118e208f77a861cccd133cc20290d87e405116958d0c9204d0a5c5a13b83b4763116973c63a19a4c1496b33da4963441a9923d2bedc2984270b249a486246117966a029b1c46609347accec39248689435d9a10c4278a3e47387183f3440c1aa0381385085218fa3285212a96b6f003451578ac00e20a193760e142162668f1c19f4219002ab4458c3f81a0e022892e8610b4b4831749347ca1c4c2a014089100865918630a81190d85d1e59051da989624689845962329b41835b1250f9722232e5002a20b0f18e4e085860c60d020cd972214c0188db041d2180e3420c380a1a52c0c3184048d21f4a703427e3c20e4c40784960081d011211022c28c10102210824386909b3284681881d00b66089d2181d0590984c89c11f2c004421c9c40e802148ad25220a442a0158cae386314051a2326d224c1829d16e6a829fac1851d5e6803430c6b8c58882105194898a1c88c0d52181a32a861d0161b0eb52174431738fcc9c10a3752bce9a3839e1d9040b3c3c31c384440f4c0439c1c7ca0e10718804823078520cc085114c21063e6106d40040674bec85244187504d9f963441547407187093c4549206144124444e429024209b42596c41d5ed88063d263b466dc736676c484175ebc18360148909f233e82f2d4c11dc9a9f511a4c3483a91c112826a1034439af189a412a0f8200a4160a410a4650a2442546ce1a78a2a9cb0e248892b8ac0c2872c72d02229863f68002195b0c5078192be70d185962e9008090ae4c5155f4431888b3b4544e08c7e3822f4068ca518704868c2382b6466888b0db8b8803ce467893f73704a609069455d0c6b80b22c893b02f9d172d4674b0634e81c718973c19218884d9a4024e070bf44200f027919bb8081ab79814111202f7d70569632a82da1c198e70b89078c0c207046681be4c001920c382217c2902c942d893bb65841cc98c298da99e8c5f64b6c51b6c41618e08870bfc4165a70625d5a02501aa02e6a1fd43ca875501b5313532bab85a97150dba006a6f6a5a6412d839a971a06b52eb50b6a5c6a5b6a5a6a596a43328d3c441a220b916190609084c841e417a417a420b20b920b3210b9050988fc436a41664162415e415a415641fa21a920a720a520a320a1209f209d20fb907cc8264826c83da41e72095209320f990489048987bc431e411a41da21eb904590744822c839e410a4106410a41c1208f207d207320ed9030987e481442377207520df906ec81c481cc81bc836a40d640d240d241b720652063206720d0903f902e902a9866c8164814c43a221cf902b902a9029902890279026906764092409a4197204b20c498614813423432041203f203d203b20c79062c832320cc901b9010986fc426a4066407a213120bb9017905cc82da416320b391cd3c643a3a1b1d018c608c648681c347e317a310a1abb18b918038d5b8c80c63fa31663162316e315a3156315a39f918a718a518a318a118af189d189b1cfc8676c626462dc33ea1997189518f38c498c488c78c63be311a311a39db1ce58c4486724629c330e310a310631ca1981187f187d18e38c3d8c70461e46b471875187f1cde866cc61c461bc616c33da30d630d230b219671865186318d78c308c2f8c2e8c6ac6164616c634239af1ccb8c2a8c298c288c278c268c27836963092309a194718cb8c64461146b331841184f183d183b18371cc28662c1b2f18b98c5b462d63967128a6898744436221310c110c91903848fc020419e2192d8e4892249f24ffc927ff9f0423254f1e9b9438b6e76185690a0cb6a7232509b1e6d933a74e1c21534a0154bdf37ee9a8d4cba1d4f2c947e6b8ea74b65fe0dd1aabfcbab5db9fee6e8d856dbdb5cc2acfd36295f502b5eede251a4c87f6f4dede795a5ea93b4f8ba5bbbda75a6ded698ce27abe40a1f5bab797d33d97bbb7a77b19e7f23d3b598a511c3fb5f6ea2a39bf3c5e4ef75c2f17bc39a77bae3cb54675badad3a7e526ce9d5aa3b972ebde0e7881e6b6c1bbaffe05318abbbcacbbca5ca933b770baac3346715fd767d11cdf57cc769ee376dfd2eebbd39eaed76751bb6faedcda560ed479d7ebca0175e729eff6748777ef16783bc6282e6bac7e39c7951cb5415eaf54ad2f5a7910a37c638b5661c7264eafe0f34a803306e67aaa734ee5f55914c527afa7deba571d9905e632cee9eae5509a6a69de9ef22e1910f7cbc31bad374cd77996ece6b6eee574546ed7e9956abdeabdbddc357b4e35d00291ea97738b519c12216eeb7e40f57cf1c9d361d462744cf33836ab905f5cf6cbcd6cf7c53de1d8c59b49293c7b3d6d66fbcbd8dc5af34ecdd35d6ff472ddb3f84451cbc3dd02754f6dcd4f5c8c577bda52f17e79ede97a5e5303ab2fe3d3661fe63c2df9e53f84b86bdfcd785b20de28363137efeefa4cebabc26eb78f6f79e1aa896bbfbc0a2f1361cea266b6db574afde0b8f6cecb3bae576559d627200a5cd5272905ae9a7ab666be3c7ecdba3bae4f57f9fe1ea8a57939ff55a13daf597d19a7e6fdf1387a79643f8cf352d2857bc2a45f26b5bce94daff4f6edbd9bded40130f3fa7c166c5f73ebca359af1dd012bbf40dceb3d51dccf14885a6017b71c739d8ef39b75bd621698ea9dadfcc4b65fb3e66def5975afa7d66815d36339b2fe55668d6b6eac8c52bbedfb96e6e53ad7276e9e17dbbad3e7ae9a36d7cbed3dbd6a69de7d7b4ef9d67b5f7de60b046adedd5bb5e2bab5d953b49ad99e67dabb66e7c26c6bd6dc4a2e774b7e377ab74e576ddfcafceedb79e9ee7ca7cf5ded72f2c540b595dbdab10e8b89aef633b5bd6b62558ce284bd7baf4a13d77e4d9ceb97f7cb73fdf2ba75b763b8f32cc7fce6ebcb097bf7eecc0b9579caf3e559f3ea9425595957f5eefb0bd60de42a75e7fc9eb9caf18f3b1646256b5eaeb775e7ddb1aad375bdab19d77a81965f1e3633ae3d7bcf6a669b35ca7fbc94575eefeee9f2f4de31fbe375bbeb3c63ebb3c21ede374a3d2f3fb36aa9cbbada7f3efc848beb49e7946b121defedad7b4fb8b872b9ceef8ee77af69eb90d04f29eae39b781c0b26bbdeb132eae8a51dcddd9ab5fc7c12d2f5c2e972b3bd9ed59f3ceb477b3935a3ae59d7673db5fe5b8e9dc598ecdca7bb896bef2d6277e62dbbb9bc7c5b60ef69bebfd756e79a6d57b57ef4ee7a6d3f2f469de8e5e1ecfd6bbabc2336b33dbbb73d2e9cc9bb1ed3bdd546d35b3ddbae7b4665bf957cde58457ec9e3b7b623ba6ab2fe3a76cf7af9b97a7fceeb4a74b6a9975bd63f8ac1cdf5fefb65661b6b5bc25ae4fbfeacbf8eeaaa97ffd0275e5179f7757d3dece2dde3afb70e51768b7452bb755d7f5c97562b6d72d2f9c2fd5bf5ef31dbb952a0bcc49572d79df1abd7b0ca7572e06ee525eb7e6fcf26eae775b5ecb9d9a55d871f5652c663bc7bdf2abfb697978ebcef1ef4453cdab1cd77ba6a606568e7fdd67795aef89022dd9ad195751fce3fbe6a0eee9dad37aa3d5568e73c28eb7fef5d4767d72b29b4b27f3f272aa73b65578566e834d95ec66735b5fc6b95cf9e369f49a579f65d615ee2af5e15e29ecf8b439ed55f36e9c5eb91bad18b555a7abf70796b3bf5ec578f787c54bddab70dbb17a9e38586db726bfbf8c6fafecf9ee9df2eafdf5255578a2a82dbbce756b8ecd6ba6278fff78f817ac17a8793dd5e9c9cbb8665b318ae35825dfb7675cd3fd43b84d9ed62d2f5cbd3fb05cbfbe92e3fbeb77ccfeb6ae4fc2dd562dbb8fdcf1cdbacbccf6fe3aef1c93dddac355e7e454359522e1dd284d17a8bf9ac49ce83216ee9b3a5085578cf3bb4dd39661ba6b6a5e2ec5b6fa32bea669f58942a9408e3306eedbaf59eac230155df066dcb3ed3c6fd57e5a6ebb3d4fcb2bc374e76979b9bbed8e8a8a8a4a47a5defb55cbceb3bb67cdb355779eade6c53dccbb28afb602f5eed5f3b4bc6a2b70ebdebe5eb5a768c6d7cce5b8f5757ecd8c7d786b8ce21e705262d4d67dc5b60ee67a3d5d56316e7bfdd1ebe97a7ffdabfeb8f0365062d47ed5f2a2c25e8557ac2a508376737c2ac9e56ef7953c7cee52b49ab76635c1617d55f3769b6fb7bcac79fc492d79d54df57aaaabb672f3defc25bfb8e3d3e67d3bd9b578ac9a976b94ec56e115dbbaf3d2bc97d77cc7b08fa755789e5673e115ab5963ce2fbfbcda7a7b35efe5155cc124ea7f07581714275839255d509c3cc92dc93580c3c2ca6aa066fbeb75df9c9953bd2b4e48295546fd10b33cde151b1e89c3619661d2f07f38fc71f8e4f03318fe972fff498ff4ff5efe35183ed270986538fc32fc1f0e35f8a196ffffcff2839bfeeddbb26ad06e206510a932ea470eeabdfb71fbb3292954eb8f5b2d9b124039945fa0cd9d6751a0c6a2a2e25d53f3c6800449ab72fba2641628c6d3e76e9fb6eb9e23b340320bbcb9cbedae0a489014099905660d06c4faf2fb7a712a2a319e3eafbecabc288a77e754406e83484436b6abdf7fe7ddbd35af769d79ad3d5c2bc7f5fec0ea115d6eeb9ccebc577c97bc63203e7fff2ffafe752f6f5dd36e1f0ae549e7b609ee386f49804f9bf1121ee619ef4e96253c511407bc9d0bb9fd79edebf50f666ef57b9ed6cbbc63fbf2fbe4debd84c731908a8ae72ba67bda6dffbabc6c4f7bc577795a9b15962fcbd247bfe753b777fb6ad75db5e4f5b4f64c79a7e5f93236735aefb6f53e4075deb17be62ccf7677aaff87f2b605dc5859fd8fdb9fd5edfbd63f5eb5ee3f6e7f95eaf27dc7eeae7c973f6e7f56352c6bccf78df2f5ff09fc8b5b80885249fe45192291ad8a8ebdbbf3f3f29a04493531100a0a6a9772283193ffe8dab462a746a138d4e5d91315db3a0865bb352d362f10cabc3f6e7f39a5a2ba3ebb75e7545417887b4e375954552d09a0af543a5dedb6de6e3baf6153f5c8544aa50a09175aaf7b7b392eb428e7f6e43d20c3ffebde964408dfa579e2344aaa04f243f732fe714fcb336ff661ce7fdd7a99e7c553facf876f70df3127e6cd509698f68a03a9a8b8e5fc72717e797a77aebd742f6f09b7eed6cc96ebb4fba24e4e0bdcba8b737b6229f9f1ba453936a9a878ee02edee71a1f5d25dfc4e517272a4cf0153de76a4ca7fed019fed15f35df68c351aa42c5246fd90e25dfe47a8e4dcce6fceeddb718e77510ec5bb63546afecb2080408daa4976d47e79afa7898a20800002354955357394ff5a0e35176a18d4b06a5735dcd78418b16dcda16c535dfcd615e27b4e35af26a9aaf99eb9debb67ce3cb591009d9b354912dee6e3d9ff0fdf5644ce14b02d2c9c170eab22a96426fe1380186f44fd8f538838f1ddfaf098cd50f7eebe833a358fef9b337e40982d97d660ffff645f138fe9ed651de059e3cebb6716d76857bfbe6d7b695ef35e1ed9ad7cdfaec7eadd29cf59448a887ca5228b6af259b03dff4fa56681e1a26c3df11ab2e69f4ac5da5ab28595e5f5f5034c4a16589713ac211f0c0163dece4bf71dc31d03f1468598d986e421f6ff9b6a1895dae5640b0c87b5d5c4cb0be7c57585398e728118ccbc12e0d3ee9b2f930bc46058605086e0b6f4357114b2dbef79c1bc78785f60da0596f59585d59505c581ac2f5fc6bb7f4d2d0183a2240b0cf7248b0b4a5756135cd69327595b4bb6c0bab2946c5530ac2c06ae9c346902a52b0b0ccb0993aead27605f156cebea4916932cb0aead2e5c5613274eae9cfe1febff9534c04094ffdf9aea7528be8c33b6c0bb4ddbadd6edc21d13f233149f05bb3b60dae5b360d7d45c3e0bb6af69ef937dc79c38f165bcafb99df4fb75bbe5e1134d95f4fbf5ff5935aca198d80997899d9c9687b3ce969775d7ff2b799fedb7e38c7bd7cc5bff8ff5ff57f7ccdd9bb7965c2006bbdd2af97fdc0259e38eb946ffdfeaff6bbfc0ff9b198b6dbd771690332652f8810cd4468868230b15a305a69928c88ea15187b1a9d7e9813386008311a2213434c4094a1de23d810812861e9cd7722a33e210d27c99ae2b4806844de21d0222832030448cc28298cf82ab7e124e88f18b02559f830b2023142df83cca278a97a1888bf883952d46130a391147f47e8e8731512bc60ce31335a48974ae989167487210857ecc5e44737a2b4932481bf9cd1fb1b99053c850109d90a1c75701234df4e02a8f98444eda8b79acc6ee46cae36084d2f8c011467e012b671f6665459a98969646a6a56151a6c327fa004c134780428ab412069f0b3b514f0e9ffc1da601c6049890405c410aa451862da6d8b806e0e24dd600540c01e13bc0618400828ec8e285a5315f2b3480e8c4c5e3b009096218499cf9374bba1f82b17c181c66c42e411831ca385b1315658b228202f4ff19777ecd7ab5599d9a2e6fa79ac761f35fa96c5063a0268012fb4a9554a97aef9eb526e9facf8777adbd774fddfdf1ba0526d99124c9ff233902f564835afaaf1cff3ac7f7d72b1527bb269591ae26b6f25a7df672426c4201d31c55935455dbcf6bdedd04699517f26306d4f2f8ed5d93b7b346a68a101922240810a9a80734d4bd11d0e86b5f4b22bed1996812dd44a39f21120120ca108f80d48a3ce9418d00a3f1e888a8468ae2df18cb1f5f74a0b680f84647887e4691f8a2281211091995c61745911cb544d1481c45912c92601447d16804e089281689463f8a314a722c2a6a4aaa626d1c6b65624d14c72451d028223d91581bc92b8a5646511c8fa08c3a46712caa8de215a328168da203e20d5124c7a31e884823192200a2288aa391d1c611299a1147b16814c591cc89632d0949c8b824561d89443dc824a2d138d6a4c8a471149d66101127a849292d21bdc6affda88258239b6a44a3483ed107e213e28f6fb3d9c451d4423c1a1310c591681c49510c22428947e2d2388e631196e8631c6ba31845964a011c2120c6a091630c41241a03106b2229fee835d624b1f6232efaaa1337207f470fe25bfd309262915833126388a4d9381e5191e214298e63ad8e4b484d2291281a45d5a40a8812c7a4a2a3d14814a9c471d443168948638d1c13798ca928923f4424a5513c321247ab918091807100f2c917678845e328c6a8d9c8da18c0388e629158eb89483d4425a25124126514d1316e1929218de2ee68c968141d108f44911cc59aa8250e301a1905189546a3914824c5511c452a7180516934aa892411298a4544526c1291c42551148f88048c49a4917854134751a412c522004626b1368a4435d1c8a82492230122498e636dac8946c651cc31268948e2516d1445914a1c604c3222c5da514d14c52255c491c01112520122911491c41a0e1109894a898a0e0244036ae238168d4657b4d98852d212c5511c4551fcf1468f3e0458444053b4f83ac5043f75a6ec88028b07ec132f4071a2cf83ed58e2bf4cb073bf6c11ffc40437669eecd04e1c30c10a202f2bc4aa89090470a16505883262020e282356460b459c88d1a3c88e24918813a22122ba341288d4435feac220e0870ecdf8d46705fd54a31250e0ece94f01baba5440bd41e3cf6a84bd8e48ccd7da967ff2ab78d99cd0bcedd6cc5da0feba5977113973b2fa3f2db6f5d771f0c771c60cd89a06fd0baf58e51dd7bb75efeeaaad6492ad09ddd73c71ba83eac0de92b735edf89b75e5a9c66377a3f5feee890235aff654ff3a0e56e1eef956d4026bf0e66aabeed5bc61ff5fa446658224a7a7a4a6a60a6a05494f4913d4fa5427a8b5d6eaa34fa5f291c7e683cdb9b33d05fa30fbaf54e6ad42d3de7d5aaeabadf7ce0a927df8b45702cc7baa85b6c9ff03c9e99e43d3dcff43497d8d1c5f3c20d0017bdeccb7f674576bb7951fe0c6ccd77680060790d5b3f674bd5bf7b6edbccaff531d80653b00c901489ce630f03ffee9fa1fa118cf91c818a40926c43d6a5cb01263e87d25a8c25dbd261ec366d5bd7614787bb7ffff62120c4e52442a122455aaa922a95581175a60214d05ffbfe56d3bd09eef32e578fb9ad4665c01c20e19073e4125949082480840cf183650e84883845ce24e901b664600d306278444e3c0370254044ad2c23c912aecb0230a2b520d133f7a905f864a1a88408233455c200089aa69aa4aec8e74e1c44442a1c256260c13465832b3441e29634b418a2ac44839d53a05fcb1adf00097a74264d1971638f85383d50839ba18afc861ac4993332928b16131d609a30c054aa47046099228c61ad02861e7ab0a143380b0672cf3c4190d7b4228208aeace98c50c0008b89860c7179f39636f4ea553e6882a642ac4199b7829c4c58d403c704fb819a56cd8b3c31758153ad0613302e0c50f64360a66255451231652a10c1c217a8c80392005d189269694f04684b31c142388407c90009b2a608470368307a21a3943be7c900342581230e2982e54ba8ca152c607385cc4201bb0284c10328123488158251012d9046c2a10bba08b572700511081cc9f2003a7e86309510b3307ba8115a618630c177e5a41071552fe03c5091b80d0d59501c8807d9e2d401c7190a385aba7c9bf59d3c49d0223c705342764c13b41ea4e9c307cfc7b29c1890f046e90e19125e481788c984aa1852a86bfffaf301600a133811555d09f420b81ce044118d998e19f802c0b18211be40112977fd205b22b7c50b35b4af3e3e78e0ab6343a2358154a9bc18e0d37a43c11c07dea224d04306ee620692f2f73b048b3c08d1447e6985b8e2ba248e319c28086405b5e08197bd2b658e8d14304ccc71c7127ad8ca28a2d4e020a1c299a93c624c2024ffc5067022c6ae21c2244c49a03a05c29a91adc1ce2a3c111a0413bccb021c6e6509c1b94a01d844153a6083587d20c4a932bc24bafc083140e855981cf9b12da48d126cc08873a1f42c11ea893056f3c380401085d17801183030250c01c5a200837693a213c447d7139740006bb1cd14901035f28389444030d2ea061216dd8a61bfac3c513833a68a2872d10380de141a1859e9418b925bc300de1a047cdd9a3829d0a5caa183aeb40ac043a391c10040860862ef08109253e721c41040e4d0c89719173878f113f2c704489212f19a67c61243044060e90181af2474892d98d04d44821c4908eb32e451011c20e2174f164e893e8170c7180162a207a149aa20c042bf494969913010a0d01c7e60111ae30a214612a1483162434846135d07960a910082fccd9126345f6054cab159ac08a1178040dd0e2cb10850a593357d4847161852068e8a2d092231ca8d2240585cc162c0a3d6d50a70017cab014421245a19b0e51c4fcc18921b1b4270c2fd2823114d2c1cd1e2777c2d8d3027ae80610647e10e2ffffd09c30789822471164921c597cfe7fc492ef4966812395a85ec65db64bb42262057e9451a50e4278df167de3a34a72a67cf7c46378a3b7dbd3f2f8ed588eeddf342d16107ebeeb6c56f29e2fd0bc955f4ca637b06add81d02ab98f7bee70b7281007c411efeea7f3b4b5db1eae4fb81ffa544b76ab7244a4d27d73d0a29c8a0aecc7add6795aac1f7e3f58fd507d18f4ffa669e574deb5e28319f08e691f501fb4723ed4324c1747d0ef14cd5d2199dee8efc7edefb477f38c73554f554f5454555e288ab349489eccad38505f86e98237e7fae5ba97b7742f633fff543ab4ffff8cebc1ec51fbabd9490f64a8bdbb072db387dac33f0e4e9faabbe0ac81e3b579170cce130f7eee0df6bb03dacc039adfb79fb857b9dec683976fa7e84679bbea7d25f89139be7a1b1a17685cd8d0dafc7f19e56e8d85b3cae0d5bda2895da0e6fdc826e6e1f44b0891945f9f45ab7629af12de0684574c781bb8a6e6a11d7d9edc0e687618eeb0030e1dfaa439f34aa0431b32dcbb1bcd9d2716d3c1eccb309dd8b6401d50d4de5fae5fae43925cee9a3f6e7f5560a8ee597cf39e2fe6e15e2fe5b65b253da71aab779ff07d8129cf9a6777161515188a3bfac64bbea80edefc46ca9b263783de4d9bffd29731d727af727cea1fbffbd7f9f5f9525e51dcddb889ca416d765eb98f8e6d39f4f912c51dc59d6777b5e5e085ef8ba2b89b50d9f22a8a7b0e3f14f71ca67c785739ce4129d5fbe6ebab5aa33887e2fee3568b8a0aecc7ed0fedc7edc97130c301056a7e833687835719a60bde9c4371c721874312eebc1be5c7add6beb797e3b8c72fd727af4ce9d42f37cf53df60795ab5999e29bf01c7bf530f37056f9b3cff4e4d6154daacf9bf626dbc88e9d44ad566ca2b4e57f67cb305da601b20afcdf46bf715bcb9ea3c2d5655e5b682214142a6afced3f26cc8d3a60cd3716b835919a6135eb15cbf36fccc9bd39c36536ec3963653ceabb6def73c2f3771cf97d720e5bf86a8ffafe1bf67d406390d3fd0302c85bbaa7ba5c18b8626a0bdbdfa6c66d3a7342f9b323652b8d834fdff60539b41cfff7fbd6d062fa56e861fb7c119847c69dadf0c4c32c8d1552bdc559d4d06b2d294c14b061cff5fc6d0a7ccdcfe9cd86230fbd2c6f003665c0c5631d89e87e5e82e6feb253afbc3adf1629ad6b6c6aa34efe665ac33b7cc5b6d6bb8b0874d0dacbae360f0f3258a7bc5c18086da200c655dfbea79e26090f2ff250c535f9af7446d90c380e3e74bf50ef7829fe0ed7ac1ac6e5d75ba6a83b7eb05b2ffff17acfe7f6b1df076ac73c18f4e0999e5d26d17d05cf0527d59ef2077418a0b53a80dba60fb17eaaca64fe9cb6ada7c99af98ed4ab6aa9a32355effafa6b600e8bf8535ffdd6eb5306cc1abe41d73fb6b01c77f699ad9b200e8dfc6c29ae197e76979fba2fd7216bcbe64a12963e079e2d20c4a2327cd99bd27bfa7def502751ab234b50a77f70796c6f65f3add73677f649d9b2ac768f294be8cd1ac41a3fbd3a6576ebd3b3438ead85f306333d5b6335eccaafbfd819d89fa2fefd64061b69ad727f39af677e6ff7f649debedf7bc26d60a72fecb6c956c55e0ed2b90fd9728fe71fb332fd0e67a7f602b68fdffed3eb2e5d5159a4ecbeb06debea5429eff075615d688f1f459b90fe0ed5b2a947d9931974d05afde69abee4a810bfbe3c0dbb190cc02ab794d3c76795809f0760cbc1d036fdfda3d13efaa388ac1c82c178ac180b76ff5aa9e311712b2aa2a25f5a967cc65bb35f7e63d275f777b09af58d5171515d8dd69efd677cf6b026fc77c5f61bacb99375855d5733de51c3f8085835555682aa675938c81a6adaa4f55555bf5898a0accdca2a202abdaaa4fb633b4b3b2335d4ecfa61e88edc93bb309d39d1f8ee29e135ab404b412cc4a404bb02ac374b7041c0fb4b793d02747429bcbcb74bc8d84df3f095665988e84bad39d9941779bc1f1363368ca309d50efceaf6906cd9da73533f5dc66e6a80cd38dd0e77f8436ffb611bc7c19a6bbbcad7b2348f91f21aacca0ffdff69ebc3272ca949561badc7979d996f9e5fae565acca305dee6eb48ced2feefba27aa364007dc6403272de0679ce4606cd97613ab2cff5cbc96ce570cebc1bf36b56fd3a7e0078fb564e7866ade4667c9af69a55f50909ef46a9c25d9ead4ff5a967cc0524482a3cc92c10783bde77ec0b78fb16bfbc0ac94585603d63ae8b0a7bd5e5e1ed5565e6cb3907de8e71fcb46355e69692aa8e81b8497d32af99537d65bb35cdadacabcc2de0ed5bc0db71cebc39a8ab7ac6409c92cbc31b9bb6104e5c08361c087dbe40c0e0ff4f6b376eeb8ee2cde3574927bb5d555548b29090e92baf7d73d089f036404505f6ff3ddef6819f0fdae4b23dd10f2aa8da4ff635f735f3edf5f4f559af1cd4555548b24e9be6ad9eefb6a892ceaf0f9b4ea8a87edc6add6e3baf42c2bb51f8bea6bd5aba97b73ad768581490302041c8ae993bb0f3ff1d60d0b17937cfd641d37f29dcd9c65051058664eb25ba03f5eed9c6a060f6ded6a9f5ce36c6ea53ce71bdbddeb58df9ffb2e3dd35ebdd37c87b3acfff8b89f35fee9b83545462cafe5fcc6fdf1eb7419c4d4c9469811df330ce5636a8ac4ec2b3737bcfda6d53c69599fd7ff974d6bb35b03e655b7b967777d5bc28aab75926e54ba7a66adaca8e4edc735acdbbebdd092d304c9fffd2acc2f34c7b29afdc0671ff3ff5b630675a7877952b795b18af9e2d0ff7b20ff35fdf3ab883f5fec0c234756bd62b34b3beb271e0e74bf3025320ce1858efaf83d9385863efb6601c78296d1ce8bebc1c57301b07b572fce3d9bb6bbe7757cfde833f30db0679febfe41cdb3638cb1ae39d6d03f4ffcb9eea2ab4e8797ff56e5b6fedba6b83a9ffbf59df1f986d03a6ff2f53307d6c60cafe4b13efaa2fe36ced89de1dd467d5baef6a3dcfb4721f26dedd1f18182b5feaae2a30243d274082a4661598a32b01eef36ffbd2e6b45fcadec4bbdcddbfdbed18de682e687ffd8bd5ffbfb087730a046adeff0ff0b62f01fc9761ba8e79b877cd9c99d35e95537d6a126e8c925df306edaf9b1aef8be63ab7e779e29e717a655f2ff306752e6bbd51b26be6ad27e6a97fb9ac73bca3f8f2eed6bfa0284544c400272922a9acaaffc70d911a7176878d3f0069879894c58bb765c1e26d59921020060d73ec6998103c0d9381a76126791a2690ff5f8a2183090f0978c43c131e2ecf8467ec99f09c358c988cf8f14c475431d9419fe98822cf74c4d3fffbb85123490f5f23090b5f2349075f23c905ff7f2b3ac243e599f0783d131e069e098fd533e1997a263b411ab61935accc7c0dab2f5fc34af835acf0d7b0a2f235ac9a7c0d2b24444c4a7a3c9392029e49498ea2a21a3d9cf0357a00e16bf450f6357af0f2357ad0f2357ab0e06bf420c1ff232dd1502281a7a1c48ea7a104d3d350e2e869e429f434f26cf134f2f8f97f25a41a709ebe069c02be061c00be069ca5ff472295984e60f24c27543dd309479ee90421cf7482d3339da08306139dfe4c7476cf44e7c933d1c17a263a446c59d4bc2d8b096fcb52f6ff4c4b454c76aa3c939dae67b273f54c76843c939df299ec20f03366301d81e2998edc79a6233b3cd39135cf746485673a72c2dbb268f0b62c5cde96c582ff5faa41c5e76b50f5f035a8d6fc3f138d251be5d3db782af436ca1c6fa34c7a1b3f0ebd8da6194c544a3c13d59b67a262e16dff4b326c3cf1781b4f34dec613f93614f8e26d38f1791b4e81de860250fccb3812c1d738e2f5358e34f91a47947c8d230b084003cd99a781e6cbd34043a614a3069c375f038e0c5f03ce99af018784af0147ccd78003460028453ba6f801208708655f3658e16524e90c489d3effff474f4ca0ffdff31d33b18eb2ef795a2c27e769b1c678447171b271c9c18506975a20db163f4fe8b943440e3368b9d1429ab6c52c4c05635b803ddb58536e0bd796ac2d5529145ba678b7be318efbed3cf34a70ef5e9235b7f789796a2d2d7dbeeab6defbe67a8aea6c5a2ef89b35c7bde2b43e2dd1a2c4a6458779da6e7b35ebfc542f507f6933e539bd3cb528aa75eef98edd5cc7c07b6a33cd756e7bb93b8679bebd6be6f6f5f9f0eee7897bfcf614056a5eae5f7e6fb7269a7e093b3e71877277f60a05dace2f1083e1b678bf9c93816d2057cfde261bc825e4d9cdd3c0abe4c4bc9c6aac0bd45828fe71ae1fef820977caed7dd22fe7da4cbf9c00b7f8e5e5dbeb39d142f1b984f39b81daccf689b00bfbc53cfd15657f65dd7b7a32b93e0bc4777bf930c7fd4cb9388ac14eadbd84fbf6ae9b70dcc56f7a056728bcf7baf692deeb126e7bda2f14ff78509fe75d72b7c6ea1c37d9b7eb285963ae8b3718bf57e6897f58d6cc77dfde7d22b62df03ef18175ad9ff832ee3a0ae6f8bc1dff1ec81a77cd7579d9e2f3e4e7a9bdee189679c5b27d92a1746e978c69afcb53eb4506764dcd757bf66b5f31bdafb2b818b76077098ac5becafec5301cfc8b1bfc8b6034f8173310b778f9173110bb5cf02f7211b7a4a5a5a5a5a5a5a5016a62460e3406d07fc204010051c113f5788e9c15d9c0ced4cb39db53c1106fa4bc9b3848287959f2f3318cb0040b0c7cfecf0830e6461822db9b39f2c6ac0a2cff1d0032efcc1084d67f918ae106739fbd962fbeb0b05d4cfd0446c89e28a3baf31c501c548204d83c1080ad21880898f33d14b80432dad5d78d01b3004b13300fc11e2ee860c01bf4502a10944105627d2fb42ac8a34e9c6f00864f21893ce7990ca9e1ce55076a1eeb2bd48e1e4fbf401212243912b8fa235e4c6c71c404fa22746878b3400c805e881620597cc15be2a57c65d072809ebe9ca010102b74e1f20ab80953351c63be130235f0340fa647c0864285b8d88285ef916b90545468e2792c1902184505565fad72ec48a00a0e4f80945ba13e6fdabc0060a0307a20b23ec79e3c32b8a0078b0f608914dc8faa26fe06107c8ef492d81e00dd380645e8f336625819ab01c2f335e820f102173c424f03851b44e8a8e4f0b70c6c79603077781b161ad698b1b2c4cfe89224e3811d6c2fa34cf5208532023e860e0168315507f84b5a1840c83c7467b89480f0bbbc1860a8b4232804061e3f9fe403027e50074e1826f1786202bb1a3e9297233890b285e68f067d0173451a3c7f840a1185094d8c86465bd82e00228120684664508833f49802cdc8a8ce0daf11005915993997649981a215197982fde82d56447a0c8812a706054fa4e5022da810466844503d5c6080869f61ad4f0c63c4806133ac81e084191a57d6a0d51cc867462c90fa9a0d800fc29218c08a34a24c9530b644e9439ac1d98282105e86e40e4a92d893b44a421500c404a73d753c04a88999f79d8d76c864902a81e56c5c215011e9017cd0460bea8811800a297e9c12630511aa30a41b877471aa4097ea46261c4fca08d3acc42e5298a2c509351493589292eb5256620e4214987213b446344184c068cc88a1e80582423f6ed012255e713a21f844034391ca0356419af8b0894b8a0040ca53af4c0c524109759ef8d1893bbc2cf0b323ab23da888829b1a78733f10be811f61b327c4061541912436ef84fb87921852142a08f074a190e3d32987a393728217b02407d377ae6c8204a31f531c4e0c419d181e19f899a8281244678bd99ae261248c1ca790f465e17322c69fa2f57675bd69059f35b8cae24104083b39f406b6c4a159ba6e787f8d88034d83cd0000e0a45f1c108df5b237e8d1933f53a126a68a1c120db43e047245b02a8cd43f142e54f7d53e7bd24309a00cf973bdf409b2120f46842c833a9d2ed3f15ac79aca32536541083975fe0460510890664fc91072c20c235c5145f040f16196000238a17e205041f649246782920095e779ea8f36596142e1a222bbc023c38c1c01310b4bc9302365c01060a003c026e648803029a96efb1b370c95f58781e0c78d184a11a515f9514090508ca7902a8c0f1624b12035e80b22a3d6ea052fb1c7d06c001c103810f604bac0a18e6f93784e8a14e9101623c003b1ceae814d0f136668051430215be7c0d3b0b7cb91a14e469a85005c8214ce36f5f80fcb95a5cf1b62c3660310b32fd0c0cb2b0804615315ec60854a0395c59e263ece003153abc78f24b7f6a504190510abfa400177c7297ec95780f633a2011f9a41fc69c10b185f94906f8d028908a79a40c0a49f0c29e20fe88d009582835d0e68faed84133008bb4370a6494440716b47923e1106caca0fae28d8e5a40fad123f24524503149808d0a5f44c594646a088d27d2a3049bb42f5a9e688b140e42b5199e08ea8702acf89caf39b125dc4ee8f0b510d00cb4f84c7dcd014101a82084125fb37da0230f19db9347d0f8d18121cd932200b9c090929427773a00814821ed49282d5480e030e1c7342eb33354a8f9d14e20075ce042e8c73359beae1e757ec442001301a220f3e39428714ef072e1c7214208ba8d807f649a12c300a5265eecc2092b2e70007931892c1580e8c1f7620e566c94104190174d10c204a4818417bd685083164594bc78258a065c08b0f422952c5974d4207b71891749e4a912be180405233619f85edcc1d7a09d30f6a2ed810c7448f1c48b5fd5844b0a41feb7c0a1c6091e0bfc3f91074b861268fce3d15c4c0da6fccbb10383152a18f87713e807034610f41f0310587469e4ff4c16122f46f2dfcc4eb41d91fd7bc074b37ad4f8fff22526cc09f9bfe506902f0cadf03fc103e9093ba4f9ef4b61f8c824f90746e1996394e6bfe7068b112e48f8d7a5b93307b5f20f011736098848658d7b7aea2faed1aef18e8d135da947cc5bab2512e4c4dbc6ac440b3ef81d2123c48b1698993a327ce1275aa0a70d550b4854118b531e23769cd0885830309b2244c34fc45248ce9400467811871b7815a9e2d146cc920407111d9c3ca2961b798660c9d346dcb2834cc899214022176c16042dca947841188080f0d1a18a18f8a95269281c891ae0d648d5aa256ee0a34fd40240acc4b21a8ea02278004dfc60865769410c392299def08719601ff12c90d6939b2ca6443485fa28b047461d51863c5e0984f15526eab0c5a0047200a588440881e664243814f91cf2d324e5cc8fe80514343e8232f4196f6fb41000214e9e3108046807d0b0449bb1ca07688f3b837e639804d018d0850cad9108233a036a542b3280296878000132458eed50678703487464155f792abac44b2d8d62aa80305e6b887880a111f00204798804392156406695bb199f59e780b877ef2e93612036539b3510df9ddd65bb7d776777be8cc5f2be639ac9bebdacbb8419279631cff7c7eb58eca242302199de5e6397d299d83a16127f98247143d08730fe5ffc7245014e9b08490bff2f6ec040597df49084feff514a1146acc1c1078f98ff27d72c6900a603062bb6fe5ff40ac44587a503c864f0ffe414f4490b7898d2b8f87f118ba0162a15980c35f8ff1a9a13d278d5c8414e91ff1fcf2c10040f13c46a081a71e2a144c31797ff17171843c549590666dcfcbf0887c47204037724f8fdff8881014c254071801043fcbf889e99a00614a4fcc1f1ffe20c2fec3e869b156efc3f29288b086450e3830859fcffd8246b0129bef8f8f2c5ff8b452c19e608624d093afc3f69234c1d2d42307363c4ff1791f960907887ea90d5ff8f5108124341a110a028f2ffb5323a23117e4358e1f3ffd7d4f9c73575c6288e736e7fd5eacc2ddd982465c6ff0f40c4fd23648480baa6ce5019ef308ae32afbe5e9cd6418580acfdb81b8eaea53d7b91ed13935e974bd63e0bea8797fa5ee1bd51b456dcdb6b7557f54aa275fc6bf2eccb66ab3769db9e6aaa579cdcaf153d6784cefec03b5347959f7e0ed55abcbdd9dd0024dacc7ec4d77d7d527f3725c6ded6dd56aebbe9d639f7083e5c6ee46cbcbeb357526c340ceed0fe5e22a75ba6c79dde66a3533ee55dd6b988e5305b70eb2c60c2a3b3e71b5dd2a19831b23665079a262d0c4f47f6b6e3152654f94c911eecc6c8536782b33fbb2e2caa4bc509f68598d304184a9a0e86f618261bcbe34efb6f54c4f6c31b0665cd17bc50c08d3e33940820334bc72ebce4b399052561eee9c8326a0e5c292b2411eee036f60f612e02f5dcd7803ab6025d33b335bbec1d197b69a17cc9affaf5b5eb82d30e803b599ed4ef90d4cd4edcba02ff68b4e67ae2f516f77af1a34a101061a0cc9000b6eef2f586fd5fda23ce37d2fdfaa624eb0bc9e6c2d3c79c9fbbe63bc6bda7dcb60840c18f0c28597355fea5ecd6d7d779ffaa7e33f7455f78cc57876273cb3eed9ee9eefdd3fb2ce3e9f3d7b627acc0bd61f0c7cc0e00a0604f449c2cf1f3ae1aed61eaef7d43c6b1eaef31b4cb5d09771b9432ce3dad336db2d2f9ce63eba98fd97b72e5bef809ad7e5885b5fe51da7f647762f6873c1efbfe4616e773578018e2ff98d8b1cde31172fffe5dde95ec6ba8b8b16eeb6c54fd6c25dc63d5f734c9b1a6b4b9c2d57b6d492ebb3f27e5aac5a668d79c65ae4648db50879f99a5a6ac99d6449cbb2a6d465e965a9ffa54e8c673bbf27fe05c18677807ccb0bb7bb0dcd0cbdfe4b1f3ef24e6f2f2c5c7cdfe29d67cfd3725d1518927e5a5e75512118155515b75af501f37482450a96a9324c7781586cff16f469f36f8119ef668194ff374f9db3a0e9bf0cb3a07777bea792aa0bd45cbd4a6beb8dc772565555affaf2e57ce9ee9a668e5bdf8f5bad6b6a2cde25cb32712e7833053ebbab376bae09ecf47485c271930978b687db178fd9fbe3d8dcb7ff7cf89cc0ab0cd34d10e5b3bbbb27e8e95ccf7af77219e77a7ab7e67d515181ed8ba269ce67776377a3a6bdbf13dbeef4559fa23469fdb8fde5244025980aea2c010e611f219cff07daaef34c7bc26119a613eab699710363fa3cf5366fb7d734718e2c07b2df975bf72db2a99dee76aa6b4fdf82803e68666be6fb40d0ec3cf53ec2edef2bf80bde1cb4b2c15b10c797e6bd8d01fa726ccd677c1b23fbbf8d758d45ed9e0e4ae57c999699d972fb4ba54099b7172abbcd58ac2bd1bd943d5ff4fe7a509fb5ebca3ef565ffdf611f3e2fe672be6efd548584eca25ceb5f8c777f3c5ecb30dd1ef4ff26d663bbcee7f6d926db5e65982eb7a1deccb8013363b12a73cbe66e8eebf3caf04a14eaa76c8232f037d44b03d268ff601afdef427b766c833a2afb79f372bd86cc02739efafc9f2daf5a609dae33d0cbff0502b51e78f43d7df64efbbbbb9af569a6f7ae727cf2fed1b4f6cbf74d79fceecef57936890daa73b9161b4af9324c2716257664c5899de3760937f3c5bb77b3626605b5a295b19f7f5dbb6da00994ab5c9612dc13265e50725a5f38ad9c141c97aee6adb9f0d9eb7d2500c35a55676cfb49f003bbfdbc645ec6fcf69bb29d6ffb33fad2b76dd58f5b2d7ebb70e79393539f594e7dbff759ddecb391bb554e60578c97efc9f365eccbb8a7fbb257ff0235bf802e5af0e63bbc5a6f0271e69a2fb94c9dd08cfad2e96e0d6caac26ccfd362f1fcfcebcc43fb72eb0a845756f2acbe14daa0b03e55ddb50354776675a7fbbfed14386bf0f6fac55b776bbd48e5725667ed12ee670acc717b8118ac8acc72656c813a32ab239203842db05bf4ee1cdabf70971b7eceeb4b316e73b627f346d02fafb808c8fee222d0fa8fa009778bc0769784c9f917665b4bae30345f72be4b799897fb03fb8569bdee0a6baad267eb9e456bb63be5f174153965ae72564577aba2550547507f511944258f508c87fb179535bb9453e9e0ffcb7b7b39b2aaaaa65dca7729e749545455955bdfdd6710907d19a683c02bdf0d41d3ffefd229837e4a9d9f82668a17dd94a9b7bb73d34eb1fd779c5e91e22727052dd72f97725686e94c2be54aae771ceca7f5ddf3c416787737589f9c6cb74aea93ed5649552f87fa508d771577aa62a03eed26ddcb5bba97b1795ebcc4dce20f0cff01abffbffb1e79c056398e8216e5ecbfc4517eff258e32f555b8ab516c5000056f17142868fe6fef06858cec9a158a5729bc8101fa7f3039ff25f7b12f189a0723fb2f4d30295f3e013bc2e6897fbc8a6f5f387c95506edd6daa85f549836161c7658d4d9cfbfa6aca75b2fbf5e6b641fba4cea3793294f2e4c951bfb75725ec39d557a999eb36b775b73be539a0553a99b77b0dca537a99fd974efcde5e35aff522f3b2fa2fefeeddbc6c5f3a91a37b53359da0f17273f22bcd9b93225d7ef4597bfa945583fabcbbaeb22eab7dbb3db9fc3ce92c18179b7f2e312e1ca8b0a7be6d6b933aa5d3d678ccfeee8e6360e92b6f131aad7715ee2aae49b089d79716d8c43cb5d6a97f0d00faf9f0af6add1b9063e6cb1b18e6db805603470ce4394f2c06c5009aff52c71920fb1f77a3570c50d9bbefdd0c6ce529c3745b687e8becbbbd662eb7e5e40917e3e926dc67cf25dc67cfdebdbb273c4fab3534b57465bf3cdd372d1ca51314e7f6c6a4ce7fc9ed8dc999ee38263ade71aa9934e16e4bea9826dfaaa579979c2d91f28fabd9d6a0ce60b556dc92ffcf5af3ff5952b6ce12da13e5d8bc29c94289d997e6ddd5ad753f6fd02af12a755c49d497c2f3bc61e5c135636da55f61c51a9a58521eabe909d6559dff3b667db82b34a7e5b7ab1f5f7215f540536b1ff781e3c25de1c84a1dc769718b4f1c8eff1278af79b3f26325a7b42a736acad6caebcf0de501f3367902a5de8ef9ee5a25e15eab0f9bc2f3b4f74c77aeeab45ca355555b482cbff83cad89b19454016fdf82828477a32c10f565986e81a35b559db35e6e67abc8fe3bceb84a8ba7fa4cd174f3784e73a669abea99ee5cbf3cc9a0d3e6f29461bacb93acf9ff241b775f1229b98cb5952453b72435feed8e63f3dc5090a84122a529a7b5f7ae0f49d39754aad48cbb1de1e148c6be7d8115ab96376b1ed77132cb75448b6a10151a5b75af54625ff28afba2a2aae2e16efb57e5b65251812191d2bdbc150588113423666fe4971b33a2c5efd8cd88cd3796bb4d4991bbbe7d81be8ca756d85591e9ab1cb73a3b3575cd1cb753b6ff227efe7f1d078ba07deec7ebb6c85911b2ff225a45703cef4644ce3f9a1b91e13f119d0d128922b2f5903e43bcf07b1ba21b3225840a216765980e7d2138dfbdbb67de9eea9c896def4a80edbebe8c795b2fb9a6060631fb28417ebe7ab7f51164070152e7bfe498e36e4086af812491f2f316c8713df2e348bffb4a4971f9f2442bc7d5eeabbb6a291581d451b5fb3e5d7cd1a7a812a29a44e1f85278774fc27367bbeeaa168f855579a252a59650729c9aea863afbff1218bc198aecff6f5051a06c1d9bdbf23836edbef6564e51967da9d3dd4aabb272db79e5f65792b71f6bea8fb212ec87ee47fde7f6f704482ca73f5ecd16eba9ceedc94b59cd7a796a9f9aa4287a4d05b25080849b025aff2594addcc7cdbaeaf0fd75a7ae8cb9743a33ebab7b79936f6b2c059a6cd0eeabc051d9bffedfc9df1258f325c7c1ad2b2e01b2af5b0938f9e1fba2c25d159e67dac33f9e66bd4b9dd0fe4bee54f6e3f6fcba39716c9fdc9afcfc9737a87f17a87913da7f579359995633dba60ebc40ddf4c3479effb26779e515bd57ecfe4c7bf381562af151e6b328afbaebe6c3abd465cca5e3aa25968f032c5af5e3757b95355692b7381699e5a2a202ab02124409cf16e5395fc6c0349b59ef320656559959ef32066edd79b6c77b777b45e1bdbbd12a2041d29e2f6f5f2f24a8931c99051ea0f507d4b307a01e6d7af4f0babb47f5652c06e8dfcc7a97d35cd06ef3d771f066005acebc7bdfde35733703ccfedf00f4cb309d015a390370e4331dcb371e7e3206de78acf9ffcb2d8fb2ac773f1e56fffbe674e67194dbf73c356f879fc7623bd06e3bca72fdf21dba2fc374c2dd8ea91d369bf5ae02fac73fdeada2d9e0697376df0ac2e7508b5aae7b37d815ee196baf2776df1fb79d57fd3a7a950873429ef5ddb38a4311cbe90f0b8a2f631345535e554566b9ea93dd5919e7aa78378a89737cdfaec76ed76362d93e11cb7657993702d6e85fb0f67415ee081812603500a037f10073fecddc06d0cad8c78fd707a803fcbf0072fe376eba09704600afffaf02e0f8ff92e39b0e3fff655815b16c37952a6155a854a9b89b8e35ffafc77480f99b8e056e39fcfc97e6c6bf2ecc9a77f9c6f7d7cd6cab92adca7de05d35f12e071a34d53bac0aa75225c7f0bfe372e852bd99dc721c559b6eb481bf05b02680b22f034003982a79df5db3f67a192ff9ff227fc331e84b1c794af3eb86c3cb98e6dd704489dd701cdd40c3b11dbbe7bddd18be1ebbddd09537ea693baf1aea06c0a02f85e70d00343700c8feefef064054ce765737978d3e637adf6ca0fdbaeeb251f65ff22c5a33464d13efaa0dadffb751ffedfddd6c58a636159875ed3a3399fd97e8bf65d22a99eabe1c0abf67bac92c30b72f8afb1dc3bead7b35e4e4f45603cd580db21a5a5fa38af1b018a0ff7ccfd3fe783934cdf69e3c395f86e96e34d0fcd318feffa939c7260daf5f50777e77349a681cfdede627a7b75b9b2fc374284f79eefaccd4caadcca277e7ee18b6c15fd763b97dcddb6dea85bcdcbed972371b1429caaf18de1d9bd9f2ae98b5409e23b340de8dc2bdb899710326be32331613cbf17047af1837f1cecca97e223c4f0b263c4fdb6d4d5f2ad932bb6e33f2fc97ba03b1e6c2dbc08cb3bbadeebacd189655ae5835eb93194d33fecfd362c94073f9305fae7fbc60c5c990f2bfa3e26444ed9071f4ffb71868284ef5941865cfeff6e98d567c8b21e56f319a621cfddf96f694f59ebe8cc17837ca6da9ecb4b7a59fbd68e7b7252b311eee39e1528d33d7ed45ef5652b2a5bb92972f9d72da54d1b42ae9febfc4dd942a9479efeedd92fcdc92d092cafeff9604e5cbd3f2cc4c76cd9c54910afdbdbb77438a73431a964ec094df7d4342fa2f3bb767d69a57cdb16e473fdc8e2ef8d2a9a9fbc8153d7155554733ceb3eb6c735d555d483ac74d2ebe198101dbe2da6a9253f204a795cbc27a02c5c957d6131bbc192d6024c0736c51e1ee02f597aeea5e75badaef57690a2102c5bc647849f0e65bd1adc8ace7c4dca2a2aa125aafca2d5068bda8a8c090dc8abc1e772baa7a0b2dc74537a23a3722b32f6f44dcc78d68eaff561bd4d3f6c7bbc094f35bad4e69de5bed6cd7d09ad798c6bad56ccfcbf5dec83af6469addc8df973732aacca98ffba858a42d63405f86e96e639d4781e9ee36a2c9dd462fbcd4ccf836eafe361631b74c6cd19c7973daafcf4c773cc713f2aaccadfa840488ed89754f9e10cb121902448b8a0ae5e2f0bfccb8a7bf6ea2d535abae80bf8938bee26e3f4877fee4ff6ffcedd17ca9a3a2ba5f5c5bc24ed6408e4cccdcdaf77a9938b7ef457159fce6d2f2fc97419dd3ccd2d2b40e0ddaf6f2436d0ea1bb435a86068199a73684f6a52143ba2f0d15c282eb423114d2e97cdeaf5a0acffa749e97db60bd857684f14318644ee5a9ed596f76528661f5651834bebcc08e9dea53130fde0cc69ab26f6c429d270e8281c1c360545c090d7a42673c42bfff7f425183fafc97c2337873e578909aff41130c4ae08b3ce505f2acb16f6bbcd11abcf98bb3f2fc42caffff17b5ffd2c9977193576d62f3220a2fcc4a2f745e4c3d09deec458c9c796a414bbc203582221084e3bf74129e287af1b9ad3d4f1ceca24f176dba2083eaea22807ff30a4f0930cf9d5a73a1e6bf4c33ee59f336d9cd5c48792e627c29663b060b5427d0065feaeed63c5dc63e9d2e9057a002bedc02d097e616685ba4d5abde5fdf620856955354149122437a4e78dfd6ab3ee1eed6583d5f20a03aff2520b3ff7fa006843e20ad125b1450fd2f779dff2fff0c4fcded1faf3f362dea6861f65a5c314fad058e5297ef2fa8dbd797f5598359002ad1b2b0e0b45d67a1f559e0f82f7f3c8c451d2cd060a1fbc7a2e987bbe2079418b73d6bdc15e8ff5f31f5bf35ef0a1bce0a39a7d65ea61565e5b667cab342ebbfecf9660c04e2cab199adde56d882b78a365fc5f0ee2ab44a5c15f5717eb0f8d4e7a78c1fad3b7673fd753f47d6296361138e0ab41f59672a86af53938afadff1b667eabbbbeecbb9bd95fb3246517bee3ba6ab0ef63b96356f0a3fff53c829cd7cabee5394899de955ede9dac0dba6987ad33eb14901c897b11467256a93c2cbccb7deada5688a62d09751a0e9ae28ce44e1657927bb193745d1f4ff358aff87e2acf3a0208322eaff77bcfa04a027e4fcffd727ce9ed04fe0e0f8d779faebd5a95f6153ed3adfd37e3951e7df8921aef7b4dc3aa1d5afb08f9f2f2ff7d1c7ecd4daabf254df6cabd9e7f7bffb4ce9dce7dfc7078ddbf8e878363e584d00fa92877dfab4959bb90934656e027de1c61cccd6848eff9cee2660ed7a0c0bbb69f529b675d0dc9a779f985b62dc828971dbefd6bc7c7f4173eb8989735d8f619409ab6702c7e7740f20bb47ceff9e3d43297f5a9edbd374d32b7bf4f429c3747adaa4b9321daab7a9672ad72fd77324ece1aef3127e9690f35aa34b9c9561badce5f6c7db29ba44055f86e9fab6684ff505e29e13daf33eb93cdc75ce5d5eb663a6adcaa1c074973b6df0e6bbaf999ee78977fb7ae5c4ce7467ea7c735963dfdd7d9f969ba7e6397eda6be2549fe7e5199bf69e5bf3729d6fdc33b145cd7c3bbe12e396eb6e8dc57798874fa145b1b2c6396edee0cd79a6ca3cb64fc2cfff97499c7da9db5a57817a5b5b1252fe93684242b8aba7c521e1c5e9b4a6896b4242ca97483421b1c39307cde321d3553c4dfe1f4f8f3b794af30a7755a7abbaf7bb71cfb7f28e77c6dd4173e787ef58e95f5077e7e8083fa579041a501f718496115a1861e6cbb8eb2ab73f0cbc298752ad111c1b11f5ff570c9f770c9f76aad076def1d84eb99d333b28971d3b75df5e67d0d7a9f3ff5fa7ecff4bccd39cdb9aebe87ed4d915d1a7de5dbf9c1791411144e8f4e1641618bcbd9bf58fde79f98facf3be26ceb5cce7ce66287466f89ab518cfeeced36209b7cd779777bacb8179995b54546026a6635586e9e8d42fc374440c7a22f21081e6892023c28b88a6bbe70cfadc1c39ff73e60cbf0cd3cdf19ad334e7e883f6d787c833049aff21c8c6f06973e8bd624378fde78688faf152dd87502ac37439bb3b5996dd9dec56d527243cb22c9e3130c7f154ca4f0bc4bc6be62b81debd1cc7a7de0185fc026dd6ba199f792bdfd3dca2a25a72778ae6eed641a0297b57cc02332e082f6f0bc2ebcb27e1690621444e9a1c395fdad4877740cbb119bc79a7a81c1daa36a834efeb26b220051942ccc0c80000000000a3120020302c1a10c98452b932cdd60414000666aa5c9a509f0893244b6114448256190233000000000000001000cfac9db35cf110d768d4a827dd93fb8019f68198fcd9a9304fecb53cd5288bf79d70be24febac10a2a7525e7fa1e19c7f7b3a2b29827e0041309795b7a3599b9c2616049fce02bf6333962c6f907e4e5b8bc567c57d30ac943eaf83e4fc8079108e1ba612fdf642639ed3eacf49c122b03584857abc04fb613f28b6bfe9daa0b0202c142f91d003b545252ae4ed94fbe9f1269767a1ea9da2a83527783b5587aedd3ccc34fe456c37691901f6b32d904a926de6760c35c3c03a29663fe8f5190e89928ceaed7f35ab953210ad871874fb03a47fa2e951a49f4be7d67f505c03742eedac0e4db1fa76944a83bd1549640b26cd620f65fdb33cc862d214b6e9e2cd48e8b42ec7f06113e41d7c2fad7ef1267155aca815dc23b374b09f3cf25af62cfec597665fc71be4ac7430cc129c2899ffc2c35fc29f835dc7a6b6c7134dd0c28653db05d6ee2646d84744e46bcc6de34d6c4081eed1ce2284788d56758975954cc216ded58266fbb6f92bf14f0d39a0382ab61e480f5ce6035a4897466b2df9e883432e358f402dcbcff50036d14c770cd91abae82675f1b3a2a6c266d3e20c4d587074e704f48b864e28f2003ff7f65d9d1b3e2c6f20b113356633060fb088d726a6579f27e1c51c3fb1f04d60d6985ebcfe54e4ed1b2113092c629bcc687d0d36f7bb71198c2fabb354a935f6a37863fb895099edcf01462ba93e038984aaeefc69b69150a8266b9d01ecbeca4fdbf4153118f7ddf01477010fa251ebec6d6ea3b0ab5c8e60a1dcc945d78e1f1c5c2ac66736215d74e7690f77d51d30a20d4040e5ad0d4b7f8aa60b4c93f9e98fd6967ff1d3769f558e1c971caee9d163d8b305a174218ad9d205bffd4a98c0c8eb76d6d91e1fd12dab055aa82c6a62c87c40ca4448cfbb61d271651b4b9cf30880b64357c5998194c790d3ff97ba7780b1a65105b197888f58327d45fed7f4d29fbccf48f7669cff5348691100239d71b8578d0cbf6bc39982043bd0d6b7241d0fbf1ce3d67011ba04af231215f86c404adea166d45b68ffbc00deb2ac6aea9f4bd087561c3dff050ae0e86dc2e9ee88fc1b3c984b5601ee35dfa81734c2bef8cd66bf1eae7e672bc1fe0b427888a17843a39979df7871776d829c64cba8ec9680c06ba0829a8988b82484c7144dd270084d2a083cf4282de9988a6a7cb01e281fdc223a9e8ef013d86b32d4568d357d050f534b4c074c8ba9ffe8a4d334f1b90a66729d133100e02b012f4c1adb9839908baf8b07876d1378debecfbc8b896d41e51a2c0b1093e02a1cf805dcc8bd02a3e242d63b02d2b38227ddc172b0ae94d9ec2e05ff89ae6db3c9163e60e7baad85ea25a9eba6a9e9feba6de0cad24b65d7a7a95dedb3033c1a37322f25918564cc4a273d6de47160152814824f0e1e1d414e2da69d99e5ec34d40da7cc46df5466982acbfd1e098f311437ef81b5b113b99f7fa58d3b98276eda6c90ef5510379ffd73d18611cabe01e28dfa7d08f2173f3a9cf098c2cc5a838d4dedff4ccf3d47601793cfcccb38aaa49d89543800b447df549a343c14d89f4fd43d7d3302f4bd8a49f3d7bdfb8d85a801f964814038fcb6d035ee0ff416a6e81c6aca0fad5b7dd6b2465f1701ed892cfcdd031bbd7ca4891fc138b61aa61f3600aa728c83aa04e0c835595e5f2ec2040f054f14e121373556023a75a860d4c1959834b89e8f55fc2f508ec48161f4b3fbeadd18d5ac4a47ce1aaf3e62a18897cead919467daca0992723e2da496fb982ace2336f76112af4d485fd63ddbcea698c728668a282ecb588d08d7fc7210947818046ee51b042e9fae6b5d152ac6f52756fb7624cbd2bc31706b06153245670bd35fb1a1fb9a620b87a014d93bb34d00bebd46812ebf8235f815b5c8fa2b50b659d101ec8f6fe43424935388e70c7866315f173bbbb176ee1259b84470819ea27e06ed43852dae4fc8933496dc316bcb1628e8866796491d413e7446f8feef214847b3327f693b302796ac08dabc8633f1082c18abb1c31ed2fd5b3309681dcc141b8926a5bb06f5f65436c0c9b53507296fc8fec8c2067ce018a48200c7474944d3fd3f496a9f8338c977ef6ba5cacc24e84839db8c36c7c04a75f7ab4e5544451f873b48752f46a685a60c97428129e51ce960fcdffddf0c459b87b1e028c1ec878b1839ab86fa4465385156b4395c38d9f1d423420dd640d574ec074f0b07c782736b3e333a3698797ccca6c61206411929eec8bfd55557519d7fe2de317ff5aafd0cded62a94b2205856acaf64da0b6fc9e60b0d475531453ec392b3898b3419085797c0cc65dd8ae8091bb2ddefdd8f25f13dda0091e76e79541977fd3928059a83981b4c096b1a01620cac4753520d0008358fe44d5a1fa10e830fd9388e03a64c2edb2b6c2c02cd166e28166f94acb0aabf4edac637f7968e1ea6437e27341e38295e98bf80d4a8fda79a8226799f655aa641041eac47014fe70a9b48314fa9068453ecfabe614e02270fa1b9b414c965d40781c15a4c54f11ef7f0d4f6c5cacf8af4b5b41be972df7358a5710546dbbd246ebf4404d8a956ef9b69448b10a5392229e5b8469222133f9762dec76b955fcee7a552cb26ced1cefc249a19d90cf1a60dd797a0c3a521954aad534dbb5ffd68177bb9cd9e1cfbe1da6192424522b6719a689d95a5814b4530d54abada12280e1bdf54d2d15b81d36f0523ee66d82b03052e6f3b59b8546530d61418329b22124a57d51eb17b12eabdcc3e1fcc2291e27228d04558855e6f3efc14b83cb86446940222f6d8503f03fe58e2c74706eb7c55c31b1b8573365fa812bd7eb3ace5d3b6263034b68d154bef6c46bb22b4e639dd7457cd48e9cb6408340d82b6a3032739603aaa0bb5d142d936e9b1741d2661ec4c4c55a60bb8bb3d8936692285cd3f88832cb9175e13b19400d1e298e1f9644413fd09e89735eae1e756c3f2623edf5bc4a6dffecf05a23bb8049ce96148759b347a142264e070e2eae4a5aaf1b849c3d5324274e6acaca1dee0ad2cdc934edb08505d2e30525ab345c2289f256237b430a01f79835061d83ebf0de5b9830a1a21072f59b2494ca3730c704334d39ae072e4cc869febd179ffeb752c898149d352d348203bb2f128d9440103af18a169e2c2ce7d1bc90c2c977367fbd6df1b0fe0277cde4359c4e3813275369455f9817615ade6d8fdd0de59a4034c0415b8c96f74c6043dea13be58c4c7d6918ee44830f85752a9b135209462bfdffc7a3158631d8d750688452d3da544bafa45a691e99ca1f0a6090466aad4a3da78095c9d20e20a04273f10ffbd28b9a473ece3832461f7b89cfcecb7d1a2b6d721f7f897af75e8feb974c61e604c024da1cc909f8123859a6bb50ad0d8d68c320353030911bde39a39d29b8db6e4d7f04006912729c6956f3a5c4d06cfed1af0e2a78e3104ea39f08ee6ba2e60114a2adba156a8baf8eb69a385a73e2817199276cc1071168db80397204a471f71f9c31e60b62e10329be9ce9ba251d223eb353941b61116d83c3c52afd83e30135bf8bc9e14d1c336ec832f5bc7e07452bf731d48b54b55310fcc2f41d525da03074ce4fedc5eec037e7f0c408ed781da28d594f2f2044e8a80433328527cea3151be2670370605639b338fa506079a5214907c73c203688c6bc29fdcadbb4c402b061e8da93abad8dc194b24b65f7680d9d818b73d8cdf6986ab89b9e31e98157ea5b99e58e06acb0511d38c6865f48d2089d5aae48ea2562182f8a3f871800d96d42d44862f260905c11e9aa31ebc7f5d65df3b797cbdca17ad79d1e719c538861ddea4160975d23d5031244864e2f996264c44b5543a2fbd4f47a63a1f15c18dc0167a2d9a6b66d1b2b955aafee854c2e83da8ea5e0db0f0338dee5343b1bd53c208844c8b062668ff6b4663abdd3179c8dce9e07d2437874843fd6405ca6acd25a73f4214aa6531a661365dae75fb0c64f43505e387b22d49adf01b47a8fcf711ac0edfb250b602d2b00e5f3f2ddea6c89cea5785fcb19056bd744c3d236d86529278a5926c8bd54ec8b885e472b054fae9d205922fe2515ba9e9b605d3ba18552e141e91c1493d3f68750b0b6d6b9adde16fbed3b096861ac97e2041b1a6ebfe295176f378cb0ccec963d1918cfba2ea83a7a38364736a2f00816ca31ab0654c44e9839e9859fb731c1448dae7f80215f07215d29fd75b27bb5f49d1385868099cfb4fb2ffbe3277e367d63909c0032fb5570439023c9490e234a418233f6498076f911f8c32a85de9acb6ca3e7cc12161455d6db514dc23aa0bee7ff829db4d50cf89ae701c8c028eb3deab2b832d520c61406eb14b890b68584cd2512cb92f988b3ae45334b9c198aab6ba0f77c41013ad2adc7dacd582ae9e039439beb75254780f2745674667bccdb286fa5c5ddd1dbc0e22ba7e695c9e1f7312d7dbeed2555a6b7e054a5470aef9c99509c0df1c4c141b82196d53b31ca6e6823b02dd405e56ef9372b204daaff2b2b182be04a07bf76175605aa0e6197043194b5fece29b37739f54a95427e49ba5f089612543a05ce0d5d17bd372ea08a352f2d98b713e37d5bbd73a50d9dea52fea1aaf96ddaf9431c21bb0290846c66acd1928e18a5dce583260d84b8ef361970d8c2bc1b7881d2bb9e575fd0737fe60302a9680eaecc2740f3e415484a63533a4c6fb1fa54b4f001976859ee0ab4eb08bb6914c5cd4c7eb2a26efab3d8e1b9cf6df2522c9da340c6b8b513272d821bdc390e79edbcdb59da8445ea14bd879b6fc08f6004969a99e025b31b177df3689391135e034eae42d7d22f823faaa94b7d88446a467e7ba169999445b81af13945ba718fe641d756247eccc43672714f60db1c635c22e8d5b39ea0b211b21da33b0ccf198ac400e644917d9f30680732a22af3f126fe93f5e3b77de5b84878c06c0ec42d98aa2cf725e2fa7fa363f32896ac5222d92d1e577d6bf9ee71c82c2a662cd918fb621e3770c198f54080cb335779b933eda12330da77a11321fb3d1fd3e31c8c782be1e8b376af57a90087cc05e070984f08b8ffc6004c153804ced557566f1e96a77f9e8e7772f9f94e6d5fe033d30d057b1cc2a0f366d85d5ed5de792f71cd50382a844497575e2338278b2f9c523a9a95f67e2ca598ad569d25107952c4807d9398fa87981f5eb1b8112a569483ddefa39c4a3b3b43169443eb0e8d324869e96ab8b5e466f0caaeb0d2fca020768c9d130f040facf1026024870dceeee4098d1b1272e1a39356d831d6d337a42f0bf5b1cbb7ace29c5f2ee459b41ffdd538133cdbb51441336938fb2b6e0845ac4af89e5f1ee8d5da75c4d4945b23d48608610bf2b88417815f856c69ee81d89ee276c0ebfc41f6afc97e4c2eaca73015d6ae850dae4cfa6c44804372e66edb7f0eb3f28bbe8fd1c9de506e586c84f902dc1a660adb564a9fee70ffb3d083d666819e2a5d58504dc86982fde0abca1a6eb59d24d8e84c5245b8d9b512616d354117170b9a0deb908364c106ae8ba0a9181979b4e2ca61928163ebe776fed984dbeb8ce4c3b3b496abc974d3e9f89149619f51182a8c65d2b81a8ed267dc44a143c1ae52209a252653a736a4b0f21ccb89d7b0a717b7571845967bd9cfcc0edf54699b11b0a7e49f52580c3448c98132f370e8f370a8e6e5bb852cce4418c9e5da493456f6064618bff7fb27cb188a19f0d661386f966da50202bc0eb904866d4284c499337c0ce4f707ffe9aa225cba8722862e2ade09ddfaf3ba12b0192c1541f809dc5de0eb4751935f6d39c26ccc2478662318cd6bc706c1dd39b3e2ea97382920c35cfba049a3f21fb33ded5e402d150b3ee8800c61995d57e59cc173ede63acc354d135c99dc420372101a306d5932f6573250f956439a6241bb0181ef0077d6916d11f2b1a2c6461b1a0da652fb0947d9a2df2e4bfeb1a19076c01fc1d4c97a29828c313bb84c7d74bdba2dbb45457351a94371e7aa8739151d5b7d6dac3c4906932e4fe71c5a3e5336fed5eeb3ead5961538574225f443a1ddc6f28479b30ad7c22dc627debfdaeb87c13806153872f763a5c4906a5a4746d08f82dfa1fff34b11bbd86fbe2df44453f7a2f1e681cbca52acd1032f1d6b095f2c7bce03605bef9c8d61261936d313f6ac475d905867b69c72315479a850d136c7ab483e42ce954d5c855f14f30801bd7857539bb1714e34c6c214bac0b7375979728af1018f21b9c9228b784178b44b5a0e56478867be946cf20fb66ed35a9e4c0529c722128a43974b970fac9f39c67a23a63f61cb1e40901cc88fad1ca7926782244d8fcf48f40da4a66add6ddc829ec65484e149429b9982cadbf1527405d4599db0963f11665dda8773b9ee4f2d75139f7f5bdfeb78b6403bb27fff9a5e66812050c7074d6987cef3d743f8f6322be8724af9fe085caad360e4183860d6172ff7479775c8335c60167bc10cec506f11b8a701a690ccf6d2d75d83d71d60c41781e7058c0d792b2af6480dc2e77a2e1f3e477f72efc45d2d884bd762eca3af40b22267270c4e86185ae2d58a344f51d99bbd4113fd6ceba1b6f551a6e0d8e508a2bffbd2184513f7c4c09a3e67d1d60b5eebc91677630f2c959336b26376f26ce0c2dd774f11c2b8b76ba83550499e650f8e084b7e78efc87bd1205bc62cfec082b6dc2b58e3c3afd0e0a663be0b736516c00b8f677b67061eaf2fc7cff3007af25a9261326d27aa9f3d4b66459e9298031b83bde25791d41311886312f8155bc93deafcaea6e7ba7442db57ec04ab629fb60bc847188298f70550ce417c56f1e4687c1312f30766559d436a12093f4013c8f9133d8ae1305920b223cc95649813d62a05f3a22190276a96ede8e7320344dd66f20c4b2318830a62000eebfd7ea74d1c0a3357c9c987363822aaa07ffb03e771c494c3eacc6cde2c88981985a395af0f374266f4afbe5fb6d14e73dcba77cda208431a0ab0cda4e831ce2d2d9ba4feb7f5576a71542c90168fd379e091e22bb05671a2144c7b0eb7fa03621705a25b9e90f4576a8fe9801d53af17bccf405a853515285787abcd7da33a3d0a64d14419c80fbe9a3fc92bde8724268122c220fc17f05534c36602e15c36b454bfd020b531ff8651f3d3b0d91c2ff1e88690ed0befc0b0dcbc74a39d06810aaff8ab3df8e74144f923fde7981e99d1568ab145d890c088d9bfc38ddf50bcfb69bf270728757868a7b63587e96682519a0ca9bfd379f9bcb780e68f88657230d2248d93ef09f52695a71c376396da4bfca7cda8a01d2397decde907c56cf1f53602f3264f99e79386fde5c5d533eaa2b44f5bcdb66b2b9d1c6c5758fd3807e97329eff95fab54d6e6ca24d66d1d2c98af25cf1b651e7d7e19b5dcc827d1a3d5e5a4e84a6a3c4da3843703c56b5c25d0b80d619885b71e5261269fae1374f0f141c83b63e06c7c9c88bfdb606b66d68b458168d45792c90c42115f15db5f7bc594b60497af90db55f7960f172c19a9a64ead2786895f9d5acca87a5297b66e26745180669705b27ca0b99f3f9aefe35952e86cab1f75f163cdd10927866d6c95730ce67b852b9339749f19314a644fd3e682797c826649457ad8e2fe9f3382984a4673ef4714be891357bb3de0637ffba9d07743c0c56e58acbf01d2618a1c7c7176d0b8a1283a14d59e77cea2df59b28e029f765367cea17d9d5077c4271693e2741305ed39ccaf7deefb360cd3ea9e41db9a0c0256fb6502943b89575093aa4003421428ebafbca2a56be8592f755d4b14d7d34400d081e6f5c02308e5f8a3f9950633c390fbec944fd8820fc3aefbcc8ab58aa9773433466c80425941ede7b068679fa324bc96af7bae0bb555eb92dd6b1d2ce9d348ec152e703d20b386741f8f7b443870d84a4c0c43fc04957f6a91bc8c89e45093b158ed38912cd9b503b3c3aa4e1617e6f59e3b25848201e38c33d053f7e92c87750966ae5d62d2c8f95ed00334b2e584de9bf453d38a45daee6caac4664dee6f8545775d3fe92c2c456453fbd8b7455be24f1dbfbdbdabad328e705afcc4adc2c518cca7ab11b225a02d873ef35013675e93db46737ed009387c2c10e2c7e250d4ab1a878db601bfdc934a1d23acbf10ef9c4654d367b2f22be88ec45ea8c59553389b45359503c0a9f758215712d537761e138dad61bf7d8f7d3a8278e682a7f34be50b4f84019c8b2475867f9285683ac65b586cbe93b12f65f61c8550266c614910d71a16777e082bbe9b48bd4f482232eb90542fb03e5a407471c4b1ee6d2f3497f09e992054b7c48f747c97468cd582b04b8e76867c4e3b4f5465b887c6c897ce71bb1e616e89a20486e6d9b9a0a5d407ad0cc63808a40024b0a20adbc3836b24fcf59e3363da0eb16fab47d0aba95f629bcfb754bb0cb513dcad73990a87226d46a04b4d4d7ec377e016ed6137eea1b22679ed8ab4053f5cb2aaac3678802f98c366e80c41f4592435da288ed5b50db5bd5a3a36d421b7dce56da15651e422beab7d9a30f01e859836ac8b21dd8f6e53a6bb86386ef622f37a3620a2452875e8ef14823f1b78d46f69bac4a4ca0838ba53064807f6802ff28a2eaecad02c91446eabf427a6c2bca19a2d006ed59e481aae610a26f58b0a6b8b06e4d305f5b29029cde2015ad572c668e964c504e43c4028bf428ddcc76e6a97c659536e587f6c8664b2c9da03738c9a16e6da2db860c8c7559908fbe8030feedff6d2a58985bd53c4c8bc8fe49b80ca969d4c74f0c26ac362da34ca5b81262664e6b3865940e9bde7f740988816c6a7b9b989ecb80c27fce7729cb8cc0081a3cfe44320bba2e4a4827870212f4b4872563fe8afb25a3e451d473abb8f4253c2a361ead3ca40c7dea43df3a659c521476f96153b110d3eb2bef94f57c4c5e8c8397af30c70435dfa193664ba70c3cc020904fb9f3d74249dcfd637d5ae1e5526f25f0995ee6fdd1bd9a43e9a251058b6917a44926b3215ac18ed21d822ac09089367116de31919fe044bd7e85ed69f140b2a3900adb508cb98b1286ebecf42ee0436d6964e0af1b5869c307855e6927f5fbd5fae492c5a37cc76d15af8542f685d08839f501bcd32b771c7e14c0cfe73c843afa92b6dcd34576a1dfa1b89b7bffb3a14c206a112a186f21f7bf5b3d878d69b0183cc73ac646f6bce47db9d8ccd3a107f7821bdddf8061adf08a0e9c1fe086a406d81502e81a933b42aeb7cb1d26cb8511da5ec65ce75d7a2aa7f385b7be46f9576c653effc9a9c6182de6d52a98a332ba198cf83ab2bf735e3e0278b720a8411868647f6485da6bd4b8e3d999f4620fb616048250ab2e17394063b0e032b61ba69f8fbf5350528d7293260a0ea8b24d30150026d49c95d62c323b1a0953cbfab846bde9ca088885c8c6024eb2eee9d9fa7ecbb1a1b028cc9f03f478221121cda3858c992ddb7c6507f7e9e419f6bfc13454316ad833d2be16d284975d411e359860403e5c935589661f969fb26021eb8c3db68ddd54f1e767b3ceb5bf2a8db73bde0baf58ce5629f45e33bec22521e3b3f416255d69b3e80c9b3967719e25156d2626e4590c7c0063494c1391f3a1ff31e03a241553a33d1c5f0bc99ed76bb4b943c96665481e5e691cb5177379e168d9958d810ca33a4a7c53fdb698577e7b0befb50814ce62c4d0b6c9f69ec12b3219bde32822d3e2112c17f7302ba03b6af212788608aba176c742eece58a542ce85bf93d3c4a1b63e94c877527426135cce49187cacaae53dd0d053fd677915e0fb97ea9be8145f5976edb39069d02b2dbec49a99299369df5bb776deab539a4195696f116cea198e9c2742be2a6e1050fc8e196d7f7d1bb33109f5e0e082bda21bc0c248469f90c99fecdba7d7c8e2ba6d99a5d33729eb84277258cf3656c2800c531c42e3bc81a5314c441c6b3992f9a499222739e16792d87db7c6f500cd9b33bb2d959cce3c267bb9a791274ae82ad6f0de21bf78f8a7aa42b77d09895eb1a3905e40476cd459a735c187f05597743cb6e69e41c2a0d69af03f2811c704a3db8240f448750cc0640e0450903820d7da40a9cd1a1a8531be86141787f72e26e225155de7fa8374c80c77ce4cfb3a4bbd57ea54adeb7915ad6523b691a2abfc78a0cb7a76820e8a878a3a85a9de559e7e72c4e2413f1b2c433467284dd9be8acaa1ac714d4c6c58b4369df039e0bdb299a3442f93662b0d6d0fa0c0dcf0cbb1a72050c8153b303805f43001e47e442934ba41a5bf6bd47b1645c597593c5b317cee1959759ae33e615415243bb0a2ec6b317c14e9d1fe64fb47034a10e15b9919e45cd0ff1468ad3afb52cef17da993081163a936510a8845e303295caa89d3aeb9e0491b6effeb739dd409649ae42c6fcb330f267dc8c75e099b9df9cf0416c8975294ae661880dd2d72be00769300a2dfc1d4bada5a640f4726cc3c86edcf64eb315c7e6a1eec398440635e31d20c2c5b3a9cd92a8ed118ef79912828b60c02c105d693e060668f6267add4c1b2f879f8a9dfd24a96ad6c10b94514bc7b2b585a46f6ade16bb26f8e09b992d4fa28d8f136a43f3b978f84c014527e0ee4458d9314a29217e853fae4077123a999895622acded9183cc16efb5f3c6e6629d393dc26750baebc951ae9ecd7e95fe5ee658e52c16ba8b545b69d0503b0b0789a4bb64840f0fb1bdf1732c41fd343370d3e20ba689c2e501221a0db56d21d25d7d2c7e514b24cec474f76a05ca13a8da472cc7de673fb002e6fab454977956bce3fe24809f036cc949860fa4d8226ed19272d211c782432c53e072d21632d04e1b4c5fa9ff8cc51bf9d7ad1583311b519025db4108eb98ee0eb52c6d87231bf1f3eec9438df6936df49556f961d60aaa2452f9f832ebd03e4efe25de85adac2d2cc64d2ff4636214fdeb797cef33347b53f805e2e3a8f083006d3ac3640a4712cec909db1014bf34c89d22e07bcb5de42125f3f35aa5249b8b29a019770f3e179b6dd0ea991254515023d80135e4a5e02ca725a34b75d0276fc549aaab091665420a89e491b319c84a52c7108967d17325e8aa7b2c3bbcbfd5cd9003aaf45e141b574fc6f65384667058386847a443cc6a24fc9cd5baeb4b19a9507b78d8dd789caa2f8625d57a99b0fd07778aee33f92561ab1254b681793c87b16f4b707c4e5ad44fe1a783d9087e39bd3510b96ace37d8737fcdc303428b167b1b569ca87c40f3c4ce133ca50d913221f4830360e69ccbab03e9d0ba10b1d5d17e47843538757cd28c657a14a422d22cd5a56b8216dca8ae6635c813eb95b9c519772058e6ceea5a0afb61af68fa3231fe35cf36b6a495049849943a9400087e0678597b084056b8ddd08452e3ee6e3b9696a4ab46c9e9b8263da90466d975b8ceaf11ec9e5024d428fe73b0db420d296ce1d79de74cb8674b6c3e0fedc2f18ea650333f96cfd9968b7c5f5f3f2137164caa7e52232fe6629df450e0850c668cd2d6a6e7049813f4d5724d92f3bb3dd6e65c90273954baec227a7d4cdbb4ce72cb64f73a6a3f957a1c071bda8df8da3868a592dcf94b79d662e3bb028d8b4593423e71cc7d0fbbeef9d1358fcb9b2fb86b81e6847ea0b9630af821f8fb8f5027d922ca94523f4496c9637fd3d140617e930152dc6bd1a901325741c2adc768a80d00f9a53611f5ae5045263339c85dd61e372722f186495b86f6cb8662f16296554ca844b55a172a1896e8ca5e69cf39c71d0d837b455f2ec5100e4f5db88d142b689684b6a0e7dfa0bb90b53c09506f543d98e77cc94d461fb2044363865e354a22ff7538417f9efb35ede941dab54083c98d20c27bae850456bb35bf7ab16cfb1ffae2db0b87ef47393811f60dfaef8316b65d50af0290ae73ecab377a73d7fa154d7709e4d47426d57b04c0828eabc412086ffb83ae7c57e4c9f5c6438e8751d7cc9a69317b6fffe416ff203c4bde267512d90e405a364b811a77b4ab6ec01dcefd5c29e2d8b65d228ad2dfd9ed21bcc4ca4411a9b108fc2794591f5ec9cad80b4b382bbd601e49ee089fa6b8a31217e2c5ea26328a19050fbac11b39c0417fbb7bcacd8b536563dd50382669f230cdcd88dd0278687add815b539521b6f54c4d3b0245d666dc2bdd6e9699b3b133de8cd507a6e058214b2d4f0285160849ef93eef1d56ab439e145b412ff76667377a06f3978e3982fbd635e08fe3c76f6d3350fe2d44b85bc215d57f7f1f6a562b20dacae165a4934a9b5914bde9d23696557843b6df9a7e40cf7205fb5995bdb97b8a61357b5fd5e216bfa99a7ed123e704b055237fb43bf1763ef98e8e54b4be066428f225b4afbb74105a8beeb6d303225c6e2ca572cd47bfc6db1d1a6881aa53439c0da753a785753a0b8f08ce5d627046fa60685cb464a3716168d9a969f70939b83d92474acb4595fd9d89f7636e9a3e00eef2c487afeb5daa2147e71f4281a10955984b1bd53b2ea6df5ba0a5cc4804413fc25c59916aab62383994bcbe90787e7294549e3eb1cb96abffbd7294a157ea51f698350d71f85990b66c74da6a4e3efa03687190e5fe32b3c2f2c711be34ec029a665f3f60243b5d4b40470ef51c41379295e33cf34e200e3feb1dcec6802da5e361ebef29e92edf69790262eccc56604232a062ea61cbff82d789545358e7003f007eea4bf5b06f42d0deccf9d2f25e42c6faae278d3854953fd0563a402e598d8c13390668e838061f06330c492b0bb80d18431d210478a90beb402549cf2e93e768b04d1066a5d2298c361be21500bbd11e5c38677f01a0a9a6a2fbaa2213bad8a91f15d4769cb80980dac6a39fb9ac2e690112a0de87000e5334758adf0ed31fb9857faa419f2bf68e96d165038976dea1ffcf9ff381bea461c598d84be7681d0ae3b7ef6b60ef35ae1201f59326a7878e9d9ed0eaec1c3d64b9eac29493e37fefd1a0145be9b4ac61e76aec34680a1d905514abf9bc428091b7434c52897ca535604662a99495616871353d6906a7c90d976ac2ab6f36b6ef82a5bfc91a52ddc9cdc38a998a49cc68c3147ddbfc742d1d93667487df7e14bef968f3e090286971cfb3118fb8a2a13746a57f609ad5b4cd734109115fa6b5dec5f8111835e55b20251c96195099f71db24c0eea3e2e21438b29d458b88fc8cc22ccb64f5a3f9542183b7d651b6dab93a2f2bac92493686d41467460817588c37485fa799b30e108f44560c07f026be99cdb4c07319d2b5d3ceade68cd94b1ced683525386208f328571647b9d7844b5bb6fb3311a6dded1ecca22d330069eb305d29bc2cc0718efbadde24747fa24392ab3d5b1e63412f50e1924d48a54bd3cde4c26817d3e42bca865e7181078413c74df382ef2be948f1968255438479592e86a6e1740fe64b3dc79fd6b047580e81cb15d46bcca0fb0572cc80a51cb85c6f3a1da76695dbe17e154003481b271d719cb78f4927acb0380ee642777fe6a4b8241f3f909702b21f62c106f95790dc4e93d3a8ce0c614eeeb23f9ce90f5c752c8f96a2800b0fc3111625ab76d5e10dd02c2079c5dbfdbcad8274fe46741781658d175de29ddbed94784eaee410dafd6e59e410bd4113d684063d535c6a0e5be6a78a8a8f6c7737ec714a836a72cde8181314d90700edd52978bbb1ef8a5e76c89555a28b9ade3b65ef845f524ee82c543b0e5f09bc6ead954803ad5270c05f499f5f561757241e9ac630aa9782c48461d45911c1cfbc3cbf67dfc70fc686944d38a7dfeabe206380683a0a4364dc581c38434c4e7f6044d58c631993aa12de50eaff05230916855c2a753f615ddc3647f4c36eee6b3dcb796ee27fe17cbd0b9d2986c7b466c2a1ee15bcaa515a3d2e053bf6f213417359bce9c13f76dfad1cea35ab0fc8fe72e80d15ce9e47200f0f82ed12b86e3937acbc82d57b1bdf6a9ec11a2b6b2539ae571ff7495a8020641d18cac04328a04cddd6f014bac4ceff9aed9232b0167384bb8eb00417524fc1cb2d6a64126b959d0ee5863fe6ccad7c1ecab70ead611eb9d25c46500d40d778074e5c8f3d422bac228e91e8b9017adb5f33314c1e766019a62d73fec290779561fe8c5dcf2a364a28f7a0f1c0ec21e8309a3d928db1cb85164adfcc8d6d77ec4dcb52d168c66744ce14e3a54809d0fb249a6a68cf5221db851e9cf44a84fe9b9387dc3c55fa487a17a86549a6d90b8c2127dc5c26bac58bf617c3e2247faf69b6da9808cdf2251b3fe33732323701aada568da352a1064a1f0de629ee0f6ec34effbab5e6b9e142d47390f461934f370d3a1b42c823916fbad0a418286fa6e0aeb85f8f0f9a6ce7aa13fef92fee7ebbedc1f70c7ff2ada999da959c2959495fe1211f91b8fb872f2ec4c57e99ec34daefe9092f3869b49244a601e82b6a5aab648aa7585da6d93a6dedc5a757a1787d681266093b67de978dd19cb9adad513554c73be100ac0fc1268740e07b7d51ae9be26b52fe63925d22e63ef55f1050b078359562f57c1346b23e33793ad8651b20b423805ae9c2777a1fc49f1df115bd8835929c28377d1205e37698c713ed8b9490e5071a2ec55fa2bee8d9e75ad46fcc3b6d26fa5f443374474ada4f308ad4e4a7f7769a4c9fac0c1b9322f5363c7cff0a48b4d9ca49b6f1a31d8e8d4b1c66b515ea9ddf617538ec2f46d3f11bcc26029c49903e5289abab9d7437d49cfcc4a11f5bcf7232f6b3d413f12ad8f4a53bd0011d22983339ee30244a040a0b2c1f7717f1f21a76e9495cef6f1acc3b13583e3f3461f5c704e4dd5ca0c8d0e0d0a906535f18a9d8042cf9f3cfa39c3ef2e9ec1cfe5c707201c1667c78ac5df1d864d8d5ec39966c296e69c5850d329fad8f10ce39008915927e6ba223910fedfc747427a785b69ff52903a5e8efe997b12980bb8e092e48418ea4319d1f7eafd0b911a4221177728dc103a908afc3cc5eda2e5b2257c20b2ed42d626b0bec67318aa807bf7e83fed6ebff03184497d0ad7df0fe9f0856148d99252c524261dfa3baab54e74df4798f0020c0847e5fc0eb77e77a1a2e4b109412c8e0227833c569e35037dabbd26d5551673484c9c4fc5a1102bad2f5f12fbeb730cccf9fe50c3080c8acdee1f9ec26762c0e0023b0d48dcca8e98b860d39f41f2290ba1b202879f04e66942243d3b890299c023b7a76f315c94d669edc2d442095f648efff6c007792c3fe6ad0a2150fb1d85fd7188ebca6540f78b3bc7218026822c22de1039df01321f24670b0fd6cb50ea6cd68d21bb2a611b78cd6ba8e11806a7512b0b3822c9106bcb291e3b49828809dc873cc8796ec6829a4c51c26c35c33fc97f908960e10ee4eddcefbb5599d4eb2d72de4ca04380bde8e52f91772886b403151c7555e2ea05cd11215800d367e8707e754d612250ae2209b928e7623c21e5e483d660fdeb4452c5027245e6d46ff04a31aa68f4b47145f0bdff5412b4258ab01e45ff3ce276580ed7e79e58f64c9e56203f6e9e9f990d760e010b239772212d445d4c4c6637f943bfc4377dccb167796fb2f85b9de28182f20201d6415d369d240688388e30f27e0cccf2ba03757191e4a9e9c6d6cd40722cddc4185d6cad49e8d96dd79fdfa58ad917ce3e97f919030a19eb58384193bf405e09f916dae7447d573b07970b174069b79a0d8919b5e39c59567b69957f1d4952273ec5a2ed20a741dd279f39d8413444c9a04dd743a0973e38a29be38e06603e2ee4c97ea2323b4a09f393fb450c7ddd38274a7797e2bef23144fea2865723c3ad0a7c5ef844653f6f4d8b961a4a1c5f6541a9ed03f39738c9df0f66aa983cf6ce595f214213ddd63c61b6b57a939dfde4eb5c94e554474238d0569fcb994721f235a971a7bc164826bf288fb1ffc47d5f391fe1406cef2ee6d6a50d9a37040ef8074ba3c6adcd0c160eac2a73b9fd10376b898937695b871828c2584768b944a0c924b9866a57ee88395a478a201e3f3bf9c06261819fa74a096a97348e2be45c961e0be3b0f633aa98bd724551c8fce7f0fde3c667c8880905969929f44e82b4209758ed9bbb354e9e6a7f21d1d49dee5427530d645c07cf0d75fe15ed53dba78f9c88498e5a11338aded6a0cd97d0b7de81245b98a597a0f5745b279b17584c171f3aefb4d764d8b2b54d2779cf61731db9cbf8c6dcb9d858b7634d3afb237f54b7c52e670225f8ff6805f5e8861a93a8da2c8b54e2b4027aeca9f8dfee1697a32a6daffe1606f7b541cf5c82ebc6dd1f6a148d28396389bb2d76b644a76dc18b21ae630b83c37bf17230e6f2685cdaa8865042f3402a3aec73c17a7515a8b263ce04a12c028ac47a20d1e351901d7a8083d14517beb95157db61413c6f2185721caabfe3ca693d226ce797b93b1912c55e0aed2de0695f5d4e98a911d87b6aa29f1c285a4d2a9ba8a25a915a65371e6f55d0adfa89857af1106462bc96f4c1a1c364cd4511a675e77286ba8e5a9dbb5da6f4db9e12fbec6688ac2800d065e53d38fe5035393cca2e8c8b4b4a98a181988968e780d709874821be2b729276d4748850cb073c407e3b726d81904bb295046e624562fa0c829ecf44e5361d8c95701932d7f306c3bc0fe2c5c88f6b39ee2164bf183ba4c3131026040449218a2665d2521845d4d071ae58ee86764afc72038cf7558b82698ee0e32e3b5bfc2be7724e21b77e247564ed951cb52344982fb2d04a2831acad97ad04f6077acc331a79ee4ba6165bc24fc2a278a397e0134600f0cd9fc48fc7273f202a661e5c667b563663d9c1bda61ea7e6ce2d48e0881715a9121e1eeb056240285500af94e2c331fbc2eed83e7a72b6421a5277296bdef6213097ed355d7690b1dea104e86648db76fb27f6236a18636ee19b51b4a3fc595435f08c9784da16ab62ddd3b5cf25647fb2a8a65b6e4c09b1baa22a6d261462fb0f2631eec9f6fafed26226e5adb6c3b0729700e0dc19bc0f102393132321f50f3a637c80bbb86a6eeb07c09adcbb4dfe6000eda92e65d03569111121c5eb207dccdd170af5c93867829d0c1af992015a32f98a2616872a5355f49cf9f1dc318a311d8c3cbe37c85fcb4a232df0040377e522bb473514d86dc417eb7112f14245f8176b3f69524ea9bd1ff82771d111ad791906f32487bd220ff1a80bc1f28d479019e7253dd12cc71d37bf2550e73faf0da4205c6c288aab1524c17a79ac7818289d6bcfe72fbf746e1d92b064be5471cdb951d528701a2d178765922d247a4c1444c02bdf9a38d00e0ba3aeb09ab5463c5a28d461759b609952c1ff1ac15e497949bb1da603b5cca5d1dfc2e9e75e0e65c104dc126dbce4681167b2be9cb4d09a3d7c6d922860b179b0ba4113101f782a5e0524058907b07a2b5119a272285036e517724ad731f49dc83b4467a83c148d1612ad4e8a073e7007691ab8d8f6c6401dedb76303af230ed5c8cb692204623c6e35961febc5470e49317397303a3719ca6b2d6ec95b6297b346a938d52230d234f1e122cbca681a88de6675e7a62d3e3387d905e7a1d01597909e1171f8ee543858791bf01849f4b32be22735c799dbddeac2324336df7c4315aaa0df2a88865c3890f0a16c22bbbacbf4038b226eb903466e1a21b00d18d8485f4c5ff6c83de9948257636f38f8dd2c2ef7cc632f7c5388226c370620eb8427fe07954a15f7cbbe8936ee51620ecb47c106f79e6d06bc5b2a1ef47116deace5e33e55514c464fb584db3079d8f2876e22620ed4352c32aedd0f7ed4641f6cdc0b08c7a60ee95da9b7d48cfd5532012a6dd16c5cefd7d83788d4803931ae40231c51cbe8d9b4361d4e6b4b3f9ca5b6b90318ccbcbb07c8f593c94b67e007292074fa10f4e754f04fb898dbb7fae3a116fdb90b8a0dbc1fc4d02c8446aea376aa76bba5c1c18fefabad7cd9f03edaaf074b333c995a7b22ea3e3ebb475dd3e9c84f709592b8953505e065a712b2d63b05c1f9662e76306dc64e99afc24188bd05a601b7114c36ed29e0f717f121717de6ac35281fd1a6adc79618affed02df54b36af91f78bf72660cd45458cbc079e17004919a4cf83bf3607dd579560606abf5917f40c2e60df4000c5523ab6929447c563b32e853de8ee8e1ec8521d274124010f9cc0a20e25a44901eba954a6f267b7ae45890e7c8414886e39032203c6ca2a0f85b778c0525a78126ddd8c6bb3caf50a8da0c32372966af34c576e7017268d058f0bda3ae32727b17062073ffc65a4b836e252320e7d797a52f392903db0e0a872d6743c9fa3eff917e6f1b1fce37f00f4c1d67fdf4ab46639931f2626d6a2e81d6ac12149192f21c893ade20db44ac964e5f15146686d757fd18c3ccfae8a15f0eee35b5619ec15fc638aa433f3470311f4972dec7b694eb5bbcc45e0b1b08d1d2b5653f7795f898bc39be6a66295b5a9ce9b4e75e0124780e6d392a7b1e0acfd3e309ac371588cc88ff8e26c26d2904236ca45295ba12ed5b870a53521411edb9ff1e6040ca4065b5268674310bf3feb3af2fe8f7b816dd4fceafddc5d51eec3050340e1363b55a641885dcf7d76b3dfa2ec4444354930cb66510a0992d827674c2d4c8337f6c4b885c439d48c8c80c2fc391041dd3394325a03319c9f50567436b05e1413505e85ee77135f950d87b5928b193316e6195a325763f106c079b64ee9cc58833c00c9c5f3294730cc446b192987993f818a83a394b22c5c810288405fbc3080b8b7a58d0d3a3b7b4c76045f94bb709899c43950e4cc97385130ba438b2ff66f299a891dee0dcc10bc6db849453e37b9c317116f90aa83e906b9778af75038da595fe3ad6ba3da20589f78b29cc073c237a21fc13e87a03c8b2e02d9792f778c50bf4397859e0bcfd02f79a0e47a34cefc8c292145a4f3b3e18387257f162c27df13c5a89da83ec7814db28aac179d6c1831e9307b9bcbcab13d1f3575586df0568666b9e75fcad69fad03ee8ba3b5d0e5ff1df79d69b514b6698f638b57c5834630d117a1cbb30a3d2b0ba6645daf77661b570da1e9ef2a125ca1a10d6ec5107c0054ca2156d2eb927f0790bfc11c531ec981d4c5874593313382ca19d463cb42e35e233bd350b135ec872b6b6e9136d710cc033ae07e6752967161fc673e151d1c97638a1668b25a4ad467c4cd378af4a1ea3e1fccd24f0d1b371004659845e550efd64d7e3afd0768d88de0755b8ed536d68a00adf4e0e6109503f99e18d84dbecfd6da081f507d30206a6c5397c3302751d6a5bfbc50c09a5b7c48be6e8dc67bbcffd18833f88e728887d37fdd6ec83e4360d2c31bb6870caf56444e3cd031ba4fe4bdec7408c1b35175d7cf30bcf278873ffc2a6c63ea7867cf243cd3f2fb752e5e8d245c76ba8b6eb15fc31bdcf8ab5deba07658db372bbe61402721f1d8f9984d9bcafe0c8aa7c2ed42fa6c6d36a36b8c7aee31f91484fe322fe37f95e61d819099640c0a7a767853bf1759050ae1038dbc9e2f91145f4040b5534f862010f5f83b128a120709cc7067d541230c52ba5f58239bf5612bc2844250cfd1bdf5b13dfebcdc42934b7e9acf8ef04735e0c7c3ff9507f70d96499fa72a6f3bab165dbbe1936c4ba73393307932787e6a4981a1528cbc27bee0ded51253e8bb4722d97dc70ffc25e0acdb9fcb5cc2f753224d0d0fa6c7d53e6221ed9ca76cba29ad9e6b2506b68f3f92f84681fe872d63a0e3e089bc3432dd22a6fd3a20cad78896ef9779e7dbe8cbfdda1d3549a1f6072008e86029b1595986d9d677e8bedbc34b3607b868241424ebf903f73ab5517fd14e139277e298e8173dc1070cbacc6a618b07a2fbb8c527d8dd83db3485be966b70d0b5f08a721d2fca947d2ecf39eb78ebadb663f7b31251ac68dd76cd9c3c1bdd855c87db9b5712ecac7c3dbb828709d9c6de3f9e454a78e928df8576c0716f73f087636232554eb64958ac2305f10ca07b3e421bcfc8481574297ef38739e81642aef2596ceb2596aeddc6125ce6aab93f36c3f471f9b57af42bf819617de525b592f5aa9add4f3dd9eb4f165dd5685bbe2a63916dba6ca7329104a351ddf5268777661c661249bcb75b07c632bd3bf61edbdf0006f56d310782bdd624ae85d3d3ac3ddc0f2fd99a69116e66cf0e9f6bc79ea8872fc9d6396edb8671a5479b47d131211a56dd054fb80bb74ad20a8fe1f3df95784023356f0a93bb79a0ad772d449923d717e7e6fdc900111cced9226c60b1d95fa5aa9a330651e1182dcd061dc781ab54428545d8c9a85d61d5c59a38ab01e92bd35c115586cc580aa37a2f2aaf0b8d9342eee0296e2dae3f0d40cdedffd0bf5a437733f10d65d2ca6d416d650fbba0c331a4ee3fcf94cc79e4194a7d113195a7781e8e74afa0034a9929d5d9fd4e8e153d150854205053647f8468f7b540fb0ce467031cfe18be5dbd5e68fe27139998bfc0fb7e2daa4a0de048bebd62c916c7068452fe2514f0bf23c5b6edcb100162bb70b18b2c9b9a4fbf4b9cadbc8568b233f73caee542254bc4530e5680f11db844e86d8cc8000f39b7f5e008b2960510559b3afd869cc1ea7793b2506991717a5c04421e0e65132afe76458770e5cdf8eead8eff82c74ff63939784ce23e76db559b788e9ebf76d353fe1f3023c249c815c0d44438dd40e81075f9be1a59f12f6ec5e1006514024070cb83b7b8d024ed3214457d3ed5e3df907a618ea79c5f413e1c1a83fab910a8b3347a4d8cee0c4f1bbfded7742bf5bc68a36791c5111f2420abe3353eae4c7967105a3b180467d1519e68b3c347e85b9476cc4f876277237efc8e8151cccce685619e31c8b6a5907458ea3a48b7930a94bc2631867218f734f56d345d34b3ed3f6d1d55f97be1a164252802f516626fb78f33590f1914515ae96f4059b722a7bf0954d44d37894093ec9d527093f12dc015614843148bca6de59889d582f58579cffb0765fca88b75005744d784116ec5d04e369783b9184926c10fa6fcf8d2236c2e401093ee5f2f3515a511a32d99e46f083ad8be51585e06aa8a8f4db2c9a5799bb457ad3387076b1769a9ac1bb8371861ad0577d9e0954314d176c613d2a94dbaf66e7b21a29d13390347806c6eb8d8e2be293ca36100e317135e9b3598baa484b02bab3bffeda1544b091a1c7746afee81d7d5d35d00450448ed8836489c25dd16d1b11410df100691a9a42630971c168141050108ec2ee17a6e5a33e0e1846dc8076ae91ad1df7a91ce0eb40fc0ad2335eb804cd27523dcaca76a6050bbba8aac8a5510538f81d563a1311a006efc7e0523279cf8096859931d338c19073cb156a97d7ba2aee13d8a61272144e6b59057eacf9720cd6e7d28ad6a7118e6d39ace23aabdfb4243970394f244972fd6d7a1b180b280756e22085bbe2146f2476087737aaf3caac93461d26cd447e5889f029331cecaaa4eb86609c29466f45ea4b37c2ae3ebcdf66d43e8b4242ea71b0df9376fc39c078a3fde4b1069e99929d99dfe34624bca92afb48b00d7e85f33058dce5c65579d6abe13a041d5e00c2f91046692a5a4b5fa5e87560f631a36dce912937585eba7480a81ba91af6c2186abe8cf7b4e13ef86622c208e5653aebccb63130a71b7d7174b926fc74de4a4bcca7c8d48b0daf7d319042ad2a949c55650917596a9417ec28e4d3c90ec0801ec01858e5d13d8ccf3cb1f42e428817d2baa86173e4f9586adf51141bd3d08267813aa4b8d638ab9c111a6e69454ab558cde8f1ae91e0f1e941e849ee7ef53cc6bf1139cc2522ae8d682e1b6c4db888298b90c499f3f79d1628c9fec96c9e13a1fb62280e3464bff531f5d9a0217fb14e7257b512eec1997224175a26655aece977060c1de4564cb6159a433d26dbf2916810a6ad68f9ee7c58cb9028b89b8ff7854c123acb1660a1658367e4bc1cb0022c20e2e3e44673a8d6731ed0a01f6ee9c602470efa0ee4b9b3d8c8057dca32156f5dca987a08ebe13ee503e65b572e86983faedd806c77b23ee499edf47c8d9fa0586a301c553c2e66a74f2d604e0c9657589aeda5659e3016be8d839befa905b7ea6ee790d945bf18b79edc533d6c968eb23beb3cbc000c57e783374ba1772b5d82e115ceec461f581f8133189abf8adc9020625a1b843f2d5004f4ea2ab2adbb6f3701d6d5959ea78576f1d2fbeb792ee4cb8000c53d1168b12abc0e0654f2993716800bf35674702c9869feeef309f99f5829642376385423095e1e116cc690da62c6e343fc601c243669dd5164c6186dffa8c19471b95ecf47ca301eb6290ec3bf210a5a2c2720f3108d181b91d64ecc707a7908f43c7fe2ad28af62854bf7b08b6abb25b868fa0a3407e87e28b14bf87308cfc272b8563a56da825205e946e2a1199e26c1b91e2170fabff9cacc1fc0d36b56d59f5420b33324fe0342afedfdce1d7578706a4dadc90493669df4a9d8854ecabde9ed512ebc43bdbef94cf3aa733adf79d6c70257171666d6d3569bfbdfae0eb8b64afcf1a8f91d61026d913363b5c382a86b04e42af32dbb6f4aa20e54e738ebe1a8e7959309f6320546787a2e27053e1e0963061e1d416f71668259e02036c408c781b4fbf060fcb08558c8342720567a62f3e71fade1facddd1dd41ec33ad4a8a45a2aa0d5429c4c983abdd640da1d3cd4b4847b6b23622e9e8c291d19eccd292e7afc7b021d200027418851c124dc282145f6e06caa427aed0266d5b42d570f327c72ef7463c2d43611dd19700cd94dcd998a4165d0153c700a52d7df4528181b51bbb46d9aba9a2f09cb114119c850102a46bd8ce933ee967e78be73b553ee8f3c4efe701fdc3bf9474c0429227d380141ab2ba9db26be0cd05630b5c69b64547459af74cc7e32e5259d9db70c5e6057fc96dbf6e224dac421290bf64b86c458c14de9262c458f593a820847a972ca04549a51e9cb65a0b3e6962e2279b221902805d7e7ec8fa8ed1e450f5aa64efd293cef930bf494bf627ad9b5559db7500ae09bc4e683cf51b054962b78275a38bd1cd770ea5f3eb5fe6ecbb8d4a97da8e144fa4c1483c8bbf7f075d7eccde2344547bf5eb4e123e32b4e386cd5a33daf30790e75e241c64a422c5bffbdd8f0f7f1b889b6a0c1ce10b9b4c3d82b183ef19fe24f3d0a50e6764b2c471d8ffa0be624aec667bf55836a42453e1ef829206f83fe7f9b82b5fb1d0ed23aa5f0fcf080887ada006d788587a0303a2d01972d67838dbb34c6f4db16fabd6adf768a678be1158ac0f5028d8aa4f9c79c8a96e84850943036797096edc4283fe8de56bf1085c12ab316430919a3a4ee0ecf9a2c03b68e46f61c416e7bfc9fecf8f9a2dc5023b16ef9016728018a708073cf73923a9a92b8c02859f22d580831b9184b35ab83513dd912341a1da805de2b60601af2ddc3278acc150cb048ea90baec3f7d62abc80bae49cfd77c86b14bce26887d8cc5f43ee4a50fccc26308bac3c34e0097ff90255ad25ac586635cf53f11948ffed951abc762b13504ba0ec3e2130e79800328fc1819d6af7cdbf53ce6faa2821b6c80b118606f548146490e3318100250d38fa1d60970e765c36e8735599428109381426e81295e321c5b317cb61cec276010e6eac659f46a0dac4f1697d64e73b59b7d8a90208e7bda43ad698e3d7c842a9cd438fab919c37d19b92eed067de966aaa99b67330a19f6770e66eb74fd56c7ce5974b7d7ce694af149d475b968c3adbdb25801fb0cfe863f7586475e3f7f85946240ebb68ae3d87100aa01fef0b2153c4e97e8538891076fe31dfe7c7820f64f4079306f1ae1e545fe176fd42a1eb79940f3fd29e0ddf471f834c316cecfbbf57c89d87b5c0c6c7b87305821c08193f56c2d7412fff92bf8a1936b76774df04ad09d8cdc4c8c203a59efe638a348bfe19c36db386f037df7491e37b99f1d791f581cb6aee730be0c34c9d4a8ca95932cebda112ef6c6bc1752eaed5a0c7737bc87e9c65513359e2d8e50f9c1dec5e5e52df841fa79903b36017e29c131763632e5ea5d4b9c7a76ce59efd1c25f1420ef682fa8d3349d0a1b9d4adf989cab8c24a52a3c61c9b0ddf8f5f2e914777c39d91e0ee3c059376bcba5bc5e502209145b9522cc3cccc912c9034d1a1d1331201b5b5b821f27ecd74a00d7354ddc345c5525bbf6bb655a0270d55e383439d2c6e723d053da6545d00a4819ccc602ab36a5a991b0488cd8c3851fa5c155bd8ebd0cd25c4138a5e420c426772132535dfedf1e3cee6c5bd828d6d1b67c697a36fa8fd6e654940f464e9fe9fff9761b3c733ec42b97c3d8947b2baeff39bffcb465a6a93fd09323ecc1b4dec9b6d9247816e1d21f91b7bb3591ef24bfdb92df5d5f5ff6857affb13e0690fc5e897cf6bb053d9b8d2f6eebcebc07e6392fafef6c636be67a98bcdfadab7f3aa9bd20321537ed01645d6c639de6f06f7d47874dcf9fc08377014eedce74ec6858fdcdb146f03fe6ad667896844ff9a581e75f267f4a70f010989665fec476f58761055b020701d2a5379cf44ee1fd5f12e020fa5609b17d86fffc9f13feacfeee80068247b6be7c82922a02353ab2819ae6bb492456dcd979b5b13cbe8b14a606107fdfdbfab43dc7d2d353a050db90bd93b06a70f6caaf6cd6f6396dfcb679b577a687db46f043d8f3aa649676ae6f3b5437071f27d4da4b970e236334887f8ffcb3b5ce38e6e185362da12bd1ba655bc178e2bc9c81739498d8ad43cfa14c0d3aa8dc388e8e2db9e8d76af199138cf1eca9eb77480cd12fa1b791992ad1d2a55378724a371792730a9fc567cdd6f6642b99468842a794d8cbb4f4edfcf7da62f0a39137f0ac7f8781a68149d89db4693a58f17c1dd3a18c9d0fd7de2df14a1716649dbd829749c70082eaffb65b9a62d6e8c6c7e7df1f6e09bba8404834a0c955c46a63540b52d5d3429d16de1e1d504e5cd93706a9a756e4ec507a6ee47f4959c2c1d1fe500d368738e57f7f1a4b69575035bcba2f2f64c415be71c246a7b84e504088694d94d550afede42fab9242d4389d696a463d84d53d84cbbe73733a25b060af67a2fd2c04a0ec1a7bbbac6a3da27b28d70e7a5cba5de227ece49601d82f761986267e640c003236335d7c657dc4e758d9c9f93dcf0729bcb1f74eb9d8763651b49da33db4878d51ce45fba5d5e4c54f02c2b5bf01e288ccf143b7693698fa5baeb4fe55818dfc0b0e20de8effd2a032c5fefffb78c8e32f64809c5226f2d89ab5588e756c8de8d87d19b8a227c5b6d1854ba8e628dc0237d7678dc7e4f6e9b6c399b4b94c7bad0a76be55ebf4afcf07ab52108f203f8d86cd5b9e2ecc21a0378f9efb424d649f98c9bf98285935457d5e257cfba04979ad3b573f8ff9420dfa2236f6327daa75dea658e50095701966042b1162da3cee50be17fa9a6a9ef3f47d22cd487a7bfbbe119c6d41dc0ab25eb139169606020a3f45c40e3ddb626e7a5fdaa304b3adbbfca533be368b06263b84705a49d4e35572b6637ee2951146490df5c9309e0f1888dd970857ae8ea6f0829df2b4c5d0461cef026f11a745a30fe853c4d6a6ef044395a5c30e42bf0626acec35ea667a70e97aff074e3ba5f4e6879bae894ae408fc9ade1bdd0073e813dafbda09b0caf54884be0ab241e23ae024800f6aedb073c7cf1f3a2e143179c9f1f387e119513e84c441063d64fc15ed9a3076b86bf0577f577e7bd647581f9b4f2a105e21a769be2176d46fc439266a81402090c47c78efb9d1f678ef36e9ab51d99f0a355b2b37f3cacc1f39c79dd825005e2f8561d9c062b3d5c7427ea3de2648634aa9f51fc77e55fa82feec00bd5dadff349af470d458f5f7b68b6aee87c08a56eb780e54061166fbd9965a95f57b3348298e10f498bc2c1791b86cb7dc80b9fe4a465a65c39a00d3f80c05eef754cd1272edddf9c1c9ef3d2f62c2258b917cac6ea134c8541d96b443fdbadb3eacd03483bc86080de7407a6b2a10baa55da9b73328243f5e9f2ea72a35317dbc80697d32067c736d3c09f8f54761866191f4413e080aedecccb862f275f348947835ee74c37f3e767ea7b481dc8d474ffa9b4901d786b60ac2deae808909db2c9a557aee54ef287fc0a992bcf8eff2e5e5ba28fb0d3d890f7db7cfa1bcaba8eb3cc121a9bea3e8161dadab45cf886b93044a4e24d58dc456b8e44f26bba839aab96efe0c09b278f1f1d6c211f21a8adbce790ce6a82949c2a3bb4f06e20e59174c80da13ac17a33201613b80188720b89d5d6f6de42efa45c3a632eb451883d96e82dae06f289933ff6ba7ae0d2a6adb4c5f488df4f5641e208608e867c0890038eada26c1a091373a41c88152241b38a14eba2ffcc171de81386d4cb5ade563d181ae71b59524bc7adfa7d70c53cab23082d40533428bc062cc19012377fa04de3b85596ce05cf31a399bb4c6b4890aa8773195c3cacdf59f6dd171f64be4538517a58667f2885a65624b228e8354eb6d91e99a8adfbc714ff4d6bcc3bfc8d82a08dc503e3fed5e607b13101326c34c39fc40028e0d939b0e89d949c489d632e0e9389123094c34795a9672bb0ea29b7cc11a4aa5f87f73783fde9ee4749efb2bda978f73ce0e46897044ea1fb5fce1aa3025303d7a9c4e99c78d52047b3fb0f66d22603a0368323723c8a58178d21b07e5b61218fd87cf3690fb6b40aa7444238e40df6f03178c91823bb2885f289a85def11ae17d927544b52c809fc0659c80428becd5bfe60810d253eb6cc2afd35818fe38f4672d0746ee8e861c127162a86555866c347215c639d3d9c43972711aec4b35205b43235ce6bd354d2f7485020516f9fc7b9a4c21ae9eecb6364936f3e78b446890d20ca6c954f073f6a0cd214d02bb7d071107775a1f66e6ce40eb36309dcc7bb8c978aa5f9e1afa9cbad9f62bf813b4ce8f1804f871bd466e0a1297c9517c8580e2a110827c0ddaffabd3068748f0de6f9310650534b3834409cb0e40f09fbe0d735c2e826cc9130fd9d4d2255d184478e0ad4ad15c45c3cbe3bc4c927c99121104aee17d5b4307e70a1003b7e89004672b5701702299b44ea85a6f79161bda9b1419ebe8fdc816fc58afd661b7d84779d866aad97561a9f080c6a5a78a25ac5d4f8fe185d13df36c154098588bfd6448c94a8af2ee058d0eb323cc5082952f18c0c66459f01e2cf94b22d081d698d564bf9e30dadc7e0ccdf160685d1ae9b058c077a3a69af254f24f4a2d1b53722b3864d4ad93e4e6cda41b8d20312152da35fba6822638b7e2c5753396e10824e50a08b56d6239b11f2ff9663326aad07240bc4b3c71205c220046e30baeb900ca1f62befead2ac3ccf48c1536152b09a1a739e079fc0e3eecf0f7667b413496428aea1a64bbf36f4d73b969a15d2d421cfe62f12f6d62711da4258efd2e7788d2453a7959af2d5aa4283bee032c6898f6ff97125be79c3e1e58e5c8a65a8c0b97c65825fecb58e0b12d4b06016e879c4100aa5442c95e6b4e22f06b5ba1c215be630211a9117fa382ed6927f8fa00f299ca8900901dc83f6d15cdc073667ef89d9335a10f601b9851f4e0fa84fe0fa8d09dacdc16c7d30c4de35b3fa4bbcd8422ca931a43de0d6b4c7dfd3c439b68098c386f3c5cb53a3c99fd69bde15e101873d906ca719f9f786d2eec9cb86396caa899ef897e1390361bb4b634f140f389c5320b8cefd7101955ad2ce57c2b9adb5644233cf5fb0c5a4334c6850b46685e637509c555ed5b8f17385123179be235644f58e683f172b5e1a1fb983ea32d2d340cbb7c4eefebe33cca9f31a2ebc7a2c0ed9675158c341c47465f195cb6d603984322d9b624bf19d707eb3258994ae8eb961c02089699e338f5aad69f515c4b69c9a66ba3da86ee83243c3e7400433d70161d247921eca8df4af44653753402b9ac0da33ad613d1c511b32082445caaf5dd9fa55205a904498597903b6c34ff133055099efd694c1bb1cd75d143332444c3c797a9c110da818a4b5a5eaec7955c50db43672f694ec45d4df7f66661d2c2a6b4c3576baee7dd187a70b8945b50e6b71c53281f7d7f5bb2ef3811db89407521d41e4ec2467c75fbd65ed35e8997de081e0f10459c9267dbf7ec6f57ef83dd299ca944748a735f06ce6567227b660c490bb484c791c304ac6ecd3de111b5285371885a19b201d408ea884f75e540b73b32cfd732b3e9aef0a7abc83012b5cf7526ddecf8be70df2b1d735b1029fba36a8ade9f7012fcfd6a57763205bb5c423810632cb83d46fa613de42219a23950fb22e6c4286f8ef5405bfbcd2ad748457f901e80f018b481b1943ad0af8cc0b59ba8fbece0df00f198a902fc582588f80f3b5e71973ef2789692ccd34f55565b47b0dff5d7ad884bb2c5436bd1d1c0c37925792cce169d8a432df560c61392664eba771f829c9b30a69937ad7f527e51d1138176ebff2f6a38d2b0deb60cef44c6392ce292fabdfd43899a94371fa48233066d5655d6b34a94f102f8af5bbb210fe091086e605b9126451052c5c511c63847e5acc8ae3b77a71fc5bb665646c5f99796a7955edf77d04759fd25851f50f9ef06e9968e430124bd0c0df827660e6604df3899018a5ef0a4cfe02c4f84e1ffbdb159e594c161b2ad84cc41c4f692aea26bbe5823375f1f916e2e8e2cca906e3a4a17d936c72907d2e75e50bf18c94ab2b76c89b62f11b72c10b05cfaf1a06f46a9d32ccaf11573f5825af831a82b65c5a5d3b41566cce612604f8c77eb8e910af2d6e86e3d18bbe5f1b249a74d5b70213bd3cc507bb1c22b48a96e49e4af0e364cd7a965477626019de3f5cc234835f238623686cf87f2d1395ce90568b7b4b83bb863e1a92cbce07372a2e2e98303b8a23edc9030c23bf90191a1c08074545e52856eca92e6c885f8f851d7c4cf714a8e09519b38fcc41b71a45a93e592df934d1565f3589cff73c1558c99081cc86d85893b99e38b8f07c2769fc0ecca0d6824b6d630668a673694c4ebeac09773b0251c839bf62a883208cea636079698ea0923a0a65cd00cab9b0ae751f8764cacfc8e7d10f4ac4340a2de874e4bb102f6ef2b5f5c76cf4b83dd7d039f0a57f2d344e12ac36e05d2528493a54bfd6518e89ae547e92967ab1311f7c348742cd9782e47bb6d62791a8c5d3d0e07d750b9e7ba2e95b6045d9b96911d69c4ee6b38c0543ab5580860cb00b23eeaf1ca42de20195f9350d1191dc31d92068b1c1c654abb1f597c29ee9ca70384d58dc1dc7935303be6046d416a080eae95fdbbbc7bc3768844b363901ac24005e7193d2081516e2f65451824dab3c92e4cf271a1129698f69a94d34f9e94f92632c600a0ac56e6e77cfa2f08025af1dca0157867bd52f2ededd5d36dc860404f41c9ad5055e9a42b026ebc06b201bfb704a6ca6de4c25d55c322f381bcb010d29f95a02a3457d88820b61c3f449d21be6a35077f4753d45f85c5144e8bc70f9c37beec2250dcfad7f37d43be5f37897c33a5f90862576f78de3bb74f6fba982ba0138260596926b0ff46e5fe61173ab5e5dee21bb168d806d2ee6baebd11cdaff296f3d735b4635e66b0f72e568c150fd95798584152d1bd41cc53adfa34feab41be01aeef69fa7b88fc2fd461bb59e957fcac1124336751765977ae2d3166f5969be74c101973a090a6bb79bc48cfbbd7a90326ee9036ea9b952b3f6dbae2769ccc7f50e8c305627983a43554747cb6e758d03dc1cd013fa3fd092511877e6c97095713af64696219427614fc23e3ed552daec217f30c4a5df2d9cc143ceb916ea9ac9fedc2009745781bb9d1bff68ff215b9ef961ba29cc897617f2552c18ccfd5f57fa966b1b7b1e4f3352432571826eae9037c190edf02e564142fb8c6106d4908aed02062ebff97667bfe7d2a3fb119fd0a7d541200597b07e3dd174797a9064c98483eff842f9d799a68f0a7e6e5e2ba769381426dd965a05a3482fb76929babcd55c6ae123471aa05658509fc43f0fe2af17ebe499ec3d96bd0b40a3c763e14765560ced0778d3696cedcf866ff528a1d44e68ecdc980b1b806dfbae285da93f53d60d99f7b391ee08e6835cfb3b04bb086e062677f799f55c1a3ca7972e41e94212aa5bc066850a01d55974096fd7fa9772094b1ac2cf132ec3f391adafabde8b37fd9f2577ad3d48fe7d663f33c75f7f8f685e579adfda61513f7ed0e5cd50d36cc6bbac2c0e296f20f2fcdffba2e6ab0f5de5ff6e2c7195ef6bddc5a309d29e465273a11b87f754e93f7ddfd1c9f1fcdf85691a527f4e96a9eb1ff4d314e670d3f3f8b07e2a17772075e603f52e18cbc3b6aeae653fc06cb027939df48e671150835426aef1c0e60e70f2b63bf569d7e02c93fbb2144fbe55472f6ecc358d0efb8f6772c7e3f4c0acc2ff275bc1cbb7fc6dfb3f513ca66d4b49c98637db97d71e0d8cf8b952e3a2ed888ce7a6aa191dbc2acadf2e85a714765d066f6c4a08fccbe9c045b5eaa9935ee6f0ddae900598db48c61e6946956d23bb755ff8f5f1ad59e340e3a7cff680ff01e870a3b3e2d3c17331d2f63a5a37d4ed0554dd3efd88d79df328f853d59055ae8369b44ff192cfe38ef3e8d0fb60b4f0e84b7b742e2216a4c58b3ec598eafd6f25392f839a6749599aeb2477d24589d500d1f0f9fb46d7167d96b3ca918f64920a30c00a0fe4b72a03f9fad18eb751806b5ecd4e6f760246164c12f0a4e8dafaaaed98ba3d7201f8a8e9c01455bce3bda8b9b66606efdac76eb2fe7f17912a8f1d550e8656f1dd9109e5e6e5147b03c285e0c8ef8fdcdfc1e91043e11357d72cd73279f85e947efbb1144de18e7f053b037ad9c87b895d047c5a8b4be06f128594a13a76b3f59e214a52eb58fc544097d2f6e4bf811315adaaf8869897e407c4bf50331d55213fea7dd34c67e2389cd5f510a323fe8e3ff275b6f958ca00b52e492ac7a2a94075f58725458893f528c4bfb756228f10f156fa97d4ccc4bf8dbe256a28f14c3d27eb5184ae4c3c5536a1f15b312fcb6b8a2145c128db9fb75624829c74f87a2fa9a6881752847a8ed189c48faf1577874a9649db0c900533d46bcd2f97730fc3e4ed94ef70c8bd0f3b01c2cfc83c372fae415f96ba576f66c694da7c3b6ae8117cc0a0e70898728e43e3b99781003c241e303e8f5c4f2f49c7c6e44cdb049559aa01c0a4c4242a198be514be22e2aabe4fbc807b1e07d18fa4ef4df06cc3d2a3cb2fbe7042bdc2f470ce2c740d96c1d3fc70f76065da8abaed6b1bf29b27f417fddbde7171c0b50ff62f881fd4174a3e7f37711c2bc0efb7731b74c51f625a0c7c4f9671afa6ce1e38272309f3ade0b85b3a7eeb7fc8714e093dadd60412cfedada741585c7877d5a983fc7da028ea35b5ec6c73f8e442414402899c27fddf7320c3c680abc8787d975a149b64e20ff438ca39a09e8c2fd47e274f341fbe376fc76fb650ab21bebd8a84a83c94cb017d8a26f2c980b7644dbf1981aa2ff2b5dba720658f2708676642e80eb1ca6ff4509d8df1e013c622646bf77283a342f98450a4e9f1363b0a3a7cf7b80d307bc7f904bf2207e63de206fdf225cf393959d397e8e30a1bd063f7d197ec2ff2969fba259817ed9c73e4cd804bc43f69ec4300d9db04269d03b2c7f289a3fbc65cf84dc96087069faa1d27a71825fd2c56c59c531d5dfa231372c2ba4871f3c17dcf7f82e35a4c17326eb696859c0d3e32e8f49a32580d08a037908f88824c338a7ed2dda36079e435e238c2648b282ce971ae9cf3b5ef9e7d11d0ee0f161c726ee3ef547f57226ebde3409d2343ef7bda5de655c26a36cff1c2ebe97ae11b4f09a8ff7f3787be6fa42dd99c20b68509959eba0103fbc3cd0b85fcda59695747660930e71cfd17f52026429be673076b6e906c8137b556aeceb1bdabf7fdc17731fbbb8600dbf2f663ee7a977cdc7ac9d806a7e5115a8cfb22372a5ea66912baa88f2cc816a7801fe481d6509f007a8567953089b131df0b77707fa33682735917cdf7bbbdd15e8a9f9178f9eb0d98f1c5d7253620254103e407edae0d518be79e2542236a1929be3ed1db6e80e8ed27b349e93e816696a49916274233abdc25e583abf54abbcd7fcb2aa5b84bdd4a1b928be84251763fcf57471a851fa933a866d9c717cb49dd79704c8a17aae5f23dad3c03060e1f1a15a9aa8d425cf7ff15c371ae29f7a65c79bb6735645dcb2457405975dc2193a17c361a336672e9ab5852bb8c643e73133d8c541068ceebd3264955c86d82e0cea063be16a27e01fcc0ffeecf0776b1028a601f0d286cc2c7ebb077a284d1a9b858e750024ff51bfab29629cbed7024dc7cbd069486d8e728a2766208028053d9255d1b0919cdd9a9a22115508a8a7a742dcffdb1bcd54f17a53687ba5c06adcb2f422e3daa181c661909c2ff0a0c6a4c8394863e81f959ce80f0462a04f0b1fc589e517faf0b21ff51a55b24c88fd0c70f575b05027e78141f444ee24ca8821e27a3759f047dd60845cb07337c28d97ccbe8f4b878937da77ecb135cd0b975df8e41bdfa6bfafd50d52ab64ba7cf208acfe7e899d5b733726a7f138f3e385151fd80c79b1a8e530b16374e437c8bcaaf4302c35e2e8a08a0f6d56d822a81bd7a375c2fdeeed844f2f08250e2a1e21c28faedb20bd3bef37aa41292166a077e905ea7dc963cb002c8f8f8797405ac117e6a85296c6bd696b712555cb5f6b08753badabf6e6cd8a180d1d7ff4cfc3305847655dba6f86e63a94b0d305fbdca5f76d2e47a9a71a4e5d0543eb84b52f7e5f72d63eb798e3db4142f3b6a813b48ea07ed2650048316a968aab17b3f88de9b1bf31b6cb589014980860312751de6646772a7de7810e7c384fe0cf691ebef9e755280f2ebbe83ee0f91edfb9d606175dd5ba3afff4e1a973a0040da960ea1d6132b2d02e5e15599aaee96345ba18e2a5c2040777f9a6b8e5b5983778ff64a2f429e24fecd70dc17d3b0ccfbcfa1f6906e0241580ed52beae68adb287003b38b6d5a876a72d7fd2115e8bce66224437d05817dd9aa4e4e8b184917fb91127809e2f1f7b0f8305834f7bccda695428170040b0040202909d7e23e3ae28a06f38505a860a6a6d7b329a8f88b48e4eb14121017471484d1380ce43dc2393846846347411741beaed5441cd711e32ec06550722fd7c2e34606a17b37da567757ada31521b130d7d68c3d8c72a3a7923d052900aebdf7092a25880e58c7c0570f5e25499afe3205432500ef9394a4470a05a128304fc094c6ea14765a615c76129065a25bd42a52c70bb2052149035d44dbb27eb849ccd0ec4baa88222ba097fcf3dd06481591e418df18b4615048a3c1f6bd7b731d705f71539dd6bf7844ace455d16ba46bf984c5198fea58ef4e885f35bbe14ad79093a0c2fe031b84156d44dbcf0b9a50125f5342e1923ac038ad3e2c33baed7425d0200e4632e4ab098b855cf27b421d153ca006a5b454760e35b16944c77fa8649fa625ccd7a029772c0db051614f1a2e843132862bd5673a79537c1ae2a5cda1b23498e8d0b4c29d033cdbd7a426c1c44f3219220e3829fa4be0be07fdbe206d5392fda5ec97510be25ce457db8adcf6da9f25c5e8ad5fb6f7038191faa05952b06cb6dc2fb738f2d1998f46d9a425f79c7ba6436891741d1110f26252b37f7c32bdda896d39c8dddf5c69cb332958513ff6cc8844e3ac608770e6b3b0b7f1efecef90fe61a92ff3e932e91046f398a060101ff73deeb5832722a521f6383fda09cc158200eb0a8d1dddb146d16090516af44240a8eabeb36ae9f61094c3725d08e958c91da04ebc23524d0c82c69649194864c860c34b0b61ceba813f849cc0818d8423d3278799d874839da961552928889aea34aea06e63220f1a4f6a4c2bd241115cd25d61a078b401d9228dd6ab12986c8a864f1a574103eda1e730005ea4852d3fc0c353bdea272bba9bba6278097b296e489dca86208664b15da4808d0a11585031017250d885ae94118ab6056622d37fa4089f8a0500c48bee72b5203e12a41db928378a9e7906250cebcc784728004fa88c1e45913d9b11e030e9bf76adb05d12e0ac24dbd4fd694fd74a889ee24333b0236813eb239147f0a92bd1ff4954a4d088ca98f9d9016359229829a4ebc135194bece23756a3cdce90bc0a5055387200a5feb0d2454ec9ddd0dc29d32a897f43e5d4fecd7f116d5db3ddf994e01bc74d4049f24e461bf7e2a9b02eb6c1bd8671b940b364898ca36b857b011a0531641972a2e22afc1be47307af6457352828263e829ce94488e152d7bec4112140be0a5ea2779820f25540679480b82db28a951cf3dd5c9695d556420adf3048a40995c7320e283c9794569488a9c41f1811213e60715c91433c45d4a22a12b235e2cff6ab17ba95d6e4b70e19be266d9d08cd4b1e830668a54710a9222d75cfc983041cca5e4c92501eea41480e782b3d595e071943daa839e1e9c031994e42183c3dca97f187646feb878996386f86d89045c8118a31b123c4899949e4820a8131ab04e05acb74ab154aa1124069e1929f62d026757d08fdd6f7b3b59f81a8db90e4c3ebfc1099554fda31e261d4afe01221e20c9e197da0dedd099e411e162a898ccc0b59b30bc2bc973c98829cc04e8b3328b5949f67901e34b90fe1c50570918be2231764ada9daad4b03c3a7f48a29be45cf649ca8c14e607ac31c4a1e00202d3f12f05d4061ecd0d50b460f2bdad083dac08faafa0bda998bd51e1fd5ac5f07eaa68052ec0923ade6031939f70a27ef371eaffc29bc784302e04369a8eee31319787f42aee136484045d104c066b9e5609d5b44c58dadf4315d4b44cb8a4f784189d13a636cc0f9679fc71f6d2189d8db67f6e7aa962d7e09d091a7aa2c21fad8629fe506da6da4ba5fca1c2ccfb413599e3f7ca3201176205f466da1f2ac9041f576bbc949882e9d4c75cf6631599f9a7ea66ea0f2bcfc42e8d5569c8fcff553073ffac7a26ebe10aecc10affabc24cf596583e6d4cfb673532fbb7aa66e607abcf447f57cb2cbfaf10137d15cb497326fab84a66f879f598fac74a32f947d566ca1fab9da97a4d4575dd160b6ba41953fea362e6faa18acce073f532e5879560e21eade2ce5eae2817c2723268c094fd5dc12f569e69eede7673ec79c51cdeea46163ca1042ce21b1f799a98f1cf8a6472571bdeb4fdac70d736bd9165267b82c4fce223497b26fab9ba4ce8f8e636733f2bd2f90d6d70c9244c70f13dfd1875b9e105259b0485a29b89f6a142f64785ff5a0133fe404577e6f1bd4a19c8ae8de8f3f93b10be04032c7d6212acb7eb2c4acb9be6623bbb149435dccde9cb8af8b8a24ca087d630b266e399a99bff6d4ca524621bb0342557cab2cbc1e4e11bc218134b69bc486ad2552ec46acc2e6903040cc7de78c0f2469cd11e19b83e062398153dce720baf910302280cb921efb40a81510dd705928eb45351548f5fba2c540600f04403a27182b4289d905314cd100706ac3026512a867ea457885456209dbb064d52587c5b094b3c4062c08f7228c32d609116b4a7bacc510ac8f48d00c229c222da216202eb06b6b11a93b30f4579e13874c0be640f9224a0307c17cea80ef4d3ce9228027d8266d66981f9d024c6075d3b84820ab6cc7225f38fc237930a61fe736a35221f4e446d581e9dbb5ae8a732523c07c05d32d3af268c4515843fd7c4495138799ea2e34d286a0411dbf6d7c6ae6cffb8eac76d7cf8b687ee3ec7f687b57e68e7736f3d74eb43f63f57f3435b3e7cef39371fb2fdc3ba3d37c4cd07e711897fa181f1154a387e4d9c148593e789f48c9122170e18de5879a95c7026adb7c5bce8a5d489e80e04ccf9d3445d4860f035b599b8882d27b97c7c53ca2810b1d34168c60a0d581e95ce520ae8940600b302e9ac6b28b1622d41db105cc62fb5140a0600b8948cc0359831ba23912da02f74209d53488b6b83144bbc97bacf510ac8f48d006105e1a0eb6922c3b2af5299a5694404e726802a6e004a881efce312dc0e48d78efa3893f8ba9ec26528ed6959f05aea41c80075085a081918662fee8da92382415109d70862689002d942cad77427a6c663a629db9bfc286e8ca27756f83e59e16ef7612142f4caa42f57ca34f6bfe2faba427bb0c23faa30d3ec6145ef5305ee6f45febc3226dcc3cafc7a554c739f15f9fbaa98d057b151ec1f3ddeba6e86bdafa01e6ea6ecbdc49c1b06ce1eaf1c596ff8ca47aebf4d4d1fa8b29879ef84de7e3d560c7a8669f4f4f25ea93a6d997501db2f6d7016cf7876cc0d2c92e5032b5c33dc886d5b8e574f4f03fdd44b34998f43c91381b79ffa4b92b898208d58981057b2e945ea5fdedf546ce685da1bba8106222ad8813dc8972bf18610db085ea2642a98089a28af7d840ae22b9ec0b99a2d69a4c11cdc76e79ca1dddcaa82a35299f3472beec90cd767531dc851e4e1cafcb02a84104d94a1bb3432944ad7a8cb4919e3a52dad9abbe970005519170de8995d82c5c012f40530df0e40baae7b0448d77fc1fad1d137b24dd7ff5cefaf7359bcd29547623fbae2036c3fba18a8c78b29dac03fa311fae140d6adf68ea36ffbbe3f28e944ad9be8bf2efff6e7252508e07e8fe207fdd00d014355f1604899cd57b077d4f3d98a7632e423c54e0270b6180b379c2ea0d674d37d54e89fc1454b89f779513b521594f5ed369d9baecd5880aeddb6d72eb2d8671eccd9f54e635d5d9479c53e1b4e8d381019fe8ee7ca3a6ac50503e8a68b31eba03324ae36b09516512c452f005d56afda606a9ba45140a0ddd529794b0896b2c45e0c232e7f029ccf042a18fba2561040cb88d201e332d72fcf33a7a7b656bb4d8000740ec792c193711f8f18a2f7c8627cab599636ad4d93fd7e646fb2b96d5fd8ec6adf387d4daf78b9570054c11ca34f8f08e851ef92457d63c83ab6c3af7688369d02310a020a180aa530efbe1a9b8cda6aa6a984fb6f5ba6920ea652900edfa633945913c9cb644913e98a575b083787562b8f8a0a37914c249b8f494c336366ee889ddc34e3fa6f9a919dcda69771c799343d09d3835236cbefce9b0937fbd8426f1fb68f6b67f25a69b3ace2f9ac561e1559291f63fe1a141f59dee5c6f2081f955a1e44cb0793773910e306bfbe49171f92ca3dc2d8c3ee91821e603a8f5a02543ae4d1ea576decda79aded508f2c3e3f2195b6a547fedfe5c08fea61a447576bc11e80b1b6074d7cd5c6703304ad15f1572dcfad2b386316a4e9e431e5cf039507106a79c0030f2b303c5c303c8a941953c64b192cff7397a99579f29701d255f1300fc4f0800a18682d6ed8edd5eaa5a3936751e7796135281d174c47e7950345a664eab6ce2b07b4d60565de86d96aedbd2daba38d81d6bab00e688b406b5d3aaf1c9da6dd59bb23067758e972b154f7cc1369f6525ef70ce6c93b9ebcb3a38fffb7634b67b3b4a36687bc364f1a955287982cebc0420694ec9e49098234bc0dce3a6a5d1d367f1d747ce9427b6774f84007ea5dc7f04759a0b52e32612e844c1164a69009320716731cf1e4d166eb83923a2a5953296c07253b5af7d3dd467b6b79bae6f0f161cd01448e313efbb6087efdc185c801851c51ded15aeebb5abde408f22e075efc2f9c1c8c39407d757ad702d5b6d957964ddc8f386f469eac65cb23e308035aeb9ab96f4f1c56fe7fdf4e1c289950111c64dec1e1e57f111c57de8133a4592482e3c99f47fbc69837bebca1e50d9c379ebc5184e5869723954ed1d6a11b3837726616d7f214c784f9c764f918efdad9187974416bc7dc2c38db69438c9036b2882c1aab0d5c1b32bcc34792d86c330ce78686b09b3c5a9d3c451c36e4ff35c80859a3cbff35b07c0d19ecfb3e9608ae61f3bf4ba2861b5d0ebc754b67c9cdadab1a567e355cb63ad5407569d49196c60bd2b072b3350da134404063cbbb99f564aaf194c99cadce7badcccd507678de84a0e1fdd7ce662d2f951f1a36efce2053833a43cb3b95cde3b462c65694a93a7486f8d3267806ea97b6aaaf4b8c98dc39315d9e6d1583450c93bfc34119695b47b4768abc1baac201141cf4a54d109c3910540ddd808bbd81ec06a7ae6b6ca4adce8b92f427cf1aa6526a98de6036ebe4e02c8f0db41c771bb8fedbc0a6abe2b50d80d4fee851c3720dc65c2b86b40661603cc5fea8c0aa18e5d0da29924da8541a7e77dad86c66319d597b4533c8fc6674f9cd304334439e0692065174aa0fa4b5d747611f85d1600a0d50fff7cd3233504157c5cbc16022a4ae4ba63ed66a45d369c954504e182ac2a06460860c222003da73754776d5cafae6020c21c9810d5a8ca4ce0ea5602c0318b26c0ce5cd067d8d47580cd4f89728c159a2042728065dfe1838200653ba18b00083316070c53b3cf1a5a9bad299ec7aec618a56e672ee2bf6adbd60600506ae570a039b97010625bd6bbd3286ca9852a7ac8cd4ffee6b71be600c212fc0a2aa2f78f27747b7b1acd7056584b8800c171cb9402877735fdc4760e3f008b438f575e73aef1c6932db5a938d465d83b159af15c3ce1253212ec06941b675d6c4d997365d2d90e26f410f984aa3d5ead58222bf60dcd0d1c9c177b4b11a8d7685d1a64b47a6da076a24ce0ecac1a9018acd9525534c4671762de309b60fd4080c0bc0a096e67959908505f43af3360b80fc1d56653c672ba06205525660f36ac5517635599e5f6ddb9da14c61cfe8f3ec4ce2dcbc81730541fe4e055ffe2a8964a7825a0acfdb3115d878d95632c4bc23c30264d4fe6e764886cdffda3d461921637ce0ef64b38364a5aa3ac26c1e033746d01830b40fd4a84647e79543ab143787bed679e5e436d289225339c0b2058db205711be5daa623531f4ba63adb283a393db976a8e3faa60573537c7dacdc461fad41d9a39f1c5947d199cd16ca917594cfb6be7ce9d27df982fa3b5bbb35964d6ed8dec42873045722307f2ab4b9ce9a6b470c2c170387bf29c613318afcfb661864427ac3f8f28bf3868584a105f7308afada8a3b174610304800064ee2d9b773a849ab3425ab05a3c85f2dcd1ffde28b5f36f9a2892f5c9e37654d2e86aae159437d1124e68578a35e5c79c18b9a174fee85fcbd0012623ad4c59877a1e51d3ef2f0cc5e4f7621857011a64b496b33c84515f4ba721d3ba457ecca85f89f0b5757c5e302064cbf9e212f585c263837f35e7957c5f3127bc6d655cb548a97229d48a4b22dd9e404606a345a3b019613d4feeeeb98ec043dddd7b541d807dba2ccb7f8d255f1b6c0b2050bb65a6d61c4046c5cc786e7cb0459fe1e13b86e1f759575ca4c60a3459877f3ab4d8b69d1e5d3c23bd6a2c8d7452528c197125cf9a6ac56361e8594c0f54f1c3a9c2d1b9e5990f9b3f0f267c942cc22482797e96a95cbb4c34933c5fd90000b095ceffa88e2579732ffbb7891fd74b1f209e9c2640465422bcbb6f68c40cbb5b31178ff3f6b424660d37939592dd71d1180e92c0229fe7722104f712260226bae45494c553d9b180b2cb0c0c2ca8fc594ae8a07c3820916458470e1e2854b96ca45e4c2e40a317f4d2e7645972bae5c21c1595fabd5eb0a54c7b2a28cadddacf062c5954b2b3c6ab342fe9da5b90a305d155ade5521ceaa78f22a8a6c11f36e4b976e4bed790b934eda64ad2d0f81172121c0e142f0e4bf21286269d582004c4773750704582a083c1030e972590c6d3210fc0351cc990d3ff0530106d6d552b1e5362ab050e15161f33a4519d81465e8609d90be746a5077821356a94e4a84944ca5642af5b16cb2795f3a194b7c64065aa5305ca5e1a5b33bf6541a564b3195f5f7597aa7d857ac1d66d9ac0dab34a4551ade8f059b3a3aaf9c06c5f19523eb281d102fb3b5034528389bd9d48e14623aef6379b7ae5278f9dfc9cf470a255e6d2b8825850bff63f9ceaed50661b896c728c844918247a1e5761456feae1645501440ec111463baafa1f80205960b45ad83425a324f7891c91a3f61e55d3fe1b2b98f769e00f2738003300e4ce180ec9c18f3ce864e7cf9efc40f4ea0de89b36f1dbdd487bb966de79a136f22ccdf4496f1ab56d604ee4d04e1da58da66d8d54a9b6513a8fffdcd7003659e6d940d84f97f70ca0d6ce9368093ad0d04f5d106a49630efbe6b67b3a9258b162bff3d2db44ab196204c88f9df327acb92092d0769387e4c884c40b98e4e0dcf9a68af0b04670f6bd65703e235f04403456036f7d11264ba2ade125ffe53d0269b606c892cff12de7f7a2d0f33842d015b02c82fe69f372bd1e557024b1d95f09478a2444e563b0372e426cecd9a475bef983bdb283205ce4cc52993e9d86456e85a7a5d3ab8b38d62a384234ac707574b73b3b38d929b1528631b3483656c6b3aaf1c16ae96528c1bcf98ac6d33574b290cf7fb26139c9b5a6e98cdb0893f59e76014766917c3f2ac333831ecb678b3f5036dbd59d80d374a94e05c7ceb4afbbada254a7070660d33c1b981e1b46d82b11a9eb5db226c89121c18ac86670d862b9de3d7174f1ddcd44704d8c76a7a5f1f8535bdf976ae63e7dbb85224be2041440b09171248de799ece2be7de0fecda115f7e84125dae7d746f1fe11d51c4ab469031028cce6504f8ff88f6ac052bbcebc4957e0922dcf8f7186304197f6ce6e953c3f3be401822881148fccf8dc5708c197153012d2a40c53f530022e6ffaeb625bb26b362abb2b5b78667d06a25a3b85714598b46f9daa11f3a1e1f29bb96bf3ab16db66829a64543439fad41b2ab41c9a2a121599471e72924bb6b5f1e286202b45944173174b99279e6daa6c2e5c61d9b31228afc47504e7e52083ea32344163950da8833e39066554893c010036ac81c497cc81c563e648e5a00889870c3899850c2899410e6444aa8e2444a48e2444ab89d48093b9c4809474ea4841f2742021d341c910218f29916f0f8bf809b2410c3f1edc41992ea49d3546a81e68e5cdb602f9086f849420001c1f511e02749e027911a40c59530b76e317145894ac14a65c7b2b832e5b3b2d595205d8fded7f546d49f6d799f69c18e0e2c1304c00663314a8331a60790794988076c91ab6f66f5009fe3dbddd4d0d9a81e40e40134ff650d4ab6cce4800190aefca739090232009392a920a608424b1058644ae2be95cc4d0b225fae70d860db5965e11673d9a71be83f9157b909082e0ff80fc401a9dc3836a630cdf4ebdb23ce9bd1f77d3ba0b5ae0694b9ccd5f9b068144b9c9ab83934455b93950ee54a873a4bc10e7764e71292dd40dd8eace255f1b038e6eec43137ee99aaab953bb21bc825d4d5b2cd8dc445726665903b5204b3c412cf6b29189b19b79d55cf13e7d0cd82cdf3b16a79baaa6dd5f27489f366742d9051b62d7bfb00f6f601bece950e81f336ef5789eced158eb97b28dbd647bb127d7504ad75d56834c8da571e89f2ac85eced05ce3a6b2f8c5ba82b11a6d3f5f5d73f10f1ff3f5009c7dad2f3409b0035eaa4771ec9297b4070f6747594ddd1e2be56d6f748df6cb3abe27db3833c2ab2a6aa785f5391317967aa8ad7e04761d5e6292d8fecaa78b75df685e7fdc1cda118d8b199b291567a3699d89d83ec30bdcd6c57f16c96e258a9112339337263ac52f29b912377884d399b634a712da538e9f5df00377d67fca4205ee9a44718f70516261c14195bdc35fc75138c1bc405e176563659dfe6b8ad71e3e2568574225329e944a6a4d8c9b6353b28db164f0e0447a06c5b5fb6adced4f67f76d351185aa54eb0f0dfd0371df11cdf4e85ad589360b9aa657a331dd1bc502da5e15dad5ee83bf1d0cc5d7be4881cc2d8b6ecacc7668933b635f9c39103201a40078901242b3fa6f8b6ad52a19672547bcaced06ab5e46694370b366eda14430821841042102125ef68251e714b7931c1b9b9d90a0367370d06638273d3b23a61b9da8c63a1cd375b6738e06c7c03cec636e06c1cfe2018ff0f08c0b75badc022e0cc3db381612381ad0a9b14b62c4e2438573225e7ed2e1560828cac423afde2272d80a4800ecbfa487efd4dfc739bf6b5d00bf35082ff21dcc483153c7880072dff4e577beb56b6ad0aa58d7840bdf18b06f19fba8e6b60704dd63997e99d6292d0cabad858cb949624c90a8b39d7649e52944dfa8862534d04a6b945aef0ed54023882a9686bd0c8a08df1cb999542515e5216d1658e065c000d22aca0218122982023ab50d96931f7fa58b93bc1e95304b453c7d907daa093d2f80fbb69d6e52a3c0be2ef7030cd6cffc79b7a079db4597ec6d4b40d607327e513589820a3fa2a7079edcc014aa01125077c93dc30a4d57955954e5583b6dbe10d57ab1b861fdc24bb2659cb5c9752622bca556e2c63df0d4355cccb7fb9a2219e3769f36780e850823d02c562315788e72d96fa6fae3da380ff546e9a5e8ee78df4032901608fb34a69b5fbe8484ba19926093fbe5d1ec318139cce4615fb544d6fc658a4b6230babc96ac7322c5b8b73eda386e1320ca70698edce70c232a6200cd366ec5a599e551c91e61cce5efb8db876489bb726c2300e0c77c7666c5cada88db25ac144a80147e7a665329563b397e775645d47b63bc3498df28cb68444fac2d95b64bfd1e8e56364d4b1c9a36394732d1008ce1e70f6ac5622c0fa83d5fe3e5a835171c244bc5a55fbd910d6b389617956695dadf0929b9b9b9b9b1b9b9b1b98086089121b6ac0b9c9cdba7972727c726033a7639327a76333665f31483c654ef70ccf9a2b89149d29c90e4900d075d1851d0aaa38baae36b4f6de308d7972b57a79b998bc3645d4d130e5d5a0b0b7a3324265e5dd4727ceb6d57d2ddb51a12e4d9199292d7f275fa6d4936aebccb9632038a68248a121cc1d8d689042c395ff261a823c1a8afc1d1231bf0d4713922da73755ca36fb86e4ca9d8d64caf1ac9990e4a65843e648fde85703a6a609293d441837439d4a8756ab57ce8c28e7368b72709607769bb77da046d9d6b038abd1253232a1bcdc5c479809358399505360b0dcd88442f21c5947d1c1cd216c545379640ab43686ca62db60b023ae9cac52b973c47424045bf3accef0e5ef6cb2199b218b0f2fa0966986da5f402dd30c412fa0d60c43ba1750cb82d266b933ab1f2bcf5a795665e8220305de55f12c0c631d26234cb4b947b459e79523c38f18ba749ef7b55793126d46e11083f85f856360f2674b33c500248f1386c9038397ee03290f0c59baafbfc6cd21186a30043119b1c2c83482c20b3330bd80c40bb5ce21e329b45a7d331775b9cee186e357a7ace27954c0599378de449bdb078adb078a675f974d87c92bc786e7cb86679657a6dc669344957957c583d93c4e98c905980b59606d724114a9cd8527ef8c5c08d28298b7d0058c8dd6a7852c7f37d442ed6f61664d2d0471b130a688852eff59c0c2c294ff261698fc9d69051e8c18caccdaeb3232ada04557c533ad70c4bbee19ac7b06ebee994e03b17a060bc70aabe30dc7aac216930a569e4d2ab860fdc15488e1d6dcceb3710a4118a5e0ea810750808202cd3b9b535fdffeaa8d59da8eec1a5bf18ee2d7958613d7d2e6f0762e32c654244be785b75fdeb5d23315c9792d00650240c5df795e4d151da8e8800a6fbf6eddf2427b6712d39a6b51d2b602e00a00109132e0144715fe402b8eaa7bad9c8d658ecd7231225b885821c2e41da6f4ebeb22826b604c43b00cf1fe700893bfcbcd13c8bcf38abc2969df13bc0c994e383aa1d6e5ef04d4a94c8fe9d4a5a3a6d31599aa6fad63d1ff20379dc0ce36ca099b4c5d6c755e936909539037a5d7d97a269334090993034d42a4b84988159310d74d422a0d42c61484cb25085ad114c4ca4d41a69882a46ec521dcb909eb3b632613bebc8a0e295bbb51d141ce9a09564c907f173399605d257cf92f9a4a107320c5d354028f0f4b82a01575640acf1e5ab52e548eaca3d099716c7e5da9e5e1ebaf9a4600f34b2ccf54268e2fd3082ed30827a07013009a00009108799844e0e2bfcd4d2250c024c21393083784a08629040b8420beb362d898d5cddbb44aa7aaabf154a610949880e00048122620e2bb1b9ac2b19982e2494b436a74a90988f4a4cd9e9c5913101308606e02410b08a209041be68f34fd0863869b7e68f9bb9a5a038213257377e63a82f6c8f4a366faf1e4ff8ee9c7ef49d30736307d70e5ef26684d1fecf0dfc7f48189264ccb44a3e5eff0d8437fd3443345665cf398686c0225d090704737650acb8f0432fe130947c060247cb44a3b7bdb8713093e2712a4c575bcd2021c40e1a711f4f8df9d4638815cad56abd30857def569842127a2cd52b4b9c7be6c78be6c1e7700d002d60900405cae2cc00126c8c82a3a4964e2554d7aa452a96895e66e8f3d501fe88dcd5c6fb386bbdbedd68d8196dc60c312b9aa41aeaa782ab9c2b9512231a547df9498d22a55dd3eb2e0ac2d4a70f6a55e9097c159d3c1b161c9cd4d921cb9a21923e9711521c1507220ade5eebc99c66e154f9c432d8f0a6de251562b735f59b5b9b6fd0ced1401c9ae6db6ca54e3d1d616b621c5b9b6e1fe26cfd0e4a1d55ce7804f1f8cf961c8b38de8747503e15eb76ef1e026ae74a8738ea7ab96ceacccd8f674980ec953298e223f95c8e8249777353cbfc95352e293c74a8bb95c8afd0f65ae1d9e4a466e67957587aaa5b9c1f66931f7a2d14bd479b931ac26eb7ce40d43d869860b15a7190cfc05dc41af1f6973eecfb658b4c9739ad911c069868699174e33289c668ad0664ccaafab50914a508024c74fcac14f8a038ed3b9fccf980a61dae4914d6833d69f6dc9d1076dc6a4cd2a4c9bb18c29d8c71107e9cc35b9eac3f53e68fef311033eba9c0ff0367cacb007197b04f1ef91b307cdf5a85d8f13fee3f4e08bbf0741fc373d6062934799d5ca260f2d7f1e3e7904f96f838716fff1c0d9e091fa6a7553864c992d376570ab954d191bce83325cce83fc9f07363b20b30330289b1d60f90e72feeb408c0eb25c072fac832177dc815136770c71478e1d54d8917f3b6c5e871a75f8d401e4a7830b1de0e958818c1a64b490f94e26867f8e39e6f87218ca668e718ed73f07905f0e309723081c399e5c8ee7e08bff09c881d0cbfc717089037c1cf26f430436f860030e366a00c7113741ab151c2b4827b206f5460dfe8696ff6fb8febf71821b61b8a0dcc0b9a1c48d22ab95cd182dffc7dc31afff37e39b316a8cbcd9da46196f03b7e1fdbf69830838b14cb191e547ad56366c786cf8fc6783e6bf1103e6026b40600d1fd6c06b7c6b087dd2640a058253b6460b6a94417151e3891a7f1a5cfe342290462dd7b65cdb506904f97f830608d0d0120134ae87460b8d1d3462f8e50a75861affcf50e2677c674894183450622c204608536d106651626ec4c42086e629d46a457ae327b9f193c6b481032e7060822a70f0040e84f845904e648d5cd5066f166129b942ad5636b279335ead669e9f38362ec5710330c7b7fb58330bab96d671b5fa58b54ca55ca2d6677b7eecac1205b9ae386f46b9d2214c670e3bb3c2ce2c1ffbfa1a43f958d5aa7059458302cca0063320e3f5f58831cbe7a33c451fe5717d9467063d0326b28fc6c224f1519edbacbd707308a4c9293b0652dbcc95d5e5a6dd7cfb56eb4fda51862b1dca33ca53e950479ba9ae95b6708a9846632c71c48d274ff7d118c6f6caa60d436b6714a8f36c25026201c9d977266b0be1e65097eb31b7acf4084d269b299c0367188e46b2ab4175f8a3311b2f66ab95b9580a7bb8fe5a9439b0f19d2296cdbe163c9a46b29358ba7a321e7d70dbe6d0f702aa505c1fe5f9c9b6956d2b8b506e56c8dad74779689447b502a11530f90a30ad2ad062ea526feaf2ddd4e500377529fa0f4404238ab8c9082b371981bbc9881e6e32c2769311df4d461ce026235c371921f4ffc70fe44716432208a14c93220f40c3043ccc18e305680c0c74908132f54008270200706284c889f9ff18b238b9f2ff24115cf1938efe032161f11fdf4e86699844866938c6165aa55986f602759eb23ade1927ad21a11c08108403d08f4f0fcf4e1f7df431e4849349481f414c28a18f99590a703f0ac078876fd72818e197ab2f6cbc06d5c6172daff64bfd32a5937952db9727353c7e8141ae8a868632ae47a2ca022a8ad2b1c93343c5b0428c25fe37ebab7d64afab7d3e17d187c3798dba8e552ac3b1cb75cedb47b65a6b64edebeb6c5bb44aad8f6dd9ea2cb2d55954a1003163e500a62fb6f8c190e2af968ab36b7205068a0223a892d8ace5691fa8116dba70bff0ed6ec0d5aabcd8e2c510bf6cd1cab0cca091ac8f60b6d9b7d50a576b9b2d457eac5c6e2353175f1747ba98f21b865ddcd005935faeaebdb7ab5081dd3084897866ad0cc6e2020b2eb27031045051944a27e832faea4eced5552bc79d9903c13b5a03c80e8f79de298a532241d23cb2c3366b6b72da8c69961d5187d6e8b3160710dcf9fae8336d91c671ae6d503a9cca8d673bb2f3745e391fcbf3e4cc4eb9e3f52893cd58639bf28ae64dcee894d75ed1e6fe28f87d34046bb4d15e098273d6e36d4776366bca4204594c918510590051235152ae8a6415b9a2924455461636ff5fc8811483ef2771215df167109c3d20387b48b0632281fc5ba8c3e9f3630465c7258d76a4cfcf6be7a7e8257f78a490104b8a34fa19da69491c5a44429288e8253b0c82537654464111d7606c7e5030ebc32c2090e86b28b96d32fa9a79fa147d2cd308625446f0caacaf3bcf93b5fb1a678ab3318b8364d7329a6593870e2959229d481e9ac38d44226d4a96dc64df6438623c439ab194b2f1eb8b6dd861c98dcc538ae1c8834dc91269b311235d932a709cd12ab5f526ceb00367c6597a32d8d8dc8436dd8d273b6fd6d7935738715ce95017cb3d3b8c5d5ffde99b9ba1a5347736d9048dc2b1d5616cc559e3514919b1c926888dbc8efaba8efaba300ec7568d675fb78f6c8f87baedc2dd3e5023dc1ceaf091a6e2d877369951d93769b1acc966ee26596c9bec9b4a0d75b936f1682d7331b0afa442072a5e125331c29b4c01e6ff1454bcd2e814b8ff53184de1e3013d3225d1e0012f3e2c9903a71168adab5ada03ceaeb695ad2dbacd225c0ef16af559597f764831e66f29b69042f502c1d983afed866487f465935990a7ab99d9934995bcf13c9927716ca4d1193da2378334366316db6416fce1d9e1a1cddb473eddf8d964f4c62c96f6cb81194f30cf6c41dc219db8feea6c9bb519b78c629acdb2699e3715a6551b9b9b1dd9d5349e9e276d1e6d0e45a3339aea9851ce623ac5d082f26683c4316524bb1a7c6356e2e84cb4336bab14afe57937aa96275339e5c1aaf564a598d600154591531ea9f6abf44ed18a60533bbb2dca19ad994d94ccbd64979b364beb5c3d234f358548cacbb36929f2265354568964e705bd7068fd08c15ead9f211c7e8c602d22d6ab074ad1cba845d4032bfaf16941f1425aaba4c86e36b3aafee6cd72b694a2964b76f866ab4d55a995a9264ee5eec4b78fbe29ebaca580645783c196d74641545f396f1ff5cdd6640acb684d9c9766b398bbb24a0db033345a2aa3e00c65b5477006c6c24993d7ce5e442df932823294cbf48eb2369230c80e09926b23c3754fcb445ac37d6080498944a2c0ff192b763a4623d0f8f611ad639e362cd901475e40a893b6d25824304837a0d293b699bdbec9263459694d66c51f12195d2ef76c623cafec66c392b1abb56149f7750c8f3c7c73477678d656b44aeb9d524a422421742f6310e3dbad561debd88c59c05e5569928e4d1e248a4e03e50832ff6b52b9b6a14c4768f15f665b736ddb62025f7e5215219842488a2302ae99a7cf6af5f2569e9773aadb2e9e2ec2ab954745d61a94c4542696b7aeb08cc71026479b1b6dced379e5a4fa8e5936de7ab39fc434867ba98ac409b6122512d3db39374f6764c488c4734a1c52d9795e6e3c7b26bfee589e478ecc2cebd96d3caaecaab3ad12676faf6a4749abd4f35eb2c332ec5a06c39e797eb24cc71e3c5ca9e7f5f56a640ae5c999eda3d4eddaadbb591053710ee1ce13cb1c288614e329e22379caa8271b8ff98814d9d9489b5344b2cb79369992fe488f4ae3aee27954640dca2e17935deadad4e7c970f6cd581c65d5f6ed504633b69536e967ad3853cda40fce40ac797f68d5de9b8ca8261b87ac7d7d5d6934375d3d5f8f40b6d939f0ce9f4b43040f3f01a510840d3f659c82f84f7702c20112d3d467bbf666935930890a88151a20a60155346003a7060891ca382879d6fa3a9cad0e67056d2ccc1975ab93f88808d4aa23386d9d291f967c01b53860c509f9759eb14ed0e305c802c87c015680382d20c8cc185a42a0009b5f0502cccbabfcf483eb3f1f0948e30d946ba0ceb9d8ddf9fafbba6e76cf5461ae4776337b5bccb6957382e48fc97c38fa92768518b4d6859be1572d4fa56198c7f14d889b61187e3defcf2957f31a60ac13ce02d98a18a4b942790f6e74fcc3b9b669c135dc7afe9bd3ed74846fc7c2210b1ce57c860583afd21c88388d3eaa31f3718c4393f3d720387b3adb166681a014109c154ad366c8eaebaa50be1b5c38980b167a116bccec5c8f4453e62b898145a88718f0ed41b435046d3c509ada4f43fb69663f4dd3503906b8fc4fc20afd453d1506c71d187b499148e44bd2206553b26cc6d6d664df8cf598eabadcbce5c4d1e65216f3c8ee2eb91925a661387be6751e95b9c3194876b2cbddc993c35910a4d9284a6e82ed03c666bed628db166e0ed9db0798a9c9312aa2766fddc24098d651de16716ac8b5ada606859a591aa40df5769ee0ccc9f0cd0a59dc1ca2557b6dabb26e7f976846944722a35b0359fb6a61dbfada04ab191b714e043f1b8619e2797c3138408b1901c85e9f241e23373fc5640a312da68b89233fc512e01345ec49f7d1d813a798bd499c6696f7d169ea8067849439c220387bae840781f3849d59b98d768c8a721bf518f584b35f5fb5b7c9e3c3ca34a4425d976b5bf7e51ccf6d9711237536b6f99b9d8c762e49c3b1e2b031ad3501bbd6b64967aece06a7d10d3bb3721b1519e1e6d0d7369915aa50be3eb2d7b69a56ed9532c3801bba1031c00a277421bd30a5a804526a202505ff6bfb60fb029da430406657632895f575b6ad1dc01125cc4f513ef0ff1425caff9343f5517b8d478a9b8236dbcaca1f8824d796f545e2c3da911d96332b8de4c6466a688ce26a451cda6a655d292ae3aeab49c9d588bb6848092757eaa4202b1d7e9a0f37952b303bb49a7cde8c03c1d93342b10288f77c932797c5f0e7350c05b1dd19f69d61828a93840805bd70ca018c08760d761b268bd9aec53c489b73b82a950a9cc16a936200cfc58900404a2c9c581cf8e1ef1cee4e0eae2024da96a4cf021ce21069aee119245291be6a8b44f61b8d667a7010b2df8849358cf9f3ac2601c1ff02fc0414c4e967023f43c82b9260828cac020395cff4e987e8e443830f7c887c06a0cab31e564fd7b3c2ff138f12279e089c47e87265effdf969a64703a3c14283811d0ddc548b7980f5771b3706678f1704c71dee03c51dbb3355fc77fdf42404bfcd5abef58eb15c69e8e40d9afbfa7b9c9a6cf95fe53f101a1dfeff343e54ea8e0fa7d5082c985cd11cc000ffe9069aff0d830d8102f62150147d08144f3e040ad5874091c2874011c2873c91c7873c31c7873c91c6873cf1820f79028c0f79628a0f7942cb873c51810f79c2011ff28402fe8370326184144068ddba7e90811faa0ea994131d27b206f751549eb5d0aae812e5590b492965d5010112f75158d3be86fdb821841f403ec003054e726890b5c1920d686a40a344ac8892116c6d2d4adc489574e2a4d635edeb224e36a4c41af241c0c009478de3dbe53459a16e6042230092a559a2448dfff7a71b2fa265420365e0da95b44a69b4197bec53b4e24cd07ff0279b2dbf6188a38ad9645d270b435a7b2f6f86f1d8411c32fb852e37665428a1bb434673cf334e1d11c7b9b6ddc81c945fc9cc13627e1790f929eeb7418b3f851d7e1292dc06128ea606d2016870fed708912795cf6f3a9bee4685a3373f8dcd4f93e4a7e97e1ad54f93fa6968f84f4383e475fc76a48630e11f98f03ffc89063d40b065204c71a22101343527e1fc77c04f48a47812718634289a2334339cb44314d29218664c98912f492919b5414ac109257442a13e53e674240a954a95e4d6f4e8f611d18c28ecccc24dedeb63cdfb8367440ddaa20af6e08be7fdc133a28f655ff86b0b1465de9fca9a11cd8866445f0fdde019d1edcfe8f5099c64f061c0b1fc595c8c43b1c32906f03f1e9ff931c329062028793bdb23199be17f6c660b2e66ba98e9828b8e36c6e4a4b54cafa581537a3f423c3b413d3b3f452d287bccf4710309491f1e0ea4e99d640b3a0924d9fecb7e32228f6fd7e4bf1590063bbd9080d79908cc306066088cad586122c986a4e4249b936c42567beca1b19c9dbc758a463f4909e5e40216ff379e5c005da8fd0d7e2c11376dbafe5329210414b880a3820fc81b0d64c08686150029a34200c2c8020051061c133320f1ff2c2c2183f8d38f283ffd70f2d38f1a7efa21c34f3f54f8e9c70828fc229851e52633826e32c3869bcc30729319a69b68a0c77fd309ed03c535f7c16aeefb495cd0e0b033adb9af8482ff34a52f176d3eb12083e329645f27168448604e2c00f1e2a71572eab460ac24c65f0ae384dc91ec2f81f197be18a185eff0930a2810022d1b64f137f8d559933fa59000d7298527a7146c4a5e7839a52076f197b8f84b5efed20948574a5b944c70d2cf0985389e2fad6af1794e087142c106df0eaca941655ce72ee33a5583427538f16ad595d2eacf67ae0831e39d8a303915a1f9acafedda1b482bcd5afca51264f19748d0e52f8d40047f090b2e7fe90a2bfe52155bfe520840f0973e40c55f9ac2037fa90352fca528a0f84b4f70e02f39d1c45fda8096bfc48406fed2124afca50c60e02f5d20cb5f4ac2027f098923fe921115f84b14c0f2978a98c05f226288bf248404fe5204aefc25083ce02f392088bf044403fe1203acfca50528e02ffd9080bf84001ffe520ef7976e477f69cc7f09dfbfd483f8976cfd4b21f8976c3cfc255afb4bb4d95feaef2fc9627f697a7f09b6c35faaa2c35fa27280bf6480297f494a94bf04e5f5978c8afe52015c7f89a8f5978684fe520e0428b182fe120e407fe9c7e72ff5f0fca59d277f69003a7fc949ce5f6ab2fa4b3730f94b0258f29794d8f0976ac0f94b37367f2949f79754a9bf440392bf5483fa4b4766f84b32c4f0976030f2975e907fc985120b2bfc251552f84b2814f94b0120f297869cf0974ea6bf2424c85f32a184bf44c2087f090022944200f29740f8f1973ea0f94b25d25f9a2991fae0e327eda1c74fea411e3f098f323f89073bf8493ab8e327d951c74fa2834c09349460c229ab34a8d4f316fb2a788866040080008000d310603030281a0b86c311915c382cce011480015ca662a2604a960a93204621040d410608180000000100811031dc8cb207b9e67caf7dfd131f251f071a37d4b5b4b159ab6088e53238ada2392b2069fc0810a0e3f1a6d7cc9d3667bcc54034fcca1d7bd321116a8191ab4f7b9a6d08976056b23f4d0acc4f0f00663eb14b52f61215a76a7861adbbdfefe1867a9281ed9c34b70b23c94ea93d0cbeb781ae3f284b3419137cc7364fc52299d0fe8a6230a96ea57236a270d23268aca0fdb4f7b200599feddf15085a16a306738a4974499465a5523b429da9dbf39b6a6e36d21c79e2edd6e5666e96d6780519d561dd7de0fc25b5f819a5ccf04c4cb6cadd47ea020a0237323c0a7664cd109aeb5c99d1db48dc37782dedef81b93703c9c73d52461c9f6972f4f5030af27c5a6c13accfc136bb70de15adb315810109de1527dd5d008e7735f2759a82f6086a6c2e53184852b61c74a98ff146258fe4a645b84c96f61f56a36da2aea073e83972892d5988d39161836abc0333ef9a3047d7cd69e3e0ef6c692a2d746ac9df7f34b5e8aa31eb9cdb9f6c08ca930866125630e3fed917edee7212c0b0d20edd15362887fb74821cbc840ae3d2a1bd2410230a08362d7377ccab5b6558e2a2cda33306411e79ba3e3a09f43e4dd2435a4428ea3917305bd00d04520a9932af11d12768136295a657f0fb313008e73e2d1c8e89fbc461c4effe15486bb62394c18539385547401add1c6644a6fd0cb0d2272491916ff11eb61f9bf8ee1c8d77559c6da812f328f0a1a8daa47b8973e5dc36e37e0ded029ded51594828ea14593b866f54e8bc600bd9821004dac7d6198143cd2e67d4f5726fb083c49610a164fabe92c0361d90dad2bdcc75c7e1cecb8794cdb7e75ddda03d5b0a6d2a06db389f4d6993677c3609cc766007cc615fe3cb72e7993c87fdd8ccf08003a11c0f558d51dfc32779b082e562766da87fc341647b450ba1cbce3ec201560019e033b5c56591bd8d464fc7492f5d7b0f385d5bc37df20d0394b9321a771d01f8e2ba5aa798205e3a0c8d004d9580048b497e24e21ef00909994cbb4f5eaf88f29af30f4f03bf0f6cf18859f8eea2dd427fe8621d5b9100173be5d4d08f5fa32613c2111a73e5a2a5a3c3b4852f0faecbf332991ec0d19206ca6940968802013f97b1209d5df894e3753e7b83c83cc9bdc39bf151589244137074384ad71c8e8ea85ed96f45492ff5c2941851ff47ee31137aa54198c8787a0aabd89cd941cb0efd161cbc9ccd1c12fb2ec8f800acae3d5d087b87153a63c7064300fdffaa967dfc7f247de94b4a69a3b76e7df52c3df40e6e18ea4263cc9707341c84570fe508bd19a15ce70f546d3330c120845f007765cc5ae6cbdc00046ad6a4c1c4a5b56771322333ff7bc8715f3b7f4221f3f4c76d1fb8e8615bdc032d7cf63572961a3159ef3e5773990ad374af8276902d4dcc9f1f6657b2189ac522c925176c86f1eaf903f2c16aa74edf5310224936d89d274de1c9c62e22ee47af804722aae3b4777668348c9517a03219dada489466e05a865fea0b0f35fbb0ec0aee1ca1240454cb9bb5c83c5051fa76e896be03cf02ae728decfdac3adac6b3242ba041bf9cd5aa53c471025df9046c923fd2fc8de1ccc18d8ac5fe3c93be328ebe4efe965620aec12a1ee6d122fe799b7e911e3a6703c76dfbe93244e9d30002514e6caf9d819abf6b6db3dd230daf98a5475450490aad6c68e15b3b57ff3e13412fe10154f0fa7cbdc3bf30bccfcf4d839dc2c6e4f8e7b79d1b5212a11ba5aa190bac3ab5ef264602f429848062be4fb78787c6aa1e308f478d83976f4757451ad79936f70dc0e4e1ad0bc12deb81e48c88bf85b93cf75f3df563dec7f76a634a2e9756ea4aba5176aa5d89057581c7d2077ed9d4275369c132ad593f6a633d1d55af553ad4f2fbb3098f6cdd37356afd2e93053eb6e8592d72eb8c1d48c6fc438681829eb2533bf7c3f3649c406f0feed64a5ed70a7808b7fe1be883b76f774de72e9c79b6ade08a4763539b1275e88146124909dec6270dc736d2c8740a5b1891f9b893290b1e70964b3901cfb87fc1a69eee90af87563318258460fc40bf9e9a514d590c57e1e4d49407ccee3ca3ff72a93fa611feb4633c7931e39b3abb27be1e28de8cf72b3a77e3e59f5cca0bf22bb1b19eb6ede9f9f7d579783d8464cd278a142f3ed175e3efeaec42e8fe75a75745d4dc3b8d120c5e85a60a181dd43e6d874f228f60d113d570766e3d75a64c798b4c0a49730c178befaa7247688fe8c691d5370c9a5a4ea36442e80069ad85e3f5049a84ffe7814689509bb0ffa79f12a8ab2a25d59f78fc03cd234ff7a31d070754a7ecff2a9f1ad333219ab3092ed7d1f5671cdc728b53a29a7f8bd0e816bf992e0e8ed4078d5a2cbeee9fc268d7ab295c31de22abdc68d18f75cb70101c4e8cccfa269cd01f3c066968725d1ca1aa594c1b78b2a0e2b337660aed183b58986abea05fba9137f70c5755a35f43f233f118b8d0c4a4300900c7b342194fec42cd1c35fc61a68b14c4cc4cef18653549443b302e05a17fdd5be7c43aba5cdc8070f1d3fde70f0694ae760040f0cb7129f557bf5683e90bf2a3313f2d888919e0c13d3431084f9fe863b0160c829e74b712eee61ee048cf54309c45670738b0e07daee47358e137f0725b8ff714c632e03d4da7981214737556334cc80c22de5025859368e36c4444cf8090200377846e8bbcc14a8f68a90c766438dcec3265d62777e9b87fd0d941bd64b27bd9baa73a9b329897ea95ef8d5dbf650edf6fbf01c27ddfec49839536ca96705b85c55e64325ef4d637255c050badafd2b835f47899d577080a119ae5fe86f8f4b767d7caedede41c6288f733935efc150104fdb9107475575e7120e3e99d40038fb0986789cd0e39703826660e6d806fa7e66b2f03b76f9dabce89f02bac01657f4de732de46434a63d10c60b763d391c32a27f6df9ffb4b6220166ebde98656054d8db75f90298a5728f589fa8abdbfef075b3bb2659de63b785260d578279f9d21f8ce31f1bbcd256dade08bc51ff2d4e61300f04630d34a4431f36d8e003f1f77d331d836503d7c70aefb2bb445311246da102692d8405c32db5ef165d3051fea421387383a6327f87b1b059bde93ed3ba19ab90afe6d7f645817570428750383db0b7bc134cf19c7851de7a0da80224cd9e7e9d180c3d16e6c2675b2a032dc274be15234130eb134048f21744cd39ed4cac68d7542656fa3453f7edcbcf58dcc63eca4a25593f1f4b89f783f54f1a17d71f58f994b79c8768e1703c7264a2e1f351643ef2e65206fbea342590a9410dd497894396734ed6062e706f78328328f57a8710e68dfc590112a2c1454234c3490a032a28b4e156642265327af9d8fba26e9a6562705e75e88041260844837cd6630df9bef4fb8d149c1caf436f21b181dc0aaaf7a44004fc385129595e7642d74dc28e06ae675430bc0015f00f7142c06de1c34775860c620fc709a8b3beb258fac7a39c4c6260d095ca0c1ceae808b3cd0a1ecc185824287180ea798d8fdd7490930e6383282e084829d4a563c46f993e273aab42ab19ce86ed1b2803fb690c39c1e0ff15f5a738665748b1b720ef453fc6f6027296edf4e3c25c38cfb73c912430bd24f9e1db883fb5d1718e1776527969322a6940b5302553be7ad0d38b65439c62a60c1fce0d624a9bde9201abbe2383921a14badd2a03e6cda9a7b3613ffe1f98c0af80e01c3c2d33700316ec692998aa0257ba0a28e3db2ebee48a9c6b2e8d34bf4fcdf8517e6a4376b5d7991fda88b4e211563b4637cac372627b332a0bca95a509a02b53ff2da5e23c3f9d3819bd8fc901c1f01089cbf353c7bc81478d1ed23820c50873cfd182091c3a90855fdce96f95a037b372cfcee7cb3f3d1b354e8672e1edcb3732e4d2b6781f0fc3b017dbac9058d8f7ae79180b4fa65f7a89d3db38b18c02d79f3039479ee216175ab670440a7a01aa61542a32db3130e1bf5b47212a54070875d79897e1c4c16fbebee3d9c9efaf095a8f74356ff5fca156de3b9cc021c03fe83779cbc2a62035f7cfa821d13ae85783f2b4ce01d258bf391a270b7fdbcebb1bb34ba129ceeafc8f8dbcd887bc8a7f60b213882fdcae42eb2a3721df0c118e0bf7b19d6b933b54afa690dca1a0b397d92921691dc4f8b7ce47835db46843b7c743e6ffcdc50b6656ed36446333343e18bb9a14e3bcfb14ff775a4d29c6f5f3d0b8c1b41e02e3daf83c5926eba57ebbdb3d1c34b1202638ea75c913fde95c21f5eaa35ba82a4a2e19d86fddd48a81a818ca297a583f916569c81fac6c94c9ac6b8defd222dc17ab32f65b00008535534436d6f70e1d8812f646d8e29325f84fb272cbc320372311ae2ee3b1e3d9efd6ff5de51a72ec19f3985fc7c572911f7b4377bc32d81c0da10a1fa9d610a64840da53ce1552138c3b47f02960e699601098bae6efd8806bb10d249a8b9c9aaf1b163622629fb46de6395ca71d669cab3061e5511d94a17592571dd398cc9b4a8a0d16648b9029380af2d76997e01ec476cc526444d462bc2807c4154793450c1a5341e7d4d2a00259549beb4fb8d1059e1e30097d684c72176a9d2b0d30057d87e382392396abae4a434136a2a7736ac29be4b23d3ebc063f5703a7f058f4566e3e43329024dfea141f6f940b7f9929fafce472a89adb84390df134c984a707f5291f382c3f6729845d1af624330b5f27fba2ddffb46f04968f15e1043c5ac6577af6f405f36da4dd2e980632ea35f4a6316cc39fe44a9c2432fa0fa3c014f2d270de664a6b5b8b539dafce632c092bd97a5aa581a13b3c216e704ac057bdf6d0463de8cd2262461019bc8dfaf31fd079f657905e3404ed6746fbda32d37cc5369f7e80ff109a97a6eed9d424e9ba6f94b7f30997ca52d47aeddfe9f338800d69c342b1b4c102e99db4355017bb1bd05cd2b030e79469f5aab1cee53c6d10fe2ca336a51d7551a2d63dff7e4af84b68acaecd6aad85a26ebc9ea37a98574b7347c705e86325f68705a211c452655f3ad1601afb7bf27a934aa69c1e2cac70987a746f60924c4673994d9aa6126e6a9fa63bee0740e5b97bf9003890a92ce13181e8f72a999be6aa68e12f5e9640c590015a404e246356f946624f75f09501e4a8cab7fd43f7d79d4f8d667eaa3743918bb3a3d01e77867505e65d78945398b44c4d3c78b1e0837ab1f0d5656cdebdd8e13ecb02d740ac3cc6ca87ca8c200f44530e0469b8cb9fe7c20a1525b8c6a03ead5d581e1f2841ead2b1568962df0007048d605d1ea08d1ec16bfe579a99d5745b57d335e8e1b03f944be577a0443f882f800ac4df3f0d77c88b473a012fe908d0409db527d4b2322932181f11e7742d2f5cac4fed3fbd304de9480b92ed8ae96230d85b009460df7003c1bec09ac0081f500aba88a483ce6055d8143a0e02d8573a57af923617916e4af3e711e2c46f1fd177ef0592d3e0d7a6888d0337b4d457a626b45ecbf058fa07c9ac09a36141835920709b6a99879ac726842cc213c12784a7477718fe92fbbe2811b47b9c926b19e2076210fa007d66ed13a60e1fff2d4ebbe66a2f32e6b69b4fb09907e5ce0cce4ff24a48235fbb3f67011e7af78762e0df673f99308b2aab27dfafa7ce1742b67bbd46490e130992e06f52948d82e2c28c413bf347e7dbead023acafe6e2c8c059334c88afbf8b853851a3c4ecc8da4ca75249c25d676cbadca178403c37d02b66d94c69a53c23e9b559193414895ab280c344f4e25515993e97c0f3f85bd5fbfc323e5982234b437c91dd358c458c4f3a065043cfa078e0a59b0da688f58e033ecbd3c4674d7c4d5eacf1022d8ee428950c21bc1aa01831f0ea77e12649214ba82e494f6bbccf471a4aae53e03cb991825b1eebe41ec30d28f3b168887f73fb4728d7464c5486eefb14a2910df45893d4887226a1742d41f2208fa1f42d81d22d7f907ee80a974303b49ac71b18e7a4fe3daa5458ce69e8961fe147238160bbae918d28af219fce99a287ffb4013d0baeec4c6295876e8988d1f808e3a7d8a288144200a53e4a85bf38fc6dd0dba2b52c13d53e51e392dd294c9d59856c8fd8d952f4ff763d0d71b083b6f0e4138148ea29b69a7ccd3e7e4be0b5d117f96637a33ddc444b2025cc4e909f7e136884f19f00b681bcb7e542f8b2050fed5eea2d4d3732f6cfe363c5a40c548f72263d03a0493a004caa57f708646f032509c6480407fdbc0a603011817902f7a8aee3a4b1c375ecef2743bbf2e8449068209cc8f1ab5f7ecb2bddd81ba039e4e3c70069a2c1206aa2f02740fa350c917cd83c4c388c32fb1126dfbed7f1c75c72068eec139972af1acaedf3efd2e644b6b23cb6a0aaaa7e7b2b20c2a6f62a5a65951a098f13ad42cecd88e834b6700e24e6c703b4e12cca0a8abe58280fb02868dc2d7e9b805cab1eb9a289177b6d71dbb6543118c7d629005253e0e94b11cc02b269559b18cb2ff7d9ef8182347d4e2283b5281e2534228a15b29b0ab2d24e38701470a8540bdc34f4c35a2c414b5c93b4105129aa6da4e7f7c24a683219dd08da17430d2e604a8bb5ee0e5d965db330d3bbb657dea34c10fdefe86c7387fd97e42eb0450c07e54bb616e1f6f96a4db17a60b5d4bc5665e41f3868e869948f4368cd1d9ea1c8d17ef336644d4219a6e363f3e276ff485a6682c1c8dbe96325bbb943107f6f01fd00bb5e57d95fb7cba6627ff0498cda1eccf301948e3dc9db786028109c916bcac675788e529248abbb98d6b244fa048a380287a498563102ef1a858866047f281186328120650f730ddfd89cbcd63d7e4f6eda72b05cce0abead6b7af57a327d49a156bd3ff31ab2ccd346b43d6102df9d2156dc1601be94caf0ad6f34f850a33f0bfb60759c8ba25cb939bbdfeb8537d0456fd3eaced1e0d4df2b065f2dfe23af89fd2de4b1abdab4368cf23e4541a47f5b2d1a5239949e8d201fed940f84e15bf16d05bead1f6586aa3fd86a4fe0cf6de60236fc7660b76aee58b536e3959bb305f2ec0407ae01ec7cf0ed9f77ea49186ea6d3fff03d9a6fe14a3455dc888b640ea65e96fdb62180ff110c572835875c99fd5e0a10a6a384736850986fa1dddf5537ede38d6fc739a9a4979b301b645993d4c0ecf84e3b105ca5bd6943d9cecdc3af42550e9de0849f16ba4f73d8e5d9cf12bf99d04b95ec89f91724cce7efd83856e3d8c7a607f50f7f984dd3f5a3b19a463566dcfd1629037062333039cdfcb4a7e4a662e75747925c715196face213f47d33c2a6938132c97849c313bb5e8138ddc4f673606f95b50f40e08662d76ac8ccefaef56259b501f74a33382777f6cddb24ee96437ffe0632e000e85e03dd6e9b730427fb78223c6a6211c1c3a47994272aaf9c1d7509b5115d32d06fd2f30d6409d7ab07cc525531b666cb76e06e6e7173321b7c3a65f3de6a1f4cb22747f12630e2ba4675de69335261c7e4f799f409ee9b920eaf2e369a65a67494567bc26bbc66770ad4d26f7636774f0ae2c540620ab1612767e62265d261ed594d69c0b033aef00a2a9cfe1bdf2115dbf80fca1a478ddb279f1bebd152ff6047d403034e825720ccc3254bce6b4436ddcd74b31bf1c73e6deea0da7a7aeb07e97792196018cebe8ea004971999aa1d766788d24d9e63ce62fb0fff6cbe52c7bcf0a92c557bf4e2f5a4475c3cbceebab3c650e91090c456824cfec2ee0edef935f9d823989ef462c52510514ce19839f2f58e7607e73e717eeba758f3cccf0c6400c3bede65fe9fd213a17836828677ec53199ededd8445107dc1b919608da30f88ed7fd0d98ab08f8718be30803fef8aeddd8c1962049d2c8814508c2aadb48d72c4e6c4bca3de784e9239c95919d1833e8a1b785cf9268fb7a9631041b8fb258ccf5a7a6dae6379810ae266283fb74184cfeb6e6ec44288fa2d00327aa45883d81e2b23cbd0815b2ab53f85dd88dd7b937d14e80fc7bb4ec2378d0783830adffbbf7972573c75f10505fe49a6339978b9ff6c67e1dae7e72b118a6b8a8abd6a6f06f288037c835fc4301561548fd6f67ce41eb1d5e6d02265c9c8334920300369f2b847d75ea261191365bd711783c0b637d7ec31a9385b9e208ab90b0ed963bbda70f61a1e5e3db5b3fdc575dde27abf376f5f4eaaa7f70d50f2d4b30eaeb91146d27fd23c18ab934f2350aeb7c331131979fdf7918178037e6065b05de8be0b754a547819f1dc53ffd347475080dd09fb7cda754a87b1c0cc4663dca4a736a2c8d252e9bed8e855add17abbaf128801a4bdaf0e880ca4e73eaab39f8ec0e5b7dcfdb64a82c81c36c81e5b36a7750e885793a3b8dc0d5d528e358438827dd65d51133e744d617daca30228057ff7e970e2018c5b2a64825f6b68796e9ca0e750774c351a1c6d823ae7699bc7be19d977c916e6e4f2af81511fd3453a63d20c2ad3c51fd6313e3ad8fb03aa977345fd4cba79d302f935bb812a83a3fc83d3028760aa75c35fcff765a3b34b9fd779e62c72e338a528bedee867822a16d6f86d4491e72f1e362d9b4088fd3b90bc5643330df50fc51aa2e939d8d46ccc92fb1da4ea83dc0a55fc9c90db95e2bde8379641eeb732fd2778e38906ceebcadb8c73751d14b8cbe8021f212622fb0a7ef0c969cf5522cdce7825eb046931e4cc524c9eda21a7f2aa55873064dc5906efcc11ad2393310125d04d1289d990511a202e23355f88c34e3c06e69103c9502ce08a9a6e0779c448d9357ba1d8cf0035743cdeba89167585c678bbb0a5fb6d2c2d5575f60bf03a2291d29374427dcf44257f870e3b816f61484156037005669b05bdf0a9c99facb4b850bafc79ce30aedfeeefb3db1ed11efeef11f2e6bc905ba8694812b57e29eb80b714b25f945b913fe8b791e0e7ea45fecbefe9a42dc75a86592f955bcff87b383953c03695d9bda845123e679721c44d5425afc8bfa09e43fd9cd4b3b94c8161e283c4d44d15d96eee410df3a3ae2d86240d8e4c6ff4b06ff38932ab729e5b428a7e372b18216dd6f8793cb5be5adf2bdff3ddaf23439d5445ee03941e20e409fc080c32185366086f0512ee232efd1922e463218b45c9e07621dcded874e62ae3b288e2d897230f9318a8f8c1119fc913e0face88776204e63f6bb439a902ea5f19e94e8640fcc78c32274b00fd8b23b8931478ffa9d1cd090a7cff72e4771202e53f30e2397902ecdf19f14e8cc0fc678d36275540fd2b23ddc91088ff9851e66409a07f7104779202ef3f35ba394181ef5f8efc4e42a0fc07463c274f80fd3b1d90db34c5e408707ec6687d6203bb5f35929f1401cd6f18a54f5820f75b46f0932800f34ba3ef130ddcfdd0e8fd24057c7e61547d0201bedf33a29f1c01cecf18ad4f6c60f7ab7082e057e990fca2f9cc68eec40616be7aa43829033adf30ca9ab040eeb78ce0275100e69746df271ab8fba1d1fb490af8fcc2a8fa04027cbf67443f39029c9f315a9fd8c0ee578de4274540f31b583b69006f3433b1025b5f1de94e8a80fc378c32274c20fd5b23dc491400ffa5d1cf89c65da14f730c7721932500ff4523989314f8fea179b307d9c6df8e696206763e6bb435a901ddaf18c94f8640e607b399f4bf7c440f7cafd01741fe1662d385fa3df592b8d01ec7bee3d984da100420aeac319b5b39dc8634cb649be6b2cf9a14809c1a57c017391eeaf3504127367fe3b5df3c0cf37d0834d9b322841a760170fdda60ac4a2dc888ede59c95bb326377cd5ad1a0e727f07d69befa3208e82649af61b959abcc6dad7c1c4e27399a1695bf9b68bc4bd95960df52b70bb3ecba73f6e65eef28d5ddde3ed07fb3f9c7b43075e965576ab770e9ae29accbfce338d9ab11871c41ccfa5f9f5ae738c399a20d4280913c14f6d7df1f4a749e2ba1c838d715d958dc1ae6fbdd615469b60bd11a4344e4631b134c43e5713e0865d8e6a5d80d8257b1924860ef53632d82e03a8685e03542a8ac8d1fc1153b54c89dd9dc24598bda69906e3a459d3e761f4229bbf626d91a675fa1069d1bdaac424da58d3863343e639cd162ac04da6ed56771aa19ca900ca8078cbf0ad43e266cd5b95e3ae1d486c385e8f31fe505876b09e5129570417032d480ed967d8aa27573c3fff37732c0c670bb3f16995d1ab006973d2fb0ac7722fda586856bc5ec91633cd51d8f553303aaca73a8a81749ad049c4fb675bf31557858b7594cf07ab40eeaffba8cd0cb09b6dca8edfc5ef9ac12f743c5c6c1bf2ad5639e2650409982a67d5e64d134a40c9da9c859bbc75e3456191cf2b69e2167a480199117006bd42b758c95ad94f9605041ad7195af5300161998e898dd511d8d32ebe495a15ee7ccc1f402635a58bcb19436bcbd4f49a0ee114e52603cca546437b46bcc7cc3758132d2950211bb2216dbb4079ce6046d185deb932f404f5487dccbd86bfce13506e6b39fbfa49f5782eb99ec20e937fe79181bd76d609fcc3045803583b632ad33e8615b961b6d0564c591b45110b4b6579868cb204b3f16c48de813c54e7674543a9ac4e2e38c0546f90e1c291c26f2f50074127d57455f858c2d6ad883a87232f196396b4e11c98b18bc8bd6c648032c10c0162d3dda99672be8f0c30876769617ef31267e969b64bdd3f27aceabf2fcfaf2c22f852652b4265d7bae63e9df0dfb075f2a4f494bea418e75f8d62e1fc1d0806ec4232d510adffc047f996be360f55b199d07c0b06310b03220958bf324b274457d130fe2d65d5aabc629a471c5f64503d892f8f4da579eac71f32fdfd9902da0be72e5ad151bbb15c96e3d2671bff1e95134d471a62e6ef5b3e4ef16931d86120b88329ba58b1fe023b85351133a6fd15a7f91e250ba9cf2b84810cd9ba892fa57e6370fef33be22b347c2244412c70b9593aab15269354fd59fa1bd1b8d266cca007fc4c72f1e2a2a972c5015f755a8cc397a7e5bf4df8d589dfd0d51dd3e813e92213af6a67bd7f25bc5e3487ecfdbc7b9ec93cc0196cad34ff52128e8d80901ee0c13560a020d7d6a3f06b8a91b3dc32b87892a2e0697c07609c04e9cfb21c188af7232849cc2f64deb4dfa24192a2e1349f9b7679714177505a2fc5a36773aaf7b193dfdcccc99d30fb8893fa3f1db8ddff9a165f3f9382dfd9687499b1f5564b9930b26f96769f872281a104286b5f967a363b71d0fd83f4bac836888933939fabdc3ad5b18cac6326b23138ac5ee6600a7e711d67620b4ef6cd880555ed1d31161ed862aa10bb3d2b4ca865bcc8bd944728e847555493185758917866449740a4842c7e6fdd104ba0f37006470be077d1ed441f61b64bca852c714146ea7ddfa4f29146d3611db42ebc9fa7257efcbecfc8be9f23bfa6fef0bb9f964278da93e7ad4970b65c67f404be4fb5f582de9dd3e8297cbcd8459d1cf37de3c4c582d9dbfe0e210fdb556191445ef33f82cad653ea3f15d30074dc871eb67393428daa39241f2bf7f3398debfe55f2cfea97ba2a11b6900f1a7d5ffd77c5f2616bd2bcaa9893fb1b1c1737e8947d9cad6036b8d16fd71ec3eaa254272f59d1729d7c245243d1adac81bc57aa1da06fc08057ccfb2d303e9861fe470ae9568039b7fe88cd4b84896526949addce5168ed37b77e5482dd9b7093435fbaad26ff523250c0b2a676ea1f931d2199735b6e20fcc7fc59dac74bc689b79d9a4da49808cded710e2c966920cf27e1760c581f2d1b144ff0779c980f815f5f9ac561416574100c2242b2aba18661fee1f7736715724b20da13b46eaab83b618fb69ff7ecf5bd11afa52825e130aceec3ff91838d6beb7644061796fc3ca9655ed06f847a0df6d030cd2afcc83ec23439088891339db30d7e6f6e001906f4a43f0e2620e2d8291ff47733fa9bf8c8927373aab775103d33776fd21d04763334ab32668748ba2ace4e5f50bde05aae6fc49ba74233bf06dc562fd0c89ae626896fe318e4ffa6606bc3b42f73b253af9f7c0192971d24d7381d97d4dc47ae3c9079a6003f6c47fde554cb91e48b709421f1bad7fe33ed4306a33f0a2a1db69751143f690f7cfee360a7ca86a8179bdee868843247b43cd0fa2f75a3b43681febc10b2c0f2219e13414d86c657c77ffbf6bf4c3a6efec013ff035e6c23227e4e99b0fd907de9b58d02fc2e6ae003388720f66353f6efa8449ae7c0ac18359ef7ebf0c9349100c0c862c6ad2064f1e8ed5342ad701e3ac588595a6881f1ffa81e00ef4e9d82e02d20adf7fecb2614be72dc5b1c874b99fdd89af15853977d45e5cecd9c95ac2555b88039afe852f23ab56214555a46d14ef6bdb8f2c4d0d6bb72caafb0c21c17a3563e79938cde2edc8ace2389ba31a846df4c6bab01ae6d850cb1654d774573c71e3c09be5ce5c1f2214aeb2e6c10b343d9801f3627047f0af6c045cf28fb5dd845f68b247c48836eec19d4e4f7acb073cc38919608f1ca760c2352f13b64f8d4f6e1b0f6fb17f72c6c3fc0ced3b9e9a6a3d2cb34c641f895d3e65abf04bc4072da86f9e33d5fe7a3e0a10d6968804943ea20aed45b0d43dc0eefc3adf63e933f334460f158f731bc1915d79e1293f270d36df780107b2764840a6ca6c569fe8f7aec32c36d73de779c7711823e8e2755bf751bf82c25c9fffced0d79a2f4d03a3f6eebafc73bec394b4a4451ad4073f2f3a4c833f742ed1d21c6fbca6d8c2136363479445bf40d6534a0e027c4058084bd056168f86c3c60692672232ea0b33a7142b05e29a182116d48544f5b7a403fb63c82f07ae56b553b393d084c8400b84c3f4f5e3d0d15651c2457b7c80990852ae836bc8c67911d16603802d6e7e543f0d4477ad989174d895011c597fc56924f0fd4ee6ba651ef8ef8fbb8701b7ad374da677ba2beb7c96edf4dbe4e2b3d3df03d779ea0f7475ebaf7f487f5385f5c8547adc1dcf84fa36e1ba8a0af2851ac63a318d772992345434a89d635528167bdbdbc01db820707e698d1f89a137e1411f924e9e842ff7ceb94bed3935494bf98394d1b5eb25546daa0b3831c585a16a352b41468edee81a811a60b3851325ef62110ab0f8490b971ad4d0e8976589a0f6dd108f1e8fa3702260738734e90525cfb22787cba0bcff47e671e89268631e42450283778ca58c899544d6fb6f167dd90608846f4cc7114b19af5c2391228737c5feec1f1d1051e78c98e538ed3aa498708995ce8ec81e71bc9deb61e79c285b1e351a5175b205b238f2e94ad82c0f8b237ef621db9ea70e7a8ea0a2a66ce0cc92ad524edd25ad52905bca70fe75bf50d995b25617d31760b708f7ab9be267c722f37525801f31cade3e362d6b9d77c8dff400167660e49ada6db68d1eb90b2347c5bad0ac44ba6c6b279a9f90c49a1b3930763401b9d8c8db5b3fd407cfb96872b46ec2485178f6de2b9b441316b9c2230be5e4615d3f9328cc41717907516dd0f39a6fa0e1c85b9b931a36d520200787367a615157c4e8ee1248963c84390c1711759f0d59115ba1b838c981193f9f02966191b344a35df15769eb5d12b6eca768340541c253c7f588c621318bc3a15eb927c59b6a93f84d35d1957d9a9ea7c12759220dcee5a5132383f8a3c6729999eefd4ae99ed80d9c865bcbf403585684b383127587968bc39c3e1623eb32da8a61a63ff82e10ad173211c9b39637e79bb620fe6259afca6eafb8775512431d11be270290b11c3bf1c54e4f445925d2506d8554079f09d3d946e76e20fbbe6a36c8f4a64c6f7ed789978652f938ca59674793edceeadd14b317575c6fe5f0be8fa7bb28d3b4e675d6a16e4b37cf37bd1731f8944d249cdc9e492abde319689e61bf8da4e7cdf8bb67fa1f482daf064af9bccf24e983c9754228de3bada21cdac98706f18940384df099564de95d6451b9b5fa329c59643963a821dc8411fad299831755e55113a304072a57c52172d57c653f8eaf42a7be4683fcb3aa0f86a874cd591a423a14861c9375f9dad4995c0912737bfd8b8c14855e1fd6f85917049890f5f6b32489ebc9fbaa544ca73655efb55bb5fb04d92c97b5c1b6fae9d4386687c2a58f86fd0542d6feb1c45339bd70b16916e5a7950993a849450be2e6760d317f6ae91c4ddb480548cbd629404859b9f69cdd4c296bc832733db2a25af81187dd2f013bfb513db2f853f756252cfdb21ef2c7e96230b0817011f2486322e8ffa522bab945dfb2e9ae382d36f350eccbd1a899a14bf1a9202f8a593d3e37f67cd607b24df58fbbf940568ce838098e74f25d0ac870366e0d6ae095a4e0450847b4085246210422d954a5aaf81d6e858f3d4a26271c3977eeca4e34065b0a8b1cd11074de6e4e3cff49382be38e533d620542420a2afbba90b75916f7ae9ae1b97e7365d80d0998f24a4d6942ab7fa498cc24bbff3e093d7efcf703e991dc66ad5f533c7fafccdc005d04f6faa725ae78588abda3f07b3dc4f73ca4e1318b58c681bef3c505eb1237ad39b20223e045de9592a5b99eb565098010603945168ec87a21c04953b68a7eaba706dd0e01f8da811c8c7b27d2632d0810e814396b23a698f839444963d483033dc4af7190a67457eb54dea712806425feab6425fe94c8ca4a3c0c77723904729bacc47f5bb2124fa214997facc4ff19c57eeba25c5a5a1c39ce6e1753dd4629cbe9d7e9c2559142bc8086c9b9c0560dd3226049e32f42abe0759eaa896f39475eff00d5b9f8f44ef1940ecd78dfcaa1f35d702adf8e7bc8c8dfb2fa7d47fbf3ef486f9fad1588f7cb337e92cd363afd04194696e9f9f7e637f5f5296fd8c6e8e809a1d66faeabe8b2d7d0f0e497170366f1a6f1a0558823874f60cb9b799674cba9b27a63e30bc86612d3614d69540b59fbe2953f1b6069d4d886352b139cdd994c68b3517132177db0374a2b0bb832c63990f7832c215a596d2c814c83904111d0720167a709e580279b93f68a19a5b5af86933e074fea1b4b966247fca08d988b2432971d33f30ab7ae7cfc9318234103d40e5f0bb17ef1e09442e336d690b5605aabbd59889add0edb439ece48074e469a5186011fb7677ae93f00fac83497f7d352007effd6ab33e3b3de48db33b3cc6c31f9022446167c2fb06c80b0b2961384ab7085ad6e719503686d6043f629d592a9bfc5b08a992e6dfdbc1ed73cadeffe4c2bf4af6ca46050db82cc23cef1a35d39bd1e563a4e86568fff2e1fee722442a4c2d122ac4628ce9bfd34d612ac0164b4add92ffd56b116b61eb4068ab8d3ac2c3bfa93f48287ca62f8c87620fdc586bb68a354b4180682bfedf86995554ccb7e0eb33c0a765308dd0c63fdb525a27f71d9417dd6db9bd42decbf415ab76ded23a5d7211a3b67173c582be4a9e83a697468be3b7a3e4ba32902b35f056ed90a372ca4c5892c7406728ee781eb2d8606bf36e29eab94976ad501b47c9e1365f6dce9180f3666d45111f514f63503ba243e673d4a398afa8f247ea682ef97eed27ad05d6cc873e236fcb1a19e00d7d4fd8cedd03d6308d5c7b358b0efae522e6a12b499a3b463eaeb1458a21a3a85c210c170b746064f2064821bc2a9a2469e470632feed2df7ffab06c48acd788b9e8a8303b8092c4665156f5224f056ca099b3d49b900835987777884fc3512c9b4cc5aa8429ecba8252059410710a0f5cd501e9ccfadf7c58860388e8757c82864e806959d2f138dd076244a0b54a6329e03297c389934fd0f119b7714b73fe9a51a3f1507be73261d10ac609b91223e878995490c3b49e7601c1bb78f4309d9fb698bd8655e2baf8de94e81cdd1c703801f61b2f3e59894f33fe14127cf0a604ea6ed8766a0a67cac436328d9fc2d346a1797376a003c3148381d8584a0fece8a147532610ee3a41193808aa014583aa003a3ed5de170ed761ff8e9837f043c7915c66351cb4df0a449dc400c63d0b2c199e4553d06645e3f434309b72f70d33a59d419f743b9846f9e3c1e915c786de1ffacb1c44daf0895b143514d01158a7596f3b1673a7179420d9aa2f63d60533634fbc534a17afa08fb35cff925247df032211f63b3327ce39ae1f458b64d65271e00d77433b9d51858fd2ebc1c0d6c203dde0a840043e8e2e5060a711a6431c91361e7c545a14771f327eecca0ee396e761e90269e704980f44c35d7b3db45175298399e890894990766a7f68964bb7fd40de401558204b740166a40aaae728bb7da36f96e454e6a4d347f78205afc4fc3e85f289029942b6318fa0ea4da2038bb0df9db1d1cca0d7df6518ea9221478fee0b7738be0f0d2028e980998fe82530f678c5e555c2a1c2fa1213813aac90a86085840854ead8b69837ef64a53ac271b2e49e6e8aef65d88de96a472d8c52966ffd7e5d85c242ea05f00f2f0d26541ed4adc9478509cac4f33473705fa7b1b199622dd1470951a7e426835f6d4fc5e6e7b51aee57b79be002b3e8e05d0241e4d40a445b11f235b1da8d426590fd6f03610dfaacc080ecc439ecfcab9d314868462611f65015d2143cfc2d618f623a54ca8d46121aa318aa5718b23d985a8043a3a2b3c3f0415b130e37760312c6f9c9cb31e7c1df5dca8e799371c3e141386ab2b499193d4eb0815c9d1da7361b396c6889219d4f158e9d22d6ba5ade2033b13cd9776919baf1690d482712c712d6964b699d047b0ccb1424e8eaf50361c7094fd4a590a7482d5b708fc9c320431a5356ae67182242fd804e6a0c2e6147007d9be07a40c25cb34b9b500d21ee460947176051b8ec8d6639245737a064f4f359032232bc27e04276881576919e12d603dba8841e3948e069f4cb74daaea862652092506e270005448109e1e9918b14a47ef3e04647fafdf608c30d80a4e34e009b6035edcf78ed46e5bd44c1d47bebb0713b0104303ad56bf99a405f1cf06ed2c58143eb5701ea3125d6051bb1249a9d1e6fd46f902404b80ac8e3c34f678c569c30728ba95135181ca76e5fb05a8b941f94cdfe8c5604725c45b549ba52607d9ef9c00538435d0205cf5c4b6fc918229e9b5d723c8aeb3711c1cbe6cdb159d42e2ccefd142e4539ac0e722fc2a9593fa73b35f357db46e34eef1d42ac8a6f539957b5cc53e051de4b429a29a405e4d817416d8a2630a331e2581158bcf62725651910fe2427ba7d266fe1743fcfb21be0d7a49f81b6d9b60d4091a5ec36f9e4731bd8e905e43cf67fad87e049957f49d978f74af8012aefd7ac2ec8d5d784853b83be1602140e7cddd430b0859084fdb60d8c79e245e2dc9876168e0896c07405fa14b24d1f834d4096e4978f6c3624455e8507daaeab823098c8bd7e3a7eff1c78e9d1b98c77ec55fe3c49f6b4bbe78b0db47124bf20932fa954e97ebda863b9bb194818e62a349068f8fad107b04a449d5313a1a5fc8ca240f7a4e137105f84941b780fb8a00c62a7b51e988e83205728f731d8998924022c358f815ca5a2187494e0bc0def6e058b4467879226796005767f91aa4c724a06789b29e1797b2e5c5287c5d392bf648fd9a50a952e3e28a49dc1672491efcc33f275774a064412364058fe565adde7851fe6b320fd47aa733b14b1540bf66f12d1ddcb67e98799481301c51194d5cecae3d3a7592f9d315169e3df92aa88d2a824f1cb6a7329a5a58bf6f02686e3e794d57f1ccf5f9ca56c729df21845ad02b74669800c31d61efc56df8a5cd2a8469ee8b22caefe41da427c5764159d820309495f37d8644e5962ab2709940c968c48132eb6d4edcaad7b6eef8d4d55965744d296396b75552d199484c62f97191952b172010846b5c14635af795c6387d5c7257df70c642ad2b86c8902460a3895e63ab55305b618f5c42780cd00a5a76174aa05c5ae5e3074c4bee34c44b0d92b6c06d406a6eb4785a613fd24a1ca3bbb312544948c4ce9aa2afafa73c9319388f583e5b8afd161cf8c86be86ec52507f6a491185b75cfa2b2b5b0f1d408e8f2ddf139ab31d17444931f55fa30f1cb9fec3989ea3014d9ad3ff9304a2970d6a3b6bcc9b55c8ddc16a62800aa429a9137b0ac42925656c7df38ebc652e579b90f222e238cd6e882b3ba2977b158d4f87715566456f99845f4ba83aa1e34f0e8799d1eb7f9d2d59094ee722896694f4b36c296a1206a3b49a54be05620e9ed4cd87319a044a10414da2cc452660e461113c47576004faa450c9a2639f082ce3ba6b04ed1db43d2d3b306d0800b1f91bdf848798353490ae6fe79563a90ae472533d23f486f84b2ad6fa013e84be0dde890cbbaf69f91373191d5b704c4a43c2a6ae68acf0649e1768520fbe2288e40a540a5b6d276d117f858f7212530b0a57f042f8af4d423a53c14081dec031ad1187ee681fccca0447f364cf39da8d0ff2cd200ec1a8061da00caa65edcc8a48817000b17857a8c2dd2559030442c92c8889e82361c8e1c361b4b02b8250939dc54d0951b2a4256e8ed823c26c6fe00b4e12c5ffbee1a6f21e2febe48c5dd8aa3bd1ee59798e14ba1dff32aa9fa753cd86a39d17511c84782875c07e48ca5f3a8317647bdf20b5d25ffb48d346252a788ecb94e05822fa837540827503c581250a018533b4590dc60a2ea4d1dea98c943c2e0326de581a17ec26dda305de07984532ce00205fdf26fb3f2550f01e1f54a0c4673cf4f7c045f8dbf5b14cfdff6069708face802895bd98284cc18f78d6f9bd7f05d1dfbf889f18b1c040b8a3ac3f5b4a76666046b6bc8e447cff2ccd6be5a0b2f27892dd9085e782399fa1aac20270708144f19b98461762db06330d66619a46e29bba641784936dd5c59549fcd43335c5bb33c3ebc058b74b51a708f9f11def2f952f765b413b3404c4ab6955471aa479176268cf1dda158492ce488795d752ef8885aedea09840264d7985e706aa0575b4206ae5fa809ca675682a1a6f21cdb9f8e15d8ea6f6dd0b1b16fd6a9e25864c7622d7f79bb7e28b5a17da971a2bceeaa4f5238a11ab8ed5c056045656bb7106deae17fc6ec208a9c14074c1b5bb1ef4bffef596246ccddc81676d4ea65a07636a784c6260dc2b63c51a28b50b6d2f5cbb1cff020e1a9c66591413a02a272ab214b5c0a8663b5a682bc8297c01f63456c9eacab48234c20718ad37dba0a071fd39ed8c6568fc12abf7fd46eb54a03e49555df20a0314f71689842d82bfdfea6afd5e7d195ceee0d5c9b5cdecf7d2755a9ce87f8037e025830bab21cdd186db88a7aeac8c994e002e4646ad4cc824a52bdabb2ba954833ca82a4534e4801cd84a601b393160fb13cfe7c352988c14417ca1506849d9338b741d2a70185580f93140d9e5c646c076797abc371b58ac357696fbf47fbc3fa380b7d6fab93b4fe188f70aa48b88eeb891830018218ea684c1eba51148cb63e55ac81a7e1c0fa6cd11e6e7b0a0bd236d0a594944b1e2bc86d3f2415c33d0a2c9c2dbfc1d435bf2d160fd6a12e7c91d578e7ab1692fd5cda6ca7f44c6bebe037d87cc20fd4079475386c6ac52a89cfbef64f4b045b076a84d2425bd27fb72ef6790ffdb6e4cf891ff0d1bb63bfbd5e4019a8ba8bc7a8063af313f7b9d1f9ef8bb180d768218b66cddc80a6f32fd2bdd1b1029f3b6a6b4c5fdf7637213be497c6b93c8fe16e6f654838271f8f7a4353bb387037c61369e759cbeeaab92d75294719a5fa7800cdfd9d841f292b4ec224fae2e3f3db2f4ab44db58272493387708a9e04c6050f3565e2c1c8100b2e849280d6cc4da1e00aec31fd83ac6d2b06aa279436212597ff436199d667f38fff50843744752c061efe31ec9553b4d82f4dd394e5f4323cdc9ac62d0ad3f282f38950b628a99045d6b6d6ee73d27653ebe4b0a8edd4752ca7b1579ed76eeb73040513b9d3cd4b77d9d427bf02eac8a1d6d60a5be95f33a44923deff2dc81ee4754c6dd8700a3c65ef0f5f751cc276489f71322f163e87808e70af7f2f5ef6db63162e6751828151979d256f55f83b4b9a60c30cb0c61fe5cab4b66a410dc7e09d821ad1a55c753b03e5ff05bd95357ae4f1ab93861f8f509b3ca2bba955336aa4d88703baf1d8d2d92a08726a4c07dd8aaa5a562fa98896e35befdef34f4615b763b2c3d8a7310ba957c3a6dd9fdbb4cd50bec8c4243211c2ee41759378130b437c6e2c487300e3cbcee39edab41d4c39cadbfaa0b715d369da944c6a0659aed51cec735455fe222befaec88068a6fdc92ed8ff6b11950d1c386b126afe7f3fda01341bed833dfe8e0e373bab37765f4bc8843f8af526712eef88053a4d828969bd8f4925b08d16cd548c9e41ac9c037f347e6edeca1fd948553460939b6a76a518b877076d9864a8c2a2a51aa30a1d2a9a98075933a4e9c52bd6ad16149a699c6f5d04e95e11a3d93bb22528cd420c2a8ee145b440ec2877a811351c70ceb38030bb38cd72617e158a46275ce5c7baad781a511e4a3e9d0dbab98ed25f9c7b5530614e84defd7e5e3b2b5741c1b135508abc3223cc3654ada375aa1af46da90472268c0bedbec865edd34e655f5bac7017c33ff36b10dec4f8bd9f8af4ef4f6b6ea20008eef05e8e1d06dca8ae946a729a18e9c2c41dc6a7bea2c184f85db18fe2b1a530ec7e466954ef7a3c9cf93c33a9c256760d93a2f9e3a6161c3113f15f657c764f86354db09186cf8109794312dbe2be8e15780b04be9e801fc5268e87560e724b9a3cd05dbc60c5ccdd0670f96ece2fbae03c4fdaebd02f64523424c707132026895d249ce94e9fd61761da0ff34418ac3e40e774f783a82d4b9f9a6195204c229868b5dcf20fbd2fb7a540633f9bc3d25b4f36232191dc49e33252fc4a65d66396d2821acd6fc7d1a70b83ef4276dce08eb832782302f0aeaaf0e976aeb01e8510d0ffc9c867b3bcbb6e6c781952e787072caded1c329884cf0b2a3535a4410e2dec326bf231a9fb17742209a0605088b6b58af63fb11b1f19391be9c7079614e24828dd670b49cc3bc32d81e8d6bc83e5638b584f77b2da17fba9d3dbe32ee0b50365e0774731a3d5956cfa7d80e8506a98a52c3182db63c1426fee19ef8c170b8695afa698350f581031a7c5e235ecd9d80db040d3f423fccef559f6d255bf441b90f64dcc2a841324d056dc0df690920e60611e461c4aa86b388c101ad7b253a70817c4116693922120a8143e699e3caf161c89a1fc1c3d1c7d909b2daace187d2858de915884ab5c74032044a7dca58d23dc9954b2bd894ec2071bdad0f6cd703d9d7887fc131f9ec52652224f5295c1c6c07bb5729e3fd00bec1af321c55fd6f490e8cc9c25dd2cbf37cd006e66ba78e03d200fcaeaca94c40eba6370aef5223b6da7fd0b8354a59098cd9d6e790fb4b9e2c5088030aaef1ee7ffb9538df1b3f4b5040d6cc25c0e66d2207bbcbe0bee3d9070529a63c22e4dcb39105cba0fbaee7c01e1103d14875ce0602eaaf1ade881ab134ae846e836c1a9a75e3763b685b3b46c5ebaafdc59bd17bd46b0c76b337e596c7af4335dd65360efca5d43754fd15ed41ed4b1691a7e7bde5e58d01131565aed3c67c9be1a6965643ef7cbbba594bbf3034b5b0aa006a2443cb392086978d33c8f8525478c9102487cc8d881328c0a0ffaae1b796fc1cb3571b72581e919679128bbadb4a36a2b40765f58a9d5cb21d2fdac16f2feb8ad3d958fab7890e31e904ee72a56b189d978997985d6ccf9c7c71307274b553dc92e54619ddf32a0dab9fe3acd455603541dff2cb4c05d100b9bb6bb7ac64d3569b00b875779ab2588dee98778add304c6be5d78fc4efefdfbbf125e00db97e323799ba95a2b8a8c28c71ef3ab8c5c20ad5adc99f0b4e48a13c814cf9af312acaead76600733a18189bfa6641f5e56d2987575243461df61e8a01b383f293d8a7183e2ccf1695a8e8482268356344f9d01e7c30797475335a84dccad1afd75f65efdcbef7c43a23385066002c3db8d8d8f53128a5b0b310786b12835aee5475ceb18e416a186a021c94fa976229cd97226b8731a0f015689a91b3d3d38316bb9766b83fa294d63f083e68d7dd1bb98fae44c796ad82fb4e11e9f749afa50ef2ae1fa66507d0c6eacdd926ba287557b84bf358a15e37627c97513742b1cadc09078383929c4c03ab4decf4ac5c4c7238b696c5ccd18fa68d67cc5c13b64e559190aaca7abcbe48d698ce3dc65afc617ad07e30b90f3e11a58449e0f97c117e8c67736169b1514504d9d3b426fc74e2e73bdb5b5fbc59fc84103023c7c157db8b1cb8cde69ecf6fedadf11f72efa44001ea569a793e81276c6799290838bc93d4b47c813052d7a6931ae927d821cba357a59c8adb80df248a8a81498bfed5556d7e9a94bfb0180be09c5dae6064c49537cc2cb88fc75c58c27454ff374bc403dba61cac4321857c41f9fe2085662ccdc45054d53e652778ae2578fb0328e63190e6d16b8e6e4c577ed972d86566ba55015aaf9d44d79d526f3e5f7f2f5f7eed7a20062203f791bfccdf3a1b1d8137e15d33383ba7abf08ce343a6e1468145df6af9aef9e073c571820b735aedec4ebd3ab27432ad88e4a5720084c2ad323a233f0008031c2cfc90e37c76115c587ed0ecaf03812d98bca5b537a944ffe5878c9aa39f2cfff0bd41ead0814bd8f609502615e589a35642a4b8edca335fdf42444003f7b04d8e4fa08ba40600ed0be32abe079557117187d2515cf6f57230fb484ff33953266d1f318c2e2b819974999315d2b2c5d2822ec52c14469503a424e1ba27c3a40718b1f23026e48425e348de92bf2a3f1da8dc27a34d9dced1c57f445bce7ef6013e4e5f971958d8431685c8f6c50d5104b1c3160920b9fec11a847b0350cb2b221a0302d6875ff0145ffce627e38c09194de4f1263e4a846223547ce81d68275d21355325f8721d281e4464220c683be69548b5a9dae6d6eaedf94119291e9f3240aa17d5b5b32daa692ebf6e88768602d1d11e9424113b8a95d07e6f1969e5d87853c6aff3220d0e4eb0b3ee9a6038355a298c4ff2e7e7622b2167304a09be4c3409da9523f144ce7960f45e3b0514f6214500e5d83b6d847566842158d4083e18d0913bd9c6aacc612208ea6ddfb864ec74e277c10ed1a5849edda7c47904bb6e106e5cee54b3a2510996952cf895b26f55a55e0b59de26877a22b886fdae6f5aa12aaa3e85ae728aa8b660981dda51cd5610a168a1f33c61678792f28f17896057a4b3511f8dd4e94d5771fbaaad5741b4a80095aa513cd57305ab760afb157caa44d21db8a1153acfdb54a6457dda1f5531403ada611f00d0e52f2de19d6a6e40a52e60a3f6ded329e2c3fdaa8182b7ffb2447e8d7c0c6cb96dda21cc5cde0da0f17d284f851fcd9dbbe877a80660ed06a8e656cfe4e22be56be4e9aea08c0b742b6d1ac2561e21ac8bec7e0e17cf4671c0be35b10513c3ffd283116d9a28e62e33f37df6c47632d73e1c43704f0c2ee117729147deb778f302f7eabd35e75b0ef9a4ea5f7f023daabb7a02c61729f947412c47cecd6c32da6f80d34b054b60a51901cb52a0b9b4e2290467f744dce60c2a3f82d573330925e37c8fb7995fd67aee5566db6c121c34221d12a804985af0a4733fb1ac38e3057e9700a232a77f0a44e70014b3fb7f04fd92d7744d5f1cd3e2ac28b329a78b9a9bc42323bcf357939fce01b88a50d0fe334c2b04106d5a2a951e46e13e02ab09c0845f391fb23448f2ab22aa7f0937b17211cf51c965d6e1ce3a6972bffcd86584a696d7f399370cc1b4a5ce6e4ec2999233ac7b6ab26b6bfc70840905f2b5f8d738d6c5b34dbebae1e5e0500c0f74edac2ca52ce1ef0f68fa85858b3e8a89bb8c09a1b7ff92fb8a5c533ed83abc53e838eb740634329adb2fe012563095e087694959ad342d068085c1fbc22f1ec79adbb55736c99d0a513fc9d0c50334f58d6521d186bb67c8fbe2392ce2e3602b327c8ac5e4be810209b895c4c49a7baf8d6c20b41853d27626cdfe8350c65858b0726033f617eea2a601f0eac9940f9b477548eed38b7ff9b200366bbd6bd9b266747bc09b7686462fa309470ffe5abf72b5a7771b0d7a8de8c8dee6dc6b108c111dfd4cb24464bf69c94f2b97fead27dfff675f1a2efd7c4beebf8eebde3a86b7afd8336673d4e298888b642e98d8a368961c1239d17e6c8bdbee55ed8743d0b9e5cf1c94d2bf835c54abfa9ef36714863671d3d0ecb0447eb9b471072716fa603d375d826439adea7e0bce72e1d9964442617f38086903a087bd4b9ecc49107a35133aff7dfbfc6b97b613166fccc66f8cfed8fa50d70d369aa00ee3e03f75aafd6587eea9741e071fd81cc4e975b8053baf993d825b0eca062146bb61582604d07f44e903da78c206e215020a8c117b067a46e7482e4480b0232e4d5523d8375cf2c89de14db0995a7ddaed210a91bd1891328efa3adb0714223d4d0262abf1cce6d6d5ded15906650ed0b9807066cff8b083e8d24a7f110861e578b68f76efa780544ca10514a1f396ccb7e7531115567d71cf1af2bd2cbf2eb4dc87f9208ef939342be031271189893e085b406646aa31edc918058b4ca08906b1b08704c9c688035703117d7ef90691ce58f67d3e1f3ec6924f4144a6edcac62f56eb4191c62879087b57748af347e8f52304a10996e13564c4af223904d1d0c5833310d79d493b560d7f0c548ab06b2f1510f29f48acff79eb9bacf0c8084c46644faaa1df29d5382289751333106cdb4d610d7fb0db2887ec1b699ef15c7d50c73d31a94e44dfb104889ee8bdf27701d8d3e4c054cb978faf070b23a0fd656c8fa9adacb38233998468fefa0db451c9f771000de1368d21c05834bc4eece0c9565a71a18e9d648c742549c127a6d171859848233a9b75ea0a352c294974ede1e75060360fd42bc11ddd7573b890d3f6df0860510dd355b25e517a83befdbe20a876f0c1482b6efd07406d25d1d7d06c30bdd2babd234fc463d546a33f4282f9f60f73a03ea45d60e5b2406ac56aa8477ec2292a4636c0e14f2562cf1524460147774ea78d8b970538c22a920b86121239d8d486b37c06b012bf647c607c60a116b12f4a32c4efdb3940bec4b66d51443f461ee37833ef524ca4e0f0196ba1a3ca0301162372e3729647016ba9dbce164cfd43311aa1314a4f8fe57e66961b3c919371f2205f0f4f418cf521586fa6151c576ec8b980a05b426f85488f59d42284bd60684fb70701fc7d73625f08cd280402f66bcd06ba7b8729e8f65c2d8d861e83f97cf0198861e2983b5eb0d3024ad81b8027f106c9a1355d3d64d6c62397cf9e80a375ce4948bc933791a56662357a04adf368563f62ee23ca4c4e82ed37fa642273009aea91041934af7f2ccba2b81dd4e9d83ea5ab08186f94cd959accfc03028c88f95a92992f70680be90ac7b26131abbd206b380cb7f74a6255f132852591adbfd56e10fa6f8d8ca14611efc6c5ca27f4168ec42aa2438bc2461f4cec36853b4522d69ae05b973c4cef18587f3352dcc24234e34a374256e5b88c2b1df25a6322d9e1f66f790f32feb25b01bf33c05056685307db937580985e0257c02e2d146f2933df8d46c428a7c0c98a17558d9fa801e38b300fad7871f51e5e26a398aa37306ec05d9a31d913dae81d30205c150a89b875852e79058cfacc0db2e2d52206448bb47d6eed2eda9a8ec12d155958e8d6f79df6448957d7722b652266bd849685c00b9dbf71c2a2451125e2c5bbc6b240970a013b36ad316b87bd18f3072c3a9111255e54e9ac1315f1de6456f94eb05d4fbc7a22592d17743b231167bd0a526970aa3a6c7a250dc4b02a53456aefc8a03d4edbd6741b74fb2a6bec369a6aa0481fe24e861163bd631029a8181aa6dc5d1241a9ba7b4465b91f1e0aaffa15cc12e867f6a243429503f442edc1aa7ac96f544eddaf55a4fe67fd484bd6283c3a8d9b76133cf1bf5459a8c6ee61b44a1e1bb3f2554f8179d48403cc29c0ee031b33d53d469ac2bd09cc853e80f80cccda78d848d3d7b8deba0ace7bb2c37425610a71a501caf3dde72df653710de55ebdfb47e9f3576e5d0e98fd7a3962d990d2453d74859aee6d326c9437bd2c2b2bae966e060d489cd68a227262c245b068633ee4e54f8a57454fe0aee289d18d13b605bc3c8f8b2492c107223e75c11ca9c868737b03ae533e1edaf69b0718ced238916bb1e7487a1c4b841307aacf957cbf867e8d6c0130b7688feb77bb030071b5d603e2f2a04225f57b21fe0b6537664f163ebf47142bcec002d5167ed9fc6d349eece0926b3b68d1e06c7036049f3684b51cc1169a03b6629bd6a9ba50f5dfbbf1df583f3a2128c7b68738e64dbd27aba683bd39db57adf54cf8ee73cb617a664a02f3782592b93dd068a721f303f53f7dcdde36810aed18e8631d81e77b55e34cb3c9f98497d30ece2b4aecde9379e6f439a8082abd31c462f4c8940bb7bba7f8632aea009f2dc5c132c9bcae6caf591fe21c3f4d9936d2d1d24eec28dacda5b59282c6ab75bc3384df1c691804e762b42a39b15ef2dc3b3a76bcfe5fab682b1a94ef4909dc89ff85932ece72a6967187c2b71a2262ef2e90ad85ef3384db0582139a2af3ffd598d2901ba328c9bf21d7523bf764e06a6874e4f3ea944fa129ae12b1134bb15520dcc99adf5304c7e3ca170b467812e9fccc5700be6d73ebc1afc1b7d99870b1c47a8f0dc97d39eca05a6a9522087b9b6d4307b706aa3344783838a6a5ce0ba9bc27481eeb7930b790c9e4bf51f02dcb1a6f7f9355e357a48ebed2a9537fbeeed885ceb5f2b30006fac46ee93de69745f05f3c36ee89312e2ff2ec28b02ad3b2d3482ba1339732be981b3b874b56f12f41acef4aaac02edd0534d502766cb336e9d0a634b62ad4648a01289fb444371f9913a4cc8f14b524e064704391f1b9743e83066ca0e42e13cd7d65784a1bfa3b24bd984a527295570c64a0211bdd43f8709ebb467ae066b49177aa2bb4ec4d94bf9e85951b45393a2bb62e42ec9f1055a39028eb2ee884460009e4525ed5659584a5de54a2e714bb41bec850ab303dbf91b1779a03a5462449b0dda065304e33f9f93b74e8e3d2c917d7ce0e067ecd175184398122b92d5c32348dbb1c3535043d1cc0957fbf687a5858041e3b5ddc42b9c3777f0a9e5605670eb03bc891208c873942d306fb625e09a68ff19fc1746772fc3d6e1a4d92a23f9b49a808ffbde36abf1973da1a94ea0a8ffea73b48c490625790fbe8217f821ea63a36bccb66573288ab193838221fa72ddd65c3067bd1dec6c780d833773820a9b92db0e490b90db6385c2d5207049adcc9160b1926f95ca0f27891e621b093fc760a5d5693fc6510cd3f867e346a0fb14f8ed5fbfa433446bd23e1fd48b942d1f8e0f2373ab24e21741f3371379d47d4e82b95de64822b5289ba7bc12380337ba3a09ea420ca117bb7cffe31c3eb9027ee9df0d5196ed3514940bcd9c5e10094cc6d14a872bd63e2b4353ede38bd1bd2614b31f20c4cca80aa26c2ca64e3aa0a01bd1c289c283ca7ef26a2448e38a19db0d700f4f4b9e14ed7f771647ae7cbbbb44c870c33a42f86f54f284d03324c36ccafa24bc66c46b78a86dda676e532211e72a6334643438d4d899468dd82fe8373f1ece0f52245c7a656fd7c83a48145dd9c20d51b33e3b62e71998a1c170fe99af3aadbc76234c045ecdc93f3ca89578c4c1e9defc960eb0c1e797b156aa168fff72b9b6dcd61c3be1d344c02e8101cebf8624a63a095d9c15ab07931eebd63c29c801568187de7a2bb1c337050c1b2e8d9b6ceb4517d9b4e9ea4939e1ee322a95ede796b3dc1aaed9e17dbacff6423e3300c7c838cd8b1282435b98645dc911ee5d8b70907d8696887558fb506aa696f166e6b34411da804b1cf3f90734dbcd5c0075b108d92ca9974d798083bfb410c51526f176ecf5e2e6d790d8ea610153e80bbdf8207c6124e977cdf048c2591f07280c7b87abe093e7af17186f1a04f79de1bee852df6fecf99caab08df05fb3edac7bcd0b3ca9b6564ed7894fdeb2208831143369daa6553f9510bf105c9bdeb3444ca53e9c5ecc0b682744101c18ce21532a9a77d19917a046c7aa3dc3e78b3f06b5fa01f7ea3218054ed20449a598ed086cf35f34c6a4d4574b4b0122571880b81625e017c467e11d543fb6426f23df81e2efdfd287b4e29e927a270fad359158a07b6177876932bf96ea7aad69c6461a1f68c9262cc53222d955157dac9b7ff42871b731a46643df86a88200d378b9c3177d62a24cba00fdcc630d467ca12c8c00794c560ea830d56e6748410fe5d5864d76b52c8f35819f9e94f9494f7e83c717b6b0d516ba69830c6c4d8da079a631266f1319835ea4ddfba6d65a350ee2385d1bfb9d8f542df3697dfafc573198abd2f7f1dd3d4aa71fa1e9018c96063f89dcd2fb65d6605824a47c7452e60e2ec5562fdc9e718bca98fecae17bbf70ce7352571b5906ba082e20f7db811fdcfd8287faf08def6087d85b79e45e1f7adb0f6c5558e0ed7bdc5d2eb144b78beff556399adb2dff6166280d8042b4ad191d3727be71044d26c1360c64809f383b74456ece1f37c8a752236fc3e96a2250af1c6903578b4c3912ee9918d502bc799fb49dfa65ac7746e449342073e5d8b61639c54b44f6f04995511a6075d0b94748f048ce8694af0ee3a6c02413279b86a51cd6d66887a631f32c8f14c3d6be07ab3361aa6e226c06f402b395ae2ed8c510b7e65755673b8593a60cd8e4e5a9fbb64034c627beeb6fe34775d3f41f17506d287fd5a3b5722cb577ca7b589ab143aec64aeb655a9b3993aa3babb898cfc4e8f6bec0071e9b146880ed4fd096283b1da7d182b3066b0b362107d36fb3e87c1f14a4f33af20391408ecf086981eb59300010c5a3eb018db6fe2dee61896d3eeb4ab6831f09d80aae13ef6beed55c50fb1e934437a614be19a9ad2d1e33c043d28aef6ea50915a8e3ef06d79f803f8af90a3519302c646625b648313d804c3779a481b7a6f80866585b3a20e98c585d5440f5ca9d52a003d62d2269bd4d7d4a1d3e13a40f9b154e460cd3ce8ce3c4ab4f1e13c41fd0a39e8a87198c51cb3d5195fc85bcaaf066ec91c4af792639f56f8f69007004cc6757a824c406499658dd132fc82bc8fa63fc0a0cf7f79a8b083c7d59478c6fa1aaa3db1a0c457d791aea60f940a1e258695a959b65e458b64646ff9bdf27e5e6b7111d8ee7b240fe6d252136049b58c65ca74e6c498f1477e9632d14fb06f4dbbb221f8bc2bbda9cfac428c74b38800a19c1ad34576f7302152f947f643906d43640e8b503ce3bace0475a614190d9d5933eeb056a4f4721a130fdabb279b039df3b2e1f585f8823904bc013f8bbdce7032b67c9f1dc34ec556de2dd4448cb6ce7b79a20b90354a9eec6b909795d1697794ffcbbd2edf349f45e6eeaefd8bf69008366b7dc6c8c2f338fff181c5d0d4f2aee3902c27ff7149b98c463c6b114a25c201126507f14b2ce5957540ee8ddfdf1ef272f5415678f3a179c4b53b0cd683682ff5b1b625cdc7b136be0f860147d4f406862c70eeb01efad356cbcd3ce679fc5e8ae3e2517affbd69b428683b3d9839b6614e2de934c0d9922f80e4bb015534d1702a3c6e77d30334e2074f00c9772cb79123b7bc1bf467b24f1e9811baba8e510a563babf52a6b42d29866516611256bc9eadad9f4fac3310a348f661982a2a05d398d9b4db885d4ba9925cfdecf847786aa01857a3e23ff45120699f981d57632308a12b6b2c071ffac515102771c753010cf1a517023a304a7256b19237962d2a66c2064195ccbd35fb9e1a5b1d0db188388a2185e52e4419ac4fa5f3c56fc30c340ce1e7e954cced8c5dfe883f5940262004f678580eb00103e9cac983a3a533a068cdfe903e1c9bde731aabd825cc2d7903717cf28dcaac4e1c8b0d2672a478434f6be5cfb2c1e4d947173ecefd4a3bcc4e6114acc6008a8469bdadba8a459e4365585dc84f59e0409cc9860b0ca98a7ff5c97adc392b6b4fea0473f6bedddf6467f642c5e1739c0f4323d6c0e6956435f9ae0024a5fc3da7ffda5f92935ac9215c08dda59751dc3fdcd402c174635f83797980b01f9cb89fac450fcfd1e5105b66d50aec0296fd9064cd07be617acef6d85d0ddaeede84648ea6879985af055c5a0e92a8ca13f89b1e6b6c5fa38de020fbf28c3aaf3a112d9eadde9bd7e43256e01f909992f95497a07aa4f06a0c78dd8886c23a60d44acdb316de5a018bacd1d7308a762697a034e22e000b4d23005b3be316404d145562ced18cefab5a11e7aa8e9f5a12dcbee2870cefa009dd6d68b56a0e14297cd6df74cd4dd46ec1b9398ded294e9d43e8215b4bca118fc195ae4da7253fcaf019148f516b59f0650110ae1fedf3875f1259e13715517a80bf3a86c3ca081789db40a15379189810f38df20758f7704b7ea4f13693692ff6ad08eb3fec2565f73d0b1bf85a362d8e842b9db3f03d8255b7e54eb4afe3718818d26d9888c12f91bb4175d5066fab6f1bf151fabe6abc40999917625f89892a4d55204b8118f678bfdb0a0e531b267acb1af36c5ec05bebcc4fd3c41d0b6708c25386781dd4c18fdcb18786006ac1606a9433ae03da5d9baa2f2d80dd4a4fca8b35f350f36a52d7df7866f98ee2cdc9ff708e4b7982edfad5113faa9125bd41e7949b2507b241b104928aa0796e6956734abd2be426969e258072d7a36660086e2ca1b9cd5fd445a44881327de3c73ed65d690fdba9ea66c247148a0fb1edcab9e050b09819b51b3632e1599d57f6bfc4037b9098ce469313e570699ee7f49394061edf54ac39f2d58344bcd70ac8776caf0b38632ba8b638415428bfa2243b9d6405980bde3fa51a0bdfa72c3136f2220c17c408872a0a3892aff3257108909e621c971caff8d01a0ad853f86f4674fc753d1d8262926538c26aff9909bafa2ef5f8df4e693b312c8f4204e43c1b12eacbdb90d312489f6aeb7686cd5fb5e35b099b2b2bedb21a34130d03c2c8b759ac2dac68ae4288d12589f2080f947363ada602bd56da68e13603aabfcd739802b01c8cc97c476df5f0f7ffaccd8267f8a1172a1ffa84af622f7c7d7c1371c9f94edbb91bf737c534104703bcdae712ffd994fcd2cd1cabc44709ca2f3987a89556e761e498e7b0eaf64f358c466e28e0f0b4edbce1dacb4493ed7a9a76ae3321c7bfd53092c3f9821a9d189ef073ce536e4665eede26b297496be2b7f80de37db1819c681624b2444076f3ed6b388ea9069a59d1acdf572f6d62de14ca626c4a0d3e88748ba8830239cc52b6c9709a508076139a53ad64ce138a4f88a3deb0abad520b1b76840d6271ca8b45bfbc9656c02daaa09d5fba8d16f2dcba81136c4cfd6a8c2b58f31e90ce6eb6bdb34eb36550478359db8468b47ded3e09a28df9167da5be262c9126b8d61c5675d57059dbb1b3fdd690f80a5695bb80d51716347747ad0b3ea7dd98fe0922ea355e00320fccd0d6f8be70d2d2ca734c0f226682ef31bf1941003059ad9ec1a0e04fde27537b72bed4eccf819f9faef168325cda67fdc181e7562da7c19c7dfc4c40d08ae58df02a2f763fddf17ae70f1d79d9281bd0b9947205d0bb444216dfff9feaf9c83be12e4333464ed495c518a81ddd6b57c353d77e6ba0beaebd0f970bb7ea3d78d3b4d180e70ba2a91d2fe1e57628bb2a0ee843c482da3810a5a2b8dbb9699778f7f80a3b6c5e9e093f56dc56b1829e10d5e2aa0cc8646a49a5fb476b24ff1cc4b31f4e6c825b51a7d160cd8c6af641c0317faa3fafccfbb358af8cadf87009ef7619cc78f1d327782ac27fcc4530da6f1e9fd2a4c5a794be9ab4d26261a99e6fb8fc923e7261f5e4ea4b7635f39c1369d9d4c615b9ffd463cf24d4a675f99aa95705f9025ec147f3dae578f17ee922b867e5207b695270ed4a3508ed473b5722ad3895b21f496126310670a43d2dd2ead442e939f99c7dc75b501b8e04754bfb8b23714e79cb61e3b684696555fca3f8f5f14c526bc43d64e87a99382b55365fabdb2e849808d7e257b95691e29565e7328dfc61e6c47549c5ff8116b6739fd497323431d698b3f41f15c7b05d53b937e433b115d1bec0d221345b7ff1e9cc5709851c2e598996963253ab28e3372f44a293a3ea58360ecc6328e77c532b1333c1141368b01570cc4804c84140cb97a0141ce951f9c6bd30b55d580407dc40c498b8ac03f06b707e6cb4a6a8cbf109eae9bfffb7e45a8f334a13a94338716bfe812b8def3648fdddc20603b4f9aaf68893f1f8b613a71e1d707038b1eacf8692d6592e5d4094888e8dc4de1692767621cd620427bce6ff16059505c42277c4b972cc0af60b5d0221c400c70dafa6585eadbbf2a92dcb7f6efc499290b939c467b1cfca2254a44ff1c397873f7519b9839fd311682cfe1bc043a541ddab5f940e72e0917c4e896987e55606c1402ea54f5b46a5f14e57ca7397b1e103335033b42d84c2851458bee6d610c9af2410e13fab61fa60fc51aae65d501c55ea11f2ada2ee36936f25b9be0f4744c48af2c454d3eb18519e140fb6b254d30f39f9e35b8d54c49328a346a4051f792ad299c7c5f6d04f5599d90f07dd5a05fed4ebe9006e3421720eb4e469a4de6abaa1def174a1f58c844807bb442962904c00dca4591b37984b4ec851fe4710ef015bae10ab49408c3398968b2fa2e36a6eeb20798b8909f0ab324b5ff59cc42f66c68d4b1f683c1a05039e1358775a36954ef318171fad194169e4c69ac9138c606b8707ffb7af7a89809b66d0ed72ff5b4d0996110a48aaec702bbd5787c9c5d54bd66acece92a9c8b8cd15a48e674b01d3a7c7b410f720688c0c9eea9e69b02f40d327068e39d83eb7d5b1d21a7af264a60524fd491a9dfce4cb127465ec2fee8bf7a30ebcdd59263db85912c5c8d1e432ab0989568f27d4f47d3ce8ce3cd347f4de01295cbb8e8a6dd37e26df42a1e8b557b2de2f11a693fefdada441b1195bb4903fb277727aae88bdbd3c685301bde4d371560497b7932d2bf23a4a7bd02c398fb54c052b71ddc083cdca37234c468b155a08d3e6faa9617bc6431cd5f309d4035802de7ba406450fe2c2f7f9dfb6c80b2fff29c79428953646a074a5da4fc21ff2fbb575aa1e809c2376ffce2f2d2d86cfa7f500cfdca2a02f5a3800110905c2a91df2708d21388cb3792cddb355c8bc7b88ab1e30ee7c8dd2f30bc7249ea43fdef01c61389e6094fde3ea74f9e78aed3005ed6e285a236f0768ec632801f608f9a3210affb25b7d2ee8bbbd56b6ff1f315b0b0471bb1f11270540ab1b7e1dbc9e1a1c57140f76aa1700e00f85ce1e6a330fa8610513d4a3bb957adfcfa2bcc03e3bcc6feadf045195c3012362f2c76dc80ec36da93e01c8236f056ced47fc2fee1cfc02a4fbd054bbddc37e814dad523f24df4d103d6819a578b54a3d74d12ae261eb002ba9a813637d0a0f87441a2681f89bf1383377b1d1581234c54f50c22657459a89354c745409c1a686240e8ee5613b21530cd8464aef7911fb46ada7497c29654edccb14bc1557b92c9d776340716fd2a4660738b2d1dacc7bd60cd89d81d4e48813e49d2214a72acff43ebf57f59f50642a2b475e00bb779f2433967ee81934ba66e5116e1e55a927ffd2f6adc20a70912d3874e08e9706fb67f373cbf23a9ccd3c68c8208fe3ec5e22e44c00dfeae6710c15d67993a205347b9bf6704ab0ce5bc0cfaf13117af78f0496ace9712c88d2a88d12c07eba2cd77041edae5bc4148d08a63f56ca901437991e2f0c38a22fb98cd7578123efaf2f8d9a5b9e1e0e4e60a247393abdf5f19f2e5f9239594a450a605c6fe918c5a11091338e27270964f99c7c1d11d34d181ac3fbdf1cdc07978c82b64734b6ccf3778f875d6f1fc9d4f9fdf907d634f78e7d1a7c075a91469a4ab70b7c80a4c33b5c4dbe78011a374ac110475ac12d9deea420cd8ec750a019037aa0e33c813b69fb01c8dbdd769ea1a29f9351db8b20c1240b465b0a88ff5fede6ebd58c16b091a9e3a14f580cb93da271b83eeb6ead3a66323cfb8302865d309da6a17a969da2416c27f0d99f301e769e9490df4716a915641ab74bebf54d4e85d15219491021ba12cb21993a24a93c7bc61bbfdb06a8d7d4123f83ec84691c23962d65e610162895f59fec9671b810c167b72c147506cf449e704cc0ddde0005f11084ee64595e0c97663f114b81dff3e6778e2ee38a49289cd8ce30eecaa85e420b8e139bca9f8213b488b7d08a8668978b309bdf7ce78c48e2b2af84aa1d383a3e92305533ff55a267d796161c89c5fed7c5752a8cfb1a096660e50c4e2ba8f7de58b63cae39da2cc9623063d425a98f8efa97204cb3a3cd42b52b261ebe06be2f76e136c439fef1f9b8368fcf61a2bb2b5095abde2976f31a9e5b2e147cb7c0707f60961e85d27cb40a11e6b5940b0b0f963d2f949fb415d367f9422c1e46cb08677eb8f57a1e7c5ddbbbac20719b13964d1d9dad47f58f2b45a8fdc0f9597e46310656d258cd9c02cacb7b9eb0c21d38657d989e0363630f9b1f93947d838e67e0018e899db9784709105f587172c131624d7ddb46ad5834ef0267606f2fc4d6d0927676d3c45cd2993706332726e12bd956ec26aa5c9c0460a04ffede4570439444406dc7523e4463664341e666cdc818ca90da03a98c0e86a0f66c39b88aeac94dba67d96de0c5c074f3c0cfb2df5f319ebac09d54dddc61e44e9842045262de53601ac9afba451fddd085b20f380619103c7acbd8c7f32e5bfe2fb5ba21f81c45146338ac2c8d29d45b69aacae8019888ce7c227a299887676c7a329eb74a1b73b209de1b78adca7c7d0a325972ec404908a2c7ec08c0bb91737c0fd3ed340c19c5fa3af3ee75303464ceda11545f762d72c5207a3e2d22c29a1633aa662de31e6f95850301616a1169088443e2991beaade370c556a5c46bd47f2d6dd81c7ffd7341257cfbcee04e40048e4a88a8754b1685fe7d412980c117136a23997ee45de6a4b1e947163f02c3a141462a398ddd4eea1c4d0641cb507a33622f6127cdceaad2e40e43a8567438fd7aac5e2825112de80f08906f05462716c902ef9420267e687acf324ba9265f0600495ea0404731423f9e49fcae67007a543a7c13f2e81a9dd769e82a22b85f9db7a4344706b098f4279bfbc2590c058a3144ba79ef3e5b4fdad93cab0c4e18415735c074f871921d97c29d9eab4b75ed89b90f3ce5bd9d0ae3488d5d9261c889d0b2d41262e538f26647ac313f7d931df00e50b7115163b35c5b04b3edc6df750e655a62f7bfac23194c1e563b0a2e7a100e0dc35e4e1fd591c355b78bd7e19e35a1c57da903e0dfbb28a8b6799010c8ca27f362e6baa809415ec93d65d11ebef6e8749e321de258f02d370300a05c326af0fb8fd8690e15b062b9296f38b3af7d3e693f4a321ae00e640eb93029b651f2ba864ded425bcec92613c384436a2ee64ecb9ddcd132e0a9d66218ff334ec1a03ab8fa66555bab3867b74833364cc04b67846799e800c4a498c310d3cf7db5f3a62cc2f7faa4d622460b43012917a871c5601d9a74a31e2ac09c335e6c03793259db58d872321b4f8bc543a92dfb7e9287d361a8eb0147d073ebf00bce6960d98da768c5fa4c0774412be0b1613710c916dac3349c9469a0dfb9d6012045804d9b6e3d1c02bf45c8078c30021b1e749a99dd4cde3173de04fa6b36a7471f3b12e554450fb9201ed8a670372a2c67525f3e3a6c166f0e94535280bf00fdce22f135427e2a6ff9273c9f78f7dd792484c49a8cefe1443bb3e03b3f2c05d12700a1824a9092dc7b03678b4ee159e372af2441556eab73d68dc46bde1ebaf985c881f846c3d60dce7eab7aec3b9aebd72e1063f2a6014818c61414b07b9abba63aabe59d69cfca3036ca60288ffadfb1e54b101066889f724ee60a9558f0ebc78958f05f299ec2d073af978ec00ff2b7b8efce1a23f1d61c3613238eccd23b21be10d5b02cae011501d61599bfafd135084268b5895cfc5191bb3f12328c246a0beaa512903d79278ede3aa32dc4828ddb16689317cbe626b34bcce88e21b6526377688650741d776b35f765d5a5a86347107b1cce758b2f812901bbd5cccff6ff1c1d133132bfa3970a36f1f88301bdb7d418965685ac5a6194cff5f99daa8cca1e8975e5033e356695489cc022a6405e5330116e90ca5484a18c49fc382738f7db13a7bdfad068b4f5d3c94eab1f411d932efb41e45f6436ec67e9a153eb3ad6d0dd73b761be07338dc4922f0f870870734f28f126e0e1f03b897caefbcbe7e0bf3e0c17488a1415f0101cb59b2eb37aef1f60b96c8efa33baf3a15fe574141424c390b82b0db395d25392d116f7b8b08af7ecedb0f749636396d029468082b7895e15e0be6ce8b8af43b8de9e8874cdee334ce52546caa2b64331cda55a63224a3e5006b8e13770044ee3fb3685b4af733d36ef535d567c32743c2fb560190eb55b1a31c2f0ad4ccd9c5e8749b00599694699e3211a12f8c96d591b10372d01b53d4d6f2bc4f884ea4a97334fad28508a44b9f8b079a6ff1755e58b8788832186d9e99e70d36048efabbfa1dd6f74407eb6e325cc0c1cd17f1853bccd0e8be315cac94a08b092f40f953e43d3126b4f15b69d0ee11cd45d9b1775909c5cc4c0b9774ca32b4e1fff10d56362623a628711b9912392ce0291a804a7679071f96650286d2b6c0d2ac2fd268876a56dc6a87594705563259ec644d9984cc0aa36ada2f8ce67c53fd20efda449228674fd2acb99f2283cdd2d76f93465969621a334b453acd29b2734d380e20516a6ff0a6c0cce30ae51dc364d9db57d59a288f812a13dc11d52a3d9e263e1d14e9d6e0f6f120dd05d47e8a9f8a4e65499fb8bb4947f20badb8c3bd5335d7a32e8dcb18a4bed2bdfbf50c29d7b990afe4ceb857f8f2ac249a4a1374df309861cfdeddc6e0917c82fc2e1d2fbfc75391e4a7c760069bb64565d771868583db7ad75a227171cd62eaab9870f61bb050c60e4b33f716d986d35bc7e0bb0f78b50c5faad1c4aeb6c2430b76ce51b0f544d9c4e290b10339b215de8083af622a7ba1fde39301e7760778d1ba0a8de52661c6d3ec81d4d48afaffca72d36c7dc5b670cc36f5d263ad0cf72c3733594c1a3634255becbe01a91807147b737f53a0b2b9fbb63753e8e7bd91dde8f0c0b7e3de1885b72560f3a439c6a41d6f78c98fdb3bb04b1b469d8e9bf0ca2c86d8eeed02fd77c6696d2626da28b27f4065b5ae83c2bd76a38bbe8e5f59ac10ebecf3633b6a5d1517750785fb1bc14e9c50af6c0a3696bf9982c358e6032e30d7e7553fc4ad1d5de2fa297ec0351e5dfd8591efa6a30e1e631dc07256ff0abfdd8142a7540bae5aeddfc16b5afb2ae56d855ff082d761b86c935b9a4c7a401f949d216d4f9d68be98d1b6724e4e7cc536ba35b830e49e48c067f54a9fec319b2f1e6ed9c992db73f0ee7535c31064b69e31c4cea5c84df49ecb12e869a170880fa0bc1aac2d09be2c8a8d0c9932c00bedd74ef0251a302d3069d8acb946a6bba0557b5fe496d0a08b7f651cedee44d0afb4d9ee66060366561af051f15c40b867f3d2a7036b4772dd6ede44c859eedd482327ce511a3a3cdb1ce7630a4767ef086608e5ae9fd1f59e3a1b98ac85e048d8328b30b171a5cb0e871cbd84d9bc7aef90f744648e4f69af9d4b66d2405eb80a93c519b8bb0df64b3c0a00cdc0075ab6d853b716c5398384bc18346dc6c953d847c6bf3e9bc964bd88fe93d85956bd606517b86b7b329d94b4119503435297588e3fb85bcd9d32dcf4c9424de1160207cbe2b702ccfd562f63303850ab4b3db82bc58130e74434dcd9be2cc03fefbf3ad2d8be60e4d12920f51960b0a89bd6a2ae84d05d518c5e3b7b849ed2dafeb1bbc1bd6d2dc4630ad91bf4a5de86abe065df05259f84392744c32a3706104266fe3769cb3834567374ea7f2a1eae69b7bd0191da6f9dcb6a3d7a5c484170895a08e0ecf9aae702d9de7e1b5be608cd13814035747830c399da985a4891d9352442adaea85a18f9169492a188fbacf4412ebd42983ed15a29f5faf4a064069dc01465bd4f280c4cb3b405c69f9b06ed5d9d9724834693a0edc5b0ca21eeb9159c0fd62df5f059a0ad1a7479e3fafe7e0e7869c433bfd86a1def995424e0ad2ed49d26e2f2d708ce188b37b5e45a061a036916427dbe049f76567a6f8311ade3a24ac22c8cd383bd42063bdd6294cdcb778e1ebd04a76eacbddffc055d99ea7494d9d5f627ec80139ca6e5711fcc6b6e058c75ff0543ddf1b61e67b7605c9380b863f9503617794e62d3113adbb9891ee62677daad8660599ec3515d56311bde359466539800d8b996e973a3016457ac853c321a15b4a6495181c0c3e33d4e821f4e4669895032105e1be850f6421dcb4e1b7ca7252766ab065f3826bf8125f8c33cf4bb98d356d676d8c9175d511104bf530c9694f66884abab8837dc9bf0227c6947228e5382f952949ae740b141729db80e3c4dd295116b4fc3846eba8cb175ed9bb7dd4d3d9b9774ef2506b7c82606355aeb10858064f9c4a14c77521dad4ed859fc6de3f1db39b6bd782abdf1256712409ce725ba100391be253201524b2bd356ad612fa7f2de849cda61a3f1803651532d6d94622e799c75cab6d4ee6d35460b6fe7a3fca8ca093c251920654d56affac8d5accfa088a51b78dc86787c3746dffd5a534696dbf9d8bf54301e96f327abefb64d8e89bd76fedaa79336dbcda32a92cb7f61223f24aa4100d7c6f691ac0413c3918593727853a8ee1889623c8b2a870ec7bb23b96acee13c09759eee5aafce08301b3c3bedd39acba4c9adf9694f28032645f4fcdc77c18a1453fa59434d6ac3e324621f75e887800754c05278c4ddf006d1b016aa41b190d88d27bc81e89826ac27915a3fab1d8150de480a47ce78abda03ce32eeed41df3f6702d38a9c397f7d505a59e080a69fbb64d6e01c7f329f884da990092115b6a0782c7a404df7f714b847e047ff80f3f697e5c461bd8f0703b6d89c6b36e7a67a5155bb089656f0837c0d061b62e20746560260dfe5893ea69100f98721cd7378cc1d29630e241c08fa71435ebd9fe18776f0d0936d5e428ef9b2cc18da55260b83f9080df550e37b9cb2db7d34c6e6ea60bc33e5874074e208b02fac50ad1a138eccd36d1d604bc53e7633c370165d7bea099fcbe31a724ca518e1c89083801e6d8bbd36166a2d69c85726030eb898bd7231fb8e1b231f34b32f427cc4419dd8d2cc41da2fa827601ff34a17927cb25fb3d9cb1433c0c7a6958da843d74272619c91a7369854512502b453c146faa779c6212175cb6e45f196cdfb224e718addc0e2f5f2f9bba62eeb44985b6048114c7e2a8cb5c36f39e34cfbb96bc2fee1cb176fc9d3f12bee04e5351098b256aa217129206154cb73274754ad442a0fb98c497f6986cb0fdbd7822289acb2dc54393158f3c718e866e7d4f59b33ebd6073f1b94dd8ee5413dbdf0353ac35898a66e0deda877474654d9fc7a03291199395f38b84119ebe58ae0ec467b5a3485d34ba54e71a597b2f7f793c5a9df04f36d53ee5fa3c88c912aaa668f383b18dd04ad88e17892831de2e5011bcc4780e320273be92be1231ab53108368e24818671f618e905ac5e6a8af2b5dcd1a7b4d0f9f3c07a7fe6566c61deea03bf970ed385584fae037bf764dfc1cb728596e08aea92c4c4424679f2fe6102ad90f9d947710939c79eb0fb022d5da98018bc6419c5c3477374050b1fe0d07013d3e9cc584ad52712a21f989dcddf42bcf36b2d380cdfbda1acb56f41682391e9ac9e425b430896ea37f62285f0ca5f3785078dd62c37ba082e2c0d9c65a6950552e24f3a22164c4b0691ace5779c9c010faeee44989ff4c240b4c592b3e43742988708c8be22c5acd6db6f17baf8d78fa51053ef02763b6263949addfd9d5c98cd34c044dab81bd6a0216a93edd9819be6e9b23903d657e9675f2af8fb06cd7919c7eae81da7699b93c0e8d061610f5e99196f0b2e0eb0884e337567150ccf2627e5c1b9a11007451c0eea7f181b1de540cb8b0a4f83edc73244131433daf323bcd13e9016571e88ae5691a41b0eb2d9a85827730a61f6bf5b82a9b076a7976224b8492a46c2f15775597c80cf683e868bc444ea2764c8a04f49747be18e1cc0a59a61dcafa9684ae4eba675a7cd05a30b0e082b948020a95c5dca1b8d5bae0c4200307e02868b8a18c78715aed4b9f9f406c7e76de396e00f495d72d7a07cd5215d5f049c63e2c4762f462b62b3902e1319ae1911c3af54591692203b205e1440389a5870360d89513bd2f30e327db37e39724dc58b272ce54a46a25b9416f2756b512a8a8f4bfc88d18bb8910716cb6ad9f31522e73a0e53079760f9bd9b6503baf2f5abe365811c52d2b16646bd445f9f1200c8c84cfa6e532206bcf49c6b9508274e591dfb21684bb938c37b108e75251c7e3643e17b14e363687cc79e071bead8237b6823f29ab9e790770d113e65923340d23e3350ae8566879fe13198e7ccec8df44cd7720520eff7c80288770050e626b62b7beb35a1887ed9342ac91779868e969a2c854623c49bdfed5445472eb5dcafedee0443448cfd4fc06f92b4707cefeea89c3236f0fb34d7e37f0fa9322ee69ecfaf3f2538cc7e9788da400f34b0ae2a49dfd5aac92500565e2047835741d1689b2e455a80dec28da7b392070b4d97ac3627bda37fd8fe9296c391471e4d12b969e4920152db5ab358dd962b990474ee2d07b320ec2fc1c44648ba11fd876d7d211eeee361a679306c0a05ea45a7ae5710380b6b1a03a3c8c4786215cf5e6986c13dfbd16b0f7947a101ac0d420e1434e882b204e03c9d3081e296da60cbeec90a3522db9adc610ff8969a6b8c6381c3d4543bfd88a2f69d6008862ef0a16fcdfdacde40606d0a360bcf0a830a9535c2aa1aa9ac116a6d8d505d65aead11eaaab674bd52e58ab946868e71c1ab8bb59a597393d875f12c9b97851999496f4c15288a761c5fde18a8836344f80f0299574c1b4fcc18ffabac4ee35a3d31653c314afc49c72166f54f9142686a76012d8400caa2f5eac2ed1b79476d824634a0ffea929ae1bc000b33b6e004c142081636aea8e18a17aaac6e1c31ae66715e219b978a0ba699947b4a9295374bbb66a93b691b93b88a0fec8c3685d014194ca1f3df93628b14384f0adc5f5dd73cf5c5b30ca04126c792286cf811459020393c2d382049cec0e2468edf83c100f76070e11e0ce63d18c47b3048b907c309f76060dd8381837b30dcb8b72505f7b678e0de1632f7b658e0de961eee6dd1f27f031d1af8e8400b02ee69d9e269d974879cd32e6e4ebb8071da65cc69172a4ebb2871dae5885359cf69972ea75d6438ed5275da25e7e9f8c80efc23b3f84736f18f64c047d6f08fd4f28fdcffc8da3f12ea1f99f48f54f28f6cfd2383fc237790cfd163c78e0cdafccb608c7f197cf12f8331a76f7efe6550458fcf6be29f37817f9e977fde0eff3c037cde0bff3cdd3f4f85cf9372fa8606aa23e6548789531d089cea0871aa6380539daa531d2aa73aaf539d104e75749cda50c1a98d31a736c09cda98c0a98d1e4e6d7039b5d1c2a90d7d6a633cb581c2a90d28a7368a4e6d0c9dda18726ae3c769ce9bd39c139ce6a439cdc1e234e702a739459ce6ecf0c1073e40be9e9e2c63de938589f76481c07bb208f19e2c2fbc274b95f76489f29e2c48efc9c27a4f161eef798104ef79e18af7bc80c47b5e90e13d2f6479cf0bfa3d2fd4def302d37b5e107acf0b1bbce7851bef71418df7b8c0860aa938826010667c4f18da7bc2c4de13e6c97bc230794f98a0f78421f29e3042de13866ec0c29a7b2c8cb9c7c212a73700717ac30da737b0707a03eef406dae90d51a737309dde70747ac3929e1f3d5444bc876a87f75021e03d5402780fd57e0fd5cd9b6ae2ded4977b5345fc03d2c13f2038fefd38e3df0f11fcfbe1817f3fb4f8f7038a7f3f2af0ef8711ff7ee0f07f3f806c16ee6ddbbd0dbbb79ddcdbadff1904f97830fde351c23f1ef51f8f20ff78e0f8bfa3c17703c73f1e34fef17c3c1df8c7c3c53f1e32ff79fce0797382d337659cbe01017dc3c5e91b32a76faa387d7381d33710387dc380d3375e4edfe870fa8686ff3f3ea92affa49afe4925fd9352f24fcae79f1408ffa47afc93d2f92763816c8dec03ff641cf827a3e29fcc02ff640ff827f3f24f86807f322cff64b97f322bff644eff6449378050376e4edd983975738153373b9cbad972ea2600a76e68a76ea49cba513a754374ea66c8a99b9dd336679cb6f9c0699b31a76da0386d2381d336429cb639c0699b2ca76d6ea76da89cb68172da86e8b4cdd0691b22a76d32386d83c1291b179cb221e3948d17a76cac386593815336113865b300103e1012a4c70e1c6c8edc63b3bac726c83d363ceeb1c1b9674609ee9991e69e1954dc3343897b661c71cf8c02fcdff1c3fbe1e11fee611bee6118ee612cf730790fd7ee612af730d43d6c740f07ddc344eee10dee611ff7706feee150700f57c67f1c3a7afca06c70a76cec291ba953364da76c904ed99470caa6c8299b11c63f97bb77c5b8773970ef4a71ef2a71ef227183b87769b877a9eedd7befcaeedda37b17c9bd2bc27f1e94cb16a75c3070ca6502a75c1ac06587532e0638e592e5944b3ee5624fb9449d72593ae55274ca05c92997d62917114eb9f478c00303fa44ecf409274f0c9d3eb13a7d42c8e9133d4e9d58833a81825327baf8cf63c7f7e4867f4f62f8f784eadf93f1df13a97f4f96fe3d51f2ef4908ff9ef4f8f7e41a7c6570705a06ce2919233825e30b32c29c92b1c42919469c9271c3291953a7644c392563e9948c124ec900e1940c1ca76b5a70ba66cde91a34a76b3470ba868ad3354c9cae81c0e99a1b4ed7ec7cf4f000c80d0e680c2c388d0104a73174711ac314a7316020c84745ca3d2a4df7a8bcee5109ba47c5837b5478dca372e3de1435ee4d49c1bd2923b837058c7b53ba9822e6de142aee4db1c0bd2945dc9bb2c3ff1c1e0f8f1d1a129d8643a72191d310c869f8d399094e67649ccebc389d9d399d39713a3be274e6c3e9ec00a7b3164e67f674f6743a3b3a9d29399dfd9cce38389de53855e105a72ab83955418c5315b8385561cca90a52e4e8e1018407511aff884af08f088c7f4463fe1159f18fc8897f444afc237ac03fa223fe112de01f110eff8868f847b4e51fd1ee1f11f98fe8f68fe8ca3fa2d83fa227ff884af84704f48f88847f4444fe11f9f847f47f4d4ef0af899a7f4d3af0af49997f4dc2fc6bc2c4bf264900b981c18d1f9e0f1c54b6742a333a952539957d702ae3d1600d12f7d6f8706f8d0cf7d660b9b7a6bcb7c6766fcd94ff3d74782880700f057a0f051ff750b8714f4a1aff73e088c2e45e9410ee45d1712f8ace3d2816dc832ac13da8306ea809c13d355cdc5333e69e1a2beea971e29e1a0bdc5313817b6a8eb8a706887b6a74b8a7c600f7d460b9a746df537371f0f8a04ae44e95b872aac4d3a91244a74a203955e2e754890c4e95b071fae58cd32f659c7ee1e2f44b16a75fa838fd6281d32f0f38fd32c4e9171f4ebfd870fa2586d32f594ebf94a75f6aa75fa89c7e713afd72c2e91724a75f5aa75f40f8cfa347c78d2f090eff9218e05f122cff9294ff92dcfe2551e15f12a97f4996fe2539e15f1225ff9214f99724c8bf2418fc4bf27f485ef00fc919ff90b4f987448c7f48bcf887a48c0f1d3d6e7c8174ef0b13ee7d0174ef0b11ee7db1c1bd2f80dcfb22c7bd2f72705028644ea12c710ac5cb299419fed32065cedc2b23c5bd3215b857c6887b656eb857e6bc57a6cabd324d403c0e9812708fc900f798c87b4cb17b4c483cef8022219e2251e51489a853248a4e9140728ac4ea140921d40bdaa91750a75e189d7ac13af522c8a917189ca679739a0605a769c6384dd381d334634ed340719ae602a769bc9ca6c1e1344d0ca76976a76956384d23e5348dd3699aa3d33443a769889ca6d1e034cd8e53342f384563c6291a304ed1803945a3c4299a1d4ed16c3945c3c2299af2148ded14cd945334b05334ae5334ac5334209ca2f94ed1f09c76d182d32eca38ed028c9e0d7af0c880070dc201060702a48726ded34311efe98186f7f4b0df638603ef3103e63d669c788f1925de63c688f79801e23d666c788f9918de6306cb7bccecf798b1bdc7cc95f798797a8f99d77bcc08f1c8e1e4857b4ece7b4eacdc73b274cf89917b4e82dc7382c1bda235ee15b9b95724c6bda233f78aa8b857a4c4bd2207dc2bdae15e11977b4555f78a7651aee876afa876afc8cabd22a87b4500c84177e0f0a19383c8ac872b081213dc8cc10d4d6561020ca840557d79fac1858320ff0f04061d61fcbf11056c80c73d220eee11e9b8d7448d7b4ddcdc6b12827b4dccdc6b32c5bd2615b8d784013dbe238ba7f68ef822e8887704161d2e34d840430d08a0a1062e3570a961861ab8c87080196890610603c8c0458602c8c06506196280610b010620002d59b464d192258b962c5ab20c41c47fcbdda6baa427841505785ed290f7051d17bc58cf4beb7fe865c76b10260883b86289ff671048ec108641b410c4f8b7aaebd7c152420b2b1d16aae4f8e17f796f013f6813dc8d48d5fe3abb5fa7ead7a162ad409cbee2986b574a28b4a48e5043d3b4dbea7459b4424b621e10278040ec00498ca97e30f3c38e555b559a884d2a9be78399833e44c0072e58e70312f601841ed0705533db80ae597a3d30c0f680eba1c9ec41484e120f1de0210a1e2cf03fe75d5b7a1c6d8d879c2d8ec3b6dadba169071cb58b992e3898b8bdafe9758122aa15146bb6daba0401ba66a9031895025d7420428704e850e52aaad5a5c3930e4b6aabea002487315ad549cbcbc106b0958393cb85430e1e0ed7255e9b4c490163407d496c425559273064ad5cae5f3abd52b2aac6ab7abfe58acf159e6acdbb84789f40618a3fe7eed828ad8ecaca09bf0e921d0caaa451858c2a5e54c1429bb9b6742ec95a455ac5ca4f95c9ea8213570bd5158695c449529862b024a524a42a07c1a0aaf1ce53f696a57ded40a960d09a77891ba6607150bc34a8294b53904cd159410a65d014c8b02a89eb08a335af2b859d42134de1033b9675891b4a1d46018b4cc446b52b451f494143ef6e4e8a987f7773456a28325d28e1cd593d2373b8ef8dc434bccb9babb6ac7dae26f1edd2448c33f5d530bdbb50326c77a18822d32bc368ac033b9b20d0cedcfad6485b7772fc3b3b37fe1d9e7f67e7179bfb3b3a97465113a5cc8f9070da2e45d15170a75188fe5328332eedeadd6285ac55b8da1955d0688a5252929178f5befa383d502850228522048a8e9f02a0c87b5891056502a3eefca482acd92af7c485cb5574b535aada56974bd684a84965e54cc1f4e3a04866da92174b4b9c20e57f2d22aad575239700a3286709006f9977d6e4f409185b13d50cab2efa0402d5f524c9130e9ee0f8af73aa1402252c4ec8bb56d7717ea52627484a43f4d998c417d7d200d16002a34930fc55ef6e2edcd1603819d8b1d10516a132d4550692917f4850123d0a013d1a8facfc4f50570aff4ece0eceab6ae7b4dd46f48e36cbd5700ea733ed9ae4994991ccb4a0a1a12354364a64aaba2279c5b5ad9856482b362b342b56ac10b1d2aae2c2710cc101f2e8a04ea0f835256a821265306bf2adef94dedd1975e108e1d4842d6ea38723316c18a12313e39fcd4ce861c28e7f08216e630174c90a269ec26679c5ddcdd18e234509553325657e902ae9a2a4004a9e58ab3ada73aab256604df22509016892f2206bc55add48b2c2c9419148b161a748707f5113194e11392cfcc7d109c169678c76ea1c3249489d1e39811e61d12341fe0fa93114c6ababb6aaab822d9e9c212270046b93c6d1f766cbd25e9ceb38b4ffe469501a3408061ab4020d4a811a496304cc5f5d366ee4f0e0f0f0ec00c9b1a183c3c6ce07e48a7aef0a1ef7c2a8712f8c9a7b61cedc0b53c5bd305fee8501e25e9803dc0b33c3bd3058ee8509c0bd30f75e182bf7c2c8ee8579dd0bc3e45e989f7b61e8bd303dee85c9b967051af7ac50c17f10e80e0e203c56e0dc0383827b60d88051730f0c1a301bb807a68a7b6096b8078601f7c0f0700f0c0d3b9480e0032dffdfe291f3e3c7c17990137844e0c6ec8c9d333d44415a7ea431c509529c5049d141981db4ecd860866a248a2c126881841b1d681981880952a0e1818667c7c7104e2ce9800a172c41916809e40aa8257428e025051228580861a1de9382e75e1429b8174518f7a248732f8a32f7a200732f8a0bdc8bc201f7a210e25e143ffcf7e14531742f8a9e7b51e0dc83c204f7a010c13d28bcb80705997b5060e01e1413b8078510f7a0f0e13fcf0f0df447086b0cca62c0eee658fbd5455938bef2b242e283c6abcb078c8f0daf2e1f117e12a4380929cc4630c1081538961190e808f4af2e11c0f88c8a90c45f5d54842dc209d54545d831dbf706a6ba42c0525d48d515c28eea22b2c55f5d3ea7448a7875edea42aa2e4a8456171d52c638dada90248660f9ab4b85d321f4ca6985c0ff8a04c2163f0561a4200455171a7f7549f15717fd6086bfba3e905517fde0c70c00a71e3cf157970750a742c2f82f864075193915b25f5d54c89299109deaea404c7569da41f89f76d0aa2eca81149a72304375510e44a01b98413758e2afae1c3de80650348819bfcea42befb334aae9a441d305175b706003674eda158d6830010d8ca01a78a966cafc3aab32394c3483235f699109d479eb125f7ba9c2b0d49db4baefad956315bcdabc782cc330ac4c58452a13d3e95ea5d1fed4227555896a89f76c64c22af15ed5465b9b11ed3b1a31525b5b9f661886156cb14abc6b262bd06e34ed8875a70914563297ba5cb33a0c439d899478d7d19edbc45344eadda7b661c55120608c59acf0eb18f1bf76a7aade5d285adf5a55d24622b19378c79ca1a444729f4f22b6d4470c4f02c7538775968d106442c6a6256f4d575b71b533564121579050b565a1abcd4c555b24b6b820a15d83842a78036995aa6a1b8e53596b1c92b7cc61252dded604ca1b488b7797b99a78631163d3da6ad6e368cd3b95443b75cbeaf2cce6930a42a9b6bacf6c6fcdc4154c527ac5762b0c6b51996f262d8f1a6b4b45abba8e3913b93a7bc3394dc4c467992da87d42a030acda47efd0691c6db84ff19565e28ded0ccb30f189eed4e1287da7ecd2ce307d33d2ce30d21e6927f2964fe6937973350c6567d8ceb09d61398da3b2d18e7c5559a73167a82cd3463447643acdf9f19fb5a23858dc31ef71a4385bee72c9284e93ef48fbbfe9f465b85cd9bc54f678da3c03afcb1573b9644584f4427e6d6672ccb97a6fd2fc419588a8b24858bd89c0ff9c3314ed8ced1b2b7386ddf148df314791fa5e53698d24feb20a2bd6d0b2c6d2be3a6b5aa83570fc6aa4a17737a7c605d480801a3ea8a100356250a385ff699ce064b6461b43c16252a09456376315c99ab85c5147f5a712d5b0823730a982d5a9b6405b5adee44e87b746e659987b8a12efed6669376a6bdc04def06e8d9bc2baed98cb96d6b88650c1dabeb52534d40a12aa66ae4122aee49523b535545b4255c2aa972019028576635550d0d090c6539976cd53bcb51a2251526f96b6cf92b5daf7e672e99b350af51d4b9d256d4ddf2c0d48e7c29025548b54591dc89afdd42bab4a4454af08d5223557256ce98b4d735f5dbeb76a37998f6a0815dc8d996aefc8dc22b3de29d1429db6b62aa9865041f26669e6bd65dde725efb665d70c08ebae9e51655b4bbcb8927ae38bdb5b8bb89226264f267d666cdaa9abab1eb1ddfa6669374babb99acd9178ac30128b997c55a84d5e9d88b31426f296519b344fa328f17a273041f2561bae9a344f23f09ab6d450a016c9290c05be6af5a9a48dd5f6dd55bb336c6798ceb6ab81aac8042526dac0228b2cfe0fa958b054f156a2a28a054b65ad3406ef356d5e0982ec461278410233ff7d7c7c7c2a14332b95522e17097e1c149a9ae53d0b9aaa51b319a8c77134710de7125b4cab3993565b275b1671f509c7d11ed970dd91f96a7d8a585f73679d2aa87d70359b544171cc7ab3a0aa5e5570df5c4d9c92aa64921e470b25922493a8f114ae4647e215b185122fd3be37f134027577a465b334cf5cab601856709f7967a170a6da1976a7b0269976166a97a79923add1be537686e52cbbdb36e5dcb4a44d7056b46448e86ce2728941458c251f42e2aa6d8da4caa20e993143427890dbee85c0865f9ba3ade5231e50c30d6198400868b4170b31bf8e165884a1a28a29c24c91c5af8345155468a00a30585c41c515617e1d2bc05441c575a6b828be44f19a27d4aeca0341e88160c91225214edba5b0b6940895bbbdaaa2ad377267c72b025d1dde5055d689b5027336d4274e56c3b10459bb9b5bd596a8cbaa6c96b6f1c6324cbc23cd92523bcf66b39978c59b33ad0e0ad585c53c2f745e24a57103b524492c06625bceea6ea9c7da15eb6e13515a92446b22353b9675499258ac8a775bd0878604de5c9eaa91e7d2aaba340922c6853adbc89dc96ac395b5aa578f56a982e1d091330ccf7b9ab21a86ba66b26e32ac21abea8a2453b8356edf11a8ea5bc3e5ab892d5b56ddd156d53a8d24b665a07de69aabb2111089a564281b892dadb62a588661acb2ecb6a5d5ad6a05f52dab1e2d0b4462aaa494f81af111129961bb96654c59a6c57b61576761b55bc6784600c59278035099e0ac364f7c04191b0820003224194b860a9928649a90719131a1cc01b5d49d62a8c7aab16e0c5dae300cab0d8bb7b6ce5b2373cdda9cadad6bda343e61a4142c238de3a9245a23bbb4336c0747c7e9fff9245e1d96914f24be61f329db4826316abc4b22f912af79c57c94245e3064adb05d61b4d7244f5add1627abe46dba9db4db4993ba36fbf3b333f9f3533352ad21541d366f5975a7ae68af0edb3c8657ee48ab124258b5cd59a70a56d28a599378b5dbd80c733937559095abd91dc2ea4a1d475ba55edcd61657cfbcdba6add16ead3c73b5dc049e345bcd7b25dc55492e575825d716682f0dbc15dced6eb565506cd5ca17aed5965f2436b1b97753f6e22a9e4a12730deb8d5443204f9d2ed7b60f0a15bc269548e28a59b06315efbee315b1cdd2ae59992a78a482151caa2028545de3986b96555b22ce3f3f354ce69dc9acfbf9a9f68ad9ea976dbc31517ceda060249396ba495a244f4c5ea45b3333c9e47494425286e91a2e63514a5177c43814c42bbb48623eba623ec2edf22269fb641c2dd555ca59b623ad5386899bc4f585348e2f00ecc6f1457561baf18ca2ba305a02b104577e701c5fa0cd6c8a92aa34bbad79ab64266575977154b7dcedbd2381742e6dad824735a604c5542f4e06b5332cc3601aa7ed52ce4f50b891fa25dead71d3ce30bbadf9242ac376aed90cf6c4148b4a923273b9608d086015efad9d51e603221003d4393f8800f77f8893172a82201c231a3046191fc7178e123a4814f008fc973acd028731c48f51f44b6624fdcae285b2bb50442c9e313524d8dd9c9d65f1cce2a9c1d8be31bbc91b2bb18c498fe30b4a773753186a8431268ca95f368ef64809d4d7665e28701c6d4d9758465e0ddeb04d97964a57bd54c1506462aae02b6a67589575b2db22256d123b9178675886218919b7af5369a962ba497737d3d6babb8b9a680d54e29cd6b98fe370f1672e40d8c2015bf400ea6c1d479cd3e7bde329e27ba7844021a0da9d225306253300f22c2d959e653102aa012d1a40f28ff019f10b801271c62911233825c203a7449c3925a28a532228704a4411a744e8704a8497179c7a19c1a9170f9c7a3973ea458a532f1638f572c4a9171e4ebde470ea0501a75e6238f5e2c2a997f3d44b79ea0577eae5caa917d9a91728a75e904ebd30f90f44074f0e5077457933edac469eb62b9854d7589e5b5f599933a9c449a8dab211764252415bae4d494ed59ee2d192d6dacc4a1743d99e48ab6fd608691ced110ab68ce923aded68a4afbe6286d99eb4d666568ad2175765d9b6c1f4986df7ee2c94dee4abb44e1ac9f6949574ae969bb4b6e3911eb23dddab445ed3f65495a964a575926272122aad93eda9c9cc4a5a1cf392edc9f66466a56c239974a7d64e4a844aeba45128cd5b9eb12be6a36b4289a494ed49d3ce98de5d28bbeac2b4d646312d32ed76d58599599be79169ef787477968224326d3c9631d1b4226977ecee3ce572ed2c6501460c408aa49fcc58e38ec42b6544e22a0b8624b64edae2aa99b7add526d376e92a1d6d9a1338dca7b60470ea048e2a2bd648316fb15ea726b268228a2628d0c4114dcc605e1f9fdad2425343424c10e03f4895c7f12a854a61d5a32ed4ae21212726a49820a24df03796a0b2440a4bb896008b806aeda187204c701e1b8947aabc13ed8dd264c637dddd4ce479bb46f74cbaa2758a8a32cd7c245e6dc10c0592d88ed7bc66be35ad6d1671359beb1ded6869a7ae761c6f4d639dae2c4d628b3b226f4edbbdaafa9af988ea9219f6626aca48597623314e24a5ce2771cc31d1bc534f1946dab1cc9919855d9ea629e22c25e3bb779ec25064c6376d82498c439c4cc08c09a019022ae7386e2660af4d232f1d96e1e4208128feebd90daf70cdca24a81631112f4e9fa5049afcd7340269d82b424123e0e3ff295657d3542e8d88f7a8c4b212cba82e8c3e803ee00a7d000fa671b4476089b72eb10cd425968125de37df405ccd82f79e77c4b6aa73cb485bdced5541bbad88f31969212be3a86a6b158a4ebac4b2aabb261479cba771c43ba6b433acc4b21c2154882cfeeb1ca1c508141821c6f7358204238218c1a388358ad8e26015af5941d9beb19c225a84907f2700ff71ec9407c7f1dc156088247e15fee3532176fc273a1d2285ffd9bc2cec46bd31adda304e97789778ef9a12f00850ed8ab90674475bd340b5d99873b993ff9c0c907f958867a269cf5bd2f904080b573282100e109c2146e4a911edd4a8e9d4c8756a544f8dbe53a39cd3d71aa72f159cbeda9cbec2387d6971fac2c0e9cb01a72f1e4e5f349cbeb29cbe56387d459dbe9c9cbe844e5fabd35708a7af0e4e5fdee92be7f484344e4f40c1e9096dfe7390818701cf0f647ea0c03f8e670e0f0e1a2dec00f9b1e343a7849d1e383b74feeb4e7df0a28de4acf1e1045b234f5b585d60f430e63aab1d1e1cd06941e74938f1e141e9bf78634eb24501e989292a096a96f4e415f5248bcd644d522fa52424972bbcb61dad567d33edb648e2ed92e4ff06a75d8430a94e391a25827f67878eb36ad501091d82d06187a87bb350494f5020697535d42e973ef36ee3db1d75f7ace23d5be25963d9327825b43d91b7a9ca3a8555ea8e365afdba379b7149e21b6b55b7b6328d91a2c43bd2461c25c3eecd42655802cc68f3ac619a001bfe5bd1dea55898002b234e5f5329012d175198805359d990053865c6f6d5fbc6c09d477d7536f7aaa0366f14ed8c1dd11aa030ed58abbaca3a81bade485c5bb65c771b57c12aa8abb24e15c4e62631996db4538b35acad519849d65813c91ba66d53e716c6af0a6e7daea0cbe0c69508edd444465b366f79e6a0458c0ae569b7efc6dbbca5999568e79dc24f60e2bd4a3a0bdb19964d33e98c42959beeb64862ce4f48aa4c42b923cd4a651bc9248e172b894ce6684acd00fb2fcea0430a899dc03034a92e8ca9da9ef6f944959bf66b67983593c42b5e16704c4a6cdf1814b3a63192383e89175b286b26511898bed8a20126b63460cb10386c11c096dd96710b0a5b983e9b55599d1449bbb91d69936c18eeb205449a5929672fd5cd42852e97ccbcb68b044e91676ed9706ded68f566049ad976ad99645e286d4d70d7aecd469571ba86bb3c4d9a9dcd6e24defa822128de300c71bbbce20ca816d510bc205305c3b0b6c2aa2b6adb35a15c616d9759a9823b90f553659dc255ad0a7fccacb4c9d3485871fa46e2b0da70156f6d553568af842e5758a546ee7425b1b6b47de6aaad2d75056d20ee86cd1c5ea94c663712df5995b0bab413107982acad7567cdc4b5ba33ad3577552dbca6356f76920531f99049d556927647134b7cb350d9c816c9b36a922ac35615dcfa66a1c2da295e09ab68f1de2c14697555b461080289b695455b3e6dfa96a3ca3aef6c0b2b12a1a9bb7d486d714c2253cd8d272d676b5205c32bd64c6a2dc9a092906653a29e6431a6a50a54ad995425ac2466dd29bcaf8455c02ba136335315f382d6bc383363aa8c6b59f3d64be62ada3655d0bc3a33db5caeb0ded2eaaac6ac15c85a997763972b1c4bddbe3ab76415b3b6dedddc2c34f1d5d6bc12da9dcf286195aa7d80c84c9656b7bbbbb185715ea1d4ac4bb32469a956b45dade66af94a1856a93bdafe91c5a49c7e4e1c91ca5a65b2b6c2a070df319b448854f18ea3bde4d6d746b5c2edb4bdf59a3ebbda95b21b69b896c9f28a986a1c31eec81a694dda327623f1ae4989e4cbf69465d6ccb06b66272d5e135b9c56c105154a12ebaa4290c6fa0a1ae59532579ab8b2c41fe701b2fa797c48f8794610e1e70981c8cf33a4fe3c207cf0f37820e4e7e980839f6783203f8f0619fc3c1ffd79bc9e9f07c88f9fc7478f9f87c78e9f4707063f4f0e1e1c396d756fdee4b4dd396d7524be5dda9520212e64b23e774cef764e5bd9983354cddaf0aca69be1c7ff217bc990d0696b1a3bddab24c3fd3f196efc8be105ff6238c1bf18caf8bf636b3cc26ed6e8ea6c8c64c253314cfdf74ee1260d8311ffd091b326a5a8688992264347a4766bc9d964eb7bc3221225e71573ade8db8281717c298d390a1f09490992828bc96a77eae5d540ba2cce40002e3e023c71f1a4d55ae67ae62909f808707fb3a3adca4e2c33150650817f080c0285a6928c9ea264b110e7380cc0d1267869d9dc3a083c0244e2d1bcba9d35d4f80620844b3b1b0291804140b73ccea672a13e2dd0ce0bfe1d17fc3b2d406387cc7ffd4f00271c9b00048747065a76987a7d5a5ab92f8b142c58c1193b59767654f0efa4000537d6f85e787d2efcf0b970001768a83b5aad0cb8e1561e002e391ca1c40fc57f21be1654c044a8023119d2f726de14be16b0fc63a18c8f05313c394384a2fe0b090121f90754e41fd0907f40f41f508e160a747c4536f0afc814ff8a50e05f1122fe15c9e15f912dff8aec7f456cff8aa4f0af88d1bf22ae7f4580fe1521f2af88907f457c14c1f1af888d7f3f6bfcfb7941063c7e56f0ef8704ff7e40f0efc7ccbf9f2cfefd58f1efa702ff7e82f8f763c3bf1f2dff7ec87f3f54fefd2cfdfb71fd0cfdfba9ff7e32f8f783c1bf1f9e7f3fffc742019a7f2c0efc6395f9c79ae21f2b897f2c2fff580af8c792e11f4b003b783c9d1fac0ffeb17cfc63f1fc5b9df16f45827fab31feadc8fc5b81f9b77ae2dfea01ff560bf8b7c2e1df0acbbf55eddf2af66f75f46fe5e4dfca847fab211f4030d840874a082a1b3ee456d6aa227d5329907926de286d8a6638cb3692a9b51bafc647152473254f13ac56675e1978454ce24c8ea3d5e5bdb99906592b91cc4635bc497bc3b7ba3579f511b8ab699f4b9e55fb9455b7b634aebd44d66ceb4b9b8d96cca55405595baf5c24936e67bb2d925229655ed134dafa7412c96cb4b35054b9294bc932299d993f5ffdd23da12be207af54a99fae04f3349d8e6ee46ba7d39d48fb6aaa580e0b2845df1ab6475419c6a46d53ce515a8fd649ef2e14b1eac286ee7846ed2e945d756149bbeac29cf4c54c3b8f319cb64b4655d6e98e25366599463269d19a49dadca4947849d28e7a3ca374dee7ebd6481c1b3a2295654eba2c92d60923555d1dd3178abc4d49e3f83a91866ca614a8524a9b9724cf286dcda45c4daa299674b1bee4ddb6c92957cb636c146fd585edaa0b336d9316b191933ed24866d6175f6d71505bcbb49995cc2b5e53bc349b2d8f391f814062c65609046b6bbca4999b40f1e26ae46947cb5a55f26e5bae54792909bc53e3de98265e91b4a4ad35ef7163d64a34732dd46536a1c20a54cd5c9984a14541b6b56d0a2b5075edabc322d5de7837e65deecc9a79411eb488615e6b719854411a79caaecdeadbba361b935550aa829ab5326f594a5d32e77d330ca7ed92d3ad51e5261bc944667c7396565d514f515149f588e9c95353ac84ff1dfc8b098942bb36c1a816fcd7f91775c61735c60762f1b76e2417024429c0ff0efc8b1202f10680498e1c39726020e2cae4de1893aa7babaecb55b4444926d5e48b124294544c8ac8b42492b8a66f94181525b5afce4d5b9f48e2a5ca2299f474c53548ee93561b72c97c7353d65691aaeb9278acbabc7736aa60de365ccd53eb443c75e61d53056319a9565bcbb392b7ccae9cc66625a97235cfbc13efacb6b27959c03f3f439ea292a854d86b4956a39ed424a32a8b49395590bc65ae15b4d76c8561b5da14b10eabbe365b36aa6138a58661585da8b5a8c86e8b545b2253abd5448771b1d23a11d56be65a6b0bb5d63be252976b990cc3b06e4c9e4b5bfe43f9b764c20ffaf8549788672d6dbbe6f7c402ffab91bd4837128be42dab92f0263326a5a82e4cc434522aeff3256223f153927de7528bd8a8ca3a8134eb441e813a57cb4d55d60914afce62d2d640ad3bc58cc9acc112cbccbbb314f2d6481cbb356b3ed117ef8b6b2d5b5b6258a9ee6e6bcc426232711eed0adb969871cbcc3620d3def1a882ac4bdb59a7552d02aa661150ada058621c6eb156e4152bc85a89a46de920a01c69cdb05e11a91e55703c5f150c5a899856b5cf995ff584da198694613bc3447b977686997767183612ed5d32229f7686fa4e097646a07980e01b22f82ffbe7c3459f4d30f1eacf05c3e792fa4c5823cd678299cf842c40f182bad0bc25064d5c5b6118aba03eda1936b5afd6770a3791e669a43192389e1905d11a65f352212f0bd9a4ca4dd6dc554957eb6c2a8d77297634da236ab4091ef1e03b4287d0181aa3da72dc7c433f5457fde26bbd3004fb75aa3ed6cf378481ce27e46503960b95b57281b5d542ad35e3a8563d9f8f0782d81cd45f50ee0b8205b9c0e37c4692f88c7819c067a4bc8809f01959721c1f7080c8a162e6bf9179b43b8010c0c04742183f6b95cb338d41179c9ace9cfd0139f9d561f36b1db9fbccbba919798a98469e22a6e16a67de5acfeece533a3ab800e22c04e0cabf11c07c240cf9c15a86d5c44c6273e3f08d0055c227c216da04af591ab9463e1170c0bf4e38d3b17fae04d2914036738a47086650994b4013c020201297d766ed35897616000415384ce088398363e623920592234336e37d493cda6cd9b5cf0c6433a7480c6433a394a2a4e0b45d528a923274c49aa6ada43d5513c6a91a2f4ed56ce0544d064ed530a17320366ee48c4085021b56d460c06d54816a0a01500aba40635b09e3bf50102bac81c3ffa12015ecbcfeff04200c9839ddc0d006e8e999354ecfa4e0f40c9bd333684ecf68717a068ad3335f4ecf2ce0f48c0ea7676a383d23c3e999164ecf509d9ed9e03a32f06e9c01727a26e7d48c9b5333223835e3c5a9190e9c9ac1e2d44c15ff3f0ce8182c4ec730713a6602a7638a381dc3c3e998049c8ee1723a46cbe998f1744cec748c93d331249c8ef1713a06e754cc19a762ba381513c5a998244ec500712ac6865331584ec584a762a29c8a799d8af93915434fc5ec38d5c205a75a94e0540b34a75a5871aac513a75a54e0548b244eb538e2548b214eb5f0e1540b049c6ac1e5ff063a2808427a78d044ed00b205035afca84e69e4d8e1861e3e00c4ca17667ade58f11f2978f3a34a890384346cd040054170418cd0c00d93097e5840512d6dd271a49419c0bfe3030ef760c9fe3c08f2a3f109e9428898fa0919e21332c30f0a1141d90d20be0e5610ea293b3db8c09c996d60191f0763000101f1f01fc70e31b18b0e3a69fe9d1c70b892cb9564b33d9146dae2a0c47baf528eb4513e21080685f5de485b7569db6a1f9d23ad59bb39d252e5481b75742371d425332c4b893712ef2c051cb1dde4addac4e6aeadd19236f0e6ddf8aae0b9cbd572ae5923aded786178df29668689f7ee2ce5ebb9e2076976db7265d156586b5c2b88d316f7aa7a67293ab3ef8795ef87079f0f379f0f3076a38f17a0422033acd547ef5a44d49d3a8c64aa5e25498680866ece8e4648a66a11503d3245e67a336c6b0b4532f56451747516267e3b5af86e144fdcd63bd3bc64ce9ab4da6a11d45787b7ad57c21dcdcc9aeae2295d8e17b754c158ad2089ab58f79d42267d3c5a8ea37d3c3822a26fa78c6f478b2ec0c8b497cec4363223817ab4533ad38e2f50bc963c476dc42ccf9bb354f54edd7193f68c52f799af0ecbc8acf50edfac0896ac550d435bbe599a696fd58ed866e6ab6da854f537ca9e746a44040000000000931000303820168bc582d180503c9f503f1400025f8a58b666489c89511843c81863080260000080800080c0100100c0ba7ee276ac3416fafbca5a4b7a2609323aebff5ddcc4b1cb4a0b447f2fd611356135d6350b7b4b176474d9ffa7d3fadb2d8ad06b63bd6573ba9a7f4ebfe3ff65203dfa7f79f240af8ddb5e26ce93d54cd464d09f69a5b5436f4159479d38f4d66d9a38bfd5a89a5880565373e217d1fef7f337319456db26eec86a26d46a6e23706254fccf5e9ccdc8e96f373ae8c9ad1730eb34ffb3ed8e75c30ca0fd9fd32ff97fadde841d5923c67f3b5dfd5f37e93efed53d82fe0fc7674c3b16718896258491d43cc7b68fa890ad1a5f38aec58f261b12462b0aa4f08a69b2c05144c9d5612c3a0af8124a2e5040261b5ab9774e9953e10b7f8d8162b9ed785894178bfa853059a1d54386cb8da4e59ae5fd6353e534416e74cf8386634dc5cbd7930e44428b31621ed814b616921539d45a5276959c4c6cc5ed26476895ddfbcaf2d3fd617b6fea9a1af0ade12fb24d43530e5b878ab9300bf887798125eabdb27bc5e85a66edd2a419f10300e4923786d8933c4effcbd011e7b7ce7d33b4a5e10ca987826a816d55f093a6146b0ec2608ba0afa0a83b0a698fe6b3c9012837e57c98b046f9d71370c7f5b440823c3de6d2cba4d598106ce29d6fca7af72b4a8a44c5f44d1f3ca1ae08679a0e4b9a9c166d270139c83bd41a4165879d1bef2f9e48b3cbc37f86493a34b56248176044738c1c845b455d93c11b251588886574849ec3737579e9f0480898732d9ec4e7eb3d5bc757cdc78c3e11ef9fa535e9feb6303289e4cd4d67d117fb6e175845b5dfa55c8fe113ecc7665e6c30c560118dedbbe884d745a5300a27840e415f886f63dda2a7f37e5a0e840c5d83a9e1c05fc108576165219d51ebf8f9c2d3dc87e2d4c2d334e66527f5071f11fb324464eb55de91b44cee3f35ef7f563fa1b5959a59ba22b54f27b42c2318cfa0cf3cfec9af582f09faddf6cedf82b5648313bd18b37e399f8ed789d358b7169efea8526f3bf7588801239a59206f7de3e4784c567f09c379fbdd21631ca324f21411fd920ffd1c3fa6baed45819babefa05e056e0765e04cf26bbd58cce730ff3e497e287bf535825533e5ad8e1ddd688d67e35e9146a358947e00fa3848f5ac9d2c767ac6cc959e1fbe9f63e2690e1913aa8b41fa5aa1953c9923d0dad3634686a906d82aaa2d3abdc7a11059407109d6fda7128d03633eaac721ea70c74794550510f5b77a05e4a0c76d833b1a065bf1303ac13d8145ee8e30c3c0ceef9f23e0213ebfb672400b4c9215633917555a9c60879ae0fd14119fb0f38ef4911b42c8e74cfa7f85e12bb6f9e14d163e7e14cc47bbe2a6cf748e5b09d1c415d2f38adf7c8d035a7e7d4eeafd0564d8300294e21d75b4afbbaca56719fd36acdf21fda741c62873f46f39dc7e6eb7cc2f3d9c4779909de165787ab677c5a4f34ff36527df3e6ca3952d2f989f9762d0f947a7b2f911ac77cd06a636dfa5f9f7332c4fad0e3174adfc1861fa0b4bbfedcc0e2e551688ed416567dfd7ee6fbdd370b8c9c2c7d9b52bc5cd7fb27f8eb2e701f290099b8abe6f2fc0a1b005675a05f74c55d9ffad13963d5648cbcf92efe121c4cd4b432c2c13fe7e568c6654fc4fad2f0146d65eec262403e26aa81c270b511fd94208824a728020747a3147a43b703f234174c0f9fefb026e596aebd677a247e3aeea85bce64aa2bf95da0f5781d01d42bbca07427c1ffa01aefde87f61d2854f79596a3263e46c8fa431f9af845bb077bab7c3b41b14876be6ffff8c5f31b4f4485360d8b5099bad1a587ebeca3dfb304be40d8cdc3f87521a2f133218ebc2f2959c3b17204387d1f990102db11828f180ebccf6ccdbae54e98a9e11dfd906a20f0a4f953e3013f38053fa3472dde0bde6c43d71a04bee02c8563ecc39cf6fd36c41c4ac23a7fa4cb70ba29f6bcf3aff50c81b06becc78e1949e6ea9bfe1de393fb5aeddc372adc8d6fd6f8731551b70fde9afd52735e88218b78b950370cefa7d297ce5164e3839e695cb67720c00f9e71ede61380c638c206862db90a1ddaf351fbe35e41df198a1cd45e2766a91003fc5a4474e7414c2ffab2e1964103515dcea385a5f42e5fb109e060f5f5beae41548ebcde3381e1b6dc215c4b7bcc0c773677ef69158bd2d207ef15309a0355cd29cf3c39ab89047ea4a2273dd9ebb5986dfa9e637d6fe5a765d1c0cb2ebda506278a9e903b354d1ff4cc3c8857a33c4d8236840e6cd85b335f7a534311f815eca97b35e65d1bfec280e927d9cd3015e6460cfe51e6ac0730da33b58e08adc9675e7167a8065acc68fbbf57b6dc6b11a0b74d6cd9d39bd54306a0ddfda4ac6760c89be9f4fa7c4cdc8381ccd856b062bc28eb1509897289c5fcd17fd0ad1cb8ee5529ce5e250d0cffd747ea02bfb00dcf79eedf1b30e5c7186530b57aa8809bd18fb0b9529a02a9ba73d2b3a55dc0eb111c71c61bc0c14b704bc642d1f86e02371d193303eecbacc223ce449b7b194a321bf4d9fc56c1cf27194dfee95dba956f1fa1843013caba56936f64968a7c8ccfea1a60ed70135ffcf0b04bacc081ee7ebd1b4ff536577d5abdcb2e876872400c513762071316318b8caa7a9ebb0149e0d66c5b9bda2d8d9d6fe8f3e1a2c5d905ff90996e10e2cc27ec35c7a75a6012b0974dea37f40f264531e41126f4ac296ae08b2d07b9b9aa0101a1d5450feaec1f4b680bf19edc5ce3c1421d2ebc1c992e289531f9900ec7d7f0b86a9c0ebc167b718092ec67edc978775c84a192ca19f5c18ea2d2c9497506f7a2581bf9267fed98219c36ce7cae582d0fca4f5b833d7c3aff6a90c889ed2e3f63c10a541139926ac02038db42c787ac25b84c3101456ad2543c4c96b29bc62702fa88b45a14271b136e015ad1a9bf850e94c1474964c7ad3998cc1d18ea1f52d79a6b5aa014fd76b502e232f359056a7580d7022984adb4a82749ea2a036bef12b79ad6f219f74a04bf3d829bc24c1de1ad707aa0ab1d3c06b0c4aefad65e57efa1eb9637b94b5664d77d5eddcc0652c8211c40aa9e18e9d7d3103107d106cd511d34723f27160127d8952ce33705c0ca751ee762229496ec84149ff4dbcf36a9f74bc8f85c7159729b419a215770f595b2bdf74c6f41264242d8b6f884767daa4432dacc0695eaee3ab26b9b5cc75139523f2ad717d2f7cd2c5e5d101a5562b96819639a957c3942c06fe04514fced43a3b59498ea93a12c618bc1c0d888e6244edd963a61b3a93d6a22466e5777a693a1d50af961521eafd9fd935da8fd882adff8d512e5be88106902560217758699212d5fa074f87f6152c9dc0dfacb5b05a4ffd63070bfdb2562009b852afb4a392894536f85e09f465ac7c05a2742c08a4d88c24da8313e644e80b87fc567e7101426409c251cb76592e87e84faaf626218f24bc497d42dd1a00be24a90904eb1268a9c294b89f1aa1a320d46810c0231be805b9844da12d8bad0fc606421905b62f0ef588e45439f7900d566bd73f6bec57679e68e1fbe58f700de2baa028df9b827b829a01e7d96d4f80e42a1023909d5069ca77aa36c574817c01465dac4c342dfa24ca76fbe7867a190b3fadea99287c9968d31ea4c2d12d71bd0f47ce1b4b7c35e9482fcce2898bf178a998b084520c27225a4a14574cefc1825c55fec9e093801d87651e378ae05d13adda8b9faca6e5147ff5f2db69e5a2636be57f3e4dc81895d4ad7203f41672582fb218192936cf4593be6e7097652362a5ea44b2b49b4c0b36479ee61e85a6fa084fd01115a8152525546624510a0f1b017e19380152abac860e4859c7619602dbf2b8b2646a02eb71c3c4913383058e4298177801f58009912b5cecf03c5357869eecedca16abb8da7857d89e866b4e28b2d11415f42231c7e53f53f7caad37dca4745adb639eb53a746ffa36447bbc1ff58d52e2cdb445e85cf1cae9b272b8c8dd9bda1f277e53541ac5fac06be7a9d1ac8687897e91695a813021c9365cb9d48d9226c3cb08b0a5ecaa69dfd3fbe91487cb003c93183155d8336274151507636986c08ec103f2b54c055301723b11268e402ec25c342732e89e37bf8d026d765cb9d2404ef34ee2c06a3684d863e8d8d198fb17dce8ffc9fcf50c6f2637834662644154a1c84ca10170c32d2c7fbefeb881ff34e89aa4e789b6a0be20ecb54ef4cacc8c5df8414a3b69e2551a68ebf6d635b1ff30f9976f6923371407f069f96102ff4515144e9481f9e6288e12b5922224f8c2a472d12ea1635b11638ecd92d726b7f8566436ff1939428aef7732bbce7124647c82b880ba98423f959113fbe680e74ce7f58830ff9698dba9807e2f966578728fca8d756848a79c31b10388d135908a26940a8c753b7af6611c40204b42d5525d876c5b4d31e55a3dad8c5fa9ff9311e73094162c8b1365deef6820edb4db371d08ecc7707d916e3cda9eab3090064ca3cf9b45b2db85e8f4bd3211ac4296370ed102b0311ca92928455c41da4ddd003b03c8321d1cbd50098a744153db4411727260b19fde46e4616eec81bb64fdfb0bbc3969b98148276df1df60be4147802695e6962c1839f6430c9606a5e4c0fa9fe7a05ee9200a3fe595770825e712101788fd544c04f22a1565a3170a291621b0b0657d01f5cb5d54f4e018efb640c52c5dd917867081b165b0e572ae177b18aa6cbd973ce66e8eb841f0084216ef80ff3b5f5aeef5dd39df38f46098bb8375dd5ed2364d97a975ba78c6407f1d8801a9dca7f9fe46d1ada458b1a96be5ca0730b5c78cd43173459581f43c405b550e9c3a234091017153cf640646b9df788fe0112142c5c0b26d94300ab6f8e5da88f71670802f201683d1b2c18a5bbd15acb0710fd541334e7f73c2fc5f2cf5b9a3521fec184ec54468b90fe5fc2c9bc4ae772f9196caf689da9bf60512b5923a9d0975ca9d60c84a14eaf9f9189ef3c44361ae24706c38013253c26fe1c392ec9fba6dfda93de5a2be615b653afe590585da1420fd1684c56f2e18043b0b8af39e5eafe119551701acfb8d311fdb1b0e37c443fb295e00e83fb2474db5b4d12ba1d6c6d5b57b86d0405004e8b036ca7a334ab8f2ec145bddbc573647b963d31f0a4a0f420a11fe707895c510444a1108340b413727bc47635837524f1e4f2f849c1859fd2d7a80d4b0d627db81f516a4c1782739707b61fbba892cc770d9b97b12882dcfb6307a42757ca36e3b60a2f12025327cab55e9702231954a12152f03a89c53998c43d53a39e416a7c6b66b7f53c6cb5c76aac2a67f3c34dfb2e2e702d2c8cdeabdcc4c17015d6676f862e6a2697c675f2fd6b68a2aa5a41a57470c81388b265ee812225d51061095b757428cc4765c3a15095a3147b750f3e21590ab61a0745bc9d0d4094c6ae44eff9515a530c5e032336b8d36a19287951b4a4139dac38520e5efe2049a3b1629890712b0fdc8fdcd3a18f2bdd9851facc1631b9c0af0406007e004d4e0a98a74a2bf7bd03b2e82ed79123323cf5e4af7436bca10d8d5ad2c1fed6e3eee69dc12a5477a57bf2177ddf88f718a3f72a992abc6438657f486a99b920e6d791a3744a32352b540e5962a186be2065c811402b7cacd79ddffd7936251dee0aa0e67b5e1d54d2b679b10648cdf5ec6e90e71485cac941a6b5237f12bdcbefb6fcde03e646e8bbf35f6f9ba6cbc8ba50d1b781bf949ab7c5138bb9bf457ebf86a4f571aa9c460c5598a6c61509a58754bf406ef439f983922794d850720bde099234c00709529f54641a154896bf76ca2c9ecaaa53b943ee95c63e4273b675ff122d3fcaa978088e3549e3881d3b38f973b621d65c9b2a582b2b2327250ea59637c6f79c22950d7ff5b3e7c5d5a93ad63406809d884b6ecd1e44c91fec7935d79d060c498fe78101000ef84cf37e2a53bd387c694b84b166fd3c407b1563bfdb83a1746ec290ad95ae30082c1b7d611bac41260157e34aa2ce4dd4e81a2cac6434ae65811be54094d252e1429eecfe71af003b02931c08176fafc7fda5472c25b358e19c3b23c3129c078ab615e90dfee24c21bf24f81bfcde7d37370bee9d79f1d37b21f4794e7ef26a8cde336ec0c376de86cab2341eb4a726635af8fc1da8ecc7e9e447c04a51557e4d8388679813b4130302a8d6dc49d115ea82232ad8225e4331f16ed08ff1e41f2240e3b0115e8617eff524f2f930832b01f233e22bf2fbd567cec123c210633f076953cb1bb6671f7849c7e5070264654e6c41e74e572897fc2ffe1b4f6f98c41049733c49ee1127ab2735cb1780d6d42bc8f14f1856145044e966ab410f02229c08c88141ed9b8253984b071df0f39de2881969d6f95abc548fb2c8c93871d18930963edc2c1d1118fb4a02ac4a4975372239dfa92d501d81cc8c5d20c9ce6845cec4426e51fa2ff9e9736621a2a23346539f269be6020f985d9deec0a0a91ab8e9813f50b9bfc616e48123c4dce706b73eed4d56ddffc96fc64fc7e5c06752dea7ce886aae4e1c663188c59888b93242a74b7836c8eddad3f0e636183c70a6cc39f3a9680c7dd191473923a94615b9fe64c32fb96528d53f46a4220ab4911b4f8ef8a2883b27855bb4d74e1a6a21013e69a279f45bd9db7b726d2710911d0bbd1b31a3926a527a3329f724c126c7bc036522001921fea957155c77d1c9b9f0f4e74ac09edfe1b351aba850342bd7cec5126354346b68ce951ef03c04f0ce03d5cbca4a61e79a7a033cdfe308de1ac76d40a8ac96e00b28210748ecc965b9036379d734c38748d3ec2358a89603057fc5b81d7b9d7fabec9ef8630b5337ea85023caf0689d5e283ef10409cb9b77155dcae26f1bd2d9984d98eb4c051f35e9bac50449cf4119b060c8c9bbf43e1e66a15c67eb4e833e494a5cd053df725f9086bc44d502423119b980eb858f347aec8f1532277472472d68a0efc6611a0ba3106e3960c32112ad375b007b86193e2f9ebae83d04a7587a5247cff2a47d62766b4026bd821cb81202fbbe5eb042055ed40cf44a2e52295362ce5b9e10cdb65d986cd35af07ccd286742cfacc5cffb948df1077782dab50db3c8fe0d226cae2a995a550ec072e75b5411e186ce4c2062c5e49c619e728d561a62d6e970eacc89888a93674ea0628748282d12ec4290bac16f2978525259c15b2c5ffe0937f404ba345a64e8f132b62d5309a32ad832c8d2f989ccef45bd44c03b7a08cb1ee3baf9c063fc64f8a247bb65a85d30e66be87ac63354b7fdb05492c7a572328d11cf8855a1ea2d370839b059dfa57eed4b99fbeb111891861407bfe8ca94e308ba257addb4cd8ca3d4154fd2c50fb7afa9769673f66db3990b4067c8713ac8232e32e91fbdfaaeca3b2b4f1a621bdc06790ab7925efd7f57a30e3b69fe590970fb310332ae2ca97eb5ca6d9c6eb270a66d48fcb6dd745554594bad2dedc50ca3d98e8b383ba3a9acb2e0393933cb2175ab9ff3d5a455a3e9164a932a392257486e9e2eee365e40e6555b436a0761df379f21adcdc517c52edcb0c818ee3d65209ebca0f37c9a23672e2d3c92c2563da1596cb683bf7abecce0edda866d05aca899d78c27d3a4b2eed0d8a11eb2b655646d7d3d3d83039a1517fae3abd86e22fecf3028affce2dc81314bbc8d2de7dffd496c2ad238d8aefa1712bb0c6a4a951bad41a76bb54a34efdaaa645d50a9ac71bff7c3502e0dcf565311d63ccaeaa51787d59531031315aec746d81179e677ac99f36a2db9f36ff0763cfbeff58e03d7928d8946cd9ca002e3aa220fbf082627922f832d464e7b608e38887416be5b32bd5ada496b6851d163510e2349cbbc02b0bce4352fbe6838019c8105a39cd1c5d2905d85063887d305330833c9abf584c1199068a73bd253aa8bc84f5b89a822816eb6b320b9033958730fc34129c1fbd602b93a723bdac157b804539160a71033e4bdbb21e96b81a1f30eb1f2f06c6c040c7ce26870ebd07413d338b952d245613af2d9d94627954747de5ad5575b8ad2fb18f7eb241c42d8dbd56ff6cd2dd1143d57454d3dd25739196e47731fe9d4f182e8b06b0e4fba01a6544fa23737748b609c6030ad32ae7731c2540d6cfca5e85b52b1f5f0ea4f570df33d59b0707828fabd4cdee442bddb0383971127d7c4b7ab1e7e9f02e0126d74167c7daf57fa9fad30b130599d8e65846a8df9c490cb856a69716e1c2f8506bd48725c769927b4f61f69c5573d2671c4e6ec422ca6173bd184161ec0c0fcbf5fd0fb6c3e45108e8c5615bea101dc317a7cdb7c59b64b449710d8a07c46add6831dbd9bc96edf2c7c1e1d4b8857573dddefeb4d4495156566de223f69c97c16c764a7368f7f0b73770d7334f65db24dd86a29ad29cf4328fe3291a32e43f2116fdbb849e5c2d7226a778ef56079506505fcdf04ce26c25b02c19c906c480972733d596344da114ad031618e944bfdc4770e15e10676f92c63179edd8e1252cbe4a5a144e922a55c44d09728ba841f9c570c9a34d491a06889dc7f492ced4fe2692c664fcfa543ae828c96dbb0f7035faf3f357f6d54feaddebf2338354930ac27ee33bd2cc43addce6cd3a8172155b7313bcaed7a48bcfaeecbe23ca56c7f71ad199d71815ff5083518f799d45bea82dfa93371156c3710577c85f2c271a94b704d60e2cbc9905e63a03be5f981c1c4e22c38065108980634a586c1254bc9404f04017217d0f034688724acedee92cc5f0655a2148f843acf805d1c871994425481914fd0b5040395b86341f81eb75d440cabb5f6c6abcf448393faa521b68be84f28d197be15f2c02b5ce84a85eb5cdcb4875de87e23d7b58b82a73316d72959ce6d893bc6bb3833e4caca75202b750f9ccb8b27b3538f893729248a577bdaab51a54fa41e2569df42ff48ad2890fd0eb0d4fcbb0fc4e74913b370413caf138145b89cd039055474b608038ae3b60f27a540da594768c06e674ff194ba18c59b237b36e02b66dee9b1131732113b0ae319fb3c5a05be202aab3c163c19bc39bdf6bc50a77996fdea3a6a9b85aab0ae5e87cdc2d939948f967b111919e093cd5d571639b825833bd8a6a71d6fce0254c7efc902fcac24e55b1e7cd15905672a25dc9dad3b20ab5d3dab4b74840c6fd445b736e16389cffe657f6a54c8d6fb75f0f5519f9bd868a7fcb4b678e7ac73a65f87b5bb65c71060dce89263dceea38b7e4a88827bddb9baa452111e15a23c3ef62cc48ba612ceb729d7191f565576cdc98c50725fd0ad4749fb437f4f7caefceec513b1f501ae6d41f6fbde90b9bf783b405c2f40c4ba1c871ceb1fe1cd7f2780a43eb0567c6972e9a5d0715f1304c04336bcc1d9da92eb559216206c547a3209bb703be4be1bd757e760e0f0d38da7e64ae5f7060c3c2bc7f5dc19fff73d8d2b8bf374def6d30bedcd1df58896cbf829f3502ec68fda1374a707fc097ca6ede0991a70388cc0d0057a9a4e742bbd13a5cdeab79fab97bcbb48939e2efe77b66d7ee6e43e1658fba1ede85f26fd135aa582baa537871a869f9db83cc50e26fc5daec7f9f93a17ecac199f8fac861975c0e6be12b3f98e51bf66e6c4151deefbba3a16d8c3929aa70d0657d0e6606800400278b84726acef0cbf2107763d1e0472329834445374cf2d3080647f52ee762b24f79e71c918c52d15c614d6011c899322556da3e9e571c80550cbc4f4bdc6a3f5b4bcd92f50ee3f298875d5490bc2637d3a8c2b1bfcc1886dd316a23f207b16a1dca738852738ba2eb97c2cc394f1252da27a47e3c74f50477bf057d091d5d538f70d9591f180ea415aadb722c769939bc20c958b8c3bade1ed4e086cfc160e17bea165c11e1589708fbdb0755af3d1c803e266346255244da44d394946b8fb041fbbf7812983c5437af09907dd8a1c7a89e0fcde347f3c10ff11a0659585ac01a65de55f8ff6f3382edebe45fef66d2efdc89f2e21cc1d734e553d11a87ebb850572a789115b9252b65d490612426d0ec3d83831d5ff746b717a9f524716c3ae774b2154fa74e2501a2fed828d4381172eac75aa19ce077ae2979cf50a2717687107504b62c956f4d2f77ba06c1db511a30f0c853c8a695560d78d9f3ff42c46c7b80a920ea02effa9cbbeff442eb106366393ec901134876cabbd5a38d4c99c0925318e9195fb1a45363e55b91a118738011f9017cf4104db86ca1d6fd3c9c2dcb59d2761a24f081dccd640afc19c0968b8aaa3dd9a9b9f61d527ac8398557aed01e57d7ca6f2a8644379ae8ab287795923bf886c41300dea8ec065a7412f4fddf123ed270a1d3a248a093c3c4d7f4054eb1eb717649dd8bfe77564eabddcdfee00c4eec246d93224bd61753cadfa152e7b5976d96a9348c59f8424a0c8bad76b9924a88fc8cabfd889d638c78184a8ae86dc3420c29d472dc32768bcf610d66768ae623f4fb82e25d4402054315de81a17680f803f940553d2c4c441bae39635d62cc8dba847670fac2c2034301285a15722fb362b7b0a0a8c47913d014e5df4a0081b0ac40c544ef86da84e110047c64f172b66d2705ae693aae79346b5dd03fd9f64e458a759aa32b1f5052528d0d10e112583fa8f19a71a6452e6ab8fc411f825874f3389c9cceb18ca46e4450ddfdf861c69257e40eba16653a543d699f191ada102805b56464b63792c646877d21a7013aae2975228562133a2c91120590a46bf80e564304e43f55e890d0a14c58304b52377edd18322720996d74cad3fc68d4aff745bc9ec2e10ae25ffe9cf466da4b88ffc91d4cd8052f61b31404ed7b9afb9fc4ffe32822524e558d625155fe2cba6a91c134f36b410fd87ef17511935963ed9ba0c5c39d3ec522130da65a8989f8bb7ab3388ff0050634dfc00c6177ef423375c0074fb01c0601f364fb5fb3c39e78559792de486bf5a36f14303e1c83217cf695e13921d43308c2f621033525155dbd3c19cc9bc35cf591994542d4a397c24b2c73796a588e6799ab221060f74dd157f4472b6475588caa1d58633ead44ae365257694c2158132388333deb4b875cb15abb868c226ec7b84a6d0dfb1e2fa07767349712c3c9515744974f7d8261906e5035d10c7189917e7486062a844750cfc059b2be0fc6747a74ab8b0022b4ca3406166b0a2e2f8ca4a185eb4c263012422dc2eab26e250349e37f97bfc893f6d58c5070459ea4c244ba48e6ad7a45196e48ee381a1ee79a2a0f0db29c281184fe9f3d4c3b51bc19e89eac6de247a06c72a3f5053c452adfc318ba867af720a73618e6647c00dc5163778b6c3771b80ceed47ddfbe470cb69b7bd8ed9890e5379ee7414df41a803c7ae5d24aa1b5b50470e52a75a5f1c41402a6d5c1fde5f5715c5d40b7078c8a1ccb657981b913f1aff0d0bca3fe07adaaf49868cc3a7498492e2752cd335ee92f2c1ff9509927d626e72b83e45d3355a22772be39b6e2b222ad80b118ea06f8222909c4da3d5f93bf7f0fcfaeace7112f9ea90eb4279cb687ee4a0254bc84478d689b2ede881f8201d146849f66f4f44343aa84acaa160d9c9f343bfb8e07d166fac6a593f674a9fa5242370502cc7086ba4a5e6039ea2f3552dcd262feb66a317eb41c9baaa95edffc466fd5691013d0e43c1a077e27e2943ade0cb4ca9e008aba857827784073624366ca4e5a41b6385ad186593fdb37c5bd04673b1f0c158490b9788225601ee474cdbba933cae2bdb09b8be3dade9ad8a3146e81d55196c58a77a2e84191aad4a6ba34984bb781af357e3db17c4bf4320f3f2ee08358d199f31cc394371cfd5c8cee12590a3be4dddeb2bf1cf33c03bdaced33d028552801503d48ac7c18b88cef3142595fc5922e648eac146f9baa614a086135107e583dcc5850d7978a873c45c56334c4cb67971847b0ec389f6d13d2c78c90aa25af2dcc47420344d48343ac169d454bb5bf58405c344616308be43b54f3864e65e82e1f434c60d75f1b40e21acce3dfb4b4014dc4691beac355c187b66b7d814d1ad68216bfd0148bce32151cf8a68da468cf4705f7d9cb894a5366e56241baef503f9d0e8434ed1a337784524f2407996d316f1edc2fca533c98f418032e76b0785f77fe515044c5a8a0c5b011b7ebd5f41849b8c0437c9231351bba0770123f0194c32360c060f1021d5421feb47cf75f23856324dc706a70f25d3a36d3ea6e6207813ff4cc31633fad4c20475b252dabd0a49bd6b0032f19ea85f293b5702f58ed321b3c8011ec3c7da9e20dd26e147dbcc65cd5775fe0afcd082565769373ebf8f8effcffec618e62c0c5a9235a8432ad2f0ef1d055ea4e8e67172970ed6ead8018a5fa98850406071809c135ab805987c478932f695387ae9789dcd30e230aeece316dc95ee10ca6bc81741312ac6bc9b773ce2b129a814932457b48d51c6954238a566a70128c1dc136dfbb687a28a041227d6e43d59bed792ccc21ad228a7ae8b3cbcd31fc73808c2628f42c933b771b24c3ae7d139212c93b49c68e9c11c8b986c15454c16029fb9d15b5d488517a550cc564d6525113334572fe09a33f783cebe271ded439818e70e37a6ddbcfc0b84bb0e625e69c9b30531fadc3b5e79a334fe2d20cacc06b7e92aea52101faaad57f2bf84aada33975d68caf272b201bea808b7673540ff9a40717732fe5e14d6d76bce82e5236d7b33fe48dcbde056822273dd06998ec7b08f2fe195446a8353e3f7be069614a67a91f69dd00dbe9c0fb30b0efdaef3d7350f9ac7bafc9dd41a464e818e34ef94b66b9872270ad072d9b0ef904d77fcbe5fff3d3e96947bd97513778db38e3976f8a596ef80d37dd0872d60bf827b85179223da52275024053acc414766f849bc9af7ce057fa1bf883f9269794370fd2cdd72172d96f73fa1235c30c039522ab2fcd411b39e7c4386000e3b3a0c1b90a3a937bf83ac091090da43e7ea514fbbd910d2d28761e702fda8282f3db68147268375d2c0b70c88de297ee109b7ba88caf17031c653d5eba987372462a3c5e1edd1fd4b5863045ac495e52fd69f82901c693562e8b97d93297318d072fe3f55c65dd60c68a10a6a907b8a6c7383c9395b10d5c6a31a11dcde81ad11ca761a9d696feba6674c95ee793aa65c5cce53fcd0b11eb55b4cc85d3a676c5b62c3f0702a4c090b4aba6f64a29f6e8a239d25125c26f02dc767ed7be8f64f55dbdcba70713b9057ee8c5e876230d4541a12d488f5c153131d760491570e2a42b3db185018bdc955c516043d236a01ebdf257c12399c7df999171ebf3bdf19fbbed1432520eb68c7f29adb2c296b5d7102cb9769cbafed941b7c7e19068295e4da863d8ae31f7b9dae7ac09070cf466a7ca32b01618b4d94727487cf2904f66b5ddc814a9979405133f3aa3a235eecb427a84652083e257e42c30e53111b47dd43c5db7a5c0059eef5233b0040bd3551b155f08643a11f1e0cbead68fe093cf4fd16e31cb05b79d40233dc6ff059a2c8016d9c46e526fcc2837ade290e5e8857a6d86981d247a84cca4099e545f1456f4c1a594e362562c78119cea5f7717821a47d72a9116f388a61ac688f304cd4bede155fdc959b39bbcbe1afa5d6d20c0af5fae291f7e7a003e485a4456dc770168c5ff6ec0f70e50886269fcc7c4fb25a0bea33bdfd4070f0644fa25433b455009d8632974d95aea7941164eda22ac119da9ee879d2b8c61eb2c640890f82a26e7b096a687b112a111cef97e1fa8c0143fb3f9f5003f27c6350418ce38626f13ecb73a545845550f6e2c2760c832c3bb8ae0ea06c1bd856748c754b013028d13cc6da4e33b38b67b9846237117f0b6e45761e06f207222196c7082454940b61f10c9dfb21f953807905d41f0a4f4977d93997fbf6e54afed374e158e2e0608bcb75f1a588e42a4db0c7c7fc80a77501d6808281c5ae76762f9e0a1177793174d4871d21fcdd85337617fe6467c44e783f315e9e5a08ca013d023ffa6733db95ebe706c6371eec6d6705e7c84ea853737982a37e8ccef1597649c610169365e6fe44f0359e862d23ab9203d227960a9f0d538857d8bcf988e384bf05d0326e1fdd925e11f8905d5fee6c507f2ecdb7362adb7b7fe707586133c5ed84366bd4918a7e8193e9d182e259353e8862c331a1ae1bd89ee2714b7a576a74e6fe7b783469eb0d825f069415ef76e857ebdaefdc8b417b3c06f6d34531d40fbc936f320aab3e3fa0ce2be377a990591fb405ca07b462fff3c2469c86fafa3dd5387d5cbd8c8d5ac14071b728e1d43000d9c8fe28a1c15226225d4d4bc0db21d364b1053e7dd4a5b919c2fa80ff60a96d726d6eefc868f08aa000847a9ef31c9289f511438992fbf9259423eb95ed0d4e4fc7fa8dc75d24083077086b7c40fb64963eb97c0db0023fd3ce238a63f8bfd97abc5f7d61986313d6a870d5c5024c8ab4647da1e35cfdc8567dd8fb21766b7fcf8037d25043b3d792debf1e176044742b4887ad7a90651fa5b60814b6d875758c35a14c9179c026e9349c437295e8b586cd50b158e58a24ad12b84baaaa82c157630bc2a398a1a3eb1c8e509449689392268b76c0aa26f5e94d8d8aeb09147a71f4374126f1404b29d77d2104b21d22d5b0f3a7bdec3a641e27cc9a81a1e09a430f5e189863ffbf867cd1fd62e47a3db4e3a49ce8b5221e921410c5342051927991777af0a9cdc204329153e355ac76321639e9d23fc320f4900051f3b2177abc6f3dacf4af88c4bebfd986ea00631a70d02e66ed7028f8384ca5ea170a29f7ad3ead4e931d7a2b66a1418159dbd18aab8121bf309af769d016f7796b5c6c978af12de7c128c040f4560800d2db82a1ab68b7115d6a410423f6b970dde798cdcf03b6d986f09254a05b56151454031b0f8cab8e89d4eee2dbe1e6fd942de8a5a75e1a20c6dfb4152c7214b7880084ed0d45a7c5d6febd9ba4f94fb7a76d0c64ad1bfe73d421785d7f4f7aa8159877085d88025b8ca261934ee89a7c89beeb8d5ef94571375ace512b1f8b6c1c4b12db81c52ffdf38083136c74cf4f821d69f105ac6f501606c9acb67d7816aa15c38933a18d1bd8695e9183a3be2a1c0ff9852c1d167d0e375ad9f90607ca0e8036d7b69db030a410c5c779fcb37594c08ae6f81c1c72e2ed8216b6355fa204db022abd33e5d32462d2f4aa32bdd54f4f89bed8e3181037f933b645767595ec797f14356c32320918167bab7328d5ef41da00684ab8b26eadebd934c8e180deffb7cdf5ac449e2d71ebf8b40be9d50344a1451dfaa85ec5c40fcf20d4a8adb50057bb4e4206e2b067be133e0be4a4d84e786ad8b0036428ea6c3bce0916d2941f7555400a4a5f1debee17c53a0718dfb5020ef23f84e69837e251eac1381a86478c0bc562ffc891a3342f0838b1c4ad64c7bab1b6609b656afeed67f70bd51639ba57430a3f0359bb2d19a5ce8e9b05ae9259942ea5bbc7bf0764b3e6b9210ea8f6e9845f0d08c1bb591787ffd05e9eb4cbe5768b9e1eae24fd641ebbc45134b508dec232c6d9f35e31e4d15064bb029915df50c973b08fa9d3284929da512a1f4f85882154e09a27d8adcce8ce0bce2039b0e4ac0151400c01d9c80e870198b0b4ff856b1716d47bca29b32a43835182317201979bb5037b39d3d3200463d594fdf25c691ae08a3f70294151cb33f4c0bfbddb075112ecddde968303314f4b0165b5b011b94c5c9199a2ca0d69674dbe08e69d333b47ef022538c93dbdc16a819b2bae15ab614190e1e4f3b95a7d4cdd3df988b86f24e960abff2f41e7c7845eafa19d063c6dcf84f7a07dbdfe14141e0f4e81ddc843cec5c500a0751b81ef1ba6ecc205fe67d11f3828b8cd756f0b4fe84b5af1ee2c92f8275d53aa20a3ee79be9d36da9b8ca3b75caf8f02845ab4d6f03a7396f772390e0eb485629331e57f789fb99f290b108255660b2d486aa04375ebcee013462109967af73da460706ce9dc3bdd639ed25d70adb165ebb748ebb0b41d27ac1fad20ba7b26495b8136d82bcc20217d78f6fcb5d759d7b93800a76abdaf27290363feaa55fc0dbeab8fe85aa2de336dbe4ca77117e6d50649fa0d6d1e749ad4a74dfb3e05d4d265b9a27b23b0ac31e192559367ad9c0329d0b99051af161c0f9646b6f697fa5cb286288ea6bfab02f8acd7649f867f29fb8ce9e704baaaae56ebb4bdebf77151948677054e4a74bb5c32d5b90f787c5f78d27db9d7bee025756fd895d81dd515efe2783f17b403362241da753d53767dd801fb42d2faf20e052a7b2f8c57a4d4d8211e5bf55dc9a08a562242a94b421ef521994587fc847688a7af27e9aa73739abe352bbdb7ea64afc2d1facbc3e9a0c7ae2dcfd259b17c0e0f19f389d19d289698e470035fc59e3aa8887a8a582d73611757294eb7a2fe25c006f48153b0eb88e08335f009171fdda78e8be3d7ad4af73fb41b8055dc3fa4af11e694d1ddb8dc16b35fe6fc9ff0b25e0e821ab80bab3d467b06bf103420242a4869f03067004e244298b392fde41e315a4314e026f56f5f12d66268925dce92995320ca1696cc8556cc36a68b2651d202751b7bc2c85eb53cb5e6e1e4fb47ce4256a97c93957c2dab93afc2a1ac4472d6c444b9f5012891d1aae4cc1492d18972449ca2bc19b42898dfba299d2924bbf125a34ca9911cda8eb4382f14fc015d5bbc5b24d22cf2c7b9c605f1406c3cb11fc46da4e5dfc8814c8dff810347d07056d9ab0c874944a6bdea61844a6fe8038c69b923141677a509fe78b8a84a92c66c78d44ca0d36e0c978534d40916ad282c285d0209ccbfd40b821651127dfb1f87bd02a7a31fc651a162d5d347314a2c6687ddf6b8c0ef920be0fd49c7a8ce2ae4d7ec867eb235a1486a08335b026a3bbd90809bd663210c874239999b0c5d6a6c2d9c457d5cb5d033a1b0670bdae3e0b8d461cc401f907e63e5a4c1f1d54e0c9d5e12c32de02371e332edb8ad3cb6118db018629a7009ca5d788f3c98112eb5b4754526b9c9f666667282a225e21251d6b8e656c2d5919c6d85bbc75a4199aa71155a0f981a6df5c8f7841acb9b22f40c6b1c223de0902d73b8a162716c70436ae4a6c45587ac0f76aff889d31b4882172e018abc4b1e0510547a8d30d8db218cd981b3e2de0ff59e3645ae6d06c0cecd26ff40a51fc2d5b4a6f993c31e61f0daaef0af4b58ee4857c35bcf28f4c160dedc8c70a81cee36ec0188c3403e4df030ace1edcc26b59fc4cbe709f408bd27d463ca72e26746fdee1dd788afcf7df52da37449b51a9009cf438d41a4dd169cc05bdbb2f4a7138904d413f200dc1337850cbd6a84a8f5ea74e3005e46efb38047bb59e06e44179d0cac97c6387fa16dcdad70758309e4bb0d9ff7c9ddba4c1f27d96f2e231d42b4301dc18b732b10bad46e41b91f27bb4548bc6548dab8a433a50e68e2766a7d2046ab30bb550a6abc53e948556f80d8ad87ef7138f57d9db7504b1eadffb4a62b7bcc17858473cd36b042c9762eb720baf55fc0520a3a2e9c5cefd3106da27bd1b2617b19940879413a3bc9fb2a9e562e3ccb550b59078d04ce71f93df9bf7e568cfa5bcb8d1b8ec30a523b763a65a4058ddc0557dd7942265b3ec3b8fc89bf8740f38c4d9bf8fc742bf41aa4b873c8fdecb166e619ec09f19d6a71cee8b9409c302a79310a3ae3c81918363fe971dc28a1bf2920f35e4ba3b5a24c96ff11b9c830e32355b61dc50ac534a61b91821b88009d07bdbfa1bf3859d38ba3026f8fd8190f60a94d08ea2753921d2a7be13d8dca53a55d619ca2095e890e8a1efd5a74ddf8d5ee14da05e34fed87214439366ad3d3171c069e7e7cc016694e364285d12e0c9391d80940d720aec3530147ae695ac3bbaf2d28099cf1612ed46aa160ff52d0e3d4d2cbf3b1cb003acbd66a9c56b3e5d2b27ee537fefde956da284d4ebbd51624685e131a1bcc6205485ca614f35ac9a5332796bb8a698632f0fa94e7efe4d2cb1a9db40dea10dcd7031c3d4cbde3be6747b76303b0c6d37d635443e276a10bcd65babc42b32738781318a501187803f38cb3ad548b6cee1cb8b2330627027154382df593140c05e31e7390dc7485027bb34c0cea71cb6d8398b04ffa4982330e618b0a4fa61d7e892f07b0b33a66b7f0744872f9933694387275b9910911911d74274428287d684bbd2223968870406e44675c16bc414bba0fc8c2bf563b9627ea178287a4fbeaa20a0e3c828ac137ac048d6edecc01f871abd87cba00ff26a757e6d01a8004282c184e6d2d1bdfdc114e6f4230dc1461b85785f7333c35af4e451da7b629e80b0212e87d7d4078e5525225eb20662e214498cac292f60b94f5cc9eb9e8bcc720046ac72fffd343b21070d6b0f730a20b176d789bee99c3e8aef4de96b8bdc7a727fac6a5fdf5892e0e80bea6bbedcf0b1b14e3074b5c8a39859716b7fc61fa428e329bcea22197fe2ff14d22dc62a7b44818c31c2e4d2b5fce80cdb40fc918b9af88192e07baa47842c8f88af867de24d6ec0bc95d3a40f1814ac7d4be11c4feb80e2a58d9a786e2bc065ea219fdfaf8697825236800fa152bbd0750a19c039d7cba3966814ad3033b73584977cc8a08fffcaeb0d6ccce2bd36c764fc30b0426d3ede6c4996ee9c976d19d3c01a43c6f72abf8dab00d4e5af22e10e04bee3105c67b11f82c8095b380e57fd7cdbf49a0236ed8788d6eb063ac7719197db0bc3262092b542270a7c91cf724480df17e859899a3e964076757c7532334cff6db65ed8596e2d78157e3da1457484f58c7c00c5729117015103b0e2e282c778f4cfebedab8309a509863592234a93e703a8b58e22468abab1841b221a49a53183b06d3a353912489d164c3b2e5a83ed6f3f4e78527cf69223872ade8ce10e308e2308d180ae4e92cce1592e57ad693c8c9ff6ce9ff01a284ad2c238c07b1709ecccf8d4e72df377d1bf70ec7ea95992e846b280c547672c96cb63f2ec3a09f117a2768e5e9ed5f9122cf9adbaca55a2d5338b3b15398e8cde83baf954ad831683f5052125b0f7d3b9749cf0571d40bd0bdc7dce08eace6fd86a106ab00cbde0490a9c0f1e0bc2b660d13bef82e72d48e93cb7a7eba8492c41a52c0501d72724d19a917d640b5690706d51f23e3c005cce10c1253098cb6ccb75c068a4509a2a4fa157572b039a59bccfa944c17854078cde6a857bc22737512d41bf5d204690233492a5b7c973e843eb5cd30685411b8c71f0bcc0d680dd780982a76cb92e9f6afdf232859348351c6a88b24bbb7cc87877c28d1155361017034baeccd056280488540daa3e2a8886993d19ebaa9c48de0b444af7c55aad157eb266144c56b066aee84157b6a0c4fa3da57c48b9600261fc3aa49ebf91846ec45aa90b03da012c32a80c57a3675cda86523a4c56cbe1a088d82e1449bd9cb0d50abc7cd2f2575d6232d482ff6bee8f907100949843d08130954bdcd8758bd1d55aa1268285aa1e6055766dc8164821aa86e9bc6de472597e99d857f5ab20d7d9099680b478c8d100ebeafeb09b909c23aec536b049bf2c04981f7f39da20ea80b942f683e4ad26482f297eee7c833a97846edfe0398828ce568b5c3003fa6e3315102d17c8e8cc17b17c5af2cbcd11a138fe71a3436b321f346e1e34195182a41725e20ce03ec3085211fc1e74260e8429e95c21a3730299c7511dcf76b3e7fd6f332ae769a9b3aaeb3b39f58c3e3b0e5df5931cf0a3d45994f46c7a46cb40c627967a1aa1e16d252d67a11abc2ae99c8f12ec5177c8a008d5536fe215744c5793250d6fcb8b14b061cd937b8c8659781ea58d7103c8263cb4978bb87aa68c045ce78649ebe9f9ca50a5e7e15302ea0b40f7e9cb6f9993aadd70d2918f9ba9512e661f571079464a35e496e70283a7b322362beb5facf4f04fee5e4dec42860ac2bd3046a2d0fb71f4b67ae76b9a737dc38c675ab0642bc822586134139ef570763deb23ed17faba50f15a492c2c5e8429510374e7c0aa245c5dc99978bd22ee765bd26e69090b55fdb785b2a5620d1278d76a6d4f66712582d563c329aa4aa0035f9a636680310da78ee9613b26c6b4879d2b31467c71fcc5cfbeb66a910f3ec906840384e9620b49637e3bcb045247350da9f96c045db6b9e40dde1c5aa3ea7ec5cff453cfb0205ba311fd2b02226c1657a6178ba505a4b25a688fd6d0c7c19eb31ef41e5cce256458392366b9d7d6eb8e3e429589a138309d07c8aba724ac88a036af02d8032319f8a5c6dee9be0b616791caf9d970f19c3b44720fc2411eb11987486b043713947417b0a1245e6904bbef91588dc3ef0ddf2ba905a3ea740ec353cd8d6cac2cf8d57b802314c24bb5ea129c5c1c18c5a7a9945c417af0ad9156ea72a5c03c51e40a19afe257a301331c1045384b4a93e026177696e1258dd9af63f98b728d1145c41fecff569f03c9f5e826ab8b1a2560f8b174a9307779630d4ec3651a594a36a19436d696d6c71d3d83e20d5e10f07e1782f0277fcef15219bad0cebe32200035666a937d0aa9408d75fc1b49a8331995d267befee9602f2c9b58c0b0d780e83d0edff08ac8262e6c167dfa9398f066315a176f3fae13b0fe3027a89649f17779263a0e78b4702223c2b738e9177f686c52e4d5e005485e81f68576833b9d7148cffdf12452f1e932f9bcf52178b8455a45972f80a23e2faaa2a9e5525fe26ab037280919d766debd848dae02f0e77d51747b9c545c5d5f67210fde18188e2434613340e3e3836d1ef672ae38e9535ea79623204e1941eeb5f5994052843cdbcba9393f1c070ccee91abd847d74fec9a2d028e8de102304ec9d0e54f130c42f83e051de0588c1bf9a340c7090c9549e15330e438031bb1dc12ec717795f570f9362f39288fffe5667176c131f3377d88edab7633be6e5c9fd993fc1e4d2b1ab97c5ff0302090ffa59b556c37180ded0dcdf9923017daa9c939b574432ef8310e891a35432235d54de75120f32e3c137959b8a63eae8ad6775163f9f3ac9fccb0f18c1899edd1aea560dab68e87dfba89fdce4b71d66ab420da10644c4c419b2eb1996465dcae0a64b3e9fe4e8ca3f83238f1f7d87f040fb6690ae64feaee2b74c54d5d0027b66280902442357736a01d98173d251c795f80de13ea4c89b2ee31d026bafac9289f41a157df211afd5071af6e156b8c550258c513366454be50f4f628055b458c055c8041403e4347559c68b967121d589275c6e18d22b2b871497e260a4d52b8ded7489190f45ac0c2a894ae3b93817f22da22a62892e1255198c3ba90320936ee607ed8c48f0025d6c5c1a01da38a6ae0b572f3bcac31b5b7ad88898308bb7d0eb36e825d94aeb28e7a39868a7d437e6b789a41eb4638feace5fe4ad7ef8bd6001da2fcdb416a300cbd1cd3da0ded7df9be5167a0bfabc37c49c2d0b27a438cb91189980e8c948674dd0d2fe12974e14a267d625791635ea46364d21a22db86b21c54d22a2377998691f3d3ef8fd80d31aaf52125f62a68d3253e9204aec33b4a2acc41756c8af761942b8d7267703c09cfc5ef20678cad16b6c4985b080f8a0a68c7d58a3de6e0ae8832010bd5591241663f6ad97c9cc363902d0f9c7bd4515ef6e43ec0d6b33d22ee3f0f8c29e7047b67d2aff0624aa03406ab2f16115934aef0f0e77cb11d82adf255fe82cbe6e27c16ab1450795c09439f217f0d14d33ada2df44ef997c983040be3f328aecad76cc57b275454c42387d9d5ed3412904b022074ce10f0c7eaf7fe87eb02eedc314cb762162cb3906cebd1b9ccf2b9311f0442d2a53585865e27f7abe0775099c3fc655e46d1cf76b8038e6fec6a6ac012c8eb31749db5b8b83da7f42d7fa24d22af1bb45c4e19641dfb1bce7a99cf49759e474da1980b72a56ececdaef9b4b924054c66a4583f935e291f84feb55e82fc47fc5cea62642c44d1d6ee19724cdd518e3e7fee8cb031071fe46c45d15a5a1e663cbbec4144a735058e3099fba83f3fde6b0ed4e565a8af7c199f5970e24d73737eab9905b31a2770bf6f1b6ffe1183497002c7a0e6affab3e5ed8db9d8031a80f3fa498510e5e43d7b911faa994a258e22c3a45c36eed30d5e6b9e0ccf8f8a853f615e678ca72e56e79c00314ed01a37f93dd06261979d7eeede3387eb8918c0dc86d890fb90c1b325a398b4e4e37f57d73ca91f269b66cccd8dec5cc35f6868e99b7d51037e3661886e11ac3fe0dcf8149153be0e859264aec5d559c575e02750500d87bcb51d1954fa0806883ada2e290cc291e0975fa47a7a9ba413628e08edc304da45c274199c44dd0f1251a4d8041961cf7dc6180fdb0e85ff4c890745d8bab27c449623999be5b2e050371327604ce919a321634c4894d947b1e3e14d10b9486c0ede9fad956932ec701afd9997739305260c1fdad29678b9b4e4aaf5e47315ce5d0b8190ce05ebba4e74d04cc410e9930aee1e4c2a5c6f47f56185635046edcb84fd496a82c26b831e184b37f628dd7d785a51b73e370a7c7447377545908dae3187172a1c0335f3dd43b99e42abd876bcfcbf69f78e48dcd6e8c3988be5108bbbde8bd830274a8c3acdad908c6c914a0b57004268835da55a768065b1485ae00acb85b605b9333c616312a0241aa67c0dc98282feb13efafee65a64a72aa0654c5f9f2a63eea214a54f4693cbbfd00f4c4d06ed2b54bb70ed87d9717ee1aced97f385441e8a89ec5bc10a2633549a971fad9880e29de1aad02c240ef9129dab6ef693c20e2560c42cd1d1dcfe389580c249bfbe680bf885dc8321b82624b12a03c5a8a919d912bbb03ffdc1dc9c8ff8c2194e9010ff61f6b5d49433a692ef38ca2a74064989af0ccde514034132d2841a821ebb5fb9d1406107d3bccbd641d28874c072da3bd768e00bb300f206a1d06562a4365b2b98404ab25285c27c28f9f7b3dc7034c0873cfab7f7cb3c2decc450af7ae185622583b3b6505e9e4f47e6a7309ad76f5a71a27c4195329363a0cb657b98d807d187abbfafcc16064ea6980cc0f83ea569861bd949a7248317afd7a415fdeee1b22b50f8e850a9afd596114bc27eba1187051984f9c12daa042aacfab9d72c35224c603bdc5b21537781576df2e43e39240876077b0706d41805ffd4873a40e35c5da9c1c8c914eef7ca884fd7b1ac7eeaa3ce70aa43b8335c3b4209263d63c0f58bc948c282b88490135d933320d8d183ed2a464f34420995000a78bb6839ebf1bcaa146a4aad89337f8209c9bf075c82e1fa8db8e6969af3566d35f57411bbf550b6e6fcffc9148428ae5117b6d02bf4a8923b3e1380a07418fed829bd4acbe1e38c55ce26c1d2d334bae9e07a4651a71c484777d87f10d990968f36575f2784ea4f0cd0f8e9246fa42701b0402a69e9d986cfd6edee404f7e98a91ed93aaf293a9f649b6a50af268f81e5b9b6579e70c3d9ce6635fb5fc6aff0eaab5c747cb8f9ed182f314e09e20927c02868d48250513fe2a771804fde932be6d1760249032eaef85a23f3253bf1c548a0e9361b5fe0b2a9028f42c742f333b2e832500edc4c069406494b73833bcf3e40724d20df35b19b6d2b929954ebb4fea068bc27e69ce6caa62e6578d6bbca114847ab79e64ea998c1dd6a9eac558918d543aaa30cc0b4c5de86306fc075a6420a5101c92e1b2a92ebfd3726ffa5e9b6ddfac71e1afbfdb103a5d806ba7dbb790d8f1fef36a69d56fc9e9950b4927cb7217fd8da9a5bc271ec390401e9f91e4eec80c76be2936c49807a3d94ae1bffeb5c87df15ab1bf7693a3618dcaaba7f4604a0ba51afba6552c9a33ab9f13aca27259905f815600efddd4e0030d96ee0bf74b178ce080c94434de40dbb6bf04044048d448345dd05b45f820f7a760b06f73c130fccf25876b6388b15ba247c27d968cdb836adaa98b82f48d812f4d599935beb008c8dc9d404997c1b6f804ca93dbfbfcff0b0cd608ff7746b122fea1da60ad723fea89ebaac3286155e04b9e012eae94b569908588309845f12bca2b9be365fe380d3e98da5307dbb353072eb6945ff655c26cebf26444fd10c00e383546d6d211404c598d2676b523f49053b626f8272e4d068c272864208412ae49aabafe9f56e75fcd547e97c96bd3307fbde5421d12e52d9d6c6d669a49900f4190b690c01f0c2e418088f24643a00d7fb9ddce7ea320805e2201955389edf1ab422518c75dac137c9a4449ec4d23a81a3fd02c79d22601ce2938fe7b8d2f3927f8566dce876b58500f2595231090b54c9e4b3a8410abf173c73068439152072f185ed278bc28ad47887b977d226f92ab8a29911199ccbb65bfd2f0dd9d3581cad63dee5368527c905b34c6434b4b387ba68052cb045f534442b94e49df118959ebc429c16e10040ca9a9e0e669b3adfd3086082df0aaff50337ce00e5711910f79c95ed05e94ab67a5d55965bdb1170f81859039a1054293fd8dd14f02601fae504082d908f9486513afd97afca1eb81b1dcb005cbea767cd119e4cafcc6e74b62bf37a7e9a8370811374fba04b6a912ca29ed3ff63a8b51add822871f0648fb17e4a750c40bfa916c0a548e9dd0223e9cff699b1f9f216fc9e1e9085adceeac80d63ec072dc50c836833dc595114b3b2cc36d3b15f7f7ea1297b3fc852faf2504f21852558f0685c9ae91fa9f4f1625fb9a52249a0bd86f58f8b8ee8cc58f772f9ba691f3bc686d700b3e705744621eabf7bc1c3bc4f2da1884d3e4b37626d773fe87f78009995fed67935ef43f076c2acfab23cf05d810dc5cd066eab7ea156a92e217329834e5a45c9794c5bc13d8388dbf93fc722a2c22b9fddfdae4968be65c95943f3ef779bd131dd5432365e0c1211432af849d7eb42c752caabd0ae5c1f74ec03a84f4916826626116ef27fdc438176e156e29ca9bb48be5cdc3b0616384dd4d18fef79cf3c81b5f16156bce6a264a9c0fa70d6c9aef73e810b62f42f9325b44572e6b821e009119c2812c72cd9bc35dd5eec52384d81b475ab49cbc2417fc29202a834b29d1fecc1e801c00c570fbf22fc76cddb20cb2e15efe2431ac81ce43ed65d485637efde8c3b60831647c41a8f48752b0fa5fcb545fa430e10ece04022a763928c57179ed0f2a372ebc02f87f3d1cf5e7b8f19753897bffdc816718493dfa2dba5576b0633113fbddc676828257367edff49b8d44c87118ef8cc3843a4d70d5d6e5e708e04c1eeeef81b07ffa5d209c6e8250447a70dbc5000f7d8ec2c89540814b747ac9c8f4ea0e7afcd35a5cb47a6cce5e0884b87c6f25ce2b5231f67dcb063d316cb4a0ef3e90bff1603fa8dbab80b8e23da96c59e7e092c8629e0ffb0456d5ea79c942075430cf7761cce6b15df754682b8083722bc13b4fec5343a1f5235b222d000370401c1149ada3ba24c7c202afd77b66da081366d53e6b0138a8666fcb1e71065955589acff3f83b345caa06ade31addc5d851839b23eae1d0ced161ce58bc01ff2417243e9017dbc5bd720b65a791cad5310fb1afec0f4f5ee38874120aae08b53ff6e8e52c006c6cf69a0faea55de3df53e89680f728e05863fc7243914929af05df640da11a37539bd9a4affe8413840ce6e0fbbf73776e0f86aff94231f1cdf82601db51b704df6d76417b8e5dcd1323601a24b822fcbac4f8d00c027bfbecbb01180f429433b8b84694ea7284eb8bb4f890a8c624337dbcdc0f653a0920d050363a1c7d30aa3c1bd61409347d90c190e0b7ffdc6ddf1e7098e38d0b824666ec9469fc069d93e61e2b9cec2e4e74dab30411fc8fdd4fb6d866939ae10b46fceb9b0d6015328b9a2a2b34f7af1a3a0f4174a14e0d6c22aed401787aa2dc24a83dac5519e59fd5bdeadac8ffd83bec3f2fff864b07cadb52b4daf20ebc85de8f0516a7c5e6b75605685347fec7b3a8ec1066b9ed2baee0b5762c10f39eeb4b6e997240bb0f0b40b37a878b11bf4e4738f9040a1ff98997e8f95e5bad3d6669a64a0b82fc2d7b257637867ebc68c2a6efbe06cd46fad94fa2ed187269932c06c493922e0d7a369ea81cf217e884f33ac835d74ca5b774a59b685ac02d2063f9964ca765f0d3c452e71e41f84b4e26a3d8475faac7d5112d2594ef3fb359cd643c3e5dccbe73971839adfc82e21f8985114506e135641ec1b779e05df103cee5b5c3088d41f70813e448c967bbb806f3d6a302b83bd657dc89d259438899b908fa46072459d05ad6e60a926a00328781a63b97ef38e98fb39e352b9a3d177d4a4c118ee1aaa86d47dcf187eb85e362b979aa27eb628e433e912c6a5c34d605bd5f5e3754ebd3a579e9ca2586ae4c1d18c683104bdcaaf1fca925ca2dffa4dc361aa0c54112c650aaf6aa1021267c56c276746644af4371c6cdf559a4697b1f0d0ca110a024046fd4ac3397523067b520ee5967385a9cfdb3d822ee04770e9245702247e0ceaf85eff5cdc9c26420a8b83741d0ec9eec261cf96c2eec62bb86dc75d7d2b56ae613c0eebdae2bca0ffab9de4087c820f31cad314e320e978d2b26404b332b245b41523906213d274c97f482b6f2f6504197d2a2f5346ff8141fa51c734469857d1554802ab1d2c39582890e6fd99ab9451c8c23dc98f2e6b8c230d65675c0382828bbe0ce29e61e912647690c64bb377cb279571275405bca9c7c06d7d912d5f396a741700ba283d3a70521ea4b1c38c7d11ff51042202b3660931263623a23c93fb73c76e21a86a47d055fc5ca2054ca046fdf5be565cb110eb7b07e164e53458a32b3aac3522b4d01d42d4f865440fcd423ec0e068169d34ce5d1e44dc34d62af369c2b103bb3dc2eab3fd94aebd20c42324c6bd52d586d931d791abbbcc5eb97cf450b30d74a5353edabc8993e7c7160b2b8dea6724457eaa0338784bbe96a20e9c10f86147e687266b52f2ceb2536c55bd84794612164515fb77aef3a62d5bc89b527506d966b32554df4097c0857b48b21edf3bc741dc660e5ad7bce06b7b4ff95282d4ecc8495a14feb3432355cb47771f89f4632d119dbe75c889700f7f212ac2d9d92013d4424b8d985969e3c62ad9044786fe4c25cec8adb8cf505083bb498886d55c70db6cdfc949c4a98e911fc78c5de93c787004d4729d9d8ee8ba79121b6eee0b7793d98d9ea512030d011ef5615da01ee7b15897449a7e688c329b6488cb443e5c220bd1b909729501ea2a607d0ae46c76a35940f21f2a9fc0dba74ec5e7bb0400856bb81eaa97a7ed92806086713ba502ffe4f3ca0ba26fe9f4b97dbc06d947f9d3f7190b304ab52f96c0c5f0b6f340fa322dddde99fff595bc920de61de62e85a216d3ad613bb84dc76c7b9102258ed5d180b2b8b6a4ccd4afdf13ac1cb164ba4a7bdc8abc5ce0dda99ab833c433df2ba4ab73af686bdb4cee9d039e6428aec45cee01edb8be7d041045c9fb44185e5eb403f21e84ea877b018d5b554109f3db4a5b387b2e854cc9f38c61ec2d50e386c753b0f79e53ef31c38984c547be810bc5970645a1e3c1fc790dd4fc0905d9e853fe51f25512376c588717cb9a4a39156462fb28f79d9729853e68ce14b3ba5808df5bf6686efd68b79a39f44514584aa516babb952b9ca89360b6576f75ae1c76ff1f9cb76ee6a0b204f1b10f7283b027a00da981ddf48193921f9c9367593f1cd25f44b41d5502edee85087ac6b8e1675108071af5c61fd8fcd7876a5cb6c0eb5a7695f75f0503850a1b217c3331c65bf154dab73028ef382a51698bfd3c53bd89320c0eeba07d9f7f9c41ae2202244e8715910f1c74117bc96901b15bd5bf9c542a83cca65d004ca8492ad1d5c95d747041804c00b0efd9b9603f8c7f69b4221c1708c8bc816b0d9f4ab913f067a0a449437d6ee7da3cc3e7a8252c58b484230b14c5140d2c5e5ee32e4f56b5fdeac760efe08f05e78d803e36ecd6c48ec91489e203682008241ff7dc008818664e40e3eae4c6d9964cfa16be15d501d44b372776c13c63cfb115cec033d9b5c6f7b8044e4adce03110ea1860f859a216e014eb9df27ede8fe97f128c3eee3d6d0778799fdc5eef92efb5b778d85615d8ae5cc0d40f9d8291078b87e486bdfcc364f7b18db7e9b333c5d94a91cd6629f6194597a57d8b892fafece67d57c627e8f0fe6f2af109e8c1b6d473b59b29efea81ec935fd725398e4e3a99d825a80693c8270db4c6fb26f5ed82202bd3fe7dc602c07163a8a55e4028b3b5fa3744a7e0f9c70350989dfea29bafa9aa33fdef3e188e539889216fd8c322868bdaad1264dd1e4e2c0f3a09ab686020b6dad5efeba6fa688971f36b77beb03171b4439d4fc111c67784755ef0d8f9696b4f0b5f6ce921b27928cac0e18727dd7e7cddd4ad0fba7199ab5f14c56e55194800d40fc9d66ac3d800ce91ed171cdc48d7d2a53a6fd7ee7cc0648bd0d61b16c7e8c03eef96b1a228933b1513f4b4c877ca02fb099864fd59f23baba9abc9916cc2da1ea7e54c1f13ee075665946aa5b6781148ff308e2d41d7fd046de664d5e8281b0190b2c1e0f89cf77fe7bc398ffafc7986643bf3c6c84b347a81296f7a234de87d9adbd3be1abe4d5cd73b49681da914cae19d8ffc979739614cfd8ea622a3eff463e2a16de4977ffe59e20cbba6e5ce51918e40c5d195a20560ea15226c8f6006ec92998ca77e3fbc3e54361d39500329cf6c12af8a57926299f79e073ca3b3825c051b1f156d5c6c38a7c3ace905cdd5cd1cea47e09663c6334fbe4fc0a35dd96f3f850f2f38aa7cfbc09f0c996123cd496caf3e8503ecac86dfcce9b44ea017faa85b7b306cb63eac4f18d618a53e50048c1620621f196acf146e89af50ba4fd2d40ac5ccaf7e3f2e6ff1fed21f56400658e4c2a52af3303751793998eefee0f278c59c01bf583aec3a0981bef5305ec3828993ff8b95df2ca5e633481dad69163abf24198bf43751b2c79abe9decf041bf36b8439abe3abb91b104dbe1052db4be6a156c9baba72b60e8e799df01e83a01d8117dc322a3b739d8180e45637f2f977ef75f8250dc207cbfe04fb1de233e6307e3ef09636aef8342da36d14bedc7bd64e1a9317e47d4f4b7e05f17575f52922ddc02593f7c5cb8d2ffe0b143fa76c7b2f77dee547575cc5302792df1ba23da2b42be5a64429479a402c023093bc890b88930786520783b8f32191f856c5552f2993cde3886e8d223d0a41f8937e09858d87178eab8b2ee3b2417dad603b0f1a1a3e969c5d53e2da682a75b5f3244065a0d9a30d55371e7066016c294006fcb433b62795b15ab5eef24c745785f9d6237e7f688cd9778f9283c81fa73a63f1e56d3e7cb3be29f8d536caf1d13977690ecbbfdc7f8b2071a688831619f1d42dc548b4a93dec670aaca055ed78a3ff2786894045545c94815dc667074e992fe6be31b0bf2fa7f998befe7c69531c4a3dc3e751c9a899be83441e01b1504f6afccc054e7daf3e346a3c6d59fe26e91c8216a8cc0cf36bd9bdb3d2601c881a83c6e3a328e59259423ff46bd410ee31deeee240e8d6616fccc9271fbf98c398ccb14eef09ae9230b1cb10c31920be42c268121ca03cec38040ae66699de5e9c222587e3f7d2033c54ce603e13eed7af036cf35adabfe773d052fd7827e6b71828ffd2d0ac7e5429a193ae239f90553f821c7ffef986e6c2dbfacd0f376e54ed42ad39728d93d02a5782c03078b779bbad35e3a7d5f1d710abb309042a6c179593c4f433a80a0bb643e62fbc992f08d86ea3a9e8bc6511d05ea298011ba7bc6d68a6213b066d87682ba5b16ecc22d040370e11b5ddfe2125d530fde53540f6f28e416a60f37849e8cdd8f8bb03175c0ff3bcccd7fd2d7502a5ce74f559c825fb5be93ea1f518ea06152863ce825a25f62fa799dddd9a64207d5184f0dfdce3d651be04cc63cf9e1a012b78a89ddcb93e10accdbe56aba59982313a0e416c5ef83e0ae68c50ff5e01aa9333d31402afa54703532f20ecc7ca1a61b2dfdb7d0e4d12e41b2e1623a9416d9d4352cd26ebe66242512a1c51d1ca49209be0fda4180164198285a620ecc182cdd0dca5ee084ded325c4c73eb13cd62a722d718fbb7d8b66eabb23c37f95e83cc8db68ccd1e52a3fabefc73105691bdca7bbacf7e794a43508399fcf8eb225cf918d1934b42e59dacaf71020a5a76b6fa7a38822d7d4a890434d1081fedb9fc0c397aab28ba420db32106154fa830837f85b4692854e9d440d25643f0a1e051e4f2b8ef8f62860c93ab3520565b96627ac70a83706ce6d9a30222111e16f466103f84cf9d3123ef500da3ef206e9aea22b769913b3801d441a74a84aff77b0ee9ef5efb60841d226fe3a8138caac2ed850a66bfe1c87e3e79fb65586a342484e0c98175b60b6c57f7486474769ff7fa734851792d63fa08ff54bda93270522c5f04afa1dc4ada3f79807986088797bc47d80e5ff01d2a12fd2a779debd7f9fa837655dd3bc779ee5499cd1b33c0dcf2ab34fdf55e0a82bfbdcd5d253efce1b2f6d960dc762ed921e4573730706e0a3091896d16eeb8bdb96e8f65c7c601d46b1dbdcd8087295fbaa01af43a6026835e83a1f4c43a46ecff30ce60dff7c1badc6a8c314f052c0a0c11008000618289846071f2fad5acacf0f01e859e78f6df21d5fcd71d0f1be83d76d2d5dc2cfbf0948c170993a65e62d7a55d41f46ede5087a93f3098ca362dfae04d700e95ce609f91550630212df80bc50e7fa3978f7d42ce53f42c6addbc9c6d077f73075d6ffa88b5553eec6a4ff83093370982001f5ead5615cd573aedc7f9476d747f0873ce76b83caeea5701071ac06f357d2eb900fb7ad14a37726f649c35f73e08afe9335fbb01503c9f0e3d162c5ee35fb58a5b63e331f26f62feabb52da8ece02b8b319f6865d465e9f57efe4e08ada9f02eeb52353cb5fd25343f32115e685ce8d3fbd8daae759f447e334a816bec2bebfb72f8d7b2c33392c207d81c81a9b672d17e32fec5dda4577068ff6367cd5ed1ef59ede7c92b91503855be08643f71183dbd7997ecf97dcce397f95cbc94bfdb6609c7398328aa805a6181529a135877001bc365ca2859234c03291979ee678b9cbbbb295782dbae5789f0d2fe7089a0c5cd8272fec1b7743bcaf68b11ebadcfbdbfdd0b6134bfd14cc3d5dbf71e88ba17756ab6b96fdd1b61e64d4b18bbbe9f0c589f7e0c661b39d1b257b88d17616505998c83d6ca39d1c4696e50bc23f05e98eb449f957258e553de5cf209aed1c11770457e3f19eca077f206e81cdd6907d88fd76231fa5d83c7ddced2012d9865bb3c66f114fedaadd2e31bc95b228008afe157109d3ffacd1cd757cb1f88b99882ee5a0537ee7d352e7ee71b15bfee6e67f197db4d76e52f23816eb0dfe999a6a1f685087900da4f99d3853f4117c730ce745e8e024e25494f6a0238fdc577d61e83763edb09c141d67df27f3648a067ae805fb0ebdf485ee8a885a1885e335531796f01d02753fc3ded3f9fa3762e54ea6bd5fa42cb005bae3d5c0a80a665698682e6c30b4116a1c24ef0c2318504828f93c6299eb19d5c6178d5f57003e448fe3c179452fc7b496af084f32f0084d385b032b08f0eb44d89581f4a5bb497e2773ee455d5f6d3c2b93fd71ffbbfdf00040fd0c99265ef4ceace8d0fbee333c1a51ac62e0e6907747c6cf8eec86a76962a9717536e873c07cf0c2d3d034772fe9389ae9c8920ec407ea6c8f6213a81b1d1081bf66f5c1cb238ebbbf2099810fd204691e96ae1c3dd8997915e91b500969c120136f47124a1ef50124cc95fc9f49e6db4a8b8b4a652046798c1d23959582484dc3bb4c441662fc730f2069f6631de546e83aa6a284bfafe30aa4d188fd3a9bf12af84beb159703f92af9672dcc3508a9ab1059756918f3b8d5a295b823e006857d5ac2a8bd830e4eecaefa31039ea4c4c54b939e895f35619818443d4d4af0b0fa6651d2095d050328454b6ce08957bec3e08397c6aae23b121c0b598e464505a3e0bffb9ce4018d619d5d7592c742268fa913efc12e5dfca3f25b73cb88e86881259244c690e08c288b02384831556c1d30339462e095e51172128634fa2dae00e3f52ab927b8a5bfc1ca3f2df072485045058ff29a95aa42d78021fa9e9f89ec3d2f51c20f0d0c708ef984826209aee8e71dccb87e1162c05700f7bbf1295cf71e97691c5f57c7050ee5d7695e0a68e8ed2062bd9db0652c938dda80ee2c2cfd8de436dc0b5e76c0d8f8f1186a9bb756f2cbe83aa739cbe34868892ebd11cc8513e5d730d39c81502e7e7859fda453c2b2fe6ea1f4518f93bb5ac5b10e2016279c9ce1c660e6c90445c1a54dcac27ebdcba2d670e636cc64e73d50c3bc35dfeb2a5bd8ddd6fd28cb7b84d6b361fd4cca2a0431dc6432c2c997df3e22656086f78ff2fb65a1264c5970cfa7f69e2b3e43589e346579f7525c1442c4525596c98d857c05ae7958b7ffa54e36455a693768f9425d892bb41f1a49e4eb6300725db003dec8f7629a63cdd692f775a50d269321305bf5087786f0524aa0bc12ac2568ca27e5435411a54de2e832f803207d388a6a556ea9007f7b021a92b72b089009820f7d6b3827e9b8b7c5f809f356a5eb780d16153381f24d492d2e8f00b95ff304dbcef4944bdb1a64d0f43c5ad180c37123e893612c4dd61d390e2cf41c4659b38e3846ff4e5d4d7277cf58cae35550e70bf14d855d95f4224cd70e6cbad169cc7fab20a340f504e1427bc609535c802f06349513abd19042b135b31fdabf51802d6dd1c77b7a1fd37de5c00cf5538c38e452b6981500033d690dd187a935632ed168468e2ebd35548188f4182beaecd7b65412cde7a8da723f8868fa691cf701b9ebc094d6b3b76f67756ce8a9fd14b7caf20b689bafc9b8a8e37db8482126c0841c4379ceb923b1cc2415dcc0b13e02e878ce261caed002ae8d14ff771ee8b0d7213f630d240096d9a681a044e22fb7107cbaa6df2de363a28187947cafa440d20140ebad983b748e4b7b7df6bcd12f1f445bd65e6b487329b9050fc82305e100487058ff5917292802c490c76bc5afccef39e36ee6e97403df4aa529fccc497b00a5d40cce9f26eb9850f37bb1654d009974ee7ed8950b4b47f8091f6974fc024a6e174fcff243001eb6b41411d3d96e921eb0b8000404a0b521aebae9815f7f155f6c0540dc00040ae0494191e0e646a0e784bf5126547f0c5950a74afd4802644f2cbb1f1da03ea7efd619c0e51ee1941a308d18aaee81f4dffabafd9ebd8592a487a09ec4c0d2f8c9cbe97ba03fc00c48995f0675c3c1ef53ec7f2548b3ab0c668ebab011207ff7dc6903563cd4cfc435eca454e050987ab3e5dcc8bf6da2bbe33bd50ca630decb8b46f5a04e022c78bf8a0ce2d409d8c5ac77a82b119137fffb1d1383c8027109b9415f42756216d0bcc0e1f302bb96b6aee7c3f946460be2a73ee2784a6b3c86c83689d33722609725c88f0602832da1bcb87d4487c75b107880f13ffd4876fd5dfa0241e016eb74259b721ae097b870bc2b16963f205b544416a3040aa1dfae42dfee86fb5cb342f681024d9d59effecda549f77871fc9fdbc4791ac9236a855f11e795fa65d112c2b306a4af1c8643a954fdb8019a117a02e3405ac0f771aeae3c45126fd89314a1fb74475063b795b6d9687c13430caeffa3c63f5ec164e40b7b07799ae9019445d604802d479f0ef387682d70f5b5c7da91f1eac15dab5a943eb65c6fc33bcf68bbbc6688da6380792d7569680bf434938e2542dd1948ab2639dfeec8fb400d5e58d5e3df035aed3510eb6702a51f65b43fc641771a02150e4b9f4f9740d2c8dcdb50d82c18e5400681418fc04260a19ec2da7909d561be53de21c65605cf79995c1d40afe71364e8bbcd896eaf2a248cb189153572f53e00db2154b7d0a5d34b6df73c5a92a5cb77b70c654a567b67fd7abe07acfe6a39f53dda3891d15caa829405e914a099412f533e1efab7a11a5b1d8dbb932d074f1f761e6aadd5a0379d85ed371d6cbf1be84656567870fe2a822e4185ebac455d82ac032b6b403fafaf2304e274c1b00007e63c018fb79a42c575203591c3aa19144f6b34c40273001e885653cce0900b47c592f1c360c9a884d4626f972115e85ef89657e089b411135c8521a7c3e418dc383969b705b58d6330a907d40f54152c7ebad4828632dd55421ba178ab414b8009dafd8ab92fe5f23938fe415ad63e27349b788fb8364fa5f39b41fa4fa447dd554eaab7d21311a3cee53daf657b4d97850839dc39f6bc45a41a686556e251dd48125f899c1fe7678544f08c2c5f00733631062d70a6a9114afcb801dcfc3995a7e5969c34d2d29fc6d7c0af3565bb7b3106be3d139b3a4e9c6d2679e27f1e9f7cd2f73363c4dff93ac580bd3c2dd50a415a620272420f6772d7c8d3a1f017a4a03ea095df1f1fb09594d43967d36d4a47f78a6f6b2f2366bcd09a02267d65f237b632e29ececef168775c5e07986b94d2776e11777c834f020c3d5f6764f6ff7e7a51e89403819b1fa3a686695d98c7ae5a0cda21068730a7e8e1e21929c97af4cee597b62e9fa648dc6455aa118f88c3e6738db1b43206f1e162d36f68dd092f05500ff8b9bf48230c2e594f589f4562d1a5cb88d59ee31c459cebdcda455066f74fd7be7eaf43f1c709501388b34f5e3a5a17f2a38d6142e8e4abb96b0498044dfc461e88ce418c47b6e92803b67db5fd8617a963b417d7c08a77f431dc4b28475a4d49de25d2861983ee03b3972659eae6a7f9c6008b4cb2f2184ac8960d16b7331fa01a011f7b8a2d44f8c5ddb317be9a03ed86d19ff8b5fa020b5e9b32ac28fafb4daa754039446102a8def0d8e5ab127f8902ec9b3488bc54b7d475968809aa28c145dd1f13ad2be3689d19b24c7550433b5d6c6e6c962e276d216bd8cb17ecb0acb54bf50c92ea7dc0905441ab0ff7bd29deac35eaf0cb896effe3a0563445ab84d963d60e7b0a1441fd7ac1a372c9090c1d608c9668a5581c3c06b14e1316a5f746085e6876f16c29388bf4398b2b92e9fb0c0bdd21a42d705021c4ad2ed10436da83a09e99f8ea8275f96c8f304b9d336064e555ac1c8074992c742aa23d5c0b06e61570364dd8d64d8ba1c21aabf199f87eb7c4c646c86a1447f9627b03947e2c0c67547e201feebd8986b13108744882dd661b24154f765a1312d4a12fe8212455c7b825a665c0fcb6bd306822b8cf2779cf9b3424e72e1efeef7305a0124146e309c0e6cf8d1d9610021b798e50e8860575fdb0afece60349e704f47959dce7b8b061f93e496eac6c1acddd4e9af441b81469d202463083daf14383c7eb2b56e5ceb8a5b44f3482135fa6c7befa2559760cdb584cbc03c630025fa03991121c14e7070b8251c295c5bfc9ceb31810e92ef200f6c2c1c1c570cc881444c5d129abb4bf2eb23166a389e76d60ac51dc8f09aa25b9774e2c59636bd60ae529632b324600f93fee8edbfc199a310f4a016b1372673438a653d8166c1339f3031d4d7fa468841060ad849912d86172b4922d10b00dbafcc422a5e563199277f866439dd6d60c5ee1164bbdab3735ca18ddfad168b3b085a368a83e06ce1470f7ef76a25aa53408c24158fca54f7c383f00052f07cba12247c0718a1fc91436e4359cab87e644f7143c8fb9f51c018c866204b2de629b596d465f0a0a1c9ff9e7dc972d9677a064e87c9bdfabb2f18a48075e42b2b53a2b37a61c21ff01bd1aa3e7b0a1279fc127bb9036c8f3c86114921ba930c245e55359e3280e3e13bdc4b7c885517b07b51125dbd1676fb3436ea74ddc8e37da24b7c8e12f8392f7bd2e3e3a5e163491b491f87d8160654becc32e85744c231040ae35fcad92ea8a972f13871182dd312a5c74ac09bf2a5d9a82f20a003eaa86d52940397c060b9d9d3be6d3df86818aecb03aa73abb04c6b9a99c5a2c489ab0fb49a84321b95759dc6d7406ab0c47b912452f5d3933cfcb69f3b66607408a6a0a0464fa8d87bb11171716a23a5af9b721ccb250cdd490515516bbe698132f3d6b9d16baf29e22d316a25c431564cd8e84a072f2c0b76fd325168b54651fcbb471d270679008ac61eb63d8ffe37e4744f0c25e955dbec1af1c1bc26ca79581ae0afb0e6aaeac6f307121714145aa1b89b88b87df5288bf72d67e3a2b13b49c4dd744ad9443d781b87f4a87bc52a2c5becb14bc2a6c53feb65ffdf9e27105a69154492b39c06a9cd4e591e4399f8dfebe4caf6d6acbc8d58182c489a0516fbc012491a8080418218ede8efcdab3c79c4d206ad878b673ba0d73d8d03b3d50166c2be1ae9d0763cb31c844631856be8cb679b41db91fb8de2df4801884ded10e1d7a717f162fe0e98aa591a05d0b272510cad53212124037092e4863e81321bbfce00b8d634a1c4c405c7f5f7d17b4fbd09af04e0a86629cda631aa4a645626311a450ef863afde4d563456f037c1cbb8976e26244206443612ca22f62737ef3adb35fc431a5038ecbf1178d88e20944bdb8d0a0de69cf7831f17e58fbf83823c613338ef24b7c05c81bf734664d9f14de44b164afc38a8b3abf7496b10659f2e9dd744a2ccac766759e01b79b3b66184b07f49be273493787ae30ec7fe73709928ce07c863131f5da87284d8188d2ae6986b8fd963dfa01ec76d517e486198425954c8235a747b428b24bfdf0e47f7a37dd29a0eebe732bb20d74a501967aec8f36a69d03ae0c9e3a1ebec9531ef6e8f511d12f586dc311febffea3de0e8132f7c8b36bc0ea0a99b6a13917feee9433939d4586b8c80610bb4dff0d9e73fa7077b7d9c0004c6f9267be79cc6682f9467d81f45ffa1c7520f67b8d39053dee40871273e17eafdb20ff5b8ca0ffc612cf7acdff88d2ed9ec3a48d827f69581b56c5b2f04f4266cdca006fee7ff7820b691de6e55397ed36e73bf0b0d9356c10c57f8b0caed09df01bec56af69aa78a5af2d5af85f555b4adcb17d84a44c520b98b48a26f43298931c78764db1d1dc29ce285f9cd5ab88712ab1e837700c28083293d56fca0174f40e7fcca3db32baa3ea37c6ebe48e25e28d6bcc2183124c4dea1a02b80174f629935193d7110c907783fdace87ba5ec4eb5c3cb2741d0622599649a3292eadd20118bccde5a2bc7897e67d99d60bf5ba8d808d3116b5625a258cf1a8226e11ed6c1378c15a349089300d88f9756b04803db0cb6fe03bb45ac8f84b32f14efe51479259d324148ffc22a96f689c1532a5ef7d2525ecff4a871abfed8b1cd9a3282a44aa65b82779161c874eaf9a8cdfb39c08462f669118df365cee8a6159db22568a1e31d954a447ff487f0030ed24c37aa10f06f5317d252baed0aefb41966a6c66302c65675de6561ff22515998412b22653f9aca04d43b96cb7d1f5565c93a415c501f86887ddc3ef047b6a76278068fbdb86ff9a379416917a4e7c060379aa22f9f63b0083c9882c000df2b2abb2928692e2d07ae5dec70d5f159777eacc1b3fe4e55bf88e679f5dabb2c1ca60b0a781c0f58dcd01f18d39198dc931908803a6fb11d0812591c10d56263aaee0686510dda42373acb5be6b5233cad566bf4fb2248e36ca181a319a378e44863c1d1b72de4859679a2883177abd8e0fe23a5b4f02f652e0fb6408d304ef16f106d5d23b8dbb4691841452807ec2db38580bd82da36e8368b4806192ee5505716227574a9bbc9071c1370b292a14ca3c6d9a849c1f302cf677176441da6b0e09608e5e246e2d174fab979662624dea70ff40349d416b59e9a6c276a906c84bedd15bd79e63585916a5246b32ef474923c5de148c5ba51fd679d7cbc4d32e9f35c0fde99eda3aec46532f1394c53ef750dae421ec2102572250dafa936ac9d0d675cfd951b2def55c4e605291b28132577a08fa231c0d39493b08a0c8db96a7d098a5cb1d43562d97ebfa2f2dcc98a2b2369665fc96080d7f90adec7ee33b32562dbde1ddbbe544840b5427444d6e31201e1db12b2a131c8f2996e47b0afdfb09575523c2312cacd488e2d4934723c1c0a5ba6f32cc3d70b71b7d3da6161b09a68614f62af228bc06985efcc2f9d44b7722ded66693c25fcd1cc09b19939e24f8c0658536fef69e864bc7f40a69b826a4263a1e7fb3e41bcdc4d0dcc803cf511341a33a0aa967109accbd1c67e40375d1bde7292d754c7bfa3631aa0aca3f5f7d8986518d095f5879340e10180785af8be7bf8a41da3e733444b725c2d559a766516a0898c28e10f8cdd750a271f72b005c6f68abb9dfc0c50f2f660a04ef67e48f56a376807ed93564d61797d32cd68d2ef751ce4a40b04c4bef608fe6027427d231308de03f886c4cb03dcdc1ebd51b30a22505d13fb1a0017524277325cc3fb260f177136ab229a06b61449607fb78428901c08c91302415869f9e7ce379a4fb42fd8055278acfcd4aff1c470ef53833b615070ba80787bd346ed6c090a1de8e509b57cb7ef6d09e67ff9e2bc9e00ee7de3a728444eb20c6d685199f90114213b1c72bf8ea6451511667110f188c12e2e14f9125c805d161e67531d31e47b10091e225ec581b2a4390ca8142046bb8f087bd627bd690f66e8a9b95713708c0a6c6244477b61b92752e178b4bf9ce1bc044136f108e60496a0738e36e1c08895e043a3f4cebc7a38c5bdb17b2f959ec1d05cc90a208eff54cf0fe0037dc0d907f04c2b78b2cec92517e4a3c6ef3ba08530da7ce5744634962c46181ebd7a9ed10cd140661cdf43c054e114c2cb01d73c969f64ee1fd216f77fed4c162970801ae19b51d781fd4804a8bdd0335d4a644b02d5e2ce1f237e83b8cc9ff684abfab59ab7f3cbbd736f370eb3116433fbdf3c1a95088a15ebebc87e621e1136cb38ccb6fe4953f34b709a0f79f6ddc8a843f3fc4a327aa9dd0d0d833465bfd821aad4cb07deffd24ee98de01364e6f8d83040a094ba1f23a2af5a967d426c73f9c020fdee5a261ac2a1af29b9ca2e51f3c6cf222455135d0f38bb5800e37606c2e450b224a6e81116b4f278feca2691b557758c0822cdeeaaea2070c84fb8bbaf2b2addba66d8bbb95d5510c97f8dc1773ee6e418951e5e31c1ba15407bd161e0a0b6dd789b386559d745c4cc1709b419c0dfb5236906a8ab56336a9accbae0c04af06aeedacc4e26f695b8234b26e07cf5be2952a318c3786652ff664bb58338ceb9051d023173668e7a56dc9cb11c22a574394b59b224f9bc2ccfefd895e4e2fd377681e6a2802c4c7d774a399bba0159079ac4416e3be9337a7dd29ee427e2b21ba1ebdc1f0e7c3d73b198de2f217fa368659b49c27f99440d1e6582300a7b5d7aca57e644bba3988000f1fc02041f29700b933a44703bda51b1dc8ef91fd309d980cf20183353012896bab3ecb7e83b303854c18e105e8f0f844dd680f12e8239b868c7d83cc395d3949bed6f0aec0fac4fe969e4f64ec990a2dc3b73ba54849f9684353dc5b4a2c94e8a04b0592685bb84ea174c736ba108b015d9abd508ae550fdfa9b2deb4c57eb2aec2f51e151c2b145282ea9455716315d2ed583a0daf7eedad32c07e09670d4992957236b953dab6be3a80e84bb1c5b3d73261a778f824cc17e1ca2d1af8c68b3ec1339fc8e1399cfecbf07a38f18dfb08209e9ca0451a2b55799058114dc33f800840562ad2ba95610efe35be0174c18099ea8d09c04ba698ec539a804efd86f781f32fe4a7fda1c73d082bbf4a1aa81cd212004a13c330fc96a4af0715cf7f50d1ac442e8b90efee38e7f9722ff91f7be7c73cdfd87e11362d85f556657d8eaa7578b0cc0988ff9fc9aa13c22dc202d78dbe276a7578d0293fc8de7bed3dbd0ebf39fa38fc19dd16f8043dd07f22fd5bc9f5a6ebce6208c0218b48bc1fcef97f3a6bd4d277d2a36de93468d8a59d7f4890244dc176dad737322f7af211f7dbb7745069db6d416d7919eff7dfa20b7e184c9c188b6f2eba5d30be27d8c5692a7c7df4a539a6cc0979e77efccbf44566e13752401edaf3fceeb883f7fd23e6436ce4b018c1745bd5cb976650e7ec9f6316ed50d0a718dee3ffe27a8e31671c7565c12f98f16d79c1e91a5eef4df38c5fdbb0986173337affcffb013b7fa11a92f7ba77d5ff957a47326a64ac6bafe93d9d9ba87d6d0400cfec6f873b83d7e0cf38ace2cab662b141734ca7825df1fa0977f9d2e3afa10e603e5689de49d8635962d22587aee7f6976c6b501ee2cbe7cf7735c9faf9dc92db6a7e98619af520bf3b0ef3dfc31e872502d32c5beb3d741a98b9145f1dc23c9be37cc34cbb331836d79a816804f897e7d887ea2ffbccf3c8afa5cc07209ec43d85ecd0df6edd55ea5f99f97b994b1a7a9fac6ccaa1f1afa7cb5f667fcc41f1a376f42cfad7c6ead2dfb87501d653de57cbf97e2b3cc679e739c11fe7a4c141d2fb2b8f5740832e5873f925bb9f3cf383ca0937b95b5fcd36df634e8a894b7b5f0f467467827b8be23378a32e7da3be46a9fac76f15eda18d3109064a0339905ae765db253b1a7e50b9bf43ff541fcfb7274dc8a2fb84bd8dbf14cc603d7f62235362e8d6eb020a405fb33c9fc38f5aa81a6ef836bcdf515985af1a19e6fdf9b61a3b29a99fdced9e6670cc7e0bc6afec4fac87813c02f1cae4c502f7ec18b507510f3f9181d8b39bceab62fb836ecf83232bcb796c2459abbb370e4fcb8fa3e0c894d511823c22596e9fe10efb83f548529be75575ce72a2b8d3d977d1c4f7bfb6784ce48ed73ec2b5e3f21428b64c86364932f46949f2dc7bd633beb9c0c5b5b55d71ef3e66cd54d8c8510fe6799f817af3e703fe9f4b0ea5a1ce06470ec7a1673723b03aca59d074a73becd4483b0fd4fe2a12de1fb93d8c648fbf5eb353897b6f832cfe56884bae385e1893281babc95048a7d9909c9ebc5e70a376a8f28f4364bc1a522e46ceae6d8c54751d64793f1e3f03d21924eed8eb31fb86eb16726ebed0fe00c9f9fd1807416e6e8c5863b8f84dc20a0690cc8033669bd20e43fb5e05a948fabbf5f6704c00d5c323ef4e32680ee891f9109947caf421e84d5475aa268f95b67aa1da90da375898f518e6478332ed2759fc801590622705b3d4b3cef261ee6c317365cb990333bd6c9efd66bc0c3e2b6679592313cc5a9940d6cc84b21664fad82cfbc9f8185c56c8728ee96453ec1fe364b0b012968b353021ac25661dec3764ee0cdc26d00493e017e00370a26441923c038bddd441bf25b92cd69aff67d5238c8ae7d67b896f6f4da6c87481f15650a3858b4e2fb63570237cdf2cbee9f9be92fbb61c4f866fff5553065f6ec2c23c3ecab1fc3fcf420037b28ecc36f28a0d53de3cd98b2b6292027e5caa6e6419cdec3a0d4f4239389f6706edb22114b7db5198ca3606b00f4a1527efeef048fed372ba2a1734f07b43020679a6b2ba4e71207112929a5201e6c2af09163209989c98370f1af2acf22f37853f4d971514ad4ba32b68d5d392113ffc38a774560b983763d746daf7bfdd1a34bfc906241fcd27025408a308bcd51a7fcabef6783198128a6ba8ea2ef5425c08b377054794bb0d2edca57220e5820bf18e8afc9db0b61df8df3dbc44796690044afb4f97b39d701ced60c00c925f80c04f53319b5d5c4b84d3272a86b18abf3bbcbf7d976690594dd795f5261fae87f8152e7631f4aac6664777a3c62a3300d44e92e60acf9f4c637928cd7d03415065ae287e8cbb04d4d8319ce6fa4092b74a791a49bff5060e79f2c3e0c617dabe7ad100dc1208cb54d191ef4fe95bc43126f1afcca23c705aab2d97d8fe5f8177534eb7111f4e38c8b18814bd74d259d599d465609b1cba788fa2eb56d641088c067c8c93ef2bcc5c31880f506c3b2539b09847c047631e833d804684b0cb6ec3929dc5e18b44fd5ccd4f2e025c62aa8aa2ea87041b7ba5362e43a4e0149e386568a9e8e6ed613386ef5b4cc97da98f0a0a9d8db75c0e2594ce67423b423f835a8a4f1a167c3b0dde26d0f15c118a3e54b027853d74e281573c1ef6d91424f3716b9fed3f0d9e088e0841bfd285ad9c67d11f8efe28a2dfc0e2bd8f23c54ff4e54cc59f030a6fb9a4043ae2e1f6e8f3b197270a43bfc048e53ec44f8e2cc941574fd1c9e98676bfddbf9f4207c4c4d6aa04cd8e7c7fe774af9f8dfcd4b6e61a641baa9158f237e1e0c9b4c66b82794620443f39d9f723d0730db5843f7be2c7259f88a29ba8ac389cd8cfe67d567b43e5507836676e0d5aaf25e3c8537c82692a280158996a0b6295aa58af92b30094d911ffa2720954b895085ef6a3f6c719cb727ee82b96ebe577919f76086c603dd769e7284f3b76d99b1e00310d0adf3e08a2dae617af2dd971601e6df9f8cbfcb1dbe030aaf0cae083a0b23b806b9d658fcd422152db27548960295cd92cbe71a4e3ae6db55732d7719135fd0bce7a830016bd2bf7f2a96f2c0d43e9b515f900347edc427e5be7486d3278303c4681a000471e463bbd65adc92135304c90046e2605f1104b1030b33807ab991ef0d4c00f55303598eebc5e3f3bc0756c6e169f9af266f0a791adeea5fa2b7d4a4ae4c69889007e74b885b3dee0b10b2525252595b2a88b3d46d0e64783dc0a82304429461462125e0e14785f82764e5ab208b9d06116ac85829c28ec98e05b2d9de22824f915acf88e8209d4c2becc592d2727ecd5821d80e76541a1bc8a7b79305faad3573cb0e0bd9b03dc74706380f76e3878ef6683f76a0eb929c07befbd9b271abca739af39add65a6bad94524a29a594ce39e79c73ce29a594524a29658c31c618638c5042092594504209259450429973ce39e79c33c618638c31c6f7de7befbdf75a6badb5d65a5b6badb5d65a2ba594524a29a573ce39e79c734a29a594524a19638c31c608218410420861cc39e79c73ce19638c31c618e37befbdf7de7badb5d65a6badadb5d65a6bad95524a29a594d239e79c73ce39a594524a29a58c31c618638c30667c6da553462cac530ba50c529ca752caa0c92b6130c92b6180c82b61d0c72b6190c72b6110c72b6190c62b6100c62b6150c52b6180c4051658d0fdaaafb62b49ab5696d7b601bd7743800c6e3078dd055d57b999e025699fede7bd9b0108e0dd04e0bd477353c18d053715bcf7b4ee475709d3d22fd8eebcdfaaced37d925e9956ba6b1fe4392d3aa50a765ea9829a57a2408df75e014a202101b944c115af44417f250aa2bc120514bcd2047fbcd20465bcd2044bbcd20439bcd2045f5e69029c579a80c97bd28819ef49235fbc278d5cf1de13c04af3cde7b4fd705d57696d5d57d901ea522f4e554557f11cec054b7aa95047dbb62a4195b574a7fdd62b6ee3b817a7da266d6aa9a2207996eb7433c18d132b59767e3414501620200da5f90c59c98205d54507cb4b1b69d7c6b97cc2a060a4853855cb1f6d4218c6f2af93d1b64201c34e3ba59b289654f25e134a9a90a07b4ec3c074a82358131ca4adb5c2abf355bef63eaf6d037af99e5407d3e2cac2559c67c17eb4f7596dfd1e1344dee338adeb60af309ed3c27dabb5f14e65258ce7b4b4542c39612c582bb682ab6413421428346f8e2a4a35266c54d76957133ae6782ddd52b1545c89e690374789c6f5de9b62c67b57de6b52c604dedbb242b7d22ffd8fb60e0513f44b7757b7d2af16c678efbd266284f15ea75fdacaa9047dc8d9b90da9ebb496d44b37e9828bf71eae5dd75570d55534202db80605bdd755db16dd75feb93097d8f0defbdbe6392d9fdb82f29c8bda9c1ccf6dfc694043423a3f3da7208de81484b2a2119d7c744e405a10aa056d05d4cec9a7ca90166a090cef510beb5edbaa7baf8914665edb2aa89234baa76411974be73c8eea272d2448f9adabd0c02441e23d6e5aad341215935645a7ca7b2f0e852826291d8a8a5ad86b5b75dd6b5b45a1166692422d0c0affdc16d4e7c2441245dcc203b48507684bd779a32782175c2eedea9e9c301b6118866584510ba3569505121b541bcb88ea2009c0a3e9830a1e5e98475c783023d5eeb9392104abf7562b1b8738af85735ecb1c22745cd6a138ef7a128210742943ed901321de7b3d2787db7e23873862e63962c373c4e7bd9546a94ca8ee63aa8f72753a4449558618a1e259e1609c6f482d9d271f88e3035dbc264338e0bd15c7697c5bad74768478af49104d8028c1043653d4a050a3000ed0cc4103078d1b344f24e2a5e3b2ae3df73240e490d771d9a67a5e60dc87b55e1b06230901223481f46188217d1842872155bcf7562b58cb94e35d492f437230440c678829478a1428869c0c31b558b0d5c64d26df52719d7ec57ccaa48d368e8375beb5ada2fc966a0a950598b8cdf4a37f4cafcd088ac9d4b5fc51149e0821cccb140821847981e2bbaa052b0261862f528a728a8c5a9ba9a539ede2c9a201d147941694244ea3389de2a84e95fd95bfa4090583387922480f4d7e68e2c37b4d7a78af090f4d76a80190381ed1419133656ac82286049890c56bd610e60c211808614c941aaae4b0d0c2a10365d41000123a1884c9106368c04348100fe8e03c40031457645121051702a181c5c70a573c08d8d0700731a187072343838d0796e42446d0c50c721471c64b94207c664002a949171f9c40c10cfc01476918e0881266a0a2258b3fc61149649824005bc8e8207943863628c0c20d3648c0328c71e2c3d11c422490a1052aaaf06cc0432432e0e8204713629aa06268e4a8022f28c13e319461c58f062c40089e1874b029a4c68713361083963914a93947e81183010ad13e18410b2f88214407261d48e9a9418c17d7ca10c2ca8b8901881f8ab0169b189e094ab0610a9720c46050a692ff4316aea43de81b142089c19234c518274a78c0991392b800f850a9a24c4c32211002d4f09a3824dd7450250e2f91d0c436204375a9f082518c0908f4f0c515508a9891153951841e2123263f70e6830bd69804e992530ad49026bc209dc949828d4568e80209025b033268480520a16c84a650d20017129439c20041850c5198473ab000288298e149980aa8e1070c62b419617c30220404677ea884110a42409732280411c65485062d7c2eb90396888d2581688001476060cc71c90f92933460364ce12b7800cb08a6421476f8a1858b0a604fb2f051435701135e8058e0855ca304fc8545cf0d89680089265eb00dc831f412b3c14b0706868f48ce68f0aa80110f8ce032c50edd1d5d04c122098849f7c41f6280f0c68b8e6ea5041a4c38a11b3a1b08a4c3853019e86a7e84e8644055c065408518142141c4823ba275011f8a80c4076e57e0e6899d48ece0a65cc22de1842341604670c91a250e84d8030c1b92f621060f41c038408c322c21a28523305d1e4025ea68b0054c085588a0c6e303031723ddb6042d0211d704a228e0091b5708b972302962854c0f3b2e2d0618a263863c878b0336ceb0e18c971ab641c818910156298ead8b19343038199cb089d94ec268d2802236ad831c128ec884d92e08a408109c318394961e4c3e988104da8f9614640c3982921b6a68815101c88f4a8c926895700502e6146e8856930fbc58e387352c6069000c07d412e470b1c80895cc78802085b0be15585ca04a164558f2832d394b7421ac2ca909618c2464dcd51b149114dc98c48dd503c694a1047e4303ab2f607c61c30116e0b01a810d1a6c0527d4a3476ae07861eb241c5100863e2ca9a1c915473d0cd510e59119474148484002650b3c4a80086aec3045233e301ca2080dd641080a60f882113ae59a7102430d8498aeb4d0a483e19403077588391a02060d545b5439b3c502d51f4240a4ca58b9437585c98f006420c711d5cb900df0c06313a95220e38f2cb2f8e14245811a4662b450c18b14078c74a0040d0e10a59e484013fb122b5752471e03d7929c00a4aa224ea460a0083c52343dd4c1c50912018ce21000021ca10247112323c04880689103f860a42171001721a86087919432662004005676f89150724422303081ff1adb0f1098d1c5245f08184a3008ea86213e971ee21043027258f041a8e30e4986a8e0040f82045080888698f66470e09fc4490ef10de8c9e10248de58c4ffe451c78f50a781df400b581e3b43ec7441d018c11fd602dbb930a2857fc61f5b7a92a60110fc22d6addc9dd7236bb8d12f9052471025e504efc01f5bba5449e1126ee68b18cf124692bb8680c011173aa8c1736a00d20881620e0e0059c54de41029361d2208423162ca612f0102024a40c8b3637b300849228767c58e5f721043c7e3415372a68e117c412dd06ee4ec4819c2cb1d9a8833150d06cc10d35e3a1f32382881442b600d3b44d82a61a32804354c0e2d1c51538406085c72a038c244110f3f59643c8ce0451190145b8070020892a20370808b06c7181f4019c2871f4713a01c417d51004218c9f96204140d4144b1c1174538d415170e49839ce1028a0042d44c8b115cbce0c795a192215c6a78c18a2657c42690411c2fbc003034a5488f3b5e488189151c2c3260f1c20465584d02d1197cb1c3062e380c03c0be94f9594cf9b2451b5f6038e18f2b111884f5855e82a5491f5ab87c7970b836b04297e405037e1820910c805cf012811aae98a1a3870c5eb42c1301394ed0cb0272a020085205161722b1f1728818a6135c50838c0a416d1472840b414cd99940091404e1c2961fc81441a584285c00c1c90c3b5d2ac18168110f6c00b830a509a2319e747065c0a1810807a42b93c00348222c405021020ece64212a00148bb4a1411906b410c82168a8aee0208e16b6d0a13280304368d1428c8a2085249c232dec784944912950d4684100946010bba253bbe471c6036e94a1247489a28e40b00d51cce8b24d4005c9ab62812e597f30e6d5a32e4cb080d1cd2f8c70a10385282258c38b20b82461c9001861e2903fb8740c740a28c0076ce0029f10011904c0f95b4840e68c16c8c839618b0554803d6e1471c916229c28c0890d5c00c716175238218e06fc64b04584382e39a1e6218021475c70f40510800143661882451d3104606068072046f628da008a2116f478a4f405cf21431e4000013f9001a6132a648f0d5a9340e2454802272d4428828d198466a8b205143c389109f5a4800823fb8820944119137c79c38580203e2281ed3cbee0415448f2e5102dbc6409eaa614e0035c66b02008852d82d822045a8b202740445101283f3840754081889f401e070072e26800134469e10d2015081cab8c2d3210edc00114c81c7903e8952a80a38b1a2b162e70861f58a851c5b050c4111c6ca1249c61a1280608066c0cb15820c1051a310030148316113c5142122656b69634fa780201cb44075a7ea88411161aa104a565e80811f418814a0d5a3ed0c60844870a24914511282a4007074ae04216313a88830a0c922865b9818b3b161180061864f1f1018200a7098491a5140514303b8a20e227100f6e18011f3b54fc644102551011c816fc206565dcc1c71b27fc5401e20c168338d17f0290c58b27070927b0e08146140d9c11c30116282c31430099921e2caddd86204348c261c1596c1061c02422c062c3a978f89a089f390e0093c245a6031f240679e1008f74f1c4872332c8206b3c62c587ca1e4fb49890c15a619219b038c244119715dae828100d8285002b8cd11203d17282152b107180080c1c54a2b3020e203cf4a0c105e450a11130562b3e5a28a85046193d1a446006a8820e7a0361f8b0240d1558e8400016a0a12ba142072fd0e0040339439c0821249679e24c77f2228711be00a38c97930c4da4584468ba71e2391aa3911d2f4d9c3060c48d16e698c1e7ca1e12b823920dce245d994204b136fe28a3af705f48700dc08121574ee0511c61c38b14576e70e00112322a1ca0670372d44142e9092f7a9a2800193b5c541df4a43298648e2493203db38ae6dec08203cf25742c91481e32d8f09c99421010782e4086070264841106005a05e04109c1480f4ebac0e18982420bb94c10896890c43f4850081e1f68698c60089504647083e64307c00c72490e359a9016908c216daa6602820429506a88b092486c27a9034c8061258c29356f00a24224566c68648e265838f0002b2b1860903b0261448b95275c1c2016461029ec00d2659022224e783b58a8c132fa39f376c2502e3ae451e6ede8b09174ffb0e1ed5870240205d0f7aadc71461b0818f35e15282019425278af0acb00454071af8439e4bd57a5a60cca94810cf823f0c8816740c77befe96439d890822430bc14d8e8e1a530440a29b4f052c0790c68e4bdf7a885c909c3b00e14bd6792d2012daf033083f79c10f2defbf29ee421815eb3ef9cf741e4f17a2f0f2f795cc9c30416ace5f380cfa5594ff2c8c3c97b7840f2c77baa160c8f131e679ee9091e59bc2213e75f5c733ac5f108a2c8f5de2bc2c30b1e41efbda2229351aba5fd6adbb649bf542dd8f67225713bef35912186d8ea74fa1d493c9ac9297ef5da309af79a88497a2f048e0374c4c2bc3786035dec18f338a22776d8a15d54925e4d909a84e938affa1d0cc8d4552bddad563a39394fead0e352f1c1174f3650890682a0038f2f72d2116d95579eccf114308794879ac38d189cc38aa792318353a670dfa318bd277298795d0439b01c213c91a3e6994e30c164ca292a8a5be0960cc0de7b35374de2e8e1491cf8091c87e89449b3fc4b054717efbdac83ed277070a62e270c0e8b0140b257a74d5260dfd4ab743addb3fcebf4527149f197ae8201d405da28c13375da64c219ec79e49657cbab784b276e7903c78b51756e44a0c9d6a4c5f262545d67013016d862012baf8d36da38e3bdb7dab6dd3d0ad4729b8a73a53abd6a6dad967675da15c4061aef3d0e0513c274ad4dcb095b6ddb5ea30bb7f12a6a54f1440da297c13a934efda811c27befa561c47b5c960ad0b1d27ce35c2aee817a90b7c269df7a2f0915a3f6d47d4cc5c36d2faebfcbbfbadef22b95e7dcb6ad3e052830e53dfde39374d058e1b5ad823c4b25e46160b42b4b4b757446236744714696977df1f2da569d94de521db9e025eba24ce92dd51194a2de521d159d01cd882269d53a79ae5d41da6adbb494e15bde95e5ad563a2dd8e6626d3b9bebf57f541398f29e5f6d409d9c30324668a9585d87e3fc6a03d248419c90d04b55a563f9970fd35b3ea8b5a9c4a8ef89218067ca61b19e84817aafc90b5fde7b28974be7e4e4e4805183add27b2e25b482ad52a7826c951b92909c481a284e240d04279206ca1249036189a481ae44d240562269a02a91341095481a684a240d2425920682124903e588a4817044d240372269201b9134508d481a8846240d3423920692114903c588a481329206c2481ae82269208ba4812a9206a2481a6822692089a4812292068248fa0b0b9e046212f0e205225e54f1b2ee8598ac53f9f80ee5c57c2f43f23f48fea70b46bad0af8b8c0b49de7bef091778bcf7b2f7de08ef0917483ce162bf37c573ab6ddbdc132e16f0325514cf4179f9a02de0786f0b14e484b986b498218b04bc275914e03dc96200ef491613bc2759d438e1364e4ed87b4de87b4d662b0be7c3acb6a08ee3362cdbcff6238ff8e61361b7da362d3aada1f79a506992bd9c9c2bbc7f6d615a4859decb7969939c3093e9b585a9628a96d6e681545ca898e1bd292889d94aa7ec3efad6f6e38358bccb57717e4b90ee3ad7562bbdb3f9206d3edb86e2dd8605a1bc9cb0eea5da39392a9786a1ccf0f1c48cd013331ebcf7f4b6ea90ba56cee6b61ef331bdf2401aabd348497e059d27c4bc67da562edf5b788249c76565d828d3c57b9dcaf4a48c9527652e78e2c49828a8965fa15c2dbf42a1b8ddade48475af960fe3f54bf7265a7842268f27644c54583c8662f1d86bdbb827466809704eee67a49853211c1e201c497f8850453a9aa7df6bbe67ded86ece73eac617ebcf2ce33e4cb53f44a81752d0fef4f7c7483d87f8cf6bffdf50d98701dafd916ae8b5b6f046dc51d07495dcce2c2f8455d2adede9042d478d25ced2cff9e5853d75236ac6a883b383238423e483c3fd161bb90f33b39850e9be3866dae5d7f0de9eba91d3290e635209514209adc63df26b73ffa91bb95787cafea5e2b8741a074a180ad71f2214528e666dbdd14f19fd9fb7fa9bba1125a37db1feac3f44289b3ba4fe626f65d77fda78b32c93f4e368b1a4f65e6969bc96d69b6dcc586156ab4cb3d6ea0fa5de9dca9eb94edd8823d48393bd583fc311f2c141b55477722fd7f4dcc6e90f114adfcc461fc6af5031cd4a4035da56a8150774c239828412a5c011a844c94c53449022c2026408247c1025428122c20892b57114d75d0584208208382184400208dda3bc8a7b91f001cb143df751dcf6d21e24e0654240940378dfa140f0a083d2011403f49646510e48d8a0538550006a0f5042c093d886f4d2000104c8c05669c2e015f3a60b220803c0ff053b800058b0560022caa750af968a73a178a7627960c10815741c50200d30c1c691e0447bce003749fe08014d22ca1b710080ce0326118a8d04a1a6039a88eaa898f7e0b57008173172a0f12cdd62c2458c3234a8e0e94185199d77b300481e0981238d3002820f2ca24822881c624821840c22482080fce1471f7ceca187073a90071e7770c08e3a36a001393210071c1738f3861b1668838d35d448a3024d28d0048d2667bcf7487041ca7b72431befc90d7bbcc004890a9e1e5104a1f37e95d76625a8779d7bdaacac60ac1a598869eeb58f66b57834aba5593c4340489b4f8c276868e33cd1508c6728e814d32d958c51db3b0f8f8c511ba336a6450b8dc9190ba3b2c2c3c3c3c3138bd1989cb1586c2826a78c516be47fbaad2363d46e568686684cce582c151ba231398dfc4fb77586868256302c412b1896211896a1a1a1552a682865a4bad25b1e69f319c2311b71cc466e05c352230b46fea7db3a432aada5779d21ce288cce50504c6369a9b0b45458362c68c382867450ef3abdeb0c0571a9a0552a68280869e338fd73d469d64b5565b532f23fddd6817142492f5595ad0b96710b9705cbb845a7a5b3fdf4c8988cc9988cc9988cd1188dd1188d81d1827c8cda18b53130dad0d0d0500c8c46633d3ddec7fbf4f40c05bd7cfc0f18ada7c7fb789f9e9e97cfcbc7ff80d17878648c5a1a93f3a557ae9518312aa4201e1e1e1e19a356c6a8a531394f3426e7108ed978021a0af22dedf3e29d6fe9955ffd0f4b05d918c30ac0d4cae963634bafde7322c205bea57d30b51be789e4a4564e1b5f7ae50ac23226a78cc9496336d2988d43413886bbde7cb08c5be4c431176b474e6ca3518a77c14629de05dbb875c172622e8b8d5c16dc6ab55aad960eb671c382b08d482ca0de7570d7416201612ce7c9f396e7a1f6a5d25c92beeab5fde870ae7b759de55928ce755d3ff1bc3ce702ea4edf03e1501bc27b4e4070f2c1ab3bb13c8be5594e4c469c66799651f7ae24a1d54a0703ff4adadc734e12f04f5c15ae4a6f692820a48d4b09e9578abff44e1227e4bb95f64f4e10e0da7e9c1c00cbb8e53d271e50ebbd3fc9e9bd3fbde7a40327067828271c38d9e019713a2c8fc549019e130b98088d11c418408c61f4ba9c2293ee9c949c64f01ee79d3cd1e0bde7840019bce704830b6c6e4d095e1d5e8801c5a559b1ae42bde764004e04e05d4942465a48c3326e09406fa98ea800c38fcebb9262407527986042b5fc0a882fcc7cd1c37b5fa4deeb8cbe30418caaf39ce98b0d5e278149deebad9c475363c3a4c966c469cf3b2f4e5e5079efa9ba28828b4ade7bde88d35dbcfce0a29212175eded8820b271654c0b58004003459c451ca220d29ad8d890698a8d18b7acb1799562b9d858f6a8bd7d994d1fddb589b0f5e57d8c0c833d22f23fd4aeaaca8c28a1caca06f654a5a6d96ef3a9dedb95442c5982af478a69c2aa27826dd59c1720aaae2022a287919152e50717aef75df719a6687325390f19e9f628c147494a690e1bd2705258f090f13274c9a5492d990808e6723871404908289993bcc9c31b3849920cc68335a9e190fcc6060e602334e4ca6f79e141b2e2623fdf262545d52aac3940412e44bb5a7506be2b61fa58aaa87423199ecacd5d628e180474a4f1cf25e0d4fdcf0c4abf54495271660a45f167440bcd73921c8ea67394f98c8e2a15ab0ec83aee33a1f46a77a4b2f72a348cd249318e957d1a98eb06509f89678e2bd5722f381572263c82b9101e495c8ecf14a64ec78efd928a1871271e498584a34a1c41825b81242a62b9490f25e29891224d1484e12412471e6bd9c2454495879af171525e1e415959038f31e123d3c1b406cfc40c204244278ef25e0959060f29e491715151d6143e9880a1c61c6883f5ed1df4c454526d37baf8acd214754f0de2beab80c004e1eb5469cd64e6e9cbc26af962a857acf0900de73c2c489cd7ba7f79cd438a101aa92c379ae32d2ac965e45c084085c50c422459c29428ba457a988a32282de7b3108054fe1111a9ab353a90ca136474e188ad3613a4fa3d1e0941ec0c14a9b79ef6daf44c40f0fb552fd297f9bd25bde440411113e44f8bc2831f8d2504c56b09c822c5862cc9931488ce96f0c1421bcbcee575b7fcf6119c350fbe5fcd4aae4540d91c710560c81c410a921a00cf11ce00107ace180d87b6f01423c22040ecfca8f66cae980d803881fa6bcd20f38aff4c306aff44305afe483085ec987425ec9070dbc920f1578251fb878251f9a78251f7a98e082d2f740df03f1168c875a1e3979a83d5d6249f752b1543e429c3782fd6cbefbd0e53d53f7aea4977fa51e60afd4039857ea61f5deab0140f7de4d258a7857921025b17e72c1baff1e68e5b7f679ef060b092691e49f5cdbe673c4b711f496eae89fdebb894404be5b79ed53ae0d12d47b378fbcf76e42f0de8d2316b034c7b3da78c031e53cbe43166f07d77ba61c534b654ada7e1c3ba460cae17c07f3ef3d0e4a3a74d1715957d22187f74c392d980e47251d503a9810c5b4bda0984c2a97ca45430e87bc95dffa2887204c39a6a222d3cb1bd138c901bef712f1ad0dd5a9502d9f7aa1fe86ea2dff26d0002fafe3b2064879ef997a0b07301a41220f468e0041073eb088d1bbf18abcd20f47aff4437fa51ff42bfdf0c22bfde0c22bfdd0057643d10d505e67a93a1d6c30d371190e251b4c78ef3120a7d6d080d7715977930822ef7534ec714869062f7c06134a28c97006ecab610815604a3258792724760c630c5208218308f2de4d2080fce1471fefddf0b1c77b377a78e0ad3caaeb780bf63bbfdafad563fdb4430e491dc8e37b203ceee0802b49c80e7f5307b7719ca6574343433a48ce939c3c9e5a9ea1216a79e4e4190aa2762848ced35010b543a7a15310b54341276a4f2ecd7191f314d358a8e569a9b050cbc3c3c3432db5d4524b2d8f51b775a8e56919a9ba24d7b623274f4c639193a7a5c222270f0f0f0fcf8b03132427cfabf39c969387dbb6158f9c3c2b95df9193c7a8db3a72f270af6df5da82b8552a88da13b775a1f6c465a1f6d45b3ad49e86a83d0d514b2db5d4527b12f3daa1f62466b543ed897b6dabd716c4ad5241729eb8ad8b9c272e8b9ca7ded291f33414c4f240729e8682c2a8acc8795ac1b0c879dab020394fbdebc8797ab5b86bd322e749cc6b47ce9398d58e9c27df432d8ff7a196e7d5432dcfcb875a1eff432d0f188d5a1edf23278ff79193e7d52327cfcb474e1eff23270f184d4e9e21dfd3e37dbc4f4f0fb5a7a1a0970fb527ff43ed490c188ddad390efe9f13edea7a747ced350d0cb47ce93ff91f324068c26e7e9bd9b0d7c0fa4013a780bc6f33d906be3acb06ee648726d3b41be67b552f1206d5c8f5f6dedda382b72bc54ad53926bdb59ad543c481bd7e3c5a882e4c436e2130f0fb527394f4372ca69e350101eb2d1c6a1207ce2e1e97af3a1f6f4de4d06bade7ce43cbd7c90ef09726d9c9538e0c0c0cd055a43efdd9ce1aa88f13fffc455110346fb27aeca7b376f7055bc177af9a0f76edc78f99e8db3e2f27e85f76e2cf0b27818cf11df565562fd14eba7581792935a9ef76eda78ef868d352c71f500c8eaf5d1a5b80f3633a61c4f80adc894b35ac17ebe57c08d1a6990d06ae4216dad28ad2457cca35eaa56f79ec3ba0abc77430134debb39c38cf76eca98c07b37646c30c67b376284f1de0d185fbc7723811b2fba78ef868b2ddebbd1228bf76eb0b8b9c28af76eaaa0e2bd9b29a478efc6cc4d1450bc77f34499f76e9c884013efdd304166af36781d975139a2e3bd3782a32b474c9e29e79b29c1d0c32bc1a02527c7e4f2fee8bd9b256e94706d5c7779bf826be3ac5479ef039d92ca86be71ff4ada2f554b85ea5459aa8a246e9000802347dc181181f76afc7842c434aba56279579250ac9f8278ef0688f76e847ed8b940c9c84a0aa56f474cb35837fcbe22faf25b609262cae956f069409f7a8fa60025afc1bba49f494410de536f8d28fa050f0986175a10e25e58d88774b1abf05cbb3a7fc3bef2de9ba1a4c7684b9e90ae0085e45b45a5a22e1678657c514483aaa4ffa0c878ef3d125029a02c08838a570aa3cc2b8541e695c248e295c230e295c280c02b853186894d0d1f9a4eea85b4713defddf4c043925fe14bd0cd0e3ac07278efa601177857d26bc382fc6a6b1c6eb0e1bd27c45b309ef76e6aa0e1bd7733830c3731bc9ba21a40925eefdd8879b5bc2b4988d35b5e4937b19b30efdd2085b91182bd07820b48bc8ecba8fc95f762548d945c607285a80a221a88561d977a4da9efe94eafbc77c1520b33745c86726dae521720561ec68365e56f841ef7ea5aa739b8e461cae1b61a0ab87c51e2d2c31866b898f08018e195b65412c416301ab0a5b48584d2960d1e20a5a12cc60ca54c524c27e44c31642a0d958698bcf74c49bb07213adee391814c8f4b28f584e833e514156529059d41a51484c483a5200bdee3501dd00780ba784f4a4e2176d0500272f2ea5aaa120b8aa89e152c74794fb73ca75139efddbc3a0e8c6b6bb16e563747efc6bf9bce3d4bffbc77c37323b4df8b75fdd256bc94b22061e2b6bf258b96f7b494b25c4073fa89e3bd67e2b69fd19040a3009a0f2259e48f0dcc81658f0060e9a284658b1296d57bef4b96b9d0e5ac0291442bf9e4f03a2e3bbd920f7c53c09456e8f414114a2b78e9b86c05fa9e29a7e3b4eb63a102185a0fde82f1c4fac9b754abcdc5d29c50ac9ff8cd97573ad1d182fdd2298b77e3c505a29b166e84ba9c70dee9f9d2153bde7b45595117fd4a101bd699f88fc12baef762d094e3fbc65d9b29e9a5e274a9278f528f95520f941a0a6c79ef66a8f3463ad64f49dc7623c4e4c53ae0e9426d02782c78afd35c4c450a58c04dd0142d7503f49e504e4e57c9c9ea34d27b36615881b2b3c87b9deacbce8a8552953698eca0bd52155c64034649e78ff74c39bd05dbbec8c46dff121d234a3a449474841ecbe350d2b1e0bd67ca79713e0ccd512905328a90b6d56721059a820152b0e03d93cbfb235c6280074a0ca8428a2965caa1b9eff9d5d67a9418a0575b4b96f79eeff40680564281cc7ba6d27b4c986042020a26cf914a2764f19eefe9a5134ce036249b134c80e43d530eea921b154eef9930e56d699450c4eb5b0aa512a0bc0e72ceb4609fa6494e12395d7414a57cc87b9c3e2ae51c1e942ef982126ea484bb30e544819253b27b94ec0813d894c624e095c66cf04a633478a53118bcd21801bcd2980a5e698c935225f3de7ba5eaa566826a2a550dde33d22f5a08cde3bdb7caa92921f1de4bf196e6b62987c6ac603905d12befbd2925cae4bd97f4d2a579e6bdf73dc737a3966a22519a363c93d02b4d9c29af15acfb2ad7b6ad4c523a094949a621c7bcf7e4248104693ac1849c928c49914032e71df1cda4afe85a9baa3319b55456b09c824c5cca6405cb29a85ba104ffa0026306a7f457b7b5a6b03a8d04cdbc2925985aad602d54a72a419a039b5091c494632a51f9e3bd57a252e615bd7c9715e5c0a8acdecb2951b9f2a8704085c9cb61f9952f6583bcf74ca52c8dd73b53290be23dcebb322fbc9449796fb582b5b25f9a32659197539ad2c67baf057bef4179a5294594a65cf9a5294e8a4c3a0769e3522fcf95a4c4f15c545e494a11af5b69cec8bf5aaace945392e2e5bd9214292f897bf19294f78abeaac8d4d2ddca37216401170060899b1340f0011a0fa04173468904285f4ca0608f26514a517ca240294581c23d1e7a687835f400a5974618e4a684d208f439d104191eaee870e5c5a9aaa44a9026114c2dbf6af9552d89404798774224903c2d1e1731893143bc2d5a1e034a38666e72b27fa938a4ae3df7de0dbeefddd89b2ac394702a28856049298445a2987272a08420c6d561d84bbfb8dfd2a95c3a9dcaa5572e96cad58180e509216d3b3d0f85d20766bcbf6d9c90299228504c423753de8d94f77efea672e99c9c7864ab74718fa2b104010178e7dbb18e98c71a2034582dae9f53af23fc72eed48d2dbf426d2d548e1585c2f18708c553f383066df7f0ebf967d41df6deda32cfd2dcff214281a9f1c1f648b9ddf6ca3977d59a0708474e2f353dd4892f855bff8c2feefff28061c5f65a78258db046cb7fee70c36c3d957eea9a1d342c3dc6d15658e98457effa438462a14607cd6f5ff79491cbbd7fc739681ede2fa3ddb3537f6fbf5a08d63440ab594b3d39e6f84b3d21adc1418b5beecd7bad94dbdae1a7a79a1bb47afbafb2d30bf1a7d5fa1a1b340e7fcd13d72b6709b439b5cc7b7e1afdaef642a14b34fe7df772cabab1ae9cd7d48d937bb92cd12c9dd1dafa3bdddb6f6e2bd128cfb55edda1acf15a3929d1ece5bacf9fefbfb1f7e9b38c049acdf25a0fe7de3adbdefd249aac5fc66cf3add54b1a75fd214205d148a2f5bf7bef7ddf5e79af1ca7ae16ca32cbbd5c23b8d9529b71ad955e1c618438c689bf9c1d6bbeebef2dd50a3491681bcead71a47cd7f9a917816629ced15eee7be534eaaa85b22ccb8c74a7814483f667aaa39c59e3cfe97f44dbddd2fcfb8f5ccfee6508b4a9b3ff7c4a8effcf1beed48d11e5f2afce3aa2752df58d596ac8a1ac50a76e04e3512f5e71847a70c0689ea5127ab5749665996d44e3d3f65a73cf10f739f7e6b6af6ac170e442c3c89c92ca9b3396325b1bb7ccd956dea186d3f3d48ddc1646af3e0ab55a792b633420d036d550e77ef39f17d699e907341aafb43bf69cb587f66adf21d04e8edbebe5b957a7e2f2221aae7dd3a97d979a772f79d7f92142b56814d126eddf4fb9f99eddf70f5337f6aea796655de73452f7af966ad3d2adbceac787d9382d59d6bb4eec50325a4293489537420ce3c4514e3ca1c4305a7b31a6fee20e6597d622a26d3923855bde1c31ed9f1fa2718affecbed32ff5cd3a622d348668b34b79fd973347ec7fc5a91b8fb87665199465f4727aa579676fa02944ab77df8d33d6f8e28b378491104df64a2ddef852e8e1963d75a3916f19f99f0c81a01944fbfffffefda636d21937acdbb02041b499b1dede5a1dfbec76fed48d4712697355229a40343d7395b356796fb47af7d48d2b186b0af5ac6058b28ce23b6800a1f8e24a6f95f0622cf39d386aad3f845062db67ff32c640f38726bfb47b578be5edb57e9dba5185e2c07432cbb24c4e5896655996619a31347e68536e8e23e714e6ff3dbca91bbb4ee32aadb472c266677bcb1f71bdef915fe9eec370306e631fdaefdec3597f9fb272fb31aae55737a2925c1baf1147a8274b4fc38746fbe717cf08259e375a9ff7d026cf946e1c71e45e6218f5d0aef794e2ac27cdd457f8519d07b43ce1c65572eca3f7f4c2d48d550a4d07343ff9d7b1d2f8fdf4f1efde5221b5605b0b85630e4d1e5aac15d3a8f7e5dcc2dbab514b7594f1d0b8ddb646afabc5b76b08b79f2ce336549661313477687dde2ea7a4df4ebe6dbca91bb1e45e2e146838a0ed6ee1b75ce7ac6b8e96e56b9451051a3bb42c71cf756eda6bf5f9c33ab45cbf873cc6ba319ffa579a0d68da7e5879a593731879d5a91bab06b43ebfce92cbcd39debfcbd48d49fe68ba34164c07863453186bbd7366692b85f0d77fe7a5fd7f4f254fdd58e7d0bcc61073a821d475d2bdfdca0513827268d5f64aef95f2ce59bbcea95b8362c42fd6cf80b621a67f530b35cfb37eada28943933e5329fd8d3bc3d9697cb974d7e95a4b86ed0f11ca88060ead477da5edde6ebab7f777460c68f47798f1e6f5f78ba7fc336ef6029aa4f3db9cbf94be67bef10ace331ac7526f1f65ae996f4c77ea46144acad5ca73fa86a6f7b498e6effbce1afe3bbdd0b8a1fde8e5861bf7ac73e6726759e6391a0b6819c2ec69f411e7daede6346d685f4368379d36dafa39bc6c6874caaabd8c5547e9efd76b685cdafc61af76da7eeb9ed4fe10a1bed0a8a1fde77e43be7985b3d64f9346ecb1ea98bbbe377f1c25124d0534ff33fc96475be1a778cfa12cb314d0b68cbfc6adadd554e33f298e500fce29cbbaa3162cb583ff6b28cbb28c7b7517ff10a16034686875da2d23e7da46be29fe32059a33346bfdf674cadd61ff19f696a766685aca2a3be7d35b2f3b8d2dbf42c95aadd09441efac17629a6bc450565aa9de3a5ee9af9f7356fcbd18550793dccb354433018dfed9bdedbc62c9fdb4347563126d81860cad67fee5ae1deffd2f9cd78ea1d5d9fbb4d34f58b1ccd7b5a172ac34626818528963d4df77b8add7a817d7380c0d43dde3e75eff3af5a57f7b5530349c299cd9f7287de73cef1b4ba0f94283b0dfea2bbc11ee6d6f4edd88ea54324a60cf3d71b6166689bdaeae7c69bcc0534e1ae1ac94da38ebb513c72f23e75c7a7c799dd8a76e5cad34cf9eb7b2b4782cee5c9b104d171a9cd56a0937f4f56e5a398c0bcdd648319616e60b318554b585d66fb41f466d3dfd99efaa856663f63cc38eefa515c7b869b2d0e2d758df5b6fae98ceec6375b15453d3607161ad19cb7cefbdf8e23cabcc73c66d67d65762b967ea466aaf8ba59a57683056adf7fe98efefb1975668ddc20b6b9c744faa23ad3556a1d92defcddfcb1a7f9e10a76e84315b7c59b056151a2a342fbddd9ededb6bf6f06a16ac05ef0f118ad34ca1cd9aabe45fe7ed319619a272a591429b77ffcd67a654c37fbb4edd68a3a431a3c59f6becfadf9829bcdea66eccdd0b73af2e0a2dcbb9bbce70ea4d6bd6385a807070b4f8e0e0f000e14ceee5daa18142bbf7cafced8edbd23c917c6b723e887b05c5d8e2fceba55d977b754f6872661bfbfc53ea1fed9edb6f9db8aaa5b564d9f65b2ad4fd21427d9a321a9458768a2db453636c65eac67e5b3a5996d4d2d3094dde1ee7a4dee78aef86d4fe229a26b47afdfc72769ef5b6facad48da8158c05a309344c6874ffce6d8cb852bc3595a91b25d2e642ad602c0c694c4e2355156c59b056a621a3c16ca18ffcfece7df5ddd6697cb5601bafdcabb3344b683d535de7ad1cf64fe3ab935309cdcb18e1c41372ce716e6d2bcdda5ea82c6b12dae65ceb18a9c4dd773e69ac9f8c5a1a28cbbc514b7359d6b9b6787f88509d0609ad7b2bb3f4b0ff7b6dd7f4447384f637c5537fc96bce7d5f2334db6797d86ffb69f630fa0868bdfefe63c71fda7d67a54568bbc39febbeb64bccf79f3410d07aafba5efaf7bff5db497f885040340fd0e08efa7fad2d94587a4989d078d59f6e6cbffe77f3e9752a8ed13aed50d789ef8573c70e5fdd105aff7bcf4ce5b4fa6ef9f5b6ed2b340ed07297d1775ef3fcf8cb7fa5109ad55ac6dfed8f5c7a1867d56882d02efd9ac748f59539cbdc2910daf7bb5f4a23e4bdf6ade9fc41d3b84e8df5cf3bc3783f943e6899e36eb5a49c4ad83f2af695577d14caca1eb49bf39ed746482bf65df628756878d032bffac6bafbde5c6abd5337a2ba7fa1ba76e5c8009a1d34093dbd596239299f96e3d48d5dbb6646a383e6f98eb6c34dabefd25b9fba51f2d0e4a079aba787fafe1ee5c4a8ae5d32629a0668b3fb4dadbcb25359eb876d944b734898f3af3c6970d0aece564f4ce7ecf37bff53375605d0dca0655bad8c7e5efe79ae1beaa072fd214275a1b141dbd1ffa823df72cabd2d4cddf88a79ab53b2eb5beae55997d3294e836aa852d21b63c4f9624aafac97d2a9abbc5acf5bafb5a91b5b491d8707082753eee55ad1a0511f29bdb16be9338758caa99aa819346be3c5b872ede98ddc5b1b274a06cd4299abc57ee22f2dd4317f85f3489b8fac2fc4a04dfa35a7b346ad259470422f62a485fae75969ff18df9dba11cb0843bd581ff72469de6f9cf9cddbc3cbfbce5846d8f671a084ad5c2cd5aca818a670e67b73c6d45618ada530520d7fc6bafadca7bed4c2502fd6ff41d2a48e94f679e7fdd7e3fbc3689dd6a9abad717f18fddf302dff9a73a551ebcff5dcfaa561fe25a537d3ac7df41da76ea491056bc14edb34ff1fb7b71b4a8ea585f68708d502a7c5dd7fc4dfc2ebeba730a66ee45eb8e39c0eed38a769fe21425130dad57ce37c29acf05368f7092e2dc2acb5dc774a08bd8e3ccbba6a43bdbad6667f8850a88d42082b8cd3da4c6f9db062fc2fff7ddbdf21e4b6d2ddd2748eb9f77e75a43fdedf595ab758d7a871f6d8ce0e61cf4acb3452f8f78c9ed79c3ff459767f8850aa234dce3a29e6747eb9fbee31756377a4bd0bf5f246d9a250a87dc4abfc2142edc0c029ad7bce19abd65d6aafd27efff97a0f25c478ebfc65aae72b75ac11734fefb7960708c7aa8c26ced74e0aa78cb6562c27b453cafa79fc7ee2bfe3bc455fa37c5e1c77add64bda37b76d1d828f3cfe8efdfebef7eca30a9d578d77a770fefdaff43275e3e415df19e9c5b7de6b2d9591e67ca9cebc624fe7a5becbb8c2d6708f537328fd84dbeeab7bdf72c45acbbfd77b79e6766a0e3f4fddd8b79c22ad77efa98f9ed2edbbc4b2f70d66943679b59243cfeff674ce0cf30b9a9eb3fe58e5c6546bdb7deac6958ba542e1fb45e31c6eadbdf478d33af796b2042f1a8d5efeab35c5de43ed63aabbd6054d7a5b37acdcfe6c7ba5bfe5c3f88db571ae28738834ca37e65a53faefd713c3d48dae8deb11b6a079dce1b5724aaca58c72a6b6d7945d349c65ffda7aab6dc5fbf2d48dbeb5ad384ac6fa43848a5cb41979953866aa3dac7873d9a2cd8e23a45f62be6feeb16719aeddb6f587083534a45daeabd67efe3c6bdf3ea66edc5e2d152a468b6bb78534387f941c7a59a3d4f1dbd48dd873db0ea7b76c49a3fd2142dd208d7f1b2d95ddeb782d95337563aa83b950dcf66df4018ab6461c238e37e63aedb475ee6b63cc1d66bd2bf6943342451634b87f9f3de6ba23e5fed6d48da8ad47799134506e418b1623f5d3fe186facfea36ebc388b96afee52ea09afd590f2fce2700a3f1aad36ff2a2786f5629a7dea468fe3c58221b413c72827b699c65aabbd15fa89b5b5ff47aa7ff4c9b22c9b957bb95c3e1a9d315e59e78c3edb2ef30a2815be9c346c31861fdf6ead9dd5c3d48d495db7ad6ab4d6842bac6d43ad3a87424dd0e3c343319f53eecafd9479a62e86e1f000e1c82d9ac627aed866bb6b84b4d7fa627d68459bd0e7d8ebdedfc3df31c7e915862384b32b0c87fe10a1b0ec68dd7a0d2794d6daee61f73d55e0bcb8c61b6994b6563ba395b8c28c03ae8dd3d261f963a348bf5cf7fb2dff2f6f344fa89efc438492c126118de78ceff454fe69fbe63ce9ab5e55e208f5e06459b44144d332e32ab7d6bbfebf3d4eddc86d1f75c435b723e493655db539449bff665829f5782753fdd606d32e540c670707c370847c70b22ccb70b4643121f9868d21daae3cde0db7a653ebd9d178f2617e9232942bcb9278966599f73ca9978acb4a7b2bd026109b42b479eb8fd9f74f7dedda7f42349927d4d25e3ebb8e91fb4134eda3de5272093fc7767741349d299cd17b6b3de774f740b4bf2ded59db7bb584ff764034bfe9dd946bdebfe7f0f33f341dbfe4bc42abbf1f9aa6955acca1a475e76c791f1acd935eef29d65c5aed371fdaf75debf9efedba4a5bf71edabd9eeacb31fc5a0f8d5efa39b4bcefaaefc7da035ad598ea6975a4b55fbf7307b4baf3d45c474db9873fe63c347debf7714fda33def0633c34fbbfd4b47aac73fdfddf3b345c6fc414ce6869d5f05f0e6812e76b6bef7fe36d79b676689b523feb8651564bf1af7568dd53f8f99e98eabe3da71bd0f4af737248fbc793c74b35a07d3af794dcf63821bd95d2a15988f7f753cb2e2fad7ecea1599875ecbb47ece5d0b2bc77ceeca58e10de2c33a0d19973c53c77dced9d390ecde31befe532db08879677df7b4b0b778e105b88eaaa17a30ae28223e483936518d0249691661eb7949ff2ca2fa0e51d27a6dee25833955b9fd1b4ac356aeda9ac3bd32fa9cd1b34567cefdedd5a2cbf7db57c980ac6c60dcd4a1ceff4f4efecb9b6d2029af53bc6fda38d98467bdbd0a0ce705a5b37bdb857b8a90d366c683ed23bfdfdb77b7e67c76b68f5427aa1e4dbfa3aefe6b1ad4a96751fdb36be6a6895d67a7dfef05b49bfa5f5069b34b40aefd4bbd2ce23e7334249834d05345937b5174bc8edbc1f569c830d05b4f8ab84197b5c3df513f6db001b34b44b2fbc34fe09e7febce333344e3bfebc5728bf95f6eaac838d191abff94e1e63c4f3475ef1ebb7cad0ae9ed557f8a9d6bb433c012d477a6bd414cf1fa184930c0d6f4be9ad915f3cffbcb973a95e636853db98b98f565eff63e662685fc6eb3db7b7eebeafcc61685b4f7e6d9638c77ab98c6068dfeefc67ec9b5388a7c55f68957a3e29f5f0cb0dadff12d03ea47b539be78ebec24a8dc278a1dd0dbde4955f3867debd0b2de76833edbc7f5c3b9c9a0bcd57ebabfe13e2192dac770b0d620a778cdb7acabbfc7debb04e0b6d7fae7d945dfabbed853c0baddb9b27dc3e43bdbfbc170b8dde99a5cd76e62bb9bff90a2dc2a969c755578d29ad3de3606385d629d533f71fe7e518c379abd0beb772f7786d94be4a6a93bef754687be7aab78653de996bb09942c3b04efaebbffbc32b65b4311b29b4dfafacba66ffbf19edd20ca9fe55df0fa5cc77eb2d5f3651685f66ee27b776779be3de1523d940a16df83daf39d68ffd9d5c6298cd13d6778a23d479fe5f794fddb8b36c2a6253a6e21fbdee1657cf2fb778eb59967d54ef3acb549a139270d62462e344857dd24e77a451c3bbe259c6dab89f6538423d38f01662d384a6ebc4decf19affdb342cb8497b3deaefbee774b1b329af5d1ce9a3dec525aae6bf461ec13364b687f724ba7ccbbf72971fd522ba1f52ee397117f8e39deb496b149428b94c778318c92ca3ea58c3b5232618384f6f1d53e731ebbc790d35a896c8ed0b4cc1a5a8d75cef9ca5e5337cbb20c461b23e8f4fb479d77ef556ebc23e0ebce30c6fa2dbf5717a165d9ff9f5e629c71b4dca76e5ca978b2cc0a1b08443be787b85acaeb0338ee977b3f39aef6cb2989a03af64d6bf639739c694cdd88d32f0c87a54a7559189c7d613890763663fec53dca5a39a6f6c2582f1896164f65c166086aebcd95e21bafbd93563cb1ff5cdb29edf45dfbc97feac6d54a73dae2912ad83840cb30cbdba5949ff70f7b1542f3f1c67cf3ee3bce9f2fcc32dfb3cc77ce77364168bfc2cffdd431ffe9edfda91b2b0442f316560921861b7e992f4edd58658cf387081564f383b637f6d4d3dcf7ed915ee983866dc7f6f6cbafd45c72a8844d0f9a95b2de7fa39c39cff863eac6d963c383a6b1fd504f8aa9bf777b9fbad166d90f112ac966078d530ea58ef67edbc968a38356f9ee7d4bed6f859ec69d83a6bbaf5e7b4939d71b5f6bc56a360dd02eae78dbeb35a770da1a2f123638681cc31e67ffb4ca69577ac75b41c57c84cd0d5aff7feb083dfe555f8c69ea0eb5b2c8d85b30546b9b31c3606383cc34e339698c53c269219e35f6bf6bacbb6a3a39ed3875a30b856d0934fb21dc7147bf71dd577a301de5913a35976099f1b4124a2a2d8d95c2bbe3ff1fc35c3ffd51df6b890669d4fae6fbbdaefcf6bfbdec26142bd12e9f5c52dfe1ad30d759533776d6c6f150a2496df9c7376338b3e791a76e0cb29265198aab5e2ed56ae575b2ccb754ffeb1c99a8218186b9e6d44f5b3fa5d87698ba38aeb64e5afd2cb3551e4da2c50b61ed9dfabef587b5a66eb443359268b57bcc35bd9b43ade98f403523d0b0d739636ebd9cbdcf8df362708c44c3d87248e3ed7557da59dcd6ca5d6a44a0c1bfaf977bdf9ba1c7fe6e2f0c89e669c55bf68eb3fdf4ef9aba51de68650c46548c30da2a8fe8235aa63b5229b9fc3cc7aa43a0e939ffb5f5daec7995343ba2f98c3f96144a0bb5bed037a2d91a278e31fe4b6785b333a2f93bebe4fef22a6f8699824093917bfa2bd5726bece9fc00bcd8427c27b658caef67cef7c3ed7fa7d8cb45b4bb3fa4b8c66d3dd791da8a15d1fcfe9a5e8b3b4c44abd167a8bfec9df6fe637f400d22dadf515a4af9863547d963999a43b41a7195bbeb0a7df751c67a7f8850a91a43b43d65bc996e3b65d7d26f8ca271404d219a949b4bccbbdc7ffef8752a4b42b49a2bf792db6d6d9f52ded48db893d1ca41e49432e64871b6d4568a7185b0ea5b659fdaf3ad27ccb2ac722f578d209a8656e7af29855f76fe7f205ac797ef1967c71153bf2120dacd7e730db3bf7bfb9cf5c53fd4fca1f5ad3dc77dc73be9a6ba66d94545197f885049357e68135e1f6dfddf7eeff7c67d687ddbc9759ff7e7feb5cfb2286af8d030aff4ee8bb7e494675b6dde43fb916268b3bc93defdedd4439b7477af738ed5436c2df68016b1c59f62bdb9fd7dda888a1dd0e8a6947e2971e516730db32c83111579a762513bf3d068969d7f7fadf41ffbaf390debe17c92f659691b6af0d0769e18c3f9e3c4f2d66a5337a2ac8f4e952c3e3df615f336dea175a9aff49ec628b99d34c6349d202b3b5a96e9ae739f65626a38a0458f69ff557358f9dc17daa1754ffd9fdfee6e7d9db97b8ee208f5b85aa72cab4346b8fb9edaf2882dcbbf542823d59ef10573c51837f061ecf4432be9f4d3c6d48d351a80564a7829ad16df7e75a5316249afd4fdf71a3ab48ae3a5f1c319e1bc54ce9f3d2f0d357368b14618f59cd2f64af3cb1bd188af1c39464d75adfcc74e2de56a32802da4965e3b2f8d554e2c6deef046f873ac77ef9f69eac6984fc99ca4394ec7188746abfc3bfb28a9e5fa730b8796b3cf1f5b28edb7577f8e01edf74e21fc37eb0823ccf6021ac6d8573de3d5f6c6ade5992a33b433cb2a238c58ca9a6de71cd6de6795dbde4bed0a356f68d9de2da7ad5d520a71d76e6897db0f7fe6326a9a23cea92be483d3dd58add45840f3de5a2c65b732426d37c5b60dad6799abecb273eff5d659e6246ad8d0bea79ada4c7b9d58ce9971046ad6d07a8fdad69eed85985f4cb311356a6856eb7ff3bf3dc2dc6fbfa91bb7dfea92b4962ccb328c8a78a6a1d9dc61effdfece33c5d75680de1a33b6994249619ef75abb2d9d57776c6db4d1efd48ddc77937bb96a28a0e1b867fcfd5ef93fa6b8a66e445559838656bf861773afbbe4fdff9bba11c617b775b4e60c8dfe492784335e59f9d732a362113566683d4a2f6d977dcacf39a5a91bad65404d195afd5cfa5c779410eaf92fcaa5593726617ca566029abd9b7bd827bc7cfafb7367935e128a1a32b4a8a3e67dc7c8b7d578cf2c7b71ed62d1206ac6d0f8e59adf1c638e77da49c5d070855e66bd25ac77f2195f3561681cc6bf73ecf15f0a77cf6068f856b8abac556f0963af5f683f4b5e6fe7dcd6fba3a512d0b0af5d5bc9a78cbb423cbdd028f7f2c308bd8ef1dfbeda3e0fce0ecea9d35d683fc7ff278f3fce7f6fe4b25e51c38576adb6fade7f39d79c575feb161af633f62c3b9fdbcaeaa1165a97db42d975ecb17f2c71eac6574b95aab566a1e52e65deb15bfc39b7b9522d6ab0d076bcdc4fea7da499722bafd0ba96585f5931de5fc369277ca2c60a2d565f7b8f7542efbfbfbd56a165ea7f8713dfd83b8e11c328440d159abc18e6aab1ddf3665c79ad5368ff6bfdf9bf747b68b3dda91b51dbaba59adbab75cab20ce2502385062395b57f6833e717ff4ae3161ce94e8d19ad43f921cd19dfae71ac390aad464b3feef9e7fbbdc73b28cb28a55068df72dbb98d54e22badcc2a974ead5dd43ca14d9861a4d576afa5bf93673486c9b2185191c630738b9a32dafcd5c7be71b47377db2d04c2d9c1812ce068f1c1b92b174b65699aa87142bb507bbc39dc52469a2b3e5ac176e6b27ced7d767670ba6f2165c932ee7b20dfb79fec461b494d13dad635566abbcd30fb5d65ce354c6897c21be1dd7bd2f871e7a70ce58275df67153564349fffefd2cb6fb7a4d55e219fb8c4af35c38f2be6b363cfa9514b95d461dc5ead53952ecd9a3546588d121a87be4a5e65dc1bfb89b12b49484b966554e436172653938426e9a49c5b69ebe63c76ba25cb2a8ca878935e728a1a24b43dbbf7f0c73bb58ff36aef4a12cab2a45796c1888a492f895aa2e6087b259e74d66a71cdf6ca3a739f35f68979d732528ca5a8314293be77ab63b5dc63edabd7b22ccbb6e0ece0ac8023e48393652ecdcab22cbb70889a0868b2560d31bc53fac92bb4a91b591bf7bbd7926591462b6a8ad076dfb94f8f35def7c30cf30f118a46871a0868d1764c29bdf8fbba23dc0fd0f89f1ec2dd25f6b0c66e89d078dd306ead2bec98635c5d1b6725cb5c1bd77bcd184d7a8db3adbbebda7bd57c082d7f0af7c713425c71ccdb015ab4145f7ab7a7d5ee8f67eac67ce2fc8b7b5750966118398a268b1a21b4a87be67bf338e9d792ca9a202a85d0de8ca3c576de79b9ce019ecfa8e4b06a969918a4903184104090863400340013130040502c208e06c3f180a20b8af7011400045b8c6a9e42970aa5f1688ee32808828c32c400000801c000048c71a68805eaec43c9e0c6228abdcc306d12e8ef59889c6a2bb9538ea2ac0ec105fdc688a82539fecb957486b6f56afa4ae7ba7925320251b09540c9248128398e5402ee9f752b618a386237ff88c901258826c525180d4442592748bafd99e5a4a1cae09051719983d8b4f088801ee7a23f1493a1efab325126ea8926d6e6f541af6923e7ad38516708f5c85d5360de84a3da15959fe481f308b4cc0e6c4fe44d943b5e11c224a5bff1509936b9de7875e0a59b1769f0fbe7badb259eb556d399739805cfef632fafd509503cd0517254bb4906eb6107c81dbd6ee402fd68ae5281abbbfb052fc25d5c2bf35ec402f3218b8ac51ae6c7f3134ceaad11d886fc95cfb23d6e4f75a41a8de3a03113e3ba0bbed9dccb73eadf7040e7412bde75ef81de9e37e41db7d19b90acd8c5768feef1a089a73a7eb71e80ba193d2e6fbd7945075eb7f57227eff4f1d089271af77e5b0f77f2a48f779d7884c6fd1eedb076e0ee113b7cf316787825dc25821dde8180403b9d583440b4b036630df90a34ab8959b8940f458ba9afb8c669ca2b80142a3ce08081444550bd2c7e72d719875f04358cb3663bc49b8bf565a7d032174e491b6b956a168ff4788e11d17236c018cafff9037e4597455fe6fb002625bcb7e362140cf265d7d247d67b193ece67fc2f505221a85aca0e6fa9b787778f3ada851142640e8e4c90b683226693656e423c681ca8358a8642fcbdf8c0ead9c8af7466d48ad7d152443bb38c7a793814f129efa165070d15649b814a6283693d0a421489fca3f4b29be613cfb73e99b58fb941718e77f8cc3a36fb945093b969a1db043d14f565f97599b5886deda4d1ef7178ff1a49964fa36d27664dc334c7213ab38f557093d572af1dbc21eb183fd6d8bacf54715853094f7979c3ad19b32c92dd4bb1af18a595f921cacd2cbb3a6b569d557d9abca4f49761d22c937a9d23c1979eb19c085539b88d1ffa02d46f77f29c11fe3d12181727643465cbdd9df7d3e138b12e1b67bc76744627deef59ed81cb502b027f771ef6e3f3e57ee21153bd950ed57ed3a3aae4bb2b1df9929aaec509dcf95999979e6a760b0de69c917b3af714a1563e68d6ca06c155feb81c4ee4ccf5a4d59c1507907f34651be54941c1ca5f05e50e0ff59a653310755c051d2adb40ff7d22654bea0b917e1db6cec6de2da9166a0363afd9c4d156791ee9c4af0ddf8073e20ef9ee00dab67dbbfcc6f77a50630064ea4bc25b92038c6db218c52c2d8408e39c6c49278d47b6171ca29e43ed22ef7bf117c5dfb8fc341eb614971c52056d3457d19d9c36b508368a2c01859fddd73dc2d1106485537fca40ea7e4cf9fb741fc11b8b5d32240d1180f855c950dc8e8f1672b0950ef33671be40e4153901572f7d4c172adbe1993894edceac2231be209630246af4ba6575b3769b363dc82c3d408e53232c4454d8e4c993902ea7ff2821d9e8cb3e61ff54d1fb21dfa098afd91e6e3a3aec982eb0767bab9c0dc443e6d81ce2cc7bc43b1d35ae45320759348489f9bc89152cf1a8d905989983f172b0de93a7abb07b88b732493be2b678dc40b65c9303d01fbd9a89c02c5e500d978c824c2f18b83dcb58f16486d21b8f5e1a5f95bad2ac031e0d9b21d509a05cf9d09ad4051e1cc1473e8bd84c403fe7293b06f94543551363f410ae5ed52afaee565ffbb40633922bae1d5459424e6fca79a1351da356a3d1b5e422b9e7afdcd0936b2d39f75e4f18bc333d0853bb359ffd3d83607a6bb2e9f4d0029cfe0f1ad56a27dd23b347b1dd0f1e905dcd9fbbb7e4f223d4023641a3564aa922c4b744e42e110890113cf410f628874fdb2ecd85d3c404e8c7287a2ceb1e06bce7b8954b57fab6e084497e997aae33bd0ed273344aebbceac3721534319cd4e3b5e9e44e2e4d89194162207444723e585300f0861749769790199800d72bcc5b7b9fd71e56afa4fff57f2df3d32100f73b5665c1dfb781e2843cd01192f58df43229f07ed3b436993be710da416cd82fb6fcdd6f0988201d0028c87fe0033986cf229645f133fe39cc9b1d1b722f925c3beaaf765930a54eebdbe770430ac184d1143ea4bf332ec63bd1aaf1ab33557ff202ba4e398db68c00c77851d245135d1a2360808088838dc509a6ecb2297b1c929c2112471be2e26e6e4bd93821aca05e7506a5c6fbe5346a7c667264ab37c7088025e96e79d77d31f281d1b1529b857991f3b4a2ce11b12c0df0412f24659ed21dfe66524684a990d0276962c9a929e634ee100bafdd220291a573fe8c018504bbe0fa5a0600940d0b3b3945af142d36714189f047e36361567adb16afb345f99da96ff8dc38eb4fc35effaeb24a4f12efcbceddce2ee47dde7127c50c78e1eb2f90aad30722e794f30ab6be2da823fcec9ac5c062018e486583047e341c1af52bc79e01b321c0a3d0573434597231f3e0b48cac5d75193ac6a88600722d2af1d60b3af242c8ee583ea847110058825e89eaad02540740f1c7df76d95a8d54d31db256a627aa1ff02823800be0e61caa858da30ce90587f3ccfb5b36c54bff9ac114bea021ac1a10c83cfb600dadfac8ec8ab50250db370d1738ec72dffdb31e68b2d308bf5b87e51030ef448d5f7216d9a47d7aef462cd04e1d0f80f855a496398aa8e41236cf620f24415a81e4dc40df3241887649122ac7fb7e9ea64d7f89019256dcb78611c004bf61cf00a1d0cb602b05bda516b9c3b261a6b950522f4240ec0ab91ba60ca4f5dcda07f3a514628e3d3c32f288c57e9ff6a4e9073e1bbe097955f0420445f1030dfd60a7ecee9ceff6a47147722169461b39ab8fa0315581c0bb48748fb89194f7b47526b1a9cd15f1968d849717a9ce6e515a72f67920645b5d2e16723e948e05baf0ee11163a10573075cd752f4dd982364743b01991b35ef7ed151e3bde7bdaa1444289321f25d81004cb41aadb07ba7e798ed8ba31afdfb5009543e0ae2e3c6109a1279204ba032bf3adaec1fcc0221174f3dc0243e465909514730fd9ae64528713653a5ab205a2f5fdecebf104be9b5930ab463b0a466c14178e0b5f54ed841830d301d12a91e35db70346e41a371eebe750c1a2bdcddc919a9da76a0a02b39625aac2ed410a744e30cafab36c1c64ca4cd8a71f307a1948bfa235284d7c059952b4b8abba362ae884c6e12ab643323b335d9518fb625625d955123fbb3280e73fa642dd802b435bf9ae4a6958cf1f404d23b7a97b8b43217fb0da3f5a7ec6f2fa0accf49b2be5bc8e7353dc105e7352f4943c5698494d0f23a354872a02d49a716e6d35f5c9b706531b2bc13f959607bc7ff63fe0f9f290317a0acb767702b92108bec76e5c15957084eeb4359685ec1fa3332a1dbe56cd55445380cd51681cbd6e51424fa08c5f2f9505c93826adc7ea795b7063307073cede1d7207e38a63338438a544d64fe17e206d16367c89cfcb1f9c8f0755baf981ee4704948e6b4429c9e5cd21c4b407fcb2b49971731707a3f37242c9a8ca6994d96cc09b2b768273bae197470f7b340a9943f1b44024c4f9046468d78df1a1000b0dd0968926e9ffd07fa543ddcdcaf793fabaa646056e0eb4123a6df3e40059327e86777878d31874ec59acacb626169e4214dc35bb5d9d46d407b085e24d1608643b50ddcd2288996e23f167f1174cf2ceb5c341c11c6de6d683312a91f644211f2c3710436d50ff93523de76718ac22d465a73e8b2e0e91b7910581527e8f1d15356d62eb3912fcad2fa03287f1263eeb53e830bbc5f5b5eb99616167eba5c071896b21470be6a21d580fc2c731a7b1efd99e1fefc9fe9f331b4cca06d16c5981d3c5e484291e91c299f83eca075c9d287be36adae5fddd86554625a402f89e40a083fbe9ee6c910bc24ca098338ff6e3eeae49b89a52aeb977283e834047936944210be8560728cbff5570edacfd56afc82465f8da0b35f0b61f09fad8e24026254407baaa24f4a1f5d58a47b13dfdaee917f0bb82af5b17215b360a8ea992647ee29da827d06989616a3be9f429d680198dacd90c248191bba25d25e268a81721eb0d7df9c1affe607a46e6257fe8946f5c080be2023035aed710c1e1edb601dd145c95e82962cd03495732887da8644695ce35e995103f200c6a4ea437318ab603b5f6c874d168842ad1903a80966cc85a2277c0aec0da106d87d2573ec9b4c8ae29a88027874c518d96bc0b6b14540acaa6238c7aa8d300a61316f3449da7cc3b350c04bbda4246dbd323284a3514978a19c4b7c15ec4cd6c7a51a6ce9955f3d70abfb3908281541522d8c00fdf4c53eef5d8cf550562fed4dbe8e45e2669e42ba27242808e83e4e21a0467a3d83675c8c86c870561183b008578b044bfa8c927d40e1d5541bdf503513ecf4cfc92729d215e56ceca5c5f108d1b0452bea8e6473ad5674b975b43ecea5aef29526ea28f1aff126ba7f423698480ffd2c4e31e85b5373c7b7dd9f91bbae3646319a4b837f44994859806dd9f0470c30688763019513df8f68ed75f7a07f955e04891145b30ee7837a7af13a01f38f3da70626b080da476b2b6067b90afef10c65479ea0330e3ee04c2a219bb5cde88feaaabab8a20ce8bba912f6166666b9bd6415e943ffe866e28780d6aaff377019adfe3622fcf8c31f5534a4b81f8aa43371c3acf2fdfd7341985c1ea2302cb9b75cf80fc480fedcccb16970ecad05c3474ec0d606010febe7cb229633b312c0adda17f140233f6684993bbecf79252813185083f523054c971f03d34a816be38a4ce60eb74db4791ba5e85b4b8296ccfd801045dd0ce930455a42b78b058ce4c7aff79c567b755137a3697f8ddef62ff27b70e1d8de61b452698fd44305530fc945e9f1189a2094677fcd34757ff898e6c512e9079d5edca1bc292d2b41c3d91c34d7a0c8c94911ab738e2e41567534796e2904fe8bb0997cdce6c229a3898c060197ca8aaeaf44e1483d0782c03889a370cdcb56468491570eb8c73a9bb246883ccea621834ee92fee968a64362f5ee1642aba86db8d6663a8f31c5d14709e8ba7cc4017cf9e2288c15d462254c02c498fc1eb050eef52e9145aa5d2e9e37fc2e0e72f511253200b5285821018c007474910291ae4730b59f713a27067150564c2d2f9aae58fcf3581c308622a4c17fd0ee57ad4bb0161dfd68c008c3654842cb020d3e50caa937e08fd460bb6e067cd7126240a21e5b3d4f0803f5ade33fca99ad00d405dc98b3cd6a0baa2834a99a60310a50956b428450ef3e3eddeebbb2863e269102c652c21383123d6526b806bad20c6032186a0074a66515e286ba813262c145294f0c630870659b21124f640df1b176a62735bf3f021f4166aff5b5e94dde26140257deb159652bb8398b47a42568401fcc8855703dcc4258b4da945c1f87155311fd75d33f825b634191b5cb05b5dafe8978c5a2fa76314297ca3dc11de7426e30d77102e884ed97d3635a96215469fb1203adf6f11652ed00fa7900550831e2b761cb6eb1372bf117765244e261ae6f4f7e2d6fddc55004c65ef896a844b4c7d08b126db2ea25781792f7b7dd0a98809b0c0b53bf718da56bbc27fc43d64bfcd505f1c8e625c190326c5d29c5b33db01aebc0f1123016d29ec4865b4096d8798a77f7a4d4e4ff10aaa14634553aec2c7a5f4a8fd4184f525aa709709d9221e605ff28506c78e0400081be1b07b122a4a2691600ceea82f0bfe1170ae2f15f93b683529807579aee7a59f6bdd5a65877a526f4ce5b671ddc506cca7cdb0762cdd755e9ffed9123826ab3980acfc10fffe892c2856d03b75cb1f8f600a5f1ed86601af3a1fa57004140d026e0a10137ec42d81c1ef54f95ed4b0932fe44c79138fee3d74e5b30de9526059b580c7b8fa76e2e4a36b62d4a43c4396dfb95bd903ea34c88336cb19ce2aca0125c4dd59018c13ede4cd0908d0fe72382ba05b0fc2d832ecf5ff802171677313b12cbca4650b9ef1cae5bbf714765ffb16eddc19ced01e40f501345530d4f3a9e7faa30108b60a479e3371c6d4a967cd4680e75c933a1598e063b353a80f488bb756980dcb0cd8a8ce9584846be42cc226eb2285c6a470e6a9b818f4641706472a22857e4f770b1749b4431864f3556decc594f6abf922402ed9be87376a242b13bcb821ef2e4614a603d159806403e986e058dbc64d756b7122e90d4990d29233a4a0e7305893b91dd15964f3e3df763d7f3c60f16f52dec7a6b367135538ec922d333304e295dcb2ccd60ecf3584339aa5d95dd66c0064c5845708241992cd12da7b049d4881803659009e60ea2fb3e40e1135e29b0b5711f4a8609f1a886d25bc62fafb74dd7e457be5f9599b21f407101e4d3af80e52234b2e84f66f43a8a1546136340d770f1cf58a4cc2461c50154ba603c3499fc5477575277d5171304d60d04c42fa75eeed8a39c733680824753312a352c1467dd23536eb34f6c990e5c2fc3dbe8c3da7496811fad2ac9495bb4545b6634ca57444eb9a5a08c37f903caac9324cc9499dbe780195c4b7636bfbc980b4041ba72a431c7dfce0ff22de6a80e84a3f505c7bdfa14917c76ca582024b617c5696ccd3a122517e610235375c09a7866efa9ce54a7e506dccd91d29393dd98b01ca6e58e9cc5e5751fdc32419017c0dc6405cbd6a22f94f9fb94417771d485585d70abee80e4522389f0c0b798c30015a9343cdbe8ed531f2e6d07b1abe1827e4685e8798d44b0f88b1f57a30bb2c85e5319e09cd8c84dc16bf7e1022c3292f81bacd333e47b262e0cde489ab307b753f4bf5e66a4fc4dce4dc81e0a5e2b6417e8a57c7a7b5008187cee58c2925ef245f63c075368d845ff15d67cf9b4aece698c388169e79ca95a14062ee8aa9793a3795997f0afbb36f64161845502cab86dd0b49eb79351035357dad878658c9db4efe44e45212dc8f1dc7679bd0c88eee0c0cd67e92e3777a570d95700419be52f552ac4c91a3b96adadf6b2dcae1f392a39156c8aabeda4dbcc66bfd43e4d64a2e35282a259d7c71efb388e6e6f7c647818a79b243e2a971521d9fe27cdfe671d82615685884536951a75c292aa0526837b7241b7289981803971de709c00af886286f79b3828350080967aa16a7b3bf8a3b6702f76386c88784b77517c6c112f7565793a7d7860310199d633d1a51e40cfc16ed4ceba2b76d3209253fcdebaf2a5977ceaa08d68972976a3a75c3fd57481c2ea48667fcb2af301d88e5936d940646171dc627e254b0e4bc5f2543b0bdcc02eab24e717a2b2c2abeb2cde84112186561cbfa9f5d895ee8ffdfbc9180e9347a944ac67e430c393c5fd6304132c34e991c75b092c0595c6e84fd1496dcfe7d880f2bd4ab59a06c8fc7bbd133879ec43b72ec2cf2bbe5ccbe0ebd7a36fc0902768831cfb3d71b4336424581c9ab2b370746c3a49d8c00a76b493a098c3095e9b958a6ec99088a060bc177d9129d8630a61b2bb4fa7a63e27291b4ea796756d3c17023c068046ea9bfb0bd28fa39be36a5a48e9d47f9c27c6133e2b8c609d50134e4dd0784723303ec9c43ec0b667823b21b2d31e05c8e5bc33c7f92b484437492f0e073a26185483c433b1c3ca07297cc8c7c49f97c88071aaa4fab4b698b6856bf08f457185ebc594f1a4a8f6cd6e70029944e0f04990e297ce5868ccf4e31f52e734cfee19d6c5044a2998c7dc2e922e0600c0e2e7bb70e2ab8dba0cd630bd202cae7a66d2c1c2f27a9b3d113cf1ff46cc78479e105ec6faa7440b238ef18d0f101a6d51be381f64cf911043661122892a32c87b2bf99ee1f6e4dee4490d70bc4d3edf94ce0558f896e97f3da89a3df3a058c956b8c6da5774635d618b8fa0cb952393c0790077a1ea3f9371a0b67c2331a83d383a0514d487057a8a5524a23f21f3ea138d90cea8bbfbf6b14df84a85cd3e6309ac8035531bc17c6de6159632928ffcc18879ea88b8eeb2481379429026911c79ec3e72b93226e1991866f259bde1a99c868ca41ec890f9006d93a4c676fe160fa4f388a0121e9caf6257386037a70e77c1f8549802b48ba5db9dce5a1ae02a5a6558f15b5d04d39d0e247c4764fe0bd6ec0eded5239fdc732ce97724ffb3887a67ec8d7ee199ee43b93ee3c97f8495fb46ee7562776b27dc092acfb585545cb474bbfe85d75df79a5f30a301e6f3b68057e8cfebc0ec1953df74c800ebd962a6a0b490417509e2b9e26093d413c5f33a1d62bd096008964b7123f13d8b23e06e96ec27597ecf5867daf647a7de6b6909cea2b010309e9c515095e15b8787d3a8e1410a00af20067697da602f937f52680d1331000ddba44a3b04baa4d01f4dbbd591baead3b840c81e26a8f44f098f305159259d50cd07e023c3184a269c7d58926969577903ecadb967f9164205304d01b07f4f57d8925b3d978be7151d030ca794f3ef58ca8ba11db5b568fbb82c1d6841ddef2a665c206e3d4ae995c37a4023c0f0206dfe759b1d3e09adbfe22c2449849e5787c955c632a30025b7574349462cf4ee9d631373b2a7bf3633e765b6d428f0ab2321e6fe1e0de33b2e9ebb5eb016064c94e47634c7135666caca8fad6a94e7c912170bf98271f1ab1736ab40cc343652705c1d0b8a86dec5b665361c071d84fa5c5840250455b4b7c5610986b274f882f1d037d7c06bb9a872262e349df0b0fe1cbfa50c837a40f8614094342da721ea56c38182017308639522c6da18b88f9626694bd6c545ca48631f887770e5c69e0bf35b6c4552ce89cf7cffe03e2648e40ab7b2ecbead1d237fffd37c4a272872c7107e09e386f3b648327b6d7f1b1f151def164c5d7166bc27e3c34617073e7519f616f30904869c6e398fa16d264e68a66399292330d313972931cbc4a8ca9400652a6a3221492631a5095e2a47e26a53a86e1347b92980996a210d2e344c80990ae10db34ce30efc50263203364e2eed44a6ab5ab6e0259a192189251e50cc3e48a06915ada408daf698a988e175e5503453e220f04571b4ce060b4cdb41e9fa1e6e699db29be158d301850c0b141d774ce049a62cb19aabe368752c4d2325ef22a551e84df70ead366934f807457f11447256c1aa8161c10dbb2a439cbcd48cf15aa134d107834404f1747081f896bf49e44d31667fb346f66468dd2acb4d380bd4257b982463c80c2b11e3214187b3206710f139e78212969509eed91cfe54ada379dcd83b9014a3ba59eb660ca7f5575bf51d946c09e7d7342a15f2990f61b43d31cd798b4838cf1b36a613cdd0f8fdc8d48ef9d1ba2edf29ed9bf0a1fbc17cadb45b99f1331a282d568d555fa2645fb8564caf961cbd6ca964cb2ca83d40f9982eb282aa0ce61c0c8f09ca73451a7992e470224a2e8a36aee9ed08d9b6f26c879f60e34a367c4d47165450ea9affb0069c90179b0e5b0c2c7132b0e96087c8b80902a7ccbaae8a7363b4053c0cd641c4c60883607c63f7252a12e2a0db46dd25695cea1a77c853988b5cc086f24ba165c9fba01770741146f1d0467b37d545ec7cb81af6e978edd2d88c3dbebb2ee9ba642285829c81a110d1fca9f57ad50c397bd835461bec8266c8ca9c9e7936534706313f4ef66304659e91a1097c165e3b1bc1c4f136a473d8882e8d5cd06b0c41029b58c3d5868f805c3f9c45e583e71d8dfb193432f9009357fb9cef5e28e01f7e4d264f770720c5192e383c38a5986bacdd98f19261b56a1a2f9bb3abffecc236c77757eafec2e91822ec0b340889e7f6bb3b8abe2229adbe7d14de6c4faeae0db996e24b1c08ef0f74251780ffc410b53ebd757142a3562a0b5fafe4be062726a658b8560f55caf4ea492cf3de1eecba9822bfe8d9b88277b52580974161feeeefbe85cfc97bb79264fa08268a0afac6f37afaa913c21e8026ba41feb460e36d84f001db34aa9962a622c97ebb844feac2d6a457b46576e20a8b3f2468472e9a36ff05756718af1bf835d5d4bd4d96e25af33febb39df5413cec690255865a26afe44e2dd5746cc531f54673f6fc9f54fa24192ceadac37be45e63e843987b5ff949ed943d3f4b3a328f55b32791565e3dfb3f48fa41501d2cf6f17144a962f871ffb674a1152e67d77e339749ebe4ed3255a4f9082b77fea5ea65676fb4b20cd0ae6862a5c26f74b6afc2d1f87eaee13f16a9ffa416a68c814ae60893abc7db61daa0eddeb602d821ff26d0fb56252c3cbd5cbabf1c192af4460d2eb81a3343259533efef22fc45114c94e4294a8efe8061a1ee7ef1db14d2a4b36cf131ff15f0adbfb413a6b985eb1a5b90323323e42601c13089631f2a6e57b7208e2c43e29985353fd9553a4ad2458d5dd7f9d53e8406f340b94a0373c4e9d2e6ece05c715e88378b564e278a338c4eeef428fc4817630ad99d12fee5332b5a587cbe7ccf9dc8379633fbc4423a5a1c86f2ed88dd66953f42ff87debcfd3b9f7fbecb77ffe3082c2cef66b2b19f19025a561744f77ad663bfcc28e381947a8367099dd8643959d5a4a4052bb28d8fce241d8b42ab99d9c67c7592a9fe7a36f20f88d97dc3e38660f9b8979e5762b432ed735b0d6fe8456b1b5b5f8c8880472aa2bf4681f37221c1927fc1bdcbc0f1d0595ef0c01209602fc8d607a8b6b10e588fecd3c43d95a9119c298af86b7e201b46b5e6742967affca43e5b8b49d3f9357adca9f7fa069941e276dc286038ea99a1c2b9bffa54a50e2a6a6144b28c25139e529bd0754a9955ebe31a4e1fa382fb40ae2b08d664280a3ec96cf3aa81dcd3607aefeaafb454791aee51cb26eacc26d3ad5cd7b82f98cd63fdd86bb9218075e4eb6cc4206ad691b9d3ad39093bd6c880ea056874c430cf8538096fd2310320a18029858de21c0b522b8e687e7abfa138c2fa796b6a92fbcde3776c7b4d40f551932ddf746aaec648d5783bc9bcc81cec2d6d63b1f5ef376365c082cab80a15912c0fdc428e91f6caf170a9473e30002bad12743a58e9bf3a53b41dcb561d22942b451a96ce489a30f7ca30c48ccbce2542fe2b0d0d61a4b159ac320d882ac531126c8b54fa181215ff0815c7c653120bbd06bbcff7f37efd5a814baf13fe6d4778efada627bce194b8a55bd24db7579e687a961eeb3341c4e3935fdda4707b3a72dc54bfbc3061a436d21b0e756feea8407c6f6f18a9be1de75db29294165efe1289dcb0e45f3e8fd4a56a4de4574e9b417ba24b3c856ccce4bc76eac35b65f51c36a980828b117e890527e0e0dc74250a340df77a09548e832bedb6af0c93a2ded8ed850622531c81a842db58c215b4ab286ceea3a6b3c39fd3f0f068417472de2f87ab05e30dbb8c527dfd4cf83ff35050e0fa6765d845710a5b96de0babf3f1f2e13dd84f204c3fb018bedb9532aa41f1b7886c6646f7bf27c5ee62d361208f34986d3ac54be802bf715b95b3af362d97a5dbc3ec217412f754ab3f4aebcce7124bc7ef1170ae85194636956dc77c7479bf33b9502ee7e1914ef1a0ff374574d3568c5d04e7131a24e2a732fd447415ddc9430e0123457438ac036edbaf4ccb98004275bd0ddd7eed3ba900bf855e289db0e952a23acc3f0891d77ac58313ec7bf8e5e0c3152f4ec768b866399406ebffafe88e20d671fd752234ba7ea7e39180b5e73144b081bd7c71e96f8a244718aa1d76a0459acba2e8b140c2497833670907c9e3324b512e01596f669a25c3532f3865c8c6aaf0e1bdfd6107945a1cbcf1b43a50031204164ae46cbe609b6c533a746fe8c5a9bcc128fc07ebfc5ef0bd27cd6416ffbdd7ec0fa742bc21c08e4c1408ab061863b1618fc110ea3291ac60302dc5a8688172d98c39651ad8e804b0dfc234ec48f29580bae36ffac3a61367ee5fdaca68ddf935bc058791138ed1a38b9cbba91624bca77dc7aeb6cdc76963ed6c0ea1f3d4f3f09730eac1f371d318c84c2b7fb6a14859bdad023224ef7716e24892e4553782c099a79d25c9a2564c73c824f34c1051c34cc730afdffd3f7d1d78e05738f0775f17860bc143934e9a557d902afe4378dcf6d8a1f9d9d5c8f7addb2816f3c70ea57fb6738de5d118286f43886af1097c6e555849aa54e32a88d7cf41f449a9e6bc6ce533e09345698edd087262fdd3d3091189d0941be4d66412731e346600fdf052a6f7c4d4e046ee43067d36a54e46b634daed9ef31f7dc3d44d37b74f6210918dd0e8262da41b1d53be8543d0a57dff6c077d160e8f2cbf14d5a735d1f83332b150fc4fca7437876ba1954b1db6bafed838da8ff6f3a33c75d92ed55731767ce19cf4043f4eed16aea86e89f7ed7e7b29aed8afce8fece71fa6f603625057d825ef9d2b4ad52b41ea78cb4b7edbb3a3972ed93a5ae7e0a5056641e82598687bbd5a20a1ae70ae590c6e4291f3bdea3903addf853839403c8faab679819b2a56d1cfe7eb6326794c3786672b957317929e6fbeed803baffa9366899c49742383c7c1f527406657ffc10363f4b3d750e621af86956ab50810031f627dde8876edddf48487ef201ba289fc55a0f474f93b20737ec79d888ef807c9957f5f9d3cb5f9059438b95e72464afb94d1b607239dbff026425f427c1fba0f023c28febd1cfeb8ba023b063f91f3ec2e744428a2258c042e85134549cfb9ed10528feff41a62159c360d63603bb29580ca3e67816fad8bdc8a4daa71f666911b759ce0b07bd01f1bb25552729fe250a62ff439824ba94eaeb39cb3e8ce9e5471d939fb403f03eb6cf011ebd2f84ef180e66b0bec14c1984a8cee85f57101421111e3a253cf27166bd4cec686b0daddebe21df35be601e6d11aeaa6b357f77e27ddc60abd0c5443c39c481f9dfbf49fb1807d78e753ef1402979479745df1a9d9c44e5b8bfc68e22dd9f7c7f66a3fff96a179fed310bba55e56a6a3e9815ca3697c3f560da0b7e6b17dbc4e4fe6080a272019f7f25bacf4d349db7e31614a1573f6b690e55e6d2c959a2ee069b0b4eef2f5be47412a1dec920dd67561da8d762c6895939bb8cd47fbbfb1c1c8f938ec458cdc37b6fad272f4e030677026db3b01be7cd967d970e4e4654ce1048b051b4cf7d4fe84402729f0326a4e80f68395f9ad50ecc3fcea224ecbf5dc6216a3266d1f898af42db0799440171b4ce56d8f255ccabbc1ae7fc463eb0da36df29e1e4b2e08aefe51f10fc96e870275c89c71dc1f561aadb74b6fd10182f2ae0be313d754e99723b1ef3a08f70ba88c0bda8234d3a0a75ce19046ed62fd26c94b4e9125e9ee55ae43eac7a5cc8c4558e4f3e02dea53d9233e30bc9c770ae84577e729f3db9afd0186589509aff2af0b47d7fe2dc06124fe213f3642ff29e9dc5ac6492e3d2e663ac627519e93eca9ef53725d9ebb72a1487e1b3bc54fb5056da1e7140fbf24f243a24b34890527798ed361504f6e653dfbfd40f2af0b6cf194f545dc7530ec16fe49deb9f3d9b2721f23fe43917f6eae28a787ce23079531bb1bafd0fcb9b69f333c15e4c80cb93e53429e8c42cfe7476db57626adc5c0fec5fe875c3be7ed6f420be0d9dfe8a28e76ded15bc5af990298f74b406957c501f38c119ea7a0178fb4e6a34fa7a7a9187e636dc499daaaabb4f24010340568a55a12e22396c54fa0837588c2905bfaac25491d9756d8e31cca9250a56c2b2b7646d8f4b93d53213d32d1caf7d826032b3cc4f90a3dc58ec94a3678f0b8cf4598cfd73206d0376a22055f7d9c0fd13f7b108a6641f9d834362b26aafab27a6ccd13544e478143231b5410ff02c77fa2f9d74d48f1bd882f7d43b77241ce79e7719aca8949d5d7fa5a994db8ad7cb0e9bf4a99bacfe04776a4384d67c5fe57a1b6228bfa9f08ec64e198179159abafef41bc3dcd9b14fda3623a9f6cf5ff7cb0a9b019066c5781e4b51883c279c3bbd1c494f0cf051c3275a518c1dfabbf98f57cb7764b2b79b1413f68598fc27c5f375cf7fb4a2cf0e85adc713b6a9c3b81f0dbc0924019e2e270f094461d827f0cd038276cb63aa8fe8382690a08c0c22ba7fd7e7edc99b78b87b0453165bba1b3e439fcbc3ecc44bd2ac077e4e34357d3409e864e5d1264e3246b4822f74768886236842aa1cf2b3c3a097227f52808ca0cd707e8888f03af591fd11236657c4ef0c65fb19d5be72a01693f894bfb5c083526a00066e35dd340246afb9624c6bd9b052f2b5121d1f33d34977abe2e68ce3814976d9383fe3a5407d43e6a977dc062a09b56b7c8aa3cb2dd399f587b969ec1313a39f2e47067818f663510ac27c0412b44268bd10b22f4e826a1f1a03271ccaf1169472b088d076a7feaaf21d2ffa816b30676f4df835a727d4bc88e342165c324d720dac89893cfa238c342ef5f884c7c21cccbab330a6a47aeae65a88a73ddfbe5c89378e6a76d08511f33fe7826b059728125cc7bcab29242a5132ca23a4a2433f9832f47994b1795917a9713be1f02a183f38588e8dbbdf74d923d5466740b411776c00f9ec08ddb46ff942fd53e70a259c4a5d2e73c233d585d5fdfe29f2d528262661e380ae3e53fba7576dad1ff4dace9366533553434e5b2dac7d73b0e20c69be2f23a8c50ff1015c9e7cd14a43d21174a8182064d25127965228c08cfc5e4d794e243e0ff2c29ca06d64453ecce3e11f6bc2315e7bfd10f82eb97e7d8ed2d1f5e4de2c1f602b896ca5549599ddf9e81671e4a3d4fcaca9864ebb1df8a00ea57893e74f33e4eae5750563059a85b27fc9c6f8fc755dc9e21d550d3754d7c147f72a7531f5055604ce8b682fb8ed0c2db71d89e30897b2e3cfce06eeb9ffa6454a6ee195d2d4f7ea2f2a8496e8acb52665cc50d557d255e49a312a3155056e7be8114f72fc603a47f770502fd7bb24f91fef71644f31f9980e4fc1ddf5058a4faff45ddfb8f536fe33f6a2fbdc54c7f38f558fff17240dd0ffc2edfd6f88ba947ef1f193709977ffee0d4ae060b9989024d7f9550f5600a0ad7cc91465ff83f73fd7e8a804c0ca54640f2f36e1977e683f3b7511d5ad22b66708e980cced267edacfe71f97367cebf089631d86d21b103df18f53f7056efe2d1b4324d9cd77ae1574ce2e0a763bce02e37105942fb1a1e857f02da4a9110eb95a0ee49d6eb3fa0e29b0d9c2cfb5460ab377b2d76ee5eb579c8299919bd1c104cd32096497118546b856c2533bb3084e009839d36624abf34bd5ce5887f24094f7957e8f1dbc7499a98e84b8738e334eed4f608fe481b7a2ac24b40fbe7a7d3e25db097bfe695f16c698defd7e6afa55501bd5ddb635386cfbf9889d8c9915e0c1fc41ef1df9a0294e6e330b85dd991eb41c156d552290b28a4f570378a7d1509c8462a5d29ffa862d7a5a52eae8d6b1a0068a1fc1e2fe6dcb44053dd8a34d1e7e8796c5fd39d45b4112d0cae6628371bc33d4ca7f0094f8b3c6f73770f315b32a835aa70aff7f0c700f834e89ce48ddb1b14c6f6d3e79b67bc65d832d0b0d10b137a5b9d4d1a50a910e9d4f1f01b69b18113e165c4a8d193fca602c9cb154f3f621af9b61783e4b1204c00a7b987b650bdaba4a63ec3570e846634bc639e2789766eb43f971be5179dadc9cd2231418fa747a59fdbb35ad3cc17efe68e0b6237b70c370cd6e33176fa20e08a7cce4f8557e422a308c661b1cef4b466f04972ff66cabc8e69aeb743fa27bc8e2dfb59f71c7a4b0e52039c9ff13325d22dd8f287dc6568ada0dc7ed3e787c97887eefd54da918bbc5cc437d9bcaa0c6efa7590cd180202ab45df7637a3e454b9c54e68df2208b3b5499819d90daec395bfeb96b12a733432fce44062f0d8023bb6c7b6f9d933616ee11066ec2f688fc55896291e77d644c2c3059c9dd3851d5f035c105acefef3a77c5b9cef5233d540b7610e85f7b6b584992102777d59daa7d38b227d616b81ca7a24d3d74827ef05f12794295dc475ab21da74dbe4e7e5684ded70074c37aabcf013b7623b9aced14113bf6d9dfdc7ab8b5f81a63eaeda6633b6d8cd057b912c00cd30e1c27b1b7dadef9665b907d0d7bd01fefae15c52b5999c171536a8ed3846665c8d612116bd32e4e0a1df6b2ff9659069dc8c57d86a647ea377f3b02e4e4b800b75c022742903ced0d958d0de539a8c1a5e566abd833f55c2d8351da1b50bcf779779e73fa1e17634b8e617f08fe4ed35e9bada150026f282ebfa02a59d2a7de9a8e70a5d897b239173dfe75f71c03b910375edfe6a176e7978df9f3f8a1a8deef11cfcd016b8fb71e169b30476274967025ba2d6db493639b2f529df8dcb481bb1f391ef79cb960c01f405f21e6dc9dada4a74d3a9b6096bc872f4975863aa63e7da8b88c9b8479bcc3ce87c10bfe6eec68b1ea1afa2cab3eb85270c390be8805ecce70beb3bde25a4ba05ead57238a3c2c846d593490c92d5b27f2c7d41df49288d8f59abcfcc587ed4be296eb68839f0b4fb9c719ac7926579019db5db5bd00db9784fb0f69cd761d4147e47bfc3df71fa3e93cb2d95b09c18c033dafdfa02410159d3b4673e1346d5befa8bf04bbce7683b4cb492099f2d267e1b5aab5cf24acfc11a2c4fd67bcd8fcb055bc4593dc440b29484fbdf3bb9bb666d56a5413fcd31e9bc37f4e7594969fcaea36079bde429bda16b293ffda6f299515941e2eedccad9fe5d046649a4222402f80a84b254927d392428117c55d60349e17f6a2cbacdfd62fcca55d4828cc60a39179c8f9393e99778eea84463f58ffb302863a9a73267580616dc1e9c6653741953bdc35ef12ded6194416358180bc1da65d90f57b3d5151041265cda5f6af0a53599166f623bf013649e9b87c698491437245d517822b35bb8281f9da3ef6c1a4271020628a171169a1d94640e535fcd0ec7ef1864513a0b3b0b17793ff1a1fc97d205fda55144ecd9476d0c16b9d84d1db57b3d17fbf41d39a58bca3e320bd4f892b23515276068901d29847a29a184ffec71e2586c3cf0a82350e6a01dc907be5e644ff36af919964e519ec2d01c66980ca85f7ed4633e0b3d356f9b5add663602b75bc1f140d2663b7f682e633579fe659ab05f19d63de3703cf12f442bdf74541317df7b532cbcb55f3d01a0f719f504397fef3c315c26d0ecc98f9ab91b2098c72a4f459132ab73650bda0e761ab53276df8f2730209ea4550328f5f0e09906b433e73e391f4cc4ca67265a97ffdd07d5e675f0facf82aec0d1e7899e1fe68b9f1b97ded1b3e20ded75c78d9862e6e96f2637e10b47e886d6f2ff69799dd36f909149ac27633bfa51e50e0dd76c20b886bdcbfc9ec2fe312c3c63ea678bc834df39bf3a37ce273173619a6a6bd0af9231704e069e3b1911d31c61027747e978c2f6f679db1bc7f8496c3108787cd9918853b02aac173d34408f9f29d9b60c764c02e7a7b6bd8e24cfe76fd242448c7cf6b27859c6ad40817f8efb48fe98d11dc2cf4f46f31e8b1e9e0e8fe0cbcdcfbc22c9cb508d1c0876cae06bb3517513a6e0461a06c5be84197fb10eea6c8e39d91759b31843f4dd9af4d324410c44be61907f59ea1044bc6d4ee6d091dcf16008c99e6a7b765fd2852fcb7f7307de9a045e7f4059269092ce28fdff1769f415e05acf8e555a225c427bdef0144395b4c729fbd5627cb082552e2aa10c92b43a7a8b3b077a17b79727124df6bbed0182211cbebce27a3197e8281e8ce2baa8d6b01fc38db17286ed787667c3e7bc66a3f1b6fce301d0b3bd717a997c0ead324d73d5dda64b541f0dfb567186f7a38f977f8d9fd3dc12284b1f7631210add059e147317d5aae469a85888fb07778081af3c1ff5d205cf98e7701c920895fea550341b8a976c297a62b84b2d3b868b92eca089e7175c22231a17a1a88493605be02254607013b4d4e7b51035cec5c3c6a1afa2a619a1668e8664744fb3706a3b662377fc0cd46db5f03c330ac23d15dbc90cf7464fbc6b763990ce694d91b6d7e45045b25749778e7d4e1d24b120104bbe343009bfc74dfb910177e3cc2f2d0e8dd1253a52bf7d8d6e97cb2fa33147ca9fffe4dde27c49feeb310d19c35f5acada711f225f84e37e15f95d06335c83f90f21c5bc8c0a626bab89f9fe1f1f5f28f02fe278af80f131c185c6738499459fb87037cd33ba709d5350a6fd86eb093cf60788cc21e903b647128e0b44222c82b907b293f52e002c1b7b13c670909552a625ea1c33f3a30edabc0dfd9b29974c327d9703cf0f9ef8e791a2c6768235dfaecdc5b15f3d8bb8aed01162653c166abcf374cb897e2afa4ed78f90a38792870b17b25e973d98d1ba95d16258e42c3713465c5e0051d4afeda74ae70b8dacd568f36ab5c0b979924a35ffccfb1fdc94294898b7467db1d2036444cd56795e2c4fec577a4da5726824e157edcf6dbcfe041f0836cc3d2d1a792af959f6083a03d8db60a66c5e87abdc19a12c3f620fc69c88f30eb27f68ff6653f1fb9f8b9a003330891731569c1919b2b58396edb9d84336daa9f27b51d0643ff126de80001dff2a34c8ab21cad3dfa252ef18851e0b611f2deace48675944376d15a0d2704fbe0364baf3e21f2add2a59d60b6dc30196f1127a63b095770467a3a26747179fe6bf8fd32ad090b884b1a634dc8da1ec79e93f55dda78c302e08063a751ef3cc1830ef041d19fd28bfdd6a3629d9fdd9537eb962f77688bf4b9ede54ec77576f707b31d5cb1dcfe120f7c51c6f01fe54518515a81c080f3f147a9bddaa0313bb6875fdc7a701b95edb1200fb3c84c20baa81bebae8d21d5c250b669e95b30dc6962e3a517924d74a18df8b62195773386fd97b5ac4fc33d0333c9341cbe7b189e9d975d4d12007e1fd1e4e972d7822716622514ce6abcc5fd610abc5a397bb17c4b973deda3a6d467b5bd8000e9146849d9ee0d5e8731d9d26523ffd935338964c1e76e6c5ed4a2a063c5a6a630c15f0150f2e51da115849942f9e21b71686a21453cc5ac68e3763c73ef8c11c77dc622c71a57a451da8df1864cf70ed1f9dfbcc965f8d6c5c246a9c3a5032fe164025bbeefe72354c0072ed61acabedfcc23b9ed14dfe3fe189280168a25addc5b6be35d2f920dadedd5c9d608b36d1c72ef98de2324c7d9f60201f43bd0ae603503e4ccd4d2ae4a502590f68c2a7dafa57106ca025cd005354d499ea58e814f5c4e35f3c954df731b2d705ec022270dc1b06585ff2f7158d879cd6bdb80c22667415e4c9743d753f1e0ecf50a341720a8272160636beaab99cc675c0e7e907a7947935e5a6973a9cf939780dddc85ca8cf0854f916c72052a5443c413436b0d8841aa21b41b7685544b4a802be2eb24a01dee95d31625e5785643766b719904411f421140702601ef4d080b4198f84eb8d23fa1bc507d3e00dfd085e1103408f1b5a3c3e17ad9bcddc9f734164d402fd49d42492408826d167909b23e0116c6d471e13fe98fdab8d88943739a383a3dd0dd1b15d1ee06a1e3cb54542c2967087101c9e198bceb1e342a83ff07c4fe415f76edc35574da2ab768a5433567de2c06cdc9b577f917b121f4d659165e6015cee1bdcbdfdd4915b2d5d82ebc70a84ed5df8cb87cabd156dc16b131d2bf428596f83b803563925ed5589447a1db65cbff8eb7bccbee6ddf0716156fa5470d0fe4a3cf0a511453cb88b5befbbd34af1f050da7cc6e6ccd2ca38420d9ae52c91d2bde7e02900ba8e08ff7cd4863cccb80e55dbe0f61522f7b74db8f584e38a8ea8cb49f69ca36f17eac0d7c455817ec8eb3d159c1aeda6085caa473e89e4945ccd477e98cf2cd43fc527c52fc1961ce573c7a7540e0d5ac26c9f6c95d723ececffeb7951bb30d7490d2fa4f3293addba4f3159f018fa169c06a4ed1cbe20f5031481e5da88dd7e150840760779eb30fc1e50d11ff65a5a0ebab630fd8114ddacf2da77dbdad2b48acbd15452a8722eddc52c1fee0c9ac27c89319ead9a3d03d0c5daf9fd0e8e0d1e1c7d85e0676f2d5e5a4d0302973d7c99ba17d20161f0934bd6053e8f50f1471e10128b92952881682272478dddf4cbbb087366a87aa424cf7796744b32bbac89228db5119f0b0eb5e223160291825ab9dfdcc77c662f50d485c429f4f71e9ed472c246b15e5534a253ff61a7ea71bd447e5fbf421b1380db85643d4cef1d7076de2885e2dc9e6cf867009ffb8d51bbeb0730c3b7cc275ca856624e64d197d3a1419c9c729719aeca3e9a0ebf4dcc417cf2e5dbb29339807761d5b621f0834714cfb735cc041a67988dc36433eeacf99899634a6e14681f2f84ebf7c61137f4bcc6cdd6f9dd099c00b3a02c8ab57b3948bc5ed4e73500ac0b8b5e251210f43ff633265b0670814aeacdfe8695fde75775ea0df4cf13713c06cbbb0feebc5c9b9f0a3fd66da650f0855c72de64475a7fd3520027dd6077e33731ff2d5c2e6fd3542290bf2ee4e259bc1b6614e211d5c7c1552ce56924680e12d3673098816ebc68992348677cd45a905f0a12783bbad23ac98f5aa9871acf8d2cd45e9c8449ec4f5fcb270aeb5ee28eec2065fd778e2cce42826f308609eb34258473f61206ae7ea5c7e7aeef3de2e99f635dc7c0febb24dd37b8e80fcf7ccf2a3ac6eb3fc5dc8ec1bd7764fa7750d11fdefc055a958f704bbd8257ef2780d623ce751cc8bd47d27f028afdf08dae6ca2e32ced33ccfd10d07747aefa0413fd6319ef58e28758bd27bcd32198779f48fd0612ffc29addd8850e79bae728e73190ff1651f7052ef4c533dd33098f71fa8f489d0f97b66d29875babdbd2d1564436e8d866790d416b4aaa7d939aaf8b124e7325f913ec0cff60cdef41dc3df2cb7bc0937e4fe6398fa87f8ec5ec17bed90d9ceb733e996758f9ef087e67c9f54ed819ffc333dc83ba7fc691f7882ff785cc7b3e99e61cabf93f18b35b78770ff44dce4a9547ed41441ede39121bfd99e02d1907d8632348976f6c9d536a9ac2b4ebfda59d6eb2f2a52d480b72ecbdd8758a5e74c878e2a1fe03ce2fc0d6e9312bb78bb903fe1da6d5cb681cffe9e85669934c5eb198c6b1a9a3822e1e4aae80a6d72a32f0523d32f760ab0fec04794e7c1c774c3e3df57eee8e48aa0605ee0d5fba84b93c6bcf006c9b6bf644dbb85298e4241a8e57f1229ae8c18784ec309fc9e94ce108bef3555afd4dacb680a75f6bf5fbe3a89b0e32f8046fe8efcb10b619dcc21cbd8d08f8bf309415aaf17e8aaa7818a8572cdc8c4d855a9744e566f2a08e093d68fe3a6c5fd7159155e10c4cd9df51f13e50620db2af39ca7bcac953a63d7cd5fc7fc11f48b4736b429f8969e9e6a324e2092d3c4e4bac38c1d6ee4721455ae4159881fffe49395741ff78c65edeca1d0e80c698c37d95d6c9fa9194946560e7f8d51304386be680a04dc518ad4f86a186e54f3797d561a8ec8e75c3e97a3a3d0a77568b3aa10a03511208ff9f480e69aa21ee33e516ab15006ca13296cc245c95ea94ea89a65b35832e73e9baac586b429ddcab71386a9f250ad158d021ba8224cfe9ac63a518ed6821beee14cd2672591f4c33aab95ac1736d1936a7f5e6d4adfcc2e168785fa5fbf454fe18d15c8bc7602072e640eaf8470a9a7837d2d567e12699ee83e9858c1dc6a44d200d6a1dc7b3af546810d589a45e098d607e2dbfbc5075512e10bd11ce92d621d373f11f0f963ca600e518b3c15d2e107911ca2d6593dd1a73e0e65f8e966119ce9c442cd733ed6cb9ef7a4e1f433cc1d3b38d344c18341df44ca46bc38941deb0d5d42a2136a9538ce5e2de1438e34b077976eca68c954404f76e5d2765ac13562edefb6226c37ed7505206b54be7d7f7f4dbb378881affe771a735bc5154f2bd43400d8e9f487ba2611eb1a4e31683f1014dea227e389304764c879408e65ce67a3004cd12eae06410ef021b86db4ad3c033e93c9eb95201ce55e5153475202a36715c85881cc7e427b7a101719e94631d2ef47f5c05898503fc27887edf1d6c0e05a8fa4e08e5b81851e866f723a425f4267414d6977a1811a4c01bd491b3458c7328c2b9c3bf2e42996ad1951418892eef826d04c0964094e5e55f3b6cb0310380d49b9f911fe7e0291c113970c90587bd764d22ff57249359f363cb6659772d81fd146c4b2f0188d07a6737e7a2e0304e9e4b1a5fed4e4c480f395d20cca1203c79e50c644f40380424cf9bbf3b48e57cea25e7258bd0e42a79a04e618841151feb7ef2cd54929a82d7fc44738ddefa66157d07e570cf1e8e30c78666a08baea2725fada2b5e5721dc1b0e0d6ad8f45b934161bd30029dbf882ab4732e800ca2bf2f8a9469b5125b26608ee371cf4a944e6325b979ea74679195f4eba22c6daeae081075a151ab7129bf2d758a4e436a107d841aa7445e67298245983d19d6da82947d1cf8754851765c2aff167d9648299371fe7cfd5d457d89bb34abce63a4156a29ef0c06ec06ab7dad08ed6380f393d14946fca259c370bda56ade1fdfb425937d594377886c589edf8ac691b76aa5f601f4160ee3735b734f582958e9ea98875794ef890eef7ed1ff6ca8d178dfc3e4fde7b4d37c4f68c5cef11d574e03f1f96204eece4cc295db2359bed5bec49d2f8800f7150f0d0dcabe1655646bed76a0589f5dc1cd215def980912a61855114a07c3b6529516c7caaa0418ced58c3335d1a328168c258531542a244fc79d6d03001b36f42012900f01527c81ee1b69fe665949bceb747d13de22832c3ab4739a9dd60458486bab6d90d37e66f77be4208a597940958a4b56b56330ae69fd69e3a47749a9db66320397d2c68d78e77a5f903dc699b818392d25cab566abb755e3e8e4fe5aeeb76e1de2ad260c3d24371099872cea5dca15c4cdeb0657511abedd57a909064c8052bf23ef8d465830d841530a144f77b29884e8aa423be3d99b0e8bdb66748c4213f901822fabccfd08403dd98bfe3b0740db93b1f84c57eb5f0baa991e8c008e03cc75cde2dda7d591f9c149c5b76a7e27f06d4bc46d3c26d9381599a633c868245152670822c167ca01b381edc286b9660a91f842116f412c4941b30e61f6903b3f79c1b025f751e88d07dd459ad4ca9418c0cc10b7e70839a9862c4e8e396053765883d49ce2fa7958470409e50945534bd6ca2fafe919ba913e68e5acb3c5eb9c2408446f61cc0bc3e02c90a2a588c254d4b240d938ff2f1eb8170c1a31313ba2c44fba5fac29d88d23afc26af34e228f0515d4aa4f4e39830337e37f9cac17f453d364f6972868c442f12d2a0d0ba24b5bd359ab568b816e42b68f216337c2b3f2cd1d483298704b079fd588410a6d82a5dc528d660cbf2fe6ff546284c5f7f8a7adfe542bf78afa20a6106a5dfd3de9e081210e7037baac1d3c8ab641e2428a715ccedac9268296e78e5461ddbdec2ea373a9e243f0af9c777870235750c0d437e88bf0fdf7b6c5aac2682aca3c4532a1247adaff7402da9ae84d7fe639e51eee5a694b7d87c31934ab6b8e53ef4ec53edaff17e3b74a0aeaeb80e47cce8bf9825ac6f5fccb6a5ca5051837f3cfae59ee7389916285bfb371043cdda561721ca0ff3a3b6a89410b86822704ef6b9042dc42d2ec5d281f137de7795f5c1b80596d5a70e34b005c64cffb76c4c9d68c7bff1b57c60f080c780cffd8f8482e8c16f8e15a3fe87a19ba0c8cf21e78a65f4888cc9483bb7fa2399b3985c031338561c2c66f9761c29a7f39b5928f7a96fba7da89ba2dcb4ff28efc49da5ded0c9c6230c89d7e99676c1fbe80fed125054cf6d18926b7a1f33e167433ddf9fb2127f98fce0d8f70e9ff76b386948f38ee2503da19c87217dfdea6afbd0dfc1fae378554d55b425bbccc701f69c91be31c047edee9a37a542dd4d5ba8f77c6073727e7de82d2590f645b994e31b4e475ba13a52336f8b96ea23b55830ae79c751acc3ea0931b6e752e8fd2e6bf1b52a41a8e365f7a8dbfdb47fa047d757f4f4b3a0c2f90128cd7cc49ee8c20e883ffc937b53979ceea530fc57a67b65804838f5cf4ffbffae70d78f6c29e0d5f6dbf987c6cb9523557840964ea9e573e11abd44913135ffd658b6c5862279efb9ee4a0026a23a80b31d61542571e57385439293c62cf3818a8b044f0cefb78657765269e2a03aa20f070683a4dd948cce189bff5a1fee18657e3a11a1d9197006e95c17472b81d0f73625390358228262e71e20764a960c1761251f5f0ad62eb667d31fc796a273ec2c181f7e3b2e75c9268c28199548ff1514d38691e307ee31299795c98182638a8ba38a2f462f51396270c093d77cec18b4ac99edc3dbb6f2fd3b91bc2e47b922e1f3773002cad4e7e200107e365fde93a9b64fcec2a11cbd3a53c1e5c5ec0180c7dc3a88d81469006d5af37439269ad0eca11d54c46d55b7038716f791ec01a8251d00cb65bf73ac09707af1d0088f355fde1aca704d6d29c48a734ea8fc7d7b66c715a182b28d8c8a61f81518ad06c7e1ddf3c702868e92e3749df5c5c63bbe7f62d3889e9ec5bd5a3f21c75f9873deefe0957851d38bfa4452e019cb59f6704212cc3c9d5aac803b98e162f3503a7a19f50f5efc50802c001c0c3c861ede7dc622cdee600d9091b365681b1e0aea0dc3ed685c53d7ff8b7fba02c8de07b95d61ea7cf0270785897de290ab81b5da2f54f05638498a23fd89fcc3f93c8d7fb7e2efe561d2c128e119bd4c9b78e6462a66dc8cfbbaa98b406f59602070fc6351cea29efad12913429d1af1e9b47dfd9c39a0a1835d578d9ce2c66d236ed03122955e1687ed3772079e7fc14ff72e1791a89d8f4dc1b4ed1583412c9afdf69642af255d0a3d5b1184193c3d9d1c7f3d1b8f408d1a24458920baa4221300a8da6e98fb486992013ce0080be5f2f366066aa1428100b1f47f3d299d33f3a146b11f88a54d5c582003a8acafda7e2249b06fea31078791dc6c89c6073cbd17fee0a0178691f3a8bf6fc7072142cfe1097ed8f7b8a11cc7ad1eac2a3f0bdbc32b30b9b223dc6d2873b4e7bdd7ab11372651f6c7a77eff0f797b42fadd48e0cd6ba28e6779a5c50a516a75426da820fa9dda08788b4b3639ce7c03b21d644d8906970eaa1444d638bb10be3cf01b7e48054e04f7f03994305bdbc0e2f85b4e8dfa0a320e288e64fc3635acec94c1966d2aa3e258bf1e3ba7267a1dbad3fd672f28326ecc7994f99bfc33c3dffcbbbddb194e8049a0ab45f977eeb2854764e668f019a2cd055d24e837c261bc30ae2dbe71272e44647681857f82074e0258f411230e79eb3df49290e47a587341633919aac847b193cb9a3aa5b03a911b2318ad8d21730cf5457f8844f53fe887846611f35c30aef86f77e1c3dc5641a0f38d99c736b0ebb1bd0efd8842c6ea3e575d0fc83f59970a6a3b0b82d685c859ae7592e74db3db78b13906df5db8dbf5072cc46d9b73ac4857438f72275a754bc9542564cfdd1bbad45f23c03f6929a90686282d3ff2b22c1630de14c5c4140b63281ba06779b80aacc7837ccaeab72f038663c1365ad85e515c5951cc324c0df5fb94cf8efa816b6a8f50ff6b55821ed2e5dcc355b3b0ca8c6f206d5a33f30e6d51c49a6f48ea067f8d755433d660580fcc7cf69afa8b81afcea8ce56fa1358a0e9a0826ffed89ac0ab01c32e12fbf2f8938e7ed6b7206c8cd7f284faf7bdb224252601cebaf4708cf0caf79d6911e7b7f0699ad0403f629185424d03e37de80a54278810d4859854592c80a8d868c4261e85ee2b332ebb01ce4fe9979d31e41384da129c48a87b664081b759e8b2aac6474ee7840ae04b5a336ce3777720faddc03371a4c7ddc3112c4fee924d8b96002c2f3c51033ae59edd636e28e2eae168d5fe21a19c70d9d755481a21cfa2b45f7a1a2c5b707c676212027a2a70d1414d222b61df192284584f8bd3221f640bf27ce24a48a1996e52153ff1d71eb5a5848dd2fdaa5e811bec2db09dc45c09009d2cba298c768af14194aa1ce6ad22bf07d264055123ecea8f8552e20c207521340c7900f48ba849114b5e9b49bad485df18390c2b4b112f1be2080bc001404a25a50eab7f003773acb60199bda8cbfc1c19f14adf8de57c5d442299a4de5553d4b2a49caf6fc4b386943b12f10bf2654221abc7227a9393a45b72e30f18b9ad29ea68e8475cc3a4e7ae65107266fecd565fb7c62571f86bfd144a8107599130994473c05f718762069a7de8332be43a4bd21a1b7c2d0da562612a198ef7d23deedc69c10f29ebd3e5cc9bd1142f29799ff92e58254f76ceac7d93b1858fc44be0550ab70efeaca05d911b3c8730edce6f5dea8739daadd86d8c7f229405808434e63f92bd7a5e9bd013731ea63a5f5f96257da410c7c9e2f0b5eb4435346b2a5b278020e991cbf074452e048bbcccd6cd37fd20bff9c59d8b37f87028acbf7833675437e6a8f822bdbdd6d55ce78ffab18cddd25a0b6c6bbbda4a565983441eb0226ab1a0436746760b0a39de82a8d945f9cb2d2aa3f9498d859daa439c1e553f269ea7d54eff10971fdff77ddf9034e196214bf15a475db8c318c88bfc4178542cfab259842141242bc5457d3ea06c2f135f66eee45280cccf260ee3a3d942a79d0ed370bf7cf5feb147c69c59e59942e44c21d6decd8a65a120a7e0403d93776f7f141789e104a8a5ddb92052b13aacc4e638b273b7a46a66330c3607279fa9e18ef448f6dce913b9d180432126850362921ecd5ecee1d008591d439e0b327122a9d0446d8f38998da0936a6d5ba442074cf0d2fb551b806ceac5553a94b0db55312a847ca3c35a85192d685faef3f9ee305000b5707c67ccf7bf5316efda9c4338222198dd85beebb13c59f0234b3ca94d73c84bc0eb8aeab5b2ea129d6f05c52c7039489ec75367fb10662490f82e1e0c6af070361312e9cf79e32c91ffe7cf19e686317fd371faaf1e810801bfce726da49f90905feb71d63cc9a4205623e0bc3cd59754c6306ff8eda75032bd69237cbd01287cb9d8530405f0ab68877b9bd9e0aa8ee432267d7af5b9ecc15d9525672f12038425c5d7abde9ce0403518b70ffee4a49df2f5045898012ecf026cb6c0dd9cbd2870becb97820f6e3c1ccef5dee9c841386ece9846ed887a74268866588c22d753822d625e5236eebd23bbbff3ee01a92f1bba22b8a1c70fd17baf1cd4d820ee3c6ba0a52afe0a86e3fef037c42da5e24f3e6f340a24d07276fcfaaf8ea0102dc33b05e8ff21d466054ff7c8430ba7711608fec67517b5eb4ff2165df2bcc2ecece05d17e5969353270a53aed14332d7c4d912a99727276303fb9c3a8baea3dc392cf92b20dd4b97f317a248decc7ae80638e1be9c75296fc8cffc998fa153afcaff3a1307edb209ba18d6c917b25a40b85ef1300ed01c389bbb5b6ec3600e63c78ae3c1eb2b05d24158aa0a56510719fae621adc8f5bfc2e1fd26acff09f46fbc6846bca42509e59045e535d9ac209d9ddbf7daa963035f762c53e5ca5513057d2e6ae2a151c673429d73cb45ce9d58fe5c8eac2c1e48c73180d310fcc9990b5db47b2940c1542099e497b8f6ff87037824abecef984a3df9774b9e4df45b05b5afe47d66c685dbb9ba84224d82f5707b5bf4d6c23007e01588ac3f89cfb65c19ffc5187083b9e08b7b77c060f485cf8c63c3fb892fe93a2a77a67ccbf97fc4cba0fe84b6279784ee999850cb07508bcb31e711da409e61b778c9d0ae2b52cac618e3f5c205264a0cd586507713b56246b756297185dd868fdcd35ece7f769e70096d2ed1e31f9ef3b465df0a4e125d43c2bbfaf0c1779c0870b2f2ab65a0fe95aa742a371f34c4bda98b4359110a739fc9fee704a44f7d6268e01040a07ffbc3059d3fdf8ec39ba96e81fef35dffb7624125d68d14e015561d9699c0a403ff1d10fd500491cb252c2abd15f5c214bf11966b4942c4b5234073f3f7055bdb357df38cddd24eb18cf7969016f9ac489f40c365a8eddda1a6ca3afba9791f411c213ed178ff0dfb83945ed1288aeebd382d064097c61db6c5bb11795cdb7acb8e845bcd8610d7629488a8b4bf062807f8860dd36e9a2271d62b3ed052a31653764a0b4a561d22bd266878f32a56f95908163512fa75b4ffcd8a3b3586b029f2084938e5ff26dbfd27e35d79de0318204a22404d19185ea7ecf6a799127ab5cb5bf8f9c15b459309d1f9e925f40a30b5934947feaffcecff16fc33fc9fd5c8dfe5dfa1fb99f63bfaefc47fc6b99f79fc59f433decfbffddaaf768233507f66fe2ce177f5affdecebe77eb9f3fb4b24015410027e2d45c00c3080b442e5f030c30c33cc30c30c33cc5a4b2585984d994b45ddd62969a7faa4a44c929bb47f9292724bb9a5bcb37fef4b310d7f0c830c6883e52c052f2ebe7010b41aec97b4217ce935b892063bac3f6c0c32833dc7bf2138fcc24a065bdace9d0821e3431983256fe87e8a7ae34f00186c9f918b26cee4fdfc158b173f79fd43e7bf5db15ae51b73d405e10bd28a6de2ea9f898a76c1acd8c3b91e8308aaabae6271d0738fcbc18b82aad822478e2c7ddc0d612a96ba345d79f2622e0a2a76ca8c7299947a61e4143b97175cdc85606b9a622dafff2fcab8a01917a5d83148a49acbd0d322c53e8e6a572a6ef3e346b1895788d417a6a92d8a1da408f2a8e2e7e442b11735fe5ee9e213fbc240b1797a811773813e7c413eb1834df895b8ce943db18998a84aac7c56756287d45d58e5290e8e0b4eeca0299e8b8baabc2864137bc388875ace53a5269648625efbf83fc9c4f2e3c520ead9e53630b18a84d5f5788cb1a94bec11a526ffe3ef828a2576e666580f1f95d8211739be8d12ab9d634a25611994935826f57f911724efcb49628b7a1a97b98b6f9c1189659d72793dd4b21d126b6ecd5c86663f9347ecfc2036274c8889c8116b4ff408392f57ac1bb1797e7198cc45050923b6f5b4ad2ec905b62d62a9ce7e0ca6d352a588f552ceeb82e8dc906606908875af27848c1c95563211b1ae4eca8f29d2c5c55ccc21b692bc4cb9b8be92b921d6b5f988eac50529c4b68fd41e4391e7cb1142ecdf602ae30ade20f694474bab0ce63f7d412cdba844cc513c103b4a6692947f1925b300b1175d55e385179896fc87c5e2f9398e4809b5f8616d946ce6c931a8cadf87f5f24846de17be22271fd6c80fcbf156e5ee2ff6b087881705f9e2fedefa420f4b724c5e90e9f8c595e73c2c1ba2e618945aa4947858b6baa62fada249c3efb0c494f0eace67e0b0db612dd1bbc887f9a315acc3e6d8e0ff24432ecb0d1d166f94921a85840bdfe7b0c57c609efa8c1cb68cba8254feedf5e2280e7b35d4f4df2fec4876c36151bf8712a763baa6f1862d7add3eb058eda23dddb07833d85e90d0d023d486254de40bbb3472a67c362c3ef9c58c2e2c9e49c61ad67df8e18d0bf641eda786e556c531acc8855ed8751ad6460e96ea19549c09a3618b0b61e476baf9ae3bc35e0c2b7c3755b2069a9b61a7641e19a84733985c199670a152f4118ff0359361fd024997dbffc5e53019c3fee0bbc88ba1535f7e8618d66f90ccab7752cfc161d86e4f2a49797675a1050c4b6c7f91ed6d838afe17d6e98226c7851a0db242bcb0173ec686dcb491192e5dd8fa72857990e7c2f6a80bf477d4ab8b8b315b581acaa52f9e5ec745266b610bfee963c1318e956416166f38123ab77271cd8e851d3ac317aa84f5142fe60a7bfe7753548815f63107b152b053c9456b1596e8b0d3730e34a7472aacf538696bb91557196618c01496f853798fa1b7d1cd4818801416cb69ab9137d67746617998d8aa7c71d56383c2a2f1a0d224470da12b3e18c01396fdb3c9f4c53c51224e58bc60b51e1ea4b9f21a973080266c0e961bbf2849ec7c914cd881d95ec6188fa9834bd81e598a1ff6bd12564ba1f4316572f15830097b9117c4798183a59360226107167fdb0d73f3d51f619fe642f5a20c62e432232c16bd2cc74fa660292ac2ce1d8dacc632052d2f88b07a71e99e85f9e28bab0d61f57aec6c2835e34c0b61cbb3c6f45f54191284fde23c1c66751a3c03c29a5f5f14661b584891f2832596d6443959dd6dce07ebc373262f14e7b1abf4608b5d5c703a71fb1a55435cdb69b81d41dec1d62717274b2b6358193a58fa81e3ac982ff8623207cb1779a1845e4bbda6100eb6c745cf4076e2cf46bac1964243f2e2fe0cfd306db09887a5e8c59f5ed5b001d460874ce73e87b8670e1a000d96caf8a781830c2bad170398c13ac10b65e6baa8b71e320019ac5ea4e233bef7c8bce001c460bd78f31bfe8fb9a80b1b000c7646121f12673fe2f3572c9bb75f5c78299d86e35cb1e9e5c2cf2fb8882feabe15ab75e47e74488cf84856ac8e967285e40ffd1ab58a1dbf3066227a4154b143edccf96628531a49c55e4ccd209f1fff3292a0623dd5abafda49e3c5df29f6dec818bd5ce943ba30c5f6382f635c8c5d5cb18f521ccd5cf81cf720c5eab9eb5cfcf01ead3da3d851ec82cb1de1d138a88862d98c183f378d112617a158d782498559799ee400c5ce94bea851379e4859f9c40e9cbff0f2652e99ca3db1855c5cb06afd99eae075622f08d18bba2067772dc29cd82e4f74b4de475fbcd32616871352542f7c1e17179a58cb312e66a8abaf46662676d8051d79caa1369a11134b45d549f514b441865c62fd82d49fba9a961bc4123b173fe302dbf45d0da7123bead45d486b9332fe94d833a40b6abee021d62993d8e2ef5786ce10f5b04b62ffbe493fa1c2e9fc1e89c51aa567c56d4e9c1d12ebc454def4227fe0188fd86942b29e5c5c9be79023b68c34f5822aaf115b060daa5e5e297c51c3882dcdf36a2ea647a369115b9471cac593fa9e4a55c44e29f94e46a19be2c389d8a146955544a724b97044acf1851d8ef6fb436cb90bd5f4a46b432c8e0b7c279a776b532bc4d2c87131c811246e454e88e571a1634c0407fdd718c45edcfce8f29dcff3658258f2e983c6d493d44f09c46a96616699ff173c8d80d8ccbe687d82447d48973fac96a21bbbc8baaa8b563f6cc11e84fb8a72f85ffbb0d8c58306a1d60c3de1c39e528ee1e4973d2c3f114bb6aba40b75d3c3faf3053df3a0ae2995872d3454bee8db89fb0c1e364b29831a3309178fdf61f34effb094b9f0d6473bec79d1a9e13cbe3145ebb07a048bf9e9ccbe2e900efb6f17e3c26e0ef5c77f0e3becc529b12e6cbca3c9612fb114e743eeb4bb12877dbbb860f2d417eca389c061fbd1d25013c9f90dbe61bf2ef2d16cfcfbcb1437ac166cfbf9bef68bba6ac3d64556bf4fe6b1619baaf891d5285a2e88ad615f070e4e5245189fa41af6c2c615cf4feaf428230d6bd9faf77f51367ac4d0b0aa599e83cc20e93dfa0c7b79312ec8d7203ece39cdb0cf68483f92ca2e78bc0cfbde78319e7cccc8c149864d72918aa73e6a8c3a1fc37291feea4f22e4d5258625be48a57ca5a1719f61d81b39ca8314b6cb260486652ff6f5fa448edef6851d832fd38693341ec45ed82bc71b7d312ece49d77561092f08fda8c7336b2c5cd871a9e5edcee8af49cb80c51656f59bd23b0bb3ada711586861fd42c7781cd2171744860b8b2c2c91f6a2c157bce846222d021658d832d623d8d35ddd973a042caeb093dede452f9eb87c5f5861938ce22087c33c875514b0a8c2a2b3d3459615378229a803165458b4d6714efa6a8a2e060448030f584c61892e9cff294779c80317a482159c40052bb8c0165ba08004154001094880675ae8010b296c4dbde314aa32a9588a03213841035c50fe1d801739c0220aeb7df64ff44b1965170a02a41999c0020a6bff34dda4bbac9f140448ba000d448038900215941298168dc0e2094b55491785b05d346212fd010b27ac5e0cee6117983a2ebc10042960099c0d096cb1450a16f080079402ee804513b6f0e27ee0e82b56d22e1681051396906ff4428a57ce05211020d5e040084eb005e1b6b1062c96b0854d87728c0fbb982e1020d1165b9c200422c8c0165b7cbb40052150c1165b6cb1450a1ef0800a6c608b2d1eb0805112d8628b2db6e8101c0750f023e8770f6c715159d8010b25ecf0c5209c6869173dc5408084495852aa2f7caa8b0e2d6420407a149c60d00234108105bc000b24ec941b98a5935cace34080b4821378a0c641608b2d8e80c511f6eb825c58c9f4a24f835b6c91021198c0042030c21e8d1e55729a99f06111361d5f2f3c67f8dcbb614184edee4153fe7631841dd68b812547c962c7888510988d905d4c9936231020a120041e20c20e6011842de5d47b24fbd1dd0c0f78608c126c608b2d9c800510b62af3c28f5809cbbe418069810e78a00558fc60fd4e67b4270e233a0502a48fc0f8607fc6b16929c6c53c9082104c998008fa41f0002c7ab0e41b7ff0402272d13f1e50c17f0049051f81ca01163c58ab23bab252244e93b583bd31c87839177d917ad143073bcd85c385e00cd9d3b040073c100021609183bdd1f76737f3d2c48f2881050ea6495692634f1ff2cb031637e8ecc2579983918480850d567d985ca9ca05b9956c01638086053ae0010088028b1aac5b958ec13967a2e44bf08110a4e06680050d96beedeffc228bf5008b19d09043c3d6bfa13997011d29bdc6d471a48ec12893e40851a41c1ec8f1062c60b017af8374714cffd6f7572c5fd67026b9c9ab92aed8ca2ffd63e8f478bb4010200d290e04d08a1d7e41ec5d79d4d32edc060504c08af51f5ee53da72f2eb27b011a88c0029a51b082ee06a0e05560020ea8a0044f02c2820b0258c51af5552629df9978a18a1d671768989da35095610201a4623b33eba24a3e79c2178c8aa5721788a4a49f10a2758a2d7f51f8ae70eb317d5e100304608a4dbd20725a06292347469562af20fafb0527c161c3a4d8672b4ffea2937cdef851ece074de14721623a442908210b04017a08108a82004290801073ce0812db6f02db678087880100210c59e17eb3f24af20407a0a6c118ab50bbacb67f5bf51761020b5805130e3020200c56a35a98b5208b2155a810029891c20804fac5dbc9a0da236acb25406c69080003cb1a5958db3957e0702e8c43651b1514aead8e9c5451104c0892d65f062385f10e6a00b0ce658177c58fe2ce4a43cfe94af3decd7a85197cc1bedd2c336f2a7937a1397ab3cac1be7406fc7a3fc81872dc3cbdc2f4c8b8b8c3becb87b5eccd1b0c3663efa636b27961975582b4abf792333a4890efb3d58a4f2f5c645d3c51c965c908eacc4e9b9a30b39ece30529a99c3e358c2ee2b038ea828f7412da0fba80c33ae3685d7e710fcfc51b9610fcaa391b1a8673e1864dc2b38bd18b442c632edab05a2e0eed95e6820d6b175e66a420c9cf52d6b023c9055e9061c5492b6ad8919a4e4c75777117250dcb1764101ec7d6e455d0b07a7181431cc79bfa9433acabb1395e1c5d3bbd1976cac511950b3efd992fc3dea0fefe4127c38ee1ae31d584b0e118b690a13bbb30924c4c0cfbac6ca58df59a5c84617310d4b1c1d8d7d560d82464c8cc0afa51f517163ba7f38dee08a1f6c2cee9688274d685e5416ca835f17a245cd862278a3ea7e406d9c2328da37f3bba98632dac158f1f533959d80b8295748eaf6c47b0b06f44fca38c5c614bbddcd554eadf05b1c256c1e1ca64cd7717a40aeb7ee96765948a3d15d62f6a1ce19ca59af21476a4d9db9b4961fd229b1016ff723e1c857d7c22ea7f7158faa1b0daa3f353fe8425c33137d4ea84c542fe08996e42c1bf49fe74a24c584c2aaf4cf0f21475095bfa9f8cbe702c75315409cb17c7351c95a8be2461b3eae2ae348f815490b05f888d61329ecdff087b316e45e538eae2dc083bfcc90d2699852eb8085be77c8e1704d34626115627f18be3bbcd610e61e74287f8a02b646aa41036cb05bab2b6935224087b61f7c817e487095120ac631f16b33288ebfd60a9745f28e51b5ee805fa60c97b3c95cee146853d582c3d6a98e4053212f260cd2eec86a32ab9c8b2836df4bf1c4f84435c079bfa4fe4c6e497f21c6c519df145f17e2f8d83f56672173ffc459e6fb0996d3c8dcf4a486db09617fac503d11bb1066be42e861247527f7834d8c17ec1dc9c56cacfcd60cb789c5f5c600f42730690c18e6ab91b5ed4c5a834400c96a7d08f5176e144680680c1ba22711de5f54dcc5eb1ed34c3925cd445dd85b96289795dd43df9562cf705b7cff5c55cf05db0622f8c088b679579ba8b55ec4536fbfbd8852a36399d47c1cb71e3e222153b6e4ee58f861bd3052a9648d1df7cbe87cfc52916f9a22e7e7e9ac64529532c21b3b6c1fbca51aa14cb17851d47490b9b1729d6c72058a7669fe6358ac5b3617f777c43bb44b11765c3034fed2f86542816c7b8316c17058a352bacf1b3ac741f9fd82c8417173f9ad4e01e9ed8f24e2ebcfdc290894727760c26b9c031a3b36e7062bd09714d93f3cfc5d8c41271299a04f1427b0c4d2c325f5c27eb3c17a64cec5d8c8be70b272389326162b51cc997a39b23d325164d2771da98502b5962f199eda22fe8754652556279864b672a9a235251622f8a2bc9496bf00faa496c8f0bd5223f48ea864a127beca77731fa42b17e2a127b832f2e8af8a220159f82c40e61792f8789e437f5884dbef6ea8b56f2ba9872c4d62836de06a6b58da9462cc98b1fbbe3c288f52478ac1747a6189745eca8219848b84c911645ace760c6529e5eca4549c416c5d19e51b86b5c14446c51170e12b93852ff432ca9ffebb38bc21e7f436cd29712511d3306bf10cb5ce38ae9c21bb39e104b65e862eae807b1448894f9932964e805b14d7a10c7f4221ced81d8bb18c4f8c2887a0e71406c5197bb52708c22f91f76c6696bf9c2cd45ee87ed415e065e3c99c2a5fbb043fb505fcbcba79b0f7b819e6f45bc4ce5e83d2cfa999751a4d0a5133dec93ebe9624cf2b0c3af54c3ebafc7e361c955a972419434e47758f2a45cbd8f3aaada611dcb17254aaec3e28f64b67fcd67643a2ccd13e6c7e339ec60ab82a663fc1162392c59e705292f533ec471d892438613d3bcc153382c32b9a3d249b4fb37ace75dbc1f755749926ed8bc1817e617c6d98635b3a27cd2a30cd364c3965233652e9b942dd7b09dced9fde95e84520dcb04897afae242ab4ca6619547d1a8cd2e2ef2110dcba4d82faa1bcfb0a335e9fe88265fa319564d87106bd40d1f9661fbe29d58ce38a6ec23c35222918bb9482a7fc4c6b037dcca2e5b2f52d9c4b036e66260b9931a432d0c3b467c4f03a9f4a481610b17718eb20fbd18f6851de6d40bea51aa19e6852576c1d4e58889e55817965c142ca475a558ff0517b6eda27c0d65b94822175bd81b494ad5edeea2e48516b6c84dbfe92ec85fd84516965fed10fbb17d5c5c6061fbf00736f7c50596d61596d11aafd2ca7d66596153cf932e8ecb38b6aac25215b1c67fb491174585d58be24878d137372e6a0aab5fdad0f4c2497b9414f6ce9af0652219fe118555a70b5792e5922e7e4061c994e1dc642841d2e3096bff4dbab49420f370c2fa1522b52fe3a21c8f26ecb8e8a36922855d720c26ecc515191717838c8b611c6309ab897ecf9e77317c8ca184e58b2e552e4c93b04aeaa25e9f7534261296994dbf46b1cb23acab2112b374a43f23ecc5a02c3c99f3548ab03cd45eae53a67a414458bb22352e0cbbb279084b7cfc450e72d5e52285b0237b8ce651175f7e3382b04c2e2e1c9f08dfe403612f8a1276af71f1ccfd837d52ca8f8fe362ea83b51c6a32c43dd86189da455a78b043f54c700c698e2c3bd853b6be98411c92570aa083551f75d103afd4f8a21420075b34c31bff825cd14529000e76e8e26250952117aa540a70833df772338c8a8da614c0067b3f99ef78a1a5a67c016ab09e63f8bcca48f9ff02d060e98c5e8f4792667f0166b0c54a5d0cfbafaea15f00196c92a99b62927dc3be0031d8bfe87366be0bfaa32f000cb6d8d0b914d6a13fff8abdb83a72c52e9c9bde5db13a4e8f8be705f9b0b762af89e65b954d937356ec5b3f192b1e4de47c153bbaf14621f145c973552c12767e463245fbc253b14fa420a19afb9b0b47c5922145efca7c2ebcfc14db36452f869592cee1a6d8bcc02c4555a97ebc4bb1c5b95427eb9342dda4d81a8ae46210f7e75d8f62dbac2fb4919bb017228a2d4efdd39e17e5e2a290506cb75eb4162b17a30713502c26f12aa2483eb19405cb076179bc20e2894d57fdd252468dff4e2ce95fe8409cb21cce89ed9c419457ee2ec636b184ab340e91ba19d3c48e8fabe131218dc499d82bcf3dda2f92bd8831b1765ceaf1868d51b9c45e5c34b79522679d5a62c7bf8e233f4c17c42ab1daa86410bc504aec238ecf8b7f328e4327b147a58b48bf24762839e36019617e24f646218394143dbd87c4aa72195c849fd8fb23564d3d2faab423f6e82a078ee139bc68c432ab998d95c11755c98875ca8bea6cf7a39c5cc4f6188f5a38a9882d3d08b9d09bb7cb4fc47a124f322435478f882553c73cca0fb19a9d48906f06b930432c99f514bc53b31e85d80b2f7e8439ac141b24c4e2b95e78e1c50d6269a6d9c74f105bec4afec7b810d10bc4f2450eae52b0758c3b40ec859691d105233ab9b83facf27b978275355ae787f5b471f7e402fb7a5c1ff69595faa2c697533a3e2c19e50f2be57db2d81eb6a998c8c81a9ed8a68755b6cb6953c284a8e561bb5cbc37f90bce3e353c6c127b97c1a40bf3b43becc0bfc22369873d257a3166aa7c0cd661c790a3ac52081e191dd67a1e1bf3f1cac5d81c36c7455db5f9c585cdcb610bf1ba502a9b2ad871d861f6348973979d705872eae136e5e9e2e22edeb0ec89f817e322f3e2dc0deb7f31c685151a3c536dd8be68af31dd552e6a8a0dabfef445ee54ad94352cdecfc520c58d9c1135ac531eff78ce67b634ac7fde90e262894c030d7bda63e450bc7eff336c299ae441c736ee66d842468c24e10c825a863de6d3228744645892a5b01dd218966bea22877c0f9d17c35a3b21c3cf31be6818b6e78911e379219560d8d3ef2a3208e2cdc517b6e9b9491bd7459531e485a5caaba3aba19d33d485fd77b5524946d5457361cbfd613af58d41b285352e989e7a917717440b7b31a68f8b9fe6f14a1656a7702bd54cf9ac8285a551a35c54f65f610b7932194e8d0bd2b7c2f2c8b361785f851d452bd4197d41d49e0a7bf1337a7f71dc86e3a7b02589530e2a8ed67829ec5da69bf3f9e8178fc28e31ae5aba9873b04361e9cef99ac62e304b3f6149fe272a999946d24e582467a5df5907237713b6cbfc90fbb2528e9b09cb558a5d84f0456a214b5827549a901a2f468528616f5cd7bfcd05b13e49c22213d65ba9fc8b7b82842546caf033d25a869323ec2035ace7746184a52a786168faf317468ab0e4da64b8944af34188b054aa78731aba7219c2963e53b1fd28bd2842d82617dcc37d545c9383b0d59e17ca8388d9053210b64a7517215f10f5f807ab39da64384f9671ec831d6de6eb1ca5a3dd834dbd203546f35fa812e5c1d6b35e24217e31235177b0c44e443e2ec6dc40d5c1a6d1204509166b3234073b088f2746fe2b6d1c2cd120a68f575a9f6fb03586d818ecbfb8e82684cdf6b457bdb72e7a1184d5e7bbb80be6d38ba11740d88beb33f4622f23ede207cbed885afc7d34791f2c13b940a5fff16bac1eec8dc90b672d35c9583cd8d3d2452edce78b5bed60cf4d4db310a2d8a374b0d5f74eea62f0fd98cac116ccbb40471e6b263858a546aa8b6bcc627283cdcb36b6928514641b2c29f95452cb2f2a71d46011331bbd14bcd0c391050d16754629e6e4ec42238b19ec50b7823d1717c47e461632d8276cf47e39c885cfc822064ba4eea2bc73a7716701837552ea6248197931d5f48abdfeb22a23e48acdb14ee5d671e342a9154bf94a2ed0bcad5c112b965bb189d89fce0fe52a96ca7067bf12d3f293aad88be269b31c93a9d8312e486fda6a0a7912157bf5e4085f8c5184d8e429969e7819a53cabf5c5a42976dc2f922e9208ea6b29053dddf7b05d1452ac71dd202f3d8a2de5063d1e8d3131516cb9e217e759379df6a1d8e75234e74d54e6e241b17da32f2e90a673e8fc27f6c7208fbac841cacd7b6253cd95ae99af74e9c41eb9e871e117dfa7178513ab64d450958b60f94d2c1975e17f93d6faaf893d521739689e89e5e1425a3da7c605c1c4f2575fdc393fe5eb25963452e245e1617a6789d572e5a5f4c22bb18d2493f494d9bf9c127b7d5185644c65a47c127b43bd2e8a674b628bc619e11b8a6fd791d88b1f2faf36ba68584362d12c89fa66eeaafa117b37c6e363be919b38625bb3a015d3bcfd9146ec9451c5f5c24a5ee40561c4f20597fac6ef523a64116b4e9c8c2edcfde29215b1694ee3860fca21c889d8513f178f365a129111b1d6470ade97e231e4436c294853643418eb820db163080fc149bd301e5c88edb92232bec0f74725c43219a771323f5da883581bbd287cd1c959c8850a622fbc708cb6719a930662f16894418e14105b48874687587923fdc392a3cd201ebe201af5c3feb85e0c25bebb48927dd82383e31ae7a25c5c5cf2619194e634d6d4055ee41ed6dbc694af61177431a98725ee2a4985f3b043b30c998bb14967c4c3b6bf95c6f18bf966bcc396377fccf277e414edb07df1538809621df68e0c73c20b42bc07d2618fd9e72e09fa450dce611579102725b129f1e4b0347cc32ec605d1c5d0c561b59f8cc6e371eb1b1ca8b8387ae5db1b96c8f9f0cf2bde9de6861d1c0507bb204e396bc372e6055f9dd34d9fb161c9307f3562395717b6861da3320bfe118d95a961eb22eb48df05928bd18b342c8eee7ff78153662ed0b0e5e6af4669d0f3459d61b390c7b2e932c3feb09b317e72265565d82a3588b29120da0f322cc9f134682ece88eb18c392a2c5fee78246298718d6b18e8ccb8b43541c61582c1e84cfc1b03cd2959ddcc705e11796cf075d549971f18517f6829110bb384e1a3ca30b8b4fb28b4cef473d17369f3c2ff42e546d7a0b7b431baf86a3e1102dec5c3492d3fc5342cec22231e7b9ac99ee222c2c21835017b151e6afb0e675c446aafbe6adb01754ee483e9146e12aecf1dc0541367da3a3c2a25f909e6bcfab4d614baffd28098e5f486159cb9b8b4ea132a2b086648ce6d8201476e6e2bdb22f069fb0a410662be4641a17834ed8319635652ea8d028a509eb54f0ad2f88f8290b1376a07191d40b4f9a2a4b58ad4257ce473d4645099b67d65a9cbf46964fc26af98bb46133bffb47c2be5fd4a1169b2e247f84254fc898dbe0bf607d236c67f1b3b5635fa47d11f6713a9591d8940b7b22ecdb301d8f66e4a28b0f619d55077a92226fef42d84aaac2191d84655246cd0529f73475202ce228c5e3e3d4d1fc074b2ef82e0b5d5c90f7b80ff6c295bc865cf45cb0750f164b5d5c50c92cff71d13cd839b51e9ca6ce8b263bd80b52ca5d94a30e16af0ce79aa01a19c9c192e4d145788c243f0eb64c3a97a6df60ddee8bcc881160834523bbcb8bf1c18b6104d460592f2e48f277e6dd5004d060897627b3935e347a2260067b913fb29ceaa2a079224006db53374e985edc241110832db4247bbf303f268900182c2ae98d15756572be62edc978277caed81e4e867e769ead58beb8a8e2aedce5da58b1ea55776723157b154bd58833598c6c17a98aa57241fc825cdce97f49c5aa1321997abd988b43c5fe156cc3b2e3f353ecc51dd10bd20b1c5d85a6d8bbb850c4bb2fbfc02fc5d6f0c5c5b82817374f4e8a3d52ca4521fd2474318ab529cacce38c9e5a148b547e849a5c5c14d250ac31fff15fdcdd0140b1f9fd4df63ab078ee0ef0891d983f55d28a6b12bb037882bbcac65ddc7562e9bd88a2a5fd78334eecb89be471514af128dbc45ea09f16a33b6c1fa6892d38705c1869fe5d8c6562398f09f569e605154c2ca316b3c1a49fe69758ce2ecb9f1e25634b6cb9a2c41a7851892d4b561ac2d31e171794d8baf0e2e274e4d7ba98c4664126334ab50b8e0b496c521dfecd57249610baf192889dc50b124b1724ad8cf81d7ed72376188e4f2af43143cb11fb9d9564beb0625e5423567990517cc1a39aca60c40e1c524a7627f10b1e8bd8e7e966e2a188b58283584e4f32de48c492c2449f2e0a9ed20d446c9792f352184bb9c621964793496b2f171736e30cb15688e7b98f724e9eae107b783196fe34ac98d3116247e1d20beb192f6f748358e2c2e9c2cade6d7482d81aa3b8e485bb8d5fd005622f7cde2fcab50eb741078825452b86ac7fac64ee0f5b4e8ca61c12e3e89c1f960a91561123429f737dd8a477a6bf20f67235c7871d4c481ef685a39231b7872d5f3fc3c97e1c8f393d2cd2fd30ce79939fb93cec75969265bce061f3bd70753b65c152eeb0a58a36952bbac62e76d8263688678e312a49a9c3e2b0bf284e88e52faed0612f1a890d2c539d73650eeb5c5fb8a9dcc89497c3d2d12929df715862c8c57fc549cc70581eca8b0b1a9d7faf6fd8babc463ba72a76ef861dd3d6410c099beadbb0a8ddd417a5ca5f0c61c3da58a1cc6c3c42780d3b6c53f22e500d4bd843869291cf6d69d861ca417441cc0e8086a52af433fd7167df7680336ccd10277c418585d6760033380ea1a30fea326c910b2a6a6e438d0b21c372f9e05333a9422763d82cb7329c0cc2324ac4b0fa494488ecc7639230acebc5948fc6ff72c560587291a3c855f2470ffec2fe253e5d217f395cbdb0452f94f9e29eb290d42eec38db455df1c1e322950b3b38589a8478675ee81656ff6a5ce0205c984a6a61fbc26908e11c3f43330b7bc145569c34b1b076e13df8228b0fcee515b654933311252587a515d6aa68c129ce42335985edaf1aba988b412ec6910afb8fd8587afc34294e619df0b848d26ccf8d288525764dd446fb42cb6114362f48cbdb17eb8d0b84c2fe5319e8767ecd7e4fd8cb19a64ffa9cb066a54cbd1165c78b6bc2a2a297c30b92cea430615fdf2fdec899ff4559c22219175da94c2e48bf12b6abe8301fff0ce624ec2859c613a47e7a45c2e2a791f78117e77d47d82a4fe4e282098d42cc8cb05cd7e5cc7b26adac085b69a3f0a994715646846d627fa77d51f2902f86b0c7177fe13554a44d17425824bdc81e74713fac2b086b33b414fe2c202cc99ba7faf41f437eb04803df2f6c2e8c527db0e676e1348aa3073b682599f262f06031498996d70bb342dac19652485157299c7e413a58a3baa00bf21705b53f076b844891488ee160cb089d8db137a58bb11bac9df5d5a0b1c136b531497332b4d4608b27eb952725bf69b07ca13f33e9234bf20c7660abfe28471e2a83ed46825590993335069b17599fc5b01c00066ba394c53d7e4a2fca2bb6711cb1bac8b9f0328a2b16912f46b1648ef2c55bb168aa171777f1e345edacd8f2bbc0474b5fc59ecf545e4cc9a13e57c58e0bd69247e673f1e5a9d86caa1f1733d5dea551b1350ab26662211fd2a7582db2b9482b793adaa6d8c2852f98ae6429bae8526c599532883b0f1a3529969cbb24199517a4a647b183548306e1e28b43228ab52f45919f06950b23a1d82a5f9ee6d328c710502ca141f02f942d6b9e3fb17fe4bfc6912769ce9ed80b2a467cd9d5a4913bb1598595df48699c282796f80571452d5459aa9b58a22c7dc34f532355133b2eca5f705f97be28d44cac8efa8f427ca5648a891de59ef4f115f5492fb1864ff3440abd18a925f60211199f90e38b8bd14a2cb5132e6c8a634792127be15cefd3ce543873126b46a8ca0f1346ba4849ec142ce4bf31cbb832124bb464a71f412b360989e59e74b229698a878fd8ec52ff252fd4f2e2d011cb582ed44d0ddfc80536624db370d785215b9763c44e1d951e4ee7a4728b586a529c90d26a24fd14b1749aa3fcb913bd5b22968df350ab69d01343c42251afd2ecc34ed80eb1635c200e26678658b64b4eb39963bfb0422cf1f08b8bb9f21717a58c10dbe5e79ce4e7c545960d621f1309fd68c66e3241ec8f319d839c95d52f02b146cacf5f9093f1852f00b1395e2f98d470e4c48b3f6ca711eb50cce6bfb8f0c322f25d90511dfca52efab04dc805ce95d71759de85c713b117c5cb45aae23b611d47c4f63da315826f832fc60fb14ff33dfc8af3d3c5105b3ea65cd48d71173d4a21d6be0a3fe220ac6314426c258e17f6bc30c21ec40e7bf67e2d85bd5a108b76518829151e251c88fd0ba5419234aca802622f10b10e0971a1df1f76e6c96169911917e6872d177d17397ef17dd81c052fbc9beee2efe2f9b0eea3065fb8b295a3dfc35d747964377a3daca9a1795a9352359f87bd19956a737d3f88e3618da895e6461d950bbfc39699cff6f1943cc6edb05639fa82bceab0f9e547f9aef9c1d574d841ecba73c81b9b7a0edbe6d433e582c861f599a05e8ccb4184701c56bb248f8d61382c5dd894d629a4bd10bf6191935cf4c5c5a00bff76c3d6e8a18c65e0cca5b66149b12faa095f3d51d9b05f1ad187122d6a17ba86252223279906f5c2d5b066a6c307a18b4bd269d8ea6f92833eea4ed1b053f2d3fdf4e2f22fcfb0a3c38455871e174a33ecb82025b93cf9990bca326c9132cc51322c416239cee7c8938f61b3cc375fb86b1f2162d8e472a54a6118d6467932c82fb0130086ad62f45d59beb0acfc8e4db0f0e37961799ec827654f125d17960ddd8acdf8e282980b4b9687e4ae6033b92dac93b9b92825a33bd3c2b60d9a8bb9fe1a17645958f2e5ed8328b38bb1b0e5252fc6283aa506afb05df89d145369b5b3c276219e4e5b15f6c2cb4f6bf949001536dbd2df188994f9ea044c61ade7825cd4952ba3ae4e8014964621c9c1786505ab131085bd24cc4e9c0714f6a2ae07b95045fa7ec26a72dbe79bcde33b61dda87e588d1c3cb209eb997a9184abfc851f1316ebb2ec5fcf136d09eb69c8c546b5e9a294b0468a9ea79ee8820c2561ff82ce8a355edc057124ac5d5416d1718428f5088ba45e4999fe77bd30c25ed87b212e4f3968a68bb0a4a34692eaeeef89b0d77d17a7d663e4f021ac8f1eac43e6878c0a61b1adeb223bfb4609c2961abd3278e4627815202cb15e10d39ad6af1fac8f0d8f765e540ef7c15e9442a50777691bdd83fdeec9feb1e31ecc83bd276ee5a2cf6a7e078b58d8a6adf407eaeb606bf8d38b9df977c9c126abd3916a1cecc5946c4bd51b2cd717a29ffdc5356db0e32ec81872e9173ab0065b2efe6d86d2c8455dd0e03c95b88f2e270998c15629faf7bed642c3490264b0cc8fe572d445d6c53749400c9614b34130b5a706699200186c7954352ae3b30936d1e2159b794124918907d545132d5cb1a84c17757181e44839215ab462c735bdfbe851499a102d58b15fe4c22f483149c326448b55acabf2e00bf6325708215aa862a7fcb022aac8c409215aa462c9b5a37e314e2925440b542c67ba8ebb1fc99d8468718a6553524682ee48498816a620a5745d14e62bc5f264f18bd7b9b8294548b1837951c5b82e6c4679144b30d92f08592fca4511c55e3a635f1052482f2e42b179e3a8eb4d076a2928968c52f7da17463dc827b6af6cc88567194a2c3db13f7c9c7774d9543ab15326278d39b104effc89e6260679263ea6424d2c21582ee86d3013ab1734bcbed5db5331b1e48213ab242315b44bec615ed0284f47b4b0846b2144439eae128be4c39b0619aa394789552c238a4d7810be4d62b17c4e0d2677338849621b11f9997fc6c5a345620b292776f156ace41881c4f60517d39217a524e30579c41e11fae6b18bd1e52e8823f6ed2e2e4823b61afb62e83f5e92b9208c58d2d2e5e2e2a2738cd7228b58e56aebd64fbdce228a58c6fb1afef6ba602c9288ad31d066e4d7955211446c8de6fe632a9f2b831c6295b8b2465d0d42c82086d85205c7d457e1721ba4104b63fa824a21242ff06210426c2921bb20e32fae5c3091416c17a1275ff445398708622f797266b461669540ec8591416ea385c79507c40e4288d340bdbfe2ff8765227eece5ef87652d4ace873b1f731f166d8cce450fe191c88735f28bd71bbe20ddb6874dcc421f17e4179617ae87fdbb7eef1b595a250fcb8a846824e245c1c3faa8f2547fe964de61894939e951de8a54db61ab905f98111b7d1df62e46a99bfd0247163a6c695b69a7b9b81f3e872d849a91ec42098de5b0938c6ea42ed8b4c461a9a92edb9e5c2f8cc061edba8914f5c164fa0d8bcf7ee15f1c355bddb083c9a45f34a1bcbfe0366c21bc1e52faa2907b36ec59171d484eda8bac61cbaff0f56f8c66356c5e9032547ff5799169d8699f0be21bcdf987864525a3df0c6dfc8d9e61473b2b96b319168f0c27d79e65d8fa29cda49dcd2f9e0c7b5e88f0dcbc53f9183631e7b02fb2e460a218b612eb116b8cefe2300c6b7a7a51e57d8a5c381836fd308996715fd8428a23f90b7dcac4f3c2de29c18b34bb2e6c8e376a22e548fb7361e72fec66ee8228726f61b34b5f50651a6ba185edf3d7fe1bf7ec33d6220b3be482f2825c150bdbf58a7881c5875c985d6193132f982e883f2fcaacb046834c772ad122635558725d2e2c07de18a55c5061992ec80fd1b8d0ae723185254f6ed3f11752d8f285468488bf5cd44514f6bf1cd38ce2bf510a0a5b72ca4541f523d35f4fd8ae29e724fab968524e58766f232b17175d5eab099b35787591ca84bde48b223f3377cc252c1955cbbbf0762c3594b06d4c87470ac9d71949d8747261f78e636d3390b03de5e2c25ef9112fca11960821ec3835ce84901116b3b26d0c2ea35c5211b6ee46fd248dd45244846542cde3d89f8b7e08cb844d9e850c0b61fba2e0e3bf5d9192e1206cf16e7775f7d40b1d06c26297bb1b7731fc83e50b2265722d7e55c33ed8c2178346da395e90f6604d8b7bdf1832595978b0dcd88591b4f6eb951d6ca7dae3e02188648a0eb6ba114db1e659fb73b03583929fb090b53e0e96b52f0a5e94b791bebfc13697511a5372a1a5d8603fc71559971aec207e514aa970b6111a6ce6eba3bf3f1664d762068bc3a3c53f8f2e185d0b19ec64318d42adb13bd722063ba47874f6c574ddb91630582c6454cdb7161be5158b5855aeb85f50f9b72b16afa029d2347f7bb762f982f8911fa359b1c53cf1bcefe242a77a159bffa4a33b8b6469556cb9c71ca923a73a155b68522ff00641c59226a319eb92670839c59edff5950b35c5965fb45d107b32ef17a414cbe5620cd2d197da4f8a25522a6ccc7d4fc828b694e18b5248b310c5dabb3bb930525e47b166118af531b0d3f4ca3f21d62c40b1cac67661484adfb86a169f581ce5de1c3b5dfd54b3f0c48e91a21ef3cf733154b3e8c45e0c224206124e2c4fcd82136b434c8bd3b822526a169b5873bcf0b6c254238f9a8526b6f1a2886cb4683251b3c8c4162d43113111135b76815fda2ef0127b918414323fcf536d89a54ad5b367b6247295d8331ba55e5e89231e259620c90baaca319acc4d62d1cbbbe3cc15cc39496c4f167c3bef9c5222b1d97d716d9c64ee0824765c9495bfa8bb483cb6472c213a859c0ec2546a8e5852322e905ce8dbd15923f6790c152abf7139c6881d7645542c6d275ec4fe05a35e142757c278a1884d2ce7e9769188257651a453294fffe202114b7294db0cdbe9b8b838c4fe85360f328a6a769721b6fd862fbcae0ab15c689230219ea65684589ed71c175f8613b21ac4122bd85e7cc14e642588cd727174f1a4e708191588cdea0b9ebf8b3faf29406c8f2ed4f4c65f5cc61fd6f993b067e945fa0f3fac11b5e72aa8173cc8e8c3d2b8487ea2cc87c5cacf372ec506e9d8c31225176a359e5cf0bb1e76ca95e8b8a00b6299871df255252fe8bf4cf1b0a38eb2f8690a71de61f90b517fabce184576d87203c70df148d3aec3f65c345791a1a333e9b054e3824be5b38db639ecc56472d18c6621871df38fd6c676f8a564167158f3eea3c6e724bfcf2ce0b0d798463faef4433cb378c3e6e85f1cc96924c39e59b861fdd39ddac84c267a66d186f50bc731ac895d5c5c9c67166cd872c7a5fba291e9e23bb358c3b27d0fbee84923edce2cd4b0fe17d49543cde6a4338b342c9966c24e9a5c5c63671668b03a2cf93faacfb08df878e4c274f2a7cdb0efa64c3c17173ff5a40c6ba5e32fec2f6af03c417756b3c1393286bd28f9739153e7399ec5b06663948b520691be600ec3327f125d4ce1b2a10c86b5e28b2b4fd863a4eb17d65811fb91a817b6a95cef6d4a4d49edc26a93be74f7cf8b26e5c2f20f2be4546a9c8f6e614bb35e89730adaa816b6aa8b8961f7458ece2c6c1ea172314834a824b1b049549abce605df5d5e618fbcab2ebb0ab14a2b68e1cf28969155d8f4b9c3bee852da23a9b048acb4906ad47ae414963cd653f6f985dda414f6d9d91b3195cb4b14160d959959abfc3d14367bd4a8f9fbbff07ec20ebbb968e451d5d9e884d51ad74ece17176d049bb067ada4a7a4758e4426ece8297d95f3b1425cc2fe0de269b55f640d54c2fef9c55f187792d3bc24ec61963e6ad671d17848d8e60b35bc487c1c7a7784f5b920a346d11b3fec8cb05386d3e91f5f94a51561dfb554195248e12e23c28e0ba79f42a4786ad910f67a342fa849a9ce0a8750a82393401c0c8582a1402014040241e1acd701b319280c487220c9812cb7d6031380c086e18030100684816030180804838140201008040241008140201008040281205c0c195f03046dfdb8b660f01814820bb1fecc2a87bcdd0d6746229a07f674bd5e000feb36923f4addff2e52bd144dd2218c5d453176dd5ccc89d3c986c1a45db75bc3cab8663d355a532a06bb241d75a8984b52ec74a7879abe81ccda6884c480843a446578141c661b2ac66a975b8f4c9e399c87fc36ccd242903854d684c18fa0e1f0892de15e817086bd9907a6624c52eb89367e9ceacd721108ae8c4ac72ff6fb1a3e659e3e6be660f2b0e9807123c95c877b9cbb6d51297bc6524725e9dde1105f25b141e99f0895e462e01aea0dcb46f791b281afa572b30939f623a5d3011feed7b3a6c494a658a0fbca3382458bc668d1509323a5204648424cae3a4f73b7eaeab7dca41d894c5b588291ce2f1e3ee2e9ce10cb582392d6a0a64a4ee9df0ae94f59eb5133dbab259a9f9bf230c228b5ce3f080e8b3b50b6834db4492a268311c9fc4c63c12e2f3787fbceb7565877923aa7cb7338705932be0ca421a8fc7c63648e0ed32d62031b05f714084394ec6d40244b234aeef7d7f3c640482c8bc48e63e6d3d2a25513d74cfb807d3db19ead91616be49981fde050671f0abbd9246547a1a592cc416c84cf8c4e183739303d37b9694b0173a1ae7c71464d664a1e4f871d933b3e2ef649907d5086f5bcb8396efd27e887b359e7d575b8df0e072c4b66b14b9db326a12b50093b0ac185cab87128501b9a993c373b60d8e4c8ec04d289657e393f8fc76b70ec713abfdc4f904d6665b0cbf9f6badd1f97b9c525573c28e2d9f51aa0b0accbe176b9dd4eb7a3eb72bb0e7786e4ea769cd950b8cc6d2231bda8a9f3cc1a91ad47cf2bf62874d54a34cd5f085512943ad78f0aca9b4b86c6b394484c7e3d1dcc0804ea0b3f0883d280413038ecc4b2e9d0497872995a40eea5e1f8db79793a9d2fb7fbe9767c6ed7d779dcd19f35be661ddecff3f395d53ec813c99a3ddc02afb5b54180a2c3cbf57c879fa03c8eaef9d3fd7e3eb92e07c66b5532d02639dd8fa7d7c8cd11dbff3febb0b901854724d74047e20a6f75abb85501d14145a0139567d841e2500bcedbf5e5be3fddc7c7e977f444ae35fc4f2feee3fe447ed84df6b1edd42e2e154bcb0527898a316c48833c09357d124912e8ca8b1d2d6e39116c70d646a4b01716c2d05538c254fabf63e2d809b2e616f6cbdd9e2e7b1c7e8e1f9d7789f4ebe53af9e84fa8850cbbdedee79303e10202928edb767ab86e4b41998e96063d420a69325202a42d2a6f615c6447d7f3f176b9fbf9530d0a93bd36b0bf302203e66cb0a846c52ae5997bc240b2d60989df8ed7cbed70749deeaed3584b8673986375be3a4ee7eb727f08b9f2854f937a312362387c24737fbbee0f20c3b2616362b3f0b1a85cad70e8eb7d1c1d5debe9b65561446a6f1a44e4256a6d94c0bf44b7b28672ed1995eb775ee789ceeb79fb8c34bcf7297776df0f0ec7d5e93a3a4ea7d3e574381d5da7bbeb7076386797ebe870b81d2eb43687bb5617c3e1f17abe1e2fb7cbe9badc1de7b14b8600824a7e3d68459084981e2da168ed28bffdcd51dd6eeedbf96964f46429d6b219014d9dafe4d90711412dcf8cc131c50863ddf970f06d6647c38714873733f97d58395e4c97362fa1a2055be394412a5ae0d3b32f3bfed695fe01acfdcbdb618f41f131f9fbcd8c4625cf97111f4122a3d0f4db5dce00e986d9617f02dae8fc08b56426da5cf1c1753d3b9db7d301ff1e03eb68c8703dddaeebcb717dbb6ca3418e9280343192545482b2eca871ba3aef83d37575005c32867471fce578b9dcaeaedb81f13ed427e2a0da70885f8ceca8d3823dd4586bebae2cbb3a1e2dd983d60a3ed68d3dddaf8703dc5561e00b6af6fd7a3f9f5c97b3e3383b5c4797e3ec70ba9d6ea7d3e1c49298c25357396280036b255883d9dbb1b054784931acd283d66c8ec46e3886b29d5788d112502349214d8e9040beba0fc787fbf8769f9f8ef7c3856b10798dc22ab7068c8dcb9f2d480477469c8145af33c07d4c31227b5878a42a7e90cee1593477003cec6e6d883003df2f7e805c9d4db1b0194e53fabc973df3ae0ab9cbf8e9eebe9f9eaeebe33a3e915c401da1ddc442a6ad385cde82c9b770e889818e1aa13276015f6f8fae16f75d956c082c1e06023986ca3b002ee24717c68f07c702d01e3bd4d5f97eb9dd4ed7edeaba1c1d0031a440b5acc3fdc18acf5f0f375bde7539590834440ed63e1a3f979b8cd57e8842f07158ba0585c670691326d9c06167267ca12b394b182a69c1c2cfcc0f225ff333111d2f67e1a70c780406a392369d23054a9c528d44e9eee84cfc894ad16ce98ee0014684124477295de249de0eaa342c9d2614134a095aa2986094702578254a09522951422b699ca5ff2746bfc75b09514228812919951025b4529c12558a50ca29412a11a568a59c12aa84508a53424b28a68c52c2b5f485e38e9c9ba424a4c42a4528714a1d482946de74f62e9ad29052b64abdc7058435b2e5a79a97d65701ab6217433cb5d13d95b98ab347b2905322e4455b96201e950d08b6f044a2d1c8a828d25cf4023a54e06f0d5aaa2c44d5f54a884528463d609d792b9322702a090e6e495b32f0f64c41e221c591781248c98c84404221c195843961915048914804099a24b861b5948ae449514a192418e98e0475843c428ed0477147f40802098704894490143aa42c2899042b34240b098a94400a4312232451c038b7b79e123c1212298cb4234521259110a434521c528a8440ca21414994120c128e048f44214122a5248492e62265b1305b247820e191324860243b524385c47b4e47624c25c97eea06223512036981f444b220b99176482fd205d287e42d41d256be711563a420c95482464221219110a468240e298a9440824322912248890e8989033b14e487048f44228591ec485048245204098d8443429120907048482404291a0970483c4757b94219958ac4aacfc2002a67c92ceb3417350ba5419726f68d68a81de916f5ef5f2c016114ad6147047ceaf19a5268f09fa3f027167364580fa88c8934ab023d61ee5c606524725843c0674dc176c3b8ca1aca2ab5c16b1976fa5e32c2e7c259dba4a6290ef3d63c1410a0fc286458ad8b30b9cfb8503aa69eb1a4bdf774c5ec5b3701318a14ef7af7fb7e25d362811d2d5dbfff535d775150a1c4286ff7ed43dc0719064449ad0db7580e8d1910324dc34878777ad7ff00f8c078c6e5b527686543a6b800bbd1a0d3f8838ea98fb741a355a30560be205ca4f49846779ed2e4f389a22cf78e94e4ccb15b3353e43a6fcc7c6379f782a303e791e1b7f51b19ce2e50e26d5ff9dc8e61347b24d375bae048cf9c4891e7ca67543c2d2d98a84871b7c885d96d8eb68645baaf9a3800aaa501d1af971419ab0b75323912e7470e228d5a180fdec35a2f58763a7ab2526ddb8919187ac19b22c7943470611a36c47345c862d55f99dca31263582b42f5ee5cf1d0286c950399a15dabe14ccf2c5ce2d758b1d6ecc8c9287229290671e7c9eb79a977a4aee86d49aa6376afad5b0fed3f5cd4be830cba1f8988ee6c09efed2f201420f773bea9ec42a290651cf947c755bd9609b7aa4a8599e46742b73a89888b5d4cc559a94db46efb421e5fa2413570ce535b277700b5541b25efd06c2eb4486be1998f071cc50cdd544e8a5ed170e140ff41bf81fd713f9be106a03290ccbcadbc9d416fa95469d6e83b0f43a7cbca31a9e70c642312d514da0ceb7222ce0e73d2d238484818492b145e139ba122267d97c596fe383423e4401138224dcc2522f5365327c13abb6712aab1fc42de89d4c18e0db214b8d56cba90ba3d3fdbabb58f526e2a4f5db90794a42a103da5f6c9147638f67bb85e5f0ef91eec50b893e0db02c169b78cc98277cb4040812c70006adcf1b7ec16812068c280d9b3c5bd052cafd753c99eb1da99d5a320b76517cff6a45229d281beed49570a518114ef578a9c24dfabd378509edb0416ea1095345279647a3db0af872121aa20c5d13899c48857b23165560e4241e479a101860f762985b41e593c75faadbbaad38a2634c053584bff64a1ba8f2aaad5d5a322b8d786e339e74a089905a5af4305bdec65ca1f4c620ec0658d2570f25270176d4938055507234de364e688fd59971e578493e62a5003db0100015083b4c4609e5e2fd7d1698a4152879d6a60f184c9dcf7002dc934dec0140fc30c2b0650e555126911589f6285d479cd243eb294072e0444bb9101571f5d4e577cad9e81ddf1cd790fb5f57a377b8579ed7f80c2b3dbdb303250d73329d891315df098eb340ba256b282fe16a9dd881295b654d9d34dcb9b0f41eb1614db137003643633120403153a7533574a9938d183b7fb1e49970d1cb6cd1dde8ae88242a53c1a4a22bff2c220ecb05f0972f92c379a789300f3c80b5183cde5f35cfb6a1a659794ead5732bf7c7412a42d1abe56c35e666f703d98dbc0f1377cf1d6d5382d59b6cde7cb18abe8d752dd994a2933392cc5011f616bb04ec0cd882ec2f6d798056143e8500fe9f135fd85533ef8b32a44461cf639d60d9865466ae1693892626d5bd844d2e1d0b2e2ed6e990593395f25802740faa8fcb6a9e611a635a1197e09faabe6df1e60d18f6f9d0833304515a651fd4808590c2ee8342ee6737a82a41ac4f777ad02a9889b52f5c86e6798b515809780a595c1fd02e9cea9110252bcd70aa5d1b48061aa381abb4d4d19ed14dbd14d0b43562cf67c57c57d0714c43c5f82e1cabc16aa9540a0831b46a24cbe3da0ae27da86ee591486d32035f3c98ab8d0cad7baab3083890018eca415744de45d50b1601604146f1cdab801d071f1a137caf7164fe408665456814fe35a7f97f6876bc54e0c90e89e7fcca17c77cd52a394dd82a980d9cc795ca3484631f428b3992676288810cd44fbb339f07fe5e42281edea5fbbb04f059f1c8057d93bd313db4e9dd487043b6a891083c3ed8004e09c4cbb7eefc26bbe09f198224eb6036c15c3c8be05aaa94029e767c900ca23b917795ca6337e56003462f53c507aec1a09550bd5ab3e1f20843b120f19a0f9e8a3a58b63b816e9cb5486b5b0f5c72df09eddf930260ad1cdc49a1cd14b845ac7cd9d79b027541413863452626e6f941c9bc8537599f96a6451ab6929865aa570412bb375d8719abc4fe7e8822458fa6efaa6f946d8c3a424cd0c1bb938032dd53313727096e772ec80525114e1f28586484a3c20117732282467e3c37c93d361503ca0265d8c0cda9aa16e4a149205b5e47b3b220228894e9b450a0e956401c748c010cc9026e9144e60b3960b26639ff000000000000000080b8c9cc3631d2502538252995fdd10b65505e729229a5945224bb8377c199894f6739111121ace035d30001670b5e0ce60bef683325bc8451e49efcd3f99f4c3c4b982527254ea8f02425555b6cd146c0a212c6b2ac9c3a2499e392a784a9fc248720c4040f739a84a9944e29f9b8a550b148c26ca9927f12eb3959072361f4f89f4a8ba70f1d868449a28de6a41396d5a4e511e63555a5e242270f5a39c22cf93e2413ffa666233dc0a21126f961e4c4fffde4717901168c30bbfd6be9bc4d0c1db15884d1cd4ce7550edf692696032c1461ee92fa41fd5dae3c1e14701e5d7c7cb8179dc30b2e126191088369b7f8d2d17dded357c002118624b92ebbe9e343f5108611d2344c8ff232f5e2d83ac18e2d7af0388016d291821e58002c0c619093ba4ba658759fc875e868004e008b42982fcf88104252275e731c5b6701d801168430c7f06842c8d2777be1e124d09103021fc8c38b2e2a80c5200c6164f98ff09f8f20b2a30b2e72dcd0d1a8879505b01084219d7e5fac14a7238e40f2d43b2060b55cf4e8132016813075f57e0af963eec77c738005208ceea93fddebd78b5f204781f9f8f8383bb64000173d5a031f1f5cf4e813fc008b3f98c32567c7f6df0fa61443b78ddc2b797dea83592b6c2e7d944ad31e3e20a63fd325bf573007173dfa040413167b304792cf36a3a51e4cf1ff4a788a0db17d1ecc79f2541251ca4377050f067349c962e9ff87cf1d8c2d96a523ef5d4ca87630e89323b2ee6b3a9c590743ea0ac1c445ee43ba38b6b8f02dfc86172e8222021d391a60430b08e0e8d10ce03181f6a213a005046c58200211f8b8c1830b2e2060230b1b0db091850d2d6c64c1830b2e3e3e724d021db811003260410773d8ccf31447058ff61c4c91c3423998435475d221a9117f4227ddf01c3cbcc0c5220ee6b151c24a454b42aa8963b58080e7a8c5020e068bd1f5df6ffb26b63798424de4cc730e7b31371854b84e2acdd7c94d6e80451bcce737b26b7222517d36186364594a2adaf9f86b304612a7a6d229b99f763558e259c48b18556db1c517aff558a4c1ac9be7418c76133975349836846c6a842bb72a9dc18cf708d61272580a1516fecf7abb92dae3c6160514e18085198c9dc3c751736254e45019cc2363e4652e25c9d6218361e488988920a3fd3406d3e438a21616ce6a6e31983563728a1b6a3152c260886a5d796ee54c09190c86a8719556de3ba760f9822964abf420fe23d55e2cbc609c90ca7d537b424a2e165d30259371fb49a8b491925870c1f8a62c890e0fdd17c6620ba63aff9a202e24a7190b2d983e2fed7f5b2de59f05f3edda270b62c1a0468be98eedfd90bf8241281d94ca9df3fead60befccd0ba54258a70a8649c193fc3931a2a6824923e52a51217676a760bc113ad827a54494b8140c3766dd134456fe2898fdfd52769ba060b24b4a94999e60ae302d0b4a26a8607282b9c3fbc40e69b1aed404f36d4ddc581b53a9c4048390e4f951a49834a12598dccc7f744cbd9591120cfe1561df92970951124ce5b9de672357fc10120c2ab4b5460ad9f742473084f3aabdd908c64895d45aa67abfa7088634e25abc2f858e8960b64b91904fe78b3b04c3c87ee809316f4121983bb4727d4bbc6075108c1a5ae6dd44df8f180826dd49eea494fec094dec32525f481d9b3ec576d4eec7b605a0f213e5c7508160f0ce7f37ed26e6c266507a649cacae36469cd3a3086d2232fb9c4486d0e4c39957fb8fb9e912d0ecc23c2bebba4eff5dcc0e07b417d642d7db50d0c39c7554d6b95546b608e9cba91e67e749006663ff70e49a258ccc0a417c94fc85d0f7e6221039357becfb5768964621103b3a82c15b163d5ac88050c8c15bb44f8782f41432c5e60aeb1744a56e91c2788850b8c1a229458b5919ebf5618bf66b4322b88f81c2b4cbb9a2b42bfbbe55b85d1ded2c7247da7f854619878e51dd254982cfe4a5bc812f73a5418e58212952ef67b7d0ab39cfcaf3df1142ba63089b85e21772befa5300915f495aa5eebcc48611695a3a7e53df949a330fbc4b75799b4e5118529c95ceda148e7c3e29d5d7f0528cca9426fdebbdf5deaaff88421a4d9f2da39a95efd159e309afe9045c8bb6421f2577482b3f0f1a5644e18672e45c5988f2293df84214cd813a7ab445cc96bc278d24549d1fde422f94c98fe478ad9589786e4316152499c9abd3c5a11f297300813f549c912c6f2dc6982bef472254c695dc432de4789286148f1f3db0413f5e0240ca675396a9a94ad5e12a6f60f1f97bb5f110993e409da3a0e09539023a73f852a95f64798ef3545a4b3b5cfba234c5e1ef7625ff6f3bc11a630ab8bcb39ac4e9c11c69c53a192476599d222cc49a7ba583a8a30ac7b75de8f367127c26c55ae35c2fdea821061ca0942cc9cacfb121dc2f03af24e68e8901c3284415384ec8f0a613e4b214a2348ca39210c1792b8145992ae681006914c27eb20e52c2d08931619e79d130853488ac9f2d67bba0308637bdc47999c3f184ea4ba373d91a1f783f1e4c4f1be4d39f5c1189793cd8ddaafe08369d72ac9c88f12e6f62bf6600aa1712341c4d372fb157a30aa8474e111febfd27e451e4c498a5a07fd1b9e6abf020f06cbf693c3772badf62bee60ce3ac9a2b32d9fcf7e851d4ceea7df7284cf1062bfa20ea6b594546eedfcbeb25f4107738e52ca74abcb48d9af9883297da77a285d2672ec57c8a10fed252ac8380e86d149d2747df6990a1ccc99192fdada41afe50d46d3bbe962b5a554c50d66494ae79419e2c76f833949ce12d1d1e494d87097ceaec16821af4226c5cfb96a30f656b6381aa9526ed360c8e1933f77ee4eb668307d65d35efd19cc492bc98b6ed941c90c06ef90465e2ab9b1cb60528ffc398914720a198cd9fa41d49598693a0663abbbb9ae05df93180c96740ea5274fcc4f180cfabefec14b771c0cc6ba14f2058356cab8c97bc19c63d3d7e2d80583955a2ad70b9572900b26b37d17cf168c92f6c2e7685a5b6bc1a04eeca44bb79b2466c1242feb9665446b8658307e94a43c9676a7fd0ac60a9362276a28d9ad6074b19454aa4962ef2a1882f77e4aeed321850ae652f3c1df2ec9186f0ac66ff71e2d1e84474e0a66999073aa1b517a8a82d953ce90dee92947a1600e722ebde80b23567b82e9db4348312c6858e60443acf8fa53130c4ae809f3b2fcf330c1e859c277ba7c09c68e2d7247ab04b3574753d92e8b102b09869dfc576322c8c948304b786dbd541d371ec1902488d38a353978c48d60941c795cc4a7ce9e22184c63cb2ae553b28960ca397d0e21e88760d0f5a1e4952f04e3deada4fcebbabc07c1a0ebb2726ccfeeb803c130c1845d9a5c8f1fff812986ac7511edf39efbc030bb1652bebc07c6f55159564fa6ef3c30695aa96fe98e39edc01c64c5ce331f3c641d98e5db5bd667239f03b304b3c9965246da120e0c2397b3770e4a57dcc0a02d2458078bc9a693aeb08171429e554f6976e493aea88131bf5ac4af25ef7ad2153430df9795e48a26969d74c50c8cf2a19e92909f2475d2153230c8f3f93bc5c094add6e91d8447c98181e984999ee79314e117984f729820e74de5f60a179862e64edef29845bb1506ab144595b24e396785d963f474a7390d60154693b0653db92d89390d4015a691b816caf3b2a39c06900a83f80ab5fc719e2f4e034085d946267f302de6794903388539744ae9d2d6c5259534005318563d4ef25c97824a49032885f9de27e69bbed15749032085b9538ad7c1df51984d2bf96dddc9feac284c9782d2f28e8f9ed7501882c7299d2a7dce5550988238552109f513c6502a926357cec4d31386eb0f8d14f2cfe6ec8449cae5d071a1546a9313069596b5fa44db4f7213a6533144fc7b8e89a426cc4988d7ca57c23f8d9930c50bcd17a174282d62c26c613bd93d4e902a5ec2fc6d394fca2a524eb4844157c7f54bc81647ac84c1da939ccae8efec51c228f946958a49dfe24dc2dc327adbf722a7de246136f1b17c520c3dbb45c214943ea97d314818cf42259162bb9c8a3dc26cb9e4759aa788d71c614ef3f813ef456dde08933ef3dc18d58e38234c41bdf48953a54598b4ec3e6a959b1e5552847154275372e253d44a8930c4482ad58814220cd9e495178e63ab046e5b740e2f7834053e3ebae002414004314261d0b14ade77b8153b0d14a6511da27e35f285bdb8a18595f909c3a452310f4259126ff18441bcfbfbfec48beb924e98ec442c75937a4e983e8730ff126ad7f9dd8421491f219e7cb5fa6f4d98c4adfdc4e26bea9c0964793c915ef49830cfc534a54b9a45fbf8254c623d61ecf6630993472ea16584e95dcc043bb8701e953085abb0101f1f4a7a9e12a649522788d29663f63e09f3db8e1eb9de75a2744998edd48c52399eeef84f24cc5b39f442e80b0953beb74b651e7278523ec2b4dac992cea24ca986311c6150fb94ec2531e7c26a844982eca42b4f0a238c257fe48d5eebf6d42ec2983d49681991922e971788a1885e9408497d749097449e811ec4488449e343089af6a1e12d224c31b553b474bd8fc9310e61ba9c66a5b3970c578b218cded76bea3f5d340f2d506314a23e08511f83a80f84410c41d44720ea83470c40d447c6f8437d580c3fd447a1418c3ed4c7c6e0437deca13eb80631f4501f79a80f3cd4c71deac30ef55187faa0437dcca13ee4501f3de2501f70a88f37d4871beaa30df5c186fa58437da8a13ed2501f2c831868a88f5d418c33d48719eaa38b8b5186fa5015c420437d8ca13ecc0431c4501f99821861a88f13c4008349e5a38e7eca4e417231be60bebaf06166f17951dfc2bf50004a2086174c2f71365f4504c756b1a200046cc4e88229e4ca25ee92a8d24f9387175dc4e08249f80835ea796c745ac70dc7811a7d7c64b221c616cc61e25c3645e71467c2b15f6cd119d8420c2dd44716eac3041a851858a88f2bd44742218615eac39a10a30aa69896944e6933b75b4220c054c0f453e65d374ce98a0b31a6501fc40731a4608a7097efdf2f0488110543d01cad311f5b9be7e0a10542c13cb6134f58d0e76ff5134c95425e1339751e7fb303319cf0a72b29808b8f8f8f8f1e3988d184444f9425a56409719d550c266cfef7a37264cb02812f22808004780e1e5a94f2e20b2e4ef21c3cbce09540076eb020466a528a6c38b64a046228c19c722ebf5cba5369331c5bfa80184930e4483fff231e3752a0a30b09262d0b313c2795021d7da347023e3e7af0b8a1c51dc190b463c673529edc92838b1b5e54e5888017be4517397868f1f181821c5cdcf0ef06502086110c1ec48938d273509fca05c42882c1b428f923ca83758c318860d68dfb94ad4a8c21184ddf82b5e41c75430c2198654667354f9d263e8b636b6d68b100df2235c08a1a6204c1601fe5dceee28e1e2d0610cc29ead7c7fa42ee5a706c00c210e307861cb44feaabb4b03d6d64617788e103d3c5ce2df3e949fd7c7786183d305bfc531926baa4c4df5d016588c103939c79a55cd14c057f0706a97142258f73b1132f5588a10373d029d3a5428c1c18374c54124f7b3e4a7c420c1c184d490aaf30314b4b929d10e306a6901e26ff2e6703535ae910ba7476dba56b0c316a60fe1339e84e21a9c0108306a6edffd473ad24c287ccc0f86beea5e424f52342323025519ee3f3a6c28b6288110343fe3cb59b1b51171b06a63c219848fd0922b37203005f88f102738eb53be31741ec371c5b27681e098717394e502a10c305067d77d183deed8f4db01480d10ae3555c507b665a5dd2ac30888a2bc1db3c5b296f1586a0aa35c64accb652706ca9c29c823091539d07957bc4b1d5459fa007a6c2382792ae3d4c82ea098ead1b3b52e580810a53f6cca99168659f378ead146cd145175ff0d8f15d6c71036dd1881c0e18a730e70f31adb33cff4444304c614ae92a076f4f716cf198c0c787177e012fbc078c5218cb2a7fced1742c550b8e2d1c5e741737486152425ec5a70869278f46f198748932b91dc8038628d40f299eb2ac71dbe3d8d291e386173abed8c1455f280cefa32532418e63cbce4061ceea9cbe372c4d72f609d3ba58aeeabe0b793fc84d80e10993a754a62a9a5ccaab8e9900a313c64a4bda934e73519733270c397878aceb507977dd8439454ff932eba45f76760b303461be5cd1b2a9ef32166064c23c7a2fd257b2116135c6843953477eaeb45fc234398f8822e243ea060c4b98633bd28fba45e3c006c0a884c15b23b9278b6611d238b67a78b1031953c234d26487cfb14b8820c7b1a595c53509c35bf064f1a246894f12868f0b9ef20461a193aa877791022fd22261721d554a8849c3808429bf47d49d5ae8fec500301e61ec96db154ba336dd7584c1d64ccc5fcc64e5ac11e6e896113b4b25553322ed36f7a72b02631126ad10f3e2c58e1d3c9c8717058622ccd6f15408f1eec9548f638b1546224cf2248e8ee813224cfba3659e11c566a28730e64acc9d94730afb8b1b3dfa86dd086018c25841445c141d17c21cca948c0a49bed75c42182fd575e7fd76f04be1c1c3075102188230f8a98524d4c9458e6f717a3d002310e6da9d1c4dfee9c9d7b403300061d2f2d99412def726c4a37d0b74a501187f30a8fd0721596d3e77bc871f0c39c5be32ef1bbf14ebe0f18517ce03390abcec068c3e18cf447449e17289f8513e9894d4165139c7716cedc1ece97b2e5acaa1549ebaf0e28b1da62180a107c37950212d9f9ef4290cc0c883512dadef968824d7461c5b376ea4761eac783058b8e0af39b61d940227c18d3b982f7268ba6f6707c42389ddca7ab4086e78d1e38b11a426c6861610b0a15ac0a8433a9e7a8eaa0da1530ac756f6f0a287d526187430569e07734d8b306a9d83c9d453b3d2a4c09083f9f2f64c9ecd8ff8350ee6a042742909b26a25513818de6e3c96f8784258d20ea4c5d60360bcc13417f2271d74d2e91a99d201861b4c3d295eda274dadbaed00a30de620d4945027721299a52e3e920830d860f2584f4f29a4d316131b5964a105046c7c7c5cdda84c038c3514bed3978a3123c401186a30e4dc9d2b52781396f438b6b6d8220709d2604ef961753f6c9f8eee80810693120bd984089fcfa7835cc0388339856fbd4ed1feeb2f2c8061068308afbc3ec92feb5828805106834af6d5e66b6bba2a0006198c7dba4aa938722dce3198ff5330f71f99e02602430ca6eb11a1477e483977b7e891660646188c67a77b74f7e41131c46030cbc858ef4aad9d4be90b26cbcb79628885cb4dbd60dc519315a5adfe2c461fc0e882a9a4a72d95e4ea556e12e8f80247160c04185c3088bf86af564e397c10171ec0d882a94b7fd093e42249ac7500430b0619d3501f16a63a4453c78e2db2f8f8701d3bb6405b6c00230ba68be9a2838d0a92afd29103f1d8a10019c0c082d9fa552d8534bb00e30a260fae9a154ca284927e6511926ec80a30aa60cea6957ae269ae67870ac6cdd4d79ccf140cdb6a91c65435051852300517e177d2bb17c0888239a75d4f21a7dce95281020c2898dbb6a34553f539c1a204184f30cee88aeefe499755824780e104f36e57ae10ac2b766c0b46130c3997be907e774ccadd4302370a06134c19fbc9dade37ec8438b692f31d184b306ff955346d261c5bbec5692f5c046701184a30874b3c2dd9bed1c32a00230986998f16f3928663eb46046020c1dcf2aaa25b44f87cd71600e308a69c65d27ac81249e88dc03082399f8a5e71e32910c02882b92fe9a748f9be3dc4e4e12248be856e0183080651f2be64952e9f58e2d8d2b1a34c6033b0430bcd807fac093e3eb00d3086600af1736adf86c91149566180210453467c53512d97051841308d69cd4ff2ec4ecdf6a2bdb880106000c1a4c4e829bd1492942dd9c8020136b480808d8f8faa1b95021ebd455301c60fcc37e2767257c70726d91d0b6fb31a47555e00460fcc9d2aa992d5caae9e25c04616362c70001b5a40c0c6c707b9ba51850f3078604abb102ae96d4fe5a61d1882eb9ebccbb77ee4e8c0f09556e7c7e652cee7c0986aef31e221a9af1407e64f62296a3a7f8a29dec014295e123af8ad47fc6c60b008234e8cd8aa174d0b306a60b80b11a2fde934715483410343ee399d42533d2d7f1c5b5cdcb871b8c7019cc78e7730c09881496e45fe509f231faf0c4c61c12b2de48e88eec1b119801103733465219244fe605a2ac04616df00183038bd52d07d3a42e7882fc8b389ce6781e18272377f44d6d8fc5a41acd4b69025cc3755566c93540af97c1effdf2aceb1964b1f69e384852accf1c5d26252522a4c62cd74fe17f79473091526ed5bd3132946fa7e4e61b40bf708b2da930e1f53986d9448083125cfc7bb14865cf983858acea5ad26853162595514934761149143f549f8937417511846bc7d55ce3314c6ab20c485a474952a1d28cc934c567c4f9bf4697dc2d4a97d77ac373ce53c610a49a627dd5ec642c8c2008b4e987aaf22093949acb6cf09935cfaf8a4b73cb97436619a4941a8a950b127c69a3076c4f0acfa9cb2769709437c1515b473a82cb331010b4c18f2167ec50f9a842167e95421a66bcd3fce22cc9084b9db84d227845698467846244c172e8538952ce714f7fcc10c4898530aad6fb9235578d107331e6112d284163523a7dcb23785198e3028697b39be8ed75fd035c298eda3a9726a3edbc30853a8f1d02d9f4598327259b692774fcf1561da8c2c7a7d2f64ab2d9f302311a6a03fd6c55cad92d60333106194e8aba619f38d1da97031e310661fbd5762e9f8e2c68e442ad310eea8a4d1f094bac48c4218a4e78cba5c6a6df942086328495f9a323ac4fd6e0d330661109fed49728e96200c49cad7281d55c962eb9174780e1e0af8f8a84098c469d125da3dfe2a8461980108736e8d39f972416ac5687f30cfa5fb37d5273f182505154ba524d1c28c3e9847fe8918b12efaacb5c5043e3ef860ccdb9fd475f35da2d4c246167b307548ac0ab2427a304f3cbd7fba65943a551e4cf9940e2365d33da4180fe63415cc3beb291da6bf43da66e48588233b406ac0d9c1e019ba2e4a3b68568aea6070493f23ae96fb419674306731213999acccc1544a52fe24742e89ddcac158b99e2c489a94fae4d1458262461c8c5fba9336b96ea9230901708a197038f8255dbde6696a807791022d52e00ff8f82845021084196f307ddc7793ebf197201664c20c37182cc5b336e1f184e5df06636e559e7a8738e14384196c308add7dde1dd5d94c3884196b30e7dafb75cc450833d4600ed9d129ff08ed9d9d349854b2a0cd3be6e8282133d060f65c9bf9f717433eabc08c3398928adb16f468cf934fac84196630ad8912f9333cff57a58030a30cc671592bad5f63dea3a283196430e438b1dd4ec8158f7d0c06695ffdf129744e982106a3568cae9e981b1f1107668481cf31e2a3c00c3098c33ac57a2e474e23c5b185d5c58c2f9845770ca5e9922224b92836b458408e195e30fb9fae20b7968e1de500808a195d3008952174de9d9b685a916206178c1bdbb5dab136c28c2d9894b89452ea2dd532370e33b460f27ddfee8e21e2789d0583cde7f35423cb7c26e78619583058b22e51b5a71a665cc110d45bdcb4bbca0bb3150c5a2699b6afe5246236b220c38c2a18be739836cf7e79fa11c30c2a98a4f586988bfc36af66a15d983105f38cde3d213c5f9f772c0b33a4601a1dc1b2fc5fa953ff0a33a260b4504224dda96d2626148cfb41a90a298ac813cc5e49c8f93ad5176638c16cb56549af3bf558c40b339a608e2621c73f954c4511dac20c26182b3fa65cc5273391635298b104b3fba7d8f1d7267b6b25985ff55292a97949306905c91b1ae327a78304931031c44e12ee118c6edd6297a47529b51ac19879f1c15e846a7a59049397ad5e8dfc271f1d114c6b7a57ba7287aa980dc124a9f2577ceea49e243876c70dbf32260473ced62a9f354525e883601cd5b555a1f7bb3b0f0493e493edb3efe5419e7e60facbe145e74b32db413e30889952bb4e510f4cdb21e43011f9295d9a0786de8e2af2737607a6cd8a3e13c69ca103931aadfe21dc4ab7bb193930ccafb86c76fe0b75392accc081d962c4229ec88aeed40d0cd9f396876f5b8ec756336c60ac5c49cf227e6dc977b00d2d16906c6801011b6b1585193530bbc7becea63da850fb8d9d410373f8d6f87d8f0586193330a5fdec2148d58b57711918c5ca82e9cc0a32d7130373d4369194e605fde98681b12bedf4e68a9ca8f405e6a0738e73cf25e974f208335c60d049b885d051763bd756e495cdc57556982e545d4ad9b2c77e7e157dbafcac927fdb437a90a10aa3bae7df29b3aa49662a0cc944478e904419a830eda7e494240725459f4ed1e4772b1ddae6b1973bc83085414cee60a13deb876c955218921059d7b2583a395a19a4304b0a677de16f23c81885496984547fff79211685a992888cfef1514b5b7b202314668ba92e17e7b35abb048549a554397e89a05452131c6b03199f30c5659351a191d3e61a90e1096385ea904b88d49d5ebac0c7c7c78716cbe884793d67a57872c3df452901199c40dcaf58deaa646cc298a3df1e748fccf6c6c9d08441de5d10e1a49a9af08e2e8e04323261f01bd10926b3735716c7160e1998306b8adaf0b794ae4de8c50e1e379c1c0a5c02ee457391c38b1ea66e15322ee1b5daa452f91406322c61bc58935298ca38b6920ebfd1a3e830698b2f76e0b8c0c787052010322a610842774a95a745e31b3a76a0163c744ca0402183125fb887eb0fe9355c1c5b5b3790310993cd969e96472b1d9384f9363ce50fef6451822261cef952b8a0d2c4adf62d900189df44c7919182dfc4530e1378161f1f1f1f14b091850d0b5ce0e383a441c6230c6b29b76b2244c70e2b14c8708461cfae549cabf437e9c8f107483a7228e0e343c78e1c67d508b3d7a89311c6182d5ad7ca4ebe8c166136cf1574daaceb9a5c1146d3f1655182291186f110259e697bb31421c2582acc7bfefb7f47ce210c6a4379109ed527588a210cd24d569a4a9642184fa4a8c8a92aa5945b4218624decd2916162231d842945f018e229c5f01b05615e3f3b13e9be4010cc82a7e676af9bba200310e62041e4743b224f49ff602ee9262f86dcde0e9a1fcc27c25fd058f756bf0f8631fde6a53e4c2e6df1c11cc9472f9e56153791e5828c3d244595fa155529eb3d52e024c8d48351e455cc2c934f41b67930bf24d753a92c87a40dc7568f1d5d9c2e41061ecc71c2239c07515ff95325c8b883398590fa17420e2e3ab383d12766ae989ae81664d4c120a9444862dbb4a504e920630e06d52987af12a120c89043a125c7491136eb2ebae8aa2cc888c3dbab16a2d61bc5ca861610b071a32042061c8c3aa97527fcbb784a6fd126d8c1855b40c7046c6451de60d0163d4c5aef4090e106c3458f1f154a8e68b370d13a5a02d806d3e90c593f7223e932d8600c613a6b89d293eb10418e0b141264acc1e8bf3e2742a54c52a5c3820c35a4ef5fba112fcdb51c24fdf4291969302435215aecae141a8ca6d62e5c849f8f79219504196728b85bced8162d494962d95948bd297ee7f7fb4186194c797264f4d9c8102723838c329864f59cc969dab6490643d21754b41c978c31982a437f487eb9f04086188c1f2d4c08bad2a5895018cc755b912d4d8e7320030cc63bf3493f13c4c4422d07c8f88221077125dfa2ce726c45706e90e10563f667b59f9cda414617cc973b39b495def2e8b951850f32b860fcc9b7167c4d37aad020630b46d5109913f2b951a46468c160412f5f9e284ae75930c54e23feacff72853416ccebfe61b2fd87d3ad21800210b0a15fc8b882c9f3842b93e8297e5a36b250948387eb70112c916105b3ad05f91df44dd2552bc00236aa60567939094a843ced08046450c1a0dc2deb29d34bfd2a5740c6140cbedaedf3a95a54956eecf0e2c6d9096448c1d47a63da92f01291ff2818d2c75f79fd7cd9f799a07d8bab2c9207175c10195030555b57129b490afc013a90f104938f3c9567b282f4d48520c309e64e3e9e745e5774237f20a309a6afed9c73b20ac7167e7cf84006130c1f562ca41965d2d5ba808d2c6c687103194b308d6d7c30cb22164baf04c388882ba2a774e7ee49306ce82549a6428e5a424830977fd229a7b6e48cfa08a4d8176f66231bc1f4c9e3af2c8c88a39522184c4668f90b52f2774804d3e5a44bf7971346764330badef7d5474e0886b7754b33ff21262908e6bc16f937f29e2ec88060cad2397fd8a67ebc4ac60f8ceebf3226e739b324327c80da954ad2e5d38392874d90267fa2c8706c7dd1e3c6a91564f0c05449c4defeeebbc8fd0e4cddb115c3752d49fee8c0a064790515b5f2abb8393056d89691d941a71d7160f44dd141c9f02bd7f406c6f0c9e6f162d9c090427e9d1c94aae79ae0d84a27c0e2e15d74d13c34c0326a608ab10bc9a63ae9d82b0d4cb13a975d7d9d779f9e8387165ec89881494bcd46d2878b043a7043870c191842f85849a5e9f95f4a5becb8e1a8b7e8c2796c5140460c48baffdaf2a26f70cb8081212721e284687172f2d8a123c78d09c878415929086927ffc76238b65c860b4c41de43c9901f7aa52b1c315ae18ced47cacf91455aac30a48a64f9afaaf772afc22c4959d49bb3687f2d8ead1e050431546112294a440dede11ba954184ea4a91c41c59510725418e2bd7ace1a92d37d88159ec2d841057dbbfe4fb0234d61ba146a963b524a61d07145e452c58bee9f6290c29cb4cbcfdce754c4138f1d379001314661ca16c17343d493509e284c398924a3b36e96590191e094cddfc5348dbf1024f264b2b4bfe9363de24a29dcfc85916aa976442541f2c44fd39e346e045263278baa2c714628e716849efb9794453c222e7e2792722cab8855653dd492d05322b41321db997bb0191311350ee1492fb5f12769245da50507a286210c93947ea79abcae327ba1c3b928847184a768eb9d3be40b962ed42084ba2efbf164cb4fc741ec2342791a9d200c397b1c9d23a594321fd345f3d0e2e3a38b401ce69ef196715516824c0c8fcbfa582bea256c011b5964410108d8403abe50c0c78702fe500310a6a47fc35c843e6bfcc12c1a6aed94b89c66bb420d3f98fb6a82896462d5e883494e52adccfffc4b990f8614163172689e8e55eec19444ec3ed885adf0413d18eb2c7e8e3f4a092f6fe0e8d13816478f66006e8d3c18f48a681331623c98476489aa24ef3b184f5f104185519eba545737aa9c216ad8c15c17555d2de90e67921a7530e7c82d93d79699281724d4a08341086521091d25d5e9b414a1c61ccc17e22889217272307fc88c0f9311437e521ccc1734925de9ea892f1ea1061ccc714bbf8538fa37182ca78d6041c268dd990835dc60fc49d1bd4d5fda600e7de2d627726f4db9831a6c30eb998420d1e3b80929eaa0c61a0cbeba3fa6d62da40635d4601e49294eaab4d9a1621ad44883b1f76429070208136aa0c1b8337349ce7a96b864a0c6190c1ecae3a28e8c6ca54f2364a8610673cc1915569e4f3be9e4d0416a94c124ae35f1d2fba4c7240235c860caa2833421afefaf631c5be7801a6330877695ec23d223870eb2801a6230e809bd54d9d2d34cbee07124d8610218d4088339ab0495c382521f977950030c86c97ee926049d3474528d2f18f24aca26e9fcade1056359c493cf2273e4bc14d4e8c2c97e458ca9d2a613c4052f7dd291e5295fb585b2ffd3f7fdf288706350430b680b57a276c3b1d5811a5930957a5ab59cff8e1a58602fb85cb6640f439e766451b2c705589d478d2b18e5e254ee8578ab56ac6054fd1ccf6a74749d2018d4a882c954092dd74bb2d4e4e8d8912305ef8e00632b810edc10800b6a50c1d4a7929e9b5c612bf75330c92a5b0ba5c3da7518c7d6165bf41a17392080c38b2e3ca1a08614cc7f567a63740991471f05c309ab9355fa3e4df640c19cfc647df8749bf6f6138ca2acfabf4d77c8bc38c17821e5f0f939e2f2a80906f966a63d04cf08de32c1182992eef9e0b9a2bf0493a7fbb9c939243d4b95601cfd6b4fb997fe92926010936f134a662e5b9090ecc92172d647307ec9bea7d8d2080631a2bc845ab10826b1f3cf7236c96e44229854b7564e441c8251946c2dbfd0bb96178251c692de33ef1cd78360b620d2fede2711230404933ea51745429a8ff50f4c918376ccca5e93a00f4c2bf65b49a5247b52d603b389bcb9d3ff8a2e311e98e26fc476602af535d31c57d7560766d32367eed64152b272606aaf0eae37e2c01c62d609752a27d748ddc0a4ac267f6b570eba0d8c165e2ac9d2efbb423850a30626b32df3a0b4c53c443430efc67edb859c52dcd00ccc7931d499ac4706a64afb71467ed211942706266921ae99de0d037398adb8255ae761bec024a9e5b783297dc96308d470812948d2b7d36a2b0c177cd6bb440825c3c20a53364b13f339ec7d7a15a716152374af5585317eef826faba930fd575e11fb6059374585e14f2fdb74c8d9eb93a73067ed7ad1f9235bb4d314e691973dddca5218bd2d698c1257fb30496134a5dab37be57df171148638a745b4cadd5b0745617a91fc392eff6e9d180a73e8eca63c8c0e191782c220bacff737e255a8ef130695f53f776cbd897b9e307a873be9915a7266d709a3a9ebef3d6141746e9c304e741fcfa176fb9a6dc25c21a7dca1a7ed74669a305608a9ed1666b2edca84c194aaa8176b4c984492e894a2dee2ceba84e12f2e8ab08fdf222b4b982b5f56a7ee8e75b21206d321a976748a21a6849d9b99dae14998bceabc938fb624829230bc8e597e51927b2b120993765e15954ff3272d48a474b4567ab31ea1a5fe20f565a49d588e307ef871cfb16e418d8ea3478e2dce178d30968db2c8722544ce8b0a1a8c3079929fe4870bd5bfac6153d05884e154056dba534e6fd1a408f386673b11e6d0b93bba96d0aa2643844148eef472ff7ca7910d248d431865f55a72d43b131ed228d03044254a7d845b937f7cf0e871f20b1b361460011b557640a310e9f8bdd1f331224f831006a55bcdecfd4547f0706c7d7c98096e7c7cd018845f1a76e3a775d51e5df4483404615267d2fc258d6e773f10e694eaa7a5272ea93901c29cc422ccef7f68fcc1ece9fc2a674d145795861f4c798416a12da90f064f22a9c4d9bca816e48369dccf93ae5126a2321a7b30ed05b74ffd0992043c766800f5c8c1c51d68e8c11c3ee8dece6fe8d8710dd0318122071a79306a95ac4d1ebdb23c0d3c18d3f449defe3c8ead1b3a769435d0b88329dfa8ae8ae3aeb2e19681861dcc2394522162b39524290062a0510793941def2f0d1d344e7cc3e860ca11b6372731475d07051a733068f8f569bb942c894b0e067db9459f9ed8b9fcc732d08883419ec9c848c93eab6b28061a70309f7f349fd12ef377bfc19045b9ce8724ae72f0dd60acb6e8219b4e061a6d30571a1d4d7bacd26954361894279574a83ac340630d860f7f21dce764ea25a606c3ef7b7ceaf52b0de6cb6f531a6a65822ea1c1301f577d7c44f6d47f0663d5969b7b88944c84bdc78e2e7ae4486612e8c00d10d030834959f688a236d22ab6a38b1b5ef48de43aca9a46190ce222567afd21835994a9ec519475e9500f1e39fe0609dcbb20b596011a6330271bb7ca0996188ce71ee247471da540230ce69df3d02a419e34718a000976ec40c081c1e421e438ada2ad2f541b59d87015e4b84053e0e3c3be60eabbcea21d42c30b46115a7ee9d79f343d34ba60dace32a67d1ac1aba4051a5c3088659f0ef7a0c36db405c30497146ccfd22bd0d08249779fbc529beeb365c1f0214a1a0b064b1139faa1152dbf70a07105430caf8921848b7a48c8146858e15f13d5e39663038d2a98ab83485993af22a5ce5fa0410573aaa07d2ce5e7fc92730ac647ae4e792fcd020d2918457efaae94d593ec9846148c27d4a8dd984afffe40c1ecf1f2a2b333b71f7e82714fae5fab444e51b44e30c55c9967bbf49772da04b3779279a9ead2458909a6909126dcac57082a5c82a94beede45d3962cc594601c7fef55cb73128c75a96f29888c047388a5d4bacbc716ff1cc19073bc8b2e1e4d09518d60cef5b0d4696903d028029fda3efc28fdf01f238259276928552a8493dd100cb245b78588721d26b8001a42389f8af1fc0856d2523482b08a88794284fcd6f9f8d014bcfbe9030d209827a78a9eed3fc9288dc60fcc11b48e8aa7e38a901626d0f081d9ce2f6be6fbab8f2e09347a60122af7fb43ca567e120344a02347a9020d1e183d4465d297a59408be389e6e8860c7169c04a0b1034396243eaba78f0e4c93838c8564229d4a3107464f22e85121b5347060c8d9c5f2ed99bf63078f2eecd0b881d124a4f72a4b19020d1b987ef3d684c81dc374707b40a306062d12b2f6dca8a72cd70b3468600ee2bb5adcbb4e84926b0b3466604a95268bb865170b346460ba3c29476d51a92fe5eec58e0c681468c4c06cd1937b9e0b93914230307f768e8a0bc93ebff902836c8f2a8b5a9ef34796860b0c124328152da8b5bb76ff30a315a6cacb5c75f5a4f95956183ce743f477e7fae4ab309c98fa34de9df4fcaa3095904f132a6e9632fda5c220b447d979a58baf1b2a4ca53de7ae2e1fef0f398579c5cdc342f70759d514867df958dd2f77797f290c5b2149081a22a63f524a0ab3ad4748934a386314c6ba17edee1a06618628ccb699ad193967a7c86b284cb28448227ed27e323ea8a0307eb6cea153f67ecad1199f30c8e9a45310beb9fa7bc25c1f3ba9133ae51e25ffc08c4e18acc794e4944538cce084e9a37e2525d27feeb50993ea8710c2cbde473c8bf2608626127a7325f2054bdac7b13d72300e6664c270619d6285c8dc7d8663eb866f21021d397adc483abc47590b6660c29452defba0b7215b3d8e2d0b000d665cc26c71c2d584bd13fbdb0c4b18eff483c51f4fe9e62f05802a6654c2e8ad95d3880a9184f430258cf7a26e65a68edca88450a6226128100782e16010c4406cde4c01e31308001834288dc7a2f1809e27997d1400044a362e44302a162a281a16140a44236130140c85c3a1202010068541c1803018c98a998a6c001ebe7227d4ff4c893a1c064a21168346bd5a80a05e7fa38ca88c544a97dcbdeb3f410c15ad4c0f654f4481054f01525a7aafc6a1a6cc756ce2078c35b26381801428b4a1783f9700161e2a190df0430f5b96a907141cd86e6e49d0f4dc2b40c7bd8198b07905844605ee355a157a0a13506157bc09510879dbe28150eb0b13d6b15556d24bea44dc214d5c5c119c928761b35d0b211f453fb783c4a7868095ec02f22c443f29701609fd2566c2066822445123e254cd230e826c0b65aed9aa8ae3b4e9f3e4221442642ca0b6ad49ae92c5e1dc7cf84529751d0b5b36bd0ba903c0736cdad0e1747d3b86ddd59343269d9b64eefa6fb7e47d9635ed58b06b99c2c31973ec4de60866d9b8ea098769d6106fa543cfa28400e204a9944ccecc1cb41e2785b33b3e281edee7254bad143bf127ec98c8e37b7534485810fac3e2d10a030e1d1ee259f4c0ed454fff1515c15f2104a81d8082c9f74514aaadd1e1c4569f549942a71e21c164b395a092009a96763fa9d4d9b9b4b3946209c38faca2af0ffd709d622c8ab39944bc69720283e981d49b409305343449af35d4566398a1d57ddcabfb8d73b028ef67a2c166732f337821f39558173d877ab24704a1eefb07943c924799015ec6b1357db092fd68fdfc11685a4b2313915b24d63b2cc0a3e12025bc8607a79e7a825face0c33bde3f2bbe0ce8275a0c71c7bc058372f47edffbfb9caec227fa023514c84f9934fc3514af25960409f211c8eb8d43c671ddc616dabed06c3dc6d334e05f527d220ad5dc86d0d81f6c611a76d7b18f13c8570b138a6f120bd61a2fecd298238662124a8cbcf805794fc12d09c4d15f222b9f2ac69d44f112af67c0a6368c54ff3ddcc311c6dfb7a0b721c1b27acd6cc55657d755c9637d826ae2c26d8c2b9f710e6f3e0af2adfb4594077b53d11984c22b330461c57489c4fd280a180f85cc5ec9a608729ec7a67271b2aaf90ec612a9d5119df604f5efc9bd3da94922a8c58cb564747c7ccd10df70faaa424748158c2e07ef51993dae6b4fb963e7c6ee6bbf2facfcec6a4069d6e8db71aea211f43c40dafef579f357895e41d72b0184e1e51a83e3606a19002b13eab7ba2f9e0edc5df12d61f8d87fee5fdb0ebe5f640f6747453bbff5494fc684d6f68a4f5daabe277b404eb290780e221112259922f7ba497742341cc2cbf7fd92ecf37c5830a782bb763f07a46abaacd0d34301df36be03920921b9a82b84ed7d2998a6af50dbb3bcc461ba0001b3908d4458ddf8292f5ece8eb6086b33b5c9c4fbf35ef51e66347defc2eda3b73160c0d4131071e93a26ba3abd3d70f01f717011ef59a2ecc2cf1b79a4551ece6f31f8ef6cf5ddee94a656ce7279ab1b9781be0756fa3159b46bd4330a7c34122ac2e9ac77b1961d83be9f5e0c7844c1215c7781655e53008076727b29bf01971c8fc55bfbd398a450b0e50ddc2a791d042f2ad9550ea33e632def971e001d3922cada547a665286e7f332a15c3f8949deae5daa965693a69a32806af7397548eda04fd25be9b3f44efa34bd853e4d6fa14fd35b684f538e1d2a9b6c74033b9250f9bcc92e86fc0539852e49653369603fda385e8631e7b68dbb8fbc1bfa0b806d39be2d473b1b10a90b5d8256132ac5150a41c1853ad6a481ba2b819abfd0b8df4cf9f37e0605fb44a8b3324f4a31f85465c6fdb3fc78822f428c538a1a3f5078c9d01dc97ebd61c40fa62fb1eae7f221289cc140cfe87a8a269bf2fac8eb02175bf788735b8d74bacce2074a6961b5acc2cf3727a37d2779fddde632d08b608e4523ebde6efc8194f5ff272489abc9a03f49809cd64c1a8207c868fdf4863b8ae2bcdab59d07f0de58cbdfa772ed167329496864daa8a7d93782a803e11af70db5e2dfef20d1662b68d3a46b206023ea33c6721e43102fcfe974e7d8ae0ebad590a94b7d9b01a2e28b8dbc114698b897f0a5424546ceb14a3b67ccb20ef301a39a2656459db12f1e477c1c1610b37fc8d385a40f9d4c9f63d0f30137ae935469a8ed06ba9648bc7c0041be19c00df3858540fc779c9d76983898af01e8b3b256f4e870195e03cec88e8793d954bd6003a782ab8edfd419999d21762cda05e093ff3309af01cb9e7ce00c961bda9d5db55b1c4ebdf579bc1d932ffa3df1a1ea9b1ea467eab0134c157b82a99b73fa478a3932da10fd093d0bd1085883c71b4fc7a00b697cfcd475c38e36d2b90adb004ad09c4c0b2c3ecb3e78c2553bfec9c12023942ff556d9a6703de603e60063cfda70ce2d91aefc699a5cb0734133c33cae8c7ea6b4a6154e6e33bb2523e845b931f7680038b2c59ee74bcaf3d983e112255c4b071f383f317ad23c52eb555a150a3f57480cd37d8c9344a9af82d12aede763b72ce9563196d537710510d4c31e2dc3b81d1f22addb6908e33aa6e46483104728777e0e92f5fadf737acddad86aa56aba7de371ae0dd032c63a1344b82989142281a6274683a8605765f49f1a3291f881f8a8ec3f7c2d1e5a901f9ef410bc3ea15f12162872b0f5063375bba235e47c690188bca7723efb953f2972ca81d821b38c1c66c24f5a1f28ffe012a2e049314746971fe8c882cb6ecc3df93034dcc10e465468ace5250c8c0723f226f0af58ad03e9129e42cd10f4c3cc943d65c91983c0ecc732883662c92b54e52e9e316e12c5cd79a807102bd0d829c82c166b042044e73bb6e22842c0784abd1815933e9f5a09441e07d25ee9a7f72085e60181ae33dea35f7a0cd8a91329f12b86dea3300d8057b28cbadef556a968904d1f3cb4e9ad2212c73ccae654870a442e9ddc61c99f3efb3afa0c586a9176c586781a0b84161a2f4a45c34e095e2884d7c2b470b6308e102a44a0cb5a741e62a5d76c446a677f1404f5c861753d91fc613fc6e9007963a65ddf9ce2b871442d3c42ebd02f0954faf809c4df72eb0bce19705591e8da6c17f2cda563889b95a0b7d0672126ed0e0e18e269a8707cf87f25738afc92583c35658f082b91fa32fdd40b4acdf1dde608005f6e31b9cede6eb5c7171000603d3493bd9a0632f5068a922404facf76faac90ed6982d4b8e2ddab8805365616eef1f65890742ab8948506c434cd6f629ae37268f6b09e7ee3a28371fe50167313cc316497447fa4229e54d8ec7c7ac678bfdff7f8455600ec57f61a5aef0d049ce147b8725349f80d776878fc083a18be147ef46d45d8e8ae819bf9ed501cf0024b8b66489680f0df0284c4b0512550e9625959a5e415af762dde0d8ae9cdb4a94417c14202ebbb5ed65826bdcb6b4cf610e36a3a4fee1ef4bef0ca69b2546546a66ed47c6a2a0e1c42a21f2de434d5f3606ac2e5beeab92bc6be639096960e08f29f9cf3b27784087346a001ef01618a3fe14828d4a6c46adcfb3c2c73ee777a467a4b7aef867e713ef7d713717d2e85b60759364f97a2b1961d13009313bfd2621de3625016d9c0a916508d978d2689f902e7b6771c2da70236e70a4aee45a22f619c09ed63406639925b52d216a060e35150ed630ca240e1a063b7379b3e182ad8b684eea4466a9ba11d62583691458d91022a75d1de257f3e8b8deca30571cc18caf3f84d8c19009e9c17a2b532530154574a2b15a7f2589dd1da3d758f691d0ec045dd1a604fab4085d422f744f9b1740e9329d8981d2c19724ba17cbca91333c2ceb4a0657dc0b6278fd7fe318aef4dfaf05c62a31fc4c91209aa7e1bd5f53861e00d457f01dd94370860f7b4ced54f7dc2785d2f07b461f6f74bb63845d970485211d1321278cf106fa9fb12e1d4539f1dbf2153ef76ed8bcfe4676029716735c21be22c100c6424c022d40f4cd5812b4ee40afebfb6d067388723c09cba56ca16e3c20db67b92320e0b425aefef539cf24bcde020d866fc09da869770f0e59f68d20379986b6141bf53f1d0593e655250e89e4663786f83cbb68c77fe25033283f43532bf183ec2c8ea45f939fd3f20f8205c830203a90bca1d5aa61e6ad40db0e5781478faac4cd14ef9ab305209664fe211e05db04ec34e6114657a54779355405db2f7869f44628a802a60b2d4b70504458a3b271cba314628a866a394c2171988d314e74bc5c29a8247551b712e7986d98336653ad279fbb05f0950afe8cdfe789d15cec79a67c690247c3b686984ba445455044fa776fa4d58bf14ac12882c195f60b2f64e91d468d022cdda3895857fe00d756116190a4dbc90ab314482133c8ee0557690b610213bec0697dc09aff34d112f84dbec42d672f801319543df6227e67c9a2d88f01eef0bc36cb0bd7a610b088d0db05c0d4cdca415c35094276e287343312d57a65033201d4cda7c89c7864d7b10b43c4ec2cefc70b6420fd1fe77ae6d76650b57f8bcdce22818b0c65aab6aaa5a16d1a575729607b8f66ba87be04163a2f080f5651a1bb30a793437a17893d632ec51c7f9f0df18518298c85c15731d27f354b3e49266068b4365800a6f60df392f0f7a12eb0586f23be8d7052c59a1fd41095b69b3a2b9fac4b4518b8aa981555940ebd3f43a29f8004b8d71b2b2a9d63e0f8f8b79f5289c340c072859de132e47d8caad74b6e7c2dd5c9a49c57db5f3c7759f8b761b85d9033fd38e6cbbc7538890cfac798a631e9154302079c29a271cdf87f347a5078fe55801ea2aabd171312149ef7459f4ad27bd10c216e1d478678d25b6bfcf43a8b1f8eb9c5ccbce1b121ce5ea8536ce5f93af5e7cff83d3d2358292e3a847812efbfcd2995a3906c5c140ad70ff037422449c7d2a6b77011597e80458a3f24a68fa1a351c1cc9346b2a92a828142aa9211d9cde5ba6ead09014bb5cf2c0c652010671c36efabd10715061d92e2bc4f99e2229723f5b7cef0ab09a43fcc424e3ce955509ae2da20c8c865122953456a9668b15948447977b5abe75a98e379a0bd31b21aa14e7a07c30fa3072fba029a3e37de88f76363bf0609ac2368cf82b3d4e5f4c62a80fee81073befa72c6b57a06d138b9290f11ba37d2cb36ac47a95c007e5985db8c0f6cd8566ed85bfcd92dae01acb5f476c6d50603b0d6be0cca324fd6a18f0db873c6b9eae044822083d55ea42cc1388557d9c45ece35d008fc48fb28d8cdf27d3a328437afcb8dfa046c633e225b3a47b17898a7309f3ebd84fdf355ffcabdb49c22dbb474f2c1329d999487a1c00b581d771ad87703b42118eacf4e76180f231bf9b2c86bd019094a48d79edc9494e2bad7245109b7b7b59f9008f8d1aa0de33b59acc708472ec59bcceec9baf3c9248b8078f6287a939a297e87751099ff340d8c9ba26df39d3d7b01a531d89eb951ebf9d17af2c1d5e2e885d0244a680112048d2fdaa0da6b99c3b255fe40ab6c021c03864b02c0e7f25243057890f6b16b4120922f8b94c58535d2da119255c99eb23c12dd9b0c1e447da2b8c721dcb54e9b5dbff79a88c3f1ac6b4fa319f157d4c9d230e15b70efab049a76924723d81abd21dec20afa548d8b25578dc6a45db4b95c3403b1533e05ae1c9777eb55fc55d0fb3921f03bd9d15c18fb84950cb05cb2d0790f38861bb338282855c52453f78f3d77dfbc5334a944e93e8a3f46635fb083e2d7574f763f10501a6437fba2217245c47ec9631b447b0703f814f0c4c4c948cb1143b3cb0f843c2336ca0b738d815711ac9c907a8f05a0847a876f1629310370510ae31b29eca1fc4f68f6cc830653e4cf8beb0705cee3da157ddc5a63354b1c31599a943fce2bbc14db0d143460ddb01ff71c7a8af832be6ca2975adaed64281549e18da663aebadec940888aac4e2009d26fe06173a972716ae51647c0ae4094e429ba01d2cf5357c6f95bc292f7bd4f8a2d8ddefd25066ee7a1ce582bff5d0ccdb620e6e74c4bffa5f4521ee00313a08ec09012284d9d2adf4a7e26c3d0b2443e4cac98c63ed078fac70d67c9448e005343c4799ed9e0bc97d859cad16dff72a779839711546f1293da487d181ebbe6ad327498ddf04351be7c5b90219843883ebe6181cd78f590ef4c0f66ed9d0ee237d946643194097067330116ce6ed76f9c54f1ace30f3b66b37161a250d51581a8f0071411666710cce9e3d68136c2dcf7ab0ff177b1e9545273c48ed2f36d101e1ba7a09db9a1a1b2ad2f27332b9287003c7fd9aca197bac44748c127fd0420c7e71990dd2e3123b71c7067286c2695d2879d0a30748a873af90e4dcab6a83b90e04426fd448eef7d343264ecb853178cfa7c4d01cfe9002701caff8addabce47ee4bcb09d37e59c38594eae97ba5c55b44b17936a0f1bee7f625d620d0a6cfabdf2dd0e6a9cd62bad17ee0d40787474025ba132f537886fbae33c05d36f770a4f582f4379149fdadc76b2980afb2e01e5e8f3bb39e2ac4c2d11a5d06e94bfecbd27282013e23eb1ff0eb47f6442412a2e646d645b3bc0f342c7157a3c8d246bc5ad9bdbe34d0191db5a5f588b8d0a13b3fa67202b3958b567f4b5b65362d16353998193d076427b5e56e4e071aa9a9228623e1ec0ed2d395f58c6a57582a32d5aac9453723a48dc01220818ac17bbae3e936012b243c9dbb050520e0d7a5aa02b45dca5eb70b891e7fb2977edb97b13947bee14165255e58944f3e851a9979a99ceca84719db084c80a47d3f60c42aacc87282ee78de8d0bbfe7b88a5ec0c4f0fcadb6cab7b767e6e4a8f70af4f4a273e4252962da29496f1d2cee2a919046f22153eaaaea1d765d25c1f9525a78a11e2190f44630b44411027e11c566a6c4a0cacd4e45ec8e1d25fbbcda08476b90ad68d820056bd90b3573ce436f96c2041fb64adaf284938960c219fd549fb7472ba793eb22c5e5b84751b3d95e29727e046a1aed057ca261bb28cfb365fdb9e5869b6e4f2557c607516dd309b3fec718cb9a2e61fa48411acf3b08433d0f4bd015b10a085e03f04a127e18c774c6f4b13028508a080109d42e0380c13a1c81221d0bba40595bd836e155e3361b714386b1dc23ae8f248680f73e12648e5a495c3443a35d2263bab490e097160179ba408a93cad4878e61d8ed43642dd9c93f68d8048ea9ce03366e14b34994415972594a29d2fc036c24fa3149883a216f19c60dad940ac45f0068179856d91d7c37d58c00280a345ac01d9a1c530e1aab33431310ca7af84d96a57f6c45d27f2219f1477dabe046f95183a34e381fdb14730506b80c48b1b3c8b8cf719f7991f4fc87801fa690bcde01ccbcd5dda0db2cad234615be4a8c403d20511e7f574f06a90067107286af8b5d36f28c176f79d7af0a6551fcb0a281d1c5ba1c4080d86cf670d6df1e605370d6d3145dbaf2c87a07eab1413fe51e041139f887c51557266ab551fd59a256f8e4024116429c1e18d384a6613f53e72a2950c14b014df0e43fc7696684e0deb3302fb98f7a7123037124f8a874b084d1d5e156a4b15ab28f422bf8aa1a9592daa3cf6eceac7a78e3fc6bb1a35eb127acee608ff2591d17a7e1de90103692f7f0026c2869d54412fe296181f429c1768d9e83d77126493311fe5223853a7f10a3d80332fd886c12e02b05c22d8fd31bc343c5350b79e933562c3874df75c7826280edee110d9bac9fb90f9d6d22110dac3dd9cf55c087c3d468d2e84c0342098a79a8ff830b385f4deda0d5508c1400f7b1712c12d716f4d3b2f105a02220a502b581b0516e105237ac11126cef09b5673a32948407ceff73756d9269a12df29b82e623cf8b8c984559770ef92c7d08672ceaf580c3b6a8915680d2e18588f4baa3d2efe8cf293953c74770482c7b19b33df5a9c1921010ded94bd715c7273a82958e436f5d3a4656f3d867bd74b43ec15b3dabce1d90e91c3ea3c60de041f9fc98e6720af6d1b80b7ba8bc206d3c0f0f1a106ebcde046c9253111835fe06dc2f16d6fde93002c0197e73c3cbb2d00e6a71bb160264f879058115f8bb280014e8156db682cb355419c5bf5599fef3b204c3725e18c7da095bd77b878bc3021006ad58ef02bfa78825154b73e77ac2b60228d5b6e2064f3fa023233602d554e0844e386cb6c44de7c9d90f16e3c51a23e56c2937886ae920724cb3d7821017301d8f4c914643b53f40534435eeacb76689845a41721995e442b2df21872a398e5b97ba61dbdb69128226ace5020fc1097a96fc44d8758ef92384cfa1a1e290901deafc804c8baf96d97f54e30bbc3e3a2b1923e3d96463461c4cee7d0ecf090a4ea25480e3c2ee24f16c2e1cc1af5d9590ffb35ebd4f6f7f8624090291f69f81a334bcf719b087447bdab08eeb1e9796956c0af0248253035facb71982638e60bfdd9b24304a84b970611a7befabc8f3b103b244d401c9ae30b239103c41b0ed5a8c05c5ab66cb432dbaeda240b2a3b48263819e0059132b662e7416441a5822a1d941c4daecf3b08e3208e1744ccf35b6e0fca2c17170b22a28e39a3fef20095d92285c032a5a5baeb5f29ffd17e452957ab959a55bb29362ac0e63ae6bce63ccf79a1e37b2e321fff0dbfcd5c08fb70250c66a4c3717cede40fa888c819132904829e84b8b4ffefe30274378da8aca937a09a74976ffeebd0518f071d1b57554ebfd4c6369b494173fe116a6256068310262c80e0502e2ebfdf5e3e3b8ab3b72a42ea7ab86ce11ed5cb5ab09f6527d540245a1cdefc509fc6bce95feb87a17f785cbf203adf537d5347130449358c1dd0ef3f785b0552190fd6e20393ff053572d6d3bbadc2935b9a4182479b04b7c75d67563456c2331b951b3586306d0a92e5b31f95042968f23038b7579b919e72084b8d1f22aaacefa90cca0e7f826f5246f512154cb5d0a58b6a304e77e4837f44aa7d5d674c7bcb1807844ce0cb3c888e942c9feb72ecd4aab7ebf50b432bf2b935c05abd8b7abd607c99a452b6cce424beab4d05ef1e02c61f15d4f730c218664e111b2e449c461544f449c0241a7618683992b108d80dc82c84156ae75bce93460e90b1c6c4351069a1e31292038688c39c00ec02d4273226125150cd6e72d2051661177179f398c4021aec1089cf5cb7103f4d64a0a18d80fef9bea814dd1b5a68b5096fce55e76a9d33909ffb86f761893337fc0f78e1d90924391f88cd305b1e1b09224eed73df5a414030f11d5b6fceeaab72a080055d6b0672f3edb7a012179c750e899ba3d9f1460a4f0139280885e133bb3301012335b37380105524082247d88b8ff82fb34bf3dda0cc90cc6e67dc50043c66272bb0f295bbb55531bbd301bf8fd3757e85d965b2e67344376076bb38c0828d8abcdf3f4b3cefe57653355f76cc629c8570de65b7d998176374df5c76cec9e990fa2dbb75ea7f89d7b25b073cfb6467d96d07ede6f463d9991303987865671141b3615c5e5f935bd991f90573f3abeccc4cebdd98ca2e6d91cd2f338f6697d44fd9cd79f9495fcace1d9acfd447d9adf3c379f2a1ecd699ef94ee27bbebf4f124d1c9ce320289b90e50c0dfdf64b77c1ef08f67b25bde0cf8e7bc64b7acfbeb97bf033154b22b7de0698f6027d9bd1a3453db85c72c921d78a98b7e63a7bfc483f6bb4e444cdc1f280ca57703f48eec5a0e6df67f3823bbfe8d78ca5564f72f30c11f3185c86e769e5d7d6763c86e7755a4f8bbd90b63e8f9c4176cb1f4cd55760c0c1d8f0a041f58e2dc2da0200170d476f9aa73a063463531cceb7a95c1cc7509046e21285e0d3f7207559e5bc10e1b572f28b2e0d30b5cc2262780ce45469be3208e50dacb9f3d80dd3c05727a95b74eb35045e98eb69306ac7a88c29d75b3efe217730b961f360a73877c8557534f56c25dd5618abb857027f4386ba6ab737067b968d9f23e6d1a05b7b26881c139ac2d838bd5b12bb5a0ca5a242f8e310cf14cd69194858b6bbb3e6e7ddb8495852a2cfde327153bc21052850de3d5de4ab76ae1592d9b0b4f3791c434c9cbc735d2ceaca3b2bfd3fcb1af9428cb30d4f41a78052149b06255b68f11d9c82f0f71988a2845b56e10103560a29b2e6861a77c999c3f21c81d37771d4b244a9cbe6cab26e71d03c3158c3be2a9bc07a2289c15a8b30ccff1cfad9c91dda966af3b65114a95c3d160b102dd5d039fa6ac0adac0696239e15807d3815795e289591fb2993b2fbae6134d5ed2783ac3f898ce94327345aab123bedb068d747667912c532e38bb326f3ec300c4fec6496e9dcc562d4927d4829efa0203b083969734e30a9e7ea7893936a36d5908a4b07cf2311539f54d0fa69758493f57004b5ec96d98eb26657d945a8c44a1d6941ba506017054ffa6d5cd347c68a81250c57e90c5de569ff21ac73f8ebed491dd56de7b09538e5f82b95fe4aa1530ff39c51b7b12f7e93963af257e17bd1d5a8931f9e2583408b9912ee98561c8944849eaf4a36ebff4ece8f0c296151a0b0912e0b28a184c3d6ec421ceada6e7dcc1fee569aba411a67621fcd3f0e562b346b4072c44f318bc2fa7f5114939c661835127ad878a1807179f6b2781c1221561263d799e825da171f1ab7c6b09eae5ec4d664bf7d5a733ef7acc313899fadf4d4e80018b5a5302de7a1aef011124cf267602583b3533c4a84e1b69200b09efe6154c8cf6c00aa20ec3e3425c2b73ec5c8be5a7a82b265f195826a15f2ea7f25491e75cc5865382cb05681ded728fbe0db0d3508de8090e20dcf42c6329472413bcc34f19527e6838431a05aabcc40a17633a9b2267970a2aaf00c4d82f137354559538252d74f5942cccabbf42ebd9395ebb421f08f617c3ba8ae3c9630fa44abdbf1b7257ff66a1dd5cc8ef93f4f58749229f387d61ec83ef9f292c462a7843e80f6188af54c69a1626b9e38d66aca57225b30344142e4508fe20652f89a250d29abef6c52728485a2cded1e96710ac267665ef90fbeca7dd3e8c9597b789e34038d4c2103844f700aebd4fff1d6e5845c6dcbbdd84a5736f0ce2f24388d8ad03c89489f4aa5848a44e3e8ee7d502cf9ba2249ac1b8105ba956ca0be62522cc91983eb042ba4801a859bb17d227813055949d4b037f6fa96a870da0e360f9fb6e5a5994980019ae268b40397930edb870406811117b6b8ce35ba5bb61361a6a9220079e4b880a60595331340fe8301566a460f81904f231ce0a86e4581decda9a815e013b145b160d1c3d93ea1718589bbbd5d2a657df35c0b8e863d6b03190b7f93a277e9141390840be0f072aa5690de3e92ba55c3041ce7485dcc8fe47c2b5f946deed47380fe8060311bd456a4f1cdf7d2062c5e4bb19ad7f1b326665fe6dee892c5f76a8db8fd7540f390b2e2c32080772f6ac659503534ebe9e6feddef4c84a9367c5535754490ac41bbead31ffb6cbdb2cfb0cb786c08b504dfda9b0333fac951cfbeabcd2c1a4188ca7bf26f36586f529fa5d18bc0cf43620d0714f566692e3d70bc110de1570982e8b59a5c04e9bc0900cf686af0330b90ec1db55c93e68910cf4d4a512653a12b0eb8c169a9724a8fe9368785cf507b41c7b25dba35d8e4f8a8435f07fa64a91ca52bfb34e58e1756fea21fdb11634335d47a1200c30ef0e13390b90b797baf21e13456c88a7367ba3e0db9143d43770842c2b049f33c0ccbc1a4b727c279f259a22b8b5c6db8b327215db84a1506772088a0253b54ff9d265c0062b0d99510d00633fede1cf1c9ef92f0dc200a18e8b5266327a7564d050417dc08d42b70c7f2910f77d6ad672b600ff91803f533b2e2e97563f4bcb11e6e384da6765da425c3dcbe4f9e629ba767f5bccce9d4b5d7893e655f06941f1cb4e90e8f16b0963c2e5686d0821133b16627540325b398d0149e3b622fd7024f778c150aab533df1d65dcf13456121cb4c42bbab739eebf2f17b938cdfd541d59e4975120392f5df15447ad758c64984ad25b3421337a8a88b27d0a0d9a83fb552ceb7151c5e1d5fa258dca4dcc387413c08c8984a46d63ca7d9eac1c63d6f26ad47f34407cf3cebbc9c4e3883a5ccea3236608511de3da112b8838ec0881d19090229244999efd644aed2cd97f313ed102ca2daf074e65795ba79377b3015352a9d6ae7de0f92fc1d5f0ba993c45dd8c7e16add8f61094856ae5c1d96630825f44f285e0259b025e4bf0ca32e176b85ffe54fc94f0319f01b38c8b1578822f301fec67b22423edeef5a5827493e94b7d108b2209c27a9bada187d8ca74699a288afb20474c4b3f3080c30b6d9887a0988e59b112155f88d967307e512bb00a099458aea6f83e4f15af888db31de122a0569f68e849eebafe9d29ac440dc5d0f9a4c2e2333aad0bdd21f62f2a803582420dec0100abda0aad36649e33a5646e6518ce7d95dca975293526c27803fec6ea8bbbd886401b0d8fc6b7ba83082d908e4cf6d27ae405dc80b1d863f55a7fddfba48d016be7a2cf947b8ac842dbcb9950e6833500ac88042296034994041d217e1922f457536ef19e4274cbab05f378d0bc4a36fb34bad78dd150763b5dad2823cd8a000162524961d964f83e656c144562c28e2b28d9abf0e4510dbc62593ace27d0267732447568953019e8cacd0061fac494c71ce0359bba502975ad60d1be957ee9622c5e2f2486528fb993f8baa4aa43edfa6cac4afdcc16444ae862f8a99da179f7cc2ba60b54054953e00fc0bf594049496440fed02a316e1b0e0a5d7d8461fa1675420c389fe6d48c77044c72e5c0a30e2399fcb4e9c4c805cc66040677e5e22ec0df8757f141d7442ca07bdd8d5523b8621253a9b2bc04796c8b50f7844aa53e9a1604f39f03e8b989d3e2b536c0208d3658ddf76db120f08470805951a85ae267c1198d3b33d6b75389a7e9f72e41a425e87b7e9318dc01713ffd381b400c8e7a73685aa56f5fc344d6a5eb5f4a443994d0b4984571419daf0f2cec6030841c6a23df58bf07c048cd0c98f3e99dafeee9dc760ae812d09bc526467d5f0ffad7c364a919563db3309c16ab8d5677c31dce6bd87c69b3556d66bb297bd7da8223a0e74f2649ffb00d8fc71e1183ee8c36d9fdf84534440062b37e14170844542c58a59f88c8da9821056cd4400d2201d14904a460fae0950ef8bcac8fd8a30b2905a1c78aa73b4d67e528a6c831b0adaab3c93d1e09701a661016baac54670e7f67432655950d0baef2d1f908205ad461195c0d975fc91ae53efd5f599f3c9d54445a64c6a71e4edc4eccbeb895b83d11d9597c00661be914453ce9b8c10fc8c1ba5806d1cc63e690099a4deffb20393564fc8e26b3fc959d8c1e6e7bd548a4c62e354eaf46892e0c212c2c2ee35063757264c871cbeb4376cbb64be25444d906c7312d413a2e401614d309687697222b7d9049b0bd33148f7ed370dc8ccbe02dd48fc7cd1f9fa79afcfb257637c318fbb91663180e5e1cece4a098c8013cc85bf2e08262bcd54175f88b03c16bcd0c3011b93eb67b1ec72568bae23da446e593431a64826aba043d62b55e550f29402e247a8df8afd4c8d236877df8a84aa9886ef90d88e6129a5ccdbdd76ba385220f28203cce0c9c7eda4125d5a9f82501abf4d46ca94e5452fbdf1392bad81d5fad1fbfbf225ed45c264082ab151b20c4c5bb788725f56b15cc92cc9142a87481ed337b944789242a4c9b158434c088fbac1edf50aa867aa2002cbc296cce78142d66d64bcaa4c26c3b138c626fa8d309e91d55996152af61c803fff6eb75cc55cdb52903d7e83b180f64534c21694c00c1e23042fdac24c682ff0099a742d1747bf816cc49581de395714c11fc97a2cf38938c76723fcf49a34224a66ab986def170b230e2c09201054316bc2e560681d935ac544e30dff9b226a8b0db088c814aa3c22efa44410803d1f67df897a7b188095a0c6bb4106f8bc5d8142b412dcd2cbd2c440a7495a69f8395262f4c68e44ddb3384e6beb5bc6da6d47c303e589777f0f3750ac35e75a60e2a940e2a1772dad861049c01e3e95683fbd3a163fdbb05c5507f86b8ee8bf237dad1d928f19542d29fba2715bf1f5ee649ca7dc576e643591814f4d185258859a08d2d6a8e8b22f28ffa39afbee01c1c8e0861b52c9baa8c82b9472f54b41fc9ed6f05eb7bd00d84d74c3577310aed229edb650eeaf4d0b0bf516aa4d752af9a5a5f4d2d8a1a28e3daf31ae7b5a635d0d4ef2ba65a3c4ca9f29508316c07b98763462ccbb125781f3c089fe487b6eaa84c1bd63c579ca022acc15d1fd7f2a67323dd93dbf08e7e6f6e4f1c7dabfcf4234fed9b42180a7298afdfd4680a6351afa407f12b1cd225c524547ee68a31c52b73f0f61837c50570d8a8f00771031f9a485de9055d2520e8f56d798abf44de8eb8b45a7c660ce30c3e0eaf5ba1593608965161717e9b68ace84e9686e8c7ea603a8767a67376a76088b44a5bd0519a4565c66ce4306a08faa7a6617812329b42e9676a942cf20708acec86b8668ee20bf4c6a09981d744e9d7f86a667b469eecb88f7d721605d1fc0dd1e02c6364c552a566749e70d8820f422cc44c0591a82add2e06fe69964ee631669c479b313c6ec6f3a819cba3d1611f20dcfcd7d13db10b1141f303bb685d94482f38de9e579e5312dbe17ffdf5dbe25bcc525ce8ce312ef1f9f15754a500d63e13680a903925dd3037e7568cd0706b08fd5994575ef9f5ab4489d6269d771c7b849fe042bc7a9e734bec3e78503eb91d5e642a9e6925add03415233f51817e55f4b5e0d101b3df8c0ccec1b3d3529cce52e1c81af3d266b6bb7d289e63f5a6bd316f775c6b1d47a7266c68504b34fce862c55ea66000e50f612c9881f372b6ce82cae02ad2f6a66fb3e0205bd1a6082a1237100ff2c88e2e8675ae98a1f362b66e46ef1fa77fd9dc9137f38f05fa70aa477c70eecf3bfe66be536fc1dded8eb997f7f95b7c97de09376ace8ccd62017478086eb3760ce24462894b0e2153682985b5f25ce2eefa1fc6de4842ac40028e1784740a3a60ee24850300c3300cc3300cc3300cc3304215c2bcbc9fb4919415f27b81941aa16fec9b64a5ac484a86e799995ed1a2456d04efe08def585702930a310a620a3fe8d0c3238fff6ac9ac6eb1ce3c3ce8d821598fcc8a9b3c820e3c3c48e675b182a6f4934a083aeef03072548cdc526f8f7f871d1ebc4fee887bed1d9a89410603c610830c065c1d1e4c54f50ff67131573c0130860e3a3cccb018e67e432c871bc9d031870715ef2ca4d6486ddf7388b1812f74c8e1a188bc59de8958a1230e8f538e73dbc9f46df30b8707d9fc4357df5f868e373cce1ed93ebde2c4dbc5d0e1860739314ad654a591901b43471b1e7588c9c8b8561200430c312c501d6c7828e5a997e25fe89d1c47569e2a45c71a1ecbff559cf710520183bf68141c27235fd1a186c7ab73613fe5bdeb2a716441a0ac230d8f6ccd25e5944861dee2c852144c800b2eb8e0a20c08d8b861230c31be20c3737c41c60d1b373060e3868d1cef12a84018627c11860648d1818687a93a7bd0af8ad49f9f81081363868771239e36c7e7c79d65781cea7924427f54d508191ed79b5af6f18992f58fe1718cbf715d2c5d22753110f1292ca54f17324d617890b59579cd2a44bd0e181e8e84dcf169ec2f74a77e1ed3ec8507fa1fddaba39a8985bbb0d768c8229e11512b4119db453ea2830b0fcf47f384b877f12b5b78106de5b311a5161e9fbb25c90e294e0a3b175c601c3ab2f038a365c5254f3e3e161e456529fffbed7cb9ebb8c283ebd06f3ddd4b5b96047458e18197c6fe5499eb29540ee8a8c283e49363aa525decfc53e1f1bba510fa9b9ec2e35e0f9fe5c647235e293cde0db142da48b66057141e46d8105c52e8f28a5307141ee43cf92f2b4974c99b273c8e312293a5e69379d2098fce2da599ca0fbf8d7534e17148e76dc59852e8983a9860ea7665c4ba4ad66dc7124e7e96727604bf8f122a7b8b5975b1fd5a7561e3464712fa5d8df1b2103d1216f9f81159a5eac2c60d00dca0e3088f3b27fc5bccd77fd5a9247418e1d18f946876e8cb17241d45782ca94763b2905162f40a1d44781023565fc55b4977a563088f24f7377a88b618c4c2057708e1c15f75c7e74ee1f28438b2aa051d417850399975d88f28d0018487fdfa673fed6261c21f3cde09dd297af826d0e18307252de671a43ab63512e8e8c1a3ca19777737f642bf83070f3d2d5dd27995760bc191e55f9091c30b62dbb103b7d7fa2e667571647159870e1ea876085912e5adda2b52e8c8c1c3fe3297f911957c1b133a70f028742fe844ceb19385050c1d3778d831359727b16c6bc12e74d8e0d17952cb5eb9769bfb116c183b812d74d4e061ee9bda2c99b4eab283064585cb888fc9193c08999092c1638f386fb7e7f5665d0c1eacfbade6f94b88ca74c0e071fcf93029dc5532df5ef1b0455f43f77ee8a8c5158fe257cb6a87c90061462b1efa578ce1ef35e59fbe8319ac78705e65952e138841c69bc2aac08c553c0ed1b416ca72ce783b43156f7f087aa1928a87662d21ce3e3de7f6ad2061062a1ecf75ecfb687a3923c4051739caf8028c728a87a67935a74675cfb84cf1c0c3afe4942e6639e4cbf8a257e0a578dcb369e982c5ae28cd7be185a90dcc208512c363f5878f3346f13047e87f4de51b57641c595839caf84202898119a278d017ec443c4e7f481f4756190446b00b2895a38c2fc0b819a17810f7222126f63c856906281ec5a814747a369f7894d2eb623ab1bcf992e78b1b4498e189ba639bd8c72ccdfd7622d9b8963e94f44dcc982e6cdcc055cce0441a62c60d75135fbc797fcb932b21ac09d27a8a9c93945733c9c4217fbbef77289fbdb40b1b376c6417366ea029666042dd8939dcfb42ec5ca2f7def9aab47461e3c6716286251efd85bf2d8baba32ea9c4a3ed334d6aa5f9719202b428f13844d215f3ca21fbc71190a1001c39bee080f9c08c493c9c10cb39e92366cd1c10cc90c4c38f9c7b4f35d2d57722f1a8c2da84af0af519d2907818ff5e3a57cf331ef120b6f4a41c6477b336331cf168bb2c8fc86f64cfde8c463ccc99753396b9fcc59ac188c7792ac53f776d9d75110f53b62dc46c4b31353a43118ff6afc4dafe2e763c23110fc37cc893215c66b1f455620622b649113bd2dc357988376c3b7e9428d16288ae2de8a706bbb071c35c624621169bdf4fdba71bd213c2cecffc5dd9320d7d1006ff8898835ed2d65c1058468fe1f9c9724e20d064d65a3157ec00a21423c36a5eda93ff60f2c88ba96b8be9c27e6822d785bd7d504c7b64c667c307264befc44e4556f65078e631750d5b153d147396ecd9701e08b5b1a623f87f59f040659f8494cd9c90ebc2c60d2289197778545d39427acfe2c812a3ec0033ecf0386544cc5135b4ad5933eaf0f8f7dbb38cf53c9841878756493e868e891d312606059630630edbe94f5ad098871266c8e1a154874e29a6d34faea861461c929be4111787c32a3f53dda53af37943b925c67c54fbf6b8c1081fcd7b2fa5dcd76d20eba4bcf8b0a133cd1bcdac25de3538f1a9be3d713aa4ab86b24b6494f6681a8ed8aaf2fa94314b45c39f29ebc77a99889ee1f1dc93e19366e46c9aa1dad1a0f12d31e85bca50ee0ae99c2b7b0e153214d52a69bef91c231cc3521997b24c252b550c64109bfd5e49f7e085a1ed3c6e31d8a575606037afcb7c2a46c817ea8d0c9297bc62e685e2220433baf04cee34712293ffe4022b955267fda49513d2858d1bd688195b789c27639428b6c1673734c30c2d24a173e6bf593a643f0b97264b4b79d368261f0b6a7ec85765ca6cc7af807b97cbb9c690dd0a5e92dca6f3d3c143af427d5ee3361ff3867ba8b0a5b4b17d3b5350245a0ed1fb96c2371ff95d628c3747418999a93541c29cbb50f02cacc6dca8cd84fb84adf37f50ab5c95b675c27177e6729cdcc9724c13cea59bda3f355ac304f5d267713353dfd52cc13d4b271696c12b659480df650e13a349787fbea348e8d4337d18ed949bcf23187a625ad6e5ecd20855fc60962cd3ab7a8a80ed4a44c44cb3a126823e159dc56abfe32d43a8435aec7aa5d4280ac16f919390b2ffc44d10d67031cba43c9625048279717272e97e50ca5069c38416d907d759540acb197298480fc877d19c32ac539e076eccc8914290307d07c7afdd9027abdda6037a63aeafc2e7883939c8df3465e9e5690ee3a0d2ec94def6ee14ac1b78692feb1d1b9c935845af8de6af21ebc2c68d1a3cca92e041925b4cc81e2266d0e0a165abacf9236ef41443881933786cd3514276ab44c95f060fd7a6d356da0d0662460c1e5af7fbad598e52d3f3f83003068faedc43bb3d5486de4ce06a0f58bce2816c66ae8ae9b3738aef0e58b8e2719a889fa79249738667072c5af150735bce88e94c3d8373c082150fc4a3b8cf46a69eecafe2f1658b10a385575cf3081cb050c583d2741feb82fb062c52f1a0baf635667b6cb0970d58a0e2b145dc98f1a143a88eaa018b533cdc6951b7378f98961b637cd185093c0704340d5898e261c7cfa4e98efb182ce862095894e261cfc51862a327f91e1b376c7421011ba478904ddfc36bc76b148f64a3e54a296914c5c3b829bac66bb8b471b33160118a075d319e7b4a8dee75de00c5a3c908d375d1935ecc9618b0f8c4a3905a9a2b7647fbcec28085271ea5dbc82929513060d189c759a45e439ea89ce694130fbdb3790c531b39215ad5052c36f128e999dde8775cd76419b0d0c4839e9ce64c37757c88dbb861c3461712b0619589079963f84cd5ea7dd1928505261e66f7dfa44126ea44d5049ee3120f5e356e9e987aa9f252a68085251e44b4496b9d74bd6a458118262050c0a212f6fd8594901aeca644132b7346d32cd7153f0162e4c02205d0f0c343d98c713c84ae2f3d716491aa0168f4e191897d45fbc4866b9e0f565bfc1839de84ed3640630f8f3f55fcd54d71649503d0d0c3e3fc0d9a93fd85a4f3f3507e4c89f7a08187479a3ce52634fa3bd23b3c1219d16b4d115659000d3b3c48df949d3a7ada6a5c87872e925acd5724346598c0735c793a80061d1e06ad9014343b07066f17550e066f0e441a7378a43b927664afe3f87278f8fbe9ddb642e4cbe3f02088f4a756cd8e331c1ee5f4e17eec634e297ec3c3bd091f155285fcad1b1e59fe965acb8b9f9b363c38b9bad594142f25d9f0207f84bbdb8e395259c3a33c31dc2edefc7e6a7828fa396368f86978d0baf9f1248f8647e7693f6ae28f78cef068e492c7dce6fae99ae181e5464b6b113f53a60c8f3a53a8f4471ebd90e18188bfbca6f339918ce18165efaa968de19589e1c186fc193b1e27d5158687f9deb2212607c3c34ad539d3eae70b8fb3e728b94e9ad1f2e38507fdeaf1ebd635687cbaf0a0fa323f49f01d1f0f171e4d8c7bb62969c50c9e2d3cfe18529859f116fd8e161e56873c99da67e181c690739b85d9301a2c3cca2f7e531eeac22e5778f09d3b56ce826e8c5678fcd12edf7d8cd179151edb6ebca8a13dc60e156acf197332957a0a0fef2b2afb67293c08294f91fef3dc3f47e161c4e74fe529756767289091222fdae64f787c6297da63d4a9c74e78b8e9976db29fd6266ec283ae5c73f7b92e2acf8487ad6f91f37af4fd2ce1e1ce679fac92376f253c72999c2fbe9e2d9f243cec9bdf4e39f7afa68b844732d6f1e5b7eaeb1fe1d15c0831c6758cf030588e8f266b111e5f5eda4a1aad9a62223cb4181ec283b4dbae697762e78811c2638d9acb10663c356582f020fc424e5d0f101e7b96a42e32f7d13a3f785c97d163561f3ce89433742ced554f0f1efe8755affc10a990070f53455e8bde9052b61d3c4a9962c8cbe4996e1d3cea18fb0d1d2add5a9a8347a6da95248613078f73375f55556ef030ab26bb1ca653ca5ddae061c40dea9ff215f6a9c1e3ce61af7b2b57fba6c183ddcb34497d3e84aacce061ba328b11641a32786cc1b3a79a2faff0d288c123499d74e7b593e9d280c1e3aa7d8fd6561915f38ac79dc7f5dec5ac6e75c5e318ce275c8cd88a07e9d16656bdb2060f59f138489ec85ab15ab1c3553cfc1cf59c337b324f50150fb4c2794fbf988a07a335b9d23379828f8a0771a534678424993ea7781c3ecebae7892ee936c5231ff5898f5f134b97e2c1f4591299cfbd9225c5c33013633d6b46f130ae7f94ac9c95f3a238bd76ca259123a17894bc632a624240f1a09268a7d2f3aeccf9c4e391f1892e292f1d4f3cd60b9b663d072f773bf120064b3d1fab764c4e3cd2746b13227cc895d9c4437135a938c91fc29a78a479ade13da2474d33f1e0f3561e4ba121ddc4c4033b8d9ce2915de2519630af728f251e6bccf3fc714a3ed395786c1183bcbaec589a29f1307d8adfe176a2f5ad493cf0891b11aa5aa1b192c4c3cd1936eb128987993b9e3e6f45db85c483948f88d2ee231edacccc64b214b61b473cd27fb770b535e2419cc9521a221c59632c192a60c4a320b3ae1adfdbe62f05c862118fa3a5deb45f17453cb091bcb55990c33a0c1434e03a0c14fc11208b443cf29c226f9649658613110f2b5b48c5ac31a25339c4e359cd58bb4aa9c863168678541763f32926b2bb9745211e6a6ce9945b16d95917162c19642c9a200b421417278b41e05395dc439ace95c59145822c04b149e8ff330f37f517609471830b2e8e7f3186189d02c700175ca4c0c9483b641188e2228c2c00f170466a2b5a30b1cc0b4756292255c8e20f0f2fee237d2264e107d7bf3c04b95b8f6f70c1c5152eb810838c2f5210c683a8c8c8314600ae90451f68b7b5245af6eff3e1ac6de926e48eeeefc1bb946ce6743ef27b3d7439d7c4f11c542ff679304657cc5c6e5cb31e0fdbfe67895927ff7fbf0316f247eb1ca2773bfc16c62d4de27520b28f77f4cd11a60396738cb7da392b278b391cb243eecd3de3c9420eb4c44d1bf43e77e260de8544cf1d5672e0f0707ddf44434964849c2cde704fdefa6629d7dd709ce5e0773eb9e236a82fdb99626c77d9f04fbe188f9d1395ae2191ad49c9f4c14335e8d2a94218b9300d9bfb4638c91ecb3f3418c5f725c5f49d3b831dac2443244f489b819d30715a970149ed10b12603ed79f6791e83c17f72dcffb41a1683393cc7491a7437881c062bd467d19ed280e1cb0931ed9025f9c29664d22ff6c2afa721b36d2de22e6c5e16f31683e6b9706c8b36eab1d1ccb385a7bb6564a526a2d40231d9547c8daf4b168efc9f4b97381670f5749247422e0f5ee18ba031544abba93f2b98a5691e92c507bf0a5e956a324fcdd0664105cc37763cf369dc4c218b97979c31eb113752407724a9955d691e852dc5cf2c92dc365940a11027b2fb39c24fc8f38659c6b1bcab13980ff12e53d38463645bb2654f1a261073954fcb651acd128e5f6f51b93dfa4ae0735f489d847248edbfaab8f9374830a4adb238022d5fb6dad14423d031a5ca5a3a3144488b60a5cbd9397c309d08c4c921b6fc4d9c87c0de85a01f6724bc2b04643d7a2e8f25c10c029b2fe74c13202ca1296bd6385fa9fc81127aa2922f69ef0373df87b09bb3f33d3854c8265ae101d1eb5177c9620767ee09297da84f962c7460e7983d4cce295c88258b1ce8f3b152fa14e255b2c081b26add19952c6e80546ca02789bef01324bdaf019bae63d2febf21a601569925e4bb929c99192873163366bce8a5c8409b68562b662b6216317814268b743efbf908412fc64081172510430c30f202366ed890808d2e24604302260559c0e07184ddd48f69e7e9ef031daff032fb2a64637b5cb1c614ab424ab373ad78e2a4d0d375151d3c56201ab919f74a27b78ab6d62b63e4adea5451c7accd7a1a5d26ba5498e144a5720ce1e74350514448aafc3b9725a7c05ee42224a6c414a79aeaf54a41cc0cc99db5430829f21d114913320a2b45dd91601715c591455d4cf2506853c1ef75a7a2078a7e628add88465ffa89f24cd6e85091c9e3892468b8e53a511649363927f90827be3c3a312b17996d82787f977591dcd74441b46d627d0e7726bcecd7112dac524cac194252d81999dcea129c64c5649725dc2475d6a9accccf4abc394ebcfe53a488727450a24b99acfa39777a80961f31c23806744ce2d14bd478d29872afa1ea90c4c30a59da268287e43f7544e2a159c82178c5ab6a4b8b094407241e9684eeb21bb9e3110f5272aa7811950e473cf6f2d08e1352deb50b8eac33137434e2c1ef5dca84dc8c641b471661c483d4741e951f438c1c5e789599083a16f1e8fdafd357864c481a2c7428e2b16a77d84a711b516c6c4347221ece797ecc2ff97245357420e2819476748fa71f73d9211ee68c89a59fa555300df1589256f4eb8414e3856ce828c4c397bc92e284b1ae9609f120a3a5e8ec2893337b4b39740ce2c1bac551af0f71d2c65c1a3a04f1288987470cd265201ebbe778dfc1825c0889aca103108f75a3e5b35c0939a60c0d1d7f78e061e5b13f713f3caeb4497a377e6bc4d7faf02863baccdcc986c856f2e171e646c9cf9a2f584cb5d0b187c2c5ce31ec4ecce1d535d6f020bd4f0c492978867925a8a18607d9b3dea5c91e928687e5992bc538c1a25eb0808c1ca42c60e3469132b66a0435d0f038a4627ff2f839c383943cfbb2ce33123f6678a4318b56f60897e1c1a6e0ba9aced57337323c328bf6b1e2848f21158eac1378fb060851630c0f45826a1eebdcc92917c3630b221bebde0a438c2f72f4175c704155230c8f32f5b484a878eddfc191e5fe5e9c30d60bd245053450812e24c0821d03f750030c8f7f7bd5c274c595387194b1640da8f18587ba219468eeb9d85e768c0c58a186171ec6fc2f6f8d39a4f5338c1d230335baf0b0724c162e458e993bb864b816036a70e1a10749f9291b3bfba2c6161e861852d346aa753a8b23b58616c888cb9a66c41a597854d942f3e64e1250030b757d6dc4fd8c308b71b4c6151e8e8d55c7adb22973bd600118638cb1556094a108a86185071542929dc62b4d31af82fef792f2788f6454781c2dfb47fbdc994295a3c8fe2585471a25bc2f557cea7c47618b8b6de1e53739283cb294a36dfacbbc93e6277c21e50d333ae141e9ab77a5d9b0cc2c8eac7230d80c359a600a41df7eae35baafc184c71f21dfe793c81cef97f0583d86b460d351c283add07821d72d2aa693f0e82c245795be487878a613f673245d65f7088f6235eae7dc18233cea90fe5a9ae53e8564111e55e414ecea6aa2934478143cc4dd0afee13a5286f0c8def732e50ad9367642789c37a4f8dc0c8998214178d0f71a3675e3e3250d080f239dc690d773dd42e8070f6328dd0d29c929d9c6070f5c42a5d73c5e0f0e9d1c0f1e5eca1693d2a6a72ca11d3cd8b393f01be3a45f5a078fd7bef56cfccec1a396f388f1edf0e0591c3c4cafc982c44c77d13537781c65394395b8c8a4c6060f364e52640db5068fb3d36c5b8c21d53a4983c76229672dcf6db579a9318347eba923f3f62334a5d490c103898bce3c61cdc72b3562f0283654ef46354bdeb0060c1e9c4dff27f36c1779f28a47a9de7e17dc3e4d4e5cf150a3cfad4d58c6a7d68a4723714290e41a473563c543b352094164d2ba59abf846bac6b64254f128a5aa31bf743259552a1e67cfbfa4de7183c6a878f46672efd5122f644ff1d0734376c68eb0a085291ea5a97d90494bb039ae148f53d984d7e81469354f8a079e22a66b4c9656223e8ac7bab935e52cbdac9a8be2c14df6ea58bfb2a93ba1785061f773d81cb34957503cb8a87aa65bea271ee4d28c9b11db1183ea89873da9227db2bc896776e271dc48fbefb9f3641a39f160d24ad2ce0a6ee2814b6d9c1c93929d68e261e8ba09a2c1d6dcba4c3caae914e2591da26d4c3c4c933dba5fbd9aad5de271aaf1fd8cd029e55ae2a168f29660f613430855418b4a38a17464524a3c0e3937a77c5b6af9f649e8977636ac54522f035a48e241cabdc9ed3da77496d1326811898763969b337e782af340e251f09814721cf3110fcd4fc274aaeaa9f51cc14c76bfd9f8b1463cac8eb639d667c4a3a81f53d21833e9a68b7890d33d5b2c715d0b29453c96a0ba796d3d57a813f160d6ef2ba3afca5639caf86205ee4592410b443ccadc9761527ea51c1fe2616a8bac61f37cbf6788c7fa13ac2b75f7aa95857860ffe529e4f4b447b420c4c309f12d7c4a3183789016dbf27c6a1dad50108fdfff7c226c9c285719617cb139c21023108f63264da25da2597103e261b88f25bf3a21edf61f1e5bf458a14adfd6d6f6c3032f2937edebacb16d1f1e5b8707b78a2b1f1e4aebc667db46e97f0f0f464f3ed8dd590a991e1e7baeb798a32964a5ccc38309d54e951483794cc1c3a3a42312fb8216777838391f25e7cfdbe1c19ef94fa7754c15bf0e0f365ebc4899633ec49c0e8f247d1ec916a1b2273d87473a15aaafe36c889fe5f0e062a2d6c3e2367d1b878762f37392b6b1276de0405ad088217656dff03853ce951eed342126ddf0a8729e997fb9df0d651b1e6e8e17d9b345f05441363c8812e2f6aec429d16f0d8ffa442fb2cbc9cc7c6a78a8729d346987a4e1d1cf45cc4bb1d2c224687834e9f2662b3b99cfb1333cd68b8e9e7333333cb0704972bef766b60c0fcf72d8df9e3091e922230739c02260e3868dea8216643883c41847836ec6075a8ce1ec31e6f38755b2ec8be1c14c447f75abc79cfb309cccc6cd652a471e0c7d6cea9d59fbb1d1bf60f85eb4fbfa14722f3c8c542a65299125634e0e2dba60b28eb13cb9b06cde33c94acd1654ab0c3dff30a1a385a3b996c5578bbd942c2813a3e4fd0e318505bbdf3a487d053e4e1491143373ace0aeff269f97baabd0a4b8853c16b2612a342166696b908d780a67ab884d1652d35230c5e76dad3c694adc281496aee4266a730b855e62accfd89c7ef384ee4ee762639c8058d2a86162f04d4f134a7db91065c2ed49b2c67e092549b2d9cb2f85799540659094fb344afe259350d87427fe91f30609e7bcfbfed9536639026916c57e3c68088d6054aa4b1bd3a55c11d69c1ff2ba9162227496fc2c9c4f30878004ebea1021bcad7551daa24b160432255be54a8f1e534048deab3f4b8c3c92da183b810c941a634de08583c12810e3509121468e353dd0e2078f7c23b73aeab775922c202387b2808c2eb4f0c1e38b92e37d3e867b09bcf026438c2746ac045af4e0519254613e850b7d1e32728c41e5393687186414d482078f76227ec24a2d5bba706469392fab163b7814529e548d2595e344cb60417b01c61826f862085ae8e081879e8be53c070fece2eb5e30a9baf771f0d82e33789cfb377874ae96fe72d84f7d6f83c77b514da3262d87ef35786c12ca273b731a3c8eb89d381943bb3267060fa2443b05bbc99b5296c1a3d3a98c5bc9dea39b183cccf9369bfbff4675d502060fbabb2edd85941aa2f28a0759ee6316a3a4da1c573c0a3ee9cd52a615bce8c6ccee1269b0e261cc4962d0ecc92a1ea76da58a993f1793a58a0769eedbb388da5d94804023150fbcd2c273a89074410315042fc918424812d31c2232b9c63576db8c67ba40e3140f323c9db7c4541a833d041aa6783c61d5723445234b29041aa578a051faff7e32a61be2c8f2010d523c347fbf4af9525f4a0e5681c6281e8678a468971337668b498186281ee6106df2f5b7c5df0dc5e3bcaa31d4e755c7f443409d4003140fd3939574d0a02329cd051748a0f189471129e77d0841dc53ec868d1bca021a9e78903745daf2ce77e2c167f5968a9d2d23dd9c7828af9a3cb359460a7f130fdf439eab48cbd8af261eed844dcb336e261e576a184df127c3a60d261ebea7e9bcfff3613f778987af69dd2a916289c795ca3288640a4975aac4634d9edf2a588a167ba4c483ef9bd42974b0a8de26f1f05ddb225a4845d610493cd4cb38fbf29525b55264a01189876295ba43309110a5a20189c71ffa43b3e86c8efc88c623cef24f494d9a3bc54fa0e1885ec2698eabed9353028d4694b913236abc7f4f1824093418714aa75229d34716b017de616c0ace52191a8b78ecf5a19fe5f22ea0a18847b569255c6fd5be480c8d443c4a31dd84709fdceb530b6820e2f1c5774e8d1b755483340ef128794be89c99c691758386211ee5d4999a8046211eba7e7c47b85c021a8478f096534273a4b5a3b36280516a023406f1a85bbc7370f368e9bf32561f7086011a827898d64effec32543275e4755b12100f67d737ed348b8c677024293f6250e094c61f1ee50819444543de18172f02b5822f4ce005a3a08c540a7cc08b0108e00a8f6a42afda586d5c20002b3cc8cc93719e591e97992a3ccc9f7be352b8f0759f1300151eed4eca9039178e2c3e5e94b1546528e0050298c2a3f05952c9df367db92b1080141ed9c48c143df37b351a850741bea24cfb8223cb049e2a1000141eda448b1663b7a698aa1408e0098f242fcc73b5044fa97940032260e3868d07942100273c8cab9fb12db6da84dd46170ef02fc8e8c2040268c2a3cea89d2b6bccbff630e191cc7828cfceafcf97f030efb63be73fd7e4b0121e4baf7c06b50a493127e151c514c6bcd38b94ca487874e1fe42a47ff0caf2088fef2547ffe46329a534c2a38fa88aec5829c28354f5cc09fe1f7c73447850e5b943f768c8b4d5101eec55ec9c58b80889d4180108e1e14bba507e6666fe2519625cb1808c1c613ccc58004178b492df727a47889b231c1000101e966ce49c617fb743ce0f1ea6906b26d43a3e787cd371224c925fba740f1e6dd87f9faff8394794070f73aaa346cc1009dd0e1e8e060b615e738ca8a50e1ef84c8e93ed36bb37078f2adfa907f19a95240ebec8ab9b2a44e5060f3742dcdfe56b83471b82f6efc6a4060fa35dfb6850d10b01d0e0719cd857297743ffc6bbb071c386066cdcb0b1011b1690800d01cce0d18758f2539dc66dc32800193c12ed10728821774e591e631d870a2006e7cc4d5b39bf213e8e2c4f01c0e061774caac4da84e8498eff0247195e14bbb1c52b1ec449ac2467a29fe5dac2150ff343f0dc6a936ab61386185f8c6196802d5af178736e86201b2c3a2f4ab04e065f6ec18a87e5933da35b75395bc58318967663e5ed90e855f1a0b27c5ae76f52f140dc3536e6fc34768e8ac79b32ff844ce79b18728a479e5a62a4dfd11ce3c7140f4f636c66bae6dcdc94e2d1865dc406bdbe1015291eeffac61b0b7b140f6532ac44deaef7a011c5a3d9991419164fd7e7503c981c528ea58e2189c740f1d02e05b314b19dd2c99f78747739e67256bb4bb2271e6b907877af77e291f686fc7ceb71e2619098151f24cba4cf6ee251d214daff1ee1e27f9a78b8fab9b5daefbae5cdc4a398fe36e3745a980531f128672ced38329342b397781c6642fc48225ae25164afedeabf275b4d251e7f554b878447b3d22941f57b8e270d9a493cca185fe262efd4ff2d89c7d31d63c53d9dee1c8dc463cf0b49ab315d6dc540e2b16e1eb91ccb2143a68f78d435d3d12e76a6c790231ee5d092412ba44a4dd988079f3b93cb7bf3a618c288c7f391fb3ce33a868f8b78ec31f7654dddacb34d118fe273fab6a4ec1a1626e2f1fe49fb58be20e2512e7fef5a6d8d6adf211e7ca5e4f23a89f421c5100fd576b2e84e085129528807fdf9653ce689100fec63674aa6cf17cf201e4699b493fbbf201e790c2144497112ba56201ef9ce58bc102a3a670910c77ffd0ae993feb08798ad8ee0185bf8c1025bf4e151acc8b9584c8da8992df8f0d853f0c8de5351161678047094b10fb8b1000670c1051f2f4a9191630c3d6cb187472185b02fdb32495414984015906580318609bec01c6ca107db220f8fcb66a27fa2c74f63f0f020d6e650b976d25f54eff060926b8c22bd66a1163b3c920cfdaf9d4dd9e432076c5187c757d696a33765e14b3a3c4cfd9beeb5315888a92de6f028c947e8cea13757a1346c2187076e79623649840bb52de2f0306f8e8e7db96a35f37078f0d96dda327d7eb97fc3a39035a68796d20d8f3dc7edb42bf79c42de868797638e9d4dccfb420e1b1eda87dc888a0b113b6b78a84127c4ca65353cee1819ff9f99625a4ec3038f6f1a8247170d0f73fe5e093e6f31857b86475a29845e4bd90c8f536848ca9f6a5b925a860729d792b2e620297e92e14155ff9c75be8ce1d169cea2f9c22286c7292f43eaa670223e86e1510afa59c2a7c1f0c8f54e2584e654dfe0171e6806ff8ef1d2db15bdf078b2e28a56ddc899d88587db2127a6e7a68eefb8f048937db88d6de161a947a93cad103d745a78542b36faa6bd297eb2f060e52e6a8a040b0f7a42c7fecadb151e5a9209d1a294abc6cc0a8f3dc86af418f76ef6aac28398e22464c45478381276937f50575f6b0a0f3e8595dfd6a99f18293c8ed673a92d5178ac5796f2e97a5eabd001e30b14f05519366eb0800c47c1056cdcb0628193e116301f6c0185471e427e75480e056380608b273cec38ad9c62494a2ad9090fcdaf3253f0490e32c428233fb045131e86c48aadf1ec7aaab205131e7d9ebdf6d465b1e3c0164bf0ae4c3ca6a79c2d94f030c9b889dc5b340db9126c918487f729abd5d7e5ff2a121e45ba0e79374cc73a7984072a134e2fc7602ba9106c6184c71a43d6caf6d1d4cf17e15178bcf590a613e1514852164bb3d5a9c587f0b83453d449fb9762e74278e49d83daee67d3cc74101ec508e934e2da407898a2a1dfea2a46f1fce0c149ee7e1b4be9a7e3834717f2cb9265ffeec63d781cd39f273d479b2c310f1ee728ffbc95275b2c77070f6bce2f534b88715246070f5205f74ae5239595e6e0a15f456f89b2117fe3e04148a5b079f10d1e4e9db865b79866316df0783f96c6b68fd6e0f196ded8844bd2e0a1a5563891d2dca4cfe071e518925945788af8163278d83f59691a3e5ec8952d62f0b0aa3d6255784bd8ca163078fce9cf3cf2a4cf7795573cb60f6721226cbdf7e78a479691c16252af158fe6e43f72f818734cc28ac777125f27bca4c3b6553cfeac3147fcd254f12873261b8f10f3bc4fc583df9c2645fa0f2a1eacad4baa9da778545351efc7a258de4cf148426b64c643f4986a94e2a15aae9cbdd38668779382abce21a4728cdd811aa3781cd267cd669ce87ab2281e5f5baba74d9b503ce8fdce18836b40f12866c6e87fe40b26ea271e5e7edc7f0da1271e4c68eacb9ead3fd9d789075b6e92396bfca4f238f150fb654b26bc4d3cbcd06a6de13a3a6b34f1a8337d63ccb56d8648261ee9bd4678a57c4e18138fa35ad64cc94ec2667689871ea4ab63588aca33d5b0c443b1b2330f2157cbe62bf140a565327d4a1716f3947878e17379e6fd241e65975afebbd12c3997c4e39c9b5255346791bf23f1c0dc35fe45cf1b32dd90789453e96f0e1ff1282385f34a8b9bcb6a473c9e1842bbeac5aeec99463cb81fb7b0ea9e5df2ca8807b731789ead105624b98832fba6edac7851c4a37049b2bde49288c7b3f2b923bef96ea820e2417a6c64e4c74d551fe261ecfe5dc6c98a8a1ae2b19af56c1e8fe31dc1423c7ab5cb303157a68a90108f73baf3cdec591fe91bc4c378b143e74bb9f35c228807e121d567f758201e67304f39d64ea8d801c443abe87f8fadfef02068fa092926c90135fcf030468b5d9539deb35f53a8d187071af3ac7ba659dd20b100146af0e14156edacdbc1827688efe141680a6b0d3d3cce31ab42db7d8ef2538d3c3c88f943c8b621d53c849c50030f8f623a89ed9f5d8d3b3cb68fb8ab9cac6cd36c87c7efb2493d8494d56c6ad4e1415b8e51e6ce73cadc38b2920e0f5cb3d4e87d68c78b13781956aa801a73785c97f2a5ef9ad2725f6bc881d5c8b0e09735e7e0c8f21bfe5b46181ae0820b30c0f02e05861a71781034b7f63a334be3476ed480c3a369dde8c86921d623661ea8f18607e1c64a42b8a6ab7db9e0a2861b1efeea5acb57acaf7ce1820b23d468c3634b9dda6288b92a32044716199e2387b31739bc2046d8f030ad56f8cf2a3d8d8a9123038ae1a8a42c8962c250240e0884a1804838121c9d2e00131508002030200dc52191200f75517e148003482e1e323c2c142018100c0e0e0e200e04c2403040541213476140181c0685c20151293c83e3038e4769a01afe0dffa9967712820a93d1d22c3bcbf4e230f8cbdaa7cb1e84201435064c9bff13b64e4cf41bbb6e949c408c461dcce080fd3a3859a5c919c827ad7be0b6c1da0768929dcd03559c4a08f9bc7e30dc75c0fc6460245e2d0b8d399ef48d8f8a01351644fb4d743d22c1e5cdb225ed301f9cde41d5711e4ca558268ab2d003a966978983d4da2794d6c4c63c62198fecaf0cb797127d458be588e51b695a641d4224a669f1fc164bef313b83da95df584ba97860a44af233cc549023105d3fbb10ef5bb563e61441ef67a9474001044544419635212cf68e3590e7f85c5a30fd6be7e1b6dcb8f43f7b79f2e868da9075b93965e070459795114e47aeef92c237f33057027e98381118a4f51663f08ed1e619fb8ff6af1b1586c63aa7e5889e3d844d6a46a0e7593db94463356be43654b75690dec952d889eec34c4f2fb4932cf7cbab9de11e2a125c5fb4b63fe0d8442b6d8b94ed315f3d0423e608ceaa2a7c0fa53111409683834e4084b71adfda402e6f827378ad879aceca9c933a14ba82b61ac628507d0b824e2a06df09050b351897039e55524434b4f81653c7ae043c2051d85907616724009c654120273fffa4b1c1059d972af81eba7f914a34b8843af7f30f4878033ea86af56f14206abda2d652eee758aa3c2580e7354e85445ade4e5a2dedb36197c59bb4fdcf1a7f7b7168e760377e73e7ff4596ae803461d0333a8bdf63e700cccedef0206ef93f5f92be0cde7a1c0c55808b4b7f538638d1d5b9f7499012e0471cc0d640a308c5ee8bbd20a53c7e0f03ccfbcedddf332aced894538ee53ccd74fb272ac5f45fc5a036b4959ca5ffe2c2b32273a9bb974173d18acf4f81556c15dd83400e8a06dec8fef6963a2ac4d30e2df0744d85dfae172b124699480fd784f4476a9f9e7a25fa654f7f89c4ac6e537d2efd2afbbdc27f82428b5fd252dfdfea9f98e93b74a1beabd5cf193b6a1e50fd207d78a15fa11a0a6446d4fd13c78a58ddab5f2def7725a381d626bf87bebd3e96be02eae7f4ffce6400c0ff77df1bf1576846724165d5cf09dc592f55f493fa525b3f678071f3efe3efb25f6efc152318f7849cf85788d5efbc4bfa1da232e3eac0d7111326e9c30280e7b4b7a53281c035f3769789526f5eeac6737a7dd0990c1936b8900f730cb3ce1426e0f895f5560c5edb35e06d50ec75012dc1d17d9898d0669f41ac14cdc3c6175a451125bcd10794d25c6e9efdc986ba2843ef9b7c9c297a524fb8907c69d24e64745b239d90fdc93369644762029e493cab49e72f05666a30e64434bac7073a1ab7deef5f178d6e8db0463cb0d19e7c29059c7da429e90989d068c7e8c228cb68a42374449a6bb65bbfa022f512a35d845215ccbfa315fe8015d67ec42649eae8ada8a2e8bb116a1dadd886683a5e8c0a1af9c9680e5d53ef52e8284a9176606aa9856134c7f82bfb9a498291b47bff88ea9279f2858788aa58e060ea2cdcfdd0d6818ca6e2b8b46cd2b5da01b93106b05619c3292912b07b761209f289b126811fde053701f167c6303fe3545c6a2828c8ea90a52bfc3186bb57a5d29b1411685d4b00e2a81b0c56d5ea6d7a086d5890cec428d72964d976be56c2efbd9d0f4ba933aa7d75ccbde4975148cab7ffeb26c728e05eea365c5e0062c1ad21224a193119f00cafb623a49c7cbc975ca753a9769777f06f19067eb833864d87424854a9a0468998655c54287e3b6774331483a06a01b6910013e90c00bfab36a47948bdfadaf35dac1c4808fbacb038759223586cf8d04a6db9d2e14d308cb0d1bf086d1ffb21e0fc5fad9e0c6dcbef2b6d99632a48847ecbab392991f1008d34812fadaa32c3b97cab39d532fb2c1bc4961265c9a629fccd776b666f60e351884ede5defd1ad3da06d286fa24f81450b7a43929691337ade5ba013fd7f00f7c6dca5b3499002a4958feb029c73b05ddf68da245cbc3ae0ed2b7cdf88b0b5e7219f8d89bf68becb0e95b93fa53bbcf08c4e5cce26e18a137a736b830b69f07d619cc923cf019bb6a4a7230a8d2655c39a2da755c790c8b3ee15299a8c906203b3f8cf332841e0e38bf0721b1ab0c3d9bb2358134332cae15696ec85e5aeb3641e09145cd8aece114c29877a50c5685ad3e78f0cfb717b732a6fe6000606a80fdb9a53608d18bbb3c3440778857e2f525e41f0180cb374abfb1a448fc1e88c6b9681f9e5d7a0a3930bc2d554b91951a24049863a457aefa33d2c1e425c13f6279bdb5c648fb0cad2622e19ffd95f48a862046d13ff21c552c1fecce76cf3086dac88dd972b4e57e3da1fbeca9520458377da6b0e0f4e2d0d09f1648be90042122ef595a00d78cb1d5820c7f67585724ebfc7d1614f863039845237a89a80612fefe3c9202e5d165ccea9b913230cf1a0400ab2971b7c2f6e3c2fd719e498946958d663bc45c7f8f8e5b1be3235b113e1ccdfbad09d828e30d8319a3c96c12ca6d9c3a3e29760005beaf982614c66feecc3c97c5458e7adcb0f0ab272863d4d1661ea54482869f8266dd1d061cc1c3dfd4475c9e123a20ae3dbc9355e625aeca7342179a47bd2159597260e7bc54460b7075543e7d53096894237e838db1b361a8019a2d8aee15363e52bd9292212c502a1c2acde28bef5b275d7b83949174ad7652b07c4fc6874b1d2badc22077b5837974f2f38302517222efb5d8ebc60e7d87a785a109523db5e5e54332cc3e297176fded07fcc5b0cf77d758a636bfef49a9fe3d0b9cc825c2ab9e342caa5caa59b5e0ed0faae57a32e015cde5aaa5b6c2d865ab45c0c2ea75dc6ba5c7999d554ea2aeb802179092f46ddc1bc6a2f867e813d49592d5aecc73fd818b128be40ab3e830aca11947c285694982ee55400d06fafa168a2245192244a7e47956707de296f158d53d654c6a68ca1c2228acb1f320b0948583fd486168c06263cde459250b98ba00fae9d47036f3264e4a9cf92f742118f03798685b4a91384c331fcc468ae60f531bd46b78c76240f335cc88dc6c55585105d257522653e6a65d22eb96e5519b786d4cf6812341b28d57c6ea96ca461f684a4abd81e9bb7ff4a11697f818a275cf8e2a9519bec0a11ec0e0f494f20c9785e793279f49447b0c4c98cead1f3e98fc70786e7f5786c7daabcd18ec1c26e1b539e0311633dd218da88bec9972e4e194e189c058e349cc138e7e3a4902519ebe13831380670dc70b271a816c7c2521067dfc009c2c1163865d96ca5bd20ce4c3c341f399a04f5f919d08f553dc0477576a634d2d36695639d1aac7799aa5399dc4539f46506918ea9395186dd82580896d115d1824da7a9c1b83cf0aafac7cdd3364af192710ed6eb0020ec40c984ced61759cfdb4cac75c4a7efc202c0566882c18c87b024d1137c3f11b020a551242293550a9eb942ece1cd2e12c3bb26efc9e6b2018b44cf397c78d266d4312a4c11d5713f782ff3da117577ead0f75c8e222c86fa621a26a038a6bf84b37a491fe8e9c2937142ba4a98a5a8660f267356725d7ec346db4baac47dafbac8cd44b53d42c00433a381920d745826bdcd8d5a4feba8e9c0549aa90f3de0b3ed32efe811369531ec085a07a4d15345b09752ec550a58b4c32d3b124649a9965d1b7a6b5507a57ac3199c0519693749c2f570971ad3349d4eb83b876e225b00e3f1e1aa8192f3eb1f5c5a4e9abb748b2593068f0e7ccd3ccbdc3d95ec55d3288c3ef5f52172a6ceed277c76405d551c8fc8c6adbe346f34ca0e734d36c50949edad15c9d8eff9ed4751b22f51314d95e4771a0dd176b5db9f2e4d07150136e5c12122a7ad8dee8f799d58611190c4f03e24dc2086f9457d8763cb9d1ff4a09ec27f8041d6ffcbb4b92228d267df17c0f8cff540f85540ff513fa0be3abf8d1e607fd5057009cda503a1022eb2b0f993626ca23ec1468908df37fa970678a53eea64ccf07f2274166c106d8da1102e4983a5118c82a676dd65a0a8869097d41a20f833ebba30fc476c5e280307d1e0e3811056c15196c44c95fb4cd8969a6836bed8c5499ef672400f07c03775e4432d5bbcc58c25e3cc2d7f9153c333d142bec9337ce46e1f7b0839a1f0c1505961600886a25423fa74ae7ba9554cba346889dd968fefe226767b720250ca4266a9f1b3fa23952c87d9310c935dcb9cf6fa3943d2513ae99404fcbf1474f4d1dfeb11689f54be4a7ea4ea874ef567c1543f030786547f3fd14b8ba0711045267e2dcf32322f6640e4a149e70e9dde57b9a6bccc882b44b58f661469b42942c77d10b283ee91ef116d2c60cb3048a3c970c5ddd30243ce0889c1c7e8cd1933a50f819486581253109e211c0878f13f47a03be2b913e4ad48d560ec384e70f58e842df914f2e458edf279d56201a3e80e08b11d8dd96b34f8083c057217c18185658be252a4128eeda5688931e9800a54822f61b893b1f1a9695883578cd06f41f67aa09b2bf7b70e356393a01740b6cee49a8c7d120f6ec6b13c7980564f9b9dd5bf560204e20c451a6719c12043947c6736cecb4207f97414f57e550d1fd3081c641ec9238ab12b38c7e0b5930ef7488066edccb80b0a34d0a1e069b3eaaa20b291183bab2d0c5b2df3fe42dc10fe41796d9c09d76901d0d0b8ee180dab2c976254f7f4f8384321b30904d309a273d8dd30fc9f2a104d4fbe2252a5e63cbe19b3a0566012826130c23332b0a46841868fa8a30584c31d7e9622474f270e4397eb8ed1730cf5956a39704bc857efa0adea004ca4a61b0189a0ce7023dfb5b4342ddfa1909762ab50647163d2feb3e46b8b6f40809f46c69c1e4b7085c3f88031486d0b0883af867ec28c0d7528b103d46845e8f61c8f339ab4c10e0108de13c963a5c23ea437fe6374c79e8f892b731a0b823ca5e228042aa4654b7561cadffd05cad75c8c1e3a47c9191ccda1bebf57c4460a901e4abc7f04cf8f063417d5f4282d78c592fcb703f79a7358942fbf044a060db8c3b8c97064c2a83e8ffcc341454c4b6b7ac1599041fccccce55391d106d5362edb827d59807f8d7129ec66e65ef737080939a1e1cade191e1b50ab52fb2c447a1196612ac6ae88228308afc5160bf8a89ad6315f4dd8fd59517cbc218a7dd43048c3928980baeace52bb640e12ef298b82be899c19d9595221cda3605484ff878f42ae9c2a08297f803a845dd021f59b69d105fcf7d111c28cd8cfce3809246d6b9a057a5f15d900274b7b8658d44c6879754ac1768c1efae5983ae15360ba1131838c04faa94e508a2c11be8e9dae00f31521d6fa527febe697b466d672a6319386f886572d82c9297b53b43541c84d706f5e8066bd2b1d41b55c7aea7f21c958cb962e33e51f647d99ac6ce546198493809d8870f679bba861d0bd97eb4f36ee0749aa16ec8b3d745593ed726943fb54ec30267ae800891adec1030f8773422b95b01de11f5b3e73d88ccb85d5feb6c55fb8a07615f0b0dcb40493d371759ada13dfc82b9ca7ba4d9fc5357947284f6f924cae2a79721c931f2f541bb35b9a815d78ea36415133df848cd91d05075d5ee62581e7c03672a0aac2b59e3c133a86ad0cff228bcc0f9c8136453ab664510dd997c0a470bbf9c6cbf491c56cf88e5189f822def017eea9be0cc3a3916f6b7cb816401cc816b653e0df386c18df9ef37e28ee06abe1bd8863ab076a09c543a6ede238818f42c77759d8a049a615ef27d35461b3aa1c42681a01d43094d1272a47fadee80236ef1918b2f9f3b8bb8bd6db90c68b2a473cb24731b08c12ba8c4b9724dd0f415889027b3426809227d61028f56535dc120897ef012a88ccbc27370f1cf650b3ca83ae400c24cc5bed79fc8920953f158ace21550ed4b51c29af27738c62187a549b130c6624a982e4bc145c332eca0f7537225356df9c887b414ab4128bcf008ef61b40296616824ea26bffbe882ce827768d3d048f19448922baf55417d1ef5e8a2ff50b55be622836e0d7f8cd73f724f8e3599d5621b2214753e3be2eadc0e7fb5e0ef3975058bc974d2b755673397ae77311a97a36630442f79d9ad06719728702d283baec4552bf86512ab938246cb2c696f4fe4423cae8d7f9f891097bfc98a13df7f01c4fab9d219afd132af230eb3b2bbd3df879e684b554a65e29d7de964935a126830800be20737dc94c8f216cd401304990ea265a46ef42a39dc4cc424a23c8c9b7e686685331e366befaa60d66016e81bff409abc74c52a656651c81ba0100cbb3e58695babb6d971368e99953b97be6795f4e65bddd5732e1c10a17df62d9d4e94267e6da8b26b6c25f97eef3c73e1d84ca2471d7b2f0fb2673083a756eb79af0ca0765b58927efe711c5b8a4eb9977946d294d055c72dfab13952b82a6e434b37ba1c267936023accee3396c2529eeda78371e0a08aa18133eea23cccf0c426594a82c046098721e8da3668d5f3697858c73dd62c27d11650f6d3a8f4f57814441aa82595775e30b0282b5b306a9f5afcec8205d564cf40ce52aafe28ce4a9938d370145fda2d44faaf14c84e03750886919ca0949fda78262e4075e1e0cd6f604921730ae538bd7ef14132720e4541be4b421a67e07e7e6723cf5f382f864f48f064d5049df526959fad8b91c8886069165f6388186e2387d206f8a6b65a93fee51c4a88d2da8226f09092564f793b564e42ae0b10c4a3510e05fb5885909ff6b97accf5ca7fa4784957f3c78f534ee44b26ea762d2b133d826ca2a637c93869b972aa4d5c46304985fbe9f5e9969a2aa71ff64c6b8c0b840c22fe294bd5ef4ab991d7828df42086cbea04be6f09852e34a8adb77e781801cdd41b29995719707e078139f19ac86326f04ac7688f951393dc2ac913994e164920905d8a30250faacc25357c7d91e57caf451f7426cc8b678cc134b7b23908b0f96d2ce6f1b522998060f9330a5ccdde67996b30e95d3250b3ca2020d0a409d5915509cabeac64470d02ec9db21549538e0d779d230157e1ffd7a941d0a079607789534c443b9e1237c89a8e2d300a3c08df995e2022196765b4898350b08e23052f9cb196a0bb0c67506bd338fb8d39a640438db5909f1636d6755c6dd4d250b450290874ab194780266f69d3dc0a949dfa33f3ce933fd6eddc13d49d1100dd880a07456421681412f3a9aea74b350200e745792ceb173670b823b01a344f0474de0105b1cbcaea10942ded972be5c964a59b8e035c26702d3326003e2be4f6cbcc4a83028f62e15be21c80177c4cf38e460521e2a3770437d8a5cf7e4e560ed8919c0579721b77fadd6a3ad703a088e7ce4b26711b5abbcedf83480bb97b3be11d7d2c19608af57367d4fc9be5049ea44556d524b97fba79648c927ce375edf4c2cee6330902a65c3bfb79cc9be0e0a11da203d0cef6d37bcd18be7cc0ab0a348324e6d3f3667fc59a28e635a5cccdb2e3b96eed8d13b52f2640d5f6b73f6013c9b0594d7fd4a17938894ea22696a39b9a4816f5d59875c968f1da65e13a05e421e53289bb8a7847c6bd7d16d209dbae4ae4f9d029a716ad5c77e6dfad07840110cde2bec99dcca209b886d4a879f5af7b15702b4f44f252a3502439bb0f680b08ad3de779d183228c4aa47279412116f09ba4b6ddc11ddd5e05170d7a102b81ed07b81ae6190214cbb06adf91f57d485aac22e57e842d4afc3b94a90e720910df863ee311964a4425d02cea8be5c7145bfd6e2ba4b892a8444fa4910b5afee11479aff6bdba44cb4b5d437c50e7f647414f88cb283e44fb6c2f07352d6bf02cb62b01a3e5121e8a8bcf6351956d96091dfa0193b4d39de98a742ae4c023732224714a9ab84fa2345096b1e31b819825b6f8aeab476a850e4fabfdf17933ab8e559bc8e51e5cd45a9a760fe83c58667fdb684e40134fadbc6c64cbeee2ca939a12df45576fd138dda6b942833e02421c32fed37c1df3e7a79a58dad6af93ab486324baf0b2b2d4a15c3fc41c9e0bf1da7c9fab0c84de3305fbb0e16f4d60f42146343aa042baccee71f576636458d2e2e6768330f1c6489467ec4fb8daef4cda59d742ef116d724bcd4411b2d6c66cfe0bafe4a2ce92bf4e634aa19c69622da797cabf1ac484d6e11aaa443288da49cb1a42da234de86346a473e42c56bdef1eb209f35907682473620f82d3aca40f0c8a42e3ca5f083d04713914cf0d8d2129fe76414f88128612f23d0ff7483b033b3409d84bda585b9ce9f6ccf1d4708b2831af2e7479db28933de45e8d6f99a0bb0891ce97a0872498ddaa9f298a53b38d8e06d4a3394e8f56a1dfe99271f5dfaee646d73dd87af0ed4b8a026a3ed24f89f82007ca4a8939fb016814087865893a746c50101858296bdb163366bfc4bab1f9dffc62502a569fd3aa98c199279f5226a6a51229956fb9a4c5c0a838646435defd516ed22d4da9d892ff022230488bca0ddd87210b35cc3b09cf8f235eaf62d9dac210b052afd42a50270439f45232cff76ef35c32cd141035903d0023e1f6cb4b6c0382acda16a7dd2e7851113e5d3aae6d2c63dd5584f4b365e4bcee6b98b5d54ab9c5f771bb50889a10091d06f71cbc780b7ec42552db79251539bc241da419b413ccde35a1b702707c620e4071206653c5aa4f30880e7c75f6219bd8b3ce281989dfe942a0bb165a758a585521a22256f1fe3ac0a3a9ed0a7a3073f30f53b470ff6e006c6ae47b552fc6dc0b91c367fe15e3364075fec632e5e063944efeb21ee6c9d0352b71a8736fe9c93f3e322ee92cad65dec6cfe721c48dc74e92f14d990111c146951b1abcd7c3e50822eeb41d79a17a35ded495be518cba0b08d577457230c69a97132314a9f75e5c6bfdbc057b58cca4083efc28cf1bc439f60feba8d65cbd06083ab200c031b76759bbd6c1ce7dc5fe2544f1821d004bf5ac6eb72cf63280bc7273b5420b2ace606fca1ae5fe272a98cd604080f6b39ece5f9625726cc97c32e11efd9653f05bedc44fbfabf687825e3de3f70701e4a65bc963cd0818c5fbca32975b44df5ab5324930a0ab71f06f07b3059d79c0c02297345ed48515ae07b4d4232bca937fcd4a15065ca8ebb77e224f7cc360d1c87fb2d9da923a582cc880ce2fc66840493412c7001ef848a84130011482cc30094ba6d3bcad50f19179258a9c3898da66acb41ac36aa8758732f21136325ae431986faa839f0c8e6b971ff3dbfcb73133c5b0276619f3f753db3c9c049b5e95212647efbbcf9f6f3d0373f639cf12293bfd5d28a2ea7809bd54a9e8c8abd454fdfb7e7b6003616cb6961c2addf9b73b417e89636da4766bbb9d58a92f92e899b7a4615a78270ed664a5cda38344c25c87a010459c2ec2d61ab2d5497f9440c3ab7308d3b3085e2c76298d066d96096dce4168ddbd47280209d588906caa14f5c4433f2679ed8a6c9ae649249e80d5d522b19a0159339b288a962bcd1c7235bcc58a01e1b40740a7b4f8e4fc61a3ab10751d9504894620cdda5379d81cdbf12f02d05062b03fd93b932fca9f4d61db84598277b39bf97d39e28a6cc75848366b03d9350b2accd2bdc5259cb5c146564ebd027191a490da3223bf10e966c769ebf65c490d1094646d1b2f5dea1cba0491c99a9ced59af1974d55860c8be8971d8ee439b117327bea221364e7ccc4f9961523459f801619e06a3d9eb65646467f6977ccc59d64453f90194ed3ab8b5f884bac94a26764e202d8671c819344c0beb92119fb2a00612cda638105febcf2f43eb518a496b3945aa26169fd498c6b6e89557a0b42ed2d9ac2b90b655bcaba350e8995c84178eb2e9ecc5f11d15a87961635225a82906f290ebeb5ea9bbd0306b7b530f416b6d85b9aa57f5af94a3a42cbd21678584c2e8cc6c3f7f256cc55bf75604de8cce4694dc3ac0b73f95c88f3696951cad6fbb9751dc7d4ae2f315ec6caabda6339716b5cb9b4e12373a995530b4508b8fcb2864bf961dec13d5bfb5ded9a5d7bd74c60dffa1af6cc3ac14e1b46e0fa4a472e27b808aa072942cb4094b8bec3613929530cc6b63bad6964475de435e5e647824f38bd208a03880d3a954f3aa6e859cb9deac45972c92f0f7baed77e47593ba5d394e8fa9895c3b4562a56452b1594b1323a5df78a79301df9fa7af6f643faf6bab59ea3507e12f7ea4cfcb11ff12f898a70c9f98d25ee4d342e67d8658ecd547e607f30927b5dbd16252964d72371475352d06fd538c90421dceb0890e22f7f460dcb10668acc36e02aa0a6419128568b8497a47b191a5b768ca286124eaa0619cb4848ad4ce84b2aa86f89a2ecd0fc6be26ce6438a3689458a538df5ce22f956f4293eb78807d6785c3dda132fc03b46b28079cf4b511eb8402a84209ba32cfec9a8ccd3e98c235e57a5cb91c3ea7541640d6172e50b243792fba7d3c240546319b7d4650eaf2207d71d170824c10a01a521b72ab1cd85ad845bf6181d9b803a9b9cc8f4e78610aca12dc68102379bebf90c933c2a5c9bee4df85b764509ade03970ddf0a25faf9a9f37be84eb8f6da83f1425b555678aa6f6f405b5afc10064c2a6e221d04880ef30e97a26f8819acf7681a03e368009ef97775503959bf8e8bffa69ff416b0179f0623af6fe15a404d879c07f16febfbcc989951d0c2ee07908155831a5a971d9dc65e80502bc68b0d44a1694f570880596f295fcdf12341c20e9a5d7abecddea0ad2256a2a0a9792664a5f2f2508ed39170d74ae6a1a3997e8e271e6ab93f5e1752ecfee7680294e3076adb57898dc41e41cb0b4edb2bd46392ebeb694763781c134ff624a7468eccebc12e16920a7440fb9dc0c6801ac4c022a9fa7953870b46439000c30c000030c30c0000aab1a21b811b21004cb2493643c048c520ee424534a32a5d283c60566236defbde26242e36242e366816a09590959091c9568420afae45cfe9854f264c141894e476ff1a472fddf619e44a3ed129266de14a2c7382461591447241acf1ff4354ebffc277040a2d1d8d4a2ac8271585c400105c3c0f18856623c93fdd31029598ee85552669c9ce279521a8e463472648a5fa1da839828231af9cad68e6cfa44451c8be8621c19b9ad21cd02872290e092acd2a28e8827a2f1b821e8c99cbd9bb41c88a8f445fbc4d36f1617380e5188d08d1115ee4986307608a6648c1442a710770a9a63dc891222195cc73288d8fe0641ccead9d25bc213042aa9b37af0d4f81b5ac848008c2b7004c294749e609ae395d6868c2d00d1879857fb839c1d997b1238fed0aa26a53c89a032f77ece0d1c7ee8d22f2c68e9eb9cc7af3303471fba9cdb4c9ce914adbb74030e3e3439b4e53211731b70eca1d530f1525e9ff8bf68061c7a68947710224a64454e122670e4a18f7f9252054d4999c660718107608187f65224a56e0ba72185efd06f384939e998f2c585d902069af1db1c7668a49b86142dab52dc601e80a30ea8eb9bb68f8c76060d2d68388c1bfe213834e870fced4fd9b95113c8489773208acc9ba9bcc41639919c42ccc943c4bfb838c10d1822f8e7626570c8a1758b21a68ea03ac10ca312e08843db2f929338cb16b777cc00071cda2841926749d3aa919211e07843275b754646486ad0980102196ee8d763e88e19090866d0d0a25080a30d8d2a0df26364d7899204c1df9821830dbd9b1c9d3bc7e9d0096380630d5d52396a4879a51a7ac9222a85dc0b2ae4892602018e34743106ab68967a314243a35237291144b3893e1f460d1a67e8327696921c3d31d66eccf81934b830c1e30338ccd0e4d3a89943c84992d2d9a28b1965e8945cb6679c454f91c7587b1b350c17d6000e323439834eca67742a6037865e74d663566418ad20317432568a0f2da7c98481f6e838c2d09ec7114a7b88736ed6781b35cc04ce1edd0038c0d05a92177c2c68ee5ee60b6d88dd612ff4d1c5e7845eaf387e179a6c41827ba60c3963940b9d10123c25d511f444b7d0c860ba2f68bd145555390187165ad17e39beb5cbce2665a10f26b2177653881039161ae9bf253be7ac9ffd2b34d2cc6473c499909db1427f21c3fb63cf55e84dcc658cc54c852ec36b8e6ece513cb553e8573dd553fc989ca952e872cea02c4513854e27c50891647a9b9840a1ddd0a9ddb1b267f5ee09cdc43c219f5ba7c8d39cd07cf8b5ca48ba73fc4b139ad81994caa8694ab687096d3ed9fc1f82b8843ec72063d852324fc8120e25742a61e77485f992933a1b1c49682cfee74345d6a6c08184464542ce179f7829c61ecde01c701ca1099ea7345f4e8b18366a84ce52582815c225aa78388ad0488f601d43c7b35ba43888d06904d19798e121b4c18268e457b39c933884d09c48e2ee23930ea5bb089c86163060c011842e520ef98f70d2fbfa0107101a656131377682ca5a25e801c70fde0d258498891cf21070f8a09170dac386c58be3a51e34faf1257a924131d6ac04346ad4a061001b000804070f7a7d0fba123e63acee3b4065cb12d43449077de690d173f5cc77f6e4a00b918338f9f231635770d0c76b99121db49690b9415ba54d5f78502231486cd087aec89dc28935683362e413ab508faf62ac914004450fc14183e66334c9124d8510cda0d11284d24153535432c9a02deba89224664ba67b0cda5c8dba123c6970d5c0a0d1682673ac631049885fd0b578d008325e447beb823e94104a87f310f49aae05fd7c4a22f2a6a9942515638d042220960107e405200f1c2c683d27c95d1f51d2c3b48ac645784715ed456d1121553c119f49456b3abca8cecfa868a466eab78cef295addb61049589bd83c4dd1c61429968c6f293f24a5683efe777cd14a8b2a29da14117367b07014cde984a4954ce396eeac10459f64675c6a0bd3f75128da9c115227271d654f0714ad7a0cb91a3a28f58cf94467ed1bd593ee8936ec5a50dda0aa132d9d68c545a487923a49c518279aa49592f0d52432f3bf894665b81c4d341f9f66f9a654e89689f692a524c27f905a1563a215d9d1f92ade251a153f436fd25aa20d4a6b8720b92c620702f430f2685851895ec52a4c96ac94a39228d1fb5e6fbc8aa051339d44af71a6cf2a79a9fc1149f49f72d896d3cb23738c44fb494ac8f9b207894e5b10c9628cef1fe3f6882e848aedfe3d39a2cf293fbe062531660835a2b94c4224a1954afac519d128956343f474c630ea22dae8793e7bd65311a46c22767df444b4192f0595f923d6621dc2744b87e8327fce962a84d3967943f46551530c52544a15a342b4496c6e2d69794b258810ad4cec389d527c109dce882f419b9644d705d167670fb324ff96924e20da6c1ded275aade73f8068c634bb99f7085d21e60f7de99ccbca338e069ffdd02495734bb5c67d68938cfc30192fe7a7143e347ab2dd920c770f8de5bc2a9aea6e92523db4d55d12d6f7cc431b747347101153b23d3cf4a3e3de715d4cc77f87fe7d377a4a9d891a353bf411359b289134430608509721c18a3a7441c6cfa5bf4295dc5f2d594187e6720ef9f9934fe450c558834103150f5831874675bcf49f9d4b5dd36b01430bf3376ca461710105dc30c1df9841e30006e07b2be4d084fd7c399ba61c5bac41e3060cf437fc53328f68cc80610219c91002269091300340032be280b5e54c97ed508995bd4a92c8ee41fd432c25a002589cc10a38b449fecebb9ec9ffa0b1e20d7dd632f1212b276cf4dcd077524973de50dbd0459324c28636726b254d158b0b28e002af85086a3c04c81abace485a36bbf5c7902a56a8a1cf19f45b6a3c13327e3540400ad0c5081e01fe19b0fb2e46f008863f09780256a4a10fd3669a7d84fe1f049c012bd0d065e52f71fa4747eb7f865ef7934f503126cb7183012bccd0c8f0f5f9df0f05ac2843a32b68d9785da9838c8d18356080c01c340854000210a8abb1c516d8012bc8d09b882bb233cb25ed91186bbee50c03e84d2023015964b1012c0e8005040e8085050af09f00f4371e0435cc05aa13568ca14f7db9e5a3c7c5c7e7095688a189f39573e7896941e75684a189339a7412228ab1b6451733b6d882cd8616326e74916d0518dab930a95246fb857eb485b9587d9e2daab2c20beda99c09fa45b39aa614208b2cd0ace84213ddc4f47985095670a159b11073f5bfddf734012558b1857eb3c6b87afc24b2838f60901ae667c878c0db905182f7973181b427418d2e3c91155ae8921e33f9b1421615f21b589185de32b4a5b2d2cf11190bfd289debe6a23a97dd2bb4962b5cb4202c0691294133b0c20a6dbb898d395c468dc154854e695fcc1c926b0515da3de93d72723d5a9931368894d9eba37b72d2698c35849ec60d1830166dac8716fa5895af9b92e84515b3d0e9fdca13f984852e556ae73d612169115da13db1b14779b63cfb934282327858a1d7cda82124097f5a94f6021e5568dbb3f3446fa98753522c2ea000a5e1418526cb494f62dffa1ba6068c9d429fd43a8685d2661d742974215ed433ad643ac3ab1e51e8c296570822a87b078d081e50e884f0d36c3f5526e6c4fa038f2734f26e6dbe659e43aac5071e4ee8c44bc53525d1167ae4d184364faa929f52c683099de8ae0ee92997e4ef96d028a5928811424e097de81826692f21469b26058f24a4f457c6102f4f48682f630e1557953a22f3048f2374414cce133a6123f42ea7f13f3a3e4e5863accd30af857b14a1f970f1f13294b48a3c11faf21494d27d5af26132844ec424b3dcd5cb439584d09984cb709eca921e61101a19fef4b46b0a10da0d5ae112b7ff411772d2a4c26a9097f0c12f78f8a08fa765c372f4760c1e3de853c7e49a7bd64a57481f3c78d0289d62e7cc27c566320f1e3be8b3c6a786d9dca2831b630dc60c1a660548826a1e3a68becb924f5096eb82470e3a9d47c798ddac972e7761c37c8d3078e0a039d914af3b990aaa278f1b74b1c4e81864e3eab5ea61833ee69ce3915554323979d4a00b22ecb6e4ece1848e7bd0a0fd20d973b57708f9931e3368c492e88919463367e92183e6b3fc86882a412778c4a009dfa52ce409315906069d381d637c92bbf94b2f683d792679b8a08f964c82ba682d7d8f470b7ab310b3a4101f45a4d683057dba04ed4dd19672a7aca273cb2f6571365a925f053a54d147cca295d1628555988abecacf7f53306cc840452fe2f1b37cd06f162da768e4c591d911ca6252a10e53b4f9334fa70c5974ec544729ba5cedc1b364592da5ec20c5219b34d11d96e941c7288e1034788a112ef1157488a28f1e22c3c94b964c06f1a023147d9410bcc57c730a8b81a2ef205a63f6ff87ac1dfc447bfa7297e5e6f8b60a7aa2cb9a72660bd7e9eb75a2b390b2964ae9612ef89ce8e29b5857e4ca3904994db41a2da998cc4a4d34729174dc2cda924e5d36a12313a86969cd969376a003139d086ae1e2c55277c5fc16326ef08c8e4bf4293762d2abe13cc89c7658a2cb95b031db9374f7ab4547251acba3df84d01f25da1c4bf3179142522c91cb49349e4b83b84471b5900c184a820e493413628e399294a8a3f48b443b594749b31832f2e490e8f7c57ab457a58ea27c44aff2514bdf62cc1b2a00c2d0e1885ee77b3f85ebaad0d188c6e25e5261043800230089e86044274f4d434cde22cefa9e348cecc8c7f0bc438722301115b6e2c65d043468c480a105927107878e4474d25c2f7fe978e1598cb1968868346913f9629578ea39c69a46a1e3109dc8b83039850788714386066c68a14501b0380016581c008b0360b1c5dfb0718226654f021937baf037c1a721bace22f3a7c629eb9c4d4347219af914b407919b446ffc868d270121daf6e49d2429f7b0231d44bb397f2b8ef6249f1935b643108dea9452b42a0b51e426c61a0c1aa84e061d8168dd3bf9c66ca96234d0a9a00310a7de98925fab28fda19d753d93914b5683410399a90d4e41871f3a33613168e8b10f6d87c9cf9a63397c8cf2a1132293568e17ca849bd7b187fe3ae560a997da0f3af4d0c41893284997d4d4958e3cb459e69b630a311ed4d7de924ea1e30eada9ee185e339ad2ddd50eadece4554b16ad3df275e8f552980e5d56ffb63ce723facc8e39b41e2d8a8c513a72685e43c45f25cd79c78a4327d1bd634ad598061d7068940825314653dc91cb073aded0c851a5c47969acce508c3537b4a9aa175af35ae94adbd0b58b550c9528133574b0a1cf19fd677472ca1b5b9ee0c6cb701a6b68adf22f8ecebca587d5d0a6d0ed73912f77ee943474a55f7310214e34f4a9f409d94acd199ad8167eb263383d9d64867ee4a71c64d439a9f1538636c4b0f0712b676c0ac9d09b3edd2b2e49452aa17b42c7189a943f89650c91634287183a193ca979765311b2290c5d588f909952a7c88e83a1bf681a22bec75ff8e417baf82673ca932f71c1f7422722bfdcf22775a149e19d47a4c8855654bb8296a43841e231168b0b28e0012ee386b9618121746ca1cd9892d8cc5d314ae8d04227c45a65091dfe52e78bd09185c654fe76c530aa314749103ab0d0785c70398bad1b93520142c7159ad30b527cf4260fc9a2830e2bb49645cec9dfb3602157855e46c9f90f11bd4b9b3aa8d0abc7cbae3927a75c66c72ee359362934a6a489dc96936c33dd123aa2d0bf9e46ad1ca63decce810e2834274c8e5c9c8c3cdf763ca10d7349986c1815c4a738a18d5b39654837d178cd0c13c361a48d8e26f4a371f4ae965e994eee0b3a98d0a50cd3d99916be42dbb1843e87a4c81d3aae828e6a91603c09481d3a94d05be59479a5827e5015f2858e2474aaa5aa2d45093ab7c60c0a1d48e8cc737c0c0de5eb39e8088d67ce8e5f29dca36b4450c36cf1358cd0eb64193d9ebaca424711da52ddef1e3f11ba7c22a8324d95732a4ede860d835de8184297657b23f68aca2cc252860e21749144cabd2ebaa3044f4710dab914647cb51408cd65edd3d1ea3132257fd04e1829639e233e68a355ec0d1139da3ef6a0136722b435887606ad83078d4e3e17155274935359a063074dea242227e5338c0eb1c340870e9a134b176de28e1c744147eff78ed172651263ad58070e3aa922e5830565a542528cb5b31acf85161f030608ee1ed071832e2cf2a5f027345ed63774d8a035614af9e924b64b8b6ad0ea466df30fa7693aa141a334b257d4ee2c1d3383f6df3fe3dc930a292c83def2c9f2f9242c870bc62029c2c46845d4500b1d3068535ee7c841c8f75513ade3054d4c9ac3e8d39e0968d4e0c205cd47fc97ef907e612f2748ffa7a3055c74b00019636adc30416371002c0e008363155d8a9ff5f85e21b58b54d1850f162e267fa79813182eb63881994016599cc0705152d128d794234a45082ada8a49f5cfb475f4e8778acc3a3e6328e59ba299e09fa524b7fcc54d29faf45242e50933293a9fbf7c6d6a2aa7d151b42b792be46a98583045d1aa9838cf2d85a2cf563abb4599d0e021a06825869645ca9dbd165c7471012c26f0002c94c0f189dd2aa92415661eba61056491c5095e0462e0f0441fa7d282ce3b2f42765de0e844734a9b98092329c7bc5f143838d1a7e86a3a893c6542e85cc8b8b18936a78fc8c93363e0d044a74db73b59aac0c051b8a89db7735a3ae3b990800d2e64dcb0020726ba70e22aa6099d06eac2c625daaa1617d5a54a6ce8dc4896e874a8eacba3b3c2e4b059c9d445a109de1174de310da331147a8f39e760f99127b421678f4b41e51f0d2a4e68f362b9846839420853131a117d3c84dc5b1abd6542efd1f285cb5af293e72ca1cfae962839688a7352421be35a8ea163925b21e2a28b1b7b45127aad18d961d62b90d06c6ab618ae42769ee5088d0e31dba329d772548dd0697f132fb92fc7b5b8086da6a472e14d25429b731c93972188cb6c1942a32a755cd0a74c44890aa1ed55b31824c4d0bf051050822b82d07f705f09410f84f67be385251da7c4647fd0bcacc8f124aa926a890fbabe92593288143572a4078da43efd29767ef03379d0786508b2c327615eda416f9974d4f2cbe9a04b49bc68674df2939f83e6ca25e50b51ada406bbc041977a2f868f15b1acbf41bb1d936b9ccc67b16283ce52d2961c4abce7500dda54218504b19c4b756890aae4d88d13f119b4b1b9fa344ccc11b22883366b4ef0ecf1c7a0dd885f325ae3258eee0a1834b92da64fdc0d534bb9e2058d283915cd4c77850b5a5f794b315808f5d05ed1823e53d42a17cb5dc18246c68fc998a4584ec155b4a3352f972ca9a24f5611635f2e13715452d16e771891256aa868e49555c98a9d53f44967cd905699293aa1bd335c58c512ad97a24bde23ae42e79159448a46c8aaa88e6553e22da3e8f36263538594204b51f4fba362b8d8149355151b7c84a20b95347ee62c07f340d1e7de10a2941cd78f538cb5117c7ea2c932fae26faa19b28ab16723780b940f4fb4225e3226af76a2edd60bc9c3cd186b053f38d1a758c695950e1b4f63c3c6bb17800b0301de445fe14d49700f4d214d7415c388edeb1c39aec9fdc84423b64c46bb6a4eb2472098f15a10fdc044eb3f736e32455a6eca8c12d0982182195d7c5c624fcfa05966296a894a98e08312bd78859015cb7e4ca217f5ee9ce09d64583a81077c4862c929525c3dd9caf944a288a9264765d31143e24e2a89a4539b6810298fb852929c294b85ab8e30c34bd61ca2d63fb246206736a5550ce61523bcaedc91492a7efe5ca9f1376410181f8bb80f45dc4722ee0311f77188fb30c47d14e23e08711f83b80f41dc4720ee0310f7f187fbf0c37df4e13ef8701f7bb80f3ddc471eee030ff77187fbb0c37dd4e13ee8701f73b80f39dc471cee030ef7f186fb70c37db4e13ed8701f6bb80f35dc471aee030df77186cba2041f66685be63fa624f331d6b630376cb0053eca6087cc157398a7a9c807199aec1f2108551173b8fc3106b466650d22c74a1e2747fe430cc879d0d6951e5cdec04718c8bf1d64f0d279e3474f031f60f8e4578cf2b3959b143ebe701f5eb88f2edc0717ee630bb7840f2df451c34e1825de4716cc9e99d8197f60a1bf1c94906a651d4fba1f57e8c5ac622cd3a1fbb0827f54a14df9b954fc8a61fdaf2d3ea8d0688b7e7dc9658c35cd220bbcc3c714dad29e73d031e5a5d09ef2500f9f8d421b474f0c722ab8c7f5a1d0893f0f4a460ca5c48c9ed09cc506255d2734325a991f596f42f3169bc7727e98d0885ae887c75ab5c74be863fd84882107b350294ae8b3bf85c9122b75bd4d426b255276ab8e897814098d329d9877e3e6dc348fd0b985d8782d22e7196284f6943caf08cd27992928ad989eb5fa2042bf22b44789592e7fd2f9e16308ed99588b39eb5032ce0f2134f1d4cb62444d4bb8cedaf01184be4b52aba76992604a448c00076008e00c1f4068c464122973c69ef614184df8f84113e592cc5a458b493133277cf8a0c9154fa49431d8835e644af95b6724264feee183075d3c93d76831674a922478f8d8411f42666ab37c2fddd4870e2c8b8f1cf479b488cb4a2afe2ae40e1f38e8d37a25e50e62e4fb738346c644fd245ae134646ef8b0411fe365d233dd416ba6b4e1a3067ddcec9d30b162347cd0a08f599272c51413010ec090f13183ae735e7ad23339c3870c1a2156112e3e62d0a9aef89035061184b720f880416bc282aeeca8a01f83e4101f2fe8245e261327161750400d00fce1c305ed66f62ea5e2aba63a2d68ff63492c53caaf2405a3bc16e72b70a0f86041a3bd4bc83719efd09b55b49d31853ff5a82adadc34edd0bf165e2706821a0570800db3803bb3aaf1316c187b84472afad425234b631eb3725d860d730e15fd6ac754d1d3539c8729ba0e538b7022c70c4bd1882a2132a8927912181b6818f02045db5956e53fc8b7dc1b8c9f21638bb582c728fabc243e650eddab5cea420b1a366094c069c0d0420b1922581345ef1a840779d9c558b3b1048f507426a2bf1fa213648ac4585363820728daf56bddd38c49f464c3c4e0028661c1e3139d0e1e3d844d3d0de1e189468f45d3dd9311b3165d834727da8e97ac99548a060f4eb4e174628519b19ddfd944bbdf23e3e7bca3a4f79ae84c4e25df38d5e09189d67304d1b9ac212b7c30d18886ad205153ca25ba9c4c2396e82d864a71326a9a73f7824725da10f334e6cd9bad735ea14463c12c665149164b2f57f098449b713575827996784d0c0f4934f13b97b8d41d5167f788445722774b9cc5f4b27c7ec003126df20d9e3f36e6a062326f1814c8d0c294f3784497332289e4ff150f47b4fd293d45e2ecd188368c4eaa535c1791cff460441bb2cf72484c3993f211862ea24fba255425f11fb6afcb387828a2913ddb9783ff9612d15528cfd42d250c32070f4474b2b3963e99d9b443f8106d7e1ecf187574274d6a8387213a9d703dc14256a70cf10d1e85e852ab96ab574ed3202644b31a31454648e2721a1d44fbf9d33a964a21e6948268accd45fba8b062d193048f40b4f172ec93632283525a247800a2173d39df5953c63ffd432734757258b6580b1e7ee8ff44c83041eb04d5c93e3429ef088f3039e466950fe8e7d021bf6fc7058f3db46faa5a4b08a9f922d743f31b3c5f2bc62c78e4a135ffca272b67b764663cf0d0c970c1e4a83037e071873645538cd6f9ab91b33478d8a1f318c6f2b2eccf65609ca0cea30efd7b52ee22c22fb227508b81071d3acd122e625baf794ff60c1e73e874c6bcd27a26cba1112694dc0bfa3544ecc4a1d7244b4732f90c1d11c0030e9d7ba67685860897fc3734fa738af5f5fc9e8f71431b4c997eebd8b4a1cfe4be33f3153359c386b6c4f8248b96a39f45d7d0c885d8c8eb49659ca81afad829263557d3d0898c7ef2aaf3440f130d9daa201a46b7e40c1e6668bdbd4c534ec28312923234da2ce90d29e4e01f2183e5b17f6a96ba31f467a92b7f0a323134e6175f238919cf95f208436fbafa829216d7830718da141d553b973c2572ebf185de524609334de2b1f284050f1bf7ff348f2e34d922c738a7123b44c6830bbd27139d6554df7bb2850e58b0a06b0ba7db7592f4cee62ada5142bd3fc6fc99b02aba503a5b262525a9683e6a668c264245232687508fa64fa589a7e8c7c375b40edd98f3a6e8e256851e4b292c91a273f6ad8e149df8044b263f368ade228a9e8eb124f3a2ff1a346ed8b80070e18528c8e133e50999473450aae045283a656e41544aef0c1573a0682624311a624c86c98f0434608060868cc287179fe84c5ea7a07c339aaad213ade8e0fea792531297ea44179e936e4ffc1045cfbb87179c6844969f8f29a7a6f092179b68c474e42da04b78a1892e430ef39e696161549968b68299b675b0147c9479788189de24965b3cf1fc20df4b34f2cd52caa0377e2a19c1c30b4b34a2e38a0eadee5129568946a610fff44c4c923bb2c30b4af41652f582efe6eaf062128dc9a434e4de143a278d245a33f92d124d48326685522acbc3874497412d7e45490b9f9847743aa88a93b2481cd1c7043dbf419ae8f0a211ad0709594ccfc9458f19d185092252de2b2d9eea227ad571cba656baa46e780e2f14d1b787e4a9734f0a32c513d1a6c6ace4a02f882843fef110edfaef95885c2968f80cd128cf8ef2d9a27ac89a22871785e883689efdd3ffe77d21446b1a8472d3b9e4e9e7717831882e85b4a8be162b59a80cd827bc104497298b46cea5fdd4c381e8f3c9bc41c86f901c1f40347944c82571312fc6fed08e56cd661a7265220787177ee8e224cfea79cf73bcdbe2451f9a5f8917de6385561086d5bde043a7215f8fd29ba24d78b1871b2ff4d04539693a67075fe4a113c94c5e2a599d459e78e894d21264a70999afb73b14d4b243e42b931d7af1989e538a715355b40e9db766bd1c83f9861774e8fa54d2f9f26fad3bcfa19fb029f29c8e1047a5e4d0e596ed8f123ce48f571cda8e1613a225fda427028726551041e53391347bf48676b3e2659f0e1e2f4ac40d2fdcd0558a624967e4f833216d6894ca1651952fa2278d0d48e3c51a1a114df93c3db6c32c3574f95722a760691ada889353e9cf19ef41090ded6c6cee28992d3ce46d787186beb5aad54c28d15e98a1eb947abc53c98e0d2fcad0e6d6c831785f8e53990c9d32311d534f09770d1a435f22655a78363d152362684bb806553a05f119a32fc2d0848d22fca2e6c0d0752c2d5abe2735bcf8425bd9d92c92d6a4624c67340e5e78a1f79339c1b2c4a9fca62e7499e1f91d4e5710a343800b2e34eb723a29e1766ae1c516d8fdd44e16fe4bf783175a68945222714588d065e65916ba94d344aaa99ffe3c81617682788185beb4babb87ef67b56901581c000b051c0001072857e8c5f4a8d4abcc72252b3417735e113ae7203aa60aada9a6e8d4aaca9541546892697bd01c255246d114da0c22ee9ae7cd2d2129f4d9ca2526a535554d1e8526954aaa94f956148f43a1d132395589d84d113e4f6844081531730c4128df38a1532a8a9ece163c59c634a131b198632b9c52cac44ce84446082ffa71da92ca121a992da3938e1625345283c49d2841e55169129a91f90d493444421f256ac6182df3e208cd46c99a63d0f80b2237421fda5206a51b165d3459647145e8e322767569d341df4284fe3f99d4cf9a53b0aa1660835f0ca1ed8f3fe19f545a28a9103a15164967f1fefd3883d09865f86cd022101ad9d3783298dea41ef3e207ed58c58567ec1074a967e3850ffa682aa5a9ce98d3f0a2075d88f2a7c5adba24a5141e741123c89704a17496cceea0117aaa59935faafecf0c22bcd0419f24c868a19363237762ac95e0674cc072042f72d0a712a782be6af6cb9704e1050e9a6831334f4ab820d94520bcb841ea49cc660ea224bcb0411b735a8cd3105283d6625f461d0bd1a04bfa438366b8062f66d0cf66af9808c601b0b800125ec8a0724b357913f7bc884117f42de7cdfb23f75a187432948c5d8d15d33f9583172fe86298129e392b2639a446dbf0c10b17b4af17f4629e7e581f5bd09a28ed2a79f39c67be83172cd862f04f7e29b6abe853e51083b28ea9a2f718929b8a66e2c83c5a434b3b86a0a2d7532a7a8e213e45234e5e8ec77769519aa289a263e625a6d6a9548a4e46cb3e29f6a4e872fae4d310a551349732bf8fe92051f441455792ce88cbed0945df2ee2b3e2f787181750b41d9373c790df6210eb27baf8b3aba761f544172a08511d2984cc32e944ab21c4f0304fa2cf829ce8446b86902fbe894e84f829638eca72a226dad321598488e9868c195d6400055764a2f38ed91eb73b272813269ad46be2e46588534176893e567e082a714bb4964a5336ef55895573d23c2f0f314c09f73ca8d09337a47e127cc5371d3d8ac6a091443b6f1ec4547948b822127dcea455767488d26cb3c822d52041aa410264cbbc1a36b6085740a26df1de7c5793abaef0e08a4734333262b0181f255a7785239aa47be73cff46741dbf3fe9dcca231ac4885e52c9474fba63a45862ac694183c6511a5cb1882ec35a758aa01d4bc815d18c6491ffab62221abd6d16323488685288658ff177936ecf21ba8a79325ece72b2626388365d4efb256bc9dd0bd1e759d5f890e3e7728910fd68a5cf6abea8eaf120dadcf92b5490b120da8e8f2b297edd276803d149cf3f2a5f8e00a2df3e4da592c53f742975c6affc9f1f3ab3743d65ae33e7f93e34b219234f2ec929cfe34327744d6759937c39337be8f304bd9f57d183295a439687564353afe9666f034616593c2ac1157868535885dcb3a97468718b2beed08f2aff97fdc915a322e30a3b18576525659c822bead076c7d417ac64869e243a34d1ad93d4581637cb3e8756b3b724d929cd774d3974e2e486889f3bbc879038b4f135a3766ef10a38b4eb4155562e778cf7ae78439b734de5690ddf94d52bdcd08a8a6a9d3afbc957b4a193a031546e101bfa60163646be3bac4aec5cb186be2559b05c625383f1437c3f8f9a86360591bb6f794d7690a0a179d5f8b97aea325b3a43ff25ceda4b5e0ad19d193a134ae9c850a532b4e96241f74e86f6354e089a7268ef44c7d07b07718aa18d19cd4334193a8f8784a12ba1fe6a2a7bd8c1d06e47798d1df50b5d9ae9cd4dbe5fe1853692de8eabf0232585bbd05ff635139bfbaf94b8d0c989a95210e116da497e2d26628c20bed14263a2ba4277b99c1e4b167a8d3dcd11540c169a105d2f8f482e1f22ec812baed0b66c676afdadd024212965f870159ae82a32c6d7911397a3429b339ff0f98ea7d0eec9f8db65b262aa9242133537c4f6bc068cb9a874d1e561612c0e87c371180741088a8c0fc3130000000c1a15c7e2b078308c3369fb1400035132285034281822221a1e188c05a3a038100602434140300c068301c160602446743c8a871f071cee47b916901b6c442f1b767e7c4eef0639c903e47bf8f12e077263fa68da0f27e406775d71c091d91f37ff4ddae645f5e3466e53486121a49a1b303cbb2b0fce3446178ec1b96b8fdb5b09d43ad8b3c1918bf86c2093dc62f69d1ab1175a1ff7fb086c5c9eb6a4aca8d8d5356872a97bb582bdb008a5dced554494bdb4154d320fb4e8023107c8d1666efbef91c4ec69a0c51469496341775bf081f2e1034342e63ae991b2826b5498908a2d9e196215d63c3affad86d4818d957802c70095c89f3470a777d86fc58435aec0bbc041db0d39849349ec48c79d0690270251e68eaed547ce16b90ab22e65d84491e0909b177109f7bbd3f6152552905249ba9b047666536f1337eac42891fcb4630c42b8fd263283a066ee2d160fa481d75e2834d3b8e230b04b091d72a9f60ecb8c274431502b9f320175d202a2fe230afe14ae2228824e083f261a76171c004c827ab89b150dda0b377c03c2f10e20ee99459a03f150e52dff5b6c274527753f3f7d47957248e9447ca65deb56a76fcf09e90a55061892e5f523a5e69e1b1b850a3d5c648c86c9ea653ca62d9cd9f40e9b0dde4f9bbcc30921d67da5adde17092b75934abe033c976fbaf7672d53734c3f96444e54c0fbbe37ebd28d1d5d7d8134e6a60eb2b32dc613cf6119648b9faee935c1f29d5a1581c7c720b0c9cdd1aac897c4f4c630b03f687fc8d1932b9bb56e5903b7d7c095c223c1525241b2fd80718e0aa5dafbe55cd6717e14f8f2c29d43936720a8c7d7ce963c2c8449b9f9092b675980423602c64cee3003bfc3c93f9730f43345edd2492ec301fd0ee5437ef6ea88888bff74fde39557ed788e19cb7720dc6eb4236c4daf57fc97b7a06dc427fc4459961534ab0143bbac8862f3a6dc939d682de27c6ef4e5b33f595861ebea16a5522bf8f25ac51bafb3d8c1b1f4c5ac298d2990710f8f42490112148a5c6cc64de41d549c0236156c1fad8b0342612cb236e247b9dc838e9e9b1b537924a09ce6a56aefb444050eaffe51608c2e9c7a1d351e5594ff7686da548144585472bc09e28a3056a6d45f9ba22a5ebcdf89aa489a3841a0866401577c23d39003902b8a27803454bdcec69c0ee4e78196b0b07245410a51f30ac15d6efc0e1abb44397026d4743069a771459dccdb4e1552cc35c491b252d5c3fcc967e44087c1dc8f7b72c913262f355071add30efaf7215f53a0d8c68b4e560994dd2b4c3801e502ccf79a51fb711495c8043b3e7f465b0f7a5e1328a8c208923747b412a5055c616c4a6414179144492bb1083dc48982106f23d6cbc57ada2935d79ee17c0054d84f12542d08bda3ab16166e4830279985f54f0cc1a93030849241883be5b5bf4caedcbef6cd59966aed0e8aa6dd6776847c5d2e0ad14d62e3234803fd88f4b0e06d7e2926c12a9073362195c4f708ccc7ca12b7b924d48ae1f117c20d39a5c827a66bbc608d4985250adfc84c440470d81c849ae96ed07e716ac6450b31f8df39af206a4e71e9c27db381a608a78f05f11975fdae56158298e7b88e26c18c698294f8ad92f9986015f6dfe69d55d2e09ec90f2418f115460d289733c2ef7f39826aaa384bb0b4cff083816928189676f536b37172a1b0778cb3c990c2b36175b0f9b058581fb0b10a7784dea6026bc1651a430e12633f34d219401b1ef7716fff5c1864f3b6aad7428ff8edc001310aff13779af7a94f191cfdcd0042c9ababe8d2c55085e62130792654902262701c248778070b27324c65a995740d3b2d5089f55061e59297334100a6245c33ced22769c7f5b8b8888c5842d132fe19ac98b193f64a7f2260ec750ad8bcc992454d58b29d74c3c8ff09b21a9fb3ff5b5e6ef98de4ae5c56a5a5248e83e32344564434abb2254a9facbc884064b628e7729de8809a40fc3ca6678add62e9f090fba0240fd139e1d78c9878903e5433928eaed234fc294975258d762d6ba70ab1908433b90bf35412bd4c626af936c7c2d233209f9b951bbaf28cb70c49807276798a03cc58f773343b1f4071e5c4a8ce367ba695f02884c85c516dac4021597beb0c18d4e3c4902d488a9e76d5d92842104923552e50a0bb423cc078767651b7af77ea989393a67f2130dfd97e38f73f7506ce27d57677e3c4b688d5c8d37f3b7df48227871c81e278771fa4e120180d2980f1c127843e11fec1454bd26be345214fe35a71af51cd3ac7891655d569a41bfc590b6ae6617ffe1a99da18680923ec57e12f75e63b9285fc5d4672c032aada718cca4aee8c830a67a0e0f175a1c17bf689580ff9588a1c6709048380312e0842e0fed37bc0b846805562655327b76acefa2bbd383b4d7b0e72044882caf4806cea211c393fe4625fb42ce504e86035b3d258cf0f4b1a89b9618bb06d599f90755858fc3cf775d41c6fe164ca69f7466435e819171686d4cb1f66c2a736c0ea3e7172e783cd71de109bba952aacbe16e148b361e5974a86ee6e4258176be7183588f9ff4ccc6f5e9b1a989b8b8ffb189e203b9d4694b606c055eaa3e4ece2074a7c963cc77e0625a806c8af3092a15789821a79979d3fcf6b7ccd8e00f375c130790e1ab7bb5a829c385b82c71bef9b8b00a042633d38bddb56281f68a2a7dbd909313db7ae4a42fb11a8b0908a2bff089605e6bacc79722cc84a5fcc34e5e75a7ac963162456b6e2f9b1dc6b8ce8a5b942ef55faea5ebdab665b7a3fe92b944f9775864fbfe84951a79ca9189aa57f7e387f6e31084db2ff51f2cc030ebb9d2bf14db84292d3c9740b079b0d47de2c06ac52ee9309a3fda4c08635aa722a81c5ab630189167c71efc0e355a7146e6150ee629d9c0142be4c13f8f0090d4685f2cd1f6f87ef30e9ca4601ace9d5cd4500994d9f30604e2cfc29a532d8311319e3c4f820bc0689048bf797f7d8307611acbe8d9e08eaf133e321628fc57e9e6d9284ca1a1b1404d0a81d8c09178fe84c79c0d21ee297894a39ed71ff5ca22236bcd038239a36f51a9f0b0ff39c3532b820820dc212d57364553f429747bc2c332777f7d3dee5a8cc940ddcd77c50e666326bde837e80ce87a680e6cacc3503c355c52fc48759499803ab0bc2b52dbc2391dde2b7c4c306ec6f668e5b937ceeb29e2d2955b56413c8a34588c0ee32b70ce99a60570497bd275a0b74a491bc967d93b9e354886c360c4bb694b5a229fc89b2c2f684c5293de12f2fc355481d23d9dc584e664e1f20ddac651c5dce99e1383d70ca0ccaad3645d8a0e5c95051bfa0cfc70168daa78150e60bb659e8865ea852aeb31008d09ddc1c4672cc83de0ab15f7e4e306cd213b4088f0a1bb9cf83bed02bcec16fe7d08ca3955d3e8f1ce84990626e2732a9d0e6d6a0324f6aeaf16362b655c0690e939fca1ff9db9c18ad3d2564c26b5bd5c843c6227a25951d84ef1bb349731c5a542df2d05f4a7ee5011d93b4ad00cf4a8f7c44af2da89e183caf1a6d669e5007a92294bcc85794ce8d6ad98b66364629e4c25c2a896f3e8bccbc96ababf43a1c127572ac98ed826a63a54161b834bf1f7636465e993193d03c29678e668584ee3bb407ba06e1e49164bc51ed3fb4f1602b16d43b1249cfd78560a51364a7867741a04f86d308389ec3e70fc92abcbba1b7782f9d1a07aee5efde24ae6203d4840113eea090e8007aab94117d536e781adda30c2c8867800ed540ff7067aa8ca6bb3503cdcbe8f46cf78f5457ce267e75319011ce70ddef9953f366def49affc6e5acdc9a55b94b5e3c4de21ac71d903d834467fba526299a93d053430cb2abbff0a7a759d942b8256fa327f52c061fedd76d8b4a0b6944cd6de1239c96ba1421e0390296037cf1dafd4910102def3682210fe2f20950b8d774cdaad99a65fae1eaeb5a46a57c3d059b60c375f166b77ca53265c0eabaa6595116c8051b400deb7bed66d942659e81e54824eacfbad11a4b354c913063804608441d3b8ceeb53375035f7e29c83f0c735469c2bd21c8dc7374664084b7008ee85fa1ffc2f69c07a372e634a896eccdd06f7611e80bec33d053a103ede0e30fcf9d514cf9c02bd8063d4afb8cfc5837611dbb4593b1d44a0dfc689a20e34756ee8ad0ed2e24970990c90ea5b4fef4250b1a77974ffc3fce234dc0f2e899eebd0fc931a45390f940c639cc11710f1d1d31527b153aeef038883352d836f518330aaf6cb9f749e3ec084b87eacc430e37e6ce9b2d5942000ba41485d980683048d9f7fcb9362613a3514925823b6656f43b75f30fc7524af7a1e7745d837cd0ab5593dd31b17013bd8eb44239ef2e1b070f11b39d0ace00e93b2136cec66ef4407cf7cfbaed81ffeb37a8ed46854b0ef04fe69f5ff05a2e6fa2dca86636fd5edc1386179a2f0d83b2f8c64971afea9e6ee32b0166654a6f2ec4126121aa4da0a3d2870caa97ee5ff5547da89e6abddaa68e0c417faa26ab6668a37ba9b00c7bd769fe1bac78e8d98f8a30da19064d7547b7857ebfbae4b12bdefdefdce50ac85f40d2c201d4d65f86f7733a51f961ef7faa7fef0a232a9d661e24537147b6a1db5fce7fcb2e11dd6fd702337d01b155a2a62681261be20a0cb8487a18cc86d58a174c24cbd31b6456970bd2dbf932c07fc1a9d580a11e31c348774f523aa0c5914339724730f7add2fbc8bee88a800c4078fb6f85fc0e4855c99a6491fcb13dd082f4f0cde891460e9514ed8d00d45c780c2d83f4fb24c37e4e6b28e5a9fc1513441cc02c9718c32eac769e77f86d6eff9efc87e5a09c9d075526b1a490de7262be29fd5532e82d4a715130db0cffbeccdc5ef25f88705d4f36d1b81d2186a4f602267358f5467d899404faee01a2436cba0ea5b5200e137bea5d16fd6a056a0a75f1148b1c310ab014835344af441861a23b68001c1878786678996466761b6f4a1a24a03229723337b697742681c693bd8750848011735321439080645e4a0dadd02c7d58a4d4c42315400c149ba4718941bda07cc0f3b31a85520003de2d93e2c0d8ecfb4a24d819290738a3209e5f4ae471b030b9e1125989051d5249c1b8c179b1765e286e177868ba0e8e14a9525ae89f9f7c877b056d444d9bdb55cb450b50e3a2c1c09fed11fdd11f07c81937077c4333902c529898b3ec93d5136a30f7099a582a229eb5984c584d1b3657aa5da3597cc69d5f6801beb51578807ecddf7bb82abb4cba2ae742ae5689aceeaa1172965c81c13f21f5fd0ab7c4ad1c9a827d72e2e5ed29cffa768871eddfdbd995f835c5ab4311a56635c768a1f2b6d7595bd138a409d2cfa4362885998711f1230d78c45ec339578dbc99f8e3791f3f02a46f6157781954081f6f154992b775cb5e306891e0a580d07a500949a6d17e05abc886c498a693bd24220dfcd71d47e2aae65ba4d6dab19fbd26a48d42cb4989bb580c84e436446b1ac2093185a3d64ea59b98e9889a499b6ccd5a73553079ca36d2fd5e7ead74a753356165c1de07b7828dd64ed5d8c8b5a50177f8a46e8d9f5b96388c6116dde1c11d8b8f464b92893e4faa3aa2d30b0b79479758c1f6d410909b61c4db943cb37b06c94809dd4bee2c4c0b3f58100145572aace4bbebf29d9d784ee692adcddab02a8277701cec5b784a5029ff9fb9ccbcbb7000bdc73020bd16ad90ebbc0f73df2e359f1a35e7f55371b944baec8b4f260d15fe12a4907bfece9db9f2c20c9cec1f626aa56478c5e3a04c3a2da4850bca4758a254465f01b7a025bd3310981ce538dc535d4d8b65a2b683ce6fc0be909cf33eb599a1c3c243a9fbe24de262df15842588a3c70e05aa6171a32791e03240635e654395a51a82519047fbd921b0c954ba239a42751f2d586645576af35c1f1f81d4f71801e6cf14504fae01c97349521e52be37523596e09db19e4c895566c7d9b5cf1eb6e25c52a4ee44a42df0d7d182664da05b0b22d2207ddb0b06cf0f86e6812b2ccc7f1a031d749589887d6ee3d7dc19331bef157ad6a7ef68088243a3e79c6b2e12d2f290490b679fe7c5363cd58c94f3feeb39515d0d5c1e68001759d0714f3c52d084d061195386fd8730685633a000c0c6f3d6628d8d8b7bf17975960eea8f7b284ccd18e82443319f59cc0758db59008907cb23b562ba99a509034542f6aa9dd12de6f0f03785bc36cdd65e3c83b48c5bc91649ef1ac3188295df4e4a14e9f02ae046cc9384258c257ae4e46ee08a469cd70ac20b6a7d7c57708a41ead3b52835be7ae45e989ce0e1c7301b511bfe337180a4765c67fe19a32a624b1f4735a1ad6ed173d3665b6bc5e847930b49092f7a1f5751d67249dc5a0a5c6eac347b51399b750011b671b202a95614b00a08f308851cb551dad75ce69054061b25e2c8f489821f8fd64a43410443c8fe8af0efb8b448762655e660660a9eb1c171e8b36710bbf6e9cfd028b591b22714f0c4140290120e55e8db2bcc5360e581c25d1792852bb5ee9e3407e2bcbabac4e41202a7d639449eb07d70bb31f430c9f0b7550e1ae3d0230cb5815aa54fd86e4df4316ab1eda7357ff2472664f6ad28d046a7878124151ac5c750c8514d6c8e54450eaf25872b29cbb0917dbd71fdc6c70b15245de33113ad82f2ca9c8bd63b8863fd85694966332fbace8901abae817672a3728a133342df4d79507f457e731b014e34f5c5e5ea7a1527372a8956692f3e85a1d2ea30f14b22969b16cde60fb6772a4854d7c8da644f85c1e4a0b594ec78c074f06cd6425b5b389f9c7070f166105ae5d0755e67e136888788060697136b8c77a340cb94f71a8c31ddf1e22578ecd1b4baa0e460e48fc927f909158086395bc26bc0b8632e7e67685912d0860a3cb36f5c57655bba9e972d017e70b8c08a9fae904edf169890efce46250f08f8f1fda1a5bea875cd8a7419a1e08d4e6e098a488ec1cf67ab9366e5cd8f44d7c16eb872cd88a828dd0f32ff29514c56d9fc8d2e4dcdef625cc24dbf5f60fb8d408bb28a4989928c9bf8d8109b0ab5036f902c41de42bfb304dc219472116b05637d1e55bdc74d6077956170ea15a3857587b96981d4ccfed41963c1782239df90712533014231fe530b4a7f445d71373221da0bdf917e2b54b72a58025b5c95eb6124f01d8a88ee5e953b37c22909f290e8a0ac2e68450b2284cba2dbd018184c84a95429af6df0e9e8164d56a18da5e3c5472ab3ae930264b4d8d8147bc4ebf02dde82dd43c1bb49b0c6db2983cf9011a859c4f5eb2bce115c62f1fc80031e0d2e3a41db004be37a73014b288481bc81abb57de00ae3d0d894e39ed90ca61103a3d40248b2fc2c04089c86feb71c34634c9a1fb9feeaf80da562cac2d573ff67bd1a29d74df43f7cd40cd8d5c0c6fff904d4b749bbb85d5bfa4c4874ac4ac5e4a4220b7aee030c82253e5137a55c5ca8ec31d194b1fece46b3c2b61d96202d1a42aac60a66bdba5cb7d221b099ac7cbbb5d1a5d8ae6997a6e97431777a13753fe710810482baf8706c6f2a064016f275997b1abe6418533e218d76786e2e3273605652ff9ac4825a23b562ed2609340a847ab00fd7fe0682c69ffef059fb4a433fff469dee5b2c3da6c9c57c52a7534be9aebe39dfde4e0eae3b293c28649ffe4060a5f0685bee2745b61e99c383de35062da7a963f66f489111821b2b76482768bb0bd697d1c9aec16db9c41d886c7e10b0c1fd6afaef549fa287fa8202ac04127d77dc05e88307adfb1b745a8ccbb330b42501858fcc08be2ecc75f4be3df8b5ae7e833a12cb1bec8e91726332d9a406ce87d5b3f176c031857706e4db62768db81f13bc7017f95b825f5eb6b9bd0d2713297a80a3414999e7af5a1e2ca25c912d212084f6624a3d522ad169ccfaa66ec2e5e09635c40111f7abf54e639db33cb5017d73fdd88dce0cb0830ce14c42cc4245c1703bd55e17350c551a6dc9beb2a95ae8e862967a59036c7b77d4e94ed9dccc3ea549f4590eeebe42c27774a4cbc74a300e00c93f61f6e3be14eaffef2b304186e5d968a1c425c977702f3f402dd904e2c38ab1feac5b1889b27c49ee5bc07af81afe3e862cdbad00bd35d76035f4cc4582e1ef7b461ea13c0d3a35862ff36ae4e26ca8e1d36a83fe53ae59217e735f538ebdfad4f5cc773bea66f37580c906adde9377dde27f180060e093a3b247c20f2324e07ff34b4c5dfdcc887d28069cb040bb92c461afd509e246f325b9d998d440ffd9113f6b6bfed0abfeeb94c58549994dcf5f182d4613e9c94843f98b3b60d318ea3b5e029f4c8481a4529dc01741152fe5f3ab63c16620036441636bd8878d3a1e06700c85ebc75a205d98ca2c4b55622b9127d53c8089bc26d45acbe505cd7902d43c6a8e1534477548b4a2b24e2ddc17ca5144abb49c4f9dd783fe8c748d6a2060ddc5419f8dde0e5416f8994a120c39b82f762f86539f44142b405efb619ed020a84e4e4d44073a1c8555b00d012e7a8b07745b33bec16c7738158501f0a80a14119643de433036ff5841238c7a53f628267c7c62eed8c1821d89c42555352b8ec0159c9125bad3b86fc81a96e755933d2ebe201f586b7edfe014ca72e2eabddab12aca9de48a0d22603158b667ac2ebcc77c6ea027069e3edaa04da743e5048da501a056450d19c1e082e398416f21c91bb184bce99d149a70e127c68ac782de6630fb563c4eb0c6909a683d9525704244a690ac6c88a29cf6fc06b04576e7a980fcac3dac2e4ea24222416a49f06e2c97571cb8cadd1f384ccad60fcfb0f9d44748d9ce9ce8a23095adfb42f9b2f874f048632d1e68865b5269930d138f15cf13fb28273c52b7d58d197705251224a74618b93107eae95eb477a63c530c28f84ac098093b88cbd70b422a174c7e9d820abdbd13b4dd9c01108e22d51099969be4c065ea347b2340cf9976798c6adec79426ce7ec329d470a440cdc2c0157b96f81a58e9f1b631c151fc8e00abe439f47495d9a6070aab81542f86909549e495d37e01f037dd51a73cf1950b65c661ca329fa48104e2069800a645ad4fdb1c9de1a515e0ef2edb097893810dd85d2343b398bec78a119b042cc3726db3e8846dcec217f42d8440c599c0f6c0d0e85b5a31a6e3061bfdb710bff444ae03259ee612527244cf84523c7fb84fbabcb138e04a0508c2c66264c4ecf552a6361c87dc440fa4bd44fea5a8b30fcea0bdff62d2bb462163c94a88db6e928e3d8c333e32ebd36f652bae471a40fc26f4c7ec16ad09164e43df4a8b9f7e767198e640494fbc767c3a818c4637aad77c0b6a0a1187c0bbbb2e4608876203971a5c3bc536ae92d875bf74ba7ffcad4501a9dcff882ba903cefd1eceba256b5045823dfeabf46fbadbaaaa236440494bbbb118209d964df7e2016b826a821803492c0ae215be389c1f098916597fe15d6784c016c328d58906b8637b9ae9156869ed7fc5992ff5a1db63f15132d3755c2cbf871883bf0d3867d8f03e66764b785f9e43086c2121390673ba3f3f9508164a979a0fc2160c3abf317d5267721f4d9845eaf49d81ce29f3a591d8db9fa06cb8a19e4e2e534e103a7fb7a3203d12e33167a7f6c4b716f6e70dfdb3c8fc657349f92c416a7bd6f285756a0e91fd1bb3bf843fcacc055101bd9b2d5786ec84f8071a6dd653519a872fffa356e316967a94cd3e1412fbe9fc43023cb1f41b0b92ba42d9d7fd27667bcb36521161f35c855eb9468c1ea203a78d45d6f17e163a3f6930a8f3b2abb92d991ca45851c37518c32a84b6497e9d8948d97060bb2bd98d8e361f9eb8827cd43c3e81d207aa013c61b173b87caa4d8ef3f231a50f20d38195e31ab8b78de38151b4483a70e80f45a1a994f88c871203555fd9488dbb405602db3393408932be20094f84f65d9f44651d9fa8e008cb10fc3358169e12a6f3da22ad318d6ca477fa181be6d2a849a30ed43882b250e74372d4f38d92850d815e4bfb086aa643aaebeaf492ffb79055088df9c6bb9c85d5bed326632f34344defd5790d066e3ab1470117fd7ce313bc70abbb80b70143a35b81f4ed9b5c7201405959dac77449b2fe0621547408037069dce7341547b9a5e0b5db70f42b78f4db574407486ad470d4e2838bbba540c4040e6c7aae4fdddabc3956cede0ca8db3c886d4e48e2b856681b98b69edef67040d5dd21933b5935e59bc974d6d0359a1b7d30bf076602b35862a3d4417c44ec24b48d1156010e9a75cac77e73c77888563f31b0f1544e51856a0784b533d673558ed2f123a5f83cfc5ac412bbe832e90696d81d0b6e1394d4dd05fb611e44847fd951af6265d02a189b99f54410a275bdb5b008408dcfd54197760ce0071570539b6277d0db9591e99f2f215bf96e28145fb307c2e4151f44414085ad09e103b5aaf3a26d0c1d97d15ff44da25548f7801f00171189f68116c14caa0982ead57053fb69bd036efb8efd00ac298d0621a865d949a10c71be8cecb8a5e661d362c57f274d4b7456e9db9710b61f636c5fc3a6216c8cbe17b5710ea82f58a2ee6173d4b0b7b129d5583389b1ba6c5368ee25a22cdcdd062a0c23c75aada556c44fce4273f3fbd9b284b6e85ad9f7d17b35e0a9e681fd6ba53fb2010612fbe37fadf605d8bb27bc60d83030be4e58d70fc8be452e06a6f4f601b76b48d502b438b26376904a6058f5abb4113dab73e3f84c9f2ca2e2db0285375cb8e01ae25012e864c84b3e78dbac7e15da61d4488e4ca0df721ed406ce033b1e8245156a50820220b4f095212be626fb61d85afb153feecd0fddb1209b10a195830ef0cdbaffb73179446cc0087a5d5d008ef807fab3fb4b62ebbc2c259e211271803c834c943ddfb07e9d9630237b52c52ea7157d4e9157a030dea13a759f1394f247e5d460f0f002b36c1824144367243bcac6106a4294ef5c54b7b404ed821a1bc23d0f3649097e13f7aa595f8be10f1a0b0db0872c39dc02b9f4d9d3e755f9d0c3781f8bd2107d10979b064899b54f3098b4b64ba626807fd584b406f356af5d966d3ee846c72f69e1a7f883484f43a20245a353ec52a72b8b844cf2ba74956ad102891ad304948e6d51aca7dc6e624eea30f53fad9cfafe6c112d4177fa2c86e0157955198c28354be96abef237463960cf8fa8a5e7ccaefc93e641301ab3df0d01111bd487920413f4429ffebe65f97b1f28c25c9bc69038eb4731521c1c327ee227fc16b5ccb916cc237077f4efc242440b3aaeb2c616dca76c0fc9e486b0898177391d113a036153a76af1f0337fb26524aa3945c8eec31f846bcf95a01f28fb3ae9d244c54c432f0fd721426dec5be34b96f7ea5803a25527018396e1f71fe3d9e172d627249ae1a461d2c6de28e3ecfd1f72d0f22da7b3423c97054cf12646bef05a2459c1623682f0150591ec6278ea0d11c22e7aac2f2c77fc1254ad4ce14c11331d50165ac5bb823517e34d4022ea145b86f08e904417d110911dae8d4c34cbf19e06bed14abcf4018c0c0aa6594680d9adedaaacc968d2e4c404ea279b0ba3f55c0dc2131d916aa0066350d905f0bcfc0c3798500631d07e141c86d66cef60d7a4d3dcb5363301921ee9714eb1e96b640545556466870fb9a1a8bee7a3be69a258b346f40c37d9983ec15343c3011afe9d5f017fd4146ddd0a599a66b08d52508c4a068618d1c032a91caf83955ee7bde09b3174d85819b310b928b284c1d41cee93c321668b0bce26ab2da5f85b47d4172dafdef1e0cab94fd42023256f7137ca0d0bb7d4bb9474c74af5b384b45612fbd4e17d88242a892589522583c42a457310dc2922ad323af6ade89a4fabf0a03f9e63c4e31d787489c77af53c544a9b82462d11a5e42895dd91402d31b0cb2d34aa061cbf6341a9e8f27d3d5f18b67f11ec3be53550b97f90b7b67d82f27a9521db28573949655bb26ca7cc7dd7c4018610e53e3f925b31b5a0ad942df57648bb7b610e192fad1d7585c5f4a7579d155a2fd46df1186b91fd107e8cd13574a675d5cdd9e74c1882cbd5bdd752fe47ba3d9432aa66a6479d78dbd6d495a39821aaa3375662e5f6a4e415118b879c4891a09b2adcba09b0319931d263d6ee5ec24846cdfa2ea356a94f68edc150da00d88dbf6df036da6d81fe2d40d3c259d585614bf1afcf8f5b783d0bebb4602c2d78d78273050b43d240bc6a582c70775b18820ecfeb08c702e526160651778f9e61b290eb2ed81b064f9385918c01f271e1510f9d6e78c9b494287e0898d5e2c00fb1eccb1e06f529b2940af840a526af12208607ee4cc77222ad3bfabde5ccf27457f0a159aa5b6c3b113f03aba7969540137adf52d8a10b6976851728db6b93362cee979d9515d6f2a2080f159e45a3dd16b5303b51f1c8d3be35adb33e3ea305e01f91ac136cad5eabd3e47e5203b9bd7763d7f803ad65d59cf61a13b2893cf7b94570b7438cb37486fc38734a231963c32cfa2e28672a5827bafa7c6c73619d84d78978b531cf5bc2f9d512f9b3d2b9fad4288a98f8c6ba3cf6e58716c0920b00ee8a88a1326a43cb0312bc58f7951c0e129e523366abe28e27482f40fc5e4ec8046b05c0c300b261bbab275659d226522162fef396c46abc936c968c6f462b1034906eb8aed479dea56269c8c5d07633c0ab94a12833b4261066cc229c750646270f08ddcad971482ffec50a6610c0839d1dc91e0c813909b6027f683bf4e66f0580d904bdcf2d6de75c4574591789c346b64264e7a82c01e5ed11a7f22b4685ac0b69690f892347e26e19cb7454c69a15d928a095609332bbadcfc325f7b7a6162e86a7ef4f9ffaa5ffcafd0f13f24c44713f3da7bc45dacb41d9e1432faf479c919e063767f3369ba797bb34dfaf75f3f956d9830df3c90cd3b6043a45885cbd28295e1db6edaabe7911e455fa093d104c651bc4896fb0b184ac61b10e9f09f2ae1960e303e9fce56dffd7477de28a199fb6193eb2a57b4b22560a5cbb2293e67c08847a96e4f9fe17449ddc6102de5704240b3540b2a4d001ffffffffffffe725605a4231e151dbdab7b665da9749ca042f819230cac780dc29a59464d2761984d00b797b606f3b170d0be20b8e0ae5d5dc69445576c156122fc79272ce5c932ef8ad15a5475b5ae53c179cb6c91ba12b03c10597241b99c474b27ff505720bb64f27d5d70f265f9f6cc157e8aca72cedf67b4e0e20b56073a67e8ef9745af0aa9fbc63297d16dc89ce9d3e5aa632af65c1e73599b457d468d12e482c782ba539082cb89cf25e4e6ddbcfbf80bc82b516a5fd9a46617c140b3ec2f8a8157c84f1512af808e3a352f011c647a1e0a30529f8f803882bb89c429b98762738d65ac189ee3d963b765a27a2006105d7dde79ec4f3261564156c65d714936c62aae05a94249a5cd2c64e8f6105482a38fda6bb1d3d985892840a1054702546cf59526c8b51d4c929404ec19a66c7d8aea6162d17828f303e4080a3470eb661630763e4a0038829f8de35dbdccdd163b2147cde92f26ddcd027296159523042ba655dfab6a3e0a49e9c95c4749b63cc8982d14e82509663c994942643c149d131e69b89e6319a7241c1e611162ad52d557e7f3fc166d1f1a2768d3cc1e874dbb13dbe5ef0773bc1595e4be2793527597f4e7025694c9252696329b153d700d9049f8489f0a423b73c694034c176fcac62a9c4682618b7710f91fa266d00c10477426693f5b22ba5d0eb2558d331785e3aa12578d1c93bc9995e2538bb3bbff89d46e752b10184129c5d29a5e209f62412215c754c89ab69009104af962d4bcabf414d7455072091e04da9986d522a398ac88040823babb392e5a2443cedca03e411fc68ad182de69484eab6078f1c298081a92e401cc149a783da746a4cea24db08aefe93e4b163954811d10b208ce0cd57db4417f3ba00b208ee7bfcafc2a3208ae0b206cfb96a4ac58a3989e02fd735fd8877a7a6bb061044f09bfafea97b3729b1170d208760fb422bb433f977ae1882cd9f56195aa285e0f7d5a4ec9d54030821b81195337352cd20f88d22dd2459638b2e590a824d629097aa25760324107c8e6562eb68f9778ae70c4000c1798ee117db524a59a782fc81934cfad1c95cb54e80f8810ded92bedccd4afa65c306481f58db54bf9db32d08c147181f36ec864102840fac97cae972922b7f9b1c1b0906903db01574929359255d1d73103d706b2a9e9247e540f2c0a91c648c31293f8f29080f9ca0cc946d8bc91db8d396b4efb7036f920e11ea4135c9f9ab031b2c57050d1a3a306ada842ea5b5a4cfe41cf87ead13cc547bb0183970b9738df0342edaafc581d3984ca80c2d6db31a0efd9b50d76ab26b500d9037f0ab666fa9ca9298454cd20071031b33a6f1d4180469039fa1df2431e6b8d14b0e840dbc455defcdfc26c87341d6c0bf9f6c79b2e9133ac6d5c09f983da8eb9225774e4a039b3e284fa75e43c9f240d0c09752cba74c93d7691fe40c8cc97a52e9f2a4a3b6098819f8a4d42d77a53d49561148195853933746731d840cc56cb93c8aab47c6259031f0414fbceb202d1c8b3d40c4c09d947495bcd6fc39c343870e1c0777808481354f25a9a4c57c93dcc1b1d6e37e0002063ea3d567d56831ff461b3640d6e0ab34e36d8a96f305f64f3c413c087981b3d17f3177cc2706cf11438c1cbee35b60c3860d1b5d60355a32e982dab8c07bdc4ba9ea6b4927495a00d902ef19e3c68d39ea5892ca028816389934fa26abf30c2059604d5092acbc191940d4e02479a45baaaaec1a333380a4c1c61c54491d6c2cf0d9e4df0c6ea1712b650c2057e05adb4d7d2f465f0c767c0b92322bf049cc1fcf5cc221981480a0c166b490d67b4a3800a90227494acc793ff518809cc17daeacf64c55167fa3021fe47ace7b7ef9db537e0099027faa6e17444747d4480a8c923fb61583997c521d05ae73a9c92469ef126e9580070814b85056ea426b12ef35fe046ed57627f0d92a57eeb65139dddd043e9ee09a6c3c95a73d6102fb25fb86ae98eff30497c09df6249a976f206630727f94124f87c9a73ca33c0051025bbd5e824a4aa8933ca9a6ec04204960bd3c6ef9899d6d4090c0252926df937cdba40906a3f7ed4907617d2560302ad473e95c927ec1499fa4b01795e40b468a89215357922dd8df0b4eceedce4bc2d4b57e5ef063d2e66e5728a99bdf059f4d7b4428d1d7059b044fa96ec4366efab9e03f7bde642989d5ea3d2ef8cb74212d98860e22740b4e3e75179465d82539c8167c775f096a1d42ba8e6ac1eb6ed0bab9a7a6b28816ecfd9d2e2d59fb5ba25970f9d64add567a2ecf910527ccdd324cae68bf4f2cd8bc24e94f426aad7a07168c52751adf6d7f0597eee3db49f2a6979c76051bf294a4e437a97d37dd0a36ace3be2839c8a4df66059f35a698f43a7a3adaabe0cc445eee131545575a156cd709cab3eb4effc4a48255939ab265e55d491a54701d93bfdd9d49424d730a6e545dc614fc5afc3f8b9747d5a8149c90e7153dd826294c1252b037d2c4e09e3d074d26a360bb7429cf15531b2f1105df3ac2c3ff3ce8a6a1e0a287a9e4698282ab4f2725e1efad39b69f60e399ec1e4dce4d926a3dc17f8d929a1def0417df34495317cbefe4049fc23e6fa69c6e824bf2ebdbeaa69ae03599f6b4d9368d6e32c199cc9b360725263821ed5653a9e4251813cd43c99782d0a94a4bf06152544c335809469d74e209b5a95f724809be464b2ebd1d4e82539ae3e532f91dc42309defb577473ec507d72916094bcd020cf0309362db7a5dc3e82132253a889a96b4a7704fb694c67aaa42d69b4115c29dd122a9e6a9930823d95be5e3da4473517c14751e992e65814c1ad5bee4b6227117c4eb5d1d641042326a8698a7988822c7943f0976bad742eb142b0a57a53f0a8158e1d23c78d31cad881d64308af4608ce829262dee5242da7d120f88ec13e9b58e9a02712046b425b97f294dac43a0582abab20a2d54fa5c73420f8bc41fd3fa7fae441e50f6cf2be4dd3d9f526ef07fee4c874b208e58e2e630737c628638799c9c1471f785141e824dfad8a0ce203a3a349052fa57f4d4eee813bfda8fa56a94d0926217c8f327c70e313bbf1a1073e55274f4f42e53df13cf0de252aa8123ae73fc1213c0a8c18fdf78107be7544ff3593c6cdb531e3e30e9c8c294bba9c59bd0104e3c30e8c85d29cc74ae8c50b2a01cef8a8033f324fecf465b94c7cd081bd0b95479b1cdfc5c71cd8912958dde516ad9ac3b1b6bbbbabaaaaaaaa9a9999999989888888887877777777574a29a594528a999999999964350b07c08a0f39f07e6367164b5dda9de2c0694f25b70495f26c5470e04b89bc3e1def923df506ce3e27733f9197b1533730e275c2fcf2e6bf4ddbc0a99cfd723c648ad9e4d9c049f18c5d4a303154ed6be0fb46273749f37592f26a38c2471a18d3ffd3a759b2a6894103e741a6186e7255ca113a0327639ddc9636fac5136306f684df9ad6dca6af82cac008a5b4931ad1e6163764602d3ca791a6ba3130a6e45fec919618b8f5689e4374af73bfa30c32c2c0a64ad9db6a95c4be8620041d3bc0c0af8e965cf7a4f29be81a6c5fe7f6f312adcc24bfc055dae07e6d274b8edd1a1f5e602fd4a41ff56c173861f2d79574a3f3c454173eb8c0f86b4aaa4c94acda295be03d5b2ce8935e2b7c6881cd965bdcb2ece3a51d8d8f2c70a5bb4e0c95972a4a8fc2871a7cf2e09d4525213d49591a8ceea9cecdd99764530ac30716f8affa53a6e92f7c5c811d0df14cd1ad0d3aabc18715d8dcaf110b3ed0602f556e50a1c1f2fa8d632dd9c1471518992633c54ee5d95a7b220c410752227c9cc18e5c4d529eb858ce6211c20715b8cc24c6a4848812b305081f53e0dac744fec93129991b5fc68e73fac6187daaf4f890027e4481b74fabd95194e058d331c68d64c707141875c2e434d154da0ba1311e08bfe309fc2969ed26474fb89663f429627c38c1d7cb78f0d1043e9364d14d3aaf4f821213580d5dd295da30b1949c25f09b7c2b2c84c70c2e83ce266b893985e794c0291953a894629d04eee2b8063791b1118529299950274770a53c4da3498255db084ef01de569bd79ca6304a74908d1dab1b407cb22f8d8f99a4f6e8a604c3a95d39d08d6c6cd4e7f4c8f314304af26093e2a2bd8670ec1be989c9d83bed3ac2138b5ff96ecab52082e6ad44d295508c1979c97828ee7f5aaca20d83049923628a961a22408ce2cc934495220d8649ee9725797142640b09e4187bd8998a8f93f7025dd82f6fee8207c3fb02929490c154c6f507d1fd8a0c40d1af407f3e4e103ab4974ae5f329d92670f7c6df4136fd773785c0f8cfa8d1dc2cf032373ec4b39dfef36c703b74965eae62427a9dd8113bc440fa26a3bd415423de554d78131511baa6f3a7bc7d0814ba1ab2edc4a905133074ed347ef241a5395123930ba9671f39fc481512754ccd368cf4f02076e5bfd4f1cf55f3379031fc4925daa0d6d82d60de532b104d120e62256c9401b3831953d6d5b08215c36304ac7d0a393fa9d6ad7c09b949418c284263948d5c0c91cd32b9b9c3b3b9a06c6dab6d46707915945036392cefc25bac78fea19f84ae57e3a6e8977a71938b54a9681ad136f4d78ddf8956460838e9ff6a397343dda1818d7de24831aa1b44613035ffe1fb395d2c2c05d4c8b5f52478ad21918386149f6a4643e0ff2b3353825bd8eecb2374b39fb02972425c54b6db5778b7981ef52b2e5cd5b6ac3625d60ff54f433b5bf0d997181b3f49f2cfdc413add91638db55d7a444899ebc16f828b237ec6ecf04a12c70bfc1b6f383d4e0466f6dfa0e936ea1343825738e7d2c31a6c9c102d7c94a52d946c852fb1518d754c9ae4ace546a2b701fa23788495194d56830a6efd35def0733992a30fa95ab769aaedf33381dffb1d568d9dc840adc095121afea4c5f9229f4157c54a7929402278d6ed3a4b3e525330a9c6827d6df8750e052bbf692a6b35bef097c1251aef9f62a2715277072847c6dbd348171ebedbe8fbed533811b531963be04ae3f6713649514ec36834f72f4f3efc61f5509bcdd574c7ad7a104d5c4e86341069210810c20e1432418151001068f217c0f2e20f20b5ff0f00104447ad100115ef028a347f7e0e100915d4c4044170a10c945d2a1630719b85880c82d7ca0820388d80244a4162a428b1ecfe306106671230719206080882c2420120b58bc020122ae18438703445a6100115694c82a74a43172dc10438c3e6288d161a8a20222a94045182a720a536840a4142222a4b891830c10584064143b104528de0122a010438c3e0810f90404443c3101914ee42003042200c105443891229bf810d144024432818908885ca28c05885802032295e81e3acaf8c10d1e39c8008104442831890f1149808087183a74b4000322911011814422f20894e3468fe7f1001147f0f81c141069c48d1c6480e002228ce0f121b2881b5fc697e1821deca063c0011145f0488405441011019143dc90808821202052080988104205081019c402440491009140fc0e1d6114400410ec7d98f795d0233365ffc0e9947e3f68eec919227ee0a3658b08a125c5e8561fd83f5dd9adb137227ce0360615913df0eaa5d9269e943356498f317294f1832288e881f39329f697637c900736f7455113558212db8520820736df5996f45b9fa6ad3bf01dc73d5ac64cae3bb2032f1a4da9ecf697ce4d53072e9a9b6dda5237f949e8c0464fe3d164a97360d449428fb6682207eebdf7373fe5c4813f4975666e2f4fd7e1c0a5cb6257bd63edb97b03772157fddc32afaf6ee05ddb749235fb5912b6814df2c6a4154d59595547840d9c9fc8f5b513269a9488ac814f6f7b256c64226ae053733c793905edf9fe34b031b424e15779347099b34c274de29624a25e94fc129ab62666e0a4dd389e7312dc3dba65e0730e199efc36cda4950c8c4c313e062ed58534312f29064ea62cfaac378563cd129130d8d94b1ebdfa70ec8e1e641c0e11309cc81a27f28513f1c28974e144b870225b38112d9c48164e448d1349e344b070225738112b9c081a2752851339e344a87022533811299c48144e040a27f2841371c28934e1449870224b3811334e44092792841341c28504e342807121bfb8105f5c482f2e84171784905d84e8821ba9292378c1472e2e041717728b0bb1c585d4e2426881aa76878e3278d8b0f13bb061035d191f3ef81e26f8f052468f166304366c8cf13d7ab418e94c006e089905bfe2d549bae5f4d6231c9b9c2c2e24166c58a80c3a3fad2e69d10421b0e07e2bf4d76d50a258fe158c5e5eaa98973f9914ba825361a9c1c43531985f21ade0f5537bbc4a924a49920a61052709426f67fa0b268719b20a56a4f7ff855a3d72f0d041068f11249c085145319df75e5039ba584252c1c6f39354994e631f4250c19655d0491aa13a057b1bcc847865dc4c5138849882adbcd9dc2d0695a4da524829b8caff39f34449c19b8a5d9972294949291dc5d7fef77b66ddf68dffa4a2606df74db99fb926c19050b01f4fce56f289c14108284c1b1acf94e8c69c10f2094e067939ef682c4198a9ea094e9dbc9b84997854370b00d008e904db55d953f692c4746f12c209c69298596b9997092d64139c2a49cc270956a74a4e12a209de4c923b6b9398184232c19f9856a695e26a6a0e26d8fd3429fe65c956d9bd041b2c5dcc55cb12fc282ba59b4cb212fcc8ee134ac99c4daa9c126cc6f320ac44336412ac49cb2e0d3275094a5c12bc5bec32a159d53c7e91e03d9ea867c7acf28c438213d36add6a53fdbe097904275bcd4c49552945660e218ee04d122bacdc5f4ff4ee843482eb5842ffd2bbf5d91fc20846ea9569cca371e36771ac9923842c820dfa2fbd59b725136370acddd081ca144214c1a935dd295e8919774489e0346875775bc711c1d78957794d9b86d2f010ac4919b39f9ca43caa1c64b4213849895fd2d5514821f8dd347a295d73de87105c8c99453f73335732e158bb91838c360685904130bab269dbe711c7da0d1d2899102208365e98672e490c96475f061981e06c747fce111db5268400828d96d3c92e2a5208f903274992c9d7d10d1d7ee04b9b6ae7df89712f8663ed4ccd08e903eb5aa206938289d4bd7420326430060b30008f08e1037f55414fa816cf98a13df095d924f9a4248a474fd2037b2a79aeb86af2c0c692625e7db2a8f6080f6cd29cf9c4f3db92ee1db89c47975a6ccda35662073698a01a749964b0600739d218e785903a30f651735252496ff2d37708a103dba77647f68f88a82ff81d8cd138e81032877a44a7a4922466840891036b6f9a9fcce399a5fcde101207d62eaf29f9fc7f4f5edb100207b64ad05e7ea2e528b164c3c6bd81f1dc49924db2f50c216ee0a257dc94a29a98a56e481b18ad9f6b93878c39a26303671f4a54cb63513b946cd858036fe671ed848ca1cbe4d5c0494a8389d1fc4da5a03278f0c89128084983a99210fa9952ca0841033b2a8ee8568af9ae3c38d678ec3803bf9e73974edb256ad0af195851f1b2c754cab2a737870ea5414819387df30f96f2fb572e082103e7fea1fc244992a29ba00d1903a7a4876de8d339e78f3b769471121b8488817d2d29552d42e830c2c0abc9d4372656e9272b080103b756257889b1d2743338d64ac81a5c9f1c26069d6bff198463ed06215fe084ce5b62d9f63ac8af8cad41881718d330bd671ec5b176b20bec690699639ed2e2a13174f88d21ece8813208e102771b7bb3c7923a7f34e1581be3c9d071e3fd868e1e377aa0e34c0c42b6c0678e5def296830313cc4d0a1838cb5b5102d70edb14b869527070db21092053e9a98384a85924184a8c1bbc9bc33fda1d46e3e0d3e6bd5dadd43e751278008c102e7f1a4b54e31c90db343c815f82cca24d1ee55b229b51a42acc0a9abc8e83faaead4db5f84a0c1991c356fe878928b902ab0e39765aa3a8a240839c3d14970cd6baa84721042053e65cd6a952799ce497e45052153e054c537192bfd52602f45ebd726e9fc93941c42a260da1a4d197fefcd43844081d1279812fb5fe3c7bcae608d90277092e41e846f27f93b495ac147181f25208347951027b05d9be99eb34afdd9e57c10d204b68465ce499b4e62fc0e131859522fc91fd525b077fb9a2e7bdc1c6a33d833215b2c3c9f9862651711a2047693b7792e49661dddf808e3c3043d4e19680c13fc8e32788cc12624097cccf9b4e8a68d17df1482044effc4ab60fba627090583b1118fed9da9272d0718acb97b523f2a9eee925f707135f75234e30b46880a4229d1682f38a1f2657526495e70b3e05347884942895184e5b2e0939ad0d962792cd84a494ea73b2c080b4edc36bd825351df354925573026896b2a5bac35df0adea4ca9235e8a6d03e2bd8af987bc45d057b49126d73c492b4bc2ab81c69e3fd76ada25470a2ae7a922f4305a3842ed962da4fc1066582905fd929a98f29d8be36296a4c6939e69482efdf72f75cf2847948c1da9f24a764957bcb330ab6aeee7e647f76eea260b4a411e223bbf4d3a1e0ecda84890d0a4eac14969be927359f6043473fc51c6476497b820f259554c2723d844c2758bf68399b1c53f8ca0976d5549f96923f98c92638595a543da535c18f169944c63513ac9648bdec2607d1292658d392f5f45c4fcef4126c757e49c13627edd312ac29d14ebeb236796725f84abfca19ec547749097e4d6db2ae72126cbd4979f27fa54992042374a9e59f1cd31a09ce3289a6d7249ef221c169ae7e06111fc1a5edc926858ee0b582ae92a3c757af6ec4e9639adc752746f097a4c96d8269116c062b258dce310fbd2238395e6bd0a0edb3f58960f386490d11c1280b1d4a7c1d611674084e379994173a86603b75d36350217837cd27bf643b39c609c16a8be8e07b3997d020384ba164a66c19b22308563dc74c09cb9c258160e45ea709bf6492ac01c19e982429eaa14693fc8153914155a9891fb8b57f31d5fbc0fde853826995e0f7f281133dc7cc9f599398ec81f35d4dcf5eb93a7ae02f44a69990264acb3c70ba3a5ff7a74e5dc2035f415f129de48b6a7207f63cadf607d10edc09d9a17fc33af0c1d275d2dc39797b7460f3dba99dcacd81f5749564bff616ebe4c0c9f9b3a74cd3577e1c3877dd649b299d8f0a1cf8cdd831097a79031be4d9075522ee5b7103ebd76979f465a86d6d60fcfda41b99b18135c9439a9c042bd954660dec995c52033f26c95cc99306b662a5b2bc20e3ed686073d29dc4edef5efc33b061a797a4ada462c60c5cebf589769fbf1b2a03eb1a77ef4acccd9c0c9c5a5b6aad4b828919031b3f6b786609aa248f18780b3aeafba59274260c9c14b324cbed5937eb606063e78aa1c4eb0b32bd06bbdb673b965465e90b7c4e615a974fe9aebdc0094f95b4eb6777922eb031e4e86cfa5316950b7cea943665f5122b66b6c0ad85951cf45ab034369085b2013518edf9df7aa469b0fe79a3dae53325a358604f4e69d208992b704a95daf793a38a9e56e0529749df6a69949768f0ae632969933a5606abc0584a16acc32c28153c83f3d49e4c4a36dafd2554e0bcdb6b3feff59494640a6c8ec9c44605954f6d891438afdab713e2af39954481fb31b5312fae694d2550e03aa66092909a314f2a7902233f28bb98ad36582a7102a7475a3acb6902a74d4a928612967286095c7f6f12ea256ebe04eeabf4e54ecab6ca64067fc23309d5cad1bb12f85079a2728e08ad49022f329ad8614ad34f3680042e9a26b1fde482c17596a815e927880c30d8939a31e5f8a55fd12f1293a399a43fc7176c86f0a05f737ac169302928995517eae1051b2b6f4966b235c877c1a9d790594c5b4ae2ae0b46de7d2a957a2eb820af83ac125775745c704ab2982ea99099d4be05279644f7f4b72db8e47d524cb22fbac8d4826fd3aa5049acd0132d389117dca4f42cf80a3ae496892cb8984eca9d25a93a29492c5813aab67a3c58709b157437449bf8fa0abe242958746f4db193ae604377765d2c5bc1c54a3a9fd011f33cb28293630819f349a1dfe32a380d2a6626dd90297daae0d3862e6d4df3de5c2ab82ab9af26ffe9c8145430969a3da9ef148c0cbe31a594a4f698820faf247dec0a2a67a5149c7bf4cbd977f3049182d5dc189644efa05d1b05ab1f541c253a3f96a428b898e4b42685148582cd62328d8e83824d252d5bdc7d73f5139c1415152a544d096b3dc1fbdd66f3a0f4853c75e2db143dc33ccf094e0a158410d2df041bbd937e2ea9c1ced7049b6eb2a651efb14a28139c5bbd8aae933c5b1026384d292a468d95b2722ec1d8afa94e1b7a92752cc109a2eba2f4c8cf9957823bb5eedebd166dd494e0d2995d1433599ed393e0face4dae2c42e9182309f6eed269d226891b6322c156fedd58396e7a3e8104df764265f29247f0a6e498f43984769e38824b52b0a0d72bff539246b059ede946a95af22c2318353166567117c1a75cb931d99b6a5e15c166b7ba8b4ea2e3c9447029c7944dc955755d2282b7bb3515423c771a0fc15d0637f5dd9a4b0e0dc15e59a6fbe4a3f78285e0823eb1d4765d55f608c16551528c7f2a83e084d06fda84b66db40882cb933ea7ad52322c16084e965c92346a1a475a0a086e54d079d22cfd03975d3a772f46bdacd40f7c745535419918c592fac009ffb41d13f1814b4ad05f65aaea949c3df01635a5796eea981c3db02988f41332074da13cb01dfaa46793e424573c70fe224f948ed237de81bf54d2f7c44bd15cdb812d497d7dae94dca4ba0e8c6cd76fcd2769532774e0376e52c96c3407d63ba59cf2bbad9d560e7c5493fcf53a4853d938f0f1934a42af8bbfb670e0620ca53d5b2c31eafa0646af7f96249709c20781105a0543e85146050db8812d3b4fa21a63d6a4b681d31f4c836d4ecd2436b06b4a7a8d4c3ac67a0d8c0559494932a8063ecc3da9e0b934302629b1c404ad277d870646ecab3f6de50c5cf25c497e332994ccc09beeb49d4c37ed6f65602d5cab527c2d6fc9e0083b95d225c7c0470b2fc5c06dc9ec4ea71406deff32b774090c6c9f6027d7e8daacafc19a6bd226bf674fb2ff02b76a164dafe3057efd46499b67171821479ee74b311f11173859adef3ce88565ce16b8ac24499289eace25470b9c524b0f154a28ad9d2c30a2fb3928715783935dd3823a937485d2e05392b3e5acd6621a2cf0a7e3be9ddf57e0af46847e92f2a7b1adc07db0523ad768301eef63ae13e429a1a9029bb13ac52b515539c9196cd08d9594b6a766091558d5939902175764954aab6b72540a7c9f6a6bf6683e4919854cd5a6b8ee50e0b485d2eb1f747f4a3e81112543e9e0e21ef3884ee02e9d2ef13cf9773ba6095c287d9efa64ce792670596d45d34b492a69096c97eec6f0fe769119acdb8927c6246a56764ae093e4b5b9b449a59624304a8e3165d2184d4e150d20810f3a6df4495b303825698eeef5a994944260f099b39a6ad3f7d1fe829157f94bbc245ff05a3ad5e4f4824db74f952b48b79a179ca443dad788329d5d70ea84d21f425badf8bae08452352a688ea227940bae73b865961c5cf02645db6bebb7e064d478766da649a76dc1588ea75a70f13e98a756bfb40d2d38695d5f54a94c919959f0a77cfcf7960567a2376eac12e29624169c0965556ba19d1d587041287194f59fa0f17d059772941c3c6dacded4158cbec92789ba15fca5f8ad67252b3815352d4de83c9a5e05f74198f613458979e2bf830ca882cb596a5667dec1c354b0d1e47c53415430da46ef8252aff1524ec1c9dd247ce376a6e0ebeb4f32c9cf748c5d29d890596b74b7755776a4605bc55b7454302556370afed447bb0921445475a230c968d27e05a550f0b92d2b94decd577950f0a93f448d6aceb7a34f3096516ccfd553edc813ace5ab513a054f721075224bc97438c19aae98259fee7936c15fd4ea50194d3255135c554c1a54496d93f24c3026a5ea31192abb8d09c63a757916fd16847d093e5436653ad2e4785b825396d5ecd394e69b54825dd3cab4515182cf496b29299a042764776ebd25c128ebfd1a158d0417937c27a64b4830aa942428e149d0dfe323d898c4046960a3a55a292906a55a32468d0ea08153ba753736f61fea0de363c7bf20251ddb860e9c812f79ca24abeb4aea5f0e3330264564f29893a0ee6afd8801093a5006ce64055fdfb3cc1a94628851462aa66174800cec491d470925946eba14111d180397a74c2a9984122afa17031b73f6d589d067232f85e84018d8182d93a8563a4fbaa3078f1be8c9e8c323b11dcfe33cd00130b09fa35ad2a0496bb049e9a6c917477bb3e90b6cc6b42707e17b81913a76e2199a4dfcbac0daf656561471812de1ae963556c88ffd1638b1d5c4b175911638295a5443eb270b7edc9223aa1abc2851cd1b94e82978270d4e09eababdf15dd4c8b1c07b7a3ed97a474f3eb9021f5356c50c2fe51bb5026bb57e992d2d07ada0c149c173e6a06478ec5481f5ff3c194c0caa2deb33f8922342e6c91bd13154e02d594ac2627afb8b53e0539a32cf5816427952e0e4f4ce7f9208556b3151e074084f29a524739f2428f049e4a9c5759fc04951923a3dfa76c49238813dab9c0499208c1d7ce840137853b32f7dd695f46602ebda16b5da257072edf22953ea4ee8bfd88e3d74c00c33a5104de9424ae064ba9ca2e88c7b95d50e24814d3ea221345499386a0790c0a6cd4bf9319ac160fd4776141d30b85172f626215e9205fd829167f7a1349a9649d3176ce51c3af999b6ec9d5eb049a63a2965ed9a9c435e703a7ac8a4547e3779df0563c193e89719e48af274c125d5d49c718427d15472c1ad97fc16939be77d71c128d51dd4f2abaf5fec16acc5cb8b992ed8c9235b70a94dadc6df324929550b6ec5ea3de98aa753cca1059f974bfc93f6528a419f051ff452d03456ad9ed3b260f772ed4951e9e4d8492c182578ecbf689af6dc830523a39fd4b2b0bc828d9a3975499224baab36e20a5ec3f5437b641ed9b1b246186905573a5a0ef14cb382d54a1bf521ff63bacec82ab83139894e62e9bc2638a20a4ed031e6b62463a9e05b3559b6145554f0316f163dea4b497f3a051f73d49e1cfac953923505b7db49ad5f2a75425d0a4e92fbf45a5a4c52754e0a5e8310a272f4935170aa69e4888d44c1e6d89eda3c7f062b43c1a9f0204b9b6eaa7317148cbb9baebc1884cefc3ec16693ca4d10d2a386553cc1650a269394b6914e704a75ad7a12954db46c84135c3e937641fec7cbde4636c107a5bc82ed6ffecf8dc78826381d3ba67cab3927294b99e047ab255152b08c6082bbead11a533baa85914bb0716b545f2769a9a764c4127c27b17cf376d509eb2ac15beda93b59a341a8a4123cd2b1021b366cd8f81c2394602c45959cc40e117298d9e7d8d1c38c4c024724812391c01148e0c82370c41138d2081c61048e2c024714812389c01144e0c82170c4103852081c21048e0c024704812381c01140e0c81f70c40f38d2071ce1038eec0147f4802379c0113ce0c81d70c40e3852071ca1038ecc0147e4802371c01138e0c81b70c40d5cee9c64526d4238d66030d206ded389f28a99c2b136c2061c59038ea80147d2802368c0308c9c0147ccc027b128fa72929132304a8f12e3a606a955eb8b60840c6c995c32fde87a2f6d3f303206f6738b92513bc7de2431f0b12e2d2935377f531818cb9eebb3256bef1218f8adabce5e7abbb65f8391164f326db29dd4d11738b595b2427a3cad212ff0695c43553615f7425d60d386dc785d57d174b8c0be49499ddeb7c09bbceab1e4581b2c5a607f4b4e1f8df93775b2c0fd67d2e655a1e48e1aece756be94771a7cd0abfade3416b812a5769631ad273157e0456e56e0ea548eac548206a75f3d96e454810fa117dae4c954626770a249295bafa502db4999c6249f0227fd6d6d6e1e999a4a815f8bd7f6251905d642c7465a100a7ce952b267d01358ffec5a32e69cc0dae9f18b254d6053b0d8c9466ef7e598c08fd0e65951a4ffa72c816dcd7984fe9646cce0b63208e5a34bbc636944097c456f4f7e39491daf3492043634e6946a3ad5e42a8d208191b1463cc96425792818dcfbb78bed959f0a02065f4a37b7f342a9e8f905272dc8bc0d6edacde30b56fb828d364f2fd8536ba6d3e3df5a0e2ff8bebcfa6d5de1baef824b4abcfc9ec7357fae0b46bd5f8afcca9ff9ce05bf396ab40cdf24268d0bce3df66f4c52ad49fb16ac8923f4968e6f1bb3b6e06e5b949d6e6bc14517a5520c6dc17a5a7052898cd6254de4c92c18cf3726cb4a5970720a91a744180bc637f3983a1f167c5d0ad3fbb5f134f8af60f44e37c520f43683ef0ade734e5ba973b274cbb7825f513fe92959cc933d2bca2a75b3fceb57c14992204ab359c9d9d7ab827b139390395e17b429155ca74ca9e7234d7909159cdc270921ccd6a3964ec17a8ce934c9f132eb6f0a3eda077571e37f28f952f029e71a115a52b02628ff1661f904ef47c15886afe96a8a51170527646d4cca3af5d450b0aa59bfe28f8e8d08148c65ca693de59c5dfc046f253c0725a924878a275813efe486ce71dd4e27b892d57ad717723f9ce04f6e4d7ba6fd5eb309c62fea5f9e8abe37a57ec4800432f888410a3e78f4ef38c6101cd0449bf2e4a0a567821b913d9643c704bff93af52729e9757e093e2dab583e398af56d093ec42b67dd5e0976ed2e8e5ad87889127cb6ff4cd35f95e266125ce9f7586961279846125cbe53ee69349160f4a2b5c8924b734f20c15bc870db24e51cafe411fc7a9a523dad23f8a45a3e4288f43b6d23d8183bd5626a19c197588c17da728668115c294f6a66412c88aa0856b3966ccb25821364df9a922522b89464ffd8bd9ffbca4330269f0a512565999586e0c3cd32f4a7106cd6ec13bf3ec68a1282ebce2c7d5b724a171c041747687752959bbe20b8be1894b07820785d134d610282bf132147dba4a0e4ee0fece69c7e6355a1b6f3037f7a6a4afa4b1f58ed124dc91363975d50aa9e5e7490963df0963a5baeb09ce9eb81310dea9d3f79e0be468b8a9644f36d78e0e424b62539966c3ac6d01df86f53926ef7f18b1ab2039fb29f87e678c94c4375e0e27f88e8c02979aa2da39b4a953407fe2fa8a43beb63902539b01b376d2629dc4cff71e04e8c2338b0161e4c14bbcc96436f604fcebd126b64b9e9b881cf1a63bfeb06a9a6d3062ee653b2f7e8aa0e3a6ce0be369dc8faac815d7fef3f0d266c3b6ae063d42cfaa4f230514f0363e28f52258892a2316860e4c9e4267fec16d59c81f1924cccc0ab7ba9775353e16d1938254b4d0646254b621231c7c0a5ea52295de7a0741403a793d0fdf73c428f18063e37fd08edfc7e213070265df4247a6b25736bb099d762922cc912d3fb026331d967dd5b2cb13a5e6037c58e7fed79a2d5e902ef6d7b2796121ae45ce093b89b9c92aa2448b7c0985cbb9559435f3469818f5d61a562fa4c5bca02179316cd6d492e31e5d5e0d5ce2ea85f7768280dfe3b85bc134a33c60f1638f1d624edcaafc02659cca275fa49635b810f9eebbfc54683d78bd994a79827afabc0d5589f597bfdfb67309a5799a53996b4a102a79d6d41054bf79a29b026a63f9db99da2440a8c8ea2b6cabb545f130546c998f14daf759a060afc874e1fc77254d2cc13d85c52ec587ee2044e4b90953364de92264d604c9a6bbd9fdc6e2f13f8f1a0626d6a97c0df8895d60d93c15433b8cfa1258a3a6195a24ae0fcbf2ef50559dae64012f89c243dbe96bbe40d0790c0c8ac37599294547c83c165517bda1b164a99c0e0f25e9f300b3a6b98bf604fab294178aba7205fb0278f4e4ad6b1177c1293731e9399d7455ef06997e3bbb95db09e5572fed26f93e474c1c724b5a41013deefe582dbd0984345798cf9820b2e67ae4927536ec19e998ca7dd3e6e6f0b467885d46892dc36b15ab099740821ff44e7ce68c1a6730da13be5f3788ba2a804cd854204a25828108943e240000c8a6f0b00531508301848280cc4811c86d24411761480024a1e2036282216241e10102c140e120c8541613028100603026140200c0685c2c140496bcad604ca512105ba8c75b2cb4ba7aa9113c3e5a4ac2e278514a93ee58e7344760988dca5cc6894f2abc16d32d22889de86b08a6d2aa8796f1b72e6383163c3ada86ab5a25dbba25e71bf7c174d31193a2b6048166d5fbcb393055e7cc766d316fe881992a85bf3de4ccff0f7c2655b0a7d47fed1de1b79e4c8a8b20673928180a52f67ef284a277b269972dd7b99d1ab72c79cb0e46c3609fc7a1bb3e35b0aed60c0307e291ca5963fa4d6b0a12463b0b34235505204add079a04a3f6b52ec5a91bbcdb84c1deb9421e6b1186a509401d9126dfe4ef1cdbb8f47bcdca5a887d4eefa789daf62c8a6a689d6afab4dd5599a8c57c62a5c14125419d69e2a6d90320a151869cbe9d0fbc8482ccb0988602af4593cb6cbe2f752bedd1e03a2233e8f259a96796980d505248cc1bb8cb8c3cad8d14d2c25232acd14722af6d1b7acc42719486c70b9816626987acf5d2d372fa695ee3e5d856fe1e3ee5d55ec9c27302b40e335901b859aa78aca8829db8ceaaaa9937a293daf0289624f8dabe5a5b7a98c990e9d6451cc33762766885d7e19e18a00054e3c46b0c62b104637584a10e303d14b42ba4638d052e1bf1f4598648c838a7581f41745dbdd0fafdcc7bcc866d4b1439121969976d9e5e1d5288cb9be600acb709dda641d97310f18e0a03ab893d86aa122bf0c41cb193b6fa4832ca3b12564357532246323df18978d4d8e3da0e0a19c970ac48204c53bd89998c29733b25800dae29d0f5469252cad51dba20825d33a1445a7857b1fe5547563868280d3650bdcef38802ce40b8c54d05e611d1e8fbef3f416d8709de12a225661da8ff6d082d064fcefa37ceb5fbbfacfb2172caa6c24594b3d6c2bc09bb86255c6a306c0e2055c04c8780df11a09c8e3074bc0ed80e5efea4255b36adbd52e9fce5d21de86d4893b0bc6c6427bc9da1edfddb3293cf7d56aa52e280eeb48177e262e502c9bd9acfdbc50f66e69e04359c2e4662b92a16279d7729664901cce025338813e3ea5e781a53b3ada8126c451a895417e83aa7774d241f734d30ee2b1b8cf8baa211382accdf1b066276af9390c00bfa0efc6367b1bdde8a2c3d04bf2a97668cff167f007beca651ee6e8539f02c2448c41fbed0a19d122e8468b04b47e55d5debd6e7dd22101b188f8667c1500a8f1d9dea75e0357963d52aeee02939d38b8a2aaa900d9c415a603be20c5af1eb0aaf02d9d2701b150fe7287972be7cac34b3336f3138bd13d75d0cba5272182219aa1ab1d377e031ae840df88f383f13bcc825d67ee57768a36c1d5753508c7eb7770a7c526e05554ac5935552334480dec9968486d0bebaedbfa6bf7713962cf3fee3e820177bc8307eef88189f08a0def94b6bf45b9155c1a791f90f21a8b45309a86731f262e84d475b641fdd4d1b2ff446a254c3d5faaafa4226227d60686c297111f2e23086d7d2329c8d1595e99b6778ef7d6c453ed2e1c3bafe5bce0f9d9ebda6a83e625b9bc3a2f8c7db48de77cfc55e2e0a2a16ee8938533aea8abeb8ff3272a568be5e6d7d0d5a353da90ace7d1d88443d6ef4d405e025c5901e49547b2435f0d455e0f28dcf34bef52a2f0c8b60c9f2e12dc3b6ab30d4638051006e6ef944502d2f64731aebe35905dd214d907006d26b1f7d0854e02771e35c9104f6a03cd36ddda8e37ad72a724d5a2566eb601bd76c47df2dc7c0f071e9b32ddaeabdafd1590c6fa6755a74693974e2f71ed4837ccf39036b94387daf1e565dad9650b76b97c52097cf1bb1e7e972be8cb4ad7ce61c43fbe71ce731ae936e33cd03e4545f5a787d04b60541f4ddbb8830c776ec39fed66fef7a7f96c5b28e9d8f012d0fd5e4d6e5597dad6fc6eecbdf124b6f9a5399ce181d9932fe03d8232a5f7474576593e6c9f0874ca9c4f1bf1983018f9a4e1fc430a8d223c9e8be02bc8813555b483b872688c34aea39defbaf3bd44f9bd0bc3bbd9ebc7b704176f20ae8806ee6dd27ebf7a4d2a54ffdb68416ff4807b09d89d36188fe0f00706fc0a358e8a53d02720a76d1a25166c15ddc42f88599d0fd9ea30e8a8d6c4a7cdd4ea14fc945d197b9aed877b0721803dd8fd63f6ddc01d3fb0117e451b79759ec8413c54dfc4f90133e64d1f0ed6f0627805cc817615c027c091278ddc8ff21211fbacde753a1b7f62e73ffdb7e669b374c97c723be0261843a1d5520972434fe82520b547aa03c40db9db5fc0c53330c38d4ff0e17b9db19beb7c73af2f0957205342b8f2a0af83b35426e9424515f9c3ec77fe80919921bd96ea5ec6a75f6a97026faf751f67d957bf9aea577e2850d92949cbfaa981b541886884cf7b470ef620e0c1edbc58bb0201e8c4b87e74bb2252166b3fc84b032626d8ee88596f519cd7e6573e8ec6db469cbfd8f531d9133bc22b7b5721225e3fbdc16ce8ce75bd38bf6fdb0cd588ae0d7e873393cc9c46bbddf26e3408f43bd3c31e37f7a70c36ebffa00784ab40ff2cf6a84b74af530ae2dadcdb1baec8334bb4efeaed9efb628ca1efbbd0474b74d08c66b4ac7bbd75e0ee25394b4ee31b6f423fc29e14be7f1ad7f3965bbe1f5d3440bfa0975e1ee435d74847b1bb376ff2ec86606b762b2a970b6dafbab90675c5a08e38fbc94e77d8f6c9911cc5a92b3a3fd7b926c68a804531b090b81bd208ca8acb6816b67cb49d55acdc8656148f91c8c28f8a8ea84c7f4d7ed3738f2d66183c3b0a7b45204d81f4d6a7026cef70d6eaf3525226d73b5faf1f04fce1556ec6219deef10a339e63369f2e69abd2f394601372be461c5c55967e6d73f5f6abeb29bb533ae9bd6aa536aded1fef7c980261af1c7135fc698f2862b5af959720311f00cd0dd45593eafcdb13b49f1c0909b48edbb07cb386e882d47ecd4be5f74e0966677f0213dfc6b732663a1bf14099f92a48235caf913b290e96119640a62e3e6c748db90218ccc259119fe0005f8eee27713e60ca3529269348dc155de2eeb42bed0ec5abb8e9af36345734a4e2ee2baf7af09cc8dbb832ce7fb2b3e9a7bb427876d42a05b4e150a16efa4f775a056c7cfaf42f21addd08dd793e1275d234d71d1dd511da09029d3ce39bebb0e6ba729e44be082ee738cc26851b38c0780663dfc6dd47bbab7d076ceabaaa46e36f71d157c8ec6ada2b5eb94abbf708fb9d68673bc2b78885cffed9a4e58ab1f6876da09764667af69d82c2153786572f3897756ef3aaa2402f4ba74bac3c69612f8e02a3818d6e6cf31ddb750797f3cebba5c427b26ebd42f3143481bd74e1f3080e3bd187fe202f511cb7fce0966ab54fe45995181ccbb4eda496fadb49431bcc5ee2c3a3f27360db16562f6c412b6a6f865458829c62b55581caa0aadad667c3bdfcfa26a2559d92ef5687c66d60d3ddcaf7f77b059f36392f7c97068bf33b034c00d6ff2e223e25cac309c1d3f5bcae355b3502c0dd8057749e9910c47dda0dd46d4a64bfb970675aefaaf9fd8607debb2a07843b0043e13957937276062773a4f33d95dd9d04214e76e86f10078dec06c22bcac446e82d2e36d4f5d3f373a437db3fc2569648e0afe2aa2e3ad21dcadf200f870eaefd6d42f8ec4fc2e3db076f2815033d754477799b4101c7c8e74241b02439f1f9247625a0636e8aaf8e582e8c494f0c5b145639d61556c95ce71ae93aa2af4971f6f6e2f33529e75c7fc201e27093fe51fe9c8cd23875213e4f381d485e0f737295a9a0930be6d62f87c2f36649fee5592553c0ccf7b6ca08cdb30bf8137f629b616db1c25ad97baa0bf809d008cf56534ee32a623d57b907694ec52867ca2bf2d04475a6d6ce838ee8e3b9a664c444a4663a312ccd576949027ed6f46f6f91c247837a011f8d0262a6439cd1ef6616650eeeaf690a90a1840122a90cfe57f52e116bf9452823caa5c8aa4c4c09de1151f7b11768f9942c0706c783036994e191bb0445098ff4fee4ec25bcf909e5a794808c0859609120a98f21206703ed85643c2ebeaf6085295f600abe38c0c5cad2b83383e373677455039e94fe3f7dbf7286cf898f01ef8d7db02024b50b796255db69fb74ac2f1021270edf54c2875c68a3c9b7ce31466d6591c1e267c4650dbebb79c1be4b4102109725f77c1e21e45880b8c566e428018d9c727d84001cd563d1bffbfd26e36fed33014fa8547609566fc5e0d3f640542af9de85938019442f8e4c7c5d15b9b4a4736f2d79f6c7325acaa5ea937d7d80d51a8f2c1693c9c1fb2702e2f06c1956228468f0301611f8fde92d5c049b4d4679af78f9bf1de0f2a42f8e0140fc9b1b347d2afe0cbb482c70cbfc166d21f6d7b6094c251fdbb13f87765ca0651d80497f0df0a6f6e734c1c17e1651cffe9c14c464007c1410c019f0632138a0de32b9e435f20f4fb6f4e26fdbe52ab1ecc8ce389d673f93cafcd10573a72b06dd85e1ce572022501a01767e01607c43d108c50d8a282c8ea451dcbe149f2659f2431942b1c178c3911b7a72a8b6db28cbb4a3c45e7ba356e9315875d12426160c901de98f85bedf4bf1f90b783cec994c17a82cc90d9bc55e8d95e75fcd5c238d88ca26d40abd4c444a747684609a04fd6f038374ea4bb54795601a32db0753ea22bfa9b703923b12098866809200f45cbeafba81cbbeab094b0dd4fd752d6c9fc6b30f2d8593890bcacd869ebde5c58dadd45729fbf5b53b8f63f25d0c2d8a8244e02eb49a7ff60ad76a3c4f5bcbcf1f2519eb2aea4ee4fd57f2eb4cff5813ee37fe5090c84a28cb9594b4eef86785bffdfe6fde2f22409b5a7b6ec3cae677177a493e5cdc6dfdb28a7912f7c4f5f43747485d42ee80e404fa98757a2c31d77bfc252289b0e6cabbd5b00f193669b5b30017393702dcc5c005c493c81a2639824b4a5521b88b610d9209c6c664428186343dde7f585a4211d139405e66f2faec93f2d7387724c886801f547e3a0f831943f2189d062d46458938b391ff99fd52a63ca3dbf59f9838c10b0beafe1af8e3ef2fca631ae52e2c39731ae5d45ec8ae47742d00fd3c06b7e02faa975513e1b48c275fe80c0cdb32bd66e2d40a5938ccf276bc8b7ecf2e4b6d53e740858e94478091922f6e72a5c686b2caaa4c44ee505d43833a3f192f6e8e56e53f735e07fa6cfffc9b92db2b67819446b5a143ba1d435b021fea660336f9bbf06063ce4402e180823f8231de31c17a5936b529d3ed8424ded588aa6781e03aa2993e346f344036429ca5a34bae17b60a599e3d68004e63d18fb118ae17af7558fd4cb66caf73f6d3d53ee93c383846c2c27924a2fd1352560782b9f551b292a86196eb2cb869997fe3c38bd7662a89e44c02ef054d35d51e1a8fa7d8aaac0dc53963ebd6f2efbdcff43734615007821cf6da1dc79c6d7b7bdda9c038a49e9c80a445915e0731c14a853300995d9253750415c751abaa97afbf278a76c89ab2fe6b6ac2160e52e473316e98928a375696d5a5be39a35bbd123152921fc18647fe3c8f295992b887280f955b024884417077e534627fe6e1e231c90dc8bdcf2912325bf5360c23bb07418de1a24e82b2e3aa202cc449aa25a5b28eaedc4a2611e8a610493d53968b5ba9b4432732ec03943f01d043c59ad695396e102953634aac7587b2ff9081a26d1557e9fd069ab2068de9d81bde909ea4f8606217d9e619a2b1371742acfa08fad8dc15880ac38b5c71b4ca917011550ece387341aba053e8d1329e8e0bc8902b7b2e54390652cdce321738de2f560df921b72ef77bb4db7a4f5a089e2e4e945e2bf226be8629120807fbda012ba1ce46190af9e14e7f389848d749d64000d651efa0981d6232ea41036db5d5932e8c1698d6c60876e79cfe8fbfa07104e5ab0f504d02505fc46e704a6bd195a5e24cdbcc87e23b48e0dae3b7048a7eda48b7835fb6ae32d1e2922483ee83d5cb8805d91f2ae7cad77b0849b4430efc45a4e2103e46c21db726893c67c80f100d9c59a4a23adab2d451fc07f52a07e5369821c1e0f9112e50025346565140442bf964b828c73706d8c4c269136c222f736f59270e0587f2d2ea4248c3e4bef423c5f49fef9b4b6461d72bec2ff8461557958fb646f5e1a862573b57b4f1a66d3835fa01820135d01f0ec54cfe86864208509a601dff72a7a7d4096ca09a282b45a1b6ec3e64ffc636ea563c4252481382b352b50c574ed836820212714776191263418515124d91e9bd1a3a06651d5da70586fac369f355c442bc66ed585046a1f2455f7c32060e8adec92dc57f0a913e3756d4aa40940aa994dd8dd8d3d3bf108477053e0b8f5385c85c6a69b68531a6e24b09eb4f8e03851debb5e500958300182d00a3b184e02b5b5047c37111a4c343bbfbbd961293273ce91b233f1c98e263be540bfca945ddc8d90e5d163d0c0532c6bab95da84b2c902260c66c7a1a837e0186b5648e27b4abe0812f8eac31ee475f54da9c7d25bd374139f76219a51ea96ba9c4249e134f049234d9c3cbbf4e7ab23118a9032893a19e9e8abde640f9478faca9dad8743e52791ce1fb0e1b7330cef2305df6c20d9979b72d921b03880ca222c6b07f6b4e7feac675e36d2b3bde81329b047c7f762332bcd5f79a031c6431480492bcc278d21eb7dc9d4c4e2183943b670eaa68010444fc72f73be68a5dc7323ba70324e5314cf430825bc979a5c97faf538193a6c412626ec887db1a2cfb6deb826989a7e9ba79c9198d2844a0a4336f64d5c6bbbd8151ee96c49b4f4737beeda03891c293638c0eb1fc4010665ac41e904160f96acc2e0428e296da019c0611b76321b14082278725984ba8c44678f415d25bd78284aab2744cbef08835470e450f610176a09b64414194010c2d504394eef178079b55d95dc38007d2bf2652b872f09fe95492663227908fbe3cc30ab434ed9605eba7f3287686b443815d8a97e47d90407a0653fcdf2cf1ba3ac2ac124532dbfe2ee1ad8509c306d30f704856ab98176872146478d2d12bb14d3bf700d2076c11c60ee5c75e06f0a36b8019609c263a60f5e4ee431c367845302238eaa5ca4ebbae939e69c8f8977cf3c33235838fc0b0b6e76c4ee06392fc92a37e017cfe0e82c3ad75fc017a00a133fd498cc6f438cd9fe709702005db89fa86be2843596a73c9c34ed7a3a4c109d285dfb3c55fd9dfea2e3217259696c132e0edc38faca30a1c9c96a11ef98d7db8ecf544a195b576c1b458d36a562c1b89825e4db9d7724414f9dcee5a95e93e0e04b6642954fc828ac70f0f12d03ba0098945d157126392b500a30e8664b7c246064ccaf980244d32249b225424a536abc8613b4c59a1ff4c2a2218333a698f2305a28ca4c6d8e282484edad0324da100c8893ba5ea3f651d6e34d26acb4d04360f46e33aa5a33cbf1ee344410eea90e8311e4d5a55b46c41395118b8129e8ab50f67e95b6fb20c3f6b6a9830062b6018e9fa568690825853545c6ed55c0c7b4b711f0935626b6a56f0ed7d6da2503bc48f48ae9cdea96b0bf2ea4dfc1156d12a6748e6d70a9b80bc08c2a964c8837c7ee273aead1e2dc6c944e8c8a26a4e2fa5f66b40c20bdaa284a3698719e48883c2ca9dcd8011f562b18d868fd0542560385013d4602fd35ee9fd034d4c6d7e50864bbeabe6077ca6faca6cf12280dac99857d4e643aa9acd583ef409b1e62c8c7514d8f6d1d6607f972940abf7f240e23be2194c1b1377e293cbccf36031385df8b89c2542494cf5eee004aae8a269d91f39a1f82b5513715bf58a71d78fb88ae04f687dbf5136f06497f9fd5179617fca550188ea863219ad36f501e9a65640b5881b586381631c83df6c516de14351c8e0680fa446105c780f509bc4075d7d419543072c9808cd20052f5c3acfceb9900f16e3f13632e7f3a592820f1d6422be988e6676bad998bfc8f2542587ef2532172f654e8001a96b950c12ab1b8f2c8095829dcc4ba3f59ed6e93d4b6535106225736e1610b85dda3492e6848eb5f9b5c012894be5fb02db47b8442e8174571588f8c481ce8425a5d50c18038595dd6731adeae5c46149db43af3d906b2858a735e2d23d72e7498e23f4e8b4f0578aa4ac38cb85c6f608818c107e5d9f3184c9077a839f260b5f8b7870e237a3621b507e00677f1158e45810a1ae4cb7e0e7c5c2513e9b83bd1ad9bb7f809a3f73e263ba3cc1ebf3cd357319485e2b5972512c9cafb111aa00d5c7e35ea9b535d0da5695b05e80ca0c80a035624e6c20d66ec9c410a8df77af3610405713115895d816d7940828d80604b4cc3c30f5a631ae3a47233873a304b4fe74b5710826806ad72ee514cac81aa881e96266a3c85b92d9c07c35a91f9bad4451e535e2ee1366d8cd2995760e8edfe1d53da7ef60d0b23e73716bc9eaea4134d55319b6a838345503c1237a5099c887051e1b43484bd0e1452bfd724feca8b5d07b16fa02648b19608260396fd6ac965578b6b8f10695346cba9187dd547ef4520925564fe14afd1620d9014482018b9c2c6cd18aff8bc563181da669ad245f14f150d63688c408388b4c1f87c5eb2b6d8404df7779197d41e6d62ea16acc7d810adac7127248042c461416ec8045af2133605afa6d0657735a723e59252a5ad712d38c208b52bc29e67905af246877ce0a98915f7392b5a146ab0cce7a032436e2a6ef8a4eee04e4ec473eb0a03b97cccf18b1ada6fc6c773d43131e807a76a9209721021c955ae9cde1620a2f2ad3aa91308e3417d0be02984c327dcce6b973654b0f2e1c452fa8a35395a1f99f4937463e5f2585e7a2919626d2d806f95e6e13ae05d2cb045919583f01983e4b4164883461f7d4c60c40b982fcf7787918c489fe6482f9308a90b3f288e200e98ea02b893639238ac4bc133366340ba6fdd976d220e52edb7060a51d46fd2c97ddb0b9da9becae3f39a325def4917651129095c88dcba0b6c43e4109e6cb1507ed1330bdcb5a24ae0262e189543629c42648bd91110fbe067995f298111ea6a8c054b1534397eba81a29f6a35ae66c5f250c875d3efe2015dc281b7adfdede88668b5a701c0b8cb44f122e5034fcd6db7c60c5f958d40a033b4d6e30551538db4c413998d395cf99dc28c26fbde8d15b17ffac113b0a295624f5af10098f08cff92d994bb36fc25f392ecd9608895d48d3e4deeeeb0fcf4cf832af6ab59bc45765631966c22a31036ba603af9cf1b46f90517109e85c778c4d4f7091b8ac1236be9c3496fd64fa01e33e77bee1def9a37e5a477b1bd5970a8b19077b11a4c234b51e90e91803abcd8881c98729aceed628950ebaaadd9dc45d5869125bed0d782a0ecb18962aa6a5f99d8a8e4b5834d436e09762f9ca0cfc0d10c27fbc230bbead8936b11031bd7cebad500ec150aca6a669d064cd24f62822c30a49dc9eec20c89c0d7a046e0eed4065eadc856ad89d0099701a4a705d52178968c11ea338a0e6f7792c7da3ab2566520737150f018a220ab610a0611df677638f9232b42154eb6851584a5eaf322b4f6264a57365790c8c4460f2c0c30265c2424985c18a6a37088a1be043f621221d68d5ea867c751e51dca7d433c1b7090d9630f9d2fe4dad6c197b1fbecb793166bfe182aab77082266d209b6e8761f118d245b8caf8e6a0f67d0d2a6d909c395ba4357ce72dee45f916ad5643f42f0e61045cbc2110fa8940712514d0fdd5c9511931df676aa43c633c28134f4fd0561774b91a38d4c1dee028c82abe302fb2135b14ae6f81658ba6e99c805b845134612333fed210573038efea36ff8960853130731f13327e105eb78d8e5c17c6cb0d8755c5e1d448de795d0d7b71e70527d2f6192b76fca2aee41ef09d47f3a1cc7a679efe0f38aa1a37cef561570e025fc415f34b16965dcfb92c36b5d7bed5f5b8315c373f6561f902a610736682d9c530f534043fbeaffcd560fc00a62b736ec239d9677123f1c7dd70c3ee8c5d6e0cf1f97370a7217c4abca93883cac75ff8efc7e60e6e2e0781db9e990783fa1430347666797396c30b132c268b462083846d03d7b79dc73cb22e18d9f5b4372337a3d8cfdaf3b001ef10d904d4dfc44e137562163d7007f78755ca10ce77e606f3177756769a183f09e85a543849ba1d0e1cd8c17f06b6e56acecf3dfb36d8723e3f5b4a193501d836c55cbe3952d9a76be75facbc8f4c12d313ac10c10d8b26554b8fd535ccb00f77a78a322cae3e59b178753a2b98870b44ed3e39457ba742a0ab01cf80c1bf692251d911e3166d3dd8ca70ac29f5519e8230464c34c446071ac16acdf4fd0c63e394c4b647e3105955bede09d996af911fcc17b1692bf0b7933dfc284e119ab6b41d25cffbb83621e7f197e1d29a38431174d6a16e7aa77782bae5bba03f61470a237030b5ffea6e411b8c0b549e9fb292ae157505c04dbbc6b1417459ae1b080e3e55a42eb046fd1973fc23d3b2000f915e656eeb68ba2cc22ab1d30c7b38911c7b3809ec32d1bdc74c65071cf2ba4abbd3b929590953ccaee9ec704a26466192d9e3c92ddb67c599551254cc947a88e03c263b41678967b7f6da4a2099942eb51225c4b844701c458d5e215614f1636cf080f22e8a3c2dd9d9e8f1fe4e05bb17232f33d683bb6bf553e4917e7eb4cba24bca45bc2856680b8bece81c50c9c0b5a00461c79e3e61cc8a46d74851b1eac6c9e2604b3e4a1c87a4e2cf8e3e42fc5149db0170362c72be959dbb40494501772de94f23e430f5410fc3022f69145a4caf567564e917e2dc782d0bec47edea99ce2bf44cbf2458bda0ab87e4a3acc269d4e6ab2f7a597194c1b260d3636ebb9540fb1ef1dc255948dc51aad418b0736529d53853ff32158a82ba200e6d975e6449477b5005249fdfd99940e405439a21f9e6561f01840e0649a19e313474a051409b904c5e77b8cc12a14987662ddb0b8e95b2e7b2747d2e76cc707a6ba11398388ccd30d5117053226db95c212c279d120c2ac650840b631abe4ead437c85dfe6045a6f692d377bca5385b2ba6434461e681451050702d3fc912c626fbd8dc5578d146ed438a1e08ba5538aabda5af70345f237951dd4f7c4dcdde4f7024e03766f7dd7a9bcce017ece8119f7b4a9f8dbed2d60a5d4e5181ddde0c56739bc5ccca3d78f1a4fee09f5b87a33a100dedc66dbe922795e39bd07e8da8762be11b0313e507f43988b3c5ffb8cf16da7f57ad955eb11f080b4ff31f2169f25d1efcdd67e02a91b1508c95e7127a36f245ab1d887e6194a10b2f967e587c874ce8e2fbe6e20bc86bed816e1b9b93bcdc8d7708b92641e8a3b8378c6521fd8fffd58c3cfa551dab73ffc7f04b9b9eb0cb77e5ff4e366de9317f7badcf82d1a7c56021e4244760a2e70b4940e000c30c000030c30c0000aa0a92e526ecccfd2fbb974b673535252921717c34ad6064ad6064ad6066c5d800aa40a610aac4a0c338fea3934c20b361443bc67cc69c57d3f5e434993448c98ce6a1e8e5a78a186425a8739244a565f75d2500c0d1c758ec778818652b769de104a3e74c42fce500671268e60d40b3394f1847bcc31e97c7450172fca50f230bb7ce8a92a7d4186b266d314c7d1b78fc5118c1a4321a6a379e70f53e08518ca042fc2504c123f596140042920dbc00b3014671e670c9f2d3156ff42d941c8cf79ef593eb517ca12a366d37be77c24bb50b84ed2fde94d2e14676bf671e6bef01bb750b2580bed0cd70b2d946ae76e32788e6953ce86175928bcc7d459a25ccc67140b65d049a56f6396861757286cd650e6dec8d3853d8005d4175e58a16c9a7f1983b4de8216380bba1330000c44e05e54a114d22519a5042b871b2a14fc2b436ac9ef148a217ad8cfa9c3536d2a8542838f517782a9e48a0cf0220ac5980e246734c88c3a14cae03a53cda5bc86fe84e2bbe3e0158fe1feed84c2c3f8d518378b66bb09450f53cd21cf6c43870985e020f5a3968701ce820a108000e58216b80848d0c30d6fe1c5120a293f5eccaf4a2863f079a2db41af9a4928e9a39f90d4adbb4a241427ee366a91bbbfee08e59fb1d0fb6c1f9a7a2314ce245a2eae2f42714343bc329678f810a164ed9b46d7338432d01c93533ade501e21942a22e2746d7dfd2608859cea7e9c5b525e0b8442da8dd1e04b434bc60f0a21e45c6515faa0e4936a734cdd23e37a5096c92a19943b9a889c07c5569f4ce3f01d689f41d74171a25bc3681119b426078524ae5932da17382837460f46a3245b7b8bc2e66710d3366c51b448aad3a1518b6206abd08f11af25b4288f770ca1d9fecabd5914662c2e3c87b4bfcba264bef9fe9eea5814e43392a6861a1685ea8f10cb61f0fcf62b4a579a2dd6c4537eed8a32dee8749e752bcaa1fa1c58e6ace9ddc38ab274d6556c74693fce2a4a51361993d551456163fac77c87f3189d8ab2de4a7f5e9667d6a8286c7a208fb3738a6206591b771ab9871853145743bccf38aa36d294a298fa5dd2fb542233a4288d6b5c472d9b5194f1cf67f8dabb8959238a1b230f07bdd15014345bc4cecc874f27280a21744d985744ede4270a31a273637cb5fca027ca2d8fb34bc34e141d7bce1cb363c6f8e344f1e3e3f8e0253cd79b28382aa9cba89eed68a2ae897127ae994c1442988c23958d899264e6497edfac3a5fa2f858ce1e74480d11b544e1e3c36815d61f9a56a21c2aad37f3665d9b9428987b87c5047518c449943c56ddcc71d00ca124ca923bf4c71c924fe422512e4dbf8fdcf7923d86441966776b94e7967df1238a6b71faf851ec88b243cfbf67961f33d38892dabcc4b4d2b1981951f0e85a8b075944394634dd28dd23f52aa2ec73a999e3bf8928874c7b8ded8eaf3582887208b13454fa872866101d86d590f69b1ba234c9d6a1a46cf7cb0b51ccd9d7632dd24b3f4b88c284f107b136a6d4780751869d7f8f23bb6a475610e5d2183fb5330251d6924dc910feed1c802877c8909bb234479e7f283c88d61856d717e2faa1341dc663e3db9890db3e14e29b64f42b9adfdef2a110e34d063656fb75ed1eca1173ece8da75d4b71ecae9d8ed1b8f86433b0fc5bb5bd973f81b8d838792b545a9e7983b946cebcef57625488c1dca69bcf3ad6ac41f4d1d0a41420a4fb96ac7613a147284df878ce7505ad1902cd2cfc46ce55086e96388a9524fafc6a11c312484d0713bae83436926f23b6a655d6b6f2848aedb2751871b4ad78e1a6d28ba7b83ecdfeda0aac186f2a7672cd12e33c3d0584329cd357dbe5089110d35947262ab3a7c2c82270da59ef4e06d5d4bf28c8672d8847ecd3843216446abf5e9f9cd50ee0fe39e717d878dcb509ed4b539a4cf9d2e2143f9adfd524b227ec68ea1547ae9ee1a561ba7622854844c1362668cf285a18ce5e34d77acfa1f0ca5741cc6c5b22f94543cbaab87d40b856c98ef53c52e943573b27e3b49f65c286cc5e7b488caaf780bc5fe20d18f5395b6430be50f2b131dd93aca9985724e1515314a668d392c14a35ab9e757cc392aaf50b8aacde91659a3a4ad50dc4f9d2a14a2fa4f67d84dd3182a94263767f4c5a96b3c8542f88346ebf35712ed097800042c208014fe89deb02fe328943673e286774c99170ae508cde01388909b69726a4e288d94865bf96e861736a1e4b85d3388d5cddc4c28ee9a4da3fe2ca1609aa993c6ac84c24673bd168fc11d2409e57f0c6ac3a4ce3b09128aa983b89dba47283f8e105232f617758d50ce0d1f634db9185d8b50f0fc20d339c3f3341e110ad1ad1e42218e85c95d5e7bbe855072d59ddb48104a9b6972c3395a3d0f100a111311923e8de7fd41c1f3fbc3cd6dc7d907c57998fb61983d288470190fca208e44fad46db877606c6fac521e1d145435e5afb41c143623e676840038287f6b6dc38ee9f6718b82d56e8dfff778670b8247fbf4ae7d2d8a9e22a7fed0d3a228936bb2cfe166edcca2f0f2199b7363183a238b32caf6380d9ada1a2416458da13d68e8f0d2202c4a2d91673d48f58a82838b1c37b62bcab81ce41063482b4ab1de9367ccbef3654531b5beefd345e89c5d4539fef36da7aa28b45da5ba4b7a87a6a28c3a22f7a7cde1930315c5f1dc33f3dc298a41d6f5ef334539d455ecd7d5a74c4b518e97d7f13669e41492a238394dc5476e1465fcf051c986e7bf8844c145280a3f1d9ff1e4b8c5d8a028c388ccb097af4ee3270a95d67d1bd6b13ee878a2b491961ecd2b5f67ee44b9f3d6fa63ec0bc7124e144dcb3d73bacc50b3bb8932ae8ed16198a73d493551c8eb967df4a1c6379928399ceba89b93ee6689897272fc59249b67dd8897288606f50e29ff111e678992494c8c22da05b8a84461dcd51b48d887879a0e5c50a20ce557353fda4ccfbf6ce06212a5b919cd1959756c3e06b08033702189c27ecc79e41f7b0a1240000280a0bec04524ca70d37c4b1c1d12e5f4793447b5e611e5920c69ff2482bb795c38a2dcb35fa1e16123caa82398c62c1b3acd6652e0821185981426d2afdd9a365c2ca218ad6f2a72a7ff7e89042e1451aecf3187ab89110217892883fbc76f9b3bb3f8c705220a1a26353b682879b93844d171b68d6e0da23d14706188c6c374be4da610859ce023212847d5f02eb62b5670318852c464bb7fd654f3c81b702188d2bb453d825149032e02518e321925a5c68e310e40941b47c823f1697bfef943217beb448ffc688e3d3f143bba3d6db22672e90208741718b03e9423ad9c7af8501bb8e043e9537f63d7d4501dee3dd00bb8d04311a0b8c8431987c91f21c6b48e63100fa5fa8679f2dae8838c7e81bf600577288efed9e666c8e083b4062eec507ed5b4c731731cc0451d0a39ac9eac6b6eccf800c172810b3a943d5568fc087f6d4773318792afe7b811f6ff315d2ee450465911f3845cc7a164a32351fec0cf4d8343313c083fb73e9b55e3084675918252010946d08241052ede50bccb3811b2de5d3ddc0d658b6ef71c6248c62fb96843e1ccbda7d6674349634c194387b4b7915f43a91a5ecedffab67ec5822e0840801170a186428cef161e1eeea25dd04517167880bba08b09d435176970354ee370bbb1118cc221708186c2b4d6b55a6896c0c519ca188787d7769ed2d3a6cc40f2060ec4c3b17bada416f7b4ecbfc90eb8284321328a48499f1bc12823437144ddb3764aa7c0c5184aef5ab129e3c68518ca115b3f46785c84a190e35ceca3f934da0c14b80043b135466ecfdc1862fa09109ec3db1499b124ce2a43f93c3a4f12c973310919ca62edb9ce35749a5a6b0ce5edcae811a266652831943c7c830fb1d2ec7f2319a83014f3f5276dff4e3de3058642dd07ef381e624aca2f14a3a5c32357a4b7e7bc509cba95903b2589631d0bd5859248d0fbed4e75aee6148a0b859ad7d5ffd89d7bbc2d9472f75553dc63cf505a286de34a471f54228b67c9505928b4656c1022255828e5e9edb4d548cca9b9c230b75bb48b07cd50562863243b0dcfc155a0c5e23c2b8336c6505428b4a598c4f0f2386b15829a42e1d37c908ca30715d1a4507089397f26f25d74d1c3865051288a5a4dd4ab5f78207011b00a40a002d64141a12caaabf95aca118040052878811939a827946eecf1abcc3882515783724269247dd8e884b2504d286f6cfed169cdf3f25231a10c25a4e6cd187e8e9dada82594a3440b1d7ffdf021798116b8c05b40fa504a2867b7eb7dce2bd391f0a19250de146b7a159d6bf5e5a19050725c951e9b2e02108000297014b880ea088510ef2488d46f84626b4429098e2f42c9b457e42ef2638e3e114aba9da2d3e664fdf02114c2c418c4bfb7546f2194e43ac39ddef58b70104a3732a71f6364690408259bec1f83ad75e6f50705919192f7cd1b77b90f4a2f1a3e4ac6c1d322ef41197acc888cfffa3aa7795018d5a4d1c3eb6ede7a07054d1fb41b9547794707e50821ad9da60da69bca4161c436571fe867bf8583628e9fb24635ae8653a90d0d357a326d517cbce99141f0d4a21032fd310c261b1e1e5af0fa481c3ff0ce2c0aff7e0d3a63676c7464518c1ff7f389481ef34d2cca0d24633fce8ff658038bc277c49a1c6d19f333af286ffc9879fcec8ac27da3dc541611dae55694b4771a7bab45c3342bca923119c9db6415e510ca51a8e6aef218a28a4284da13d51c21824c5251c626629399464541939af5f9b66ffa9ca2b4de1982c6c6ed549aa28c716d4866897a3e96a26cfd9b57d26d16ad9614c5fe48679ae3c4098fa2e8fd1a2ab3ae114529c3858c833c14ce3db4ea9c4f415128bdaa8f777fa25ca2c14cff633c51d66b7598ad31a813ad384e53b38772a20cd35afbacb54313751305990ccff71b84c6966aa2f8e9f756d2401d4c3213c588cc20657d42a7333151d4e87ecf71bf44a9e636eec3db63842d51bcf3f8f5dbc87a8c4a945c2344e4544a1442cea21a4ad7ad229c44197bc6f6e3adb31b3949949369466ddc7b24cae3126673aa7ec7db41a20c345477e6d4b2a57b4441d20707993323b59b23ca1ee62972c333f2a91a5106a31d2b636866071951d60eff58ebd9228aa9e2376d624a11e5f9098e1ac62b1145b7da9ad4d04b631051f8e0abf3308738475335fd185a431422c33f483f294439e3501e23633b712c21ca3063187db60fd237681085d4fdd07fcfa8f52182288609339a32e7b8b9ca4094336e4bccccd9b54a030834bcaa9fa83e78017004fa43c9d4ffefe3a6fd508e09dbd9d7b6c367541fcae91939f8f8784ed7890f85d7d89189fb28d127b40763e364470fe5f4b923ff66dc212db334501e0ad3d9faa1b85e68203c94d57bb3c5ec640a7487e23dda709b8c61875287bb03b19f5c1af37528ac9f48472acd8f99d2a18ccbfd2d250741d00212a81c680ee592dc7c8f8dc2cf6f3914ef636375541c87d2fbe3bce6fd99325d381447b3677674ac213a4f6f2898c4941ad5d8e433864581012c6000160038901b0a99730e0f25d4415ea40da5d78e4725f33f81d85068541aa3ed685a4349547b3734378a0e39524369446334f76e4b6928ddaeeabcba030d6d69c6a78bf75da03394545b73e80c5d7fe23833144de3d27d23392eb5ca508890e1a7aa3e32147b3bd5573634c75018977dab4eff13cf144351ad7c0a43a9573afc7a85aa468ec05096f38d9c1dc8a45195be508edc7caaaef5c126455e283bcaa492dd66d2aa9300d0037521b5fee499eea384a41f880be58cd239cde7acc794b65018c79af399e65a2026c94059284bd664e9e835745772021664e0055d9ce0052a78010b0e61a13466122e6d3a57283eb238d3d28d3e3a9315ca9a43c8f5f7c8ba3a465528b766b598c98a9d58890ac524398720a69f2994d3aac4db1b6d58202914328e28b1ba53e3bc178542ea77c99929de3c3ba050d6756de99cb3359116e809859cdc4462e8f618237642b1763eb765d8a809c5554d7912f24f4c285d454edecc1c5a42a9ab6b630cb255f791120a6b2719bff63667a3049484e2ff4966785ced0904ed5df4c28090500e51730c5d1b9137a477043a4261c2d98a36babcc9202318e52e20010b6270648472f0b2cecee8988a506a1c16ea1be2d9cd6403c080030840802e4e6001200211814cab3e35e571d44bd0100a1d4d36b4e3e6d44c2d1d4808854a2fe9f48f4b248f0305a1e4206fd41a11dd40402847cd20754c7b46ba660df483820789bd90cbb1f4181f1442dedaf48ee06e32f6a0743a19a795473b9a7c1e942764a3b4ce4a3b285fb6466b44e867dd740ba483428bb727918d152807c546b10d6d25a40a84839247de891c0d36a6e5b728d586a49f714caae1852d0adef59b19c4768617b528d8e53e9e36870dd6a645795af32a3b648bcc661685f33035714ccc17b228379aee7fd5ecb425c7a2f867b9513da4f873191605cd69d79fa3323b83af28c70c4c43ec9c889831ae28c64d7a88f96e2bca259bc4a52342a6ceb3a2ec307bc831b1414ffe5514d63f5deee74915e59026d4da8e79862fa6a23c16e72182f858c9898a92e41eb9f5746edef15314aabe7432c619e3a4bf29caf97a1926ca2d45316a4b47d39c56636d4851c822b93ffaec5194f7543534678cfc42154569f5afce35eb50944532160f6eab2ee30145318686928eb2ee736a9f28a9f45b6f48de4e19f444793c8dd587cf3bb1f5c78c992a269c2889640b95c90efd19dc44e9f647d7e5a6b3c71042bcd044d1266f6dde706a5e1ec944315c63f5634f1952c74469626c67f0eccce5fd258a39397c52a9d790e19628a5e35e930e82e14525caafb976b26d676afaf90525ca1f579fb19a2cf2e4002f26414e5b2e2f6115075e48a2145a9521f52d7aea17e145240a11abe53363d03dc183443123e48930a1ef613a20e8a21f51cc5bd399418a8f9b7146302acd1185d9897022190d21bc68444145ccd34fdcbc12230a0dfb2664f1ac35082f1651ec89197c33e99d5f070217780bee85228ab17e32e2a81b034f010866c002179017892864af59d9af57052f10513a93867946c23f47ea2660141ca2f8e0e454e34ff3e3d5107ec89ea531730bd8052da07a5188c244ceac6772d79bfc110c10a4a00b3a2738c10b1a4081148c13c01c5e10a29c1fd8a84ac665fd5de4e0c5204af7ee7a3b0b5470d018f14210455ff706f1675bc516b8c045c002c3a3102f0251ec8bd90cbaef6536ec2ee802062010410ab206f1021065e815a99127267aba6278f187c2fcbf4d4fd506f97904a34e7002128ce024faa16cd38de174fa58bf0fc5e9f0d1c0ec737b6752400210b4b7a00b15c8c041d002120ce40349ef4bc10bd0f0620fc58e0e33738ce68f62167895195ee8a150e7d1e53c234dfd9ce4a1a82149fc67b6da68911778c0e168d2f21ce35baf3dbcb843217ae8c9cb7a8c1a511228a05ed8a1188d1f787e66000b1859785187324e1d4a42e494dfd3d3a10c83f7a4081faae0055db0c0018a851773286ef293c712429ac60fabf0420ee5d510eab3f6e41bb424504039094e172dc029bc8843b976cf651b7ffe6a8c177028a665969df0e20d250dd395d2c97de186427c4d0f22ddcf84176d28b901c97a662878585987fe39fe665c19ca9be7ff22d4afde7c4786426d7630fa1ed9f13c79b83114a3c73209194d871343d9c7835e4c978766abd470612875dc786feb98972c83a16cd79911abbf2f10e306b38e5451e1bc50c8929376a134b7a3f3e9bb45c26709c78572cc132eb7693742354409b785c2792747bd3217e1b4504623adabe3792e628408978562b4b94bae463a91df65e1b05090d7cdb998d0d5783f2bdc15cad03e7786ed70d42bb14251d73364667daa50b4ffecc957f437832c168e0a6554598f77a64d66fc29943dde3be3374f154e0ae5903f64cfb83b4e5cf1031785f2e46cc402078532cc1f9edc4ebb34765d9ce0740a18046bf584324e9169c9ce13590524700108f204e78462928cf6a3b34bde15af09a50d9fdc3fd5c584d247f53d9e901d51da5c4229235fa467980e5001a3e098704ab04b82e2b8b21ba48c0c42558ac69cd363c708461d9541914111410a5ce02820c321a1f8d52d9d71aa3f52734728e7d7709ca275ee41d98433c2931b11538482d5c6d4fb716a2a7722143d5f62780ca68efc1c4259f28c5a4ff2ea54b710ca6873b54e6ff4e42e0885bb8936e2c97340283b0edb0eb3c7a4eb713f28d76f9610971a3531e67c5030f98df461623d2823c9beee911bc73ce14131223b1edb849cccb78362cc9e3ce728d16d3d1d94eaa3373e3df58c8d870d2e07e596cf8895608d3ec68783926475fd4998dca29419ab6959551b36daa230d399336391ec1faf453194398a983ac7fe67b4288b7b08f97149461fdd599443cebf4d723013796551aa083b9941c8f8b7da5894b323eb37f00cb2da8145c161f6eb7d365e519a1af3885122daf97145c9a1fc67e8ce0899d256143725ad449993158588e93c4a88731585716f7c9e3386a9a214a79d7b3be120c6cd5251944cada9a37fece0932e34e02ee80206a85a3054f4a77af3290aea9b24fe5b638aa24eae4bed5413a71fa528a6641c294a6dba6fdd1223368a2d1f7976690755c0022f30511462caa22667869bd3a560a128c3fc1f57eab5cdce1ba03093443651d55816c13e51520feba96352d648e389a2fca48a8656796712eb44a933482bf2ed9fda27271827ca799b1f6434e13a566d9b7046f3872b1b7308a689f23ceaf041cb26ef16402258268afef770f2f78cdcac98287ba8569d3af30c13bc4469c3dbc6edc71d3d78962894a4ba960d1b42d24c258a91f1e863e703ff2452a2389dafb7c1674f0d429328e41fcf7ca95a12a4b7cd9cdcf046a2b07133bd84a83d462b244a99a57f19f67b44a183ca78580587558082f28139a2a0b136a32678360bdf08d688726e448a777f95f820398231a29c1d47b72d890dd5d13fb045fc714223a688b2fba7dcd4597736994494b39b9ff73446bd1d4244411dc3140f3a8a7eff87285362c8a419e40d510e1d6b93761ca3fdbd1065e8377e1267be5b6f4294ac3f22ddfcb38e3d88d2e6860899de9f1d13445162c3583deea43399401422fec76b5db28b0b8842e408d2b82763ccb77f28544984ce5aed3946c30fa59d4c1f3a515599ec43e9936d6ef0b2110f1fca20f8c7381bcb3d14675e3cfb43a8876224b9ec96fef25048bf992a32c69ea2c14331c7d08fcea541dbb3933c880e77a62a3b94fb4745ea3b9f669aea50940913dff7313a9f9d0ea5729c9976de3efce97328845489af2167ccd97239146f42c3e8fbe350b417f5ec267926730d87d2ff7dfa910ffbdef51b0aab17998efdc273dcb8a1fc11cf51c3505999316d283b90d89d3e969e64980d654f11b9d3a7c69f425e43d91cbd745e4ed450080d2ff110f3e67ad35008aea6bd352d1aca11bf1dcc83c6194a99375fc8e498a124293d9b1197a1d8f6991d9222e74d92a11cd656227bd431143a7fd68bac413194cc91886128558c438d6af41b210706454cc673e8f1be504e8f23b5e8a87498ce0b051d6feb7cafd1dcb62e94b351457bc7b850f618c5fdc3e3c698b42d945de34f9c456437cfb450fce88854978c21ed958572c4b74e9225168adfb39d513acedbb0ae508e69d2d664067956638582bcdd494c176dc9a842a1b67d454365a77d5428967ae59d87f4c92a6a814da19c2b9b2649b87e5caa144ad7593242de4408f12814f67dab5d34acc894502887f312797c5e7a353ea19881a65489bd63d0c5020840801874c1021698130a9e8d24e67b79865635a190d17ace5b8d1d67b78d0985baa8c79f69b225141e841cba23f6287325146cec53f49644ca4f05337001088a019684f2a7fbb0d954f2f822286801c760140bba404342fa1a9212e34823187552f0823708942a25010a5ac03138801da11053d59de36fcaf73742a9df265f422709fef92294d1f9758612791e8e4f8442446d586ada8750d6e00f3cc766c28a2e84720eaf0dd79419f7f220942f3e3d7e8703a16c33b2b51a9398487e50fc906e22b9b235783e28474aab7cbc0785488e3287986a1e9495311942c5c77650721c8e63d3a456951cd3413933bdf3867fc4d58de5a010f12d936674f84cc6705090aa7f511f8de71edfa220ff6f6ef1dba22c599ef9333bff36b528dbe398cf7f71572f2dca29eb699d3a830ee52c4a2d9261fc8f9b0dcba28ce14a48ff911ed99158944ed363774cd1ea3a2c8ad5d958e75a7f32fa1525cf29b267ca7cd0705d51ce7e7d749e2bbcee56141e6ec3f27cbde93a831585c75f71b67f6536925514e54e521a9f740379a8a2e020c6244fc7dde0938ab29707eb9e9c32414645f1fba77388e4df68e8294ade386548f89829df14a5fbdc19464ebd14252f4df160ef8e3f9ea4287afe9c3e5755e31093a328fae69a984d8de7648aa2a40f7ad65376b6103314e9da653efd24f1944281c2499fb6633cca4f14567f3f75c6a0278a699fedfd7ef2cfc54e941e4e5d476dc88962b8cc217a7d7538083751a8099f2497b929fb69a214dbb8761c573cfa2e13a59c98d140e481c6779828898cb6cce897283f90101bf74eff6a89628c6d4c0e53d96d5d8962f8ce1fc73c644d124a94547ea443f4b3b66b64bdd14cf3fa4b42bb6d90b73723184558e02d381e54244a1f3ac3f4a0d3a97b6c2151483989be31a71e51948ff89235c611250dde1a1fbdf77c48230aeda9abb3f16864924090a502968021a01851b4c68d2ff4a1df956711c5d278e4e531f2b3271551108d0df66f3c8938acaec4d0a1358588426488d11f7abb4afa5870012a401da21c3b84eb8e8c1b6dc7fea00cc126113d7f87a107aa10459b4d9b53ae7e593a21cac93d84a309b91a4459bafb24496604518e8e4d6f2435fb6ea302510c1ad3e0248608e3284101a2fe50042044f941b5d7368914a1fc1fc12844f5a1e0991affac5dc000f6050db0c000caa8507c28b56a26f990764bd31ec1b0000108c002af62810b54b084da43219d6876f44666ec73e9a1643b495f33e679a8a3f2700a0f25d1640de3f4376cf72004ea0e05cfccf83a84fb6d98ed5098f4fcbccd161d99aa0e6dd0f3c6314a0e1d0add22c9daa36fe2ad3994c3973dde37b3707825224a0e85b0be61443a2544c5a124aa930644c1a17c0f92c4f47f0ead372b887a43396574d2254f086cb9a1e43987dc6033a7fac1016843b5a12cb2f52ea29d3eb2e7856243c993489e183cb6d9cf38875a4321fd9ddf59830fab1ac2a1d4508ef9ba2e26fde7b0511aca92414c584d1f341437d8a5e69ef0a9eacaa1ce50ccbf9a7cbbbf194a05e59118fd57ed34575f4461d224b78f28a2a47ed6a3a92336499f8872248f8dd214229ede102a3db37e88923836eb184e374469fc31ccc9d1c7a4a30b5170b03d16b62f2ee14388d237a8963cc9338862b4dbf840d7cf6386200a61ac2e36f678ed650251ce50dfdfaa0c204aa692c4cde17ea8fc0fe54dd620d7c70f658c4642e3eedafb461f0a6beba92e1df3817ae459e24488f75076cf9de23ac65587e8a1a03f8e7c6a33884e1e0a418344a90edf1925c143593b9987ce17dfeddca19873865d11dd61886b87a279bcc77bd4504ddc3a94dbf33398d20c3a94f3fe9fc6ea750e8560efb15355f36843e5509c7d705d27f925a5c6a174a5fffb333ed6208543d9739ced1cccd6519c6f28fb741049b2e21de274431998a69ba026fe20876d28787fb668128f0d85fa8db05ef5403dbf86a2976eb2b18b1093a38632fc883a1ac9221e676928cd7bd67e779d8c3a6828bd548e830c1e8fb185853c031db777c5af73cc5048752bd511730aff983294f6638e983f21ba1e93a1b8b5e9f56a5121c7508abf7ec9729fab8c1143316f4b9b499e5c8d69180aa90f1e5fb449c6196028fbc6c939e9c48d12bc2f14bc25ae697e4e6a784d21bd509cae8f0dfeef42d96b7ab3a977c8f673a1981bf74444bf88b7b750c6ee6da731a38eff68a11831049b103d27799c2c943c06db6ad160a17c8e3f59249fa82db94221e69c1eed86dc0a75963fdcb057a15c92d327879a0a85b8f629e2fa14ca2211e235d8f7ceaa148ad7f29bdc247bd8d551287c5de847be2f5ba9a1508e99653d116c25429e500ce1ac2eafe184f20791b7c7b3fe8e6b4251a33eb637769850727bad4d8d9d2514b36dd44648cf17be51427137ba6e9e8ef6fc9a24943a3f4c7f888cc6f148287c06d349f5365727f908070fbe9b71974628c6ec0ff765fd3e06b90885e497d937e7904722141c456798bb1f426132d3a4873a1142415b93e67bfed78748108ae932c2d7c38150c8f16db1ee0d83cb3f288e468624af0fca18fc4e671c96ba196142f6a078da12d27f1eff843c28679c365eaadadc413965dafb9f6cd6d49a3a28a47410f1ffd1747e68e6a0e4d932f321638c849a38286c8cb2b11a8e4b2abd4521a9a567cffe19c4326d51889343fbadcbfe64590b1a66a7476e079016459fbacaf2f029217f4cc05994be4cd33dc44c571ecaa21c6552e33caf51372616659bdc77ac22672ac3a2d0d55d11caf5323d5e51f2fd98328bcdc3769c2b8a29d32592d6521a79ad284c7c6c1f3aca698c8e1585f0d00fd27df3f1b38a92c324792aed1373d85451887b1a624a183d4b2d15a5949dcb9adc382a202a4af9206470e73eef393b45d1273508129133e8da14e5ac3df14e34578756a52824dbbba86ac7f2a82245c93787915b4b3ff7979cd26ff8c1e324a0280a353a1342464251f635899edf715a7f415196cf48e7f04fdc1293951d424fe899deb3677c270a3ba99f421fcf89231ea97f364fe56f4299903f26499ec7d7441abc6dc3cf4411352479eee03d267cf55c7b9b21db7e894332eec76ba1d21fb7c4b7fab357d31ef4e395204fe68bc88de2e3943063d5089d499467f626355792b8c61e630cd3636a0c8f045123a663209e3a24d4e0a621e88f28b3c3abe8dc11e6c818ed7abba98da0635a2fcb911156e8ccbf74fce4b80863dac818e458ee372ae2f8cd7fe3f844f0a2da312188c073533d3ffa10ed9b98637095ded036c4283feffae464b20bc164fb6bcd988d4d08d3a33efe60e320e890d7d63787a31a0541de48677520f8aeeaeafd20208831feb3f563bafce01fc8731aacc14465fcc0e7f468d6718879327d2859dc74c4dfcc21321f460ee61a670f7c4c0e3ebf2da91e3d94a333fc344e461ecc9307325ebd7da877f0c0bec3d01f6fe2bc7387d54524a675d4603b589e93a70f4daec3f51372c8b76a31a183fa1923c6d509923998f1ec8617e5c04a46caf509b161e2708ba3fb2beb190d1c0c11b78e1ce989e60d9d8e398e279132e306bd432489ca07396d184bd9ee6d0e3e1b76141b526ecc1acce8769d276a38d94e7c90349434a7ab8a3b190d6e47447744758ff10ce6476b9b3736838d537c1855d96c1997219ba08da23f474f900c4ee62c19a3af04c770d2becd301ecd542206e26548cbcf7be848128632ba83e99220187695c81fa33d44f2053f35ec852b3dc68c60171e6b8fd2987dad29825c306609a33d11dcc252adc937f7c2a75ed4c2601e8c4f748fce62164c963949cc2216be725309f70a9564b3c858a1c6e2308f5b054be6c1cf630c935420577b1f079f700a86c6e50f3dc93aca560a667f701b8f289012ab8166a5640714cebe1d39a3b5738c2778719e71326685c30906c996db878d26901d235fc7e5526f0d260cac5b42e27fbb5157259453c6f0e34926b37134094ee3c99a7d1e9b22618c6fb2f6e147e8b45c1f369698636e041d6a4c9f93755d84dd7d421e6b5d8408668fcfad791c4236492194f4321a679c7e2863820083c0d5ce3bf21208e69aa98911e951fec0601d63fc883e38976a6418b378927b3006f171cd7fc851521e280f3b84ec9e873bd8b1a3741843d4c151a3870d21e6c0fdf22fcfaa8f75c4c139aacf1db7c8ce7348f758df0c5b18bb29bda73a32b4163eaeaa8e272d0cf2e2c85910aecb3344b70967ca028d4bcd0f7aba8b457a211ae4ebb175b0b836d6346d78dbafe06dbddbec7147d8aed8af7388b5e2ca9cbdd2cc0f63c59941e3b3c9b9a11eb60a2464a4d4b80c2166982a481f2277a794685a2a0ae793a6ff34425d68a858ce81a4868c553b85fb7152fa759a182a330519269b4d568ad23546bd435b9990c2983339e8778e8ee2d6cdc024925ff556a258429ab43eeb1bab501c66ea683573961f149dc7f08bce274c21d9d3c31306cb4a07bbb154ea84198ea19877ab038913a50db9c96c42d6dd8c364187fcfba842c2224d904925c7333c8799a8cbb1c6c4ea7730319858ee6cc2918e6cf412c59c322eb3465c3df52d513607d15357dc45dc5d09bf5646e5a64421f875248f31823ea8275198f19798d73276742c89f277d23812a568f598abfb4df348489455d6f3f2e43b69d61e5170902c46be518e20737aab31b86eb311450775dafd38a9d5458c287b35bcccaffa22dcd81d43349ca41e45148249c32a8fd1d7433811a548c9d974e64744d1c1962795f01d42dfb64d91f71a821082b8ae6803ed520b51cc7882cb3edce4283384289d4d249f143912a33b886378784671b0200e9b1b63bc5b2610254f99fc5b73d6db1f10c64eb549b488bc88feb0d569dc0f7b7b8ef41db31da60f9846dda4b268209ee143b94194bf7749f7f0957f7e877a40334c9a4a466b827928858ef687479383d489873623dfd015dea1fcc026c57aec40a8533755d98cd7ea3a0c247d8ec48f666ada70742859e4cc993d5ceea65ab839d4b5e3eebd1a299543592a35af2a73bb2a601480a03d0eb7e7b8f37dcbc98043b935ad8ae75c3753fb0d441137c795b9a1f019c854d78652cee757df7061a73e1bcab13c23a45d323ddc1a0a12970f937a497d9428200106e0706a28a6e6c7703388f7c0e53414424ce2c3eaf6d05096082da96375063932ee0c8553bd92adfded028b9ca864cd86e2016930160b0502a128248892ad1300c31408000030260e060291284d025dd80114800260221636241c16181c181414101612148501612030280e07c240302810080483e9921c2302eb07902535aa93488b48b18fd372c66cf09013f19c79b16b1eefa70cad94adc77f0f3ef378e7cc379f02fee106c2af1f4bca1ae8f6bf8ff30d59b243d815b508796c424eacac8e035b3efed0efc7d6237c4c03a15984fb235c486920d67e9ce42e622e718b8f3f248468aa7c7bece0f1f520e6a1c423750f64fab879115694dd1fec843003a1f8433e90d3dc3ed1a74c07a89a58b7540b460bb45a8c1612b5fb64f5f4e365705a0a2a2a382cf28242c48e8bde9a85293a920519b41e91fb44cf8942265046a20712b04d849e881b0990331f806d600488c7dc69c4270a1063597a4c400445d724d7f4138f24f020a28890be123dd3b7dd693bc1ca09d0a8047042f3088a343950106308e310a522d049040fa14d980fb53549b81504cc5f80bcb925c9e5277a4898c6a42b21ea38a227c37711ff9b98fb09901cbb7a082a099c0dff3bc7f7634c80e8920b0f420f261e547bb07c90059123443a23844a873c235dda2ff385eeac13ce5f2aa48b4004f413344cb0244241940fe1ea086d96257021ae0f849e1c10affb5e003927d4bfd142f8ad083d896441f480103129219d6a816f9ebee9b6d0737b98c0f1a5a609b2960009074b0d6d05e86dd13099e0e80d614b7c3cfa9f5832d54b6651398860cf4389cec560d3a25e07f3bcfbd1b2cd0e267af51e23b0e1568389348b2e9f3634ca942e7a6d79dfbbecd4836e31b88d4dcc0d6ada2d70b61a15ebd0ce7bb151951b89540823fb618244f668480332941c1da9c97aeb2c71ea8b2f827b62d3f02c15e6c1d21232d6857276a1489fde5bd761ff6f73202f625b0647a03cbb0343e90361394b1fba358a6399e26a23d3237f48b15fd9db98dbc01a318e63d675bf55c66f2c77a83feafe2aee86905622132392ee47359f7dde4e87e074633121bbede40f84dcaf52a830356b7417fd35d73390c7e3f50820b3980bbd06874b4cb8ec62f3ae6c3a023e16dcf2a77f3092bb9bb7fbda32740976c9907ab552d212c987bb1e99ed886ed60e002151002828570b6078b2e9f51aaad13a42ef4c1f59d92eb762035d7f85ca5823cd1ed1d4f97be2dd1e0abd4e4d4d596e04fdf16253b1fc2d63558d58508f440fb6bb93e37bbaae20b372af40ed6dfbb8bfb465d7c82c7ad8e00b3c9299ddee9a3d4c5605667b39409b865181b3b5645423d490f63c7044788b109450d84e7fef6aa679cf5523f13040683f7197dcf6bfaab5dd23605eefda2d08aae984d2fabfc7133c84cc808dad6a64628214454eabcd5a26f6cba1e506d197d55b4f994de153aee3352b7fafacd772e6ae1b696fe2bc474784caf6eaf111fcfc55dd6bbfd1fe92ff9ce93ba6ad98fda37bbe40bd069db1dd800ca239d754af1fea1a817f8f9fbb8640a63309fb626930b4d9280d206811e3eff989bf3dbd8339f5d3ae235d71eab249dd681d4d5c9fdae3b52b9be5af0b32bbcab2e4948183aeb9d6eda393a397100cae96b477688c1c775d51ddefe496cd3e84c8a93fc4f06e3d5bd925a04a0d22b5e151b00c2d87d1bac6a4858b7aa8fdd8d8f170e1966496b5a7e14f50b9f75716d2035103fc9b8c6e69f2a7b77c549cf57a0d4f92fbca6cef7759f41c0cb1eeb83a7cf29a76d9f7031cca5ee791049f29337a0926bd4f8bbd970f4fa2b0fd6882d9e977713b99f1dd68e8c44deaf754295210b678cdf561cf1360019fc73d9ce5b59bae177bdc10db86ea8afb1b42a275ca387da0a3df0c765a8e2fa07703bb5fb0a5ce98d96dd0b07168878ba5e4aa0dc1abab455487166d6bf439a0df52d7c8ffe1781284182e30503a56f7e640af039fc5487644d7e541ae79b09ba421bc5fb7067a2f2a69cf9b62420d6a993635c3e7b35c0c0a8f61c3b00e862a317a04623f43f71dcd7583a39df89ae970516fae4391acb347e8a0aeb78682dcdc6e0219f772a663b4a8894dff88960157a686955e06147111b92c63c004479da799cdd1d7631c121146224f64bfd2ce6641d3a722f28aa456ecc8b2342fe62d6bc917c2977cf08b3c37d1cbc162efd2022096b9fcc63f51256e108b68088a91741c710d12cf41a4f4d5a55ec7214208a3b001f588776d0fd3f2efa68b4a7b7d8af1721449e139e29d41fc43e033889c767c5b7ff79fd2197421e9d9d894a0f0861acf8e790c143448bad097448174d2e388485178bbe805c2a445b69911be3e282153ca69851561bf560e94eb981e0a80409183641059e707d82579322d3ab0926944b4f6f6b5d8f2ce3d980ef933dcdec36e00175244c904066bf53046f7b4aac248cd4d55e3c670bbd177f723273d8e1686ef9a760daf690a70360dbe02eb739cfcde14f71bcb9ba8f462faec6bb328442676b4e9321756e8daa020f2d9706ada787ffc232b3d094e0472d24ac2db9746fab34869e688eb3c5a65727d8ba8ab245093400ead67729c3478f9dc333704cd1fd95f27d562c98e009939817d367399cec46f9a8617c07f77ecac196a43fc71fd3372308b7de6e465bad53e688246b7669eca42412f11c87b19ed68ff97ad4b0e1b6e6494224aa0043de17940140cfe927d595602088ff2162952b3c76ec5a1db96cf880fb050fd400bc183f649140d98ad780c568ed68e86855badd4e965c789b5e54e3ebce8d260bb83ae44598c06c95631be5d8ca26a2c9858fb278f3d2ca8bd80289ed3b58973e3664dd41f66b81b52bc07acea25b957d2f866999ff7888e3dd1ac0598078d87bd560c7ba274344a7b3221cb5cb3ab708e8997ed2b6ee91d43b5f7a63971a503ab9429473a3b1d05a8a39c88ed9d2577aded54bd29811f6a7aac9e92e30b0b458344a6cb804ffdab60492aefa51a71242dfae7e43499b2945407ea98d4b41d760805d95669747022c0811b90e971624a1c8fe0bcb528670d5867904cf05e6cb2f6ec9be5045d2c1944095f5049dc390d74231ee79641864adb466d98eebd05e16ddff59b572cb4d6b2cc1619431005a105b5affe3c497ccd483c842691a7d3ebbbb6fd04c7c27ec0aaa42ceab060523773f4bf87931b42a6198b6299dcf73c7516b0b583effd575b321698e15fe8281ea346258009b91555ae2d1b98192ef769091de6e94691127c18c06bf5fbead769da2e9c499eae9d955aebc7f42e175fdbeab2e0dcbe2736845370072416350f38aa8a24e3cbedc27f3f48fa4964f198ef452651356e064217b5eede21084211dc21ce713de8f44980d5b8c63cbf9e2496137d047e7b102db30daec62c0c25192d9f8c4b8b9a60b3394162581f1b940610619e10609bbeeb4d8db525cb9a59cf20c899608300b2341cf7d70c2f8fbe4ab23dd30ad5353faf94da4ad46123eb058a1083ef58c50a73b241d66ff24d9f5c779e61e3cb0e80e862de6d8001706849497ae5005863c10314bad8b6c2aed9fbfa398a7467532703d1f747a105e4a41003efc02922636e0b48a9c17ed54a6dc4364bd48e8504dabf0c8afb9b17210a21fc8ed601ca970fd05122a384c089b72f137bd3d061b78f6ce45542d1d2fc8c83a1ac348f921d46f17eae6aec4a6be71b7e7f609c48f6130064653b08b66340cc94840f2fa48f52226c2429574ae43a00c6d025bc8860bfd5540b4b2dcf932428947cce0b433583e488d0d913ed58dfa3c667a915c83c52490ba567561060fe741ed64c1a31195504f85b4196d096e5734696894c82c2215cb5eb492a96c0432e5b0b6af3372647a2a86d4f30de931a7e9a7b7c87e0b7d9c2f20b2feaa92307cffb86bf360deefb344cf662c90a3eeb180c88c6259804d04c91792842b2d78059ea2a549d507469af4f2d1bc53144aa42eac5d7743549460d2ab56150ea17c2501bcf3e8161d79fab55c497553d67f7cfb125f792576db40c489b100c135201ef48eeb3c8990e9e95d3605462489f8bfce1b87cbe1edc0380bdc5ee5e68617ce55b6c90226ab0fb1d07418fc9f705560f0ba50ac777ca450ba1e5e0eeb6218c2da5fbd2c2a90e765ede45bf96e9dd2b3fa00dc114d5eafa0c4ca192d8f4a15c1f0b206d90c713ff2f73941013184a2110ed24d58a7467f8ff42d824894cf8bf31294f82881bf3d9c705a74447414d4eca55797440f8e9854848eb028f42d2127a1e8ea10e71c4c1859bc26a424f81b5e09e87775d1086437098c445de7078fc59a884fc636dd6c2bb430e8629ef2ce3c4fbb68168804431f48a3ce0257d158e216f4c2e22be32bccb48fb134490000826d06b280b972e0138843b0229376cbbebc001b684d7053c85dc3944e9c7af513924c239545214a6c01e914f95309968b76668ef575cee74f979d921381a8e4b439e2c454aa29b94db55f8eac33cfc72e9921bafbd5de2b20fe1eda4c1e22c19f841704bc4a9e237f42967c598519e92f644e501ae7105cb6d6637e4a3b513a9a356644ed211925f2d00f60650919ccfb5dcfe0101122fce324c420c0acb74ac8e80f64182045d322514e9ddf47f214794d830d48f0f5e09c3e561ca2cbc8629eb7c4d74372e68109c03e30c2fdd3eefdfd97e2f4f8b7d06fd6d2ae769a35a9fcb51150d6ff41fc048a2c684eb19223aa6c68777f033d5e34f0689254624cc1fd505a7cb73cff60d4b26e85ca80c533e004a41d0a14dbe7c3b39921ed3534aa990bf2ed7569258f66bbba3c63087b77c254f9d7687f0ae82c14a13e11bcea2c39a190f1547a33e517c1820532e4b2c0667321be289193b44266d99c4c6dcc41e89d645bb8af4a732307aaaff61c133513ca15b527f2d3608ce0c71a9e6cc0e19d7e2192ce30017efc48d7d889834adfe34dd6e8e08430d17556982dae5ef52fd390269f5085ec4cdf32fd7540088a4f3726385cea2aec8fb12358cfa7b75643c56d829c2031409d85e06d92e5f75d19dd0826908a23f3eea4f81b8fbc921b826f5b7e65ac874f2b01f31d22c7a6f89a1cbf999efd6b2be5e8ad680644f56cd4cac719d11cee0dc5ff9c28d149978a5f0493a728b1be19e791e5a89cf1427661415872fde6ccd09a1d2730cf24ca10b9cacf0910a5e6895ca6adf886159800658af1b07766810dc198996aab8e39478c93fba4b44e2ef338f74553da392c4f35cbb0387cc44226827d7751093d67ad4a74ddf34b0036e966a63b0365648aae41ca9feac0841c918e97cb56dbf3428b9218f39b5edbd972d3861caf7f982d89396c47672a234d4e3eea9d86e70affc349f5cf9bf8bb7490f1fbdde80a949fd413a0a45724394ea45e1be82013991507d35dbb21bb4165ceccae5700ee3f323ba4362a45648dee7e09495893f3006090f57039fe2eb830f4aa96483b08ef8d166e5a76acde04bc1eb08518deb60e863c664525e8447bcee96d73b2a42614f1e10ced287de3f1f305ff99c07c9d0eef053028075a7cc4be0fb303f6e080eeb04ad49f23fcba582ec4d84f225fa0795e2119f8c47633a987cc2e4376797f805dd6e2a1beb4126624ec5e2310862c7c269d0eab25fabb30cf57ea9491571eed860a6da3241c2c3136b3e5b4a975026583f9fe74a8147a80d0200a1aeb2f94f846a011e34d13a9e1ead199130d4bb2fa30e319b42e1e319834ea2f86db9287ebb25fb3062d29655be3b7b381f4948b575466a36a3a1b378ff13a04212725603d897a1fe203569ad1f8000cc0c615762bbb915e1596525ceea6532499cbb9127bca209157d7af72a959d73e621bf728d4cff3088acbd5313a52514485c1d15f3f03d43669933cbaa73824656d2ddcd832e12336134a3d2c43874f417e59221c94cae5be1ab9e9a3dc017e9fab123aaf40b7f418eeb50dfa82a0974d079b58d05ca2e2740079e01475557535587cc0b2a9fd028a4655abde482f1760259de43998a4850846034d3ca73305c6f2d7634f6b82c7bc224fe9a4fc9aa2fdeeef9bca7bdbbbac0ebf5b243d8c9bbd2d0e97d6ad4d28041bf3c480467435681c8bdaf3a3c675e242acc7cffb82cb4a33d2d3ef3a90d492098046d5d173cbe6a0d41f6b9e33c6be4b71113b487dbc3e8ce605b8990cd683de0ea58c9771638c7ef21eb3c7bf46deb9187533672a2ac07a9c5070b50a1dc09c22fe9f2d6594431e9238570cec4753e423eb6ac50bdcbcdb204189ee102b85ed7f8825731dd24042f27f50a884231e86e050920957c40c4af754d253cd10eeb9a23b0e83660235570a64d3e4a91189c71ad4725a4aa0dd442c1abf410d18338b190c46af29a880ac2754f91569542082525fd793a49d13c05d62420b5691a566c1a1814adb582212774e2055074f8032dd9619c14ec5b810c26f545f79093c09ef8982f5d3d8ceba3a5b4fad61842d9b18a70f7c111689ca92a93ba4a0385d42cd920b32bfaafa11dba3d248444fa728554103dd54f04484bf4860855965512a1449f20405c2cae79c5244659a17a31d0a2eb80da9adf51bafa2e32c4e9d5722b40a395722d9b23c6ed95e0cb20aad3eedbc5dc3d9f40d9520b0b8653f6c96a93f9a948e0096b38982bacb4d97a92a61ac00418ff500016629d79470f3f102b4bbaf4d56616d1e9397f873b4a146394b3685db4e3409fea1e5681ab793b6ee16aea4db306daad837ebad4283ff1844bc59e586f4e166b31497a32d350b03152a8a3385431eb06b20360d99d3a3ebeabafd0276bf99f078dc0bccb7cc713201ea404874921bd3425285a7128ddfc2723cd5a2a01df04eb65273fa0dea85159e0e487f7d649627a6637888f882b5e19005824ae991c82c210cdcc1f37b0b18fc5d62e665e83109fc164cfa20a25e538be8afc7af03d6e8d33dbd18be45234cd54e16a14323c0588f1f1b47119e4e9a8ae027374690132b0e440dee6754cc2a03ba6c7ce4c76da2318bf0c5c053e960b853102baa3cf9ea544f8e0102c9ac195e611d787dc6425e1abf2d91a3f7e60107ff07e82215879c45f8998284922146a174ae92c25af3c33c03e7657bf49be00ac716edf4ad2191b5b107f17037887551db8022398ac0c6b188ad96f8580bfe91723140e6fc7e935a7fa6c7810d28074a861f144116d551f0ee857df0d6a814647cf8b361d28bf1f7bbc5364ff397b39bae6f2c814d8196dc8b72bf7def1d46c45c825f0a21b3301889ee1dba286c2eb37cb6ec67d73cf62cd80d25ba18119470f83c24b52a09cecb3dbe45e6287774f8e127f1cc0685508a32e827f0609ff58c313622f0ad23260c3206c33931864359dfd0a56cc5fe5c7c56b6dbd4fe75689e56378aabc39743bb2c2838547760845a2da46a11d8a183694103f89695387cf183af652bd31b98a2ce94c10d9a05486e3ef815cb3859b50bc0ef8cb4fa26065346bed4b9faba950c5a6372fec1b71201569025f944c389e935b61f391f5688785f109e7647e7a834e28b327ff5435321b845060c3480aa0addf7553f9707c19ac7598f2a0a3aa79d970409c34184e6cd40f9feb5c4e4fb93f1300abe0710554631682c62c3d4aaae15de12f17ec29df802dec46f301c50567100d6e8f2bf03c3d3ef406fb19bff67804b43ad670bedd2f370cea5b795750da23bb889e964e7a8080886dd41cc1e8341296cfbb82f743ce0af3627ff5d7907c0e4d4d624480a7ab049302b019de38f821776831614a53933a174c266278ca6943afd511179257c59eedb09d9c00ad8682a000288472af188f236845ca3aa578630ba1fde06f4d4c638f19442f1de512e046c0d7270875ba1eb4b7f114cf98dd540f30bf8905554e7bb5395ed464d90246ffcae63202ff1bbc28af17547517957b43d912d179ddd5c034f97380998542f4c094aab48fd17d744ea337d74665406510118d528ed28fd25cbc28e07069e9e2ad4fd1bbe61f1e5d2e09aefd36b7240e4ef7f69f40af5157d842cb2963dd3a3e7e8c78a7a25dfbb725543d1a217cea9ff38194edda9bdc0072942accc63da0bfc4640074ac0bcbe3ed1b1f52add540bddda71e4485491a2f773954da750e2a8d6e230281ade4fc378748708790124310b681a6ac05cc2a03491a5c1f5c97d3e15979a2bf1e3b5ba16898ab83823b1e41f0f4d2e2a1184f2fac71d7b510ef9a56c00eb9acc8f818dbc376d0ec06cbbb392afd1d0716bb37ec82cd6ee8ab01cf30d9b1b28bd12edd7653b8bd2bfc53f3a7665ea73454c96ef43ee374c4b18be4764315ed17aa033b7676467656dedd740d3ec261b61bb50d013661b29398ddd4c41efc50bad762b2559ef7b58c87c71213b878d77b43dc163e5ceccf65072998a75f5c0be6250e0af7ae5ba070915abdf9e34b25232e38f9be40c69499c1fceae6a0fb11db45db8609f20a6703ed7280ce6d0f4dcc6ba577a0b7d92170e89183781387ace030d0e75dd01f96ad947611d77518410fab19687df9d8eac620da7a2c2fc815f8cde386b0262000542f1f99e3fe9c41d485417fa6c20d08ba6bd311146ca83839c7b20cb02179176c59a2eae4091f3b3b02624f0e9c6a39842f34f70a97c0c6f93af7e51cf06c56d5bba5a814fbbd3cb80cbce32e4e11e09b1a262b8661a862d2a2879d60ad3c5a822c5c129dcda28010601a078e74190ca97295e86764b2f7db5dff2f18b8980a09b8cf9c7b87c668f85952b7d24e69301cac92c74a62354d3774a026e727137ca371a2c222ee05380b1764a3bcc8e0da4eb71d1cbffcbb3aa2d71204d31a3d6b18100fafa9973251218789c8fc03f127d7e3c03da20721e8856b4a301ad820c9a99a7008e7af92925998e7244325e9a0d4df62110384b4fd8aaf7d19162701e89db33d99f10db76f6f92b17b2af01d60e52c5edec255a69f4375e6c814f50e1d59593ddddd246fc63c76029cdf428869e77ad8e6c0a40ba9f7ad1ad241e2102ffc6baef1f2d3da4f514d7d0d41e25ddb190fafaf41c5c5416b9eff75342b46934421c252824b1b5e41b4039be91fefcb6a9d9ac6036c8a057064c11a559a161ce33973900b8580abbf365070c2285f3c3e56a4303afe5652b7ee4b8ade32e7540ce9ce69fae0f905e2a99f48152c0fac715f544c90021013b4b72a5f0fe5c02d4208c190cbb38479ba5544cd564ba121ee6cbf9e37c938752e6584868221f5ee09aa9cd2de2ca130aced9534c10dc63340d2702608726d9653b47b25bc09fe57bbc63b81343c0dbf8665505fb78a32e5a94080330b591b30c99f3c58e8c82bf3844fe4f760d087fce77ee0b508e0cf88901267624477efcd95536e7302c66d3465dbfdcd28c5bfdf1b44197bacd8ac0020342efb8b50b1c804034886f549193badc7779e6c4856c40f277d457a76c4c0e3a8104206299272d19741803d63c37bc6d71d26d88a3982587e97523b2d890deb86ba81f8d03ad5ef1d203e2b7ba56ef127b771c08bedc788c04249d3d5f923733bb949b3dfe2eb4ea625057eeff8489b8a250cb0d21ca0477bce5abe38a006ad63f4ae57778f2ab4d9ea0c6f5ea450dc6f4daf65e4ffa7564812f7c0db8959bbd36c04d9273b063cfb4d2e9811c7b60832fc64b9164e742b955e2afba00a4c900521ffa8ca7f95f0f370b548ee01c13f951667168ccbf967c07e4f82e534be103ffd3ebf12dd12b6b49f5f855957108ef5983a32d3ebeb6f76faba7b358668588c436170d5225c92e750e064a64a1bca42b5347422586ccd435e5d428eb8be21d5ebf6296dc062d2776c6042d9f6fdfb0110b35e55b9ed2bf52c6d387dea2bbeff1d1a06a2489c367c20a41458eb52876c2d87f5b2ef002ddadc2db8d5849903f1d338e3a3ce29ef3969740fee5b9f31ea128eb3cfa96bee96455e40ac64d0e66251612ba45ddadf4d39929a6f38db1c53b09e07d27556bdebbc866c6f47f971097e45444a14581ed9e8943faf9eed86ee188c190b4b1b9c1121951ec3620f32b5a04c7fa5fb588a6c2e509ee3639e3dc81dec1e35a25e6d94984ab2fd3a97ed7540007d467aa8c6d79369001a9f3d59719beeb734e21dfe1a289e8d9bbc23fee7375ef2176652cb013bb2a10a39dccb9acf31db4609cd6e7c30d94a3004646fe4e2a0e7b65a6caf7257936da76ad58da1ca65f5a03c3daa1aaeb2986affb6678028da20917f686d327119f2dda9fa9903c91579b170389d2a76e8cd87eb9e22539d7567be0a4c6d487979d7f36a32f7d88982d89c12acdddae2cc0911c13d5f4bcb57c0bd6b1a5c8d9ed74a77ad633587b2e2167f45491025bca49bed386fdf45c9cebe7d248a4a2776abfe23423a30ad30c6079701e41f83c1416bfe407cd8072b799c8235b16ab0bf497c83cfd61bbf35ea07edeebf58f6229d80bf99d52a8d8f8395d0d96358ff2c45ec5f59de42b883102ea5280d2ac6e688c9ba4e6bf52edcc10aac39e3c22f039e3a629aa63d7394583a7ab1ec85fbba6d7a40501dfb429cd0df76849ed90d4aeeb8cbe51ee8f289817c5ee7a4ed79f0558484a259ffabcb6e63f35cfc2d2776d0e8e2ccb9fb0e8a2db8bb6353d0eae5ccfeb4a04373c0fc606225527360e639223ceac81629bdba6f0c4efde84f2aa8e07f06e56fb197be31ff98ae230d4df686833350c451be996cf088ed07de9e508fe3d87e6b25b70ce2be37ced032c8bc1d965cef86b7d9c473226f0c27e30449914ed814ad87346257280aeb40647d738f819d84599cfa4e21a10f6b807ba4755796596a8b376278b76a726e46d6b21773420ffdbaae2e926db10cdb9029a3a93de02a355aa10d19b0ead3738376573c272401b632d27ac0724dd14a9b07b22f1011f86064c30c945bb4d4cdfd50eb93241c374a7aa46a459a437e4d3c260580c440f22323804122dbbb68a6c6c34fc5776a2e6a49bf92a034b05c89d0d57e24674b76c0d04effd7299e3994a390250ccc6675b046c224366bb0b5e227d84afccd67fe5dabbf0b6fe2d480e22469add649444429af48ed0118bfccbdf500f8a4486e8cc76dc108e4f8e61b055077b54b4f01cc6fb1e73716400f3d35902c6c70ad3713b5613e296c46a7ce6fc110b64a9c9a96531fc1acdeeca135321c452c7b804b8da3b2a5200b8b96b98ba03f4be62119a00bb7e018a0e6f9509425274938136f4e6ef0ecc020afaf5c58d87d2c65fe67d966515507439ceac8382ebc99391a66a09131c2aaca6a189b9877cb3210e9d26fa609016697f37525592d092d37e0bbfed4ad1d1cb21d25b610f220d136f3e964182061d9e469259390ecc2f3c838ba72b1246cbff034fb7ef98d369be118900aae502a16f90d9ac91ace0ec3517cedc80c65ac43f66039c6daba6a74a6005e364e82f4862ed488c6939770cc1f5d5ae14313d8b61d40c1382c62a5633be62c1680597690b6ef637ce47ea23b0024628d07b332ca752d0c0e5d15c0041b023ef72e3b4bf531dccb32c33721784458e0d966b39d527328879d12c0c325cb601faa41995a0b256e2968234d289269863239f9f865891dd66f0180b8c2921d317d9c03e3a23b9c5429bf51a78e5ca5391e46c739d3aaa07623f6cac2e31da04c4eca805b385bb607ecb9c5a215525e2af0b25d468d88ad5f183c6458f70b5876f50d78f31a5b938f0c381bb70ca801c01cc44d9c9771aa3f573759912311db57f1198676b5ba6a7bc63d67d13445c43a8749e74261b15f5d0a3b5cfb9ffdd0433a77d18e9026b43507920e916dde60543bddab472b6078f39685d9c8947400e4c080f38e5182a174afef586433db2cfe702ced6511d2f5ddb5f6f541dbb5aba75cab1eb14e7d3b83837e3cc364dfc9afdb00eebf02a6dad255716542199fa5889add195888506a2e00f10e49e69dd0ec290d9bc3c662d4e239faa874af12fd6a17adb2e6e25e7c5bf91efc91411eca8ea31c00256eede6fef03b43d9c7ac00a23cc5011a17af7b3380b4940ef030c30c33cc30c30c33cc703cfa185be766f66e29e9fa6efdf70414eacccccc4c959f842ab6cb398aed728ee2bd2080078607b007b68eeb86090de9119a7793cdad8ea246201fea56348e4f111a3debad1c424389e07ac8bf7014161d42fb917b83abc89603154233612cc390e1c4d8d6e24083d0ea7bce8db4bd524e1e10da1c9eb2fa5b83ca9034417f70c3d4283639d6a40fea57f9cc8f65db82d58333de149284d99d9f07648f54d0ecd9330c7770f44eccfc7440780c2d87bf4ebec941fee1256276e5e0260e4871374ee706c6ff4bea501b78559a35e32cb935d8ab2bafa65c93140deec665a5d90c5eb3ec4e1519dca1e1623762e0488a79260e832db53a5ff805078d97b363882c31e602ce6148c13f6235de02bfd253aa3594056ab67bbeca4d1aad8206335137a3e43caa704b5eb30771298d5a2a8a9093e1fc848d252af2e4622df213373d05492ba3534cc1496b79060e4c764164295a29ffe4152f5392a2cbfa188864448b943346d1b4066b201ef137c69ea268bd32fcac9453e8095a86a287137422a418287adf580d93296af98936377524e253f34c7b81f444279f1d912b4988a712086427fa7ebf8a5ede99abe1e4449f739cd88b8ca347ca6da2cda90cfbb2e3ab01a989fee7f561f5a570b92d44c880cc44e31de7418392a81f31582815564162a2ff70e0793d1b29c84bf4b83cbea7b2d8628b0f5cb1455114a425fa4d198438651d3364453830ca06598936c730fed0e322659094e8f72d2a68c84e02a385e16212fdab04cbc8302c944c80314849743af91cbec6982c3c127d4f639821c7190ba52bb6280783848422163d61a1248247f4d539435f6278d4f860a1e4881e7f8ac9df75f4410835a299cca854f36a6898bc67c1c516a55c908ce8e27290a4af295e615a44737d1d2547b662fcec7321820f5cb145a116a4227a198929cb5a050ba5c1824c442fe68f634a8e919024254122a2934a0f21a3470b2986469087e8ba4d5c11a421dac8ab51d47a46534661a1948577318c4e9085a8421c27b3f02eb6e0e28a0e3c074230e8074908c5f3630f7b21e57d10aa64781d7ba9d515411c354f6609e1f10dc429a2fbb6c789116203103fc8d413e633ccc03f701d2ae6ccecb6de0fc33c8ef39494c4fa6023ff5c9261a9e513483ef41539e71bc8bc667df7d0acceca6988bc97411584d4439bb356f4ccfde4a18b5d0b31e2af3a0e173c741e312e9546ec481eb9437b9d9b525af767bc6e873e364aaed89eb674781d9a89e8d0b7472f630ca7439f2bff6f889779d5c3736883c4c739a776a98cc2726862cf03192d390ecd8518cd4146c9c8c784439781b4b5e7c9b8a5e01bfaa01fe263495cf36a6ee87306b142ccd2a71db7a139f5e9f8e32042c68a0d5d58d18c4a215d8db3862645372a93bc714a1e6a68824c8a98f23376494e1a3acf3219af7eeebc77d0d049a5907b3e328f85ce19da779851f4d598a10d930e97ee9862ca656875f2ac6f747cc972860cbd85fefebc9e3286b652c8d6ccae88a17d5f0f968137aef87d187a20d1cc3fe6ec65efc1d05883a89357276570fc17da14b7a722c60bcd6fa4a9eeb6ffc55de8a1793e7d57cf6a12e1422729877f7114c57ce25be8e5d33d7386aa165acb3866b38c7316dabfd8dfcd10c30475b1d06589d67929642dc9c02b746272da40b395c9e4acd05a6b74929691cdef55a14d65d629399e0a926375f22e898db33c05fc7d42d0d5580a4d34af28daeed9e25751e8524e512e5ae570ea1850e8b3642031e7cc79429fa94bc4a2729cd094e498fd2445c6e634a1abcc8dc5e1e49c1f84099d3606d61badc38796d0c4c81327e40c253421192e6c044d12faa41a7f7d7d247c7a5943f2303942db9ba42aaf5ffe2e8dd064f5f468c828456835a4fccf6411a1d7cf101b633577985186d06695cbbf6e92561a21f4322926292d85142b1f843e9b5b4a712e40e84c4a47bc75923fe8777d3f7ffca01131491f68217bd067fdb79862d6a873111e34794fbb43d6cc93213b683a84e54bfdb90e1af71ccda2c5fff4c873d0affb6ec36f71d096363c7fffd8de39dfa0cb9225dba0074142ce2838ca78f11ab49da3242eec4b83f6f2c60ed39993e5da19b4216622a6b132e8675ffa41ea652c7a0c7a3cf916e163cad0458541175eadb2483e066bbea08bc9075d69bebe9e0b9a5f89cde71d3a7f942de8b3520a611d849a9f2c68de3b6f65e8afa2c756eab12ae5d70a51155d74ff584fcdc83a928a4e76f53f7e4ede63a8e837e7ec8ca54ed16488775fc7b0921b678a296029dae8d952d1c2e64f8691a27fd06a1555328aa6a3616444149dbecec5d8217e6a3514cd673cbc0ee399cb03451ba941cc78937e468dfa44ef1b32e4b58c277aa029ddea51ea449f5264941d3de244631151aa1e71a6379b682234471320c04cf430be32c68fc7449be462e398b14bf97e895e1f551e4ff2b0449f37cbb4836819c5c855a2ad68295ca63b94683ce33dc50dedb91533891e8489cceddc2946cf48a2cf9f6732cacb47a2cfdb5931d1757f4787449fbbc93c384a7d808f68a2e774cd196a1cd1359c8d145c66f353a6114d6cc9fe58c3c61b328c684f52763ccaa9673c6411edc72c75cd37cb214914d1bc7b8a29e4f2522c49227ad4206a399c0dc7a123a26bd4112b21c30fd1f47e88a4fe5321a96b887e236eaece99c9dd6921da248fcf33ca48521221fac77e9a4134d1aa3153ac25882ea4a4c81854148836cf6554b966cf8aa30708886845aebc610bd1ea6b8e670e3a65c4a5f5000c5c0100312c213a79fc2827c7de17a6c742298bc6e243e0058880031cb0c5be8368e3c6ec1c42b2d3f423887ec6612a0d39849468d406a2cf313f535bde00a28752d19aa9671abeff8776434364c8f80e5abe1ffa6c711e7654c7b143bc0fbd5ec8cd9f71429090e5438fc1c4ce5ae2b181b57b701bcc35cc11a37ae851f030615db37e8a651e7aebd0fdca0ff1d03cfefcb09cae6ee90420000108a00bf301138420157b875a3cb7435156b753747c1dba8c2d1d7443b36c2c1dda933cd2fe32a1913c73e87b5cf4e1c5946275470e4d6e0bb7f889435fb2d7a5b932960287ae4284984b33f386de628a0b3133e386d61a9b05dd1425a6a70d7d1ecb293776776c316ce83724cb1afab4a8f01a33f249a786369c3f96e49d456296865e245387cbdb327a1534349729c3fc41e50ccd49696e104374acc89ba1472a3f9a1ba40ccd86d9a83129379e4b867662335f55b2f5cd3134313148388a1fc1622f863e67f93821668a94611f86ce4d2284d4d1d44e01431352a1249c5fbe10f2855e7c2ccd624b63247aa18be5601cc5f5adf8205d68f42383489ec3fe380817da102de4388de573f65b684d262f6bea60c9f15ae83a83780a9ecd1d8464a16bd01143554a4c51c74227f2f132846ed838bf421353ea4a66ebc870b5420f2bda3fc3c6ab50abd0f43a92ed4b51a1fdc60fd53242d8957c0a5da9a534a90c9742bf193986a69ea37a4e14ba780cb6b2f750e8734ed962fcc725984f682663cc25392d6143764293d52534344c13ba384d1e27ea4c58f2c60cb3b6bb844e7a52caede82aa1af9443c4713cfac8dc24f440b3312ed7c849bf45427ff132b7c884fcc7f6085df60ddd6f7d698e37c229454b51232f426352791a66f554192642a399d124c591572687d06b7c99f0b0bc783121f4d13d69109a0d9728ab9004429b3b6588fd9d25c6983f681ccfc6394ee12fe5d107adac767bce9688e9630ffaa8a739eb45669424e441e720a772bce1b0d5dd4197f242c839cea364e8e9a0c9e2d515ddbc1cf473a171e96c8c59e2e1a0f714d3291a5648f2b9410f62ad572fc46cd049e5835d89eba1afd5a097f814d9b69e089fd120bdd6cc0c33c366d07e48652933b61cd1c8a0cbffd43e2de911bb1874f1f0b14c66771409066d686d8d559197da512f682ec550211f65c2b82ee8adb4a346df8236bff2a2e77459d0860cd22a9a1df90a613aa6078f54d134ea06396652d1744c21bab21ba7c3a0a2c91599749c728a1eec4f50cf19f5cf628a26c476a728393eb1528ae674cc55b5428a36678c58a9ae22b11f45bb219fbb639992e48aa275581921b5d3c3aaa1e8438ef7e44023e5f540d1851cf1ea9361bc0cd3847ea2df141b49a3b821758827da3c295584c610bd93a7135de497e46be6e1449bc24437771f37f9984d349a9377e71c299ae871eaf2cbd2d02ddf67a2e90c7452e898684352ccae14b237f2fc126d46444f39a7c8f91fb6440f2c738c5598781cc34a34579a9ab91a4889be577b2d85a879d9b949f46be69e44bdf2c6d324d124cbd41f5235852857249acfd0632b79e3090a89ce32726bf8483aed3fa2df98b08c2b398ee82c3e3ed8761bd15c6af5c76c4e88b9c38826658d90d8a067b92fa269601663c89e62d9338a683347cb9bdfd42ffb44f4e13d5ea3f382882e669c3a441b52720c642ea7cc540cd1446f0c363d87fa64be105d6a5e4abd97bc632284e83524ea87cc90924507d163982de6f4cd071741f4ef289be48e8b0aa107a2fdf8fe6fd1980c6f296feecbf80f4dd489b13bf979f67cfdd04e83cd1959a27de8bcad3c344e99d562ca87267f9cc8a830f7d0c5c827f2399c4fee510f4dc830a58fc779e8233cc5fcf0bea82d1eda9910711eddb773eed0679fe7b18cb79165a01d3a494fc1f2b754af6b7568cc24e77f90b742fa45872e25ed78d9bc41ca399a43f30e5b324e3a9e140e95439f35070b3baf39a2e3716845e5724e9a2c387421ceaeb6a9e5a8ced037749a1b7483ae340f0fea863337254ed6909611822d2850027740000cb0012d3810822d2880086d439bf72fc75e790bca8646dfc4bcb3816b681cc6a808bae629734a0dbdc791eac78fc382a6a10d1aef2fd1bbf3fba1054543bb122bc27de26594e780073890051141175a182a1ee8195aa9f83a295958a43063a1c4853fe032cdd0662599f0e4f1106cb145e509b40cea396c94246c8e8512d2391c38c0a503940c45fc96ca1be7628b2e88671b0790c023808517d031f4c0552aa25cc6699112439f92a5c7e70c2965c5236818da509e356afe38a69a342328181af34eff8c43ca345783a05fe8637cd7608e4d20a8175af9d4292ba7b8f475bbd038b688d81d16e5429f92446fa5fcf1f398ba854ee3eb86884f6aa1d3ded89f7128c973250bbd86a9b06fc12486075241b1d0480899517abf47b77c852663240eb2486e6e67b5c61b4306321db956612429fea9546835497c5b74e5cbb08c023081049040a7d07f5a7c4e51baa1396a0095c2b03bb7a58abde98087a06859011a855e4230738d9f1d140a4d0c973fe4b49c537bff84be91e48c330a8f92a939077542d716a3351489696fdc16470b0e145d1ab409ed5b4fa75884abc699093d8e793e2417cb129ab308e141e795d0871c914f5dad2434f1730e991dae4868639c3dbdc87b8e49abd7423b6a51e996ada2e193853e64e8bd98aff7644b2c3473d9a93fbe41c86657e8aa7b2de9b6398897add0470fa249a2a5aad09f4903c7bf59536e4f855e9256454e9e53a5e353e81a464df3888751f99242e793e32c74c2e3a378147a14216b64ac17cd370785664a2364d43182a9a53ca14b07f91519a38e1db913da8d5149cf523927cf4de87d2a2a658609cf39cb841ea6e5f595f89699e34b687ad242af645f68cf28a18de7e31b9264d1d05512bab0c161ea939842702412bad8d9f03115e6651a4730f535f75e088f119a78ed1b1a631c0d5614a1c97231a67db6835b6e05117e18229464983a8426b8a53b9e103c523f426866572e56b40e6dd1c2042b82d0588621493f5254510d089d58bec821a4c6592afb83a633af44947c6ee4283e683a69b8f5ac6783e97bd04c237714db330899731e349259e2216b6307ed6f6a27cdde29b7bc3a68a7a593bf7496837627f2c741d795c2e50cd28357e437e891698810515382796b83be32ecb890315207e7d6a02bcf3c113ee5a0b143837ed6b278debcfe56cb0cc699b14c88138f0c7a6b9c9d338a3f593d128346e3ef76ecc0a09393deb08e626458cf0bda963c397a667ea59a2ee8e4cd73722349cd496b41971975074fba5ac1824ed45cba777b4aa366155d54704d0d5215c93d55b4991a544b7fc5fc1a4e459bcf81866688414527c9336c46469da24dd1d0a7296c9ca8de149d7e690e3b9f97a271d354d7d5b7d80693a2cb41f6245c068da2cd1d3a8986d645d1ca657a860b5f28dad91eb1681986395741d185145f590dff446b12474332d23dd16588f110b24b48cdf94e748ec27cd2c69ee31ac389c622fdb389dee1c7b5a0f9635a8a9a68a36bd6d8df21aaa77026da5cbdd9eb184e8695c74457f192ba8777556cf0126d65d093ac33e73cd259a2ad301273a3101353e354a2f309f91673c70e5298127dced5172e7c9d0419752811e97948a2cf08f958125112521489b62a870f3bae797a1990e8e34ab4f4cafc887e73f484508d3c23d138a2d78e949833921f89e14674115ad167ba43c6d818d1764c21787556cd1a6216d17f06da25119672e328a2c9da5e9a42ba1cc42d116dc630e60e175ffad747442bc1e31f446d18ff720ed1ef3e8ad2fc98e79a32441b3298fc62d992e5140bd1e6f1a029bca5235f94106db258b13b5cd296141f44134cf3e6ec76d790344134711be7b9aecacaee02d1477f0c4d7cac634b05883e855884d849b20dd63f742297b1e7dd14f5a3f243d39bffe181c6ca3166fbd0c78c3c94794a54ba7ce8da61ae2c51c2e449630f5dae60c932de49aae6eaa1df3c195e56e8c53c9f3cb415dbbcb23a428639830733f44b21760cfb1ddadc0f9264e7c6153e3e03dba107d12a6bd278cb93b23a74164cd4652fc57c9860a14487a6917ccc19eb5bce5c4370b4e039f46072a8a8e13fe5eb170196c3302bbc7806218c85920c380e7dfe5e44e89421f2c658285db145a96238b49e2b3497fa37a8aa7207fc862e96c6cc30ce7ea89063a1c4859b41db45088e1654037643175af625c7a60821f65a189c40175a6ca1dc0672faab6272885d54d980d9d0e5f41ec9c9185768b185073cb0c527751182a3c51a7a2f4996653d54e4cfe98016ce8546a008ac8636fe573ead0cdc820b0d701a5a6df76baf52cf700ecb00a3a1c7b9de21fc5cc73e0c164a21d8a25cc16768ba3c78a49c99a149f165523cc728cafc6568f263ce304b0c5177dbdd0293a1698cdb93583a6a89ce185a4719597a8789c5d0a70cb6322b7018baf00fde4d53e3c8040ced75a33cdf38525075f017ba101db5c38e29724a8f17ec6e24e340017860045964d1852e825845ea4971a151d7c89134e7d492744c048c08b2700a6c03780bede7fce09aab167a20f32023ef4a98f4b7700067a1dfb83c625a39c6425329e3b3eaf8a4f9295fa1179f7c106d22f99e652b349525e6f087ade6c9147015ba103d95732c1553ea71d3802cb2100102f81e80812b2ec0546853081227e20745c0536836de1fffb86809029642bff157d59671a4d4ae071c70c6516867934954cc48681c6528d821844a278712262e3c404f200138a18b169d0cbb32a3a7b609ad56b45cbd9e1dbe419409fd37aa38ef07f1123aff907365ccbd127a181d34e3cbc9a1cb93844e563af33be325c46524f46fb2418345ee088d24cf17536c673c602334667db21f3bcaa43a06042e421b1ee3d69c5346f9fb418426263f98945b31aec50ca16dd8f959c6fb1eb0105a9590f366c722e3afed8083d083ac6f29721aee6f06e78081d044c3f78c9d9072c607014cc0c5047ed08f47b1ca1462100f215a5cb14508cc0ac03e68629286bb52f91e74d15622e13c6e9610a9ec22045c6cf1811218dd651eb41f0d92bb4ece5758b150eac2036ef45a880001835801bc833e9eb4a5e48a6e197944c0012d5407c83940c601f20d906d805c03641a20cf005906c831408601f20b905d80dc026416e0ae025715b8a9c04505ee29704d815b0a5c52e08e025714b8a1c00505ee27703d81db095c4ee06e025713b899c0c504ee25702d814b82ad44d7b8c167af18165a82a200630e584ae04e025712b891c08504ee23701dd1c48896fbc5a1a7e7cb36a2b90ecd979edf33f0ea0ecb081defe6ace8b08b68665cbe3b38b24e899f1a56116d9658191b36116d903c12dfa5afdd9503c322a2f7aa48cd19349e96710fd187206e39a599bd9269600dd1b503f15c210e5b704001f96211adc7e538c9a02ba21119f7a89beb5de948441f979a42ffeca587f205221ad9528d97518e082f0ed148ee0ba65ebdefe1e70f5e18a2711d2b8ded55d2a1f4c18b423421bc6545f587869513a217cf943f266f8a1acd178368561d9f578c9a49a2e485201ad916898fc920a2795e04a20fc162fecb92636a905f00a28fc1323b7bceb061eec51f1af354eb3cdf50fe653f74396591148ef184177de882c7dc30135ef0a1d99018f443671c25272ff6d007cfed0ca7177ae8bab33f735b8c3fe7a1cb913bf94744dd08150fed7c481e17f244b7d0b9709279875e63638d1ffac7b44397b16b889032ca088c651d1a1f178b8f963c89ba7841872e380ed96196c91cfad98d166f8fb229ae21bc904399c462b0169785f0220e7dbe0ac93a744ae1e51770682a2da39347f686a623a5d25307130b921bdae91472b9686ef3cbb5a14d3d311fecbbc63d0d1bfaeae83e3de717d23f145eaca1699425be2963ac2e991adac8fc33fdceb8029bf0220ded6445fe0ca572c9e744e0051a5e9ca1897c4fed31d30db816ee0115bc30439b428750d70d3bd296a193c6678e3f27c72064e8e16e980c25a76e772c164a6368277f77f4bf440cfdf8ba5978702d2107c3f0220cad47c716df9b8fcb75f4c20b30b49f2957d9b28f4ad2fc42d78d2ba5529e249d42e984175ee87276658c61d9852e788b05d9506d71a1d1c8b3f929e545cd21442bbcd8425f9addbcaa73aa96b4d0e51073bce80d7734bb2ce0bfd12f2ca4f2020b6d89e4f7a9142972dd8b2b342731690c7f214ab9f7c20a3df090961f7ff04515ba3ced6495e1e705159accd91647d11edbcb1753e81ca71c2cc5b8d497ea0b29a057e6d8db27b77258f7b1cc7828342e532905cde48b27f4295bd0974e8f13daa83ba5e2f0a1879db3095d0abd3efb196cdeacbe604297e23846c6d12a1b525e2ca1b9a0b329a6725e28a1871f219fc5ddb610c18b243471e3c7678a21468a267881842633789815938fd09f5f8e13618d827a8b8552b912bc304213d5de71627b5184b662c6134dfbc242a90bc7a25e10a191d20aed88f9118217436835c39883f8e96a0ebe09c80b21f48f3be98f861d89218685121a75c10d7811847e3a2654ca51669613bc00421b2fe6d4f9602db6e040175c98a305bcf8419bc1c6601a2d3784b9f8a0d15cd1111b553d68f29f452f78d05839d2cb783af56a1278b1835edf2f4c574236c7b00e9a1c2d34f0cf991c3429bb4e8e2a91da41060e3a8f4dbee6d538870345cb5fdca0c9d4626ad52a2d13b3012d1c8ba70ac0041230015200b8e0850d0a998adb9b15828552084c174ba6167851832ebfaf59643b481edf185ed0a0ebb3289d537f8ac7194afb000c5c31801733681a997be3ec34d3a4074c08146002e7820b0210a068614250827e43812cb2700f48208b2cdc035d98145ec8a06dcbe21953e4472539066d8a6ea96223b333bc80410fc232cc7052d8afd4d90c2f5ed05c54cf78982c2e687af3ee664f9a2192dc82f6e18f85056bfdc84930bc60418f67c39865b0aca28b89f942de0c6721e52f58a18a7e43a7fcbcda21ec7752d106b330493de5711013158db8c5a82d9de3717e9ca2b58cea2035acfc9e95291a537f29714d6b608db2a2144d86911c68de9415a4e84379be07ff09991128005e60c528fab01b728aea5839fc58218adef7fd42f6f0fb578d5034515234c568884c6a48b002145df52691871af327fa682fad0c4721969927da994671e3ff9de83483e4eb6152526b86159ce8f392680e3ddb17f5b209ab80159ae81cc967d58ce304fd7733d16c9e2499325c44b00213cd8bc766bcd166eee7257ae08ef4620cefbe214bda8115966892b59a876b3f4af18295e852d6141a2d2aba25394a1c2b26d1f7c430d92b24d15b87cc25eac05a3c6b45249a89915dd12cd515a358286d5144a0002b20d1e6ba63c7e07d260b042b1ed14a688897715bf2383ba2cf1796395ecec042891bd1b77a5891486d871fc142c96e600523ba902f326ba59ca88b682b3e8a1247178ae83f2e6f2a0fa9b3859f884e52069de1a59c320af922a289a417f2b487e85752d228cb65d9c08abf62811585e8743ecb356b02ff0021fad2a4317688c1a252258b2c4c175798400464106dacb09bb28f859209c8151f10c1165c6ca04a106d96c5c50a1e2c9488506045207acd323b71e24bcce15a88e08a2d8a01a2ef4bd267b239446349f5872be46148a9edc06f91c559e1871ea8c4a8f3f8c17ed587ceb254360bb3f8d087ea0ebd1bad6106b5e08007f6d0fecba306973a7ae8e1eae65cb9e1e398a5811579e83fe434654ad92db8b8c20495c5165c201eda8d1911737f3fff576c513604268bbd431b36fc638c3fe9bc1dae8e950d164a4732b0a20eed5f849a3ec89291a9155841872ebc854c27f17f3c592c943cc001b70f3809bab8e239e0812d42e04431b0620e5d48922286d119d788b230af855b11ac9043ab95dd23e6e72167e3d04a047f73af2831f55798116cc1450fac8043937b1a26cd78b2b954c8032bded09a658e1eaee9c015563ab0c20d3d968b611fa5ca14dbc442498b2bbae080156de8bfd563634b99728a4ecec00a36b46b91a939639c657f62c51afa2a87922d4d25aa3a56a8a18d8c2221c88bc76f981569e8a5f39264f8c40a34f42df30d45d2ad627c7060c519fa8f965e95dd71f0fc304333c95546b2d1042bcad0b403118f8ccea0274786d67b52d6892a213ac61943931a78a85bcc9ab44f31301fab7218da904a4dc3e56332a360e8bc3ae6d4255ddaf72fb46e3197acfd9386102ff46a31d7bddc524c96bad04494f43f497983cc850bfd56b6368bd8a94367b61088faa8a48e8522c37024188cc30171308a615aef01a3140010002068681c8a44921846334dd81b1480024f2a1c463024161c202810160e0e85036140180c0e0383c140100c0603028170182c160f44e40f32343bb919004fb7340d7ec15f88ede742830afa986e3d94d0af7a8c0ba825a42db4210eb9871ed9f85cc3f27acc7e0a245fa2113bca081a8446a7f2a42de98b0fd8250da9c5ef5f669e9cf7ebf6ee06043556f3edcce2173e3ae7f75e1bef50a25200c128a1463b3d894752fb9bd3669799ceab14640a976973de3ab8bdc9f07cfe7ea3735b2bfb92fdfb0d825bacdc08f757373e375bf9813d34dd9cb8444731ac72894ade758d8e5424539c19e16f47a3f0697521baa55f58ce087aad96a942706939d62e71518d74d3d7ef0295243d64077ec09aa22b491a6552a6462bd3e7c2da256a4383541393802d8ba12f183e40ed1d1244c69ae0bb17f1c37f6679a61cfabe97739a66a9170651688dfa3a4ae8ee60d80be8c82328d926a508edd1c89ac52a7bad3cc6f69ca4ca04cf35199287021a0a5614ad8cfad1ec3020431bebbc95302529b176df0db7e01bbea43d620017419ee76cfa16f80ec56a15a32b6dfe5eea8eb6aa557165be31aab4b168b56208d2701a8c50e4af609686040bf4b39369b1a22836a49e4aa10adef69192c7402eb9350a1a24f101b8a821dadf0a07ed52567e36778d54cc530c77358ba203b4c9ca7d796912c7568c7d1ce220282fddf06be03b8fb7d60baa7c69265ad0f3d7a2b3a270fd2c6b80ca3c2408ed916cf492fd589bc93728e7ad8626b68c85aa5fca2605b45a9b94065c6c3ee9feb119ea9240a67fedd399798298acaba9743bab1ef979c3f064e123675fecb982b291750f2afda16b60389eef56688fe13040a53d347687def84ee81e685726249efe896dca3735db51b96362f393a6b1108c4750fba79e116b2daae92fbd65454a5ae78ca6d156c89a6628414b8ddf2907a12a272620ddbdb81c4541a4821194a08694a18bca1dbc0d99475815ca3e4a6eb15b29d627c1030a421467950419629e02c4ed6e20fdade6a6b9e31a9dc6e9fb8f6616305dda8d0c8653057ceb0ec548a603ec792d123b36a599e4ade19535e201516bcc5328b59d1efd3f81d0fb02a87db13126823ee26a4bad180245d007aff4819548745ddf4b805348cc79fb8dc5c87efc183d17a9904da6820a702297324343b354863da2caeb289b742a0b3942b33a8db0c64552d526b0f7acada464a63972558b99042ca001c32861e736346b5827bc346fd6cdbaa8ff2a4b88f9e525151cc90ebb226dd6266dca6dcd263a92b0f00fc36e61145691eba83cced5ceed73c511f750f4e1f71194eb8865a946289f646443ed0f1e3bdff0b27b0b0bd204669370b1ce39c55e7c2cf3b48ed94878397386c5c72a64136e3644de9a2cdc65a4bb22e9d4e3e971ca283bc2729bfe1784a62f13c592d9c364e26b07542110484a70c8445aa21da758ca7f0fa0ade93002b8e143da32a97957e5f7ce72c127e781068d8f4676b8ea0612c20092c79428d27aa8db074ec6b01a6b59298ca99140d114b16d1e5637970ccd60a8dd30f14dbe2e0fec65106f9f25f417926153acb1b77dcca9046881adee2485afcd9054af2e22e2eebefe94411783a67be8597c4f080f105b65df2fbb9b4477ff98f60cab971063b6a6533ace85607ae1d427718b4cc5f706cf2747c6b32ba99056161900a0ac5c60e39436d408bf2b494e1f8d93c516e310741473a67df1b6e74e51384dcf90c4e387f947c38ac8f832415eca5e10ee1c72042d26cc06e8854d42c90072220347b92ba69df8aa02fa0774ed6bd6689149d20c006456301fab337035dd42221899f8c68ccd671227375ab3c5a7a065bd82fb5b690269789934cddcd525703268f6122ca2f8f531a36128547d69a6888f8d3fc59e92e9d7447825eda9f1215ba193817c8dbd87eab9d53b9698165046c9e0df9e9c9582f2241954e238a794a92c4f0610809aab6c4a2475fcea805c2cc4e2bd0d672278547c4c43edf8d8c0eb3b357a1b1ce9af4412f31969c0e8ee10443a4332574641b16946d9463beb13bd21c4d541999646b90507bc4a3c57bd8bd23df9368b5812e93aa745094f7d923716251220f9240954c7c8f9819108c50b7831aa88408d51b4f29174b2be930e5dbfccd479368d76146426e024553ed9199a8ed1775d7fbc41b6e9f33e4194d68c02b31f6f057f3309f578593800e61855cc71dd7915cd5ea4d70c084662f208181b63b7257843f8a3ccfc041ab6f7c1d9041431ce833be95c2a2a666a52c6c80e726083c3e990840a984e7b7b113bd759e1538894f4df1c540381a3202a057295b50761d3c221df1c69c36763629e4bf5197537852f7a0393e23923835350c4129fdc5423800677750904376e1fe7cd8e94ba56654a39b3ac906bd65b0e6021b6e97b46c3de3a6259c5060088368fd1e31ea6d7aca7dfa820e32504dd950f12dc2bed41e01d14d84427060d68d559e5fa4cf503430e86960163c8bc0d6716094ea2755daade07207eea1307ad3aec888933d243a5606a8f5af8f22c1929bef4bd5d67f0a149a66346ebb8172bf5f173c136c428897ee8c6c08eedb798a30df89083b9d5b4811a39c1a14a59a5a1bc3fc0eb5a1b7faf32efd1007799d7564a3e380dbcbe3d9751516a8d2423d0d5452d30d4f8680730d5bdcdc53c860f449da8072d77064a25a14901521972752e97a150b83aaeabc637b714a07a218023f2a772ac87d6aa55e50bcc73e7ab312345d8e427421b4c6b936800a688f5624fc15363ccbcdb908d7f37dbc664a1991eea25a99018f4263b081cca242517f7be5005d6e6ba055a49149831412f46b6c0c5073aa3691cd53e7e2a3d40a00fc64b34c8673aa95c502609d6a3f3514f87881e4ee01dc4d7f8d481fe67281969ac4d102450aa3da19d8843bfa23ad209e91cd6aa832f1d746f7d8ec8e2e0f9443c2489ca7d5fe2f1339b76e5aa82c23b600b7027a97a361c48e0fbd2e02fca4d1951e20589db1ba3dec5105e14a7ddd2776b640446e74bb222a89eafd3248e92db03c77677de3e060cc224b01ce9ba322092125d719631ca8d4c4c44e6d6513dd0b7f83adea0052a6d6a4d0318208bcb21eb2978c7c9c5637583b6a386f013e72b2fbff5bd5fb8416b810139ac375ba48cbd525107acf47059cb7e01b503118163dd7e0f5b7812f220139b54528cb0cd2e7e600339bc7b4d38942f8af1ec1a74bbaccdf0bee8d3b695726d86a312902d027ca2be351b54c0a5aa37b719a1b841c5116af47f46fed5dcc85c728e61b1217d23e2f8b21d5a9d33c135d8cb8fb1d0e18c92a0e5b152a304ec5fb7eb021a654968d48955e0fd5d53e67b697e652173344a9c2f1e89b2fa1b5e748789ec26d89d44bbc7f4ef249cc5230934b0fa9e9e44401db81a3e4e5239d08119a91e62c256a0d572574315b6e9cbaa3b7ff8b732ad64b972b0b65679abb17735bc43ec56a9587dac7c2b8995eeb71a9a86da07766b35b2c2ac2e564a5633ab88d564a56625b41a596d568a5622abb1d57084eba41bae86211d3b4882a4697d76890cd490c42320dd381f9d4c30cc29760bc72a032818e4f5383977ca3b8a6ab3e7854883a3a250ada8745447ac0ab4546d1fa2a820ad1282d85e2044a4eaa34eea350df2f5c2622a3b550e556f95c24a095560854745a2a70a65aa7f62cfa078ae5514d58e2a642aa1a705ee7b4e05a986a8e24625f43e8b62ac2a30594f8761a8e2a20a041654c51b2a575542bf267ff6e9aa8480b252b1ad0a0cbc9fa993ca302aa184425547cc5540f4eb093989eaa7eaf5aaeedeb417681a19ad5780f1c350aa3e559a4a41854d3550394125147af022d0ad02128afcf9b4a908545a896a3d1663a38d4a05a2725059a85e54e5584d543e2a27d517d547a5a4d252ed5115a9522a199520d596aa61a5a5f2a71a53e556091d50b60744520993db181e2531934d5bca5ad16c3c4932b2c8bf5b537ec670cc98663e87d5d96f633290e08b275eb1b0118d30e9467ce18776590af9fc3b38def79eb08c684208ff66dfa56bcff329667cff410ff651948c4aaa4e7cb875ac1687e6ccf0295ab49c96fd8158573e13840121847e28665ede97132cde3e6fbf1a084f549bb297c034b46c4e24ea5c256ccaec239595419ffc3dcd500ba9757219a6636924a6a2da3a0e1b3aa7cd069b29e90cece2b39be3d5163edaac9b476ed4a53e89762e2da5b732e662815bd122b4422aefbcd9543cb4e547efcc0398919b5c6cfe9fb01eae88d2c126abd4ce9d2b4c29d798f995f6dfd8653c4b7865e3f6d001e251ac46b993951346b41b9334aed07f69a7d7c4adb4a581335d7c0efb9f56450623477e3b278d6863daa7268f6004607b5b6a217f365d291e7e64cbacbb6a7c8d4da8eb353f05061c70a6516c079e67b50cd6e49ab568b4b76f607c1fb7c96ee73205d9fee5815f949687ca3ef135cee6694b0d864f55c11652ea88279b8c89e0ea11b5fc6268e76821bb733d42dc10159035ef1fe8e123a32f7299a90df55949247d6bd736a1aaa5ba5e53a655c71cc81085aa53bce0a936e96ab3cb50e1b60993722740fecccd0a7e7df3af77ca406cac51ff7389cc244b1101fed0d3655cdbc26c5b1174415802f2b10d466e9c76294abcdcb0447ca4ec17ff215029e0e02b5a641f99657805f2d005a0107216d93de996529553f7f729517fb99769ab965063c20b809b36a1d8155ca96c48ea53f0fcdd7ad78ca1d1a55bf674aade6515fbd710bc58a3790184648617a3a97149989ef1238100aa0211c99105bc709b8800694f17614798fc02c49c738fc194d42eead80d072b9433632e849afb0f5559c2ef8cc8cc01a5b90595d45d9570f91f45e82dec0b203c59515e41e03cc400b4874af757c461edcae2b3390c8626f2f3d3b289da18d8ced257e41fc74176f293f7bbb1c2e810c4225a3a205810b20c09270101772806c955ed3104e0a12bed718c568b33fd3956a6eb5e9a3b0eb8e15b0584a4b44503121ffb3190936a91c8869350745f5d364f80a0c41bf1861f504d51ed79b310e2401aae3fc0b97118e209801c20aea529307ef38fb19002cbe65bb8f9879c95e5ac08a655c4f2a8f271904bb8a988343d7caabfad0da5f8cf65838001b44aebf16b56b770e82cdeec8019de64cf3efabe4b800c08003379bb887ff7d35507d9d31613752f43d48024b7c73db63810a5e6ae4f06abe205700c4401e6707dfd5c048eeeb704ff074efe870bc99a5fb0beb63e317f7ebfbdbe4f7d7c7f18f7ca7ee1fadafac4fdf9fc16fbfef5b17d2c28165e03b5f6b78a7b75bbeeb47e6b951230c7075129c46c1351db08d14a567c17ba3e42a88a492bd340941e0b94609bc508dd4262407240cf9d800efcac5c20a341d874ec6be1c0e1e22b029e9a8b47c27a478fb3550b143a2510a6348ef54ba80eb01bea7e11027300891988b43cf8d6a76991e19362f26b617030b001d244b5dd21a2402d23e68349d5dacc1f4e81b83bb457ec098bdcf9a27441e2b38075e0d64cd6d9383da5d8486d02201b89ac610886afee6aeffc58c08713f68b2b2f9450bb086d2b62b2fa8cba86304dd023c2f15f3d61d13c0714a5d7fc7a5a0becc66508911b2cf5977eb303cd29dcfd290dc5cb22d1816d1251216024c52a7bf81238321430b484c2113df3024849afabf848300eca0c1950788a2d3a8a4179d2753ef3df31146c32b6179b8ffdc6f603bb00288e1f62c5c67d6c0209224b2f149b208aa9d0b46f5583d0e649f7b2b85d08bca154e608889d0d262dbaf22eb73e3055d0ee9d790dba26d1eef926d095c48f77bf6f7d8765181165bbd94ed5a8be7776bbbd1dd6bb1cc67055e95963dbae77706f84f7a2bae756684bf7852e85ec5640518cee99f73eed2df33a7471dc1de8f5d8ebe3fdd47def2aed55d3bb716fc5de6cafb05e85f79e97a5ec712c6fa4bbe7de9c7e72febbd2f666ebb5b97548bd68de07efd62bc04f18756fbd699c67bdecad9fb57a47c7dbbabde88c15db35dd86eeb56ea2dde1bccbdb292412aef756e80db2778edeba4375c75351175b73375459466fb7eb1aba1e5db9ee8ebb01de21bbd97a8ec68ed735b6cbd6de6cf3e8b71f4c5740379eddd726d1d156f2bb957a4ff70ebcde774ddf5bcffdbbc3387eeb47ff3803ca75eb12a65b40f3d5e226dd58ed9e436421ad317b0bd29b0db0379f71ec85de2b73bdbd6056d96f75bd127bb1bdc77a4dbeb71e02e6f1622cc117fcaacb920986bb943a2e622945bf2e7b3211174914d669305991146c49d4fccbca9f24e42cf9043c9ca76142c2267190f8bb249f66316a573cc941a221b13f892a816a77d6c43b4cf45796e73f966cc82964721f53b47adc9cb0d12f0664f2470644f507ac414e5e1f0860f9e38f7a175fd85eb98c0b88e361e5a1eb6324484e64e0c7c9ffa6c8cf1fef8673ade841b98fa567650788e981491f4be2765793e3210a3dfe0881ff26dd215b41f422120f93c7c0238fc7c95487da34d88d524df842675fa3d4501826d2070a30c3657ccdc10f6e4c8ba613187bbc4cc29fb260ff71128a118534a8b48cb6a88752146e9779af872dae76c3e20743bb3297a190c96063efc4630b64831e9b59c0be8a9dc98d2de475c2600175a53601632d6a6e34220b14ee6f50ba0da3295214fd4d69b44d29f702caf176602d74f081884722dde8a0c89e4ad81bea5f6b9acb52f5c03de799005d29b92d4ab2fe280a8d41ecc34abab949be8bc725213bb80fd5f32fa49e1ac4a693fa901101a928da7d828f72d23e0245122c2e4ec131a70d205451829900758d40dea7e57b3bb9c9334be8dbf98bb52e0127c8526d6b91e8bd8d81dbe94354af3c9a973957c4521db33405cb243027342abc02f45d0002d5b72e2ae1ad10e0b89a793285f318dd7067093c543df3cd2a98893725d6230777715384cc5b946ab73f4972bb03e7326008042627be6ed2ccb9a4c5770e5c46a362f460d71ac206d0a1198437ed750b2897d7f8906fc23f215f5df73c0aeb6e0636037182baabb711f75737759ac5c0fbcc2675e69286e7c3097362f5c9cdd6840d6cf97d812090e9042372fda4256c60a3c9be6273d16f88ccd9c8e5ca4bdb15a9f64c92b2d4c4cef9bbe54513ac67d4fa1ece46d5b875813dbfbad74c2654d3e5754e00309c5db3319f52be30004c6ed5263a95cd79dff9a2ba1e4fa0f785288998e3f094129a1b9d321577c494388a38194c2a1f1dd96db80b67aff10f4cd10a51da130db680d5274f21041a4099338349abaf908c2d5d1350f9d247932b192116422532002388513280514b5c4ef3395628d904afa3acfe112555d334b8e37626e7a6206e3b29a65aa4f8a478db0b899f39c3767e624a5b107a3730e45ccaea97db56c686b705a2f92ce7d886e40c7e9800c75b3d1d18643ae192e97baa9ab2c371ea5b4407d6b116251c40b1e7af48b2d88743e4cfe978e1e6cf93ed0f529a52d6b3b2278d769cbd6e1a1c111d403f759563bcc86f1ec39c3d81c208a838dae2a663ce5a6c42dd44719bb00a9a11bdeaae4f3516bcb8ea5e6da2d41b6fd53decd171ddb09f4f70bfba9529f60e05b8b29dd0b65a4bedb71e2e8d8db6352b68765d5fceeae30cdcf678b544ad2a1473b15508b69eaa2e15aeba1a3147a3be0e83366c751b527b352554f37dda7a232bbada9b6bc14e6606a441151aa1beba4d96f7595f35f854ea4a9fdddd7cb466385edd622efcf4155b71b939f586fdf4abee09bc37b9df7a910baabae5b8c5aed58fabb57c9f94744dabd916c1eafe6cb00ae3ab554a33556136986ad59542ce2c16d9455cc155f732980eefaeff19ef494429842c3c6dbe4cd85a09d45352ce00ffd04ee5ea8033b81ab48093e1c55ef7a94a282aef955888a7f19bd8344852423318efbef423b103b82592fa5b061f026374abd2a852e92de00cecbe25af66a82d021a3f678db71897b3cd3900273bf32544c8c32003201d3e59e557f0c6111688fcbb418858da3c2d41021b4c090434ce22ad6b7b50c571e36de8984a79095fdabf05a8492f1cf18386fbc3a62164f35ea65d158410f5199bf206c3cf5e41fadccf1720e6941d6d19e0e46788c6e47c3d9dff58ab18f5f4e07d27aa37a9dcc4cef45f7c17a0ab0e438287d165b2d62b0b2c734a8064e35674bced13bf88a4cb4d31067299b3d210ec92886698e8f5541295c7db56964ca951964485c2ea86fcb69e53c02340a77c361d0aa2a70ebb74bee60f17cef07d7618fde9d65dc42f403e4214bc2eba4153d93dd2eac6eb211f261c402f65dc5f7fc0a6a5f66b71d209bd630570a2fee27f7dd0281a7384d0d84b7d0b37005bbf42790a2cc00b9820ea3946e151fc8429797d3214e1b04dcda4e217549f52faed6b9ae5d9bc785690b37a72e62af53a3bc05608c1b279e6a7b5b8fa7d8f909bdc2a3495b3da724e07683c2257f7027d7ac8294bdd24fa6cea72ccb0f445e050fa08316dffa537de61dc58016ba3c1c700642030f0188c0c1606aa64b0422df36dd2655032f0196c3e0842f83af070a30ef4980e359202d23603a4015307cb5c24f7cd23c145003e061b585ce60affc118fa2d61a9de2069c01a7cfcc1184879a657222186b06910dbc1c688a265511b4c1e0eb4721031780ddc0682065b83329882aa4f2d27ccc894d39301c1a0c12638b6661aa537206a899f3c06636e375df292077d091110a45cd8ec220a7a96b0219cc5c4c2834decfdab2807083361cf86894012ac1a6153118dc8d406630839e4160aa1bf83374284838dabe47297541236398e60b12800160cf32e2b123a8189cdca371fda033621cc642d9d37cf208c18cc00c739ae08063a9881034c5f3196bf751dd89730032a4054096160e28315543b98c6110fb208f30ef22644105c18284dd8eca574882608d10791266c43d858e5f60b5f1136900e8cd00444ed6467a446b892acbe0898069b1dd6e489a511c61013fd0a8812162480206c35d898e9aac367206c4e18cdf0110f66b4173807bc07921036e3035749d6c389ad114eb37586ca68411e8246099d481ce214b3047910360ba1902937d5271ad19b989cb072a3d2c91d489e1ecf08800adc2ef0625b51b734018904324bad981b3164932c27550cd0958f1c401e4005e002f00178029c75c095d1a8285b116004301560d9014c361d337dc0b3b8000c648dea82550026f25c4cc305c0c88b734045773e4d998c6302fada8b9f3760b26639ff000000000000000000d06c9488b545d2ac4c524a7a00d4ffb5b7847199524a29a5086f67e6f845daf01769c35fa40daf0017f209df09db095fe89ecb3a866653f68ea57fa2c48b8de81043df5a9e5754d27d420551111d61e84b6fd45cf259595445447480a16dd1d910e2bfe7ef05d5d8c206203abed0040d9ea3670da1e9fbf9a1c30bede41c72d2d4911d3944878e2e74252b4374cd5dbda1830b7dd4f86432c66c72962d5be8e3a9088daf17ad4765bfd0a185d64709956d2926647c6a7ce070191170e1e2f5c4d09185929f590a2ab6040b9d9ce68fd316ad6a3a11a4dd076c2006083a503eb2fd3b53c7a4438715fa4f596df2e4b4868e2aa466f1a9a54217ce9308ca849079a1630a5b4593215fbe5439438714fa597113312c7f98ff3ba2d04bfc0e666262082977a0d08e54dd94e13bfc86d4137abddc9758aae767322774328b6ffc88294de842bc7516f1c9740a29139af8221b29bf7ffe4a5a4217a2c7102a5376a64a5142b3e23932e8670c66f924b4917d2f574e4c27ab48e82b7c663921938ed0f94c1c8f9b9465850e23349aff12d32d450dfd8bd0264d1d7cf3a825157922f46649e3e9a09a344b3ec18d1c1c838e21345af6e3279e39e81042d79a23040f31c7b3781a8fcc061d4168c29e070b1bef22e4a269e800421f4544ac0e4256124149cdd0f1837ef285fa79eaf8a0c9a23b9e7278040da51eb417533c79b93cc7083268e8e041a3fbeea14573954a7607bd99969339a42725552d43870e9a98b1c594cc6e6eaacb41a79d37929e2ff9bab1e342070e1a95de718257899c74665be8b841a3a2645b2496aad061834e0521d7b2a4f835c9e8a841731d52f613334288cf1d34e864765121860ed67f31399e0227b8210211dc193a66d0e90d17492fcf85b28e0cba9e68a69392e25d9977c4a0cfd9989208fba993671e1d30e87592124929378dd8a617b41ba2ac93c8e147fd0e17f4d766593b45eef25bd1ee4ac89d8487e7d141ace873ca3a2a44cd2aba0ca122c908aba27d2def3c69562ada705d3a6ed8d4264cfb0215bdc7e61817b77a718ae694ea051153d222b3f8c2148df897dfbeb2e8192d04bc284597545f89182584b79948d15fb41ce67aba43c4e028faf8cce14936ce688889a28be1e5a49c27a52fa75e84a20bab31582e9d63ccf881e2f82107a5338c6c0d2f3ed155c6342536b525dfdf138d85bf944ef4a63e6a218893137d509a7f7664c6579368135e6ca2f9b3b0d010665fb2af89768466f278b135fdc299e872b27c8b17bc83086962a231313ad6d9f4a8d86f2fd195b9b9852c1327e5b2441b7fa3c8d85163cc49a8129dc5d0413788e4f3174389fea299a775f6e75e3589d6ac941e65f152b6f042126da824a2c731952776b79168dc4aeb98a750dd2f42a2ab48497e441363ce75119d5468695a78e18846581895542e2eae5923fad6f3897df2948b9030231a9dbd7b62deeadebf72aff062119d0c394fe6e63d113be82f14d1566586cb25fc64634c22dae45adad73b49ab5344344ae4d7e829bd3d7a24032f0ed18ceeece6c8f92b82ce105d55852449edbe28441f271e9f520e11a275d19493397b83e8228e76fc98351b395e08a217f1e241639893264181e83735dc649809f9df054417640a952a8c56c6568ecf2206aae1693578f1874e3bf6235fe5fdd056860bf24c57e9f8f4a10da2e389c81a26b4797c68db4dc614e25228e1eb1edad29e2d25c7fca99cd443232fec66718bbde0451e9a247c26575b8f87366a1ecf417347f014748746a950e9b94526b3ec5ed8a1931954a37acc9663aa179081c313c0a6858be06a94c0c60d230387cb280fd8400c05bca8432752c6d4a02f49c696d2e10da6beabebef1783458c101c3734687872e142060e97e10fd8400c15bc98432742580ba3279a63951b36520c1403c7231b356c0b08b87021038727c0858b2d6c9cc01bf0336e54a0010d88c40b39f43ee243a9c9b013448e43f3a5730a5984160efdc75610da92ce99be6f683d7fcc562c31265977439fc47b68cd8c6943977bc12afe677cff081bfa3f99bb53c6ea08a5ada15372545ece39ab863e469a8513a331c5cda5a11fb1ff1b3ec468e8f377de9809797186ae33ab93c9907962432fccd0a9844d539e47c59caa0c5df814eb2394e79482870c5d0e5d9a523c750cadf7c7c8cc7545984dc696a31a9f85c7d0628b1afe340e92e085189a9c333ec47c4abeb446c6d6711a5a9030b422c55742b61864cf0f86362b7cbac5ce3108dd578cdac38b2f74a97164f0aef645e00fb88a517178e185c6729e90940ee29b49ec422bbf41fc25cdbce0425b394e9ccae4961bc9175be83ce77c5da91b2967f985169a4bd9243d250b841759e87392c9538c481a9309110b5dd0a3e44ed24129bcb842ff19bb1245e95f58a13fa1df416232cf1af2a20a6d4c3a678386242ab49e2db9c2c7bcf62f6f0aedea64df3c22c8c93e5f48a1d15c5a9a77de175168c7cab4b2e9ff05145a8de69262ec64fa84a7bc7842ab93cf5284a841e78ee5a8f1316c20b6f1c20966998cc724cfd295813278d1844653a6d6121797b1f58209bd8cd2643163d22576c7e14fe3c68b25749d2644f68f2f132f94d0ae7fca9f3dcde32d4f423b523b3e82845f20a19373ed1b3582acb49c1747689245d1d556d1089d92e9f9822a11218b854a785184f644c81946dc641c3711a1f74eaf98f78464d3d922bc184257e18216e13145841742e8b34547c8be9b972a18843e851825f5e55249730e088d7ff0ee513aa6281afe4117629e903935f2c207cd9a7e28b9bcf4a0cf94983187aaa98ae10b1ef49254e6b088e30e9a718ba67a2ee71036a783ce33765f3cd5acea15165ee4a0c995e35b49aeba92100eba10fec428a557e1c50dda0ea2a16426bcb041a324c98bf96729d97ce0450d1a5d61f7d4fbccf3e768a06e8e61f51733e84c6f9e4839ff5250293268942cd9b9e43ae2e72c062f62d0e6d3484127e60fe7261834b12726b95f41eba5988c2db42f5ed0eca8e0b194bb05b3e0850b5a19ff145d7e3ec7b4b4a21d8da07dd5b40413a109bec6ae6000ac6853964e79724e332bb48aae634cd2b9f247ce9c32b66accc8e20da26000aa68546c9811b11f7312948ac6aa5c27753866282ad8324fd594f2f24f821b5b14e0146d0aeb5e39e9df232ea66882c605d79e5329395b8a4e874794a8db2105314292714a878a0c06308a5edf2d47247f4e217944d156f7bf56f61000bc6000a1e8534ab2bf5c5ce6c4078a4e5b30e939b62ac948ed2906f089565b724a912f9e683cb3b4777bf834e9b9a20057a04e3451840a913ce7b530004eb47a1143b69238e3bc0136d1b84634efb5501a79441e0c4013eda8f40aa152939726135dd00d396f0c1f5512c10da7e131723c8ea28a89765436edae14cabac432b66c90600770897ebe52aa0e570dc012cdbe2979d9216274f22bd125a52987ce12449e6c204a34ba395ffe1fc78d1a58b870712470e1026f046012039844a3e4b46776cc4f8d3936b488e1350049f4e1b784552c1d1b59d4b0110387933a010d1a5e01172e68d0b01101172eaa140388442ff1752ea8e59068c35bc6155d16172e1ed17be71c2cc46e896f4bc6d6b2231a4f21ba5ac997e89247402df0a0439f7f25bfc8f01cdab418b3b2020f393449c71c09db6d1cfaab24734ccd6b5e56c2a10972a54389cd9071c52836f07843d71e2466891ae6ac7337f41d94d04cfae794c428c6c0a30d7d862453d079368a3eb1a1b590ad8862164c95716af80d537545051090802b2ad0802b5cb87081c71a3a9d3395ce8c512166e7918d023cb2f18042ea85871ada59b98ea47d79c3e8a4a1ff8d1d2adac3686863679207622d9e77f86c3e8d2d900d0758dd5033b429797ee8d84a61e6df8840d5dfd0e274860870780912e051865e626fd808228666abb00719fa605a2a3389cd1f1ae52d32e031066490b29e8d009a193cc440058f307422770651cd188f8d1c35667880a1cbfea73766cd3cbed088a9c7301ee48526ac853ca2e4a80b8d5cc97153f2adacec70e18a225f467cca6ca10959e5a2853eaa788a163564cc9eb3d099cb06b1d0a808095ee599f4a56825c393b4609d151a8f7ea247a9089563aad0a518e583c459d111f4a0422796a6346572c8566c0a6ddcdcc91a5382574faa3e8b1bef804c067848a1cb902a7a18d146a117a1836815cfdcf2c1f2e10185ae325eb8cec8794233726283ce937142972fce760a4a57f0246f429373a5707f1113fa52b9c143fca567cd2ea1533173f7e2e6e07ea512fa68a23a0f8f24b4a62f7fccd79e622b8f844ec91c322725848ed09bcc2172f08d5ed61b23b4e55e1a52debd085d26b9507123ee795489d0e8fb964c16372486108f217079399a84d0e498bb64848f07a1fd8d15a38809089dfaf687e749cfe4f10f1acf31674dfac90eb17cd0e5ce962b4cb0cedcf42015b379bd7d1ef4712e3b682e891052baac83368b50c9ccdb1cf4f9d52d1a39e65614079daf871493c774837e2cdbaf847b52e5251b744984a8faa3d6a01317e3a65ef7890e0d1a25af73615d3a85549a41a3f96437fe8b0abf0cfaa48268eeec1aad120343a9a8264b250f1834af218e0515e3530479bca08de6ff1daf372621e3e18246cff2b54b4a2bfaec1f42b5b3ac68836f292d22fe2adad312ce53e768e7ef55d1e87ec668ba6265b64f4573328486123254344afc2f6a129554f0146de54db242acf20d61533431c710628691cf1f45a5e853089641729e148d27a167fe1f459f6f2a7372b1fc151245bfad1ffa4125252e27149d301147071d3da06883cc5fd9609e4f7411c62ca43093bd499ee8334e3776e53bd168a5707965e6449f5404555a4cb389de62e6f45331a3893e42debce5b26365ca442bc1cf345cfe117284894e46d684fea7f6d2b9442f93b4570cad25ba982426aca994a46c95e8d743eaa43ca88c6c94687486c7bb5f3e89365769a7e49d44f4944ba237b7fc31298f449f326439b52463a98144fff1624c92631d9e2d8fe8fc7fc4a2af8c6fae38a25f8d22721e2ddd18521ad1a74c4935b8468b3931a213dedd39fa223acf49dee7153526ad22da34515264c6cfe92b27a28de7abc9628e11d1262f8b125d8452a2e243345aa5b3414f10261e43b4265ddf63ee5b884e5e0abdab41d7525f42b4a6c372727707d1b887c9ae96748a4e5710bd868e9c458aa8c57203d17bc6338d99e24906107d16213b87604985e60f5d56e5f89c41f9a6203f74627386c5389d8288fab087cf3122e243a7847cb170619348da43bb27563d73f4d08bb0b6b69ce7a1ddf73f931f7c63bc78e87368a41483f20eb85f5c6a87deb2623ebdb40e8d5e5cfe2a21ade744874e774bea84b79852670ecde48f984dc4c98f1c39143a88f8ca8a671cba14af278b8c9eae6ac2a10b17999c437e3d35f30d5d9e4a34a5945e6b31ddd077ca792ed694e968d986f4728b06917136349f92f0ac391e47e76b685c4ec8ea1771dac46ae8e274f87f9cb294b469e857af4ff753c771130d9d85e097428767e853ded914636cd378a119dad59331998f65e892af56084f2a23629c0ccd9f4bd2a816b53fbb31749ab26d9934b3c4901343235fc233bca4e9905c187a1119cf2829694a4a60e8bfcb3b84b23c71de2fb4ea99474f4ec6a44b2fb496829253965a24965d6893d2137a41e87e09b980f89082b685be2a2b55d8913bd2332db426dfff4fe8ff5f6559e86556ce449ccc9f891d469590a69695748526c94b119eb96304a1b242677d22245dd913d5a92a749143124957b5cc888b0a5de9b19c2f9e45f1c84ea1cb59dfdef4a4d08bfc48a6438ce9c8a2d07948612175b98e070a5db6e05bd1c24cb9f584aed7d7e28a8a2773524ee8733395e6b013476f42133387146216fd1326263422f56ecc66f153f84be8c5a25a8eefef23374ae864886131041393aa4d421797bbc2e9915d7a22a1cd51848afc1a47778ed0757a4411ada7326246e8dcb23d76500f935345e847e81e21b3a1244608111a1d29ef885a1022bf6808adfb06f949669f2ecb11425f594a0699351e84c674a2b8a977f614c44068a29e8ae19a1ff4a734aa7756c9929bfaa00fbfb9b287912d27c61ef4a242e4066519e3a2e3416b9927fc08d15cb858cd030176d0c8d950c23da92020800eca99e13163413572b5b9c9888a98335e16c7590d1b7b830039684b4fe6d41b8d91e3b360cfe106b0321c7451532d52ee37e8f45998dc682a4ed2bf8c1886451c40001bf43e1b2acc9388399554835edde7434e4e0e973d4f82520720000d9a9f194ff197baf72db4a83123868ce33972f8568e2d20f037227080095ca018800033685474b2cc959f548e2d205043010798c00538dd20c1d1f810dcb861a3868c8383104006ad0791cfcdfc174080187421650b979c434fd2210d1a5e801c100006ad779b101ea344649cbca0fd90945fbe06190f0f015cd0bc966c915fbd4c49d2d18a4e268d494eea181f62a6b0a25149e90a1932dc27269555347a728a9e891f46872afa34b3eab89b343368d0f05463061140472ada903a4b789b52aedbdeb8d1a8e84da7be57bc98e4995754000126785443012e5c98e0518d19363a4ed1670a89a693f498a24bf9c8b9964d58316acc58430a58414729da5cb2831295829f56ec7490a24d62a4ac89753b46d19725ed2639652a914d87281aa5e4cc798ee73f2a0f4552c5f374944e46a00157c8c0e13210147b89fdc9dfb071281081065c71fb095b4f68d1d109ede084766c423b34a11d99d00e4c68c725b4c312da5109eda084764c423b24a11d91d00e4868c723b4c311dad108ed6084762c423b14a11d89d00e4468c721b4c310da5108ed2084760c423b04a11d81d00e4068c71fb4c30fdad107ede08376ec413bf4a01d79503c1036a874cd9202141a1d77d00e3b68471db4830eda31076d42871cb6230e5d9b3e117d3f885a8a81439b5dd14c9ee8cedb56d140c71bda28af117c6345e674dcd08e76aa48d9781b9af0bd23c492880f0d1b9afc7231835956ce5b76aca14d210591932fa4430dad5a48e26355b4230dad5a94d8ad1fea40435fde3e22a2c7ccee2aca71039595a0e30c8eee7a0e2175ca5fc6568e2d6cc4d0c24b80a3941a0f3accd06eca16393b6545d1518646aa08cd2243450fea62a2830c7d2679ecbe0a8dee129d3d0511157a593d0d13c653fe670a8dac98cdf289527a72293492cc3d4327959c338f425f163e04551114fa7cd3414aceca13ba182bedd2ab38a1998f39a90889263ec44de8c74a5c8a103e37b48891c50c10fc8daa1360c18426c83edfb90a2a95c84b68763c9c582e33cfdf2aa1d1174f85cfd426a1fff989296c14a1e3a8486837485395359c47e8734839c597cbb7683242574a7910a73b45e8e369f790a93fde5390084d7c5f932c161c42bbe164728eea906448088d898e98abbf0b426f72f2968a7740682489cba9cc13255bf007bd0711ff5b413ee8d245356911117e44d68366c4080f7e211e3422c9139944d2f5bcdb0e5a11a62eeee62984a9833e6326b1246339682fe9f53c524b45dd8483562e88f1b0233f69ccdca053f1548c9737b1acba10b0b0413be67fa5bdff3cfd5483565f4d648fe14383fee3646ef86592a3971934ff3172531c15d2dc94411b45768ee7a03ccb081f470cfa38b3b926c39752ba04832e67e80df365a1b4ff823e9cca95498b850bbaecb1e1b22b728cd5b7a2dff90b23a6a383a4d221bec344abe844a4e70a561e55f4953c5eb8d6b049bb26156dc990bf59555434a74909cf4e266465e6145d7e694939996ccc1e53f46726f47f672f4597d7c2a4e86747e4c96e2122297d148da7b867fe9b534c998ba20b1953f35e5209328911f2b28c05650245a7595cc3bcf4894ec643484af982d6139d9ed857d92c9db82a65bd1027a416c1e0446f4ac460eda34db47a41290931ac4fd0d144a7836e32d16ccfc65587d029c998783ec42a5530f5129da8a425c994534b746aa11bd994a720645a892ef799899827be3d4f89ce3cc4ebcfee243a95922473cd31e84d4aa2f964212e960e23d166be885e79906842f8a856aa5749f98fe84412c2428a7fe1f2695b68e188460449fa256b8e085b23fac93f1763b94597486244f3f9bfe19abc54d2fd221ad349799e0cf38ab3221c61d2376a485122da10ca37a5f68b8866652e3526390f8fef21da1ca2769e88a5219a9cdab452cc24af2b2c44db62318cf2ff08d19f26f95842c975b0dc204cbae33b4134572d9643ce646c6c81e873320d994ddccc0488ae24ffcee456093aff03dbbf222d7b2c3ff4aae20f60f4a1f3d63719926a52992d4a80c1877e7265ca4eda82beff7b68cd84875c12b4c4a7bc1e7ad316c4ba584f1ecdc94317f405393956994a3e78e84f56c8514e63eed045cbb95bbde69982ecd0588c9c51a552874e9f7c105a937ac558a143b3416559aec96502060024c09843674a9fcc79c4649098954327b206d5574be3d0492d5d8b793b76d2261cdaa45df9435693cf317c439bc5753689085a7eb53c020c37982284ce51d386de3d4dd6b36cd033b3c1d8d9b4a9a66f96a43534db39ef2411496a70440aa97b2b696873dec949a3c5ef57111a9a519122df744578f19ce192b950a995954433b41fab1da4c419f34e656c154b0146199a70c9f44429914d7c4486b6ddbd2c04d3c8dfea189a51d75429272531b4b982ca97356ac2d025799ac154ccd9b2e360e86447b50e2a5b9cf6f60bcdc8d821b887d12532f4422732584c1583ffc6c68800a30b5dcc16d1eb495ce8926ae6f776b352aab385de3ca9e63da921c610d7429bd94d3de4c611d25421c0c842eb1a4e2f88fd9c421661a1393141b2c4c85ea19f0f3a889c5174ca1eb542179f34760ca76e4a885568e7726508e5a1422336c7d331bb20c0984227948918848cafea1262020c2974ae95ca32c958dd258a42a7f36526c99d745670a1d067868a1c92928e18b127f422b7bd7312296fcc14010fd0c24550039700c3098db236f37491a7b5b24de8845ce7fc3d42474ef1b7a0e19600184ce8e49312e91673d0bd95bb323096d027317e9eb39e49114f095d34a1c2e34bae8e658e1b3628b0001849e8925a8c944108f7d421a1f95ef7f00f31870ed923b431b3568e52d3154f82008611da9c4ba15a1942a25a842ebe49f94ed199ac7488d0682a21e227eba6c872085df6a032415a8e99825cc6560c2dfe861604053084d088659223f44e6004a1f9aad822727a20947373c8259466f00d09307ed0cfcba657cf6669366ea48201183e5063ca8a45f08af9d92b2a80001c8603ebb800a307ed24655512e37f4990e3283ce8520c9eb73d437c01183b683bc9b2a4ba93ccfbc91835fc18f1010c1df4da91b2b5e42a630b460eba686262d27f6900060ef0c939d4c347c6de1660dca0f72cdb2be1f349d97d08306cd0448fefdf8e2119316adcd8c2140ac0a8411767b4668d947d96372b011834e8b39724d964116228d10360cce07ce2294616d5cc9b8c2d19b4a3fad37d2b45d6fca01abe1d80110374fe8e912b7f6add701a5b64f1375605306090ce31ca0a305ed0e40931082dd1aae2335a9fc3736ce100e5000c171863d21a734e13f1b1d40a3b5ad0dcbeaea800022ae0c205a26143860b17e6050f56fcbf6dc2f324cbc4a86123860508bfc063157dac2c79cc4c4fe58b39723c0e7580872a7a4d49c6ac9c3f2ef04845271a94f4dc98e15a20033c50d109d56c65217249d8a4960e3c4ed1899d513a33759e04346c307b98a249519358d3314604fe377250e0c63f0d3fe6048f52f45f497af5555f06cd21451b3f264cf018457329e7b4a092e8218afef727c6bc49e74c8aa185088e080a70021a3520f0593c8d192498712302347c8b11f449c123149d88e8ac7a9648eed00314ad58ea89ce8f7ca2bf503a467f984c316f50f0f04457fd39ccea24bdf1abba4a8f4e14adaf533e5c9ee0c189f683889bd07b19cbb42f786ce2903911a937c6081e9a683fb5868f79750b63ca442f4a55d64e4158bce081893eb7e885a78a0e15962e785c02a56267f4ea09494b3441c5e0c15f3b454a522548e1d9a1a6ee924d9bb7bb4ccae7cad89a5186e04189f674d46fff9c4da215aff8dc299e391e070ec3bb838724baca2a133dbaf84c9023d1a727cda2bd3476f8ed40a29da423a41474fe83be8fe83d8593d9ff63381322817a38a2cd31ca72ce8d68535b44e78d2160f06044173274cdd75369c8d06311cd8f06f778e29f1d3445118dc8dfb1540e9a2a8908091e8968c42b24f687909e646ab8c131032d0676071e8868e3c6e09254fe1e992c7a88ce679499f2105350164c3966cc70190570e1c2858b1b7818a2ef3739ea1d495e9010227814a2d370a1740cfb272ff484e83472e86b5834a91f92836884924173468bf35c3a14441b215b92b9b19b7f4942f008446bf293dccd7c098207205a1fcfcf0ae9a2a6321c40f0f8431ba48739f9b1447ee0e1873ee694b993e5d1a1c4028f3eb41dd761b24905a1846367301f1a959a23c42088816cd8c8820b0c1e7b68a3658ffd13523362e070196727989166dcf80b6051060f3d7439747432b90a934d270fed5f0e2622e7a6fe140f9d57d498f09563fcebfe0656033ceed02837a53a9688af496ac62b50029f405909fc46013cecd06fce299ba8e845d6be0e9d6cd5eb8ec193b1e5c2c56771e303288502c4a0cf215aa7ce7ff2bc210cdabc231f23e6f4822608136142c9930a0570411b42b2b00e2ae86ff2b4a28b9d6f1e4d934ea6d6072b7addaa1251b1318818f4b18a36654c5aff2a2b9babaa68f34d478e5031c43e52d1578cdf1f2c76f6f0818a367a8ce9a32c7938df0ef1f0718a2ea43cebda49a62ce1c3145d5b7211627293057d39387c94a2514259c489a32b0ae0860f5274a9a595b26511fde3368ae637833e75dddc5a42a2e8f38ede5c2a55e80fb38d8f50b4b137a8f788e76ad3aa290c3e40d105f91daab447e7a0da8f4fb4e2ebbe1b36278f1fac31633f3cd19f8a7daa7b926250ba8cadcf8f4eb42faa99339208f8e0442b31bce61c3926492d62c83835b6701af7b1895edf3f248ec887263addb97b72dc929efbc844e73b2293bc995c93adc61637f803136dce2046a498dcb3cbe6e312c5c9fd7296d353638b1b96480761429af454a2393d29af7e29a9247f8d2d6ee407255acd219a5f588a374991b11543068e2db420e53928c075de048f1f936857236636f9493e4b1ed928c087243a8f39c78999a387f812fff011892e4bc630d9848cf07fba3b7c40a21d1926a8169da735f747f4a3f47455b85c51800938a2915e2a3dc78812ba3d96c34723baf8d4a632e227ca930a30357c30a2d19c44662cfdcc2616172e709002c3c7223a0daf490509313d998c221ad1d2145db724a2af8a987352954564084144e3b121a65e583d1d9543b449b72a5c62e7301fb980219a0fdee1b45e5e88be67c4aca7cc3f08d1969ef89fc475a694f431884e368f783599f3218852498f61844e32217c04a2f71769a6c4fae66906107d9b84d429083ffed0c6d0a8f329af8e72cd871ffacfa2c368d28d9754d6873ec7982de6f00a1f3a913fd9bdf48450f95ae1630fed09e9b1d7527ad2a0d543eb1ab3af073f350f6dca0bf7030ffd088b9f2596e497e4c0b1058a91458d1934500d971183cdc71d568f21e5040f7a8c0f3b34eba137cc544c1dc9c0471d7a0956e2249e9717f8a0431f7459bec81124f855e6a0c411fd9099e2c00f39b4fa417a4fca39316426638b3c0afe6f24172e74f011874655c59e6849a53862fa8043ff723af4066352d9db4145836a6dd0b00cc1871b5aadae2c156d8f943a3668c440550d30001ce1a30d4d5029b48807cb209b0f36b41526c89c93f4fc319f1f6b6875848e95fb454b7a2b636b86091e003ff85043237272f9628510346b62d8471a3ab1eef0399f27c263a5071f6868dc457f838a27bf9145e619fa1c8fd721a6c8df485636f83043a33b66cc25441e6f2b95a157c9a93f482c19e2e3e1113ec8d086a41da35f15e39f6b46f81843673a98588f1eae5a530cc28718ba70af702129b6694d02c247187a331946ffa834a915048666fef4fe6b8ed9184babf0f105a35b6ff98494a352f8f0421ff2989c8b099ac53b5d68e406f538990f1666e242a357deca255f5649930a1f5b6864083185a5ca21576a01179554ca0eb9925968b37598f8b1f38105ce640acf5d7a841ef8b8421ba364e59194bb337c2cf061853683279d573d5a840caa42bb6f6139c6b9780a95cfe1336ee4702dfe46a9297c50a1d5a0357b538597e825195b27468ef320f81bfa318536895c9663c36c6491c9d8d202c71638f0430a4df4a4da31641585b645851483b6c8d83a5ba01a33a07058091633a8f647646ccdb89103c77d3ca111597fe3b5332387161f021cb7c58713da18214e3cd56416339ad0e79ca363c7d31771e6c2f1c184c6adbc7d434cc614be89413e96d0c789bd561a9459b647c6968d1c7fe843095686654a51ffe7440fa0c0143e92c095e79bca7bee14bba200573ce08a0a34e00a327c206113e29226ed65617d1ca14f2a4b86f07bc26488e4f82c580c1f46e8f3723b68b24c32a445e8b4f2e4645329d1324484bea3a8e610bfe428f50ca1535a3c64543c73e794b11523c76781001a4e8246394cf0349c04efc2c50d2d4cd065f810423fa663d8789e92b657540001577c0e1b17f01c362a70450168d0f0c28f20f49dc4456bcb5920f49d29269d739025137cfca01f21af73649d2816363ee8bf828e619258fe659c2d6ce488610371093e7ad06a875d89b9c43ce824e714afadf7456326821d3c973c6c5212541df431257daa62221f39e83fc45e854b41e7fc390e9a1c13ad4f856ebfe9e3067d8e16475b7c8a0ddacde56b399624cf720d9a6ca13f4a248906ed99e8b2a8a7a2e4a8ad113e66d056122df937e2a4b6a88cad187cc8a0cb35953c890da5eba218b46172335bfc1e0606a55c3f9fa82863ebe3058d88e8a752cce95ffc917db8a00d6b59d994d269452752ca691e4a94b15582af5129c08215968c86f896b28a7b83e5a91c010b55b415e4c54d3148f524b154f49164e2e790723a99858a76a4e506a14d6e7c845811b038459b92d66c0b296c8a4ef49448cc56eb183d45042c4ad1fe29f99c298b85148dcbc6d19bd292897b3ec062145dfa840b211145fb3986090fcd62118a66e454688810c302149da694a3846def138d7f892092beec89c63f47084a05a514b0e8449f42fb9e5217ed93474eb49d84596cc96da2917bda5ce2569ae8e34bf4c77494897e946fe78b22a388ce60a2add2c899bc4b346742e8789a432ca12596684c75d49311479568c3e3ca259aa7c6f828d125179d5b35a41299a249b4979f64574464d06e4aa2ed58d2244ece45a2cd933c95cc49a3a71c21d16b5a9fa99cd743888f68849e982bf526a1f5774497722b3c65ca35a213339dcde4fc8ce8daf45fe90d9b45983cc2acc6b8a7884ec8104fe28a08915192883eb7c455ea0822a2d9f1d3b9c5bb43b49f96313aeacec4d80dd19c52a23b94980bd1486fcb9074f68f372121902539294f4b924134f14f4a54913141f4bb4926ff594d206c4b32c424d15140e42135c6648ece1fda0b13473e4e16ad94f8a191f54c416c88a45242fad0e8dd14a1b5433ef4e1329b848dff9221db43e71f72123991b3a0bb1e3a3d952de278bbe98fe6a18d713ee58e88f1d05abc77d8900f2adea19332922dc431f9b1a61dced21a9a3a5ca6238e859852e8d05a76cdcd3c55ada69c437b41743d4e7f6993961cfa9953aa2ffe34c5f6e2d08e0899ac42cea5c94b38b4e241874dba226f683744fc121f4c88142f6dc0c20d8d8491292ae6601bba20d152fe78180b36b42b41a51446a578cd1d166b6846e51c3534a7540cf1a6644a05b048432f29c5bd1039248c7249fe010b34b495fa42656ec534f11a018b3334224a8a097f2263f7880e5898a14f25e73dca4339605186466c5c89fbe4dc9eddbb376041862ee812a6654d35478ea8018b3174b27af1424a3219266357062cc4d0a5bcaf12e44d46f4fcb88045181a212d09b99944e9e68a8693c0c60d2db4d0021660682eb69a5e8566a7148b2f64aa7fbd8cad1931b0943a00f8000b2ff449d7e297dc32a541d9854ee65691215670d323c2853ea54aa963e66c01165be8b4af65732d9551252d34a6494bfd4bb5e54d163a9966c2e48ad2a4592c74499867859d28b97285be839a98acb000e0042cacd0e4788d9994bb018c93a8e4af45628134128a44227124c33048f01e01b3130800183c2e8f0622a1609e06822a7e140004572e22443a2414201e1e18168ac30261201006030381302814088441c14040200ea3c441221ff369839f24c1e7efeefb444b946a14d67fa5555a94aa8ef54fee8ae5244d40f693a8bc2fa09c28a9eb48e8c7d3538278e7bd1fa1b35870cc244da6665292844094c941223d641d5656ffb8fe06a909038c0f371588b76e81fa0d8e312c7dc984464efa20a726aa747e0bead82dc9e8424fee1819d9645184e80a86bce26a73a18aaab4bbd4342dc0b6339234885a7ba0a5a489a768bf7944809108f01674b3f466890a601c9531e920c4a32d27f68fca9b975cf96e8a3f614975b8fdfc170abf168442256686cac8f12f0df1456fba5ea06d508bd11a56473c24947ad36c5eedbe2fbe60c51c10363f93b334077054fa402c1a7282d94f55fff9c139b4e9ec2a33b73b2407f54bab81665b685069d2364fc598235e00622353aa9e8f292154d2a5d86af40ff90d91830b930ee2ca01d8cfbb1ff5a49821d9973f9f358e6aa627496d97a776bb351d56342f23de87f7ff2b3d95fe66a45d05b1ca1aa94daa1e903059646e831d08c5ba1eebc60f085ce334db123c78337a0a315d164a10c6e2421f6d3606039b9e9def95ffaaa9257b9ccf828411f518ab8fabf7a80b4f96c696546e625071219e152554014acad5095b7924fbac526f46eccaa9392da13d4b7870b28319c4195c14a12cb177d1786fc6a038da84f73ad7acb015a4d8d21b5527cf136a77512c4934ebcfb5965eda3c090b437e2d6aaa4b2e25901984d0450e124e82c4edd8a07e1f7f1ce6ba34a67f8eb7c8edb7968bd9da3de782ad9c77c18d5aaca7abbed1716973b2b63c49cee060aabf4c66fe5a7a19ff6d29bf7d9ff7a23316786b22e4f464f84720dddfa7d0212beb49ebcacfbdba59f7d9a9a1314426037eeef624ce6db040840c6ae0195488ee28275277e3a4a56e5cadaa490ec81854922839adc025780520e74fcf97a78f45a2536e630e2d77091d2ec428b7f13b05f1d1137733f0271eaf059f4b06e64f8149a5a82ed993808a92ed117ac237726b0aee9b062bbe0585b0997c60e70022c780fd74431709e844bb96875bdc6c189e26cb886057664f02dc492c6076f1bacab773d05d5e11682421dce410bbd0a2b05861b15316c950632de2ee708dcbefd05f6cc58a9fa1e2c23ee669bfe93b72d1681865c963e759c9e228547f079f935dcf47bd42f4e70d7d2caf6411a4a1dce2b43079722bee7e3511bbe3b539de68bb2cbe1fc5b7b0e577872357bc768384dcd842494a39c2922693abd871a930eee22ef78e43d2a633b710c7ed29fda8e3181ae365912a47a5f0083605442d493bf3ed2289671429f9c00c3049436c8e60d58220d255ad7e4b3b05eea16d54aca57e97009bbdf14c04e81d37cbadc256605090c3ba5f71301c4e43865f3f9bcea6f3efd432216d7306b14f381ef594b6a727a578ae13e5471e49cd1010bf64c85e73ef134964639c0ccc9dc6535f600d165ef1f720fcbd276993ff062940da2b10e2d43f026a4e021da8a77114e351a3808effee38802981a95d3eb3f41b146f90d1caa5eb79376390c013f369b99636af1265b39c13c97280c00c254113a986f7d28d4a332075426e70f9a32bd5b7218d29b832519329333d4eeb4c6eed781b583448e33bc68cea3e204c941b48945df79a00246eb82c3d852edeabc50d61dbfe013045e13a5d15b8ada09154dd60093df0bd0d550c40fd5884c1e16ae9389e309a08d832109e25f65369a1ddd8366c05bc5ba54d54781f1ce2c8640557323bd06c47f46f20d23153e5a40b5917a5f0374c8f5bd05ed2de537d2652652da22ed2a449b4e8b4a46901b15cba71d753dfe8040ca1df21e3f9ec2e584539bd410799d3a17979e94fabde588edfbba4c65dc4d702d56090c6f3116356b6321d11b2eb694ed223a587f05f1cc551d0507b13e2c8c5105fb8ccc969787db5b638d7077dd533145ceae6cf5a7da4651a803ef73867828b9d0a642137e71307740cc932db6e638426973910d574bce6903878c5f58dbb0a3d7b3b57f15ac9d477d9408720f961deddc8c100fb4597f22a7bdf393b969a0ca0540526244a20eac3f2a6ceb896ae2cb10878b3a45a1ecd0a241eb82c29efba700db49728d5d65867f0defaf11bb441df21bad3616b398a08892600d5b7fd8ceaa1d951f9608b444142640d015345a3aba583b8c0dd64e598fd8074c04abc272d06bb24aae0d3675c74993d2f6917645a55aacbde0aa92b369d486002a9c94779797b122e310c9404206a3aa4bdcd07270857132bb1a049e1186452e983a09981c1451b6ff83cbcac6754abe995f343979a94423c20bc1e4027cfbc286f9b053d7a9c720e36c6e94fa9b5ec01464f7d2cf5b377b39353e96d6e055415de183f9fe7e17770cef191643bc792e32156fadaba5df56d258f67f87733c980f00b95eac026360f813de39670113ef18bb4a993f01ee4acc4b995e9eccd722e3c443b32e30eea9eb91bef75c21b54883c1a1670b94899cea5c2055cd8e16dd2c7e283b47e5e11894d08fe10d294102dd51f1df52a40c700d004136a8c0565686133759ca517aec9310560b5421409d16d9450604847645766abd301445549013d1854c2f960c96a0eb0cca647a680f9cd39771a01060373c80316a4a71ae6efe030ce6ef603f9dcae73c38b7dea07e15e609296bac9612c7b77035b1b8b4051c130788c958ace1f110fe413a413e6a1684d8776bbcb88143ab92e7c14c4a1ebccc4c5600c184cbc8e17128ac1ec7f607681aa636b61e9eddbe368c10628277cdf28a5ca259314c9fc4c391104b1080962d91e40e640dc3e0223581a69ca8af7cf1ffc09a993c5cdb49d274fcc2d1e7832fc63797af3d7c9cd34824d440b0e7d8749df87d50aca4c5ce3c94aab124f9a92535cecfe00377f4e251a97910f76b974405cc6d868f413ca5c89d8dc34a389b84e0657e279a7f2f5b8ca32ae8753aacb6cc755960b002ee4c2f5100f79a0277365d4b59eaf24f43212fa27fa5681cbb84b39254ddf656cadecd3b9a12bf129a8b542c7758e5dc6dd10911851b88c70e3855e9871199dd4b576b8dcb6542a202dc287cba86239c64ad35c460c08debf8c2ee3dcb8b1303797113556da0fb68b092ab99e44e1b2cf85505d0fb1cd9db8ebb914736d715d782e2613dd76d44ab86a00cbdb65a445f11af61cdfaa7c5dd2b30b3c31d45c965c23703de47a472ee357560a6d692e230576c22b6b0b9481a2a872264c7982a57245fb3f99ebb41f20f9a03e264c0c10a498ae7ade1f2460f7a8444d3b13123230af364b42423e86bbbd12223a60f03c94b1423527a1fa579a27443466f9b1843a0601fd9b3edc0774e61e82612a2ff174e8f907b53ed47fcd9fded84c493b7eee22ec32b7882c0b962fd7f30243951aa4c22123ce735f800028258c9aff470b6db6c96392a49e566f61ed0ca95d645f4c97b9d218e792fc7f1146715fc8478d108f860ae8d75e6348b30c393575fb3ede95629b920f209453e9db56af47201b2776ed94c8053c9cb2565ac279afb7f3bd86a340c9e43d5e960f69471d3c52bf8e37b399c764b03f693793629f8b0a1db80ac28c9a701c7f693cb6c6caad89bced2dbb5465b9ba3b72032bd1a766e99ec970cd9a1e894575885ea1168eca48cea1ace5a157b7222517206ff880c065bcb4a75ce6ee722b4407c1b1b591a8c14041c51052e8160b30f913ce9f0085089bfba0f01bc48ccb8cc875832046d69a17ae11eb805a456e068331b82915aac90f1c98708370620c36483f5fea18113637d31435bc8319d993cee09041a718bc4aebcf5ccf8af22952da2bf10971db511ab058ccaf960886b416d190018f1bcca07faf8ecba03d06332323583e9f0f1c366166e84b0ee180e08a0d66262629873b3eb012c2c6b0be80479b83199f7e8bafc3a08f1bcc48e9d8a041048662b08c8dd1f04a4658fec1fd11361170f9ca63af300d3b3d2334f041d5d0366fb0f133a44a65bbe75d698ad681573481d0410068016a00203692697c04008b00e69fc0a92c20c00601981419d5600f7070db7b22c5025a601ae81009c06d00845d6fb28b8f4090029e8300e67fc430193a802be9b4b3b23d3f1d60024201e614f0054e74bda8b62bd092145fe88004eaeb01c60907029b0d00a21780f0487031ce2e2504aec9b1d3b8e67dc09d032d23b6b550241887bb6dc05c010c925c11391e00847363b4b3b1006018808b065ad086663cd6068c21804170821a5809bf76b5055742dd168611a05d609d9c5a1da7c02c00de03a016c044922690ed11a0051d3939ac00688d015a3061f8fd5e00ed0dd002bae28024001d02706565240e9c6c050f4b01740110a500b500262055dc8d4500862e5f7af1f47e4946d4b37a44370f2c13625be56db85f886a085010381ea2e744840e728928970990e9b5bffb2301829010be40cf2463ecb0954bd90f03db90d69af3ff7377f26f17820929939386f361b10ba7a608ed807a76e67388da10908000b1af973f5b22883520de4aa8d91484d29b7e9ae1f53a0a9854581ab2a4f585942a6180c55c931270bae11ac0679c80b04091f990938084e66c170d5231f8412a02262b554e02b60343e107bb4917f08839d271776c22f705712976c8eff58a27171bdaf44670840a1da463eed673de191db5776d5061cdaaf193315e01b4429502d0153a7a28e837e9e201639516821aec30b8d2601309c147199779960019af66913a825e8253a04063cd2ef92e0f34b02c0655627443e527a59c418c9a681dfa9c4d7aa2ab60fc148374c5046fc4e44931e7e84e6e0853ff64407e7edc074f457e4c3504776282fd473fdc6e679a57ab53f054764c2216dfe3f9cc9409255ef2299b3737dc36ec39947e49ce8075744d0b5d14cd0cd6fca3e3cf92c4da00a6a254ff612d8f0908a3ce04d683627f751af37bd1cc930ecfaab2d7aa7b8e48de5f9fabb7ccd7d05b9fc35eccc0c34453b96c7b45332eebdfd4999d725f3b4ed47ede4ee969664dc553fda63b03de8e1e7b9230de6836634a903b5e12f80c6258ede98db4d790fceffa273cc6fd52c29bb00ce808140dce2aaaa618444222857332c625acabbb0d6cda1c2dde85392214aa8c0d29f9b7877cfc7273f394e1868051dca598a3a3bc089e3f317063f5b5c43f4cb264429450ea4e76e330b821666753a079296e907290b6f186c431114301f46a2cef1b3eb0f975a505752a579b5b8e6b7c15545183e2be3c84a2e79e3995f7f04066795ee3d34da1bbe1c0cd9cf22d2c792c4bb740e75d06e3c454656cf36f8d150e3138045fb50acce2b02f4e889539068aba398c00b34890ad4f2044352fc11205e453731e198df9c114077378725b4e67bf1d2ab8aead0c4ec4e2e105ce39937cca4a2c7b4fc9ab3f20d2aae16b33263a3a5b51bc81e03e380e2807cd43de3aded0585d40e610f2658f1bc7250c72f1d400d8f7871c420daf66e2e07fd0415464499335cbec27ec0e7bc78c1facfb8b05627409a5552f81001fee642598fdd0edd501d6394c1c954eb15c5800d4dc4ea44f891aceaca1c8e13f05e588ae8bc53f36398e79d50c6334d2fa5460450f394c42489d4be2ee3f0ce8066ce69eabee84a365ce302dc9c136c2ef0ec451a2bb1baf7c4dc8ea5ee865243b5639de62dc40a91df684dc4b7e5231b00b1dca81dbf4c81d2751d7ebfee5be42eba38c11f8a621e9048167b261fb3d0a942d4ec973191b93eaa392bbc83e1554071e85fc0ce2421840026151832e885f0d7bd2c6dd1aee42ba54492ce6693f8b8548c9a91c9b448970c34b9681f0150f0937bbd77a279a17c2d0a7c3d2b61919001d00debbb0ae934e7405c953cb310bf1714135537f8d01f90ed5f362f32a87c66a615684062ca9e3c5adc9e631da4b098a28463293f5e26323edd6dd93c9f9be48eae36937ff606457fa538088d85e0afe0bed40bf5a65826b047c350e91b80d61d07e801017e421e198568d9abe6a0c0278ccb8312e35723f019f38a36dc6e8b360b677bd9d75e3b15a93cf8db26d062e9eb76c9704451f467c47626f6ec9e647b87991cce3c43e9c98b56d06e79c5bc8f6b065e3335b28323b44f43d01b9d54c207715f30a5f461a37238f80d7c5a12e2f46cc3ae3f9976e353e6fe32721e98aad571646d70f0b9eb75766f3c50a7f465178cba7559bdbc165c6be41d199aea7631207a753c87cd4088e1f5c0456ac2d09e6031020b3ae7a81bcd7084d0410785c80119ce1e496bcf15c798cf50473554b0a8d095b635fbeb58776bb39a27988c6ede5c314fcde1d81e523e32239c7df6cfb6ff141f909dd618581bd6879ad1449cc0cc8fe2463162f627dde107c0162b0e7badafa37365979b2b78d69210a1cb730ebde9bfe04de2a5881572e1d2e281ceddb22a7d22debf84016625054121cb2e0c285a946c5ac6e68d3291f9b2c47cd1da2efc948f0390fef0593dfa4dd60a3321b8834a0d2c44a23650f4f872757c779647dc453df99ad4df447f34d6edec7ad938047aaabb06b7f9f3a76208c196f3320167252040e2343b152425dd08616b2015d2da140d305e423e38105133c1224c0bc9cdf49317158d745330c16122293082fb9e56a764c5d3310dc83fb5e3937c5f224653bb8ae40a2c7e622c71ce78314292a7fb6416684dc225a3bdb431e5eb576a9668594ed52b1fad2f84fcf15511729d6563132211745aeb0c883d05ab95d34887fe8daaa15d5e61bfa107cfeb3ddab84ab6d24c4d300531ec9efb65af476b79834aa17084a3b90b19aaf225d903d93d356543c4542a4b47f605c37cb9ac130995550a0cfaf4ec68df8f73b15e3aa52fd7c0d4dbb4d2aee42d69d737e352615318f001b86c1acc01325c14420cf1b42aab000f0b080a5f0ae1a6e2b1800ec12b49c3cf31106c75327023229edd71214622a18b8b3b97a7c7b48ca5b6b74d235f037806526f84d6bbf2b9c9ac7db088f4dff478e8a3df727bc8ff5c5cfd324d47eba6e860ac0b79b549071a847dcf6feae7b04f0105fbd1b11114b846feb809ded9261acec9364b688df4e2d4f8ff508189fd498fddb557450e922a02ebda8805504a1b048d4ec01b3d0a87e9ac0179bebfef9adbe5de6cef3a0477e5988c4a30642650748d1ad69c5f133b249b7080945dfabe819f18e25f9211910309f4784077b6e86fac2111718b45ffb3b68c090cfefde4ae8eb31fbb99a0b31734188b85800587f5934f63e970a47e8d16c06fd333321a92309a80824da2d8ba35364e23f01c1d06865e6af4fffd534d485801dbf4b12577a4abeca449b12130a5faae5231a83192bb85db5350eab26197b8613bad2acccffe8347a771038e33fb0b2e8ea525a476addbdec3700fd4025d8e40c2d439be4ab987c89c47b5e630e39386e97e3c3ccb9a409f6bdca0a01b1734ff51cc6bd45359aae1e58e870079e8aa9113d5d495f3cb712c77cf8ba842ad4b7c39e2baac30e4dec6eab4af5bd38be937851a45fd84bceeab00aab05a00d21e18fceb5c27a542b80bd941399e2701ba86158d9dab1e200a09fca0030a8b4f9ec746f1eb1dccdb295c9c06d70759a99e5b647686982bc52429912833bec275ae950f6c0255fe3af15b4d4796c6fac59112e4d9b53362945e617f28a11664601160fe51ccac22f8f5e97cee4c43951c6b596d4a0837a5d02157d67a152c41078025f58d6069ae7cea58088cc204fdc6b65a8371f6fc028dd9edac7a9cc2b90999cce0a247c94be999c5619685869470629932c9bbb5a2ab388b44cd9503cf1922ff002274fb1c7dacb5d2f7649877dc15273f35c2bf1ac71beb3e8333077165d9259b0eca2e12339247042fe7a1f82557d1c5f0b34dfd04bbff8fc9a6013f3075bb9796fb7c0a0014c01438933d422ea1a521729cf3c6a3e2f805a395e4a1180c481bf19aa22af0088d74a1012323bd6767d65bea07325e252064bb805b95c94aa4f832784b9ced3ac65c45b9705b3c2d925c74186c1f5f115dfc4a3126e7bae8dc3dc4dda167e51b490dc8aea69859228ac1bd90d60e2596e461fe24b7c8bd3c85becb6f6db1ba41de89e047bacfee7d5c5ac1d45c5c138664a7f4fbb0cc28ed5903a044f32003f48b4ca29eb287db35feaa4302d7a5bcbed056981b6a0571235911753cae040a4852add8a54178a98730f17d035d2743f735da3b042ed2ad005a443479d342cfa1ceffffa24b10a9b3cca80dd3e09d520ed015f066e7c5df8906a68f76e7f3ab174189f2d689bca1fb1c9f66b3299f55977ab0960e2605cafdbb33da146216c82c5684bcbf148ee12f9b4207cb1fb33bd31f0e22ee74983553b59a2a2b2524300fe2575a0dd09d18ad100394ef6d940ca47a2e5d459f1cefe237ec095c2ed033ad77148269fe7082490b686ebeb56e01bd4e9b2b7d87fa8d6d1b5fbd6053673905b07c7586659af7c98fe0dbf609931100cf209c6222c5136d4275db1c4d873d2d6e4920a38b693db23324cc42b7006eea62b96135fc4a08af501ec223dfe694e10c56e02f05bac9fee3118aeb8bfe99f8e8fe33a8d54fd8dd86dd11cb442c44e5f5e1641c13d7cbeaf4990d07c2987db265f58df38c7a42ac7efbd5ccefb950e8a77088ce13fe98423171ad89449f9a94479b9ff7f82ea9dfb56368927404e5b46867a47ce7cc4aa76f03b9f22b1a7894901085e5a0d3bd36db806aee41f4083407e9babba785ae34daf13c028e46ba121e4857197d01a0f14f7b741f229fa6f18591de6c06f8fc63ad2f20e60a3b8e03dae25ead2025ce03daebcac1bb2cb02a2194ce44c2745693cdb89f020a60ff15ad5be3903abaca4be08e2a787d9cfa1a7b54449094062a0018e05267172b63aa8a3e51c84d6c2571308674760b10b2b3151296d97b91b8c5813187c51dd146bf7606238f5081be6b5c99bab85d271096d8646995a00521a181e40df97e98f09010ef3f4088c1c50ea8bb7001a93e796172c8f4dde5d9ebcbca2bc7bf506e6b9e585cb639677972727af30ef5edeb07a1750026632cabccf94975996792773589c0eefdd1aae65e5f23b0f72500a7bc5f033d5ba81ebdb2593ce4e643daa2d3104921064209c40201e92d18c3388d2376df841c98d57af172a17c64b220010ad2c6a1be579315372b535b9d255be4356ddd728a64ea50c16e6b4608fac17134f0c1c2aed00b9215484afbb8c67faaaff1d5cd65adf0db1e4b3a4e0c98b073076e474eb030f1284bc23f327df913da692dcfbdb3fadc676d18b4dc9bc893107f045875bc1130b388a38d2e20a82dac2c4315bd3d326e09fd15e63e2fe237b86d46a3f2cb301983818327febf0adf19a4ef7ba6ebfd19d1be1e0e848565c523bf71ef8f57d3064638967277ef3286470670f4e73fe11a6c8d5581f4fab048c756bc4d18763fbc8d08068420c03310cdd0ca5a64a46b63034b04222eff31c5a4383a72a9a2f35b852d729cffcc82ba5173b4475f0833e186d7cd9c00f27d71304d0665edcb4a892b6813cadd8b2213d5af878addf733b35674fc7bb18b24b7c34746842f33a69032c63f9ec9cda876aa7cd4670e7cf5b1c2e49e993b6f9b21e6b2a2c161ceceda2043a079edb1ea3dc778aa3043e56a46c6fabe58c30c7db1634270727667e9c6ae53b5671e69386c2de59ecb2d5d0fe0cf6b243b786b0658fc3302f69c8e6f4e245698e6c81fc661292a05cb944890f4da2396c4090b91d382fde4229dbb0e141cc97d7414f2a7aab08ba7e754399020fc22c2468a44b749e123bd74cae68e1c59b3dc3d761a196e54abfb7a9e8cfb6c4dec42691cecc75e91c8b83e3793a6d02e40595b49029592308812a1c00d0786e134fdcbb0252634d01f09781a3d5719e45c9bb8dd12c339f83d41e50a6a01c96a0e7291cb5f34723255c5b98088c9eeef8c0f8098b803632c10039c802f048c2e4c33bca46ae120d986f3c6d2c8382bad9b5f84cd52d1f46a2c5e5e90b75f4b027d7b82eebf77a6bd0e1e0dd6879caa6475094cd53095f233238a080d94ed97caeb1770cd4c700a5ace27c13634b3e86ad9e50a3b9d1a5810021622e44726ab15b578b61eb7da43fc7de23b870051a15c2f445ea034656c0c58fae0745f549fca786f27d06390244da7676e66c246623b15eda6ff487ebf6a1a5bc3aadb359a920615de9cf8a0e2a611f302d932fdca80b5297d048f0b911e4e0fe576b798800296dd7fa49f3cb1dd0e6cea12f9489028326f130781bd296d1e862c7e580656d75071621a3f2b347796b547320543dd13aa1569745cf0c8245a80c204c51c7923b83954dcdd7689a392136a39e0502d917f62b7078cc08c7ab2f346e69130724e14cbe4ae2581c07a7642a47792fc8b156aa02461329a8d88794a2dd87f795ffce3640bafe3eac186d80c4117780b869ad5ce080fae8541739c649911214cb03f2f2b01fc38adad316da05d892ca72604e150d9a6fc58a5b96600ecc610505f194cc790c96e830a9a2b5fd4848be4e2b384c19f74d99f24a0624d20c3379a68e4b8682f318ede3f885ed6a0051a344c70e58563ea789f4faafc0f4181e1701ba12a4a64e9df1e9c8a4c780ed5a6601c32200cf02bbead455b064407e7f16dc88f7d9b78c65c0aad2b6ea032b4efd7068389c00032034685e3e26b630e4163be3c1b897251bcaba9dfada82bfb5dd778524617374182a06d5356198042bb9593b957ccc5a17ea9373af378f6d66b06f6f7fb015269f04296618d83158788f59673de0133c574488685e6cc282e74cf92f2744ff1b402d4f4581f60c1b60b61d3c61062e3756fc8340e864c739e60ca998576209d5308e7efb63077580df46814c377ba5c15d56855eb66176e70ea1fbdba1e810a29977405eef6657c108ce0a27588782612ee1ff604c0bd7ee9820e9c91ade07f50aba145e82c8a268c974b8a64bcae3e7681980200344042effeea62b908197dea244b2fcdf02dcfb0fc16defa7bdc31ec1f5a367514d688e6e58f88cd614aa76899e9a5ae4ce1e4dc32504a807baca33b345e75fba356dba7857693baa93e6d369a13b18d13d0b18676e86482e1c311b7c2b94ee46c75a9a885bc529e5ffdb0f3ef0f705a60ae8c66ba6bbef205da40cc59e1d41140ce6700c76a6423e48a57129d4bba1b874a0c2239c8d14c0a6c09686ce818d06afafcd251f68d125f2df1c87a533ca53f3f5c0d541203f8ea6fcf348aa8119540bd20d1751edf1df0ce67528ee6b599337d28eff1e1f6031852b9d911b901d73a2b59adab8d1c826d039b3f2b1a7a5c5d48c0579b144a2e57c558309a0d25a55cce096bd6f377656a514e8c5c2b0793224e91b3180bbe26893f5b0d6f182810711b2da65501bd29c7cba3c8d2fcd3da1f6927fc031e9992c408cc9e0978f0c4bee966c240185c00a454c43bac74279ed4825b6dd09f96c66670e1dd94a67e6f076e334daaa76f3ff8c4fae9b46198ba4c459294fb63eaa356e36faf144057685bc905ee7798f812a6fdf479d02792e3d1258fcda807290caa38929a74688934a1d2c0684c5037145d8abdb9772736140d9f102fcb62fe1e4f3ac185914ff794337cc417abdd967f2447d133b6d7c96852f531f67bbec58c339148a65e456f0d3b7d7d9cd6ed8398a0a00c541b5290aa4e3ef023099a24311071c890a275144d75db3b34d31517d5ae05ff876ef58ae3c8bea6aa7976336464a952b40109af891348bafdf167b049d49c4741954595b5f9c711ab4e46ff0b45e7235bb80b7649462c2995966ea72b725a385ace1cf287277ec104cc389c92d15a40dfa5ca99fc3a7346bd0145355f7add45ceb710c614f1b861c57728aaed8525a20a73b8d6a46b42328bde34a5cf7161dc4602b69ec5d92f9e172e691bf4c46641a72e9d147e4b97431cd456ea80f38f53e7f9ca612c299a4635f0f6290d8b99745aaad3507789686d72585d6a8377231862334d3eedaf73bd52d46a4afd7cd5c6d3ea0f651ea35fa0cf83cf89d14c30ea4fb2a2af28709b73f8add163745bcb369fd00ad074d0dfb93aa2b5de6d31c6137a0a59123166864acb5e3986fb31f1846cbeed556a081efbcf8f8d38d1a44c0e525c8cc9b1fc3b450dbcb0eed8ce53f89be1643d6e05726e6db01ac6179fd6c43a56b7191804705ca52b822f873cbe386c5aae3b60a26da6da196a60f590ea1302e56186c4dcd2651881d0401528a2c8507b41828070b8e1164947093abab807ae7e97bc8c03a0aa584863b32694761dc0d9a4c402a30997f270b666ee80c94b40da6431f552b81f1c10006d9ee1d5be7dac983660a4a6457af1e0af158a81685a4ea3c07ba8310b5ad014d00f4908a7a98461d2502f07bf4fc8f7d220ba6f31b9a48b27f1d321912050a7dd5eae51e1b7a10cba9482df759f2ec4385694608e92e773ba07221115cac03e2996dc5dcb62f6196baf9c2bbc19392ce0bafa2ea7bfee70b8ec26296b5c8ea01ac3bac87e3840a1ca154ff6dd9884870dc0100a85215d6d4829340522fe1136ebe98d000f1a5fd3fa0d887fed0043ff7a365e4e0ec2f1a006c6f3e1806f9deb89835e9f28bbda958964ef2f193962a16d5d940ea92fe2b9a054c64eae9f6bf5c661e27318bbdb5045122c45d5cc510c500c9b893101289c9b5114d92651eca4e19c32a10e907512b50156d42b68f9fc0fdc95503c59df0780f3080acd931088e56e9b95f3f73815d440b2c1441b8b71e8e4babeb4e20cd72a3c5fda7a02bf8d2e9ab9d00b4242b115c92a752649513fb82fc3d2c803ddff3152d0f0addeb0580539a92d4e22276b0d43475f63ac472e50cf5fc9d3c23574cb916ca9dd36b3816b3833137d8016abe1bb08661786d38c655969a2ce5426044dead04d4ce6b85010d8ef08517499db718edb7ce91ba30faf0f2f621a0c5adf6bf6d19f77870947e02fdcd3adddd7588b1bff5c08e4b1280ad5d4efeaf0199e42fe6cc3034d8d25b50209ef45109e15dab3d4d46aa4a12b5f8e6ba0dcf3b502de73f33e3d3c86c6f407f2e803d0628fef394c5a79621f8f76e8de35e048028eebe7b083e160b1ccd6e73dd55d905037aa967d5685ce1958db178025845125d79d2f45d0f008e702cf9807289c191bdb6715d3e8e36804d62afa48db301e4a5027ea204c20b3960eea4900300c3300cc3300cc3300cc330bb138808941251da69cbb352ea0cb3ff7f39001491b22222c949a78d4fa78d4f67263e9d997ae101d70bb50b540bbb76a5862e5984740fab82ba9986e6e37ce13235e242a3a1ffeeb4d2947c36c54d409fa1c917fe62926ba9728f199a241eefa7a75439de7ce16594a15d4dd51cdab2a6c77e802643d7b3e1247b3b2c7cf60b30c8d0caa2c7a0775af4cc5d92a0c5d0bb4b9caf9819864e663c5e7a6e4f664130f49ee5152bb78510365fe8ff93e765965ee8bc3d8cce3e292a067417baea94d9fca58398adc385365b476698182a2ff75be835789290e3cd16fe51b4d07fd4e928fbc7e543390b6de5048f3af8147a3cc642a3d391254bafca1e2357e8c356f659c8f1978b678536451d8f332b4fe7eeaad0b547cb2994c4a8d05b6cddad1c8798fa9f4213737b4cc922d252e84c2b63737c8fa0c1f7425550c6176584d1c76c1e1d056d28683f41db09da4dd06682f612b495a09d046d24681f41db08da45d02682f610b485a01d046d2068ff40db07da3dd0e681f60eb475a09d036d1c68df40db06da35d0a681f60cb465a01d036d182816af502c5ca158b4425180052bfa8fd1d27321c777543b461924c06215fd454aaed4b1fb1df45ee886092230020c4021b05045bba1b5647318bc7b542fb40670012d360660670224fb0416a9d019a810038b532816a6502c4aa15890429f80c5289cf89073e6b631801245cdf80216a1482060018aab2eb0f8c479000b4ff411f92af33fc365988004659860020fc0a213cd44c6d6cae1ba7e30b1e04427f2126773101f4b5e36d1e558d3c7a73d28f10a0b4d346ded93e7f9cf446ffa2f99e46230d19807bead1d532ed174746cec207754d29196e8f279943775d29ceb9325605189564314ed8f98541084f10527000b4ab4ba973ba552a4103e08de046174d1450a7c04fc000b5ca56331893e4e87df1e7c24d15f897c67c6fc13e21a89464e7afc2b9390683259f488ddcfc93aba2e60f1083c3d2365b484799524123487598c374fb9d002168ee8c3bf4abee4a8ab6f4417624f6875f738520a237a8de13bb6f85b797c2ca2971c85fc105d7fb2a388b6b53bcc39c8ced83f119da8b9ac45e6f8b105117db8ec6e8f1353ca7a88c6c39cbffcdd3144d3f19b98e78568567fa7c7a3b52797107d071a938354b578d80fa2ed56f935cf95c717441ba2dc5c321f882e63c6d071783180e853e60f0f9a29572de60f9d65a9f4907311216cfcd058859863f86d9998983e34315bfef5160d1f5a4b21850c8993f972660f7d183fce81768728ab193db4f15af3e25fd2ca92c9436f1e4bf8f832828647c143a795e6d93966128d2977687384fe8f2e3b967bb143dfc17f2ed509993d973a34a255c94f7d37362c7468e2ae9a58468be1b1cfa1d7ab580fc47a938c2e87b6ade348e52d2205cde3d0b4cc761c0f391c5a89e8629ae34bf1a36f683fdd3fc41ca7b44b37f4b9e1e34f1231dd10b7a18fe36d1ecee7f8d0b0a1f9942d9a490e394ab8862ee4104cb3bf3c73b66a3812938c7b1eac6968bedbe3636334f4321de3ae6e8c2965cfd0bec5a09f2c7cf323d50cfdce76f8f0d0a1bca765e862f349749c38cd3819da0e3d9430a12f445fc7d06ce8fc211e490e37440c7d1c8f650acf5c18baec28c6c3ff4ca97209863e7cd4c9346cf9852e6696a40e5264d629bde0ee788762216517dacba251e6efef91830b6db7a64ca56d1d69670bedac448f25ac23cf6aa1cda1e3c0225a4e47260b4d8ee7c50c162cb49d793e9049c9155a378fa23c9c88159a1ccbe7dcef883948b00a4d478c9e1f8e4885a62584c8915994c7219c425b31c584f45890f3a5d0588af93fa70e5192128576c23f46d0984daf02853e935afe38f8af7ef813dacaecbe9e21f72dec845eb5e366fe28865dad096de870dd931813daccd7718fce4c49dd12f420b455f37328a18f536576528e247415e43fdb73fe421c09bd761c72f8916c47e8cb3afc7c7c9b4a6746e85fe743273f8ad07a0e34763ef09c7727425f1dfbdba2a7b7db1ac2a51f3f390e4d2134394959b0ee144ac6203439f0a49fa27bcf4b05842674901ff4e76e1ef7075d4e91e22d7bf0f618f9a00d952cefe566529da807adc74172a4973bce1ea73c682e4492ee38e64a12e60eda54edd061bd92eec6e8a00f3ff4bf728ea3ce9fe4a00df3b0e13a52434faa30c00207fdf95a108b1bf4137228ed000b1bf4f93c42f64c69011635e82b3cd8f1ebce39087eae000b1adc3933e6206f620ab09881f3a1a5390e13942e180b19f4b22157c794606d211a835ebcb37afc59cb1a60018336e7cf95731a13b2c55774def9a45373eae9ddc2408118ae6836dd242ab27f1bad2064fa0792c18ad63b42f6c77157cc29f2426b15fd6fcab4a7c7df8ebf14f4862abaa0bdd9f2a772fcdf918ae6376a9cd81d8e8ae64bdd67b4443cbc72e31407f78bd149fda2eeb4810d537411dba5623a3c8c8d5214b934a64c5aca7e83146d2a09ff5132e2666f14edb7e97e3c8b09c810c5a11e690945abaf9e2ac7c96df9bc774146176801156c80a24c50818d4f3426317718225bb673b4e189cec26fea2859ac94471b9da8c3888e3bfee33638d1aa87d972f286364010460540104605c8dc8b0df762c3bd303ec6171b9b68e65c67b543ede41b5a3c6c68a28d1759316697d86123137dcad12fe614899c2a471a3630d1248b79e37708bf631ebe44177290b25561c3126d2a9554a61f669ccb57a28f2152bcce943fc4a794682bb253f2771c92868d49347d9dd4f23a8e573667860d49f41f8739d2714891e8673e48c8c48f0a5a42a2cf52d758513ba7d8091a361ed1c771a01e6c59f42cab3aa2cfb264ba2d61239ad99db228cb5962b80c1b8c68c437e27a8c1d5fce2ca22f37eb38b55e868c0e29a2f590634ef8dcb17bdad948441fb59f751cd63d7724756003119d8975e4b2aa396374f1c40ed1bea78adf8d9862270d195fa40e360cd1ce25afd6bc51314e4072b0518826c6920bb764395e33c9f8c26cb04188a667afc1c620fa40b542b2e50b195f706e08a2d37ecf98b545420cce98414601e0061b8168644e4326496fe92da5b001882e4795a34cc7418e317fc0b0f187e3284274143c0cfba1fff2cfa972de0da5550406b0b1d1873e9377e4dcfed1c1253e3c63613c4a31f651d8d8431fa1cc22f23c4488d238b0a187be35458fe7cdc233e571d8c843173959ce7bd581872eeb48fecef5971876bb431f6bb6bc317eb543b32a5b2e5e5193ee8c898d3a34923f4f78cca8c694c3111b74684b82948454e4462cc100430c0a0c60830cdfc0416ccca11f4b1d884e47fde7a148860d39b471c38697f03025bff6b0118746c235fa4737934c297068264353e56e8ee4a2586ed87843ef512c0f35462f4f5a1e0c1388e1051926c0256cb8a1e9a9544d91ae0e1b6d68f62b5e4e1de51cc6c9916bd8604323e7b12385d48e9dc81936d6d0b776188f951c952594890d35342e21c60e27dd3b9d4f431b347ec6dc1972c48dd1d047fd71d13c7c5348ee0ccd69383fcde172e6206486a6c377e4165ede284393f37d35a5949b31a36c830ccdc797d4ede06d8ca19309298f7914e425fa5e68bd9f31b80c1390200c2e880336c4d066c9de9ce0df91d74281296c84a10f43d860316fffc6e4f1860d30b41e74fc96db63d7ed950d1b5f68a2e6f7aaa58e171a99fe54e99d25c548e942e39929e538f5cb85ce72e2cae7508247118571898d2de0d3d571a19348c70140061b5ae827532d8bc44a1e5b70230b6dd69c253aefafbb7c1b5868db5bb4ff2b49f8b8dcb842a39db36abde586159a0eafe392f5286e4e6ca30a8d685b0a1e32e707ef0615fa604d3707df39b3996f4ca1ed20f7a25548b9c3906c48a1091111f2e5284f4751dc8842f381e6206f0ec1cbe3bc0185c6e2bac418e7ea51e8369ed05cfe6e497e12a5fcb3e184664e25979ab6fa668f8d26b4dd3926712598c7ebc1847e4255febc5d2da1b3dc7fd51eb3708b12da8d9103f7603a4ec349683fb64ceaae4868bb530c5515e2c6609e239431232b777aec6d56000370d83042a31d65277a87949b2c45e8e32847e9c713a193941d73144f1b42b39e79c32b17429fe3d8e820f407daa706a14d8fbe397990044217e72fe3c48cfca0130feee18c5808a6f141df61f47ccb1cf6a06f0ff257ea8f07bd85e74c612ea587d8d84193e15274d04a6754fc38cc6de4a0d7f550a13dae9041f40d1cf4f2ff21df42cac60dfa6ad70cd736774fa110366cd086cf2edf221b2c8fa5064d07e223e6d55164c378850d1ab41ee60c1f2ca7520deb08024f886626a74e593e3439cd209a9f8fa1a3e74a109da4ea70443e4ba25781e837fbe4486240b472d1fd520e13151e7f68a364e64891b2511d7e68f3e5306a6c4e1ffab2d6e8fd973fd29e0f6ab84eac30993d741db59458b2dc92a3e8a1f99c3984ceee165acf433f12afc43fc74357319a84b21032ffdea1d7f35d71bf0cc92479a145021f030558002decf0a7086144f282c6b7072deaa04a46e4a9480f1de8d41cc4b8acc9c390cf812ca117e283858b1c8c987289ba71305cf3e7e7943c5f0b8742cebb1ba299e4f50d84855b0c96a51e7383632215b72bc7671b709fb0a1c857e6a2ad014db596a8153653433299429c69783ffea0634db2828586dc7552fac87568f50c6674c9142268863cbe62ca51195a94a1d81c9f67b6eec9c960871d7ac7f11b821663f03cea147f69218672abe68e343fe69f6811063dd6cc0819f12ab400c396a3915a564f225f38881ea847b91d3185165e28477437768e444e68d185cb622275f8e17c092db8a09a94856ce11c3d94999c2be6994e125a6881f61859c62a746016f61217f5d852dc082db050f0deaf18c4b305115a5cc1982c22351a841656484235a6d44d425e225c43bbf6c75a1681d0a20a5d0ed537240499efc950a12ff198c9251933eabc012da6d0468e244954caa3462f855ed4bce3092151b0da5d5258446487a499e76027babbab840a141acbd9d4b184888f931201191e017e42ff1e04f7de749dec7138a1dfd48a297fbf4de8247e3bccb3d482094d7cf01e9c996c77cc92e107022b042d96d04f44a890d2cb39318712faff8afeb82147f4f8c83041195e4612fae8384e22fb931d11720186a3e084712ae00024b4d15775a37f4e0fb4c343d0e2084d78cbd8b1223bd0781aa1c916d92dc63ca9a08cda8116456836e7cb79a3a5cc98418446ff33f57c1ce7feec41062d86d0a9f6bc6c588a8ee51042bff9dae25f122d82d085593e8ff9bf7ccdc90fb400425bbea3a2b1311868f1833ed888ed78ba73143fd3c2076d8c1f232e4abf3102139c318e1765b418177032deb40a8e731e306386163de83a9e690f3aa4ccd3e9620c4e3248a9e038a7f0400b1e74317cfc41b5524716f41db4911ba13bd0685963a7835e3f8cc7f143f2f0c972d0a5504962c829a84e0b0207230ba2050eba1c9db2e3c07431c8f053012d6ed054877420ee795367ca63fc30c4cee03f8a31c6185d06195f4060c68c32c8f8020c2d6ad0c7a9cc75354483b6f7a5030f966a31832676888a297f6402410b1934d51e3de5e41e133bc7075ac4a0d91cf762b01ce247086b0183cea35c31ca49d2b278456796357b94424c88fe7045e3bdeb9eb2b15624251fc9cbbac223e5598d56a6b3a2490fd23a948ea44116ab682c696c1dc91e7e3e4b16aa6854f3757aac7bac3bff171b3ac82215fe67e7c57c90052afa0f524549d9e152982010b23845a7b137e4f071a4085998a20f73b57b01734e505994a24b31d9c955cf82147dac6c112cbce6bc3082208c030618ee8521358a765a4384ad6065918528da6819e3e7d2903de4a5a80e9045283ab738fe9147969a73dfb53a458c31cab00067185f8031c619414a80035d6c16a0e8af6389973b66440c922c3ed1c58ec31cb917242b6a0ac8c2135d889de358df25bf8766169d68fc3dc5239ec50bfd8204dec529c3bb380970a08b195970a2cd8f77d5346369ca9a008c83d0c86213cd6ef438c4b7f8a852e9851608c400e3b2d044e791aac8ee0721e6202a06042090452608d51e2123e9f22d551edf96d949523ed30e08402006044820860466cc00811860dc186590200b4cf4ba71937e283dcb41040990c5259ad6b1e496272e464af142eb28638c129041bc28c3478023285f808112e0401706c8c212639c32c830c1185d7421802c2ad1c6ecf3207794e8e2f3587453a96c4da219f13c97949f0c1d49b4297e8e0e35ad23f44874f261b00e793ab8ce42a24921c6c47eec11fdfa460db95287238eabcccb50d2d1882669ec38984d32be3a235af148d1a9938be843644e3cbda388ae83dc6731663e115d8c68e6974924ff4744a79bfa39ce07c9f410bd5c7e950f4214918c217acbd2a1b8c40e2c530ad164092944b7bea54609d195c44ac9ed39deec0da28dbd493d837acab21941b496bb2445bcc8dc712510fdc4d329f32846f0d101d14ad6bd982fb387acf01f9aaf30c142594cd983fdd0c40f37da24db3e7461a62ba3aae54363c9f2afbf6884c7ea1e9a90c3585ceb540fed4e84e02a1a1d79360fad640ff3f1a8aabc8987662e7208d731c4c75cdea1cd1452e3a2e5ca41d20efd4f9f69de0fab439339da726f071d5af19461524ece733973e827d552336b08227139f423e13834fbf1c857cee0d0eef5c7afc6ff67c81b7ab1ecb194b1b059a11bba1cc487afc44dfe13b6a10d935839760e1b9acff31ca29507d13f6be8446545e387d5d04fcc11392db588721aceaf4e296644d0d0b7799877f8c917ef0c7dcc3da61e83e62854678666adb379c66a65e834b6598c114286fe3d5b7210f38f879d8da16fcdd671a46f96e8c5d075055dc91f5361206a86e78e3160e833e44e53cba925972ff479de839cbf63fad3f2429b430fd22cc53a5b47179af6ca593cb34ae51c2e743147364c27e9a083b7d0640bae5bd1d4422f39d210f1255968de32cfc5d6200b2c3441734678b01e3e3657e882c42011e79ba442acd0465ab2d01da44f8ead175a650e092c3063c60db2a84213e6fae2314c947e850a4d5cc4eb28a93205067001080c000c1fc118624880026564318526e51cea29cc7518f948a197949009ab1a33ee47a1f999f4f289cc6715287441dc2466d5cd13ba9842d6095d8abbe961d0b1d46c6942337111aaef1fa75e0b131a0deb28e4b778098da77acef31f7f0a314ae82df7724f4d421fbc65f114292573b948e853dcda72fc087d301fe683185523b4ab9573243959843e34cdf1a97a566b8710a1cb51cbd2517363cee0101a8bb5907b4914426f1ea40e7d32333f82d06528914915734068abca2307a9723f683ef4ad18963e16397cd0e6789523ec7becdff7a00d9f8ed192a578d074acef29e1eea0cff88c4fbe7d66125a1d346dae3a5539ccc2c822074d8af3ce33abf4c8c14133b9d7fa913ae2ed0dfae431a416978e99efb0412ba631b6a3f02956fc6bd07cec39768c070ddaef9061cb2f3e832e44881c2f83c7ead465d0761c98b556c8316826ac058f96439e89d92c60d08ca5ae5c9af38a3e788f1fe669879faaae68772a4e0e93d44b246c459ff3643b684d7db3a2e9ddc81142e458451ff9c146b467fc2c1e55b495afb43cc24f4513437fcafc91ea8e0315ad8768f747ba39459f7c7673d04d3145ef1dc98338192f4513728c994be33b6ccfa468a662cac88c3b8abed473d8281dc50f1ea2e8cf355392e079729b1a8a36e67f9c3151c2f70b8a36739092e01a3bf6f844e79a2bbd34c97590f24427bb1151fbddc39fae134d8a14bf39289389184e742e972e255171724eba892e7b4e8dd28146139d4579cd269a9a59c5ce442721cc3fc27260a251918e83f4b29cfbff25daf0fd71e49a3477d6b7445f31ffc30f292fe4c857a2718fb3ca871743897eced73c28adf4d0d949f4417a641e9a5d2eb22989267a904d327eb8b61f89be323f6e8f3106893ece96d97114e61ec7d406f1403fa2ebe0513e8dec396c4ddb119da6e4cbe2714c21bfd2882e076de9d4bb1a51103423faeec84d9153e94afe5844f31a3e8893afa3883edc5f13d1464bf9348ec6fcc51f11fdb4c51cea21e4cccb215ad5205163653f79a518a2ed950e336f6abc58964274b12e3973c79e105de7114bd69a152c5506d19f967c302d2136538c20faf84b2d457b64a9631e8836b76ab9071603a20d793bab439217e9ec1f9afc4e1a311a24735b3fb4931d1b2eae82e5a0ed435fa1da6e3975b8e1a17ce873ce71f0132b8bb447f7d0584e3172e8937375563df49129669895c790ffcc43339e039d8cc871dc7ee2a1df24f2add3ff71167287463bc7e5be133bf4e7c1974a5cc910535c8736529ae70dfdb5b2081dfae8e1454b1e3ae5708373e8673b6b0ee35289c6510e7c2c16ffb3321787b62d55e538c64aecede0d085a87b91e330875ce61b9a0f4c3dec9c310f25e686be3df2555da3f524d6862e775cab47b779ac6143ab91ff5a2985df4dd61ada543a69e4d0e988a231cb1f63b5e643d169f08e714d2284147f5074b13c55c4289a33fe4f349d32c48ec7e2893e8e39987bec8c28c14ef431b63a4869860b4e34135f43ae23df44279e2ff4994eecbcb226ba1831e6c78fe33e0f93894e62deddf0788d2663a217c94162b997683efce72059e6f0bfb5447f9963e690d24a2f5989be3c3c2f6fd54a91524a9c235cd2ffad4ca2f7cc1eccc75512bd77788a493107216324ba30723197b18444e33eabee697944ef1e6f98605e61724a1cd1bbcc8aea488ba8461ad16fb67c15438611ad7c8c5ff1a23dfc45f4f103b5e823a322da3c1d4c8ca9e312d164a568e5b16988683da49ce2e7cbec26b143f4d7e5313ad6cc10bd47e465d8be9c27558568c2c79ee548c5657310a22bdd0e24fd22677a06d16abc8ee161760f4398b81044d37156fd37735cc22310bd8ce9479dc87d591d80e8fac552c5f4cf1f9ad0d1f26eaedc9bf1e387a633557f5364769ea70f6d4839921ca43cf6e83e1ffad5b10cfdd9e3c81d7b6872495fcaf1d143e725dded61c796439f8736858839c8990a21afc143dbf126cda3a7b943132e44e548430e56663b3431c741fe706ea94393538c56913bc7ab60a143ffe9518cb81dcfa15dd50926397e0ed921873e54066d11cf78b91387e6badbe24b98b6b0c0a18f9813da417d436b1173768aa3bb81102533760c1f6e439792d927847c990fc36c68fb336bf4c8c7392c770d4de5850ac1aa55432b9f3b52225906ed330d6dfcf839eb2741437f56392ea5e8b93a44ced06c4c96dde3383b08399aa17391f86172f0389a2f43d7dd6e1d7e4c227b214397277ff0a99214751e436f39f8581edbd7579e189a9d907711cf79bbb530f4df31c764ed12a53ac0d06977d4ac1cbc5c7ca10f3a0e959e1a7c6285b8f0429b3a7a9544d3f18f232ebad0f745c80ef2422e34a5297dbadfc37afc16dac99572f8778ec2b7e2420b4d0ccb323fee9172fee0220b9dc59c63c9593116da20d7b36715bbc212dc2422b6c4a48b55b96b79f8dd1459a1d3088b931d4ec7dda30acd6b7c0e7fe2a142db261973a6f8d296680a7da821a7641e75889e890b29b41d44c81c0716acfae5283431e7c07205d7183c8a5068f3c7ece9a0544206ff09ed7a08123adee9483c8a042e9cd0bacc54b77967fb894de872d64849b3a5eea05b03174c683f73868c768921f2161863022ee06209edec4888a9628e650771a184ae735bcc26abbc1e950d2e92d064a69e484745d0900be38b08cc9881062e90f07b869564efca36461924e0e2085c18a11377d3eb28fa2c66cc282e8a60443009125b56d32df898c926cba1e538174468527e881ce3e370318456d6fa4a3bf2c997a3846048b4c7b7ba77474811526668900dd3d8513008cd5896d198290c84254f8790422cfb8326c418a5d7c1c86492f8a039cf1851d9f093638f8b1ef463e65125794955708bc0050f9a78fa9df42f5b56292b0b5ceca0b510fd63032e74d06952f9ec9a23447f3f074986d81a27a3848362b632635e23a8acb7c418c5722e339fdc3f1737e82ac59d2fc9221b8378c240c104980b1bf45bda7a9583b8ec129713b8a841bfdee3711c9368840ef7820b1a7461279a570c7e6a96d345190fb89841a7313eaa14547c5b7a2e64d07958d1617967871d87b888417329535c4bd2d18517b88041e3611de3fccce38bf12bba50fdd0436732bbc9ae68c72d5386f8d48ab55c4244258247f83cbd1f937285ac683df677301d3b3de5dc8c19336690010207e3205f90c04dd08513b658451729ce9fc7b971f24b55b41324069db82a1e4a886d918ad637bb589689faae1ea86855323e0eeb2986278f53b41ec68e8ff90abd92638a26c412f96d8dce1df2a5e82a2c24a66c1e11534f8a3677c8fe0c9ef3e78a1945fb5229b24fd688a24f4d16225fa8f09933a1683b3f23cc5ac741e41450f41e247aec749c67ae7fa20df11292c3989e68226ae5b6076e1653ae139dc7241f8f858c137d9c14772eb2ade5a336d1fc07a3bf95d5b1624d74154372fce41e4c4712175b64a2f970619571c1e3a4cf5b60a2b594535293d05ea28bdc1e7ba85d96f1c508be804011b6b044931fc7af973acc1861b821c3aa025b54a277d71c558ea550a25d8b1ede33ab63f0a8056c31893effc6ea47c88f808c2f0e165b48a2cb943c94675ccdc145cd4941cf98b14524ba4826bd993437f59684852d20d1f44771f6b367b56e8e2fcae82d1e516564c99512633213a92e939365ab88394cd90f6ce1883696e7efe4479ba5ef8516292cb66844d7ff95fe51698e929e046cc1885e73e5609d5e79e3c759446bee1def9b47119d68862ad99ed9709e44f41a39c8f164b6e4bc31886822e26b8ece3944e7ff563142c50dd17cde10c345f74234111d84cc1b6ae15198107df410b16ecd6761f1201a5f8b20bd513d52cf0aa20dcf9123e71c88de8394b12c47471e4a40b4e153f01069f5c8b2fd431bc137a65645b585a41ffaefc8ca8b11d287d6a3071f9a6899a3f8e71ffc7eeca197b594838d7061e2e1167a38232c5a82cbac4584ec1ab352f37394f7bb451eba52935c71a73dccb9c143d71f9e4a2a7b873ef72b876e9e07ddd40e877df36024e46c8b3a3493f7fc37594607363e7eb79843a7dedd617cfd0e9dd52de440ac8e70e565b26532413cb4a065f94253e535b688439fe251a69d434747d11670685742ccf994ff0d6dec9d4e5e39e786c6a3858bd937d5852ddad074c624536b990f1eb9051bdacd3826bab93ff5838cb0c51aba548d50a92ffff9e78c600b35f4392ea6fc8da96d918646432fe696cc57d0a0a1edec61a54ee919dacb3a162a74984b4e33f4c15cf4d59094a1f5143d3d98c9d0c67ff195eed2b8dd18da12cfe8ed6187181a09df610ea984a131f349ef1cc6670e0443ef2aa9439969d209cf17baae0e9ea5d2f142d79271ca3ae8380e7e179a385a923de6423b2e7a955956762b5be8aca3f77fdeb4d0c5109e7b739985366f4cfdc974c4a4c4422391c9523fe4afd046ca731a916243eade0a8d07151d87aa7d15fae01f967d7e36f443852e6af40ccfbd9025660a5db6bacc6624ebd4a5d0c4fca15fcc1185e623f6e3e81ff8e40a05552c254fe872f690425be3f3049dd04e48c53f89f6e86113fa1caa634217436e768be17bbf324b68bec2c3aec7a184d6df75e3bca624a1f78ceb91249c24910b127a491e85d35096237496e6ab7f39844ead18a14d613263468addcc4a11bab4cc3166549c601d44e83c72d18991433e9787d0e4d1e411bf91e56421b421d1d783de8e2da94168a39f4c274dd7a44920b46e69d1f5ff4193b96246d6d7e82bfaa08f674d5ddfa273df83d6e3c30ba93992871d0ffa203ab28759f31db41956b93deed001d98347e6ab9d1c349121235b3538e8243d484f19bf4153b9355cfc7c7f8d6dd055de309d0bae31d51a349165e4429f3468fc93ea89ec6a5e67d085e7ffb8cce5838fc8a08f0e36c69847ff25e2181862f428f5b9050c3af9582be4149e4288bfa26bf9690bef9d63905dd16908562986755bb1ee25e9a05d2d2bdaed8eddda320459cf2aba9cd4c3582146e5aaa8a233ef0d1762aca96883ba48f2fc593a0c2a2a7aede061081f876ce1e929da0e3ecc7dbd4953b49393f1f2648b8fdb2c455ffd319676c790725092a28f190fe37488acba194593ca5a62a6228a3e304f5db1ccbbc33c145d4e7e1e7c9ca942b4a068cddfa307dd9692a39fe8a2a323c98957412de2893e4c12c233c7924e349ddb51251f9c771ce5478fef17249be84c53900f5dd1447f6126cc64ce44df1ec648f4ab9c4c31d1c797e3f15bf2124da58cde418e11398c58a22b8b29eae7f78f8855a2cdd4965fcc23c9c194e83cc55bc7f6a958164ec2cce894fade91c41da5b3753a26126d0a6b5176344874de2ee2e24164dee8239af81e269739e7284b4758512ab9ff7cd788e6326818d17ef2689f0c5ff1f24574b13c96b5bc39165545f459c7c7b4744b447f19bf22f64888685db7e7ba43c8ec9c1da28fc3c91d628a9bf93c0cd19c84503e63b911390ad1476221459cd0a85d9cb04dd40c09d4d044bb121fd4a233fce45623134dcc5491c1428889fe62e64dc22b87fc9d4b505111d63d24d2e53492789ca7af9a9a2b4bb496752b475ccce341a322ad44b39d247e0e3b23460c5551a28dd39f4366d49844f31e1629f2516388312fb45270bc18a38624da701e85ff7924a767196474c13522d1a78e544127119c4382ab306a40a22f150dda5a9e23da015c400b3f1538e60b302c3063c6fb19c38b1a8f68e473cab58e880423f862c60c31be9831230c31c8084117c403351cd14ccced8fc9fd734c914634391583fff6c5b3ec1e324e6b30a26b8f42920afb9695c75c44ef92f139be188386f55e689522721177ed88ee08a6153b07965fad2562944186094ca2a04622fa58637f8e8ea310c6224434932d4bf3c76124c0812e3a50e310fde720227d3da61c3ef203350cd1679887612768f430627c6156a31035a38b1a84283288ce427514fb22c1a22441b4212edde3df51cd4c0944dfb2b9b22da91e203ad9cf1cab8669f587262a84d8044e1813f0431fc6ec71181de7d63ef4c944f2f54721e5fc9e5386392448c109030335f8d06b85a62496e13d5c650f5de7e461476d215cd4d043172722776e88a229df3cf439b1ca83abb8f8a8bd400d3cf49ae3368f5a35e5e36bdca1af0cf97d3a9e7668f3a655b67c130c375f8ce10da851872e848ab2da15ae4187a6e273a4882ec95f2c736852aa30e91e1916f372e8f2bc8558fe6b7c1cc7a19d8bb7b48810aaaf630c31bab8e2426b8cb312a801874e3497a708dada1bfaf1ca1bb365e8863e3d4ad69be12ae88f5f1c647cb16de843d5e9fcfdea38581c12a8e00227a8c186b6d5dfb727768c71ae54b02a18a30c32be00c11963b1a8b1862e728cdc815bfa78ca7b0d3574113acc62c307a7a1394bc991db927277fb020d7d1ceb257dc9e9ce397f71863664cf8ed62329f53a33b46b123ce7585a3ee71cb30c7d8e7c18faea29c4ebc8d04cfec8857ea6f4d70b4550630c7dd47164de117693ae19821a62e8e727cf4352f2107d30c410a310306a84a149091f997e1a9bf3370118670c12e8d6004393323df2735170c2c87a408d2f743929f84ac830f1438f17653805d08b329c04a882320c6b7821e9f8d4e8f430bd28c32930638617653809ac46179a92eeb0fc389ea9dce142d37158de32294948c71c831a5b683d6ed54b79f92f1d5f95811a5a204785747a8749ec0e1d3b88bdfb9d118c2146162318438c43c728830435b2d0cfc9acb85b120f9d030b9de59cd692345f08e9d5b842fbe167cc4791eda08615dad02107ab942c556822277ad095e32ed3920ff2955353682fe530c6ea9895821d25662e2b12663f78183db6f0fed588423fe7796e394228f4df7ffa71e0639d73fc099d58d27cfdf93aa14939ec5e74ca3f51bc1a4de8e7a427abafc845e960427b1d37d7e3093d95923596d059ec652bad2c73b9d750427be63e394a981ecba91a4968a2e61c7f90e3188db94442eba1c7b52d68dccc498d23b4a512c334e7e04f623542932de4c0377a90e203ad4611fac0cce320870813d7825da84184a6b53f0e1e650d9183b2c610da301eae64ea901a42e0cb4b364d3626e462d4a4ad7724be5e23087dacbe21a2e7a15103087d4758a69c72c4dc8bd4f841177be5a76a1e749c1417d4f0416f31e7f0711c873ad12b1aa8d18326524a29fb8a575427f8e279d0b59888598839f40b911d3479193d8e3b879831fea8801a3ae8acb5babca3779cb7fe88c01c2f4c1da0460efa97ce103a87189329eec20a013570d0c5987bdba7e3f042ebc518411727f8e235896100498d1bf49e33e4e88670123d27b6c58c196470a0860d5897c932cdacb67c2d6ed651f270dc628c8302312050a3064f5eb42aabd04a0d1a7469d5fbdaf1bee50e6bcca07dcb59ae12353564d067c6a6103289bc6e480d6ac4a0f5958af929c67828af9231860936c83865a8e00141a80183fe554cfd7472102e04f9159869e49462ae1474572021598ac9b424b398f378637fb8fae1d26945cdb00fd06005e617e3356ff6e862154df010931b2e55342d9d931fe4f1ca3e53d17a386b49b2ffa86867b5e28e75d0ca9a9ea20d1db327da79fafa32451fa5b89cca41a4aa2096a28d91eeacf33f0d52f41ef5f587f230ee5f6414edce699c102cacb542a2e873a4e38e7a726028fa30a49c7312cd609283a20dd61ac2c7fa31c7fe137d309b67f27253537e3dd165f99c28c13c59a0d1897e623ca71034ed82137d98a398a2c904ed1c4e3671989f7eb91a249a20a453acace32542965cd1f17bd2426fcae1c633d1e6f8653be69166cc5081930013ad46650fd233e6f5642ed1c5f550b3bf45cf0e9a25fa0dd1bb9a2d6235b7342ad1efc967cb7192b52dbe30d0a04413f9b543aa87b7dc6904480c3426d17998e3419eff3424d14694c76747ba2922a511095b4248e99911d11919e1fcaf54727621d164979cfb51d64b924fe31148c311cde97e141eaf97bb4e341ad1c7f987acec940623faf7bc39548b571d4cc80b2dd23416d15fdc19d5f79d046474f1619cbd2d6828a29ff0881e62be89e8f26e45680ef3a494e28868a2a4d0ea703356b0ce00b2a8c0000ed18a6699a4e13d06cbe186e8d5d5df633d4e44d86814a20f7bd64388463e54f0ce6a10c746ac96f530590db30a8f3e9f7353105dab455089cb1e926e8168336e795b860b99e9bc8006205a4fd93d74d4f148a56e0334fed05c4aedbdb8d471c6a04006fc709ce30939a6e6c873822fca300ee8432f9e5f5d3774f8d087b5aacab1bc44f5e0c3f6d0a6b02c9e83d0d1431f66ff353c59fc60df3cb4279692d139c5cf2978b023424a6db1d2ac70edb2a811aae330436ff40e7d75ec1dbb849a7b920634ecd076c8d376491119abb716d0a843fbc1e9e479ac1e5a6cca021a7468b6e378bc7942630ebdec57a5ae86201e87d390435339b74e87e415621987befd224c0e2347030ecde8cc871c8efe78ec69bca1ebcfeb38639a9ebd83861b7aff9c13abf420c5cccaf82205dd86debca31ccb8f65bea794061bfac941c4f030923f25b9862ee79f3889b21e58af862672acdebc93a7a19dca3ea142a40e3ccf6820c442cce2552ba52245348751a3433fcc9fa18f4f63e67ca41ffe3ad20c4d5a79676e4497790f2fb454e0609c2708a051862e75bea499c3fd9d49bd503e2718c3041b840134c8d0cc4731a7526bc8ebe163e8d5a4474c3f500c8d793cdd153b6278ca85a19f958ca81e8480a14b219faf855416ca6234bed0b55694cc1a294b8aaf1a8186171aab94ff41a33bb38721814617b610c272b8d0a6981ca7ce9763e728660b4aa5b49696ba8be7d496e85042c866a98523648f1fa4948359e8e3883fe529b246961c0bedec5e0ed9b7fa3ce8aea069d04d71d541acd087be9377c2a7860aa92ab41dad8314298f87217b2af419f2e57b5290f880c6143ae9ca294fcb850fd52c1a5220bc749046147a55f954c13333776cd18042ef139729abe70b136b25c0812e4a40e309cde84f188f7288d93fae40c3094d88978c31b62be374b20a349ad078d81caa4a2b6088210605864083094de9f768b05066c1b41933c848028d25b4bbad1fc45eff281da884e3534ea4324224729849a3e473fb49e8bb227c7aee0e21a10bf359653acc8fbedb113a9f95ffb3d41aa18f994943a308fdcf44f74df2d7595f22b43e7eb953e9440af9131a43e86310f176b11ca42184d63b3ecdb09b6373402308bdf8678a399d41559260d0004219e54247d5ae9b0e68fca08fa37b7b902da3684a9e40c3078dc4ed30787c12df3212e0401763d0e8415b39de439c077371f1328e0596060ffa31d11c8ebbb883e63d65fc7520131a3a68639ea89f43a3b9a5470efa9839211f390e3293904ddad224c485c5a9ae786051835845e3068d8e88648787d0b041737e151f3f7f6c1768d4a0cf2db9d271c4e2a9478306fd6ed23897b3874d39a331837ec6a247d8d8ce3c7d18dec509c304639040047e4880c6050d192c1f59450f271a1a313847e6e16701346080879db35264c82b1afd0fbce2e58aed7e990017aee8237fdef2ce5ffff1080317ad68a72f75c8d639aabac0052bda1c4faa77f0e72a72e9904b17d772d592aa88adde41b7aae8a3f2f8e7c3f1308e5952d1947b76d49927756872810adea4ba5266a2c746d66c8f7390a1e2074143f414edc59dff08ebf8ddf31be0c2145df418eb96a38e530d29459363f88b152e9262b7886032d96522d77f23ea6ae5b3f8289a8f538a9fca038cb9a834ee6422a3e15030168705e360140347b707e31308002844240b4502815018869228fc140003642c1c2e383014201c181416188b04c240100c06040301e1200c068442817040182c8dc3b41e0d78bd0b74d210351b537ed4ef738f22d158fe569b435324415db28bca1caf088f9b9e24c61accc9474d01047755d27ff9fecc3daa277354eb7d174e7f6078319f6ceffeb4da352abf7c0abb3104701b7414f3dd049f55230c55c28a22f445bb7f4689ca9cf65adc0f96399a72920f5d42f754044f5f2c3e0590ab9baa5d166e9469d335049a08e35ddb5f042b88660efe72aadb87907e72958749a5f42f22be4b019135f7894b9dba40c0c00134650488a2858d13a04527b3925caac3e3877d0a3c3e85c61c8fecbdce8fd605fae56a70247242e6c441503a98a33e295d45afc6cc0b918c06a633980ee00d7c9f6ad1af100f82d47687d83b5407e3daa6b6ad85c321a7de10e0487aa9b2acca73092f2765b7ba4d13c40d3e36b874dd07a1c771e3c0a4c880734c06bcebce4d8f2a6358fe0537d57c1b0bca051b68a1a10d467f1684e7524e169fbd8210cd81ca5e83049dc41b5b5214dd2dfef16b223a8fade5c54ccafc48847526a7886fafac7f08ad9cbf4f0c4794e934bda01dbe39abe8a455fee381993be0b62cc0900b02758e7e75bc25e56609d45d848e4a24f963b814d96a93d5ff4ad1eec24d455a5f160a71922b5a4017210e809868c4da3473d780f37ebc847cb569fa659ce862bd88df41f29f8acced19c5607ed08cc5a7da259b36176a24afcf8461221c906d25bf62a7f7cc38476b56456db2009aafc5c353a17fbf7119aab3aae73ffd6cec4c7790e1da154aa840dc42bdfaad4224253ac422fb6b0adeae11403bea7cb69905444ce5f6865902f8f4d17d689d5e6d425417bc8f065109d933791b2db186fcc435cd452898abd1cfab06fc5b952e7377b735da569750787c20a06a956563c0f8d9be36ab97841866f278011cdb18b440f280f0e4a7352b32a369e5949d468676e1874a41362d6329f2417c21278b7de68231ebd93606b3decbd1f1f415ae48bd6e67dd177f6b4aaef37d4d111d44bac9bff8a07ace510d82401c218951e5db7de5d58316202809a3bb594ddd9d9081b79ec6848b7638cdf3a96e2989e39d58eb997129eebbd3f4956a90e099504f1ebc8208c7ea2c1139ec5a6fa90490e6d995686b60f25f7b4d1c3d4ae3f9a3998dd98ec36187eb7dd91ed3560039f91241e5aa7f4bba784cda6971a608c54cb79e92c560fde10b1621aac423057c38d49b5557da235e4569d3a88c56802012b2ed923295f800dc9692f114f6ca68aba51316a4fb022283fe3ef3ff628bdc7db9b45754039c971728dedc7c912a2fe9846f61a030e7b157f08884f53fbc2614695006d69295d58732d6e184cb76588016eb5f6320b32645356419a1052730395db6481f5a9f33456a6104ffaf029821bf0ae61591dea04d161d1b46c3f33424816e5de12a0cc8bd498bc84c835b749f1dabe2626007e6285825c3130c9a4a53176fba6691cd95b5d56c9262e7c162af37b40304c00106a0710617f25db78c2ba080d8ca1d23dd7ac1aecf735e76e6b925b7c806f9be8b5aa5d94871331964741c82d730f750722a9a29b264b4d9fa8ff1945aa9874087d6086ae5d7127a8b59824be5a771c5255fb4840d4bafa0883bd854f58f2b1dfc9ee282aab8a0328b1852e5a72027a1231df1b5f84c6bffa2867497cced4fd14967a68da3075bc792acd624a1e2912a5c1bedbd3e1971c37adac889737c4183f9854d09b9c6a2c93ef9dfa7c3428953a25c4e96b35dc1c1ec7f750bd5db36d66dc259e4093848dc6a864fb6d58df6edcc19ff6374981a8b0fbe924fcea1483c9049c335045522c4d8930727a7fae95eae0e09e5057ef99f3614949ac28d1ec8250178f8adcaf38990439c7d95456b70bc44dde93817fc37081c851a5029140daa0929f208b489e944d72d806c3ec09df8b43a7ec5f49a4ce6cc86f746ab8c017fe6d750a59702a0cfda04275b8d98a18ae56c27ed7bcdbd8604d966775e048fae4c95b27c4be12a7cb79292f6549c1bda79c699e97a5eca33848b3fe74d5072c2d20fe0c4418b8fde536d39ba528fec4ac48c6cba61c9c9d2d11e47147ac6b16f968b8f7233033d5ee535dbac927a71fbf13619a7e61f8d3d59e703699e3568e64f67696cd2da06392e7539cb439b0e672bf4ce9c0f85e5de6fb091abe36cd33cf2e6c201d8ba39ac34c3cb618e4abc56b9d76200f67f2c8fa39c3133a77d47e5e8d0e60f0949f68b54aab5dbb52a909c0658001e69275bdbd2a95bcb689d3e639bc0320c9d41cc855d45f8014fd28e64a7a4c2190ef928be7ccceb3344a090fbc30039fc648078d9a582385c9aa21d3be03ecf7fc70530215c7c91b615e0bc384a1486ecf51c136debfd61679a2142e77bc21ec8bac5279a9de178812532bff8ee0118a530a853f907a64ac383e4b822926c982505a6559a31fb4364e8d501b5c713b9a4879b455677231018a4217475f15934f251555298badf3814d6e6e1866f72abadc50db23c717497193a31c80102bd3be4195433557eaf476a87f12ab4daba30411940da53bc1833f53d5f43bcdd77dd0bbef57d4fafdb72d63d65120c2c0fcb1b2cafde8318b0d7171584cb96c9bd5547cac87f705c47c8c672b03cf03a47c9a524b5325c192074a49c99f9fe8746812d6e87452e55faec08213693326edfd70673d55659d2257c1cde397ec49847dde1c74825020054008fdd535cc679fc64cd08b86c868d71320356d09d01bf5a671bd589334782671f2701f7b46c7418a714e5ebe7981d508fb66c1d49c7fa6f6a374a9c1b6854111bffc64b5177357a6eb6d5aa1794c5534345d8fd99eb9124cf362db1cc48ebd86647933289f31cd57f3e26437d32e0dfb3704940a21bd1bd5d181d44fbb676a10281983c2fd345fcd36ad56066152992c42d084fca752927d7f0888f140535382b161d0e1702ed6337457d6c9057611ca022e9a112edfdddee9c48a897739f1bc83af19007a69104595cbb9e1950f6bc5cc31cc057e23ae6b0753d5ef6ec19f3d581bc3c412e68289e338c3b28c88ec65a1eeae85655517dcb5239b2a29d44c4a3add644cac87626e9ad46270f6191bccf48549108b70aa62b92644854a52cc1e707660ecffb1eb635dbe46a9d20d9538257b7a7d38719dbfef551fb70769b1a97fd094d3bccc7a54f051ae0d9ad1853a0f42f68544a66a8219f3bc6343ba42784013da430776bda2b151c697fcd13536350226d874aaff1889e813a973604f455ea890fc3c12abfcda72812d582e3255f27f8d8a3cbd1f1d358c3703bf1921cb21eb5254a19f2f683dbdce0d7a789e163513d94fce3c7fea3588f1bdde306a3dd94c6fd6208766fcc64e44aa21da9d06f4327d8c0bd14191484357a8b46476a2ef8364f0ceb650afd48239f86f2b1f3a5878452ae0446023c117a57c1393828ce39c103ff008b74b34791bf557662d4d5a22947897ce7a0521e354c3479c805ae334b006ee49e75995f70a10812c0048e71c02c3498575948bec41be5a01deeaa7865a749f141151bdde24b63c56b83e5650eacf8124059e99c6b3707e74401c1e425bf02330070bf19b10b6b25079cebd1a640ff0b705b84a154f23e2c5344672136e856e9a13cd6025f21691bd9e679baa987d0db1836f3ac32b3c72347d73b70830c1d598f8f283b0cf38b78ccb62b539d06b1332b7919eaff07b1b38fe682c6a8e7dfad4c270c298443eddf1f3ba1ff8c7c904f5355b24452c186523dd2e6fa88cb522842a12da56eecc459a9a88a4cd959eb75b7ca729c0c59afe0957e41b1a18aaea9d1a401b1bfc4c05e4b03a109c0db2a65369cec2d66e6b47a99f6e615b38065171e8308f13b1c626f130c8254b4d233b167cf94af23fe169c718c4bc8cadd7691af2fca4367d93330b40021a7bd63a4aed16d4da8c0dd55ab9d6ca7f07a11e433245544e649e9c6c81bebe6c6e92537bc206b1e62538dfab68d217224e95fda90f48fcd663d54b2e43bb72d97566f0f13a666d4ccb094ec586cc616cd62bb5680e857accdb425ce46c0a5c0efdc583698be7227e6de8cd3b643b70396e867a1437775eba0c93e23388873b8a6632bf0eefb6fabcd8d34c241d92c75c49921237ed3d7b206085383584182296695d7aa9023480c74160a92114cb5200734b1024ee56f51023358ec806d33be203fe666f6cb36318d00e5050377471dc432bbe1f6215d93878425ad522b6e58a5560846bf33603abf227378cbaa4454826811f3ff2cb823e5dcf5c1d6b82fe2f29643f6b6e929aaf2a92371b92958e999956b0bbb4a9aa7a1d2f2948d2b52f17f4bbfa598bc0489900fdd81ec25412ef6eedf6f9d6d49ebd614c8140375bc770e8161b31cc1ae0cb19421a1f4f6956bd9b66af2ecd322e64cdbd44e9beab804b772e6941232db695b5bd28e48350a327cc02293c412716189a6a103f20787197d17fad4e6e7764711db16de544e71324f92fc2b9971f6e044f3e9ee8259c8e09b3143c723b8ce06e753af8b18473ad65bf02d263564e1be4ce81293027b8456e7990dc75de2ac279250504facd3b63823850462f0609e0dd164cc098ed36fc8b5892dc61160051acb98fde56440303d9036f28fde99f37757286672cf0a32e6b62867178ce2fbde8f3ed1ad57c6eda0d35746a39d2aed6476ecd8912775ee92331636ec2eb93166c32c4c57819cce35cc041d36f3f094682641d9054063b1e3d50cd52092d74a8bc95bdf91453aa54cdccff625281e15e8624edc8bcdf46f6ca4b38ff90876f46d137b09f5c9431fee71c28eaf595adcfca7e3847cb077f7a89cf7a37d28095a11f6b03d105756b7d26c54ae6ffa7b8175405893b4b4da60cb5c3349fcd58d9e8ac8984cd33ddbc488976d232da6b8ee443758e0118a4f6dffa7af9465e42a3aa15f14b35b5d23534e7986fb6073e16fa693661d696cfaafc2281b833e3e5c929cd95c7e22a66b173e10fdd045494f1a3a92dd2ca29f601c8a1f53dbd1bc86d058c17d35d23a24615612128f137ff7572cd2b33c87bc244034264036372ce419f3f50588a363fcc104ab353be2676cb7604e6cb2f93018490b9e1309a1ce0b408aa46ad48b0abe5f68b5cc8d8c66e738d4ae684dabcc5fec4d76a3c2c9cfda840c060b7b1134ef3d13ed78781fad634a627777c9084c5f49422d40a79321a178f6607b21700bcd560ab654ab30d3029f8dd349b2913cb3c6df5801d14faf32e09238a3dc1ded03ef8d2e7fc5212fd1e7f4119d996f9b7ce64d14464275a46ea36ba8dfd89efa54c33c67fa335ed2928aba007e28c223f8ccdfa003c22e963b64838ac894388c3fb04aa000d17d1f4214c7c7605ec72f7323e5e676343d673d6077a7d2556e9e1047e670b4111ab27e30e6cd6b5f593dc1d50b205ef5d8eb515264166cc41b778cf07efda114fc0ecf61e26a40a981a906f9b37510c75803f109f0245ca9a68a1e0768770e2e7bdb9506b6ecad958db5e6d4cea5e2f58dc05cd352b0652beb48f9b9edcc97634d2aa7bdde6cb94971c7769b5224351760734fdb72c3d61562774a5891815f00d5e129d7844b2fca9a0633e476f670a4ecc728344e26500359f07fead39ece8b41d9c15f58e2c101baf8fa21ae5c253dcd98e885b194243a79b33d7f108024aadec27f8c49fa379de36b05186b81fbb929f7c1b86cf4a918e276cf352b443dfde664e891a27eff4a687087fcea3b23654dda029991dc2650f860e02cc0561118b08faebdd24d5755ce96edc3ed98645eb7d9a07ebcef683c022287ed94aa97f2b19624119cbf3d0dea52d1392c193a80f350eeda8cb3a8e52c2f3b0ae22f0a2733f3f586877e0787b6a292363704726886cc8609b4cc7e02bf73c32eeb56debf1552579d75f8392f45159b67d39e9083b11d98ae31574a91b5c5a086e6b154d1e1fba479550609a8a91ec0a89966527baecb406d9a2de6a9c2ee90a769834c58c424a9db7eef88584376f97cbc490d77b27b9166df0d410ac43b3d7cca304ac3a443b915ca2b474833254304cb5a4564f5d50742b23063eace4463bb3acc16b8cda01122dfaf36e20a64bef2b9a6f7e2e17bee945e361a80d440d7399d769c0bac231c6086760e5ce66bbf7602cc74b237fe4eab12d642084f179302708fa9b20a0a8345c1f7795cbb5e3a7d638c7e1aa4aa03064665e32bddaaca5684065692be6c379f3392836c4ae63dca74cbe38f39e7230ce9b2ab3b31e5017a0cfe9be5045ed16d9ac9225e23b5fadb01ec5260783444c2722e0b253a845e61b26fe2390cad437a381cf4452c9844e2af0eadd7312b1ee6cde1db0d8249a727d53a7dd4831833145672d9a998a1eaf3093252d1f2b8bc28fd27a15cd8ab167a30b81b869e9c266846bfa04136d72fcb03d8e93004092fef78223d088777684d5816b7f4649fac8813728340fcf8e009c65182905cdbd28de4551dae7d1ab403d82cfb21596cf18b467ff7f428f43e24bfc3e4ff0da15b1c923923e3b947d86c35f0a2e75f80d0b4d59466bd3bbb0e69cbf11cf0c7468bb26b092a068cef99378a9b62542b8ba9dca24c2416822a2d86ff3f8203055b64c6dd24ced5cc515c7e4c73e8b0da26176ef1bdf0cd2529d5b15fa012869fa5d39338ad3988a33005f8382e1e990e06d9007993f8f45174a60535311f195704060b5d934e4157734bac7c858d575625f1bb2619449dacd095961e035c141cb28fbd26391ba5bfe2728c41ff07768023160cf5306164aed18a6a10b293783ed31772177935e1e03e8597ab219feb0a5d59838f255cda5acfa538015ada9d4cad23d059504297c0ebf3695c87b4620e4318b486cf50094524dd23e24422e1f0bf2b7f10d62163b78d69d978ce35e5ad022c71a57d03746e3f20ab8257ee1348b4087b7c93e347361030f967f8fd51a6974c34624a470037e2c8be8ea5625b122354856e507cff009d304bffa55282cc1cc6e74a8bacf27bc52a50843a0f74263fbe9976a3cac068a68a4b5bbdabf3cc7ef84e677e4bf7ef616ccd3e21b48987c90a853cc5e0b1d34a6f9221c602dd7ded3d99956a4a3395fe0b1dbfc86395a6a9d5767200a9545bf1b35b8bb2d94136e7db4c6912e04bd9d4d81b4148a03dcc4de20b5594845b25e0cbb4c4d4db6728c2911b2ef94c729f87c0833a5cb8e482048a78243955cdd1cd466ef077925288c5783c00a800331338c3498176f5e5ab93062174b7ac5bbb4054eaa934d9152b734158395a260514caf8860c29ea75eef9487fb00b724e0e6387b9b370e710591a854eb25b2bf1bd726b545260c253416365ce2e58a8ea7032ed1113adfd88d2f9dda8a71a2d091a2a4bc11d65ca748ec4119ca59e38ddda1524488a43db78d64efa718b16132fc2da28d3da7ffd62566ef2b4f0b92cde304c2e40fd01671c3c497f2eeb04ce3ab0558da3686728131c9a0499994023376414635d53a014a7798bc6b5434c523d269929f6c08dd80c1de115d57242429945cfb7689c8b7a70167e0c454c11c368c6dc2dc0663ee4349d13052f30454ca0350a9d19951a93163665a1ee242283872cd119d5fccdc5a0259db16fd598534138185c9f821c83855c07485d7ab33a9cae10abc2f0c5ecf3c46f6f90ee2149f4c8a16a0b60e6e336354b3f54ae6dea1e8d33078b0f9a543ae4426e06c465ab828dc620ef590a604e32b5deb39cafa5cc7dd9754bd6292597a455fbc0bc3e02af487cb0e984012c2b58e0a07e348858006c039080a9f5fee35ad3d4ecae8da7ad96deef58356f49605d0aab7bc3be318851990d03c7595f9b3d1370fedd47e80580be449175c47e8989eeb75c39fccdb159245dd25425737d54653421e16891900ad7a773214f8bd21a031155457667a9dc9de421f397b7cf2f072143fd20c9a2bc8ef3bb449011b088d868d826475a96581539f624d2ce8bb351050cce6452695f3abb225428cff6905bc2856ebe288ba93b86c6c5bdafd016765b6566172345f0ce9647beb7eb864b80179594e8e2dd7598b34af6897e79c09b57ab6915cb15b3535339ba708142d28d43e1ab48086974c297f30a9577f5f4231b0435d80b186301fe1bb7de382cfcc89f1e990e40f15bb27ed9d38964120584a15115b621dfcb66bae261af5efdc6db091865f8064affe5360b2011cb74bbbfbcf82bf135f930464dfcf3fa323840c768c31719617cd7c42b43dfa19032acba251871c402a6078dacb5267316b9005238f7bf6f731834ea731e3be98d6f8cf178345df2f9f0b436f4c9a27d5df001f251abfbd881d059cf9f1a10bc87de8c3cb800467581fa551912c57642c3ca093cbdc8c77958260d62d18d8868a1b4c24eb5cdb31abacae295e1ab1f6dc84965e0118e7bfbd10a1fed1b9bbe53fd5e1998bb4644b93258e1b5ad8291be1959cbad804ad555a7683fac475fefae9fd497e8157a049d7c3aefcad09928921aa21541544c4a3c6a31a6b0da4b3d754fdbb6fea9c7a42bbe32f4922cffa0d413adfb86f66dcd6fdded9581c271c8c4c665fdd7d7138a27d5db59cda933d1f1a615a54d98ba115649552b842d8d3919564fad9eef8587a4f78ab7aa6b28c3ea460a410bea193fa5f96554b14d075665cc6615fb69a539ef01c2cfbdda66eaddf4c475de3a4e55062e959ad2a93286e1a00bb8fe9581770cb15d696ef3e3c7c1d0e4dbea3c36e251b62e486683ca62129e4baad5176b5e8776b85d3e1aa63417d978493b4c5716e36b01941c4d5d7928c15e3743207475d5156a18d659ab8ba5207d00c27168ecd65b241d4fa69435457bd8f4660048d33e97b6a17fc7560e672489f778939ab4b161a58ecb83118354f6674874979b7961889ebe414cd3c8d4f332f16dfa69f694079863aba7963902017708c3405cd6e0f96d3d2586389d1ef0b00016b36cb5ccb59a3096a7bb03d04dcba2fbcbf707a6176ecdf4ef687a50deaacf64881ac51cf4c239b6d31cdb169983d7ae022bbf31ff570f939484cecc99dd7c1b99e1442d571b97476913c51d702c5a27760f890af3b2e32f417686fad72d53d761044a647451d1ab1f16ab305dd4d07175c2a121daa4c8a00954fc80a6108c3d0be39054074ac824abb36d007d916068961f34bd14884f93018a195626b8bd25cc42d442000e8c111b5a8e21a61f0660817a907d9ee6f361882c4c282104b3bcd565fcfb54ce4e28e05eea6a6205b09fe3c42b1f7a2b08ff0d307c78957991d3e4ebb59eaa102601b56613a25d82bfc1b5166bca2ae479aad30d4e7ba36414298d038ba4a9ba7725a3541faa65b0021cdc599769743ed6276d222169ff7bb36a8ae260c59b191474ab54a09bb97d52a600e6bd334b6cfcbd191de7e836ababcdb0b93044026c46b429d286696933eeef895a1bb319c5a6e836eadab86a239d8d1d3636b3d1d94659b6999b4786750261d3a4cd7c3697d8ec869b6926049472646da47d7317ce6d363bb8d912cedc763356a36875ca72232de2ccc09cbb23f9401e89a08910a60d0d6e175a84e0a4ea710ed0b9d1d2095e8103b6bcd044cc62d15e883b28a2ad1b567a69abda372e9ebacd89fc43c783ecb6d8305332b8c900ca99fd7b15ee648b58a023bbff1d7a8be6ccfa07336d57a97d5a8d484b204645ee9e90bfd8210de14b7028680330ab1058b886c59e5ed37a0f205ae94c3037e61184df3ad38aad6cd51a7eef86cd9de0ba4e4d5dc70a244d2ca1c1d7d837e4505904f2037e0a8c32e0a8fbc8db9bc01fbfc284670f66f56f56f833d76727b63fcda3ef9dfb3dfaf2bd091f6da7b9fbd983ef9be66f7cccbdcf7e597026fc36ddf38f775fb63fcda3edfa3414d0574485e8b10ae57340b40fa1cbdc230d135871373603d6ef3d79e08cb7d144e56204ac0a562fb41a5dabf83ec6176f7cdb7e56db0b84224a90170275db7a1f4adf8f5cc52c76892ef222b586e2cc6b656f846d57c8ad903cce21ab2a0908e7dadf37e62deaca42925749e7a792fdf7a1cd3dd5c194599c919b39ef8ea8e3f94f6d236118bb711594ae132cd4305655218cfbc2028134127771ceb1690b7b971f82066371269e454643a3725fa4c5d4f5104541b6074ac7511c606c6c1a9f8c81edf212789865493bce959164a29cea9ce02eb1ff131230d11ed15e050d6c14edeb7f835eb6fefccec08676686be7b55f72ff3d001cf470548aadf1673e074622a7f3959fab0560552b26d71a75a81ab7fd4d5d1bc9d96b8e3145d0d2d028fd3518506df4c7da59f3a510718638c4a9ac08920d01ee59283a924244350b233834710c6c7348b0a27ee7d769d87cfb5a4ea2e160ec853905a107872a7d6ee8fc173f15a10dad96edc9fb74c426225f91fa5ea9c8d1c91b1c9a6dc21e331787b6da16f81047a5b3daa1a97e38382cbec5cc7276d6a3e9c14dceacc7a4f528b8dec31d0c97de63ba581969e2d33d218df41a79c17c95711991863447534ca8843254aac327cad89e351e4cd585dc0c8e5f812f7f57c203c2c9843381074dc7eacf8f7d130ea6be209e84b8c097bdeb150f1300cd9e06831312090a9eaf5e086f326fdbbc1997ce5e80220f8cf7defbed11f6eebc2f9e1b2f3d8fa837d51bb3ef3327999a70e6033d7409f4fd191a5a8072ff0e3e24a727f4f63e67561002b787ae40751e01df44c3bde144042ed43ac8d0e981ddf719beb089d0edf57833d09cd3fe940d6380388cb11d1e7a70abe9fef0103bc08ee1ecfc1658a5f984d9c3b6df080895b213dd0be47b2ebc3d3c379c1aee11ce1e7041ee0d8bc25d509def00e03ce225e9700151741c5812261c70817f52f9d0f3f05cef3171ecd20a866d40487d13188de9eacc423910e76f37e08156debd235e2537ee728da39eec8c3f38a460133f7457ad98424b8c38e461c9b5500306f414a5e5468215cf5a2fcc572a462eea569ece3fc0208d2466c674c0bdb866f64ef54dcbf23bb8ee1275709c703605e0a22ffedfb31825cc7ec6cd518621aa0c2636cb0ea3322f03c03f55a895b05c709399ec8b35b19853eadb284db57aa0b8cc1063a803830d0aac13808577cae5002506c205d7083121d342826645a91dd2d54e6048fc7d912c497ea042592fb7e41ed3f04114a3b3308bcfb5d0de7ded44ac786fd885581a0eb1c9589b5038105ccecbd9f31b187333487e2d8341905fc1ff1e8b2ce5332d796a22b4528a001c9e33c43640004cdee1032837be475508592520b190de6b46c53e13029924488285cc1a745bc80c836310f2ed802592792117c540b1ae3608719816999d59ae0c55ea13fc6e0515c3a47d4c245fbab76499e366ef181c31e8ea58a899d19f6ed346770013c97484ffb4cbf0069b613bf1f9078af7078b63bbe9d747c6167dfc7c7b6ba8b9eba3c80887673e1e7c5236ea3e61944d2a5e5b2d6989cdd810ac074387b0a7e91984effd6c9564ba791256ff01c5a8ec9ee75dc55a97c9c3b9191af36ce73c66039c11726c789a78defda2ad8ed75f6b08f6b3b7de49cd7f2f7c823ce15027a34f721523c2b6806a1751bef48b96c0f3519a99c1dfdd262815055f261603915b2392769cc0195672f809a3d7269ab7ab7048011556aa6b2da5120725ac90f407ec89b716deeb8685dcadb4fb13bedbfad0a4036509bf42fbbe9a298fb5d0126aa15943d891450305b1b9dfcf8f6ccec1560c8cdf520a5227bf3bc0cc8dbb1207e851e32bbde46d0e7cf138524f589493229cb2a31e2969bb281d80f7b79e27585200f4de33ceeb43ba1a60a24d5974fa7d9df5186850d509364de24d3269b5910444a8d0c86f4b844cf9143c9c6bc228a3c62fd864cffcb145b23ae3d21d7a30fe83130021b7a0cf62010bc3f5558b0720847ef91158766dc329da63a882c5e4767249cc4735b452af44a6263a28f66fabc813e74709f0be1aeeb5ad04ecf329fa65ae2ba75b6c682483e390addb6040501ee8f6453d06c0e7651c11321ac89db8964b0783431deec718026f91994ff067c12a12a712893dc9e1182262a94d7ec461bf472cac1f4132ea31a5cce04afcb0e0e98228d49ba6dc50d17854f09376ca0d201397179874e4ac76ab8dc40bb6536cbac72f08fdcfe52d716215e84ba1fcdd646e9c24536d5930f37e366f23769f8109bfb141323269608bcc1ada038776fb57a2e7791d64903ddfbaf2f91044c2874dc8250575ebb969ad1d78a2c45b1925464fe8ab163f149acd98583d22c199210b9f57297d9bdcd084048e0695534b9277692d314dc23b1d14acac7c8e002a7d506c994bf04cfce23c4a47a2fdb58adf15c2b655ffbb1c2e29f9a0b607635082c5346b86335314440eca9e73bb88a64707836d045a97be7c2ea59d36b5e219a0eed9c3f828036d4fcf39685f1cc9a68aff5a11ef6517d19056b2d6f3e1f24af8f09e5080dc9994393824e87ec993d2a692330c342b4353ccd8358de05a8b592b8ff92bc5c294431fe5b08f8366601d40a6edb594124f58b8bf6ca8fd83afc84a3c4621c8e7aa620afde143ccfdb21a40d21d7a95495a544eafba27c88a2ebfa961d0dfc4d3027b01850083b83c5153dbe893a33ad1d41cc495e40c744d5b5279aa3e000c30cadce9ccae16ce7b5edcf49c411713cd86b99c225254f4c70ac66bc23b3e6f257a157d9ec21ac73ba4dccff63b2b43a4b98602f22183746651ba977115954d422b9ce6e6402b603f486b22f21cc84e71d6ffb58264f7f0e0d49c92e129b655313cb5ad20bcc9c6fd4c5f08b5b436205555ea2203d9edff42522f0efac8571215321527b1307ba0b4a01d963548040bae9a3ebc092d89b73cc08a0874b7baf5b4d4e654a3d8cba81839ecc1083038241f01796decac2412c570229d8f17b2c2b00d4a36f1000eb073e8d5c244cae1eb040bb061edd3990926d871a0711187589d29c51a8e157bb7ba51e9a9a0a959dd6bf25eac98834e2aaa7075bf72996815978f71a70d1eb7a5fbda9b06fd480980866946978c46fdadf33cf645b2f70cc8ee6313a6fb81c0e9799a9ee3792b4198718632fe0046726c7be89687affbc9b1eda59a5ebeee33c7969758ead98ee03e4a4d4ece75657e938ccd90fd8531d005a7cdebc67c720f2f396d5e57f3d17b7ac969f13a9aefdfd30b4e8bd7d17c7dcf5e72dabccee5d37b3dc839e01d97f43ff01d4e80378faa3daad7905d2cebd3d4238a1b7a3742d4cfd6152b5b3652ea0b5ef96c8d44faa87a8f5e5b8b6e1ba28e5e436f149531809c2e2367569e5f6aa74a46096377402d1fb00134b416705323d6f93454a11eda891c3faad0f53728a5d1eb394c09d16a1cbda89dee8d1ac65c1b9aad3ccf31626df442e7014c04ca98eb4f57aa30ae46287af4765170818d7e462fe6cf11687268f4f2232a9663af5715c2965befcbbfa71d692730289a7b87ca73a3b515514600e7ed62637315175f3c4014160f7364d49f81f76d8b250a7496d3527c945af3c7f42b03072dad8d6f1396acb8ff60da5224eae76c1947ced1a36478cc95bddb7fb0bcc7c1036432850bd8aa04bd8a6c53f134f499224025d4c732d10c0fa81302f49f025eb0c4f70b3970b0160a073ccff33ccff33ccff33ccff3bc0fbdb1fccd22d62cedbd48bb827e7b9807db467f999999999337ce05c9da40c95af4244772acce350c6a0b150cdd57caa979c5f5502534e6e9765f3482aceea39e7b3c961841d2df7cabebe50a5e2c82d8b1294aeb5bbd4fb318bc5004b1eb87dfe3a94b3e89321241defcfea164b6f1c1aa8708e2fb78fbf34bb8c74533787108c2a6ece31f7e6de69c694390fd3f8c9968f2452148962e5d7cd9eb7b7a268082178420e4670f6b2ed78b4110a6366732ce65ed8f7e21089265ca3016b2e28a596ed4702c4e0772e078bbb20e04395cd6b6dbe669198be90520c85f7ef2d1a3c7e0118e7cf107d27877ed77d009bf4ba61fc8fde9efe2a4886ba6601b5ef4819c52d8f4de715b0101ac105c8e1a33b2d081f5820fe4e197f8ef6c4a96079b177b20f565cd3de53af7fad103a13659128fe5e9aeda3c90b2ff73e6f17c361fe75fe081187c7896dbcf6394dd5edc81983d648e96c67b6107f284875952ff96f8cc0b5ed4815479d4b3119fc9d3ae17742055928d9b4a7a1a5b364e088e8d195b38162d81177320868cd3dcf374a003386cc8815896a242681eccfda0fe8015075ec4813cb8187c1c9ac5871f331d7020a5931fc694e9e8c364be811c4fcfd26492a93cb633f0c20dc4fb78e71d2c47391f6d2047ed5968aa6dd7bc94b1811fe69ca2ef176bc836eb26d336c3f2420de43ce831f7b8571d2e9305161018810274e870185554512fd240d0bdeff1020de4918f3f57fa0eeda134586720ab6f4626efd218b23303315b6f282d8fd9e2981b35666c95817c71e2326ce69fb88f0ca43c91bef41d4fe777a0860e9bc08b31106c73eee608b7d1d469311052dfa4871e378f56db301062e3db6b2a87b564d1d89aa103cfbc0003e9fe3b3c7cfc71fb7d686c7d81147dd97c50e1a256bcf002b12dacccb833b0ba401acf838a1b6592161d1a5b5c2059a6dc39e3e7d3b31a3976e016c803eb73dd3cf83cb830cab061a38604aaa8e2851602f0220bdc5797d8895dd765658d8e6d8a31f630477760f197801758205e4afd162d58e81588d3eae3a06ba93f554e8ec7b602c13bdd0f344663a57415489b27b6ae46a4b1c516784105521ebfcaedf9fea40fa5b15553209d8f2dc612adce7051871448e9fdc39cf2836aabfc468198c25d66374df31750206c6bfeb8cb72fd04f2e06437e64b591a6b305e3881d0c3c80bba737e6f311a5ba8dbe798744326105318fde4c334696cb1d58c2d708860c712f48186549d860e5602d1b3ad868f43e7035ecaf9401288e5e31e850e3eecc19a8604528b77fdc8824f638b8ac6be78710472ee185231bec56713d308e4610e2e8d2dfe1d5accd871a30884f26c39437e2f2fae1b4420ded647c59dba947b1a3376dca891238b2e3a6a608143206679fb686a663d9dc377e8d8bae28510c8e351567accdec31e58a62308a4eee10ff3d87766f27d1a5b3b70e0000271ccc7a3dfe09fb2477681173f2069e768f1ef17f798e203f2a0544ddb3d46b3e7ecd8e2dce008bce801717ad83db25befc80b1e1055c7b22dffc7af31dd411e3b56ce66aec00b1d94f2d352e0450e48b963144bed9a87df378dad1c7e6c9474c00b1c10427fbbf43bdba103078d193772e0a831230b1d2f6e40caa39b1f67eb6cbf98870d4839f6984ccfb5e6376b400cefa16f4c9a8cc5d80b1a10ae6ac63e5c9cff790881173320fcb87d30ffd2a3d8835ec8e0ba68933b4b8bf4f59431dea38f7ea32f6240f091c6bab0c091a3014e78010392fdc87ca015a51aff581068400370ecb801013ec57fc6c1a2c68e1b5ae408c28b1790452fe6f94d9ab33bc705d97d746dc5acaaba466c1eb7d799e5f66ef0d102e2c6be1f966a8c41ebf2820504efef2c9d6ece64aa172b205ae4fa65c4788e3ee8850a2813375b91682db1d3aa36f5cff6cfec6b2a0cd79c3964d8be860a42b5c6bc2cf34f51c9b76497986a6a0cfb298fe3e5d39c365390f3c0628890c94b6ab9280531de89a6bcf843062e48412c13118db9e5be51d92888da1f1aad800b51105c2f58694f950fa30a0529e74fe96555d9d3bc800b509052f9ccc9864ea93b85c616b316ece213840b971eae7b68e8e5e109426b4aeef13efec19b8f4e903acddef6e0c772177338617886d46969d96af6acc6b736418e2173d6e0e96357e04213843a8b1e79ccc448889920f47854638294ec2b66fa70f1f08197206edcd35c377d5576e1d4a18309e0c212c494a92af6766cc8a88a2a66f80c4e1d3a04d0002b2a411eaca59ffdcca10431761ea54b1fd749903d74897679dcca3d4c1244eb36fff5bbf0cb722430af6cd112c9c852ed109d6a4f3985cafe40827836de9f9ffe2f7c780d1c16502c5c3c82546a31a654d33cfacc43042e1c41caa3b8ad569a3d7b4553e0a211e4cd3862199f516902178c208baf6944e58ab1f2f8459062d7a2520eeda97f14459075da63cfeba5a4652782ce2599acc7631161cc080b9b7a181e82fc035db9176003178620a7f2ce9643962e0a414e5d4f79ecfd1282ecc31cbdb2c6c53bcb41907bf812d6e1ecdaf3b855a37fcec3e4c3391084decfeca69e0604318fa5329e87f80f042f9773af1ee40772ffb5470f838d03c7075cf48194827ad4885d3c0b177c200f35a7b2b2181e672c5b9c07545185d9e2d070b10762fc5ceae1a7b59a3fac079248a578553ebc8a2a4e0e73f240bef3d1f7069d9e8f79177820b47cb44fb6a98b3b902ff4a37df49843da8300177620cd655dfd8f2905cdde0e1c36645451850b5cd4819cb66134e4c696d88d0ec453cb18f629f479f0612ee6e006b909b7cd41c4800b396452f22632d2911da9d6d9d33b177120f765f5804353296a9be221e736ad1efb46b63c5c6f20f4b8c2cf6694f361c88ae0c20dc4cb1627ef25bba6a605828b36907c3cab610f5cb08174712a64f8564c39ff6b20be54daf794e3758aab06c2a7aa90d16f4d4d22a781946ab5715a616326b840034935f9aac6384d97f73310b5cf47e1b0611c878d1178163b823f87cd404e2d1f6a3c3a3f2d5306d247e91c3d484806f2c847fb921bc363208f72e7613ebf1e0fed478a81b0417f1c63a50a9d7b6c18c8b99af436fbd3f8c80703e93de55196a6b6d0ca17c869cc3f6c5f7fa063b9f002f35653b59da1229699faf72395f2e802492ba3cbfb3458ded02838b2202d70c105525696be30ff5d6c81e0799ca12edeaf2ddaab05626b1ec88d7b6d34709105820f2e7567fec83cea7f01e7e10ac8810b2c9022cd24338f7ce6a2efe20a84b38dfb61d3ef312e2b10ea3d561e8ff2783765ad0ac40f4df971550ab9f107150832f9694bf2534a3e0552d0cbd3d81c1d67ad14c8efa76939c618035c448158b95ed3741e050ae470df39f3603521b87802b922bd7c76ed2eddebc209a49b4d974eed7e828b26903c54ce39edd1376ab80d1823c8e1e6068e726444c10513c8b93a9b8fe2edd6f635821c8e458d4e828b2590dc639a6478cce33fd50d5c28819c1afa87b95575910442e56c793c0e1963e7e58104d249c5fbb0bd1f81b4af612ae6d11f46d98c40caf22c997197a2c44711c8b7fe791cd6651744206ba5d7e0e3417446bd0c8194dfc3f5b87c09811c73253fced4c6cac94510c8de593fae8d69e6ef5d0081e867b753e53d96d3dc0ff2aef0ba99adeaae10b56831f577d43e20591e3f1f498f56d2b32e7ad044779695a7d56689986d887d4ac61f74ca5df080ac41f62ef36d1e0fe7471659f89905c1c50e88b9f5fa43980fcbfd9d3182c78c11d8c8024f032e7440f2f4d13b73f8b20dfb18d06c756c3cb4c0611a6b022e72408c1e6f26ed1e6a8f3647632b0b2cca51a08a2ab2c0a258514515361c07e4c98c9e6feaceeb2b808b1b907de039c3e42635cc4d632b8b1a3976e8b0a13b6ed4a840076a286077dca8a145076a3cf6002e6c4098c8aaf6afeba01af7105cd480dc553ae631e6183d4a260d173420e65a4c7756da95a37ccc80947fb4f53fdaf758a979b89001597e247f96ed621103f2c8fb87f1935a01f4810b1810c75fdf629c8d298fe2f403172f20851ff576ff207501f947f95536e2b4afba16906a4dc3f64573c1027254db53938e1aaf7eac801c7ee5cbda7b537fb00b15102fff28984c6ca920a9ffb6bf8d2b0154904d7e3c216dfa831fa64e51cb6d684d596549c7766fd846f43005a1cac763e9cb152b76c44390402948793ff4094ba71b99d2d812018e2c24400aa2ee7be73cfcb5951e2b300a52d6eec62051a1b1b5c6a2208f7b5445154290402888b9fe545724ce41860a0173b6a8d100b64202a02058fee06ee3afe7a0df7d82f0d74983795ff8981a097882189235f97da9f3309b9d208fe3e54a15733a49b89c2025552fab2099e55291c02688921e62aa4566a253aa93802688a6b147ea5379202e6a2688577933b5ebed277c4b4c907e6aea5c5e6ef3b297b00e351e58e028564a0442691e96f557da14f78c60470d32184320ba5476ca194463cb683084405839cfc9e3887fa5288c20903f4ff7f833ff40200fd7caaf62fe07a4143756ccd6479196e2837cc3fd30a40f46183d20f7286dbedeccf3801cc39975cc59b397ea0e48fdf9a153c685cee7ae004307a4dcaceda37c2e9eec470e082d2bdbf39a52f8bf7140ee4cb56e0f328c1b10543f0fa7c7e965e5291836208ce7dedc8eb5f0f9ae01a9334ac5d2f2a274480352fa705b65fb0c48f17353e6f42a03306440cef9bc7a63bed03dce8901d9f3a6f3c8bf4731e6c13020e58fc3c7e3d0616e1bc27841d1aa66259535532eefe93dcadee563b7340c1790ac47e936c2b2a6bc057fd6fd2c289886b1e83fcc0a483edcf1c10f74db323054401cd7bd8b414df57c9c2ce6d04de2312a485ad1b355365bba4f4178ddf3d8694d41bcca6a2988f2da29ea8ea42005f7cd951dc2c28aa3200ff273688db7ffcd8982143a5c85b5f0f1c55c2848ad7779ec1f7b509007ff9b53666ed6b8fe13c4dcbc19cfacf704a9e5a3aeb6bcaafa4e9063f64b113d1e8c670d2748b17ff071276d3dae6c82e0223e8e8add5ba26b82acb69b926682b0f1e647dbe35c7e3526c8e3e499b91b279dbc04315575fb47d23e634b103a6594ef6ad14e5682f8bf4942b3596e8f12a4d4f519a7512fd94e82e8ee1d965259415449107dd4a5219df3862512a418e2cfda77c36a483c8ef478ad559e479063aa79e9d11c419c12f5143ee9db5b8d20769ed4609bba3d8c11c4df507539329e2e3a8b20a6eed8921e8867e72882d43fb2177c43fb4c04e12da694bec7b9f3a0072288d9bf624c313f0429eee5fd8fb28620650a7d132d72b6d1429052c3fbeaad84205f770e6a69defde32088a649f366854610c4ee6871a5a2c7fa9f0904f1fdc3378f7776d3338020e6fa7894d2e3ff40f07079d0439759bb1c3f903b050b57deeac1377d20e7819c755af48f93860f64774f1f665cf640b63cb21abf7d3deaa107527d6558edd9a6aff340b094953125998a1ae3819c63877e8db550e00e8ed7d7eba56a8747f1f260f4dc2c75c0872a1663b6aed081783b7df9c1c377eecc81a0e77ab59fe31b3b7220e5d1acdaf9f083ac7120edfd9e9e0907a28aa5aa98699d836f208bb5af9f27d928193790423e446eaeb4817017fc3ef46003613dab3d8aa7dfdd6b208f274ac407b71ac89d3a8ba4a84ea62f0d64eb610fbd7b98e37da1819432675ed2628cb51e67206ccc70e1abc79a633dcc40da9c92ffdff72803e96d5be4e577c7260339a63ec6ca34cd78c640fa57eb61ef450ca473fd6c5e973090357dfaa8723ff061050c248dd6a3f44ea173fef802f9877bf5a30e7a3f8e7b81e023b9e0030b35de7517087be52f7d3e16d1b9401efa78e8b1d4c2ef5b20d6e68e1f44a5edc65a2085d8d7adbcca038db340fcccfaf723170be4b9dc9b51c9727305d286688bd6512b9047e153ae46af02b9ea3e5534df0d1fe654208ff3e86f3ea77c0ae41fc7be39fb3ccc17722990f2dfa65bda6fb5c9a340f2ebd03b2266559143813c08f3aa97b71c32ff04a269f4a8adfc03738f13c8c3e8d41dba6902492bc5fdf1783cec916a9840d8cf35fa8353f7bd2c8114b299dc4ee6422a4a205d85f830db7ff7872781d4ef51ade28e04724bc69c97a292962390a793a875c708a48fab8a400c3965713311c8973ceb84541ee59187404cbe1b5f535208ccfd47e5a06710881d539a4cd9f9664e2090fc7f98ab876251dcfb0131e78b952653fce1a77c4048f951e5a8e9012973b6b7bd2c5f15350fc81a956d31fe0e4abd4dd5251e1d10fff2407aea1c90e237f77dccd1c7c9070ec81d2b742a7cdd47b901e952ea2daf3c181feb3620f7555dbc3bcb9fae01e135a654ce360d4895dba3fbecce80b4799c3bb60fd347561990f43e45efc480f0659aae25530006848c3fdbf0812f200f2d252b5dc8bcf85c40b67af952c94dd16e01c1d234fb6d8a1a336301c1ddd7c3dcefc69c159034e7d8de797ad942011590fac73dce988395b4950ae2f679b6b3885141e8f83ecc7339a720a67423729b82b4f1539ccbb4f953530af249d467eccffb91a46873dc655de9310a92f95c4adbc3454194ff787fb7878298e47397b8a53f1f0b0af2bb7b671e78d4abf11344954d2e99e17a8214126749f22bec7fdb09e2e6643bb6163b83b69c2066fdf84716b2dd04d9b634a5ba7d8d5bab09d269b6efcdab0f93b59920c65ea5b6668f87175a4c902dcf85d81c569dff4b90342d5be476c8f4794b90c6b7837ff0902a9d4a90ece2c476faa004b9538e8f6e7d9041f24990265a5abf435de7b1922097a60ae66139a71fab9120fec887ae966f7f2baa902059daf0f0317d04e1576a738f25bf7a903a823ce521dfb3d91a93368298f9e7a2d5725afb19412e8d5145bd2a6e8fb308b2648a41f687510459930f33e7fd9f6a8920bdc7980e9123829c21e43cf7e843902ceb77dc0bd1830a1b82f4b61a5d935c0892df0f37ff72be7c4210d22ff478b8ef204841cb66cdb6c35d2b08426d1e180872aac748a5dbf8090141e834e93132fdded91f4855c177bb528aa1991f4857196f534adc7efa401e7d8a123dec74ffc1074255080fad77ee819407fb6143a7ece15ba9876d3ef34eb6ca3c905c53cc4ad7e51af37820c7fc72cda97b323b7720ac5896f7f1610742f7f033cac7b3123dea40fc8cead9f34e0752f0f8b131ff38fec6e740f461be1f492b07d27eceedcb3c9c303d0e24db3c4a292ba6a01f3890f3a7a45be397f1f51b08579df6c3b698ce47ba817cf1623caed60672f4cc9ba62a64033178cc831f134de283700da45039e506efd540cceff1873f8cb0d44e1aee9c7fa0811445e3a5cecca2f13310f42f63c7c26c6e3310f378fc793cd4efcac0568efbf6579381a4e953748f22c35f1e03f1a7f348cd52df922a06f248e60f3425d662320ce4d018638fc36b23423090326baa62fe601d635f20c6ffd0c53efaa8cef2027950b59bb345f8c6e9ba40900a12b9ef617a3b5c20548c6f114f9e47b30562d5ef4af4285a20a5bc7c1608312b21fd55afd9030bc4a5e8710552ae39e9f0fc61eeb815083ebaaabc6e3fb48c57815ce13e26938fe976a702a9c7527b72d59bf33b0562fce99fcfa81408329fdfc3f42fc6350a84a87861b62b7ef4130a44ad187b02f1cd3325d1ca2932e8049269a55df8a0c73f621388156702d9e2e6dc1aac3de84b20b5c7cce39eade0c15302614c4337eb2410b5b3eaf7483224902a4867dff84720ddeb66cc4ad7501e231063949ececaff63db1481ac9fb42e53f4b89b07114859bd7954793c8640fc61ca703f9a08f9f11002f172cbbe473986cc2308c4caabab503a10085aebae3969ee71d27f40caf0410f57537692dc0704fb916a6cdc0382c6e9717e1f8f2fa69807c4903ecea39b7f8d3e760744cb571e43f6c5ceb77440fedcb5d43ef1756fe58094d2c7ef7ed0251b2a1c90da2e5750e906a44d96d5925d485e6f03529c7a8a3b1f2dc7d4809cbe53e9cb4f03d20597cb7ecf807c5ff6d3e59e33333220fc304b79fbb8ba8e01396965d5e89185980506c41fe9d866fd1e48f902b2766acb03ab5fc9dc05a490ec94b356dde6dd02429ce7e6b0ccf29f05041f65141fa9ab6f8e5740a82c9e59de09a8806c63e6a39e2e1f263715841f255b1f8af728cc8a0af2e85389df6499c57a0a625ef3e84e36ee999a829cb633af7827b19096821463a488d6490ae2ece9be668a317d14a44c1e2b4a7e35ce270af2f53055ec27f3e8eca1f64b7d855f040a72361fefc719f7b185f1c5274852eec34bf53944e75b83179e20ef68cc8ce9033b41981e8bd48e7b5e7082143e97c47de83219e7179b2887dcd015ed2bc60db042137e54fdd496a2e78b4cd40b4c10e7b56ea6e27123266ff93373ecf1787109427dcaa7cc6cee6fedd60b4b9047179be44c53b86df2452508d33f97ab9339361ebe83179420fd28797812e4f1b8d7dfe353baca2989b32a426a6364666ec3dc7bdc5aaac36591c0eee33e66ccbe4d5e6624734fee3284179020cb074d29371f8f207a9c6fec183dae97e9085ea37b56f3b1a588889108040d17597ae1431d0259f5a3c4928a9aa73c84409430db1e75abf7b043d420104385bbb0be1e3e27191508a4f439550fab872df71aea0f48f36a1f11e5d1ea39541f90b2fdf04367364faa41ed01e97d7c6b7b28eee001f96f347dc384ba0362ccd891fee9805cb69be1375cb0de77e0c8814ab0220764fdc16d9ee9718a9a611a5b5ae080f05ef1cc4143c70d083bf131e711d3c9060d1d3620e5cf47ff7e6c8b1a905289d6e4fd6d5acfd1d8ca8163865d0d24584103e24e6b25dfcf197d7cf119907fe8a6ffe3ad0e977d1910b52533e5b1fec8fcc3589c1c3120ce8fc7991b77233dbc686c69010332e7d24a086a98197635ac7801b162ae5a64f4b9fcb70b487f21a75152a22afb16106387ca2cf5300b0837f23dcabfdbd73ffe46c902471633ec6a58b102424f8568d0fd915a4ca1b145821d6586dd25c10a1510cb73d6d01c36d80f561b65865d2a88697c18a47b725410d655c3c96492ce8d4e4194e9389d4baa6d9b8270f71adeaa21fa07652988f661eee1ad91823cea5d97cf16fc51103ca5435ae6c14f794441cebad187394d0f7cf45090d2c36bf4a75bfc70760014a4e8b63c58ebfcb1f10992ba7778cb6fef09d26bdc5cd8ce3dbff23b41cee9a25e397e3841ca8e3ddac1e2e8d784ba09b27abee8b43ae9f49f26c8e1b76e36fd7854f1c299200f7f903f1e55e7696c69810962aef2fe1fdaa89720c7b5f9b1ff7898ae2f6b09e2051ffdbc94cbaa7ad44a103a4a56b592b5e5c18e4a09f2de85c6ec96f2c19320f4ec76ce2b4ff959469504212b4487cca1c35de50e4482dc9b2e6dc798ffd3b91d80042954cad55e59c9bef238361e415ae96d5b8f39f546fdd87004b1c7e16fc5e73659851d680439457cbc1d6225346e3ac00862f6348bcff251ab5a2c82243eb79a7cff4766db0e4534213fea91f193c6d6b99108728fc756b443a794b7d3d84204f9bb77a73dd9749404203833ec6a1c829cf1ffe350e6b1727d438b3704c14b7b287e2eeb63ae8e1a33fee42804212d340f2eff478b1b33fee42004f9b2761ebd64c8ece50f826896492acce5d9fce80b8298f179d0923e0c6a20487776d9a3253c7fd60e1004b74c3a2b1176e00f04bfb31ec57468a5cdfd40f8b4337f99abd8edfa405acb5cc952cadeb4ce0752a778799ce367a7e4e3ec213d1bed1e584a696ca91e48a9367ace15dbc30f298d2dce03c15e3e5c10956d9bf6f1405a89eef1a83ec5182dfb3b907d90d9bed38f47793f07d50e44ff1ff6b0534a9f7dd0dbd5a803c937e6d955b5a0034976e72f9cd6767320c665bb9c93520ee40a1dbae288e696fe11075268adf48f473f363d0b8d2d2de04036cdfb797db73710b3475979709bc28f7f34b6b4700379f5aec7444f237dac561b88361953ab746a6a5ab081d8c31f3583d740b4948bf0cbddc3143faf0652c658981fd525e9d340f218a23a558ee7619250d14034eb1e789ebc686a393476865d8d33103c3e0f7e28efa6b1960e339073a51897f14a65428c3210a57d70d1c3183f1e56ce0e321073a7689bb35af0cc1a1d63205bcca136774a7d315a311053ba3cccf9573df5614e1623d8c14e88110672cc7cfa71dab498af0103b1aa2ba3ca94c37c81ac978729aa079552dcce8c5c420c2f902b8d95e78169c61e7d686c7581a06af2e31ef7603636ab6685185c20b80f56c63d69ecfc285b20868bcb1b753f218616c8e3faead2e328cf1e5920b964bf778c9e7a2d87163b4e0e43420c2c103c9e79fb864a887105929955b8985bcff1b002597ef0e9f32876686ce5785481ace2af49ddf3471f73e350819c76511a73741fd50f3b392e0931a640bc1ffdc033a3f630e5181a3ba44058a98fca1fba871e8db2c34b14c8e3bef9e1a27a48479063471321061408273d1e95995cd3916d9c279037858ab18717cfcbafc14388e10462f68cff94471b1c3608004688d104f28a7d5cad8d174dd7a38e108309a4aaf09b2ed6e798d3e83b6ae8a81182ad2c28a023c7995145155554d184184b20c486f994f3d334b6b4dcd0a20155e586166f31944076fd0bddbf9ca2344fb800182e04d0002b04c0871849e03da3233ddc2cc6c6ca3a742f7bb0151e43a71d030956dbde450bbfc63802c13ab3be77d2603dee11c30804cff2ce4c21d71a218d1b6e03c6313826c0c7e0b88117a308e4b3e0b1c783174b892e061110cd72ab945a95f1e86c0864cbdc21a611d9882104526aa864d3d2ff83eff13568e8681d59e09841318290b5685bab98966de74adb95c70002795c513bfe38ed183f209484a79c4f1b6ea782183e20f43886eaacbbf9f159dc88d1036258facf3f48f9c4e001297b8c25a3f79936e5a1c36d507920c60ec851295526d5f7fdf3d125860ec871963ae7d5ca831e69686c81e058391600001562e4805ca5b9c7e6dd1eee09810e1c9087f1c7316f473862dc80e0e3ae9cf36df9da7b9723860d8829061ff444c66cd56d8e19b523460d483fd49c99b6cb19dcc331812aaaa88a4103e2874f62f16aab62258dad2d703c667ca0b88d47eb043430630031664078cd238d527567e8a8d11743060fdf7c3ccc94d5628b1103bde6bc25bd32432a5a3b6dcea9ba62c080a4a3ab55525bae9f478c179025fa624c0fdd3d06b306315c40f08a9febf2f37820f723460b8c1d2e49a6ec3d9a190331589075f7a694f4d15630c60aba142b0d2f759b62a880746e663f8a58af94b7070374a482d8e3b07831f7072a9a4c3be97431bbaef8b8c8cca9e2c71c44a7720a724e5ee39752baa5784d4112d198ee9e9349fa08a314a44edd8e14648bdbca4e1f390a82a68fe4f328d3304441fa1f6d180a529acafd1ceb4051cd67aa856e58c98df37f82d47960b1f2d0bf2bb805303c410a95ebbea870163a6600c00a303a41de6872c12c2567d80260708228b29f4e43563641cc983d7b5d3255f7a909724a1dfba2a7df5f8bc904b6d56a339559675a6ddd5ac10441dcd2be44e529c4f95bf0acb104d6e6e596a6fdc3ccea8f4bf94a94079ba632a2cb433028d145a8dc46c985bcbc5d3026419acdc31ee5c94e69312b09c2e90597c696568a004624cc3fdcd0d9d5cc29c08004416462d7df37a3758f2ac07804a143345ddeac91854b01862388f3fb29f54d55f6cb3782b03d1e071941aaf4b6f5b1c7b946dc4510ad424ae5c91586228862d923377612411ec65c1f5adc983f6d07118495ca1f0f63901991f610e68b858599d31004bfb8ed29d6ab5daa0a41b2f71f5799a567c0200439eec3da7c5af4dad00c600c8294f53eb28a2a5e00431044bd58215fe1d30a84b11afb31f7bb32fadc38585800062008659ff19f57a36fa5fc81e883bfc83a09fd40b20b97f7e55ff4d6ea03e12627d7a3fba0e32d7c20f68f773c895b9968ce1ec831ce69ee8177f440fe71e56c3af13fd84ec903d97d3c968b217d74a17ee0811c36c5d50765de72e93b10ef87c136478fed40ca513d8bab57f154ad03b9e2feb25ef80c3d1b1d4899ba5c35edc5a22b7320a486bdf06371e5402e8b293de69d712088c677dc1ffc8003f9d3a69cf77bbf81f6166d3991ebb6b834cd948f10dff83977037143e945c47eca95622980d106d24afe7fb04d11cb7936102d43e930d6409e6ffb6198f96a2077cc637f6d0d6a79cb3490d2cab603030d04b96bc9ff3c691f9530ce40ec3cd150a9c55dd3ef000c33dc2e2fed5e6135ab526b251162f5172bd93085510662f0168b397e31c5709a1d3a6664a183c0200331050fa9f941a56f77186320fdfe78fca3435ef8702a83210652aa675d1ff930f9307e8481e8517f7023e9c30003c9b2c6690b9f551ac0f802b1236f7e643f16478ea3812b607881e0797ddc692a93f66b72ec9061851630ba40ec0ee61e7ef82a1b25185ce05b6543aeddfa567da417b70ac0d802f97a64b197697e7ddce6205554e1390e0c2d10aa73c877f5f7183df2c6f9008e2b8e0430b240ba710d753dd5492c7402185820a74baf96acdb93ddaf406897f19186940ec30a4493cb23b3e868ed9a8325805105525ee51f689cb81ff68902185498023953bdb7fc732dce72ecc8a26148816049d4addd07f6f9bbc60dc0880279e03ee2431f0f28b839fced65981e4f28256554a43d355cea56f378906a220c2718b4a2f98f5c930a04184d209d5e5fffc0f330ac33603081a416efd38fe5b66d74c05802f94767f13ab8de896a0516670704aaa8a29540fc894d36a1b1b9077725819096ac879e9fcc731ab100030944f3ce58b3eef1b9657f01c6118879da62eafa0d11e0b8f1811b153002c1c24796da3a945dce6701461188ae1fb33a774e8ffa37025b1cfe2ba840cec1ddbe7cb0e3edea8d1a7cc514082beeb1c53ceb9776d80057488164bf21ce6ababa2d8710b8220ac4649dc3b257a6cc520c0a04a9e9945d3fb168f3ae7802417664248349955a2ced8a2b9c40f4d1e7b18faf6ff6b4a1853b0e1bbd80ab43a378c9095cd10482fc956bdc914a31eec518573021af5802d952f2ffd23c8a3e0cbf120865c92f5ef7baa5529240ceaa5962e5712aff0309a4778f3fcea93f0221cce23a7d78d9b1071b8118165af58731780cf91681d0a1358525bdfc9a2b1148a9753a6768ce94c7da154320a46b1eed85f78540d4fb1875f335a6953e089fef66c8b10081ac99c2d8c8c63cb6bf7f404ae11ab3edff285f5a1f10e3c25cf733ed0139fc54680acd95d7421e90562eab5e34f5683cb703627031b18a771e3ef07440f441f75d882c07a45cb1d36e4564c43820a6e5d26cd9d91537208f2e46f447379703aeb081611b77f1a19df15eae19db24376dfc60bb085c5103e2c59c7207f5e0153420fc38d773f6281bcdf10c08ff25fd5de99401217f3c28159f399d0f5e1103f2c7758c1ee64d3d735d0103f2e0df344e799e7d1e9f37ae78012ed5e73ebcdbb2c0c23e70850b4839622feace23827383b73270450b08763e4eb9ae63c470050bf48df7dda1b4a7edc1152b20c755a8f5c7596f56b70e57a8809c3e141f6cf841c7f52815c4bcf7d9037155fff14a0719a820f7f674a79ca4ac837a0a72ee4d99a65c5310c37fd039532905617da4613fbdd6874ae51c6490823cb69d96642a6f771a0559ed27e63597a220cf8fc236e865a120d68ff3f8c75579509067531efbd8e3860e1f8f4f90efff82f770b366f9da13c4f01b73cca30f3b41dc3c393941ce7934591f237fa3379b50ad4307e5204313e4d167aeebf8f1b374c904b95a62d67e1061823c7ab1ef680f12135b1c645c42bf8a4a5e59526d371cc8b0c4e67bbb5f6d3f4ec971da7e20a312841f754a890c31cf792025886df92e7f593e09b27c98da70ea1e4f6f49105735e7fceadd96a3c7e020231286a91f58dfff288dc63490010972104ddf9ffaed1fdb1b643ca2d5cf0d4bdbd60c643882b41a2b57c7bd37df6fc45639a76df05139bce8a861dc208311a4a8997f6ce17c2c82942cfd38f838df958fc7a3db204311d9de67f168cb1aaa1bc848047173d7e8f45e7ef09fd9200311e44dbdfbf431a50a1f7c088286c6451f554e88680882c56c2722972966632148bddde3a1a74e08c28d76caf4953208e254fa81485d8bf7701504f1ee534d45ef8d5f331004b3b01faa8c8ffd471d2008ff3976e1bf3f10e3c45a540cea23d1c30fe4eb8d3d4a76296b7a5c1f48a672e3a5394ec533f940f4f187961ed67cd64bfe1e4811ef19bc3fe75fe9f540facc9d6b2d9e3ecc03b1e279fc6e9bcbb71e1d7820250bab3affe37187a6b507deb103a937c7af1e9b8fc254e63bdcd481541bead95e957da9a443c9e285ca58132a6a6b31878795362307726cdcc830adc58154f17dfc69d6b963291cee74513d56c24752cd18410ebf51e36103196f20261395d0cb9e4d67bb811895b176e907fbe361d80662b0d41c2fe579a0eb292c74f805d840fcdca6a59e5573cadf6290b106524af6d96fa9a981a41fdccc32753757260db4766d5bbad1b0688e8c6531e6944723649cc11c43fbc6f09e226498a11f3fbf98d6ba73b86b20a30ce4f6a10f7e301732e41d7d18ab39cdbb061963307b324b75a81a6488811cc3a896a5d66120d8c63cb21e7d861fe6748081649fc799f3fffc02a1aed5c424ca3ceee205a2786789daf46e6f17c883f5d18e69a8ab858dc61617c8d63df0f1cc0f274f369906195b20a8b94a5fb6984d63ad059226f70b6eadfde3414c63b340121fe67ae9dfbc544663b1e08a8ff3624e63ab03391c8b83c5154841e7da6b73fa85bf5881ec5917839d0fe762f254816031e673f6999af61ca2410615085ed7b665979b0231a618e9de69bc33c89002b9e2e332f7b06266901185bcb2bb85ccc4f78002b95ca387b14e1be7e136ca03329e40aa245626bdf9e3510f7602d1fe3fe5df3cb86434816439fafea3fff178e681430613889aeec71e936dede674059241c6121e75dc5a05329470c8570b162c6dca468e1d65461638b2e014c848c223938e3a773d8ee90c194860c25be46333463ac6d849635d8ab6ce1574ddca02194720f886bd5e4b61f3038d11c8679fd793989bbb8ec5cb2802c156e7a25bcaff3e74b88e1917061944200f732e887a66ccd9c26dac5d41c61048ffb12cdbab0f194220c65f1fadfdf7c6ce1d194120f59a8f52580df25b1d8dad0fe8702c76d47800811c32f347d1fe4163eb0105193f206ddaa459f9d3b5865c860f489ab647b3c7348dad1d386ef480181f2e47dc64d4a82b2a41060f4897738ad97920e5c3cafd0e88f239666bd9dc4eebd7c1a3c173fa5cdbc901c982897ecaf97f467c1c103bc6acabf763798bfc0604d9d0a145f33aaf859b20c30604f1f138ceab8f875279928004354420a306249f1f9fbce7716840dab1303e96f219103a4c8ff74abd62ec7132204ef778fd1890b35767d7640806040b391fb551346db8d816a82f20a7e63ce841cd0fe673eb029266afa5524f8d2e1d1a5bb8855d0bc89f53a55c95630cd3380b085675d939a794b4dde22db46ac858013163c5b04e313774d0a8204305e41c5ff33045b310f3d98ee239766c7152416e8f61f231fcde67f55f0b1a3a66686dc1a8208f3ee7dbca7ea091d15310b22d5545a5c614c4fa36f9a9cab1d4fe5290efac0729887e66c187fa9d537d8d82684946a3aad4e2f228a8a220c897e641268b5b9bb20b05597be0dd31c6a8050ab27cec8c172a1f1bb7db98c19f20d665398dfe69deb1f60421327d6af270e438249861d709e28fc7913f4e1fe7edb86b718264e134b5e7eafa407d1a5b3bdc46163a666c82a47d73217ca89941bc2d5813c4d0de175f17caf34867ab106482942afd9b5898e7ce1a4c90f5d3bfe6f128a6b1d5011a658b2cb0288c052b2e4168ffb4d5bf5a82e8795c27173d2a022c72548260bfc92cfbc46cae8b12c40eb6d1620c3bb1719f04c95fc3479137a34a82f879b4a3adf9fda7deae462408d5835cd7ad6821e30512c4db14165ac47e04b952d0ecb5eecc69ab1d355c04334a0d2c70ec702b58e108f230d7edc71bdcaced87158d206ace94d57fd03715744610cc828e8f35848b206d47e51efc6d0e1b3716c7c6510431074b31b33f7a2a661241ce2e3e3ff6df3d6a0459e028882076f9c6dfdc108d3edfa87188df33466b4f591a82ec96d96131ba9aa35208b28f73b8d33c4e1382a89ec7e1a5651a043959f5c79c7627a2335608823c8eb2bda9a8d6f840907a28b1fffd4936d5aff18020e6ec26cfece3d772ff40f09863fc9f5b7e7b9b63865d8dac82157e2067ddfca144c6f24d250dd4ef032957b40e9d53cf077285f8f1a788f0b1e6bb07f27e0ed50f9f1e889f49235ecfcb033166ccf651ae643186f4c71014acc00351bc572bf8741e4d5adc815429c8747c8fec40f2816f0cbd3144f6a70ec4f9f6f1d891e384e0c64dc10a3a107a9c6276cee7f1a58c9533977fb8b4cecb813cef771bd2d3f9d91407f2e61f870fccc335cc0407f2a0ddb4071e2dde40cef1d9876f96d2963a504d0a56b881a0f2631f4d19e52f6b0339adc37b3f36a86c207eacf4169129aa8f5b03695fe37da8bd2c0a56a88194c721fab66ce637d41a33b2f01c22986157230d04d73fd9b3aea0a9353410eef2e8aafd7d67d4672056ce527964d32b1f356620e54c41e3ff682f03e9da5384c5ecc940eae1c4ede67c8e8118d7e388c5f0f162b88881e4e3689d529014350c449351df1ece060cc4a42afe66797f327bd42f10539c4e773dda1e7dac50bd401ef9e8e58165b8fb8650bb4030cbbd32a930f5f17081e43eb6b0dcb551b740f0617009f7c94790050e2bb440caa94e6fbb2d3c0be489d29c83df47dbd4c0020b448f4acd61b6de9fe51548f94527da4db57b3cfa958a9767ae0a04b96c9e7d18673cd5a402796cf367ba53d1bbc329903d588abf292ead7cf8e4702ba440de3c59af79187dc762686c4581fc31def93de7e0b0f133ec1e0ae436dbe8e6932edbd7384f2025d9ef71fe1fbcd81d38379c40aa4aeb97c7d6c367d87d13481fabca079d2f2690744abbdda7445d02d12a6de56da8eaed914a20a4c530b9513435e59f0472c6d69cb91c2a12c8b1a24755cd8dfc4e413d0259d376ca9d4aeff118d508e4f19fb6d9599ab1ec178168068c65a854cca66342f24830148bc4e2602808d12d4f00b31308000034348f0563a12cce0441ee1d148003754e2c3a361c1a161687c4216140200603026030200c0400c06040201000034221872cc3e3038252f398164567e3239f9a8407e101e0223967904d257e6c18d827133c4a92df7303ecc3738f10b58124fa438a20a7c79b3f7b4904eed9c60bb04a328895b5743f6f4f7f1177500bccc5fb0775e916d8f6ce03163531d88b2a1eff3eaa3b0f5f5f0236ff0cac80836ca7006ed53d7390bd08d77daf1145a745f799787363dcdd740897fb8b4be2b98f3963823bbf6741c968202728b86b458fee6c4902e895d68fa3139fa3547293041182f2295460d925d53579c84ca935d407da904d82473e9a7c458a03048f6d3ce0e00316c221f6904c23f084dfe367da60da4bb26c6f5ba9b630f26baa0300c62c8cb03f15663f56689ac077a20288f2fc6242165e9d330c97c32158ae0ccdd96773b0706a01181214b2054315da202fc56db598491a3fd940127d97f36c20551b3a44be9d46f08057615af26ba6b001a269074f8b428158b43dce2403b7b348c6a0876071ab382dac07e7f5333e8242178e5763bf02728841edbfc534838b70e4818ff8280cd0edc8aa9cd17395d9c039049b20413d173139ed8dff83f3e8398569bfe83c677a817a62de426481d1731cb6434843f43c3ca93821df64b3a827b20d0c0a0aad88da930a2c464f83aa5366413d213948b98d2863745c2921482b835b16d71ccb798d71357ac6c2612c276681217fab2297c5909e245e1e04c5a24c216a5e07319cf0f5e18a49791052eca4c2f5b93006f5675c72ff90abbb07409f9a36f4bc2733534620564dd725329dad9aabc5c6fce5e40ca06b99897b34b877e473bfe54d160e95062f3b23c2fcf058b293823c2afdc3740feeeca52985c54e2859d52a50649b24e4e07b1ad1f22e145571ba4c0420f2a742bebda418e5858300ccb9719a2da574335fe20dce992c27899b23a88ed903ef690b410cd368c46668e22215e5812b8b65b95c84c4c4dd18a4900b8c5db552c8e1ea392c53777aec8a3740847cf57ca9c846db1a217581942a2242c2bf48a99211f2d24a621dddcb26f1f555138df4802aa194615744c7d399e67ea8e38fe3a13e50c72539503e411d91b9dcb605d4f1ba06664026656a2f61f4b01947d22703339b982411341fa08cf6387e979b4722a7a22af96907dbf797206617244f935cc9db068641895f247e898ca3cdbca50e2a679fbb035fec37b6ec6aea37635108992c0036d707ab20e8487553d16e23ea3191e7c6115171a3d16ace562a54a39c2ae4f07a3343117e61589b2454eb2a82ef308ae2d247253e1db9f1255092ed82e0ede66810090100a423ad91ebbdcccc9a59d59da97bbbb885ccb9f4f9bcdd0fae189f223a141aa7284b21df73b1a66aec2b999008da544d544b986989857637ae528cf6554b0f7712d9839e68351bbc62cc9c7eadec959b8e296f4269a8dcb6c94f452283cfc4e678385ba76b14c9aff576b913e9c47e39af892481cb9f14722726f7bb8b65a5aea032c7188c79eb67625799376c4bbc86874c627b92a8c98159d217d5ecdc883f458961c00b5cae5ca549a22925dad2c828997fd5b14ef9afc8b839c78803232372af14da939049a743288d8aabcc66cc8ca8b876b5e2f7a8a9eefa3289e77e42e7c1f62935085f86daa381904806e13059d14ff9f7b72ac9bd686788519ca204becc3ded46447c1dd59bee1204c98a73e68ed5b754b0666655d9a2d829a0c22ab40d59aa7cae839a1146a8b4acf8113a366758f9e4a4f607ddcdf7521572b29170cd1b4d669336eda75d994928df0b3584b8210ea60b2f6a59c846e445404970212ec924ca15e00f62cf97c0f5d0c17dc927a6daa06c30712af2216efcb7e01914f3b28740c28c2507d7005161559566038781a1f916a6f8f7a26f9589011ae03066ce62db1c6f1270cbce3cf148ad4669a42cfe29953307dc0fb59317aaf5194e280a3c0ed2d2a37b5d8fc04b537e59d33d82c49a1ed21e096c999efabab3cf1609c2f0562d8bdac549c5198a97d85798da685a3f55236f7a26f1421332e5e2d6280f3f15514bacd9344d970742e49f952c68480d6682e6ed0a7461e5280ff033ba6fd4e8642243ed65143dc8469613943cf0d02a2287c6dc0501867032c89132bc13765e9221e0b9a8d609f81c11385f17849f3a2bac2daadd4841873feee50a2aa75f8468d23726bdd0e462b1511f104e84aa0cd8b2ebae632e7c15e08438cb64178782f0be8aaf227628efea8eb404b95f7e432aa10150fc0a0540cbafb05dc129c0c497f3153181e6b04c141e78ba37535608de0e33e80780c30eff616f9c9f55ac59f6688e4e6d9d6d07f0c7d223825c642f1b855b15fe0f7600f67d130b82936869f2c716660ed862d582a903b64a71f79dd42d2c8e488bf5aa50a2aba2ce3a84554ec2c69436400bedc64b5b34c38f6f5e9ca40140467c1a4b02e488e00baf768dc0e5a9845d2ec7d53114256cbc43832bb660ce2ff5e0131e50b6351708bc0cdba8bda10a44786a950b24b70202074a104a2c97166afb984561c42cbbd605697fc33443dcb34a4bae4d548095c79e05df04fbaec5b2840853b11343ab3c155ef76f4b87b30c608505e4b0d085f5d95ec115a988db645f334458aad4e5636c9f6bfc23346832500be0341537cb0cea650a538c8c1a339300dd38430179a045e01642ef53042706b17968017dce144e6113aacb3084bd5204d42765de0408a49106d4a53f0b958b95ef264efe0a3e415ca83617bd213e1831395a5078b0fa7bc1aaf5afe3ee7d4e3bb7295895d6c5d527cd4b5cd60b0871df72f870d723c5af7618c000954d42eb4961bb886b84876f9d20216c03609210dc33310a23c8a4f7f891e8ecadbd5dbc93c8f1bbc017a90402b02716ed02c778aef091b0601b816d06d98756614fa7c0842f2d42bf617f87842d6705ad9a47480c1116f1f1c636ccbbda102ca2c0e87f309855ebb7119878e24f07057698bdcc32ca0be2c908d08f1f20f0629b0186ae7621dd3dca6567e556182a5e5716855c1db03f63af4dc100fcc5253b4a614d5e9823ff3524563d4007f2aec2f727cb0b12973e62976f3f0b081faebd4bd900896b47cdd9c65e2a8a56daa103047e85348ceae61e2390e635db1d48a8701030a9809f1fd30a611a31256486f88198234cf7bb8bd4e547584424cdd8b05d4ec54d51108f1f0b18f17d66f080208153bdc00f62ced4240633e3a980b83015760250401e4a0540f931d708d3746e618616f811b005a711ee5e4bc5a35e0077b85f0c480573f23c1e634812769430c1fe8c547408d3dcfc12c30b61fa50b759aa89f02d2425b8d36e0f210d0ee33ec4f7941affb00f8149456e34a29cb08869a05b4b1b4d69090245b5ca68d65d4dbd25fc51d2b14d99d244c44168cf8ccd5c24c2f44e9f7ba84d89d0718d00d242e18636c6f91414171217a87e0f2cc7bf021b760955414189e3481033cdd41b080f140a1c47a9001083028613b73a4472fdec8b327d0ab497a05e175dfd299cf10f955a419de30ae482a7801a0e0588e1bc001b69ba90b8a813837ea64412a64420dee7711387c10a387323ef0569cb84b1bc38c53e04ed12b672c8be9a810a42d1bd3bd1cc1031ec1f1d441fbbed4086558e30114809b46b32f33902c9d893dd8df4c8847e4b103a87fa211322a19b883384aa0c9454017398ab9b59a50196840309a696261303c244c49c3c738b30f93d51387d21cb8b02828949368183413fb39e40d83327d114448dd89eee9a7afe30443acb19778e10044290514cc74c05f5cf351ba2e4a8d63be119098fc291bfc2ca29d267d43781fd0952efc4913f559e0262e7612ca2a4a333c46d32e228cb85ed7aa185f0536e6535118a03226f677463268573d12b400a8750c07a85f78f38f9f46109e49c225fc175ace1d6b2832485e7399edc15ca405d0172e8555078e23bdfa69c0a1d069582c2039c40004487e0490c828808421ac610085d8212e2341fe6c4d8e2b43a165071162e088e06962142b311255353b120b427ef203d256f0998a1a0f166ca0ae1d45a55da9e20fe5a5ca97b554c9dd20419a1fc54042c6daa5d0494ce50d0deecbf80929c64e5e274be5017021d34a91301936316d5e6224471d368d6c4849e5a4478dc1319012bdc474129c90a7ca5f5f3ea02545124170cc9f9ccb902a180bc9444842cf68e1821e16b624190167d0594b899dad34108b5c3664cc6b8243a903c3d56116d5aaf9e3c32a622cec9a0c27e57011594166a3b08a890bfd61daa824641c956281d1a81c32be80fefb17a450a3f512646207e219a39440ed5672f57ab6d7e2d54b227b026c117014be4980504e8bda40da1627850383d47e8565e84382b7abd480979fb7485cda3e97735d734ee2636200f8844d1b89802d57ab0ef46b20fba09927a0a2b28c3153750445a1a3d06c125a59fb7b0e4365610d85b273fb1138292f5b94fb86ee75213213d076b054325b7a06874536c54c7839b8760219346e2bb4c89d93adb6044d7cfdfa3385253c4b504249d6974935a51ed53f483fe3acce5bf13dd0952777093f20261b0470b84321004c9a18cfc030661045b2a439c812106662a4a646d92d631f679990824335da0610cc2471577f8240ee8dcd12355375d4393084028aca660e0d4d94c3dc28d7208d0a05affa7996f69a41d04f481cf5c81d2c327b1550153ad0dfcfa99a52d56ffc72d897ee2351009b43b73023ae81f57b481aa77538c9156d7a70291b472e0bc29c1f12cb4414e020047b05b1cdd90807102579c60d16eb4d864fc1a024489b64979743f5a3cbf1dcf9d1cf819d384fb100b55faf24723f32b51f3d23ea67c673259d7e040c3d04d1a80d0eda1f10437ccd3e1e5379abe01802a0fe096e774089bb35a8dc21953619ff336082a9526f359369388ee920fbf7acbbf85e694cb3d84ad7b1049856d7a4c8d9b1df007af4e8283a81464d590ebea639cf035efa029a2c0b4e4039916dc1374a80ec9e2cc3c91ee1dc128aefda8e4169f77eb75513f8584605d0e9023d78a45102640ac9dc7cd75a785c54cbaccbe02c8002ee3edfbf26fe58db8de4faa63ff4d07e76f71397ec445b7e4529bc2829b4ba190a967085d94160443f9f75118f78d4440b986e5a1857e8b017acf16b042e202ae62aa0580c3d688fcbb7689972c1599c67b64014284308cffc7cc0395d00ee6889d904e95bcc6cd029eaec25dd956665abf623cb368482b83ccb8483e9e1b83672b68b0d6234db88f88dc7e79baef3b0bff111b189075f1befdb3ba008fecd0495f3e5e706674ba36c705cffcf945dc8e9027f5bcc4b1394e1b40c4d2ee0cade63774d48644d774ac75e49205d11677fbd87295f5051d529f1cb99d2c21c77d2ab0cb20502919e8d1c58a7a846eb6c31eeeb39e5652ea69183d3ac27b0dc48b6b4ed24bf9c3e51d700898d0948957e39ef8417e98716fc22768824350782632bd031f85407c20ac15df5e340ce43d121d8790e9650318dab38921f0d2b64d48e316a3df63cddc7e48ba9b1a81191da597b13c8e9f0cefbec84632a72ce5d2188c3a892b57112613c6e7aa02bc7f8d3b19b854b32fcebf823051045331e6ff7c8f29754fdb6d044d573c668d863e39b840ecd5ba1c6b53bb57c09338593747280893cd2f52b36db46b9003c2d973d98517d842420462a36bd253410dacb57b07e595fbdb7340d4e7007307608f14fc01c850f45436cd507f23d972b8d58442a595554f211d3b44627f5586cc88a13b2e8b5abbbd8357f0da6d835d038a6f49c634edb2561fded2fa17b0234ec81cd4b6cb8a2a30c32be660f2e68293dca631ab943e8931fbe047f83551caaf83b776bb08714598b601dffc51931a8e2ef881ca32c7af54cccc64f4e05ddbda8d76d074caaefc50d96cceca54ae29169fc9cab753f82c94fa01832cde0d8f02356c5f76f385838cf806a99ea698f814361392293f59e4f7819e6167f71600093b2f7d2d6de04875a4136dda8e5cce2df8636029ff550370755a54e230f708d51603abf49bae940aad68b7f55313e191685e42af77cae01081b838cf498a523d2c7e24c633ecaa1801270456dba946a0e0b2f08ab9b19751ac41c623f752cc160d0d57ea91901b4b8560bb5501e8ee7e50640cd21895a1e6a9cc84164ae82ab63c08add142033b33db8bf60a75d2487f69f632a3885285b38ee394cf70b25078e03e2cc0889103dc2a8bac4545a2985900a518d71428e3912e150d1c590062bab303cd29fb67d4292d1c77e1c4eed47849525dfa00db388d6be4484b748414898b8d41083a3629602533cf917a9f61d9ba6b66ef8bec5f7ee0d472186b571dda669a2d2980dd43827a9148aab8dce7e1703e985e87b9d3e2c58e35f0d0530c4ab8518c33b65b98a428565352570aee6f726754e8b359231fc4ed598d3d50e398d35cfeca2332cbca14179c9aa3988f66b776b40e700e572a8759a7cae03abe46029d587a7119f0214f399b37356583b4a687b86d4d8a863740ee61bdd3b5090b656fa1601eaeeae8f9c4899b14974ff78c831975bdf775e226ad3f524a4671e6afbe256abd512f7b3814ab4e108541694585cf49354d8d3b7d443e0cfb767671445d82f97b2b422a18bd8dc8cd7be80ca39d56074ed39d4fd4e30387a87d6bd881487949062cb082d33519978c9220440c35d678b42a728593b11d98cb4968278dc9ac6edccbb5d66a9b6c26553d798c04a026d4a5faaf889ec70a08dde5dd65040c49896914324f59bf1e3ef5dce6722bbec0232e82796d7742665e18fd905180388b38e280d7ae4ce0186d6e191ad08742c1258b22bee7fe8f1069aa3fc8dc1de12ba5ce9c112827d56c8ab6312af27207b67a0f3ff1e9ae60f89ec0d2c278bb77d84a75301564b6403a9628ef8808562db483f8584475aae92ed8414aa31ebcdd72a8e37a04a309890dc0b9c8d046637d1ac6d723556261e6c84830616ae4d221141d988d8b05162313e14e3e89ca0a8b67317789fe5210e6990a57fcde408506c7d85090dc725eaa5d4c0d36507f90554e99842d0586cfd2913bec164d19326a35e4e94678d7ea229fa5e9776109f97254f34a0bdf414fc34a9802f6974ad96f12c63df8cc6e6f1e22b3049e2312fc56504217c7a4addc543072a2dcc1b6791228aba2609c48691dd122fe695683a512766992aafb292f99d29a7c3cff864153a9dff6bb4584e256713c8337aef7457acfb8733d589c7903de7a2fb5d1f6271303af5c28ed609da283b5b6d5b7c9183876140225f196de5500437981eeac4f0ae7b733fa57e210107f7a21cee129a86be5b6a15f6b56e4a0a40541ba90ce8d73001c5a7ac58d4c56c55e5ef60e662a7a7505ff2b998765e6463d59108df57e2d9c450a77a2a359761f0d10009c50fc0e0c16e72c9774a66c32d32148522b68f6ef82a5ca422b95365200a9b0c904e56dbbcfff2f0291572389d65ed9b27b086648c60c772a7d145007795300591c1bd0f47cb18f6aff899777496eec3dc6222ec1495b17d9b0ccd8342567eaeaf12e3886074a976c4236ff9133ffd890dc6bcbe05b1ebe98ed1a2239154dfb10713dd113e89fa8a1ffaeb1375c5543ed4bfeda537a4b8985122d1294702f5dafbd16e93eb8bb7eac6b58a705d28fc6d02cae8fa82272694ff47dbf27b78f49148aa4be12b7f3529529cc56a86581310d7eba91294e0c5a877debe35902a343a08cdc567b0bb13e5558cc0a2aca473de5766528196c91cb7b576b10dc7333b371797b2be706df37bb4c1f256cca5f9ca9a0b04cb3535498df9e2f3641a9c6c5cccaf376d7ddfb8bc006927c96eac3ba45d492c8f65a9e005619e18bdddd2d32b3730e22a8c4d41a89db898cfa688b16abac6fe2cf2c3c8562b1ce9a7bbbc577e717c11b620768edd75139a3adde6a54181d1524a1b0339fb40845f4d45a9935d614d2a7bbe0b90f27641733c333e6801cbe1729cef9ca9fb00648a1537dc6459ff2447b19cca0996142c909651ab37d79df3e032afd3410106691174e025ff0fb5e534e269a1b4fa5c2944101048362c7b31e4947d07e66ae76093219484e49f4a487f12e85d9c77082ae61f3fe590bb277acdd4705f4cc8c5911a7e824e6738436ac05a53cc0abf1a2346c350ca44ee99fc056f4a541904c85aad217712cc88edc01fe9915069c91fd67fd31183a423499f529844a80662eb12d9207eb45a46d027fa81804a432a08090cf2c02051f88d2ef4e72118a66ef6d81090d236da72817d29cddb5d6746bd4c9fa69f43fdb77f9656eeb11873052a74cf5e9548bb0e51852360b4ac89df52228e12da978962c42abc95541fe80f3cce2ee0e562245d9b0dc7e479c29dd3a5413f422e7afd10125b750240b7f0f42f8fd1b96411fec1d27db81a55143ec23153515651e57b2bc48e853f969bc276fe925725b0fcbd8291206482a8e50882ada5a84e3851da333a8da557966f97ee271027600a09c0cf7f04e5e5a0d6be5bec1f447f8023eac40a8806d048de32fbefbfd61bd8b36b67e1808a2f6e4694d7919c4633c2a6ecf717ab0e803e95d535d9fb01b77ff7758e73f47667d46ed17c466445f818af7c89df65a3b1333e43c9cb9cb6fff892261a2b0625a19b459848d532a234a811afa2608aa8353965f3eaa979da14f00c7df284839640ac958403b22e73b7c9befda25f2fb00dddde780ca46e6d7fb644a47e34fbe0291d129872c69342ecfbc8e439a369570e6e7d16a12313d1cf53ddf44249b748e89408eb134573e25584cbe1c83d84e6210efb56eb074104fab18593cd6d2a5965f41551e68f58028e3e894bf2e1f7d446060ffe05e1b0f9b533eebdcdb990ba017c195600eaf5a8fed6e5b9c7224eeca6bb1709e5384d5888e3062474e250a313620aebae3ea994a573545438c654e02fe2f10e45a882d9e102843f3bccb874af2232c4392064c3d7c04f4247f261e46e02a5d06e1d0718032dc66d9731f64be92048ee8036cef2fccc791e74ba5f5f7d947639dac1542ca285a132bfea42703d1443484a29ffc95588b2d5a9d69e06b41c18da14f30a41a3d54b62e721af55d66b8165642118e8a6f3940cfb824d704d780169ef180f09e4e41f2f4ce047e3e43dc5c0ca188a19dd15d8df3cb961257c7cf1ffd0e2e02f1dc900e6be2bb7aa00df383466f6e88aabbe754fe36c6fba0c1d8269638c8ef9d35b3420a4f1c21dea9ead37bd4cabb7047514daa79a8236bcb6a72b5f5eb53f7f3bfbbae2802d9ce42b400218977e5a131143647a98df92d55e2f1e525d2e3f69032e8a8ea5b6b5f10d828cdd714b71cde5dc9d28e057601c6d28e25b8b419dddb0a700f4b0084124e8ddeb5c817d870af94463e3ab1812eba0e9cec28338cb3a9c96656584dba68acfba5491634805a4115d8de0e78209dd030763e79f2e53eb62e015569d4f8ab502481bd1af76710063a393f304efca882523b5aa34320dca0089b4311a71b7f41c6329ab96b43260007c4e039409b98ac0a0cfaa231c40437e8e1eec202bd04a637c980e447e5cbde0aa0560da52bfff0e40e35a7e63267648eb51b46c51ce03e42190b8a7760fd40a9fa87acb89f96c346b3c01897871adee1be6c551213611c97536cd080cbd0290b2449eb0a928488af55671f476217e324ed15e0052c605dcdc2bcd8cbb5606d85e9123cf683a806c26675e8b7dbeceb6b9cf3f6e5d65467ffaacdc5c41cfb26e7194ddc895ab02c444da282de3fcc2111b0980649a141e1592f12004f43df29baaae0da25bdd80d127dc451d4b20fa829095b12980736c2abc356dd5188b514dbe7e6c0bdde52b220eeda023702cc8887d181a5543f2766358aef5f12845ba7cd644ef6c5410c111efbadfd0593fa4c6ec8116600aca7dae239a6518c64695cbc85e9333ceb65943aa10d4fa7d13a2594d19c5e7557ef68198b16774534e4fe4bf9411ba69db71c45d7139a4459dafce10a9a70acb72d97920e6fec00d8307afd91aa372ad53031bc157298505675d39ad33d4bfb6091cf97577b758db261bab3c24c01fc267117afe92c291dd36fb9318cd7b4627578866e446731885bba1714ac3c634f5c4c33d18dc33dbd9d0289767d514c9cc13b06ba59bd5c71bfc3ff825edb519e1c7250749298d876dca8b4811872ae595c32516147259a4e41767a3ab56f456027a523810e1fe2b23027d60efaef1bc2834a11e8b67dc380078506f0fb2559c017f92d05ff3af6b1cdcc6e71b2babf92a9706ebc6c533783aeba39e5067ec9a63b0e977e844749e4ac2042289ba65148ef3676c209735e61f43f98a334d655c45fc0bab60a1d306ce30210dfd530c67bac1684ce4533ea78e009411e5d59889a0dd0b0f000c5c3743ae84a6931ee0c9f3e70420a3fb92247b289815fc72e80b61b85441df801fae105ac0351dfeea1b354a0b0ae11eb8ce0e984fceeca565ea49b1182662436518d470bad36c58c8d4dcccc8983c71b004aa4ca2c60d79a3900ebc0e4e045fe297ae351068c1c6928a86005cbf7fbbacd6c13c28cf83e0fd92470770ab97a8e969bee41213f3ef58ec1af940bb89c747d160d630877ab4eaba281f763767ad41e7984d2c0cd70262f207f38d06a59d94efa14adbbb064acb0a0ef31215c2b48784cc8b14ff56a189353f8b531675399b0fac2bf20cd0116ab39a622c50bfe523d2b7ed9235786859a64b61eccc6ae64b29d3f417482898bf20dd3034a5830fe5b1890d0d3e3e36408aeaf07e3ea8b4d9e3b457f0c8cb02baaf427e052184e56800b0925fd353e85f580214b3c34f7245ab02ad0254d3c5d4419601585059b63ee4ad415a5a67bcd4fa9e359a50cd8684d9a88f7cc8f4e8fb47808cb844c795c30adf47c92e9b673783fece29d786d9463cdeed576540455bbb0273f9d5187d874a967e29f806dc4eafaadb0083f7c953b25fb604111ce09c52ec0b3086c41d2f7869fac45a11c64ab85b793cc6d40ebc2bb1560b1811bd391452b71007b302f51fb91927dce579d5d2b2be9d5a8d48867b2a97383ff1f5497560b69a4c412c4e82a4f41d1c889bb4071253a6e7af7299ad802eae73e13e7c0f07092cc1b5a02e25d87c08be4cde913d29b915e23a2b8b392320fbb3f037a6c1f5ad8f4221e19a558828232d12b64da44a2e9144a04ac101a6b56bc0fbe45ce03019d67ac06b1313042abc41c505c19213ade6399036079f75935443e6679cf48aa014c37bc58e3c20d3124efbbb07e278ff1dda74e394755577d2692acc9cbbc546094a29f2d975576cd5e9878cf66f18b3893e1d0d4e308370155c176849f61648c38cdb138fe85088793350a461ec4159414329b90a730ed2937ffd665135f7a88a293f25435f2f16a2190d2a2b05b5e4f8ae44a0025be18d4c694058fda9c1e9dca458819bc83616bf7fa43f84ab6133a56cfdca3e0016efe09533ed71ec263cfcc639a1340a24f40c2a024148f55eac9b67a6716d0307ee8fbd677f8cba43ca0d6e27d38456f148241bff58eff0d800a56afc128ac5366c8fbc12809413ac43e5953549657a1e8b7d104e692f64c2b63230e55ff21bc2f59294d137792911383710d113bd6a33b211a8fd26485a85a1d49d34442f57ea9228afe1dc6ff1aae3e64f1c791039549ceee4817fce47550dab99924b170145ff92be7539c83fa382f68a4ae08c0143f6f2d1aaf35d989a99b58b83d439c78ae8a486e2d85c3b0af38aca55fc5742a67ecc1d3138e7cf8c7b3507e4b4d91dfce24d21d40e7f52555e889d88659e4b39019eeaf770d19b6a0f690f19da7143f45360269008c05b73c83c1fa8fcf4ef17814e02f31d919a59a0f6d781e9d195bd8f6d41ca3848143989c39b4b512a67cbf1cffbed0c068837a8797f3b86dc00c95c2c8f75df490d1ad7e280685b9e05231445a2e06f2858a51a591644ca1206795de0f341b9ae470ff0be1376434a6d4a6243baedc649a848d86cef6c434471df7c044e3b16318e6bfa757fe5238231e92fe76c2f2fb0596cc477a93e1c948d81c59cb36b4e938aed67c8d0838d030151fe47aa142f1ed1f9036a71346bb5c81865fa5285d4fc02078f8c9aa55ab1cbf55222357e99e207edd4e3cfc948387f834108ce6c994b4bcf60e3fa4ded128651b9029a23c02cd7cadefecade2ab7634611ed54dad3fe37a1c73e505b58cf22a5081939e2bf89dce51095538cb868a83b5261388b4f2c25f561ead4b830489d0974e652b6fab41b1d9626bae23a8b54a9fa75f6765a3668eb2064c987a3f8622f4321b9c32e9b2ba3a779c53e1288cccbd8387f7e99bf35ddd18de7e3bc39a08ada7535c9bcb398acc2afd4772acd768ed65af86362bfc22920f4d1a0b6554587794a4b8c0db639c20ba825f2b64ee3f295cc01a260a3cc7c0b33027c57af104cc28a3347cbd9d88f64f8652eb58cbe313bb47691b36f44b89d949a7dfba146d588866f996ea16839b42fe36540682d296f11860b3fdbfc65968eaa0050f1de2e3643101367ebc81d041981734d8107b4d21fa079e5eab3ff75779fbe79a72ff683a836d67e71178b0e950328e0461190f01d630fdb910a94242b7136e5cac4153a20595dd81dd81536a1c5a3d057ec28c6fea56b1735fe4da6c21afcf6c03dade23d876bacec84cfba59c93d0c1919e265d2fdca42cb859732b2d6ecad94905b122874aef15fcadd7f2533ac9977e8533595c420201255cb48f12401df32fc23eed272091fdc238e13f11e63ef40cb6eafd274ac0e4fafb58334b11a513384f55f319a4da2b72f2357ef4231d32672ca7db26a1779f41058e7b560f395cd3b08e03af44e52420a5bd7e50bb42465b2ca61fba2be8fc41ea9f850615b8334039ba0d9943111b9c8ffc8b0757487ddeba82621fd822e744814b1d284af522d07bc4ecc1b6fc2a81f5b6186faee6b7b26614efa8d50d9abf4b0826870a6c0a0dccd04250ebe4894d0885dd016a14e3813640b224c301ffffffffffffff7ffa34a135f25b6bfd97342b9394c9eb1042c80351899a524a29c9b411deb60b38ed33dae7731e736503f007fd07f0073976e09898250cd6e45f3595942827469283cb2a61fe4b2ed2b47d96cc8f950f4a185427cd30f1499330eea9bf96bb25616ed23b7964d99349dff148183d4d58ca5b964ab18584f1ab3e6985a7cfa3d44718b4fce80e5b31cd74e808f3c81d2765115ad2524a234c4af4ca7f35298c30cd68e905cf13aad76411e67c5f9d1292c621434704629820026de34b383031117c28c24c7eb2dc7ab5854a279e088393443e29ba8fe7d78d0893268ede878ae95fba3c8439da6527c5f925bb101ac254426c096542ff2d90c247218c9f4cdcc7b4788d46c107218cff7b42dc3e5f5ac9fe63100665aa4db75269b9e42447181f823093427f6c2793321b25af0331f01108f305e9e4adf8031046d9ccbf12f19e432c33148b041f7f309ced28277b503a3f97810f3f98f72f8c85061f7d303a29933c57b056f1bd3c3c0a1fcca322162c3da5f7f0f76078d28926adc6fda187908f3c98f32fa9924fef1727938f5aef64ddeb2875d8f81a607c0b70803c3cd0a392de01868747dbf8929651253a7084e1e30ee67c275b7a8e5ef1a5cc31020f0f1d253770d420d1c2871d8cb5277e4159ba0ee67ea2f93d39cfe9d3930ee6f89979512a3707e3c5bf28b38f4d12138d1b386a74498c02830f3998635fefd88b6e1d8b1e1b3b401007a39b4a169fa0a3e8e71e0ee6cfd1267f3a99e49ee26f30c5b59ed72cb55297fb70835d99f064c287bc39b19b14ff7a545cd30cad4929d181e3a30da67a0be99ee7375f84d86052f5d6afc13cbab23399d8aa1acc49e876f4b84eb6cbb934983d47d869db4ccb958206933221fcd52c65f45f1f6730f80571177ba26433d4147c98c160954e567573721c4dce97c1b44df8caf972109b63213298ddb5b27fd410baf79d8483c918cc61a7de3194924f1ee4430c66a27a4e719486b0977747180cca42ff4ec55e8f4d4bda06c602ab52313ec06054ad9d13174f85b2ff0be62a21b7a255929594dc0b469395b23349ba8678b25d30777062856cb298ee8b5c30a7a5b2ecf2799e4c740ba6584aa830fbea430b8653a70976c1c7496eda2c18ce53ce973269fbc082d12d09afb0fdceeb64031f57e0c94d26132dc54aaf604a849ba913e3f549193eac60d2e4fbb48e9fffebe68f2a98ce4f890b0d9f0ac6ce57d9779c6c6117e2008de0630ae6ecd044277dd89c8c15811821c8418344c70e9cf1210533b9744e27e7f87978b48e46f6110573caaa8a159bb06aaaeb07148c5a27579553934e6fabfc7882297f4851719db0b93f7282b1fe936882ee4d3067929893448acc04f3a528d3a53655cdcd8f259882d0ed41acc9d54be58712cce139bdc8137e1b2460d83059818f2498e3b467f2769e90904853e61fc1a4b3274b2ada82b21c8d600a22cfde4b3db4ae2b82f13a077b920aff213b2382d94d5367ffb35b5296cee06308a6a0b29e941d132d27b711c687100c722c7c3a416882e8cf098271646ae51c9df3eb1608a62725eb18c2cc1f183e3c65898fbdcdd43e7c6054ef131572dac337a95e98edd265529e52b1ef9ac4e0854e122d9692aa27382c89b18bcaabdd82663a51ced2d53aa6cfc72b8b67fe6e0d62e8c2d41d1bd2ab64a5d928170653a1f9243d2d9e931c17a6601746e7954f1556be852956968593ce49a7494a5b98b329e5977d2ba5fd945a1874a7e81d7ef6094f9a16e69c4a3bc94961c5988559465a13439309ca529a922c4cf23d747c79e795a5c4c29cf284a66558b0303929ac56b87ad4515f61d8d27092324bc9e10aa3cac7f5ad145779f956983ee4f43f4169e2936fc40ac3a754dd72175f85513d7aeace255561ac389fa272e852617691a24dc7d250610a51ba263244f9a9e8290ce395495f42d5988eab29cc49779ccb3ab914e6b097b3e777fac7635298fb64bf7638f95198c3cb5a26c8b34e37b6288cdb3d4aa87c5ed77b098551fffa3241f5579cac4061aa72e257bc6fddd7ed136692e67f78edbc12be27cc3984260951f5e9c42427558f8e5c9013a6d839c59c8c534d765236516d5e3269c2b4a63f0895e307f95f264ce12c2d634bac56121366529eda269c6e5dd0b984e1469acfa994b584399db23c263c5dc6ab84d15fffe456987b113e250cca9de09e2bd23de74cc2202fc9dbdd4bd1bcaa8d430c4998ab35bdb37365b3120993f6d5760aae215a48984a998fb0a0ba7ea1f208d33de1dc54bc5787e51c61d2509d63c51a617673ad32df50e1c933234c5ba6e67413bd43a89563116627cceff75beed1a6e71b6228c2e8245941c8d22c11a6278c3f296d68275d767220c29cd642d3629d7cc70f61fc4c4ee641dfd907991ba227939ba0bb2146210ce7c426eaa526b667524908f33751c4bee5493aab671026cbd957b71db21c6208c2f4dd39fad91408935dec3365593ccd27e52106204cb5174d54bef6076393af3fcfa9ae4a262f691d326c1431fc60ca7227950c7542cbbf1c36488a2662f4c1e864f213efdfe4d786187c301347769e0acf244d56cf1e4ce617ab2b88a6b68f33b44a5c0f267922439cff563fd1646b889107b37fa8b05349c66788810733b9b2ea771364094bcf1dcce4317731dd29fc4f66886107833e99a4b4882e5d4e6c92861875306efda8345fe252430c3a187493723e39e756c937e98d18733085712ff79e73521f430e8d5f104d4edb61f6371ec488c3e7d7e4ac71bdee2def20061c0aaaf19ea6ae29f7be63a71cc4788371ff9da4fd6458f253224133aa5e10c30da64b5d499eb4e6478c36986bcfc9cb28c60693bacba4cc75cba40bf78d636307088e060b62acc16c9915d6d6538b1c251a396c740c35989af0f1b5279a287fe93418f5743671f19eea25666704d34953b9dd30af2c7a110ce263fe6e857e709313c1f024a593ee9c6af599fc10cc163461dbec444da542308ff4f8826090e5c4135294f67b2605046385fc5d6b27a9f041e907e654f9ed397b93101f98b45dd2a71e1fe572d40b7326fb5589ec6a52fac50b73b0d2a374126b17c67d824a4d1ed3a75312d285f973a5eef3cb240bca85e1e47eef52789727888307c185a976d6defedfb546790b9395d88da56d491142105bf461c3a2c6c70f482d0c62f103420b734aeb848b1aba924e3190591c94ed8599034416c626ff5a760cdbef0e6b2ccc7e16efc9233ae9a8720b6c80c0c26449a91c26df9a589dbdc2a42af5b409d9e4d24e7c869682b8c2a4fdcd3a3fe93497439f020f0f6d85b9f4b9ecec788bc8158415a6daf69b4b3a3b9920016415e6d8a59e684fd6f40a621a376ea840478e0d80a8c2a0d2badffdf44959eb5d01482a4cbe9f9e4c36f984bb2768415061ded2a4ca377f829cc27c227734b1b45a4ae2648aadf72b8f1069e1498d088080051198cc002985599f2c76b1c6c25b6e02420ae36f3859e4e41e85e962dce2c9a4abe0e4a0280c6a9bacf5e4bb84c2a84e1c195dbb1f942636430bc70d192537781b1e1e3c0410501846cc7e4e6521ff1b7b78207fc2dc643f158f1d8f279d38ee880088274c25c4fea710af53d1f7f02001e9c4272a37c2f15f021c374a3ee0e1a1230c07010b223051104e58b13ca77db21f860e1c358c874701d984c1da4767cb24d50c2dbc0088260c4a6bdbb47c0e62d6b5004826cc66f304995d39af0a08260cf2429bca4ece7965f497307c924dada4479630df6582e8d0619e83852a618aebbb998fa5a64e4d0983a786b7febb1345d59330a8f8ecca9d2309537abc2fedd93ca71147c2dc1e6fad73362f1e8584296e8926a9c71357531f614abac9a2ab9d3ac29445aa77cc51f755c946982fe4e2c77f927b52414698eec5c63a8a6e1106952fe81e6da1e9a75284d9e48b4a8f66224cd799d664729576f2208830ab9690f31ad3e4d49970090e1c3cc821cac310ee8e9027c693c92415c294a3e2c513abbf840a2284f962c9b020db33394c833067dd2c131d178449a9b439fd5cb14b3d81a8b28687656b6b93da2d3c3649d5439303020853ca97e1a92d6f932dfe07e39f4e5f1f762e57a709c40f06916ee9828edd07637bdd3551d5e7d3a7207c305a780abde7953d1856f53cda27e9c11ccbd45bf2501ecce46c4dfcbe54513e8e07538a7ca2853ea57348ef60ceba3ea376513ba47d46a57ff6b30ec651e7c43eb399ed9ca48349a7b727d149ee8e8573309fd41c3fcb5962343939184eadbbd3a655d5938a8379a4c685cf1dda46650207532525d79aa103f206738a93b5e4b4d9e5f080b8c14c30ddce7a1f7384655904a40d46d7d0b9beb5e2746e206c305dee797e07f5416d63878c1bdc2801c30a640de670e298699c1a0f440d6652b2d06995d60cad054983b145c87a94dd7c3747190b40d06050314b7a52bdd5a49765e8f81c7c06a3573699eb9719cc9f9df4f29f2f85d2ac0ce6ac5d2d42d52d6430dd298be1a44c0a640cbb134bd74a868e8d1d690222069377888925b5d42031903078af63eb991cc62a0a020653b75baad1dbd6a472240d4eebc8812a00f98249ef6f96fcca965e421b3b40809e0689870718205e30c9d0e426294dd66cad2c8e3ec1a31b1e501c5d633500d20573d22675cc2f2596f9ff8edf41a36d00c20583da8792a23b09a900b28504d18229ed56747a502a77873702902c18943931a47d3a2d730f160c42eacdd78b9630a15fc1204e8d52f7575bc12094bddb557b161173150c9af3c4dc6e725430585acc986765b3b0a66026fb6982b6f448c198ae63714393e2e7730212056345d7ae5239f788930908144c9aec8453d70bc8138c17aafd53d2f63b764f0e88130c5a26d29f9c63a709f197a009c6d972cbd3a74295d85e238c16848030c12446dcb8934d678909812cc1e42f6ef7e4787d273e102518cc4a75b839f33c228224c1e075a1d9bf96dc90a1e3c128751e004182e93d64788abd6ee7e11a39486ac83882418fd2237253540cc40836a9b46856865b65408a60b8f3daab4c6a7fb53c11cc494598fe709d2198ee4923dab34ad54d2118bfb3c3ed5e360866827ccdce410504c3e628391a1ea37226fa0383f44cf8ed9f1df57081f8c074dbe9dec43aa1c0053274f0d10b636cefe9fa25cf91f3c2f0c4ed8fb5ce7d36271b25af034b74e0f8d885c9458ac8588cb85dec4317e654179a19c2c711868e5c98f4652d4f2afaba8b7e86a60a3e7061f2b83619376e996c3921f0f0d0b2c2c72d4c7aeb532eed6d6126bd79fa9c47b530c9316d13f16499770f2d0cd764b3d1667d7e41b330d9d8a5265cce75d26a599893c5aad1f85c2c8c9e1f7294586161f49c3e7fd05e61509f838ab993c3a8982350c3872b8c77b1f494ecf4339f451c3bd07f000dc70ef4084bf0d10a83ad8a13ee73c40a83265f8c4a8bcf49e56bf2b10a83e78efa87c71faa307a48ef981db4497da4c2d8aa21dd7a0e7ca0c24c6ef7b8d697b68ede514306968f5318540e63af152ba63007f9f04f12e59051eca314a63bf124ad9d7639763929a43089d2d36d7175b59ad40cadfa188561feaab65be4661fa230acbbcba894217c5426a13079320b77efe9fb0085c9e2c9b373d77f7cc2fcaa9bee1e3cae92b7616304ef09d3e6e5d19379720925cfd042a897c6ef00c1617d74c26ce294b251ff99e08313a79c77150b3e3661fea4266fa24cfe5b651f9a30cfd6a69ee8642a238e1a3b68fc8e64343e32610c4bf2ce3349e7bca5820993f0949aa2779d60c9cec1dbb81b1f97303769abad3d8a74d2c74b5cc68cfd574e6a3c98b3cdcf88cfa9b9e5b983c954de10aa74697ce77630e93e49494f6983d13a8a0422753069f687fca09efb21a283e9897df37db949ad962c7330ab7cb6243f32ed3f9c72308ff9a730f349170753f6add2e4a0ab2fb3fc1c56703096dc557f2713576523f206d37c689dabbd28e286422cc9b8e75fa40d66a2bbc8afd68a0d0675a9db1b525e83416c9d3c49094f5795974488a8c1b8374ae92c31a72e935384481a4ca59bd8263e56d3bd8406833c29cc4942fb322b7b06834ea9c309e2213398a3bcdd24988b102983d9499e83125533a3c3981e1e8c10218329e685a9269354434b37920d226330d5fa5c133c9b4a58f02568101183c12c8552d154670d4d4cc60d1d32ca4044c2604e6a9f7a7410a6f35b748440040c77f01cd474ab61d010f9822594477372525e5b8978c14c6e53fa592ab63bc55d303ef93cff89b295f425225c308d7fa66578ab9e225b30eb6593a3c92928952d2f02112da4c694f4363d18225930c9b3f3e464b3b7dcde0c2d76810816cc992c5bb9b3a71e9457c042dc2b68134ed3924effc40e6e298e03075f03112b18ada4bec85c9c3e99f0a46a05225530e71125f737945ca96fa31f471831f80422543097b692729a9c9ca1952122533057e567d9273d29139182d99314274527890b3ac777e4909183c4ec718411635231108982b1669d78fda4344fda9645a06054311daaac45cd5e7a6603912718b47a4d7ece5a4c9d818813b4eb64a13b2803a1c67a1dada3051eb8928148134ceb5677ea3c452d8b9860cc6bddcede97603e7da57ea7b3124c41781e9b1162e5c43709261564797aa51ee5e92221f5ea4d70ffff08262da3c995a6f2a4c58d6038bd9b714a4487b754a40866d3fd673ace4304639db470a2323d77dc43306978c976f8931f5b158251d48868a2a717cb490d82d1f275888e2d104c39754eb272c2c64e3f30a94cd2ef3eb788f8c0749a4cd47de2a6da1364bdd894dd67bc30a918e2099f9da4ecff5d18ae820c6922d685c9e4133febad492e8a15b4cb49299b5536374b2542362dd8675d500ac1854144fc93f2a6760bc35d9021dfd90ab185a972ad9afdb5c81cbd16a6164fe1c9ad4f6861fefc1af9d1ad2e932e2d2984ccc2acffa549a2d53d7f9e4a646190a39e09e2723362613c5195b7af950d6061aaa0a6beab5a1b4de315e6ce9b1521cf5cc6b3ef0a73c86b93491d74425a610a0bcfa77295924e9e4358610eb5b467972b8bd8d32a4cf9940edf164b1506add0991c3abe62fa940a93a5080ff3fa0415066d5ad5c132f944a82760d82041fd3426760a3329e9beb0dd49a6602cc558f0b21406534efcf8c4d1fdea9d355298cf4c97127d9e4e2b360ab38e9e4e2a3a9ba34433b44ac911234414061d4c3f9e2a8fd3d29384a23c484061b64cfcd427ccf2d9ff467f46831c5782104f98d73b67a56c36338341e232b23a511e3b423861babb70a3e499df9c3b5010b20983273fcba7a255dab866688926cca42795ccfbcb65c2ef195aa53e4232610a4adbd56552a55a10820953268fe954f1b493c9a5d391a38424a95dc298963ddb2747674b7a53418825fccc7d929a1475a98449737b4d98e84fab9e12a6a0a79aec415c26934627641255e5b5dcaece089184e9635dac736c9343cb21910881048e904714ac64d53c768e48b52a7c9441c082084c6a0c218d40e40963c943d4c21b8430e2547a7a4a3f8e1661d0049fb7b0344a5dabe34388224cb1b477322df1ca75fb21241106a1a35a7e8acad9f9094184c9ce5fdf4a8e420e610ae65afe1ae214628884a7ca6af9e9420a610e69b12bcb95bc2446a5648410c22064986c5265d86e3b091984f9e48a4e79eb2308f3a85ce72935614f350f0984399ef6f9967c324908350410a6278dd68b172a64ff19f207936a7229d395e3ac4927217e289aa76c09e98399244649ef772f870e92103e98d3e9dabc89ef3bf10cd98329a91e214c78bbc77b3c3c42f460b20aadb69ce241b7290fe6273fd9ef2b45557830c8d123f66694d8adf30ec6bdfdb0735247ce9cec60eeff36b91e3d4b74ae0e2627d88c3da993f264692b74302721bf532a4bf99994399853d4f5706a9d98a344fa613a0991834943c9cba4a0d2839038144bf96a9d9389d5e443e090897a8913adad9a4c7815599b1bf5b043de600abfabcf6462763e294e83738346073c3c3c3cdc604ead22e4ff7eb8073fa40d66ed1136571d4ecfea216c30e7d80a95897aa6c4440c598341f698a79927e5a4846a84a8c1957d9f374b3ec70762012142d2600cdb7472ce41ba25b55486a0c1f033a245763a41fea83c3c72849cc1e864723839f89384c793ddfa1a5d02021a37acca0931034fbcb98f4f587f86868494e1784929d91d0a2183ca20640c9d922eaa9cd497c37a319854d4fe7a0eb92c310a83f93b6927ad9ad244d91c0c46370bca7cb352e669bf903759649b2cc23a5eb0642e4527d5a814f477d8893d83902e98730e15dcbd54d87a950b26e57fda54c772cb6a6ec174f2a7db9ff469c128a3ed4be4933b55c9b26078396d728aa3bb52a72158303a999c646e3ffc68db67683d0d121c356e9c0cb98271bef275ce79d2e5396e608558c1a4f45d7253136af1d32155308710cf349dba4593be12428520844cc13866e9ab3c93acf70e91c26e95dd2d13bde472a5b206215130a8b027a726c9d11bc20405739e7975cb333ec16c96a2dde673955525c40946279fdbfc8dcf69f216d2048313fdcbea5326a7723d9960b61fd59567434b30878fc65e3d41436dad04c3a8edb26de2eb133c179204638acc77b75af4ee0c0946d73c274527e98e603c27cc686aca68bd01132845812a0a149b1804f864293fab0420f080a323c78e120200200ca7007a05002047c99f1de846090e04642007098e564000bef00500bef8e28b007c0100057cf1c517097874c30605f6d10d1b0c58407e9123877b0c2000ada391070100d03a1add28f130c017027000024a5e868c057c0180061820a11b351201464a81801152988490f91ff4d5da3dd119ba563bac6a7c890c1b902019e8734042a3b974d82029a33098af25f53a950d1251241c748d4480915018540e9af5261eb2dd241d0e1a14a6cf162bdd767c865a3e619cad78f2fdcf2a5a269e30ba095b4b272e7aca271c742770d035d2004638811a252d279d4f6e86166ec2aca1c64b64132c13e41bd1442670d4389838c0c825920d921a8900239630cd9bd2a4cec1d29ce499a16583a446ba4ae8f81c9430e58faab74e26fa67f208dd403726611a4df65dd166abe51e124918f43a3e49558a87e52092489854d2f8ec71a4070933d1aac9379e620b32f208a30915d5a498d7763b99a165e311c90d64dc28f91c4c44e008638a92abbefa1f94c88d30882d7d32c13f8898a530c2a48267cbd3f9215984d92e93634b3c0729f22bc2284faca4a9602411a64cb2fcdd5e174f71977183c6a41061f4a042a8caa3c28a10676891cc3884398dfa5229cd42ce89867d60071ac2d41eb4c8568e92bc60a410664b425818d7905e4f0e0921cc4dd8ceafa5332ac9c0b041622e181984b954e99eac934593443348c0b841a36a041e1e3a6c9078785cee1819110402460261123b9a9eb37b76d490216369eca8512e30020853503b2154ab49c98c1c34fe6036b9365a65331a3372b40c198c3a6c90143f18455cf2fd269c3ef74e1f4c41bdd6ff99c90793dce668a9783905698eeca100237a307fe9f0bc2fe3a9f135b2c6d72838920774a3461ac0081e1030720773db79bc1c251c748d841b18b183739f732c53ba43376ad4c15ce969cac73359ad3399a1554874d88004ed9021836d4082769c0e1b242503237430098ff3149a183ac4e86668a11b35d2d570121a374347d7b81c36487494d41cde06376ad4f81a061891830d921a6900237170d43649b457d96c83113818f4ea625466da36e91a7f829137183e4ef7895935216438e206731cabe87ae9c996f536184b545bf2f01cb74b618329965fa7bbe0e14d6e32b206f38dae8fb4f4642765bc8211351ce3adf172619e944d83498ace7e2eea1e4183f1ee5326c5ec949133981976a40ce51183113218bce52c6793f289b87c640ce8d0e3229fd4253118f7f53df6e73e0cc696afeff8a9835efe80c1a4355ec109f317cc29c57ac2e587c74dbd60723231dd2b75ceb145ee85912e98f742c713b1917ea9e582419ed2955e196ec19c4fc8ce7527abf7b560d80bd2b342280be6399977ea4713f5f5c382e949d2ae2c6c648a7a57301376bbc4097fb1824954eb3bb1c5c9a3d62a18f7b4f63b399cd73da9112a98b44254905bd92ecb3a3285bdab32a99ce0c4ca66b315f3c9f132e1b45446a460bc7c167e844e14cca1cf6edecad2f775281866b4826523187982a977b54e992537261546890e1b660b47d72838bac68d38c11c4b295596ea6b4bcc4d305ef026675cceed24d5986018d9613ef4258b638e2cc19ce6e7254e332f9b4909067992e94ab9e7932a79128c659f4f3d8e96b45123c1244327ed1e3b93438716e373a49482193a4842ac0b234730b6fe887b8225a52c094b0a2346305ee7b1ef687af17cb5b2e38c14c16841bbd3b509d6e1151154d919a5452d139089134686604a67224d295d91f52a1839c0681dc7871121988957b34dd250212f7e8e04c44810cc4d329de4c6c977102340307a9eda5d751959f9532a88911f9853f4543fb969971c8df8c0bce324dd8a39533a36484a0046c7c824d20b83d22769d2558cbdcc92082f4cb2a4857661f414f37d415fb4ecd3e308238642414417a6b2b8a3acb39334e1d2f904915c98ca429d7cb77bd1c964bf440922b830e65afc97270951297d1d256210b985b9af4aed8465824eb54ea220620b93fa9cdbfbc535412dcce5c1c3892f61211f4f4c841606e59df3442d798d11733c185a61a01b1d0081d5a31be77294bcc82c8cb36d692544eb74d095708044071844646192aed5974e26c75167aa1a374a4090a34462617e82369920df09c2c230a3969f53dedbb77a85f9fabc4baed4a56be80a8326986c15a1e7259fd20ae3c53949c9ef977e78c20ad33a39f8ab3013dbd4d3924915a62608f56517ba54184f05ebfaad0b2acca1d23dbd07f5290ce741d46735495d0e2553983d5774d6c9d1eb33e1195a341eb105444a61f63461eeb1094f343549610ed50a4d7a273d0a739890f92cbbf5bb9ca701860d921c55a23098ef8a683b1df29960284c957fc3d7ff4afa45416110f65953bdcbb2fdfb09933e4fa55eb39f7f164f9834e1c2ef2d77891dbf13a6d12feddc173dc5573961164bcbedf92d62e1a32bb209530711a22c899d1910d184d1bcf7e2c856acdf990963c8a72bd1be79fb1c4c18befff209b54d27aa7d0983699c18a589a7537c690973506fb17d7426a8582b6156cf6fd761dd9ed41d2526a53e1591494c0c0bb2152e57a5f0a45c166e84874806114998ce32d9b4570a8a8461cd46a53521523d2c2290c874e377cf8310451e61f0cb12f92907a9d9d90d8838c2ec77aaa72f9fe104954823cca4dcf1dc246933627182d0f3cb96e261f409b84e49974598d355b827134d13114518c3e4ff8456279208731899baa283cea9ef66b4e0901c41041126d1912fa2a487cf27e7100627da0919c2703a9ef9a517c2206493fe74f4480883b4f439228330874e8bd541dd8dfaac88204cb25354a892539db32d120893b68aef977544fe692280309a14d7dbacf8d7a72b1c10f98369d5538e1674f89349253f18f4c927d70793b03315e59eb6f393f860ce5fd154fe51eec1f0417dcaf478e3646f570f06137621339753ba7e8802913c9889237454b701892fa8146e66c3026130168a04027118c4b0f4f200c3120000000c28134762d17838a467ba1c1f140004774e2e4c302c28220a04029148200885c280301818060302a1500042622408d2a575921f0cb07cb6f03f3f3b27a1afc3f4563941e87c201edc1fb8a20bb45b484349d10bca47c02bd14638252abbe83b3103e6a61cb3746ed0fe92ed943df2c83fe6e5e1f337b1c3eb24964a0a72641ddfa0c444ec52c2d314462e6e2005df7094567bf830c43a00f65263e46c0c5e8062c41c6b883e7c9d84283ec8aa227badb7a40630fa47f489c26e8a2961dcc1c4c6049b00b6bcb894569cad2be8714f449a6098c916373bc6e66c628bfc95370aad701ca613803d43a0ce55be1aacd1b5026c3dbc6bd12a9a689da5be71b15098afac20e84af5f560ad1b66e42c3402ef9304906710a319c8beae7f57c0495a1ea1265c1714939c5b8b32329bf0213cbcaf1834d808c082742effc46a491436439764c1a44d92bb85728aa8942f359c12bcfee33c99ce6eba22752642efc8b56fdcb5020841af12147b68e832c97418bf050ebe89536853ad2d4430025187c3a6f4883da28409151f0100fa8608b8da348419744c2aeec8d5cf1ced0b02a01304c1916f40491e2df2382253b7cf943026cfa99667bdd595523f6e12a1d4832232b9ee2ba82786817ffec4f50a0f935880d4cf890330882e33423fdec52ee4b27a550a7883ed1f5af8172d814f19fb16f2e3afb299b88d9a540ff7293d535270c0a19fe2cb2f910700a1d08f79a5ea3136f1734e1772ca8eff8353d64d46204eb96c688c12a8a79399200f1c82384891aa198eabcd5124a87f1ab517fd83d40c33785225973f16806dfa1b7e9810b260ee2050a3f4cef7efe56d987080d561d106f983465901b731138e27cd6e884564249069984819a2bd4639158c30ef4914994d13e5885e2c84d63585b072d86188e109c20ba65033b25e7cc444825561c5e0e68a72cb19a66f9c8b7fac188fec98ab54890c9403d80a7e5a3abff993fdd98283e9388b5b71dcdebcea6478b8e675d248632da408c6d7e14a6a409db9bb361d3239809c8490ecf4485413e70c174e17004b26f2b94f97b511fc07a74fd2b2a5e4a7a437d52872d0c4714e1ca6b66ecd452dd2b8e680d03b19ed60e370aa48141c3653dbead71265c14b77653163c8328659ff262a9f22aa67e6df4f643d717db979c72be2d3256d477d3259dc53118b3802caae92d892f4a11195f82f15c562cfe4f738246cd86165fdd230a0d78e8b36160d94d762cc7ace334381a63bccda31ace879c9104ea538a930b8fb3b43d48b720665e3501939d6b87ac608ae6d30ecae89c762b31687b3a60319c3b002508c31a8c87047a2171147bbc818c02e84b76ba1ce428a5e6eae10e26aeb1c25f0239ebd8c29874c4c5961d61f2006658f8e7fcad9ebcb316f466a09c609f8eaecfd945866245f26ee68bc75c7d305bdd003e0445f5e2b5fc11ec57198a9f0e643cd704ec415b0c16a02d7aa5e68b299b3eb5c076a5a735751329a9c4df71e63cb40cc59ce9b4e2d171c51fd14c6e255d1b240be08cfef9df8198a6449fe73424cd7a4f1ac1e4af1e8761ce7ad23863efa3674fd084d76b47341969dab1e9e4c7d76b5da64c1ecbfa78c7df9a128341c595aba8d0248dda3ae7562c9f0e46c879076026b64ad5c1b038df1942ee122e6fcc352249e60a04cbe5678328d47ab0222f191b2e09b88234f44bba90f249ed769c7738a227596bf51e59b0e5c22c47b606f1541af5d806f2851a454911aa548920a9e28b688e8f46123dddad6420f82ac6189ec517c299cb837f120477818589f208718f698680721c2afceadc351ca568d7757b87082da49440c274fd4bc3f9c5ce906b201ccc1f119468918a5b72686d853c16760d088737d66f17044bc9e26b45174a968884eb17933d25738cae97b57732eba6fd1930ef6ea0d9d1d406409e0d53a0037a05abb6db869e5ef066f9f52871a9f82ca1c4a08587424613be02b9a8962d0a29ad9a4181f0dad25471993ba6fb5fe1e510a65d468099984abca98ab79cdb052062d24b88af1e75e8d3d7546ef7338997ad40f1138857101c79f21e16a46d1344487ba12873b8bf59c7439f71d38c7fa958a677f581137f0f3853c96ca2f4bd884878f084c7dd1aebeac1379ed8b72dde2b272180e58d55cc6def9dd31c0dea93e13f2365e3eb28229171f1a27a4ebb8943a62415356020b0e8572323127c4e32404e92a49db1a448eaa60d55ea984129611a6739e2f293e21bc6ffaf247aa44ad5d190f4aaf4442f532e25e5a5f3edd47ea3ebdb1e66e3ce41f18a87f8d13c53873573f2a84ef2754605b28d47b665e6c16b663e46a7c270dd1ced9865a8f7c2330083b3de24618f45be6ec00eacab0432163620a6100d83e884931ababd89b527401ea2ab6901b3b89132ca5ac428cdacd3d2d0e07a35a36d39874f89d886231eaac1dc3878002a7a16a969ce089ea89a442efded310f2c72ef8704cc9ab5b5b2f4a46c33a64a4667594a25b931c04c1b145d64029afde488620435823e7a59cb10fb1715a2db6326170fab86e6ac0317e50f5c4410635bc628f4105a550d7345b1a6611a24d8dd660dc60ac270c17b864a66f12379d3b2bd3809bef624f108b2db6b208ae551daa19a64776a18ac9fc5d06f852f7566acbe406caa8cb1a1872781fb097c91307dfd514b46788f085d1a02bc8ed7edda06a195a716495653825a5d878af88526330c6ed2bf21d6e0c3dca3810139c5174bb6d8f6450218928ec102fa6cc52eb2698e49e8445b7b18ed4115f7dd9b88baee7c4565bd1ea3f314fc40a6379e3ae6eaf7849237f49b5187d88048e6741bc237cfa624a76fb521b1f7be409dc962826ba69697cb4bbb16efba367f6b8508076231c0b1a86328fd6912fc62df2c4bf330851d3e1efb8184df3c328d1551023154d805e0887e256cf8663bc841ab9f2117cff5ffd62dcb79b8025329c4dda94b3a6f589fcad295f12919e9a9ee8426315f2dd94b420ed17a58568e3704d9fc7ed73c0b96cf67d872b98796056e4a47475b000f54f11cd1d46fdf977f0ecd9df0052cb335b16d20526c6df7d104951e2507817d6b1ab10cbf99a0381b77bb023a04f648c03fcae26db6413ea6529a7536792b368e659a13d613c5547d4f3e624e53aee097206e62af4df158c1750507a26b5b99c9469f7157c6f4e52625e0dfa1a03e6efc3a0818352f0be7f31f707760df018333fe3a685aa38922182d39dc0d502a521ceb87e8ce633f73dbd75a69203459554f418190de036dd16e81b7fb0e603b8f90861262a1e96fe806328fd3ced328c0a80ece8da701b3815e7409b0ce4d76075b3fa856cf1bf94b21bab9cc0f984348d2f64dddfdc87319f03faa4909ca4415248cc1762ae59761c766235bd01a0c9e42063a804cdffc26f6c41cc62709fde2aeb630b7ce16cf6f685de7e6d182457f03ef8a48a0a5f5e854fc5b8b9c2c9d5acbf9211b08382658c4cd903f5b50bb5338602f43c809bb4c2f9324aa8ae4695bec0c8a6fc4231c795475735835ae747a83873442d6197c339f5d44907bbfed136d8755e8c87e31e9eec1c04c6e3e75389e7ca66dbcb57823e89804294cf0540d34c60eb380b67a13cbd85129722e446081b21319c2d8b8a7768227610b5a534f5fb2f2f2bc9c5cab7809e3a1800f67397cf7cf30a7667fae14d64006dbaa8f116238e60b62cd98aeacf85c2966d3cc9d967f55d3be512b61186d6abf6920474b2b77d4418c18ffe18e247e65c008366e9849d683d193fb99d27a19e15b88e27a2db44289ac9d6cfb5a5ea84a12278cbd9fe55556cb7d88bb2c6ccf5e334cd94e286e464f38c4585a52a5b4cfee914a193b2b97b1a916e625847756af47227a9fc55f2a90bc3c7a4eb07ecd9175034e2047d0a1309e7da7063ae3a9c28a252f0265c4bdaa59786d42abeb616dd4cacfd062cb9813c969c42988a93f33992438ba5d18c3ac7db00707d876be44744cc88a478e2a29222fcceacbc91ea5058de8772b0736783f3afb61670e30206e106ad12d312928dab56d385613295828786bbac0998109e28b8639517fccdc9b485cf701dcc683ec9b1c41646d62b15ea850aede50ad6ab2840e62885bdf5e1176cb564dba5f54c601fa8c22efacb843b47f896430394c74ca9013e04da7c5bac95f95cfff3c6145347961903835741d93f9aa5c147acc419bd416abc0be3a0f2fecd3ab57032ed567dc891d755d3c9e6e8ec25d2af1ce74a60167ddf0e1bea5bfd841d6b32d05483852061da4cff4b9b692f5b69b4d5944146c8e54f4a8f54e27ea87c6e1e02e2ca4294b996442570cb6a9ebe5f619ab223c417f23b34347a04acae1e071680976500cf3f401476e7d4baab01dc0abb5caedd13a8b59bbbdf287917b5e5a92356afa4a67211c378d36ffbe5e4f33dd077d1d1a925ec8441fa760b4247ea417786abd336b17c6659b2a9380c9ba7ab14d81df4410a9327091e52fac67664ddf50dda06da467e53d8dda209f68ad4ca2d8dc177659552430c420af809c90a5a76518b970361ad26f27dad8aa6bb340df1c92b384fcc5a2e5187f2920328528915b68e13dbe2d5e0858bb077847105ace93e405d367e7425c4d2e8ffcdc2738eff2dec288dcf86c1f527351c55e58dc774ea1e3e8452012572965e9428896b17270c6c1608e92f9b4edee7e793bc992a36923caba3c8a35e411bfad89d2a973636a71be7511f2895d3a518658da922d9810663920c1c7a5ccc6d529202a17f88b7740712b87ffdab9151f374fa8018e7e01e9af07b797780b329c3765aad3ed02f1963ef90aaab150286095c6fd31838aa6bbabcce54e89c66dc1d8e97012108a70d73be7dd6a80c27eb2c6daa1b1a780c0943ace62c60661a77de932068306fe5ee2005fc6af3f012812112815705492e61813079398b9944014780bd0d600b145483b166c81047e9b702338e541e3c16b8770594ac5f8d6bfa530c647a84a6caf288b280a72980ba91cc941d360083445a552ab5d25f7edbe004b10e85c66b4bea3733d7258c46d549cd66ba206b806fe421953bc5267af1538dfe3f124643fcde43b726634b04b34500487557870d36a4408d025e5b4abcb22abfdcbe5f86af40a22992ac320f9c23ac18617058cce6e29ecf1cd65c95c56f70eb21511ca6ef4500c2462799ec0e0c9c720b29209495ddb344c47c9476b7924cc4882bbce637050805d690bd2ec0fb7db0c6f58c2c800f92069f955c7b9923f567c00052afa0dce8cbf90f4e39bbc1220c817c33e22791821710511ec300308382e6951d3e33671235a46db735d71e68b592e8f79870e41da2dd0d87b751d5cb17c027a58458eabb68d98d4ff24d64cb99f5f63d36a559a7e81968155eb852c6bda8515b13d4f534ebc00c1158470ecde7358cb5b0b9db262a3f3223c8c32e9dc82c721a489263fd48b1c1894879f5005313681d0e65a41105ef05df94e107fa9dbad576b52f6e28eb32125378371722f0eef7b1dc5c28b9dd757fbc3ba34e294db8117bdf736c4b8864ab8421f334488871d248190e0f6e47681efdf7c066b454b83cd2a2dc2a974d24dcc477e417b54b48a6f3b407409c4098dbb898460db9e6128837a26b68127156952182ca763a8514cb60320756edbe281c7026d1d0e72be68a5a35b3acb72f25f74e03e06fd0f838f40c97aef57eea8e86986d7d04e00470a279c15f89d74bbd485e6af8b4a62013e91323e35df2898b49138850f84e384887775f048d5a03410a66298442514360ed06ad1d26104ecfd85bdc0ac868802f2c08aa5e945c9394607493657e499a8a2e716fed9a1cd800943078385392c8e6949a30a218e03ef7b3d8a1603a6b75dc201b81bbe9d003c48971a38414e65b389f5f6acd76ea938c10a56a2b2cdc2c9b2cddc4b2261c221d32072ad389407eafc43c8e0343874cdb84daa8a8911c4072782fabc6b8001ada9debdd44dc1934a7dd157bff8bb21d85a4112960f482872aba7bbeefcf898d8ae2ba12159e3b298c9ac6d5e3698053f8969701db4b29ee08c2fc4dc0076977d6ce49e48f9fcdaa0e470b8a249af43d1d2f5e61d8bd8d7fb5929c493f18a537e462d9f93f34bea72bea549c751c0884d31080a972c0ffd0c57610ba740194730e0a36a5b715d1ad4765e235128c57cc4a0c04cb43070c346bca829bb151d1e3a6dd70c7b5ac103231d54b23ac1f0d973aeabf23190744f350b62a97224d26b1e9f951edc592a63949b02053a51ed897503dd04b10c7ec8cf2528bbcf80acb2ca2f5f006e5ca0166bb7ae5717b6a7d33c3d15b078bc88b2f7e6fa294410ff516ea6a728340d1b683289a40e82cc2dbdaf329dac31901744d1494604ee9695dadb73d86352fc48c8ae2ef444084824f4e2e68b1091fc052230128528eadb1a9c3bb0a9be92eaf13f0ff10ac43642fdb17bb3ddffa6ff632d9378382a026ac0dc74cda2970536112d6515be2778c081658d61080e3cd6b84f3696c903e6dc32285a7fe3c7c559fb145584d6c403b77c8902f64ded87427281804a14fcf60920e852131107d1a6d05794718d22cea83f0b91ff49d880e6af1966b479785e2c7e4dc2702a75778e01990208d97df62e6e5c5ba8221660698cf6aca9121219ed3a68e97801ad37e44f64c30b080a264a2fe7be5576c689e54a13e18129257de081b1e1885030bf450fb1b11105c3ab860c38672b88376f18abf03440c61bd1e3d83c363c706d761b966ae40845879384b447ab2f5a317fbaa64f14e608027bc6a1786dc784aa58a9f5c59fc9da3463ed45ac6ddcacdbf1f999ed09924fa60bd16dc447f6a73a9b58c6105ba59bef8aa74c90a38b8961ee8c7b55b262b1b841f36e3ec9b95d3d395853a815af2b22c436c676bc3147766bbaa4dbb487cbce8dd348e263bdbafaa86eb6007c23e1c921d9f3ba14c09907bff9f15c24ed4bbbee7f077bc01c1811f067f54905e9cd4787ab4fc92046a15c92c69891dc228ca2e017fe89bdc8db39df19bb3ac73b907b622a31c35676d6cc936559771252cb3f0d866d05271018d7dd8872842699ebfedc39d73685c132847cdc1a1f0298a2d1aa7336d6047e78c72f7699b17ee970988e3699b73640949bd6d739466b6db827137fc6b6a1a1124606cb939c3bfdf1aabba3e61c5dd8fe0af6b695bcf26afafabdc8849f565015908255ae018a28b9830340e8fb5c6261caf8a966785a816c00beac345fa45106dcbde934a9eff6921a5baac46aeb4e789d8b8df27e690e699ea21e89b3ec5c2bad694907a63850628484b4ffeacc7bcb8e49abdf57d8669075370a533b2c9528698ebc5b8809c17313181daa3f9476160a0923dd89e961f44b1eca37e1960b89151d72c5c27ad27e40395438e06d3142969da9885e2db82969044a4fcaf36eb511ad67e769e9efaef4c2f1e73524dfc4f40ca69d45215feaabd3e146f1b1b9490bb82054f45c59d5559a3d5f355a737274ab859e4bd9705daefea69f16aba5b8ff6b784a35248d147a9a73aa6b2d596412f4281e33ea4cfbcb0e1756f8aba2ac0d4e38ef4054ffb2987b4af6c049006d6c56c832f0df83230a40e361e2823831d9bb62afc30fe83da048fabbbcb098d0877e7f7cee9a4e6c58fba7d0ec1207b38247fe32ec405128900790d4b21bd1324b51000fd6ba5b10f3f74977c8d41810aba367ca67126080e9a6ff57d0424694d8d15d31b5d52e071d3b9e7fe13588b68d470d9e41d4eb9e8ca102b2ae04d6713028dcca268575b9dce1a1b5a82b758b5f7b242a6c183ff95889ad3a70729ccd205527d8d6e7dc15a78ba3ffadf328805873b600982de66863fea2c818afee38eb93dc196ba858c722f05f16ee4d5a9f2c3a82c3ade4e0d90f55256c6886a8d4469b39465b290480c9dff84308d33b73462732e1a26a820c3ce4da2174d83390057cbb564bb484a7b3915f083e6228ce0bd68ac002fab150fd537c208cb6c19fc6c8b6655491f189b089d0f384f141c2489fcfd135de47f8f3a22d470b521bb41a224c49646af7be3119e1599528fe218b4c2e8aa2532269338c4ccd2c13b2c5183722169f7ff042aa391cc19469ddc1426673a4fbe0d5fb4085601209094c3590d35220327733ccc7679b98df09595669dd96baae15e76a1829086d0f4d626a8d21ffa1e4e66f9dd5457a9a8acb11c22863957185b725a7c0a0638ab4c8996f4e61d8b8138ea655f44820958845a7181325d58f920e91adfd4c496cc890e4e79a882438824d441218e863014044f4398ca0884eeb430989354cbed44d47cfeba57428440e8ee7187e767e20cd45006599a74034a60fbb7f9bb914382c88621c32de689811b06319402bc6ed910b8553f2b82e0c19e176c0b889cc0be02abe1580021c7cc8f5e06d97d67e19afd27ce9dafc5974108e6823519d477e9e40eb6fe04b1155336b4c58acf385bccae1a3b4bb9316794ead079d9921e409f6a0f03be0fd7556a324d4b5bf32ac3e36ed098c2189dc0c336e4e75b16b9cd24f1ac15e3ac189222c4f33c98929270e8f3a726a5cc90f7a441256dd8144c7cf84e404decd7b34f930bd6f1c75548cc8bc05d70c315c4d7c3010137bbcc5cb575223a5614a53106339a8eaebb3da5af3def7c8650aa1b0733adaac5908953800a177e0d1484f0ac190489f6d18dcaf0b309418f424e5946c99c038d25327b4ee55e9d102fd891759e7b47ee3139692ef744ab47e9311ef7a0173cd3cdf5647d5b9f64f74c37987f9c7bcac4734394784c6ef943357c27931bc3ffb108a2029aa8fa84cd4ead333bcf80000bce644940beccedb1e0790f9a2c9659106e9d0caecd218d85c1dae492c14d5c75f35d86a0e232b8490d5592ee55df3f06f0af4cccdc2646f7c7540e4d93e8b17eca2c9b26e78cfa3a4b353960f5713c8e591665d3e42a97eacc6e4dce9c722987b90ab4d624f7e077ba990314124c1cdc5828b8c32f222350dc2e0e5220424ad1b8df4bfda86996e6895da75e8f72a9b522a2dc78344ecae2086616931b1ba5b69b29b78ba5ec8bdee9deb3592daaf0c93073d0b55e4a8f8e4f0e474bb9d14d6c63bc148f8e048205c67b7330427ebc8729262c6056fea993a3d21e016827e5c48fc7009ef2e8cc18885cb36ba1681aa9f9185d27671f25d6ef67e06a823fa361087c188a8dcf79da164f6ca72d727de49a99dd8162bb5e67de40131e8cd04b8303daf281f2c4868a351e9292ee37c8d39b8ca9973f7393f8973702266a3a454068d1e4ed33fb3e436f7f1aa4463010011882a04c472a33129b5c40b26d81b0cc44cd3dbf771854eb561857c8020ea0fe980e3a08f4265d83305381718c36e51d89dc2471744097f8caaf9ba482f2037b9cd1fc3d0002e1c1e30158c63d010ae3b0e9867b2b519c7df88485199be942ae446ac1ab66e4a198e58f0a35314f3906d392f00296f1bdd37a29bef422b40098e3286cd224c091048960096de275ddfe585714c1d14dc83c58be1fabef1569396e04384c9d22452be49e42f6ddb593b4c7605cb2ac50271054c5ca3bb7bb49e0f85b93efc8c5e182239cf8abbdab9928e7c665eef7e2a04ca593b62039f39310c45ca2669b37a747e3f8d39e1958030010f2080377ae7e01b3b9cc540183d16256d5cd9719f73808bb6a53fc3e4b074df6cdda45d62417760382e1adcd1ce6a8249e6e75ad4687c0246257375201c78cf5b40424677126755caffb5dac0e284f85db010a380ce9334dd0f54b4eb7803029fa1cf087de7f8c67abaaf91d846cc5834bcdc82d2c797e0964", + "0x3a636f6465": "0x52bc537646db8e0528b52ffd00588ced05be0a08441a5410300c6b3af9e49f7199e6f8b793075ab6341c6633cf4110ba4f8f3adecd54c7bf75e94c3444e01bac53bed3524d9ec497b99d77d7ff233249ee104cf03806df0c59b906340d4db88eb6adedbdbbed2db79449a6051fc517ad18949452b23eb32fa4ccf52919a473fd2695da67e798e9d75c149bf4f0a9cbde7fe609e6efab79d66f9f7d5fab9f79da7cdabfd57cbf4925ef6b2e8a4d02b9f8b4f93ef89f797efebe9ae7799ef5db67270af9fbf6d909257fdf3e3b57c8dfb7cfbeafd56b76ae6667d094c2e5fa9f790665fb221dafd9b99a9d9b2c6273fd9ad7dc33a56aae6fcdf619fd26952ab63ea35ff39ad7bce635af7913398e2a730fe93e5a6d10c5ee1c038421e3b3ceedb3fe2695accffa6bde4162bbd8414afafddd42d2c5b220c6192192199074416205890c4876409203121a9060417205890d487440e203922d48b420f9a1002138a24601c4208100921e900081240b1218904c2980080ae006090e0588224a01a0407203921a0a30e6c898231a381245019c3802c51132487838d2e58817232e1c79c091178ee07004cb911c90507922e34818dae5080b475ac81939c3081a46d81849c38814463860c48923578cb471a486a7248c10714486233118b1c248068c2031821a4f5e188961041318f9620406235646aa1879c188048c883102c688172357468c301281270f3c65f1f4c3d3184f679eba78c2e2e98827309eb678b2e2498b27354f5c8c5c3142c3131b47d2788263848727374682786a6364cb93088cfcf0648611083c81c088104f2130a2c3d31a46867852e3298e11209ed818e9e1e90346b83cbd796ac3c80e4f2330e2c313098c74794ac3c8ce489627348c68793ae3e9044f653c95c0081b4f3b3ca179e2e2498c2713209172a4882312387275c488231138f2058997a72f8e28f1348127259ed218d9801138464ef074c5d3124f343c31f1048127209e8278d2f22484112a4f443c85f12481a72e4f608cac39428391324f5b8edc30421a4f669ebc3cf130021a2384e0c98a110d1c096204111cb17a2a63c48c1146300208467833c21a4784188104476030f28123bb27248ecc70c40623719ec21cb1f2d4c3086e8c4879dac0085b8e6ce0c987a7083c1971248911703092c3112e46aa18e101461e600407233718c162648c91228c3c6184ccd31003a86100310cc0cae98d53099cd27072e30402a71038a1e14486d3194e66387dc0290c27319cb87042e3e401272c9ca67032e3748593154e1c701ae394e5448553154e523821e17484131827093845c0e9cac908a7229cbe38bde054c52908a71c9cac9cb238e1e044c58907272e4e3a38ed10421c27179c607062c1e906a7199c7a70028248194e3b27229c7c7092a1e98ba6309ad23481d174a6698aa6324d553449d12481a62f4d463415d144449397a62e4d433409d10443d30b4d564d2e345569a2d234a5494a530b4d2c34ed98e234f5d0a4a58987a61d9a7468cad29443130e4d0f68c2d27443930d4d35345d69a2a10989a6249a7e68f2a129024d574c6c3455a089024d3334c9d064a52986262e4d413431d124a66989a6093429d11486a9044c6930b5611283690d931a4c6530a1c14406d3184c6a9830c0d40593154c1b60ba82298b090aa6314c584c553051c1c40413059892607a82c909262c98cc3019c1440453114c12609281e907262b4c58981ec0740313104c3e309161aa81481144be209286481744bc208286c81344b82002059128886480081544c6102143c402449a2052016a03fd814a808818224c1009434409223a10f942e407223b106181480b4b692ca9594ab344c552d652154b1c58bac052079636b014664909221f58ba61c986a52a4b53965818d2c6903743d6180282212118d28649034c510cd9c0102a867060081643a01822c6102e867831246bc899216486941952c5102986a81972c5102d86843104cd903443a618e281215f0cc9628806868031248a211d18b2c5903143ba1862668815437818a265080d42e20cb11ad2c2902a4376435818f2829036846c21240242d01052812043045122880f41900822449009040122c8972041048940901e821411644b1030412010244c902c418c08a225c811417e082281203c04492208972057417208d225c80e41bc04d1210811419608b20b42850811415800f2012066003903c81a2065004903040c0700f102481740d000e1a2c78e08181b6c91011b40b200190248992512d42ab083034362182203a501068729024a5c08a0cd2c8a2130fc580383180060c612950f7ab0b1616bd3a466821a1b38c6f09cc163c6072d0c69c1a38647043c5b68f0044f183e3ff09c79a5e12183c70b98124618e049c3a3c62b04351a6a0fa85de1598327043c6b78d0e041f3daa209cd073004a9d2e3011a00e1419827199e3a60a40339ce00001b1fb0f04bece062032b3bc87cf0c20e2a704cb1434dd0144a5b2859093a0316e625c506590029116ba1822e7ab8086225080c3a5b766ca002348cc4185df9c0c04b4d0658005520071a46618c26a014830e104143ecf08092073ea0b2a30348320049038714461210ba4a7a801113a5971d6772b009e2b22426e9cad20f38ae40b2521ba302363bbcc880022f0ff818e123899d1b761e80838ca0282c11b608202600c2868e181d0a68a0c5520b493a24d1900389a419869ce0a581212c6c26b0bd79710088960dbed8a08b0dd06cc0c5065e7ce0422d4cd3183bc8d8e0881c6b2cd580b4ab4560071a202cec0003c86e47183bc6d8b146c8881d59ec9842830cecd8c287133e8ef081849033435f9436f820a207cdd00796d0408a01880880b8796da0070b1a1ca101180d92d000891e573010d3c3060c94e871030613e85103064bf4c0d283060c288001133daaf49841832d3d646092a2470c3d606032a38715066420268325622c20ad81040201846007164c10788dc0270ed0121860c1e0060188c0832b1e34d0aba32d475c8e207024c491960ce21c05017481242caf2b3650224986179a57164b1378511164869106945e5872c17682580c39965082216908241a625c5e5854b043cd879a101a40519322880c35ac0f763531ca2ab51e6a45041551f3020715352fb52c1dc050d300d0046a1cc000875a121a68a0c6c4eb4dcd899a96252f6a5bd8e2d43a50c3c090076a1b48daa196051013350b0469a1c645072ed4be30aa80ad042f2b6a50d4a2e8c00a002000401b00a401003600400200606a48d42460b4440d889e2f8c9448baa106819e34466086b860542546c688caac023cac08000442b2845491411b1be050b46b2a03880e3da678f02503131cf9003bf318c8a00433abd9955995d9121fe695f0a008a1311e1821940198053630f3238dd81019a031a3329bc0d2163994c811a6bcf222418eac1c546880810de06cd0c60627d820ce4b0ca30bbcbe303ae235865112af3090607881514353b2506ef180b0912003263ae0a1032d4a5614c0a1c00414bca16004435078194e6b389b9e2e1c0c203d106591019c213586d200da02c8034368f0946088cc109b252fb6110c9d19e262280ba7076436d80c019060490466043ecbfcf2527c99ef80f9c35781c406290d243490da20a901db02e681a31e7ab490c109605c00e1c19c72e485592583e069863ff314030e30f21aa60b46c4f82e06e0c211081899628436478630922580373fdaa826c868f088c18904027093d5f02106ec0438b0c869c0d8d8808d1d52ec488383091c6204b0c6529c4f62f604052334459561e6022c0b18164072a8330079c0061ec8e00d5e83d5fc0580e070a40316e3280bf6828890174f425908a5110243080d4e430403180ca12af017443820d485d016b80c1c061e039321c40511ac0dd40891f940860f62884909820394041006768851c6b0a38b20285e5e0409b1a34c5010351c7420a013840e972031ec30e3f403910d008501f4851304885c40471b40583baa08aaa2ac01a809262580c2fc240164c40f12428c78273e03ffc48ff90908f9f233819e357e24e0c343ac8d1e2b3f10e8f12176829e32312c7aa8f8a9d213821f293d6c7e64e831f363c5c7879f5dcf0d31343d6a7e6ce8e9c0cf0d3d48c44ae0e3c48f0f3d51c440d0b32636464f1ab12b7a221083d3238198153d56c444d04343cc8c9e2b62657a88f8d9e2b3430c8c1e2d7e70e871f313811e1b625df40411aba2a74d8c0b1f2db1333d63fc78e9a1126bd3d3436c4dcf0f3113f454e067089f1e626e7a341043a3c789589c9e303f5f7a62f8d9c1878998163d6ac442d00344cc033d68fcc4d0a3c48f103d527e68e801f393a54786d89b1e0cfcc0d09345ec8b9e2a3f547ab8fc00d1b3448c8a9e297eae7a3210fb404f113f537ac6fcf4d0b38158193d138849d163c4cf959e277e74e821139ba267cb4f0b3d22f8d1d203c58f113d33fce4d0638198173d43c4c8e8f9f2e3420f04626af4502026860f0e31353d64fc10d183f5f343cf193f2ff488f9e1d2e32596468f1431333e4fc4d8e80141ec8c9e2e3f607ab08875c04787d8163d1ff829a2a78a9f1a7a5ef899a1e7ea87859e1a626bf4c01023810f056223e8e1c00f0f3d586261f43411cba227899f07f40811cbea392296a6c78c189b1e267eb0f8e4f01344cf057eac7aaefc74f939e247cccf123c52f094f95142480b212c9cbef809c394812340e83881912b8e6c3112c50e2d624e2c69013341ec2a16448e2984ac88dd50f25053a24644075580c4d4cabcb810c0086a5d9cca3875f139c2078c8f047c22e073e5f3c5d37440a5276b3666e6c40c8a232e18a1c288078e2031d380930878dad8600c9e11f0b8e101014f1b9e3478d8f07c80a70c9e3178c4e00183e70b9e2e78b0e0e182c81b1e2d78b200b2436c0342541cf1d0434a0e016c0c989a7c066c8d529c1f2cc0c4e061c5c3051e5278b4c083051e5378ec7854e1410546060c0dac0ca634d98d6f8181941e545e2788ed62567e6c9123899a0db52e96a6a80df12ab3848125271c861f22d0c902f246280b032ba62f7498d03162c717415ed851466e33cb40f944e9448975b48363f132537b62a70da6239696308a62879557154c61bc3af022539ed1d405066086ccb0e38a2633350fb807828858c2c2c70c51c30716401478b51132021f453865f162b324811d56bcdc1029c1902baf3698b22c49c160089f22969e28b19433d4b804a961489c1c627c3025870e3a425470865004703821e4042f13bcd01062c5920c352b4a1f8478c08986a0ac241e5e718240f02a234719393e90c38ca4176a4d2cf1b07485498b0cccfc38410656349131c48a10102c6df9404a8d8a0d9208e2426925871449566a5f6a57434840048d1a184b6264708543e1034ba70b1d2f74bed04953c2b0b41b02672902b51b9cb470aa61e90b230abcce08795347e019a89129b5bcce78a9a10156f9c26b4dcd880acef8b88010122cc150ea500ba376454c061048900403929ba5196a551039410e3515a851fef062e3050789051f46bca6a8a04d8e351b84297742ae7865d5346a59250ea59418124b59247149ca520ba2364683289cb61021c107555e25f8c04ac81a2f1024c54044881a0562492c615590465396ce159005784850010f1b34214404416b942d1039a3040248093418f34ae325021b1c226c388df1819517194c390041638906a3080c81e1a4c4cb0c232482580d3983e70d8f0780b019daa202336c6d9454766435793124867da1e25069a857ea0df507db42b5c14ea9355420ac948aa56e316bb039581cec0386ce70d2f25a63a88cd285262b86d4345d31d4c59019436986c2f0c1400d4b794339850989d7075e5d94562f2d2c963207224168e004ac0958057c7cf171358466680c21667c80297b28b3d46aa89151bb00d316262ea50c4c4164f005930598c0a8e950ee50d240a40bd30462360cad71ea80d399212f88ec9cae0c913164a6b604131ba6334030015316e5036a679cd8103162e80a1c47c4ba6000270643d02ea88520167cc4086511da4148870c8cc8e02a832f31286251c06a80dd00b3e1adfc0c2fc3777922de4b0e11e420418e11e478408e2c1b7cd920021b5c298d518a42098a1f12f89184121ca536944e00eb022302e625e642cc4a47099d25742690034b8e1c72e000030216040c023109c48e8881a9008b0ab4a8200ba12584981012f323cd8f307e80d1410b1d4ce9400a6c0c2c0a181420fc000210206c51d2a2e483520f18ec80410f18f05081950a66a84006a42ca42b90a840b202a98a243149144862a2832c1decd0810e4a59289d51d2820804446e8842500111151851411141568660099241490da53594daf870c1c70b3eac2a58a202262a1013f444d098a00c049511f481a0354b0f109a225445880a081d00410a10ca74704407497480c40f187e58f9114305515440a6020d6410c3101f32b0e223043e44e0c3cd06576ca0810da2f871c48f303fc0fc50e207123eaaf071850f2b827c580213f443995556b15365c76ac705203000b10224860cdc6450c6ac051f43f8e8e24308a5294a5594a8644005065560604505392c9551010e446988c220028388975a0e352d6a626a666a606a53d4b6d4b0a8f150fba13681da11b51d6a6a6a696a196002d344059394216930d9c014c6dbf035aec6bd7034fe859310de859b416408cf722dbc0ab78208179f6269044428e018702edc097fc269046ee52ef80b5404de02cea9d0367c474fe02cd038f40d75e352e808281b140e35012501fdf284e240b3a05ba8169405fa000a058d826a803a41cd500a500c502c9a030d82d64075a05928167a05958296d1d1239c50a52075020a5025906044014b94244180019014e0081dc3f4415e1a02c4f683dee0438983006c4023502221d2dcf49d687985a25aa28024509640a1902489486b094ea09224098d8c869c28a109131514201bc26aa8db12a8291280100d61a084272440958063e8024dc500a8282a06402d11c01cb2404f41dda8989c003595044a010c58924213404315682aa8129e385981490a49aaa0a6a0f80c51a0a954b82db9515141514139598109536c8889a6a2826a223424a6778696e80998b004aa09cf90123d95420a2930bd86c2503094046d0889be41511dd1544ca81860021494024c8082b2f50c81091a9200d48d8a01541148e1c98d4a85ab86baa9a0002653b7db929ca12f504d9a3c21213664449bd0440e157134444493264b4868d264c9075e9a0aaa6a0a8a0a6a2ac90dea041c435d7a889e7a6242122a2750514f6e496e242c59012a0914094ca6a02481ba3d71f2e403da901028dc4e7002d5844b43419990e4c92dc90d851398402da0682888a66ac264c90daa8424505026e41882403f31c10993240c988252412a091328f9e6042a05062c09e1878068a813b63454094f484852c292274da0a8f04343dd9630b9395972a372c22436e4433769b2840412964cdd9c3cf92067a887a6a2ba41515165a0212d0d458293274e922c21c1c9932612b2d0100f4ca064064c41553d21818a09080cc8e6d00e1a0ce9403494a5758672681c1a05129e4081920d3da0a754388189094e9e90908409940ca58025369e212c7d73a2c2131292409db0044a12aa29a8a82537aa24544ba6a0f0d00dbde4f64405a924544e923081924f70c2246ac98d00414336f4935b921a1a8a04274b9a2c51409227b7245437274c9e100d5d69aa12a6962c006a2ac9094e9894e0040a4a122650325593274f4270c22485274d78888686c20405aa2928270b789284015051398666e812a09c9cc084ca890ab725243ca962a282145492dbd4132850533e8664e8129824b941514da940c2cf9095a68262726332f504859b0a4b929c90840994bc044a094e964c01b93114432f8009943c051535f5c4481173088626c013d1d00b0d05a502940a4e22940075c2094b44b860c8aaa9a24880428104179aeae6046a0a0a05274c7ea88a132626c886a834094ca89c3099baad009584014da0405992640aaa84264c54b04591f0a4892d68684a53010d49e9254982865ae814922cb92d2961c90d8a29678885063069b284c98d8913263c43bb8e22e14913052481baa94002d40a503a384e4f3df9606c0ad544014b6e4e543021c98d04a829262538619224c94f109d35be2d5c2c8125b74e6cacdd2e535dfdb965126512140afd6c90902c28e886cc9305ddf0827272c69c9c1d928cc576485246d66a423221a11bb22099ec8677e3b6b52d7aefad15bcdd16ec7b3faf9e77bd56f7a5af964741f8fa095fafd7abfa6df54fabd50db640f05eef3ad8b260085af0de7b4d93a46dadadeece63edadd75ed0ba75eff6f55b6fadf4da5a31acc17bafffe4b0b5fabd60f7b5d7bbb15f5b5df76ab56e775ff0bac360b475bdeb200c562fa5607b9e37e4597b6fdf1a8660d2bde1f5e8bdd4bb9e77af772f051dbcd4f33cd8855dcff36eebd24befbdb4daeb2dbfd529ed7bbd6afb3aedeeebedf5bdddb7bbdd731104431d10b47d73dc7a6d815e6babd60daab7d32ea20dda9f2abe7fd6bfb0d6fb815e736a756baded9cd1addd421da585bae77ab76f754bfd8a1ea5f75ed1bbb7bbaf837dad0bf45befe501efb5475eafe7b5dadb6efd7677bdddd756776bfb5abfd75af7bed6eedcbe6dbbedbdf7eab8d75a43776ff05eb7d6b6b52058ddf60ddb6fe31c50fddeb6eddedf7597dbea6efdf675aff6d2b20441b0a7a707f4badbab0e8fb50da8dd25a562f56abb6bb7e5e14105813a04431b5ada5d6bd36b79400bda5aadf5a002b95babc30206ac60c36a17606d5568417770c8ea549edab6bb6fadf67a17f47afc561d1d50c75a6b7fc07badbd3eeebdd5e572156e54535e7b6a05c11cefee7afdd60eba03afb5bdabb5b54a79b5f5d6eab6dd7aad396277edd9d194524a6f7bd36e774aa1547797dfead582fea49d74ad35ac16789552b7ded6ab03d5ae6d4bc751ba5cae14a85f5b776aadd6822eb02c0520800a2aa8150828b4b60504c4834713790804e4ee9f53efbeb49d8aee5f57978b628bdd2d8a4d451c3d3d4496c8121121b9cb55b6cb12953d01e000c7e5a0ec298f8e76765c3bdea4bb01d000c0d1ded5a3bc4a2bb5e059efa5b5b6bc95d36a3169b55aad7befb5f55e973b0a6e4f30c1a1bcfb5e58637addc1ee6e4a6983d5dd9bd276ea1eebaef4b6fcfabd5726bbd7ad3b68030026811ad812b4610920185a1074f7bbe3b8ad0eea3eed43775c27e1a500bfedf7ba7bd6ddab16b4b3eaeed6eb755bafe7e383a3766d5bab83b4abbbdc2958bdbba7ab2f7107abe7a0836ead05adb520782f586b05adb5d57774fbb5b66fa5f75a5ae9a595baeb36a5d45dae1200d55d4a68b5aeeaae0abcf47adb4777536aadbbe78160cb738a69777b6def06dd524aa9bb4fadd55dee5e83f673ea14b4f4bb7edb3febd65f4942efee0bbad2b13aa56e6d0882d656ebdda1bb4fadd63d6ccbc3633df40a82b6d65a2d08869e00f75babb5d6f2580f753cafedb6bddde5ba1758eb48d6020b6821ad766d2323b0d66a2b888030d419f2b63c3c43ae7380a1a190a70ad576b03aa5d7dd7535e896adb682f73ad6012b0882b5d65b6bed41698ff0e54e6b18d2eaa187e1cb43770ffde5d56feb7aad4bbd5b43777797ab56eaee0640d2b700d7a3dd7d69f881353c526db77bb75baf3eeed5faa52e1cddeeee46dcfd525b6babb6bc561772afd6bae772ebaaa0d6d01becdb7d414a2fbd5e0529d55173e4c891a37ad7bbeeb9b5b5560a7edabbd7af4769bbbcfba96bbd9edfea9eb7e35e69f53ccff33cf7bc6ecfa35e48abbdafeb6e47704a29a55e2bad5e6ff53ccfabf77a0ddbddd57dbb1bec765b813b8eee06aade53a977f56ac35a2fd8e9dadede9ee75177eaddd6bd94da5abdeb75750d67d4bd7abd2ed60a82edb7de4b9dfaedf6eeaea07ba5ddf5de6bbbbb767753776f77b9bbb7bbb55d6f37f5bef6562b02016ed74a6bf5ebeef7deea5eaf7b37ed6ea7edf7dad0a9e7d4fdba8f7b57afd62badd5dd366d7adbbdddafe7f5ed7b6b75776b6d77777bd74abdba371d402dabbb7b6def6e77afb676df7bddafbb5777afb57af5ca03d65abd9bdeeb79d57b5d0facddf7f6bdb7d676026d0619f0500a6e08a0bd17046b83d7af776f91a6eb5d0a5e4c449628f0aef7fab1dead43ae106badbddef7de7b73dcf6fdaab5a1add6f60d5d6eebe7def77ad5bbaf77eff5ea7e3def76245d9010517dda1930f52405a8146e0cca09540a50b725372a0088cd03aa0aaa49921596a480e384274d929ce084c909273c69f2934193264ca28e82e40032237590397c4a68c204051292dc9aa8b0c404a8128a7cde1700e5046a8a82ba0254094e985080c1d08f1398509933064045252181491305a80065364545c1d8185051414d4149e1090949a6a0aa9e900035c5238aa60106504880a242c26068031e1a6880410914c06e4ba6a09c409d9064095509244025797283c280291286944c78f2640a4a120698c0640aaaca02104a809a822a61ea49129a0618403199ba594053e8e601356502094f9a3459125404258525372aa81498dcde54800a54452214145592149e94e064c914dea19a7d30b395e0644912a8a925505278d223a7c912129e34b1407c725b520293264baa92503149e284c912144830c18427433d6842375678b280db8d252850dd885a4202095051340d30f818063c92600015b5a48902929ce084090a544b5078a81498dc9ca83085df87093715845250c149d0af008542929b13265350929040c52485a92537aa1c3e543fb3c6e0c99329a028129628a04993275316e4255053400c808a4a725b01cac90df30675c24f8cea46c56405a8a0af793879c2e446c2122a274ba66e496e4c5248e1c98c6c0c56606202d41414fc534ba09a9020ab7202557d9a4712274f98504d41552529c1091414284b92409db064eac98d2ac96d05a8a02a2750d5874e16d7d11c55128546d1e972ba9c4b49eb74ba2b8e55372ae9d6bd4a5a27e628e95c4e57e672391dcde54425dd6ae17415b7f3d289395b9574ceea6a2ea7f39ccee6aa921cd5e53ce7602ea7a35f2ecce5723a8bd381ba0aeaa82e97fb74d6e6682bc9515d2ed7ba9692cee97455498eea3c25388ac3592551689428b95c8e2ae95cce75dea7444773395049e774aea475b95c2ea7d35925399acbb9925c2b69dd55a2a33a9da7a45b898eea745649eb74baaaa4753a57a2a33aaaa4755409ddb586a0dd4d53a05ad2014f49c7d2614af6cf0227fbdb31579356eb794e2a59eb594f88f53c6b7de651e1b31c9156293d37569636997ebb6a45b2a695b5d9afa608a5cdd68aa55eb98bed5ae4ee1ee89b33faccfaac1f266601c15729fbe98b6dda4c8eae36b94ae7e5192b575d328f9dd4dd4d16b1bb5deea7fd3d2a4d81ef5e7264ebdd46f7ed53f3fb6b923fe87ff841d912fdefe97f987e98a9d8621d3db1fda9697de6f7bf6ea34b1609737fd84927b5641111876de47497af7982d9bfdbc89d859c235b5c4d9a3fea19c8caf471f6a8489d2432be9bf44733ca81f8d3a7ef42948d95254d0e1f8d981ce6f145b18e9404027eeba3c40f5f74f30c4d9910bbdb65f26daeb94921e52e93ef26dd65f26beea3d86df47aefdd74fdcb3cdd923ffc5db8be933ffccbafd5d2942df9bbdedf854dd95298fdc3ec18a88dea5756a4b6d5f7d7bbc6ffc822611e1fa893ea7b6411591bd51f3190cb65d25d6e1208dd75c9f99a97152907bff009e6fb51fee19ffe4d448781300c43a7e40ffaee42fcc328571bd57fb551dd654b77a5ddb190c9175b22895fdf6dd4225fef1acf9ac577897fbbd9459a53aed7f8357f8def12c9f15b3a44dcfa9ad7bcdfbf9d7edf9c0f973ebb18670fc37254e7f2af079156296d6eac2c1ba0554a2f37569631b98d28f8beeffbbeeffb26fad410a9bb47419f794fbd6f935251daf7bc273b49c9dff37eec24ef9bc85bb3b3b3a3f3395ffeeb7776767676cc78bd5eae277f7cf15fafd7ebf585288ae1f7a2288aa219b1bf17bbbbbb9bb67fe6d846df53934e51deefbf1f3bc9fffbdecd6f03a2f7179f63fb5bf3c70966337cef4f9afda18439c44e4237cf5cb6ad17a39a84d9c34e42cfad3f5b59b8642fb75adf64919b5bb87d76dab1e579ab8e2dcfc37e82d9c177d3e98efba2a5f7adcfaefb37560e6a961a2b3b3e6bd95f6c8dede578df58b9b1725093bb9dc88eadcfeefdccb3c9983d4fc962905a13889e573a0d143d53887dd1f33cd37a6fa9d57d91ba52ebef3ba954abd784514fb455345bcfb45e1845bf7efd9a5b7cdeb27d6a7ae63966ef453559fc9a3d8b7f4d9a65427a8a2b597c2fdbdca4906f4d1671d31da77b2ffa78bd179bd21d5eb56693315b53b654a3320e6ea8d9b9651ee50f4d9a29793d935a95f4613e0bcdef5b26f8d4bc4f492910c48d2df673b4704421dfdb17ad79eab27d6b7ef6bf9a5bb0f535b726cde0df6f9dba7c412b7edf5bb38ae6effb5e74ff362299ec7b5f73d0b4e6dbb3f5f4b65affbd0541f0417cb69ebecd52b8ec9dadbf54cd6ea996d29f7edb9729b34fdfbe9b32fbfedf8bd60c52fb9ebe1d29f9c3ff7b2bc4fffb5e8ac699ba8d59ca834c9b14024588920c3ed8ff9927f851f6bf1741f3b4d97e6de129a96eb3dbe59b4e06bfd6db98c1225042734aca83ec6d64ff7673f8a767fb2d732afcdbcde037b99424b7bee6a0298543ca834cdbc8be48c756ebedb770b70eebe40fefed5352e9626b82a049afcfbc298b411d483f31627b39e3578f92d4fbd1636ce24bc8fdfb777c6ffc70fcd687a1d9324bd3aca2999a5534dffba2376db72e8abf8dfa6b7ecda8fbadd269e2f7a2596c52a96f4ee9b3f08ff2f89454a2e64973d4fdd6677e1b1de57ed12c7dd660fe96eeb7b0f5d92b7cefed8f4f494a05fc10c77cd63fe2be4f5bf8d4e5d68f263547f30cbf15e2d3e6f0c5a766f593e6f1cf213a0ce46e1d233ec3afa229850bcdce456cae5235532d65fd7274b3b378cdd37bfaa029a3588ae60f5f90453a82a651fecc209ff55ff3a4f46f0b623b527b114502bd88fe192bbf93be8de8f707390de645f4fd610510e9539354b23ea3ef33fbf93ee864df1ceb337cde6aa6df7a98d3c44ffcc2109fe1b73efc46a77de1d7173f936631347b7c4a0221cad667adffcccea379ab397c917ad3ea6a9f75a63f739a8ea04c9fe2f38a95d26b766e99a00771e2c4c9a079f3328565bff85c21df6ff30473837d737cf6fdfbecc36df649b3148d13274e9c7ccd5bcdfd74f470e9b39f59b37390d33ed7d7d14935d7932887d4e322d216ca7e184c44c3258761272585b9e98e13cce76da44b8bead7d04ca003504313a677743e6f1633c5672e57793e618a66fa2d58588ae3089255d6753616174164a957a65fffd5497d825cffd20074aea7e7f38edd4974479328e98b94a4589453ec7a8c9294dded3a8d15e3a1b96a9a0680ae4193fb9d22b5ad3fa401b0bbdce48f4693e98bfd8120085e07c14abd998bfe27456caf95490bdde1430f2216359966fa35772a45737d6a83e83d9d5246799f239f5ee7c6c2014df6ce509d347594bbf4eb9a8ca7df8d2f9e52c5c876df6ac74661d93e109232e5d9247b7f944f583e7b0ca7b64db94fa9159fd95fa13ca9956cffec31b27d5c7f598b44a065891f96009366b7b3dda77fcdb65173678d98218816206001db942a4636fa563bb62955dcf6bd550736fad7b4eac086bb12813e2e845a649f66e1ae44a87d187725c27d8a718f8f3e9f603e1b0b8bfed9593d021736d0058d2d8a00c38ad73da08c057cf0c189334884c0d6b67e5284dfed6cf4ad382d4776b73f880d286b110f0e6572506e2c1c22908f74afb64242fb4e5acd5931f5d4648bbd6bffc34e2e8e6a829dfcfdb3e21397edd3bf5f4dfb4d16e929aee48bbb80effd99cba76746356935f97bcf494f71257b7f3620df0f3b6935d9fb13972f3ee95727029882953ddc254a6e87164fecd0e2097cae90eb8366bf45b2438b27ba44c9b51a5beb5baac68993bbec84641002cb96290ab64880ccee06a5d5e42ebb1d5a3cb1ab12c014ac15763dc5155bffd980ecb5d06a6c2dbc6b35b6fe13973d7cd20074ef381b0b0b19f94673975d8f174748f9c06e676b1c2507e25dffe9348b4f28991421070c2f8668630ad34eaeb873aef3fc1a2136d149af74456afd59e6fe0faf77bd5084dbb5c8bbaadffacff6c3075f04f15b7fb108e18356c438f1c11f40db5ade7bd7bb5e68faa845f64573d6b5e8fb9679548bac8f2a43223ef82284df0aff6211c4fb223e322502f821c605c15d8bbc1f40db42b8619fc9165fd56f5bebc14e93ed9b6db27d6ae5b4b3d9ace0b4935a512b506e709ad02b5667fd6b210bb420f83de8b50df43ccf034124ad0731eecafb168ed5223b80b6fdfdbe6d2068b62de733afea1f651d3ec81039eac1818eacea1e0c62139d9d06ac48adea799e27b6e8b82bef73e1b7aa572d083e0128e8bde899f49bfc5a666982b528847c4330dbafa492b7ccb67da61031d7172929a4cc5e86e6557db7766cd2f3fcbabb7be6a913bd9619e5cafb1cf8ad7b6bfdd68ba0e7fdfdeb5defb6ccaf45f64333568b6c2cdbbf4a540408bf85a3b43efc11dad6c257de0fc0050f6c219ed522fb47b5c83ee821a1a26c1bf82e78606b7debbf96d9b69c5cfd6b6e5ed5da58d9fe11a79d1c0471dad9670e5003a1cb70d069720fe5aace3a7884fdee245a9de689f66c52dffb2bda917692e77e51b4a24cc8a9fb21dffffec3a78e887cf1d4e7ef75b9492161feb0d722df7bf8bcffe12ead77f3d465f748209dbb58bdad8573e05f797fc922f52f3e43b0a4927fad7a5761ae4f0a692d95b9e2d3c91f34fb8bde4eabeb1c21771bd11bb2ac7d6bdf5a1bce644bb3b52ffa48293994cf5caef69bc8e2a823cb46ac55cc8d65c3956a8314bf27a8de1beb59d19bc1cc050139867b63fdbca8addc58356051c1b17e6405c74a69d72026d7dc583558d16dd64026f707baba8da478635e4db9281b8b0633b973677fb18e9d1b4ab9dbed58b0d1a526417d4a2af937596496bd9368eebfd226e7c8f5d24ef28ad8aff8acaf422cdf6253521d27fbdfbe7c5face4d24b8875b3dbe8ac0fbe7847db49eebd0552ffab27cd677dfb9f295bf2dedf71947deff3259772640f771bd5af26e833ea64962bb5e4529320d777d3c92c574cdbc8ff924af5295964962bee36720c7ed48211dbc5d7fd263a1b2bfbcc698d35839a06932959a43e7d4a2af55353d64f690be5f93e9ce683031d8e446dfeefb4c6aa814bf627fa1a9f34c77ce6efff99339f3991cfdc33616693b12b537263d1e0269f3eb2d3a026fba84844ae74d25cdf4925229ff9fbcca7ca73ccfeb0d169b9b12a132214b11ba9d656b2df6695cdfdd61452e6fe5abb56b3b36b80c50ba293dd5d73ea3390f11898da931b6b861dec0c56bcd1924a5619e633db6f4925291a275b1208056fa526a5a26c2c19e064ff500dda69c59be3c537525386aca6fdb93c2c6213f977fdf75eb4a669ffb440c0a7fbf8d4e5fa395b25958e7c7f314e67c3d577dbfd9ad7ea67e274366afdbb22dd3f6f355bec61eb33ffb36c1172b62a57521e64efa9cd9a159f34dbf7ccb366fbd7fcbe56add9f933ddd6a408d5463b5fb36dd691409bff58e61ecab9ceba5b80897d2fc869b79a2b983df356b310badbed7699be356fd566fad6529a85d85feb8bd4f3be56cfecb19a75ac267d9d53af72a5a4ff2336dda26c2c19b0b2971bcb4a9adc3a63a8b5b8ae2026a0f4d94ba426944d0ed1656b75948250810f928c09535fdebafe8f6a2c95cbfda73f6ddc3eeb124b6cda81b2b1ac8cc98d65854b3e5fd9fe05b9b1627893ad489b24a2cbedb3d3665da66225953c2789e872cd453a5eef4d0b84e6fbb21f34dfbf18ccf43deb428809a051f4cffa4e4d244550da3fc43661cc368baffb8eeb5bef02f1779aec877ffd7adffba87af31d73cd6baea3949211db84527c59b14474a0d34e9a29067d66dfbef83a80542edba699be02c4f6faaa6e2241a2b4d55628b19dd6583198c9f5fbc736c576d1951b0b86354164b2fd8bd463763b5bff4efc7ef1659d76bf5f4aee17bb935c2f8abaf15d66b7d1884f5149ca3310119f9ec5a73f9a672e8f34bb4eaa5c16df7ef8dd49ad77b5910b9fe2d727bf65761b91f81cbf76a6a6d417274e9c36b2fdd13c75f97e933f68b65f73d1ec1c9a511657d17cffbc423cdfafe4927dc7a72efb77169f9a27cdf42bf9e3beeb455326249ff7eb5312c8f8dd46f46bb5e6a32945e364f05da68c04f27d0b9f34b73e344f9ac317af79d27c9f7c4b16b17fbf49a5f16b2e366da26c2c18ce64fbf7c5167d6c1208f9223e6d16ab5781d9f52e4c492136df17c5265df8d465d78f661598c717cd9366f1bb93467c8edf2429771b892f7ead8aa668d66fd285a56abeaf749f34cffbf6ef985d0b590cbf9f9240689c3ce26ea35314dffb2683741671b78ed6d7d0ecdc322968d25d1b79ff99a73fbd66eb5af44e11bf225179fd7f7f4fa5e7ef1bf953f979d703a03e9517e8c77ec77745a2f283713a5f819e0a8e17bf1fac48548ea8f8fccff7c72a12951e8cebf9d7eb7f72fe657ecfe37a302e87e87f1ed7f3e3bf9e4ac53810fc12e3caffeae32ac681f805fa38f06f7cce93df5f56242a21c685effee20fc6e1ff863ec7fbf73f8ff3ffc138cffb12e3c22f1ff7f3e253b10f847130d8eb605cfd16c6b5de141f67be8871b53e4e7cd9ef94e58f18e7791f625cc538a10fbfac5f3e6efc12e3bc9dc7795ff4143cae7c0a300e067b1e8ce3f9effb1b1807bbf13c1fcf53f0b8ef29c0b81bad7ae3712d22fcc26c07e3769e87e7653b3c3cf887c2f06f0885a118b64c9e9f9e9c5a7ede0a7b2a28f2782fd31b1dfcc97939687e652dc38f47f4c69e9f1ed07ce57861ab55c5f2e3c919cb9ed6f893f339e8e1cbf478aac7f353c11c1694a2bf4cf12fc8a120cc9163e747acada2a2c7f91715b57a7af0cf4af067a305163c2e7c0b2c30bfeff5f88bc6f08bbcd9ec71e6cf72ccc0174ff9f82df8c9790bfe82c7f5fc0545458f13bf8882a2bfe0712d2f470ed17cfc338fe7679e23470e0b1ef7bd05189723474efd0b28a040e871e30bb51e7fd18d171aeab9e08b1ef7f345b359054f01c6cd7e88822f7a5cf8438f2b31d1efecf8cfe3cf2124f443376ebcec85865ee871392f047e8ed7f1b8d7eba047417fc1e35e7f0125faa10b5ec7e37a7ee871e017cd8282f007157dd0e3cc0fa28f133fe82990c97ee806c609619cd00fbdecc6cb1e37be8c3ece7b0a7ef6b8f267b4821c8ffb3e07c65590e331c655f0376efcec71f5f1e35aaf03e32cb0e089304e8671b2dfd9f9208c03027a19c605fdcececb1ec7f3328c03923dd0e3465ceb22fa447fc1d0a8f34218078471402ff4e3f8f871e1638cd3197afc381143e922fa3a7fc1e342bc4217d1bf00e32cc02fd022f129c0b8307c18c6c15ea4e0c5c7b5f01111e342f183302efcb1f5e3e34c1c4217d10f7a1c0f0ed245f467189783e72bc0388c71f829309f08e386fe31c6b519534a50264e0f21b0c1ca6656e102162a4ca0c60e54aab05131bff683c12ea26f62dce3efc1dd45f471e0ae45fd37847e3e08e364b107c2385d05923823ebcc10454c5101db8f8e8716b6a8e1090f94e0cc0fb69fc7e5e05817d1ffc1b818ee5ab4039fb3dc8f7be1b28be8fb60b016f5f73cae6214ba887e0fc6f1e017a88d4acec330eef53bf885231b95fa3a1897e3fa17c6e984e872822e42bc7183c61ab6da5cb44922881a7878f344096c54eabf1e57621f5d44ff85712edcb50800f8f491fb711f3eea22fa248ed5a27e9c63255d447fc43811bf30b351b91f621c074b34918604dc5cd1c6085b0bbff0362a389c18811218d8a28a09ceb051f1ff1e07e25917d1ff30eee2ae4546f83ccafd380f7f17d1b7b8ac45fdfdba9a2b72a3385e6badd4bfe6d5fda9bbd7f74ae9839962d9127dfbb4f149f393699afbc5573badfdad4849252ad2918a3edaaf4fbf924ab48ed4a4d949ff262d6e9fd5bc5292884e49472955436ca26e2adb67f429f96385dd6ec742a62ffae8201d4079c2727d7ffb27583f16e434fa31a7b535ab70642a5d762c5bf2b7ef6ff18d668aad10fa8e4f7ffa1c78014d3ec1dc5659b95f3093fb47a7d1b69db0dcdf448da3be263652d94fbf5b6217f1175b88f98c66496952cae6a036a2b8a9493390ce52344eee6f926c23ffb18dfcabe9c2947cdaec70329da26cac2a6c72bf971bab8a1a70eca4fafea47fa54fe6c6aaa24586f98cbeedf7a76d2a17474ea3b9df3acd7ebfd84da53fcd6287508a756ca7b5cf4e10ccfded48a317d5ef1745f1df73fffba2df22147ba60e9fc5628e64bda87efd9a3b09c4b52a59b451e7d333fdee007cb856c54cefe84cf1e97ff1e826ac66ff25cf51fea5cfead71ce634c727fdfbf581902051d2b77fdef75ebc26cc67f53d73f4597da7927ee77364f22f47a7795f1fe6b4cef5afd9597452c9c34d730c1026cb679dfd810cb0c4ae8d3a5392882efb8b74f44c9a9bf4279574f8ac3e35897c565fa423353b5b93b4f87d56e905caf333e834bfd4a2a932867aa06cac2a6172e7b3cc63cc69e74c87d3686e2c2a61b23fcc694e6d6750f66fd2004bb0d0469d6b3e3aad6911a4520789ed226da1a4df5853dee4fe7689f69be82c737dd1f6960cf35963eb331a277b5f73d133c136aa2f3649f1a9cbf4db3c69eea75965634d5993cf31d71f6bb54925fa35b74ef3af0f7692f7f55b9dd4b9be67b69733faac7d76c6b23fcd8d956525c37ce66f4d9a9ba8e2a8922221d2274afa3d36ad40d95858cc64bacbf5c5577f139d7497fd45243ab649a79451fd9d4fbaf3dc5837a4c934d3777289ee72c527dde57eb1c92265b65fcd2a9b2d96a27172fd364f5deeef4e3aedcb8484d962a957aedf5ae4a37c769c7cf6fbd76ab751bfe8639bd488923ecddd3cfa2929f5b97e935265ae38c867f46bde66fbace92ef790ae52d74204a1a40ffaacbfcb2967fcdddfddb1b2bbbbfb379157894dcf94b57ead5f6b9d7225d75a6baddf44958a8d1433edb47e7feb34fafe4de438ea28f7908ed22ab1e999b2b1a464c92798fddf69fefe33a79d36fbfb974e3b3ffbfb13398d667fd0698dd58295ec3f3aad66ff761acde798cfcffeed486e3bc77c82d9bf9dd6ef6f9d46dfbf891c471de51ed2515a25766ea2b3ccfe22e8b4933ee8b3fe7e20244894f4cf31fb9ff5db67fd6235419ff53b95f4ebf73759847e54c5a0cffaadcffa6b2e52d3f3d84953142b57dd4cdf9feca429bacb521e64fafea28fa0d34e9a419ff5f77727d13febb7cffac56a823eeb274059bfbf4920d667fd15833eebafb9e823356d1e3b698ab6c9525faed2c9f4fdc94e9aa2bb2ce541ae1a337d7f57274dd15d96f22057dd4cdfffd549537497a53cc8f4fdc53a52b366b293a6e82e4b7990ab6ea6ef3f76d2144d93abc64cdfdfd549537497a53cc8f4fd9b2c6277bb4cbfe6941452ee32fdd1699dfd9b144277997ecd6b5ef39a3791e3a832f790cea97b2176069d76fad7ef07428244e94fffacdf3eeb17ab09faacdfa9f4afdfdf6411ffa88a419ff55b9ff5d75c47290862139d65f66fa7b5cf4e30fb9f60ee6f476a2ff2ef17bba9ac4fb3d8219462d30e948dc54299dc58bb32f97c65ff0c7263edb2642795680b25fdc6daedb27f3bed7b7febb4fafea0d33afb8b4e2a7db8698e01c264f9ac737d20032cb16ba3ce9424a2cbf5453a56b3f367d22c52b2be58cd1bcdf50362ec95309f156b0d56ae4fc528bd7c7a9b9ac5c9789b5cdfc9781967e3671c8daf7133aec6b33c8d6ff9de78719ab5a36f727d9a45cd5037340d5543db5034940d3d43d7dc375ebcd02fb40c15439ba06468183a8682a15874771e65ba3b737482b9d2304afff3bec9f5beb9707c7a76b4384deab58371df1a201b8fd5ced7ffac7807b0c749c161f5638b65719a148e2f4d2daa6ff563e399128bfd27068bd3a45e3cff9dd9c57c7af0b7c50b98ef8ad37830ceeac706c3382b20db0efeb0c8d4a2fa5f56a56094fee7b7e56b937b2807ea4ac75c8841b04cff767148bddaec76429d54e5373aa92adcf9e9a429a957aee2c9e1df2c502755595927558d3a3d9d3425f5e52a9f4cff567d62213e73763a694a8ae6aa5816ff463ba9eae3e9a4aa57a6f82cbfea274747fc96f22057ede4f06fb77c919d54e5ae4eaa0a5f9d54a5e36a75d294148e5cc593e9dfbc1c56d51c568939c427f95540b793a6aa7ab2946bb7dbe5f06ff5eba42a2fd32a32537c8e5ff593c3efaf9d34255573552cd3afba39ac72e5109fe25701d14eaa02bd93aaca4cbff1197e939dbcf3e9dc1c2cf5f24afbaaee7227b1d46b740d2838821807825ff5934f1177c14979e12cf85640b6d65701e5732787580a479c3871729716c649c111274e1c1b88733b36ab1fdb87714417e3dec3b8208b71b11f5bc538986b40df0ac8e6b8740de8f7ebc21ce8774a9a30f5838490657d98b15f913ed0fbb3cce7e7efefc76a4e3bc15289d3bee7c06916e4ef8f38adb1bed092bf3f80d36afefa4cfe8a7ce4afcbd43cc8696e7e6a6818f9f31c4b533aadfef730a7d9ffbe6e538b109b7651daaf585e64e5a65e6ee00556d77ed006a93548a8937e88dd0444397601278806807ae062b2a745a62fbea468f62c3e293eb12893ad3d75b2254f8b6cbf2a9d54ba6cdf94ea3871e278653235e3259bd9cc9e16d94d1c999240be8ae7b3bf19e55eb14c08fdfa40e8577c13b31932f9e6d9c3a77f15cdf575d9ccd534b3dfc4dcaff3a897c06badb57aad5957b85cb125c37c569dcb1556b7932cd1fbac5a01c60a2ff7ebeb08b25fff7a9ee79156e956770b889d6f27511859c59a0c1bb3d6e4fa652cd7af6445fabebe8ea019acbfdc5f8972fdcfdeebee5defb6d1511d42acd69ade53fa79defdfa9fe779d60c82c13d6affe2206bddafa89556f0ebfd7abf7e5f1fbcf5ebfd5aab78abd8bef7e97d997d9a3dcbec37561695fbdec5d65a136ca3fec6fa80d8efbdeda4fbfd5e27d1dcc3675ed62e1fd5732c738414bef71c80efbd8f22f089c0533682eff5c8decb3a8966af6506f90cfc7a82efc1af9f1b8b8a34394649f0659fecc38d45c59bdc5854b09161266de1209f81a6d7466dd434570988fef47f84d96b63b0bad322e27df1525229fc917cef45d1fc11e66ea35397cff1c3effbfbfed1ac54b8c9b68dbc36fd49f3f307c1274dd0417c823fbee8587cd1c7d10c73285691fcc6741ca5a874b9f5e702d838419c4cd5595eb0c0905b78c4677ff8b52af60a59345d7c2bde113497487cae90c5ef7f8ffc11e6302afc6e1c7e9342c02ce228f0fd4f70c9bff559b34d9d486d0562d9f3caa31edec7d464a715e5188c6251f199d3ead74ac5995c6b7d703c800659fd444e3b77644a3b8932fd1e99fe48c5974cbfa444b449a402863853b851e379716e71cdd429c688c95360c9fd626eac29aeea145c32accdd1a923fbc7dad4e13414fa8fb27f73604cf6b77847ec0887ee29fa0a0ad069a7fd28fbf5a9f7fef5ad695fb4a6d78a4f17ad77af1d3fb2c91b41b209045b2490ead55a2d0d473b4a51acdc6d2413e2ef7d634d71259f64992bf9be7d4b2d11657665a86a07bee4eab95617abfdd6929dc94af6af1cf892fdebcb86df7a4b12f1debe7d6bda3fca61fd9086d50b6bf875fcb17e187e154dfae1592ff9047e14104701fffe472e8123259f402455a80dfc2855a8edde8f72ff238f801f053c02fe6769d592e1e4fab84b6ec0fbf06fce539cf3d79402e6429bf7dd49dfdf1b8255ebbdbf92f2803251865fe5fb2bf177a1cd7bfbafefbc01d34998c51f4d21a1eb2df983bece8f4f9a514dc41f9ffc4afe309d884fbe8e79ea720efdd7eb4b53aac6894384e257147d972913c90d7021d3c406b064a2dc5864da9049e38da2297391e425bf513465a2cb9489a4477ee412f91b00936fbe140ea06d174b01314e670b7195efa9cd23cd2e56df88c5af650fe3aef75febe29ce7fd7d5c0efc8badde761f5bbdcdc355ac3cb051d1d96e1571d4083aef65a2cd9520ae5cc1c332f13def29c532d1c3ba2dd93d0f772dca5d073f60dd5f9f3b622b9fc8cfc13cf6e347213ff64d8a10fb11e3769ebcdfe411f263e6f8a28fb4f5fd4770391b16c16de5d7bc4911a200fdf851ca07fa264500fa11d79c3c526a404baeaf012bb9be478ab0f3393f9ae4bbcc283bef7a8f44f2f3e45f53849dcfc138d7f37c77d28bdef8381ee7fa7912e3767efcb6e99851c6ff791c66949fdf791e330a6efc9dffcc5397d1e49fdc5851b4c99ee924ccde7fa690307bcff3a2484924aee7f99719c5f5afcf3171aecff9d2c4b9befc2691ecfccfd79cc7c4bd1ec78fa62e7fa3871b91e0729e7cdceb75be491176fe07e3ca277198517038f2cb97bddb74cc2838dcd8b69789bbf138f371ff429f6346313fca7f14a1c7e5a204bdcef33c2ef6b89ec7c1bef448115c9ff31e79a4fc1d8cd3d95e0f64e2a8ed853d530497f739384af9394fe3ffe028e4bbfe232f1661e7a38cfffa988923df8573517c1ec791114bf9f9f15f3817da729e3473a1ad4cf2f07994bb58b97ec4b9d036fefd1cf3f5a5497ead9226b501a14f25c68d4fe22aaebfba38aa8997f33517f17994bf0ff1497fd0afff994eeacb94f2f33918e7368ca3c8300ee87139e08fa6949fc7f13e262ef63e2f5e19b6e49ee2ca95614bbe63c6e4ae225334656375c126ff59daef020d1a325144a1254761050a341a50a3812f64be68c00d1465a00003c516287663da8c3193c571f44c1988975af93ecd61fed6e456f3adc9b7d5e42b802958368cab5dbeffe59b45d7e89932ef4153e66121f97e2b83b949213bb478623792420430052bdf29aeb81e07c6511b897126c6513eee71dcc0b9a0e779a112e782aebe2f9fa440a69f635abd2de765a6d5dbc67f99b9d7f33c10ce8dcf938373af7f3df93f264e67dbc1555cf84aca831c7536dd713616136272a6b69869f5361c8893f2c259bd2d37be6de77d4c5c0fce8de3f33c2ea7f33cd8ea6dae8761abb7ede09c0eb67adb88abe460291ed8727e7c124b799d8dc504984cf1cd761599e214ca29f2e97501939b74567edd96dc1ac777bdfdae486f1f249f5cfffab2224979bd0b5be5e0abfb3a9bfd8f24a2cbd7c3511f1e41672bdde67a9b2b411cddedca151a4be6bdebabbccdf5f74f28f96299874528e99f4a327dfa5d915e380af9e3db07690028fe4b22f91df9e3575284f15d18e7fad1458e3e3ad04b2d4426b4640adca8691119bf858f2800c0af7911e5f82d2aa61cb14c88ef76b97e6eb7cb51f53bb796787295cd4d5a2f0bd2b935be976f59b4d513d1d0eab4ba48917485e54ece4e59963b392f1d1d574ee972bd5c16a0d73f1944b0f5e738be1806cd574c19315ab2182bf7dedb323d8b76fcc21b47d3cdbe68f27dd06935df17ef78cd96697d063e0d537e477407f83a7c06fecc67e0832fce2a520f2f021ffc1e19048998f5f019b844e9817ff6c8e08bae539745997fd597a5e82e874f4753e62f6bbdac8587e87288bbb8e0818dfcc612e3426e2c3156b9492511cb84d4dcfa9a5b38975b8f3ba9f520f86545a236f0631549e7c17f1a80f1c117c397b57e0165f2023a90754c59eba9cd6d2f53d6c24ee0ebab50dbeb5fa4a38e496d2d3384f247f35c801439b459ac4ebb5ad7a9cbb2105c2f13dfe69a654e392f13710839584ac77943becd9e69ae79cda52985da5e581662a9579cdcc5aa878d7c29af366c55a88dfc29e06eb77361295f1c1bb9843e254d0bd0a72453996bfe1ec4517d759e7b2670937116d6125a96b092cddc58135893bd376d9e65ef8982de739336cabffe59fe79dfdfb1571c555a2a9e3bcadf7e2599fced53b3663153f259c2cea0ece1a8fade83638ce24a737d1a00cf95e928771b55302245a27409e4c64ac289ec3fe4c63a020279961b0b8c15426e52dae453d7c4cda70a354491fb5f1489b23e911bebea4aa6637263195126ebc88d55841b4a0209a54893a594846d7cc85239573e6f617811fb219f372f3f8861e4f31643185e3ea93ca0c40514c8ca279598acdc0fee767172ffe77e7f802845f3473110f1bdf7fe33a968fe425c84997cc1d40dcc521d2793ef99ee24c5dd465e76f304d2a1d92f9ae77dcf3e59849a4c7ef8a217ba52b8649ffc2697c8077f7c6a8e1f9ae43bb9d4fad17a7a3aa66d443ffcd13c3dd3b00acc52b58d5dee07cdf346b3eea3958a28f6a8ab402d8ea0b3f947a94fa562173cb0f97bcee98b34039b239f447c113d9d90d0f3feb4f86cb518d9c35d40efdb04df339f7668e1441c5bbff5ba44c9f514576c20ded93f5bb9e6e86f12498e7c44759efb155ed0e4fae1c5ca5e58a68e6138864de4fa74c8875528f36977bb7c0bc3f06b4ec13f698ea21f824e1f5f52494a89be785fa49ee5d19627ba077a9e83b4d56ab5de47d1a4f97f9e94798193eb872f7bd20b9b5c7f1cc71f473204fa11924a2e974be8c60b7909dd7851302ed235925f7359f991b26fbd4c06ee08b91921994c269399423a9ed0f7bcd017a709914a301cb2fa468663247384c8f779f245d2947d719aecbd1775a2e81f658a75c81fe103bd2597ea879414c73188c442a3392564bcf1e3eb85b81efcf1061e5fa34b26fb9a9366e720538a66d98fb277b288e7fb4166e7317ba2ecad8cfcd8932f5efb639e34037d93458a320964fefcc47c4c2f8bcfbcef31ab1b9f79df3273cc139775cc13579a27aebea96fb2f75e16a779969bc9de57374e6bbd17629990fa51f7e9d76f32c8b5ffc569e47b2f9224f94e3e355d4f65b9b176c000115688d0e2e58b172d5eac94566ffb11cc85b6103fc63d0847a4e48be348925f73916cb5def5ad77fd6dc269aef75e74b95c2d971886e36b1cbf0ccd292161283ef861188a233543a95c767de7d0f532a56876b99e2c52945d58b6443e7d12d32f3ef3fedf5ce11fbf89f1eedf344db36d948e26f8e6d5fd700429f548a5c682c02e17658a6f133ef3de49a6560ef1b9801cbed8dec1ee456a9eb973854cffcd2a6f8b9233ff7f57d19c8165677b3ca55d03f0abbced1fc4a7fdfb66db4e4fcb7d104bd538ad0fcdfaa279ae905bdf24d32cb76a3d3d2dd9fbdb8467f9cc7bcfa360b23766ef3d8b82f16898ecc1b2f7e57f67efe997f77ef40efe3d4b8a60fe7f2545f8c7e17f6cfec592f90c0362d326d8845bb27da0ef076900be4793eb0399a767d9bb1ee86b2efba37cd2a37c949b947dcdbb937864e7919b04024252a6bc7f94295904e84fcf24a5f824c91f1be46e2350e73faea9cbd494bdcb3c81de99def53870e0c05171e078b18e38707ccdcbf2c68d1b2fd2b1346fdc7827956eb85ce3388e4394097a3a0abd807263ed609545a0f1077c201783afcbd4743df9aeca66bc9e150a645faf17a9944bb3b3281b29493f886cf2c8268a8378ff02e18441eff341ef131414141406bd905050d0d7fc838282c0202c5bc2f1e3e3185f2fca05e8bf1b3ffe8d31e84fd9fb8be48ffa329a831eac6c843cb24891cf0bbdcf0b9d2e7477c69777e52524340a090999af50e82b59a4280b61d952ec5f1ffbd78b41e694cd41ffb2b0f186195fafd7eb6beecab7f5fa17962dfdbceb7fdef5a2cb1c3fc80433dde2b4f1ed8bce23f49db14f9a34bb4697d959c894a2797c725ca2f97e90d9f962717c9909f4b50a6476fe313f333eb31f332f189fd9f7313df13b73e272e85d599ae511cb967adef53d187ce333fb2ecb53f3f99df9ce64fbe01b98e7f386b961b2fdcf8cd33c2b3b26eda1a4f9f4ae64fb178cd35c6f5fac6b9c96931386e11aa7856fdd9d4cf84e2a85ef639c46df7e5996e53759f352ac27e592cbafa4529963762eb18ff1997db1d5a2adb72df3a9799b3621fe104d64a3dc584358e9122623e5c61a024e173899961babcb183869b210594280c9426c11624a16754471c499a6d5dbcc11b47a1bc6999f0b6ded1a80e08be268dabf2015c7b1d50ae2fd7d19fdceba2c5b02ff3e10b0b2a1f8c465faba4cebcd337d902c5224beebc57761cf8acfc4b72f8a20b994238bf43e259fd2a7f8e6d9e5fad73549734a08f9e00bd179f2db69203ea784809ff342ca079fd4c1ed33f2497cda9c834f299ac907f159ba4e27434ae55c666752a459ec7cc9224559c4b2255cd7f8cc7eeb814e104eb61f6a715a0bd32d40d44bf95ebc782929febeb3fdbee63d9451e0773e2b1b2703447b28e95b10d357a1ccb7325fdcc5ea6d380fb3450a2076b69c5de3c40e4fd8a23000a7b311bd0b47b62a47b62bfa9e15a755364ea3594bee7cd636d9c964fb5e66a8ae197232dec1d049b964fbd40bf6319872f10ef0d32cb9f30966fbb68bd5dbcc6fd9c52294e67bf60ecc18dd41df33815a077d8f641201bff99514e1cd77d2a96d43b8ac45f429e9d4368cc15a444ddcb5887eb845c87798f1ea97e5c60a028bbb726341004deedd87d55816cc03511f20e02597d9bfb7566ffbc6efc3b8ef73dfd7998bd9162abae93581cba5d5dbc011b47adbfd8b4fdb018871e0e7be6fd7c02d9c6cfbc1ea49d538ed1a9c8d05c4997cf3ec5b6a91a25cb1d4972909685320c8bc7263012126c3dcd8a7ef839b0c84977cbf82e311253e98b1965a10c2912d5baa0568aaec9e29ed9f47d9fb109c7612cd9438ed2c5170da19cbde7bde7b4fc469347b7fe4b4c6fa214df6be87d33c1df91cf3d9642ec867a35163413e9b4df6bca3ecbd0ea79df5bdbe47297d4aefd7fbddf46f37bb493391d3a4689ca9fedbcdf729b99424fb5fffa68eebb7127d919a51f5897c933f96ead36a9ef5bf173ff37440be8f8b122507e6fc877f2502e2f3feb85f972e8ef2ef3437ebfb52fd8b97e8fb7b1fe4342d4ddffbc6f2e14bbea6974b98d3e809da68233719a775f45f93c6c94dee5a477fcdafe93b1632f5ba4d2b0262d3214ab102a9f869117f479a12fe94ab17c596d958eea28f9d66e791442c59a4e6faa1d9366fcf75888e860c1639ea364db50c7e2597fc95bf17a9e73a7357f2fd9a93416a197c278138c952b9fc7d9342c61347fe86e87ec8e08b75b4e40fdd962ca524832f3a75b9cedc967cbb759ce05ff203c7106c8da1d9365288ffc562e8b4abebcc652d5ff2fdb265fe6eb7dbed6c1557526a85292db0b0cb53edb3fb179fd5c92256aae6a8fae18b69a52f5b3a1990fd3b37a974dd7b23b66bd192ed875aac64fbad26ec5f0bb0c9f7c526d064fb240f70b27df1ffe4e0f5e4f7c362414f3473dafd6bda566b6c8de37fe3388a2fbeccb6352946c996c0f71e0441d737c92482a10bfcefc556f89d5b21fef17deb5be37f26cdad267f841e18862db288fd1047797fdaa7228b50e9f2f851f7ed83f8bc3fe2d67fbaec99e487a64eb6d47af25b4fbea8cbe35ff3655e738c22dfb6fe654e993265caebab74f3a09eef535b956e1e67cd17535bad4ae15e66db4453aa22c92ac93fc5afb69242c4bff8245fc432f1c1f7de492124968978e9fbfbdfdf0f1ffcc0a88fa97ea010fb2d7cde175f14cd737c59eb5bd6c23fbc175fc47914bf1515be884f9acf5b44c4dd46b88dced6d722f6457c867f4d9ac396493bf7383900471a006721f7bb8e7c38ade6a82ef4d105b1d610a65089e20595ac2b5434e0851a5bd7222ab90a246e28b3a6042470c2d6b5c8bfdd67d967f504f339cbed4567e93b9091ad472dc8fe474e3b411f4e2b399026fbc366d94f0eaaed1cf3598eede55c3cfaccc3636eac1db6c816c3a847dd046257a4a2362378428d9d069e4063bb5680a0053524b8a10358d89a87d2bffe0ee5539fd50bfadd94a2194775d40520d62dd9b6be62244894744bb6df5cd426c217bdd1157afe63e88f0b43300ccdf1aff9dd1743d3c3d7144dd0237f901f7e35c11f4df16b1514ff45b33369bacccfbc7976fae0b75a4f71eba909e2f06bf5484df25badafad17abf9d9afa7f76297f26b5e4defc526477ce2f218d6d2b47a5bf9ed1d9418977b7dbb06e1e3da35a85f7e7d4b169965da4f4df147d3bf34dbf632afc617a94962130ccd16f9e3862f86e679f30c82458ab2f71e923225dd929b6e19fdcea0cbdfcd7e0bf130fd6a9eb83c5505fec537fbf79d2c32cb672e7be70af9ec074d291c45bca7f8ac4fb710ca8db50304f2a9cb677dd7e14d9e65ef456ffcce9b67effb5ba9e22a1047d1ef7c6ffe99de57722947aef8d54fb738cdb35ff32d4048ca9437cfb225eaff994ae1c81497efb7b794239ff59efef53df3c4e5b3ffe6955c9a654cb7f8acab8a84bb4cbfa621d2970aa22fb65a18f459ebb33e6bbdf8725d06dfa40dd6774a29ed7797c265da2a622b109abfa7266de1f3e6598ac211dd3cfdabcadcc4ee58c867eba53e382cc4c955a01765bf7e3fc56799e9b7ccf33ccf969502a7b4c0429eaaba19fcaa2f53e93288a979bf65766ef394fada64ef6febe6d9fe8765422856ae4fb172fd6b82669567fba23b6d1dadbfde5f530a97ed8327a5e65337a3fc03f16933f8d4acdec227f8fdb4e6934a97fb3ffca3df5a1c55bfe2a87ec752b87cd6dc7fe388fef5bdb3b212a5cd39f9ccfef59be804b1b2fd6a5217ca130493edf7d30994369fe02edbaf270806c4cad57a5eb5d6da6a5d830e66327dcdbe1685f88866d71f7d45d2f9fab3fa3a6657241f4794678f01c169e3d70f42c469220836e935393c12bf7e2589e8f2889bf8c8e157724987cb066cc86188c1ef003ea3b6b35efec5207653393ec5caf7759c3024ba8b3952905a74bf89f8508e7fc4670720d24379b69a7c9f480d657f548cf826dfa75cc238cdf1edfc8582e962f3918a44e445f741b03c4b8bdb89f23d43e4aa0c5291a8152fba3fdef730e5d967b2e4fb479c36fefd0328719a979b25fc7b9f72b9569c467fc456f2c5374b3a6e9f11b591bf67c6fc4f0a94d7765f870f476adb7d90c8ab7fbfac48f6ef37d1c55114cb8b62ccdd6494a26badd5bbed799ed83ac4b7d6c34f7bb451dfdd7329e9bb997eaf3dafdfeb8ff2babbad2ddd88069b7ac5b6d6b7f5bda7519ec54ddb109b28c4a7cefeaecd193139476eac35aee435d4ac41268b75f4b8d82d558b67c9df972fc692b15ff1d9e7f7b4f9e6a7e3fb7d85fdc5a74be74ff03be7efef80483b7f1f86cf9b052bd2ce3ff9e5ef98ed45afd731db8b4a2cfefdae4839f8d5428244e9c2379bbff14d24489420bed5fc8d4f622051f46dfe70d4883f9b6f16084911a57fe39382f1720b47f97f421c47d1f7f2e789f8d455b28897a95fc96125f259ad601e63f97bea350ad936c9b66f2c9f2864fb35ffa468bed8492c5b1c45dfe2fa16d7bc0d99fcb9b1d4f0922ffd4b49b20856b619e97e6f29984c4f1a26537c7edfdf772bdf77ff7b4b2a7d58b56a49253ac3b54ef3f049ddcaadd00074febebfb7ef589fd945c4ecb995983f6c72e0b3fa21845fbfc3efacecc3673df8c8f5c13a9be1f2f7d6c4de0c74877dfb999e54cd9e67752e2fbf8856dd6dfa9553e76d6df6facb5fb7eddcf4fbbda7665b69ec563e03dd412975d3afb4e9f63d13b4ede530968e447ebfe82dd3ff33ed874afead1f3e7e3b92ebc5efebbbccef899cf69519ccb5058666097312495679bf05a4f5ed345a0b77fd6e2b24cdf6a2f0dd6c13344ff01ccf32db27725a88cf18ad0f9a9f799630fb4439d7896ed5b8929b9a309fc5de7f28cfa0e7a0064293989d8106a0b3bd923d73b440fda622fbbbcfbc82e5f9d9fd3fcb3acdb3f4bfafd5fabed667afcd72dff3d4b04a634d8f95146271a03bbcafefa6f7f6b458943cec38d01d2ed66aab492a79debb69afac60b3d417459df56c05e9bb79ad8e661fbdb93bc93e6d23cfba98b25a0bd2ecd79ca3aaadb87a3eeb7700221d9a1065fb978ae0a8e499f0ec83b556286796927ebdd96c8944b162f0bb7f7edff781f656bf547ce2bec52798adf7f5cffef6be9f46b53d6f357b6f83603eebf73c7c2ac9de5bd39928a967de3cd067eed1ea84d8499d4ffb2d5a6ac1d3fb3697da94511e064187218d376a64c917e4c6426302d96ff77e19cce5eff42bdfbb27d6b7b8e98efb6ed6bfe6e956dcca67a03bfc6ddb56b82204ccd74dbfe233bf7fa5be7c475b4dabb35034de52d23f7d64db16cca13c61d57ec5407ad656964d2ba6a47fc2b23f0c8360883650afd6731fcab3cf70e0338ae56fade779a0cfbcebd9a04c1f5643d97e43d9f8b4997eae7385ec1528e97b14b04f24762c5b7cd27c5b4fbf5ba667131af827142b4329a3afcb473ebc1013b92aebf7f09953727cef3ff0293efb4ca64fe2b3d380233e7b4d88cf6e535b4f1f045b98ee7ce65747aee60996655966f7bfa5f830a77d2f3ee848652df217c5b74e735249c4b643286da6a4b5b849cc022c8ac022d7fa36572cabafcbefb3f2043391ab7285b3dfbc798bdfe037f9be3f91102a6ee1b3d394203e7b4decc34dc6e2b3df3419eb614c77159f4d6639044a2a551cc467febd82cf9c8792fed96fe8484317663a6ceb3def82e2288ef7e2b30951f63e0c5bf6bf0f9f9ebf07bffb9bc87adf52d4faccb6756b697bae6e23fb413efbd2e2b3898f917a4834073d748c711288a2688ff0f944b9bb6fb1fc3eb33fcbd6f35e1475b657f8be49a51e4f586ea5c6f2e1338bcf269d95ebbbeb2086a0b5d6da9a1f65ebc44716df9aa78fea235ba24c451fb5c89ffaa03e4e1ff4f3e983be7b29c7f73f7d647f1f4158191423ca5647b6effa769a7dd2bef7a266f82e9334cfa3ece1297b06c9de575229145ba5cfb2889b10659c9835c4f0923d9b5ba6f5990f17b567c42a2f47ddfffe5b31d167223e41d13c7d64f17135174f2859f4d979cba2689e4719f459abcc2d7cdebc3cbe37567939ca7bfb48d6461f74a4c6daed76536cf44511c4e767f13ff3fc20a779efb5c8ff7bd06923f9e59fb1fcd5a2965f295bafc369a00b7c6fe223bf1ea485efff324b9f890f9aa0cfc477895f9a312f12c5f74c98cfc4a7a4d288c1afd50fcdd23e78715b3c567be5bdfdee044a7fd1dab3c7642448943d269fd4ca8728c13f4bab1cb69b7c5a4a2a85b856bf6f9953362b7d9ed9997ab8498fc9d1e0c2136fb267b3f8f6fdc7fae6359df49bece1288bc18a6956cb5d0bb7529e30af3689656ab3100bb028228b26b17a466c7c96b947f7febcdfd75c6a53d2bfef5117bb98d21f7b67146878a1b5523bd28a461634ac5852a9d66a3d3670d8a02113e2f964c0d9805cb1d562cff0c0455c43cf1803e6afb1ced8926f35d7f7a6c20c37537c9d44dbc8dba85facad33b6035e13d70c25ccf842cdf0c18c1aa869460b222982b1828004cd7085695e6116a5151f70829a1fb000fdc011b40bcf969e917e40871e1e98cf113886e855dee6336884f970249b7fcd91dee61f844827d5ec1f021bab5cb7d8ce4e93bdd7f80e22a7f9fbefe824fb52e43396cbe473cca235a7ea4f5581b95fea73956852acbccb621dad79238b76b4265016bdd19ab12cded19a3e3d5904476bf264b1355a139677b2288ed6d4c9e2385a934716c9d19a4759748dd61cb3f81aad1966b11cadd9ca62ce68cd9b459dd19a5e1677466bda2cc2466bd62cf28cd6f42cf6c076787a7c5c78ea56e61dfd58d9da20fa94356f80f8e4fee189726cfa012b37744d9b5a9d3ad85a73a629a5d4c95abbd7905933a6da6ad754604d98355eac67bd3559b2afc1b20606ef7a77cd94ec269f34b7196417a5149f0b03e065a2154a2004bb886335cbd0329671857491ae32762608dbb8c6aa26c35ee5ab1ccf9439650e99ec643c01b63aa7cc8d45c6179d1d9d9d16a8253b1957c8d88de12683ad3a861919b63356730c35b0b1a2d9d1c9295f2e7214c316f8c15c3abb31cae4d336d61863c608934f708cab31bc34ed3569c8688204dfc1185bb28f7989006ac022b5257b4d43dddbbda948554c963fb82bad6257b2989b053c53a689ada945e7b7c948f58a17ed2a92aff122ff2713c32ac5d42b6bbcdd1a6fb7c6dbadf176949a5294e62b15a96d6099cf9ac6137305cb8a152e56565ba64cf1d9cceb2e0b1c3858debcb9e2c68d95366d7c367367e3b39953791ef635decedbf99a2cbe26fb7bbb9e62ad402be395120b2c4b4c4bd096f7b8783b2c326fda78963615c99be25969e36169e36969e37169e3edda288db7db52d36c2193464c4d53d56435969a37f9ac62b23fddc2858ea16068188a45bfd026a8172aa6dfacd07a7f9cf8fe74e7b4f3a353a8953fb542af38edf428169ac569a7a55a9c76120509aac17c8c3ac21668bd4bd5cc7400f5fcf4bc3f118f0c908ff7e7a02788d3a470783dbc2cb5c813538bbc9dd5959ab7c5f3e281f176595ed46ace806ad2946ad6c4d4b4f92d3087b549b2fee518830511e57e1b421bf9d75abd82e01622fd26a2f5fb4d6d8a4f53aa29cd748695fde9175bb2d737fd6767597cce2a3e6799a6b12236d159d994a783e95ee3608254a4ef22fa33f028d326e383aa519e4f46e97f7e779fb19ad585d844e7dd657ff0cfce02bfd35eb1692a92b7f1227f704dd92666dfe45df6f7ac9c76d2ec647c76a5227960bcc8ff3f162b4b7ba58c153358d06851e345fea7c7253b1bef4b2673259ff68a977cfa9630fcbd3368cca409d5a059d362a3a68dd36ea09b37efc1715a1967e3671c8daf3173e386ab91c93ceb865090a79101fd64a9d9e5d3db80de06b7c2cdad6d626d09d61ec0da23502c0a9e282ab94fddb8712de3e859281b3658a81ab742d150343e859aa166289cac2cfa661cfdca38bad5ce67eec4462962f15d8b962c59b060b972c58a152bab29537ce73baa71c4140ed53862fac67c9315e2ac16ce02719668da2b6de405688c3582c8477ce6578a31a6e403f8cc6358746181acc4675ebd60992197e033ff764464147ce662195564c94d7ce642bb12542043f199bb9810234bbef9cc7d6040234e5ec1671e6ee12189ec6dc400934f6f73269ff68abd323eed246d96f06967f9394f3b75bef5b473c77a019f76f6bccfd3ced87fef6fc378cc5cc167372820344181831294f438c09179c404439386517a1b7723f413f4f3fe15cb8f6cf73305e8e7e7c6fbd72b32d9fb3b9c1b37aa1599ccdfdc100aaa5632a09fa38a540be38a177596109fe096163e4b2f203e630da61686182f6aac8b4f908c87cf32cb8b3ad7c238e3459defcec77d442036d169d3642b56c25859819932c5eebcc081c3e5cd9b2d6edc6869d3268bcfbcb2a1fa3e5cd7785de364becf86b160887c0101042e1c70a0c541d06201417c64af50eb050c43bba5556d163a46791ed92b758db361a346fc9a467c57a3064d3d33bea34153cdd42cf2dd8c9932aeaf647c56a6cc1827e364b04410014bbdf23d112256aa15f8208050a7b4beee5acf01070ec7df84dfa3879ba3a3363e73aa5ab18e265a8ccf9cca5a4c14c667158cfda0a02f30189771d442e579b866f1fb52f4a92e6e2fe54b511cd599aac4bdc5ac6bbeb057c4b0ca27cdc23aca923d8c34d9c95424fac68bfc41173ec192c467191bf119eb4adf647fd1c99cbe253b7e43776ffca9978a64b17891bf16904bf92566c364a75eb23f4d5336561a37192b4866cf00d9807e62b1b7fab10949e1b059b5c8dfeac7062424f4d64b2d72a99725538b5c284886ed952c5b6a915b30626a91bfc5aa148cd2ed9535fe544df9c2676765ea5fd738edec12f43bef5fd9f8d7364e3bbbc87e7cffea86e7fdeb1ba79d5d802a9c9ef7b73ba79d5d7ebe7c7f3bc5e7fdad95d3ce2eb1d7797f6bc54da62f828f49c404c167fe3c26073d426893e9e7b0c9f4cb3599fe4b4da6ef4a93e99368f2193399fe51450ac2332fa22f0bf10902e1f6a2163ecb1fdc5e84cf583e8f62b8bde8c3e76710f4f059e613c4678c7ec5364d8ff364a04df66f9a676df349699936922204a5ff49cb4c39b1514ad1326de44fa5a0595ee4dfe6d7c4d264a767b23f054149ffa465bc8da5ee0256a66fffec2c8bcfc6e72c373efb4daef48cf2a45bc05893cf7ef30629042ff23f73264d9a35d94fbae5a4fee7eca45b68a7a55eead32f3ce7cc7fc78c9939a6f93241d2ddddddddb1720fe976a86d416ca2d3b7642f4dfdc93fdb4cee6fd7ebcf4693fbbbfcb3d3e4fecef9b3d5e4fed6f9b3d7e4fedef9b3d9e4fe86fdd96d727fd3326e7293a163b0681362681830f48b179f913ffeeb5d7feac8f9f2cfa39dd739791ef6a70f9feff993839f8ffdd958b207fab3c7087dd09f4d26378e8bcfea9f5d26f70b992bf8ac7e9049b7f8acbeccbcf9ac3e9049b5f8acfe8f09c567f56326cde2b3fa3e66139fd5ef3129169fd5e73151f0597d9849aff8acfe8e5982cfeaeb98d48acfeae7984a4c6ae5b3fa2ff3003eabef32e9149fd527cd233eab3f9a74e7b393eeb4384d7493c569611b2c4e6bb1b9e234708d15a77d6aac9c76d34c719a87c6774eb367e038cdcdf8ec8dd36896cfea676565f59bec7ff69b4cffa45ece23b0d594f4cf59a623f9f54bd7d7fbafefcb13fc9cafadd7f91afece8b0ffb3a3ecfac3e8f0933dfd431636669962e131ccb64fa229931993ec841a6fff9c8f46f8f4cdf3bcaf4ad8e4c7d4bee219d8c8211109be8ec36d99f96519e33baa66c2c30b4f8a3f0fe4dbc032b21dbe85f824b7c7f253de1fb1fe07b1cf9556036f0fd8f5809c57c3ecace8bd0028a892d9fd747c18d38e781ec43001a632290cf4771615cce839c178eeffd897489c546510c7d3e0a89713c2ff4b0978bfc3e8af95560b698388e6108b61eb783a3e07e7e47fc5eae8ff24f86e30882412da0c7c970941f8cbbf13c3c5f28ba3ecacf93e00882ad165050ecc716080414147b530c1fd77a1b902ce871b6d87fd87af0713997c216f438f2a3003d0e1ce58610bebaff8960f8b82a305b10b5a10a383cd86418672564c301e1d6e76cb1c7fde0d6839fb3658eb0c216c35268aec6b1b51e97ab575021a3059b0fbe3abdb71fa507e3721ec48963e3c157f56118b7a383afe8e7e01cc5571613391b6d6e88c1f6c257a77d8a3f0c9730c8b0b9f0d549bfe220125f9df56f9411e372148625428086ed7b5c8e5e41850c2936115f79b86c36dadc60c516e272348e08389086ad85af2ab634093561946103f115c56085618910b0b17d18463f50d23f6dcb749e8f67442b34f5fd942b4f95f76f3a79ca3e50fef02d96c1bfdd3cd57a9f3cd5c2b7328b7f8be5f06fad3c3596b03c35e25b995d7f8b65f26f639e7afdf8fdb0a9aa9c3cf5c2b732ebfc2d9673fef6ca5325be81b9fcd7549598a776f00dccb09fbac572cfdfcaccf3379ebcf32d45dfec6eb1fcf353b732c7de67ea56661c6d445fa87798b58de8c74c1fb37b07fd1e53d646f4794ca036a20f337fda88fe8e19d446f4754c9d36a29f63eeb411fdd2e46923fa2f13d646f45da6ab8de893e6ab8de88f66d93be88b66688a6d44bf658ebd833e687e6d44ff33c1de41ff9a3e6d44df337bda88be35636d44bf9ad7f60efaba18ad5888efb4eb7de0b7be3fa8b1763bff306cb540f05d8aefbd294c0085f7570d2d67e070dfda32475891cf2aa14cffa46568d1058d5cc58f7a2b45e3c409c5f0a382825a61ebc116f85130d8077e1f5596dee77dd428453d7caa80235b1c6555c0912b8e8a025bd4eec4da495355b15cffe64d55c932fd9b87e0dfbefc4d55fde4ef6f36dfa9aaa07cff46b33755e593bdbfddec5540d9ff56b3ad958a553bdf0269feaa5af9cbc91f1e7df6ba55399d5405cb17973edb817918d6e3e3df1f731cf39925833aa98a275b1c74c3cbecffd1fa00d1ba6cfe53aeaa8032d057b9b6fa525c3d36f0fb632f9bfd2957553f997e95cfe6bd94a0dd6e67abe263d3f97ef082df4bc1217eff28da5a3fc5cab3895fa5dac297f24ab3dbd9aaecd85e1d4ca9a2631b9f7cf50791b6f2a758559bce57f16c392fe5b5e3b1f17cff8fb69d9f62656d3c5fc5da602f0507d66e67ab02b3fd7430654a95d0e6f353acaeede7abb82df6525e6d763b5b151da0ef87515cf6ccec9ed1ff31839a07fd9829d43ce8fb98379a07fd1e1347f3a0cf63fe340ffa3013a879d0df3165cd83be8ed9d33ce8e7983ecd837e69c69a07fd9739360ffa2e936c1ef449d3d53ce88fe6ab79d017cd56f3a01f9a61f3a0df32c5e6411f346ff3a0ff995ff3a07f4db079d0f74c58f3a06f4d9ee641bf9ab679d077d36b1ef4753417f39ac6af7bee445edd3ffbb57ffcc6effb8382ec773d5b615751657fee523f436ccb9303cbf97ea29cfab6ec87e9e4e4bcd54ff5febed5cfd8f37d4febc37eb047fc91877cd75b01d960f8ea8c7af94c07e3ae4e0af3590ebe3aa34a9f992fd3655a7334413334834cd01c7d46ff33cdf7197dcf7c223377752eaf60884d048265198b810feab28323683ffbf575588c5ba116d5fa419eb56ff5636b49e180725fea1584e8de47a16c811f3eaa45f57dd4a2fab5771ac685508bea1fa945f595d03f8fe88eba9725b6d3fa2d8fb702b2c58e62b81c4fce0e0072843884643fe5d0f7c3740c5df0563fb6a1ef7f1f23fc3782809c2707003be310068fcb5920f3e1217a3396a3020a3e37f445df1f6464f4b89c0f4fce4e056f921fcb5144c1e7849ee8fb410c781c615cee68c76c280602c0021f19002c90f950c073f4fa1c8fcbedf80a883e37fba2c7e576b8664326002c0e0bbe07a6f3399f2f8d74609c1590ed028ccbcd864c1c163c50ac07a6f3391efc8fcbf1e414e1abefcdc7e5763ef6b8dc4cfc1cf86a7c5c6ee82bc057adc7e5849e027ce57d0ec713e1abfab8dc90638cdfc48f6338f0d5eb062e5d03217ce5c265100665240ef2993fd088897c46451cf3997f0c97f321ea69e1201e7c0562d80ebeba3a1eb639f8cae27248473a98837814f42f58a9f339b1261474e371399f2f753e276bf2e7af9aece4ef733ebff3b89cec5ff8aa7e2ef63cdf5f963e3158cf939f1bdff5fd0f54529dc7e55ceffadccf6e84fffa795c4e7cd9e7c8d7f97e1fb99c0f7a5c6e7c20d8e3723aeff33959908a84cb8d2f84afc0c7e5c80fc257f7713919be02c257e1e3723ff8eafb58eb733e0ffb7e50e7773ee7fa9cc7e57cfc5f8fcbf5e02bfbe3e7cae7a1b82ad486cbc1f015c5b19d1007e9e0ab162e73404c54e22b98cfe8bff055939d7cf1e3722e7c45dadc88af6e3457dcf8caf1f83998aee5f64a6ca2f36b8374bd78517dfbe778ff84e53328f7977f1239b1514e79fffaa6127944aa71dcf1a10ac31f2ab20bce0ac806f4e453b95c3dff522f1d9faf94fedb6fa73dd04f18a33ce2b8f30f7e3b8d2ac7898d528ae6fba68dea77a6ca791f8cbb8acae9c1b8ab28578bfccaa75f946fca384d0753e9e8e05b660c554e0e6e9f95ff6195f8bc6472fd3bc6692e4ce572e13ba60912539124be4d84f1e2b411538d23be5eb67c719a88a94411df2f5c6e18a785982a0cf10de3b359fd16a66ab5f027c66715ebc354df4bf9537df803e3b32b26572afa528ea3a4681c2afb9f177c5e3053aff7a76194bef3cebc69ac3465f2ffeedbf271719acb678bd3c8314ea33b44619c36e22e609c2662392dc4523878befed878be38ad151b9b701a8883bc38ed8b813ef62aaa4f9095eb7f629c76f15554ec2a0a46afa2ca3871e2b47162a3b49f1d9f54cabe131be58f6ea3937e51d22fca37f9665d2f7de6dbe2b9227d5bbca83e0896652c963f9fdf96f3beb959f7cdcd6a35f9bcbbebe5ee30c8a707c63be381b1693cab34b07cda2b36a664a884e9542b94a99e2441a7109a291226003400d3146030482c1a0dc80382284aba07140011a2a2525ea189c32847524a19630c0208c88880000c00cc0c401000d251059882096e3f5963e35450a22a35b71063a0ad52496b432ebc70c7551080bfcfa1c9425b1e41417e28bd829d741075944444b7fc17508bee39b74c0c61dd27184360061a42b637a025d4c6d5a5b7a5d01b81052c883c757321c68ac01f1e003e04098102cac207bd3e12820f8f31143eb4040f53b78e9c895a00e30363522b0bc1fd309a1e20d8771bf7b5f7ca4cb437e9feed657bfbc351930f984272327a061b72e8fc17a02c314c815887b13728818604533b7c2ebca2cd6b4d6edc6a2e17c1515d492bdd135eb4bb6a5e8dcd5b5c08e772d4e62e388b2778576664d588e90e214192d03b6b3d6d39c4fb809c7885495473c5213690c56f153964ef29f1e92913eaf393bbd987d7cbabc4b2d71916e79f7c5ae36b3da3143a5fc40d7d36d778055f17bf61d20715f8cc5d7d4022e706faf4746086bc89fd4db5137b8a3c65713b6667d956173e8ad756fa501b2769eadcec2abcadb851d88feac70560c4ad96f8f5347f2a4012234c81c4081bb52b753d11157dde94bf0c5f98f7ef608b65773696161517270368a57aa23d3c3122889ea12f04158e2b5de2d360a72ebd438c303f6e48914b0636d3f4fe15883438d8b5f1261d4ea4cb7013ce619df536fab9723d7308fa5c67bc042a46bdc865a5cba1e2ea15bf37b29c84ea202cbd6e279b8d55d2f2476fc7e4e627a35ea6ca796d9a3c1c7b3868b963298c8c380da80389520d1149510ad1954c4c7b9e002cfc87bbf9f4becb3fb2c2492bed5866ba57a83c4919f3c6212c75f1b1803de7041fa8b42146f21a7e6de71e2b6968a5ec5793888ef082927232d95ae0651ed7e5bbc7eb3b69ba61350c24b17558ee996afec278f01ac040c12dda43ab6bc00e19d6793003257ae3f24ec8263e9351eaa3521e2ec7811a0b489d876097dab0f9ec46c83871116c1cc9462b2eb55e88f82ac2858f804bcc66e3c99e901323d5229d47e16997e9da0d2dc0e614bc10303cfb39dd7828b3ea470fc8b788216225c91f9eafc5cea1b65e8d405ef6bd57db209d41d5ff6743ad2d1222e0f8c9a08eb11918663831b999277b28c934b5d4a189cd4ac403b3743b8a6234a356b918cc961f37433662447508d2223aeb18ca911da4db1bbea8312260b51fca4118c6c0d778abf1a31a23845ac21b59599e483e476d39290169a974df94893482239138788f5e2365acc241b0f805a68d88f6fd0786abb42d5e5ddaa676b2e7601c7b9e6cffb90483b7a7382d2a11b3ab00edb9d0d1a980c9599bc7432e253de376104bf6a9b6b68c9e82611f2f5ceac2e57ba92f3f3aadd9fb7afecd2dd6d65a2c47ac79739079d72079041b33b4d5d52f434dce691de7e6a0a35f7d2d72b210aa58395a8583110f03664a6e478c8feb98c206e796dee42800de7f8b9217bfad8259cd1e199f89f4317534609234ef3ddeaecd1b76d286f8451d3e4333ace3100390711cd12199e87c941494ed1252ba2b52489bd11ddd3bea80a8fdb46677f3a52ccf3eac2698116af02bf2e30417ec637a96d67f4620ce83f8aff9cd39adc07b32f57b1fc699b1659326d6932b9ce270f068a1739aa2458b469081fce9e965cc0b2662db99c35fb5858c969c72f38040abcacdc284d70932ae8fa24c04d0acd99270b42e9af71859a68e017c7bb4140e8dba22b3c7ca6a4f4ad4435c4c8c2a4881ba01bd7668d59e410e705e8df13cbac599cc0df540a1c9972308d9732624d7232811acf8dc809d0572a55e81533062a44a7581033e6ab2809a8dbb4e8bdcf45f1723f0db8385a9ea2ef7a69aa4005c04f35d0a26b320b43389fa1af434c65ea7529ebb76e18d2b0fd3a860961f8bb522a433dd4c01c89b7b826426034f56a197385a4eba074bfb100de7ec1bafeb7c70d0113371c8c6c0ea5448a6d6dcc714243bd800b0193be470ac4d2f011654cd14fbf9423e42bc716c399c8ace3ea1b1755ce9f5249bd68219c6927ee924277262b00e49a52dd7997ab84ab8a883a27dc629400e0a35b291252bf78866300362d68ec366c060551caa6d82fc34fe00484f2c94acc16accba9969dc8a3ceedceaabb0626801d44a9a7643f185fe5b3fdb18bdbb405dfe669f352e13d5e000769e5811cd24595f67c09ad85b62f6948e59303f5dd2419c8a29067cac2f29e95f8f40aba18fbe9f49ed2dda324402624471a100aadc23dce17faeb5327aa81e37e7c8bc6a3a13ef3d66d5e09f61e886d5f3e9dfd0034c7f48d5530a94e1f2528407d04d3ba19aadcc299a976a0f4dbb984d1dcd43bcbafce1a15e31d5fe332660419d0172287aa1beef3b2832d474fdfff8cb73af4473f4d438295ed1109be6d214c5ed62cb8533ed73ca210f72f63f852dbf3a97469cf2ffdb91716eca52a96e89332f36f680c9d458860b0ad1b1612e15b6eaa1631d80d072c5f83f1cc1950dd40277ad70297ab94cf1ea20201df4598baa210474127494187407139416fa67fefeff43fca890117cd2f46d2f3bcb3f292a1ac8eb0370a9c55b5f33066728686e441e0c388af0cdec8f14494861bd2271c8643de3de82b052b689b1291fd5228c7c2b27deb7f183b12471a5ef13441b7e4c03c25b2a5b15408306ec9e843015c23430e54e19b96a4a9be524aa52db663d71da692b0bea0fc67b213222cad8e2d2e23a92792bd926b2526ba65131f33b2975b3655d8be63592c847b5c0fedc0d999809db686ca768247f9e3137f2ceee749b55264c96d71dede0277485257b33eb04e52fe548e3d23e0f729e1ed20277f86924665f002ef426f451445c38d55cb1b7e444084c9ccc345b5a5c6326085e1aa502b3c0dc4834de8414881c97050a57a540705a592f24912c7c07e07e509d1bf6a80cdda4f41429c28858a50f3f24d042036c7f8f3a0450fd4232ef17d296ad817650d37530b194e2cfb3d0fc8e242c76d54bd241f070d08c32fb8ab34e2e041cbb3eeb06672bcdd01182728f44fb303aaa20da0c79b7d348ea8f92b0ff7111a2a47ee048a42c46094e5c7a75106efc5fcda2ca56681bbe88bc10341c08aee64ada3040e024a5b24ae0733b08780a06a434faa9d5028a277fe86e7b0a7726ea5e5fda7cf6c3d15f674142111bfaa7c0b3fb52b4b4dec2d76e0407d2c011eaf3983aca864ef893d03a2371069ec616eafa7905f1bc06bda15dfbd687c038c9e154d63d7368a58d391132d8f7f15b45db10ff45bb6b558701264797cf6590df6e47a34b8807a570d47ffc0280aaacd37e2dd799e81ba37a1f970125cdf09d5cd7311d7c69027a60232afa470029015002e02789edb76bb0cb68a66a296a9485b4269c47748b0ffd1d95771932694dd76acf375e45627c52532e3c68e0eee862a99f110ee75f88be4c44cefde007e963217653993091893e519d784e2760bb2edcdf3d541a70e6a3bac7e828d0f4ead068a916f73fa0e16ab192955d763ffa7a8c298217d71405873264cde267d7e1b287d90655397a12904c3ab3f613548e824beef7dd206f9056fd8e4bedb7de19c5a55ea5fc9b339f2eaf74156600ff1e7105db6f578a04024a930d699b34296ea9732e0bc64b5c2c26d5279b084035a9d6215442f992f6895d367aa172e87c8290dbde8da872bea2f928f57380505b35111ae17faba1cc53a8184210ba8e6e1c1b2a8abbadc0491664b7f1bb39a061ac345e36cda52882c582c5caac71265036d3ccb94dc9db4191d367854b7a915441d80bc81584ac860d263e85b368d1ca03577aac26f57c950ad513190fab87cf6234e14791b226479d9b763e7307e0fbc20ff8c29257e7779173d9588968a6bde3fa76082d380efd1e9ab496d9ad2425fb7b842352e567fe723ad3597545018ff3f8f16d06ed605d7ff770aedf543fafc400ae974626d95027daa3240f027ea89b0a6fbf046cd5873ef874c5fea5d24bbd566016775d3402b61943c93f69a39b9ab29cf37870558f1403a0486ed1453034ab3ba414750bf95d77b182f80d961e1d83977720a78af476a2caf516d339659ec526ec60533c0ce0dd47af20e845fd3496a2c30c8eff92a0a6068fbc2701fb1bc0ba1e79111ec13f2fc2085e996e43be304c4abbadb9c18f5ab246e9da62b684368a75984c566fa0b74a75cfb8241217b3b4d0f9a609936747936fe032faa3a04097ad53118c9fb0c0088fc08072af6e671e58f6dbbbc2edf0f3cd6f39381b99e417b93ad941d1e43c470660f4027f411bf0cf83e722a1f5d968dbedad3128485e6f711ee70a93a5a56421c033311b63084af607261cbdffc7e88a9650781e30183176f1e50bd2a412d0fc26af2570b8da25262bab3042157264968343cc9b2c8e38e43fb0fb78fc8ffd4e794bbd6da92f819131b3254dbe45abda362c2b32c6f6382c9cf23dfa2244237e205c816fbef71444c84072074217c1ceabce97b60b3a83efb0dd9b27ca74923d70a0373c7e8c8748986f3629957230c0e041a311815d85f2dfd86d2c55ebd321f833134b627d9657f5dfe8be59a1eba8bde2ee6f0c2650b4a851e0e88e75e62842b0c6bc95954f058a7dcf334316963e62e93ff1e95ce57bdd14c6da26b4ad9ac84643749fa7e3e5a10854eddec5da719a583dea04211d689ca5a36ec43ac107280eb175ecb8128378a8b3cd87ec36ceb705216f22614745b0cdcc2e03c888c8463fd165b7124fb817d6d7b308dcbe31ca5d3d8a6f38e027ed32e2f01c5238e349a00c9c11c4568b66a935aca477692411450302f449de7036860ca278f2a00aa6d6b6a2c26571628015fe8458189ac43765b3864f03c6d7cd3f681be9a99ee2898416843bd04bca520bebca0c04d68e39d3a2601b7695a9044c42c8177cbc727c521cd901ed8f60a6856e5411df79b8253fb102fb3bd779836fdcd72dd38863889c4f850e2809cc0c5f70deb5843071456ebfc7d516ccb854b4187ccd525807c95cfc600eeb6bc30f25bf48a8ee59585877a9f3e9884c6303e58e5f91de045c1374ce477768eb6cf466107ec9aaf7b86b69d1e070478fc28248bb57e1b2ef93dfaab5b43f03e7c6e46acf2ab64a46e2b040db8cde3bb7183102ff9fd5b701800562ab3dc52586d24bc8008705e67b759cdce5a11478cf3db739eef552a869fb6962a1d92b3bf287fe28e4517e917da318d6a1717864296180f1be33b1efc98a4423a13f14e34a8cc04afcadd1c1186fb2d52df5ddcf6ad55d1f87e21c02fff59c1fa8c17f6831d45fb11350ef0adee91b21ad8588464a19048e2916a97eed278eefbc0f5fc56e5bedc46e98e6eb2d9f5897a649c1d08b5a9e2d43f6b07e5952c71a5c86469c7870327894fb2c5ccb461681215f7b49d7ad0e2bbfae900d8acbec2bad3cda6576688f991b64118105a18b312f6206ce7f7b3092a155b8b7e10fe3cf14e02412be2ed85636e426cb4e0a64e71b450da36277178565eadcd5a79a831e8e6be1f80ac12e328666f9c2771aeebbae6658d5581db2a7f588cc856cd8b604d37d0a57a75f5e55f2f89db4f11a9c56b91ffda940c5eed72c023f87a53c7e7a206d398ee3be14b758d8e8b5d4c4ceeee1a45ba5288f0297ecd109c1bce2b84bee1c830e1d9587f2dd2de94be8420a4dd33fb59f5a94dadf0456b46e321f95000af3d523f4238ddc0737a08fbce276bb07707c6fd11dc43666930cdaac40b9d06f8b75437a5acac9f535e993ad181a7024c8b2f47fd1bca4cf8801f8bf2fbcecab0c322be3f644b4c20929ca41fdabe9814839f7746c6952e6dc7177413991ec199af4a8c29b75d6a3d743855f4e3b811328f7e1ee13c10a1aeba4e3069674fd8d299a1359dbefcd7b9d27e22227e684ce1a511b9cd59c61d53a9d10179c48d88d678652fabcbbda74cb5fe932827a38340a3e3290a05bad987ddad18c0b95dc5a5576a873166e7e4379c041f2b5ffbe13d27652ee42c71518020db8baab31075bf4095c3ca15130f964b86d027d99b5f093cdfed0b2c604002ff2d66f572148b6169dcec7119980573fbdda82422f24773d1664120241911ac01de09592197ff0643a3c6abce8125bb8b09925ab35176394bc83d250d4017278e2e40f1ae5fd58b6dea4ab7ad4f1bc0d592f513ba0e85e969e28daa7bf07dc0f0357978aeeec906fe040a481762b1ce55487075a38145660c5806c63b40443b1034f9cf5b94a508248f71e90c3395de34398715a6d4b9f2be27a5daf0bd861bee18697ef348ce15265e8488e28e2defdb7e68db445b22a551ccf9190c5d3aa49342d7c4a1ceab280cc932d05da0c99ae92382f1a583dfc7d2bdb166a627701584d383e869e051cb103e6068969203aef9f0ad266733e3acb3da424c020f870b73efa4563a40a2a2ecafa53dbc922843065a215ed44d9099023a1990c44b5fa1298a9d452aa4bd21daeb5b128196544cb46f2ea7264054e1e6222988a6d4fcace07de375bf57680bac580fa0d66d60a2f7e4b5e89ee3e4ba7b640b400345d28f49f39afea4f9d9086dc1890f6c227cb5b2257ceaf4e039e40519d6e200467c31be8efd31d1799b71ab85ca946f1ec2a910a8b94d48ac212bf981fb36db853907a010ea6b106b98601bff0db2d48db47b886fa0c89e0f06db0b732ed1ddbc14ea2196185b594da9d7c565a8fc063629d7d74e5c122885c17aa90c3dd4904e38422841174bc17c9408d9fc5dc30b90896e87be9c2a87458b023d14387376daf4c040789f9c634c28640bbc6690468b41bcc580d825809e306283f71a6afa9fa8eb5284520b13b1658a65f6cc7eb56e8a876549cff1390eb386230b3109ad8e01b7a9a10b104932361771e876d493e84c11e4cb6377ee1623b0a8fd48de1b30992174171188657d782e28d6bd8d2db9d3cd95d678bbcc337a6e80c6e30c0608a3ab9603dc1fd8b11e27e79fd32877edb8037bdf7aaaa8e04a7d52a95c3dafb1b0d094787ed5b0c26dedf4c65c55fb68ac5dd38b3811910e6c7090e8c71964dc9442354c025bd646426eba67799c67b1e04eca3f203219040ab7cec2b5b181a820cb8fc31bfd1cb46513d9bde20b9ff30181e76fbf225f6d79eb8bc1efbd139a761824a737d56a86a868e1471c561d83617a47c0a7fcac1e7818c801e7d4b52bb0835e378c323d97dea9cb9dd4cf29863908c11656f3e36a12e1c79a35996ac73b832dd3952afdb3746052b37a982285546adb2bdf662d7744b6853721509e31b338eb604bcbc7688f6e393c4ecca34f218ced2d9513dc19e8c8c95d6021f94db68f0c973bc05c09e519a576916e46513bfbd2e1f046432e2718321ea3b9b45a8beb8e7926ce7b3336480ec19279c3dd998df8026c45656912b53f993e5d33827d0e03709088fdd2b1b00228c8f51c548cffa3d6c75998a3013b569382123f4d30c4c6c6271bcdbfdd4b181a76aa066aa8ff57042bc4745fb2e16dbcfe1ed4f2d36adc3e6adc0042e3dc4f4bb27037447601a8b605260617a9434e5664bf2b79b44b198370b3ff49b736a8c05bf854c07b5f5189a9a6c15f80c7a289dcb4610082156311cb72557d957c73e114bf271158ab0ceca1ea85b8c7e8da072300b5180e14fc2dae641b53151afe510db7bd0ad7ba880ec5e0217d84b0dbaf614b9e0de35a3cc9ed551afa437a10a5706082ff8816da2c3008e51e865716d7ea8914c4d70703ebdd522863704b9ecc65709dd34ed8ce52406569b1773198c4b4a3f2563acbd7ef442134381b8058e55d8411ff9e53455ccd07ef6a09caecfc0aed28810bf7b2ebe74c14118352868bd103f46cf6004523848b52f081b869d0fc53e21db2d7a0fba31247a38a0bcbdee88bd022a38f7dffbf77d7a5672526f1a4ff6a564ed7d90e15a1378971ccb6bcacf06ab0946918e805f9a97823484871c55f979631f8d8e5844e357667aea87efac3515c17d985fc22fc061e87dcc059805075d9967612c8519059d66a8dd44c71aab55a39850238b71a1c73c85f2b4dc2aaeffeea5ca2e31b05f7dd0c4d8b847b2b6bcffb79798c5897a939224e12005fc7b294dd806be34bd4a29ad4e9e30ce7be4d601d075bbc4f410b4abfd5c77097c69e4661ccf163bacca75b2a5779be9d09a61c79e71a651016c00f9db1045b7942284a520c6f96f7e10e1be37c95b18d0c893c7aaa10680cfbb248a4cf301b89d87aa31d4ce7a8773d8494b3b5ed0f5be552473ccead6a8ed41c58af0c341999671bfc404d8e7bf0acae63698237514a4772c3e01e4e818083c1081ddc6df880101c32a46f2f5ee6c37bb99b54388c1801ed287cc1b28f5228b93614e46a0ce7e7985803a3344d49be1ca6ff5809445a0dff190b4c29c6c651848644c9f1329ad25f7cbbc8ae7a14377e38a281fa7edd5347546d88e521c50e1e087c188d3b8b4f29d05c06caff7515f342ec5881243fd6c857f0ad7c8cb9827c9a74a4d6d5ebd179469411bc5d72ac9a99936b76302290aaf31bf667be193e8f178847eb372ec6b90ad72fc1e1f2d74083e9a3a6caa34017b9551ef6c3df0155a9c6116d80a36489ce46890ab9681a04a530a2d218c90263bb0d62b47f553756b7e189c1490a1f4220e20aaf209392b97c22fafccc91933b6534283b2e459b6f78716249aef86d96ff1deaa045d031400b8e99aa37dccb1d428ecb577d6759b10de4d1b74fedbd5e7f05e44d6cc85bc2b7895fa8bad6bd6e3aeaa8b71e2dae7c0d443e4aa0a5dc80a010ff77742c6cf49aa1365eca038878d0183e2164b8e512b05be63981f515255c81893f7ef1d06febd9a28ac844e671fcb724eb0326f0405c92cc588e8b9c51901b0e679c803a0a5cf69c1ff3222d04df2fb91892e768010e4fb01c8f6c063e84803ca22ab502c321b1d5d9661dde49f07320aa5775a6bf25dd6969a39996b071a655e094bd3d90fe3fabaa68bf3141a41b4de0ead87923005886b985630300d4f1694cdf0b9807633f42fb85cc31603fed13001d969080e7be1a6d1286316ff8fcbe3318c46b7ebd5e252dd491536043e4e6f7580b84d9b8ab7a9cffb66c0ee270b24591cb36a64488bd7ee73cfe852d7353138df48b76da0ae89dab413f4acf5b20d55dd356254ff7e914cd0424d9c8af1a388691c071d08fbf0c57080784e262bb4b56d83c94125d1a8a5ef1fb13bbe70215f1f1f93b27110fe748054a413128b66e78462674a2ba7cc2991e15624d185cc774cf354746d867154eb605e8b171f1d2e101b679c8d18323800280111846a9e3bf73fe40ce410039099eb727df77e6bafd19f0624f0e867315c19e929dd43ac810af947f00c0a6f09adc8a2003726641d9c822e1b4b75184595cc0cb432a05bc40d03589f477e135e5c066468de2da057b31f6a4636cc829bc8dbe85a6b70e48bd03e9fecbc2174b30fff3ae24afb341315a7b23ca6b2e0a74c76a1cfc26f745e4da97cf062a95e4c3ab027fbc5d642186fe846dc0e405da327578bcebbbdf72ae44f1be56ed857437a9521e6f1a2e33362c9426a7b5e1625094bca986515f8801a9ce113fa367f6485e6cec0f074c48845530f083e41991bfbf1361290552714b0f6da2be717ff9f898ced9cca9c508669865f9fbe808ed894d36fc3a68bc933c27578a63492854f200146bb589c1595c3aa2128b790aa5025531eb1c0ad03dfcc019d4c95181a917bfd90fac6733b0aa3333da753220d3933a8f59284438e6282862359b35d1ec343bc0896a37cfb38846119a06474ef54d0a4639d602a865258dcfc1391016b813690e76222002591ef8d56b25eb5626b34d0a7d3ef411c82250919b209bc121f63fffc6851fed62cfc054d61fbb1ec16b016771febc497299412423b9b5b507518d0b75a07f4408d6c3e542b8efcbf724e47680981825d0c382e739d8345f0c13b1c799ea2ce1decfcce130a4832feb04a0bbe161fe745581bcdd278c09b1a1f7cfa97060bfedc6e0a71a5c7a44c8fe52f3474fdf2bcd4e811e5da2f4105794a8ef4c4367c08723a3b7c666bc81d4542adfda2d862d30fc22dc16802c29a3143d809e10a01ef83232cf9da66430e24c90a8f795c684c64414d52f8beb81707cfdf5dd9d00ef826cf18b7d723a0dc0800564100ff1410f9655396e7aa2a58dbf9eba235e493fdc23f8e69be841523ce6c7c9c16d14dddb3b1fc1a31fdff94b967e3fc6424de5a85547abd5b1091f98259c9f8ffdab5695f1b12cd3db9f0b9ec5ae174028acbb001ae5309ad05814c563662026f30bcc58caf0cf819c76e9110821393974471fc59fea621004e7b290e0ad8bb850af26162e1d6d6cdab20691fa0600cebeb3b75195f88886f01828b088ac687b9d8d142bc1171815d54a09625ee7de429b7bdb6ff0be374750094b48c63bfd8ef2dffcb33696ca090aeb95861f37a21390ed5b2bad1a1b04f6f049580d5e9a710ab12a4440d252d98e2cddcccae9ddadf2a5c76918919f267d9c42e716d55bb99704d9c933f75c88139ca83c5657211c97083a6f3d8008b74cef83da3dab828fb68d70ecdc511c1a5dae3b7b60d79ebbeb5e260f356097ac9f5faacc18a13dc7714d37b7e920c870bffd53ae762b525daea9d6f98fea80701a38ef92a9b2cc59acf10ad1e9212055d5b378b3144efc31e58e2223ba2c6123ceb623b46b5095e86e6753ae59d3fa99f2a3e263282b8e9a42085b19ed06a5f5228e0490c4bfd4929aef56d2c522835bcb1150d07ec644227363122a3e81c88a0702e40bf9130736385259bb40224c70181214c27b18b1d2f16e7e195a8fa2bdc6077abf79cfb658854992e7d5555cb048070457e0f0ac7cb8c993e90f5fe48fc3b25faa9a385df052347cea9b9fd11a94cdae668ee66dd9a4512d3a0d9cb86b98ed612876ca1893054a448feca4f703f8a42d294714ed7a7362cd4db255b172d0455decf97f3cfd0d6742c16dcc329aeb34454903eab79f342706a8774166f7054f5155c7526eea5584f8b63226759bfb92772a58199ae8eb8c38178864b99a4a2bb28e8656ed09fc31cbd6f1abe99b218479b6e8567962151c48c4c56e7878203a2bbb03e8301efbcc18877dd2240997f2222ed9347544c7286c02963efe93bc4c3ac1ce67a073fc0f65d474e85dca29dfbec79a66c74d9da75fd54466706e9ee6ec830bf31808198b5121659beb0ee75d9296f825b8f2c741f62e600ba6f8cea157efad301a04b019f37f09777ae7068f8462c34d8a327c6f1991c15614460bf56aff32cb582736ab2cd81a37cbd1e474513f4e9dee94ed06513b5b624ccd91e6d0286895163d77759c8b9e9964908236602779fa3d5c890a2800899961cc4fe431e4d91f2aa908ce347a8399f1c3fcd2588552e334cc129ee033342ff8cb19d0273fe3070cf1fd5c927357e8b6e88dbb62bf0a0f6b69d43b76da5b41dbfdda0b61a3a26f9b609a89c68b34268fcd4e381d79215cc1ada0c34ba42eb99aa98eeb2d4664163c76bdf558b11082cabd75fcfe0c9857e52b782090dffd00155987d55ccb5ff0641c9c1281ad354d7571bfee454f5d8db4901446b3e643cb7431c5453e2944b9017ee2c4650090d44c7d4c7966c7a658207fa2c0569249e0b66ac39052a2d997efb6e652169971b19f9b04c095521541fe7f60ec7ea610af4cf7f7e9b10d47f9dc2976649898d814026bad01c264acc3722e8da28809b0935a5464795838dc320ae0dd4c6273ad11c2644ec3728e8db48703b93c702007ce755911e1d954e940ea40035b1b8d1a0c546036e41dbd0ce165e6997b8a29ce04c04129193b930fd084916b195c0339890b8673fb30c520f3a6292f19581dda9208d5719349d32a7d7381ee395059728a4ca868986175cd2aaf1fd8b52dc30ecf90c78b21de37bbb18e480d8717dc29bda2906f69e624dc780707cf37a41910974502df86d9b83b13dbf9b5ed3c14edec5a470614f3c882c0964f61b1035a22412bda730b4aaf736d4cd44ee70bbb3e76f5536886beb02978ba1001aa09ebc84a0e975555270b8b6e0b251d61b5d9b7fd81d878f8fd806d1000e05f27e2e22e6b6004a7e769a332f0ce5bb5d5aaf1d3b264f2662740ffd2d95866753075e424a20907d5968ce244b75a272c6d7c55a7f4c4a6a13300c71eea5b2f1e3123eead61f57ef31c7436b5af1f7764c62910d84da96b3b9b45663bdf8b91ad5ebf11d4b9d102942c655ff834899305febedcc20fb8e7d0bc57ddb61f2aceb232563df9f1fdcd18ecba1a89083d15f56fbbf85501bc11ea2a1377585b9586d2c5a66f56467b6946d94707dd1507411d76e77c2cb020b9db388b099dd1998ebf3b251cb3e189ad977ae4f3ed28884ff34f3ff18559803d0f6a62ac8de2c1d6c01e80eb5f9e4c4527bdcc2f32036e2cbf88d241558c2b1534062800bb9a4d1db8331e456380b18185b3e8f351c1deab40645014cfd25d59c9f094595fc21764e44f46e55047b4981a20a0f0cbab366c89c82c974a5a0170a3a0038b5a1702a23ad04bb82c7ba7e4a450f28c8c6573165a7fd80a17c178eeac40171264882e01b3441d91b744c31474b2ad21008d59da7a35b97bf406e2ce2b1f20233142e5c88eaf74a18c55597602ca6ca31434419c0970b0c694ca8c066e7e433c8c8034d74450c58854ca34cd53ec4164483e61d9f37ac1bfd7318fb4448bcfac96380b094973d3adf876f0bdfae29058e7d2e7491e95a49a14a3f87b94986b4a4a1320fcaaf2ac4b9279b5151b374d5a6843d1a87e1cfbad85cd834ef3f9b8d4f64df0735add822988033b0b27400999faac9788525b9f9bb60818df1178316bb8e20d7a0fe9ff1fb8626c9b26930f5e5c2353275100d0970e6c4b14e6b2eee14dbd9130997c5b64456f9f8112e1b047ee3390643b00ad3ca22fc11862680d44c71ab712500ab45cd53666f0e99eb59c37f9a7c854b86b16a5a9d54713a29caff92cd5d545fc28a62c7daa1ab0e9998afd734ad77940503075f0bf96d5174eadc0ccacd1f4970510e36b62d487723418856e229b68dcf1c5e8fe86e93f8920af8b3453f78c36bcd006a453b8412788945ebc4e90f326b8388e98ed18050df813100b1906e647925d8fa6a2f0e6b11f8c10e7ea76f2d48f803259df541355f0ee2ba5e61284274711cc8210b7fdec1d8c0e15d6de5901de2135832421b4b504040dffaf2471b109d70e8982bdbd585a6ecf3040b37e3811b20bcea2f10825670c69cbc71002eb3142db32edc15f821f2892ec345baad45a2c624e521c2daaf512331b388706e5f781936145229320520c18b39aab99fa8db112f379400898635b0bcc886423c34a5b69e387f9b577fa376bec78319311c647eb60d0b5fe237061ff4faa2b7edc783c499ce0fe9123f3f4c83660b870a2102da6426ae353913d6fa26243eb141ae02609700f2180b80dc588497dde075320464c2a3f7cb0c4abd12e18b68d41e2e90ba241031c25e2492504797596ef6a0534cce648b773d97902601f6f4ccce28bb057f01a913c6a8b3c56b128e14021f8d41eae3ab52f7f7a55a2ec63e3f8f90fc1279843169878a85850444693f2921a0b038cb6a78b0f50d7788818455aa2a8e253b331563634652600a021f0e391610eb5a017d2536b9b2f516a43e56d6d50eace448938747ce93d4c5c4b4d27af7c2b049f52958df73c9f55c48973ad24d94c65660c4b5eb0c57498f46abb59860ccc4da48b1cf746b9b32468dc8b79d65e65f4b3ebabc5814cd537ddd865d626af34723c7e5b51b8429329ecbf4ae2bd819b2528d653939a8b2d672fe4a10b240020ad1fd43116813044ab421c046504afc84aea52b8d99b9fca57e15a595d00e6a6b46e6f7b89c81a7ee916a511fd654149ef59782011081a10c62eb458f37eb0a9b86012394a05bb009335ba9ef224d494409b8a7580a02bd6868e5129f0842859950008bcaa5e83fa95ddc718e8210608b02b16829d16489c71315327d4fa9a7aaf4c75ceea93ff6e967ac98fa0d28e80c1f36dc18a65eba03c1de5c8631f4b56aad6680dd1f618bf29e8a3c172014f4d566eaac712f88f9793911247b8ca003a6e6952649a5223189a0bb9ab4a32a8cca405725403a8578c8ab10a918a925fff63c7d750f63632ac3c64c3c32238bd1ea17a6baac0c6b147129e035c6519080f1e698f8ea21064994541bb6ce9192f0312a9a6c1891c0a6820911b6fea45942a01a5c4b42bfe112709f8bc17c496e46f6567d57772651025a7cf30b84cc9680c4c9b68adfa31ec08a978768fa419ca80fd3a8d91d615c0cec961d97cb32631ae8602cd3f79c310c62b29346b340e63f3c8d2637f1da1ea48b3a27a48884928674ae02985ceaa90466cb893f725fad5fe603678fa8ba3cf0f045da8a1c193224dde11c942f16d3a43214eaf4ac57dfce7b5b3bbac9c03efbeaa13f23413f73d12d857211647f94e4ee6300e80bf2a9841dfc6024e7a409766c02b2017dcc234048847441db20550580c10f10e7db9157dccec9a95b361f60168d597dc1f6a1fa09bc8c36b780506346db05376af49b36ae6047c845c90c1c3eb296413fdf8454c9430d4fa6a0b662e85aa04a0ae921f7a84a1c0037ebb96972cb105812d0f34c9011da3ce733f2c3010b0aefcd42fda64c8018a854ab80fd9f7acb4dd598d1ef6540dd69ed23f291c8eff1ffb009a50f0afe23b962f0991a96970fb140e6859c858c335b5dc342715ea5bde334e8ba8697d5488a3f4d124c4c88820720bd57b25aab1f258958ca37904201a20162744f4c600186f3a742aee72126ed971876debfbd5aef3655dad31ade961b5df68f125d8160f0d0a469eb81c93e648bf4304eb14ac4d24b49784f4c322431d1d66c7073f93772f95a008a13dc140723d6648679d366db116241ea5354a5188c3b4b0f66c10c58942e69d300d8f6dbf730514a56cb19b066d1e540ea891f03db72c0ca29853f003bdca8e400b9f7c61802f982fc3b091a1ea48a57be0b2e068586b1b10658a85d51c1519563f1fdcd67dffbe32448669ba02c7de6c0b3a264e4b509f54dffe0d3f872d263c46cd11ffb52998aa672916acaeb3560b688192408d471126d88843515d27cf620a04a019c96fb9444728c22ab0f5fba3ebac190dbf2bf1429dcdcb3801ac1835e78534de003082cae7df87788efe3b473eac1ab843f7d073d533047f64332c36dc88fbe355834b47e13240156bf5d4e02104fdd663599ed34a7bd9c26f9328446fd5319a20f4a80a274abcf6e7583db243bffacf902dab148eebf756dbe746815199a0a610c5aa245f556f8e61e27613b9e1e00e4e622e43de6e2a0b4a2959884de4d3f8438ce29eb7d7380e8a34d86bc8fd96dae2e0dc0a36c7e9896a87445160f4062d81b4d12248e20268073f2d513a99c610f62e1606451ec5f67360743be58861a8b65c3c7a0b93d76ce51759671abfed789b406862273d247b68f3519f61f1891a713cc980bd32da67baeb0ab8545a5b4c79e46edb18f94bfdb2beec67d24cbb0df3bcdc44e03c054e54a1529ad52297f14946aa85ef70019511608a1de191add029deda3b35e62d8bff74e637ffaca33261c639b62f87f6109e28c0b72557eccdc36756c11a5d72315ef62b20b3c96a41cb8c9b6882898a8f8d3f3d201fb416ddbd6d275ddbd3ffd42955f48191bed4623bf278cc5ed3ed9a5e7e2274fc7b71f4298f38f8a861d092a10a11bd29262c08958d34050484ccfaff482e6d79c517b3af03876fe1d8cf8d33a53983376e32b1091e089b9152451568c0061cc4026158f1d8ce3f3ba3cec468cd088805a6226a0f8e1fa24c0cce0a816950db626bd820e8e1ec19ea2765c99296f3fef724dbec527ff1bdd8ae4308b820027e611fb5bcc83214c28d33e068c1dbaf48f219d2ea441861ac2bea9c4e33f242268fd7941887dea4da7d15808e314a960c83b6adfa2d285952689fb87cc3959c2fbd804140b58297f86e506d4c0e4730dbc4299e73718102500a95e10f10af4dde51d059c2d0a62274ab020c867a5c4ae911362d18ec3ec986c48ce82789d0e48ff28cf4369ba118864425674edc1da45e03997249b92f678780589950cbfbec7c0f6815e04ac436098035c975e75876c07f1a4eeb6d40c4d4a5ca1a50bd6be57a756134246a0c80366e212095c86f48863a2317394e087eee44d56d2f0ee914a210d44e12945461c26225de03ad0e9cf4ec9083e36477b36d4575ace1965ef8438dfb68b85535540b2a419c97d06d8e82ca7838a4397a461d8f60d8c620a96aad36fcc06ee231d16bef89c8efd3a69e8db7a11d0d1083fe1bfba775db0b11e65af3f39921b58945f9d57434b7ac07b3236287ffafafdca7a6b07c3ccf552ad0a97154b2e2d691ab1d2ef88a3d81b1ad75260378f538a616d0e31166903806adc79c9afda6d76c2363b9387fddd73f6f7518df195ec24672f07dcef973deba81b95e5f92e98581cddb9550c1e63130a6b2924927770d3ef8db8e430ff47b9135426a9dbf6045042522403d20e6f5e7114565378b7c1c054aa0ce039a1f6fb6477bcaca12e3f6f54c0e1f1ea298668cc0a7eac65dab20b92ab56c473e94387e4d099b9b220fbec243e82530ab81d3ae663c88a726b1369ad5ad7dc5c19e9f7e4dbe4366b2d768be9285f4698d4786606f2367af883b91e287d16accb6fcff082ffbc16edcb571f6619d8eba3909885cdbb5df3f25052a3d050f3757c0931bbbe4b7dd82f305dcb5b550f13addc8a74d0d9154050026afd81bb4b18022a1d3c21297b597d29443364d06b4459765f3603ee922fc43a749a791f488eb7a9dd542d6a8662a3f64bd37ba7a3859353a9eb52fc97c0ba3bc4d2073d79000fea82b8d8c43fa6e1d88293a865d8d7361c65698b953f05cc823e344408e6ab8cba44eb08864e0bfb1900635a0bc4181d4351708762d724685ea660f2fdfcb2fe7e1f4190d94f5a7e18db86c8c8492a6efd6b4cba58e37622b0c3b4b6956b4370190b5e8a4a091100741624f341e0715ea290426902451b7571d32bae15961d821af23c51f27a141b9411b0282eb9e08f3c73f88029e06ff16d0427b736e84a574ae403c1c3e7f663d29a3af17b020062eae2c17c698a9b97aaaf36536aa0fc0c5b463e8fd78408c9836dea77f23c33ffd309f48f0083c1481f7c80c69485a1161dbeaa1969d33dfccb0d5e2d5bcfb63208abd522f227c150ea171b090b8018820abc1f990d786e0539bd71ced94e9b778009336d5dde1dff31e256ab7942c235c063c9e1732849bd41348b7bc2bb8b373b045e8b33cc2eb74517c85d3f2ebaa1387ec295c66e7609928f19db0c636e611789ee785777094112004c7e8408fb6398ce5d57de3fcc3ec499716be864adb645fb958fdf0ed04a1a70aa7a135aa3aeedbc131a0de89b9e5c44fc58883251e0b3d70801a5a517ce75365275d1f4055a175cc21083cdd3830b24576544b4521b085b5fac794b4eb872f217b60523b3a6ed2cecf0b7acd87af887d894b0727c61d44b59768f0d7e1e71bff499779fc2f3a475fb0f206fa165e6631a5508fdac1826650c4408d225415f61b0266f02b51b0e0d5998d10e251a078f046941c0bf18a96b25ab019f8f6e41a5dfc9870853ad927d705fb0dddc1cc9843ff959dd6bf6602fc49df9b4056e74241213bce8895338f1482ba2b4b972774e05a1b6fff6733bbd6a8eac3d9f4a00479b94cbe2ab21b69d7ce8657c4874118dbe766b7cf7521173fb61cd18be9986d11c104d9bd55e53b1eefcfad5eefed483246a8125b2e5093b32011954041ae67a435c4e60832892ce25b57c26c65d42a4511820dc46b6007e94914454b7a7e49ab6c33f73eec42a5ffd1b1823dac1151fb37b927660b07a58bfd3cbaf73b94da753c3ae5906fa0937a299baa0396c7f5bfe81efac18c4d391a7eeeb42c4a039749b018b286999af1e5b478455f96ae7f93f9da764e12d53a10fe619ae209537692eaae522a30ac232794a4474019b8fca3d13079e7b1ead2c212da04d56118f8185c0fd8140f7343d3328b02ad59eebf09b639a7af1f97e00062ae6fced285a09ac9172a27fa17b91e0102c580243d3074a17c195c372973e095a491c0f994e0d0d0c3455a43568c27ea7585e668996fbe52ee8a7beee97ffce2d2d9293d8b610dfeca0d6d10e3a13f081474a02fef302c2075389a82a9402f9d077206801ed823bad0c9b35a60c9b988b08cf0f644a4609e0651d751808317f143a1a01cb2b80deae813dd9b0719ca39f3e084db116a9e4407f378d1227682584f883f172c2ab9db452312d6d4a389cae89e94d4e9cb84105dc1d64753f2214c8a8b14c8027308607b90f7a52a171b6e337438666ba355304abfd3b7cd191f01b674e24e5a0a79c9f70894e99452868586da9f6aeb1a2d3a9fe825fb77578ea419edcffcf60ad345cc737cd69226f06c3250e594cf671bb17b1fc8dc78fc546090689bbbcf860ae867d3d2ceac4223b894a6b0ea99fbbc2c2858fa8c91b2c21075de570e4f65058d82e744a8f126df0e63328478b705c51ade339d02c9ad7e17790c2fd4cf881138b981f9c8c989635bcc620e58d158d3b306f4ef59e0876638592f3de8e989b23dbbea60c4d420eb15ea420f7ac72d38153381f8c2ed6da5dfe2102c273e1837f87a206a72363f5a95f970a0a5a504c1441a1640d599d90d98171146853a9c084dec132ea1a66cd65cb77ac645b160c8d2c7ad3ee0c9d17571b0ea12263f771f1b85653e6a10a02736abb15651b5456a0df2c2e089818ada95f200c4be1720c39b77d317bd04961a0201dece3bdf9636cc171e4d6e7337c97c1b760b0ca649d0433314c49698fceb2b396728836a63fc85292aae9987f728c99b502088b79a363f9e8a352b883fb9c2941397b479e731aee27c7b9550d00f45427f4c650d1cf1bb59db6d6bd17d0a0aeb0e6493a39861cee12e10e89a2965bd006d0707af9d27c7f9847c4fb65062fa34e2235ab9483a1008ecad4ce580c52ae6e48f87838544bc9a13d2f4403f4f9e5b14b1b59a66dfe25650e15585a415f5852d20be2ee913490099d9379fde7a99581fe3797b4f3c75a2d0d9c4de0d4b2dc68ec17d01b2d2a7b69ef7856b8ee65e486662fe735b8e41b7b1a42d63c29d5933324385d5b597847894ad9e7b73b867e91169597784c9230c33c837ec9910b433661d504ea2fc010f4ee3728e94dfea3a0935eba6f6207c45e414ab8ab77fb8b2d671cd306e0e214782770186ca80684af0166250193d6f01ec0f0718d605c373bca72a5d077704027567a737080a86c952143ae86b5807282df0e0f31d7fda6cc7d615c71a2235e944d26bea3092a8252f2685c7b35df01c0676ab6aa018646cd5943edcc2423515f6d645b5f6f1fb60d616c14c599cd73e7dc1bf7b41b51db64a93beb7b1f6d58d2576e67175be6c37818d807099e0eaa677b6559abd3e0897af327ce56c1f076a04b5e48fdb0f4cbab24d439f0154347b8ca9bda368806c5c37ad84337f60e576a7353998150ce962f2b78085396b3eb58c84798421f646d871e1443326d17a80c5b37e11354f2109713b28dcffb746f7881bbd7ae1a19651d8f5e07f8c29a004b901b179cfd2bfd8b3f7090f00f29b5ec9ce3a251db0fe029e63bdb3c50373497d2d360f7e6b69649de749f93fefaf4f999153fc3dee7f0bfeac4733ad45ca6b5140d8a569974782f6ed684ecd8437c24bc89fc7e23a2c440448ca46cf80255d5951686731ff1baad467b30b10aa93b7a1ec47d4f99e32ee6deb83ca1345210ee721b0cbd7221ec0e7da8247eaeb5db0c1641815465bfe4b4d0f2cdb9a2ca6300aaf091f91dca3bf90914b2ba0b35edb7fe1a4c6989b22f1daca70d869a733e4826e4b974d3aa4657188b639fbaea9007c40daee0f401c7e721b6b26b289ddf6133064f826937964b51cee70381d2d1bbfc8d35680d192b74ac0ad074e2c98ec19b86537311ef4a93bd087554c21699a2e420eef34d8c170ffc7661f44aa6f086b7b402ca4303af3be19bdc51a6aaccd6411c0ec19a20a4bc14235866b8fa05bc24ea5f5369be4abe50b0e74ad13e00296e0b6f25aa5cd5f80a9a4d4fd01d1835ca6b85444ba2f0e114eb4fd53fe4a1f530dd9609cf45cea3910edb88067282246310e4294af4fca657675f40299389ca17bab108e3c01653bed904a16d3169caf5a2878d9155bdb378076c9092187232aa9c06f461c7135722af1b67d75a1a517e8a0c757cc1d6cad7bafc0a0189a865b9b5156a0e6f5f7f03388dfb9d11ec7be568cfc332b547edd254b0364aaa45ee466a9b09143fa0a088d226804030276613c3ff538b374aff6dc014c3ab448c485ebf44b68c5444002b0a133f75cb35b4060c865c156ff95107168cd8bf40ed516471d82973ffb4ef4fd692c3e26d5111f949b962ff0ffefd9f0e3aa8d8a82e20cd67357e057ab949344a97d2979f7789cec908843dfa154c668e9bcc0e25c5c5d0a096f25aa62f2075bf35cbf0fa2a04e1c922aade631e6124784a1c1073a0b39c0edf94c76086ab063572ce0d9cf108e4b2097cf5870e9e657a8e1ddd0fa2a3d38a54b0589213c61339cc30f874ae4679ae1e5275bf154796165ea47676e8f16c6eff4391045320296194788157748d2f8657ffd75ee57a1930f911b3086ac4bc49b66f530ed97e4e8029a7b029e37bc8774d8b0d8cffe17d35ef817fefe858e4fab59d0f82368286fdf8ac4ac0458197484f8896d360d700f6edcbbb36c66a37802277e92ad7bdf82fd89b37b8c668475300600fdf57cebab182b7beb90d0eb531e2982438a8dcb3ae037b5ac0655396b3faf43870915bec9e047259357259598566be46d8913e64917b1eceb37aea4a9dbd29df1a3e2199d0d78f203c6f11756e5e09473ae212dea0b4b2d5106484d176617966cf985c94f915f56a7b8d26d991cf771722e3acc05b3ef9d24994bf10f91be68d0a1bd7f0f88703dbf4e3d0cc65f1bbf49d600759786b8292c76eb0ed9ae40d81f1cb1f1182cb9621762004abf0fc08976db092f44595ae0e3efc949350e03da91c90e7c4d680108c4d66ee2b9e67e187801c5454856a0ce2823733417e3220cd72a080b1eea53c08cd111b78417eb0221c981054c55f6a8611e1bba5516974178f17394b47060f5c35133ff6b012c5e9584cacf17174fc99390c7bff6822c3dc7b638eb1051f58cabbaff2f47f40b728d5d13a696ff2dfd4ba4e4e171fe6697c44fac944db0336e7d826d68ed8200a89ddbb22e05ade62b0dbcb3b681817fa05afafd65086e4669e7f87b90f516a3a040525eb834863eb695bc08c075dcc3b8eaf5ffa331a8fae653003c3bef8e58889df694c4d128267412ce913519882ff094562e0211ac453f3a620f8ff277654aedc1f67bbca03db3c550c6862888882452a0608aae717d06c74503116e693192e6ede687bd1ef086fabe8c7ac927050d6af1a4ea6229e3b9d3677323d2fe6e34ec28c6a99fd9e9a4d04cd35ece3c4446fdbbccf1a147bdc9cfd3b01b1671e64b3568d18a25b0fcc12bb4cb23a3f7c6afe23f7fa4cce3e091689f616893d2c96af2553323fb404e416827ac5cfb877d322de1e27af0e8135626dc6217c5746bc4853e68cdc196225cda3d6858ea4a76b97774bb14bcdf1da4e64030ebb06a4ec4613e25e36e6c9848820e0a66f2fc3ee24a4bcea8f9e289fc0f9c1e0e94cf00884d8474797a71d211123c16c82937d857aa43d6b6ba28c1b8860545419bb218dcf4a1ebf99171f52e0015ddb74c803fb300fdb055805c14b6ca590418d7da1a7f92cb97a06f30c9f6a662edf551f0013a506f05f74f1d3b0cd1e1cd9554377355aede08023a5645123b1a4d2ab26f2df2d56d10b0509ba4fe6e80b57de49d09fb99b2f9fd469c2935f524e895dbfb052929c768024db88cd5499770a8f24eed985c724f33acf8cb6431b7fa834196fe236e78e4a28437a8122859fc3d8a32b5f491aea74d2e199cd1ad9034656146e8d7be8e115f34aa512e3fd66d155aa2aad306bd5962567439bedcf1c4b1faa70dfcb6045af86a55754918bf8fcf29b24653bbf59ee0d4502491fea508a7562c9d7852e5b030137848fe6fb8118a9f570dc9ce97b2d2e2360903d589d9e8f267e75e11a7d9657f780468655f4de547c1c35c47d39d8c204555046bcf34d0222c6f8b6f9201439a8d71ed71aa261bdb30daa932c3ad68aafad11409c55ffdd28a1e9a154580adbc43d92b1c5134d441a8185cce7b4ee2d601d33be2cbaf4fb8bc074befeb7a7394fb65782b8dea2ca07733a3d6b59c2cbd1a3e088fe0944d96932815a299ab79e6cf583b0a2ab0b5483134b45e42073ba7f4074367be9d6766aa4666c9737ab8ef8279afb43d78d00c5d1ef28bc94b991d092502fb9fd2e8ed92419ab563373471014437179f75e8cf519c7924491e6e746b6e7563a474b3cfba6edfcc64513c7b52a2dbcc8161545cc56a4bbe52cae41759939d9d1d471092200d07d5653556acb3ec439f203c270ce659093ce26d505c6738f088e2b7a7a26e6b4650d87e50e2c507997c013584e5172c89ebd41104247a4975fa2416d49da7655a7ad30185cdd3e96c49e54c09108ad14ece95998ac96e48df85c807d44dbc02e5c645cbc60f71723c9dcf90a19c1bb33c61507244e9914bdfbcbbfdc573262221f598524692e9482dbea465150938b1650ff2aac418b269960b74356806f37c8beeef2768cad8213b53097d5b5f527c7fc052d952ae324d9c4b42827b62c96b8a6bf308424b7467b1f7979fe1526c891e6e48726dc19caa5294fb61603c06c91cafc5940f97caa1983fd7dd1ee5aa494741e29897c8e84129d5035d54ddf8a774c89fc65456d8a8c91487a551228e3869f25031b1b51e2e2207994f60ed52f44e5ed4ef8cf4714b3a5e7ff192c713da81bd3f20c735c86d84d92daa09e4099de838c50c3ffba81a9cac92b1a74cfcb44daca01e89d81304b562770fa9ea53a013a37cb19f3fe75c92f8de9567d537f1f2400f9a3252942452ba8a740d169935a4280f21c0c5194966a14afeac41327114ca2bc136777f12f6705a28816702c11e17c8a5c6b4be9cd9946907d0227971d1dc8fd75f9bab2e39e1bc622ca8a54a3b4c7341cac3004f83667ca13654689a24677240362ef6568a6dc427180b993203fba238b8d7e31f435417ec168180df62f95117cb297059567ef3e4a3981d3b5bcb379da8b03c3c489ead000e32a814ae0ee03e920aaeec4e17353ce593153eb4d95867fea200a9c3ccc46cfa4557de5b5b6d4dd61867abcc8fbe3921df1eb994b60e034bbadf80a4108ca228bfbe3eb11ecd4a5cfe56723e48e9a1bc625bc4cb19d95e9be552a9dfc40d4025e6488e4f2128250b68b99232122f6fbc1dcda5e05d0858b729096b78a69a5acdcc6de278ebe013bb78dd33d36b127c08e4da6a2e42b90f7e7f4a80daaeb3c37cc4afc16141dff0c26403fe8d298e897ff256da4c08bc7cfc9ba310efba989bd4b88b7be492240db05179ee3021b81f699830e286030b3b948e5f51568692879772372682f8015c90ee8f446f43315830d88a096bde59ee7d8d32f90b734606682cb253c92358f37189b468af5546383e11a134501ec3c17730cfade04d5125c9bfaa926e28f2381e8b689f466d8dcf2fa32c0510231270b0d03736e6c60f14ac366aeb8623f47c70791eba76d6ebd028cc0473b2e94d46d582cdbea4eb822e02a09bb2e28f205c623f6a360430bb1d4e5f99c6e21ad50cc7e1c3838f7ebe21e58b4b9dcc02bdc762c36e8cd6421890a399fa282fae66d5e7ef543aa010714cc5b67eabc878f55739ca9c04719bc2e6878fee1bfa2003f490dc4af72eab3a11dd4d0fb129cc13f00ccdd9706081c862518c349c7c6b600c715e5da1e90635523fe2e517ce11f7b9d81b7b85ca210b9beec9c3f85436e3238cf236090a37a35e6dd09e54930523ae3be98f24976bbcec45cab3b71b85aac893d2b14d012b75c418231da7a8f08b2fa8d02ee802d867ccceede67bf65734b72b6ac443ba09a82c44f110c81327a9ed74dc71a4f424c362b2e4ae03c4ebe9307a63a1e46a7546ff999a36b1e1d90331fce5d774b2e0ec8dfd47eae4148b27fc45828b8f7775a8bd7c9d7ee4137bf825c147f92cee19a86e19a01e5d259999ac7cd9c707dcf53558073e07dc5c1c3eaa0439d013911a4b54e726ea13d4fb928a933ececba93a0d7d292b16ed9a3bb2ab09cf58b0376d2dd7a3731700e9eae4ae8d834892825dfc66bd166e4f954be72a42ea2baccb957c9db89c08a4242aba40700cebe0efdc2f5250be8747378756c7b071f54674acf42b18980b6c5f6e9dd59381ba985af129121a490318cc51ba4cd6e92a1df75e9b3289b1799f3671e7fd628a40923443c916c823351092690ddfd58ae3e814ea684571c01fc25018d2c399573d299bfdaa7da4f56d910573986e2deb3dd462a2927031b42d5315dfa543b92d77579f4f7d8ba0caa75dcb629745c30e0913988fbdf056a13a844eb40e682bd0a1e0d30ef6a787ee17e99584c8d15c5890529013a411bd4854c3084202f6e66b7202c3558a0eed6042c1e6486871ca1482e604a99b5a3ae57e96ba29e87b9269f576e66ef53abe8ef4e8269a5ff234c8ba08420fe19e726bbd2d1d7eaf6a14a220b096fd6b6008d830d555c53bc4feaec59e856bd31b687643b5de1586fdea136669f489e19e82124b85c2c8b24ba9e4cb809182eead58a1dfabc20a129c501e86c35b242c4c27bc652898c2834cca0dec8e90c8c057234fdfa46500bcbf98de8dac49c30f31eecd807e5d92d72630455ea2914c744987adc8b12cf6697cfb66c0f8952ff0e0f257e828f4124f326a259b701386c483280bed62404e4cdd7c9dc053a1c5a49f984348ca50f94ab9d0cd6c4831604c36447be1e5b16498e09fadf387cc0347761974c728f56e837b0508701f030a28e747c5f2842ffae504c792f1dc31791293f439480b88412a093d092ba5b6b4578487c162192b99f58382b7655431221d7cb38accbbf9328c59eb4e5d54fcc4f92406de7d90a491f783183f17411945764bdd33492e9c31c66f1124128e18878b3c92745eb6e12e31895f5618e8b264e2805740a95b91674911410b64887f2881c4206f491e6f8903ef052d96d2f529d41a34cda714957b51fd8fcf2e935f49a2a9589661fc4a31419e246664e4204369f672c177444e60e5cb523ee73fd015a341762658849007b6db0face4e594ce8ef81a18d4e0158c22cc5b37bf049e9b8468f6c51fc0eb7ecadbee741b2ce3735a72574c4f37fefb6bb03da186d9c0c4e2c05294622db19028f14ea54512472c84523a59dcf91669175e30e844f7dc8ae62c98ea8aa540a36e99f570e89e4f0235671753bed179fc7bc834f3661bd1827e34a581d3a20dd458450b60d56452d1347ccae2d1981b2ee165eea6350c9e66090630e8d6f95a4bbc0ab231bf052305c85368367ee0bdfc5cde74a97b8a7f3df5502c0bdd143abe4075e72d4acc03def3fd2a11af46339a5c8fc7f11ed3e4856d80d276629e3ff2db70f0ca9847ce3b25dfeb45ba09e8d514238662f955dc4ef9d531394fd8af631102288447d0eb07e485d5ee5fbc11902dfc4a23abf2dc9a13fc9af780110a160ccd60e8bbb7d69ad1eccdc69da7071e7a27c2f57c6734bd4b27addbca30c96b8504650262b0bbc63c48f42875b0cf78191e86474de9f2c70c00505940d0bb486a8b30f85567282cc137e5cf71d587f300788d12a91bb9710fa31920d0e14a8ceefa49b9a90f09b5b14ad41e011376c8684de6bd1690b51e38d1820a59b5b36ba52947cd326a4f49e9684461f25dda80129bfb945d115440d373346c2ee6c51b4d551e3262d90903b2d3b2d6994b87173a474634b424788926fce1029dddec2295c068f70233312ecd696a25d1d256ed964182ef19b5a54e8b9daa551b07e3d3e8db2101873e30d95b9feb0319b59a83dbbeebbb6244163146824c9b9a01db5fb1d85ae82d066e8db8116f04ff92db5a0eec30043e9ff2aca436be3fa95435733027098088f9215d008f6ca08d43590e9796d15407091b09838ec9590a7916fde4f6ad07e01869131138c0e6c81d77af948834ca60f557ba0a53b4382fdc89e0ecc11a9e5dec396a87299aa5b9dead306d5606d6596a29bf6285a144894294198349d246e97a56e4227cdd8aeaf401d02c441fa46f7a92e2ca9be9273257a914ba54e61307e8f45f15f8f05cd42dc8b4568cbde0126f2f8d7c4737c440f00fddcbb800d31ec7ca2e08de98ceaba83be547613f74104bde62b653553fb00d2d8639cd419bc2d451d5c26401522f9fe49aea600857e8a7fac64824c8bfe5830d7a19f9ca39817b8cb5a5c12417f45ffcefcde4f7bf5bc7f556ce4ab9a172cec1bead9e56705141d1918b4cd5da7b9cc12d1eccbd9d00e58cb49c3df62f468f1759bb0bcab50fb95da8478633bbf0d5927b3a2c8f065737b6313b3d7d4775e7be76b3850108ed0b7edafd3fde062802e213f67bafbb9ec45faf6628388fbe98e817a9ea4d21129ae9fd7eef63e5be83bec025c3be475a261e6398e37086cd68a234a8f74be560ed70968989182c0e6e0a775056df1ea151da3d4cd4f2a75d6e8d3d5a78f5eb934d57a0181028834a806b540449d194d54a9156fe8f17a6f44cf545d44be3b98ece7f1bafcdf54fc12273fe82a58fdc19f50fd11bf8a42c2e66cc5da119eae0c4ab62b70a9ea089ee457f3c6db170067a8851a59e711df32d1e2d3179f8844a7fe3e6d428be894a59669f9aeefaaa3b95d57793f608aa98f64d7e0864295ee0dc87cf7374cf529deec40110943c137c3e212124058ea86233a8748613b0b28356125ba79d8143530f7512417d8628b61d9f103a848491432c55db9226cf3e1ffd6eb01e03b982b66d68f22573f87f4c8e0ceaaccb0e705e4bb7c0fd5ff947f92ca17b88c92b96988532d4519cf055f677171ad77b84c58c25a1ae7b25876f388addb0557bf67e7556e36a3f7b318b2cb9d9b1a7f3efa1bc86ab07ddefcbaff3a485f5df28c6239f8d008829821b00f55bc369c0550309dfda3e7347fdcf7d9571a89f5d5f8acf7f94177a63ad616b43324497e5440f7c1edd08abbb3f6e07e3cb7f606b159e9cbdc206749c0f38beb9d171a96f113b8cfcd81a1af34a4b6659f79b9d49d12557262447cdc5f0cc782aedf8727c0b3b23454b6474c694b7f6c384168d71c5cd38f85756e48cbfe493496e656e1d2cafc2ec18d46e0d17af26c03d48bd56d9555d1acc2840fbe10071a2906f66eada668dc79463ba21136994174ede81072bc46ef3373f685d15240adca8f3d76c008b4658f36d937a1225826215b152e5c278f8631250f85f5f115de1e8e53d5cbc87e5b8240860ab659656064cb427ab749ebebefc51c15c055f5548cc6c48bfdea7eded58c5c3165b4e16608ce6009b899332f32c1ab562fab19b0cb1026733ec0c2c674bce8884c9f8bcb515431e2efa5eaa33ae77348a5eb8de2ce3b4aad071fe64dd5ef4a7023c5a5e4b97a57f41ec8d331bce33d0f331b6f89f17a7a61352902b524b17632e846dff763929789737ccc70760de895bba814043bb0d8d11fdc7412866d584d2cc54301bd0cc28aa7781fda14a68d565022a483f8c7c251c2e3dd29feedb0385a4be206137411e9b31217e98303cb7dd598efabb3a333b330a151a019feb2374f52e4bc3b5d3183f31d740892bed36b02b49e04c4e98e1e4a165e562c9e1ee98f7138576edb804aff34dc51602f749a888b55801b40ab1b97b250f3db0d4214b5089599592ac674e1ed0bd9191a2dbc61a4d4cdfd71869a6c4db2cc85b94c9458f214b262967d4ed3a3a771d1db30dd988d1f198be3009c13c6fafcc8f377440cc6921dbd7c95d89b5c9691747dd1e7e5739328d282ee074422057ac4292ee3f43be4f119bc01c88e6adf61f06de420cf530389f16287f688612da5731bab287abbdcaba5ae25af04a8028b00595eb8519b0ab101b404ec3269ffa8c23047da4199c2d5abbc407cbbd3b21d8c3c622f7480a38bee38287191633a01651e72bf2a09e8321242aabaf06ab76c75bb29b345fe5c2206585f38813ea4288f83ddd2079939407999e999b3090023e8fcac4cc0760c54e8c194ee53dccbaece0cb256a0d33ec61f46149a7d0a258d583dd44296eb67af2b05f6edc8400a1b2051ac777a25a5deed7a122b71b3e6f45fc0e828e2551070cabab6bb2e0174b983e4c3f9ddf0c365027163d7f7a3d1de5e5c60b6169552f13b95db60036335dd9e98f21e35adc24e3fd61839edb18f28d6bde9e1a607369b348208c1381330ce0e815c30ab9aa3cb30a4de9ee1eeedf216b3e1bcca6b552ab1d50e2368075ad0e6f428f415aa78fd44d6ce52f1c210ffd9b7948de1f08a3273937e1c93da0058e1d249f972e238417909a6d21cd2628a031dabeaa5009760805b813f49dd9115b04a4e5c4b1c7519d3eded14ad2977d6b7afae24726933d6b268d9dea7af1a3d4c9e79c8ce203e5adfdcdbf8eebeff4854b590b0230ec62546a4301bed55b3456d6b2334edbbecace03cb10be8369a377062520dc1c118cc1b27d341bb4b51997a6cca2227bdb74abef5e26e2214e02939bc46810d0949d83a5937911e7f458a04dedf1a03dc8d7989b56eaa35864c4460fdf27ea32cb86f339d749689f5ab3b59022047190b69bcc98497fe72f8a09a4ec881b57543adeff86afc5b44a7ff44af046c1f1687968516440e1e0484dc28f23fec98a301bb3bf877ddf8bdcdeae87636e5348f68342d6a79b31ffce09d2538bba34de79c73ca8484685f632d32e74ab3567042ab1f9eaf9aea2c5df9b3bccdd5653b248ff4b43ecf3b0f454e918f134a0610a4718795539df02e49d36ba6ded9b4e9b2d01cacbe07c2263861bcb260e1160390860c207e9ae703f0598f4045242f82c6473648bce38861c9f9d5cb862abe3e8f76ac094d3fd296658ec2b0aea9a7f9ed6c196fcf066427a73e0b954036d73e80793c229dea1d4d10c9c6b656645a768b12382428d837f49ebf057aeef1c3740ecded3277f25b9315e15b88437755d0d7d8e852425a39a48d7feceed64f3c86eedce2e302a313d586ee9558857b2db57b98ff31ce493d60175b203fa3d8510f6e63246aeccd2147afaab04471c51875293ac857cb719369ef87648714ad1b905c94055d7341ded315463565415c8d4115463085e4aab30bf484abc926b0a06b1439b62aa049d5b7b18d5ffa8e1b9b47c218641953e31012844ab93e92d78ccf332ad6ca0247ef89682eba5d3d2d7014ea82515221ffe5d6f50a066c579c02715a7841b137f575aec474554748f8cd88d96dcd96814d15199a46cc0aa805dc684a1a78bb3a0866efab1196bcf9350968f184939860fa46dc8b6b6805c0335b1aede6e2ae604b27effdbf01e917ef1db5b3f04275bd915895ecae28f2c8a5646e8ba902233835428290601c010d6aa43d1d9a86f5319dd987907e691b10ffb0432a4e09429b1ac648e32e1a0fb3aa916dcd15073c30110af2c39372bc1f9932d9ec5cd05e8d380d38e3e56f34dca0273217adea49b9d68fbd293f0cf08ca44f51f105aeae756a6c0ca6dd2c631ea5b615501112b0fdc343fc73da0239e9c9a7653a402e236477c253f870d44cd90f0c776f6e90570ebee8a1870d61d7d77a60f09d2f261e347227c2e2542e6e3c06b6f6a543459b98b7745e4c1ed7cd720fb48106574b563f8c00e34b598f3c98019286214fb79adafae0832a5b7c116e2c864be7004db0e9b7393a200b7549af1c0507b5d52dc24b51878ea9411c1e9d6000b75d472fe472e2ff12c8d8900c61e9af914a39b2ac3e09843b0b3f073416d68e56b48f89dc909be9c88bf012d9754e2c7c654b68352bd0f8d306e45795a0d634c20d4ada11530ad84f8002edb732928dd756c4e5e1d618d9a186eaa4bbe10bdf9ce7c50881d3ffe446e9fd489dbb6b97b0eebe4b0a311891719c9434878800a3e4c64bca8ee7ba3bcefb611c6ad53b3e70eae1e2abeb294889abc2ab6fb71b7ce6e82d0d4e121fd8e693a5bd39da77b1fb6b6e1b409fe3ed6df3041f06e9097521963206622ce73675cde443a53e654f0ffb930c1aa68db880e470a327c9e5b9dfdbe050c572afc5ebba00fe1980015c4c711827b65df6bb9768284347111fe8824a96daafac25e4f4db88fdbccddbfde9e34fec2097efd17f5d5b8f0f8820afeffcc9e3071257e6cd456febe9ac6341a453de7c95bd4faac41780e17aad2825659fcbc58d1b57f4557de3805685b1a4788592602a9ed24d6d24ea8837166901494af1b83e15f212d5de8de57ee10c734f05bba6077e92cb590a3273ce9e6aeaec225fdfa618531a031be8b29bcf1beabe57465d4ddf734c44faa95888a4a2e624aa00761caeceacdabe70cdcd3829113ddc5e3141ec052f8fbccd9b7ce1b737fb429e1e826a9855748f08be697084513a44239888b6065af61b46619dd9cb88868ec3e823cfb34e9119c834410f4fc0288c9df41fbc1c04de0e04380d59200e3b4e07cd6fb7a585844a098789f046ca936a23f45b8a0ba25f1d2e672e81b78e6e989453935d80e2c25fa816d171b8a1986f0150e03d7b984b99ebe35031c74eec1a39a1724947df17f8848484b4bdbbedbdf79632c914c50cdb0c1a0d4e94692abc64f15426092ed4b8c2820f0b1c5f90e9001b3ebc5053238723ac1c5de142882e5a38a38a2f760822647a82021b1790c1c1cdd4a4760558fb71d89cbeb5f885fdfcb22f3c0ef182dbb18c6d591afb71a6263e600a654629a53f41e8e71f5910346c0a3753132938dbd17df0945e889ba90914bce1666ac202ce6505e2e9e9e9895ba36374795dbb0c5c60f338ce7f657a8564f83726dff85b121410a808a594b394890535983225adf094d28dcc767f2ae9e3d1bff985bd0853831454aea8f2c4061faca84858318286a62bc018f3729e1cdc4c4ccc60fb34764c6cb694e08b5a53521331dc93075bd410055314289cc062d6df166062610c9393343307cfef986d9b8e01396c7e76e1f985b5ad51e88583fc70a4ec0c2d7e6c77459332b6b1b53ce58e153baf286c531d02ec04d8c71e0655f473104ba3d15498e5f6d2d5ed3de448bbbd77b11537131328b82e4d5e9c1395f3b67a27154d78fea383b083e5703331a951315ebbde38ca91366c51309270a20627b478d28589068421854a0b84a0628d2866758cae0b58fb6562057bb8999868f1e1dca9e0218989490e4d32c0cdb4821a2ce2665aa1cc2b77535d3de0882938f4d5038c70f2b231e861f577d5ea1fadf53230b5498530e113d30a4f707ee1c9a442189c7d0080f30f9e73cd964a1da48efd893876d0677bcaaf47616d7033d1c6e0f904d6fa7b9c68269aa9a67fcc5fa309776d8d1acefe05fb83b86b6b1881fd8b37f58ff9fe34e64d1ae6ef503e1fddfe79857bf58022c4d4d650c1448e737b199af88402602a2a80c3b748f3f8bb1bb6719e53727b099a9f8df0bc2da57f2c993f9484ba1733dde3efde7b1a4bef3cd33d55e066726106ec6ae6140af3cf368f25feec23433d6d1fdc77ef3fa7d058110af33aa76c3e3e32d977a7741c49bb9ceffe4568cc6bd804e23f818ef5cc7fb4968d31ccc0ce8389e84fdce2071ba64e691d0d6b6658d3e40c56791ed9f8bbff809c980bf6be7ba308cc7df7200d3dd2a9e8eaa3b85cfffbed5bdda3aecb08f7df73dc4dd2bd8b46baf74800c2763749e865170277bbbf3b23ad02723fba8f7f230caebfbd5105ce0077cd0d2b18a42147361eb71f92ef8e97371489a0560f3822e98e3709f7fedb87f326d9aed300b67716a0d3a4b5970d0a2c307c590104658431db02b78cc6eaac57500212c0b084153060b1c5acbf3300d2ef17d8255d795ebeb003adac97ae2a3075f51de2b8bfaf80610c9e5fc463b4e67f040226102561e751536940e01ce226a1128d46a3cdb0744dcd1338f7931a1b706e33681e804413f2014434211f40048ffbc841b0e719a5b5c88207fbfb0a6c90214713d37f0012495e36de6e156e8772b71db67a801168bc6cec4da535bc23766250e5753da1e2fa2e23730aaede353536785e3e61b7a7dce710d32fdc27d9be7262c5a28a7b4ab9a7dfcd19016be5baca754a3aeebbca6d35355270d7ba6dd9311177022f5008c958549c9041369df0e2ee2f4cdf9dee6831238cd06b92006cee760ddd87f71cc751cc4dee67c7711cc771dc761d0adbb87ed8afba94860448d59bb028dcb53433e0dcb5d84861699eb8906605165e4eb0c1c69397135507ee1a1b5a601bdc3536bae0ecc3825afff8c896f09ea856c8a08861882792a8f8a10d37beb89102188ad0820b1c54208505e216a92b6450781689b056a178b5b79defd264469523c820424b981ec304341aaa9040871634b184f744b54206c511104a656620a3861936d418200d9810945143165c5a90653342ac420605195bb8f18212183065c0cc2c8d5d600b11ec60021ace18b1c5ac7e53c1f56b1b40e04a05ae5f521ff7d158068517e2aeb16105e711e77113a2c97a3feeecf0c4c71f77461a03a2cf460d2e0015e99a90d878d980c1c938fef87822ee1a1b4d70f669aa464cee73902332211ef366fd1b29f3f9e9f984ed5a1b33e015ee5a1a1eb0182bc4eaacfecef78ff92a653f5e4e1f1a0b1d36a70f9a30b149a3d1684c66f5435c7ff458cf6a3b611be790ded9044107db3807770d4d19b8e2aea11903e7d709b88d82d5fb254798ce9b84bef740b4cedf3ea4d43187b9efe69be75011e61e24f3f69d1a5f1c4d15f8d3f082fdc7346ad87fc75fd81fa4a20228cef351e410c5dc4d5287cca0fae046b642ff62bf6f057c5334b26d3f3f097def3b31a886b6d589411dc771db733727a1bf7d12fadb4f91fe4626a95f438fcd99ff14c1c99501761a376001e0ae9d198341d504c1cf1677eec333c127f71d9947bc551a13639ff8ddee3717ea937cef3dea7befbfeb95ddcd26e0edb9db4770ee171ab1bf4539d581a6aa9e849d788630f144c3cc19306794d0e0824170861b08defc474e9c971c650f8b2f7ee3f85127c9ea59e08a4cfd47daf9ab22f0ea432a68cc40cf50c2f48c244c2917b66824f5f6041d187cfb9ca800d6af56ff9179c4dff7a92e028e30b8b26f7ff5dfea53646e7d3f02705eb52257df620226c679205ffdf7951343483deb57643601af9e1343f8deb63e7b78d5fa6c71ebba1070845b6f556f9fb5e408ab2e0774e0d675819f44f5ad0755df7a95ea5bb754dd6c42d9bad904cc7ad6af1e88aec8dc7a6ef59b5864629c679199f5a94bc21096751580f3ab9b04e7553749d8228546bc7a4b66d6151a31cefdc2efd72173c5e353f183f9ab77d14878ab97e2fded5737e3b8ede5f8d5cbd186606f9e38e76dbec51072de2687cc46d8c6feeac11549b1cd835bf891363fc51032eb5725e016a5788a2164fbac5f519c73730ad8e6b7dfc4101cdbfc17827dd66dddbc3d11c5369fedcdcd47d8e6defc76f340fe9137abd55dfd8a2461084b44578f2289265e7d4958d70713b37e62d6db2bbe5f9791f9f6e7db9b51184c02be87c22cefcc9929189c6208e07b1e09b2c8d47c0f8d26d87b70c4aa6f91d904dc6a61fbed3e727e5caddebe6bbcd962fb389f43b69738375bbc7a1b72f5ed31d7e3e0dcece1d5b57917d90eb3b9d9c3f6e6f055ff2d92fb1b320b8d98f5e1a7c81326667d158d3866fd143f30c27aef66f0592c323545041cb148c7ac9b27667dea55a4cd5bb2f52b328f78f554f549ecb75e65bff5f65bb7bd5cbdea6deeea81288b74bc2273f8ddbb38c471ea59451abb589f64f5f659978426eb32b27afbab2bbe155f253e90a76e12f0677885460c5e0fe79f6c42d046c342233e611ab9c1f34757f900e6493a163b95d0efeb32d22dd45c70fd0dd7f69978231d85bf8ec34ee6108f4eebc6854de68ab7e965dc4ba002c2e630e5220d2bb8a1b8af0b5beec37388e96dd91c8ed371a61f529c43ecd87ae915b7dc47c5dd3e2860e97519a15fbfde5c31bdbec5ce3fc2a816f80bb67f44e3df3502bd33cefa5b9de1d603d8eda356ea40dc71ff4ca264e21ffeb92749e4edc33ff7777fbdddd7f3291a99353fa293b2b03da131834df0b2c3f5fd840e27f126c039e7cc3ef88897dbc67173ce39bbbddc847c88d3247ebd1b7ae903e848587f8e86371286b0dd84f354c23fd84e69aac11eeda68eabf23d90f777db61d9c39d4f3364d60b797ea68aa87a990f71a740c0929aad9d996d1e31880a5f9c1e82aeebbaee6532d9ebc7611ec44b4765ef572408582cf89fd7cd6e769fea66f762f7e1a4409e22f3984bec83e755524114991fbfecac3474641540eea5ebbc6e48065a4c6e31d5fbae7bdbc2790c599fbf4ad2cf6e6c3ef3609f1fffecd52a37bfb22141c0623f54cefbfbd018cefb5b1a6baddee65964f5b2eb1e45cabcec3e872c1dd63d0ed90e6b8c2a7d68acb57aff92c66ede7f458e5e766f49202fbb579142bcec3e4522f1b2eb3e2421e065f7205942f7747f437a0eeb9ac68a38aceb1ca3bc2c648778b7bb1ecb3730dbb66d3ba8d0dd94fbe1f1120499cc7b210476ba7bc922f3b2b994af1fdc599a8268aa4480fd4d54f1bcd9fb7c378cfa795d46c09f3f6f763951c5db67ff230c5e9791f041f0c3aba46221190eff08839ee8894db82746a142d20339107c2e77cd2373cbf3bef36e912ac4cbe6b8df38ecde1bae5eb1d3681b8dd6b0df493a3e12674d938be0761eec7c2119eeee06ea9ed656b76db31078e920f4c2dbf65ef6875ead57ecfc2df3e07e9e91d3c25da03f525a4bec5b9a8b95e6d20a8bc86c90e1ea0442ff986451f7ccfcd3351e8f41c0615386668c9933265c01fbd5f218cf04018bf55875226c7e61fab5c61defb7a7ff6027c0a2bee2163fd4150ab1f779a537bd07b01360c5af7822f1d8ac51d8f71511e23ec08fc2beb7017f9f6340a694e6f17dee813bbf70ea73c963f3cff76ddff73d0830b42882a2f77d737edfb77ddebd616ef996b4804e4eec7df5caccd2752b8e04018beddea3d83ca1e00dcff7fffc06bfdf6f6405bf2245802b075f142f512dc1dfb61795cf885142341a9b35877d9fbdefdd88ef9bff7d5fc2f7dff77d441d167ffb4ffcef67cd7d84ffcd1afec239af503761f15b0c122b06c98a51dff771c1df7fdff7fdfa8ebe89e282963807c1fd40fd6303dd33bf553bd807afbeffa998fa7e6fe4599113bbd735196a082b5b918d41eaaf0f76b498f1c5112f03483ac2adc9871b1332dc56b8e1a64206e146b3afb0ae014058dfb0ede58eb0baa14158d5d832ac6dc0c29a260061656383b0a2b1ed254f58d7e809ab1a02086b1a3cc27ac627ac680c20ac67701056333a08ab999fb096e91156323e62a10e0943d8d984f3ef88c0ce5858cb9085750c01c24ac68fb0be004858c7081276ffa0cf618f56690af30ea0b00508ab180fc22a86354058c3b01328ecfe016400200f800a1004c80f02c8623e7afc74c0c1007c7808a087678300c04a0d7600e095c1255f070639765c3a38c61c1c202020a09b1610d0e775404040dc0654a9cf0fe8d34b05ec1758f352eb9c73d6efd9f81446c75e63718dc65cf4fbc5d0988b5ed702e66f2f42fdbe29f4d7df6e0a5890f4d7ed53a0dfb3f93d2b7284c2286c85857d9c674da686cdb3869b3c99201e2981c2fc7bb43167c3fc93a64c295a828ebac71fc873506073afc13ebfdf4c0f4c51bee066c2cd14e509065560d3984e8eedfb37406395c676be7fd668ccc118eafb4da0310dbe7f2ad1988eef9f5a68cc655ff5fd25d0d8fdfe994463e237f937dffd23d098cdf78eef158e7f7d3f0a3496f39dc1f748beee062f80e7791c32838bf4cae001f02c72c74582edf8f253e4bd4802e8799c0f49f22201e03ef91fa9c145eac1799ef7481d17a9d4e003f01de9ba4897fcd773648e8be4e29e923b174983003cec7548a41ccfbd8ef9373a7ee7b9fb846786c15b1249c77db2c10c29f53a76def52089b4739fdccc90bcdfb94f52b3ff1c1749e7ede3209140d7df7c8b4472dd7c8e57914837f7099d218d6f73bcea51aa073fc77dd2b39148aafba40033a4f07580f7c9cebbee93d60c697bd7db90481b08e03ec13143fa7ee77bee136f8644dff59544c2b94f5833249cb73cf7c99c21dd7c8edfe03ee166482aa400dc27ae1912f72ed87df29a21e178fb3b5e2cef13d50c497c1dafc17d229b2175bff33bee13d40cc9e673fc8a44cae099201dcd00709f683043aaeffa7b9fc06648396f2fd2fd2773867a279198201dcd5ef789073324fb3a743cea22dd3c52eb916c1e69f5accfe03e89cd9050bf732f12f748db23d5477af23ef119d2ea73fc9348feae8ba4e322818f847aa4ef91baf7fec99cb91e0312a9f5392ed29339dbb948f691548f947aa4f0c5775d249d47c2f148e323e17cce03511d1207595258ff481ea1b0fe1c12050aebc721e7140aebbf215ba40d390285f5b3c849a3b0fe15399728acdf9296c2fa55a48cc2fa53640914d62f923389c2fa437266a1b07e9044914014d6ff91265058bf474e250aebefc8a985c2fa39f229ac7f232bb9010a934261fd4ece1a85f54f324933bd9005e76682620613519c64fe8847a39ee97551a219539f7f863f8452d1fa414a54aa399378edb924be65674be25ac610f549bc88162a8967b15e12bfa2a4bb39892f29a15f2fbd3927f129aa9b3be7f27234abf7f76cbefb4a57abd6bdacebd1c4cb7dd310b5c4795d5851f443753cb8e9e3b610e575f57b54d7766a42795d5d9a4d4ea7705bc8839796969696266d69d2266dd226ad9d266d042f7b4e3eee85f37c7c7c7c7c7c1efccff338bb8d150d8dd9b7d7bdd84fdd176f1e438bf2ec6d8775f49d0d9b7d8a4ff1293ec5a7f8143329ffd104b6333d999d9b43ba86bb7b38d51112bed866c2edd3b1a9643b369d288cfa8f5eec54928d65ac298cac782ad1d8061a46df8c92192533434ad389c68e348cfe385a4bdfc919a57b282dd3b0793a354dda45ffc4e00c8ff48fa677d6d7f1356ca668bc600227a9cf4ab2bd0d8dfb5693ee6f92c2c781227e8e52eac719548fa3d7d8d749b27ad7fbd3261a732787f9bf99b16beee4e4e422a70e397190a37f0e396f98522614a71549bf78e96f49ea8572a135ba85a45a6811340bbde24ef4b3539a13f6a734a7611e1e1e5f5ae2f1255feaee994ea3f908fe9e67ed38d276aa3c33f3e0397ffed0a4b2cd99493cbfa97bfcbb9b4bec74692639a54dfe74c9dfe94cf2b2742a5efabcc14b1fca5ee93f647e30e79533b67e9e496dd8afdf865d401bb671dd301d9a6f60fa4c50c0e06682f20567bac4048509d325f771a57fd0aa33535d68983e92fe31bf8778fc4af7cc244aeb1f8d296851e3e7f9f812fff9993a65711f49e6a54e5e6c29028c1b5a9eb684a989e132c68b992f6792503449a89a356bd460faae86cd943af995eea194524ae91a9b27982698fe04e3e3258dfd782c88c3e80b71580c048721f192bea3b17926791a4ae9cf2c34d633cfce599679dda97be8d3f734b6fbec597ce8acdb3775a7fed1ddeee97b161af371187df066cf8e4dbd9be583dc49f13384bbf9411885786987dacb0f26923395e6e100f6f6f5b725ef818f7a50fcf0c5d4ab566f7f65f3acb769fd8dfb7ddd90efad96b5a177c49a4e845ba729a76ecc44774a6b92ceccff8d59f84e5033fafd5fe9f55b64c43df72afa5eb737fadefbfe1daf1e7da3efb7d1dfdfc99c19715fbbf7e8f7b7eafb1b79cffdd6bd11eae93b415996aa7aef6fb43db7fabe7b2390658dc007534e5033f132d191ba4c74a0dee87bd6753267e08a3e57df687bd5173999b32223f0bb77829ad9ab4adda2af7bf7de887efd249d99185ef036eafb5a64b4fd86faaef74546f4bd37eabe7a779cb322a38ebbafed5623eaf7bdc76a7627002bf5204967466fd1900ea34e8a19bd454e5233fa49387563a25a93a433a35fc4448713d46f95de2223f1719e892a4967a6d362d914b80a553b2d1c964d8136aad588c36ad91478b3b269e1b42c2b057edb1bdd3c1dd281d362a5de287cfb454e5028afdefcf6465ce8c2f1e3f6e3788b8c3c940bc72d324255afd328cd76705a2c0b163941cd5c97898e356bd6cc74726e9111ea715a2c9b02bf6e7ba3f0e91719798fd362d914f8d1370abffb22a3cad9d41719a91eecde28fc0fe7bebc875bef31bf75df7b788b75775677b47754dd9dd46d89f7f546e17df05ad4edef86deadde637e773defe15f64c4ddd07bccdf8ceaf5bcc77c7aabf7f0ef3772cdcf0bb88036ac92fea1ef87bc1fea7e88fba1ed87ea0f2dc18036b4a46bc2fe4bba86e90729e957d237fff74abe9b77bc57e2dd3c76afa4bbb9c5bd12ee66bbbd92ede6b0be92da4afca9b7fb3d0107cffbf2727601f692fade2fd9fef396d0077ffe12f153bfc4aa7eb5c486f5ad5f8273f3394b708cafb364e787e61dd2b1c4f539964c25434343e60f1972fdd0f843383fc4fa21d50fd10fff83ef3f986bd6cc1f9af3e6a1e9ca71f38eebe61f756ec631debc73937333cecdcd23ab75b30debe6966a75b355dd6cc3d4cd62787348ff041d0cde8ca2379fa083bf9bbb86f3093ad8bbb9930277433a4ed0c1f5e6eea4c0f4331187e93d0107fb7dedccea02e8f343859fcaa3dc900a9f80833725f3be28d7a1ee0e0afcee28a63c4b3bd44d1762ee7a29d7766bfd26bd02767d254475eb38cf437da9ef0fc130257ebf5dbd92d6f7b75298d57a220edb3c110e1e52e19cef1f437cf34a4ea838e7892ac679a2161e32007611b1f0f84a885018c72b3981c3ae2772aca384c8620c5e09918773fcce138d7888621d4a885258c9098e755c9fdd4352b276cffc1d72eb9ef92ef2d321bdee998f83ecb8b07b40942a25da150be7a6d53d3638c6eec9d9e91e974e0e0cba67be9347184c8a86e3ca5cc1f4098832645e65c89cca7895211b52bbe24b143a9489828aa62fa2b8e286973494d278b2c21317c830d8f852c0515106c5e4840c96fe9e595c46dcc7b07e7d0cdb7f848ff0bc4718a4944ea9b54a99d337dfae2739d164abd79b10a0225e4e313c1919cac5d7940243468609b129050699205229a875fcf1f1bae0b400737fa69feb6707398eab71dbb63506678b41477c4a4ae99171db6c456d95a49ee339939c4071950e74ffe11691541a0dc9a4d166dd3b92aecdba5b84c2fa81dc27ae4d4c4eb21ced404589279e38828b2e477052684b6c61011a6f589154034db2e1260c99166e26275060103793935a0bb2607f07c3660f4f2d34c6cddaf4c2714e9ef4d4b3a9a584a7cd2cb31228cca3b17156c92314d67d7753e0ca8d6c0aabd725424dc1fb3aebd9ec88c775bfd5efae11f775fbed3db2088b08938c114fd066ded72f32e2be7bef1a71dfd5af3e85c69668acbef7a04e4fa42f79e957f07c5a539808db73bf3de712a13e77e429cc7dca12f6cf5e16dc19186d47ee1c19d0eb1fd367fda06a098fd0e208403e6b53cbcc329bd0386d7a7132f324a66953189169ff68067eeabaea8b68e652bd47bc6b8666a794243c954428021ff5ab17a148f5e173af646884d5773f02f7e20755f11ea4a412faf637fb2d8e10fef64a86964c3c34c4809ea59e013d63fdd0082e113ed47fdfb3d4082e11526ff336378519eb12712914367f455ad2e5cffdd10ca424037ad624f5df83531401f5dfd311c411c01154d793286c7eeabae88b5fc495b24f6972d17bc4bb2385cdef6ec9912ebf477c286ccaf0fca39991ea887ac706d8fe7a9951eb8b4e202c9701194e423fa4a1f75e3f0bc9b0f7df831e195633b66e1e6e3c45059c30bb9b01d9e6ee0258b3091b16f3699f1c17d81ce259af8fcccbf9d3c50722c430a20c270244603b08ce39ddeb5ac9adb9a63eb94e0a08aa3c48459bb0d953c108b83071c3123687b862af7b985023b0b9d694b0218914d85cb7d8eca1e00426b0d91381086cf6b4d8ec2171841145d85c89b0b90e2144169bbd204a60b387e58acd9e1512d85c81b8c166ef072e1b78c1fd1b8844265eb2b956a9c1871e6cae9852e181eef023060985d89dcc23767777fa1b3964847df64f8f0e7af4e8d1a3470697ecd1a3470fead38379a7970488830d4b31c8dbbc276d003815e01d54bb76d9edd38d789ed83f80e77dcd2be09cee94d6ba6d1cd989441c13754f1fe9bcb049ef0b9b4489441c1fe99e468160188a4da644228e79baa7bf532a95b5ab158b6563d36af24624e2d8eb960d0e0e0e8e881382281c9ccfc3c1c1c1f1a923958f70170504bbbbbb1b053542257491eeeeeea65d80ce71371371787bdfb6a7cf711cc77146558af5ebd19eb4916cb3f98ef3c455e62d329a194df718c089bb824b86503cc471550d4d7c42bf374143c32d2a200754291922c3fd433adcf7c30d72b5721c572bbda95c84a737ada9a33927194a6ba594a43450f7908a43b61f9a6b30b7e1f960a5d5676fa96c846bf74c223a286decb90f5a6fed1e319410a1d89b3ce613a93ee712d8f8f66ade7cc4ad5a5ef6ede9420724b033070b761ecde9c2bd440b4b2cdc4c63b04c711fd561f5bb082f51bf744575c314abe425903749a1a0862564a62b21cc87c44baf48fbfcd8bccad68d97136c51ba854f29a554dc3e14c9c6dc465a5477c385f3e752de5aad56abd40b367b9337b99383b1f1569fedc8fafc9d0c88be77b3ecbb9475537775edb52173106f719b96225ad535259b67ade6e50b971c76fcd227882cc78eb5e3f85f963e329c5d8988cb7265c90669c1e699258b962d4594b21f1fd70fceae14a6cc53102a536e4891bd923d9541e3e9e9e90b319e28ede929c9667f5aba4265c7a5f3e58fcf8e4b679c4d25a64d5e0b53664c1b32293328b1c84efd80c0e6a9a424e586195c5ffaf0943c3f5066d26cc2f28162f3a44d5a6d3671d9f1794a2fa98bea506bc7f11f8d8f1a143a9e2836b7990da05044348e5ff6fd9db1157a2f9c67939772259e336684ba95e80c44b8a7d78bcdae94030f5489c22a087683ab4f5127accbd03e68973574ac6b98e85926902547d8668bc398aa61ac67b17eb26ee8e51489d0356bb0bd4093473d725dc9cb7a44f555f5f6924f6c092608510048e7717cf6c6d7e4411f45be975487e2a03f7e649e66b2cf806b0eb8fe8a6c2ffb0db83e4866b782eb7364162ac58429c1a337bf30154551144551144551144551144551144551144551144551144551144571cc51fac9833e487746da4477707625a117182724edfff4f4f4f4f4f46426bb92983161707cce676f67f452c49123be2f116d4d5f8ad890dd3b76ec50fc30cfa6dec1f4371aa44576ff6b44850d3832f2605b2348638f0acb121576abefc897ff2abf15b9e408af8ee808bb300c571783c9a3fed3d8917e1fa02348bca44a35aad4546936e57cfdd6e4218aef4f349673db61e257afc18cb21f9f1bb25b2d0c30c0c04e1ee2578789d99b82eb7b3e422d9ef27543b6f5c20986a8feb6e1a02606f2b256900ba748c446fc71dc20838945c3eae70ed377d9746ca494b646b0620bbeea592d8600162912e61c4cbb77250aababf1e9f704329b268ffab76ab1b41659fde84a34a66a189d40424a7ff5dfcd8ef36c5a728451df5e86e210fa93477d201a9b4dac9b02b7f19b2ad1d8788f50255c1f6cf2b2567184c6fcc961f5ebc5fe34d3627d8afbc8fe947df2dfe033b80fefebfb93fbe870fd9f401a572f45d29b3cc4ed43524945b697431b320b8514874c80bdd831f737e4c42d72621b72e2664dbc2227b6e4c42a726270e2d86f77741f356f80c5b79f33c0620cdd533fa7b0f8ae8ef91355b58fd48b6fd3b19c173f9c40a8d2e4515f7cf1ab28be15c91f1eac58eb8b77f4271a9b4d1456bf5af0554fb83e8d61f5f5a9d20472e47f02a16bd6609a758cafea188ea74fdb07ebe9771dd3119fbe0ed9354c7c1649bb141f07a96a98f82329be155f258aaf7a57bd8b2188afbaa197f4e2231388eaebcf261a1bdffeea36ad1ecc59e9a03f92aa86d15791dd3ce8e7905dc3e8a748da65f76208f47e0f4443727b90acff915e9e760c697764e3f3090e1c8f4ff57e5221a04f7934cbf668d60fbabd25b6df6f49210ef3f9e1a818d40f82d9372021781b326a33f87b7268e64f7d2e559f7d3c205c7f23c3d51fcd44f1ed2311c35fdda2d5875f645ffca3190a7cfb4850bf7af0eda748d77cd61fcd54a46b5ed702549f7a24aa4ffdfcd42dc2322f92d4b36e916bbea530ee8f66a92f72cdab0409eb6d9e013d6be25118f7f66d6e5191cddb5cd6d14cf547b3efd9ea4988c2f66c757b666f8aec9948f62c3c9aa1c8a3d9f79524e2b0bf8b417e8b903c5ab0f4bd2bc4cb72080a2c7d7f1f1a13e230ee430ce425f750ecf78b431d55f796400ed23ce1eac2f3924386da44073e54158c5d2697960b4c3c0b4bfc14260dd2d49a010840c583a014142048901a405a58bc1fa31302b0849069e0428db546e0f9184dd06347d34f8e147430048cca4101de9803683de17380357804cd20000e74e8d9e1846783589700fc1002e6010c65100b3c0d5e6becd841a50260a705ef152446cd40a68277770c514914fcce93a72307adea08a1028707408c439ce4eca8e1749074232ba3b60800850d6b880f2b991376e7063b5f659d6ac85a030ee98292e1e07142dea85b072ca01c38f90e18e60b0c3b1f880ddb1e142008901f1f06954070924ab8af50e87a324271f600003e9ca1d0d7c1664f8dcd95003ed8ec052511b486cd5eab04367b75c31a40b1b9b66e184f6073dd2185cd35871243c4e0f0c4246e417100368242c0c10e3b92624ed8ecfd20c28318829a5e6cd85c77f460739dd8c32e0ea370d018322644ec6cd9f1a2a5c042aaf0c08a6b08c53778c33b986cf63a78222b637325c00a86549141e132922b5601ee2fb8ff08ff8844261e9a6bb0cdc2e66a43231245964310cde65a1f857f6cf8c78f7a3d0ae3208b1d32d8ece5895f62d8ec152008901f1edcb40c901a9a6bb0cb88013e4c6f4e01fba5fe15d174fa631a4442937d25d2041ac30da3ef84192930ed2c489cbb2606a87b8ef0e2653f79d9f8c57cab071c51f3b2fda953ef9ad3281029240536772d09f76bb083cd5d6bc1faf09ef338d7e30d67cec5809ea1bea86bb30e7cdf01d4af2a8d56bff1f79ccbbb4750b729acf1376e247d62ebcd32dc597067f019e1f511cb559a1241d566bf55c7b269dde0e48c38745c3b3930d0f1e4cde05b0c7a3d908740be858b18e1a348a1e6e2852cac542c30e182229acb16a0ae919101f7ca008335768988cb2224c81832c825317843b54ae2c2c30d41a8149181a143f63a90522c2a4ec8a0249b5240f82193e307831c34d1c689055f60ee67931f28477cc670f9ecb894c21b20acb08282cfa421e131838347074713306787334108f19c19a12c93538e393a5440e1f812461198fb12844a31107889b979e1dc60e0c6c73d12a1179812de0c9b4791445bcb868957c4cb260aec94d13d8ae3ee7be93b3aa2d8fc7ad4a3fee561c83dd88941a1a780971331f480b91a44680773d78431ccf7a8d56ab4b6d5eabed57362d0e7b3fa5632a1d617dba348a116b6d672b5a2beb72d6c5f1d88e08b18d86e966703360cf0512451c52a951786a0eaab18041255ac1a55b362a2f005a947914221164510f5de04e24d1e5cea1b31d76ae510a352db47c5a0945088c5f74205b415405861058b29f1a28051395c38b2d21b295eb472a1f7db83f7e3b287c310a33e87a8f066eeb7c69c11a64313d34b4431a53783799900fba74752166c7faeb88251c3d42faa0be69c75ce39bb67fb5abd9848f5a97651b9a82da860ea16558b9a05a513a93a552cea15d58a5a45a5a24ee14695a236d5282a0bea0aea970a457da23a51bdd42e4da8c072616209a69a123689146c41c1094ca00589238cb0a10822861022cb9cf34b1025c03251504055d3addb3aef364a7debb66eeb368eebaaaaebb6be35109ec9c3b9dfb8f7b8f7e7f1b8cf37dc67ebf17075e3b89fdc771be781faa0e76d9c0e6e166e14eef7f6be1fc7ed418ffb3831687bb0db2ae51c1b7562d0f69d48240875aff33c6fdaa4ba5b8f9c4ce283fa02e21d3d79cc1dd83f7778fe6d1fdedb8ed9397f6b20afc9c37ffeec1fddcff70904f5f36bfff87e48c514cf3add29158904c1dc83aa89dd07092078cbe6e2b3874b540f1f14ad1c5737d4251dbbe73e7e4c211e60ff5900f0368595db27364c487dd7b1e2a636972a1ab9a147725d6ea81338d2db48c51cde3c80a911eebb9372f635819493874f1e9d4b8c22bd796cff91b57bb6727b8f0cbbdcbe088dd9866def5f4e205bf3d8b60e6f9f0380fdaf043cd10889eb83dfec4953dd9dd9a8faf43ccff3da26c525e9a7cfc51a09ecfc0d073bff063bb711d8d9fda300b87f724fa4f17ca28987cca1b906cfb9d9d001d9f1c6776227e8859b08be7093820ab71ac0700b41186e3488e136432adc6450855b0c36ecfec101065763133b7f156e30b0c24dc926dca2b4c2ed859b7003014eb841c9093717461c61f78f00943e387037f90d2b801a1ce1d6824eb83d71855bd24eb8b19023dc9c60106e01563695a4705efe0fa6140acffba030693cb83e57f208d133af51a82c418cbf90503074c7ab4df539b79ed04e102f27f584461f2f679509b5302d22c216bf845a36d7270a73110ebd0c314501d7a7a48e015c607bf2a0d4c3114117a03e40c77c1c36ff88df3ce2a6b9a1a040428a8040bdfaa005932a64e842a58cdcc6123c90b1d4c40f2bf0a25bc3250914ac81038d56c393166898828a1c92567862438b378e5080c31560ac445133840e42340de1c60fb51798a105156e1c91c08d1068b18313172d74d0409426d2388d60875a125f3a35626859d638a28927c678a181062e6da0f1e18516dca082ae8d316a20d142932cbe5042e3a8871fc280018d2d92503045125d9a2d9ca062ca15247cf8218a0a6e3441c3182526ca208144c7066e2223268715b41c11446bd12408305b94d88205308440536b728511566871c60b2088b012060c67a051831a58585923852c48b519aed042ccd30e5ad618228d10633891e9410d9d2d20d80266890820d044a08b1a5ed0b4031561b491431a60b058630551d22ced80035dc10c4fae206308266010c1992035354fa8a0a58a0bbec000085250c604568c00828c0c68f8110b5ace68810833c2940089510c14bc4043931dcaac008233808af8d034323c01f1c314343170e82a7200a34312522ce1000216ccf0f152462990d366824a19353265aa04a1045da10448486831c30568e430a365549899e9b005c2149bc2cd54664b53ab0b1ca42cf15005082c69ba10d18524d38574a30bb94617128c2e2e7421c37421c9e8f2a275e33aef4381a19852ad403862825093a42954b678e935af9c870a5396358a4e62d004d367bc9c68bcc4a0f6d48bc7e699334d3836b9607f9ac563738bc3fc63738ac3fc63b389c74c7098ff162d53aecc2653c4cc80bfd024f741a92cb5dedfafb80f2dcec57d7ca00f51b57aeebd08ecbe05e7b3d7723efb17ec5ec5e84f387c8c8ea3c1eefaec6ab03f76c26657aa02fbfb0d5ce60c4ad3a7cc7ae0c29ec19e89386fe21eec78d29cd284cd338c93992062c28c518d200c9ba7972d55c8be78694aed00c6e679658a969f2c578a10ad6061f3546a82fde70d3e7306f760c72614c11536f79949e34181a8089c95c0e22e2c05dc47162a7195a49f41c03dd879ff114a701f36efbf8312836c482c6c45895dc5e5effac4a015cd869f584547c713835440d89627da2a387074629028c5ee74e25865fc1b158c600ef6c5898f22abe4e46c62d00702cbb38965151c9c2af6a78a3e556e6eb6156c105995d6dfa8a0453a9529355821d9a7dca8c03eb17ce585a9cc15dc0337139933d8254291910a9ea6a8cde8f7acbdd01aa5d749d064c8641f5082ca135e58f9a225a9c798a18692939395197e20f3c446260a0ecab49a283e6801468d1767b2c8c145095eb0b2031647e04006068e4c0d1d9091d5f051c88842c50a5e48437b61881f9450e38a16686c2861338501ca90d58025056bb0e022822b2b40b14245093672f092c61865a8f095d1428f31b21a7e05108841b342981378a1c384152390e18a11a061c697da34003264359cf082323bb860a5073584e896aeb891451056aab8718259f70d03ee3adc79192305773fb87b01ee3a590d5e0c6fa0b20099923e2ac504effd8b74ef5f72ef7d9e3434dee736333e59a7dc4d9e4f96e5aed5f732d6ac963cb330294162d414a3279ab71d4de936a08dfedc5c00bbbb3f7fae95c4f56792eaee9cdfcc7dd71cf7dba4e1aef5bbdfb6ae7194e3e873b5f6385adbdbed075f074e42d700bb7fcc0dd377918426eb3feb7c129aecec1f4e42939dfd63763bdd6adb542ec2fe5fd0ef57b6b866276ea62860707b3944dfa0614aa5b079d29c581bdc4c63a280c0024b83cd5d631ae3848ac0e66722e30b9c3dea3d68b62710a761ef363878c14e5c89542fe90fe454a2d1683acce69c73cea52c5a660dcf396523933c254bab62cca029817af19ada09c8ab572f7d643fc3704abd3f42d8a6f329fd9830e1ea669468341598665d9b5ab22c6d3f9326ad846e316d6674b24db9bd8c32eb53b60542dddcb5ef5b99308dc69c4b0934e654a614252e9e184b85c666989e5c1ae63f3ad9266fe26594599f5c8ed662e76e162f1b670f83fd39226878c20578bb794e09e33eb6ea791834bc98a20c9c9d4b07050c2ff00267a7c2a191022dc6c0d99b6c4d569e2ce1029c6798aa854303298c18384f2ed5db485abd56510bdd2ef7db17d5e7dc8d2d4ab4593d72dfd2805f7ff19658ca8257b897a8b205b73846f7f35fdd052a22c4cb0986052a649ca2051f9feb82bbaeebbaae7ba0225dd7791d13195c70d7755dc77170c3f8e3b0f1c5f3025be495d0601bdc4c6408813fdc4c642ce1ece339e73252afaa7b6690576127ce2a3c5fd53fda48537a5330a295fe0af58b92e6acde37da36270adb9a286c1ad123f74d0cd8afbc3de1d94ea6e0666ae2d44fb8999092c054a97fd05af74c06f88c6af130ec9734b601156b709185363b5262cd6c3e0a3f6c7862a9469bcda3d9fca9946a628a279468b3aecd2d0d9a29342dfed96949f3043960a9cde6bb146f6a4223c689c6fc697ecfa699397f2e65995a4ca031aa85c2e6cf3f4263407e68ca329b3f4209aec5d21855a23420198dcd59762d7eb5606f6e4ff50bfafdfe8de7972025eb7b345652d8fc29abf7296cb672b216a863475594d48cc007163cc180c66c7e918e1d25d1c41a40a8b1d2c30d67cc9a1c0bd813c8d0c44a4e18eaf0c4441ab74f20000087341898a5065e8da14a89667008a2c8c05f17d8eb9e333a0cbca141bba7fd8c3368e00e0ccc7d813732b8d231d8bdc0b37b7a09dcdd63833dec4dc7029cf35db3e9eaeb5a00f7de8bd0fd7653d8be7befa68005c9f69df72974cf5d577fcfb8ef19e759991a366f5d159f790fe464120088c2a27ebb45dba3bee8fbf039d2e50ffed1ac23bbe71ec973b7088b5f24dc83b72805d483cf7d510a5890a0aecb5f7cf0c14fc1b580f0518f44bc2e7f20f0c3ebf2ab0449f86259433deabb3f9a89f34318eaf3839f7d50288fecd91417e033d41d7d8672ff9ef9ec5348010b92edbaea7bcf3df7297cd755af6b01dd6f8fc4bbaefa1ba0b0f9651a3352a4e1050f642c31e3bebbae7a9520e946a030ef8205529412b44002302404617bd66166de2d3a4261f3bb12da4c37cd7ac63d583260ceb61fe974af9dcc199623db027cb6ddefa83ab7c64a0f19c458a6314b6a5888d243053b1f25a6c713377ec6d8f936527ed2b0f32bee259ad490a4c68f992c3d5648fa01cd16619caca00708cee81185898c353d461006192b08c349173d60588205177461976001053d98d8f91e116ffca4b1f35536f4a8c1cef7702f9114c30f1876fe877b092765f470c12e91d4c40dbb040b55e0ee56b73090ab7ed4b0f339dc4c6376c01d02c8011b2e2ebc1c31d41eecfce92dd0cf4183362a017a08dae205a5d1ba323b3fe8de8e29a9410bb56583376aa951e448a20e09a32e11c31326f296130740134403075376b010f3f26308cf03a5a0285e68ea0e1e765c081253652bec10a2ee9c60a78b9e42c8141efc907728d1010b323295005f86f4207b62670476bec5a2b2de18b2848c049e9035b583157080c58e18c2481df13f633daf1627a3bbc783f5af3e8328ad5b6be3ba9dcefb2a9dad93ca47d89b3cfad5e0fe0d8d8f4e769d6784f307be1d0e054e10043f94d8f226ad94760fad3bad71dcf172c76ed55a6b2df5d960ca85449c715f8d661e85795c884c1cda298a626f296ff2089d7c795912f142d1e747e5f3b3e1a4f206c4544ad56e5bceb2a9d46da64d77a93c9452a944222adfb1221195933c413e44b85593d9a771a8e310b142276dbc856f16aa1be947598e8ac03ea712aed3797c28f670c4eaa59361508ee88d36ac71358e5635a646710cc7711cc171447de3e87523b7553afa38ceb13b48e525b89960271c6dbe7a019dbe9144be1561a7d4e70e9ee7733aa9b5560142683dcfdbbc0e53b9885a71779f258f17d66d6b715dcb8a41adeff33a10e436b0520727d8aaed8c5103a07b055a73f4e6f439e79cd3e79cd35be3c4d69b4ed6969721977219e1704e01cf7731add0473add6de82ec68031b47e29e0250d6918b6822cd77525122f7fdab642db0a27994ab59752a93c95b5abd58ac562d9d8b4ea246f6e268e18e4ee4e012f7bdee4e4e4b4726c7272727258393939202ae7f3ba9c9c1c6ecba934c7e70eef8c0da73b6d8d1bc785d6ebbacef3beef080ad524181486612b4ca582ac55ad56abd46ab55aadb64a7d351b070765622696febcd5cb76a2d6cc2ddb3dfd2d83e71bdd36dfa64704fa78f9d3756e35e57a7a836429795e25cfab15769ded3aeb75dc565128eaf38b02824e299d5508c5c1f6edb2e9e6db84c0f42aad1bf5b96d41cc39dd29f5c24aabc771dd14071b5acff3be8ef374f0aafdd78ed3cdb76d9b5b7fa99cc20fe114e265ff76a41b775addd3799ef77d1f0ac5e35356309ca4188a478e02f65c6230787eea09cf4f3975cf7c2d5b8a903295848af0bca6d3babb674f355e7a133caf2a9ca4b575c56255168bc5a23e6fbe235e5e524a7d76ddb07f15029c4e200071f13040a13782102fbdc8bc0cd26064e0d7715bfd9afafc50b3f99fd19c3409b07bb6975e67adcda596e6fb9cd32ba5730c2fac94f616016fbad3eacd9d89478ff336cfab9ee7d1b653805588e3388e9bef5ce5b839a14ca5e66ea6d539cee9b6ede0eebd70fd496b2d79f20bbb7b9d5cedba8e769d775d37bbaeebba9d1a8517564abdb0f2f894ddd3cdd5aeab1c87259c745207804221e5ac3f470e19e14a6bdd809773035e4e6fe15ab97076cd422d20bad1dbb70ea1989bd504ee74cbb309cfc74cac4f32d76df2e8f72040d027e9517ab363ff2db43e7f734af3185a4aceb97921277e28146aa2e8147e03a41fa8044bd86a4341c8184333020c00100013160030381c0e0b85a25996069ab80714000e85aa48624e1c8aa32488619831c62062882100000000034330539b00e635419bb1fa4a23291a964aed6c717ff0195757aa3a71f7718fca348e8081fb687243574827f93eec95d5e45599ca5ce9d9806bd780efdad1f55b1c89ea05d34283273965ad755716141cdc85d32178877baa72cf97731807b6389c217d3eca24c677479cea28df5e0ef5df05ad8b4d74cce49d2cf4d904e810c0efc6f20b41c08c7d55f936a847b25617cac1e6437751c183ff90f3328d3fd99be505258b863e43c5197660489bb57fc80810711d02f765dec9d5d93c7576a5c383660d29e6a3064666168f66d025409c1d2f6ce24007d7188c66cb8140edb4504a8093a3fd92aaa97c35533958d59137382c01e71311bf13c75a34c965820bc9c97da8af84c6e53de05758ad8632a782b5dbe2ec41d3b3c3ba0c74341c1b0688d4c64cabb21802281976c2319c40bea89d8d839661cc85c26c64211d9620d315e977965c7ca04562760f5e94abcec3f020e9d7d69ab0ef3f1e5c6cf4daaf9a933b47abb98fdd0c908b8868515ed7a0c64c283d708a94cec08a14d9714135f1aa39b8f4ed9924324ae2286449ed7eb63f84259dd8bda0414045b475ad63d5228dff1015cef2014ff3a164b1441e9a7165d0c7925bf037b6425374b52a5ddc1620f09072703f3913d5752ce00b8aa8d3eab1033d024e67bc9915b2d291d194d3f440fee9de237e9c362ef6506d84cf7e08239bd40024a95e32753517146d4bef02a83ed5afc4e7cbedca794def2814b8d9839cad111ca9adfae4e0a6667ef1154773e1bba79fa613589e50be64262f13bdb7c275486f886dc41ab186d8462c18eb45775f75f5219ff3619ff3619ff9309ffb5060f7cda77cd6d727379bc108d8c98b7e8fcd44bc70e6888ff8cc172b3689e06db53b191c78c1b2198fc94e211175d2fdf105604c3f2f88d10672b45364444160dedd4d5e6f6cd4da8a612439d2df6a10b30da124078d26bbd25552cddfc72c64360dc03c3c43c424009b1c3785cb0214c78cf8ec5e6b4efa9fc745b73fb94424cc552eaa02b1a50a44f805f46d41cd07205bac9e180bef49a395c0522fbee12aa49e66a9a995f639b5c9c5bb34f130dfe1f00e900bdb961f3b949d89ab2df88118ae910cf05cbd5d1ee835285a5c2bced43fc40a1f02d7c9f48a6c97a745f27ef450c22225c489405d88ebdfe1465aabb5d93e72b5b67d17ccb1017229c0295c1a9ae3f8e2a7394e5992cad00fb5f9c29f54ca40725c955ed53eb45054da9fca112433151238af85fe8a1f2a5c9c136bf0c53e6b9d8396489842fa980ab16070465f0deb6c24c8df34587e96a5cc1be0d020f079074cd4ea80cba50df933f8659ae12bd424821c11edab3e4746b2c995f507d51358788e24cc87956da69f3d30c73a5fee97193b0724e49bd3c1dfa36549c9bd11f652fedc5fdd29e97121bf4fc1ef57f052f961559264391c67cd795425bcf8f146b139c39f31ef6b060eca41b14381fba1e871b06fffc4e4d94c861633d3e7a6f320f282bc2d11271eb6f2e9b897dcf4c9221c8b7acea105fc8005016af3a74614e5234f9b7d4f605e825c09559058ddd08fb90ded75370abe4e38c5254c9630b6525a4cba413ac030e80ff31bfdc2390f6adb1fdcafad3253ef1b72b104d4819785cbe3644c08b508a4b81efba798eae2e1ab64e3830826807de134f338ad176e13ca7cc5b8284f381dddc152d128e513f684e18f1f0f15033d9a5173236dc91288d20929db05768ed379cc2a9452ca08479c1b8a2168c99bae19c75fdc01687c846fc8fa6800a977aa29d51d5d65e963dc1de252f6fea7585af00002397546ec5c7614c34b694aca8079a7e4700c06bdcfd93a3545e769f83aa4d25c83666e7631b3f81919d1911eeffbb9dd7226d28a9775c5e241f85038a116e56eab3e58d008f5a3a5fa2f33a4752053a809788aceab3b930e844cf2180699ad07d68883e40e51da96371376d239bf518e1e7d45c04796be24e34b5f2c0e5a737888543f188d8067c3172913f9cd720b469e5703a9a39355446fc36a3e264174ca9c37892be441b5ac83b47f78266c0acc957b4c5530846cf71f98b64a6a0eaf11604767268c5ec9fb6743c821a7a5ac922abe94dbdeabebbe070ce4851fa0c372004c3544989441c7468198ad228ebdbc1397ec4d6601eda780caa878bc7477555c34641f561fb73e6aea3e3fc5d77ca7abe90a93225f740770dfc01799f6317c4e1ec5195ed760c9eeb3937a6d6a7d91f6fe8467c2451f5bafce400b4c27e928023522b1f0731ac2682e9b615d59d96c9f2130cd3ac206c0aca810067fe90c92a6bddcc529bd260559967f8059ca5955cedc79da48b283e9f67339e384edcdf7d9bd192010dd68dd2341f82dee0bca87a5ea6db8e0a2ffa463b8802b3bf9492827df9bfa8109f5246e3c414eb64f215b86b7b53ffd286662632186ae91fee71e2d12132e6c0e0cd58dbbe8ca492a40a372397bda3fa36a4211eaaa965c63dbadde5dbeac212002dacc6d50e265b4e0ee445b1b8a6f9dada810c36db597748f2250ea494e2cbe2cf66f82ad261e95d27819eb6d5b53ec63ce149c10e756fa2852bbf0da3019b0569a9026532855ad1b92372ea12be39e2596324a23e57e8d5eb10d13f389c7f7fa65d77a6293cdf769d604a54e252fc03d7ff74d64a55e9daace23429f71181349cf6c51cd4e6a6dd05c9f85606de9d6273460addcd6a3251602da220c0b1adfbb1a333a49e8dc3f0b701a23b2fbb26ce60752a8d107faae5a68f539995316a7ab090ee2d7c8c9baafee27a02ea9b14e099caccde9a949248b0bf76e60b39404e9eac6f0dc1b9a6a8739675212278d48dfcec8e2e1031dd4831705fe367616df1f6b6017ca9506bcf7b2ec47c97a0ae20e0efb6859d3f3c7d47e7338505c600b6d7ae81f6694604d7bbd3747881aca81486e682666381f05367204bd1cdeb6055fa245e21630dca073b4071e28c7a29f8bc660b7470c4d13dea4d997cc165b6d81516a5963c69f23b56f00b5bff940f91f480c6ae44bd7de2e19032464c36578e0850c1553a8198fc92591cac9aadf1a5a506944b7cf070f4845500345ec46043642667aeee7a1fbdc72e83e6e39743d7745e7a006ebe047f2d714278774e652d4b8f76df369acb24a67055de3054a354027d121b23104da9265eba950a95a6038bbaae7b04752c2d6d45fcd73c5842062d8745468c37a23830cb2c235ace521a159f985944fa24e3789949bd25d6cb19cba7adc283cbbb5c13f23889c4f5949a3041eb4f9262d10e9d0cbbbabfb555d81f7aaae6d46e96078f349656111fe8cca17c95527797fd2735d1cbe94fb7b55a7b142c687792c69ba78622e41a4303e7595d591f9247d3707a81745b10cdc854c3db08bebefe4fe1e586b4b14c806d314bf2bfd91c4f49c53d3c39832b7a27b46653df7643c4f85b195794e2fcec223522c77167a949144bdfb2a2e72367a27918373b3568c5db161c52471225a0010ab702d8eb6be96d1bb4673aeb5fb9f3c42fb344ebac4725ed838cdbb7042f305b0d9b47fe9ea06db058ea2b79dfa59bcc82cfa9489a6809b09b38d8faf34bb44109fe1041a5d838f55f1e1d3d6f4e87c2c62444d95b53c63924a4a2be169ff82734f1c8825d8ab6e3c0c409189ba8ae2eac56f8025b7ceb44939170dfba567730c15b1ff81d19da212da639724c016e4e2b572dc3b853a27c027e1f15c4bc286853f78ed3a3dce4e865a7b833d70cb54a08559e979ef2d0fbb6ae098d199946a83748a2bdf1a7711f491f3954e2069a0c82a38237581afa87f97ae9bbc15a2719274b5c0acdd32fe3c8500d9816d1e65e8c6e035b639a67eb85982834f5ab220053beae35083c216d0975029ea3dd703483bd437aead163715aa2b60a9159701c5f3d67ac7abe2efe7eb1cb9d9d6959a0fe2f375a5b212d94af3a8ce0e48dc32138abe981c223010667b8a5ef9101054ebf8f9c42308ef946d54501ba804c5dc943ca25761bdb9f5307443518d087fb2becdbc119841059979027a0255e53c434b0ef64778160a311689673c912c4bcf91480c0add29ce887504d49aa6ca8e516f81dce7493903cf01582ce8b0ba765b65183ec2f3d6582ace360b40ef3b685ecf15b0129649b987334995e8d3064f0b9bd6b6a8c7ced25ab4acb20eeb310b6f8614ad600924fde05e0d70d211dd3a760e683afc840ae73f886ec2f3873c52862d5187cec470d5dd85e611edf89612351586e17ecb6619e9617e41428e76b78a7aaced4dd195208b8b98dd5a8b9c64d6e942ef1f86e16588d754163a8bce1bc95d7b2637bdd231996c348aa38b7bbc1a91b23f5c5ab6310b78f62e00ffaa4bc8e6e8b2324558d1e33d29299d3f629986d30c00c6c756cebc728428b0a82e81aead360b2f58ee045176699f16a776b261e02143a24cd4d8614fe2398ff156d294844119a370ab6301c76908940eef12e10b721f5167a0ebaac8f5e28d5c2c515290ea75fce1ee74c3b14fdd01f6c31d62b883b56a20b214467b11706b31035091a279d7032c743b0d616905d2d242a42a6f281d4411b925d47e42a368874b03f41a8bb0cfb6a977bdc2c46d4186ec53c2cf307727b0ed5464450f4910e2667f32004b08492a9943dbec6d80c7e2c883a86d9515907e39848114dc4dd346599e3844d6e643b674600ad2988acf26f7a7d7a4bdb0b53bcd98aa283c50d1808a981de6ecaffcfd9b18a1c05d1aed99862ce4bb6969f2589196739fe957ff4fbfd7a4980c587269d0f4fb5f31dbeb58bcb81e932e787c96a6fdfcbe55ef2d08f354da5fcffac96f6484e9324b86a59bbbbac58e9569c0428c1022359d65cd1205e54687323898214d1c3738233ca014a3a598bd2d1028b68f6e48ebd9b098b4f9bc1a012c3807c856d713f792593734bdf77c49744ad0efe3ddd8ba69e06e2204cc4746b857b2dcb464b5e19fce22583382c30ed8018e744175aff87dd583870f240f195f8ba9333d053231200f74a4d314e8420fbaf1fa5191c0053a92824928e08c1c59af92df4eb2b7cfcfed22f8cb09c21f66ecb16efffda4bac30c23861d017f525121cac7ce5a7fa08fc7b4c9062c09d45b71e9e3ea8db0117b5558401b60fab2d4f693fe29996adf0f1b10bbe4ad10432eb42533a37cf31c7acf31bbafd38e0f8423eb520ec96306ca796e7300edc004e209380ab7e7fc2ac220f9a31fddf28abf64d6a7e2a4729fdab4254e8eb10efa69a1d0c51209389f3523c2884084d0b9c8d18a28036da619fb1814c27fcc05397144b17d5e28c4ec8a2fb51330714061054a216e1443316b7a39e9bace4a0bebb6c749a93528f942c5d42aba7654c10dce3b7aaf54d101c1d0cf451c5da3013b62f5064492c5eceeeb9a0c103699645995b13d4b45d2dfd915707c5e7b81174ad5751428905f56bec8a8bac97a58a2515e007e222e180123d2e98b795c78e36a0e8389d702fde38d99867ceb1d13fa633ac46d9238a6e98617739ba9b0664991f0fa929775e09f3b778ea726c87989c153bca4a0278cc902933d2fcef7efe4155acbbe9859a1b59d44fa5f70ac86e535e708d8a337b2ed9f87ee446a7558f616e2f57d7f40261e840b1852d4c80e1f218f1c0339b1b9a5e31f764705b499907e794ba728245425a2a08a6871152f61297e4f3200a2ac57fd54b4aa5f26fac55f69767ec07b68fdcd97512da9d23fb1df845085e5ecf6efc67f51084ad7a4a41c72dca47dc1817c4b009c1111d3bb779938d55c46ce2f4ba1ecbab8d368c75e8b3a153f7b16cafddf79ed70da1d1277907f7832cc26343086ae2f2253a66f720f66f0d719c37c77767ef4dec1320fe4ab17563246c2e1b3b1fc05283195b0ae5fcb47bad37b4f07f8ab2747889f3a5018da25b20546548889f4bb2eb0f6bd5bbbd899101cd48669f99d85c60d84568b54a1c140933bc659493717c23051cc7daecb38be6a4559a35153b800411e7616be7e905c4f8247a0b4de42ec4c8628b1023cbcc209c962cc5f3886338b150c36ed525d435d4da3a341f3b88c5d434be64c42e42fc148427c8ccbb1206cf5370c6fbeb4a4567689580774dfb99f30cef20a442f6ced6d99a99e2d005aecfdfdf102188b38e8653117ed5304a8ccf96e9281c4cd45c12087b385960f26f96f02350663041c03e9940db8573847863ade07b291b047d8394954d86a1d5563dcd3aa0fb83537b04afa503383d4e135d548eab818b8cc0799f7cfe55208ea51076778406b9752ff8ab4316a7942d26060493674221347810c08894654f7a551167fdc236fe7a2a8bcbfdd2bd129729534ed6661f36443099a514b8e8e758e8708ce1ca466f7f884a55db00fa5a99c86308aafe23e2830bc633760ffd0f21e14463ddf7686d9e271d3501f6eed612e6146228d502ff04b27ba5c90b81903166b5385d2c77f11e7d94dc8b14e32036314ef99837ecc095132d646bcde6c8704b48582cba1574b2b804bd3f10be11e5217f51755b1cb65651423d130eaf73210d35aa1d1f5829f73025725eba7f61601a1e6b25d5dc79e826c34c126cd18b66f30e51ec94792b13f3c2c1f4a90387fbc1c4a885f24665ddbcdb91cca98606c9c4a7975e47915440c6ff4a31cdebc7f1e292d6eb6de0f646a4be9bb182e8007e29da06d1fb48c619f19d8a88c724ad83c27949445d08a07870afcc033f18a40fe4950e060082da0fb585d8fc941ee83bd278bb57fc576ee03ae59b5459f2b4fd9e051ed83b0da078a32b9b4b6ffcee05fe58672e056d80b62b1e823c6e764954247d5f3c0aee1173999b5c1020e8ea556881249916877d40ed78f80688ef077b3497915845464e73ec7dcc169eb2a72d519b5b92566ffa10856c01aeda2c96571a1d48efb25772fa0adf55fc480d4987ab7c19d2641389896449ec31fe7227726681b87203298eb590e984a6c12c7f8750e07368394cf718e34227c830d1cbe7a4c911c329bac9d0fa9d9a0fa5afcc63c50fcf092840e118a9df8c158b6b6528bc824662fb389fe840646e850d67f695f39cbe2c065ae895cf9ced882713ffcf10c2856be731c6cc176dd1169aeb5ed57635d2f8b0b29fc7f2abb91d06266fcf12b388a75afd9bb3b166898c3f11528ca71ba98094594270a9d22790538b9b20dbce6c701939f8624b7e3b0616fdf7d70de08bd48cff24a4e0aeb1f9c4759830ade1f5e7f38a408561ff748c7cdda29b7c162f028325c33144936d8a771bd757c760c351e37d65cc609d627d6f43e05cedd1606077b44fc1e4213dd4ac8714bf03874838636e1bdea26d5398782bded77d83c59a5ca529c798ac286f8acc8b8ff7aedef7768b08a655506d7e9a7ad053adb39d8709243f8b35e74a419e86fb3d5b3554ef8c0ede96e731c3a29dbe81d436d8dc1684301f222b38ef9cda529a57b743fdc6ab8440901c758bf562cbdd82cbb5c6ce7a0f71f0b8656ce5640afed023ed77273532a1e6af96cf911d6004962a65c9e40161a821aa8aa5a15223b1b337e09f0296b12d6624350e000213899a4fa12bf0e89a9f248d44bf5e82afc013f5627734f2bbac3660f543573069056c896ae0c8244f5bb365cd9ad5245f801de62a3b313ba9d7634ca4d886f1e65aa3c79e2d05f005f74436ec04286fc7d52b08a5ebe7d1f1811ca2b3f924b304166df52888e6af4139779f7c88e98694e69bd10f5b388d34b5b0daece16152036c4184e691e9d530ce14ccc9c004b2e7f77812dc87e31047bf7aac7bc83bea76d6dc37dd8a74dd3944caeb2cfd3d7e47571710c62e8300ad7a6549cd725b7e0b5cf1cf66379b95e9aabb2b50a04021af77a1d498678510d8d0957f54412183fa3359735ee0984a9185b9d4390c1fb3dce5355cd894987f5f21b856a832ce443371b94157c89db8b7b9d171f05d5b5fac6c4b2f551d86cb1615930bbf1c944fb51de55fe0caca823684205255e2ed5603cd57bd4f43c86eb9216199a9689cc40922c8f1c66db5b2217a8132d9a74edc188af52e0d8b2eba670b9012c23839407f6e012ff5594a630a6f757b2077794120c8685bac76f75b8ff7bd122bd1c0c57d6577600ad7dc05d15ba52bcf4e776e835a34e0d86f92d69cbccade50122c32e7d2a849eb09b8859ea58c87e2a05324aebb77d4a4e42a77fe6dc3da3ca777004cb72aa0f069975134ada697867542b8278f491a32056ef427688ed57ea78e6061463335431eb0ee4be883d77c9e19196b736422038151d2beba3bef5d759810f20455e31585b7ef17a23cb6ce1dcfce95b8d119aee71acdab4d23d50c4a82cfe00fc6e0ed3b6f67118c245d169e2adee1267d9f93f861cf6a6886df0821561e472ba271191d8b23602ef8304d6373ade7b8ff54f96757bd216c19283a8aa735ca97437071644b3463cabba6f2a42b25bc6bd993b004929b006c0b44aec77b7a2de2e249b0fe583e4a3116f75e1d343e0f95094512678ed197023e14047007408acebbc2163dd46ec4ad74ffdf494d37041831ed0d1a8986c71a398d662ff7b784b9b56070ab05e60b341ecefb9c5eeb9259457c03b0bcc34411e4eaa6e1fa0eb33e8ea3dc5e3987bb2c260e0865f0f5f17513ebbb3149bcf2cc59388acd2a4b71ad6d3e7986cf33e9a5e8f98a52db6ec3377a99d44140af1dc3bf249178b09cb8b56257a880487299da34e6a2ed9150d4874b0883610c0faf8234d667f3517ab92aeee89bbb17e97042a4c08713eb59610901dc7a13724971037cc19c4f511b5ddde6a2c7d221ec705b64b67993e2729765649a03f22c7038a447b153415e6f20af23838aa4b65df4f1fd91fdb9ed18439098db9e2c6e58aac2fecc5c538bd8444bb17de4d17cb88cec5ed5f8950cdc4240eb2a55aa34fd697e1575cb6c7be10b5a3dd6b242381ea27ed9a168c3d4ef02e26dd40702c1c6b704fe7aca49ad7002550b1cce28dd9bbbbdc9f03eb09e22c881e77f80a8abcbbdf8f444aa2b6ceecda9e84af29aa274352192c360b237eac452cdcb72231918cdf3b0ac9cea9d74ed149f733ec08068232d0ff877a6b87b5888a570b9daac580bd47b98cac471a1bdfdfb1d0bf30fdfcee51a4b0f030ad3083c2bf48e8904438e125902deccb589b0ff91cd6c53b1f04c086e4001652ff19fd4c42ac807d9ffb0ca1316de2f822a2659ea39ce0cca624e81f8a78537b919b96fc58025c32dc894e35609e60f2f8077c880577ec1be945c32dbf8404f5d4de96df0237c63bde7e6a5eae3aa1340d0aab5eed8b0410cefda7222ae6825527141dabb44fc420d6bfa0ea69d1a46fb063f911cdc5feb1d583c0fdf9bd21f36742f16baeb67b780bf77459f7233ab6ed061b9fc0cc41938a2235ab9232ab2bd646c730ec2f2073cffe2f41395e15097bfd794a024861d7e6bfd92ec872ed5afee036eec99d7c84f7b9f62212aa84fba7b689b0111e63a6966fb2a2c9a2771c764c5e2206c31a98537a59e7e28ce81e4f2c3d38070842fbfa4a5230fe2c613e3e8b2142b9fe18ca00b9551b837cf759c634a1b87de4902398b186a66c68c2ca9322ea64dc3e4b03ba4be54e2e155073a727a2781bc7b944a5a138498bd44624e910ffc254b8f7f9c585cd09a78314bac8dcfba96768627a1bdb508568a34be86ff8c9c63b7413015206016da4984d22435bcfcaacb625c45a2b676330ebbdf6262da8ff3f55bd6c30fdeab22f1e48ae4eabedbe606fb7b69cbb58498095ece933aee9e26b2f45a197b68af333414bdf1923d0d93a14e8d27bb0e98ad0e513fe486343a0048abf2457920f5ac379150ba7aa41514eafdc2239e851247d0b8f76f90bb4b1916fc4be46902d327287f4a25c65f170e490a29815b97da970950aabd3f9f63344ca15f045b2025dfa5f1432ad93a4826e3b10dc7f47ad1188ae2a45d939200bea5894aa62b90a2201149a1ec5bb05e0c5100e5e0c92fdf9937ca7d2b5501dfc78b331afbd3d829cb1a075fce0e080f8247c0dbf3dc18f19ff635e42549136bda869697390366044ed57922f18368a7627ccd648f382ba279d751e31c73def95032e64bd0d1fad21aa757d6d3844f29d83aa793916f76c1e082ca1772f00c302c10f20448c93b7b184c7386ed073e3ab2d9596927fae88255058e066865f1c26f45b411f1894772fe710c7d93b828b65c5b0bef44e3b99359bb184126348950c07535c92c41c79be0bff8cc3dbea7422605e9a3525f7810a5106743b3064f524c8401530be7946d8fc2e815e081800af05065aa580904afff0abfb3742b9759fdeb27508e591fb7b5adb3ac0680d6cebcb0289dd8f0b658101f4a97ccac727d9f4c37556c67688abb01018b8f2006715b8985dba409ccb1acfe595781abf35a4d3e84711f0c3d9fd4c001fb03a60393846fe7275eec6b6bc5ef6fb0ea08d891d0f221e57a447852b3f70cbe18de9240ec43c741c832d4094fcfb3b43ebb4896f8f9bd76d01b01ac33fa516a16e682a16246ec38f846f185e2427c277ea79b43c6faa30803b0220cf051e58b4820a26d08d67cd1240199c5b46ea3d8a4edb21151a18561664711e27864e2f29cb02521f79e4e4ffa535acb67796d387cad65e415bc7de792576eff91ebf779a9f5bef554abe41a460594b88dd9cd37799ea755dda989835c14a0a9c6dd04e93faa49963d1e30ee02522dadbe0297724c69d823c57802ce9f51b542ac805bc12fdf261f1ef26b4a99dc8c2950bd80cfbb68bef69a83551f2ad69c9eaede0bc576ecd84892f441393a8ae8d5e3b7d5878de0a7820754e386f69579dd0e4f71261147c8ba516767ec11f44af006f2e7b63f4d37bf016b4b4a9009ce28e4c9f4dd61d80405ea39696befcecf509646f6b52f2766e509a3d51f6539882d9664de25dbe879cd973075d0c605570655980190da99781f4d0ab25cf0f23b6437b31e14b964b89cd6a1f14646a3061f03975179a08ddd34339c023ef99a2d80a6d000620c77fdeadb47fca5f38b51fd9715cb2d78268d61031c5be605ac6c6ad24724458a76b8931ea43cc60fc2e055458f62318580ed7ad6d39d135a9e7502e41fcc04c97fc33ddd1e879fbeeabfd254ff5343f9272362708769f5f2b2fae4bf83590538c6e1d4cf23a29c7a2546b6c311d57852c17503b83dc77a598dae1728cb3b0cfb3e6312c725a419eec49ef8c63f65814ac4dafe32a003699af49ee76327968f43504a95d8744497d6143b4d2dd742e5a2b159338d752d6c3b66a0ba3a145f056fec837586f33187c297fe997d6edcc5219fe1e4b57f8ee5a76ca07916cefdf12e199d0ffad91147ea18c7d5326150df0339169f04e9fe4e3a8c07e2ac56d41fab7488d401db198a15a848e8d40ecf869a98c568662516c23bd3ef438609777db32258d595513caef48c719f6922b8d350f533dc44ee7c1308dacad83d5d143ec742284568abafa574a22c9d81a61cafc78522e237c7be1672b4c6ecc39490b2c0dc316540854d641165ac80d3693c446be01a5f3c3598bfd36a80e4d4e2f799415af70e6bca546e53ba4c0393109a64ae66e8c45479b028f5e828fbe8cf50aee34064fb18613e01084afa5f0c412717c90ce51d9086980dd7c66915e6ea34373b4210caf533a1cabafa4b613a553e7630e21af88374541a34fc3bf511d2347fb08ee2891ef62344840d1dc243b54d40c485527b88cba13d50129c67d549c6c6c2083f3899b9c48f7c65aa821ac0bac8dc2729c451972c9360e127876ceff8d6d5b4c518c7e0a563f9981d1efa1fab97b695c0e6b665b8c4e40cb84520942aaa5a89d28f535150d7e55219e65d17411dd8c1da0c732c68b503ce73ef575fdd925cab4e83d7919a13ccb657c042aeed8da89f8882ec311563b41156cf57af2ef6e8a4ea3757a62d025d0506a5817df2860297744fc1c2a3d0078cd0a136e6302593abbc03ca5ce3304f88d4907ab8a62195b962157ed2013d2ada8d6aedc9c7e285bf9841425344740bc0499ff55a84e5ec460d19c51e74ac36a95b0f3fc0f78d67829882a39e49f290208e90a015584a04135fa28e9aa42dd36aafa17cf03a5a04a9251199c77ac355ba5e06d0e9055c81ac3ae39941958dba3a92b2c2bee96d05b2e430cfbba8b131c871f79a84615d8fbc2b2bb39246920f4d370d74e08cd79ae363ea3411ff0318a34ea4eb2c652744abdfc5644567230329b93aea835070029dfaac4b47a8e8e049ab655ded6c34debcde773396501b8738122628a5da4f2b2dd73ae5a8f4a308952a7b6a7dc7f2748c68e747f4dbf63ac87f5b3ce90ee6c6cd7653d3795fe00abf221bef2fe29ef6fb8fad5e8c6f221649f9e0736bf46ece06bb72bf69fb4335482f015781f8b5b0d74c8d959d54caebf19e898a84c9b5ee11785aed01cdaf5a3d135613ee7a0e7787a496e9ef528820e857f7b840120d35c71ae76f640faeba7d51cb437a21bf1aebc9d436bdfcc855ede8651fddf6e43a70b50f6701068588759d4beb7d84e94ef446f0451373ec29be45b6a9180422870851f938a7581e3ebe8ef61ac6d72d808d3a762bef4b9fc0eaf41b5b84fd0070d92588f3f2f0e996f7ce78c266a1797819858dd8dc015c202d2e6e60d9a3373c2f26e82f3dd6c395d2088fd9953a4a81944f921a507ad7ee81cd2922be808aa19b244999932023b449aa10f822e3a3f8da9d0180a434ad3725e5822e63afab64045079f0c7c264782808d2a823c0041e06f50d3720a3d5533c2604f58740144ec3a80f20fe5be4388aaa2268efca6a192484aa88a532b694df8198444c00d7a1e593aff449a8625506391d562c9bd21262aa09b911c1268fc0b960427ceaaae4ff41ea42fe5260134a8147aef20f3f55fe5c271a56db0b7754b3b00ba6cbb37a1fa89a98a435fd174d05cd9eea1c3e40b878df49c4c1933ef2eb64f9cbe1a890a69de74231c850b9d8507231a8750c41d30908eb7d121cf6f58c40399bb789fa105d01921d6df9efe616bf4aa44fbc534099687ccd34c2e806df91f518aa485ae719c5fd66a43bdb2a1aaa674b795ae3b995fc099df1fc0b2cd8b36189f1cc7ac2692b11b2e218f0ef596cce46e10c2a46ddb6bc9edd22339ae271f98f459f94d6fe9d4fe253543e127b271871916611899cde89b5ef3eaa42b0cc97b9e63e3bb686dea8ea4f2e125bf11c647e909138c6b16d9e88a86d352c822cb0ead0bd0fabc1db6a39b2e0b8bee4bc1b591f863346822164dc8a750eb88b8ce22b864edff5e46393dc8c2c1d953911642af1182f22319d7e83bb1b7b62a7a9ee17d274d134c99a715421d1cf43f7c861e32c37a96f20bd8184fb5c6ada1fff5636d622229a53c5d380e3d9d9b0b44559e9cfed9fe32657ae2e04702282b3378ea02dc4feed9a5c23a0b9be19b65f9d6dc0e9bfb65cde6aa99f5c71bf0eaee9cbe01117f1bc98a029cd92fbff7afabb54136733317cd62ba2dccc0d93c38c053bc726ecce9d7bccd59c324c402f24a41254debcfc358f22baf54818b739109c855b489e47e0ffd1b88d7a271fdf5acf73b807fa3be9f1bf191b34fb1e00bc674a7e7e6aa0c5d39eaa7359a5bb8038bda69b7dfbd4e8968b2d9a120114ec1dc0e2f5bdbf5bc520191384c6e207ea5be25de162cb59956d932e0e5a1a2c5c4e5a674e21202657c0aa55d76269185220aea06dd757065c1aaee7ec974836f8ac2f15c95edd94a636fbb448e7b6a645c3f6c3e694edaf8a3aa029b18b8f4b5ff5af4eaab2c00fee4eaf793abcd58fcdf7504923cdfee1b4f3dc7d9f953d679f4461d8ad19facfc586d48dff997c50753cd9bef73ddb6e5b628c91c919076c31c3e1a68a7f543690f9e03f0e3116b1330ca11852f3d869aac22fb1a4fd29d98888655a4a064a6f068233ab2a044035874633a0958422385a19734f39a1c8a42af39c75b13c8e59ace2dc6a915cc00e42083684afc2319b3b62a8d73f998151aa1c4d4da8be3356a62784035c289bde6de2a4a4aae486042ea0ddd08c45afbb771a585b7ab626a85938c3e3e7d5ed7b3afe77aa0aa4d619424e4872857f5b78fc9705aeb81f476c2f092d187ed031525152a90e173996b3021b1747f34b5a24d5c26645b498d21c52c75fb96b92eac4660ceb5a5ac1df6e3b13a422356e137b8f2b635616d7812485f6044cc367a6a7a59090959ea95eaa99171d41d7e91b66b2625872e006f08af3ce7b880c22f2c8a21f71f948500242feb08b095cb636dfe2ed295f8b12dc8ac14073d865574209acba5f5af99dbcaffc93f9a77f7d7679aca4ad1b678772a35c4d87c2d2ea82add952f0291636efdf303d0f9dff7690dea056480068e60775e3b1089950a0d1e5175160fd15685ea0c8d65443593875e0a4c0993acc002fc42928cd5b311929290664dba20b9ce429790d6f257f477069902304e2d95fc6d1879ee7bcf7961f77e93c08d6db8f4993fa9fee4b0e94b2b9b48b6e5453398339909b2a0fe460f1ba5a1b64474045f11c328c32580ea0802f4e21b2574dd9da4edb59d416cdba89ed43faa40c47ba52e53153ab1860ce687c70d2a34afe40e797bbf190169ca7012241efaec2c2688ce9cd0fbea154e4df76fb727bcc21e5ccd9a4cf7c06e3166836358990670c409aef20b42accdc1640d863c560876fb962a14335bc51d218401b2f5e359157455b84100c7ec71ed9737ca763becc9ab695947afac24ffce7b14a380e976ad6f06b11f006a5c99952d2cec91e4de0c43f5bc5008b57596020a2828936e4435ebfe6061c1d588caee493b0503bf544e2733a46748344c043cba721f618532b3182132e2d25106a28072d32a8e2c164c58d85f8e91f0e0590190c4b96ad731d771b6935b99875a4ea165bc3bb330d1fe34c79cb299b0780c1a2047fb46517d42c9c191fd9a8794c5bf7213b436b113901df5bacc1e3a242f898c9cd806225687f5492a82503e04cd1d0d2c1d91d47d90e2b16bb2e1641ffd0184b2efe9ec88ae550cf389513997f1ce9c72e2e01b95d30ce1559c8f3063e8c65fd9c2e2f006f89d46c24d17e5f0d2bf88a5d8755d9fec3a59e615d215c9602d4654f707acff2bbdfa6a689add346abd4e184d22bf5dbf14f8e7e60e7f837f613f07f2ffbb2cc7fb966312f0d36b2c5e7a4ff64c34e90dbc6431666f666af6cb1afb9b679325d86f5e218ec162eb16650e7994d4bddc3558ad30a6ca067160b3f532e82efba8e738fd7a8d58bdb9518cc109e42c76b2fcdcadf4e5a2e6c744a66972fd298369413d17a005bb169036e8366e81e7f88de22ee2e270f600ced1213b48d6f9394515a5bb8c2899ccc80df5f29a5fb0c6c4060403a56772f0b2bc46320c88fe5122ecd9af4160e46417e8fe6e69c56792981841303cd02894ab5881025ad782dcebc96c8c10a48abf69450f30ecd97c99ffb4da946ede0c5f5727846900e4f10ab77c10d6e56f46dcb870744849b47752825f7c594e7457fbacce389d6f511642660bdc05ceb9d8209899628102a370f5f7fc77bb88b45874337a60d76618e67c10527d412b16514526b3b358cc05a9ae8d1c554a97636e992ca4fd31311e967dbcc073a887218450e259355ef05a25120651babfdd8d00becdc6bc71145bc9ba1dbb19a1644c60765f9e221f5cf6b25000f0949d9b44eb716376a24ea7ba1ea4910d5c99ab290b7f39eb60ee574bfb7bcc2817838002a252e608b6b1084510dc2187bf95a406c0deb050819552721b6c96cc3ada4c4bb95606418df9bd4beaf135201cce4560fd2b1b7afdf310a6018901ce353edd8a9ed13062242361c491bdb35cc5aea5e33008ad1bafbb5509a75a951692e0c887aafa81383d99f48e7c2c8991aeaf6c603d359bda7fecc22fed30902d9c870d1fc641590b9c842f53fa40882e034fab998d07dfd8f0583979b9bc17c447addd2f5e00530e8f1a5dc9f29ac861756bdf3b557826acbda512ece68ae807b0f49e8e28124f959208aa83f78d2bf6469af1602a2e99cc3c65e23304fa0a280c7fe2ed0b1c0c61aaf5bd991525d88128a0444a87294d2670a9493ae7d234d0b3c2c4dcdf7f1427b7d084eb8e3141de5d628c48080e7dca6b8a6b1e7a83899c551d0de45a8cfd8e713f7095e4d2059d8d7a09d2373d97b10354049bd8df000c5fa3495d1733d0011d86d81fe5fb1e2238edf129198823a3b749644b402e07d2b08d39a20907a53c1e3fcba8cf0dba65fa85efb3847ca97dc04ec39851d1f44cd5309d5a902b3e2b7eefe6053b5f2cc9c56fb2badc475650f235b0941a0bbd7a16cb95bf1b7464f7c61c104b37e3379d66ce9c1505aad2fd638e9bfabdc1cf7082aeab994606cd29b292fe4c37b9aa1267eb35d6ff3ce73cc0546085e674a043e9e85d22baab248cd0208438cc7e3ef6aaf713b6bb266ebdef05f46a851ed28dd0d4dbe692f33bd0aab2480b1599df33f68f27fc28eba59bf24a752237a6266fffe1d53fa6d81746e1b07f68ad3267cee87fceb50cef7f7511704406ece02d0095b35604d0ffa4b46a5f6321b318aea45738c9469994d9e925420732587ffeea0fbcbb927a7cfe683b5da9080e5130d4b055517d0355d7f680747e0c753a0a4d15d6735a4c2a8eee89ceb611bb8eb8075d804a5fe9ce977a4dfa1967ad948e5f7e54bab9d4b5acbc5eed4713badd1406ab059ad5d218a076cdcc8712586a91f9c0bc98baec9babbbefbe6151c003cc6d9f29fdb1f08243e4a6d11d4c0136cd04733b9437d1e15e2d35e12c68df045c71c643e7c509f1c85d1fc71c83f447c9ad29ff9d67497cfa069dbad7890beec5edf5fe63a362e8b6a5778ae92cb90dd90090051c2e4ac08dcbd0b8b05bac63222d8467bd9e31e5539c6a45fc27dbb0f63b1577b898ce5da0c72583af81c3c53df6f30d1cfa36943ab750cfa19e92eee17c3f5e8cad76ddea19ff39aed125a9c82e2c7f4b9a66d35986187472e17aa95cd47fb55c5abbc15c5a6eb8484d9477c4599b7f4a8864cb98f7b56ac6603d28a7ada11f01dd8420f211a4ee5df2c38fe3ff775a3b5e16b66ad6d95d98e1dc492f0b6c3f7148058f5b94464e37075ea8174e80cbd55815066b955d1bbb8565c58a309736640307cc1ceb95b28291eb3b40e70c8c4abd851997c960c1be8ea3e9220a7cc7342e3a54b90ba8c1b0759ca77a84ccc55267fcedc18f01eb6098a19adb92f29c1bde66427061b94597a08426ed100f6328158f8d1f0cbbf20024ff5b0d1dbd9059d094969f71128ad5a3aacb596f9bd1993f913d2c72ce57f97f6781de61dc68cb268d49cbbdd50918ff16d0aa5280992f522892916dda49944a48957bd1f0d23487a147b5be67c07266a2dd001297dd143382bd8ae7298de55c48107b4a8f4849f463932d896b922dbd46648bae09b2c58363b14fe34c98103383d5502943bd43b21051f0094711f677414042e2ff6606451e457240843055a17ca66ca0b6975277bdb83302983b7fce2066ec35ccba517b23960b21c2f5334cb25a497fe5a1549ca806c3c42c4c9b53b9fa0b3939ef6eba683bfb6418ed4579b8957399adea60b92e17bed69ca70cff3ed8312a051a38bdbae5c3e6ca07eed1797f652b5e3287523819433ab167b40d81dc4869ae005beab83bd03dca6062072ef89612f8788e710b3d869d5930c9b4a0139bc750e79e46415921cc8b721c50d002bd92d79380b967288e6aec2158ed49d178f806468e283346949b90fd00351089cbf8409d368146ac67493fc6c63888e762c3c352f7d22fcff9b807109ea898ff159c37eb8354fea1ffdcc07111d7946629bdb217521344346a31515f6f9dc6248c5a709f7552c43ad10d8225d662119f4175cfa0c2b5f40b3e88073db7b3e7927c16a706788067d9e8ce3b902d8274dcbe5e5c19ba9aa110bdf5b6cd2d02c984790c8f27215fefdca574a2f4f5cdd3b64d485a324ef2b375eb1f815833bd8d6dd0d843acd0b085beee55a45b79f7f3012dff682fc443e57debc6e23b121126277a3432537489b68cb095579f267f965c497b34c9b0b2e449dd34ccd0aed2e94517390b21b98c4c984014857a18e2949be76ec37b1357b1b9fc659df72cc6e4b73bfe412d4312eb2163220a3147ab461bb00a384fc6b164211783d40db45f7e6d2394c5869a8fe833a913b331b87bf31f4cb118268930155e890333ed56164a4ab9cad8dae145c4b161a2b6452130a9a591cc43f8f40248ef781772b57bd413acb6043447b1acd2307571fba605b10b9cd83c01a0542334c370f7c845951e20cf125456b2e9c4d0761649845405fe821308850a2fd7526020005774c11e7257c86ca4238875b0697462dd3d2e79fca55c4e04a91d401e4b4afb4936b9bd18490c64cca2cc22e6d2b22654d2a6a930e4f5ddc478aba95a4e1869c5c3f6dbfb52d3ed54ad1edeba2a805f6a98bce4616e8b7693e3fb39494f554427c54d9ab5d664c86374b240fc65c2382b734996cff223a577c868f041bbd57abc22cc02daea912ca15ab81779b56ee4d270722fe19bb01330c19c5ec87dca51fe86f891ee2de6b5a082685febe835295f8200e1f03c210436e00cb927e0b0888159cb5cf4dd815d23515ef3c00362e4d633dde80d44e6a541e5386d269da0337b22edb1d9f4b9e852a099b4f63e99abf2c5b099e1af1f608d462a10de9e56793f86ff94a58102eea916193360710d62b2e992d4e69268222526c45c65cec07e2e53b007918a9468a122fa8b94eced02ba829d8c3b6a15a24922e0e42eb2cb19a9328c5096a77a8d0d12ab876af9da981feaedfd3ed669e8a0aad110d07c7077da31ec2c0a710c02eb80b20a7ffa3a7f0bea76e6142afd454764e4acb53d737931812d28a500c11295aa1f072637800095e479f5a432be6e4b5aa3caf5b5ea8aabe568335fe0182af75028a08ee1e118717eef0383cdf8e3da108b1290bf4486b5517e78089bc94d7f32c984d5efa89a9a308042fd47008d5d1127df692634ec94f779086474178ee9ab6d0c807f36e9c18ff1dd6f233fa3b9e272297f09e7dd10ade36424a04cc0c74411813874397e87ff82c04d288c8bf0ff34b097da2e7f4d4d8b80169a372bacafa99f75c2bd8407e52d9346a0fb9313bdd85e2fcb27c22f7b071299255c2a2dccee1ae464ff8818441522142d53f0717e5c2ca19efa58edb6d3f84b359d999b95ba2520eb7fe95eb72a0a046712344c52a97c2363a10e430f3c86eb623c8585a8becddc8a8e53de11d9cb460a8d5354d837e33af14dc39c2f0beb874bcee72a8f7bad0fd94662d89402888ef1c7c056b41dcd3194b962edcce5bca43d43678d1112342609ecd594a6c82aacf93496400d22c3bee441ff9bae14eea96f8795e0633afddfcf1cd40fe5d7bf34ebe7e5d372044713d53938bc5f5f0f9cdbc1c29e9ea279fa8fef80bef62e19dffa4857c0eca3109cab078e25ac7c16306431464d302bd07d1a65026346003ec3fca5d3f33eb94f454ac89c6b2d73ba003975bab04f016e304c1fa9c2da067e566eec01e40d37ca594652992eea1129d96fe12f038b9eaabcaa326d67f29b49ea86bf766208394a7a14cb8264725a7e0f0d4812fbfbbf88b92d036209cb22da86366f9aa8c20a22dfca56c4ae0cbcf389122f90f426f8c8c69d4473f8b5c465d4e424907dce6872d0fc203ea4772509b9c2d87a9a6c22909849436e90c33223bed8b0084978df886541d1992b4262bb7ea4e5e1e88ff0ae7625e28da523f7d78fb49a41630a8bc47c906812489aa91f59b115e9e96049ba22029820b47b44abe258ff6adf54900335de0151180907b3cdd30dc552fe9dccf951ab311f90f618d1f27615e1e676cbfe7cb83fa3079bff560f9d87acf480e0fc5dfbad1930456c2d751eb5e764bda731b45da752877a2aacc63361aace0ce6d1766c870096e9c14fe8534b4d1e66330e458b031de8618e99bf0c3051ac603ca87e3f43655533023dae5eec7a7f18c837140e6ace21dfde568f5de279c53554e5b164b5360a34e5b06db8672aa169be8d00c16c3fa4b91396c62f75a1fd6dedf5376bf01b8963743119da074f4f47757f3e95b81254394bd4f6c910e836a1832afb9cc4c930646fd930a075dc079fa7c7b50910ece278b1607b4f6307a906c07dd93e154c5a3ff8478387d3997980f100a9c506ecca4eb1590c899e21da66d9fc500ee34f105ebabff09dd503c9154f7bd6d49c08e97c345415db6a83eeadb06c27c968637f2d41e89fa81d675f1fa5564f720f9c28b9613b5102fa60f27f8f94865e09e739499ef08048df48a87b1ce5a9f56f8eb6caa091cb6a15a8eded7ee0110fa9d6926e54c6eb334db45d0495271c9f536dee2a406e9bec7f1a0dbd03d441b7e0c5db72623bc90038ed42908d6e7c844f108ce74ba49c6130a24f919199b6eac2ce1157ff38fb8b0f75b7818a330c582015e794ee24da779a9bcf3088256d42e88019faa03acfd289f3f55dc15367270e0fe68fae79612c7d577f6dd127280dafb17d4fee932057ef08120d5bfb1135fef3d3061de56d9e09d710680ec723ff98561c49ccb457b474ca2d26b6f097c2b9c62537ce52c1089d2e2f825eee9c2ce7d92c5c311483b17f45d98312466d26fc17ef78e5908cdcdf15cebaa6094ee2d0ab9301112d20ee4cb82dcedbc442e25e675fa388d508d7fd019a921546288ee6c57f6c5d79a98287ba19bc2e0ce8bab7d7a307a6bca003064c1b6cd3f294dda551a1283f0365828db56183f555282a4e16907e96f0c194dcc77d0e8cb5226d39093424e1ee7e2c8224c4248489d5a3f473540b0a62b1e90a417900685469d1d1c625b536842ccd8d694064562e16fdf75acc1a1827dc435dc30c29043104f3641a7bfef074669d5da7293d68d0c6913e759698c0a342e9d06034e14bc389df6b270b8fe099565772c05640f3188e989a9b8d69ca857866a27b71afdf7eb9111c310a293c94be5e672f3339f45cb2ab66ead060813a9a1f43d262fa9f5a4267834c9371d1d068939d17e5e6d7e41ddb147be39a73366292eee464f6e8d7984e32f23f1096723f3d86a579c79466ad8ed4201205b8cd9f9388d4dbc00611a51249205fcffcaa9d60824dcc4618f66bb1c8513128989cde7ed8dabfbe883a21a09f05b5beb1e6dc05e26f37e92e69038621054940dd4ecdbda056acb2aa7020a1df82425c7efd13d9b9052f73c2416f02a202c04064407b074543177afd3865f7128ff28424e6e7c1f0c45b392d6159e796f36f3d6db7a28cdd07e30ef042cce1856d187f0ae46c48cc665875ccd67c218676beecb37a11857e89aa58c982fb678c58d86c098b07b76ce00401b54a3442930f248ca36875647a311c4eb41fbada2433542d0c05743a3d2460f1019502f3162a5d7d209b3c5201ccce847d918407e6d642997783b54c18deb11a48bb180c47c7d1bb650fe4d584bb578ffd52a52f5c5782ba9f522a0cfb280e7a8a7977ad6cc04a9dc3684b0de82110d6923126fe1a1a31f4d6dadcdfe3108d91e5958c5b7a652b2b28089a384ccce18a788c22da38d1ef2c4aa3e31099f2d5fabdcb29102f32bbb9cdfaecbe77289a111092b799cd11099e72e17638d0eff420cd28928728f019029ad2dadae8b5cd19fcba15ab61322bc11f46de402e5c6ea2611e40a22a4cdb2c1180557709a715e6e1859c8abee65e331be52d9107ce32d92082cb6ef6b4deeec046d7aeff0d9ffb681cf00d59e04668768ebe0a8421262c71450732dc0998c342614136d8e7f60b8d2e8c7a724fd6864d85d1c77347a81d86b941d8839f65c38e3fdc6a4ca2b3eff0c7bf0d78db3378fe952b95acb7f0daf96156da495cd9d36ed3bd290a81b2d11caeb172f89efc26787b6e92b745a08a6f252d5152f6910ca1e0ebddf99502be244977f168b8e547b6a5dcadfc68254f2084bcb42bb4c1dd57783e6ff04f15ae020b91d9791dfb846e6ed3da2d2c0bd2958bafa440e33850831ffd2d9718d4a22014b644fefaa569166c307cdd2a0d10d7babbcd3450e192644f9b6064d1bc288c81039f039f2de6f006b7e7ecaa598d5790cef7e5197c73b589802698c530f21541fa242828437b1aa9b0a92efcd4b3edd5602b75f0b041e66f89d6b8198fdb07f34290ebc13d69460e5972fd413a995dfd23a710a0c270c4ed7742e3060a767855f0aa6409058019ac9af432b4b284cd0e688b1700717799d93cf7ac9cf9f987105574a8fedee6b9212a5e9ba8a838da91dcc297e18a4c03570d0a23843f3fdcde0522b5a78fdc6efa25606e2d619081024f68bce731913afabb071d2171abb5315ca6dea719c5e81d7bb54b10b1749b65fb8644fc10bed7042326a31d5d2cadcf91d762bb8ac052354bff0dbad662da0d43f31bc0e431e3574e3a8fc4ca5d339bc8e26bc13d0262c17f63500f3c8e2a24aec6c207714efa17bd9d6b74e39b056345cba0909efe45141e99bf63d03240377d2163a1978cd2a9c3fa2b22427ba8a9fc3b474084e7e34847e5ccb9200cccb161c69d0b331508e3efef72b6814b582f59c25f33d31441734d9b23c8d493038d43339c639c71ac7828accfadf5f1ad57585e5144d2a97864560bf9eca79ddb20c29cdba0c9138d186f6e457e5b59baedb114093d6cb91d3e56bdecbf8a360f82d102b23ba85e8d2f281c15185535df3bec0ca881636756c36d31355a77212f35847b3911683f7c8216156f901b3531b80338c264528cc46b0769b089ad03463eb001e9e7d2b7595e3e9c0320442332dd33c3036bdce39641259d3760efdcd08a9ff58c85fb2e47da85a844c03fc9abcc763de0882596c0b645ea53cf635aa74ccc9d98b517408b4c29cb9a9f6c59d16f1ec200dd848a38272380d03f7a13d4add4b7f58d152b53e9d46d6bde8368db1ea0213fd5cc6d2c3e7035053f1feb8595ccf92bde299d67d6e0076b84e41269b88fa4a2ff121432a230f91ba25cd028f654631fa2553cb2aa0d3f39cd6408ab8c74e18b8f1021e5febc1a230997de4964585fd65ffff8bfd784f63cfa7d8a828dfed3036a89c53cd46c68a56f7f9633390fee788a364462ff04126f128def3804f312835d6ff81fb40842a022bd064bbe092cf70b191d2ab1b88247c8b0a91494a319f2c072f23f646375d9f14711f281e677c5f209eae8b98d5803a6e11249b583ef4da4cef3153e50fa0b66a4da39907b8cf9d6294cef513d505739eec944990a784ee9827f3ed4393139ddeb84f4b5ae8a9efc3e8c3db0a036e10e1255292b22d9ab17c17428ef8d75e3a3902e346eb680efcfdd27e51f776d9ea715deaadad2d5444bcc38f6094f421a224b90c32921cae88ce086ad5a92e9268ae7ebd30e938233193c126d73b2f5dab6c655bf45feec543c89e8fcfeaabb509a485a53ffd108a966fdfec5d63a16d8e11800fa8da9243b28593b2dadcfdaee45c7ee41a39ee41851bdac7591b7628d50ffc834aebce754d8d2dd499f3114f45d067f008fc15244b67d74a5718aa2a53472a1e5493e43623ca7b40786172a900e96e8cb5d9f18c408adef8712b4ab7bd7274c1a3aa99ead4fa0d92a77efc160ebb393d2533abb201c93c4ee6e8a3c98026e2b98b73ee48546e881db1adbe57f58d5102d635c1f65ba3cb622e775a7afaf4cff47cd930d2150a6464c9d5f2171ad3f7d7c06d488a4ba2ca761cdc04cdb44244974e3be8c6ac21211f2885500cc600f397ac348d2a6f1d76d0b579b7213ce5dbdd59cb63927b88bb9ed390ddb3a000b66ed8be9d01f440fef7d1077de054b7071ae27a9d2787f4c024f2596e462648359b8f3d771ff9f171b80eaca5dd2bc86997d358201bb3dff40874d1306b1362df5c37eaa0a50e815d23e4879ac9798a17128f5bb1b62a24f1539d1448d176068142cd0eae5ab27c4f705daab967d217a115fe104eead977a5d00e22871f460e2e4cd2da8bb2e12e3125963cc6e041412ad507c6d6efab61dee4b1b271c8497891366f8980fd22caf08258ec86a5411bd94c96813c96d15ac87f2770210ac9d7b2c9b65153e1346fa43ad43617ca02595438a323c13bbd36b6a079e4a46285f13834935a517f385d169889fc121744163ffe9a69bf02a94ba11ef7b78eb7c7e5824cc9f009d9cb8da74100270b9497eb78d8bc7e07035bc43f805bcedc3b868da0f8d178a0f3972077f9d6ffd7791adc7ff7660dbd22d24fccbc0d3c12fd73d2e7764089bc0cba84f5ba9c2c7159022a669a0d6325ea07dd40eb00109f70413c735e1e9ff84e2ce9f95b2f8672e8d2056511d501f5c469ee19102298ea55a3072c19ee8c89540b558d053bbb9b74fe849e21f8ccd78aebac94ea26632b257c90fb933a6c9ddcce06ea1f62abf328801647870a1bea11f89ebbd7a6faba98661802efc9135c05b0641955e802ceb80a8e831b6a6ddb26f03303a2e81598175841a1f126fbbb602134551e8ad442d5bc335e75adc38e9516c27f12c44923792d52cd063463f882d90cb4ceae463f03a71910d7f69b9762dd77555955bad490ba6526bfbce7f4047c0f235f6680379175cf028de7ccd8ebaab565697a22c285e0bb9bb8c4b7b2697d8104663d6f2b18111fb64ef2ea1be34a459647b643ba4808d5349fd44dd70841841bd72b58d435797cb760553681094af975a66a496fe1ab57621b6b5f7d678f24d32402bd6b43e4746fd5e4b37b60fae513de5e7ce38fbf0232cf58d6c4e614afd23a7bd1392cd324610b181f7877f37265b8e7f85c1d438a4d271dbc93efa206ea99ce8db8046c817a74d176638e52eb39af1ff974bcda4e99aa0e27042a6e25e23478349bc1971f223ec732214191513ac695d6c645ef0b6c6412e1919bfd53b3508a5616c0776353d9cc4038ae105608ed80124983cf8a4caec538d9d7d6fa811322025dd74b2d521db7209355965fc08133036135797008e4297b20bd10f5706ae4eed40a396b28f9668ba590d146deb07596a064f750becd6888854b2f27e560dca98e23d075547f2d8103f6e8ae8edc30dba13d613bbdeb94667e0433ff47a7803dcbc7dd205af5a05b2aeb4a9ffc976a0840bfc39771f1728be960e32da1f16fed913dfc47672771449e7c2bf9fb83d053cf742c01e8d204a5a61e25f0309983922a3f4332086e3539b21386ef9358b44b7897cc16a060658d154965672181342c116aa372948823a085b99b5c0f5ef888e5984c6d690b8ccf4e1483bd10c39615d61c6d5090872b1f1a63db7651787a81cb6afab5b1056f94c8491af4c776db12d04556c51bc11e8577a0ffa17af9c68e4d56d0610e4549b44cf8ea6c08bd481bc21e57671ec79f3eef12d9ef7a203a396b31717773137c8292cb15f3d400b95921d43e2f9cfbb5f45d98882b2fad87dc3fd81b195e30f1a4a8c4ddc2e1b5ea97c2f551bcb722d5d1019ef73919e441c99eed5c9d5fb51bdd06bcfba153ee0d15536d90f8dd507b320fd8333377cfea2ada22a57b3dfeb751ab6f31c952484983f044ddb2cf49c29ce6291fb83f51bc9819ea1c6cc2ab00d446a3069e2345335cc1ae48dc293144c9717de7a07b5d69acbe039e66240eac1bcfa721c76c592b6cab240085d1c78931cdc661f56c93c374cca5472c587bf0b93823f128a4737b9cb0d9300e50359590029ebc44aa58248da2c0993b2c2d1a5058ba20932988f2f2ada7068ba9e6f55bfd9c45abdb75277fb09daea8d61e2e819bcebdc94bde66d40f99d10ca66dd3b25e0336907070f709895cb57ab982e3f5cf366f99b73702c35ab3172a7f996ee558c1e3c996bf268c90ce7bee24f3dd9763f2a04242e265a953988358c8eabc2ab22a152807097464826a2212492cfc1bd0a6e34c727713d1453051d62a4948cb140269b1eed5134aeef9f9ada0e8e157a759f0ae7b2fd76a9f4e9637ffabb3a9d72aa02a864a1e8848a778fe96e63d69d110de1af2c3c62cd9621780e3ffcf373f76424770d89df5ddd1e6a772aed567887004ec55e44ececa55daca6f1c9108d36d29e2bb44bee0c2ec0ebc7b2473c6be03d0244e67e62e8441273668f1622e13d24344fd51be48611c33c3e81ef7bf3350bdcb5e4617af4eda41a8ef5a3cf01ea6e0ecc720eb2b3c79b734d317bcb151b438ed747b5c99e47e69953790fab8d2a371ee1ef1b14d62ae7a5ce4a42c0486fdd78fda144e029ccfc1ae5baf190930128b93476a2f729f36d7c66cfb9557836edf6dd1b0b239ed94c3cb39b7a7498a22c80445e3fbb348d16b1d667e26c423ace6661eb05f26eb9d93f18744da8ad8235c1375a5cb7dd093c373bf32e6c1898ac0dbe760c8414b9d62179c9a64447a0e2ef08e45bc1d211fca254bd17ba1db71e7c041ac3643020210f67a1bb56962550008cdba15f7c80e89b78174ce55c129fa7f4df5d8ae03394bc408cec12fc39fd7db479961e9906681897b82f79399d19933298386d230ec32fc884d4f322a299871b2759bd96c62aa1e04ab80e65f565c0211b17868c0effc968777ce8af55e61009424896c7fdb43c4fa4a98f18f3accef859508fdc08521aeab5ab66d8544918dc724b1963a586ec4f22dd52113f36825f955e4b42a1f45e18826894f94354f6f017338dfaf80d08bdf67d85e0a013adee4fb303610666f41ac280198a3bb673ab0d6114c5241d64d7edb5a009e9a4f9d5cc8aabbe51ee52fbbf9a4891410f3eaf773ae9a054ffd3858c2ac28a9b293830ccc19d82c0dee3b7539529f4393d0010e5612df443053663f9d957d4aa3b836c5280a14dd8a0ea21585b588492073a3a1e360ae228b3c1b5ba59ddbdb771b72231827d84e436d1ebad796a479c7df89eefa9917a13d18e9eaa898715c7a100dafd9d55ba0c2e7773c0656e11e518c2c3ceff9341a8f8fba5eb5d5d282be73bd0e84702da6f509518ea22d24c062891f19955b00275cbae866c5d1c40f75ec217f201acf5989e21129ae3fe2bdbc7f41c3893ed5ea6830541be0c5bd9f90baeed3827640137da59421eec1fb9c7d3526e98e2b533eacc75d388be785bba0525cb0534bd09fd7ebf5bd4cb62b3d697d295966ff02b30210599a90b0d8198260980b59e2477ff9cf81b2331c9361670140b7478611a1615c6de0984217b0527ecc3cb0fcab54066fdfd9d7f1a19869f4ee2041d6f6810607b8170ee577c8b950b93759a95effdc73caf30bf53c60c7d5a1ba3ac5c7ea0fbb90503715d91a51256ab18ded8a9184c9f7c8d4af7af77445b5d152927447ebcba51077755d9afc8fdf340084ce943a9764b32f664384d0b8217d92e9c07bd61e74ca23d3c0bef2fdb3d26f0d9db08445c2b9b20cc5328e773464c10fde10b277b482c33b6b0bd0708b42f30480d9f6c27175d1b695fe204a35f975cb96e23270a7dd22bfd4fc35b4902d43f17ec09c44571d9d2815bc2d4fc155b530557c330f52dea7fa2b95c9fa0993f54d8fa8200f7752b0e5aaf0537db69292f8cdd86e0b5d6f2d04bdde68c0f53d6b149115777b358a92595f71a44090fc4d1186be3c115087009a5bc9bfe629f23f330502b2ed29110188765e8e635b415a7bb88859d7d765e242774d5c05b4301508afadc5f9e4aeea3c09c34cdbdb6eca5cad9f61003f81a4d50e56baf5de3c1f66e1c8f0134ed33caa3b86ebafac79e4a93afa8ab8ea3ff36a5c370518f82744766d3c03ea887af8370299a401021361e42562e3a30a53f42d73224402fb15d2825200d444c00964c00c7365238c4dcff2a369b215a72651fa8945fa2723741a208602782dbd716aa49f39acd8212e919d24354f5cbc1c4bb0086eebbab00d4a3057beba8bd1eee02ead858ad1e25f387c56058c7c253922d78819dd6ea9359c5902f0bd947b1ec0c1214352abd18811b18e314d2ca6891ac0d411ae1e71331c382632c1af0aba387185651798c3697e1776eabdeb780f0865daf47261c11126bcabbc5e92b81def207e8d1ff38d929e1028713346a35dc69b45e800c921454589064acb1ec4e182eb5c3c59c3682b86334014e35194207c2d89e5d94089e2cfad475c16a1e3f6cf15b48e0fc506ea5508d251925ecbb32429d88cd6c009b3f1cf6792d475eca4fea35d054200ac1e8f8477d9e7b2360937b8b53e80cef700150c9f56f2cc5427f302c4bbc4b192ccec4e0ec67d12a3d369de83a802399a9317d3d5b9045705c3c31d9ed2e3e5c94639052c81761927a5b75d14033df0668f85c7ec639a278afedbd8433c64a7d833d9c3346742e4dfc8203fe265b2a530bdbe1ca9701a5b36e25011b642c1785e28bdbc7bc45a484fbc95ae9398db147742e24cff03b84953544d7f5f73a3d4640e8229125ac5bcb7c9010432ffe20b45af135bdc71001f9c32671818993cbc6650e6e2601cbcdf0af180271afa31308c280b1b0339bb80349a09ca3fc3f97fbce03d69ecb3bdd17540b0641649f5ba2753c95049e7b05a1134e1038d2743afd15e23ef27db26f47d79d47ccf1b14baef46cd6d0086513c995bd7f7007254beea0e469a064c95df4d23e50b23680534594720a25b33355657a4b818a7526fbb547b191bdf7965b062e13bf14591338fafe8af8d0bba74cf24c8b2e2b604c5ce8ddc33c01260d8a22635478e8ddd35c93d7e4fc3b3f73facce933e79cdbb0947aa55ee55c224b5efece387ee71bbff36d83b542c594b31d595a7ae7113da288159921a7a24eef9c468c19bf24182e64f6f4ce157e5c899355c26eef85de390427557862718cbc25c3f4ce1b04c9d2c50c13b86716bd73dd75aafb7b1e3b1e3b1e3b1e9e2f3c5dbf79b87ef3d8f8cdc3c3c3638782bfbf346dfec69e28f4e6b1d1a4c85f585594b2337af328876bc4a0b97da95bd1a637cf12eacb1f111f499c5d7ce8cda385c992aa306157de98d19b8789c10b0c2248caa89cf9d09ba799769dd2fe7ec7b9e3dc71eeec8cd9d9d9d9d9d9d911729d84fcfd306c18361ca2497f0fa9b686c3e1d02e45719d52147fedefb6efb1559b5ab5a955dbb66d1b964ab952aeb62dc1b7fe6e6bfc6eb71ed3f8dd3aa996c4795659e19de9dd5addbf25756dc04cd4882345ef56d95663cb0bdf99385feef46e43105ba3c526ae0ec5959dde6ddd75aafb7ba19dd04e6827140a856d580af36d61dc631726855bbf85337e0b65fc163a9357aee0801363469f97de4206c099e9c8e3b2f2068ade42e57d43f7d47197d742af89de42aa2fbe3f1757cd39a6dec2315b34e264145112658cdec22d5f8088fd90e343d3426fe1d8751afb7b9d3eccd4c97bccd4d1d1a1d3b97bec3a6da8b7e9c43d769d126e827eeb5069fdd6d9cafaad13e3b78e93bd818665c913260d327aeb5869c9d0b244099bb13b1a7aebe81ac92372596de2d8d05b078fd985c5cf6c070c287aeb7c7511ab9bc165ca952157f4d661ee60810107a7a7e58d0cbd759a39ae538ebfcff1caf1cac98901f43b2707c6ef9c9c9c9c1cbb9c3cbfb1b11f67be34118345ef1c06a8b1616b6bd185c69fde3918eb3a61acbf0ff629837a58c9f7d88341767e07a95efc0e068341bbc77908c0bb6283c34609d79ddec1e5bb389be2420b1925677a07bfc000fdc0fc3db02f0f9807cc7b02e9ee1e3bb06f03e39ab04d58bf26db649bcfc7cec66d362e848e286f574bbeb49ee80d54001936492a5f7e746c7a0397cadfc03020f13710a8e4d93e964ec89f90d52f6cddeb13840a3e1a53aabedcb5e9cdea5c41c9b26c3ed3b0d19bf55204c699e7d79b6718bdd9e5064e172c4e0ce1c246466ff64b8392655519142fdcbcf4669924c41009d29c2beb4ad39b6dbaf8cd3a5bfc66b17eb35b8f7fb3548f9d4de228ec7bed7bec6b92eaeaf7bac5e2f7bae2f7ea7cecebdbbad2ad777bcd5bf58a7c68e19255826d0b0bbd57abc739aa680913a7440c4eef55890227593a6454ad7182d17b5dbe590d3768926ef6c050e9bd7e3da601e38bcc9a16796cf45e9938926b3eb450e0b0c2a1f7da7cac759d50adbfc7bed53e742b4ddadb6a169ddf2ad55698ea7cecea5baacea552b7a9da85e03a95f94b4990eea57b694a77f75228557a97f33b55f13bdd0a4b9dc91b7bcf3541bc64d5d03bb53a408e3a2d5bc0f4e8b244ef5489c47e697f8f71dede13d33d6ecbf097e13aa1be51bf8dea95517f632aabdf780ba760b976dc3df7ceaee8d01b5b6100ce1c9c91255d9a26f4c654c8c05821b3a7d41aa33766be044e5cb1cb6b01060489deb8f918c3e07e58af13ea2d52947929ababa12388dea8f2c48c331c28c6f05a5cd11bb57a4c95a54e0990227569f446bfecd670bd1152242c0db36083d6c64b0ab1337aa3cd3fd2c492238be3a7c6c4771ba54bbdea37ea44f128d56f74eb81bf512a348ffd05d74330f5004ba9fa62270096728c4f44a126d0122154e1bd08a3c5885fd50a262f2a6650edf55006d13b3f8f8b3b1c693486f8ed698ce5b7630d15365658577a2a950a41055e94334fb0d0dc8668ec37956a1a52a60a0c0e8b2d2cb486a74f9b0ca4220b69f1e17ad485b0e4ed63f5a84f18e37bd42bb4c0ca9bc87cd437e8207a3deac42db688b8f5a88b80c35289236b7ad677864816082d6f62f251ff49a1f7a8ff54e5dd33f7a8fb891eb447dd4de4dd13f6a87b560fd7a3ee30f2eeb17ad491d4e49df7a8f2cece47bdc30db147bd4357de999993e4cdf3e4b97bd437b89137cfdba3ced3e4499352df7cc2b054f087070fd8a3fee39537cfd6a38e5445f7a823a1c87bc7f9a8ffcc107bd47f64e4bdb37cd48182ec5c3dea4040f21e3e1ff5a3b6bb47fd882defe1dba35e612cef21f3dde2da2857557fc2aaaacab9693d3be2591f0e912c9a4c3ed0db21123844aa531b70c97bb87cd443bc195e3dea21dce4dd3e1ff51fb3bb47bd9d6be71ef5112ba2c0214b7bd57532f881f6a867f095771bf6a8235fb45c8f3a5299776bf5a86bd0e27bd435bcc85b68f7a81f9d687bd48f4ce42d640abdb2f2162a1f7529adbe475d2a46de3a798fba8721718fba072179eb341f7511583a608fba88abbc75b61e75249b0ed5a39ef3cc793eea4e6b5424662ebcea394123bd1c233279e72cf3ce613eea432af2ce593eeac8bb9cab471df925efe0f351978a73f7a84bf9e51d7c7bd48f86903dea4742f20e7e2109663dea43637907938ffad01c50ef511fba923770ee51078a9237b0f9a8fbbcc81ba87cd47f94e4cdc6b97bd487fcf266df1e750da0e4cd321f75113d58af475d048fbc59e5a3ce26d9e4537d6a5ffd793934b40be5d5b8a7f355b93416af7a708854818ec8f41ef5232679af738ffa062ab4477dc389bcd7b0477d4a4cdeebd6a3de216da57ad43ba0e5adeed13dea1be0c85b753eea1be450c51ef50d9679abcb477d4a4dbd7ad4a7d2f24e9f8ffad016ea13bef24e9d8f3a4f5ade69d8a39ea7a45c8f7a9692776af5a813e9f81e756296cc4155de2aea1ca0c8c7127d8ffa3199379af7a84f6dc53dea5332b29c8e17bfae68f2d7d58db0144e269349a55e9de969f5602ae502ae2930804c7181e745af70e0bced90733297428cdef957bc67979e75e010c94a49d852e484986452ab1ebc5257abce0e91ea10b94e85a5523e613e6122d4e4ed13f6a86f1fe7a3eee3c451aba3eed3269703ade857577dc27c9813c8f2862879aba86f58cb1adc2edda3ae614a76fbd48d52677a4add76f050fa3578a3ae1c10a48a4ca7de484bdeea1b65b96dc9ff49feb5104206349dc1c285900e211c691b8446a86a6d857c00b1add010602b9443b9b5fc0a63ee055ba11e7a396d909f908daf3066d3f966256c8554b4add08ba9612b3463a70d82c3d30aedc8add08d9e56e80403fa1c0825b6414f9f36e82f03588faf0f535da93f6dd01b678456484b422bb4d49bd00afd406f4e0f502b0483422b74d574becdd9e52d835aa12d66d3f93667b725d406f505875aa12e120e34f776acd00a29895aa114ceb739bbbc3df4abd80a7975602f69a5747a2bc4c2d80a05296a8568bc5968856ab4713f744377467a466d509a0b6d10df76a8bea35688c75718b3f9446a85b24070f96e1f5556dbb1154a26b54226b6965f61cce653a91512f2b6d406b9c941a0ec4047676a83d828975f61ccbda656e80b431bd4c6a915e27a6a85a8824120e76fb52d432b0424cf6eeecd35b4424436b4422da0daa0381f58259f7b79778a432b04b687f113636c85f1d6a71e14d50a6181c02abea38bcba95f8cd6fe6420a9560805099e492be5d6db542b54a283e4732fcfeee938f5d4a1159211b4b27b0fad909513006de3d014f5cbf7a10d5a430077218856280609a01c04ca0e14a2155a316537f77614d106a9c91b7bba97839ea639afe2e5037208af91508591b147c0484eddd5bbd557551548c396ccfe76d44d709b30fad68535de372b64bf1a835fe385e81c1dd80709997b8bf3631214f67606fcf55323904af9d78c8ac50b55bf289f1a531535a34af1d7ec84df0b573f299f1adb9c27c665fd5d8beb7a21eb87e553a3108613461cd0efee53230f8c250cb1a09f9a4f8df9058c1c67db894f8d42a74e13adc5a7469ee7e06c32c9e274bd2e8332db96c7a7c69db9e19117cbb01db24f8d59b967d5f6a951d8637642edafd909b217e630b1bab740256f35ac270edea7c6a192a98c237e81c55113014ede2afae5832ebd50bc85b7bcd517feb42d3e3512954b2558842daee5a7c69dcf608650c2903c25153a41ec53e3cff0d7e09a5d8fbf6b76475e08a4cc72ea314aab36ad97775018d4c27d6a4c5d84b96813b2f2a911e842e96239d4b2c6ba4f8d3acf61095aa1658d2b784198e7c084a86d61d7e2596c5923094040f31d9e7bdeb2c60e80a0eccfcd6b3179c696357e908164090b6779ab766dd5a7c6600b669b85162d962dc08cda540b6bafc5852456136beea8658d1d2479588892b7fa42a4963522001f31f6a4902023c7963502800049b10f22e24c6a59e36dfb4af36bf2f94a2d6b24818f187b8924075796a640507d87317907a7985623fb58620f02fe6053cb1a9fa064bc05b7a71762b8f1a91188c585f5e5d4b2c623138f4f8d3ecfc189f08979a5874595a1ec532351438917cd1773c10d6e94e539407d598d42aa075fe759e36de3d1f6b78d47dc0b3994e0fbd4b85ec55dd9a9512d6b041a2a2343977fe41d648df9a7849b4f8d41af0198bc833fc5f6a93178c5c50c7680fbd408e4bbb27ab508040f6d6acc79d678dfeac4fc6a4cffee851fca7c6a54e9f240b4683e35029f057bd557230bb4578b40c0c2102d6b66e2f916ccf20e8ac8f920d0ec44925f8debabc65b16e7caa746f651bb096a42125839c2dfdb644148c426084c6d0695525f33386d56bad8a579eeef1c1462c00bd01b703e9e5a055a8d420c58551b4af48abe80e117a657a36a4389bec30df007f1115df17cd48c85f2d12210d257f1b1186654226fd5c214b23c8d977730038950256f55bdaa52ea18e8b8e98b39589092b7cae324c29bbc550b6d6a1aa30ec952a7691037bd1a5f70ef88747de9184425f5c51c767e34bd6de2ae9e5a35622638b4902703adbcd50e7979a33908075674180e438e701c909068d1410c0772558e7279ab446d582e33d02b1867d8d016755e5768891236fab430c56c9b171e35b490a7039e953c84e89977f005e8951d8b203a06b80812bdfab8b9e9180cbbe8b5e8620e1cc4750823244497dd692d6f195b0e3b9deeec10beecc8923d2de4b1c02696b73a814c97e4e5d04493c93bc8614c0875fc561766a9318d377b794268d106f8ae854eb2d211caf256799e6890253383a994eaf7fe5df3f2a7d44214455fd8d6754e49e6691557c838b56a1c52a185eabab34378f53639b96024b56a149aa2853c3795ba6d6770765a28a7af67f4037e0e44e2788e5472eb9762373ea6d0937393b0aaaeaabaaa6a9aa6e995ba9829b501948347ec215dd97565d75555551545513495426f12ea393d143ca571efbd7849591011fd809373d848ce17e36b4451740de2e3dceff6d3bb87b38aa64be1fda0a230d5caa80f71ba41ea2a7a316613620f8668aa29aaa66afa955315e3221545fdf2bffac22be439e2a8d4afab2a4655b4e8a669599ff2f35f0fa8ab45c714c5544224f6eba833e17bdcc1205414fbe5c596328f5dbd52d74c92393348543449b3a7db607a8588607d1f970b11aaa45ed1a785a24d82b720cc40bf061219463c89700a810144d307260f4b1d94a692a48e51481c1cbb07f4c31194631741428c6c2c636f996419e837aac136ff000db9d191e9096a0a84860c3b4409414445474a18344479509f44061121407cf0d0614a2a8a0354d41408f4830610d8af302019fb102cec498c30aac136ff000db9d191e9096a2ac3d30e51421051d19112060d513b2344847802e1f4018387a60e4c534b524a51491c8e50481b1cbb06f4c39106c71e35857ec80082cb0b49c6ceb3f41a212284510db6f90768c88d8e4c4f504f4e3b4409414445474a1834ac21403879e8302515c5016a83060c4f50e887a729e59657c69eb3b64280f86054836dfe011a72a323d39313861da28420a2a223250c3d1f3c74c030d524c514b5c441092a69c351035206c7ae847e387a72ec189ed00f4e508f1da5baba91b113adae3e78e86054836dfe011a72a3231386a61da28420a2a22325b6c354531407a80d1a323c39e128230c4f8f7d05f898268364ec3e2f40931da6a48c6ab0cd3f40436e746c62da214a08222a3afa918ae2c004b5b44149435286e3139293632f423f1c6170ec47e8870b4d20c0c714047c4c23900004a9280e4635d8e61fa02137625ada214a08222a02b6d808e400b5a421c39313062237c2fe4107a0ba32760919e80007a80d4635d8e61fa0215f52da214a0822c2c6091b3464507a4a723a62406a72ec41e8872326c74ee4d819e08106ae8c1da8030f3668c86054836dfe011a524ada214a08c2c66086a7240c4d4c128086b003000160193b05022020c39393510db6f90728e9b84394808d414e189a8e4c484b8e9df8230108fd9034f4d84168e023631722a181138626a31a6cf3cf11698798d3c484a4b4937fd00fc7a7291d19fb10d45413d392510db619e968a7c29292630feaa01f8e8e8e7d27a31f9040f0f3d88d986a64ec4447a625a524a31a6c8f74862d36eaf8453f2439768c7e387ab0453f1c013954918cbd38e4494724a31abca8d366df911c3b8b7e3872ec41f4c3851f0d6919bb31ff20192fea84fdc8885127ec178c2aea848b8afce22823c7aea21f2e382ec2505f19e3a20bc6ad9c26893d3b168c4546a3178d44c60ac621a39031c8b829a40e94fa84d425182318f7d5fbd47f8cee63241a374ab5d1ab4f3da7ce63dc28d7a7be63dca8d7a73e346ef4eb536f8d1b1543c9fe0653077a02c0072b50a25f584ad55927a7684f35f77d9b0316ed9b77f7d8a28d26ad36bab5fc542dda6818ca7c94c929bc467a2e0f3165a3a3ea2b9e7a02c14543c55232104f20b05f612c06f169ea05950367607a5fb42fb933b9b3b3dff76cee6cee6ceeecec2c033dbdb30ca4b4bfefd98fdff7ecebf73df3f1fb9e398f5e42aed6bec801e9a1f73db35af1460d8d67d51035bdef99b2ce8815bab718ca12cb2832665e6e4cf1cacad2fb9e416152c5ca102f746584e87dcf06f06657065727a3479fdef74c88991033b3dfd72ccc2ccc2ccccccc4ca3a199693f2cd7acc7ef6bc6e3f735f3fa7dcd9c4f8ab45161468e0a0dbdaf9995932b6349c6529cf9d2fb9a2953e0a06157c2ad4e86ded76ca9840cdd8b1a469c44f4be665f786dd23caf5c8cfde97dcd986a86a065f968e3e54cef6bd683a2ac074559d9ef5bd66355d66355d66375cbe81e977d1b96eae1eae12a7bbfbb5bb6e3f72dd3f1fb96e5f87dcb9c21e0b3ab5156c4c41b1a7adfb2b83fb61447d08cc9d0fb96c139f367844d8c1c4bf4be654b01007922060a5d9d1995deb7ec0b8a191b369a706871f4be65cc132bcce889a1d186a6f72d2b739dcafcdfe3e6efdbdc4b93f6fef9d849f8a9692e7fdf268edfb779e3f76d9220614783cad99d151c27667adfa65599932f644e88d912a2f76d2a873bced0d96893e2c616bd6f73a9f527064bd80c364bf4becd0f6c7ab04929638249a3f76dd6f092a3c1e3079aa7deb79947e411237e8fc823f2883c62c488116d582a67ba11718f7dc489115dbf4770fd1e31c2c9c40d902f6c509c20d37bc41a5b8a30606f6288e93d4229763546c99827d714bd478c697b91a6cb0bb0650abd4788a045b2875d55d2851bbd47f4006305865632cc95de23729788dc2542c46f117929222f45e4a50811224488898910d182e7b7081bbf45d4f82d82c66f11ce2b3704c70c2bbd243dcef4166185012a6b6266e0b1d10ad35b84326b879333346018d1a2b788259f0b1f339ce0b08aa3b788af3f2f755fce6a6cf1a1b708134d207477726b665c7a8b5813624d881de219e219e219224488106d582a5fe5ab1021ba426cfd0e31e3770819bf433895fe98945933664eae4cef105664468644b991c2c518227a87509eb9b1ec0babf15ca377882506295a7d5d604bae04d13bc457933e28525c1cf99246ef10cc263ee2ecba588c39d33b841410524080f80de20dc41b883710204080b8bb0311f7d841c4e101026bfd0681b37e8300e14ce1863985adec899bde209a309d6663ca3841b2a63708e51a990abc16718484e90d62d9d7bc714677a24d1b2a7a83f83aaa1ac3a5ab6c4a09a5de2030f0024cec880d1a49a6de20789a7ce069f2617fe0697ed81f9e8ffd4332c6ef0f307e7f78f1fbc3870f1fecf687bc0f7a0fc7840385c78fac2a1a7a7ff0b2a60b1b171c98aa207a7f50deedd0a373d38776a5f787659a1d5996241c5b95de1fc0d896986833bb8bd3fb03330bdc13b0e68c19637a7fe0d1f2c0a3e5c1c36f0f3c5b1e78b63cf06c79f040e7e1eeb17b68c3523c603809751e300f718fdd039907acfced01bbf8ed01b7f8ed018e19655d103d32247a7bb00a22d705a7eac710337a7b507289d9d17066cd91d1dbc3d09ba6dd169798d79fde1e5e78992176852b99228bde1e980eb8d2e50b5d9897be167a7b68f294e8c053a24387df1d78a83af05075e8d026fcdd01eb7787abdf1dc23a74e8d0212f83156d553edcae94bcd1bbc3190f35b7386ac4cce8dd41e9c117387a7168e060e245ef0e4b3c2e40dea09c215244ef0e5f3b65a676ca4c4dfd9edad99bd2fb9dbd29bec73e15e7ca1466f17b0aaff83d8555fc9e9a9a9ab29bca6353450dd6dc8db22b7a4fe9f81b9306478859959fde53ca0e767b35aee8c5699ba1f754842a3bb29238f8869cd17baa6fcc0690b03f32335ff49e6a268b24a9d24441a2f7d44e9ad44e9a94d46fa91da7d48e536ac729252525d586a576e876e8a4a4e2d44959fd964af15baaeab794b3479b354a92d4ed68a1b7945597134566fce853d3a1b7145b993e2c38716e597a4b2d67d050e6d0e2b5c64a6fa911b0b92dd971030658526f29bc16479cc8f87213466fa99daea89daea8a8df513bcba89d65d4ce322a2a2a4a6c47c53df6a8248ec23b0ac5ef28aadf51277e47397f5cb9802366848d97de51566a6027969c0943b1a57794129b597d01c371e7a7a677d45225b3f504c6902a4ec2e81df545813338755074ac70a2a57714da90322554ec80f30247efa8351cd670e0f09bc393c393c39303070e1cdab0d4ced5ce1587b8c7ce218e1a0ed8c46f0eb8c46f0e38f99bc30d343c156f3f5c08d1a13707ab2b2aaec064a9f891456f0e69765becc45cd438b2436f0e4b0dbc38fb31c6c49b2d37f4e6f0a5644e8d18ab2d593df4e6c04c9b0147aec518962fbd390ca5400da54041fd861abe410ddfa0866f50505050777750718f1d0a05d4df6fa838bfa1fc7e4339c138c9b2d37ba3a44b6f282bb22f374c6c95d5b9e90da50c936695f492058611bda19659ccb1bb1538e4dcf486fac292a6449535ae333df486621e89b34c4185c71838bda1c6368c6dd8f07b037303730373c386161bfa7e6f80f37bc39bdf1b366cd86077dd8444e94282824e8614bd3758154981a55c4187424fef0d437acc19f1b163cb8cde1ba896f4d0abc3228686de1bbebeb0c44132a5ee0653ef0d4c14f850822499a58c932fbd370cbb340cbb3468f8ad61b8d4305c6ad81a9e8f5d4372a9c1cd6f0dcfdf1adafcd6e07cec1ade3468d070e72477050d5ad3c50abd3558f528b1240e9a16d69ede1a946e5b7c756766d8d8e9ad01accc098e157438e0d4e8ade1aaccda942369419e7a6be88283d276422b4b893bbd35b46b32b46b32ec0ced3343fbccd03e3364c890a10d4b0daf865719320cc9c0e6778635bf33f0fdce50013c35783ab06c5519a377062b696fc2ba9cf588d2a57706e51e8a276c6d945ee2f4ceb00c414516b2387e48f0c2f4cef035d6842b29a6ebcd87de19a6fcc830192205469d11bd33b4724faddcd3d3efa776eee9e9e9693fe5e93df6a7362cd5deb5774f4f623fbf9fd4fc7e4af3fb09cdef272701d020d9b1dc13d2654eef27ba174860246730c1fcf47eba624eacf8fba1c24f2d86de4f484edeb08c71c1d13645efa72f37154fd8ecf031e38ade4f139c6f2e6238b1eb0aa2f7532bc4a915e2e4f4dba90d736ac39cda30272727a7362cd5a2b5684e4e4ea7bddf4e677e3b99f9edd476955183060d19bd2d7a3bb520ac07172c7b66296ce8edc4f4a1c5c45e1d102a1c7a3b2dfd52fc8082b5c44b0cbd9dbe2260d685060593b227677a3b31e3743cc160d04053a3b7538b02438b020386df185a2b0cad1586d60a03060c18dab054cbd57261c0d086a1cc6f0c7abf3190f98d612e0d169b2269c42865e88dc1cad90402a34c1c354fbd31285d10f6b5e6438d4d1a3ebd312c85b8a9ea02d7d5c38cde18be24a83851d7d7f7e6624e6f0c4c1d3faa7628c95b91466f0c754d754d4dbf9bec9aec9aec9a9a9a9af8f89a9ae09ac6fc6e12f3bb29ef779393c6f34a1bdf1bae3dbd9bac2c549da9c1d6c682cc8cde4d4a0dbcc0c14a51c6c88c267a372d4160a525ca19213fb860e8ddf415e4c2451c9737135162e8ddc4849387b524cc91bc377a378d318d3131fd6662323199984c4c4c4c6d6d4c4c5698c2fc66c2fbcd04e63793530426dcbeb64a8079cbd29bc94aae4495a48d1f3bd0f46652eaa9adb00352628a18bd99964960704953c1e20d15bd99beb86a34bb58617bc3456f269f31aeaf3ca7952d597a3309b19684584b4bbf9784ca25a17249a85c5a5a5a6ac352422fa1d7d252ddd2ddefa52fbf97969c15e674f4c5b9bd01a1a2f7929500d0a8d892a5a28b1237bd97945bae96a0f0fa32c64cefa5250736a880a0c05b2e65e8bd14829166d60d3279625c00d17b8946953fbe31143ec44ee8bd0446098c92d26fa53ca53ca53c2525a5bbc7aed4d7a7a41486fdade4e5b75297df4a76bf959c1ec44cc8c032f3240811bd95ac12a017c7e3cb1c595a13bd959471fc54bcc9b85281a5b71291322f966dc46630f556faea32a6459424585527f4561aa272cbc122091a3260f4566a92d42429e9775233a999d44c4a4aba7bec496d584a472729eeb12725cb2471f99db4e57752ddef24abba217190acad29e146efa42658733c9e48e054e89d94a24d4bde0c2250ac38f54e4a0227ca5f57958a333bbd9320b004c7973543b29638f44e0a00921b57d4b0a4383bd33b4947eba8a3753cfe3eea6c1d75b68e3a5bc7e3f1eeb11fc1c08e473447badf472dbf8f597e1f35b0d43281238a912052f43e5aa5004c968f2a31635eece97d54662e5e74d48d21e22385dec7e51e0a1b5d2bf6e0fef43e7e3d2ec222459926753d6ce87dfc82e28c94ae246e67f43ee6ac41ca598384f41b29e7898484448774f7d8ef46cad37bec486d584a874a870a29eeb12395fdb941c2f21b69ee37d295df48ce343642947819f322446f242b3049ad3b3626704bbd91bc3889e1864a8b3338f446828135862f099ab8367a237d5df9ad50e345b9eccaa23712d3cc19161b4e2a40faf4466ae64839ca917274f4fb28e7ed28e7ed28e7ede8e8e8a80d4be5dce5dc1d1d254b1c59f97d24f7fb28eef79133066a295884d1aae363ea7db487c5a34d1b1bb2e416bd8f3080c3cf6ee915e4ca4defa3126d2780ac610639fba2f75108306177753280bc08a2f7510538714acc7c25a141a6f7d1d885b10b177e5f605e605e605e783ef60b5517e07e5fa8f2fb0295df172e5cb8603700265967d0b89ac819d1fb829511181c7d73786c9c3cf5bea06c801b171360d45a8451d3fbc29205ca1963aa9c99b2638bde17bea65c9d21696333f2a5f705a69d8db8351c4f50bcd0fb424e97514e9791d16fa39ca551ced2286769f47cec462d8cde7e1bb9fd369af2dbc8c8c8c86ecaf34cebccf28419bd8d584c6123a6491c36cc3cbd8d948fcb80c0f90226c8599ade461e885357e209d61b3c35bd8d9a6bcaee8c7419f3d3db484a8d31777d6632a628f5360aaeb1105c63c1c26f0bc1a785e0d342f069c182050b6d582ae72ae7ca8285a4960529bf2db4fdb6c0f6db8273833934a6991a346e9ee86dc14a2a8813871a2b3a3828f4b6a03c815d9ab414626dbabef4b6b00c4365e944cbeec812bd2d7c6d9d1963e20795ad257a5b6096b9b3d24a5116454b6f0b41294541294545bf8bde8ade8ade8a8a8a8aeeee8a8a6e1445f95db4f6bbc8f9bb2884264ef2783c87d838b142ef22edb7e5091f5dd2af88de45497494fdc59092630c96de454b0bdcb871a2ea0c17dd18bd8bbe2cd40d593e4dc499e3d3bb288397a7950ab6135b6bf42e0af2300679188dbf8d5fc62fe397d16834929119e31ebb918711ca6fa3da6f63da6fa3d3898c307a509224e1a2b7914a055f8a1b7164d8f43612c13a0205eb4c0b85dec665dd1728367c3c9394e96d740386c28b161e468084d1dbc8ecc0c55c0d3f374dd00cd1db08f473a09ffb6f0f263d98f460d2ddbd0d4b05b38259ee49218ef6dbcf7ebbd96f77da91715146468c18227abb95099a28d921a387559b0dbdbd0466e0e8be54e52549a2b7ab2db142832d8e8a18a6de1e42d718194cee6ce49578a3b72fd992248a152b742b9c7a7b13285704ca158bbf8bc0b92270ae089c2b168bc5362c05d403ea158b62c5b2dfc5e6efe293df452710495793246c54e2acd0bb28c4cccb058badae337a7a17951fe0728e211283cb4d9cdec525911468d09811d952a277d1aec69a301d7965c894d1bb8822cd4bc8589b8c353bf42e369b10352122fa4dd4246a1235899e8f9d2849464444444444446407fc5101f8a34285df15806015f41e085681efb15748c655a0daaa50a14205bb0a7940ac2120d6d0d0ef21a07208a81c022a879e8f7d68cb109593df43434343437656c86441f143232244efa1a50ae07091c166cd151f52f41efa5a23b44648e8b7d053e829f4147a3e76a1249e10d55698909090901d2b2588951214f43b887d0b62df82d8b7a0a0a0a0362cc5deb1774141c9675093df4164bf8398fc0e72ee6813b763ef6d8b96de411168da0de10124b9a3a977500f2a296a5a6ad4dcd6f40e5a72191203c79a2e4b9a7a077d3da641d6048a18317b637a0785c083851e9518b31968a4e81d3446618c0285df149814981498149e8f9d4289248525bf2928f94d81f99b02050a14ec2a389f2756fc40b30686de149431f25a6069a356258dde14a8b8f87b72c622ca0b317a53c8c09712225b554fba50e94de14671f244ca182cc92d2ebd295c3269aac67eacd5a5f8d29b028b05c4620101fd06629540ac12885502010101b56129d6cb0b28eeb103510125f90d84e437d0d86f20e7121f950e382c632fa4e80dc465e6b603870f2e5a69f406524200afcbcf081cd88e2ebd81967e46dc1c299b02c44f6fa02c6054dca875a10226a9375095233e66f4d851c664a937d0ea3761f59b30e1f7043639e1f9d82724c57e4f38f27b8291df13264c9860b727e44dd0d309b34c73d73697e5a6f704ab0898503136a5471d103abd27281f4bb9b23c912208992abd272c7780dd51cd21d123a2f784af10ae62e8581bdba2c2e3d27b429013657d4e6e50f182a2f784554ec22a2741c26f09eb9c84754ec23a27418204096d586ad55bf524489021a1c86f0961bf2510f92d61ac8a98365c53e0bc28a3b784b7a499922e5c90a471d35b82d208885c09236fe0c4e0a2b7040ed0e063c16706081c12bd255031c1a7a662ae479b317a4b08c31c53d284aa59c489de128444101221c2ef086111c222ac611122448880861621eeb147b81161c8ef08427e4700fb1dc139d5e7838c97254dd478e81da1c8c5834c953d3178587a47a0e0a566050f2d7d597c7a47d0aa825706a54db942ef082bd8e0edd9c0ea22664def088f35c667638b0c225d7a4758b57e56ad9f9fdf3febd6cfbaf5b36efdfcf0f0f9fd13e4f70f90df3f3f7efffcfcfc30602bce8e6ccb1d1b14bd7f7cc4e119e1f382f3264cef1f202fb4b620653b76d4e9fd53a7d525ccc489253fcee8fdf3d58602edad4fc60b34bd7fd2e0b04ab6709a8129a1f78f5ac6472de3e3f3db47ddf351f77cd43d1f1f3a9fbbc72bd54ae5e3c3f4f9faede3e3b74f8fdf3ece7bc5cb8e46581bb71f547afb581d59b3a2ea489214757afb280380175697f6e247102c7afb2ca1d8c978e3e38c0f86de3e5f63565a7060c06a28d1db87b97190b1a19919f33cd3db474d23aa6944e26fa2ea24aa4ea2ea241289443a3a22b18cc8e337d1eb3791e83480971511236e66aca1d29ba8c1e888bc091326e68adec410966ecc581ca9aa71a64b6f620b2540c250b1998939d19bf835013047f4f4c496cc40a337f12ec91abd2a314eb6c4f426aa5d3d6a574fcfef1e75d9a32e7bd4654f4f4f8f98584fdc63ef81ebd9f1bb47c7ef9e1cbf7b9c5cd4ac10715204cc10bd7bac8ef6b0f0fda949ae25d1bba746d88aa7141e4a353ebd7b7876a0c80bef4e023026de1da53144fa13d846015f666a7761c49c89e1020b0cad25309a80e1e2e4c2e4951cdd1a22959eb6c4f92747670c914f4c5bce9ec951194324d3d316145a594364d1f8188a5c790c8ec61822310431f12ccbe65996c5e02c1b84f9ec0ebb866559279615a2f5ec0ecbc72a39cb3eb16cd889675b560dbbe42ccbc4b245ca9e95c0aa6159c754acb37e591d3cb2c2dea86861b1d12c96365e7694ad39afe89d3b3cf9e3b262ad88160ebd6f73a8c65ddd92bfb72f697a5f6701bad8cca569f262099bdef7c9c1151c44b208c962e3a6379a0cd381c34ca1856d450930ecd48eb8b0204ab6d818617dc410d33b54588c770f837b772018efee47f7277714c610e92c9a358d8aa184b978c1e477ff68f93df44c46cfc4c42484cc330d81f24c44740819f24c8e2a8748a67529cdefa95f32c3e5ccd68ebd1d61b8a455b5d06177828adec75faab2c493a2e5a6ea6b6909cd2f09f9f14b4643fae4986e6b5ab6f492901dbfe4a88b217289ca53967f0243fb27bf63fec9d11643e4d304252525075272877b250f2a05517b2547b1864825a7202bdec9d1ab21d20903102e8fc15116432486154324bbd53486e49b1c553144361979f2444ee4404444444b4e4464e4cd130d89f688889e888988c849404444e45945222247bf8888ce10293911114b44e441a2b1331c4fd8a8969cdde97d9b6352b848e3e4ebc2528588080f4b8ab4a593334fa2a03276345a748d71b224729665599665599665599665599665599675d46a886495ce28292929292929399a6288542a168bc562b1582c168bc562b15874b46a882cf260330b6882f7a6eb070f374a3a2f76586a2adad288187346cb1a156045c2dccbbcbb0753a90c4c944489f3c164cd8b767714c510e94c46da9ec951aa219229585624ce2f397a62885c0a9a182289dcb800a9aeba1113d494dbddeffbb6e4aa7ba0aaaa1bdfab39aafa45a5b6a9ea5bd6ab5925a3165d754c7595f5ea9bd7ab3f2a1955c955c7642adaab6d1f0caa507266ca524bf38dded74984d34489990e1340ecf4becde47d32c3d03d34ef006140a8528891e127436ffcc5014d190e364168e8b0d24aaea4a4a4a4a4e4412507525272b4c410a954c4638ac5a2dbe0b2fac1a50cade82ab4a4cc7dad5863512c168bc562b15874343944168dd494dd03b24e82f50f5896f51088889e888888888888888888c849101111790c8648a2a5a5a5a52587c110b9e4aabbbbbbbb6b7977372aeffe8221d25d3044aa57ae9e482412dd880947b913fde98af38912887744a27b405422128944594b442291482c3a91c844241289442291489cbbf14ccee42d18229982c562b15874160c91c5a52dbfe42b182297824444444444ae02a52b365ec95330442ab12ccbb22ccbb2aca3608864ab5859f2ee20cc3051f5c5460e1d32f05431b78a99af21702ad27089d3aaab7e82215235c11049b46b3fc9933cb8e393a668f9242fc1109994dbea1ec9911c0809c98d90fc490a9947b280448784e41e20159190a6b83d528b84f39090901c09c983f991909096c82073a50d102e669090548151c2a4ae6a6c8cde68724a8b7757dd4930447a9048241289441fc110492c16998ac56251ca932f4a497ed1453044165996655996655996655996655996653d0443249b9c323482edee891ca8cdc813b1f1782207c11049e42cc66385617edfa7da430c569022795c9a535455ed7b83a48410b4257172b008cb92c305d596aae2bdcad6e255b6ac57d96abcbad663851e9b126b5eceb4ca66f5aa7f608854f710892437f73d3d18ccf7f4b811139652758f43e1a8fb3d725ebea7a7e7aea747ef7b9c04726e7a88595cdf737bacc0f81e9f9e1e22ef71b4ad27ee7b1ca5d352e2e584a962cd93bc1836f6b8e8c5cd85d9d23d419e3d7c901993258dded789dc616346d997669c999e9e9e9e1e2b574f444444e41e1822898844072212e5d43cd13b30441259966559966559d6393044b2e9d453da94937bd583aa5c95577d0343a4aa8121b2e748a3c61f3d0343e4514bf9e5b37b76a3ec4c38aae8d99fb21698cfc2ec257b07384af5ec1e60a9bb97ef5d96b1e5b33077c9d9d1ac8c94330d179f85d92e133d3bda9689f25b32994491c1a4dd65596166acc41a9de39a6061941cf9c163c973d957c40f4e55fea1e6c64f59864593bca6aa88162d296b5df90b151596235b65c8c0e52951d8d200c141854a9becc66cc9152eb3ad17ca4c4434f77be8898c9ec8af9a27727a2222cf33743c9103cd58f344ee5b529ec8313044121d53229148241289ee32f69e48f42b43cc13fd0243241109c9c32321c9187b24388fe416182291542d3d3dc21e2e3d3d3d3d57586cc8ecba8ea8e861b1660d8a979513b2b29e9e1ef71e27d1e31fec7d4f4f8f7f3044f6243dc987dedd33d9bbdfe5bb57608874a0b54e8da0d2a9aaba455555d5512daaaadebd217a437424c19217e38d7a0238bc382c35b6e4cda9aaea7c9575d549a8fe41324b75b4c9458121522dfafdf3452f163d9bf9a2df225ff4090c91452095655796bdabfb7d9f117ea354742ceaf5ac96df28f359bfec65ef5e01c8b2a4e1d9902be2c682c97b637b8e19b36451709551f36219168675232364eb0ac90ba6de68588c37ac279f751254cffa072a92309ebd65593e3c1822d9a60486c89cff0867f9a3a3a3a3a3db94318389d8112f317df4c4855553079e5c11aaa33c207f1466eed92acf7a04203044aadec1107934e57fa14af32ff80386c80b4646466e64646474e48d4e3c3deb0e18225955f5ab7a038648950143a4d1549c05a4df436fa1c25bb0b0f67c0b51dade8296b7e00b18222d7811962f2a2a2a2af2602a15803449bc4811d3e1164417c9753d9f8cf5b823d33bbf7dd1da8a57d55e75050c916a0286c8a2290c6f0402e48d8e8021d2d875e6d775eed795e886905f7d56b8d53bf8a0b8ae4e821b687ebd7c56ca2d5f571c72bfeaac57d6d5d1b7d5efeaa8dd8adefd6ae537fafcd5711247655f1d53adf8ea57acfcd5f1d68ab97ec561bf3a66e2a81e5f1d93ad68bf62e7af447a24571cd982a68c9ebec0a7a50693245ad7da75de675a0d166b27dcca5ce91f574abcc56131f3b76e41717282ccaa8a19bdd1bc5f578cfd50bb92d7c34d6f74ef57bcfc157ffdea2ccbb22ccbb22ccbb22ccbb27e8021926df260b9185c5102f92ad1240f2d820b2e273e9ac071b1a5a7cc151b449c4388d0bde8e989fb9e1eb2e7152b25763081e2a57b7adc0043644f7b86a6aaaa990aa5aaeab2c8abaaaaea207b55479c575527e175e2550780d793571d01255ef502ccb5970c528e2f4668a479b10192e13e672599973146fe50bc48a1330e2e9f9d0043646e9f48f4a09327c679a20f60882466bfd17c77010c919ee18b5d7d5ff4000c91c5205157db1339008648220ef05bcf5770a00a15dc88a9823f55f0292f137e83f80a152ab8071572850a15bc82df0ad7b9e22bdcf8ecd9371822331057595737bf5fa9d8f8d59143e4da64d59e750d864836080caa6f4f5ef50c8648550f9115f644fc909c891ff21f2287e09ebc900b399090901b31e1a8ec42fe24e453715b2f0442687521a11e21a138342f242424e4689610514848a8292424e4d7c813894e628824e6a8aaaaaaaa1af7e35555f51143a41ae27bfc6af91e173144f6b068721fff094eeed7156ecaaf1e62885c739acf0e6288cc7f3578e8a0c2048daacab3713bcc74d0d8c371868766ab9c79d63f0c91ac7b1822859e8282863ec8e883983afc86faa0a0200ff2a01ad50779065213fb207735371fe44728641fe44f4eab0ff2a92027e12cfb20bf69681fe41d86c8203427dffa7c4be5dbb66dfd094b5dbbf687dfb74ded5beb1de0a8ecad7ba0b67e5b1e63df0eb56e6d8fb78e66b56b1b964c2659b46948bedd69a7b48e3a53a9a06e1d7d6bdbb02764fe9c68e598f3a2db342055ae94b595886ba1bac441d1064ccc075a1be187dc96934c8517084ab28eb8096b9197a3c582b726e7050d112faddfb64d531e3dd1a786486270c4d0458302f1eb456b23fa7de3709cf9d5d5d58347b07ef5bce4fbd581c67e75cff1fcd58f47da7ef527342abffad48ee6af4e4279cbc4e47e75048c6dfdea5243e43a67f4637e4f7d8f9e9a9f0a17575631f4ddc7efe9e999f23d38be7c8f07532926ba1a306e04f9228687ee3992e27b3c6a88ec1131e2f7cf50da6f23b3df4c50af827815edd51e485eedc1f7aa8f23affae07bf54bc9ab5f705efd41f6aa5f1e695e750e43a4dae4c9527e4f7d4e51068bd60f2146acf4ce9fb38031e1ec7b03878ddec7cf6b35acfaa8e0d072a6f7d367cf6d9fddbf7cf6602ad5a14b8a5a1e1420626a3afbe541e5b3430d91b9b9db677f9ef57bb7d1b34ccfba990579d6336b96e6d9b327cfa2b5f832ba677dc3938621b2a5f0f6143cc310492108e44040406e0404e441a05cf640315cbcaae1557f1a22d5755dd7d59d86c815c3100934c5f413f07e82370d911382c497c0f612dc71d4ea12dc4882047f92e0c154aa044f1461b23ca13ab3a225b081b263c7d617275bf4ce712fc12fd9abaf3ad310a9e64489d0b6e6044690b236bb109870c305230926ca11bd8fbfc6e8e2860c9526969ade4fbfae6bbfba931df9f5a6c981630b97286259e4f4bafa92d21029612a829a8fe049436484e0cfff60e7fffcb8d1cf8f3f612954994c2655e81f0fa65215d821e5081a1736559ae89f335cdc4459f2e24cd78f5f2effe33f43bf167f33fdfaeb6f1049bf2f5a1322414dd67e7520273a7e7577a2e6573faafdea4f4fc0fcea249a487ef5e310b93a55bf7bea5528bfefdca325dcd6d0809385ef84defbf8aa3fbd1a23c59899a753cb15bd83cd97144dafb22530f4be6f6aafbaeff85bd684c7ab2aac38c97e804983448956c984bcea4843a46a773444fed0bd0fd7ddfbf88521d2a7469607f23c30ed81ee464c4f409fb271e2810fc468df412a15d440ff20038136f21ee8033c03b60e04f600818e7e71c93d10057ba019d051278e6ac3520e44e31e38f7400fa6521b4c8cb1ad2922d6a6a5816edae469a9d1a7b544effc40bf40076e8d116b32c5cd921e40333eb29019f355a6a70338c6f6e5461799581abdd1b0073ad5042172e22f2f87de28932bf94457896e3444128d7ef5bba77ef5a732ad2d0b43e4daecb141e37bbc6888ec0152e3069432353084e89dbf6dcbbeb523c3e6c816b1255e72bab5f1e25b370e916dd067bf35c47c761f2273708a8f2af4aa4ac3cdab35a0bc4a63cbab5e1c22d5f7d2c3aa09111a659eb0cd673d984a21df94f09811032e0d9b6669c83deb444324eb158648a05df379ea9a3c8f0f0d913c59d0fc4ef0779efccece0ed07776e89abfe3b3e36487f59d9d75c7ef4e1dd8eff4ec34d97154994a05f58ea35b38eafe8ebaf3944c264fec783095d26ccacc95b931099346eff87da69822234b8b2c7ae7df815b9364891032714276d0608969ddd021636de7871ed78ee515d88e9dba35cc3f2169aa6cd979fafd4307f7aaaa7aa6eb7bd585864815e8f7cfaf75bf87927ef5208e5a3debf8b54ccb975fddfcea4143e4ea2ccbb2ce3a852192b5f0c02c531ee840432470c210b9739d3fcc62e2872e61881cda78a190ec85eea954500b85cef4348585c90b4108bd030fee5dde0b9d0458d2bc90ef854c848e2a7194ea4247b38428d70bfd6e74f9420fa652b7edc51bad216c7d449868e1d995992a2ae666e89d9bc22e524c489172268d8adef7f942ad3b2f31b8c4a270e98d265fe8fcb6f50843649b01386a945629de96e4d03b2f79750410b82569505c317245ab3154bcea3f43a44a018b8e07bacf1009ecc00e265846b0aee039f5cebfae4a7ef5602a6502b3224af2b2f02551e8d5069c5f9d3844ae5146cfceb579d67b8648360f9142f48b67884ced748c3e6d39c6b46803e0d31c47874812698e31e8ab71a7453e6ff888068b7c9cf8883a1257de3ece477dcab0f9946163fb7dd97cf67092deefb1f13df601f8595d3636e6efcb16368001b0d9b1e5edf5a17042832c4a95de976d79c18e4a91bc266fd28ae87dd9bed2a2a44589f2fb46714671467146891245007474510450234a92adb028586284a9599385081b2a7adf287933f0d6e4f0a678d1fb46510a5913b2b6f6fbae85a549798fef5ad8daf3b10760d9526dad21f97dd702108035bba533786ab2d4fec86ae87dd798726c5a9a675f4a9c00d3fbae357d50387d50389dbfafd3c7cae963e5f4b1723a9d0068c3523e5c3e5cceb8c70e003fb0eb1cfb7d9d62bfaff3c8efeb7472a045568f384788e4486315014b6e6f4dceaaac4aefeb5432639429e1b606899eded78955d72508902c6b29f0f4bece2f2a42d49ebc818195d4fb3a79882d19d384860e29727a5f27b10b14621728507e5f287d8fef7092dedff141a1bb5038e0e383c281112a23bf2f943028ce0cdcd8d27b51450b099ede17ca32ccd956d79510ae3dbd2f942fe2981a714c4dedf75563aa31d5986a6a778f7d83b737b50dfc985cb522bfaf5ad8efab46e4f755734e200c499c2026a8f8a9e97dd5ac7ec0f0e2a2c6959d97de574df9c4ac8ad32489df11227a5fb565932357b01c49c242efabf6b5a5373676c54c2143efabc67483a3868811bf1b3af4be6a44ad34a2565adaef9bb69526ed3dbe69697469fba6e5e93d76641b96227a11bdd2907e67376dc8ef9b26e4f74d03fb7dd37a80b1f167e3cd8a8bde378dc8841dd34d0a366ef2f4be696b564e2c81789179b3a6f74d5bce10d2226d0cce180dbd6fda17b0afabc710a673ae89de378df9432f8c19312f7041f4be694d3f343f34b4df178d98442326d18849b4e763d7c02fca450bf2fba201f97dd1c21e6ba0019a1d18d90d361d267ce4d0fba2513162040b0d8c2e647a5fb43c2a3bbec848728123a3f74553d3a54d2f489d5b19f51d3c22ab201999518f8e7ca017865c048d90642c4ca1283a1a438d4e7ce84bb0e80363a88289200dac501021046803ab09476741091bb0d4085368d09f0e6e3e2a71831f6a8f943c94c3c74450c8c10b9d0d6c7236e0058f5441e0540e1669425d69a87524463063dc85c5f0da7a10f00bf9e51d6cfeb858e15e610f027ea100a47f3dfd5bb463f02a3e22bde8f00359b60158deead12defa003b00ea64968d91b1f69f9202811104c93ae277d861f00faea0663725632c437bd065c79079134f20ec649b5e51d2c010c7ec7e0d1d7ca3bf87079ab6f742686f3917a79ab19def8434f86ee7efe1699606d429b6ebaa3c195bc5511438ed04cb03e088eff1ddef20e6e00246f756a4adec1f57d4ee41de40046daf70899fd55fb5b36a563007879ab5ba6a4a2384085080122c40409113efc78d81986e880dedf0901a3396fc2212bb2fcce4219545e54f2942a2108e2062b6a0f8f1415761c442844f1d58380cd62248bee1016b8aaaaaaaaaaaaaa48a0aab2c15555595f57745d57203b84069d72878a2e37563b9878a909a2aa462bebaabababa5a74955634c6a690dd41a1020307151122612ddad8e8c09b4a8631b1b87d5139a9d25bf3f272c2e1b5b0d127e7c2e8cb2d7b1547ad6c3b95f5845e1d512aefbb7a1edce6a724d6207075a0b104317820d04960b504e8036ff3d57bf78107f8883b08535ddc669aa6699a0ad58da8f042c4062f103f56e90a0f796fcf6fa820d9615dd7754dd3a2278c31c6484fb5a94f53345557160864573545519cfe90425dfc4631aadc5276d0a15c46219780e10085e4dbf00324c3ab380af5eb41ecb7282c0f8350327a8d300b104fc3a191c27038cc2bd060eae9e840180da361348c86d1d09e5e03241539fde1e4f43f5b7918d02b7c9d57390f007c0442e27c6b021e4961aac06469832f493fce14a47b471fbf73f05b5ebe6510242c4542716026baf51b5d62e6f23621632cd337151c69b871e10885910594089e43c3f05cd86d9a11a6268b500f44526014e1c2affcced9807d940b1f9152585084fb3d0cfbc0688d5d3249e4c3e170983b80828282823aca01754458e1831e74638a3f68446f528e0a3ecdf9940ad555aed9cb41759d145c15efacb749750d34a27f71d4665ba00e03b0ae6243bfaeebbaae2bc618638c6f13128c12217c94fa43f782dc502faf0e502722737b148694ec01fdfd469fc167f2360dd1eda960c26b00000220e0ecf7705dd7e3f5bb2f955789e41887f7a8e6f8ed5147f069cef0049fae392af8d4ef51f5bbbeea82f553d5c3246840c5cc2e429b3d34b9d76a3429c247c62cf8c1c70d5084f93c9a9240d595050683407655d3a3262993f840248cfc5374030a233bbf1eb6df2bbae51c6ed03e086456909c5b9fe6f27788f236f574749edf393c9fb7b3c10ef46d08255fa9d4715a8480a9a7a303bd29df50e51baa7c4395a812015032ea28c660aedd1e0222914aa9454638097b54aaaeeb63478dc2376a1a19358db29c915d32a973050dbb76611f10d3d825d13df594e19864ccf915a4526a11893409fbd3b3c0604e3018cc195874d3a4277b9bcfe6f33e819a449ac4015646c3304e9708837fc3fcceb97b2498e2ca29003ed3e3755dd7354d8ba0701286b2c3507618ca0e436da86b07a5811f945215b3b7bee7e4e4e46404ac6fea5bfa868f1ae0f6508c5708a71c28abc1d451277ca4cc4618c56815e1354aff318a6229d5b177904aa9454f6912f6d4f751f5edab6f2029d6776683c13567b5e8292dda4f4f467719f5fd9444316e0a2f7a3da4e8f5c0fef500fc1bfc3b44af87fcd7853c15ee32d15f332be65f0f44f47ae8692bfc75ccfeced05f57c37884fefafa2307f51029fcf5d40ac6a39e33441e69d1eb41c25fcf1946e02debfc354b91f733e1afeba01e1c22994488f0d783a80b25b4e8f5e0f3f747cba37ee37e88945246e66f02cf5f1f52cdd800684701d78d92ae21485868ddf1e908c3045c3546e6cae0b12862e6455f0a2d7a3db411784bb11524fceb39858b47dd0775a190ce5f67519f304446e0ad4acaa3d7430e9b475dc21089f7a80b2bb42897a02132026f1975a14f8afaf8b4421f1f9f1cac5e20cfaac796b7eaaccb1bfda2cb5b257bcbfbe6b9e58dce49c95b0dc39237fef292b77a1597779aa7256fac6ccb3ba5b392374ec255c93b45e392b71a8797d5b9bc53a65dde29d8972e79a75953b27a256fdc07266ffc2697b3e48deec9a84a439337befbeb241593371a060526ab55ccb8354ef6e19112992094632407996865620b1d25f9472ce8742abd2a4be512a2ceae2a4ffa77087ce13a44a6420e7ce135dec77fb1df7465551665afd3ceeec0dfdba4aae9458dc01e4221ba013fa54dfb7a7a2ff61463156315fbbec1d5532781555f3960778402b0fef57b6370591da97bfa78c3e055670330800f0805efb74542eb3fcf99862ff90295bcfd8d3c67d93fa9445d32469a9bd6988e13253ed0be8c819107012d2d5618c94b4301a6650a579c9d1a357c6798c50f8af2347310630a37aac5471cc5738ff8470300dc26ec3c37001700f888ff1665709bfe2d6fdff7ec718b3d83eb4147bdb84f155e0fed6d529dc91466f475d1e5ab5b3849f58b726129103849f5b6fdf9d943bf7ab08d5ad42ae50047465d0db6e8966fa00f52a99de1b56b854517af8e8d3929c0bf5ff02060101821533668bc53a9d48fdae2a3eaac51e531cba9636f02f19a246c559542d5571645511445d5958d92f156d0759c4a0d61a30c5a64a0b0b584f01aa1387f9ad3a4f4e936dde57de7fe031cb5db0e3c03a8158e421dbdfa547555757c4cd59e1df9830ef031750f68f26ee7f051899308afd1ee600517f272060281a3b01a805b86661c75fd36a94e02a31ef478e50f8a3ac047d59bd6e4ddbeaa06538c2e5114cf095d840ea15615ba50abaa42a1d08542a15028140a8542a150286c8542a1d0f196304f28140a858e7ea161a85028140a8542170a8542a1b0150a854223a18e8bf0caf7efdfcff1a090d06f9a349726e9b890b00801c13469f5f52d4dd2c1aea3e33a3a3a3a3a3a3a3a3a3a3a3a3a3a421d1d1d1dc75b3a793a3a3a3a3a8e7ea161a88e8e8e8e8e8e8eebe8e8e8e8e8087574747474fc1ae9147d60b543fd1a6ddc7cac92001f2f8aa2288abc2740ffb8246fc756582c63b0760366930de84156aaf50d843681893af58eaf2ef4ebc2246006608747fd4a196f12ea41e0d06f53fecb2e0474ec401fbaaa778c42c0a20dd26f1dd539952252c32cc1c24411136fd29021920348911f776a1af51b041af7f1819e63dcc7cff19b4a0981697e610af44261d1cef1d5778c9e26011d1d6e90e3c1d4758caae708d321725d8d416011088eaf3a3a1c008536bc23c1678df789572d5c8f37bd1c54575b2a5479c1d27537a6cfc4d0184c93d25c24fba35f725cb540335777856e045b70c4e0d818e161a6bd6e4bb3479b297a5c7f544272e4c0ba82e38516627685f04f64ec718fe71edffb83fef5755dd715e3f55eb5e8e223dac14cc65e14474da8012c886e433243c95bcd804b03daf12defe05ff4032ef1d78fd7035e53d48b9b0084e0ab8eba50431034484bdeea912cab8e93a914e6c249aaabaae32f1c95ba4ee6d418012319271f1771c091d3ac96b7fad704c00721f8421ba48f72b0f337031bf92ae0ead53156f55af48218e80bfc8b937c5ca4e12cef20fe9cebc0161de2d6029acc0e3910aaec8a8140200ac48fc3d633c26b547585a2288ab9dfb74d892fbe289a5e174a8b36b0f2424f0a53bd193d3dea00b87bf4e70d87eda3ce1e1e8aa7e27bb4db96e26b94c011ab28d4c49003f4ef5ee740fd1bbc8ede7407dbb16a6b5ba8feaed5f14df8bb5697e58de0640d46ae0bd50f3a50104903c344078e1b45abca8c0a1a285dca749dc871a604c88b246a3ee0f78c23038b4718181a75d5f8858f4ff256c9fe3a07bbacc15cd6a02e6f35ecaf8a9d6379e7cf98f94d24f80b870929c91ca4e4ad5efd750e54f24ef3fe7a5097cc612def94ee3b7823c30d1730bf355e19380173623907e4cda95135b2b5b5b72f393ab312d828c3a34b0dbb3d153879fd2749dee9db5f0fcacb171f77daf6d7533497fbeb754130aa5a06a96aa026effc689c51918c5d0393eb1cb6e49d82fd750e5ef24e977f5d03bbbcd3acbfaec196bc53abbf43bc56d8f52052c68b4f0a2a38b49a3166d800a241f747648bd8903f0c666370b28039b16545bd71c2c6588d591d99d16403216b4accb968a10517c2175f5c9f111845d4a411724eb1b282ca132f4a34ea415ff28e62cb1bbf65b0ebd949be8efaeaa87b2af58116536ca8d9d247f7c4833364bec2f000fbf205dd535577554553a99b85c9938515173db6c234eac7542a841c667c7362657ca031a1513267608c39c1f5f5245331a3cc591589d3a251e7409737defb340d419555a3ebe13eea190804469fba6ac477f878b19e0621d9c844c6455b5df3d7af112a040386c9ed52274a66c17476b4757367829819f16382e6f503ce0aec0e4915af1f572caee45073226eb9666c8c6ec59a1c4c302728749839876a670d8b0593833274bc64e08d9cacecc323672fe73073e832b14c274606c2ed88c93959866532f08bce5b5ef96a08cde42c73902d289781706d91ac96c931a383b7e5f731462b2513adb664168c8d9f11255c4d8e6ced41c12106ce589a21479658297b8035b17b0123481c3842a0a0d0f2462d069ed20fca3307790cc940213a6e392816dcdb32546ba9f00409cec8496be78661d8333c3d866f72c800ada8ca7864a0bf662662089b792748304c262a619f39c8b6d39581706c5c3086d98a31394eb305de096dfb03341e8d7e720be453edcf10f0afd90a36bf8dce08af11f077feeca3ae974d85bfb398203018041aa79a99fd21d30fac841f93287e6757fca20c73e4f66f999f94167e58d63ebfbb200b3f356c8d2c3cd196659e16422d39d8055c9177780465e49c2343133993b55f59d826eccbec959d2139a70e8897877fcbe2e005ede2a869d1720e0a615d26b6109ae59d25b04d6687e8a4e51f317645569dc2ae362c39851ba265a015e090ac53076491d930c2b0ac96618266e744d99f9b219abc96d0c19283553c4b5ab470728ed60e9b1bac091e39269242eec4f0924f1e16594d0697e41c2a205dcec1dac1918332863632f0468b26fbf010b6c839cca1984c2c63d7e0844c724e961c2fb3125f827e79e5e3e191817fcbc8d0b57f39e8af590937c3640eb2ad78190817cc9273ee5814592d33f491817fcd4ca0f97d9b6d5e66ff9a9978fececf84938ee9cfef9c51cf40662bce7e1f8754a654a0a9e073ea1ef1d65c3007fd1ed1241050f383de9cc36f7b73cd27bba6d3ee8353b7f941bb0f3afab5daa9403988fed4076f5bf2833fc9471d45713ff8387da2a4f84bd405ab4414157a3bb0f42d2125d9638815982fede8f21a99a162ebcb9e110d250e6b091b1fcb345d66e34d0cad2b5bc6f446dffef2911193c5079cd8da4d4bfc46edfe26fffe5d0f5ebf978b0b4e9c205f28ca68a054aa084ccbc511ae136750f47dba26b07116a5c60e671a2210c8d28409992d596cb8d0f7855915ac659633560368e38257624c9a0c1cfa3a4a753d24719408a6fe03c117e0281dbfbe0212e0281ce7af7780a3b0df5f2781a3b018dcf7d7734e33994cb65d47f3f8f692c9e40cbdd1e75f8ff2a9d0536f875ee767f4e991e953a8a94f9d44f3d336bd711f94a97d7aef7e7cdfbcab17c1f7e5bbcf64131854127ca3561bcddafad4d1650c319fa25e40bed12f300abe5131e65a3275a26d9f06a57e372ad74485f43e4d936e3e754c55c137b6c21863207329c66046df588c19450d462bf28d9d6d167ce3386c67f7294fba71de05df18a7794b52aa23dfa9d5d5a759a9a74b1a6b9fa65e9fa65f29d8d1772a96323ff5b4c9e3d314edd3d499b67d1af729dda79eda3df99498a6a95e92ef942f7d7eea6a72cba71452d5eaea5335eb5395eb535797cc4f55af4fd5ad827daa8a7d4af6a9abcd312b9faa689faa4eb5adc9b71a37f7a9ab76459e9faa779fa6aa1e06df2a9ffafcd4d72498be4fd3d5ead3f5ead3356beb535f97382a5dbd3e5dbfc032f85ec5525f9b64383e5dd13e5d9d9fae6d9fae719fae739f32d1dbf04b8ef2182297929479252525252567c2514caee44f4a4cec5ea95582a3a4a4a4e4574929027160703181d2e7dc520a7376e4cc1d913f1e4a4b6496c42c2d85f90dc5acfa252dcc2ebfe4404ada7ec97dec97fcf8b4c48dd794ca34b143cfee0c498e24583fb645478e215229038cbbcfe0e87288ccf062ee3dc23b93bb1b31e12825777f721854de7dfc8d3fb9fb92bbbb436519c39361a34c471b8f6043c60f3737cac2c8b9d4ef9f5f7ac1f74b4b4b9e61d4f82547710c914b40f99f9e1ce8c9834f2fcafc93a33786c8276f5fe9e79594989494a05ec955250ff67825cf79afe440aef4c2eb95babc92a35d43a4d2547e26260762f220938bba6772946b8864721b43a43b81f9f14e8ed618229db68c7d71e78b6ebe582c168b5bd07c71587c168b45a662914b902fe6e2b3582c3e158b606c7c71a718a6582c7a712f994cbad01b9d032ac3a236e58596376e74914832c80a255cea98e89d9b69c08e04610347ef47116a8d9b2964b6dc588a29168b2dd086d2f01bc47b1b9bbbdf5df97df528fcbe7c5cdc9eb8fcbd3b909ddcbb7b97af773f3e7569befb941719ef4e02005e9cef8e802f2edebd832f59defd830ee0a85b761724a395a8f4261b0c13a2987210312b4703003318002028188ca459162649e8bc3714001a5aac5c685098c7238294c418328000831000000000000000402007ea5ae3fc4be7787b3b1a254fa516b215bc205b7dedf433f239fe3f29ffa8069e79faa35ac2fd590324ba9fcd7e19e2bc86e91147f11af0acb582d1d223cdfe297419dff8b2333ee45d3fb49be1b9a835d326d7d81ef1be5f6b627c1dc0eca34bb169fc853786ca593c4d1cfed6b052f2bff8c1d08170d53688af4a6201d35bc6ec6f72a0cb8e864555f0a53ef82d3dc6226479e836f51864ae39b9321d72d28d4ed8e374b38be6554f311d5cd5e570c9c8f10422f45ae6ec7c00047c9b693026668970c7110b2a7f9c61abc020920baf894e5e04002571719648d086a96b902f6ff7b81ebfb07795a8d2ef56d35f05e42e0a5a06ba67f7ade995a50c6202e858e35ccf9d14c9804408a2898cc072d7670c256f3b67680035c18f2615c93d62c55d9686eb19382ec5b75a8492991c9444a9a8f82e751c283ad14a794546af982cc1aee25afb6f877aa39b638aa34440217d110ed0ba2921000d41e6a2daa0ba5fff0aa0f16aad9baf5645099d175383ea3ae2f0f84a216f698b4b679616a0ead1b114e9fd5b7148f31fca207a5719f4ca5e77fc77b2ae811e809aab01b5e935889eb972318ba12967bfbd9c580c640f9b08bfe3b26cf206c25a9e6aa5850e93ebff098a971f6dfc9a105e1346aca20115a8334312dd927bd72f2e2faf6fcdba857f26cb69b181cde38a01d5c26fdf62f10a96c83c949208f0f05b22755003ab86e08607db42ff0c66a693b612d52fe667d8f2ed3e1ee83af514d1b37703610f1bbd50bda6f5de6e80ed3da697edde637a65f8eb5f479f33cc418082dd31c73b27e76174f4f62acf5dab9b970757a368acb7193db87bbd32ef86983d153ada9d5ed9790341af8d8e763faf04ab37779b577ea9373becb4dda71566777a2578d9e3ee9de9d7eae18f7db9cdb357d9de63bdc6f4fe8f5dbbaddd63a35f562f423dd07103bd67fbae52afb9414beefb352b8151eb611e5e2c31d6e22e365a971cac3fc1b5d4d9d7289e5a6896c761786c09fde1b2b2d902583d57115728a5ea3913653042f0ffb0a83b6e2fef07cf492c8bed1a51b559c444d60bab89d744869d9941b5aff0ca045a6af86016ae1545156d6e9932e2cc1ccefe3e40491df7c082648343f36821b710be195b75676d226b27b692913fc7fb8c3b00d7164b4062c2796bdc1b752ce8a0756ea72f8e2e94c37fc52d9d200f51de2f9dea4ef9041457f22c9359e06720ee340dcb1a8c660abe0b2d340c1d10d1e7cfec76098d4ee8239f5f8c2c6f9e759c99951358dd897b2294725134cbd2c53bf7cf5a95889c002ed02444daeae04d6a9f613eaea67245bf3713c98f5ffe04e91500c5f84058efe13512505b6789e1032dae575e5f37412a8cbc53431ac2ec6c9225f89149cb2f3c9b5bf0cfe3c8b78ed45327b14f2e6a9e0c4a3c1b58386da3f3eb69361cc01b6e0e0ec7d73879ff447ae151b0fe6643ff3f1b9d29a1bab56452d5d7e6c0681229ed8f7af9c4c4d0c34764162561e6def129f3ad1627e42b5bb7ba4aa336dfc0fbf428ac0b46a7cb31113fbcfb3218a052316fcfedb276a3a8e5994ae4fccc62df4bf2ec5bebdf478c97fe4fc9e4537c46cf0733fb07a3c3fc3dc35e9f0ca4fa45f46cc471e1a2c4c4d22643fcc155a4da10a80879857fca5f88c01348c84eb6439f6bc5e253f777aecbec23a223defd42946573ab283774a79a9d2ffbbb4714150e719d46c712011ff0272fad87bb10edf4533c1bce7857bf121f7c44c9771bb20803a598c71bd9a40febef1848c9478f64385a73f6dcdc4b4a1fb5ef9cad06ce3001ded6ea3efdefde5fc866d0392f07986d92a5458ae17e0697f2c39f8a12cd705f2d3a9fb8cdb2b36b78e42c11d76e320be5ad6d4d95d085ddde562a76f209687b624d4502793da6012a2f9d5239b8a94a64f863d1be4a98c4f49a6c3a8995ca1e74183f335270571971e5cc1005ff798f33fe819c975ba3c12687e958d7e02e2d3c5ef73c56775899c0cac4ac8829e7bf9ff9070987b22bad77bcbfdd2f46cc48e499eb5d37f588889312c14090706f37073a803f0c40a9c8cd60bf6b89b97a564d5c47c9a7f16943f84b639deb87c5843477043c9c8a2ae9e32cdc015a93b991f6e196202a786de96515744bc137ae3e04051e5081bd7818e1bd6f3502b1800ca811ec20bd2358800712bc271adce9f804702ad6986c739b8164c6b9e9829f6425476185e70406aee6308207d324890fe12b39cb60d4c0447295135dee3e66a482d5e9e355ce6ecd202bfa027356be5cef712484d16382652c4efb446ed5514ffc0bf0492a69e61d67cbe559cbcbc156a6cf0410f3c924456d30bdd16f2f5a972a892cd1d09cd182e0aca19ccf4cad4e6cbd268222e0933807c5928a22843e0a3dd60b5fa6a27ee2cd3afe370e8f4583219498d03d74f0555f27afed846f6f4a1982fdf8a288e2e78101b92e73de634b85b95e277aa113a8b67a4ae25e2d6ad61c3cae007e3b73c23a3344870427f4875f759f8e7d41a30d58596c5ea68775bdc4177ee85bfb16b7b4d05e6a4531deed928de26016d34cebaba6e521067ffc1b2d7939ff3415ea169afe24dac6bba03ec89451db6d700695500604983ee73819f70cd4eb0c24024d889551332a1908deb24301593bb3788244f5b0eb26f00503c666c75191ace669443927bf911c622af12ae7fe87859766483efe102fc4d038eef18b1224092631ad9863afc15d1ef275c71cf6006b7336e861fbd77c46b579b34d4cf32d50659aab59ba61650d0d68938738d7b618279f85b2ce4d398fc7dec7776104ec6c220026f4a72603ee6b1e71d34801c4b97517f9196ec89463a7c8c361a586354e031953120e87d4db614df9593a1e63aa604f514fd223d34e4e3e40f3c3f6f2511b98230074170856bb18901c53db4520b9a513aca096d6e128bd82f4fd2d7c47be2844ca4b089872ef91ac8f573e3ffe7d66c324e523849188c1884f1d5538aedca4a42ad55de183931557a2f49837c7f4edb1f7d64a0907a07acd9070e3af0c5f1358b7e07551f5a1043f87eb34a9609826a12bde77c4d87783bbfd4df7ba8d9b254cd0699ede0d11d10c9046412c4e23d4d19cb945f7c9029ccc30c1ec42f611d6a8299b418c937751f0b89b46a5d5738778eb880ae97d03debd472b25aae8f4a6db6e0e3bcaadd1feb6d043891b6eb5cc1f576c7a31629b34f102a3436c28ac62b30f1a3b4673bd85a62486eb8a30648bc8b0330cada6edc4be96f031610c5bf3be9a91eec9e0e778d845ffb0ca8b6cf32d079a4feb25928ecb44bccae5f14316f08a166c288751b1c07f8a42270205b7ce1f600b6bdb60ea016c5d06c1da8493e592d7c14fc62e81bc5993d7984dacad884593d332640a212076796a76372338abfc504e7f085e0184914edc956802260f9701d848bc7d8413f3f5fb78d76b87ea32a5462159db6fc0458dc020574183f6013e33955a6b74b5c8125dae01fefdf970ec27791584f8a5fade961229e6951a7aec744c3233c0b01e93f5e63bd7a1ed7d6e2bec337df3c975aa4fdce0a8735cea4647ce71a91b1d4dce8cad65cacd4f757475c41c8de3a9b741810644ca7e6aaeaf5cf9bd9bf510f0e7b2b61e87abac038b57ce86cbda5f657d9835a4b9dc7ca7c9bf01d1fc5565dd601a63870856f56eebd23bd00fd845ca5ae9f085e92c56d20a08da742366b15a8f948da8ed4490cc57ef7a23cbb699331ee2fd6578d631ca082c1aeec66d3f22e0fede707b9a59f62b4b16325e76d94996bb319befe0a2dbf1299d120e48fe32cbb743d0b36ecfbcc807cbff5b3db730d88b4fd9fe4f4e2a5eb5a5a3d3a53674ab71e65d5fa188ef98653428d246a84f9997e7f23a00069187fc54348534d4fa8bceab36bdb595d02f22dac5afc0e20a79151d88828de35796df94cf93f7c4b3807bcafbf7f446e93b067ddca7cc77c377005f122d2c65de0f4ad9f761a9fbdef37e9fcecf51efdf49e88c87de277955570462a734429df935039f3d19bfe5e24c5df0d55b9f2863c8ef33a519b91db55b32badcbbf4ab98be285a2ec5dedb22a96720c596f3fcf7f13b751840f0c2af8627f0b78414225b0b42cb0ad08ec5010f06710f430caddd603448ce26a71de965d790d687a22ee379ac5aee1136c195109d4277fcfb9c8d5c03bb0f26de50a0d031a35a9b659054667947f084574921a375c15ca49773de2d2aecd40469a587d30d3115faaed9903b4b3f8d13f8c3873adc2c95a457bca0bc32721227f2e92ce9b2cd72469f673118b922671f05cf6092d832c0faf6e5d79e455ff8fb7eb3cac27ba5d95151ca2734f82ba6a8354ec8eb2f423a199dfc3b49c757a878d226ca18779d4ee597fdd42f972c1a00d65be73896533b7d9f009c964127ede93550e2fbe151f14b9ecebe34ec70f6700b8b8178a86607d6fc8ea21013a0e8b7a72f97b3d6e109b219de84abcfff1dae925fc7505575b1f8964ff5beb81173a83f9feeed6e8cddfebc9f9869fc2b8a2693b4f8acc99151d81e916b17eec2d067480988abf14db118dfdda4f99685ab0773984431d5a64969c935d77c6a8eb77842296e23b328e20a67fa31b9b1e52c32e94eed2d2dd405bbebe49392cdd3e93b8813c99eff0bec7f116a463685d2fb96c396b0255d70db7c5101839968aaea8f2cc9653720693a62c2044d6f94a9bd915d00ad66d126172920321b812fe9a653aada303cc70cc1b9c881ef575c310cce0916ef9aa7b522ee3abfcbc35840e17dffccabb305ac35f8d4fcbe6d28681a5f3230417399bbfe2508c2441008cf4005e4973079a116f090bc64d09d1f49f4c2473d32c2f4bcfe1dcea4e22eb14214df29b1d6a6d171d4199217fe80b620014f1396b66bfdbae9cacc319e1a97c744021eb38e60caa3d1cbddf8e269cf0eca89057911ba20d4a67ee411659b4de87f2f9eebfa49ba211eb089265ad61ca3cbf467e6126e5946d16f3069895a401ba92d7d9fd51c1e453f01a462b63469bbaca9a06e0168fff95512bb47ef92f76bf99e98271d12e1dbb77bef81a18072103256877b260819445e2b4e2fef32a6a3dba3064a8cc0673f1b2754e5e0d06ff81a420d792b44b5e2ed42a3a0e5271fc2f57fea738c93f02c97da3d0623e122f6834dade8e9d982d884fd8d2675b51c2b435c30b62f3f48f1aab94b4ca678fee8d4ee8a65ec9cfd994e8d762a8de5aad3c0f31dbd74d57c349644472f3f3e3211ef05d7d78880913bc9ca14b64106c2a0563e2ce7fb72705efc3d993ca8e721996ed03f29a400f09b63273f6a9eff9f12d91d34caa40c87d6a8621cc143375b170a8d064e168287db99941f1c49aaa3970f1f99c87781b5360268889db28e57c137d84898d4da87e13c4fb2ce47fc78f53de7b201753c24f70d7b97460201bf79aee445cdf3ff7f395e4dc411c646c76ea824be5724a3581a9b4e571fe054fb0683ff60a5df2caf577969046e5dd85dc3706fb2030bfef66c5f8a9e2e5cadeec29af8eadcb6b2b3fa4e44dc468e822eb6499771758aea37cdf151285c34d5291869232783fd6654ee423fdab501e620858187630f14f9361121b424540ffa3fafb2e46f47144337389b996ad4e3035144a1292ae2f0361842c31a9930d020dcf84aefa25c5cd097da09a3233573e85294d9353748e5fef1ae33a903d1a1c703683ffb624c3739e0bca7b6ab83a4320d1c475056b0067b9eb808649c38723574c6e5978f8be43113d7a5d01558f0aa693506bdbc20491488b9e942e06a5437959b6c6f3d291fb44ab6828e670e376b8fb8d981213a3e928a30534c4463831d12fb97dddf67a96470c4e31036edd810558f81f0a62cf70383e9c4d8bc0e16ca9f3ab6a781985bbac3e9b5116f9092e3ba85fb87be83e8ce7843c7f48f5d22c4cc5aab10d937cf4effc049b0a7337e72775c73b23465c390dc1b6274f33a79dffc4a0c474298bf973c25c6f9886f85901ee37ba8fbadaaa706215df865496fc3bbe278f7af6242d25dc6927400a792ee097ac5bbec0cc6667af1b57d097f9c559c95dd76d40a8bb31cecea067b9f610c4ccad72854d02e845185958327f14e7ad7f8881a5c6b65d45ab8aa6a9c2b41e726f9879df0b0fbfe3a7242c3a9a8dbd1fc94d2789977329674f15da82e46c09547f0f37150e5e31dd7d492850e5eaa178523e3089bc826e8e84739103aa0d6f5c9e21cf6ffe6d6db3421caeb23ce4b9a519fb3b6f05b6a8e63b754758821d706938dbabd11149a8b35a46a6ca9ae89755a57a0150c86b042693e52b679fc425a48368043576391effa57839dab02f64d1460d7193bafe491ecd60ba41c209e10e86823b99ddec2a8a42036e987ef03a4a09343af7b587490980f5cc320180077d8cb922dbdca552f053f78e434c0347fd00b6da85407d8e8dae1227d80dd7e9759d6b4fae177711c1472881b3e04e7b4649af6a77f2230e72da1f63795398d718b2c99ee9e7073f189d4a029f2a53772377f9b46d34f13cc5aced310d3488a1f27e14765861d3d102ebd74dee0ae5870b4953af4191c7a2414e7c0e53b3400b7c9adecf0e982371a5d3e1ff565cf3ac959dca373021296f80aa23b49a1c1954c5317dd2a23fafa97b5f20ab9e9bfb3eaeb373a08d9b5db23a80920bc24652d9c5eaae1d52cafbfa87bc0e7f3490acf503e742c8c7935f8f8e187646617ec3da9391ce8b842af3b59279d8a5b37408da4d42cfe87e0a1f9e197c8b99f83acac9521cc44c0a07b920d072a22461c100d346fccdf2dc8f5a225315e15886353707db3fae17a40fdf3e21d658e35931d3a772e7f3865836dcb806816febb179ac5380ee6beeb8fbb80461c80a6a23ed159e540f95c1c94a983f2bcd7d8476eec2a235514800b4255aeda354135d11ca101b010aa47edd9688991014dd1e4eebdf0b6f87c6e05c4ba33bb790769ae00e5e270f00f329e7b5955ba54d4f0c294ea38eda72b62cf100fbae8859d138e0f8fba94bcf4a87cc5aa9d3ac080c8a8d83fc642977494d13838662176d102abc19b4eb1824dad345854a8e289a85ddfe537fb53abfbd538e7ac32ce5204764e48644a04a7fb5841d1930d4965302580e617c61057d3537e922a943237e50ae7a13ee986202694491c275358001b890146a2436d264b017420dc92b6d4309379986e12cb5a1f666eb30f316da00d2bb7d9879836d086a6b68bb5e7568ddd10aec72ffa7c790318e80c3cd0cedfdaa143e09540f95ba1c13ca52aabdd2405cac90cb492b015c4c065fb071d906b9a6a99f073a98c79da1594a04e736b8821039f948fdfaa16efc3d7414827cfc38e7175646f29e473242396fc1ada6c9cd09588cd7d0805ade6a908a409569da5f29f2668609e0a9231839b2a8925477287f725b484caa18070a6144dbe906059c90bdac38d36754d7c074adfef65a0fbd81e03cb27f71f286f95e0f11bd47a29f685b920d609d73ef327713d78d1d487470949e76e5cb23e3f01f208d48d92f0155e563f14c8a553b8fb23d3653c7207489a084861e82673e0498b983f9b4fdac27708df39329b4c5b02d525f010f2dddc599d6a039b277440b8bf143e4c15787469fb7d12a48cab92fafb1990f7d968b46a7a8e33cdd4571c5923b278b8b0d52c4f9731bb890f5bfec202f3b59a5d7317044a337f7b070da2426b9fae672101a98185180eb924cd937fc2c7636fb2f6193f89eb015ef66a37b05cbe4c8d37838d6df761065189df23abe5aba1c14e04ad1e965ff0bba9c53ef028ae68fe7c8d4bb479c9f2effff7182acf0b3ac54bd1521f78d86c1b766ea30f216dd82b46555af70b948c83922ab35a7d32b7d9c730b6c81abbf1e8b57987ee90d5e2d69760902f5ff11188641dbb2e25d7817f86b412bcb5240522f98e0c77ced627e72f0c136e40946ac8cc82b3291d4b3f51c7ca813f038f55bae8f2d92cffbc098941b69da339d509387c213403413f88df738591cedefb16272b21a613aa60be992eda98e9d5dd7ac606fdbf11b1044c0ff9d6c919b626dea2aba576436593fa2d93d55fa29229ecb572ad9ed9465febe49362640c5f3783104e3d6535ebf09a916d6d0bcc60606d05412623645ac91f5031a9bb6e6731be27a931d4e070cee67f188a7b302349ec9ae1e60fa254224f4628c906c0b9bed8d9ae62d3880997d2a89e830d4870b85f0f518206ca3c1acb846c7e8f6588107d05bfb744c343330d5ee7f6059c94b58dc0ca384375abf324314b3103d58cbea484bf196bf350f0c56f99e81a8e3004032ad08c0716f0a256c6ddccfb1b71dedc23af0dff97c05dc043fbf79bfe4cd2cdd7cfb9391dd88e6d3adc9303f303aed0d768dd12fd959bedd94998db1e4dea3eb0004cbb213d8614a628178888ed0dd64eb58b291e0dc40e682955bc7f1e4cd348087bc0250c2a3bcaed102422025718e4fec4984190f8aef2398874ea5f1b601581a62147d24b3f16551383e46a50bff9e2825ec1fef8820c641936dc1fb9fa28393b07afa6c036b66e9dd4acbdbe382a9b855ffee1e0faed573b27d64a75854afef0fad4f5a1518900082e917fa9a0e8babc88e9d3af9b1d82d0acd776831ea64f54d5dcc0781a4221387679096790440d06dbd21914fcd42aad675293a89aa98b0169fff9803c9b56ec1242539c62512319e0962b4dc548d9547d8085d94e75879b0710916be332d960a98f964a4c14c060696387a08030b9e8e944f4c4282573ba9d779f1fcce4062a6cce7dd9cacaae3376e223bb38d1cabc6992856e0b09334f8c94764afb78726ecb469f98f477fe1547d7b6cceb005e003fc8ee130acf14f67d4b55189da23b7346098b459d41dc438b1b35994d224c5183f9ffbbbaf1054c78018f7704c3cbb9d37fcc6f09b816425698f7bc2cb5ae2c2480387be55523e1713d0e2fc64841069d2dd37118e2149cfb27c28a7fb27dbd60cd0f5a3b34861d5addc60e755c0cc9db5b12b5b7c673347a36ac420e63e4b67045b397321b2563b50adebc5e75e9c039ec9bd5d8d5dce162eca3b3c844fbf804847adf16153ae31ab713bd222f6642aadaa102757ed091204302a08370986ae2821ec4b441c810e69091845056d16c1c5d87d9fa71aac0286a4d1d7b7b440caa7ec783a38516faf61a2e47c96d6c1d7275334f4886176e27709af1cd09b9e08330c60392181ca27adf31834e6b8851dc9397df70e9a88d3f4e7288dc8e82571460a2679fa52cb2755b0254ca0a85ea59db58fb5283a44ec3246bb024445e22d10a09aae4de1e0552a3a01efe4bb8e6de01bab0ea1a0d7051c2675af92ee6ba84be1ed7593f4bd8c30957e30db8b524963059b1550d405b2695cd458c15f38da3b10555712625511b8344c4fa287a8507bf3e2a0b1d8d4c5564486ef72a6371ab9f28cbfed6c634fafc8e5a64322709a582c935e34589dd2e3c91e95eb08af8dcfc06a739218105fd4df3976e2c184eb8590464252726ec4af1457d608227dd0faaf8bbeb0c60840139ea919285b0d93c35718c8a2a97e071263f5e4993da755b6dc3d74fbf61562702f588cea3024eeb569d184e26052a244e13ad74b51defb2f2db2fc74abbb841717f2c462acbdac62d8d33737a5e60468afc66048bb68db98b966ec8515f3cfbbea72ec9c98d149625632e22ad19cdcffc1ade004a9856c43fadad0cd659f32296b397c758c4722a0ec6af6bc92fa0880a6d42b0a58a9945831864f7cba58cbbdd204bb47a396fc3e169efd337e2c542caa99aa8e08d2411245e122e1808d104982c505a39b492bdda06eec0d501b8a5b7a2290ae976a67be2803b336e021b87487cc86a1b89d9e47d98e35ede2e694b4276c2132efd494a118d88cb5a3a62cc89cae83a50348428a3fbad3d5e9fdf9c441152c55aaa527a8fd5f0100baaf144717857dc6564a6ac797633281c88ec43508806328ddffb42ddf8b5e33e6479419934821148fef6d933d563289dfca88b83f05ed87b96549bd364c420885229547e91f6e683cba98d8dbdf72308dd1ed341888517a402157ed1168c42d16acf0fcd433fbbf8d1377a633e78d8459f22f01f9869a23793ef70688238193692399f2158ca24a8438d925dea67bfbb94c502ebe7aed8cadb25dfdae7e2c0c40c7531a768f79636ddcbb28e5e22e5c86c253c1188d3998fe4eccfd9f14466062374b110ab5a64f265096a41c83c9ef498cf387500e1e3034c5425d7dd43e62c0e561e1b52b75e56e4dcaaa8f9d0a394ed0b565a26104a6373221d94cd476eebc02bf85fc45dc9ecb080aa8a4acfaa28c97338de04f2b6c78efe297426d4ec1996e2d16e11a5761dcc4083f2f113840f0a736baa7440a04b9789c6495e777ee904db7d745497683241e8c54d661f0a30c85827d81be5f4c7ad5a8d7541c42441d492dc097d05e9e1223910bc9268d847dd415b05a401601fbc05f31803e6811a6aa2cd418c662832f78004e8970e5819eeae327580229bc5684a2a7be55eadeb80fc401f1241a8d004388dc4c64ac494a159cc716176041b89f63462bcea8eaa37ce0760f0c85ce3e254d73910dcc36592c6e9fac46fb5a018f1028c52b0e97c3e816080936a52493fbe57624604f8b405b2c244ec8ade28edbab044ae29c7f44b32d1c5b627753f2136428cf76f6ce6bbaab2ee9a4854f51add805694ad950d9e769869d7f0e8bd5f0913f71c7c45fab8601c34de0b6446a0c27f1d03826c22f284ee0f7d769c41dda8e07f8185b205c2ee3867d72fad2633048e93c325e82e8451e3207800e28926852def012a2890b40f88081238d7b35da23cb19a578d96ceea398ffe2d4f0129f7ac268fa24cca910582fee3780a1f066233b47cfacf7352f67c280b7320603e4306739cff7c222d733a53707ba2379f03aa05ffed61df8cdd1c47b24db05ba6cb0af27030cfe303b348556cbc89c4e8c6f6caace8a03f29c6976d9fd781b8ee6d37ba8e652f94c7e15c0fee359b4c32c9112ec446a124624c6e1c6634aecdf6da1b80953fefa705bacc994dff410fc56c6d64c046edae42c14a85bec67838252f6b9d580a8980291b6ae148ef99e103c733a9b1514f5a06edf21d8491ed071a5d87b452495ede2f31331bb49ec3a276f2c67eb75cd4f33bcf075c90d426e3c321d0a5872a3e15861e167b9c08a1672a6ff5c5718c6effbd4365e0cefb6f4b356fcbb21677197ded6da29ca7bea3af1c6de6abb9edcfb37511815d9faac92607959077aa398abe1c8db037635ec2fd011f4ae206d5c95786108dbbcc55860039236bff750357914864d48b0182c5ce34f0731bd868d3f2310e896f696f071295d4a0235c84ac64bb7114e815d52245db7d86194deb3774f987b1a129f5005c768e34a838dc76d5ce793dc6894b878be0954ecc00fb60bfa2d8097512ab79a8cac3bd2785bb3e20b7f60fc61d6a2480102d0e2eff2d34e4e3a7b05e47d8ffd575e1f2cb735a8af77f010b25e8391dbd39971dad8fd3dc1141ba15d633698a135a39ac9f83c70b47c22fe61a7ce5367a5c508bb28823c724a3610c59f2d169467a8b454a212eadb33785efb30299998748621009c9c46bb10608d7750a95d88c9d7f5224c3bb2c7888dc0b316822efd8b3f8c995dd8b360e8866f94c1234e83c098408765bc97fc8306113e1bd507412b88eadeb0082ad2434d333c976330e493635fe1670e895dcb6371915de82975d24862433d669263739c922b0e46f80ea1ca7a30f72c4ddda9fd9e34f0e1b28cac4daa76ea201e4ff05fc0b45d0c4e867b23e7c9b55cf3a0125e0d93fc91a84ce040a42087d502ab636fbe0c9fbdf64e9c262928b9d461c0d76084627664b9af8a105195cca6fafc69093d7438bf2b5c67a78c278809246d8711efa9830b2c4bc4d46c1560b2e1720f9ac77469b9c491a75f730411664881b8560ba4eca885426d73c062aed93699bd51e91f50203bbe8fa7007a96d618038ff0995a1107ab2699e32953ef6d261bd084c841966512d88803822ff1160ee9e6823ac91298c6c2dfbfeb8a3aa0b8f199cceb6e145569cd4c652291cfed79dacd7b6de2f1e06e195088a358002db2dc00b35b05d3aa2898f052674b0eead6b740e7c196aa862a18209afa55f60a83299dffca59d162016f44b98da69bdda9368a83c504d0d19fb59c9b6a99ae7998b87bdf3bb3008acad44cb1631ad44d403b0c6d205c5fdbcb28c91ad506edca16837b28ea0357ac6ea984574afd27a3c1a17a2f0be46c4690dc5eabd1dcd68c2b6c2b9f7a351bd5d94e8de3ef0c354b77cf72e4b3a7b1d04bf8ead17bc26ee2e2112c507147d02642b0f420a5dc93ad9dbf0595835341c8d66fe109732febada1049ba591f01653828e448951b16a51d3c0683fdc53ce336303844442963961d8206afc3c4398fcbe16787f3f01e0b66b808fdf4d726d1aaf13bcfec01eae7cf6960ec5840874e6308ae520bc6bb00c21bb4193cb72b61f419c45afe9db630c19b70adf60fbff8917f70b51bb7b6342b8c42e6a6e795720d0c6001c00df26f1bbe8d46f5a79f1f2e84e1ffbb3aaac99d629de61abde1ccd61a23d26def70836521f2f78e6b283cae4b0914b1c7b93d5ad3f96dae69a8a6eb2618019035219f75ec62f2e2e4ade826d0c8c4aee0d7d6cd74b584b27ceb3d6e153008c1ffeea18617a2c550a80d730c89b178437da9188020c345b7f842eb72b8c112d0d22fa845b8402d4d4f7272d6d0ec6ed1bb0c1bf962a922b786625dd7b0972b0ecdefdaa8d72cb09372c2c223adc97f007172c848366b460de45fc04d07bc7fd46494588456400d7f93551333fa697a13ec2188279369141d217290559c0ea86dd68a35423b997e62481d38ecfeae35c8b597fa500916448fe9c821e89e5a73b57df24f27524f3d374e5213c7f5f853c7cda1235c1b6d55292c9c6ab3a68c549034639b3f36a0fbbc56faa3dd1262741b0a6655383f04fd6b1dfbf773e9ba2f9ec238c827f4680df2781e6d14e4bf11bc309bd6ac424e06716cc8bea5958b2b148b620014e1d99ef8e942ab79cc9c8daf176b1cb580781109808eb2e69e880927b265cea710b034ca762ad61548ca2582dd394593425dbb49cacf916dfa390dd503e561b320e12b9a66311ad7c9ce2dabf0cebebcb21e3b8bca08a20e862b80fbb6c688354d3a7bef79360cda56d42b48652f303fd6368bf090528343ce33c950a33649614c75749c2bb213e218868e2c445b6c9c9345b51a6a10cfb5f5050f28e01775b3252254e09fa3fb7d9957cb5509956743f04dca34de4299cf77eac386ca16ee2043e533d5fe21cf422df1624ccb067381d5e6dba9c656c5751bb0d08cdcc012a9c06cc149a393fecda45da8ac68f183379c48aff1951400a0388c56de749b36c0bb8d98571b777ae5c5f81cf67be5e074c381c8c31431fb8f5fe0f9e5c82801d2286d1b189b4423ef3ab4c91241a9945854ec79f04f5a94a06d479cff0e52f2a3914c8a28f0929e6c58fc26b03cc25da1701188bfff0b952b7bf947808f4e5f008786d17729aee64baa7213f4d8a39e09144128d15a4cc45e0b66d939990fe88311f0ab5c4a478cb14a6a3924107e99c6cf53e8cbf2b4a60ca17fe7068daa53d2bc19767f34f70125b1964e2929c71d496a63f55c15f96b8d18f13f1fe8633af480094a8dca68be798ce32c028aa50539fc0a11d4e847623662753eaeef37de38446311d6053f5d6105ed972448e0e2bef23e8f2bd9397663cf1620d14dd53c82657704de81e243e463c7b984710bd0ecd192e4d60deaaa0aea7803cde14c7255da71752c80feb40310c298c22561b955b56a9095a49d432b9054423d6b82dd9e210cc47db2ca146fab29959507d2a9a8317887d7ab9d49d5b61863de7af8cfd80d90363d37ef99daaa0c774783891ccdbb1cbd6f5a79da2d9f3baeb4801d841b381b2416f6905a74175b8bb9824b51b23008c913006e251b50750c9b46f5e44bf4f8586affffad7c33cc5f589ac5f82d88dd236604a8aefb0dc518acefe0c0d5319dc2a4af572c4c9c7426232639424d6e1dae6b3660fb40ec9b9f8503de2752a2866895f5854870b80e4215f2ddb0621d8c6b782460984220befd9a473c07a14bf477cc5ee1f97735e0e2fee029fd2c4a3d8bef0b44c7ab3468c34a943c028f699ec29f354158b34be5daf55da78800255e3b343d524afff2dfa3e84449b7d76d5fdb0c18e140d8a6dfd84fdd8b1f1836a4301cf3be770edbb844bf2186ab532b773bfaa6dcd435ab67165c098a8a90331f30b00cc5423f7b6fc83d6a68123124c0bc380338e1772fef71b024077c2e9a0a6d3f3872dd7f2c550a7cdf79d74c95731aeeb1ab5cb6dfcf46e02cc3ac20ca55d32f60dac32052d348f7ef14a49dd4f28b81cd9d0ac3d2a63f913301a936755afd85d5c9342da9831f8f0e997f8a95717d169aeec3cc9fe0b38c35024ae2818bf74b44760212208184d8e2c6ad0400543807a38a204b8a011511a733d8f75f285d7cfd6fbe48ae503a860b44d9c7221d9cc0181e4890fd7858a048f8c65ba9fd025ba629c54800638da301e640e45619af432f4b13b350311f345b4a347240c8a17252b2e66c55146dd9182a213007f19fdc4c017125700ee961c26e4a6234f50aaed37be63caa459f7ca4c0f55f7f114e1ef18db8fd6ee9be9f89a1cdbbcb0c8131ce1354cb1109191a5e7142469180c94d8a4308d3b0176c2b21eb0fbd49ea270d14df5b1faa83acab86630ab848e8c1834eff892bb98c1401cf977f5cf41a107fde4e737cf1dde5cc8e38ffb18256b85920f5c9755faa4278bea98e8015757d84ddd0c32817a701cc677f865e739a4c08ed3213a430ba780cc3b1ce7a881db10340c4ea13f6e5c3c24427133bac89b8fd5ae64f2c93e688883e8b8b73f53366a06d8e58673f0f4a20b6aec4122e296d5cc402822690dcc339884045cb82ff5e7baf132f83e402fb039a94d22473349582e2eef3a139249a3558f317013b711319867d59b462b4d7d5d14765ef87ac1a0569487137b1fe5baa0561d0e3cd4c8af49ce63737c82f0a2f53c56d3add347e7482262b73c23aaef878c61999b4f6ca27e6104c383348004eea3792c32c8fc4433a5419b5c0ae0179ac3c81b231520009dce70c7271628a7b97eaf2f3d2f9c30094072c310199d9ccc9dcd7bd91472e1de7dc962ad1af03b8b916bb9ccf56f2f7563932c3218f858424e8e871457699fef2839a9c966c806955057b99e700dd24af870511019322fd28b9a544abec4bd0c91b43466baa3ecb9e939d09f0a0c9236f9896591fc8248ed7072048704716484f6e4f1fe3860dbcfbce0f9a9f8fd737fca90ae967959ab6cb727ced3860803b01fcc6b7cdc8750a175cbd43fa59a19abdf2859193219172e38e11d9549344e84adf887a38f72369610e0424ea63aae8dfa957ec845304ae45b118df8b4db194fb13d47c255c93d33a75d8ca3a54a60a7da4fedb14527365a1b3c453e348e7be1d239e46935fa1cec99fab3aac1d293ae60ed2d081b38b9969c4c63db575f84b086fafd676c84738528279d7edc0a0e525d9834793740590822b33da6db1d985c6d24d901c7077e31ef190a8a07fbb013ef25ffb8dc44b6b32580e0830edad462a50dce68cafbfc6f3ee20dc6e6e73c3e121c707880e119cc1b2d21554a45634220d09dcd239a08eeea36f1607018248c211e60ffdd046a3d59e7d36f1d62314aa97afc412db6e5e21dd37d94fc89e7d1a09d612fee999254cd47912a14aa6bbe566300b17cffd01e54126f4a9e2d76a1f80092e41b919990c0486c14f96303f0bf6f3a5fb2934803bf76dd82eb8839bebfa8051e0161d8565683b4ece88ab6d6e26ca227b3dad1ff052205e14ad1b0a84730f7bb712c01b2f07d895a42c3a21a54626984504e294204b2f1caa938f0bedb8e711943d802847e65864ff1989cd99c3a734327945381bee022fa8d4388d225d9a14c08e10f2bddfca51d608afb185f671970c29913a5ea33d013ff13b27a5b9a6ea6b34d4166689285a4a2c25bc64d0e0243be47c20cbf4240e6bdac8ae61cc7f46075107ccead59182c9923c82a5d99911817e51c1afe6739f21e3b752824ec7889beaaa51fe50512a173b68a37e7865ecf112ec0b9bae84ffcc1d06d06512bd078df64ffa547a3ff53d79ac0cd360eb6fa5d9757a97cbe171d8dfbb035e32f575306a83dfa04db2749ee6f64fb8f1a74fd63a749f2cdc74e22b36a58f0ad33bea8abc91ec07546ece3569f51f545f4d692734b5c75939c7d6a03b54e53390ed344cf9178d42ece187d48633c6fab4ee8c4dce4c8610a29358c3b64453ecc3643f0eda402f92513af5e779fdd7280ba8a6462837b44ccbc4e887da2d3b8080164193a24fe8d094ea12f5df26908a3b0b4f12afd97b13282b230243b9983d91a3fbb399da7461d4ece4850c5c3cc9dc2cd8071bf1e5810a727bf836a5816cf0e4d74f2c3e7a4f5173f295262c01a5e7b43e855a8bb468e3807b7e2a6fb9a8161f943a2acfb40918b77ddd570da94af992e387acd1830b35149311e629f08dabf93ff637d6a7548c29e302e99b09744c2eb0a448411a084546bec75b0b16412ec9caed4398f78c6eef035acf9343403016092978770187148914818921f9c75eb72564ad0b9232e903bc4519ca4f4df588fa68d51327c3d8bd7ce0cf3a24a9e542c63fd32c892846539d135a4206c04eaeac4df0b0ddc807a31f230def0a72352d9192b42ded645af59ecb235adccfc0e06df21a4c458f9bec54b057c660080d4168fcf2d4bcf7bc59ed73092a39e7a61c422837bac805e05ac2f50b77138e501700928f40b2c19c722cad8976045dc0d49e739fdccd4c40bf8b52ea2a6295e8ffddb1347c1a91d6593d14730ef2ab7f88c7ccade17314c7397cb3c2b558a5c513c5e06a7226cd152f964709a212be74add806335b83c9f75b8805e12dc7d39e164a3633eda5ce61856b9f497dac4ce6dfece03d47f389507f6bc81f38aab069174b50a97a1aa55dfe3f3fd96738c982f21eb25ec3411164ef6057b45e3e8ff9acbd60e5a109fab4e6c7d26040a65e92d266674c0bd210e18332254a95d4c3e63c8e7f8846a6edf11d540721aebd07c7980d5b2688346ea825a08fef55260d63b1c1f41350cac52be87c777971f9761e11848d7b5ba135ffbfdac9f84f803efc1d1387a520e1c4ce01db800c10cc9d888111f77a914af5d000bfb66ab232c2c141589fd9f8402f099ba53982dc09508aa5d96a1e71d6fef510ea63358e95696aa28d5798bfeb6a1424ef272305457dc763a2f6f0436a43198a9d48217229534404dc34b09483466b1f4e0dfa9815d48b2ea9b886adf9e6b1b3d70bb9b06ab9e3b3190988ce282b566a834aac1fbe3d3099fb7666983e009393f7a9f9850dac05aec8e0182302d44d442bdb948e674508aeb3f70060e7ebbe648abf1919a400a6073ab95605818c0133db65f4a5488cd83ca1b977400b8ba037c98bf4b95658e51bf4529df4f96540358492672d579888213ff2f62b092d89690ff637a93133b17c34c14b96699d9b36ad9c331d30c94fbb3b9403d9d50fbdb96044c0c94613e70da0bf88f0076e4e4dbfac44f9f69dcc8891d48576ecc92d9269963c79f9b86ca22069e6a4e76e92ea5b39c464f7b14eb4aa021be736cb26351380d919629f4bc41d45d1f62ff4c0ef270f52d03b94dff4c9dac4dbfb656f6157f66e9efb65d9da59f09c721bd60e7fbad4a60c9c3b26cad5ec7eda44b426df6635b635e6af58ba668895a4cd7937774a1065b576f1a73a141a623a091e9488a8e9853b451322ec15c80ba790766f0a40961558fa36ac69d4de359b34f71cc39dbcb452b72c7d0088e40c9e03b419393dcb9a9e57e255aeb893789be758d35dc01aba94db11d6ebad0f219b284a384fce58fcfb725f41f485f4b40af924eb7bb5d2eefd85d8ff68e13fdfc4ce8265079ea6b04a42c209924b9d56487f8da35f2193f7fcef015ee7cf7a18433b0f49903887659642db87ca7ab938ba9faf3d141d9608dd80444cfec9fd6f1cd82de76abec1032bc922fa71e0f4f3513f559bf19409c92a1156d2cfccca3785b345d6674a0b51957476c870d4ea4a02ba319a0a5f355ee24b360d1d91597693340cd8a2ace68c6213b962b72a18776f02738e660be7dd71b3244b853581c4d48db273ba228e8235c0ca5eb07f56605d759761c8b22725b97320197c7b4c70b664bccd54babdb9a31a36066a858bcf83398387614204a771be30dbf2b50d89a04e2a30d4abb3516bfbf2defa2c4c46327e1a8eed61940752f21beca0807cc3c225bc4dfff3044c8556c532fcadc090432a83d6fd94e968d4fc2f1974b8b03813d3921f046a73773e33bb19c08ce29f9efcb61a9978c2f3eb381c1e249fc0c42b07e7c8ad17e17093018e594f3765a0fa12a0b9623da0a25de35bdbccfefff5717b54731c263ab9ef2329805034281a4bc40641890becc1e55857b44c3e449aa4d77d4cf2d4bc7a95370e764c9c028fda44a6b36cc2194378792ce081a423f9404995576b96a104e08c2de75dbf0520a5abd65ddb09de4741becb6a35cae49a6f9879bc77c207e65e7a66f5425175b3613f69156cfef6f917b0fad65cdac278cb36fbd721f3fe6d46acd7c3187495fbb166fbcfa22232a4cd2b5aff502cf5b54cc3270624141bdae4371d72b34ef6a20a33ab52237403c4ed1a1f8493336432be389c4909ba4c2a82427eaaa213f8894b0ee8ae0e8517a668eba7ee9bab2270591ee0fa9883bd33bd1e39892200fa15e86be610188ace3831c112013374822c452115101f8cc0e712d69cde35539e89b14bdae9fdfd781c5c57d1ebda11dbb1304cd13bbd25286e92e28675fa28efa56ecd75fd685c4a1d66afb5d30eebddaeab2a521e735bb9a120646826993746c13169837e3bda4c8ca6dc448d250edbf2596278e83514f6a0e5c90d2849f31e9f0f7a33d47568e3eae857af079fc9d19eaf810c4bbd40c02f005a09f84d11a9a0dff6248de3d1e226cc22ebce81ceb8ca0ce97d24514fec31047570b5d8082f7babdf20f856fe9ba68fbc782b879e222691e55218a4e916d3550fa8ba056f04dfe3df00f7e22577e4175028c5db6022ee6f264ff1aadbb9bec2dcb7dbd0bddff56508edf6bbb2d08b7a0385374c53bdb88f5739433b97919f91c8fb18a20b769ded9b7c1363d3c9855c6e6b57ae55ac8962d1fa2956e26e12cbce2882946b190010039517f031f6c66fb817dec4743a4c20be81bc91de2b4edf56f9e8368dfa8822f3eec6981c2968dc941ffe55afdd20db3398aeb7514bb5d52d8435bf1b5d2df23937942e79218e4438b5d8740a2bf5215c062262129d5edf7c4cfc4b0d878922f9c58f5a64bd4110bf1232b16f147a2d28f7720f8dfd4ce8510eed74872c0e01d562765a255178934bd89c24a0ed5a933871f1d018ef714927ee64efed61525d48c97919c3e8eb81f07a31430c94273690688c3a17c5880b668fc04ae8f560e9517f9f97f72c98061a1c72fdcf3a0f495bc031ee2893a3a370ebc294141162936397d8d6ac840399b55788df894e756499833377149858f9ff6645df35529cc1a1c1af0b538a2c5322b58753c6198c0aedc18dc7dc53f930a7fd44419d1564669ead60ca70ddcb0a7547fdba9ff95935e0bbb52d405cccb1124c945a3fe46e3c58f71744dab5b1784234e9f684b56e0d44a35901699f838359b2ed9cd3a955434aa0387b44e063bfbd3378f813ac62a4e848d46b693deb1098455ee47ad969c9cc54102947468f8c98133b8fad7aa3370daf83f3bd71bb512e59447c717f6cdec43cb238aa3b976debaed53220f61a01d810d795062f64db45fccc056b952278e9123ad64e7f4bb5a76fdef7dadb8501020b731e7f6278aa41b8a807adf58c2fe7d60553641ed6fef0a1342894d32bb7d49435c529de1172f6b99cc27aac0c288e74f67d6a74c9fddfff869c4427ae6442e265d1875e69364ea15d55762e473f5214111515d40adcc5ca551e1919196317c7833c02447b276d6496eeeec8a319dd5182ad2bf53aa9a0a8442ce1826fd11b01c91bd8fbf5d47136066e3ce5954241448c4485ab0108283a53889b4a4870343a50c167aad8de884cbfb6211367bece5892c1e748ac8ce7d7511dcbb02fc61fa0f32626df635218ca133060c5c9f589b7013e8da4789816730fa8a5ffe99ebbebabab7709117d71e78f7029247698dca4c436a97bc9a6bb08bb10c761990e9cf214444646c75d966d634d6b15a52500b71261bfa584d342172698afc620bab8b848effc806a9b38a9dcd78ab8fddb1c8b16adf5a522a7c78d37750a57d92c664f3880f11ce8ef150be5d8a6ab657c3aed52f6c5c5155d4f80a58d544a5dd17bffe71db0a8833d6d7161c12d4b538ef91e410a92a9be572cb7008d0011019282b87c606d190e7ff80a600d422a4a59af282ce645fd370e576ba20b411e8ebd549449c8056ca3c8c436b1259aac7972fe222043c457694b0085b463b2d5b9a3631d3819284f6a200268ccbb32ecf6062c39df882504115d1d1b85fe97e40f9905d1c1062d613a25635b3e40f400893eeb4511893649c66ae7953aaa135cf27d118df913f62b417938264175fb4434fc0dc254c26707ef483542048d9d9c7570e382f33876480836c3b9f138654aea20ddbea1948cc0d6e1322fd576ca40935628c8c9a99f45a9748984438bb8c4bf8ecb28645a8e4d82d633813f53a40a013d4bf4628c2e57572326291b203842a2b2bec785d61682ca5b06d16e9135d5f7e9371bd57cd5240717846ac5407519634ce158256b674cb3671d0381cdd22502413087942d13cebe41f0354580b9bf32dbfae8850613fcbb49392df5d0bf24f250adb1ee5f24246a9e658dddf621d3965a2cf8dbb561bcfedf0760e47ad34ab60fe9b16f2dd888d518b40844efde00e170d52184a61d7ae6e29ceeede959ac7e0b18a02caf42fbd9ed0e6152d2957656e69c974758d0316cfc88c4ec63ccc09218407833dc715a9630fea491f122e2440122f3e1fc339a9d85b36a788fb465ede77b51eb7f5d333f4f2d54e42548c6a44893233f0e132f9e503a4bc3f1dc8cbe17b2139cfea6abe2df34a2197315adf8bd7769d9548aae05c94eb791050deba8a1caa490f5205d806821322be9c1a47f6ea7286c940d181085b2621a537f3d8386fae719f913e92f3684034a8b4522f9e1799e35f8a51429e2fa5fefbe27a8ba883feab529a3467efa1d46e5503c27ed02eae43f1773f4a5302f7f1a8aad1c46b0edfb8fdbcff6a3c541d5c5f3d1d5ca6fa5568ee500251336866b8674b5007adda86b6c8b411fd67f172b3feed0fb9484d04a31445701a34a34910dfa1d4f6d6b022c47f8a71fdc7c66a6a265387832b220d2879f9d17f7037da52a43906ad3280d5f8518afc76b0f1a9794f9e0597276a511a6c575d1907b0cec213534b0932a6b2e08d018163cca41166a58864a839d02b948a299a9015aee4c81dd9afc84f3dbb384cda9ea746e003468a5cce8d110172c83022bc9661861e4ee0b1f305c5d6577f8a83432f347cc5ff8ecc282dd4d2137b39ba80d0a1534c58021f8d8ee6333af62488e39d412fdabad7b83bebce5f42094c6e2101c9ec35b0b32423737e2480d12def77571873876ae769d5fcecef91c1631c533dbdb0918b1e2b5963eba88d55caf1f320b8c23c794a4ea3bc88c163d40749637efd9efc52c053495db559b4e8c7cf547918215dfad4812c94a5fa4553227584bb30b2d9cbc0cabb88d38a0c4b572a3392b1e5db23dc49b7636079e0c293abf9fa46ea9c745f6742b19c796ecc90a7b8173843d299246260c4edf44a3ad2211299a131410d5e99a51829992e8a78e92c332a089ed32ec167696e449b5f522578db72d4db0cad38ffe8609846392c6a415061d555cd0e186287ffbaff5653c47164db7f776dc82e1377c190a6112295e41f4285c266c4dc81e8d7d59bdec8515b04a42a9b388c484b5b30712dd227f961edf7308e0b43d419b632eb5a19109d22f7f908d10b9d19617a53c09285c8e29cd080150bdd16dc5e597675c4faca27602d18169abb92e7bcf25f45382ae2851c5a1f3f761186e7f4bda5b6e17709388e295b27304f6e1d50517299d5f99df6f2f1544921e766c157d66ea45079475a430815452dd9cebd33d1940092bf3c194516d3df4e172e314412c2696a7742993cfeb6f7f17dc2e4df5ed0f11a7a393e45098028553ec0c3a5ce1049ff2f548bc978c6940edc5600e94223565d483befbc52e57661f69c34f58b5a45834743b81e630d5586275527d4b199a232569c30cdfc9bbf1b4d92bf88f1055f1f2b90d4d4172fc1e976bae5380c1a089464e1f5109bb9ce1ef647995416520c1b19b9e100dfd3f2bdb4854f387d0df8dc67eac76d53ba39876772b379b04324287557a372bc1b8748d13955365273fba68de7fa8b2a85241a5afdecaf1758ea5da035fad129c637c065a0f1a335adde857c1d84075c8d9576679d3134256de02de559ab3556bc422a1594d274590d6cd69da6b8c7bcf683232a608d0531107235425aef4d4ac75fb2c519809ce7449b2ed700548b6e872041aee8138cd06f78cc29c7c379e2a6a59ff056f9ac2557043a5144f45b4196fc0c82b795dd180d09e7648347047feeaf6cbea8928e9d512b1287cc876ac503a8ec41acbbd08c278eb9f993a202ff75f72f220f4059a71d0214bed55a035c9587183a5cd1ed838f5e99474a8650c4a9c7292d8a44f860b44981ef2d7090da0304fb1ca75a43a24e043a237bdf186cb857af9df154c6ef911f328fd5a272b09f886a988365e8ab2dc30c07bb480138c4ec911538271b55d2f4986b9dd6e117ce7bf7bc1e93993cbce528ec4ad5568dbabb82161205adacb7647c43774e008d1efa188f5db212a37517808bf2aa33e9a270c47895bb9e4005afd511ddba5c09dd24e2eca0452ba1b89541fda61d4fd03519c1234b285861011e49665be32360bcb89e33ae09ffa148f8a2fe2f3f7abcb34d0e816aa458bc7881f005ba10b2342e8ba9c742eccfe79d92eab191b836e39dd64daf171d9836aa4068d6077b644b4bbb2c4b29edd760f446cf117a46349749449a5495c04ec4479dcf1169d6df0daa7580220d1e98755001d51a9b93b155efbae1eac7aab38f7a6aca5b0bfbe750d30c4423d8306f43f3775f24df3561da357874508779acc8f78dae00369d8d582453513dd20d58fe716da82c11cbcb1bf4402ad5653abd96e6b36db5840ea3d6a5f3b55d8c4544cf701fed676f83bbbe99beb46b4afb2b4cdd872e944b4fb164fb13fe3ba70b7826365bcc56ae6e9590cd86f656edddb0adb9ac7ed55bba67146428851c9c05a7d2b6674ea657ce79ce8959c82dd2409eee47c07afa68d20227612bd69d1679a9bcfa7d3e99e1c5b724f267a5d81a031d2d46401270359e69a12e651037debc00a35ce2d8497601cb437c1bc06d0a26bf2ea3856586fa76ceda980ce5df1ea8ce64e85820d4a8378404c2f4446bef15998577d4f48d7c84eb314a649c0b9c179f66d61c00cbec5b76021ad56a3a5d9443387eae32e8607b75db3026f741bbfe2f7137e330dae19a2e50bf5ee07cb3dd914ec6ebc5b343337fd36f5e1ef0c84fc972dfd6d6a5be0f28b871a01bb1ad450c3b5beee3547ecaf1df75ac24ba294a63f96cf6d953775ad98d443fc41168b355b1e19e46ce65e8e652616b7e3702db8840f07ead965b412e242f00ad8b2ea739209d01c0cbb9febccd6c495dc4be21c3c70eb8526882704641af47852374c24b387f0ce1ae84e28541b0d064958ef90363e899bfc5b828543c809dd7b3a25ae35208f3062156d55cc7d2481ed47b73e8c2df234bdf8fb651178f1e2d3c99197a9bc1d81bdae497db419e9e52be6028db83d56936f546b8919ee65b954b0e18236820a02c197d9bdfc3c334a61727300cfe4fa63405c9e6d654ae547a9074d42b9c9f5043b51577a7870c6351e56f9e23048964689985c7c4678288bb84eb1be86cdf116a086d90a6a5e034be9820c9d2fe13a4d9eb1bcc75e2b8e41ddf9842f3af9ad26faa99abeda4f925b79cd14ca869bae8e55db55216fbad5471e3376fa28722abb248a3541558b6f7b943058eb47acb8887d0d9e673e110a75e67238d39c075d6c4ad505ef1c99ba9c00490b7ee58552861a549e36a4d20eefc829bfc189321e6d1ce253c871672750843ba5fbdf331d209d8b558d78468cf85021c3e51566b0dd4e7e4475c605317b57526efde2aad09bb1e070568f5ee2f5a5666c790808e6b88ebe6d50b906d0183de98560ca4219c8e6af5b6940ec663f7914d8c7868b814e91026b87d82369eb685c20af0d329eca6ba4dd21cfc3aa37ac3966935e7880caa9346d8395086dfd804b7640193efdc05da9e57651d3012951aa6bece6e6f6fb187090f42da662028a80b1129bb1885b4ad496fa3f359fbef8dc159a71326d3d27986356bd27cfe0f019190494b0013a4c2d4c5940ca1cae032f9e0a8c224129d242e85577dab093c48882130db626af868e826249798b4104ad6798c2c03ec1927105dbbaeabdcf00ae7ac6db77c3fa2d734a249bec5169ad7ec889555708904fc96cae1e6c44ca94924c49ca97049a04c2042e8a8629d2f09e985652c8182c8644e1efb3bc37b4635727d15a1d9c50dbd61982499ab291089319bb1261c2664814ee0035e18a3ee756a5b0196824b890360a27138a9f9839e77ce69ccf728f673e0bdbcf39dfe0b22267a7b43feea0617f22fccfa2e92f2bc844eff359768b33dc4fe43e13e1b983ee1788b0f0f359e6c9a8a6d1d4e7bfcf35d8e77cd6c0010ebf5f086a9437f8ce2f8e96c9af809ba1c2590e674a3f5cf6995acf592a565fb5aefa1e783f7117dd0bbbe826bb337117ab7bc32ebebafaf5ecf60b44b8f8be6fbbd27eced46651d8c20e74bb17689401205d50d5314e07c0c30f3b2598ccda7befbd5b9599a66a339b3d9f18eba49c93748f33d171334190c4d25a6bad3b68140ceeac3eb8193030a10602f585e48368550c8084657e001c82d8292e323c0801010ee0c30aec14976c081ca6f207e166c00007eb6ed8f0dfa01e1d08a90ad061a78071f07a90b741bcf7de7bef1decaa6a90b1580c2c75d50cd40a1f844b0f9629000e8a545e0c351a6045c800ce665f84df2db62a1bb6b0220480af3869d8002525e5fb7e078df2418a5d44c9d3225c1a112e0d0d9aa208490cac6ed7db5ebbf8d7c0056dd71000f0e5389635ec796e554c7066e671aab5d65a6bfda15571e961c1cbbb8761dff9bb3988a03a81a94b13ab9cd9046def0a7e3bef930a7edbaef09948419f8916fc4c348167628578264ed09b89c2092133510291992801381383f24c2cf92d91e4bbc192397812944fc064b8e484e464a455d1f3c80949aba267f9a4a455d17a163991d0aae839e444825645cfbf930927bd130aad8a9ee393095a153dc327154e4c4e2c507052412bb72a7a96e576a525d13baa48000b3150530beff7d0aab4d8088169e2e652af9fd862417cb0846556d87bef171259131845fe078d82a139adceafee60c33b25a853f4ec23bfad74ef0bc160b05d69e768f7133ed19df0bd01beae24c04aa01a45a05579411683f234c9a18b64a42426a961039494f94448411e19f91d5a951c2a590ef841a30c8087eba2ec0d7e6e39ec0df1dcce317c22b71b60f8c2879da2e75edcd3106b8035f8937e8295f587bd01c44ed1333c83d81bda21bf4084df0bfb02081744bbd2e6bcfa05d23921393ed1759730f513dbea8b84cfe19813c24f6bad356814971813e1be30eb143d977c227fb57e29f973ab623cab72f588ee8756e582b210b8713c3242818210c9f5f7dc41e318a38ac92ebf21bbb30dd99ddb1a616034a633be80f201b0741086506edb959511925f4b141285442105a2f024e5138544215168000a244d5e5d5c5b1210e0c3ba03d7dd17640b4c79c22ffb89c2df7bb90a7f5c4b76e7561a853e9d594d2ca68cab0bda7605c30807619ba2e77dc4ad7815a74269db950b679f28fc5a88c14976f91497e24b99477128fec49db8923709bfdbaeb81cb032d7f70de0c763f02487d1c18f33c91b7e25ffd51dfcb8bec991bfe04bdc0557e249b23bb71cc991f8116f21ff5f3bfbfeff12fcffffff5fbb0910d917844261bbd28690f009935cae0a76b0740254940746e2d4c0457827602433e9a54bba1de8e4f6bb4a17831c216155188ca526bb33071f1437087a696801cae062140007462a186c34c860035700569e523ed80952543f802041d5ec17656d0b5e5229e947014bac21b523dd0859eb4eb3382248395445272fc198283edd78f49e3f7c5cbc33c69f51126b3a84239aa48f36a8be62207d01b101537ab353e2306124d634c1eeeb845251b3ab4905f446492429d8492d8cd2f584ee8b29448e165a595117c62c27202f02a51f9a65d669b684d44f640855503e42c8e4511539858070e9333981e4458d1a3b2fe431662349c0e2821994a3b1f73f3099b3087a281e79b8c311969c73efbdf77ec883cab9d1d27b8fb4fc8179ef3d70ee524d39ec9112d02c095c5171e74299936424c600231f62363ad19f20472e0c0ed689cf3f9f3c269c8757c16e91410b050ed6b7f8600abd5876f14d48cb33a7f7ee7e50738c823b1e8dca0f425d775e6b34e49cdb28c87befbdbf717d9b3c37781c756755ab71507846a38d4670569351fcc2654857f6defbf9e767140d2e0835cacb82b7e45c081369e90f203597a6f7f7f7de7b77b92bc2ef136fea93a3eb69400f41d8e89c4f2f7aa5f151ba1efd6406a9cd8d76189e6452fba246e4f7def72c067defa35c08c802a34ae27befbddfb9e399d12dd9dee9d179725ee4d46bb29eecc5de1ce6941d0a1d6b4b7338864461560b9ff77b2ffb09b2322a7bfbd9451f54687acac1b1699abb9b6111b74c06e989aa194adf8600b0894cb6aa0d90ba280b927645dbb8a63e271799072521bc7ed89c74a64a163c5a2c1631bfc7e9a291a18e69ef40ce39e71c2b278e9d4cce39e71c686227a35c56dda100e280354a6af3e22a4671d8a3259013fc23af29fbbc3957c2eb289573ce874b343f98016c374c1ed5a3b9aa2151f897aac02537f9f313288ad59f20d7b0e11e6a2ee5903873a81c6ca1f92dd17bef9d85860abf5934d5dffb48d04529ad002a374253cd4dd3fa5c668bbf771bcaaf32a9ac2d9f1541fd456e0a05623ca2f97ce473fe0313799a9e65b7e6b25e3a714436710a7806101b3adca680baeef68a5fcb5df2e7f294ec70bd6bfb313b937ed9bccfa48e28a3d08f555585d3ba81f8536a87f3f935d1875146102aa04c656070ca18bef72b939ac1819abe80ee9fa0a54ffb15599db5a2ae64fbc87c8873ce39cc57358e853feabc89bd3e9f7fb2b6eeb46d5f31284f894a8c4bdbfbdecc837ec3a7e32bfcd2165ede4e25cfe2ea2f82daaed994ec359b37735ff296204808a8a1edc0a211c40a75e6a5789d78767b24acce6ab364f384621b439478c0b1f77defbdf72f36a89c07e5afb011ac77474a5a4343a2f0437daf154621c58768ab868f11423bc31eaaefb59c40efaf5a7cefbd97f9d1f7c2f2fbbeefebc6f07833a1b3a4bab83273c4dd5915c7ee64a8e03c6a22ebfb7cde5017c3530d2cb935b8a3920a861098318784d7df3cb216e2d238b8dfd94a205b2a26f2c8bb43fedfcd62737ddf2a9805998d9113c3f87b6fabb2e631c3319f8342de3fe79c7334a44e6993f0526e4163ea94de63b8b953ed4da3f1e7bdf7becae7bd9fbdf733ec750b7b7e226b94d77b59f8b69b4b6be80c2d8b6324b862c47a7e14a56a3eec2cf87eef7cef7d0bbfb29f5b68b5e87b3fcfde7b5996df191c68419d30b8d9a4092dd0de7befb32c6b6befbd77962929fcbaa85e6d4d7b94a588b64b2ae6eff34f77007ba00d4d59f4e513bee8710246cf99a120a632992f11fdcb4629358b73b393d688db4ed7e588e66d9f4631f66f6381cceaf7b3f7c97bf866746138a3088a215c95498ba9ec771786effefdbdf08f6e4231cb2ce97f2c6657ef63163763a733025d18fef5917cdf1656c219b787a14b59289a19346d0cf812377585b050772981ed16863d729c3746b48cd84a702db2b943ed9620661a119499e40656022b28db1392892d306a0a7242a9870fe4ceda3d172664da0f29193f91a47cee4b0df56da9de17d1de3d011a6b32b0d3143b307c1e8b1d574b35a3928e04a4ddbc29c6d09b9af8e9f703bbb52e64d7fe2c93f9bdf7ded33415d176f9a2f2c8f361f315e4e78498977ebf0065338d87f16a041a62ed1976f1733ae3e4bdf7235566b1891b7bee51bd4ff07befbdb31897f0db7befdd278d0f9955582bc46b07f464cfe8960c66100e141eb8b1540ab9e1a8291bf2178bedddcc79975161499871b58cdd829db68093d2d1c3051a15356bd57cd1426eeec89a7d43c6ceb71812640099b1cded68a256e98ca0466ac70a1b9c1963d2950cb3d090baf0eb32428706155b83e7e8ad2825f176b72455d653c6dbeafdbdf0ef2c29ef17ae1a140bbb77d2fcbcc7ba880b54d16d3942e6781ee2bd8fb62e3368b0c5172b42168190d2d3cb068f9b2e0b2f865ee4a0f3793a3d67ac8d5cd58dec2ace39a7bbc62d7458d95987847f3e68a4aeae887be89a7e298950b577373f52d0c0ca42e219c150900ea3b26276cab3f33b866caa90aa2fabaaa6e487d3becc197bef1d8b0abf1510835ef958752085bcdeb8d36b4e44a3358d8e4a674ccd9efa55a5548461ed0c15a16123d449dd9e6a68c8909a79cc4f681b59f8a2485e5b484fcb4a0501dc9d3eb4bb866d5edcea59c56987f139764f06d751a78078cfcfe797735da4d0a2556d628b36dc8254cce2328eef670f242afad67a72be3dc33e7e2d6953e7170a20775ae5e0b6250679f54625f1c4a20519341b3b65469064404689e45094d59c89254ada540faf2fa21d6d0f985a5d2cc3789a4ec45c7fce9838921df5b290607a6bef38eded9022fcf6de758bf5f8735e81fa6fda3b084b300ff4880b58a9753a6eeee2a0149851fa6aca2eddcc6da8a01686e6b801b5201b54281a22eaae94511ae4efcbb31077c61f408eb6f6d3eb5294c3796fcf5a58d7dfdd2c96a0341c3711591c1f22e0b09232717cb195397997b7237fc2617b324bd4b277ffe2b634416123bae28ce64896019b5394cc0c92d78c93850e87be55e1ad7cf941c7812f704b0f43a34ac5f616e525a733f515257ba3d11c6f1b0407efc7cce8d6e2a769cb379269226dc53c64cf9bca78ef67e16ea5454b1d34cc9d5823b653860c782ed9796c78df7f60deec8531669d22d2aca95ed0cec5001310ab5a528c99b101385b4da94c08249ca8158de98e217beffdda8ee11a1b2c3b612e150193eab837d6e027af1d5da077a8074d824293ab092fba50bba9f4e9f11c0bb2350858383533230a1d5a21a8f1e971ca3599fd24933c0f99c94ece6f0f9988a6f75e1a8a5653cdef2e0ea490171c4ca45653dc69de1da9a7788a7a35d5354bb1483623aa73d45462a906ce9277e2f4c0be848ea6b0ab1355521b8607ae9ee7544f12c975434dea27f57a4e08a2c2a9e8c29bb2693181a035b402ab8392364c0fb3f7debe84608e40c70c48f52834e2e60a1a421a77602d399ff39e3b5471dc3f00d0f9cc4cb51d6dc4688d10221b61cecd4c87daa53f636f591e3b6e3d62966254952dd190623ea34fba2373c7944674d6d576b384b462423641cf8674dc588a3df420fd8ff3fe83c163c6647d3ba62b840408085695d115144c02d2a45b5992ce2d848c128e199360dbf0be6390a5ac80da8ac0ee97a587d97bc90423fcea9efb0aa08598141696d9d54c1d10e815a8e66904e9911807bb8652f7718c39bf40aab9a468a8929e808c1812853fab2d24ab6ec54c5892535775bac39a3fbf2dbd22016af58863ad25101836010c312a67170a15ada4d4699621efcb8b25342aeba14d5539eebd8ce9341e392db1295c99d59405a6d4c68e6cac40e036188b39a98202b7d97befbd7717ec147ee1ea7c36766d57e55eccd07214a88c90626f6e6b751fd0d2523346ad94d0686c9d22df0eb0eed4d4a82551ccf4d6ac7ed284e4d884863c7a477b8aa7b352c8c56e4bddd1f75aacaa7dc2f0ea08735e62e23546f9aeb80485e1b5f8dc929f383ee7b3cc33d03291e377b71d48b71fab1ca58965f2aa78f5169b213db6a28e406577cd190578ca66a08b199ed30aaedbcbb935d640a481fbe6bdf7304c2ae74befedb0405f55d62f3248a84cd6c3216a465e54774afbb6def77650f7bed7a2868cadd7e7cfdb753b60efc4064e5f16e25a171fde0a1393f5defb16bba8028e168548c8b2d46aa45ad4189b98a854238cf26640f39a2251996206fbeb1d99fbd449d2e91912955dc27631085b571eacf0edc0facdbbf740b93fb508314788903fd0e616e79c73971c9a1f6ca2f334d74316b2f7de5fa2d7de7b5fa2307ddb5de4e3de9778effd74a7b4f09d2f8a93e56cd113237c6fc90d6b592807859c0bfbd43754ec8dc004398e6111b1b0bbfaa49190c688108902c91bc1ce092bbb1bc91b2bdaf6eafdc5e618945f1d09481b34778c5d0ae3fa95fd8d17e62eb939ef4023e38bb86d1941e3e6ac0449e5b82af3c4ac5f38bfaf1f3903d9105418d24984cfeef25e793b08d84eb4ed6d6c47d4ff5aa2512327ac6e042cb35eb6b960a4f03f61643bf6f3ad2f2e7525e2f2f0f890025022eef735170d898015d21f3c2b805657092b90385eb1690723be297b7f2e5c58ce39e74138ad07a79d162133a37278bd9ddc30503abad4066305d591ec51a6231298aa1c0c56d3a0dc9ce93e8ec604efb404d06eba98da9a944f04a4e17ca92dd95e78bdcda7880a5bbcc2e79c73cee2338d63262bf0fabe904d5fec76815bfa38f027cb4f5c7fce1371ae58c7120a39439e25dff76da586b80e2c77023b555c052e0e0543aa0c1c65ce720095fd701a12857f2a041af5791309afea0d319cadc53930aad57537eba6a41f4b58151e0bb97a65952c0b8342b62536a31ee2d265de84d7eb9c738e65d329ed67c1eed029edeff256a6fd621ecb77ae18c232c70c32f5b1d81d694258d0aeaef64ae408cb35cbf90c94d9c1be6754334e31a07c543415d3422c087ada49c331a2dadcd29d43444b8e12b0152fb6b6c9d08967cec4b202bb392fe12ac2401395c8004a41eadd48ad593b3f7274189351cd183b793d16d6a4455770434cca9a1db5bae03848ce398fe30254a5d91c185d4e348644e17f757caec10fa84e901d9db19e0de552e44e4f8ac4f4e12d4d2ad70e89b468bda39b963dc1c07aa022589a52a1867cc838dbcf9177a8d42c58061a33306c00024000b3180000000018c581304f24b9ec0114800622d094b490443c160c86e260201000840181b01818060000602010148aa1202003e24ec7035858c43c9b23078c0e841479cc1edb97fabd62d206087340e875b53b8293e2cdde11846daee204cc89f26f84a564e6b9b2cd27933ae1c3614ab88180210282dad91d6ec3a15262ee2913176faa732154ca03bcffcd4d47eb01abe601a7fc86b1a4def25094d2e8c293c5dcece0e4f9319f80b9b8d7f24b21cc9a73dc5cc6534b37ea5c3bf0ec13773144dc484b3523027b8d9b7546b1a212429323a270c47e39b9208a8cd526b204428ccbc9b392b87bd1453ba68753325d9c9e9c3ff9c378bb4c8d5ea764caaaa819a754a411e9831e14b7ab5a8d21d0310eb116372d9281573fd089408a7347a297a75f6fe9970da1462e7f37987d4e4e371ec129c3d29025257f4dd25d19e83a913f2002fdbefeab9f30880dfc58ae948f1e8bad416739461c335f6a37ecb15cb0217402b1145855d7ceed33120dacc63f647659e232f64b53c4805f288f12d573a01f85caec47124963f02dce1dfe7f79492404d7c28364bf1deb5416717f9ba418400ea8ac05844ead3dc329ea09afabada1c18db1d33a04c5da5548d7bd6c99a7498b18cf078fe93eaf14d3aca40f66c0a0d208a35d2c173de4fce52201880717114752ccf4a86e17b6d345c89732c73eb5aea3ea9a12c6a0e1d460d0f146473c39ce2c1db47be6332ffc242512e010a687a635c88976739230543824288f293bf39acdb4983cfb3eac8146219e2242d251e3920306bd64821e694212fcadc7852634a8a3969ebabe063de1e037c748a4a66e6785c01490b77342ebc8e61ce723a49357a70afe854a77f74287e11293a24779a21ca017b9173af0192cf8557ca366b8fb7051622721d21fe19d9ab1002b2f4ae54a48ce24dc88475124d1840dd96753c346a54722b9983131b406d08d3fb7111c32482de26029273dd86a65a95c321abcc7fe449b94537ba348c667cd413e84bb01e316361ead2ad89d061c070f45f7f189737734510d339ad2ebd16b6c7fdcc7d52dbe44e95a78874506245ab5ea5c585a1ea874713a04a7e78d60b75bac9f87a86050a655ccb74f04f594371e991dde81907dbda333de88fe79a2cac4a86de4c93f60abdc4198abae2eaa4c5889ad5e7c4213a8c450138e68698991008ec8a3f2123b004580025148210d61fb7a9f95a589fa238b2579ed65334b98492213106b3e431538a51982eef95b2717815431fc5913f5f0959918f75a9a53bf5262cd4956c1c3889948c1d393c83b93488432e949350f67185fe92e487e81f87c872e542c29d40e3975c5fed682723e5541747683c2ba248a9097028ae96d2f40e101873e96149e8b4ab172ce4c22846a802ae932db75bb425526d071c71f3d3cdf16d694204740468ab2dac1c6fe10367433260bd4e726808947d926762dcf7a512748b1d0ac1e42a463bdd51007995df01c285ac8a21756d483a301d41a34d55186c78555cc7afd03e978274d7737d46133d5685c841da5a87675307848e10701823fa5b2ec5c56a6388578c0e83d414eb82e5f86b44b908a532474e5052d9b06a6d9fc6b5a56c9a5dfda3e8a5438b3b220cf6e4ba3c1bfca38e9481bae1af8ef9fd5ad7f77773918924e12a7a97b354b31fb70116973d6a6a3e5d69247322e8f68dfa1a225ee314fd8b4e839668c037bdf35f7cf1d4cd0bbf4b08597ffc69b8eb4ecfc52e605f34902886a50905f7c37bcb1cdbc20d3afa4173895391c26e7c7e18bc6e849eee6c4c6784cf549474ec7c844452d13440d03141eeecd71ad94e18bd38a93cc67989afbddb0b637c81d0a45b2a21f77e79e81a1f4488ad2fc1ee23f69982ebdc75220ff84d59cf1ef3f333dd314953b5d5aacb5292ce2a32e458e52f7e79151e4d24ed893530b74d8d45537105d35a373a2ab2de9d05f778b8c274291f905f44d0ce1a4802017eaaf195b29031636ec19c0e48761a70618f1504c81808526d58cd71b1a32d2c59533611f5205cce3696067c8f1ef42284625b0d7012d6f0db4961bacb1a7e6cc67ac928269bdcec1461bdd7d5a725233512b97c610b8f6ec1c1b9fe9a69db70be9f5d8e41db85f822dad78600641da7df0983b7aae49cb953e0a788fae5e4040e00483e61c9649c1fa036a2fcf85d0d5ae61584051c212c185575b4772dd8298d1da6cc854acf7be62405525d231c6e38d900cc7f2c317f3650b0a3a0c28f1be91249fe2466bce88eb23311fe628d234fff0f781f5aeea42e1003eefd49428259f4977828785590769f7f34365b497d500a4f86167177d395b980e1e0e141352907b38ed87dec68123b53bad692a957e64bf638b136167a31169c16bcc4c2e44facb80f091355c8e99819e25559c8ff225a11139811db90ae668d26892a761a18211fdcce3909a8d48e17665039ed0c605d7bdf0910a93baf56c796b12159bdbfd10789bb2044ba0f8da338edbf5b0c5e555884dbb8350ca5f406a5b493069c06eb9916ad165d272dc650d6f0c9682eb9dc6c71162d4c52f44a99fae2c7574c8d0518da5cfa11934a509055e4124cebc3d5aa59da3738c457c0df1c917efbc6aea09392fe23bc60fb4ccef82853e1d867c257a0edac2926404428a30d303b2311f80f09108f3c409d0d890c0e9cf03f7d1d42f351eeb3964c7c250fa959e9ad9504aa7bbd6b0cac51ddc4e74bacabc1e0c413d434832771c84ee18880050b440a2873542a9fc6a980e99d2d010bbb09e3d0135a07ce1c21704aee07bdde9bb96908e1afdc7fdb044cd9d0e7c328f898402eb8336afb8a6b8ced0bca35b6acf1ca73a3bdb14f752bbbac56511e4e1033c151101e1352e40a6f0979a5598639f0a3d2adfaf33feae1125042c62a72a746019b4734f7596e86cbec036f30d1cfbec05488462f6beea1011b3701725720d0f99fa8f639a5c3f249117720e999c12d7665c8548daa3c4d23c21dcf2629c42440363e4b90ca5a0b56c34617b65208c233f470b4d83e193763e7e8fcf5d9af35346cc70649dc3e0b16cb4df6053b36a401fb4dc1065a08fd89191ac695601fd6e221a2705a313ad12ab3ccfee0e159bf4baebe3cd2f04442a620dc0a3a86622d451053155bbad8e85b7dc567bd7fc43b02640d6a8c61d9825605fdec165fbd758af772b7f4a2b1acc5cbd9425be623ed865a7c02c301c634d75f22e326031aad4bbafc6c60aaa0c37e9c17659e525624a227be153af2b1ece5db3e3dc34b3118dafd1ebfe41e34ae2d5d30a11230c0b2b2ba677fefe762dace21272c1bb5b6974d1d4286f44303dedc8c38592474941293b927d9ab76874bff14b86295b88e1a1252c2cbc79c95bec694255a0ad7d1b02e1a4a29d3ee759139e428f9ea596688b7e9fbcfecf662fdd0ea39ed944d566e465c855fd14928b722f23c3cc4c9e4c4aff15bc3f25e0c14b50c17eb66f34020845c482657b0f3914b13cb4ff65da43b33904047ea96c8f9414fadd29e47949eb48aa22deec93a8140200b410070ab927b1e31d8936a2b8ca3a9ab7e1facbbad60839fed9f85723a08b75edd85a287cb04938a6331de85568031aafbeea82a1265f64bc13525620f72086757b9757125287c98b1c1b8a6c04b0855cc0205c9ef90cf62c0af959428eac2042d1c0c3f1db7efbdcc7f0480ac57ee390e7a280d08c647c8814de4e27873dc243d1640ce7684193cb70c426cdc37945373efdc2bdeac5a48b8ca38c6ea59c076040359989c09ded8fddc77fd90ffe5ff3ee0d42528a40779b29461f70197d74e93508fef7c3e8f6673728a1021b1122a65111e388e9b803aab50d15c26294aaeeb5278911ad8de43f4e8eaeeec451ecacded34ad172f94e488e6b0cb6719fc96efaa35b152c53b8fcf38452dc1f9d73b30f6a81490ca3c4748b582e4c9fc92dda845e9cde2a14bfb92cc225903293559834469e5c8ae064564f9988e3edb43e3ca7e6628a31adac589e74ea1ed4ba7ba6ec3d4e9acd9a2c4654eb9bd145fbc2824a39774ceac608505bacf821648a64859e8e1661751fd34b34adb472dd63e3085414d5457ca3f33ec46bcc534b65ce6556b258387fe11a4acf6190fb535543625283f11bdf3dd1426cb77c20d44d9c16f94d15f59686d28124f7c6defef2a8b507b2041b6d4ae37575e4ccc08670bcd515acf55f21a441473d1ab98f1c4df6637c4d9679be5b5a3a7a93db416130795e0349d98720093c7476463cbcd84ac943c88e2400e678235f6ff1e29fd385dbbdeb2dc4e797ba28b1f354c0c3a256943408dfd949997854aab8cd5f7f96feda2f300023ff74df51270db139ba7999851126ebe1edfe7651ecf97fbd79f945dd815f891736e400daff990b1456a7034065a286dee216b5a96c27b61b03ed43cc7621299fd0e79cf31d45e78150b2219f037e845ec2045f762a9f25e9f8ca583f9e679743ed1348ec0385676fce91842736302570a360d206cb7a5063611ad2e441809c4e0a39290394e46cb8d41390365d52ef46e1c27f22dbccf92738b8419d134d4796045618a3202aeb24ed4e052412b67629915f916ebb7caeff0c821ace328b8eda47b42e0825d24f72bca45a5742366255e233fdb5444301846a0193a90dcb0ce089819a6d001741438373ebb2aeb20320a1daf5a19c6d126be4dd25e40c410a17b21a1728ca143e0f6372c673f7dc4ded8f81dcfb23d26b67d72fa1fbfdd719251fe12d511f41e8d0bc6287e07f67ba47005118c27ae6788410d8510b4a8834cf17c6d0731159397e0c8db287d6ce9e9c61953063b20e69252f532461583b8f9a27bfe9d009dc1f1dd275db212986c5cb0b4e683bf6e215063912c214bf341ebd1a236af3219e825547e143aa5bf38d3a4aaa37444b48046886497644da04e72e1dc37ad84c6e68f84c7d5930e911c4807f421da1562073cc74bfc9c527bf5730361d74758e21f96ed8a76a2e028815c2d97cdf8037bafbacd9e6a75642b558b8789a86c17b99a9c1028c4afaf95a5dcc457814c2044185f6545c41dd140d6058ccc10707d6861a9b9726aef044c60251d00bb2626925de1eee41d68f88542e2fcb55564f844051c9fefe50372544231c37fa2e6ecbbb63f6baafeb59e312a2dcb507d462d1369596ed022d6f2ab196756114fd08a2242c01210236a25d090083d74805f325a21f1293d402873411a1df7219285c3bbf3eb7b5316650d8de128f2dd318a9e4b8fe8de4448e1d3a34bce19d4294aca221898f96c479ed5224b756744c47da517213c68dc1d9fa2404f38a0cca0d6f420b8c074bd7e8cb850611e7c234aa6f7ce509a49c7cb3a31742a77080b6973a37bb28b0a9f084b88b33a4b25868bb8166bedd72ef2a028672e9e57816db92535d456341701028dc12c8985ca844b9b3984a3e12bb9612065c59e0113f81b90b920c65ad2873e010f8c692ffbaf5ac0f49be668cdd4e7b4a5820add259ec16f9ef2d070b5842e15cd30e44dbd594110773099688c3ebe0e0dbfd6d01a348009121c1757a5e9f38c9414130e5a81d3d27070bbce8976a037799640e8507617eec3942bad16ee63906caa364e3de7d8c87e6b999374483a8f9a48631cebc6d798b292e8b910539321c659c62b565007af03f5c13182f5d0ce010a9a5faf2ece17c05936b4644dccc5a3c5ba06a3381941bbe18be5af3d876ff267027d39779000bc28b454ff3505a31862122f2fd42ca2a508f35a35c13162d20973157e32b32df1bd6050462cb3b77524189ebd82c3257b53cb1610ee46f91f29bd100ef92c5b9876b60f330eb3c1631ae8dcc690ab4f442b8b00cd0f643e5c5d0c5fd253b81e6a762ab53a07e95539803114cd9393f7ab9e4fcd80bc274d6bfe3da1a23780bc7b75f375f8e31ba27ef12f61beb47dc86d86760008a6086b497b7f1c051194799385c3b801051625de35e52115d2fff0dbb840ee1f83d75d19f83417cb0b9cc35b289bba44e5dfd7fb45737c01adbaa3309890b8cf5d1f34ed913f91d6e6c71918930242ec16aa43091e8baf92b1b6d616296a8d32567b3454219874e34eeae70fc4127a19c9223332e3aaad1716601008996c6a3b4aeb9fa21deae2060453b4ac8c0fa769e008058e68c7f8fb7cccb9fe123cf80beea095aec37a3cc34a537478df8530cd775a26f1e99260bb48522ae174e8a002ed86f549b82c16db27c77d94bc7c78ddd00fcd5f91334d52c14d654168b3c4f5091f852c05d63e3bfd49a8441c4095f56aee20782ea8f354294863984055d4c24c6f25344d89bd71d023616649988f3d624c711bba0fce983c64d95b40bbd43c434020d2ae176154d36dce819dca532cc323224fec359d693a8b746ce690bb5c7d680846c02be9e1669196a755965a0b9d7459800b8e10991acbc0909c586e2a73e5e464a5d16f4b86f94d9be566d8d29396dc2ae4e8e08a25eb303d47cc17a09681ee2ff6af48c1f648792534de579928e586b013f881721d70221897b0ca5b045bfa6fc407ad5182136d7e5fc80105874f3e099f741ccd7574511704a4a5bfa28f4bfa82740af1ede4bb60975dc5c74c283f6ce147bc40a6677a59eaf26eb5725bd1fb95e13a3cf139a7cdfd223d1a629a2758712707b37e0f94343dcae0af18f88e39f38fae5ddc880300144ce4d423bdf4512d3f724720cdcf835bf50ad69a67aa072a934661ea05f979e7eea64538c547d29d081ef987bb9f2c6062c5268d6a1651503423dc8459ed103724f012d06249bb0874fd08bcd22fcea9b1b6acc5d3982e935309bc3b8db84b9d338091166ac2cb580984e1c06d69be5c6081e01340a110255c6072072fb5116152dc82375862c304870c228a994f1632fd0f4007cf987370cde31d9fd2c35e14212313a75389eebc91f4b77e91a26d4b4e3219900ffde6f1f9669b06aa7430481249ce5b34e766a8d0e91abf8dff4f24609bdd1e67e6233539967606dba19014a8bcfb902ae68c8504840e9ddb853c630e0a9ac532be93a037f07348fee74fef523f75fe2ea9ea0bd981436e12f061c8b69e9fe83a0ea817ef05cc40e8aee59902b011c89b100e15ec1346316f1dc3824c0895f7479374b3db5c99265b96834b80e216dca367cef81eebe5e33b0e2dda7f8326e1daa62890cdd0dd996e20458b7bc545a5f1383036450152ecf0ff8809638c8a8f97c5aefe2a42253a29646922a5882141dfbaf454a1af4699fda2d25f97f1110d5e7c3225fdea42e8f13cdca61402f964fd9ac899495c75ff716238f2064763c8555d304ec0deb503509c7a215133cb9ae600deb78e2296224d25d60a2ba3be3bb307fa723feac8ff8e24a980c0f10d86372b1821114936178729ee5ed682cec2ab4d18fcf2d9723158f4c100146f75fc1634779cf48efe28479d4810155c175149507900832c7e823856f5dcc4308e81b9aa7d7c363aa2de518591d618c57ecb2f58a3d863b83a48689380792dddb0d64a5cc2c6ae0887e692c17f1dd1580c5611c524663ebe29d517a1d46b013f6d83f4a15dc14573aee45ac0c445b4f9846645e1622788a5402fe4c1f1e278426c57793c0689b1b26e142b88ee8f6b7d5026d2080b612d6101e85e37e5e787b424b5b775d9a7c15c9c90cb8d3f49d73412821076871351fd06c28f55cdd19e2f43da8f4039ea3f43937b7c031ea51a131ea8b76b628e4df439aeb976d485ce79d975fd07a37b428622968e3bf952181fdeb6196a0efc65fad11b123d123c93205f5837fa7277180a0d699c26729874c26ce2e86f16e67a84b4744e3528253c465b0be10eaa72a20b16e7e833a592389ecbc9fa78cf2d6fbc051224f18bdeb759f7ce75c29a1f844967fb3b8749df16b5e9aece5f6a4b539f7c21161cd08785c2b33ca8de7190b3f5169ba9e87a0a95fe44c1101774ea695cb9edd7a73b86e891dacb420d90a3f9917ad116772824c4a751599ce11aa19a6e2023ae2b007acf36f9554923f70223cb656ab151d6d802d2403a40810c1906a38328fe5e0524f1291ad06d6ab3f6fdfb4cbfb231fc6d193db4a467cf54a1f70b5d904c44e66ef5949e9153c92ff6f8bab755f5d7acd7f8e4546a1211f1526c0d1014b70e0a04270e62ec1d6f99b1114ad97be1822ac915dd088d67af35ba63575c2189fd82749a4e0e7c554f1c09cbf4241201c091d1b4ca5204e5f7460451e7e87cebb23852ec5e9d573f35f50e5704b18064e98e0f503ecda2aaea3a532c18d7830f493a25036f0aa8044a2b07e5096b1ab4af28531170f8cb2894907204fc987684d30a4674b258acf7182f0d03b2374b166cafd1a215567d73cad2d50c45a1e43af2a38da3907f933fa49491260ccd7271737ea43f135a4b3538e628c9f0eca1b851eafeeedaec0fa32c6e2afd9bd926b444014442c2b2d139ac793d36a217ca0cfd8cd8361d4e1722c9b62d02ec262ba4f6445846cf5a83646fe4925699b349cc3bad6e029863a4fad316ee51e799f128848712f1241a4b549298401dbde5ba281961ecbb823538e57cc1218e8a77c14baacfcf7d308454396c72e2bb6b306dd9ff862b73e20f10a16eb277aaf2fbb8420b3b4cd0c072425fe3ca6d4437e029e919940f309918314906a7c2460dd4b22a12c90a1da8990c53751d6990c05becf1871215d142d81d562a1ad49ea8f6bf9bb97b7d83cd62c4c374aea242db82b8cfc8b9fc411e3fc129dadfd5c1dce2e9246ca485f5a735d09261e0324592a2df8f50bee76d7b1419df8a4d36ae5b2244d051684624ca1738b76f8d6390a84f18bc78f217733c9b10d1141b240f898a31f5c3a30e5c9424fa3bc180f96afa73124ad7833341623710e6bdc6f6d5c3223a3a8857f92a67dae7782aebfb07b0a311981e8cb62e1e3b9ff3e6721a63289f3209e0ae21a8b4d68515e0c57303fb729d32ba6ed4dd15b85645e97f82b214a508ee650959a9655d95517ba8d7b1cbbd4b3bafb82b06bb0b5686a7f0b0dce12003e8471555e64a69a988807862c8c1356c418868798db09e1046e21bd7320beb9c4180b660655dc29cfefd3a688892fea6e022e83420597289efcdeccb8501151e759bf2158e6994c4c871221b592ea7a0b6890f790fa9d9e699e8eac5883ea8244284fb9b2077c34512e8c653711fcc343a99c3f5213c4d65e718e8ce5e22532403bf13f80d960526cae9a334b6cf56a367ddf5c2ec98942ddcfd1e21670585338498dc4a407a8ee1b8e59c9d96ef0c2881f2eb89a57df0012d7ca3c8c1b211c4c75e29a0599133512bb8216efe8314ff69e3c2abf574af9b30f16f59ff77364d77566d59cf78f5abd91fc395dab6d5eb55d79884a71520dcc37f40717bb6844ff9406355fcb76cbe5da957d5ce75a954a6484a5177c66bdb69255c200af9ea2a591369cff33f00afc3572b09892fbec3aed15503bbc50aa5e22783847f965e7a37350e196b1aabc4207b4f1681fead4859c6422b134d2467a7fb017d17ce7edb26835a278280594b19fcf5e0ab3cc3e4ff941ea7bd0258ad9e38ac553b2d79652afbc787b9ea7c8305ce78273b2f7fd616c543b22b611b4ed8c3d1efb3e814f2ade8345c7a50348a60225216d7384ce1c50ead372d0accc4c3630352bdb3df07cdae3417582c426191783beb35ce4ae8cf3b6e6aa12267d102656e8e8cc88a3492980088f58e196704a2eae0c4906fc368e04a3a0968112dc62d20e5823525d8c1586ec682e11133ec1facf1d8fb51160a2354c4b751b3bf398bacffc46c6b0b51a9a5d6603a9fe2346312bb125f792d3c81d283376c8c46f7b56260147669a7be388ef1d69a10afeeaeed19b4e6c8e916bf0fdd388140485b15b5a87305181fd249150f79fbffd902d7725e1892baf6aea07220c25766c73a9d47b5129e9b2d6ba1a319979a56a3463144b88a0aae9fa78506d83ecbcc7fc4a5fada8f5daa53a77e9e4f61ebd81b5d4615f9093d7898358c5be249258f68972cc50cd7fa651689d740a3b52e59e20185f0a9ba30c6a7f337d1ffd3606ecba888d52f4289473eb2a596b9b65356eda15682c55dd02f6b46e3b5297ac22138a480bfa577cce7c4a24dc56959cf8f26e10f131f1accbd77a0f93097ea6fcd12c92944ef68b271ca3eb6e4057d6c4cfb20122c26303bb6bf2ea86894451154e51f005433afe150cad05b46b642a0509b5fd04f5886a8a12464d828283b22ccf169a2be918c16385e519daf8f28da3ea179b688508b07c08bf9dd3f52ee5403e86205054efa36774f1f62f5f2ea96852aeeab43c8191d1c5576692050355c9bf04293e3ac6cd65cd09adc497f654e44bca0ad03f7fd10842c2a2b6f6e9b79b495deba6adb25d3db8aa8ba20cc712b3ae2648fedbf9b955402ece3cd0beef35a2fb03109f5788560239126d1888b5e6917378b6455ce7dc7d15ef0cfdb455bb808553b4b1b910d94b15c15a08f463e2866e38e0bb5daa6c36a3ea7d2f749dcb2862079e43e097285d6ce6276855fc391d707a645fb8b35cfbe6dfc56bc8b5e78ae81cb70544410d91fb587a17e0bf2173555001f17a86122a065efe9e714e3cf40fb630ac631835b4124da87c2cc215957d55c83d9ce39caf36e805d76ad2dafc32202b068ad16d342bda440725f4af9ae4a9a0c16d263bc3b8a61370ba21a252d5629349f0dc2d4131eb8a2dfcc2da6de908dfeb9f93caae378edbc6c351f3f4e0807f9e90323505b52f1c16d1a85715d604d83ddfb40d0e1bd82af771aaf6d21400c5165de9f65b9c3436fbcad2280ccaa8853fcd5fb39c2c21c2d746a86e004b14f81f55161ab806e6148ecc7f2cd734ca370f787eaa4ba5037cb9e058d5c653b67ffb4e5741b5fb2878ddfa09597d6d500f13e7a7b936f4822f6dfe9d392218eb41e7656fe687a1e2ec43af028e37f776ef3c14760f7318d7f49c5631ddeace65c67094bf93ac5fd3c4668d2104ca1b5ce55e5681af770cd6cc59113891d171297c3c8256348a63638cf062085cf2bb2d1d67b66e55daf1f991242649e4983e2c2191745d56c89bafbb4d03c0333fd170ca1029b1edf922a54f192eb71ae131cbd02e9a22c20d22be82b38184cbc17e209a6992d302a5702525d301b8eb95085c82147ddaef0f9e1944862683781b43bbe8b48dc3c40a1ce58a2f007bcbb8ff9ac63fbf65759a252b5b961405ab85635941fbf5f6f2c2ed5ea60bade4f3e82ea15e172f0d9363c4736ea43878a66ce80ed482c2ed701ecfc33bfea0a7e83c55aab44115925c9a3277e1d94f4cd7b81d6826815c4e5d75df62e54ac283097a25a7ffc3e386efdc6942aa0bfe399768f80b8504c87c39fdecc0c95ce073ee61ddfa423972eda0f8bb8b82ff4860a172b95d6af98deb008f8b4b13608291cdf7e68b83e9d58cb8e28017053e44b47878e00263ba643f5f79f833792ce9d53458fa83195498ffae8debe9406428cb4503ca36764f68c515eccaf4d281bf2ac409134595bba68262dc56b524d64f5d60a1790375c858e00e2a26704843c06907266e7dde430d710856f3d8af1350b84118ecb4fe18a3d8516f126bbca83570a38320c2dab41f6ab276b78e9c39b6cd2e24ad0e1b64b33bab231d1e2715015b0835fd4a0220b13dfcdd6e17252da5689b68e561a1a00714e396f5c0309a4b5314cf56fc1f145f2bde6cf4b185e2c7789036fbfbd44d28d56036b40ade1c00e46de3cffc0788622d8fc1069a0fd0189a1dee32e903af157de30d0d5cc144954fc141557cdf08bf3f8bb8b934c7bc23e47a262264798a209853e0f28f61aef29aeefe053a50d1ee926e4ecb5a0a29b9a6d091c5756ea71e215def746b37a7de40d7a7be383d6520cfee4c1afad4bd728e1d11caa4666892040c955bfb4e396265217d216b64fcab6bd52cafb6c91176a2eac4e08b9a74b2e6e3e4e29039191fbc1cd821118bc0d79307a8d1b9c9b642261cc5cde120f900b48d78928b811d143d1aa9fdf7cbaa6b1182772cfaa84210e78504c83f10f06db235cea0d9c37641795fe923dbdcaca29cbf45c72eb2ede750a0c377586d33cc615b997b010691de433a6cc9874afa1285b9003ac9c29a847b88bddb77882033497cb46cd1152819750064be35e99088991ec8d878cf2274ae63cc38b6d5a4f77773839242ff33b10c0de31c6364965025924a76a59e76ba04367625fa18fa1a7669010675dc085b4304d2b3acf5278a2800b5287fb2581f21eed6cec30f86a53e3019ec79d808681a203467969d635366362e28daf90ce1ce0cec111174762287d9a9191cee155075ba092e4a754082c9a068a1aa1dc18c387880f2a7679958dbbe9ef1dde896af926e8d397b593beca87b84b3d2b01e41aff25a93578f32b8ee3f42946f4447759377c7585b6650cf478c7e1e65025bc6f6204bc4be4c70e7a5b8393726dd9af4664e1726de59b63cee1bb0ae77f1df0126eb86db3236d5fa0367c5904003a85fb4099ff1255cecb225847d99515e018a0b11c686d47501803410c5303ae7eb997e8b1f50327290b0c68b80daf505302dc51f23ccba753584c057d0a2fa438ac6263f81b0f1e58b15e8eee3f801411a4ad3a8d99da96caf2539dbf8a8ae3ca86844841c7e8a7a729cc11b9f134270f822ae0145e5a9b61ba5bed135bb734b3843489c3c01babee02b53704c6d750a891cc14a00ab4d20818b0ef3a678acbfff9b6402bb43925b60a8045a4ebb80728a024c74d41d1dd10f2e590379a1646d38681f0d38537fc1559ee9f5b7d75fff7367cb0cf342aefdbda54c5bdbeeae02b102a602631f03ccf2b047a32e52c4d49891caec3690d679138bc9c2d4206bcea06443683d262f28c197967ef4eef6eee39cf323fc724ec5cbe8a8b22c0c4ca5018c90197cd070b900b92456c2a1bcffb15e1f24cf07df995c602a39e71c4d02688c0639aedd4f2732e39562c6ff3f302bd2c2ec5123d030b85e3c00a7f08a89b7837457270c26cc3caac8b9c7200b203f6164be7f5e4c1d861593f190f0db38ab785ce0a962c14e8c93c0507b90a45362535d59353dc578ce6c0a2daae4270b4a87c516e32f08f1dadfe937c39c731e2223845f8d1326375a6ed52a1c19ea3f65be3c4078d25d2da55529e17657ab7d6fb0adde1a0425208304a1fcfdff23f642b248188e3bfeff89942e879609d3b3b4832a4098021f9de81ac147ef17f43a20250978991d92e83903d846f08c8eff7d4929a9a8db5c4dd309cea23213abd70a0b18096cda6eeea703d8116c4a868269b56a9c96c22264d20e8b0831fb7fcf957befdd8367678497520c51ec8dfea0a8488e489362a5db2c6efeff41422065b8afa9e0adb42509026e18d82417482d37695d2b0238abae488206414df6972b420d03ce7c44d50837f71176abc898abf324e39e4c8ba91877e66737a2534b9518e026551003f4e682006a8375486597462b9505736466cda1807b9ea501a1526470408a653375136335b6bd3442da8a3e33988ea32e90a270603c2da75278d02917df07a63915501332335b2ebbebff39330656de8da4d4b11b9d39f7c12253c92e5b255f9d362406fbcf97301f06610ddb11b0fee771614faa05c5154d43ed8011160057b9ac1139aff96d619aebbac19b1bfedc0d77d81a5a772455e6dbf6b4bcbe2a6bed14305da535e8ada58db9c839cf2c0651296eab16479a27a2e394ee02a1528e6ea884d3b852343b3757caf4056649a0bae28a5b42eb921f64705e48b8c991b9d848f9ac69d8d50e2244dd44013d7eb8c60d1e937d7379cb1b25852775dc1c5ab8cb2e4e5f62ffc9a3e13abd5cd710962dd91e1b172161179677cdc91f4438357768b513a29db597026adbb04bc18b2e0a990253938bb62598504a9bd3585cd0d9f3cea0ad36b7045357022b2d82629ccd0bd49131d984eb356300d332a8639286587bd931f250b5ba0941f4422b1a7492e0396b365aec7601ba89cd63237edd3c0d919ce4eef5ffd4327efdc5ea7f5e3bf254fb3c7bbdcb33bd5d86884df29fb77b513b4b3515da2d2c1c3b800259da9c1253b36a9a8052cf94191c160a94c6e25c38f3b80267b69be9da93fbe64eddb53b22ac81f3be7a7fae6b120437dda4348737276398827c9a50485b505891027405339a618ad2871535e0dae4c67b0b83d4a885b7398c9c736ec3b1e30acd9cd783e569efbcb318122e2a009d604193d9a0a4a322820896f2f5228974addc2921b710422b4968e239136a337351b67b3e3877d654996c30525ce2b6b5c5ebf3d6191d2529ec943a92eab7fd79ed17b147b6a8512f549ed5a96faa984694e716299954c88c2458106d40bace519d9a2460aa2b6fb43ae2c26e31f7aa3b14438ec05802298748ba03c2c398924ceaa6462432db5062df36dae4ab7b8f7bef6d07b324700e6104d45a63557756bdceb5d049cb0f95cd8d2658e6b638fa86303c65e8f144e8624b3215b6db0e5a453956d9a9d5bb779f74de6fd7b9630676cc1d3c85464893b0f7debb70736861e0dc3b67ebbd0c987df9ae6ec8f56057ae91e8bb99e1f206101ae93fc76b55ca9d6eaa20c0b24391d39b29f1f25abf770e0aa24d06dc921db724c9e38e9bd7f8df6761c9f8b6599320103e3374552c410f1d1fcee67e7e740eda708ee8e791453668b35bb02a88ae67170a5aceefcc7a44c3a215e3c5e82806f1d1c96878d0935f508ef946dd90b7b0932116a2ca1549d81237849f71c5064c5a925c68a3abaf123bf49c747bbb17f43ddae7de6282316bf379d326343522a9ee07055275397dfa4260bf004a9da8fbe03fbc3adcdc7a7c180679a18c85bb0e25c737afe2b2e94aa7ac5b8aa3ea78ac82e4445867d0c036dd67d51ebe88258c863669552210c9a49e588848b1761d753981bbf63a5366b0212b88aa1d80e2136292ecd84d856fefbdbbb4f00b4be1af527f07169a41ba6a78c7cb64f5ce65a2df188485d169c3c8390704472202607be06c43da4ca53770fe7a054a169cced0d5d8880f3fc9aa941926124515b4abc89ba233b68bae0e153b92ad63ef59788b8a6f217f1b5b045afc25dfbfecce3d99f6fa6037c4a6588abae8f841d1e90a957d5a417ab17dcfad749131e9ff7fd8e6d0c232fc6d3b5626b26c7d931124b7cd1d26a6e69514509cdcb0a88194cb88da85c00db90052284c6acfdf7018efc97c09d2c4e8e166f595ccff58a6eb24b4dd8c1bb2327c5bf7b982c3d493a7bcc98128230067db8deaee8e0cf09f5ce528c039e7cba3cba145269531c992e984a61216ed52f165c39b4e192ca0943d2352495d50833bce84efbae31acc6813a5d974d471f2a2f2a2b51c0426c828cf80a8506cd586e3efd218ff4814d588f33c0404b3b8a163c05b86a6d18525fcffffc1385a86e5b0be17e96d3bef9d2343fad9ff778f6f7ba2f782a30ac6b193bcaacfd56fbbcd705c064df37ebdf71ec71313387fc811335ba1eca6ed6dec9f560d04e49c4052b65df5e8f832dc86f3fcbc2d1bee37438447b59270d44a6b608758e1de5135aabc2684db39232556d1495501da19508143ca1ab55d5f82bd5f5b36d60d39e276e4339bb38fc0d54fbdc96581e201ceda63fa48acef7f96d900c1126e5803133c2a9ca6404d3e22bcc0c4806a3b4b2295095fa8329479b781945d93c5d7ab17f3dcfeff9fb748ce2990823172e19a6c0cdb3e9ecd030426b9c3f2e009276236c8e158c96601c1b0e2dbeec0fb55ac5539d84664c46b441cdbc4b73615c7dd44ef738fc755d2214a297d5c02c944b1c84c91bf3c7d60b67d2b5e306aa17841daa0b9c0610a7ae8f8a8d2a8e29a4ab56cd450548cc117c4a660c5f0262de9c5c96603949231a74d14943385cf2aec45a94acb38d9654bc2e193a564296e041a463605d6c5e887aa87836ae93db17afa39953111eb96a5170f9e58152157882165558c0dabe285d7042809a47ca3404ddcc54adf9af39e86b016debfaff7de65849e44e66806ce315b57735fa0dafc422fc917f3e4d77b9ac54b0fcd174235fcdf9f3ddeccee316a42089b7120630d10158affcf33808e7bf7ddfc92554a19cfaa27ecb46106a02c2003e07d178c1ebb24e79c2be1d7c739e7f0cb39df00f87a8f7bf7fdff7f07a85486ff7f17503975d692a6305048d0eab28ae500bd4806ffeb2cbc25ef8c31eb1adf1def4224e79c7390a42be7352d880b9273ce39e79cc3af4f8a0feea3c5311cd51ac05855625ed01879a0a0843ce876a0c09630f491ea15c2c0ac3b94e10fc21822d092e5298ae53bbd2237456229595447779d6f652f49dd10c839040abb879c963530a0af0a705558b8c48a315d2d2dbe88924c2f332a199f931da37d41477f88b9a144d81e2d3aba50a4210dcbd3a4fa7fee98b6d8adecbdf71ec35ddef13c03cb79530f3cc3f20c0707c73bb8747368e10c1ad7ffffb2ab0cffffffafd4c40e9cf9de21993c65993d31a97c4ac811632a814269056cafb0f3c980e6a3e98e3b1bce39af456a2c3cf3dcb82739214cda3fe236ab11e0412b1ebb962da2a6f4b561c93f2763ecfbff972e917ce9e19e1001f58cc349a95979765003342581eca1bf76f62696be7dffd4ed9d270067fa27fd14edd691e9516a831584823c60a96684156347abb8611c77304c988dc9a804b097940201c88e00c3180400410441184a134552e4031400030fc078c8843430284028160743812010000a0404a0301800008301e0802018081284e594c46b173f2870a0ebe8d4aa48459fcbdc4c2453f163e33db7746b27c508b3db24c60bebd3a0c067292e776a9daa8aa905c5c3aa4767747005d78c5748dafdf1b42a5bc1f09c4e447cd8a91825ad7db667b3c4b0635a2a3f7450604fd5e091d0ec3974cd414f82ec0cb5b3e6d7a6abe135e9b86cc815b432a16088f84c026648d1a5e3a8c666fe6ffaf868f4acf7073744fa4e5e521c5d2a35282c027291013fae25dcc04602e79e1dfdc5575830a913698a14433c341dfeb74f97465accead1f0b27c327ba5a1159d481ab4c56117a06381df3fde38c961c5cd1356793be885a676c5ca797d1e8698ba8660e73a27ae25e921a23b21512e0b77966e42e48beac2e256bef4aaf0ccea44dec684eea1823749315831f564a5f911079e87d4252dd7d19e9ec1b1153a023cbf4099d0fc43d08280a5603d676943e8701af54f3144f91f83a099513a8688fe700212c66c021470edc9e21a31c71c80699983ca77361a9940445652c12409774b422782c96f7736833a53c874035e487e56c80c44133e36f11f951deb5150696b5856f64c920e4e5be8e70b9188348aa60010466ee4b279aa95e066a5696baf6bbf5e26e1805537fcc126b8583192a0a6bb508c35266075069b33edbf63510d20dbd3b176c8c0b9437fbd34c726424e2712cca6f5cba25174648d928ea2e87ebc28193aa2260df328f9deca8d27f5d4d68d728ccef2d8c258c47259b29776a0f853ca0a93374b3871da223b8568cd7205ef804befb071ee39494eb431a1d583354b4e3056562269af981fdc9fd1ade2bd1773ace3cfde05d1655bbd8d16cf3c082d9b890426acc33a0b79e966d49ec5892081af514f2191646a3caa1d2b18e049b089c27a24cabb93849e10dbfd35c68067d8daf1802be360494f0ba2ccb6df92d6e693b4112c69630c194d5ede448f5b2b33428e648885a12165040239dd20e66f976d1d05bce4e8036b0e9a4fae649ac4013cd42c15c52394dd398133fa22368819844939d0ab9774f48073a65d46e9ff45cdd71d88920be2a125db292aa8648daa01dd52fced148a502be21c21d8d4f3b80fbc9d1dba239ba8588edd81d79179a74e0f9d484e77d255342a524944d0b4975a474985d4da4059d930ccc2cbc6b42233ef9637cb0ed6d41336564d9b36d370d13d0e4504c4283fa339114587dc1d56b6603f104cc118a3885aba1d4429b7bd7c057260f237c06d0c6ca656753f183f5e258944960c527339d9364907318b3a90009c0abd29e26f248b9d7a4bc95e31528c99e1872a87e25e3087319252d3613883e3282f3d81033433e6c5e51b0d3f9d90b822ed31ad6151f790b5d659a2d8b1e9b00e22c8d7778941e4cbe2dde212e54f316b5e5898d42fd5b9e735e14ba4f9bd0019981cebe1ca9349427ebc7d717317210c79d8e1a938e4cb2681175710b10151678a531cce141603cdf9456689030ed4e2cee82280c0791bf627097eab40f52a9c11f38ab8e61b560f873d57b60a9ce050030effe983e2f2c2af1946dc374de64ae68a3b05e628703ab7dd20c987f8280ba8d137c0a03524e1086695c27f42fe163b869882ed6ae888d9cd6060e5347fcc623b4ba9dfa5f93a0c721e6e1895196d707c404b8c42a7d01016ab88b3707dd15084fac8923cf917bc257661a131cc07a7a1f122252a29583c4ed34887ed473fcf6d2b6507cef39c3318f34971dd54eecf0eed4158a556a90bf785531000cfcf4262492c8a7b561b2a8a140c462064a7abc22243836e76f48bc3447031462f5e185218c04e3846d4e3ed0f14cf08b162ca465535fbde9a896f7bb7352df2cc6f0cfeb0c90da386f01f9610cc7efa4961e2247402d2c006d8db8f5cadc2114231f3304f09aba2233272d544a91dc1870e93b2160c068cef002000885a6e55158c4ac58e603b8838f950e83d603dee76d5dda9dec15b75f15a66678d868c719b9c74187816cdc546583b5620ebe4f9a8371bb3d2938384618ad9769bf355edd416f49744616e90f996c44e0165966695c37690cc5a6959cf2f56c559ec468af7a1a1f001c84a655a37866571ae205db5690cc8ad8a7975092200df723171522d20424f0a3ad19beea80f059293f5e9606a5fbbeb1ddb7b787033baaba9b33c0ce87254a76371c1b46dc931a8d0ae0dc324e5536adbaa33476c286a2592f12facc809393a645f08969fed34743fb0c8a3a221109e35040835518535c35b4b4072f2c22e821f05f7e65f915d53b2b84cf62b851506e5c7be48a3c0f16c1691a26a090be284df45f390a1187591d1755abb3108024e9100c42bb1c2c870cc34f0b9afa6d3d2e5912cb6c503a204e0f21f6ad919d6a02647e21472fb92997a551e8a371b1d663b80ee38ceeca188e3f247cc16febed35905d318529d07b1042125bd15d23c1060e5c6bc1356bd3de0e06189af1b1e744873ec8f1a38ead3cc8d16c03f70b23be13dfe18b89ae1c7c839c89fff336027c5e0d1ceeac04b0a70cf77b9a11453f1ae43650da52869fb7ea9a73277bec9917c6b5e75b456aa5868428544ff4953b784f181003c2449d13475d410875b4b30e49f4e44e4699d85f3eb9c6ce50e6b46122322417df25090a3db24f81945b42167a35524a16b2a02589d3a0c89ec3c82ab3f1635711cf364d8a983fe522f87dd4f2164e9850409431e62d868f7b697f316e834ecb7c24fc381a1db93b1c4ec4acaae4b1037b4ff2c1bae84545bd5200b71e39f820804b28c09a834d882bc82fbd421d4eb36b324d943147fead7663e9425f5b9d94b7e4eadaac9e58adf299eb90366b127171951176ce8ff7beadc5ac33da05247c35decd9a3b7df41bbf2d3f9f881d8efdec0e3fb32c47328c870a15a47ba9943c918880786cc6c06d32626a74c8e7c4822e8bd32f3aeae9a9a5075b281d055808e75e3668e90b2b659fce960361e8b8a92e303594421800bf51a9a5b1a9b22c0d4f761f1240923ce009eff3c58c6e18c592fb9f3ee386d99f95be90953ec009cefe0a2190f86ce02175f3cff961d4d288eb0d49423e249b55f233cb1ad1dfccbe020132c33a48665acda12b05c96f1c6c22b62e0a35ed55b3c5353e769c347471a8d6583c4d4a5e46469bd83260198a1c07f0e4f371c5a18cb6a5a79621aa2628acb5a869b25a827e7212e8ab7d29a21e206adc8d6f3e00cea882c7d414161336b29994363889d172235c5dcab0f9248bbb44ba2aae79046684b2882286d64343921a30fabe4b2e41d412ebf057385a905900d41f1291768c2a4e442d998ab503a46eec8e6004915e0f20052fff516541af3f5262ad44126551b5a5d0662dbf07252c28f9419d64ea1463d80c52f8e0dbb09d966e729c9ff697565461f018581a349e9ce1b01a6d2934a08b6b55231770f18edfb0633850734612c168cca46482c2e0b1190e6d836779cbb8aa7c37ae3d730ea4229cf6071b39b4e3a11bbd3182c4b48d1b46a3de9a9d6fd8b2b857459f9a458420bcc6813f26f5ddd69e7b5c59436d4c59552cd8f32cf9de7466a915d83b5bdcfddb0dda527e42209a5253aa688d4da8edde39c19d5cd63ef76123bd095b207f5b5d1bbe6cf4612e3ec2e0e15df880eba411a3da7c60da2d1c43a569d16a54799a51b51a0b5f871b963724c44ad7141cfdf9b4e8dea47dba35b3d33bcd0eed7c99fcfb6a101ee8e5229c24982779f4825200d558281c0d895b6a9abbea1507fc7ff8155f491cdb17b628a11d5e1f5f4c5fc11e49dc7f9b24d3ce5d3bb8449c4985e0eb8edb5e43ab0f17df8c4688c5c26244d4cb46fc72eaaee714c84a1f21a03b82fc29681cd98655e427a3eb77c11853605e8dd4aae3e3bfcae4e244ba8130c84d0d19bc0b0c3f2e127121b240cb0422d9335e01565122dba8bc88c050d74780265932a51ac3a1deb79b9ff6f913f18399b724a3d7f96e244dd552308b9e9a6437b7082b9a7692b48854d22e1ce2206596801ab8c7204546ef0b729b3e41fa61186be82f6313394adbdb1a94a07c15eac1a08551b012c8d0ee91de75aa9d25e91404b50597d5f5f3f04957a69156ca7c980050210a5ac35d10d53ab46f757bbc288f028b80102d6869f28444a464efec060bc0b0432c9cf9353418129467744e72e17406f2e8182d85a4f2e001ff0f905a0fd735c33d8d979f1514138307784fb5053c82aaaf3c958217656220f352628583f2d60d2d39303f0a427c70ac4630aed45c83ee92cd840160214adc7ff80afe7c60e9e88ce49eb925c8a0813e76764d6ecc66adf23642161cd592927677da458c71f27c72eb5848cfcbdc3513d601c7e6259af7b9a4eb6de70d022f5d82ac479d72c73f7cc9e009deb2fee1e2ad2461a43a11224519bea0b338526cd1c931b95c7d7451c576b6a90bee4428b138e2f5bf1f57407e407a694d4f28960e175af2b42ccc0e99bcbd6040b3649d0f1f144051743bea64647c690a8c4e711ad8886df3a288ebd6429d84544d6bb097634ae6e8f6e024d0e692cbdc23c8e17c7bf8d7e434c2dbc01f5e969041c64fa7d99c7a636d75dbf7393dd115dd6b7b741e869cdfd44855a941782954da6cbee4f136c44d9dddaab902bda175aa4653dc48bc96c68bea931316d1c3b9836a196d20052da813fa7286d6632545cf4b15dad823df9af9fc8e1a12d46067153479d4954c73c0c046d62b446358cecb3c9c3ec6de0790588717eb39c4427f13789cf8431f71af0b75c29bc1c18d9f182607b669a036d6cb59d88abbdb0184fc676af77f127b2148e7b5693ed1dedb43bce60a5f1a226123480c9e613661d0631b45047cba33974439fd86f0c6ca70586bf649e00a85542337779875050fd56a407e9e1ce64cc55dd995cc2d08a120b276504a18d1dc4b48db0c3d449c8c4e2dda54ab242584043e0503b5d4645cc963245a17d7b2c7725bcfa8c6a886401e2587c74ec01bf02728a0fb136b4bb2bb4fefe75410672304ed34ec962b6075e12306cdd1ce514266b8c50f91ef0963da2df81365e554e3c172e5b01b9e2d655c7cf665abc328a269263941e057c1a1a64a1984126b0caddfbd8b3f3863f4a5c0f1650108f5e4c58fb8d2ee53ed07b0a72f019297e9edcc79d484c77c79a735067594668477b8e809c825cac7d4de201906c11b1e7e06cab001da9ae4ab62f110f8c63b18a380f9555f15e926a2565f7ddb97061d1b780b5a4bfca389e347b09fe238baff288660973744faae57d02099f86a6af17b44cd44e696d2997cb793cc165c9043c58dda40256f3abf8712d1dcd434c8c0ad141fe8ec72b2c490f429a49d2514dc909c186d3e7f32f98d5be181df19409929f7fab034ae46e19a92c82274861e7e8b3f3e6f6e6eb8d1f528a79cdd5c034dd495df29fd7946da2d36438130e7a4493200325630cd2ed9964bbc90bd2839c58027e50c337112670d702f19fba25053ad5b87fc1c8ef6d49615c96d8ad1903e8598ae8662cb371aea19551c483faf3bf2ab795d32dda391bfbd1f94e6713bdd5d3c3f60eadbe537130ba8340c8434c2f19b1d00e8d8bb90eaa8ffe4990d45e5b64b12c9120c6ece391034d351e1b8fd98d14f066f4b303a4568d263e3077098e75cb55281bfe1e8f80697835c215b89fe526e0667e782b605ab8acb8db4c2b0b5e0424556e048c3ddf41fe90286b64d14c9d050e85accf965c701587277cdc2e9260fe4dc3d70685f10ad7eb2598ac7e605ab409f1ddba0a44649cad31719114e7313ca980f2c10230e60767de14aa512361a9b9b661fa443fd2017a66d1e379179e68961048152d3fbdbe1218d921089a6dbe3914128954e8f6f71371740513659df55c4ad6b972e60e6d55876497a6f89d665490a0281a474e68e47d9ebd164520c5d2dc84de396b4026c8599947cde859f523605b4770570225c721b17e798218a22c84caa07f6a532f6501a82230c6d5778888cd672b74b48790516613016f0c2392b93f95a25954254997dfb908bb13ba69e6e9a579f1c9454274b201220565be09a360dc4db59c88d113e51f350c91dc04f3b6a97a4bd86235424c086cb7a68cf89d73f536454ed8481208574f41152492cf3132ef1b15c51c730d88a8cebc6d1bde8782212cc463c3064bd68cc3f96c23c3fbf172f25394d3caf705a1a3ffba1d87bb1b4f8e763cfaefc9a12e83118d03d0999907349b355ab27d2224de4df0c6b58dd861d3f73365f574e0f3ab4ce1c2c831228b268d2be0928d462c404d37dd28dd9ffd46a534e9b0bd198ec8a7cf28ca0dd099ee375a1373e2cd1d3f3f6823c43e24f4ff0723044395ab3e6412170ee55c69c4f1262482fab6591b70cf6ba9b2edf76c179cfc1e98edd840741e2cf81772b9140158af623b5e0386012f8ea4c87d82413100a03f651f1d55bc312184c0e2a8da580f989f00f3a4c1e0c04f66c3011d3827e586ab6cdc7d07caa57388fc54bb6eb0f64fb43d1293ff22c69193c71534e33939e39afe1d2298fd9e2dd760854c61f216258c418a6cbb61483d5e5cd5e764d91fd7fc61dc242f29ea468c23fe757c7a40c474ddda1904851b67bcf23b89f1e9a320f24c7a6397d7716a5dd4d980008e2bf981c977aa1ecad567e1730a2e490885926b5cc2fcfa24627976c3c7eb5b9441c69ce6de8d43e00995180790cd4fa6181ccb7cb92d0d1d3320a18562b4e14722b86777e9311ae100d7e42028921e77cbfdfc5768440abb41d82b443db90eb985a650c644ea4753eb2519607e8414fbd2216c1e0c83412b49dd0cb349c21e60e26d8017b5647aa424ad3adf01e63652478ea71b692cac5e969335b793373922ebfa5e9078138a8c8bedcf8560ee00dc15634e812c7e32b193a811d11574e0906313d82cde8a0f7048431f99212a6df3e1c06bbf391227165f4f9b9a405f8fc744c167d3879c31c20f766392da0e974e5a3fa87e51ac9844ff4637e2b3fededb431aa90b5a6697c881d8f6d1d69c3dbe7c5015125bbba599153c6ad268c5ea636058d2badc46cdc806aaf0d80ee7c39fc6f5cd181a70368a6763d1d393b45a5f68499e5948eba2ec5d9f512a454c1dfe3ced03a225635a64658d77d6bc3323a39ad663e3237c4419634a84d4b6382c62ce6bdd0b8e258eea40bf4944720f8d6bdc40ce6f3d13856ac4bba586c7576d82e9109bb0e218502989c6189ffa93e6b8494a929f1911a26145e2667c972252edb11a42300f5f8c6ed8845c441f7bc76486a5db38bbe39b7ab100ba66f5101e4f5b3bd9a673d90bf7666c53cb7b06526dab0355907210d5834a94774b2c2faea8c11c620e199c13a91ddfd4b0bf8295a7e90a1f2eb32c5853576c720d4cd1dbb48ee6969eb0bb794548ce17165a347c2b165ce7f0a825f1b3112d1e31949d83b692b8acc6fa8d2fbda961930588a00865b705a4cf0c78af6a098980c5619b77270d0b4678f1bea97350f2c6386ebee23c8b866cc94f33697290f41cfae3a758739a322511f08d3770f778f8b45e9c0b4692efd5d38afc4a82b70a8f7b6936336ed6d7b1d54aad82b18af7cb2c4abcab9a6cd9728c63e34324cbf92c89af895061d664f1e226f1629c5edd2309e3747f03b4e490f572c953f561c465d98634d9e64a4277fc2dff28b6cb484802b54c8b2e27b631ad0de9f846056c9ce00211297106380e3f2ef3f1a041a5e060635efd209fa433a8d11c86e075c22d0d651fef710a2e6592c6b828eec00952649b7a4b4a003029ab5fa1e2577db68ef7eb28e750322801adc114049ae86246f32a8741fc5206a6ee4f445e9a5232056ba213893f4514f438c2a8cf5733f573c8fc0e7ca0bb09517757b9ad556328c4ca28482fc7873671842bfaee64f0139c01276a6402dcd56b38e5dbe0e26cf13747ca8049f81f70575f730b1c3585a04cc765750de29b989d96a9a9c7668541718319fdf953ee18bc95b4bd89c221c11f1484409ac95a86aa08b034ef60de9f83e9cd8afede30b38a3fd256ea9757e0f41e2e5214dbfb90952bdbc2fb83c5a53443730b47da057a6e458e0d2d4ac9306f2d17c5982f4fafd3970143328615e7a8540a8d3bd7fef677a9b801cdecf811c04051e98e840aaa57d0a34df913c05ed0640c071b97fa631405fb730c6bd49fd409c31fb11f0cb1e1272a92e191846974b2fe1d37208d7e0c3512faab115e10dc39982113b4bd3ee23214ded1c0e1c9202405524846811215d1faf8e6be2bc37728f0644cc0b003e6adf223545b8378cb00bc9914457d0a93554c656ee7ca0cbd4564956e82f66c2c4b66aae3d1a9d3872544754425ff48740cc4d8ca62d1ddd2eb45bd15cf3814fb90eabb48c7b1ee3c8ae7c1c68e281c8788e5f21dd23a5ece7f03e99f1fa14c3b476e812c348e1f697e7668877ce4d8d8d05d3f35b681113f82ed1aabacec70e269e69b47583c0a46242fa02cd41ce996e37e16951e86202dd60232a1b247f62c1404f8d12629e9a5c1e27e3493eb8dd54a1092fc472d33ae09a0722b888a0ba09620b0677a12a158de10eaf0eff885cf2e18e01dda9ded666cf943ffee2252a52f85275f1914c8dc3c1223a44ab468665f286f0c53b21a2171e27cf0b4a5dc8c9f003883e7e181bf90b3c9d32ea536e669047eba18a6653da9d493a9104df6186ccca39248ea08c07d3f66a623684362d8844f00a6a6def45e99775ccbe731d84a8b60fa8e811925002dcc1280398afb9618a8dff3bb75581e32c94eeedd3ce5fd9111684e72b1ca1ddbe2fd90c953fd3015306b44588385d4d4ff77acd356c52a6a0f7cbae9af057bc13d75a81564b61db136c9080981aa422f00bf60c23b6d033206b3fc3f5ac044aaa02dbeb2d8acec867c63c1c7934706bb458d2ac98f92336305e2aa55a25b3ba3f38c8534f7c24438eaf1b18f93b84417580da50184be38aef743ae59305946a563231b2fb9549047170b47d6a55232a81218558fce280aabf33a27e03364f239953f10bb96f0c105493a249ff665c8e7e4a016e56cc4a049fcbe139891632986ebe522ff0e97f727ae46ec92a4c52f8624725743136082734a53602cc94e6635aab9c8dfc6319189b5ae54c6b486c4853ac6ea27d829722ab334093a40ec95b2cf8718804a0e8fd4e5fecc6fba663e238eb8b31de896f914050e00b1c6caeb2ea590d34d868d2abe1dcb1906e1326265ddd8156c52516d21d5574192f2a91f0dd1becf620e0f9c01645f906afeab48fd511f618253059ffdfe53e7ad1470c930f56be4444019fc9c061305dfd926a5c539d0a0742163835b5f5bd444cd7aa260afb7904c282da67bbb944a233ee212a2e56a0ee78a2690f4c2b5b43e3788bd66156f0a27a75094eb871c5a9f350642f465e0e6390cc5f0c7df8461b4417c5678e0abae15664b31a92edf4a8f01006ff879b4242e72c8a0061a039035c3c1f860c35c82e89961409b4b1bb6c0a3f22be0c3aa44e73434ca5bcac2db87f5e043af80d86e38db1bb5c56b870f08b58d136d6bcee279023b7aa8ac90173ee275d10aa19390e081d681988cea733c8c4128ec24221d9511ecf170475006962ac30db8339381e9278e0af5e3ee2028ce16220082112d91f63c1e418e3073b9bbd4c946e7e0c5dbda25d22ea051ef576bdf42d8f021f26f1487a564474ad220d5ccf4e873f45864407e0982ebb8a4db72fa4c450fdfaa276fa82f47eeb1b46124bff4281cf5ce6a750365a646f230481a20f2ddc9ec150e8294750f66136405f7b8f340ad324a0a278e9d0b7aaf72e34bdc4931f67fba966f7c68292ce21cffb91775e483114749043ac583b2bd955ac34cd0b2bb3ee2c080aa4f987c3aac7708c678a71ae130f6de901816dd290c455284daa2b0b50c28c5453a79ef8dde405f36d37240687483a3463f3afb45b2af09cdb1ba8d0e80c075076c754b09d353eb06e4324ba5d8c6ac1823f6b23a52fa0c23421a9123433ee368a25e7108e383227d88a7db582b8748634d91e527c26b99b4fd09b459d420866f39b5376bf04d78b91dcb709c8ea9d2791fba6b0d1892dc97c9d9a8cb4308122eded72fcf201795e2344026e0aa778ba268bdb8c9e296e757552ba25b47cbb6c51345841b9ad474f51c85211d21bfe4a78a0295a702672265246cf24d8d71e29deccb89a1e3e3780500c4bc7bd526829218ff6335b3c793296799ad0be4c95d0200bd42ff78cbdcfbbdbc742c414ef3e36a7e317f033c8d113d66104409b61206a553cfec0b9339e152467fac5ed201d2b17a59c6a20afcb476bfebd4877e85031c2a014aa20c2555708c6975d8e7f05f3411bc1312f83789c2b3bdf5fdfd2804334dba832298261c00e613f3a5e6c50b62d135a1ed4ad8074b161653c23e7424c1da0600dc06175c70e2c9936f3aa4ee4be616fb98d9bf779252cabd7735024302360227398260bb0d138628a5b20c29e7f1ff3f5497acee7379a4004173c4b61116c586a2c55f71ab615915249c0a0ee1e06655608ea269d225a87d5ba6c5e93082493699cbeb1d2ac6a98413fe317c4c73e5b949252b97cda2becc272a929648b4b586a4230cac58cb367facdb269b063f966bc32800091474f2efe062b81d8acddf168a50ce9d9ce354cc6f8be30c1666f3e6c641cb0f39dcd17b13db31b9a6a98e4e675ea7b958f7b8f3ff05193e37a830d3a0f673df6bb7792e272b068d3fc6b26b76e752e49c83f49aa04896aede94856b86cf0d557238e6db301f4070315749d174e6f494e63f67b9dcffff990ee28c28d4a3aefe5626244980a052cd20b341d37950ca59b1b135fbcc2b8ebbc7ee8c7e7b951983b1343732fe6fbfad51f083f3a09084f7f5d7bbdb7d5f3a8e6474944f9e3366470a2050916f9e2a9f9e21fb05ea4ae5a9c80eea49224f9046f1f6ae89a743871d79ccf6141e1b9aeb9280493a400bc3061fa723dbd9359cbf9280142e2349b7c31975c3db85f590dd4d51734e2a5e2e976b972d4544a3115a4d3a4c1fe5116a470a1e4e4d728a66c37619cabb1d531ed8044c1c927686376523d621266008cd6e11765f960903eb42f4a2148dbde3b4d66faf482d7495da23d82947e52021a145407129c6657f9b302cba1cd77ba83a99d7e880dbdda3759e2a6688f63e7133c66b5b7d8485058bacf025ddeb851d5c8b2ba0aca8b404839469a5960931720a2f871348dc1affff465db2f26fff71ef23ad2acca7fef8295d9a604d33c737810d3c1d4671a246dff5c915e7c44d429d1ca689cff7ff7fcab906a119a1aa249c289455961b83b7a2f602e8abc6d69ee9fa268801f50ac60ba7590827514611a2010cf36cf8139dd73610e6294752ab8f12392b3af8bc10fd71ceb9ceac2377d8b94341caa40f29284145dcf7ffff3fa0bb6a4e55ce108d9765d5ca8c05ddf40a04d214d4cc8efd6b719a7b0d2e75ced3415ab8357b1931ddb2779c9ca2343bc9bc197a5b58cdea7e4fc67a7f374318559895d5f346ccd7d193729e806ba9470b462a66e9ece53dfb11b043ec3656eee30697656a364d9f735e748df2516449d25460f734f70dca13c6dc092a77cd721c68fc64d76d5235adda92d544fe2c6896f485712bb37aae8eca326a9f28a6d0d87b999d6c20834834caae17ab2237e96397f5fcff8db48331ef5e3c391771818b7408c0e2209923c7f99d7852cd3ea641b0c77ff8a74fd6961f47a3defbcac65b9a3c85b549fce446da3bfc1aa9afe602c9a9c8a1f6d1a283ff711538b7003bb7578f83d74f5e21ae9c803700db70b06b14345d0db54d169a2b7396ba37a65308055a1e22be349b80036051ae66ede3064345900b33e0d4889441257663ab2c6b861137352385011b844ee4c7dd3dc546e18671baaae804fbab853ab926adffc7af7bfb68b04d397bf663fc4fc27f2af08db4227aefbdf7aed2f5747703d119ebc3d90f56555f72419974afae0a1e2cb9001e552c1599ed0f1930816131a9094165217d5e8cc9369b101e9614d83e11e2081276499e2ac1387a49817bfcff034bc005aa198e88232e289c9c30f63e557576403b072760cfde39e79cc32ee7bc458b79084e4eb97c57de871ee7bc48bbfc3010bd3f37e7756f25d4ae7848b4a555d38a2e7e59663b6dc5a1798f609b9cf3ff7fa12e595d9dcc02056a5b10c88ec1a38cac136822b41842535b6b0186eda55997c8d66939d41863b1ffffb3a72e59ddbd8268fe1f33f1940fcf1db24443923f983f1ff6ac478fafcc6efeff07e99683c4cf1f57af7bac30e96d508910ce5f0a2cb032ea3161448634278b57522dc0361344313b67b6c035e7b10cc95427339d6ffcfffec7ac8ad97247540bb49be48fd833b9e2c64578b4b4157936c0e0cdc621d2b81142469090b736424e9486f73424042241fc9e6b68c277b0eded15a7f73f6ef54975db3b57c8f24dc6bca51f05feff737e0583681533509c60f71a4360d632e6a58414c22b04163ccf2aa82a19a99bf6df23cae80addeab37b504dd7e783403bb3177f6824a10ad2cc8b3592588c690d517d340d18936cb0f861f2999dfc5e22456d114b133f10f602349da9130d4bcacb67a533db107d44a16dc303731ee22e7bc789b932efffffd1590f79565b2c3e9e1fb0ab2c47b5b89568bf8f5dd3d3846e5ab0cb38dc6eecf8e276359a22337043cfd9e9f573fe721e57401d696fd80fa478a092da3cd420d560fad108069d891dc130b0697a131087a6a12c35c5a190d923368c6996c7930a5721caf6f935f61e1f958dc4985795ad2003d5085828918c981a379a332ae873032675aaab0692300806100073cc81a9f7382428dded7fc8b395feff94cb2a2396bdeb9e963b9aea022e8632035ccd992ab30c44cdd481b03524d6f0898caa94ea6121b4559c8c08b861bdb01fcc5f9860efbdf772d137053867401a71289280696dc99e596a79c4e4f6022a59f3ee04b0835a956151ffff2f75c98a41c76885060e1b551744143a98e2792b012602c5d40990fee9721e3fbae8eccb2b88c9e6a225c5194236718476769ca4bdfb07285ed988259a1f52bc80a1010d61b08e6ca2d221168f0adb47766f3c50c3a28d7d5b454c35bc0315149975b2cb37f44e22d27bef46358cd88cde881e883e62cd6fc875ce39efd034eddded901424e1cda7950386e415bae4006dca2f6f5386ff4dc888aa37516044613255302ca724509174f7e8aea4d420db03f179be38951ceac3ee7f677f429c73ae39ff2d185d0c2e18873af3ff7f13455db27ecee9b68c7315826bddc779b91cce4ac346f3b6d737a7ffc3e3bda441c1a9e0d74e0e59727ee285b7961f1716b7aa51da1682b4e8aeecc2728fed45693b6690dfd43e18a995e518d35a41fa5cb9059530e3c1a46f122bdc5a129a7310d7087da2f2dd4bf0ffbfc43f510fe79c43f5def7b877879d345c6b2c8e57d8b51b95000becbd7718deab02d393dddd7fd0a0a8d80dde8aa588f943e5e861858f0c172a9dcd5316c0719768b1dd36de29354bdc96dd9f3297ffbfff31c98fc9559f501f955a0baa6b215d6c75a35e53401837e79cef929cbb9c23858851aaa6ff2f4ab448561480048d72d4d3c98fc3c14f3da6cde367dc7d70725ae2932163bfdc189efe57be1d6b53c0f2c5d603e4226c4c478a252ca7d95c81b5a2b977028d48a8e430986c00001a7318040041c44020ca0349ce6b0e1480030cb464d47c402c3440302c0c050241201014060800412010080803c1214130102288cc2a81d900274f314dc2131d5086676ed4461267348a21737faae536ba0c141856d29634c23f32dd6caa60729082f761f46567f05ea51d9f630893a5754d30e29aecfd6dc6120b074725356a46364a531d7125208dd3b55b135eeb2a9917b812be01c76e88618fe877922ae751d8d2d061a490b70ecb25751ff44d203858fb62932e9b4ef99c5f445243c24a6fd8da2ff6229bc83908955d42a017d61d0784cc185e1d4208e8305268a5bc88f9141b51d801700118e46c489c3d2da342c3e73036d691ad7f435fb5d601bc61c707f32660116e546f070eee2705c63ac0be1418b7e306c0dac1086ebb405addca99d51384fa908b088efbd380a80334b8bfadd69e493929814bec244523e7884ddc94a7c7d9cadf3437b4b38a432c3b9e05cec97751fc5cc8bb6b9cc126122e207f34547e9ed77d4a3de3539e7697270097d65a39cd26371d46e59e59ca56668152866f3433bee300892a63e42fa8e75ccd5606ad81ebe45659438c25f8bf6f385f34651c836154c0da536a6bc33de03274e69ff3e447006843628756ed85b7debf0195640bf79fb346b2f3691c6812455567d43e2d1b56afa430040fbb00054f113800d655e401457d7201cc220e51dd17778cb34e012a3736d631d79b3dbdc6a684e7405770c614502888b95f4d02f95fdb34d00258723122916723183984cf647037366b7080c1311b9de9083cdce23109c811c5d5cb816d30197bd2481b4fac4966220488bb89bbfb2e76632c2bab99425bf89f65a492c9a633fc13d3096f30e19d6bac2c6c96b15c634deac0473cf1598cff9315ae4ed77d72a0356a86f296b4dba326e1b72eb2866d437bcd1e98adf2b0a98c77c5cd832c3937820f22c8ce0daa09681bbb3c8cc414a4227642c93ba4bad69945b452f98d6af2d2f68f13abd16c51deffbdba60375264942f20c37b69efbd023ed1998af35e351c85beeae697647352d052b2a9ee2036b3b0e064a5228a7a711c612842556b8c03ccb2e1121230e016c9452d6e163c8af2f963f71b081aa32d52c73cdd105061e88aca8fe336699b4263ff0452b184b11408235cf42aabc8d3f2c6ec4c5952a494796be5190c34d6a6da7ee3f87dc1eee6f392699ffd83930061b7f725cb88b8c3aaadd1df4dbe7c08e94d0d3e5d398789283bdd1d306bcc46814820f2572a524c50d74044a9559768c0fcde7010ee69894c840d4feaf7f109453d00360fd4114631852e21a1d015501c0ed225d2900259091d151634c1734c3da7f8a796f00165cc2c12f5e08a9b206e285e0926e7996bf7545652c31ed725e57f320d590ad59ebb1d15020c9faba9f174b25c48d0eff94582089a5fc17259f29b9fa9f7e031ffd54b25165d251719169ab0d7984783743e362ac0f1abc2cf8c7182c8f5d97935295aabd4e25aea639462b31547f5b7d5abf9a111d506698441ac0f1a89cbaea996313b76842493f9735dde6813696968e9a74c50d7c6aad127f69e3c12ae9873b332d87f815c38f6c102f24c92b387df6cd9ecde5dd6cec27238170b0c0312ace1438c0e6f117ccc485d97baac23966d5e36c61bb417a2accebb260a4f21a859d90a222e2170bc8888e6aa201f348bb7cd4dfbe996a2181d4f3d130843c7f0d033a2b64d4840cc5ac03c7d68941a0e04246672f103adf910b97e3b2f0b63c78f5040e964baea59726d4b2480ec2cf76d7cc72fef8f1a397c90b3c52b4283ae2e0670ce74cfb867e3aeb9d20bf64a5687f4ce3c09a1e480c69bc908a17029f35c41d6b1777d1b4fa69e6221e0197b703025a3e0c5f26c69801eeb4fc072953ada19184712f151116fca04bef3c8161c3bc5af571bdd20c2b16f4b8479267533759230938431b40499f20c0732ee47272de23470110b4a177b15eca89c63239d61f2a8684d8496342b8b95728a8d0d170480ddc9a30c5ff6566081e525ae85dba9249ae9ca6e71053fae812b4bdb8d579455fc069b3d16073db08d81718c6671eb94292969fd72a9511115a58a6f22acb21ba495fac0ca6054a165901fc80e8782f8f130e924447ec51fc0f243f02e7f6209e95aa676db64ab4c96161091a44b23a96f3280cab255acc9e9f36e960df9da8b4a12cc81b6263f74dc6a7a1159be13318d59e11f2384067bd36de286fd8650268d748d67e685e01fc175ee535dc00fdcbdc7c6808f9ab130570d1fff441811a51f319147e3b4a3288f6227c431a20a7647167fd498cbb940df4c07aac00eb586746e0cd41e8377a180509cb9cbbb225b0ede25aefb4942f0074536eeca6dd961fa8184b319f4de3d80d490b0bf12b7d894b9419424e74bc54f3a0f59f04adc40b31e4599b5070c67046516d49682072c12e501eb28cd03cd5d150c9bf50bb96e3825a0ad5462945b5fddc28284bd654669f55bed471f0d80eb793c267322ccc6a2c801ea4f3c12341fc098b34b444f91475accccf34803078f69f67b687ce19300c8fda2761e12e8b3d304a08846938fa04617273a7ce40f6a784f0d77c088c931d2775374f694680baa3a3a2b64715786645b536b929620b785282a1cc7a0dc99f550f93fdcfca96d41bd5145d186db71e7c5421e705e207f329d1a376a882bfc030ab2c8d92b5a3c9fe478d48a00e22b465352715c477751b7fef87d308ceeec89cae712e920611657af214da070b08776f858df0991432cf3e1bbb56c8a99a085182b0a5217ae0e32a4122d71b0a09e127b281ccc52bfe7721d066e625f42d05b3e6152e4d558a2758708022daf6a1c0a6f8975d9fda2b23ac6fbc0edd2c662f561431c0bb71b338ad928d90e071f5ef4a3f1007ae30a0fd72a355b04ee2e9ea62366b80a3ce55d56259f6271a9f8ec852fbd3edb4bd3415ff1c87c90fe8ecec4d444fbc0790a01b978ee87aebcc6473dfa1d18e7e480f204b79ceefc4de2537bee440c8e552f16a3840feaf8a6f23b065d81257dc984a1eceff4464883dea66a9e74453a811290c325410beb0bf44b932aacf2949e6dcf1de1e49aef86435f7f9923c83b458406558740f9a9aaf7f59240ff4abf203f1eb136288567fa8f98839f17481ed1eab06c3c69fa08faa9c0006783522a0bf39167e92381a1b4cc92255e04fba9ccdf7aff4ef31eaf5d44533cca503d994e6dce2874aaa7b2ba1b9005c97c1a119fbfe03b9f6e2e6071f800b5802c14327e268b8fdd0497bb8182b39c140485798312de7b92901f27fb544894b89ff608e9f181f025b7a419cb378e2209f444bd450418bcae20aeaadc4e5ec6b052916b5af864a78eb8525d4cba31dde806cb0e46a944804a69c6331d61a9b02a36e41420d880275b3899a904932a7b607de7c9d8463d5d7edb5163576ebcc913cd213a252112ac7a5d59346c81af9fc33ef66640a1cc12af457bb76f9a0f87f14a1e85abc010914c285d0b26af21a3c06dfe2448ecb525cd747464485cf6cd25bfb2ed4bb0c7d243a0b6872c51c40f00fd89954409ea8e4d2c75c72995e4aea2f696c626801db2de36fa38c11704d718550e8d5fcb67784a47fa467276f8ca23d4264a52873c6db929ce8670f48eca95676fbd67abcf6e95a808616c32bc26cc2120cf6d65aeaee1cf12f3a4dced3eaa61126980af4e6c74edeece7a569c0d5833e4c05c82cc6f1bafcbdf11bd1cf4d08e9917747e73c215cc0bafa72a4212a3380f6aefca73ae005660c1a51175b00c20e6367e76097aa84936c0f122c98ba285615343ac0e53ac070639d5188ef7f191a1a5d2489c43b700008b8bca14f398dd6dbec8d14fa4820f46bf4ee984201290980b906514bbb17151f5c5e29d8a9f576b336ee68acf8c67dffed5faae4c27ab7adbdb6d843b56bfb863656c85cbeb98c4975d6da276e9da06d5d455f451db2e04607c43c061c15746d9629416aa417efee8aa71486f5bcf4ce5a903fc309fb90666e889272b9acc0c2b774518fc07c3c6c40a42c552a2156710523bd0e2be296a02d53a22666e8f583d4abe65bcc55ddc6a21f842a978b0ff3db083c5a32ff9b94701aeb711f4aed526837513868a392a1e9280b79a1fd9168e6461718befb29fc6f64f674ca90884d8c08384407332f46e84de544a1aa075edac334b595e03375d4da4eb48e9165afeec72ea06c0171741ae5f9f843ad67ef3ddf40ccb9df9ad112995e600fd78679bdb79e59b25bdbc8cae4d76c20fd4700955435e78a716393b7b0667944e14d7f33dc937880ae70ad454cb56ac1c995d29c23d4021e25b70b691cf95a11a383bf3ca4038964b2d7da27bcebac7fd62f7083a506e40b6c122d669b364cf8babd671f6fb35ea1f643e17e052ee91d552868e1d01f9e446b3fe068107141787ec85988ebb2576c5a4536deb3b25cf9fe176228d18e588787402a80ebc3620d829c421bb7aefd778d3cc7b737d037d4b811928c8115f8d17f05ccaecfb985430b3a69eaee8b296393d91b8d11cbddd1cfeffd203ecff4e637924e4573cc815cb43c561b57f424449e2fef4f9c349d8c1469357f5988829a5ad0ff9c71092ec1f94ff7275d23a9ff1d5e97e89c0d8b951485f6c60a8d4b671129057f4575c10b7c87e4b83355bcec4a5a88670bbe86a817d898cd86a299790c035ccae6937f69b7b1feef89a2351a3df9b3ca067d31abfcdff602ee3229214a755496d2c645508637ef59fba7b262b17a9f03027cbd4195523970c35ff3a9da7406843642614989ef76f1c6570a29e0ac7c8c5ad08e3435cfa2345797e0929f0128bda1d23084d19c6315196f1e8b1efade88c93450e7429ac248ca06c5924727205c9a1e1b21b61948ce116f5380f535dc51f3e396765c91f9a15c2ff00414f27d1ff6e474c2e658429705045aac2392e561ba3b9a0f4625f30a223bde14175abf0ac4a800086577819e8d317203d2e68b801ac0c29831b3e9eaba221b28187eb32f2e282ad7e8d56df87efb99361a7be5e599a42131cae818158523187a9084f8505f0fce3aa19fc2965d546c5107275d9b3ad7a98dab29457f1a4a39ac565873847975750483f943ca0f72b73528258c963687b81a392fbc176be7007770c5fbc024acbe8adba08d77b07ce8f95e7dc796df00a820b14857f4a4b09e3cb308ebe445fe265549faadc71d605b18d53ac05b57983705ac704aafe8d209c689d9cb1a98947c5041aa25ee4b8ae1cd9a197e14c2d0446528d470ba1324cae6e8934996b40c7c4534c65090c9ce59ed318dc4bd69930649e1b8cf47a915f51421a045c5b8247b111a1dedeb11222bb34121b8e99d8e62bf0e16acdbf520678833715f1e58220b94c0f008d9397847d35b40d3365e235be49cbb5b86091a69912cf6f3fad242a93a2d3380e2bbac45714b1df91283375a5a9d6cd1ff90fc4c22566391e63d45f42bc64255175b311251b54be00ab04244cd0623dcc7912cb21c593028a5e02771c10d6cd3123038f528530754c7857ff3b2d9b7a41a280de3cc146ead317572c2522d402066ae80e23966b7d46a4eb02d2c9c372a97ff2669cc13ca24e37f60e0c3aca4dd06db8cc9c5a940da83df94f6d6c78b4461c69bf1defa47f33e8957b5176a0d685b06c7926ae5f1cf1e907f3866abf55e152d41a1380b93c41e3fe4034ea91b543ae4ab101ab975e2e0b252096c8b4415b83fec1ba2d91e464c07f221e775eabc2c86c95ffcd4e81b04a09682d48d8a725b8d9b86910d92eb2b9c6201cf406a6f1cad8cd7f728f9c8a93ce940b8d15b7eaef28f82087e8678d4423f97842c0d7c9d9b3dfdec42656c1e4a479e3b6e5fde6d8c937e234b052ae0c68a0916f54d2732c41e91d4ba1c741f17be6373d50e3e0b179c72bf7c9442b8de8f904144feb3b4871337754bd07cf940e070c09b90517eb2e430617f80d3f6a0be6431cf06bed784ce39ddbe4ed19a5c223a338bf906536d67c140343992a9c2d1b5b40e9adbea4f226729052b1120db9f862c04ad0a5ac1a8a88db72cc1320ddf8473dcfb750d01fbf93f86abc91e74313ee12f0450a68711d3ef4df4683f0311db209c7d054121c8b09c70e5f19bf07a208384359427953eae748cacf3cbb1a9455c59ef89fca89faa6f1ce38d61ca5de9412926ec0013f7781d0e9f42ec5ab5165af0f9f9ac4b1d95969334caafb022dfeec40c1079477571df27e039ecdfc34dfd580d860415a71ff9f189547c36a7b531c237175a169422de9dd64640c8e9c1247fedf1cf6dbb8a15508a9c203fe1c6e739a1f9ef95da0dca38f371bfae7753b6cc8d34ca8567c8077367d05e4fe0d8e8718bdd7835b9db5749a73e94dcf349df48c45b4c559700e0ad240a0ec48f4e1bdb03e1127b40f4dd2bc162671fc846160e4cdc271cf52501789fdad46773753b8c925d57ed4cf46fc3d68a35afa4296201aad502375af599746aabd5edff2f5ab5083110a56acb9305ce5c3855876694ffff24f66e0c404ce9d0e445aa266cf520e1c680b3107294d8011e750e02f0ad018c8e9d5adf47b7e5cdbcf8510d05ad746a13f33b58d9819ffa906964b0ec2c4f6af4e8758ff1e702ac1e41183e1ac1a7002830e38dcd476ce8b35c964005183fe0a04ac3e0e98a1d5dee94f372ffb19db8b917482c3bfa69dd093beda34f0f6511008cb64442fb7ef46f7bba45123cd61b0d3761537ea1d14cf330903ddad8b479a51828f878e49cb38b582239000e0f6536c01dcd027012b6c17774c9862509ac6ff6fdc305780054028a17425f1b06f118b5e4559c89f605b590ccb81caa9337a73a7e345a809fe7048180760c95d97d5447255bf473023e5572ff3d730b6396aca276c504e375240c6bea8ff78628b5de94062139ca671ad833bfb0cce1e1f714892000a4392bcc63c63b23942ba7c8eb82399039412fa2218199afb9f2fae1d9d0130778a68e9e28436c5159b81225342debf33971ff5d82819c291c7a2dd1e8598b2cf08262999f5dbd3161623e1788c4d3aef36691a69d8796c87e3b5287648288ba22011c051f5a0b655dc80b8bedaa998ebb0607fad07b1f28982c499e3f84ff90602b17f63d6260e46e42f8d5aca7e377365509bd8307eb8d94cf73a430e200dd554fc9b088282857ef80df79b859f43c0136f62f10982d4d725d849045482894b4a69e2262792adda92ab31ef0c16fd492ab85f0ff656d70978c1dd028037d316f925bec5b2b70e0a610912c7694ac78ce1cd32a324b0718c2e6552abd1f777d2f7ef455452455cb872eda5f233d15121b6458192702f2a6dfc9b8ee12c43e18fabbfccec01b7d527713141c70a9e6daab459956f2189f68aee550898effb2cc22f5f893b1b20a76e13f469da6a92be87dd91173677282586d147c55506741b882a3d30e02fc056937e688daccac2501719539867d09875514032cc5ab0735401fb772d3fdbc8633e857c047791da48b220be000e5ed7874b3dd8796d1282d1b0ef660023a51013f650129188d4fecc5755d776622cb8b1609d14e4fa691631e37035b08a27dc9503ee96789627e646c06fe68203fe148b41b9627b8521fd5cf962aa207b704954f301524277d10319475695fb23e1c7357be57289629c4e62947916405d71fd3f80a01c5c98129c6fc6e5f686558bd8b044345ddea2a312412779fbe2b437a719d7f2e73f0d99219ec894ca913692db6577d0b69d20341943d85b34f2bbcac81939792ba40856498c9bb7da5790c6c9fd784436d483b5ad59b9420fbcfd61a63ed8ff781fc371fb6677af7a725afcc949a065c4550f6dbc8082079f7a22bbd57489b5d0f4f71a7bf8c7fc099808e359e28e203826a49e1dbb4958a184998ab4b869d7382aa76d44f1b58bbcf35da2ea2c41c0f6c1b1bdac33c38136e6aba9f85bea845eb1d53071d1264fc04e91c4a033f76619211d0e9442ba4988cea7a05b283969cca9d6cd14d266ddbc5a10d0a4aa0297c8e2e156d9fef415a2e281cc7a1a2454e806974f27e67bea6c3091cddc863af126cf0962c0e47f13ed2dd12912689371debbb5fb0698923e27b262853e7048564219239b776d8f82e90d59ccfe6d4aa2072f25607b23e980c6397b3ce8469b61c112ebd48ee408869cfdb3b71d1d0e494666c5e8dc42dde9eb028a8fdaf88377bf12e7ff31e79bc0867c920903840b5847a62691fc395c9609f81d5ab5f843d677d4c6d5443d49918cc88bd8414542c2adc6d98ea0086e67416306eaa82782b7c99560ce99072c0fc5a10c5ba4decb98ceaa585589a96de76da6d6c383e217c1185b3f9b18b84eea53eb2bc2e7546cf99e0af0a994d6d3a862f34acaed4f4d742a9c27b1dc4ce3fba4e33959bc5bf2a2624e2ee63242cdfccd72a648b76c376f2cc0352d8f52cd8f66c28ea0c5c5f6f96e01cebd133c1667dce335a42d63501be359b315506086e8043c96929bba93da036ac81c827e116720942760e92b0be87d4b22f6491a1bf308e865f864e160ef05216261a8c310121b8f309cb26206b1abe216bd60823757f4b8768a4c57610d89789f60dbd8f1924a4000ae10eb23c3334c8b13164f5c69325c8268536975778f730ee75de86097d4e189623c84941b882690d31e6ee0b6ac2d065a019c0cfea613edc06780ad4e9450ed10cb738c68620190b8099a2e89b4b801a68262f01d416bd5ec1bc536d14dabdd51b8f98b0e128fe61136533c4a59c7edb6ca90a620a7d0bce08572d84cc2623de3f2d43436b2195a09794ecee3275e5e13e4900a223f55c81f131ceda33138a37d4d6bdb903e20b358c75c3e6832e658b5e2b0507e56bc47eb9e744f5e7ea3bb31ff294c9f1226efdf92734fbd041a56686a45577b8675ae62ef3f80a8a7ef2c6ab1b0cf260d70349a9040b3ce204bdc6761b9184b10265c4d7e3330000ec1f1b320e06ed1cb82432f43ccc8f655b3882ae6611335f837759900fc9dec4f14dbe0998c0a9c8f7d5bdf70b625a2ea922f7914c979321e21dea2c60a168314c7db801e0ef1b9aa3482a3ab1c829902ad0fecba87fc8c604fc4d09cefaf663a78b1d5ef6287342684f69bcb878c9ee748710294f2164dceab82d66d819f98b9514a26c6a9a608ad3c7d4674c45ff16adac7688581c7a691a042a7b2257dde8bc4185efd4ef1ed03c8e888463c395ad629344a44b36c407b7a86c416ca5c110359e877122bc85646d84ba83207c264a2839f7d91ac8e6b622de946531eed022f2f8afb9a39104be3a989df06d310a56b1b1ca76ddd409a27038069ae5d2c69fc44593e0e93a111c67293eb31539bebeb60cf897b9a6ec6a46701261bb1a9efa812856aa20e6e286148136d6f4d064910180b83646bbaf735b61c85960872f0d630a4006b04909ce46c57111edb04b286c2c6cc9a9b11c6a0339c419b15d7108bffc666d0670e3daec2cf10ab1a3a157e84686b4f1425b080573f425b8e4dbb08781a682423d45fabb9257d9c076cb5829eeb32cfe6f47127a2329297f19818d9a1cfb1cab1a857b6754869002b4bfc6b36e5a0f88e6e429e9e7c85e8ed2be184f784140c87a2485bc69e7cd2211123c2be51feafaccffb5630bbb213c3f123f9fd89203da456f086a63536a28abfa3266c585fc4191e1d16d687f42e16095d696938e1b45ecc94c899e5f32c530fdf39cfa6da98dade5559aa0fd0be125ab9c134767c0b234b74deb11bad21a784fb9f8f530aac2512c5c48f318a25940e1665a31d1e1f53d17ec4b4f3f7c72dfecacc020cd69b91d0d715e094ab38b964543aac98365fe0bc49e28080ad76456b319e3eb4cb8e2e1524439a49573463b5b306c326757b2a9dc32ea8ac855ce4e0f7abb739847137f4a5306561062be829c7e2e922c5db5b1818e85169e03ee0470d30e425cac5ff5043b42e7e5ab28c5446283332833ab3a1c3f5ce3ae1cacf37ee533fb0e61beb848a1a9b964f36998afdc04f9b4abcc93a928c6dc2f8857a0bf8706106b818c36cc204c1a5c49e29d3555c67413d9eb60f43f968b3feca85c8cfd043928ab16852ad1e914de03b9cede27f5d01121351a30fcfc8204073fa9915b4f12a3d44233556ceed612b90954c371c025c1801ba94dc2156708e65753eaaaa07ec505cc472579c80a7aec71caacd7d109014b1b60b3898c0e3a264a1671e91f222e8d87c4c68bc2e2635ae26b00f949719ed2bc9292c29a8996c2fdbf476bbdcf4aeb6fc7ffaffdf5ba624e5de3b0802090209025d5b2c3eaaac48982842e188074d6ca42536e6a2e59a4095716fdd5d9754c7cacbaec1d7d3bd382dd6dbec9d9737f62a16ccaad3dd5de8d17f120ccf9efcffff7f21579434ea8ac915e6e16b6c6370b0e5cd8b6559967d5dd8de7b6f212a87a868cf2de704c3b5623be2a57b09c8d1b1d5dc76f5ffaf72166435d731880a49332e2efe7964295f223324848eaeb12b18dd222f77564a13f248a1c70c08122d264c6009e588796a20379a5dbfe4821dcc4ce1b8c430248c6dd39196004743427e1ce588f1a3841eb2abee6c1782d36a6a4bea2b26ec38b6b5e3e4738207f3e32980fed930c01867ed7dab110945d631ce76a7c5c6c79102f36681b244db1e88769db1d716809fd99db4a088470111360f39715974bfaf091e21735393730226ed22dba10385cf8d15667cf48d258e87738458e3a247bc24c638a12906c655c3420a1d3d386a70732d35f0c34bf318d3e3c5d79563e8f45a2525e0bc608ab154fa2535eceeeec08c92b26e1bff8b789a7ba2ccd244a4154199c860c22e2509754bdab000cda705a453560aaf1a9ac58a140ae72e0c362d60ab8b1a135be7db9cdacbdb9dddef6fcaff4fe38c92eadebdf3cde6fc7f1c2af4bfaaf936a1e0d0a4e275cf388f968648ab9dadcbff7f9185c0aaa236ac409da9e934ebdf7b93d8a41d462ca958a734881fec3a9577eeeec0e18a920eb51e8048bb777ffda303e3b9bb362dd0557f621f39b5a053be00d469abbd6a67efaf0d4e7f39a9cd898c8838871c09a68a28d110a5cc4c41866ed118b78107b76941158e6d925c4a209aa8e707c9a40d268d0b1f4a4da46cdbd806c0dfac7b93e4bc08c0d9fc485e76efbdbb685694b40b85bf3ae7757ffdc08029a45bbde491b0807598404ccaab532242a7972ac32513f6ea9445575b715b661dfd94e17d766149c405201eace7faf3fae7e7ff107208697d59582655a98a3d086143788cd2c2e239627db286f3033130a124173db0333dd48552844dd4a6bb4f3004b64059c952d4447dd1e3c4ada1bd2ea827a9a30756637ef1fddc93a5fbfe30006036ffad6aef766f3709f7dc51467ddbf1a8f6e1746f2654286b53c1534d535acfbae1b744c6b498e4dc7324cb77f7ea764f67f72689335083a71c786c3df1ffcf5bb2faffff539e0bcf1596f20b48ab580472600121c4ccaf3398a6a31f5ac873f084290ca7c6ac8cc7d1996ee03e88d85174f5c37cdae2e9a2bbbb02afcdeb04624d9e5f161206cdf2eba705201da718d5d5cd691274a2c11ec6528ce2020ffd4fc2a00c1a606d513dd47866ff0c058086a9a528f4b57acdb8349831cfe09cd59bb29a45fbb5f0ee9bb903da6de7153d68149932c5a2a22c15372210d597124b8c48154213bdd4876da4bc0dbcfa5c99a82c06309f2361bf79eeeecb8c92b2369b861ac499384755959f1f0e9ad5bfc1c1c0686585812fb0215b7d6a0b70e7d83afaa8263dad508188cd197878fe3c5d5673a1a58298730661b066995baaebbb7b75bb0c2ba2efae1d539b3f1284c05b354d5868d1a6f25536e30b259acda0a0d40f21289d94c18b0d682e2cffffc308211c501a363c8a5a7042244b38254dad2089acc06377542f5434eff611ebf679e2bfb507b3cb5bebeece2653205f29b69ac8403d56fbb251caaf3ab7b608c8212a650c624112720443c8661025368dc9b03872d1304adc5b25101761ea089f168acb35a5b135f9d7cd8047dcb723d6d3fe80d9dd3d78635fa296847c442d54c8275c118dccb9e243c422450a337de4ee066fb6ceaf26d203bea01cc2d422df506d921763cc95d2d29125fa630b01838123242119241a613882f48bf7b97bf2e6e5aeaba0e051fdd22ba066dbecb777f7ea763a96d6372b6a6475b2af3c6d6b95d0da818c0cd8cb01044496083d271a289f58b00cc74b4d1bffffdf0a49c50af9e69585ad7c776f9c9e02b6c2df6700fefe6f0810c5a052e73f8ecd41c44969af766f7775dfeeb6b9bb23415ba4e8ebeecd51c4b5cc3a5074c218dc7491fd9e843e6b90cf2bc9b27c3516d26a2228a67c5800d9d56e17022c3c29381b1f07c212c984b21a4ab1b0faa209b21325410cd34639a9d1af59c2a5f71b168fbd8fe63880a2d8fa827900f9e8a2b5461abb0efcb7a942605ede9076ddd6f288ad120d2afa935564d86c367fba8bb8dfaadc0d4dd8cba9b3cac1e9d401aa4accabba01a4f6c366746f2cdd99d507e78e381beca86a938d2166c0b221c81119b48c66e0a56771a891d1b316bee5f46c29f7ffaf74b2faffff85feff836debc0312883cbf83263338c4af92353696b65c70b2dcdd45bea5ea2bdfdb6ea059e4a24552c35be8d3cffff717647777873825dabe0ad7b9fff45f42feb69dd23ce9b498bd76a2ddd99357cc53b1cb016ab711e510ad921ecc07bea9490aa0fcc73650da897cbea34592392d90a8860a069a7d10c1562a3193623943e6c66623ae2a7525a138d8c9d3a75efba3590eeaca4dd1bba806edbc003d569cecd36b05adeb62c8533c03a744515e41764274793c5083a3d553276846c1463a843883914263193ac9497b3e546768d94c390a804ffffc2ab15256572858d79109e6d09747a7377cfbef7fe3fd92bbe77bbeeedfeffff582d43b874c3c0b2fec3df8a920287c17708ef86c493a1b181e1920418d8622c64d6823963e848c268f85c518686048124147c27a115ad5e5a0ae059b99e52b72f25b0bbcbeb4581138d258e9c9c22a9e74f3f69f60799dfcfcd4e9407f669a51d442dd4e9ee3f62fc316bab32bbbb6c14a77faefaffff41abd3e61dd288b73de25e76800ce1530031665424d746f95fdb0101cc549817eecf44a0be77ab550f4146ad531520670ba5d67dc435b475b45bad479481e45a034f2e392a93848a1526564e0a32c416aaa7c6460b4d538c9ea80451595540525300e31800040001c03010c6c140d0e3d61e1480030cb474c07c30382c483024080583404000140808c160300004000c040645a140782834a724d606458282fbe8ea336808e4bec169377868bca131089711f5bd95a3d63c05e0b300ae399fb2091ba75c523996a6dc6891c67ad695889981b6db22c4c603c6410d232962824e0cb03e9c5b8a1528b9456696514d8eb5115f9cc30a96822d16850a34f3c8824818546ab429ee42f2a9651153e57a89c6b7fed4d24cd945118793e85d95e8235d7b924498f52a0e4c924346954de2dce7f99992185bbaba88bcaa7476b5bc626179b16a3fea769b2d5b762e6e55cba59ed0a38eab4c88bb2e05ee7d6c4624be5a9e2b116e4f21c90d659434d0779da67adc0d32206c95ad36f6564a1241bfda61c8695a1735f18e14223e19dc08974247b4483edf2d9257b0f92d3b352cd28d26167a002baac8810806f4cf66332df557614b50f1289ab9513c339cfa89c5f902981292a6796ff8c2fddc9c678986fff4334a42d2584631b539b29fdc48d21f32e3b370160fa09c90432d7a3091c3e833456411506bb481ca19e73455a378d1680a6ebbb7c5344cc67c9d4c250ccc8ddc8aac326b5b29bab11c2637852ea5293f262de924858105578b20edabd6d7705464a73d63327c8a94789af8482ce694937bcc3944c7cb9cdcacf0af9809713fc8a4e6b4aaa6d80f64f408671d938db6740c376947d5af4700290fd481b71c14f2c9d1072dafc3108272c82283decef3bb71a7312ab238e34aa7c0a9168958f148408fb6ce5492b74de376bcde20d61f2e2390db33ebe6ba63e6c75ac5fa4c13b9191b0d3abdd41d9941765d38ea9fc7e0c3b5b9ecf8ba2b1e25fd915f250b2ad9123753fc19cf0979b74c017ced4febe917a952258d52c9db7626ab81e70480fa28277f3a3ae47a14f27fc9f960cc0c3139fdd381108651841ff9e08f0b40f9d8de92b0f98e9cc91361376ca42221dc33be9af0ef1bfcbc848f3d31cd3a0ee5877bab912f96e512056dd0b1115125f61a99a5ed7e148953dc4c9a471a0040454061e25f4c0ce94d4cb26707685f1c27d7994b48b352a3ff755b4f57be26b613a9f150449e55b87d742ed9b8010b89d77fb2d821e34323cf0533921743771bdd6838368cc0964a6102ccf2fd7c8e558b98a3558ffdeb5562e56fa95874dafb416c18d0c306dc04f23f65a5e0a3d550779fe9115ac09501044f9db8c9a6d50d2330b5eb4eb5323651898c7441b3922f3391539308332f7c70618cf2b86cda5953260f709e4712a9f6eca5d46c65fa7bbd09f1d358d87b3db744932819b1cdb3ebff233cc2b96891d4d26416c1112795a0e7334683a1460bad29de7852f47f32ffcdc2ab7427bf4843540669a111624b61b5cc225bd189ec8da91fc4ff53468d24621e247941f1930f3d3e03a150b73e244e92ea87153516c2c6aba8f1105e33b8e8ba864a3c521875f526cbf26e9797833e24545219ed67619d06612cba0309bd116f2615d5098c31a592a234aba2581e18c712352921d1fc6ed63f0f747293fa6166dda9a5ac22b03225367a2ee60a5514821a3705141a033c351919c439eb1c6cc28e87726052ce3d3ba8c1c70b8b79f2918c83df8f6da7f455b6368d0d2433f857724e0e3c64f0bccc3c496a45b6c43555f135756870a91f030e4b4573b3c413734010d15802704f6c2939c4a5dc29f1e909acd4c0c435b6d8d6f504ce2515e4298b2999140d52033d419bf38a12275bb3785e7475841fddd72a423f131aa168319d641cf03ab14a837d33980a5ebbadae1f26a05ffa47f3eb2ff6dca3e62eb207b02ba01d1d9ec48ab37ac035743e550ca70d112d99aff493bc9caf7aa5ee8960d5ec1bbdf445fefe52403a7e75e048af8d421a1b89bddebe7250d67283afe9529af20e494fd05d6408f5e330424b21c58b8204cdbf4db8e3287c3c2a5ea03d08e19d6c61e213ce972efdc478f4eaac515bc28486f66486cd77ed51a5a155467b8229c412814af990acc131bf1a7d3639f9f0807b7a611bbfaa904dd19cb7de4227a9ffc78725e709558c31b56a175a24caa86453caeb6dd91fff401a663f7b5b1e48830452117be035524406a0a5c5ddf8e8b24b236ff1b1497bd2006ea5093846304c250380ec79fdfd0f136bc5632167a8ee6474ca823fb93c7fcc912b33dcf19016f1d94087f0c8f6e718a3a3a264c6fabdd3326703f390c40b6acdefe29e88015d3444bea61056f38f3fee44880a68f4021c0253a045f496bcf3c864b2f8a05a0fa560425626490608ba3451e1b220aa63faf9718ee813ff22ce6cf86fc675144e48e16678cb2c6fc007dfd57f8275e69ad4ecc9c3ea9fbe676279809a96812aeb75d59a2a3b8009a458014a5c5ff0d2f5313872363bbcd78cef987231cfedb7dcf09ac0f91f7967853cc077c8832c23c8e3c2402b54d74bef13d4e906e61f80963b99b7c2aa5211bf6736835953c922024a50be06615779c8460903a2796ea2294e382541214238d1bd0dd4d3e16e0353b32fa55ce3f486ece9252fdec51d7273c7308d0049af670571b75c80b6b5715fe2492b423ed36b945811006bba57507c9ecab24eaf100cb6cd8f1594c478d9c2307934f1a4065eb5be6b586b286e5b36ec7a1f529c53bdde040d933aa04a2949feaf0ad840dd4a74126c6100321a2eae0b5812394e2ecbb1d4893465794a57797ebb72f6141e5e51c2098f470359473d224a683c38600dd3be499c44d1c588c9ccbea91b4e8c3657542ca49dfa9a80cc02be6a77e62d9ab993bb855b155f24fbfc4877deb80cdc78501a34a5e3a522d8865eba25d9d31f2a8a2b1048be1406cc59f6931d1204d5936ca8a414293b64e818954364eecd18efee8fbd803ad72eb7ea619b9ef207eff542e7d77312a752b13c60aa62bbc85c20d024ed9b60223aae8ebb23b058683bf431852b58a624ecbacad072515e5d029f7bd32ff4d60de971fcdd68bd5126b07dd27948cde82ee72f09715710d0aeb242cdca4256505419283bee4d3d0110ab3994934e55fb48f33a13c52622405a5d8fe68428cb39e14fc93ed2ecdde6fe3365e03dcce1b85b3d71499d0855e809e7be8754914ef7d11ac94e61fd28e5a388f60a2974d38a5843e60c91678c8cf38ca02dc50d72baf2f7b70eef6882b957272a3abbfc940644ea4baf1106982b4397aaa862908ee67a90e3b2e84dc80f723836db374c1bb717e692d3d9301b6e7a18125fe73ec6da9decf183ffa24534844002c57db3119dead7f6ff63de63e0b8ce07b60c8d439a26f1c4dfa5d155ea73457412a7f6b5908e0ed5c5d48f5f7c7af3a4df11167791ad86d8365c6c1a8c9d098fd3941bb6d348c25186f42dfad522a2813eaac22c02ebe7eb269a7ce2fdb07d26ffff2693c1ab7cce7e63aa9420ae557465837108ef5ef32222003cc1d265c9f2c5f74991c54e958d735c446521dd67243f683a2c27dd261d9bfa62cc8a949356d4a290ad80c9fc5eb8358c055cc3532dba9a45273762f2b7ffd05b7f11f66a0736a99f019f8f0be8569b7294c7e6f80ae7b04390802006651fa2475c1c5ff68d54c3c55b4cd2bcc63fd30813f1ce98229c08467fae4163edaf9c4db4ec6e5c9fa16646c2b004bb51820dc2d22880b821bf6b89901c6219010ae6da262d4d75673123e5460108f6203d60df0443e8e9999d9a27ca02f2c467b839f556bfd8e1c94f378c85137e0c927d2dbf72af7b25a9aea1688b7b2f90b179a700ede46eaa6912e04f5643481cfbe8abe1bb59226363e9b87a711ac60cc11cf597504cda4f9008820984814967df45b6d7f5318855243afae1270812675fa41bc51ce39c4248736c729bc992c484f9b4ce72d1c4cf14974cc847a1ea323d4cf069cb5a6dd28825e0518ec5cc5e1d1b5e215cda0878938b77b2101d6696148f56df6a5ca9d9f1150dbeef52a2dc5b4dcd7e65eefdc2d629e1f31bcacb9ab898075234183c03e85a2f3e83951596939f0bea058072fe5d487e0e34fc134e6c5b97405e79737a44f26cd1249f97ea9ef67bd4139bc5e0955c686e6f0b415b89fb999364f349c6e4b6500499e9f744e0585d483c6b4c84203b2e3dbef30bcb4a2ab05f442dfb53479463a4b9d3e308602f323548aa5baf8b29fe09ed7b72b6caec2c4c4c6958d6737818f04b24eb7a97825c0cfb1073d35afb60e334d1129a87145f2870338146d31a32b093523ca60059f86854b6c0db2309da09e640467da0660309bfca7e8f362d1ce284b0263a5749130ac8421137585ebab0c7012d370ae74b2f8d584d178215697121125478c0995395e078b70b67e121acf2130b624b9e839235a373f079f9882988cd24394cfabf0bf7c3821cd85dd0d4e75615bd406e6a216d395c5a79a309d72ef44c506fe670e7c8d5460b8c9d6742cdaa7026b084ea9a4be12bc2b29305c6b54a09f4a10b29619a8392288b8cc4308482d04a34f8c3d4e4e30d0dfa4dd4b6da6b0fed1045a1ccb1a2813442f4d28bb9babe795e3a318455065243f1885ec68c79dc1080afb62d41296713564f416e02715fa21f074bd1d57168a6a57131906746eccba748f56e7da668263a157994777771e85807d481f27352cc9e202f26f99320d2d4548d87df3d3e36d67e3de3a1ca50dba448744a826c104459d14196fbb4017f36543600d429223b11e30530d71a241f22be6a1be7eeb6da324495590fc0230af771240e9aa5c1b4b4116f85b9a31c2368d4dfc723ef54793c5e5709cd4a5ca9f7286cb9dbaf61265e3fe2f7a06aba265fb983ab405906ae193dc57617c7281d5a64db4707a0ccb688407b4e86cc8cb2cdb28630553f1ac755d8ab2aee1223d76d5a8acba72a2ac5ef5d9d96c253316b05f195f7565220cca92e303c2ef3f9237c6956bf2d0e67e5e1bbd3896a268ce7f2664bbb52beeba6e2409487d5ad3a44c64142e417c8edd81e0abd8759bc9206f33ddb39e0b5a638364548b635f0c92e87a2b6078602d15689d11419b561cf0ef7cf800e4a8959d28dc0a3301bdad721ba085b64425108de978c0f77cf41258d33b4ac0673b1d2c31f3b2f89b089140d5ed3c58af3d69308ccac551af161ff5694b38a3e22ea8c78981166f01aad4b4c47b3b5af9c9ed086e8b221319d5b757ec88af16be2b9278a5e0406b05ce7e8edcaf58697adcf5cfd5aa9ec1035deea2863072df608e8188189b2dfc609b2869a45c2f2710cc75b73f0f4d129bd63909a14046e8748b6122495e911c4534ff078cbb92812295b09ee02134685050656b13cfd000e7607440d682658eb40c956558a8cf7cd950fa60003e4bfe02919ce326597f167ddf275d48a7cc49fd39085e158eae817e34e3d18f8db456c1ad90aa2e9906964e924eec40d5264204e2275b24c2348c505a026cc22cc4f737500621569dd84a5b313691a3f57c11b33185dffc1338293b5125d20efe6955d181fc28de2f777b0e9e1081ff2bdd9685076754a7c2d637d372ea7c4443918a4631f19d0fa9904704aeda4f16ffc65c9c3d5cf03253e68fb9069e97cab0d24c995bac2f409c09110da528463412042943bedfd6ad46bb74608330c4674b8d650425514b0c0ce3103d29c8532c028a6579bf6e3413881d2c8a95e0354d1c33568eecd0e16a8b9fbe48a448789f4cda583f53c8f860f9e1e9539996d47801be7e732eacbfbf21d095fb51e0bea6940659db6019e1c174f37125ac0ce11287a53c40db3f9ef2243f636a0ef018866f428f326c1c02a8a1f0df30d3ea888aecc3299792706a67ef20fd6bc8efe40ddd05063cba31d6e00a5a2851040cf9afd0100e9a255a6b0ef93bda478f021777f4c92ec4fba14378606276d80059fba1129e9957233f6a6572b2265be17c0836a6d0e531791af60ce619994185f5c69330154817c95e8197a2971ee8864c48bf8438033f23a045eadea8a88abd598764ad69e2f9a57edc007117c2e3add58fa18885c661921904e444b8b0a26d0052cedf32d81e922567fd4023fe1885be8e8c3cebfc0a73bcc43697e012510570d7164fe712c67a38930390665b429da09aae7643dd1a9b162211183a09e6ca2f28fd1e269188665f5d506c6dcb55f830c1c1dd57eb6f1b304529746ac8dfbd468d1d3b1e5a56d6439c884c22af959dcf5e9c00045426d0b974e88350486260f8a26d6b47e09c884b69b4590305ca2f48c001685fed2515b6bbdd92b287ff82750742dcb4327ba04b21000cdf225eb718631afb0ddd18107560eac702a740d64492e86810c0fec8e4cee6800c5f24088c9d89857102b9ffd1b58936419e968997463c28e56d9c2b9e7017939fd5a2cd92a4e1f027611c915afddd3b8a66814badd284df70744a26c589940ee438fe0510772f70b88c5a0da3d3be2335c5ba79158a216402a1c9ffc4bd6a263088cfc07e8c6946b414c19034132019dea83edb162dfabdca49e800af0526de0224c909899edfe6372c09091d0121e64d6db24d8894b98afbc2b667b28273517b6e1b864c52b71d711253f329724b33867a4019a3ff4c6a812aae0b30c941795040a1282987fe444bf7c538ce13ed9adf917850d2c5e213794044f2ef53d580faad072c1658d045fc28478d0ec616337603c8d72c239df076cfde26988ba37488671d3b137b5c0b6384211032e013d9f24dbd21e67313a70f623672c3ed8f799a391d1098a4fdc9d8523240010bcba31e77414b36762625f6b06308558950561c7fd1e13df1b197e6341f9ed3626a88328714b5f9322406594501f4e60639084ec440a8916006e7b43c0a29818490af27265182c78e344a9c315153162089f4be21cfc6ff086224a35d328dc6a6b3a54c289524281c58a40b225261ac3caa44e6bc2da0c5cc3bda2762dd25a5376aba26e486ed4cac1d3c9cf70f4c765a2f266ddc0fea4e1a6d4e7c68465c4e630d76ad965133ef5c45a7ecf009214a09a11a01773955f790df7414002dc617b34e22d1aca3366c5a2dd95a70a82b58d251d6f9bcb53373ec42ff56c156bb1fe954efb4cf227fac346e4ccbd528b67cf18470c3bb6f3244cc9a148c688317ff01e1b8b212c6fc4228bfbe688134b0ab0fe22c72154d985013067522d6a3f14268e658f2c0164208182d01c08064e9b45e09337a008405ef424449fd628f05cb3a9917db2fa56d24b5b879180700d8e5d8bf7f4fd239a3f7ad4d9cf445cfa90e6bb9170b879e66e3d859691f48798f597c78167efe12df9486e171f2dcc3949bfcd0119dbcc1ef2780b157db6363ab3903deb19183bc245fce0c98e443c5831b1a098b57bc0cd6ce7b7388898bb96ed9c6250204674261ba5d428f9243717c14cf240446a80b7cc969e3c006fd2ac503b443b13c907ed7c04fdf7c9065d703ffc3b3f49f2950e6c1db533e378771984b91b65afd06c02edbae63e50e7998f0241d296980d4cbdba926796135cc2a6baf12aa22f047ac14c8239a173222cf5db94cf3835a81f4e1a0743d731b1a7004dea0278ef42633a99dfb157824e1f131619f7792020e2f390f2fea7aa314cf339c4d788379facf8f5daa1270d894b04e60ec8c905359f1e354ac15800df9fe2412519834fd550a40bfa3da65b4cf42a97f30f08b47cebb49e711c056ce77f9d18e138d730820b6a602b4881b0d85c9e8a012f92291270953f9d81056d8c6b9e8e98e7bc1b94a1e453aa79feff7a7fa15dac11e856fc7a8da79809dedecb12501b41c2c9e84aa455c527c1200be3113701760fb665aa859b68978ca7b573b8fb9f0a90a60a79f9b1390ecca1743420cbe5bae4872a8c228d4fa831146a0c428c5128a7c1390e667d7c0b607141ce8c5ca6129306ec02e3dc48d58cc9635b4e1f74cf5fa6be5eff559da5c28b0c2183a7c2ed6e2f30b233190cd266a95603685b1fd44590d9b6145251d834a74714ff04e7053a6ede1b04932a0aae199965071a5996f56776844d2d1494af27fd7334f89eeb1b53df2525cef53d57f4d237bb644fb68ee865fc749a751a0c98e7fb87d8f944cd4dc1455b6b50947a340ed5751d5bbe1faf2339a035867cf0b98745d40aaf0d4d1cbcedd82749b151177b051e5cde872a90b3196090967568798f5f831726e65d21ba74ead90d4fc9ff0b7728b1c78513e7b3cf6d9e7da1fa623dd2f3279efafe0f80f98a9ddc1021a2d95f46907c0f81d73701704fcad5c08cebfa65bc8f83e55974370cc14dda85519bc9cc422779b01474efefb4fb0d7bcab40521008d046e4724e736676cec01efe96ebc415d228b6e1b482d4cbcc14b619c46b941cfeaab37f2b47f13047c1de9b3050b62ce88d41235c613c59a3f6425cb685c2c51f961eacbc4ebb7b0992a73edabbed88bc1d6c95685567e5f8c21dd3a0b3343c3263defbeb3a365a80fb4c2eefbbaae8d63bbac4fc7eedd7bf7da85dd34155b1eb82b1a7b05f574fb734bf5903174567afa139e2c1a9b7073244908f1b31beb5425b145ef4c290efdacac9434aea0e03f9659ead85c5d24172b089c3bdaf3102e868ad5cb7d9ee99b4409af3b928be206b687f188e8bca6befa81b1ccd90d93393a7e96ce4967091a8a841126736e8d0eecd3bf7c25fa4d38688bd835a76280933af281811a93476fb4fa25ca4c64e129c9db92f190eb058b1fe95a0ad4115706aca1b15113a1a778e81b1f6aee4430a12688bc129687264c7c4408a686dfdd6a11d82ba8fc973ca74811d14603a05c35ba7250b1ea535eae031064dda35eb75c6dcf32b1bffc5d64c57de2e980aaaac94a892d9a6d7ce554247cbf5931752014933838b2c7760fe657e4abd83e86b3cd4ed559c4f047c9110fe04d1ba3faafaeb551780935a8cda7b8220908d0d4c6113f7f87fdb24c3b3b67f589a4c3aa72ce3abf1560fc622d1b468dd85e55d69eafacea0ad405e99c576e9b988cb02ef61eb5f19e111f219d84849b291df9d9810b3bb89956edc27be097e105fc5d65365a0b16a79ffe16c42ba902536cc61ba468cc3f8eb04b005988f1a2fdf6a2caf98e0c9f07fb5725a14b42c8335b59455d785e4a514f3ab56103b114379b26fbf0212004b93a6adc9a70ac85105b0dca07930a95bad15d8854245a97e99cb5226478c51eba9308258478771ea5128094af9ea6796bd223ecf0e8e1a065b074815931ff6d1aa447698947870c143c13f1799bbdae8092a27a8120e72ef65981289c9db4d6c783ebd7ba56486d994e900d17a19fc5396404dddb9b795b2570cf31d2a9df1a1384225de699252cb5149276108d1a3e8c6399c4607c33f2661ef72f02609e68757aa44cfe1213580c118d4d0d674f082577d1dc62923b672680e02d788ae1aef800edcff36ff0171bda7e590a16fb1622a002a45f1d777a475617c4984815291fae1de3bee323925d67dd1b7c927fae9a0ec90f775cda0615e32a3b3808192fd27553448e326d80e586badb8034a388196e994cc4c8945f3d9dc644b93f3a2294250e331ee2ed125c166951a344655fa7cf92616af6f6684630a76549be195d430ee7b33bce52138825a60806de018460414d2c8df6d28a06dc05669cdd10d278f961c62582418c713902186aebbd3287e6310b1c76016aebd83453508ed2e9fa972436bf33a7a8dc562e3260db440457ca7652891edfefdc8ce0c477a884206c229b38024e5fe34f9b921f4e6c4f7ea3dfac3067fe74e30445eed82e0c914e6c5188eec0d168b7b52da5943249194f0356030403467473a917239ddbcf9bf2476ea887d65a537046859a0aa86d01f203c6971c526b1aa69eb6a690881c295a339511eaa83881bbb3112644451236222c4a6b6c527667469ed61972434e6eedc4f737a9fead8d71ffc1d60119ef80ae844cce39e7bc0376b61cf3d01e54bc25c92c2bab2dec0152995c5d17312d7ed82b45b133303521725b3b8879caa6e19cf322fcc19ad9f602c0fc7c22204bb9e1bc86c8de7bef9dc41fac7963c56eab4acacb6c89fce6aeecc79d0d2925b92b0f9e8cbac4ee745c69e52f2b495d46920875f1f1021194ab282365daa8c8799d4cb4eee538591a21b7ce2c3a1b9bb83ba42574d45a4a8f9263ef19795a2bb92f43d59cb97b1835b5d6bc9cb4afefc6a625cd9c9a4614fe22be73771a8cd8016f12bbb398dbec2a9776c1a22cf1bc4913e51c05ab116abd897b6fae2616bfe469831117211cde2ae258ab0c816b57778388f4a508968c31255368a80de9b224b694bbb4d6da69d369bde94e22efe540310c9573ec85f645a7f7e276f2d853c53c3443c5971831e769451b6b66d3ed2eb13ff38714755fb1264cd4450de64bc2434b1870270c30e963e19c9bc5d01add9c73cef90b7df58e74f131f1e06f3caec7e8e887720d61d60d257eb6f7de9b77139793ae9670eb882173adcd489d86f297130dbe7643a6f642458606ef261cee64dce24731667beebdf7dee7c9f9e9c012a8fe3666945aef192f442125860bb6a625da92adf50255cf889a950c315355528490b6440baa164614ab85d7d6618e351a05cb707ce10892fb23234d33a972633801ab8c33ae9eb8f5f891038b0b5949392b888704c848a9d1e50bd965988f376aee579775c46dc88c09b1e8228f2130473cf35a01c9694ade5ad3623cdf5320a6281502f121e1df26345330a2e1752405e68534cec34d2948d11323b92d449a2d4678d6daa2e47542df4fdd91c64da8b90cf56e7e5c92da8433e270696ec7f33e36d2fa47f386a110118802c607d3911e47d07ac7286d147c6961450829a90a5dce2ae0cc6793ece13cc7f7dedbe83f58a253b1a77885144ba84bdd51a909468b0035bd1a8cde25c9b869cd44ebde0cac354ff945be7b4b9f81dcb432176c7a8e361e46cfae47805100479ae0500d41f2304472ad4cf0821191460b95d65a8311a2a6aee1d9727db637e0339b2386e24189d2bdcc0f70495b45f03062cc5f5aa6e6d607e228594f9dc4c2c569a318f8442b5cd2388a8129047051e36b0d8a404ced8883d71aa4c1ca8a73cc2e24588ad6a01d27274dbc2c5b8ac2f4d007e62063560c4c91d96e8491ad413846dcd599e588886ea1ad2c326bd0ce530f35bb62600a11398a645983ecd970a5b952e4e6433170012bc2638a62e00e19acf5ac4131f016c39473362806da2953c230ecb82352b43e70c76d3d6f30575918b6356866cb1c5d1006e58a510cc443bb3ae2fa400e5eeb9901c5c0147aac0b8ec51ab453c487568a1db7f5c5af38276b40311000b82a71c3f581564c8ef5fca11888b5303913ae0fb45950eb9981679a010c401354a15e314fe092eb030d385a83feeaa7b3ab459750d18a609105a5e19cf3154871498b2f3947d7a6e2894589855081e900432e2ef9434ea7eea297f74b1575d3582d7bbe1234868a6ef1ccc2bd7d963883c90b181994284a57381a970c3f5f4b424f454e6e58652b5a6b3d67cad0fae68e831b4f6b1fafa00999dc9493b9234e8adedeeceab8dc3d91e2d25320c84a3910582e10c036840121086e999f51d995a438c76c77e49cb7046262bc22b5f59405f5a5148525c4fa0262cc64783bd99c2d9d47315c46be9bd4f7c58c8149899d76f894867a31b699c57bef6d75c403b25a4aad0ed03337775f7493ea34134390a2d6bdd347244d07e79c13f1076b0e779bd07e23ece3dc8789a7122acdfba14dfc17860e88b263c3d867a571cc136a5e8d0e2ddc294d76e9fba1b49bb40803df1a0a539e91d3de3f4d4a5407b06269851ab5e69929cdbdf79ec389ea4165883664cc0a4ab6d20a00822464c86a500913065745cb26e2201e65cb6354a443ea6043422608954d102e0ec41b6196c8401a19d73c8639cf77277fece39ad3e9846bc725a25c9b730098bd1a38ce7d5f9ccb76e83cb53e63ec19aa14633888aed07d89d2623f39bbd1a089869638226c713eb2984e14b002cc6cdcb4367d00484066e4dc3c4a5ae2de7bef9df302471c574e318c807b6c7aadb5d63bb4f6e9b825ba8f3db7e5de3e1349c87b3486c48a4062545f453f5a34e1a17c32b7067f2aaf22ac7bb39a1a7225b925872d351e23832fce3568f2a4d225a6dc786911aa8b6467560c1b42e30bf1ae86d21518252b48c215c0f01295002cd49c5822e79cafcdb925df8cbe1cbd1cd32f01bf2516e587f669a5c10d1b2c09bbd5dc33c65dc5dd4cc554dc7fcf63916449512aeeb87fff7d98101feaf712cf43a37e07b2e07b062750581257fd9ce008d64dfd9e5f07bd91fecd417f66826c5681a1e27e6726c023d6d20dfd764b9741fd9b2cb224541be2fbf5708df7fa0065806284bf19ef3c4fd083fa3a0cec785075be83789e08d4ef27861201f7db714e091f1be2ff3b4eee56c5be2b13277c8032f0f73a518c26be9ff8eef31d288fb1bbeb9beffdfb39e7dc7fae9aad8edefa664be27be6d85a6badd5401382825d9b704fa0781d306937817b5448c1ec2fee6a763327c55da144d0fd0446f13c20762c89efb98bb03c23781cb03a19849a7d4ad810b93b601cf13c13d8f3a2f7737c7edd4a833679c24406cf133ce1d5bf4996444fcd7d03ed4db22172cf02c9131f949022f79c7306721035c413bc4923d4dc732f915f6bdd7fb2aa6f922561d53ce2796c328b1881aa7332789d8c810d91451c4971cc35c51f72ffeebb42917b08b99bc8fd44ee1af87be0861f4e7f9ddc739e9284fa4284c60b2e166bee21e01e1545aec0aa86806529c3d6dc4de01e144639d096e8d8c498d6dc4fe01e14da74dc48ae5515ddadf91279c78efbc97d5e07f78db337c61823c5d4a918631d18b9548291cb171863dcf763dc713e53b1005bd2efb7bf6a914b2135f8c0debbff5c75dfd504ea9c26de7d1ef71fee31f9cfae534b173fa08df7ce7d84ba33ee479d64879e73ee3f59cd4026aad411eaf7f35e10aff336f8f7deebf32604a9595b9dd7f99dd7f910df6fb71dc5f72c90b45706168e2f02a2065174ae8b2d8d4d4c0d5ea13b748b8c385832c413b45beaf7b747359ba95fa60651f5fe64f5fe58125afd8e815a057a1e8b1c03c2a3e1f6d40b34e19af03c1be2fb4a9726519826ac552105de5fdc957373fdbe930114ceb95d859a42c5cafb0fa7beabb4ab415b02eee1d08414be215740ad5807d0822683cec71cd3d5fa1d05eef1d5259519b9ba6638addf43c03d3659230c12bab917695556fce1a2c3f37b8a3be4555c83ee91b130267e650dc29143438a251fc5408c256a5925667d60efa4fe0644693c8a968c8ada22c0c283680823869630ebf792a4a46c1d6e52d432f03c77c4036916f5bf9b68585b6ac6ea49cf280f67c6e01f431ab32a9385aff32df388818af9b1215f622c5b06d34c959321278ae1539a896a32141a4284aee5a99388dc70235142c4bbc8741bce7156c94a9b0a7ee2fbe1646dda8d396ce81d7e1d0986ffffe74ffcffff7f6f1eb1b0d47fce77987cc7fc95789e2b1cc302fff51f50b55c63deb85c18feb8dacc32630d7d491aa1219fa2f2847b10a163f292a1cf85d38681973699e1b9814a8633ad64e43579f23521954a4f52ac5aa412094d926ad522953cf894f4558b54ee00a1f3bb49d3bfffbfa364a1fec750bf9b3fd522c9e05454b548b22b6912ebf4d13570653bd8eb40cf856ac130bddd9a1d9c149419c0c802587e376c9abd66d61befeeb3e5f93f03afa3dcffffffe883289332f3420607c6d3a3ac88920529a7a7f5bbfdd25bc41639798d9b7ceb8cb14dfb2ebcace5df0224a30eaea50b46b4ac417b14f1428c4b1b920d261a6bd02a7770a19551bf9bffe80d6aa35a2eb4a45aa35aae2b305023b73a7d6f2484641ca9ed96fbd0e721e1a78ad0d5b4a03dc261e508f57eceed40f7e5da96d6b823052bd960236ba28549ea061800c2a08aec5ed455955906ad71274c0b6a574124f5f4e6a3aaea29c91a1c4182da0e2a5ce6e0aaacadb71fc7f46ac488bbdd9a52eeede6ed3f2d1ce6e8031fe1a39ed4d0bb419cb737ffcd330792cc0a2f674cfdff377b6ad5600a42e777936ef0290164c1f3908921c9a468a2dbedf1ea98b3104037674737742a727401dc969413d493169ab6b093ac66b3946d19d3bc72b451a910e261c3acad6c091d13e6e9cdb3cf96dfe7a037e60b51ff7bff7f1e077600debccee7e020cac088079ea703d65d2a7fdd8afadda74cfd8ec2cc836a916290a835aa458a211af5544eeb72c4648790c7d199141a2421492b2c3169298121afd02c63516f2712b6b4224716a8a8f576b3ca9a1a14e40d25306bdefedbf28df1aa2352eab1e2e98a17911add8aaf36629ced36849cde6e6f376fffdd6eaa76e6da2cac27ac2c1f44bc7c4643a10da90c8e3065dcba56db2d08f7da8b721b4c8326cfc139c1ab76d392b897c5b5f7539defd7aa294f8e51a8f4cff574a6cccc8940001008004317000010000686c20181344cb3248cfa011480042bb468b47c483c40501c8b43a12018100485434140180c0000010040400c0e44e2703666650ff36e01c19cdebf867a302cd0a7cc27b94125d58558bf324a778b985260d98470929262278ab9bba5fd46d09a04584ed6155ba4e92be7fdbca0d7b6b7bc744243a7b9a60ad6954fa719b63a33d7052aa526b2bcafa3bbc822de44e866dfa8a70b2a3e3d3d5c8496035d1f25b5b6b0cc716464a485655934e6c1bb1fcda171e9a4aaec0afbd98a291092162c0d5def94ce10658a400ca123fb1e102b17d1cfbfca172de2e2819b1b8af5d80ac95403ebc11f4b31250f26fa68420a70562935000ee90314b7f080c78d519b5655d5b4f95c511a826275619560eced25997a455d11ec216545c74130e6a32b5d9fa162c401a50aa4317a14a8c9dc52e6fd4a31cec0b4f5119b0e942542323213a5dd22fa089e3cea61151a2b9d2242937cc0631684f38efad642da54a73948273f60c4ac1e9c7bd43728eeb0d591a92fdcf9803c62f24328c2d1b8854808d623c3d021f1f7078bcf20d83efafe613b8e52b1fdc3e31b239e4178c5f1657d1dabe7f787af48af07babbbd5f56f029f70b0b16757bd0ef51da4ed6cf29a494b6583f1bfcc33b62441e28559d7b815ba9b717a9036e663f48575ee0a3b2aa44d442a9d103ca86108781d981015fad87d335d9ad8028a5f1166d092c70acb0fbcd78c9d245f3fdc0674b4978e9838535f7410408dd48f057774b520b9a40d67edbaf532ffdca6616d5fee69dabde0482bf3e878319bd95c044014b5340f2354d85670bc7ef7b32bd04b62a6c4c563efb4a619bb17e2abd2246c3643d5b8d083ec7169c4a177b6f1baee6b54a27c3eb813741896494419d1df828703b2f849355ef1490f347b1490f487fd4e3ac653840425ae68048316bc2735b75fba733bdde4ba028a30b8e0e35196e8fe79b27d3cd17f903216641e070139da0a9a52227886804fd41a9dd53e1168e58268461fc84c47f0f8ce1f49a3a588f986135f5f78d109b41b0f64c9eedce1a77d67de0881c625f0e86bb1627c11e537092b50063c120d63a70ae1d1baa4522c49f2c5dc5be84ecb072f7581ffeaea1972934b52332e125c9729b39b9a421a98d871c1aa658748794514e36b9b9e7c2338ec01acace120ec0388da4d419f012128f4db1a22089a612affad99874da79b5c399043366116ff47f5d9c58df9228afe7adaf29e6c68dbfe21a12d7790510897b88086f28559c2214098763b7c4291456e5071efd9d8d0e8d6f64e37db3e02674be1caf2de818913af35d03dd742c7c6ae87bc38c1cd2ae2b049ec334358138352d73185952b5e87ea4c864c89dee068c3ab04aa61dc6e5c3eef8743ab288e6659a67e819d6b08805699ffa3feea02043afa9f941a8a8b12534800b73352967742f04a04f175e482bac780f9a04f36e8fb239c768b8ecb5a4996e9dbb5410d347bc654e38a12640c151e0ca99d68649d9c8e0638e0bb12832a069bef0403fcd5692637edcae6e32b7dd09ef79d13d6c46c47d3bc01c8e598b1d233e6305e9cf71498456cbf4c62a8e1d7090ff1bd3de1f069fab978f84ce016606f4e3a9450ac1efbc5dd0a0fbff5823318c03aa8b7828cdd28c1122cb40015f7f353b4f2ccd8228d7a71d19778c110989992c7ea1f4b6a88cc7d4eb0f079dd0eb7026cd805fa0ad44de62d0fff5aaf486a758db7960905cbd42719e6664c4d9f4c0929db9546fe20c150fddff1d4f589966a4e61861d2bc4b4342fb4ae05589a78207c811237ffd059d2f904b9319901741a267307b9af41ec14b3d20c85c252cc4c8749373cedaa9acc97790c452d95a5c16bf30e8cc6f1233bc1e7ee2b8417244b6723d2b89a11296f7baf3b3795da9c6c85b24ce8e2692821d22db46579988f539f0a738caac4c5786c61c3f3d09f0ddfa7d96e69ca5182947581166165059d6f2dc26c59a2faf59935b96bc3c3c61549a6985d7e6a16f83797ba92a94aaa92ab18cd824864de2d79058ef23671660ea230f26c396fba4c9d3d8e36752ce82ec24d5d632a74e8e0a094c530a2f41d3d6c221a0b3db585a94e2d2cd856b10e8861a498d191a16a387263804e9464e2b3584716957c67c9f735235541bbc18a1632976cbaa0e34625521432869bd8266157801639847d99bf95c1c3d13df7cf69456080789449db639d35a9131ec09938215f5127c525dc5955d50b730ee09878a5ddd53520ae59732eb536a2724e8118f2e6ed0ee7a7485b43a1b12fca74bd469988334b8fb464866684bf1d23d30cf4ad7520c4afb6fdb8e155315cf1f439e485605f6fc40b1ab7bd93c02cccadfa836fc84198ea527c796258df6942ee0ba51fbeff853d1b7c61cfea4faea9ce187bb513a5f8ac88b45890dde0ca6a1ed2282c04af14324c6d3764b2a8799feda0be876423dbd5ae9b46b8286e0e74a01de4a396a9b52becef00ac2f75010f9d9b9d0ece97429b8471d971b5cae9e142bd0cafba511549f233742e16c2d3fd59a1c0dc9980e6a90b7901cb114d25cbc39cd9f6817724dc83163e92f9552d325b9d8203fd44bf6a27578025dfcc4e11a910b4245b7751212b1304453b58d96f7c5c0cc107f0b19d1857979172319d5edad3e9962de0c028b00f3c447efd314596d27daf9c258b1cb2bf99a4bd7e751b6919c68a0ef18bff81757d8912030543e0bb3010028271fcb9971b223ef565f0bd7bbb55a69613dcf6c88c90b53d44eeac76aed8932c086d9211d3da3679f69dda4312da2e77600aac35552e295cd256009217fb3c0a4603d8933d7f02b0497981edde1b670b2a588f4c274650bd356a6207036482123b0404add0c30ed38cbd2673033a1f1163df89804603ab5c644eb7119a9aa6eae5728f2a8c583ae37752761ddd92edcc563fab849b670631f67922115ecaea6fe8a1d626c6b8c81f5232f54b49c94ef2b9ec6479e92568f64a7b5ee20853aa3b2b5db3beec1edba7b4cd14116d79403a7b0c6353d62ebf20c351b7677b6776abdbbeb27ae4e26104a71abd6b1714e9e2d33afeed97a3bb3880e3444598ecb91028fd11b9c3f45c373decc8bd2109a42f03cfb4b8cedabb2fa7a7a30a7160397ba49e2723adb5be5f3eae79014e3eb1d1b1d6d6829d32454b4154db573386456af9aae5111b351ef18f947a232b057a1f0c98b24240b6f51629760e3bb875d6ea763e48818ed48c1e1d798090c7351a319bf39931a210049ba96294f4ca6945bd65ff92eb7fede226cdd7df08849f86a11640b722b4aa29e15c76d96fe889d240f53e20ca390c8dd0d49a03f36795517c226c73442ba5b300a999dc0a28a79c584040730d4e6a930819b62222a59cb573092e12a6c7188eb2e43318c561cbff8088d36a9945e4fd8b1ab832a9da78033c84d77fe504a81d9ec18d2e0405de73cb890237ccdf0b3222b2fe21c474191e33a11b2c431416283864e689b2874678d5cdadd510a1e530ee056c75dc0e926398ae17ca0bd84cc1f24e0ca0b76414d67769cbc6d087a78819c312ed88dfe6e9d4b3de6b5f8d336432c1a6e6eb537d0f0588c9bdf47af07448f2bd5dc14d7fab882cef549a325891baf3fcde24aaeebd751dbc2cdf1e2b9b8bf8d1051352ee4e32931f14dd19bfc969a894adf5943059f8bab47b4bd93525bbbcc97c24b7eec32608b1dd3b747226ab34ee499a1b17dac950847586af74b2ce4ebd32022a6bf15d2eb5031ac71edf8049a408ec716e2591ef071b5988f1c2fddd80ac4ba20c943ea7a5c7822e559ac0b52141ed9362ee2d483a2386a91f62e6522549f808e2df22104b2b78a0d4cc250c9fd07a267bd06a3f42e6cd4a28884aba7d838a50fc3760da2a0103ace65666c18b033a6994d167a21d4dd0c08c9bb23aa270115f34c35b16700dd279bd941f965159bf2a23c0165636e291e5733692d79bc314074d969571510c98218deec3f41da6e143692afecc42fc1b00409877ffab7b33cc990e020c90ac028ebe0e4e59568a4060d4827561ef785578feef5d0e85a58601ded7c62219ab91aa235832654c5bf0a550c26417a562a36499bdc5175bb0ed2063a399fef0451b0f6478fbb0d135beb2daa1435cf382a0c3735c34fa5ac8ca26911db934b90d6cce2c8e247e09a0c1522675cb5be6070a282eb10e9bdd1471bb3f156d82edd1fd2958aa4c3686041b3b8d85ebe14843341ef412b3aa48b6e0be519804c7e6ce19f5edfdd5ddfdb015c41e80840ac55a7e70412a0b1f4212dfa43732402f24e5ac8e6e224a27d3884c8783aaa6743184257c3b1dd99dd21d5cf4b13d50660eee8cdddb0e2beee8846cd45d7336927917548df8af0ad1ea4232d6e5ef08f165d6591b18b00354a3a9072ff6f8d8e0ea4f365986b2e1ebc9f783fd60bfe528212239d7a525be76bef03d5ee76f083b2fdd13c4aa78f0d07aaad279cab2aab01fa4fd1beca5bf02b0d92c25fff720295b2aead4b1f096b81626a413d86ca26191ebded60876d0412152eb4c2b767d522b20992eaaa40c994046903fb3d13c46494c87c0b2705b9ce435a81fee4d079488aada00f359da3f41c7d4d4d23e93068fe1a9ea8a2238292519d9f8b9d39c3f290ce1414c95c044a128b898afa12d81c958bf8959d87347ae668b5fe9da2e20f3b5a482153afd847a4202df1806705fcd79d4a8c118764ab99afc5398aa04cc3de1464044841cee17284d89d56c794b80e3b146192cf02621fbd09f9215f8c6d5032c3932b25927bd8350b88d526f770f70bc4da2e81f8efbc87f21ee58bbf7b16b6b9a42a43ff5ec7a75354866ded4215f617e2e0ea07994443398669375108dcbae1cbf4cac67ab8b7b378e97dc3c3601175921cef0e5ae424cfe84ef955c97f51ba0695586e179858ab94ff0cdc222d1b62acfe73ed363ae81b457d30da9becf7a720ce25f80f3149878af6acb856f391a82243554fbe466803af82dc0114ea62919bf9554cf4267797551fcc7f6ad6efba623e336c9484cf2ffffcaaf137d47b4d299ee2b22dc0b5704099e2528ee920ade3fb5aecde439b25a068d699bd49c9df9cb376cc38d850cd418b657c18e303057c1866329e3299707d409c1c070693707b30470613c9b6c63a2891b183e5d24fdc89805e3ba8446d548eb042149c81288acf84a9a7dcac1d86183d09e909ba75d87bcffe6da3717ca3580e63a9553d8ba7cb76247db476eb5348d1a9130a5855eaf122e814e2d63b448fa2cac21acf1a15165a004d4b9c2f77d5f3a83938a2cde47096391e59031a7e7c9b739d3b1616af9d95057e893a4bc97322d9e8020a23ece1703e69820d773b48864c3fa403d16b4499152d0b4d91af142a1711b839a953d2f004a0251ae1735e0b0c23a4cc9465263b4aaa2ac2a31560b8507d243d23dec0e3c25a9fa87180b50b3ca6f88177594c489c6bf45d9cebcd2e06b59025e7833b528d81aeab5cecc8519a50743cd687d5195eb165a60216cb58d98798e2bd600f460cdb8bbb101bf6cd2c2f1f62b0701d9ac6cb97326a6655a5c39b7cd1fcd183990d0e93690cc6e711ace17edb5d8c529c00aef2c5194917232691ffef155ef53e272085dc7a3cf84d94985b0a802670b2a833ef829603b6e328ff7f51fb135ca16e729f065e0258abcc980966b3f5afec03a369e4848ead8899815edfb13a233750010a2c7516c034b05c17a077eceb6a8d993b0e80b1607da3da2592c080c84f2dd29df6acf6a92d1a656cdcc493d1223606a5942df29322e786b2336a366926358941dc795a99493bd32a1b0a7383c82c2b9e80548928b2a0392440d8b81034d817a4019c19f45ae8f9ace14026ef04fc574de675ce9a4fa820675ef65d9403170bc004880536d8ee11b7d1faee12fe3e63c65d5b6a028294b51621db879e2f58269f4326b1a52b2130e98a4c0c11cd28b05ca6095166f2eca2dbb60f05632ea9fc50db3b1a94680d5c94bacd4abef76856a8c776327a4a955cc2a488d2e2b922e9e2cdd53c19ed5ca259c8e10691f0afcd32c1e59291201f8aeb594632040d4152cd5ae12445c7d0423011bf41431071503c545a772a4b4afcf79c2c1d9bbac7468f39ce710251ba67c74444477838f66133175e6dbc25973d45173f7d41a9e5b68a024ce39aef5f0fbab8bb49ba900ce97869a70d7fef8717728aeb25001ea6ca7f9870ba93346d97c493f45360047e938074346f44ef0bbb5214bf0498a35d4b7bc1ccae0e5f320c418e6b77458a15809b5fd54e45d5903b444f2ae5dceee9b8e2c10f54cb1da28a58878b2707848b956fa4f32ac0e8f540748a1fb4e072460038ff81dcb8ef391aba966c83183fc1b62ca4eb98612aaa88c543ee65b74a883ccd808a75b18ef7dc063278a1895c4d0300cd3219954df85f54db48e3260163a1d37648f1355294d389e3b45057bbe2a72b1f8dae4db5568d6bacfad391f82fc5a266bcd9d4eb79a48c1c59b7b37814ce1e9fa82243b6a43879baf97fc8a64949e44b3113fd2a7b6cfeb2bb5b8b961109aa3927775994cf149031ce65eaeac804e54b3bd6055ae2658ed30e5fe26d415f949fb34565bcfc29ee6308e5ce701125733d0190289c4f272d92f07af359de58dc90698bf80020bf24275c24a885534df8e714e54dedb59e93fd91ec32b22fb0b19357d9d12c94afd3755204add22ba988f7af180bda0e882b2d789cd65e4df388cd31b1913681157738e27424750f27c8cc8b607439130074bc489a50e7a48959e5c709faa0c3160845850955ff2adf0d448af2b123575db2a85285631dbb8659c0d61212cc69f70b381abe26ff4119c7be9b7043651d5210c866e01b2b1b528d916bb0372a7948aa780583a7d7d9f9f67bb7b38610f63b5814709048e37b8e4e06e544a3d74427d5b657969b288026e712b583ef2eb38bd115c54e85700abddd0e29aaa2c3dea91c85bbfd54492269abd5988e328bb6c110096c76bccb7e3be0d31abcc930bdfd87f3c888aa2bc4d95832f1759bf853c33f19ce118de5e56b6434a7068b54e0e177672a961af04c85631a30c1006ae7efcbac5927c5fea8e77b8ffbe5f8ba36a13f402cc856d267a00297dc44b6f05d78bcbbe4060624543ee8ba9266ee58d68288c201351228c10a4395f3c4d12ac01acd133a0a28411d37f1db6e84f8517d03de9511f6055c5431970b6cb2fb094e56f6523644382bd6075ff2cbd602bc3cc7046a0b23a164afe063aa19114b8f02c441600d60f7aeb70811e7aa1fef8837e9e4d1ecd1af82a87170b2f2f0435fb1787e4b8071a2095319d2bd369df8ad4c87767cdd520ec7efd6351915123dbe6ff4591cd79c247ab14ed18f7c668c351e8de02f99523f124d7821c21086426c1ce89c6c97666fd3f6dd6eb2af0b8871bb6893d4dff5ca6f7769a704cc610baf8e3950251c5392832ea5581bd8dd5b9c0c94ad3c75cc57d00cf2fc7a84112494c6a73c2158c50653e573d20b512f4762a45438d244c9d75df25b15d5f2852fa7a6f10e7d696256ba445658cf2a9ad10d519b4960bf8b3909a46128def2abfe9feb3f7dedabc46cf692ab5f9573e67c3e37b6db83f9c7bcf693a05e0cf9baf9c712902bc6260790018624505c1d249d0ad3ba4d85c89140c08932048f04a6d375249279c0fed0d16a5920994d3e97256f77207fc426a552bf1b92d5e786f6cea21d76dab666180fa57dc2571471467afcca9b42f7d71703477d7cea483dcb353a0ddfdbedc31467cdbb01858991c88a19262d7b0b0880dae94c2a9e2dc392c2632369efd735c65b1e3469d29e2eafc3dd3f6bac2fc048e9ecec31db082204cc88af561b25920053e934855f6f584ceebee4a952b4fc26a9b363107a5bbe3b13a8b83a167e8f90f01de27a7fff583243bd38611194c921c992e8120eb953e991c3a4a4c7126a2d004787a0d58cddfa460788411718cba579a35649f585792d29aa1e1c5a2150330b49d9a013876a06497235f40711c7b34555e81f8ba774130205bb3da9f6364124d25b23064761ba0b383a6f2139a14ec64419a0f1db91d4d17e8ab8a7a63162b8100278539e5ba146685eb92f9dd0bee5f8b8f5b53e4883c6e8df6afa359b7826ac52b46f72be10b44a1ae813e99888d6e0d918ab09f1e5d7f21e3b29fcf526b3e018103d1cfec8d1fa527966e690f0540b928d180582d06975f98e5c0c852ba887d52b3a19498ea5b4af7343aeb516e291a7212896ca9bc7358da03e3d949eb05196d8c4a7c50820c64d84cb00b1c47a650eca5177e5ab335f4ab0b8e06071b1aca36494a888d5b22b01510767bd3576d1f35df520952ecba06142d4a1316802bbba2e56476ebd2efb25cc8386461075608b79f5152d238b654cc50118476d7c283d4453fbbb6dae505fa358e75c4377d6e5a0c035b51c812bcf663f56778a1cdcb98bb2c0473c03d3f84efc75520ed3ef309e7307864f16579bed9e67d16fdd1ef4cfac00a63a981e112c6bf4eee3ab267e8363dfe3b65dd0aae983fc241348aed10b750ae04609cc84e09759ffcd086ae1e44a06342658d780ed4fc6893c607e29d7e960082513172020699a0fb2575af8b57ab29cdf74a7babe88bf3ccda8fb48e904bb66adb80374a7e68fecef761cabdb46b9aafb9ccbd135d15708c072368067a120c3fe7a5be8c4e5e47f1423c0020018000f23a7d03334aab85a4e3d215382b5b48ecd111780ec742f3d1d204c489e497e456467299cb1287b3ec496536553a13790994c6ecc924b0701a21e5fa9be70e901d6d23ce847f9557ae5e91306a3c2b96af8aa78b0d6e82625824e73863bea021a56d24d37c635f2dc316a4c989836f9f66e08217a567d9423188ad38946e9d2207cc2fa8c9e65ca90d225eff2c9279bb884040e1dc1cc932ad7310f559e5a5acbf34ec4458ff12450b4cd3ae1370b518f68f7e494c6b23eb2c8717436c0a8480aa3a741b2fd112e404934818ece31835a3d689d4c6ff6825a477f4f6a4f3410881949f1523a52afb465f71a1f12d15358d700f622e142192def10ea8e8ad63b63ab1688ed19c3f7f94158f8d964caed326ca0aa40c226d61aff2411d948319cee8ccbab5e981056c935e0d18b821d138709d13247488ec8f92288146d3386099c8eca1287c120e741b92eb01353c1061e543d381b9d1a0d8c64f99a8dab9a4051649b61cad6f8e86d40dbf36fecc3d2f25356319df4f8c6a5840d5752839357fd9cf922ea070aa15416010d7c1a8e7e530c79b2aa1bcaa7dadeb3e40c8901e60c0b02cf511c6ec2ab28d5241c1869a76dbeed9a647ee48791f68a3cff4c7642ddb0b95cc56c2b81762b645601ec0eaa787686b17aa36f0908da9aa3e2a4b125ede183a8f1e04af707a1d5f010d5f7fb8faa254294a4fe1ded81ec2851ecd91f8bfe19a8ccb016dc74fa9576b9802763311036554230fcc160e18aa1033f46adad229e38ab8a5063c6d325e08d1d270a13a7afa70ceda4b660993c4de36476aa4e7d0b8581dcc2914a37be85f411f53384983e659f4ae9e6025360a6b546e9539c0ab546db6bd0ffd3f05c443f3d28b5c16b3f6369cbfa103121db4f42306afbda1ef2a88ca9bdc14aebc35f55d607677b3b3a214bc395b678310a260446b2591c399fbae2d806709345019b2a54e5fad8bf5043ca20fa2af95dc8a20f2af83cae10ae70225480adf23e9c5a462b119c4ad6d6c03b8e2f35f6401ac266e5ed86536ce3452e77022e7b5af5f67758d629f6459a766d6dfa2b4093ff3e63cb25819be2c222d5021fc1f9609460493bc91b8b590ff41df05b4186bfc16bdaacdc12aa684a87d3740ab2ee3ecec834ba85b08d07629a18e9b6fbac472cbdb05434e572955749b230781267888a871d82770b814f671d5e407a4299a8a7e33920df93821b2259d4feea2507ef3baca63912463edfdef4c4130c4de2de813f0ce23a5cca87c36ef6462c4a87f3b4b7a2454af4170760a71fdcdf611d454b76cce3133ec69e69e9da58c8cdaef9e5c232cbeebb8e445df7c6fbb905d70bd4f4eef2c2218771a0552c7f6f44ff328e9caacd6f758cc319582e09e4a44c0b6717f709f8ff49b6855a714a5793310a3520aa919731476621315c9ed79a8b957e7a5cf58a1ba4b7c8283d037190275312f52c5d7188fdd7ac22071aedafb33c07123321d2206de5f3aedb1c0c8538ae514a09c6bccb820743a594e982193e5bf4c9b35920036de165753642baa7c136e770249b21dd5399ac7099ae9620c89504c9acc4a9de57cec9af9e001042ca6b2e9a826ae1ecd461711c2e8386862746f1ac8d0c6087516094640ccf59fc344fb47ebd0cd16ecad73745b978c015598f85cdd4781b56222156d8b40b4da554546860138451920700e535326e75a7026058ea152fb8f7e325f70a3ee80163f1cd4abd403ed67150cb75ca3bb4a0abe8aba29b1918ea76db8c1ccd0698d608d89c83c76de26134c8914266e9bb8ce9e614d9144d6544143d1f416e030c762369a4306a71a71ac3d4b062b04a2839f4c90077bcaa27966b9e3f3d95b0c7c059750869556124cce7496a761d905a3b10cd2eada6dc0b2374f24ab4abc7ddcaf1a2806f857388fc8b1e1aa57c6d4ccc649d213e9668359f8de820253c14aa95851019785d48c0dc6299afc6a9f65e76bda4bb900d8e319302addf05d8b890f4d2b961921506ea2d063a736a3197bac0e9086b5723aee15cf1b476534098147d0a3b62c8fb4d636b0111f54f7e09360d38c9b58f83751d04d2a83d287ab5e661da8984c6786fe64cc057e5a54354d496effea3ff272463d717b43500d11fbc851060c1882b8d6d9b122f5c937dcd2578f1355ab9cc3012a7665c14495842f2d61cf67a5592855d0ee0c0c16e18b2ff8df10bb6686badc9c6ce8470c22e3fc8a2c48d008d3ce712402e688f4e3a521f19890048be66904374ec88b1d26cad91d54abfe420189fa6c5b881b2c089b4f0c7daf9aea488724393ff927fe8917227d13d40e930dbbdedf4f8d5119fa8e53530151f5f8714e651c24ce725271af74eeb3fd5613fc113daf85cce9ad8076975d82f47cf5adc4c54436a1171c8af7d955b65e0b81fcbd03e1388825c5ca8df94c376c1b16f340ea623b492b63cb8ec1f4627daba105041c2ce509a84b5c79c8bb28558a99d586acce6800059c025d283c0414434369a4877898c209fd3292110cc647e93221960e0e73499dcf87c890302b98b5537d4fa866c24ebfbc10021612b355cd09a28ef28e0c9af0b1142009a4979a7dd840a1445f4d6995e8b5a3b0fe7fadc9916cb3c6a7fd412fafd3030608b8c4e6ea4b254261cd138d08c4ba5ea8ce7ab3fb409a680c3183b7bdfcdd41aed3905bc2d381f39df197c7c7e431a549124251b9ab71dfff37075e8f3be967903f5ad6a839871da4c5bcb7e758682714967218610ea435566644949a12bdcf20cb5f754b53d194d43783e0b3c2af7dc75723073c2e93da812104f70c917f82133e5b1839d57187b6929660723ce7be5f31e2433fb00431c04c75f485e84342ef749c4488b79403f4ba359f83e28720b408c91c9a5d1505cf36e4ecf019799416638f592fbb138c0eed83d8b4f30c8364ac795c467da299ba6f147b962b23bee1c176011503385a4e4b10782f01709066068d738e4cd2022c375eea0303feaa339540719db0b5e50bbc2c32d62f2bf60bca389a153dec0ad63bfe8010126440a30252d2bcbd6a1ac38a53a2cf423d488f5804ef55a13866b0525664738eccb3f4cab549097868b6ecabcf8d7b6e5c5c20344cd9d4246c54a9f3189abc94222b9c8b5e4ce4f6a30957196cde95a87c99bc5e986db135a7b50dba90ca324d49f25d8223d3e3a40191a8c04d8f9525b18750ffc6bd6e5c0285dd129e043a849a0a77f1424152ee6f2d0c6a20a335e9b2783696f68940a537564b259dd031d4b9a151c065dbe344e3a5c099ffdd3cb93c95d7a2d279c250fe4b722ad8e24287b8c12f56171520738ec750e7897013b44d6b4cdb8d05ded9df5627f23079d2bdbf27358c056064d5198d90900ad336cacc63d2b09575d20a2078bb5bc0f6fce6061287a109d5287124c77ed039499027a09ae675920d23a4a074678ac311819aa495bbd4dafd07c4acde745082263e01228b94d7f03eb81c845720ccd75098d26337310388805d01b0140de15daa4e7b0b7b5dc504c78f55e0e4b03fb1086ab0e8e26ad91bd0991524a99524a01d506440612063434d12d258ee4c5abf2b3162eea9612cc07959f5fcca5596bf4a549e5e7a366d1cacf5d9ab54662207118ef3dd22cee722a3f73b75a5868968eaf38489af5c6547e56d2ac4746e5e726cd7a63547e76d2ac27a632ac1bb8b2dafb14f8571d0f75fcb620cd2d46022da67822480b1a9668b165686902881d82d450010b2696e4a7861fc040288c1d963cc1317a810c76a0c410535a9044143c9822842ec874f185056f901144961fcc48a1b25a2d9668f20ae2880c93323cf0051131a0e2ca983345bcabf66b2e308419675af093831251ec10bc1cf9e00a98208e9a10a1f46b180c22925002892a58a648e102898a1655ec208aee6e096cc1248724729042093548c00611501431718498301e589d7d2828b7252a9e10b3051b44a09185090d293c3cd1050e466092f4a084ca10c2c8128412567cd0831467aaf860040bcdedaec14344ded269e225ca14384c016507177740882caa50238d2a4d8471f1f31063696d4873fb41347d03c6e94b4d9277e1047bf5f0e544812d67a89081c50735ca70d1a860cb196134f1e1891f2214889c08084f60423c4823cbe18ba01bfcc006195856cc0f57ba6cd1240666bc088a6252a2139587048410427f104208218425687afcde7bef41082184f01f7cf0c107217c0edd9f43082184103ee8fe20e40adf7bef618563de7bce3be79c26138d89b939e7c2579a317271c63897c61851592ad5abc751020872fefc3d6666e6f76673fcb60693129d8a78efbdf7efbdc3f8de7befbdf7de7bcffdbdf74a2fc6e71fa3bfe7f7627c2f3e089f3f94cdf94d7cfee8b087fdf91d674e4a7f2725aac29de18b5f84524a975b26e54f089d1f7e4721c3f79fcd925b97e04fb9234bb2f38ffe1d8d5a003ab865737bfea6c6153adc31c91edd8eee7f04c1e6cd8d8ca71e790a9284bb8ea8cacc8f71286a3586725c5de3ca7acdc187ef65af2c08b0a8aaea1a79815213b1f7d152b2f7d1524eefa37bce39e79c26138d89f9b4dd7076eae11ef8fcf065b3e6d625e6cf66697ee9b1ecd4532a4df76ca39e35f73adee8b6801c28fc656d2b96329d7abc04b71b54b7ea9688cb6956073f426c7bad7a1f5337f5c518618c1f9f9f7a1e0e33f3830fb25e8b5d4d54ead30c8cbc34a95a5da33080b26883183f4892eacf1536d14b1d49017a97dc5e77dff3b6e7cfcfb5fcf4e8c13cb8f6e891ea548f54f7783d7a742b0aa520848516be184ad5242ca6f478610145ed960bd2982d432b57fe9b2f8852dddd29f8e8c1ca028a152582ce609205116c30017ae205435418fd48891d2347ee18639c1abb4a1a5cd57b3e0129d5f8582f37cd5b24156e52e69bb01f13d85280e2d457b11a0574a133055bb8e03244c31763d0f8c0151fc2083194858d334662c050f90923040e3c1052028d2a6e2c49c3cb1b2e7eea73660de082faaf76387515ffca5b4bc50c7ad0650a2957b45194c4062eb278a1220824be28c2958489164bba486222ca192f246046084064a14119314bb8785115a77a1527531324d4032b590fa620e3fc334bac9bc58d2ddeeb4566e88a1a222624461432b0a20c157861c00e80f001cb0d3a84d10388a591c4a30a1b10b9a0b6aefe20cca33fc8aaf8e7a4bba5e372d4e582c398ea5b47ab952d75005c023f1deff907e99644f22152a4595ef98f346b8dbcc052f9b7895e2aa85d564d425588c1568c19a19ea9fc9c3580cacfff6560e5cfe1301cbb8e15bcfaabe0d507c03cfac41a78515a7d5c13d21c07f9e1df0989f8bdd79e8713745d25001441bb2f3d7fceaa14b5225a2d49d73a8da67eb7ce1ffe6e9dbf7f6cadf69710a58d326c304345d10a843062b70871831831f0c2e40a177c310365c919319270d021c913345082c4182a5eb090410951e00aa7c7b4394a450e2fbc50c207213040401ab8a2ca96a3206e188215ae124b27b0f5968e0874dd2b67cc58c305990c8104e4d2beb81250c3cb869fd559f26fa95032a6f21643d75d1d047418a531b51b0b237e30c1ecd8e9311f9831dc80e20d355c40831f0404a10a275c9e6cf1fae132bb8850d7e8284ba5a96b74948419ace705d6a56409fcf74be4c7dfc782f830b7e3aa7ea811d16106e9d05d83f7d87b0c7001edfd77d5db59577534e5aaf73e3ae707ca519ad536d06e5f422cb03cfcdd26130e1cb523413bc111026c4149789fd2eaabcf7dc02de8cc0017506e75fa6178b58ba0f0e3f3efc7d05cbf6b4786b8aa17a9097085765ca5f6f31057599eedd8bb9d608b834289f0d8fd7de7ee9ee38a1c57307bc79b3b7c1e25c61c2ee4702999b7211d30b30e628410aec6012dbe2cb0c5e1872a826af797cd1ca96d41b8e13c0ece6b56739d230730ab24d83c91fa1e562c668b450889e092ec0a15374031de030e369cb90143a387c084260b16924c1737cc25c460721a020738c423dccadc02a3e1f190bd7c06118b86a206fc40cc1095b49b56cdc775a2eaab6b944699daa58886f879af59bdae1ffaf37eebf71f6fc546e1bdf727bdf3bcab6dd0d8aff789b77a67b572eeb1cf255693a7bc2af3a772563b3b54ee318405c8fc2f74c141ec8425ff32b344eda0763755e2549953e5af5095ffa47c1a0433aafc541926aafc5752e573695c51e5c7538f5cb50840e49ab08b77021a30f052fbb1e47843ea55df7c65b239c60f6464cc05aa55fb670fb58dc824257951fb61ca0167d02e6bb1103b16dbede8b1bb650c18cba58c25ca7855ff372306d59f33a34cf55f9d2145f5dfd9a1fafb489ae22f246ac648e151fb1d857277f7414975779f02187343ed67d4eb60e6cbcb0b13494646620011268a2ada90e2f21942e4c73ba3fa0f5a54afbe754532947f97a940b91274403b9c16bb960c336a77635ab0c5993aa4c85f5784aed2e1afc37f3914aa91a0cd797723a594524ad90ad22affdd88a87cece787b704f831a4bcc27f48ea03f23228437d40e06905aff2b136e26f9ca9f2df6902fc4635e230c88f61e2f8632f935a09bacac7b69df7d118f12ab7c5f10da75970436d52e6fbc62625f8fda4b70e424284c88700442eec7d743b79fcae350f2728d675d0642dab9162d2146d331d24002fe8980a7f0435288f018014da6d125369216f216957f6f079cad64273f03522cdc187cf3aa21d37a9f08de041090d153e7c6a44e177d0f23c317d940abf9999fbe3f3d6f59bdeb5f97dea3171118d002b487aa2ce47d22d2547c8afe15d47cc87ffc29166c5cc03731bd21c7cf852f3690e32166f611b1276651bf6af71ae821db41a837e6d21f83d057e0741ece10f69161381ffc3dddf094965fcbdf7de8fe6a00e20cb04a6ad5c051f6b2dea88b183bab563a89f4469d650b39a68d61a8d41d4b5960a798c97950a61135518b9194bb360c7499cd42c6ea259cf8c0a99f73481f5527bdb690ebe8f763141fbe12f0edc5c68247a46ef844f00fec72fb78ed64742aabe85a79ef73c4e03aabd4bf25ab421aa59103e076afca7755a7dd09dc28f59bb6297d5b715d16a8a7f88f75973a8e7d585f7744773efe5636fae20ab0befe3bb8ab74eabf0db9f3f7f0e5154abb059f03598357c5c4da84d307facb3e55e1335ab5b0348da6de24243d4aea954ff15d344ed1a8b1827b56b2d34de2f2eb599f955e8ca3c4a306bff9b00e5c7b5cf2d0f9ce2aace6babfa176ed9f284b42c2007f47d11dcc29a10bca2fad3222ad4ac0e0af594e698ce147de71e8b43228745f0b53c5c44f587519a6553fde1146f2571796f5c11f5d1cf1d7ecaf5d3efb93b8428448d213b3b3b3b3b7b7c87ef8c6276767676ee578128640a832d0568ff4421ae8876b33290b75aa8a934cb9f534f2abfeb87762d14000dd880f684424210f20da010ff684e6a3fc4c25876865653a010642028e42d2b28a0f0b0782bb5d34fa8e3beb6417f6ad72874058eba51fc7c7943ef8b287ebef0f2f305c70968a49145881cbab08110d1183a8ca1c18b0a0d42a091af2e324c94b9d4df57757d9a952df768ca5bcf796bb5aaf73e56f57ebf792ef7de6ef7428531c6cd889456eabec7fafddb1f0dc338ebd6b65a47fc5502345df34b2f35a0e992bf5a3743dd1fd7fc9256c38e4b96e055f83a80b050859b6fdd0cd5bf4f3ae22644fe561fea9abfcbd3c5d701c454e366a466b7a8abda25a9feefd4b3ef1affd4a982fd9478b9446afcd5505f1942f872c31e3f6d0e1503acfc6e9a95bdb8c1f06a0cb0f2eb1f60bbfa015d2331acd4ad625059173f56734487ff2659a20a334748548481a58c294498c982861a406798ccacb9cd62c50a228e66d0c3153692f80284219640628c254f361db400585023304775d3a86bf405a92a497aa14b0cafc27f5bb748a71564987ad31ca7682a0baaa023ade29fb4944afd77ab9a3d638ffd6eddaae2f8fd5dff6c77f744d39ad68013740a5071b8554d8bda7c57c2f11d571c9a8db6abaad17c786ba75f2d7b373243c5301acd0857ecb177eac99a4ffda7de8ae054ecf7b4c20d163261542cc36c58239592bfdb5b4e7308a8a24b0de364bb7477ebb72c8f5730672abf32987b4ba139fe1fabc38f002168c743f588b756ae627e467a361c591eae6cda62376bdc721e5b3ea26bf4e55519cb909526aa0e0bd0af791fbad56c3af66b7e5d3e2b57f1ebd84d88cdd35f978f4662a331e5d22605e59fed4873ccc388ee77bb464edbeceb602f6bac469be3a16eed16423f3f3f01dd7cd5d809a9f05f780c9b1dc3987fca7e5fdc0f3f69ab1ccd0c8d3911051e3d5228350002a51851e089c08b71db41c1b4752ad4f7fe23fa8ffa8a68a6cd55c1c7b4d2732da4a6f6e8c3b09d66edec69e4454a29a5945246e906950b607f489e0c556ab0ce50a5d6d56118bdcdfcb3aaf74040414153dcb7056f3196451a12da76b7ee77398cb7586855ef53a96e8bb6c85fb745dd0c4815222d518d713342a4b65c63b9a5d8f2b20d4df74235f2428554ca0563a2e26f6ae9deaccebba93085aa316e14cc96e58ad2af492badea7d49a3b53341853342235f6e96a7e57c8c4f405a3e8edc7038f9ce49c1b620adf23844a38d08a82231870b71c6a8031f4715c1bb599e963348fddcd9d96e5539b9538d1cd9b1aa713382a442232f3c108d3fb1ce620b7bd3ef635a9056797c3ead60aaf1b118e306c3b4110155646a2ed4a8e5a8716a22a851c351dfa947ceb9519b1198b492465fa944634719fc18e1099532280663fc311048cdb997e6fc23c7ad7afcf07975f1a3ea91591d23d58ecfa85cf8c548f1fb3908e6c1537009fe0c44edb81a37ce414f0eb4e3a2ea70bbe12df2198824263436628c31c6189f4d5d8edbafcebf942f8a12bcfbbb9b7fd90d8c6e2b87931db41022075da4e860cb0401a9882cc600a34a0f1eb060a6702264460a285e7089c195970f5192c862090ee8fac0e8568c6e0b0165dc90220c17f0c005071708b620f30518293f3418c3b5bfbb3f777f1f40849473ce39e79c73ce39e79c734a29a594524a29a594324ab99252164000394e5266ab4384539152ca18ddfdb9fb737ffed3dd9fbb3b7408e17377777787efeeeefe1e74871042082184104298c16704e4379d4e77e8d0ddfd3319238c5146f95ddce8ec66941242097dce39e3364b5be9f418218c70be07df9b2fba84504a09a18413ce09e7bf87704a79ea91524a47556eb583ce37df7c4f7e47827cf95da9be67f9efa156e77cab23638c31ba0c34789234afc6dd4dee73629808d87b351bf76c4e3d6fc379ef6f7a6fa3a66dbecfe68f79ea2995a69434db8dac39f5c829dfbff4b649e7cce66335a79e395f8c349e4e3d71cbb65872aea51fa7538f34c920cda5f0ea501dce10161e76ea812839b99cca3fe763d8a9679a664eed503bcddd547ed69c2f4f3d73ce8fa79e0957a8147caedb51fb4b988276390b3b831f5f8324401bf8bc0fb51a35adee4905af11466dae0e4b1957caf84c8d63069be50d2bf287c84b26d4a50bca055ace90510249ca1b5f5cac64ca17324a8e1073066dc284048616a41fb8d1047da309123bf0d0830da6a4202bda68830c1928af62ac03c8d665492a33101866ed77346a6f31bc9aa4ee77dddddd5bc71008a2dc1ddf809fc02cd50547a136cfb970eb22d085f277376f890518b6cdea5e8da946f17cf8e4b7d665153e26775fee369b8390ab08b23ab722592dd34130a3468deeee9bd47bc6a251e306a146766ceb1e7e27ff3d06df7b08a47bdf4529ffc9cd7df8d4ba189e9cdfc52f7d6b1dadb1ee09084fedd59257f846ed92d4cedd5f3cf5c08f5ad7b53b585beb2284f369db5c6b1dac6bda669f6c3384ed2f4ee7483db94cf55d8f52fe0b314854f53e7598e6f8c7d40e55a6939a43d27a4c731c46843790da917c8be51e94013233b3b3e7a0c5eeeeba33bb3333b3b3e7a0852fc1fcf95fcd0dfc3bc652f358a8b65aa87fcf40d8cb5503c7773b36dfadeaa3df71df622cae4279a146e51612e22d1c5bf7299bad4b516a622ca7a7d93a5ab375a9eadbbee8773594beafecc64a262965499aa47cb486e66432a1321356e249bb54f7d977ecc566a9d9b650d4ec7dd71f4adfdd5d5fe8fddb4435db8adc5394ba6ff245d0bac855fc53eb2ecdc9ad8f9ae3d21cf72b023fa0fb5d17555ee171ed241c7d12b3dc43f21eecd784dfbef7dc99dddd7d352333d485fb36a6190474a05c283f163337fd3084cc0cba9fd535526305a8336837d7c8cc1a55859744cdc44c92a318dacdda14d5db6a6747735c387138575a7ae849992221f44e3d73e5930ae3f4ce11aff97eea992b6fcd2e91e1e44977699b55a6b86aebdc966dfa679d34494a9386f3349b93a6605d23334593a82444c4bead1597bacb8d55fe1643dfcc72703835684d5d231e7ca9fc1d187a53d788073ba8ddaa7a4145a86bc4832b352f26bf3c3188901863d06e1162b7cc5fcacd2f5462aa93d935b46d6560553eb721abe37fd305ed9e7b1cb975947b9c5f9e2804d95829a59452ca397f3f93d1a5cc761fc297479bab7a2f21450253612bbf94f752fcbb9bb78d60524ffdced25ff9585284e9c518a3d41876c53a8b2720a5b8ad94414437a86cdfeb52a954daa1c32aa747a9542ae1d460cb73fafdc74e1a579bd5992f021c753e8db6abcabe468b800d109b5a9a5da396c13541a93e68da5e2703ac8f8666b1865e668cd187103d767254cb53fa928d36174079521b45dd47c06243584a0e0c393a3a82f34938a19834f5465ea052ee4be275133b468edc269392ec4ff135ae27edb427bccfb41ade65b327bc8f5ae7428edac5506116b58e0415be49eb4e329befdd342b083a215fbfc78f5b6e37cd9bf3f14097a76b440105134c50696fb32d135cb55a1d9e1e8a484921957e5b9cf8692549fd53d72893d43f4e3cc13cf88b1362b48268c761c28c712208fe589e2572f7e7cab405acea3dc653dfff58202b77b52bd330cd455021bb3068b33a1d8eda356e7475289d13baa0145401d5ff653c72b804ff8d31c618638c1a1a34be62c481cae1421ca18b31461c2284a0146d441051cbc1cf34253550d7ae095d002afcd432007e8e7c7f1c9739d5c4db3473a3ab03e5163193c9d4416ec6eff3f244b9fc989bfbf97befad18353e8debb441286775245b4e54e488929d26479bb4677e184876393e84e8b19323a594d3c4f1aae4cece0edd997b026253e78eb7861ced1ced1ced0c393a3a3299849abcaeefbdf7de7bbc1c34c26fd4b7ed6905196a27438db02b0f34c618638cd10140efca7eff719af352494a56ca01800a3fd502092018a143ad0efc1c2ea0a8c944654b2643425182b414bd8e82849e547112240403bf9d2868c740404da41c32e20685d3ac7f8b444a2986e4d1cf7c6c6a4024c310351824fb9b1b90579f77a91469b0556167f7f5e576773f0179d5b75d9dd4ab685879ef35f18094529ade03cd8a19cda9c687b770fc22b556ad7229190e16fa635512474ed95995fc1a8d2809161a8d5b95fc9336250e1d227f39c9429db2440447cab971190e9765a53645d152f43a8a314656f2dfdc09478fea971131c618638cb3a8e89f015be07040b8b2524ab96395d3434a29717e7e8f94f97b5aa1a6ce257af5cf8f927f6e878f2049cbe577b414ed6b8f581dff1cd1218624fea13495fae7b8ee89de0140d06ec3b450444a770de13bfc4483c9b95cf638d9c36a3a6dbb3a596612d29c69e3823437420fb4a666db56d1deace1192f213eddb2f93d5a771fa5df5f57adbc554363a371935621f901020a8232c5ca51130c244465084b64757b86853dda337363a039a79472ce29e59cd89c3060524ed3c4302993508d95f409eed39cf34f73fe43dc3f95a21408c9eb8c101f213e427c8408f1a9a1f1799db2d4eb7d52294a5d884f960969d6ae56a5c6d6d8e9c1edac74c8e176628c31a739aca39566e35ae5df713b0d80423baeb20e3c44b4db229ff7671d96672717e000153e37845518e8f6cc009d06dc7156077e57009c0dd487ca6e1eb250df5b157c53568ba070fe7182caa0ff668a03b2aadd910abf18b2408edc3052b6f0021220274550c2f00f37e1207e22591d27a44a90224e4a29dfb9d5f2947edf0217d8c9050523b563d4fd9832e2b2cc0e85ba9fa2266c8b732347aac9f43f8a8a3093d67140ab32c61827d625a95372de6ac155fe736253eb9240b159eafb16e6a45486a9ae95360e745a25f2596681e5e93a5402a206ef4709ca7924964c104b251851f01e94419a4cacad5794905242a1a99d74b51c98d83172e48e31c67e4c829a73e7274254b068f92dfc64a809a2a25775ee1602e73b28c618bf3a26640177c98d9fb8ca5fa382faae8ebb388883504e245da1325e8f48cbd01011162bac0c11c1c0b5e3b81411b4e32953a8bc6af0a494524a294d272dd3e673496317a6459a6e84e5a681251474b13e77611a5c20b44a6f97d43a192a7ca5d273c5863d20f2f12f34e7718d23fcd3849f342bca76612abb06073114e729d579a8fa4766a159dd8ef140b33a8682c876d9318fd318a5d1901c7982c6e7d29cef13e37c9f58f2d27c9ff93e83974adbaecef4d97ce4e67fd26636a4394c7b57b99494abfc45bb4dc12d85e64cefefc3b46dab887e45245b0221a594524a790495524a09655f1533b52b56b3e1807944663e55e0fdfcf0725006588117dd8ad39045e256bb4fa30959d5fb939669bb2a6ca7b4752bb9c58db798ffa844ac9a8872122a5424010040007316000020100a060302a1609a675a04f00714800f709246605232140843490ec3288a62180a22c600820020c810a20c23436407a4709febeb74b74909e4ee745f2a7ba9e0382231ff0a073bb1f65a2da3f6ea6dcdcea0614948ff701a838142a9631abb9737a605e93d07d57ee8b7a51230eafff585b3b3f00f578cb6c98fd94445fbe9424b12ef9a54d3d8e3ac30f1177165dfef97e91e33f29b589237a260f820b1da11e6e2b00270c912f120861744b7b195512dd757582a6a8da6e9a0c748aa1e4b251caebe89d40b326b1416f3a2110d5acc1c20c644cf4b1341f27d6b54860b51da0619d0082c1d537d04775c242fe0798ab254dd9ba8a667dd4dc7ee178cd7f432d4f7126bbd0013f6b195e863746494814615776affb67ac4e36909e98407c19a805ea26a35cb811470a5e2dc8463f17bb589deddc5bfd52106484ad4c3c80e54063972bdc2f3a9d7c824ac29243ed6eb40675d1199d66469f60a256b6ecacb30d0ff290efa77bd65b916e3101e819def34df2e3de4266189b5e840372f7b0990d1034a4491879a50021f94afe228f410783a75d091a1634ecc8e560e1a17fee81f23cdd0f292db41d1a698962ed5b300111b12c260873d615d268c5683a128a3d4ca92f6ebdc543587c8659091a796f41e90c6a8354f88f0304075d4812d769a063916e371f51792ddfb6045359984cf428bf8646f28d8eb337deac379974ecfad1d1475448dbb92ffd9e9cb0c274fb0215f79ef44fc66ac2df7fe4331a92410be216ba2b603036b5fe4d46cdc860f0138b5b19cc6fbcea2d4fca873a8e564ea611aabd254b2dfc3a318ba42b4523fcbbe7fa121be4f87bd207d3c6775be21d85eee7fc8eb6b8327f98e076a9e6ec52740663cb73be2a8fb75e34fc56970a25c72626e8de82674fb688b0274109678db4af013cbe104c5f5049ccab5a304ffc39ad14df344162af50179b8d6144c64569651de0a7421c91385a9302ef89d4d2640aaee0a3748ccb1a424253b6701adb4081ea03f923cabaf09fc14de156a5f34a7e68428120781a1bd7d7844e695acc4f2fa0cfa63bb3480a620720aae01d011e9b6a6211314aa9a08b411ed70677bed950d8531d3255a8c305b6d7ebdca1984b7029f05facae746128b45e97172ca191943fe52a0ac30a525166b8de36fe1cbcdf23e5c8142a218751e2766ed006f377f59e4d2d52b3dae2edae313d4bd6ecf9d8407e56b62ad1326bbf97862440a6fa8e3e5b9d163c9e53e4650bb00662400f635a878118f90c560630f9aea8ec0a13f02224cc591e6c0913bb32a723d0b30211607094382acbff6f8a28301ac3be0d5c9dbde1c963536f81cc98c6f269eb9770a55192b00238cf29d1dd23a201c6837d003df87e9dfd881cf694758705813230c08dc2678c8ed0f2731d96634614d6e17ae65e74315b0ddec9748682e31708d8cde8cd98e8732de6f237e09262fe6a5bcd8854076fa8845bb5e488b0f0990e1b3c53dc65985a73d615bb60877ede6ca083bc606ce95ee564e9f6b053c6417ec6a717d482bf08af10371b5ca77ee65f310ddd721413aebed21cc553f34ff705b90eb9eb77928b958bce4f1832f703725150f3e40029931b7b8d8373c34586e20f8dd0a859d82e2ea51679333356a2b5e653f1b8e1062f29b200158d084d2236ea306791b114a357f864eb42563851c0e88c7f1f7c57254f3f9730d048f15d19abac55938f8ecfc068486ecc0b0f31722b930ac995a5663c4053e5b2eb01205b3d5ee547a623d15ff42ea98e188f9f5f5855c46eefe288aec3f2cab41ed2053db01bc4f0795264fe18b9815b4b1ba7b25ae9687c655ee6a23d61dd17ce088298994ce094e9639a880adcd6e6477a3628c5c5c9d42c811bc249c62a035bf05df413dbaa5d10abb63601ccb09577866800734c375dc73e1c1a4f815e8a2d6e2b218a0b45cb306405ca7b27db5d742d4501a112f0752f4999ca0d9d0d44cd1e290ee8268ff42f9c2e33e4679459703b445823a41e8d84c4320a2836fe5b4ce5c7b8c681dc39c7f865a2488cdfdff5847e40576948758a6921eed1393e263b7db72adeac8dcf541ddf45949eb371e24e3561c6b03decda4a441b55e7550fe6692a402d7a63f9046c007a8d5fd88c27f8b90fd2b040fa43d28797fb99f9169b5ac1802dacc15b9f0377c06a18e3d590e2c2f3f26981df215a0ca95ecabfddc7702ee6b5c72d8ba2013e2aad4d02b31569b6ae703b79138a737572ac0e0329e4cec9d689168bad059462fa60181b733bc6ca91fc9995e05b548018b12daa0b54c7b6d4c11a1d3a4bb4c738548e84dda8f287e505a0ff603fb070287761c92abc660d9d4f757efadf00ed3893d57ee5182292580104931628faddda8c963200c77151d56507555668ad62db033d619ce0928712949016bc4826aa650c805b1410fd0b65609ad2b03a1755861572820ad557ca1e185398922ca085a67f245b0bd2b206466af02ee837e570cc72a2750e0812ef2404087c517694ae6c92c2c5a8afa42570e2eb070b2d2366a40a13dc7244f6cc04d5aa96f679a44843de3c4bc17c0714e998ca666df1a34f71da54617cb7874c0d94df139d5bc13a2a521b56f92a4056000829669a655c2cbdf55054fc40c4b38f90fcf702d8d7c51d18f3b2b430f8fdf0569587d94dd4fe72581e3578afdf2fda5e61e9184b4623d83498556a9eb186704488c99b911a158df79c988a88be41712754a219ad6ab96c0cca3a805473640eaab44b11ed6b28fd700cd0fad0a4f52bc2b2cc8151bfdae0797a7392cf45f0b7747722a4762f06000ed65147039d50ff92149d3b3570f35dcac36d174e09b77757ee2d91dcae98c379d69315a9007239247f4bc00a5db0276943e82ae536db21a26ec2310ecac5a816da0818277cc96af5c5ee7ad965842b217dbb2a4166b2e0074d3652f03193db5e420409ae969850e6865231f42f6793ed5a70a44b7591ce17a83adb3b7c154599c07db2ad00ec7364105b222ba49e2caa8b10567b4bcaf8c7d8a8e2a1ada2c0b70eb224bfce21060948a7c2423d3192f22eef6f2e09b6b3414c759f2f260e3e2f677b10fa84fb7f1f7bc28e4080f634794f274e3ae89b62b4dc1d13f7157f38d201f9b5d29e5abcd921694ac93b9c8e80292ac58b3b6e7434548ee23ebe6c6420fec836a2a0b7e7714659c310d3bc03917c771873b2b75bfe85359b581c0ca92aaeb260b5b7bd89a8388825e1976be1ff43e9de9393f5909d389f64e4ea2f26841b88c1e0c93d21165d646db5d50ffa84e136ba5fe25f61ccfb9418aceada1bc6211549e6060537b975cfa25a7cacd9140039b4ce06ffc771659c38e4b7e16f910518551b1f36d4e99ebdb6029266e270e6ce9f1a27a574d5529c9c6ec0b01bfc0cf82bc35189184c71d55b80f9b2315e462ccd596388abccad226a4358d5c7b77f04068d7a0fa42c13ae0626615ac73937a79580183f0c110ee763c4a9b8e33fb7677afc8c41beeb614dcdd201f2a521b0fd471f68040ef87f347f005e2d987e1832dbe9d800a3755955f7fafd3e3cf450858106e5657e0f51eee660bf6883ad09c548347ad26a84135065e5cbf1caae918674550e50b01472dd807202f28cb994850e618aef7d7d4b8d05a9587521596bdc46bd581e1e701ad4de8ede4873725dac3fe1a5031fe1b82bf1b274923fb7497a28d8eb44d853c699521c110c23284b260e84dce92a1631244ab76854ed497162381a481cb73bc464aaa2774e1ef4aaf63eb13bb5705987b7d13661939f31f58e4ac38c1368a10ec34abc2d437c2d723b8e7a5b555b25fd46ac90ae80bfee5a90898020d17c6251bf675428699d36cfbe62c117a0f6efd53c0d899ea89ee042c81b23639780580238137fecc89099bc3ea99df36eb79a892a32b695f635c095c6d701c005d08f539f9a0574bfc8690f3e6322bbd25a2de4d4c0604e667e367d9f3695128b7a254045d779a9d79122cb94f3c8f9800bf46f1c451045f3ab7b96e8a049aba0dbaea2aecdd99bc803b052952acee13dc5fa044b27b0e7001132e9d2d31bb79d184e9b35255e5ef8d5816be93ddd5dbfcd1c339da9650bcc13901124b961562f4e63b5b9791cae6ac12c0b3d05668f2e2298b950676ba8a861bda12be9af1a958e317ac72533ec0bced395e3ceae6f1e338a426ee0e0ddabf871eec3f6b6a43ce176f9d5650d6a3529d0cdd3865519398224f892979c00ac56ba1f4bcb8da13627bfada9d0b76a1f987833aa2fd6e1861399f0b7d5454b7f8b88262e5be962f40552d1e29bacf69b9e7209ed913e0c0a23a0355aae8782e87de2b8c2d42bdc20d2078939039aa5842f3a1132785a8a8539b20038f8a4cb325bcce9f34995385c2a4cbbf74887873eb2dbd233f5bedb9a64b20382aaf8ee4340e69baa9cae0fa019a402426e0ec9f3f459dcdd1596cfaad2c539addac7f5e03c9630634de598dbfdae61cb321c9f57b735dcb866d8926b334536bb930d19a902e961737db4e2b12b684b47d8b3858df1a72b9a6d2e38920d7879ad3ce6001391edd83a68515b587527865064612f530c0c3be8f60acf27e58dd7db79cb0f9de23e427401d1cc17b3a98bcb67f36481cdaad4925e6babce9140407b7e4000a70729d275b065cf2608b910ba6c5a851c7503e2ec528e9f848db6bca8c3697e655ea05fdabdb30e05e50300d8650202fc84202b484e00f325472a6a04f5f06dbe8bd4ed8f3af1fc0dbe46aa8800d1b53e3c839ecef1af3815a1e4a370ab03d01e2834557b77318052afb97c39c7b4ccd8de48eb4128390cbb00862f428e121386824898c5417731536c9987009a7f66283faa9d4afb6bd656867058d71de984c3f5c985872cae141b5c2eb200a4a145cb9199adcdd4d98e3601ddee6e36133b49cae8d9c6fc11d7bb71d5be81d8bb71335591f41d07a0b86b885d48ac3251e7fe50dc2463411ed66092d40351f787a2c51f8b12712fe9daaf142a578b309997b55adada212e950493c0b6e46169820b8cd7494e5053979934fe738a8af62bf9e79db2ba89b0da78f9eb90073a81b23d34f6fd72feab0b5e9c2d9252fb9a756d6ba6d5379ecaded0cbef8a39c6f90c01ad3a31acb812a7f626df953344c0e3caafb34895623c66a69987111749410d45bde549c8dbca1b263c81d47cc5588ec9aee5c24f74e46747532f44198cc32a8fc69f49626fc1c9d53dcb02c80c11a0b5fc853c8ce34161955fab733c93b62366b43c2eb9040cfbab6a2546849f658c974a0a22dd6e121dc9a3bb0d79fbc34258ccb403c1237213fb44b8748b8e3facf0e8ad0ea33ff2f51e878cdcc84a9e96e12d6b403441099fc6ae9303df1abefa8cb9584886db0cadc0696ff511dd9070a06dcb17c5b87ea1137246e621a788abf8971498b9056cbff5048ada49564e8a41554e1b082c1da283a3ee2c842ab317facac0ae3efeb853e6f4ea67f8a5fbdefaa3438048d70dc6fb7254ec61932f12a4e79508543b2306ade79f8c4caea1ab09acada9b77a81a38c80c7a5384f6dfe7bae9a739623ac68f2989ae452fd26009b72aa7f8a5c7a1d3fd8eb6d6bbff92ded6adf31ec5d0eb39720c0f8d97c81799fc99358b9e59dc96c247cd278479bf35147aa177cff5e1933f35ceda31ae7fa1aecb30f2da0b5131f1149b839aeca6c88928cf5f60d612823082bcbbdf29c15c46b51d1ac5da75b962e98a2820034f2649b3af40839d28bf990829b88f79c4ba88867181b3b89d751ca570fc2b6e9559ab67e0c488a89d3f7cc2bbbc8e5a749273b40fe824c96e4624721a6ce08902307f49bfac564556782e493e5a3d97c3d996c954e87acfe99c828d53be8e91c326f1b2b7d7241000ab3daee27724d0e17d47ad2446abd7dd7a337a8d21ea2906ab50b725d2a275a340f4d9c2ef44b66376461fa7c6794204061a691ad3497dd25bbe0b5960f58f305488ffffb58280ac13fef37a6540c0280abbb260e2e8d3b0fb2dfd35afede09b9f207d6084c466ea349f9a46720d5597e89e65ed72a40f68aac3a2f40abc38fa5d41031e1222237607c19e6fd00d02f91ba2ac7aee4ebd03634f0b83309513a51b8e92c55e4c5e7e072edd5e0ea9c68f148392691fb13b519177db7581b8c83ff955db4d0b3f77b39f11d81d0edd3a39d76b6434af8cffd9ea3ebd4fe856845cd56ede601facba07c43e9171686a728a6712122f7079cf31c2c762cfb8e13d49a9e33d17377c78dbcd6a0693dcfd360cde391cb5b8fb85d3c035ed547c8b8469681c2f133fa3cf09f855d1192c3f569bcff49dbd59f2cadf39013dd36aa75ce0ee76bb88655de28dc98eec27bc183b80e073924694bcfe315446f48499be8c69d9c38c25e0a1c06eed50b16fe80ba3c30a5ae8d0756d49ed04221e0f82cb26f0b8973481f0cc0b9598007b2c7a855cd912684a60104bc2a66559cc10cceaca716d92e95a7754dfee6d89afdcac8e68c7173b740a43705ea1569ed2be16bad72eaa2378c3d2c594db89ec592337d47fd7b89d7be4ff8f7f06b8107a6214e406ca5e129baf3dfe09aaab3e830650b3a4ca662ccd5145037bec6901b46be44b7963543b8bd40b6a9c5b6d7791c563373c21901ad68d2a53536606077049ab8a14d0ab5f5005249162e5046fa1ecee07865046d57a3a70e7bdf0e2f44a1632454cee4f49921c2e878fac7913f603e93e70716d745178fac1356cd19de8950675b75e06e23e304b777f106213bec0e5e28177e2a339bab5d8f6038d7aeb280e060e6108b4fc2ea34113549b97da8bba099daae52755561630857d7706eb1134a1cef5d7f089122534e1076e070d7281171164623db7a67e244256438f98b3583a43524f841e09c2112c86dc3ba9820a692f34dd46bb9c446c3cd38555fe878b6b4d65bd4b48022c3438f0c963a66ac5bd9bd11c5d76159afb3fb505e23006bc7f97133c99ee60abb82de8982eeec23d9db8a8ffa9bd8bba0780fc3295ea6424ef59f9d06fd0c0eee12175304292e0348500a36c59659733acea4a9813e306d7b39b94d87f6989122c03337a9460009f1125a6b780c607702023d25f151551988e98c02467508a17c0d1180e786011403e2d2289841823c48ef237aad69ed314573e17de09184cb5cd27b5010dd35c04d743bf043868aeb2aad7773b8f496db6fe04d6d232c2e8aab79cdbee5ba1700a1c5a1033c029110938886f8bcb4177c5dee04fe46076645be4038d0ca998a721c5fc10a3693f4cef88b32026c09b2cd2cdc573ae129b4e03a40c4aff6902d73e94e47d1fd638b471b747498995a9a4153dbcc5df91b59d2b91e564dc7213ce825e7f8c12a2eda3707b4afb514126232e244606989df8ace2c412241730e6fb3211aab9c9c30c32592207133a5a9a30b98e576316a9911068c532652137956822dc42be23cb4b1fe52200ea1262745de36c81c98a09115cd72393a3fd39c2760f17d9e56fd31e5098d9a02b851d266262ba37540d022867b73778cd3a9676a13b0518a0029a4afccb2f07181e0f5f5b2bee9640d80d6ed3ef25a4a0ea6ebc976036222b23612f0ce95372c18f527bde9c157b5c2585052ac3de54e1846121b108680c94a5edabb6b8352287276600b4234e45606e114dc5c8688c35b6eec6184f49168e971c13fb772bb645294a301a22537c6e3716a89ccb7508be1ba5d0de22af81e6cf16f74a368a42ec8ae342d089214043ec98e1d9ee81926858847a2d302db3f8da6751332a263f4ac0df1fb8b2afa69f7405d4799f205e911971c2520350b2df6d70f23e1a2b5cec5f0228019b5e09ece16ab94fe56f220a4afc10b4a8bf2077ac06a8d0d72c4b7125f8132b24a96188923d2a45128c7adfd2738a63ca19bc6e69bab54a6c1c1c0d694f51b2cea4606c8903480a84169623e945481bf419419c11a4517c225c24a2284aee3b653181e0697d6da0522ff26ee21c259324be147d2d2526d744c15c247d43892ee332d046140c601329e4506aabce9a32aae3b805766897449416975d435912cae4fc8c45b4d32a36db4128c9e9f8b8939de8699fc74e1ea3a4bb5b98156b3fd8642f4d8b862bf0f9899b54bfc437bfd5790e9f04f3dc3e9c89d3e15d42d7234d694178a699ecc342654c063c43b9ee19f2ac40253fa24f5cb7fa2bcc8927abf0f5a8b378b6ea0fab01929c9773bb01b308d73d8c8de08c3ee9aa0d4e919cc1794a2635073c2400de26d1656941229abd6a84914e5d2a9e221395855ed318829db8ea12899c2c35c1456546fb114ddbd85fc2a59d4bc6b2de5d7e54143b21eb4d143a8713d43e1eaaf72020de09ab02c74c05399c7548972feea264c969716dd2be43c0ad3d0bc995d2bac654bb011e7719ad838ea897a4394858ff5225b3b56528c94478c8503a452f5ce6cb9ddfec6aa0d2a898b253215e8b221c725f289d5f3ab1c10937d2b5fae90e78d078fe0c070a806f2fb0958043ff2478018770657d816eb3f55c0d3f1da1a9a88cdae70d5a3c3f5422f860d5c4a3bcaf81fa6b0e4c2296f9a820634d9e615274d8d178aba7c5751e6eb2aab2b91431458cf5673bc166afcb2a1289101dca89c85bca1e49c4b10b070bda99600fe93acbfb4b4b0366a3b38684346a4401c242e579e9a3924922e55d65d247d4cac5ac46b40b6180849893856e48f9481f5793a2f3f652307af53ed750c5309c2bcda3169f8f835a61137b8ad3d7324f4b1a050d1f56a849a8782ceb19eeaf7459e877bc25ceb01f7088a35393e7863c24b885a98b1fafd0e2932d7955efb5da4c777733990ed25d35f11ca0c27ad559a872b76de1551f9bf71ae928ee79cc36ebb28cbb891364fc22f45e81ea38d11a4aff596646da6f6684748ef994b704c357f8a12391064771b581e1d1813d545c88b947e16fe6b1423619c6414bd5bce2ff3b274c4d7951373fec40fcaf63e7396da091c19bdf5d78002bc135c4668be530db66f9927ccb089c6593720cdbfbd8bd081310be6c1d346f86689e5f343524b63cd0c5e1e3533226395c3ca9dc1e51f4d18dd75aa3ce0a6b72a766c5661c5e5de5f84653f8878393de4bcc53e40cd7744b7739bca8c9dcfae9fb9779e85af0e6b3455ecd6753d1329d6a22db8b84778a44bbb3a8d00f806e96dfc210e48c94de04b5d965c9993d9854a2d65d5d14711ff9f24d96d52b9a186cc280ed3cc6cefe5576f6a7dd5c390b858323e446804889287e3924daee2d51373cea721eba2bb748547ca2895e9d360206e8e715802775ac7bb2e8f3a91cae9c1a1433e574f5dbd6e5443aaca70054e5a60128175fbcdb8c5edeebf92a1d5436b9fb82fc2c65eaf797ebc36c8bebfb54a0cb09a7029d16073b9db49376294690315958d808b4bf35faccdbee3b9bffa1ccfc1f03a1a3da9dc47f5a231d1278e5c3a203fd3e3cd1ff577a94faa96a57b7751c9cf2ae4fb6c149439fdc845baea7af96cd0657e8b6aa7daa39ec12bb12b6693e5b7ac8ceca7ff592d5887636803fc35be84fb64e16dbd74e448dec2ad035bc5a05ff37f025f5ddad7896cf2662fd49a961f19b6667d51574dc327fdbcd980d6c639081382bb0d7e780b66e83df235d684b08ee6d03dd491ac02bdfd4ee9a417617087fca702f85634fc5e5e84016cd4acfd72f802ccdcae9985d428f8247b36820100b8767e212a004eec1baf3a963d27ae5c2d052ca42db86b7e48fed1514491d5a090eb0e8973bd90775f2010a01775b1a59601b2b54b83197d34ee075292bdbe558edfd22022ba19e80651c811dcd39ff286909c04d81b47cdac82678b16b31739960853d661dbd923e1bd9f694f8f29bec08ed9e2ff01cebed13822cb5a289aab6443b906ca3a8956ab4d7eb50f8f957eabb41b2094af537dc4a3f5618214cf6ea21aa4a7b3762475541307fc467354ce9e936bbab48ec329ab08d314d61fe31e48849edef61937f5e3a091f2ed390dfee00accbef14948bda63b6a12ad1d56da4da89757bbb639b0ee38a676d485efca05dea323b5b017d186bcc38f5eaebf1683d0cb4e985a8c2c97fab61cfc04aa7d144955d1f0128d851149613da19dc8510139fc1355523693e6b9a584d857eff6ebae4596c415f2c53a3375638ade320ba8df11741223e3f37b18643d1bcd6d3f449149fb768faca33394ddac807722a2abd7b04c69a015b1a53ca3d9ceb3fd8fa87e3d1760114d5cf6c495b5cb02afb3d309402801512f0aa40291927254a81feeb1bfd9b4a295816e7148225aa1d337eaa12e0a776418bb35f258603b52886279ba7f6428256e3e57ea346772aaa732954a418f50d5a9aac124f53f7367f91c84a060a517157371923c9dc34082c8a25bc9c89903ce49eab1127b8097012f025e1dabf6b1a61a3e1fec196918ba928c603302c1b136cabd3f2d28083b0853616b680d7d094eae86fc6c215a10c8005ef79f390ea56e4cd6b00e9f8a5046bb53774e533e727fc0eac40fc4e16a2c97311fdce9aae36d3494ea1764f260a9dce4195a8b7f36412917ff0f3abace83e51c388d219ee1b5aae1201b97dc614668e1ac1cff3203bfb2e6f5c0dedb406838b752122896d087e3aa3db65e095529c2c460098d70ecf521876e75323906689438c330b018d987ef3f075eb1e01c91f3642d39ba63801982f5128620017735db9478004db41dbcaf72ea134dcc2cdf10de07de9c5d90135086f5e39a91342cf410abe65dbd1ba23181c628566b4be900d2f5def4e7f520b971678d7bf5a43afb020da8d7d39bbf25274c7f81880a62fc7f70915e3f9829fedc745a8829e87eb9b64e40f67dc43361b2cd4d35f07d4a0b4d691441cdb6bb8ae0d55aa8c4bb5b984bc520c557068b7ff347c9dbb49a8000b1fd10bbf4f2f9f1435c5da613939ef190dbf599904993d4a3928467d432b646e8b7ae609fb5e37e110f4a611ace57dbd0a8775f66ab768857a66fcd2851ac674c054aa1260285a03b72e73735054a6e46cc051f3b2669bd51904e73ac9a1356229ca85c2f46ac1261f20894c1d4647876a8fa1afd27a614c5ce106c0b1a7f78a1f3b8459ba42a774c5a9f95689a35028b3b2acc8e67e67875a0e8e557971cb3260277f6aef574aeb8bea6e32fd0935a273d0207dd46064e0eed8cefb6914b00c02896c614f100c46cb30e8dc593a19d18e98807a9eb56e31772d5e53d7bd8537d51a35b8f80dac4a4ef05ee2c912ea3f945ff49dd7c607723922a188e31d9a99b5a6e74eb618a59ba4623881fe9358954e1eee0b3419d10d28599e13ac19d0f1b9827c4e51d2367030c1960856f10ab7ddf5b8999bede117c3c3524620dce5642599292216edc79c765e1cdd5e6a6a41d81585d825030e08e12b31c7a711841fb86078a840897b4476c89270d2453025d087ba443fc12c93def009d987830bd4b3dd59d47208a32bfb040dee0598b51eb2613d9e4e374ff8595a11738ec2135cd7cfcddbbe4cf1e37980f3168176d2446bdd6a5cad43a791bcaa8d21380d70a60fd413453b4218cc9e308141dea6fcf2a3d14b2f2dbfa979a2c024a88c8be84a3bd7d033e6507b1a85cd7391ddd0d4c4a05f8328dad4f239aa706a7680797d10b66d7ec85b0f2f6a4c1ab4ddf3da4f7c64719421b7a7d2293871553e4db04d3ccd683bea417d9a3d688a6361d21ce62061f9dc744aa92e3cb261cd4266f29a9194da985363793a0052d3954879c7ce2df6c7a646340d2215982a99c49bbea4c731e70b57d1d9a5c31bdd19f58e8021ada07171c380e9826535f483c27e3f9ef093b49f38a6f23454f71bed413bdb9210a70c673de13ca0098200a5babc8a53bb31c441a91d39a11fb72f38a5f11718a63470b07dec637fb57fa8c068f67e5e74ea165dd94f88d576c046c29bf0710acf347152a08bf7a7d885b0f3ca2e5ea4ae04730c16f04d6333ecd5c98251879b0fb163f1079255f48ca826b724ddf908790fa8fcbc42a2ca6b368f3f1135e36ac590c27197b158ec8f8fd333a9a99e23b32cffae9635e328015503c396c990329dac5bef99aae791282b86adff265633053a275e37effb9a10f98e95dcfdce33ea7126dbe37f3d397a4b544cbf416c2fb220b83df4e86d975b9a632537e03f3a586b33274725e40186a6bc69407a120bf7eb1ce47e43f05403f028ef4987cc22d9e213c88dce3fdff17c6683198368a5a7237220be72329adc40644fe8dbf5d8e204ac732d3261a3f8affaa29f19f1148beba430db2e672b08559fe3867d6eb46c2bf1da6a8f48a88b60989b81ff71adb97b43d82e240b6234ebab568798847411744a7ba856a4ac98166fae781a5a6e43edad821ecf8f5c39cbb3af36dbf5ada46ba6c93bddb0beeeb955f0b9def1460ddef318317d8f46df040e9e0a2dbc613e6236bc53fa29496d9980988283dde95d4916f17f058eb634ac9a2106117679ccf14ea1bcadd7e456939e2dab7d1514c44d5091a6be4de3ace1412066d73833dfbf1796edda705569bff4121fb6e902eaac034150c44d911dcc535807b705f1063a1837108ccdc14611177702c7e064d18eb5d7b4f4172730d6254fa263713a3c3b40cc4e11652e583a91c2ec2eb15603f388b558ccd0434791ce64cd7f5e38946dd242b8484db96b41e0999406892b4c1ecd92dbd4990393b303559fd755ad83874ab231e7e16da08c7d52fe63ba113324b59cf06cecec65b2acf9ec2e27e174247ddbf2f81abab366d916bcaaf4ef5f6b30fe4eaeee03d2af95255537f3bfb663784b39597922d24b031de0bf718e4e990cf04a25cff935414a1e7a1c06e9fedde653726ba439f7935d8df709ca7a6cfba7c163a6d62e23d42e25da0adaec62962d857b719f56aaf2e27eb24329cae17e5414e4d26926f1aafc00aadc6afc55556b27c42187ba1d7b003dc55b757ca5c489e55b88556db850dfd476c796868715d879cfaef0911affbbbc8b87f8cadefedc086ef8c41e5abbb0a6dba165621dcd97b969453466b694b1c4ae932dd1f39795dd5abd02d49feb0336fe9d23f24d39b62b6a0af972753b7bf7067ae864914a0ccc6013d94ef683b4d33565d626999a92beb49b4030ed6ecdedfd89b68b5afa1aac318639643ca84f4443ded606a422e06ba2ea4c7d0c96ebb52e9381836f77d671569e3617680ea60a09cbc0fa64e1dceb8374f07839fa5efef4e431f17b2650a1368eb8b4cc7a8a5d34801033b8cd675e8a578c275deebbccfec8b00151f40ec5191f91f62ff440dbf3ac523231b456ceb60d322695a8c17792ce3a65f74255e35c1419d39d9cdaa2ef8b71c71441ec142eed88334a024e222a19d6e1d28022230e1a97c08ebe4234e020f1b8943d170491298e6dccf0dc52fdd4b3a5cc0ab521782d866738ca6f61decd78ef448554d6d94637780e8e3e425cfa75bdb4ef35ebd589afaa13b7a3d9b74435d3846ec3e0ba305144bf95f451d1d4efb8c9cd3d9da2bd76057fb176c0ba6a445a7b4085f723baa044d7102b0c110315178e130841c3762853a499699dcd0f6d668e3c5d4ee062b3ece40a0704a8bf4311a0c9156572da285333ca2ae07459cae19eb574ca8d66d63165b58b7c53aaa5a485714d0154a2431929afc62a496a477e5d01f83a077edbad1a0a53b133b6d1d8d2b741358048bbc24eabc4ad68ef5853a9ec66403ed32602384a745611db6c5e6376457d449855c97bc303399109a0977509357364590db844f1badabd874c310c220dd1e45feead7f15dc41c58cab7417afc907db31703c5d3b4445f1be5d7709b894ee50d54bc5bf734332b8a7814c47b03ef89f1b110de4ddfda0d54e7e0bd01d7bc6fd6934e1d1c181f9465bd4d1c8dbbec2d841075dd80de63b7f976d00ed99da2ee4a7f1e714f3cb5c34ddf99b3e52f854bf146d3a6e3320386cf555cff57e3b4dadd9ebd1eb96e081930a71e6e01cce222777b138a099417c12649c53360d652313973f9cc04d372437589d74aa1fd952ab3f8e00e09a87315e0ef90c2b83a7e0948ec9674dcecb599384d8962f1465bbb35891ce96ecc2cfc863516992fcab5b43fc930841cb31d127cfad9894116dbb53536dc8864dd1c0d031acc462930a58b17938c6eb4deb613d806392d80b21862406431f134b649e7de298c6942c3b397372d6bf8f11715cc43314dd64c0bd9d2d81e6d01cf37580d231acdc3cf5486bdf22359e6d1f5caa7a5bf9a37b94579ab77686565ae2c828d898b70d6a9a78f33f03333fd95897ea9a8976319ea1d11546a437cf4f545647e579ab3c9702fb0d9107a1914d108a71b930db9060916d2099314bcc8ed1790d289459a26c08526c1d1fc6a69f83e6ca8895143802ac8c6f6ca80546a6a6aa1504a0947b2d41f25a1991a78ba249c8ec55d35bfd1d4b618f5fdb94bc809b42ac651f6983c532dfb23fdb5ba72371b06f618704d33e90ca9b2465caa3009bccaeff667a46b342f101ebfa1cd605deef34502d2aa30e2687854c446515a6d5b94013250b935235203e9330d81357fe0514c9254f9dcd3f4780e08a9c9aa87fb96187ad977e5c91d337ebaf428a032ab66e0c409513f5d985ec0a4c140675479baf93944389efdb1ac2170dd92494bf9a0d1a4541df42dce9fe7a2e152cf45f4b5030cd84c52d9cbe9888df48917c90baf1b1db9936f26974ebc5f53c1945ec907fd8f21c3e856cabe3837b5b6495d06f5ddf546ca0d4e823c5c1e51bdc8c1128cd5c46b1ad48f4b6d1f366e251c349b4415307f9026cad44589d045644bce97f5a11dd1b347a52416664caf8bee863f4bcb5922697e3d376a0b46eddf4db4ef48bcffab53e194cf40a6aa057e6bb30157f526a042a9c04050b3224d7e2ad97e345f9523b97da85a3ad8c68cae442e36b2d02d7f0d3dea9029644ac3d3f248983d4280a82e3f83d4135eb0db4eee7915eaacc819865905eea8637852aabc844dafedb5fd88bfda1dcfbde208b30dfbac9dc6ab8808c0e9fd22f253d235c6368fa2c6991e9374275661425ee85f9a3a32fe629ac5531c74746dcb98bbdc1ec4777d8d7bd103c4a01514cfd9fd2d4d5c2314eb5f163485b5df9718958bc8a79c220ef36ca736cb3eaad6a84ea82f4011ddb0c83951a1401316588e603e69d13ed4d0b65afb76b42672265dc993de7ce534a1a2c18d80459a0318ac5aa5aab477a3a1ed630d84a71cacdd45eff42a1ab046e46511a13ed7e2d2127bb4d9c6335180c2c6a9314eac90bf6ab433aae3489fed6c0241e9d595f2c5d2a7b8bf87c77066a4e50253296c2d32dd1f2ea74a4493d7f17c7a5a678d766b4a93b09ada4d5c06be726233b722e96e9247f1c81a7556ff254b3885fb2f86781150c6057f02631ce9ee90519a0a5233218edf656fc2e6fd23174da13f44bd731a203e375ce16839707d754efa77a718d6b194305a1e34c26974b325dfce637535b33b8d1f74bc4a967886a6c1f25fca8a96d4e3a6e8c1ddd425326246fca6e0d11284060241dc1fc29e644e8b927ad808f03d5aea0d6c10c3a3ccb4df90845071d6908dee8de021adb836310feb4144404b535fb03529c6c307392b892cc8fb6cd459fbc52e63235d299e01212570871f12c61053a8d8dcbc816e26cc2659be50890f869c43a609f0efb010df3fc4f97aa338c94a0ad0819df93aea0258b77054ae730ea27682a44fba40e1aa84f5142aad41dc00c07ce6119a20bf267acd75c737b09fe9429050ba6860a0a74633bf590d0504caf2d10f1dc6735cc4875670eae85592b3c146637c2b863fcc6cb261fe7b4b2bbd8038bee6c50f724ce5ebe7cd3297489121e2b0afc13f1d4a8528e3193c7775a5b4e7511d43311936cc2ef256f2d900a5929cbf43f399220985fab4112f81ac8008f041004bd9523015ef7b98d8b6442dc58c4c87b70f5395f18e7609bb64d965fd68486e07269d4509cd83b4186a796229770fffe15369057de4fc601a58cf00a3d7567746f471d0cf19dc31bb3ffa6a2f3399fe070b593f96b67b342e1c2744b65859fa95f9fcef26d32d2b3c45ee903f4f4ae05349351d2685a8adeb50821ddfc0652a66c88af2537d81f76521c8eb6864d0fe1f079c70c41271fc34cee6c75c70ca5f2d29d26ab95f7035fea4a0dbf42973743c721ee510614a274e99e6edff219f0ae869955eddb14873d6efd7a482642195aeaff87712c7a4a6060132558484119bdd54a843c4512f1be620ce51d2dc88708639b6ec11778e05dc53a3da3654777c563bf5d4653c8cf0ac1ca93481a7c413365ecb64511618742ec51ab5cff90f3c689ce5da923e01b5774ee8cda1f78a82b2eafaa45347cf941202021c8f0b042692349ebb4cad238b422e5fd076372649003a4071284362098c4e9c15136f3ccc47faad9a37b407b1086bce7c5f9790783e194dbd46368113f4722495327a39953bedb4c9b29433cf8b803827318865f70092aedf22ec3ae5c2c014ea284499d20f860abb9e310dfa87885ed814f805de7c052fb7dad322aa1278999e319f9cdfc50c1e9e34ca66e4bb07973a7f269c3d208b511d19c708d89ac2189057cee11015d4656c0c38e372d2ea6696d8cb9f87bb131e463979c001f06122b5330d775ffd9f772a09a2fc2e323c663e9a40be23b0edd3d81ef1bae721ef884e27574cdba255c4b8497198e4d8e711a6b08a578af754b529f91818a563251412aa283f733e8e105d6457f2c5889aad18b67535c9221893bd7590578145686d638ccab3ad5587b976ee8ae5a2bbe8def533102c94d91ab8ada25d5c3fd47b3e9de97bc74aaa142923eae8008c46b93d2981eba416120e223591d54283208a128763e3482d32f1af4ea04a926262972059f0dfd0db88198e8319bdccfb0cbf3945149286ddee85a50d6fc536e37a04bbf3f16ca31b74eaaa5dd1fe6ab248c319f084542c8bd3cedcab7920c8692e971573b20e61a7628071abcd9e4223cc41a12b9c72a12f312cdaad931fc3a730edb4eb730219642daa45e75af10500e62d45ffd616e3ae5b1738d3a82a4b25eb8f5a3c553ea5bd71842e82f1f88cd5039b98cf05f4c8143ef9d01f1ccd67c4b80ef6447483d98214524f22b4d43edf9b6d4ffc3105a604f316c4bf5cced2c32e0a981b1b68743cfcb144ff7c406f811aa619793aae2e7f2768c51f88ff37822253011b0415d8a016d8f44da6c441a4f4baeb7dc485cb219366617f6794d2a9a1872dcfa28405b4880697de0f59fa8b0ba723b78ca93c2363e1fa5b232611c2839c8f3fed954625a0ce9847026833f0a4b2259f0638ac9f3aa7363f3a05f2d10ac30a7775dcbe4e2f5f2ed2bcec65eaf561c9a0c513f5e465dc3812196a2610353100cf4ae53d24b51da0dd5448b82a4f437bc74ad0ec0af1411e15fa9ab52b8672dbbae444b9fbd792d79eefc586bb212dc0a8e092a41ad4e3a8b5e7b3c78b310901d18a909adb916c2ffd4e0005747c371a51f846298e5f365768426cfa6d7ff18229355aa205a8c876e2d84350181bd231ebe4d2788119a8ce42264f1cff3097aa01f4b90f2c3cf3d1e84afc123d8162bb213f8d0a896284ed3b205238b7d3f045aa65b55a37fa9c901281a28938986051a1e2502ca5c44993b6cb60a0bf081795a0beb0da21a182a786d35460c26689e250c6b697df014d637feb9120f945a0bbdb8e990c1117f38337fb717267e815d2707a6f97b72fc87fbb23b5c584a6c690e132e6b1427a3c55c98b5bcfdcd946a19387ef0822d6dae1227e5348adbb0f70f9849276d7aeef6a811c6bdfe816d52863c1afcc741643d501e1a067308b8f073c677ed64a1bdcd275b0da952c100cb8514a22658e95f0f9ad71a44be35b3b7ecb2b74fdd443ce5ee3a9febe06f61efaab9f0b82e7f76bba6e28e017c2c1cf157a8f316bec0028c803b829467e31f25992ed169b3abc6550afd0f4b3f818de405245ca4d8c378d9a4d68c213e48e8a5116aa338ca4aac1fc1543049baa52af26e31033aab9a6d4be060183f8272ec7e2415c63346592f131c65fd03ceed04b385683fab8778a8caed707897831ac168eda3a9b8b5888fce62b47226d0269cae6bb716349545ae1ad9a2d841ef6035c2a96976f6e51364c01fde59bc3885b42927cb7afa87669705d2bf8ceb5b898f959573ad1d9c8840158bbcc0c66d83fb0b029593d783b81f548836e506c704930fb2e8446d103ae3a64378400d0855041858b3536a3522d072d828ec0253b142003921b19c9f152aca02488185e713447132781a4e6221c850cf4b4ecfa09bfffac067ac6e1b2a5d151915ba67858d5958cb274a3d7843173270136c80ceab765bac6d5df0e6075f32361268eab92f62b1595c38437b4592103282f08fd68f8b5ac778242361f38bde212ae7c14144fe9a0a93c22a1093c603762b0a578e83a271e2ca47e0605df30e1ddfb39fee4f141986de63f1ac6cdcb3d8e73f6aa6bb7ab925bab9608305ebaf03560948202a7655a8c8b33eb3a2d85816cbe0c60b079e5659e04d5ce1c0a15ee5c3a5e84e28e5ec659eb19ec38d6aa96aa2bdbb86cd5c18c5d08023e29c1ba1ae35922cdd3cbbef09d9a473d08c2c1aa2b70af0b3eee27d61e581b6a5b829193471ab10b14beb4b2b886194cd5b6aeeb36832da7623f7ef5b2025219a9b351523c9605bb9a22beed1773f1dbc46259ce06f20c2499fda3aadb0b13f5a52544853085aa1b90a3a50b44ef4c2fe3274097c85714a6e08449dd25d68dd10af6aa37d00badc9a0db59a59b634b7943b1309d4767fadad8410710880c648a937a25b9f12afb61a80c0140e440795bbc06a6b147593c1ee6edd79bbdade1d1009b3046dbd030bb20256624753c7ef767a37ca786e334d0b701197564404e5dd556da11495139578f34fe8a2f876a8e4d4262f6ec1444cdbc1f1055ef08372468b8509eba5e7681e5de0340a9367b95443d7fe62a5a14e5f8a9d39b95389a433ca38c0080f67eb7ee25411c1fb41bf2f9b4616186e2f0977f895809348fc893ad05ee3afa35d2e58a17d4448bfbea17307660cdc8c03708163d6b5413e6552da913098b47e4cdaa855d35b633ece0b1748a95f02a97ab28bf821750b5f4dada66fac05f3c43acb53671f52466af8627b2ee6758e64e8f2e97d2f4ee3474b4fb01a1e04ef0bcb9f242b150314158bee68adc5ccb5a1fe254aea9d6a7caea88e1864ddfc28c945b07cdc85c20fa80f19e4f49c0125fc6e34a7e9a209c2520c44d5f2fe571aad96b0a620b335d65f9d47f15bda278b475846ff2304e9d18961d49bfd9f00d46a4371191c4e4e32727287ffaf523f15212aacbd9038b052334eecd63d4ab9927fc11a98b4a8ddd43cf785770dc2e803a1041a6acdc364463d28f701d0a1db698f56767480947c7fbbc4f7756f4e151d4091ccf53d1f64eddb86d5d4144732fa106511ad504bf3160a4bc7a2f38a21430fabada28b8eb9c626197344cd35aaa9572732b7ea28ff7b1a218740747f3ff461ab11f4f5b954785b77949e07117e667d23df80df9ade55a67e31b7dd95cae3c6777c4614126458ec71d240f3d6fa644ec319f950a213f69a2372a2b65f2e4bf7c8a64bd7de5770c13f5d818ef69038d2617879c3616b15a35973d0e50801cba5fbcd0305988d776ff3c605b4b2e8a76ef9e1624a9994ceab92747486a360d41eb17af738f1be63565cf835de8a4471e1ad4c5d686f0cbac38abe3722d280a1c716754a5841a1322041309e570507fa32e4f211c9eecbb39d9e027966f2736443504bf6aae69101a407566ddff47ad44d5ba85a6f95be9fa5092b71592b90a62c22803cc749e2fb7162515c5b580c636f4089f70cbc532a00dda7aa8ad7374ea100c6f5ed0cd5517867422962ae7c9ac711f102a87295910a0b6cb4acf1d7d9d426a1a8d04dfec8f6ffe22f8745c6b9b49fc129f1bade5fddc884e6edb6725a556d9b469956804766927c2531f99fac56f8aa67b30b526358445a09a3fe34abdbd5b9c75abd5ed2d07a452179df3601eb2a3c32928cbde2d1e35e51f93c4ac86616dcf9a9605649ce80cf302897bd7231aa7da4893bb9480ed57f49ad32f20aa11689a79d50b567690c97183b3991eb63427ef9aaf726ff0854694c6a4ac51375c653de1a16f5f486d471c321cdf5d0a5d67063dc808bd27c2aba9948b3ffb8f5adfe9ea74fa8ea386dfc6e9727bfd68f993ab3cd7759cd078352733c83bb0a855858213e307b52a07c4fc2717540d2312f7402485f023d858fe60fe7ee218808200977e8cc0abe816222ce5a27c4478f0671941be4b9ee3cf40dd2c4f3204d004148939497839812d2845f29a449a1e689fcf18b10a1879a24324f2ac64f403a952f8c2b860f55a2b81e641c25a6d86e23455c1ca1c730dc24b6da8fe80926890df893152fe5a07abcba1cd401a91ecde594f04f8c9510bc7a74ab368b859cdca014f84d40accc032f8e3e9e3fc5bfc76d828032ff498b95eceba778a7bcb82b5da2e072a5af8ad043207f14c548997dafed488738987d017f126225844a6dc430c868dd7fcd2644eb32ff04c4ba8cf0cbad2081cad27c107a7489f465311fb4c4adf4e0c11ca0471efbf2f3e012c1446c9538a3c55f6758010cf1c71cc17631984591fe0ebe7e74392a24d3ff43d2d9e623d34d45f57be0d50c0fa06a3d201b80da80e0115c10ffe66078869a874452dcb79f79e48ca05bc4ed2f25e5f8709a3274c4024a20966d5b2054b29a0eaa311f8a762b395ee6e24e048dd56af9036e39a9a7803c65fb418409ffcf517e255d3465cf690feb24d55d1d040668c90104392386ccd9c180428d9310144bec53a7cf9bd98a23ba31706823d6daeeb6f79652ca9464d406d406c806d335bf8d7af098b19ddba4c9d48ecd42a1380677dd9aa6ddde4e29a594d22a4eadb5b5da5a29a534c4815a5b394aa9b55cadb6864aba2e2555c054e33c93bed0a0c412a5d4bab56ddbadb556c767ee28086c05d784bd982018135353d36a6529e96a893b651d9a591b72dc11ce7699a344a6cf30aaf7e24add5d553694418872e679decbcb0823f4a47abc6f79616bda9007c601715629ff79a7c6bf746af0b1d64ee9a2187a1cc1638aac02c44752d30d9e1b3c37786edce0b95dd28d1c9ed78cfdebaf9834c99cb55973d83887a690c3c649c40c9ab53994c44d20635e03e99acf8489124a30c144f618c420fb149fe2497c4a0943dcd1dd394f328b8c1001ade148770791e394b0f990b3ee08a9a8e8c8a8892445473e1e2061fd0129cef72b579a7a48e2bcc0823b76b70f39ebb28d06de9692c008d48bc4e91ecf09d98ef8b2bf4285b22e5461578a051d2f8015f072f7755e44c54bcefce626e775d375ab15f74d9fe35e72e65bb820a6abd65a6badb5f66180a1ebeefd9fa2385faf00481b5d44d6a8d9861da48388c871350994b3e9799ee7799ed7c919ea650e4761568ecea8f78c0a250e1d2980ca14e579fe3e50ce6611321d990c857ae1ca0b5cd8ca7543aa14eb7fcbfbd6fcd6b750288984ce604b3a9a725b629a010132d63a48d7fc2baed0420b2c58b2cba59acd1333c899e75bed817a5d6804aa72dd900a648b3d0f5f205b6cf3f48028be6e44fffe0b798e1ef5dc3f6aa2b87f0f85faaed2dabd775dc785df5ab5acb5d65a6b3b4a5747f7727f1b6109bb787894945e2290ab0d2f776f134dbbbd9df6cc2a5c1cd14174a7d833a594524aa90c54725c0ab016b4280447acec10a123bbe9f1a1a4ede74dd675af4ad97025713acf0b6ff8b1e009383b5c58ad2a0bd9cabc644b51a8222a6eadb5d65aebb0eebd4785b3226e873d29d64f552eec0e6043f342295d957a9e5b0ee8c076cae506b12929be4420d3f9a55438640a4a9cfa290964ca85e0c8e946c596a4745bb2dd94ac48b2dd8632878210eee84e9c3ce19c290521941a9a756bdbb65b6b6d8f8ed685b269412e39f31c1f5e373a2baca042c37068f1068913f380e81a817c5172de091d0e0d2ddbaa41701cc7711cc7759c672dc7711c67b98fab6f29c7515a29add57241ddcd5a6b735e373ad65aeba2fa989a2c5bdf8f37602ce58279664c9592c9c0d7eb13454a6f1852243b75e79ca394524ab1ac741ac163bae6f34c578c081848b0d4eeae96694f57cb413190eb501fce14f74a119422f570478580948260174a94d2ae936d84433dc7711cc7711cea3f4fed70c9b6b3288ce29cfb6103e32a77b86916774dc9e44a9b4f749e27a5ebce10cc0f78a65204532fdfdb86aaf35036945204ad8cacf1001a8fc9201e653228c5aee3c22b455aa98b4bdbf01fcca35b9323b3b61d9e1e3e405a328b6dc94a93d3136ccc19e711622bc75a6b9d1cd6df9447699b411ef324e962722b56aa54a192e9286d3e25d351da9adce9e9b387a317653a6d43de2445da946ff879d2ca630698c61c9c721d9a479604368e768454547464d44492a2a3a6cc85e274a180e58e4ee4448e8443c2a58bc6503139f810d6ad6ddb6eadb53467256f2e58d3a2315fc8a123b5da90101141b5b681287166913bf693f854a3c57e14d7ecd49d738eba0cde17a078e6cf67cb4a556e6d929365b272bb312d7541e5c6d44a6ccd0ceed84a4a53acd3156fe44e9ec59992946e4b4c4e4d5bac3039b9933c7ec6f12ebe933bfa922f7995596b11c4d4788c4a1715e20250bd1ceffdf1e5e7c8dac6f7f2676d037cf93a6d2325e3e51d374d064e01a646ee895d145c1090ebabf09842a69fc22d59833e88435983fe875fd6a08fc2352f28b4c21c72b5d7c5c541b74b701735c9de74dccb70d26f062a28cf569f74ab9528c798578e4c87ca72747472b53923909176ddcc4ddce6497ee4470e1bdd36ba0d1cc98fdcd65a320e94ba9802d31dddc88d7c89dfacb576058bdda0e08e37d9893b4a259d968e9cc99a049bd0aae1041ab0c40917401f3300c4f75b7db5ce4db15fc7d92ea41207f55244d1efcef97dee54f33cb9648684e38ea8510c870241dc9e8f4c1d902d1e218fd9e2994cafb450e4bc6e74b88eb3b5880f85425994fd3e14ca7af6fb50a8b0e559cc641341b0b3c2e64748454547464d24293aeac251e0c11d9b880889db90e0b896d8128df8920b8b912215bb10942eea63147280941313295cf08221295db4eb6a23e83a534a29a594768777743f4aa5181c36ab7071a496e7cf9f8e7ed31087ae470cd45cdf53a1a776cc4e4a1c8e765dc761ef77dc1be2388e7bdd88328ee338b0db21e2820eb8986f7deb5bdffa964d7aa22367fe9ab1efe5cb74e48c7bf9dfbd944f2bf9249f86ece81e0eebc21e33d83b5d9d943b4a2a288fca901e33c827f9e4793a72e6b6cf7df71f57bfc38dc4c52a73eeefa2ee3b99bd91c8ee2087d5af5f83db00c4634dab2fab50c9a37c12c396c7e689a13613094d240c1357fee753522a7bced94aec9293b9ba5d256aebba7b57ab7f47d5391b082937a5dfa8aeb4b9477d63d483b8043c762ee19b03650a070c4ff7fb1f4a7290371a93b1b3cdcfa834f00e34fe8647760df9418199955c80c6dfe01f201a0d1e34c290069678c4402d4ffa34663c0dbc0350cd563424144444871aad08104d4ed78ca778ecf28ca419b89db86813f61317ddbb68e8880fd77bdce4da6e14fdc097291c2008f60d365bb68c71cb23d0519e3584c00fd4a35e767777cf3cc3f187da5c4c72d1677c63193360ea152539ebf7af531c36c39bc3aa16f15d287c0af84f98f1ffd2a9ccc764996d8d425b94b3d8244edc55ebc7ce8490d6a6cbe6bf89ad910db64532fb64156cdedf26a1291c363dbbc81aa910b27afa27cd239057a64a2ece6ed9d174f90d8db7c08d8d0d8d9f2c9b90c74d28a72bf790361a8d90164d5767bbe43b4711c304597659c23071e77fdd3ebb9e93aaeacc1d8e3f594a9cf95f833385c3261c69b6f9cfa60737abf08d6954e8999733b444b35dd559e4ac67bdb9e8ef0ac5705ca510a2108ef78410876397eb87a3e7989f118e9e656acccb745895ea94df718c74e98c2fe1fd67e0c7f5e97f9c5fb3b858b5d42c55cb53cd52e4b0d12ec9fede34fb8caf591c3603ff0c1c3e7ef9c6387f0d3ebe0e3e564df071eaa3e0639ad231df5339ac1757dc0008f9b1cb37fe5c533a2c0d3eb0c515396c1320a460916300d68b2256b2c83374828b2d583a31f4b43377dc06fbc8d4e6b019ef4f9394668cc6fbd3da8c3911093faef28a841f6f5e3d093f767945c2affe5be1d8d9bc09612d0cc7d5083f7a1333be5338f0d37dba558b8bfe38ac595cf49f51b96325623deb3f1c3bd6db84e3657d8744495ef335353535352f3d5623abf94903f3b86b46b833ca5b0958e61a3c52161e5b79043cf60a8f9f69f04867f0d892c138f408e6b166c9fe3118879681470ac2e0b1f582c769459e4d8c92498547df92fd53b889ec0fdaff306aec210e8f40e42dcf30acc16d4862f2878d322072d6d9a5106a8ad1f1450e21bb14237b17199b28c98db4e4b18fa28891442693c95b0896e47195ed91cbf193efeb1c26a594aba793526ae9ac73d259e7b43ee574ae6b6d25ac1e4ee3de695cf89303cd8672bae64cc2548426091931b04148be2f48c90d9e183e26e77c8769f52b1ae47175fb8eaeea488b9307839bc5d56285066e4b7645db5d5d549651b4e4208f22961b4b3c71840c980421f102003ca102882a483e0c5d01058825960a1aeac50e4edf0e61a072643a4cee4b51b438810263402d485a4ef04455c4b55946d152a485c84906e84241f0c6acc2c8a207224e60185714414204c6381853238305b4489e0f615469c960a975e3042431673790f70d52ca29a54ccaa774769d6ceae1044177cb11da2559c8ab1593c8f4ea707c1faf3b33e663b3f9303131f9d73a20a59472ca6e522b1050268a7953c3718e609e3da8a4338696d32ebc8ed68e561a745d57bf9150f776dd4d8f4e8af52598ab903c29ad74ce909e200687d9ffa44ef65a63cdfce9f3fe3eaeeef5c2b1b3d9be71a4b8fd630765264943777f9fee395ba9a889c105a9a8107e702942e50e6201bf1b3c31a884904759761ff8c0031050c27082a4042a9660f201142a9a18e208500c8f0651a6d84176c103573e4c9651c0e082cb320a185698ae9765143074c0e408e689178ac50ac785c54152ad4a76c7928f682105134e44ac44411baf9417234486e08395285b204122956514309800e3881d7c52aa724559e99228cfbd69d7a05f63e75cb9e8b94a17bd6bc8ae01a3d2c64c6baf8b12567fa4b46bd281cfa5c661b41b87380dfbe98f05691e90bdc7a5cc8f9c92c18b0192fde90d92bd9ba0108ba977f427fbb7037d4d853e296dc81fab0ba06bc8effae64a6938d6da75fdaa94d2c694de56a76bd8986ebdedac6bc8feea2deb1a33c7c5978bb27e2763dcd7f0a3f666fafd83feaabea5b5febc71513e7d4ba9e8a2fc2c9a0821c60a88540219484abc501d907840724aa590c4b81f920c544854eefd88c8fe1d18205049e19c3b0704cadddddda72481a222e54f6e1322506012cfdddddd85529ffbb7fab8ae8121a402e3a58822d0306612eff535ab6ec539110f0c4257021b4f22bbbbf72006063238b8afaf5975ad992ca37cb1b4e4eefea00e8c0c9a7c037630224b0b40b08410401481a1050f8a6084114592084ac203d7a9da4ae74ba6f3850a724c9651be08024ca22b9d731e49e19135e64b9453a7b4697bcdfbcfc33d2e456babcdd5c3817b1c6a582feca9b9bac4b133db0ce4daed38ea82e025135fabc9f96062629a321eb6a76dce3ec2249f828486886447adb5d60093c6853e0121cbbe17b2bee502e5fd874c7f1f1f14bf3838c4275b23bd657fb187cb7d0dfe4d2f8ea606a8647fe9fee43517cafe74f691bc12c46136749ed4f5ccfd3a66eecfac7e495bbd4b1a901058a43cc1a2090bb08021b3482144171b38c1151ea2f8378669e1f9a77f489a92c509ed2707167c10c4126de6731000941e7c40a3f91f1b2378f8a1097db80bfe33211077c179dca74f7e12f7744fdf7a2919ecdb0062d5fbf0f10223e3c6a592ff859121c7eebabc943798dbcbed86b74ee1b81f0882291cf75b43dcb1b38462e949ee9b9cc164ff5e92335576f0888b134b51278119ca733a31729894b2c3933c84ec2f45034632ad227b966e4fb95c976ba38a3b4a277fa9cf52a5c636caaa308767557daff5cd63728b2a4d4e59b4384c4ae141488569582208d3d04408e62cf7778172bf0ec4aa5f61568fd5cffcea671e88c358f58132101b52ef2b193fde1cf33f63332f7f612e6f345d406439f535a4b00d41dcd48fb28a0e9fd086548fea3d154e7d7da0fcd5effbfa8563e7ef77bcb27a40d60e18583df5539f0a4731d75048cd2e0f948132f840b98d662c488c8cd0082674091b491f69221793b840b9bd14b60d212e8f9990c50388b64ac011778427e1679e66064b1acdf58b1d09f622aff5cd8d8c6e46722633eb5be6c76ee683cc182b9461d7d18433a19435ec9bc4f13721cae57e6c19ba1506a28132b75187a58b423adb2701b3e6b378cc3ccb009236c33a00cd376d04cc9a210f999f7949fb2ab8c240342e8a2a8c64ee11d0513ce51d77a28b5b9e936606bb0f874999bbe03b32a95424c617631831c5d0143407aa9dc0045a2481c4440cacd0fcfb366340457cf8410b6670a454832768febd34633556b0640532b8c1113920a2d9e0b0f9948640643049a2fcd0436bc8923c5cecb20b947bbbc9f09a22aea13bcabaeeded54a26cba89fdfe1f8a21a98d99f2f6b197379ff6a053bd5aa766917550a043bd5aa76e97e17550aecbea29e8ee1b8fb420fd5a86ecffbce1d859a3fc2cca738b217645146f09c43226ab9356abce4acdf1d858281c9638decaaec35248e4b1c5765ff02481e2ea9c82e6f425f0b3f5c8f7510d235bf89e8da255df359e85e70a28b94e42981ceadb22f3428e134dbe2ce7f1a5adcb16b4baad4a000d9793a489cf9b389e4f973d5c3fc618a8be54fef76d3273e8a659ea188ee1a7c6628e2842f7c5cf4af3301b7fb144ffbf2efba7b7d4c1f168cb8fe2b7061bb4af954c0c11dc5ecad39e7a41ab83642576617e279fe069e96e32efcba115d7c09c2ed6662dcfe1f3e563f6e172857febc73f59ac0275b94c65ab8c96ed03cbf86202a2fade84825498546abbd61dd98d66b87e7258389e26e61eda0d9be0e9aedbfbbe60daecc0f13c5f58fb5a3dfbe0d7fe46ff66c9983661bbe0421332c4b29352bb9e6742e50ae6c86c5ad7171e502653ecf4b66b3c801c5dd9111c9660c495192bc04c989bfd08044e4a2ccb12ca388d1941deb60e9a2cecb082e6b47bfbf2ccf87e1e92ae980e27a87f36735b8fda3270db592bbe6dffa4948368443f6e40631b18fb2cfc3d398d8f14721b571f735f4debd26f4e435a7a72627a5db2f894caf51d6fd5dbf31f7930b85d46c3fdb50bc312d33147794f1b4006e28117a1aeafb51b88fb86bbec338713b7b928bb22e9ab11c21504110b62cd9a2c4467300162930820827e8c0105830ff639a323bb0c39ed4241892354f29a52694346f6338f5d077dbd2813cb6d1d8484e6cd4bb9d3c29cf9fac55ae71710e15cd6fa2f99fa7727812ece98eaddc2fc38b86c9ff5e5deb422ee464275e301c5f45d355ff86c73ac95db56d2ed6c7b1dd5136653a3d3d9c5d384eae6b1d2a11fa4e72ef7fad28466960371df57d1c371d0477c0feff525f7351a90b762dbaf7bf56540b12e2f11164e78664925764961b176bce7fcdbde08d1d90e7864cc6b3236d3776787678726ec0989ad6eb73172b9f6c8d2d9f2211943fd94a57de8eb2e40e1c83e41f42e8c51caeceddbcbae7fa861d9ed4ef7838f68f406eb2ff44513ccaa54c7fa4c3b065cb18f9ebb9c9239051a68f0a2170937ff4d31e99869ffc1cbce168ee7ea49c2af55c0a870a089853af4a3d0b08972930f3d895c74510dfd871b1cafc91908029774b8e21e471f10ef75f9ed2f0c70ded948574567281fbf786f729e6c25bcbcddd1bc3c7a570f477cfe14e756108830bba58bf9399417771882ed66f23431cf8990b95083d2a85a3399ac716ca354669b34ba15cd5a9382e85f29edd71b6ab1097a2f73faec7ed2399524a296dfa32d5467ac8c727489022eed854baa7d24b490efbbe7e4f71d85449ef277755eb8f8bf553b86b2e06e191befff7611053173f6c3f88c38082b8583f0e7befe330201f176b70b1bbc8dfc363f7fe1e769222176b1d9b4aae541c466b73b69346c25db9d275351c6d63ee1dcbec59b7ee1cf7adaf8e9a4f6db65c9c1e5c7f560e39b3e28dc499ffe2e4ba52e836176d54c1b9dbdc3663333f65fa08b713d473611b29a179154dd845d305a6dad6f776ebeee1f83df85f73e1087494b99fc1acfa340f4493c1ac1ab20a20f333df43e667befe4cf8c3a4863d669e26fc59fdccffd0bccc03d16c5e70471f725a611f9aaef934b88d641f4dd7fcaedf456de4e2fc16bab83549d846470ef37eca4987a494ed242b7d39c797f4ef5e3accff28464608138eab9770fcbfe1288a2ee1f87a85a32cdc7999afc3a323bd0c96b4c6e0cf60496b23421888bc650f7ba8a85bc8dbce726d9bebb65d0bb9bb63312b822729b9cd760370e53a094ea842e9089a76dd103677cdef68d8472b10ad80e44e0f47201564d4e720a37ab8631ff91cb2fc65a638e7d5ffe335b3642eceefccda913dd491d1ef3c7777f7ae5dc96db4a03b4a2db6fafe43d88f6027ca3f702c6b30c62ddb1c72bfbbbb7bc537f40d3964e994392d6e3489fea44e4733c6f27087f632852d0816824d48baa3db76704d79becb846e739f60c5423c26f3f383c860e9aed189fc089d411107b21c1d39719aa10624308e969c66cc670a87bb60e58e6ea3586a31498b3592a221ae4dce60e40c95e77fd5566d1e934a4c4ad2c812a72c79ba156f72a74a8b1cc6f2b1c1c52bf40bb7f9cd97dce64a7d34633e743423fb90c4999f43cb1d7d28f7571b8cc388f0091dc9f23750cb3214e239a6854fb6bed74b14ffe74ba9d4c373e98af2f8ae285df4bd2e85149ae6584ed774210bca719cc53942e26cbde248fc4aa6b59566ac47bae84771a322537a0513cbeaba6ef2d809b576caf45d4842b164cbb49590644add48a6d48926ade32a7dea575a690a7d52ea2a5be4ac3e0efb7ec561520a915aa6ef4e0eab6153c51dbba9956e4af97b077f14c31fffef7f98f450bdcbffcc4ffd2873097ffc554f5f85874c17fd0ffb984a6e44e93f3d3939353531312975dd6dcae1b98b9698e08725ad533c53dcb19b94de7b0efc30131cdde4ed345d54e6c3d78157ce2a57bd6755a52071e8db2cddd6a29be4acf3422e1c5fc271d5c42368beffacb938f964eb6b0d71c7556ebc923398dcff72f6bdc0828be6872be70b71e58c99c024bbd13ab96d4ad4673fd873cec9c9d9fc6ea1c995bfe3344357d6d8a8e2ca9f431c13355ecd2d41bae6db68bafd83105f65d55ae33113985a2f1d28aad002dee611155bcc0f8a2a8a64b9346166a5fee5f9938a5b9e7f671140777f1d9d5dcefc670b4d6e3fcdd06da736aab8291b1d5c55f6b0660531ae7fcbd6e4907cb235d65ab6f773b0533a5e1ef55f00a0b83d8d82ec3d50762587cd4c7158df9c8ac368de7a5894fee23d8b82ef48370f5f17bdf79ac79a054ed6887d3fe244f6bdc893d87723294587a56c9d78acd2ec53d07bba6172d82836396c6cb5966cdf8e8d822c36154a042b57b2585607ba40e92ccddeeba0d91b81c6cf1e0882dd83e1e87d73bf3327a6790fe3688efb0ef3e0685ed23c4d285d9cc1435cb42f635f4231e18f8bd68ddcd4e40c26db7721399b5974b1ebe6f72b10e1da7f37e23031f5b6e5440e8379fb8e44ceeadbcfe0533cdfc7e53d2ce3271e81c847dd38acc37067da978185d4cc52c1e01ccc527d6755f8b2e2f5899ec2f1bde83d2ab583fe900cbe87c721383c108f5e28646696f732cb58de639617be5cb42f738e8bf6617a9821624342083c78f2610b5985144c6cb1822d3c984115992200fdef77780f3e188e1760cadecb2c53200a5f1728d7855cb48f0abde6a2fd1916d77bfb9a2efb3b7e91787578e5a2fd97a7fbd687ec3b917dafd977a15acbd2042098566df1b178cc07a2d1ef58f2258d3e4b864aea378dc583366d3eeb004d9bdfb419ae26379f7e96d66d04f75090e9ea6e2289d336e89b6c1bc899ec25d94cb9bb497cf1e89fa17fa79fa79d8e3e568f6429418539b4128d097da0dce10ff91d6620a0cceab13f7e704f43967d99ebcb5cf327bddd7b2f7c09e27e1e7fc75f8f5b4a57b6c4f05dec191697355fdedb2feb7fd1468d7034632091e57b5d6a47d781dff7e07bf8e6d5713f4aa6ae8bc92f98a6142124d95fba7c0a129a9dc7e5e8cc30c4c707c7711c4c0b999cf98fb42206134e6839a8906c600c9a8cff61b14046c8847bc9e4e343ce5cb23f909ed4bb7cc5f63d179a922187932e3e426ae6fec6c59c2e2ef7e3cd6bc77d6ee812c28436541f3e32a61efbac1e0e287f1c66f5cc2d5bb66cc9de96ec3dd70343f6583d1528cb5e64d725c747e2f88bea3d993bc904baf87d0a0be98c02f10ad78c71c75576d4fbe774422aea593dded7f7be069964a884ccd8a9825622a2110000008000b3150000280c0a064342b1583c0ed46ca43d14000f71a43c66521a89438128c8711404310c838c218020028831c618840c119903e618b329689bdc7d1f90453ff8a6f099640a5267e3d3d1ba5b3371adf3a0289fd67836f38c230ec2e76e8f0fc7bfe3d3baca39b47fe3451d8c34865b37432c81c06813c70583fc8a0fcacea26fa90052109792e652e0971be66e68141837cc5408446e8ae3225234a5c4790c59cc90be8532e76a5984173806dbf1da27580b376b8dae517974fb2c3d398dc35b41e25e09294c2a9c88ba7764f8061291ce9ea2c00011c35633a54c212cdb70967d259881bb95baa16bcb9e375eab0ea62e8b4cad96fc6d3b861542a0b2846dc31ee26241cc6c799d55928f6a2c1981b48df1ae22b845ef57f63b8af0365aa24c98ce8689f8daef2cb3ffa9bd2dc4156bb0b9039ba3c1a98ef10356661f220833a9d2bb0aa1e835110b9c4eba14a23f3d3e44b7bdbffe7bec358894548c53e775ce867190c7e8b714c387f58229542a652cfbd567401c3ec7d39474e994aeeb1e88a9890a4a6a9973d584244a6865cf99250be5cab9ab10c65a72605a5d74dbdd0abb8d14b602211dfa968e654f037785402519adc48c2309b44f567f9c2abd3c81e4735fbef5c436635ffc4319964fd09945d3d61ea768098232c5932052bbd0d6c59539b4dc44924f6eb898183aedfe8fc048ba2ded415c7a86ae449fdaf6f7d5eccebaddaf84b96bdcefd5e0ea86b945e153e1dc81007ca5e0182689a927ab5f73c1a60fe7c6f57d984b8bb79a186bd06cb2307bb1efbc52a55f21ef8b51019f6a0f4c15cec23c939ff0edfdb52eee25a13305ee317c19e89fceb1c9b4fb4b43e16213e633db54681fad7f212c310a48b0aab32ffd1779f1ca46371e9d30f65d4039896bb62974ee15f0f0ad1545907f3b1c2702b42f2f52716505f6c20f17467786023e3a68ccac68aa95365ffc7662eb12cc1cd262fa8d2664b7e0c62c24a315df3117028c6f2d17c2e4e33f9f11e4de14fa51ca289d4b3b7c1868f10839a665ed09af21344d946e4aa847218cd035ac179c1255774c96d372ef31d9513a4361782674aff401b705c8aaec9f817bf7450026ce26b105cae1c44c10e8d166c27a0942190d424e9b8a1153baf0523a54532d2a29d24a644d18625332578bb6ae19918fc817040a6c3f5a71dadba0886697a296236827e99704b8b2f13ac737590770535f02076842447065565572cc9b002562f810939c787881e85dfddd5789df59a08afe2a1386f881a370ff070a5a7935a68a7634fafaad4a8dc00027c6071a39ca377dfe136146da5d902a80461d4e1f4e15f8d54896871b7b9b6aa10c588a3d56682cdba719cfa5812348022a019ad187742856206b9223b5654b075bafa8544f8580c90e0a1e497001c41b7e074e8eedcc6a313f041cb0485646d4875fb89443db05da759cda8935ecd99e508adedec49bba34fa65bd6e9a2aad9d564a6e52a8f6d90d85d1fa8d7e010865c4ac5458f5dc9601ebef6b33adbb426d37849f8cb86134f75a610710fabf2b1dd68cfdc4bf294a5f39a59bee4a005b9fc357b500e9dbfe3b524aabcf398c467e3706a9d3b6bdef4ccb7d7feddab723d937cba5af186223715bb81e2c44a71917a6afa0098637be74c6296cf34fe44cf5a89598830deb9fcf6c1a97ebd447d6175ba92c2ab0874b965b36992391a01b58adf4a4ab74b46aee5103e1aae8906c927e764686a33836537be94a5e25c63c12980e4faa2ee1ee12298979b256b932ffea43a4aeca9c185c9c8302107dde25d00d78e4b2e4e1e84d6240bd077f15640fe8b8eae99abaf10e0859630151e48b3a0b1b2ee6bdace8ede481ef984b821dca074b0705de48a1ec3e7080e85fef7872fa6e0aae5605ffb723f10502759cc2559c41ebf61b9368656091ce9317a2099e611b9ae9fc4ed292cdd645d86e5a91b214e226446b948b3ab0791752e80d76df25fcbf2e8cf561363d5b810d169b9747edc041bf2f84ed9bbb06757e851c7d50ebfee7c44dab4629ca00c2a451dc4ca3a7c1c5e623fab6425266a2163646c7039188844018e941c7c496c279346c0cd8c2e86b3c1743d62a05609099cc7c45f257d641d57abc9310d4e37d2c5d417ed503474d9d485a9a195c2dfe83f10fedd94049e14b798e1cf4091ba953aa055f70f1af4b242cab082200f853826795430868a1ad0d6cda954b5ac4f2495b4d0b45da0819978b55e501a90167828d18525ede08d9a3d7d92b6634c2d8237919d85f000050bb184c1801e986448471d21d43fed55483fa268e3e8f3a6f32961b025568c983e7ca59a4e7664901e833b50c548af138dc8f2df52f4c0794dc0b931ccba0ba930307ae12f6f2783bd19d725f71697d15141a1cecb7a7aa0245cc4e653fb6020edcaaf350e9c137f8d214f40cfafb2bbf1fe31310233bc49057694519f7e81990ce3b6a53114017001b2c90d6af0f47a6f9f058b0add439643dbbaf35ca80aa473d9754d19d0be2b3d21addbebf451b7e47bfe90cc05cf1cf6c1e969454f303e8085d54c1360f3411dcff208c5f7e9c0ddf571d749e85fd7b4ce04a54fea3b29b5d6ec53fff266f35952b3295c68f4e4bd277b876f9df45fbd3b3e06a38a3838f80531394a5ec583fd09f22c499042d111021d570784a5bd83e873e63e0fa41631c9263e4172ff6fa9444aa867367e26f0564ae4f58ff72102d1cfc06a8c5f17cc5630ea2b707bfdd3f2b464db92ff5d5ec056a3e5397a891eea3a8decd6266af2ae87d612eed537a08ed5b8687fb81a845a64a85ae82793ccb5aa6cf48502a04790e375f3af8d0362eb8b7b9a84ad16bbd8e2d335ec93cfd13cc70ce736db3b188a91a0d332f8ab3c1e8ebc8788a0ee9ee79a541b461f74496fd680fae518fcabca77ef0d3c8ae0b6346c76822c2435fdaaa04b6f3308969ecc33e29ced99440c542d2444a9c7ed6feb803c02b101197d7d443527e78bf48b876889e62c3e1d4edcd9e0de0cdca7461e98a6f648e49fe954c2b781ef43cf910f2866d5d6a9e189c2689b022ac8234dc07761eb393f92caf7dbeb2b4e7839add9c7cf6f629317f360a3451a8702ec6b0928422e479bad9992000dac83c466f0bb7104b91aaeda2e81e966a2ed5f37dd34c2cc2edff44aacbd0adbf153d6113ad28a2670b33d0fd2e085bc2ad4d97a6bcdf9ef0c08c9b1e4e701c6373e90d096340bb620cfc800801e001764c1025dc1b8654af5eae7665aa237213ebaeb57c2ebd091241db9e41b2cd6b0a4ba9fea61c3945525818558df3e66bfd3b1b9d5777dd4d3e3b802b59b5b964f87917498feb8b2bcd144efe1822e234e030caa7a6fcf64ce136239e5994cb77f53353485c05c9d0ef2b6edffbad1f77e069347fb1c8c5070e4854c7bd0bebc729b0f4e7ab2ce6898e6bb099a490fcf9d93a1feacfdc44039681c8037af18492c485cbaa177ccb6ad0ff1f61b914a5acad4c6632c6b617269a4a4536126ee1676d8d198d1d47fb13af81c110542255ab18a0c8e5fbfcd9869db47632153587411c1833538e32316127e76fd899be6deb08a7e54eac20c40a2366f5015ba0e27e2741d9174908e61186013a81a1fca4ec572b694385321807b4fd29ad05e6debb5d8d7ce31f96aa30f059965f18b21bd5cc2e5e56b717b3e0af336be69ad570111466ef8ab7a4fb860eecc1e0393c54e43ebbe4886d98dbc5e754590eafb256bdfdbd728d8759d16f982bab7741fc23720d68cd1f336a3711ad17e91e7a1945dfc60e0b445db1206de6c2ac2c30af2694bd122e99929000c9c454e41b3e23b1fa53fe65b0d433f186194e8f741299c78a7834745904389897aa4e578b9290ec8c9faabdb595de037ef5afa2aedf2816dd328f662db985c1fddb5e101d60cda51e4f5f14ba2f18bc9e924293938b0f441d2e96961ece0a930c9c3911d72dac197a8e25caa5cbf1167227f32d72cb244bdb86ed30ad8061f5e62c4a3f199be809e844e246fcd44c4736a4bf2e8e711f19fbf76952aca21b62f83dcd953043174f731827185cc32eb321c89de1467ef54ca335b859c44336e3a85c240a45bd6053e5f0215e3063bd78e67bb6723747f592c1f6d075f96af86ee13c093be442409c35f0a40abcebe600138de86cce0550f7f01db60c8f3584f79ef8257444f9c4bf051b76378d3ec40f2074d1e88eb8b8d753367a431c3df5ae1de132753333d9fb0b8ea126a3f7401193c1c754089ae0d3605da0f2b68be1aabb31ddb2e235e006b7eba221f6a853d475dde3fbd0160793dba34d771ab4f58be18ceb5d1b5ec239f3cf976dd70f82097b2ddf7bf391a062d80193a91deda17487b0dec42255055a57408c325103398c4329b6eb8e178f43a0079d0aeb8ee197b890c57c4a783aefd3ff0690f17f0c658aadd7679038db462c26cce2ce3dfcc8503f04cb8e62d963f67672968a001e5508840521ed1d395f9645eccda467d30573276bb8ae4db9214af101c33eb9b84d8d35ebf27226e07c50b717b6e4b6d4b6024a42418c30e90c492f25c97b887632c302c70bb5e435b2eebd2d49da7157b3b4b6755528fd235dbf81fc0d6563755a4af6ad31b8f30e87f27225a42a8c705caa1843058d2a460da7229a0727bd3cbe8a36ac512a0e92ca286348dafaf3fca2ef063140949528d9156d71be06cf9817db2778b371eae576549a036a2b5e3dbe0d55cb9a3673bb4f7aef9fee5e1519697ee0169a97eb34236cc6489c1fbfa495ae9029e7dea09f52f0e45434aec4fc232051ecffa22a705bf753b2856bd9932a1e097b859737b604fb615da30a36d3ab94031e1c70b02167914f20849db610d11c9c654ee71e29abc7b137a20e220ff2fa586b86b60b2c878f06e0eff466627f57d34300db8d4dcdb5dfe8d71ac81a1b3edae0c07dafcd74fd126edd2efedcf4c977725bd124052a4c2fc22d5ed8dca190822cb0d1c3bd1cc5a46f712ece2a314d8c1e0358dad03f0168679a0844fffd3990b482d39174273c44296f7a5208831c051305a92283fcd8fd8077b13a5255ce33795d723ea44d4e2cd1137c7fb6afc918a95384d4465c060e1b2fde76f5506f60640d93341018a621fb64289e4ccbdc12af2fe26f831a91a683d3824e371bfd36b437e875fc413c7103a94fb7a883cd119ff571a2d62f9a4ca247ff63a268f075bff2b0d4c1020e5462d19738db17e59199f05cd9500f9cfb3eb641dd7ec0fd05d2bdbbfeceae78badf6a4cd644ca630281daebca12455dd06fe3999d9f9bbdd145d710f55034ac0c58ec9219dcc9799461f7e111b1f75f586ce202e1427ebdb354e88d73b20cbf3c67614f779996700e98175710da5d39cd1c940d7cf1f54817810521db0366077973a6a4bf9797bd7afa6e6ea1d20e2fa786959aced85c231077578fc4c8353fa43b5f33dcb725a03490b269452a432c7b222c2f1800c325260ab9f5a0dc36a9db5bac062805ee2f0d0b1e67a736ef89e1ec90dc2fd956ab36bd5d7a0ead04bf6d3d596d5d1400ebb0fe9a1a33fda2d390bade257d1f54463a55a43a63155256d87c825920d6fae3f45fcc1ea7bfd50d7ac825fefc64f82dff3cd1f543a088151878dfe78ff1638b4dc244b8441ce4eb2a8eae6cf2af22e973092f0ad5a04b6b80fa21a2473230a51726fcd33a64c0c3b1bde6ba7520ffd3f90dcd55add03b8e633886eee0f40b201b0120705048f854bbdf621f34eea3c3331c7dc726266bc35dc43be4a1196e2efb448e07b7d00bff5fe69ff230426c552053c6abef804af511a73c11e4ae818150f18e4f6a1210f3b7fe4961cf22aa870ef823ba9e07a28318e60c807ca3a9270e93d44801179e46cf0ed5a84f3333671fff6f3f4d219aba17e74163651fe56211e21ea29ed41777c1b5a6e7ea612dfd29a6614e89437ee61245c1ecab82f9e40e75e2b5ab682a209aece515e836cc6dfba61a1b6e6176c7310f9c596282dd5c6cbd67783ac9309bd3aa7230cc3a250819e610df6ae2478750c8060f8b27d28a5d19eeb80d916c78638e3983507bb2994074a9c4cda5a686a56b860810b8ecafdae63209d09349d2260182888895817b167b6a9e9aa3c2efb321921a4e4920c1bb376355b2199176101a81ff15729c8190f71c8a5cd444cbb0786002975712697f4d870da58c015a41e467469edbda3c15488c5653d8b52bca04831117b2bbc652e11c594e5ebc44d4edb06277d0a723c65e68e9fc6fbba5f11c110dea3f1716e9beb2765aa9622b3193c98dfbd9defe7b23d751f1d0b33260884f9d41a8d0e989c530c0fc5f8567050a1b0fd117f73cfa49b8bcffc9f55e1e4feecf15202c2d73f13fc17b6e000d5bf88ba4a6cb5abc2e7879dedb3c3aaa883915b889b15020365f60573a9acd6cd4345e655b54e8825f95d7bfb72edf4578f28c8a1454c52cccc00e2b8ce825669370acc18bd185fd5d1d1120d5a6fa30ab81664c1e5b159d2dccbff7c3eba0877a3e72eb21d5f376a107d5940b53e6ad8c041683b421b754ce3d48cf24e0aee8f846b218ede2d04870a317a18b77ca6002b200d014b9093f533b1aba2617e5652f9b93c064959fe7371e38edb9f5bd4f5719e381ea8ea3ca87312423b3358a7d782706201cadb2656d8025bd46aa2f727d6ed8770f972b1b7fe0369d7f208fa63de4fa13917893e4e9081baf2861c1d27f1b24fea93ee359fce25f9be0731365e11b686a8153a7bc7f9a45b37d151f78b68c108fd50c6003bac3556577bd366547f0300393a1d1234f9a4e08509cc112f23fa6c344a3dac5ea1b8919d43c9d7af07f2d11706e6872e069ecb5997bf9d731cb04ea2515a9b5370495741fd333853760b6fd320936b675ffbd123fba8260016fc3fc4d36374c1615e6c32d709abc3388888d1932c9a82d5fc7979a0e1f7e561b790ee080c31b77bcf27b5c07831c90454e220643dc379074a99b865411a417bb65a3b48c051c1ee2844be7bbcc8f21d08033278d4a964cae6a9f57dfb33bae59ba06ee962a7bce8f14caa62262b0b03aecc7744b9ed6d42de18f20061677fd1921a1d384dc6b6df447c7161ae8414d8abcc7822ec71b2ebd7a1e99a3c260d5c059c6bdc55f39c6bdc7c92f30242c45140e54172c5891dc4850748f0bdbe41e5f91a0b08245cf1affe265599c4a47c2974213cd32425cdb20a7ca654010f9cde92abb42c49e13e04ed7704287cb4d103ce3487d82e2b72b07b0f493c4fb0366580668b9492d3a7e5e7eec7bfee80f1154d9964bcc238e6bef1f38cd92dfdce346b688702bcfc330cac28373fa7dd8f4bbc5a645b1a80b4fb01214cc5a10cdfc3edb53afad7b8b213074a6fa43c4c6b22e0ef683f8287746aa15d9d4701b289e7b174537a3bbc68e233bcd94cb0c629cfb410f9610dba2f7a1cec4ca151681784edc10f60c0f5ae219cc4dbe93fbecd6ddc523c0dacbdd4f3b2319ad68116504a69026c2e63e4569c4be81f920d084d9c57ecf94e31ae8bd7ef104e6d61d7ad5290b86355b44b86f2896100b15f66db22334d570f31cc65ccb13fdf37e7772b9a0b133441a04571e31f42f51504df1d65603fcf82d03eb6121e93121c8d8a61c641e022a3943071677b82c5bde43dd67ed6a465febb19e27cb2ddc20487bfdd55b2304299f8e4ccb262e11f8f868799f8a7fe01202ac8df53e8922be363f6c7a3dbea386ef93d4e8050cc1f8b09be90dfd018dacb71b1e9effd9fc98ff194c6b11d8d2dab833b1981f55e0f1e81ea97933f2f9a86ffaf72b6429b2372ad81fe1eac195af3fc6a28c44b11b8b6c9c4623adef21b49e7dc98f2868090447d4cda0149971f4d11b64f7eb18e0557e37703de287a2e928de4e7e2423801f9b396f3d6784e84d0488de1d7f9fef7b1b5068d07fa71f3d2df56b077d52ed470d140b1ff9a59f37aa718f706a78abf6a3ca48ef0122b1f6373fee05b5bbad020bbc5fbcb0498b81e145cfbdc5b16af94f43dd665dde56a1f83b6d503af027c5fa595c2662f0b5403c1383e7c2133ce7b91045b33d576bf87fb0639006e018f758aef821e760c45797ef0955dfc8f5131a49d6a1f370288e3867d482a32f3a143ab3ac1104415967d11c0efaf401066350dad565da46d4ebafc63f2961894a010b842cdd524cf955fcb715ad5b9251798dcab1bdf75faf3ab0db3e56e86777abd3be3e6f5555a52f380c8399d03760c71997a767750597b18e9883958f085dc7ffcf5e9542335342b50ee3393b0b716e2b99a4adfa3135d593d8d00c63b56f7cf3ced063daf8c45c7062de5fabe1a3ba78fd795cf4d37a33ab67116548275e274aff91e68460c026a37c9a91ea2f30f34f5d406bdc744e474ca7728236b54cb23f8f914e5fdd70908599d8f7d1340b847b69829aa6c0989a7057332ca1c75d0036f001f576dcc38bad39d514091c10b37ee48368441b089b12ae40ab362bb04d2cdcc46fb11281a09b0c8f5cbef944dd44f59de75e8c04e77838bb8738418181bf649c0eac2439ebca23f5057ef39c52e864723a5f81be04de1178a6b7e3b87175ad05c7e84f195af21230a8099c022ab837389d75b89c259accfde4269f3adfb3f07fdcc8b9170f3deabb471c732788b80dd3500775f5ef94813ea90962b69f4dfc2f7661d869cb9a4de44de2683575474980478311f4ce1eb6cf0ba4579402b9eaf0c3962dfe19820b5e5aa28b243c5f4912d8bb6210bfcfe919ba3c086cfa82258552ea6b5999226dbe39fa059d8f0121d0b71d3cc08dffc3ff4b0ed43129fe10363e0939fa88ef52184e23ef0b68d641f2d3c5c7e12115da4b152cae0a5b92c0afe29b6d9be0847eaae4e31d52ec2b6946425f9054668a69c48e6ae4de2ef9c38f42884252e796f9f92d40aa6114230c7271878b8572a0173f29117a92742431f1735040dc751d68ced3c0c5b52ae104f9789b6e633a22b8c44d5bf410ab9b6dd7cf329cf7430663118f6106bf8ff76bef5af9d25583af65708c11afe2461e068806d0f48f1c18547e2f3a6b6969c2befe019dfbbc46ff6269925bb61c878ac79a66e98ac9da48c7ea6c68573c710aae1b568c2a03b084408ac673a9f0db30479c307e3b30f5e89c0ad1d8f426f2ef1852d4e5358d519af7597dc9aa2d054fec4aee64c97a8cfa26b9dbdd638f99998ce98d72061f6223aba9199f4525dc0c400049c3d1965483fe989957720998264d08bfa84956647f07c94bbb8c2cdf45c76a6cf580959f66dabdd608133e3c16dc3adf51174c122779a0e3dd2f902d8a1a72971a8a52b5559c6ebd31b7f342d50e09aa4e9324248dd2ba84556969f3dac2e28a7216503842c1e64f47388e8654f87daf353ccce540304b158cf57ce458e407fbaecfb313c77dff861c27eb20c520e8058e740765e9b36d969e61a93c3a5444c4b4128e534da563f69e8e0247e1a223650dcb6b7a9a1639ef3f04a64847b366702a03cc71b6b7f6deca7a13175d2a7cb38e28e0e2d0382190797779b22f75edfb8f632cf6fe03ce3e85958ccbe1f0ead7a1c169d5649f2717fa2ca82b46f7ba73aa880e3753d0f4274f8721058bc92e4cb005d00b342795ec6f00ed818bb738cb836a0557e604b177936b1b4a09100257c58f4d9c8671bfda12f951ba420004d205733da09758d3bb10a0191a329166cee7ec54c58ef300f492c83d00e821d078230a2847ecfc074dcfa36894dea36c60e0115febacf25a8a2c56d80116c15d653ac9b528333ede1927e1cb5d66cb46f1af99a25e1c2d0298a26a1e89760ceff2ae7c88b93f868a8e37e6f9e23a16264d5e3844cf076bb50bf2fbceee0e67d0cf18209d8e7caaa626fc5aa9291ccb67180b1d4a5f169cfd5dde891e59ba6f8d340db954155ab7e920e71c6d7c08681d6b6e1f50450fcd6ae1c4075009c2ecdb2a16bcc93187b1e1cde7b15d8ac783e6e4eabb0e86fcd028f55d4fa3b66b2cf51418804b8058066e05a0ce5e3a7f8fda8903c7e80a38206fb3186e2a9c945e655809f5653fd207fc858430f3421fc9ff6e2e82afb9912d21f614f529d4382a088e3fa55170f6dbb42c6b1448ca5696cfac0ebb8a3c074d013a6ecff8672f104b0b7d33bc1cdedfe60ae1b6be002a3d7293c8841d095a3ddef2f6c51023a2382907a7a54ec8d61be28bd7d75a2506637717044ac6f5eb5de452e5397fdab06d91cf7355e8379ef174e3e1725d5fc769d24044d05951649fc4e25199644fc638e460aa10508f4d66fd20888400007b4a47153f907bbb17b94516b8d261e294efbfe76613b9d87715d0049a0df76cf6c996fcac410a18e428013f706b846fec1ffa42f47bce9a4c7c633f7386d0b8481a05b112f54d4a11ea0d36ad59b67b045c2000f94f4d07de599a6c2fbd8b2ae6b0952a47b2273e5fd687fa79a5824002b4d0ccd2756feb88fc872103c3d1dafde59420e3d4ff27523fd6cede948280f6b229c205b4f83c8a723937d476d746c46235c000e3862c3b69c254b88d66b71973ca0b57e97330ff4a00943756a0e75e9a88010e993b22872bfb1bd0b56bc6d90e45c09697d22a8a850510a67b809a7e0bddb620c4fffb14d8594bb6463688c65b3ca38b7e5341ae8ac33bae0a22de3982627f8b9df18edcac70d25b5b4684467fb40702935094b33e7bace4b6f786ca443099f1cc1ac19e0fb27dabc4be3aa7789a4fc06f9deec2b2e0fed0cb33c6e91d52dec37487b2f1f726c9275467c9004c26b3cc09a951af20ce2e07eebae89f0152ac26ca74857cae7168e125ce784b5713c05cbfcdae6bf35691d68bc4fd4ac69894317a37faad4268dd64f842bad528fb5a1ae9a6e4bb93d1e99b4d34546fc3e0c72117d5b245a1f01db2b4004b6f17e693f418b53df6288d6414ae282b4cac32d05be00d5300592fb9591ec4bfaa473c270e703296188da70de9c5f131a66a42668c936e2370a080038915f414d1b5eff03e6a847ec238477cfedc8ef7b6977348113495edc0be3f3105dc86a8db236213703a59b020c778f5a84566f7aab7420ccbf704c5bf32248c46b0923d9c104e9acf097e6f2d0ffe3896c42b5b79bdda37c17778140f03acfbe7c5ab59f6db00a01241ea7b9f745b7b35885fcfd6aba133633c442735804eafef39552e808ae7cd07785f5db42b6071a77902af87b16470a6f8e5dda92ad353c94116d79d023dc27eb0058ce0fa61f6777e967b3ed0bc217f40afa274f74506cda969ff2a1ec6d913ec8665f570b97c06defb60ec6d4d118baf6a65ea8e850c8becaa12c184ddc4c1ce2dfec8b12b5475628d47320648bd6f249c8fa97a7305b70b9118166e144b9dc49f0cd27daf9eaed60a2acb23ce9600dddcfdb297c1ad05f3d35d4279f31426cedc128093cc8beebae5643a62f4c3b9c80dcc84c68d1abf826e8e2cee9e533591e488cefdef44eccbfa5bb5acaddc0cf402aa358c8276b755b75ef53276d2be006f305e993fd2a3ee0f9225fb5f9ff5461ac6d1259614a89027a1f7eb7f88ef40d509c600b4dabcef57220c3a5bb5d842943521f8c955e7458a770e61d3b7fdbb994c2e7305de544a931ba5445a3d22c6c05c34c795a3a042de5eabaaf009883bc9655f28807a3ec8ca6a0bae7eabc27813ee2e538fb172c88f0f9d5dbae933052070edfe173a1932a982ca64f44bd234fee87fc986dcd9766091da95fbe2de8b4d7453df07cd1e2f3064702942c82db6aa2b317c415771bc8954e03beac012298db8f38bb27c6adb961fe2d0aa08328fc6b7c4c706678a12955e5dd3fc695cc5b65845667ae88330b491fa4d0cc8e50521394161ed6846d9ca84b0b6b039da403a936e83bc9c0042de999c0b58bf5cf7a4c221ce9ea71abaa7069d1b51d4dee915bc51ec2e6141740e7c6ffbf72e7544b988a3b04636134d4fd5ffbd447cb2771f382958481851e7daa31d5422679e92fc169e4ae0a45047d75a427c0a32b85bfb181f4eb52675522748a0a61d3f7da2eaf5f497534d4e0ab086372609301c243328c5d738b5738167467ad1e8ef2e182326477ed8eebdbe5c3af2bb83871c3d18029a73128cc18dae2c233f7a43dda029c5b8e63663f629282baa6dc55941ae6a6f1745c508741d2aa1ff35bd2c823c0729bcdf0f90a016742714629f865e4b3ee55d34b5c32b4fe1dc05842f4e7e2261f44721e84bb9ee2a1fd023b13cce567e9d041be95360335e8660fb236aa2b75c288898e297a66b3873e895c84ae0398a5fc1c1973cd3cc13c9f3f253fde5c6bb0ed3daea6f4f49139a2fed13770f22a67f0f758d5774d381486c9a977716e68750e6ee3ec90492ca422cebfec8fee0246518ee2ef1c6b558593fcad4f4c1d0a0fcb045bb20b2b2558d7546a99152e2dcb8289e9be89746b66ac9c7002b9acaa9a747840663eb561931ee55ab629f1d0644ac016e62b7a0f748964805d08164a075ea76e8fc3acf5750250c433f2e34d9f8e9e644ef54da44051f4e8d945b36f1a5d25e3a1086436379bc883bb565aed9503c86554409e100f980beea9fd13120f074fe29cd9cd4db1ecb0e54eb06a748f434cd82679781235105a2f202034c4285de12ecae65f438210f987274020820e09f505a872419d9ad49d8bb1b933388efabf4fdbf63be3fd67949e60c22e72817df2882eb7b58dcfe404a61b57f66c51fbf48c9258f85da5ad1d424ed9a0b39d16e9dae33862eb1e247068efd24c1386c12961bafff38c62430eccdc42d7f5e161c6df42d7bff6e751054a624822c1f12907a7aff2407582b5c3e6d9625d28bd602331004e6bf5ebbb7cea4253ee1d39d4cb6e0590dd94c3df033eae9d109e82072a49d62ef72b82d6fa5a21ea0aad3bec7b5c7fde1a09abdb2bdf2d0fb35ba36edca03412b6a1950e6f38af1f24c2b6b9f1b9ca4facbc9fd63776accafb5c204ebc534b07198b3c0973ed86b154593d3a31361da0e25090d1bd1bd208c58cbe9aa2923846c67fd530c3a7ba342fbfcd6b8be2779c314dfeb5b3ed68c8d5a226325aa6e8ee7dcb528b2701983bfb45b5a7c54dc9e2bf60a53927783919ffc4f9273fcddf93f71d7b1474dfb3fd63e3570083d4b3140c4f3e8fd540ed0bfadd31df1f3be1d724352b5e1beaa308ecd6ddd88c0e229ba8dcda345e1ad59389e1c553893ba0500d2101d242952f106bc0504647737c488c2db7a1c1e79eb22c27c5da471a10d794fedcece1eb887509874938707349e45cb987f3d5a51b8c8ad7191f1d12ce1969157b97c6e298baecc14f5e0fa415b9d21947a0aab23bde7f017c83e9e2bd20ec51e9f68a4cd50c490ced22903620469adf5d659ad8bb129cdabb4878431d0f11d92a59a7845072ec6236ce7d255600b3eb695af63f023f40e040e4213a3a5a088303211ae7be4599c83c8c37b3906e6b871cdfea49b2ac36bbffb1c0a56e6b3b90898b4e874b77d925d0c41bbf6b6eac8b24fc15485ae88fc125a216fa7c4912fccc4d49cfae8a628c6dda2ffdb1213d0b9500b550d01033bdc8accada7417c535179dcfddd8ba714455c047789a0cd4ef04d63e5054db84bb87f8ab2c4aec1bcf4a077c8efa586fe89986a303d3a081e4314fa5bc81f156427c6858af5a2d4b1c5fafc828b211778de8f1e987f45930146b81973bff6a10fae72067ed80aaebd9df48aaee880a6c07127816473a96a46e154de2d8e819b78afdc98dac00f1b32a771c310ac492ace321a2498eed420881bf3e888911b40107161c2b2786d434cab9339645001addf0393a82ae01b723d1567fd68a82ca63f8cf9bb31cf161732cebf133ebc17dad0f662a151253a06252111f01bdcc990f371a2ba212d3cbb68b1c742c93db737790775230eb70cdaf7261a95537f87bbf4c341e151c11868ff0fb320a59975b94271b5f05218c929d1803f5e59762c9f3ce373714d504d0cf9274048e361ad45409709842127a1cd3fd513cc8391a846e20cafa8682585df76aae6490f3cde58bae4765aad67296d0ef8ee5c72c1d43d53a06184e0ca03da4f39b1580ee425d784d0ef538fbb9b04249c3295d311cb0541c8a82ba36eaefc6e0b5c31ea1e14fc2ec1f2bd241fe45b836efc20f0d127936b3a3af8e91704f3fea69534ac3e57b804d927981fed178359a0f42b197e7c0fed5ec9c7f09a461f57041b6ed4db7cfb0756beea898688cc2c5bf8142f09600f4ca850ac3694aae8ee41867d4b47450d7a14227644afdfd36b5cf36beca73f54fb4ca237ab22be52bcdd61e67c4ce1c2fd45a54fbfcc233605e69f8e6818655212eccd14833599cd5410b01b3da5a8035bce2eb06e7b309711582736481078ec4aa30bdec4070911b7034b37b50af974fb60b2679ab0c92655c3aab89800e30d4b679e9ed3f99a2ec843087e6f6ceef1386f78bea32e1433064ee94dfca9931160c24e8b121a32a4847f878f98c585a8a8b6872138e144a12dfaec76b09103576186ad1f428a125c90634aba50027e102cf67b2aae4d759609b4ba666ce609074f8fce3a00dcdc7de0ca406ad220135821316466d8a8c15e0c8c4b7ae01c096eef8492ad0668e23faa6542ae10a0aa2d44dcf048c68e1d6a1b7e64d60ca49c0c86812fda0242a18138189fb3409bba63e5c533ba3e5ed7c893963870c22d1aa6d29e6be626326e2bb768bef97bd20a74e709a298ccf9a4adf4c0ed47770ed5ff49cb28a5f230399c992d8bceb1f9414269f9299cf3608ddf878b326d5a34902abb259579ce0649a2c4b8f0ee9b0871c9382c701fe865a04b2f9828a0a24f41013fb645ef570dcef55d118fcf727f1f5dfcfe9522faeff83e40e16e36f92ebe895eedc28baf9c8c10adf8b24b7975a1d23ac632c774c42e0c30f69fc5ee1cec3b8aac212a65d82564d885685d4a5b5c389cccc50cfff1527e37291f678bed0a38ac0cfb8a39c7e980ed9c88c062310b5f2083f4fba0b90048897fc610a1a68c162292b6316ad791aca54b1a8200126d8b1b0a92b25b29e7265829204b5a5c5537566db6802c49fd563342431b64e9d89a5e7c8b7fb85da995be347703e9ee9c4b9ea4b38ba44ad31b2d3d022a6c22488115e89802dd3cb10caa2564fa70d22305dee65dba7a8be31b873bf3a2de96f474c86e67292833e808c5de694642d629af2ba39143da8ad6369cc934fc93b969a5c88b689212b1bc7940fe38828a582fc3772d549b894c20260cae4e5a42abc580ac25e9414dad642c5cb5c91e010dd6446bf3c6e16c5e5faeaa7e8a2510e353338b0f6ec824fe9e3e4a6f2db2be6c0990129b9647e1cbf8ccfd8b9fa11f059fe77ca9928df4eb23871b5d719ac78f4cf5c75c235ff519401bdb38127a13e990cc54f31d1e8474d2b937ba018e6ae7dfba6851476be6c3bf70bb997f94d07094d05c972f009e45ffe9522605d09e578d63e08c0f8281a9702f4b01a622450de486bfe171a79f37cf172df40f8fd90c6a54074a04eda778e4a203d52accd8deee3658986d268d8d48213ddabfa940243020f14fa1599963e7a2d7cfc7c2be3f03558fabf0f1f7a98ed58f9c9f8f192a5a61407ebf09d4f6c851cb633d2d575fb6ebc27cd8b8610bc632ec109a5ed8c8eaa9b2d91d0bfd5febabdb508fb7a320825861b60c8fd3e786e26bb08098b5918e66e2d8bf769dfdedb408bfaca09a1a5b3bda810c67eb9205291774a3f11578cb4142dd1bf60c0cfa8df9de14d5cad4e8b5e60acc6d0abd5cc045c452f5ea16bbdad2160dceecacddcd75357880eb03c5b9105b3e2b692ac6fc7ec6d685c0398b13ca33b964cf269910cce7f51ea2da00ac8354627ea11526efbf4a43bddbd0aa6c1d66190060f4a7d4f17ad091013e914df9d04108335d370a9abeec296b57c83f0a92a4f90e6decbdc281e8ec4f05141e7c2ba52743e5d35ee4f1e86b5ccc37f03dd553deb4eba94232124c6c1e91beb35ded23af4c5ac74c372ece515109d663cd212e2b87d6848283a028064004c8a058ea0174c18c8ded46c80312a633366aaccd61ed37e6211469c74e0ed5a0efcfd31623efd2002d023a7ffbae77c66e82975a924e0fadca5512c0f90a3de59bfafb2b39f886e881a0c4a6df4034534694c65418e8f18a4bb2f5cf76361877347648dfcd9ed1238c133862438fc16a3234b0424778ec9f6079eb54268f7a9718b4cfa49bc69a93ffc05ba89681876b593c2a9305ba0569203cdeeb315c0e2dc309e2b9588c5a3b536d3f986f7f0ea36d66699ddcd3b58e9a2a2234c475f7e37890a30810e7198fb09046b4670aa6e88bf9ffd068cca8b007aeedd3a7d19811c1cf6f476f34f2dbf6e58870bdc6e309465a3332725473e0cd6dbf000b98f426c3e7774a4903886b929d7092090505d83b8e8825acb5e03ad688425216c9f823c6e19d125caf7a8932a549bdc424b7d3bcca05d48657e88d11795c86c5a8a0277d18743012f1c56e20d8b0e67a032b693675fd73bb11d3c762b4434be5a2e7476c407aeab4150dbde7fda3cee062a08d8a1641310365a8008449ce9406011eb20946e384c65eae2c6f12be9d34c674e20110da78cb1aaa4dba644d917fa8418a2548ab43589bfb225f144eae4c108323e718b9fadebb769bac87bc7e65928dad24dc136ee6bda12416234458dcdf0b8ef6a432931536207cc369a3d5dd64b1a78fcb4c6f2e64a9ac65b3bbc8a5eaa368f794a6c1d2203e73ca11e2f88b730d67310e0c1203ee997c170ec631eadc41e84da45d1ef9a380647d02ed7d7057d0602f252bf92e6b661588a6c74d008c4a20f798ef7a5a05775375de0b6832d4a1313836a00c1093655a027042c19655701bdf70a191f25c635f43c6ca702806049f6e28d527264be0a7ee6020ebf3e41e190a97476448557e2d495e6c62b9be7796072012569a61403d83b3c5f2e316a9e5e404e2e048be731e4a398ade164a66c3dfc2493f821d15986c5e9f53deaabb3a669f2c549c9b43d91fe52dbc1d9144d1ede9b88f24d8496f733a5ab2cb356f7540a4a00334a6f50a384bc147fc9df7286141f253b85cd8d9ad6cb1c67ceeb0eebca0adc0ee7243393e0b6f0aed4f0b8cdb568b69cbc4b59127abbb1b722b2ea02797b61bbbb4442699d6ad317273a399ba876eb2117a7d6477458b8868be926113e39bd787944cef498e6b209ff2727e36c8e630e6fb8c1e9627841b3c724bedfc836c6a5d262b3685fff41b3cdd43ffe912b925f252918a2b4e8a1bc8ed64b78e30c07ff494bd1a25b037c807ee65b0d51a6e17136e5bd43f969c51721b1933917abc4f088bdd0f54066985fe7799fa89aad665bc626998684952d1ac889a7c1d6448988dfe9146b7632a2248c56d21a6b08dfea94c416026d6edaa06e5eb4d2698a7a15e4a775c1033f01fd31a80170e78b66a9c719c51e8c3432316982ab83c0a422c16230a9c9cea59b9c109c398a2500ea109cf8989cf30ce30a513156afb1298c1945816c68159425f17f270a6ea4c1e31e13f8c733272a66ce57b58772664db4158276520d31800ea81d6aea73513148db32e15040edb0d166b0582cc310e424b574fb038948a33219c73db36dfe506614c0971613d3b06db9abf243f99b2709f66610fae1c620fa1d63571e0b8452e68ff0a8129ae23360f186f441de681a428dbbd92c4bbbf373741f16336184cd2e5c392c861c50f98f78ad42ec2b6ec8e9a9f56546ab2a7907091b25cae0b7925873029ad24ebb4ecc8927b8ee62926057b64e77ad6d8648b97cbeeff2b9150f02e38cf6f33f7c10d65d9b31a6c9dc02bfbdec3663aa071aeac7f40ace032bbc7e13ff19c1f3dd0f3c5d9feab5b190a1ade7c19ce7f3f1aaa35fb99f14bb3e25e31ab9638d7174c637e750b23ea85c0874d7d9970cb6821745a344947fd156886a835d39e89d5923717fc9c1f9ad37e782423f819e5fc3a829f7f5d2009d9c2a703e2f64ae0603764cffdf18597901f16881d51e59ab08bb47085b22cc32a8eed648a0a58aed49367cbb02c4cacfccacf185ef73dfabbeb2cf754fba94c752ef5a8b6bc5aa07d5bb5306e5c8bb6685469b24ea1e7b96d74289c5d9d53bf9c1c658fb9e224344e0164861cec3f6b1ef3584407c7605811888fb99e251c863e0a0b7ff34c58cd52bff74b802a759e8267ef0dbb6823da9595984ba10996a7ddd58f126660aa414d8645419164ffed8852cb98859c683d7e145ec93c123946f5db584f71c8bc0c1fbce4c7e84e6ea35f6e1fe0d04798604bff4f64a4b56d1b08238d0eb57f0352ddac8a89f7b302f9af9ad18917166438c8a4fbc767961dcc74bf0636868d8347ad5ff2db1a1130dba4dc5712b1c60b93ca3d9348fdc93a1792189e7a07a72a389744a6cdb4d2ee5a25ac426f1b67177be81b540faba454ddcf7a3a7f181401d169b9887afc443fffe860b108711f2030e27b4d2e06f393f18d13f2f845ca56b148c183a73afdaa16335da344426ab2b3bf2034da54e02e9b73ce48b80f32982a81f128607d41b1f57fbbd703fd99cf82ad23988240b8206167f7cce76e4331290e27087724c10539c5486dd3a8c6fd1e58c7f669a44df48fb7606aa56bb6dd8a63679f9ef74a301462dbcd7ace1771b9ccca1412e0394befd20696161abd4cce75d068599d6cc5466f0bdd0c6911824834340f8c02a65b40096edeb8112790878d7c4fdc0c46bf09b3edb786b9010ab13abc65633ce5bf3501116fee19e2c50392b4ab0d79f161805042422c571c31faff86944d5248400020cf97b20e42878ad36170977bc0cf1a941f524ce6070c28c8079cb434aaf0e9c290849691d4c19df2cc09e18c98495c7bee40396b29fcb9b1550941ec476461b675cd8f9e87dec9cb911a2bfd22cc4080bc74b9eb0ee8b2f559e07a038f83486a00ede77fa3153bc3531d05a2de27f60f7cb2eb81d611a467fe68d1db4d3d132761ec3306f234f89d04ef838e4364a30fcd56015384614438d624584f6b3f050437f1ee4f1d2f6351fe9c98c63bb448af0269696596096603a03f97c320bb562181116213df86e6a9d28e8bc7f8471ff93b9ffbc1fff82196d7224b2f3ec6638fef72bca8935ae47d4d43ba8b2c823a499a85207eaaa75cbda8e595e48af2bec60dff7e01dfe81a7859e432aaa9c579db0182a25282e8d22f39cb00fe54c234e00080cdd7fce73f90a2aec7528840d3912b42f881bc3980d080f22aecc743ea21c4a20b65a05e0918935bc3c7d90c4b69987b29eb8e0a3c540bee389a296641fd03be0eb19416a919565c8935ffefd5d6a4c2ad78434c941549badd75bd0aaccb9c79270489a852ce191ccfc1d0c9643d798f87058a3c4937fb55368a070962ddcb7eb6b3a8b913b4ace15f40973047b3ad07f227614f7a33999bdfb81aa97e2a5f2af456fc6398089ff39ea52c00ff0b49d38405ea6dc0605b6ae27ac8c1b63407e48826b4473372ee44f295556598f9540a2019247f2e2bc583bd193c24bcdade7898bd3860348274ee55c747e1ffcbe3e207a803dfa40197fc4aa7a8c913788ed175f00427fd8465b1200026f6a05c45dd81b2bdb3e03a68f78129f131ed91fd9126f0b532641a5a2d6e55b1d1c87a8e7e5ba8e77445f770b3c345a04ff73cb78e1d711d1d49c6fe3b8fa2786bd36f5f1ccce5c44c4585abeaaaa2a925d680e27131979597f8e816080a94d5d807f6d5758a703c5cbcf60890c892cda68fc4cc28d257ec94afb67ec502c405d815bf001c8bcc8dac087867a160474ecb7e15a1d1f98baf8bb4016a5132fea6ff0e2abae9258ed7ad35ffe05a63d481af66895b7f1c40290064274f904c501338ccfaa38113d19490f1c0502d5c2a9659810bbb008d096da31d4b6926b3a8f6f1b34ecb46c70acbd2c1339a106def86bd7ef16b92ce96527a25da7982d708d77e465fa4c2d0d99eb80b278f276ff3356f504550119667fbe023767a611a7b4c4610da6cf07b6c1f85a102a9deb7bc0030fd79bbefcd51dab3bcd9e83eae1c7153599f74467d31a9a7560ea835be53dbd6a10dda2b7b3b016d548fb1fd4eeacc0670e65892b3c44a97d311d5a0d81e00bce562153a542a9a0eb342f77de6bf120cc76a499ae9d9b28e0a670e4d019ceb5110ba2800350a33b6b713466ea653ced18ded938bde02a6d6872e081f3ec9786063e3423a87bcd28d01d062813a46d1660d5c72d9346a57e5c0b5c65ba68ec9b1aea25d37069c4bae9da451280c103e44c0490e5c7e332deb5b680a420b0beda011c6cb22fc5338ba6d498ac5bbc4fcb616ae778a67cd835958a6660e45fe5bb8cf933351e0974656e0d2cc1af7f9d1633bcddaa53240b1f4bcbad6d1cec99844a7a67333617b4ac7389b7951d33a5e53900f0f5a8865ccfc43c2028239f967eb9540a9543e09ebe8dd21a0455cafe4351166d9f1a8c5da247f793910c228daced4deefea65812cab583bce41ab227cf70ac652a9349b3b1e39c88379c848a540332041bd8999c1cdad039eb99bd5da5ccc5a3b7182234b2858bd1304f72d378ea8d29d7588c899f7bb8737c97330ef39fa4aed020b455d106d701d6ec18f237649816af345a54fad527a35f3da9acde7cca90c9695dd71d85f2b9291e067c525a48c1875fc9d2a0e1a01d891784a364cec49863d92e95ad64650665b7521100f74f45d8f1d85873b829edea28eb39929aaf51c97edb7ff84f45bac1e5d9877f825282c81708317f24e7fa8ef24410867c9952b00fb42eac58787b2c0d71262758b1955e950e19443d1038682f4c2758917e9ce39355f32178eaa372645b314c74e1c7bfc6b45d4c4bbc5677deeab0249b3754f8d825e5ecd6a2777264744dc5b53c33671c0c04f777eafd93b85b511e8d6eda2eb0d7455436a581989ecbc1a9e6b6fc01c4900b80851dc8acd21974b853616009f33863a8aeade9abc66f8ef426ee06c17d737a0f6bc9d27bae1f8f5677fa5172772e6cf2cec215c65fd030d77eaba1766486c63f05d0e37433970556eea16f956e0636a30a8a18ab0bb83de845491191f82d3d9b0756aa52a7a2c77f0fe668ac8bd2e07b73a8a0fec5f1ecece9cb4de79c43b0e3a284ab49d5649a887b25a159ae8609799f30c07e7f01fe73a26dd9a91428caaf0d18d1a38cfd5ce64eb3b68dd764514577d1ecf91f1a8b1e063d398994c895d0a7ea662ab0f658f01b73844d950e633ac189031c9dfe01fa72dfed84443db2dc996d8675fc614ca02495edb7cacaea90c70afcec5851e407f77bec396de11d0cd7ed7b735365914ee8ea94ec71d243053347cd2faf9140c29b203408c48be789db612fb0f95483d29edc164c3fe4e830bf44c232f3c155c54a52ec85a8a9087758b489fc14099b3048b482403a1dacd412715938f842d68272864175988698bfcdcce9032149b08545e16a6221926757005fa5375874dacc7795c2365fc6a9c4d65bed81db7d452d023a46c3d130adf1f5e446a7ef271fa5425e3f7816fb413e611612b172ff954277aa37637150c1e39226c0c1579a68b01dccd4db71df4670f3ae80e4e1465bcf1c0293472df1040b0fd246beec72fcc229b566dad34a0d21c469d75688e2cb3e36a39a7f7d86d98f292a93d401fb507b51e9c59dc5c8ea12b4a490faab5b20f14ad0a00bd083869a23e7f3d7d2e1207bb0c7df0c7d88caaf2ec6df68125fdb209069f85f83a642635501eb39d8743d5a9b797a15118167c1a9759b4e249a87b5f386515000d920a95dd288fd5948c5dcbafb410e5d3d583f39b3d7aa263aab7f10f8402b2cc18a1a8aba76c5d67807b33cf75c22ebd2b48c1e54de85b4ebcbdbd180e65cb194be7a914db55e6f4a8907dff6abcce5e7f7bf0eeeadc9dcc3144b969e58f3fb30ebf6079e62e1370d36915cc8a80f330a48d05c7a4a90af3e668325c0d68ed2c56d78c990175713ea670cfe386e1ff72df96ac8a97b1d0b0cee0210183a9bc584106a70067b2457a164f7f917ebc23667a1314f4c09fdc8ed19c2a32c59438b1148316ebb912429186c5b2b7bc8a1e976392a57e96aab63c0dca99e0bfae2adcb4dc2a1977238ef1fb14f4ba6f3be5491762421941eb3e3cdb47b3c591ccb5f7a7db82cf211626d88c0fe56236fcbb18f6289311e5241689f73b62aaae047fd99467e90775beef9a6503c4c803fad62e915a30ce3a4e0716a34efed0116baeccf673612c582ba80e8f4e31ed5bbd350a3680922b02aa711418ac59c3ebd54eafaf0f8002484f2aead856dd08c5fe522e6368302d5a3e0ca6c8c9853a695f44929116d2f66e6b724b995292324a092e091c0971474aee475eeffe813cd4c1a21abd8b1116e4b1c97b57bb6cf3ce12258a13f4b179318a8208295eb8fc308b98cb0f02f7c35d4da2050f683081d4021606126228092b50980006436ac4989d2732090a0a9221c62c832ef7a0e5323333730ff7c338576c01b3105109e3440bd79d5062e4c4174f3c01450e509891a58aebcfc3fdf89325ac1d1f5355b04505385cfe02703fdc2160cad6840ed7dffd691365ae7f8fdac40c62084969610732d8887db0eb100b217218c2891158a42106a4de869729ca5089a95f8504e07e3a9e0180cb3f00ca030d133d7cc0fd380c0458ac6061e3fac32a50099a24d1440ac238498209cc32822958ace4e0c50e4d9c0d275c989a07f7e33e001e4b6c59828dcb0f9770e1f27bc0fdf03f91822b3eb8fe3adc8f531fa2d4745043b8df16450a7850e28acb2f80ea039a1a0e7c7500259c5c7e7845cce57f713fec2a98e2854617f7d3115e91e2f20780fb612ac596c41249b471fd3738809638c5fd361434d1e3fa53149c71fd35a8082041d10986a0e2046a5cff1ceec73b1e681cc5cd739000e301c0fdb8143538312483108479e20f9380104ec4507102468b1862fe2ee93360268e8298e1242df7e321985eb8fd1ef389b9039e23da4002cce57f173f2cbafccffd70004430a60005b85f07455c0133a205235870040878c400cc162d38d062002f63ca9c4103d3545963032b51ac2499200b113d1091e5fafbd070fd4900325474fd85a0504494eb9f820a2ce888412e10c5f73002e8f14300d00b1c43021cae7b70dd880444257852823586c0e2fac37a7c8660e3fa9300444815125cff1c64604c08008fdc7f08c1458710634c89624a1295a2eb8fc3fdf801daf8f203882fb2086209214070fd5b29185184461a2e90e00445403ed41006164b4e9064c4c5d3f08054c2a185007646e005104b8c8088cb7f030a13a68efb695ee1dcfc8082cb2358f24394cb7ff350c4b0110116979fc5fd70c74341414120b0595101e607111c733f780642317e95c41c9ca4b9feee4fc15cffdaf550c6f5ff103071fd5d42d0e84995ebdf03e585ebef03858beb4f820f58ae3f10231fd25c378a920211d75f05232946d78d4410c4f58f424d78d0a2823e6a620fb8c549918afbe14e044d86e810d0020f678050b91fef10e064e5e37e383bccd0650731d7bfe3e1caf547bd7f5369b20577e27edadfc765fe2a860e43979feba448516d59ce5c7e8d071c4c39c4a02761aabbbb7b3708c65cfeec0059d4cf7bdc6f858399ebefee20a0d2f99310bfb10471c475eebabbbbab796a6575a9df8f08a56371430e97b530ba418ccb5f7160e2f27bf70311ac864759983a0f4a5c3f5df75f40107777df76e0ed005c366202e532cbb80012402d220535cf11d46f4cbaff4a12f4416f5b0982faed8fd4d78aaed4d7fe04d46fefc35acad3e0494ce51989432f6461410c099f91266685ab0003890bab0003882a2eace20b2d6e2cc33bb4fd7784a90d7dacc199015ffd9fdc54aa4fa9ac157eb71109ea5451f9bfda02c23dbc414eff73fafe12bff4abc7dceeb9cde4b3f85d576bd7d58ad4af6ec0fc0006baeb76087d773dadbc637af76f994cb6e580faaa3f01f5297b24f5a857d92347545f4d36aabcf8959e9a5e73efebee5394d7f24f3d8c554f7bd49fb07dca1ea9bf3dca1eb112a4fef64750af3d8cb9add4a31f3d7a31d05d93fd52b8254ba4bbd17653805ffddd11a9cdc032daa3bced4f9e8fc779b05f3408094669adf5caed4fa1421ff1fb2f506b859149bc8109f411a39328021849e094eb164cc2f4bb3bc718638c31c61823dc6a841042083f070787225dbf79f81fbdacffba53bdb12ee443fdea570fa17aa8f69050bb14e8035261d64038533924910c1f8c902156df4834834c0c498e2662d55ac9feeb3e9852516ff35a6fd3651a7ef9c397fed37d4bc33f41d79dd15c20b0fb4593c9f4276bc48ac906b1799535a27a9b37727ad403c554efa587f0e794aa13ec17adf9d3bbd0c95a3169a6292720414ef6fbc580166abcf5597f7ad57f5dcb01f54f7f42fd933d81f52a0bbb3eeb7d58fbec9b45f4ab728d6ff670fddb23327d165d7fb9460f91a7e907a60cd7e70dd7eb74328d9825b8fe30ce1f5cc89b401d8fa9b8d4d31bb11204f5aa3762c44a90d4a37ef5475478953502eb178eafb14780a4ac4fbf72a05489047da8aebf4c823eb6eb2fd3f00e7fdbaf6713aec2ae95112b4154bf7a23359f527deb6ffc076bddb03108e946100e6b0527865a9ff535bffaee6ffe83443716857e118114070043bdd1fde9743ad9a093941bdfd978f3a81b9683b800fedd9fde83246a1097ce0e492102658d58f9a6a01ef5288be4483cfaee4f3612f5cb5f22f10e77d60affcd9ffe8b445c6eecc94632fd3a3dea6dbc29360f3909541b1b64453e929815965f5d301f722acc2ef43995ef9dfbd91e843395ebeed3e6d8428b803195b39fac725dfe30236ede647912a9caa455ad35b6ebfe551609e947b3930abbfc7760d9c144edff9adba182daeff2efa1e6e1a17ef9535a2b0f85a95beac7439d847786cc37bdbf46330b7927fb2199853c84df14b908df21f3f9330bd935843353bc31b2f7b90990d3b0cb7f7af0b20793dc16eaa1ebdf32401ee7e2e32117e2a1eb3dc4d6c9401d176a9e18f387c1a87893ebcee43a15a6c2d20ccb3356966197bf0f17d44f96b92e852a95eb3f8ba08ebfa4224920a97cb288eb520927aebf14a2d14aa13b85fa25b44934ec7294ffc983fd4aada0ca242b91d8158216f5e32af5bd162761727d0a5d7ffe78bff9e4ba44ea972f51a33fbf4492481fed088043dd2edb8f01fcd2b64c904055a46520d8e55224d2f59f41fe53c85f22f9cb247fae42914e4026d62006f17edfdfc1ea7c86d1f60b899b4c0b3b1bedc71c9158280dc320872930887534834cac23528f88d44144cac1417524d2e22352d3aeedded644fd20d2ab007dc822e8630ac8c353c0573f175c8411861966ac105788f783481109eaf4bbe522a8e3416650850061d7579b674eab01f8eabfd1a52a445221224533be8814919a69193731ccd69cdedddddddddd3d5df677774b29a5fc96ddddd26567e646862a5b52b62562666666666696edfccccceeeefe4c00145415155d535abfaeb9bf88f173a0bc0bfaa837fe0bfad09e59833a91077631e4eae163f442929e1b63ec18bf214e6c41af32e87957ec862f658c0c42171a092565b9d0480889cb44bcc3a88e73ba070d30438546335cb9f01acd40e542a318d2dc0b8d646872e929fbeecd28888627d285883e6612239214daaaabeacccdfde074eca2a72e483d0313186c73b82bc480b191515b171a89d9f20131469486a8a90b8dc488400931395c21a686fbc160493a982075eac551df50e719656a290c8e4ca55cc82eea1403e33055d820af4851711c31cfa89c1013892828172abdd0280c0fda0a6a76a151182659669a55505a2bcdb1a295890c39e0e81284b3840d1a6e7069d25a4206934e0b293860748b1b580fac474f982b61886e540a5bb2e5061b5ae956af40ba22a9ab5898b0bc10dd2c3942865516646c96046143cd9822d61228422a2d92564b62d8217574a5e60c1d6a972b2a3068408969920263c3694c93aa0507ce0bca062b3d6c47412718b521043868b01e588f9e228edab04489c98aa4cd86166a287531a3a941b1a06282d12f9864b01e588f1e3039f00b3ee117050304bfe02d7559dc30c514512d36482cc8644b287111b2109a306a021156204504357c71222402972b463528a9818631c3010a665086d650b72f4d549b27e6125535a425551c174e216607d982aa5d3885181a4a59d49a24ca447534dc08aa490cd3509d654e6bd493164595e54409057565a5648514d396304b6008d3825644e5d298662a8bcc76a676459a13b5e6045c927a9ac2a1a9251f4e69aa74d2e4861945a5174e01468612143575e1145f929aa8f3c229be9c71e3733e54d385537c31b3a9e04b19a2319afcf89d8f1a7960e4c0f6bbbb3b0a85ca61577c54d7d58a32c5d78d5e8966d351b0469e22d489afa16a85577c255d1712792c719c9ba4a7a879dca4da864365bab0d8ce37be89aa70748e94ec87d071228ef34bbbd97074da8d0ddeb061ad6cfaf430a6b56c705839563a6a62e94b1e7d1ddc4fff6fdc02802efd8d3321460f66f4bdad614308bd4b3f65a49e7ff4e0cd3ccdf3f647012047832d6eb06901d85cd6fb1d3a2c079b338c75b0519dcd3d80aff1d8720060bdcf912793a78a016f7035b80c80cb3936479b19dda2e7828dd037c22e9ac954a2d936a5949bd147a85363a3fc0461bbbb3be7ff3b7a8310c2eeee86ad7d104208b3f7628976b4d4652677ef7c42b8b5735b9f5ccaae6314841092e0ee6e63771fb3f7eeeef7e9354c9d6a2b8d16b9b77aa35b21a9ab79749494a739b3528ab723d9de9ed1ad7b484608d54a900c12843e4c5a2c7d20e41fb66c97edda465db6cbdeb8acba6c97cd9d661592eaf82b229c0df2c0fac542d8e5cee92053e3b36c97ed29c803833d7fa9efb2552440efc64ddd0c66210fe5a00ee0f3716185358f102aa11d41ee90a2c6e7fa45884d99b8e409816484b0cb85f00e4c9d8408813e208e20b42fbaaed6be45efef8aefb7add01a215eff960362aca75fa9abcd8c524a4b54d3b46d8bdee97442a150758b5e8a48ce8daabeaa9a2d7a7eb5d56ab5626d2cae052d10b7b7e3fde2b746e8e8fd1d70e6c81688b775f54bbbd14c3737259addcc1b240cc49c15a1c19caf429c1899ca0d47f70d975d8c32decc2ddb705ee8680907068e50a76e5b780fbba0cf1a95af1de38a6d4333165d956a4c5b37003abb3ab56d10faa85ca4b4eb3e8a426d9073dbdf55fb412a1f720cd87187c8d309c56d29083595a9666375f1152bb3e936c8415881a8f19b48ceb3ba40d96d0fa14e971df8eeedecc2c1ad8d469c6d4711cb4bcc01001eb4f8a97c4218980aa9a0e1880a1a88ee47a9a0810a15338cb9fc39946b01313dbc413828a67d65d51dd23f3f0ad198e94b5e12187a62264b5f88c6345bca4c9e504facf49a9704061a2bbd504fccf49ac93d8deb13a3ba72aa55fcf5e69e56da4c251befe6d5c91b905db185e33a56ec422a738bb07ffc2fd7b7dc227cbbedb30be6c89183b5e3a6a276fc06e19b6e299b777a560300c0f77ff73e86d0618e0671830d06c0b541de797110c315016c3a1b057258d7bb72ebefd7da93b0bdbece97e5a9a7a7e9703ff3e3bcf2b6b3cb7f7abb072e18073b740860831c84d0d3c0079b4e433ba475e4a8745acd830d72f333af64f2b22f795403dd9dafc136f73e79fb35d816b906647703280d6477da21d2d2ec3b40bf5ec8b59c6b79f6385ccb2d106a61b71d402907ec86182d39d025a59017e2aa499b192df9863aa5dca547cd46a8c3482e7f347d49bae4eee9f19dfed20397e5e569511ec7505e8ca5bc085f329581d46d88f22d42cfc0e58fec9bb4d14d3c81d0c2aa29424b0ff1d025a9a400cd660ce3a9a1c5738196232d33609c9b66ce18a507e49437ee9c534e9fee7577ce295d06315823c62c8b47493050238d2dda18a39618a3162d6862ec8e5d5cca18b32c1ec59865f1080d13971c9757ee8192eb7663d790d6f5cec131b275374f81ddf8c868bb9cdce3a3953cbe1a2ade660ba18b39fa70a9f4dc00e8c5a596b275764196534a29a594523674b9116fcb791cd3509c1763a8533bc3e66231b67910568630c63c81286736ac1ad56a656758b51bf11faa6c843acb7e143e9e4145316f778c560551448e42681032fd6e28633b4fa12c2e356e6162468d38b7bbbb3715528d38628cedf2c6ec2e84d15565a8c8508d615a01519d51bd4025862a8c137763991863acd1164082b6325de71d11a280d047e9d2322eb77163f8bc0cc0176760471465642a3337e4a5d0470fbb38da1f5067c71510faf056bbfe71f8c2e6914ff9595c726c2a30746839b412f420a3f2a76e7c0514a0871a3f2323723f70857321152d6cb98cead1457cc2458d5f73a1d1972a3e7a85f0a2c287466074808179e1d60b8dbea471cb5417d4af92b9aa2eea07c928a951f400a372579a75a1d19711bc502f34faa2830c380a55234d49081938c99286ba8cb3c3c87272b22530f0b67ab2d515bb6050fb42a32f4a8cbe08e53cf11e3d3f745c7aa1d19720197c7997c2472f6c4c141414948395131a540e593ca22256895be2c3484606379689a6245a6c42c68d4f98af3016cef271114c0a1aba12cddc8874e3438ee338228efb71398e7b68c3e5de39232f5c2e97c50d97e3fea35cee5d596c71b98741b9dcf768c182cbbd8f94cb19ad808bcbfdc6fd707fb7d7b89f4dd370b422ad4853699aa63ddca283ab3dad5d64b8da775db0b8dabfab4b0baef6b0295733baa28cab69587ce06a58ace06a6fe27e340ebaa62f713fa652a9542a7181e2968e60b8252e2edcd253eea7f4542e08562c21a54c37b2e20639afc3f6d14fb413dda56fba6196037cd06542e88ea27ba75b0a2eb7fbe919b7b554b9ad858cdbef2a22e2f6c3a608bafd3d3e3cdc7e12a638bafd408c6cb8fd428c5470fb5370e1f6abc002154d04b920b4c50a2649ae511553dc7e96e205888b29193c4853d99d27fddbce92fad1b6d09fbd224d8208d6875d31484d338201f8e50e811edb0f888a07686acb8446f2e5b6fdd11fe916ba80666f7af2a747c4dd1b6e81e44ad0747b93c03bdf0fb63bad0abd54113c0bf02bbef4e8859cb428a490a86c49f06157084eeaf7a3c7ced7c3022948293b676a7c98068d5e787223d700f8f03b5aa0c349c12d0a9d0338e6d32f20b50815584021850e200a432914310a1a8a31c6c8d1470448a4020b28a4d001ef44224e22ddf82b70215a228aa431bcf80126e9f0830e49e4908505451a70a9053013619c5ffaf8d09365e4192d6a07350fb52d26c3669e6dcb01f44d7f42f69a3d328f5809323ffb23a5a75996d9a0cc223902ebec4db6c6ec9c3fe74f8b24fb2331287e127f61d79b7efe577d9a08faf19b8f01d39d32ed1114da6481f4cbf42af48b08faf33f8894592bf0b537fdf75c341b990411518af13fb8a19a1e3a418699ebc52176c5f831c258f65f243a01a6a1e5053004c5322f7e69411b8fe2a75660f2a2991f6954ff2f9af15a276453c33114a9085222cbf4500b2fb81f9f21a2c20518626428cbc4976678c7d380f0c80c323fb32d20d903c5326be40892cc4c8c7ef6251b93fa1533333118a336283313cb6c8b8562cc242639f145fd98cc3d02c2455c02bec865d815bf093f61573463990c37f9e29d323fd6221eea571c6a7593619e18258877e48ddf4a78074ec106991bbf28871b936eec243736c3a22a377e6cb1147601c15be2331227311936c35578d0a810e94200a4841c48ea21b782ff8f7c1fcee6d3d44993af797cdd8bb70a254ab69c20e84e2549eebcb3034d83a6d4048e30e3a9091c51fac8fea847d90ff56ea1fdbe046e7bce4276710f7439fbb95a259c4e36a784faa73fd9eff4d576c02e7f2020ad201c533dc754d6089258d72f7823ca1b421f05ef10d453d4c98377d328bb500980577bce6b69cffda4bc1c7ecdd7bc04c02bedb36bce69b238251b3f7b39e72481fea4937f7e37e79cf3f97d66d9534a33784497643f3dbae1740f236101d055a9091c41e6c2feffffa316e3e3c644f583d5efe197df6cbd1ef153ca5f742989b0cb4b106f94724474e1858f020198a8ac0b23177ff24f4e8670458dfd85d63ae10812eee3c3d8e6b54ee02348a01431ce5a293d3f8c65be71fc34fbe9956ccb8459faf9f0669e09a59f34cbfeaf4328b99face46d34358123906ef6262b01234a11008a6d59c7afade4cd5fb12bcbb1525dcfae109ea8dee26c109422d63a818d6c2088183f8c6d36e847089c00116b9d108dac00460e4c627104b72d7f785b6e57f0a6c0d487f5f7f47fbfaba71308ff2fdc69f117e10a4aed6c084fd4b62df639219cd0022930f5ef571d080a19463cc4e003166c9c89c535b82851638a175b8090818d2cc4840102242f9240012b010c7a78010d1896882206eb3040b12881ece797b2a7d648f64031936d4ddb7240f6f483644f7f4e1b847ec91a313db5adf9f461cc88112b414a6f32fd03a0c9f4268be488e94b16766b5a2031a018502c2e81418aa0d8f6daf74b80cb662540442d51afa75f8d83a652805d3c2098513f38664ec8cd77799d2119676f620543789941ca104120519d785923053820c1059410b0ae0c412db2051aaec060abb245b199125570cccc5a5809222994d00245041216106f44b972bfee884bc30b16405c015ce8858a2433674ab0483ac3d2a8633a0209f25afc5256ab7b7478263e920924b94190441b2dc5951a4e4f34a9d2372e34da22ca5d5d68b4050d3354941007b1803a21a38613b411031744c112e3200917c2b0c086a018b6c4f85d2c3fd0635c3efa01cb659bcbcccc38b2e2dce882ee3cc689db4607c0424c1997dfd937ef629b73dbe42619885a2ffbd76c7a944780fae18739d1835e8e747d7fcec3efefe073e6c7187f468f083cba449c032dda8293655996659bc6caa8901c3f45878e1c16498ecff15a8e1c14c0a142e90d2af3ccd3b802668a1043c8f04417b13290d842c90e2160e24c18b1d3434a05d2960753d0b14d938d524a29a594729b0ddd6ce446374a6d6c361b1b6a4385b6adab545249b70d9a6184155c76384207a32ec24841932a289001982bd288a1b64a85e8b6d1a774cba6bcc136586ac6d99683c5fa2ccbb22ccb368d95d5785178ed59bff9cd6b0f6fec47efcda79c6e75d565dadf78f0a63c0db07059acf7e19becb2debd968e9fb2e3b54ccb3216eb35df34d6fbf00e4f8745a2e375bca643870db292f9bb25d2976501568e6ddb726c597625fb6c35e594d5f435af69a9ba62f98ddbb86734bbb16165d90d0af5fd59c67296b39c65bfecb777fb657f937dea7ddac6437d7693ba49a95ee3ea0d2af3ccb3afb72b8f8fa1314aa440e38532607051841832bea0228b2ebc889db28a83e3b2d28deec686e5d97b663f2235ac4cd3344db371968ddb21356f7ae746a8c9b2f7e19a2ccbb2c751cafe467763c3ca6ccdfb7c95a700a09baa285682059a3c2f6594d2ec4ab653772ace674f214febb3cc3d8ae3412f27061ddb24e1fdd9f3c76e6f6f6fef2e38bda3e344fdb6d5fc86d07d9535fdf953da2f7fa503b97b8f9c72cae9fa7ebd0c03f510762a29dfe629a594d247726d9e76325e9bef3cf863a3dd787c391c1b4be953aac2a51ff472b9df72a0d424e863c76dfa2cd4cdaa2d155e9bdfdee639effea67b95d3adae3a4ab7ef3c78559e0658b836ff01751ebc379e06b26bf35a53fad0e6a1cd6bbe6d364148bca1258262395ecbe169910b92c30659a1f2a525d2f7b3f90d005dd9001b9c971603a64b6dbdf1a0769b5dbdfac1af7eceeb61570bdda434464680a2c62025d7159360525252cca87e45e4cd796a71d8d5ac6ca5fa78050bbb3a5e083b7a93d438d4cba109f89ca4e6895be0ab9f76f6a3f5c67ef5dad8afbb455baeb0ab190b52cd0c35a239c3ae33b7abbf53bf6f6e9e521b69236dfeeb6cec479f7b693ffadd476e04faaaf7e91baf3ee57e3ad5abfea7e6352ef55adcba9a4439286989fac52d9a4f52fd62d207936af8628d13840923a6210309314abe38020b1a2f62a8d67f94c7f5f10a0b4d71fc576ffcd775fffdcd7f2e9bff603d4eed4764f5cefdd8487a23dfe646da21abd7deb91156aff9acbccfd53c22704f37fd96cb84c37ef586fd3afa9dfd9efe8db5b1d4ae5ef6b03c78575ef6359e0280aeaa7ecaabac044bf69af711e9e998865d2cf0abbfc41363cd42c94b9da91c1493d8d5af1383231e9af4f7fc784a9354fecf6ff08d970cf66c8d29071fbd1fbd6c3f1d08dce9f0457d186e971629d118279d31c6186784979a90ddec21cda2d7347566e1520c4a5e8699cb6029be6023045f703063a60bb8858ad11156684983650c1698b44431a3922ea88eae3606f582470ff27e0f75a66cf0a4875d48748d98ab44b74977b982eb0275991d507445f8ce0f726c363d215007ca771da5cdcdcdcd4564123768d2dc222c668c56577df020db614cdd0f529080243d58625777a7dd038594914190ed914fdf91ec9221c017bbc2768b48a6c2dde3468bba63e4b97219e58a7adffb8c3146292716aa256caec65b0b88fc00dc9bab35643e7d40773e4f6f2156f76cba7774dbb654bab47421e7c35ee976fd9a8fe39aa6bda2d1a75904728e57bcfc6ddbaa9711a37bc32f9c3db59fffb47593eeeed265367b4e29a5b767ee524eb700bbe8959f1a3a1c10d4705d9a6deed94633a7966636e7b62592736168f00e2f60fd9af23b309f8703d7747d00ee8f3280ae8c30062c824541388f26cdba45e46d2e0ee083d488f88c3189ac6294dbcab4956a9c1bd75fbbd98f73254b890be14983882b127189207a4fe946b9f3a6efdd8fe2b08b152046bd918a728479fbc744693f223e63d4fe95474b6485468cf15691b408df9eb283c834820bdc5a51bfeda5bc45fcc6e8420e1fbc04c9bab2e84276adb0ba45e46d3111bbe217311050670cf9dbb6d528dde775ee147401c0f403dda0563fec726116770af78e55f00f62eae79b4713a84fbfbe9e1bbf56f6f14ad9f45597ef4faf933d95c57077a72bee6e2addbd95e8184465ddae0f758c40230d7ec2694aba64f93838add27e410e480f6c00ff5a3dec8a40e4f3dcacbd1d24710da6d45b6bd74003d74083abc1951a6870bd735c6749c8d3c19d1e8fdcceddc0014c8657458cd1efe70f682f3ec063f27db851578b1cf934659e1063d31a396205ce991b382b1f5156b05f91be4da4034567f33b90f9f4e916486667ed1de2163bb6fb97bad17a8ca99bba945d1befa452d779476a716bf5abee002ad46932dd3de79cf32b70ddbbf3b9ebe69c938978d7b72b2d11af52bf72abd4f8905d343eb54c69d741ca945d5c82e66143cd96ba39ed9d5b645e8f3f8e882c84fd5aa6d2d7a2ef5de8c4fd5aadecf9da1befd79af2e32dddafe5adfe9b1b4213377e846204eac4cf3c11a04efce9fd6057e52deeee1edd9d05abe829ed27ddd22534ca3bb4a268e6d1c85e44bbd11a2d11f2f4f42bbedb1610f907b8a71b848c31c68e63b45166724ab9ba6ebbcaae2613999d99995a4abb8eb9f24bcb30ee96cefc0dc59dc6e8823af17794787b59e414c099dbbe33a83d79e4470b9925333fd489118bef927b4efb8583d55e8deaf60d103ab3ba54dea0f39cb4e795ed35153d43cb5061083ec6e8456a3996b229b9851833d489cf84f3e0a17689cb680f779c9b9b282828088818fc9844a3bc132190476e815f377e0d166e75cb3f5eefbea04ea450074d00b6a89fbb6e5b22ab0b04051ba0d9408d0afb0565ca4da2ea8a6777749f93274f7e76459e527ab31af2b7ad6b5b3963cc7a964a51ce2ccb4a93cef9546699cce4fce2751ae591ffb6c58eeed3a57ff2464b398dce86b66c65bb92fe27a594963ef5ba3f52da7532524aa9dcb1621984ddfd4a0fc802e011d0955e26dcaacc7af6ec99c196525a8dfe45e1667fa7f775f0370767b55599b54af81c66b9d212d9ae0f337271e1379a6797db15bbfcfd6b3689442edccc7f84ef8f637eedc7990a10a37ebf51e9de3f6167a2fad1bbf5bbfde2537671dc28f36bb44e4ef22ee76799cff9f27db8446d97e84ffb65efb6b3eca52d5114567f33e8ceae55f6df9679366dab841556d6b5e4c6eb3d19895d70da15fc15f470fc42f81d0e8ffbe1b0ab7b98a0aaeeb7ba90a5f414f882f7a325b04104e4016f096c44812f782154dd5587035737c6b8b2ecea8f085cd55587d3d2e19143e1209451bfed7dbbee1b6cc57356fe20fe5f777b77a594b46bc3b7bec9227ea56d202134ca3b10c27a6a4bfeaea3f4998b8870e573634d95fa6dd7a357641699dec5497a5ebc5b15f5f3dbd486583f9f2ee41cd0b1f935b6604e683f98a9f4528b5b45bd0f9b28edba492d914904f6ad026fd9ffb96f91479492a594d2bdbd5e9616ca156c6e11d946fc2c7df2e3b745bb6217cbd59c3fffdb66c9db31cd529dfd3c29fd4957de66022a324fd9a538b7b8bbbb7777b7749a75dfc02472fecd25806f7f0a9e820a2cc4a0281495d48f4d9c886d3fd865087964768578bf9cab79d1552a651fbba23cd8919b02b9d488c37551544e02ad13626cfb18dbacd0163bbd90c7926c0f038d45f841e9392fc6980be2b19385c105546c7b8e9590fc703f40360be107a5f7611bb5d23fd1c4cd4a804f44e64a804e90d0d353faa21297bec425fab3b3a7efc3a5f9733abba67575c02e6e9b0375ea0f3926a6566810da5ca8634a2999e3eace6e13bdd29a4adfbcf0fb8bc6fc2d3f7a5bca92f20e3333ff0e36d2749ca8f1999999992d05621198c794cdd21351a24a64017e310a57eac62aea5856d429ae7e595163504f9930f2c8feb317f62b9b12caffa8e97eb5c610220fe6fbd51b4380979d8b1d37a8d44e870063da94d477901484667a00b7ba87c3b4d4de771d4e7d21cd83822f8fcfcefe5ff4525e430dbadc5168d4bbfd6250e961d36f6e04d447fb7d5b865fbe08898f13ed730fab59a55e9ab48770e36a3e06417bb294e338c9711cc77de6cdaf9ebf4fa3bc69a7a4de3d1ffe0ec72d072202da686d429aa783c5103a981cedb6cabdf43410db68a30d36ee57e4ba1dc23df7f2511ebc29baa1b6efc7ed01eb203e1f71e43cf9ef96fbda75b5babb7f31e8f45f774ba7ffea2d9d36cd74fa527b15f53edc3edc4e6b334fee07f5ed5576b5ddbcafbb2ea7a4ccb00ba6acf3cb1f85b21fbd2f3ee7cdcd7e54b35f35d9af2bd9ef5d10d2a72ffd67edf83f8b481310c0012f5e14afaed0600e0b3b5fd40f926140a3b1a8a4acf854412a95a11900000010009315002020100c874482c17834cd4339660f14800f6f8e427a54994b646114c32808828c41c618038001001063c04c154d1542a2d2d422b16043144db3485f36e78a12442dd5d9c8f02f39f29f1c02897cbedfe5d64f413bb7b1148d5baf93997139648d242b0671149fc165aa31ec0b921b73927c061b546671bcf81b8b52c38b915d5a6d24077b03189e6de2965caa5a64de59a543edfcf3a0fbc502d42d46e941d3b36be5393caf5b5a794640ce9e6823d4de1e7dda304566e520d03038aebbfd93c9eb7c9d57cdc521881026e800dba9596edf40d821fded2f3345c828d55b1d0295d5a31a8512013a533ce9152e7a3b6ed8915027d589ea13185565c04b344073b496bb02465d710d6326c753f9c525e542070775b9f53ddda10f8e710d5933d7e08731dbeba2537a77179a495d83d75bf2dfdc61015e101a92f15210d58b4bd75d5b28a5e0173763bbb35944c5ed0f70ed12af84568c66ddbfe3911331b5c8134ee8c0af49061063e3ef2547f23f5036d5223c8379b6bc5f6de2a673ca39b68cebf887cbec5e895d8791cd07567c46a4d15732b61ac0e2796321bdf1c79add770e57c9e65a717fd437b3cbb5ef8db9e39968c5cf09646cce677214efcdbfca36e7b28aed08def41697fb398879d67e2ba0c52ccd796c132bc330e3cb8eabf14200c6e3a72024b4ccf16caf080bd780aa84b54e5d7df803f1a85a75fba3727fd67ed1b0be6a5948ae0eaa6ce52f999df93426f76ad656c32c7a8a918e1536998aa994c8f7f5a4f916654a2c02b179f904ab1539617d8b51e4efa082bb0dbacf394c0a56c0f84e6104846788d744f32aedb351eae647c3959317cb5f1a9fb6afbc79e42790af1b28507c213afeda1fd7985073e60ac8e816dc52d78baeecf54311032959d1e4443698e951d580b2865a352d51d6a98dba1845196a6d8089fde2ab89f7d6edc9417b13b9edd384e1d61095f5d76695c2a29e6c39182e501102392f2bef011968bff8f18662e190e00a00947f692da85000ef2413deae56b916dee5f5ea196dabd1d65f57f8e303a390e9116d5ecd8fe4297a7e14cd6837c11f832bcd16a7392e3ab2307538d85d69f63ff505447180a95f9d336567a54192ccbcadad83f212ba20c6b2c1ba0574a951d9b48806ab2618d4871cd194ad51b4c3bb7bc3c7991bcafa9eafe1d15d8fd24fac5507e16fcab498c28f393ca2cdd56905b53ad07c0175a3e9e0121df77e1592e2ab6d2ce0a29aad09ae000d3f5cc2bdfeaa35fed7e9bbad746901446f62d98920e31736d33da6f96a2fc37a694cabecf0e5bdfad281ab5fc3c88a8a93decc3eeb87ea852e0d5f4293e4847f19e49cdada3b3d23bd8a9fc99bf3cd11811d421efbf1dffe96e751bd02952f14b8fbd8ec42ca2bf82537af838f5e8f00d583be7e4d7b5c760fd2b2a0805079537a65ff7d35d8a8e68511b85107912649fd7727757fdd50f33afcd305e3f1ab50561e6a6de926e858ae529dae024395a2abbe821607339ca929339f8b2ae451668ba54b8cbaee67a6a3d9c0b8bb9de385aa4d17506214393c20cf509b01f8ac0c0198c5756b5814ba6d9132b83c0e57767f4eee3a53f87db2bc48e7270677de8d3a83ebb778c3100def9b69059ddb05fe5cb1f0060961aec6117ca885f10ac975b45a19a450c1852634a5957053c401e0d1772d02812b6a235aea4e32f1b25b929042ca3252d129e0cfcaacfa8bf65a8bdb95bcce106d4e6b8aa36700d0e6a62103d01ac6a8924201d9e97d4c3af0e056a01b2b9bcf0140729d37f61c80b37a4d7eacc9e4e7ae092d22f4566bb48e5ea656b859b1ebefc73e4247cd90aa1236358c880e2d9ab8983521e54b0a5a4684653a26a081cb939db7d64350a5b93246758df5c1efb84c9217e423a017fb365d831276f5a4eb8211ec96c4ba8d20b4b3a5cc2e7f15a3a90f25f4d52d95a59bd23c90d3ece29995b15640b565b4567e8409f2bc3ba9c5c2836c5089636c599e1d583637308b173c5f404b9eae9af600d7406816eadc68d0ebb61311471755a76322ad110844fcf566440d242e777a289b78b09a6d85ea8dd7992f8bf1b7f42d94927882b8ea4a621dcda31ac48cc0778184f5f02d9b3355cbd22caa474623c19a24bca2f3805e923477a35dfe6a4a364787306180cd14f4e07f406cef456b33d116bf4041ceb212bba5ae7f5974590150c1b975f77a822f57d291b46ad1a79fce9645afe365845e103062196dba41a3edc7c71a40c90b49eb4428397ed1833b33f81e96d36c6e83c4cb37c3774944b2c103125757a5d6f2fb055cbdbdbb7ecf0b4694481644d44d0193ef9fc3ebd82604427cfb5092928a823d6a47695c9905263b2accbdb66e0eee57cb5ffeb4ade8e207fef4d0c5c5d6f903d2af2431d06ea4076a9567c8618b2bf55522907a02809e92c20624abd945bb6a750245af02b86298ce772ba29e94404f06fb237e5e6be7f70a03c128bfd56e28bd567b69d2702633610cf3254dc4d8e5319278e7b1bb3d32c5e658cd656cb63f5ef9ea26aead82983088c024293d5de29679e05578d981761f30a5ec9c96ac6920453454b6869206babcae8dfdafadd48d883e74ede57e640890ddbdcd454f45ca0b934fc7d84f9e2fec1efa9964406a678adfc3dee572064800bad0611e504be11d443319c49f63fd5023bf127883314d61cca391e1941f32b5328d9102d2c8860aa75d9b0d47d71ea0521c8d4b2929d10206fb01e367e42806acd3564fcc4c089b0cfd823b42dcd46d2afbf3e7971d7400ac9777242a0b6e1124de8a95be84ce6b29c09787c733588e57e6ada5a89c1bcd4f2e0b7a2a054b3371778f19446fc04afae742af492671b8b357eb426fb628a729799f60979a617fe401cf6671fd711a68253fd49a9d3ae0c32c5a7cd2721c2fa78279cd313d441802b213ab43d3ab45646831b5ee4edf0296d583c0c2803b90062a9135571c4e04240692fdd161484fec332a35f0a42a83321398a94b411aaae3c08f3480c394fd3b1e03a75686c05df1ad13e2741c5b9eefdc53f11b0e48097a5a2282390655f2fbb8a41b82a8f24d0f530595790447fa5334f413eb46b32e6438cd6f206c328512202caa37ed6613700dda64a9b22c6afece62cc230ed9a743b287e2e5ab10ae6d4a5481fbe63c6747808bb8042a42aba4c9515aa740f541178c363c59eb360fe89bbdd5113474fc461ecdd808f064bea89b5728c7bb6cdcd71cb59cb8e0007404adb807748b154a938bb60cc20170570f0d6ac6c990bc8982d1cd7072395e4cbe8156b4c9b9614847958a2f9752bc08ae33a186c18eb7224d60d1fe61588df45301e2ee36024ac174f705a6f92fb1c34bd3000cc05770f0bcec1b3173a1df5d97f357698e89cf8558c7e71dedf75e7707d8805f931361c4694ca6f36696dc16b12e9afba0c00becb1ecbb2a1878cdc614e4ec05832164b3f2c939a1e1f0d1f0f166873a4358d5c850111c3ca44d38d33fbff82420a6a1a93183a3f147daed21db06d9f018de03a1468626bf488b5a2401071f98d3cbccf0d349f798fe18a854abe0b2fed62ed66ae1da4109b0b3fc3c6f4ba17aeffafcb47cd7169742659e225f5bf0cfb3a2d8d9d83ffa604a530e1e56c2d5d3ddb6c318054d12f9b354d82895cf30a9fda7976d76d95da3328f266b39ab9d028d7b979bef243652e4fa84d639fc8bef40c533d83c8c68ba81c705468ef301c964c5ff5a42aa5d05061bf94c7802fcb5fd1ae9ab16cb168ac235f5593621a20a52d09196dd43c4637f86d361479272d1f30d5f1121ae573bb1f8ffbf1ee816ebab59d5963b8dd5d16a1a2915de3fc847d565785ddeac7c2ce0079b8dc40ee1caa949dbca9041c96afd41c8adccc07167b3db6c85950f7ccacea8192d058261f3d78e6df16c329e26e782a5f13f9f840971035856a433f2b81159f8f9b4ab4b698989cc7526a316f9c151fd441299f7fa85254a87549c3a02c12f7e9335695a14f1344ea026f396df2a310c4d17140ce8ae720de52b4ced173d2b75d7bf7a334a4f7357f11e72cfd970a8d33153648011855ad25569bcfff427b287e15c172c02f8d2eb86861e32099ac58f9bc6957828af0ebedc498751e5a401156b4b0a00d46860beff6f54342cbafbbd581dc82ba25b9d93927e3c6220b07b8173806d6c268d231b7473a00c24143e0cf86bf5682aec8e28ae38e6b3a003022f97c31e9871f4e2d6a8aa698700464c991caf78fdf5015035679c0a78f0fbe77981a610398bfc912ed8594045881705852bc38d674a28f9d5709f6632e86c5f1a403a593ac10d65f14b4fe17f58e9c364700653a5896a4e4dee90c2bc43fc3584eb05153910ba57636189f024f3542abd8cb2f73ac48bfd4aa89ec5786784754e49d3a10b47576e23fd4ee5864ebc13a25ce02200c05f09680e17b13f9190fd1e2e1440c3e74a17eb520f0be51f610137384f317ace976b1400906e0547b848df84fa927071ccf8eae68e234c195556eb75d80c0a6b066592733537af192cc513ae93c87faf9f3111ff58a561d94851b506ab355ad3afd726fcb3b1d898b6b433b931111122d78580e96845e4346a1a0dfd4d932496e1594d9ec178936f1720f9bf5950e4eaf3b89dad4e31000a6a079117dc0a31dc5ed974572de37f64037f763083899b1bf2a46b215601acb07c22b28cb577abdfb73b2ddd87bab10794c6174e07954104d354eb80213f928559b12ea435ecba49f1b21108c27a625121364cc9bd530b9993ce5a417264519ea68ffc25f2257ff9d3d9006a7cab2854c4d88d4046f5e25e53aea966fcce66399bc96f46944fa150985f6f6056e39a3dcd6d44ad604f6e7eadc663029e3142c1ed20b9216ff82226358c129a093724aff9a59ea709e0536794622413ee37c9bc79fd53843fd68e7989070a5e1bfc50f63a1ea68859d7aa18f1870671046d47269fdaaca59e9bd7ce1a4593959320a99023a4734d07d09438e2ee0a1378e310a80675251b3622c5a2abccfe5ffa8ea647f79669eca6a1a2193831be763d68bd8987b717298deb80afecc8eea25ce910ffbf3921b108f894dfafa802cec1372a25198b65e368792864d012eff43a264284239a87f860efe2825950a8e78dadc5362cc4adbe55ce56c0442dee46e3f70a4da22240d7744cfdb1398904c31c41437eeeb43c004f7d02a6f5e9c387223f0d180a8fb5981d1ab6221fbef41d11b1b75abb52002d4a9d49d20566d40ce54406061f2b953b34107b1015204383b670c7588054cd61e2fc3631a2bf1b4888f89fab14dad478cb60d90da10a5870b480ab682c8b1c3240c26d9ee5f5d8acaa556a9d62743e36fa22a384743e93b45cb5578e74c75e954749208666b4c740a0da18ed8945c0854a15b88368be5a7b9030b9bd197dfcd8d9c30156cae8663181bf2a417418c5a0c360c829d31b1daa67f0a1f5f5b8c2288685620a8af9148cc6224378bb3c244474446bcceb52b9939939588fedb4d9e740f6b070d19d81d8b44eb85d9d48123c60eb5549281c3cb8ade4b13c7212f9c6efd8c1294609df2ecab4e36363ceaf7ccb52d7040ee66c44f19addf58a0e915254a121f256dc8aa68bce7b8b775cd8077e8e94a5da7dc100bec82fcca2d4b18df47dc2c2a1148bc7814c028dbb2d047d7784cdc8cb6b438907a3df849024324b3e7404ae3a0aa7007a698bb4dd5e85cda920aab8c9a891d509d37f76a829965404a2a5c46651e340db91ba4b838f83feb9a6135c390212efd40d079b38fb3357c8269f2eb966b4825c2a61473a1c83d49090e0b7830e1d9a36fb99c63988d3e2ce0a04d8394683a4abda80c07d05ff27760f468858cb7eed17173995afe69c962971618d5401f515a48802299e44b829b05b2cb1e215e0bd240123271402e5df38fb92d702d1cf607369be53d2cf195376422efe53463babb23b1a0b03c49939098c0e8d05c7ad9aff7c033c9681bf561bc2351422316fa00b7cb64b44c5c10f01126f3803b1800f4954a4857a0eb6ff9618b5ee8453e6a020e26dde893e11cb5fa91fd899037243df9d322a7fdc10867b1f9a886f38ff1cea51bf4f495a018002b59c68a15708377fe2190c7d9059dc13c220b788a97ee92164ecc11c8919d6c21c168e28d1579973216efda63d8c1b10b260198cf2d28fb0626d645fe53dcbfc9ec84c59621377b2a18986eb25e85df441d0f6522bdf763c8609849ec5f36ea09c8aced71080f666bebcc5ab1f19a784c36f781c899fb8dde27d03bb0c74fca2aec688dd7f0212853c3e2e743d794402557e323c4e40996392c3854eb4c4e09b3bb7ed57ecda44e143cd9700ba5061586815b24a442de0a8c90b3ae9d82c46398e6b7cabb23319099af113533ff675579d2c260cb94f448d1a02777e1c256479c5bbd272f3631a1f4a13dc5ec02191a93da6f0e54a099171d8fd511c1e2e3932befebea820f555c8b22f83ac437ccc254098ecd1113d464f95e702871ff30209cdafe71f6eff0c64a0c9d75b2d7d617f620ddd5284812327e05abb0ad056cabd3402da351bc4fe5b0c2473d9613629625c69413470fe1be3b7f05ce63c6ed814d8a81efd0f52f5ee92a0640753c9cfefb81dce7cab4b5be8486f91f98a19c2d2e557521eaba8858d152822f060e3c1e0e43172fcbf0fcedf4054c50766892a46629826c8574a32ee522945d9381ccb1ce07057024e33c73dde0f23e8e33c798d360531532f91af40c988e95f66396f24d0ce9f354715ad725059e556d73404824dea2f8e5ba87740aed0562d8e72f333bfc8da1e65a23aecb073a5a333eb372b8ffba1132dec057127267f786e0a01f8b8c65c7f2ba801cb7236c07b506b9169c266d94419369038831f96b3d86bb9630a6308b3486dd819688b588242d705b61424836677a58639735bcfb49895bb186d5e9440422b19038ec2ccd962f5a5265bed0b7f64cbfffdcf1d5a1fb005d97080c3fc10ed43ac4859ff01bc561cad9761be120acd308f250d8010d3df107afb6668b31d8dfed032c2e74720297e952ff580930e785875d8b62d14c548ce48c9fb978db452613a80ba4ac3741a9b5db2e12ddaf34acc3636ba6545234c0d228aca7a976a6e0de9921d4aa78fb6e9902654df48f745d54151da106b48709b6f721bf0c0dd3c6b6d4e31120ca1454090831a9292f2be2f907206dee6c896e59c30f4191178041794ea0290361e33fbbd366a2e19aa066055270fc924a75564006dc4c311d0e479a9dc23a89c4dcbb6164363bd1fc710ba4646b0345ccda687b1c71ed8eaaca31d4aaff9e966dfae0d69e066b72a903aac35ec440542eff34e28c5d63e46fd2f1112d873d0a1e8fa1f339b9041104d346d389c858d296c2d7209a8a5b1d41b75a71c02a6f1c36658a1fb0054db83bbc9b04858b4060b07b5056d399e75c652dbdae6268a40f61bd3a4009930a4719b53762a13e6a8ea4090a2ff92d7d909e364f867efec1437f340cc29d608153b4529462f0eed2272eca8cdc539149dd536426a9be24a7614a5939051c3911d5c32b243db3b1ed6899f9e246169223b943d97fce741b7fc877eb87836ebfc9e859a90668435876b88873051997e3288a094341d6b859bdf7d73d6d14dbbc8714fcfef75d4697058bfa770aa6d0653680b6ba4488b88f002d3145260fd891eccfa4fb715d85c522a053e0fe75a534cd36540e92013272d8efe743f71d2a03125b1af8fc123d40c0a176f787f328a551e2a62d24f42431b0245e782513be4201c8c0aa5a924773dc84ba6900a2a04a9f532e343832dad8fe8212335c738904ce296232b790eb5057b1e2a716daa78060bf219fa2dd346edd808d162ca4e5626ffdf8d76d441a687c83d13e73e2e621e5eb0421245925de7dbd736cafad24041e555365572f53b2b086a5cc409836969d8800fd180806e48aad7ba8a0ed18990a14a659cf51da7a893464a7f48b1dda8001ff79baf49d79ae4a6a5ca535aa57df7a8cd310a1eccfaffe28cc0817ad05cc0e0d9c319eeb677cd3d9c9829348c4344875d47c6f7d992b736ddeaace7ce881c7aae5d21454125ad7a8b58d419fc98927a2c11047da59898172b699e3f3c95a8783cd1b2332adda770c8e3035dd268d854ac4e38342255714a04833666a8482df000797394bf89ab490a8c735b6c4c884bb40cb331fbc6247ad6d1ea490aa20b6c597d146518f2fc4842d690c0dbe8b6a12f691bebd358b8a5790cb44b0d6d376e6f2691a8483a3889c583d13e53a68d2a0ed2da85d53a3d02654bc5e9fb38a8adbebdf15175eca7b2566e3ce89e77f39dee41e9128747c73616466235ad0aff0ab26560d3b0e9488f4454bbb008488114f781e38838a71847008a12f939b6deb20da112c8cd91b2be41e6dd688ec8f0200ec0cb07dfba15ad8842971fa7d59308824b54e95eeffb72f40ac2df56b9a59f39d16fd3a2a01ff326f5428f6292a18f995462922d38e2e44a271137a3c507a5206dbc27d2b7f7a46a4ef3ca0330d4a6e732035633a5578b2ed64822f5d8f1c144ce7d0c246dd5e9ca2e6f5ea8f98daf203b79b1e10532277e072fa09f00cc46b98740f41e80852ca722e019f8709f7aee6d2814fb105a85cf37a41c7c3888647a804bf7a15047e121ca177a5db61588149a3283707b0c73e1619f750c987547d58de8926e098b2c58471d8e21936d98ac7563cc4f823d25567b7e9db217b25a8928f179506640c7901ce287d8bca64765b10e1af39509dc5dd0efb08837fae8345e80d4a66fc79cd4142b90446688ad219e9472e216c571c01ff29511781e33de5fc9ea98246483933fc897b5e45aec65e4d1c51d2a4af9482e5ab7dfa4477610a2f54935b96eea2850f7b930fb9dfae2eecaac1a73bc9567c7901883a66b998d55eacdb3f905b903475f7e91dfbffc7e548b87db0431c681159fc5018876f3773dcb0fd7abe827d1be14f50c0f1833d58b24ab214df060178a2cc127ddb0dd921716576b4b4cf9e711ecfc64275bb240b022b96a681b4d1415bf1b60aff0112f2e14770940c8ccd4c02787e7422e40f47a990605a2b10725398c8051a6d1a6b11ff276dc6ed8f6748b0afa4bf0ec79c6c4e29f17a946b72dfa66d8a4ea40e6d1ddfdfa20bca2d97e4ab0252962088ec9bf165a03a4a2994acca0db2daf4954f4243d08f14aa20995791cf02d5dd4384900ae0947bd894f76fbe5370edab898cf82951fe02d19402b872cee23b0da5dbf5b873b33c361cd95a5621a6bd99b20276831de4008b331a0f49c203cc0a77c7dd830bdf81d7dd84486c14b5ce7d398e75ded51a1121f253de31b3852e69495aac44429af72bed9ae2eaf75cfb78cfc37715afb98e9115a463c82960da324cbc87a92665a2dfc90985ba4346ac70a4b2663940e4428fd8b1273bd3fdf278e6cda7edd991c48122866880c4f6d0abae66da4c48ed982c73ff38629ab800b46cb9f834faf66c931fcc0f447d1ff3c4ce272743ce6ca99e4a433e9e5027a31f1115846bb9fae029a6a02bf46dc77259fcfbea1911ed70a19ef9398d897748543333cd24aaf8b236649b3b00e84d24ab7047696f733c8c4cc4d2590fbf1a532b1bb2104ee5330691007ded94ba223ae8d40fb59e26e3664b0e49d1c6ddaa3b3ced39aba2288b08a9298785f859757d00163553ba9b230115121c2f1063488cfc0b8dfad4d97a3a764a79bc2361186ab068c9e3d5b95b4d4dbbb90c07d0f2323652b51acdcfb0e0af32365a27d321079dc01779b3f0712aa9a5f9258e6f134c81553c05c031bc4bea889b64f07225138a581cb41a8662b40d4a513bd8415f6151b792d9680898d0f969b2341ecbee563989c27c19853f22df69cd1e238d00c167cceaf26ad85a6ee9cbe63c007146ee72d77407da5fd0d9e450e90b28c353885f6468a089b0ba72e08bd19ec2a3ed9c46ea5f939e86dbc18393e992759398d8bf16e58ce84af2287a896b516f20f1f8d9ac5af15571533105108693541d5a2bf067943a9869e29863d6cd825907bf48c2e1de05f0dcf4037df11935de2ba2d2bff6dce8c226a3c08cf6d0f23777c46b1daa2e96837eb0195109ec53c8de8f2f21b5f850efc1f171446a42e90080d2b52e012adb1e46b5a97886ae4fb72be182b88ff75e1a232705728b4fea67c70f8478f769d4c61691564ddfb777f7be83a313b3ca05b41e983b9cb29b869ad88ed99a738f9090949f2273fd58bbd33d71da00f0039de9039420b0240c227aceac2acbe5aee40ebc9b0208c7f21ff48f47544d6a974e00a2d4f86d1197776f82d70400460c97a8c1858d098924579970442b218b5494f440178d113010f05f6b2c817c879f82b10615010574d8e6000f375610d6bb97b24a5874fa28bb0cf0cf8c94e0c775a520cedd1b47f78eb81943d33f50fc180353e8ac003cb8738d6c927777def2ae2129f3274e69a6fab673813433d848c6dfa4ec95162cddca44f06d590daa55913b204afa312686d19a5b4f33c4f476a1ac7bb95d7ca909255ac408f096be355205409697c08d000b0e8a0fac24dd4708f29c82d0613519b2286d07d11f75340b173bc3dc94a2957de6036d91d30b3dabd899486e58a3ba11a5d2d76825756a4f4bbf55da0f573915e11dc2cccf67d5f13556e488131a12ec0f402788a6019a441841a5ba82cd70e572e0efbb7210cc31badd1e1eaa0955019a21c4c70f1f03a330fde20ec1c223dced058609847284e15ae17747578ee7c5d2b1e13b5363d8969deb2f31253a7328d3c141344f3886befa86a354a4094dda9436cad234a020ed42869aaab5dd6d1208ba89cb5e2950f8a1e5463c896e74a07bdae39a2440f32e53b0bf68b784d82003ae3b8bd16d16dd5174feb3a2d7450f7bfe9cc3d13da74884efc0a1a660af0549de64dbabfff932329cd5b31aa0580d22bba8d439f95228db38562e55e51c3d58dc14585111ef2fd63cc0b092690917f7116d875b8afbbce0813596efbdf0106528d635ba14390426f2451e34abc39f36adcda0f90a3719b0ff33392ea62ba66b42988946d52b7fe68db9455479d07386c14d73e7ced9e3849fd9dc506f64203a95e85c7ae7f5e04623575d9604ab73114df1501c2e2b146c7ab295cb247f75e754636ce9189c993ec2f1a997733a706ee299795d07d3339787ea794f9c09d67ac446e237d4866ff434717213e33e034ab24958ea7bc3791b8c486a8fabf31f17169a37640112a3dc0a95d1a90251085e9532d12b463a33d5ce87b1f2ed35cc53fbaeaaa92a38ac462d9e2f536995e661d6a2023b9850f55321bf3c0052cb4bc915505a77c27b254000b1913f48da40adba043766e59d3c06ea03712a4628058cb5b4ec3649e43bf04c302761f6e9e754a5de01002874f6262f094fddf5004807258a4272aa6081b1041a994b6ff645f30d539d61025053b70151655819c11ecbfe772ff59eefd7b9909c11ffc51f30c0713e97c79063546465e4c2b23d3d926bb8372a528d9d87e430c4331b8056d478cc915fad4c07a3d0d29ab9fcd04d144761cf359ef0d4c9fcef6140351945a2c4fca4ac8dae704b987da68caa3d4f55b789eaf428532446adf343c58c20fd2c193f7d30b077cd8e3da4f000f81bf5b65aab6baf8bf6666b8779594ad8204b1cade7e1c379062990eb842bdfecb09ac5369583f1f6c78395ca52d80223cbec5436a7e00f58204831ee931a415e510c797dfeaca3946536d57edf7c8d590214dfc1d3d4d02b468fd25c93e76a033298350e836d7fa88ff08957f9e50363f846cfe278fff88b42823393527ce021b3619e1cc4152649d75fd9969a0bbe42107f7ddb490df4e8bb3e9a8d67a71f7d860a4c93f72f4e40127c0a8ecf20703f7e0f3ef0e232d16b3b45e01f516e6e269c0f2b7962a27c7f60bbda7a607a11467282e1ff623163b011d68dc919d3962dd2e10b61db1038c18a7d5883b1254960b4b8bc378dc1cbb1289c63d16812bb58c2ab2f6c33a0db06b13aa83d422475f453be33ed62ec227deb9ea5df5bccf90e9e299e5fd1839c47094c2b13c173e1411d728ef9f29986c98ce3180af55cdc5aeb07bb7c17a7d2c103b65ecc32d6b7f8474fc3fa922581d3f6d4ac5c210b61868f5bec16bbbfece730f8aac2908c68a7600a9417ddaf984388c578b77b06fe38e1c71b6222e1e24088cf3de4c01eaef125c89fe0d882b98e1968136be1683bf64770af1984e10ea88b873725d8bc5d0b6885971fee0113e911f50de1627f42d05c6c60b0ea987cb96240fc94953f6673f8dda099b9bcc382dcc0470f07703db2820c8f9f5d6f158c0267c70c1982492a2495b3a07b758e68dd38ce3ac53631912ce19bbcff5e88446f0882cbf996b1761d5bfe788c954c90b0c8bf818895f8f671b76f97c97e08e0022b7283705108afc650616ecbf10a1bfb39e6bf661c6f10f216c0d1d2b3553c02aa2a83f9520d4e6eb583d0b3dc874679c032e9aff20280a5f62959ac5de49f61332860de4bbdccbb509b2de2268ba86a464bec1510824bf32343ea4a665301274d32be7fc1ded12956f248b042df1495a0da4ed5043dfdbe7558e38dfbe0b4543689dbb19d7e4d123ee6232a24e4299b16d85ab5163bae52e3c11b7cf328ce032ff1bc7266c220561313f84dd24ceeace21fcb586e752f5c4930de5f99337b8ea3ea93fdd9a01a9c5c10d0e868752eacd692c79e5fc3299e1a603425dec6c825a0fd7c6d7242fe2481a598b75c810a905a1c6d1f71b6fca99b6f79bbc9ae94821dd47451da0fe36f5b4d4e12aabfe63aaf6b9df46ad0a30b595b0dd9125662394938b8de49cc926290549b685502564a21d96f0d26f6fa3a50f464e617b59ffa28ada1aee7b8770161bdcf1bd2988b340d048e1978af9e60a03aba3926741bc2e4bec248f5740e836ae5fc4db126c18740ab36d1792fe5be394dd84015156b8393be8266a5837069e3d33a53f50144a5434d310c02e5e698aa468f342c9c52fc9b24ba41694d469f99d2025e16d4b724d6d0189cdf6b56a5ca8b35d9a1afb1b7b54c53ca863d107371609ac8f5695d9013a1d747f116197accdf80f7606116d8c2b5b266f8e23c9175a24c20eab81b395dd8fdb96de501473bf8c4415e3ba632f5a7f341d4a8ae8968befac3728a7dc675231931d3843fc2dfb525185196261b8ee985340f89c600e1582e5e397ea8423487d6eb5c2b50b1c1e81f65901e8166301790d81488e0e4a897b78ee79a3a9b81c045ad2ba253ca97d5ed36e35d46399ee9830f18c4c136fc4a925d29b251be9aa4bd409f7e7f76f0e72f6d5068fee2133acfab9809ea1bcf63acc7c21923e4bccae293afc6d309c61f6bef72bb09bb81f396d8395a012432b3471154916c886b976f25b78bb191b3c3d8ce342ca29d1259cb595ab922e137a3c6aa83b2756faaa649e2f6d555e43061cb11a453c5ec05a7326acaed5a398fdc0b2ffbbe12f625c1ea3f7e6a099e8ba9e99b7d6d91d0fbdff95d366c7bc83c8ae392b198341899d4612a18d8f74b60d25a6b339c0913626d9c36912bfd5f39608f08a0e04c379930782c03b11b72c070ac310cd66e5454ba54aaa2ed4abbee89cc037f0ec64e9cac40e61471ed3b357fd1d76d3d17a12fb69edc503b75cf93a7b91df61d1a3705b3e444d86ad4c234e22500705fc2c37bba13905839b95368654f4dcf9851b9b1d3846f6017f5bdd7c2752b9e001dca1df5c7589ef57abacd15ab53287b6c3f8ab85b3a839ecd0549f66ff6a7efeed5c07a09beac007f55f2dbbc48c7a9e24da8898211ea5aa96b8ba7e0fa219b8a3d85031d88f7b0cf8624d22bf63539d3e9e90fccce3a649bf2e6dd634f447c3cb14bc712a370e54bf58b027e951af8036f18c6764abcf32ef293a9c87f2c2eea1e05498a2418985c6c6e3425563f028ca7e544941a858acbad804a2175e1d0514adf281fbbe82a84d32b42381b0ecb2e4585307d15489d248aa18e66decc4aac88be9236236c6f18724c62c911eb5596736fafb2397cd4cb76d07ea17d0138da54439d1bb3b6604c1b0377b2a863d40c4c151563e7289e9f02365652f5b46e4f4525049c1feac345bb678142d72929762efd0a7ee2349b421cebab4f166c75069d66c91df185b683a26ec0b6e2722f0c1db0bbdf0b41484d9f86beca8f5242b21e9770aff50061799da1e3ed91acdb29271d4ec7e6e6a884e33ba39e3e8d9770456a77cbc79c9380987b6cff8ea94008bd435d4b19baeeb2268edd40690c081460e8f3e864dfb0aaad00fb3550c8da69d6ae2f32d45595c5e67a00f17650d80d6244f8c40076e177a01d352a0a1e19b31286b484cc83da78d26d0ced0ff4ceedb3a7e8b0321f4b0da3239a104aa1a07cfcec1011bd420b841643e64591fcfca5850258eee9413afcf4e4c381646f4a0cb4e106f88834584580421b5322f87f6367d1e5da9d67dc31168e96dae02eb4783be2df28e408f8036b643c3a91bfc8dc45ddbc08bed27ae69d940466dd49fd776878bc87985a2330f8fc85ffb9c3f440631dd4e74117d605ff0066ec5a711fbed07611facbc095b911d711d29d95d3d689f5717d7e5dee657a8ff8da21b76e5fd236f2e2699e6f7fc3dd879ae3aa63af74893dd74d264cb8f9ec264fbddbe16618f72a89d0ba6d1728e2a7770db7966b7313f2b6e3579f0cc990a76edaf88f486d6f61c0349a9496a09a9dbb7e02007f76870be13358e304462d49ed16f7be36c3581dc07ea805737d17b4f575a775e87dac70400808cd1da231c4e960ba38a8486337bb56d24c679d4d68848af94de505bb2a96e0c0562a9bbb4342bd0e40fc20ee7fa040b4263a3578a8b8d4e78cc14d157d5d43ef6a3040ffe91251e0ab52b81d66810fc47da370cb2ffbd2796924d54600514680746daefabd51a6a1fb2e6a856d4d89849f917437f1f7cd84a0b406b5495000d4c02f44938b1132755a461895d87f2f1d9c7d1d5bf7685f6d4237b049d5b0619adeb37076f8e0636dead3eb15b31b287c62b3a7c327b81b376aafc375c1443a1938d9ee1305dd2c33e34e606e7f348cd88af010483ead31c08dd09a124ffcb47d0dfe36e825c79a52115fa3ff595e1a06b90cf500b2b90169404e59652455cf9fc1b187dc05e172467b6f730dd3fa8f5bbc417adf4526f2bb8065dd24f126cdbf6901d65270ea50664a1ba0cf62f07969504ca75328d977bee75fb924118520c05c578b5d2e7a198bbfad10be8d66c5ec533ed0a70f628a0d0bac40e459a8ca42cef961f5c98408a814db1b99d456f39219bf7f2d524a52fd9891057f18f113ac0ce591c95143ce4e1260e4309e836480c43bd825fbb14509058bf1b20fe52e125cf068534b8ef3810f3ce95ebaedc45c26a09ec988838a21d79d9ece910dca8bc5332c8d05d216bc935db40c56e9f27f874a37527cd96690c31e7bb85da4cf1c92fd495b0d49b88d9fafdcae83b5d6096417a84ebf668e586a9c6daff49f745e9088618b908d24a0b9327e86568dab430cf5efb016963939b1c4662e8fbb9a2e960ee26da84f3d45d991a4ad30e73ebcd7884eb820bc19419040b40d6f20c010adb328d68be09d4fb7c04bfee708e1d18923c84c790c30610d3955498d8e8318cee5d99e13a2c70f1903050156dc9c1211f5af54eb2da0503abe1399dd1dbd9fb6b311fbd4003cfd1e231baba638f65420d60914b12c4ad8a6b62835b3e18dda0c42f5b7fef38583271a5f138e5f3864a1dd87673adb6b2e91ec4d480bbe92e487c8c2075ac440ce3d212ab6326fcf112cf913e00a6d2eb75bf0d337ec7f77ce39d2369a2c2ded7a719becca8a3b762e9ef3a29104acd4dc08dff3ab229e1e16f75b896e1cd4b9b5b82071131e562de590ff2ce59c473ba3e5768db4fb27738a878206763b4f3b975be772376385adde19920fd6e12443b12fc6e8da29d2c9224536e7431363d30d0fdc7bab540774fabfb2e9378ee3028c06378c71667dd82c7abd04e1360991fdcdb24da2000d1c5ff5680ea40d725758e62172d316172b0422c79f89b28e1f7fc1057ae716cbdf8a09058b19347271675b0a0e00181891e30ca566b2663d103a6f2228de28f29515fa5e0c6e246a1ad84774047ac574942459e9762ce1958d663c7967682fe4e7a25c11904a54cd694bb203887a1544acb20e582e45a10ef7157ad769142d3d4e709aef1001d9c37da7bb8ab3905a52251cc5500936f9393f80af2733b49db26bd30b0c2e87f82de44704ed370608f5a57ea14f66dafbe6cb18eeb484287106cc454b71227ec621999b22f9fe36b4b7dc8ecfe83e2208fbd637335e61981331a228675057aef3cee9f9f6ce9c3b6978487b4ac89e3a38d31561c217c0d75a043d78592823b1f02d52cd632b4c8cb190da9bb7adc5a8e7cb1d70dc14dd2834b118fcd909403a62f04b53591d1b8e1b80c409c195fbb53cd9c4c74d4321e131ee8f20531c46c6b0ebb9ea2faca0862caf0ba09bf0470457424ce9380a3c1ee9777f7d5f88a6590b84a0c87fcd247da91ac3f8103378d91722d7c6033ecf8916860e00fc0767ed9ae43a12f1af0c506863158f41b1ee3b242500d1c6b19e527c44c6e8da3a63864c8391f75704a88c08cdb064c6091865b9743c777e9a6629687ca0d0a50776ef0db8266d63d9e148ad8e001719dcc71cf99425eea2aec564d94358582799be9e52dd5180cfa0ebdcfe8f2add6cb8f2dcbf7cb78d615d63a72f485529dca6fc9f34f66b6543b5998883502de29d9b1a4895d19563546d9b0508d2a1c8394582f6b5563900556d554c5714989c5ac558d57166cd6a8caf1a58a65c6aa8c5f166c6babeab8f406b02693328d3c4f7d56d02e4876e2984cb4a6997360590e09d2eca479251d8f74b12cd32ac6260b166b157b96cdb146dbcde0c160c4e32570f0bf920d0cceb9120b5cd69ba209156e1f07c7b18acd5dd231758de5cdaa1ea3d6c5f216d62a8d41f6c5f2ec835d867e76793b96f08e97868c107caf0cd8532a76890b4bb026994c0f1e389947a64c9e900f04e63cf0e0e42c3d78206f6ecbbadabee40929195f8777a0c803b4c23b001617572f662bb1e24e43ac8537875f255d62e3acec8d70be54aef764631fb68f2124b6c1f251c0c27863f845d2053607c6a8a265f2c4ecdce56025898397de5f713fe1c04b7ba4441b4b3786be85130efcd5c3b731bc5c8fecccae5edce8d353cc7d118234ea6f8bd40e13bd89ed9bdb9585a37536dd747ce256ede5f70898717b0bb31eda174cd522a4fb9e2e951568af7091ae6430f8d3c98646decf4c78e0b4d5c473890a7fec42c1f46fc38e059ba13bc45d4f26b7cbf30f5d4b1204510f7eb250edf1ae3b99728f6755f7d9590dc466be7725a60d92e4d107088f963189d947fc52ae4b4c76812d32e04e50f6122660610d4e61bf6d3c9c75a00a1ef84f0afdb438aa765c9d8bd882abe5b18450cd9cbbbc83f01386cc31aab17f934f9670e313d68af21ad0be04817e09eff01801f3e32c68b14e4cea7bf4a2eb57690a390a5c34a7a98eefcc8eeb05944f51703ae5bfe14aeb89a03278970164017d1eef56394257b482cde96747df4ae8d295104677843a268b84b15b33444e5d197783bfd91a30a283abd616680f8880eccd4004d10a800afc06445850e82303288cc432566330a718c6a6ad1687ea90aab6dbd0b268c8555ef689231c2905830d4d48b93416bdbc6ac6ca741cf4962f6e113faa41010c919c84628b0b8e9caaad4e1247281ee03f9d6cc1da32472614c750c38a783b82ec0901c159d3e28da4a74bee9303891f713ba30678fc59f52622f2dddb9263487dacfa8849f1a52ce17be7c467d90c822f3c168735f5966e0c1787e09c1fd83acea0b2c2a76809f6188d67fd4f2db8912624af78dda5fd52c5582509b01d0bcdb58c8a079d7e0729be2cfe389987d52e367f31d212948306c002528ea6bbacb655adaf25b08d5a1644d3560a0a12820f9f0908e147d32081df319bda3edf4cbfa553fb19d2d5beb05818111e094c757754bde2c7eb0e1633271f1c832a044e7bc8b39298301b8e083baa10e2b93d25a0b845e323e8d33bb31d28526cd9d308776a260180d88df0786c3aa80f2144ab53a8dc1df9341b6bf880cfc0815b564e6e47470fc8e2ded4ad76efdb9b6866df37ccf2263e680e4b87d9b3fd4222aab9f31d4c216439d4edc45fb02c20078ab14f995a0636dc75c0834aaf06ba15ceb1077b4e7a37780e062850192020762935853f0eb0b4c2ce927781d86a0628e6f188d113f7fe7b7a982a820dd81841bcef282c15db0e028cec9772b32054f2944fbf65cb3824424cdf8f5a59dbc695d6b7767874acd7e628767a368cfd72f7152c47b6a570d49e88d4c9d10edf4596edab2dbc54b7ed954ab683edc79fcc34beafbfed808118d57c3e347c59290b174cf8d456a80709831bc8bae20258740249684e21eaee810ed8370666714107c28394f489ee891aaea54d170c6a64826781b1c1188d71e1671d7cdfc1331ea04aea58319e4569fa37b3d48bf358aadaa718919b155b7bfb80186c152c02b89afe4f503715c27b2ef0d07ae1f87f1d23d53e02922e410e5b2391fa7df75affdac7e3c5c00a574e17a10bdb42bf077e9425d233fb322c13b2d9928c08b02f1beb513a26d8ac75ef0dde3e6e9c35ae88dd13fd1ed034c501ea6810fae1188045f84912c60396f2933c5266215eb708d2b2b449d8a77c509b29d26c008274b2462b47d592552c05bf82aa41081211d8d32f5d4043460f71c2c0b68e884b9b19c40591111a4dff09a4ebc3b60dd5c7c1e1f5b1866dd0d4032dc0dfbfb15eb0527f11b1b1ba1957743b8943f92c457d421703fe0d92ca36f7c37dad01a3c3bc6a8df14f12c5ce77e1aad707114458e0c175184ae7868b4a8d8a41cac283e5cf21f310655e0fa099e0d9f27537ca0ea1167096103c3f030c0d8953ab02d5799f19344915f617e3355186d0ad48a42c51020dca6a053f8a4ebd11d7ce04ecf73f78e515ef5a644dd23b969c081b45163e099c3018468180dc81b2415cf7d4912f34bfe07f577596819d6b9d8315f1f50f9fef4c2cc988bc838dc40d22d587865808949630cf6c539157d4106aa913905088168b291cabc006b6e3a4733532fa905d6ca6718c121b10c5b0c8e854cfc53619b1a9c236816328c6e013ce6a41c0d21872fc7f0473d01019a0b740cbefb4a2cf447ea81e6e7443b2910130f75627a3070e06ff67d4a014b29e8b92023e39f27e77cc25e0bdb7485ad14cdb8664b7d979065436f00530e1b1d4371f73ae1d3af4811c104144bf4e0695e42252da52f5ea944b1a01370126be7c9e8c6a28adbf59c779dffd30f56a5d41e1aca433d5e9659b82de7504078061013ac22cb7761962b81c35cd7177b7333b9ee027e38297bbf1dd344231bd001eac65801e10f38a886d9efc988c4ac7abce389ae326375c033af050000181ed65794285787522765794b41954e756b0f474f7a48b32312588087d30c8327b9af73cda1b497033ea469850dd074053830edad6410a098a97a0d7179fe24a42829a29b928a84479504beb0fe1a6a24500f7aa7ab6dcd63c11f1b44a71711122d664dfe6d5cf850e26c82e5a96516d1411df40eccecde698750185a24e453c452bc5d32e27e71b1e1afec0353ae8d9e8617bf0fe057d869e72a01b3b11bace05c1210b4425139edacca20c3a3a2ef464ee7f0defe9b7ec0a2a6e70bbf10e85bce869da86290d5d3dd3e75dddfee2d839980160011891796fa3788b1494c8c08760b0a7db9d47c91b4ef8ed24a69d3827f84d9ccaaec7d7dd01c187bac729cdd0a4733591407a6437f63f051855de74e2f75ad690589ce72cdd1dd630c5577a2cc5e96287935b83681dedb0af076bf22491d800142878ab13d2cc6fde8b2c4ec56f29b7be52939364156c7035b5bd20d2816bfccb26d9fa2b2f009f1068e3c00af6608de7c9da272e5f00f1a4e9acee686350b9ba2f5fb4161f6fe9f21665667b83e6e976abee478989715e1a9f3addaafc57acb79b6e44a8587969d94721eab139f7dd817d5671ed7161aadaf768198b016fcd2ced90b616539fa4c3654ed9228f6669d219168c806c1c9268bc0ddece0420d3f89aebb57e15151ea99a064ff70c3f8f5927eda2f687b8add30b3bf5dc24923e18aceee8feb10456724db8489032b54ec92f0d88509d23195d91fe7b1b51970e74c65214874e00493d7700a781b4af9bdc5a38352cc6db57fa1bf92b5d0d566877133b77495248c44681f1f1c9617bf1e834726562b185236d4f0c8e047f4fa8ded30413ce44596f99bc4d697ac2ca8a3492edfbd3b063c40a5b911bf489f7dc28ebd884cb256cf3c0374abca2e32260df52c3f26a259ec6546b3c7e261cbc18564f5a05a2e0e87e9686fe634b318750b2e81315b34cb67b22d0d28d99e70424a08bc2dc76d2a75d1ec61e270661df292ccb2fdbfb095a6615e05257cf5b51264ebaed271cf78af43bbe1e43373878e5780f06138bbf5442cc7ae99d38f48961b90a0bf3f856fdfc0a11f1418282a5dbc1ed3bdd244297897d8c8841f70efeab97b91a718a1a8c652510eee0748407fea03f847d4df23c292535f5cc1d1d24cb46d8a694153efaeb52cb9eeabc20db4112d40906a3c85b3156f1f623439534a7cde4c8d980962432dc0fcc29e48de21c68b245422a1efa89017a47e239665dc2d727cee737ead46dc39b2bab87f0644f65ad940f262d4ca471971c490ead2f164683f9f63d90af0340049a6532e0ce9e85b47e4a30f871042214b5c234518dd3dd30d4462de7898ebb35543183484418978fd82b5af78971fb1f9f0b18a85a65638f98a54124bac720274cd32c6bee5d780b308e5fb94cab7912761c98e4b801ff920746ee6523d4463ee5bf6365788fead15a50bd51f7a08bb54e841e93bff7172d4ce914717d40fcea301f34710216b095684febff2e515caa8239ad1df0a2e7046d097ab739125e84f682396cc8926d3cb32e4a0c117b1337b0a64c19393aedb365f50a07f88a7605ee02d9a356432ca511eddadd4dd3c115aaf7acc41845bc0e45628d4ac0505c7dabf9261cdc54af1fa6c7818ccffd25da3a793d6b5daf6a84b850cfa8135999cf5ed74f2abd072b8bbf0783b1b54f8de8769f229059f6a45ade2d30a3d7821a3dd42169ee6d84f3dae6307d48331115ed24bba9505786a34cb285852b71a66c4bfe4a306e10a2a8f8241941a1e402cf1c41a1d8b9402dfb9a035026ff6d033ec440c23b10ef317987e753bad584663bc40bc82709af0a55ae02d328f54eaa9d66bb4017d970266373551f4a889f8f7215bd7d1dc54e55ede3bc30a7819e8679e29debfb371ce4cc21c37ceff70f597288cd0c734cb9e578231c7fb6b32fad99e15a8405a79a4111890f4438af9b74b6d3233c048ea43a7a062e23150e0ec4e2ccfd77240eea46670c9ee83003de61058d6fe4e09fc936e1e81da0095ee61cc1a3177f42602d860d7c4a757287810bc413afc436991402fc70aa63bec6acdc4fff9c55536d2612041625bf77557c9054bf2e4d734df6f80ac278cc5672c87ba50b2bbb32bc7de1872198a20732809d3efcca894856735e7b85102ad5e2efe3af39e2724bdc92c9dffe5b83f5f26389765e7f27a09bfaaca92cd0656f72f10130d912eb8e8adee4ed79c301b86c4a60d5f2e4a8a2a370d3c063ca76d7b8c2d78328e474dd8aef842c38babe1adf2e3f6ba86b26f95e098b447cedcb0da63f8634442b22849ac953bd06d78e12d1bbe513a183cd5c7ebb7ae725a39b2b77e3dc04b3f3cd59cf61d496a2ce532b7c004fc4eea54f1009aab95ba1e8396463a5f8a6bce26771be63a3fee32432619ca964e904fa5250ee8bb6400f3cd12dcdd970373a94a8577640c529266baa0e8784e2a930c2b97538065d8d2f14e536d88c58b0ebbb229d22acfb150b16126d3b071040f8540a8c4a7c99b890402903f84ee5e66e20f662f3806a60a9ebebca7d394b791d428f1175c03604ffdca19728f030cd66946474ab830024b9295b80d50881de3298127e05243ccf7895518e03f034ef92379ac6ac2dd1f7d53596b12d486bac3c1d3a693d6e6d2b6720e01ef90a4ce86e01ba3e5161957e9a2e15e9d8880b83c431db206ebac036f4528b9a9df28daa0c52cf463a02bec2a8a75d0214822c2bd9e2ab2dc8effe023fbc011e77ca5c2911f7023c729e04b5bdc511ddc32a5cddc738e40752c3a3cd8f6d592311ffbd74634ebe6b2c1fba9aa7b478beb3d0700133f3efbe7228a880e7c281c06cb050dfbe1999b1ffc03d309a06dec85d2523ca37ee9191b3dd748b39b7fa934ad3d69e81f6d69d3e5cf374eaf20ec608020985fc7cedd295716e21ee3cdd924cd8c1f7ebe4b393cb7b3a1b6911ec96a58140117d6b566b7258f75cfd166e98d844ed010afcb5f70b4467398be5425fdd46a987049e563cc1b48215db5848ad305f8b345e13aef69dc47eb24cd8ca209e2f6f85af40a14643501d72376d13514e6f872443b6247148c476c9e470b960302187db20a0a335ae6a7ff3da5c7bea32b5f3ad79ea42b9058c310770de35c533dd45a76ebcbb77d61dd547a8d690e8a5deca9d1e9b2588e5aa7226887dfd2088bc57a16619b40cf3e6dc069b7abc538f059912bec04fc24f4712505d5fab573439afd901fffde0c41ee5f2f93a3dddc1ab60b54aca68e24d201f1edab0811a0eed87b85752c6455fc581f8e4c5af2edbf7463d2cc4a7c3eb7e240486a1cb9fb2a91259edb919c5fa9fc88ef2d940223cf7815304eaf10f45651429926a29b2467691b9136194181321955c36a298d3e9e358c4bea6a7a83d4b949d654e11052895422c44ee0ab983c1dd07aa224bcdc067cd562dd4ef0391c7e03668a108c4e868eddfd01ceae7aa11ad376e277fc10f7e83741706e1faed2865c847df97cb006b6993c077a9d5430b87a491e08bd2f60781110f81cd64b835e36f418b32a59123e32c9feac62697c9002bf3fdacf7b2f55f1a6277c40277604933fa542c0cbec6e401c21ad453875805d46c9c5b14511a3d3e5d74fdcce8c7fc0c7c1981f3737bbd68475071050f0aaab98402bf35cea488e5d56c35b8a64758c897272342c01369d574cf497b66814a974b4b282db8e93380fc8ae0cde0a672355b72587366b455641aef38fb3b7eaa8ba70885c1ef2811f447d89957a3c68001a5eb1d588f2ce7d362a888ff59b8770bd71bbbe94741c99a4d260d0d5e5ba787f0ce86387ab30c0aa3d908efe58bfde6c254e4c0513b47946b342a3a24e4429e301650d33cc6ee16d4d50ce78546e05b027531dd5ccaddec0872e4577cc1ccddb6358c95450d8c9428d7a183b86ffaf762c9fc8e0354ff009828db59ede779a8e623302c5b99c8bbf15aa0cd79a33969028fa63c181000b1b8e4dc066f8850bcb3d79546a9fa3fdcfe51789f225c12d2c14d6290a16006d276450a4dbd2bfe96782050e8d6d06949e611d7314463c3d5c17fcc9b666abbdb98544f099d52e7f08110085c1a463d6bf48da1aaede560ccfd11e29d5b91ce5a3cd4dd1edfa275e4a60dd92abe702d7129c74baf8bce67c448bd236f0b73b3ce67e84a805ec80d9dc2331d6ab50f7c0475996958f28d495db4ceb7c52959a51c1cc1db130406cb8ffb8e05445fd20401011aafe488683a1f7def4452020e689b40b456cee7ec525b7ad044febddde5f5635cc68f002ca2b0486ebae944fe024495e6dea80bb876b187200de0d3af8b911cc67159663d9b81482efc8db29aece7b4ad7b34e13eaea695731aedf9cc99bf7953f3dfd8ce4a7e5533c0d55510b2d0b20343f70c46080f7347f60321689ba7a385c7769930c3326d23ee7017d8702fecdaabf261ef5b2be107bf29898bd650ed16aa5b685b5fc3159a85268b47bb7eb538b46bc469b743f1d886173b544fdaac1f47e933151d6d82b7a1d573681a7a085460361ccf6a05215a86a5a109ee20e98156dc861a02a490864e7c97ca46d3e9cf799ef753d847e94ecfac72d982bda4a612defadad5009928681ebbc0781dd555c421d6f56f5acfdd0aa244b90867cc73ad92231e4ad56e5d1878b4b1df7ab3431506faeb349da5af7b4e74d5f6477c8ab1863495a557d07109f3152bde15270dbc2b44ab05beba3f87c07b28002c055470d87cce73f5a3876a312faeb129980eeff957cc288c106dee190113fce18ac507db26dca065a902f52cca34d01540a9448d8ee9fe797adcbfcdc26a0d581ef24888ca5fe466b5338956febacc87fc3977172b1ecf9b2dba4ef8560db4f50e895d0ff4a515358d20d1997d5046e55b086621836d7cdb19414e2bfd42d20772b7ff655698b04ba43e3a32e9995420f9c71a9b2d2b38d600edecb87ee725666708f6ebc344a5f1c6facf3dd725504a269ae72e9c50bf93f52aee6a81028ea5bd1e6104fa3f1dee1d71f92b336e3d26d585a82ac12393d4a6caa3b0ab51b5ff8b9183c99c6f2e042454ce912e789b53db15432992ee6b725a8d4c16202e2638d93f494028c6c3c07881a66ff397739ea47ce638f2efbbd95ecae8841259b27b325a5265c639e9eb23bd83f91ccd6a8121d604feae2b1a29fc19eef7048133539155e45eab41d7d788a04754639ee944770c6c1d411ae1be91047097d82002733f60ac0b87e5a3d6625eecc3ade88c77c43f003ab8c4a65752215cf433b4871a10214d1cdf92671248ce1f85e5223342dbb28d2a98b7f0ecd4b32fcdfecdd967e65aa0cfaecfd010c5eef3fb269675dc2eead6e0f0f3ca699867ab5d2b1d9f3160c72dd4e67ebcc430106f9ead5a90433e66633425e98d7171a8836688c1a935496db1090490e7b159428a78ba3b9899fefbfaa1dab5ef580b01afdeeba2540aefe9606e9357fa4d54af57fd928f9c44837b784a6f2c334c3457f850028477b551b8ca3f8fa7239ffafc88721f85da682600fe87b0441e32f7aebaec4990c2803e175c15158cbb043d403d89cae456158186eb118e76aeab6f9a51a76c44c867ddd5c2e122f40a5f80ccf79e0348b12477fbfdacfeeb22ed8ae562619665b84f3ee9edc7b33622bc49cb3eb0905d99963aa2afc253348b5b646a980aac9dff26a696fbd30a981e81c64d01f86ced1ad146de4cd1d14c00032efcdc7e99476244d8b1396ca5f20f93fe07e8e98bd6e251817b01b636fbb31e75fde3a19f4e0b895c6d0ce0ebd50a7cd3579a2b2789463b69371ec9494a73fc33f5ae0bdc413c4d8e38df79afb6ae836440694e585926c7a5e8583221b86efda37b5662e247be5802ecb41bb653316a9bc563b6e3c8937c03467be3f2a50b83fcc64ecbcfc9da51091936f99633748a39410f840f89aa6ad8ede964f1f9c02298b03c65ffa25050ab61a3817941f5142f5617bb6a293622c162cd2bbd7ab7a3e70c1ca3f214d517a100232193d46447f8150b47b0d34c5189ac863a105ef1b27bc4fff671377621d576d2cd8e31cb2f94e42cf766b4506611dc20cf85dae681ff7d69ec56adc4ab537e7515c60bd6c8267862cbabe5b91069994b33dd227be3ca25c25a0ff842deff1469e7907b297f1f1564ced7a0fac4f1a8eac88dc47526f7984bd52da205618a867450861a3cf5d5fdb60d85a9bd26cff56bcaf6bce3cfdab23d014654cbf3aa65c3fd3059dec858f83c333d3d44a10549429a8fa09c6a871a55d433668ee9f949d9ea4a703d43cec34d6c7329c8173131cb0523548878616243cbb6ca078ff7dc4668778d772bfc7453ad5ff399755e6e20c79abc3ae3fb9fe8b80f2956f2dee7bc87814531de32dbb0f6773d26799e416d121445f9e68b3f1afd003879ca52a57079c498710bd3e7c4629e7c99224630b12b471864ec6201c778e1c4471ce4b886c46e559a702249b35ace4010a50ebf22213f89a909c332a912e7141e76cda7b238608584cee206fdf5a4de7cd28be20a7ba87655b4b2a5c299dc3c9f23035768b3469cb9f1ca902cc8da6f8f036ec5f70c9f52cae36c3c110e38398b360b4ac23491657122e86ee9b02905b498e75bdb772776389817d3acf329b635303f0d5f7abb1f1f87badc78cc7ff0a5b7e24dcfa141b97e3739049b58f64adaf34d9e650939930371181d601657f38cbec6afe93a5b115c986f451bbdee844d8aa5d44e090a3dd003156291d54092c899ac181252b7ba71da96033cf5a157f86446e63223fed02712225466b73666750fffa38c65ce1278b7104b24d759262a9e3b53ba0438e30412a525419eaa6839305161314237b7c1d7a5c5eb8683e4d5591adc3128bb7674e485ce490420bb61489eb9166b123e9bbdf7bf077b23546107483bb6bedc91d0ba40d139d68444c0d7ba110feb275328d89351db33813471df048d29ee4bdb731740f1af7504c94827620728e4462521a6e72f9f2fdeaca4c2e9709e9f9cbb50bf4d2e3279d2f2395e6dbe9283f83997aa3802ecd0f3db502c44e310dfdc6603655140279fbfeb0b20bb8a2fea6fcb5a8509ab530439f83600e0d0b38b92e564a716707fdf5d275bcc0c7a61f44cdc9680055d3e33922c50e680472fcaa6e472ded0f2c6f542a8700f9d00717eb25ebc725b1c456cc2e84afdc3db28bcc6d2fd258bb47e74473a1bf68defdd073226538e4db0b6da2161fa1eefd89c808da255141083f3c3de0cd8480b2976eef8b6b3a1e6ef3911bc5638a991cac7b5e250e9f8c8ad3bba901cbda778f2e25fad0072605f4e7ab39353ce99dfecc8bc56e8dae7815d54eab4bd707584ea82508bb84b19c22cf55758b522c3949a68e7fedaa5527112cb234a25f44314a0e777ae48b04927748186b942e0c8235eab201816a2f59e98d930eacf98eedf79ada6a5d694219f0610ef24037db131843f06f0fda0466c4c8055ef9cd8a2c7fcb775807091ea848deeefd8a53cc83fe7ff152a60352b1d3b50477ab2e705fe18264994572514ae0f11d7f6174493f597e96f9440ed15dddb21186d26993cf14f2765de462b1b7b8a1dd0df9bc6a04970e5968065125aa62f8a17348243903ee3369a9effc1089bb98a95def79a43d76f9aee6cf39fc305b061f96b8c9747151a233cb8e3df09bad7ccba73a4c789436646ca0b3357bb6274cece2bee247ced9cf5a384fa7d3442b5781af914d4dd2fecb097d6639a6f74a62e88e927637f70f17d607de79768eb99a732e3fcaaf561698723903be66c866b58b6e912f8fdab816cc1ba5e7336ea20aecf15f55f60107eca395f47b8366228e78641ac3be7e76423faa3b19d1e5c58ae40ed0ef0f2ea889e245c68a3765e0854ecfd2813c6b17ca806417079c60fb2c31e6aa6695146cb27fe28647d13c0637920ca6ba95b5d5ae7891e7b84eb0a143d94a2e98d7503baa7984f88c0d3cce46dbaae8da5d793b2d275f9a2e40602765a970e317298775b6acaffaa852f484decb97fb7f9687de052e52de4a3d44ba003b8e61499611341a4ce7ba7ab0af732cc6b806e3e6f383c321ffe6354d2835f24003bf74b84fa4edd5103b168191d1c5c08a5591434c72de88f74b5f18232707b5ca3062d440e4a0e4b735fe8efb52f217e66555106b5acc05baabf1caafa785d3606a3be155b4c33699e77a5176dcbced9735a0f07eda2fbdd49c77cacb304b6d117e896716dae4336d114dc6bed3808eba7bed0fa2fd11e1d94d89c216c1975e94a2b73d635034b3eac913556cd9367f814a6930f355cc416c34105b98910a27e27df3e6c403dd9652beb891daa801abf45d2cd5d0e073452e83e463c05d927a4423c0ab5a27c3a8c39826c00ca0ab9b53ad23b6afb0ef26a7d9c612ad2ecba903ed20df01c0fc985d908f9c8c0df641e8f1082e201a40db9c5ac141bd94746e9cce66f77fc69508e28176185922ff57ecc1d9240285c8537acc2599e009489dc9f56493c85c03f7e63069cc21d14785739d0246bc822d6bcf84b062305607ff827c33fd40147dec4622784331b56f3f8d75be04c6937e985fdbf7daba9a5be6f7759bd997d9dd6c4023fe271ab08033c420505a45f5150811adc18448600fb3d2d5a409281946985199c25f3f85024006bcd3142e4f2241bc16fa9a378bdbf53f9fafa0dc29aafa46239c13bc77af0011400da9b101df6c6491ec5ff812ade1ad7e580bf824be8a5e5e435a70d8e9c4d07e973a41cd4e522226cd344060279e85e746771e088d830155cd42fd2131124bf84988bcd55bb6e382b8c18ca728e0c0c1cc9602b027c96541858235d1779c3bd75966aa09673a818858ff85d7adb1f37b6c7d603e11cec39f00c4018a84da74e82013ddcea8c5b3634bddd9be6437beee01d435a922c61230d5ac4f5173b025ba9667a15b4f3f3340e4407614e52de2dc152b9f462d51b1577516924dd94639721da2b1d37caab0559a0afa59c1e2088ab1c4572fee2ea55064218bf420788fe14509377fd8d43c35eafb41f0fa58b36b48739e7062a05abafe8fdcec2b4d85940e710c963d3ff9952da553d7fb32464ffaa5db858a8f44f2a229bd38d84d0a4a83bd73095c07d0f5d9de98a0dac9c5bf0fe7876fb271f10e8afbf94ae22f36d779935b323d4b61f0810b469204e9161045c69e68b2ebb5e6ccd3fc38b863b310b25101565734fd8d85f592f3723eed2b28571ba277a668f3c1aa885dc70f0f40cb113e41915d3670dd7a73b6a26dc819f71d855bae0143219ce9d9c333e5d10004675174500dffbbebbd222f39ea5c1a4057b6a218f6d731eadae7ade1f57accbb143ea705f985927084931bb1a41caa3aba6ab08e2193c79d8d1b7b0143761f4ed900667db2df9573b895cd10d3735abf25412a085bea6551b5d496dbaa621078edc311ca006c1078e5852ee577a739d39b4970c8a014f374eee7d11009f4dc8526f4454946c6e3a698b081c284a4b249af2e1af5c1cb8872549e4f099511d2effc6d05b9d322ffe2867af1dbeffd0470be9e8c0c4b6d1a18b139ab054ca2ab13900e2328372d11ac6caed4b8d08c8a0a4b0bd940bd79f3463c2b22155559a2e42a5c5a62839930af9bf1a34df3e4a0d0f4503ee4c9c5fd1d35ab8db475a13083db9ba889dad7bb1b01038861bfd39594c6c562db83a26ecae219fac6ee7b0575a4291909070c661272fbf788e7ca160dbdd5c489e370fb653645d78101062b21dcf2a7148dc276e30a6930d33dc48d63938034027f9e45d0d019d946b140edc694271cb1ff43310577d3819cb774501a30705533d85a2cf5c7adb91764ca98bdfe04f53ab9b21133fd2575609dc31162d7fe63a8764d6f0bfb2b1dd2fbeff61423cfaaa8028b87057e7b96cfbe10b23644f4386c725ade61198bb0dcbfa1747a94b00885832a2fbf880fc5bac7707ab82263f9c4cf26ca079609f4068b514e2d34c50f27b248b5d644508e4af9448b78142ceca74bdbed4a6b1b9b1e179049edded8abf1320d1d5cd7f388c0413e8204fc024d2be796f7e61ead7bda00f93b5891961def4294d307be6734749de12a371ba3f4ba0bcc378b524770147c8345296907c8bc2ed6f57008519690e1410a60c44af66596ae44fb27b7ec014ee0ec8e796a7dde2d343991fa7310dfb2d095b061919778dfa9527e99652da234809c56e20d5674c6da530c15f63f22b9c9f0d15091d09ec1bc88c60fb927c08387fb420505867722f3c3d8986f03ec71b55c037927c205b8ce08329871fd81f57ac0fb178586ad62d465c1eaaba9ad44ad2a41bb4be2d01a027dc7f94cef3d5025f023395f53bd1fedc37bc0977c88376946d94e863079839ce169405a5b10b6cb3d093e9af74f2e014dedbb501a93ed8225483ff7a0f79a9a04524073b2fd2d8067114fa703d48b3fbc4001afdbdd77284f1e6f9143e6d9dfe1189736566924a489e22f7eea366f62c09ac5653b9d9a34f131921e5694315d39a292a81c896aa25aee5f639c13f11bdf8dedec4916c87d6137efc74525a6d7be94ed4d46308772d30c3ebe37ae0b5c0085442653f9cdc864cfad74f735c59ee75cd2a9046cd544c6cf899e1aa8c5dfe347ed28d3d9cdab8179c026f12675ff81e678c83b7cd213e233883d3fae9f40ec1a97edfef82a0bc7c3a44d668ddc3e40b5d2d1793c8c8a4ca7293414cc3185bfe9f5cbaae07a3ed743b4c319c93ca956021d6492f3db8d9e4452d4ae78a10d8622420cd1ad4c815fc9271120f18554e513462f73e3ee6e25efab6eec87ac2507b0430ea74ecf73ecec042403eafbfc639ef25edd2c04b3e10cda2d2544c2b28b36f8e22b8589054206b04cf862815f4750493d88ee09878049793a6957324d5e4acf5b0288c541a28a7e9a5212f90ac24621f287a9d65947c3211b25cbb873778ebb2abe8f5f88d722f757771fd0bd9174c184226b999d73f5700774774685864692e9682e54a25481f7a321d8d77b85464278b7c80e31c6f133c0eeb663712c3e560297efe8fa4d2e100d65de6c9db6ba1da4e16700ceaf0b2043039ed88294bd6d9a375a63ef7576d7e47f5c2acb729140963a2353be381c2cf561c18ad782a170dac1ea21a6a6f16d4c923a400efadb7e63d28fc78febcbafaf259a59a1444821a5628d402504db9f5cc95b233145a74bf35d90337495301f4e103cac33a8e56200e434a07b30a041a3ea5982380a05c7172077f339902c6a960dc252f569cd72793aa0cd38adf9e71e8ece7e4700e2d1f408c4c3f81b250d4665eea7f6e4133506ceacfbd5c572dcace98496b646fb2e59652a69452c008f5084c084ada3afc004008b7b708d95b483ef4edac0410420821e6d88cd36bfd6a39463833563df50ca27677cde0dedddd85dbee465fb83076b5f5fd48d53955d5d89de3deca2cf7b97edb2145f820880e1d7a972442cfd8901c218430bafb06777797a70c1562237f70c20f42089d2b730533438c09efddf19dea243edcddb841f9652db4bb1acf3eef6eceeec61877b7857617b5dab67167ca67b194cf12b59cb510420821dc0fd28f8b39db06edcfd4b629f7137436e774a4774e24267fe5ac8d313ab794ce00060c1830300808060c183060c0c008c9c020221830409001c306b7c328b10cab929474c58a950c25e545437b53788a16fd8b8ae9e703fa62632f263c1da5d05ebf1b6d831620c1a984266a9a46688f492a4504f5a99491aef1737c7b22afe57f3a43ac4455a92de22e0ca4e3ef6f5a137fe12525eec245cc8205d26fa689b1d476c106f5a35245628d1d7bd9a07e6a022f1f18857024677598bd78715da1fc5b113c4d403fdd3334e83eb171ea21e68c1e7ac2b079e372363bd48eec5cd094072f7866709139b5c0b4031a59921043240b2e6198c103961bdaacfb8043cf0e26d80c256a1369206f8831c30638f4db803ca2328ea810fe2c438b0a218542684137d5465565c8804da159a15d3f2824066dd5cffcd15e6b453b8fcd5841f90b2e4386329f408b3f65ca0a194ab2c234b41765c753be280bcaf13590827eb3c649c2c74fe243fd31facb0c4c0a45d515b3068c1c26a88eba62d68cc9620d142f4aeb8a59c38589a79a185172e882c68d199660c3c8127148599da973ce9fbf9a73ce8944b3b61f0d130e46b4844123c50b46b6bcd030916424093768b2c4800237688a78c188126ad05c99e10b235cd2346beb37e9ec9d18502e501d5f2be5029ad5a5a24c959fba5480d1822a1ad6d2745a2d6fc8067577472ab8b8d7983f5a1e841052593df5008f15c2ee48059777ddc5ff72eb8707e78410c21eb241fbad49573f995ba2fc0be79c72b5ac7db8393e4adc95159175472ab8506fb81d4689cd6c4369d2f5a3d54270c26c62dab6a9a174155dfb9e3309ceea3a3694dfa8b105e030e174fa39e77411ad5a3e5fce8e04ce05949f04081de6cc3961a360d0f835e6be0c36fbf3a89bdaf114cda99a4e56bbb9089e2c282f6f1032437777f882a62da00ae554561380cdb9801cbca3335c86700d8ddbebeeaea8b3924c67dd90ad07531da81e99b7d94231566fee9cdd20f846782b886568d52c7eae52fb370666261cda262231b567efb76a6aaf19a276ffecadfac03ca806a81f101958cc202af6548d978aa981a3625e90c9cf9305fd82046921ecf989ba6f3ef6338333eb3eaf32570d433d2aa21e43614956729471aaf2a1143346135592314395ab578d500bb805840119695810031858a910be5ed5bdd34c9e7254b10191837e9bf7430c372a54a9ae90d136d54655de8f440309b4a4c004608051c4185390e00d106484785a13830bae7825a5c232541851e1a6823d70e8e779cc6254a91cd4964a4899fd8c8fe4f249021f7647ec828fe4fa6845c9570a4c2b134e881794ad9cd1c4cb6b211f10f8e7cfce93af411acac11e9c7069a005ed4fc187889a259fe883153fec563e4b8e905cb0a3ce92ab1b680a326261977ceee285c94aca2d4afc4d25f92fd60c35046a28ce47eb9e3420497bf2e71be9473d04613f152a7bb7abf9b65c04a3d41491cc09bff693f341327ffbed8bf391aaa79070b7eb65af759f0a357b4f1581d5ab91671c86fda68cda93f287ac90a30d922f3f013bb4c2b2e4cbffe1e149a5ea475453684f521f4ac159f2e7a474b5a2abafb22509edc997524ae94fa82dda027dce011adacc1ca0a1dc292212c807a21562e44398cbff480830cb3a22f83d70a8bbcf926d852cf3b76e7d96a4b64f75d3058d88da03816bd66de0437ad5ecf9f5aa29241c257bd4a33a273e20a05e7bad73021f9575ab0fdaf31fb241fe1b77a43bf097dc1328b4fa276081788c4171e80f0ed050aefdb0a3adf6dc87e6a474e5ee4adaf3203f847841f9bf1f5b8ed016c87fc01d226808edf56fdb5ef77bfdb47fd54c28d61df9a82025427cd91dad9837402cb9166d813ea854a391fd650ce3796ec299d09ed6738b30d8b8913068fcad52a9ae98336e2aaf9a26253821a1d435ae1ac82c04050d2165847f6b2f2251f9a2051fc8d8a18921d27045a42c66a490818b33c01cc1257e02aea03c9f003194a7fb96a9c8911692bfa99d5f24fcd8ef70431880b55a08eb5a3c3b3c3c54927876c2e8d20ad2442de40302cf638f7544ed3d63e1e95849db79c9f92091bff33bddb7f3f2916ae429c184ae09c64a9cc456da3bf21973fc1dce67e77d781ea9f2741fd79dd79ce7793a1f245e79de2bcff60ebf8f0e9e241d5d91ae3a7a8877506a316796e8f2253e8761a676c5d7c1c3f1b94a7cb682a64a8dcf5722ebf85512d5f19a0e8eabb742961ddfd3793e4b7a7ef5abee08c9d5d3bdb3a20697a1e7f0e8e0b67ece6f8f7a1d3a9a382bbe8e263a294de7d797adb4175f47c749f1351e8ea52b3e37b510c53eaa3ef2705c57201f688fd5f730e3433e4b7c7ccff7742bf4bc8f5f577c568acf587c28bae2b313a75921dc4447ebe1c3dfc76f6a094ce2a33b6257cf6f2a498fee885dab37ea1daf43c58dd01e1cfa3d0f0f1e1d2b3dcff7c041bf0dc3c335692fbe8a33a1bd1d9caabdd8d1f6e2afa8d06fc3f4bc773ddd7416ec6800b080a30b13a1dc4f7bf1880f3569567c9dee9ba9eea35bf75154d764e70bca5858a9bda03814fbefa7ee92152b81bfea8e600f4eb860375d4eee4912f849fc37a564f53ddd9102cecc10c6b56a0569efe7a474b5fa3e46f6b2430435a16bd29e102fe8f7a366d563c992558fee68c534b97abaa9a4e757dd11bba134c792aba75b67fdb41043a50c9ad096b5ba62b860fe8c081d661b2ec64c1bb8a38a9872aafc984c3d60d1387103125af440c59931745a84268a4d9f32cede39e764a893f381a0f67b105a3ff6fd738318b67dfce288f8d0b2f83da8ce64be7523b441fc617854fe842a3fed268fca45b6a0f16591c638c61eb6d7469681cc37722cf2cb59fb2a119a2857e1be77fcca61775287f153dab6a9138745fd749d993353ddd6059ebb7bf7b673d7716baf638412078ddb6194d8cc3cae9e422cca88fad5ceee9b581763c6c1e9dd9187d48f8a66f0a3a2dd4d685a77ffb6c71d5da26dc26eefee86a341d71af80f54d114d34e831f950634553d89e8988c282d661343691a2a9b980960cb331ab7c32d4a6c66dbeae7877e7e1c9331dbb20c85a57e007d3b36d56a678b567403faf6bc6675060ba41fd50198ab1fe8ed4b980acacc41a57ead32e2c499c10c16385e331cd9c20d0d5e5881f39474c48c530c4e4a74e144841b4b4069aa48e9fd70843e63c438c648e4ac55cbdb517f623b11ae90ece7778060dde1ed903eb09f534a39e50fa69aaa89c99fef96b783a65044d0b6d2e27efed2432a085b8a19d47f4d43edec9bd338ad51fbb94c97dee26891230739b68831c489920381345f6a80218a0b2d90717dbb748517678829630d2f6880707d5b06191d9ca8218e225a10816b4c96a42c9a1063022dae8f5f7156505115f5a81411d43c40cd3e4b11c9561f874a9d13488e302a860159a29f4ab562ec638a0806e5e0a126a00b1448d18308d28ce19a0880f0671c5dc411a5c2efa11d3467888823e5f5a2562a8a5159680b0437f9f18760a05bfd4808f181bc1f2d7464fb755677c430d05206113cbc5e2e54b7ae2c527e076f68d775f13893840b6b96f03893840b6a3695647ba3cee4114fe22cf92809d49efc222aa8ff0704791081103c398cfb914384d00fe8c73724490b7d94897c29060e21aa7c2f84168a53aadc240cf2917c4384640f224823458d12074de88a7e7f1f6217f3c3ee85a97179e743a4a45d47482e2f0913a323beffad7cbc4b72c4593d0030d40b25b054612b2df4115d494a6a21a23f3a725ac2cccb251fe38e421087052e6cc30c710b9ec4b4b0441cdfd63aba89fa87189df9a23651c5dcdd534b6214285cd86f4a89ff3006cbcbe5adbadbe5ac7676212906492e168aaae0b2e49adfdd5702e6eeee30b68f27355c66dda38f532f31d39730cb543ffed21fa11f09a185a0171af05992fdfcac5321fbf91ec6c37818dee29fbd9019daa42915f463a51502c40ea59e8da8da7f9c44fdd88914dd5653ebfa4d7056bbd6a01e2b29b9d4f03c1f5a61fe0beccabedfa845e403024cc3dfd48e52fb35d0dda9261bd42f840a996b3e9d630065a812ddd245098b73ab7f4269d58595184b0e1893667369c585d6cd94da32f2090999c5eaf3e01851fbe78eba62e08c60884924d4b351d5aa4514c467a8218c12468ce0062e492c1948841183152b4f308579a5c27ca92183f8428b68c8a6dade84a184e672546803f538af0a3b80818a5913477dc1183a3a2070986f5c3055aa07905163882cda28e142103ea6cc1912506133c30e3d4411b000f6c4f1e6cadc54d1867dd46ff79c73426f0ef512e5d2a544394a43711f57d4d4791d2e87931f0935eb3ef8506245bd447d48d55b58e8e7416514e7a86d7b89fd16440aba3d1b3516b70dc37c7bdfb68e48e382b49c686d13b5eacf1ef3971a962202fd3b0589dae3566beb2c8a1e2b602925fb17de957559faf9c5b829e34165375faad629316f68a82b7e23a57275d8fdf4db8f2ff7b16d19bd779ce0f7f829ff8a97620bb405fae0ce3a64233428f8e1852ebab4c084a4440abad8d2c4451156dce0d0bdbde11b659e2084107eec69837e35f2a10d7c80a1cd95366450e207577ce326cd1a295e2478c3c515bf159f286a9147d207494668aaf1374638860c3562ce96316ac88863d438452c0eb16be3bb61468d6b6a6c63552ba0fdfc1b31301c05c512c6658a88f12b7e71410f396d1851635d316d08b1ab86b640df12200d7d9a3df64cb2ce87b167e2c34ae4910fcbce871ff5eb8a9d12edc8875ffebab4ce87bb24db6b59938d9b1c8a421a052da13df850f39ce59f7547482e9f88619fbd12ecb38f9f652fbba3f9d91fb9b49e2b6c9fbafd0c0c1352800dc2fef31fcdc206b040b05f4c04c65e08111715add4a065ac185088a9d82f6351310c48032994ea7cd042df863d56577e7c25f26387e452123ff5db2b49fdd61d65e93ff281bffdba529d0ffc9c5f57774a747c5c3a9d0fec92d0d7316a0d23722367619f837d0aa351d01fed610f3ba0f6b02fa282f273b0866e75fb519c13f89d32c273540df546b247755cb5ee838f0257d4cf47aaa8d9750dcdea6f5cd48fbdce0aa13e141ffb950f49df226dd062e43eae5006ad9b77aad722eaa1ecebf1ffffff9aff3f6c01536d7356ac6aed90551a73aaeaeedf099c46fd762a1458e7066d33cc02397611af43f7a2dddea8bbe7ac7d2a045d777767223928ffc6cc084df2e8545b373f9fae7005fb97f6fb94db72b3dba91f507ffe3de1e7750a0dfeebdb2c9d650d5162ef47516210eb607bb05b1983f07729a1c3658e1246b9454620b0599029248d002e9bdc86d85d2931397fd7c3fe0c2633df0582cd5fee1821338a8b6677852c245998de1d3df3da5cb4a80d9522021fb55ad35ec52d1a8181f8ec10a0856e237051b640fa37a8f78b22b17a3757f0ea4b57b3d522aa3d89e0c0954e9a131a1b6dec80b5692389cba43a53436132878729da2b850695195046b8d95a138d1795ac45d40a42c4b4457333656691846a4d336ac05a44ad2044645ed9ec42ce3655d410c7a42932860d46db78b90116a9428d6ccd2c548e1c6166b6018286225828b5d961ca112c4d6da8c870c4082567ed7c951c3a2570d2217bc249860d0e9575a9709292ad200c383284a1861961b499707b89a80d2a5f970a31beb8e1eede6b5435e14655abec47d3e28caab8c94d46aa5a651ed566fce1082355c595c4bc72accc1847e608b9a8198890ce3ee33c676d10ff605b7351fc7d48557185610ea1670e9d4e38e174aa6a200c76dc2815d222e29a43c5ac72dc39e2e1af51c46423ce0e47e6620d2d15a8c6b8461635b281449033af0ae1a76ad5ef67881a4154ff951a6f544f638ceafe500c7d2f75ad6caa2722ba48e39586172b2a74432388da0f1b8d39e8fc56627b6a03c3106d5e991b67bcc99183c6ba62ce6063c6339caa3c71c6143b40b174069727b0386b2756468e1a2f488a01d51107c34275b0c9a1f2450643192bc828e3022b28d592415d2ace541943f3bc67ea40402a95a6d36b30005842c758625e5962a81411c658b2f4ef07d0a7b38ec5a21f06d2ffa52a7ce83db9aed8165131f236a7a72aff0fa0d6e167b88a5c8a48fc540873b55bddbddd66821618aececececededdb641bc687013eff373133721713fbbe1a7faf5eb01eb6237ce72fda0417797f584c4722e38a1cd16a2aa1d6aecf0626eb17137eb9deec18c0514e2dd3768f3d21a815e8e9e3ca9faf3e8c293eafeba3b691395a1baa8f98c8d4117353703917277623242e8103afdc1a15b81307e002294623561b7cfe384c74a0f3bfdf117841d2c0213f501618713f8aaba9d0f125595afaab2ebc67727f16167642b0d708bb183dcd4cab29d4e2d775bac10a8798c8675dfdc08b4f521578c9115376880e7435ce742822c706f2d94ad07c320c12628bb62d357e11ad068db4273072081183b8ecc5fd81021e4f52243e6106832d26e41132659b051701311b55a9ef73fe5b343ac635ea0865c6a44a1bae6a25eefce5916a30747012e4bb7dbed116fdb7aa769da131e273c3e68db423e24e58577c9edc01985dacf31767183dce5dd413ba7c1a2e9b873e42cf021cb3f72ce1cd871ce417bc98fc9d8bdd65e798b579f225d35e77cfcb7fa14e1769697a1b497f2151a5724c88c45e3df4e27566d19c25891207f60b9c89deb9ac39cc345bbde39a9544a056d8164ece8e21d24c745535c0010b5bc89b1d00280475d9ed87ec04572ce2ef2c4be33785f20b1f3daf3f8710268fdf0bc1f1f7cf93caf3537da24dbe0e78804000019fcf8f8e8b1eae1c1a3daa16387eae4a4360d954d6c837a837a833668838af0376aef18a9bbcf68cd45dc707e57cd6bf5ba5f0675c523a73e1cea71917c8fcbe20054ff8c99bb0ffb9efccd1fbdf67c76adf69cbb275fb1efff3cac621f5f9b7276ccb5f7a3259780415a47cc8c60f4016cb11065afbfb32fa7ea2cab7378a2d023ede57cd044f4579fcd1cd71b03ce50fe7666e69ede0ffb218410b653f17aaaf2fb2917c2147453440e300455b5d7d5cba00cfd5a435af2bf7dffdde7b8deff01ea187006a8dbeefdc92e551466572941f0a0c6ee84759883e6eeec7c250e487ff88206c1d4575a3ec4e88315c21495cd4e192952b96a9a94520629214893f620c729e24b8e3fedad36ae179b1fae17e1dc680b9ce0b0108d53f7fbc5a3a73adde72d8c85ad740858885fec7dfc8a5397e7771786de3e0c8a47b6bb3bbf9eda4bcef29f3bba6feae87668d764c0e04dcd72c7b2a258a094104229259452a23a6772266722a3fa3b161f8249cefa5fad28752c15b5e5f452759e835229331486611986c2b0a63a391b0af53c29140cc3c12fedc1a5f6fc61920fc12e30a9ba3355e7f8d84bc852f253170d76e96017d8853b4cc5c12ece626acf999fda0bf3052e7dfcd4a57a6fe577da691e6268f1578345c45f35cbdf55b03d3837da86b6401b47dd127ae87dfcd2df6c5aa0490bc14ffdb730d834948eadc0160d6120fe6ba4e2f13dbfe37bfcbe0f8e99ba03a746cd61daf37ff71f6202adf4773a56cae99e704d0df127fe9975fc85bdc88ebbb4e75c6583fc89b0d06fd354e9e1d8d56365811e15c7ae68016e2e0fc7a92278c6d06fd3b454dcba3668c00eee97c53189094f4f4f16685242934e673078307b6f624059363108b45e731cc1686909b679b1941ddbaf9bbabb6b66c9bdead1d5efe058a93bf02bcec459feab0cf3cc488fad0041bf65a21cbb74ec300ca1bda5dcba583e4c85a0c4adfb0272a0df3225d920fe14b7ae2bb46c9cd16efc147cb58acfc48cec224cc29f31f63f197bd85e3769d6ca029c16740bb269c0d02f88d16a452977ff907db2c2da0f16dd0dbba593169528ff17a4eef31841f9f78568a0bcc206edeff04299b90c4df5441bab2c0200bad06fc308a19f57cbcc50fbbdfe1f2d340217c5ef9f8017ba635af05251bf5f06cc63fb2f27f59fd41efbafe34f1f4a759eb37aeae7d59efacd1ab9ae9c2a220125be301007c0a147b8683ec78ca7669f07b5833220d947ce1748d67dd90241fd2e902f3e3b898f71457549187086c6eec9d7ecf98d68504fd839e2d4f95f57b3c75ecb600bf99313788efa040559510fa5eb091e5454c71bc49183d503ab0a6555b7f5a33deebc1f45f6cbcb85aaa49641774c94d7b792b4d08e89f2fa81c509d518131af41f2929ef7c80a15e774c0b6aeab6a932870a0503a1a762ddf781a006c08ec988bef1b7830eabcff61c428fd081ea07abd7095481807668f5db7aaa15226a0ffec60eea00aa51772a705882d11950fee6d0a17bdca87cf79dfa6dd53f0eecec54ba427627dcf5e1a9db95a0727fa3c508e516239498ef622bbf4608172edcf64b578980d0dde1730bd70337f4db34f6d546598cb6ad692ec8c7ba25266527bfb90821bf9cf54785cfdeddddd093d0166848f5213db425413798543fdc0487058eda02470cf5db326e7c519b39c2ae3df42eff20442bc4eb37a30c46babbf755677b2f67d298e9fbd5ddaf97bff8054568722cedf96b83fc75e0401d0917a23dffa21f2873b1431180ce2fff8f5f29ac90ee9834413b0a6f0c7bc3ee006f30daa52b4f520524bc12944801ce871797849be85a71654bfdb6ad8456e57742e31768d71533c70e957f73bce8d4352385e9dddd9de757c52171a57eabad9f6785706daad26139b5a90dea653173b099db0a51b51777b6f6aaaabdee21dadd06259c12ce2825dc0a21a44f908835645495aaae983356308e8cc9082144651a4d11c9620e9d7383304783de0f4aa7c7cd35f788798a08f6fe3162314620777777777777e71afd638d3e975256643d84daf16c87d651bdd4fcddefdd3d89fc3abe0dd47e47a163ece80671a0f667c26ae50dd8a0c63fc21c86c3701866989371a0c29f90a7ca9ddda990fb385083d07668fb19ffe3ea7eac0dea2260eb3433af9ded1d3ba36571cac82ed5134830d2aa279860426d8e2b84903e2519a109942db34ecbc64df58fa37f22754b2bb405daaada35e2d51352f852a8fd306e310ee524a9fe075197eabd65855a9ac3cb13afa5fab576303773ed1f5eb5fa796f7b82aa7e1e28cefa68e58005d4eb1358bf6d1241a79b5b6a0a4b00c8a03b4f4f26b490acfe32d5807ee8316584bfbf490b7dcfb56afcf8be587c68eb56d0664a89d6f93c605d48aeadcba67407feebf259b2ada07d4bd0edfbbb15deb530b53b1ffe15a6d4cf0726b9a9dcf9c00e8458e17f3b6a6abf5769afbb0d23c2458ddd96022176304b9a9d638594124208657cf8647b557f4d3ad11f8f3f4898a51f955b44bbb4bdd45fd809ee2dde5d7c0832813f534b62b7ce6aeee32e95e9066d3781d1164848dd5e755fe366869ad294cd8c13c306f2efde283bba41f453d5869dcf22d5d6d643deebf58af2f47ab97ce9f5aa100c6d81340ffed7d90281485c298f28b4e706417fd6d275813aa51cac7cf3fb2cec52e3eb4441bf9210bf49fc244c7ca44cd243dc9209474e35fec6fda2c6f892cdb189f8dbf4f25c317e2b3e51fc8fef454da80c07a01e301f5b01f5d9c7a718e7a3244375d359d8ec922c8acbbac5ba0914bb3136da938702f4496eab1016d47b14d1c50b4754a18317585cfd6ec687168d2f26d88189386858430757bf2f79986d1e51e8be5137f16f85ad9af88475df8f9ff8a48a4fdb17a476f7a37e419847c94a1cdd23448ac912ed39750213a7daefb96112cd38ab3fc947094aa2baf8e4ac4e2de1d492df5412d474968f92f9d9ec56c9f613c9153f4aa5da52a987762cbd5eaf284bb4d0d28ed981093a7d12091c7ca89fec72839afac92f527e52b2c79fddd1fcad9bceda3eeb8eb2df3e99f4c9576df8c5a72a45eb5addca59fc14bbc425b652fb9daa9acf977c94cc75d607936a679c8f92ec084e792497b61ddda0cf979efa6974b3a2dffe54bff8f4e443eb8a6e5e53a495daef4b3b4ef4eb2795641438a4400aa630b4d0620957bf1c8115686e40c306347870e3ea97d28c2fedf5139c43c1407a89c78bf2ef7fbef4b49385b67154fe7df8439aca1d94e6e7caddb7c20e69eb43be440606a79f15138599a245067ad4cae2621ace20e2e53a6261aee1eacea83be0dfeee01be25276fd58a8b0a80a2e48cc42379bc1a26cd82aac6584de8d21411a02d41d73c31b55ab3bc6063196da8ac9c4b2a1e403d39b338e50f2a18c2d8698420b0f60d4d02253d062b0d0d2840c5a9061020251506103831a3d807145b6c407d2c4816304555041061b03cc0005991b74c84189329a123dac597a52e20c192650810abac812031733520cf1e68d73d93625b882ca171738f1104601c200c28c31a260d2c28d4e42c99a256e4803c7951cd6984026098b2d6c00834a1623b02d61ca30c1658b0c3dc440870c336b740942a987376fa4b42059f9020ba62f51e658810a160d3450c439020e37d69cf12607056bb4b0914605693c69d980c98628ae8800872b6ca0b2ec531063a0a04a96297698b2e4498832d06c51f306198884059444d066881896a8e18b098080e1cd1b6ba0b9c10d37f1040be042658e26c880f3031b484bbcb2a8210a982698f0c28dce113923e0028e0b42a0e00d30ad25ca34e9b0650a20cabc9102345f7cf14402373940e1466c459c58810f5c3841840d583680c50239d4f094022daab0c1c6f57d0f1468c06813c6143659b8f85b61dec0401c827ff927ff0a889716328c89411537102163116ac010011a5abe84294302d7fe365941d7fe66201291c6154a6bc081628e18a4884320255d01430d9935719e102206304a63584185046f387d65a238910233b404a1446b663d5d93c8956519a7fde4506fe41a87e24cc8e683207b0ef6b766ddd61664c345ddccbd41e84fba42e95ac47c6d5b5dd01d33c3963a4606a7b95195927eb9e6afc6536611f33f7f0cb697bd91a750a17c4cbe74327fc77ca39e1de4c125d6b110bb5672561f65897fc4823f16336807bcae66275e8781294bfcd57ad37ccb827de49e2081eb45159ec854ec906455d338e6b64e4a243bd599a4362d83ff18375fe3a4681b27657b97bfaedd0db07f23dfb87569dfaab664a1fac3ece3cc3a4d4aced253ce19e315ada97d7b703ec1e637f56afb3820fbf94cb28ec98ae08413286a2a920bc9d51827057b2a65be085fd013d6cdba7e37e887ff13040e52183bd6ffffd8af908d2f68dbd96ecf66fdd8a00d74a050ac68eb4359b22cf2618c48626d25bcac181bceccff840ffb8c9392c5dfdd00a97617418aeb6aee63019b1d0a5d313f8210c3b00ee6a02d5016cfc2efdc932e43a11296dd9c4ca6643981a83a81e215be57915c48e2771f4b91ff429613882a14affe7337e87736f2c87d10841dbcbb1d73608742576780cfe1ce80e95ce45950e8eadea5e6e482c8c6d0df1f765d867a7dc2f59b4438c60d8a31092fecdc6d4ee2c3baf58b980facd8238148209c5d31e9d87bc59e705d21f01785aef13b769281f4af93f8987cc25572b0eb9c7446b66e743834249165f42748a08c48207c2dc2ed27dc0c165896bda06b068b5daf0147f1dba1ac6a4c3560850a7f8210bfbb0f367f3fc120037a7eeecf80d8b5f654378e0bec10aac95910b5c57af0c97c27f2a11ebffa6fbff0d1f33f3fdcba34ee048e5dcc6dcdd9d413fe4944ebc1f5fc8afbf9f8a49fa1cc13788e4a515fda83a8a5f6607328cc4a5f5b120289462db141f02987526a0f3e6a0b9417d4930fa1be340ba252b02c8862aad91bf58e376a4debad534476500ee506154785ac4f9392844a22484adf3a4d1f28367e18b5c606c147a5b140722aed504f1b04dfc719ca1f7d70abdf5497b04e75a74359690f7e0f97fd70599755b6f46554ea0fb7ae1e8e5d9bcaa86c104425b5077f0787aad21efc8ce3ea835b17072da0d963bffda7a5a9f07ddec7c3ffb22d15f5d4a454e16b695a88d5686c5a08f5cc5a155b34951848530be978f85a9916daf1f035333ed4f3f035a615b23383d0c8a09e506ca0e24035398fff260faac9ff5bd50fd554e1675b7ce8e7e1675d322f3d94c1c3cfbef410001efed40ff554bf6c4b850f004e939241732837ed8076fd74a82767fdb4417dba75968f2fa342254bb24295aaaafb565460a9f0630fa7997116fc1d9c564607a73529719156c502810f9f4c109f26a5c29d4e63da2088eac1a1d868541ccd821f001dd83c55f8d9abe14f362d441ffe7ceaa11e0f7fbae9a1d543edbf6c4a859f7a1d5cceef703aaf715ba7125c302a4fa50abf2944853a6fd49faa3297aa91e3ca4b50f894ebc1adb8ad5923a47ab826261c21e23e6043c6d69e7634a5415ba0a10c945eaf5714d7ff2082b0a5833119611bb308575318ed485241e68525170ba82dacb8b2f880c0023392fb06b540f78d687507a349a8f4cd76443d0a15aa8108000000a3140020200c0a0684228148302255a7493c14800b7d94407a5c9849844910c3288a41c61843882184004088010619221b16870fb4ffe529feced52916399bcfda306dfcf2877e0e5e74d3066232ffa8d05950ed614abceda267404d96f1ff31198a71c63fb9c7a9a7241a195f09aca5616ddc7d647ddf330ee7eca9cf59dc87d19afa82797e7390da1190e84dffe2273659add410764805d3d1e68606d750f90270e7519a9a56a0d626b76c210fa69a5dbd5e032179bd3ee2ba1e4650868a871fe89373fa27e681401c1df22a02604e9440fd5ba547c02bca68004960637eeb3512e58da96c7e03c6b8306dd65d4f5c15597f294f3f18fd1a2b5fe3471391dafd5788a719004b7f31bb1794b1a2237136f5a24639b069ddcfff7cdf89b74e75d3941ff55a372df63556b6aaf7be6fbb59839bf6c08c2854cb03b8d8617bc57923757e7cb987fc46c9b7f531c71b0bf00f7c37be9539bec3e1744cc51e32fa66dc4efd91448120223ca6f6049d75042d015585d86b5c9353cadb4951e2b1e6c8c892904e3702a1a46c1df5d5219692990b55b2d7cc6adf96eee52dc568176f39fc698897598882872d42971ebf66297ea77440185b1b02ee3c5049ca1bd15db88da2748520ff86296e5836ee7e6a94c00920d081216fb8e86c25c665830ee5752d030388a1106fa97f8d402ce113e6f6a86af8791276aa0190ea5ee3f14a625eebf5fb5577b495b3d6b304335c6909908436045b1268c704dac71d76571faf42df36a57e1c6278acd584efe52fd9526d8ad5ec6a01ee0ad3f1e2fa06c83a024941784b7804b4a647fb9199e58dba69a7c9b24549e4f319df27fe9e44ac1e79d4a9c898b21e736d1632eaa8d6ef7c904a37ab5e262f619e628a1d9806a477513c87aeb70befe071eafd814156d9c2506386228913c4e34cbf4a0c132e97095c8cccedeab2bbf1ad6eec20e6a159a7f58260e1f681d986671526a971c79e489b93e8c2f0484704d792f90ccf03c7cd9a25946b82c1c6e59a44f66c5f7c962b683ce8b8aee2616ea362fb0215517300fd6fc06ef2abea2eb84816fadc2a84a9492b23b30f3542cab3cb33f92612064cc1c8cb1d9f804655a9da7a17937c2b6e2eaa7c060ff41e8e4e2150c7e8c64a67f0443e0188ec58b94a29cda0a844ff0048f48e05317ccd4f403fa13d5530dba9f3a8e31064e76e3c1c08fbfba85c2fa4e38bfab7bcb11ea68869d2edcdbdb43f87c1a10de06faf9f9b3bec19d4951031a47943abba8fa10df771f3c194b6ed70d45a19be70995adf3688b8622494fecaa24432ea6ff281cccca28ccc3ffbac0d089049cfd2f9aacf1b3a4019b0e06c2773a63f787a69bbd83bd25efbd0bebaca88a2db1ca7b9e297a2763d6df96cef12742864e2f8bc3f2cd843dafd09e9d9ddc5ad8b55ab79289c7bd554881d024e58cd225017f7d1e6a2af24d1b706b35fb9f157ad0af3c2c9babe7386a016b2fdd7d536662cea9767da61b1599a6b75b2fef73f5b3514a4fc766657089dc40a15ec7434840d6b108948bccaf4e00dff07bb88a3c47793f1297e92ae59b3860c9c032175af892fc52b96242cb57faf251804464995398882db1fcfd03a4e57479352c7d6179611296a2261a85fb19a6361c851670b3e1c965897b1fd736c3b292c5ba33f74920f4199e3db01b35414c4825bf7e9623cc683b693a671316a837e279ead9196f97534b9db67e8df2898808dd991f963539131c384c683b90dbbe37c0a881316c31792bddbcc86ba0ab00fe1dfab19eabdc4c1088f7bf380184820a6145505a7c94d1862664f4cbb97e789927e681a4217544f1a0acf3a5aaf0c1d8bf76408891edfa0f0324ffbd067ebee90d6d46e4e5622df4bd17bf0a7fea73af0f10f7e2554afa603d3848baa678c079f64b599127bcb6d473f50a3140cbd3e0798305286188c278e7ef591a9a41d0d26f1e02fc4550de54cfb81df86b5674077144a47ec6ec131110498de7c2092c22309b61d1efcc7a5453c655d98eee54b48b2e991c54be3bbfc984781d743c40747c9ba82486102db7f4c77f99eeada80ffa86071545945541a8fd2baa43279aea53d712b9f81677474ec427ada2a72163bc6921bf2972ac6b3e53eaf14a2abe3030daaca71236de58613f35bb1dac70197bb16fdb8ba904efd889cc5ce8825656e60e3490beb6270ebb044f3b2e61c43ada2c04db518051eb2fde7f8d00d4ecc2d3a32c1da6ed19f56c2c6f9ab8a4568ff39bb15bad52186669a6addceda2b0574f50f5acfdc88ed58a861fad16260d58a3dd4580136a49f5a4c62cb7dcc8ad6aa214a13620c278089046634d4631037e60e161d029935131fe365bdc0a7384111826d6ea86f68e09caa1b1661cd3467e2c93753838912f64f00b928378cf19c1112c8ee18f8163c821373d9c03fa1ce837fc2975ff1af9aeccf3ef78778f7bcdf656df210a9c5f5d71ab823f85945f18a4b9e443d9a5c1f00d07ab1a04af61b113c2477093c870ed79fad91716336c547ddeef6dd54ca063ebc5a354e7b2edf56108f4c912d310c2c4425cc0e22d0c9cc33c98402a893541eeabbbfeb53ff6219c114b85b18d6c039757cbc90127b19023eac261f124d6299230252aa4228e755146e8d37a61e8e945c94f25ac8044571ecf683d7f4fa55ba23259931e34d96a0837d8b334613d703acc335ebd1f7bf1a449c0efc3e387667b81614a501a1d633bbb42b01d21137447563b9f889c25b83fa598e2bd268394c7ff79e5bebfaeedc28881f4a2b1a2520c47f0755aa45ed8919ec6c2eecd49ac822d648bba813ec0e0ca6d2b75e735c4abe2cf8f6043c84cec02d2e95c5303a9ae0b179537514068bc2db75ad70a123570209942d23249097e131b67e6355e19bc5db06644cae7a98dd3ddc9a684886af440db49cbb5f6fbeeaf21f968c1504c89db61cd2c787f2fb5a336e3a0d42fe7895988af6fb2adcc1b3567c484859b2b0e47e03ad5f6590bcf3507864df7fa9042db4c976111a1ac1c3886fd19f369896c6c27368a2a4c25d03a44e085a1dc854cf0ca85ee280ea893ef16299e603da305d1a5e34671847108768d691da278ba6cc835c6b6eb2d6c91bb4b077f016965027322e8523253d7e075b348661fa25df117e10f5c950776eadc2942cb69d2ab9d14a5e3292fcdfc9c022123c5a4e770175fa4bc4cd828da814653cfa9936e654e25724496fc86cecd1a1277ff874245a57365b96067ce5ea0b017f94563267caab6101fb3c3e1fb7dca800906d8a28923b3e20d3858e60772a50fb24053f2130d42195c36d3271dcac568457e4f0584a319d14d970e398d7d61b15c30db16abb015526c45e766fd5449b49e6f8ab88f8639a7b6e9d63bd8a37212b9f765b8ef83c0d8952b8152f5de8d23ed8a3983706e39c7b6c328a7af57942bb8ae738a1410b7621cfe8340dbd97cdf5e767c61c032966865654153baa6b4319744f52bc2da3c42b3017fd3e33e2968b707c1d93fee5c97f55940c4363389d922750831365960c9af70290b5ae531e77ed1cdb93a3417079b07fd662dfa1726a779c6960486210dcc3e69469811983e88c0e453b1b323b2320d059b6061177dd0f8c80cff48c4433dcf97acd138c888554b42ce18db4c883dfe2681c30b56985fafd3f9eb3fd65177f8f1c1113c9670d43024b44ccff23d3bd8eb628b681500ed6ac0930780f92e4bbb33379844051aa3bb07c15bcc3f04149f84cae4ecd3bef8a904e25c31f63fbaecbd1d1046c7c917b181cfa371d28b8e9e199f1f09d3fa4c301025165fc821ca5514bb4af5fa45870118556257558ea2c6d5316fe43fb13038e4b91b7c117b6d0d534105f588a18f516b2b861e6d8b08d3e2867b6c62f32b0e060a14ea54a5b520f9e711fd0102634523dcbfd44259295a5ac9e6437282bfb52b80acec827c2784a349398000a33cec9d5d6a2a38d12a553a35d4f8f7ae6a5daeca90225f3094e2347ee41821d73a86991f40446548db6d2685802deac54aab75832b049c284f9798da180caa2e4e660642dda61ebfad7cbeb9fa9fda268b94d3500a6a163968b4fc31ffa330d6fce8967dd6746bf809beba2cdbf1c948bc35f07879100b18694f2aa93e0709d3afbadb1f2d221e62976a13e02c6433d41a2f6b75a2bd64e3efdab9d932a792e4ad724e6370569537c0f4b04db557dc0485e4aca7f6df320911a7d30152fb995eb02300e74a906af34db763dd82a360fab02ace7102658fb20bd8622db9617b6998d812347dac23230b16a2c072e6b5b742644173988587463752b66ebda5a0f0e287488290b1ffd2c0d4850be493becf3dea504a79ac9c0af6e3111d2178f7e1e01d6651554aefe678ae43a3409311ba0e90685b1017fe515cad4be4f882796de10aa7b290596f4839ada264735d1b83cafe8a2d9da579c32691b11915b07f3cf8a7c819096cf43ab387a4d902ac36dd650bbf755ad9bcee3c5d4c050976989932e05598b4da951934d9b8ab5e065ad4657779b690e35795c5dc44ff5d146c254074081c09ff4d36ced3af820b8b9077507d677aebf4c30d426329864bfd18b4f36a3a7d98a5be59be2c0bb2fd87f5fe8f019495c6cf2096173860fe609713417f0c3af67be3a2767959f429f8ed688d21ef9a4d334978f00b4e3c518ba82aaf227a36e6f8d482239949ff56cffc80b69861bd773cd15972e24e5180ea923e6a88d1e07b5b538abe1e4486fb6dd20aec9596f047f1f46115426e7a9a2725f70426d1917642ca2193d0ffb5cf541ce4f7131bc95a35f47c2169f0b2695a95ee3c481987564ca52a14d6f0135cc534893ba11c8c6e375e9a016cc40ce37fed2d6bd628c87f582bc8ceff811a413475b523b98a5c5a82d61d2ab0cbe9ce245998e6cc26c22af21d54da2d41224525416d7b63d942e68df9ad11f338af6de58e98133ac57144865fe071acde89b85d1816d2845db54a95b8d0250f1127595934d8154bf751affc1875d2e73f44eb2d64bc909702b1d47848778c9bf1f72b77176bea49db697f6faf58c8ff179a0950f21831115884dbdb9ffb937bdf0cf26944d06cfe50df826c2f24dcc7ca3b125e4f06a011a21a91af6507a65296a62e03bbe7492739d68ecb7e438c2b66fed45c34b23823ce2117981db8d45faa9e7fcfe07428507f498e2b16d24c738b1016aa502f2d5a6bfec68db7ace02c9431476a4c1d12dd28e7bf397cc2a5d0597058bcb6955a0846327d6f6cfbf0d426a78d544481458bba09ab91e0b431cee03d23ae77eab2bd1f68d033fb207af1ff7896f75c54f5e5ac2914dffdd3277eb09011f2fe87fa0b4687d069234d89ca6e79a2778d180e2eafe9c7bb5343664bbc67fbc76496a8045c945ea8ec2b7bf0fd054262811f0e0989d0e05e3e92abacac5b62bed090c266420217c25717daa7801fa129e4eee41746a76c568b1fa171b284ec91d29ad484a457451412a5ce7bff4f7845d8183bcd5cb7a05be11ecfd81cc1f3aa1e21d438e45fe2b15ac022afc03b40cb5b223d3772745ad00526d9b87355ab8bc65cd3746a01d3a0b05f5fce0f960e03c2b8fd573035f22d8196e321c16e6867457213afbf7a9af1ee559500beaa8abdfee90bb49d7fd1f40fa24b17949f2387d83c21180621bd00c212e484cf9dc6ba6de39a765b3546afe020d888ce975e816502baf7b788071d759ca2fbc770bbd6ac636b6d846d1fa9ad00dcaa30284ed54332d1d72bf16521fc00b1477fd68de1e5760a552a50e5a1765686dbc0ae61b20567c6c4c8cf88800adb8def80a389dfc9852d309d77d3c0c9fd6b6d666de09876d2dade895e485cbced61a7eb3d9c4e043ed6613913aa3d18895c25f75bb636ac2f8e43448ac5833a3c0e51400c1a611c23459c37746861d7d5c0eef00368d9c618f0883757e87b943c524c6dd01e54731b43afab4e8fb9e82a9d3c3229051ac4bd92da384531a0348e35caf8f9853eac34049ea0758218f231a87a6d71947e01ed5a317c255f94c3dd59263682be185dc4956b2eb6549f325eee8d7ac270407ca3b6d5c7eb0dbc3a5a6ec0ba94dd6a077552030c45cbb7480190013ef8bf82deed6887269fbad03a54091e3754b21cf14c121a18e123f248bbbd65e2113cc535e8290104739b03d6b659370920d488ac5238e0fc87b8cc87a8ee28bdbe877ee3eb28ddb369382b7490468ed9d5e0697698b704bf0327f659e5ae1f282d30055bb1ae4839c96c73b5403fd0b1c1bc63e3a895d7ffa161627cf08ce909bf604fe0d5f077917601803ff6f49ac831070163fb9747300251e7999b4fe764c04cacdea1c90be3b2172b827bb41dc07cbc41864a6e2b39120d7cb2e667932157ee5a064b330a4c0b742b9083c77b1eb51e4f40ad9a6ddd0bfbaf6168e620d25b25a24d915c3f6e382a4c0f15d9dd949d2d4b1b1ca4cdda397ba275f44b45516b21a614ae8052d2ce1adc0e30a97947c236ca5b6732bca12625615bc760177fd49283417285e5f14d12f648e8c89604609e22de3d4cc7dc178b5e0c13153d0bbd5b4e8c9b9a08262e10faa3039d9bd69bd5000b17fc591f574d08ef30f8cd5aacb88eeaa339829c307f0203f6460eda0cb41fa0f11179f1c40fb153a2e3ac6bf052068832d6766879500bfebf2bc64ca0c5c30bdfa4ebd0e9e682a2868386cf5ec39296a6c3883b7cdb51112bc439741f6a5f10e613ea114f0e14f5974f33b463f144365b5e64cc6892dc0672d4da4abb0de8d057082cb644acca95a473e58c2a85f87b89bbd5ec73528c654e72315686308eb8281e7a594bbe6b5f68381a20968920c0ffdbf9694af421764bd82f755e78a254c8deb9f7e34521fd9f2416551810663e9ffb30662700d78b831e2d44d2319ee539d57230a68dcc929e9b9921ad4f46cfef46805ff44fe4604253ec881482a462ad40ddf45d97f8191b3e20f1e01235daba715f7a8015179aa6586563bc6b5b3a2af8de950959be90e1d4ff3c54c6b4dd7ec8f16f73842966e3406f73a5aed03b74cb0810642569c69c77bfa0d753e79bd49b7efebba54b8d2aacafa4d5361bed108163594d4f43758c7a8284bbd98e84955a11f4d288389f423e0706706c957cb33f3dca24c1f85f8eef75faa223310aa0e7f93897fb8c91b2a06dc44c3ede517dba34315fda4596acef95c9f9009a0e9141f3920934a4448600e28f70ca941d36c3b5c4ab724c2d0d052fe0afe33ab0570eeb538376ec87a2cd92561c6a427ce542ee8ecf37833f99d4283a168d965815c4c62b43dc2cd90068e850a7dc0cf5754d9136243ce4b1c731863751f98162d8010895e64271d026208c4ca4858d152b5c083876cd12731dfeef1df28a52ed4158c5be81ea1ff6012e2f7ef44a317b4918940d05c301146c1cb4b60db0099449c94849eac135efe30abfdf441d8a62eaed71493c1846fe5ac0e6d16e6984bd5ffbe5fc1fecd9c9b394f9f0fff96386d3f1cee0cd3c6e2c77c86cba967f86617e5503c2011c2ac58843ee2f03e875026849de3db699f650c45981c9672b62f9c52f4fbb140f450f041d162e14d000bd82786fb3a8f34915365ec212fe1eff1f4d781bf40c75239e435404b505c2e91ed2a34917a2ccbf21bacda60aede75022ab09437c6ca9d2a97b561ab083adcfe8394f306e071279c97e0bf04781881ed13fcd8b2057619c8f49c53fe305a5c3025461278334148bfc9234f0dab0a336274f6aec315adf91bf0e0a3ef77ef5fcf74e6e34383512987d51fa0e178faf5fc7c4d554d53b8e800066c796b3061a4cfc6e3f8b2f76a5d066770f5b5ae819c435452f72b1f6894184fd241133fb1fba788fc03e8767bc9faf42500b44ba02b1a41860c049a9e11660be1b1fdc11f490dbbbb8ce17c04f4b75dda5a25c77c60d1372cf202828d4d00ba8333066f244a155f22f3e6d954eff0c863c921a4c92a56563f0b282021f10e47682551883737a2f341148e54c44eb88831992579af30cf12e78dbbd14c942615d59051d3336ebcbd5a26fa58a48f4dfe1743a5cef32e6b58ee6c723a4ddb6c9db978847e7d491006701186d807e60eb5b0e8d5895fe74be6427d9a85b86eea25a8530755fafa5fa1b7b2d87c103099f05414d01585a2730d584eb7a78aea6b9e2b1e85b1624af1222669040a28ef04945c7734cc4ff8239dcf4ec9dec873e2969abcaf486bba42adaed9764ca80bfbd22bdaf9e56744e735bce12a7db9505e0589eac39b8cd8349b90ceb2e95343dd91e6ea9e98736150dbbe337c15308cc9e4867723172c122600518f2c7975a365215832c2320b88479fc3e4a9d70cb5284553bd6e8027e62ba7514e7d125a370ca932ae40e0f8e011ce0db5e4bf402ec03fe0626804c3a9c0979ed94d096dc203404a990781df2e4ada719ab671a2a9feb6294385c1d470bcc39ac1327ad55a46163cce2652b3c40daed94e6dfcfa34f51b12db03a901f7eecdf3d3571b6fb22a39684ece106592ac6adcaa755a7cc28a20a22656547b84b52b24ffd12bd8771ef5706b36ecff20180dd900a201dba17627f6443c617bd9c3ce2b15d8b2db6c24191064a33ee8cf5080a042c09f167b29f9ed189fcad805236bbfdf01affdd6e441aef6cef2ec69996464959f4964e051fe80b18281e26370b635d015a636190fb9973aa837b2143c0bf0ba2fd389dd7713b5fdd377ec4d05dd623a039b207c8d36677e3cde7a49b4589d7d88c81e9b6cda23c33fdc0d440c6559fb1cd4856f1735b8a5cb83205b0bd10035caeb5fc442a6c4102dbdee3df092b8ff744f7fd32eafd74103236ba219d8111d2207e05b65960c94a3a29628f13fb2244b7c6ac73958ce8be3c0e6a7674462ac2c43dc4624c2f2b3981e9f75dd4551ecb64e2ac24d765fa1208d5dfe3102db5c8c755468b5ce4c0e041439297611073f8a5044d9dc35a17c54ad288e87ec1bc5a1d146190a69e8532c868d7fad6cccc5d21fd074351af014214343b70543d60130ca5bc75ce3d9899038d6ee5bcf2167e9623444fe069875f80189f88923e9861bbb3a03cc6274c3e8e4c03552ba9c7aedcba3a9714ac5ba5536fa239d062b5417687e4419f50cecc6bceec25719e051a49b1ed345ee577740ca322fc8e72addf9ada7737852a920f1ccb5a1e1049679dee3474cdd0a2fc71234c1532e6373baf901224f478db5162a547d2b36eabd60a13070dfdaff50e02c5c099097e6f2e0da707a343fbfc847b96c2d4cf108712ca65c0c29b127504d3f287590d0a433eebffeb618d526483380b49bcb350fbd74dfefb8761d1b78c555e16d89fcb98f7465bce4f1494ab914453edd12df1c1f48e1018de49e7118e97385d89fe7099c04d4339f92e11f929f68fcb33cff58f322ac0a768e74053ba634feb4dafa2701bcbb1231f4c486a5b9be572705daf0cc5e5fb331f2336debb1c0131f774aaa9cdb127592e0fcc7548fd31bfcaa5664eec597ee9ca2501580aff4430de00df635900f43a9d6376166e7fdf8fdbfea0b46127fbbd700a1eb9cd6a550c2c7e4c896379ee88f353deee631042791edee331757f6f2f6e7229acf1884d1342633479b17823980403c9b4847c58acb01e2eb26f85491dc9f20944c11b9049e6e8d4b38309bb2e59b142255dc1142d4cf0cb643e04ef9d9c736e4295482e216ee898d3aec18a9d2db3b05de757f2ad8c80dd68b96fe7f3e831f2d1f508144a26899a7c11c9214e6ae25ed579f1b341c4e8b80f8cdd6b3d4af9614c00b6328f3c70d6625ee8b9ab68ea8fde9a75b7a8e4973a76afa6debdbfd6386f3bb60644e1d212484d7ac5b0dd3a5b497c5001f9e247dd117ed00f2a299ec16131526664c0808607b210170302ac9feb33396d2661eb1fe674677dd891ddd6c6d949631a205e3431236f5942dd3578a935e5baed066d0ed809e64a50ffcaf677e74af5c62d6a3175cf9cd1828f133a5b82c71c5276fe6dcc5c5466b1d29cd418c4dc70f9e62bb644f63e3570154dcfd9dedee622031ffe429b7109cb6224deb83b30d88328065285964f81b454d85e69fbadcd7e914c5cc692c30235a4bd7a6d238c9dfa115a717cb3a65eae700c7a6725e2c7a783623b8bc2bfddb1eeb3113b88c7ae1c20f618581fb3f4427cd29150c8ebe708462e8477c682e44a3fba821d6e0633a74fdcd111a86c6a4e63c118dd105e93f7219a4a77c7aa2235159fe6e90a3c4517b8aa9f971ad316e01964a38c3770b340191525ae1bd9d8629e22ce05334ec89419e0cb6c4d50020a0b2a942bdb63ff945573014f72fc60a5d09af547622070465361206b8c95b098db4093420d603518bb3b43c2fb86a4178c62076013f4420391ed6a2e3819022b254322f0c529bbec6c36300254280783d8e76d90881a3b2a2b738187b9c868af98432210fd8d5674a7c15fa57fa0a5ab259330b9859ddf85484f42100445b04ba3170dc9c6aef7432c5f95b1600bc82313d63cc5632c4ea26acfdb5dfb54f54b4c6fcc91a668b4293b10420b2ced509aa0572c61224a6261a6a57c79128140eed4c06db9ea822dc35a4ea8a266a9c40913d90b2d7466a42d347f04ca8a066cf15d2ec8373f516a45c9ed269a264344b3893d8a048367abaab3d00ed35316e4770c7c3495883879130540ea1a62a71c1f35ba6bc27acfee0071a82126ce5efc3afcea7dd0b7789f19712ff96854c9efa9155a967a20fc44687063f199774d2ecbd67ea4792e6e36efa4d6b9206156507ac20a0131d53f6abdb9585316c02baba664205479fa9159b3ef7b4ad736c38b738638c26a0c8524eed03e1ca4034f338118556374e9b66768f113db55cfb51a3f2208a2e6c441f0799e59d04148a696ce2bd72f094fc289cd01c3eeeb5508379b7d7f93f654ff771bfbebdfe30d5c715e05ef982842701b5ab3c65a2126d9ffeb5cc659f06650edacfe3f75e436a39877e9f13cf942957b4a640c86d05c8bd9cf77e3f3ffd63b4030515bc3d3f9104b4d2a51fd404031d3cdb3a8c85f39c4640a70aca22ee17d62e59c0aaaf0b0211a4a3c38162ca7a05063198a3fc8e3fb08946976051f957859cebf0646fb887d7a6940a355059cf59453a46d55419778216c69642a0e105e39fbb1f3eb1c244ac16e6737c44b92bc594e63a4c1eae2f9ca1aad27fd309a7ae9947a0e6cb10c98dd66996c43c0bfde3c9cc5d2a63896167cf4e9bc3c840c8af3256db67cb8f20ce9470cb9d08a0cc3008c69c44742c36ec836ac0060d8ae3230d41854098718112a7926e4f25e07da4875be25efc9cab0d3272e838708e2dfb79771ddd3aa845f1426679343f44fbc681e2d95e882d39540ad100c110b5b5420cfc0cbaadd5d1f86054b6a28ae6bc5dc6d37935213174839088f97317b6a385dcea20d02402ae74bcf34fed520adfa759161b1f532dd3082fa616f3adfef5c88cec1508cc5b11e83fe44d309ed3a0f93d940e09611bd268f6c3359e3b5befc066a76d9b584b98bac768a4681989cf6c5c78eb0ef116c61f275f71f6689d76d1df5a05e8b65fa9de9ecdcfc28ec2b30141ab5c3d26c948169cfe6f0fd1018da104a2af73cc489e299a0b6c5a3b1371af5b24fbb969ef7d89b4465cd9d30a14d4dc3259deddb233bf38fb980c455dbe37ae62af87baaae5258dc834664fec7e23fd6ac28118ff271eb111252e840b2083f4f5c4052b4a6a1a524196d3e6f6a1c86b575df750a27a17e5db1f70514e70ac72d228ba67ad52abfba8991191679a004581873dade8004c0da18b42d1548e46346b0cc4039ad663bd60a60cc20c216ec47e257f4a48bcdd731d8cc370e5293f47d8d494cf7493bfaa7bedafc8f02fd4047cb43d1e1118d75c4d25510c460c7ef8a2ea85eb5131eb73a9dcc9ba4c4ae8d5156fa1b1e7f2725124a754412378910b68bce6b3677cc6acac8001e5a5aa37f64ee7943bd88befd11f40690fc9c5aa297d50fb988fc11737330b2b8ffb0f8e859b014654c929a97b0257442ee2c68db4de366f06f1d9f1457b98ae233cec93eb7d77a98e79c0873b0ed82f841a4df935d28f7f1fcd1d2d8b66e644d44788db99705104ca0548bd8f99ed17708ca44b8c1dda5a8b750e09ff03a146c8504a186a0b04366ae2d1280bc2273bc395fd48a7facb9578cc62875fbb8988c2950b9cd6842069d7ddfa5699660a7b0ac1edfa9e00b141edfeadaa35551fb1abdada0e6aac8b857a94af67337eabbbdaf57591d3edebd16d8ab07800306217db299434193a111447640647ad578f4641369aa5e8b77f2f504c23f2b2277339e136f623ca6ea01cd553d94956784f0c484468e254689814b7529b8e7122b9fc4053913c572e3a6ea9181764c9d3d4054507130a4ebf78f96c6845cd749f4a586cffdb3979c3a872568a456689db07b75f75293a863107fd44f69018ea96335dd3efb96cd9fdc706d870f875cbc364ea4e56a43198c5cf57489da9b0dd433f04a1586cd0db6642150db567db7fc340b52824e46dcbf7123d4f8a4df5efb7d8ccab7b63fd84083c8cd05c46df6f77dc3d2be2d111806a733c6089dae57cb93559d8703ebcbf65708a05b249956ba8820e8a3ad3fdb53873efb51d09ed4c6dc498320e221c748cf4ea1a8a56c6a68b76fa8187a2fc475d6330b33fddddc05569dc54e3b6663a232aa74600ba267e5d90c0213989e04a8d4b3f662f3f230ef1c0901c4b6d283448e8b3d9659e7c128fc9723b179537c91d5529973262a50b757a4398fe038034b31345dace4dac0e59a29f8682b6c74e2606d06df0b48e0c3b5821a28d69fb217e5e88a0d0cb0f2b8b65810aeb5337e23244c4709b365a0b6b1ae5acef12872579315ad1a423a0ee1d7819e6c9d3ac18eb44aed9263a9b2973de0ea5f9d36e81fcc22c70bddc290114538eb4123c98c29db18cf89f16875dcaf8bee92a7942f30d6c377bbe5d192aa8257485c80f5ce77a97d058f938673bc824ae8525fa4ce396e152d890137d8c0369468b034f4ef18aedddc6dbc84a5a59d600720c8a13c00e97c2a79370793a10406f2102b41285d9ce0356f512dad7a52c9ed9c989d3f280f905739b8faae0d0d3c3758cf9dd2148fad0f50e112eb440492250a554a521008a5e97d7191f89e321b1ab4d662de41ecf3f77ddd5f9afe0e01a744be0e5e37df00ce9ce9324b4b1967c31c8e37b2b9a83b5cbd3bf36942ccbd677513e2545cff779fa156901e680dac9c2ed5491e5f9fde79e88415e363d5b2b14ade0502378b27ad428a9a8b8a15898a3146b886368243eb2639b3c1a0394d60dcc8ca58c641db3b5f272ec472f17d56a322b377414601feb4a0db1802aa2b0d2b691fc9f0816dcaf8f8d05617f38c140aa56d86710b5f2e756545d1a7c9aa69b41a9ba82a73e559ff224938b5255f319b3cc9999e2e12b703bb1e47918ec26c32ae2a2d31e45525615845a310a2e80d216e835c3fd1daedff4ca82b19bdae394559aed8f95777f2a235905af5aef0f37cb9f0bd962ad8a466584032a65e0c0ba17dc8a93ac5ae5615e86cfd59d294856f34b9ff0dab0c89951fd30e0a1d8bf3542ea929f0cf57fe1df417a2d2ac4f1567d53e4266fb6af48f7f71d153d317ef10da7beae53118dbeaa5894f09a99d0e92bf8681ebdb0cdf5e7b601d85e2ee6910f611b497f4a25b0d441ab7811d6c4ed5b5a312ed072667a8ea74cbeca48459c784f67eb1e8fed367b3aebd90b9a51afda21d0815b4f672e4e896700b7c1301d70de9733cb8f5942f9aae7a04da524fbe12f589371f4127e46af320dab2c40ce401d3db5850075e675103640a6395c802e0b9b465d320f73ed30d5695217b3f82915fd4d9cfc651f7458608df652de6dd73ee5c7e5b0a9ebd6446574b89859b545965f2cab0572b64f1dd63a92f13f278861e664b1b25ab355d0a9dada38f685d7c24a3b2fab15c426c1203646bcae29dd6d4668057413a9333a51b606bccde752e4fd22da64112a1e971b9657bff784650dcf2a8344a964547e5090d88236d6452ea0d4d9efa291d2fac8eed0e639ccc26a3fc6074d9001c3fd1dffdbb7d69a1426f738068f17b0a760c3bda0257943aa07adcc15bc6853ca02aa8a0244b728720dfefb095076331e086503ef6e7713d7f79f74f7c53cf52a97bc82dc01d2b3b5e84851bbcd1624def28bbe4d8ce66c0dea2bf0e2a94ca6530b8334ca6b50b24fc66be782dbeb9c92ac66ec2809295eb5f07c551693846aacc6ad5079ac1a997c0d4ecf1797074466d4b85ad5bc69464cea9aaa1d87baef0deaaffa986bb3cf065ad89ac728402dbf2f3ed3f3eb0b3267cf91f5d9b84dd3c9a4d39974f3c618bd99287e1c6f7bd10fb5fa34f6aa9c44738207f92fcd3c1f1b99c6a485af65a90f947925fb09f05bae30f1c1587d20c8445509f04591972c8d240e09b98a8dc5ec5e0a987ae2253e0d7240cc3a9242493316bcad43ceb399d30ab93484ca4d2c9eaeda68d47fbd77874ff34aafd644045f5bc54b5cf697865c8e1c3bc3da082e3467c8d821884d768bc0232f6b19c17c9e80106a5d39748aa8a2d8e0bfd0a0c30f3e5cb92eba9861822960d8dd149b97d2ae71ba8ee19d945d8d31f34efed58f87068afaa1a768b7a2a2739eff0381b781e106d436938bac0cb08a818d4b4fb71c24cc4a741b6c06d4d57ea1943322ca3ab8b52ebebcb94ee50eb4354531af41b0bc3c754e7bc27652fed2a6e92af5295d7604e314ec06cca2791fc114eed3529d65b6fa6ff548c8a5c7b15c4b5ed90df8dadc266f9845aa79498b772ae9ef2d9e0554753559d9e65b76bb7767c54231c83312ed68f199ea2cacb765a7bae9a87a4e97ca4889038dd22e2e5b3f8b52328dbc6c8feb4a0a304c5e4724c6226448d47022483313a6508077a573c72775fe1e5a8f2ae428165cb5b8fda2d0ce0bcc4d21ec5fab42fd692c473228ac0709ee58198e2fc3401bc7b00df778e9d7a01ee11b7fdb62cb9d2df005634d7a9a97f783b0628221eb1702a417932f6853419bfe83e855c71c1f48665e0d0f84394e554a10fcf87856087616ba00456306058f171981cfe52a771e2fa615de05a01cf6951bd7af47ade31d5d7e4ce84137b69aad6d0418b0a5e3afe4bbda6af560eef0f286c1d3d2303c120a4c36e3ec9e14648768abcdd1ea0dc30ec44149b185a1ff2608c38ef3f16774adedded089977d1a88078e05345e47cd144347b06667bce98ef45a80693c8d3489283d1d5dc74f99d0891039bd7cb8283f9f1d0e4ef5100caeac014485cbadc3f1eb97fab715effc31a38c065f376c254fa36960804a466ab7e58c1949f54fa91035347737ca74e4cef80e9d8f346eb140c389552e6265177d4fe6201585f3acc5db8882819368c1344d245145de6615a6e385aa3dc41965ae1f70f212e80550d1e59a5c010772866a602a07261195770e9b2cad7f89ef6fae59bea77a14997a8da580402a5a81506fa70e97adf029e7679835051138da0050f1019c987a6929c801312fc5f0d1d0223e4fb7c91b3f36f34804a6bf33140466b323e0d503a14e640ec2c2c0414508001e88375e84c7c925a972340eeba4c94b8f2e7d4ed777c61d0495b36bc5d70920e3ac8999dbf283a32e415632ea925cb1fe06ca528c1f39b0bd823cd1a86ee7de001d677c6aa70bd32cce9d7eea1abe3cd9cee020e8a2a5ccaad8a3c663b60179296e3c73a0b6b7a985b5d45d3586ff9f0ae2ca8a16cb518c4e9aec80b9e27197a2beaa968597e2640ce308d5481fc9d63b0bfaaf069f588a7df1e770c538370c8b1ab6cfc4e8514c7b5a8d85bf4fee0b510ff6bc115c030a18c5417ade1351b72d87274f02283e20dd140ec777e72673847310886909db39eb96b26c5471d6d4b95bb743c7004307767c250e787740fd0b7600846c166540ff972eddac541caf65c0b5c1240b467b1a736fb84f8e8cc251744a8b480f74c0de04f556fcdef97d9f46272e44d6914c7440da1bbaa0b7cb829bc4d86a0bfa1c3f70f5b5e0b6b3032417295ef0e003ed0f85d253819fc5915a9c460c147e712bbefad63ccbd18081f65796eab73490f01b3896d9f04b8e2e409debb34c0a11a53b541ce6629f2e138688d024653adc58391654ecb409093a0eedf25af47357b69433edcccb79acd9b0416f82e693517328e586a6dd66fc9922beab1b7dae5570af293226216009bbbf9628299da1a077637ed958d4c0fdf45f452bb387b6d935fc3761958335c750b37ba8a77eea54e0ec43544361163b6e18616c922ce1ca31b69728f84f13216545ab570d4db02fb1b61cdd89f1fcc69fe90fa47872e48dc4fe1d603b46df4576861dbf50697368982738291296f80d4c0ad1ee04975662c5b7b19fc31818ad1a96e58a3c933b4134ef48b1444d4b188e50f8f142eb41b24eb9433fedb9dbd8ac7196d5f261c818fcc342f7214379639db9d4ba05f345d2caabf98d1e1fa2821618d283d1cb81d206da899240c9aa11de0ef5e8f37ae778896275a2bab96e5433ebcfd80c46cdc95a31b5aae9ec48c6a50b7d7f6413f6710e718c7c654301908319842af92aed4ab752edf405d6b09afa44283df755a571907f725196fa9bc456dd191394e4df5317f22b046bae399f3584ff372201808d503cb527d00eb45df3c9c1e52f3a1052fd3a896df7c596b0124ab93009f9775289a5100acf3e4e0c7bb0f2b35b0e4686258cf3bbae5d5cb20b05a9e56fee4727783bde794858c5e0b806f260a540a280d9aa3983abac078692accc462119b54e8f032d9e784100271b15a599a011b8efeaa3abe376d299fd3010cc29e164a5e46e7cd313fd23baa43e1c9bfd9c6a95a174848664e623a42f4b6d0bc357c891e645c82ab5f2d30473c78779b42151b90c1769ad1733405a7b375cec49c39f49f52257b7435ac764670874ea57fdeea7f699b14a3f5b919c1c4d60ad7eb4d996fcdb6a5727df522878f63bbb2f220f153f7d2d4ebfcaaaa6f1717173dbc1ba04d88e5a1f179b341ad64c391fe718ceaf108244f4c85c84e25bed2b642405eeae7c0e8e1659dce9eb1a40d6bf828ca6f672f18c3e34df49014911a64be38060638b3ecde383bff3fff3f12ace7ab0cfce3b63599a3b3eb9d58a562644d7042335703fafb157987e39d1bbcb7300aff0c6607484fe3bd524a9311b1354b30fde626924248cafe60437820dfa5d370a560137f20305ca699e4509ff88aa94224f70e890d2b3f8d1dc1a43b5d17d2525e5a917bba179613750a6d7f359145732a752a7b0a1a417af37d335a20536af36b871abedd7d7e13c96be1dd8ce0a052d50d6322eccdb2555990421a8df3da2a60049635880358916369036d147ffe4469b8108394f1314ef169c40201a7802eeb2d47ac3392b828616953870982518a22cbede39bd309a56b0abc6b92c0d0fc6acc29d9313a53bbd3a2a29f64627e342c46a7c9c184a727692e4402163902923d3729f637f6a50b01fc14587d325a94459a725fca9ff39b9a0b16bc97a449def42f5de0ecf188a4233fa6089ee1a46913f0ecd1f26a5755332bdb31cdc9be2e41ba99527a64f630b1c81c8ddc6269e7016a25d22d13227b76ba9b20b9a9ae1927b2e0ffdf1021e402223d6bfdaa4a13f9344150d735e6984698873f12b21ca78ebc343d901c354fe6e8f4d30063ede4c8913e1db2bfdcc4be36ef3aa5365ea6a8e94d675466bfbbb5c22ccd700cfb05bdbbaa46df3514f580d94ed39116f23edab34b3e35d74741fce76a23e43f849d5cb7cc11391371c694321b1dc76d8c0b26d1c34fb79ed5289219be2d8e9e5c4fad774b913117b0a2c22162997baa0b88e74fd72836a02464be5b9b1247e8eea42595264ab0806001aca7b9d020ae8f8d6bf9297bfa2e7189871052a74ff70ae57cdb0e401a7b1885b62c94d6a9358eab19bd3853172bdafb808b352c34154e227ed80093743d2866ad0c551d1aa479e2439e512e684189c096a73fb11a05e78eb697531a48fc8c437a71a3d3e2dc93159686bc511099e3e5223a6a4e5897f9e328d922b81bb5d8a05ca0d587c8c54ae01f0458b37c26016554349668b5105c59031ed1f753956587751edcadd9634d47c6a52c536f2a99fd017923b204304a9594c55acf962342c71b2ac8a18ecc42dee95465105d2d87aa292fdff674620fe97f8072e148976b6da9eaf87d8d3fdeead52cc29896613c8fa26f78522d19e5c118cba3544723033a47e2d5a82658642f7ca519506bf18bdee5ccd57ccaddf639bef35bc5b5b7a9d6d6a37de8081e209f94b9b0e421d8deb225f922c050c360af72e839686361029918f7efa65038ecd5f427d7e64356ed068f547797559619b4f644ed124185dc0ba71f2b910920da2938d35d05bfbd82b8b4bf5d6e39ea8c3b7398e8b1da0d22382f0194bd927638a0d66c1519919e668fc080db26cec7b5f75fdbafec2f13ef65ee31fa92fdc3f517c78e91d8b7821e1fb41249d16439be5c65ec4fcfb8fec6fbdb8ab527cfc8bb683f9d8f1a20d97b076da891c2df7f3a990ad0902ee430d2eb40365b6218777110ce94f0c286c3eb1bf3a688c8d4364f538e5d39df7be4d02d6204bc69bc617be9da8024113cb1beb6d6f7edf620a192d62a476fd1ae6c05b1c59449e6c3a0d4db0fb5200c4ab5a939f93a968fdcae4a6d78c1fa8b19ef526a279a7d434d0a9bd43bbb516b58b241c7aafdd6113c3163523b69438e0bc98fc4482d1b2af8d9a3bd244d9daa85909448527f4045e5d2cd19e9858183e89cfa61006b3539853144abad485594591521c0dc23e330a0a39fee4c64d93f55b2466e8f0304f68ba2236cf883d5819e79376a7224c36b09eb475029eb47526d05a99f463b8a3d06e912cc120e57e06ea3a941edf0749dcd04511f411a258cc9d2f052863d2120c2fea51937637ab5b935444bdc891e652425cdfc0912716cb38a400b50ebe094bc48302a621b356e3960b83ce5da2185e99d6f41b68b5921ba97d6121006b220883296fe42b58434a099634824123ad6c4422a34d01e7a01f9ce6748a0111cdcd218d3c9541526eb38621dc1a1c81e01cf2ce7ffc84c285f92aded1fd96d5220e27941afe92db54c7309a84283b4b2d648c101ffdead1982ab1cd72dea2712bb8961476585f847c215dc6fc6a25bb85355c8d53f56487d3412f5f052fa06ca3faa66542794f1cbe44505f43347f193669faeffe5a06464076a118348a995b692c9e4bceedfa7db4c79303639132f3e427981c6c77cde166867efb42eb1dd82891031549cdc0ee00a18832a35b6223d45b4a8c2058ffa1e3a22d3abe0371b5152a4d16bdde27bbe1150d72f048f687922e26a7e16bc2bb73318881d27405785d3997e1e471c5bc49b35505567b54c504651f71fe8d8874474f528efd7945d54c45cc47871a0648a09230ac6cbc4ba63ff550c07611da874f22f875c2e1e20baf63424a0d6ee2d2a7ed1e4ddb1a16b7d2630a12c03512e4d548500fcd6a6ccdc66b18651b4fee776a9a1b3398d4da6b41e54dc3f358a69fed8c0612c375130e5b6d5ec57d733e161c6ec5ba7dbc1d4a62f73e1fa4248a1060edb78976a0f5c71c984ec0995d9a749c59a8bd418c96de53c8212e17e5117423e3d7d207d94558fe530e533b0f8d446247e18b4afc52306751ab61f8a85e692798c0398303980e9f6f9906ed5652e8d28c078db1b2b18a43d8e12e2b97413a828e449592ff31fade7ae8af1f010bc87b96b6023cc25dea4c47339ef8a7104c78d2c8068c1d74a590d0b47e2a138a004668efdb0a7b5c2608048c61aba3b40bcab0eb827d8ed0b6fc6524774005a3d5d325ec977a214f63d494ae0b93e9e3826a98416a7a0f9214e731e621a5bf585abea16098ab80bb0a89e80097b90c90950f58810f8713b3504a55923425de570428092ebd03ae242b4a3585d6edc9f88974633e3dc7c381559827133f14ba1d29ccf9b3dd48fa79d74e336afb4c790dec0e7d72b2fbd5c464f8173eea39be8c656d457946808c50022c24ff23e3a6286a1bd9b49f7f4f77f71762309e100edcca452b8938692930bc3e89149fc23ff7271b8d27135e14d54de4d60baccf24c8f3cd28f3cd4cc3de3f633eaffe33ac161bc6a374587a8110c3ff04a5209813a11b219b6ee444d0bc42375aceb8357b32f357203a2e56cbd07c6c99ac4f40ace09409e1bfaff1afd4a5bf85852a8a19c048b6d184d1188bff94a15f08554ea0c45f905accc386eaccd7cb3012136834d5fea886ce1baadf1ea4c769b4359e187e285ea4e0a5c45607d05b6e5d4dc0856397ed077faa9dc0b2e58354348b8d79c137d66c46fd2c6b7d5af27ef0cd794d7cc7a71c09f082c654825b686b19b7544d719ca7d18dd848a3c58857ffca239c4136150babdd93af2696ffcf2a5b5f61429978e3f1c8ad659185372bd3c820cdecbf21781ce012c417696120951ea2853d148d9a52982bbe1e267cdf6b4696884f239bee7aa2a774e20fa66870f3b04ce64c6fed3593aba7a205f6e20de3f98fb9c16c1eea9fdf9a95e090c2041b3c459d8f6e1633b155ea310e5d0d7e1c6f6d2fdc1fe0f398142a849ab1f49bcc7519d7205ab79b9e652f93a2b3d39de9815e6e298d73de5dc7b441b440f7cb262bd647cba3224422d2476bf4f8816c7b55420a185a34a46e71ffb713dca8508b3295bfe80ce716ac20a2170dba08683f628ee871953eee5680f9e1e5acdcc53c9b8a5b42f820a614359f9588339d436f6600a32006a64893fbf341ec4bcf1203f3e9389b8f25bdb581486db59533980f558a9e8ed46798bf886c71816a42908cb82f741072d0e9c4fbbb5bfd3406884024fc0d70fda0aca15ed502c24ce8ef80a291c14869a8e8ff1ae2f636d4ba85b1276a786ca844894fe02463565304d75342e85f0ae9e79421c4005ceb489919f20a97eed62f8b531e787fb2964457cbf4855c9dfb2f5982b4c52b6bc8d09e90f4a62b3d886762ab5b0de520a2ec2c4a714c3fb826d12c8bb844cecb86c43f1d12b51462fbf72e7814f062099efb619f0d85d4b8840c4e3ad7eb0a6ae941c72da99e02e297411bdc09cbcd6d4432db417638bd7df51cf2f5d69c76f6f38bedd167a9a90c276d79332486dbd3231d46f6f6ccbd68b9bdad9014ab0acd28f038039e30f603421c2fa93a105eb91aaf4bf085c8acb1c73fa42ab4b11fae20c7f6386c2deb2999d61b7aab06719b352079d7a061649cc41cfe1a4cb7ce0bbd9c8740e184e4b578e34c0850181fadab10e9f17e598715225b96d18003993f9e724a352112453ea614799d5a64cb564c39ff9997507f9456ac1c1bfb8f35ffae2cdc423e608bfb33ed57d2a20e91301c727a5aab6da12f878b2e5150b215a3bcf358f1e74c502ca4cfd26f0300bef5946b395bea97231d0b0f0611246c182d1578e6168b8c5e71820c404e61af03648084bf9e95d9a808e81032b89d9625e64e9ad69c0abe67078c4a92ef5384537fcc0d8bb7ef4d7c2d86183960d03419fc0d87f5c12ca15a859d02283094cb910fc345d361f7f62ed4d1c51b40fd915f1a04fef9f141ce81b706a4535bbff64acd7162b7d348cc6fd85511afa2f77a819232265f57ff40fdea1f0056b76f8135c3431464508b708ed732c61b83ec848ee1a0afe0aa1b780fe9c9afeacc8ad06b9a3e7de051671281fe011a662d800f2515fc59fd9630925844854c04ebc08a3fad90addbbd905a443eeca3455f1525667f721532ba5ac8f976170e8b3e324b9629a274afe56e9a8d60da3d4a4273154c5b88452e045326c4797766337c6505eadb41deaab120175a624b33a12cc1b0028b1617066f801d3004144345418be5769a09b59d14e19e2d9a071a3e10ecb7fbc2baf77f308c8a3a035f6886a888090b06af16fa1d2af1f403ff6c43a58791a0590dbfbd431565e12df48fe146ed4c74a45365c2bd3c68d24ca0e15fd9bf1154d863dfd164af042cf20f01a3468d89e4381f4b8b11b9bf548c29963c578d5c50393958a74b013bf40c94314c53c09fb3af4e6e82859a8ff51c0bba460a070a09ba591c41f12975b8822e6f3c532fb8b801fe1d001497a0209938bee132816f89d7b0ab86fbd9183e7edf7cb6f72645b8a8ac99f5a670139a0db935d11b378652202f8895b7999a1a31be8a5bbc710a5bd2f9cd06422837abf8a2754650257b4043ccb7f6b985390a976e8548c59475e3504fea7b3c810b294ad7b66ea5adc86de6b2824b9f9c5eb62876e9cec35f78b216fe2b14c4a46c6de04dc5aa515ce848a97f154a213d8b67f6421fa6144f43006b694a582b33c9541b6bc50354f4d2f5d20796328bb476ef1f05d52140c02872664d0d37f295870cf62043192c7ecc19bd31be0c5190266d05e67105292892d644d71fbe2bddf55fade78b561b10ea6f06c6df9fb8403383e512541890e3b1c6b75914b82b13312c8e0a157d077c1870486d42373fa474014ef08ff82cc23520d0a0c1cdc8490b0d5e85c8869008c55e40ca2ca22cd9ea5bb032531cd1f060040e3cf0a1d24ee869942892ec88764952401b903f47da9d4ab80f165ee7d4088823b47b52afab1cf97afe232e40381a548a06926e1e7ac00628e23d3504845754bb91cc40566190d7a605d357eec30a46e6b0cbd8da8654b46d00c649036bee536bc1b32c2154d2c9b52de144ae3c22b64c679f62110c15a7387dc20fa3a65740ef04b57748e36bd325ccceddf654918d88882f9facd83d6a4135d5deea5299cba12d4e74b11e07000548ac69fba018eb570b397b7b9203c52833064df6b650701136082601abe17348a2beaebc87f654d0d44fc5c2bc8e8f900d6881e5a17125d7f5ebbaa33e10a36e6a535da342db94d0192239d495be7cdaeea2c73e020dea5950102f4511a05dc31fe42b1b20882bc9cb819f8aba4049673318315a487ec01c95d221bebd0c3e699959b431c5b9742a4939a9652a1466d90653dd6032604f3acee5d036a527622ae7d5018d662e136e57d749ecd4a305b8a2d7467709d7d578aeb0235e415f28e97fb78a5ca12d17227ab78c08a9ce1faeb9849af877e88daee53af6f36f3f2fd25a6f50bfc425efa67562f0526d18ed756c4513d1da31200a590522e9aa4c975cb882a8c247dd9216ee78ffacd265181f72069366c2f923b12ba7631f3334b72e6874630695fda98b1a43231e52eab77803af24cee11448725aa1bc710217a430203fbfd735c2db2c65a3ee6cc3361b58c213984a8e16d5a791556644d815f9c42afa1f1b378f9c1b803e4a7eee15e0fbef9594ab8ca0f3590230a4eb93cac6c198f36bcbf15da2eb2a9f7e423934fddf6618e806eb50c67244c15cb5779a824a5ca31c6d01b6f42c54012b6b504d1b789e62f93ea79164a0be6aa89b3654d38196272e657475577efe9f73af614148b02877684dac8d9055911d5e53cb4b1d686a9829292f359bd190c1df0d9aacbae2de16ba1920fa2e41ec196a30ce19dd28e65746d4005fb1784e014a140e53b9496d8b1528a5c7639171bbbc61c48f6742a86207faec7e0e83757597501b96d4279a7c99b11503f19097f64aff991427f9e31fa7fc72a2012e969bcb936b2395e2dd8a6a45ff4a76a634590b7a0f50a6a8033d49006a8c2216eefe467768dafb041dde072658554379b65c54c29656b9abeaaea69a1b47e8252742ac17417036c72d2a93620dbbff18000050d1c5e945408068ac9d14592f6afd4e3328383408fca64a2d24b91d51952aa2e606a198e8bd241638534239adbcc96254547d434d770725155aba3805d68f212a23653b42e9f0fb5e648a3f3768c99a9fb1bfd72e8415d0f48ce39ec16f7580d4a6c969f318adf92f46810bbc3dfa2fc200e5dd418a179a2463f118a193660f2533bdf92c1cd2644e879482e573e14cc98e6537d803d993f97de1728c1e86732f2fb793d05039015d2ccdca45ae3f4163655ff8f0524acfc4df7be1bad93b12646a7ccca54f2e8c8fa9af82ef642aaab4627b7b65d2ca04ea57a06dd53269428689caea80f7a4a43f938911848e760e7516b8f7b1fff104f100f31ec5131b6900448621096a86ebde0ef7a2c741df606d513d154bd8f16065a63bdc5677631790ef7fdbc1d3d0112b1d6ce3b2629d01eb43cece44bf42029e34d918fe38ca5878102c6b415951a135dc2cb0c43fb0364f0e318d69affd0603d6be0a81994795569c1b9b365315ed581b3e80f2a2f305701472562347ff69a02f9bb28b8c20e8615c3db4c45c216a6fc0ad65282e19eced417afff35ee91acb42569ce4168fcb5a1509425b8190f0106c80f9ad2f14b1ab1b059325d88d58dc901205f2d2272cdd235af3aa2b243d0fa96655ae9f4920bd48690c2d8a046445723c864270849c4f49f238a01002b7af979359c2e97e9a7f6794bbb7f3a1922562c4f2509939c5cf2bedbea10ac592b4f82e466147349217f5ba5422d11ee95b3e054bf819457d8ce5a3a62e3c42116912ce52b0008fd46cd47ea3db88bb0c7e90f803746eb5c502eb1053f31cf1dac23c5ec5e89bde85118e4148db77b60ab5fe48a5185ae436b79ce60eac3c7ec254c5a07896b0f310f69c73491a3de90182cca6aba4b023bf30597db95e77a6d776689ea11e06118c8b122e3d5e0c7a8f23176331b20f6f4407ca0e5d34692f7e935e60201cadd37c585d2ae41600dae324af30ac5bde1eb5167296e03ca98dcd2330c2a17dbc7ee582be1b8752721a0480881c059747ef38ae9bb8af7159e3419cf6c4b455ad28f7c4e228d8aa6204b196286476f60550dbfc85065f2acee855013c900a1c7fd8ee5d2f506ca5d9ba4a2f7f76c090a3e251708e152042e75a68f9eede1707ade9b6ac55af6bd2acc573801648ece99911e8691d68d32a6fab0377720878af4ec77ff505c2d564aaf572c7aa1bd20a1f0e5845e7a26054b0e234e4a93234eddce671567fb1a37a383ab237283abd16be6664559b24f1e8f8b94b38e4e077d988b25e257070e1a3d8f138dbafceb120e3a02909449c2bb5fa734fa49750df2d5c5038318ed5c087ad4119840083c8e615552c397c230c43bd63f51b1fa0e1d0aad88e4b226fc48ae204d3a5483fa35069411f5d6d3926eb092359c467bff1c6d723429d92d8cd8d2e238414515908e3821d138e2a3393cee3847c2e698ebd6e233e40288747810fe711e802a85e4da97d6a9374b3a55bc8be63af5ee14a41d356540bbf476be12e1997da32741ee58970208825fab8616914c5fd735aca50f498ffc0902fd73cba985903665eedd7ce58f41aecae1691d1085fb6a36614409ead1c6518aaf30fb0a623a1bcb51625cc4e1f1b914067f3566a99238ad76550974cdd8f5ccf91d4eb803ac7e54a9bbb3cfffeca55ae541c4607d299301f108534ed01145ddf37996b9cb0508c7f98a2d4c370f13d07bcde18757bf2a6301f264df02766a7aae205da860dddd80392b175e3d4733872b61d6336ac7866eca73842e44b78b725b792352ea0e4f00c33de7adf2387d09f64b0e5e8774ce920375f63231fb475f2916b96cb41a91148480fbc26777c5e145eaf30e7a9994e6c735ebf4d1207280c62a22d031dc0b76518e9c2eafa6d928ddcf7768e56c59164f2adba7100f702b786db0b35dffff0f55cfc747aead3080b7ebda988f1ecf6ecb1fb0914999d9716fd06eeb3450ba9e0e29768c75c10872abcc550753b765f21b79ce2074986829d00bac7f66de5e5facbaac78a96448af1b1aa6fdfe81ecfbaa944386271171611b06bc515b23374a101ca82507d1fef7bf82629121aaf63bf3dae68708b5f6277f8c4ea00c74de957eab1d1d0b838588ba8a5b689c8279fa0f4f5fab852e788a3673b98e2dfbf693ff1bddde40d27bb2abdb9a3a8ea1d38a00edc1658dbbef5819e07dcafe8227733ff94444b9ad17f14a7c260d765ac9d2b44e298238ec2dad8cddfa48df31664ded8da6e453932fc8f7cf0fc93159715fa5f896bd3e7f2d94bb8ea81c8cafee73bbf305038845a202b010e5481a433ec695d85fa37e3c784df4b918de60198e2464b8ac3c69b118299761d6fd8fdf1dcd168f5187a6c88fc5dc8b6fa00ca1a489380fb6680316311449913614a1a395e1bf9253dcb4945f650a12bd58426309ffe37daef46c9ba6413975772d028d2303535711200d447641f090e17ed09eab3d7a8936ba177d0bdeb03c9fca8b143b0bf1843f6976bfa9a9e75e54a27441c228300098dd813f1e235be9002a4fb89919037057e70c0a5d9d9596ae02363e15012898c29f76b8cd0ceda7ddc6351dcbdff9fa5f8f70499410ff977213c127a216cafbc15e65781918432b27240796498049b0fa02856c505682e719bde218e42de1deebed6b4180ba568e853d5c75243b809a5975ffd1a25a13750537b7cad2ca9ec66186249844279d9c7367161e6b60e5c4e9b4d235cee86bb0ee273efbbaab75ecd338e355ee27f0430465ec890f523037897b8c656c9cdc61450752afb36d62d216a0e76141532cbfc804cc08864e48740752fd806f82d047961d819809b65dc3609f175748e42ed4a781bd32c52785630a014088534fcfff73041f07ec9786a677a8a61398abcddde4bca66ef53b5c9f64acc90e09c539d652fc112df51391ab294d595951087e16c2888b226929b6ea2358ee9df521d15ded0fd28fe8cdc4b9cafb30a8ea09d9b054cbd8c293a307f4302b6eddc9605b84f5f55ebf4bc8426eece6eda85272e2df2e0debd82a9568417e171125bd25961080aa926925c494426188b292fb925dea23a7f60e09672e36898ab3095bb511ba3dea9a99c2db7869f12174ca35401c68202c2b4ba3ef1d1408785e4c4af5989ecf18d928da0e735d48444918ee967a0c2def32858ab71457313fd6ba89054601d9b92860673e3bd8f45eaab63c6b2f3c3c47a4213aa20326392f2f7696a231b6d8454b16b4e320eb810c8b91eb03a6d7832151ee14078462d4b5117e58c983c1faa1e4d5c6be28e52ffb4ef21dd6ac3f3b5d007a7855a4e2d350e09d7326aeea2f44f3ad551ee341a30717d62bad0b256aba852004b7ab1f1adc2e6d4cf100d247fc08e25235f87498c6e8a0b88feef2b2b90dfe109d1c1632743ba78c988d06a19be4fc4184b59e88763f14a0872de873742cdc02eeaca74f5f61b6a3db27da4d1684f612e9003dec740cda778a58fbd1bf923a726054d45977723b95649f49c9dc3a6d948a95aae0804a3db861dcb38fa1303814d16bb7ca6e7caa87d44d3adbdec6a8137bec0bf184a25245f1c803480bf604103afbac506b6a778bf840051942a561575483219c4a3b272b870d903754be3b5022190c403214fd4d5ed28340d6128f0d2ee92ca4c449d856cd237e342370dd222bb42edbc0bbcde61713410f1b7cd785d191a1cf41f55e98f8646cc5d1a85726f5908164542fb8fac8da90c442d32714947c525451cf34280cbd984958cd56e7a21728a21a449ab4f0b95ae546356838fb5b943f71ed7b1f5292959086c2a1696a58034e9626c60c00595c1f6f3b159968c582350a633ebf046ee5a6fd213279af396eb119ae0bb8f55a9448ff4ec166d4ef45bd24c6d06a06209a2dc0e94f3b80c06cdfe13883284126689aa977a972a1d549abd8536d9f8ea251b90880fe723f6780b2c23fb697effb88e1a8d507477d1df9afadaad711f1d5d79a933af6a2f0c3732ec195b51506190b4d498d4c8dbf9478a88ce800339ff275f6c5d32fdfd23154fce6f35dc8dbfcd06c2fb625f979436848f541bf638ff950fe3638300b2eaa7bead5011530c950b9bb5a155fcd72ab0eb1598b977c361c22bbfc1d62e94d107999dbcc0a96cce85110ef3a3f4616ae5d76088f4583b833df15e5dcb36e24e1e700770b14a219f88d4c7eeed04e8383af8435784e7c939b480df19c9474c050f3865188e9ab713712193b8d82406aee0ad683f72873254a61699018b5442ffae0e2a1b98b9eee396ffbf03921ed6a0d20b9ce5519e97dd84260ea9d91a87df9bdda7e9eea8d7469dd7a9665bf7bbb0c6f3c4cd82fedc308cd7e727dc81a8301361eefd4f07c65dc724bae473c93176d4412166c8ac7cd24120c9946b194681760b94dd0a936a8a66211075300d55701535014748b39ee16be240d4d0717f69ecb87072fdc998bdab0f85bbc608bf8b51a5abe3db96e19d8f5ffa8f4a4da39040ade342924bea84a2286585b2b2468fabc3ac11504ab3a74a5386148cc6f7819e35b14cf1fe023ceb90f82f6965ea9b273a66d7b0b23ecfe66e1c67ef51ab636574fc79f72b5b21893e4ebb1c02dc3e0bac46e4be9d5cf2788f01c1a5fdfec7868d0d805da5b3173c099a64f929dcece3f19c46e4fa9bcf24a5d0de10aef1a8a8895c24caaecaf5bc08d8ac7bf84c06444d9aa346933b09d0a3a6372a492d7384c848dd619e31d43221546323500df3091232f544d36dd30b1c616e1cc99a9fff54260b76667df36796065db55b9a8180b3c42b89d7a512125d70de6448d9f803a3cdb4cb59946814ab61a68c768b1950341b421d94c2d7342e2310654fa57e2cc2ca0d644bdd1a23391cdb13976ea996a4c3fe92029163523359702293968f5e2f4080b42fe2de55ab89dda0d558bd452e74eb361e75fa3b25f0d39121a4c8811f5dd0d2c162ddd9c06991517f6461e520e480c1a21284b0dc018b9cb6c9d35ec9c616d198bb7160d36d06c413b1849165142d72b72fe4055a7134d668bd57417424c024c8de8749931a46d7667614da81de1dab2f0f66536e31bbc2f9f015e5b1de2107fa8aa125db98febe01a24c7b950be9f5a4a76d49f511ba61fa64c0f31216480a73bf78c356062ef6a70adc0e0da4e44650f634358584d1aa2f458337406e871ea48b095a8ef6c5b5037110a42e285a562983e408b014a256c75bcd66ba9ee1e698f2a18331cd3fab7d8b20ba8a9e2be8e6d24588e31fd728eb3e160d402af69c65b17d7df59e1f2853c75d49c5d8771f645e7c16dea0cbe20733535ba5ceea92056801e9a3bb916917dca02a7e789cb11c1bb1a08217a2c97d1883a8790494e537b947cfdc6cf83c85d59a2dd72046fe27e58f28f946e86c3504b1432d180abafb4fa1d9f8a0d9503bcb39cd010b4cbadfd36d10dc43e751dd116c598c5a202ceb776f29b05e78c25aecb6889d159bdb443ec4e42b2b5e814b933352128014404e43c7410d8a66d0d518a6353983d3ea7fa07c67c1dc7cf0d7c35360ef3825cfd812a82c9b93dc3913922270795b15828c8dbc2e89349623193c21e94ba266cca839165c1c24cf128a8027c9deda6a64ee21410f69563ea449449bc54addd79d1eba7ca9d9fff73b5eea20898d6668fa431597cc3646ab9e836b61460109fb7f1c133f5639a37d0170696873189ddbc2a5e2a8b89ad09247c63e5822c77f9fb7daf1b7324725d8861095ad642074721e935329ce75f52f66b5c52f04c223af3b92834c53f90fe290e38c1715f8b0e4f08ce7c9000412ae882d4f5fbf56fd3e27dd3843cd4e5933ca3474ebe18b4e6b3ab1b05364b5a7bce13591fb22d35ddff69c1e9aa15a28ed866bb34dd62a21e263242468b9e1724d57473c2ce396ebb44446aaca8d9713745916baf33d4e122540ac5d9dec8011c4b9600850127db328e1918c72d13d2bc22add585604fc95d7ecfdbb2f6a646fcb2a9eb380608a5fe05576339a612875676218d1e8bd4c7b041c3920e6358cb80bdb6d30830af039017f2a01434e58d4fb9dafc5e7033c5da67db4e036d1a9a539319cfd25b1123086173921b0c5775a0a38c1a7d2100f6aa2833f20cc3e22f18846b0983f2034ac1301d5530864c0c447bc145176b8b08803493aa42866ad8870c18624536200af7cc48442981aa1fe329d7f62cbf205de24460623676dc5b2df18df1a8176c0e3a68e353fbd0ab74b06aef7b9880ad4bff083cfca458af9e86c7aaa629d6adda17954a6889c6a2f3f74782526a8481c5116d552f9098118fe0067c4a2172795b6328a0398ad38e37a677eaaf84ac25f563c7c35ef6f48d4a9303f05cba7cc5ef52c334a22fd2d748f0688b1b3976bf17fe13df1a54be419e94fbbcf4e9d6bbdd285f8aec360f82e0175f3b0eaab3395de97753cdecde8413c09a43c548b9a41b0a7e5a960a4ec30a55d5c4ad684d33584548835137c9bcabdcf98ec63bece71cdc220657a2119ab4476b0df9acc8ac1fa3487a3fc483306386996c0c251a2be263359b6d6e8ee1facf78eb2b04b049216e7153d02231e9ab9b065b0de6d0e032a72393fafa95636ecb7943a30b443b6eab6224f02bbf665f308d5bf1301a3cedb848a6fbd135f19e4462003a35a1530e31e42d91fecc0bfafe37e9d16a22d0e2dd389f8199c69e75611644dfe0a7bcea5006a4ddf487e5ac4e540afe440dfb882d9b12be94c88a5b92c500363adebc1a53bc87ed50266d34ab8c6a680d99c8c1b6f9c33f94397b68712209db4515b36cb574615d136f3e77a95b5422c02e3d849e6c8a7ac7bf0a207197d9c356cd11bf1e2fb506750ff73f807bbb270e14f7156993717b23e2085178d67e380b50b42b9c8c6c845f1a2e54348c70a978bac4bed31f7008143817b48cd1ba082fb8588caf3c851183215d3e1d153c0356fb24d3d6b6f06b2f91a5fbc80373b0a7c3eec4dc06e3ed407108bf09e40af3a2c37a3a13b925e85cf062d37d778107d003228b18e4ba8fc04630a8a20111b0abe4f61a762244060eda035d06b9d7065e7c160b7cf53f97937a9596ad12385b5e9c08319137068d014e839b0049fa5232b0b25586bbe52741c466f4859bd8ff8806f9b64a9f064c94e804b6260924d15fd5a6f4902a24bf374702dc95244f1169bdbaf4c225e23828847964a16cd6e328fd49bf5e58808a3b249e4a0c1717c7e32af0f0596fa8d601448284f1204c9774d4e212a9b73924bd7809d596bb44674b73a5cb766178c95800b475f294bcf1d8d0e7d024819f971c9ff3a8271898d6c1a992e82545ee95a8c16dbd71e32cdc599f68d1615234da4c469c3bf38bda198427f00598343a9c9c9ab0d9ce861a63ad1e2c01e2bc903111c97fa7adc1e9b067f6d5351081a92ad4574d1d599053dce4fbd1387de8f6438c7e83744732c4c4bb0bd21910863c9cb5ac28e1d2e247f96821c510f3fc0057e58db8bc362735805d9b64f7d4ef9593c75d8719d25c173b7558e8e0ec00d167a756e0115eb233ca0e4b86ee0a66293d7cab84b05471128da3d06f0793224f36f6416b6519f235d2cf2b5fa53f6570f217c6551120123851adedde768d8d755e5370133be68400807e410c7136d3101a5dff1618e6f0db3fb484e48f549b60d17f84b4474cc691669ef07efdb9683a14147992e203320a4f9fdcb3ab37a440896807c453b44be64ecb572c76d7eb812b4a937ef974dab6befa4c770919d34e9250665a7c3df9f86d3f1d2fb7a46215876e06e880c8d5d1c10fac754615593742d2489e5fbe7fd303f6dc23298e346564a393ec9175ca5bc441f750dd58fef392bb81862083ad4ddebca6c4d18ab7d4c01029bc7a560145136a5f1f25fc0cc1dce171c4a71ef82bf2a5625cf2f1702b77438deb19166d8005ee2a792221022d2b27318531c328a8058957cb30d81253d421071686b0dfd128682998585ea5f6488e70bfe6dc6f0ad422a366931650134985446bb258c0179895e7b972f73db41d84d2fb2e4a2821d91663c89998dcac645e8e04d41e814347e1748425a9fbf0529771a2eef3a1c5064e73d73662ce04952972095a1b8991cb597d8d56506e423c4e722848484ebe41a00697092d068f573a62e56b71989b6d8ea18c42815a3a0a73d99032552151273ea33597eeb1bd026eafb3d2f243cc7591de62e6131342445d985fa7bac446c0252e22b542935d109a580fb03bd267a5ddb665d1b78bf128e6d7c7261fc78c0a298c7c8112f8574408802438d6a351bc3e1a0b652a4244298a352cab34bec215c6c82d68f11d13dc7692cc10493639833d20016a036960a031cc30215b77d1806846f9d170a92aea5731fb6daa6bebe720f7e36390548f5826233429346c43e01fade942e51601c15e7d98cc8e6dae9fb638b5919255eee7232fb8dc091481cabf3019f4ec5a1fea57956776c807f7ba83dc0ae5b764e19dba7fa378c4833a11a00f4a9c4ccf9c4c43b5f83a3caefee5ed9d652ca2465d402e602c102ae9abec6eb0f7ea84593847a0a4b2bfb094f979551e0c1f9d5ee58017eff14b6177f0aa7ff6257a9d998f5cafcc2cdd29c98ccfa049166b9d508db6aed2b7da55e02d21fc474376da6edc6965bddd8722b2f67e6cc9c79ce78af1c9a20696aebb17a65f173decfa109a292bdd26615b3ca6c317cfd413cc6cbd58cae26971bc550e37b024088c764ec32bdec57a577fa80995bbd72a6904ed06e183def239142a1502956ab4649b15a284f541955bc313f2ee5ff9cb3b53967acf37103f035c6a812fb9ff7952e9ef7de835f03806dfc2c8b59f7a44b144a75d3c22b55d5551d0f13e70a5dd1735edbb952559dc76a79f60c51f7c4d2a1aacc3e596b883cf2fbab32be2a9c4b1883fe2aa34aef0ffc8ac01dfde0a70341b0dcd139e7cf36c62b81ea7da918854ab15a14a03915602af8cc0184ae74ac51c7104562f82059010c17d2349a28310365c233230c1292d52e1a834ea8a707a11ed40c0fa5e1c8123c3b9c20c7161ff44081e2040d2e6690828631b616636c89c6211635d55b8be6a62b52a288c9f716d5b1741909dba3458b1a81c237dd5358d2dc97fbb75b782d0cc7cdfb2c372dcab34415129282c3aa16b53cf77e28049571627ff7a514b508e331adf3ea5a76023a3a3435e6cfdea2b491104cc2106f1df24987546b5908f3d71e2e1d3bef87d86237f16f226bef49897defed1d23d8e708b60e2b7e98ffe531f6cc652a7e585a54c9f72ea0064b17ad5f7f33374b01c0b60b95727303858fbaa7b0fcff0060fba4f2972bb29cae8a73fd19874e092de2b869516463727eaf4551d0793fe7e6244e97782e7056a11966a7d00c3ce7006715f241e14ccffcb82743a70d12382b88ac1640e8ce4f1400c80edbe5fb7aba78f972f37e8e9bf7c59f7de3e67d1b3705b047b6ab0ad17aceba3bf311e71592428a9f77ca69f38d435c6c6aedcb63b2d00c519cf72b5db5e81b23c8270745f0c47809486d8b41f7b4337af2fdbd764f3be3878ff2185caadcbca7193fd5d9edccf841ee692c555088ec767e45db0294d98e484ce683b323b2d34466d29addce47d6d94de6ee69329c2d72e77d2236667f4ca6ceba74d959d63a37f0525fbe0f594238cdfae386a763b15d3616b3b1f76cacfec8e4f7ed72e9d21f82ef2a4dd0411592a2fb479fc91f3fef5126c79c73ce393b0261ce6f7376071dbb7bfe6f548d79cc6216c79c73ce599740e2e779e68e88761677c7d8ddc3173d7cf1c5d0ddb1632051d4f8fb30f6dcbbcc2a04542dece63e9cbd8c3fb3ca8041ce6a23d1d8f5dc677eefbfd18b9f01f9a358ee28518da58b8df82e175421e2bb64f0fbab10f277c492f4198c4fda24d25721f9fea8b479ec8c462a5521dbe6755fee6e62d30471208a91d730ae3d761063fc16bb6bcfd8dd4395d8b2431c86e1e310ef8818638cb17b0914fefd1edf7dc1e2506ee59e91cf77f440c3341b0b5f04b13007ad842fcc80838b234e9491851458c4b1a486d90d4eeab869d00a68843116788642b22708871a166ab4812482273a2861061562bca0b3cdd0e3d343450b25292a30c0430a55e5ebf500623d4c340eb31bcaf8b254a118884eff96edf7deab52bef3306163377bc0b33271648b980a6ba42ba470640b10822649ce68230723deb84288f5028aa137e6a803069d1335f4d89e14018588211b518df6938446a3d1eaad8686e69e569708c664325519ff1c1d09aa03235405eedf9fa0ca90507fdcbf379a1f217e2c8da846fba1d1d4a8f438c4ceac8f89c80413449426556bd6aacaec52ceabfeb84f801bdb6532d51ff781006dd3bd13a8ec8f76c0ca6482f9be65490bcd07cd54a3fdd824b62752a048f81c7107a246c094ed3dea489831c61863a254aaf3ca9992eabc72524f6b95ef01147e100f4b94fbff2b27a7290f5dab07d9113a8c0960639f59a5d2b15afbfb78a0529f8f3c04618cadc518132181633696b1e9c3966668de532a95c2e5d8a4b814972a919aa5393a26b3b1d4f4981c1f4530a927da78e31095ccc66cac472acd11ea4277447a63e3c562b219f65255c6ca5c268e1d416e9a39afdd34813befafdce650aae7b6ec112065bbdc865b61bb6a4e837af2da7da932f9734b4e578b37a92ff7bd5684e99edc89bfdcf7a1d26d716cfb9fff1e6572cc39bb0d9cc1f867bce63149b00a98739b75aff92db772273e04eac8c04c68380693a6b839e2a0133f8d020d35f1a0b01e1445d1effbfebbd58ca3c964b23dfe6261d6048b848868c56aad886a535aab8c35ce300200d96157d8cfae6ee2d2c2d033763804c80e7b94c931e71c962e125800b47e3c56603fffca63b47efb2b0dc258ef5b662da8b6ba74b1399be210ce8e088df403110d456f34f7342a4d3793b774ba1b8fae85c27a6e3cba160e0a4375341e83cb56cd4ea5a3a9c11e761b1a1f2e130e0a6375313befb750d9b5a1f970b63c9fa9ca6c9a2a834fd604f486de2cfa852df75957b7af2dfdc9397e188a3455663cefe3d278dadde95a39e15c81d51ff8ed983fb42ef9ebb9c3738a1f56b797742bea8fb174c96fc5d215962e36972e768584f70863ec342613ccb7b4983e48136d870a4ae86c102209a2f1f38fa53224c9c0858f1123fe355ef3b7bffdad268573ab61b574b78fe5eed841b07cf7ff54108c6752b7548b8dae45b383cf79bf4657a5cca430763d764f61073f9dd61a6ce1f1f556e33e3c090a4551aba8e05015150698ec7dba4c20d114df5976046fec7a92a3b873188662aa1fd40f6a0d826eb2a8a81001bb398c31f8186310638c31c61e04630f677cb50ad43be06bad35f8807e407b942b92006237429abec42994f4ecd1efd168efbf4509c171c80869fa22df8a64a9f3691dc510e3974e09480e7bc7af907eef5821ed3cdaa3d1efdfe5cefed16834daa3514cf4151346e48f487234fa994f8a259f7eaebdab2fa3389613e4d3befdb07463a52b2bad3c6985b4471f3922c91ffda8dc193d4992e48824432739f99aa4dffd4821284323a4e92b8d6d28704b3c28676b897644dcc7b7b1d15d7f067306c10773d60155dc743d405aced85af0751924a1e87ed21643b17409c30f37064b54cd501d42b9eea47f583a1694bea19e48a585c96e3d36d8d05088c2504d43798cfed1b553d35a1a86c342354d87f2c466b5d9795fff34c16181206841ab6d425114c721f85155c69e740d9a86b2a9c1b6d434d0a54be0488e409f129461722c5d2df7f16b5006faa0f7a469b60463bb6c2e8c1d0883c1b02d0f283b4199c7b0ee89f4774769a5442ab9f48ba1d6cff23b5876ac904211c458c76ad95dee907e5491f6de21fdde7b93401fa4bf6fda7f1f26e7ac699af6038e1e400b3540d922e4eace80952f66454562329f20d1f37036f73496a8224545b859519198cc27869b3189c96245458a8a6c4c162b8acd68b5984cc78724e7fd22b19f24455a6bab6df61aa82710eaf7e4796b4aa49eacccfa9cd7825a5f8cb4505feec73cbc47e4a875cc86e0181345711c453b8a3ab3a22231994f100b43497605ec8890e393e38823dfe69ec812e58ec3a550281cce4695ae763b7d63b3c3f930c12ce9c9321f1b0cb27e0baa032dabc08dd91ecbe326cc9a80c43e58d2c979b9691d00a12a70ff8650c738ef87a17847184fc6210ae7bb9e10623d63db90b4f188d41a636ccbb0a4330a957d24bf659c8d3be48fe338925afb2881c6bf0f438ea8bb0389b516636b2d1862d0d35af4ac054ba071cc595533c4d2c28395e6dc6821c4797f955a580f0641d07aa08d0282e05b30fc1e2a5fe501c19c4771147572ab57ce1412091886a258febd2c2f1d2cd05ca54cc1298cffffd5a83af0abba108722c62c2d3cf67dc11fcead86d58a725132880ba227a2ac3145126c2431fb481bcc88912ca0b4ec9d8661288661aa03141e6a55a044496e6b045173cfcb9668e5eebecae5723743b9d5cd907fd95129f1ef49cc5f56d50cb5f0f85c9185a96a72d6ffbd3d6bac673187612886319fe7fdcab75082ab15d4795e2672b7b92d679ddd04639a71e22449cd6b3760cee4312b185d2a97f39a27b96e73271e8d40a8e48b9ed898b1990100000318082000100605c26098c6a9a6621d140010578246624430920884b150308ec3308ca2288641188618620801c01888144289ee2c7c352cada311e4d1900ddbc7da9ab01a9e3a58eeb7f92216630a0884e8181eb2f3c59db4ab0e059796629f43ac302273c61ecdb18a33ef6045bbe00dc8e950c151b11f2e6d1429f65b43ac0c0e8dcb2f54cf5602ee8c24715681c151ec0e569de708db8d8b4382820d818eb1d7f5ba229dce13b033364ef7f4cfb6968fbc590a047279fb4e02b66bde777e956a592c4d2720f9790ea35209866337bc9985a7d2c7f1ead19a97fe74b99013aefb1bc79f93e7d09572f65a56e491b004d1338194c5678249b02679b126dc51def0f500ca8cc3f85242e50711062d7a5452fb6d5e7a960b0a09f90e5ddc604a26f841cebada8de32cb171aa8ee3451995c080dfbd02aeb8497342023a4b21497968204d788fd46e9737ff79909b0a39cf5f4d674c8f24230d7050b10833a4c5572b347cf85401a8c8ac6c52c427ec36854e678e86b09a21822922b1cdd0e45986266a887c328ecf580955018afa47db37b0361941e19efc545db6a40ab69943012f106a0f437d2ad6bd26c2368ab60816b3002d515cf8816661dda088afb31f22ab852fe7886c25317ddadfbb37ce5213e94c862f5bc31e9ef9a066713a8aa20b674adc608d10d1cb549219466a4d32534ec95c3f28d376d3dd71539798cb84f9c188ee34c6820b0de56a92334acd9e60cc8c2bf3a04c7fc39160b3c242245a46308c93a1b176635082f9f990c2e03528a7f7e2f7de788742e416a60cec32140716932479662fd16cd9356d625eb8b8c57bb085eba3718e9b81b2f14c99b01749d8d42978df123eb3c6738af2c2edb9f22d35ce652fbf62b7ec6e7509eb5692c3ed45c20fb5906025ab7867cbd1bdf472b34aeed4113f146188e96ad48920aa8438ec3a25a54e6ff5ca74bddba4390685bcb133e48fef0f24c84bbd8ff012ad46176d4cc2a961ecdfeb82d25ad81ff2e023648d766cfe5c7122a894c387dbddf716da7beb35c79571ab438169636f17323d0fc99e1fe2d907f66ce7b61c0459008021d110831b8ed9535157fede8da7c89c2149f060b556dae095b5a1293dee0b90d1c0036638b765628298a3c98d2b6a370ce81cc6f46afef82ae2b6c92d3741953e56cb2b4004bc14882a1a7b952df8c61bfc2222aea71708830cfcd2caee60e3511b007499fa8689fea690ee6c30786d7f252f3605196b171ae7512b8313f517a9590aa04ec9ad83de82c1c9c8b8d4e3247257aa0ab8437dc9dc6f3a456b5b0a0e757afdf7e9455f40d310b50e50822086474a38fce7113243d34aa45a50b13b29b20fee720908c7b3ddaa271161ba06f85089a9a9ba058524a79c405678bca3efbb3c0022d479fd7805ff22b97da774bdd4703413537f64fa0d5c4966a359271e2fb7562ef51a14b5101f755a3ab866f2075ea97ce38182ebdf93b4e779528ecb2c976f10b3a26c7b783ee92aa4e540b32feca613e30382e1c3d5b9590880ff19ef0754a5368066465c5b54d50286a91c3627aec5167d447247fb0f8bf43e97c26e381a8117c32c42dfdb3af93f4ba323ee9eca0405fd808f85ba6d1024faa838b143f985d6a0fe5d3f2d0eb7997abfbe87c736c8f8241e0ac0d4f02a302261089de09c9b894cfa0f7ed6b16653633ea7cef404830991cfd8f48c9bb2808659f09bb4998321fb0647b116a0b6440d95ebb6889e7debf5d1d28e23d5c3c8644652ed3d9da1df3343a3a7a1e3a9e924e2525765ce5298e53e4dd152c8c9138624a1c82bc9acc6a2ef95c8131ae5f0ccea248ee3e35766c6334b8d59a3112a555f3d17934e9051211b71d178381b503d301ac822f16cab18d7975fd919502b51fb4278a4b41a7d999bd3fb37d26f7c3daae3167d137762f5d0b6da820424b8202d6467db55f21bfda0048d8539aefea8319362eac0670171a187cf7221ce1a6b74e041d152a16741b0336a7a40b680e27a49cdb55c0af162b117ed800108e668536d3fbde95624240871ce293d1aa62d874e5a2bbb1985beb532a7aef34726eb9006d2bf7de110181ada618ea172af3ef842327c42c3f504b10b0137e503f4843d48d812011da2c5236c50f00238291c2fd73b297496862b49a1e401bedd86c1973ea59461de17c548a6a6c8c42c23db6c6808144ead2e8b4b65808c7ddfe3a12a161486a584d0bdf12a21f950f3e3b72df81ee8d5fdaf2b38d0f856b9ee8b5da28c0608f00b0e482f4f7cbcf51e77e021864cbc00017ccc413d386dabc4f11b5685fd3ef0344b7babdc8a64906dc539a21c21292b264dae5851ff80b291e70e02aaafbce8bf7531b8c5418939e321411ff6a071ec65e966a1c47045a5a0db7db4aba1d160791739a0b12a78019cf34439afcdc84b398702ee578dbccf0eec70c7cbf2b8dcec404dceb1e1d68ae52006306da178716c83b41e5e01ac1790c4df406f10e5cd414710da5a2f0306e6826b52c690688e2991a58262fb8086172c547d8fbdc5ec39689704d7a8374759e86c750928aa0025d5d699311c9944928ddb75bb4a8553308939b805fcc253a5b6a2ced2f9638eba0b4713891570598b6108368a95064738558d0cb25c4c5c4dfe8c70c751d7a8c25caf11fe2c9d5caf1b91395a66e19b2498d40c8ea47dcd3d42c633e742e5d0eef5d872e89003b17058ad2067dd581fea039526bcfe3cdba47702d1d27fefcc23f83c78b8605e202c55db28c04cb4d72648b7402ca7b52fe584b8d6368a3e7ba0a4a2230a3d1c13135fa70be9e448ee18401c27e7bf9c32ebcd6bcdcd07ca6935f0e9fbfa90e7f5954f26a000d290b21d576c5c53eb776d5fafa48918b4d2a0b42107c6fdfc8672968da2a1621939fda84363eb8c2285c31da032a3e0b7a7761ca5dff8af0cd5ff043b2761192a170ffa53836708df20018197b8bf7444c238ecbf2b3701399f35a827af6dffa76c6ae05a4d4769a979017f2802920b11483ffbf14b40b8137e1c97114a55ab613b3fc197e6d3356648b2116680fbff49b943f760948f998b2e2a6906db4525501430349ffdef0cfdc4b9282bcfddacd14a98d12d2717c81b55a610cd45b074d75406dd56b1eb4a7391f9864b0a6ae49f0ae92b45522862539d0783a584e76a69f1897cdcf90b303511cc4c37e1986e76f5461325e3ae5c6839193f67f6bc940ed9359804356426b65515f331f98a1b11e47a7cc171ac21284b78c0a81e0ed098f4c7c28059023f5c9514d2f529b81953f15c3aa645986279cb3ae4724321a101df17c1c488f0222f12fd1c341d0e4b4226c4ca80e13918fdd4f95cc08cd55dbe9a21869d4f4c845c892c2ec327d06ae95ab476ae7191d5825893f36ba21f6b24610c3150127d2f63be6ad573dfb2a46bd85a36058cf48b17970c4aaf9a6579d551bcaa12e0fa814e8eb35c309673664009010e41120691016c6de648c0a09ec9c84f11261449f46ce09aa8e4eb4b4327c35a03505946138e30043c8f5e50781f35c8ca369b942edfabcb103204ac70935af73856dfd9e4188cdea455ad3a570d5902ffba9c628ae81535bcfc8c938e3729845caddc916ef5b7a8e1ccf539eef5bd7571b8309adf14327198956beae299cc6042c6f52b4c428ea7f85f2435b44c1cc2f3ca14a54592d7451c98f55f52ba274db94c1cbf38cff8d02a6e7328b1c86f9c38ba8ee9901f1e56c4277124ba72c90b666a897309666d260b5392f74e0cc448ea1e1c62e45db691b9c7f05d1c2f4b82e801c02a6c3b339120326e0fc111934363d4d090e9cb00ee0261b58a30dfd7194fb9d5945c5dd3271e516270a4fc83400ef4402df3af26096ce76f1f3ef6a9089d1482063b38aa38117e28789060e97e5f7dcf6e6e09f04b0461d40661317ed2f333549c9910b75d6f084f64ffdb02f77133e5550bf5f791fde40e4775176fc542cc9c30c57b747fe3d4071d47764fb86a6d5f186907b7fa9c2039fa42e59087eb7c874c80a25d4255c4827fff4b7915b94054749936ed780eb21a9e39e7b4e6f5d98c624af74043d3bfeffcb44525a3aff2bff8f6cc8abb7a93c48e15eadc9084a729f145e29bb9b56f0b1121d9df07062e57b32389232cccfc7acc0b806b2a9eb06d4c7e34aa211ed7ee04d8e2673177ded9e5388a6d399029a10c0814e494e220e857205adecec1ebe1f1893de540df1ec9d2ce710fbbbd2ec49ed3b468de979efcd883a32917a3ec3123c405ae18d06bc1550ec4c269a63aaea4cb56d5b54ae8bc2418293dffa9ba3eebd8cfce962648fa8ac25b4098f65a54972daedca77ad225a3119dbd0344050d499d2aaaac84c3a9a488320ec60f0202f1000f95c96238a3b52b024d918e859540b01ea8ae704dfbd44e001e54a3ad4d805d2c71363b2577498cef94ff7d9f2775cf071d91e1b84d39f7d4672dd9e7bf8d929a18ba229f5f59c30c7aec12824a8db091313c76e5963fe9ef2e9a06bc7d8862e3fe29f17dcef3ecfd1ce65f178cfe4883bfdea0dbd4962727ead4604f3149c0b7c1748b5497575ad581728e848807a6b185bdfda8d50f24987fdaebfce092ea6d0f29ed66512965279d37eb7b8a7123641b92825c2dd9c4aa9cfe524e787622af497aab0f3b40bfdcf0e24ab4bff1e7503b03dd200b73f1af003912c3eebcfad77762263f321a9a1f1fdd9c0a16a648cdb86090774350cf2b8cc08648ed9d786708ecc2bd613631627c652f6f8089e486fb1a0f9362b0a678b59e8610e2f6d77e5f6c1d260e9000c5181ef2327946c6e3055e437a7381828e21291e798b314bdfbbaf1336e625099f391ecc842743b167dd396393b4f89b8eca0d444507aaa6039fb520bfbb875e901fd8de9f780cf771507fad984f2426bfe3d065710bc9408197ad2be03f0af90fb109345d700ce2e2c0f77c63103708ae2ba72bc6c398d83857c6b48bb75134f856b22b166b15062e8d22de4c62ad636a2e8577a1d8991fb68291c7ed98c312f7068b8fa037423cb19e5db35a0e7a933f3eb867d5385ff41d564f18a6ca7912504847fdf9cc4ebbcf069ffad90cb937898f8644b0c13062e69de22b534f57e7a8b08139b32fecca0e2463aabe0c19492bf09a699a4cee05aa7fe5349283159220a01c262391bd358dc8629ac5db28d040a7b4dd677bfcd31062334e84682c19eaf22f42e7da096707e7cd8ce5fd2bb46285a9160db89d09d3163a0d1fbf6842b8d070756745ead1fa20bebfc369c7611250916bee8910adacc0846beb9720226d065e334d93c9bd68539d1ce6e7b7b986442614440e39e2a24e14fd23d92b1adaef4412ba6042f438487b45bc48c40c480bfe7d8387374db60a337dad5427495e301ba71cc0adb1e621e689bf13d3b3276981116d64ff101b36267ebc4f5daef8fbd927876a3053e44ec282c0fa3adf71c93b92d27d7960f14676124310cd18c0d2b5bbd5574c94e06f42ff3f83d09d3d5a9da49675bf7009b8a3379d6cd9b35b281fe40cc60da348af222b44411019fa5089263b0468514b87489274ff427886122a1d579c005635a76e93118f894e253931f076b2e57bf64d18b5accdcb769834f5388825ff6e6ad20847b8b68c956ff994534fb335b36cafdc18f03e9d058db58c9bcd08ca85e5ebca96b208c53f0d4a59328730ac7c5054a5f88418f1379470249c0ae0f87d22658e165b44aafdd3e48dc5ea6ada04d6e76e191cd2b70bad577264483db27e9f7066e3eabaeb6006472ddb9aff337a7c66c71966107a069a5548beccb0c5e5a681937df1de8b3e5d7884859e00a7344437bbbbde8a02c04dc530f62726883cc938ce79a327bd6169d7db79f84d51d92e57f1a0aee5cf0c4baf4d236265010475863cf150bb6b554220b8e160b203a12d6f9014c3c06c2ddbf41297568fb8d2f54b10d5b2c193c2cb4385e98dd4b0d929412ecf030c247d4faa9e6d12038d487c4eba602893736db3febf4d1a0023bce47d5ecd5c1f17cc9656abd9bc6e7a27d0070261dd94ad6f74f4a0fdf16047709f2408eb4ccd930171fa4a7f66963f08e2d96b74c0ecaa8085e47d1a43815e55c9871878de8b78713fde9dfdafaa7ee3a7fc12571aa249580edba68e218177eef729148a0e3fbe979472d7bf77f9e1ad3e8b818eacb08835c7a0f7f53527ae33f5cee2c86bef164b557f1f8f8924246efa9e7dec8c831b78fe7480e1795c16e12eda9414e67b807b98dd2b0f94bcd859c89a04dd2ca733c179307a53c65fa42c82b3be8b43035c63280f66ac7efc77a3f2d75d58fe7fec8b6bd03f2f1f34508f0afae5ae8473e19460d02cdc72e6d73d5fbb1e03beac3b9954aeba370b675f198a34793a893abb1820487fb2aafc9dcef1fcf15d38e312bb9e4bf4e564beea52305f29d9c8417a72df0b2ed44d9d0b1b2e4199736d1d9f01370edc5ba196287687a3372eb79e5225a1a1b26a7a36d460c84b1b5706a6543287db2a4d411b2133f097b81a77e7f79bce9a4b5b5394fcfee4e7972ed97752128c436bbafc341b4ada3cf6192080b55eb04537092ddaec3334987b276f3512b285a5528ec02c4fee46d3ea592d4585f65255018fdda77b9f8a96edf7fcfb57e6d89984608e64cc7fe140ab328872004491c043efc19829a855f59a15ca0154cd2eefbdba4e85c743385a670e44020f3b30c3d117571d0d00b22b1a71516e6fc5ab3219c59b0d8a64ad6e14fea05672050af1bb401f5b130d74be1f485c141022ffc77a480c02999db4b691f8c30a8ea7c98cf6848ae86f2223ed4460cfdd4a5947435270ea6b2dd2c680b3c94a599af284ad31a8418b4b01595aca7280613e3bcc7f2a9387f61b427686b234774b419ffb140597b24b6d64b1a77200aea2ca8532be353132c5b878b78532f0a880981391a347f3f14488b6da01a1051f0f45e409779b24327c12ffc7916964f8eee9cbd463cf6c3e9124358f12b9b5bb98b8ff42c3a5e7a4c03067f78ee6dd784d88dac2537c412921b9bd3829cd643e0cd07fcf49c31d1c40a8d8f6be4ef83ea8864f52eebea490894901fdec745d2da48da1c9a6a0d332e03d0dfd4c7d7d850fbef9215161e37acaac20e21d304df2834b4b52dd905f86feac24873ca46306291306096647238d3abeec3df6e8da9b9298177f12d4d7ff23f8d7ec66e97cf0de238036ecf2b0b53066e175ba8deeee88a98b403aa1194c59e75268fb8e6acc329fe1a2ed622f7b14ef24e03571bb126bc113e61ebcc94ba4af58946e21e2f991f9013c45521ece4eae574b0e94d8232dccda3cd77b40913338964c71abf7b3bc70baed2460892b9ff16474b53903b1387327c08262a28ab9626b23067c71a45ec0168af559c844df89c1b7de84e1842795391f51b1abed3bf10f2b74cf1952ecbedd5b89f0508dfb33eef129b781cf93de473840448a26f6d7fa32cabfeeda8a7a121806ffd823cc7b6b65f196175966f2e5a31686e5220689fadb3392a09b4771c882925f60210c89067e923e18dce22c521004061f1bfc4e8c8136f778288e25a9db54a9136c465f385e5beaeeaad0be762a96346abdae1591301969eebc4f19aca4368d63bffa3e612ba1588bf6767f4029504b9c05d38e96837ed445f7a109176fad096c77674bac8c36bf87844f886ef29786a736f75c8db39a42329cb395e22c0e8eb8898eb22758418818ac2edc8578f8a356e22419231b6fa371e5da48190417a34a59e34a671799e92388bcb99651f8f3690bb98c117f1653fcf07db05729cf626b5e29fc9d64e027d8b36c27adcd17bdec24d35ec2a55e3d9c199b8d16a16bc0b13c10ec471fd865d1a92300eed435d529d3d367071dc65788d272330790d0cab1fa1f2339105053d53a48cc8af0ec83acae1cd1acb1df110291f1ca97bbf0a0e05e907ca0e4826ca9adc4550cea8035834be273885edf10de0a51f968e143d1a1bf8a3877cdee6eef54eb16885fba4438465a64bf9df3b0cb8e0eaedb9d20443fca5ddfeca000eb890929f807105c19ae5d94be05a670434e8e9ee181916fac726717d87e4c8ec3cfb0fdbf58f55810d7f2d5d9579123b6335cbda23cc00050d432def1f188fee938d26ec7576c2a3c4b0308b4147f28817c94b3fc36ff3ac257d4d06604d7f08e34c312117250074aa7214b55118546a4f90c1dd708fcacf46241df111eaca3ba7af08d532a87a5d31ec8c96739e9e4d5a053ac571d3c9b841380a5f9d8376468abd20d73fef4ac26e6538044080e36397552a4a69a765b265b5826b530e238885545b3e7236049894fd6503ddf942e0924fa32cda0ffd63abd6fc2654b31e076a6eea1f0d05c90ad12f6c271e602e956865f8b104ace104f6158538a36be176187ad0dab49a9546689ca3fbc7e1ba92415aec77254bbf321393ac044352bc4d99d88e0c1dfde5fdec1ac47554abe4afddcaef39dcff20cd44e51e496f3ca43c4f776252a8573abfddc7e3629b90328e479db5905db1aa0dba1eb0c20dad586e07de01b9c5b8e2e51fb08b88b64775ac1d82ddcdcdf0694896cddcf4051ce741098585bd023cfc0dca03437cbc1ebd6b94723de12c71b13c02cb7d0adbf790f7fe7bc99438a87fa6d82a36481e87e2c8ba4baaa17488e7e57bc5e270ae91e3372e412f47ed1aa10ac25830ff556b901105282e93c5636b779e8b09890b68e163803f6214797b55d7a7e60f56ebe4fb2b0b7ee77de069207e50ebd02f7916808441340a97207c417cc9bc783c2196ca783d162a59bd66191abf93977eda125da29fe9995c77da0d4e09d19e7051c64524c52bbf6792a3cb8836e8f773e7aad0aa87df2a70368d6ce9e6246448d732e2b98f9937a3c1f6d3a1ada263c26db26d6a54ebd3c303ffdfe591b300d0a4f5ca3cac37b2899d5bbfdf9baaf51a28a02350d3cd5ba97b8c1ffc44a938ff9f678732290011a7b72ceda3e236762a7b91b97e78dc403b976fc1535cdf731be41688b8f98e6e1283420f93ccbcd4e33287df7e75874eddd7acda999660d7a09389136cbc689f650367456db57851c38c9c40285912bed70e7da47a6c29349f6c4ce7df04046c6a6cda84d3996a13c2bef3a6bac17716cc0aab039bc85bca5e5c004f8bbfed18f29b1445642e26def5bcadc8d79ef48b8284c9cfb221df1f973d90a7df8de39ad8bd1fbcf6f29c38d64fadb15d5a6619a9fcab30ee5d9fbd6767ee5128fc6f89c1fa5f336559298c71d3d022c22575922a2e72579fb613a5bf90fa16d4f963cfeeb59669c6674a5e15f2e06a1cf3f7dc8fbffc03eeaf6975a667eb21fd5e7cb30df219a9ed5efb844862f1237e917da7c0440c8c1523f23807e17882d52fef22ffb41e1ea41089a335179f683538f5dfa72abfd683e12801b4a438379bf84b8ba41ccf3764a5a2bbc71051d1b029b6b3dc86390bf38557063bffd5c5fda2be59716dda21b9eb0a7338fe46763a47759f2985181641b23fc3f223d785cb20c14d093879a6923fd170235b6edf8675f9c1a77f36e37ddd0b5e7e9e00dc80cb912985f64a2b26bee774ae468d57ff1c38fe71ca5439b25e58e3102f8e1d6aa066acdd93c516606f7fab594c9e0a2eaf2d4dcb3c3da6b483ef9cb88cb453d6afa2f50c3a8e31cb97e289701fa43f931de78d49c985d93b5579b0441239bd28658ae34f7e034c78e932e49cda8df48a05c9c25e0de0b8d4788cf8daee4b0432e27c55dcdec3732be526586d906ece4909f7481dc0627b69b206004292742f1e14dab41eed1652a38ab24411d888228b80596d180fd1f2d009f5584d076d6686a5e0f6db725fe1c41faa7509ce0f3fde998bea8500a3a25f307a4fb4a42bcce5ee1b2478066c42d0cec0b90269dba2516cc2481cc294be93793403af27504a55e9742e0e8828a3ec5afc27b18af6aef7829044d75b3b1c5ab9d0d680438a52ffa12fb0016e69ca40155b866541d872bcfa9bdeb3dd7c5ed06b0655cdbd4ef06a5762e7ccd4084e0809c9346628cf57024bd7494e48862498258304bb25359d6a66ff7c310ff91a17fdb0feb1ebd05cf1cb4bf03fdfdf5745de1b71e1172dd7691e644f6cda2fb8656f043a579205e05e106db32db08b6b3a05eebad849a3be4906fa7252e450d9f106e33526e03cf6e82bb2a40255cfa4f12a595a3ee6cfcf3ca97cb5bda8e31e242094c77e0acce014a2efd415f408a59451d824a1b72e359abe1ecf79e76ac9dccd3c55217286928c452392c941525cf4f4627a7036d830704c23ba1e6bf4fad690e81c26b771ab1dac097877a0754c2ce3396097143282a296a3b7b4befb01a298decbdf7de7b4b29a59401070409042704df81a5d233955a96ed147673381aa2192408094284c8ee4c92019c70e8f05265496a468da84837c3061b49bd1790d4f299272133a0188d6962a536f69826aa5ebd812c4fd621907057af67925540208942eb20a0de128e1704440af5581f2e84651bc8fa90e406e79b9f81156ebbaa0462f449be5177558d9c85d3f39fa6b959a84659f76add62a12d162aa5de8cf48d0ce669a266bac462f1229c0fabd0e8689ba6695ed334cd93856e94b577992eb59e1c3fc0465e62960fadb739a54d55659d278bdcf85ed316c940f458b10a6f28ed15e636cd4b9a7717a99bc5147088c5147008782b3281accf1ec23bf92bc081b92b00ec01510c4cbb7f88c5b97b440400c86fbef51e6a432c2c4ffe0428f1fb2b2e09d8079b34d325fe9ba7f7b6c92f1ffd3304127eaabaedda56771fd76feaa1e7474fd334cd73efcddaac9669ee5deab43ec36c66c5b8548f7a33d21d56c851326f2dc18bb9d68811255f30458d6fa94b992bdf025c58918145cc0c2b3eb40e1fcbacc6fac3545b1e8b41c83b0cc330ebd7fa6afc18671cc11da66422c30632af2369937169751b95e4c2981f0d1ae6d40d58b4ce3f4db3503e9bcc62bb2611217195245ec7ff03d5f18fbf241f492794b1f6626bff07df5486652369531bbe36e39db3bd5f30c6698c745efcb4e70bd66d54528c10ec0855287345c2be42ba590d80943120b0d1422586259dd10c2431f4d0e224ca468e0d75a39260dc3caac9c1db691acccd048d39fe52f12a04355a48355ec62bf5ea45c77f9a9b49b7d17a13303210813245e656b3c93a4e42e6080a1b1bacaea0d46c3d36c6ecaa8ecf6ea36c50d9b802b3eb0ca116354992a3b579ab58667fefe0f76d39e79c47e4ac73d651d8dc40e268f84e1c0d356c6e187224448b519a118cc4a4c05204cd1317342469b929d2bb231e6b3dfa527443146415219785868fa72224cca872439a244765741859ab52a92aa8a39f0e11d588992826179e8c98d1290105f0339be5aab8cad4aee969dddddd55cf9405c62a70766fb000ee9a9e72bba65d7a91c671d774771769b797f8765052bb5dd3dd7a64a15a9f0fececda4042e24f545b623d510d7d566c8c655bcbbdcfd16f6be8e7e867bd6decac982c7633630055b8edee7e68e8aea531be2a8b21140d02227b36dbbb3bd33451157926b4c16922f55dd3d36aa5ca14af0764ad9240c8aeaa2c4badcbb2dcf5a4744c4d3a5df9fa6f2e7557479a26bacb728985424a8a94c23bf9a5ebfd763d291d5393aef7dbf5a4561d93aea7deaeee32dd2255d7bbaa6ee7c45b754cbd1d4752ba27a89e4ec7b4db26945ecfdebcf3ce7b9ba2485229d2d2bbf4fc64efea7aa2503edf063b610ad99ee5217b343ce2a6a4d4da79afe7de09f36d173d4194a493babdb76eeb08b0f7de4297a7435194b5f7de9b1cc9deae27a5636aaa92c0852d4bc630316255c36bb2a091f1c24a1b1b98780cc9f9e2a7d1f0881cabf3cbf2735816928da8c06dff5281c3b88fdb8fe1f4884265ca18293a165a61baf018d26bc1c9091357a1c49a12254294a13aa203872d4c673ad5192a364a52637c2db0c0df3e164102859c73ce3947ffed39fb89f2e797e5e7f961257ab858c00d6ed3e9d7d20ab0c44ba42248fce0363e8e2244dcaedfcb0a307420fd3883c3d18d983365d6045bf0e550ab210c4fc80f335db68ca086a35e580932599a4a53c36fd1124edc3e16b3ad95cac9d7f61bd37936011c371a3fa2e0c052a386c3fccc6c19e2e44c1555cde6706333c317ab2d50d0d4f0cbf2cc36c1613744060e1382b8a82d89ff83459c53190914f87ddb632f61a877ce59e79c73ce3aef1ce61ce69d69e1dee1ced65a9bb5ce318cb32c763b76d92c06728ad3ab4bf88938c0799e277a5a9efb79009d0dcfb4304cc791f3bd9f90b888590493e2de7844be337c530f1e6c377766afadec4435a29ab5d962199659cbd3f315581ffd34fbd7becd00fd125d1c7bebbdf596a5f856602be8b115589f1daef9c8bd79840641803b4bef7d9b01ba4d6badb7c596076b3bebc11d3a0640efd13a6b9d3326c1f2b4cc60a4a6cb8b2d2c40806a2aea0526543d76c0b88140c40a87d20b4d5624b941636da3bb0ae18728480d3355296c99b233b24c76f83803758ba1f7647fb4fbb59eda2f3c03c1655cc665496c2399fe42d1e340bd1048384eb7c9708f4cc6e168c75fef7219082014f6ca1eab4836537ee34896e5ba8a434060188aea4d05ea14c989379498c2a09036a6a85a01049eb6bc5aab41b412244996264e136669827c9e61b49d6b9981b25342668b7ae44a0f9f12251e4d4ac8f46ed090822d70473776385c59e2702d82c1e08da3192404e111261902090f4aa1755096d3ed44d0142a3135a9082a75707ce0f56c77f273c0daae8b2a147abef9e69be69c36ee11beb7ea1ee172e0e393b8104838abdbecaaefbbaaf6d6bd32509665492ba1c3a11a6595a5d6e26db15029dcd18ddd6b061ef9cb2931e572642e3796e5b8c97b13527fea4fa5599f3dbb3abc93495c1448589fbb2397957250f7a6536f392526299d7a2b734a3935ff756167688f27b4414e09e764207a44486da72ab85cd313945049e64832a774b7127973ac1048f8ceac477fbcf78ef7a667d08d95a2a9b53ba678e2025d4459addd8ab1cabd751be7f4fca5b9374992977482e5cef34449726f132658e8995362e259c12245bb71fd8dab2c5d6b90e5c9417946a3d18256a4d0e0017a5dd7f20c4ab1a20c2a510c52a8085a65207a44d08a0455049525cdfaf08b0669b066c0ffea588a92d5e2a98a20db4a6d638945343676f8578717cecdbdf76e578a9b87b95c7ff33769076ede0573b95c375acb703edf88c0b971d158f8e5e33e1e917302fffe8ddf8e99c7c731c4ac1024024b7621a0691a41960f8481c960839daff32766a5f1f4f4420c1e547a4d8c3c35cdd0e44811946ae67412a347baa300e176ac7082151419633c0095420e19bf9b122b2fa648272fc27c80625f60e3536b009282122f60ac5cac3a44e0d404860d219a04ec1e9113f08329b9191fc812460062724c3298a48e84a086750e0bf61305ac71e2f26434a5071621848c13522fc7549a1a163f00c076f2e5c90e75042c3b629461aa01bc410a902ae984dbaf7402630dc06e7201108a5f1693a907a712f593c2711b3efe90f4b0dba81f918e74b5b63eb8b73856d18c224dcb8b2a49c7f847fea5630c83218aaa04d9c871b41ee7041ed2f0cc43ee07858a0db8fc3ac62a158c6e3b572ec10edc57e7eaa0a2f861cc16fef992bdfa4f16632326ea61acdfcd80367cccbf637ad45de747f50280aa4acdf86f51c6df41c6bf817c7f8225dec50cc3300caf388a3a0caf9886699ab19550dc2fcd752fcc3be39dc2a3e81383e11d9c2d54cfe989654f467d43b26b9b06c89dfe0deebdf7b6ed71bcd96aad55ad63589ac02818c9b75a848b77b7cd48816b13a921471e17bb8de2922482ec362a8908d7e9e15283c33897a2cebb8d8a21d8d7db13a5ddbdf7de8b4e055bdcfcc3e39121c30aeed6eb5bafd6bffe4592229a2ebd54e4d92be51d7830446647d02c611f5eb673e2f5565fd31394d495218b6a1445f5d851b4d56a71143d4dc86e5cbcf5f3b21e1a79629e454a15d46f0a29d80277746387c3e1703fa0deaff7fbe18e70c116c1a0d006220ba1df922b648f085a091e54cf89c74208873b420212da602818e46329240484e2613a18aec5424f13a609d2048dc35e3fa97b21e6553b740a77740387435f38dc8bf5fa174bfb56a0a90a1579f6c3bbe087c72343a6151cea80e5c1d00abbb2e71a0e29d75b974049e5f76008c5a128ee8895a2e8f3cc27eaf9f53a960ffd1f3cc462fdfd211eabf573814b87e39cbb582cadd1744982cfffa1c3bf3e3f089c5204ad044d820e2f9c18ec653ca4600bdcd18d718762ceb34bd4a75c984b12c332c14697caf7de60ead3fdb1890f77ef39a5de8c54759f8f635755d116aacf9e9e1e1630d4a81e3b520a3725a626313cd5f3546fe87975a8868b3fdaaedaf3faa26f8e6708241cf7ffc15aa328caba211fc756abc551ad35aaf5992ee198e9d2cd67970c842cefec982bc663b0bcb3bf15fbbcb37bc25ceb0917ebc30186119c5cd06df1b55085fc6200da1003042a3015b92cf4f8717f309970efbd408090f05da61e24b6dc7befbd42cadc7b978080b9447adceb6375efbdd83e514cdf7befc576ed38eb9ea5d1acfdb1b39f1e3bebc9d6ceec0fce31ee0306032928a4790283941b442a58a274758657434e062260967ee41f3e0a90828f950bc6191bb7164018f213cac184183ea0e58718a8201885574dc02fc31888081660446404ca0a43471a1b5b4610250726aa2b52aebc9050c34760b00af7cd302c430ec2744c75b6ba2f2c92a98ece167e623414538d653b8df9f88b6319eed004b77079992386d0ea538fa7cfa540869b3eb1d41d6326c618633bf4eae3efffc9e3bee3f89fdac6514c6d9cffc838eccb9f7c6f6af360db60a89962a001e297b10b72c6bf7d4c7fa8729ab88d770b9670dbd0ab872990ee2e2c4f6870fad2468c0b366a3c3c9e80502358630456b5fb1cc6672ecbdbf0fb3f40f96742938ee75a734a4cb7e81615155d15195ddde49472b7c895f338b95ccee3e4e07ccee7e000875ce9524e4e1ab40257608b9cd2ad45ee165d9da084f65cb39d1ffefe825257a6c090b1bab22e974bc95503e78f3eeb89baade57ceb5bb85c7fbf852b1694e2e2bcf888e384f37a9c1c0e0ececbe5e2e9124e2b5dfa90c34a973c50009ba0242f787d7e20a00f391e2880fd043109623db49fa0bcb38b724a4c6649c4b14bc619023fbb8d0a13d43911a60adb51845b549826aac6e6bdb23e3892581ff1c5986e1ff3eef77aebda2df6f9ba7d7b3e5687601588caa3dbc739ec0cab778d9dddf10517e147a3db1f7161b032fcb673c40d7d185f43d31fdacc280626364b9c44e5d12f108c1bd2efff5e0045e8f76974ac62190c7604766165f8f1197bbcd24619b7204abf5fa5dfb7f96c5962bd601aaa6418ec6617f6ec2a265df811803fa664070a02a85c8cf5779d8e9607e74e275b7c0ef66bd0e3b6dbb7e98e45510c310f2fd19cbf40afca64fcb286c90b4c9b21ad3020e8a86a8e516066941674316aeca1fe32021f80975fcf9897474cfd660b0309ac18cb6cd6310c3090d35b95deaaab5e9b2489e5b18f32406319ce8173601c18074625b0ae59736579ecdf2bcbe3009bafcd46b18f9564d2f23aca00fcf971da736a756c63ee56e1ecc0e49c28bbfe92e79c18d557bbfe57bb4e9772826cdec949f1643a5a6cc5048655ad915f7e7e0904e1b696a34bf3cbf00a96e532c622efe41d263cf4852b969180c26d1f3ebe24ee0d75186ed7efe822adbe706fadc52d8a61079c97a67b24867befbd3fcf422a7627bf16599770868c66902f89dbed872b9ebdd4104c58155e5d85532130b40a83a22adec4a29e3fdce254cfe2149edd548960aac4abb1a8270245ab511d6f3d8f463d8fb8f1a8e71f4552ebf2fc3cfbc9305ee64dd0c4b14f7472ca331129efe4cf894eba5e17773dbf4d5c7bfe12cd0077bd7d6bfeed2b4f78af679fe5b13e3a987d3d4775219d2afc27876b9e51c0eee49fc167e697f3db4260e8eb39fcf50c14e26dc235fce5990580b000a68513a4bc08a1963f04e6190a17d244054b405374a4963f5c435fb85a9efc1a40e1f8f576e5749770edf9bbe8084675c175dbbddda28b0bf71a5ec123b654cf3a37419829257614074b2ec0f81191e5a804cd9be994a1912280822200c316000018000a8483a1704090047232fa0e14000e5c7e40684a3a9787a4c15010c428088228088218a38c318018628c614c11997676602acf413e8856a621e6243a26b534c423f4b368a0e7dfc804180b3a11941155c19bc3ce34b384687627053b304c13e789b0a528a85e39e1e61203a02138d391b7443a051efec5559b68935640f31aab70f424abb5e619efbb2e44369394f07b325abc505ac0d4f33adcfa29a1c562bfdf1f159830792e51a4b7bbfbe4505cffe31a2a203f5c9f20a80869d225ba185025d0936aec19b6e5204f62ff3d0454cf539d4fd3ddd0ab98e56d4b12f105a87e379d786fc6303166a3a19081c8a092422ca91b77c4c4d580b86f2f5ab7b9e79bfb61725aaa75356c60cf7a505655ba8314a627a7afe424caa403ddc91005e831533a4689fd3f4864380c40b0629437fe25c24603e0474e0ac1d24a88d8403547d60651a73c6b53894c7d1d81a35f1fde04f539aecf676280fd4156d35c38256c5e9910a38b79df27028f58adaea7645ee7dcdf3adf4ec117b509291b7a1ed2f59b5447da06acdf98eaad52ee523fb661eeaed9ccecf211a80a216142e8a08523228c815e6145c9cb299a96c80e72b51190c6188e37da72857980166a7e8d537437fdc83e7a602c638f9fbbb5efc5a972afca106eaee4585729c0a728ecd9c60d4620192d90195d67b2aa8b3c4e2ae2ab938258e2121615e980de2005522b4cc0dee077019ed5e938b3a8a44fb13571c417e015198c34f01a559737d2a88b84abfa9d42fd374e806e2abebf5e70cbb8f5e297017453ee674518ab988bc36b9b5c72f4a619850c68bca6f4853445425477a6a74250ca4c8aa4d1e9c8e39ca29074e7fadfe17cbe9b22791e8c640525b643e84ac8492a7226466767c9d36dce0dfba898ba6ca6e175b4a06a3cd8230bd57e24ba630e38200a2969f808708fa0d2edbcafe9933127dc28e53566599ce39e6640463f91140b5b408b95f23e5a38088607994caaaaf66ce7be1accc270abfd51f82e1e9cfb4893a95937f6879feb0d881b1d678a984d7af3abf35b0775b4ec63b640027830d8780d0f29b9313a4701df62a5df05032238a3238d967dee53cb31d936a5abda067830439ccfedee4d7613bc99a00a6f7e83fdcd8576ce31871f879dd67cd22eec499631f5bc7021b48546bcb4aa39ca0de18007034f45e554b6d878808fbc0bae0087df3f8ab47d6de56591ab2e65a7106066eae2e6310f8e0d4e97547c42fd9515ce9b846ca6846da11cf4490b6dcb8c7392cb8e524f1b2b594397c1252ce18139ad719f203a88af09e6828a05d2a8e146ea53357168231a45823b8a501fba50612e2b1631177faa82216ac9fa4ee02939bfae464e21182c3302da48b54462f9271da05920779e1b1b42a8561e8a418944d8c8a4fadae9a3d1967cc28a8d69d72763b482c6086314022d28f3e9dd208bd41b9221614c0717e27d4ec6100c46700a030a4a7e4799a75ec4a62fded40818267ebbf79f54b69b08d5374c189f362bf4a0343fab06e47831880a6bdcbf2006ae562d38fad83645b0042ed67d409fb9330ca78cb44c434aa2daed990978ce4060de3d32fd6394c1310247618c3dffb934b58d107d8c4531e83ac5f8f722a55f40ce1904314877d8a811b76c10b98a90db9b54b0579c38903ac814263650210889287402a9eb1e37718e6c95d33c8ae146b57c96ac985118fa8f27b396594283b528837538488170a443fb9326d5547f6894e0f404908617cbbd2b2cc0076688a371265e0ed554fd18bf7690caaa16c85cb0bb0844fe19ec88dbc5074c7d25788a7c7e752b47f0162ca9e80c32513f049f338140b2e05f6ec3f6fb432ca4499c4044b004bb74a0533f7b3152893b8b22c32804960b30dc9d12185c5071eb102af228ec347610204134caaa964094010ffb0b15a8accde5a4615474f6fb0835d93a181594321faae838993f91296578298a9742e6c9cc89e280c306d1bc5cf028da0e8f0113d6fdd65b07395134d988ba8fa1eccff33bf69ff360e0619e0a9f17bbdfb7b4b8daba6bf7fb0651fb399a60b471f77bf0068a2d2c9a1c453cb7bdd461b88d512ab1d240d3eef7fa856d0e6aeadfb9da394ef56fc5d4bf8550596ff8c951e0016ec518b58d3cc0d50487342ee0da60835e169e898d22cdc1333cd014d75ee5a2459221cd95eba6fe8ef229e256093a19d48f81e27e31aa3bf863e57612d63f3cd8c35b78e233088c9fa23d6bb5b5113c2871575c6506d0c4fc5b18dec1eeaa9066181a373aafbdd624d741be43ec7c67641442892946a40c128b541e1f08fef781e8611e2ff2cedf9eadb767b070ca00e44c9b5e1197566a3f26cafa3ffed42df0b676998a816f0c9667e2fe8a49c0502c0d01141c15d0d52c38de02644f4a6a2575e408fba34c1194c0d0e2663d5e57f55f77400c7cd0d296c13aa37411d47d7de07e0583c2d506e5534dcf54e066b732c4b22b7ab54809f564b76b52e6d10ea08d54ab0085e18c80534c719b27f9b006486a0090dcf982a7c272aed79be5a85920638eb324112550b2d1d93c696b39c0b5a144455a6132bc703b4bb7141fbeef8a6058ff40f07c8168289d25e767178796dca97864c18f6a305094b3f410de510495f5b9a509e46d23523a1218563414175cb3635399871f6fffad3fa0981a8094ed76bb161e7472babe14658002f73a29d3af3522559e73358bf5f9b915962c7ca3b42b0a8662106d0ac2b054c088d78941ea7441f3e71f92e553e424afece6dc30a451f45276d6591e22bd571a1091998bfd45b3147c0ca225d30a899953a8d2e743d13ba469e78ea715d407bcc9db0a0199da523203bba64556604f777762d9ef799c388ec82c97be955aeac2f7047439149a800b940e98343cefe126f524f4c15ce389b398d1c0648143881c968d30f05cdd51e5201ed22a4b65704fbb80ed0b8bef03d90bd5efd143d931cf2b4bf98af32341d4a92224004744e9775b363fe235bcb79b07992d451c6fb2add3048832d53b034d193fac883569b9dd728c675dd6176d19a3e3ab3d2dc2535747f311a90087c75f2deeaa035594c9d2613f8fd14017cea5817a771895604c6107f7b3db1cfe4462a3912b231c437d5746b380b4bf1dda702120afae8b420eb0379d131b80464db56b5bafc52e8c478bb49759d202bbc8da8c40bfc3bbb52532201d652010a86ef0eba4db74b8044f2c0881beaaf4ffb1d55edaa2fbede5025cf4ac875170b515d6f219125d9571eec5838bbbe34a055097bd0fa785ed7e9f8c9a1c289479f3167688083315b6a12f4a6e1128aee2baa3f1884d2612d88b4f7f00d88ba71b37b9759edb5612e31f67d523373666eecac95a012fb9901bf0bb3b79d2efa69a6c2a3ebf5e043ac08865d6346e71a69f9fcbe4c3face88a93862862fefee6bc0fa0360d06e0fbb3e0143fb436feccc0d82e075ee7a15e717def275384b31f969caa528f7de91c704492585504097e606223660f7bb4ab7ae8b19c70354c0a36f55bb804ea2312af48def5b26e388fbf6c22efd1ae5483ffac7520245fc33f6947de14d326be83d40a7466a7f766e8ed117b910076fb6a60a7a8956bf0c24ac304fd2e91d3c9904320090cb245388e49b095caba76a3efd9cc190410f5ca943765fc86c1feaf17b98b7e4fc3073e24073e76f09d8e8ffedf85376ca3f48bf11e711497bddb823753c95edea9b31080f21875edadf4175d39f15caf3edac49615647409688d01a59f2bc8147101a079db78e3ee31fe85a9f12a47dbd6d7a5fdd11a114bbd309878edd9a57d2a6a3134cdd3b74772822ef4d4abbddd1936ed9fa6b0392ec09dbae230f893598f20842060b9e13a8b1e695cffe1209d955992cc7b85e158a569109fff42aaf93d6cf1463c8b1e8c0c62f17c311e6c87412794cec08af54ab8d9c53e644422afc9ecdebef868a4ce4cfd330125452d00876e6a5823e8734a7a1e2ac08d58880ef7e113dc88643facec380a7ce5f426cdd99f2f2d9c749123068b7bd34e60ebe01fe73920be59eb3c2533a50611dd14eab1f2125b244fc2dcd51a719a13fa989f2b8739b1ccda08292c4d24d9a59b8b56dbc9e0068eb2a719793048816c5091305195acfb89c01e0b59500851b306c753f9a9bb378b5fb571180b12431b264dc2e3310d7bf353894a3c53df375a29381b5017d53bb1026d317783153181ae247b0b171e60f7b882b0ae9a965e54cf1d96b47e43c44639d22a0897c39e523a78707a9753a322d8fece0bffe43a54b7014f63549be172867eeb84f91cddc099da7e276665c882b070673889f51652202fff158d3fb68fbe34549f99bf2cd12427db221248f00a049606862e3dbfdf22ed177136f4297099c96801fe00b5bf4d871322729249cc965fd8882a0125ce625620b600e2233d7f026e83818f4e2afee937f007ad38f0f5202e888bf8d127f81566dbd0ef33f223de621e6aca2a04a6cd01ca26b94738fe674deffd5ffb08e178b3668c590830e718228ab1672043f9cebfa19fa9b7b25d8275226ff123afd280a428a4c46671ff9cd0ec371c2777f888ddbf5f81a54d2ea0b5e4cd9d4762216d2da6f540ccd132a81ddc4e266790f9a90a2f4f6b5c7aac9189e473fe0f978d7e41af6b18abf041b2224f61b3262c608940a0c2ba1c8b74d9ed7cefb0e32e5ce7eb8431ff81eead48fd819e1e8f470c4453651f58c2aae025191812006befa17a0a051f17027aa067342002c2b6fcd1830a2c62020e0be0882fb40c9209c74de18b07d3b9884c2545e86cc95f1d3625133da93b08f85052f2e9f25324998ca9d4d2d678ac3cf8f7c8187deb8377879469e21650412088f05505756ba3162fd336ed252e6e76495884dfd7801ef06895dddb2134ca21d9acb85ee07e588c6bb08d770788ad518e1bed0d707012e4b82b78f54e83007148fd180978b64eed5ae9371429995c77bfc73d283a641af36f942537e44ca74dd85602092cd15d61fe5f9804b130fc8fcc90097ce9a17f394cf3a20cd39e9850b2a0eb32c2d514078269024b8cf7eb837986f3c8cd50d2eb8817b583f0874b5af454ad6dd1449d85364db6027b89848bdc02b7eaa3cce0b8c55e52e2b714352e79f002dbbaf5e3a6fbe55d202ea55b9812161b5c8b3f7497c7cc7bbc0d27a108ff41ccc51d2fdd5101bb7a6f0805f19174844ff7a37670e10fcd8821c5b13731f0220a949c970667b904189427e1324ea91a70ab8baaa796493d06fd7d08a338a405de9132ef0243f760f9e9105d6ed75128399cce059f7b929f9a2e5bd98e93261c1aeb33d6d3038c0fdbda70683e3a79790afa0ff97b6e1841728ccf70294203a51d416d3015d700871ea78ae026aabb630210cf45faf33b81f7a2f5292de1a4f63935207effe9f8fabf60214b6080d22ec3eaba9c645c036e709a2e2223f17212d57964b7d5981cb86aea2fdab79c2aead91a77e5f1adf1a8c1fd5e66a124c3cac009e8bf8c8564be9a0809bec6a1c16602f45e42abd37f68748484411bcaa2739bb4661f718f143df7eabb588888d5d312cff521c8a9acaf1a0c3a639b59569433a4e5d55f38cd1b055f32143b185678475f558fd51429bb189dd8e88ed3fe39a39626c64ec9028c28a5c4eb59834982b3706cb3f3a364e1b0c967f7b8e478820422d6b82475824a90554f2734728521fd3ff11f7d598e3a84df380d820a52d5b77bf7ae4ac8531d381ab415d8423d546089c219c4b3642008e9006fe109531ff14d057ef76ef944d6390c4281e2c675a43214dc118e7b6c9dc9b8df01c12298783f7346b3bb6aab840b715d6d28163c48127af9c680ad2ff6731d7abe3d4ef01b0d03fdda906f3f4a585d70793640799e1886063e6291a037f1433864af7cd38463bbbaea5d10e901d4b44b50c0cb72d57fb2811c426db07e7169cf4d37d22f336702b3964d75480c456749d3cbc158dd6b0c75fdcf94439c3a24112c404e584fc423ad0b826dbdb3b9f6112384876784e85772ad644772bad4455e9b2502a732e2e2cd956a38d06176ae3e7123449a71cde23dc313dc9d3b893d69cae408fba1d42aa1ebefaffd115b1f5a47c717849ffca567be55a89125011caaf5ea24abe749d2cc25e9b79ac44d938c11f5d39ea18b61b90991ffa90200c417ea1324d50a837b760454e7d37e308f049b2ef52a64fef5d642a404bbabcd543a6823ce83f53b20f717114e42608e7d9d4de48cd050a440d4c9cd79f0fdb8a7f5c814890911b90698d9812d75a2b4fc7408fdaca1e05b76e56912af0378d29e6b402589c8effef702f6bb14c20f5cff1f7e21731f8c19f2959ec4e9d1299484b77089312c20542b5b5a3654d401b0704814620b49c87a96b1bd0818c4406f604789c42744c140f8b1d4bc1646bf34fcd0d2d03a885feaffdd99bc5a8b685914af17a200e6e8683e7ae7fe26d3db148f4292024907cb2f18a5e329c6e8b89375db2de638e80e39d9f8f0ead32663dfde53123a690dd5a38970b01d02813ec9513a242b1b0e005f5a14172c08433009080da324974df1123ee6f4a9d5bee2c999bdda663b2211e4a86255ff8da0a9093ab98dee0f89aa4cf00eb84913f6f98f769c8805781bdd6507669323e99791bf75436412be68ced6deff6195054310a91781266c4da38852b86d779ea37e6a28472647e43b34f438eb80bfc15ca6de1c5db395fde7baa09d4b3812ee4ee0ef0e91d61b091b3b094b3cc781426aa7df35642ede71fe4f523850c5ccd5c071846db515d0e69cd24b62054e24224c556cf779e236fff8d4232fda65cf60a2b3f60a411ec6d53fbbd19ba5f0ba2f3de6c6c54cbdcf7ba6fa10d5b942d54172f629dda57282d4986c817156f4c2f3cc634ea2b79d5297e61ca5f5e2af6b80d83211fc11ae797d91d08685ec424cb684b96c7c404c9c6e2a808b4a497a6ea0042e8462dd1822c890cecee29b0c7ad6dda0376fab6d5b4eb6c89a6af3472673d69ddea6eb19680b75894e379c7ad1d01215145bbdcfb4e9f46b523d88dd7bbfe078cb1de3ced0662c7b3abd57c3c284cbd67d1910e52c12b2d6ec58afddf5a24a5d00bb291ac8023dd47926df46438bddeb836db529d8d5c7a8bd51447caa0261c56e15d819c7c287a8d8b15dcbc330fedd5a599a112859d83e763ffac8c42f9ec1343cc120df4f4d494162b0c596469ec95f051d59ccc8db4b91780358bcb77054e1018f6e1bdefd4bc828292081e8696f0ee0abe3bc9f3e1817b363d42bcc86e09ab8564f63cc11b438a9309706a6824239fd0f4c0cd0b3a6e144d902d75f9aeaca46f1cbda84bb8af114bf2f53f5687fe53dd1ce75728a9a3b521fb3897e94b8bee07707cef8cb83acd0a32d0847abba1fac0b8074713fe70c9c177a11a7667bc5653eda588e7647c18412c2e09b237bc51de897296ce2301834b4d265c20b981e7b5c67ac2e5ceb255b0a675d1f504a197287aabec68fe0b57db77686440fea7c63cb47c1e831b5d2f2088579392831618eeeba97e6efcb9a4cac081ad93c9e65a4ff0d163ce93d8eca2df4cf1ca7e4bc8e3c6f3d7e34c4f1fd03a9f4a47b01e92625a8ecc3ba373cee9b269ad495ffc0215a0d325f2c1af0c7547e1d79ef8598f71b2f913c1c333dd4cdeeca79fb8b3f16fb92be9a9cd4c19ad6bbf1142011bcf60685504f51f55e5b5732ec209a94f9baeff0461e4971dd7f139d493e03bb5f1534d17cb0078b7c3b778290b0445e40cf020c8c6f59f264784f3254abc100fd1b7dabe93db17a5a3b3509979f8c9ab111bafce3a201fc1053557bd8924098753f73f8d4271c92e7ddb042843146a5d70cbacbd4d2053a89cac1c5b348cd0a79179026a80740a63b1fcd6c922341d94c6a414cc3a65643a6de4236c8ddb6d589c8f4760da1ae28599e4c606be650ce4129991b3b2a23dedebae6192bb922c8a6a1d491a6ef915698451b6ffbf52fbae7b63749acf25e474914d8edd92fb8019de9862baec17945155f8162ec5c7216a48041b47a0093bf9949116b100ad17217d24aa8dcf4316e9503ca3b2021c93612f1fc7bee9caba00faf7a1705c800df745c1bc026b84399de094a5973c21d17f217f4e0404acaa06db07cc3cf8bdaa24a9d2c475354d50847577cd7e5cca127935ef13bb123f6e29d3e3c361e2c8bad40b645f676de9853ffa392db2fe6f0fed61889b218bbed878870471dfd7cb3070606f13bd455dbf632069cb5e5801c36cc3c74cd9270e4a750f0b6f69443d528cf4b5e394fbe53c7464016f6c7dfc0bdd8b13c41a6045d7f433b0042e58596122126a286d17981cd257e471946b3df629574c020d7548a19e1368a887e511b7c3ba293238e0684e5fd1e2a6a763f7c37d7f2ff461056915cef52f6fa932c7777f08f6e6d81b63b14439ae4784f52c613026e603ea7db26e1c04ddfdd2afeb7ca7559afbb7b8427c1a3937f3c70810a0db53f5268b890edcb7519f384fc8f5141a5c821287e8df5379c9794f6f807effda80197c191ac043ce905718b52926dba8e857afb00c9f12921b59aadb92aa0bb8fbac691f665e0b31ff6872a7311fa643727400a1c36ccc24e42fb71b73005d267b2b5e3664dc409548f80d477737459d06d5d08791001886af27141b38db3f24c20e039b04c708a5a7c2c0a0d1e3e57cc546a4176b6d90f55b62a9231fbe2e4784e20e305f873d7e35e8b3243c66573dfc1d3cfdf26fdbf76dbf246beed92dc14be02ab828050d2e4d6591aac7e0bf37804402caab57f6e53aa2c7f5fe9934845ae5449d78a0169d6731cc727af0969357cc80f8ac94e946b3eaca1584f816bd80bf8b9d6acb10d68b81271137502b7e76ac404cc551a1a741ad08695e12cd045f01c452c378dcac7a508eb85b06e54fae439aa070dda8c177dae3212009fa4639113ea2181f31310ecce7eb4646e0d00d3fd6074d98c0dbab78fbd3cba16713b1d220b160130156280b59b83f898bcc6146d2028b931ea981aee703bc694084ea88bae3b7a36911be2852347b77b1e857d189b4343c416b09a12152e1dde9a1719418a160910471016b94df9294b5649049e20780c49e722191c6c25f5631e999f71e317d0bb365e92705969f6834e6d25db9b215bd73b32e5247c4dabaf312c9099b1112a9f7c512595461a95842a60e4d354ce65d0a2212eb904587b219b6070fc45a8be565ed88b547f2673a3b13994376ba0ab93a29c9b277726640fcad2b81803d62063162af945863119174bb1d8eb6e774003dec3c5f6fc587ef494d4aa02733c55b8d46cdbd21809eb2427c9025db23fba6017d98c2dff7c529671f7335acd4daa8c88ac7fa7483407dbb4031de21e28bd2c30d7ec9a002248baefe86a97bc4dc32f146ac580f7f40c683de03eaa07b212319ee62e51af5ef5d4c0518eae2eb79b1db064c6e430bf3b3b8a4c25a8aff9a74d8430eb9648729d0cb2f6a6c21ddc8cb61a8865bb88f87a6fc079bdebe557aee5d5018f8919201acd1794bf50b6e9a8ace49ddc6da6cf8c90ae05ee5eee1087482bd8898c70a17154c4ba8d8fd9b282d218eee0f79a425d4e75866cd7122c24b7a5f132577b3f6e4cd45d84a7e60842cdcd4abedfdf68322bd6a91970f28203e27cab9bbbe6708bbe8c9f005b0cbcc21c70b3a7094c7d75905a1b5aee0b18070051a260ffaec88cccc650348a5744de53768b04ad1016871407751c1ed763dbcc60f8fd378fd9e1dbc9aaecf19837fe605c9b30d783702bb93e1d9509ddff1bf5849e0d064856a35e5092b252d6f4ddb52adf0581921f386b9240d6e8ea141b92e77aa5c172a2cc10d697ca663f9e9f917f743cadac6facb1a90e1b3b857b3f501e67f33c6a4dfcb20077bb5fced118901553cb8fa76195148b9bb257f1cdf3ac50daeb1c7fc54cb7ac761b1c9e489ca6dc1938eb5eba3019832929292a2a4a26510ce846c7cd49d0bac617fa5cd8d5d30923bb173af467625dd4baccb79979d1c640d1279f9c31bad5ca965485cc878621d847f831ebc534e26d1c7c89a433f6f18eaa0d429665d40f91d27cba2a1accb0e2395faef2e36038319f1157f749b680656d32556e30529ec29615179a2fd04466355904253f833d829da50b4876159b979b93053eab4df7373eb6d5433644f99a92dd91d996469db01c5a3aac5432ba307410bd03e2be9462df1c0d13a63b485b2d26ad1bf4dc60ef31cfbc53ebb5876c5ce7989e648d6d28bca5984aed788d4b746d65e9b4aaf3d34d019953dfe0e8f0dd00943abca1227fe348a4a2f3653847bd095110fca6968d4c3cd509a64b2898b4802f5e7202a84331bf768480b7f88df9062011e01a38511c7a701b51403e34aef11c52e7db0d993aaef08ff0dd2d191401674dbc128efa1e02e3d56a84dd401f410cef257a660f9b2aeefa838f346152ea4227bd74f76b9430d605d6c3b1fa846c0d42b642ba70fb134fd06e4f8c6d5b7d46e0b4d51e771ce503048f9a21bff33dcf2e4f981160d14b0af350c3e3e89a4d0e82462f16710ee4d21efe9345516c910bd185b0b7a9e92573304dfdff0184f9f6c1a5688e99db08edc1e42e1972176deb8ef86191c3ac49a626e46b4419d0a6b1e851f80c471878e1553ac7951500a31ebb0a4f15908ff89792ae7ef6737737a8cc40ca97f85c908f71dcdebdf5cb10ed735c9aa5923b338a91cdfcc036b664a090380b53dc7afcf711a6af4d31ca2aab117658680b9ee21797a1c0035c3f93b565379824deecf5c1c56109f54553b38c13e3951385f9e385e2ccd98e739bfcca4aad501e975e6a5d0dd34b398e9ca08a5ef15923a5bba2f5d477816e3bc7b7ae36d5ae22be3db8474b116b8303322439b960d3609560e930d9c09d7d7573c9fbcf631d64f5cc9b15ad8ea64b0cea5ab5f59c3ad8cc2c8f97a21071a380f2c6d36b059bf340468d58b13a8a9e87e41d16921fe3d53c0000c2ae62557926e5cebb5bc2a4e7f6d1ab93979830abae80afb2b91916814d400fab6ba7bfd15cab7aec3612839604b676ee6aa774a0d6eaffb35ef5bed13c1df0861fc17eb4819dab54effa64a4d426d0bd3826b552f59b1ff29cfc416b69e0fde0825a164525a645da65b47850aa8a4da3c5b58001a6499d85bc054051495c79cf1d99dbb77db0f425925ec5959b587f045915d2245a45ef76cb827b74569f6610b9ef210db2fbcf370efe7717f3887ff5278b1905743ab01f6c22d2fc1d88d85b50c4f47d87df31e710782513af173fd0ec3cccd971c5bd6d1ded010f35855657e82b97c3111cd23b36aeadce81e44dfeeacd17873f1893b92e861ba0f96d7030b56cd3357a9761e66bafb0974d1220ec941dff36e144ddc00e5d671b31c4226144004e1430868249eea2e56c36dfe3399b6499bdb9041f4900f498763b45949f138f9ff982344049074ef577d9aa9c4ac8f02095905471e6b3e4c9b8acd821731e17b4bd883edff936ac6dc68fbe0bf293edce08522da5ebdcc7e8ba114b6a3d61502eb576e33ad190cb4ad8c035ad172c48dfeef329d1f221691e7ab1dae9b9140e9c98b9b425facdcba7d261efeb9507b109977a0768da39e8d10764bd21a16488aa2664c9658095eeb20ba80f06f0b63775c4f313cca135e000ee3a9c45082f5ad49c0e1d5eade35e5bdafb9338522928abf80d0aaf849c91eedb012a6fdd7e87d24349207cf23f0dc704077e77e083cf17ca75b47a3a61500311a9f1a9b40873a732df9e8d919537191cc0cfe11ae379be26a6b70ca7994d9b0449e0212a375cd39c0e2f5a9915262985bb5354e64a6eacb7898329dd2392e2a2168c39748a497959955e437f554c5d5cc5b09a335ef551c9c63a0da509ab9178da4e3e1326aa9397bb4396179f1b64b4673c665a2e5b72a75f839d8a4fb5bac192d83e0082334eccb80b6a1372a74f50a8bf501bad4546b5a39e5d2ac0ac0533bb8454faaa0dfa469674b9ef2735133184ac2f4b0f7cef5b9521db8feaa86265e029ecd2ffa033606af2328b656741bdd48586099d065a20ae44f3d38f8effe024921674ea490e857e71c30e95deba821c4e6b8126dee1787e7f660c834f2952d28c0b07e5dbf7739407f270ccf014da336fd9b412705ec17ff912cc3d3b7b256336020c0917c60b8433965067d9d19263e8b3c98fcbd31c3e30bc15e1af52db39017f50992775385635441c5246219c4dfee88d15d832f0e9206829b21887ad5337f443f7f67739d4ba27e656fea7b5367541fde527e390a1bf2e8d39481eab09ca4100cb659834551f8c338aa83513c4cfa57021be180253ec67db7943124603d28e94dc39c5b81801eabfdb513a671024b1e579a4e89a932a77a1eaaef58e66c9210d4229f35b6ae1308e69920fd04e51f2c8be08830b5bdbb9d08f211a17cf96e26b97f94d8c1c905088e91e12703929a4ffc18d0317226d114cdac70861757aa556c370ea02f49b59cf99d5ae7b00a2c2739b202648946e87f03ce72cfd22a4722e6e3eb7f23e2d19b2f996813c39ba3832057a9b967497519f8a34c632a4f85f1f9418e6f27631c2990a6857ef2a31365a9911f17af631c8685a163b01556443f879091f1657c54ccc57a70ea2788e20602c914110702bf6a7f59d04c04c0ef1464790ae9c4127009c553f877a16e6620bc99b0acd3d00fb46d9903e9f8df93169ba1373c5bb3e379039d367e2f42b26bb31c5d76c946006a11546a6617a7bbe98fae7512ad66bd6c7fcdb55630e39e9c45c530aee4fd85545f88b5753f959e0070b921c2964e93938f7c7972b266c02a7eabe8425f8d97f77c58dd87b3caad166e2a0b588764782ab40aac0977a5d2fb51c76e31d6596350e87c568cd00d2e352aeef675b3a9e8e98277673bc7d0f2f6ed77403e02fe24560af127a928568e06be4e4ced501137cf1640e8ae03b1fb055ced83281363396d19cc4c9b52be224757c1857bede0cd4b2d73c8c9a94a476c19d2377502fcdc14722f906252fca8e7935a78541589486e7583216cc6255a82487e31be1a8f257197318ac43c83316bf292a0e93f7f7456fd258adb8d24886838af99045ed034644e4139f084ff39567340308e6062a8b889a0e0d48ca973ef8ad5afb6971e1eab2f4a8589678d5abd1319435b9948a9199935df582d55422e163bd59f4a74ff2c084ea60002820bc326d64f02f8014bdd6e63750f93f838938218e2aaa10b75689d2cacb278dea1a49c69234a128a16032717410afdafa74d516728a7283314da6a09fdf379b7b56c854ebc8cb4e44e0f45fc25c4d022adf3de26792a70d9453ec93be8e81fe47b92203af402bbcab06fa1b30f5e8a790e2be9bdde806bed3c440cb291cef5dc2c748e4b36db498416422f253602725a5542a051bdef09a563a3aa3410f7478510ced070ee115849c99c975966068e4c96a98c6e4c851cf65be6b90ba76b4257910034de3489f76634db6158c60b6e68987e4d3e0ed22de8a5c2eb99cf487dfb0bf5a621fd9a7d0c520fd27bfee84901611f1a8196e97a21e9c95221facde4470f4a88fb50044d4c1718e8d130d69aad0c52386862424092aa69e3a2d5bd9740be6bf9094d87331b9ecbca94e3b26b4c8ecbeb5227481d0070355e608e5acf060f95e4eb7eed62459dd4d3bfef459375eae948bf22b5303b5d648cc4aeb4e68ca959d845e18b129a80dfcc9bc54aae53c8b194b0a86ecf758b21217a57ab79219672fb87042da7db277584bc8a166de6b991d68da38644901d1e5214ba21596bf2631ea0450bf25d979a6edbe3b021acfb5cf1d7bb2c89a0f58471886d1370988ec24e5fe04759a7882e31a52182d235e004edfdd6b96b235f9961692d1bdcb7768c330627f8ba239181e2329354b559077b47b25182e4c06ed3523763b991f7ca3a2a2ed1e6bf46182205e06ca0e23a091642a067ba823c040ee0a668c621db19e97974244450b4a0dc1328c14095424cd715026d789fc397ecae10d0593a86f1ac10c97aa7e352ce0a8d3856d6de73a65ee390ce9ff1ac5e6a2a159e2853093aaf4d8be48b279fcc3513f82f11d24aaaa6430499b153689a0fea7aa96205e41c69b74ed3b56df65960b6845766e54436110711417ced356657db44c0877c151c219d2e80a5e5a2dd665fb4d53cc2187a9479159b63ee3486c921871ece7f73b65cc0dc77537c79f5f88332928dd7a4e4c4217348496f1e4171c34f06df7654693dacbb43bdd1b72aff4efff9017d82bb617ab6e2f55871c3dcce965d947fa326e8ebccc36d586336313aab1aaba21579a8f061b968ae04dc89d4a5a0f26e194974faeb71752ac5e4b6b545ba03d97a6ab043e8c26fdc328ed1a7db0aa99746b31d9bea6606f607e1d48b60e60e99f8518aa273d86e827c414de590752873d42e13d49115de1c1d1b866ebc452eaf9d8331c879321dcaaa10e0c3810da362c94427b92ae0c890089d44b5c00ae2d565c5cb0d11ecd457ebd8047652eb80f46925232b61d8900ece4d4344ac3628050b0752151c6cd638e0c2140f88dd5ca4ec118e3f0a3274f98ca43adf88415d521064e862aa2a0069e4b2edced8df07c882b9efc6a142217d3a1d04f20497c1d8b5491a8ad884df4778d62bac9291189e7ffb14cc8bfd6200afb45c67c187632f6f36c06ee4a64f6c8d86367fb28e8dfc210d091f1f75eee8aa981324f139a9dac883ce4adece27cc771a4d562ac0ca021d8c52f7a3b978067a39e2e0cbb88e896a720a3106c7898b21fcadb944b34a79856286620c31a44b7d23f2ebad639c64567dadaeb79415d89fd961c99763bd7e85975dfcfb72c465a358d43473f291f7762791d4f6899d14fe5ebf1b80e3d721e1e2bea87966f6c36409a04f852df8d61d69c6d735e3ad1a786676737deebff22278e792896429352a0b9b44664a428c6bfedddc040b948d022abb055a5c40104a4a07bf5daada4444d9dd46eef6a6a8731364403485aab383385f2f6c94ce4617a7d67e9c59d2996a79b013e8641ce80fd01e87161e4c2513c06f824452ffe686417a824b10299b7ed0c2ab9f9e2f09217b6f22a594292529031c05e4055505f17ef2eab85b65e6b85afbf32e9c524a39e7ac3d99bbbbdda7e4a48cd0bba5069cba73b84f3aa54b04a8211fa8606319ad278c91618c5d04d445ccc3fe92724eafa76e5272d19cf467706dc9b011ef57821e9a6599b6792f21f6fb0b4ba9543dec317dbf4a686782098658cb5e97998b08e087c11ba75e2a255ea182f6b562b5b29b7d5de67070705233e6e57056b83e88247439272725436371104e1921841046e82c9d4d864e6a465f8e052783458ab5b3b56470d005f35cd87d20b8b14b75110f9b64e17f5526b1f06f1739ecc85d045d74d1e5875d045f40a21c21ad25cfccebc1c01a058e89081a22e46d548ff4f0d3778121e4d3396cf5c8a7e7d5e258b0fec1aa0e5f47cb14bbed54b1f15940dd7d4ef7a97215a574ba3b9d33e574db362c4f5aad5665b5ae4c1ab84beaee52ba532985acd420b2cc679665ee5936ddbd1e9f3059e633cb32f72c9beeffea59a2e22ea9bb4be94ea584f90839d51fdcf6ac2cf39965997b964d77cff338ef8a18eaee73ba4fdf28a58e85852da29e470f9b3d8f1e3fb4a3dfbc1962a27d0fd81093b9d56dce39b32c43b5d0aad672ad56b5acd60ce32ea9bb4be94ea5b410c983213951269c842cc7fd7b1e0c1694653eb32c73cfb2e92e2424242454853cd8fd84aa8fd015a7ea4296f9ccb2cc3dcba67b50d21515b2cc679665ee5936ddb987d116905acf6dcff23ceb59ce439a4e7cf1b11cf7ef79301f9fea537daacf7bf7f3f17a7ce80cb2cc679665ee5936dd5baf2b4258a84cdb529252ea4ea9abaa6ace39b32cbb928a5b9439e7a43e7dce497d4eeaee94ba3ba5d49d5277ea4e9dba3ba5ee4e2975a7d49dba53a7ee4ea9bb535aa9bb36b32c1b93653eb32c73cfb2e9fe5ed017275764125f60afa0201b648382de0ba23c2cf5588efbf77a7a6a4fede1bebe7a1c4a11ba485e0bf60aeaf1a19164936c924db249f6b34130a9f6587a79dcf62cafe52ea9bb4be94ea584c12c0c661fb6d54a59700ada58f1d5031479f86be56861484e5f3468a55acb71ff791e0c161474bf7ab3cc679665ee51468cc8c35fabb51cf7efc1ac04095d29e707add45ab3ead36badb566d5e7ac91d2e993524aa73bad34f675d710af586394546e93c2e6d940afc8c31fe38cd69d1ea0be57ad99ac555619dddd65dc5c4a1919e5d26910fe21c1035d82bd33524add29f52c9b73529f73ce497dfaa43ea73ba574ba533a279d520b8c1e64ff4dedbfbafd97dd6f5379b0facfde15f1a307a8fad1dde78c3156f76963ad965a6aa9b5abd56ab55aad542a954aa552a552a9542a95dab68dd2ad7a9d746edb535aabd749e9a6699afbd4b49fdfeedeacb967d9535aabd74969466956bd4e3ab32cab5e677c12503fdfbcb99f09444477767e2713ddd9918002015fd4a43a5856712546831042086144000bd120f48039c6fb2296c052428e08801eb8bbc317ee5e025f6677e70f738529ce49e99cb4ce973f5333e2f5afcfaef9af53735e2747e7733e4793291935cea9242727d6d804c84ac5b5de434a5a6afa22c6e9898b86b0a2c4e4050c99346c9807ffa091d259e98c53f5a9d7721e1563fc0d84ece39b906d33b6cfb62c6651a72b014bea441d9d6aa4f35127eab0e00dfe99f43fe7fbbd4ea97e85d3452b2a579c12a1b8a2938e4b8ed8535a628fa9893d05a060f92ddb24af73a0c72ef863d96320ae79f8fbd9a1e72e879e7f8f7ce6fbf5d8f8db0e7338805e7c863cf15bacfbbadc1655b373e1a5110a87ac07146771f9c0b4864c0b48f86883822720b63831b146e9ca940dcb9124953482c60d24c7b93016c686303450187c9c45cd597bd2d685595d8a1cad1caa412dc5d883944423c10f32412f0fdf47014131891a2c2ed4a4b9fddc1aa3dbff6bbedc7e6f8a27b71f16f4e4e3f6c37852e2f6d3c041850cb73f071532b8fd22f470fb355083236ebf08f807c66a2045154a6e155cd80489b1b9e1761f79904c41e4b8ffd890250eba8b20352848d3c4ed1d7a642fc466dd5ec0ed7e9b86c9ed87523cddee2758975b5134b1a2201393a2ca74a27d073f40cb5d9e012f842e7887ca031a58ad002e8c09412272940868e458bd13c736882b8cbd678fab308be7c18d8800fe00f4e4d7faf5a9f001d5b01091889183a02774237ac074addc0f892b75b8fdf12f45753ed0855cc0953656ae17e491afeab912ca1bb73fb6aeb42c0e4c17b8162e2b9c2d800bf48042c90d5876a8a10332f01862091f6282b85932b10071864772b161d5341261098248ea8a92281a456d4193e5f2c3f882a68ab6438682c1a62e8ca179723f8814c4ce0b63689aa888b0ab0b63686ab031344652d02c67752e8ca1f1e1b4e67edeec31c3143a2f309ac2da82e4c98a0a2250e87c5026c98e1c2a47622b84f0bb0d44eef0dddddddd1942170148114e5ac8ec88b130f4c1ae3f049a989052c86820d3c4091a9c9022882177f79c22ec676d73920d5370f0411345a200a00147359ab9f063f00febc2a77103c2cfc1405604f8225ef80ebbfa03af1bc029f6c1123a383210cd1fbeb418a30738196c854d5bba38196ced3cc814d93cd1ee631e3f6e642137b2911b5fe394033aee3e98136423998236b9057ccf951fe38c94dfebcaadc919312bb04993a1552276920324567ebf7caf81fc7e71418b2d271bdfe1576f05e24ae353f3c0d7c126881c95a0c2484c1297fcc4a08ac4df46da0942c830b6ccd8c8cc6cc6f6cfda33cc149c51c1fd209216e60c120e5a183168dcb09c3d03c3fd3c99028c82a985a3a223499a9476901c3982810f234f3c39daa8ac90495021625251924248f14c90332f6caccd4c1b3364d46830b6c0c29819fee9e5ce8f2bcdf28ffc18dbf94770e3cff6ee8b3d42acc182a671fcd35d8b1afdfc0c9fa58335856366a65cfafebdd911e67367b7fb42b28d115cf7c8dde7508ee05d8b1afc9d0b34d9527a0188906263988c626484ac60a3d8dd9a32c889993946c6e932b3120d643424a5233ecc1c4de93056e6e9f25b251ac0b01311dd98aae14427dcbe1f0962f7b503bc3ff580161ad89aee73bebb6c26c0104de14c9ca46041421b6bcb2e8c915961056b5a68c90e530851b426861f24709ae285214304d18608263b2c13185c12892b5caa9065505d0655854b932c83bad10675616c4c1a6e492b6201493630690114222286a0e0850930464b48908031f2240420229bd062aa255c504b8c780c1a37ea183163c8b02e8c8d611ab3f4c498a4a22540c620b52e8cb920833142aad1f68115cee975bd71b0c18a8c45d5d6cd766541e1a5da2539db0a159b06af570c8a5810c8626f860e5f18657963b5d86c4b2cce853128a44c2136bb300645131814472dae5f18a34117f8302e05d120ffc8d76cf474861c87c880871ec0108124a54c91160b460c496105344c8248a6314ca8bc51c2ca0c4b5020a3e3871ddc105569b344192c1b5842881f98c24c215a238fe861222296c6081e9c80c82d4e5238ba41c89119323a14612d4147d6e480250a144451925a2098274e7c60e18833422429c25c60990d491a894b4821d2230999273fb0e161872b546a9812533234e5128b3d19281368d4e8101b927465e8b351be408c0c976bc002344fd2f0907282a1015cd585b127c02015f10b9f48baf0a1db2cb7bf055f40660844002166c0c10547aa885234149d3c4939f384981698198a0f6185b123eb10e545dd78658c51b2b7a720efc6da2cca551b75593c996eb67ac7ee3eef76b252948b25654b5425c1ab6784c7d81d638cdddddd313aacf25b7fdc58db0f8bbab7d8a31de7cecda22e7be76ffe2f545ae3ebe060a5b37fad1bdd5daccd7270077061708bbd1e32a7f4875d6d8d003bcbc2e18665238d654986814579fccdebdfec7bd29a759b7bede8ec627466e3c31e6df796ecd1ffdabb65f7b007bba35b59637777cf247cdb99c27eded6bb160e084837fe6c6aa0269a4f0dd446cd5304fe741548847f1a49a7fb3856f7d99ca61b57741f87d37db683f974f902e045d001e8beca41f7d96e751f1733ed5bb0980dba2f3e005cbdc45efc7735e7ea1d573755813ff19ba8dba83f7e23a99e05910e118b28a7fbb815dd67b7c7e98c926a8c2e465f55f735971b3fd549495ef4f9d1e748df04f2b5961bbfba3eee127d6e741dca8d095081752b3438c8e9c5705f3ed894801c6c27b5527c277a10c206279caac081088c97218a74e8a1c214083b49b5d44bed454c1aa71b9f48b369a61b9b4c3bdd7e72865b3412bf76c09688061f057821d2d28edbc119506b7a81c76a959593243715c367959000b9318b854a48882efcbe50e9089bfb5527b428a5845ff8041ed04b94107a64b6015d7480144f9812192ac56e74b131da802f52323808cbafb1c7de1cb938202c3f4c492925fca513c0304b78a33a7374f9c70ed6f9d4e87a983d107a6ac497ddebb8dd0ba664c4e8f2d8eb6f012150008c3a6082d26d1eb79f6e47a2c8b02018377c98b8df76bddc1641033872c0ef8f462b242c67ddbd0d00e40d19eff97ad1d9053dccbf5d315e1603c1a1f8fc03ddbd7980782b1111912907a0502e25a887295682f2611e58c5a9400f30e796d879bf0dececc0a617c0e0c2548d9dcbd152d1e0c30b048b17d6409679e25bbe30e9e68983afe7157fa0c82560d0800579fcf3dd79df29992f3b1ff622ac8162eb6b3d8b81e6f3d67d8026317084d002038b2b628cdfada8e6c6d81ba31b5b0c141bba94cce714bf3695cc872e3ee106c17c982705bb116514b9566e468e337e735ac79a5f2bcf4a3b5fb528c002abcd948cc93c5d6ef9c7b277fdae3ebec73cd1522d08464dc9d0a686eaacb601055860ebcfa7afd1940cfa330806949e45ea82a6e346e882bb7b76a55cbf03e8eeeeee3fdeb2593e45f8e28b3772fc0fad0783f9c3de6387822e38014ddc61fc036130783d08d67becfc7260e35ad4f8fc56ad5bd488ac4197cd11f2f3d5c19197d81657fe81714216bb6559dda573edb2b4a946256de79d29fc6107b1d7510718573a68b0fbb80b5fbabeeeff24338c6ef666eebe12eeec38b05df8abf82b08e99dde9b8cd2a7fcbabbddb5d5940ce9fae495ae548d0879155b2e957fce5d6157f7535deee7aec545dd9e312b62c698224146ea513efc53b768599c75e8ad1eae20f456aa95cadd51a9cddb3b9865a85682433b1b4e74bbdbea8a3d89a6b4ca5979094767381a88e3a2f416c785935de42b1d8592924a975e6945797d9f13356786fae8a849378aa55958bc61c33bb5cdca27d621d76a2dc73d841fc731c71ef70327e574e9d2a56f558b35c6791b75b594ca07b7a3e69c4fbd390dc535d04b7b4d7b8d2f6ceaf53a45551abde9ac5aa554a3b4a5b9ec3aa946e7f47a58b4db1fbeed96b4e7b5e3057d787bf67a60484db57a681f7e7541e8ad784d93fd950419fea9be5b5cb1e2b7c7c159b1e1741bce6f389db3b775d0c5f1ba5da9b6942bde6dcbbcce45169b7557074a5259e3a51d02da51be8c8dbadad68e137166a0f16becb211fbbba8ad6440f63070a5280a20dcfce0e365c485501bab552f8cb959814c62062d0920a8f625ad62664e750b2a1783c60deebdd485313736f0e8306e8cc4dcf860af34906812c50d91ca8cad17c6dac0da509a4d242d4155e9873c6289f630831fd164c22a0e2b1c1569614b530db282538db7d65aab9625e6814df58b15c339bd9627e6815b88980772501428b890a5a95a0e697b222948943a83d5b9301624097d625917c68200a931d81517c680b8a12d587b610c88992296c58531204d313435697d1fc6cd4c8028191dfd344e96169e3091830c3b780cc50f6a201d462aa8620a362d2061e5ca50fcf734c8638044a3589b261c304309450646821871b25b5eb09226062f6dec1618a6a491c10915454a3ea63c59789954102244898dddb2a4c7122a2cbcf07e1e930b5e988238d9b2c28f1f437eacb1d00378f933f8e27e396b8a7894b1f032f5f0d2850811d7450622d707cee0de55212129e56f52be8f107bf123d0c3caff7ce2117bf25d7a4747d67f467cef22541a92c4e31f0f98702330c67e1c2bd5a2f360b4bb38581aeb5bb4faf095f10633a0558ee6a1df1158c1f6f7300fb4ec51f6e867ae1ca8a7a8ffea044eb090cb0f6460d3cdb6e6940c385d5fb52db2875749d10fadb81b48f207abdac1956b0611ffd4f936b2ad5d42ecd1d76016244666900589902c47bcb069220b0d4ef533a522626ef6a927a72e3d92ae002eecd223c95dca11239b482442e441b7a79f837e0894123d81f2a4890f4d2b28ba948b0f4b977e08fc132f5d6dd5d5a2351a027b3970b0f571b616ff7c1dcc60fb5b3155a3df5fe2b0d8cbe87fb0e93d2082fbe9b85b06f8273e2da16fea554fe9e6aaec650f011c367543c7ddbe662e67af76d10884eceb9bc03f99eb68060df6284c52b952291bf5b3df5235b4cf3ee51a41fbecb5d6679f6da91adc8d907dfd2d55237b40bf9671f5f9e96f4001255b425fcb1e7dad4600c86741e01fa13e8b3dfa80da71369e3dfad973f7695d0b1b23f4d7efcf3e4bd5e8ae7af05129106a7731aa0bb2575333da99a79f36fdcfe6608ffe064a684ccdd026c064b5fffc767f0a041dcd4fbf5b5a07ae7fbb3efbb9341eabeff1434c5ae0587557e3f66de582edb785f88706bd2ecc5c4a56973ea56f1b68d5e5601efa3d97c2ee572510c4c2a1fa3918884680c8c25b3557ca46d6b1b2dfb62cb39772e0e5c1faf5bf7ee56e7dda8d1081ec3cd1a5078f9b7d44c32403344a6884c49f4e49e69c73b2bccedfe69d2bede7bbe49d001ad48fd09fbda6b9a203b64f3dbbf83a70ebc77eeafaeaad2ebe9eb29175ce1eea512180403f3a7bae194648b1727b2e3422ca94ebf10f7c40f799703df6fac6faf4cd9b376c6ef42eeca80b84faf36b84cd13b4209b1757c5d3975b85537cc5e0722d6e0254ac0f0851c22e8c93c039299d74ba841242d8a181615e52f8bedd66c1cea22010840f5d4077265a43eeeee6d7a0c65b0262b0b1a30f5afc04c460e17f550674a13100f2689095a04993c5c9151a847102480b7c60016547861f49706081b42384153545b03044931694e8214a0c8c161d76a84086a94c10638058f2821e394861c482c9ce111642ec1439c262879d2190b0e0042c56d891c262cb0e0d67880892820d4758a088c2852a34b840052cc4ec0c91c242c80e0a784882ca0b30b070da9981450d4676a24c5132c2cc0a6e48c10f494f8e608184fd6c77f3e7e0a6703fa011a30315419c41d27102247a3061f38297334dc0e006352a0400d1c45aa136715929052997bb88120d4ee0065d9034753122ba2cf6d6441d31da60251e27a8f0329244cb58bf5069479b2c8dd20e29863451443fd180231fb800f6c37edbcb3f00b323cbedae4ce470bb862dcc38aad8807482163132483244c58c1447b4f1622687a126922453da71c49b861b846c4fa8e81c22342f71fb0886db1db5d8eff5f2c2c1e5e7245166774756770db73f068d1b10c8c1badfc65c554a34354e4843d405874c686531e103a32f4443558c0826d447358e9d35f6efd74bfda5c5f4523759b696e3fe3dbb64822ac510fdead2a20721708e251cf0c5cfe5cfc1a45f9b3e61182266eecb2838b9bc7499995f374ee9bdc4c4df4dfcf3fd17fef95e2d867f3e8f7b09cc65164103387274d376c1346e89edef3824dbef6f1b0807f3122ff1122ff1122fe11862ff7e56892a4698240121a589058c52d0a50922264c0019e2b7dc0a1ff6af08fc1ae0c7c19f835ffbf295e8c62fef4118712af0e4a99324523735d03f007eb88fdf4bf0c50e855dedad5fbd45faa29a9a273e7d22f2dabb98d8a7467583f82c9e16f928971bff5228940ba7c3ca69fd0a0e1e2700dfc16b144ad79a7a280d0487aafd28944e822e22fd72e353a7f8f4293efd42c5c489d4402ca679e2b7f80dbaafb29801996da804cd5a4952e7d0900400080293160020180c0a8503027120c8b23c489a0f140010618a486e583e134763410ec3280a6218884108418600000c30c6188318365a00749a6b1e055f5a45ac079c94497fd612371fa39e2c9ec2bd5415b118385125fc2d256e3e37761eae34369007cadb739eea39e167162db592fb3a27c4249ef5b9514ff69fe22d5d29f63ec85262fa3fb7984aafe4daecc4be27b8a7765379410fc889facf30cfee9d9a871ed013f59e619eed652f395d3e5a54da13dea98e7e55a97815ea88b5530374db443296474eec3b41fcb34ba556d00df4e4fd27a87f76bd2b805a6ec3fa45ef8ae259cd5ac39f400fba56bb4e149d02649d88c41ae20df7f70d0a1c7797d61fed397aa5f42a05a5b99a67637912784708487d8c22cf1949dac6a95bb65f1f867e732245fb66cd8aae357342298062e58187046ab1f84a292c26dcd16179ef24c5f14fffec205c61472d07cbb3b5f51d0cbf1cb2d87719cc305fec10d523f5a7914cae5782f2e81f8bdb08c4201bfdf5b0215b22c32239d1ceb1d6c83f3f9d2eb8cc05861da95d422a9e0361289f660a644cfd90baf8fd1ae6160c15177d5a1dd08146650c9f6cf4a46fdc2c8dbd48d4d35a4d01fdaa4173831b9c18b2b89183bf51fabb85bb04082421c5e48b1855e6272c78b497bf148a5d0bc1a87f859e03df371de0df3b99cd58984c9bf535286d308058d7603da79a7a9a318d05db22ce5a97a9a870f356f1fc750aa77320e19d16fb9d4e27731f3f4cc5d8a9c822a54d5569b3e860d8513f43cc8b8272585c0a6a8b9a0821984fe884ef5943460aad3e0b1e8e1beb1b7c09f6c44cfcdd3db56a36e9ef9b449a70013db45fae9fbec6a15877a3e1e730ed29086cf26579ef7ef836efb1b84974b317940e82e3c4064275e375128b7a99361777d0f5bdd6a8d2d1a3545c3094a318b1b30ea43b9111b78740d5986edf269b13b475c8f5a5b971023d7c09f85ce7b8ea83cee555d8a4ba0cec6f3339e2b640354f58405e21655f8f2a8258e3f61338523113274790b5ab1e9fd1ea066aecf1b1c0d791981dec899c33c6b017f0e5ff852ab043799bf0f414184e26ce87f55e1a1b73d5f7c4399c774e9cd0037bac4978bf57f4a682e0e186c467fe11378138a093a8375ff4f1a45f6f8f4e72d8d7557efbe54318fc64984eed3ac6d214c712895525a8282846abf9a7b7eccced73c2e45ca6f126901974987d765ce7506f3cfa912fa1df55317fbe0c07713e064b6ee20c3a88f906a5ec913e9cab630bcc3c4ff43dbfdfabf972713353eb002941021e821a4cda10001c6b2e72c60a5081f899866f564dffe841997f4e7fbd363dee02929386420febda0b50e1feb9463ab2394dbb0d39b91dae78dd49f76d0a110b3eed5e4138a66fda28347488c7e48f521609aad6d8e53b7a955608fcba68baeea59408075e4879d2d430a05765962cf9db1f91a73030fad42f5c5eecb866dcbf30b31c608f324c90e1066dafe3d637d0ee6da4ae578d37f52e4fffb1a34ef3d17971c5414a862c608ceb4ad6035e90c7afef7ee3b788fceefc8b3c5937cccb6bd0b82cbcfba60688f70e381ece1867d2f8cf426942db2c2410a65e237982f66fa5585fc2f65eee40909c20da2b219de9a1d636f6fad4e7e870841f91f2c8ef19e6fe09f1568f14743d0f427df2da7ce1095550d1bb0a23d71926a3d314d8ff0ad5773c983c0a5460e185308f8379a57796795c9500d575bd81c0ba2f169b83e24dbf6cc5091bf4d538c887827785b675409706f060af6ec87c3ee543152226065b85412f98c9530df1e984102c014cdac7a5b23a5070feb7f62f64d1f1322963bf9737683c843830112973122895d0c85ba60f3214386440ba106a35c8936888350b731f19f49ff3b17bb34471a79ae363dc725ca588e5295da040c9252c5daac239051fe2a15f0133dd461b4832e4c57804f35d025dd2805dd3139a2b9098f112b1c3c47c5aad24279b4143346ef00e39f47531e285c1b10cc8e49f4f8d623dae74aba84cf6b564a66e20d7f10b045593b3d6ce84c9d9fb578aef23160b81537ab8f82be92546f5b9c768b4a63e5f35f0a5218a3b581c56b327b3e27b5e97dfd7c8795463704fd809f39eefea5250f397f9a0880cc160fc523cf44e22a774d3a94624b42d8236e5ef439d79bc37fd2243d8b6d4a946ab84aaf2efee9a3da6b4e70fb4837870373c9369b0790385823a71cebd52a14b2abd635f767b8611a491a095b8c2feeef37ae74def6e839d34a6f43f7803aa38c1a7043a0111620371f6d1a2d6f89aaec57f788862bface7ee6dde23b062ce36d0e66cce6287cc9415f0d48339733afdf3875ed38bdb2201f8d7f0d118538c82f6fb305150cb9e1e54720ec695e3b524421d459306ff78d16a5ed612f6b4cc34ff4c3e9da0cad75902d8ff123ea8dda3b3ba57b3d20878c81f2db07d03e93c69d0e32ce580f4f9f1b1d83f8c60a8c02cc901325ffc8e33c22abd05a458efc07d7f0716b3e17fef162d21eed55b040005aa00be182886fa06e23c6affd428cec3e20dbe45ab2b6326acbf2848eb5775e1f077976e32491e4c7df8232fb0bf688532219dffa25894d7013f5f16b032208ee40f3326694323b05294adbe290208fdb0f1a5178698c48b752ae31c11fba9ed77aea8860ceb00a525194d6da013bb1de2908ae10714dd9060be5e7710eb0336b8fccca8e1b50fb9eab1fffc6c2c40005a53971c15995d1c25ff92b593905a26aa5f4cab57a72aaf4c8b5fa74abf4c4b3c5193e2d749f14d4f41fc32adbe7252bc3255f9655afd32557b6552bc3a51fa6552bc6aaaf8755abc7aaa78655afd72aaf8655a792253523f6422ed2d13105f3a5dfa655abc505310bf7422f1d6d3e29749f597d3e29569e52b93ea9549ed2993e2814e437a651ae2879a16bf4e8ba79e16ef6422f54e4e142f325df96552bd3255fb655abc3a557a655aa01f39e49c7586aa90248809a5edf7a52721d21a632a7177d6a0a1c29bf00498562cefd616846be5a7d9e4e976e2db933127ed4690d7a7f33a4d72159bc84a396b2280dac99e1fd53376c4d74837f28f6ccdb0cd0a4879bffda620904a72b791edfca38dc4396df582d2e95c38e72983464460a33b6f55c962db955ba6e2cc425e00d01a0a29c5fb3c11430101a2e987e757f19ca783a0286427a46e28d69943bcf79af884581b696d5d71d1163354a5f1b1e2956db0b0db3665dccfd99ba941b1f61773b066bf9b3afaf525b02c06ea4502a1dbc6be1e859c89375c6ff518780f064a1e5b6c158daf60f583694a9b8c6c3efcc57c7774ac600a836caa563bf90f01efb6e875b33200f9a5935fd50e7762990d01e9a4392f8615c380d3de7f9011fa8287ec80d36ea902cb627beb7abef8a7809413bbdd95e06c2b342f01af6d3730a01eab524530790b9edd467278d6020401361c43e3852087ef6b162c6ce0d49e309fadf248191addcf762361ba193525afb132e7cd999b0a57f81a24e103543f89b1fbc7a614448355d21951a28bcf40f8c59303af09c4a368ca3697ffd58060e4a64a443c1e2df9d851bcfc6613e644f5b1411eb725eed5685689f9d9126a554b9b055324de690624fda9be3437dda64db5257632aef53e88c942338b3d8f81838f757ab7b001f0c9fa1f419b0d3a59172358bdd1e5844a2d5000338d08e170fda5841d54b1e7531a57e3df6a0a93c48e2c3f0b975c0f3f23199dd946323e779da0b0905a3b21ac80f4c889e2aa8455dcace608ab9698bf881b42dd759d1488526afb1ba7d744c01e8a156462eeae2727c170505b5d27f8abda89d8136f028773f962b1eba2fe3f38ffeb8ebac681c2f2c0990e63cdabaae3aa37679003170084338749e23579b612660dc60d5d915392d92816f5beb79dc9a6a8f503367112673851374a83887312d49993f79a55415dca9bedea9479c469917afd32e58d556c3d9a7024987bef971a287634668482b21f921333366c9bd40e590fe6212bcc1fb266448938ecffec15e6c1336deb4e8ce7cc34a73034ada2cd40e2de5155e7fe624770b35b8692e2d7dfa1a90f6a264b9cab902aacf66def8f254dd8c3cdcba6cfbf061633430ecf1f7522f70071630bc42106d0a52158b34c9918dacec83c8adf4b7265499308ca37007eb586595bfacd4c080ae15668939307a2468c773f9fc2f282578ff2f2f6a60e13f2f61a0544e2332e78a56a72b1449e1ff1759952a76742e7d1b9182ba83abab0640c05d0c3454726f949ea96d2cfdd353c06d39ad06f899d14116f752a9c2b8f07b2a0e0135597666a32f12448176f308fb07070780c82d07cf8344c1214b3713c16aaea1b2f371c01465e15be268b16aa4a5b7a2d124d163e640cd0d970ee32a52157abdb26b2535c6400dc7cf2130a8deedb810fca88e21198f88c64b95687f9f9cfa1b49c8f80083eccf146b0c684b027fc673964784435673df0ed4c1f3bbb519d894837be3bbb8425390bf24a583e0af477acb0780dd66bd07c7e2242f1a3edf71ee51e3dc1316fdd30fc4111417c4fde3c2cdcd6638b7396e634706471684d5ab9989698d7bc8c51deb2cacca282d17c65170da9667613bd20a74d7ea82d5c307fc58d13e8df6fda0fa07b9951992f98ae6c17ca09079f52dacb3515c4d699d9f9616c54ff5a5ba63209c98f26ccc5df80ce7c25bfd4085f6f5fa20ffa5a30b3e71ba69c9c0f5e0c9631ca1a5538ed638dc5d2b18a76a129dd9667d276dd3072eedd3a662fcea772566ad3b1a69eca9a9284610f82b0f9ad43061ecb1737b3b6a0593fa0f5bfb5d86bd62f54bc0b9c8ee1d69d48e7c0702088fbfeb87594606435d72c6f27e5e37adae2ddb68171ef81c65faee1775b0a2beab91d8872a7ab7cb0f70a4aaafce89ec0980137475927db83114b6538684c3aa7442a31182b0c0bb949e1aaf416aa920c5300cdcd13994dc70c9015a1a9794f25cd05da522be0afdff4b1ed77b7dcad49fe8199a08da00b26d81f6757fb18111551be9824d0d24d5a1a4e77c8afe2c75027320d359a977e7f08f2391681d096cbd4f29ff527f8351c1a7d6719da9d7005cb49a80ba0bc5c2fc80a0f1b7e34aa8dbe2ebb01d23438dbf325f01cdaa4bce1e220aad2cd03b31db37fde38054d089e97ad628362bd65a9fb3d6effe220286e5876b41934183a4e4526715b7ea984324afa967176e91973e03086ce402cf79e81acfb841346847f7a37cf3b70262187017c42f1849eff311ca29aec5200fa819b9a8108f89ff8c8fe32239a74552bd53915c08ea40866dfc9edf3b179668315cc91b808943c86831134bdd15e3766ad2a65f3f6abc85a85ea98099a7db7dd5eda25f84aa01bbb93c3ad62a49ea4179384cb3761b3a655a45d97481d151cfedc6b49c573f936557e08e34794af522f5dce0997c12657141cb2d4d960765faec82c6ca17ea95f3fc67535947d3ac2e8555517e055fe06784b4276e030a82757d695e819bb92f3be5bb7a4f395831ff290a8161cd31c073f2dd109365f215ccf455b5b8ad916de33991a039b4da4ca0077bcd6ada7c69d09c9d0cadb990220c96a0d73f22af4bdbb8aa7b748fb1777e0f3a7f4fd5010958ac2cae8c2048645f566869173ce09973e088da0a0c1ebdf3f0207cb0c72d4df0a8584f26e378a591da6178a23cf017d13ffdd98ad12c05e1d21cd513826d8553846069dd6ecdc69c5b0a81390e6f7fb49ad97b708bf14190be1973d4dc10810bbf642a87792884f51f00445e4f82740a39f5e489ea943456dda757f4d4226fb0900e7297d3f67dc7fb44841300f403e447cea5c64e27af7bf6d6b5241892553b166faa5a5157f0f5b066227c68c3e1cf4cc87ac8a04e7a1e48b3d0ce208443aab5f3a2006be79d4b4de2d5b3dacd1fc0c04e8e0298e7a32383d55b44a0f55eb7659f338b40d2c8fceae9dceb270e31095f934fb6fdb426e43ab65685708378d054ccf05570f873740f683f791c2b6f17a4e746533588ad4e0c3eed27666ee490d1942e5d1999df0ff01d6179378234f1f017f3aad857961271030e8b23ef40af39a27aa3f801f8062d0934ba01631522f45de8bb86708856fbab20233f30e120e8a53428f86a276619929a4c4d9328e1410de41ed500305caf37c4cb2ef1728dc42eb6d16c8c9fa86a5776c837cf6e4d01d12401132039e1612a9603d2c0313faed84483528e6ad1b48b978fc39a19198b9d6caef15e2db38fb4af39357dd7199b070c6b17daccfed39fd63dbf9171b67101c8dc66417a6c1c9651586ab5b4ed31aa0ea3a09b6a4bb004db7a3583c682423b93e99ecc2950819e1b57dc5bf54bbdc4783293a49273771b4a261644ca12e7175d2fc06e21bd772e41b10c8a59becaf7cda7a8ddba2263f999bdab713bcdf86196bb47b49e14f1693d7b7a55cfa55b011b046d3b2ee5ebdc1acb934ec61bf99aac8bbda60dca336475705a8403be310243e9456d4d36b1a69587f2f320abeea667c262a01522f9a0b8e106b7fd9ee235eb5e67f7c395187927380fd2ddcee0e04272161a1c8ce86ee4a5b85dc62b19475d2e91cb797c048d8426eef83a42ba153c01d893def63d6bafd978d008371c54e3d0403adb9f1b6f4feb36d196eec582539257477e2052a91c1065726c9f4938497f82683a921ec9a4368f07479b2681a9b56df4394a36407861f47043021c70652d5469b0e8d91722be2e7ce802bf8b42548f448946b466cce0c470a0489334ee0ea91e3ef7a0443fa59eb5b723be453c3ee3f47033079cd19baaa460ad0b48cdd22aaf3c8d22e3c79382e3a936f86c5bae857f4601c668d8eb090c13f789ddecaef1d8d3a0de25cd598c1fa1bfbdbd0073f340327a226fea1a2c29b1822863cf33e60f7ec6051068554bcf007d585b0e973b1525671c1407a530b6ba24c10d06224d11639b04203381066287158f44069b73b00a4b3d4d4f156d43eac19aa7a02f061d57891080ff71dd5666cb989164da3bd98291d38573583286f6ff57e2bedc2ffac019e1d4b4961b351ae6bdda920cb8c06d654a1385a98e7e81b22267ad46a2de83cc0182cba207cb641ada65b886cea6f2ac114285df5ad295e8437a4004a5fae1e005a18eca2278f83ea3a11d6faff230d8b50135b2109ace8913a0143224d2f9e16a4940149c66739cc618d271ce00c6321dbb77c32a62972ee48317505a7b4fccd76000c928a43dd243e9c0dfbb65fc818cbd64b1ecc505f5fb65183eafd1002dcd4c67564170977e23691e2b672362ed98fdbc8e2e7aca770e303ff07c18ab492a2bc5d956aac3f5d588716b4ad00af239a50de050a70eeec14dff7f6304da27c112cef17c1eee57314c05310dfe69eafad94a3d9a9f6d24ebc9d5a795148e71647c797d26efaa3eb7301c90ce0bad256ba8c988025c00536d264d33bfc7ed224be7f0ee1bff95e653b5484662f130b7d9ce32b53774aebc9cc1b4df3db4ba6e091c2f92f51d3ecb8e9d8c901429270252f6c9196a18e5c45c67c11a137adf7d2caab7dfb68b74957369495e92a7e0e3efa382790d6c18f044b88cd3a271071e571e9a2f3463c69abe9661e208837b0052c1ad3f263f691419662df181cb27cba3dc48fefc7858595027c835e293b532e8f7ca06af98162500eb4c195e00dfc9bfa9a3ed0ab3bd259cb0f9106401373045259d59f06e42cddfae1c12c216f996fc8c470c64f529a35db8ea3cb3870f6bac722cf39d3eedb5b1df05bbf437f4fc13fc1680b4ef47150fd0c5f8459d19bba5b505d495199cba54aebe93f43d8884ca51cff27ec342832bd45ded0beed98777fe06b8b555ab8736f3213c5f06dd496dabe854ae6f51835cb685bb927857962475a7ffaa97990f4b17756838822404068bb5cd65a8faae39e7d2c8d0cc354c6c56049cb1e7d66057f7ab637aa18e012afb8ac5897040576579df182f271ff4e1cce3e272cb808c858edae86248c36368b27317a2a6fac8cdd8fe55053aabc25c2072053c38b533083891233fe54a8396cb5cc638f5f03408c0537eb63e6f15f0f80777858bd09579d45e45887ab9db25ec17b54ddc2977c8bb40b844f5b499fa8f389979753a8f58490dbac089f9b2657b5cab13fc0f80dfc07d65bd61933f6cdd47c8e01e5540b5e2bcbaa397eb57b8095de0bfff8b857b8309c923c61bcbe9811f33557719bcb091096362ff8adf0b03817825af0e6f02d04bd6aeec545bf0c9e8df765d5f54e10373499bf41a08dadac25b4f623f7df945d5d7d448dd3ac3ff5d7dd5a51c300e43f70a7f0b12272b1b73fee1a7134fddf58c6d8315c9cc075044e18119eac60a87eb5edbf5681c5e2cd6ac11b8f1bac0bbd0d1e8b7878228d524654fa9189d1773818992dbd0c5cb3c13ec758baabfddd2bfa8cd4e6a0a18e4cefc97e5397e779acf24787d8145cef499de37723f3326bd2e1589cf08e62caab8d597bf1b5b12032d380894250e9c024c7c9e1f3ce178e485ef8f58f6b51a8d1991ff7bae0cc3b97844bda1fe421225bc5a52bf83cb944f61eeb60838c0126bf702c7d4efe4d672a481c6c301c9e43370041d1c16e0ce390f5268b099b0be1b695f4f4be6927d0a1d7b2c0a9018e421fd8eeb5de18625e334218c3eb70c07886da656863b47c9ac7a7c94909aaa1d30f0cc15255260aae6665dda85a417749f2ea1599d5a488bc2bdc94ac81383fbc1c058a083b0001f39ba096f0266b6b8332fc404ddc7dd274146648054f6379789ac5bb1bd197f032efbf65648a4882d9a026995774673d616e6daeedc594f82d984b3dbd667aadec218d7142d978eb2ffdc1f2a974f89b5129ecb57352621bc92910dc68e2d1d039f5d21074ced09963be969a06cf6a3cf9144639facc303909a28262629311299224c3f6e1c9ac99d57175824ef4f089627693e5eac38c33e73c085276baecede738d407b40ff2c08c33a49967b3acce5dec87c094f68232dc4b2039ed3f045408f835b4ed9ad026107efc38c95c2be9a03bcb9b1483c34edbf01e45f9e9eeabcb0a6c12c5ba475cc299f53a7ceaf40b8d7e517a9b6d3edd16d54c55a05af4fc25b22f34e63506457de230024d7fbe813cf629167d1baffa8a1ba61e052b88eb117bb295d3b518be3aa6328aaa3151a7cc4cdf7869fb9f781188e495aa983de9024c9b1089df6ace3e45c1f6152675d6a608d984b9299353e7adec55e0ad74e239460364116a43a548214dc3f7ad7a420e404d7a0ed4de4e6e7f7cc65c4d131bd0cde81a51793a8c40e8fa70ff8f792488ca33bf4056cc0f4ee83884e951d4d534ce213bf9f2da47304d826a175503d82a22a267912277da274f4cb149e994335b8170433abc027f099f2e46c90aa0d3dc129d5490f9e40d92c5735db9eb5054b7741089e2519533b84d630f69ee84e9ba9a6bf41c8dce382af4f587df2fb2a8ce6d25f6ad24e9af856fcf098c5791c570da82b2c7dde0a5e99f37dacb70949bd0eb5513ba66f4744f7901380b5ee284038ed98437991049951564817eff6881e3dcfa7c6867275e446eef5c687b229e1ed102b13d371797ac56d16e77a57212743e09eb1372db932720a749f66762069703080f7a444e9760094413f23d028b52ed215c94abe40d98144e52a765703321dded0c541f6da5630da8c777b51af332b81e9051b45a87ff1072a0582267b16400c5c43ec856edcaa096cd09dd1d98767425c288761dc35f39cf67ef7b43aaf06697612aa4c673038c840e008bd24913720f30b1d6cf60222ca76ed87ee0ec2c85b6ffbe36772029340bc1ab4dab406d150924f9be6410126c0c6c43c65917b2805f376cd7381ae3c1c25414ea07f8ee1ac704e9085cda624316fe0789ea3b797503483c21774715c2362f59717c05560c0e1756539cf3445ade29264e2c071c4b278a9034e512051b1a1040429954f409edc0135b6ef03763aea8da04780e7358cec638c921b2501baeca6d583937e6d3783fb807ac1091f1c6b8bd870c725a249d5ed27650e2d5452755d3fb326a02329ba679cfeb6dacf5735ccc660a0135c2c1bf83cd8e5351ccc17521446e6ba8d84320b7a35ae6141771f5c6364686865f7985c0c008886a4efe52daab609a0672a81339366101c6ad7a74380f21671f922805ef2069c39f90d322d91830d17250e46167ebe9f5212f86a8e8bd2f7be9dad7092bb48b61666a461c8373e503250b3121bb04ca884bd33b22b3c602ea70641e26c8b41f6af91102d2bb8c25ead0648b8994b231906b6374ff8d4f4c4e3c913f40ea7c21569bb6059f5465fe9dd2a2d25a2dd592bf4c2004333bb4011d012b62fd6d860c8f92885e8f9ae5aa5c6e852eb1b59b8f5273c24e6f2ef1c4c46820a3259211349b0b6738341e888b881ad400749529f189a6329d27d260a92cbe8a08c602633169eb885381c12ed725b84dfa39f0f7e05eec96256b69b515d58b368a351b3c41a3a4e7acd8078d7386513437a80818fb69718a98d3a79a52a960423c66bdfee863961d9c9a6e51d021e2b6e33da9eed53e8494f05305e05f81ff2e3f8512f4919604a2ccd081c68da406280d4470884557d4a6cf14fccf5c0d42474f76ac40d77101ed3a66cacad578c9b2ff38cad970ed76a5fe8a2957a3f1bc6a6fc50cea787c6948ec0f5ca44143660156d5935594756660c1e99fce71e8d3c26764680a16c324a871d6f909276545599afb5f5c005f16a866d167297d57e4c5b707de9ef69fd398806480a8aab6f846e85b2f8c1b3c1f1c1e95ac9ef207d3426af90ad858cba5364a9035ff9e2705777dc561a865a8138d19ea9f6a561d7f9a21368dc509b93e9087386aa1b149ff5deec43d4d68bc0c04da3d57041f64b1007a049a65b34b473dad20b944ff5bcb6be48ec4460e4ff4210aee920675b5f52280c0c3ad6a6d7d4601c075061c7600215803112a41c2ce81da83de679d52f80efeac5b0e60e2495c595798aea9966666dc8a1983d045f0e2963625a6a5b7cb21e4a32cf237948b48979ed05f11c3d2ec25494d19d36ce93c8aa7d9fbc51d1b7e6a2667c74563a6676bf07e1ce66a9031d6791ed5f88a98a0825d202d4033434d06f254db03cd1165308efe3d45f2970ce2805837191c7f56031b30273c84e636d868ffba4bce5610e592adf7518aa6d892118e7e3c62992b1229049974250fbc898e2cf62d634da893d27c25945c40bbbd101ae4d3e9f596888e8ad453229f456d2b54f6331a874515157e57949e0fa8b8379c5c943be55a7612aee353acd5dd05288d506a9527ffb8353d9a128967527094845e118e40d62e2b02a146e5ddddc0538ef7a621a94bb69d4828305369228ecbed81478204ebd00982b6ecc77665f923fd58b96a062fb073dce7bcc20b9f269d91369e43ef5047b9d6e44c5c622a1a1d194a5945b6405703a2aef2db0b9dc913ab958d30a771f56f35990d2409914498133e8749aaf9c584080dcc9a381df54f1c5e5863794e4094b386cdced5a1a39e2ff68dcab56688b409f3a5aecd9d788a8ea22353ca14c3b859cc9751578bf501f9ab9a23432cea299a0a6f0064ca2c7f10fe272f8a78d3df1a101ecc1053717c4364fdcaf5522dae4053252e47eb944a90108b9320a79551a35eaf7536fb2352e50037b6dc8ae0f0968f36316bccb49c2ca3643eea53d8060b1c4c6a7c4a741ff13054d718dd7f59ea3b74051c4492694c11d41e51d8dce0a045f1d6a5b974a1024d39fded28cadd8463e1983a5c1f97a14c307a5ecca9c49fb6194b2688b62b6349c1a6345c73b256fd131d143da7adfbfc4adb501087c0efd1f001edb42c4f68152926861c210c0796844515963b7dc8c5ec2b6158ea3104b019861816418c1b9da3e02068e3972f893b32f4d115c682693328363610434a6b65c5c0181b6f959325782b9d089758d61f732a79e74bb29f7abc520ec53cdb0104871f1c9df0ac3b1143b664a2e3a4d6757ea4aa0d7185800698dbd611cb0b530c9da11248814ca93aebe8d806f9d410030df1d7e6e38102e5eccf9818f2e494a3a17517e7eeba6bf8b811e029affa20180d999b9841c5b0a1f9414a0677dbfa7929335b6c856a19716e5c2fa4b03dbb7e24a99fc942e7d3e8990cc57f8a82ffa3cce93b59505ab1134fae5a694ee70e7794682e36cd49622544f00b89c8208148362bd427e71f3c83485bf209afd418ac66e764ce504f2c18248edf848845333ad94b9537c7263be46cffa44a12264b3f3e0262e443f3248f64417ef0b03846e6a0ebf4d056fc915f9aed51ccd12d34ec94e83fc9ddf62ed8a4998a8492e06c9ab3faccadc4ce6f7f9fc72a51c8f3528c3adee7b0409fd1599826e89bb6a9088ca428ff6e97abb7aecaeb5cdae9c62c0a8b55462b39d4d595690daaa106fefb504aa6aeac3db5021f513dac70795606cdfc9c572f768fae77ceeb042b21db8b1650b20e43a7a0d226b1d0f6eb254d1a4274afe78114b2347a5504d2341cc6d66e1ee92441b11cbb24038e1933836f8c160437f6dc56cdc1ccdc6b8ea0a3bb48ce0d071b05ac6c96e0d7d54f650e204613b558351275a2dddacb90314bcbf1abbbd55668fd02aca0ada58e1ba79dc6daed99382b93d74e7d6b72e0f85335daed2689be513d6158c5db2296e2c59b3007ff0e200b6733c570439cba196a743b250d7a9e77066028e6765ca7b557ac07c3318358018ab58dec0eddaa7b7ce3c78524aa98c287cbc4f14e7209cd1a32a8a67161e5fdb82ecb75f871e12aa0d379872093aa685a7c49ab81671b61c629fe2eedd983cebec954a10333aba3a23da5a77689385a384233a252563ebc6e67a61cf07c5372d3224586a980ab45427acad272464a0dcd998a21445f4fd5e61d9c4aad7973a314e3d79f09cbe1927e42ee75b5ab268c818a7ebc41eda59db484aecc183c53a2dc91b9919620f63ff75880e978c7453046c13340c45c3ed98f6942c9f6a1d6bb879255c90cd8591e84bcc1369b2f942c339cdcfba88370536ef918d2741420a580310b0996c3ac2fa311b614be3f01f813a623218992534b581a9b18528caaebf26db06684bc4dd043f223caf743949ed2116b19d800fd6328d693d02805be798d7c753e3257f3da880766f46c7c81a0157da1a35169aefea392beded843aad2e036a91cd3885697bd46025b188d7b5aa1a7fc672ec3b92abda29c15f2ee97bfe5aea2c96a7c323003f1444eaa53fb797dd3d847a4aeb742cae6ca315c903acbb7295c30b266fade9dc310159748370829497775d6b7e4d10fb406cd308a5b149799270a7da1f91012dfbe3aa2f4c6b044fc2d2a41d2178f02f5524a4eae6038f63642911e758406fc331a2d22257e9bfb98481c79ac85873a01f58f8a94190ea9e7ecc45ae43fcb44bdc29bdab7cb588c3c2f723da5abbd9751ed0eeb4a880dfd494643ed38a4073ead303ccafab85a6f0a8e0091997067d72157d737415d0486bc45bee3930aef8b715e320ce29372864d124fce275058d91a763e0c7449bcc1384248be7c4c26ac1afeaa25c83d899320d8185d9ce2c09589815db51c1e3bc761022771bf3257938855cdca3bbc5b0e4906a78809a3dd05905a35ce3f97e215abe99b59c17d420b5dba52cbbeccba630181adbc177409c5f8f18004afff392c01ee7a9c8a447d24f809cbe712e879059b10ab88dc17511fece9e47620c81274a0c4b66f806103553e57897e1a7df6a397d902db08eea6b9f5f5a29dc4a3b39364c43126e3ecc200c07a730e63ef1e96f7c9c7ce93f61d466c91e8cb6b6edb92261e1faf5d01fa1d86e3a4f5618bdc9dafc77a671c1ac6d4b935230b15b50076c0a607e361103dd4627af3e8c98d8f89a64e7d7b44d95d64a21d85c2713e82132e9af2a03fcf5ec03a8741e5584619841e468a234e55b91a1ec9903b61418996cf6254bdd267b38021e865fade31a2b4b131d6682d0c0ffa22f78c4d42bbd5b9836a7a41a1f7f96d9b9c566c2c079d4ce9f94dc344aaa0723271c52a3305977c5c433e53d98899d3decc922916d1a2f05144d9572dce18e8e6e234cb370dde52457878faa592cd2d34160e41ba2f1854a834d1a36dec14cec319ad66d35a4d534bf2a38836afc81ca13e87ee7c0ff2d0d204def8350f4d35c092db27cbb62010194017c42e803b1af40299ff104401b6efd26243bff45e3f6c5c0fe544b17c1b1496cbabc6beb1b0242f75f894c3433bc04385947b9621385c84d0f78ed1a136432248dd125b7a1efc6f514f78d7fb120cec65bf460684107fcdaa3060a4f43c549c46ef62062506871116de61d45350110c6c85da6b3c647f6af8b5ffc462162de1a22249e5d84d4034788273d99ee86fe9631755309a4b5bcb1e10c088447a63a3648f49fa38378319566cf575c8f2d1b7664fa721e981024a4a675e95dda93bd6dd9fa551c71b7acc43bc14724d8a92aec0b667adf7c9c3f7eccd03b5d40d7957ec72d401d552feccbaa593bf6258cf229e4f4ac510d076748fa30e15e94ce1a7c5abb46a2ae1e7aa191b2e944625f5a37f5408694dfab15f050a960fded0fd4d8c01ed1e6aff6ba1b75d11b74348fe7b92e7dcf3d06a1917221f2d66b550d806acd8a880a6262043cd44a25cd573f5d4ec486cad7ba27c8c324351e075f6c65f0b941c022facf4ae426a8179546790dc6405057166ce0b34c507720bdf562645b46d785e9139953aad168ab4ecd8f46769f23d6cc96a3e2096c0cf3e1dcb4331eaf204ce8176994e400695d77f9b16aeeeff2573ab4e576df9b3770f57bfe0794c7242d28caa55ac83369a537ca66e5278e3d882922ece1d1016144ba07f912798ea66fb0b6395c02e4f151aa479c26c7711a7c12f05d79ef76843a150f5b67b5445362ee39fa61f741a4d9569f6c62e41ba29c690ed9ff8ca2d556c7389f7bfc11e76a1ac202c467a700a12b1e78764c30535465bb9a4ed5772985ab49843ae7d9ab096cb5b2e215b07d4f67e08befb9d8d4e9e46bb7db3cdaf354fa3401445ca8cdc5e65eeff31d6c1f207f76ff3806fb8d9c6e243d2dbce6fc1a232ae80dfffc1fa5e649e84bf7def04180e3fc7325a194e25c85f8f7ee1759c08c5d590c24b2f82c80463c05f748458c55ac82d236e2afbdd2a7830799bc5cc006006b345477d425e98c9abafdad2520f851bc9183763a69b5047337d7c071ae49aba7d8cdc545fe8a81452c9ff224b6dbe28b42648a74311ac8114c3fc4aaacb8d55d7b160cbc7a9ab7b84fec065810ec1c8add1de15787328030f1d9630a9069d1b8e8ce4e5e51d2290a3795787339c0a4745ba33ae4a7bdc5d42d5d1ce3b39506a2da8ea8291bee987c5f704741dc99fce757bb3884155c77eb26ff3e7d05bfb6ffe60ed4d27b98b252bd29173bc022654046d1bd85fbbde0c949ab73c60f5d65e7989a75734814714328a75eeb7204c43c3378849cfce0ef2d9d5a367ef150e6ef4ec2dbfd56dea42da17ffce124fd4e07cedacec504730cb8535380b0153160db3c29b160012c3275542993bb4052fcb7d5d90f0ae3daa7ae762b9bd45fbc6e4f925229ebb12cb7861667fac886772a81e9eec59ef52eab54174e3715245df53fd4a934c729da93bdfd05cdd80e4a59a0d41b6eaf27f4dcc37e3aa1b0627960fb26cf33726acc7682c5a33cd83b091b000db2cc04a65cd8e7f539dbeb96b7145cfede4d65757bf71665f7e098ad7fced6e28802ff9ef1ec3876d75d2190f7508c4467a4520e6d72da180284ee078541523c40998249e1a55785b4e05fd157202c6782d4d6e1f06fcc1b51a3c2a99a77856d3740e0e62296eaee888790818c74fc4154c44c04fc75922144e91ccc8492169a1592bc1341b3aa5b47f60dcd4d036585964710c6a562251730157cfd738994b42feb4a5c802de233bb8e970b14c8f8349811b18de43b0003280ac0b2338d2af5b871c68e177966daa2846c37e27086243a9c08f0f1a5281748601e350a54022ddfa5062e2f1c091d00b147c4ea55440eb6238a3d23b41d87f1fc340bdfe5ead5227ec686d4382042aae4ac10ce474404c5e665a4406b73f4ff6ea451d66005859eec30c6a48ae91da4f20c613e9ff3cc6ca3d516b087e806b40c3308f9774c5ccbce80c32b2b02dcb735da8b66d7a9aa5b1af4b62db9bbc9ecb8c290d6274daa5a0f5012f7383f34714ab5e1c248e380d624e74b21712ef66b758ba67f01e5c3a64878f25d86bce3b0faccbc9635c29225eb2fb50344d441851138176c8c8949ed4334fb9886747f2505230839b39f18d3dd68e97e94dc71a7376576e66a3b8ab075c3cadf2c46f05817074a36db6b9729e786c8e2f52387da062d32f927f1d7b087d049b9380050a4417c3d27fb05bd0b46f9c8df96d9b124958505d728b4d03ddfac52cb233607f48df543f0a56c5459c2b61b8c420d363524a162267d16a6b6b9fb8d6b87673a1059fff01bcf09208877cfd156c9400e0c04682fe5be0194845905cab024fd531c38cca20fcbacc0b1936069e5d1127186adcbd45547d18f1df68e6caf97553c1163998982ab10c5740142b88b434741730f74cb12f08a2bd8fa6cc9ab70d0e8ade4556b7b53867880ef74bbaaa6619cb364107c020586b3cf6008d470186237ae7e91647e86747c0f14bb8f3690bdf2fe935cc73c448da128a44f88f3f9e976519b030b954f8828df32e441d6d619289964cf8bf5e1fd016a8d82459b15e98053074255d3d1bff60b8e9ca54af56766cc16888b2f5b9ce7cfc616918a94b453d8ffb976498d4d7b12f3ca8c0f31595dc1f15094b0400af9ce734e6d54e7f44111b6b01cdfb0c5eb5850244e967c93992d44f0d9b50cec868815a6db1dbfbfab783ebf578f4a3aef9fd28d482b956cec83e7c12cc23d4318016ab1996ec17ce48ddb858c7d2e41c0359d2ee32a6510617e8cb9d8267a67de19a772cee9d272970d925b0e2c876fbc8711a3392ae624b16d2c80651690c90b3b16d93d5ea68ca9ffad2fd1b18cea65b1892494cec4e10581a2604380cca1a9565e4dd06382787d004d191a546ddc9b85fc53205ace392aa8cb43801c2f38438fd7961bda18fc2f0af99813a2a5ecac8fb466413b8cc809c000de2f905b51ac5da94a5931d6db1b7ee4dd222a055f16cbe2103a83aa8d4e187fe9db688e082b66d1759134a12660d38c14075b037d659d53b5c9597db85030a9ea4db234e2a264cd23bfc31c54998717cde27eab27be49f9a47188963be37ca38f86821929166d2f82eb4cd94d675757f5f2a047966a442b9b81a1ee72cd2f4e638c1e1f05b9dccf63ac1679988a2205eabd2b16130dcf795da154ca22d6ee0dbea6a998d84c19f87001722006c7f361bfa3accd7799ec1a4ff55b5c642de641e00ca29c5742873badf85aea1f77444db459024681ce79ea4ab6baae9fbb93ced9725c7cf59e95a377ff77ef4cb2ddaac32fdd4d2d5ed3519d785233e9d06886cb54a8ec49826783d91ad4c96b67ee43b922dc366faa17d1f442ade7102b662490014983cfdfc858003af7142d257aa936d0ed8d8f6aa981af127d5d7b1621d5bc24e558e38987e484b96cc394dabfe591fb673f8498497dca5707c196436216968a5237ec1ae37d30f3d482fd61a373f08f8a3b53736d283e4fa0502175f6e92e17dbc6f147d7e267008fe1042183b0093d0b7197e0c38f427653d3151e16f7fe71867cc7fea80d330105d84581a1eb7dfd6b24759fb8304b2eb6fd961df520987d2ebe3eca1a2b19aebd7a08758d1df2469bb5037b54cf4ddaa65b8cdee41c5141ff287ccc187679b71477a9045a77dd623824e457d2ba86d2a24a542ebca74538208421d5a38bd77209f382d07d2da29d5464205015a55a9b08f72845f0b177493e6c930469e22c854eeb482d496047289b481ef23ade7d2adcdf3575c0fc1fa5e482d4023a031eeca9175562ab61120492af3de455af31f6f145cd73df2669c5def2774d662ed114022ff7254e08764f222d472795cf33039b37f1e97f31c27a975d184c9d5f02e6d4dddac5a737906943ed58046af136ce1fca4b876355f1da7992074472cab34c3a63f8e52b442f376e07cb345c8bad417167c13f3c3530ccdb642ac4692180b05056acdd93675a6383b4382a746e1c01a33d0db0854aa40932a9e35420390cbad5a5fcb3e6caf1cd8a9dfe20ac0111e800760141dbfc8cbc0122bcb56c9f46cdd5539c507741834f070dbaad2640113d5b90298ae80a1e6ba00bd5986276ca452034bac6c5b2ddbb334972a1ea50e876562e932e38ae77a65bf91102518c981bbaca4db29804808ad17752de815a13e3dcc5c291cc5aba694367f9ad3c735e2dd7d3e028bea0df40462ead80487194dbff35f0cc7a8111823751ca6fee8a4fcde65279ec332fc85e6969b696df6fddcefea67b601851ac991baada4dbab804c08adcb7bb948eb1d50cd95f3a007dbd9bde5842b134a62e18b0c3e4ad0d13153f003d70363fee5027f978443be27909a5a8e21d0a4c16fef3fa17ebf6adac3cff6e6405fc0aad977e6117b6812205dc981fdd8dbbbcc589b14ab6448e94600c4591d48db0b7be3732ee7fe5a63b2fea23e49a93dbd1692f8287863e57e8165d031045ef8b1576635626a89eea10f88faac01f401d8abe08075a98d76a901100978793d67b23a54c3afb803739fe18efb4f98fc598f63d37bca9bc4997f42fd7e988a793d0b0c80b25469b2c4b58ddd66f9bae66ba522ad5f4653e0e22dd3c1b59ef65d9830bb6dc1d25d8d9679a3af141a3c71da10e570501c5c0314d366cfbe19985b3025bc94432bcbf4f5127eb75feef4287ae040a61af9f09c7160dc0de063d01b1ec2a3cdcd2f03437404c0287c3610ad3a3266acf7f4badeee7951433c64ab85970826535d1611c92b87bb36f5b60d00e689dfcd4b5c011f00f8b87c9abb2b1bb25498cf9bfd4a55acdaa20e38ec85aa7d6e08ccbfc152974db7757417f6c00332e024c825130d4c8c216567d8c98136ac48b4ab7041516f1e76bb8b9497573670c2c91d440835b21527fdced58806da8bbbc0147c4b96c05d20834c7c7724a0470403ccdb3cc07fdb68ffb9caf9387ab46c04dfcfdb5a677cffe40087f3752eda1d56df7ac8748f45c076afd00c905996827a2a2156187606ccb79f6af510e4ccab1246fd8756291c9d87ed9946bb2e9cb47fe530674b72c4fd78048f80719a9735aff0c63b85cbd57f55464dd6fbd3ee1cb963e61a54fe91f99c5ad0873ef83b1cfe5ec796c979f75fbfe2d234a5de79820d978e3d1cbb6198a622840655e1e65724cb30140cb33503a00a1a5e2f3925331e2a24371daae75d789e100ba01896f19f8cb7385d9311d653de539fcd5bcb45525e29fe37fe3a935c266bd5661e6d3df31397801b25dd4fae85dd4705837f54601d393652de64291bd8fd6aed0ab9513bc4a4d846fd45653349252fcf498483cec0cdbf03bbbdd8625bc8b82c95f9921984a0b65b6c518d33f08d9f145b7dc775008cbf986fd38a089743c979ece497d8d8acf51162d9543f8429065ad9cd65da4acc5c1ad00b069c20e11145fa651e09be3d823102508b4db31ee601a85d5ff875e4905ab3f3b1c2dcf247f416cbb8931e13bc4514281f862ea769a23651b2d1e23461a23850f1e1688210073bf3e1c8cae131116e66790282a486fc424b1a53552aa6b0bcc149800466b180565c9409471280a57c5d08ddc7c102e07c2166094e06e27a85d736773d30f1fdae59d1fafcec86ca1ad98864c1ffd5760188668f0aa5c034628084bdd53ebf119b999afe49d4744666a6e2a02ad2128f4afb6cfa7f3550c4280e9fbe0700c43545d61a9ed13a3c38d1d4b83efef2c58eaf556e37ff39d97e9779d4e90adb35aa88111824ca772f3eda90532445a22a65d13c8a83c46bb8f65efc96e8444bc189e5384194d6580cd05b711b368aa380aff31f364798510d931d795224dbc0ce30e31424e9e7194d87f62e33471e9034189a4d869c1940d3e468b74c796400a281a7592ca3d0ae3938dc14b669d5768146ba59a5a00a0cb894a2ebaf50a1f0ffe05634774676601656506e5aa9a85f23d697cbd6d085c64f00212d171094508111801fc84d2ff402c4e3f0893e09316565f19899ac3b25dfb102a7348578e9c53466fc54519b95ab85a5ddc20267211e80391c8d1edfd8fdec51689cb2aa398da211eec2226adaf00402614632c393b4bac1e2fea04ba2b42a1b0fccf8a35d2247572cad9c710ab9a4fd8d57272b7a929b91e0d14ff9bb6c258238b28c42f6cd498f690f3073c209ff6284d94db84beb9d0b104e12274aed1e7c17881b6a14090ad05e50b2e73e787794a3e24743dfb380d3e2524b7ea2fecf144573399018a3917b42d708fa957a1b4da47d9f50f45df63c9f01758c01e14141c066638265ba8cee7ca734501f4bc386a481bdbabfa57213268e17a0a65ea9aab54a147b9d3689d469bb19899896f0c1b16ed9f6b2bf339ae0e9dfde20a2717bfec33b61a0fd9c01b0f239a3bf147e3bbf5169738f33fc56e8e4efe582fc34c090ffbb0496fee6bda92a877c8ce8d16412196403f89473aefba68556499c8122a9bff466dbbdfb4febca505499520e03ff04ebdd919b6b1f7fed36909dc32415fbb055e0a6e9439fac288a9a9bb7552538de1c9b7353bd4f5b5ab4ad2b66c8af47613c7a47f4fdebf726b73a4d97b70aeaffebab6dfaa6626581fff56c4ce91c439c8d892aa0d99a1efb0ee3e0e62d42dfb2292bcf7e8ffb46a422c549dc262cc952c8980f01273404d59110527b1a23bd064ea28d06837e75d6d4335fba5c9866daf8d9605a38598beb8fa6457fa2b61cad162ccdac250b300f0c54ba51573a8c945b76893e469b923dd2c1a63855505edc26f2784d813c377ac059ff0a0c5ec1a31121094bc534f65c3cba7ecd4ea232b5c63325ce1f6b2e1012df0f9249c3a3004991f76ec18fb2516827f1ff22f0100a2864f8363f9f883fbd800bd9169ea55c60abfcdb90fbb502a890a36aa3219c4b2148a7d28a9a661e216d41a4434534f25d2f3c36fdbd18b8183ebeaaa35ef65a5840f58036dc798b22ca1b68f778302e13e73c8fb4e0f4a17bd3ffd7b7fa6b6bef1b45be8d16b418a0ac82874040c23661ffb0c784a0efc3616d59202fad312e74fd393debc0418527ff609de6f46cf6236dfc7dc9e36367b01395436153534b53bec1858ce98d2e9a63bb90734c09d2a20e07cc02d3c3804e2120831e9f693e91e1faca3f5b24478f181d01bc8c661bb5aa3b00c52f3b5a1a36044d87c2e794baea7001b5a50288d069e80349459b0a42b10220e1518a5e22e9d058898619c53cc915fb75c56bf9de6a5a4e193c7b07e061e1cb45152488f24c76a1875e688facdc74f602ea9cf28a561048cb4ada001d95342a75545840605101e36248cb928a5d966ccee816ac0532cfc06d7878c21d4f16d6816904dbac57e6950936a6b55cbedaa0d65c5b3088fff54f5b6393a5b368bc5a61a3ed26290911214b2bbb77c7087d089d084a7aa793f05149c7ff79d9729ce56ebd493ace5b66ee725cbf4e8bece9d80eb3657fcd719fa1709ce578ba9d7ca42e2f24e2b93ace45b9d984a7db6bb97964fb8fbbe843f9aa26226f4044ba80888fcebdd5463cee3e778b00991e1a5f8d161b5fee862a8c9fab032ad8bfbf82ec80130ff0e837b4e17bfbdfaa868bbdbd92e763f74c3c7d84eb9d185e88a02191627821428bfe795eefbcaa93e0d7d5fb7beff5e6178e3cfdfbcbbbd1e32e1b12f15c3824e2b9b8eb7dbc094fe73c6e727ff511fc5ceddc7b5fc32e097eeeb939ba303b3739243e89530017fd22f2e7977f2bf7f72d1fa78bb3937293bbbe9088e7f25c1db697da796d6843ac2700458a881ca240bf7d6b3f6f5cec7973e647e8cf3ff50a50ba1dc028bda802e8082d2a3a024a0d6868442123692885fc54af00450252ca14b2110a45bfa10df73b70430ff0e8f6ed7fa92f71361e0a85a3560739e7bc81dc7533c833da9e7fe3a37e97ceeffaf2bbbcfcae2e83b26f4d78fa05ef37a9fd7ee617cb1adab621bfb5014b3de6709c3df3f030db8071d9fe89073bb275f0a9668188253a68627821822686172158add1a2268b9dbfbeb62183f9c1edc1b73a068ef3f3c65db3db40301c793af85de6e3f7a3f7e3fd8dbb3e97e7baddbb66b781bc094fd7df37dda476ad439791fcf87338d29edfeba0ee637e4fda80ff7e174afac26187e2cdeb03fbb5d65aa5905a6bdd9ad8194a4980b1be9c13ca46279dbcce3927adb4d63a643f6f28f8a70bd389c39167e463375a57e7e2e8bb2c9d78d223b4c8dcb66d9b7372496e68439cc4eb74d2a62f1f5371ce39a795151c5de8db96c452717e094d6cfc540ab98fc31163fc38bc61a77fe0de0045d69b1ca0cf10d78b44538385acc1e206fd86d7d2ee3a39462266cb6d568bff8f74a3928ef1df973ac9f6f8b990e34a6862731c9e3e5cd0b91be8245b688d3eef3fef3715ef7b9f176368dd76f9fb9ad4fefd77b3f755c7bc1c7e7cd4ff7de5e374e9be53f53782fffde52e5adf05d6db84a7e3dba476fc6123f6b9ff7ed347b8ffc271f59688943df44bd903fc8faf42908fdf6f7fbfb7e3f7e3f7dd7799dfdfa9b27b36e0d075847bfb5c68c7398652cf4d8c4f94dbd3afdcb54ddbfd887fe47ebcdfb9b08b0b8978dd7543225eef7da76ebc094fdf6a12bb19d9defe16da8e27b54288164a87dc9ffd502d4c406e6cb0472cb7e855e98b54af9f95fa98719df6eb935214eed758b125cd892acb91286db94513417de45180ede96329a4f63a80f93c134aad348c6e0a5aad8a89155059638725d67842280925c4900186115710f5f9723ec6c2499211244814db43e6b298710f934186a05f1a5798e0a70b164891a068066884c14618a928789861f166263800a74575d2398b3e4a2659e3a6964e7fe709da1942568429128328185469d105d40f92b498f1d002173475c102d8dcd2a5092806504f3cc1e693510b50504518652c6d9963e0e0f8e04a51d92a0e2c4e162e8c1e2a4e16ba4469eb6947c5e6baa49da174c6155370b25824341974e170744933038a76c6149d1af605576c2173d0271b5f38c144126c7c81cdc75848271af4f9723e9edfba820424e8f325c6a204b5cbc476bbf56e9a169020251069a41fa62614df153a1c4d2ca450aa02860685acef2e95aa30d1b92e95aa6899e2b0b8646c71458d1f356a5fb82ba044113366aaca065cc200926098a00b1441dc604a0e9a0000106218d5744083591316b52c2fa0f18047554c4105e3e1e1e179f2c30b2b64b0ed9f481a38d12383d97fc2c3f3c4c6081bc0ee3fe11186106cfb272ba6358a80591e1b29603c4f700c01bb3443c0b6900bfd273448c06cc8a5ce0fbc60cb0b7eb628526aba5152fa51a2813152d2828ae6c988a94e3fe73e6223c650187c1267f464ddfed71981a12fdbd1640f0bc4e96bdd94cb06676afeb02d6cb48f5a494c54a73352b23d2e3be5b8f7609a774d34c77ee6dd12cdb1df4dcd133a2eba18bb347a8dd2ae4641be7a8fcffe5273dd6ffc062f9c402f20416ad65cc2b29c3ef3874b180956ecb19beab666d4ed7753545d157f4017cad15ac785d49932c77ed7b1583ac6ae56a56de920457b0abda690ced6069139f46b98094aca1ed393e52b9c139ed8678ba2391b54ad7393a2ea7583aa39759c1b54af743e9da1ada222759a7d72e756def5696c9040a1b2856ca70d77aafd2b9fc4c95cd288a0eabc4b9ad09494f96dfb19aafa4e9638309df0d4514a65d968a0c5094ffdc06ca928f3f2bf9d2dd55122f3e99ca938f22062d39f349fe96b95c1975a46e6bf0d87132acefd379ef5137cfa92791c3880e3250e196ee94b2799445bc884be74911ae8cbd347648cb07efb196e03ebb7ff32cdd3bcec34bf43b1364263c3f6338fb591ed671efc1d4ac365ff66c271e665decaccbc9ce12e006d999f792bf336ccbca52f3b13e24d5fd6082b741db1613ef8f3b7305b6d6486384c32c30ad0579da10af4753f891c3f43d5c9115a9a33bdff56d9527189123b04b2477df9b42298fa28a9b6d08aa8f53a7b247dcdf9252419425f45b6079f03b516365f22bb122ace503b913deabb9065b7e8ebfefdee2dfe5152f5f9b266a1e04fcd25d52897c62969c6bfbf5d1cfac824dbd0ce6828c8c6961fb65459a99afa01fa115364a5880a090bd2d29395a72d3d6c09921224268b952c53415882a6a6a44c9d81d403921a5a82d09225284bd3d3104f53ccd4d492161fb43c5d79aaaaaaa255a14d2d05b1b45475a52a0dda10b4317e7cf841fa0169694988a5a59f293f4d40349911e5439416202d4b597cb24c2df9b034858444c6540f5354413f0499b16794105162b20c9185aaa74a0f19342bb42a30406096840063a5a7aaa84a514f504f5514952836b450d122260a288a8da69fa6a7284f6280006289cad219413f4152514144a1b1c708e2278d2d58b65405552d3d3d5555a91253258b1820a6968096c454f954f96095c6103d6588b2afd208120a5af2018c98a2a0a2339e829ea4c4f45ce991a25da19db1655faa8a52d5837902195aa66859da22b465090c1530628490d6d84d4f3e4f4b3d34a5b13465690754a6236132525b7eb688116a6203cb54d5cf140fc8889a122555e45324852405494c14da5250d0187b89c44e2fb4c0474a6a0a264c364b71816292586a099212434a78e72d7bb471ca3459f6b8253e5a02c4d015a1a1dcc31e6d328d1599893ddab46c72a691c570544506303f5351d4c00414c5474ac980022750427b6c4da33984f73c92a148053cf3f18e418a7e0824d8e396f8851a96b2c716cda4934e3a29a531da91b243f0b2479a2e505d3e0c541c69fa9c31b461e51ba27d4142c645066d5891319aa2cad21955a4612500b531c8f0a141214185b7c4c9ecd00ab47c522bb862c97be18b23a4fce0872ba838012b8a810e5f7e10c50323590a2ee66c3a4ff739ec80bf0b5d0de0603cf83b0c05c6e5efbf768bfa3079a9ea3aba64f2e224bb0e499f2573e8e3bd771b7b4809f4453d59976fc3138cd8354c62e3b99fc30edbdf30e4226137dc5ac916e29ab3ed7fed560e28172143b3288eb468e1c27d49c24a36b78df85dab3ee99c95fb49b797db481fff7f78042bdb4675d72b90fe26936d59a779a4ddd7eeefbd4f6fb88fc3ed1de5d10fd0a7ec818493371ce9e3708fb0147a6605ed0445b02105a6e231b484d31012d57cec03982e957cd8d27b74a9f4d346a751f2618a52251fa23aa5b4ae7e18216712b9c5953e3fe3506a7fa794d2dfc1dc40525c82a8211186ac08a3e0290626c0011568c86089100ced3084097a08c3073559125287313d6a404e3426aed0b450e93086a3ad60484624b3729d92385a620a2b1c0e0940bb766a451fc15ea7f53ccff33a29657f062b77a48e7c1b04e3bdedaca2efd07963ac70b49d75ad7d99bf6fede5b3c665eed33085b3465f56bc4173ffc6cb7c37f8ea6938efe0d3dce0f9696ef0ef696ef0fd3437b87e9a1b345cf6fadcfb2bc3bbbf329cfb2bc3b7bf329cfeb516ffb533a1657d1540547da7ee5016afa16f3eaec6e944aff307b98317fcf082250b1b0c71346a20460753269da690c11847f76e3fdf5a5bc7c9454f1b9bfac8e8ab9e20658f738acaa8be2f6daa3d9946b0d717b2b4279d99335ea82049054755d6c8cea098eaf36d9105833363c496fd9be922ad50e34b931842b480044edd11538c683ee832032cde0edd2cd86f8faa4daa7636df1a9130db5c4813c2c2d8230e5bf7df27398ee3c2517ef795cf9e6b27a7962f3512286d74a19d4d5b64445f9316855097b4287cfa6885fafc1f5dd254c0d4ad50d5b14516cc509f1689a8cfcb7178b79e09d5a1e397dcebe99c4c0a2a2f524c40dd239c5070b4445297ce7d39c12bf17aa2d31574eec7209de338fa927b8fb9ec1d7fa9832e695110f5a9bdd0cee86bbeccd19e5de6d006d5a1cbff6a0c40dbb32157f64881ec4cf6985ff3b447eac5ac0a2ffa7c3aab18ef0d84f1de3af4d1ceb2cc393b75f99c94549c8c63c2359c74d4e5e3593789ba9752cab7b3fa7ddf4b29ff931288d62feb6c26c73f924eb239348f9cfa6867dfc79c99501de43d6241c9fafc105495510519569cf10316285cc61401832a5e78404548564485657d16d5687d72518434a198f511fb50713e9611f5f9b8e7a7cfb7184b2425b870913243c9873092d604154598f1e4c50ea26c0bcf4208434e24c9e67f1f3106aa3a39a0803801114a440d9102d87c2c547576808841972a3282b0e207d87c2cab3a52e98a940f9a8c38020656c0e6639faa2391aa08f3451518545a70049bfff570bf71b27e3996d1970f7d59daae3f3ea0cbc6b23e3186026359976b8cd16928dba4685ea8684b00e1cd682890d194a86263cbcdc1051839c092450b8450f2408d099f138889029406149fc419eb34418d2dbb0969d413a0f6d3d7f652c738fcfd3889721da70fa7afbe391c31fec21bde6e4e33b6ecb4cb0ececfdbbc4c5d94ce2c6633f4108df3c73e61832eebb2c3f6446df3b1303a379b6d6823a3d7beaf564fc75c0b009ff52dac7e9760d35e7f891462d3b79f410ae95ab3ba8536f4b56d7f5ffeb644e66c21a5f4d25b59dbef7006bdc4843266077ff5f3b7ed83482155490ff8abc7a04dad59281d5d61a9f35f79f329b6a4cd94fafc314f29e695755965cbe6c87aeffd1286dc1f4b0872c396ad7fb3c41ee5520b35c88e14327b554a9a7558857d96fb1728eb1e7dca65c782800ab695e2f6dd6329daef3e4bf17ef7528a5db7b1acdfb7aefbaefbae1bb6d0976ca9afffaa5d98e0818829c0fc3001ab414a3d78020c2ecc408201ac86f55ff577fd96cd1adb86b4ef06f9584a1936996d587bed77f4c37fbb97fcbec4ad97ec51d3b4e5032943e6007449fb92c58c89161c5154461a5854092db103a036aaf0f2031558be8802b6460c2af7822043e08ea37d3123a74bda97333ad8256d56021a1cdbdc362937eeea3077a5b456da6aaddc92e322128cce7dcdf5feec551fc9d16f3882a073f6eb5671d45a31776ded3aafebc0e81b15a9d5315aab75d9ad5abb61eed26db376b3f6bf5a372a7717c50d8aa312916c746bebc5014710741b726ac4a43d5229143ca9983ba7a598d2b17277ab14e30ee38eabac2faba5b54accdd6d5a5babadf53f59adb456ca11c01104b39b9b185cf978bfbaaeddeef5dee575734e3b29ad25b05fc296d3768ee3e37dee2d775d7a2f47b9cbebf0b41cbdf78d78afedfbed4573709074b17fc4e9b58a4d7f02b11d88982dbbbcf688abcf4d81b95e1f6b4b6be24b975faf354b5b3e12a50dc4dbb89bc151068a2daedbe4e0080589bb592fb5d60f584c3db0bdfe16d73d3f636eebfdb81ff1d3e0222d9bc9dd8fcb93d75c616dc8658ffa2f7bd4af49daf3c7efa1b3edaedb0b64f2e94f17dd289d1373d7d64aeb6631d549bced9b1669b5fdb77dde36593177eddc649d75ce235daf54dacece19622878d6316eb573d6d4b6f4e8ac9a88fd3ad26ea74e529f16f1d1297d49eb534bc7fad6556fad767bfb74933bdb398f74f5ea24f5377da4fe4f9d005c3b9da43e904ec3df427b91be9a30f8bf518b7aab26e2c3bbdb78df86fbdb7377167d1c17658a2f9f03242c87397cb45573ea770568d501d45db3c5fefee3f2d445ee6fff711efb4f3cd83737165af8fe6ac17dcfe5d9fdecbadfa1386c32065f444e1db3c0d3d0751cc7ca1cc759d66716662269dd7b1a8f86dfa153c768fe1381cfaee9c747efbfe9f238dc7ddf63eef2a1330be3eea3b98ab1792cad7ff2c0679f3bf0d9456871a9e3fb727671a9c5f8c06cb3ca373bef60651e32f9b99c11e3a3c99ccb2e4288e3cb9141687d3abe9a8ce3ca376c32cd4d96e1f6e3919df0d941f093873c79e0b23b71f23b74eec063ad98f81fe0311dafe3bfa89f3a96c3e3c095d017178e4c78baef39eeb919c76484e7bf274f7e87e2274f42f052c744f03b5407d97780c75cffb9fefb687eaa6328fc0d5cf6263c7673f352c7769e033cb603f61be0311ecfe335c063ffdfbfd43122ff7d34531d5be133c06567c263e17fe14b1d43f21f1706d53105bc0d5cf60f037cf69b2f3606780cc77f375fecefcb228d2e027faa63307c0d5cf60bf058081178a9633284f052c724f03bf41b2183502014080542815020d447429e3af0ae2683c23ba612f20ec007e09f702f0b7dddcf817b42f4759f877b41f4757f04dc03a2affb22e0de0f7ddd0fc17dec83f1deadd6ffebf59990a70fbc73c2bb2710b0a6bcfe3eabe7f5f757525547d29c9ccf792259f3027c07547540a89a731fe3bd5badffd70b84eab703eaf73154d56101d59cfb18ef0d85a1fafd4d5475ae53cdf1a93adc4ce6ac6a55673b111161bcc7964fbf3efdfe7d7006ac297d27551dec5341262ab27ae4ebfe7d8ea9eaaca468ce7d20405eafff566b27f924f5bb92eaf7ef7f1d057e87c27ef678673763be39866a9a9f51f1c65f0afcfd6b44c5fdf7bf6e4c1681c76ebce63763a6bef16342f81dfae531389fc49cf25d121571fcfd8e46c507fcfdae464507fcfd6e898a4bfe7ec744c517fe7ed744c5d5dfef9ca8d880bfdf3d51d185bfdf4151b185bfff817987b28c5860a8c880bfcf3aa222097f9f85444516fe3e2b898a0bf8fb2c1a15c1bfcfaa5151c9df672d5131c9df6731517184bf0fea588e1f792cc77f3b67718324a6943120fc0edd3a96c48cf21f4d0e7f877e38c648cd7f87d27cad9cb330ea33d7641e7ff33bd4a56336fff1c83bc684f1419f9f8bbcf64008420e23832e4212b3e7f307f8ec1ee0b3e3c067ef009ffd063e7b133e3b07f8ec1be0b36b80cf9e013e3b133ebb0d7cf691cf8e013e7b0d7cf60bdc8c69fd0ec5f9103066a9cb1d7a42b600d74f0300748c461b018014c204a1790586e822b403a9400fbbc7701190dfa19f013205b8fe9da36337509043440b2e377e877e4426f06302410828b2ea52490b237e14c921ec640970fd33f0ae1601de2dc9c03ba61878d714c20e2054d042881076320c5c3f047ae8188e103d8c805d2a69e183630496e7143e612c208cf76eb504c002baa122f263caaf907120203f80eb77c09217560d70a1051c37691cf1a2be233907973d85cc00ae9f041678b7445ff717c03b26faba0ff2ae89beee2be19d137ddd4fc2bb27faba3f02efa0e8ebea29486e974a4a1ce54032a5f009bb4e02f8eb749d760c1921414a2c2b80eb4f80093a0602142628c00b080a289267949f2a37511b4990282a64245cff11213a163e216401b4d0485e81eb373244c7b8973d84058cc47f877e2c7c47b20fde85913deeabc0bb2ce68ffb4578479b09e06fabf5e316c0ac5f2aa1007edcfdc607491890c5918fdfa1df0a59f39baa1e7c76061c403799bdc723c944b8fe58d7b1d7a1bb9014f509c82970fd0840808ef16802010d9841828702328cebef311ddbf1137ba1cbb22349dee1fa0f5044c76e8a28b24486ca0d0a5cbf018ce8988d90110764c1838d92acf9cd1401f8ec0e38a29bcc4e0016f210aeff8404e8986bcb4e0004d0704120d708a911b2040c1b113530e4194e0bf0af8bd03e13168077b43362081335f33bf47321cf1e3e61b307ded56acefde9c399fa7d507749663c60019ac8ec49cc9e6f400ec2f5eb3040c77448312002788c8edfa1df0b59e4fa4de02ee8582bdc810bdf0c5c974a4a6ce922c45abf43bf19b20cb75df3121e045dc47699b063923dee97c07794b1b99712c89adf88b16d974a49687411f8ec32bf43bf2559f31d3ad8dc73cf0d80cf2e01adc31a18ecf931e826b30fe045e0b37f72c7cd0e90b502d9e37e0a37b659d1fd2f96456081a12f9691ec71df6ed95ded479651bf0fd34468ef92e8ebbee61d8dbeee23e96203e0e747847589b6b04124ecdf7f1ed78fbbfff11d093e9ee54367d68f11befb11befb1f248cf0852e23dffff82ffc11da8fc562fdfc9a7ff69a3fd6b35846b20822f75aebfb770e35e1beff56c81db7dd7fdddb2a6bfd42aeb2b8ec4038ed3f38ed730a97b029854bd88cc225cc07a7bd07979d005cf60170d9670f973001f0b1abf5fb39fcbe0cb7fdc5c7ee8b7e3f007cf486fa7d00f010b8ec385c7610b8ec21979dcbce83cbbe83cb2ebb8bcb5ec369d7c165971d87ecb4cb18e9dec3e07b2d29040475a6227efd9b8adfeb9f3aa647efb1cbfb5c463c0ff391f52ed65e815f139eee3a92bffbfcdd779fa77993ea7d87bdd54aea24dde7fc601215593ad692425adf0dfa55fc4ddc75e3fe71f523f8a3f7df4feeda2bd0e36697236b5ed3c5964a2e98f59145837e89c835ba3783ee7de6e3a4b886e3e4dd773fbf2f1c41d03d2e49175ac99281f2844e2696b034b28fc35c3853e5fdd8aa639cf580e84bc81e67aa563e541cbba84e39313429669dfeaa878a73f6d54fa73f53b5eaa12f57978de372cc5ddbc5d65a2e6f2e9dbfed628bed6fdf4d51d1665717a14d46455f14aa8f9e90ccf3f17e3c20ee0575539346d117eda4ba29aa3eae643e9dae64f4e57a62d3a74fa3649d7e17d5494d793d52c89475559dbec5a179e22022bc65f011e2a76a0905a293fa208314ad0626895ff821d3c4d084c44e2faca006bc4f80f712122f0122c20768f645f6c25117a321bc8f649022d3c4400593255983628f3befbdf7a612bbc04a0c4ed8ec544b41d23492b8b6040b934c130350d28fac92788953124c334962a725434ea06625209a40332716c09064730c76ca1e69a86c1e628f2d59c31ba88a3d6e2a899760214311524b9c7a9a90f09e32507942ca08aa2615c647ca09893d06522e594245f91348953dcaa608d410030dc76e860ac02085d04fc2a476fb4cb65ea59412cb1e04904226006a6a64643c4fda295b042061aa28409ff6e79d17890f501183304ca021a64806ef0409a46c8922b443152906092a5d0c21841557d6e081051840445099aab285fc968442d43406181d52b0031042d8d820e8076cb04105962cce18527262e88a2a35886a3244195fa648011949488933babaec5937d9cf0ec6a94b9a14507db4545218f51a5aaa2afaa2a22f5b455f4cec71cbd2e7cf2c541c2d55a7a222fd29834d3054c7c290faa4a2393db23ee7e663a9fadc84fafc1aaa0e956292753acd4954753ca80a549ba8acde208e3a146ca44647f2a84a552a2bf301b2b0d10a556b89e890507daa4876490ad95283aa28ad55255547c296360d4c91969aa5cff972ac3d7d8e94893af5c964aba8ce9c4f3d3f5b509ffff30836cea43e6b348ad2a9d6a4ea73ce6d0897f125d1babc1677788698da24fa92350bc61eb52c9810e9a937cd8ab41059219bc50a0dd91f0b24ebb6678abe2ad54f3ed56515545493536d0929c908cc96d99096a02a547dea0f65eab4694e3ae79c73ce39914824a9a927faa250495dd2a07433b39cfae5385eb3b4e7ebff664bce39762bd0eb388ce7c69bb5f10ee98ce16fe703a790275c2ef2c7bd5cc023a4ce9dd59cab736b35e70ed19940ece071f3446706bd145ee4ecd67e7ad5e1a65a51fba9091beda3eea3937c746d8aea70b39af3356d1a1f9905569dd9c34a67fad0507566cf8cce8c72a3ea4c292d9d394547d599545c3ad3ca579df9838dce040aabce0c828a388fbfaa7e7bf24f5014274555736e952b4c540401470835324e72705ec7a141f58365ca380a62903fea8c76f8c7f469d93fb08795cf7f374cdb070d3d33516e48694dd141c565e57fb001fa0f73fe2531836afee33baf39ec51e0fa6fadeab07a68cefd9efbd789524aafd37740dc6c27eda49db493584040336eb6f7aac632a239b7b5f79d61cc323242e13934a4087621a5a808d638aaaa03824c5440f470c12f656201e2ca7fb36e9c7b99631c5e4ee1b13cec678fac9e7eff1bf2df107ed33f3de43f9a391f32a404e3933e6543b84de73eac1e960fd59958c2ef7375a953f81d9a420abca39d20c897798de8c9800079bdfe6b52c59a48ed621884939aa4af10b8a42f1cdc29ebe892ae04f124ddea523fe1fcc913ded1b0e0e81c2ca0a9598f62117549aca17bd303281c457536119ec250180ac4414444b4ddf080ffc842c2f99145ebf7c98faca57ea34b9d23ec68f4e5f3c407c787875d921410be55e6345dea989219f43b74255575baa52719cd8aaadfaf4161b7c30441cc74a943ccc39077b4a22dd33fc99ab28249cc207e87ce20c22e0903c1bba52b5c5213c6aea9dfbf210388c5ea52dbb032e63636b31fb8a439e17f32bb4bfdff5d5678dc363fb678ece0b4d54db893c2b083eaf7c37187f4460d1950660d2b331a73974b46852677a975d064cc75e8e032e5c6d7a56eddc898b75a55a4e0f0bad43730bf718388285d977a66668677b42172e02e7518d923071ab3874b9a33762dae4b4d03e634bcd4311a78476382c64766e9b87d13a97d875d92127b0493fa7d100a4481c3f04e7846cd121898b6fe5daeeea4709495b4206b3b671fac4d37159024edcc6255e13d5d8d9a30abfcfce13d3e0f9b55c26e89e6dc97f230494dd83766c6ad8109948fb7404a009267a880d3ced9076befcd830c09b2338bb57d565237a6131eaa5cfb77b9fa38f7c3dbe5000e2b162befd56ac55f0478ad587baf660f9c773430dc01377d7e7c58bf654cfb77b9ba69f6dcffe1ed4ed9ec9175fb67ef366bb5a9d83d7e0c3efe4dc730c85b1db7f9f66ae5815dd0f4b14b026b54ecbe90af7abb25a77e9fd3446cef92cab83185b20815b9b9c1964a2960ea52290cadcf9bf5edfec379b340411fee7e76dc7918ecb4f75a777c04bff3b80bf440b0e399b5571c08822e23f8c1c71cc40f625c37b96d1d0575b84307204d0a91fd82b1696eceae6b52e7dc2bd0e34d78bacbc864cd89b3e6d8d565cb1863ccf19997ea23be53c813382af9033c42ea7047542ce81733d1eff6d22f2845bf9f85a858f3f773162a0af9fb79888a5387bf9fb55071cafe7e26a22294bf9fb750b1f5f7f38c8ae2dfcf455434e1ef67232aeaf8fb190c1583fcfd7c44459dbf9f91a8e8fafb39898a43fe7ea651f184bf9f6b54b4f9fb79898a28fcfdcc444503fcfddc44c59bbf9f9da8b8f3f7f313150ff0f733141577fcfd1c4545d8dfcf5254ec7f3f4f652a2aa6f0f773151511f0f7b58c8afff7750f1589fc7ded43c5d8dfd73f54e47f5f03517185bfaf83a868e4ef6b212a867f5f67a12292bfaf87a878e4ef6b2d5404e1ef6b222a2ae0efeb2d544cc0dfd7335da48d34187da4917492a6e99a5ed24cba493be9270da5a3b4949ed25454c4f9fbba8a8a30fc7d50464508fc7db007f4017f40202ad2fc7d30888a16f8fba0101569f8fb601629c4c7df074b204f50e1ef8326906291bfff49551d8c3faa2deb172afb4001f5bb896ace7d2227a21ea40832d15715d5e1983e202a82e0ef7f415474f2f73fa1aa337df8fbdf101543f8fb9f162a4ae0ef7f44549ce1ef7f5ba81881bfffcda828c3dfff8aa818c3dfff8caaceece1ef7f495567fefcfdcf470a91f9fb9e141581fc7d6f8a8a15f8fb1e15154b0067205ff7c7efa7dff1ebf1f9f13baaf2e357ebf73da3aad3010d559d55ad888a13f8fbde8c8a3f1e08d4cbe9995ab59dd4011df54bd4efccdfef923c1f2a86e0ef7b3f5414c1dff780a83882bf3c7fdf13a2620e7fdfcb42c527fa8178b217907fb57eb76abcd8e39ce1543be1e15be2dce13ff052c772a07de63d80c313a1bdc635a4031f73d9a070c34b7d4307666ff2b19b1d300eece091c206783c110d3c5f21033c44c2240441013680a024090b0b004116c01c0c18bf886cc04b1d73e15ff81dba5afd92973ab6fa1d8ae30118f822b24b1d83a1490d5f44769cdfa112b8c017913d84dfa13b1ca1f4bd45089924a8a4eb17ac9a18744ad1000000000000f315002028100e88c442a1240d824091c30f140010768e4e6446174904f21848721044318618000001800060083084183248d2015472a7ba6832e982dd940b7317d2a0d8734950da9485e45c76cf1d593be4f27f7d4ff16d0bcf1f767d6790c5050e80dab5087e44bcd9b2a0c193411ac9afbc29848796cc7344ce20cd5cfcdda2c8d0a2dc727d039e757e61d8f18e6c6fcc59c9379f4ff27caf1d37542376feef3a7f313df947dfb236056ee560063ca778d57ada004b84a1b93f12e392f9379743245b1b08c9a835da344c423be65cc36b701042302459c351277cf056ec5ed2d104aa36d9424e06f9964d2f80cc9088894ec62848af8d811718db4de4d040f7117fc30608b94b910a55c9288308ed83e362e9848f7f9007c1fa45eea83bf0833cece63920ad68b4313e12a152297127321d71c75abf30d9723b0cffdea0f2b42af1db4e47468e5472e9e2d4bb4e7842a4d58c6c57741b44dadf374065a34422c7bf9197586326dae95bd99652be499b0e317b0d7a097194b51ad925502a66eb47e60c16657f3babec740c1e659c56c711b515dff6838a0bd20869accd35cc30362edf870972edf94a26105787fe25eb3a086939c22c6d611598fbe201274350b356317eb190815588e6c0d62affa97c913958709859bba9466f518c15f20d9701e6d3e02631be638bb8999ef65a671b55d2c010948a694fea7c33d5736c248dd219d5d5a7c593a26c65354f83937d442a0edbc3c150eac36c9cb51f65a5c92ac281d98030f4555a321212b50b7c171f13eafc021f9e520de6f904b7a944e484f8cb02c4f78582a9c60d88db19140e99115b3ba9660875eb26468216e149bdacaaafc83c9a46a29aa0b1fdcd6ba12fff003e02a0ab3102098201ac56e9de9920ff9c0afcec8a0a829703984a23a0ef1d0c0fba348ca44d6b986384415564d2ff9f031b203ac08dca8eb5440f81581e5547557a86e94a6a1914d42c5411ba93de8bec8f5f9df1277f59b31973fd021b592551339212db0226b73c260a5c05a2dfced3cb113f2746a17a262a760dfa7055159e058b7f2c0c4fedc37ff28050db97c0455be6a2025402a80a5005bc1a64154875b0ae16812fbd9b1ccf97ea402f9048a24a8ee1e7eff4b553a97c1e274d5cf6e7bdca5649586da3a3a57b7d51b8901c3a8f09f0bd16eb3293070c654c881a6afac28623f097c135ee998eab41a0d454e23b9b50c501b6221ea960b38c43cb74fe7f4fcd8945674165e159075fd129909985f5f6529d88223238b03d9d0d06324d6f83d9feaffa3911b18609acecea86ef4c9ce01bf3572000a372ce7960f1ca81903688adb496826977e88e6e441d2b2d2ebaa7821f8dea048852dc6aa2a391b44ea36f8bda9c6623b38847add158cfca188a73a556c5928c5e6940adac48a9516a9619bd463c20ba3924b4790bd3b0ae33998dae8df4e0defdc9204f727ea43d5df6f3411eedcf3f5c67e13599726cdde1cef9c720b56adc8383f93a1970116e08201c82e1d9488740990e89a028bd2258772b237e5ae50808fb8184711b8f04c6f09d84879c55c2383e2e71d0624c8082d69051b5d80de4cc20e625a15513d57219f24733badc50f387fc4c3d086cd64812b532aa586d904ccf0e8968891c9602c75071e359d8a81b35521c347ac28c7d3fc6b787519fd82893c33c00377a032034061869c6305e37c67dd9784281801b43d3b1bea07363d71721c208a176c871e3afd61142281dd2c15e447d870c13b8dae42a15b5ff1ea157f3efa507f097838416fc19df59f03ccad16c5a7d07cd6118f253edfc324cbbcb2b9d79298bb2c71fb0bfdab0aedaee1a272d8ce796f7f5806a67172f965c11787d0dd00beef77ecc2214ef895b64599e753fd6c68b9f917ec3e51164df045f9db80775f24defd245d8fca65ff73b7f25a111bd1ffdb62a3905d0dddc82cd24f7846f4156218f67e5fec81dd5fe57851b34d63fdf385a676de7f8c706ebb3ad913787334a3bde30c42040d8c018f267c86de3aae7b8a212c2e17a70ae344bc35eb63579981140a229f972a7af06b3e6aa5539f788206c00209697a813569e342f901c6506512ca3108754292ecde8dd602cb11effcfd8b9858c95f6ad3d579542cf3fbf3bf240dd1f658e417acf8f0305d6f983b2e73a0d7e772181bb584f5c0fd7f88276f8b70015a5d183e0c718abe5dcd93801d243ba8bdbd6318e2bf8a5ce0f673d4b3d2412a23c8cd84ff9742625d7180d924f3013611d3a80dff041c663fdfeae235b4e7610b5fc2140d1ed6492fe32dd531ee5e9bc4f97f46879c01266dfad2e238258c8e845905a3d6edb601f82b6b1a0a6251417724db01a580a8e30521248b5fda4cd8e71f59a90a080b254b70425f163ed942e62718daa88fcd221978ad9b0aa1f6b8fc67302c76bdc8c82c5271fe49fefbea3322ada84ad8b70c28d30a44a7e59f536fb0086c3ce591efed19289a6e02691fa36be35f863160e3d4d6048dd341e6b59fa902223b4bee90cb15d4e5d7fa93a5809c5cf51651a47ebeef35fbe05cd7e40b6a7c54539c9c43cf9faddbd56529fcf6de4d0013fc9346c5add969df44e6046bf88ad4c7303bdd5579c7d85a7bf41c2f4ddebf7ae95469540bcce22aae57a500f6ebd6cdb75d2beb25945fbe4b21fbc5dac91800889b6223f2cb09a924473262f4b75ad685712645a2530c274eab70c1d2f7923b5d9423c4402eb75fdbbf5ee544a763591aabe17c5ddc95c40193a0b627f4f8ddcf64454a3ae43943dd19b070929ebe0c06a94d7eb8190d76740bbef80faac22ebe4aa0f0e70594b30dde255e86fc935cf23864c6252d70814f6bb70f959de1dd4802f96816b6d2b79b7feee03193144d70ce0ae0ba68d081eb716d98ac8bdfd654075b4a50f9426ee5b025ce877d74f63a1c6ab54f2abd467a5488f6b80db35253eb25245fda9928fb05fdb6de6b5119047df4331c6eb85da4d8413fcb79b6b861f8f781b14b64902183b0699340a7e08bf29d30162bc4f55bb37a1a873c982b6e180327e03d301924166f4db37b6143f77925d439d8e7fd399541cb363b33e3e3d113fc5722a458af0883ca2c8367cac6457a2a029cff43a060ede65bcf60fc50ead3d967eb0e9405a1a2b5f96c8b8fecc2a06c17d744ee3843c32c46847de3fd935ab7b61991fc3a7209f8ed1a80138af14ac72025a7143281d7d89a436b93cd23b4e0616f7b8f4b20f7bcf521c6b168fe5854604876b93bf9483ca0628a401e3b8307a337452495843d87076d3445ce741742f9a7a52c184887fb7c3d0b4cb938820f6fefdb105821462088a68c28060c63e3d064dcb071eaa7bcb5b666cf5ce3ab2604e913360f56ac1eeef0a1a52ce47591ecda0c639b09692f3bee366b5a070e2ceca2325a0e0b664b520f92ac9a3a0e81710997976f32f715182a2726712ea86548c5a3490d6f1813b7364071e58dac7d232d59270fa31342e643414748fd5b427e1db4e454bc9dc614c15f3daca545803c196503fa5599160e0eb361ead01abb5f99283be1ee0b610ab5f58aa6f916e444bf74fac95f9a5a0c424bc3a1873b4c4bb909f5e7c2c9a143aa7f7c948a27d05cb2a6c30b370471192f6c9f77dd9aafae9a1e05bf61231d2110608648d861c898137d03c349808ab154d6830af28e3cb4caa0a41116b49f3e27b6f7266d06dd05f8ce7c9ac3c21da169e27db723d13fa9200ba221fc010e8ae4a9044907943708860c1312a804a0d588fb518d1679bb32f567493e2e6a14d3a7d1d4fe49457f6a198539d33772961e35ae35a1c99fb6b374e27d4b01046705fad3ccd9008b1efdf05bbd8c88070977f33a896a0e31f545dff9595e57ae22b11abec1a190cef5f60ca6db225bc0df136ac5026b04b7ca34fe6e08a1d4034db9b03f12127561620e1d0154e8fef4d207dde10a7310f24009fcc1108678f446a9d25b0c55984b36968ba40cd718c90223136fbd0dec9bb8182e893b08f1f55c71a526c54e06d0708acb03340b58c10031c05c60933e88993849b88a3e82067aa6148519f4f22147c8c7998af80fdb92bd06895bea4d03aa4618c7a9820bfe0f377379a198edcad1c32acc23bbebebd1d21e0ac92bbe9e094ea1c61769ebb78f47189572d62e7d6d4891649e2040623962f1da8d44b60410048a97367d4c754853d9339ffdc39f7ba0aa1b8a48a702b1f49ad7584d438eb4a5fe841f500952c3e44f541edf00242a7844a61d106e145633b0ec6367394e3188035213dc73bc2f8506bae171fc25f268016a3421f0ad7876648e6db10e9601c3ad71a6bfd42de8515a08d9b005dcb15afccd60e02c87283d3ee0a43a91ba2ae0d2cdd76dab08525838514a66b6d69740ff7ff96a5545e98af6e8fddd8745f76d2816e3477635e260dcea5b2b5006f57a8872c74d38620c7ee3f70c35fe3511bce64ada616992d02cf243cf38e89bf93ca4ba373c1f5a2a40a58314469c7a650d0b79d42e9f35b4579e82313f6d8dd614c93939310be84f7de52b5f8e216ad2a722cf54a6cbbc2068c472fcccbd84045416792fa3ace8465b639086a98bf15e25731503b922975434da3ec04975668ab89fa1109f59336647cee42993529831d1a2a5b4c054796a81a74894334f07ba66af4fc40421bc2423560eea720f791e1c6a6f44fb361508a4e2547942c464bb3a8ec938bdac051d4af117ca4729886888c91e2619fa94fd50f009a283d6e526a4cd149491b71ba142d21374049bc84812d15662c603b14e57e7c73c0f09c926feab2391ffdf13507e7eee3979b870307c4d0e1bdfac795968e11ff3038a06b82aad919972709d7761ceb56360be74c06aa00f85a306569a40d68f6e5615826c8b1c2f14bbb4d994b19961eebae0fcf24ab1439302d9ceb785edbe86bd333127c501c133d8bd411aa44c62d4aaff40ad6578f58e1e029c75faed9bf558f8584943108a3f46b3cdbf59b2002c5d5d62f4663ec5d00d08329d27474e95c6f4eb68a4d6d224518c99468809b3afac583a5e1af369a6d37e7d881e4fdbaf367e8ee2db2b7f813ba95f3a0d48dd96cbbd1381c741533670378bd566834f686ee40df629f54254920231016107e11e991401873db6078fa5da5d1d1aa0c1889ec9ddd2c0d6ef3c95d487a3ef889b8cf4ce0743803cf675d808fdc76c4369d45dbc02350720719a23eed24447629339688a39b1adbe8e751494c01d993c867a97920c91a32781089c1b5dcaefc5ee17d0bcd2c88b9bfd4796a8e904ac89afb1fc34ed62e50313b69886d3bc155be0ec8a6cfd487c0c8048bb6673060060262402919224e08aed9ffc6c449c91f715d24185296ab5daa09ab4669906be3c0a8fde4adcc2a40f1657c71acaf2d6fdc98ecbf496375639ca3aa7cc5ac831f6a05b5b22f55c49ec91a744060aa9a528c9b0589be51bd9e18df115acdac0a2247380eff53c01ce8de925134dd52350e01218d0e2e23c354209a8bec1ab9b1c6c5e6b21ec8dee2070e751ac3002a17bf51f19d019be20d43804e2b294ca646b811f287c744c28d00021b3dd4ec5d89ec3654af26373e9f67511be6447dcf54f92e5734e5cc5e1778e86aec44c21227089045e364a8db301bbf2a0c934c0748ba6dec39ed2067aa1d1e09111ecd459b8966aaf2f2d92662f7cadcc47e0485d4cbb0b01da9ba12403135e5277f42782dcae575371d6854289fe0ebd7f189b68fdd3f055631bd713b2cb1c83d3f76b672f94da1e57d35ff5f4b5fc117084ed79a44d66486debe32217e51edd7e0cc5c389fd4a7c294309d28be0126b025a7ea1010d8f8e20308c0287abcab7f867d63b839322b9f1c3a70508cce797c93f461b9c70d3ba67b2f740ad63f205244fe2f28e8552fd02b6484a432ea40e85ff8b7f97ea81d9cfa4e8b9deb88b568afcc4028aa3ffd5121cbe39884c56ca9315be1c1294f566f62cc7a6140a49cc5a3097119fdc642f8a7b68e78774fc1724355bd332e456efc245824ceb741c6569bb7888033028c242d823c3af9e97caee064b87c5c0412583b096df2bd47ce1b47b7b2c06c8e0980e80d0d383f03fa025ad91c41bb1dbd9d251559ebb0446c016b82110616030ffa2530d86882dcc5b2e7632104216d073c90cab8716f470617a2b043e5542ad2bca3fccf47828832b0de666618fe2cc50cf343f285626e13f4fd3aadcce10f1b79e9a8305345c1b40330fc59cc0ce8fee5c78ddcef25f5fb06aa07a1dd3653717e464abe80922a10a1b4db558ac47e46236396b7b4619f495327d8edf437c041f349e234bf0dd707803aacdd1d66aabe31be8e996d21526b215c95ea5169a45f9623f94c755ff363154cd80322e03a9ed5af2b9a1f0945f85edb7f3cda43891677124430ac95a3b7f9a8ce49e84e2a5642143d97d8da0257e5cf67683854cedeba35a2dcf799d8729c6da412eee86ab0525bd64913bca18701c0418b639b89c65b02f8847d34d386a66fda22dc912db662b97f4a739f8ae163d4c58110fa93d7e21f56d46c6fc0498609af5d114258f216ad08ef11adb318cb2435e50958669e7c30875b1224c274c08c68cf4d6923794ff276ac12a8499d3b44452a1719466ec435aa3d7cf38df0ed8fe58b480d46e7d013930bc42c4db0a39025475800ae4ca831ddc4471e702d68f19a4dc6c1c2548e551ba17ab7838a57e0ea9b366bad757dd63da32dc4de347e79f2e97d271433ac0aeffb6c4cda858f167a222b88c478b54f8a8604ccdef21de294bcea36641cef6129d0751410b4e91614c6c3f87108b1268454b476cce8b76f1e06a8210573e10342b54fd6a24d5b936c9c1786533e87fc69f0d12195012d42e865d9c0cfab1264d74074a0157cee8de6f83f38cb79afdba066f18665b65e082e2978684148a9868a7bf561e82f0bc6f0de6ec62b081e1135c05bac0ba0349b30e9527f1c6be104be1f56a9a1b253a0e78da50430946c4d8eb64743ae2032d60f3606ee4cedddb323d26c27e447043c69068ff021c9ca316368e7dd44866c4de1f383927fa0e4d0a56c88cb44104ffe6e6791c042a09aa484df5608bae34d557a03485f11557baea06d166eeb11c53097e91ce08f150eaef4988f8fae8bbf1a9d7f4eb5ae9c6f0403c07f9a6a99a7668c86960891df45713d36311cc427a4f3f8fdb9537d8a37f86b2efe9899baf746478b067a493a5aae3045318ec211d8368f4fdeae9c798fbe6ad34dfcef77434f9d980202f84f190c3365fe889986a42ee285048a611658ff76b1aa64cf10b6daee439f0436e7da1b1af90fc335a3991ae8f9d7afdffa50f9d33958c8c043add49f12b28559faedd000c00b6901c879f28e9a8ba0e94a28f0b978b091c0fe17c320c515af2576e60784a4014efd1209d94f020346c13080af02c02cfecf104318b621910f80bf1a9a9a637471a0ccb575a60608828c21b53b3d24a15a523bd0c72f79858a15e4177b006eeed2fc7900e68683c9a9736a5c41630093b45e2fa4e3e7b6176862d339aa5d70da410eaceb191d4dd65351aaa1389da1658a05e8e8865f33022e63cf48ce6a8239718a4d17ffb952b0ee94a1cc301c5d98a4c44185a1f357d7d881021ecf5c8c8644d0544f22e2be534eb2f9f8b165076f91a0b9a0da8198a736b2c822aef7ca237b15407ac2c62afca6de87bad3aa8a38983d66033a85d9894e16a6a9674d94f6042003191c94fa9a053ac076318319aa48e9fe9c4d90b132a6e87f189b502fff92283084da88e949051c4d4496a00a4177111be8b0d1d12e1421f84a7a224b6b0543848628e2dd3bfe0cbcf1c911ec3f259634f78ac0e84e9337395baef44a2d142eb78580faf9f3364f650695cdbf278a7f018ead218c8f6279041158da38c35f9f0d8445d2f8a2566dd99edaf4963363b4b058010b08dd217427a41bbcbeb4e4388614ba8db4440128e8c9b9393c91349816f8f733842bec7f020cc98e11332175fdde916a5f598841832384304f687e1282f629a8b1c32d3c1eb01da03e6656d5e0a37c50f1a7a06d1c719e4f8470927eccd4044f4e8dc36fd737b1a6c6dfcbd6551749132a8d60a1e54a5bcbe9ecbf81570404220bbe229d793eaf087ab1c3354dc92f6a6b600e67c7a1b720fb8de2c6faa2ce4fe3985b5bfc9e44c2f777d309c81490c756407efd943a3c0a9d33d845404f6ac617cd2bc29caeff87cec10ca273a146744ed030d6d6f724c172f2087d8fdab48b92b61b9eafd010b676f4f4ff1d6184a1880b7aa190ad765e1f6eb5f2e4e5de0afcbc86ad663462dd3fa29ec674de79b46cc94519de77bfc354252a52e1b2737ae3c224144fb76725d9d3e852da295bdd2f6ab23db1d06c37f747003410f9cfe7600dfc5ce859b7a143a4e1803da728eb75a6cb3d8a340989b213053fefe19fc593f07356e2d907bfc1b89752901f799d978688c0aa1393a77b4238d6128e1537da75c2c80040347e3616f168ba554d91dd39ed10cbcec5dee6bcb67ebc1b28c9949bc236f68ef7b5bd84241d90fd3fca97ce47d50a8f682013a79e399a985f305e2538063cd3a2a498fa91148ac03b69164e2745509070295965e6477d50476b15cd1f115925eda435f9a44df924b9e926cdd1f6ff1067b849bad073e32dcf6297e6e84c1ff7ed63a6c7996ff4539dc6300565a9befc9449a1b1b7a0d4231856a4027c0ef076b266005c3f01193d4bb7c177c62dad830fcb6374aa20dd77b16cae2ada8eb65096a48d6b18f0da98adb8d9f70164d849da7363746a522297d8936ceaf08a018728236f0897c332d0c2fd5db5cb7c0bf22daa63be85f1ddda1a2e9987a13d0456964de90ff4679b8ba769e5a7e3c29eeeda5ef4359142a16538dca3181a3fbcdf79d623f36642211d52fd80fb80ccf98f7ffb24ee91d881286455672d2e694d60e012e6f9e9b1116774b7d4f1fbc4b942aa036950fe534c88f155dd6495a1e04ebb98e85b9d10a68f57bc0adc19baa3c7ac01683fac5038110b201001aba76ae460304420dab3e95cc7caf0078be6db9be438f83825b45c01e8a2584ddb1581bc59087031b7b603a0dd5cefba79acba7c4c2c89c399bf6e4a1fe1e25d89ec05e4c219152ac873affd30b7cbb4d5e47b5560c3d24a25d68fb1abfd489b3a58dd45c3db4be085d88eb3793d21e926893387a00303cf51ac3f1ccac964b9cbeda9f4adb834b70e8da9022043c2d8229668cbd3cf3a8cc205e7ef6ce3e54692f16149ceaf083af0018b0a3aca308d704436351e8d3e2affa075b968993cd736f6bf843477278d190f4f504d2ce40be468cd3a145110556f9e75806b141732bdebb381b3ba12b86b77d02a7d73625b5bc28407530f3e53873c86756f8eb2ee45e25146f46702327eb5f539c56e7d22f425ca7061daaa84e9ba044d295c1bcfc0a3f459f62925840d618dee8dba678c1a6209800fa7deaf15d5c05c6263e5722ae5a7f9fe5eaec13c75c9d40e1b37a0558a771cdd13998978b375d454715564cf7246f6a0ed1ca2afc81e09655be66245f6a0e61d90c522b24731bd3254f890bdf3bd2f293f4ec1dcb317e133f6e549f7b23b8f2e55020f9e4e87f694ee6549797e629d31dcb80266ca1acc4415e1a0662e4331c71941c08c287c02b01fda1e76ce4f3dbc89d38a7b211945928fa352ced1fcf2a950d92465307182f20dde45533641affae5fc405d04dcb8f76b7e0588d5c45fabf7530dbfdd9519c05a3e3da84c33321f01247d292b10512aba7f4b6caea853c6ccced8dfb4e33e3e83148484b758067aafc6da220204d42d532f867459e8e6d442e2eddd4a881071645d663aad8839e072e343beb2ee06cfebcd811fddadf6990a0e9a379b83bc84e6a0cf49a0958a58aa3807c506348439db88694255056aa663049cd5be13c8f78ab0ba2921ff1fc766b9381f202fdc6af695ff07e2c28f92955310014f9b810230023443214813ba07213f1a03e9d73a8898146f28566030576dc44e598ae72d3ef24c01bcc4ca6fb5209464ac4bdf6f8c81ebbdccc4c3cfdb9fb85863d67293186aad091b06be4426b6ff928df908da2abe70bfff0958287951dbf08a27e0fced74e8de376429da990fb1318c9b538c8a571d7d0173d6db1504a06bd37e00c451a28346569b3020a613f896295931253ac02c57bdb71d948418b6090c546fd315301ca0760403b5799c2dfbe601c652641941cdb5105dbc3704564ed40c28b84f6b865dfc30ba9dba98841e0d2c955c589c3247cb2e05cc0c87c6f584ffd17421609e937114ae50aa4dce2828146e02e8202c2b00a7a9bc44422955f1132da76aadd6b17940e95975348dbcd60a24fcc5b913d001912c47565180625499a874ca1361be0176e4a6c4d5ecaa0137f43a3ab271fdd87e4c87f02b4ee8bda7ecfdd1eeff4408c440d7473a1a9948db4004d19ffc799a8c40dc6e85464983fbf0197620116fe8e3a382808a02c0e1131584d8c96f54c2f901bb838f9ede725ec07882749513f822227c3c67234dca16df468995b23512f66a203d6f3582e23449cde5392912609ad47f3ac1ea3526497ff49fa22d4819fb00c98bfd00eeff3d64dea3ab6f7a88754021ed1df2555c8fdbeb669743be4228683bb65d912c93ea04b582039baeef7336707bb2d9c84ef2d7904db8542fc02151c0b9ccca5ad212562977e30b0a620508687e5d2ddc05999bb26c6931428f81dae7f19a1e70d6ceb70fbfade96612c97df8a374bdc0a1c2e87e30ac39feec5a1a89e0801f0d75e656034066a43f549a3aa0d33c889666523b43df7b5b85f0980cf911b1086890387016ad7e044419be22ddfc33e9cdfb55b907c2a10658af3c3236186f9718a2f94cdeaa1a665e223f077dcdcd45b2516feef1c17867c4e920ced94ff8a30524f430a35055da28bfe87813db3694d387da2b03c6407631c0d51b3620e3764bf62e6036da4197e2c50fe3a69dd5b7a18decc9d04eb320aa6c91eeaca33c8bc7f3f3c8d0fbf3947e19be246266343dc79cb73de2a1b109b9b17edaaf3c6bbdd58490d107e0ce4908a17dc80598c23e279e7767e0bb4541538067cc0ffbde37a3f5f9de19f1bb28b863e2a89221ad7589f29623fa751f6e27708edb6cb4b355cc1da6a1385e45e15f1aa6a66952960286faeebe9685ff3e8efdc92ff3e13b1228d151305091cd7df832584072ff72032cd96d67fb9b29df78c6ea4bbd1e27d6488a0828c910c44450631a7fed3ed850598199d032c7b986ea77420b067809cb5f6e6169fc31643b4a1a78d1e309e11ba8d633eecc7fc2bb20187e017a137460dcc2b493324e10dd830c7ac0b6a3d8cc2e6d03a551cf1811525636dc59dcddd37ead2f99277d6be9f00c5c0c41d2425910078355a82b213f16d570486aa06269e0763324c1326b0e62cadb215560c0d935183a88582bed6878895b8655850b59485410bd1473dc24ffe4d5b23c3effe77d7a84c4220cb7f7b84bf487d86b68646b40b59807484f6e1fc406d2f2655e1aea0520c86149c227d2e3a1c10a98b417f39cdc9ecdfc1132b4e6c69ded2be60959fc3a56008606ad6a28600c6669fc9df3f1c47a73749000b5ad0cfa3f055dc2c51e4401ee024b8b20413ad93982ed512617d6f2c24cd81e50d977451066cfd75b6348f2eadcba358199cc2edd963918cf47a58ff2317e1c3f98eccd7cbd2d54b73f269838cfa90feb547369bc31d78efdf751525cbc4f4bae85b9e56218b273743480e2c916236b2b0c9185b0a3081281c228c29de1e0fc705e9621600c12623f10956c51b04e1094043250b4c5a42857937206538607ec7488680396d4d1fd977b6fb8af142c4c6f7d83115f5f812e985bb29bb78cbc9d9e296d0867c4cde91d12212440ca6a6a06bd75684a3a359c8f2d9cebecbd3000e66547428bfc6166bc0295c11b309c9c68af04cdd1601e05b7ab621eda06dda7612d466b9d5ec40a54a14f0b343b50305a6181ac772ee9a910a3a6e35eb449c41721fb2f1ca692055c9092cd0b5aa3a63e32bd0f16bb8b0bb2a79ff5dcf5c6b13e6c1bb4ca33e81a6a6979f245fbaad3155e81508f4afe7a821fbf3bf341e281e60cd0b1e024bab7672885ed94baf361b9dabb9b815147d5da32b111ec66373b57de327a4b19458eda61db2405eacceb78a8a28381e8b08bd8d30cf270e8a9be86cfa7022758ba8d134d7844dd7357034ce866c168343a476c4d9a0536748f4c4eb03f8f73244bf761d1e490d883cd37e87fad5ead95e4c645ed3e6b23043378eb6fbcf6a117bbed431767ee433bd27d687cb1b0f1135f497c58e620f28381f9c302970739cb5e67762c76ff6ff60473a7a27982ea52369d938def8142dd681401c88fd66d1656f3438c64a39bc875b3679949dd0fdfa953582165ec8386b38fcd375a8ee33593404497caa0cb35c4cd853e3836e70ffe12ab4257f32c07e23b14f08e0fe90811c151ec2305672a7c6c0a60272dbba34fa5988fbb9f9da2c1e820a6abcd9617074114bac8a5a18c1ea1a05feeee001b023c00eb7345991b9568e3f2dd5a76ee3010e61a0e77a42e65454257b6e7faee127f62c5ea52ff1c7d4fc37251c6491c09fb3bddc729b5327196562ef6ac17e1c31875548bb4dc3fed13da1e76a50187c2296dfd0c1c0c6bd1e9c167a3557c89924bc65040b97407f44a5cf9c31aee770efa2359db3c54fc92e0b7e9157ee68012268fcec89433ff28b358dc37d42b0d9f705a1a8e39d2d56e5a8477e14440e129ca9ce5abcc886947754288c887949feadd5e38e818648971c057bc0eaf5246311a3ecd10f156dcb323d84e0c2fb3ead7ea49b395fcd1ffe0378bafa5ab8809dc3395a379b4ab032d776831bf492af89ddf6d22b32d637c3f4bfe1ef98f1f78aea537750f6c87849f0dd9eced7ada7f15dda3dfcd887008a9e6b1780e1a948aa2f7837c1076153b9a71fc159420cf0254778f533033f86bc5f0aebf026e81851531f20d20da0803cda925db6f78992208929625c1e2d669b67e1efed937f590e9eac6839ca6a916ac1259deec69e6302c26a5d54fb1a867d2633f61a0a3264b9a36a5b7960e75a0f7112ffe0efb57469c1539e89c7be9f691cd98a4f23989caf62d07179fdb6e902005ac8a98811802b537f12b41cb64a2a94d7ad42fd87435bef03536e5f7ee011ccfb3e90c3110b2cd1fdb8386f3711171c1d547a6157ef62b7cbcff00029fbac0c932c4cd27012102e4b9842dc5d3f4f093f67812cb0985a8810a85bfb4e74b89e3e8bed3d3dc6e7aadabb9c90f8096c7d1ed0edad126697e73db207a52d46b311bce7eac5bee828697b3ac03893dc4300cf4ff7feb457e633bd20850f2071eb0dfa2a3a49447d5f2e813be4843b3dff92877ebc3bd46d2ceb9b96c717421e14d26b22badeca22687f92caf57a4d9672a882c5648dcbbc4285ee83b258800e64b9723f7b297754bd3cb58433cddaafdc02dfab31b27fa3f87ea2eac8eac2500ff04d06ff6d7910f70c37d8f24f741c543630a76c695a1e1da1ec370216080fbf83ea216f1d9722c5c511db4514b4c871bc3b45cc9ce73c82cf3b0b43c0fabe6223e15b93f0085fd11944860dca476d54c5ad5f89417e78a0da1f257561049050af5a6eb9467f2f5e265c432233fec3b8a68b4b5a1d4527e06c497d3b7f603aca43f791fe31f76e1bd078013bb653b70d61dedac9f39632987e0269f51e7edd1d8eb1d371ab49c5a334fc7edaa82327f37e1f4a9a8d2836aeb42c0c4a045675381d4f325fae67aebe36e33528966e8cb5bad593f764dc56b874e73dc5e7b84f06dd19cc4c8222eca4cf201e292ef909368b21975eded22cf47d082c26425d8e8578453807f8b1bc50621d254b87e6b6c5b6d41747466064946df69150bb70853e0c458f90f0dd1c9ba7b107786af8949b8fc2cfa33396a8f3e00949982cd77184de67a689874695f9e257b59b38a969f423e30615061e1c14c6844d7cdef3b049f891643e50b7341f325170904e980e0a988bdd418ab41e4210e25af423c484147154851ab4b432ac22a78ccbbedb8f424da90df6f0a04d1c9308e13a8a6e81ebc3c7a4c92e5b1c740e9d00e5b97dc472bd6505cfeb8e91e0f92af022791ed6f7b79f20656387ded685d73463df436f80441e5a29fc603898c21206f6f0e8cc1bf12457174250d5455fd435690c73ecafedfb86171ba2f707ec8326535575e6635e16060a4c34728845d5011f6b6e3911fb970eaedc6bd2d15ccf9a5b157224df5c183848255fc16c8c3449fb8d1593210c34bef1090aa42c698d9298354c6db09e7cf71deb294bbd9850072b1a4a5e815800b7a5deb9e724aecd2cc93f0ef1637982a916364124a46ea329266ce0d2fde117e6a2313c03d8a6e960f9c50c21d0f65f16ef2011b9bf43c10435dfd09293dda1f4a526f5afcf17b1a96e0f79409e85b286889210695d648c142bf48653b00575a77cee3e590b995f80a0b132d4340f7aca3933e03e2e0d060f5ef42e07dc17cd6e20df37827be5fb2010312bfe420ca0576273158e3fbfde7254efab710f82e439c8a98c654dfce777ea4bb021378212233eb9342d97df83a59d76bda105314a17accdd785fe1f5acc52ef4f7b3f21f5834621d1a4a632ed9188deb2f78a27ee4b6345289a8a698b9483aad85061f610afc604382f3ce69cb5e0e58e5b16e10dd2d71254e71cfadb70d9e6ad63fa705c986a4a3c65098096efad516395580b9e4b31549621f9446458d280a30c10bbaee1fc7c9d5f37a96456b8f95f45c2f932dfee20dce217d0d458780b200c37711e529d314fc908bd3cddc1bc9b7c00a61549bd2460514e006f5daad45cf371669f0fa318d5f7d4c06b91aef32468ca23e5ec49acd0222398f5c7d45ad44747ddef40f3644ea3dad42a0f0929f9e3546ea5debad101d196be6d12460b2bf1c59cc0c0dba892a48eefd63756404170298f0534e623cc6bee4801bf45d59c4e0a781ddb2fe6c1263a744b216df3dc848f21bc756513143f3111f570c21d7d509e0aee1d639180c257c939d8b4d8e5143f03a796f857317f1abb467ecc3b69639093162c15f32e34d2254caef89711b9f1ae63c9f220c98eb69fa3a0af6bd0040d271d40a96521350264efcf143359e31fd77f08a97a84d2a42990dbcf09bac259157fef71d9d15d7b7412c66c25bf5a708fe1f09511caf609d10549f7412857cb5896d381e889837ebed1377e4d9056edc6a07f1c36df72c7048371a2372781ea53061a1fe77a53d774be91e6c37c6a5876fa612c25308fc184b771d434f82c6c2ae4877802ad079c8ca76ef46ce0dc38512fa12b71df7a18278b9b56df6d80f8ebe474bb4e971ffbf4cc7499841cd1ea1b7a15a269166c4d7deaba3b149efa8f0c2a668fe17ed8fba1946d5e49926b7770c690052d35b621e749575d7eda4c5c8bf34586c2664715ba69392165a7304963dc1d88bcb2f270fc18306653fbdca3b7868cefac738a11730e05c809d76032c2c59129eadae2032570ae8c2c36476700223448e6a42ce69a27a33e1e6e72dd7856df090a05c5b59e6258c7528be6340007bcabbb4959fa9c045682d275c836ce0e1aaeeb8de5773c14c3e9a942748023f8fce64298d90c7504a2644ba17cadc0c8d8f842527ff570b3687e818aa7247c4ed4a1dd3ad00318a394a24bf164d2cf7613b885e595a4fdbee63209144ad5d1c54a35324ebda5510d6d0e0438be3f44ebf157e1417bd6619922fca146ed90b92071fa52bc9276de303642ac289bbe799a2cd4b80bccee676c1350583623f9c7495b3da18a80ee6f5f028335125481a03322c3ffc5b0a96a2cda436601fc23cfb011c9232ca77e73e0ff48fee4ef91e1361ed33970ad9b973f925e6239299c4994515a94101a9bec9ea5fc0c5c13cd9121d8f57cd7785af9c53d4ce4226d661ae26262076e7638e6a2e9ba111be43ec1d3c55def2fa69255aa2bc0078b9ba6dc6e6eb803c31ce46e356a86534a1b5e031543c2ade4730df71e3c6b1ac874fe5883ee4767f41323baf6c197cd86664011035b0663786abb50035390e0810f2aedfcdde6ace2b345d985e9e9e02e9bc4f13bdbdd37196d74da75fca9077e08c363184fc400a4dd1233d247016f95afe373c665a8d6880e8190590afeee1c91073c3267337b966be486d123798f43798d07c4e3749354024a7b38042dd099984faa5cc237eda7fbc8a1b5d363f9e7e16e434dfa3c0097d81721bcd9c93255866ae1b219872fdfe620aa4970c01c1b725a8aeacd1e13802577d23a19900b8203effa509851f38bccaf88e3dd90ff2cf13c7d19746de2c63af52d2a93b82b94549047b18cff08c60ec30f5198a52aaeae64d4279890bb9c42c67c5d45ca7e439976edebae8ba99906eec59d48163c6edd5fa2a8c1efd96aa36deccde2b7dd1572b780ce06a9f9643e790708fcb9804af102701a49956776083e99b52a5e6843de1088f2c27651f5b458afdcdd31462e4a1806be8c7918b690837d389f0794e559d2f21b1b90f9ae4eaae6c6810eaf34d246ee21301b31c48e74102d4b21a97f7a1c3017cc45df99b9634c4903442833231009685976230cf96e9f7645031f1c5d69b947e6098794554752e713268ad55f560eec3f61d238d382ee6a86b4e913100848e7b3d6ac60c46178c8908e75c2c9bdcba7581e50252b6354072202040dcb02e61f85d8419349a5cfe806c04e700576b52ac7b245a64db6986d40815351ba8a7204073477d54539ec6e621deb1b9234061867df7b58bb007761bd5692199d93edba1d8643a530fdf44f8f32501f4cd35444b80259ba39d506e04e5939b573f7e4c284d9e984426798c622c74016e08bf7b5f3003bdcd0607fcb5b767c6bf5da65b095d1d9d42d39445b455f2a547e5bfbde864dc6d2bb02493d2ca6424ad707cad117ccdf047176ca2eee8d23494b02706f2a455fcc3e1ddec5b1b2ca34862f145d6299b9e94fbb234ebcb06c2d875fcb502b85c9b183aca0ce53ba4639ce96c672abb753748582530608562896aac434c98320aeb0022e086c94d11271648bbec7d7a6e031de756cb4ba1949451fba007ce8ab8231713d105edfd64845a3edf68a2a3cf666cfd98f3a6041c9f3baaf773bcfe68f922f23d03a4de8e4fdff0d4c8a3b2f9ecfecaf4972740d92fe85b452e5809e4109a7f800f4804be758738bd06a29da2265a2e497b790dec87f762d297dc7f9a5fa3720a5e2a6158d00ab4093ffa853f9c394406c4217af3d8be040391bfeaf02ba2d4055836ea9f84205dd44b56f1c937003b8d943813c1ead3c344a569c4523c7e2e83156cce6e4f58dfe83ebf1eb519166dac5277837bbdecb49367693f7b102900c430e8d6cd1707aa766df89d9cfb076dfc96f47d9aef1978f90bcd24109bac0a9c7e4988739919717b47f73cb768d516314987ad1351ca24f9641ba341449a127f8490c7743b3fa1734068602befaca783423bd8e9dc3e40d8c9d3ef365e7272cb9c512614e3e827e1bcca8645f981e04a3d471f0c2aececd98335c4eb5ecaf46e4611d0c5fe78c44203d579e4397414be06ebb4ce57abf8051c2bb25f4be0eacbd6c1c6ad58c1313b5deb77f4150994885c5447c1acd63cb59063800ede24228fb753713c7e6cdf74b61518ec621cbe50a35ec578fcadaa9788983fc135f51d02eb78ae0f827ab22a3571c84011e4b1794379e1939509f692229ac8103403ccff8628c6a66fa516e70df384a24a3272627b906a9304295a1a24a7572141c76fbf3fd0a109ee75f810b126f555e9ecbad1cbba2ada7e207001bacd3def7263cbbcc941fd1234d33bf8a219fcffd418a96eae7fb1079bffafe49e39966d29c3b9062dd70050280a280aa375ba3441ce0d05c30e0ca69b872c4468c82eef5cc7c26df222adab5e1914a56acbe15d2347763c4dc729e2866473c1b2608f8f802ae5f4412d18b91d066cd17334efd51fbd712e50e7e319743d92e5506be3410315b6cf287e9d27c41edf49c9fc2f49d39f560c4288b281e6d2a971c4805a2f10729f1ae73c1af88e9d68aaac340f3ee4b33c5a291a95da0ac87c65073e85ad02e635953e76b22254c3989563daa4dbb49fc05b128fa927cd0e938b96f6b0f846fb5400c76425d44df6b0924183a6dccce6d55495f654eec740d2ce2fcf79cd05d6e9e7ae6fffd5167a7b3d5ce07c81a28ee204f14c1b66c3fd97ad2591eabc267ae14900f58b67071f1a8ce30f87c194741ab884d4b8fa6e7385faf6fdaf542e14d061b6abe669b754e02ad83cd304e79e952e9f90a547d9824663d2f99b831150456b164ffd04b4bb933601dd92490468dc46cfa87b50e5c52170957cb5b74fd84d4c14533437dbd2937c8f3d1b90b9249f5eda33b2a84b9a410cf0729bcfc8046dd9ba00b7b2f5025f9f9abea0e78cd6c4036752005ed789c617be397c0d43ac61696183a1b17b0344d8ac4efeefd83641ff9b1132921f2a22a6eca42939c574e220be9fe7a31b617aade7be415c4b6fe73417cef5dcbb8a448e3361b58faafd465c82e818370c7dbedaaadb397ce34ce7f63234acda727d8c041139ef5d9ab889c06e56fe68da851f83e7966680373ee16bf30d1ca1c9d237573f70efc51b56f2201fe3721a80f0777380a9095ae7d47cbe3e5e46a4b0119d1d4630d296086a74bd42980c3b37d3a15b9e41d3c3f2036402a94950b8d8c010c067011d523a13fd0b8c33244b20793197830f97e8ed4df588e64130edaf9e64f28417a89a769518e3f5467d8fde8585367a486d300bff5d98f45b909d968af2ae70ebe362cd4adf8acc3f80d29c2f057092c04afce01c4323721799ecc719f2cc5426e0ed562d24ed8768006308d65a4e6ef6e7f2507d711a26f166ad1e19be5d2a7330bb748078e6543772cde52075a08c5d522aebd6fa553f6700015ae96af3ab602ab3a8fb8090691d71bb503e0cd560d529380a2f8f36f46ec8c71826113b8056b3303bb09509229ce2eb2355e7bbc05cd55c01ba5b167f343d4e6df1f719437034376e76c13ec628978802f914460821530dbc150a8006ff0416416d1eeb9fe2407a851061a3cb4a164f2f812ef96e2e9635a4c5dd909078f48b05d789814792350a5076a964a8aad835ab94bcfb2ee2b1d67ee2547a36b2531f9d837a2ee23da5ffa88da420d3bab23ab28cee7d08eb8fee2c21fe8d15fce03b559fdaa95adc4704f75376e27d1af6f6caec6e10c1724560e87b65d8fc318a087b886caa8c6ce0a36ce12e7245a1802b9db0f130a3ccb6461b91b66e1d23c19f19e2be1a1fa69cc833e3d5b8712198bdb07c7a7726d639f2f291690aab42ccea3dd3bc14ccc3702c3781f473adcab146a80ba7e880e9231270e9c22981bb1abfecf490f2873732e4dcfec39f89f73edeefcbb9bd36a806fa7a9ce3d8122e0dfcdd5585ffc6bb9fd37d99612467180017678b27c994e7838131332433aab0b544eb17333f9880e58c857ebdf035048e4f0c1c866fcd8cd98dfd3abc1afefd1eabfa7363aa102c8285c4860e1347db4b254c6dda7929d8c035d87e38f8128957d9e2668373803834195bb59c0f3f111cc0b3003509897611816f4467d4a12510257368674b0ac6d2d1f87c309e641e11dc05869902e760632948354c0564a1775c8034ecd8fe4d5c13c89d92f4a5a95ccc43c32334689d83156642149fddd6732faa18a20769c183deb9ff743766a0fed3bef06e9d8c3c339c7b7195d329b80f8e09dcdadc3b0c00cd1ec2e372024acdfd074747c69243938598997b72a596738f3c5833d10a14c409ac4da403b6de6379eadae65e1c8fe02400f0ec8e62cd2af73f53e34007908bfe67e6876bee853bed0c2d7fbac9db5de11e10e8f5f1fbfabe520ddc38292cea158bfa71c296f157d10b7c11fbdb9a7dd13964c592ec457bf6c1b71293c618e173d605c2edf48b805075b7949fd7104cecaafe7f23a2421a163c000e6b75ac669b6a7060eddfacad4596f67e9a89e8166e404b690a685942a257abc3908041c840f5dc1ef609c09dc9226951b1b7246e5bda82ee8015c4e3c7ade701c4cfce621381fc92aae7627463647bf551017b862d80b2079e4c286acc50752d7c64d83b144b28c887df61f83f7b9d7b34fb6a11af36a7a3616db352e16dc4e69b263e0180605a6f61713d164e7dffa2ae00916e93aeeb35ea5a489d72217149d1ffc51db1af3e65f9b267827b6acf540703864f204765b83a383b0247fdf3a1cc126dd5f0935525d4fce13b9af16fcdf00bba19d0e749d1ee2adbef484d726ae7dbb8151e32f3509e5a8be52fe6a67e5f5ceac8ce3b218578f989b4cc5c247a5497cc80f134cc98dad4847feffef2b750865f4a44a79af3defa06358bc81c5a0f665ccf379a597bd8834063b34f049c051f0a48f9c75f81c3fa8be6f83f7b381f0c9753c53f430a94ce3f5dc89095e94a09210159d2940cb81a501f18282d3c00c2b1acbce61317357035a76db0fd37b0e8e0d73f2aa05e411505ad3296efa1a49f433a9f8b679ba77d45a992637985ce5fa024d3b964599d35bf14523e913882650998581f8fdd53b7bbbf0df67fd1f36dbf4200e594311634e33a8fb2542c1764a94cd3f1024b3b632877d5adcf5ff2e33bb2a4ce5dbcc69252d689255670f39a265a3e846648fbe59e4da1812bbf589a85185e1e4eadf8988ae5cac187a4740a4a00a4b3384257be35515794303996aba8eb0b94640c79035050ee4deadb9fbf14be8608965d7e6fa660eba55c8ea58455e797816716388bdd58aa81581e1d9c6c8c3ee4b38d595ae75d2ffcee6cc7d59306d5ea9686d32c6ac7fd17df5435f8c1061a96ba7377df0dec7713ad67b794b843015ffd46817df08afdfb510afef9e9e658541169bc5d096e4f8185b3d9f34b2ce518ba12b0a0a98a18d0d7ecf858232cc2a29bdfb7947d8b66235cfe0d2f9572509725ad8f76ab6d244e8bb33c74d7fa8a926261898578afffab486c5a8a1920cbc0c7f48fa5f9353405ba796c4c59bba5e69ed0c77b8a7490a71abe40a9671e7219eebdf3618761ddbf6629940f5d49efd92d1567e874aff6577192e1e20d96851b8ce91d95fa608b59aab2e727f630170b65bcf28fe24af112075c313600e273b42c05d4fbdfafe447706009edddbecd92d26691c58ddedf1029914f707b49d0c7e8847a6761cf7d9fcbf2b3d2b38440dc7e6960cfbc747edda53e2e5ce759d20b3028f62bdcffe573da041fce9f403a73fd8fc06a45ae9f1332cfda3d07528483ccec4efc7316fadc9fb52efeed2b166dd7f323943237f6240af2ec002730cfb4ff8192cce3065ca74ed259c4a5ebdf1aa9e42979fe04c9f9186f8a53395b2cc259b21cab7f28f97839b17407dcffc6520e8e13c3384b9d57fe514892153101b2cc29627d73dc92f17c9e7996b981c6bb5fcad54f14544ce8585e1ccd8fbb5496b95f8ea51575fe1b48c1facc6697859fbff5e4b7622d7cd09cec76cefbdce75268e67d02614531a1cc5c2c00c3cd53434a29522277b2cbf3e867c5271246cc8059bc27c6ff50d24fa02b1f9f2be022b59d2220cbbfc5f47274b23d3f9c3941bb7d04251c9f570fff5e29c707ef536f6f5fea3c31661ee7b789eb80791d2b894096d13466ef50fae116b064a8bd7ea292e60ce5af959f14a7528038d8933dcfda3c0fa6f677c6ed59dc0880ee4593d14bd20d44c8034abe428e58200e3b4e07e365125c3a4c1c2ed4d64abd39fe2271f191b11269e1586a0c142f3e068fbfa90ad4fa729ecae9830c4e2a0640c901119b1dd3f569d51334f0473f07fbeaf088dcfe44aa8ffeed4f42dade6d6defbd654a2905a408950820092412ef59bf95e36e2a6ae42676ea987fcd0a6d9104ef59add7f1455ebfe35f231da9b01ec6fdeb856c308e548148eb5f0d58db9774c7974fc5fbb5e9785fdb8b45f6ad9f8c3a4617835a2d929b78a863b79a15ca623d8b0c9acfffe336d7b8b6d458d25a72538902f7250ade97287c8ffa1285d49728805fa2107e8982f8250aab4741f560dbd808a911d2393dd034cdd34d4e5ca3d529d9a4d261540af4b8190498d622f9888fca7fbd28755a8b5c97952957ead891d3184dcbfcd31cb11c7ce549c9dcc4428272248ff1298396bcb44b9576eb0858f51f00d7386ec5a32e573301e56fff6977773061e5ba7acd1d4fbf7b9cd0d5832dd6fe9fd8fa7cb55724eac15164914f867a6cab8ff2d99e3c89f2b6f0a3cc6ce2ab9e924fa27cb6d5f7ff579bf4eeee2de3892fd620a20629da70b2850d601bf8363aae8d63abd3bf1a652b6b0f4a1f3e4ada6e07a507b523f0c49283e4bb2c0d25d70ae5e59deeefe9ff9811aa3b2d6a2673dcab9607864a2d0f6c48f7fe5ef3e7beb7b9ca151812f52fdfc8e8886bab3a9f8fe09a3fff9c0d4d92035c6142bae74898f75bbbf99f8b7ae37ca357952b4647391d9bff5ce37e3eb93e36002c2d8495cd7fbd5aad5a7e9d2058cbe7c81fde994fc6a88b162b60bc6401079628b6a91347141bc4a8e2044818617464e48980ebaa47f3c0869048fce7ec635c73d50663b52c1ca4a13bea16e9079b76ac6b597ed6dfd3ffb17ea260ed9fb5c3236892b0961a10aaa177cef9731cf7dcbc89d117c79e05c8411a3a7fffbf88d5bfc78ca70b2dbffaf7e38872ee1c495b15b61c70585d4dd1f33177d7cf7a3ee64bce3fcef53ead70e35a089866e4c765d38617ea7c0a90537629893a2793db0a4cfd464ee823463ab66405aed23cdcbf9e7e7887a70a8c3a7f99d6b18cbf5c2eea74d24e7a3a26a4c15ee136f47473f2f4f4f4f4f4c45ac165f34508f2d3b19cd9ec8971d26bc4db8b8a8cb8c6d5f91c04d3f8095ba14dd4f9957c04ec4bc6c2e34bee52e76fd370bee4a43a9fa3306dd9c84fcb26374932689994829ae7f5f38970ede6e79bb03e1ad0f13b7ebbe05ef5e5d7fdeacbf5c27bfa65ea7bd697fb05ea6bbe0c53dffa725100beeb4b55f5d140f8365f6e18ce464e72d19372919e208069bb2270ed867c91fb551e5e2417a99cd44dd5b2abcc9ee2620a96fad3ac43bf4802ee553b74bfe2c17bdac3f72c1f505ff343ea5b46e0bb8008dfe6e773d1faa4a001a1ba83ec56875fc77c9bd135b6466f75fc6bc66e75fc59231d57a3af8ebf6aecd5e14f8dace38d6cc4475cc4838d188895cdefe9f1e143261bc79b9b221e2417710c3a1ad4c2411a8ac33c5f68a700b2e7f4408f28e19a57ff25483c7ff6596c855d1f7bdc85862a397342f3f8fbbfbe738e9c8bf44acd288a2cfb88d3983d05777716abfa1197792d0bdd77a64e067073c045d5a55cc3ca66c8411a8aaa1ca4a1ab5a863c2c92137111d7b64e25cd55bccc258f2cbffa71302e4cf47d2992fc98e804231d9bcfe3040567e191e73812035c2bb9760950558f64a22968bff89c8295e0df24cc7b215b917e9184794236365afdcb65f3a9102199a8c429924dc4202e9b2f7ade7fef9112e8d8fcef3f12c9f7de6fa51f598484c56a8fd514b1b096bc33bf2331c03bf37f1a9c2107692858393209efcc4fc1e7986316196069acc38c89ca19139533262a674c54ceea64a259483291cbe6b3c0081511010515496b506185c8369faef8418da32d2738c204b6f94a56e0b6cb8c888f98888b26516a8959c195e7a13e8522c3172af5e1c7411a5a5397fbe9e15aaaf278a1de74364d7ccffb8f7240c517ceeab9aaf7a8d023c511a4757e6aec5c401ce71ad2810e4966d46fd6e93457cbda695374b1c0a0ffd31fa47fd6df0376c785ae92049a07368443d2cf19099a5f846bae3a9bb8571cebf9d92b467fbad0501719c0913dbf5968d955fec93b4c02f74d6e1329420675cc6dfbfbaa414ee3667a39cd2bb23af3e7a396f68095cdefe9f1e143261bc79b9b3a4b689b47066195414710a163b396856a41bfce8185898d39c81449a941e807339c9ca63032810bd8b0cd0f9a5f44c953c27f437742fbbf3a63ee23d6f92fa7b9d3f5f9ea9c4d4e97cde9411b74fd9606dc1c6fbf880b0d9540c7bcaf65a1de07c53c9bf7419ac7396f728ddffb8e6942364f55bddf1c8f53006e0e8c5fc8c6c1980c7af23d339751ee3b26eb5f7f6d1cd98463aefbe737d9a36343fae74f1249ecb72aa900dc9c72fa8d9d9c064bbd90ad667df64bf5e725ae95e15ac835b0136d602932e809eb5d2f646b7dc94ff56d46232ef3478d4b948cac3432d3f8fa5e5ff9914d5aef45c1c5d1cdb6363e722ae2af8d0a4c88f8a81749f14512095ff9ad3c4e50f6c2b5902c8b687dabf52d92052ae0b7de9fc1704d7c90840d09c10fc9147c8e2a92b0f085aaf8ee9130212821be826b5b9574699e251d4be21af8fe8ce5c86946c60ff08e3feff08b63f30e7bc0cf4385967c43227ef81ed83d92ee4baee2af5822e910e07d177e378adc8de557ab165ab2ff740d5fc9970569cc344fb94c4c1486e2b4f9975d011c2f782187961578616683358688038b13ccc005980fc8a8fe032fa9478d5cd7811f82e08bdf755dd77560f8a2289218086b4722093f64d23ca8f7efc307c7f051230cfceec5073fc0358f8409f139e6a89e0656b8dd6e370d880ffea2c60d6850bb17c720a8efc8527c5415f7e62909b95829f01c552586dd97291476754a147675ca55ed5e04c92286ded6fa9f16c7adb416395b063ef8e15886155c7940dd87e3eae9c85246928b5860d05610c696123c31250d2b3b4698294c34f1a487276efe4c3ec0b5ad2ab24cbd92234e6b81acf1e5b2fdd6b80eeb5ec8c64c23ac23839ec8fc497052f33d2ef3a742a4f5ac67914ca810617d0dc924e6ad5f5b4d6bec7e6d54402623a441bd22e948781004c1a0158574640f8a4c8afcd1b1fd0fbcd072cd8012689eeec5f7c220dd8bddcfd0086b37fa252b7da91108efecfb9007e09d2d1244846b42f56b9a906d8420eb85a94969692ad9bcb0a43986f9fd030cf397300721c39025ecfe01d3635fc8a20ed6b05235a839fdf36c3cec7470ad2974cee56577f79ecf79dc8840bbe1e4f96acdbcf3e385c3a913c64304daf7c930a7ab39e79cbb38aae59d7d9a0f30954ac535253ca6112e76b95c2eae81b9f1c675d976d3915e3b7454ffbe39690059046aae2d537131b5eafe4777bdbc3e36fbf1989cfcf383f4838484c48482665a734fcdf7fd8acd7a9cf691412d6b1efeb2a696fdb5cd0d4141412eebef20252525273783b5bb50e88aa3ddec824aace1f725e162dea6461b47b7eb3e03a65eaee99a2e97cb076eaef9721a1e5f0d879439dee61182439ad55338fda2e1bc5a46afd7ebf57abd5eaf57f3ec14affb9a7debf33f24eaa5e7d7e3f83f8feb7ac6cdc904e893eb3cae75b40f67737afc78d57f9d2c3a6e4ef7aefdcf4ddfffff3a7bf84fd6b405d40b65ea946bfd03cebe9ef6bcc7f85333de69ae4dffd96c463984b580f2c35840f96171507ed813e55f3828c3564019f6062c0d65981b941fd606e55f980a604e3036283f6c0d580a283f0c0de55f981a941f96460ba572a9b8b621efb44ddb843034283fac6947083b036606ac0c1e21ec0c2c8491417142d818947fb98653f7411c1508ce19ba76156c9f5cc8a3cb870d0fd78c56300c79aca9a018f2f8555015f2382bb8aa495c8f41d5a0822c4a572a917219b0c55bd35d6355a7aba9eae69c734eef638e03dddd7dfa4ca552a810057e5ff85b1ee155d13b1557eb665ad74dba3ceb602b5c714e7e4f7dbb3522d06e8d1137519cbd3de7268b63753e3c9b8f03948e140c0c7b2c6dea76acf4517b2c4b56d863d9aa2cd095040de5ef242e116877bd15f658a26a099bbcb36f5377549b96cbc3707913ef5ad5a7e701de1d67556ea6288373644d76a7a26a4557a34aec9e950156f50743519c28fe827c7050b9055457427da9548a519d8d8eb23bd497025128980550f3fb52078ab5318efb262a0cc32f258221c87d29143972bbc3cd5fcf035e7bdd558eeb58bbc3fdb62af77c81eacf20efc8352b03d539540738e66637b64139ce0a6606413014c5102c827b0ed5302b9c5c5d8b85fec29efdb1ea643251299a021dc5b5eef751efe3e4b93bb3fbedeafcc0ec66c70c86a1ea5714c7109c4f43514ca552ebb33ee1d7635d1bf4cd39e7fca0542aa50ac31ad0b7320b6d6cae68486b98f6d150bf290ea4282b54713899390c439ff5f93c8e27bb9606fe82636a6466febedde99efbed6af7813a7f63dd73a4330bdd5a25d415b250f97dff6baa84dae898bc23ecf02349f0cd7d852b80dadfcdf7a156d634d4a3c859cb1a00b0566d727b567344f96f421b57cba5dad599d39dbccee0ccc70404e702991514951394ffe3242b6ea8a8cf3bc3d5d9a30a23bace89a63aa3b87b8116ecd49574ba144034a95a3e92a83841edaf7142055c9080e3894c9aa2254a6c51a4a589247e286289cb13ba064b047266aafd45eda722508320822e45ab03a031c598f92a1e5c50e77c51049a2010c185893ae7873039a6a001882f487411c2e681a21dbce8a104667070c236b788d7c5182b5ef05a633a890b0db5fb532038d9d2469df3514239989101092f2d688287343c2b185aa38b2b57cab4e171d183159f08e45cc596246abfb702038313656471440b370c31811821b87829c28a9b4786045bba0e04a414d47eee33439192eafcf9f3030105639820cd982222885a8b272e5756c0822aaad86617f1c60ccd3967915765de269c59dde809c5142d62e80aa96b00b5b57ca9dda16bb22b8ee93ebdaedfbd39a77b63db36842951ff393b6ebe81052ff3720d55f77b69d763ed175010d56e5cdbcb7d5c9ab85f3cd154bbb16d1bc2c4508f1501288e3ab67508bfa04eb2b1a06e80dcbc71df55ae5f0fde6e435c7b816b31ac9ef5abf188cbe677e35c9df91f1c4181f8743f7f024b0b52e234d6cf729f12b0d51db0b419cf0c721a025636aba8e556715b56615f85ee777584ac8f0adea880f551e1fbf235647d5440016084f551219543c2faa8006eb080f55121fc5d9df90c581f15c45f1f15549fc1eab093d599bf2387607544b03a4f5667fe373294d5998f1a39cac82dacce7c3074e18506aced0914fa505e356e5dcf9de49b1fe958cd04d49f9dc4e19dd5ff346c08bf3a3667681829298d6fbf93e3388eac586699419d6f84e9090f715e9a8b56ec6475e39b928e4dde99ab7a63222aba0ddd4226380ed250555db98eba0f72210fad0faab358d912d7ca708d7be73fd334f1fddbc969e0f753f517d338ad8e131f68a1253b7d7006edf74012361f7cd5fbb30a96d64a2b730e5f7c22e0ab3e0c1f0441f0419285d537013f7c262413f029c9247cb195b6581a3fe9fe421c615b288f112d1769455299af7a5125860f7e707b16fc5b298c25af96ecc4351bb826856b1ce9c186b0f7fc1b3e2bd95ea0253f59d2b1662b8b0545366c0a1a3ef8fc652bf9b30bcbc34d3cacc63e01c7661abdc774cc598d6d33edc5c61c015d3fb29556c7398d11e527929d3ad6ef914a3a46b2c03bce31e11dff09b23ebdb43ab4f66265fe3d3d3e7cc864e37873d34acd0243bfb67f3b3d793fa9eea4450f39f18e373bf977937f2bf592e8c491ea9c5e820471cdab4e7bb56cfe7c9eeecf95381bbef31824a863f3055abe3ee88296403ea0829640620208c00675962f0090250a19acce7c0d6668cc7a9aa7e4dad3b1c9415a367dece9d8fc1f24a0fee5acfec0a2fa0319c27584a665c0b2f901a87336bf6702f1118aa04125903abfd6022d637592af1e5cc3e19de93fff66699fcb98a8fb9f5e2d6d57c892455c16a40b45f29eb0e155bb4ded1f407350bbbfe7f7eb3021dcce6fee05ca53726af8e6b221a7cd5ce6fa977bd1cbf9c680727ecdff7407ebba19537297e2ee4dd445dd4c6cc6dba29621c8cc4736effa72d67abf3579531a7fe26a7ed2399d179cb9b499cb9c87f5dd8d7c1b6aba358d25df54d61804b2aaffebe9af18f4a4f5af77b97e07c9e465f34236a7a68e319a8e39f7200dc6fa1dbfb66f2ecff7dca396066391b01274fc8e3741c7ef209b5021f2fa1ddfa4f53ade841d7ff3376493d7eff8e5810d617df861de884ab54d35fa8b633f38864a6d6b7108aa7a42c004a46a2a5553ffd3e12cf62fca2db7dc3e8dde1755d4a79aeaf72cc24af007df047f9034a15349b6a9dca5da71449f0bde8229af322c0fe2e66aa48a92e8c9e103eb2695718202ce1d89ac4ed749eed383746ce74eaec7ebc97d1ec771eeeddd3ea7072dcd39df8b6cffb74d5724e8dcfa7492e3ee6eee35287beafebcf2c5534a795fcc1c170d37048294f2bea8650f85830925acf8610b2ab6320626081e5a90458b3392b095b33266d4fe2f748565e2407297e2846a2dc22b3e21905e389ff37a9c13a87a72b081cb819b64dcdc660a33c4e07094a6851b8090226689335e7448da828769042bd39343032102ae0b104329a617aa6e52192a3ea72dae5b6fc24227ca20854bd028e8ac8c119faa6e52991daa5737a98c14274f68992132e0741f5da02057cf8c0b4f5c4451fa2283d153133988f0c3d118226210c1a88896b9e53c0dbfefa3af2fc5450f438ca9e50c15658824246ae8ffba70401cbf6ef808081e7252f97b8b97289098b862441517b88622d6a1f28b11c463ad8227349cbc60caa2bfc8663e0cc005b8bbebf34b77e72e69dc4ba17a03086ee90fb3a27215dca5f214b547fe00581372930e989936d3b136539761b5bf9b3e27772f7dd4432f26bad44a2f247aa5ab345173930fbd5e942e7754ddc88b9c884b9d5940205808c3090b73ac183f74b7a54e212ddd58677b377073ca89b493b930ed635ef2ada93b6a4f23a32d3b6a7f2f396d1ab9acbf9b2ad83767722497f5bf94a817a457157ad443fde4465ff422f221bfbd5e941a2d4d2d63fd7e1a4da3398dd88805a6799bb7799bb7dab71b53d731754c1d931b21bd5e943a52fde95e2f4adde8fddb9b7b22a58888519edffc664ec8f8a60c5ef850fda73f2802b9185ace2538aa00aa7feafbe607e957ff0047ed9adadddd8d12817aba4a9c9b5ae6781748d59768a8be04461746b130548105b728b2a81102309e1c81258d21b4acd1020f66785e1835c1850e58d4fe8f8ba6dadff5194104214e967d4e41d41da8b8bb67509bcc93ea3edd9d6219aafe22b8bb4f9f63cad080552e003707ec8088ce110b5ec2dd4ba661ce7e4ed3ef48e577712c5168e706943367f053752b1d6ba48ac5c9a5589d762cabd31ce957bc8a6359c1bc963bbb3b56cb2277caaee54eed55edd7a00bea58d6470ac7e264b89b2706a5a1c88f24e57022203450663456c7b9e90c2d3d892d497440443bafd2b12b41dce4b2b6e2563c096f7d9ccaa744f5f7245e59580e85573d094fa2fa331a4bdbe50fd5e404c3f30f266762a62c74fcbd756f8c7b4ebe61a12533851d59b7a04bb83afb6eeeb7f6209f15c6ec6722efe722efe75b3f0f2d8d237f2b187676b39b3c5f8420efaa58f9aae1aa272477dd53a4338ff14856ea182b8c2eeaf0478310d09295627da444c9a0e52acd56e6dfc34bcb4c4db4630dc213add142bf7215a796f9bfaa7c4efefa8fc59af3e1846e71c1a9323b350fe7911cf7d33cbbb33afe44769c56a9fc264f3797eb7e39056e8e76ac9fabf89ad9338b2608c819b40c8f0415992be3d7d8485cab9e407fd0a73b143a85931e60a9e5575d36d07daf6ed2164fb80136adfb98e3bad7bdc9a3fd9cf635096326bfd5e96e90b796791d01030d4c495b14d9408394962d0f22d030a5655b4bfa4a852e1c1d45845af020c3ea892d42a04ad242053a8a08026c1eae1c0960cf2fbbbb5dd6fa82f6ec6e97f2bdf7fdd082aa1381bc005a14d57eae87d08593d3e3479d40ea8c633e0da2ce7f5d21479dff587851e7c7949ca8f367346c521668ec7073306296a0d497289ac2fb02c74b521362640893c64751481c5a00e49e2bc29dfc91cd27c109f5efdff79e0a918e09155809fcfb44f8775dc644f83d9209f9cefbe5d7e9cf6f42ff32f508c05d1f11c05d9e4e000f8f3174ba8b8718ca5b684911302b154397c7163ab5ebd8dd9d53dfc152a8af73668e636e721ccf919bfc33805bf9cb6512c9fc5445b2e4e753ce762759b240469dbfe37c6e1cb2d3c596394a26959124d933250b955b312548539770f5480cec994a2249b25710d5496260af20625239b24ced1544756bc7b03282dad44d0a43268514e64b7846982c4c54e9c8a0aaba49618208a10843a47aa22d178064a8e81472a12b31be339466f185d22d4760aa804f8099d20901460714153037746f80791252a12ea71414ba12e37381d22c3a255aa325e503eda240dd403f265035d0541121140af2d045a1600d68bebc809ae18b13518a9727272fde15df47e947bf0cb4608159f184811233f0a802c768869b2d55605a66b0e195e588c7ecd302c5851db39ed98f9e2e4337595aa0e3cbd06bf66539438acdac67f6a3478a18a490b2838eb9c1e5c58b8ed997a58a195ab39ed98f9e3046618e6cb2442143cd969b2b0b1137b0a8b8b5b2ec0003e5325493e586a1d5144cac2c51545310d1d927c70be2ac67f6a387cbd2ea9bb9117ef40b29154d2150e1a4a2685a00b98862c090d25225ece20594155540a516be2e57525b68f0a4704259e9acf8661f122e848084e4830c43b3af061942f892240594184200e382a110b4342561719221842d4c142935e63c0dbf242f450440012acc941bb0a0357593a63811c7d0f08d0e091aa2819282b296b8341414d359415759d0509189550e745249a141bb22442328ca07900a8ac2e1332343088672759384184a6da15fdd24216ea214147c43750545a199810c0e8ca420cc844f14553729882d46f042d475a8b6a99b74840d75d64db2628aae0ad0037f56cf7bb1b87608f3c632ac5e2a851a3fdef13eee39ac5c074e6ffc36ac1c9923c81c31c5f0ffe6b59a61c774b0c2d0c6d562fde732e71e519c2cd086a583ee58bd789a6331a7c56020a53829188b8501ca0bbb102401c0ce9e136ef7f8e1c2c1a9bc5289e10f08b23af0bf6775606ae4fc03c1a7a0ffcd37ce0ec7ef875b753f290ae579ac07532048b252de7fffe3a8917b8f14813aefbd9187388250f5481e1c37e92a00e1bf0662bfbef8cf564d65555a67af547536fbf7421fc5b08e6075f998aaa8aff6e851862e1fbddaad421fb9fa35cd47af35428efa50a8d4f88dec496c9c457f1e67c7d8e7e466cbb503a7c21c57485dab04f351774bcdf7a38222557d2bd7ab8235632ae85a24d066f2a84c2671e9005b352cafe3a6e3307926ac97fcbc41f99d270fe61bf7d7dcc1adeb98369eebf39e395b4ab8f720cd9a140ba4a1af445689ddcc3b5d9b1e2fa7bd5cc652b1c01d9e99b9fe5b5d336f561ba2c0540a045237fc81d3c385c3cdcf552290c7227b3c3ffae3186ca083c1063a1efc63b0818e07de6a75b8d93c39e19ceca1cd092d3f16b96a53fb7731283768961be006155cb130582e640557255798101526934b84569b4505573e2ab81a2bd875dc74671c3ecabe6a56f9e3b838c790ababe3e304bb9487fae6b83a734e9e1e18aec871bb24685091cc548f9c8eedcf39670772e114d9553db3dd573e99babbcf39e7f4b91a9cc162b15894be3e67d125ae53752cef85f341dc0c0aead86c9ef5beb0ae0fbf013e14f59d947aa8542a05a2c0f0f341b1667465fdada579b35910cc46c46c3603552b6e4527653daba6678bf434c839a52057e294946a5afc795e829482823e888562dd0405cd205e9fc501e2cb997477bfc99142b1ee7e1ccafc423cd26fa6c014ea03bf0f04bd0ee426e80d32c85569f1e4388e9b35cd72ba3b39d5eeee7ae1475f206aa652e0a4ab9f391de70bbddddd55ad787526f55d66baa2537ab7e5ae571aa8ba413976ec7d18a0c050fc5473ac9f010675ce396373cec72975d47e90d5b4f5b9e8375767bf8685026282dd386e8cdb20021dca1b6b2aad738a6018761c0615a82ece8d71a80eccae6bb55a2ed085f84270da7808d7c339a1725fb8a47293e5ad50b9e75f4d213e56d731c91c0b9cb373dee4ce85f0388f0b4195c8a9462a86e0d79193f384609a814bc7121db7cfcefb4017cf162db61ef362dd1bf99a39e75cde9bba6ce4698dd355c2ddecbcd57281aed44f4fec17039cf5f18fc562540958230aa129d6f49e8a4266fde664b29a2a1d5ee7f2fa3033fb8d08c47f33b9f599e17bdcf1ab2b6bc6264c04ea1e2626a0c59fd545fa8fdb5a4e00562a710cc7f5c8f93bebd1b1cee19a6c77fab74b6d2004e85a13c3c1805709cde046cb8f31e8bed74d62630ca5fe94c619a11a5940bea15123e4027ca195c4541ed34dcda37afe4ed372dc867ea81e83d151f3d024ac389298ca1efb52e59ae7f733ad2f1d8d3b31dfb8ca952627a3a35e6a26a2a2cabfae54d930a2b65a5f2302b56a9e2502d54cd61a662aeba908c4a2bf1281e88fba5a4387ba7a9508b4fac2226e55f5a208a4127fc5f854695c9921b845055300060ed44f149aa28a52e30b5de336c3a4e1c65253175c5620e576b37536ca258d21523cd280e1a9b678b5c6ebfb287f14e9466566031a5ee06c1857c48ce08d28c610e3060bb06823862fe238228b9287821ce240ad0f8cd11041ede72102f59411b46e26174d546aff4b0067987c5862630e256860a19902850c495fe8f0c433f3031bdf0ef662472d5d674851bb69046630d57e1daf1acc10e2833adf46049a1f14365c1f1148ebd3629b32cad4fe1a11a8afc8e911a30c239f3a9ff5eda0458a8a407ee6a9f6af4080e1cc151519642871060a25410fe00ce7178622908f61a676d31c63883a7f1e20e9c540c137972a51e79c734e9c324cf389e1a5f67fb4c8687acc34a5f677df3c8ac29be1fc428e6b92986ca8fdb387339cae1297dadf73cc0f5ca49816060c1828c1bfffd3b4eebb24696a772b5b1b4fb9aae532ed74f716fd5ec8d61fa47bef89741ec9848aef7bde33e1ef48980bd994f4afc0c9b1028285f648a15bb9e7a6bbf3bbc0bd0fb3b6e6bff2f9ef56e4b83ba4aab656a79fb5281c591f54ed71dc383c113811fc72043a619938ee48eacb2f35a2fe5319691ee7783812a642a57ec6204250577f747d54755502a076833c4cd483ee848e34d2b1ffc00c2d81fca0b8ef511ee7711c6afc09d2b19e2204a90541bb4740f7f391bcf78e3453ff0afd468e90b38e8d319739f9e38423466260912b9a281a23062e9cc0210639bce850c60e715c01438a7b0ea6108e70604ab2218c1c5078c0210c182930a38921bad8fa7f82e4340f3f93d8220da0d8410d3dbfb95a10b45d1df339dfdbba3c4d96429376e4dc0e6a807da17fcc9fbe62416182fc8bfcf807790128267d81a5ded44dfa42e947e5ea283aae6c7ecf9a114d3df8e2af2d35c29a8495904a81e083df242c6ad1fb462d4ff789951b59ca68a46338495058c39a045f7cef269374110f2ce5fde70c6787238c4b52f382db903df3eb83a42331d0bd4751aae3fa344d534b4f535d699831c79532367c61850ddb949274f4844b1766bc0004e7b39e8f4dff8ff17034f19d94b8ec47cfc7406eec5e89bb975feac5119c739d6025a43e7c22e08bff41efb21e569413b20ca186136d40d1818c6d522a5240650a1ce028020ddb7c252bf0c051c2c9c761024c023ba881e2745003e5ba2a9c26688b41ac30f4690c5022044548e1220d1c55d8845e08c30c1551e240a30b195bffac07fcc0065a7eae55c3fce9afadfbad79d69b60f3946c42dfe65964132a44e8dbfcdae69c479ad83c7dd6d8848aea9bd43ccb3ffcaee6594fa48664bd8a2462438263498fd4d05be3e73277d5d5b8b5d591afd538c436d6d3f14914106cac1f621bfdd79c73fa8ffb98e45567f83ed29135fa114ac2545f1354fd59244c45c24a603d7d22aca74ca8a84822f46b544f55feac17b2fd7838a6c0849b6b9b13b6faafaede3dd88a7cbd0a56807ab0fbae1ba75724ddab7e357f35a26a37a6eab73e2caa545842fd57e357e7f2a04818ea852a8a745791305155c53aeb5808a276a7bf1bb9914ed2b53a3d339f37a8aac138c0fdcd2999c8fa705d8296cf1d6c0857720957870da9935cc2d5c9201d0b0bc08596df5fc6e81c483b06110b6e40504184021ac0b82207379eac4041c593ad5fc90aab8314d45fa4ffa73f483f8b0185706bdcaa12d0ccad026dc7e8c7280896b020c24a184cfc802484030d2c90818b193560e1828d9fbec0007701b455b986ec411c748d38cd6362ba61579c991d36b6b523c3e519c14cd1c6b672b77e5e314c2975b295a514c0a183146d38d938f56b9b7f045682f7a837e1fb14d9a4ff7b14d9840a91fe8f8471137f8ff47e6d3cae37b2ba98cf45f3f936ff03317402599df93c0765267ddea0fbefb4fef931a7e54cef8e23aa5c1755ae8dd6c72bf70dc4d2b8c965dc3b1951397e62a28bd667acdcfbad720f0231012dd90b8f0d745d7685c11f729af81cf75c65bbe8fdfb1edca68a2405ee01584440ea3d2fc936d5d4770ffe0843b97aefdd94bac83b7219aaee07a2b3a834cd17553d0bd1d00c000000053315000020100c878442b1482cca43416f1f14000d71904278582e1748e3248751140321630c210000038831c6803255260e0f1bb0e8f5a57a22e1323b2ebea90d5f0e296cf79beaf1b36680fb70d52bc6250d1ab88fd0adb8eb103351436be676ab688e1c0db5c11de81d2c2d5b9b2e5e868ece20edd988804ad014013c9418f13492ab997afb931f5f976422d188813f321606d93014a8da3f6841ef4bb237d7f528a0a7da60d30b5205e800197061d6498f12c41c03eecbfa538bdb38c7ae9f3967fc49ebe84519d3b176bbfd97bf05696b176e777b0697fc7d8634f88ecc847054aa83f53729854184f019ccca85e967fc4df3080f4b2d64967e2295e56aaab1356b0b3e5a61fbbeaa6941be600e5c0165e7de4438b40552202ad51acc6ca02e39210d315034174f5a1411dc8fea627939736f4b686d1945ad8d50d82ac8019d44a1cc854767cb3546f2cf99df67a625eff5ea0540020dc74ca18202fa68ac22aa9ca6f04d3200d2aab547d94bb762a985952918771cf716e3eb2644f9fd116b4c033423a5a17e22edfa7a333a185361ff80d6b50a43da6900d2d9f58325e995c72ffce6d399a5bfc9c6020f474de46a92c19b60b0084313e5c52c9160e00f7fa7ddaf24f4efac91c12067a52ff0894dac54b36092f5f1d04a6d4cd1077f432ce9490bd55976d07eccb8e132944f3a2259acda33872ff561c7152b4add5e302ff589158e1f2d823dbc0c48a035e8890b505fec03e895ad611f2e7a71a7755c566a339b2bab9392057198cc0d9fb949dd38c55728abf7ec9e7021432aae2c126c66c20f9fbd3b6f480e4edfca5efaaaccb01d5151cd0d8373f3e56be4d6677c02d8db7503f416d591065da527bda81720c216c1da5fbaef622305d8665a5554d18152b153bb5f0fda30157b3923e9ab3dc384b71e552dab6df64ff14338c49a49c9506abd2f2c80c12eba3d32516bee9ed9705d96df226feaa640a41d414f39ba51524f2494e25a6e29be0164f7167f51f742596466466c29608fbda6ce3e58791a094225abfbce60ed87981516a37bac56973a2168151bd85dd599ce3a81c516549b62410c2cdf5968f65cdf246b130bc226820c7fa03fe6650560bd2a09e78082aaa41c94de854352f6a9bcfbb3cf2d2cecf343aea2031eceb280655c1f4205d4cc7ae083bce4ba6f983bcc2ceacfff036b7a6651678f29aa8b4840284277172b0f5ce94fa507b30e5c230fcb5693bbe2d77130d174d5b1f702538cf0d626605b4d33ee74bbe459a66c87fa232de503cdf56567d2b9f0a82a868b7984769d547b1ddfd82c330d07e7895655312092f8592b80c0535db74ff8b6860dc658042771cc232a8f6a8f16eb3792b37267c8a25fc6be5706e63e5d6471a9b47f598669ab748f03062d9f20c52cef7c96e728c5ef36ed20de17ef288d86589b86ca0cdf1b75209364d2a49c76b0a0252b23ffe6a78d5b743a8f3a71d825898435c05766bad38572ce19fe878f021121683283ab1725ff14daca968bdb6549cdf1da584822256ce1870c2d1e2af7a933895bc6441ae8bd6ca6a0d9f0bd6c00d436574cc6f926f0181e3a16f1a1605e67a48cf50ee8696773ca65b0089e1cff28cca338f5e84f22c02526dcf4b8692b8472ed240963d0e8f8f1a8c3b4d6d37f82180311e181a573c974ba65528d32e128922e503e8ee04127e3dffa011149027d20b9414c9d728405985f7678823977df9ee52e11d1de71aa05901b20360edf09560ec877722af994ca9682059a0edf0c48c2a2d15b187692ffd2d48001cc6b18406b434bcb26fc71deed605ba8719a04f9e8fbe740fc2bc059943ba638a1b2e2abdd07aca164a3f0197d127389d60e7a897b82c0ac8db790d3ea295b864ce6ce55c1aa7a5f809eaa24c950ad8ec7fd7234bbe97ff069bd170c6b1144dc4353bb887ad567c53b6bc1e8e780c7b338c2f81f5552fbb971841083c7dfbd1fa387fec16d0e6a9e4ead3e9fb778731408c6515229bfbaf6d07f35e080437750cf7b0033e91ed93421d989725074a0263cfd25ca474ca0a3b11f56fdcab084d0ef489b313f11e721dfc1352be23c94cf5cbf095815cdd4012608c27b149a8ae65cda2a950908894668e1857bd10885f39ba09abaef30781112d7b12a27042af4ccfd9fa8f77e84f6e56c76935d0c584a0a5a1f409018f4fbdb80688e19787810ef4052f6f0f1b300c3028c6d7e27572c5e897eaaf7805087062a840718891e59397dbf59d02f3d396f00a74a07db32e2875c8024105708a033fd7385ed12af2dc14ffce3650e27385f1b318a0d154e4df9337762f7571b21f7d9afd751cd76db530764b2cc83193cb87de0188ddf4dd4c5dbfdbd3fb8022ba9487f88b1bff80cc82de1f04613680118ae14a8b18a2d42df9a892b7de2686d1016195a4d68840cf38c9df7d6e7b3ce9ba45b0c249be9ed63919ca87bcf664a57b67179f6b13aed13f3fbe988235b3483261cbbd2466da07723516b1c4b8b8cbc01c5a1f63cad8cb1029948dfe36a8e02c71ddc05c9f8317752691f41e4fa8ee9d1085ca4c7413865adabfc265fab25ad6b20b36ca425b6e99a4e0d1ccabf663e80d7deacd4a531c8dd7b897d0b1337272d90e6b250dc853b5d581be9e9cee3071ce695e1a8ffc9b35348c9ccc5eaac94b7caafeb24d09d014466fc739e1ba1d77e2c23acd33852f4980f62e1ee8538ed2b1007bd0da9d66b60780b23374932e6b5682c81fa519ad2f9774b2ad1fe6c2c31abcc20bf27d8f669762d81f7d2c8b149840d40017447769e13ca72c05e478422f438cf0ab9c1294a684a9d26449dabb2681d897a2ee151d85601fb69f2b1b3d021c30d9fb28f1e35e369b5a2dba11a1fb49de0ed2f1a54f511c91b472f8df8af7e9e78fa02c71746ac64c30670f7e96fd127fc643ec049bb7a65a64f5e9c4585abb63370f2d239323551f6c1afdf6858098e3e01d1b5ffd2bb5ed814493674aa5e21ac8c695116ab70e989390e4de2d447f1fe262bb35fe8062d21a63fd7e6dd84371be0ed00c195fb9b5a06c3696475bd7f12a1d40af6a9317a67c9ccd7ed4add79b6d1d477a84f51e49f7585b04854cf09333dc3e35485f0edec69ceaa48ffd889ef6e32db064a28f94dd5f901c485e3b460c66c4f20198752beb32e543b955ff1214881739afd34c4aa35a76bbcff1a3ef0fda890ab3b2af614e5422f707ff153090889376cc9186d9b0b617ea2448c5706100e20b0d684b09c607f658f9c2bfac88deed9afcf97105fa7c58376c2747147e1fc74ed9549ac0aea7d20c57d0c9af4c49c5b8d93d0bb2c362573c784a3a1c4f60af700f7647bd07011141f353696135dfaa022ac48f40e4e8bb63b3197a8f8731062aab3ef168bb16cbed20573465550187c793a605babfe9fc510f132c63099de9a048790820a0cf3708ec10903b6dd1295ab983c3b5b87c80b14c24867257a4c925e8f9d3fc16460f3fec198169bb6c070174e6245a56dab98cbe061889aae795253563a24c2346fd6582311b8f473f32a37243afc0052088af108ba191e0906e5859c28fa0a4b3887da17b244d73e2868c7c0a2d70f873a1462f0fef6a5ae48cbaf710ac23af47e8afc50e4295d49b1eb3a6e72b8de94eaf3c4333aefb67f2852a3f14c5378603ea17148bb6b429e59fa471369a834be97d9f0d3fab5f4361a49b26ffe1112a445b9fb36b236603ea85e5454d8de7e9d814f2c7f5892be3a50af8dfa9072e9def4614af3d8425155512e96422fc27c04e90c90441eb182440807bc1d351053974861af825ebefcb47115f6582db706a1988de01b856d1d5d1a8c574845be81d084a0b32239cfc46481b33f782600e4434796a35bb933e504dcf74b5a61c4d32b026f11e404a9f4ec07084794715d6b31ac681cdd2755e1f6da19d372567d3310251f2e468f60a11e7d18e4ad529bc1be45b4051ea911a14a402a72d03fe2b6e85aec94f00ebae699eb235d06401011250270bd46509c5d187de0c2c6f6357c4c4e5f41a964fd3a5e8815ac4adafc4913e6a58005f02f27862952e744aa834c5139e9302d791ab07cb514e53292b9b2553a8cf915369a6625d7635d0565e25da248b6c4aa82a758aa40d132eb31069c7800d09af6f8c2d4da11836f4a34f5ecd0b1c7f743ec94cc34d5e063b37891f871a03aa424b8442f84e7425697c2d48a4485039e8d5d7102a965568d53c5ca541e48744798397d6d3baa951e2cf8af556f62b63f503ab11c7ca7017fa9059d3662042c877b6c4ea0298a36627db1d0993b6ce82e2907bb222e4992946bbb5c8791ce8fb4d4046c6bd128c7775d92cd2857b8db6a844e5ea6e773c5a6d23bfd1570000ea4ea60da10b6b4097da2aebca64a1b80bb751a13d524dfd046df4a32065288eb6eef907970d1f514dabc4107932d8c9e8c8cb339a27c2fe82c2aeb1bb9e6fb080e5e0e5d5321dc39b9d12c88853de2e4d05eccf386d4c04c3819df41f309940273a62c4b3a301cfdd1af39d3158783b13f77c0ea9995e04282931d3670b71d2fd8eec8108abf08e51021a27fba5ae4589cb8656e0cc9c278cfabe13c00d4df9ab177300ea5ddfa6fc7843f1d6ec42ece3c05b7be7a5349c1a924b90a8a2d9b8b568512cded654bf18116a90003259ef4484b10902a58ad68799ced95976c3f9b2586f3a7973ae803e94f86c421b1154b78ee9b51823362852e30083f25f246be29224f38138d699354b57ceff42b417d06fea4100fe033f4d2ee20f8d768f6a59e6002cbc8c18d0c76bb7b94ddfdc89d25e373b61c241e63166c49a303265221d223e0732aa32e044b8d46718ca31e9a47963d16117fb12d72ad6d5e46afb5aed77d977093d0d4f3e1c31717e898959c11cc1d831fa69026e4147ccb416f021f8c5e01ebfbcf0f0e497a8f4b7135bbb48077e9e93c4f33848de10339434175064d295faa40ec0a48f52860282d2022d3cdf923f3ca36fdb58e0641fc36877858897a27bab327bb1c9f62dde43519d569daa974cba12052c253e19bf07047b9c08c13761d9db78001609bcb8b3ddd075d1d2f42cedcf8066cab810f18068f46051325e57d3167090ded2456877f3849425d4bd74628b2ad191330e2ae6b695ab4699ec716554538b666e112b6612023a3c1d1b2019e4818f75e73543cd084e2dcf3fd9cebf5dc2071cdb401edc746addf87d312a4ef77edde6266854358caae27448682125fcb58881ac4dc26636273602adcb4a7aa0346236be842b301d862429477ab7f3e1266e10c8577a488aefa1e8120758956b282252b6a1dee66c7cb6e8be4f2ef16e50852bc036ff1c0bbeafb964f0830835ed8d3d323300f59890c7af44ce3e6525424e7e611c0389c2a1d0b4eb3221f6c9d41c0bd79e259799cca7c4a81464ef95befa0893b0e1f4a8326d008ff49ca52a9202d25ce67a14032288fe75b2eb42070b0dbcee415f1cbeca4a472a45c4f11ad99fd65376b0a02f4feef473f38396573228dbbb6a5b94e837840eed471064d2a0b60a3cbd214df550aae648645b020e754086f28b07e69868928c409147154dfc4af628b89fd1bea932564d24a8c390672b88e5c10844d05481614bc67cfc1784b2ac83253355743e1313e1aa8c4335a641711a1e412d43f44a29af38dcd55f14f5b2c7c6d11471d54dd906a515c626540ad6813fea7fa44f44d321eac43cec03b8e971b1e7d29668c19219a7c3dd49da509669101af7abf9fe0441e1d7f41cd70ae9595063717f573d35bd45e6add56c708f1fd90e0225f258b388a4fb3e367598fa8d68deb4b8e3e316a69975455d82230419b77d2228fa0cd38feadb0a1769e3de7227649345439519df16b3049f8ce380964b2ed23b8fb8e6f07055115520ee427aa82b0eac8432250f8e82e68a1ee14f2f63d06e482c5266307292ef17e7058be531c800b7535d5314b2e69994a84f23e5ad44bff7d83c295bf397abd20339b7601860e97468faf5025b00f8a09f8fab158b71ddfffc8c40250f4a5e2226f4a2636e9cdfde29638691705750d8ed430c04e6eebc1b13b81ef873162a4350021075effd3ffeb5e6391b1011ea21c104cb46830f137f27edb6ef240793b013e10ef21648b7d4610b193caa2d058d728ca5516b6d1e6e975ce16587d9f93ddcb18fdc6270059eccb8239ce2cca2ac6e37e0e2cda19abeff8dfb29e1c0b0247df31c6e38b0810ee2d3546bac7c331b18974b8b1414e014ad403008353d3d295622dcf65ce38ab32fb506e4c5356bf7db36da9f94faa584fb46150928a069050bb2223fa301a8f2a59a80fd4bb5e81578efc7886b989f76f664af09c391f0d3325e7a3e482f2e64e3ca92a003b83d06d1439e06151ffd737a59dbbbd84993afe18cd79dedcb96c48e46878718d6a408c3805f1c20aefe2dacc0cbea228034b0feed6fc883150197de9ca45d7012b61468a9f42a79469b53e530d69adf859012bd133287c331ad680bf12692afdcb9619bf97968cfc8953b3fedbee4e253f56b2260799f00df40e50299d81903498d145924f8ccf7f2eae4f00990c1010a87dec66fc5f146853772b8117c6cfcb5259bbcfe32e874987f8e10d7680bd26b2dd1397421335738532958826746cd1541ab44da5ca722a59ae53097d5219af50a998c91e1b2062a2a966bd1e836dcb60447336d0a00b888002faad19f85364d41bd1f6b99258d76d88e4dbf437581989c2115873597fb7b9da85e4a39705d215810039cba18dd4f960bbd49e933a283bb339dc29f07967de88d79a5114213f346521015e57e6487920be6bb3fcfd29579ee11a7136028ccd58a0922e0366bc1058d55f384c4a4c062c0c12bf58bc74e67b698c63107acae3dada5960f601c97a0614b39801a40dcabdd731ad0441ae8a0b90ba5149151d15df0841be2666f3ce626b77aade49449fd3bf12c96513ce7e0fb967b7af78af57f36549cd1855c981df0a78b0ba0fe4a4e4ae1ab6063d613e122bb872abd3e92a3c317cd7751db30d35a83934e8aa5076fc68125746d1ba8f3f7e37757ecd44bf3f2ef01164661b7c68b9bd356e94112e9e8a6d59a8cf41efa0e047d7148d8277f72212174a4ed8294773a09e3d819b41dad63dd9bf93f7220801c0b4a0c1253b3d82aab27f9371133ecc0cafbb7c7556265cd17f54efa648a821164f3efa95fc3a230774619dbe459388154b3b47e8eb1fffac11778e7115f4025aa5cb55efef68f8121aed2f4c4a8e660e61e66e061947034422ce299059b511ae398bc58c54585653554383a019faece6b143effb3ac6a4c124b33bc7850f2ea1dfdfe41b7638bf371dc43657c70bfee8fc1481611b245f0b77ff231d4864e1565a3d1a2271d852ac9aa001533f3a3fb2103091e88bff1a0b1d1e276e21be0d5bd63a986b9ebdabb99501747b03f11f25a2172d3a036f910ed98f18964add16129a0be7909259a96efb2129a82ec351a1a912051467733828898c22eab21deadc08952cc47e9128c4a4c604cf0652b6930115b81516f58637d1c63d7042217027726433a68b07c3ab918a12fe88584d275c04574ff7bcb784b085683b3d3884c8721ca18e532c460b489ea8cfaf9218970a012776ec501c8f5c1bbfdcb30f8deaf366f97904bdb3e41084f91c7fcf40326f8b29e5903eded6d44a716277ede2b4d53dbe0ddcf1f0687d717155362892a8511d1df4d9e812d7a775f53a154a922b8983567186f257868ae2ffad9400f864c06dae39c0c1660499f0501056861e71769b061a4fc97466481df5fff08431f89aa716ff89c76f5b73c18aa81a50fe2910ab420ca732ec2875bb1469d368d1b35437f8b2bc0d4345d9b5058a911c665e5814427a4f5972aba2bea0b4bd46e6ffa48a04a178ccb259b54bc24c268ae0313ed0bc581e1345b1f645a5e171f5fc925d7611140427b6ae22605adb9d15fe5d0293c8e8b9259a358aaa10019561cea78409582860649bce685621bae675c26df93b24173bad9761668373cf6c6a4a0dd72e2700a9d7114f224429b17ca1b0e6c392486451423ac2dd7c8d8e70a7888e7027e70325493a402db65292a6556a0bc082cc247882b53b9e4c0e07a8792c5283437a6c68fb54874b1e96d31a39b194aa0ce78e5f009642304f3225384d80d83e8664062c46b1a862cb4874fa6e10a48df4edb62a6e2622979e3dc6bb6b04726b1c48ed88c38badea22303b017770a2a0f035f214cca6017781c5d0d98d3134bcdc6087d0716e4ecc23e32bcbb155be8c4b0febbea14140c4d812ff60f53d89da489966d2618ffd44ad8f3b0626d3c5109f49d5dd52d128c64de8124e6a98e094acdad3ad54c3506455c47183dd8756b552aa3b9e84b659e481ab845a639e4ba05220f2aeaa903352d04e91357a8d52ff49b90f3849efdaf85ce8ead80d2b184dcee07a3b36b6f5357ef70bbbde7530e2f21cdbb4aa80379cfe0c46e89f4ee37daf636b49ee14210346b2a4880da10bdc8bbf8d9e230b145559eb2e2fdeb37d2b4329146faca81018daec2f035af43a866804a2a5e80589dbf9a0e0451ba101b15e6e43619d71b2553b7a9176c2ebb13d50b8b160edf9eb13ba2c2a07b4a95aa8170c2bc98877c77a55c66e776aa1dba8cf81da819ba101874432f6da889b29cf0e0596d43b96ebfe3d72825e564ede2087722d6b305aa6ac5437ceca6c923e77cf9d881c978b20e2bf8f189a05b9340b821472d3f9bbe5eb2cf05c16a6e0d591e175665d8d83ff740075c32b26c348ffddf6ee35f02634b70a88297efe5219414d5044573938c48b4e01d485b7000eb3440037e257eaeab57854a501250400a78a82b0bebf0e44a3e40b41b64495e0f8cd5f9c06c147407cd2b96b7d18ee7a144909f96be74acf392230563e0edd8a839636c32d016b8852814faa1aa49394345d8bbd1fcdee3b2560b705a50230dd5484bb96653586342e9b1416ca65b3daf3bfd9f0004d5c6915d3dca440abba4eccd53c5c4331dc560d52ae4926d4f7d464441063983720228fb873a8805c9c222ec90e3c92e670ee1ba4a1fadd7ec92fabab1a54979d948236ff2d24421c9d6d18073070d356d662c7ad0885413c64b5468263c241e20821e00218cff499724c86b0347b2871257c925b3774837cac3e7a4ed5f33d0675ea185914c4c29271df10455ab34f7bf986e91dad967cfaf035b66fee386f8aa0e66e037c5450cd966fc656909effd0ad8a4bce8fdc9ad19a3f541dec4a569a88bea919f6ebcdc655ba5ebf0932c56908ea9ba7793754ac56d32416de90d0c237557652ee9cc4209af4a3248ec8d153c36a6e19d48876e6ee4631c17eef4329b7707998a82f03da11e3ddb8b716754179d3ae051cbe03286259eea03f3d3127cad38a541b0ef8e77c5da3594c7121efc2e59f7d887a20ddadc5948c35810569e7806a44763dd0cec18a8c0ffb8382471965672702414b11b712f11811469577d42dcf1cde94a2de980e658f9e914ff298aa09d6e83656a70242513961d801e5332bbae23de9fc177bf26d4c753eaa1d9b1be7fcf852b847c819cad5a5a030a03d1c94be02b205a0dc867573f1952406d036059bdf341c75154707cdeb18392eba87792743d9964d1ff4a505f5d7802c24c281004c99578b2192f2e51049feb2338c67d14b681e9f320aa8456e8889f0c9765bd7f0b395578c6648d4503af9da8bfa7265fbbdb433ac760c70184c6d5ae5946ead2abb260927239eca9cee4c58439a28b23c5d5465fff7bf4d9bcfbea467a40366096c65c8ed971d0cb8b4797502d4cbb7d97f13643b8905a5be34ce36526acef6a272e6c08e16f96af4dbf8044000cd2b921a5e960151fcc911cb6f166c089b59a9b0269876c0caa2049f35f85a2034c535fddf2c4c6d452b1e6455693e5c5642f15e13ec9d0c18974e2032977d5662865c53619f148c3d7693f384e0385f1880c826290c40e2c2937577a68df645f88f00756fb62e2e670809383ecc121c2779489b099bc7a65a1354252f816644ccafabfef7a5876a52b048de21d044aef5dff81d471f991f6eae0b4e7549f4a6fab25bf21bf3c8a359f845c84188f54b28be8baed6809674a95a113910164e71a86f6555ecc7baa70a1e829cd776490ae014add5115420ba88cc73f6eac4ffbac2d0390573ff98f972c2dfe760accfa47b391b85ef9fffbcac56725641d234881364f40f50829d3917abc79a242a73c092ab4ad7705d28afbc8a66e4e9cd80c0f927bf0c438a1419365933e7a6424085c7208fee10b16c0e768d23cd4b4deb70b14a47f90944fdbb480b41cadc8be3762de7734427d2c68e022856d534c40c5deeaf741913a24779790a8a09f05c483389e0d7e19adaa99c28d53fe8ef4a943c934ba86ebe2c224920bfca23f93b0ed1ae845837902105df92253a6b2b95803aaf8be51f0bd2c7a447c93b53727bf71e52e84dff5748a5fe6a87d17700ba79128bb0276e14b16300637c0243764b5f4dc592628f1e788defd1616aecb94c93bdd4adde570fc988165f963cacccd466b757bf9911c80ae3e7cd6607f457af83eb26a71845ea4448701777df9c068fa02d6e4a627e4d4a67ee98c32c4b58946d5562931645e6a25b7a51b8a26b553c39b9a0318383472201aeee0d02ab1d685f4796c10e9a270ef8297000d342ce8d2ef159e981cabbbce5d5d6baa8839c64e8b2c87d4c6f197885c6e3d58e27cd23f81313f363417221a318a1b2a7d6b923076cbea21ee7882983ac90de9fa9b693cd1bbc0ab3975d8ddefeba3506a5d3e50c6df9defc086d3d18b0ca31ca70e3525471171e682cf047e8289720ce6dc3dfccc8f6c0680f184c0826743015bdd96400f1270ebb30af66a9dee0bfec9b9460c24547984518abe2b902ce4be183d2f6bab3621ceef0e8b80bd31ce21a2c4abb925de4062900e1ac17744f6d6bd3fd0d98f624a87a0c46be7a832bb3aa9e00137b72f5945f6becd9cecf7381a5704f9a622f82abb66663c38ff44ff6d47ab6df6dd96d8663cd4a61732944904558a6519451ce48771b579c8082e6c24144dfc44f9755c3f58a61caeae9d81fce2072c2b7f1a5f356bd54f033adc6338aaf4a3e4c1bef3a980e997180576bc9163c0568f5f8bf50b72d9f55c9cf138282d4053cad2509297417164af1435548bb075c36557227277a82cf5fbf6ebfd5561098655f9f309da5f77f46af4e6322be243df086d27bc921965dfb1b064995aff1000af6698c01511ccdf9298544d0f49202d17354151053952ff4a0cbb7b48822cafefce96d6d40b2e2d5345ac14611b51accef3465739976b706ed5db50664a4bcec29e29112a3ae2accc7dcb779f8b07831af8adb8478e2102d775c9ea4f3a3f74fe444b737b80e15516f26cc85111430fa7d09bab23d8236bf6add1080c72d75998db8606c0b9bba13cf545cb47a2563bc5b46caafda17115b242a75eaed7cd28b3dfb87f2d38615deff6b841e0f5b1861208a82f65d556e9e4840555398936ef963c7eb2e3fd79d5d06b409f846d93227e21934d1b3d04852f6d0d67df4d016e12a09e59eadb25249b1d646d02f12c6d167bfb2f79a21f865a737f848b1bfb2cfd9720bd4ed04cfa04db6ce876cc202e5560b1411c7ce74522ef98dd0911f7cb4a378bd4a5f8ae24dbfe0ed945f755d8fb5fd75b228b005d1925c5c02bfc112155b411b54e25615e04e5e391d5089d557c632f0f33d136a19a40d2ad3037d48dcfaaf59838402c6fa65521cf0eee07b2d5295f34cb62acdfeb6b1ac08ca553fa0e3167adc65c23b856ead87c5af8f172f6df4efa2f6faf8cb7224d02b09c829270e6bde7bd7f4e9bc1ae341b702d5bb2eef18f8eb3bb0f2855586a13d4c4d2db902ef61d2b185c268fe4fa22bbd75217d1a6eaee3b398ccb200f843efa8bbc3e246a5eb1acda9a1871130413142c064a46aa3b3e206c74208a8e630d5a6d3af8c4a03545227000636a46100a2d98351aad9bcb9b281134bd2c32753f1804003c82e750015047638df24ac14ed25bf2c6004e27fcf1c1e49253b9f6b863be7f4830d382665081f95694bba68059cb5ea5a01da106c77cb9b03cf24bfd4f55a561aa97563b0f8721f0cd50d5f0bca468ae7f62b04973aa9b514bb1db8bcfbe70316e03d597147dd00b7a56edfb6981863aa31de6b33e39fe633bf051a2df903b0fcb543ce156df4197c3c0487d72cf5ad2d69cc45fd5fd132126188d1b16b01e62dc7e5cb95f4920424e9cdb6da01507d5072ff76b15a19bf4cbf88841282dc41a8dff3b48a4ef69b1e16824a87b578a88d600d3b67a69f2dd0fc9fb9592b7fd4d865b1aa20de6586a26b1064fe044c6a1ab57f0df20f54546ad0cdf122cf535319b4507678f41a70b28a9b5c32cb019f85e730cd968bbad345d834ee60d138f4ee65297cde8d5952fd95398c2224f92c25b27cf1fc6ee043067f2a5d8ac873a5684b176b18bd5978a6d43afe6f7bfb9dab232965fdfacb53bcc457a4c04496c5ea362e2acd733e617ae61edeec3823c7f5c1f8163e5ac4df2fa0cf6e9cdbe2dba6fa8763a0c4381a549ef3385327ae244591077dd71ff5853d073489d853932ae44d99cdbc3d285ffefa8757401323b64ef8ac35b46d597c9c75e3a829fcad8293012e05c116a0aa1dd7ec5cb8aec871c6c99b999bd45aa2591969d9cf06cdc1b3efc911b8182e446c1eb9558e01fdcad54290b404609a81c68cc1c5bcc4355576a039345298d665441d0093a67a5994272aa9812dd8c196b7ac87b2062193bf39eb3980ab822021576670995959210fb5208bd041c36165d36bd31f1c00f64cb7c9193db9c4189990258420d0a985532d0545cca74fcd8fa7cb07ddf435679aa1b7fa19c8aebee6f0c891cc5eb1a65c37fe822800c820f4810c484796d8fef8cc174e54a436754efc88b34e3b10c8dda869e37b84a19a5bec99dfcabc2f323d8a41ada9e774d4c55eb4d7000ca547828ef1699d23e1e98ac8901d16c0509006e2561e57d1b699388fbd10100b9f80ce5b029d890e59278fc9f40cd771a42352d598cf3958d47a9647050aeac9f29f8052d7fed8961ba29a929e51f8108783363728f5e6c377608dca2b00bef38969cc6c80e1ff1b6206d54403f2c781b6b14442abfa4c1fc5f5fd140952827a01a60a9d9fff073aadbdc5951a51922c39f84d782b24746b4cdb1443c3cee429c18d2bc11e2ec11ea9c0c50f99560c24ac17f78eaf68f3aee4bd426f5fcb3fd868cac36794dcac2cb94686d8c58f7b4bb5cf12abcbc76875a0be7671c895f8c50f987e0d3903c397224f7cd43540c359a508d6108ce7bf19eb33ef1e4526e6bbdbc58f0051c91fb75c8369728237bcbf0b1bc5884ec08ae5ee857e3175450f1b3b0a8899b2d2101417767c9994a00b55d085d79bb3a52f80e8f8d2d6104dc28aa080b96fa2a058a6c639ddd883a91b2c26440b849976c73776fa518be4ea823461af823c105cfd3801af919b3e662d4d84cfad18526222e511599dc0af3ccd3d83d0dcb8b2f53e8967b9964458a7ad8b6893c66cd7f51f9b33e36cca0c0a8b9e300034920910a92d01e6169668a9bd092ea8d8cd9db8fc27d24d35191351f0b27efd77b9e4a660be9d7063ff35ac29211a52ded52159d6af8f2b21d9bf15cec4a2791c63263429bce0a8d9bcf89e07e9b529aa8c8d98a96da40966634b8e190098de5c35e51f1b609a45c604488f7f1a87e2cf932fa5e25e4ab8aefd0c2b2a883cf00564a2009a542298305452e45d4d05da060b0ed5e87a918fe53da7d97b84a98f29b4008bd694df1217fb994ce16cbd298d02f2b59fef9b4f952945deed5b772d9e1bd7c8eeb0c0441b364b8c1f7532be558f3a489d1d3633d42eb03a2c20c1302c2f6d3f70f47e98271525f774fc16d9896cbb3db9d0851b9ce6e78ab8d5620248cd1ef15997a7f0289c02b543a75034f90b7ca94b3a0a81540a58a4336b8d245301d93e3712ddb17a13ce5970d826427d7c14cd0b2e89ae088009c7a7768044d2e53f2883ad90c8db324d34f456696cc0e4152001407212ab56a301f3149fb849d3fb9fd50ee45450dc2bf9ae8c203890e811ede649341a8e3d0442a85d2c26f31a3194b7ebe294342db47f3572b8e93ba4c9dc5cde3661c4dfe04463303400011ef81318c4f536d98ffade19a0032a8c05869608c3474c98443200adb9a104a25c5c976e90b7d2274a1ddeb88be2ef76c89ee26df127dde385414f0113478e16c3efa0737a424e51d2e47c3386dce8b1b5e8380a84c71fca30d79bfe9a23ef129ed85e2802868c3cef331cebce2c81682d308956c4367020ac0c65d674161f1be22e26273a5773722409f601c60ebd10af1cd54f59f89d52eb41f118fa92438d3ad630f49fb2577dd771acaf66774c66a16d6bce38945b9b36506f44155bfa946338cdc3a39c564fbdb2e911be2018a1793ea50c4071c2b85fcf0010128d0251d3d83b5a4560f4a85839846ce9594bde31a677d000c44a447d2c6e58efbf15a24e2014134307ac5bfbf2e79d147e4d144fdcd28ea83ca9e7776dc4a8e4b695c88e46a91cbf2db02478f72a70d392423f2c12af700e5629aa1d963771edaa0089fbcca728245dacba894bd711b072d9fa0f9f32867b691491e39e4e6cca866d97c3a2842a8925357fb9d0f0bb87c4126df61582f15b241e812391088564472c34f8678f5ab6fb2814a9efdc45e61affcb14f4090a641dfbb2e2eaba12974f4dc580c2b2c66ad9b87485c4cb5f93682f52160bb9fc9b43c994181f2366bce7295b32e500de719f94e1bfe18531362d9a8c810b9ce69710dc390412a4a49bc08e23410ae90ecb195c78558de4dc544c29a61b366771e1751a907393b127fb11e8967fdd9dbcb093e0911b067f19058cf11d00832c6b3f7648dd9757cf8e5ca148ad71746be5a9310051e03e6de2a6914b594de0ec5c53314eef019713df177ea1dbf3d40e156456f60957c3f0b3f3f39971e8f47d871a02ae2eae5d8b8ae59df4faa062a5cc10dc0d2d53012c15dab04e212bff01a22126a1a5f7db0a39f102509d0c4b0d92d2fb01acf5fcd51aca5b3312acb7ce2f6c871422a07db08a8f5ce501bbb3b1a4609da075d8ca46e05179946efed58c3654458eeb34f3463a14ebf511570899af8f10c7c019acf6d0fc165c3ec7971cdd76315754803a191ea22b0e8357d9066087c51fe03bb3a028c00a79f1f9d977c9acef8e6683db20c614995646660521ad683dd39fede517380ca311d8784087823c135f258fac48133264006336f7429b593aa97e98cd25b86dcbf91b9fbba1462b80351e2a964c0a4e75160c3c2c7cb1566a20f5057f31937f2267911327aae025cbd4a7c177b11e1b2e895f1deffd90fe72355b324dc22c1617ca8451cf33a3e79bf860a84630930928d950cb4fcefde4395dd17490f481b20c221c07f1820b361611dd4559424c7d62b27af01bda9a0fe3abac74eab17802108faf3e2dae2b9c5b497eaa8aaf150be7715c120f397a8c1a5553b92b81000fc63986c0f418d3b9e888868b8f376f6674848603f6a6db77aaa77efcbef1d0e668855c3e46035b356de7180f4d241ea03e4b96d255e38d23b96149d962932c44189d608daf06d3df87ec96a8aab7e445dce3e76e8b9fb5a71dffe13ece855dca99b484a22780058bf6275c4845e5e33dd2f8c69f6e17d66bb484bb7ae27ded43a59f866a59e780c38bbbe9b9f602c50d56f656f66fb02b5f8fca7e2cf0edb14bd7a68682ad8d5b8eeaf28b1a11b7065b86fd897e95fdb3bae1bc9291a8887e8f5e863387290da0b76c3709e91526361cf565e2e2a54ed0af09c961370592a2e2a93f75904816618b45d91bd53b989214325141b211d70783c4004bec57a284b5cd87ee9eb5fac892ffa4f740edbea81fd76411da93f467adcba252297ccfd672d0a9bb7e6e4cbd778aa40f433c570304a65814b59346cdd1aae0b6f3e629ad01317991a92911a786d4d30716f1f10391aaeaf54c045800741b50a80e7528f3d2f23545af33eea1bde378129c7dcc20b3a52888b99e093a1bf1dfb67c5bd976a79219c57f0344297cc499773e77047f63fd2318df67d2f1ae660acd24fcaa7e84b8c55af7386f8cd0a644121f86fc9f2eb81cd83390f86e6aa80df9ea8015e06f31636cc86bd3f8dbdfe15176de65d8e9785d71944433585917833538bd0b48deb2424ce31347d9bf640affb34d98f9232dfaa199b381490c05e9a9405a04be90460ff068896306585f2b8eb9a0f16d94ba08eabdd8e9b39c1e8bf8add142974c3eaebb028da0ce7656f1d79262b8a350d1731a4512143658204dcdf0c63e9219bf308f23945e96340a9fab6936ef7defd8e5e1fb60038b7777c305f5f5e3c2ac8e41414a06509534f8a8a7cd8ec2e1fd38dfbedee1bd44b86305e4cc4ec7661ca78f53c4675672394e776ef91601b3d636e5a840752a1a84db9c5dcf18a05cee8a02e7eb415d4fa947a97e5fa719e8c06796993341b3af33963c1eec95a82dfdb2e87d997fbd0902e468d3e566a444e54a321b1bf7e94456ca03181f6138379eb8599fba23d40851be8bc5db106eab48c41a5eb72a1679ea89c12fcae958209c8ea597dc40af6f7bbc715ef2955d73a34c7427c4ddec966a1f19bc2a0b607a76a742692f8b169405bc6ff7c117debc34996968e3b8bdec2eab760336297f10e11f64d105e20148f78faeab6e433ac889d9f9ba244eacff93d08dd479f8397ed0d88c5c6d0aceae803791900a6168462048775262fcc1122b2fea12690a77121f93e8659b0ca4db9d0e4f6846804730c11e34fd65d98a52acb7f9aff506f769c399929b95b817e062b0eb3cd0df5002358dd4eed2af9b91d20e06eaf54f168e8c7e5cef6022a583dc3295b1c636cc5180b2ab1270273af862c524580d6c42da19914bab634f8b534db17b1bfbc7c49d121a18549d74166829db036dd455cc6b0750e640cd7b7093e0e690a457e8eb4b0e7aae601037c5564570be4ea52efe51d47dc9ec3a193ad00fd5b1c0bdc1b4f144fe2e2bd8bae26b23336d712019f286e1d034dbba08561d40a87ed0c2e9d6bfd0d300a8bc97d5efe002ebe032762d088297dbf1203a40585e334056fcf3abb0a1b351a01311c4aa644a1f715acd719884285116dc5885815db4273f4b422bebee2ffda6c841b64c295bbd918a49bb523f5b09921bff1996ae1b33455c71630b0d6acd805c69879318a93fe0dac904fae44b99e38a9ff2424f67de125af24c6f6349de75201423dc2acd32777983fb368672c6cd599f721a52997881bfe302110faad6b68ff87ffda8d487ffb3c9b15205147f6dc800b49838e1bf060b73b702122e59edb96434036afc431d1b26c6fcefafcd3865a6940230ada2bae66c077642d1fac8a8fc364958332046f11c6f424d2f9dfc2107d895f1c33385fe508f47635b0a16c1ea00328d7b534488b6b60e72b5d5bbc7aab8b881e3d2d3d63d2bb0ee7ac49c57e78dc22d63a6298c8dccb443632cf66dfed80e92851b5efad60974e5c9c6b15904000533aa5218fd2583aa029e14f1a0cc4d5bc0dadf7264d2c43891b66ed370349557dda9357717276a73aa5802a7a2d689828b99b9c08547e52fff9e248b7400f9d7a52a099c20bf16d23582a463dbb839dfaab7af12590710512a2a2ed631b8b175872dac555bf93499ee54d046a26a0b6fd85fec4129a2066cff74947dfd0fff196e33493358cfc424acf584f16b957692fd051a6ec3fffd360ae508dcbf7ffe3b8cbe7d7d84cc882242ef116d197940508ec661e55ae1b4d9cf690b3a920a46f5227738b84136d970b95ce90b9e4bd94f4f27ff6cce197926dd507ad77e4930eaed87c9890fe82003df296d2f44bef651ed281472699834a2c99cd3e41b43d47a120c85d428e764c88071199b7720b9a0d4b971584152c948188d64fab0a7ec0fadadabc7012003bdc2fd652a718bc0792c2265513077f46ed0812c67868a04312141b1c77e98f22046255a83d36b1821ddd4f249474ec6633cb9e0cf28a4ddf9605adf469d61822922315a2f337ae465e2c19547752eb0ed7c1962bd992547485e634875371568995149598955c214518b6e50e08a262dd8d0c4e17d5160b63b388b54c1a419ca53163f87d1b40a394abb1bbbc863390d1744f42bb32404a1e7020ba404c203df32da97b091cc414ddb87f625d2484db921c9a1ebc209b40cf01318d51bc7f2560cd64fd9a9764a5b52692b6306b02b73c72a8d48912c68b42d9b9217a3a1a75b1ac36f790474730a0a0a1777a0ef81d639fcb2f0a9c736036642c1bf317e5fc689d2a682aace8328f602387800d20ee317fe673737a7db583053ffac3f6bee003e04bc40019bc60d529efeeb257d89bcc71743816c71947ddd50e3e18a7ded2abe5f4ca3232ac1ae9bf0fa4e312a9c1d3f80d76854337be2befa61a36590750a072dba33dbe590072a7e8eb79ec3e0c79eed40d656ae66f13a534f5f8709dd4c95780821b05c089c3e4ef3c4991b993dbbd397af80a9a7bf2f47a3671044c7566763ab68e7c6eb8a2f82b62d5731c404c67a503c2a8e9ebb9528f5dc8bb53351e6c0756b89f9eb86e6a5251b434f5991449f4fd329cb96122a046d1c23d9403126a2b6264d96070e05f04c33dd015182409c48c85b412e18ae9115cafaa82ca019925bb02e4e9e4ea68472cd6d64cff5b393050ad4cccc12fc217980d1a758330c128e8eff14494f3eb91901c811013a5ef5fb9ed0b0e57b74a4a70103bf1250aabde66bf5f08346512de7b8f6a30b10f473d0bac683ca0761c1f1548a6990039477ff26bc88cff345c8e7a30b52e55f53ec96259728f41cb83fdb23cc7fbab348d18a20375cf2d6e8e1c3173397e7d09178dbd77f33df9d293391b27a77338f1401b77c16ca32be23ded6b84349d5b960660a8e6428e10169cb152f6150f5d796890d3edef1153db50b5d442c54c7790e327dd3ef9377dd390a100a94da9a52b2737decf4ee94f6eabb3955a681e13cfe6675533463b3516f100fdd16439024ba4066bd1cec07aedc847636b95238f1b2be23eb3731850c41fde3d55c7cf1b140709f7355376ff26fb86a03eb4c8df401cb0f88121adc45b37e082248aebaa44363954969d052b79f46f3a6f94ecb497fcf38b2583c9530562d4f5ba4bdfca5bd9433d17a879ad6a324c7d5e4071d4e71db0e0e807346ce4bbd85eaa5fe3a57912f710d508c9a79096abacb0e8ee6b3c0b3f998beb25934f44957004a524ca9c2e6f9352eac5c4eb7107a2becda65f3283611f56d80f5a8cf723760e12ad79a10a9be89c9310f3ae2ab826606fc32c1bb707def882a33c97917c9223f5c0f88eb0371ce40d592e3ab1f1b699109b16bf173f9d55390f4204c312725d6dd53487eec4ca283d9c366a8bc1c185e9ade27f01c24ab2469241e5149cbbe316a3028fedbd3c6c8724ee82400ae29a5efba4a9f86b5a41f641d805b8e5c37758e9d7be2caeae44c36103e38bf6af66f1ce34296b52ebcd9fa7d26d3e5858e163b5e34e02193a03e71c043c4a1d7f6a3fe9ac43a98731da21a6aef639ecd3021923692731ab6070960147470677d45fa34cf789e27044f09befb0f210262327ad8cbc3facee8fec76102e97270f6038c555ef4004f2b6c75b052891d2cf260cb807c30ccd196b41f50a01f7a2df3e466aa1eab60b7e5d97485ae2b9177b2bd29e5b95aeccb1ca467a6b242135efa3124da97fea910b3566ccabcf6bdb8f9c724d48ebadf8cb0246f1696445c15f9a0398bd7d69e3f6e35c1622214ac150e793c1efb50e9226773689b5866ba90b542c7e4ee4d5917977f8526ccc92a9751206081b39781c61c5e1f56e69be85c4b71567f6a7feabf9f7a90b3df4e858ee3a95f59079017bcc34ed4b083c418044b5601af3102466742570d598bb6e7f242d610481f32a52686f45ba546119076b45eec1bf6d9f2586a5f0dd85d4c87c257885c6d1b83b40be4a02df60566f2f1aafb954c95010142f3978e41d3b38a178be891ecefc83433d1fc401645ad8b03da1ddc9ffb86a147a504cc7d9e84ae522754cb02bf4fafa09178fb33d21557af82d429619098067bef749670a28cb27944587baa067ef32beda9e8d24e66e2ab2a70e25518fc378628ae7bed9dc46c881568f2305dd83161562c20ab7808809dae08f892bf1c6be0d17654e39fb1a459a1a8fe1d794d0d889f21c23d4e9d087820f30f46f81dff44673dd63132fd21b84325d888121de6ece88f742dc8ecbbb465b9f032d76bf3de8f70b3febc2a39054467b050a0ff6b632d4efce823777b4c1c1aaa097a13ba59696db25a6fe8a0237f11325a9bd0666a609392d5ab9b922aacb3f415122e9ecb1df2e278de561d78b2f3a49f9e94eb33a54dfefb402ae331b5be8b6f5553387ccb1304561008f34aaa08d0ed3c9be1a0b4fe203be7d6827f7e63efe1eed6e6d4ba7146b66a017a83541b6015f8924124b03427abcf7d8f78d2957bd0a656055f246322e2932948f87139cd72eff8ed45d8c824d09ae90b3a8e4a260dfbcdc1810f19eaa73b1d07fdb5103f1d6e12cfd9a8fe62177029ed5292fb7874a66fe885b842b3fd51e27b5b716741bfa02f88830570b6eb42213fce28f0fdc46aed2779be2ec4ef3ca65f642e142e136cdae4ee3c1fbbe7829345a0647c55412de742666d34ff5efd67d3989c953aa15fdebc7854931a82ae81e1a5025f244a3a7ee319baed8cf38a2ad29a4ab3e731e940276f6c4aad1ea55db9b53cbb236c3c0d83971205a652303780815043b88f271215a558205d9d0ccf51175c4c658509261164c204ec7a47731ef0573c68e88e5c29739db8ee995e06d221806f01bfc3d05e3efe936b2bce0edb56ef879f31c2c5e8f339b222a46572aa6b128f2f07b6e4183e22a977c26a69854880a96886a395ad37da4e5649cd1f15789823140f91b7298e3335b48ebf67bc4b30a84bd36625343788bc9163446923f1f2b97f6f8807d1429db9975ea9d3c634521500f290b63e297aa77e39521adf7dc2111d2142da98fb5338d73ace05666d656c11aec101c71003abe55301b07adc2a1c2d5135cc825227e68d21b5c3bc4d09604eb7c9d50310a13fd26e9a361c45377f120d6ae5811ee86cf8761e029492259ded57591b31ad857e9581b8ae30be163fa1fb8204b38de20a4123c4116320fda031c55e794cd3f5b152f8bf3a7f5c5f86f780ee7831297e12784a5d4eef51526f7abf914cfd49a7ec979980bb091a0255cb85d2effd481a44c528aaaa52bd23ebb5d6ac39a1d4c71b250a80fac27b8064f58329b96e659bf061cd051c4e1a6b45b2caaafda172f11147212c327cde9edfa50e3c374dbb38a24b7f9d45b6411a5a6f0b7285b3771866d4980d94ca9f4a7707396be78c5769a21bb13aa9e006cc1ac61a9d5c350acd266db0d7a831e77b0619dfc462c1a206806ac157a3a7b40a1a0fadaef1a3ad33a0453987d4feec6e984c1fd3dca283223c302df86604930b1fb064fae69c1a55284bcc27190c91ec17862843bc76ee489de17b2b702000646b04265bf20f52303ac987b863615852a891e84d9f8e5e482d949868a33a0285b2c6f58815db698198fe3cfa757dc9e57c0d08df8b1b9f24291766e744fc793a71018cbf4a54d804553bce8f0682bc16559c2c46a98fcbbc8f85300cb3bc956f38a8a0d2171b2913253ccab4609b608f7a24ccbd27a7f40dd529c8affe605f400a647acd79a058602a4a49cdd3366010f699fd121932334d15e6b425321423258377df838ff68b5e09295a4580047fec1554d7f181d8ea6b8136a5b2945f178d2d0cd8e090d6ae3267ea7a1690a1a8d8da765af9a80b950172d6bed6ec1024116782998f3d18e3710fc6bb24640427a8cb1f0c57c4493e931b97868d5491e074758d7bc44910136e5c2c63f222020e11875d70494a9fd250fe6b402b28262cbc6c0bf5fe21c3f739bd592696146958cf14e4f78c9e7a4b8646985617ef7b800128884e18fd56ad3a115d5678b8613c20969965c5a737644450d24c43edf4d147c09364b4ede1f3fcc7fd5c00995692ff34e18a5313a362e19009dee0d02b72d124ea69a935da2c4958e4cb4b8807621f6e7284de00d40caba31d092ed3c922a3b3c95424d81644a1d991188914aa072e353f88cb16e246999fe34b21747d06567d85db502597422852d88d24b784239c567b73762311f491107ac644c18284a5233e589dd9dae7cc8050c279379a2c848272b59ec697a7701163c3fea96962af5ec6945b8ccae670be43f2196e6f37ac697456cc11d74434d45be88e27bf0e3823540065b12422961c6ede161b21a11bc9608278cf1aef95e2b727ba03536d725de881e4d6add0c644b3c1581f1c73e086f94010df42f09db42d54de6754a2685d3942e1b8724512dace863442b4e9012ea04d079d130edf63f864612cb47f38bc4c6621d28f18e59285920d61db4959df9e7863dd98cc74754526521caff84f64e64054aadc23fb58829b915ad154a3595f0c5a6c76aaa9c2a1c0cbbba8ee0627b92243c61ee86d89b83f9472b141cd48b4bdb1162e2eb667c412f58661b3828e2352cf63b9d64bef3c7808383d1c4d93bf0319ef5c3c1bace284d16ff1e22639a4a2450e216a0062df32eaced32345fced1c023f556852c741baacf88af3b963e2f6abeb898a2bcda654a85ccc1e2bde57de586f3d42ad7f056e08710f4a48cccd4294c13c2232b1e9b196c1ab0983a66aea8266f0dac0a72965221385c9d5ffe8dff284b0a76203ecdd6a7c60bfc98ad7843f28ad8e0fd6ea849978d08fe51173933c8b55a28c439d2ef14477f07f522899019ef0d514d3544fbba802a92c958ad069bf25524b006056c3fb6afcd4cf3fa1a62b4aea7521fae7b15cc6ff9ceea9f3e9d7b9c346b046ff6b822294b99eca05a4fadf9e6c5e4b1ca7743c0825e7596d68790e13fe0e1e0f6deb26ceeaaa8f78829f69c301dfe0091d2aa0cf4b7e1dc2b180e2a362f0632c4225ce757ed128b611e86456609a0ce8e62fbff61dc432da03658719a6f8b1737c875cbc5cb6ffb18a09cd4b09debe943667077437467e790f6abe3001c08d230dc88abd1a7b44ae3018ad361543630c3afe1659800bb298a43cb3aeb0782673f11db6308be4c196ae5eee5b8ca644ddc0002195aa684e9ef72444578c1c52ab6f6068e82ade1e163f9e5383c331bfa64e0fe1631fe86932fa143e766609f1529dcf0aa131a5d5515fbf28e9575e2fa5615de98c073a5262a79640333727ba1a12fb1108b1889a87562685562c6b723af8666173057a6f185d232895f2bb10f2f4b01553f9e9e1eae9fa186ef0f7709f0fc10d79703ec34a756b52a9beaa115b0aa35053b1006e7f5e5c4d81cb6e1cf36285193f53b3b7718f13d05745b64ffb4df309d996202a21640192bc2b77ab7070003154e7c4615561614a20274413942dce59eb98402f0e059c095531be83b5b79e003f32c77c50151ff221614cfd2680e04c0f165ecc78ccdf94b009878281cd87812e2bb4fda6f01206d2cb322829d3ad0e0bede4fd65ee7d8ced2f2d8d61f53d9a8f5b76289dd35fae96b0dedb94994dcecdae14664d01f35a2be6eb756306a20ebf664470de030aa5fbc8f3a418578a834d042152ba92a989804ddf4f39374d7e49f155be42de76c58df45fba56a08702cbafed3bda1e8d3c74df3b4e670f5b59f6b7595532f853dc49e1acc68e3e1ce0838f7e9d2ad636522e4e20e25738cf22433ecb0ac66052161538a40619ca2e308f1226eef1579db14435b529bb094a2f4035984930f58a8deb4630417d0bdb8da65bfa16f285d20d170b28bbbb02d575c2f935661489c776f7df4eaa692506d905090e6124228742c67d84feca3bd91901a0218b0fc25bfc80e903f65a8c41f535bcb1818b6c84cd809e41b65a93310249541961e904610158d3d476707de15379312918b66d0cbe52ee991a07545230536c9a63b414b590322a0b008920a95743f4948b1b3ca93196b45e4851c28582c26dc629f2e06f93113d915b8a8d1e453d9e62f8dd246693de7343552805178c49cf95a441f414c3e697e57bf7e50b223a26c26890de50cbca3110c621db336353fc1aa912af98c2d43cdfefa0cb4c92f17cf2596b3c91033571858a912634d9c098df10da303cd544985ebfab9b2e5e37e50d3dc3bb75587263f8d2de1241ce7176780c031a7e33ca136a3af35864a27325abce94d9c6d0cf36b9144d5e4c3253e7084e71820580270d387861f0fed0fc68bd40c5414721944a0eea85705c7a61724ac556aa74a4b2d829531989789b0f9e490ea78f57186b4ff963647d1dcc20e99ca69ea1682ece0e7bc81c891f8721700f9c939b2c97a3d97eceea92a2108002dfe8193d3005411f3a456601ad5c131fc57242bc5ce202bccb722541d1176187eb4ffb066760fcc44a65f4da3f4a4ca6b827479cae9ce2a99711692c9f24e057ce58c205e214583d2b77a06d3d0ebc87776a5766b2a5984604dcda681df700d1dd9cfb3652c57492b5c995a5e64708a83b144c2b1fad5f1e6302e78411a081fc4886b2391630622c28d7989dfc25b39bd5e4f31205959060d87f713389d91df394580dbd7f8ff88200f9b04fa57ec9a0c093b4cf780a3c9333355946c06167bc0baf12383133022f5542fd607c12777106d25248c71fd98f86853c45ed41a129ff3cf849d6dc2d6c9c09230e7e8d4a65aa992e1ede6167c16223c679268c70b1a29133e69b64c865eacf8d89b91472f5c773df3cf4366f8ddb19de1a1796e228512623db28c67a1933d00eb2c9d766156181a9be015936d71596803bd1d6a23238c10782e82fe926f0e1b18bf57f0053240db26954d0dcb53c3d97a0e1478a8978cf878e23dc4bc7565285f857e810d1d0430bc12d8a8b450feb92d4a4171261de3c4d9beaaf06e91ea5f4effb6a4d6c48fb6d04bd9cac12ce45489d780a42f84fcc82f5e18acc786039556ba10b6b4559fa3636b8a8b08b1e48a849e304eb5189c14dc54d79e2e399a96254a5ee4f1a74c6245290180a2795ed9b178752f44fd41b686f7fe1d1d7e51e455e29ef00778d3d18126b405f8f826f02acbe87b6b3029c71f43407fb59c25c1c50c5ea0b02538fc0bfacc56438f9060809c64bc5bebde1d478a2fea8af7436d1e0ba0940387814516700d54408ec0dbc348f701e990b4ebc8362a0a802287a0f3e750932b831d1d72b6437a54907d1124920c7f0ac1822faf1d1e5c3d836ddbec86f4cd04dce3affa32fa6ff9f48e0f58e021f606870c248f80a0d5dbedf10395fddb5cbd43d94d126ff52fa5eeb0641de4a34dad9ae85224021b8f3f7a3b3fcac9d5e3a4f7472a01c888f006a949b3ad1165cafe1906ac8bc720e6511b2aac651a14b1e54de8fbf623b9a3a4e24dc22fb20fa8b89c21bcbe1d2dfec81bd174b382e0ceb6d4537ba1d199710bc31962d0c50ea4bc55c56cefa622ed60f0d498762ab55620c730cb5020522ed75e9524dbe068fec051997d8811619b051c7697302e7bca555c263108c22af6e467687e552c73406a6036ad1cce7f1b4b688998b2a8e38569ed58a5f9062942110804c994e0c380b5a67e30081a046fe869fe797497188357f803c58e106b728758740fa4b470951245495607500bf35370cb731efbcf9a400f78839627133660ff268a83ae5e4c8f428d3017d0b774f8dcba9c7d5c66df6186bc74807094141181001d3a20d8c1419fb2c15eb0c423432593f71400c7bae51b0bb1ec653ac7eb46400894c7b82102416024d1915603a210b20a0b40118f66518ea0d36f81fac7aed1388dbe323660bfa3e4f3f14908ba03b1777af54db3d6b3d84bea0f1bc8be258ac74f6a01f1a4667ec5a559c1eb14755cb1e29a88d5bb47949661a6d65ef53c9e5d5d08874a20fa3b7e3bf5896f345eb07407edb897042097defc2238df9b69702a681890b230f3d7478f646dc469253e3ca68ec8bcf3a3b2c48bb111263899bbaad70f1fb43cdc36abd8d47d4fc60f60d8d73a1eb3dd5e6a3444fbe478bf7bda6851277859df7156953d307950c689815a94afa81e4ce80aeb7d087e528def825cb6bdd161c449e363469e463f594c0f4e9532d8fe1cfa2be95f5437585f2389571e3eace91b4bc54510f219a62dcef7ab1c80cbc37481c65dc5567b0167fb845907b6ce2d2b568dbc6d65a0ae423dfefb5c6cb8203aafc8b24c0118a5f5f3422ca56edd401c80b5dd5f52cb5c2db934553bbc030487e505591ebbbba09e63ef44cc30e1a1c00a7d2413944d6757e65a9f80e7ab35a0f318aeca4422fa94c693178c699fd6dcb780f2a0e1ae748e5603818f8e4aa51a035bfef2b40c7b879438b4898f8ee4e5c983f03bef38d4cbfba0023a0f81bd97a1563ffccd6b4d789d2bd3455a2b5070e3b3fb82d7a422592a49ebbe797e89cf48530dadc042728fb526e4d0789b63a46e24baefd21f4ec05352d344294670db95e4d3579fad6ae2029cba7d623e98a1568e038c408d3ad7ac35f71c8ff1951ed5bcd6f440b91d22a60d2ab6d61ea6d2741d303aba522177634d55845d1040bbf4a045c202c524f4b82d7dca4435be227e3522f0c3de3036daf8a0c7b3c10098e4ce72813b694ac1d82c999766661b0705b7620888f50bc04585ec7c788ed84745465b49c24d0868a92f7877d230aaa3e86080a83fe327625e44c91c86971e4c06392331f582af781f3a6ed60e9aaee3c5b2c598b10141376abe443f0b98840289b83bfac632bd1269638f04ee9c18be271cc101c904b748735ef01685c64febd4dd6c424d908571ff7ec632ce067adff03b2e6bc85abb563ef3f88948ed29f49878dd2065db337fc427fe82648cceae43006c20cfe501fb2ecbe0265b4a27050c28758da09303eb31c7775e03b3c917f386f2ee5fd1a8e4e523c7575efd57562f7fc91bb42e6de90525b25ae10d4f66434aa35016ace5d1e3d4bfea297ac712c137d58df24c064f4f4fd0fb89006b2bca0382595f00d3177348ca96063279f2f96323e476d462d8f6d6245fa4adb526573f15302a06f73cd06edde012a8343dd60bd8ed0b18215b01514fc6162649526bf210e5c0c07274ccaa09c409947c4e6ad5b21a58ba2d82b219141d6956d2d0998f7589110b7095a1ee98a661976308c698549ed0391ed5864504113b7d03e4af039c37dd9b345d44c0f8f55bc5ce30490cc99b6f348d60c2096c7bc41978424ed9eec6e04a552e6432fb9fc5d1f6a2a723d065a07d8f3a22b2b87902394f0e72856f121973862b84e09e5ffc8d144f06dda8d6800272872bc40fa52b7f45d8332c036c210ac90e0ddab8fd69d276854f1e08e5b2440638cf1f319343e94460c8a0d3f066cc5a5f616a8f29403d65628496fd5aa7d4b6aeacce5638805575d2c1ab3188dd025171ae724783c4a67acdeb5a512573d16cbcb8e71be2547a88b9c908bb56e1eee49b0776e7c83871a230b678a0566c8879a3b8e2f0d54d6ee975102b5a233fca0416cf2203f57fd39b155490d5da08136e2904a48a17e5d7bbaeb920693c8951dae8243e247838a02ceea030fd5c342aa3081199daf0ca7c66bd19bf988e8125a5febbe1667a541e636c3cca98e4f0419b6305cd33c1a0fdf57a3163288eb5a268df812699f307df7dc34f4d6bb19af15f12441f072ab787556125437f8f54a8a1593e3171918f118c282aac0544c14b8644077761b2c1803fad4cf55921af2bfc09b64aa68564a697bbc451157d8ff9945ddd3961ba33fdcbf8730d593d3bf12b5ff2482b2a6356a3e66837566513f94620df6df83b8e6a3cde5868e4ecd0907119d94c758bc31b5555c52febbfe52446cb5d81abefee5be768fdf06ebd29aa08f7a83e888609d5da6d68058ccf134002707ba55880a39d997bab2ae4fffdbf19af93a1e9bb0ed94894afcd82026c3a90ab585d1a42f2a83b4475e10b9c71bf95d25d6ffc3b45ed67d4cc06d98c46fb851c99edb1f9e8499cfff5f0a099128d5670d1401e09a1261cc4909c1a41e42058d932575d919cc4824f514346161c539bd2a4713ec4271dfb8d6c91c2d5aa68ee196c48c35f6f00f30a242a876a63788f34f0d1899ba153dbb008a6606476e5c5361e04af82b72fc9c7a91ab176e41297df74c430008ca31b9771b71f57c55f5488c98100dde41f331c9ae96d65915661b3d0ec66f64d37153079feae26e338aca23a8364307160b4995276424513d54152457f304a7153afa5166b905c5372c31570deb93258066f3ca6e19030bb0595f5e9efb9cec5b7492ea35e466a0cf6932e3773fbd6fbb726d41e03b5abdd4d316dde0d957526c25076ed3dcf4d4bbe46a5f4f51cd69f7f611bd55282f28ab686a00558dd1547a9572815f43fbea4069372d7c81a827b6addb58950a3a9f5b0910a3013f12059ace286e2f748277e210a7e5c263d9550eac8142bdd2236532ee98c9fd906f645ad702904304fd098f2e946e5635168288433b67c4146036ff8799b6e77cc976f450cb25fce5d222ff43fc4b8352adf5a556e55b2cc4d7edf70e2eb5b1344261bb0c9f0349ef4c95a65a9d07ce78695a7f743b4c3bd3c5693065a06a328d024b7a576f25a472b466a03b6f70bc752ed3084e1b4888ea1809490389195c4409491959e28c2530ec03faf9351ced90a274794ebced79d5ab3cdbe05bd0d558d9b2f0d8157218b255fcf2536ded0d23ade7095032125284299f0ed457b3b24d85eb4b74b7d1c05a2d2f437e0091b74139ec9aa70cc95f2c174fa7045bc0dd23e2f01067ea5a3bb0ea9f06ff54fe3b16c6ad7460edd2dc036ff4979e70131026888a21e8487fbd71c941829e9c946f11f36b297e45553143f906819873ed87c688cc15063c5998362acf6e4e571273de94324e6ad377f6ae8f78c51e52737d747c6ec939db9add10994895675f551b98617cc3ca03e32515c6c41d9be2d70a8a136940e1304e453a667a195626bafa44c4f72fbae630b7a9e104b02b494c80fd13c77a9c645ccbc32074a0c17a2cec00e036895e695f0df4b4a143a4e333ddcf2df2e1ba6eea42686ecbd59c9692cafac90d8dc87a0833704869067eb718fe5f8ba337d73391b6e89f9ea4d7ee4394761832933d0b10078a10e789c26fa0653048aacb0d13d19364f05e48f08997991561ced540f5fb9b0b5a7b442f7baf0905256bd6f402a08af36b5ff1f3cf6f33017541ed31e65566e3cfdfd18cb4f771fdb87b01b3caece268a540790a8f91fba7e6483a0f62f77f827efd4c32b45aa07db5df7102247861c3b6beda37b4a429329edd1b5a4d238604f81f1ade40c146b71a48e1b69ad1c2be781548949a7ecbb3d046e3d9edb9a08af5b07cb26613a01ac983e565e4f50d354687fa57d713ffe4f52b78b31131c503acce0401fa467e566b57fad81347a7bfd0d704898764846781064416c4c02aee04f246af232f92e4d1647025aa5b1f9a4f2c9eed8e942bb6d2b3fd0f03833f088f0c95d37a6a92c4d59362db3b89e73d13d149e51f5ee3bed5a3906695ff821abb4a44c2164759187652e88e3eaa0915a18a6f65b05ab92ad6ae6f9738d467bd8546eae7780a3f66a5a0dc4e2d078bb330309b44dbe7640967b7f8a5ca6b90955bbf1bf07a1208ba7276e7c0a332e82041b1c20d631398dd2944f1dbe9e6cd53ed0522e0666c81a3e71cca1455a7b016d80773403d8cb73fdfc92fe54eed4374f4e67717587e204640078a5f30672760ac74c22c52dd150523ccd919dde6c1ebddec889cf8da2d0290029a3f8999d805ace4910ca52eeccf83338c4a56d2d108d74a680510ae84cd7efe5c7c6cfaa3e3a696fc4ca54149bac4984081aa4a04515f97d989db8f19ef84cab43f534eb26ba378f6fcedf093295a78f36aa8d2e3eb479512210691653ab6cd65a96e6d0b1258f74960981b6ed8c18628743d908ad913c4a3bc039cd730257f9b815688c4b81ab705e73a7d500ee994aa26e13430ebb0a118a62c61374553c0c9298b1142b3606fefe772a2c11e248de299e5ea69063cc2f55c704b81f6e49be0a6fd9940a4e0eea40fe3f4e1564296d2a95053a8b2f636795f5588eacd6f56c1f8631c63155bd0291e87503167b01d621e04e74f3040e6b00dc598f649a81ba4e72c222b135898320e4289d2e455e6bb3697a6de5a70376a0137a89646eb535aff3005c860f57e3256796ef41ee5f8ebfdca892c9fb3d79659e15a3529874a84ec4dba6906dd4291db8bf0554cd2bda4a65947601799abd6cb86b49ca12d21a4d721800893ee33ebc219b8ebd72554a8c60927046b196146a08463e7aa092c22573c508861d04241ab99cd645563ac4594e54f8e7c47acc52a08dc0c9f88e63a68740ea842d1bd0a9226c5d58deb42523e0924e61c295f2113028b6038a5d23ca9736a430fb1a787da5d41b27a652a37d7ef21d91a81f483fedee375e0c6197c80abbe368bb932ece9560633fca7655b200189a2db0c579993c3e218dd9eb58d6666f5f011c178b895dcf90a110604599fab3fd37479d4f653464540f0ab94bccc3d8cef708aafa10244251880f415d8f4fa8f967a8fbd12036bfb70731cbf5b001564e579fdebe17cf380c7a44523205f3544f3b57cd96909487826f55568b1e36aab0b34e7820095b70178eba1a20e56cad599a200e7d65a841afd0f3c24f858fd41b975d6c4d43659ea3988adead39cc6b5295091c5fdefee727fe27380285eae24d9eecfb278fd1dff53771f38f36a0b41310cd540d032bc53b4263436d791112d7f8c0f11c66cb0e4fa1fe97501f2e5bde51b1c7bf5535f65e899efe41b8f7af143df0a3de0be547fec45967e475501544a03ba65b27e5d300e429b0efa036e77df824a9d1539bbd03bd9e1833f4cebefa7efa09d5d9aee366ec6ed62fa1e606b08073b02c1cc181de703aaa0e3993e3c5ea31b9ac002d04b0383204aa1104c92b6ece51d45180c4544428dec6e5bee2da54c32051208ca07b807427411f3847f32fd2e9373a45418d38312eee6f829c7e62b079fc741b9b8b9e58819cf8b2d802811b545191fb2bf6824fbbf14cec97d1ae003091d9e3154284106082d9064ffd7428becdfd158f0313664bf214c5da10ad2c38b122f7890284d4c21a68a224e4cf09870c149cb09407532a57f79c8f4b19885959829f263812597321d9eac2bb2ffc56296b2bff834291e62010455560cf80b905f914be28a26b23f16b178a19543dbafeff4d659bfdab0ce2abadba1e880675fd54b43a0fe4e3a46605a471c0d952bb9838cd3ba93026c0c685f9d09c3ad0d617e69a7fd7b9f9cd1e8febda7760cc12c33e4b616a007d000681a8caef9370c7f9b3fddf1763e3739fbdcbd15c0ebfbeffc8c289b2777cfd7eaae07c270f872c568f2cc835ebbdb0abdf0ba64e4fc753960e69af75c07b91b69a19aae81217f3c1d047e3fedc58c0e0a61f8fb717450ecfb4120c2ccf74f21fe43e33fb2ef9f503aa8e6fba793ffe07cff94e23f39df75c79ca2b50935a772ff8cd242d3cae6cba982dcefb9b64d275af3be92446bfe77c9bd7f0669a10905ca0ab61cb4e6ef81169a42260c2a727f91db6cd09affdd42a385449830fcc3b0a01c40ee0f400b154d181e63c2f08f917b5acdab1c9c29ab39a76437a40d597a0d39afa613b5cdabaef9bdd38903cf3548643433098ae392fced8ceb95630af1ac2924fbd71886d910e145969e731c0dbd0b540404e4606b9c619ce6ff7996d77cbaa061f85fb2f45c762a6274b923e79592d9d35149ee6fb3d7c9822796d77c925430bdcaee2553d2078ce3f80520ad75773bf5143441e13d514a001116580509020731591039019515989a3c91830d62604f72d8ab6aea629baca846e89324fb824a8900b9d0440b4348253d81a4015f8058811432300879c20a0b7c685d799284c75b220acc0bad9bdc51604a78024baacaeab6f020a80a3c3186cfeb8897a7045a1224fbdf2a57eea82a765c81607750672bedee76ef75c44beb05adee8a932e1d3502e4c2d5c0c9103d8ca8410726c6dc4abc456b91e2f104114134f143099adc515fb480507ee6b9ee9913e9aaa14a9efb0029707f8e82e797934c6eca4327e05d32e8acd3dac9801c90a8010b10b92e526ea5fd49da5bbd7abf5efbd7cbf7eb104dfbbe04d1b4ce1f59deff1ebc63f8bdd7419767ad1fd659dd364b58b66f355db3d60fa6701d0f506bf5a1f2e99efa78b6cf4f079c210db078001f73e779df3f959cd10f95e0f28c462d4325b85c5f47f63c8c2fe97943de8df8083c1f893ef164614d0eb80c75b4fc802dcf6b7fcaed913a42e03294d90fb3950dd1eb55afce993ff5cf68941f59ce96725f8f14812c776445a187689bd8358765a7cafeb3eecfd2eb96c9327550530765f11f8f6a8b7de23687ecb607fb43aea2f5ace7799e1d2d936dfa814bb1ceeb5d919ed50272b81f74729a4b719a5b2bd91fd4d10102bfe834cf8bffc4dedfb3e2b63bf3a51795fdad9395e23fb0f7b74ffe83dfdf5ae920ab0efadebff3d141adf7ef9a3a087cff2e4b07657590ebfdbd221df47a7fefc932d9266a93bdbf67e53f5ee95d7958526d732b2b2d586cc914473d236da3485e1224af09921705c99322a66dd4494bdb689593478293c7c3c90be2e4257169810b685598ecdf3d695bcd753fda3625fe807bc8e57059c04692641b45db2a15b557da6673221653a9be5c29ac253b97ecde3f33e9ccd84ef38f8d9ec569ee53fc4a1416d91d8ad7fca5e0bc0989dafc07921b414a82c404c97d3851db8ca26bfef30b759a62a89393409d3c479db2bf6b9c56dde31f8ed38a52f7cc2b39eaef65878ba825bb54f6f9947b5273fefeadd1a87bfca86b54d45681aef9cf223b2c883ff034a189891b0516b32a950da7a2bd88d13da2c5515b069d65472abbc55db1b80564c78d9d615e5f1ccdd8b7eea09a5d8a65e2b41fd8369196c969fe4242705999b25fa598df500182d77f6ce77963ff0e2d7b5d676dad955a6b2d796d15458cad25dd29f53abdbaad5dcf24a5ef564772ebee39ee74274bfbdd83b6bb416bdd5dade016b0ebbaeedec83171f87b46db6e03f9886f837a016d068e7964869744897964899f24349409637c84321b689afd19d47603c7c4556551e5b2a7bcab49c208653a4abbd72541f02c51d76c95d26b1cea9aad533e20d050a6ffd17c881acbf3cf8a1b5158442dd18454172b82001384140c497278a2a44372058fd7054aa5fee2bb20ea88f6853b355425be08156e99baf9aaede8ed3ca013beec709df8122597f816f1057f51c262112cc3b9c953047f49ca791e491365f8cb8f2d7215b9a44d7965c02a58527c69c2c46b0c16d50d585162b0a06cc0e2a13382e5e4e6b08cb482c062ee282c135a62f0d5e22505f6aeb861a8f8e24485151228c02da08209ac1ac87b432c5b62c7093b509a46304130b061eabd0071d14469470b109d199c3090cacd98aa5c74a9d223a7062a1d1d78e0cc4035bbe104d189524e0d26dcd8908593b359e2247659ea51d304eba64b919cecc9934d1721391a2758355d78a0307303966c0b14623624d170c1e204bca46a868b0b7ac068887171a2c78b4915e672840f570d48b0ebc3050b5278f10d3115ad3597293db0b8e0700214171b766cd0a4c405861536a8a1890bd2064c9cb8900084690b9814368092b5658adc0637246d59c2c70cb82d46f0d88006ac2d3ffc88a2b4e589c70633645d2cfe0190c0626872822dbe8045e097133314e1215d09956002e507264b2f2a98b4e05a8249aea505b6a9c2e5035f293a1db08b4b2b08068988c25d54280476adc09b01d71da0c01e94242732d030030c08a6b9a36850726b03515195bd49055e602fd787b9f5dda0b17be6c378fca75a6be7acf63b6b2b75f7ff0f54406c56502562095233e5460548b22a483634f8a07952aab1c20521333c30c9ace8f123b683134d9816f014ab99238cc0ac28c584c8bdaa3ce11f50e0a29283ed9042c8c314ad75981982288531f2434695aa30417c842101a9872a3060529802e305880c2a5449c890320566aa8715181f7a5081e121276307243038c8787a02b3a4828c1e9e68566e8b09a624ec1558963b8ac9874b05dfe48e6272420593521026a4561218078b9614d886894e0a5f24421a704b085b056e5d7181872f0a254f5e5d702c779412a51f4a5ab84694e4a02821a105059826199af8a2c89085870c514464783241861b2290cb3559c16ae209b3fec2a7ab3e3cb4179d7d01ba5fcfddfebbcf08d3615240ffbf3edef6af3b095a24ccf0c809420e21c011042c097a62e3bd6a2e4cf6e1b03ee872c9a8ad5a3b5be9abfbebe280e68e9cdd33ad0bdca04eda419e25f49ffb75c77a248acdda35c60b1e6c2dad352e0250e322003da258d32e64b29a49efed6ae3125dd4b8ae0fd0930fcd341f6a33f5a14094d22b74eba42f5ed4fa003411c40100d9130023d1d8b4a6c18bf9b4cfc275d230ecd89735667918efd4cf5b8c42948a6a96d3faf9534cdb2612fed36a3231a3985fa83a08d4d242348b661d11a56d9e9bd2575a2acfef490bd5a4a41bf2fc19a46dce34e4482fc9f3470b55a7ea04c4e650b22fdb8ab2b5b0998fa383eecfef400bdd3bad7a883c633fa383eccf97d1423e0d034b9ef8cb05e499419e3d369a03409e3fb6508e868133e7ccf144ef933b642952cf798e2cefad354914999c49146ba853f6979150d96b9215ad49d96916a5a25bda4673b9acecffca512a264a4599a8982894976c2bcd3990c8f499c0459129fd994dd036ca444bd84299a8bed156fa8d9e7da24c01824a809013944ac523d320554332f59cadf4823453c844ea1e7a475be9d4757281154f5a404ddd1daa60e1e81efa9ead3589fe104a4830d52622154947cd186da59e6916eda9b80c6a6e0115a91b534ba0f174a534a4a2ff55c5ac70b094689c13b71c2e2719a8ecb830279b483d936c39bc5627cdd1648c729020c72461f298416ad7c86cea3b51143c2f26cda7f2e449daee6bd95a2b75f7390588e78439e5b1fdb5d63a5db5d65a2bada10529ed68cbfb6e15ef576907dab0d6faeaeea69452da14003d9d56db79f76be1af05c2c0f055df35672db2e1344a7a4dbfd8104824c4ffbf60200cb770ec8bcddcb753756a8a86a8a78888bab75f9fa8f5b652598dadb1a9b4ffffffb7b9a1b4ffb795da4a6f44a76fbf3eb555c411ffff1f2787870b38c34ace684c1dd9dd893a1df9dd5d9479f8d61be3052dc60b1a4834494a69e8ca610e5b3974d1e8a7397e1974c9ba3bbc2f180e6777e33bdb4a264550c95a4e990c63a99932a7a194866138838019f0dc2056715b0a7b7557d7f7d1c256d36fdab5d240b0756d77475ad2a52304fe6e5fbc843d588729a535596e2d6b372985db431d2d78fec44bb5b175b108d8ddedb6f3c2af05ba4afb330ea8e7266795dc54f2ccf37d4b16a2170cc76668cad23da463d7bdb55df7b613ad95e1d80c8dacc66666c6bea89526ea38adacd9ad8d51ab7d512b4d56637323e2c4c8ddfda26bfd585904a72491cc5a1bd6ae76b728cb09bbd6b0ce469d5b83738313e2cc6633317c69ad6bb5d6ce421d52449df271b415978c7e9f3a5278fec420a48fc726c94c6b64363e8f84d7d1d0a54b922e5dba74e91203966aadb5f6c3d284e5de4ec8ed8a209913c9f5baaebb4590cc89a4bb5dba8ba4bb5dba8b644e24b36bad778dadef586e7d60c74523966fab3591542c3453b2624182650a4b97ad9dc232e7a8050b00b8d4cc39e7443280acd677afbd4fe37eadf75b2dcf2df5c65a6b6bac4d1bc34b6d5867ba4eeec04e002ffb9e14b0bf9c59e5c42aa7150613d7fc7cdf4166ce39e79c73ce39e79c363f737ece7e624d71e24ccfdd7c395590e73b8fa6a21a92a7d3749a4e33cbcc323fc79cef8139bf68cef692e7d3982cc8f3dbc76d360690e707a0854498610b15cd2cd3870fec3eb0fb68b2fceeeeeeee86e1f0e58ad1c866726636efb91cd0651792333a5292e7a690ffc0c1721f37a4e76c26951ba9a901e2421cc9699e9465fa3361a72c332e244ff21f3117e234f724ffc194150a71244ff21fed3e5c88237992ff6002027220dde3df4a76765e4709dcbf333a92fb3801d3ef2fdd4737b9704ce54d9dd722b2e18292795fdb621f037fa9415be986d5e90ea014b45429d70cbac2970dacc6284716968900022cac79f5b992386ebc5e2e19dd77541728b2d145e47e0f883a883e955c6b8a4cac30208d2c1673c9e86aa6d77d503e73eaddcad05fd342734976ef9c5747aa9d3264ffb006b4b1373737a24b145d32ea8b132cf33910b712c36dd37e0184a6d284b1d4e928c1c4694c4ef399a461f83f61a7a9a47bfc5f389d33affa35763730277c8df606cec2d7586fa04ef81ae90d7411be46bf8118842fd7bd3b2e1ad8ee78afee9efbaf9be39271bd0e6a896acac266e1a53f5ec0692e1b3aede20a5f5d5d51ec02030fc8c76706069d51ddf95054828578e134da8f2498fb43a1e61239058773e992fead9304a6362e195429d34621fbd5d5bc6a2ada16beff84a2b6909c4b404ec8ee138becbee473096a090a6ac91fe4b9b1b1f1a696d39a1031c6f4a9a38413e748390d54883df182c295034e1548c4ee93d40924e4d8bf140a88f0ae84d9014d80ca60182cfb7620a9b97a7fafb257c215a913ac20f64869e20422301629127a9835048e24774e43ee6ed00b4ca1a905063a6896e99eee630f23cb9e1759d242b27c19598aded190e5edbe66bc31439661990ecaa5e3a6162de424348ceebbee6364d983bb8791258d49eefe4596df4bb9fbb0c3568eeb9e1bb3000e55defbd71bf68f7deff3c69971bcbbee7b63cd8d13bb7fb3f737701688a2d43ff53defed2d69be646d9ad74df32e089cd6dd705af75198662edb2a77ef3b9c565ed273a4e39cd6cd72e9b8dc79dfd1261c0e47e4d609e95a17e95a045258ea5a0452a0a1699dcb9beccdf21c83a77fc58271e907879cf6310b4041725ae71266995b93f9363715540d39e63d2c3715140cb9fb21f7468f59004a1215d40a798e9f8b03cf1d49c3039713f774ebcead81fba83db46d2675ad3b08832711093c44d20fb97f1269db05bcd67f91601a6ed8b243eebfc06d072e35c86d8024a20e160d8004f7779ed19cd60dab42cb50b80802d923c9d812769c498db16652bf8f3e319cd6fdfd93aa7f3ed109552f18b0793aefbad94d97f251245b27b2fd17d6dd3d0afbcf59f7ed257bae08ac282180a8d2e376f3a48520767cc1e91075b3ef631fc8bef7b02af667d8f701e2b1364a87c0ebbeda5a3ef466eb2cbaef7d258b6648d4a2e137f835ba0fc9a3efbb07c9a32645df77df7d7fef7d7fe4fdbdef7d8defbb3aab0fbe8e9b377adf7dd177dd83a4d1f7dd1bddf75e47eb877cceee6f6d8d776c8ba37be65b1574d57feaa51d049a7653304eeda0aeb3d1e85a77e38698813aa8f3f775ecfc7ddf8baeef234b1c2038edc6115cdf01d548c70d6cfd9cd13d4030fdb2fde74fd7cc83f0c1af1192e0d7206abd519322f0c33732ea8c7254c87a925485bb8522ad91462e1288d6baafe515022469b4d6fd074e5ae4d37237c333e85e015f7037a3f4fe7ef7dff77d9f77ef7b97a7abee5509bd044cc1621641cde553bd97afd3bccf200bfcbdebefcf668def5de48ca845cee6f77d8d5651eb33eac09120c8b880c3ddbecf7eeb8fbaafd17ad7bbc823fbaf57eb5d7ff4fdeb6bb85ae48ce8fbc8d96cb55ae46c92b31aadffc0ff6a7ce07fdf3757dfe80ff9f4c096d5ab6fdfd840b4e655c1b388d3bc9fe41472c972e6e9f5115556c002882d5a897fdfaa08c28d57ea64009b07f6025d2e1036ba4823fcb0377abdebc1f97ab917e97cf84ebe5e2f231df875bcbe88e635f398348afdcc1b854f43ab1dc662b13fd2f9f0fbf61afb06d2d7b7cec3bec6cdbf6e1e76f347e1ebe87cf8356e3ef643fe7a1d380ffb39c922f15fa4d1cd8b6fa4f338afe35602b974dc60e1c3be287cd8fbc348a3264e16c5de451add7cec8d743e7c1d371f17cec3be86f82ef161e21fe93cce7beb8b6cdef545390f9bcd973dcde3af31f33212cffc5158d266df17c9fef5453544f62739a351dffb5ad4fd9daf23bb5cb09c87e53cec8f6cdef57d9b813ffbbee98c3330e767e411ec73fe86ccf923d7dbb4480f6cdef51fd890b396eb3fc821672d58cecdcde7dcd89038a40d3923bab1f9be89a40fadd98cb3d6cd386bcda77db39964d16c7ef79dc1d70b7f8c3caa795cf3f88f64ff0a651f7e0dd987b1f0f5b28ff440f6afff40f6fa0f6a482cfba150461af9903464d3909c11c57e56147edf663a98df3d188eb3effb3691661f49b403479bd49faaddca898b7907b6fe1842f7730401add1878d205028589a38a9bae4ac838e7ae4ac8310ec6dc6747c8e4b006fdc00c3db5601f4ed8bd692201cc1f6bbbe21482b1496fd90dff01ffb3de8b2b67bb0bd02b2b5d4521b234bf05bff170cc799877ab8e1cc089638fade90c2b75d12b8f34300c169b30ab419e70db4b1b9b1a1f91990dac828a2f999b7a47873f335622f9247b28ffd8dec637f44631393c55ef647334ff37d6bd7cc039a9ff91ab28fd98c7d937dec8d687ea6e6871c9c376f03d29bef9bb7b17f14fb99a218594434f343de376f431ed9fccdcf90474d8a6cfee6a76be641ec67be468cac7143da9097d662e3ccbecdebb8cd8c334bc6626f431a5da31952c7ad5d32886640d9789b4ca06fb1a719c1d8f8795e5aab2f1bb14e182578c4a4486b629e5d153a4c0a55378689ac2552f8c144cb94279084a89262880f4e619cf0a105aa6e045472480207323f28d9e2a8081cc26c3182a40a2b529688ce6b42071dae951d2cf096a2872ab825e8f4a2261622bca5c8828296ec7fc3dc5228f810e4698a73d27203dd0678b6ebbcc984d2b9347d74adbfa3fd1442f75e4775d5233bdbd9aed6279166bbeb7ee75e4f871d61fa17046c6abb4111728b2c815f4e2634cbdd82bd88571f86d6647c76f83cdd2f1baaadb5d65a6bbb3a99844d21598e30354216b0b3b5fb3a5bed7c5aee6ce46abdced63a6f3abe11dcbb17c0e62967cf22ddfd654f01f9f0a191797aea2cae84c5ec40583e56b4aaa712a7fa36161293d934c2d465926d16f00e0101f9f8d068ffa288f1d3f4916d9819227dba509ea82862fca4c3e9bbffa6d998b7e5614ea87e69adb5f6278c0641042ae2eb5d4f8742f1c6de15553bfe55f96104a553a4421c5a484cacc063c207efc812ef0a134e1ee8d1233d8a71226247151396965bd950210491022557500069b2c4adeca91f523d9c64ff5b25be28d54329bf724bf5502197e2d47d020cbec92dc5634cb84214511c31c50f1e0a78f0002ee151832b090f25251e29785df00c99100ae32bb0842e2115605e4bb02cb7540e885cce09a6027ee596cacd402447e4da80c1dc523924249d2d7ae0ac806916a68748c529078a1f37529070028e65edf791904c2340737deb44ad9375b24ed629bb5b255924fa6f912c9245cafe56a4f064afe28eaa6ae958488d95e93725bbca3af16ff5f530ad812da7b569fbeb56ab7eeeb556d269999a1cf0fc52273786795447083c6ba5d487804bd32523e727ce8b373635329a991886bdc0d60ff9e7e2875c4707836fd7926779863a688319fe137eff066ee098b90ec233934907d17cd7f88fecdbe6fb6716ff11ffe6fb67980ec2f99ee57c63f0fd5ec47f5c7cbf2bf98fcef7fb52073df9cf7fbf5bf1f1fb3d49dbbc496ec7517a3d471dc98a16dac00a16b619b4e6efa57f0ed1421b682f45e4fee9446d379ab4d0dcb1c3095e9a42260ab97ff2609ab87e1050db64e2400b4d2b1386bf1528f0162f5520905b687a99307c5a51172de43b260c1f9d89d79e74a61da60e3eef90e174dd9d1f3befecfc8ee77660b9c4b94a75cd5f4bae72c9fed58b3f06637531569db14239cd9f466db52ad525a7f96f3085aa910a03ce588b744fdde1357f1fd9ab104a66ac38a7f96f600a5131636c469ad53dfe37acacac28956ca45b764c21aaa561f81fb18366e91eff99914219a9136da2485488d3a814fa8426d19abf955cd40d4b4a9732511f8ee5576e65650ad11f1ec6a79729e451502074071419a829b2bf178f82729a934b71da9393e33836adf914dd3185fc4ac3f0f7c792fd7764af513088e0b25ed5ab1d9f1103e29fe1141ac10da2dfb0b75fe3f5953c6afdebedeb8f3e3cf60de38cf1dba0b6ef31fe0fe31ff29a0e18e3c7f8317e6c1f5b8cb1c5158738c4155b4ccefcebf70d933327671e846fbf06f8953caa0fbe258f9a14d507ffc862fcadb16f303aa8330ef1cc03fbe1d7a80ffe907fe40156c0ef554c86409fb07cfe1d78eba86638edfb0ca4c09d67443bee7b1fcb33777debbe951d977b47487e1f0190601836fce7fb22fff9fe73fdf720509bebbf9fe13fadff1e021fd2d7dfe7fa60a4116964df45ce4430f3c0f5e017bd5ec70dfca25925671fd8777d5157bffb4a1659fb3a6ee113b9fefb1e4607cdfcb5bef5add63783d6be0f47225afb1ec4553090d3be6f913e4efbbee6f9c810a692d5e129fca0f07c807c62008d71f25a3f7130068a8a6192247e74a12cc4322daabcd656583fe05754902453c228d8d5f48a0177b90cb7e09b5b2a0953765981bd5c86a10c8bc623c36118ca74a8844fde98ef85239d18acfb4210242b26c97b8104a4a62c1e1c88799a82832c9e5a80020eb2ac86743981032ca6b048c545e585c335b9a396fc60c5121d949628f170b8953b6a8991ebc392202e2c41217c6209ce076c7347318da19245db4a3baf3301cc6509b293ad01b03bc8ebba6dc51866c729664adddfddddddbba502e8d5565bedede8fda67f9fdada5defbdfbfed33fef349fffdf41170a087abfd3514aedefd84a7d7677df57a9e36e019d56b6d410b92c423706d7a3d6bd520b64a7d69d56fa7507b0afd7e5b169b5d2afdadc1584dd2ba92442fac98ab19858ab112c170c48f254a23273040a1adfe248381c2e8854925c383b6b032245724b96e8c18a162240238272c993c16fff0163645083235964f0c1bf314465f0b198820c3e92301904df67a9860c3ed05299fea15470b9d5b243e4ef3bd28252167b2bbf7c7fb6edc6a63c18aa80e189686bdd66db62b26cad4dc194112dc4992a19d50853009eb27b9de0045f785a0f5aec70ef4da1b97c44acf02254b21b8121bbc3c042d817df1007cdaef1bc90f5448e64ff7ea1065a1e722960cfd9e32467345cf4c0f6d6533871c41523929edac180f4c359d541bae8815b370a607182029327381cee86bbfbfd69fef80ae8fd673af479fe8512f353dbf4b7a30e170c7e7ba397330083fd65b20eea32757d68f30dc71bb9ecde3ef6c2ef1b7188f9fbdb51d1693406d50581c1ef03f434aa54a1c0eeb1b30d3ad44136772f4e20b7b50f482f352488a9215272d95b68a54958d9ad18921b02257b1293688709f64de87e88d61c28032bbe7c4f03904e60de3cb2843b04d4c305035916a88f5ef6c9d4a7831a4baef62905f20983e7fc1246a60fa383ba08cc6834a582cb4dd242a7ddb1cbb02af88766f8004dd710fd19f47de80351c706a882273502f49995e4fa451c0e877375a0410ec12cd3801c8259862c8fb2cbc0625f9f40d66287ae75eeae5da7cd1009f74f2a1008178a883a6122dd2b702cb7940b3b4441413d31adc0654aca8514f4e0804b13adf585f27282a90a1e71069ce7db0e1f41134d0cb3bbbb298d01a4f47602dad6bd9332a13c59a01488facc30a04f9eedee4059f01c53e496c11ec4bdd2934b1d168668e147a62fb640c4eb00cab85265e58671052d1492c415166090e11805b80c796852427e64ffea7e65321d394cc1c20229583061c8111832407db1c10a223e30b915895e0bb20f9992dddddd91c831aa4c260399d984c3e150989fffe031da4a2ebbec2c4066c0f20548165248558220657f9f2046647f201570d9a5540822bbd40a43b2df13a45c00429f8e0ee86c8028b8f4ee69cf17dc6f495895db41bf8eec7d809e66f5519ae683b57f3acff9de6833cf096016a7755453ddd355275aeb7ec62c1045860cb83a519bdfba9b224430f35487679e87735b0bd1b592ff50a914ac72d72e05e4853c134a01c9e599fc02f26af7ddcd3171fed30d119632cf4b2e75f09ce5e9e2a0861802444536ee08c2059ce638f7134ca10dcc0cb4ade6bb1288e6430bc952ec705e42dbe693a3903b5f21774e2477019e7fa8c4cc784539e910d50800000000b315002028100e08c4e160302c120abbdc3e14000e6c8a3c725a361a09a320876110c3300cc3004200400600620840c6394765006422a625a7c6457c6f019736a1372b464c01cd38efac9b1d689ddd406f6ce051923acd6ab96593ff91b998f9dd4cbac4d18fd5dc1839025370ee5597327b21955b0aea080e22e334fd5467f863fd6e942663a7bbba85fe8b3f6fcc922d9ddddf6cccc60951834aac8e8868a5237a19dae068e50a1cca9bce18538bb2b9f6c6d8af8d3c432654147b6106d4005261f011e13b1fc82c7aee6b164da386dedc6077a695f8938dcaca46b359281988d992a849098c74d131c38c678f5d612eedbec3a596161eac6fc301f2c556d1e66800f4a9107ad6471cb1ec3b8cb9a4fbaa867e7c47e0172a6787c54b655e099b0572d1dc9c669bc2e45be104c59b8a60cc22985d966da736f38ba6edccbf14486629ddbef33ed49d4dee626054a30ca4d112e37813221ba163e283a54e5243dcdd0ca822b88feab193fc18bc6115d1347962711c2ca4e9440b94067a09f3072553052d13b213a3040ce700abc1cc0aeabd1e353cb60102b47b1e25cdccf08ba16d8b65a0acc1ca14faab168280b004d1c3c204586e67360c7f4823f51611273832973228762b5badf539e2c5adb05ad53a3689be698d7cbb3e2144d11f53dcfed1b8914f18e5137f2ebddab97c3cf0db1f33f1a178ff8d1f36dc0cc3a24df56344756085c075bfa5cd822957c30bca6d0da2ea39284b1d4a5c76a6e6c2533010b1a920ab3d31266fa14e5842b8b376ba613aa69a8d0ee5f92645a4996562962e86e2810221ae2fb3b91d3ff26f92e28db534e47d6d5aa1cb2b893f86b435841e2fa78147685adb15c1af3aa42e919e9817472605c30a36b05c00ecf52293225ac26e411c29e1380cbae5819e96a337b8e3fb2c180a1b7ad08b874a5ef7b729f6e27496941b57024496b1bab019e23e22cc914bd8f2534a444aa5fb80867c46a3a7dd659c60fff189ba019f5cb205d01f26636f152db066fac79c9d8792140a8ddfeae56ce0edac4fb6a6ae0769db8758ccfdaeb1101a6edbe649ae4223d88374866f0a083675b1488ea48f5cbba249ff7851c1fd5606b738d7f05b90cd4d0f85e83b854a4a9c8d4305b3990b0d93cbfe406e72019d0eba204aa4c0e7d5e3d76e7f4cd83159e16b6028eea9d3ea1188422f18b61b6de09175146aabbe45698e910eceaddd76dd052e12d8b66f9cd2f124661eef3a680342ba6e2fcba78197856a86118aa8f34a35c99d06b5be5ca4035f96d3b385de0eb7360abbaaae73bac337aa08447f6318294daaf05a1cddbf6dc1bfda0cfac8c49c9fb51ec1025afda4e8d46b2b67bab76e215432a40f7482a115cbb57d06502b39acac9a7cb2f5845f9d935656b3bd45af70565a01ab4f26191009c22af61a59011fcbb2e125664db97d1ad43558f2b688409235b3acee977e7c680b31a7cf4706cdfe0ac75850fbcaad105e25c39b0b198581a6d8a2f7d906471eae24423582473d9902d17286a66eeeffdcc42848554deca0807e8de78d1809be1381517bbb2242f42ec8cf14f66e1ff22362ea030236d2d81214092fe5e858ef36b85909eebd3a2a47af1cff3812ad638b9ed028bc480b3b686f98ac3808ee5725e98bb086a4834fe05800dfbc7da623d40ceba2529d722022f19b2a4c7c9cb0e889995b6e5d44f504316ed520299a0a43244cdca0248bec280087cf124844c4149aae9f54cf4ae20b826a9945d0b959223cbf8e3b0db6c469f2d485df5071276fd963a253b3407f823d5e6a84f32fb3b58517d7124785649d641c8f2ea641b15226ce762f4a895c11fb938a3cd64c81d8c3770543bd669a34741962b3cb052e6661571510daec8608f6e0e015fe6bd76e8a3c63f0075eb65cdf90f9f99fc2d84dd3f9bd433504698b29a65358bcbba00be7aaff44247d5c62ab28937263260065f2c059b207d39574456a08c2686f2e9f6fd7dc090fe0b98806e8a5011891b9571775cb5a7add60eec9894d87a185473a41354798ee49689e24f8a36509b5595c1b1d13eb1cc859e07d7bc0dafb8614eee7e3fdaa7309fb7e857585fa6abc7ba61944274cebc497e5dc357bc4b243e0daf435b0d2696b5f954b8c5f0d114239d5310b1a96b2c970afd929cc6ebb5799d1be5c3e1ca3d3e2fc06c512709d731ddf9d907b606c493eead1bdd47d142c7a02146f12306bf9a06f7960826bd30a53220ee5407156eae5fd59418ce95faf7917a7f453d6ab3e7e882c136ea8ffe893cc6e95a64479ececb71a888d492cfb980ac90468b4a99f530d7ad608f8dec87a86bedb81f87e9746725ac7b882c56dfb294df66791358a1236e807597b9fa0d2ba446b115e0bbd6166ae81a00383e953bb06a83a7b99b24049de36c01b990156e9a7f012ad8324c9e094538f78a8a65e2309a3dfd3941d959377a6c11ad644a9a2802a57ee6c0bd9b38e9ae197689fd22e14f6741956ef7f7a34b02b0b97e6b79d60858744a0b0bd7921cdb014a90757aeac4b3dd7a0faa7c67b99e1d2dbc7126dce63c501d8500d160259f29f67003908bbe10035beadce29d998c6d6dad1cde2b5046edf816f45bab89128d7320d491ff472158abd0e53831212a8de8e91700f8afa6eba917d2984658d3dab3b21c4a9f07fc6c5114c327ea04ba92546d636d9769467a3fee8706ba436e14145958a51151f425c29a55a39140c2c021d4112294cf375d77efc1a0de4570ac8b5c613c779cd1767140aac908a2631cc164b479fc1e790bd4bd1d4e981bab14393cc058795a1e22741bbb432a6bbbeef977083b1fef0e78d63defd7c9d98e463eb8c2960a4a4b909ee4c1711122e97ceba558467639507d3fbfd3f54abb9262648d656799b8b2ec9e071fb3eaf3259293a4d71c13d09f959bb965ce4a7b80a3295f431b63564654ddc2d6d962ada01457d6ce127cd9b0eacffeee17a16dfa24c7da1968ee0431b875a4110745f6957cb18bbe6bad752a0fef36f5c20a00e4b19f94e8eb850c25437361150182820cf2c2b0459e7b3830d85163f2d20b3547215e002e88b71d7b3faa6a41470f7378bc1785239970175b722db4f1e5dfb80ab1983d921e9ad29e39a0d159d2b217d16d008d29eab87fc2ee108e06422a81ed0e82a2170f91ae229a005c8dc98001def4a4ec8c5d4d9f5e15cef4e1f7004a8169892975a515f8a2e9b1f8414fbf38fa2bf175e912ff28949f0a7cfce43783e4069b3194435a70007fb30897a73fec661091d025d8039de9505305a10c61176155d0b15375f476306421f49b514f9c28ceb8a7c02d64762fe2aaaeb06082103844b923c93be3ec48d9874a94aa6f4910c545806d8f85424d6d5538c4b8b502a8317cd23b30763c0a33fcd1dc90e33f0d5215a238200412fc05802f27c83aceeec60631301e250bd330c61081054315d71609838126682d71e22e83b55d2cb4cffd6602b96f0fac3e2aae21dfa40eae844c74f97f0ac5baa188e9598caca0b23005de01d51b42414c8e8f18baad9d769b47e0824d178847fa2549ad72e91ad0545d7a73edd538a7910934b03f9942c7e69e70a7987f2944fe9b4aec5482cd94f1b13f38ae22f3783536a4adc2f51a330a8595c400c413a99c3c7c87b92841c474a6266f4f990a7c76f6e90406a1b922d20b98b758c0d12c52606520137ab75b92fe1204ce168979ea09fdb5f6543c0349299ea99f47623b799ed2f6abf81c58d2a9f6054ffc7ca56363ea4c58571485d086ed13b43f3b6710297c010097bb6339ef398b0f44ca376b22579a6b200e3278b1a61062d6d5bef279f34bab3810a78a0f31c7fdb48219e594c19eb2419d97aa80234df22cdbaf84b1ba431f1125f64dcb3b6b614aa6768bb5e9878fae686c4af32e5161482d47209bedd363931efa113474b8184e0f338e2f26dd3bbd321488f36698711d9093bd8d11144922613b9d6955cdaf4407256020474b412751818d04f22d2b8cf85c3696bac39ce90738d05ac2b39bcc6ca85063b0fff594fb201f7d706dc8618e1bb3cd1e3c76473f65c2b68d749b71aa1637e6d2f87ca168d71b0f40e009946174eb93ed7206af3236137aee1f225caae99d14508db944feae1260d9976664c4b5ce8b52a82547200a36538270a077b009773bdae3b67b7f7f7b83195f6091ef273d19669e4439fa520cbf8543781accd68e0c29173b9c49a62effecbf4381e22c7413cb2e5d2d09340a94d1ad358fc9b6c163c8889a2125c079bf91cc1eac9a7d31807fc00c8376e3ce1cbc4eb6c9672bd81e35482e4dd99e74935e5b2640dd39fc62ccea1142ca5bcd39246d02c79e7efe40e4d514f05f0b07fa1605b9890723f24a196444a31db214ab0456b614cec8a7661ddc96b69f429e8442021e8d4fe7e7bed973ab3aafb30a45f090f0d48d83b4221e05c567062d027c4f69744f72bd6bd6e916a119bb852f992c26c58f44f0f7b605841b820f28eff0a4a53b28be6eb6454f2884a981d044425bac3ca68e92b1a14495d62ed3349f65c4002e6e65f493927ae56cfaa25a3d67effa6b2d05d13c1b819f1ce983f3df73c32116cb4be77272f1c7238fa58fefd3cfc70251600d9ae36a8c0066fa7ff55da9de1a6c0b425c2dbf31a77209a25d3d44ee3c809fba2d668e923eb9b91830e3305a40e3265ca7cecf33cfc000ea2fd142ebba31b7785537873fe152f8d894b6aac1bb9f9ccdf71782331e7f9c30d558449629a905a4f41e160c6af44decedff9f9552fc0ad0477a4d54a3bf0920bd053cc64b6c55e44952e4a1586faa87c56735c68ef444699f856d9390cf16eee6cf321f674d00fa9658e374afc7d5b63e3aea5688af01d667d48a2811c44a6b20c08c83c6f1a340f4abc8490d4d1537c578e6900b607db21cfadb185147d602632220e27677a1eb3e842bb84290e920ac0ed8bdd4fab9b8c87d17c29907211f68410cdda6335fe23d411f9a1d9cce13c7fe469889fb5d48f187e0b7547f1b1630d5a2848d0a92171b9eae1ac5a30e97683c01370ef1410502bca388844b43e1649524c91fc4c9416902a9f19bf112b0893d7da02f23d458a7d0be4c6fd2092f4fce906ca7d350fb508646af3d3d6c30b3378248abe5460dbaad59ff8394a3b3f094cc575dcda5090a534fc935427e88e3d74d42aaa56a2e2cc1d139b8a6edbd44352fe693ed44e303c20fc169eb9262703a55c72aaa7a7e3468e097de36ca1d73df98df0ca5f0fb2f49c8e98bf410fcf1a3fdf3843af4ae88602ba8e5d01dab132d9e1b76c360380fa7e729dbeb0d036d8ccfd1a328c740414279305f88c25dec776d15f178c2e5f15e5590cb3bb4d50a92ed73bb273b5bf7139eaeab515b51025f5f7f7b1b29e4074d24557fde0e9e44b87ee448aed6334669db715c00b85fef1e493428a919e26943921c1fcc5fae234e7fa261a3b794b29c40265fcdbc59a4611adb269bf2a7e6c03e96097a82e266db73d5e6d7e63180f4e976943db5b482547015102dfb5f98b21e008afe05e5833eb8faa124b6a77bb384baa643277cbd3888821631fe5979d8b19c6ca1e659802e7e9cd77fbcdd42d0cb5d3a34d822f8c25c3c1cff9e55988e847ed48d25716e10def86f905ddf87fb849cb3e8b2e4eb54ebbe92917584df72b9d043a6870360ddddb733505809e9cfd704711517450e27f058eaee313c62ae27989ff4dce8040d2a881feb97fa9139d8d611abca88ac7a2b871b7e2a58b5e21d80ca7da4821019b41fbb312a1a4bd74e960428c5fa7472d01096768e9e3fcec24583f5b55787f58a2451bc292b3fce7bfabba4b541feb08a5034b81940e75461de2bfd0c1bc1b58f37b3f760c5c826b93c8cee6bf93c46f6561bca70435ce39cfa982641a59b14c70a19ebfabe428c6fea55a1dc2d846c5c1b6316b1e21bb8e781ee16499e3b3ea9d8165cdea251109594a844d02e2d62c6c462fbdd478c51a4a272a55e9c4ca593a81ab78527739d80caa85e883227eba69f762c02d4ce343ebff7014003fd2fd9eb7a87dd490374f41dea37e4a4f5ac8d8c075df6a865f18df8a03953b99cb646aad7242ee1b1744a0a6bf05eb880f37065728b7dcfe3a846e1641e70841c69a8472639d91ded5028a8286d986b27adb5e2e211a5ff521a325bb40c26ce5b15e3c1b3fd8648ebdf149d5df767a3d8fbe924b50cf5b1b3049c8ad5748fa6e0bc059f8fae1191d3fc98f0b75846ffc5c406a180941435dd207d6be1e8ab6800658c15aae486397986a5faf65f78f97437de477a50ed83fcfb5892341e9c8919d8221117c511a829c4e268ecfb93a4043e7ed5817871dde7f2c9d29243fbe82c260d5d737f627ba76061bb31becec0c04ca37a4e7765224a3c98a6f422d1b05f8663af504a52936c193d699e443ea896c43e64168b74eeb451075f0defcb4d7ccd671798223f0fda4958820ad07ac214704f17748574766d8bc4b36ef6c184abc4c4b5b0e42a68f4b56c96831211de670c984df32406ba9c44b8371bb413b38407ba57765a27ae49b8ca9244955c7d0250865293fe77258c82b0b8a2b27ff0d7b2b8ea59dff1ae5d038cc822c3a76e486ea449321c18b083806c70e696ca25946782d690c9aec7e02c6b04fe3010026ba0eeab801313e0f65b22be233e3a5eaa5c09355316c57a0cee9a660459ec61dfb9eb678806e413252d441fe68d711ec88680dee7c95427467aedbe5e198824a66150aa5cdd8f06162717dd1e8a12a9e7d90bb76e25f1cbcb0b9fb50bda71edf12d5a3388476580d2f1c25b8a6ebfb655be5f6ee748dfad460c6e002bd83164a7930acc56142362b2a575c61e0b531c0bf02ed3bfb957e52b68acf2a228ac6af5a4272e86cc66ad7ae0df8ecdaf03d820540fad9449aa9062cf0484fbe2a1c743999573f55b9e14f655accd53cda4384a8387ab607c59c7ef4fb02cf1aec4bfc91af44f4a6a900dd3826614344bbd8953954ba2d45aae90d077533619c18d780f07c0e420c142193e4a61f924b704dcb001938884c7cbe54aeff2ac1ca8715a1e49d8178351668984531ce1fc625af9b7f832c014987e0024502eedc5f2f62d44caa1b02524939fe77f302cbfcc505acf7be301bb90486194ec450a6f527128b6b9bc3cdb822eef056301bc925ba99c3192b02583d7d07e91ddba8cab738104497da40970fbb222c1cf4e71270fac5b6933f3e611647f77c2fa5c136934ee38c6a59227a719fd079a863e66872ec60d0764c6301ac22d304f3c6d735c27c417e8d83d16692cc78396b8d34f8af55b42158963783947487e4b0fc4dba6a653e4c15bd62fe3da1a93d523e811517f0a227258559f0875f4015424da8280e75dfce6cfbe28677433636b7dc35d6da3aa1e9c8800449c56fd216254fd32f65816675e537d0315ad6eb3296f54766ee15346e9564b065130455abc095521260c3084eed0c741d43424266f69a3406a3ee905b84935fe1906e52aac86e036a50a975476ad69700c05a9e0bf1ca4426efe78fed37a895a4aee2319002d3064eea102b69d52647aa45d47e589ed1e17194cce7a2ea2403d0c894aaa6a663ff774c601831c4808b32063aa8c37168939eebb53d44b6236a0285471866520051f5a30dd8fa8646978840b850a0e3944a2a779bf4b1f928dc9b5c763a3e609b472665ce1e994ab5399cae9e054086f78f5cae1f9bcfcbc55195215acdcd404f883ca8349da1ba47c8d63bcd3aa2cae2d3737a21378bc7dd45d92e19d13a700541a2c4a53200403baa4a11ae991d7158f573c46af0c5eeba3a38ffea6e5df3c5bef5d6aa1ccb04633b432ee997ec766fdd67236700b504eabdf6db6c13cd7871ad2e1a5e672ddcf4565356c951467413e28a9b7e4822e738c60a34aed40a31a0d4bfdea5a884f2cd22071c1e6fa1225295cc13606d68abafe6c996c15e54961e4c877af260731a7d79e657e48e9a878b7cead60f2a3a1f11da44bba353501ec10dc766fbe5e2094f3f50f477e7aab8cda97732739d21a2417107d2c284271741ee409d3bd19dc075be9ef8ff143282f8e312ac36fb2bf3f38c642c0980f2d6d799f22aa28b8d6cf1ea23518adf9b97bd9364c274dd626d9387fa9f0417285b585d3a430f2b33d93e51a59c727733e0d69abf401c322d48170daac3e6261df61d541f68360b6f88aacb520b8c77d81581dbec6703905584f69c9dc65a94a0aae14f96451bd2f3de3f3ef133f89bdeed3314a0675f4df7de5e6ec2e6e33748de522a9fe7ba3e88d0e2769390a797ed59f0b0b823736baccc07b11b465963c65e047123391f9862cbee9c43c00766b728982bcb4cb602f13b1f6c157e3ef071a02a4010854a3fd7a4a8695265fb3e4b2edb1c2b077f33df36100c20e53a5e144edfa489d705c3fe12d46c7af9fa45fa435758ef225f14bafc91ee5ea4e1fd934542897688fc0c7c5856b45d4fc12ae6611bb894f7d49c5a6014cf4a765744f43636dea2d97aafc1c4a0e6a8c60b5275d410d12d18354c501c9dee5efb8b68ca19a5dcbd4e36c9e6df20d72eb991f91f85a7a898f4f841641cbc40cefe08d76a13406ba75d8c6da09763a190dbce84ebf09a17860869024474094198c5801940aff63962d5f6ed6061a345522d2618e0e380c82c1a9052a908ad146fc8fb35905bad3f200adbda7f6208b6a7e014a420701c4c589ea45af5255e4b365bccf454f51751146f6c64fa793369e30c107f908fab1a924b48a74cdc896746b8b9d3abb0b979d0b0363c28d17b5d7d2865fec11479dad6616ebb32e22e8506c2dc1ef3b21cbc6104580a4330318cc2a1d03b247c19e31e7e6648254f1fe7d6366e576fa80d8c84f4cb3c786e85740d52e89a7c0983d42549ff746439ea5966b2be3a3d2845e0eb29e4111a023b12c24c312c3202451090309b7abd98439e93e598ba9f7c998bfdd42e79c38dead0976a54c3c7a146df1f65d761be0bdcc9f4b3a71b0d004f5a4bd43c5e5b9e690ad14cb194d3a6a7c1bc9e5d0b7a0315dfef5bdeb2e4d7c5c82030c6e97324a4026bcab3c503a4faea5ee7720112e1d702efff5bd5ca0e220304711a58474892fb0f7fb5f4ba6ef5ef203adde825c693def874d17ab241f7a7fc7f10a8889b6cd73fcf5e1437fef7dc21028975f499f9aa0fbad4c3d99b76f08ca849cc2dce6e170bd916a7814961094b9d0071880692a3cff6dbe6ec1657260e8e9c4b543cd5d37a8f139f2c2f825695349d0aa710e29c75d7f7380bce0b0314b99b94eee98e33300a1cd5edafd5e5df222e5112fcf85f3aa165b2c6d6db47b3c3ed0b1b2907e336fa37b146ac9d31ecdb9d2e48f26a9f5f4a07954e384b8f5f307211580a0ff456746a7bb6933f240227da2516bb51c1b5119f6610a9007a304e001bd6f4ccde03b8ae02e843cfa4cb607f715f782f05311873cc9412b385c170dff1a51cf18cba9e2b49a8decfcfd256934c306948e37257f64d533579bb051d5ed502857b6b60e9cffa7abbc11bef011001d621a022234c49e467b0226461ab803d553abeef4ea9b0cd8c00974eecb42028b335115977ea954184dbb0b3ea6c32e2f69d6abb4f39f955ebfd37b56ea77c345d1e26117422f13c9f5df1a3f8196d14cbbeac9d39a0c8293ea452c1d381caddf7c2f423f0ef7cb81b0a5f85226a76bd01a0ecace6801f8ea5c2a621a2fc5a2aabb92b44f2b9f9dbb1a772cba5d4f1ff098cc1b770f73703f3c33fe6cca92502f2d7232a311997006fde6eca04c0999a3255bfe42f20b96f7f316ba9aab331504a711fe1621b762fc6e6b5f59218da0d16773b8701caee465715902001a12ff614541a64014297ab0b2795ec00e2d70aa767c5f322dd8f20c4ff49d667ddedba3fd190aac509c1a3f9d791b5906354be5c4dd8b06dc4379a0ede45ea22e02ac5e21f1a8027f43da5bb41ff0250fc5f341d054c5c053ec0440ba81675ccf883117aa5122cd6c177238219710b5309130c710fd0ba8e490e1b81f3d314dba639974b18b56435464da3e63d16c2609ae207c13290e54422d15fff00cbb86c727f450b6f2fd3b4f98a8470e5f831324126f307cae82f7f9c59b0fca1e523d70fe8e051ec7e1949ffb14c914abe88ea09f1c518c953217f61ce1c7b49206b17c2ee83b507c982850f27894508beb24ffbc2c4bb546da614f80d847a1a4c0efcd567d9406038cc9d5fe4cf6c682a73d85eb5660dab6f828cd8890a955ad2e0dc57932390661fbbffb5494cb27159cecc2f32aa745be30e477ea2f769c1f36ed0a336de4ec608740d9ce037e1afc00fa891dc2402fcb87d3a2646c4e5edf37bd637abd2719a0599ec0456bd172bd860b34b5d3d4ada9503c2ee7ea09f8941d2d30ca6e637819479702bd94efa704974dea453ef05bf1e5942d506049f41a1f9591451c6a54f0b3194db07ec01d48d26fd9b9f4283981a9d049a7ec8787cb724cc4b4d29e94ee36b5dbfa4c3954698e5d66e9186e08b61c30d36a69938902ce26ec659a4bae12fa1915e8a11866a5fb4a1fb4aa5888f888e9e0bd63b4e74059ad85b01a65b22660f7643d25a005da55f37c8e07442747f6ecb25aa8f06ae2fc100b2eefddc286c75f30d78340cc04dcb06064ca683967d8b9670a456ea526ed9ca13659180aaf16f2ffa5920b2a93113a0c1b160081e00cd9a2b25ecc14837498a924722c6261750e536ead12a12bf764e387ac2841b10d804b3ceef5aacf65d64bd7f8a21bf2fa5e4c4bd76ad3ec73a3cf4f53e5c60aef7a93a0154b20018975953cc188b9b034f4961708ecc3b1e0ee7d86985a968fd31378339195dfe8d2a777c97f5ece2e291b5c6a5ad6f3adf65ce46d76da86b57e5037398ec67ab07fcc4bab4ec19a12695e60636ea66bc50e9aba077935bffadbb2add9d7d66f2b2a3a072392d10f3d28a5eef648561a3c81f5c5f69eb599848e0248e1a3cb7082bb37c981f605dbd8f4a54e988166a4c1a2d9d14d5af5c5a60483bc387373b3e207848c3d7ba14a96afe21ee556a25873030cfbfb94a0ba2e786017488f7af6e9436f7ac8591c317037d899112aef4c4471d8bc6fbb61033b435d60f52250223aeb900269448d9ff1ac4ef78045c84b81e0017b4546db9f1a762045087a984ab35384d8d0acab82159525cac408458a1999ebe06cf18741e563a747160f5eb5eb5ecddb958a9e3cd4c7429d44450f16c2eb69dd4517c2564995cf2078fea67984482ea59cfec464e63649f846dbcb41742569b023a7a679bacb9d0d50aa8ba4398ac3cd63b345c0c404af02a13f830b4a2ce6d2f4d93849ebc4eacbc8fdec400ed354708eb0b3c40de969b25e9ae1b65264d3993aa6109d4072163d0b800cd792c6a1fc477a1e9085d5b7b52fa3199c5b0ffa4ae5f1e0bcb3733ad097065665d5e2fb7adee650bd594f64df5df43290bac7468c13dfc6b353bc449981ff66cce55974e51e87a576f540c1acf8789c3ce8904d74c1b7eb13597755c286ddb92456188cabc6f9fb3ff6714ebbaa64984790c40809ee3e8d7ec6ca8f29a2560e6cdd924850e7f629494a7cf548c84b2cf73fa870a49a4e44fd8942a60f08cd08b7926a1b0dd187cf6f7ef56f6b4c67c887a3b00207b41f1788c96428d7e781f9997451ab0a3fe8f4f89e37180dddb3cac7c064ddc13fb256c248b61d502db3982ef9e451318286af4fae4faa6bd0283e521fd6395718a646f598000aaffc3da826b6276edfc1d024be0b3c4211f10ed443301567dfa61ca465b401505571eb58ae63e8cb2de12c440a40c9a50c32a6cba805aa4683c29d6ffe8d3f9227630a68bc9a425a10a4d148e7a5e3ff13e7bfe7d36c725cdcf0dfd97e9bf54befb30733ea963c4247b66af0e4d224c6e718e0a9c4dcb9bfc19e885a49852de67bf8aca699661e02392bee1a021b8b01286621c7e22e8191e7402c29032db30f01749cf70d0134c18890a89117c89d27b61a0138c30498662047e22e81b063a020a2f692846e02d92be61a021a8b01286c288e54d6d150b47109baf20d40fec056d1a9cf0093d8963116e963aa57a8c56acb69091980de3b107340c351b98f089f43dd809e25226830d615bd44394633a856d2953623510e1233571db278e6288e9461450d15caeb8e7ea237f4b11afb85dcc8d2cb0e2d23f0005376c0a7971eeaee6baa219da763f11f33247332ce2d1a0d41de3a5a5e36c648568bd66cdf92a537b431198061085622f7d80217dd5962d1e5d5232c8627e547ecc802c8bb11286d2a51ce32dc4088de6d7aa46bb2e0c9b3f0c752031ac7f18faada1502a9ce1cd2d0ee12360f8ae8396c1fb64d23e490179c22a22d4a8f537f540b9a2f192dd3b9a32d05cde84b662b66300b13acd4c54b8a790ca3bbd791d81c6bd78f02841958b1ad5f7cad9c8864bf700ef68322ef1336a958a09fb4ce1b82b62c32617258adb7718841166127f94a7ccdd83411ed7ccb0edf922a847b88038e069543d94e0fc4c990562033f12a4ac73237dc68013bc6c512b8dfb302773410b180448e3c5272c996dd5975c9d27711aa7c1f24668aaf781dddbef302c26aa355d1f49d778af383022c30f5148c8db1a657f309503beb8f39926dbfddf90b666db89441e3d934c8256524600cc37184f2461e1567ab8201792424c676c5b9d807176cf9ea7aac8af5e2f4359f43fef588104e8c10307c13916e04057d2a2240cfd527a724b5623d2944a5a7a13aa90c390953a0f582922e1e01b27b3f1b3459cd0cc6a3b7d078dd920ece7a01c9a2565c331d12c0494be6d9a974b4a25552591b609bcad65d62b715d755057e186496460f9261423f8814bc74e50b2ded8635827a1b6738a5dcce9475b3718ec4b97a7f3e5b4400dccaa0291bcd63941ce0d462b36baaea277dd366d448761008b1c94a11a079f754bfc2514f6b770fd0930cf946a760e2fc367aad2c04558cb0eac08d8bd21b90997d777c54e6a231b3e8479aba96cbd39dd8a44f022ab2598052569a309e7943066df7144a625f338a8d92367fd05f8f14c084c7441b714e2b19c6da6e81d00e5ac6256c2f413847c1e9c53f196597658631c3950c8eb02f99fd4b2231c13a6b86c1a473d195ce8a220432dbe5cc0fb8329131f15f4ab80e62b7157266fc1fdf7f280a60433e4040ea4f00c832c0d0254960429e2e6626906233e06fbb8483fa06423f9a45d174f5cc484dd1d4c3ec1b6a8639809dd803f2c3d29bedb580657de571e3a71632b8f8197bcc2edf00a7f64127a50e0534c540c7d0e4e9e6f4528f6484f9b720c89e2beaac8cb16caca4c09c5f56596cf0b3de4b72d425ee8a4e8fecd4a594a4590189697b53466afcc5e2e5cdbf645de7ca2e2b91fb73154f9027a5807303379e2cd45cad0f843d520aac4a33b774a36b8131fc236f95eb4e5d71ddf62f62cab56685c33c2fc7267fdecfb88a8155abb19e990fea4ba9be72162d4f8daf55e75de558c6627fb99106f968813ad68c0d850bf9b590305c9f6268972137127db125d93c8550af64f2313d7a41eac801d9594d1b51ee92a1b48f8ccbe6173cc4e38756471dc6896d4379578c4c885143e0f8ffbcb4f188739d1911f454c1f46d2048cd776253905a4ed2f28c7dbd71658f71e18d9b3c163376b09d80ddeec671310f5d9bef1711705b0d28d2cbd54800973e35f0caf66e66ccda5378450c2b77d233ac678daac5cf70904316332a54d5138a8e24a487c3aee1b981cfbfc166ed5af0266a5bd488aec137494ee84083390d18e98eccf7fa8285b5aa27a7db8de5643f23fa782951846592d9d6d8f06e707b27bcb593328d06421af7d0a8b19193ae98f275eb71376e3628f229d23934b40d6695bc606dbf4e24f1a2d7ad23f0d594f477aa7dfcc9479bd7f3bcd7a39fa545f54507465b985e188e1705c41411b751b03d41ecc92adc1d0ca63ff0c79da27a0e0b3bc356f9f17eb6f7f56ebe9799693498c82bae88147c4cc649bc394f22995def553316e8f683277d77fbf5915195053af2281a9f6392d76d77f26f3d471cfa23f8bebdd2ef55068854196d6aa2c34316e72196710b0d1ac86b3cc3c09d9be953f5d2ecbcfc4b70ce7ebb3c9d11eb7aa295565c10dc6fff3b658e09dd1f17c1126a2ad95153e0105c44e0995525fd6b31a489eaef57bf031bc32f60480d80d646cfc39acac6d1ef8924a4c2ca280d2b96e6a95102da6e50d5eb8ca2506f1996144d7a1311b2345f3f882ce54ebeea884b5e1c947044d42e191567a2f7c8523b35da46ecf318b558cd21459c7a9307666d2a6e86939b55e5c092a06c9c82e7d0558d875bd2ce07d8f57a091793f9bd07340f649bb573728d15fb1fd760decb11a0c1d2919b0caa8f0815e7bb445fbb932f7975ce88d2906bb2f71d5c6f125ac4fea668be14b0248ef4bfc73101b12bd2e875681a7c38b55325cc4609d1242a959fe2cb8959dfe437429c7c70d90871ceceaf21c8f936b12a7c8a9561b5b7d9f1f4bfd494cfbc35f693e402b0975c781c0f49e6c2ddd6511e8a927541c6f90642b3b9c0eb4ba4f6311c458881d42bdbeaff91dc9a6665100a33e90217c03462f47094f6ab7f8a5a2c7330ba366661f2af563a880e782fc777dc5bd582b34aa298ec17a0f2bce58565038480b6cfecb644be9a5be7c071901fa44cd054ae43073dc6ee87968b6acc625d8e8b28010ac4858b723a9893ffe3ca58ad87b6839e7eae1abfa4b12e5055e015f3c19944fb97daccd31c5c4db02959775e2394a5c00ce56d1b1abf603cd6d6dc52c285d3222eed4902ef75e4d575fb7e2c8a11272043b0f638fa4e99eab4bac58c7cb3f93d71b0a351ad321b185b32a67f57d5ffaa8794f9271f01d898849010926d05c5270a0323d74e94227bb2c29d224108a29b6472982f852c014b483eb1f9ca4b5ef5a3451d35fd39d91648c99d225758af120611a186514633b00341ae6bfed38632b73f54dc3052e51a2df60244b14cd092b6eb66dd8975108a174c04d53530c25bd70bc3bb7eb4c4ea5aaa563cc62bf53c5c759e57c23aa161b1157239a41a2c16d8feb46905c8a81c785503a8872e975b93bf1d1562aede24a19715b612f846f890f77395adc680f738c12c89cc56f39d719b3bd76eff548e617ed0af98e3a55f7c6e4bb9769814e32c6ef5ed9e83e2a74a3b6168ca45ac24510bbf3e1d4d5a8cd30302b5aabcaa137c82ea0d8b15d175d5e5ed26330d7e45a36b06174474da6adc3b84b81e1cd8b78baf623f35005e94780adc48864ed01b560d6aa33284723acebd4f3037042faa90166aaa97cd35f861909491734fd19ec9b8d4b12b6fd2de0690121a5c044a496717257638ba99ce7c76aa2927cd324878916f6bb3f2753bf083b607c5549fbc06e0a26a9a9d3e354018c313a309344b378d35d310d90694cdd153fcde62c3da184d48cd573202aa4df15cfec4387e84b2f3608ca3136ae2ed954709108c356cbabbc8fa1f96821429a182a5909ce3869ec20339a49b5127e904478a65314de1a8c576ea16a6e3af872de6cdfd85fb3a11b18d825ba0c3efc74fce4c0963f6fffc82f9877abaf4d346e99e4431281e7ee89512b105ba529fa72089dbc89b9a189814e82eca59642e7be158ab42b60747463595b82869cad05fb7c98f10e34b4a75982fb888172c4919a103d60831138d029d3d8a0542280786a53a3205b503894431a586369a8b1af536f9a28f018ec9738a8b18066026d57c6d89a13271384f4b2a103738100cadbb7e9f51cdc5d1658fbe7be783d0d49ec3409593a001e61a0deea2f322f015cc906a119f6300d2179a9f69b0be3db2e4cc3cbfc4577169fe270f85eb69c87de8f5f7e310694d981ddb59bc144729c166b88017aa7300618b0f6018a9c8e69304cc0dae0963cfe64f9342c816ed70a7a5fc12868f06271b3d9a33abc4f60b410efb028efcb0908df129c9b80c72b32675d11343b194a7ae40a8cc090750b8c39590dea6ef185ec9470059f7f33f906bcb13e8f7d190b26ba891d92c25adcf8f3f67409d05b8c85ab1f1e0d0e079d1da5bb6e66adc4578b11c2ba1c5cbe1b9c3b4fe0cd88058db5ecff7d90470453ac6ea0968a0ae2be9ad1153b5d5e3a4c53663534b05c9eee87bc06ce04ccdafa49a3145fc3407d1007fb15073247243910c9a19883a7458fa01e2dcd97b31f688cf892002b315b16b564579c9bff274f88b14d3f3eb2230bac99be38da66e7d4b3d13c9f4e1c6e2624bc77417082ce73e2c5f86d85fcc7558105cc931e7596074d10f21314d4306a224597cdb33170a2ae46799939c54997b457867fb650f1209b2ee488e08da67ba1f2f80f92bba9a483e854478004d7bd6893837e041bae33b045472d37d3d7bd82db85ad4101c04c95b03be2340d15af2f75ce569b5be0a8c1af7d0b1673417482237ced7597737e197e7181f4e7dae0241f9551589fe8b5cca120111170e6d6d913e69f0544312c7de3a0ca81b1cb0a3baefd7fbd3324a8bff62f04a842faa930a312719a14094f6645460dc8b1a724340c9aba78552cc169a053a8ecb0e1cf05fc1375e6839744c300844bb366e92ab2e835d45c1a12de0fe416278c5204d102284a9e34620501519982d910be774e1020ca0b42ad3b4e67c01c7a410c651cf92586babffda72b8763ed4a0126b46e7a7270f4ce32efc09f49f15a6f28bd235b44a42f02199039d7c60b22d8ba073302827b2e8441d6cf35e4c7e386a8e37e02c2342fc8964974e240f5295434f1bf94205f0fcf401ffdd99a0a339d1378fcfc6dc0a26c197678b8069505cff86500e5a1f6170e8a3573d71d0cbb7d5b5e690d4408af2f33a43c4c23db0493befef59868eb194589285a743883ed4b925cc1f9618684588fcf30706679ac840a4391161a4fa04727ade13ada74e182d1dbb5cd7a3166b8c93a6f6571054eadf3f481eeed5f440c628b7031b58272b278cf02e1d8e35270374683c16c26d0912cf4800434c2eae436c8b2f606b6e748a343950563446772c7a2a2b6db86734ddd3bc483ab98435d6bd248a29e6814f4ca371e4dddcbc570f19396e6d32f55a9c62e6a0ad772c3cefa3622b1d1414059a48b11c1ef1a5199aba58df0d4bcbd588c6e10f47ad7c69905483fd6983f565845b1e257753b2b9e90067dc2b25a58e700daee8e81c41a3dbe42155bba2db72d40726dcec7dddb5a30cfbafbaffcfb63df7b5f8ca50081931e864671738bb42465c90623df582acbeeb626158f2993e51e5559dc83463b3b2a9e65e7f9bb6c92763e269066bd9f3dd4eb3cffbab2c079112d4d0b3835df69c48ba7c1fd25c6cb787d028f3323a1617bc46dca11b23b9863ffaa3b1cb05459a9aaecb7ef2f32ae632f84ef80e16a418fab5d1f8d45e2fa0cb29d9ff50976794011f3916ac757aa3844081aa14b5cf232d9662f7f40a5d52e107372f41280899d005a8b601000c66170c8c23f2bdd25a431283d3a09bd830ea13f400fff89ceac21621aeb0a1034e59e873909038b91d023429cec7f9051247ebcd853c188147554941eb1e040fb1809066cb0b2273e56177bd84a6d99d9435f06acd4c71009e30d8b5a7b248063287d8ad4e317bd321dabd42c51ddb8e8e989c0788f2e553c913db782b890d1bd109b41bf5f8099028acf0429818e9a64261d2a20910624841e430e45b08dd0cd81017d3eb6c61d1d6e9ee1e8b1e05b17da1a30ad6d95a146317d5bef0482e9003340640c53c63e7e3e24359cb69215a7ccc38d3f762da0a924407116ac711afaa7b6c0f94790ecb4de45ee16377a07f540f5107372e617abfd2842fc07a81899198dbd4e5691a5d92330b524f2c501da97b6108f886da707271161d1eec0be1b39cd47668022feb5905c59ccd1dc68210647d51d9f0e9d43101fdb8916d81647142a84ac75715067ccc706c6d670d0c0a0a20009c2c2a3b21b0edac7edcb052d93cf7bf40905562d1e59511d572d5e1f0478f30d2ad290ad3f9d0c58c58c5e20803aedfeebdaf8ed8b63d66ee7b769579e2aa0b206757f6c255a70b67e097d48efd6852c81ae96388f260df52bb7615cd52fd1d982e99129f17223201907d9ee14f9d98864d52992b9492d440e7065db3c0b12cef9ca06665988967d8e515303d4ade71dc02d60c884c1819b03ee2dd3b9d08c6baa99f29dd912844c976bda9ca5b5e578f7dffa276e23f66458d98d3c932303bca598124707cada9dc790b6074ea12a9bed487742301198eedc5c434a774618205a0c6613464ca964bbc23bb79022c597befc802bf3a836f7b8c943ef25da242d14455eb7be314c9b5299262d8290318986d5c79a4757fb77d4995723993dd1108c1f56594f94a8e887d0e989da89b80df687602e89d385a31ba9cbbc3930865f125599d044a17768ac294b82cf71d809d7800a3bfe16783d7f70b7a271c96f5af5ae623dabef92a14f4e8fc90aa25e414ad7d46d1c63c8ebc8261dd224e9ab74421562cc7b257d2f21e4f47b1cf50225f33ea4f5089419bbb270fe2949a4329ba6ffc93f25c3919b3567df01684042e49e9c2df19ae443892f1164820df0be2d4f122e0fdaea8934908b17c4e1c91ab32a97af533ff209d50917c853d74a3daa5595871f4fdb4eaa4ccb3aae4eeeaa0b2088405a399dcc5ca3f2ae17c8909305372f20c7cfaa584ecefdaa44123d9aa6a2a38e933f0330141bdaf1286f92f70f9e42945b406f328f9583b6225ba184ddb6ec8ae4fabd3e34398fd7c5a7ebb9f6a6e04e71cb66d93ab66c8d70ed44af6dc9ed888bb1e948fbec7a0d0096dd569bd6b23df404405765302f3f2058a5a91ed1e95591015ac33c2a6dd91841c0c023c19a6e25d7f2277b65fc6d034e140550e998513b11f484ed46d6909480125d4d9ac300032086edf59468e0dfdaaa06c9d2f31093076d1fb78b9626d82b7069ff00ddd2cee50150c6a6298f77d910087da20e8155e223df9da27c4913f63fbdcabe727ebeb8aa10586f7116d33a1c0ac3500bffd27a87a50808259a9c2ac0c9199ac8ddfaeda3349b35f04950b0c089a1ba875445de57c786f63020d643d23550f7732a3f99b3e044b35264d85c68d7ed8f0ab9f1bc663c57da6a5573f28e449b33792b5eaa0bf5c8e4d12626ce752f4438805a52ad100aff8a24b86c4d17a4dcb333d3aeabd957d1d7b5fea1e0b7d275d5628b2dd55d401a463400146aa8b138fad6b2a6f3555e49999dcd079a2c569692e7832a5cce30e7694551b7429f94b2b029fc49af9e72f36f547ac7e3558794d940a9b8e77a25d40954199a79098e06a0b1f3d886d1541293e2c7e47447e210c6edeaae1029ceb5a919a9af0870d4be21f8f5438ec0e0a9537090845abe48be918cf149c13572124716f04e115fda1a6ae6615b180bdfbb0d4a24dbfa50ba54bb2eabf94269c956255b5ab2eedc3963f123a7efea7f2ef2e119dce255867dd1bc3f230e2342e62b4d9ee1db4666026120d029057be218cfe6f47aee22636c398775a4429929bb8907f52732a72f555c985565c114d8b491dd097d09bef502ed504fea5cf5aa1ddd2794d35c842604eef18d41a97bf5da8ec39282d395f0c27269d9e305bd2acf009d6de0fcf9389d2d9cc8c8b223d11c9bd42953d5fdc646fd206ba2f9910d2b94795a50315d6f3707b9face28d54388d71d4d72e9388a5d0e0a0f09688dd91b8899ac57cbbb2f0c7ec39d93e7c15d2717b6e151c2feac0a96a8718e9c6102a078ce3541d5ca3eb59d21a363e06d63694ca72c93a7a3fccaae38725b4d9d3fb6d0ff189a56fe4357f923a89d68985d2a4bc02fe0c037e99e7ca90abf9208078bbeb34563a8958d1219659972ddcd473e621da0224118f47d733b043b466b7af12ffb420d32939bdaa930919e569c47d1237e6743b7cf65fbde4d95f81afd494dc05e4bec86c56641d80455034b767f277ffa5711c605f38b7b6b8be5b220137e2b7c253b042ca7b7760f33d758cab9995df5665142777fe66d1905cfdd4f6719b6b2f1309a97d145b40c2ba38c0b4ae00a704be9a2bb529230d2e334239d9a210a104cd971e27e3812e5e6777285dec05913abf4a9bd02940f8ceb07dd85536600b980235a5ded837254c550716310b06227a300b79eff7641228e41c071a857112bd18815d65f89b5de43511080bc2000e3460e9fa6d6e69dd5053622a13f06526eb460478229ca08e474f3ea2a707619fbc89083def798accd459758cb1ab1eae0e52fb96ba5d553ea94beb4d616af1098da0f4b2b40a164f5bfe1a5f512b93849d0a9eb587869fd47ca8991694dbea9aa835f4a32d40011900a38e8f76a2d7bbb733d63d7ad551d915e8fa342178eb60889915576d120fc39b8c5e3d01a6f97213525a9121ad0a88066ed46501f6610172a3c0ce101d3a6995a57c3d855ed4e7776569851e859bd3730da44d1d9db3d45ef105575e62ebb7e6400cfe55fa3a3974d2bc55dce589c043a1dd351933ee474d85dae0c6964abd67ddc150b1e11d7aa6c071a002fa1a189fbc33ad9aaa586eea5964bf78aac5a8c666d9760855f70225918ee97ce10d7000191230f634d3eb0dd6dda9e87defb3aac5e38dd3c55f47e7f2168f73f0a97ff44db5547b4af238e921e76c2c14e9c7f44717f59bc8ba366c0ec1ef192a7e418becf2af6879b28695a2c714fdd98c964f3acacf8c06ea04bd8b65884d46d496c22db1923694181b3a24a155cebd288fc9ab197d69042fd4e4a829a78020c751d9e87502897f804ed19964c690972af1acdecfe06c56fbef42915a52413491d32b6726faec254e4dc4ba08556c7a6361eea88db8cedb848ff7d1a06c4b01c3f7662c498e6fa4af6b1c57dd7e7b4430b3401ff4269965d40e87a88e21793f5676e2a344d60d580cde611a46ebc753d10dc50652e605902ddb6043d7357932f2e22e9c523ceda28fb9a1638323ad96be9602fa54f144ed734d6a81ad9d0f6bad4ffdc8d81b016d2c50a10d5eea62ccb6b5834e96837416e623920cd19682c966ffd0cfe46a132b46065ac0b1666e424ec422147016b8369d9f48dafe62992594f2b779e755d1cbfd1ea6e4e8b1fe770ea92686f40c275e8ecb8782ab43e7fe9903f0a91128685ca4bc7c2e8ad9c9913f9fec3227159b38a6a37f2eef7161d160fb49bdbc27849a54b45e07efc62f87449645c554500ca0f36b0e151d35d14db9dbf20a30515fe67cb2264a0057603eaa71ce66d135e07a28b1ca8430aaee10d19355cbd59594c0aaee8cc7fac41a9a98d63f5aa539b2c7d8be068c874ace40690e9470323e1dab60b04177a74488166d8fab6d3a0a0b3bfbab57e72d66cf61a1c15877a7a9731a17b1b8d8f7a3ad96f806c191ca954cfb5f5ce73383df08a5dc99ab94c3343a820528bc58a3a824a01c967ac4196ad0793f63043953d52f6414faa94224bd40cdaf2e2d88966ecfb8aa85ca040d8bdf34bb37c2d23c0b5f4e52d7af13447df5a5cabfea8c188aa09eb78178b7504d5b3ec501c175706ab31cde9254dad935d8206f562696f7d4f7868cb9d8120b5a2f4ffdc06da6a81bd6a4f5b0c4e56c3e2447fd164b42a7cd03231c9f6c8347466f119b98067d980432f3904b294b7d900b5d353c0af6b263c78d1d517660c20ce398d35b6caeedff8780d911a0a222862c89493214c242f7794b9bd0707c38a05578376c2e7a3205a7674adc263f456b8dadae05cdb63f510798bf8eaeca261f042b504a1001c7723a127a3e4a64d840badbf8b81e8cf90be432a82b7eb5e22cc6326d4c1a4c8336cecca466548c9a23aa92bf882601be265f15ef055171be77ef3e16e35628b01e8d64d895c8f38504a87af34c580b4576f254311e0e02c2f96a35146afb27649c4001b96080e7693784f1e0cdd50dad96dcf58b1eb8e711378429240d64e72b16d90cba21b78facd888cd3ac3f8f1eb1a016162b700afac502b27925648b2caeb80b302e2a4f08e82e4c4968cf6f534dccc56784639e2be6ffa11b1a62f0e5a32eb4253f200fa4b11aaa50c97fa5609af2358f0ea88fe5bd26e48a90932d83424a6bcba79f7c1a399f0736a0c2e3b81d83270c0a62161857477e58bc6c40adb1bfade7ee7330088545b002ab16412f5929455152d3fe881f27080b5c5643483053dde767393ab12384a486d3ea426a7de3742543a08b59a8d7737a495c1b67bd4adfc2b7e279a344c8802f6045e9a6e87d26db7eccffcc2209766ce1cec201fb2faf180f93b69f30f3c031b38a77d86b3e5ee2935b0f9c310e2afcfdf4b1466b652cb7b8ffd82e6ed1734f9f6719cbb18dd430bfe0884a6bd1b8fd4c9312a9ef502f48baf5e64a161dd18dc4c2294a05b43f4a0bc2143093268bd2e202012f8359d7db5dba142d9262aa22c4c4de8bf0be6ce48eed2f0e1bbf4317322ea1d49265aa5747d48fbc053f7da1c16dd8be078fbb78a988d5234633331437deb9e0d7bb86715aa7b4ae57c3e4aa5f6c45d24ad8e8e79f7687d93d58f983ece17f8fa8d2814a462598eab81111efac6133b48bbc8395060917cff33be81dd872625d76e3436cfdd1416c428951807d4abf44ab0105bff7b5e642ea7af4b3698fc254c5dd0ca2f50107abde82b6b06f36b3685dcfd0c1b1d0c54e22406b0e157fa3c935548b3e552de99c70c868f7e5513db20ab836fdb6a83b38dcc8660524fbc6b7e03760f8e3481f385c2dcf5e55b9af247fdcd21c8cec726169ca6b4b2839338d61edd78892711b345bbae19994187a8572661741e143e49d5158896a38fbf9b3f70a1ca0861e7dba6c236035e2014d401de6cdac3c56f0a3d5c27c388d564913b915c0ddb1b840dd9d983c06a3d562d5b0c95df0ca0cfc2176861f484954f00d3571b2fd423fb2b2ee1c3959e289f3d0b3747d559f8e672957496b1dd775d477c320ef0dcff2b67846ac61b9935be32b6742efc25fa461cd233a06ba53640a69b25cd08fc579ce8468f6c21d6eb9467979410d220dcbabd66c9db70cee967a2922fb6cfb3bf2e7ec7a8e1ccc04eb69b1b7bc405b68c3533a437343313e76772d74b2afe28de0594900d257c4555a5ca71be064ad98f53fb7a959d01188b0499141c33512831688900294d8a455bc7002a22175cb445d8c3f4f3097c8bc938e63d30abb2b7a41df08b4d4ffffbd4c587833213a4468e72f30ccbf99a702b51bf7280bf6e7182625f8027b984124b9e24cd79e62300c037cdf4524884200b30022ff97922a8b78a81e2603f84408e3bf22b9b36f79aca827d4bf83e7d7d095af25e17d46374b1d116750006d1aa29ad3f6724e0ac2c4d35941caac96d2de08047da314604eff0e00eba6cac3ded427a746b2482c98337b90da84ff3d38240ba6799505518a921d462036c39e569d2d05f230257cbdc8a116a8ea1d5e73d091937409496a04e393d4e72973aa60efd075836141fc08667e924b2f238462d69e2a34fe113e82dd885934a15001f7a3bef6010f8847f0f0070ec511a05db68abe46b03c878a8feeb4791cef2971502f75e0cc208460f2cef199720e1e98f0722d580202e6ef66edbce99b4da37969bfc186c3e9a26f325020f83cc3c8b01c5cf14d1be07bb7825ec9be5c7681c38f6b55bdc3355f6110d09dc4956a2094d3b1ddb6a9919888b9fed15dbcdf241bb8212dbabdc9d40ae624c900b4728f73659af855a8b9c387c9a46e25cfe4eaadd40daee0514fa266d94d7849714acd452370c9f9f8554f87af96e4374d1074690f6634762863e6dc1a8a537b51ce287bc2dcfcb88a21d17bf8379478901dea143856c425081a899b0f6bbc795e86a48bf0ca2e9a0dc3f8174f9760967a693082ea28677d124697d865422fb9314626b00575601bc4fbd6418a8bca1df1af4a7aadce92fccbe50b727fbbc3fc8607d109c1835b8fa3b18054af9a25776b165ae7f279c5cf60512295020cd69fb05bc5fbc40b574516e851b794769be06f596371abf2e5e1128c917924e605543dc65eea401fc063e9b9fba6b902b8dd37157f8771ffba767b0b78cba337251f8ad5f811fb9a09460a0e01f61b6380c7f5945b82fadddfa80591b87ffa83b82ab08dc9e2f9c610152f655ac54808875a211d5f2643a73d9a63d1b060af00afae40373d02e225e95c0664414827acc014fb122024fe24df04fcb49a77115c745fe03198e3c785cd0e9a26fda68ac22549a12a03e5485e6d034266bf21ce6a19892e973fc8eaeb236a63413a7b092dc730ec931a016f3482daefeb387cf3aa95314a9ee52f61ea971fe3c0f210e3caed6f348500b8fd70961ffc9136af7e2a6a54b3cc3f36ff5bdb63d81563437ce99cab35b4880632b319e12176caf38a31106ce6900b2142b389e612e0f52cc08023f04ceaade0b63e55d2e443dad5f01ec61b31142582e6a869816598489b59a24090246ee327d32b4496326c71c4e78154d03bcb381ade59185710dd58d4e221967feed37a5d57a6205987bc06895bab7ed28a4311478c2881643b75352cee10620f60fdff36811fe64552da9559d233dca571f50c9f06777a51de6e95d968603ef726aa4d4c0df573d915a8def2529ed64e12b7c08a5fda9453240d043a54c8621010ab32eb1b62465ebe86dba276e9c0ff3f277f43f9194c359dc5716170d835f03e6639d9360d17ea7420884caff1b43d2c92312c9c4b34977e2a2f59b25c6f95ea8f0f3b4fce80d89d6e104287e38bb428913068bd664399ff9d78582424004ce9c4274250c24aacc20d00de1b806eec299dfd3649098e13b1066daa227b7a5cb02a8788bf0c4028c34c258776daa49fdd4b1c1b6b5c6115d9c2b99f3832f4cdbe08fe00b208f31248436e3f5d89bd4cc758a8c4ee0ca6187b16be87ab5c95b1f255c8cd3d52447c4347dee9bd7ab77c44fcb40165ea01d4b8b5051ad1dd45610c91c02acf2c2c3ee1b49dc35b089bbc7e3be5a45821df3bc99470a0748e08591ce2e2783b23c7963573546d1b8842383f2e292b27d70585e9718917870e96a2e74aa64ac03e00b084a1a1463eae9bc2359e383e359970082f0dd7b3120e9d0df2b31e4940251fa517bfbb6cf87b3e64f0c4b2045264ac1b02b8e8a1528adbd92a09b898a5800b9305dcd4046803e1e7ac581eee1098a26bcf4208c381081d59880f1d9f599e6d76f69cc2dedd07de5be58395e37140b2d34c8decd25971e0732f02b77b91cd333b94bd0be9cb907dcf7c342a4514bcd3fc8bbcafa55011c319373488d679104236356d5a354a9f80b66c4fc7a6220d5261cc030c3e86a9dc262898a8b7ba945ff99ec3bfb72871a7861f5d23c4ea1c1baa00a7638a08384adebf848d0d7da552a6d7870be16153fed2b2fef46264653237f9d98688a12ce8b3aab7bd1a66424f0d55f310506863ccdcd65aa5d6d45020e9939fe907210b5028d30723450d5bc37532ca502160fd385cc4c64a8c19987f62e9a4c9b8bc430fab8952780d4b56a13a509ef1d2ac2f9421be1179e6f27fbeea7a5f7925502a82b6a4557554d64793c2150e0041c27b01e1d1f25afe6b94e0b238b9bb44c1705305bb066e76a410f81b643d4c0d2c9c80ca95a5013115649242b3ca8a6e8e91d84a517a5c628267a715871f6d2f0c0c91d5fa60dc4132ec880fd8e469c7eec6dd12c0678bb32b5227cca3ea106a410f6854e02da4907016237eaaf0451c92500f08799929c25688dd2aa12ea4d11b3e64109711294a348f9caaaa1c92743391f80c1434930ebbef16452f089c909d50525388b1265a59f020fd2a82a08bba3553c898a1e3980e58600f9d41debc57042985a18144a5fc32b554db68865cd184a8b36e6e19b20d7cb05988cda9e3f6f66df6eca25b21d16707f6bc501153b43e777a6b6a897a7b3003062b7e064658b731a520775ef28268276928c6e1218a9e61402300e19286c618fe44e9190e7402132e8942308647517a0c078dc08549361423f011a1df70d0114018c932e71ac928a380a54db6528ce54f95fe1b0f1d819497a81118c7ab483d0b131a012997e40846f122daf47ad687e5567eaf9b336519069f48f853970fbf16cdf1b20d0f7f11dc2f40d19c391371ab7100a5f71a40b73c923c8a81a0b0a92f62a14371f8db6b0f29d3e0441fc998380c5fa909d4be5103710da2cd5a8b568c7de09086004a201e6231446ffc5a8c8005d8405c6260886e66d729ca63d138af9c6f3db46f1c0c8f937a013def312839595769c5e1eb212d284ff5916e65219f4794b9ba84d2832dcb13dfc30c3b6c9f8ad974ed78eb322e56c328208b7c49184aa076e469d5297ba0149df29e6c20ea07d88eadd233d1cb2040d08dd1d4ac89d223da7d777a947385ada5f0ccb36e6127296e1a4cb9765c59cfcf4b0697e1298c3c85b9be6e7212cf9dc7f7d1d4e57c7d2129e808a61564825e9d0efa8157b8b4356236b4931dc95f003aefa632fd089b9629e7021e4aaf1859ffdd57e38d4d8ea6a5279da3904c1f247bf733a33c93f08d3c8567c3a8ff0ea10d282bdc48b0145a8751988e3c24a4501dbc36b3a6801b7fceb171082abd59129d13d9db1992ebf4e80a3ea51a5e6d06256afa467f93fcee106b7ced65899a249d8a12a656c86197d40ed11dfc781626a584e4a2d67b488097470c33034a993286592054b29236959c9434184c797fd8affb2811f96fa8d4e724919982f00de7d35ccb81dd98e20514702941ccac339b05121760bcb4a32bfb65edcaa84bc905b3a33dbaec0a62cc561cebdad4c6d6166db746441249492425b70c980872082008f26b6189eef20c52e6b834f58e15774f2268ffb814a378cc97a42c715806f9b2a22529459196393ea1adb84fe8f8145de608253e117140b913867c820203f2a4658e481e8b4fa4cc0537f6a0fd7d86967ebdccbbeb1de6fde5fd91d0e03c31ef6f83f3c8bc7fec01fe70368620fe1081884ee08feafd6310f0e7be7f1401fc81bd7f1402fecc3c4dde4b34cd4bbc5b4ab8aac4724aba57e2bd92ef95a41e421d1556a27a25f7e5c3b012d843a88395ccbc7c2049835f5e62d7dbe841edbdc0e44f2d3f06c3e40bc3e443cd7559a8e068c5e353d2ed7030dd960be685737145b7f5dbbb601aa2cef56d30115c6241104d302464355b5eb4bbf69de4ba9f9047d39eb3cf7179dbecbdf632dbff0175eaadcd3b95610fe4dd26b37876a5836bb38472b7dfd106136d430cc18a1532229bbf41db025bbaf5372482523421ab79f80171248ff9aa064f51fe11cb9395edb9cd65d51437c60613452c4d9a5024b3f91a4c947f90d5bc7d45987f261c1793ff69fc76265e8cf710f6e0df2b6d79b8b7cfc19e7ffb10f2746fad873fdcfd3f90dbaff15086f1dfbc91ff1a7903f9ff6ff2ff6f80c6631c6e8dbff9b4bf1fc99ba727f0a7d6c837386aa1f1f9e67dd79ba35efabbc110e2d88f5bbc07cabc68647fdacf382669e0234b5c98f7347e890ce6652545f2d3c844391381321f89e30f65ffdb27e719f750867fbf340d0c65d976cec4634d3ce6f9adf460b47fdce2451c1197e5cc65b9d18a7c9c9d89c382c8e79ecb35441db578cc3f464921dc1d6b708e25643698c89998c0033ec86ed8a91fa51dfe442d11871911477dff2816a28d1fd1868340060a2d462044193f84600a1934821250200882096c0045962111877c7f22b10789c4f1e742fb0e118836fc298e8101363836f1c007566435f89964367e42ae658e4fd18623913d110711cb0e3f885c68ff5595b8c2418cf2226712a3a29619bfd9c19287a4e7c387d6a7439238f3b57761a21c5246202372fd0ddb134c6448b2c7227179fb7c2bef9d985fe51d7bbd4bde0ff337efd7dd3aa49d981c7b6528716e0705937707b57548b2c78795b7cfce2aef9d984bde31bd2d520c79ffeb6a1649cf2f72a16c896c7b67128b3e166d44332d33a94fdabae41db5cb774fe00f65fd5da201498a61f459786f9906aa5b5986209a93c033f4f63550bd7d05d25b910b6550769f2816c9b82319b68f45bafedefec63a9f2049e219d205434d5739e949f640211829c1e98c2092f043936c7eb5227b96c4a009319eaca4600558c44036bf42c99e1c2f9042c61259b48862816c7ec5227b962091c4842424b46419421164f36b94ec815974c0c90dcc20020974c84236bf6a913d4b86e00017219042074ab052846c3e57247b6ca228c30534e0620733c490cde798c81eb883a8268c08c1105aa450826c3e7774f111a71b71d05095774de57debc7767ce057647b8289cc5fe2a2ed0926442b4c1104996798910db8dee956a97871ab95fae4b11fa7273d3f49be0b13d978c1831cc86e70fd0b4c93cc75a428b5031cb6c03c4c268a0105275881cc336c8811106cc812d91019d11299ccb02146301f031bf2fa8e8c2d9c9828020947b222982619cc8824b2010532e9821228c19428997f4ce2cc1f22710c7e61182138e04cb84444030b64f2a10cb6e32371e6c760c87c18e603cdff51a5c80bb655642e2cf303268e641ed2ca6f9cfe9a9c73fa9c3eeb8cd1c580509b3246f7424699297d125f557b8411b0163a8f4f29b539a5f6dbada6cd29f3a6416f79060d4ebf5293526a187accf3388b2880158f304ae9133ee540051530ce39a5947206b1fddce4776345cc79e69c1ad09ce7e646ca2c4e4a4468e8b129b322aa865366424c991d4d215be08226eeb5bcdbfa51832854b81edc4dc3292d58e2a6753d6fe9895a6bf56ecbc8f6e0c05704203a261e0f80e08aec0d7ca8513a26ca29e1c4d18f2aac2801a5c90f2bac34295262043efca0224a090f1c35459999e1c38f2ba088c1c38f262b5eefabb6b4008289205823be2898f841d6d0090648dc8c71a38600c4d909e26e438cb64c018923c5b831a87084bb69da6f5f44fb8d48cb30cf4a8adcfa4b64f101f047db2f4eb69314933872c33fe46a0b2452be0d3206299f02b268de5a5daa1139f0b838a5051fd8a2d5336543207d5fd09c2ef915094a24d0f2b79b82a3aad13041d71fb47f0fe9eeeef16589209021450ded1f77d060891eb4774fc4c4f8ebcdd7576eda748f13a9e618a3bd52c664596e943b5958187c0d6fac0aeac4871fcc2a1d1faae00fd445ec861d8bc7a07bdd6ea6fbcfec4c1a7e7477a9dd688d86964173244dca23987dd032c82d1ea95351a234c6faa4ce58e3a471c618a3a0b01e25e357b47b171e8535a8a94141695050371ad426b5ede84683aa5b8392797f9439c244940675c4e9c623a82d6aa3729368fd24c560872464c002263e78ad80032db8428922aea480e98a8a69a91504a623a49ca4c86006599ecee0624b4c420e4b20c1881cc620838a107c565081c3a5400012c2dd7009a8c78f166ced349c328bc2e2a4b32648592b9840c0bda6ccb89861313b7037a4a211007bee105e1f930c2872d4fde662ba4c85f3813818f66000e22000f6445843a4124365458583c537126db850d44a7ca47411a8e32f0475cc49640a42b8fed186bfc45db4e1ef3282cb80225edc7d110071fc871003c3bd28a2fd86541000bd8060c02168d79c3a8184c4ea8917b7c2c9135242b915484e2e1f216a0b3e25e9a94e498242af349c9204e5f5c4851623d4b418e79cd3e7a66931ad84d693c3f58f484ffc5d5a5cdfce446bd1c5b8d1e784316f77fa33c43e30e18dfcb7a9d2dd3d4a29a59c5a8e14c27c0f7a2dbf3b122766bfa1b7cc6d7b8f1f6d50aa697366295fda481a347d67645e5209736a9ab66d5556417dfb1a543d26a79694fbfa56c3f3b95af586393d25fc5a69866dd8833a1e026dd3360d420865529ba269dbb66d9a94b8e531cddb44fa7a4c42ad21e4d9b292979e5868503b16e7817f8489eb587ab42812c75f3b1ae375e576e151a854a51b45fb9276d4b4abf61d190079a350236f97af79a8eaa403ecf049216f3f008e9fe94021ef14be1ee0672e79d7df7100979fa18083480ab55614089023ef1d8f83488e9fe148216f003c0a447e56f3aef11a91ac83d14c7b02e48dc2e7f8d98ebc09f0386279dff813f2506dd5147c7e471ef2fc75e4216fc7cf74dcc83bf629e4a1dbcafb8477c943b7f53397f7c9fbc6eff899e79dc2eb78890d906b9e258425f390b702ab266fd6cff9b31a21f2070f519f9ff90fc9337907a12fd0157ede5ff02079cb3ccd4357cf66f2a6bf7a61f5b3a0cfdb075d41a6d21ad4e357c8439ecc7b85f73ce4c99ff9cbe43df34179e8ea19cd5be6a70b5907fab3f93df296dfe3672be4edbfc2cffbe4211a5459b5c6c707e521ef27efa0f7c943decfcf7cfef3feafc94357cf5879d7fc2a0f5d9d2424ebc0fad96ae623ef9ff7f1b3a0bc7d3ee881240bb8000f04f7fc0fccf3425885f711d46305192ec06bdcf34098e77960157e072ec0ebc03d9f03f33c0eacc2ffe00238d1f07d70cf114f1315b23349010502ec609bb781697e0018f63a38e673b0cd0b00d37c0030ec7170ccc7b0cd9f80691e0018f63570ccdfd0c8f8b14d861eabc1347906c388d0f06570cc130dff85590f8357ff8259efc2ab6f6156861e73c12b57d2f02feeb40a6f2088220a0c9dc27204383491a13f4c6dc0840b26b487371de050832cda6288a190af2f3c75e1379c242413459990d770d20b99c865427ee2241732919409c946d05590f05bc89eb727a1e1bb2f05f11a30b0d0850b9b94ba250f13794f547faee2f7803c10be7ce0dd811508f2402db548919a345da24df0a7d3fef40ad84391245e823f18691553e41edb947a36a5a02b58a0628c42fbc32b58a0b4cc3038979ab616401c7f28a044a1a4fd8a28dadf6e2d803d9a1528a0342c48fe6d4a72898e4b10c71f6a3fb3e6e4c9d18e1ac98e7f83dea09e80481d73d53ed7afd7dca2b427d9b3d5fab41d3d7d3e80823a2dd0fe4a4854290a12947bc612776f472f48ddf2d80dd23e62a8b5979f90ede9c778e5a60477c3b241e964b97bfbad4541cd1c843231da8eae68ff31b26c475bb428d9439d2a9528da45fc1f4045c99e2540fc400429989501861311325ff2012b4950b20022081c8890f96f501b9658ce1211e820c40cc0e0e14a174d4614510693144c4b1c0105122fa94877c144cf68e8b48330dec3452d1993a2964c165124e7d17e2a69340a88e37f451654077409eaf8dbcd892dcaa684443e8d0dee9647373cb6b3639dec60d1a2a28e340cee91de9b12d35393f36ccdc9c9793645a24fceb3b526ed0f9f9c9c677b22b74dcb0c3d76e43177e2311b6c47b26753da8e8e644f95f96f4f362525ee2bc1294eb0b414450d6cf00593cc1320c510453f2441054144a135398f96619222490a45f678397c7cea122fc364861df19efb22b5cb4433998b78cf6522d8102651c6fd1bedc043c665986412655de73df71ba8d27b2ec3641e629ff3e81174094e7129148ae4311c575c24edbf2929bdf2be4eb40b4ac5e3be6298f650e6e11f1868c93e5d829b94ffb4a46528d9439b362caffbafd8d3a59896bd4169a74b12c7573b282df96f4dfe9bd21685011e732b30201a19641469a8a58d5e15a20de10c2d332c860878cc9f3e512b7489366947cea33d913d9c164543d2ae29e925ed32479cae1769a8b73ca24df409d3256a45fbbf04810921e84d97b0e86e69f30128450b3de8ab78840a4f444ca293e8b2a5c765f17d93436818f285a696db4ba85df0eae517b4b2fe09d11933aeeae1a7befb9dba73dfc22f089641fef6f083fd80daf391a79af396fede86bf77fcbd44227b623eba622b470d913d3139462e6620e9e33e17e4d261a857587b7bb5fcb47b1586d58730df817277a4818eff651b3c16dfcb4868f0587c0246159178080c51f79f787ab8fb6a3cf3426283c3dc91780f8f0d46f1281231868e0f8fd8708b8e3b3a41f24d0e29125f5ae951211b121d464b5afe8d2dc380cc1398e8f918095c2dc005513c0675905843d4db3b8619a1e10109274845b2977fc937bcfccbeb305ad276ea305aa2c1797418398fcc49453a8c966437bce499ff6c7efc0def255aca7fc133ff89e30764e30149bb10f8371e7b8f45c5a2f891497c2436c44fc84e186768cf45865c71a15d2dc005392e4f4d61a1b6f23c0645c367ca42b6d4448727b2db53a3e8a5a3865858597a72c367694a9e2d85d0febe6513f98408e79948d08e453ef178864e12631402feb8f6974d9c074e61a2090fe481b6c2464fe885fa3921c1914c73c27ac13c7cfbc2528c5b6f0a4bdcd5dfef9efec74abddf803faa7759adde654e1fcc778138f15dae773d84ae08a5a38c32ca2865b4d1461bdf7a31c621b207c618b556aba9f510b66af5319ff54032e2fb2f78f52ebc375cdaf069c722bc2392def069c9853559abf72fc8ac828a26f4ea6df45cf24d0a50c75fd7e0dea47063c3a7f8ee7d7cfa9e02fc118a1f757c0f0816738e1e3d90efe1997fb92c5da8b7b34c70539fc37952ef1f434b7ae0cb49a2d6fed22086e803ddbd7d1fe858ab8c346811ef19a20fb47d6a2d358a4531d0d244140bb068464049b15483261c68f95cc46a7dbde847cc79dd773d3ce640398a626095e0b6947035ec02c492a422b8d882044830e1044e20308225b24011418b101831e39c128b238d4a91f61c118aca13bd6117dadd890a13bfee3980fc29060a0c8101852a5e18ca6030943db9dc15458d0d86716ff3b6044b527e0af26c2e270942bf86a8b9a72f7f831de4d9bebe7c87401ea5c5e2eab1cafdd4f685d5b7de06c38ad8c4a22d599e6436bf44568361456afeff33d1cd15b29a5f22b332ad7797f7da13991cc79fc56159bdbce5a7bec335dae0bea0d497c253c7ef7b0e47a6cf3eb4dd4fa1fb326fcfc9c963cf7d8d38bce7be8b3852cf65ebe43126ee77646aaa11c7f6be461baa577d3f3da6821e5339314d8f451bf253b88b36e4fbe743ea2e4b0cfbcb3df733384af1581426e7b1ef4ece03715cea382c3fde37c31813b01a7e12803a32022bec804ec3af01ddc7808b8d701a7e08e0be22545ca81a7e42ead782930faae11744bf1e9069c7a6e1a703eac81c3978e0a702d491376e0c606af8e9401d9993a3e54f0c00a9e157437e373735345047ce401df9332f5047fe7f41ae16d491df4a411df9367b155f1a5ec534605ce8748228bddd072d1feaf87d50474aa63babadf18a716e337a316a18d67153ab56b356e32a475fab736f5fb74abf761c8d316a9a566bdeb4a31a716689c60877be0a6c6cc1e95e1738d1708a134eb47f8f86539ae862873b33e3939303fec87d43bf665086ca8d513ce96d731dc7a7944152c68a8d1c6ed4d14ab8511bbc3c569d26ea7e1a3e019145c30f88e3a0a5d6a221c295923acf6c62e73a745791b79364eb0bd24e93f86e2f654ca2cd39a7f6c538314c93b3b373621857374d769dedba099dbe10d4f2350d2ae19ee2f9156b5bac229c5f406ab549259dda3ecc765c9594d2ac3df5668dd58b9da7e11ceb713457886045d3979f4b9be99ee56998fea6611a204c1cede763be4f0a8562f4f696a53df4b42f488b1af5ba7594520e76b1ebaebb5673f469f23bf274e55b6bbdb86979476afaf970dd8216b77efc1d6bddf9707ed45f90183df31eaab8fb5ed0585bdd30fce857192b171bcde6eff0b2ef55dfeff0320fca934ea5766eb8ab50e3c3853f312ff8b33515e91dd3dbf65446d8f98b1934635ce914cecef3c2ed0ed125a386559c90b4f654c32a4e42e8a9b94bf805c1d25cb952431ce4a048bba276e4e96e1ae2a04a187abef61980489524681a912a44d8e016656a6740cbfc6a596de53eb2a673eeb94d8a93484da9a6bd9c9206b1bfbdfdaa4d89ab943389d43020f4b7a779d3a8d6c58fbafb82c0e898f7907d6b2dfda6f5a6f42f68429dc8046f4a2925a59252a825de7eb3315584f5f7397fea4d4208edc4da731e749e9576afd2df6fcbdfe16b092194b3fb62eac7e89af79086425dc4cf87530d9770d2310d9d9460d2b6f3dc5b1b7e7d77e8737bbfb7dfdc4b0cf3364e7358b1e70de452eaf809c125c01d68cf1ddeb17bfbad25daf3f909c11dd8cd4b322dfc7cc025e824f10c21c8045dbd905ce4b8186fb6fa1e6e612dcf0ca10ee4ece759e60617beed5e40baf73c06276ed12c83e796c7e0dce26a73699301fd821c6a7fb5cdb7b8c94dab6f61a51a8d34521a638dd41ef2dfb43c65aa5cf8efc5d61052b248b922058aff4b4befde784931d2f2673ce76931f1f1b9e2692a043de79cb349cf397fcea5e8858d34bbe638cf44420c8eb4572f4609c0169c3cbebf955f9074397f2e7c0ce3373d76a5aece03a37b90851a851e6abca1c495a94d952af2e256c8656f7abace3b7f4e1e09e459f440b72ff852626fc125ebeed1dd9d8a6ec163f03d69064d9103373e9cd20493860f5316ea1ddf003cb8537b513a09d535b87c5e4a15b5077fe2478fefb328de175cd170ca0ba8e8cdc3aaa00c9c68384506465a001a3ae1a00abd73c3e36780cfc126aae61cc789d1fcaf992a13e26a5f43d472572df3872de7e1c242e7e93a2327fa47dbb736ef7d8125df4f6c93b8ae78dfa0bf7d811bb4fdf8dccfbcedcbf79ec310ea78797f2f3f093de38c339ab097e82a43cc35c4f99d5097b77dedbf8fdf0b3f5fdeddcb7984f5fab27b20f7d84d798113535ec0a4e77bff7d87ed7f18c88feebe5a1ff57dd49fb020b37a6ff3f6a8edb66f1f487a78d7b798cef0a3bb6c811fdd7d979574f2a5fcdac5af9bd6042b3a38810463d0f22d6cc51b2c41b7600c9a064dcb398bf47643c31c6829d25bdec9e16e988679505b691f8853cf409df840be3dfca0b6d272133d730b472da9b02d98d1c2961bdf9b02658c9b98832bc2288ab109f2757570e3c3aabdf8d73fe67ffd5fce838537493dbea01f1e731b28f8d1c185bfdf7ffbf83d9ce73d16e14f22bdfd67804d494c5eb6e51f8e131fc87b9411a3022949140104077a48824187a22db0787203233435e1448c4d24a1638e9ed2a76cc285057119f47e21d2afcfc73e7717209810b582262598f285173a9cf0431940fce08a173578228bfff1631b0aacbf6f9edd7421cf5681a7d5f32a00cf8e8131ddd0c4b48dffced292f679a61b3fbf7ff2f6c9dbe14b0cf48237719ebb5b47be4348268abf6f907c071117f2ef1baee43b3ebe43f11d2eec60f2321732d19409c94642be8597f9999a991cbdbde8fecea1edc7ee61785ebfbdf691fbdd72fd7ebdfc9eb989b57ee7dcf0c9a119f0f1c8c78f47b207868f453e0e7905fc7e21e0774cc722a11f0f84051e383e3ed0ef96fefd92fd9ec9f1fb46c7efd88edf39377c7efbfcfccea1375cfadec33c0458e1f3ef168ddfaf9bdf3328fcbe49e177ecc6ef9c1ebf6f04fdf6f121043b145701fe0bb026cf64213c4481601e78886a8c030f511dd8f110f5c143f487912379c7da78f1105219f9c1838750de2a233f585880d033200f206ffb3079a8eae4cdc2770be8bc4f6801423f0362f3f6be5b40b7002b7444c8e6a1dae56dff75e4fb59a7ca43de8fbc5978a1233f7e2694ca7b00ff1df999cd5be7bb23ddcfac9777ea7ffc8c85bc552f044457233c583002c4080b3f03a2f3de791e466c1879fd0cc67b16be07f240441490737e13c08bfe19108ff7c14472741eba4044b69f098047de3944806409e0f130e400e48d71f2963d97001c3734f2f6e791001e3fd3f8b904708f23012e1e4670def95d79a872bf19c13fdb72f27601e52d7b1e46807ec623e71d80c7467ec6e58df39b11ee67dbe79d1fe867b2bcf1f3787901e4a1aae3711071fd0c872c0f793a0f79b29fe997bc73de9587ae8ebc05f03888bcfccc75f3321aaf3f870b08c8b1d74ec85bfb562bc7fb10206f9f778fb5b4bc5baf43fbd909efc2cf7cf2ceb1030f519d74001c5f24dbca0130c5cebd4eae94523e7938dc7b57f761f5fca66e2a359d8752fbabafb4ba54aab7f15e9a2bd735acd20492b64ffd0bd757ecf256a5fa825c5f69be70593dfc54abefa35e68f805a95c98c65c720e2e325572a0819c7e4d1c69fad673d95aa50921347ddb39f4d4ce80b6f9c697b3c3caa12bae752febb967b558a9d4caabdedbca8211a652f7154e82f90bf3f1b39662d55b55b4ffbd3c0c868ea3caf1d896f4f2aa971b509034d4d5e6540e4c5a05d2f598227cf45ead5a7f88311231678c33c6386710ed5f1efeef35743b4ddffbe2fcb66dce6dce39a7f613ceed9dfeadf4052f7e42b81dbd5b50d30cbd562a6edb9c53e32ad566d7d9ae8b316e94ea38e7ac91da4379cfce533329a0b4b7529b53d328534da2a607164bb2589ab6c94ff55163b156defde8dfc8d93922470c2d5410450b1528696af38d9c9d1c17166bf5dcaf5c569ed74a5d0cb5ddeef63b1edb623546dc7d93a3b7bf89b5bc96154f7af3804b302068e29e3763e4eed08f6061f4208d7e325b48d9c52fe826b6f91724b789613e9c4a39b72ca9c43440b89c6bbb2d95c4539040d253ea7963b7bba2b54a296b6549585bdbd3537e41d2ca1b8f390d13ee9ed9eaf4e40d0c09aef466aef180cb4ecb534d075a50762ae90d7b30eb0ca2af19e7d17edfd052474b5903cabf813ff37db4fc96c75c88ebefb17d839eb9474dd3dd9e56699a37a4a2ca3cc6ae071d6e07a42892a226870eeca81e4a4fa5a258c68a87631ebbf8e6e6f75435954a71412a4cdf3f950ad3bff7ca55eaf3be8ba1f55498e60befbb9c8763f40bbaf955f8e6caa59fcab31a4e490282f7dd77d99af2beef7e165634d1d66a98450978a0adb639e6b19bd477a9ef7ebdad6badf736d57d419495fa3c97e7de85e5e279def759cff35cbcd577bf729f8bfd30d4777b1a4395e7a27a954a75539fa77aee55cf3d773b16cbaa54aaafcea3faf8af2f48d5a998a0f4b641535186871a1c7c98420937fd6ba6d53aa3153b60a737658c59a311febc4868dab2a9529f4aa552c1976b385f1267fb5dedc314e69ee3384ef5150b414d3f858328078315fa32562a07b52a6be9b82d6ea17403287ab302497e1c273d774e86fa9c90fadcc3ef37552ac698fa202e85a3563d8783eaa7b010dcdee755ebc7cf7ec5325bd05aad55a53e8e6e336a185e4fec0a47fde108058e3178225ff7aa3eb6c8b8f13fbac21492a1bb4f79147b3eb227fac418c547af608038db6fdb06ad68bb6d1cfc5eb039f5519547310d10a040d170e5d26e8be221a4e8fa546a5865882734fd1c976e9428e57efc6eb5da2ab66f5bf50ba2d476d7e39ee3feb997a98f5aa6aa7dfb2dafd22f885a0ce7463f1fd6e5556a5dabf08e34d0db5fee3beefbb8e738eeaa52dfedbeefcb10ea74f97eaad457a4779411ca8b343c8075346316356d31d67ee9fdad596baddd73736edc6f564e9925a1e76bb4723933461bf5349ca3c251f6e282b5fb8aa09f578550bde53aefbaae4bd123ced571558824d503f9b49f777194b558d87e2ccea5bd663aebb13e22100c26b2b881104064d10518320871b4b7add86ab55a704b6d1bf484e984a24ebacffa8e3c5d2ddb8f1b8cc7adb6cee3e723ebf936a6ca4d4aba694f3f8f6adadb28e594f138da592ab36d93937978fbc8acece6b6e1fa828d66d3e55d2ebfc3cb56dfc24633a97a96ea7778592a56f3018ae39c2eabaff1a15ef977e786e3b80a335f96b7cd54d1ba57be5ef2639046cb95bf2f65b21b4ca5523095d47a208f9a37e33d4633d6c387b3ae5838a9f52efe59bba5bc8ea335954aa5b4cdb3d6da20fb96c68f556b9095d902db879f12d50771dd6af540fe7dd56359158ef65738c9f515b76e4b65e1f63461749eca4ba51ec855415d2713c1b598e60bfb793f7ffbc2bf885fc7c2f65de217e41111b1d0aa206fe505753dc85a45a7dde9b1ed75b8b47e36cb54b934b72ca60102c511c8394f833a1cd46150cf4b61ef2d9027b9febbea7a20b7aee5e73dfcbc215c5e0a27b5bee301a7547084869ab35e0adbeab1ed6b8cee6ee9ed5bdba73c2f75a4b74d84303ea534568e4ba53e8fc608abbbe552fed2849657c695625f14424a2f8414c33ccbd58d2691fa7b1890adbe7d20879a477fab0fe4146e5f29de34cd4aafd6bfced3558a37f794ab3889d42a8ebb0fbb9f67bb2ef55f3b15f7917234572ed410074934b53ca65d8f694f817c7e4162284e7dea535f9d27f5a9f8d52c63e5c2dfe08ff7f0e717c4d9fc823ab08a23bd6db4f690e3befbedb76dd7ef7ec310c3ea0669ad1df7dd436e83498868ad5077f52bec3a6eab39a5824c93e5ce8ff0a7ebc2bf59b9cebafcf658bfbfd6ef94ebb7ea65af5ebf5d627eb3647eb760bf5d33bf5f687ec3d4fc7ed9fc8ef9df32f8372cff9ea1f19be6e6774d8ddf361a00bf3f2849f742b0d65a4ff88efb8dc3f3bbfaf0d3befedca23e01436db117492d334ac3b241512bf5896bea966c144fe9839242523db9472bafe258c4f22ab6a1e5558cc4e5554c018f491c030c2fafe221315ec53f64bc8a813c567768bc8a63355ec5d9a358460b0d437d028e1a00d877a858090d2fbdbd121aaeaeaf643e0d556b361a7eae83cde74635706c420d136abeb8e506c732689040f3c52cf269e048c6cc1066be3846c611083030605fbc8271e4818c17325fece271cc414c95982f52916f832316af29af2f3ad5e058050c15305f64a2c171062f3278f9a21429f10997865f7401d491d10927a212ad59eb8b49c8e098021612ac2f1e714434814b095cbe48c40b4711ac82587dd18913ddc3e5e17eb189fc171c775069f8451da08e8c46d1e8869486df06521f510bd7f069f861e0fb68c862014fc3af02019ba2a804ed95845d8e3254232200000020000315002020100c87442271403428d343697c14800d82984a6e4a9acbd328895114638c518400420000841043008c10d40c150015ed88276d41117a7a0460d61701e9410ce18d295c586a92de1adc5e9a7898ed67999f504756c24aa9fca7964b0f804e00f8aa854ed18d29f1fb91a6bb512f85bbc30a117b6511cdaebbcbe570612590f4d697447c6cb0cfbbb780428fefbc156f201c8a6370053b81b3855bf4b42f913355994b8c1545f5c47e1e6e8aa8d1e1d9ca06aa90a16e94229c689ebf3c23f0ece82c6672a6791923e415fc294ae793f1b391e87b3aec3fc9f463d95a3e9e9a67a1f683e6f204492a22ff6c6dcbd10f358a6f13490a942988221c91d745855aa782099553d266fc24310565d4a04cce37443197ccec3afa5df05d1b968a680d3793bc8a29f1ecc190843a84b073090d582a8793ad1044d7132df4e0716b4cb654abf8a05622a68a4459114d9364a8f886bd845d5c1724a6e9e468b69272185fc4f18fd180922576233be2471f936bbe8f12301db32889cd35b8a847f9b78e900607e68245f85298aefd33eea1274adc4fdf22877f50fb9c8e1ac74130705898744f2a5fa58fbf2a0af624f4388a921f2cd51f7090e42be027b5ffe6d9c7bd29cd9234edd118f039819a1d0db84b8185e7e833103c88c0826e0daeb6386fedb96feaec26cd448ea612dc677d0fb4dfa2afdefa9d3a56e979a4ebe505f4f9f5b4b40a86e2aadabb01e01a4b9e8cbcc65208100d1fbdbf7783f4c3a600278a136703adc7d467a4f778687222f0706ef352d7dc41e105df82db088d538436a5d1260689d16dfd989fee6a3d4ef525503a4cadbab382bb409bae5d60e36bc118a66757e0317f2e7a132148a7bdcb0c6cb11ed9e69a8d6863f8b8e0bef00827288a6b61621cb41434acad080eb07e3c6740a243b84f87b40d68079e35dd743023803ac32b61e8b5870212dad81e72a50d2dfdaa080e6a89db7a34ea6773360bff03a7e909fe4fd362b155e6e4a6293555de64450cc947130a0d6d1a37c5fe82c5ee0760e0b4c74a41f7fd296f3dd882cb0af5ba0a59b8a817c54dcd8aa543094ca034b1e61c7a202f591f331a245a731a8b0d1dd206f4e0d784ea962088fc606d18cf63833183bd39af55dc465252386a563906478e0265e0c05b877c29f00c89864acec8fb596736fa798c575cd960f4db594a2833d369abfdd29293928ee6991a13981d4b4999c75c433597fba94398f605be2f715036f0d2c79759fc84b1623a5b7ad9bfa1ad8dea6316b304d61f931041db61be0912d2e0057c9198173e3d99d1f48cc2eb419fd7458fe0fa9e54018ccd0c2e463b0430775c088d5db0695afac57260b50a0f5eeed26b45fd438c23d2402f6a0d959b6b935c113b9e9ed0ba7539d586572c88655718bf6da7404a189aa3d36fe3225a0b4a41575a1f18c3deb7d6d03b66927780d9df3a168f654574168baa424f283d23ce7291597570b98c4bc172d8460bdb8f5f7988830e1192a06fba80cb7d4f8128896a5c32d49a5011e6540e3b2ce5727c7b53408e21fe56ecb4e57c7f887a41cd7877f4cbd490a5708f3c7d45927e63afefb1277fd3660428c4be5d8b206362c5d1b94f5927d8a8e5ed258d88ae66f4a23ac58d014857da927670225fabc29411556534fdea701013d67698737a85866a2d10937d77fe07e0964e0fbd2878d6062cab43bf17cc72b4390e8a9b8192b43053d2f000ca2a40366e5134a73c0c71790037e3099d1206c5c5b922f1d4fdb1aa8da23cd35be2a9f6f762a55cd2c93b5d69a79adb37205177f7295f74942842b61bb87898e666b071764693bec390fd80f516927abec71613693a4b20e203568520bc32aceba5586ba80a6fb80d4a38b678786ed21087b7adc330c8831111e33d0abfa7d1fbe4f8ab4d5e7e38fd77cfbec4517469779b86edc27313389a1ece64a1e85fae548a7487d19bf760c5eebdbe52dc657809d5350c8597482adffbacc8e97ed92e3d3c65e0fe7a843c93bd3c031bbdc8a2e49c5c4db26c9177b74f2be38c9dab7d0b10b13c3e6493988b44acb723af68002014dfc6d666e0d4475eea17232fdb96a4d5a6eb5b1761d4f5aaba36b5b85c0464fc6dae9b5280eb9fff86649bd13c8b4af9382b80bece7b9de2e3807f62d50753d86b1d87e36bad867d7cc2f8e394f07bbddb47ff89cb7832b1786fea060ba8e9f6538cacfa806f9e0f4103c8c9359b2afed3b64614549f00c70fe4b9389f59848d304e4443e6e23304b29a6a5573a5f95e1a017d5ebd9fb9ddb5029b8a4ae33896218f9c3e02481b7143299431c1f4c1a696bee1cffdfdc2ad47e17c0a124783ec8a12534aec1476d11e4d0dd05b5866731b3b7701d786c606a38f9c867814680690e52028ae90952747520a290d0854ffd34733d49f2cadac57ec9ed548b30dcace7396d58beefff97290bfa1c1e0f05961654cdf273be8b1328db2f8e793bfbccfe89d5b06081f7dc1c5885c2c5ddc59ca9c093b8992dcccd4e6f6135b6d9375ef66708d2c30c04a4e5fcde140f88ac63be764e542cff2029e79babe5a62456b27c6048549c646843ea1f9c52aca75217b21627853c6162a0a05b8fa7b8830e917b05be73d6331b8b47845dd369f5706fcc25a425f5dce318bf484b13aa7eb22a4fae0a5d1a83894c1d00077efe3e4300a07c5ddc11108cc9587d6862242526ad73daf9000fc21c4b23a00470942adae15ca49bd1b321bacb54bc3945a403e32cf015da128ba722740d928654d93a6f4c2d41a93e09d375e7bd5ee2d344c3d7198befba815d8a437d2389222c4f12464ccded3f3e08529aaa92952b745aafd0ec86bd6c21c50c06e94fa8069138d2b33b73025a13144937e6e3c84da3cd1ce82a82c825977008a29d11a66fb406af02e6ea7108b0f1bb403e07496b5f57a71ee808b1cb1d97b4b032c8496ac3d7fdceec3df85d85a382c97491a432bb896fb6910111367621fad882b2c562d2be70beb59d6170f2d61f1a641960efd38bcba0c9bb48685f12761661b2ba6ac747f7de80ead54ef3307d714240c3e37c2bb538423c417a0276b40faec13ac418c45c64741dcaa917850de63a20ec9831b86758f3ff5c6cbb941db2c951fbc0ef148cbe819da1d59c329a7b1f8d120de7439247ea40e1fc9aeebe704e503bfcccb42720c6fe365e466dff95e599bbcf92c4b7a0e2386d1e4051a55e35bb6ea69fc1715563f03f69b9cd6b0228e50e822884efba7301f45fb552d3ba99d869d1d7ac77eeb15eec6ffb14f3ca625aebbf1df28524b722fee75580071fa81955685a8c23ee5b79dd721f4d08864558893c4daecad5538d33d64981a5c1804a70c03299a7367e09830e17240b80b2453141d40c3d0fcf037397e46611ed461d6584da787a6a65a0e37bb563cd6b002693dfb88e3dda6db792cbbb759b6e531ddfeb1fa14d647e6be8869fe5f880e0ca5ad36bcc2c11cdc79ec1dee05a5c6f91c0ee23845af7c1653c76f327ae9ca12c900c7502b50603a0aeb0b5be4c3c9b8a24880eea602c0e2891cf30e11a98f908d8e5b9e018e45992f0ddf4586a013ec65a6111413872c46b6c7688733da6f93696c31562d2f4a4bda5238f3e1c1d8e5bbc1732055b31c6c195d7950a0548c6e506dbfd65d3f93047372508db8211eeaf16598549a85cd727ced37da13016a5ab082c2930b09d8442d3411e674c73547da4bf2a4bfd3b85e53b1ed0b21521a154a85a8e4be3ba629031e538e6eeefb22db63cd066c75021e4ba05f1776c9fd8e219529924448dec28cd0c3514bc2632c2b113dc467a9d39af50e64e7b756c5ccbaa37239dd7714edac26a03e6bb675e59ed40bf0fbd9d41b7619f14c0d40bae750b66360ea7a21b5ad62f40a74ccc57ab0aced126b12ec09004148601868367556fa19d0520dad364319911f7f5356868b257ab0524d294e7302bb24cad94d55dd09b0be39958baaf15845a7bb95ded5f3c057d6ab8881220bc608945be716507dd20ad4db3c8baca9084835b2261483aace2865267b237ec20815b21fc40c39842f23a9c43cfeab69605aeed05a001d39cdc94edb8372813cd11962d26e21175e6b6a57194e6ba26cc52db207ca4dc840500d61f068f49f07b369e72094f50bd7d814a757ae8d5a17045876f7eb9677d3ec5736ee443738986a459f5aa2135bcbaaf5f0aecf5c9c362c977a1ca795c09d58b2dc596b02d0ea8a61c5bf9229fba76689889c7af33d6944a80841ab07a7c520da1e6a3fccbe947b6db65b4922640fef56071d185402e696d3744588a6c562a1fc72b6f2ffcd50e67e03ae18159b21ce4e6e88f39f0b427f1ed3608a7069fdc3cd206a65c276cd1880541368206a96999d05d6a2600fcc881a07aee653eaafb227ae711251fb7863c242bfc6b0048423fbe10d5a258cc73070a59d0519c135c72db7142c56cd36fc504b89afb312027341e13dde95c10a5a8d5fbadeea3ff359a9e2ad641985a51728b8c73ffa05e1263b71e0aec00a4c7c9e102f5c24c00656008e4c2a9ae4ebabbe3297e5528d68399ac7648dcd2c5620d8a87dc284271a95346dc3931e8509129b3c400b3f9e37fcc5666267f41314832470a3181c84dc6510d2622d4a90dc8124b06c7a9fc4fae3f8b5515a755f93bdd19b792709653d3ba506805b1736d3709373bf75949787afd03878d8faa307669a6e6da4ad5bdde10b3068b1e837f5439557e497efce84960fe5e741c5c45bbf8265d89218a504e26dd707e3c5788faf72096c50d15175da23f16e9f5e6283eb7896355b7821261a603291f692acfe60aa549f22de862c680616520d75c44653f7716835fd2b50628313e86344b2896f65a47d64865e47b874619c49527499f93b6ef11730fa7e4f370efea6295db7ed4b361405c703b6c51924daef16d8eb45ac2873d269aae899168799cb696224d3e45e7027e9719e2f89906afa84af89a06324586c1bfff3a6b4539dc3643a4ec08bd51e4b5947625cc2de7f68c540e63e8579cabc9554ca2a6a5e0627d1787680dfdb74f9a3604b75bb5e4d1aee9f538b812fe4b446e7e03cba9ca5242eae30cc9b95953a049fcab320b48fc34e0b121c4b09a714fc722c6906d00b2e7d01c452812a52717f1d6e82a57ecf69c91bcaf4f714ff3efae57861196decfa846d096d642a2de168d9ab1b9c74be887c747b94183953ca31cbf5cea41f1b016755e109c441ec451e074551807a90b62e8f8285ee63295977f72dcded186677c99d7ab1dc4fb0368b098ad74cd128d6dfe134c949c7050bc5e486e6a2812657154d520d5d7e536ba291aaf9a9d7d213527bb5692ad9d16baf25c5a728ca8ed9d2b7eb951b4b8c3841339ff63c288d50c838f4df931eeac094e84439e4b14d14d6c62a869735f8b9cccf16a8b4677c54f3e6f01dad8638c86dd2d423f5e0f38f9be63846a2047b03fc91e78eda3926cd7929d481373cf6873bf85f8c7518398f2c62c19a842b021eeeb69144c23585a9b811cbd0db6d37e269e5382f81e2d6abea6046d2cead21b6232c5d643f5c769cf078aca9e766c60bff56e7f0e16dde646c64de9c122f422004b642c14a2e3d12ab33e902a96a7caac100eb73cb48bc8e0806875de8a3c15c0cc118cd22d2f4429b3623fbe6af16e556eb75571534d0f81631319c10e6af101c640452a73a55b7a0a852c4b3dee20a590f0bd56a21924cb591f6b78c5b850710b72d52f9f49953b4988de638f475021f5c31ddaa446c2f5cbcae80e3ce8197dc83a93cd28e1f24b7b63e10ddf724eaa23b8a41482406b31e64049c558772be06d1421b58c66672ec64eef9358b1306e01eacd8e552d97eb2bf218fa7340f6dc1c752bbac2bac098876b3184868f03b158d8eb2b5b733a95771d11e4c22490a6fb5c382b5936f15160cdba90536d91cc5d41e790a53577ba6024305488845f3ae8f9140cc72811df782b0fcbb8d4198393afd2f31d1aecdc43b2f99ee7d9bd200174c1f552f3b3f8f76472f29e5f9f200174c081b04b3523d7b83548aa27822bb2b1559689498c91006bb598d3e38ecaf498139ad3acca74e5066d488368305da4407571ef8ae1b391a4c21d783a0e44a261171c910c98f98e4b0bd68ad5232124abf00ff0132a4fc4c4e3b92f84eaedf092ebb78a743874df7e45c716c372fca3c6af340f4b5fe6b0c0155071dc3a304ef8992a30a17ce603f2c898a000ac525691624b70ca717de1e82fb91cf1b3e4b347d0f1b83c6c7942432ee7bea3ce7809087c292f02e6acd2c60e630a6ffddc73944f3416ad66eafaacfee58a67ab6179671a963ff942680208d68d0e874447251f9fb7138ece76c8d76b8790b0bcfe220fd2eb135b94691903f7577d4abb2121be2581b4f23edca215e181730e27598921ca8b9525b8fe469833b6ef752d2eee52b77d09c58dfb2c7e38e247fafe94f627834b98778d52a8aaab9a245f71aecd7577a7f4dc2964865168951f9b729eecb4bc620ffc00cd13aa841d7967ca72a520cb81d3c2d100ca640cfe3812cf83fe22e5a0f9d64c23bdd220aec3bef1a6e08db4e6d50223ef46441a7784cbbae4499c44605c40b19851bd3a6edd468abda9c5de7572020909a506c8b8e49af17530bbc6e35b3dededf30f1c066dc17072b4379a91a0b1c18ac0ba8ca24e915c35941c9b1def400cdb0a22a5aa799f44af183ff8b88cef1627a3f585bb5a2c7ac9fc19c927a3cc3e9e7019d96955de9db1c0fbd8d9e1de1e25e3f63125d9a3c115e6688835ed802e16b44afa840890c0aa04056562544d12b9d3c2a0cdb9694b24d6b3bc6bce68890f24629278bb7d08f84771f20b2340e83f6734965cd1b80c450f98e50ac71a740baf1ef789f3243b50d85f24e4f52ae10db214d9510122c7cb80092fc86afa7f82c75cba9cf429cc8679af4afaf21d533e7e9769b7170f46e9bb3023053583f3627dd9e23234008bba4e288489ecdb094a04602d6b4b489ccc56922aec8c9728e9a4a79f7de760fe00a4368527a963c6e959e6eb377c8d2ff9bd80755cfe3dee20c993bb054966c94ae3e5dffeaade17e4a26047dd42fa8bb40c2068d8c427abd65a0873f57a8618ae2e8ac9dbd007240ab169d3516604326403281a7e0e01f0bdaaf23514c758f61005085d9a52a468ac120825cf894db2983e63260c03fced04123e390120e232bc0de5221a002e7002231878a2448bfe8a7004e7185b2d6dd930e00c48ceed0697be902425c60b0a2e35d00cafad664648ee17dfb282e29e44aa67982ed9c21d4d34cbdf5dcc49ab03eaefe0a6a47332a024e6377f141077e2db10ede551025ffa045858f7ce80580128e92da77d23f374f609c7a2deaec134f9fe7a0e46b3fb224f0c08d7f5dbd8daec2b35201391a1794246b2f369b36abc65c414a590bd829f4751d522805dbd2c3c1d9f839d51388dd5e05b9b157dcabc3fa7c1a5b4ebeac6f9725ed92411c536c9ce386e2fe972a678408dba07b614126ca3e63311601618517633062c30c6c8e4f72cf28ff6882f815d2cba1ab3c53cb6a3d29a98288205c4f07b3ec0c791d522f0ce536d1ee4c8a459458d7bb1e7b0a5ae7c8593410b3f2d0b430c8c344cd253f9a74d4f2a089982eec1a78ec5cc0fb7ce2fd59cb1b98bf1ecab2c70cfa3603c984d73e9fd3c6074e0a9411d96694e52165f4108121afc66329c3cc60869f5852e2d1c0476d45a758f08edb289e38f7d38edfa74b6997baafd7a4b157bb9b1166cabb18b3e1b3842309178bb9c1d6c73208563927b8c058d0f5c27c9b90a3bf058317fe12e1ca17c8943cf089d00474e985065034f654559301354e7ef5be0df7660c89c9ff9d1f380f77c9b1b6e806e87df7890f96ebc308bbe7a669bb10046d231537b344d9140397a862461f293dac617e58989c05ade1f23166c966d2d6609b99d5a98313353f80f9d08c10fc046d402d40f1c0985e6e6911760ee4447afd8e65dc96870eb3850b589595702bfcf563f4a2a11c16f7608ca11c4ee01e226cff0dd49049647db5158c920d28fa426b20d2cdb80bd6c12cf9fb013aece10ea68be900a4161dd1f644ca4b5458d9afe6b4a23b4fd6d86dc35a85b9b5de4f8f12df6fc3e3f4f300879904a39417110a2c781c5f1d53f423812e749382836c01c7c7184fa8053126321e052182785fcd799108211b29b7045061cb4118259f3b8dcb77d554440fc4a3b306f92e05c9b7330ec86c232364da7ae906ade102bda3a20642e11bdcc295e7d48be5ec4a8152678ea6bc1a779ff2181976c5fa6011696681fce952f32ed92a504fddec40e6f5b4bcec799a797ff1c37bde79a98cb007b4cfe03471de699a7a2f530b8c167b33a291aafb7c79e587a1e6b835ee5c5dcace5bcde4b4fef04a44edd7e6aa9601fb67e3a74ab0c49e935799fb46465c404972c8952ad3dea61015e5f16911be94549a3956b1d631c396cf440cf22a5bda3c5fb80d71cfee6bf1efb7c2d3c6d22dd8c94820ee831e4aa0c8173dc4bd3e68625aa70c31d79450c105a8a86e6be6c8d1547406543467e9c920ad209455847af08c300d05aa6b30c7d0f8be01b150c24ded7b033c64977cc2e43547bd2f6d52709a1e8fb28f87fa5d78c4084ce51e63607280807290c66dcee83c63c4a1e8a6b62a2a3942a422c7c5ccc7e76acc593283729d1cfe8128541f446ede0c59deeec242d1a5459d4fbc6dce267b02c94975cfe5c32660874f47481394640e6688c6b538ca6ce4c03df2e7018af8cc31c40365a683ac5947ec8c506f42c0516f91f5ce7a96c722ab922ca6c19883268fd7108a39980bbd62739da182025da1d828bdcc67b25527666338aa93eb450843c166eb194e9d17d5cd8d3f70e4539f8b1414660a32c88a672ebec12a9423b6d02712aea0571e10f5456e92ab0e08426246d5076855363522a4931ce48c7b6834650ff108072f158fa50fbd00d5dc7f5c027b965b1f4017eda6aa36ab76d76d101bfb651d631e9dfb2ab284a5acf9ffb4e49dcec1313d3e7883ea905fa9d8a342cd2a4378bc64562abf23437c3e49d18d72fb0d4b897adf635dc4500d00bd17c840b7cd8e756c424d3754c839849a714c862167e45cf0f4c1851506311555e02cb4e051622858475f2b7882e52c0d1e896e9e55abdad870749137424161d70950749391dd1abcd46d49575dc61c791085f7d0958616455b83d1bf0f627746770233148427b17cbf37e9c6900603e0547d84ea5054c82c364116273d83061ca4909c837c742b987fe67f40b2d5fb82cac6ba6bad6f1a4189cba2ca791d3cd05a2559f0cb39da9db7679d4f6f4b6b66eefd4c2195be454f9358f7834190f2ace7a333b3b639d2ad6634b085535177fa4faa29d649f7a3b29e4cd9822956d35f028cc459238a61c143a30988c4bac9b07929affca5050fb7bd49c7622fa6585050b3e4601e5295e37a4f119fc841384fbc0f9681d37547da121a8b95cc82e8377201fc7edc928221ee5a095516b22572801515f5538e2798e4a9d59803d9938ac6ff1cdfb7bcadcecce95b6f94159e83b3b9de4f359cb6030c58d2eacce5a5cb16fc889f6f80840d7e7c3737fd969658c32208c596d879438653044568d57c847745c466f76b56db56e1e724ef46f2f48100c1c2d9d86ad769b60ab690fe96d9834ae8369be09d3faa911a5e99542fb29d9898f9f53783f936008bb09889ecb2edf96933072ef47b9c596b50d3222123d0940582b3a00953ab804728991a763320fc480058b8a7f952a343b470e410beafa52edb9fc9c04d2cd8c7e96c0bfc964dff83d6c01be0319c33bc8685d9da4026789c55566a6b3f8da0d9e85179124aa4582a652db868c1cedcdbdf2fa6f56f1d6a8f1b06172fa843d56c5c544de36b4d76d41c86497675d51aa3327f297ec3113dcb58087eec35deaca32d76317a6092720b19fb3388c3c5e5f7164887a0367d3c2148a2e8fa2c40868a5cabc673ca202757f84cf6fefd80c5f70e91ff482d5e82b2453d372361ebf12b8a3bf95398d5804fb8862513560ee43269f5620d2b1e20981c9eef50e10797089205ae4911b8554f86da8db132a70df9a83454543bff7d64d501dc1020a51448661b0a28a64138859113fb692a947bce978ca42af70e045d524954ab9b627ab77e1a0229df0acf41b74b042d2e33c960d99d2a29586c314deb72852f82eabad03fcb04221a0ec8b553ca41b7924b76072912949d10a868b537084cc252a305990d5ec627d958962292e41f72b28cfc3736b39e10e7224a89a3e639df79e8fe7e55383d20dd1a23b107156baf19193b86184a1d83578ec0aeeabb011b4b93e30522b6b6791f3a1103007378529dcb9ca9c433163ba47c00ae07c56293c833cfd5361e63e31a3a798f48dc20c2a51f8cce4f35e0238888cf020cb170f7ad10ae4ace694331e87d0d339e13c90cf3d6dc621baa3e1558062ec33d537ef8d958e1dbfc312009dc0e919b1448e01b2cb75163de1def67c8047221fc85dd6b4433ed2b971f621990561eda06d748bc0752ffed0cb04836e6cf0d66e2426133118ac562e82369b92754c73fc531c59077f199938ade7870636183fc4ab2f4e914a77ae2b3e91ee74d26fe52facdfc4c71ad13d3a714c04cedbcad863b8f701f18b32e973f9d39c15ea2314438761abae3721c68d56398ba05be605ea9ff5214284d9faf52f8b95b1eb4b7d68a824d503aaae250420f7e162b0ddc1b3a5ca4da9e5ca8e83bcaddc99fa2c731dc7774c41a2ab277b44c222540dd01adeb20e9e896197101f413dec97866e6e176de25aab237f24fce1e9377ccfee7963fde0931f4dad1699ad4aef3b8cee55d016ce0f7d642cc788be1426d502dcccfef673f16b9d1bc854ce0d4835ebaccc3739a94a38aaa6ada30717d726f4fe0f002e2634d9f157dfd50cb90a730d1f8a3d2f02ab3846dcd583c2dd037a8a6bb9398eb10f70bce203a4d286ce15b122d2a4810ab67b35e3e72a3c768222fde0c2f75db50dec899f66953c1a8c834f45e698a19886fe7109c0e87eb9f1146479109850d3938ae8719f3c20a3b1a5de7ad62d47e424f98887a5c87a340def062a340dbeabe55b3532601e659b9a81b6878efcd87b0d2e3439cf77edec06e665ce3c1adad990f6a2bd8ec0b604d199a9fdf3a04ad590ac7385d632c1b7a951e596a2e5dab6794a2847b7aad704febe5a5c0d6926bff5e0f75b83754782148310b079b823a6ea373b3de3839eae0830c0e65d2185b7b0f89a78c12a341492758e594fcace89591a7beeb876987ea0c5642e3cfa38086148e12835bf2ea2d1e3c80f663cb3bfc014b55e677e08bfa548de01a23023361da6a836bc27362daae8a1b13aa6eaf7d17db66cb41fc981923411bba2d389aefeda25e7b28a8877d0cdf941524b9f99f9a54fc24dad6e33982a8fd662e1595eae2394114f9a876a08eb20e88ea8249c5b67c85ce663802e08a919d402cdcba6f4f10f07a6a0b954748888beb0a4dcb22a94907c540cb6b2253858323cd1f948a13738809224b200e47a673423dde2cd0b086824614418d5e71aa36925525e5d227d7ade0f3ab08410e2175baa97be02423b030e1762748e6ae6bbde4ce417d6c11cb1b7153d816ef16687820be6e7c7860c702293802540769b27d09a154e92d2a18b1a38244b32f1dcc2609fa138ff681429c5e540ba3653dc9da50e9f1fb76fb3efc49a0fcdee830ad4c522783b611c572562ab0a4e050f41f360c90c25ddd730148bf8810e5b3fe138fe765cd2b0c103f2ee0113bfcf071e92c3b7bbee8ac1bb76883ea1db1002aa41dd61f26f6c9f15132652ecddf46b7d6ee5d8478e7e8672cf6f148ee92c8e3a3035685fc08c4d52ec53da3ecf398ebe7033c03b299fd161ed3f10e92807c5df3a094fdb6360bc7b5cab844f2054be5526c87a2351534f93fb4b458a187abd11592b82b1447ad25d71c6fe32dd06e036a4f1998fd2086318daf57a082166e3f484d3e9112e934a6c04b1313184041083163ff6ee33052e02fb6158a8f09b2c00acb8fc4ec4e819158df64e435b8bd1a606a9011a610bc3e94e90e9a5716ebf4ca6619a5cbcef09764e2873a8c09d931e36ee892c6e5dbcd43937c0509ef518abb819d9fd5ad0935286799d56c57d1e5baaa3eb232865d1f8d4dff3f6d78526966002fdee583c98c8058a362c203cf2d52a8bc9848d86836e8b30450d3315698d8ce9d9142d4440b6cf614c21085d61d85098326ea6bcb26d1634e0c32850bcde542b5857f969268a3de77a69efe85c78093d8980c53d2dd0e77f8d6a4e781640eb5a18343009069f252a62a8b74510fb01708d1978a9b1928f3e32ab454501a078a6468ae39debc7e206a845018539ef659d774a23d77dd89a2fbbacebb4a3178e08a5db867198f5c0f11b32c9d7dda038cee81a2be0ec5dfc8065d2e45365cd0281ec9e304eea0cf81fea3cc559c0c0a9d20695778eafc277af81d19856c285f32124a6146bc089463247f8306ef5159917d75adbe38175b1fbc72b400df8102ddd83e314ce574cdf671f898e635483e12ba3979c543186c7391b230728fafeceaeb75b70541df027b876414b8f66f05602d9019f3aef9041f1b997e481862f5577eaf17a19ecc96b88f61a499aba30607ad05a674bb72a0958b87f9a620ae639cf1fce2c6c3c5ce9b1f476b5954c6d0ae4f2ad84347a70497a3b7beda2ef84d54247a70708b6946e737437cc9e65564a830c89ee03d0015e48f7a586da74cfea25321a378b2e089831989d35e98d2378ea2cc7860894577613f1b1084ea9521c8143306b9769bc819e948d851fe216234bc50491c84da1be3f55f9bd8fe260e6dff00c8208ac6d32932c1ae292cf7802fdbaf023ca0d5fa7e15a486303fc89a122153dc61508203c500f6d002e2e155a6f5345f0d146f9db4c043e42708abd793294316c91d4779169eac0270a2c5b3e7f40f8b90985c77e4337d0af84b8828fba5b0dc0aec36cde530297555bab2380cd406230555e13c65593b76a9c97c4a391f83b9dfa1cbfd34ce46c47cb4dd613016e8a6d3cf81f1cfd315fa9a2f7a2de418ccb2f13786c4601380036972c6c43826b29d40d9aef96c2ac384cc53fe11c360162d1b6c0a941131bc70fa477e97249334670bfaa4254223b3b530838dd400bd450e191371bf9dc1da1ab792a20d4e29ee5410571aa5eb0e8dd3e5f27c08a955a7ccef7b1559469c4d7dbf2fe364b7b442f301137845be56a3a93cfaf4bcd9d55030c138656bc8a6d286897fc8d231b80c676b011a3f3c6332313945077caa677cb65da70f0b641b51e29ffd936131a4ec692b8e21471116d1075570a6bb5ca8c575bad111190f1f3ade2d26861aca18b2112837e4653ca10801c24b1d86e068d81c90df88a422ea5c25b4778b2c3d950db84d3443c34c4740b66c90be302fec260caabcd43d6718f3d36000c9019189a3b869639f96f9af72201f08231708b33fd3f09b9ff99c7b5a31b1176ec20ca20c7585506496dda7236aa669b1909b7982f9a92b37fbbb977ccb9e12b8d5382b3eef9bc402999425e73eb9ca57a53f7436a6a9b46867ee393cdf46d49809a2ce81602a1fd3049b37f0258001fea0eecf71dd936276eb15d746b21a7575a5fafe5641bff0c89862245bce00f9bc506cc46c744c6e6d88fddf1788da2f912feae462858826eb06de16a582c62f96f9e316b2771713947db0378112bfa20e2ff6ae59be8dba8985a0d84f08c4e1e8b86b1a865ae9266241592f316e167286cc7ad798cad789a3c615bd40475b6c792841671fca2a76b072bb99d393ab8b8dd7eca538791e9f801ab48e460302ccf7f21f517bfc1270c47668d142f3e5cdc4041985826175b6696813f06c9ab5d01d18c3eed8ae05b6456efdc2e65594dedb5f3bfb9dd083d9c6571d7ac924daba2471cbb36e959a45773c88078dd9bc6d23badb5216145fe5d478f3bb85c02b53f3ec1fb116b56e043ce871ae05f0ee4a3f4f487c4f4973a9adef8c74c66b82ee1c6caf3ec719aa798cb030cf198214ec049c3b7b7ab8de0010ba4239add21036ea2c0caa13aaa4ac45658137452b5ae02a694c6cbcba44b9ac613802d1da76444fbd065d32ec83d2a0451c9604cb14c5f7c8bcc9f4a2e6480986f3c6c0b7f6e9492f618116905203136fe7ed28f54963b468362edf7e9a4fab6e904050eea0068acdd8961100c038d8b77d7e136291d3187c9f3e775b5bba5ee3526bc1d79495c78f2afc24fdaac735086b4e0fc3ddcde9782f7bc3fe08d587addf4d3ea462512781f9e465644a2fe5860f70c7798a9e30abe35ccb090a97c111609c24e49f772c5e4178266737546a7591430c674acc4252815b9e36aa0942c25561d6aebe248ab02661c52b759e7c5db16198e9f98b771ee904a13ac06f2d9466b308f58db64af54a5bfb5fba6a8daf5627522c51a26a8b374605f271f7e17738c527c6e9548841ae50d74753e5f23383743d06b3ad4dea2e6837941f8da74d27cf38dc3788540cbc92a31828d9e350d4462836e07eee72b76307e75d2220803d774c8fb99ac1694e008c467fdb4e4644bfbbb6d9862ef3f5156a62c0faaedb96f39b25ee3f311f44b39623c5356d55eac2e69af06fa9ecb0db8ae41c7f10521e03be61b151ecc89825cda7ef94bf1ebc5e47e49f26e344592809e7ece2137bb2741b480c92d535b2c0b8044ef4c61a8d3775f8872118e41c10ad257c4b5977fa25407c738a511e68545d2704cd209ce316b7c3202d6dcbc7b2a582b438a016e21e7edde494029ced3b35c83a81f02e091d130a24ffe384d4a5da8722d547617df6a3297c26cf95d54eca99a88348e9e5039a1cc890e826b83c02dbfc70eeabe40f1cee137a0602fa355b8df02b74a62adc4154a71f4bda164f16d11a80be3b3f48fa11c4fa4e7f90998cd121714ddabc45923b497c57bf7d20124050f015c6b5998d210fd92eb80ccc9d7c275604e1805e49302630bc110baf6491109e006822d436e401e3caff06fd1f9788239dffab9d432c51619cf02158ad9749d73b4754850271f6d66ad0361b0d07ece1e207e3eba93e5154563200bbe6445485645df9a4d427ab7d92a3c3559cfa89368ba1f5a95660317cb52e1826322fc0c597af60d64ff0f0398c850cee5541568aa91f5f1579e38870b3d69bc727fa5d2caf71ed60e50b2ef0f1110351f9c94f4905cadb1bf494fc3bb9ae48e81cd53e4dc3a509990956e6b2ef67b964682c19bc8fb6eba6cd61b511d2c760aa5acab69de2d0b191a2e5c9553232980708fa411a61cc6c85e7d4ea0d78128d61cb5743e39da59a4db9d61c0d0b41a15f69c4e5d1492130b3130fe3859269368ce7557906b7a429ff79e028ea888a10fa248cbe4ed63aebae9f81976cd553cdb9d9f0f192d6f0152d7ad8b6dbe5a37c55237a2ce77b1ae02d11f47c7d61c2a8f1750166bdeb6d80d036c92782ff00d63a8369b3e5644e7b909de0436b8102b4412e8b1c08add8ba5f8649472b5a508dfc104d5747b6a45afb272f9c37d951ef411d849fbceafcd52a73a8a450ef3249a85702e520ac7cd293be47b913cc9a1c4219a5499d6745954d42b60d992e6e30a666a110a7e0a09ebf1af428fab2005a370c78c4449a2cd8e3c4e5b1b430ba2bec74e89b09360f41a4a46f39a8ffd60947fe60ba3a95931495b8a37891b1aa1410322d41094580b871dc74074057a7fadbc85c9264e297796867bf0f37727cece2dfc023dcf970ef6c54e3af50f2872b1e4fab5b3504ba8707d27e457452157687617ee5f7079db7d3e6c2d2ed15b54345a44dfab9087c93275c78b2a4d0dd6ad71b8a9de63252ec227ec455d2b3d565acaa213f38b4086c9f5adcd0c0b293cec643dbcda13c0f1c8e4ede791f39083c0ed450023e00450ee94725126f6377fdf033173b001d268f86422f5b17aa3ef387d3036ce33864fd9de6486d953419eeb2b91997bf99b10a30518c4067dcbcd340f479ece792cb9c5e81ceb625516d71a6edbdc193a1fd36778c17d1999b6a201648052f953d40d1415419b9e1570fb9a36bebd316f0e092c569e2e76debf4b9edb3c0934130ce76496871610e52d1cd32d17c4efcb3fd62103d1e04afb1af88111de235f7a0e06a6a995fc56be61d09457125c0ee62b2207f2dc8c57972f4539b0a028c8ea012e39c978694dd8fe38c88ea49aea35d4b5ee7671822db790bc9325a169a718ff6914baf417d4ad34d76213c1e6e3d9754a7cc90d6627b9db7480bce581b78a3a332f605dd5ed0c08b950e1807d0ed8de0f8153b29150eb610b1167b7f6a27a4c2d537132fff8e5ecbbeeb2d17e2434a261668360706ce5dcbee1d7e43a5c83ff3d0106ea2c355d966e2a68d53f3dc69fdee036813f6e44bb3c512d2a47ddb43fb0567cafabd5b20e147857b5f94206751efc7fec87e8c7a7b87e27b132ee0b75f39b796ba0f7c2be56c801c1dad6b29e9006ce2236e79a318929e7c9a556c6eb3fe74ba916784de2da24afa0e1f32044a55195ba66bdee95cef2e5b08906e77625295be0dbeb2b0144ea386c84ea41c87198db7fb118e88017cbff723dc0a027c5e5da079ea1f5bf277070b428f61e956050692842c6e73c653b0d32bfc117abda892a839bae0f1261adcdd6dabe8ae3cba0eeee84bda80bd587b4b79f33bda51a8c411cd1faaf68d136b80d4aec49af475bcb3994a6d8323441cb5afa92b9a244fa6273466a71b39e7056f03e5553a976d5586c9d23061ed548e92dc460c9f82e43717ce78aa7879bb0c9c20e4f85b2f8f5b0090f1f5aeef4533e4cd031b4a376f97252a3fb49536e9cb0dc0069a961c525194678ea847dd653870fb518a0169aa3daa966554507f0bff1e077e3575019954d8231e4b936a3c0059ae32e7704036699df9a241bfa3aa6593f702627118d826b6254201e540ac2794d43db930f49eb5adf568904494d520c9f4207147be60a491f0ade9064928d503bb86829ca3aaf1bf820c7709f89cb35097a922e17cb53914e938231072296c75429e1b71bd11866e3e18a3e66615507d9fbca4aa8c0a5b8ad417b45f4298481f8ea5dbac523935a17a1d9ed51a74319708f6b86c12e8ce6d8f41ecabed5f58326e0fa73bdbcdbb76f0cec837c58b8deb281f4279f0127ef7027c0b3540fe9bac3f9d5e7c4ae845377b45082b4fb870c76d961e762537efb7507e6b6e9165a50347e71198a02734561db70ea26569f10011d690141143cbe84671dee5ffd2aa28ae2995f1ba4ded2ae1718dac1c3a9e6d74cbba5b0bde24c526d83e3ca428c76a5813f5d5f8f8627eb073e46f9428784924d72ae41a509e153a9efadc7d24b79d41c647e4bfd61dc93418a89dd2b6db7c97112aa48b23f2ec4754be1394ba80cc4bbe26cb742dbdd99a6cbf9a8d1897be8927dd22c9861154d256f835842f4c5be57c95efa8ad52422ee0dcfb81cf6d90cd57787e7d4e19c2841391551e272160c53911ca57aea87e0967ab657e82c3e71af2c32554bf3f38a2d46d10676b2ded2383260b0558aabf612efdf3881ccf6b5dc43d71eb22851cc9d6f5e05ee8ca2085cbe99af5ad8530c8f7d59798b5b96e4b42e373c68127aaa8d4798307c9f11bcf998d7db2a36f4c007ba374ce6a43691b147401f71a2fde7a4067f9e6e777ec583ad058a9031dcd3a5062f58d738fca850720972e06eea9f097d7d7b83f82195f3cd0a364abeaf9d585c6a9baa0898ca6f32f3ace28ada873bfa119a81884716155de8e795017c81085c22e0bf867ea209ea2fbb79de31e196e894708f9f684eefd0c6b21c0a9cd5a66782daa93419f04fb6e865e3e9d8dbdfd59b33d643cdb1e1fc1987ec3541686533e5c8c0738da492690423a85fc92abee68a09e2542aa22f52e63774710fa2421267a2eda5ad8b46c368fc9691d8d66ab00a76ea04669d428e9f4b998e5a1b8de89602d30d292105404ef2076493c88fc94ecac7fae0b756888fab21a148ee9b121554285540cd10146a1dfb8faa13f45f8c37479acd57457d25d65bb86c80d80c924cd8e29c91436d8177ab8cdd7db87853522a606138e8992558301133600612ef59d482a45e75640a17f8f2b6e732150e609912bd67b20c52975bec7f5656d44ff9f048a96d5863ba855a4bae2e8f377c8a25b23bdf0eedef2d4cb4d00b183e5364dd7878a16325d49ddb2be7a8db129362112f9629dc4af733174b94ad710d301af2bb89bfff226f4bb3da30ad68a6fcafe54f528f83b7e185c1fdec01571e8775645a0ca1fcafcef32ac71086caa542714112294f7cb61992122c03feb93bbcd08d8c29cbf4f50bac404507abb1061ba84ae760a11a2dd0997eea6c0ccc80796a3be1149310e45398fa3d0b8e2b0d22594c29d30459510b2e44a14731b42f17f4259dc3c028fdf75a5ac2f81f4474bdb8dfac62ba8008c7d4052cebec59877d84bba580b18853e0484e81da0fa2089a9a9050ba8a959b598d169f548d836aead5f9ac03cb9c55d3ec3ffd311b27ab99c8296ddc0fbc88246fb21238e3dc9b92d839ad2bcef734426487ccc90366940683b573295dceb45d011b2ad0ea2e4cd3b51c32bb89be92308d5107b8b168f576d7a8c1d72c6dfde63050021e2a385aeb73f4d8baf57f8d90a8e788b7049140a64e0b1ccd67cda25e11e282fbe09963ef02d755b5dc2a00eeb66c6dc3b57fe2fce20721e9e214b70e12e33bd6e9701ba50f30294a923173d49d63cce95c27af4458cdf94291b81682f120ab28397e137fdf6dac6240aa246860513213c74827cf9db3c05e30061ac7b30f487a9458601af49a2682f98a6ffab4fe06002c79ec1678bb587492ccec027d5a731b28c406d8ceac72d4bea76f471259439227ff213c221861275af3cfaa83d6b9ff42cac6935bc43dbc2d7fb56247395c48a13aff970af7e08be05bff16e5a577ec7107dfc7b10b5b5931a87773cb1cff59e1ac7f1e16d1722daed0c1e2562154083df638d7d98a9675bf6c169eeb51e2efb6e3dc79117dec1ebad65308cbf654ce924ef6ba413bc991219572839195e77b41c5636017bfe74bf242318d71ac3df692a3660acd07d0c98d51fb56aa10c518d12e46d232258bb114902a908e9aca83b0cda49390b74ac513621bc8a2fa70491e70660993adffca1053b7e5d1e3e988e1ab5dffa178a8a40a80c3b4555b30cd131ab48ec445da0b792f1a0c70b6255f10eb1fd1ce01b815692e8506dddf281cfd1865e035e4239cb31d53fcd8124ead5c64b946056cc219a0e7fe3e0a752933863e42819bc565da287e2ccc6ae34bdb0fe5a46fd9f5778a73f22231c3d33ac59f6943be30fa63d683f2eab06b55cb2bd91331944974f319dcdeb34c9b033925dbacf0586ef2f5854479640f8868fa5a75f02d665b71bba69f221a0360f0b6d62f45f191c44e0160a96eb949f42562ce06fe049de6fc044ec37481c7c809b263358ab8d9bc73e98afdb1cd47e92448a9febe7a04b87096769577d00d55f1653a29bae3c550d8c67a90fe3a19f7370fe7b43806abe8e5a59f537a9b4311aba149150c14eaec6aaa4d66c3bc3b476e6c93e9809613ef99b011a9caea863ef150545793b06af99e6de676e3f66cbd8062582ae8967be5b3b3dc491c35e505061d6f0a7deee690edee5502a1b44aa540afb67b6a883e8698206b0b025271be3943496e58bb2b9273fe9d441584fcee0cf9af44d2b3866d883935ffd726838b308bc1de5b4c0a9569ae130eeec30b040b4a0ca1b362aa1af6cae72d3324483e14449a4f0d657fa596115349f78fc04a5faf11f55dbbde282ffc87d963bcab14a6bee84a2a4e6b071f4c4c4e73e02e1b33b28d99ad6ca6c15519d0e13e13aa82b992662c8a408b2a195a3ed2a52d051d1982d524d216969e840a7a30ed125e825c515273be5c0675343079043d2b06954eb146defcf079b7a696c3c7a38ef9abd79473c2908cd0431c4ce2f06c29e5a6370b405261ce193cd46a84ad9b94941fe863893671373e141ec7e427d7a760d9f1e9feb134eada05ffc2f1ac5ededf09c818fc21a175049e0ba65fda3cdd00b8c5d7acd1ceb09ac48a61cfaa0e847f73925b86c8d7ed714523439451f0eba3b04e2201d3982fac2d577a6106d393d3eb34201e5d515199f9dc325fc6d6cde6ed33749d7e423d76706571a654d3d34b5a9408cf1377b81c3f5098a0eec13740f07e0e05987ec906858af37071f6a5213d1c1eaf32dba862d3ae5ec38e202112e825df58ec646914b0d1395304fc0be159f0f4de8852b6d6cfa23529bd93499d6c43c61926feb37739ff09d4fa8492ecf080415d3dee9b7032941c9e188502708856b1c958c07756d0d1f2d0526e69d097aa3e9800238a827d9cfcc39d060dd504f259b879783ccc49c6eef72e6ce57e4984994a8414266f0ba9fa5b92aa0c4bd1faad036f0f4647336ead6bbf2025427502c2e09effcbb12cc3369529986cb12fc2d59699ac26501c9af5e2543e4889db75e5822246f8b91924cf2d10779c79e5428e0c120ea91663e3c33cc95b1c2bb200dd51f33c49448395cdddd14d3bbd4ec7da62c829819c0c2ffa3b6aa0db2d446f2224ca02a01bc32f0c8632446f88b1553eddca398e95d8148781b31e9af34c0a3c48502d3bb4b23e44ac8242afbc382468de10358ac484847b41185db621a712f1bddf09624c46055fb705f40c4ecff2bb85038022edf55166e4bd1ed4ef42b73190b100942b68212707b78733fb5f9133b9b79df6459e558716d22935c29a1fd76d45a1fb579b41e5d9ea85f9feaafbfd3531e66ae82fe129166d519b369c777336cbb6c8236e4e62efd7bef2b75efaa4194ca42de2abc763982440df91b822285c5bc47e47ae4ec237c6813aefef8201fa15e735e58ad3831f5a947705df2cd63ef030fbffe1ecb488af521a80d3d86d99b48f86a38023e31999175f7eee205e020b400f3b84828ba79b8425b9cf2d235df0b600c692df84b9cddfe62608c238c62ca6b367aa0a7300dd10bdffee79f7e01cdaa28a013e4d8f241109616230cdd8732cd9743824704587d20d9037ffd892ee49bf5edc0e2e838645c53bf3cd1b770a2c6476dfa1759a464ba0a5eff12e334a029a516737cc25777687fcf45d84f0b61bf49d0290f935ba3c7d22e494839877aa9f6a0533edb05c04b9e866f4a7bdf79dce563e0af69e40eaca66a7de01fd9422c496c0cdb7df14bad9408105f97fdf9af52c57217ca6e0a72d3a515d2dc36fa62c9ff74178b408e5d09dc4d9a217a0d8a8a5640e64bdbd4e884955a4e2690088994dacfcfd91fa2cb3e63f0df58f55f9bd5572409cb0f26f082e6acd5af084a881f2c7c60486e9f7a412e1243105e2d78f26c099d4f387d141f394f25e2875d99003b761e08b203608ee65ce0f013945d0dfdd917f1c88c981a3ef4b23e67c21d689f20765706e60c6cae5f90b0ea04ff9a5301686ba142918e2a9c75a7c81799a8dd7b347e383015de7e8712cd0c58232461f654dcb8b9bd8210c7db0cb0e88a10ac7850f11275d7cf04bfac443260b1abbeacb00e7f9ab0c10f16341e16eabc213a5cffa13b78adffb178113daa823cc9f4744173187af877bf022856a129da01e635e15488d9072c237e873112a1b1d6946275f7755a2bbbf42a0b08dee92e1475e01b015516d5b5293c011cea0efb36a8bc2ee79fcbd5ca7395405d2e47c49948b0d1869bf1d7de6ff31a1e01481cb8d029a463a50b62e161b9e5d94e1e117d1c8f07560d330ab8260626c80689cc22ecf98c737f196991134bf9265ac624792d4b912ee3120f4d059561b6d2149f1c2504e1b1562904cbc9bd5922789f21d943c410fad46e4e3b2dcc0a454b7dd3b395ac980339bb4015274111658682d464992ce59eb7ce759e22e4ca998e9f1afe453c31285c819b7bb393db36f3374298785b4bc9ebd0205019910d7bb5d832af3d62c21de9087ab8d4946b576686ef4f3a43e3f54106496b1102d8e877f1a8a6a8ce6f6b556bab066588d12151f05c4a9fc56065b0ddbe62474a3f55b494e7873600820040a70b6014060c5b3168b3aee8e6a2b70986d5cd0621260e18888380c9b585c1402f6a945ad96bacc2bf155f6d12d3b011c7b123452d9eadcf333789b5f1ffcb31cf429d3d5e6692303d8a5411e3d553b60e102bbd8b9de5589b661035a59622d9f2697e2759bf9a8c92c9d76998e9b25baad794efdf877eff89383920be9ad218c28944154a70000e845b41c1002518c2e992ad788df6334ed6c88ebba5302087989ff12e9b3529fc093dbbad68108c2fbc4ae5ca393543c75a97c379d208d611dcf6be88b7923cb8972fa28e4f876f15982e1b8b15518fe6600a5f7698edc332bcde07d93fcbceb76ebf3d0cc3eec143a85bf49e8ebbde6e403db8f134bac0ed4a953eded2f7d04c5d22315d49f11b5133ef299e4e15bfcc3a9943191d4a5522773cabe68aa64615d7445dd44f65139454a4080f2038c2448035fe79d0cf30497a7fe08c8eef4b1c2f22658a9d6838a62baa8e67d9531c0a923141085af90290c29d8b8be61c651dc6a5f1db1e15b5f403b1ab6daebd29c58747d3f1585770e127f7c0997ed8ede6941e4ccb7c4f3917d06c648ef0d320ef932e2a23b7efbc410bdc872699e8570afb45cc5f997f4714e10a46337724168f9719e6e04ef2fc369a567a6f14c58b61e171bcbb6aa17c3f4d09a851df558ac6a5791df3add008dab77a49a332a9e8ece5457c3d7f7747f7f21a07b5edfc12734c3339b7af99a8f60ad3908df231bd18ce7b78e597626ae794357d6be344371d3a5973db33ce07aa5816f0800f43d91bb9c1bbe41d3733a4f12b8813bc155335e344c7ed96269b1b558299445c49f6e08994b1db879938c1d0251f7030e10241f491b39053a6cf4c88fa80f3348eeaa50cbd8342f7ac5966f46fde3cac506560127719f6917146164122d755e35a3b1a5a920e53d982c598c152b060ab983e8e702b76acae61da64e608e717b056c80aeccdd022b9b1c9c78a6d6857536422c05fe2d70494d0127c89734093b4e8bd8c5fec0a41736ee5a86877e21e665d347e712b44c331f7df7f29fcf06209e6e9e842da6dad5771c7dcf8ce0fa489262b716c7b8575069d285b779e0235195ccbbf5c2b0d9352b11b12b686467039f4fb655d41fc12134f866f61e5778b2ebdbac3316ff0e03e10fee70ba5119553e4d49f2c09920e9fce62710b48221e073d830c7b605bdd80e65e2fbfc1807fdd52ee651706b5e98ca8344896540441108711d740364fa64ab21f715ec26cf09bda50111d9e598b56d792ea3f2f95bb6ec2fbb6bf4a845fc67e41973b914db4a231919fc9092fb3da0187587b9b40e1c34db42c1f7b7157a2c048fd190d5470bab1a6ed6bb1db68818de524cc4b3a0d4d4411c3e36a75f048a51278c020fe11a46d70ccf3c6f980435c32ad9c178ef70c9d9403209d2efc0c5cce7bea73394fc6254240839614ef7b7ae5d8065186244d50fbb52e29e2e35a3a8f82f5f8c067944543709199536c8c95c26c3c4282aa761c42b531614e94962d37d01fbd30bc52bb7516a5e245c3fcde80592195c5a8f5b45f2e0ae98ef91f52cd23116e7adb64106d2092f2a31f3213363672c988e4a960b43aa6c5c22741532da524e9278fac00538ea68c5cbc52c96e20054e58016477080ee7992375d0e32fc8546c74d06340ad3fbbaa1eac74a1cf8fda9d50340dc3a794448a361220a15049cf0c6f25254196ec4da6fcab2026a9238b2e4023e609ad4bdad47416190fecd21ec9abd1e9c76580543802dac4cbaf3c23a1e9769f2e533f9c172a0af57e48078384f0545471d5871ef2e4b6141cc6ac9a371d029a378f73902a6814a3117e349cca477be39e3a868d99103d9a7a0afddc315f9506c4550383814abb87a2c6e7372415684f28e88c4d41eb96bb7353b30ba6f1a03996ecae1e59b03a7849a3e8bdfaa9f5573a61832ea3974fd49f7939ae99c6cfc96a40c3b38b8d7a00fddcf750e88cee0441c0c2c86f737b5bb66957cc21519e6b4041b2f56ff20d0f8adcb27ae1ad7ee6d18c6acccc19cc0c5d9af20e4fcb5328d0145e52d3ac0e9e7b7e81901b317baa95ccffd7f6912aca8870989b2a3622218e0dcd94d4ae2a79f3894c3a922912de690fd979f6c20a9d3171c434e2224b872b3834089f87cba9a918bd4f07e6af1f67f1456b96b31665759d45801a2737d38f8ef1733d92ce035dfc1bb87164ba47cdf93c9846e7a3c1306299acae46149a8a87fafd217a956f5fb07b576ba57b4b2caf0449f38c370ae2f47189cd4cd9fdba2fdd024ad1e7fbc238087767e0cc06695e1a990d10131298a481a804409fec06521bb572d5227af6934bf07cc6a057bb2388199115ef551cd8b846fbb95f1248afde623afbb9b4c480f843cb30eb445dccac63c0890400fa0bc1b481e9773ef95c216aac5b373f2ebf3ce5ed5434c7619464db26dc86e80198eeb09b0c24a84b0c4888f34146e6a6f9dd05a39ec31e4c1e6815efbeccc53478979062b427f8c0ef95af879fe1702d46ca74938690cefaac742cafe1206cd3d4f1ead1479c4ef50f24007bc3c554ffc5fbffb8b0339e742d4eb5db2103848d475a8679b5d51daef49653d411ada87f70fd08fac33b487296cfb7e4d3c53458f8dc53f940fcbde1e5e8b23b155ae837eab06d885354be626881b541b53c2514b1084584d7d921147243ed3f6472ddb14d8bf5ba3d6e6210c9de6d14d707e13afd86ea00ad30174a6f619cd24ffd04bd056981622db5d49944cc6cab14d6b61b2601bd0cdfd4d21a6cd06a2600b2703210bd7fd39af17996f66cc024d13f46c3b0c13918c46101baecdc2e5060de4ddab38d893be9f4c7f60062005e8b4b273a831750be436e86f357180e28a7825a0685c22cdca08e9518f391af96b2ee1cfb6677a8d7e499ecc3468af6466ba9d9d61a114924727b65f7d2cade01bf02cd02e3020ac41d33494cb6dc6eda6a8d6ffbf9d6344debd2be9e76d86f5dfcc914070d1fa0432dd280e939ea873bd2034eeade66b7cfa553e526ad337dfda4939d19dbf4af0d4405f74a9ff3d65e7d519a524ab5a69f33c69cb6f7c28bd33f9bc4f973de939e7cd513cea5b25a7f524ab74c9de19ce3f8109fac26dbc639e75c6fae397fbeb55efdb671cd39e79cbfdc7703f1e7fc75077bb6b10ddb30fd41a4e69c73be615a6bbdf54e144e0446f36bf5f32956ba7dfe596e08209832855baef16b31ce3937f1ffb6ff30be61a6128661db866118a639e7fc5a2c639ad6b68d3f7eae71ce39c73294451d58dc608a317e0b4da031716d923d92c5f2bc7ffb9fe67665d23c02f9a31f6e08e28f5e7153678b365d17a769c24f70a288062c5f84b2ec628c7196d57c51b92fc6b66e8c31997a5d8b23853b646a265dfcd85e7ba1f4544848a423fdd361eb0623060e4a9b52fdd7ea1ce352b2473fceebc8ba6c6f3bed77671f485eb5a4673ac3f57fad13bdfa729e65590694656fbbec7967ffde681139b635be62a0aedaa68b3f38a94a6d3e93c4e4cc75f147471764ead4577570b7a4572de4342079db38a3e6378a66f5d6c58e75405adbd6b421b61290dd2a6151b0f4dbc9ed76b2e30dd44a25e1599631426ba7b05160e837ca796152c524803bd546dbaee649db6f0f3bee72941ef69c7df6b05f2ddf44c1a1df27dc139bcf28cd4ff9e6b075030d813bf50f58c2833cd702626aa5a8b7c3b31ac7b6d632ce75dccfa97f652f75b26f9de43af873ea6c3af863aa78d39e310baffa39b33f71c7a5b8acf4b167a58c6f6c13813b75031199d9e74ddbbfb63349afeadf936659bf8e2e890f598e57e57813fee7e671ba243e70ee53dc9bf03fa887fb81bdbaa4a73fafaef4f46a88f4ea5f789230d92fdf562de9556d05447af571de885996e3c607259ddbd8ac5a53a7cacebb201d0252a71a90a95aa83f84c866adf40f822177025dc41f37f2c409b8e0dfd52312733ab0855fb382202e1977e0b284122e55b654d9d2ad0cf10274497f081079a45551815f82323832c245092b5d4af942620f2b7af265f4be02ba8c3c04883f78208f7c1e5d5e1e0474f9df8ece630acfe03f1e1760b0cb8c11628c10567c5164c5174ebabd82660522bc7811c28c196ba12073a4e7b70c8c71037ad0e68b91f08675a9c4714f305901882b7b2e4ae94513b8e6df5c11f775edcf374c70b8458a19d9e50422fc6c9ba47f3cfb65bce085d1d5a535009616069c9667d6669267b4567b691aff5c35efa0d65967add52b4a46ef8c67aaedfd1cecabbe254d2b6d7bef7cb7c6a3a6d492322afac783c60f90b350e69c73eadd3b779324779eb99bd65ed7de247c6badb4563bb5a63547b585dd795a4eca396d0d61a028d321f4ae6e4955bbdcc4adbd9fb139e7def4b10cbbf7da7b6fc5175fbdd989490bd0ab5e7b73ce7a6f5d4ba5abcb9ff35f2ed75c2bbd54882235b7164699d927a6df77f539dce7489dfa39aac648411f50d69c6fdc403ccb76f65ad4607295ba1c0c2bd559c3396bd20799249cb39dbd25eaa26dfe63f06df9ae800a6e3f3b55a9450d12bafd8c4129b1af03ac6e95b4edecafbe5b49d34a5b8d3eedecef85574dd61bc95a8b619c467aa2a87f3c1287859f506b287ace396dc85008af9f639dd7812b62a455d65aabadb5c223fdcbbadc09d8c079a5c9d7dcdd003f9c5d71ee3f4ef9cc57d0cf74894a29a594d63967bd73ce39e7bceadb22b1cf492bedb0cc39e9352586e2849fc024c59952ac6edf94ea21c5c4a54c9cf755f8a7df94d23c8c1d4cf24fd0b49c73cedbcd5b8e77db56af6979cb39e79c5fee8c7feb60e7b60db4bdbe3610d65a6b0ddb3967bd6ddb763755196cc486f3f6380b33bd8a2cc4745cf18671d67a63bc81b0feac495a67cd6a922ee995ce5aefbd314cefbd378c31d67adb72a6699913565239e8c0aa5a7f5ca635b6b8b3165badb17c9d43eb962bb0e8574c500b1b5d74fc99d31b085f9bcd2c6652db08c92642dbdbe1e58c936d208cb23ac3364adb7b6bbdf7c6b9d806c2af55a6ae6435d75b76cdc2ab7edee8e452dcb6496d1bd18c9c34c6bcbbfb8348e9ddd55d05096d299469ad8bf168ead4ef2269883cf5491d868244879dcb19e0ced1c4f1a8fe5d1df5d0ebdb782485d2f00f1ef55a3fc84809561b8d9f18ea9fac32a5959324000adcd23f539f22662538675280e15e27d28a93a0254e9248d9599d8e98e243fe0740cfb0cbb2d61af7ad553ec11e772aecf3bc825938e884e3e9d14c719774d43f1e19ac44b9679c31c33e1168e875ca108fb662ca92da813c521e911fc420b8a3051ec52192da9c87e021f30a894630a5aba0ae5a32c48951ff220e39d087cc813e66bfa921c31c6eea713fd917cd97bde84b2fee979e4c3dd9bb4b95c14d5cbd9a62d13f9e785da52198608224aa9c1002ee40d384f1a609fe715c2d5221c697525e9899fd5b4a114bc09cb0d037c994cce9f04b965e37add666ea4d9fedff3d8fd5f2faedfc7d22936d759978914c56457cc58b86909ed4894558b8fd2f169d2a374d3bafbe947ece63bc01dc91401bdc9d00f4a25fd9a3b994ad36938f75f6e50309d97b158b5a8841441df9460831c1048a481483889e7c0ea2144a9ce85289301108b8236391fc0c36d8d65a4ae79c965ed7d4f48950ffa21931e619ff77a45df4f8f1ba6ccc5688ec9957cf12a7841dac568c11478c59f3ca2323d2934148be183d515253c65486fc4c2f52fe2abeb14eeaf1c9cd48a38e4f3ba07bb96bc61e8d484ffe91b83b222c1a9fec0f22f72a48d50291e903825cf242978f13e603b82383e08e7c9515fe412a840ca11cf46169976d0a49fa1771e8f2a79cd6461c87b23c79c1a50a125a4a10f67c599f3ff3cbfaf51af65ca5d21619e64018af873b671e512384f9c6d577595c7fd82f7bc98f2b0da45c7dac1ed293cf925d4bca49bfd63bbffa2c56fd1e2dd95357b3253de94d568f5b6d6d495397ab1790f87ff8364970f9d70546ce6e5c4d10b545b748af4e343845c319513337d4c8b27ab0708dceb07d7afca79a93a6a5f4f5767816e7dee4bd2fae833d9734ef66cf277b75aed19fc37d2ed97cec251b544de65b5e9157e00eeab38de6521c97513535591251224a44897afd93a994a9a8303232aaaf372df6dac91eb7ca8a2c59b29030ce998b68fad02c17d145942f224a665333bd3ea7463207d8c35759c074d8ebd331340b4d5351e8f533cd5247a059e81a9b1ac19dfaaa22f8478d7abd027dc4cee5a0373aa3e95fad9d6c808c5b547fe0ff2013ffc125480474a8d335564f8567be168bb4fa589ef7962589c49062441e6b697c4b65986b488a117f5c5e228ffc168be579ff1c37af21222f62c45ddf0e4d9f7a27f743d5e81aea5f35b223401faae4329a5ee20fcacdd095b8a0e4e338bf8cbaa449fa7779a151c21cd1bf6a46943a06f2c8bf5d2d036b35526161142797e2aa19e9c9a7dcc4adb7c323912e301798cff9eb8b92e953c9441df96730a96c50218b64287ef54c977f19a5e949e28f4a26f2c8b728d0237684eb680d345d5633d4045cc754a3ebcb17d90306e3baf29046ffae146dbb451d972aa58cb0cf0aa28e7c31c8c0332005b113b1c00249a44b5d72a57f300e294d6bd4cf106b1dc5079bf8d1e1001c801cbd3575e20f1eb18012f4213275ea863d7c2c6e138542a1220ac5edcda13e4fdd9a3e51884a149a1c0ad5edfa52884ba14b657237b63c12dd8847aa30fcfe178f4ef3eacb9fc718f7defb31d42492fe6cb5eee2516bfa0471479b771e701df57206d883f280ebdac735608ff6d5e62b77a345bc794eb2d65afe79db3e88bc4562df38c618eb0cdb75e3158e118f9fb19bc7ddcd074d9fd805ead48f54a04e7d8e73212131f9a439ce1871f3b76dd4e00e874b0f67d49c36d0cd079121f0c7b92b128b84d0b7c77b01ad6f2b3924853ad9240c3f956abad8331bad4b972e5d4a1baf6eb2e0b8934d4e7206c8539feb640d70a73eaa934da898be72dd94e3e3d09a362e12fbe9334a632848badc40fcb70eb5b051a6e3cf351ab7d165cdebad850d301de31e8dd6a8e4ec1b2835642401008204b3164000180c0a0643815040248c8569ef0e14800d63883866403c18080591388884200a8320888110844110043186008510824c414a03e0a2d2fc7bc699189a65f3f6d8e8b9ece138aab28a2052ecfd75489a0bfb043312e67b49f8a0e0c4ad5381bb4b28c6b2f7ddef1699085a12f9bf3795171fb4e54f857eb34b2439c88adbde33737f4034e275ef63630383424f95136aad659ed6ef42799d0066720cefbd2f1a8f0eec6bd8324fd75d2c0c56f788e70f7669872c2c3c2d427bed56da0a6a5b955b7d8110797122b664ed9aa061385030ca08d1899ad015d7c202092117d6b53479434839ead73a6bd3042208d67deef9b31faa8d6b928c9c429e55c5f19928a9047b370571b42299acc492bf665e88368264f3e41979948268207ac9a6b7f41c7edebded3b3c4b3db79ba0c7a6784ba4a14d005f6958dc12bb04d219976483723146a4a6c8047a213ef1625502a8ff0865e9da7f20a429858844f767c16db39cd7b95203237d5bfbf6ce25d0a3a399d1d423e0ebbee0b52bcc3d9261e0ffdf8b41780d249ad83d79fc65a023b39f096cf2d1ddb7994709fc569f4908b563d57f46576966550b49b4b83d5fb5768a1affdbcc34c646c247cc9bafed60a7adda459ab457b13a159b14907433bbac85250eaab8caf12df727cff5a4606fd5b8dc331a1dfc43c1b08d96ff1744817060d0fe329d75f294d40485642082c91d9aba1c8046f4baabd0ff72e0475339210104c9ce9e04fce170699798d09ff52825401e650a8053f53896862d81e1225621eca3d4fda7d09f6669c27fa907f892f188ddf7421cebfc63078a65bd6d2ad1a0aa161afc088a61874e9a8b4cc4860edc09f7b53b724f733e1c756f9bdd913b0f6e556e196073008e1c7fe5f3e866b502fe53dc445819c6b1cdb9f147768a71bfedbedce7e9dfe549585bcb7f77902475117b144b02f0b4a5c36cd20c436a4b0ee6034ca6e8956b124916a3d5873c524e99238c757cd396752433a7577bd53041baae8afd576e1f0b41dc1900971dd7b1655464735fcea82b7f0187cb1b62b8c0736db299a117ef69f1d3fa632713b3ea104619f5b7664d516b26465d6d29f83b9f91a61e6a5e3ec8ee1dc3d9da9c8a97a00cb01568007dec549a623a6fc9d484562facc9bd7473b290ddf8118e245bb16ec70e739d0814a6e3195c9f7113ffad944914ba3c3bb419d7fd8f155c101387de207d8139e68741938948a6a8ae0ba8274b3b4f6b6137ce6c2478935a5d1123342271b8794b2015b788abd771903259d49325a433500b77f51e172e8040446a47c3e4ac0cc860715b4e0d5436e34e40ea76a3d43b763fca61d33b927c5e77f41f65554722169bad01b2fbe648742e84f557928c55490c6018e1fe9535bed8903f03e8dfcc7770677e434093e490263e04d9996144ee3cda79ddc4cecedaef2b46aaa5a5be1b732adbe134f664481e276ff8433d90efd2a563f806ebe98e817a4f5b27b75eae911a6f96bbd017314f5635841b037e2799d2bc494d429a5e58549f2e44bdf2abda54d95828eef8f05f472b5fba470a94fecec7fd4188740769e91c0e1a16d8dd618eb02c22d84cf2093358c647c0603524a9fc570ae3607576b428bc2a9069a8b36a52504b09655e639fbe00bc94f23a28e4236ca98083b017b38e11d23da920c7aa1b8da0c7b82edf86a9fa11523c4866e92b897235ee8f81098a49013cea55a82032e464697aa8aa5d1e896a181cb752df4e07cf7b4fe70a3b9b257c4ecc016bdea33594db0cae396113c2fcf77bf40b7ada1aeacc02af1eb7b1f858f3999dfbfa50234b3c1f88d06a923a937f7212e3a26b75e6172bd476949ef6fb15ac587a5a112c6b16e549a887f739f33982d8d4bc198824a48dd12fdcca191e620230a7cbf6fc9b7ce5e291403e4ea1453c0277046ecf37413439b3790aa7ce172014efbfdddca9ef986d6fed647d8f118105cb1f9d0d897441a40ab32f44338069e6731c5ff8b0e7fde30f6022ec421875e248f0971fdd321789c84f7340519af88fde775434a3480f2c04a2dad9681a17f341197a5472008bf63a476d3f1477332f0abfedfc563a20dcebd18a996e58f134e0db03dd5de2d7d311910e3fe61b443ad96a944e01449d0d6775003e76b8648ec07a7e7e79be46118065a939661b5af107e67e1b2de0a7bba6f8082de4a7019c4f2830457084016b8af82ea3b7c59d9a3cb44183e8255c07b69b467f61a26554a786a2941e79cb678f45ca540cbfc893b24888dd069eefa6a1d3533161a6b1344763be6d96cc597310fbc98569ef4d39bb2140bef9806921990850bc8269a9ddfaa825dea47aa95b00d1bb4981cd5959f70fa7485547b45e8d8629b238e3152bde02a092d406ad8e2f68dce8ff990301cf890cb514b9b629a3f78da3101c8594ab13d727f467481fa99c277f295a16365e422b4d69918c901e10bc905090c2cae78d894db27484a67495471ec42f49e85f4f061533bf39b7dbbc0855df84e9a3015bbb471926f9f32884c632d01a404c08ba8182ecccf8fa275c93d2a298cb4fcc211d40c4427fce479f278dc551476ed30659bbf1e69e39973b72fea18a8deecc4cd6ae88dfefd131049ce3ad4b2dd82fce9f6f2d14a18f230115068cdaa30c4dc1cfa57627c8e13db83765d0d1996e683d3f3870710877e0033d919baec807e2a746227321d752b83c3e7783975a31a61b51e7ae31c88039af70cc3adee26c9df3db223a1372bb33bd296e43d102e566f1e5f90d967927953686b40cfa08c49b5402dff7070e32facf90f74e6a3d507bae2136c6c560910c46f0e018f2020cb2af676e0a32ac044432088995dda1030c90e405597f736dd60437ee6a15c75842ea831cf30e4931dfa77cd2791c8e36040e1fce76c2388363c1942743b80e87c789cdd239fc19d191f54f10dd585a5021a2009400f482491e6fd7a223dd6020d1bc5a4c5071537194687d09b4c306d7e70a20ea6b564d82e88e82f646c3fe61bff622a2e355710886ff22d899bd559dc16aa57ed9ec16de477f7bdfd4cbea2e52a88738aa7f41bab0d30ddeb62c0ea1f9f898fad29a20465595e1c31b50ac5a13690f3e61907a89df1b7ac8e739c59a53e6497793b1ad56444022f10a90a0518312733b8749950f033fa6bd1507b70769701240b7ed036cc7810a477d0b7bbc9b94f08099e7c9cea41f2841c19de512c06e6ef2910aa889a7b53cdfae6a3e7d08c9dd3c62e7a90bcdfd70174cebdd32230508223e45cd5f5e94197ac63c6085510248e371cc80e5e9e30b0a2b087c9593ae42f0cef46512ff1a95a7a871c6c6bac20fb20803372ac9ef57ba11cc7c3d04cc5f3cee3a91019a24d7e8d3e63c722bc3a0433de7913ea4d7421fdfeae25390d9225459580cec838e95e4dde4edda55a1156f2535a7d904197412dbcd6f9452a37c7d7504fff8b18648d856a909a168c6dbb0e6976e8c504f87b20a285be9c3065a364a6935f0e2149bb490a5c54175d681d681fef02ddb53ce04bac023285ff9a6925d39f6619b312b967f2d21a77bd6f7f4795a55838a687bae707d4ff6cc0562ecc9562a3ea5ce5c40c8bfa6e2891d4515f6ca839b3975629ce1abdc04844a00ee05af6bc098e65a4b58765280c3bd546f82368ec001ab42119a3f6af319b0c2087ccdd6ac9b0d1133f781fa696e1be8978122aa8f45054f804815676a6785c17898cab85c12559a4b730da073ac272251cf3dd013cccd726badd2ad228423de8a80b3579f8ffd7e72696225fbbcb964425afe1942d54da3242615df4223cd21415552c419edd8090463c3f19298994bcca24169f8d8e3bef00f964739acea42a9307819c354dc2567ffd15c4466237dfc9f7b306b6a57df8f2df88b938ab8e80a0c2e89b58f1e11082f4656c8a12fd34ad8b7ce326b83d3f4e2905ac86b9d931094040937b9bca5e30d619659a3e3efc94a95aba1b82f04560f7043091353d49015114ca7df3c04a0483d1ccf7cfab80b23eeb1645e96ee9ea0721e0239cbcdf4d1591a3cc99557cb7ff06a425ff782a9bcb2af1b4a39b8108736f8c8493ad2e0757634585cab3feae0714fa7c03f95f5b05eeee6507107712f2029347f776c09a1087c39b01510d125566122668588add69f937323a48ac7c152613fc77230956221311c6d65d39039ec2b15ea4c69c97b17a71c2dc712dff2024a748bf3f0283508f54ff1b3ae47e074628b1e446ec3fc5975717e5e73a69afbb8c3045db95e130bd4e856a960711eb28200366462e429bec6dce96591e61f21916af17a1973456ca635db7eeeb47405b24ec749c888eea1dffa7d253903b737d874177a639903b27f588d6b4b90a04839c8d07b0a721b44730943b957cada679fe7f4b3db4a08bb770dc71c2a634cddf72a61e5951825fdda75f31e11ef54d7674007e2aae1e73dcb5a91f855e2401f6a57b3cdd517522f9294c30c1e7aa908e7a2515dc19bd55f17279842ebfc6dc21ae876ec9adbdf08a64305ee39e617bfe29156cbf8d48d40e85ba04a6c90885f32484de15dd1c6a20fed8add6f88ddbe39eacebdb0374e071a77ebb73701f4d05fd0128b6577023660809a88e1c69b3f4ad8227f97089a3d86f8c54f6a0139e324db622ccd6b3a050c70f0ec3d755f3736ea0f5966ad25499007610846ff68541be5d292881a4d148e333bcd18db0464a3031005e3da435688da12565a74ec69d5d2d500a7449af04592162fb2ddcf31f0621da8287cf5832c047db48a8909a3472138ba37c45438846dcf6986e96d650ce715f39492b99fb1d87d2ff4cdffc5d0d3c3340d927d742eed7ad98c21cefbd23d5d9aa0446de741bcc5c6caa472c1a9150eb444b476fb72e1c06bd4c35165e6c103273db0e1c53e56183f200ed636a6dfbbf13b3d3835abf9bd3728fa199cd3b4a34c20584462cb018e60008fc48f79f9e87800a75f1ca588f7dd8d6d03d45d57b93f3d917577bd5b57497725c208e24d041019f5d0aae31e26d6c0843ed72880d3c665629a5303ba71ca0894dd471b2b022584790ddcf9c547ef9918b30cc8309aab80b410c7400988ed865ac04ba08850f8de0da8481006215362c83d548fb1ed21231e580366c8cda4df2b962c875f0e42175545ba26ad15c2c78f0fd09517710502c9e09c8c0d0111660320ac2ed09a2873a92ec2378faf0bd30293f45221da5a1515f98feae0783934aef82e407052bb68e665e48ca2ea7671d2e0fd8126c871ce74ee43e344090a60185d82098d8708ec16ed497f62f73578cc41307f260868c886a069910edb6ea08aa7b2cf5fe584675d3fd1dc07b50fac0978ed6503f33064cc2ba33e0ef9131396fa149f6698e1811c125b52a70f323639977211d935fc190425a8fdd542ad60368151158e9f424b83a16c7fb40f896eaa70490b12f31da5105a826d777834255ad020e759b0354dc7aeca9a5fcb49d14022cffffc3b1b63126d5b4c08331ac244dae70da57fa73c52e2d2ad86f2ddee8fc6b58941e2e4a8383920826bef846a4c1180a0c45a379bf0d61443677aad4599669602f7f4065d660e3beffe010a83a9040aec527310025df455395d4aa11075822c958ec29279c230cc708fa83bc10af10e50291431e544c070a870034f1b72a77741b289f680f9a8fa6ebe39cea3e7f07e182f16867a09fea69f1b1a72ce479a49f99906bc7f6a2fca46da534d367522f9128d292c86016f6ddeb5bcec26219c134edfd1d53d95dfd1c6c801fc765436688cc45a18099f31ba9df9db4cd966d6975d915f9de4675250ffa3d147cfd0e019ab81b3b72b9cd6ea9e192d071371fc6236a378dd06d946f66af1b835f98536ed9871b1da881a5cf6667f1750cfb0fbbb2f24a80350e2df17e8ce53864dd09b24d0322efe72f1f76496a7780aba46bf92048fa04f2c03419e147950228d1c720fddf318241f2eb894e75eef3ab58ff700a3ce2f2168d08daf448f45ddc100368d9a460c936fbced3600f7ad6990815e089a9ea50f2440d5ab65ca101b318554e31ac83ba47d3067b58ea16a500d400e172e7a87c26283b199b5db0296451c030b630d87fb3fbc52eebc19dad35d2a482dd7012a64b0a8ecb814c67fcae3eb58aaa265f771074c010d8dd89bdf0cd373383199f06a9b8f2ed729155e9f17ee424752920a97541dceffc1ec64b340f22bdab4aa72010913f2ac7b4f476bc901bc6560c8406ac02645d51450cfb5ed980a2119a38020bbe4e078979506ecff72649591aeb48d4b805f664dbaf942acaf5a5ff68e9b871073531020aae7b4981e0fd08511ad5e895429ee0f8cfcae69f93727a32a6ee2d21ee575dd1a72532c5cc56444b772070acb864162c862569fb55dd4cd5b67d53628358f0711d1689f27099645396b9956b6ce5d9b105bbfd1dd048637c984a2148549eaf85ae14726d874af828be7e2a0efc6d24e062f5d2b88b7ec5437f3d91dda1303d17e231e568bbf351434e24d9f89b26f41a7c4930e9333e3393fe6e09c37bac28250c6db62afe2fcefb79708cb767a48c30db40d1dffb9411f0f1f95d47083b3c0d5deea067187e5dc2b00d1055a32c5bb0bb15b0eaed0de1db440ad24d61e1f9cb0f9daf83f4f2485b017118a1571ee003dc3622fba1d9b608229f7e89486f252979ef139dabc176b8d3dfb48e0ee75bbac7722b187b0f416a3cb5eca8da9501ef7c513c5d797e3cde806bc171d1e267236b86c3a3d66ac094f73b9bf1e17bffba600abfc8b9df03005feb8d99150c132fb54750c9fd50e1c284aaad233de38da897dd7df4aaae8537418c0c2281d799304c5fa802d5a97b48ad320b9988ec2e5cc4f702ada5da39af844b73ab8ce76a796b2bbc2ccbd6110c4b8f04ec9e534aa333be17ecee61874bd0487da41f7a9c2a3a442853495bc88cf5038e1741ac9dd5017aa9ef91c2180871a47dcaa02d24c5acb86d5db459bf982414aac34f7bd53cd9bbaf926182f5d7b07b08399319b722cfd3e12ccaf4d87e7dd5796377a2480816847113ae0f78a85d007221691a508a9f437a53ee7cbce60cc85c0868e14a0a516238e67841d80abb7525e939e8f4fae05eaae01d5a4a596c72d1518f1ee0c0348616500d4dc00f497818025659fb46437f2a90e5c0b39494f546ce9df058ec602c5d138651323a5744d7469b62578b801d40e44e07d81d02617af745fa1a6e60e4a05c16c98482f350fa75eed0eddc99473446b525985b2c29ac6218702ae25fd0845fda26bdaec7f824ff14ceae1667d933c3b662090e27660445180da8a60ac217902c0378cd085cec2e35016ca75b2d93a9f6e3b899a703c36204d309e25557894fb73ca4d3e163993e304638d761c291800005665a0702435565e6a6e0ebee19109346e0a7bdf1488a8747fece6491be0b6523aafdfb47817c8e7598cc252bed3593ca0408a65bc363e10a6aea9d866175936c7971b0f45523ef3b4bd7fad4c4ce689b288938edc44e2198e59274e6841c1d8f2f555d387f068b1262b4bcc07b947100f8d5d5b1269b123c72a4fb53dcd07711bc98eecbcc89744a7223e98b437c87c2fdbd42ae73941a65c2a8b31e42423e01380380f15e96d60c8b62f4ad9709f5798688cb389b2ef8def7fbbd70768f28fd2ac69202fe6c28dbe0a35eab82bba29f831194278e50c2713dd520b3dac4f66f85b40c72d45d7ae7ded2f54b090b161dd5c00eb334838d3d031312b76b720d8414108296735ca52816f7a5f3d729e699c0e81bf623ba5e79504faab1e733236f28bd1262542cc3bae571ba228790c188bba61324e708d00fb211650371c3d1538eeb8940a1b0edd749d73d37d546aebdabe8fefa2fc836ba6a6a42c60bda6cfc399a547b2abe7b73cb21a7191fc4dd8b05683bb6ec89c989da50890b031be3098f28f241c04a367482cc159ab49f8ce47abfc03c477fcc9bd14322d647bddead0763ba6bbb1b5b5e0098bd8d203b996d52f6d8555d544dc58d038e0acfa3b1342f0d87686b59838e1ebcf1b99cbc1ed5324c6ec9375bf4211fb5fed0eaef046847c4829a2dd86626c89172a65207f50a034bd97059199893716d81155241262911ed12c4164ffce598347d87f456b470f1ab4bb35990e7b991183978590b57dbf3c5cb65bfe1df99cb2b558c76bd5f7a0c3c53955422b8fb14560e34114b67101c162cf2bbe7658961f7c5bba2f241ff25dc43c721b8d2f52edd4ab70791e1a56f00eaa3f57c407650cc55b188549ad49cefb82744576eebbf2cf536b100501785da1bbf6fca60463216135d65b3da08ea63b78a5e7a2a46f96025cde3efd0d77d082faa452e4c57d6a08f8ccacd0ba0ff938f66b1df6eaccfb530f23f46b68e215e39143238bbd2ed55318fdbc1a8113c94bf269e3a007ec439e75073fcdf529ebcac5af68212b5d51058bae2c0183d000422aa18c5eb5c10344c98c82974ec0fe203587edd235456f121ec4497a544633b5800e4976c32a1e64a765f440000edadf1ac64947e2ec34f045f8c16e39e241be5d792118ae20cfe813f11bdad4a3545002e12bfcc6c209d94ce577b75277dc1b838fd293e3da3e01b7d0cf663708aba426e04b5e7f7855e80954fb06ea065923fdde9903c81c8c57ad101154f6d43ad74dc7aaa8dcc8ec6ae30d5cc486fa97f274bfd4b1ddc46a518213023747c1109ee894db86c97be6e18057cc387bce36fa85a5d092094da3f3bb06710274398aa8fd7989825e61143aeb1495d95507a454a632b19854e3be5f7b2ca73bc7f5999029e9c6c6ce7561538730bbcc48ffdd12e7a2bb66a6729527f14d8863d1eb5ce1eb759cfb254ebbb6a354119c8b13e62d8d83cdd102f5c36f2d0ccedcbb18adb809dcd361222989b5bad0d83d77f40bbb351e3f21bd1ed3db28dc943481c8e5514b7552a08733cd965038bc91101b87bc1217a99c777a74571ce9488718ecc945503011df29421dd8e586262d940221eaba221010d1612d5d9a3470bc9e958ff8f0bfb142bee4104cdcb41e7915a59cf86f15b2bb0b36733b44a57a786f98346360aad0843c1b99dd57810db760f4d59aa3b7c9f92f69a8bb876336eb11f4f66c9437d4ce38de338cb496c253c261395d20ba15aa27ffaa732bc3f68f6a03e3a90862b0472309faeed28b788205393273cd2c88b7615cbf4bd6e67374ae400519dbb589321034f940ae39e86177295f7c4039b5b560866be34aa9febe40b127eee65de2479c2b9a15af05de836ac5948223a1a86285ebb01480a85cc0067b60556aefd2d7b9bccb705c0cb8ed7fe9363906be5454a562929e719cd298fd2e6d9dfd1fe230647a0a19ecab00fe94c4a6875bb58f7423de7769cb2fe54fd70cbde1e06b0837e23cc82235d57242dde59bca6aaf143f041f1490d5ac36813fc595d77b30727968367c0898592eb480216820812ac84957b9b828f6960d168e3c452cc8dc42dd42fc5b4f42ad43eb0212bf35cc05f83a54301800108bd46c27662e3dce85ba500d7921f9a73eb68b551d0dca2ad896a65a3a359d3527892070d9d02db1b0a8e08904a404ee238f8dfb16744ce777e5b8e046a25b121d41a6f5053638a495c19b4b61d2021343cdb7124a1907b41a6d4273877c31de926a34e3674ca449395afcab201b504ab14424a01f9c30a2254529e6ea3aabb78c96a585c4e3dd9b1db6c5fbc5b2d88c1b510cc6508807574b7abe2a125768ea57b95bf9e5dc526515d27de89735b0b6a538defc6c2aa8bc81b7e5b5a3045ee18e006c656f796984acd7fc686d6963a876dfe225d0b7e8fdd2c6d8d8b23bdf69b36444ec520c48284b81534eb079ec3584ce06d46f85732de2aaaabe51d50f299165dd752999505735d67617e2e9087a00742d544b861a6def00e58dae7d43c2828b0f1571d2e4c3908f71e9b828124304069f6805a92db24b11ed8374dc877a8555fea19a6d0a1c103c680037fe5bb49a331e1908c8a26ef8ebf073e7f26a7506110a5fd49e25d9a679ce6932278f18780fefa6b96ec4639be6c8379b05d7f165b1ef9f9432f253b0485da926a6e1132c5da439a105c24d010752dc58ee636a2f78026040d3d15dd5fe7a95c1821f00e8ee414b4603aef7b0feb9d6743337708679600e24a379e70166a72e11dfbece991d4c62b431e85843d899aab0d66ea4dee8bb2e26381da97c36109da4d07f3d112a67becb9251677425a5a5417c2db00c9d6bd240322a10ac5b1aaddfd640953c651f1c0570a4db97324cb3a6de03d5d79e4d9dede12e2b4a46114e441092e9c6738923218a345c63dc6ed304420cacd2dbc12d66d073db1a31e5c1832feb7c7496b7376dc3917783e85e0a0d35bba677ac6e25660159b125e5b40e54fd769f26d8adcc173416c46ebbdf579724d489ac42a47ab7b67dd013654cf4a222b716a0d753e2cf02e366a73a2a0f7dafe871221e801051776164230428ddeb0c03e2886f5a942663dbdfa79123cf925f837ac2188693a94277644df55e09e8ba6860694a6e5355ab2920f5f4db182cceaaaa132e67cebd1b4cdb8b3c5c6d80ab906f260a660fb03cc08ff7f6d4ce70d235c6b8f81b359e5ff2a73421465016894df5ea59a22e6004b2099f4881ec1ea5c9e7b1116b4510fba159de411c87b381b785cd3035518ea8c0e1072ace1f494b594805bd72907e9655aaa93cf4092930bc48cc1a524d981706693828b0c6780222cf26b5f6d46305f9ec9a9dd0a67e39a08f7053d580006f283b6e2544dd4e43795a1a6a170f2f5d7320132489bf832465cdee2e4ee8f4fba21e32ca2f2e302d73d08896bffa2e520efedff3cf274f1824448ef0df2c28bc9c8772d8ca817269b6f93ab1eb57d200c1e592e97d6f5f52d9d49a368845f874b5ab08733812f8b509e23b03d377748e222cb13afd598819dfb5baf23be68ccf1000430208087621ec33c0016d5a02a010cf41290597e02135425722b8f33a7affdf6f85c431d1ccecbff3eec5d7328debca3da15d381080ba1e3448cee69b4f094f77589b7eb55141701a6b7461da5ccfab755604382465baa67ee45306b11e938a702263b6d6e57f1063c91e3c058983c140c922658e9bc30c9dd11e545f39a1ca2a8daab0a34122dc47f830bb7e9c5b37618989545f83d19952392cc64bbfe3c8f4425bf824727ae8fba2b273dd902fc28fc8b13e6b7b398207d8e9db81a2dfafdef47dcd0a5eca42045a5d98e035637e77ad42dcc60663211f186e162ebd85f2dc7f75c1e8fdabf7edd122ee3f429e3688212e048cbc1c17ca0e08ca6bb9d563eb92127a84d2b7631296ac6ba8639ccd654d4385fa5d566118bca81682f90b2a0c6528f72c688e177cfffa057c109036827a5639155c02b1f826adec0e196a74ed270904b73ff0ed2fe725be6f8b508e369686e403cf3a80ef2a74ab294c7d9e7a460a9f056366f4c87b3297740e6771f744901bd700b60c28a48875da3db1602d5caa1363e1351276e29d0db9ff83b3e2b20d0a83777b861c740500a64b8fb986876f36326302e0a0a55b54267ae34175c73de36dd5eb75c0945210c43b7261f75b270ee4aaf936caf84a9402469e125ab665ffbff383e60055214700131d0df2800461aa296316639b8f3a0c71ad02a907b15849ce09c01bdbe933ceda8a6d07f6fb857fc67afaa77d360cab2cfdf3bd1ecf56c6a2e6d6af8aa08d2fbd481e3d8c507fcab7d0f7db46749f70fdad983b5590b2c2b010d44203bac542925b2010c2da1cbacae095c85950a4357bd77767abdc46fc81d6b60a33269460bfee52a7ca7c227cfd23e62fab42558692e340785ce79211e67fc1f5918d7ef45cd37442734371e9b931e31006107b5bfa66d6c47677f7ca95bda59432d50814092709293153e4d8383de5790b581cd9ab5f994a460caf3ec295ad70bcfa1013ae6c3bccab1349790de7c0635e1d83d65e0c50c1e449293d4465d8698d02593e96370e2b4797514a293d46e9b132a80ad9819f1df8134701e01c9441553ed36d98fec4511a3e23e635caa02adee939a73f719483102c4196e9e58d6983be970106e960a9df06d90100a4d870f7de064e2925e69f49a3ac7700a1398b79f6243796bf8eab9509ba58ccb4341c3b4b0be5c6b27360896cf87d6178ad187a6a45cfc3ae182edde5f3c6f97da4f8759ee31cf67092d861a6b1bbb5ff48eda99fbd19a99104ed0c6bc115ce25bf8fec7141100441ed16b03a8c541cd93fad6240d7e0fd5c554710c749b2f4b13356971453242693381a26ba4c82c0f3c18a288241a3abb43f5a3bfaf85c168bafd2be9736c8d25e65ad599a920496f66594f643972843c61433ef95d6c5b084bd5c5e3fcc621e7de0ac3ccff33c6f3563c60c2b6f472934967c88f27594627a9895f7b83e80e0bdd2878d87390c3883e6ebd214266a683cac21f87ddfc669e2458a2239aa5c95e4a2515a3476ee950d0d0fb7689616e5c0868af5323d6c892b9cf2f319250f35449086f8f98043595ab4466973ca8a632d678d963663882646e9214bb429ed8b3533c61ff66d3c6c89a9d2b25075b2d38c965675b2e3246163634ad47b2919e5e7314a2b6406851c781c88df9429605e5353da87bdccf187fd9aed36a30f1a1bf4e58c3fecd37858c14f87a406aa4ef619349d095fb924090bdb0a655fb168aeca4286d4c41045987f0e8b01bbb9a1216a2f8411ee99bd1cb2acffba6fc39565454515497af8c31a4f8bbac33d40a83657caedbb522448331ea939427a787335cfdd117acaf3852408865f189a46ee99bd2cc7524553b5606da840f9fad5652b26b569cf3ce6b31b39f29271bb91c41147a5daa736079c4320d8dd01257bdeaa86f6824cdb7a5015b1e5abd6077a5f455b6545434e94c2f255d92a839e38ba32851c6599160c55a48a243f518ff59edf58efe923faf77ddfe861e839183a587eee89368f61aef8e18f14bf51a4f95c3142d192e0f8e3ab92f4ddf8991c5cd9e30fcd85aa8ef3c620af0749edba82a3023ef02b41ef03596507e8aaace88963d957a5e9a77f6359ff5b420aa225a4f08076d1eba74620af108be04a0c4bfb7ddf575333a3144118d83ee5f165d80f396eec44b9c1445413090b887242d3c4501143a5891d929ad82188232cd2488a5f25e51fd4338f9eb8653bf7cc57bbb5b7034b527862aaf1b09452e3a90e541903ea998530208ad5a19e96e8fec01f8e257e9ad123491204c70e6b526b10f4eda0a7bdd0434cc381a06b10fc4813f4bdf7f8f9e8dee863d4fafbf43792df57d6ff3408826008d6949668c6147be43ad548aaf40e73f63ea8b22075e7ca42b8677621f8c67d588663e9b9558d240e2950651da8e7952db929841d6079f625ac96578e5e4720f8694c5bab3a636987b618a229f16bd28354996d5243b8324b1b1a2a69dc36a96188d473a8c422f9a5b2f84ae32931134db1ad87acb11c374dde824314a6e23db745e38ffb9ed3b048558a64d19024a95291244923869a0cb9178752abc3675f89241996dca7c8d438a6ea9579dce3d153722469c4f188a64f2d0af605001530686a2a8b28e2e68a4111351c2cd0b2881e8a50a0288aa2288219638c31f630aee0e823144131e87b0111b7259bed531e5bd4fbca72de73bd3d30d262285ecedcb2afa72d945322a28631c618e32e77389c6c71cb02f5695da2b5c5d699a356448bd3b72d484720296184aae22508170c59c75eadd6f63aa00041b605542f833c36c57b8a1788f69d030df19c23e9f19d037d1d7d749c1be039e76aadf55e8b67f88cbf3e830747fe75249bfceb244ead3d9d7767fe96291316fed26ec5ce61ae48f52006f8eb48aacd007fdd00f5cca7175fcbd58eac55c7bb0296bde3f4277257669b483506717070403bfed8ef63a15edba6d75687fd42d1d3317764c7a5c410745c7e0e961c3872ae4b1e5fc72018088fd7a60f8fd71e6e0b5ecc9119b8af24bff66c06c93408efedd3d4dbdab9b86fceb5e62edfdb259105091ec2cf473b908a243be7dc0d177c47ec5f89bfd273bcc7f0be10f555f41eb76a1cbb28d85cbe185ff07e453618e0cc00c9c7aa735dac3ad77f34d9ae7bb66a99f37c8910cb9862e3af3722a8cf8e7d68042284e84b3d2b67b93bfa1073239ac163dbe1effbbe2e93e9cf67eec7fd9c330dd96141c214fe1290fdc3f60c107be63f9b6dea835c53a79e337d526f1fc8b336886cd3417a2aa5c181e869cdb2f2b416516140e3698da2e5690d53a7b0f1d4b250c353dbc47aa0c653ab030d4f6d09ac941e4748576c36223826a4879a8a9ea068656896d6c4d3e4b2351ccb361b36f6de7bbb6c6c2122b8a9a94967b7b5271ccb9c108e657f7a7a12d2dd98bbaf0ef5ccb7766523ed88467baa3dd59e9ef08cc3dcd1f6ec9d109e75429c1056125212aaa16196b5ea78aed2be5212bb46d95951cfecaf128bcf7e6942ae2719ec3bfad8bbe5da3649220d0d38dad837be6d80256eba67f6558999ee99bd55e21a2556ba67761a25364b25aeafe1af5289eb5b2b67954a5cfff2af54e27a162d3bce5265353c3bb6d51e1b9e9d089edd5aada98691a8b29667c74ab527c7b3e32d55f6f2ecf84b95ad3c5fdb6da2e1d93153ed71d96834d7de4db5cf8ea3a8329667b7363cc3348c9b6a8fe919d7702c3bcd46b3d59a30aed9265cf3dc46695f7b1dc31b27ec87e187574c912328260cc584a2987014137622ced3d3d3938cd23e77d412c3d18757de94f66f0dcfb8a76bc3334ea909cfb8a31acbfe5453b269bd8f3227849f3aa11acbeea2b9f6ae55a1ee06cf21c0418236e3f342460c0fe6a5fd1a1b353aa14e48c80535da3db411bdb2e5ba6593d3b2b101713c74cd28edd3d07829292929b9c4d1c7fe0c5ff94a74ad5e2f72f4b12fc3bb312b3146693f65b2ca6e8c109ed5ebba1c98d6f7e8633f86872b1156dac74f78d61db9f0d39367d6aa1343f4cad22b675cd93d3b7bb60225ca95a5d9cae7ecf9e866a3ecb996a1585957853db3e78e8ada595175b2976537c69ed9bba3edd9b5f70ecd1cc5d3eec98736b351ae65a3cf0e738d3ef6611e7a1d125527dfd086c60366c5b16da6fe91a013496d9a84e3f9340957e433d32495c8ad9eee74645430214068ddb971eeaf9e1ae1390105dbc669bce5777b3581fe639929d0b3bc5a33adbe726ba6d5536ec71fd555de03b3caed951b7da4542995afca9d7baaf6aef6695aa5e318698e66e89d8b4af2a73d2e0cbdc3cda3f2550823d39a4492230c3181080a468e2459f2736541240821b056290feb48ba2d536679c26dbb57ba978e639e6f0f8baef73c34c14fd70e8cd68e51207265d684c1481849b304d279708ca70ac121e8692d23866ea98c014511f425777683440b823284dd1619d5a21c21892168e4084649100461a0a71c081d4b186822118150bc878c4e9a3fa36985700c5bda1d00f68a2e3972cf303bc935a26369d77ba6e7737e79705a9954a85a1c6b5be662098aa64f3517a1c74b342893facee70fac0e969fc915a005d8cf1ba163778d1534b97ba2554666674fb93fe133eb09a109aba6903005bd753551d081c4aed54c897c769cee4fb50a3bb774cd417159420eac2997e358e8e48e9926c9abd07719fa55d56c6bce35062d5bafb592a3991e79d145b30c5d888fea3db0911d330455d8f9225dee38ee89d03a90f769effbbc4f7be5e8799e977a2d6141aa7618d8e3ca520e04673748341a8d05d7759f85beb3faeb3c3b40003f7db9d0bac72de279d95472bf48d9995c4794a46da97ba326d5a4ab83abe2f47c55d899e9ce77ad96b37c48cb599e9dc5f21af3c7c659fe5313aa4a587657a6a1f1ec34e64f95ec327f6c6aac38027679baff75be8de318e8ae92a6ac38360ac9dab1e740c1d6401c96dd6b4a5836910ca9711b47b2808a22f149f9022a4ae336e6cf4f3581d02378a6d38a5d9ebacb741b58ca5c40456dcc8ad19a1ab7688db983d2985dc515c752a6108cbb5bc7f957a69c6e95156595155d817065faede83dee1c5f29dbbce3f5c6f0e4c8c1c3d35d1b7523e73c6fdcc8d736853567adf776b9ba6e8a0d806d630dc2e5f20857e699a9911d73847b620721872dad49d69452c4f31052260a3786555e97183421b2b67a9c040dca632b9f9704fb12fcbaac446a84d96935f3831d842bebbcb3a6919d2034539a98f2563f578ea52b2cc1eba968adadd3e2ccc97157e134725a2d396eececa890c3480e1be559bd5d7eeeecd8b173ba6bc794e424d903eaee7561c77b1ce8a1a7adb733d2d31b6f73bce5b9f1d7473146ddb1834906caf70a8535e7ab5f334db3a942ce17a96e8de43c767dcf5b813a6b83083510d26b537b7dee063e24e11e7f6187c354aaf6a45224597b48721c6bcf388a62ed11c530ac3d615875b283b547f780e0f7d59eefab3a596bcfab3d9e577b744fce5d577bbaaef6e81e4e97b8f68c3da463edd871edc15507e3da73ab0ef6da931d2c6dd5c17ec71ff64c9a84fbc8cf7d38526b3305bdf322e0a73fd38773ec1a54817befbdf7de3f681b8bd893709f8b659124dc771e7ee991ffbeeffb54aa0f54a954aa0ffcb09926e1542a956aefbdf7de7bab542a954aa5523913d5de7befbdf70fdace5eefe98489ce1035e881082cb6ecc0846e0f021242552a95aabba2ea82683454e535d05095c904488a132ddcc087114c6181093448177114461474efed4f78d06d3aa9924d7d4f0cfae8479270df8d412a3653b7c606e1121a8dc6c2db22523a17afacc81d47c71d5e85a1c69ff1bda08be2e7593be9189ba9f631350284f41808e9ebf8c39e79fd85eec3994a5eff79f6ecc379068a68efbc88761c72a176eda1367d3ed5aa54959d572096f6b5ea6c33ed4cece1980221e91108d094dd7927827e5c71503d3304145878f10518619c4159dec4a2421eea0408659915c7b087ee83cf9c3913c6e714487d1fef3bf7c17da30f5cfe103300f4d8f587494fb16b0fb1c6a6cfe76966b9fe3cbb765ca61ab3b2e9439a525c60b913264e80d0168bc562b1582c7fc283b29c09cbdc38663d28284888076db9d089b63c48c885b65c48a32d0f0a7aa2d126a932349a0b6de299097a72a24d701834b4e54f78d0960964695b4f8dd4db1701bdfee81bcf727278628b5015283270415950a430a2690459c424a14051829408da418b9930376d83105c3e20450bbeb8805aaf6308f56bbd91822ea640482f3a37fe007acec522d761227c8ff1095af6e7f6cca7dac1ac00efcc99333610e1334d292cbfa3149808cf7d161882debaaebd50f4d639251748815e05efb303fd1d45203f9b58015704fdd9cc095062df336122e8e7dc88f7d95482bf33536ba6769582507be991d76691245c11cfb3fb749e2ef96c2a797d0e75f97ddff77da64fbe99f1c5aed5c7be6772cedd48b5e9d379eab912fc5238603b2f53adbf9a4d8068b6da9050500b2cd050d3279b52ac7726c7991503519708011725abc30bae6cf102044ae82d615ed010b700062325eb440b2ef082438e28c0c878a83d59222396b8a0b7cc51046a6fb88285857ac301cb086c51540866e000c98c992f22172d98904624aaa0010d492782b6a0614ac465b571c9f2041aee246a4accf045871a6e60c38a2baaa882c5010c2f94f9026552001a6280c5fad005caa485038acd7a07908a8fcbaa4588185e406f599bf8020d695a3435448041460af4962d2270131f681123848656bc65b805c525367f0cb083172294c90e098c208362bfe64f9d220c223228931c39404105c5661598bd1f789101c93609752ca9c0868636053bc4007dd2e5043ed870173530b42720a4dcd05bc296d0b0f312e603652a1322904208bd650c17d0d01371f9738108820430a04c442094c2ec584199b098707985681204137acb008c416dad8726aea0b7cc41020d41a8298a422e94985012834ec084de124603341c455cde1e5440a508bd65ce13a83d6ac28484de723b41c39478cb4ac40f282e7f3214482831a14c307aed07d6c34d840e2da0a1b70cbb4043951149596e2b1197f58819a0a0d05bf628a1214b0025588286deb2a24caec5951ceb8eff3401ea9941100441261b62fbbac49ed522a73b4e6bf003ddd3a0a7b50a2c612af307084bc148edb0518320e88ddfe7a3fd5c875f8f2778b86172043decc43c82ee95a07f25885f952247cc71a31663897449ba17a6c2d41108fe54fe1e5527fb0f16ec550838969d550ae9f104c9030daf4bfce309b73d7e6d424b0ddef31f35ccab74a8c73bda914c813e847bf60021e535e079e314c7f1157a8e87371affaaac688af3c6117b9ee79163188e1b3f264723a03ead5034954e29711c53293115dfed9e56eca8cf088bed995fcdfc8cb868f2f8eb1217b437d2ff1ddd533b8f2df667f432ebda3f266e0cc2d168b60b26de96351e278afdd5ae2cdb31011c8df69edff1bb955f17ed384d5bd37292bd98ebb2a73f30fc21ea171535686d279a740c9711af187839befae1c606edf9c6f9128117ed5d8e9d2d9ebc94b4733b78b4b879413b06a1478b065f460861a5e50ba521f7d42e440b17d8ea0d0226ac7aa00193bd98ebf20f14eea99d88163538bdc4d42623294435d18e931cb139e354d37e7feea97d490a2a6a4807d1525033a04111aa79c20ba18b3db796c80e6571c42b8b1d322ad24238bdaa28b2f747945a94086c8dca51f8c34b89a38bb92e7bfa03437124535bb562b5686a6c5caf1b580c193370bc3469e4d4b0c1c1190340071d8800183d8f5941aaf9ba94050e42da4f2c57b2906109ed1c246511f41a637bed36b428695164955e7b0ddbc5dea0c438bdccd81c6ba1b6dcc0a09d8675b24d504338dd98c0b463ec13540a40a0bdb451160a4a0728dc9ab165a06a70b281769c1b746950505e49da67401122c3d842bb0ca221328c1b12688f6154b4c944bdc2688745a96d324e4568bfa172b402c3c2d16b7f5941fab844bda8407aed2e2c573e2e3268b749b28d4738eda0bd468b926a053128bd769a2e37176eafbd058689a63603d36b6739358de08eb94f580c3939797aedaa28a8a81b1db4ef6be6965985e1d4c42df3da5341341b80d14e42118a7a6121f4da47a2a14da686a1d72e1a15b1647013a43d8c526bc1600aed2095a32088387aed9f152432556e88905ebbc672858c0e3746575ebb976423432485edb5672d4af7d464684f945e7bd7e596c50d0db7d7ce8161920209a6d78e9d9a525c92d07ec73c8d47bcc088821283b8f100143683cb8c559c9870197b31d7654f7f60288e646aab56ac164d8d8deb75038b2163068e97353ccfd1c739faa8e6beb330cca95163fc1144237370ba82a341118a7addb4d3201a5ac5e074938376d3a828eaa545d16b2fa3d4c0af4b5734b9b941bb5339526961c4910d0ececfa8f6d8af4b943bfb986e0c87aae3db527168d7fee5a05def9ca7bbcbf519bdf6302672a3e7d80a522a8c1394762c577093531757926cf989a81b68b75a94f213af32dabbdc5448dc84e0f6da678061f288e082e9b5cb706ad241bcb834bdf618639ec62a373c68874541793cbcc840bdf61bce0c5766d7701345fb2b8836bab0447bed2e284263686108bd761ba2a1908b1713da6b8c8a3216373814bd769a28b5d0e9e584f61695a30e0aa71b28da595690a29cb4afb05cf9bc386db9f2da5549b6a8276caf7d6b510a939081d26b4f75b98d423845717bed2418a6a82c985efbe8d4c405f1d4f4dac5314f5a053088821279707a69817aed6067a62b1375f381aecc6bff8268bb06a72368af5d43118a7a9d117aed1e0f2d76261afaba64050c7f5302ed790c23aa284a7b3786e154eb527bed9c0d8e5e561cbd76acf4da3f1bf518a985adadf9dd865e3b0fa81df5da77b4f65b96f042155494f042154e8fcd5497c957704cfb0d6da79eedca6bd75157865d73e8478bfa8a4c0f8b0dbb76cd7465f57a5837e119876a7f00104357f60f0062c883f2a23c3341505e131945a162e5b5c6a2935e6b79ad3dd54faf3bafe9b567d3c3724fed39292bdd59e85afc9ce425dd98cea667bba7762876e79eedb57f5db26bff6e57665fa7dfedb5d71c6d16016fd6cb93b0e6a42ca4ef3cb438463b0da142a8da437ee76998c5172fa056355069e5b47aba322dc395d52f5e04755a869593d14e2dd2237d0885672ba71beb7c4c5886b632231434f41d0b4ad1772ca2ef3c156b0f04aaf6a4be034ac3a8efa06acffece439c11ec9445e53b20f33504abf62c2af7b372cfcef108a47bf325c4aeac1a2bca95e97be69c7144b0d3efc6d55f397db7aa81fdca25ea717c5d6282e9415beda90f72fe61f9ae9adf957b766ee53b53237d49fa865dffb3ddb3fb94be68730eda3268bb330fa040a52e601338e6caea521347a016900974029f40a8efbca660d4776099ef3ce31bdab01bb1c961b382f9d48808260d0963c3aee7e71e76bd7ad942fbea65cb93aff7cc5e471f6603a2d829abe83b1babe8ce564f37d601d93f001c76aa6b215e39559dce7544b1411bd67aefaa6d78f6a35ddbb056c23370c8e7a059b1d277ceaae19936695538d7fe59f98e33574cf7ec9cc7ca86659c4d18c68e35957b76ae6b51ee4c7b1796f9100ac73a1f1e49f748ba6fd59e185f6b77a673eb5c1f5d59b562bb32ee3bd75aa87c77eb729bba1cf1a9a6f21d97a25fea62e5539df49d92be7da799be737cb9ef7665e9cae9ebc2ad9cee0c4cbab1ce3bd076cfce6dd8b873aef69d67f73aff6e776659a0a19d7f4c57a669b5ea68242cbaa6a95cd9f5545ff9ce79aceccebd9248c962c910d69c1002e1ec9b81f0c10b367e241fbc607fefb52777b587bb9e6b9d1f578f40d5c19575a6635b00bacebcd21e551decb87a05aaccf6504f7c6fd00ddb0ae91862a7d5d603bb420773d9a3ea60b7e390cf43f332b9405c817e6695ce5cc2591d2b541cd8ffcce3c7b33fbfb8b66cfd5375b0dba3156c4b25ca3db1a7f5cc4e2d4d6ba41a5e3636af95adc657ce62b15c2e97cb81dec6a655d6d4b8cba6a6a459790d8d8985b03856de2ad3cbf42bee9eaf9dd6ed9cf470e331c69dd6ffb4d33ae6e7ca3a23e66f5779e726e0d98d774ec4c895a97ce59d27e97c97396e4ac7b1d408cf3d5b5e4705e87bb6bc8685893e4d72dfe52ca72953a0a7f13bfaa07999b010eabf1c48fd9703fdaa4cfd57becb94c86faf2953ee6bdc55a6f65dfe5af9e7e1155da5cdaa64b9ab04fa5d26e9dec6c433581c2caf29d3dbf42cee9e2b6f95dbacf75c99f59e3dee4d59d1eda9ede4f671bbe8f5ceb81bdbfbc66f33559265ba3ff40fcd9403d31bdf79a6d899452cada3125aed05c90e1381f3cf3f33d5ce05c95f087e61f885e0c7e9cfbfef4bc57b06f1b47b1ce630c658748c31c61873185b5b16d1ee99556720d869e7c68df3dcd9e9ae6d8ae1522186911848a9759ceefbb5074682ca493f617bcaab5b956aab368c0496935e028da74a18d0e37134613012564efa901a4ff9ca497752e329077a18092b6779092b1336b24c9858428d091bcd956f5f81e52a2f617b8dd7982bac7cc344134682ca5b3e44e52df3a78ae83f2c57b9680ed9def296f9b3327faa0c61f9ca7faaa45256be808aaec0c4a4ad4c262b6c6f39cbacf50ec07396affcfa094bb0cc74ab02a109b5c7bead59bcad54bc75409d69b3569c56259799da29feba2dad09352d2a30b6bd2955b195defaf5eff682e2af094af80505be8950756a8d028a279808c1da32d68c8dba674f987d6a9dda7b3b1d6c1518028060229849ec5f07faeafa9631ee693918c7cd584d164aedad256adad2e4c5a7b54cd3954f6d90c517175dd99559eb9cd195c1b4888dae4cdbf0d6ea1aac1f594224855b53520a138529891f6028814b044b5f66a064c536e596b13e82b5a18ffe035674ccf81bc56bbdcfafd70fdb74878b5c8fcb94c3a1da661e7e30c3c64555c73a12ee8540fabaf481a04fb921de7a00be2ebd20ca67112c2b1a9615bdb163471f97090c76c24ff80a8e59074bdb5befa0aa8e751c2076ca19bd75ce88c3a1ce70116782b75c95b7dc0a48e0a1e8ad755c846b6ff1d15b8c7465aab75bb0c028862eb2106b8f0cab88a42000a29dbae7681adefa0e8c31c6256831830b8c08a205657240afbbeacc03295258d9c209180fdcd0ebb5ea7a65b09d2ae2c812eb4452e06cdfdd60c25d77ad5ebf6601c349ac59c1504b4f9020bc2d3581e494fa81062b4331dc8a9656e053022c5dbc688921286a288b0dbf6601e3cbea8691a62c7d3162e90bd19770094c1319294f5851c55196313b34155561e5054ad820081e5a00a19045f05c6c7b1041eea1966f524e6b8bd5b5c3766d9ff2a0f0c51643421eb805a1838f5b0b4c604308b8689104fa52f020f40214dc70c51068bac3e4819bf4972986e731854b105a387142054edc7c5d72e20a279ea28a50328108b470c28bed89176c28934b04062d0ac57e4f29be218250c286455c863e0cd1020dbd65fdb2031a721d8885952468e82d05c0f44358f1ece776d1451726f4e787f3ce7f7e98784d330842396792f3a403da3913d186273fa0f9a736c500fd61c2b202fdc96615eb3ee00974a172541a25510953409c16a5a32841b4263058ae14114541ddb45039120a726ab261312a2a13d5e5b67363cc3d6b47f4b6deb45039e284b820a7261b166c848bca4475b92151b9509e9c926cb6668dcc94c199b2cd9daa5371a6ec6ade135f33c73d6bec71c2ec94fbca913011b29932f9d40d383d8c507fdde8b9b746449f6a0d0627ddf0aca6d896621bb65d9c74cfcb99d895d8a975c236309f6a6d92d9fa7497754e5bd4da3cc6b8c6703df1ce5bcbfdf0e7ec5847a86c04a6eef270cc4b391d29581cd66b0fce94bdcd108bce7988d3c3f63ccff37e7a5c4f091dbafcc63704ab23c7e2b0d77c2a53aead0e102c0eeba9cba64c2355a73cad83f0f968a62eadfd9aa9fe92eee31cedeb15349158eb5ee762090bb2bff3fd5db5db66222ad46de11c9a6de3afe3a81dd4f3837a621d7f7b0050756c0a46ac898267ddcb393b5b7c1bca5c87b5dfe88163d7776e581d3b64366de37c47d803cf92dcd8755c829042087787d5f1b533ef3d40d5b9dc9da500c23def0d6ff5b167708faa731d2787adfdeb2c051cbb0e85c496fae5af7ba029855ba4ceb81ab32e6e51eb177fedcd79eba9852167fb43375ce1599be2c7beefac5e5bb1e7186324f6d356ba3f3ff73e4c80ecefccd68d5de74166a755e9b47ee39ef547fe7a4f1372d8d6afe3eb8517a3eba92e7be21c16c7f53a33c7e5aa0b3e89f5de9a15851bbbd84f3cd3336df2e4b03a5c168701b4d6ae1cd7791c50715c2fe392c175bba38aadddc5c313726ffd66132af6046053ca0a9f6b13b4ff5419f29929bc75edd688ebef69b1ae4284e00db3668f7bde7b6dd8fb9e4384a4315a9c5f8ee3729eabf7bce1c23884e0e7803a134d1e1bbb1eda3e504965561b63eae02f8dbf305714336c9a4f2b18eb45e2956d8d2cd13d791e02593b8f2d53226f93746feeb03a94681e3c5607e7d70f5067ae1e25aed79e1ae0afeba83dda79aeeb6b8fd3541d9c69892c0eaf94407d403dafbbf08c02d5048ba342d5b0e27b4ea83ad7af50d5b9cead9a6cced471c4d69ef2882e3c132d11e7b7c6df8b6b20b3735c8ee8ddfc05f6b0d6eee8e8ca388f82af3532828235ea3aed85b6a7dc719cf6646975d2449fdaa0faa3899d5aa4181ee3ff981cc7b073497a28d51b9e5554a93259a4253a48b0a5c086c084882e05362475e6cc993368e8f5393355843e718c03810bbd2c0d1fc1339b822c8f1d89c78eb145b2edd41a3de61c8770cf1d162967a43bfb9a6ad2edcab8aac40d581e5728311669ac2d7909e353abb4e4e5f6a9ed52f3a9656aca1d77e4a425c121f854fcee854f6d50eaed731cc7e5e0b9336bc36eab8e047889a1e2a809f00282aa539fabb3ebdc73a93fc3af14b2e867e5c75eb903c0fe7991fd992b804e02683ae18182beef00b0874e80d0cf7f9eacb081cf79a040e8e73d7068c71f5236f0b914d0ecc00ad799a07514f2993f16bda92cd6a684dd22e14b53c510d69cb4f658e7a0fcf520dde34bb3a5f5a1ea5cc71fdc6cd20dcc13d40e58c4a4168b982e9fdaa6bf517fbdb3d687b742e364f077064be5ab353fd5a9fe0a7eaaed0cb4b1eb818d5d9ff1a907333c7079e0410e3b83c03563dcb43cb022f8c35a1f6a4fce6f697866c28d5dbff77a0edbd23c1ac23015a6ec1d81e0b0daee92b7756b2a7ee56cbd640af45cd5a93851ec5aebbdb6d6aec3d7765da7bf0d3cd65036ec46fd3eb9eb7287c1ec9f6bf1865d3f9b5fb9d4c5cccbf8bad405cc879f088e3eb4698b6c8883c3be5eabce9d853b2a8e75a5cd666772d5628c393c8a70df9aadda9373c98d3ec02a8ad87bdc71fcf1bdad3a9d87177317933011eea748809a043999a1c8882b51c40075f241b105182cd83003299850ab12ef99b355a9d77b2d67c71fa9e7bce3c0f7f8b3996e20c687a058d1fbfb39b3569d6b8b380edbce1ebdf56f1de1d90aa1dd3939fd74de4e10cd15c29c35944883b09adc3d6dced7da247ead3d58d83c6e60ddda1b15d7421e61ec1c3c67f5ea64a7fa2b90b6d686097d8a789f7241b0735c55f92cf914e8ad09846d06c2106704bbeb92dcb38ee938cf1eb6f69ab62bb3e3d287c9771d54750834894e030838ddeb5d676d27e49e9549098561f3ecd8d9ad1b396ed4aec35dd7a1f05d0adf714cd2f3399fd3faf0ac26c110e71f982beb5e835c34dd8cf8bac4850b5aefed72b99fa75117b4af4b5c4085f17529aa85ff6e78f619ddb0d1edd6aaaaf7ac2698d78e3593d7e5b57bb726a71b9af4d33d758773a685b5b7a5078f83c34ebf2eafa5e811b4af97b9a719746863efe1c2ceb59a3aea9eda7adc2cf46aa61f98a4af1e965f971bd3019bcfa8d44b180a8320758a6844800000c315002020100a860322a1482008c44c1e7e1400128294386e4e9b4883519085308631830801c4000000000200644646662732d159d907344a74d5da5660f6168a4a422a76dea6ec08e286c895d2d9c8c446b5cd5edcdfba7ec260b1af71d92d1578f6c8f4ec56a21d8862ce38f3d61835054aeb00c35426d5a9e88b3c858ad025a306199d16074ebe5afa3136eb761b77998e0e37459f8f6c2eae4f5bdab245b36c03444d208b15f2d4619888e4255a6e9f76385950237bb5673d714a6e6e1f83920cc121600cb712fa221f51e9500beff54de9766a1f93ec95e2426af1814eb02a56212233ddfe95e8f39b74bbd076a37ed3c7b6400507a9577c81859392919db93b7d1e4043fce0d597ffda14d8a71c23ab80b2c7238cbcd4b83aea6607ddf30c484e6f996828d9cf7c40ed376672918550a27309f95a92c63ba360e0eed402ca1a4ddd855052e8f5ced4c7d56f61f2aaf7006060f3c351fe3e6fdd8b6f8a1931d3b885daeb934cfa047354aee4e087a25eed2bb5dd25ed047befd0ee5ece83e2ee9829780a02dcbe33fdd28ea2c165a772d5d34c36803ab07cb4c1823831850356fd73f9167d9d3334e780a3686e24ac966e914f16b50ab5dbb39743dcf2ca1d11c3f9a67375ead527d879a6a26df4a288c436647d92c6b62c0db3d9ef74a1cc6db53f52a2afc2290d7a2e266ad4357e99e3d63807c2317641ca2fddc807a1143f5d4564fdf8342369e15c7a6c31c9a850ef584e5f232f2991c34928b3da43ba03762810d52d599891a8dd269a17abc6982a4b1f1c9737fb8d1aad4a4a0923d6af820dca11db8fb1f7f9e5620a7c656a0b1803bb19db76c115bbd59ca3fd533c41ab07d1844d01543dc8b51b65785ba62fb86a42fd221e22465e01bca2662537d4eecf974c9c96f71b1fb2e76b46be10d57302e5dfccd8da0c0020350364ab5c80388f290c3b20a3acf7232905fe003ec53fec0aea6175a305d82e062d2148066ca035f564b7e2be204074f9ab07bf6f3c1447a28cc6c11b854e0cbb61d742f966ab8072bf2699dbcd6c52f82ea56d03d67de2e8532987f4d29c40359a4df4dc2fc106f7260e904281edba31c2f6076c5780abe094851e2b699a26077afa55bade923e39948a90846092d3b0e21da861a961b688c93644969aa248c7eb73a80d0b079c270af53e920f300e15bf960b3e24dd2b31b8ac5ef0ae40e9e42bc94d1c4d3e22b8a614da58329b7dcfe25cf39d925c5335dd16bd0b917fbb5ca43893af15575fecfe1950a39368a2928f7d8d8886848935c93941c42069138704b2eb16b4fe33a31f3b6278ceb259930d7d000cbdf1b3c3eb0983356d259603b49a5524a6f51d231886d2955f236269da38eab6a8e441696d44447918a692e7770591571c9704250d447f7c042f93c7964e2aa401bf28e25454e10d290c5bd4ea38df4ee6ee169edc8898acf50aa0337c6859a71f29c006b0b5c0bdc832273d148cbc8e3e9b2ec91ab1878240057f0c0d37c50a00fc8745618df925e232f9eaa2b0c1f8a4870ee90e47a597addc3f94d94d10bbe199dee8c42522d512948ee6f4fae5ba5d8af34076743a3d682d2dbed6fb8d4cbeaefd25197cd7f5bb4cf9a8f36b99f95eef3719f954f7b7b2f8a6f6b765f3d91bc4b959eae07fe065265b2d959b37552a543bd18098d949209bfa13d4c4019d0a982046263efebee45856be6af88def7b8e65e3abe6af64e513dffcadff82deb2f95eef377c2739223bf36b3fbb67c6a0b0e3a962b6473a78776a2780e9775f9dc1542780d4ca93d9b01aa0789d8a142c729f6dcc020173eb98af3920fa9b98d62da6c802a3aa296b87d92766e125b2daeb0e6d76ced01fbe4876eb376753e9d8dd80b0d87c4892499d9b70854b0219917d5a1d1cc33c7fa53e0e2530c87e70fa800cc2cd70a490039df8e307b16fe1b4e2417cb26b8de847e10d2cd220af3d8b29d7050c86e441a23b90b778318452d3f9215a4ada8024415656d6309886894c49ada823a8f6d4584186fc24a0d73b1e02c5b1a7878e7996dde9bae7e876f0ea98e7c4a1ea248cc46b5bf806b89174e62cbca4f611078a5a67257be2d0e93f4aa994ae3424896fbb51a159971ead44cad9f216b34d631a3f51b9dc4290f5ef5cafde4c9146b2ef4468c046d070c77630db7f527c4e0e7dda69dfe878059dbf8981df3cdddb84604f86bd63b772069af67cc1c28e0cb99aed67731c024ce810c6d61460299f59f62a889842e47ce675380f0f5a74db4be87f99180c071cffbd2df34a61b7ec284aaf736b3b027c8b3281c2dbb724400c1c5773fb6aefb5c07f9a33da25f9323e60ac7c22c932b0e6daa5e1d380550098004ed20e722540632886a24fb91165afcdb2a4852de96064df9e1cf93dcb45cdf9bf34408e9d18f4c39ea3d4253620b8312694453668ef5888a93981ad2507e83e191097fa98b88c927c1f5549517a0618c0bc5509f6c43eafbac18fc6a7a9da63f940a82a9b5621a66ad16fd7bf1f2030f41c12ca616e0d9fb8e58e62c83a6db1cb5c18f7be251b2597c770cb53545e46b3b968d1bbcdf8b1e17ab8bfc57b30de20bc8e256a06257de50ddb222dac85990854d0d534bb04a21e76f2d060cf467a744c6f987b6fb38e05c8fe261ca2b680d435485bc819a95411ab38453219b12695fb346b6a4471414c827137fcf9b42596b4df8117a78fbaa5a09359e1cbf2f8be47ea03260488ae8ce4e42f1b008b426e468a6dae233a9202c6910c8ef8289c935f579c163b2135d63297bc57f482b5101f588640d78f97db70520b51a1a3006351ce0c8b4d890a713d0845dd23c19bd5ee45df9220f4f164dfabc13c19ea2540111dd0cc0d778d827e505a42b03301520a8fd0e4421c29a19da4c2cd5474768a83f7fe468a1fda936b73e502fb5c7d5ba8b643118e2704f762b7cbd2ba8c2efab698b04383e2969b333520a8011d43a0f07cdfb3dc59a3e45add630d6dea23074b9f201d693c7e136e8ba4138082d0d0647cfe14e43cd55e43b7df36359b256308b153750d4b94f116de2e3fd31423bf81794981307e12956ca54aeb5780feb124a6831311b4fa5952677027b89837640a875b60ac0a841681e47c13c53ee828627bc03e9b78177ac6839f1f58713b8364f700576176530b9911dbf326f63c943b4ce78a78453d4dff44415b83c5463a6b90fd40a253ecaaf4c92de66b46245384a17066c4360485b7bbdd88bf3391751ad121790090fc3a117cc1472e0a242f5723d959dd4f4c5ce170bbaafe5fc92c7dd3657b352b2c5ff34b66da2f9503d899b5fa8153de8d70258185aacec0994a760b674a0cab5c43b92e6f882db2eff8ed96cbb3731655050fd762d7c56fb903799b31f1255f5a8cb8f37f041cd5aa0546982c8798e80468c49d24ea51ec12e5993341e333b51fae8f0a3572c273837eb7f25d99e4e722e2f5b09dec04a10d80b58c0e13633c8e1f1d7175cdaab03bfbb1a402b6af60e97d630a4358003a4ac2a73935b04a6316b85c5c3adf4714344254a19a58493cb52e2f6f8541993f120934d705327f74d9d3859f20b5b2768ca355756d1428696fe7419f77661fcb2897a425f29ee0d4ee9939f96a97ebeb802fad0e1955cb89571786b8315d1295ef23d53ad088e10c3cbd8eb217404514de29bbb0722842612b07b890191f1122848c78219c381b79c118ff239cce125798189d031e8f5a2acb899a00b81ecda72a7e17781a0954ff453a75e12dfcfb39aabee18d6d2f4ec1991175e182a5d1288ee492e1feb93cb378e71ffcf87e19213062302cd914916cdd74a85b557e0d5491d2a899f63b97d09d92422cecab004d58576e318b48535494732785bdfbb555950cd604be00f4942d71f474139099797828c0239bf743ca108d30212f6386b82cee65883eb9df488404a0e594bc55756c4599be20854daa4d0ff7aeacb404525c904ea692a55277c87d0e81e1f2818169da80a076a1d3ac63140a5e01c79c2658069c698034d469e0c7564b67cc7fa2a0db651a0e61ebfe86e607991f51526307069cd0a3724ab762277829f980b3eb5273c8e73bc18782238640341b77c3241f41f45b90714563f0c0b63ccc00e064eed5b5cf8a225ddd08c2c09354b2432acbcc7469a8573abf6be628cb7e42aa59174a4a242f09d30c568b699443b24d623611a5a265bc155b94227fd69181f5df94fe003e77bc9e9c950f35bb1076c00e628e1fd0aede554e1d4a5e0a0c914d260a1250fc12374e696a635071430289a72b2259e4cf9b57e08c7e170c064a379881ac7903ac4a19da82678370b334210789a21215dad5bd1a7462d31a0d6e0767f9ef07915bfdd4c50d786e4d62c447cc153ccb42f831e5a8dc4c74a58564e6721dd9d0ac934e4abb96bc7c49c329b5710e259421901900d5b8931a73ff07e3864e0ae431fa5994251f9f25c111abb890c53834f2468b124ee4eaf5b6a4d0c6b8a5f43bccb54fb6d90e13afe8470558076a7c432b714c36319addcd7616b51c0d603f9919a01d9f24b81707246b41a5c3adc1ad325ac7962ba20c1d289f53d852c7992cb178d05658f715b01aedde63fb18b7f6f39a53588ffce1a2ac007fbdd195e7880dbbfe01ce1daebbfa6f2747bc4a6a5ceec5f168442a89406ded080dcd869884558116ed7913933097b17bcf126b1c5bed51fb8d414e508cfa73a46e174c0869385d6ce2d324d01b02b99464631d41ad5f161cdf806a2ca68d75c940232301c14a893002b503e344d6cb1cbd0d2440817df416b27ab56ec7221254c3a670cfb95bac23f0fa752830da7285e80716d1cf16f803e4bce58b19c9bae799d05e3c17fb38605569346cddb610c185dd9e0f9e16616490249460f1845a4187cf412d8f5883029d670ea288fba2d25a629b8230582d064d63766b29781a259c77cbb719f501a70e360e2fef1a43617886b47988bcf9616acd1100a67ae70af55ea036aca77005839cda5f43ee2a95de1c134c2f1cce7f94424c51bfdda165490a410ad80696b9a09e299de935b7118534b89660b59c18ce4a6b494eacd4d46e6c551e4f704d40e2700f1b086dce164cd368844bb425f5f2a0a72d5101d4984a6ba15092c9f4c6419b9b96e7d8c1ab504399cfb5ae2e1d4e1807f2fbb3a53726c804ef04b294f24b3d8a253c419ef442fc1e9b96cf12070dbe804c07ed42d6bfd4a05bfe18e1d40af0215406c00154ef24c225e9fbf02954e077309a999da6ada53b300029fd1d622d2ff6212ade7790586b1a48b37e011ae55e237f67b392c7f2593071bfdc9c2113c2b057b9149915625c50d6bada6402e4127b9026bb622351e170136ab1ff414e426c49e1ee1e60491c22791e75a129b9f8165238d63f64d35b5de6d07c156cd83eafcaf0459320f9b9fc9dc8c63cae45be3d902aaa4f244b299d8037950223e9efcfe5ee24d33e6b3b12b3c62b171b6db169128dff70c62257f67f566563540bf2b263e3aeb8aa3a709b37f192527319002a9792b2093b7dbd6af1b8444369e70370342f6a910ebf81fa91ca88c64fce8c886658d0076360a236ca224714b38d0e353a85111cc54236190e99d70f566cf2724632910bc87cd8845f0f1761518f3f830d44e8f998a22e12c8034e8f695cd2bf3c7a053a9c50b3103ad083c40e306f15e87d3c6a6e83c116689faf0dc65600794538f728d22f98e58bf08bfec4466816ccf1ecef91b0677dedd43cccb5b9930f16cc3e1d8c958184788aeadf6aba6610830df3976f8c6d7796e7927c133eb410196c259de7ac3f928e6d0d3e72fa6d15789919bb473d5cbe9ea20ad6c2df2ee19732f834e568e094e0e80f197fa695ca0d96de4b3ed1c5927dd1932aa7394fe7b9cb930a4bcab9cef64c4bfb9cfb02d97f327cd483cedc5cb888f443d61fbea0ccabb1659369724ee06936aa37b9fe425fae6a045be564e73eec44fdf5cff4f80879c84abfe5a632e3822d8bbd75d2b836b3ca98307e2b64ecbb0ce2fb12d89826d8c170b9bb9b395b707d93182d9ee54acc4a678ce7b4cf971f635de06ca52cce0b5b74d7890a63f0ff9bd09a892198423582195cc717f274c5838c348c8ec5b4c244445b29b0c1901f696ab6c2311dd520b43c7133ea6fbddf43720f3ab7a6f6a97f1723f5193d88b3d3db0caed748450e7a4a2413a88e7da7f3136a2a49230d20f78fd386ac46c70b3b48e114f4572bb8257235fad7701579aea0cb29a4638331659718a627242633ddeadd190580830edf89e2f21986e79c51c25a9a52d8491a8f12ca8bc865d153dddb41d23e6d0a097c5aace8ed0d9f7d35f92e76814d5ba62aba779d247530a39fe59e98b971d242f4dc6ef8a1791a2a25168545f0eca1579b7441e59158d430f8205992e22c6b3f439536e241a8e410d4b2233f2b15cf8e7c6d026711e162104a56be23400a92751a2b432f6e46b78ce871e9aea0b64e2714e8428bfae28d20057bf786c64600f342b1f775188a7f2fb29435bf9e5f16f0d34426c085f79d9962ae7e4751dfd1b260051235d7dbc29ffef1369253a7dd152c10135fb5c4883c46e4ced4d019ed36a9024401623ff93e2f0ad10d96ecd56c5b5f2503f2f9eeabc488f874a7fac3a687cf82b77f433b171dc7185d6d56baf1a1f6024da63ba80b1d455dc3d78e3a9a211bf62f63ee9c16493d69fbada959fac1c61688ff7d527401a10a1c32a111ea9e22448e62b57b6cd854342161aff8e02f6c9ea5892c7c44cef0f92aa82762b5b264348be99187da687a5730a4927260b4744680ce19178569bd8537e42b753d728b9f28b5755ab37051ded95ede654507cf6e530a74c2e60f23cc6d0bf393f56638427cbe91625c56e2e4439c22867dc40ab3c210a30fd757068cc18f173e591358a2791c7b33f108fc842d646e73eb6c74fa4c85943a3c5b27e0c8b46c0b0da378ad2b7abb11a1c657a38e103eb4e7870358c33be8a48da91688eb34a9a68772f64cd432bc3f92bc5690766c7dfa33ac841a44d8676773c3bf4b7183336cd0b153117731da53180ac53c149371de1b93d191ce20f65e45745d7e0c4c5dc70ecde50c2913ed6d55d32704ad9b174b240d080e2915e3d23748a8eb29e35b1f0ce206f051f827a0c11304429dde9980a7b6e814a275d12a8d8df35eb9f002f05cec78d94bd9ae1f284f235e7257fb6b3657b27877aa0002bee758377a120f180610344764cf52c9daa70e856f62047dad628e9dfc22964823f0bf0655fdc401ab956b7546ae10c0bca8a47417166e47ce46dcf43c814e5375189baa58178acde6510a5fc8139e06f3fea36abb357b5dc700e5a3ebd3a7a91f47a90037ac867aa646f9247072d7fab54d2a564ba6eed1a425c0d47068e4446c8d39b00fd582afc47c5c6da009ea72587c9f5ddbbe819fa6d35618f46d70cc51ebd51506a7fcb96a6cd166c8bb1940bd35f1539e207760538b6b3581424f48b744e22d3d7f6c747ad99bda717b38c05a936debcda13954b9cdf84b0a287c1ca1372be8574a2bdd56fed5d8aa5d39fdc2315a71adf85624e6f4da9a6904fa8e9c872310aa6270c40a1eaead1345f42fa19056096f624a078e475491c4d70ef98d540c088fb49d8410edad3903d1fc72203102e3154eb8eca24a4efb67a558a6aa70d3e9594f8a35a10ab006d3df687b3f179a85c196bbc026f00b4f7d68371cdf074e4630aaff577dab71ab737d0ac3325e09f72960befa35edeec4400af53bfa1e8ce893ad4a529f824bdcd632888e2a6414080924623286ae57942c5e2870cc4bc2e64938eb156710041854feaca43fa51f813bddeec47d0ca40ee716c540a066716d034ac952d7967c0698e9f5f60acb4e21d2549c39b0a2fdb94abb28d0ae3cb6c20c56d030ea95b5d5dc95d20a97d56f75ccea7a1567a564d5b5eab31a5f49ab93d6cc6658715df1afc456d7567056cb57ba57fe15f1abebd55cabe555ae95cf6a6cd5ca2a776569c565c5b71ab37abdca5955b2e25afdac5abcaeb0ddd56bcbb0a3b36d506c02131ad5d13381f4d5219ce26f215203ec48c3760681958f7deae92d87a22a9bc853e8e271b01ac0e04524e1706e13025bbc995e55bbb555962805c0db77312a2ea898ab7119ebf01676c9a9c7a83cd1f3e92ee287315d506c1a20cc9765a8d5bc589a5e1ab42791df5304901eb475f15b0290efa40b1ea77ac0daf80222442140807b3f1e608358006c635d4c0220a3d2f29220bc1d8b3e59ba8c006777944f45a1a5283c94290179e39e8427d06edf318982cbb64190f8a1b1b5bd827764b5cf15f6a421186fa8098372de131a55bf10b61ba87776daa4a442d020d80a1b6bc3d90541bea70e5711df8542a98c52e4c08e8a926e4f1ba0e1c00ee83ad277c3544d4daa6010397ac91c7008e94c539ebfddcc73d9aacd276f1e0b07f6f8721b64d06de476b2b97aae5f020084c5bb50de0256a1b00bf528fb4102692701fb9cf381fc061982082f1b883a3de16eba560038cef2de62c5ea0a776569c56df55b15bfba5ec95d295fe15efdad8eafae5671ac94565d56fdabb1952b2b9c1525abeed5df6accaad50ac7aa94576e73ade8e7a4fa806295be62a55be5471d399c7b06719073d1bfeb791254772774ac5ee9e49076e94bcaff91c74089e52c56e42e1b70a7630196b533da34f2e482e507f1fa709e1185bcfc389307891d9aa6ed1950df32ca08b8e6381fedb9d0c4b452b6e25dd292e1b7885b0b69a1adf4811e3b93bf497ede5f902567924dac3e51f0642eafb0bca622770fe8e7d8f9cfc5e24966d183a59570524883c5ea3b1d616f0ca64592fe060268039416fd2c921759dd87681288c27a19fd234ba7e7c9d173ff0a0030ced5d24520ac7aac4f8a775544ba0d8c23dac63458087a502229bb0b22bad07f5421a54168daed5075c2635a10649da12cbf0b188811af0dd694f08544d1a074de04717e3b7a08c6771951be92404ddda5d3b707204fd97b8e3efa134f6d0ef7a94be7ce0ac8f3a6cc6b7be9dd35a5f0dd0f4f37337730a0c1cd593cfc9597b62f9062f4aa97a58da7b245523b309bd34e5fc31671d7f599802811b4f2d04de831669b6020a0b94d6d88d612bf6ab05b8da2f5a930d16158beafd6345f0e948d02588af53024d3c08fa8a8edd0905636c8c2ebd0113c87031829482c2ee1497a35492b4fe8ea777fc4a32268f3b2a6cb9b9948c6750583e8369a0b8f4df6758238ffd5b8989f97026ee9f2c62d9c05112a46679962ab1cbb8e3297900ab24005360668b9586834fcd1d9679995aeeb542e5293ca4e6ec5854eabaa3e0841e5d06404a018365d6ce3a3c5783667e82726b1b9678c551c599deaac9a0c647ee34aef4477c1d2c339c09b8ba1bceb559dd548b0d01c47a26187496c0168416f5bd9e7e8760f267dd8a52d0c6ca8e4b414e8e4cfd47847f643f5dca86b68ebe8de0e88782ee01970df0141328c5e0b5f6a4b12db32f6b08db9b95f03cf6a79985c8f6103de040c39639358ca8c05f038b3032f149dea056e9946a7a6b4985411b451d0931d416e291c4a64145128567a0e420955fd4fcd3353a4e6084add8f4f77dd70844519d6ada55cd073034714040c9c8d0f9c81a26b01ece10c6411c825230d6528f0751e27567caf771ec87aca38628aa184bef316398a270e0a7073da30cad0fcc029f21e5c52cc5fc122fec72360cc008aec1c70829063f3f354298de4b2b12ee6b1073577ac830e1951e32760791bfa68038cec704882547da100d4e53ea294ecc24f7de06ba4aaaf7c36e62138a10e98d5793227980e2c2dd776f40e4e087d13bf230e872442e9622770cd32931132d140b61fe0a67e7f13964e4ecf14545580797ed520bd1a77b40fb4a95403c64c06457f19d48b5b26db66ceb39870293cd74339774e14c748dfa299990b98665c16648c893719af68bd3b5390a9a4f8a893ab75e14e1ee41b146481622006c49ced9991e453d71540d8d148eb4a7086f549f69caf29bff98783d880bc3a35600a6a75c6b71cdc9bbc283a40989892333c966ebb2f30007a88ebbc051486c59d70a3db674eba0949db116dfd506241e51da47668c581ea0b0d46f77e5ecb8ae00d4a095f807bd6a7f81281fbb86fc8ba7942722a29a9975693b93029921d11978ef79fa47c746c1a9944662758f35ca2a7e73c8f9a1b6f4b525d410be53d30279ea03c55d7d6ab1fa2427f816f1d0402405db2adaab72c08639f560ea498cc50ac0404b54b59991c33f7466ab3af7a0a933aa3d0825c08aa1455c652488c6e28e18c6c0712377840390b9cea3db61aa128a0a350a911522303c9c8d316bf846e781f329e4a335fd27d1b0acf4ce0dee67bfd968c2d2ea58bd9fb4bd94f782b7c843737f5c86fbc870e4ae3fac51674beabb46ba573a7df79557f32613d1ced5f10497f186ef73c186a9ec946164b4d32670e137bec71e0c2da712134b73ad263b3dd75da2844728e0b8984e7b977651fa0fbce69c69f560707aa78d2245e7824af9454d702f7dc23aa02294411094a264f2020c45a543d664d2324b20f47bee901f40df37a15caf550378e84ba55ac36dc5a08aae9d9ee2e7b37acbf1530a8e5800334de300fa6fe32a3104c025a912d4aa238c63963a64501aa04f0f63aab8c1a03308c598835393867742a2476da1c83b691625321eb53c898a35247be0e2f7a39ac8d37a49cc821cc818806af2f45b2437dda769a2211df207a820492520494da89b83522646f2594f05453a75858ae6c9ef0b226cc6fc7d494a77bab828e0875ca9fe04f54537d2f6f0c823064e04a5acfd4acb412f19594bbca7abf58cf7203f028a63ea10dd03ef7d9cb903d084af3b3ed607933a3652b0075b94959d9b661551c2db13dfa549189085ce0a3f1b3fbcb8bda2a1e969ce862784f1849266d97660e7707c17bb721b83640edbb3e57c6fa4638f4f3aaee0daa554c58c05af11df4975219d27d3c1fe1097e24954db355aa7b65be1c4c41525ebce8cd4f88d0f957f6e4ebab1e9425de262d121311205c5c5377b6ef4064aabf082b65658023dc5862fad603d24020d420a683e93b072b645deff4ebe3269d01b61cdcb8487b525d3c3df9407da7e587424c4d8472fc46f6450c4e72057c07e74f8803928e4010a0ae6afee492e81dbf334bccded96676e04447565648da53d8e4d869b964951401eceb125805e37ae15a8a2a02c7d4dcdce5df1a1bd3ded006a895cb8a54c2ef65b00368a949bd8335f440a162ef70d5cf7cd9b448f2c97e141e6e41a81775ebd12a2f191fe1370c0e0e7454fc4adc03616c206024d5da2562d5d12f2e52db81335b17b201e7fbeaf66b9a0de3c3e6fdce44e164fff3abb1b08d2e1644ae3f09dc89e434c1c86ac04252d5db82b760be3c96f4a666cfd8d63e03de627e881e4732cb5ccb214a1421781ca823f273829c40ec73accf6c5c7d4f5bd6848d20b3d46b0241c65e8f6c402c8871d9441915674919c7391522c20f8e5ff8d24b7a9e1e6cb608c387c1cd99f459c66630fe422b89de6359c678d98d985f77f954c1c8bf48885f283f6abbbb0b6010fbd44dcf80a236b9fc371d22d8731799297480a274841c514deade24b130086ac3b8c064cbdb983d46c529b2ec773e885d1914f72b02210ec0784b512480a374c4464fdda89ef15c8f532e3303d12d202699801a8ccce7271691a388178cc30a2f7aa7641ddc7c5964100daf1894cccf37839611e5647d70969787175f31bb4eec94882988c1a7eb4efb131ecdc486388359594b7fca447fb91496cb533a328fe1f83220486c5292d084e1ef092fc6890bd3746db6598b21deb47408b49ec2c5367886e6b824156b1e5795c363f827401d828aca2cb1017f9cf2274ef809e5afd712bd4f8c502b48a3a9c59462981a1c5c37ff080da0e59996396e3d72655d4cf9f14d8410de19ba18516576ef9d41ccc047cd171849fb8ac7183b51edcaca164be0c0e47776e8f3c5faeca47061b8bf0f9b044de6309a4482c936860523804074885c6355ae8e6d91d13046c82d0988003075567b81fdea19068a267c809a89c090ff41cf5eb9422c9a5ba209936b455eaea1114702e255203080f3186797f0769dea2f717409c8425c9659152845adce46c7f4f81492bde25a43611ed2d829deebeb6759a4e8e745ddac9cf0e0e552c9b33ac5262c816e81a4c5fc86efe9a331dcc9f1bfad087bea87daacd1fcdaca268332db2a6767562e1d6798634ff58e025a9f81a79c45ff188224f60491c4877eb55ead0bdf6d902b6b57a34407c5dc162fa3c359bb31a523a5750ef588926ba6e8338990abf7e81cc01f1d53820a885175727d4d58af0223b6251221b472a91249725554c17199bfb47f81edf7d82d4186618dec3143c86df13287d62e4fc114010007e48aa445f6647507cdb4ab0709592eef8174812de4889788cc3f6ae657a0a5958c1b218e9a0ef485bb5def2c791d5ef84d8a45e775b43ae8981012d7cc961300a6e15a174d4f48a302f50d5ea0d4cd94a04fe9026cf110d4fb1789504c43cb6994594ba992cb54dc4228ef5494543e03051e4e678249bf7e362b40e2509fae00bb5d4294bf107d67c9a193a38c139e8c18122616f30dd117c49038e106e5cfc9a272f2e28e5f50cf037d3c859b5c2e09425895038573228c5c8fb8200342023e640ad2a3a1a9e259d9870af4be4233cbfc8c0da4a80ed02f8802c5598b8d2e252c980895be3728fe89df584374714464deb48dd6c2d8f00dab2882f388a30dadf759275dbf749000da7df025f648ca1c24fc64b4c9fac654380c35855d9ae0f734c0fa02248ccba60a861c72003ee788994356e448967623bc6e3a35494abe3bf4dfbbca9e33d4523f540db3e9a8e4bd5fb8a150a98f47d6b68c467d6fb36d84722f248f7eb57f8c28d6922c14e1b173ee5700c088c2840537c2ae03c45833ba1935490472ee0bc3171747342889170e4567b136cab8fac16dbfd117f09b482394a7ebd02c34796203c6c107305b4843a9a0c013bbd25fd1cd581a951daea08a2e69478aacc65f6aeaa224130b4e881221510c2204a7a0b5679e64ee35e4f3d28c077f435660b567a6a7c10597f082e8d251a247d3b55e812f314f1de253c116ff247a085219ee54ec9110ba662f59372a31f886e343a68758db602c97f449885ed3aaf46aef101aed81e07fedb8168bb3b9e8acc6bd3c815e30d40ca3d085a720561e783ff84644df7ff57c5996d913c0264ead648f4b74db3d27c19f643264d691181e9d2c694192828e65c1540704ef96d897741cd135d60d224b2235d91779457bf924e8b721811c58e549e2583c4a3f4cc81d21f4803ced9c7e6007be748664fd200002056b9ecb989877d7704d138398b2370df066559f0d8a69dc6895d48ae39c520b3160f62129be51969f989ebe1112f15ffca07886834d96d3fb90239e8f2353d88d100202ac5620242f676ffa8a35dd83c36856c99a09c8c42102658ec547434e362df879c84bbf7e798b2d3f6f39ab317b11ff4418d764ca52a71d426de74c1c74106f91c106d0c76c703de463893d19f637b6a1e5dc2129f194fd576a2fc326b2b049f32df2e8c9ed2db06e33b0a4871f914b69e08c4e2dce3b2fd9f222c8eef7ac2265e6c1313a62ca15f198de431f7475d6159891329106e254a776383239d11819a2e90f8a9a20ae6f7fb17780c1f1d7fc02db604e61697a653a238a197f36ef04b5fcee535a2b4bb157f665cd3434bd9cb297a77dc4be9877c67b8e69bc5434c877dbbe49244877859fb156da5a6d5b77ca526b82f72409c4c983299a892702da58056af566abae0d77016d23dc13dc0464437e09e59bc59fc1ec89b7b5293841f6836eea24a6f82b7b10edf6dbb9cbc1d27b984faf4f1e24f9e85a7d4fa02b8c4fabd336329e8325b6a204b8c8aa5b18007643a3196d21b64f9706da1d367c56443cc68bee6413e38c85b717cc47354eb5aed51265a7f049d9951b97b3dcf7ec0a5371dce431fb0766e6dee7dcdcf7f7c163bc23bebbc273ccf84022ae238bf1701828dda75e3efc470e639657ec73de1fd8a0e7c70dfdbe3d346756ea9b839836056d781f8346051e152b745c450d7fcda3bc61c52bf005ca89327c66c70200fbbebf6d776144ed24d6315f246c0ca81be92e77520d2892afddfdc706d9903e4c26953407578df6fd442f5b3c3ce98f43e720769ddda08e00231c55c4ee66d8536f28507eaa402309fc0dbcb485ff16d1aba9a6a382d0d19a4f8287d5ee230f6d880a252d5ca30ad73e880d9d24e0dee070154a01bf217782feb04ef1046b5ff8f22f1c15f6f95d8fa94258b2f92596adf57408de9a0892496239cfe4a7429c8ab34ca490d3ef71d18761ab29855367688c1474cd3e905c2474ddb6a85e6c94c6cd1e6caa7052fca9c8c106b2135b777585c621eed3dd9b03a8d3e178ec57f98340a33f003e7b11cab763a531c830d094373ff3b19cc7aa2008c239d7cf1a275054323c4f0eb24961f84830dbc22cd01e74cd018a8b424e1b86fc212ea848cca0b94506025e80761528054f62b7a4680011814108d243499be7ecfbd5005da121b9a651d2dba82ab43b44fa19f004ac52a1461506a9465baf2721d887f50fd6b5418e61bbae229917538296d50db4366108ca834d69fb404e699f876a390574b4d3eda019910e2203146b5943d1af06f9d7379cd26e3520f53413c109c8c76253e4f70054412253b08b91fb2480fd4d410832dc81582de018c445458dc5e9b34c9e764721ff5603a7cea540417e1adcd200a25cb7f168eba3a0ba109aca7d650a1ee150a2e2caa9597f20bf99ff060eb3c4a5afb6f0d0b793fb784c674a440a9eba92dd10937e25bb721257e236c6d8762e83c195b96b5d11043b80893a87a930c42473edb248cf759455f140a8c8730a15d72aa62b2a27d9caa66cd89e61e830442972a528b423cb53a24a983c620b8eeb994b9583cf698d3eeaf047225b1807f7b14bf34cd6f7e8d7886e37d662ed297efa205d39caa9f4a87de84fa9f548c6b26680681cb95dc3f526718a0dd29c2a69efe4e8f27cfea7c11aba73ca9c5665f368a8ba93d0afa79c74b14b217bca5b65f0796d5fe14d8a22c4798937a8df3d112775f3abeadfefc9b4a43ed09b73fce325627d47cf73b4114c9566300c89715a1b35db126db753afcfdad92c4f44b6a526d8edef4f14b602794cad2c629937103b6a79c2e4241bf076050f1dafa48e1ba73363c8a428fc5198115c35c18dcd6c92ac862239f44b74573c6abae75d0e3123139b881e954cc9d8c93e1a2429f71c45f1bddb3da3d7f72d25f5b492e949631696c0d85b096724d1c2253af7ee1a15f8c18b93e69d0a9a2bd01f72262dfab729ccee59012e8ff7486a708c1e2aaecb3968d56f0c37c00514fe91f406493d84474c2c020f6852e4e52f827911942942217d969c8caec42b1e4f95ca9385cda4ae0ee1e16bcbc118f7073f97e15337861bbadd065bec10c39a22a2fc8e857382df1e519c52f4e284b0608a7d5b4507dc5d5a925e40b4a711a18267f90f713ec80a9f5e20b66fb8f08de239a9eef817758f79822465c94317bafd8a0794797f7c72a26c400c4cdafd149b1b1cdd74f9e2016980406e7a61b52efc1a2b66c00823164bd43127a38ee6e99d52a6984342eba50167ecd6a248acbd18245997e77fc19970c6d07c067883a13ef5c19e5cf831a4e7bd75c46a50922c5ae74128ed7742169e7b3bf7cda821ad5370792ff3ecddc1cda198e6e3799dd7b567b20b0fd21a0268baf7933aa0f055d35e7172698b1e5dc90f7baaba997a20567232d5c8ec5bcb124850f76f0d014ed04b35e81f72d76476004380a7c2815f91d203960a0ef5ad59a9bdf9225af0997d5745a6723dbe838083e2ca0d70d530b40e4b3b971b388cc2a6fced7e2bbb6fc60e64b6b3aa50821e8db25ba6e0031242cac8354eb435aabcc48070c9333e515c3f928b50cf6d24d0ea27a871bd2d4596164f43731ac0be70920fc232bd7c515a9d50b6a5a65f0a6345383673ff0855dbcaad2013b92599ddf559adeffcee830e4a0af2be4a9eda23fd5f16cd72dc17d481f29b84eb9115081e7304f5fd9261f32ea2acd161eb4ed9ad802da8cc1a4a2cf9b391eb84aea74b275dfb40c4b7df40ed960da35a55340434b296fb1285e81e9ff289ac8b0616619a6fd969b5d89b35754b2d8db374de708499cc2cc04502ddcc93f24e856afcd8fb4e3a98e421242ad1e9202ee94aff24b651a5d70631614b6e841b41fb18f27acb7553558100fd0f7e111dda9a9dcb82cc0754478c59ebdd96715c542d4ba314cda04f62feba8dba2d7b0bb41585b2c444469fc96c3fb74c98758f43938e8809c09633b1a55bd66cd993e2d2412fc200a8c7aa9d267363a42ed5ffdf0130fee70ec3c450ee9e447a629ecc2c945b21befe0e32b1381a7d03bdb2ff3c20bc1c889cc15352517049ac3ae739bc8c0a033b5876eb9a5068f0e605f7861f455e95be468527b85dbed02631af2a7160859821562ef68aeabf88e2ce6ec4a1a2b638b90b9be245f11b1bd41f9ee18eff1ef79b22365d201c171668e5e6072ff60465e8a2492881b3d41429f9aabb3920edd4535efcd5f4d5a089e69b826f539ebc23f966acdff25b0484de151ad0a90749139ceacd537c9fb6bd068eb331a8becd83dfd9609772133062e15bbea7e292598f61e18bd0c5402ad18cc082501e41d4f94cb7adfdb40dd6e133e3c98691452e108c0a4ec1c2d063b91513a1b66dbf89156b15eb177cc8cadeec7428c6240634c25b37dce91a24b993ac1faf2fe4a9a907c44ae26f3fb0453b009dd4f3fad25633566121c3cd56c9fd3047b84745818cc9c3417920c1062e4efcce671d326f3262b3c25abd4e9d85d15535622bb1a932d94684df4a4d459fc478f13e0866be42c106467aeb71122d0dcd1cfd51554bb8ad7393234b2c7eb1856dcbbc2d3bf4e9cb6f1ba23cb66674adc7e07e2425831a774f6237b0016fd03b0b7dcbc064ae995df63a4ff5287e6535aa46169da5b385106709bf8f64df037f8cb8b902c4a8939f64f265a0ce61024286c689d76f782f0ff38ad3e783af0b7bc092e915156235589c030ed260458244f2061b17a71f1bb619253979ca6053ecb0425e38072023436a57f2510dbe896fc7590414602cf1e1aecf6e9771be71b49a9cde4b36bd54c289440997c0b9ef636e6ffc2068bcf2570429924c79a643bcdc10e76e58c6d71afb421c24b3b546b0d407f4c175294b265e758bb45647e44c935983ad0e98a2c20eafba0c7162cad159821937e21e051001971900fb14cd140f9b3d938e10b1462815d6263db712c268efd9df988cfe08745ccafd02bc9a6a1b41254c32812f43326c64fafa9d05c2a0c52f1b327a935521be4716be62647b046814e71885f18056b91b0a2f82c08506b8cf1e6194989042ec8ce0943cb21c5d2135230e1f27e1d0253d06010c5bba4de02a77b200a07201e944eb066a91dc65647aa68d3ebfaf0b272df1706f559c355d2195118f38407ecda86147149642f11eea5f57bb6b0f3d1704b97031a80c61748826c2ce00c26b4b375d7e9ec30c17806d6d9e60db8a61fa0be46d509d8ef621362c93388a40ac5237bbb1a1b98a2841ec145f803b522845ef6e091cc091d220c3a9edf45b4a32669523db6e4a9e681c0fdf9c55bc6c385c9d54c2c94c187a487712696851c65eae7049c8eb52a121bc332c405cc9e7457366865ee4eb22d3ca86706305d83eb33593621d9a396040e07b29bff9b9a87167a655a57dcb30e15c2b71b80d1dc507599573dd3ab6905225b2f0808db129788e78b2e61495da608148c8efb23dedc9bb4c561098f53a3033a6d5e3e4edb924ef6bc99c71aee1e57321c0c621470ffd178eeaa9563599db4c5906c5dc3db1c21530789012db6bcafe58a404cbd21224f402bb9e510d0090b5d52854db412f1dfd57a98cd380e42039c897c6afa1c8657ef059b7b54ec811829c578422cfea34d2e8e290c8003ccc65ada23ab8dd5d598d2e9702975561a8545188a49e22646e42c9538c2ec024a2276de21b26db6e71f38dd75b16878c486074157b6ea5559c39c4839b149b62fbf07e98f3dda81c3bbb63a9d88f60e0f49dd0cdcff809424c1c987e74d78ed024d39a89e52fedf2b0cacc6ca5252abac15c06326d20383f1bf0d58ecdea6923536ef3241046d53b40f95dc1d2c8830b484680fcdd5a02327584eca86ecf767bc04ad1df344e61e40a76bdf99e68056f71b6c8799f761400a2393676f508646d17495553e3e439a17a410e59361415988f4cc31493edc8046cd4fd8155e936be762c61e40be410b89351b2fa5348c977e200871d98e35c99de643a1ae5e452d0f73e7220331226fc2e3fd80009e5986e8ce73000d4cc2fa353e399e281b9435508f2f6e212d82eb851bd4e57981ca2f2411cc43eb4f293b5f5cc30faf56df85aabe98f92a1bad689d98079370ef3e51d948d9ca19f36f984899250a6fbac8a489257eccd54605b80f0f23dec586478ace37941a985eb3f320370b87a524ee9455448c242f450d21136a09e497a813f3911f858381e07229d4311ab4675184f9b895f6495235dce247d50e096c79a25044d25b0135b23b44397ffa30bd9af893c5ffc8ea5324449e13c77e22c015d9600709e4fb54c27d8e4cb32fd85e4dbf3cd97faa40e9b357ecdcfaa32a79e31e8a041860176a6b1094f0c3c88fe48d0fb017a75357f361bcd25556e3e92f3a1dacf8df97a802ee2eb07535985b1e9daebd0584504ce60ee5913d8e14ca7b20c1d7626e26a0660de4deda6032d43fe8be7efa84e3795c28a52ce3fca3f0655e6dc009882a730811a741e2a9cc68739c3f17fd0a41144fe710286373db80dea9734d4be29a7c1afd444ed6b74fd7ed8d90098f671fddb042f40642e233cbc96895897fee7e2865ded527c82ef9342220927538d17a9f54b0df107acaee1103fee297c3e93c54ef94ac264e5687fb82d8cabc8c13f33050762f08fcfc61fd5ea47f70590c174811fbeadaab1353105f9508b8278a14873da22531ca13b623da450903e0ae90b8634b9c4323624cb64cd07a1663d5ad7adafd128e6aad565e0e8370858fcc9f943aa37940972525bb49720ab8ed42df1834780211fcd7c3cde8cedd395bf0cdcd162b52c3024da562d95c10101be41ef795def52084fd96eeb1d6b3b6f7f6322502f4a12e8eb3a674510958bffdfb2568a684c92dc93d6aad5971da574133ba9844b12b4ac1c6aa17e477744daa56631c8f1efbb4b15b16f4f03f7f361b81e469492834e7b31fcc7620d618db513ec1f2ca7956d6712eaf5030bec523eae69bda660a784960ab64cb62b4ef7922eed616c67122d0d96da64356b571c2fa22326c45b81d1d7cbb93ca11bf8e287bbe03291b871c2e6a0347aa0806e3531575277a2d8c0be07f79655733a99287a1bd601377eed81b791793201c1943730733b7c0b9e5bf0a38e5aabec00d8da551721d8c95479a8fefa7ee27ac70f5b1018a30ca82a1308a155292d30bec0720e15a69621f85e863b19cf8bf9f7d3c3fe3183e3e5968cb0e44ecb62f1721880cf3f4cce7feb096bfbc55e5703d09586ac7db756dc7e360e5855035c1157d1f0b6521576fe3b2eb6436af130183f5d5eea7d21e4f6191b294e69fa12e4fe2bec63aca12cd607969270e37700d9070bf872d1025ce206e60a161b741cdc3c889659bd5c6b0e311a3225c9614cbc7884aae19b76a97ea979e3521909ac9f4db4ac9ef8ebcd512f8052fa2bcc3468b8a9eb093fc853af17eee1dce99724a0da36d70fe8ab077e697c49bbe57679bbcfcf25d3428ffc1d0d0b279cce684131afdd0160889b650d4e32ad0f469371cfd4c736a203f90c8771be8040efa78d38c773b7cd7d3f6512f8e2e3cd709120966683356e206309e18091400f64b41419b49a09b906c333a38bae53ad2b223218325de28943db5d489df1568606183865d4151d08ffe68058cf6562fcb3eabeb69b651abe8d6101f2aba59d7e0248ea0e765c9a42c05d21347e988ef90810683e73dc4436bf78109e366070188a2eb2b18f6bbe4213a73eaf650c04071e0e7e7b9b3123213e52845b76369cddbd6637b3baf50300d2881883fe20014f0a2a694fd269404e3120d08f5ac876939d7d96e1030d6607cd0cae9b2afcc288ed6a0010c69860f19cf920f3c75d1fc1ae35ccac941428f617053efc1f4f13778f3602e16d6d38a26b1f5a5c51a47858c0eb6d9ba2178b5133dbf02366b7a8acd3621e48482d6344671189c424f3e5815f4c200ee1404d5eb683fe50457e09d2e98059f24eedb7a9fa45aab1bbb491e4adb0d35c905e913b741ead37547c8d7e11ac9e22423acc9aae460b796ed39bb0e72507b841744cd30e8edbe93e692448ecf125de42c9272bd34cceb929ee296846706d7007dd1732179ba83ee10c4e61bc78a7560b248ed1e6fe83b1e321e0ec5f405a4459fe4783c3f929524602d5114c9e7af9caabbd0454811f6851a5f426ab460fe05579d592618c1b043d61a2e61e9867938ee26fb3355edd83bce80affe5d5f7f6a721db2bdeda53a207a7a6d0d5ba87776c44b97c5a247d2807569ee1c4e432edf8aa2a671f39e83d8024186343db6170319385d9e08ecb432865c837781291e09376c1f99900421550f3ef112f91548cd7b78c7395d40cf610cfa99b6ed06338f37fda0505ba479f1e73afdba701fa04b21493c12d435996a2f10ad2ab128c10a64a124f6efe3f75444b10e7a8ec5acb195f4fc593e8d744044e217ffe8444ced38adde967fffe910d14d76051721327ad0532f428638c26851388d2f4d3eb1b4241b1906ed9cea12082b4c1d492b2c4f92fc48d83fbc6538be3cebcc49cb640b88d313b37c25079999e289c5165263d270ca29e521a28c54c6043b8e7cd59a8dc01591427f395f84468e82d7e8edbd0fa51040347cd80238aebcae39313754d4493121602c0b0fae213a3aa5275bd1e7847ad54cf7f7a431e41742e6756cf11d15e75af0e465fbd33a0373e78326e2c1983412faddb2d1e80592f826ce9f89781ea42715ecf84741c93f63dcc7ebd711392a72443e276ceee8278a1332135f6ab483bc1cd14d06f0fa8946542504a72af2bab0824ae7bbaafeeed1b78eee8a56485f7608aca4a6b9c8b699bb835418df3b9de7b7e3f0a16d5d0a8613f7788f2cae981ca92226c0f412819e0f99212de9dc361c47dbaea054dab297338c138bbd3a0137477310479100403cce83d31839ab7a7c67d6fe5f29651a418b09e368e48a5d0eabcb63ab6f845ff2bbeb522a70f356396f590e5246599c5003f496291b3e04d05359b25451a9780cc925e3f1bfaa61cc45dee4c56321b5719a5b915924cd808a0dc2321a69b361dd71ff77910faf5dc8b4e30f4b2fb892ac5a6f2875901a13663e91dd0d442651a5ba6099ec52eb856f28f257afa3ff0359dc2f1472c4401741a45cca5952f0b6319c6fe3fff806e097b3cfaa0c8314200ef143291a1b6c095b166ce06f76a3df444aee45a3620f01685cb852bddae5a5c9b601676eb7e88ea1a4f77a05a7c1c50170348504f4d267b27acca3cff295944e33c9dd7040e3b2c198f719007f74e7e01fedc58ba85003312d18f7284fe33dd0999fd8134f560afdf7788e158a5d6ac591f2d1f53c5fd6ebc8309d340aec8052ac35b9caf959e7721887b969de7c172b99dfb1b25381f10b4b29d3adfea2d6e40182ee1c56dc8ec73beb3c1e09181fccacd5c43aa315b584494a8dc71f3e66789811bc54de33529e0766fcbd99e978bc0b775730870c60afeea5714a872e092bf8bf0e733e3e4b82b6167c3ad08899b2e9ba2ad76670162c23b5f78477dfc75c8e810ced75a9bc486e2f7d21572f70a5eda1bea9db9e5f734cce9036e41865bef5e564f378feeadcbcca6f176af5d8f9c5ac39c9dd472ef4b88140886db4752f0c6de9e902436d49b011db7ff0b9fbfa054764987992f8b361dbbafda7bbd419b39c69df20ef8f2cbaa92ed77ada1146f8f7d6c2c216425ec02e17c1597b5b7c7e557932a38858cc813406ce16fb570b1bb40ea1d8c5533c433f37e18faf524b3b7047ddb41026d5a830764cd89612896c1e9692f1e397fcf3bdebdf92354d14086e6378b4610f82d549af83b2de2299449c855ec683fd5b972a0e178ba91b4234b4c4d7648904c0780a0d08a660a3581a5121adcaddbe7b512d4d49316c59f3a15163e6157c71498f2413e891e6c840835f58876eeaf58e0533d6110f7c996c6f90e10be17e225430a3db13cfa54e1be337b9593d51121b82c071fd36d23098b1c7eb0b0419734e1c08115c7020de1e81ff4dccaebbdd6da8bfb0909fa28d70b95f2ca104fcbc344ec88b9cbafc4e8444b66812951b377b00068ae8a0c202ca65862c2de7b1dc573dd7a2283b3255aa58e2311b32209f328a57522d20b3a988ee93fc7be30feac4cdcb3b28b55d9a38b4f256767e7af8536c89458911d92991c0cac096888bf0582cf35d198cf16d125e66f07a9db792bf61d3f78b12f35af3e1a0871233c949cdc2d553f075c9e788b5cf1e4f90044217bf207107d366a854608bd130622f69e2a3deffe2b25d16697b507a9c53b8337b0c72834a82f805214a99ab6b889766e7879ca6ecbb4b2d1f1d3e449f03a96078d7993db4b7a19cdea8badf587e7342ebf6394fd8889c902e7a338b209ef7cea64498c47b2385c2cd13262deeca53c904c9fdd1039ac81355227ffc5fc3b58371d620364259a8ce570439bb60cd252db8614b15e044ea21b46642e856e17b65570a8ca410b9532b7e935e6d58e7b84311d28987078bca8058e39ae82f4d734b2a5e67c3c16e410d696ed9060417f90de440c57cbc41758a681d68c4cd0e53974bcc6a5870af68dfdd4a18991d53776b22930cb8bddc481300b91d5fca5ae88f965bf05703a838b779a9f2fb4a65932851edbf687e10654080beeb356edc1c418f2177397073e27456335d2e5700efb0971218bbb8cbac09b28e6f7a2362d513f353724d2fc1897775c0b1337ccbf0f2fcc83518e3407262e48775ba8b2fa2b724a4282ca6144550fb83010588581abac2430ad80f7ec3775cc7a7b3a7a704a71a2ae80d964f066f5c1ac3efbb8030f82b9b0925fd40bdc600db22b8108133f9a1d67253c08a72c5c6f3df66ef07da5e90d6467771bfeaa085ab634dace5c97e200d15516d8b4d84368f41b20fb125dac0042972b321894626614761415316ec2776cecd667f848ca278336290c60a58e5017e671913c37edbc6d3c50b5c547c0bae8dcd72a5a0212882cbaad2848b75692ba05911ec72bb2f727ddd2aa8f2e6457ae588225a09a34f89f345c4769645c04768c0ebf0e904f513633fc07174d551eaa5eec2893d822278e8cee0dca9a340d031f8946cd76565f8c2e8706b8b78df3b3f513813dc7a8ae5ad6a25b56fd4a5c3d0d626e43f069b34c2172eb445d96a0bf707fe1994c5341385b41eb6c181bfc8be81762412e76fa40ea55534ec9f2a8317211b218850cbc540e9f2e114c140e624ae57bf317f2fd17b70768e34b83e72ce8c4f68b1a72a37303b3036eb56968997d23a5ce02e9e37b9d5d6859995b0625ba98c4db26e02476575795afb9e29b5b521ea99c73e93b57031273e1ed076f0d88a674e0ef6d2758d82526c07db9d96ba31a0a3d7d8720341b345063995ba6e65688c65462dce77aad35a9034d9a06db965b208ed60e1eeebae0fe0e2369948e66f5129ec980d1fa75a2bb82bb516210b39bd2d65a7fe172b3b409e727451e38a25a4f9e0dddabd51c77c20bcc041887cbd640eebbf3e4234dddde0103b86bc363d4f06e7f8b86619ef787877b35994c78b3d67cb0fe560d5140c66551e3d19c6b18812ded86d22eec5c87ecdf556a9d40faa76620007229b94bb0f1c882fed1a1837ad10bf8932da5a4ee40eee213ec4589e415a7dd064d7a09b0df6b12d30798ce7e80d4cdff8b1a8095204e98f2afa728ea02f7a0f7df0c6a69799f630b3269fd393129347d95864fc260e9c650511b154cce0f8364bb65021489cff91ef859eac261d58d426a4fc01aea40bb43c10a604f3f51339f4739deaace0764845720cceca49cad1d96d39c495d1fe68548f8940156f2a96a337f44789092107c7e53681a725fb8c43343bf87aa443b152850dc8a237c7814820e6efd4bf2c4605aa0fb345979adf6b494541c2263f4920b0d2389a7ba7c0080561b88f0f081b5a8cc3fc3d5970e0fc724be670e60fb85222088315048d5825500e519166edc83cbe6e8edb6a6ee077335c1f7d202c3bd26e4e154f9c87d7b471a1511b90eb822b391ea30ea7c9c2c003c7b144364e9e2e90e3ce1b663aac524bf5f611b0c40b093072270c6e9f12deebbd5eccba4a818cd6e0f94c5c64204840c054af753c858209c55493a4df570c29087c44f14a42928b37022190dac7d9399554633894dd05cbca362482378c150f218e3012ac0504879c876a8026e84a18b942aef7993bdf0149d0ff772c2b4a68eae8d6db74608216413b2f7967b079a0c720c970cb63dac497b949e661823ca8a643d4da39d3e33d234dab3ab7debe09609654bdaa3d786f2d5440addaf6e91e9bbfbbd04a1c4c20c2b947ad4acd942aa150accb3053347f4923f8c2886d22246ea112499d2259932e1f0618631697215615713ac49af2846d41e7d269409d16f466c33924587681057079429e58d0e49168e8687a41194f6e8231e7ad1628e66d98043c40f276930ca340d47f9835424a1410af98347946a59c4889a86669621536924a1344d76182dd80f23a23047b6ca688f7a4150c17e5ea6f1f4589366a52411a5dc1dbda2f4d2a81ebb34da22ce0165e8ebe581d31ea5c78824ab47d3a1682308d8033d46a403cad0677828532222fe0630045b69d58119f1642de831d8be2d77031165487bf014f871982b2880e4a33de8e51883e4501dfda53211473c6c8cc04f89236c6fe21d45f0c6d08c19d875b7c4a814e7021aeb12db0623fc50194a2fa63dd80de3e797c24133ea065e1b4db245da439e77932a57cc20d3bb92372994e945652932fdac0209934c6f862f323440fe6a86b10b3364f80d4a2925bdaa79e8a48b1364e8e40c4d32bdaa8985a0b4870c93b50ec7b6e5ba8372d8b78e57e9cbc93d3a1c72e364093b86553163f83b22fb6cd5723c831732bd900a197608e85fdcbcd0499423647a61515669ef6758a5a3b56e013172508334f4608a2fb48a88e02d0807f04d1a17a65d078122abdd1ded61b7eb7048dca33d275d1821d38bf3b6416d93df111c9e31234b39e557e55f62b25931c437dacb417d953efe8092412fbc29c193e9291aa4c810a609fb412f6623b1b82da264ca5d9d5e51fac5a4284374600d2e532e7a454fbd22d0cb1ec99a2d9f1fa04c879234122cb24344b28846a1ff2452a694be9188b4e86591aba34c9e2b28d37f5712a817990e15c9f402caf44a22ff5d525cffae1e647af9a0febb7eb024d36b08995e44c8f49711b67f97500c4211ae23401b307f17128e646a24d34f2a4421cf6b46793e9b429eaf52c8f3d813f2fc05853c2f6f11fd1042b0dfd524d30b691a0700c1d26f1312f990ace669d1ffb800b4d14864fa6a53f7e44c8d64d5161c6ad1e790acdaa2c7913c3c3d3cad0f16e5af665a796a0a54f1e2c815f6ec4a78d45ff13a57c43cae675807e2c3d6f50b43b972c28e2d6cbc6a1eb67494f0b8561297e08b2f5a18d6b9308e5cf521162dd822a2c4154447444e00e2e169f518361bb6900517b96f823524048ab2d02247275934216771851c618d6e01f00c3c88429329b880095850426ba3df90ace4524a2931aabd9e71ce18bba5c4aa20e4cc5f4e2a4f4cb190ce17ae35abb56695071b7c6798bd689e1c6301ae28c0916d29da8bdd41333528b05f0c0a8aaf3106c11afdf824e02ade0a2bb8c0053188c18898bf7867a04cec8132f1512806b5177770628277841bffb9e4180465228c3578a6bd214a83ad0f63b6e903f768ef30502c8c73c21a38e490e30bf04293e3bf1500e4f8afcbf11b0e103ec27f3239c27f34be02e4985786ba00a53b860af6013d2034ead12c151e480373c46249f42247d939e277c4e320799163ecee0165208d292c4c7e145670a2022b8400890cadf88bf6ed4c045066822d3e66982aec9ca708f80028c6382f2c400f6c47f87ed01633a759a7a022f9e37212175a90db89dc9f3d349f8907115d7022f70ba4e4c27e33337d63a282c5008465c8ad8618029b82f141130bf1c61c8d441f48d4276ac264e8a71f72d8d4b8c242999278e3ce439ec33a4a78d86fd7e1b66fa7ef945eed4f2aec1d863b6cb1e47248d3754a50ce489609eb580c6762778361d84ee9ee946eb9cb43607bdbbbc35d0a216f3f44bff4abc2ec5561f8d8376c62582a66ce39e76ffcd05a864d4c2504777b1edc2dd65182dd84758e611edb4b58a7c33ff29793ca578ed656538435e6052d8e64d40bb6150089250013d68455d74dd8def421ece93bdded873895f0e5aaeb3e2357ddbbe7681a20dc89c42be747e67e5dd72e90ebdbb76fd7e56e8479bbae6eeb30ec6eaecbd2533e84e912efc89b9e226b2cb1ed5ddf9e92f221fa6f3c44ca8e7ccaf64e91df2eb18e92adb18e4ca9574a4a0a2e7d054abc721ea5af60d5f6bec47d791e2b4f297de59a9e725bcaefa4640e2248e4048f05bbc4359e7cca777624eef1af06e987910e1aa760d841d7769bf6222699a4c4a85d1289bcaeebdaf085fb4877ee0a6995f61495865542c89b3e44f777562e0f5b580f65b799b487bd913ae9bae99265fa10297fc54398764a37e1b754d7cafdf5520ad6295de53a2bda67e84d87c0bcca6d5a7ee529d7f057a382774af22be721df2b5875e11593fccaed9b6eca5dc13a3a4a16005b454adfc1cef29d153ce42d57c131895c614f7295affc8b495a70ec912b5cc2b0f78e121ea59bbe93f29d128e427285ddf42ffe384105afe0482457d853f08c5ce1946ed37da43deca5dbb04fb63d55bd2a7482cf2c9231242a32268590a4c85f8ccd9f24ca18268d32f6aa5d9ffce9a49f8e02054fd37c7d2463c7b0af833276ecf2a76954d1a83dec304728bd05d6485f7bd144fe641124f98bc92ec89f3c9231ec3208bb14c22e81b01e922c09d42bec18563af616922cd3b16fa50b5b12a86932276412ed7e336bda27a4affb691708f771c7c1e14f2773ef7e693f226b50fba79335fc71cfde5d2099bb305f2b42e6fa5613ecd745454d43451b3594d28d2dd834dcbfbe5bec704a2f611d2538a6c796e9b0c329422457980c922bec25a18c4920b9c28e00246ce926ec291843619d782457d85370f3c81576150c742431f9d279c897b08a47df2484e9a5f330bd8475945cd729dd842fcc23e5a69bb08ee9297846aee289b46cdaa6af6a2b9536ccc3f414ac63ba4e09f669c3ba4b2a322af27609d42c1b80b0cb24506097525c0a0d31c12e899a262563974d9a063681a7a8698c9a155bd8b36e6b24ecbd05f6adb76ddbeae55e82ad99bbcbaeecce1caffa58ff236b5f44009793b25105719d02c1aede76370d45d35cc7de47fad81b48b26412d631bc80674882166400042fa0e88115b08a2e7ca85801134e34c141129a1150f0da821c18218a6da6e686164b903718266149e79bda34f326de4035e356bf421475d0812e6a40822133c0c0073830820864952cb001c566ccd4dc60b26407429e78420b4e000214d82006500c45404a4ab283263f204211d2c062021c2a0b96107a7286324ce1822029dc9401046018c3088ca8b082108698dca83f4c8cc073055181127200050a63886207396032e4037a042782c041a1cbd089163a40e2e531a9bfd8200aae08151ef5129ec864275ae4206e193ad162069814d9277d955072015a21e1b9a9d1970ea54d4508f0c06635c33d3376775cf74ba532d5340d9b2ea539a94969cdd7b5c139a92cdf9d8e1da47003296429f1e50c0d4ae59ec2e1e7ac539059ac57e6963d25ed248e71051bb15328d32958038334d2382f26364eeca2739668378d6c7cc530ac524a29a5337266286c9c734ecc9b1042389118dad13450eed8b10387c767b8548adaecde68afeb8c19338e2cf7d62cb574e2da73689b501e46422893b003486d372d49689214f6a5b931a499c88cd107d00b353557e682d2929a15608cc810ba60e468095688c2159ad8e1075e70618926149dc1080c1719bce022b9a859c1116e1085d4028b3c4538417624296b28f4d04c06852c98e47ecdc207da1784749e0722a99078e5095f4ecaa63d384305073f9be10fd392891ef33d76e0f4803560ae3525e7fd81776029a422533ce1139a767ff4aa4f812758791d974be8a2ab7bc2b391a994b5322907910b31313c28322b0d9c6481832c62a044eaa997149210c4205181086290cc1d360b2672a79e2ae553864eb0f082678331f3fa4400ccb4628b9ff1e28887a7116387b79171e60a5397c55e204655f80f95279058a92a08787a1cf0940331539ba68f3be6920dc6f4b5e64a8faf5727cbedf2768f1796ae7757486755f65df4aaec3367dfb45b7363467bf39484ad3258b0fdf8f95d123fceae929b96a2ae2ce595d122b04cb9b8d5631708760c3b8e780c67f893e740bdd877b4276577524867fac5175f7c91294e113c67cc000090edcf78fd6093d8cb4bb3e2097896702f48f99b41459d9c758205175560c74fb0f342219de9adb006965eca1837d8e1a8f3d814d2995e4a59b9531256060b361e1e016d30667b4c56ef942c1f120051d83e0787e4636a6e344d1fde46f3248bbb3cda9bbfe63c776dba9a7b727155adecaae433d8d2113264d25b73e3a6e46a3ebb354d03bb1b23e427cf6c490669e9f491bb8b38622653788b88797efb220e5fb01f1cf2410369e2250098603f2e6331053e4eac8092e5611559737205d2154452c6d6c21659fe872b80b2bca2bb1b080e549e1e15b39794f33244b679f267ad4dddcbf48211648db064f4c9d2a224910c3b05d02f32c59f973b66305871d24518825a3a47f40f96446929913fc204852ab46837454b4704b4356dd0a231d6f002ad99fc713d45597eca2749d8c0da16a486aab0fd4ca1c2a1388b7212538519a8fcddb841042e782202a42c7fcf48964f4690457ed2b324045180ecc77932e41389862ca50cc10db24ca150533851b4051420ed00094dd848a004084980e08a316051610034e509ac4445cf0afb798d2ac233f3a44850ee549e09b0908b1cb3a5f3d60931576f2701e20bfbcd2c676603793ea91ef818858bcc851022a5525a2803a594534aae3d4aaf8b524aafebba2e9a490985797a3f08217c020da59d618c4443921c0fe161a6b0d028c7f8998585135639a594724a29a594f23595aa55d20b8403323fd181eb59861d8fc9c3c323f2f0b4ae539a950ecf214f9eacda80ac0c138121165b644aa1e47a6fd007c0157d0f1a4aec974a5d3376d0b5612b5734884786eb8555d88545a31e13051a97d39ec669da61d370dc4c8689626bdad34ef14c7bdab3d73064ed0704025933bdd2b86b9a767f8032dab778f384296adf116dd2866435c93ad9a803b24eda35abfddb72d434eddbc5d1a081e558a6479f2ffa683a6811354f1a38b01c90b9889aa7fde99af61dfd43d3b4ee7daecbd19e76182ed8f818595bc1285c2a95bea95c08572997be2f756820d3141c4432c55c7bb4b6477fb217cad83d763a2490bb2db6ec2e6e0043b01867ba3b344d3b3c8d77487b9aa671da4d17b6c669d82fedaa17d4aefdc70d17f334dd2226aca4eb36dadd701d4d51cb69394d0393b577739cc76937715cc7715df78ee3ce69ffd134aa0dbf641bb27618a361203188764a09e8c55f4bbeaec398cfd744b1321cc37d2a997b13f68b49373109d6a0bf3eaf1131cb21f901fbd123f9ba4e8fd01f38295012c8aa157bbda2a1f853e5eb9b27235fdb0557d75b2eb8badedd0db7baaedf2aec57f341263fb0ce735dad85ac6659966533cbb2a9cd39b32ccbb2acd65ab35ab16adbb22cbb0ccfcb64d31e5be567a28440c8441c32550693416548d95106fc4bc440b8cc0e870bed70b85ca92b45b5927c6abeb6576596a5ec70d42c8f2342192ccf0e4787034299dc1687ccf2db253b5ed705af6b6a25799bc631a14c1fcb9f8c2c7ff362628ba60b82fb01fb4d2a5c24ec572f8ffd6a15beb01f17c4cc15caac41eb6ea8a006fb552fa660bf9906fb4d34d86f7611e50c66908214ca60bfca85fd2a19ec57c760bf298624fbcd3080c17e33c32fd8af6ee105fbd52e70c17e15a90afbcd2d54410b26edc1f3d0dd1065781e3a1c316761bf894514aed082fde6ad387a16ec57677437b3bb5b9ede228ec8dd33680c80060d1a0208000d1a37e04be330316c7851c170a1916a615941d1a0213b1ac0879ce5c6df4e8e98081b8cd9ca606537dfcd49e3065b44d924922cff04074cb2c4fd6dda0c8d94744151595c9d11a692847abd874c9355d7a1910d906468648326645170191a2979c248490a5019bb8a1e1a294122d3f7b74ecbd0088a33e4fe56e260d0b881c54edfdcd6c15249becbf5422328ba9061d0b8814dc9d089173ba071831c50663e5e2d5f1742195827bb6b9a6987d34ea445e33baceaba928ddab76bdb10a525ee93c739ac922f9dbb76553cb4e3158e4a6221bac59dc3253c334d60bf3e6a297a353fab4dfdf3e6278ffd5a8adc52e4f9156445a4186526e58855f298fc02906751961cf5c9ddb4bb7f48d686a18fa659e5598fa416253b911cb5ebbab40b565576ed45d9c0dad4c505d6956a87734a1856b17ff08a5a92816ddd5d7a09c3b04bec9ab45e4472e95d67774eb7445a59ffa84a58473544a9a4a968f86bac65d884b38a55dab9947bba56aeb05ab379b7ec5e3807097291b1530c16e1c463dd311cc9eaf005324cc3300ccb30ec5896613c4a3895619556b36fb8d62c7b56ebb3e7641573ff51a140963d3100b22c3e65997645ce5e6a4e3bccb23b005e00aeb29fbc53967950263b09e95576f8d3cde9559665d9afabbbf1a04c766dd36e47245babb283ba0a91564d3961158f949f7ec23aaa214e5ff90ade5949399116977296a7702c98b34fb9ad2998bba9c4ada0ead677dbaeec6ed338a7bdecddcd4ec3090b3f2fa757d9b92cbb176c3de6c11adcb3af20cbb2224faf328b2fe0751e92d7e122a42ce4ec13ff8032d99182a8e73615fc9494ed6e2a75483f9a862567cf691aeed9835c2d890dc60c363e364d119d85c4d830b62ca1a00c8cd164b457eb4cafea0af6506bad318b315e94ab322a86c5ee9ca9bed4616edb6e51da95e14199eae5aa6515038143d38b538c308032a7e844af4e8f4dc01e4e87f546da3bd548a929a7774492643f2f9f4edfbc1bb046e7d365342b1af966e4d3630af6c2607df2e9f6a577294fb5a4f00059299cd32bc86ac1b057df0669524eff6c7c708b9a695cce391931b78d53f9d6dd682d39dd7285f4ea74fa276d5c00f6a0a9ace0ea5455b007654e313f9ffe79f954abb5daafee46bb27593f7a75fa69cbb878e4c6e2d8d3de6906d63e1ec65d9e7acbafd37b4da3f2d3659c1eedeb85d1dea47273da3b5dbb2714fe2017f9f4f903ca9c0ee305ab3dcba1f293ca49e5a482bff9d365a74302797e8b711baef272d563606b83ec78bce0aaaa379f6060175ceb8570d572215ca9e00fbbfc6775682063dfba16f8942ba3bdd35b4ea76fcde12092311877b94aea2d5781812f57a7bba8a4704aae4e6f51c12ad459f067738aca57704a0a0aab5454ae9292f294d37f34cdf3e9394da3fdf4204d637f3a8c39612031e8ea1216d9cc4c502643f52aeb600fd9b92ccbae6d715eafd8a6e7c4b6ec5db38c6ad8081df23a3c90bb4cd260e3ae5d9bc51865dcb6ed5b8c5bdcaa1d22592ead8c653a9c006499b04eafb267b8881768349c65df26977dd64099ec1bf759c36a305fb0306f8fb7379952765aa613695d27ed16ab2cd6510d614fa7affca47d4533fd745307654dc32afad2f54ebbb00e9aaf5ff884d41eeaa6e42abbcabd5c655a6af3b2739702ed653e6460b5ecd9090059a667c76956f4691f9265c21d80ab2cfb322e3b8451320c43ce864019982ed8eb74dbb29f368b3db9ca6edab08ad33aac699ab6653a1b3e25b5a761ee439ac64523c2672f0eca5cffb063f0426c86ed5d8d7dfb8ecdcf1b3f10c0c675f18d5e613c3962ec93fe8a1c12997a3dd32b1c600fd83f8a65f80d07c822005c61c7b2ecf4d6c863c71a7a7383de7c8d6499625a729df98be9709c7aed61bf2ef69898d8355066bbcff89357b5ad79daddccd8c35779225cc2008660650749d64e3df6789dbe6217c5aa193bc68955ddef7879c44629ccec15ab78643aaa21faf515ef5c6f222d195f1f71ffc8157cc52a1e3aaa216224d2a2f5daab86a15cb550e65131942b39942156510821859747e6a16d207984148b8c7a8848060961405892a428724862344a12c6837484f5603f47988f5c5d47179251d110d11091d15051112714049404288910505050377fa6cfc5337b26cfd573fd4c9ecb67fadc284912491e45394a4a32056d5612c92169248b2890149241328904a2498c68915cc913010dc955d31e1ef9e3235792fe481eea237d280fed51498a823a5ae1e69d45d328f73796284941484742444743492d4645d3876868fe2419022a4a09052525019a3d0d3479e4cae5c74716754ff318e596ed0303e9284a92f4312a221a923f423248ae5a5e2689431248ae5a25149404284aeecf797b78a2cfd090203f7c10e5464aaa4772655424573670f376500bc5e0e66da00d869bd7af1e38cd43af8a874e0e1bdc931b161d21dd22233c44744390500c50121c7cfa461e1db8798344f1b8797d5c1ca31db8796d78e0e69da991c1cdfb4d869bd70280ebc17bcd4c4c92abde66385ae1bc87ad9f095bed33d303006464f0b0c3cad321071c626ec0f730310250a23c3050d0a44a6805234c9861c951135124d185ad0c5b67e1025c68420a463e784211340859010235fc90e10c359862045454d9839a1560dc11523005aa8411402941a1660595254327542821d70c9d98e10c4ad45cca599564da468332c588b0c18108677a1061a38283aac98824cd217d50e00724d2f0776fa6a65ab9a24fb92f5c5898a31620d713c9f43b9a757a1edb8c647551df2e92ac94d34b23c94ac15811d645507a326d8c35d68d1135eb43581194a641c2b8f082e76a8261188661b5af264db36d31cb305113161015b547b9acc68a9465d93321c9ca8a549bba5744285bd234431913a2ce9a648a43de60acb05813ecc28aa06d16462457940ec51ee8e10590b725302db0f1109eb4a34c4f4402981f1b9f6347d36ca5d3472c2c9d475b64182df87006db9d52d36d92b0f11c87395ca1b4177b328735619229fde9664b86be7a944b3813f2610bfb5d4d302228b40894a1f7410c367b43e970d4ac357614258af636a5bcf19793d4b70121b0d93f2c29532edaa3cf328c45b1a65bba1913a2ac898633a11e45eca725c9f45f56444ba241d134d97d8c3c0546c48bca1f1c32228b3e3e28f9a752d775e1194d58983f0e366bb6e4118c4eadc10918a7b0f0c9cf912c337cf2e393b756397c04204b050b4981577477bf04b9bb6e5f4c9e761e05616dc2ce1f79c2167f159b32f612fe4c41a2b0dfcc4cadb5d64f4f9b6f1899659710cacc07913db9f98dbe84e107933f9874b59bd51923e6c4b506adc1a664f8440552e0b2a002269452f04405402861614b193e51010e2ad2131500556b5d9c188902842338aa10828209a012c46009a135e0b842c80a33387a82123c4c98c001e5c7062e784202269044a9335de0aaad9c2dcd54269630836da66666464d57679ed0aaad9ce5300e2bf870339589110065333533336a368cc30a48db173d1587167e343218c1705c6128bbc2e7b262a8ce5426b480ced4cccca8c10214589002abb2ee60565b397b59232cf89154f40a66014ab54f8c8ce004388e8ed4a0048e2c44f9820f0e2ba2c430214a1542f62543274644d8c228079d17b6cbd089510c4a423052810a7e60327452c50b9868354fcf7e76db4f2efb2895be54d64cd0843f0dca95c65dcb49c53b35c9d5eca3a6c6f3240b9b3e64e491ac2c8bafd7074e10b98a48335e5e6262688f2192555fef10d9e3e6f821571d6b6a7e682ff6fbe690abf8eb88da1b14684e8385d2c8a8a88888c806bb90908e8e5229cf8b9fb78f337215a78c32d66eec0c46e4a47a224f1719aa216f32f20c2943865de4680f32213701ce1f355ea4a0f4316365d720517c20e118c9e07ef438ca5134eb0fed492aa59494525a93061be79c138582d872d20bab99b6715dc9644f292aa81596164e7b6357f6aae1202b2818a525c5f990abbe2a3791f5513b480b0ad4556cca214d9a493289fa08128589bd817a893c32b8b6423b4d6b2a75dce6825d59854943dad6e43ac3b2a91b64dab905c16e90ccd68afd82c1a9b8a70860035057393bb16c580f32252bc883242505e9555f5e5d04490a929494a40a721f971e6c1fa70ae28349e822c9c56b043ccadfac710a734a29a59c999bcebc423a4fd943b3252c9aa9b1266bb2918617369e8617368a6d83cdc1ef9bd7fd32fd26b491f0f6f11779cb52ce9b7979378c9372061127ae50c8700a79cb3878bf0f6a21432d72fd54b0bd9839ba45f705e1a453661a2f9a6dd594b2c2a5b4d093359996804acd8b6e5ac7d94019cc08192b42adb5da219b2cb9d4339649ed9a2a16244b9b259ef4ba5f742c2eb228a8e4d592a9dbba12a7a538181886615ca96577c83a1de8746d4d9e36a6fb923783d35dcba5a60f0d8b1b376f289eda96613054179cd88d91d67923eb761b7a57cda82ad676790272f1bba0e524c44a9da5dca671da66e24e175782d0ca18a38c16eb24c661dfb48a056133bd3607762509a79516a3221b194b1cc7924a1de14058c3d9a79ca235953aec72c3681036d3eee6822adcb672d139a59c525e9fb57e629f144e6cd6eee66a1a895194ce646d431258b4614720d760b1533a3179ccc21ab52663d27635feea5442d067e731af7db37285616f55bd563f44770def68ef5ebfed645855b36f1c6c950e5b37b2a73dac7431aea6ca15268dc822ed61b248fca54ff7d583f92d36a573ce13d15fcf2159da67b55e6469f3b3e2f9cde43931c476ce9f39afcf0f998f3c3329b624820ff78ddbb44c065b5512bfdd5cb77b6e02bb9d7b46e9ed9e8b53a47f7cbab01f2c6aa9fdaa43224bc319c6691eb9aa3fc2912cedb5de47addceb9644541f87ea63511dc26291ecdae336bf55557cf7c8558db8a1acb6ce341270559f44ad9505d5f3643ca61ec6540ca4872ea0c913bb1819f70693097e925059893d43403efdd3341c92a6e956ae49a322a2aa096937e1d8137b7a60a7ef717de536bd4265c4789f51a3f2ef39e698c4cabd8f4ddd65e55445454545e53354ee0d957f336a54f00d96b75ce5d6bcb9a4ecbfd803b59496ab5279f461b92a151c7b62cfc9b25824fb03d68849984c2653ece94144d39caedd47cab553a069ecb59fb89866cdd0fec9c8da3995144e057f95a5a66093a97fe44f7b773910bb696eaca4d8193766d4dcc0612377bba244d7ccb8117b5093a764860dc67c33c8889628d951364be51fb782fa769f504141a142eb98ccc8d5f5eb52b944f4eafab58511738b1d02e429fe8290ef144044d318216f0496fb5a9eac711b07cff28215da7ea18eba71280ac9d5751a11d8ed30a36e95abeba29106abf2954f2d4259ea7efd099614cb0b7646b27a74d726875ce12754de430507314a6a09428024ec972aa25e4fa20b0265ae6f18114d138568a8814617b661522a08c771dc378c53b9451cc193e9e52d42878727531c97b4a7dd2758dedd2750d78c644523169c1a00161655a480cef23692d543f620a269e85194fec0d575889a9d79a89c07ea2d2d2e87f11d184f3d85775c70747171c12c2cdf51dde543b0fce52f38c26849a9585c605cd8525dd84ab144d455b903c0c2c66cc4bcc949e594f74b29f8eb4c7f608d0804fcb5e4faaf2567f8b3d6846b7658c25f2ae7a4a29002e44ea64fa8d4fb75fea2d0133d6fa93c759595b8068bdd4808d6e8f2f54824592abfe210ac51b1501ceaa2d0182c5439ea51a39db7c8b5e5c9f46259e52be7813acbea8a2c5795ad5c185ff9102e67c13b2c77f90a56e1ac5c7516accade72d872c9b04a0896a73ec4ca5b569e5af94e0ac6612bbb0ee37aea62b92e6cb9ac44218b043bc406132cac33c8a50cdab9f8cdd8d5d997d12bed5f9dd12bed50fb473558c31e6ada3f54861da003c0c2a6044996a67d08ac018f90b5471e584366edb148ec89469aa6bbf6582459f25acbb543a945214dd3a25d81cdfe889d1e02d75b0e65cb857265f117247ffd9c54ee4ebb9b4ed3ce5d0fca68b7190016f6f4cfbbb1035046a3b7e5de0416c6554fdde52da75ff9e97e756505ffd09e5604c655ef0ea748ea2e3fdd9a37150c15d5ad306ae55caeeaf4c82357da612b7555273c446a2929b9d29e4a650d1aa16ed31d8032da35fbaf2577d6126009fbc122a2283860465dd38ec3a36954b076ae7419cdbad1aba6d1fecdc8dab71f5abafb46df1fdad33e8307b6ffddc836ed696ffc030ed3fb1beac2f64e4fb9b3bdd3e9b103c2f4d3b9a75c95f73d65ee2d779eca7cfa201ab2f6ee1a099199fb761bed3f340dec6eba6fcd1dc7d55cba1d1e0265b41f0596c39b86fd62a13fe56fce4bed22c27557458c31ea1041d2aab7452497655396dd0d0e467588b4602beb01af68551c8774a0c17eb50a20b2288e4314c35f349a224b1859147f3570a2d0cf1785a894bf8648d675568f8c4765a8d3d65963b5b2c7887e518593164bb04c252459199c922a4da2d6800b4ce060074859187ad2faa25044caf06ba3dc473946914d9f4d53806c7aa9bb3181e1074660f0411243184352ab7629e0c9ddb9eea69bdb9118b020162dcd665dc870622858226311677a050ba93841912a73ecc9a6c8b1601b0016b6ef4ade6077e34316f6b3d753da4bd3a8e2b715688303b64f2f31578fdde6ba73b73bac807e3d773bc74e475fbb38608ecfb2ce1047bfbe02c10e6d4260bf994b2d7972585854eee963ad1ab030c900c90423134cd0842726f840968fd60719a4b82725a8c2139f287277b5448f59c6207923d1908e2e70a6dce89348d6f50beb74ed6eae4facc3fd7a5f1d25f54a78c8cfdae7312fb14edcfaea28d1ae0487629dd852a21d763ce437acb35dc6221ef214ebf4a5943347bd3e0004f9d0030591acedd887441e2e16c578838270621024c2b0e7c0b1d8bd19f9a44b0c1bf62d768a4c99f448a420916b64433e6f10b9c26ed33ad210338d5ef4d2b26b0d56225989fd4b512c8b16f6082459b095b239246b279eca63ef718333432044ffba121e77a7e3e97388ac89251d2708f688843d2661d9e3906471c7befad9f882c8e2704c92d107321573304bf98b3fd875a8c17e1de483147ba87d244bcef6c9d8e3a61a229e7e01f1f4445443f4af2fa07f7dbe8b98885d718ad4bc6575d66a37ecaae27d5c5715718b86c75e87351e70025491e9c55044a9163225c012f69b9999e1c5964278b2c4111313c7133d35977c6c17858c0acb65f8648925e48f33b2c450a64f96105a22e8c9123d58a8a9199080063c3f4bd0a0a80449d460c8c9174890a0063d5c30e144d01ab6b045af201733f0a257307f369580257866d4dc78a2c414b81b644d2c96e113259c8021592dc3274a24010b835dc9f0891241095022892a432755b8c193248e66cc934ba411c638e5afee66d22cef8412c6da5f6c346fa68f66211d80bc99a02892850051ca10c78bf3362100e19440a06c29a5bd6e2adac0c6181333a56c127b4a9b49976073800a9b40020b69bc376373ada4f3924e2c265e06070b8b241640126b03653ada487a1b5803e6c6986cdd47667709364ae7ec20686e18a7125b3712666e6b63f4c00a1a14d1800a5944d1ead74816ccc20782100417ec200d2de86fb169ece826824512566b63ac1cd014d656018b3cedf381925bb99d27f420072df4e24f1711b520cf4b6dbb2d61fb22653e0dea2c8fb79026f5586de52c0b0ae6f34328cc5f602e91b6e689220e655996659fd88f66b5aa611a8f76c963b2b5f40dd75b1b696a9e2f95af4661eed74788e4adf39c987c0c0c64943c72e5653c32eb691f971f104016b7c474419e33f0daabed4999536ed38d5d99551ee31bc6755b96f1ecd0f0ecb61f30efbc61b78b744f1bf1c138989bd36517d23442da9b302f397a92b57a8c48c737063b92fdc8ae901c1e9b6121edcd98db3e467aba487b98f715d6d9611591585a3e590e339b0529b7dce2d93c3f433c5cd82f0efdf00cc11a187763de5d1cbedd1c8e438188e7c792390f3274a0b1ff6ea3f42f26bf64b7e13237c255f6120e39bbbd39bb0e37bb8c9b9d879be5d404699a2cc3f342b26b976615be1c42d64b67ecca2cbb9bfbad5d5c54da61687739bd9f07c4756d9b9d109e5c7d3935d91ee630dbdf709d1d56df593db656b5ae56abd5ce0edf69756b0721bcef8024e61387cf52ea9fcd28fcaf66d4ff755e41f9c41ee657bec3f56672c021e6d68a81a882803976189c3344b250ed73f1472467a94389310e827fdc47bbc9fe232788907aff0fc3df4cbef7abc9f1cb643c5e060fa712367d95b5dbc8f89a61876336d3de108fc5b2521dd2fef6bc26acf6ef315e7b3304905580a168634793976a0a60336c478d5c7515cad4976eaabdfaeca2ea6d7d4dfdfc8cbc95666c4ae795f410df9ab12ebe84736a32cc4b9d8e14279870820cf39a7cef0cccebbb13c23b0cf6c98ac85a33ef09b68b340df68919699aacc727cb302f468cdbc818f774d3b5e17e39e4176c4454dd2f955d0ee37ecf2e4346449615d429e5a6fe0c9b9e0e97265a44f1d2de7ca6838c31c698d592b5d8a4ad322fdb21e32193916597c1c30edeeaabda2a9579b88c7f5ec6b0cbe06187ecde2ac3f05771722ce2888cd5c804fb354f6e1de4f979afbb313f73dc2973ffb2cc3d42d60ee776b8195c61f72ef6d5ad180679562883491db0d56ab55aadbc95a783177443074008c9c834df50a6a7e6235928a0f632fd7c7738a00ba098b359006dc425b107567c0c26b38a3dabd83da6b773f4815e44c1557c854ba28d0863e7e82359fd83bd0d7b9e1df278bd383d95cafc90943545a0546f364861bf78b4241e514a297d3d226ff11f0c0633a8d563f0474a2c8bf873c1bfd73471c26077494ae57e0dc5250bf5552c6bb562b0ce2dfb3ac6286b166b949af672bde2344d7c2a65fba75719ae1b0bb2ec747271692161bf9951cdcad1aba6991427477bb33dd91dd534377c3ed534f8f32f4d732ff346b99698b77639ecb41be212d8c33c4d5595a66938ed4deca99b5d157321f47c4854052697a910fa495517e6d4addf689dad14d80f529169cd1e7f83651ce772bf987cc5dc547ba9d77f4472c48f79ebbaeee68677dd769ca6e926e06ade05c73c1e1ec51e664caecf8183c4eec071b9373ce6de3701591580abf9e9e328da10127b98ff1a1fbbf8dab30ca7743b88648c7dcc68e4749f23edd55aaf4a47e6f24c01d95d628c55f5d4eb05521f2356e970c140fe65af18880ac3f107fbd00b23de6dbb37e07b6f27d958b8d8b9e021264b2652c7a388a469625cfe6d39c6bf34ab7be46a3e9e53d1d8f0f80cda8842b187f9185f81a88288d71e356fc62348c4233822b1e17692db4e484e76f55a8f1cae03d601bb0dd448da9bef9e2894f27998ea9e3c53ee82e761ff4099254731ca60e311ac513fffe48727f390e1931544216f1777c38d717c617eef81a2915855f331f3f0d50e38d8c0cec243d6be721e6e0657dab155d68ec3cdda77b8da57577be39a33a369f88b19fb8ec82e9f3054283dea905ee5118b88b445d55e35d565beba9bd437b89d839da6bd5cbb2a1d2920f4a9c30cd32920751a638c1f909c99fc65dffef27a8160950e8a81c4d7a7fea51e31900dd79b14d566d77537f4306ed701719d5ebb326f58ce0c86fde53ade55f13a445a3a7c4787c7960e377bb7e2d5917d033ee4e87da75b9e1039dc7b1c8a4c9a26c6e72351d3c07c3e36699a7f3e2e8135b6db00e7edb35f9818d75eeec20d03998739c3f3a5a314d14696c21f91ec62038e18c71f951479de46da0e88d4b7c3b8d4056760260349451f97cfc76f50d39e811920b6571cdbeb63f60a6b608f9781e10a6562bca9bb3cf5ec7e3839e29c999a9cfa96ba3cda73b9f4b2db708532a9a7524fdd8764bdf42af57921d146067b487da652908b05e4701e11d22ec52f6ad8e3ab86736849c17efdd3489ae6a79d68a04ef2e1e42c87db72bf9a236eb98d6cb9dc59eef78cb3ca51f74b65156c44cc5f3ccaf329fdf3a1b2e92ec9f3a5fb719fd786cb316bcce2a3867fe80cc4e2f0ef469edfeacc37a466cd7a5ffdbba67d87bbba5e0e3ae0640d7fdb73667276285731e6ba61d81e91383384f9da345f1721cfe726f69391677b72621587cf644d071d74d04187c71c74c03ab195038672a5019161cf2aae385c285739317562446ed768b1d56a6d2ad50da308e44bafa4cb89f229c3273f52e42dc2505901b260e02885ea8a2cbf419b4d16e9c07e353b9a00b07e355f0d96491f921599f4ca4e69f117b790e56b942c6576f90d0604786073bc9cfdcbf13276ecd94bb3e08c1f0b73c57f0d22cb5e710c02bad251df2477d35db2d48be5ad25fac43cc4c7480b8e127d36d55f5e7d3a1c2f43bca8542f36d2c4f28dd2ee666aaf77e623aa53c51792a6b990545c7fbd1ee6007c6171541c8f40e0e52afc188f2d9bdeae1b91acfc8b79c9b5bd57c88a409f9026f5ba45ec41be1e1ac995f4bc98faefe531a91ba5884629a72d542e9ff215fcd94eb9b661954b181858d5eb4fd30051053163def2f5209854ca5a08593535f559ad359cb5d61e4296ad3108d6d031f1133b30ae7aeda1ba8e920a037bc5df8f5cafda6227c4ccdbe761debe72d5af8e0d57b5601df11bf021d7eb1069c5f84e0c2c0225add8b2e13bddb2e136dd09f1721b3094ab5abf8281a882988fda4fcbe5e311d8e1d03eb1ea42b96a696979a5020b5264ed1f915c2be55a6ecdb3abd788e48a85ccecc3175f7c61b3c67542bc5c7e8b90eb52bc2afe8bb56958f01733907aed0da4e52ca9c7ebfa5abea5301031d718c40afe88e4da41e0e5d76dc15fbd1e57aef62ddef95af3b57ddeafe5b165e5f57ecf35959af3f4db6d6411725ef431b71411355ce2586a761b3924471446dd46a22ea7728d881fea14743f69e2502f3140ac8bf67ead4264aedfeafd62d67ee18f5e88ccda87e4fa98313be3cc930a168805e6e910f421574ca552a954aff8090fecc050619dd88281e1affb590857d4e5b0c3115d2e2cea58fa4ed12c1cb0ae7317cea12a3ed1e7515e00c6e0cff60f7e03dbab7a510a8514499c603f88a4936448102149727e04997d31fc80adfe07912e593a5d8bf4127015034cd245922451280ee1208a28848884d80428314a8b3626e4ec158801d6fe0923119360cb8923170769be98978cea4e390d00b252b00e0ce1eadb666610c98a00845eb822f73348f4cde422e2177d65d60159918be8451472d4244874e14bd052debbb0d7de17f3923b54b3fa471a79339ab012478cd73f58b5b84bb1be8b49312868ce396927214c8e3649aeb84deb7096dd6bc4253b5fb2624f0feb74c23964cf4d9462496e2c4b1c83b215f68b4931a8799a46de8ba6f984c81c2f312e9222107b6ac98a4880ab8e494d8851c87d532a2906c59824df64906900c11228686f9bf8fb9193cadbd5a5274edd10b1750a52e9c1116759310e2f04c88a81e31118dc48c832c67dcc4bce7214ea224f360e8b8a45523e36a4b12855944f6f410951acbdf167ca5f0bc5e0c2aa806815103f340deaf236b0c6b571d108eb875cb5b4118dc41ee4bb6fa8ab7adf1494910d148d441b2d058a474209943ac5a83756dd9722282d5404e5a58770c5f8177da24f914baae5db756356a95aa85554f0133b308ff1fed523c67594340c4c8cf744c1b80a8c188fd1f42ef8b329fcd5120ab7605b4242127b90b7dfe85db9cae5da470849b4d150906214d49164f908d44550a28d96a2057f168585a81450b2fcb67259de409265f323f2702c371e819ebc4991ff21ab8c3c3e37ba6061de4092157d8a5a8a68e347ec415eda4b24f915f9a32f7d62b846c50e0128fcc40e3eccaf770f98eb28b930fe7ee43ecc6da44de7a47230d75ee32776ee612e0cd6f945a0a4081ff2fc11adc7576b6d78bfca1930fa6cc087dc3ab1150306060606e68d9ff0c04e8cefb46087038375ba15e3363ce57e349ff087ca5ff489a5fba1727703ac6ea854ad35a5512c99a2910000002314003028140c08c582a16830206962aafb14000d8fb04a765299a8418ec39442c618030408000000000080cc2606a3c70e6eee85c959f4ae84316b26b2d2381178d334ec8c8e95a1d4a38f71c5113508b71871e0af8e72d1eac747d96f6a152f46b136c9b1664315283935817b0d90d5729853c807a48ee300c60a6e5a25c62f87f284e7c1a8aadbb5f08b5579d9f58a6a6255987f5150dbcdcf2063d62f0a2d6a0d901c550bc26ace8e9d7b564852edebdcf0c7267e41d520ba21cab833a62cbefdb568c598af47b768db423f7a01bd62c34a7cf14c4098f848938b926a85c03d5f63f727f6e1621ab5d048a8ddb826b24e272655b64613792a2844e559f2d2f0d1afb2b251515481ff296d3f8a4f76746c8589ea7c4829b0e48350bd0b9b99392aef6d105724c6bac1787d64b00a2564be361e228cb8824140203a34f980fef9016c61d9f84b1f0368d75c58ba9d486f12c9f9ce307f2f3cd98b20a644183f97ea1d662ac36378846d43d6e80ba94171c907419d26467c3cf4c422561003fcea2fd2f417190d4b971cd8a4c69fecd953b8addadcdcfd3e39d81d0b9d5da72f97d8964c5d6263308763763819dd9c46d10d98c03d74ef5c3fb04f60aad53026846751a62ab524403a732b79a57299827caa730cbc582835376d11d6ef19e929d0ee0f32812882b40a8082b8bf8cfe597a72ed85d53a5a13549d565d4457e1673ac71cc7cc9881b05b1ca9cf93a16c0ddb08709227cab53b69b5914e5aabccc252a566e7da9062e3bffc95afa20027dead4c58a3fa824ec6ab0335107edf3006e105f0b8a2ee40fd14d2ab6283825ef798c7bc5ea07d8bc46b4a3970d4619c96ff7bacf53c1dd5677110470652fc48f8e4bf52129c9337c7b4dd6128329a4b18f371039d6fc7f26525b31d461571e717a3886f54be9b7f6a9c4841bbd63f39c24c46fe62a7f54de39a5a4f6e8ee957c0f2f6e4160f7886f4f4a33c96705ebfb081f6270e6b3bb866b3271000dde304dab902536354c53f0e8140ba8c1082756ac73665df8b51ed3261d3fa30ac054e68bd5558eb5f1580753471763fdbe54a585bc887763c100a157b040a15a362549cd69b53ba77145a6c2bc68fa3c085a06d8bfe003a40d19a3e1abb6eb93c254ce03ed57c5a6e4ed57fc095616f56e47bdc8985bcba8b66eb47a5138711d048f716d12f5b829b72f9a55a214d181442173d296984def5a085ee485091639588e32cb488327d39ec96254cbb29c4a548cc48a4cb827d92e194196741936d38657dd3623e81703c1a6423f86a092b0320b6b8633c3053e31a6a3aada3828a8c1f97038ee1df20e0d84c81934f06bec2ab41ec3c7f8da99657067f003629597c5590273238d94b19fcbb4a9169d8b20485d8fc505ec0feae560680fe42b29eed54f2b52762087da10215974ac6693ca0b4f20d0db43ac6482d13b3e29d14484f79aa9a5d8c832077550f03187c674b648f93e10013ef86d055dd46564f4dc7a053187041d993d1dd83ba9f6eb2943e8c3a1da16aca04ec251caac648756ea26ddcffe44decf0a398ffc12b2f09c4baa46c919e3cc79e05b464c302393ba269a5ed9d5759c266b15a3476c23d87c064a1c7df1a005bf5de2f4d392fdf25a10d03f3d6c23c39a831a5000715e5a4cf9ad76e1383567c200259b63e8fa3c5647a056c114a9c1f2801201995048044ec0a071b431540670be91cf3631c1c3d61bd43d2b15e027a5d61120f2f428eedea39b7234e24dbe4e12509d4dcc839108f307a9840d6810418e4fac386c2a5821f13dae0229fd78f2e829c09d1b46670ea03ccfb7f5371e60b4ec8b583fa46a8378181a95ca77f9739b67eee05fdaf6cc81f4b7312e7b7d18fc5ca75a3e6636d73d678138ebfc5564eefdffbd4ce26bf7243ef8fd0a6a4c6ac843cf549598298b1274d86c1707c72101ec7257b66aa2f7414bd887882396463da547c096b4a73650a4a691af1d4a0448daf207a8dbd72a02bb2112d4a9f96fa97eee3b18f90bec8ff9656d3eda576bb3ba3980c4dcf5b6800f2e9047c6116b5e65c73fc69c14d608872fbf8081151a4bc83ec98aaf42cd9e0bd7ddcc2ced5cfc0e1b71b77489b0a4e216863e82196ddad999b0b422ba1d9e17d225ebc5bb607f8c1816877d273b1e957ef4b65f3109f4224781f2acb87f401b2a7031019ff9ecacb5d9aa837cac5830a00c83430e9839b668e83e2688fa61cc54427a005936f8ab8d304745dc55a47f4b427b414b08cdbc78b9180e11a0be8f7a148d3b9512372ad6332df146a5947b927a8523dce36db85d15e0a7f46c7b4234c91c93685ba84c77eb78dd23b58c0bb369ca7453c1474d3997740f99c7a01ca46ec85c3c852ad90e965b9c0af9810a27bfcb3fae4cc10a7189fb64a80480a13dd61c571c4e150fb609451e24066de00b25af4c1aed0476c2f95660cc5392ef726d22d21807d9aad6e65a4fd8269fde30219805c68f6940727fbb39b401d2f79281d2f1604c4dbf853d54fa53da2c3a3eb5438974dd89dd33a9ca7cc56d7acc9db9ab3d15dbaf0becd0d2718eaab8ef10e0de50ff2d824b16bc1d3979e943f2d28ce3ec4f97065caded9e2820dbc1687ce6479076d6f7db755eabbf1e36634f3b62c26ea5a621b06263790a9e9283f1576d6a5e363f9783023de29ae92d71a44ed1c5de899e9645521acf9fbb7bbe510922f833c0ddd38ba2ed4f2ebd09eaffc825185fd2b4e83ce03013b4132ae77d9cd58c32652fc5b4beaad860ce87b7a69e1d427e532a804607bd9b8678012cc306d68411ecb742d734ecc4bfbb11dce1ee4a83711bf96c6d4958c04467238e5c1f5e10ece36868f2af40d39739fe9b1cf0c3899ff221c8dca98f364959c36b270490d2fed83183dd988e0c0a71929d944cb9f9458870168f0b02e11667dbf796be8a20ea36d0405c25f3796982ff3036189384a500e2da63b4aa5f9d155ecfe1abe7a5b988bd36a464495a55178116c8c625d8410e84e4eeb7249b3c5fdf543e25e97df3f53bbb6a39d8e7a236e18435191a0221a460048a57a4fc344afc9a1b517d251541a57ed74e47afcbea1bec07ab06c4c48bf1d447c71740cb048285a03e42201a9cff3449097c71f990c17e8830b35961b9787e94d87148115a4d375523b87e3d38a6aa547be48d95f3b6c89e6bf6375db40ec9d04210f188f0b59386e0bf8d9d5471f1670d1a5e00d41500d9173c8834033a25a34cecff81dfa5168160e9dbe6d79a24a22b3d753e2b58bc68562529f53cacd06ca144cfc2507ee7a5bae386bf022cf83c200fd60d66713d6a9ab2960beae695752acfb2b727a571d68012de11c8fd83f85013f0fe7639f0da7ac5389599d3bbdbc6dc73940e640f7a0d0016d1f6af5bc3cd78514326a3fedd9efb38aecec2eb1e449f051806d7693a54536f52e7538ced85699ecb26d051b02557c27b120a2a215aff7858b8e8d2170ce9e90ee438599a5c580d70eb37ae266b64ee8755e621ce8410de2d2100e6de5cef25233000c5060544dd361133591e98c8c4fcd36a79ca5a671b412b8380616866d242a1bc2697cb7f3405c2d2b77d5c5ec71694a60b928710410d08a055718d2165a0b73bd1c04d095441ab0543075048b1599aeb3486dc04587b200cde5190d386e1f14f3fffebadc1e17e4c8cf52fe5bdc871d09238b51a477e19f4074a85e21dd1c92fabad973ca6ac0370f75a1996839cc43bac734577c86b2c6e54e4abdb619b4f195f5da45fa6aa2f1e7a757915cb01c200b7a01187d3681d9a71fb802f9d6e997f6c4cec9d0195f571d12c839bd11f4cebec9340fead7125e53830d932dc2936529b8393fd62d56d19b02bf0fb638673dcc6cee79e522b1e1c477b6b89977a12230c0a4206b277bd8460c44f6c5c0e7d36453cc54fd0fbb4eeccc49742755201d848425d434893c969103d65faee57d095bfdef4f44f23aadd7021e33eef38dbf007b0bece5b25566fb04df0e2603331bec9d7bd98eb740d77313d6d9a349bd6056416c1b4f8a59a740fb7f9e9a6f5300b82ec209eb21e94af33668a7848ec069d7d0a8f304a683605fb19992012e7c06a541193b9aec070a9529b05f2c900ab9bf7808944b5b2c71d484cbbb06dd267e649ce49f049521e93b0b1c01c50c256d9556fbca5bb69f51d0f05fa0a74b40a6702f66e5d52056ea53da70ccf255b36b0f810b67628846ebc27a46aeba251ffc88f74abb46f93488328c899ab525c3ed2242b9f302cc4a8c2ca70e24476b60a7e6c1f73f3c4922b172c13af0c18bc3b620f4aed42ef4bfa4901afd3dce971351641eb8b95bb18d516d536bda339f5a3ad7eca5da1e36b7504bc6dc6c75e580cb3cc1eb0e5cab471580b8444a6ec6ca82fd59f2e1d56f75ee6d586421167c381789ad2fdf7b166be726143995344515df0247943d530002e29e01d9698549421bf2c937d32c85eb64a36f83ee0040901edd08df225e66e8644dd19b9daaea4d217589100420563280b815665a45c622c4000f521fcb7115e51e7503c92eccf44d1472c32e64af52d0e252b6d397be1eee8d1f6e30d5d1d977574884309e30079d675df00b67653e0c822a6a6dc144ad876d1b9d11a3caf3d37005215973b644eba612f2acb93dc1b6a25ce951d907d1658fea5d13ede5f50017bfc586e1ac0da005f9afeaee130605d713b7acc69b554f623feed875c94e5af1d8384ced55454ef3baa2ffcdd5a504bb122571e277d85173a8fe70af0efa00888fcf3bdc6dd1eb2e10f728ac760da47a79047d55fe3b1ab932e8ecec1a175b8d56142864f5a6d2fd5e23d24a81ea72fed3427b857c422f1fa728d46792e778037c8f080801b9d516ed80e8b41c5b1298960ec8514b22dc2f1de2bd65246e090bac6008a1475fff8e19d3c544532b3fc5e4f43f5c88ca790a161c76770615f590e8bf6bdbd63b7b7b7e9164874b82a5bc39892c4b69746ce7b77494a18867422c999638975fd22a2b9c0b110cd307cae3d1d9d5a151c8040a4b9c2986a6d2039b90a031985b91d0d7a2b2f0e272e84de66e2c863716aa05d90ef1f2dc084d7dc9e41f1c3340dff460c0dcf9c218183c4d01d1458c18ae2c917b82e3f0d38ac36ba8fcd839855303115b734edf84b3777315f1da3b81e910fc2136d7eac06761fb17e930fccb3820164b0afc1383e64bee4f83610163c67b7ac801529641e78acc782020a41236565519be41b6204e9fa0b3753cd9a657d80ef64e61e821506c78c39b525e3855b196c0251e99fa0fd8a784aae2e6add51da2a508aee66c0572e3e1408f3baa5ade786075d3dfda256ec26619eed2467d4ef850bb4558be38937ac40ef5b2d7a4e3d8edd07de538e324614b1f3c4389d1a6e59b3d84a895400d863c01677e1ce1dee7f18f8582bd65e08c8e2761e7f7baf706fd6d8b8d2b5f4648513291e89caf0ab485231657554c099e0fed5fd103d4293eaa6223cd719d6ad50eccf4f0ce02e2d13231190313b93f88787544c94b8f8b800afcb13ba0358bffb963d705210a6d80e192a2b4d4ff6f825e020bbd98fa015421529810f81484fa6ba491006a102cb2621c9323488aaec9f5ec40d12b375c3eddf53eb4c5935b3413b8b676035638e5ca5ac13da5c1c57c261e579f66c740df3121c24b6553319c61285e256173d05f0e509a1894700068823b1ab5c6cb5727afa5621da5e7571336afc46995b2829745a44e4a76dc695537fc5b2fe175f47bbaa1050a14ad3d690143a8531f5659b455fdd2dec44756400dd5010eee14cecc4be233e5822d4d690a60d4870a92c46504850793b91498dc028d29f830732d50cf5579608a2e12265e48e4a9c474c7492b53092755d7a97337e76f23e6d116cc42977ec51880171dfa5f4ae855d82cd508ec7e408995fe1d56b33d19a2481cde781d7bbe86563378e05f3088c16b034c17b4329fd5a71220dd2e78d1f183c2b1867d61dc7409320b9820d1b31b4994074cd4daf2dd5e4dc18fb493313f121f6b64ba4686c811f32808068d2b68530471ef0f5b9bbec09e8a76f5d524b69bd2be267637024b225ca7ed953a7d69e4499155768e3faecdb58f00489fae583f4ce60d38a0ab9723109b0fd5d05e9288d613266de33efced8d56aa4207df204cdd08228a5a08b27a1529414b270c69a1e24b49edad2440754d002af9d5f2a1b03e0bb0b61806c13a546b628e9181c37b2668b3e08d18d6d303fc49d0d55082c03e8c268d8fedb484371dbae963b719f69b32428f6aabb0b9a40fc34a07cf372eaf127032c2496ccd72aff758d2391fe492f077bfda8a8ac1d473189b69d89620f7a50c08325bb0661e7349f9af8dd460580ee17426d1090ed377c6b70107aa07e8e4c9ddfe3f28c86da556b7a68f9f1406aa95740ba96debb0d9de0cd0b43ce8595574fe41453960433073088fb415085b57aee137b992c2963711f38bc3d321f9ebfe8a8a9eebcb35f6fa9dff770c29bc7bc599f00b17e7c2186ea45599b3afda52d259e0f952f8da7c4b0b3c58d1d70768d6f4cf70bc4a5ea222c346226a47dc872a916fbd695f20f7a10bdf4378a7770482d8821de84e33b32d37f7bbf80680bc340743f720e9c5612ee6d6428e500d6c741d8676908f2df709841bb4138034f007dea922eb25d35a6b53f6df4d1238c8a2da8b7649dde35e2a3d76d06fc39248693ea16b9480efbe8fb6a664786c6db36ea657bb3180ece76e35a88a4e59c467fcd5e82739a84aa2b40fa430c85f2d99db83f9fff7730a6d9fb6527dfc03655fd160b2dae1044a1b03c6fd8e45c3bf4fd979c0aa3b9d1e8d918b8493da81697750b11724ebb980b83bc18df3b2f682ec440465ff12eeaa70d56f365c6ace90c8280d8a5015b4a7958acc091b00a5738e36a60c5411611461347959b592ca2d6c01abc45e84c2b5695926191ce8a036d9e0dcc2dbc26743617bffdf1b1a2d9746b95f3085c580d5f09ca2f7b3a8f3d8bbc744b65bf4e30726ed53c08c3f0a12ab4269e5d7753a18d87672fbf7de72d918f71de3306dbef9bf0ba3b86478553ffc2529cdc69c2846279df0d724e3c722b715cc7a9663dc020c4113cb0e84e588733c3a37bf2190288797d5916dbf99fd2b1c7856bd145b28bffd3be18a18b0acc7a909eee529edd521e4fe9e248a4ab44b345b9eda445e079274b5bd79b0e3d6eb743900b414d523061639df8a22b1482fc61aa59bf07eff219e3fc34884e02c5c46b467e48c8b5a5a70729359875d0dd2f90b7a70988c08266132d400541cc354204ce3858c7ca8de17b613b774e3bcad3f97e0b7c492ce0029c6585a5d24cf30c10bf4fd3abb4c8a5e14c9ab4b8a06381e8b2a1888f6552fce6cef24e016e2958b434023b00eca72c84f179fda6471de25fd22a0f34dbbdb0ddd138d9bb2e10d32d24df85449fcfcda2ef14756610e0b4a7eb968e388779ea50c3966a5b39a1e1523182e96200c727cdc56670583e0b87aff2672d944ae86cdb6662ba5e383c7ed6cceef1b597c0e6496a9925071a3f5bf7a04cf4148adaf8561b7c4a3f9c45628a64c29ee17a2be6734be08fcdb1ba2c5c93a01d65df25c2224bfcd29107e306ba92366ab00923664ff4c69fef67f7b08905fcab6e02526a4b7f061bc8c2fa7d29680caa9740badaebb2eca0df1a504f406568935e014816f92290423b8be74599f2e31a2405c27aa724fdc5cb5574ab9de2a9b38662da3c7c00b3ffae9f31f9c7d6646c90d61a541044cc380bd55b3bbe121d833e9c23a23fb799187e42075b2acb465f94755d5c6cf9443672849870bd201eaadd83dac34b4aee2b61d6449d8d566cddc8f11f7c24b2153474d3273419a366c02450ae253fd75c3b34439c3d7c86fcc59a72e64bcae78110e7368794b2733c6c04c126ed10d8c3827f7999867516882af203b56ec6117d5adafa75ea3b2444bd79799e84614bdb8feca51ca2834786997e5fdab462be62cef03883093d4376ff11e20c84b75f9ebe2cc0a04d47f462b8f796ec2d44e62b214632e01404d9e1b267d497aa762bad0dd6f3b60b13360fe242821e1f92ac86b8f2c0692e9c0e57ac8dab59aa28aa03d5425878735a558df22ec77e4e6e1ecaece7b77881008b96042cab3173c2fdf78178a692ebcce53f2213745af162d39a96d68ff93ef78063fcd30e706a0f1c45ed6955d7834bef19e2f4df0c606237976e0e987f8076b80990a061205d6b7b2be44dffbc002dd3b15c4f74e74f6f5d39bfb7e011a49ca5a732d689b1cd319a5a4638c08da323b8fc9d005985d46a0b4f31f6b1c72219593380722e12dfa895713ada1b5f6db1b4622feb2296fd1e899d95bb6a9a27e8bfcdb46e094d241f3bc1022171cbbf0e016ed7755380b5ed5c77b8283e2ee0946b3913d14e5e2764557653c06c05a7abf9e9ed929a7f0c3187f355e61d3f1d387827e6f5003b86ef90c6c0da5fe26570f12df656edb5234d2933951794de0e0c9d41a6a82abfaf4000a4df704467010750baa123e30651e3c6e4a8f314656ecc4686ef925d935de4ce3c94626c89bdb097063472fcada9bab004612ca52b1bcb5b98015e914ee22b126b776445720321121c7acc652118312a1d97335178dccba2dde4ccb128682d6ba4e0645cdeaf3375eb8f707e95597407b8ef6aa240a31a596f89a430407850367c20761a9d37d8d815d0c39bd87b6de4d11572d57f27974b5a9521b2b09e0a876de28694a118440e4ed89e4c0408c8d0e10db43746eece03b0eb7b62d69c9186614b62393d487c6177dece52258601558fc7309d78e8106c28736950d8e645e4385e110d778a713f727c601ba70deaeb831e59435b327e4ff113c3778f38650dec79cb71e6709ffbd6948edaaa245d57bbf1d041ce66cd3fdab86456d0c25a531a3b09845d86948bd48332d048542d23ff1db9ae1198c68f1e07bc1cfc3d19c280deac7ec5f5b80ca04aa08f3721d683b03c680fce350350d080a3cc88b37e4c067b4ccec3e82c1a7bc8d10d03f6930c8c17e01fb7ebae9cbd069aeea169a4e864cb76091c3b9a0ea5942e8f8b57536b50e43b5e14f307c8c0246fc2a19bf5187033d31d703ede672f690772f9e9f23cd0b8593fdce105c552053a09b5e2236bb06c359b92ab672300f905b00555eab15028ee60d97646455d9101ad4ae7e6faa72c3a1a6a5c9ae1058cc199adde84556bf95c108f7105ced8cf1b46bd958a1ee22117638c01c5ca348ea69f7497690bea9013b5d8989ff42baa2ede695fb7fa896bac5ef509b8e649fe4ae9fa06ad66b27e8ffa47304635f272dc9ba465a1f63159e2ed259eb8edefbbe24607a4d51c1a60811a3433d7c3b617f1a1c99c3d34446092af64b8b9535898e73665b23afeee8d61b871d9d6673c3adf2b91c7171c06737dc7823255f9d768823876e94f100a43ed75f5af499951c12f406cd7886dbe7510aee53e211587980f0717b858a8825ee99adccf5f6bf07723a84ac5ab190c4793f95e3a125126f7e2e78f8afa857086aee92282c2a2ceb942cee77c50c591fb58afed4b4970c5d4b88f23074c7011c0df063c8038964fb27ef8fac1d64ff5a02e5a4c67954cb62e144f9aa547d432088e6f6bad06259117c68ae69cbbd1b4c915d4c4b3bfd52763289e14d568bb7b3564558b4a36624e4747f79a3b0c65c8cdba5c133011b9ab8eb6b69eb13e2bc01d911663bf944f407340a9e36e91040cd8143fa2a5471bc03ae519d83f3d597a0bd7538eeb735581045c2338d934972b8e393feeed2cb073accd4570377d6d5bd2687cb3ff476a9caf13c8f4b5ea973dc474e1c496e49a59fab2844c906aa636545a615a5a0f8efc43a381316bd8e82ce5e2ad3d92c03a1446665e541475653c341c5893a3309ed468d83a0e3982817f9b146a51552d15cc1454af58f4a8e65f1de5c49bd05a5e6ab020f4c0a8f96f113d5be2df0975c6febe7c5244cd2df649accf5d5a1bce61a291b2c8fa822da34e014c7a575500052f0344d646a1b3df3744e851763da2074b8ab0eb5287ea508b6d4afd09c6abf8829da3e126b5b91fafc1512c8835122df13d5d2326d10fd52b04fce11e988a958ee2e0944e3d4e04e7d361a0a65117bb4b30ae3b742505e46dbe3047d4e26df73ef9d4897f8a3ba87996674dac49e09d0a1a9b634f29dad8e2269c523cc34b6023994c2832e606d364dd2fe40b8fb1d56641ca15a2da8c1cfd4f808851631ed68b0f8b1242a093b2a58d5804ac9ff37697472d75e67af5f919288fb707adea90e406c78dbe86c382478a2dee1308694d499246a692078e85b2b3ca1bd5e1030928d2fdf1344a6a68dec54ed6b85e614dd44602f5537438ee602cb54f7af23be62c52d9765b2017e37821bc9ec95cae67f7edb0a1ded7e095a9193cf6a0d3de1f60254d1086f70f96b25cd51475f5a061d6d29c6382b5aaf47683047d1bfa9bf6110760b35a2994a58dd01e4b1ee67a397530ea5e817a885b981814d07122d78c086c359808290475617c05c6c4719d6badffe560738a8ca57def1f39b605386fefa221f81eaaf80439cdf8fb6c8afd7a70980f69b89faeaeaa7c0090e0db947d57f57a311c4e99c0565cfa9048c072177e0cc729220e192547e71e7fb6ffcf99eb64811fc0df41080e2fe9d9a65f631123dab834be06b886e10784ad5cd2bb8f958c58949b2739c5e108f90627c82205ceff8c1fd283a26e33f20b6177d39f0e898b5e311424189b8ac286b92c44026a3cc8e620c15245ca85982bfe84f25432ffd0fb8f89b510d1c1cc7e9db92b33f01316863ee8d4fc59fb9e569849ff8169acbd1a893fa42b4566425306ba124fcd1418f3cad548461a596123b71dd796bb6340e97a88a05fbe04a42e65a552cdad02955ae3cecd187b05b78a552cfd198345e8d4d7760baa3b88dc1a6b93b086ccdda71acda737c994769bdd1e580436c8b82605f41bbf203714ea4b99aa18e9417e9212028c52b0f170d59edf1456c813bb594b6db728139b78e4cb9324e677780ab2a6230d94e245032ca565c80a7a23370ac2efdcde1f2ba4c619961ea0b12d155e6908c1186274e3595390cf262e40b064a7faa4c5a9b502a5342f46d8690d0a45aa4e9f639e93e3abc14b162b1bddfcd277f813578fd05a31eb87fd6c42eebf5eded1569bbb563087e2ef34b5c7599e933c60416692e6de83843e18330dc4986559a0d53044953d174f07cedc14da69fc43ea0e88a5a44ee88808bfaaff853aafb674d9894c739a178fc50e12ae4b9f0eaa3a26c6d1c81ec5a424540f0d748e3939ceec2f422d18a36125a7cd557ecdb44ccc54fc54504beb343f44a0c627e0c278002665ce7523af77da2ca598a7c4187c8ed0ff601ea7d4a432f107b5b3f9522b218e004e29265bae0313e1e0d35e43b650bf2b2d510feee566838d092c095c6f0f97d931b6a2021be569470a2e7a970b7ffc944cb14f53072ddd06c8769ddb65cc05d06c9fedc7793072d5706ce8238915c7046611bc1386ff0d183b1d0984af7d2a5d36177de7e3840442050ecc3e9ef2792f43a6e8e29357a1325b7a38910bde5f4367f986cf2c6f96913c54608dfb174832bf7d3cc075a05a422ecfe574b4ffe2df93e216e302a7b57ece0a48fe087930472bcd8b6e80966aeacaafeb3a647ecd43f1a3fee03f23f1244ff83d9b7a57284f57ccda37bc850ab553ce217579813170864d00d2fe1deb2d1f2a2a9ca686ca5e5cbfb1905fa90983b45af7cba7b2ddb03f656d3054418556f450c605484e0485874bdf284af13ba2d3d37757b980f16df8f0bf2d3e0f8d34cbed6d5f9b2e8d7e76a9be2ecf92affae90f18112f40a2f60f1755ca65b28359803d70fe21e80ae83d37b80e53e80b6072acbae06d06f2a141f7056c7cbb54149e4bfdc9b095af0334061f4b7462114c5aae6399e3b21d1243854863540c6ff87873628f304bd0671797dfe004ce5e28880ea1571992c902e2d405ba1821cd36816b8f4fea0ab8e510eb718b9c5f85f54b48aad2f21b396837bf174458541f32e5e543eeb3227fbcf0a3aff2c93391ba494e78ede5f4d8379a928836995e716849e11bc174eca4296263c0b6134acd05edaa113440ea31f13a14ef83c15e8ce3a55e3822045d4777bcb41df289cdf0bba6686434106204927d99a50c588c6d6006e39ae580d398571814e7872426ab1d2e9f15858ac3ffec3cf152e27d3d74430a9ec0b3127faa5f805117fb241201024f9db08b88189ee68e68ce7412eaaaa95e8bfc1dceb1f66db95df1b001678841959df3bb8978b4934b112d5baec91755f62772b41140e21d6f1683a2d3fe2a6a17147287de783f91cb2596d8347e194b4d44b0cddcecf359dfd5f5ca7386ae4249b5ac18806db952408df20717890f2c94aac01a3688c323be05ba6b09310df05327678c05ffc158c858fa6ba77ead6da9b137ec2faeacdeedcf484c2c3c1b810142fca563716aceefacf062f2c65167713f980a819e72d34a55d5b4fdb41a452e9fdb4fd2ec71df4c97e93ec0da45ebf6374f16893a3040a91770fb472feb631f62ea8c3e66801fff96a3f03fb51d43fea228fe5d8a878750dc1b819c27cc50b9de77a2e20dc9707e2ea2ba96671e8483fa7d3afccf4efcc1838f657fc5f156c1148bb3bbd53f03785123dceceff28abb5d21f14f898bb8de0c460098641d41dacf8bb7496aa273d78c08981225dab67ecffd12c7fc583b01c1e0d2ca3859bb7357d7f6cd4b5fd5a520757922caac06e21f3fe8485c4a223ca2758448da6c74a75c505af7150701902add48b50b99c40db8e1468d82c67587021708d49221845759aeaecb3b6a3b5aa4c4d42e1c32b49aa3c023fd632809b70b3521a9676996d59f28469cdb2d5a42606cf6a52e11d88c225321ac0fa4abf5d6fc55d45a25dd1d4810207e82399e77140a8900f8284de2f46b31b8e973a75801bf6ee0bee1d5a432b6ae470a0b612e54d258765479291e0de1ad6125c981bfafe21156d99bd5d4999bbac727af019f0ecd09189585fc41786d3c9e262199144fcb9541ec3a311dea58cc34bfd3d8cc547f01c64b8d2d0a5ddca808c93ac10b48cb589003c405ed7e444e26352024f709d9d78c04156070e0556ece1a16ec1dcf22c2bebcf5fd5507a8b5c713af7b4beb72f11eb95cc91d7bf24ba0994f1a20c0645fe0376e48d4e4d6d920f31b00775d9922a210275d6a8fbf72e0ef602239c092ffe5d497988d6cfd4e4d42d264362c86a722761340e1874935d02503c0701dff0038eaf0191137852207155e43bc57238ce311bdf9f8ce2eda408a0504cec8c091c5306cb3a8336fe3074c5b601e69f01950b4156873f0e30f75d6039222689f86b365c703c505c6bf1e7cd9129b5c9010606cc6aee17e661edb4bc0f9edfee73bb0d054baeb165cb3831899310c1182186c23fa25ad81ccdc3148e346cfb8f447a3ca974de8998d2cebafa5aa9e64ec2863091440ff914750e50c348a392eee2a8d0082096ff4d9b86250968183284774c718662375b59fddf3b1ef950961719c1eaa02c9b49967b2b44d0d5196bff8525584fb23432449764668c111f36fd65ef6efc5444147daf97e1df4dea364a8a34a0025e1dfa0f0455d93a7fcae9dc691c07bddc0a261bb1265f79ffefe72f8e6c622bf46b08ce632cb7d0cb3e059d23d7fd7fc6c22f20bc4ac8379b5e48d3cf23f57c7d7a313ca945143ff724857ee999d6ef419d45259ecdc3f91e6dec0ccd6700cb2daaf8fa67a62b11a202991e52a026c5c7432ff0bd5a6dbf45d4d15e6cd63097a4c59eb30f5fd52ecc1a84838131da2921c1acbc212e311f2e47ff57f4bff27175852d691c1e342921770161e88727db0c1963c25b62f6881c8b021ac1189eb5ba3561ec1c1a0bc1bdb6ea6f10e01cd8c3afa8eff771d0c2c5da41527c64aea2927bcb5482e15d73f209831ff36f0f7a072c11fa558eaf61939254774ad5b25142cb0b5ed3bcda2ccc3ad2066408a8118fa9d43290df9cb1af6516d964de669c09ec2ef894e17e92dc472122adab9291c9c0f79e9db2e4c4b497e36085bf20a8f134e2269b531f27f9842e956e81ca6db690cb95cfc3d66b8c6acf1365f52ec914e9089444e4aaa1a4d4f074472d4d9910e9c98efe013869221b84d952cfe10dc614954afb90d5dbb28278840b7fd2a660d59b4307e879b8c67273bc96a0e6afe561f6ff56653137436308cf52f58e0ae7013b0624eb305bc511181ca284bf5d1ae9e40924161524181455b31bf25005610ef44682f366fdf08af87c68a9238d7de23ac0382900eab3dc52039ce284723016a3c02a139b9eae506946ebf3bfebab396f68126f306ae987af86e09e0bb8d5134c33efe3d065a8d13458d3fb536f16dccecf110f22da7ac8a9704c09c255946ecd7a6a3f87a55abf3ccba323ed753686dafea37b8825cb4bb9d756860708c18c5a382fb4c6c4cfe6a83da3fbc59a4983b091dd61d02eb8c2c552ae5582520bf8af4e47d250ca5a00a895a7b547095b136cc8952af80f9ab3d65df80930a555773c2e9c22ad00f8444f7bc785b5438389e393a6eab57a5882388ffafdd6128b5261b224bb9bc090124b4007389756755f324c219d4624fa647bde248a4c0215638fbdb34274d66a9a924b23fd10ffc5c286242570e84fd5b50840a0392ac4061907e0212bed89f6fc7f7086b8cb6bf44fb228489cf0b5f6cdea3b84ace4c20a664dec814a7c0283c3b2ac67d7e9c464d15052b5e841ee32ed49e6878d2b3072b4eed1439b1c7f987985799c930816298924e2dc82be3b59ebe5015a7f496b3d9b27b8d697e13e80c30d964d2bd7ba031056ebe85437e4e6b3e667e28e2e022ff694007893d0c8e869a2175ac618b8d607908f6b9dae599c92bf1eafb9341905204577a802be031af384115d1539ece742cfbed4a70a4c94d81b81e1b0ecf9ee5efab3b7ce6b05b163b56a201e4da60a86c9f10cc6f9f62d750475cf590d52b260a58630293c397f638842271bf2bee12b67575dedbb8ed66ec4b96f3bb20b5b21f37e1d59385a69a45d25420aa4ac68d430ec48a306c3ccb5251f673c490d4292e2e075b4a4a90712dc779acdd1581c0aa5c3fc6c70ffb282de4fb26f7f7e2e4f6d4c47554037f0f7479ad862561230bf15e68389dfc95ad29e5c1b1d34a8329f9753db1c6e3c28d14443fb2414af21c62ee781ae6a70ed4e878c5231abd91f17f291efcd3248414730579059f0508d1019c75745fe42aa63cd47db14557fbf8ef63fd3079251c18ffe589db63254001f373c6a1dbb0cf243629dd206ba93ebee959d1657d67237fe6c4b86a44261bf95d732b92736d71f3301ea2a1cd441b79c07aa3f66eec938065679221104935ce9a46ac611548ae1d999a4e44075b259280380f05586a1aa24938a3c2e13a5755e7fd1b7c690772ed9dff867c231b6f8743ab673a82d255a97a1fc0654a0dbb595d2bb5d1474405af22f2202bb0f216ac962d194cfba2c33322453362c070bedeec3991e0092a329e278e64ff3d675046d171498e889a33ad38e8839b89f0790c2911224e0201255f4467245c5a8c8d63de78e924137fb681dbaf646e8dc441246b57a8a4b78601b3dc2948c289b8f45ed9d9e27b01137c211a549276bffa879ba437d9ba39dcd2979c4d05f99c106e131f4841b98c21d31b1401f1882de3e6db7b4ca50753202116656c3eddfb39f0be953230c69c1f223880e0dda349459e9b1e704d41823f5fb29bd980c929d2f04e99d6faf451c7aab4389dd04020c8af3c5bf29471b48938004142a45d9eb54e6858db32630f4728425e6499c2b871d29b8c2a1389206bac6a760a05486f798b530c520b2b61098fb1bd68712a2aa7e4b0075c51ab38403eac97fba55402194839a4ed62e043e39198fe6300bb3e40309e15c0940b5494fbdead82b786b9870b00ef8432e5724bc0bb18e26106ef53ca0a5094eb8e9c12a8bd794ea3c7abb36d200753ddcb80b6f77d58eefd693f58b1c62496c29d6240edf4d8915301fbd49a16123e22ed8e76bd04186ee64a481d65e6e100f01f391d2a109300f12b76b1bbee509061107c21714ca1d4ea069a9b0e7ec1e9f4b01ea1dac307fcbb885c2dc14cd7bad597bcde5e1b0656052ffa8b9281ad78e6b691aa46e7b8ca2cba0df332810cabb0053c99e56fafe8a487ef55de6082bbcc076ce4176cc6c3f11b05992c9e99875bff1eaf06f008be28af7b7533713d1895d7a04b317babbca7951e5a05a8c75bfdced2d9aa9e70145109bc8134bad5e72daaecf13cbe17765b930e86e62b53e912eb679374773f56524cc22c19190ec3e64b01ef2491daff905530ab1beb268eb3b6ac01703c2f1629d30af91b9a6470523bbd33a0fc23ce72b94342f20590e6276f176b4b088af251ea71a3fcb80c38d2d15c0845dcf5937dd451b2832112e07511914edf6858fed54217f612112c6d6f07e644906fad5268f4157f88489c66e6877c041c5fc1478d66dbb7b5e0f1ec84aa7c0d2a40c32e9670f4c91ae99b8a9434ce5ecd99c2abfcf72114c70572580ec169ee1d4bf4699da0df6f721b694d6c8258844405407830855e1245a21f1d5cd1ffe3d9043311f5bb5ecd4117f779a42502849519d679e39eeaa40d07394b3ce940074cd6027aac09d0e62566def9f96079540b7cabc915536c8a89ba5b3b45a883d0644bddd1e2cae167707fec27a5087f11aa10be95dd10723af2626110ccef77d9f730baadd88f55f8375ac31cd69e989dd7bb1b9836aa30495ab1e6889f96de46f46016e81e89331a60253e2fee10d5288cdd9af3e8f9223bc99e1d5a1dde7fde824cb330960bac3f7d42f562a0cd3f0973b286f0dc0df07278abb7cfc9aab005b5c8301ee404818d91c2b0d546985969ad14c1f4c078070d9fcf391be7c88b9df191732ca5c1bc0330be17713be52794011957d87f1993a4c8c58ad3a1dc4d06288bbe208b41e8efbe5fd0abfbeda346fcc65342fb80958572d9e16ab2c6eebd3bb6f876d2de329f684accfe54dba1b75469c8dad234ecf6a710da116cbc8eb510022f9895354efbd8bad1a29312b626cda109a2773cb8cac0b066fd9d683a078d239a509ec1cb7ee777d80566bc1f1bedc9e8e1d1d35484df7a0f3596eb659e2a9aca9ea2e05bf31555f30fb52c8796c32d4ec0795334c8e3a655d3cfcd6a7e13f0cd03e6628274d0bba71477a312bf226f05db0a6fd0847e642055b0309fd1cf9c9c070d2ada0f66804eaf19c79506c599b5cee2b01b06c6a4639c9aa9150ff36bdb1ad502517c8f43de4797010d76c460165f8e4ac4334d5b958fef6c97de414c0b1e4e8407e0665394161eec9f85cc4a69830cd18a18426ec84123f45b29e05cea248040d7398002a476292b584d6017996c6e4e0e21222e476f27049678132a4deb498263fe436664a1e6207a09e171df10ed1e0e85e99aa0162777d153956aa20774205d16acfcd17c195619a53507d24d64bad8b445f7eddf446055160bdbeceb5429f03d6b063c37c2b5e170ad1cab69666573aede64117ab5e55c279c012e8ec7a00b778bd832006e2d31adc0166b50026e730af836310e4803cf2916ddd719755145d163613bd9c1139cd5d5fae3450a71c149e4b61eb93d824ef977cdf64bd3b14ee36cbbf7586c285d118a161980d8a0cca177700a48c41330971a9ea056026b6e5328ea36bae1b36425ed0de9e263ce1e96f3d9bee033ca95e8122b214ad10105f570ce13b0cbd25daaca9102df2ad4cdbff37aa970ca9c2a81a1c10c92ba2f1b63c2df37764cb8be90450b62f85c67ba3b44a20747b2b64f63f73319bdf5c45b861aabc9dda817bf72eb892878d880cfc149c3dc9ac63d531f7788620da7dbb0f8dfe0790c03e90bfb56ed809db3a4edabc0125f7a92080b5024e7fe7d33600b4bec86e89c5b4a04d041ec40bfec9572650dc0bfa962abe7327461b63aa578e133a308548c623f4308ee06391ca5d5e85baea747bbbd643537f9b46aee7ebf534b206e0b1fee8dfd55c9c1a7650ec90ee9ddd07ab2a3c2e835975d61d6f875fdcfa5e9e0dd52af69200a6d0567feecefa47b9635e588e15cacc1cb44d8a29872aac69af2f6241b810604ac4650e04933bfd806807b9d00925d33a36b86f3ea05832818f44468f3809429f74609c3396a23aebcc780d30dda4b36b3379893eb34c10779cd255ef154e1ae021efc62ce0595d91b991facfc12612494e163e6e50aa395006feef917beb4102c469d217a5ea10f4b4501b0fd0599e269a497fc341f581c6850deb2fc2766d8903cd28d98eb41f73f460607b165ce43ca6435fc1f091f0c5bc7179ceed48c7a6ee1c70cafb11a73336aa6a522a5ab6d743a2a2675d1662c81006655f24607a950afa4a21c22eb7b76711fe4662eb1533c78d2470e8bc350b2d64c413935b689dee9d0abc70f3802fffd0cd0771da4b299d9b6f29c191a8517acadf5aa165fe178f966848cb0c37502d33c69da5f0b2ee38ef0f19bda4a529136b9a3b1d0ff48f4c5afa43f54ccba983eedd8f7e222ad08fb70b7f345db65803aa9ce574f675216982ffd120fddfff9d3e7ee52d0d15a1d86b430043407c1db2435ab32c430bd48db0b1d82f2157c06580cb9a6b816ae6cb90901e0c50923e2c29ef90944a970172b7a29744a648cd0747e6655fa5dea800a6c1b0bee2f6e76dacb8748342ef43b194f47ad1af801a1b36903fd32944804017068597b04f987f3e701df881ec3abf2c6313eec195e12c823eebdb9637e9bfdf8f6f5cf9885957747ba1b65e0f43d24af7fe664ab6d10b66cb255bb1a31114be0f869a873ab4bc0c221ebc377ed36fc51a61ce7b766fb944deead50c2c20e97fe04e759c7c372396d81d689c508ed714d93f6a877108f0b7ff520a7509762d2a15cb3265dc1960047be0150a70fa4efa708a7496ac6d43ba8ece64bb4bdb3e2ec7d6b235fdced33689bc0965e9698b7054eaf76eee59478390e739dc10640c5955b4afb21d3edb841d27da1c3aab857f1d524845766fcc3609f0a1cbadcdfcfd36adade12fdb1d1ff4c7e34ca23ae3eb4d3a8a30db1574459ff1144040decbc4a49ee7795ad3f9280d7068194d989e3b992cc6ec8d79e6e064a895c2340c66be9892bb85235a895779b85577b85e09acbd8672b0338e547a639e257df09f0a7749d4e97fd5e1293e3c6247b8f7c5ece5cc062be9f31b9540b94eb307fbcf2b3618255ec8c17416dfa31fa9f5e33149d03a9e41908dd7f98a321f2350e93e63111e42391a6a41e1c4d2ae8b9a629279be6327c2425217267be2c581f9ecf280d80859024e581995b01bdf5e19ba834932ba5cc463b4269d9983d6a806178682a4256dd8a301dd90d03890ebd216460220b98546f6eeda6fbb232b8451e542e9f27cc5046d1c5b98e90a5310728549c9651293dac22d64683e16b48455b8efba1c3496d7462f40847410178e651e6c3ba80d5d47b0ee727e74fff2480c63a8d3ffc67fcbff2479f301d8558c97fc8e3db46c6ec8a959790128841aa9decf4516693aaa468867a2c53529925ac3150396d7ceaa30a1dc6af12af46a85b187e41e5d6ad3eb7667b8cd0fe2a6d15dea335bb171a64b3615bdadc7d87b1587288e68c0865ded419fa5fe4065ee94ea8b9341302228da5701725c558684b3052aad1458990117f30f63938961d506bf5ac2d26efe7349757c623471d0feae9e4e625a70f318375930b5c4fd6d414d5442893f38178d2681f8a9cc2442e38d9c002d74479ee0e9f2cd3fa08348c06d8c00e40700136840c253b1bdfd260a5bc5ff57410053a427a3fc645c4260d0eb9a088b66b4d34a629428359afe0d4473d3c7af57d35f0d5359e89ef4f165e32f26c197c6a5ce2d8000c0ab9e57723880594bcea21a97ab739bf3b51cb6e12b694cbb2b4152b183de251191edcc9a7f29eb9df863622d1ce7b4cb1527f5ed23cfcce63c84d1ebb3ea5d5378814b508d48878a6b94d379991510b8218dbd783086f0b64b966fdf94168b5017f67da84e317d910dad6ad0d0e2f0165e1eceb66b62194c28bd178c291c1c1c32df3e51d1cf34bac3eb119f20bbe0dfcabaca83a2509ba1b0a2ae56b789fd4ec1b6a0164d7ac60262888af5e24e5e8d095ee7aeab6ee9f403f77a8311af9fbc9a44d9f20d22ff4259f38b3709f8d70a9a5fba69832a5bc83708b8d40acd55ba01e576cebc19fef5b3caa5c5e0c727c235fd998e1113c62fd681f64983620ef4527330476514b864d69020d8125531a854458147c2fe6bd5cbcdad6cc1e7f6e3864e49fc03c6bc0332d5e0890758361c6ed0d697cd9616e506a14dda81e1db672ab3b559ed7ab3387de56605859fa0cc032cb7569bd776f75c099e820c916fcdc718bf5864e669d521fa36f919124d74c7e3d696016b8a43590767370520b66e9dcaeff41efc1d5d65e9b78cdc9b109758f847e70e20bfc42d1e99bdbe66db17c5511cb0d84976002852828ed8590fc6339a6e0c4500dc575c6c583de821dd780fe05f2fd3fc8437be1dc3f6d85eee5983aa45e2e3f5cb845349988612f8621c44f78da5b9771f0a15dd5023943fe94751f3f56b912ed11647c66f53ce4b89a9362cef4bfde2a37ba189fe4232500e247982970d7daa0da68c15908ced073c182ac3ad95444710058ea31f31747ca2066814b691c2dc217652f483d63770c7f104944ceb5366e763472a58dbf968dcf997867d9228eee52841e860ffbda8553a226353b3d0fd8dad06804818440d97676bc2862cefa46b7e91967383da4124679263524991a01aed18ce606a9fc6b6de9c3634fd8a31e6c1b4546a748e8342759319777e32b29ebf9ae006b4e4899c6dea6eec3a51fed851f8665fe169988785093b42414800236f315acc1b97584b5f2da25c46d0e3e2fdea15e2f4f0054a5f649d328d24707b0552c19579442b4ee294f027ad77d87716b8bed9983ad7448cd903b50178a9a49a597ff65f650ab21b707c227c18fa28aa171da41f2e0c31e7d0c24560ff90400e470d0520f6caa63c67c4073c8c7c5f3d3442c8048b1589a16ad5d100288240a2498c5d424006b1696d0c954e5a70a4707191bc176475b902901cbe6ca211867f1f3483dbec36118e3ee5c56a76d3652ff0161d7563634d7637cec11c33a2519ac6a4bc8a639ea27c187e9366f64009078c5df090e91a15ba5c19a4a627b981972e9db1ae1a2fbd6cf7a70ba18c9a8b83863730e67fbd1de86e82d976bca9ccc172df561757999e8d94954eb49855c4a652a568735b91d36d85abf7f7a678abd7466de75319dd3a4c6bad2accb791dd4f5888436bfb8ef464997bfee42f2124759218f09172ca463406e330ca173995e47e7511ca8c7165657505b2365ce815512953365ecc79ff6439a54c22712b4f25f29b6c88e10c83d6d7a85546fe56c23f250ac3d80e8ed0bc62b377f8e139cefca57e6bcf30d77c9acc078178e69f35f6f9d2391e1f80fbe2c2f347dcdbe2f9495a00bc195db9d950f78572dee7497d0cc8d0acd23a4b4f735c635cd505922aada8a83788996751f08a9a3a1fb8ba691bd84e0d6acaca5799881068220a28d9a6f31577a3c2005cdda0a0595619cb5872a2b7947c54ffd9b2f96e89d2feff5690cedaade5fe29a88b6a541e2f50e2151a40543bd4ff432d1e4dc56f845523575ee96ba00a99eb3cf2f618f8576db5e68ff714078f33f93f37479100b8fedb9e268c37980ec616f51ec71220ac81702f3c236291ae9c7240d71dcc4942c80b0a13f594e7faf1411dfff5b3213845adc0a16bba44be02344f2615f217c6a044b14a8d5f4548c9a1199958577ee15acd6033f3b279eb8a4787d13a56b2d04ef11274115ca4012889a17ee1009ec9c1193a2ca8510a6c4a22a39b5255921992ba4b6d0778c612e8deae650a986f8e0fadbb8e5628dd0003135e0b8ac15360c448dc6006018cb1d4656a4ff1f95743ddc1102d9f4807f902e3e5dabf588f42d568ab48fbbbf28b9a1833ded1d05156d309011a3e5286fdd9663ba39be0125d0a35343216bc288d4126f049835816309b68cb907889c79712ca231bb795fee2551695d482b79daea0d1d46a83e8abe88e50a6f6e807ccf556a2b92b0c9433e1bcfe857db72e3a2b021fabd19cd49571b8e1f57f92a3fb3f27c7c13b24aacb008efd519ac897f8db6a87cab8d463495919e36e7a114c6fef57a727732256f02687d80dea31722e620f267089c4d09f312a1e0affff8f3700afe671bfa2ca9fddddd12d2643f1fab15cc868d6211feb79f60412616693b6e624f8bcdce65f7c7260f8049c34cc097170d14d4f3efc920d38832af796fbf84a0776b971ec0657c7fec7f834390841f302fcf548382f6d9705391a54f0acc5e0837a89e756334a2418586573940739806c3c10b38238475cac8f9ad971a073c8a11409eec3c42168df19b9a2002d4b1644000e17773b22a1c8aad871157b16a2de4f12c1d5aa04f59ddcffcebe21d5800a120534a60db143550cc0546ce59e93602c6f9aa3e001c51b32f3e4834f344ce3a5322dd29e7b844a18abb6cda188669aa09549abdddec78374c0d6dee8602543ca7bcb2ae28b241ff821fedb06275f1e65838711870fd1d8b7425e851bf351a4a72fbe7166d0a1f837d3feb2ebbac25a06d0fd1fd91bf5d31451195d58273883d9335581e8cf519fad035d8f6663d2dae4f8e5846c8c627f9fc65d33b8371f68000cebd456771d7cc4ad4b2117867aeb11ab07c6b59b02234cd6434c79457e35b94fe68d22756f75b18c93a8d5da918266601708cccd4170443242b97992865dfdd5f16ab232f21d3fe9b4670711f1b49b7804c3a6b18916256bbc2fb0e2e6ee594a5961b470e2f20b6e060ac164ded6153ced4a35a690c92fbecaeb41e5a9372f8d57f7d435775adbf3ba15775da30903a300b10599918933dc1ed8ec022e32a1601571ce255ef3cf6725cfa3d24a73785eb6037a6d5f9df44ce94da578f07ce03eac1f85ac125db8babe10c79aa827c70a8a16ce5e3e5977fa8581e109107c98f349bb2bebd66a086f629305f406deb24025f875281c7e44ac6d63f31f21e6a8c389bf3b0c5b20d1a4225de40e09f0631537bbca7f2ec280a41573523f54c3a0f7fe570791aee29b0be6d1b01389f4ddf78b8159197adcb59bc7f8ff24bd6aedb19883b8b84d14ee62e8a9d59eb9fa5a6043456bee74b7487940587b0a69ca09e4c2f2d8768c8439542b33e2920d85a794f6d7937e12c4b9f88d52b49b1a1185306b1e4099a576c840ddd0ab977e63afa91c1fb251d6001e12462e28aeac3f620018f6c3887c01380376589ee955f06185a1eb63219b10baf95c8c683e599766479c0cca6a7f657e9f76986529428903c4a00b8a2e93c12fa0529c919e9e51d4101d147d53f5836d5d65a7ec5fdf628a153089fcf4a929f1cd707738ea239c19259c211036be99b9a87acf9ea0c3cd39dadefcaae6dcfedfa42dfa60e15940a48ba8f23f363b3360b84ded014cacf3aea02c0f084434ca0ab7338f6615d308cbaf0e1816dd51494c33f669d1f491ca5b54958b1516aa8103accec3d2b8e6dceed91c52f93e34acb28e9ad8423c8ef44c1c403649d12c93c5bde8073c6f6cd799b4ed480cfa713e8b62e862ad70bfa01065164a45af4f5768951da84e4db9289033cbfc1926a264aca01a1911e72c94470a0664cc21900bdd132808ac681ca3f38a7b30fe179e5cefdce5385b1db822ea024749b52386f2c74782765efb4c33032c34e8756b72695c5b10b44fe371061992e0bbda8c94bfa300b846312d2a6bce67c998904a4e4627a160613ccbc59571e4576747dbc60ebeac63cc02d04392d291054b310b096dd1e8d01a948a46f2236de118489caa692aaef85d918d401596521678cbcceb27bcc6817bc8c574d58c6c408c09c3a9ed02f0d8930f0d96ac05de1f6f8b9fa0610ef1d21c24b82707c2bef3b24ffa19914e9884171d752a471d53662a5e9b98c4fb5b6ae24f52eb8a67a360ac82e6853a6c803309fa447f3e08f21d561d5de776e325fa986c6a7ca6c4f8c9f29c8099f04e7ed6c8d799099faf8276ff2f05f25076e86e66ce23470a562971d6151dc7c5aab009a9bb06b98ba83875abce5449488048564342f7891dc0141eb0fd34dac37c8e3cd1cf92e35dc7a6bb6eed01f6c57b4ceb29588647e14e2c6ed2a88d241041fdc22e7c8a0137b02048ec15c59bb5c06d28c40d76d52d25a2dea0e248bda00e67c4893ae271312d4746adaf615125dc865dd57e0a9d9a639dd4bb15651364f5ce26bc2bcab8f3af351527a90b58df60e2d563345dad452c8bdab43f27cac08444a62eaba8a89721d2e9bd973e981ed1c18fafb4fc3c1aa98afddcf537b7fb2eccfaad2bf80fd2b00eb60b131b6a9bc14f252b7426c0ae5f82e3a97b28a245f08965329ded6566763665c7a9a9b4a14e69c291df92309474e3bb88ecc2b677b53188d8b34785de6d83d7b112aba9178c7dd2223b11fcddd0bdff486b1303fd8d9a7a36fb1ab9c86a808d16eeffaae9f32d03c4ac391445733a42b31aa9197d5c6f8dce0363a586302d1c1b4c77ba6adb49e6d8497949563478b493d8c929180cdb3c691271937e225a87a422bb164efb4de842977d5d6318a7d5b828d51db40543be1eff6c64032adb2c8879c2666129d1c6260e528cb980a8f911009a0321f7128cf728090755c53bc7d059b62a7dcba842cd3810f8bb46b71d6721a9687088104d2494f437855b4e4a9b687bb8672253de8e1f75c929673d9f57de89fdcc2549f661c5e1a0003a66dbb3a54fa8898d76894f9e4bb54a4bf654037739bf835fc029575478c23e2d6c2688e221bc49a3da096bd923d50f35a8ad603ed4f944259f84629e5b4572f8c7a94966ed84a71a2d7a9c80575dde1ce9e52c193fe9a93363cfcbafe620cab58b79ea0beed7fbcd5eb1b738762c68fa74f0a64cde2cf0c98deb7a212b9824a0c280d38a04e6fe8091552d03ab5b598b2ba685f48b8b74de5d614017b5b9a50dfbeb0b8de7884159f9b8082f4bb18661b2219b306971340c8d5f5dac5786e1b4b3da1b9c72dd1095fff4e796425c89d9e6d29f224ba480646b1e17977239fee18c44be840eca92b38d865abd62e27a93eb09aead6ed92308565f74cbb6cfb71befbe181ba43b6cf5314d997f8af55d7d5536be98fe6638e35fa85b3670628042dd5bca031e3a321a6634c2b165d7e432420725447a6a16a3f5e44c9da02ea87eecaf4f6a3e716034a4e4b206ed26449241622200b99883f73b92cf7d01725dafca41b405fa07c506df97443b73ba054e572ff6e4128dcd00f081aade9aa64eebd71a367150c3c79fa5efd3a1c855ec5620abdb4377434b48804c4086c148c486abf0905358ae670b653b7f17f6ec53e1411fb73067c5bc2c5d49d7f4e9b413de0f4166fd90b1a2033f7f407d0c0b3a832ab1bf111de5c42a1f9b98fe40b95fe2935a1b5b1b6e0cfeda4abfc93c46b06802a66decaf47d1bae0de003ee39cbc04672e11f04c255616b6bc8e9572a1c7388ec9c165346e223209d49e0964437a0c34c094150c4a567f821c9729c6be15fb36d0df9608f204cb262a1e42324013169bedcd00d8fe697a6f1c25b46bb31edc5dacd03658ed5720ca7090e8e005a2de6e196a01f6e28f49116e740c3a509963a895a323b311360198e9181d48fe208406c4db8092cf283514df915d49dd8b02aa1a080cc05c59fe33da2ede5a899f6e2199f30587ab6b056b5fdf2497f294025d299d1723eb1f7d2c282c5a7118b0cbcda8726811dc18bdfe993666ea5bf6ae583cd5a337d9de54a514986a3409c5ca64f828f288d000af690a40be6d6dc0eac20724c229e17dfcdb838a69ea601885a48e24c0f70bd6affbc4560ce22f2700efcca904ef991079aa43214f8acb9882ab8bcb29db4780ba81728087c6fcd0ecb07ffbf18e7dc124a839f6c689eddbcb06e1fe81bac97d6b1ee2485b0a8a816a27804dc9ba220e611e7285ec66b340f5b3471d28e5929b366988d786ebf059a7d99cda276a3d392c61907c9d44ea8d64fe422209bee222a1c2006fb2a2964891548f465a61ab0c4de1dd9470651fcc10848dc1d8dd128d204ec3fafaa4d30cd91a008aa502de39c74a1e838b0e89e86a87de4d042c5fcadf1b6056cd5b6f9f251abd0e88b036eb0ced36d2064ba86123c7d416ce2255b12385d6c3935048df0637c49566422223dfef49b3fd163217c55f99fa0a108289997ef04246748bcdbd3fd1674fd5e1b7e9c4b5c61aa0861efa95071d8de91f6a0802138f36b4a0ee2463876413fe4f4d491d4be14379fe231045e97e7b4f27620f62f2657be503f08c0cccefae3467d9605a46fa1d8e2af0544968b5c1e4449724de76ae31a8ab890cb9a80194ae150e8dc3c55980c0f40a4571e78288acf364a05354f6ee480b80cfa4cd428785121694113174a80c681c5229d47818c4d218482c3dfe5f89652734b407b82d23f7a7cebd5b6267f9ee22341c74a693f092e12418641fc028ce1217727f71ef6e31adb14155045ed1214602687458c55210adb0f4934481fb811b102948375c2ba8783d176aa9a11d161e245e6644d092bb46ac894a675107ead055fb9096617c13991573271fdfa355552e1ec95550ba45d817efe8511957713ed70ae034a1078737f009c3218ee7959871bb372e4760ee97ec3c83286b468d11e805b6af078bcc35cdb4ee4e07e895334cdfa3fbcf0d78a27db3200dbe145f7e253f6d0c32cb6e413f018c12c0da98e545ca849ca84fafa382cc0c436fa2423de2c3eab11a50e23b152b0fb0197008b3fac238638758528ae083ff5afff36682c5d9970e05a7a83cdbf5a83349e7d3aeaf859661cda3c999c69e002b3534ad59c4992754ca4824ca7cd36ee182a25a5537c3f6e5f2cc9ed8c3c9206fea7092871e2b52e45ddcb2d86de6f874f6eed2bdab014fdf677ab4ab37e9e22d8fb4f9a0a052a5382e2ced1edfab887dec0728a0f2d9d7c5a4216990f92cbfbe37a4f0816f6fa75b7df062ecdaf585f3f9488f7d3fa97bdd89fbc3b65d8a617060828ad80f893c9b2a96e0da29954870d8e3f6fbf4c6904a0ba3d00cb7996c4e8356bf29d16e3334cadec72cf53608f3d6bb4a0d688530494e77acc26933d41f78d8a61052ca0b120b58b4ae1d3faed5b0322d4401ed0fa3f124493f4f242bc4ff0abac6b81821f07f11ff4704b9fbfa7e74c00b111ebd842663571700417e88ae6daf24b8e8bf3b4d65230211116aff60c1b5706aec2994f933ec50a3a14872bcfa74cbab8f2a3eb18144c33aaa0f296c77b8e9b8e045e854d3ce0bb6e568de5c76d895f900c939deccfae01b2930cc07ff5a40790f84fc9a181886a1b8e3bfee4a930fc85edd6d359ffccf72b0ca12397796b5111b8dd8835960a37616ae495f81641c0c439324267efd91b24292a9fcfc51bbd6e79bb8f8e9d7b6a4f559400b9dd7f79abdace272be4df894f94e8cdae5ccf580b6e8678005488592ac3ccb98d365d8ae4bd501e65bbc112d7e43638976e74ecef6f3b88ae6027fd1ab50f020bbc7fa84e51419dba62e3968e0198f3a4753f78f2177515205a84280df3ef8882582492b1b0f11fc8091797dbba92870311d38f1b2d34fb86d4a9f0075ad8483a17cc4a72285032ece3b237427b0da056a2da0d917a8a16a702050c1c996777542fe78bf374da0abd4c18ff82b6e479faf812251e5d436187cf44e9b833035a539804859e7706e608265039f380b72afa58fe5ad0b6bc9fdb592c7d2c63f5913b98e9a0d8bcb0c3949553b5f1e96f6a474bfcf0b43a91fa4bb6d5822b9045081cb19d20927dbeeedd19a55df15c8b3327c98b51ce0905348093dfa8bf1f38d8413ea85e9b746decce7864318d258b0d118fbf398155e83408d8c19d8b2b2983288a85b56e9641362ebf765089892cd577aac8d51e09093a98e2e2b00561267dfc2dec2e450eccd7001577dcae3bc3fe5e375aafaa480317810d9e8f75e9e78f90232dd448ff067c41952c89d486760924734326e34679d9c74e0d6d51bbe11f17289f7dcf8f40fee4e5fc5ae9246a599d1187894b43601603c5ab159f49f4a429b41e88ee358b9418fc14607dd410823bc5633ff7d460126cb4b0cacc06e552b6d35fdeb09b4691500e09d8530edc5422e85c07911cc3b740bd4b57379b8833f07fba401d4499138c41d739ed82b5447d18ba23cf877f086576c071f61c68f02dccd4ca9d2e11aeb554c106f34be6b0add37fc3f3efa0ae63e2e35eaa6603a08613e8127204c0f0207842e8c026a3e22f9a8708941b722033bffbb6d5037191c5fc29bb5818a5a24e1bc01f832dea20c89d491e1c6df9c5723fca45d8592b6bac4ac44e1bd572fc99ba521e2408241886a04e0f2bf8cc0538187e711d98a92212901d14e41a406dd156ca2a0573f4e14e33841c26dd815be56fc09fcffd2db56478104de981b046291f57b314a3e09b3a111a060b85787f9e0acbe9072bb40de03c4eac9250b48dfa3296c11b6c3e0008b25d7f0463d1260144836c05d471bbe2941264d1a986899e003b25bd894eba43605d637ca06c1bfb2f72af75fc81d19fa035084c4590ec866ca067a22d19082a7e6d23618ec1f95b551fd774ed73da15d0b57d2dd5b31d50d81849930f790619c96ee403f5552d8661d4177cad158ed2d75ee38c928ff8b3f585df0104cbc9ceaec6146a51cf286b0994f21c04509e2296334403602f4081008a8dacee6a01f2fcba638c40c42d3edd70a3c247536a7ad649159454c0f3175ec319aeffd8438102b58d825ab1d8676117951a653d537be717a1c04d458f72244a90eb7baaa2c686baf3aaec014d63c2840462ade00f4e6c9994dbd50df0372ab546455ed2bb1e6e113d46d2f6ff449921e49652856eec9ebcbc3c7515f82838e539981740a015c57397f59f94caec6070c3612fbd789d05aba5184762179f4bfc813e148799753ef189b1ae8ebdea0b9c88b19384c48acd00d71288c0a0a1a6b3da2334a5580f1b8cb8afe8dad0bed2223b6cc8276ce95673c58d33bea2ddc46283a7d596d86ca2630255cf7e532b977ae6be94684f1206141c676f1b11b694eda6cdc54505d45993b08ca9b600235b1de45352e95a59d4c2a8e735d16a8c8894ec632c9a6584a13b3812afaebab1ddb590ad218830b1baf5e725ed9609ee60930170b8fd27ab7a59e4696db7829479440869edff56ce90b676a31471709f44096261295a3d63607168d578897efe3fe5efdfb02fc796667734cca7285f78bb8956de38cc686556fd34b4ac3c8bd9606661b082d41452e69dd7c6f77fccc7c0021906cd99be4dd500f37cd6c9f9d86c6479f45f65c7398b76207f1b784df3c008db811b93a9047272c8db42a701c4d8815483b6fb1ccea2ef4dd2207598efa62aad660f269b4063c2b97508a81b3d4919e1c9f8917bdadd84b11eb15cbb2d3984c36adb0ef06124dd705b7e5d27c33d596cdab833903f0c3b0fc3c4dd7ad717886be0d46c4535d972654e03aa8d23b82d7f2a66f48d02a8af2aa3593a2d6ef3c12039a732a8972ba246e28281353f04d4dfd7e9561260c5a19ba82bc49969bbe783ab741a88c9b16862c188f7dd57b8aac99dfab50421078c0aa5d167c08c6ff4ab55a6373ba67ff896d791511ec76f98ea501270f397ca81e0a6753c57e7f327d70ecf880c0fb9c7d51ef2773cd410dc903828f49f32739ce6f0e8a7a77eb0d67458b31e0ba12f5fa63148238e139b711fb7c8fdb650995a8f0985ca09d2e6f14c3a02223fe938dae7a7c855111189bfc52a4daa8b0741d5b4016bf3ccebc19423f62c8bec7aa149fac6aa15ea8607eab9cdfb259da3c0eae6d53ded9b8e13dd6b62288a829ad287f20525c8614263efb3e3ff982941ab2914c47b7482e766ca08ecd5415947fa27a44a2aa30462c65829080f9ed690c70e1a5b4afa5f6329c4c4452aa7fd24fe17cb945d7e5feb95e280c904876bf5d8f9c7d28f65d8fb97d16c48020b3c045207b6dac6fa7777f0b917c64052e0cd4b27f44244f9bc64e626f0eedc74a7f1ec62889efb6bc1ff3242f84b4d9c365e89b80aa08628abd408377227138e4871397eb8a028f8396d17e38c6f1ffe2deb6f0f73846ccb5ed0a5493648662666d53874571e5c12d83efdb5b3d3127e5c83d9b19516e415391e3d0a275396c5118e14680e9c9c15ffa07c61ec6d3ee777daaa27157fb025ea3b3e072ae26eeb687835088f6a373dfa06758d4219dd12ae59b7be3cd6ab64c21505c0db97f6e1a6c557ebb0772bbb3d5a47400f097de9706c9418a5c99d05a2edbcda02f7478fdd2c3aa49a41bb5791754f1f982a09241f49b4a56a18d4cccabea2e88da1f965436c246b4cc1654a46ee234fee30df17b2e91348acb88503df1c523c50b563080c74052980144f4ca21d2214b46c79e84a6e7deae04d79ce2fadacad5e624920f4bc5e1e766624626665222ce27a9d0c3ab8706a9fc73ca8aa0156f81e9e62a5a95b90c2df653a1d71f50a77982eeeac19c798018d889a3104a8cc8ecb390c804fe458ec040463671e7c6464fbda8501ae5eb0749c2f64c802cefb1f9d0d761041f107614df4321499db6278cdfc08a03a723e9b56e8f4f188801bba71e00dc8379c507011b3f9bb1be46f0e3448dedfbea6c8fd7e2c6062a5e3dfc4c28c6aaca8186496661ef9d6b3dbb384594f2b05ea296a3db956ce2f0c59890d0a29ba5b4746155f3f3f2968868678ad8513c40062845eccac8a71da67e9e09afccb7e47ee6fe59ee32eb41c1a61d9988f5d788225b34e07d6a13de3cbeb34d7044a37d5de9d9b8bf075c9607076b25054bc85a46286f6b8861028ba629a696a9288d4157c46530b32ae2d97abd417a85f4c5049b541ae6ca84d63264e0af5bd59f09c2f8a1effbaeb5ed79e2e82f2117378459bccec6db9d653857eee7b6682abc37cc8eb3c8b1026218636de6b33d27fa7c0a8e956d119374a08468326d40ef21b1329933b8e6758f8382cb21a4a057c7338693aa77a76b84aa141747012bbcb3a0e69daf7921633ae350df6103c51c6e992c9da1edd8adc5dcbc0d50b5d3c6df981eed3461c36dc351c796586255ccc911031064f8c63b9114229ef409f8a883583375dd56a941669ac001aa00d692993a2195d883f85fe5ac465fe0295ace15fa4184ce2b38017b838a6083e02d0966869e24303d4776e6fd3dba85f1323835a17ffe31af18b763929f967c5ca44864a13c430ba5f215d8fe3d861c29d56ff0b4a9b4d92dfead1f7461198295d72b27c52e9ce2f03e169632027d63d578ce51fd23e4857b4f9726cee571919542d2bde8992bd6ffb9421288bd2d1cfc7f35fc72ab0348f1f07ce36a72440ac32691188dc7d954e440208b77c9a9628bd48b2d3705b1f9b4fb0c3edfc1e2a99650afbf974bd7832a36320a95147e434e3a56cbe361bb07f08d4ca80ce9e80553f0b86bdf2cedfe578cc30f1158d4d9ac444afab1a3790b8de80f9f017a14227d3748061e3fc78be049765a949079625dbd91e73a78e5aa386590e9b0170b9c9b171bc70a90f14f416d508b25428ac1fb21740e58ececb8616324dd0ef2085f7712240d106a48b3b21c33e25bc97fc4b0ff334b6df32638f32f9def052e0b9be0062bb5917ced73eada32f8af2676527f68a5dc51ea0052bc258ffd2c93a86d99f34ff6e4711d08b6259cf909d58a9034de4f0bc588f0ca040f58714d4423adf572885b2cc98b6ec69ee9e90c64e50e306ed25fce71a830ba40d2ba2701877e6964568e05a3a83359cfd30209ad433f1b668f89e0810e45d71942ab1a4aec8c91090e6768d46237f48ab89f21ad8607c5c1e6cdbae9a1070173065a717221732e27b957954cfbd6652a13fd312688829b8ab1dd7decd5384941100c2bad37712341ee3ee1dc1b6c89d523c75b062338af76e672948d854d168a5c3d8622cbd3181899cc9b59a840ca40517ff9450d7c5029af5a46d73c41a869e81eb8520a63faaff5360adc79bb4db1138c4a4b306a062cc896a825531df9eed4369be73f23aaf06585520060e528ae2eae3425d9c115714b4d87fcb3011d1b1d7cea0c230c24af960e4668a128bea5d0cbdacaeeaf34d0f1c48c460adaaaa90fa8e881f006b5638c220321691a9e561813ff763993da29485e2493cf94b05422e5daa669a86c6ae25edba6fd5f98326616201249a49ec293b4fe8cd3901962a82310358f7e0a17e48bbd8053b60933a8934b857a84cb10918848efb4560797636dc735d0c1e879f071e76ca2d769ffdb884105718621313a2a0e042b7270472a6efb6ff595b3cb3554516cb4f894268e994dadc94d66a6052a7932a8dc5f0e4d092c322f49121a53ae233d43fdbfc04b091a98352168e8d4f3c85bccd57186bc3ece607365edf7b591b63d6000b4174f989298a876e1ee12504a15b24befc2ba88f49fb1e8f6ab00e5ec32e8e47418f8a4a4b8ed76352fe30132f3945694e5a2a74c5405fdbed1ebced692b3bde3f0603cdc8760498db45b338dd4649a27b04b1f1a174f168288f668635328895975c95b4ab6560610d8dfb1bcb1184ac8787fadeb1a4ba5e643042ddf39f6832cf6b2b0c53bacea3bcf19bf59ba58d1012f6a97b2374c0874179771ebc39c272b1a4b509127c55c6ca1920ef8de482f82b89fd4e788539ab47324040f21e21cdb1d03a42c979b684b7d8e5e519165e758e190ca6ea632d118d2742e6adc0c53c12839523412328a86f76ff9290c200c69a2bf17826c0f49b32e9e442364c434cc95a42bf90b8e1d95f451f4b1492638f4fa8846d4a5b3e487b6f8d1d0be3c277cf029d74890610648f861cefbaab7909b7d4283bb40997d36923d0d2be455dbec5a3a9f2a611708a4f0f7ce0d286d4cd060dbf4656af3d5438493a0cfa3e89ec56c38e8789928bcd2bfbb07d10293a7ff9ec71e198996b680f9b1713cbf1b68dc5a293266b2c50b753a4f61b414f937087e337b0e45e5c68b7219b8a3cf8999ecc60b8bae18bedc53db096562d279e655c08b9e6e3bd1cf1c868a1f13918ece471b9d6aafeb1838d28388b726177558173d67bd1579099a6e09025cda3c41c57e26da920b9e8d28e42989c0ab4c1453f5683ec9337a1848694f5ee0bdf4deed4d8c868513b2595ec276216ed75027f4ba236018534477a43f303777beeb7ce22a4465e3b4edf7aeb7393a357801f33c144baf45e1e9a3e0fcabd319a75051c8311b9918394fe371f1989121009c89e6e8d00c1168655ff41523b22ad350ce7c77cf27b6849245e80477dcb293fa7bf9fca402352bce72cefbc1711d160174e39a24a3b619d42587cc0199576456a6201d2c9f13dc20b248c9929dcdc4c655cabbf6494cd660488a6e2acd18788c881bd09c160cd345cfab9005115993ab94bfda21dbfad9fe981be4116bb96314048dbfef30b43c9eb3a80f12a0cbcfc0556633d5936795dabac2a4dabf92f53293a87821c930d75697acb3e13e579d254f053f7854ce670954980e2ca4e4dbd512e3805a1653381370a84afbe4e42457521bbc95f268b0aebb093f397aa989b047294cdc16520a138bdbc9c25a7d41dc6300500d53f8f6c41472e7dd15540e6cf6cc0afee7dea0f18228aa3f1894fb58e776c6163c0e334b72fcf20a7bf6c96f76b3a84c2f6796f453139b4acec76e6c2fa6a74c83db8b173c4123d9732b64261cd777dfb9a01e341cf149846ad84aba7a226b8601e1a3606265f8a72b19b4eabcfcce9159b5532db9b90f42357d22e42965d91aaa93cb7c8a18baeb419cad27cced8fbaca93edfe74f515d3466fd6701170e1e5ec26ab35d8b0f21a7e32902ee78f9f5bd4554ea32da046e52aad1f7bfa70c86aa21bc925237b64020dd09ecc7c66efb1de5cd0d1d66094ec0c6fb892d408f9d820c6bc1f3150e27e136cdf7c1470feaad0e6c5fe7ce6779093524bf0c17650e0578b62f33cee2383180768a26be81ec1676caf6f33681875bd94446f2abde576bb5b1875d229e9449138020aa610c3f56331dbc9e218483f9198a7e4c1422268dc13df2fe8b7ed6ff5f4cad57305388643d7c0816d9c00245088a8e967bfbf2e27a38e8d4f598b4b7db37f18d9a83410822e1ac1ae0422171794bb77498ca6d2c9f41ca6cd1fbc2c49a01e413c79fa9a582fa61d22c83eb9afa81d9b94c907b8e904d9bf001b4851f0d8ee950fb607a64300dbe4e3ccdacec5ae0280b7cb2a614dfafcb323ce3eee0006697c8fbec3454624a70985652204062e2a9e035ef39b4545a77657b1468cfe12690d45118d7fa2e613ed034665c76268e90994ea904bd0565446c9db06f47c8c2ad9901a2509444f17371a0bdc677256fc5b20c744ca56f5d08e894cb084707d53dd864bd73da2f6250590c50836a6a83c862f365d3f0b94988e8910fc1584e2ac16bb330043a9ec8a21a0a16384b39ccf38ee3c80be6d1ac16cda21a53a0594e5d32063339a4ac5b9067712b1050f6ac2621fcf06e2c1d7c74a9c984f48f5136e06a87526ca81a6c6c69cdfd0f66ee4ea133e92f7dbc0b4537f0c41a8c311da2e5a8d0a8b9989e43f17e276894d3b25d8710a36112278b813d7edd879ff02cc23a63f4a85d1238970b1f7ed1ed0e4433c3216b5009c61084623d305f702280f29f00500b0a5ab920e26f79bf8a712da28e0344fa3a2e760e64d2e0e8cc17fb162dd845aa6abca8f273c5c80934a83c5ba36806dfab1277280e8069976e9e52a4180cfc61e9e7d18dcbcd7cbdcbb19da80afa903c31219981d096e2976b3ee8170c38ff297ae66be94e84c5fec01c15544bc32a807c2640d0b4e1b080627fb5707fc3797e829279c1da0efa0db3cfd30794269287cb7c3450a10cbe4000d3a161c71b022c145ca8d139350386862ff460a3bc7a64e3bbbc9e679bd3a0531de7f1bf86a1b203ccb76cada4d78ae5436fbac98f739d0a1211acfe860cb406388f8fdc1005272d3060c7c2d28b87cee0be18c3a7e3a05b464d618f8de90a2399d2a895ec2a4ab81f6cfdc0926779699bdff334237929a477e37d66d5eb90ce1b44e2770fd2316396c92d21e4f03f65c58f0cafcd554850610fcc32fca7c7e24a80a5fc07598188ee50018d6c6b856be66226b1501d1a131c825dd34f34aa141ec71d6130852ec88b87d07946eaf2bcda8c56a5983391b1bf71ab5afb600e7c30ed99ca38950a25e8d363a94f244fee60a5641251fba44162dc10735515567d05254a3e2b865a84c566ec92aad4a384bbee15ac7239187169937d48492658755cb719b03860d7251911dd3a41f9ff7646b4a844f75970367351c15d7b43592202a7c742c1659c77703aab0f09dbfa0486b82b6d2cced1a18c95d78f09c616c954c0cf5f51223edfe6a361163dbe36e218b06052dc42cd0887f708417d2ac3f5367c72745851da23ac1abcd86ee1240a6a06a0b0b2394e70158c65ec541ee318c8278a22e9d20b0809540a7c76caa89854937233803b621972a3c6a27081bc23716fa3e2cca5ffd540f06285135db3c523d08ab6b2452b10eb52968a5091b71486f5863a72a56110e6d76b9408055792a726e57ecf05913fb30b62052ca22e3c41e72726fa84eaa8f375f856274e415fe13c2324e93b020843f90a754e7ea483a6699a0833811771d58874cf08f8fd5c941fedf6ffce9747f70960078c65863110f08742f01ec440d3c78e6ce5fa772c6d66f851583b392f5c29ce4af8b53b13f53dc187e93d538e34c43512df534aaf1d0f36b89d7a081e60276e4dffdce937671bddf3d1f047c0d6cb75e36ad8bf311c1dfe3a7995116e47e4782922174889c8032c9a17a58a75eeb802cb3a8b8daf1c41c52363ee5053cfb1c0e69367d83b8cf93a9e4071cffe060490ef39b8f0a578c95fdb488eccee4a82aa872325828b820c48089f60ecd950b360a3329e1cd61c5087dd83361382f85d1193902f0a96e7ad58238a3039aea066a7e15b3c561ff5b865456ad5f0d16a3b1e3818db57b15aa8fef2aaab0824a1355c53d038ed08f7e41213cd48187a82d5eff12abcb9a0cd2ba8c68dd9bc67cf4056f6a767bd270acd68363123680d3761b8a53ed8788311d055d4cf9d238deb6019ace22829c6943328624f1ee9b7246ab473925f0693ec24750d2dd694afcc8aa8302cce6ae3b39f62a12482a0be5e255a918df2f0277cefb68f73b9f88b93a09d65b4b138cfb65bad430078489ae6b36175aa78d53aec65eb11ec964bea94336f289b9f3c829dc088afd3856deddf1504696531a7f5cd8094d9c7697d468910f6d680d838385592e8681b7340a5ed927766daa9f77631ff3f979f1dc98553437836262f08b1451ab6e20ff1b878f658f1b51f61ab54234abd06ac1ee25ace5052ed842b3a392cdf5135d9c8ed77a929beacc5e833b062b9eea82c9ee79fbd1d36d55f66d86d519744c06d145f697f63144caf03c3ff56ae31f72af8719b166edb9ebd6d3e7d5b597a65ea561e33af9a1ed954bd087c58e3f9d3c072681e884c38d0b93908694e609a1d66c2285accc0a1a6f175f54ada162888118d5c3a490ce88424d5357dab75b0972306b50b7f1fca8deaf07bda5b639d0fdf2a7bc166603adfe88e5d1716c85cc678bcd882746cb2e3d92a31b8b5b4501692109b614e321db2d28591954a8d19a06a020eb3c400992028c057b920c1bd9175b251be792d16a004df04b91ac798c51f2468349d6acaa8d4376cc6e0c8e8e360a0e2397bb49eb0cb8324ddbe50606da469056a077f61aeb771406dbee7e25a63e57de311ef08aa72f7df996e30198a21839cafa59a5b0c90ef774e30b25828e67dfa0ccd1807ad71b41c72cc2c2683d01d896f3ce35dae3e845f8424e57d8df9d9067c1370f84ce0595bdf190da741048b440e063acab210c44efd4a213afd07f45c5a5005d64352fad5556b65b496b103d83b15fab765b10ab8946ad44285056a26452c5b9d171a55574a6c2d0c2e2ba9a6e731a803ba88f3bc59dbd0e974ef1f2eaf133eb574c86c87bc893cce87fc308cdf33fa7ef2a3801fb7033049a920847849eb414d3b87e2bdcf5d75972941461927d61dc90dc40abab1a4c9b55aedb3edc27e3eeadc6421f220d3860d833304c45609a02e9d2573531ea15b46178c224b81892cb5ae85a27ed1107874dbdb3f9f9aaf0d7db85055abffa2205c4c58404810f47cc1f0e24d2e74e7359a47d51c4c054b102d46e0826f7cb246cb98255dcc27da2849f4961efbd45e7d233aad43678282cf5c070d24de302930431d89a34395e831b481259fb52e41f122a30a0d8d560cf493d6da9a5d2169f37c8617b9ddc431ab5efc4e9063b68fea08ae24dbac37ff93e156d8fd0a4087ceb7bc80e6948d9b146e136535e2998406032acc874e8116ceddefe1278c1412897a028ebfcc9e5a2a318c56eac8ed8c5cf20b8a0bbd6dfd45ed2f83964995022adbb9fee666807ff945cb119014ae8da9d4f914b49f1438acf5b8d88d788197fd067fc32fe766539347edd1be7a11a1ee07606de1e8357084bc452b5015c617ea3116246c5ff8d9a97f842d116a19e7416fd49bf70c88f106742f5e715e1bf4bf4206ed28be68202c778f1a499a58bbb3428c59d1fa01d287a527b41a1779a058d123f1f4879ea2333efb6f155db86c29b2b11778a8d005bcb8ff620a22e2718962da70a1f3389e134c09b981245027aa6e7af5331f6a91fb96df889ee163bf2821845dd993ef6ef4c2ad3bdc6c575a81c21d93c2d8812474a7cf768c4b7cd261829134ed6a25ca502d4f29adf84f5b04c4a372c8d1f5e03065624b67e03921ff58ab4a49cf95d17b0ea980cbdb9fdec7e825e14ebd9f4508fe32a6d31f6685726dca5e0067bfa035d8b4e9dd1b70fb9d5c49a9f7eea8393d069570592a31b1e2ae1cbdae462ef69b37b95b14b3d85ec7eef76862f8ad51b72e1b7d875643ca1f16626fde2602d58b6e4bfaf0f0c56fff2d4dbe2fa9e15eb0a78049a80af78affbfd03223e026cb0f5c21ffffb2fa1ef2eee059b4ee15e438558812643630cad852462b605ee07e2d667951af658107ab799d6dbf0ca5183bf92b60e8e13b2793ff1477f3e0e2b4f4574436deb80ecd30f0599844b494f92d57a2b2d1dbbe3d8e046c317e977d9bcab17cd50f613b2ebb886c9aac92b0294d85ccd5932119cb7552a31245d2e9a09343d7a5c1b882a859be9790c704e650599dc46fc934a7d823a1d2850486dd6abcf9f3d097ee4ec5caa92322819a9fe7f7ee54f87f2b50bc9bd94fece4a4bb46a0c1e2520bfd112b86f9fa114df54ea8451dc6721bba9845d0cba868661a6bdbd0394269368a79d16f49617f1e41d526801838cf70983037e2ebe5c245fc87babd2b09a6a359561e15e403eae20daf0bf1c9c157ce587310102bbaab2cd8adb5d0b0fd9cd7cafb0c7c8c8af59f4d77720bd64016c289faa6febb04117314571e2a6609dcfce17086a5306f431808f4ad1dc27b6d0f7c1783d13e5138822a748b3e5e8ba563ec19e65ea2c5e630e8b1cb18ffc1c8ec9c2a550efb91e0728ded8d0a690820a7d0861226e1e068138bae14512e0552fa49aabfccf29474c12a80137995851f8c613d65dabe4a709ebfe0dde86cb68af3bc89be760a33aff966216534be202584683b8d2cf87df4cb3dfb96a989ce00d9d3c18b3d5283ac87b20c17db03cd6968b46ab3d8556fe8ca6c66743369fd8918292c6f6c216ea5b2b3d9490c0a17feaeac127082e4cfec6e9c04964bacc8833381f65e0a80c16d93acf91fe4f3ca3576f1ce5afb691fb9f5828cfce94124c274e88759e7ba9c96e16c38c412619c929f82c840420d856f78e8f809312bee26ae6bc6a3b3c1f493bc4b06318233473d2cb38911580e7b511952f0abc7582f8d233d42b66c4bf740e6008ae29891e41801bbed43a2269501136669670f3087890973f96aeb3a38e573c0d002be90791c07f21f06a0b7115a251898a3d03f82e8de17cc91fd10fc75978d6b531082079354edb2ffc1a1b543f388c549a49f998c606f5796de1913207c39f5048ec75df124fa9b58d67778a5d87c23daeb65a38e600cfc47ed8e67635f27a724aedda207c59f52b94030f8bfbb6c60d46524de44ac3867978447e4cea9143ea7892e04cd84ce2ac459e3e7e156955528601405117cab3f70445ee9cd58ce64a2c21e9fe36070742b3e763fdf0b3571ac54d29edda85d6b41ab4693d2532ba1d9c8890ac4c63faf026dd10eb229fdd8355801f971d8b3934718fbda6dd544a0cad7dd1d20962048f0647e192b51fa0ad410aafef3039a864bd1cad6dd9bf48269b16871d8b51dc248bc477a7b93413877970d93c54487d2de781a5dcebbc74a7623aaa4d40c6dadc0a4343a587e2800900de09cd4c09994da9d787baf3662bc315fa4b493fa148986542c20f94255fd97180f1d2413ce00da18b7ab14509c485413fb0de121a2d9034a319fa85e9d391955c197af1bc1db9626b511f3c5a6084ed3d25070829efc280133f06cbc8169a172b2665a1e72ea5a769627b8fc4c4d42bb73f0058e0481cb625f612db1ed7bd0f44b3426b2a12a123dcb02bad35e982015a10787c39cce95714c3fdd7adcda3567b76395cbe59350472d2eb41cbe53b5c7cc65a41266c2ab84d4493649f7544ac660b8b3c923a9911738b4798417bd89e0b1088cf6781723fbd519b4939772358eafe7e79d2c626a6f482e255e259d6054f14fbe35d9be50eb9036ae00cf7518c4009dd369a5c68ba0c8008517721fca7a33e328f87d7754f85ad409c43d29d4feae41c1ad7b86eea9b17ae50e9dfb3b279baff55ab5fcc8ce108498e6efe959cbb4d985b6cd6df51c5cd9c48fa241daa9f385559a375b5839f4a84fa3acaa1257988097b3a7547a8c8c21d00c143526b519c39fd417ffc139b58b546b463102d0358670cb76176e33af7c21bb5709de54a84e6eca6b319f3f818d831374eee3f7a194722485fe611b58c8984e0821a78fb1e4b43522532e73649a89ba8ef556cb0cff9ce793eadc9b2886e99f56390b0e15f6aa50307a17eccae2aa425bba12dea1743179fe1d53b5f7cce02010ae7df64b8324d02d93c7f8badced36a885b0f1231e3bc4ecb36f9672e362eb5c9f3f8d34c13ce9cfac16ae71154f9d51c15968e7d188b278da74522ab81182740891a58421feb13489ee014b222aad62e8c7636cc0e694f64cc9d238e3c798074e611d58c0c6d2ebd66d2044cc404dae313c55120e0584d07a517fa898db564ae1a27a9a2bb282b62f8e5a402eed63813377b06d3bc1e1d9746aeac6f81c05259afdc862ed8d9dd12584eceeec9f86ca8ad954bc7d85d876bb125d97b77db726f29654a325c0c270c6c0c924673a2eb292738129940e7515adf67a594527f8d4e4a81f4a98e74b47d9a41a1709f35a3e0b6bbf42274dd9c78fc41e79c73ce39e7744775b59ef691481ba949522691a5ecbec10a34dcfe4027256dd19e2747b221a09fb9338b14cd62413ede72d61326b21750ef18fdb0b14208b72b13baee762b29ad554e6f6d739eae0e578adf0cebb2a7043ae99db472069554ba949ec72e416e1c2369e43792aeeb769f93d25ab5209246fe0e19cad0d6f0bc43d2c816a4aef3bc2f045b80a5d2bd26130a4a4aca295491a79495951514d32d812bdf8ad7915656e6cacaca8af78a0d065dfb6c071df7d0146b3b4857a0e1ca1a23b576b09fc6ccfd52520abadca0e390dc580c5d8d4dd6b0cfd7344dd3b427e2a2633b654f49c15189ec224495d1ef8d87109141a4dd6590052ec4f2fc2f75ee12ad2ee9f42698c1284b59198cca1094e79c937ea5470cc93994e8af86527ba9bc4327f3b70025e80c9598dd4cac68a2db7d4e5a8790604749d0b5f1161f933ad1eee4aaf9f3e9f7a0094c0796254c0530980a8ce44ef338d89cf1f76027580a16d3c23ab9f4092ae76b912c8f8c64f9b4c86173c5cdb899abfaff51a87b6730ae8894c33d19e29cc8b822cec8b3b2a1dc422e3615da8e5ca1cd5b71b339e39c1137736e5659dc6caea890cff8f7ffa350f752a1ecb32c331da245b4c948990c5159e6c1824b6179bcac1fc31d6f9e422e3a716b11578d77c75523156205551d5709f9b51962482ba867457e86fca807369be8c81bcffe1489bc71d677632657978bde71b42bcb67fc757265796555d78c915baed775c7cb9ddc5bd4f83cb10c0d4059cad0e093c72b3bc351267dfd9dd7213d62481ebb1c6a75b021f3c497470aee485974baec0a92765270c0cafe9227cf269e6419852c9734f1cadd6be1f6ec974c3c52ea8dbbc9c6ea25f4189828c9dc533124293967ab56bb89f6929bb01cf6dc266a220c87ebb9e8723ecd7e7dd2ea4f6763b32153a299bc9138b8a7a190ce168fd2459ba47b2597eb7e763fbb9fbf7d5784db3f37afe3b4eff9f65d3e8ce3e766ed367dfb9fbf6d24ec82439cc9dbd78f01f3bb6e17d277cfefb00b89f4a46e1209b7d831ebe4c144cc4675c0faf194adcbef5ef82ac54f8c1c947e112d32a59249a64472b669b5458ded76a94f7a2564d8d0a53ef74ac8d060a0e68c10f6393cc4621e520605b47065d8c031dc00f45fd8e0162ee26441c650aa83aef11dee8c7691c31d5159863328fde9429bd2396bb7c85d310f2dcafd31aea2d8c91d5134d4c1a5f8e88e3fa25c7a467f639b4cfd5129cf92ceea2d35fa34533c12a92ee8648f814848c60496bdef225c29a529cb962c799ce0d60f9db8e367cd057401310e317ff76f2dc61d8a36b4a6948bdcd39f4f7aedbbd7fee6883612f33893b5f73a97eefde577a3df13c5dc09e9dce170870d9d07131b8675b201dd65b872890f8632f79fbb928ce9a8b5d688dcdfb5e7df5b3ff7dbd6edd3da90a3f36bed8d90379eadfde6e9807ddb46b2ed81c96194785842f3b047112e5a4c848bf6253579a76aff851d2dc93aaef199dbb8ef8c903733db23de7bb6befd1a3b571ee6b08d69d12d6d0f46a076f2e879f803e555ca6af2938b50c8253d3b59be4c21cafe5256d985d39b1165128984c7d1c70f499451fe0333f7937eb41fe03ca26cc2328e70671e49ffa4f0d399ab957795154cc218c854b1f6742f9672e6d3c9fe34b470c74f28fbdfff641f934fe81bf2de9f24c19f1fe94961e949d84763971ba4c7426a26816f43f0b9f0fbfe6a90ee57042135fb00b117a61ce5627b276fe6cdbc9992eb117d4426af76f802138450b204030d84b019e529af8b73ecec1d0111c5ad3fd985d112ee58f3abfecc55cbb0f7a2505f7ff2ac44b3a2fc505cff5cb4e04a8f89e23f0a35a7ad719b8dcb1bb60dabb5d6fada8cea1b7e32130840726df561c21180e48eeefa256e45527d5cf4c7b1c195feef3307ca23cd298af218c47ff82b4b5c91b8d87596bbfa307147af3ed9a5cbd3747c3bf9598c63835b7d1e8a5b7d72bf8fab6e58b75f88c855f3db83624a7cc855324fb55ed58f82b9d84142b89fbbfff6a3fa65bfed779884d59fed085fb35897b5a3c787444c99a5f431888bc05504a60623b8a1c7888c33b49610853cb8828cec00094f178c80842f2c39430b82b0c114f8d00235fc98a14886ff8ee93fc4f4aff9d1c1cd8ae26ef6fd5bb84afb9aec36d9ed913cca5877c227eefdaf8ba9001401093c393bc8c10f8e20633e4aae9468a9a10a4e28099a65010a19f30b629803cf13e230832dbc41c6dcc012acf0842a40f1041d18c99853ab02fd1e56964b72c0b2c972090e94643be7f6d6de8b42fd8f36a7a0c013d75f9e49c97525d8831cc78332fd1440a0e16e3fa632c77115c7f6f56b6c330cc721d92b4989ec6110cf244c8076617f76cac506627647daf9f4a969d2521ca4395d08f7c78b3c86e0c7179b503d4307f47221e969ed18913a493cf961d4a38910321b4a6a62a619bc87e27af7bbab1b53e089eb3c99024fdc3eb221c1c83fa3eb24a1ae793457ddfb531dca3357a577ba033a12d4df5f1ffd2479a414a81ab928c569936352f768c0ee588df2cc74d239e9a473d249abffcced27fb7376479e6f8db41810b9c1c90b1bcc3768e10926327822094970620b6d887d410e3f5b3841ac0c3e5ecc0d4f546c10b6692d10f22865ae862e04f9000f2788e20a324619fb0196063324294204237b90314a21955c8283a016592ec1014fbe592ec181ce5cbd0c3b79a94c62488e4e4a3824e5fd59fe140e5979220390e1d87bdc00f4732ece72c91245b96baf09b96a18fd96825c750e7dd51377f4d62a0977a0fa2c578d35059744156e7dfba33c1a2233fd70d41e64effb6340ed4176b951bf844d56d3de865a1739414b95e5129611f89bb5f60a4b28a1d4e6b4ec637c98bcd75aab910e0985bc617781390c77ec96aba8e7e31a92f2fea7d0b113de3b9299495dc5638d9442c9f4d2734c39b654ba3e43ff7aeb03df87b8efe3a8f083e4050b8ab94a05053321d90772de932935cad606d449a6f40d16c7ccdcd79899fb9cbb22cb25284092e5b723472583eb7f7a1429dcd15b6df4d4e2d1de0d8f62b6f314fe9ca9ef1f06b916d6700d494db815327d14ef49f2ab8f033b419123f16eb950af35258489620b30194b50d093e59213eca8c872c9099ee4ce934144320f9ab39523b6f0c9630f8955d3b42ee2aa6a7af0755c754bcf810f7e273bf786e45a937091fb1a06716a7a2e347dc9e42e130ee22235616fddd07dc870b54f661ff63922a3f511c4b3c50162e92af07d80780b7dd4b7b664bf3e58025f03c324b4d7baf6b8ce78ec70a4da27e122fd9e0444f97bee0b5d6a6c5ca467b8401801b94ac294e40c65ea2f16923cc68c1ecb7474a14a7fd32acc55a3e7b4849cc83c6b0317fa5e0ffd208fcdc407798cc92fbcd65a9318525f669a5342223859780226c309cf0b3bd64a5c14ea2117e9b7ec37a3fbfebc9f1d731126038adbd29e563b3a50a63dc8a327c9f4e93743937888430e5ae024094974f220a35e01468625a420843c30510719f5a5ac6f65fdfacda824d7438e2169e8a7842ec0100596490b41cce18ede8a80ff1097fa2e1150f9f92a7848b7e047c80532883819c670f4848c949f7808114d07748043924d08583883908c2144549e485f810dad1e192a2e11403dcba35e9c2023e559f090153ce4851764109151442143053ba13d9101c848c14e6c36a6246c2117e9bbd870b9216179c3395cc431d313b47087102ede34dcd15b296157072358105755ec320411f4fd45df5bf4dd457f0ac1e2862858b555f216b39ee195646b2f352bb51ee2d663ae9a48ced057c196d62c87a4a0833c67965158420e39c63cf22b423967b8e764fcdbd49b52505ec3a398b54f85439c48bd87435a86bb2481a5f8fa1d94c445134b0beadd88abc68eb184d74597164cc3730b0b4b511fd11ca1bc92852fbc329d793565d06f41b184153882ce8f90cc553606997e0fd16f26aeaa2c60616161a1df4d5c35339d364f5413a5087be6220577f36ab4aecca727f255bb6dc1a3bd28cc827b481a190838c1f5ef9a68aa9c5ec2f0e5e780f0c396d1756118925e452865f811151fc3c3f0e5bbf6c2f0e5e53784cb50216faa5c913714cbf662ae7a457b15ed59b4b7dab842259c21357514943e8a5220f493a0dfc3880f9b28ecd96c2317e997c276d247f455845f285d24d15f80933bc4df89facec3df0425487d0a5a460abbd83b67681b1dd16f22fa3dbe1945b84839178e23f255a9d533996ba6ef4558e30b23991edd40278f9e9369f69d4cb94db3ad4cbf4711464849c459d3dd88acb66955c6f02dcbaf628a72152e7432c6ebbabb5d45e563781bf155c3e60cddbccf979038cd23e4d3a362bd0e1489affeeb53188d01d120aa84be6812152fcf85d6c597b7e1aada71d4455d14c98b8b109aed1f51caf663b858df3e878574b63888fb435cc5ea1c20365c356a6fc3c5ea43baa8020976001f6e0ca7ae17ee2757eaf299fa4f85bbcdf7d769f9fa2aa83a36ab73586890de017cb8a384f1f8b011a47310d807e98374a63d9467aee6d19ca93cb976cdf58354cdfd437ff94c45f9d1855aa7739a75447a394a118e9d530071b17ebfcbaf3ccb0309e2f23525251552242ed6ef90feb85881d4b7243c5aceba60ea72b1be346aa9df8d2089fae9387dbff6e138017195cad7af9f84bcf9709cbe2d285b50214bb812aa8492ba78514253387aa510892d8f5268c7ac5fedf088ca31a6addeb87a5bed45eae23f1cc16548dd0332572cafbdf772ae565a58c295909a2e51cad34d7606992c6b4e645914443d3e594bf9254178923fcf3c8adc6e20413af97dbf85fd5f5863fba6b175ed8f31b7900209d2519cb496031eb2f6293573467b7bc2a3bd1f8afbb6efa6a679fb91f562f2ac96ba28b9dfbedbda16a7949494142ca4f3098f9b8fedc18d166ddbf4fb8d367d6f13e18b71271279529c57d3724d4d1e7fc46497233a6f7f442937fefb9f8eef1b0be9bc813fe7ce6b6f042ea2e338d61d45506bf98cf6efcd33c31ddc9a6f8e28a79f68df45edc491f48e0fd311a55d4db3e1605e246b529c3f2483cd55504cc9f67d58621b17493c96b84b82a033d35e5b02042559fbeed182c0cada7713adc89b5bcdda6bdf8c0dd7b83831115de974d94f73e391489e299a2c791da9311128e1d819e5fb9ba1674da6974b7ee0248fcd335a263d3eda1bc940340de5b53f1d51f95218a4f3878b7051d31ec87cede5fc1e73a582b7f9da0eeda7e42b7cd07d27bbf6ee881adf4acf5dee3e891b72859a33dd6f410cc3aaebac9193dc3d91dbd6e10f9a645994e5121f1ce5ae3f3bd2d166467b957824d27d0cef5e5ad369890f9a8c3206a3fbee6d3c6a769ec5e3495abc020d7744e5ee5ddab6216f66ee3e87abe6775dca551ba68fdabefbee654c877d34cb5bcb430f80728a2c97f4802777ed59d97f757cee8bfad8a5b425d7b88b08434092b38ca9d19266f45c9a4101211725150212c455a4979f84abb897364f8dc4719cb5d6da1447a4f92d37dc444445dda4674d248b7e0009e242158a99e20070b8fef2e42afa5ae770ae39330aaebf3ba92391482412a9e5aa518903c0e18edeea83a4997f8037dc71ea4c23ae1a671f745c358bcc9dd9071f17e777cb45eaa2f45691b9e362b7b5d65aeb27fa1b9e3a2ece0fd770adca14e6388db46691b983a70e0c1da6bfa42c4e494d8f216a3e8924802461e4e4a8c64816d5d43ca9f99a27df32aa19d239ac9a1e3d86e841448f1613598d0d1b316cb008c2466d1e098bd50821440e21f00e21baa7368f546203a37ef3d4c0806103e3050c9bfff1a3881f4d664545cdd3861538b89dff6865ea63c417c70429d21fbd5ceab2247de7bd6691d821681863ac751ed6ec2f572111c4669847a27e1054c6a18f8cebc5c7e522adaf61f061b00341d2f8481afa35b49206c4a0f62e9341b9e832366204b96ab2780f678e091d49fd1d97185a10240618c0a4e679487395c1ee9a33d3eb0f4f5ffef03f7ca78532dfa17831277a333318f3e32915854c7fec1cc685e10943399565189c20cb4ccc603dc75931a22cc3a007a35c44024b5c29869ea13cf690cc3dd472925b9a09578aa1a7495ef93907a39610e6c092464ea84d70c9b47c5ab0964f0ff6a8bcb159ca9a25642a67a847f378f2578c5784abb8ed31059eb8b2491e65510c1e7be4986f20200d06c903f50fd0f7e82103be8ccc0f2113f640c18579991046ae7c3994c8302f613e1a54e6141478e2822ff31e8e5a9fc5c33cfd6e800f8347197c447cf0eda703e6eb3b4ce6598432bf7d35583ccc7b8c850c36c245988aa9d803bb73e6886db58c7091d22c5dc4784ce53963c220b5082386c832a026e6096391240f447910923591879875654a07591e7b8809ab6518e82094bba524bf64b98407b0dcfde051b78919b798cf506ff98c4a8391d98274417f94093d08a6e51976b9b39e0494003e88b5eadba743fb0a6a433471ebcfb094e547a3cb18089953280990e1e2c00f03834710bb8038e6357c447c1d300f82d893b8f8d5d01e7c65fa2f17294c888d90c018eee83023605fc5e701125aa5bf5c05e2243f7ec03c0c0ccc170113fec8b95a7d4dabdf99509e028df8c92294097f8844b8d83f80fc7091f6dc964909c1b05d2e18ade57af171d9b041f3d8609e4f6a550fb5487fc6d838c1d53e0817eb871a8e09a5a449f94e0c73c477d921621400115f0c4539a506c2bc18be9833476ae60c7d09c4e0ca253dc8c960d1d38709730a18e690c12e372616d2d947ca8f413a7b8ff2319cc5ebe9014110c45f0d9b651e268c791408be05df73953f28f3a0f820f82218d6a45ac0608cb5269209bbc9cc67e80f9173476fb1b41841b078ed3fcd7358da9caff22c52e128aeacc8845b96312ee658a9913652fcc41acc6b9aa6691d4c18f3dc57c3660d060c175ffb995465e2c23c8bfa30301846cb9a49d8443e435f0b67c22ef219fa11a0c21d3dc6023b30dcf1300fa3b90eb812e58df625999732342d138edf0c518f4316e168d3f2b3e527be1e8b0af330df3b3b3a3b5f640716f4dd007f54424a9af975ac0f13037e8c09133a8bfb6a80ef395f0d0dcb60ff21741f97ebd64ffde82c1d31ae44967997b94a46e6e957637e0d8275264f33d2b382a727a604fc6ad80c43c36698efef0806b8eb6bcc8079f9dd702430a54f07652d91b5efaed720a61f0e2ab104cc70478fc594a0789d93a30d7191e6d457c1c2ce9aa60f87cc836ffa66d4672113ba8f8ef91a1249431fc67e38c0d73c49531f0c69c51218c3fd6472ba156f0927c84c90fe6a1c67491730a123a9b9043e8863429ae747c3bd9890c583a1fbb80b89fbb40bfa31a1e715dcad40c34582ceefbcd2e91474b99159e02333efadb99ac1301f03be4c7844fc191ed1791962257d0c906d7a178970f186f6e083786c790dd7572293be19130f51eb4fd237033cf5ce8e48775070e77f11dc3b3021cac51af313e6e7f6329f82400aee7c3cc3633e462694a78f317138a672057f3e8885ccece3f435c09f20a65f43238470b1459aebc447665eac33d85b3e433f068f16068f16c4d467e6e370f468a47ea686e0c11d7be87e188ef4c3b175441561512a1c7f7819fcfb2e433395a728295a300adba05856b00a86e162d3594f780cf2e3357d0a46c14188a6b0c50d2518dad166f76e74b846025e28124208ef948a6951dfc6575246ad1f84bc91b9e2f1470e7f082c71b7af51c30d6b9a6c53ca452532a5458c70953b518cc750438dcbd572b57c5c3a3a5f5936ae4b91e8ba1b03d1873ba6b2c44500d1872b6306b76968e4f6924ec6f8101759f3abe632a43bb214224b1a76e700f1e48ead53448c2c62c11da5d117d349dcf9849231512264f3c23d9cc19d926229db48aed1f6d0c9d6a6553add7b84dce97b778109f7a6f2d01dc5ec304451de80b028a47cdd11c5049bc72e07993766fb9ce16110a7d77397a3123eb03d5a9a02eb51eb514a6b8e6dd3a407ce217c620b9fe14e27a5543b5d8eb35bd769b5a3d3bbee64690e284ba9cf0a8276dab272a0bbdbbbbbbbbbdbe77531653d3a9a20f77b1e89cc4eeeeeeeee281c6ce04864c50395427917858bf0e6b49ea76977dbac7ccea6eb3acff36e8720282d582a95ee35994c28282829295ecae974f25454e4af7c3366eeee45a8b0b0b09c585258585858505858583a120b6737161616adb2d0c9e2cdc23ab927cfbbf484aa9ae65dbb6d9bb51ce75d4b22759ee781e08c7b4b26930934994c2653a5d34d2d5bb4229d5170e77707e964cb764933033a6bf5da36486793ba2e9ee437a38e4472ffcc305c94df3f586c1113d322e6e469dba6cdd86a666cd76e5aa524d2f4e660d07573cea641d4e176f5da9588ae45e86ef7393b8f525aaba6ada8c3f5ae95dca6d9d9034befc7a466f55a6b57c981a3099aa83b5ad350a993a4d9acb51c27659344da795ef87da0e7b97b388afd2051ee076592a6ff9504a8797ae787a491365ac4b87b4e6e4cfb5e6a4241a128282828d35b854b428c8b73a25c94941a41c69031ac6c92e5105d7e2169e4b6699572727a732419fd1c91eee9844e62eb627bd2c539a9d3a6546aae397dce3967fbd73967b3c17a744e592d60dbbdbb76aa33ca6ab65a4badb5d3db5a2bafa6d1d734ad9b524dd3344daba73cabad3eb031997e4f4aa58f31fdd55dfb66d06ddbe6b6798a6aa1dd7d4eebd116b9866751d2c89752a31b0d43b48bf9c2bf81e40df8fecd235774b6fab15baa1fdb6500f7dec6896817725577e6ccfc01fc289f10a000353fca38e0f470928b1fe54c003f4a229adf21678b1b333fca2000fc0823003fda64ff16725589660e1bf2a67bfae28f3f4894cc6644bb88b192cef76f86f7cf5c75ad0d600df44f0690f4c0a36300cb2e60013ca26c1aa75d44e0d1493b156051803581178dd33e4360d75c713309b822e082802bcf961030f2e4600f10e2811d8047548cc6e99e1d78f4a3b9e27874e0d136008f37cf6740108dd33c39f0e8d91ae1682da075a395e7db689c366223169b2b1bab11a3119bd138bd13041ea7d15cd99602a6918c699471e374911878f4bc1dcd19207812c083003ca2e60bd138add32ee6c3c0a3e74d68ce344ee7b48bd95c6d2e221aa759ed623eec067600d80b995de1d1aaf0780d806df0c6ead13843dac57c4d5644e324d12ee6176087003b03d8a9c12ef088ba02c0e3a579b5c0a3e74a3457dacf9c994148afc601d22ee607000300cf602211b3c032b8eb5a481aa71275ad4a84240cc3300c430f5d3e1d380c631e7f0c0ec30fc35008879d432a44872a11cd022da24d2813aa857a869818e972c1fcffff7f18861f869fe2d311fec37cf830e1ffff3f1298b0f323f96922067b0d210cdb3326edf89076483ba41d1f152f2f2f2f2f2f2fffffff2f2d9f8e7f7909ff3f7c3c767ec12f2f2f2f212d4299c8fd3eb487aae07fd69acd66ad15a9542a954aa55e5e5efee52585fa74bca452ff2fff2fa9d4a752a926a926b3288e8cd0f0f242b422f4ac22f4dc71b01e180cd693a2a5a5a5a5a5a525954a7d2ad5c2f2e948b5b4bc7cea5f5278ecdc825b5a5a6029c2ce2de10c9a4d6032a4643e2195c24972f3f0f0b8a05028140a856a69696941ad7c3a5a50a8d4b77caa058f9d511885427546cd9ed99a3798aff9335d33072d2d9327774e6164c41a59236b6464454545454545450585423d0aa5a2f2e940a9a8b43cea5b5078ecac825554548e56bc0e46669199e37740a1b093dcb19d582cb6c3723a9d4ea7d3494545e555544ea74f87cae9847a9547a99c4e7f3a9d8658c2cea721d9168c66445d50511162093dafb48ad8966dd956111493c96432994ca7d3e94f27d34b1d279349e54faf62c22693e9c7143a903ba1c4833c8917e1747224473a4747473a29f7de7bef35994c6f325d944f87e9ded39bfe64c263e78befbdf97a11dff115b8abe53cde02932925f48c2294232424d439e0f77ddff77df7debff7337d3aeef799febee9e2effb669dbfb08b3a0d9ed34e7a0df76eae66b95cae92e7799ee779dff7792f757c9e77fffbfb79de7b9e17e47550aca14024136a297cb052e819640dd9581b6b633d21711cc7711ce7799ec7953e1d1ec77deffde7e1b1398ef3691de4fe240dd4489a079e274b4226931d75d65a6bade5388eb3e0a783b396b3f64967fb040f3cbdd33a7ae03cff04f9f9f9e9344a29a5945a6bdf5afa5287a5947bfb1ca59da96422bde0a4a809185a67364ed742dd3be7566badb5564ae9535abd4f07add576ad36d5e6c50072ff147227c10af03592a63f6ba1e7cec58b913ed86a603189d3b544b7edee160dfefee9a8d87aaeee442426e4f96110ae7f2b3be9d5ea9afb638448b1bcf9204f1e32b8a398fb51e26de5d9b5e6ccac75b32f2e0c157bd26bfe585f3e3371a4d85f4320a4d8dfb5e64a0172a67fbe9cdf393176ae3cbdfe16a044a6decf4306a4579edfe58a47225e06ba7390a4c8919e5ceaae8bd3ce295d1c6b728ddbe9ef50e8648c0a495d084f72bfb59d83db65e8af12a799b40b2a6feaf7ffd075a161b31c836cd95f7e3a1a5bd1dfb6166e217d263657fca10feefcfa9452ea57ba47512c1af51af74a6bad4f9b682b8347942be93fb0f4f245d9ad02f028a98487e7859af5e76bced439d42e2ace94b58bb0e6f99aabebc158f34e0bcbef79b46a9be5489df781a56b42a130951516544b0a97d48b8a151f62af321e654dd73cd69c91f1e64bd638de8fb5f7ca2ce5f15c4574483b4c4817de4fcb5341aeeffd6cb24de62aef572d44ef03107a3e5ecb63f94c7dc730974522a34025165f2ac97ca993c964b252cc97baa3a312cc97bad7ebf52ae12f754343a5f04b1d4fa9542afd973a20a0d28a2f918e8e8e8e4a2abed41929bd7c892493c964a5d497484e9c945cbe447abd5eaf528a2f9186864a2d5f22f1944aa512ea4b2420a012cb97b8a3a3a3a3d2ca9748464a25952f7132994c563a7d8973e2a494f225eef57abd4a285fe286da451d2a99bec4f1f094784aa55289032a59994c267352b24e4af74b0fc455dc97fe87bce95eaf57e93567ea50c90e95784a2f9da764794adf97e697804a47a5a3d251a9f4240b542a6d47a59235522a3d28f3cd28b1d8643240b8a518d9914c260b6140dcbd86ba57f7ea5e43b9fe87df773c1d50c7d3f1743c1d50aebf6285a7e2a833727474d419c9f555bc74299913994cf6e2424a417a91864aafd76b28d74fb57028120f09a844e221917840120f50aeefc26257b8239291127744e28e8e484672fd142adb8993714e4a9c8cc4c9644e72fd96140d857b95b817f7e25edc50ae8f3201e1d63c6e4a381e0e88e3e178381e0e282c7da34a25098b21732293c99ce4fab70bbbe758baaec3a38dcd6be8f57a0d79fe56aae5b14096c7f2581e0b94eb4f15fa83470ab73c5f9bac5dd40f3d97e7e3e9b8f8851e6caebc229bac47285723b14d0cb9fe73e18ef6c81ed927be02c03ff5f1d5269b33f5657ea448328b1f29906aa44932f8b4e52af1c1a73a90389b93981f290f32f8b447dec03cf894e5abcde5a23a2ebae37ae2aac783c4d962313d1cc91bccc4579b4e9322273257855e90389b8f0f1886e4cd8a077fbe7ca5cd6613368bcd8432f813c855a9077f1a41e26c395bce3c42067ffec81b150ffe34e22b2d169b3db1e9134392c197077fba40e2684d9a4c1864f0671179e362e42bcde53a724d966bea14b90ac50689a30505b961266f5228f195a633c4a449065ba62071341f9f2a04c91b1697afea6cf6337b81a707df7b2071b49c7651c1f796bc59f9558dc5bc48cc8d802a7b9038b549933e64f0fb89bc4979b0ba5c33971188120689538382c690c16f99bc313d587582749480dfaf4682c4a93eeda2fa282183df40f2e63e4867b36ecd5c20e96790c1ef18489c9a13c457f40908be07240e6d527a10fc1ff266ce2e11f83b82b090c1bf21716850bba82f83608c3619fc165e1f04df86bcb10fbee8aaedc71f32f81795c1ffc29965240ef5899137b4b6c4a139eda23e083ecb370384e54db639f9018f281658268363f0e81926f4b9a5df5cb1cdf59b6b73a56030dc74369f4de7379d4d67f3c9f551567ca9d996334bcd66f54d2abc975893582a166b92eb5f970ea5b98234174a7369aea05cbf9482d4a2e9683e9a0e4ad3d174349f5c1f64e14e332d67769a7db36fc5aac49a80b153ec8b35c9f5bd940da5ba6a90d7cad5e57205e5fa9d49f3aa8e0feac35507c43eb93ee956129dd51c3c9bd59c994b3e97e6715342634d62b158933cbfb9396d72b57105b95cae20ffcece39451d1f1d9f5cdf86f4378eb58d29007c376672f7f604008f146ad943d469e627cf5c79b0f99aabd41c6a1c13eaf2b4b8b5fed087afa4f9c1f526935c9fc56275e18b7b72d1f1c4b0c984683671954f6b643bda8eac9196ad8362be02c03da1bcb0895cacdf22ec263e536bcce6ca1e4d9ad338dd9346d9d93dc995e6741ed2dfc29497e362f5747ce649e3784bb45047f6285714489afa63c7875c9f843d96a4a91ffee0d21fbd1f98079b2b29a507931eccfbf97925ae1aef36b409b9ead64f7d4c17006f4a517b0f37296ad283757dc935256bde57e3b3d7169fd7349ed71e80d0c66b5cbc3c5e70c723336fdf3e8df79434159c4f3317f61000c2968d2dec4c88f299fa5bf8614c28ba5877e64a4a8f3557279fa9d363b172c557453da2183f620794c8bb0f897c7fe80455a29b524a7f760841d4146896a98bbaea03a9b5ba0a08e945b3df9487a7c7c54a0a6bf47374a393f2d09e23e4caaaa0dd34a448e68afef84cfdfa2a70b883eb432ed6f797dfe1ab96332aa48a1fe513152ae8a3fc112e5f1f88bcf15ca54b75a92e3ff60a72ad36990b478bc48d30532cbaa8e253beeb9023611a3d76bb846367152abe9b9ed7ee4d504a1a15dfe1072448ebbebcf62af0cbcf2ea59aae8b39b9a27c0c3ff29f1276a63a45de85aa90900be197b04fdfa7efa76d39520a209ad696d32875cd99fa5de3a2af39529790cb72d465311c2ef75d83126d4b176d6ee0f2f49b91fa1d8da37d7d1ef2c67efd0748d5cbdf5cdae44c7fe95fc229c576d1cf85fd61d8ff61ee6cb54edbec8a70c5c4dcd7efec8ba661219d5ff0d8cff9e0b422ade33eee32511d0debe4fa2b420f430ff299faddd6c3b57878a88bba5ca5e2eb073fb175717b151f0e7f100be95cc263e9b57ff974f893b01095b7bdeabb319329d033b9fea16663b674f18560a55d577c3828ee22dc469da781b229346313f6337fb4d0f394cc9ff9337fe68fe69140151f0ecd7a0f86f5bb50c98b9a21eb803ddceebf1a1a26bd109ae71f51eab4fffc2d8bc5aad1fe3f1d1fd6fc63b8d8da7fed6e2b16e456bbe0150dee9ee7799ee7799ee7799ee73df8f2cdf07a667117b5118bd52caf599fe7f2e1f8de6221250c7eb7796058dfd658e9ef77e1112dc466fa5f28e466fa5d15da4276f974746f5d65537c38bab79fa43eba681a41bad8be14ce23489aed5176a2ec8fdd5b9265e97c02cd9ff972557d073cb99476504f2148de78dfd26232751f94b7f7975e28254df7d931f5e9207d37bcefbeeb8f860fcfc33ec00e778f04a545281047756a288fabb3f1ba060a7d0eb9b84989a98d67c32d77387fa611e6131368bea6d01c9a32176dccd54c329564b9fdbb9d73fe37895cb256de9e2796e78b39f37c2b71649eefc92b6d523e1dd34efbde9c9ec6fdd4a487adcadbc227b697fe7362d3a7837bd771d58ebc9179fbfbe1e030e56c18e6e0ce1f49b37d0cafb1c69179ab4a5c25e4dd8b4dd5c5a1c5cba05e62f2ab5cd598ac58909b488777030a0d770cb50b2d67cfd0081690ab9644c89b6f693199b6e75c84d0ccfd11a5cc7df7d6c5ed3d2ca4b353ea9da6aca6ab9092581daa4e5e14e5edc71a9149de9e524ae94869535adf564a1db0876b9f49fed94cde68797b5ae44774fe9edbb88ddba8930dd3d9f54155243ed2594de275d5c8fb0e0be9fce1d17ef71d8cd785f5493daa4ec26a548524cdf6a4b06e41d26cff85950bed62a8ca4221365b8c9a2bad32f199ed75eccee5d15a9a2ba636093f1a9e7fee96b7a72f5a44decc3c738d519d76b1bdbfc4e38f98ee85d0ecfd11a5ecbdcd1d0c57f5dbb8d8305c6c2154acc6575487b262502f5725fb8c226f3f7ed9bfcad58c42de68a48fd4e0931efc72b487a34dee9f4d369a837a92376ee3b6a73aaff3914a3dfb707c4fc2423a8378ec5c8acd95a43a9bd7cd4709b7d11763e3c70e90ac9fb4827c56e467681ed11e1bf64c87f7160be9dcbdf6d190f16ca8652f9ce1cf8535569570423efea3eeb53f3b3c56a3bcfdf6de87c3e22ec2423a7318a62a9134dbd3b0c68c607d74ffbddd3cdc452e6e6f4307f0e176d16492b73f62faeddbc81380f2db83219534ee2858ac81c16242422c3c998f86631fdef6413a77d879dc08cdee62ffc348d03cce1f178b7188d9bec5f3c7c5eda9cff87bf67acf6a6037867a55cd5d889aab1af399edadbd1795371e2fb8d255e2f624fbe1d82cbe2e6e6fe74ac66c2407c112dff7fd7c24d9bf8750c4dd876ec7e27432dd49c267a8d7d6656e69ca550897e52a12dd9e764ffd08f5474773c7a2f28f1ffd8ebdc745cfa7bca9b37a181830ffabf5fdc6fc3aebe9ba68e5ca8564f7a2a88ffe7fcf8ddda793e34c3299603b5cff209db9b9ba4f7ff6b86aa4b05c7566eb8873e22aef0965c99befe9d325e40d587a107c2f1c4b78ec397391923e1d1c37679cbbd12c9a3b467c66b63387977c7ae76b26f11917eaa6cf6691ab38cc4d2357f9f45a4c1289ce63f3705f631eb9ef4e8e5c552f1612c274b83e8274d6c974a439993aa00f77a4392b3b676a70e1ca2547906426de90cc9f38b976e8bb3193bb0e91a09dc4c598c9c445faf32569e8e3e1fa981fa4777cf0b8aa47dee840de78ffbdf7e1b1698e8bf4caccf5535ac445faa1eb8e5387e6bc725ce532ba900e0e31cb6811573199443e043943ff089609570a282c0cf53fc9d48ba833f11e57b568897b9ab9f934066b1e4943fb067286fe0a53f3b88e5cc8453ae44ebe08d5e43239ca4f5ca4cf23e7ce24ae1ae7bf2614f2867b3adf8f28d5cef6d3e1df3231f464ffeee770f8b7cc73fe483d7499dd28e696b43e711509b770a1b99a2f9fa16fedbd2894a5dcfb57ae7ffe38e74b0c293eb948b79b47148ab218e03f718e1c3e5c6eccaf3fbf7e8e203aa89bee78fe5074ed54a600f5e39eb4b759b3bffd95379eb5b731c9550ced85d6a38645d4a84f2bcdb4471131b4e642899d524a299db9524cbf19dc689329b6a13d35a971586a94be5c228422799433ed8da8af594b7f72dc6bfe719ca5f43723bbd33ab9c8fc1df3859892499e285d7b42bfa3e553a0564e261759caa46a6c6824ce0ee9a266ce4c15282852b2725c9ce0cbb03e58ebd7effbedfb18b359aefa7228a5c01317e5bf074114ec22318e2fac99ab173cda141eaf0bb65d7b7486f7d5fbe9c970f4aaf459bb863c50706551f6bcef286d2a9dd6182e63d2ca3759cac6d0a4450b24e44b49534797faf3a57f333eec52a91cbfe75e8692c7ce9d2ef2e74b17f92417f962aeffb9488c43cc62a67906a15986426c2ebd7f332a6ee133f353e0d1b6dcbb8247940afe3c49285f3fec82827188b98e5248aca188efcf7b44e87de7525ffbfba5d0a562f9487896d8bd528884e72388b072a9f3f79d7c19825f383a2b7f5fc3318686f61e11560e62737d8b7fc478da5ffa319c0b474a440b2d1c29f59694a6fab342a5dfc9b00628bb714df64c3f1a1f78917d780fbeb091fde5937e7e7d29bf4b4131ddd2cf505aecbd87dea78428e17873f7a67044e5ff217718897e10a7fec78b3c9377b838843b4a598eab841862d6b7f65e14aa75c420d6704717d2ff94550c77b4a82d6b260deba0aaa4ce5eb254b1f9e46a0892273fe562b5f1b912c7f02872fb35c34ed22f6bc89ff2e7cf2f871234947825f1d9b9f88f2249dc11763e7d1def8f289db93a3d0b0ab572afec6064fb331c6db27db796ba686fd5bca536b5e9d9d34da1a8286352d65a6bedccd27ad6245f2e69c2278f52a68da78ca504e2a2cf262ad5a0d25a6bad94d25abfd65a6badb4d64a6bfd2bdc5a6badb5d6357432c65db0215caf4c9f88f9b93f7b38f6f4b009237914f392268a64fa54a4dfc2a6254d8fa4dc28b953887ed322a5f3fb2a5c3a8af95bc4d4b88abe98c355fef477f40425d14cc347a934a24653069df458793efe30fcff7f79f954ea5b5a1e857a15953f9dde64fa7bfffbdef39ee3dedaa7f46bad5c1b268928e370b37631bf5dce59e39076dac544ed70b3ee4a2972a65d72ffce97c3da2c2549069b24ed64df5e92761a47762599224596499ac28a96cd8e9e2b279360ae1abb56d772955c72c487f49a4f4a32494179ce4c3ffa3c6470475a44752057fd23c48f1408993a4191e0801f6992100f72d5b21d3fd225325d018d0103362fc895b372fc38c990671ae61b6efc389dbc1841aedc65e3c709459e50985698f1e314fa950b05f1e3a4419e3a9840c83f4e242d6c902b3f8af1a3cb213b1ee61208484d41ae660bc68f9e85ec5e70321ce0476fa2f23e632f7ef426b21bc1a130006a0f72358d6c7e742672017e7417380d06f0a3f79856b4e6c78e22bb0b1700cd49f65067a1a7d0e2c76e42f66f24c8fcd83fddc4d83d107fec1b7cef313f76916662947bc8ee81951fe5cc2585fbdfe0bc67790418203b8dd692dd94dd5fc60af1001e5d6b878e063000cb72b0483b366ad070cd70d97b51a82c14c38f389e23183837ad03b45eac543103c46c0a4080014ca31a1702e0a1e1b1f6a25033306bef45b966313b1846c58a1478bc28173ca2565e2b50287844a580241d4d67451e49afaed53da17b753f9d2bb6c915a8ab519f1c869ebb17d24e115ca4168987b27e4652018975641486789c4c727b7e093d772d3033c88462af14c7c32981fbe15c5cebe5058fd3486ecf2da1e74ec5888301a7c3b18e8c503666d76089accc0ab5b4e0d195e4ce2aa1e7ce645b4f78fdb85ca7236b03bb63752c4b45058f9e730a3d9b42cfdd27148719918ce86eaead0a1b6c7b6d3f26131e3bc90d3d7f1b6be3c1c6b3ed6c3acd935b7607a319d1177ae642cf5dfdd1420cf6e2a4506ed24bd2ccd774e68a04859c994f921dd942cb0a3c794221cff9e191eb3fb6a0d1d447aefa67033f52241af8910265c0c3f79a1e8edf9fb2e4aa6518f891ea5ce047ba6301771b229c895c39ab023fce2614f871164dc05fde5f0ce12a5e72e52e09fc386111f871c620e00e4308f79f46e4ca851ef0e3ece1f1e3f47180b7bcc7d8e1298ce4ca8f74fce8470df871b218e01e440e572257b385e3471f5ac08fcee486abbcdbb0f1a3572148deacb8e46ac66afce83f347ef4d70c3fbde708c2e56a1a29e0472f22e3473792ddf4be2386a310c915e501e2c79e25e0c73642c08f7d24040c4f22571486f36307ddfcd84a0ee0df7bab75a8540cf7a5490f15cd8c0400000003150000281410078482e178288e744ddc0314000d84a44e6c5a9cca93240782c8188290223002020000000001080026c8b0812082c1b9d3c4c3da5e58a3b9d3e213a6694d137a7d266b06b9a62b29e612326a2af429b68b6ac037f100ea066a2387132916a38293dace71f340579d3824464629064dbc9b1de10b74d1336bcb3c619ec84493015589e0b52678d73c049d168ecedb44ad6afa8b1316e993c627f58f25c22435ec45a3f78627ee513f942af5e52cb542424b59686ffce31c2e726a8d9c256d6e75bb2d3471b9fe04fe097bc4ce86d20ddda4857e8ccae0b563e1bde61c7356fa2fde2d9407cf85992c8369d897d1f7e886770c9cc98b483222221b987b58ea5148217188aa83d53a07c9459fa3d5498064032a9d12ab11816b6c7840f0f9a5678f2db9c334afe08ac4452fed064d60cdf1e18f0a0de918fa6133625c5f7f078cd68c127212a42a12404092a111112f5a69a636bb101d4f4f41aaeb659ee66abd1bbf19181ec47fd47a6904d124ddef2cca5343b950167bdfb2672785d7b39b22e7196e022e7eb359870a1f8d78246a87d87eb9577a94e8b4b91143683839e0f10426db8c4049cce90dbc8c6d54d433d6a544a33a94ec096038c37830291a6c4293560a322991520a6e4be74e23d8020b9621a4dc524b77a0cce7161f09d516abecfe10e01d7682564b910800c623bf5948bc58b3a09aaca517fbd51704facc5960c1ab2d552e8e84961aae8341509f21e205752595e6c82eb1bb57ceb30160ba4a950bfbf2b0bdcbaf6f06c110b2a1c275c03d499009fc2fb1c44fe0a7ec5e5b949d36d53f6894c7222f6447fcfdb27482a448d8596f86b036b74be0610628d7ebc51ceed928e812eda6190ef9d5e618aa05999b23addbdde564941933a77ba960ed6d60424f4427ced143d817739f99fc5d910f97c374433f963e7b97a0eae606b5abed56ec6b4060a0c37b7310013997ce417abc3778a476a35b57aba83a897fed5ae4612d69871b81818270961bea15daa90fdc200a8a35e95050a2037aa78276953677770c143611a54e6ec65df31b2a5c0c42767154789381696129198df436e6f39a12134b29aaab980747824a29e8eaed74d251fa22564eecc698bfa590ca2f6bd53fa701e513c3a4607093f4342cc8019541b1285551769d38b5520fac564f8d39cdbe2ef8a1d7cd90e4498d8a71802a335959a0aa8aefe1321694c784c1749c961aaffd6e38384f1420aa944c2337d6c61977752407792cb1210230636bfb17d6942111e0d6297e1b0cd3dd2222056b6535661c974a5164ca92e375419ee12e4ea82b7202717a7aff5632cef63b1c0d02d07d63923982f8232a01d08e7148137888fa9ee309c49068e4b9fe86026d669050e1102f0c6cb2da6e35c0005109352d1ca60076bf64484142888d71de14b12c180d60d3cc63b1edec7212deb3716ab6768640d46a30e7e46451fc3d3e67e9fd4097c06707a724c70495c2e55adec822f8276a76b7406a4bc14f4adf84b47c210f4faa899d867dae82118226ce6a41942865001571ccb62d2f6ca36cf539c835b13b8cf2e1aa252aa4815f9a684f57e1bf2642a43aa1fdcc04dd107983275421628926f12a3499cd04227d5e18788d350707c4bf68b2a31acc3b5864220e466ccce3ed2e1337976c35d6668ebe098b9974f8c71154eff15beafc9c78c6a7fa88884bae38f93148635c22add8a27171d6d1db71932a3c02705b048958edf2323cf4599476c4aec82565033c5b1cc62d42cbd8aeb917eff93c40a78470e1e58844b3d342d06f83da5d641a5e5f6fa6e55de06d91f6439a6f48bff289581dfb76fd1627f826409b995901fa6f9253e3e6296e68ae260b3512b25808f807c3d2b598a8d026afc9c866094442d316694a3ea17914a912a84166cfaa06cb6e2c1227631bd60d28b819d5b0431641840ef8ca4fd8041d89e424f5a808c37d95b80e5b82fbd5b7c89bc3bc7ad39151dd1a632fe93cdfd5cf4aa62ac7d49c9ae4ae33ddb8861cb9e8606802bbeeb4c18360fd6d180465754675ecbd7ed13b686dcd1b11dcf50811aecc772227721f67aedb9c9cd0489941914bb3fa83cbe06751cde432bd347d8d9a689088a40528481b402d0687700d2e8530dd5e1d2f0589f6619a4d0f292dba963fb1dcd4d411c42799200e2607760a9e2a027b4e20a8bc1537969d4939f03530efbd2f374ddd8094dc7a223199ab0a12e67db41aad3b0068f68d123d64fe2835efa4d9f09864113993745e2d2190312dd4277c7edf9c0e50f08d577a15f3a3ee6464ee2030f74c732711d7457ef1d84d323ae066eeb3ef0218d4721bf5470fd0a9511f313c5ba6497123ccdc8800c681439c3aef08fee358978a2bdd1645b65afa2caeee87a3cc26b52537d227c3a2450cb24ca6c1863cc3fe2f2788781e529cc3462f4b3d1db70a9c9fb917caee415318f951c890c7e739767b6305874367d18904baa31a22812cd714f616678370c0e27a58d07644dc047a1d3c4867b3afc361936843b22a1c147132318360369a73381e28140e74ee5b9d29809c1cbdd1d99dbe2845bf23c8bd6c47523a37909eda487d6d8a34572512707a6256e6f70035d93e858ac446152913ff885823449a1ea6603156f35209552b389b056eba9b6f5cb49c22ea7e2fe990c24d14c87fd48e86225221daf692cbedc6218014aa2f269d9e0d12327064a338f88785ec17b9623a64ef9225331a1eb6c28c9f394562f8208298b02c4892739b956c8a8731d01353c8cb5c9186084bedbde41076f6928cb928741228fb0a0aa3245ed8e594bffb95fcff263e441bc511256627afcfbe100a62d97268c06adbc4068bbf8fffb555fbbafbdb600931e7db7e7ecea961aa6c3cd6adb073a67317490bbb484392817453b759d43d72f084b1613536ebc141a383a8883479c67d6a87564db77e8012526bf2e4457f80cd0b163c8621a794b8ac80fde8a3d2bedcc2b5b6e9d34c961328e6b31592cfaa12a9e6084e307e250f6757da2dd6637154fafed9d7e2fe164093bcfc097c434b06efbdd4044c86340af9ed11cc7a506b9b06405583e5f7bb55bcce6f77cd3a6e4dd6be7f902325e96b4d5c0f7a7baff68c0d599710d4d8991b1d0520ce2f50ef1713b68cce24c7e6c8b30845802004396ea656a2b684fa9957772f44902e1131aa84f5eb29f8461f3931e822243bc830e929bf5179c4ed8eb9eae9efd8e5fc128fa17d1d538b510aa06671d521d256ddc25c1ee19c28d840b727d6e77c89399f0163b2e43123f76a875c9ef540eb8ecd48db93182c6bebbe09eb6fb31d1c0319fc2b2b9e8a63929c268cc473a839c56ad0c3576248ba8716fd3ec681e17aaf448a932b572933788999de2b7fedb060df2b715ad0c286548eacd0ed1030803339cbf01810e48b9cd0110fe56f90ebb8e7e9940e6d7aeec34dabf22ad6b6f6df59b99eab4991c3b0b69e920a19960afe5eca8da1db1e8184207cebd54fb28f5a4c3c014a3ea70d9e43823677a05f70cbc5acab83fff77bf6b4bb6c7ed12342abaece0e39ab9f6b2e24f1e8d9b4d37260318e1b784374686a016be18df9d34a6688b81302d31529cc0bfee68500c7acef185d8180679b6364f2f762e70df2617843d47c9c96613a3319a3a8a4fb083efd6311631d5d82137bbcbc6a661f2badb78c8c1434593a214157fbc5f996b0a9f4f2fe1d8931874fdc28f022d2b0eb646db6b93c17b2d72dd14f00a86f31773f4bb8692e8e36cae70e93dd82209d2b1712a1af17111682e6b680a260cd6d584f204cbdad39f6fc182414b9d8afe8af3b52e9e1c7691ed664e8aa13bdd50eec15a18b368bcd09b3b53b965ec156c89a47fd1e50afca9bc3b33d84e4daded5e4d5decd37d58380193a2810cb55643518422fbf48cbefcc475fc6deaa644a732fbbef2758a8a3cb84d32aaeabc023cb9c21018ade1c287bab0dcd162451527a9df86f21f86b50637525fbb67d0c40ddfaaaa3e38d460f9441dfd129aab01e13f446fa45a2eadd7f1b9c35d9f439565a40a153d95133c3b7f44575c28ca90acb38079620b1953f5ed9bb7d6c3c7cd0c978e10f39439c8f42a3b3338fdf333c0d529949e8ad1465ad000a4c279a44099e0412d2ec9b1094221ba4adbd7e7d0d5ae45e7a5b373a18536ec665c5fa176984b51b5ab70e39a4ce58bf59c140843d1266e8ab08ae1af8eab6c6c13adefad8f87128ee6e73705c3612c4942f0595ad8994e76504ea75b47d25610f3af13b2092bc5c9fddbdbcbba3900b996e491000737aae62283479b0688ba11e2bb6eded75919f85215450ef5bc69787653981589f9debabaa74ce43e1b34b5becfae029b45b19f591c2ea29d7de18a6cb5ba10d3bc051daf9682aa4669f6dbb383ce4c51e497c679c83e983da7dc60ab1ec08912692b7616f4d46754c33170b558123b9baaa0bebc87aedc57ee6005fffaa4b0b9d0fe23da695a0580ea8b329c9a6dbeb528c367eb93a387f8150a1f5085c1b6b25dc492b7e18516da915efceaf786e0a31f9f597353d2f3e4f505d150809c1a892e1c308c071b721da237045a6ea442c119fd250004f6b24eb15c228a5ee1d5b1b868a0945bb5a00b8a43c8149fbe24d489aea127a58eb14a139fd9e5fdb648d3da33f2a39020a462d9100fc1a4dba04df384ee2796feff1e0b8153a12ace269a0b4fb0099c571b2334c1fd404d4218eaca8022d9da3399d6b9c3a57202fbaa4d443bca270c6a0834b51e9b3c8061a6980424d61d3e3a89ed1829a02e1d5d1a5f94d19d80e1ff2307998b9446f0abf0496240f5fd5e510369fc82a1f9847b9b29442d7e58c21e90d1c5c9cbdae9d14a05f1365192f1d2bd7cc7a648abd9226d3cc229604e082bfda8871a21e10998bed29dc13a047f432e3ae57e26babb4b3232577c93886ee14aa4d41fd188b3e18443119bb5869e1bdd4d87152c6b3352ad6d080f255c0f6caa125d29a2a0603a09d3ba8b8d0b78a5217ed0625c41399b6662e8c286250d97f2d46e08319d11592a60f06e691f8d175da8e60b8884983be692410a7354054eec055d3069fd9f3863bf028ff343b7bf4e7868a49c33a2c0b4babb32d89d46be16a5458fc7837056f9c62d43dd24c890d1fbe10b902805708fc3431765d882f716d5f82e5ca29df09480ee66dd9165882bc9163f33b732dac52e8719693965e99c7ccf1c388c1fbef500d7feeab082c60bfe6f1dd52aca7ecf4cc6e5100d933830bfe6b4cc9fbfb0a05268adc45e7657e586564490045cf1e2a45f8f5857a7cb9b7a09cb69418e669ff727ba202c8c55f925761b902421b77de31c9a57b1d61efac920b3bbca71ef708694137b4f2c6728dfe760fa3b902528b018534148e4ed35242de3139e91061d5ce526b5d29f35dfdb16a3ef995ace34108adab595d20a40430be6d070fe99c9a60e0ea81c2ac1d8bcc433f04026f1d8812e0217f969b928fff94619227f0b20c6988766421573d0c573214941ea9b45d8bf2bb579066a96b7cc2b2010888c031e801027f0d16101ad0d0aadc147498684c62280fb17a34586d05522fe4deba0aa1593f76b16a9eff16ed498d45898f2c0f0f20a40f9fe50e7f7f9051f4c76cf0d729d9e2d42f0fb625ab53a694ba0d320cd74d5e0cdc461ad1a7b24c88f72287d9ce2fd96fa8892da6c282be3aca5ae0850090e6c59d0aa8d85bf4bc539028308e3bfe0fa374a13dc4b193f3e62735c17b3422eac3632e9c8098a54a24e3f15085a784c85ab36b2fb7cdf19a86367320abf6094d0f8b9ef2c4b05ad0ee4eaa16e8ad300db569b04970d65d6fe450592223bdd36e9b7795208146d5c36aa6ae23ed5e6844bfaa270384f6928a697228044776b6b4b5f56a0521f79fd4b145f1db61c4ca67be958578c6d329a3b58e9c3d568b1a4f2c43520f5d841c5579d52151c713cb15fb1ec3d90df5b1b6431c649d96ef214d630a229c769cb402cfeb52f171d3542f55e57f1f07c3fe14b47202ae0f809c6abada25a90bee956155011e40e4df8a63fa3f7105cd1f86f4babdf2b8c34a8beba8689d8d262f5aba34ee9d9c1d8ef35b414cad3668cc0cb02c34e46186aeb2f28f43c8314e0d518c7c8c6480fd96a75b5f0243f367b2409899e827eb850a8fbdbefdb412f687510b19af4deec99f2bbf5710e58a0d234176341bcd7f44124bb05e60648a3438fa08d36fd74a152784db4aa8e8baad8ec897ca1e43cecfe2453578420c178bccc1b6b7c99dd4b9d29436041a474a999162d0b9f0c20f192a199a6a255e7444786166d4e085fec3ce0a8cbcdb196eae8d178a364507cf98f474e3913155f42c8a80089e6fe48c60f1948fcacb596ae3c7104a4d52060143f90613fc40baff0c317bcd5f0f487cc6a52c2872d585be8b1904ba6003ea9ad7237b21a634a2df642f254e4203dd2ad237d3927d971fa267ca942f3fdefc40bd9a20739ead3944478dd2e796e8b4ccdb2943f9a4b96548978d9e08bb07700f96dfe2494029641ec90108e4cf1c1a384168f40734dbadc909217e3137c87289e2d30099b37931d8c607184c329ea63ddd901751d36381a103bc5e3054977ee0153f24e2dc28028aa3a2c498f94bae4d60a0ced3e1c7fef0e0060613a822cc91a1c3bcd8ce521ffd066888d3cd43b779d20dd02f60c501e29b4ccac8ce5c57cf19df2b047c26fcd0c19d62de781e66cfba0286883b2942c5c7c2e877b20701c018754c85e157c00098a26ff33b6443b4a3bc9cba41598108989ef442f58c062e3fde709402385e6ddd8d03ff70f6ff0f50aff276af010316c96f1ccfc2bb19dac5cefe44420830e1318bf21b558d7c9497e77f94c553e8b77f9d56b2e75de3ef0e6e8ff1b3fdae7419cf5efcf147f625825f965022b14d113462503fa0464998391b89bd16d28e12890428f2ad90915cc19d8e208765b25acc0bd461b4aa9187e996cc91589181f3673cd490fd4673eb57b879d3fd9e658fc33d931ce78dd7ad9e691b413d5f5b1e33dcea328bc98c048d4e5959eb4f8db94628c90c74d55e1d5b1d0a646606b1ef8d63b44862c71147647fc30e14fc6954c872456b011ad3489eda77c54c58b04c8dcc292d8d992b11e0cedaef19aa3f136ad8a12cf25beb540b26580d3271d90fe628b8e01262091e2a834bf2e32c3cf3397979740dca8a46844b708e9013a1f90bdb0a415c9cb7e5b5a1366c1b55ef6f2caea5196e27fdc55d76e05fc047a83fc046a83fc046a83fc046a83fc0f44858bdfb2178a313c12ebd760f6a0a2abd5d819fa52f4d6c5e592c826d86d238681d3f817f00b1a2a29d1f97778c2d46d675aed0a4865258490f504ea89c4916591befb5a376171a190a86efbcbb34e406938138f1445fc7a97f5b298a453098baaaa73ab75218c9a6ac28b2f9be58465bfaf1576a155cbf6554d41d40196d2cad79f05cdd24d008f3222f344cf5f41d46eec655441d2f7215c96b66b55f3414a66d2f18aae65948061c6abc63d559be6bd4d0596fb1c988533256b3284169cfdd302a406959e4ea8d4502b44e3499dac816800e2f5ae5dc4e4c62cec6629aaa80108b30669b7cec60f0ec4e208a0654d5c09fca2df1602a0acc644a51cb9b0d73a1847adaafbc9d57d511a814b534776f440af70804520f1fe8a14fe82ed156476e0fa2043d8582d787b80d00d6a71f54022a8562dbc4a5f1c9da8e268bb87ffcc1a1f76cbb3f913629d322e91f074bb4bf44ca077846b032b9b5b27e08bc88c3094c1f04d808732df59042117288f6d24a621f4c3bf45d9fa7075f09a92e671b461b7e2cad21f9faf8416e4725b8b6b69c5d9f775a2f7f9199c77755da0c9df2183e4aef5b9a88c7ec343c779badfc00e876bf908c8c58b92d6213b532b742823a579c70c6903607e53b972744764209947ac44805acacf532288ec9ef6c55591aeb677f3669801411ebe2519a02544944333cf5f990d4c2290b651a65ee680a523b718e254d38958d6399fb0a1e10a4628d29965f7a503fb93579e217baa83d07271911e602a8dfbe60c5969e62be755069d4d615bbde5b5539cc4a653c6833fc56ffeed7d257a2fa78535f35752cb49824b01332f94ee21b93b19b3454ec281bbaf723f768643557deb0ad8cd4549de1ee3fc17cc7b82a4239267c6cb96f23c1403be7cedddf72ce789b464f29bff995b7c60462f5c9382b6d21a9fbbd25bae7716aebbf415b1db9ad3ac39d8f82e92e046f64212de0d5fe9047a578ba0dc18d584a61ec60cda6af29985fae6c37bc2729391666960354480e20caac31919650a048d8c114b7928c1aefdbdb403f34de6b98dc5e7d6175853a1aeffafda7f1fc1f972e9636deba6ec62ab3f160138f8df96b8929b786cc0e57f672e9d67ab7b6325aa9a5e4a2f7c5d11128b975c7b87536b56cac590d57776aae6211b1353194f94fb9f11e4b416fe501069850c526563138635950409c6abc2e88a14d845d67026561bafd1336ebfafb7d9fa8015d74cb28e704253da6513d72b23f551f186b82b608c0118180531faa75336fd9e3642e72a4ffeab86522ea3fd916375b69a1ec2c59e881dadaa1d3882e066466da855f12a45a5a7ed9117687771d78b9cc89adb869dd454436d0fef9e9eadb620b46fb4dde6b4094d1faec793bb49aebccacfe970f144fd7cc3a38b5f46b1ce93a2cd7583eb22ca5ed8f84ae5e165e66f4eeecb581d5246bd80ff5e624f2ae130ef8272b91e3b42e614c86dc18879ce081bfafc33111bf041344d34457a37f9d0a62d44e7a6d813535ea3c68b9945cc2bc3a01a8e705877f18bbd9a819f9f282585c3be50a5cd30e46b43c66bfb860434b20cefdb363a1f9a2b21c81ede367c412430b269803b94006f1dbb00b27f603c98c24160e24010349c46bb9843dee0544339a58b88061413c061f881639d6642816a70b10b37ec2ce40aae2de2bc46e735c6d8c4d0c1e6b620158831f071b34d840325e5d8365e2f937aa1b4a4fa444f6e0d30c10130102c9812ce2b4af396cbf364daa93f448c4ea9f148f91a47897f2b167be541ca39318fd5ede0dd91100f3f054f1b7500fa6e425f5d62c5a56624e1f5e5e776f3319448f7d6d9936ca8078248a467cca3c4db3bb510978dc500ea2ba9f7384509a4cbc83434b9a88dab2e21542a208c9932c84fc0abb7dcc8170932150666de39ad9ec083f1e0f3519c3dd508bab5e7f2e14112cb7a7f8a2ce150ca08e25975d77f359a593677759549950616965dcae57e1acc3605dfa971462313d51c07412b6d35d9f61ac84383bf066d7d6c9f598041b51ebf0c94c995d65391078ccb7cfbd544716d4161d6b8e8f9a17ec769fdbe7fe40cf8c0ba68ae10d819684421ddb7d86ba91dd359cb44950f2d10f243d62242059f28032c72a683743da271aeb274162f6862d647f6c0178d50cb8e97a3996e0da683e584d67e97db825e80758748e1efb4c9bcf03c8c729517f5164d7d9049adad2c3a5b88d01ac009999a6ac7e3c82f47b68f990055422454be65160aad465ae15b964f3d7d9e9d38a0f05206d0566d1b27da9f16b8f2b862cfc96e6f1738fb4a10e8610b80eafb0bf2179a7d895509c0cbb096b704f66eaabde110ceebd29ab62c30196a0155089d8a6e80014d84f5039332e458a3556470bc6c5936ae22ec84f910df06338d217d0360a01925e876a7d14325e2933745ab6f6cfa095dc395ea886552e94971ccaaed51d4c54790a12ce90a13cd29141252b8705182efad771bd4819174a521a46466cdab3b6396afea2e51bdaf8b877bb696f2db9f13996dc29a5365dc373bb7af8b5769d19c1ec2a375c0f1bbb4a14a2d3cba08a7711b37e54b7b59291aa2e99b7d6d5fd1ceb746275afda048a14e46527e09d413ae9e6defc92d5b4b8b37aa0e017ada6c5b5f727d3ce12fc9059771af0efeda767820bc49a9a749eda9aff02ff5901821344d25e30301550d3bbda2ea025938464caa92f14cd1523b764e962660949d2f0d50709413b86eaf2bf47a8cd6011cd6d657e382a020be34b362025829d67adf1797d199751ba72971a9e6bc4ecece4bc3b532661dcbec41cd804073325481894a791028f202244600e24680825433c9013bcd9019157e2817126ba30da5dc0ca96d81f7d37ef93a565f5570d0f5db3ba90908e4e82c1b5c845544ca1117589d2519c03b000a440606121c74473f681dd77bea60504c0442ee58e3a85438a0cc4c531644df31a9728bc2bb21bdcc89ca5501024869688e039f260092b584623c8243200bbe0c56e7ca5176f94be255a9ffa7b5647e5c80e3dcd05bbdfbcc9ed4c19cb05a17e6e8a0e96263092d30d8bd40e2433715e9b0d3801c4b4511383b3ab952d45c3868e95272a84a35812e9af07bdf729652c1ffef4a4bdb0c1f23cb0e4cb49e2189f20034e427135386f15249fd2f2b07b1789eac4cc115304b870bff39f493dc42e6b5de562457a17855a14ab486d1e45a13401e90f8d0dbaf662a1a0395a4583cd49112759e222f53c32d12961e6062c1d48e93cdb278a2cdb90c9a7d5f565c5782473c7bf4f9aaebc132844c209559b61852e16eabc5b72cf6c53597048ce57e2e07704446b0ce1140dd1e58807fd82b71d66f2a53d326e7237c67948b38bf865921f38e37f36145a4df542713a1c8983d711147b359dcacabe0a40a08ca17422d214229e066e81c1237bcbc46148dc8efb1e4df85a3ff308e7a098468134210ae3ce7a834b9935560b04cdd1281a4c4e5634651395e9f508e7e20cc2187800081958bc997f122a682aec50310ba516398b02d07b61e8a2fd51dccd043bbc099799b0cdc61baca6b3a8606d52a13671304c53a28182cbe73de09f264343f1b4501c67015854ffb94727c0584db4f04c1383f651dbe5307e6e880e27dafe37944b0b99af8bd0495f9f6f26f770aa4d50da630da32dfb3c1ffc4e600e116ae4bc7e8938e4de625bf364177c9b0184153b884ca74fa9c9b3d9cc4fdc46108b2e69f3bf1a12dac6bac258350ec5826f89802d69060776292ae3a84e2574a933517eb550601b29119f5b0bd1d996943e374b84659ea7e58cf6225aeed1cd51f54270236e99602b1402b29949101c8ea63ad0db92f09e3493b3324c883dc1b3e29ac22371658a724db07a24f807c43f481cf3f836c5a4e5dac0d1c2364aa8f46b54af7be76eb2fdf53f69e9032bdc0ad36d2e3eb31247cdf44636c3ea379f4b295e815d361a295c2a943d9c43715055cc145a22a16d6a67ea4144e3c8e5951f6db32b0cfa5f9c42e8078356384b22346a9c69b410a75d6759156503509a8d95de3f8604149ac537c3043669d3b182e3946472dbb131b333ed004c90cc28b0e576e4d65447c2e80d49a4e5e53f6fb50d0b378f89d9ee1d4c9e2c671ae965c758486d0701ef6d9bc4408371a3b5b78dba1952a3c6882c085c74a5e2435f22f246414c5c9ecacc691093d997d6774184083b4110652179aaa679ceca9e3425e6a238e02505276f7e663c4f38e8b18b2045a3fac2218c17d25b6a67d49418e62930d1485328024e35995922e1518125587a5d15ed0ce620c5c51a803379037f785137a05aca1886e6478b7f4fe5a5fc23e6a765e7908cf854b9d9d27ae648a4fab64c51097437574074872d6fc3968be5ff6276177899064d407f63867745f6cc3625d75ed81e56bbf1f119f76401044b0c74de4e121b3e502cb3e4080ca27b5c1a258105ea784d138bae6d86c53373366712ba3683512908e51c5d5e91772669030766477fcda0955daf4b2255572370d869ae24992e2b7585018cc066a17865f3a3e0cfb11f991601fa4ef8ac4ad833247ff4404b871c2f553b958580ed9122a72751f8ab539b3a525f5055eb6ef763960a2813ed70c117c1c49f4378c81fd3b7fcc21ef3146dd3e537e882a7daeb2b46d20de4eb186ee78dd17b935d9b1120e75b0de9c72e769823da614fbf941d98294c30cf52502caf310151ee4abe82281546a27c1604af176207fa82fede61f55be112255e0be199423dd56c8c04616d86d40dc9ac719f215d431886484bcae59da478590895d668b26f7d858086bacf67463794804aa5822e8d4c87d827a3fa00c7039b07187f3aabefa42853f12fff645c1af0dd281c84defa6c103c27079451745493d724dd8e91000ab3ced6c3c5e8d5dc028d4b87c7fa0461991821fd18860ec6a86189a6fb5fb88da9d168f2906b9d388364b0645d39bbe5b0bf1afbbfb0c0c7d0c6d35124400e9cf5277d86677883e5e28573d5584d4d3328bcc2aa8ed441f697d5c20ba79c1026d025c749eb0727fcd81d4c4ff5600c3bea62cab7b2bc2fc83e6409dd2d5b670037190c86523dacb07068c5b0ab7ffdce1298d63551f4f2f004341401705e7c7a9ff6399c87a3bd9c0c7bcfe16fd5cd000d3bdc676828c4894170f1265d29edaf318cf1f3a115f76f45d6ad4102053738cb8b40b06abf38165cec00323700c18806c008dcbd36a56603d6dc5c7013ea57118f20f631bd0381b06c2fc1f7b83aa5a7c9e6ef0e97b726e88a173f94d7c08e560c2a0ce3caa6c83128305395ba9508ec1ac035bebaaf8b1124c8b79e7e5b620dc6176c01520d9fc3d7beb0ff0f4a4585f5f558191704a007011d439c1b01819886b71e053a7c462b15d16e263749ed775cfda1c061cc59c1fca9ccdedbd7e5dd6e546431189b450d811d0e8ff34651ad24083b51308c6bfb7afdb1bb182141018f25c2f0552375d5a4fc3e5bd1771401a02038d47bec48ac4c11b5c62302a8c7189bbeccf6e5e2c52d9eb8628b25b6d862122f6ef1247eb0c42e268a9332ce20a5faf2c73efdfcf34f7dfefc671f7efea18fe113dbc702ea6c95af96565c0798636351b9cad0f67f6d41c273a363ff63103ffe664a36ba80c0312b5ab1d23acfc2ab9cd83e0d373aab5736f4c78497cd7aae00c4a8b2f46f4ff9af2b961e0fa7f9fb96f6370a9b187de365b057ad8b7154ea01306012666d8f8b81662222079152a425b14da5074df599179de06bb8afd8e2bae06c5ebc757dcec29202ffcd9d4f5abe14413689ccf7a089a382d6291d041486ae0eefba76b8afa1af2f5ae1fb7cc01456966208513386b81977ef2e3a531f98caa6c63766f4d7fba9a826db1fe8ebbfb60a3fe253bca8d6ee8f5797a0a88ae01791eb5f5a851f355558546bf78f29a91642f3561039a44f80416ee38f497bbda866fc8f873f5054b6e75786fd77eee25f2f1d155589793fd0531197b8a242f07e61dcffc641fff7c6e445552ebf2086c4a2fa1c3f35017feb20fe7bc9c4a22a17bf0089a6bb0e1405815f9803c02c9f08de38e145f5797ed546c1a25a233f36167fa86bfebb49538369b8413be987a29a97bfa58f7fb43abf2b5465512de71fa124575195c2ef22c73fb5badf29a0eaa25a8e335a47f4a22ab57d1aa07f5154ca8be92bd1e29de05254a5883c37bb7f64308cef6e8f0923ba850f273412a7a1c90716478348735165c0765d4a6dd0faecdda25294fa0e3953408ab88c44908681a23af6602657706745d5680668065725e200624d1362511585da00457598930fb76bcfdfa1de83b7c15a36d406cedf7fe30f5854e52544b098d0eba9afa9b4a3df5fce50779a505021f758d3522a76a43ea64abd049ebaccaefc750aa022281e53608643cba2cd4ff027de623313641855c3944479a40849887063537e38a09014210911163b718bae0831f8abebc3830b6618bccda9e414e2bc4d1432ac993daa83ac3d0c460f89f59daf46414d2481e32d0b0bc30d863131c4e165c64b1226924e4c142ce2c14863eb4ec134b2c1d84563abade071f101cbb87fb91a0af5f6d2f0ea5ae395878d69fadfc6063456caed9657f7dc683857a68fb084cb8c61f10e50075ee6166e654e562978ab998bb15d60425952e8256ec74d33d974f581c0aaa20ded7be17fe8f4fd3188c55d45f8578d08cdc8be21566f3a994b4b04ea493cd4efa3e2804853ddced05a634b994310956835284bd5f070d205cf552a80395f1203d9d9d092baf582ca301c1368359d57ab853d7ddada21732149a83c3ecda0c1a42634a850351dc03f3a090a412633cfbaa3cd4707708929ebdb65dd0fec1699b6699587fe8b7e4add661866775dc7ea834400f85d05e095b0f917dfa2626dffda9e0edf34db3dd9784d780db630addbb41a437b93620c166d3fe326c9c0595d5b0a127067164f327ce9ec9ea90e20217b646180e8a50c70e25f5287947518db351d534d5c16ea7faf28609926681d84f5a6cf197381e1641c3aca72a13f09806d65ff9fc44228b0a54cb9a5eadbffa285457e8e86ceda4a02f463ba83ace233ddfd4bc1f9ff9b80e5dd927171015627158f756aa528697f1d13b6ad334c23ced898d7cce5b88ceff6e1150ea61b2143f6a966847c76991ee03c6e591886f5046a6c6f1c825583b6148922e24e9f03070807259ca2ba3003cb36927630e20f50891a6497fb43c229f920ccb6cbf9719cc1ae36105b34f44a1e16cca18931c6ffe95bcb22202f4e7a31f5e1752d93671e93944ce680453c11dc88d5e3000bedce57ee5449a005483a9595f5d3cf1828cf0f4f24aa3e5976031acb920ed6c906ebae297cb28f348a00311df8985115b2d4da683b06d7497dd8ff8db65de85481b4f99986865502852b9c696a23327b219bb5999c47d5f9c4145da0cc3cde90a942c54a4e1d3ae7b1fa9100b5400e5f0e35bb759e85193edfa7d32c2d6e8b704d2542319b2435fba850ca9af7a122d5a22e2dfc10af5afafd92cd14da9ac2aa9b4f5688c45d69e1f87c9e2e13ae0e8891389ec3b5e8768806688aa3b5b6b95084e5051d0c1e8c1e2264b45753f008d22c4c72b8b28b9b7a32869316133f50fb3cfae0134185a9792279e66c52c489e4ad3c216db83fed064e69b71b1b7672f6970f6c5fd73007b475c1f4166e3453942e22e912b9d1cc8dfd427902409a712515c5827953ee90f924736e7c224a6136b4db73b3b43389281a2e85368b04b3cb7074fc464bd6d54be8b373a9ea47dfec36f52adeaafafa998d6d51f5d2223058709ded34172478e9e2bee1a2014a6b99eb2e89a0a11239cfcb75ffd3bf6f03b48acbfe424d342dccd3b50a6c64189e929cd68599acf888b79d85cf87ed8290b475fc02e786e04228a5ffc83ecdda5c8052347c28065b41011294a3bb76086809d5504b8fed20095dcc21ab16acdcdbcb3c441bf65f13a2a622ae4949a358e8e9fb14000f50bbf1d894e57f3feb8b85a17f6f64e83da8b33fa103f02def35a2e02b0771397926d2bff2137a6409f0206b51998a22d84ca3ec7d92500e2850f24e3f93966311a9c5a3dca2407b3715fb1e4e19936d5cc9e196d0e5604b3b5b83515ec838e9dee24d2133b103b7b595c8879b452b4527baf2179f031429875eeb36511925dbc2f2be166878120a9230573366577ed99f0430dbf05d4390cc0992e0fe72bab36a9f8ef9004d301e4ab0622f70a0de2c0b2589b460fa854e8ffaece9dc46c4a721d02a07ceb0b53545656649d61de84838c3d958a05591c83326ca3f937162947f513802bb1b54ef6b594b60ef3c7dad39edaf2e0f20014ce016cc2548fff3cbdb11f034b1bbc1e267aeb58e67dbddefc9d5c82cdd8737646f52b9994fd3d33246ec64eb3d162f178c4b861590b1e31e44dfa211657731a766024891b874ece9e7b0bb09b493956fd3a13e698664453d79792f781f659ac1af4092506fa4b121d2bb3178b37d29530dd7cb9dab90362eb7cf5a3b63f5e64621db0c0c48822c2343577d980e9389c7260caf34fa777a89173696917152bc59f78f66d8ad47331195d8c1b7b747a322b6c219e63e92c16ce7108ae1070c903b84d29c030573c8a1a850e218b5673eda9452962ce7dad89c0120229761db9464cdbdae629bce6d13288b27523ac42025847088231d3f7493363e01933eebaf9c8579102e367f7a0620530da511ff5b5c75230015ed414ec47467b953a55aa6b5f74e7ca2181f064e262639a04b61022a11e9cca6dc9ab0188f448d973bbe43beabe01d8a5eed3b4029f721d9093a3a00f628da2bc5213d09de951e8eaf1092b888e09b2fd05e715a2d045c97c53c86037c02e4099afd5a0a2891d0a766de59284a11f12ef3a3c6cbc858c8546601c24d733b0a08c755d011e183aa96d2438d233802b454aa1a1c8b83092cf4397bc5bd45d75860fa8f68edf0d1bb10c1406518b0c40273cbf0ee28c738f158eb724a39271cb874af21a9a0d6044639c5e1c94c663a8c3f12983732b845bc0340f2c38f49e0e850f4b802a20f0fc3bf6d888a051b94abab5a584d9cb6d6535eb85df5c6c6771ea170642f33a55afd230b5f30108bdd4a5211b94de5a61a4cb4bffb68116a7713a73173d9a18536b632fae2c76aedc2c58ebfaf29632100f0cbbb4e0671846e461ccb2012ba22f658c62059389005ac2f1532f4371f28b2f9802e5dea9de4c2a2fe6c51d4a494285c76381edd2db1259fd2fc01e0c2785b36ab51b772c005b4bd2f9aeac05d67f65f9b2206e3ce0025a484cb277ba3ad0ea496be77bc9f1fdd8a43010ac1c3d14bc5931119248d7a6fcac114d98f4caa325fc700b04998336ac29c4df4c15471779e6a58b85fd74cac45f1ca3e8cf24916ebb4a53641a9a0a02547a0123fe229ab79fbdc348b8beb1f43236a84d2af52b28e51c9cae2afbd5fa80f0815e1bf8864fac5864324d11ff23fee168acb6894a6b95a80cd0ffdd3ef504dacbddc1d5fb2a93e0a03497369343b1eae84369c85e5995811847418cb7fa8e98d9ba0a79d19f13f9f0ba8e3df1e087c603a75e0a91e5e0c58213a54c512eff3434830546d0008028183c8aa21147bcb194fab8d7dddcacd0508599e790233d94c83451727ebcbccd5154592ceb3a2c9fb353217d8ba443bc1dafa47609a106653450a2b6e5a56937f9bc3b8fa4036a96de62ae0a9dde4147e63c3c4aa19bddb7a914dbc672b0cd90720474989611d86ac38f64dab56da92d9c65fd081652596f7f219245051dc8ae2b56715efdcf6e47de7493ad8c34632893bb40eef0f2f5923aadb8ae669d805c7e9dde22d2a71edd9ddce4bfca62bf76cb7f7579bbab2f893f1c23c8dd1892967917372f2801051873a8a1270dca78eb7490ab35454561bfe0260561b2d9a018d9cf5c6f875608103c757653512d1e2d310fa1eb8c758aa5d5f1534f05268038f59c2a9adb4cdd7aa4bcd9c1b89a2f45ba26eff4daf3e8f7f0346bb7f9d1900271f9de30ed68a6689ed8ad1d1f0284d414dc049445d499d02b2c8cd814e6485b4978c4620eb10155f03844d3f614a17eb721609a0dab523dea10002b9c2f30b282c3e194b0a080241ffcb6aa5a7906e56c106247b345c79ad99cd0d77bcdba62b6517881fc2d3e68a38759046303e9f13e60bf2839dc2ac80a3af720f8decf00be2ac2f24edba775e7f7f55a28e4f47efac3211bdbec861f382c9536f400b1152b21448fc8449596568ca9db27da58a95800cdc81c34f9996b3bee178bb543fc9f15b0cb93d71e50cbbfee921c0539ccb8fb604bb458e137f446994a19e6daff1bb95e2ac1000a68c0c4ffb3c35a3f7d3dcb64f92d27da4530d0af896a2dcb284f0c268358b278cad71a22a91893f279316325558ae6e381273718715cc57922ca8ba14913232cde99fe4cdcef6a1c6d84461466e884f5e1595bd5dcc5a0e589805c21ecc01b403042f2413b00bd91d21ae629306a842bc03df828c3536290b2eae9204f9347d1552fa0bfce5730976e6cd3c071f75f9ea3a5dd5ce0cca7194f88f321e28c180590c1e5058ecbf869f1dd448c2b6b64ee6081da68077d7696e51235eba5fa3d7ffaeb4b93c9eac023bcdbc093d90523404d6513a69afe5996e2b77770809cec1a888d841f830329d8251fe3f4d42c004ab5f1299157a78851c95b926c4454dbceda937eb60b67c047919299659d40403ffc615624060ea298285f89ba4db6f0d53be7f3870013c4afb2b94964d6fec76ac59d87e7c5c105c4659d1a86e48fbd4f0e12d3d473e1890df86deeecf351b96f99dbaf00c3e8df1e3e745757bbca6f70110598040efe891569176fcdb7fbba10e7a185bebc5dfda4a3fcb3fa261629702d04a3e0b6f8e8223f8b77529b7ef31029c17fd83db72dcb1358fefd26c912aca196e02de55b07888bc7df636a36090cf1d65a8c6d6491ef340691764ee9f558020b4a8ab75ba7844759f12617b68dbefe2c9f340f1751df32b8b95fb3963e2bb14327b515d84926c77dc829bef6b56da5559806c639968acfae006d21f045b5b87ddbd05c188e2e4341f4074ea65e797bfd0c1e5e3186fae4d5700a32a6d1fb7e8cad5135823f601e64a808563708f347433a0106947f8ee8729be53b941806a53c2a2c143a5b9c1b1ebb69db95dc41e898b49c726c31a6aafa66875b9ee49cf881cb45f0289b578712acd14b449f29abcf505ba5db3982b6de9d8eca6eb0492db485f3bd1c13450d81997c75a9e0da23f35d9ed2ee47c01b98d4d667dac47b09c369c3c9e8149b780b65cd5341e091b9453bded50e2c02697aded79b2dadf5c4475b77dbaaa3d35e95395ebf43f33554212f56e79f85558868b53a7ed1d4d650ffa87854c0374292e0e1a0dba19a1528d49c58386cfd0935e51d1bf31e71f0c0bdee80a88096a39989c2a22f043f9a407b7358d71028d15867f70501bbe5f651af4e713115cd8cdb2796026fbb8f30d481092dda77254e7a06c066bcf7962abbe3daa2ad19135f444389bd8414d3904ee0ccb0420d0ef7bacc7b6a3037609ee81e1431b3a853301722f428108a947cc3b1728eeff223045941ede4ac2c204ed00e4ab907e0f60e6775b120d7511f51053f0a248809386ffab9ea9e6a558c0ae183cd83e4f02d9a658b81ccb3b150aed7bc891de535d35683ff0d641f7bcbdbb8ad135359611e115dc98d0af3f3dc0d4e47410092b97e8802d0364ed9d8ac1da8ebbb29734d5bba66e7e61bbcefbdba43382e637da55242d223674454e06e7a790e4af4c3006432a04556ef44e477f89839099d37c55dfb137a294cc04dc57fba1bde3246a6c09b730c05e4bc14e0888e03e8e98031669c22efdaefc7657808f26bb67c8d7e0e60d9626f757ead7abc4b3f390a28412f483b2b144a62a13ed45a0cc1776dd2f12af64c308317d84d44b0b2cf35c0ce5c451b853990273f868e61e45bd8ffa1c36bc0b32e5f649df4302961373f41078982f31898031c874e8941bf260d6770cee26a8a63332028d8f227aebf9d88a663c7282c13c4efc3d771b207de7e4dcb13edfd4cdcdd10910aec3e32c32642ce0a001525eb84c9445ae298887028858e0b596c87b6b70732c4dcdda952074fb0ecbad4d6daedf54558129e4be0dc401ea0c8133d78c2e9b38a8f5606a1ecf09f21735b005b35cc96532416df9c59b119ab5d5a179754a58541e559a38011e804fd38eb961d35ba8e4356d4b95f398948ba3a089928dbbf4a6a4a019c1b6cb58117ef0735bddd7db606195c86a0a12313f79733fd5ee5be7f77fdc45ee577395fcf5c1685a8cd0e6f745b93e6310faf74edb53ebed3cb58804bcc05c9492551c8af736df47dd149622392475a35d911c319c672d4790aa150ee22c4e0ee831540d778f239da23094a133a6a6b4b273fce3e2085378c17dadec1ba23ff67805bfb56e4149587c3034e2572b91199ac03a192453ff58a5e59603e41a2e44b48de75769905ae4f4abbe8abde360b0cc154043f303f56c0b0223a5195631f81b1470d8ae73ec91edd088f5385770e63711f49cc581d6908e39773478d27d852b2e8472d231dfb5bbbd4c11b95044b215ed45391d05f1a19b099732389249288fb28da1f177791da521411ac0fde1dfd6ee708970116e830b4f12eded649cf3df2200ec9d6be3056f8645a0882a4d373f5e160b17ba6b0c4ce58b9698bb30976d1ba35ce081337e216fada5455fa0f86b11443ff6585c513d5229597f6112e087a13617fed675940fe82db72d0be8f2d20e19cefee9d423105c3898b391766b7bdaee6b50a82dbe8ef67f3e51042200843fec507d3d36591968bb6cc5706b8d3890a29a4adc608e091a5a81216141b5928477969a24d198d15cc42504a8c8ca6654254f592413f6c9e68ad93977e333f1cda351419877769ea492484d80a6e8ee9e79470e7786360b8feaaedcaf7537e293fe2823c464108e82e0ccbe544518d9cc7d481ce3a7a26fafb427af7dfbc83ee57ed119f74c82e5ee1ee378c44c7f451f1a25424a09e20d38664cb61b3022c761297a68e315e024b636c0fe86e1f41ef0de2dfc4ff9a766a360f3f34fe5a7eadd27915ff6ff467c00eba581b8b369cdc5dd19706c06c060cce04b1d0f22faa056c80ffab6d9c79061975faf17573ece50bb8dad1467fb29deca0c98de02f40158191807606480eab53560c37e6a7136f7901ab8492f2fb6ed0b2aa422dd057fd74a03d30d287d0e8f06ba77469c01f0b1f46ef1b9d80d98bf604ae5cdc6a34d6e036641753f54b72ea4daa5527e7abaaf866eddd87467c7d41350d4463e16b7493c880d8c9cac01e23806263aed6f3100cf1f9774a6f98cc56c561bc793a024e183d9953ef5a99cd3568eb9ad8be7802204e865ea70e7d0ead14ca4f82430b6d4dc880146bad27a215f2f189224f2834da0ef3bd05dd5bf2709d9c4384968d373a278d91f1a4c8bbd05f0878741581689ed1182a008b164710ff514ca154f29df08c3593a8d0d975435dc2a72d81843e6c3aa5839a7ccc0f9fe44351ff3f1b45acccdad44622860c9f04fc9905c60fe0b568fe411650a50926f5e81e37aab5d09e791210fe57b9d5537dc429ef304fa6863924cd82e01929306d0996bf5913ee980e7439331b2fa711a287e7af4cc158f7064e8fb3f0d63d6c1fb2ea416fb4473024f3083837c016f866905d4f576d3c058b782c5b842e9fd54f869cb4fe585d4d524e039e97bd40ae99d325461e772fcc24dfa8811f2f47b108bcf62984e85c0be23103f90ee32b692b5779e1fdd3c0a7fa9197dbc34ff89756de55926c7020ed0965b6b68d65191a87ca9fc6afbe29db5b5090a10c2a7042569148beaf3e21bad8d5019ce60db17953ab110c34a310fd614fdd4d65ef800d8c1ca7ba9d1aac503d2c75403fc8623f81326d9244657efcd53d7097ec90c5714fc9f128684334d2cdd53fccdcb1e43e7a4f8bb2ba4fd8cf0e5771d8cfa6fa2b2bce3a49028b1202fda03f63c7f41363e9dd6ee836654502f38c11d305b313f9950674fad181e13bb903a396fc8bc963266ffa4179d099ab553a25b1d765148a8556814f494d63e8bb5c432fb7c038a5db5a4228a1b8ef697099b3e64b291620d545b9155e332320b983563f17d7b594f56de61533865c1c7e1b188f2c6d93dae0bebf9b8058f4f28929fb9d4d4c1712f75837b05f5f746a60b09842a3021946ebac736e27be12122b8d76f9d7706ad182d98a640006b188ced9409904946e6f0327d05cdf4c46db7764d81e2f2c2ee811f52fa3e55f7a008196c6bd16ca3d91f03d20eda252bc92f02f31b1916aa97d4803035f3dbe87e2f65247df38eda4ba68b54344c38435b0ddea32de83f7ce3e36c32172cf8817f114ded0037e369f9527594b4d9141280bbffdba70d15b8a65b26fe1106b03f49d918fea22613184a74b4a0483f354041dfccaf8519acc857cee0259ac079a63de4ca76294f9f360e558a48f4f1f289f169ab8a50f8ee0421710f51547781513a7efe0ad31b0b6222dfdb42511968ff20b2513f72282634514c4f343feecc253ec2c00ac224a69a89d60176656168f50053f2a0b5edb4c928459d896e789a00f992564bcfbdcabc722a9df2f8800b0f6aae2e2357a49f09856a78f308b260e84567115e6ffdaf4aa915fab94ea32526e7705bcfcd43e3c1622c1a9fbf8a79f377f09dcdf8f60d08f7c381fb2ea27b1f31d7155492251fb027a14fb8b4bf5ace2e65e0ba94450a5c06a27fbb2de25dc1a334316e147d914e357667dd182eef5e6ff13ed733ac0eb9fa14d1320ede300e06a12fcf2a6ff1ab86303d46a76bafc7e650b36432d266ff94fe8e44264aca9db897e398ec075f5ac9db5f2869b895e886449e660b6f8cd50482edd523e671d709b0aa836c55d70331ec7b78c11670fb286abd653e29fbad2d43b4d474b15a6a54c024e01ae29ae77d3f25fe8b93852086945f418867cb145083b0bc27cc5b4595ae2a910d68a732a4317255fe8878519f7d9e41368e7686edb9cb8b67590a6a3980953df2d6742137003ddbac41932f1253117767a46e4354974495960cef3d69f729e183238b5cb87d3b1d13c5b7418bc6d9dee10a0153364568681f8ef28a67b340debf17e0060a1a349a2a1a947c8506805851b5311c179ecc15c5fa26dc87fa1bf2c2905889ca6d1741851cd813478c565369f7af039f3aa87a0aeb919af2b1c8fbf7848478f3721557312dee8bbb2c19aa4ba0ddc984639e872d4ec1c17a9c94f2135c7c37d2eb501f6f80155e7d314e74bc905eb8f7d8f839f8840e61dbebaaf2bbe1600b488bb2ab080187007f7e6803977d8d42f3a80d9d6a081f8920bc2a791606ab9d44393ec59dab7c5debbe80229b574f3e1c2b8b57ea13b3dca0755bb3e91ce49c4d42e25441a2a08a21012e61d76c99eb8a7d208b8e6f3e7998df6e840a85e7033a70a987b8cbb773e0d14a019323a5bb6035e8a4f760812ab0b749880a25c4a26cd816fc149ccc81325c48a3e6e0771a8761ee391e5eb764acd4a4a3e11698e0ae8ad5bd3bc7ed722b00f2ade0e872fd4e660fe580a2516db26b396896cde042138c248e9128f58af825340be51416967ec3356f7f7290b4b706394e72ed3a0d0e657662429ba42e7b65af064a8ddab9c0f31eb362cfb338052930915ed93eeb18d20c69e68cbc891364b1a9a8727fea6a813756fb1f0b68555a6099b1135103bc5f19e30c3b55ced0a67e5ba849001edc356c0fece3a70a2e4bfe8a6b0707f5083ee81d892195e35a8fde439558afb1c2660a3ccf9815741bdbe408f52843ccff216e1119982b0d4c9c3a124dc8fd8c2d7e6008dded0ddf885b141c7823688b27280f36f997ab3bd355be862970ba74f520a879a34f2ceb0d3b8cd5e9f6d2f598430cdf1a87ec746b91afa408a386361942f8db3043cb27d303925e9f84798dab47a040ce5840a1f30b8889159bbf8d5455abebea24dbf62a2c260ca26d0bb8f279c5426ecf2d777d781a5bfa5d4f6f19081b816ca5fd778352d1eb38d2ef8f79e275d606b5100912bf602809a8f6731fb0f8e955a566aeda5e742a3511821941925211cea762518f7db9f5d9655c9311f5ed45221a73a5bb2f4668be25c25bbbb40d1ff8ab1efc4e47bad4eadaec2c1299931c8da938b7575565110071a45f5216c1a1091c66cd8bd05cf839f73b840ddf6730571017d0632cb26f07db10178690158fd312c04329648e3b4c055ac2d7ccb5aa453e5b111d7f4acdaa59edf74b601aaae33f819f4faebb8dfdc212ac43e14e7d3dcbd949d0bdb455a44fcc24a4914c119fc2545900e7e02a16a5591038a54183962919e9581f44591f3584bd640204a90e1d5dbf0b46f2d0bb3180aa316e0ce0bb0a9e5ad0029c85f83a3fa2ffca793214c0bb86cee1f26e2c7f79ae6678fb9a52eafada9007814961c8002eec07903c3cabab145ab43b8a0c67324ae745bd0c5a7b8ba743368e8f1fea7160294749867e9eca380da9bd051f99cad63f7fd9860b4267cca27e6eb65aaaf7ae024d9ec7350ac7fa129beb4b1f0407538d5de69b20f67f35300c4c19fd0474780a073e7581ff054e8b87d289aef56f066378848a5a9fa24675805d163d5d14c3e19c53bd49cd3078e8010d478134560b365bbb00cf1b0e6191029697c62bfd2a83e85962128b39bc2a3b16146d20ba4bc56bbbc7e3e35e906d9236f7d82ff759ec763a201d0fcc7150a597007ff8f52b79b3ceb5637a2ea1caa72d93b78ac7a2cdf37ee2e5bd272178febfc887dfd864c5e9b77bfa0b9caf44734921719fd4f309f55ba63f0e0bc1d99e2245a6b85cbf743ef75444e69419420a790fd71a6726fb3a1ba809026655cb9e424d3a9c8dc99106d2de077c49f693774a77b83ed8407eaf51ec30619785b45892e594fee7acc4e8682056240ffad88b4d6c62b3b17f383b31ce0db1ac814c148c186dd1500e9004f43ac8e417109d0e2441a484b0b8849f37dd81b137ecc2a5fdf788fcb1d303477510237007794127a87a3754345b1f24646877f607ee05494074626cf70b91b7cece4cb3bc761babee6d3d835e4e66aba322279a57a9a2f1913b49bc03f6cb2e9ab371b1e3f95b86ae9620cd0dc2d63bf8f80e447a689093fb6524e280cb7eef84f210cb0d237dea08b1134c7130bda36b7d2796f373c9c41bc82be001610c70d338e94412add836dfa09cc24cf03805a6efef6bb33d17b403a811f08e86524c935f3c8f7c70b5620d1375ba9261ae8dc0dc6525fceb4491c920671ff686a2fc9210b82299833592d2676837543609917911646edcc6342f44e75ba7a4c8b87f51b441de3c5b3f54bc9a33a0ac77776232017019718dd5242f64afe1cc0b152d8adf7638a31889d753db23cd308cdd0ca9f57f59895f1b59bb2b0b7b25065c65bbabb7676c9ec2ee01d5c7dec7be5d7287a4271b2a15f9a6cb7a3ab8c396ef1c5184ef3222400bfc5c1d14bbc1b824649cca122d1dbba1a7b0a0aae9d693f432155e3004162905d60bc9f1949d86df8a033fd2bd280cb4b53577372a24b7c43ea251b2019684cad5c1ea3b3d45ff081665f1f9a0bcb3bd33521c6ab594ae335bea1820d1bc182805e78a362e8c13925ec2bf3b3b6b0762a2b9dc082e51712a0ce01bda26d3210b3a81e671b76a21adaf17cb8e7a89ba49b981fabf1988a7c2aa5319338232647be8fd91b0c522c0ffb74787bfe6b9919319baa93f94addb407913a51213f12a0da70a0e32e89cccf6ba8ed6ea29c7a2874b1858b9f081f796522410143bb1da1c11c4708cbb0ef0563b8182e4aa64723a88c43333852969ca1d8fffb291de16a3464973cf68854dd4917add6031e56b82d85e13067229827a99c43ec15360683d1b821e0081d784bc8d7f190b25191131c894ea429e5ef865e0e59cfb2c1d62755960893ebef62b7b88671c432182b475514cbf0c893de294258a31b958b707c25b18305c037de9052deaba4f413df1b632e99c288bfcf1d58e756b3ab46805debb343882722067d5a442b9122cb4472acbeeca335651ea6923cd6507ae292e6a80b58a2b77b00132e1f6b5d94c20b0eba7320c9752c95db55217451b7e15a416113340285785270217207d3d7f0d643487668d958629a19f5a3e409bf68659735e4fc760706c1b7618b068aebd4cbb76fda3a5787d7e4528059d7e4cbba0992030cde3d384a4fb2f4e2b06dcc72b8fdc5b7e037e471b39acbc69621f8afb1df46840bddbd8957b3d16a0ba6c541f3e13a4f14c5e138776b93de52ed995391f3a47a1f52c2d7def6c19a31cdd555a731aa281159a696428b47ed0daba0c347ff955e5f80c60cd161167be78b1090ed13314f4a0e35d9d80c4f47f33a876b74591a51536196caeb01853216d8d128fef787ad56f6620774930662d04ccfeed260c2441bfd4120933324fc5415788a708560a054e326037dbe1af2c4e658be21fe1fc273c1c35af6703c17c9e4c3b1759ed0b9b6c7c50040be18f357e8e1b8b077500c3a8b2cfb6a598b764a93c37b3ed5c8ae94b32131a389bebc00252d34ab9931f3fbdf87b47f2cdd763f4410997e0a262ca93ff9911ec38252482db200d2d168c19d2fa718233941c73138c68220232b01dd7d38a464e65cf5f94e87060945a0299afd109fe87bb3075f90874c18626fb27195d61f9c5cf21046f5f1caada09f9981454310dfa7c498e779eee870b203a47a05672855794780b308af8a11518d786e31025be7385bb6a78f538148d5c148de48ba74bfcb0d9c2b77d2c9c376117a58b9c71bed6f07a0fdf9214562c2ef2977a78f86d5a30e3f029bd0ffe53a34ac25ae9246d8cc06fa028921adff76cce4f779b8fefcfc6b2b8bc29d404ac312b95f6450047f813aac71e2d326910686213b339707fd41b53cf90fa6b879a8fce3ba7016264fb329bb783ff3356e05a28035ad7cc990c41abeab940a914c0f66411fcdcb028f945e98ff7d44b60074592b85d5800cc6c0127f8792dc007e498ba471cbe8f8051a9e32ef018fa71d20b0bb805f5faaeadfb2c43913bff80d0f42c220871290013de5d67b7510e101076db21035d6cdf83b77845a12bcc0f6bf77a98eadac8d529c706ddeb7bee82bcf963df5ed0dc32e37fd78a744a6c773505b9f3091ea8c6acda371b5e82125e581a157e134f3cbe0981c69e0404b4614806ed811089753f7ae8fe3bbd7b5442cee132bf48e11a24aae7e7b2f9425c965344a4bba13b02e7bb901568ecc213823c99ca229e27e5a142d4b7ec31db7a32bff11a7f46858813eed987495043d6546af8dac515ae2be60f9bf7bdda1204dd04ef721376e1aca023310b58ab2186401fa98de5929e8544c5f189ea38c5f00da40f14059243914d8bf8918d751270d4797a84c99f68152313bc7a13a4ac220d9a71948c56edef57d10bc43c357e8a62a884b4f4e8eb24b470cbc760ca2c5a91e0f12012e4314d41e0f4c46c1eaa906dbb0d8a57a39aa2ac9ca3bc2a01fef344df817673ca6b89d54048450d844291b7173ef96bf8aa760b33457454b19165edd0ae21cf6a6e171bdfbc356da153cf5629dbc40fea18d8148b69c0277230e92d0c357858632438ec00a8e31166400d171a16275b214d8d7781d5630277c39b7a2aa2edd71f7406b1c62d13b404ba496ea3d612620eac5260806fa3d5b15ef0586e0cf2b18c35bc5031b99ea1510b0996c2a0a12ca2c319cca52b203f94140a484d915290d7539b4d34718110baac4974094f1ab486a1883d69e70db5ca49060f3fdd572937ffee6b3c5c90b561f2264fdda33905e38a689ace61d391bea8814ec2b6ea069473dd3df84a13214acc92372c6cd81113d6d20c1cc38b8bf2d30208c5ca110a099b170d5881b344f64604d9573396829859f491a50c75239c635b9e63a4aaa5657e9025c5ae835d19bbf4aacedd1478128763dd86c82d82b0e77318a7e24e0678a7993b7c94e3e79862808e45cd38da0635f14dd123da412fcd418d0ed41efad6189b8c796a04c81c449c27b6eb7845b75c3a314133c46ea17d2d73cd01e07414208379f8183f82579a54329ded504acaea21e5df55b3179660fffb93198fc3e69868d28c2ac77fe267fca5b626fe510367bea0b058928be978179c06fee4bc155ef4de2c2886b5c6c494e5b8232969a9b9f3b8bdadccc4d000eae4dccd1db35f0eb65560c185421430bc5f4deead7a925beef0c69f340e2658a4b21564db88ba78c97feb7c0428c695bd11c33c56e2818f4209dd83cb8514208f5305ba348e9b5495824a2ee5c2fe7a99171d6a78e4511d2982f0eb503dd0d386a5d3d8894525f1b8720ad15215b3e33a5a3e20a7b63fad19f74b516957bd871a4de1ab4888440a407c48da2401476968fcbe53a006713a1a6605308701a11ce918460f7fe9ffc8648a7eb40fbec15e300a331464577cf8528b889f75e09c4a7feb0f8d5943b31c84bfc2e6bd83950826f9aed12824f7b1db0cfe9380c194bc28d05e89a152bfd186947d721223a27c00d22aedf8eb9a6e37816b93e436ca7cbfe49dec035d643744eb42e43e88f034a6eb42ec2e88ec3f0976fb7d2f8887fefb1069f76c66c722c878fd9f84132f3fcb0fc634fe02c3c5158738dcff97e3e8d41c371738a7e67294f6c42a07e8988bda5120cc21d4f0b09b66034aa91b6fed2566f52a2f334dc4274fa7522426fc76d9ea08340b6a8541e82dbe7785f5a73c2e2452c870e4428611a60a1a2a1d5cb3d3f565b929390e216868472a9274240052c1743033550ca238caf5dbbd5d84cff24d1e0b7ee0df008b268e0c5fe0d12218a3968f4db5e8d27aa4877f58b7840b1fd4932f95bdf7ff67b1ede4497125405afcebbada70eeaef027cd8b78bd9a424688572e63eb273cf153ba8dbe9ae992530ee8ac1e7e8638a0ecdda0a0165e58947af7bc0c393b81c2d06ab0de6dbc412bae67ef539902e2e8b59d29aaf62bbc2fe815726ffa4e3e37e888b7fe25fda54e2e38bbec3c08c0dc83ccd77d607acb0de89c3a3ad9a3b76afe253ddc84ce965f0e14533e81ffd0be2e9dc36cc2af3f6772adf538ac754a13dc8e6ac6ae607000ec93576f5f6068e2e80c7a0d0d0fb2f9745d2b6b133af4b6dbe70cd6e4826f8029b5d406afde6194b430e90ee2402c226ea078d175d3259af99900c0d62ae30f34d44f3c2c2a273b59b0d2f0af7f8ba630c0faa4aa6633cb020d1a1ac9a002340cdec88b843798b6e185fa3e682d9f1f5584d7fc6cd80545a482dfdf044705b092507d5a9b12090382ec08e3b50dc9c3a3461a8de7c8bce721b1b312a9819437f80664934936561bc380312c05069f882f3cacfd51f6cf156ed5b7556955134b13df0a1f9bb4374a4b23fbe7282af6284aa156398e35508a9a4848c15037df7206c9c4936b8707034d2b040185734dd42c3c8e3e1df86321f0204565425952bc188e31ca599ab64ebcca404f45f37b335b67aeac5c8a3ee172f18e78a73053d05ffec796b64114670edc866e54ae8dc6adaa9780946ee94846a845ab6229e89cf333962fe64b7c9feeef0d83aa9937b3437a516819bc11a1824df83aa797c61d4db7a2ebe0384b11778e6a43f85191362dfa62434fbfcc268718b0b459e3580ae685f71d2220829cc40bda90c53527bf314e59cd6295fff4953d9a929065bc7b9dd72a55f1eef915abbcafaf99a9def6b8f82217bcc30dad68a22329edd8a6fb3ff3cf515b437eac8db0fdf5cd6fb63d0a06f68810a4f026d32127b30a5ab3b0d2d31f745f99f746b7630520f9a80f8247ae208f2486e4b290a3539f231e31e8b109657e3fa40d82749538f08860226cc03469318291642c706217553b5689517b05bb1368354d710b2337e1f19dadd889cd59acb180b9be5cf5e14a5964eed55eb1fb52e74b7261736bdfb9ffa5e3fa22aad275171cc10fac937c25f54e28e04c6429878232735360518f5961b9d40efdf21e0d112a8f3e924622d42e99c6e0a851f4f31247c2e149c95fe93624f6ec49bef679a591f793d50bb6552852265e5498959e50838fd8d7b47edfbd0915ec3f1a5e16230f287ee9d462fffea2f7a9e366f5d28f04276136324e0c017e08dba938078696f5cf764bc2dc657c29367ce5ae6fc12bb522904c1e63e7f82970df2fcfe8371510e31990b754dd3ffbc1e17849370ece8cb5b4126a96f8699cab03e168ac30738df688494c8b498e83c257282e892f6e8cb6618ba0776c16720bb1146c28942c2d2c0db2d0d420f5fa24644962c97db6562a1c9223cff7fe950d3fef072ad2d802de3e621dca5f7d41f5af13be3766683f80ae630756e49f2fdd647160b9d767ed25bfdf47c3288056a80ff5a35129ec68bbe878df2153c40a41ce3fa0c61174582f815a77687abc5705e56677993238dfab621ad139817de384aaabe7f8698b2da3b443323710b2976222db96ce7bc52651da4890a080842691cd6c2d715190c2fd73a5898ad84800d2b493c6fa8c0d4b1fbf85386901fa89fb42f13345f646176ba5e055cce527b150bac3bcf3e15316333973c4b84a468a4f3f1085d33a8660c78fa4d3e6688674beaae6fc7382368e1ee807272ac31d980176c5c2ec79c840222201c487a268e3e0e5f3a03e7493cb47984bf9043fb132321fc7e911354f1315d2968d9ae32a2f1f53b22449ee4403ddc35f93a97395cfca08d578240a8197cfdaac3097974fa908193084b4e83d7eaf7af28d21390565f9d020f5b02a0ebdb67b80a8ad514480993583805f638595e295878382518ed4b0f0175d7ad6787636eaedafab71454c5ad25e6940c4c5dc47da4a85d671d25310183b19c2ff1e6121058c0bbdfc7a1c493e32da6edd96f535ab030ed9a069c23ec7760916bc49e1c37dd5384b21445f67d6642124ee81e2bc45e80f1ab63b2e03c00be27e4e2283b005189b1e44b25cbc0e160ec72dd38c7c1bd86eaa58c77b88e710544d425b98579a00ee14dd7efcebadb2a431dbcbdc4a4980d08fce76b51403cbf016ce3cfe2ef1e64d983992927baf62401f3b35473a9d7094fa2a4639461af1c0ca82252d0be13e303bd4d08a539d315e8d6b764db18331dc25c0880163cf6ed426fcfbed7d1c871d214fd106a1a414213d052ddc820ab457424f8565142d406973f5c62065ea6b0611d67d79351d772724a4ac89e7c90c3db0a42c1691304da36762813fba7bac601ab97b0b6e7364d98f1813fb812b2d943f7376e1a3528f06f11d16bbf20f40b389d9fac6fd0db3d0b70e05a9ce45802b8218ecd3e0451d31628a4f3c47f17f25c44436d86b4ef5e23c5c06b2175769bb9f4ad5b573077ecd62be14cbb227ecc1aa16e6885474a20488004b431593eb6e000f8df2e260e7fd8706c8e070942ad6858cb36429438f13a7de888a109298ec03e0ad9508274c94a0dd8fcdd27ebb47978f194a6ad1e6b9ca0921ed9fc18dab8c29d4262910493178a0aee063313b754bf2601a0afcf0562b9de493977a5fecde2bab3c8499a7039f9e944b03e46a2212dd89f86b9d1921d24457a01fe948c157d03e2a9b61b81ae3232252a8f65e53ad6ca2dd0caa6685513a3bc695bb3c4bf8f8738b39b066d97fbdb51ca1dd62514218c536a97aedcb36f75e30008a7afb98e348995b0bd6720e136f554049712ebc931ec0dd718dc2206703f653ba67f4ac546ecf14b93fd82748325df1d4af10615c8d890c6ffd073bceb88b7cb178e877182d4a812e7f9cff461828a704e460d8f2cd43f4c81513164593ed9a35867fb9a130d3d511f56eadc0e9594a7c49829f6c89cfbf69f4b7d90ec8565bdb217480a8e4d5824a610a432f9cb169ab4ae569e551270ad55639432e93b30ad70b5a6068b979690a5818385b6d4e671e63bd7924963e158e611671d3f9452ea8017e739aa42beb658898b793a03c474181963d75566972acabe56f22c69da7021ac31aa1f14c8e9ea004707bad09b6a3587d4e8075af45de358ab83c500ee8e30b00966297e4673b5e4fc22e294bab002a25dfae7ea8bf2331788746bd53e1778fb3114f5ca3f9ccd34a9d27714f0f2e284c2a6a7d6e2884e66303ee0e561d8910a6c8795e138ab864e9bbe32455801029bd694ab63c7de6697c87a06d44084e0cb6e6b5e1bbd101d382b8da477a7e7cb38c900dbbd59b61e82b268bdcf26bc0852a4492c2b56bcbc793cbe98c373502c4c6b407b8a0bc060242bf5376bb81e7e9360d976a6a84f384adc08fbdfc57cc39dbf38c32823f5435e0c8a0102cb84684e4adc35b63449ad5b452f7638c77bd216f2430d1d3b633d7df08a502e883f7ff60114aea5ff390e20412a0c76e0e7643c1f2a7576914819c200ac67877d86422a506deb3c50b58e546b13312d8f3bf430403d1d99558e179a617a6c01d7fbe178a571c35a24e23321e20616ae6da444af3b8af12d6f1a4bc899312ee6b8737471772703484bc79c28416771d6cfd3572fd5c83c8864d22381ad807d0829a12a21f844ce8db77dd991aeb97c2aadf7c4f97915d6042bb14353dd5a7ac435b56169879ad4b28ba23e98c674b7c6e40d3dec2d20bd20bae3d4169b12b653a42a900d5ce6f959e494aa1c82aaa7449e23f90d4b591bbb11c83f23f2399016f594dd9043d418718e63f876d58a13ea4531bf66ca01f632a94a7d33f99b0dea396396e3472777f7be525edc096b24070ca7b20661fe1bfffbf6c7c1252c436ca503b2f62c96321c67fb5aeb0cba45eb9fe09e597ebae8183927e3529b6fa104fecb2c237d91c1d790f489fcbcf9af59feff0a3e0930157c657ebcd775d67c00ccce9396badd30d87adbd82adfdc977a1017281cfee1d43b5c15ae1d0e7925c5af636223ecd9f176473cc338503929d4dacd0f3068d9e8b4db57bf2cdaea89b40685adb01744d726143fa115cdf2fc2da0fec667437b09e8d2b5b67df0cf71cd381acc031fbd3c9675b950e77cc111d3a11c889158d824e65972d91402f1036b81f081ee0ac0392be5886efa19d49333a3020705a2e65cf8100db944e6e568e6ecacc7c969c1b0255188372372a9dbb6b2d0b2ac089e54efe1c2c47945a19872508a453371aa62dc9c446b97487a7d648c9fea72d88588c6291a224175485cc721aca50b8e1ce4542ca0f982153acb098026923e64e02d50c3d5eb8918310875df2170c62f58fa9d338f95992fd4d80bfb3b95ea747caaf9712bc4ef2e80809bdb00c581c8f64dbdd33300965d7f3f3239d44eee53f38511004a46c648235287fd5a801eb487525f018263f28e4d8673fb055468fe0f5c36bf1d4a5c8b55adb1c3cb4a232fc7cd2e82571dd518fdbd320fea73e24f25315642847630e01ade9a09e39220c8679571b0316f20ca70386348680b60f7a586242ab7e27f8b7b843caf1cf18ecddeff1300e6dff98c9d9b1e20916c4b5be775ab87719664e6a1388676b7a364c1eadec2051d6aba8e24dceaa7055b73dc69ef18454119fc35acaea1a330e569a660cead5c79972beb7602a5ba0d48ac420214f9b1fa813b09cc9896e4082cbc59a9efadefc29f95e306bcd2a8fe7c03618c0a3be5bcf72eed30412b88149c5f877972896934f6b07b005cb6387e9e39be17f6c08ce98708731b27f1458921a0599b9e2d668570a7276c527d6262cb65f4d998609b7b303c22656e3dbd15b0e7ffd071dc247ec0ab871698715b500757834656dc35d2841ad8085064520f30780af085265590e613cc3fcd7a3158f45209bf31d58acdb4f9ccbe3f5792679855b5563ce9981a8139a9f8e44bebc49de30aa29e09d084058538e17755be2554577d871c008eeaeb400a6dc07c1e42ff45e6642f3115320680b73a2fd73013d7b2bced707229e7031d6cc32dd519a23eef591412289a13386adc15427e29f3de0e70871c605439cf7998011c1e3419d30cee990cc351e7da241c5f7f4a1146eb1279f4eba929030139e283df3b80d44850a5ab25588c8cd61d73a8cbc03cdfb371df0adfcfde602610b4df25577eb51ee58a0f3b3dc2e199fdf4fa08fde5890f53204537736fafcdd0e0eeed49cd2726abcffaae29dbbca545c9a9ac65878db4842d7db90ef459803df15c1666d4b0fdf6593f6bc017345f516ec4899445af196df8036c7db5082c4c0176ab04ce7b8c32400765c633c7f363275367849d531bc9d5a401b629e11b337ccc424cd0c5312a2e525d1edea3ef63d80c5a7b945e963235a16f18ed62e02bf889e7eaca8db4f267036351eed3a9025d5087cd9c11160bb5ac15114925cdde19707b0f72d60c5a75df73ecb449c78637b5179f80c4ee19ebd4a14d681635334ca502a1288c83660474da7900f2d481c0d91b16d9033391648e59753d74cb548e34febd440791827cef70fe77d7486880eebac986fe1db3c0927e1e6c4589d53fb62b2e00d2bb01979db1fee1a106656905f33dfc70edac2fce24895de7ac0f9c941c4500edd496066fbc4c2e8dc561faf19a3fe8b17ddda2f0200a0bd12417ebf0a19e2848ec999fd76c3d2383c8555d7a814ca7291c55e45bafd16de56da870b7f3b6c203a0502cffed07ccaf8731c177601019ee07153050425d8c46d375735671e4756040464c3d0b4160c03ab1aed17e8521a2b9361e1577a7cd79c1460bf60eb38a247e4b4e52eb080a43e54483a3d2f22a58da1ee1a0589d933f5bc7786ea02ce0e23b2c42af2087f460f4a06d009547316288cd2a0b5f8def0c9caecee9ebd0ea12b06df024298a9a6751d5c66d10a30c6780d5d51d4029fad2ad60d97ef190e774bd0ddaa46211f0274b5acf05d769b8f9316c414f4ab524cfd9d3ae8edb6422365969d8b3f247f967fa51d768e0d1729fc2a031ac8eb5a2cc1611c68cc6b8b9b5c83443f6e13d0ca6a8cee32ea4b97a9203107cc48c0cf86db23509010c470a20c13fa61b8bdf055f062e5365af9c58989645259f9efdd047c8d02cde11c91bf291af1260eabb38410510f97b46e21fc85718c4ae7b7f90189bcc7a1a8880da10d44d76e8766d881c90e0c86ad13258764663c99704a2de00eda3ba4b52271bba0beb50b2993cdc5b081603e3c5b3f658c5ccdf9f547196232173fbf4cf69334beadf1151b8530994431c743cdf8cd407cdd0c87b2354d409983ff7614ac2c2b6158c83253a448620b314474fd7fa4e9bb1ce6a72a4584dc4a0b87b19dbf5563c01a961784eaa5acdfe35e1670879d12f7ee014bfbd65a47c45b478c726a104856ab24a4959054395938fd2438c65e8bb315657395283fd1ade5c2d9b16baa26c2e2129f30617ed4f1d0dc38a08766696cfa4c6e54b7e169928125c60210ce81c15a6e53fffd8f1509958733ac8680847e814e3c08e535085f60c9255e9f96d98949d4afd08660b095ce456a8448b81439a144ed2c4d78f4190f53351fcdaa8663105fe9aeb307b893cde70139e4932089aede8d17b55f21ccd5cae8e4d1fc60f9f665cb5744dcca3aeca0ce46e4b438a284f5cf4cc132cd4020399d271934ef0a0dda742cd3239ec070309216a3268820cd39fd52a54d79f9c644fe959204c67c463042d777aa99172fe372ae2a57811141271990c7a751ef7607ed1700071468f275c5b4274c69c751f8cd45e9c14b25330a149b190fd908969691dafe58fcdfe2ca3febf1d8249233cabce78e27fd0882446a58d24b0a91292c4f2aeaf350218382cc53f80d1e3fac47d3e7acb4f002a75fe1fa0d89442090c78bec3ff07376517e43230106eebded70b0f0104ab7af3fd345c719a383b30ef4204a18f3414816fd5d9dfc8a496074e2f7ed20e98e0495f521973d7dd179015cd7fd1fbd01c2dfba36c49c80a501ae1e2628872ac1adf18e2764fb47b9f7d334400f8204ca6a0794b358c98abde606a540d6e0ab38c7ae71c2dc57071e0688c934f67615f20e9ff06c04f6c00f31caf4a1c20483386fbfee2eb3c742233622b68aa5b0e8e93c4774001263e7e80d1c209c10e890236c85dc3340b913f71682eadc941a6f39fb4b76f3cf70be21400cf5fea3f9802242f859add183c7a65cab1eb637bf1157e0b52ce749d2831ada1aeb41278b764704f6bba78a092afe206112d6cf6f4fe061f3f7d4accb5b4ac4a9f0767d9f956859691d4a85a4c3ba950f121059cd28e47a3c3f9c87d9f300c4b0da0df2e1ce1b47c164b348b4fe02d82c6ff80a8872b18c4f555921fbd4c00a42b91034dd09deab9014ab2ce485ee1169f85606e6258429173fa52240022165546820c600fdd5d208c57044f404a0fb296f31d878e2f6246a8a6e55f6d6340e62d751cc3ca2b94c830f742dd7d3090f85cccad4c0af6523a2209310da1e0f2a12e1d63cb139afc05ccb753f60d85069859e6de88ea46bcdc84156a99c7660cc06262ac7b773d6aefdc024836cd868bffb19a19137e832e804256ac3b4410a0b9f3caf4e81f9b2050e2da16c870bc57db91a44f457517cb647f2d26e567a076dbd97d9d0e33718d6c9d059e3c495c9c3b818bda8b8144af8a35f638119941149fd59a293ef8f5871c326abb90af5ed68302fc77d15fcc8c473e715d8252b8b3d0632db2d6039f671628616dd08700682d3ab1e75493aa077a14e8e72e0cda0a0049074c950aab10c5598cb09aaea396401d37390ece3028d28dfd8f28b43af138c5e1c6830cc64c032a8730b0f8caa96879e2b8ce549d97103b06ceaf15d5235312b7e958d61831650e3053c321185462626e622130d1299ccf2ff638e4c096c2cfad6dfd294b2d0b9042bec26f4c88a0efdfe4332998262916c6a92280128e15ac06a315390c0f6698801215b9ceadbe2987443c840be6d5d9172de87d1c9614741deac8048458f30d43e5f9d875687b699c447e7caddc625d6098422e83e6f81f445f2d67582a1354e6d8690f4777be50c95280498bb9694772710e0201175f753d45405daafd97644c884bc9335d5cdc24736436d69b3d4077bd0ce330ac42e93e3983d75e451e5fdf6a34f9c14d2a7a639ede3f53847e69be95b5e4eb167e03a1ffef358b66d1c816f107c80309e3675bf6b6da72e663210a41e8db04b11b6f2d44dddfe9edbe15529bb552c0bad521cbb1dfb6715c99d969f920d4f15c9a22cf24612b09b92645559c917156f1c85a47b2cbddfcad177f4853852da133d5106df008285be9634aabc46514ad9928bbc2410c6284a66923114305667e0c60ab0432845f79c582a5d5b9f2c9f34dbb01be59f5ffa90b2420506fbe9a92b3905659195cc94dec512870c031bf309f2dda3e9f5abe747239036d8982b7c789f1a780f8ca40bc9600be3ee6a1d0a9a0b9eb5db412888d855cb8cf7b8641e3cb135851887105e91394e8c1e69e0d6e92aeaa3020c1e7992b2b49685a9bb185af1cec922ad26d5c19dd0dcd80d7238cc761b92b7c373762a5572baf0a4c8ff3d96fb84fdfe4239c622d49f5ac71807d4fe9cdba1befe9106cf3ec274a79fa07ae2d2c24e7c46c68350d910a20c953c005489f6593fd4ff2be78a924ddd61ef09979cba63c72fe0de7bf91eda52d4bae211e763431a3b8f520ee4fd9619b8e9292efa827b8f6e289099cf8572339f89fb06d901c54ff31107377213048789fe9665925066d5a8423c65465c073fbfd6cf111fd4d40bc09317a32a13ad7ab9a87d54d9c969b8cb693a47534d8608537860fd8e3d29abe0d0d481a092e891b33aba0bd834d5d3da005ab26a6d784767fe2479d63e7dab630cb2844b32e3f2211179d1fac439bcabf1a95d007d5f939cf2469875327825c5fe3051b3517c0763f449718b6df265c241f9af4293a0bdc43c0683d897b29d38884b76eb8be20fee615a640f41efac3474dd54bcb5021d6203a6c1de137f1d2d7f43c3fed84161afa7de3b9c98699c515304b8b46ac6e6fe46b3467f9996334fea90d8e16176de18d5c3c958c437a0abc60210fb15eb1250e2f2c9f4ab3e5199e0c144c2500893fd1a95d5830414274f9b62b712ff69f84314653e4834c84b6c4af7e357c22ac7ae59fffaed444c0e86a5e975784d7eaf45d81c1a20467254e9036edfbbd70a309b60c3737d6ce40bdcec038aaec2835630d81da5037e1fcdbbdcf7d17cac959d1a1270311574a6a15f02967431a3f97e6eaf45c9264770918220680705ecdcc71b0110265d0c33dcab8dff6a3076d0b39db5d6ef5baddc7e0a67f1a535223721524a995292290508ef071308598cdb1bf70ad4589d3bcb9b9bfb1e7513a28c1115e78c538928e7e984aa62f6c7b92e258b2c66a4947306b538fda7530d280d3f33ac09254f1e1f041c458b660dd4f6d911d64065d6916232372d380a94201ca13a5004c1e874e29bfe191df8b7a8b63f313693c46ca84631d6bb7b6547dceeeeeeb2fbb6ef86a87c21a9c18399c9f5127dfa67e474a06dede7856aa81966d6a1329951b30610bc074545353f27dfb47cc64c3f338bd38f424dc650365c61fa67f3c458bf379ac5e907826b36536788661627aa9fb35c51c54afcd64a915f0ace3068f8ecf7f5505d6a6f1ee977fd9af1b7b2648c8952acba767cb0eac5f7b19e408616b37d26a70c2dbaeeeeeeee02f9b88f4fec95b3141956389ba4a09c8f0c2b66fb0ce56339d9d4f958ce9b5f7330393e6be22db3d52ca7f2e7346e52fcbaf75f40fbbd86d821aae8b0df2eff21dabb8b46bffba6cfd8f378c2e4d2b3bbfbc58f193998d98f1ed6677ff6cdee7061663f2aff3e739360b57bb359ac3732bb32dd30c3aa66ad749a75a954fa205b4bcfa492681685a8b2be0614cd5849cf4c6aa34abac2ab35c19fb5d0aa86b0c26a7de62a94117e5b9e9887f0ca8e484cc2df2593c6d0c68be3de44dd55f725eade632402ab3bfaa02402134460a23a77d118f2ee9a80ac7ef97427fe5a3eebb3294ba6cf6ae667a9ba99cecef6ef624bbcf290560013160869400b28f84115222cc18729e9ca64652530dff488ac934a89f133c685f14d65d30fcc557365cacf6a625c8c24332535c25624b621deae6c49350d715ffa76fde03e96ae7d520e4c4843dc7572d364cce37bf7ede1b50f9a7ee07b6fc8bb66508cf9431c58db5a6b8d496bad88d61fe8d6da88d9d73ad168ab3dc30cdc64f8696dcfade9c0fa353193d696748c8c4498994bef8b063b599cd64cea0e2c66fe3601d432e9d68eb0defb547d6f9f63ff28d4e4f67e7ff2b0383b38313359e3fbf64eda111178ef0304b6870e2d6779e06a874bdb691d5e0af5b608ee3dc6e5b25c6084113a2797a75b9017bc1b2fc15a186b6cb432d1da33d4aedd1f4361683b32dad2a3e6f4ab8d48f1e28bb730d6d58823bea9467c117b8f702aeee4dac2cc7c0b16de42527916fff68e454b9163b13ccffa975957d67c6869abd054c4fd9586186b10be05a913f995166a2b7c332424c4aafe95e9dd09fb117cd346241fbac22abfb046c42ae84694dec6a366e820d2b7e91b0c2056c55e99ae366aa31f8cb03c1066ffd62d8d8b526c0286972e5c34610c086f473015c69a3b599cf6436bdf5658f543f710abae2c8f4ff1259a24e623cdf6ca9a6f31b567fdbe85b106dd88b1f6f0722e186b4f673033c94b6ca9eddbfb1656d1e836326215d65c9c8bd2b7772177d22b76c2deb4a742d4c20403aa8ba8ad2d7c6fd2bab52d6cd41a4b5da25269448c5d69435c7ad548b037ed4951864b66a3b2160574603a89f4a46e4344fd33c61849afc358fb60ac630fdbcb632ad231ee977e6b693bdb2be8d4ee426d5f28b037ede1b503637d49e7153ad30f12c664d0e234927fa959abdda4abe1931ee6c0d83e4947189374411fdcf3d08304da97cadf5aa68631d9defa3662158d7dc2181396a74dd15c24d5811a614c7ec63d78899613d4ae2c4fe9638cad91ae0c6b471de3516bd64b5ea236120c89742d61e26362d38f978a30fd12263ea6779a31592154d2b72154d25b97964afac1f45bfb4d97e949145e264ab30c00d57e137fa4d9d76c7280db1475dd0a21cb100f9201d0845a6bcdb39a20d7c7ea2da7df7f875ec56bc78ab134270985baa07b93477ddd51d5b966ad725b1c7ecbb7314cc6c435a12b743794eeeeeeeeeeeeeeeeeeeeeeee920f1f78d582baace0c3e7191a34ccf0a81932c8f8f618ab4e1fc3c790f919a382f9f6405a6bafc30ebcbaded4da54a409a9f1345f2307c680a0f966a10e126a4142a66fd37794cdc69b28e99dd67847fde3c3c0fca4312f43e7c7a0321f038df1271ac3cba0a79781caf819548647d1193f0345d1d024440025695f3ac6295467a88da741679e064ae367a034bca4ad5eb449951a3404319aed9b1586282d130b6c6054d8c2506117be813f270ac55d648615c9cfb80b5669e856d3f5d6274152e53b53111311d3b7e94d343436287bf9028c1ab4b164f1616f8496272e7b8140b42a6968e8563ea2ec8506651a28cf401b887613da4e5a06fc13ed27b463d096a11d6509c6a634152b571823620cfe451b0bdf6809d245e8087e6243ec81b1ca974e8d4f22c548b2e184d9beb26466965c84c45c7ad29748415098a3304fa9f0b90b77599ea32ecd4a15b647736273aeb03c0d7ebc1a55225553bd9a30d5a894f5a56f42cd4a23e2cfa4101759540613bee54da80939b1abd93b71f05454f85654189fe3b3dc9d5daab72c73af60828b0a4d3f3bc41864be9a1063f0c49811c6daef934131c648186b6f142fe622deb244e2ec555b54cb221a4cf3767885ea1bf891080631b115d291546a3d4cbfbf306f59d697dcdf63a765dd0aabf849ef43d5fa1884d7d227b1e28e65591f2d2e31c6c8592227113989c849444e22bedb1527b137f0e3ebb0caf4315aa6223096655d9665997809d6c258f80a5b612a26d32c992e7e62b522cbd693a4905e6d9c5292ba08711183d1547a0913ec65ec3f32333333333333f30fc7384d9775912eebd9643de9a169084b52a4f12e228dd45cf4505b619af9930aff3111d2b39591be79b11e34a78cc134e4a636178c41a7fc30cf5ff26ff2bdec587a89042eaaf5d1fa687d34f547667ed2cbf8cee55b25d39798d05271d4bd828928557e3402951dd229cc37ea6fadfcaed06ad27bcd428d35a1d5e1edb156535311eeee1c182bc5304ce9d10f84573d58d2bde84a0f48604c4713f58fa5523b47466248c2a32c925080420545ce85a00762cc8e9098dd77a8ce43754ed547ea51a3da61ccbdf7b8bb7b8f55f5ef709c3360302bbc321d1e65c49ef0e82e4f2b0ca544cf9147e91d863883262598b72c8b3e1fe7e33eedc33ed693166d3e263a89c43440cba44124a6ba9fd55d34668d5609ba9f55d52211cfe64ee6d16fb9ef61bf680c718ff2213b14ec73ec9a8bb135e08969fd38c7dcc5b99273d039e79e2b4d12f4947329977229e7ff1c8c3b05eb747aeedbf8f50079ecd746f856304a9e4e1518f857d0948cb5495a252287eedaeaed849a89b08ac55baaf7773bf5da5a0b445878947ee2c1512495ac9e1c3088722a619e3cca1c3394f052831c55debb131209d2d723b796726fce3d998d7c8b380723bd82efd71ead911509f48d96231f18ebb761c56c6f646121450aa25125dae2511ac9b91e7de789d5daf4e34327c78c81a959527c59a280bf846ffa670c4cb4160cf94c3ff12d599ce6a1878704f8d6f3283d0b6cc191101a0b3b29cc9226233e746e10e5dc629e3cca233e649c605162023eb4c0ed35662cef0ad7ad4474774f3ea81365c2478a42d4f7624c01b9bf482ab9286716f3e451d674c03d7a366573095d06d3dd65c099f8bfe7da1767117807b593942cc8507c6305136617e7fd6b6ff9dc2f25b03ae89e83edd125293523a546398d304f1ee591991a2b4ab0c404666ad0dae36fadb5d65ce3d38c974e33ae8a7ba740c04fb2040888f448ef3de7dc251d57e78ed9d520ba47ab399a72f7aed4e2b4e5d99aea1b58f2285c80b01e1d6b200049d9b640e97ce9a8b29a19ff1c2d57555291dedfbf694102b5a34393b9262ae6ca22ca244b36aa5fce0363fdbd830a04b37df425cfc8e53c412da62b4554d0528162115172d18268fd3d4a1fc8b91e1dd581d309cebceec772f04aeea4e049f3bd04f8a6dfff716b426acba136a6eff2c1bf4d8bfede603b54f7bec751f3b9b84f0730a2ac12c9b5201c0f3c4a18f7f37b15f3ee533aac8a3b52106374ee0e46c6e7d8cde776203b1174e70edf3de7d5ecf75e47ab642de63e2689abb1614a5769719c559d05aa7fa9ba20aa7fdb5aaafedc83d0b9e72e10f8babb3bbb6f33c6391d943e80340bd39ffd8a72c2482a593d34e821222222221a824b718e04a7c025cfe17b1e448bc0d71f29b5d1b9142915535bd663116c3d25084652c99226234a1e13f3bd4723d7635b94da292ac2aec7f7e5cb97209ed5bc0ad195e23ae7dcf7f07bf0c125b1216ce8dc7bf0a166c3c05a23f3843a9d5a0ff77ef994e9eefa3d0e13d14a50d5dd07c18db725577172dc44f68b773c6ae9efbde733e53c6564e1ac1e2790e22630315326064beec9124594323306c644812ce6de8855b4ae28db2c1e63cf62eed945ce9628c6df98050689212c64a97e6dd18a56894b91be66a9543f6f4138e7be81e88eaabbbbbb94197b513d632eee4cd4ab76d243bdb2deaf3ec247d5fd05d3bd9db49376d2ae9dbc76521b55fb2706283672273ee22e509044e4a3232d7c05443e5fdf1c39e9ac0073106b827bfeed54bd8f78925dfaf70f9c7397079d6bfc3dc36e31427727d557b303091ba7c5e99f3038d576ef794d75b79154b2a4909d25e67b8fd20a39d7e3ce0e103c1580ea24b4e0d72c0f096b417cef3df7dc73ce31262ce86284104208638c50c21ee037081dc946f635266191e234bd0c9d34866e3f28a78319828414134beca713bfe61ef7cfcc8c0aae88f02b3bcd9c503355fc37bef37ffefb03fddf0554fd92b14fa819973ef0e57fce39e75c1222eaa9bee6fece3927a6638c6ffa4f3d5970e74178751fc4989fbb8279f8bfab29b33ccbf3524dc8d02652e62d47df4f2a2386a606c00130d49986cc2ae387eacf7a18faf6c6c154f79106016be95786eab247690c81f53dacefdd4d445e7d5792fd524b975b9c16df726d198674f9e2389781eadf78b867d38f431753d52f7f4c48ec9280414d36c6326c71cf74104223252bc6cca294e9ca76a491beb21ee75c4f47fadce541cf89f7d8f42361a6c4bdf74aaf879e6ea6215fa184d1df7bfe7705e16aab5bd3598812658c33ce2827638da5ba67d3694696d9325494d3082bc6bde6e8b677c7cdd47e7948bb9474e5e729ec7adc0823a9b4f33ebef7b833e30edc914490733d420cabce9803f1b76ff6a734b83729647377c75e917fa51baaeba87e03e9ae66ff62a9ee3698ee73075e19ea5d0db3639566255d4b669430db0edd286f209af3c512e3811e3061b1b48703a01409c5ee884e7dcf05f33d21eed6e5594857f6d5fdd9346309b365279d188cae6882eb949a17b5502d62b6439a31c91a135ad114af7f2e4e7f6f6002d1ac663a402b722e98c0a815b55091e5bc22a20aff72c7f0fbd5002d937f9fff07ef96e5a7a6866ffa674d8e1a2c872f633d4d526414bd1a2c47ea28febb4b9d273c4a129d7d337bad3779ce9e76f79e7f73e7178d21fcfefc7e4d00556910f11f681071ffc35f286f2758cb9807998bb3ddbd72efdb37cdb9739055839ae9956ff595c58731c62bc608af756f8fad02a2ef951577df7bddb7bbfb8a2dc6e73695aa6e67a73a7765fd631fdbed27c2b0777676efe155142fd797f5cfbf3de75ebb269a50e0d50e54ac91155e606184e82302a007d672f833fa54a9991d67a4e5f02b6071d864f4aecc777a07bedb51c0f280d1729e7fe2581e7eace7f4cfda1737b2ae6c864b3bfe06063ff3095e594ccd1a1753cdaeac6bd6bed41646e52f8bc39f431473680ad13b3ba914f67d6528d49cedfadbefc04651648b4268cc1c7be55a02bd7abf8f844bcce2f0532db37d4e530f840a7913a541a4559a6f9506f51250f27c68ce579afa1ca8909f81b6da83aa41d5fca0394f009a7a2254c8d3405b1d00c574f86d78a63ade07ddf13d68ea0d4085bc10ac6a463a9f352e26d30fcf9b4c3f34decaf935fd0091a47da93a5e49ac3b70b0d54c82c1f134a60324695f6a8ec7f16bfaa9a119b18a8718d3b99a513f6939fc365cfc9610da4dec0d7f8a360d16e3d7415bcae2f0e7d086c1623ba81427d167c8eba052865ca994dbda6afb1c9af7d4d35c0dd03253bf35e75b4e2af5a94b12c9799aa7b97ea04184e6539fbab21f4e8cd1e4c42cae3d861d9de4726847f11d14082537df5388aee7282d8763bd5a89c581df51eea0aa4f511edf4f5a8f86c243ac6a166c436141e51fd2823f9a70f0aae32d1d54076d07a483ce4a63cd49d117427d28b20d3b745c19ca01a51c10cdb56fb1e441755e07e5da516cf82c85d1dfe6587fd6ff1b3efbfabffbbff32b7ac3ce4ae78b54adf1365c59aac6efb832acc6ebb8b2aff1a92b43d15c5fe45c596c5468994b45dd9a794b1db431bbd441b7aa56affa5d7e1bb1da98d506aadaf86a03ab3652d5c64eb5f12bea522c0ebf8afa50cbe1e7413d078bf10ba1be832835b2596b7c366b7c94f7a1bee1d7b9b268c3954d9b1d57f63aae0c4b5d598ae6ca769688b11b3639d750007e6b00f0168c0f2d0e7ff4211fb2483038ae8eb238fc513a8a0068cee3509acf41717c4fd740b7e2a05b81d0f5b9a1593351f9319ac51b349b363443058066580dcd5200a0d9ce45b38ea2f2539a7d7d9a751695df06cdda89ccaba8be41e8fa9ce8d61870a0eb23f343d767475e40b80ae9920e3bf8d07a6cf5e10742d74749ebb1a408af779926639cc545f1e11b2dd6b62bfca6b7b64d31f78a26bea8a6b71e88a502421081f04fd2be7c0dab4af23bd36952c5f4fd569412f3a4986fa21a9d5a1de4abe9fd992eef2b1b4492981adfbdd326d262d4c55183e1e449142a43588ab8f082555e58c54daa54f1ef2bd701648c4004d94afa20adfe24e92f5f72328b8889c810d5327d137949880022e2923613911e62ec74f5958965085f619545c4af1e622c8856ab9093b63d0cbb092f2a5758ba20ed2b4dc5e2f45bddb66d3b18f77fb4b164435457c2ccda8a952b0e284a8999abbcb9710f7ecf25256c59aff49655a2313a1050738e73bc8dab31331f592d577862964788b56c71c1c56877b7051d7939522464bbbbbb178cdec2dae20a96dd82080c1975afa072850a0d90b2c4ba5b5cc1a2eb6e4114c6128e64b094ea5e518508bb6afe76cd19c344706b804ba7c1b933f33314a8b98aef8e3d9edce99428145fc139e75c7733c1bdcee2a4186bb23a97598c11bacbc9c0e2c45d435ffacbf7e832e7de35e33e9e8c842139bef7cc8b301b096346cebcba8cea174330387f6666ee6ee76f2c7ca2dab93be7e6a2f9862df09816a771f6ea1159fb9acf44132533be327ee73e32d6ee9a32a2ba9dbb736ea6d27832d9c5b575f051796295bbe2a5a495f415deb66dee3df94e0efdcbcbdabb7fce9d9c277fee91d4b9349beddbfbba7f9613a0668df9fda24abc6e40c5eddb11e25bf1499fbd87902f034c61c62bfbdd85576bcfedddc53188ff5efbf74f0616935f5eefe87e16bb883bf1a63ab5246957f355d9b92ee6e4b090c5e9dff9c26ccfa3c49e84072d9209269620f4489a484843bcfa92f8dca3f42ebe789453cb3c799439bad0da15658c3a3e7072a728e7c90959981edda55c1ef73e71803e65b6ef698f727ee1fd7c1797480b4627412413c2e7a073efc1d7596cd9e251fa4ee5dfa9fc524c294f8fa22728e444a15028fa00ea1aad7e1141a16139dc54c28b55e32fc2472ab9265e2c91a4448a1575115683e588de03cbddddb977ce3de7de7bcf21c1f573e83c4a0814a30bdd4421e08f079fcf1e410e13d1e23bfaa03796d2a9927a8b361f18aa636fdc0d414c32ea28121f405f84911d0f38e0fc0435584d4d0e57b2a4092685e5709fd5542c87110943e715452824efa806cb11536e0330f5964826460c1042083f86183231c618839a0e63223908218cafba18f7dc2bb16fc1cef173dc98a9e0de535a6312bd3910e5ac627a943545b2342d8ac5a4e42cc11d21f57d4c2d7d0ac684ed509f2fe64aefa12f71c98e07eef573ce565a7f83e2dcfbd82bd23f2a854aa4387771dc631002c417fd87109ceecf99f9755bef4a58062e4defde926d31f8d09f844c4c3f8e4dd645e47de95db18749eea6d01c518c694cd089418ba91d3b8c2dccf66dd41d3b8cc684ea48b4c6318928e75aa1b9ab2ee6ddb7e58179f7bc3ca6778f5a1e3803ae103ee8f0d1b638ef4d9417e7bda4febef49ef43ebee727447ccf99d8a928dae79c73efbdf728b990733d2ac13746d2d5a449fc227a808048df81f7a9e20fa96c36f4333b95524a299d1b092edd8b4739f49c3bc27a4c4114b264c7cc18325e94609652a454aadf48af9098e429062ba8bbf9c8d0ba5654f72da851a839b7dd376f4c7640eb5b1f194a6faad3515d117ffa80eadfdef382d4458a13d18b78e57422454b9a4c31f6003962ca45fa5b292333467e5644099de31951a29c5e03459b1e79e27babefe160bec571e838d0714387de2afc02a14ffe827b3bb7db94b0334a7847f028edddfbf1c64f9e9a94a7d3932618d76392366c58df0f3f8b31970f3842980de84bbf24773520208b66cd0359ac40ad08394f5e03bf20daa2f5b857823cca20c8b91ea3883209cea780ef7a9673ce95fe5548adc56292d4f74eb2acab6459e04ba520ea1b52f2299c452ac9e99c73ed62bb67a44bd173cecd486182cf7471f2c8f0bdc3f76fef07df72b091ded57cd0c36e227242cd1459ceb9c32bce88c5603a8c603e4d1172d8a23011aacec44a0b821ece8ea8cdd945e53fcdccf65b9339516dbacdd4b4d156311dcc8ca7b0aa7fb25bb1980a4f29800866c6517809f629542af3141a66c01fa54b31e363468aa0caff5803aad2bf35521c8d333ba230b399257a410d0e9678bf3559ca35cd9449a39f63edabc6b530bfee78c2cc3cc534a8326405d2e7614050e36fdbfaa2b14faa5c7b98ce806272111656f9676bb443b6463c0c013117953d4b7522c6b030c65d8a8e66b64c1a16cee22e68093da5666f07959fb307e52131258a2c54ac40a2ca9f43876bf6b7ed2c4e4f614c88cacce64f13337b501e945eb506f686df88282498d22a807254b339a5811687b3f40dd124ca423e611e481061ce8c839a93a0274f825e8044d09327511c01258a0aa27c6135a9e2bf35adb5d612d098073f0e58ccbe76b88c30c67f8315ae30cc941156f116e98032aafc3335569859eae7c49891bee15f2b14b9a10a334355de216c91e5d92a84b176f500992713ac971b4489bf35ec5c6b1042086137ec76b954b28479f003200b33f31f1acccc8360f6801a8879f043da379a98d9fc99c174438ec8f1b7f3d2f3d436b052f9bb81144d662e8b03e1f3bb32ce92858b8ad8c868af8cb964b3af8cbda001a826a07de0e586fae6270633735ebcb82fe403724fd800c8bd4b37c2e4a35ec18c9527ad4dd962b8c1cc249f6066281402aa98edb1360268af80828bcadf9a704c932afddc809c300ffe03e8609e18633e0102b2ccac99a081aa2869d6eeee36b7e467ca542284af972e969c947c51f98500aadcda7befbdeec67e650d6869a34b1863258cf1b72e560f040424db919381d57cb6e647cacc9a93ca32e326959fafa87cc51347f01349573019a86672298df67b450d9ad47d0e4ac26ad281f7f177cf8307ff6534978a291cd5279a303b014665660744e18455968c03ac08599603a268c25893dc0489bad501503861d51afda08903a268c2aadab8585bd34502f8c8df62539220dda62039aa7b0b4a57c1d461b61ecc3a72307308e9158a77fa57d379e0550ebe5135a1f56895ab7f8e149f5243506a50050b6c9085179ffee7d5fa9c6ab7c99f4d38e4d861c4bb82bcea8608aa47f84801dc6abfaf23010ae5bae5a80df533bf82c08c19d35dedc3ae50604c2f342461b67f56653e7ef5857ac1dc2a25f60d7f0feff8c02afab415bd34c8565700fb14f17cb66f1ccd7aa8cedfd3cf5489ab529cbccfbba43099cb4dc65d545e825f60ed6f4de682a430f99726c0f9f433972e6a6b5a84f3e9b7e23e7dd108aaedfb9bb04f5f55826ce52e8bd3886aa34cc4587889c561a3221e2614056dc0f256b9f76271831b642298d1bdb33f17bbddd7fd7445c6a8f3e56365b6d309b5cf7d18f1bbdf8a79efcaac8f4c845aecbe0608a7a455fe1931b5f5aa4c3e5acefbf670638c5fdffbf88741edb42b6bb51bcf77b58f31c66cbba8ed637c7c1fadc7cee6bc7fef51bd8a71f5cc0be625c018ccac2f2f1f18fbdaae238cbd47d2abf5215d59849f656ebdb6ad15638cd70ff1f1bbb743044f32f6f648a56207e37befbdf7ac67bd1863cff2745d478a11898f951a4b98f53d10244a483142f7480c43a50a2af8b3d014a1a1fa6e794a1f890c514b5f7aab998258cf5756a3a45508df9afd45ddef7f68476b8c8bf9ccc68cda31dfab7adff3339edf0ffbca482412e9fb672e947fabd962e957e284c0c0f2f8bb37b23cfd0e858ab10161158d180f238455313ec6958331d3cbbcfb1cdccbd0c898e94d5d8388b16b43c918adcb27b33f3bcdf8ddb973e79cbb7c1be631ab38529d1accd267519660d775ac81e67383d9bec61226aaf5682a7ef746581561e4cc6b102d6352df0564fa821094eeee268c6ae6d59b28aafeb167ce1b563b059899f957e9f0f0c99123e543078f9b607af4e460c487cc8c8911c369003cf4700489171932cc20c07e6183cd8e6a0386c375d5bc0d0d80cdeba034cf43311d376e7ad01f0f43b1776a634af99016fdf13214fb186af3b3278701d01f7fa2d8c7a0361f8311a662848300f4c7cfa0d8cba0362fc38d9b6674a4f5602a46386ea036bf43b12f00fdb1329a693d988ad1c431a3a236cf8362ef437fe8d0ef5533622a468f23c78db781defc0e8a7da53f1e09ab5a510d473131a61f1d1f6373e38652003cbd8a58c54235140d1951693dfa081c547afe0695d2833df6374f83fd8da7791a1af0c4c4fec6e69ba908f637deba81fd569b9731fdd8603f311b0cbb6e6c3767d7cf86063a1bba8bd1f892671ae295c6e606858b63f318b5626e4ad5e6e3e6d8cce8236ca069c8dfd09cc768eafb88d6a3838458d526083ac2044250866ebc758376fd415d28d62844a5799ba7b1c1c951838d0bd13ccde3b8685c88e67bb09aa4b1b941b936945ef5d1a35073dac81a4a43e9ffed1b2a80a77901f4d18f55ce0d1b3398eca099862c153fe8fadca03768e36e79836e4dd15ecce67f50b837369f63f3bb3936df507a15336d7ea7d648d51a58adf1b5068e1a3735b01a5dc3e669fac8e66d5e0047368f7364f3398e6cbe86239bc77164f33747368f5d59649b7756653dd5e6694c4596a8dad0dca05e2d138dcd47d30f0dbd6cdee6ddc619b3b902406dbe86d23c0028ed41d7e7291420f40c7c0940d767003e523e7a7230c2430f3de8fa1cd152c405972e32fa207ad10d7c93840e9607f5fb6c835da15053d47d4e62553eaa9edfe719acaafe3e57d9550e2e683d6a5ace3eb7607966f87d7eb2fbe37700bf04f87d3e82574456a75d210abbda29da1e405a167597e7b700602c0f0d5aec16ab92e155327ebf2d6157414a9fb521d4fd56c5b627ea7e13e26f4dd4fd2665db0e7685c3efb71cac2a4614ab8a018a559d4cb02958d5fcf6825dfd7c09ea7e0be2df6f1ed89504360b751fc90fab12028c0aac0ae6f72fb0195826bb02f20be4e333ab2ecde7fc7e5c9e99df97acea6180df276d0f1f38d47065add6f0fd160dc5f91c2a80b768d09ce7a1345f009ae2799a9c9741531f840a7914f52ac30e1079a2391f83a61e072ae463e84af32d448712e9ad963234e76368ea7fa8909f5c699e77f021c2cff9a64aa8d46d3854bd646644040000000023150000200c0a850322c178482868b2d81e14000e7a9c487256994a64598e0329650c32061942000000800888d094360000fcf1f728d36f6704d05fc7affeda142c0f6bb6297c6554b09882b475fa3f05de48a3abf7020eae212b54b37d41ae98cfa864941ab00e308e62fc5678738bee924a980bfda2ab4de1e4832005b2b9d1cc80520a845aa86b1222da67e10cfe6f0ef55a5033655c060b65e01c2f708187b3b90901b3bcbcf01a7d06c576ae4862d6056bab444976a109937bd74b60ff3a826eaea27d7cc1df06b3b294858362d3d611013510530f449e0cadc75ba124b3894e4c00ec6dbfbb7fb148f940c1897aba91af4b754b236031c59687836dda6e5a518f69a78a711f9714b5ca64bdd02498264b9a3ae7a529db4797cdc46c272b3f105a834517b821742b928cb51004da392990752f4d8dfd7291ded1e8ca12b64b86ab80b0d1c9163cdb67522da41534e8af7b63073e7cb13cd580565bbc1a39b9983cbc44677d336fac0861209c5c43230e42d38b114d80baf31771c0c75743c773beb59e43a344490414fe788aa43ccb92af73508fa553dad998f97143dbff3d984037d155ac182a6e3225907af714c2057415e52358bf9a2f37135f29b4b270f0a04cc83287f5beb9b3f27b3d7003297529f204315c61117965958e3c09fc62a82d368a067440cc5993cec637f9b6cd03871f671c54d3f7397846f04cc7e214860a09754c0c62ac91ba1703ba26533027013e17e640e7bd0485cbdc2582e374a02f1afb8d38b6f46f294bd6e354343d4e47a36d7c6c5766a1601bf7007a5d3a33ec840891964ef01bba2f130a17c9af8702951eb36cb125c060bdd40657b1595595b78d322433f83273f4c0cfbd7d23022c1389afaf2db0e05a7cd216cabfd0c34a89a86c70d152189376574b8872a0cca9080830f7d5591b548969063df61d6d225539264e3a37761dcf54b01a0bc5535e021d1bd41f221843820ab9550cbdadaf197b8a5e3d2cdb5d8de0012bb3164f69c23d01abdb52e56f3671b11cc8e9bcbe94484957ccdfc129c88cd56c208c33207989d643b1c81c67d691524314d19851d5af0dd578f938fb663a8bc32e0053a907c96de14da53e3a9fc1441e913ed76e4d016b891fa0e9e49e8eed0ad16bca166ee32cd412a2777252d3c2cdca036a912d9b0a93eff05f081cd446dadafa3557c1d1ed42579384a2afd23485826abef38688574122e61828740e0d88c56c070fb679282e03674dc94b71951c1964b29aedc1c91384df18a181c6ef0850f0de0adae135a47645cdc8511aeb3874c1a3ad6187ad9d25f18211415823144ba830eaa5467c2585fa1d84b5cb4e3c57cdd0efcafcc037b382a4b1117ec946637308e3c017e4a3bb3ee843778d906d4c2644b6b8af11f94a583e46224baa975471626c4a7c1525240bc358510a18685d5c8e81ff92466cc78e4dcd2f82068ddc0acfaf295380e98c451999dc42b3cf92f3446aa65cf519bc76e618a63c5646a69acad01876f77ccfc270015859c58c225283feff8831bddd6476314587320730d7f1f53ffef41442959f0da3aa7a0e0a2c7feb9bed4750d9be3eefc06654bd2dc3037a1b2c95caa8b6fe2bb8a3a523a8e257c19d8402f3f22a39acb9f17540053342a1503b4d6ec899707bc1cde29882052d26c2a11046c1e86fa8339de6f544bcf912d4524649cd52ce4155f676ed44e232830a00c12190641d6671a823fd445b382234891bdb800977e07ca8f23e626d73496ca72935676085021f0d34df5b97527bfc093e1411f65024030d2a1167b1dd4a869921af6297bf811297ac80b618ac671c05b14c3e7f0031a4e60e0b6445280e3536dcf5f6c52ccb62151fe375f6148b4442927ec0a867ecd9fa1114fadd81854186e6f079bc8867f9c879ffc650f520333979f69336bfa9d6afaded2709867c070ab27e1706be5f5a8ccfda56727440ffe129896daef72e9b0021f46f91622d958a3f3bba1e6d3945df6f00ceb493408101b2ffb0318e0013553659a97573c52d5698a1c2b185b0bf92f06b61f6ecf8cabd5cbff2c1cceccbf0789abe3a4cdeec918be99c28a965e294352b2ccb8b604eb1c686fb6ad54aafcb267be80292d445923b97da6a8a09f3162783ee81ebb611c8378a530f4b052dec136f3053a34989f739332169c995c41e1b756f456594f9882d3f910a72f0bc8fa6efabde847642a2600079e6eb690dbbc48265c0bbe3bf731634c05bb612bc628f11b024468ce7d9bf2f096950b00b89dc4525c7ce17c6c60ab0e78187752b31c2f52ce46ba4595104dcd0a0a6534c86c7360c082271216566cc1c83f7b6fb205357bd74e79c0e520c665c6e67d8ab0636846ea502dc694e9a39b25630a9981f625abd542be82428e168f987be972eda9ac31e575a1b88812454330721bd72f2dae8bf7ca2fe9a9959041d6267d14b3aed1cc2e146ed8b530d9b384252e5bff2d47add39b308cc68c6603c33031c2888165c3fc1c8dbc81a17f27127677cb25009ebdde7b6c690c405612769c65ebb97192ff6bad01b9650a8d0cbebd98b21482ba6283f0b9fca4732d516c6c2323762866e948a1751bdc1b6110889557e67f438e304c270c5ae2007dc0284fbe0a21e13e507f5e7fe62d31828f1587c197336522472908b1b941b0c39b2b695465661d63ef1ea26b95c09bef5f22665d63d008b036fdb4de710f87d912de54f567fb410786bb3fb97cc977473a7f53892d3bd5c982f524249ef024a8123d18938ab8c19524a86dc2e6ac013a22e4a07b1c97064d625aa6e726f4ad116bfdec18d3a8360cbccc1d03f2185cb8a1ee6afa55e3e1de463685e45af4273b06de942c0e08f912bbc2d7fa4a3cb562e9bb667d92d330d56bcabc8992cf168d036744667ae18d16bb1a81daea9a19b9ae35d6819d600767b90bc2d5154be264f8f66f7b9fd02efad6917ab197288a08c86eae18ab4874d604b1e82a0c9c21e45ae39c9d163c75051cfeed13318f0da13a1f669085f4a969a3ff55ffc4918f02224271892b7ed0722fa8b764e2dc23b5113a8819f7352a96fd5d0d29abe524baa14f9917722498cd5438584c572c43f35e2e2c9d6e741cda96adab55f83e4a56c6a51916245c3c2cd0383af798cb1617f59d443e57bd01ae8afdd5421f42f46369ea0664b1508384845281f6aa7d4573a4ad96b25a4cd268e1442b676545e6cf22072cef0f146382b7884a9512c849c7bf8c319665bdfe8d42394b0613641ba682bbf882f8f38cb0ebea0c3c001657091a561b0e5b778f7e3b6f625ab35e4061aa3d8e90b703aad6c00549b1d72c40b1adbffbee23d75d61b1e0b2f2871557419de42ef212cbd3346dc523fda8ff586ed0d81f65218a144b5a837bd4559febff7a0df92623ec66ac44c0df1bd03f106a8a343b183b2319587d147abb32b99c6fb79ce3141000788e71b656488a86d273c9e16a34269314dc4637b3eb1f68877167162a3de71b44a5c31f6c5f7948e4b75aae7193fb78e7a5a29423cc4b7f82aac0c3145b364cb131438b3cb472d76b18430021620cba25af99f39c57372f80db689c3142a5d06749baed0297e76bca3390aaafb63c6b012044b6f50336c049a1036dee5498136a62c80c95e45aa1f98759bbef1685b2790fd84475837b0379811f6af09625a530ef21593a6303d6ac63c78f6a33ad2850d5abe95e0e9edf123d231d3f733da12eee694d657b7a0a4fa6adc1e0ea2efc946ea447d465a03ed59367d5f695e9ded7893a49f08f342275abc35be39b735fafc4394749c9cb13d5ad5168eba9b612ff7de5c0c991131f49a690ae2ea11a3a5a5f52732704e511f193622d4ee0803e3bd0a8b0374ed2fb35669a7eb94d5c3bdcbe6c7d1be1a28ca1ede56f5b616b5e56e8e7fab157024165d0ca38094c9e2074fa6580df2318e228ebbab9a144414f7c356c564caf8339278caf02f5ee6081e6712e29c64da14c259eb3cb3ca605234dfa91a973cd6a77c500e1455559c0636b69b11d44055a938e185d9e0545ec18cc413d9b64f848e129ed6acafd14a1dcc0f4dd86d6954239d694f96055aeff2c2303906a43a18c8719acb3a0c29590a987f196a077be2ae4bb850b6f771f58f0a7997fd857ddb9a3c23f33decc6e56821b449e43c54b80f511a207d665c61963d3388a84c4ad94088da078b568043011abfc2c4724ae71218fc9b80990a35ac7feec1e480168c7aaaf16b3aac59a55a59fde30fae2b11d8f737ee258f2f5006d088b078f320f197dc25f03f7aab9e77326561cdbd560bf077a739b7c2167d4a7f66652a8f089163e13ca53539965a3bcac0cddd5e0b81c99e31685203b1699fdc35aa3273dea71860786d22cfb3ca8f79e2595167a1fb764ebb31664f9dd441928115f00ca82e257136ee5340a18649ac6087c415609bf084c0a9bee5ab565b5143bce3c6ab648a37f1e0fb893fc70e7e4c325701a601ed17ef0c826ce70b16955693f59d575a9ebad28945772e5e320eb01fc5e8f343536511a338ae6c3c74b462f5db88900758420f4006427326ec70542844f880f487b2362a12ef0b124c2c2b73a7248a263b72b0e74e655e3dc2a4364ade1112703fd59be0a5988027faa7ae34537a0b2f085d023c3d875e0eef46e42501bb9e2300c7102db703c42d5db03d98be04c82eb7cf06ebf1da8e56a71e36de6e524a1f105e2c69580dc905d42c064336c3198d4d54536234f8fe97af65a26d6ef14c74990c690e29231f206ef15d5df0a233a5a049e34d2e93ee8e337c1f882f1c560734d5a4e43eeda841ae47488b85f4fe34282e0040180ed6a4843935a961791432cb1e2927557b9137429554b06f8914ba22dd6b52ad0f050aa861b74b3d001f2f5a935ea3df68f58c7c8be5609bbcc71584b37dd8653fc0969771204a5a35322d68042402160eeeaa2c6a44d724b12a4cc7e1b0974e8d02bd96786bcae0630d711e330f1b875d0e0a3f39d3f2952388afd7277256bd72e7881de842b85f1dc19eea09f4d7ea061d2f4718279e2d04ac1fbdd239dd2b0d25dea6231f1132873b7b334813847a6046380f0fc0cf08356d3907c543a8181dc01b79622a8a4c4132ca115ba941d6bd517fc2146502246c76226977a47eef5011756833539b0df6860540876ffae408304b58a7f9bc21ad571be7ff26757f1ad37e5420790cf3a7713a754a5035014986115d33a07256e2d12a8834e80a494624d16e3a819ab7b19a973b2fb3e3720faf5a52403bb504634b9910f2939a054026145c9eefe5da0836c637102cd0f630307385c9865f52bce4cf359e2b13d6c08c347d1b968b5595ccb6834b20dd64a481501bd1420948ddb6cb5deb5217d81a6f4c9790ea227bc913c780397639a22146c9a8bd3541ef95c8667c8171c26f511bcfa0505ab8beb4e18412621d65b41e0afcfb151b34d550813d1d6d70e7497102e5308ff2ffc1e8d479df6986ac7eb56ebf1e8ad8eaf1f8d4954fcde8e393e8edf4c40d552a7d847e13f610a24ec0cb5bb5103b4f28263dfb004bab5be24bd2069fc2d8d6779580e2cbd1ae44485eae127159ff987670ba6e841a0df546b48012648a7e71cca1b1d55e12823dc025ba725c981de9465724ffc7a109bc52d4740ee035ad003113162ebac150784153c0b1e3fdca736bb204f3825029041c332039f15e62a9c4687a2fd20db59eb05aedeadde3841c147037fccc2ed38f15f5d1177279e8e4488f2ce4f0f264c88ecabacd995548e52809329b9c72b91851f227312f05cd27ff1999a593a75806b134f11aea7eac7bf6f7691bd5bf225c18b3e463c7672e003f955ee0dbf77ec993d397a45d5c3384c06c828f3d2bd48e0ffc5fd2eb4dec0ce810c465c94bb0f04d0fe834963b0656b0f5d7749af161a08f404966dfe1956ce92a5d42cd9594ddc842f87ccb80508b8b21d76821df5f03ba14bdd02d9f96fcdf0a3c5e75fc065cd0617729e1eec7b32e9e6f5618340e921980fecbccedf9b6d00fd3d36fc252274e55529fe4bf84ba82325d911c03db1d050e05a034deeb2c35a25ffd05348b712e92d56049e9d9cf22ffc3b27cdcb1d71b8d812570e3f85f4187e5304170905d71136f1314eeab82e0573a658f63d804ea0e6183cb2c774a292558620e81d40b467e3078c0dc94acad9348ecda40fb75bc0be23c72d1cc586548a144d2ced24873ec8fb21a4b56c202be3808d0d5f7097e72e8f268359921bebe0d9d1839327e615c2edfc422013a27266f45cc556aebc9d26821134a831dd526251d7ecd855f5f6d5bcc4a2b96adb0e2f84a23cef58aaa280064c86ddd28b3c247d75b055bebcbb7f8f661240d17a3111805247dd53340cd32b54238580d808c0bfff70902e007f3e4577c3139cc36b10914827ea6ca01cbff62748e50f4197fb4e0c74fd7d6edfbbac065ceb0e83aae6f789080aee92d46fcfee5528c01aab7b8c5a0d4648d20aa40bb70542b0c11b4792b08138bcaf9bea0b72a9a368d9a230fce74496eb5154159fa3286da0a391d278680548ee6d1b90bbaa9843824dbf32af44c6427e01e5b83b9f3fb047c7ee3b6cc38325af23cecd7b987b5f917ef567acf25490feca982353f7700f7938f41f7fce0564042ce549f1b260ee8e0427e334cdc339e78af3e0b32b3a2884c8a2fc93472e1939a64b627e9d84eace0c7285d25f93676ff305465303db9a4ff7bee79f5c5d994ae42927b0d5e13b2c1cbcc5578920683af873e06724d3b78c01600aed6928e926e9eda19bfcfd8823046ae93d70c4802bccf12bc11dfb73d08fb8367e891177cf33693ac41385e98bea365a532f019b560b977cd06fe719d708010af41ff3ebd77ff9af671f20fc620cc164bc04e1f42b43128f99701113b26a3a084b138e8915fe5682397f6a767d745c7af16bfd507d514d25d465387169dd23a31ab06ecc5b3d50d034af6fd5ef98ff9fef56121fb0838f3915449d224a7e8df776951dd20f73a6ad639ea34e355f6b9ab32960402bcddfe7efb68bbd15b8be8b9bf084130baf1a0be5103c29f484eb68c633457ce92492d62e2118de5e473193736ab3b87a3d62e93fb4b3dcccd93d563d470e634644e8b25892912d019f444a6dfa7c96d8194615131ffe5a18d7ac810cb2e6eb9bf494d15d8a8223267e52f584f95fe631388f4be0c6f95fd5ec881c1b1945e575808a899bb62e6b7f251e6bf557f7865a30a0f8dd4bbb4f3acb080161ad0cb37f7a7a6422329e9df853184bb7e57d2e89570d6422d314379e6721780b5fcee83e24a6e7e9c09726c637aa2d82af3c71d2064c40cb16479dbca08599a23188eb56cdc0e12162d25ca15e8d2d3d9d0bba8bbfec63d01bf7dfb0c2d411be5d0dae24adb3dd8e1ee07fb08d5efb4947d3c1c51b70be5cfc2df3246c63e8196b6ddb3896e5554f74e2acf199cde4cb5aa23786deb14731f5800e8b6244da1ed12f7d5ae903c481e9f863c8efbe9a5332fe8085099bce9f5d755f57ab8003675e951a18c51120701ef18018d2ba7da872735c30f44705c9f24a28f11c6fb38730ab79fded9df25dd31d963c732b8eb52f6688b64542ed615d6355b8e55bff464ed9e844864176f75f71436c7abef6a92cab955f582d7d7686dc4c5ac89673d568a19eb9fbe1b3a0c2a9b301ae21ad582e9737ff94bc4c658310344c9eda6832ce7b9af30d5712f9ebcccf67152ec24d038c1cacb40cb8ef87a193d3d8e7976a2bca9f0cf738f017dcf808bd702c444ef4d6e9716bbfb0e8ae820f0f5069b7a9102fb9ea42b08b159431134d327ba2669c7e00f6df9ba3305591b1e611647634e78259f6e498c881eb3111afef8c7e8bcde44b485ebb95bf4025b61d85f4c2204085558cba8324256c088e8b8c85a3c2e159fa4d755827767438bbbd5122c50b0824fa0e61894a378bf6aec5cce3651487928aba92411b44326919aacf9a7ddc023661fc75f3c28e3d1de65da03c92727033f86c492a293fc12cef40ec0d64f5a69725c748c9e1147257ec82342387dac841829c980e9fda24b7057ce582f522bf488730668574feea9578a6265987a139af99d1b3058b11631ec0c6f69686971a00760eb0ce271275151f3886e71d0ee897bfac77d29b526d98c8e46987732094700efcc61fcf4bdfe37c7897dfe77b23438f4295ec55852109b66a9cf7b427451428b63d0091a20cc959d4d59d010bd967893e6f86657f92a9479b82d5bbf47226317634de8a527b19f17a4a72d43fd9078af91c45ae16d8ee7ce69594207cff7780d0a8e646528b299389be5ee24ccc170e45b89c10d7e7d05e2372b931dd5bd59c701136e8e8094e57b4c1a17f434520444c506b40b063400103aac9c121ccd78226dee5e78e49a46eb19edd5881ce6e4ea927e8e2c69f0cff4e80abc2e2199823a3572342c04c5a7027db3982d32dd0d2940b7193eaa0fdb862e75c32071de4374687168a3b0c50af54b292064c397ba50c2bb4065b1fa61117a61018cd77cae8182fca49db4713ec5af7a7360000aed7c53f614ec0740bfe160d1f3454b07310fecf6722a152ed0c068931fec936dcf0c407ec10d092ee4ecd373b0ef51ad903f883f816ce86d26f8ce2c8ee459fc7abf377bcb6c45f38bd3ed87288c03365d9c7b1c2ae8ed6f1751f2b047eb1b4e575f4ec4dc750494359cac8f239b3b4688255ed5f1cb31238d7a93714a467db2b7b5fe9596e40c8855a1a753a5782c9cb8d9c9b279a44a22c76758772775b3154226369a223b8af1e5b7639d2aba676f9ef4bdf16d01b72d84b855a9a644018a2b33002eeabc359cfe7e84baee330623a87482a6d306348b9b8a3fac1874106068b1d3ecaa66e7f2b6ee8db02993db038e6f5ce1357beb05a517123a7cd157e325ceb98a0c97353a9fa39005912f5515b7beb7221affa5ce3e5cfa1101ef4aff8e0d21e439ed0da149c43bdf65ac60e3824e42a11f4d542fc162c07364db0c91f19d4f1efd08101809b41b51c3a98f22dd16e6baffa67cea22158aebc0d529ba1d9e8a5f61f1d470a4dd09ae838084ce90ce50d358ee169bb33f5f352cf524d9ce05e7350b813c073c7b317a78c367c0821d8ccee0f36f501489c84adc10d344d935381beb1023abed24a5122f5d4e3987327d44f1d64535e74ee92746f620a070bfed3520f9de24a0ffd81503fa8e7ec937533da308e25a1cac25c38edcf7e8af4206b4bfb715fa74f71d018552ab41a1282116b842010885db2887eb6da9eb956056fc907f646be2e804090ba65bbf366503a6867314de36330b0e611f85f93fd5a25e9d4c7c95fc647d52636740e6b49107d5a5a4489ddbbd3b3808dc6d5f9bbbc75fde03bba86df74edd572061be657ba3ec8c3db3afe0b7b7f6e0deb286bf31f02e4f20b7c70b44881003da4327bc192c5dd6bfaa8b88ea20d213a0793d466ce62844ba8a40c4f80af164e6f895fb729a6bd4aa9e2205a1dacfd8bfe0104fc021c36d562a9b0cd3e876b17c43ac3af27b5d88064cc359dc4a79ef71ce732758312a1a7ea9cece1baa338b5700f8584608894c1ca81164fb2b5670abd054c0be5ec90939bd60634e31be8ede42c03e2a1d81e8c602e336370fd0b9a16af939c49c3ab0307506f097ecb77b87258f228bd60caa20e994cf8e16c6e15998cc07d958dfb8e50804c69b191cadfb6564e871c82427f3c878ac6933a860844aafbe0ccb894b696a70c3ae6298e36c03c14070ca88df818df30872a7c8a204d2bde54b68ce064b3b804e2d033abd89bdc69770879ca88c43912e75901961bf414c28ef84d883090f24d1fdd836fe94770e3404de7834cd89df2c6e374ed9e40e7ddb98bd8e2b29441250c1d53082d0368a0e4931efc3caee1deecdefaa3e930808fd150e5969163fafc707910dcbc636be7a25540c2707729bee80c59e531dd5f62340e0879f2c801886be829e7f863ee0db7a6c0b0a2a94ec036e2f1c17eff594060f09cb215a94bf0b8218e454fb71bdc418e0db2a2e8028b00c4ae7331f1d5d5ffd217d6d35432502cea0e47355d8fc4e7f2ef8f2721720c5c2a4a9e402e6912c829b4d7be4a236e4f2e4edb63c76bb39347b586d10d93d3145adbfdaa21bc5701c944a7ba93a543926224944d5f584f13118c4fb885fac817824ac3441696d2ecff938f740c27b72e5822dbd51e33e1b5d5642938317442cd63803d5024b7cf7e24e2608add69109718099198abbd46e7bf25d2bda68ef0a44e4e4c9fe399c22a98c81771e27b5f43ead1858a4370ae3f8f9193ce24db8440d3a5656fff3557d98607cbd2deed933d9f390c55a86414a624bdaa394002484a102788980627f227ccb7e81b10f16c5d9df79e72e8f4adba9d20128d2f5443f7b2ba24a0c6671c54d5482c5d21814fe28d5e74ede082d36ff7cb7bc649dccd21ac01b5238c2685316d6ea024ebb0203e23a00ba562260886dcad6015fd7ffb3372d00555d146038ab903cea6df44430ed909d13b83a5cb6261176d140ed171ad16b9063d0276503fa83349d0e7242dcceb187966d4889e0b8a7e36aa6953a21dadb06d448e2944ebe362c46c3a6ffab752a9c4a2c17837da392aa5ba605049b1f0c4b9a50d48411814df876e58ff18bf6ea1303a706a726330aab0c4aeb7175127ad05d823804de5fbde941f86cb372fb94fd3345eb6d3bb6daf27478c421c705ea10b1bc523ebd9cb0d1019d4ea64742d442ea4b7f508ad9d014b234f92acefca76ffb52a6b9122b846362840fba3a9f15978a27f1dd7b628daf39b83bb15d8a4ca06ef59e0a6da1752f4a40f3200ead6aa873e43dea07312c7898637b4f3809131ba9f5eda610f1699e456106ce92dad444661546f5931d85588c928f8ed1f421fc0b9c733c76ae72f71c538f01f3de4843b180f4a4e1a3d773adeb5d43a1c6b322e1aa23ef56348bda99e3edfcfd58a235c8e38664d123e2905b970dcc7dccc67539fc12fb5cd736293d933365692f3197e208b12eb20220ef958b16ddc9b5dd76f3fdfbd49e2c53a913b135b5730196c596eb1c7ffb34ed89b4ac6ec55b0d49993d081ff0b9ee861d3a071c564b080807f109da1d5b655370d7115532a5f8f3068644235356fd53593754c8398a49ddf72b17b61a38f31b8228c6bfaab06e432da99dc8a82abe062eda475ebcc4914ad38d086782af9452271be0a242e5fcdc1540dd0cbeb499fab6b982f3e860baa67cf19c95764f42112ccf187dbfd30fea986696b83acfc6566f9bbf3bc988db1896b4ff127afe57e085bb73c82d2dee524624183be1825622733e412b94491070c8f1c53568a5e9a0b746409efa87bc574d28de84f46e6590e9d448a98e0d603cb66adaa2ce7106c696236b03b104d113349002fab1d9d3b40196e7a39e110799d38df3e7d923520adbe418f9aa4b4c108f7c5a42c316d2d0ea741e43c25c83e5dd3998fcb65fb847726fdc09fc30708518ffc25bd57a65abf6ca2e63938706b8487e4d000f4aa2f697026a4427b329cc37370eaa0b43d5d0e6a7dd6996ecefc635c5ae3646174353071816404bebc2d01ceee689aec740f8e669aa34c3a3d027072d72e2a3a514be49e4ecab5ffd1fa15c74d5c4a17730eae7546fc2eda8188f3cb8096585dc9816749a1346c7d5d76b4c945875828a113ae77d4254f6abd3ac2f9385eb306a7092e2bd52734787ad582a8186a5f4795ed1a959279c62432771b2463bd71891a9fb78a088905f079da29293b565be96d903a5bc6606b6260ad40197c0ddeee76076bf9db78e66e8c7e4a6a131c42d26061a8ea84cb577bbc75427a176adf7d45c30d9ca1454afe030b024f636ebe41a356c0d8aa71a058a6e2cfeb8531d9fa46ff0518bd738cd3386f5917e14fe2f0ffdff9a9f64c4ff904d480692be9c4423514646ca372dfa66fcfbd6a114481ebe3996a4e99116a23262c3cabf6143748bb03b6d7a7310b08ca7ef8c878fce9ae8872222d9a67d7fd7243d7f3146138344fd29a6c5a5da7c909c51439a042e89284ec84bce067570360236013e739d7ca65ddf40553657a443179a88d145aeb55a0bdb8d92a899207cff9fd963894eac729e009bf241b59fbc7075a5ce12e6369be79c33818f48f38e28ef68e174081848c366554a1d42d6fd8dd6df313bb8b27bcf913b75cb809d21461cd26dc5ff3c718841f9115e6766223f2da811d40ff114a1615f3ecc6f14bdb303edda607f76587b90f157474659bfbf9c11d9003e494f65a3ec20160fcea18a3eb6b66c544d56dbc832525f6b4419218463abce3a91443bbed10474623fa577f8ce33c8ade04c756513d5cf46e871c54efbd7d156c5eed8007d03e196033a6c1da0a212b376e5974fa60f75fbc98e0f3c66c8a54467392c9f9b135e5804a4032789e57cd6e9b07eb83cb2dd79c90744c7f709cc59f4caa9494aa270c1505c93e825be161c2876525cb4b81a469b06405c3d0005446019dc5080e6d329f5ead5539fdd8eaaa4c27046c018fbff166e07261620fb9f47f28c7f0f710ebbb4cd8a2d3c91c66c4f9be4fe0f1292f82dee8f902ccbd2f89d7cf581e831b1073333dc479aa026793e0ab729683d6fc318a0a0f4c73433fb6d46a8d4b31d2e7f2a6d5942297d063a62f8cc5964f3ba006bfce130ebb695a56dfadecea818a9da8988e04b03c760f9e57da4698e944eae95270a9f2145609e4ae30d755ee6bf30a0e131fc198f94c3732a09827a9b1711bb88aed5a12200706b3c4211f1a3d7963d83ac807234e88985d767a4e0f874c6037557f76141204385afb123a4a53139100f4d7cef7477fc5948186a71d026957010372cd605b0f11facb8cb42941909aff601507a03ce64a5a900a0689721be1955d7ac7df9cad76322e3b88e0a1118adba8e8956d5b4af32765cf9acadf8394baf35d1069aa37f02534fbcf52837e01a8535f2351250cb4f8c7ddcf8d371f24ce26af82815823b992cd78fcfa6b55a8ab49f3c3a7b70f9025cb06386f61620713630843acf549cb542f38deab09df5e4be1e53c38a6b68fa94ebdae25cb30a0728d07e715e3615f1b5004266b619cc903d580054a5e40154667ca573614868f37f6730e4569612331da63d00680b91f5447776df03348051b789274204f599fac0b84f3ff230e4423ce52918d4e8895edcdc004065b3f4bf72d3722ae4ca2dcaba58de06358d8adbb6ac7128c8fbd90ca43ae97ed65dac56660550324a498d54285e6a1a2c11176a9d59c462e33af40225cedce510700f6c0974845927605567e6e810a752c19ba9b07c4a015dfd1037431c8ecb08fc5ada979cb0a8537d08f72397fd9b1febb08edac29803157c32834b6f0906529fdcd741d8c91c04ead200dc991254f1f3e1548a3d400c3d12019a0cccbfa463c27a511a5a62678baa617c6f2306a8e7a34f0e8e2051d63966152a914fd642d999d3c545b011d2afe36c891ec720166c69c05707fbb01795d8ebf52a4ef1b8c6575326e50688ad576675147e2427a0685b69bb8a97fbee1f99fef9919d20030c41aedc1c0be913b768987e3c47c52c842972a88f557879d5c43afefd953951bf749fda2aeb5abf18908a65146b8c69dc6f4c3b0b4806996a123f1f36c03001a72eaf37d2eadebaef6e2f4304c3351b56ce5d14c532dedc6580fb315581d715477c14712322e3e523185d1a20a391923c21319d0acd8e5bdd3f7bbb78162218e4b8fe5849117b782a10bd26ca66f4f23f725ee165bfbcca4ceb76d9e588322ba7fcfdbf9f37a71824ecf43a27b27511acd22e1eb02f2d2bb32284d84485b3cc9a3064c61db24fe8e288bcebcc31aee283a3ea471fc4d2050e2c10364c14e57d0c4608cd75a668d64872dea4c17b1ae37c5eb71c125618a71884399465b624eb3a19aeff5d2ec2755c9b90555fa7c085c20c6cb5544911b45f3f6ecb656836bca5a0a62fe761af281e308abb4f12dd139b9b914710c726fa425362d77883402c9c8010c300e89f6d755cb0dd70272f56d2974ec55fa335f4e65b6b0e454326e25844f8c183a6631d02dd6d2845402b45f71f8035950638f8cc792c03f1a4174eb06fdfe36f087580c930aa16e6d564e2807e0a43377988036aaf897c5c75c3b8f9c8a2d57dfde0d0566dba1987f4cb37a25d65c090cf2b6e6077d248ce19413b2058bfe2fbfe23f1b91b8b1c1102097491bcc81d0838aaafae262374dc8c3f78275de38f666a38cb08e8336341c5af06416a15ca327cecf012ac90735eccae7e6c377d0161e2e263e5aa5a749142c1540c1b48eb9fe1d475ae8f453d900573d8c5b7eb3f2aa950a580564af81ec1f6a78cd128c440128d1f1f4adcf1c3b01ce5a8983336da407b19bd07a1e8745f7ca6518849f7685a5c449c443cbc9ee9f6b8eaa5777cc5736d426398cbf9facca2b0645d6497d4b6348b0de38466b550e6ebf6cf1fd3817c4aab1497e5df113cd174f4019fcc14ce5cae7ad4f9cd6e552c9b52b77e011ea725f5ae7389a46f27b869f5d6ff0f2edf4367add4bf24bec5585e03c62e54cf26b0c37035548041061de698600b7faa59b57f82f6cf7b041dc9b6015ae8b8d4746377a9fdaba679385d9bce40d606f1e770affdf3f4ed7b670b7be86345f16edb1f467a802720da1331df07d1bf34c77fa96344a8511a511e99daf37776441c42bffb278e826f112be87d2cbfeb9826d0b5c810a7431a62c0a7b1710c0801c01c099e23987629f89c9c5c1d2b3472bd897a7d829f747fb9c78a003be289618a07bbabd845ba35ee8c4cdc89a0259fe948f2f34806d63a0a892d434f550910c3426927083b83c3ad894b1d453096c82c48cbbdcaf6af3fbf272e6253e59d08f8286f87eb522d1bf6f959de19f9704860ae50eaed21928b2db4e1a24673615fcc9c2914fda0dabc9b3f9d7251d05977dbb3b5cecc21440581d312aa2c238fa0c06089569f153305338e4cf44d305f1b243471dba47d3e502eb4b38217dcfb2b11786ec2950f9c05eb5643e6dc7ddab27f6f8285ec4c1f3202d725b7ae21cd008d654f15e092b82523685709a0094b649147fa4186235331f8a3bab8d53233e11a3a859c0511368076cc4fb1c5000c56ea72ec32e3e634c69f7efc42607d9384b988dcc44b5ebcd2ce740e07486e610145552c32f202993a1885698b8979f45408698d93a316cb4347073675c31638ea1802b5fa30e579b09643d4689c71022e0db457089380e33b338815d6a7e1208671be3d14fa4694e7490db24f7c356ffa5cf645192c9c35fdf3840db414b6f84ddb84088530529737be8fcfc0ac55a0c7e626c52ae3b65a78f636b1242e0c1433c5d034e79f6818366fb6fa3bb2cb1abd1f84671a87addd063ecfa88f3878b4198e4d0c1521ec68d727c5d330c3f19d1eaad0c778837a6876aa6af4bf79b84b92010b006260aaeea38f5ca450d9e0b1cd8ec95777856aa79373f214f1d727b7c3fb1bca58ff61f1f3d46845ff80589864a4dee2c219c300e33571fccca09bc0422c0711dce865193bd4df90ba5ea060eb0bebd9dc65744af60d7e578f61e715f1cd8faf732affaeb021b6c8b42ba4fcd0c3720d2b2575276175da89167234db22a2702f6bd213b114ee83b06b69ab7ffd6fe59750b5c9590a9b58d4c7b8a832c8fcd96435ca160136da78a60e53dcc109bf751e8643024f7b10341aad651448ae496e93abdbe105b135de3eaeea8569d0c207585301d2a1bc40fd842b4dcdd00efa2f6fdad59956bcea04295f82213dabe7af4b909118d0a40c69e243c6f3f1119a936e0c1977f9c7ea48d9a062711ddeb04f9d0dc6c496516cea532a6128326cb37e0f446293b4ac77b8859609b97cf4ed7c99d94fb8a92456d51238ac07675621d09e34841c22450c6b102132b87d53380a80a62518852af3176de03b0a41734065f390db4d538b0de8fef5ea61981d8626df64d3188e3f7122e262a5af54682c477b250b3ff7e55b46fe6ba9bca0790ab5d64d58576923503f54080622bfd8628e4889a6ad1a8fabf3e96c582a08e578594e7df12d4f1f870969f02eae4bb12da1c0cb8c11e52a45f86444ba6668e4d78c09ef47dfb8a1c35e575eb1d3ee4823cd49930f8a195d1e96d5b0c17dc4435fb8061cd58abfb2a77f068010469ba0603ec2a59ac9b56f78cb4c13f176ad640fd0a1198223f90eed30fa12da3e8d4d3fad73b58f3fde04bccee01eb557a922a26a520a4ecd6aca8465174ae0f5ae429a86719ff3ecb5ce89bf4bd00edf5b349223d7bd3b9bb104549ae1a7c941382d32b804850da68c98667c7e997df137f53f8cfc6612bb28a40ba779f6ae57e6a4423cda3f76195da131d150069160d7adafe8412a4caa013a6422cfccad09cf96a037534566177fb4f580301c2e3055929576a3d03bed9ff640b87f788ec26c7083691a2ac5e009835ccd37db4784fbb1b1cabbe2af3190bcb4322de90048a7742b86b9e03557a76d7d8a49ec019be1e82cc8b41449daa6356b213bd94e2d8a5233a828c5edc404bca7da4a00775ada388ad2804fadcd5639b5bd5ddabedc5ffc9683253ec8f7954718e161394fb3030b6eba7d23500a225c372963a8f940e32c13aae9cc9e8101ad6343d71f498e28d7ff0347fe227037d9afbf23b769b96028787fdb542392c505fae7bea4325e04a7484267b0a40c184acbe624d807b25fe19a7d38b0aac2499862a39ec3ad7d07060f5f30c138344b3829baca8bd7577812f52b19cd233233bfbb4f7694e4438bde5402d403e3ac8afec91c10809a8aad582032c047df4fbc1635396dd4fd2c1836f76f9c5c51d23efe133043bd09b1f93643ed63fe02a45f553ee15e9694eef2fd87f250604bbf020da76c82784689498c2e42d8198c1c3938c1ca32fd1dd3f0294452d7c24844d2dff8f86596e96b7e7f01e879f6cd22c1b9054872fe1d37606d113c912e1ec8ef72f836f818ec665dd0d0e94b7e96eaa6ac20e2618b8882d67ab825470cf4822cc5dc72bc294cf5c7aea200ca70947c0327662065f6d9e6678ac0afc6899ddce1e24db181ec11e81303846d5d99a9796d5d3283c83958d86bd3dcec6c7ed1d31c25e9d722b82c8c5d69a503ead7737e846190732b34efca19d24c02267bbe6511ebc32625a3d4863eb768f7c776890d82601954453de75b895e54c25b3251dd36cfc1980752e4273b32f7324b1f99654801578a9b3e0640cebc2cd670d0266cf383beead4c9de4b0a20179c2a9e9289f2683ce32e31d0984390dccd132e791ed2ad284007cf551ea586ea2765ee3e8a11ee24b7767a5e5e9a1356dce21c20f51e5a92527fd844fe2cc6e3f54d4cd87fa127c880f5acf01a16ba6933c61e8216c45f7fc906e478153ad3e21603e8166b3482b4a01681b35aca38818b44d0a8f3f9382e71d6aba12155e26647c41402aa0ac1d5c62b1d1f013dca938519705309e1635320cee6a6e952752644b3621847c1935c0e13908dbe80d71954ddbb242e28b06eb57638a2366714aa8fe7824d9a02abca4096e987400193bf8688f2dca88b2d92a8a4f03c048bd413628cc353725ff9066f3cf409e45d0cec49c434d225c8e72fef59008d3d7a1b0fc056ee9b957e14fbf2b8728c1ed377358362173dcb638d83551ab35148f7509f00004396bd1391cf8322e3ee60f09806e0fae0d18a7c0a424abc74402da71780221deb5c20bb748135c8144d0b0b32819d2127782c2f655467f0b0038d2d9929009d6a8437819059a422ea11cd936a0b675332f3df57aee780622c41448c7f1d413c89088836225f2c76283d33ed1f1948c63133f5c6e88ac158da652234a65eb321829ea74c3fb65f90ca38e37598f520b8cd35416045123d358fca0f8b0f6a423b16977d34040f80ba108d0b4a2d172cac57d2d726d4dd218e3a7fd326f16107edab383e9ce6e193ba4bc9e8ae8f5655feed27f6ecb4c24206bd1b71276b584745c81cc8eaa152c668ee18d0237f429019827d1fbefe2f7bc138da9d4ecf4abdf7b002cf32dedaf4598b8a927e160c7db6ecf8cacecc13007d034ac9b881fad1158a36e5fb58c560769b62976fc82ff8aa93502dd7d8673112a2738b6fe9995ea4d7f9e8e81a55f84bf1745cb78e2cc3a5d16faee48753ca99b10d8960d65223fd48bddb1719fafcd56a7465a17518cfc1e1a12b1e1e5a5637a69eede9cf1abadd28a37c3d629174eefa05724e18b62e1e034e160274af216761ee3006e211b384304d1fd68071a8fb329f2af468f4c1defcacde98f0dc4b3603a11f1ef886524f4c01543b378f201a2dae58ebf65e5d33e267eee6c9fffaa2484164f317e187c373ce601f3c2a8124c834b2c89f45950922224b022b2f2016f50b14bc2a3324e48719bbd8a7db61a1efd61908166684313ba2ce6d15c4a58ef236303764232feb659871a9305fc0d1e0d4e523a17e4d85e1e3a271b0e4ba03513457a7c9f99098fd48d0a1075a5336d33cac561a0dfc70c4a1bc65812827c2b8a93eba9d51b123c79b1ffa3e85eba4d506f5344a51a386422dcd88c8354ea1c665ed6372c401c107d9ed8e617198accb69cda66b9972785b63458105a43ef875b55f3429cdf7868b46153f61f465b728931eef8eb63bf1eba90a2950b44bcab4710bff3275b9e9e6489c382fb0591de9f50d3dcf68256a2e3ac06e1e206c4188dc5958fdb6368860dbeb6e50ae8fefe05a3a996e20488be786ef5ae1580fe2fb8b6b98edcafd8f62a36ac3ddf4ebb0b2b4d99074e7ef02254891611810e7d1db9a36bd0720efab49d88eaa372a13b1a8971e6d4733b18db3101748f216a1e60a0de41a3741a04ba8b958a283ca429fccfc103c86149015d90c96efc7ea67ec3db8e348666cec3315ac47b30fc053b63e488928f0d9f0f180b93394a02d9b342fdededc7f44c17d42aad0a8b024e12fc230a20fcec622c77859bf146a2c8c3390ccc80c02673e45c5a734354b346ede9da49768172f04dc303d9a9c538b72004dcfa8a98d958a371563a92e1e23cd5a248222b78e0241820fb6a1b2f765ab180b67e18bad2d95b2b273c46b4947923bdabec92ab9e40161ab403c9242e925cdba992c0126f322f0d7c8abea379f0d1a498eef3b01ed89cbf4d31f461223e3602f3c715cdb9743144faf6a81d5e664f98a6f0983458c4d69a48062d2fc4701f8f4d7b6c0b6d4cf48db098fa39e9685931c328b6537e3febb1af579d9327304ca4bc5689833efc721c886969b38d612cc0ba8890e5282439586cd16bd55d2af25610bfd5a589d48f4ac63fa78da5d8092faa2e3a4f5d0967087695782a622f9728ec3f00b69ed9ea6c780e23a636aec42daa6d7dd4f57aaf37ad2426c2f4e1697f2691ca73b0ce6b52c61f77956a95db4eda51b1729b89910fb5d5cbc68cc828e924e48547ae114a6045f3935a572234ec883a39c9407b0cc002c7d0cb5d441d9e59d48d6222ce82e17619f6070f6eb19b0a742d390c332d3934b7185c33a144adb36c5ef54da1ece811d3a35549c47c011acadb4d8b10fcd4260f29b725b2592b1dd974e3a96b0b52972567d5f0950dc07652196d0f5c515b6e1eee4f553024da43fd180d3f6da196dc7d4394899e10491e6f79f4e4a6128a8ab78563915b9efbdcbe95c02161725bee8d739922fc68bbbfbabd309ac331683919aafd66680c2a870edf42694f030f94f4d389061d2bd342df9c2eee8cf8795ee90f8980803035ab13671abecfec48181446301cf0574728bbc4f5463f70587a388e90956775f17520faa81a8454f5e9ce85951fbeefa51b481b3d5db6d8ed83d3aa7a20defd1d8ec0c6490e3de3ee3ac3506fc4eba3dacc01a6b9251fa6fb3718b51a92231d6b9fdfe20581b30ccbe17c3bab8ed0323eb01f03806da52892a38dd9bc57faecf2d985fab3629c5bb43293ee9b25cbb6d92b294a01d590d78e2cf4e64259aef840ed36214e2bca8d43227a787c2232a260b2573eed98ec8dd9a5e95b33b5dfe54715ad426cd90783a3cb221bfbb5fbe47bc2fa91c4d50882d4ce1121667415946eb021c098a6f4612773bd01094c2a5e3e2949c51e2fc9863ac2589978c68cd0b312b84fba2c0b077600fe39de60064e81d08eb6b17d06d1fddf05497f76eb6dece9d5b26148492879d54379f4b8e527ef43b39c30020ca519e78de3a29372a93580995fc6fa1671b1132ab81b8bf8e63699af57084b7e527195f3247d57db91ae3d0e8908280773305819e488320d6bc9fc9ac026ca807f2b2b924f91924c98d0a7e61090a73f0030e8185d82b91221273cc796e92fd0a9071073e0c9a08e802174fd5b8654f270c4a7399dfefcfbb03492ebbbabfb62a56d2ed9be179ae1a21a25fdbc44a4cd15d8dd9c0a25beceeddca08b123426eb8b480184d85e7888963681ff1be4b5a829b72c5f3ca2fdbc65400a1f484d44c31faee696795a314d45301fc24c703b3d5f83f3370b1624217cdcb91340ed3273299a9a06c1382b901a8c3de4423d6b0ed1d3e9cfa521b3ed181e2f7bb8e66301a6bf8c5fe83590d93cba33edfc9400f674c311091e8dcc831c83f5484e3005c3b7e800fa9f3b4581b65fee1f36d604d04ba20621c5a952c256ea10e075695671322191d2e6a28d60461e9fa906eede98e50dfa221fd05a1d0a24507f34413273f8ec1360c03fb6fa959139248e195a36318c85605efa639372cf18ee16818e38ccda324d884b6938877e12c968b2365f004e85d3824d971059a27205a318374e4f6ed100d88770190a67ae49b4b484949355b6846f6addbdf19a69f2c8e22dc10b9cf51ea3133b4ea7184b63453b6c96cdeccf2709f0e2c82a7796658af1ce1c3bb29a25e5eb37e862247e91d18b8c20019f0dbe9b72175fe4dac6f5be7f10d58eac52bbac4b9c213b9cbdd104363e224bdb74dfeb299b9ff457a2db5b8092e8c0ac5fdc1011f1abf7209d716c56e39fb6f22025e83d84ef18c89024b508f86d7549991c30fe6ccaf616de57cf14f6fa3904cbf7a0b7473da232797c2ddc5c86342cfd7d6f13be50a1c8b05b03928c65e547e8bdcb09ae38e863d29c8bcedeb6ae8d00c14c33aa2e506e25e19d4c1db6beb3c669f913cad8b665edcab0693551a8d0768f34314a41baa580c339a431b2eaae4518d805bc07af8515f43e0bba813fa458698a9c2cb472bb5fa0f1ad2f2f0da69e9001551872e9f9d61f2f35fcc69b6d4f97aa25f3e61a8f4bcdffd8638dcbb9f2c426d7021938b69b0d61974a09a2eb0126772c33a0a8afb03bc5332029a9427124ec4263b04ceeaa9af2f144ea3fbc188fe391ef010820629bc46643a67b83c9eaa5ddc1cf882a163b8b795ff43f1986edcca277fe11dd844174b047fbb9658d46d0b190d2d3b77c9e3d8126db8a9a434297ff8bd2b70e28ed68cb6874c44283f60259a8ee3881d1b8d56e2c3e014e6f0bbf713796f844820cb74e19005300ff8e15c1ccefd60fbdbdb45426718fdeaf916254ae4cc62c42ffd71282a64ffc9a91979584b5aced3197cf0d0d79a28297db934017866dcd376282e11a0abe6a766406da6097890948ec1426a97948ac221985671f6d8ab6b396a25ec93f2c0e8a109302c46e68d88143d70094a8f18b8fa8e009aa81f5ab2feebf5114d5aeec1e4988d90d1461f6ad7e490590f35cbd664fa23ebba722d29082b92154506f36e4f3a4bdc1f4cacac94fe79a78a9d046d12769ca3420a74b6436c028ac63240f87f56dcd6bb9d8a7b85e38a86a05ee0cdf1f987a27a38708744acc0abdbfa01f1e3d2e56d2052d5fbc38f6631d130ade5f4822dbe4128e416305a2837464064102dac64576b0014985ac323e2743000e209a2633fee1d7d2bc3fa380cec364f1715880722010d7997736364a56bd675b8a9437a5feb21b515c2214d02da0341abeb52a8812f949e18df1aea9812b08e8d4b7821062f7ad2a8e8e2b6f780581eda715af9f7196116af5f0090b6e96a75960e802d20561928c11153574c0aa24709d29eacfbe849cba0042147afd639cc9ecf9d1103ea01d8a611f33b1c4909489b3c084260e44e677ac5c6e80299495f61513e7580fc25d0cc973098872c423ed8b75037e8b507ef170c507c550bd81541459421a7ddcf6151fe44f39368e4d339ae9b3e5258dd6a7f711129702af4d9eb38660713c760b3fbe3050e008eb6a2d50b883b15c4f012e4a58929ef14c9a9a8e0a9ca6ff9be4059b009428a66b779424794194c561719b529f6da15cb157dff1dac6909db8469d58f11c5152d79f7f7658cea8be8fed7ac7eda24c28c9d977caa63b4ad9c9e7a227c4540f98b5d2181ddfceb7539eed8a407d875f3e30ade2141007c5309a303f7ec21e8129b98746d585cc8e21bf0070958a0c626ae6a6a033557945a3df8c3233297ac84d6a020d84ae36553e2da8fe66a222d4d1ecd26c1a28d1952b900f6a1ce3da235767c663a945af475a5a5d3e83b8796e9c86c6298aeeb44088adb8b2c67a4a6e57209c0249ede11963cd211eba3c73ff48fd61e93189078ca4ebae1047ae4b12ce492cd426bcee744dccff9a2eed4d29fbaf1a4c1a9da2955021bee4b98a0dc91581f6ab14624e846b972daaf41d168a5b90d9d7e4be6896077731c4d2c9a89cd72addde17d7d13d20d2d7d55c84ec4c3060b4f65435e4e41b26864a6051943b846077a9692bb06f39aba0ab6c92214bdd8695ab9825fdd3c030f541c04f7aa27bbeb48f0684d9faa714e523535c18507348dd056f87d69886254889fb22fe570bf92c7934162078afa247c9448b8bb2a4f2a558242c35968f12734c7fde7b941a75946df2493980babbe127429ffd5e54f6742e38989c75e0202d306f3320d1365e50c0ca6862189ad9991753ee0f418248c34c49e5c1e5a18a2f643c755412297cf04d31c8a1c51912087c7fe8701ec9de61ed03d4b928ba02c60912995124034975e156cded3d047c1acb62e0547d03d8b614b58180213229128545a4bc8d7054bad6178c890e7be9a7aa311c940ec2c2a5a74715ca5169fe05a46c19304346b08cd4f98af92377fd55dd7f02fa4bce4afb1c368828914e18f0e1d6b552ffab6e7f0d7a9f8874dba0173c16914b28ffa8f65ce78f748659874ec8e1bb62b2c4518590baf7b7128e0e7e80bea63b92449f9b75bae87b31ad32efc709cc7d0b361927128133850836d91262d60ff9a1088e82313fcb75ac6ebea0372052fc4770de87902e1045f0913636ccbca4c7f08afd43f0e0c6c438af1225c30e6d47232c556d481c1cffc15b0700703ae7beab17575a6db26c001fa6362db8559f04c19c01b3add089c1351a86ec38a1a706921b911de90fad3c0fe331e6761016db3f22f64518954258d548847f51f2ae111cb2091cf1dc03a0928f72e6a778ad5a4ed9e95246a862c1fa7fcf588a2a74962105519245f132c2a7cc8c608b7a0a43d53948dfa7fdfb8914e5f3528ebfaae14c5e9f3800c244834df823e1a92c5dc76afe0981a1594ee5f84fcdd80d78e12c34bbacaf54311d0a9a198e1febf7a3a00628006041fe9441a7cce9028b176ced3910650b1c728eaf471ba2771d5694740ceb9a7cb2c21cb400ea59c147e892e581884a920a698784a2d316dbedb5682f570eef94af5590b4a5d5b68c96558080615954539f6549e49f3e19af539718614808eabb7cf2faf5f25853df2a5d250006378ed18b78412b61a11254a1eba07e44aff7195a9b191b9c76dd48e5f4aa0d49909a6c656faba25f69a81302c5aa2be74d6bb569ab5837126cde7e128326571a341f7846e8fe931a02c579e686325a79d0cf9006a53a9d6b4699f6de5d36b010220cc043054c08d2d84abcccf57cb6606081fa1a0b3964b1fa86a9f7defd40b86d767695d815ea94176b4bf2ce0647fb1f8dce74121fca80c35697b23973de68bef8d6772ab48a91be564e018b74b6bea7d0da239656cff618289857cdaf5d4edc3c0e57efaabd24a32e8b259aadf8dcd556f14fa81b521dac2210c524c559c0bee7e2996e8228e4392300e867378fbe1aa47d7f4ae87bcdde886168ca77b40a6dc43758908d14a250d724cb789965f2b369f02de9dae290a9287b58a3a169d5c8103042dcd93ae41f04f5b613303854faa23b772932e4d35c91947bbbae3c1319850c183a13f8a18feb2bbc60919e2b336eb548cd34c9a45230a80a753d8437e667bc34c58e700ad0349984a034371ad82222a71a47eac222580adadb05907b4fea8fb1f53f5c80445a5c56244120ecbce1a07ebe0a1cc28aaa01d993d7c8561dadec743e60557c39a8a6418c81b60f2ec13b0deddff568af1e4393f3464156595576409f9a967f115fe80734a188855ef1eb9a91bac3a1fd6e834290ffd743952da02e8f1ae78b5ae2226b7019b6a8a08171a70c3c8de0c51f8a4eef1b889a44b454ee3cb78ea6588f22b3d35c644def13566437268fd309b02aebb2fd1823c483346352d5e8b915cc04513986c3458194946b863696719afa6d424d7a64f331bf16cd1d010330ba613c641a22565c855cb73ce187431b2c877862b6a6c6bc4a3581c7bac195f2d12f198416c181b821f5484ace349c19de3cd3daf689e04362cb2775c2c57d7440586b05091c2851f77058ef4cf1384046ccdd6d3c38fa1696e132043ca53ad42bd84b315a4da196871ec06568d3dd40142e7044e86d019ad834cad63453af308f83d2966b346cd88ac2a423dbcbe3eae8205c1e3b0efc4cfcf91644bc792301cd35e30df1d95ba08b2c8d8b3aeb057561107dafcc8be63ace18f8fe865e18e90452c19c00d584a24c3d449da5ac5da697504f996b633bb01580a5a39419f9c75ea1bccd74430da0744c262f67d66b66d71d99bf7e6b89085cf371fa83e790f2b27753c6f0eabb2417539f1be2c64243c7bc77bdd4bddc2ecd9559c4b5c918b1112bd63564483d75872dcc9b29261e3b2878953ade2f8f28c318f70b568c194602f08e2c21ce9e9917307f88c1ec3e2d159bee7c8f23bb83c66a3755d76a7712b0f345633cd8480be2eb7627e904443a103909769d8af9435e9a7c52b076782c01485864a02060ea36dce92ff6e46409478b50cc69ecfba6ad30908484ff5e19e0bec1e2114e7e116928a7cf522fe153b7180572efc00ceee29d70d247d82b084aadf1f0ea853949cc04bd95df4b0ebabe2659786ab067c9158c9b69b20db9c89ffa4e517aef8a048091aa278a3d7db8f44869a286686887fcfa28a0d446e0fa0fb50eae1fc2b3bf139c1b4b615ec9cc24c363e7c1b0a9407b9571ef28ad29607662afc3a0f08832d9e982cf3b60233dee434bf4769a779dc2dc6ccc6914a141c14c28e45b9559b81288666d9337e64408c10a70d11951da1030fc05762a475c414ca8e0b7a9ae81e7f64f019e32fa4a3e07856ab3b0d8386abf8dd46c1324791916011199f31aa8e1d4b548de4281b40532f844fb1f13926a4c648f9d7424421c00f963f80022505985ea3c9728b97063081ee316041fe8ad80e55ed205e19d8936092b9e562ed6691b8de00e4a94d0b12877dbcc2a5ea0c6970630c3f6f2750a60e0e0c23a33099e5a9f62ca77e2cd6a74f4babb30687d6d5a7a5160bf67815c52f6364084532345d1173feb8c785f5b6eaff3690093ea79f2d2daa3d1ad62dda1f9450c57fe16bf710d1a68ddb0a79a23de2ffc41249df25c516711d21628564880922854d0a29299cb535b6b5f0d897563488fedb395653c338e9e7e9ca3e4c183c095a21158831cf26d2a39dbdf470876c439a621c8d7340b64ce9e2e9fa3f173a762a0e50044028152f2311e419510199744a622e2bcef785e2cdcdcfeb5d25248e6f5194f161ac042a4196585c2b1aad29a1dfd493ad74e2a4ea560a4b72ea184b6ba612fb1348bd602b1af0b6433cdad6116149e7d0220ea381ccb32ffdd70b5594a74963e4f543df88d5cc8d9b60c322678ef69ea5f8a978f3535e06884ebac0a3a27344496b35ff26975cd9abf48f6eb84904b2e10d0599e125e11819886da3c27f626bec8d4049b920f1efef2906932d26abcd36cb2708d37b2f5e7eb08ddc5e5592a317852da3d74c4f66459b3486cdb8539ac805e0064c12e48d6a042ecdb0c35017efba3f7ca28b9a65adb8f315298f5fc72f973612ea4e3f63a3ab6fff65250ab5d128b7188345b9227809f4c3c77f98dc2f003e0a2918f6ba2298b2afcbaabbd6e65b5cbd78cf15becd0add5664cf7ea039b281cd1afcb31068122b16a50dc1185ef3b7f22360c15b1d3447236b9d3a2bebd18a78857e3a98e68344797abb3b8234758d231b3f93d0ed9b9fd3ab4d16d430659396d408a04933d22f629e8db49820dbe442cf0de67239c87b25fd52e7d35897c99b2fd0017edbbc2f8981a3877c549851658f5823525523c7f6d5df3faeda75f509c6fd46415d5e639d7291f27e65f54c298b250031ed5a0a9991941357111d9968b42cdd9c7933bd6f2cd7492896d36e05f192b30efa9a908bf96fb17559e423cbe6f22bf7de658b874d0d5e8e2329d602d2fae4f76d84984537728b1f8fff02980ee05f8f121a02da0925b19fdf719b04cca81ab12113d8ba7450cb2c3360d6b3e5280e4b477618f8cfb7f5c469e490808785d4e6dd26ed3595ccb5ff52d724d2025c9bc70dd48e7d42d974561a8bbddc7f02f1c1e1a3a4552824d58ca9d3c54521a06a5510dc4da7c5c4b92e888423c961a1ca26dc83cb2619b5e5006db9a4757ccd1de468a2c1ad660ed898c1d438dcbb4995aa7dd6f74f6e95053e8e8f42e79bc2b76aad357d4c15455cb7259fb3214148a9b1110141f16a2454af0dbd4796aa33bc316e373f8c804e070ab06b5fc29f05979941220d0501dee461580ed97a6a3156a9cf22495739d7478f73f2c390276d9c5ae590313e429ad649fd38c4a05b901a6bd4db4fb4c48d9f58660c17396b27d08c346111163816de83df4b5228a19b2a5d361773f3d48105b281639431d4c4b0b2c0f4ae2c5194f21b6e4c4218bfd130483d2778e2a9bb734dde7793f6aaadd860314d2878649f334dc3ae360ebe726f14b5cc5151622e7ce5f36d16f652fc73476b595a827179f21b0b8a6720a038f63a4746ff0c6dd7d72f13e0c9467e9f12ada058cf1b5ff601b9faab9699621e1a067fae3b6fff37d171dc140ac08e4070c63121b0fa3f40e418aefbb33a6bc641bc38942d25bb6ab6b0af5943b4c97df93e49716b40634d469c6f4c99efe0a3c4357ff80e49b4a74461cac0963421bc6ff5321fd27416da8831d48a2d8d288ef9707df3aa5424c7f3e1235c7de7010366552d34a3f283ad95fd49f24c748c0440b40c4ced1a81e2f03b97cc1e7a474055b9976e8d41363bb59ecf87534b5603781507f0d36d9ac11f938cc61ca97334eb093ea83228ca38c9a963d47cca465c85fd2bc2931302a1685c12bb6a0c1c5ceca8a8b6355ffd9dd3f4c83cdeff8feaf892e4b1170b15d2e467c112ada2daf3c97ccbbb25497c6f2575c190112768af6300e3fe61e569c8aacb64e7a1b66fc05e9429f6ac4d2bec27c16afc2832a94c45b6c666c1374f63699579334e438180f501fce3704bced8dac73309a4f03772e16535a0d5078723ff16ff4db32700de2e1c74e3f0c8a912a9ea9fddf55e11fe11ed602c5e2126a0832ceafea72faa1e18c20f9beb7208c631207cb8995cac765f90cfa4e0fafc2890fdc9be35ea80e940c5cccd7006618d126c47ed438db4d1590a0e5ffd0b1b5b1e8a3be814058980a0ff4036bf521024163e77075848bf6024a2d0dff9031e076749a9f0c2526444a214ae435c8dada778ed459195ad92d497125138f895fa09647dc1b6b948431fd941e6b77fcdaf974bb51e2fcba1d3258d3917a8a033c665809acfac852ee792d3b049c376007cf12ec281c08c188770b3adee9728f169a46d0d8c869de23788fd52fc0e125ccdd7a8fa5d70c2390655b64eac8a832046ef026b4997073be7713b1a87b935ce4aab2b7cd4c42c8b434e27909858cf8de36adb7ffafabc0bb0be24b981c472b7b3b80363de9cd4b3a05ced36fa8b2664942042896635b78f6127ccc1688b381290ef02f39696b15a236f900c8b60919959809b174e804018322ff18eabf27c145e812e600840fc3560b703ce2c35de73fce8a73d6360fd713d6fe89db436519689be67e4a4df92db1709ad0178c0e939515e39677c93d7a182b6a456bdc94cf3beb0d33b7653ef9a7603620d28606c59c723d0922eed6433e2ada1d4f0077b3b175571dcce49a6b7fcde3ed74889444e0cfdda773ac3efd8003357b6cc3450bc0eb90e20dcf8d981c383697510b8fdfd36f87e5bb76f20ae5037773950a5e4488c5ddd149b90a6d8518e1883f987a34d8752e6656ada86a6f7e23a2ee4fa975bf867e6f27a4185fe7d15360f0dbf8efbf300ca601afbb84ab62158ad62c2afb6e56a69ad50aaf4afacdf0d9fdafdecaafa694131c95ef2e5513869c161068098abb44370c2b676b17ea0274824f7e46e9de6fdd6752a75529ebda66c9b41c407dce420c15574094eb382ff8f6b0909dd54de581d09ac5b442adc1b7c0645c69a18e9af8d46d50f90b2ab74bb7680d356aadb8727f124580dc205423db9fc01f7e650a4dd9837706be68488003b57f60bb629670181f98503c9f3a6da794979b90e6f23498e4a37b0755ead67bed2517ce6b8b8a2e29cc844454d21a6c6566b9cf6e602e6377e05c1a8bdc9c777592b6d31fe4690abe5838db3efaf456f0bdd96cadbc911cf8603fa460e9f4306dec7bc31733b64b3a94748da7861fd0433b1beac6c0b846b775f3a8b7fa569de20a47424ecaa1418df9ce9ce83c5923918de61a666889b2b8cbd8d64f9cc5a17960a2aa6bd1cea3ebadca72e7c3bf0a81e7f58bac001111481703b6d53c0ec483811a57722442d012258f02b8d038ea59c4c5c8a89f3590d6865278628950f111b44c1617ac2faa1e660edabfdc30e617bb8d77972276636d0926c010e629f56d98b8bdc1b44fe34cf623925212c7e39565c39427b39676e49784ec828f3ac2444e0db8cd3863a49a3904ea4b2d590d3c65897d19735f6e807168e1a9801aa4733231069fbbbb04420e746614578b361a3a5a8d11a29d7524d3dd4e2b601d7686d2e5f48a8cd533bbe2916bd401ca0659de73e815ca484c10c928cf2fc06e9c783d220870804721d7c5e5f25137e65af8c15120e7b8e7737d6230339b9e9536afa077266a317f2afde4666c4ea7564d002e2e5bd06cb075b1cd7271f671cff9ef1ad495d88cbc7c9a69eac3f64b41d846400a58320040ff5067d10f15f5dc925896e0f7a5aed9a70e12fddb6be357eaf2ba94ee386bcd64718d699ac1e89fbe35ae675e71d5cd4e032a37581ff7440b302b00f3fb60865f84e9ea7f64116794e7e8cefffc4a6d037f56afb055ef4bdda9a3861a45e4a7a0bd61fd3afd8b318bb52e5fd29a2cb4c0a86f438c21e0a07a7b51031a35d6b14c8c13306a7b24550a35faca6a5ea93c6d0e30cd7c0e1e48eee7815c5ce95689c775abb2c7a863015c1e5c98a6be79016b3a411c4247d027d23b1a54fb87d1ed6fc4fc67adc3478f7930cbfa7375b19eb718dc93d6fe2a23870afe36f7b9273cdd0389998ba0861fb2f628bdcd5b93a1c22f0e04967c70376302a74ac6a930a146cdbae0dce99637a064788364790d62d8828802a82a8117d4158a282dcbde339b29dbd9d4c0c0ba73c75a772159bd99c878d36e43d373a11198e29ed1be7e097800ad4521419d2640ad1fc7188e3959a54d7a97fde3dd8561f89018cc326c8a2db7148633bc50f0b84874dc33960f13f7fe101b703a5fd5b4e869cfb2d8c36af144517e7d6e853d79a7174f4d8e8a209e2e04118230d6568c04ad286559e9a45e60b2a3bb3ec8cbf945de93aa9a235a25d27212eb467208a29af2f925f54c26c268fb188b161ce9d40ac46d81915b0d0a95496823f7a50b2377055ddee80c48b8e2b53a41d4960d9f96879870543ab610ce08cea76abaee01eb1dc8eac3d82fdaab865372096f0eb59ffffbe84bfbfddc0e30cce92b4a036f52500ac161ba95423fa5a073e3df79886663bb8cf47a83899f0c8cc5ab0a92f23d148fd34f905ce53aba678ae24c0f05b9ca943279e6ed3792e6b84621ed4d70ea9f8d0c1c1a4fae934a21ba372a95a3aa971e1a3c01393eceec0ae382617f7b4cde764ce9f88947833615f35c4851097d02665510b5aeac1830ea939a56e4f70d9b907607807300dacdc4ea99954a0832a91decf0ccb9384123805d2d04d1c1e3eff7e585c4a663804e218628e4c30a73ceddaf31a10cd732ccb27a0a439b06fea25971d8a265b5a9b9ebab7e8c895b6c07f47bc533daa1d6fb4ecad54939a7141bf16e76dc2e24e4b6b7d4a52c795a0b6bcd9d49cd0e7d2321e27dd28e04b4c8d1deb5ddd630bc3ba54292aaa8af8b8e505007b8df5a1ef9d47f52022662bcae5a43312f34b0e30f41258c97ba2b8c1a4f23a2bec88ea9bcfbba8b67632fb608e8a55388a3432430156888d800a3586fc621a20a105230336eb54a3c5c8642454f0d7d9d017e22ae180aa97252be88c451a9f0619f36b23dd4865749c653b2a9dc57afeb2dc317387a16ea83d1a245c09296288fc01ac1b3d3f246bf461872d881d3f669be2243e798091d6fc3e9f81bdd182d3e3b696dd9f691f7ffed2f99c72de8fac7e59e1be504bf4f29f1b4e94f2af7acb8a4e13ae22e6e8b66e5baffbc4bc0619e4091ba4df58d189def3e8abfe3d6f54cc19c3231e2660dab7632573025099480d5a1c46b3ceffbf9b847c1be35b22fc778e1ec9ba75195c6e2475353daeee485a468fe2d944e017974cdbc2720316b53284be6000c18bb1dbf4a720d281843bb19bc48281da2d0fab33162fe74fe5d587c0e721e2daef9e5495939dfd621aeb718228b6478de75e816018805604d4e347b2ec5a5e6e4a61864d2ce4481c39394e4878b1626cde2b86cfeaf69bc9390fdfb77a55c7855011f89873a898c60b380c1c5d3ab0bb0dff9352f2ce3c70985456434d1faee8221d563ab8734652e6889585e4f9f5af9eb285c7f44ffa13d9d006861dbcc741a55293fffb0eb10ed16f924eb1233038a934f359507ec0e4980f2dc192552ab7dbb9b3360c11fd94166daf4485a1e06fd1adc86a97577d37e4f88aca80d49cbdf557fd1584a21515a58405c3b9c280e0371127a96f22e62d062393c78bbe3330b0989b8d1c506dce37cc5011b213a52a6823c7e98466b1b85cba1b9f3983aa80d2d113f3c2486dd390b6123fc5c54c5f083b7ce570062d5e6f0ebde9ed53a81f625c8dad91e546a707f600c8d9095335638e597acf3cd3f8135cc4cc3aec52f1f208ae2f145b91455cf3da86313f1b4160acaebc9f3d83b381c90620d341f9989f95ce198f3da9408d74444ac9ed9c55344e23484f74911ae0a8831bd79a66dd97869baa2f431c9514f38cad5b548d4b96e07f96dd4eb4df23e4bb89f5be9ac893c97c37d9f07c25ea180a712e295da1a008b480e60b7fb3547cb3e44dabeb2f394911429f4c4c4e6beecfd93a618e024899e6841937af29e916e74369df6aee25f86f5fa7aca3bea0a153d38c7cc4a0952f4c9513c1a9615a4853683045f81b0c8956eb15a0e39059f357aa52a7004c39f03e446030d97657c547f9ba449ed312cc7a4ae8275fdcbc359b6064f912c4e51531c697960a1ba83c4ad1e34d1d5c2a9013b386a6df37d028bfa32e23bd642c9f888dce522cfcb9ae920a10c4939ea3929546f700bb74ad596931dbbb9c4a7bc7d2a87a512020b1faaa8ff026fad3309b56c91c8e005bd49c07c63cd4543a713229672f1f125b105e5d64ce86b140cb246ace69f72850aa92ce58b0d428c2144ebd42d7c12eac34bb992028c0170216d73ed9a4458b32527dcd93f36573cd93b7a8744356a68b7f2e5327eac616aa24ca59485a3a529a63e5c402226756452e2818e41f94994a74d31fa9620e065808e601f3caa11ce0a11ea8569bf629ee2fd815f79ad9e276793e1764d37095d6f51feaf9fcc203448ea46c0039739239e380d4ed3559071580967dc47cbac2f2b270c13d404e7e0bb0e7e126fb49b4767bd9c024897680724dc81cb5a283f4cd76db9ea6fc2a7cda27e154dce045b569deaa6fb2d6ee00ec687a425e68b349851c14a17fe20609cf1fd10d974213224dae60a88b0a5a4ac407c5da1bc641ed719c17a1f76d84d750936e334ff0b1b318e1cc622365dae7ecfd90bbf080d20fb18901db7c82c0d01b0d89682d34320075189797ba87786fb5c32c407a8199f58c6bde793d81a3ce332c27189c694fb9048c49a35892c98c2ab3515753eb6d99f8cb162d34df62e0514b86043d8d5927605f467fa6b9c163ad2369db0bc70e115271967152dc574063bd86a697ef437dea8537aa181dacd4d698a524a8a03241b1295c71d02a96ac9b411c390aa05229eb88490e04ca80264d4f95684c5b4493a4f097511032f2f8831d61461aa8533d1dec0e36f54db01b914154661fe6f27d904386cd968148ba17471a630419b2f4fca3341401a3dfab436155331e2aabfa7ea5ebfac28f35ae669455fd2deb75ad4ecc16d3ad40ca50030931643c6e711c6227ca221872a0724db5774fb5175533f896217d2a589f68484eb43efe83b944733dc9f9bb59c650b41af716895b313dbdcb3dfcf5b70b06fb7077ddda9028e6ac8f43612afa811416c328bfb347721c70ccb2d8772708a779455d463237a3abf217e90c22c209a467a048f51913d0b00c5598986cd3812bde64ac3d3f8c5ec962e5544689ac9fc0075bd5f5158fd12ac21220ff00a13f6d2b3c874351da4423b696b69eb3be66a77f2d0de8ba544d9c958559e59b3d86377dcecdc63099ae71453deb01a99f4c2417ea711791e58c627abf905155a87125d135dd01d5a15cb0dae86d6dc25399af3051dab2564d054295ea402dd804d84c9c296c3ee5171d16dad757436737c98cf8fba8cb2f314867db58efe42ad9a7555da9a99726e2437e438aa80fef2efa163486dbd40383066eb38ad83be06ac7fe1ec0a8cef208400a62e1d01ade07d4ef90e4bd453fc8440ceacf6b8759de100919076b7c53dfe103a432f16df220c4afa55118c3479aa2e12ef1247682f5e337c92948b7fe83c2b68f7bd34b88842b504bdeff29184f14008feb46cf5c195a6ca075b071ccf5a83a8c8de74f4692c5c93fc3d0db80c357423035c4d96b0398e252f8b3d24da457eb6d91911e90e6a745bec1aa5991c0149cc589574f28df38b91b7e828d0f6538cba5aa61ee655090e7f4823bf98484e137ad4486340a062698a472e8032dac4e808876b09a476fb434168e2f05e0047a4c8236170011e8b9b2466962125c1ebcfd944e2d4c7c02f88add49040d6fa343504072e64d4c21f960e54f2dbfd8d70c4a0f73dbdb87cd80a6037e9bb305abf718d02c2d63c51605bac726ae28cf8c89235cb13406d284a5a959ec88692d098e5122ed18f1150e184fb8efcef317c4c807421cbb021abae95e5b308c61a40e128fad2d21af3cd6f81ad1c710069ecac5169da30b57394f065f249d0abd36f9a3945d0fdc77e790cc7ed02d73d47500b3ed0030eb996194ca29d5354fc49a9dd3ec11a3ff2155eac3b55967d0a025aab47bcb94920c8d054006bb054f50c00de45c1f9a0b5251171559ac9e9e7ed6586979ee49d6e8cdf3f9ca72ee49e610583638a3447c3d5965c725a6c116ab917b5a1c453a271ce12977dbe19e8dcb67ee798be43f492073898b547cedc771c212c2fc44d6349d3b036d44464e4dd9310852b51bf78706f4e40f749eeac2b551a0b5d97c55abaaca58a75d765c4916754ae4010cb716b94de44441a33af72c4144d5b4bea4d1756efd5835f7fcf91999653b6bbaca8e69361325483064227b6d049539feff30a32366c339b55a5b6b596d2d7fcab2d6b29675c73dcbd22c3103920579bc17947845784596f45ab867e5f1785f73dd4e09c72b5f747a40b629293b265f2fa0d9977bdadb744feb36c419e96549767c4b516c1a3c5171635104f95db838b3b927395596b07561fa91d612b927599274ac1c17092b8698d615aff2a74b6ec5d7301eae281afa0f0b3a4471efbe4970d359b470d3efac785ddd93bc4a2e2426dd7be18266fbabd3922e82d9f10b24175fa35d6517190cef69cee8900f0b7ff6ecb88b748deced237b9b906119dc70cd999b17a0d16c4de1a615cd8b493332b9ecb2e359895abea0eef9aa436ee9a6f93f794e30068c661bf685732f8adc3d6733af2d0496c706ec898e13bbc5a73d14c4d640acdce6f5ce4dc72372b8e7cca9d96dab1a605163b3bc8fa9952c2217f92f3b065ae13ace4de81cf7677f55f7c7648148d931f9b2d54efd6c55a7f955fde8888f416b940b49c46ec2b185953d04a231e21c1d7a6c845fc0b89d8e83f9346ee11686717be133018b451c821545dc8abd786163ae26edfd98b8137db062a2eec5dccb725c314787fee9ece1fb9680970e3df6a6311074a614370b37d3989873d383f97cdffb72beec58cc893744defbe802ec76506ef9b1b6f6e0b365f169810b3f16416b2d9863142ea53588f087082dbbd6edac6be56f5aeb792c22f7c02c0cfbb82ca7234e0f7c50713fa6d5db253635a998698b317fd8092337259325d819f05e00e26ef4c6e4cd7ae57a197346cbb2cb8e4b1039ce431071c5ddd7816dee490382957fe47ab9278d86815c3863c49da3903197bb31e290c61b4cce9b9f67143b1fb70619466b8d45d09a05b5b188ecea0f14a0372bb9c28e445c6b158156b8a38e8e703ca670a3b731f732c723ee650e44c3c873dcf37523cecd0f82e4c863327eee7557ee69b301f25cbffadce7d13dd23329f9ef836005a36287930a4728c272951d7bd05455be8adc346272cf575680907b52a18aa2afbdfc5fffca5ebee0dc93cce4157394a2774fab80162e087484e38b832cb03b8b1447c0eceeb8c6ea3c19f68255bd27432c3b3756de378cdc7471675865c23d6fe5ddd3798e939c85bbebe895c55df365b60efadf60f0bee490ee6393af77be6176dc4bcd448bf0a8f09f9b70cc418c2ae4ca64d5b7eb9cfd2a3b35e522c5cbfcabcae115faecfdf215e752c78d323051f943b4941d1739b03e9107b13137e03d8988e8533ee9140d52aadc44444454e6f844ee9665599a7968e615a4ec7856a2ae70d331919a7b5a6badad224b2bc1ecf8078856620aeabc7cf724338d5a25d7274a4b9e30a006b967edd55ece4490242535ae9c117fc32e697eb8aa23a9114888babe81972a3b650252a63c643a85cb650fa888aaecb2e3220afc1c423d72c3b1fee00dbcd19b88291bb0b92751a6119969ee4924c3a990ee215c8086ebf8a452f7b424ed971d9720f269a4ce1dfbc08023da01a6547ade2fad0914a59299c4096492332065c7b7a4bfdcedf380109945f6a4db41765cc2f6b3d4941d63f3d79783dda5d4ecd8abe99e35c97740ee525276fcfaa93c11773500955bfb5661f45677776e8bc8722b90a421ab4b63942665efd82b9f2f787fa7b307a61155fb7c7fecc888e94dec11665fc641d23d316efc6599dbfd57c04ce6c55394b263a019365d5e337299e30f1df3c04dc755ac6285e1064c51e7714f5cb354d6714e48b3061395889db3ec8d83012fd029c1ad712b7d0dc6931ebc1d369a6a48ea71ebdf78c7d609e2464b0f3550b891dbe1148725030c1e72b88409c2a19a41ca4765400a1b31466caca103074e6b05104b7fc74a072f489c254c374a70042449940e2523403234b0305909a90104079397189e729841b24311a92271c816281a2bd70d3734c0c410430509878d4f41694d12304f6768783962451ae921f382047a499068b051a107154220854dd25494326fac6e304343872830335088c1db98786345c81c253e88e4de84502293c27c953c2eb05121871d267c19e28409c7f485c8cf68cacf86275b926461c264860d1450a0c1c999148670e28c627c4a1e335f627cf9b2431628ab0f6486d58a9d1a7a6090e488c3bba3620892a82b449c8469220515471787c8193247a250186245ce103141703be2b48e40895145ea862a3f2f47be871643cc4ce121250a8e3220c208f1428226483bac90a736c1a871c58a1312e05903a50339a3d5a326f9208a1764e1490992d20d72d4a0019244cc981d348b12928e1f3c82ac90e3ed6440c58d93273c4568d0c111c980f8a143cc9089481b1ee004c901060f0f94df0c3228c130240e9bfb993aa9d1c2fa723d5327354cb73f4b3e6d19d4f17182941c782530a18425c1a91884e850c54c0f75825459a2a27a68b99db4fe293558b2739911a4061be6ec404607913b66eaa466299f66104e09585be6f4c63352b927d3a734553a9eae98e913540f20a6aecdf4094a4ef9b10bc22d2f00327d822a935d993e4149e5e095ef419dc0d8b0a6072349b80891f920d2454a87194192b4bc71c560ca014c93314c609ed82a3bc8d8b0e18a6f4948ba116d18145e50a0426001d1c2d85acac4b9acc60965904f85748b11276ba0e4c085cb0e608062843b50b161ce125dd522446269184f93f654040eab714f51619ea2a2e456a64f514e784a00e48910344a51422433b713678a8f6c5fab378a6f638a67aa491b281a9c28990168a5a2ccf86115c75795650d155a99e2c1a60b0b5558a0fc04a5c38408d2931c6e96086fe7cd144c05904459d3e54a0a355cb8514c3540c3549131823a538e282969555d39f2a6a98a9419bc8c50a38d5a0a416e89b18cf49c19910cc7f7e15f83d1c21c34347e45ac48d111c685a4b785867f4a5bfaafd235beec6ba864fff964eab486853c66eab4a64719ecc9e2c240ea524c59e6996622a4e483aee0af42533228e4bd7545f1f8d4000199e20a2b41477ccc0425e178c8b1df1a7662a0a02ef7043a51dafeff45a07151a0ef59d0234fa0e6847ce5e4fa26bb44b24d768d648505402abb58648501804afea95269b2637b1bf7981f469d6ef0650ae479ec0873c75a380a3b76dc1431c52e11e663832b98f1dd28140c59946eaee66106e1971e11dfcdea705d4d1232b966e2a28370244518ed32478aee566117d0b9b958a408f31b3034e9dd2aec430cc1db991b544db4457b40f838c0e6b384fcb8a55469c177abb0b14c8fdb0b7670b9c5671f077803898173a31c3cd5997ae281973bd6025f1e76c81da358041d5a401d5f9da426816be5e8ebfceaca74b99a14e1ffff4911aa87764f8f8bfc2e2d731c851bf3677ea802197babb3a3acfaeaadbd50ffa1c7344dd3ec111de78af5550fe68967e35cc41dd5133b3b6acc98336770c021bba072631715c50ff8f67811ba25dbc721b9aee43c1423b817173d09ab6ee252043af45026940874c85f469b76adaf5e043a1402f75f5d8dd8da7bbf2c477c0e209f7d95fdf4abe74247d8b87fe7addc743c94c36de1f3adb20874c87337141d121fdb0fb1f35e32d672c5ce01e4c7e700720baa0717798f78d2a856543efd4a8c3de9988a0bb18405069ddd22278d00706052fa3dd0eb929476966aaee458a64f6f68e457a64e6ade64fa1b73b8dc454734f6f9770c84dddddddddddd4ebb2b9d7c92de793215aea16d7f8681b0441108297e8433ca2445551fe807b3c0fcfc1757cfb89ee9d31b102e0ad4dddddd1f2881da5aece7eeee34e64e762fe1ee27dc4291dd5fabdd987a15baa81b263ae2e96af744c74d07b41252493f9b927b963ebd7bd268d6de0123f47142230d79715455760c346b51f17dbd2aabcc9b7bb69b13e6460e6e2b37ddc8b967f9f33d3651be273b46c3bdf6abaebf5e73d2b8906e776f30e7fe780b3b6df23aa338a83b475a98d2a69452dab8525ae42d584fb9ec96b7bcb7a564dceae6b54bb9b15f207759defb1453b2bd8b28b5d006392e00732b810237b78f5937d1d8753ac8e0dddc1b8f8d28346e25b40c53bed0f0a9722b810233b78f7923a071f70047069a9bc37caa087718c3bb75195d0fddcd613e4e7c29b45097d259a3c81ac5a9fbb8babbfb8f621dc51ae6bebbbbd73162fd9d0f0dd75df4eaefa3902f58eeca67c9e2d86bab385671147a43877e0a8bdde4de54de695a4f591cb146d1e8653320dde4274ebae5033af4958ee84af6c894fcacad45be5c6618a005ded2845932c54e84fe91ddc81acd7077bbe04ee9e5b2c63fc1de7d10aae15d20fe854c10eb8718c53a8a7596068f626d3dcc9b44630b735dd628b2465166c4056b14ab15618d76bbddeed7bcb1eedadc13b6973516564db0dbedec6ed7f5a90cf7ec5d2671ac853b864f9346c66cae9fed89dd56ac9c0252b0b3bbdd6e77ed8e26b90200ae10026946ff144ce07add90848c2ce959f95555d50f85c2a99e5171d90bff7301014892ecddb37db9d24402b2e4160eabeacccbd20d194e97925d063a24a5512cc1e80f88d4376475c846e1a649b84616eb6802144c51510c97650aad10906fb158340d1080310b37ddb37d8f2bfd15fddc7fb026c1894a30f5803861e4191dd1d87f18c0a02be9884abbb078b4a84cb54d1d8040a091d1d7aeb5d6d28cbe76adb5b2a97b52a08bff69d1b90702abb8b8beeb3fa642576c0b25595bfa1ac5c72cf09162adb5b322378dcfe733bbf52c5ac858a8625155558c10e4e485e228d6b1fba88566d01d0547584f65f7a08b664b9a57f42ca117accfe7f3599aef6bf7ab35d95831d6319a593a8d7cd2c2e17016e713abf0e7f3f96cac7d33a47b36ae9734ccbeac6199be08bff9d4a52c111680327493e686d1dc3e3f71b632041a4f6ed15515d4c3e512eb8bf5856a5cb17e531dffffffd4de12e7729d333bf7b56bcbfbd4e906b3cb1afbaf567f904a9bcd96eb9eedef58e63ab7943369361bade2d9f985227e2c96587fe808c72b1a458d5d40001c489245b6b9271d621bb661fbb2aa1eae70d18c56b0623868c64db26160afe7868b46e092b9738579a5d861f466bff641b44084c5646e5cf313dfa4b5fd21450b5399080b4001562aa366ec27c68a8de78bfe965c6d5c14e86cdc8d320941e7c6ffacb73540cb3d2910841e2ce216edc885419d3b62f7161e6dcbdddd7109ad0f746635f5eee989bd28e1d6c382a5781a400ab06e3d31a3973dfe00c73d6f7ed2cdafb8392e5ada5b538075abb18be3360963dde8878e05839090298928b7f153e1918dd63d6b4aad6561166b14eb2823040dcf6d6cdda4b885c323b701698e33c840318fcddc84e577fc3fac55e1e89dd611d3fe694feb2dffff8fb3e11a311e0a69f4d248eac265de22a6e57659de1ba4d168b4ff20b89288724ff21f46c22b8b301aac2c6b475a05502f3fe1b7f5ca96f6c4cedbfa3e31524cc22bcf3217572d7f07f99f04953ddec086cbca6715935f38012afb0f0d00913d0614bc1bd8706988221786a043343ae26b1a50d9630b2c20914f103df924914f10f96b8c041df1f8ba51f135bbc483a9863c5aa25eb83d5ef135083c3591117cba13039ddbe3a314553eeffeee1e6fbdfd2116a5157bac8ea3c8aaf65bded3e4e3ffa623287e3bc4c9175925468d192c552f6410993aa90163c7c9b6581964ea5465c3490d97303f0a8047d46bb7b92749be1c06f4ba64492253a73727e40932755a73c2af493fd1813273a0b3afa7c46b9dc35c9415239d906b3cb1626406133232dcc4d8093046a0a589151a9c0c5478b71a53f1b2c62715ba9aec5c269fa60df9a43f32f9a45354f9a45535e4b373635a4c73398207ce133c777648b9c1c50521097c2cdd4edb092134c43819167942e6f6311e54973247e6f4a2dc7c8a942c403935a0d8980387ea089c2d5a92e0b99dbd9bf5d8f0b002c660c2ee76762fdba9dc5d7868610b99137e46d6dc9a880d314daa6a08d1308101875b60f87124e9c7add920c918e226ce93995b63a3af15a04e0f545ba85891a103438a162248bca0e901a5865b63175fa338a8d0e586276cccfc08de6038213284927315484c40e1502cb149fbf2c7bc3a4b9b85d9ca12266a404040574cbb2a2320502c61a2060424d4c33587b89c6a7167a4008dcb15d44152945c16fca039954a14a212ace4eb0768a46980008c31132cc5e4d83ad9d3282a082e6b6cad58b2185620e8728f235f3f4056147f84aadcb3778f31085652205029c7ad26a1f331e33a3af29c508f7bd2e08ba30ec2e3b2abb7b6736dc3ce527892cbe572b7e672b95c2e87e69e7d94cbe5729425d69f08232e0ae492ed18fa89b38d0cdd9c8f3b1fd76d24fb082e6bec068855117a670952dff0a54eca0da489094db3c4cb1218a61a9a4670d30ad8143c5a52479825efcbacd420384cc0224d4a41a91468ad87544687ec4f837c3eae44927d48f6919d47658d95e8f43a8fd38851daa38a236ee13bc2c8f265d8250a7971d956c91ac69ad7a3346cf586d63764fd86c0e12c6949ef8985b1582c2116eef9386b4d5fd9b230581016254b6b4de999c9a8ae3c4a969ce130cb8180225dd62164329688b7c426edae119ab1f4c00ffe947082610eb416a3b2c62fe77ba82764bf921b9f154776fc3c77d37dfe3b20b0c7d95a082e6b4c75c7c68c7ef8380f5450300b967037fd7c5c8d65fa4adbe42d291154fe69606e808a5e424f7c74a88a63d31115dc00003501985df19245c62a59d3e22c087a2280a05fddf5cea93c8dbb69ea21530f897a381c0e873eb223c0e16fe81bf686f696d8fc31f1b09e05735d20e434001e0870c7e2b010977b3eee83524b602cd6551d3bc3216b18c33d1f77f438dceb1ef7b8182be8c63d1f477b5963207b5395f25997e4a9c755c996e4eb076806341c0e59c3c7bdd2f06b9f1b1ff7b82f37e8bbef0c64390ac0623dee63b08494eef9383b6c0c347fbe614f69687a9203f1224f0cd032e6b45abc46f14da42584c230586bd9d79d9568128d5b30578f621dc52a2b43254ca3253bf697750f6e615b0346b1e2377222a091b318b68ec57028ae8052fbf1d1144fc8e3599735b6b0d9f378bc168f47e389632b6687dcb3792b5e76316d851d0eabc5a1ca8b2cc9fe3f01d20bfd5aa8e73a9d4e67044294fdff0f6a22632e4a1babc3e6f995ec811fb9ac71d314535355ebc4a036a359c30daaff7ffb3f403396b5cdeb21dd42eb5a4747c8cef4de7f3b3b0bd29a9d40d563ed0aef6da08d37994a6153d011b215ac78d5ff6a98693657500c7226754fd292332a6b5c82e808d64b5eb32ebbad6b5deba83e509d6e27561dd5f53416c4071d3175ffff4c4d525421824a30d32122cb3dcd147802b1be583f488b58bfb68c4eeb58de6b9db7ee63ae17d93aeff9946f14dd7b23b88f75ba0ac89ef5de14ce7b5f53e1ef29c4dcd37bad6b5feb74ae63aae005800f52c0d7dd0da445c0afe11228c6ca9709ad50da5b62b38f8ea2dcb3816dd5572eeb2d59993b9cbb7658f502180c4efdab8200d45a67536a30587e594d9950598a25977b36d085cb1a073d277c910444144515400ca0e9123c128fd6dcb3810d9cd2953bdc3c600548385e06c45a23ea80d36d366bc3721dcf6ef9564683b459d6286eb9a78dc50a5bdbbe459b699bb96161dd7f36929e3070af195c943635a1dcd33eb967c5e1e49eb6890983d9c371cffac23d2d096e305972cfaa240912257304e611d388e98259c46cc124620e3179a6103388c9820964857bda1f28dcb3fa3073983bb387a98259c3e46126993b4c1d660ae3485494800eaecc66e30c86d96c9cc9c1279090101df213b747180d62c1cd71242a4a40075766b3710644e3766c86e39ef44742d1afba8b67a79d600318800e3dae2e44e77f2e200049925b48d32ccb104cd334ab28da5c348a8f71808207d314cd1bee49af5c5c5dd1ab2b3108e2cacc8e08b4325e509433b2343d7b1245b17e351bc5079122f9e59e24b6d6344dd33445e13b4baa567c33751aaec9e6971f554db038b17384031e64c4d061a4c898a82a6e763c69c223468e865b03950d492e5091432400752ecee7c55f8301c31728a81b5b8ef8a8e3a2878f1b7ea0a044069edfc819071c70351bdf7ee1b7370b112825a9243c6c64b955375104b9349f776c0163d9e1742b816837279aa0a8d42e97b512322335001040000063150000200c08048583e18048d0d3bc7a0714800d5f7a3874643a9a4943a1340782148331c6184200200400028831c61884cc0711c77ef7ba35a75b486098e533d56df1f502add875bf081318d9519508880dd4878f6e97b00c724e36b06a8407d002d2ceba6d292ca209c5970f394ebda5e1243d1d7f0ba96f6e1721640d8d6536f35a4e058609d44080ed13f01c187b0377dc7381c4a881b3241488f26ff764708e3e725906ebc8bb9bec986ec8a8bce15e916e389a8afbdd31b89ec0cc6149082f7f7fdde0580fe4fb15c9c60831c43c30b3dd0e47e409b06469f560df534f94f7c412c8b6fa4789ec552d1d47e285120334fdfd3965c982e9020e667d2b02aca1a45b080f6f1a060fa5d9f7571d11e60ae8989b40fec129647072ade9775606364200f44578d986414f1247971bb4337f875f6e445a07a00949c300e95a91b3780fddde5d4069f28bb7e35d654f781f7eabefe384d58c1f8879287a507936bd75c5fe245f065f9b23a6c16207a06710c8497b87d99c68e7b47b520cda24bde925bfa852dedd4989f96aa01137f35bca933a863a53a244b4b64ddea5988d5c7f7f7540c55d756ef0511e8b29e947c949d3f3283fbe17979263a8fb6e0940aa85b8485e17802844ac0062bd189c447a2c96df32367114087f96e45421945ef2776cf01aff0f0c191be8b7ff83f45374fba17fbcb8c20a9cb7af9ed053184f3542005cc1f6e0183117cc5c31b3e52e8c7b0b1770e00eb3c4b4325f5c10a91d869c0dae8e454e073b64f09d2dc7a804e3c548f595b4785e21c85350d705a67f82d2ce16986ef0424b4ee0d49209d5c9118e696b52fe0a5ef5d3719938ba4972e1a502c08e88e26f0ee235b1ebab7406120f7c28076cbee4ab7f84e271c8c8d8eab43ea1dd61960d8f39e352bd0ba76b95c590008ad8471d94b201289b7e87bd6786c9eb38ee4319b79284b5fb1ce698d800cb8835fcc045510c7147dea2de5a90dca2528a7e06e6a475c403a0fa74bfdde047a011f1240326dd92c24bae5e5d4cdf1bdca0fdecb1bf1005e100f77773bdf7ee2315cf21c4c547e8842f20e27aac6bc5607af0ca343fc754f519c8da33622c0fdab5fe5396678dacf08e8cfaf3447359e11890f00b3fbe14474e9ba8c9f4fc7e3794641ead1c47da602a8bf2b2dcc66b255118c3ede6b849644498c33f41105f441ffce260f7b3c0a3b2299808adc5aa0ea6e3c318367c1274a3f4e983beafbb357cc52f498e936f43583aa19610937bfa7ad06887c4df7a318c908752935f490ad24b0a32d13e49dfc183b2f68eadf63ffa840e4e221bea3c53381b944ea78d40a0337d69cf163b9ee0a537f6e7cdbad59189c074d557671d50ae5828c9fb411d51c9fdfa673844b7ebc02d4189b2bd9545bc9f268fbb68c2176e07372d4c18707d9d618e9559a330047a6c9db05e853019390fb20eede91c444dacf655c920dbafea0b7c90c598d5ebbc7de1395e3a18b9e438f49240360272ecf4bdc9b1a61fa28d781563533d9d7741efa57a9b82063619f419d9800e9eb24bfaba202b5a93eb8b665e74d3c3ad585aaf7c81f31030ba09abbc05f3006af5a5763e9fecead1203cc238bee2d1c3d4200e086fe5f9d115f80b7514559b49cf941b2e06f3e5139025814244f5b1a9ea9b1103e45f72293077e03e34c28efcc4554b47c129371f0306106fe95400458d8110b179958ec002a82e93e3dc96d22e0c968849bd2137c594ca9883cb684d47a5336e06e822752b8c044ad2b8d87d484b97bdf8276b48fca4c76ba72491e6f8b7cbb56a470f4855d777969ae3334bbd1ee21448a8b2f8a4c13db24c1a186f7993e00360468e3f263b1294d68cd0d3f6fac0435199a4a9c14a13de58e224a5090fd561d2d10896ef5527d68637390657caa3fa2cb38f4a88652f9e261a23fe3d09e68648b28b9f0d6d96c56e9300703f4f55b2699d2b21747852676c4c6fe4449dbe3a91441a7d5cd1b7050f04016d5edde478d04d40b2a4575a2a7224190e05a522b6990a8f71e04726db28acb3b0e78acdcf4b166eb1f01cd7627492bb3d1cc12d92dea5a5cca078c40a48b6b1d4bde6974be762f005a86ca323a508e1eab68c89dbfb227414036487714270d973ce21b19e68fcd8080b86c6a3eb87c768397bdc7676480df9d7b34fedeb7515b1f1f23d98122fa920da6efc8868a559fd08f8cb75d18f53d4ec35eb7a001d173b0abd5374edc1ac401cfebc9470a3182bf3e4c0fe36b45f8c7d96cbd51c7f07bd3c29014813f25e99f37952e87ff0503fdde1f184be8f5b836ca71fd51bfa3aa5305436c06779a7ad3adffb9ead9a645b023cc3dfc1f43beb198ed8253367245f7a8eca2bc8bccb53621a01884fbd2ed3f54e378192022c0a5d857156395acd417a47fb061d8ce4fca2f5e4ea7a60682b55590f938ab103b233c489771a23ab8ba4f36c6e7151e53c71c76ff80117a374783594153a33496cb68cd171a67f64061905f888670e3bf0f0c0ad10e6d942690f082c342bbf6e74957b8163653e897b8999003bff337e2fa6b83c709e32818a2acf246fe8602ce36e73238d20ce45069221c93d5ce51f02bed81371384be5ebf1b2e28d8a25c5b8402fdbb16b9ac84640cd300946abf07c59e34aaadbcfa3ece35a2c101240db319847ffcb65f5d8d8ae0285fccf77ce52e46b9881faf8263446e4344200b14e31eef3c0242ba4e88382a47ec04a961f1a0fb5355f4b63c6883a00ed45194a1d9ce16a9620df6e75a00b66fdd4e75926a55501970a8f3619f10f6ca9c2d806d5962d6f81650d35952a224b813e350c5f476d0ade5b5f189aeb7aa40396a166c898b4f36c00b2b3bf4d8ba14afa5f9ccb3d4b9827dee4097a7ca03c0e2b408d6890d666730fdfc2230881da76498da082e4c902775a8901700a6538a3a671d1425204146f88c58feb4f2425fedc6effa13cffd2e5dfb1bd0f3c70172c0c6a6e9b73cf77e64f7a0f94906c991e96008826fdbde144022911582af88184a43ef7239da9fe1d4089e5eda4982adae2c33a796f88c46534f1489d2ce9a13be374f030d4bb401ddce0de91e243497359f29819849291bc991ca41e3f3d1426fcf07d37b53a04f07c8c533ed481204c6aef6aa420ed0e970d716a47c80641d42364cbbbd74406b48a0d05164a995f9ffc5c3f5e37efe07ef4aea2caf12bc0f54eb6da909b592d4edeb41df30ab50b1dc63a31934b3b622214d2ea4b3a0434ed1644221c5fe5317961aafcb3cc4fd0129274f87731c6f2d619b2c53b501f8d124585c6f2af5a3ca72f725419c7fd15ef3c34c67ce7e10aa8002c22c57b6af57d7ac1b9490c182f724bf0370a7a907681847b99cb1a55485749016d5e11348dd97d3ccb49598e6ce100e30e754b61691762eec7cf0f68aa6b18ee0b117b5d72f9ed0d0ba9e99f5067936bdc693ee7a909d03b131e6abdbcaaf48a47a1e35edb867a7728c34e84bf725936e193f5c4933461e9fe22117a34d7c3eaaa109c93f9700c358bdbeeab77fc09682f9035ca36f7f1b4565057a03528d2fc8e43a7b3c41ebe3ab8711b686d00249284852b336577f5b9aa3912b42da6853a9f61bf6e59348101bbbc1f456a6ed530e6c938d1ddb956ce5224d2e52fe7660cb195242a209700012d810cfd2f6e851fd0d6cc0a581200b7f4a035521e66917f5f25599050970c84a9b1e7b67f683f8c65ec40e208ddb209fa130a67e895e117c5ad7af744b3eb12ef2e6455e9636f17f1e681270bf487082fc3034e16e045b5ccc39d999b0dfbb8d434719813641bb0ea22476928276063f119975775002acbdcdafb4f124a19a69c992ee609d2923f8b7f9d52f330ce97123d9bbd4b7c2fd425066c3d1be44779feb672e5001cc3e763ddd5539989c85075c7409c03149fda10d2d2a7da102f2578a0a2905f0f2056801b91355db85320202ea9374fe84ef89ed504fb0bf17222d598f35f4084086fb3e1db6a7b552e4d32ccd3de72c143fd89a1600bead47d8c0517b8e80c5755c598ffd89008356c5e35f01c1fd30c517d50d2d8074b261e0c467e2032877833dd41a8d3f7f3a3a40702ea13929dd209a71cb3f498b402eef790421ce9f92c7a47db094a2c793565d5a8fe98da5a286acacb23fd116ee158110f60bd46ccc7b5e307b9da9c0e626103bf6e33cc47d0f6a7a5048c5a0f4dd55479780038815e0e9af48ba859477caaad3305810dea27b9ac1c7d1c505bf5800cbbed58e7ae30ea8b6d79634a6b136da2810539532edb24fe6e8b9b2c63240a198636f1382b03fd00b1f2c19ba9a711f1732e027099814c3a04de4b0d014d9b246c32ab4804c1b115c2587ab05bd8e5859897849091a1122a2d6eee9de82e4de5977d6533e4dc0a6d8055a52027bd56a105c4790add87bb2dd1166823f5aabecd57b14264e29ececd9e034eab1c774d684334e1ec7a7e6ec14cdf3e41b797f232a6dca41ce626cdbf04b6beea16c949a57bd7dc4ac37fd48002e6c5f3c24483b1bf1c3d34646f598514681d95edbd7ac38aa8801e135026db3503430983577591c272f42859e498de7616fb609d7b8691afbb8856af21f05b9f0abb9e8a26587a94e2502b88d2ea52ff92a579083afdf9edd04d0a4fa6e2ccb207ece7676b9197af34ebdaa481999a75a3d180a359d7f33f7a7189815a6ac4e157999215e3f638f6a58fbc601a906d3d7cf4f739b3230a20327e8f11bd922e9f10f32ef77a944043c2df92ba32038f326f83952aef5eee1d3863b53d299bd52c6252aaa67c9b09f448325e16f9ed32e4336ca29fa999b049d6f9b67d1d7a0e76f442d46a700887c86a2fd5495b966ac58abcae79c1404a9a2748d8845fee3a14a242d29f15143250ba5cdffd7fae783780755731b04d19f1b0a12d47b3878c8e1487cad9ceb79916dcd64b6cedb86dc9d3d9627f54fff3e5d43f4bb65afaa30c543c0903d1b34e656a13f6d01adfaa77161a376ffc9278550d6cce6d84c74dc55b4ac79e9202866fffc5dcb07ba3c1ff7834ee43af33d5da4dac7ee95b91acd53700b5ef3ada202a735508459b6f7cac240d3f41e0e812236144c2eda9af8e82e7ebcbad9a9aa8059cd8898ddfdf68976c6ea3bb84d03ef09224cb1cb43248c65cf864310124dd212def8054d39e801a35deb7f730c3da10742e15f223c689feb4e18f76cf4fc91c9c5c6dc862e4cf5e5b5d08b13052b1dd6b723a1e06354eea90781585c838cec17d7d57a26eb2fcd42fd7eee4f32106dc7be6138b7bb827453a38401dc9752a0034692714308e27121e7cb6a6a82d073ce4c745e19e40e05fe638e85e3c4459611916d901af75bfd571bd9319f30549d8516f55db788a683e57668a0d557c7023986fc0f5b671444e10d6207dee10678f095c946f9ccc3c38c8b8daa092427ba4de81da39424c5058d70bb0188051c9a4e354ab03ae26552a24872ee261066c220a92e1f2c7995d41554ca4c6690cd4563b50c831cddeb41bb5ef7c6039fbb19c462d1989a3abf7d4c2c0bf11275fc9a39325611167e3f4c169095ccd7573d96fe776a8b0e5ddc959ed3fafa13286074a2ef7d3cb1732d76449fdbc536e171893bcfa9f06160bb8247adb2282e50195ede949eb27aff89cac1f9581a32250bb67d1729182063002373efda582decd23f9eac68786917e931c7f27b798bbb4a2ce7bf57e9cfae76b588bf9c51ce6e13c530fb3bb55e1633dbf6ec5998452fe58988dd1d85e16a7344f26f0f88750521742eb5f79c4aadd5d58513d9bc9be27fd22f93a487660cc4cd2b1fe4b4b50bac92d02ddcfeef7188fe4d4c3f705c76d810fea9b44362b270b65737091068ecc657176b56b80300cfd3be4cb8083373c7457b1bef202380ecaa7b6c94b8d6b094d6774d4a35d3d001b92a1d8402e5885dc7bdf5748b41d932b75b56aa16d0641d7706e25e6de649c01208c435bf37af4a067700bdb268990f709f7692b34465e4b7ccb0742d849f758aa5d07d7823327fcd4c89a9364b3405f7590e93d68c9e2ef2c442b11a80f63f94a8edf0f3ed0959ef468d01c2c337f4dfe0d8de8f7e5c93d622527810b4d08c6d4df6f141b8c4988ef399babc7ccbf7d427e94a75cd4f285626a8a54b85cf7e01c0037d15f1a6e3a60e68f335f7a46cb055341c2d91603a2e214baec9cb38d68737ff6a215d4c8a9cdc3b3a9b94518db4918eb3dedffadf7f1bf4131605bdeb3091b83e54ec07c2ffbb9234eb350ec0ad04fd422af5cdac57270fe0f455a1edbc3c9f11b01fa9ab8acf93a3d9c8092f868a66fa19d322b7e3c6600e3ec971aa11952e5f7af99f6e56815cb5d066f567d1753706437773c67dba632a707c0ae0b48dcf9ef00032517638b03844477629c5bba0c12d59971cea77ca8c4252f5f7b818b4e60904a54013fd6d15650d94ab37f0bde49c31c8a31afd37ccbb0c9f544a03f08b943e1587a0a794088c4bb55dc355f420a121216fd820555506365527f93041265794690ee10eb5ee070f9ddaf8301e0050272bdf692a9744ab17489f1dc834d89de57a3098574d80b58113f3adc54836666d845db0c23de3296d3c44d0bb5b64b616ae74aa8619c7e7117c25a126b9cdc394023a48623c3ed2bf9fce257c1b89399e7fcfcc1e318df9f380cffa72f20a3c6c9924dd56e96be02d0cb2edd4dfe0ce509d54bc3288e1e4663e1f3b1d4e915be0f4a4a9dd72def03f04d89c5429a5ffddd725c52a23acbf0db52730929142fac2592bcf8dba8bb131a94dddc57f80138e54201a734a4e2830305d121e7745c2f642209733920c4ea119cad1697400fd2e4efccceb953d5514f5614ad05928d7af68012e603e6be0fd8c42dd144e0a3027223ddc0a37392f0cbdbfce3306eb64fb1050ac6161058660a5e68532189d345e007d08a0b9d7fb924846fad85849fe49e989845fb967ec788b62bf42209a51655ff32540c20753555fa96b75f8e140cfd39863e4b3e4f74775ffbbd897e6d1d97e78397c5db4f034f51dc667d6378ceda932d8d90dda838f99343c00f5d9a148598beef6a78a6616ca7d145d314a3a20ea7dc95e0230ca2a9bf8f423f2caadd3c342ee2e296025e893df600da34363e2e4893de84010b53c2e4283882b6f0ffb53e390eb72c20c20345ac86abab3c8d7c033188bcd5d38e2a73d263fe3d94cbcae3dcc98570206877b065eeace2660aead7307a62ebe9033d2a374066a05ea9e894309c84575e7a9d5c116e2d7bb7797a13cd2a1690f5b3a47089c913593b2740649c26d7776d57543ab00a9540b7c66cf49081959eaf3eb56ba51a13671f54df4aedbdc87caa45dacb098934a3c1449c352201d0b3026dafea8e43cca77e5eaf5ef003d63342ee7869f1fc6b4ffdc08f681746cfe6422cf0ac5365075d0f347c6acc0fef894fbc253d8b7d7a351919fe06f2ffd83c50cebf3cd5be3f40cb837040bfd0a7fcf0754a7ceaa7313b1df66c9b27a5f72eaedc555c5abef891d5961b5a13df43c93650e226fc9f08219b8e9c9404dc4e2089f33796fe0ab685bf7e3a273d6fe63e69336e2f2a84b728c42847ca22fe896ca900dd22937314b89f293168d1580f64fce397bb0381c8a1f830211e6f47ad7e050a9ff80edac70d7a8309d88f27572180e935d52db79661543f43b50a837dda035c63b29fa88d4406ea23037c1eedfc3efd9c27da08db03648cfe34280fa5949e0a10083c92e51bfae3db081444656cab54811765ac9646d0c7e2af563de6b43517f37c4cbab670241cce0a9f0774e154fc0af3b62fcffb0f197a4e5504ad658c31a3e4ce88dd3877c5874a820bb2f0a3ed94d79e5de751a2867174e57e11938ae97ed28a385003528e0c9c652af27288efe54f2b7cbade899bf31b87ab699f2db60c070c71777caa794d28342c978253a33637e56d3284517f42d803817fbc54244c014c002ca0fe001a5fd044fad99c1e571b92cce739315e5d28d0e0b249c043843442751835ba1b4d33d79d87fdb8fc166f85122f3b7e828a83105e00e4146ad7a2d2390417d8a29af51e230955ade4994544ea1120fa52217c86832e57b54d1c170b96a1dbd89765e2e80f41ba9e0d7145d97cc88c58d3f9cf21542dae4df54f4acb23ce9523fe049d320691d0e4a8dcb96d2cb224e6b990a3ea580075fe46737640c76c87b2d6353d89fa15f6d9ab057518fb43e7265365580a75952952c48800551a6cfc7274b369349c5832ac2bf4941819bc049ce808684b4bdf28dbcb7569cf859fa11f2eb890bd0e0d53477f745e5eea44f1662f2c155ef2021a2a67bb9e5b61edefc70106bed4766a6ae00afef98ddd530aefbc4dde222836b646d47219c1e72297d91f6b842889002c104b00cd0187349e14857d3f3c75ca2d994f9062bf93530cbfdb1c22b323762488773eefed55602c382e98694470d365dea0214d5c623154e97c067f5e262f7e8f21c6095d3da6d91d9e021bae7d15c92463efa19b7a5e5c2029db573711916c9aed87dcb1342e1cb39dc90690fc958c40db961fc394a1cc0c8d9cbe3d346e801e69c4ee19438df4f85320e3a838ac9f3e9b8d997876719d6a8893fa2124582cd6d5f3fa71e139def18075522f97cfb749395afdc5bc15bb470cf168efa01ed68708995a0cf961167686b627ae3eaf3b56611e203a8bd3aac3ca33f477f870a65ec032106d507932817b9cc09020122bf3031fdb710a43066e297eb6218772a0c95b0241c82307ab118815d373d541e3acd42b100337249ac2a1a9f13f3c624dfd7ea0c51b48be02765875783cca964b3b0ce3f9f2b70ccc9c42f747cc6a4cfb3003fd4267717b8e75083257f099a15e54492c65ee581d3d7ee655e8bd2448073ca299536b753cf7fab00d2913483d163beff69381f5cbf880d54b3a4f59a97ea2f4964002fe4f00ca63cc3aa9b4c0641240b50d15cc8483ff0c19b97769ff382ffc09fe0b84c1ca1f6563dc3a4d0cf064f2da35aabaae661ac22b9e0421afe4b60fb9d359b3058059843c5f96f1c4a6ec6541a5d8fffd628c303605edf036b9c99e77e4b641ff0ead8907ec9f283928f81fa389a1c712f60a0ac3b9b886d7bda7386e1f254f0dfa9d875c7a21ae652db0c3bdac33e0f260b5ffadc073624824dc3bdbe888bf7004134d55b198a476d73a3d7c25a623b57496422d9593d97129c51bb25aca70678eecfed01046c13d4299bc54496c26ced04bb7e504eb1aecd261de8589705535aafed80a28a76d0fba282b59aad0c09a9c7c524888c30e485f26ca99da255c017e8867239655f10039d969d64d85f3b10d1b6efdeb7540cc78436f53ffa8d52d2bcc8c0b6401d1debf66a529d031df20a9dfe28952905fd64a6eae14eb8724ad6dc3afd52f5cf0213ae4a463d21987443e1144675e25c22c039d99597fbeaa1995b6ea4ee9c2ae7bec21f85b375e648d5d00618fcf955098728ed83a00cf8b2f4e3f860481ce12e5f2931d59d714d96205b392fb3988519c21723e2a2e75346afbafc76b2c989d6eba335c6fa704ae86a574f67cc3c318c15857f02fba6b0de6868744e540b8de474d58bb2613dd27e5fd64812329ac2cc9a42d9090d39b3d155e6d2bcbd511c857064229e71c82aed3be7e01eed54d2381f605e63ab0b0701ee38ee6f0f18690b15501500370284423781831bc7327122b25cc2bf035855af86d21b820f7557122de4c9953a73ca0e50e6c079f4648449763045501b496211851dfdbc2b364e67850553129f8b56ee2c99f2d7c30a974121566c42b6cbf6e55285064d3ab23b38194a43310645a9a07aa3ba6894a17e40ac7507b5a3952644fe37f2af01eae04495d1bedb18cf05d890802ac2547908e0970b691a5997a27746e390200896c3eda24707417ef81af0223f004d7be088f8ac25c8771916926f6c594261de44f82fa27defeed63000114233d92f4229b0becd86913490caa2d30f8a585dc83424fac02254ef3e231c1b85c30f15a0001d962446fd319623615a971d2ef824e9b6be93d167fa13e0cf8b5989256b3eccc5da44096d5d62c2677037a1aca0df6e9a2ac173f0dc5062ab978de52595ffb4f007303960aa1e77cf4789de7e6c8d2b6715f06182add31f712b0909f63aa52162f406899f8886b3306936152e1eafd6f317ddcd7740192152b608d2e69f38c2e958e06229b7605bdeb5433ca65220848e19fa53d2a19db0a14b1b0c65c306a960950b897c0ce05683447cefc8c37c2ccb6cf2f07892b5cfcc219b46b31f908b455ca1edd2854cbc3b30a72c3cc167f99314ae97ccd964e9538baaa884da664a0a1a15f6b3a0a8aa5df4f94b40cb7e9a442d391cd9c55cd834e2b054c0299e2eaa2828bca3cd95beda8d3b5d02a3d42b3d7f5f492402393e53572c2aa1d64d922ed518cef494b5d16c1fe66ba34105a59a09710b09f0dd6868bb474eec69dedbd7c555784c154abf5dee6d55484a8d1b5f4fc9762281a4be2af21649172c8383127c2df1b217cbc716119d9e492c37522d43de2c8880effeafd82991c7415db300b5d3f76c60904f1e2f5af98a7afcc08aef707cfd76690d8e4debfd4aea936795663b4f02a5b0628d7b8923547264e95ecf82e0e1f7cebb1bab9ec90c1d41b352c2e509e08ffc519db7384f22c27b8bce782a4cc6931eaefdba302961adedd82f602f106f5a1676adbfd8b64021fa5e8fa569360a5361f1159f5aecfb2a58252719f0b1e9db2f19a1be643ef9fc7077bba4b3db1ab2cd308eabd4940f6478c057728331e712ffd86adace82fca6ef50bcac892bafe2f16794d12e15bce2438447740c6ca8e872e342d849a4fd6221db52ae14db0b19dabca17af53ce4a20f3a8c723d27478d47346b447453eab76a61990cce8555f639f740f023673816a09ece9e3126de32c2fb63977a2fdd97adf8dbe058a095c41160c4441f5380f7c33aa86df7b9aba367814a2744329af866190106babb3cd2396196ba8f51b1b77d959a94603d7b922c094bbb18c5c61b66a110bdff280fe178eb0c03a6ad7442328848c7d156c03c1c2f8979796fe9f0640e6f729edab333d16b973021a4e6a858dc68455de1a9647eae9a44ee021512a4f90cb1d0abbe05ab0aa7d45d58b35530a7856ac45f36d48af37dfab1145ea4bd4401c5898f1023fc042426f30ca21abe2974de0d6a0cbe12dc9b8111f4401682580285f897225ccf36d0b13c0fdd757f1564d589bd396d851de51f75e28c4c1eaf3566854ae09ac0ebe0637d37813e731697508f0ebf0f297f34f2d2720ea72d43ad64261e006b96223213ac2ddc88cab6cc2e54850e43a325e5588a9f9dd8669c788e9de938878f14f33b40de9798f972a0a31b8e9ebe720527616af2ba02b8cdaa58887ea9c036ed7f2e368e9dca2b140ddd537f4ca02d5d695bbe5d59f35492172275c948649f713ee5e69f6e5f5eef97e7f65bad3d2bbccf1f359ad93f172d2e113cf58f6b3b54fd97f588fc059d0836a4fd835feaa5d716eda3025a5dd3dd96011c564505f049e08abb9369527a07bd23464381a312a069d8b3e5af6ea4e72d69c07aa0c054b4df3460ed7d12b2ffa10d921895bf231183bf29c90dee9eda2066de2e6f6c99bd4ae7740b88472835bb36611b6c66357ee6a0eef43661bc730cc227f222d3d536a9418a4dd4ea3c38132ccdca317bb6629d0f2ac1e6b9fc12dd24bc78824ad2c50b7b47769b9824eb2b5ddafa48d16eed42c704b0432cb6486e6325817721f1c43507ace58ec4a4207621602d6d8b1f9e186000ceca3ae89cc15ed3c700731f6c9483f0f4949f614cd2b069bb11fa1b1e90ee9edc3f115427f81c052fc5c5851cdb85a67144ba0f51b9e31e6d8ccb9c8d2d6de0ca3054bb515d3837cd6b6c233931b2e0c9fb94f7b7ccadda0c7476e3cd8a81d24a39e7a03a56a407c091029fb5f3cf88dede27efab536c607c5652866c77cb8debe63df5e38490c7f7464f6bf29d57ee9607da384c87aa84c1506926451b16c7029db9aab55ebf2961baf09721e439681561c855fcf0e294f0c98aff5d778e770e4f8219f93112ecb87bcc0397aaf13fe01b32650c14d8d22f240efa7c6ae82fc06e9552febcaa41a2bb4bb32a5409c230b70d3e7f0362b0a6ea39e70ba86b781e81e149ca611f8e0101f764b423cba98b3c166d16cfaf069528c565312daf3ac0e5f4a654e67185272d21c26993aa96be3e2eefc44b62080617a022aefbf08f1bfb61a8a65fc648a66e0b73564a15c17274fbdf55cb2acd91c7a2294d62d99453bda71ce99c6636b002ec607a239db22ef0abc072c0ed88c10b1bd894218854736ae0d17d718f0894945b6748a33e056dc0c4c6f7bc00c22120284caa19a3122e5aeddaf047d859c096a25def1908447000c7756c384b3f2918d5b03855512c7960dde0560211e58ac3d99e6ab20c02b90efed6c05768477ae0a5396c401716fc812c3758b8123fdb2c4ccc7d1d46d0f1c36230ba86db36257457a6c85a088b8e72b442ed73346b99705c842149e45735309439ce756b70b3ea948067dedb0d060ca421bd770a1a201d8349cddd4f3d7dde07105a3899e65775a19367c1ab7dd409017cc4e531e96698497223004747dfb9ef08d9105173a23144d63fa3a1da680f5976e0605bf97e67e4cd20282d782541dc6ba41f7fc3482d006dc985048e449e19d46cb88141c0c8b87625c7afd3678515d892710654bed19c483aef045e2e605a6bdb9d3f3ebb229179082dc52d39bc642e771e350f48dd81fcc5316d64c771de715fbba246580961f302dc08443d36bd528d337d62089d81988dc8edf8696b082a39c6bde0e4e17610dfd8ef87064afcec1f722ba6d9c636f5e2e767ef1904a8cbfd0201759cfbc0ae10d142879a13df63edb012c96b054d90cfcdda083065ed43aa33527f7ed6e40fd2f042310f41961ef94aa9d7aebc9012e57db3c7a49dac4ef40149b17acc4bb0dd44d7e0acdb8311c182bd2adb403a01a46e589981c5b2e0a1181889b63782fa2954c27097f7592c87dfe73bf11b7478ae00a161ab776c3b29b5d7514fd101a3671b25896c5907bc7be1e99020a88edc50a2974dbc726edb60edf7a15bc4fa0f8bd0bb85c23f5003ae4e364d7fe02d3e75b402aef66bfe10d671e6c73b854f2ce30138b0c9bc049b5f3612e50936135795092436df250fbe429f286bff075f842d77777fa069fd690202fecba802920aaf713a0039dfcd1ab4ebdb8360810ae2cec8c2f31885beac079f8086dfd6d784b94e3a5379221609a4dde2a45e22e3f2c24c7e9bb0b720f14280e78735e3e913e7d2d170f1c8f8be29da6a3cf59e1e72f78f90fa2df64241e832ed407dc880076443a1598d58783066ac662c6dea0fe81ecd393612f4df8466f80a46689bd9467ef9e29e0ac03b1587bda250416cf3843b983938ffa4aa11a66899b545ba64c09ebf5513c557a29f1e241739aeb87916911d918619894872703a05e8206fcd22bca8ee810c48442cc4f5a646a527fd9dd13051703da4542eb4b2c93872812fb31421a91e5cc46f7f2a2a4d0e129c61a5aa96c52c041952250388823cb715b43b634a1eaa5a26935c992ee6cad8e44f94740545d995ea871eb4e6e293fd825c507e61c582ec1fa260ee58066fcfb1253b9e253ede720b4ecfd569ca325da5e2889fdc78797e393c28fde750f8dcd13b70f2b7958b3f62fa63f5e6313fbde86e95f9046b1b196fcff9504839aff596115e3efb282cea1cabf53da37055f8554862fff2622656ca657fe170df4a1a86cf6fe320814dfe0d7effbfeba3bcab5cd6a3244af43cd6a6e3c6b6e0aeb8f0b22a634fb6a59cae4dd3a333292f505c8f7f07dd6e6aa535abdf71f8b8fead46a1bae856eead887fd09d4a9a00faeee4ea3878cc88ed21db7819f1f086c72fa7db54c4e7ba822b1ebe836f1c12d764e9f20323653face2613eca77cf0e820b0b3fb96e7b49bd7bf4244af2866fa089489f6017fa15f53d00657bf256b470e51faedee251144da31a5dbff9f25526ea8335abf83119d286c3de07fca96c0be8fef1f6c07b95eda9347e9b0b32ce60de8466fc6353f817cbb436d8642f7e081be9f56ba6d2f77feb06ec680298d39fa6a4731a5f924bd03b5cf535d494adb628e52f963ad80953536d08bfb367b950117abe8ffa7420031aa89dac2cd78baaa289fac7063aa9a04332b857ee128b89fe637662ac50f04545a11bd68b16d58a9730ea0c207dc04158e090bc1ffddc6c31ce29f4afbb763607a85562a5dbd1ac72d9eb5500b0d4397a923cca53233737ec4cde182cc619754b9d80b2a528fd34d6a4392df07bb44c20eba205e1c0f7d86a4da843059faa90ce38374d238cafe914da5838eb1d4f61397ce1ae2a7733ea55d19d4e4de5b18cb6f2f616b43b628b0e4c3c44fb147db7bb5639d9924a4e7ed444ce317d78eb064f518ce0c4a183ee90f81a0642540831cfddac85cb394c40183fcf5856bb6597d5130b77c7f4d6322c96b475c16db838d515e151957f32d5e88d1e4aa44a958ae9c9b87e22b9a8a280cdf5bbcfd74caa9d967b405d0dba9be2135bf9ff381969f752ea50514e98046507cb778f59d1919ae7997efe4395c4a0ce09add5d4a5b87f2922ce34acf5b9dcdbf08b35ba7a58258637211438ac0dfd07749debcaf30bfa559ec09e49231f27a05a8e4e7eba9a7144fb7906671e606ecf8259165fd036602b382894de34d3d9a10c0e65b39a827857fd077d871b8fedef2a52514a17de645b9bd401a73e9d0b0a54db623d5fb48dd6c436764b61040696c7da4602c5035d5d4c138267b24b30036143fbaab8ae744960d1de33b74165d74d5775cf4347a676a1491502bec3d1825c1b94bc6edf41cb9c48527de69ce05d724b4240645a34bd4474866ee1a338a778e2c8d2952bb33618a93259b5cd61358e4de8b59d29f7eb58c6e9a5b38573aa723336409c598c8915c03dfb0c20d3e9cdb2d99684757900d5191d84eb4f0d6365f2e13a12a4891d05c77808a47c2161d5a3831e380d16ff71ac4ccd5bc07641e62e6a5374ecd21610c69af064e8ffce6a8c6f593a753ede9d64833b0e3c557363ba8b5607131dbd4e8ec80d58860d03689a5759abb6bc152e4f0dedad0ab9466c95ba53e811ca0ddfa280658c92a23ebfc1245ed6157f2679beed1f3e4b9f08261245de30cf47045d590d677fca4451816c6561f98ce81e71a00e01d8db7fdf39ca35290910c843b45bc15e321035c3c68e25da35357c687b58930cc100386f2f28c7eec365be2431f416e1fe455a49b30c63e25440f53bae06e40a6c60caa0e0f9d2e34d8b1cc454cd695f3d353f9c1f6bd6caf702b9a632ea47edac92e2bdbcbb55aee8471018deaa2a5a2303110cd0a09af9c8319e6f4513b28511e2b789f5709eae405205ea87482fc8ef035c3c9cb8fc836bf411085e065cb7fe2972e8fcba0569b028d37bd8983cb2bf8ce2591164a6a4303a9d850227cb8a4d03165f49f7968f6b34d436e5e02910819c0724b94650d7785cfc1120a1cd16dd7a1711220ea8c659e9bb22be92b5530b6e1362a153f46feb3b8f725aa31a70668bf7448a2da7013521435508e42936d614f440d34c5eba6bab04e037094a67ada30a235fd7090ca7a5250fb7aa84ce583035c3139f2ffa1dac31e0dd0a51a534eae7821d7914c3f113f22598fd1113c89de7b4bb132df9c63db4724c7a39f2feed26a5b9ac18227d124f335036dd35ddf9c83ef39a8947e05c22ce24c02f1a34d4d21b39840e1a3024e0cdc9b99e800ce409ab4c00ddf62c28f8360b2ea00df5b9d91eb8f66619efb14a3859350f5e89dc84431abc22125cd1049f3262f14d0c5faf0a11777301e8253a54cf64c467d3ab8529e73894290c23b1bb3f6ff9fdc1f313aa821c36013f8d92b537255d8696370f4a2bb5c6c50a9df313403f1a883dbe64c07acfcd0ec13ba8ed6806211950752f9b32c007285eee6836e30f9888f2f1c225de36f48ed35701344122192cd1033e4eb2fdb6a49a8e2c01dea7955ebf8a5faa792b0bbef9de09691ce08c5acb60b2739d1156888cc13e30287d62917925eacbffdc4ac16928a03b0ffae646c11dc5abd025ff1b27aafb3f5a09ac8491bf0024ac49224c8edf549469dc085adcc63629398e0d18baf377c95a3d854add7bd0b52ebbf5052eb45494f9a9721ddbc5ed7a8a068cfbba2173ef11dd7a6ca97d00ce69041b826f5109955234ed40f6f57db0e75e6730a78bd56302b0f62ac0fbcf13fc1b71ac24d2b17a465a9b14f55cd3fc92d39ca88d60aa9c236caa30936a49555377c7c8f549c4f5edbfbe69ffe8ecae194d4b3bc96d219536a34a370ebc5eb17036256acf35c4a8d54016deff124c9c3e426b1805310db63634b15fc6d1121780a1aa47d91c957815f2364123283403b10d4576672a11759a060cf78d38f3d2e4a98c5dacf38e726d4e81dc073b00866401c3603fd612b2362eba7a8d7b62308d3f5b8c4f3cac6ab179a2ab1aeafa0a23d22014370d001c98b1d4e60689b50809f89937734ed33783864251707a886b752d535e73b8b8f763b0a467fd2f4e9898c16c5a11b52b0885566ebf7fdab14d785222db6b297887b52db811f8b4f20a297383852fbe0625ae9cc02a6a3a00d078c0a90b2f4fdd3efa250c8aa19a97e26341c53b2068137cee3847c531bc068023d0f5fd22342a5929c0a292e903ec71e7176a68a8236175b9bccec4964abc49fbcfa097218a5e62b0120c0f2de24bd4ee4258d28b16ef6c15566a9472d6bcd6df62d9a063638ffd2edec136f9c909edfaae154dae6dbf43efbfc33eb8f0d38e122a02e84bc69b20d410155680132516bf81dd99b28dab0f80b6ba05f679dde8f4c72e092b69985a1ce0958d7a6b0b47ef49dca9621e7098073535763ebeeb49253ed06bd51c430a714babe1b723b890c3528b8f1e2cbc2c4ee882bbbca89f0bb081074239ea136caffbccefd328aaa38843717f351a7e1ac1368bb4e18f85e7e434cd7101c8250f1534421e1cfc5dd963382dc1f27890099d9363c5e0e6d991d914a03e717859f289792ebce0bd6f861a8ea2e55598699be2ae44da733a6991fe03f51c56270d89f7fdf5e0a007ac0b136ab71d72c375cfc54c549b61030a11b4e02ddd8a3a27445c78bba022166634d6b4be5fb3606157aa0604cef3a7497b848e14e146b3e4908ca7a9c3061768c8846b916296a3e77fbee1c3b11b37a594e2ba41f6b388f4dfd59af70b0907d3b4f7860be712cdc168187f7b8e5cb8d0e25f352aa8f3287b7dde4e93643aaa53cc117f9a6682732e2783c11a9a7ed84fc7e9eca9e711604fd2cb86b63e54253c424467918e75e73a82a196baed4c9df6cc6b7ba97002162e19bef6b5b732e73b5c3aff057b130b34bcf6004ff756d714bbff456073c91fefcfa8fd9c65aee617a4f4c3f335fa00968d562a2730d893726e3859aaa260f320f43a84742006c264be9f2a984da79f744de32c4fff9627e881a0fb7622f9df83e3aabd0e007d11d5adb10cb0c2250e373039e3187302333f31441e65e13da4cea2b70ae8367bd4602ed8091ff3583c95d01fb333c0d6a88cd4f35fca294c0981f5564fba7975583eb57f3c8c07580bc8611dda4788fa0daa6a2ac49de490084a23fd406a7d79c8123912243404be9833a0dcbbf4700034adc53aecc7f283d94bb3bdcf4bb30895247d9ab2739e921f78bbc04d63513c20cf8c691dc79bf947dc4a11062064ce948614dcb097440c074d4f9881d5c1c965d983c4cd5861b8ae13f6022450537d998c14239330e1b461253f2bc33401d7de4476e1bcd4d2aaa34974a486ba8f23ac985bba26644f66d40b5193d209df229bf89a4e628a3dcd50d3445e7c1bc3c3e9816fb383d4a8a7d110eb7e267d76e701f4774701c35971ac5a2a6e2afd32dd38c8ad95fa5a7ee0bd3f8d236f533fd8738c39b5f3fe62a84b20c030540443795a06250948ce5399ca3b4c88fbd10d835b235242eb348b06f66f3fba0de12214a65623c385872c7c83d13bc59bc58f7e0a301c284ad0463294670a2d13db061b70ca266c7cc3f115218dccf693cb238d41b38bf66488ca214fa8914014b1def1ee21b0918cf2e90527aaa27ab5da5b19d92dca028b8dc0f115c648d9033042018ccb91dfed383ca57cb735d44288e08233d2e9818c4fc75cfa17f439dcc3d6453ec6f755eca43e5c2edeaf8982bbeb2959da66684a22baabc22c2a8871e1a8982a468b48b6e38ac14caea4572d62f58dc1e07233d7f286e6ee3b0b8d6b1441fb3d1c2bda4aa0238ada63898a6c1b08131a7861af1f8fe53851cb6e80a6800be8f7c9453dbf8b3840707c1ca44c91d5c8a0118ca57902a2207a66c5164528352331ceef972ee1afaabbb2bc844fa0b4a269d7a1f943dcd6f6cc59df28e9eb82926744ade39742dd89f82ec1665b72137e6a47c4b07b3f265258c5b3b2240974fe35358c4052bccca9f861047a96fa75720bcddc1d64ff40ff1d99268900e6c8e92d1a56634842f2e25d38916304804dcfd02d1bc5cfee318dfad0d293dbfebe0df58d8c149e19078f8e0d3c6ae5bfda76047a8635f9c6cb43de0eb6e3b92e1dcec690e351f7b929e942917f8de30e1f28380f9bde9af1f3df38f8515437d3dbfe718ab17c7a0e603f66eb8128c226fd3efb146bca7eb35d2111599424d4700e1505dc0f513feb6fbcc4bf6690ddb84321781ef609a43085894d39b6266ded350c3519f504a64b4b9da5a789e93a0863a373d49040e374ed5e209539cc5dfd6a9b84152e9aa387bf5de3b885c18ca72ee7981e611ff94e8dac324e12fd58a152c1e9b9ce56da082cd2566d0073f6d1e161ed09b5cc264093ef3bb134817accb5fbdac7b2713bfd1d80d6d2bf911e694206aa9d0c6143df2c805b48de963d51fd714cf841c32123b586d1ef327a3eeaa0d266ea05e21b34488d696d903c04834892102b7dec07d7ec0935ca82160a754be3c7d83b62a65da7fd12d496003d9af6591d9953081b1a761dde4903ca8f90b5dec9d820fb232ce221ab7e5c4e37c8ed462191ddcaa638eb84b1307a02b8dc5cadc0f8e245e15ec1c623c1d810656efe698852f36df5eb8d25c9e22f7dbc2206ce666956309ee2cef35114cd7ba3f587e67386be6d0eb748e7476869177f6ac15caea165ab9408fe3cbfc06776f9a8c72e95b390fef498efdc3ca3a467a280cb2f9c5bce1e4e3a989d7e6940fcf5419ca226d77d91142a54930aa1ab692e1b8a16e668c211c4ee40d305ec033b6c648023f1e4fa55fa1259825acd5d13a6bb7482ea431e4b559b3c90c7de6ef9b1a39a318c9de28e7fddfd207d9c36ea638457c01fa88e1279e564cf5f46cd1ead8e07bb63505e6450176834edec2395d273644660837e560a5e035a977df9e1e04ea1739be83584643fd221f78742870aab78656ab2cf1a888f9c6529ae971b06a998e159e989cbcdcd0a0707343d5dd27f3389ac4be6cdfd64945bd89b0d307c886fd35c51ab76b049edea63401ef4fdeb10f5aa0128a26cf3dfe8f441d80ba3ad5f90d2f2c8cd5ac9fb367f9bfd4af4255ff521c7cdc4ea1cb68b20adba17217aadb9a82d6978ba11b947feff15291ea16158f351e6549fde43e6e3d3e12c3ed1d28362b854ad3cbd63e41730d3ff8aab2110008879b5fdb73b5f021d79f4f9bbab222383d7468615107a32a1419265d62a172d988f6ef826d594b1ba8808fd1b01f4e3d6800beba96dc980b9d66015931f46112b15fdd70aca54a57923eb2897fc2b97bcc03fc1fcc49d35d693e2134ca3e18ddac59b6e878d04a4250dbfbcd62e7bebbdf56b04c1896f2dbb7a6a9f2ecd06c85ca648c6ad39a6b1b6b20678d8014b94d18de6f28fb920d939f77bf1f1bf62163a31b75bba56ff1d52d36fbc0b0e595c19a6482f3fb77a6a979ef72ce48c458d65b4551a66637ad899d62c941528d209a604fb23c6539bcae4d30049b93825c5ee4150aecd7134a0a9eead0fac137d4c71ab49241a447a85c1e00a9b1b37ab59027bdbe0df0559e68bc3875fe0e9d33b4cc0603e866019fe80211ccf381523d86e5e40a7a624e5b70ee9380cde483a36ba8277d0c73e67256ac884acda3b9e8f851d6015a6f7ff83beafa4de9b0fe550e79e691aaaa798367b17f6a42e1bfb2eef9e425202fd51ae4e36a4ce8054cbe051de346c31283d0b1f72e3ea5bb2f44c37b6d01eb8be5bf1f3088c6c78990e410eb94b554c3920a7621198d77df68ea3912db53e939102ecf8cecca3a769a891d0184c5b494a6ab37ab3410ae735fc3e93f6203d24a269fc2788d7adfc48d614bd785f87073d0c106d7f119cff0fc6acad8641903cf48e8991fc5e13ab87dbd2603743892d7c1ad562189e8657ee0081f52253ad881c008aa122a7df4100a6502a9e1c740ec05463cf1f931c0e8ffe3d93f42eb5010d9bdca1811f1e74efd57fe7ff73b808263aeebd9ee1272a70948a982fe95f0efcf954f5cc663bdc15538564990c5a5e4e5defecfcb8f8c1e061e01abfde39f448534f31e98d7af5624139baddcdd8218f107636c79ef7a5283e188e1fb4cb6a6a034bdf6bd42efe509db8f5d58babc6a468bef0fa272ffa7a4949497d014c2da2ab9247fab1a7613aa96c8919973956c7f9bb7125c98b64345689baec4ba29049557edd80d4e2e004fb3d4f3f633432fd3b151fea8499e109dec9274932f04c93ca7bc03f87aee848202506cf7c3a6a5b5845d227dd0623b0b8bef10d12b26fc4cad637a1e7c7002d27b61819961fafbc509ba6cf8a8c072a09ef4a14f80b9c96e44862c28d85273d111230667a0468174a450ba30376cfa6c76e182fd1899d15295038b897a72f05fc877bfa55792985a00990e869113ec6d90a581332736431d3d056a6a696b725329c571c1611cb51e6a5f144a75ea6b5ae6c108d32ebea945390b3eb07d18d6bd64ce855ff0da5f873de3d15811296d487185c84fa536c2af85ebcabe8dd8429cf1501301244a6d7dc828376a0bdfae0960a103a1294db2b8d81c48442a5bb9d09b693b6bae78f2121e730b20fe4d6fd4e3ceb137d3eff09ff8bc831aafd51c0550b68d54de6855b90f6d78a783d5d3df2828443ea595ae2121204fbd533cebf56700c86ddfb613ca7984c8b65524fb611fac1f9b1cf2f3129c47fde6ce8309b8ce4b24084b70e2642e4b1ff753a7af5c9f902094c3dbb1b325e85980cef06164380513c4e4515d2424f106bf206ff3fe5df646b3944a63f905f9e1e6fd24412634fecb820245f4c60187bbfe0f1c9a5a2880f0dca6b6bb9f6d122ed254a817677123c55abed1d6b44b554524bf6c1e221486873248d3c45a46ace957178e9549b1b29e9e4ae301e19fb1e912c5cc9a6afee427b7fd0d5ac604a819fb899ff669cef6dace29f77d18114d81aeffe2093786066211a18f38ff85b516bcad753c7e8127f7e0d72e4f4b8356c9bcda396980f22061eb6c4c9f0ca12429ef013f18215fdde603dfc7da013ea688464662b80764c0e137647e10c295deb4a3f04ec00d31a82d55a1f461dc73da6136161f2504f49017beb82057196d261e6617483994d58a92f4a3aa0d8e5709cdc4942d74fb2583cd8e2670dee4f4c4447da71c6553b2c5c0b75653498210e8adbd37ea4bf05767396db75df14de4c84dd9046c187ca10a02c3b56e7bea5676cbcadab97154acccb96fec457cd13742ca234321169c93b044ac62687c848c5628f876b65c0b6eab5e7eec1ba2f92b7eefbccd3168b68db1672bc197570a286397584da4e736240288894b6d30bf94cf61f1603a726173d0b61c2535b739c668d53ce80e65e2c12e9f1764437525bfa963990fef0e2de38132a345bab559965fcc60eb0f140784b1d38b61d8cb23cf23f18cff9840f241390a5f3d9dc57fbb50a98e2b3e09486b51d46632185abb120c6dd6c4d9ec38db74f7fcb3564c801b8ebf4ee4af757e6346999a3d512a38acf0a5d6e79d3090f465ef2d38073afcd42513078c3956e47ffedee04029962240578eb69c388cce4dc86286a133425e611920b842ddc034a5c8024cc7d7d25dbed554148c4d0ac25d30b8cfdfae27d5f7971718a260e05a251f66e5a01d3f47bccf2c50e092ff1122905ad7e7b034942b049134e01e7bf2208bc8003d3c92004d252e5ca50483742c222bad0da34b92361399132d86a35d377d2861bf1ff4cba98567b04b8ecc37f7995b975f872bbcec4f3444a2c9e771cbc8d175792b2f4823b2a6a0fec8ee332654a2cd04edc869b805aa15f0ac67f3436780b2e042f0cbbbedb4742edd801e61f4759d197d242a3bf3f0b7b1fa0a31ee892724f781145a2c5c4a7c7843164523c608e8fd5b85c8fe252cf61063a79124f5976386f56cdecfe87b8c798b851ad049e07ed5d13e461cbef3efc32996e032eaaca68c36a41b74b87aa432825f6d153c8333230565252afc2a8065cf334e2d7119af73b06c28d46ca9ff5149be7face454599b6a4f80e6e8f7467fa460cadbd90905b698da90db5e87217710f1bf0cf6218a3138c3999f211c3eaeca78e6d1a810385aae49b17588d3b9e83def1d147b1c0e22ef31165b50d2cc782b74613974b92075b8211ce27936bdc1fee5b07b9977ca10e62984d7728a5acd19e4259385240371afa71fc51d1314833b62baa1bf531f41456188a8b28f0d198d89178666343a70557a99e929a721227191caef63bf415a545ee7a77b33a5c6e9f128fadcb8008268876df996c663ca1a15276a79542ac70448ea0326ead5c6266494111d893fd7118d8eabdde7ca2c8b2589ffea83e9dd71690070227b460ff8a045f241b77f543f1c92db1303651f499ef5bd3c8e7a4174267b6cd4e1d065ee97387e72df597c3fe5a8feb7516146086c109bedee17bb80eba472b37c67812d5e8d2d26a16815899024eaa2dd114eaa641271a8597b494e72440259419365b54856e89665a105a5f95fa26c118c60538306e0137101dcbb013af43c3351505c15e738075f96375467c932b204b149040498c40348f4ce94cad78040b88045aec184ddc58c0e00d592ba0208c5018131e908084676ffcecf68b121c13657ec6de6b85a4bf410f4bf1b4922a59452ca2f0319031c034732166660a3092b826c5a4c21b30fe27b9db890109588442217d108c9b582c8040fa1931718a21cafa4700b1c2f2f5e42805bca700d21a6af2442229718e21019ae2e684084483c1142c16ad890cae582def0ab09508d77bccba1965bcb3a7c638b3f742f2a474adc75e48931745deefb3e253d5ffc24566df4f3a10e5a9a9db995e6841bdabfa11c7fca31b6548ee3588ee578721d811ac7f1c938f44446886320ab73aa4805ba311473856eaddae49c7565c13e499a083d19c7b15701336547183c442b31e1179c0390e40849096736e4d6c6711cc71e621a015cf940241fb6a51fe26ce5321aed98cb5dda886b6cba752eb7d4878ce3881300168b328e6310bdb4b90b74e666e8f7b9015e5ab00d579b9c09e83a9bb36f7472f4d2e62e7a892e9092db13b4fd388e438e9294961ea323c4206a01c99086ad5b051c1013a36370e82518bb17ff874170eb4e0dce39b7b334dd79e7081e6d9aa63b3b3b210bbdac6912fe5dca3b188ade970db8eb7044277a59d39d2fa79ed8262c024022a8c28a635c363a0c8fbaeb129d67e68381fd098273bbdd6e19863f0c24822a3e1672de1ba77ab1d7e865bdf1ccca20d5266b9df5e6e18588b3ae1d6e18840c7e1007dbf0eb8d2ce6b4cb86fd4ab57e964eba9fedd66d1ef373dafb64b25f48f4d29e4541fb043f1b56b92e1a70353bb41f0ee28631efdf835974418755dc70eecda81899d6defb648283c3a4e39ce779daa0f33c37cb9e49faede9799efb3c4f9793f496b6bcb00d5378c5ed3bbd885018aad65e3fd42ce53243b5f777fa5831e17cf3d717bdb427a772de6e376c24f32fae143aa80576ee7d32d9221abdb427157b9e43a7d18974ee7d32d9ae387a69cf252ab10bc34837b3db383cee03e291ddd99c5db95e5a9aedd3b9bb43bd878670933ed0e3e3cd59fcd1b9a1fd4c628c5f304df8847a1a8ac36e68df76c32de50ec3a3561c7a6969e009d5566dbad35863d71c4534df5d8733ce9d0806127f9c586968345a47c345b01625bb74942dfe2ad7216b681fbdfdc8c5274546e3e9976ac89e58d2f8341aada3592138f4f1bad3f32238b47f1bc174c421af197243fb47a5a51d25dda32db0dc0b44035ae59864dd7bb1d26e56be08d4442dac0ef703381c0e779ee779c3e19a1b749ee7f945c7e17027bfe788739ee009e2f0a5a4da605c7f7581e11c043908d6d1cb7b82e9d205525a1bcedaf8e971381c12797b7e6e004ab2c335c310e748f7b482e532c1e1388e8b5eded3c339cf7bded3e331a62c778be16f4de9f74ff594513565592591204bbdc459e8041db340c4e826c6bf6b17c49f5313e024537af71285571c1a734cc9428e2d4130d41b5011e996159c1cc1049015053816c3358cebdffb333676ed8c8d811de60cdcc30bdc1416ba68a3882e3f925802c91340303c6103c638080fed9bae7232a104db25b6df838a454c7f6ec4b4be1fd804f45b0f2a0d10397ac963299c560f9dc887e0a35f045c63d2a9363da6b59d11c1a1fed34c4aa7d2e81700a8571c0ac1a17efea17ed3a33ef5abfa3cd59a38d4b7ced47a7a55ad2a16111ca61587271d1c6afb15d498095fa5b18ffac7a7d32a47f5a757b12a0ef53fa86bfdab400d5d07ebd7bf836b52af5f9e73eca930562d59e55cd9e9afec543fc7cbce6b7d215133d85ed592d39f583c3c3213eb6fccdbe1545ba526651cd7ac72ee7fa097c6786a660663e9a8fd4664d834b3da2c9c9e90bf1119e7a67f1cf237e2b2788cc8b96f62f174d6cd7d95dd97ad366bbc207f1287fc77d0901be1c8163cc051c6521114197fec836b8668c172b2a1a4491a69c8f8df1caef981454b0d5756003aa1c8f8df14d7f49e212c703e4ea88c21e3efcd681f1cf29bdbb2dae2f666daa9b64eb259ec745122d41a14abd6138ba57a01ed8d7d1e0cac62fbcb9b585dd25f358333d3615f6bcdb26a651bbcd26b6c0593fafbf62e10db3fda04f6df940657966209c04347fda903796ae6f6a8582b5b82ffc2e221f246642bfb2f6f44969a51bda452affa9cd4abdebe4af52f2c9e1187fb793688c3dd2b4d7e984a931fc562711cda108cedae7bcff3b8c9f35846623833f4126ca1df2fc1ba8de8cb7958624dd3344dd3344dd334d1e8524cf0bf77ee0004545c32f04b8a2cdaa05fb68da228cc344d7308866b2ccd344d93886e5a1445b7ee8c7a189d7e551f7f5d55d62a83fcfa3bb8f7f565ad2a0af7336b55bfcaf25759d5d9be91d9104aac20210405150164f4d6d554d462b9cb393370a57bb1faf6da9bfd35879526ff09e3fddd8d95bdfb6e6f363882b10c569b2a452cc732efb9acb73d8217bc5d101cfa7e03eccdfe7c01fe7dc14a937fcfb86c02f93bae11bf1270972e0c5ce95773934d20ff8e1dfaa86dc8a8b9b18652fea39c710ea7d8ceac88c4ddfbe7c80e69bdb43f5f4c028cbfb4316d72e1150308822008a6d17350d00682b70bbed1755d94f373f75d76e1a0c3533cbbae7b8561f3e9ba1d2eb5ab45f4b2a61f6844e6141d252975a3be3e74b83d21f3ffffcfc2d530f4f2ebed87a6c32bb01bd6bc128165928afe0ddd900ece6d5a2dde5aa39764377b165bd0e2d23ea29764cb0705b3e9e92519428bb471ce45284548922461d8e3957b463fb600cdb07a1cef38da1387af383a12bf2114d80506ce57e836809470b26d9f4c445b2fed59fed6447c6618d5438e929496ba0f8a18871582a2282a82904ec370e882a11504b760b61bce173c0387593a7abf9ba9d0ae1b7678449783f8c26da9e7c713d93085449c5ee6a344185074064ba1280a83c16a9d0498aaf28aeba5a5a134f092a0f4c279c619575eabe8a5a511d9a46098ed466b5dd38e1f9cd390c038ac8c5e5ab06a1aed344255180666709d719af2c9643f1f2bcef98b0b2ee5f6e0499c01875c6a2ced86f66b4c3f0e81417f7eb59cc525fa55f4f58fcc1b09ef489284420a0da16ebe419a836ae08fb961f64892749158e8d6c43cc9a7294d4d601c321c6b7e767b6b429225499224499e5e4f502e263ca7b6c028394406912759239b083d2192e213024992244992a42aace1854b07ab601817951d269390d4822c4c42bdb469f938bd3e699af23099c6540106b8fc9b5e64d24b9bfea7694a7256d0578b81030057528f708c0f1523d312032049d244a6699ad6eecc5a6b62d9d4ec21e03f3f179114941c2283c893ac912653cac5a4442f6d6a4b2dcdd6bad25d8af5fcd88008775b775baf61cbddd676ebbc758663ebcc7bedab7ded8a4ab31976d591dbe83d448c8c5c31dc7befbd3d3e80b628d4e98c75c62d749d317fcd718b8cb27e94c7bd1f5328c3690439f8c9304134ebc1f8bd14a633fe6c8d4c0b27e21a08829a920a7b5401341f1d93e57487d0ab067ac341b51d1cbeac90825ebd3bbdbb308908e912dd5bf48243ac49714107731f3b87831a06910412807210dda39b74b79437a5fa9b74b7d41bfc35307f3bcc4ccced332f33aa99146ae664f23a71089edb3affbf175ad1199bcc6ba228926da33814751832cd8b9e44a4ac77c781e0c71c7778638d33efaf3652ae29b7aac42c2fe2195d9c034614a2daec70a5f11243c402001792abb4747b7e7a804bdf29009f17624877bc1db3a3a6455334875ef4f46981561bfc38ee63ebbc757e59c15b671445d10bd67bf5cd175f73875e5ad444512474f552324dd3343d19cfbb995d4ca901453df4875ed314ccfd35efbdd7ab02ccba0b021828fd753fff0ebad72c14f477cf5928189183427df07f655797c563c465e574dfb15697a7fbcd5addafb2fd466445762edfbcc80e89430bc32179a45b1cfd1a5499fe0e7a94e16405a42e5d70ba875d4be582b6c84e8fd22deee68aaedfde786eae678e2680b22c01e25a2538d79a8624a459d795db0d873078f43aff3fa7925f58fedf9ad8fa60ac5f3e70ae357771f1ff548a3a1300315e68f2320a855ce74b853007970f6295571630276e718d8112d960428298a689c41f1c49ab33d6198758aeced87a303e6eb775b77538c5c5b9dbba5543fb1cf36ef3ed8145bdb426914579b771389ca7a333a4836b2caddb6fcd2abdacb8dc6ddccc032b0e43a35e5ad36662d3d4663671a6ce679c955203eedcd74318857d1171c52044ce452c22c99e372ee08560f4721c4264b4a1b8517fde77442f4791d74c1e2a46a6256ecf1b17f8bc2f8b5e8e1f2fc5318f7adc6337f2718c9944dc87f1e77d074097508ae8450eaea130895008918825971591071085badf7d4bc7ab8abd11a5c8af23ed7263ef171abdb4b326e60c04c10dda13ccb32dbd0473a4dcf8dead99552166c7d47a6967f941dd409aab48e007665b34ebf95929318102550c7f0535965799955f6513c0a86c8f78f8cbbafbbaff3add755dd7e9fc9a868e6ec1f182faabc85fa2dc1b257d7f09ee679536f67ddfd1bb1beccdf541f51bbb63ce3f575f4d93a5e79c9f868e9ffead30ece228fdeb374a623e9b9231a8d4ae59456525000004f40063160000100008038582c1589486aa64f314800d485e325e563a50280e0643924094624086612004000084010006000c830c53cac90e84e9a423440d5eb4430ddb81c16fe30d445279e5490b34f7569be995c13d6bbbb1edbce028295594dc46cdec858a582048cd9b75cf51ee822c8a7f2ac8ec17a138311bc7879d162269541453c53566d696f579272a0993eea71dcd7ad101a36fb9cd2fd6aae0d0c8d7c1ab6a41ff3eb0482e6c4c4896ae1192bdae954981436cef8e9ec0b5a5f40f5ff83414fd40ecf3aae057a53f97f7b73b77154e207422bb4a502f945d5d554dcd826e341425e6e8b057b68bf0df8c9d48023999889777005e438f5eabee3fb77f1d664755b73abe3c14f653564c8db7ed0fcf63e9789027aaf79b0c8551ed6c0429a4c31b729fe028d64d061e6bcb5cf6cef5e9a3635ce404972f9cbe46784b1dc3df4270ea6253d0bc386824893ac596fa6ad15fce09b2796c8912921474ee9637435b45ad11923ec138977d9c092b19e9d3c819e4a49132982512047fe1d10437050edc2c1f6dd02eb141bb14e5d4899955ec42e9ac693ef26dc41fc2a5bb70c1454420ad4cd0f1a856d694020692f25fd123a1b95b0700e4a547b120322ae1fd714147bc228f532dc2a222e8e0e09012fa531ea8474fc0e2f1e8ff56f247a6fb8b630cb45bdefea0a83bb39cd675b5b5750e31c7c05fc928d2079d0929fabce58afa49daab806a8ee55d0068f2783f0a8f541bc9b8fc9b6eab10b218be0dfbeb2147a6b5081fa6dcc0f2fc2baf8694c5cb9a591517dda32d7d2f9c0d7be3ef211e7e84121b50bba5f1d0778048543c0e36c207e5e77e159e03fd71a632e17d4321d16c7316abfc348763e8d1373deeb33eb0100701c1e067dcb9a1452cb6a086023f901bf9d66e46a92140dd2d2681e08f0695bae598f87c3c60036a76049934d17aded2c093f66c774f94dd9cc7cd00172a3645ee02b184ee7df4753236ada10e421a8d1d0fdd95d1c6781755475ed31b55bb28d2244e97df08c5e70ca8230811bfed435ca057b18e4771f92ba1d36689720ba4d0319b71ed873a356680210c888d7ca3e2b99829378cf6bb86898549fd4585ed83feb18792f21f259a471544d45906466e662b02a4e348872d4441808cdbb006d0377f05e86c8f5c3e2268bdafe2e3d003a6deeba88b6750b49c95a464d07cd7e94cb449bac95479282770af1a24302d4106be66e766608ffd30c02189e19a206bc9ce45fc13df63505e3592532458059a0ea29c7eb51dbe97506c8b3a760e791188c8cbd7b5a8167870fdc0444c9893e0c2e7f1ea192ed8cd0709440cf45a7ed6f068774abdc7d9b3fb8f2c93a206beaeacba06aaa3334400f559867270a00bf4abf11cbde41e1ca6e38fc6eddd17eeab33686d7d9f60d3c861ca2d1c7d8c468eda84e8c437afe517579b418823c86a5a69cec4115cd0a01e813df27fdf56ca2723c465716052991529ee2f9cd7b80c3cc9cbb448badc450eb1d8250337a4101103fcad4948d11facb9404c60f88a70c2768b59c4f610b24b04db556ea83833a3b6986c0066650a0db67b18550bf0a905824cf06b7fb1553b1d45ae841f02f15ad8d9d182304ade8278c0c25bff3890af402ff18a3326b372c19e1dd3b43912658f66dcb9d4ce4acac89b5ac318ddec8f3a4ce8629d5fe6a64727ee556f0768ba087ea7e9d0c489d9231ac2980ef33a54afed22918bc33e1655b1ca07a2cd2f5a7e3bb0cf4b74c56f175a1b6a1868120dbc4bc92dae7ab3ad41203653a965514651ef6f3444d75f3bbefc3a47728152aa62a552c71d5aa8fc5d500d3180945cee672cab25f5289309ebb07fbc2e518aae1de1aa5f849a681561d54f8daa0692dad4a37fe7bb38285633804059dac9b4982f8b93c7d9d0370d1e2e0e08b41c53671e0bd143b0bb03692e611d3095452b5abc2b2a69a21817539e5abe1749ae32c281165d730c3d5d4cd1af8944300e6d909de3fb4f555a48197030b188219b24f9dd514cab76a6c5e79cb41e48ed78ccf372392ef1297a3d95c3392a556315d6ea21eb6a03923ae307cd78aa1ca0e97508bd76fd3c7874fcdbf5a129b05273358a9d7dd0945d5aef66c2c2994e2bb80369a69aa181450576de59f235cba43e02624ddf99727e70c17a6d7b5f7b8442cfa73dac07991e8ac32dd2ac9ec95279c7f203029758049f14be83666dbfff2b6656f41d7843052bab081fc76ef277bf783f8dd1f3b0f823453c1d7f9b9f1bc5fb3676da5b11ee9258bdfe9fb53f1174897df915e40f44b98a50dba6fa5afe697e86c5b520b29e297cdc648494536aaa161e77d48ca84a15f30afad42fee7b4e129c703c6ac60da02b8e3d5d6ac2c4ef34900da89a56c1326c683d47e0e785a8f3470327ad299a845f246e365f8e0330dec1853c9e2de1d5de4bcd9d729ed54ae74bdbf839a2882f07ad6e3140d6c6031a18032d894470a7b434a80773b93ab1f3cca8b1d59914e4f3efb754e57d9370fc9609d542be4cff38224945fcfbbc24cc80f0c7bec3460de034450fbb6d7ab9ad448c1d41ac818e78104bdb4bf66101bc4680a4fb897542c65f5e72dd8a0524ecf97a81672872fc52b69ddae2bdf32dad78a1acfa4a0662fa1050f904199f6fd54cf421e30a03419c0b4481277a9b4cbcaf421a2ec6373c23a4fa313de35a39f04b56ada1f2c564fe0db811117ad2d85c43fb014c0b1014fa6ec9944f7240b81d1310d12732d57319bc0f02585bb1a49d78b917db3a01adb83e98665927e673af436676ef6cbbb2c8637aaaf1de43844cb0cdab3833c830411cb29804d8b0b9a242376e4338c88a3754671bd2a57ec42318e229652afb2e7760df63bcab8bf435636d138984cb37aa59d4122f1336b4174ca0e48bbf7fe50def9ad2ef6ba80b835842d8a5f1a6795f1caae147d104403ece1ce2e65405c588e2bca5712ec7180e88ab4f1f8d1b4f73f9eea27059845883e7154294dda957f5ec9134b0199f7760f3ce81d75008031f7393d778f7e6c024376637da2faace1eb0545a84b258038ae51eed89f69aa6d188cab9f0068592d4d47a67bffd128fd96c9fe4b1d79e91c144d401502d5170b7c7f6622144cd4a3a3677ac1e02b59e6d7aa663f0276ea4964a3dd5683eb5f6858e31c428c64d952b2fbc67a8da4d74d9970cfbbcb93b3974c9221133336644d86ec4dde2c8817cec0abdcbacb4f22eb167b7b354e9d1b3b26cf7df0d5688e3baeac88b4bb482f9d55eaf25a4f38997a86688ca4c4cf39950a7c10091b33f9ccf98aa83ca85c2a06c8a80b38201b842d84ceb17bd52025c015c5a80af6685d8cb1e539e95272e329c6c9bb7f3252726afe8809600378f3d812b41c6577fd69af3cc788fec2d0aab6f60d81412f220eb0cbd7e129b7c3f44660b711d4c55e6c881e4e1a51fd83e4a758cf7cc9529743dfa7de252919036fa64b515a2b8453efab631887f2483a190b3229d88b31358149c6b14c079ff8855b413895bf0d2fcd63c9fcaad8935a932218d281cd9e47d24f5b92d7642f589030e4bbcf4d8b793f8ccbe2ae4f4cd26b12589868c221339ad134b5414dd26720954b7aeabfabfb9c023171f480ec19c2b865c4a2a96aa6bbdf426cc1b9bf50cc1c04b54bbb131661a76c3104d4753197e94429fe68b032cea8a47e59a9c248d54a8efb73ebe88fd60012c7d8147db38ed7ee7b17280c6c02c022fb39ea7a3aed0eeb0ba484f0da93dd56ae8d45a91f9704e76bddd23c06cbc96643947279f9ec7fac8c04df8c9784a48864a251f6112382da499812a2035135a80b8a17b277b02daa80c4d2356887709cb601759ba0140305e703981ea9ecd3993cb99dc69ddc493ba80cef35d5d21d4e5bc7812d8d97ba5444c804314b8d17b0cb23a56a3b6ca5fbfabd2b6ca839fb7df865a55bc07a537bed57747a626adf489b6a123e156983786eeb19e89148b00037342c90e6d1ac1fd238d0f492f3b9c888342d4b152c78a6cb396a4e6582df132c37101823a5d2e7be9a1ca840dd043435548662657106c9e68edb75421631fcb13e2be8d68f281979b5e177adb4c5691453fed593aa2520e97e3c5aa7d1df8c3c1006a9427d37eda92732d9b712e8446846e900aa0aa980d348afb4b7a490db4f5fc1b3c725373492665842046f0421a3381ca643ad4780d5d6b8412c74ea8a0bfec49557f64c0a015e19484e101d4544c675a963670c04c14bd2fdc308c184ba7adce4b24a37fd1d005ccaccce003a641a1ba91f89bcd55d1adc5cef6d74d2ba6ee4009c66aa59c63b02a6a1827bd7d2ab8a7b9110a835bddf64c694e072b59257cd92d604968b59faec513f763c40f8704ceac21b754590a1a9450315dd5011f3d137708e50f8de4effb8c11d939018e82a9a56132ae1142d4f2a1cd2920530dd3a1d7b697314d22334075c11337ea137d469c75f9f50484d54aa821b9fb167bd053574275178a16eb4e3b8e137793ec98405b3cb46a6051d89cbf2c7bb725296c36947ea3ff09972522eeeb86f41517d66c59ee179423a6af6d89ece8f6e42b02e3301a721a60921c682a4093ffae8d7260752d51c6e1c76fa6d9a7075d3015043093126447484474030be025352101a9574156509ef05e9a941146d7a7502a8edf5de42de24ddc298a4f163c50178286a5ba3cec51d87454156cf43c7545956b423d212be5c9847086ac9b380bce107debfdaa4772ed5c8c5d2493168df3303bf9c9113ac6fd5d3eea218185441250ea0863c611a188db60b08e763d727edd5e354a0bd3ee09028380ab4634606eb8bfabf54ab28e6eb51a26e0d66d7fdb8dbe0c42e99a0a97a38f231f47663b796f254700c29ef1337e017d5a946338b7167052d5846b9d63793d113061812079c324d99a084fa9e2c7a35b1784df3ac1838f814296626c3a3d034505ae07fd2857a85a47290825635819931a5456500928423b77eb0201fb267674d2b74d2fdf2d09725057e08ef4e674820f50ffdcebc2a172571b8527441e089ac51b35ad1e67491fe88ed45aa26ae006c2f1259311a04dbc11b1dc65dabcb62490767e5ea5e751e4479cdd8c6ee8c3be75db7ad845ba8f03dbd4c3d8466434cb43484888ad316766406381510a153fc4daf067c57ec22c90eda2707e62729eb6874d4052c0bd3aec742e2cc7bdd333c32103948a0fc2c68f658f4735ef231ca8a5b0ceb4eb0a4a3f684110a36db79b62ae81f0232d224e5a31ec01ae6defde9c435939691344c4062c9e6d99c9aa7b4962323941157e1ad28448c7d64ae558be3d97af45fd14a2b1e681ca9c9c1e02e6c05a4cd0ce9e2dc350b79df7145a5dff139a03182613502c0a433258499dbb01b4278caabb218f0f70503e84e40e19801c808d62e6d081ec2d0b3275ff448cc15f46755d4e1f9eae9418fec7711d60ced517719b8aa8f8af5abcc5eb0581917d0f1a72d663c4a7d99efeecc79a85c3ce12dbbeae066ad012a7ce6a89a757df0f634bfc72250a45043f03456a54f0a598efc9b6f0d21644cfc57f7a30e50918e0d8d93f9c537409000828351580b1b95ed23713b229849e5e5736396f36dcc5bb27e30721e6442fa105b08f4bf8eb6878185c815a7385e9c0e8f10f06a61ffccebb04f550183cdb1ba98b8788304fe14dde57177dd931441c95e4027fdfd48bf2addc2662f9827ca9961743a6039bb15359f8123dd2c1410a911f11efe434b6794e78411d2ff4512eb250307881d62af1efdf168315726f47bfbf42d35503100c1418f9f2048c9241856095a2519c0316beeda2b37f5854be420d1831957436f42a57374c5a4440671cf027ad90681287955152604ec5ec3ef3712408a93352d6b3d59ceaa624f3501f7ebae0840a7626e08ce4c8722c195facd31ee351bc515102709eed489de5296854532a413be3de834bca52aadba658de9c2e8777d7e8db1653a7eb6c8038d130f7aad3f094342752884c02e7ea6eb8f76fbf0e877826cd1be87a32dea5b003bc4601e6992040b853accb23c7236c1c842091ada3700361e7c31b02e3d08c685241b0f8f39e304e1121485dbfca88ab5c89ad7e90fd5dc7cd36edaa67ff787d84aa3286d05a3c768d881edca5992e8c9528587d6c96598522d907ff7b6c39cc8c39b71d24692fd0d8b0d442b3d044d144af4811c5946e40ab6fa874868eee26bc3f5dbd5d5ee7c60557e9136753567910caa3412d163c80f016da3591ecbad98f6fe819cd5d005bb4f91b2f76d0a90361510efe7d698fb34b12c5863683538d0f02f9fc189f7c7fffec3deec0f56fc646f5bbbf2b22d5b46462378dee14d13511eed877be233a544634dffcf8d4ee52e8d75014ca72301cd330c6f034005913e995b5782105253ad674ae6214db2210862e4b9c8f78c1ccfb4c601a1162c5910bcda8434cec0bd1a1e76a3512d35be34b6b052f6d2f6d4e8961a302d264e34f181de6fcfe90891523977200a0232efc1df455041bf5ff5c1b0cee2ac116f0587d9ec0166743aec3b58232dacb708a44143384db3a7d3e06d2cb592c5a06d801edf73ca49d5ff97908ce0f99161f123816502ac2697d8e303950dd6fb613e185ff8bea3aaa4e9e8ee8512548fe1728a4e5840fa37db57b8c5d7c012c7e05d060432c381ca3111574a89a3183a18c6b17ce4e5b4a7033d207f069b035cf533a67c1b31c280ea8c1794272fa0a068256c785b62bc6cb38e19b7a53f2ea506413fb4ad4bdf4231beb7f95c2bf041407a7f35ce311b56fb5101cc4d5db745feb9b1c5adc63ccb9c4858d980e3cc898fd51a8db4f24cfd2da201219c6be64c516603669b30825b601dca17f02ab864a0414035eb6388a6c45b7d35cf345a2709c85a08f9d268a66087b7d2379ec9fe8aa2733be3c9d91394f7950820300f61fad8c2ba9591df5a1505b8c7b549251deddf322cb99d709b9322846db1bc23eda8d366c90672e889b5ce217cda4fbf3450743a39f7fabf579860f0eb4fc0f95898e0e717901a8f32974338d9f137b76acab8d22f7bb4161b855353a55439dab22c4e9e7485c61c7362e5c56b48095decc6c20887309298d7b34ccc8f4a975e74432293a2e4767c67017c199ad65eb078ac236fde809eca624009f13aa7ee325bda253edbad50a362122f8e65b04781ac5f4a1af50ad4b29141e13f47c427fc453d39d02bd4592e9a9accd36d0059b3c3897a8b125ba8d4ae6a433910aba6e95024df4514dbc8abb4efe215806ad8cbcbe8055728e2d12c27a5d3aa490d2dd14c805f7a39c7d79c0ec21f02e2a030aaa7aebf63b5164542842ca991e29878e935322b4e30279cb02edbddc304f3b8c804a8bbe507cdf84442ea78324dade893953a88fcb2d48f060111ccca1915619fcbe23f4d7d2d9629bf1fd5c4a8f896978c6a413e9cc0797ebc2ac3f31e5060e88012a18e6a3800f1e30145aec3a9fd9765caae9711335afad937f7eb7457501e21c4ecbd741c8acf8ecfcb8d0509321f0200a48e09ad6d3e187e3c8f8371bfbe0a9277122929089fa9e78ecf39060bb3e6f42376532922a122f6e0c662ea0761696eece545c98d686686b91b1c72688cd126c79a6afb73d1501655ed4954973080389fbe991df8dd93b5b9530252be7e4c8980e5776b55ecccd5639ea50a507519c72b451604e7bba6da49141dde44778a9809369914cd946d14e30433e10a6ac08aef39ec9828288cb50a8beeac1b46bcffdf7bac3ab1d7518bf2313609aaa6409d811c9416a7a7cbc80f8ab622beca38cda74695184d1840cd182f05ac11f1d14382cbde794e6658994b141ab73e7170788e5c1c2070432af9db86fb84043ee189b6ecbc01b01b9754072f0d2b4e7edc60b88e9fcc7f51f32e7b154ccadd1226238cadf294395b4ee58a7cf6c15b91415b3c0c0422350095332e0db3315d38c843ca8b3abb38db7348b89c3849a6f997d3822e8faae62e8d7be8327a00fb69603fd951653103d154522d4d8a1a9e4820961352c36d0d1a6db750d0c6e650384b10e570ed844cdd8d44ab9c090b1923659f55ffb267217a306f86d19edb1ee1dcc53170f9bb5aaec4ef3e46069ac7c7da802eb122a2d870903a3fee8bc17dbd29833fbb55c2b68b0ae717cea25c10d3fc38bb38daab7421e857cb5d0012ff5cffd8e5cb95d1e1192fde8953eab40dccd6018b0c8404dd09d3d5a1c3c12d65df412d0c70abff759d639527a5087ecf72c3c280a439375c826fbebd2742fee411c655023de95c962b1c6f72a5f33d411140479503326de3339e643c4643e381efa0ea1ccf080d5f3913625109aa1caef55f739db57a149443d8fc8654e9f6269ed3bd2eccde865a051be4ed6bbc2b4d0f57e26ba7d819bdf36bbd798b94ae85e5a021cca7b6dea2c35e497b8ed16c8473a7c12473e7c68686ceec8750c7f15dec84d77d42ac45b274666ca2e0b292205a300a8fdd57e17bc84d95b5b1cf5f92fc67c14180158e8ed16783a48152e53b45e07125d4e5ea3b80dd64e3a7440b964a6a7f8a6317fa9fd88f652521057547baf831b287a763af36cca70401aa555a75d348f2cd430a3b4d76b143eb81ecaa259f0e9a419c8367ea601d2226648a0800c464e4de98d065c840a3ca36057e14ffe23af61746a5132e84165b3e144f824b807c63dbc50d4ad0c2f9696cb3e17f319675cc5d6b24f59000a6154e9afc87d857f94721933b14442e244b1922d764f7691c32d21df77ac22590c60511340d5edc7ec5ad5ed42ee59356ab71655a733770be8338cb81236b85929d78ee84aa983241ebad2f384147499021d0c406e4dabec51b01b828830434fa816b725de702c86d8d02c383bab32bde174fb518a4c77133f84cc95909cf855359127803d142975b4ebc19168844f550a89b24ab01c4c61d4dc1dd84e1eb5b051652bb6c64400db05c1d29352cfa35e07b4c2fb5916f6c21afd67f828f58851d229535f9b902621e4f0c485311d956b27f885f80f429088ec5175ee5f1de7bde28332aca827e7981d2874b83c9ff412bf9c432a4c6c6085f6246825afd71c8310a5df624b90be6731f5574233bfa607aa794410569bd35dc0b14be72ce1b5b07a5e3d20b34cfbba982953da6b06a36a325c2ee2b94a0eda71c7e65fd1d88c17a90b99e9a17e66c579c2e7c861151825a0a19a43d96d8ea400ddfd01882ffd9729354f9548bed82c33e0829271a05e607c435b42986c9f5107bd290e4d8fb9616c0bc0c299da465ddf9936eb51304df17f456c784e4963a166be67afd60ae33b3247065a45a32dc0b18080cce8d9ee6971603bc90b987ec286fe5d3cd5b7cef84c6ce108a02ca9816eb05fc40c42e489d68c60bdba5a276d40eda7c50d2a0871032a3e055429abf1645bf1808682e83b63bbeb6d1aa4b6be95041607c40d000322d53003ab306dcb4529e9a1e04637b30902b8f08c73d51276e2c606a6d0be510ec4e78b3ba24d559117c5ccd1ebe38796474281ce0fc43eab9c56ed670251b4f0de4e0957debe792e1c55ed4f7ac83efd6b36759dc49291892ae67a1f71e1da8790adab21f011f1e25613ca2fe60cc20682eb9cc5f4ccb2beaf840fcb958868652fca0e52f530e209b7708b34acdd6faf48c0fe038a9b4a69c0c7ba8c6c4a461115c310e6952704dcade60f86b3f63833b29193cf3825cedd6227245d8f3967bafeaf5495f237549c29853578fbf336a6890035814db40a27e2d52764ec226fdff547740264391dae316738939f0c9ba48f9401ccd32d28aefdb55568d4fd2b5ffdb14224c85434dd8fe8ba4bc37b1e4f371b94fd97d9e2693d68008de7df99913224b0d924b702a5e4c637d40e07fadd40de140cb9d68ea7476e53c828c33a4ea2ad06dd9cdb9550e04b5c1bd54a8c32f51ce94d88c8c2e4e4f8df3540cf004a282517d9ef8580b2edd25a8e42d070ab85604e67cc7204b85d0efa60627f20b88c7829bebd086b035a6e12dccdc4f887a29c02a7f5ae17d888ac9993ae355e38ed519fb875ee134684df9835443b425ab9762f8f3db6e9e687cbdbad5c96e8354a983a70d9dca9c38abbc56a7faefa1d3c4efad972bb27fab26074aa61f734fd5eca382c7a8c60cbff1dcee2e782e75edc3f56a096b726d2e3a35b54e8b7b5ba63d975af4287a85becf657efc0a58ebd1d45fc157170ede28042adef66c913948fe9e09897188d2a9cb17f47ec852b99a742cddfad97f4d4633523485b1f91db78cb45b27f2f8d8738340c9ba0bea3561d2e23b94b7d0f5fb982bcfbfde332b2c94cd08d16ebe20ef9813a58dda68d0b1423d943984a69e78d7e072192e0ea188ee08ad52435ab56f7c2e080013f7ed5ed386c8c48a4f2a4ebb8930cd298a71f05b0deeeabfa7982e5114f3370fc54891a979b6d68a61b2d4beb301d9af2e5e3b695f725ec93aedc3e15a418fb8504632d799a4a32bd49c346614ae294853622f82290b17ced0300e944cc15717fc674aed6cbaf669e631939393af2b1d1cfb9dd211a63110f319b674375d828cfb14c444f5366a07af873a2b0dc77ffb873dc10bb434e378ff415ddd9714759c64579a29ab5b9a8ecfd8b0ff45223f01da8fd10ee5338093eef31d10ac4d5b0f733bef8d622d5a5080927faadbd19f65e2b209c70f627c939a1cc8ae1416870a1a44fb7485411e8ffa22135dbca0776a53f49b53ec43f56c62188a68c0228b38fa231b7af90a0d941d5e746c9af6c4131173fa818d13fd4122cac68f04e02c0345b03dc7fac1d4c5fd3d346062836f9c7c913022ae7f80fe28375186b0269d535ce61d4e680b0dcb6ccfad96527b29d505a4b597a0d0fa624ab4b2888501d01ac7edd03ecff2001e8fe6b01b0f5ce62d64c27bf1aee7f91278d8c18dca8f6ecfe8a5748a5782d77002d25bf57828d9c70815c7103637445d857095f8164d0d2458724bc4bc417b7cdadfae2b07993012dc277b8336a670fbb92114f25d2fbee18032b10c3d76da1ed7788646eed753b665671885bf31359e2a3d792f28a08a7ad75f9aa24d2f007142cc3eeb4b517505bd4004f0526ca843caec9d449759c1423cab7c97247e9cb063de100febb5b26b9eca5d753849f1bb75171c3d1cf113d69029e94ee71b8b5a1c749f44c5a590ee0b1d73dbd5cbef4e08b766975899e37626edc67cd5d9a9075cf49ff04753c72959d199e37b987472b6be2bdeda3996b233bf708d20b5558f93fd2bdebd233b1b34ed72d4e66296c9468e6f8dde38c008a35a87d274d7c4c2dde1000ee499fba5ff8e57155513c1a79e7678a50a71bc3a1933d32a1de1e4695f739a9277969220676ebfc2be8f80385a8a5cf58d6bb108d74d741584f9b58d73f3779fa92726fe9beb6557b1ba278f4e16c4e1c77256a968d8a19f5f6d4bd3b22145957961544cb88ee0f14e053ed337896cfce85a40f8ceb343eaf873fbdd06cc730c18bf754498152cc6f556e3a41630d9b0463a2ee19a23a382126669c713608abcae2092f48216cfbe038b6207cf752b2ab00c57b11dc37ecd0587ee82380af6e1e20320760e8b49279dc53b0434053b56e77a502268804efb01761b85ffd443967c152a01841773b0e463beddf27306d084274b4fd9b634f9b2b5a05851ea06ce747718a5e039279f227c6e82467480d9436eed512651465f9c66cccdbe8729d6814a88131fd9c1843b143e672eeaf2aca0136876f8b8b3a470198f09deeb3e0b21d03e255244696a85f2522e0148fdca52ee4a667db16d0b46d57b46e3bdbdf76c9fe6401bb3d886c26e8a549edc2e44382e20787fe84a2c06c95a433b2cd662bdabd83ac268910f57ac7bb10355e8682568f5b5276fbe1500bc1a6cec52f20b3aba12c3404f738909d1fa40d2dc804012f75fe204b07844c171132aae57bdd38fc3811ebfed9d9e04078f84b2b5e2e83e8609d10c376f528a805c0f36b004ed9ddcc359a2c0f19451d58ebfd97159ef35ba7b03147aef84e35222594a83655ccd8c7bfc17fda5a07621d1ba06bf9e5e66f663737542304fad035904a41a48ae478a7544a922ae249d5b470597754e2019803e0abb127d1273d2a968e69291f40d3e04fbcec16e3ff8324c86e62407c6bff44ac0502e27647ee1b17a5c187e40956be73231d029df7f7876da68fc432e79b74cf5e8bc99e4076f03dc93f1da25c91c0f7667fa2fe1d3333b9944b4a7db5c7e1f72720873dbb1fcb777693b011b4d207c6449aaf0e382ff41d81a1d1e0641300a1c50a5af5b8ec79091acd2bca9daa40a2aab1e318e0e44eb329c6edac035c0d81dbe44688aafb0c12843532c171c4a0c7b107750a85749e9ee8bc474f2b6cdce8b37092c9d7ddd86caa85f17ec44bc5c9ae2e2db44db2c37021ee88eab06804657771d1cd233c96728acb47ae741c466a1e37f9c0af62013b5f300436d11f4201b70b35da32d98fc8a024a673ce1a26bf86681883818786876db8dba0a6f6633fe7532d20966663d82930b2622c6159a39933addb8f5f6d575d521048757dbaf89e631e122d4c76cb5a4d9906fe036e8ff7e06e82a6f506e44da86a30877b1364758e34982a7149e844705e2964e24e8c1da13d2955bf89231dc2e1564805c6c1ab32767f15daf9658e142aa43d83110a832fa752b80ef5bf6c8e7f2bba70043750d1ce4dac3b36938fb3d3fcd5c74352a0dd597b695d2c25bb5f57a00b6cae80fd3f94e176f2f867b15b01154a1d3efd49c77b05866e0fb779057ce0a1bc5d01eed9be745d019115a8730520c0630192411fdd668096f248375196ccd939da3af20a814b4cc3f518309124ea48cebccc989b710d70bb2c00600916b8c42abef6397ab42e1e1b805fd1a466ed841f69c7f3976b165e4263054c28291c135634f826808565b40e34e6446c8d8a98a73864ffb68f1370718f2d52417b2e49c9bf4f8223d8693e3b8feffa5e33645f2782cf7c451f1f9b68aeca0cfd9d1824146cacbbb7877343be4d797d8bdb5ea08f497b9e2e7951106ed9e690a9c7d3114aabccf12282d5d6a1dddd0efc75e724c47ada243414192e9b690d4cbdd919ee658c87673782044713a855eff112f761a1cfa38228dc0a4647fd45be191dc579a0ba0202338b15cbe2c54f8ddee6ee0a6a661e7b5bc800ed09388b462e1d6c73cc32efec6ce3697482ea5dfe475d7b19b8e9058f0dc37840bcdb2e3685aac6b84b3105c7e36a936f4f6c16682a1c76351834d1cbb902e22c13991336d44a719be6b2fea603596fb30f2e23f59e5ded509dabec1d8b2b2ae151da5841c34c104abd27450df0a07c56590291a0706506542d3a575b96f618440381a6d96df26bf5572f27cc3784c0c377f35d4828042fd042d2deca089ddd8208dd27ea6f7e16918fab1b56b4a326a7744a46493951c62885ea581740da1a7dea72c3d9a2a8d41553f2935786d59166a31e41a2b4d0ae58bb644367e6ab64e808055697012ec54045b6e4da73d4c1c672c116428303365cb6a2863aa0c2521a1f5910c8c29cf8905290907e70aae4fe71073bdc07f5b64de5b06101477a3e700238f840504b6f830ebdeaba75be0b861a329bb26e212cd4212cac1b74b4b292946d0d7d24147995bc0781dcd862c773a31ae7fb2bf6a5759a5b1b3ec91eadce702e758a98d639fb0e82d6e82f2344d8b963d9a6fdd426016ae629e188ed165dfa4644333465a62ffd96e229c277edb1bf2263dd0212704c29621b626b0c45e859a40b7a48380da3d744ae057666720cbee01fa39e25042f6daeac3529dd5fdd2fdb7ea155d502bd961c884e57b0edda9d3008c6114f6f4674cf9fa2066dec36d393883121eeb48d22dc3ea3f16e6f0a58278ca25cbdc388bc5050debed58688c2b941dcb88e098eb4b0a368c2ef55f990167e655111b20fd3b90e929b494c48b0eb1e2463e2142fea6d648b81c34c91271f03a5f3ddca38851941f889871c2f99a7a0546368a0b4016e766ffc0d7e8fa97a306ec9f2c19c6042948279f5e79a37ad816ad60f992303d397a54ded9a683391eebc6ef48ab72e1cd0997de295851daec83d412080d2d1eca0a7e3d6c54ceda8333f7415c7e726b4c562c6299a19c724e495c66c0bf6a218cee636053a506089f57dda90ea1e93ea8046b1b001321930491037431d1cbec602e32670b3bd1b59e921e43184bd690e4071e9bbd386c6e6bb8c84e5b51b1cd55e4bcc16099406859a4f5a1239b2fbb1dc94123716a20353709a6081c16c7ff6c74bc55308fd9bb710c4318671bd2dde70dd1b02f97c5cbc61c15822ed31c486a2ebe2b72ced4aca72be419260722d226cd7754a084fde6efeb8a46df3324be4abf9b58044a090590c9f350e747412a4c7217855d77c77f4faaf36ca1b948a29034aa42e4e21c1badf9eb283527d74587e5caa7f340fc9d92598804ea9483ffd3d3ada9491a3f9b210940e6e3e50d9347c72079a92cc932f695b5cb059db08d2d0a9e95b85c461b23b80725362073946959a0911d8160a3831a4026616f114ed6981919a1f8c83254734b425d203a4d8c364c90ca1e8af8afb9e2a9cfa337330404b9cff185e013c001a2a2ffe1d72ea4deb0aab34348844fdf6214b6c450ae4973b3a0434eb27ed6f6fa90652b1210bfc55a37c217613beecec5802ffd91909f28e4323301410e1681cfe8d96db7c44930d6515641e26e54127198d1c8a771c3d46a9b503d9dfbda570a6d57d53e2274848377a6c548392851c44d0dc04066e8d3959754c9a02b3c320dc8287eda140729528d6b5787a2b479c98df32472b2a14dc91551fa05edf17eea63ace6d8fe31de4fd7d82de632735ec60406ac1e616c9e258bd36921152d23c421ff86805e1203d92bef3d130e3e5e4cc1cb3c659f2445c65ba0b42b0062c4c88b155a53cedecfbf26f207b073aa35b6169fd7a375357221026ef9a68652b49cc44db7967a6495dd3e1ef39e93d98af63b0d85547ca457f88843bc2fc6d6abe863eb9611e74755103e57ab0880d35d2a8c60cc77ad2f78efee3702a26f688f9ef612490582e0c2521658e3f083607acfc0c363dfe884701fab599f21565cfe8a44986d7004f0f38e104f51fb59acae9209aa83c60a44a70e3c7a0c54c74486ea1086b1d37822db2161c9c3b3988bec376fa3ca2a66143efd70803d8c2e625cb11358bf348c1062b5f9521b48abfd5b451ee66a7291c4a77e85716f63302117b7ad8ff7fc052ccc35b0d1d70cd0ea95f45c1383e6f15b9218736c8b9822c2797283589f91a243220e6b9af52dca0ec1ddf4ae83e0f18d42f4032b7c53e5dc1afb111b46a2f6d8dc81cc6812e2c0f0a291e3f5af73befc8393e568977401b16839591c3972d0e5591e70e42c7e369c5b30ed7919ea95f2dbaf2a878733c553b6f5496ef7d736a5fb1655770d9c4d49cca9979619ec76d26415fce08323a04d4c4034ab9fa8d5c30522ae21c66eacaa41d3ec342d1cee6c5e93b6351e23c2aa6451cf2738af12b5754a61cbe9b6399b683b88b0eaac4aa16ce31702ae61e832072b2ab5e09a401542005e0bcc380e7341a22817ef7bbdffeb7caf7d29295dd5bca2465cf085f08cd08dbb6adfc4df82b651126f855ca22ae92dcdef4ac0f1f9737e0b7ca2264496e25d9953d4ccffa9bd3affef42b50f42b2dfea8f3abf4e851fafb9226594dda8421f8a96a9e4cdbbdf7de7befbdf7724e32e2a77b191862d086a8929ffea402c5d5188a58a67bef088f2e1ee1d1f5c1600d517f423da84f20787ad4e955ba9a4ebaeac1f791fab0c4697deac11287c94deb538f43beeaa989b7a7e295858ffa1d5d64fb747b083685b2c517bb6e1b20403c6af8b161101576db6f44b6c725892d06c3aeebbaef706983429d6eb091b17ef55e49f6205ff53fc852f53f5a65eab18d215fe5f18355743df937ae27cb224cbc2fd2ba71bd4a5984c4b7a5f12635b5b06b5233c51abd497f3f6ad2abb4e8535a7cf0c312dd27d26ff947a21769bc0486a26894491f353f544ee72212fc7cbe5ab1bc1a8e57a4f2f681d81811f9f66b0cf5f6cfaae32dc05f16c80f7f0529e1b9ec0f0bfb56daf4acab6da066ea553435ab6843155d2ed1bb7ee412a9e86ab69e64b9c0a7224bcb58effa7a6b054d1092590b9e2f3c6a00baf7de560b1cbf0ab3ef2a6dfb2c8c41d2132180bad8f7f44a27a0c2ecb378b0ed8ffbdffd8ffbfe9b40dddb935e692393adbef532d6938f6dccea41f0413af35e54de25f3decbcbdee8adeeee68b03bccf8a9e89537607fe96fa5c90f5f2fb6d243ae1a8be52a49f0575ee559e54a492d4ca524c15771fdea7da894d4c258ef2a574f633f7d03050d60f7f79537c490461a695c6ab2bc15eb6f7939ddd2a427757e9636fd4a975ea5c547e9d353b1078d73a4cd6824fa515393ee166b14ff64fa52aa948d5ea4a979038885d91f695b32893feecbcfe7a61d54fcb23bfe916c8215dbd5cac791957a7b7a4b7a5b97a83e89bf6c2dab8ebf38d1726f7df5e3b3345dfda7c7cf31c1b721c704cb223966112637e383bffa1b2326581679801150ce0882a5ab29537deaa9487632f03f9dca02cbd92f622d101b5383500dd4c5722ef098a930fb9f8662db0765aac876fc8b84bad8af19a830fb60edc0b6b8ac3ad4c5be8e1f72158970cf3d2ef163b22b6d56abf12790b3af8d4c867ad5cb4e9ffad7c13a3a7446a4c11ff5f72d0491ad259ff53fc8925a18ab24b91fd4c2ba92ec0182e37f8fb32adfc7c75173d32a2d7e4a878fd2a33f794fd2f9a9d863236d40f07bd3e96aba4b6003740575685fb42fb239311d0bb3417250914d399ce711809445c6e47bd9916c9efe083677a869984ceccb745eccd31fc9e6f8fe2b1b1ba352a54ad23da559fade7b6f9423669bea60d32824e0c11ec7953f65366b6ca9544f9f3e0df8c213f9fedfcfc1c6847f457f5b7fc9bfb7fee090c3107fd57c7327db53d1e6f4294dfaaf9e9a2c4dfab39e9add100beb5c933d4ecf7a1fa767a51e67e54fef23f5ab1247e5530fd6d06a1ba8291b5ff5afa9397ea8555fc51ad286f536509355e230b151fd88865924c754fdeb2a12591fbe8fd58b258ecaaf3e2c7198dca8fcea71569ef5f8a968c11c4359c6fad4935d176382500e3222eead4af6dd1cc8fd065c7777e771ffde0b74e3f54b5961f7539a561ca70afb3e4b7f15d9df897023986328fbdf405d4e9a4885dd1fb5ecc89bb4b6708af6496b384e6ac6be5f39e4874c848a37ecd0a47dd69f5e4593f6592f3cc9fe4e7aa5cda8bac146e6fad6e392ecfec7e959ff23f5abb79aecca1eac3ffdcdea530f9a3435a9b97269d2b7747e94069fd4a567e9d1afb4e8472dbe4a87bf9136e2d37de3a14b53b3a5a9496a6a9a743537b38a3536321ec02f3da7eb4e69aa7362e689f479f42293a6660d3a070bbb224ded2d5d6a664d4d50e7c4ae0d0f7fddfb39a8c8a99cce4945c4b67dd0cff17e77394eb43d8d6d598ac8568a6ddf52874163fb8d09c194c86106202020dc715bc76db8e50433d0198c813210101090e3171ff259970ccd5073d8b7b0346e4b114ab625436011e4d79f21a35ced148496315ab06d092bc771b025e01d1e2d337bc2451745851ef249693c47d41cf68c3a7b228a9fee87967fce102a438c2f82904f4aab35c74be8cfb03f3f3f3f341a8d96c38f8df96193846c7faecdcbdd9dfe20f33c8e81cedca0918b2fc4e83ada5129f2597fb810a2fdfcd8d068b413159466ada59ff378395f4a27de5b1e5f7be3bea4497624d2d8d3f7f1cbbe0f5eb1c672da37b71a6f91b631e0e560b73de8baa1ce887c56da0c627c316bf2525b52e03f16f0a34289d5f2b540368846a3d5a604d162b4582d4693d171af4cdda129f17363b19d25625c994ba3d1683e55c76363f622084d6687c60120aa15b158ec49a6d18468343168432706562b004f3be6962787f99b66a0c8e7b7f89be80cadbf6d19e2296a500d1264c85954d8419030a613662cf3b2fd90e15e5e4a90cfdcea5a8630cec1025409b52038087551e1897cbecc80784023ececec743b3b4178d02c9177762a2c0356c67d852eec0a1d18a1e8b2d85c5073cc86b8bbabf0817cd29990aea3e9b4c8f6719767b01ff2496778b6e3b58e80b14f121856453eab0fc6e38ac4186358149866b10f4067ae6b81afc330f649024bf1c138c803c208fa817fb4cc826640b4cdc7c707fbf8dccde76e78852b847ef8f8f8f8f878f8655f403f0b0ac237e44a23006168d45e3ce30a4b6a2d4b5a98f0ac0a56ac20443e6bcd9d48a1f1f1e159b2f323282808e6c513774fa284886e85188689e0bbe1a9c5e2bd94a0022d9fb5567ba2eab87b31e35ad8f02a9c8a4d848f129e24b29d181928acf6c0ea900337a33a19db9f560fc2f6f969326b804d8f2b6634342be8ccec8e5d02735a1e51f4c58c3e26bf931e0c5b0eab342ff00b577881cf8f5a2d282868851d68e80cae897efc30221371848f8f4d90d050adc5f193a0a1a0a0a0a0a01c6035b03a3548e1e20b1fa059932120a956ab79b55aad56abd56ab010e03cfeab041b6246b3535b12e3a9f9d47e6a9e5723c36b89413e6b6d16f4fd08598ea822a33caf4606c64630a8b3b384c7e747e394e75532bc1617e4b3d6747696f0f8fca4543f0278b2c20ec2ea793a1918c725f259755e66403a3aaf03bec8d8d068b41950e815711bbccc42513402d2a93aa3cfb39ea793010fa6249f55c789973146148dde65f06bb49122c4c5d0db174b737d7c015dcff354c8229f5547e77e79b4dfe91b3bd430c8f6290f8771ca63dfae80c63e0fe7b6ebfaccf97b6b3081edf3f8f2a18cf16407c006f97c198305dbfe8d976d5feabd3c5e64689c161bdb1799d7cbbfc61f2dde82e04d4803f017360b3004431d43c2100471563e0c9f82616be544ba1e54a14a2f546b1ef31d51144552a5a5c2faf079583da87231e62e796f0b41e4cd8e2f43bd0abf15710cb71044b642e88cf7f62340632a931618a13a71465582ba78eb5dff837c95afa2cd4ad5a9344bad7d57922ac37f561968c51a9b128749479638ab07c3efae49480deafcf483c310c101870f7af81b29a02990f72d5b31e09f46ef67b6c4a70950921d1d1d2efcb61c7b8ceac34f69f055a7d38fba9aaaea539bfc7c9f09f5a9b2ac4bc21c43997bdfd145b63f656cd9f1765dd7d92755bb30a36306875deeb9aa57d4c5be6b56add17216878d5d67d2791b998c5ad8f6b2dac90491bb3f47204184388cf5702bcffab35b082277636be7c79194b3b9c808be2ad54aa522ad56acaf641ac1132a157221177221277e4987de8f2bd57f7ab57af055abd397687ca565ab0737df366ee3dcddddb9ed5615b8c29846f574df5c9a5b55ab1f34feeaba720769a352ad567ad42a2d3395a51224696a927435ef0d20a51cce451a5c6f3b9d4cd5640af3e904aebe146934ba77c443354b3ff221816f1a8d4e3f7ad368a5ab49d2a6fff4898a3544b827f14a5313ac32d387bfa38b7cefbdb7b3db29346d2793ed4a1bd3d34d3bd0a2f4f7294db2baee92ae26d7039573380f9958efaa58eb7a6a5a94abc4717debc956eb71561e55924e4d6fa16a319d2139a8a89c4af7df85b2faede76063c0d42ab42acbb2266b6dcd3977525b4ffaa39e9a274dfad6d243366b6deb4fefa3f5a7128709cecab7de07f9a812c7f5e4839aecb1f2a8f7e1fad3bb58136a9507f57f15ab48f65879d4ff70fde9b5ea539c8a96a1beb591dbc6596badb5d65a6bedc6016980b5d65a6bb96bad7dd43f2ec9eeafb5f655ac1d52e33895b7819a2a25d93dea554e8fb35292ddab7c6be5574a1cb287cab7fe46a524bba726ea5bef2ac9ae2472c300ea265283dfc6f5a457923e50af52e23079d4fb38bdcaab50f3f4e49f9e9aac57bd6cf5a9e76a186261f6b9eb2f0e6f77bb39586bc79cce4b3918994a36efbd05df8a3f7a8107b94a899d6a2c464dd49f5488890d24d37b9af47da4ffdef4a54e26d2a3bcaf7a5f0d027e8ef9bdf737df7b5fdff31e2c8be4f7bc2f52facffc7696c474aaf7c576ea92988e0c9d7123d4c5ea5061f64ba5efab31176b5c2439b05e23b1588d81f6f31efca6747513b9bfbd898a2457da7c9f772a65e183319e1bcbd58736b97a93892fa4e6f8def437df9bca224cb62f52fa7e2b6fbc279545320ff87bef3f6ae2586c94b3b9c808da07cafc07690df9fe06fceffdbfef5b6511d67f25e945c807c1cf3169411f48ab4275881644ad4bc686c4a29d8250aa95c77cc7a5589adba70df915426b994293666203354faeff40107c17784a3daa7399645c98a93175090f143e35180a9acd9cd0a4d066416c4c55a22aa1c490124a709707ea628f7cc0c7079e2a93d1195c058d26e3304274d021d7f6e3a75ea67ad4832ebdf22dadf2e489a305d1996e5b5ca7e49883bff23720f7454c0f3e57de7caf521639fd077e4b7f4f561365da4e61497bb4bca3175f26fa10044b5a4890d0506d0a6d48107fd9211ae7a52644926c9158f9b3aba522a990ab1571455c11574452a3be75f5afacac3c6925bfcabb4859d4d2b2d6af7cdf27fa442272a5258a5e94c996288ae28b347e555ed67a57f79de8bdfcafc8785ef6464f14fd87c9ef1361d17fa2f28222a9499114c59626f5cacab75aad959214bdfeff96fe9214fd7feb57c8921495648f9527dfc7b77e857c1a2b8a5787dfbae2bdd46c91dfe3fd3d486f905ff92233443e5f9cc8648b53d1a677e9d2b734ea497dfa951e51b1078d9348f9591c355d9a9aabd1a79e8a63a9caa492e9844a8d46a19fa8b0a973dcaad2265582e2fb50bda8c471bdca85b34271c6f8734c9b7ad5fbab542f9645fe55aa2f9263be7e59987d5216d9edbbfd5a53e5d207b1b0d493cab7e2f896f5b6f51ef31df24fe7f11f2f634aadf9abe6d7c97526f7499abcffeffaacc9fb2abf5265ae67db3e978241ff49a78035d49a890da548ab5ed429515489a92f7535c12af6a02269a352a59ec6353753dfbe0d35a636a9315b6c5bbfa8b55a46ad552177f7274f624f62f5497df2d51250978a44859d95091470653da21ec1d119fcf67bd0983a86e7ed1aadf6fd0eead238a917ff358ef8a95fd138ff2bafa27154def55793f8bdbf360e53657713b9db45ee3f6d239391bf7a19ebc77fcde426f5e2af681cd58b5e4533b9113ff52e8d237ad57bda87ea458f750fd58bfe6a1fa9179fa588ec3bf6eb143a633d666f57cd31fc9636917ea5f38f7af49dacf4f965a41fa9e8beb9a48d48243e58c5f04d8f2a3de96d6cfb8ef3f8cfb661adeac46a6dc754399ea37af8b91e86ad939323e842954255ca54eb15b178f115b178b1e85d5afcb1f5a026c390fcf05be1e86a91221631c618d750bcb886e0c5bf83de80fffe254276a54d8bfccd46264bbdea65a8773d0ba1b6f13273cb1682c8ddb77efc1fe4afbed3beab68c3b2bf1a731499a5e5a4c6593df82d8dc3c47b1cd6870fdad0c91ee3abfe667c5511d68f8fcb1bd5bbca22ab573d8d8fefd2aa6fe9f0497dc30adf2b6f567f35dee069d4a2cfa6ed346a6a9a4aa1281a65d267ed29a7f3910fd77b59b85257566476aad57af2defb43547f4b7fc32bbae345dd7aaf1256ffb0b0abb2f2a06e8561ebc35f0955441a87c90df9abc7713d8becde876985575a2b5ab6f2adefbcebb67befbdf7de6e731e35dcdb6a6d9c37de6fdd5fc1b8f5160141eeafdcfbf5c7dddedbdec3a5cdca4aeb2790b3ad0dd9fd0fd3b3fec7e9570fb634b97deb73cc154d6ee56fdb83aff239a6477a1ebef7de7baf87b7971b5b9516c6b67f65868e40053e210145f403089da1dbddddcbd34c05c0b64700c18e4196cf90e505c5085ecc6c0f4fefa48cd9a650caf8d92728825dbf65532865c8409e5d47967cc24159e86ecc8534669b59587dfc4361f5e90b75a1255cf8cb856c992304f98c8008826828f160df5fc1147f7990d94526bb0777cc5cc8b920e1207fd0d5a4fd6d6663700a28acbe0b809ea0ed8aa9089ad9186a026d5a10fea12e35f4d7fd823ca64a99d5ff84c4f8a6803287a1508a4004cf57db95a582b15df709eaec6a9ea0e549e2b3f3a3a4891043ecfad541b0ebd7fad5b3d8f5eb26dbf5eb36835dbf7665ecfa152f8197c05e8495054ef03ce1e1e20b3176e5c1ae67ec9ceb7f7e6fca17c33f41bb7e5786c3745370ac9bd24dc131ac8377ba2998a736a93cdb0c5e685e66dee39fcd35d980f6b664d3d976361d1d1b43cd9d253ce7a6b3fd64d1f3ed1b8f995f9980253235bf076261f51310c5c7f7b8246df07b365f497acd0cda4df08f85d5e7b131b88985d5ff19f38f423ca1fbfc3499ed8a7f4842f9eb6fb4fa5b50fd6db6018160080eb521e88cbf047c6667b1d8b62599431121e88c7d0908a15fec5b236b4cf6c5764dbfd831253a49747c674789277118b22ed99508fcb3ebe3597d0c541fffe026bee36e07793a5f11e35940d3ce23a7bd8985f9ecc55fc6ff5fd67d3f4c503eff9214c004cfb62914327a767d13c6c8d6ee00525af7d3df618e91247cd0430f784082911898259f34900809c107da0b4cfa7904e953168a82bdc1d0af343ec43f0720fe2c45643af36dff2099e78abad382c449359293d04281a0eb96a106fd2b36b5013d63b683d42b19b124676c7fea7506850c10f807458a18fba453c848b2ab8ea537b017db8546510cf1cfc11f4810ff05e4888244672add5c919beef1e3b2080f9b63face76c7252db1266fbae7be2b31dd4a6a85bc1ef03e65d13490767dba7d7dabc9adb4c95164210de840156bf2693b6ddc0876d8bb9e75af5296e8ccd9b8d63863d3dfa66caab9aeeb42d73460609f17f05adc07561004bdcfb5a9247bd9a2e2d8f2d7d8cadbcd39e72c9adcdfddc3954530606270e6515c6b50167fd10fc59ad70ebc6fa869882f37462f37b694e81c228a44a351e8bac64ba66bdd544db4139d378846a351a6389348e20e6ee3dc422ab5584f55ba894e1c4aa16b9358e327b03c856cf6ddddddabeb969a971d1615ba4ea5c4eb2faa123175a1b0ed221d807e92d944444f0487718b8f43de4f5d68e6b38c9f3e0f9bd2a39efe283f25dd073d148120289251a95836667c27574f526d293628da28d3a62915641a9ba640dbd2544d8ca6700591cf4c831692c867489d9450a79d52b8691a8506364da11855b51f127a2446bf69fa843f71292850df0d34a34f6c144983c5c01ed90da2c24dd3d90efade4b20ea47a81b222bde7003b9aff330f6ba8f23c9b66bca8e64d324a3dd1c22e96a7ea517e98414b675c27232696b9a4c2693c8f1e924732a6574cfe949da94023ded1be3133e390c44799a080e78535aa3b6b0e91846950b27c8678641a5fa9a28f2995fd8b48e124a09f9ccad70d33976d53da887a2d61c750b2bbe91a6db87ac8d512c8dff048db1b6c4c2b63f73a10a17b6498f3c13f8a21a572c9215ba5aaef0c31185d26ea24c96b280a254d8605b205d9a108a9abecc489a9a2826f54d2f7e2fd53492cf16a52c90faa585232369bd2ce24a5a6bb8c24dc79c78360d33a2209f79db151cbbea9e71cc98d3e1a66fd45a5fd460dda0095e9b62614e9b35f9d13e445dfc47da81405d82506b88a1e3338a91efa66d945030182943110b3226537dff51a88e95251cb2350b73fb12f4b24390cf7c42b8e91aa3aa060428849b06c0b621440ae1a65db67d1189083efa1571af70d32db070d32bd02ccc3f28068a0ae1a65598690216443eb34bb8e9d7f674cfeaabee195fa4fa4ff5a2eac395ea495ac6c658290ef3e762bb4aafb497e1b0270ef32fb913ce0287f9a86bb00040b8e9144c26d9076a22e0487c0783ce84efef3ea83944efee797481a6d171882cedd33dabcfba6754a956792c55b2236f8a81c385405f58c2c6219a4aa21b6cfba2a883cd12002c0f30c06cfba768b76ceb3b44fb2bc19252979770d328ac108a27ecb07b4c0f9ab457d3a48f60d2662164d93543c867c842b86913361eea41a150b26a1ec1e650cf6861d68237c291de401ce1485fd4485b544c38d2fe89aaaf2da84c28130cadaf93d660db77283ed8ae0a65c2510985fb16367c565d0847659935ad35502d849bd62554eb891be16ef9209f1926dcf4ca0094c4849b5671ede09aa106f90c5bdbd33de357dda37a94b640dace2ccc47150c3ff9cc32e1a64914f85272a5a88590d3e28d90d3218e90d3204cc8e9efe4d1421d21a7311843678221e4341743c8e98d26e4f495c1ce108a34dd9c7614ca816408395db788b545221de1a657bb0c011491cf108670d3e31e69f08570d32a17acc8678e21dc740a65d2560987f9114244042949120014e433a409377d1a92a19936a8cd70d325130ff9cc249d1d48cc90d33da70f4fa4d4bf1cf96ad2bc4119c24d8fb6c90ad1d988e202106e5ab4dfd33da827699f596b33b823dcb4b83ddd53faaa7b507fd236a54ddafa5898d72c495b9fd99d2c73443e330de1a6c33d7a91a600a640dea3173505c63d7a9f59303c857ac882e0f6740fea41ed432ed23d9fe945d387a8d2cb70983fb77b4ca58be130ff018091cf5000e1a6bf2dd23da8ff748f0e36512fea1e9d6ca23ed43d3aa3897a4edf60d1e861f7c84a7f049ba8f71ad4181f3a391574e6733484b26fb1dd6b569434c742496fa55289b270525a8902a1b1a198d9b6a4af95a1b6fd232f26a52c9c2a1c27a9a42b0b4746933a8ef3e443a832db5a1bdb7ea947e74dd37bbac754520beb31fd49ebbc692a3bea52ddc49a6e120c2fe8c83113830b323130386eb460838517026c116c77e549818da98b7dba4933fbd2196a83ed2118f3977d1a67b9229f78b380443e710d0b49e4d387ac7fa6f6476a9f524cc19c91d723bea8986292025a2054f767fbf242a5cc80895dcb33739b42a1c3947dbe6cfa3c2c0ffb425f86d2a00029b5b1836c377d110dbe81cdbdefd84351d017dd94be48f0bf07dfc51d7707325f8c4e1220cca65f03458843bcb1e9d798216a61d33f216103872c6cfa2516e4f392fc65d34f01887cde528d4dff240213009c8c31c8e73db900a1200545df05456a854d3f00618cac92abb0e9d78edbdb8e1bb4e00dadb69de8ccd923ec14c5eac5334311ac1496d40c418694cea0b0e9db58924f0cb6664ed8f451d0808b85ce98b069cc0d564aa019265e6ffa307c209f583fad464ab94263a9e5f39a904f63eb5954367d147c58c2776df0de136eb436fd1a21e4f3a2404e39924f9c02eb090a4ce4f3be56b4196c9cd2026346f5301d3a6edc686969adf04a6dfa3300e513b7a06a302ce16271b60140020014a4a8115ec7613e8dadd2a6df42065e424a67489bba0c19f9bc2ce44ddf852a6c8c5a0800931b3251f2897765254005f95b456498568e92cf1bf3d14c32199cf338febf76f4e0820c09666a76c8e7cd11621b832d4c870dda0b28288121c416e73cb27491fd63b0e589e39e0211f58993168cb1df6a5f5e5e5a5c5c5a70bcb0a568b9d5e230c41ec618e3eae9b8e1b873a2e3460bcb092e38aa7dbdee09d405c70b356f85b7da9c45aa05f5e20420845e735c7b29ed296db4f15badcd8d4d0f1b4aa3b49896fc6219235f7f7d62cda5dd6a5bc21787a92e7486923c923e5b3e952a401a6c70449fd8e0883a8972c64fb536603c8ea55f18778cc7b174eb96524a8557e15a6c0aa3ffe388b1ded65af71cf4ddab596bfc89f138969b3ec6d5860972bdd4dddd7df444757b37ee729dbd30ba7aa42af69ff8cb127b66cd517f9cb14155d8b4744a536b78698590ebff9ecd687ea3628dff578dafab798bcff8be5e281b29ed44b1497c760b5514252258d558adb53a4f7dd1847db6b6f8748c2dfe75181c5b148140628b409cf1740b1e7c30e38a58cc0cc113f817043b10db6007ac88c201167cdf7b62cde76981bf136bb08e283b5fc3dd1b6c7ab6f60bfb64d935f6b6f92082bdf920c6de7e70b281dacb458729626082d9cd960a27dbda24596cbb8120a22401e2452690e20825088543386664d34d1d0631e8d00adb1dc3a005d03ec30c44d9fe378a067870de00c852840e9d4981ced06daffe415d103094c6b6a27d3920b3c370b4af9d4666a12ef47bc867d5a9487438508530c222b1bd25d5cfe102cda10016c8d019faf985c2707fff0685e99e0c0aa3064062062d40ceb1736c1ae7f4d5175f1dfe6bfb3c6ef7810062163a63a9cb3d53d8f47f454fbc4fa078d3b72194eda61cb7552be4b5b9add4e76bc7176aaf0f7af5eaf5d6bf9b2b59a84bf51ed4a77ff674d9f7929b4c576f9075dcf8c18d6d05e7ad256885843b2472b79071e342bc41ec61cfb302a44176f777fbd3ffbccf6d5b496977edb6af9feedbbe5c89fd55f7a521dcfee7c659ebe58903fdd39e16fc321c9de707829b5be7c49a7b2f76ffcaedcd52079580f5abb93cefbdd76ed6564b29b5b7bbd75a1b725c48c51d1bfd7befc59c90a776eb6890f0d4dece626bad8dc11877f57b08d86badb520e7f9085d5765becd6ddbc66d9a017a4f61afbdd796334cc10410534cb16d75dfaf15f0b65a6bd7d55afe4c41ef0d9d00ab87e03ea9131d3232f6dbd65a6befcaf376a53114c86f1cbef1f252b35d87a177d722b4865ade4df3f097cfd0b2892f7ff9bf3accb1fc636f2b7d726b1cbdef9e321886d8c650bc6d0e38a433ec006263b8f2c6a36cd738c897d610fcbc300cc7f83ace73ec8e3b273269d32848bca821d1826b228b9b4641f2c403f9db340a12285ebc320a92263440f1c5350ba3355896479b4641e2234242ce9b4641b204c94ed77d1cc579689f2367048f3fc31f16dd0e3b9e130e703bd8084d926c321c89753f5c198c0c7146f80010b6b625a108c719877989c3288f0c329f3b763144d5418a0e5c645c06ed071b4464ea84c3a80c3c38c15908e771db348ace6c8f9ae8a8a5b45a0742ae8f4f212cbba5647919218f9b42c1010ec430f2331192914925089364d2a65070a0648603241d931c2e812b4206c9f854905539007fc8785328585c814f90459b42c1020c2c6660009d26f852a7b3a7ce032bf6dd344a0f44d8e738db92b015ecea87bddbbdf5b67aba1933915c6cad58e3de83a15863c110ac023cebaefb37e87fdaaf6ff5e8faa45196d064e3e07e1fe46e79adbb5f2dc06c6de528a594524a61f4fdad75bb5d777777774a29b561825b473069e49ac3d50f89ea76b5e94cfdea77032244125ad1078237ee76ded758d5a93b7549e75e8ec5286c073afe0b4667ead30c44ade1e5f5a291f193e3c6159da9b774ae67b430ef366aa40f76a21afb184f68e4e5f9e290b6b1502c163b62d2af6778cce8b0fa949e4e3bdd09df796fe230e1fbd37d3a113d80d1225382edf807fba4b45b67b1582c89e95f0ce14168a72aa944f0f860b17d80dfdd5621343a27f659a7602280b19f38411a4d7a40031fa680623ae0082578410ec230410f3a98b4c652d081098684d8410533d881b9c38c265400b18408664431cfda64fb130e98e10114d8e08c25606092a24832042b900405619eb546973084190e94249942889859c511469840820c50f063e47b7a9e9eecb3d5da27cbfe9ef2b0bfffbecf4bec2fca9125ecefbf072af6f79f58f3bd72a8b0c3f7c49ad05b3ad8e0833a586a39fa2b28bb931d849ac36810a6388ceed84be765476689c3e80e83c761749f14880720b6f7de77628d1753230b286226ce9deca7a6c33025a17d3725ec0d53189fc562eec40986c10d97096c18b4ed61158dc0b9569accbeb7d2b00248187146122d40c294169867ced9e9828b1154d1040f123d30ebc65f70419a413e595876d8c0b6dfc22b3708430734b4a842073d9b1324741051b20c63db67612386185762cdadf6b1163ae8b0ed8f628df51f2c4101aaaaae30b2c4b69f126b2c8e2892d882042368120616b708128461e405370002c3c43de8112aa1b0886db1ed9fc41a7b3a8ddb26b1a40919bc600b219ad831b37542821e27982801e3034bcc1b9e582c9601d35a6badb5178d6d2db8adb5d65a9358634b27ec3394b2cf56152ee898ed933e39a304dbcf18c2128058c20fd068b2fd5f281434c68092c6145162436c7f52f6c7461ce1ab30f92261db1f893516fb209fe18d7db6b6b7ec186a900432cc70419013660861bb129ad4b88c8c50127cd0b1fd45b1c683a690d1dafee1083cc05518f042f18935964ac1031142280207787e7e606e167b0ea44831451c6d0ccbc852030f96d7bd8fbdd834cab6dfc15006126080c2f6e740c0450ea3a7a8d4ad1734350b95a1110000000000a315002020100c874442e1709e26511aeb3d14800e6484447460409908c320ca61180521638c31040043083084cc0c518d06010e71625651d9212a2cbc410acf91ca7350a732bd86f4822cbead6a4c32b188baa3ced1f98b8ba531dc51457960a6af2ab1721f879515ef92ad607f2eb148802fde132642a2f588ed3d395191c8cdab2fdeae1487b7fea8b7e74e662548f0d056412f0290911195935bd422cc405567a0874fed7b9a2f74a1ab6cd159581e6ec118764edb00bf80bc60134246a8e1f01f91ce2886a2a39f6efcd95f42c1943cc542a02c0dda82a98e5221ecbb39218e8ce0aa9e739e4dcb6a4557778590f1b6dce98f469cc1002495aab91fb3ef615be7637ac299aca29e1c818adf114aa3826ad259515f23738a22f097917c645c3b1ade1976b1be93411d1a83c8750d0bb54f308c15768e7f9d123276b8cf66002680410e6a1db86d82168eda1f1fbcb393ef4f0dda5c4f5157fb947b81df3a38968f111c6ab2a173d0d5c7d9218adc08f6919a608e41fef269c8fffffe3a717b7bb92c6dcd1c1555b8b45147093fc09265aa287efff7d1a72ddee8d0d5512287561578fd5853a4092c9cb0f5d3a5f493269ab0bfb96b01412ea55b0d8fee73a8f44877921aac49e4af57c6af282d58f2f638fb5d959d8bb98b13b5f5877489f6f3cbfd57b646e94185e3e27014b7ff82719025d67af6ce92b552a760843bc576ab750bab4e1045e1b8fc75d82cfbb7b44368bde265bf29ddef0ea4c79c5bf7980389686085caffa0b125080a5847d81c2d2d5dd28f5d975c947b19a4ab04ad4f240488e5c1848220e7441b857c5bb50f669941b1c3da3ef74ce1a178eb5ff1d6c558bcd5c49d83e2a378592b27668716be7fb58dfdca6f310511f9fe21350bc7a144507e446830253281fe4f6f753a57938adb48d22e91167b5c42b950263cd807c54c9c2fd225ac0be8914083c5b09184adf7abb9a1ccbf8ab6c5c44e68bcf50965c4193e53c840ddd323983f9b28b36d78f94cccf7670f718ffa062103f84a8e245d07962aac0f850ed5ff30fb78e1e12e9b549a2b609f14c52daa0f4d5b7e9e127ac153306b85b67037e12d4a759ed3c31ae848ed4da17a5c03a83923aa220a808262dd23804613c9651d3c4df7d25c1502db1ba6938828dae52cf88424afbe5e3a73367a42719b74cd0b362895b8163a82ed52a475ae664e9e52fe471163cbf0168195f2751b5cab62d1abc940bc71e0558e0616609ba1844de5ba00cb26e9f8b3920fe0ee96413636d673054dc8f09edc26838dc3aba55dd362b81b493b7e525c441a24aefb4a6b50cc6f6318f866277a95293ccb653bab2c162ea30c66a0b955268f47172baf78a4a846cb82432c8b8b7d385122efbb96c2b96b6ae274fa8d9f51097c5a47460dcb5f9a00339a0c40136426dc875f227d91feae01aa7b77c4e03563b2ec8c43d93c96f4420f9c975b499483a1bcc704bae18194f25f234092ff465b2568b2c64541761732f22a6ce945a070b16f2878a5eb407dc9ac58b9b9361c0346d4eeeb6bd088f0c02484b702ff8f0b27b3516f1f0442b7e4000f3dfaafe40c16d5b28cc328ad9795501137fb49ab91a5b0dca5eeac41d775751b6b5733e3935bafe05ef11ac0913e7da15c14342f65c521bfe8e47d185d7930500952c97bf41c9b78045cced921fc71b27a305e4183accff3d21e2f21c8df02e930174f436e4b112da36a59301ae88949269fe84f6cb732501b96dcf04bfee2773508e694381d7ea099d4a78c24083ca007e4275abedec2020ae0c31b8a8854c8ad281015036ab6aafa0e2185c21f1ba9feb9771083a601e0602d0865d1000e0e3ec09da07fd1ae5e2e55eeb210ea0d1f628b0b29feea075bcf88def11cf7be8bfc5c7ac6f30dce2e91142c18394a2764e92a95de8198f319b89e2077a4ab170b22c98324dc7ad92b0002d5312e2beed51d55b5ef38ecbe54d83f97d08051428eb00eb5ff5ceebca23992c935d214286a65b3e6c62ca4fe148a0d857db7465e03726f18c8b2df01de56c207db5a67871a5539deb032d9f03e4e8bf4c6ba546e93c1697b12cc80e6ac30a767e88724a0ad83d3d8f3ba04afcd4d46d13e2995512142734466e578e1763415528da5c7872d343e438b410c10dd92fe234c851cf459aebf729ec13180091c1dcfb620f1e9d7157cb069a92d7920be82915d8ec13e39357b50f12543965796bcf04b92378a8459bb4190b42f83a08aca95651a44117b1040410bf4da86f1c7a9689d14e2fc416c3a5b3a328300852635e0a5763a97a84a47bddf0685ae3bbd52923b18df7051e772fa5be472e0c26d72556253cc56f2bfd09398eaa471df2aa854aed70278d4612ffa2063dd0866fc4534f8750d8836401aa7419347ebe5d0751ed012fc689f0a207895639651a72e2ae8a338f6815728c71b7a9f86566951aa45204b9bfc1b548981e4c02b4ba878e637b88b3c9c71d8137cf6f323aa21189f9de0b3dbbf2d493a025cbc9af3f6dc9a124a8d06b4527f8688f4c5ab96af9a498d9c17b8691a9403cae90dc406fc6fd4bf0d295211c78aaab6f7837920dce4d5d1382f17e078b98dbcb2d4b656ff7b405c9a6d47ec7b1f6044e2bcd69bef0182e215c9e1b5d5782b8800b5626dac2af14a34a11a88f2f24818d9e3699c16d35157465e8021226b1bc46b1ecf4127114d73cec603219b13d2ecfe5a33aa6d3d50c2d8378e705889f277455374090a3c38048f580f169c3338715c8e1de96347b05b9d25a24d7e631e907458f29e0a96d4123e0cb00c593dd20ebc1291ef24eaa958947093018a6295b08c2d67b58899c25f8e53147c48107dbe22bd0206efe9a0104436a1ce6c60d82ce8563a0d658373e94a1c58dce6c6b2f334c9ebc1798b96a5d2145c0040699b0216ff0849f8d46ad362f3c098300673f3e955767b942f2cbada3e0e111c5d7ea97356bcfd62263d33cfd6006f3d43c531a581a80a8ff7a6632906d0232a85b8870e3a1ddaa8bf714b1845d321c6be15871317436da252ec315b63abebec7f93d18bf730ed4477ddf8b75b7221303c5c1911b566209367b47234a61605b833e65a6ff12d7d3016eff6329cd1df512ace6e9f2ee1b56a9ff14db58c16c03d00b8474802b6133bf6c7bd909c1f0f57f00e269d2bc855968397942cfabfe8fb3314ff18a6da29ae431d257c3598d1d22f31ef939839144cd46ed687eddcb4f6b5c98a18f440579470b39ac148db66e2078d7b8fc18837e5572c8863e8d6e3dceac85f2e88d61bc0b998a58275717662fda713ec258da38e4bdcf1742c774922ea264fc1806bf38078943396ac6d50f28a46f4e4e27558c24c167a7c6c26a5ec7e0ecaf07d1bd1fcabc449734dd2222a8438767bd3b79a330f70883252865d800f3680d15b61be832f3678cf7284c8cc5770de159246b4df4ee671bf4da90cf6f3f5f9f54b85c83dfd6e9441c78fcada7dbd3c77f41631a9dfa523908018f2613996ee48b8239324701310ff8435b1a4f4541c9bbc161925e23c3b386a8d8cd2d4c6941a0f5614784df88be644b386e1c3927f599bd26359ad52e208862df0606ee94a5952c989064551c6c9a9b454d8c5dccb12136baad4019c3bb31a031cfba65533462a4ce8678bf12cfc55d3f299ca34cb12f2c9436c58d7a91c00bc945339c034e17bb82d33a307076d72baa47ca4b6613da031d4b6695146ea973ca8382e75dc1446ffc371345241b21333d8bbe2c37d43449ddd8a595a2669f0aaa352b2c94af7baf1e6aea425e67a543f178fe3eb08119ddd10decaee9d9f51261c91cafcc7fb69ca21c57dcadeac41e8380b250f38c87a94ae054319c57ab09239977221deada1bc94e75b9a38d314478c84cf24b8d9de1f0271d6acccd75cdf798fcc30566b523c656824b9adc0602d877fa9c4503b804796e188479c4236e5594a9b3be0e3e25643b1816ba766f24b990a5bc070dfc2f70f0da094dedda06ef5f33540fcb84164ab4a67a60394eb5dec82116680edf20339cd3389e1dfd06f50070f7e8982ea4cf6dbaeee897d03b8ef69aca09546bcaf16bd129414c2f3d0f27084a7fd2487f821559d0a407ee7861025cc40ebe8991629f1a12ac0e5bac90ca496661b90edd076aa0e984f4c2a35d405b1ef884be45b6f3d311df61d1c90155ca262aaa21fc77ce11facf1a6a781f74e6e21ac7c5075f381cd87d60f8ee8b4d5625ee9757dea787a1e829050f7b7ae7f28099824a7baf82b15b3476e0b775f0991ed86bfb962da7c9b8c1c42211b74f0c0136758633ccae2e9758fa035e2f506936ebc8d941a83b246fd7d2169ab95ba6435f997d6d4cd4e51e778354c19667fd79bfb9bb1b04c86d866b84756aa5419a306228ae5ad45019f7744ac23df8bc21eb9615f7062e49d73f5dedafc8b349511641747ba63b9c158e98049b265291bf89664ed6adfea1494d180446f2317bd3c9e91d9592ead4895065f764d211e47a8a42bf507c6c16f1803fac6973ab6d0706aab649a7ecbab1c202a2bef0e9f8ca858dd217d8222ee0a74098c6ad068e80badd29149c58953c509d2f1c01ae817aa279bdbcdd67f24aec72627f0f7a29873323f962eb6eb7aa4339e5e64670e5f37617c27acfeba579c5e11b20f57d743d5035f463b496b3a601b577c816717412dcf18410461e8b0dc05d0263be6d8d1fed71b8e8bef93ba0abb369655d95a0e1f11d6a109e0054fc4a315cdce2f20b3c03f636c001f3428cd9f997dd948dd5e59cf979b0c8e9e7523886a64a67bce9c7527a342708a6d7ca66cd02493690166c3873c62c92f18eda99700de23a6a1b214192691f15c07e561a57a748d39b59da38f33cc1ef3b50101cb8751834c8cc29d8f92828c7cba84dbc80cdd502f267e08deb6d91acc235a3cf7b4b511cfb678dd986e5ed08f436f4c1bfb734201779455fba149e78f11b484c58a89f6c4c2ce7b2c85af6d8344d8d82b145bb21f19d6d41dedea59aa9a72fc3743eddd6e740088bc6330bf49447ea6401f6ee5f1ca86895073d39df6cb31c06fedaf6290b844f685dc12f74aba365894a688cec70f25c4fcc35d72783c887f4382d383218435a568aefb4628fa02dda127f17d442377a95113d9d7d57317baef4ecd3d844592f7b2f5a95edbb413820457ddef5bf3e2ff3bb1d06a2a5305c927d22e74c8c372d7b6740adf7087eb42ea0a9b662c896e4cade00de6705d20de4bb37eb77210210a3a700ca7a6b24dd85dab399b7e13bf62b1dac54c53812cb56536c7c4396db8330e4225091ad5aa4661b6874983fb12520836eaa115d81c4d861d7bdb82ee3ff5e2394fb4627e536e4a8552bfd75ca0c272beb69a90807b46167a349263aff085ee68710e05817d196776d7e6e933d5540d26affcda1c472ebd96e5265a63476e3c10c60673fb6a9025f85ca69285d706582a4268ab4153acc38d2739b3b9e4f43eca5434f0f20bd1ba82a149a347b363a29847409de0d34d0c539a6353b4d96595548c5d0d443cb0656625476bfc875c272a26f30a3594611288e55bb934d7c5dc117fae098720818656eb005d166a684bf62fc1bdf8ffe6065fe9bce487ea122abaab8b1471970de90d161e176ae19389a5d246140059387cc8613b9144a47e37665371270155481c96440808ef7b6eb35402a867423d1003aeeb1c4d2942850170bc2c67180ba3135b647e99df2c57783192217b4562a85043860c29c1c9c68018518823d228f91708fe0d4547a20009df3c6da03c1f64f8958837431182bf34e1ab21957a3e2756b7745d19765687b201b2b65c82857bdfdb999f173e07a5648ca679f0c484c36329458b47cb52987e275ed55083dcc1bb9aeec762df29b19cac397d70bd17c21521c1b82aa0482a6345fae37cdbfaab3a77036baf82d9aac13a66f01627eeb8caebbfe3035f9fb57ed230e42570e75039cb1629a8d07430113ad15220399934c6314b3ea8c49837a4d7faab6575f92e9a5db068c73343051ac2289e3eb7cedddacea80a11a5d9ce207b19aff148f6755236c15cf7558c56119fe37388577c1b94e762be317b3222a82f3a4a1965ac290236ea829d5513cc66bb85424a98f258502585456c361dcba1e78c6f34735f8392425994042c2199fed0fe50e4050b8d511bfccfdcd19bcd1590f2492666388e3fca812d821d3a8ac15ff625c455cee30a32cb20ac6268a28d0128b1fcf2ea9b6b7f2cf10c1b0cf2c9bbb0cb577426c5158a535c6218c2cc2646ef58e4ed7b5c66574187ac1db7408ca00a68af5ae3633673c6824eae8d3ad41d5095ddabb2987fb6f7fae1eb8ac6828edb6da67388002786c77a965fcca8d5d36fe87c4d77c6d7c67f5acf4fc494513f46134170c662caf61b0535be0923a213abb34dc62e83bb4e3fcbc0619b908bbd58a100e365714bd2bd4ea0498c563f1e4599f484f1f0d62490a7803f9690739c4a6e93adef3065c69b86596699a94c563c2f71f5d3376e05f387d0c4f387da61c311c4817f0ab9562045853d5edfdf05fcc110bb2c95ad7c064ef952a2e5e32c2d3806b95a759108613d1147bb708667c85592226fd1ff9c36ed8c112e068138d8c167d842c8738ebc4b61e8b57c231b114c3629be0058fe4a6d927097d571482d22da2cbea02893a7fc00e9c93c6f96cdd2398c399fc294053a664312557e37f2a33a3fbe8dec595b13f041ce0c051b58614a12428b56df490508a4e791e896644a122cc52bae2d02468ed952f366271ef55ad673bd8c83fe59f541530dfc810b0e79f0cbb39d30884f7475f4f6491b8b8f4cdc7957a3920d0c5f4dbb8e42be054c0487513c064000024e52365b6fbb39a47b329cd6ad1742935370a8cecaa2670b5d340264219bff2c88def87cadb5b2090d4c68aad2ff4ed56016989331833e5a1041c02ccc3d94981d4def37ea8ffbe4c680eb044445ab51a9d54ea713c1605f2b067192d59a9c9f25d41f31a805bea11204af1ebad76eed6ad787a0d3aa99c780186bf413864aa7576fbf2254ddd399b62c29fa969423ac77e83d02d7efa83a034b06fb1ed92c492c95d1bb079ffbc681ae7a8c482c4669d8aa475ffa88168213bd023257bde122297e065009591a1dd0f8ff19ecb94d4ca322d27c1ee34ee86ed0ec8a31b2afd59d7624903903c1bb6a41cc7d92142c48eb9045cbc53a01373688c8093bf117e512ee47b4e0e8f4e4a102a6d3871b0e60883e0a6e81c4d6147df34bee03bcc6a75d9930870181f3737aabe83e3db0443401b6163dff895a56ca07e13afe04fe79981da66375955e397329f693ea3b93176bcea550d2f8660cc56d08d01c173c6ade8414ad369fbb128f8f3c0816e184a3c43e03015a59a24d4acdb0f328fcc0f95b7e21e0d2c655c3f2a5ff373119269cb5676952fedca82d0cb063851523be7eafd6cc8ff76799045f0e7bfb7124b33c8bac4beed87165b671cc96f916259311c94d8a84d6e8ea7d61e551a3c7ca79e1bde16ae067ba4fa17e25a5671ab356d405bbe97ea8dec3376e01e09b69ff9f3db7aca0c55e4fcc42015a0b4cf04548aabc7ef57ed5a978cb52e129dbc444a0451f37c5e639e2e1820cfcf64a0ceea6ed758c1afbc749b29448e6bdca2f74e2694b17185cfe163f792fe4efb54a8aa64279d71cee54013d403b443d72df2455789deaa548ea7ab6d12c29bb9f36a74562a7025d43390eb4923b40255380a83f948ae2e7f039c830890145146ed81207bfb019ec4debc0040e1f9da0a038c5ddba99fd23a819dcc3f648377e5fec794946d0286634c1f6d6be4ae012a46629c687125396453a6cca0053db1f9c71d9e88b2feab49dd944ab5e3b5c064e82b51f5afe6daba66c82a74450836baf0bc75ea5847fed1e6f428abcfd7100459016c75f8a1d0d9167c2a6c54253454662560db2c273dc7ef93a6c3fc09729a550a5bcb38e836a83940e2d8a80f992bdd2714dcfbc92b97b1784c7a758eb843e6519359dd2618ed708677f5bef44b5b49fb27c0e62a3c7c8a70279e61c6799069fd705956900bf904c40532cf41506e9bbe5363053eb3d36995d5da3e61d51ce426697297ef7eaa99a877f769c3dd58718d7b876f3c6cd39a8875a8333d5e4c1cc6e9092ce37621cc6efd8779c440ef92313ee510b3f278ac0c6bdbc3b26512bdd170e6242b42123420f39044ad8d16a7856d6eb3da2d10ca83beed39322b58de772b1cb067ea6385c137879379978dc83bb22e333b781863af066ba8f100952264883a59cbe505c55d447484622e5d0d4b10a4d8914a48a9e83869601c061878e0912290c4d3daa30c36ebe947b0a765429fd9fa2783c340100db8d5653d6505eba5da0d84353dbd051769e8d1f500c79b94c0307828f96bc6b91caf224437a627d0d312a19a8746ff9fd26f140d908a7e0f1dfc2c2c8877d8ec56a71cecfafe8719e303d3f3032c3d2999d90073d8194e764f8e589fd908ba4706ce2eb20eed214403f5924c19767f410dbc28518d5d2a769bc65154a0e408113d5b393e8b25552502cddf6869eb5e444959da87f8053ff27788f08d363caef5ec803e03ed607fa6102a5d9714ba0e85f40ded38cf191e1020976c984478ecf9bbf7163e6aedbddafdfae05b41f89da616bd6461b8ee90f51112c5bd245b06135ec4b2869d75a7dd340a8e7292d7d4e8ddeafb4a06ac873a58bbebf53ab413cda3098bc7a12585079582fe8e709bba12e2e161c552ed504557657dc5d263b96d635494589567f28c8f27c09326eabdc9ade823ecaf9b9b36c5570fd8c0c52b703e1f348c89c2da85ec3bbe58ab3d8968a09ce0b84574fe12e902bbfca0f3c8164a8beec859fc98c6be009392ffbda6e472ad5a5a0abd0280da5c0a11e7ad7231daf4ce9d85aef423861e4515ad4806d0b67476b17d4c4be4929e3c58515b417518da2f55dca1a80d2fc0617b11dd6540d012351da1fd2c8e8a1232b0c35fcda94ea7956694330094ef8125a81eff3ecba73ca20fe419d63b4f7d0b814a6eb34ebe5ba5a8082441d804e4e431be6b3126d2363b512a903dc8c9df8857c868572b7a94b239a1b4bab318c22f01f93f14f351095e980f5c89b39b3f87434088f448647a6d131662ad86f73ad25194f064af7def5ae1fe6195cc1a3579e5d3ee8d7ce258f4156fee21b09c019806dad6565a5232f30fd9cbc2ce1b997f8120d5ae2ebadc8005d9ee8afad3198fdc9f62a53a9e275cae9d052988956e456e0249cda2151b2c80cab82d7d848559151a2b9da7b2c262f83475c563d96bf6099ebae1b41a9f49b6b29346e611f6aead35f90137b47c890c59843095a1b190e407b1cff7b99ae8556e55a4568b8ff9c38af998f9bba72129103a86f7a8eeb4dcba4630298ba0ac9139b408497825009f6416801748f62abd4f7e78694af2c78fa2b341291a80d493be8b324889060ca1ae0048d745d9ee115554e30fef1c3102846f7adbb4dc8368d1ca15f2809e911b598a1c663e2977a586a85d37aa90f940c8f54753a7522d32d1b1509db5d15410c9215dcbe2b62741fd53eb4b31dc5fadfb12dbed7531ba6f1a2d3c0996dad3d1f0ec8808604f2774e53a43abade45bab942f7f57ea2475e33d9208546b7a85313a54ffaa6440103a28c61dc386b16e45194cd243827c292cef028fa83a94ce6ba3634ee27087e34788d4e1b8e064fd2678822c36cb1192e92720c2e485c74bfaea8eab5ab6739cd0282530904241abddb6b10425afe7e03d58ca3bd91b54b0c8e1eda85d3c0af5b148776e5a0b3bd90c6c13ddd3f9c567f782ed159f71db476bdc8f3987ddb407d7fa19a5e536e84613431334fc4575a17e49b9ecd889b07c80a6c4f92c7077364dc842804599d92a039ed6dcbcb7eec598ff6ec23c9ffc7195aef446243ee17e7856cb22bb9916d6a8e158e421b972921a1ab08bf6f5c1fd4cf1a3469a4fc15c14d2b672543121584df798411dc68282108a1e841f1caf290357e71b9f9bb8dde5c0d3874cda00315c6fc0452fcc4dfeb7d33d185e4f183b2f5a94a833c42c061dda0b09d36a3475a2ff3fe31588e4f888d926b78bd5f2d9ec417c7f49c23f6390c0a1be82188091c9085df42c8cee99ba79934468f93ee1dbeb2ac0c89cc828d80bc366582b98d3431bec38237d43ff71a0c57f13c50f1aa820869b3f09d1e252cfe1d48fd51b4a1873f7e4af589151f0d3e202ef49182fe7860307f9104780f2e971c43f6a48ef5a78250138f8b02b98e6dbac950de5b14037a00e7e812e56c1b944425fa86966179cbf7dd0c69bf0ef2edfb8ef55c69674899071511f8e0fc0bb6e9a114aba1300e372bea918ae54de18d8f5fcd05ddb71c4406ea3ae16678f6a1e45483c7567ec6e494811b30e448f5b84ffb7d7ae098618e838a7c5c505494782a2c5db9f94c14ae61e1837595026664d586079ba793672e3f460b43d03eac46c8ec3b920b79f4d5d19d6d51fe9b75291b14b5992aa990e73b0fea3663e018673158cb4471d909813f7bde7c10aad310af3f401fd79d45898716fc1176defcfa47d9efe240051ace3d62fef687bc4122bf29255efd5516b006e71e3cf4dc8c504cfc84bf40cb0f4f1882090bd028232b99be0f953e50fa6b425beafea70f302c6120d3ccbaf140cb0ad721f56eb2c8df0b4e507bd8123ee52d29fa35a9cd16080a3a1f6498199137b781cd52a96984cc6520a967eccd78188a2e27a8eaa74909c8b4330f19445238413972a426f5ca723b7c1bb99a11054e6e8b396d844efee2c6eb9a5c00143b77205d09918ccef0f9c58cf6c98a4dad1c031987ebc0011ddfb7e8ec17851b78a1a01abec3698a5dadd0488b0f141cb0134e70abfba231fe50bc48ffeb2f981e1f81021767947734cfe638fd001d79c2993472dc64831955a71714f224d244c32b0c33c24c0617fa127a3a6ae0c5eaa14840e8a79b7e3e768de994fb0a053dd466f5302a714102fa81c0c1620ca9eeb6de1f81219604098d668cf1b47df140973158125efc0460bfd08948a582092d146162bfef1891e27797824805027f7e11c516c98a50b0dc2fb7e02a970169c34fe17b7eace0ace60e75726d1ebb1ce0696787ada2a2c7dae68900d07edf4acdd0a32b3cc4825099d59161fc61b642347c7a9bde020396aede6f1a5ed9ced58a79172fca85e2cd9a44b4de9d37e621dbc2764ad460a331743e1979ca2146d51c14c7bc57b64c6f808a761dc102e3227af442d254e18142970168202b10a205e46268621dbc0a8d10d4c8a0d17d51c113ae907c3f36c38cad432ae2f26a0b02c818aba044a36aaafd7406b429ee6703c604dcfd67e5b21ab451884a3a2fddbdc19f39540730b18cfcf4574668a3d78f875978411591193721c93ccaae556040eba7d7846d60a1016e5f0ec1d0856c2d8d10c4d35598bbc6af64521afc8491f973c643a40adad93b544b69c9d980e53a1da6655b8488557a958f6be1c8688dd12a848ee260fb31bc9170b63d610a172c6485e9a01ae69805174288ae5279ccfbd88c3795449443dfefebe3ca7e1860e704168cfd03c1c9de5f5e342c81502a26028225655c099e76db00a09e5a6d244804efabeb60deb1bd11107103567a4bfca732f4f0684707bacc42b46f043b4e0896d14ee18c56dc4d4cf29a7eeeb9be30ff6487c69c3229fc2b1c65f2c9f7836aa438b4b10363a670b9254a52e2dc15bc79f6da9c1b46a48adf3b49da720918f93583a84d37991baf76032850c59f86303033bec2f258c7df1ab2e2de06d9045f21db37d027d1c3a62332fa5a51728eee39e5af4ec741dc7f5f65e03e7ad99c008f358f19b3f8c1c95363acdb30ce8319875fcf7ccaf1d140a205ced3e6e2540bcc05efd4edec11ee12bacc86a0c262dd2260802aa02f81ca11093c098b78d780c95b0652f657de55b68998dafef55b86c5437d509bcb0288afad2f08bcccd9e4d3f906dbfae463e20aa733a2fbeb6e1dd1cc831e1e21af7943dc8d08558a0544b19638b64af2cb923ce1d7dd64331a62cc05d622219b0801d0ac6163093a1d106dc3d6d202fc5c7730976c6b9b9f6f6bf8d02f40d00a397fc96590e076d5e0f310793cc63f008df9e3a8b1210b4004cebc3ce42db85d7ec48c321299272ad77af9d54340bc61bbc15187ed580c4213270d7e7d817b11c4dd8af85d84db08c205c2a0e798e0d5162f15dfc53ac6920a1fe97745c40f68f27d14bda19eb19ec60efff4e9d64d18244d63078f6e58b4127a070493784f5b4ed56bc28e170079f1265419b5a1c8a47a04c4899d660c167e59584877a919c90875352bcf579b61421725993df5452f3ad2fea5dd07de709706e33a7d7188d7fca00ef90d3eca0012249517b38894c24d2fdfe9c4bd1b2dd6a1a1445c462285e1ed867c02065c30a90c2b0a12ee95c9f5e5213d7b0fc10557e9d67c135ec444aedc5b3f0e4f5417d8729eb9ba89d913d8d3f1a978ff22f7792135add1ed565ab63d791ab1868ae00a354f7a15d222c90b00cb471c63a1b1c88ff6165a19e655cd9651c5998f35ba4f86aa4e013263c3ffbfda7ecf30a39a776e476b6075631b1dcfd6a7fe4f95adf9a6569aac928c3787bd0299f097b14678f1e814a801f65ea842439dea52683d5c145053ed2f4ea140fdec6248bc90f0d4afafee254f55fd2bffc47aaa8391935cc6596244c776eef42dfef651d24c7f1caf1659c589263b14f6d029ab9c02dff96a35c910e27c8a9c485cc2aca8e50ab288ff120596cb50d9eaa3bd6a0a18c666727774ccabd89308971f6b62aba4894c10f12113c5a679729913ee6cd529ca5bac1f9967c6940159701238a62518a908a2538c8a379d75e2298f10e6622d271eee4156a0018aba04597a02162523d69dd29ce3f48ba770d75031980b8611f09f1bbc929a6f77055da6af85462e890cbe1fa319206fbad90c71b40269fe2138a37ca3b5b44952681ba65f893867ec50ef84f938fb7ae3697eea45611f865261143dacaa858718d49d0e80ffb61e53282aacc46ec27ce6f31f9660b7016f40cdf97d16921990d1c05a178dfbfa609925e168b77557df93d214ae731614d1238c25440e1c0d53bb5bb758e719658a96a4b26cb0616c21f20a990b35b57b02ccb113ff64ce67ffb8037213e1cf4851686c3e49c1b057ab386ab0d34f5eacc5401f8e7337614bf006a87499dd30309422f261af13b102509bb3bd72f9035ca0911f4150b7e82e69227d3d2207f185478eda4d01fcd6b35e868f92482bf04c675bfb52a6debd4e6503b3ef9c72a948ecc506e410172dfb76c1b63378e8974b22471473926b3e590b8f69a3421d6182323de1b306d9c7fd9ce14c8180e28945b8887775160d1912c0b628e46201c9028113e32f8003347c83ff9a722dda8bf0d8efcfe115ee2473bf64178772ce4e6ef3cf378840b609d48a3ebce97e0040afc76afd5c78bda869909c5b8c7adc8d5f0d06cb107c82d9e38106678c82baf2057ccf1277e4c512e01b827c1194173e26e04a6a21250f412d08bb9e61a9cbd86750fd9b5b4df168a3b37a5a246e53c57b44e1d14d59f7785ffd63d507b0f408e877b9518893b98a3a096c2f09fbbe3d00b99453a131418c3463b0ff2e500a820cad6a82b02fb9d574d69cef042170ec9d9259082c496f5a91eba4bd9dc17694319dd7a7ab30cd216ee332a2a4428c8a52f49f9b6b153c2acea4765c373e61d59210a53bd310f3a408fd92b3691638e57d2c64d31ec33a40dce89eb2c97be9fae09bc28afc5103147325c7159cbf4e1b78bd670bb5e9f1fe4651ef8817642fcccbeb88db673c92a6dc69b861360fb168ca83fa1474a737afe4867fd13fa6f4601a2f77c53c14b4d3f9159dd04de460ee9618a5579cfb390bde169dca761038c3012d0e48428cc93f32e1c8da3df033d4e19346f6100f306e235d761ae472b51aa6095dff40940907f6a9b713c8a590ad02866f81b619e0aaebbcefb5836ec396976f082bc1730b5dfde5154b0c1f13d13aa70e16ac52feb7e4a1e5018b1d9987555f80181c414756f26e77b1cb9bcfafcf23799069023bb2b79c35d27861112576607150fa52354981b2d908eebaeee4d4665bb3b02f4f1f5e8a02d11fb0b442418d4861614025abe42158de31b8838969d7c8c435565597a5b1c0193c90488a2471d88bdb9b228c5048a48482576014b5ebf9c11dc8ff11417d0b709fbde45e864a24d0bf06aa06227dcf455b67793ab57e879409b4b487c4ff78bb071d7dc9d8516aabcf8a259ec810afe262d637d166bdd8939e0acd198b04cf8901d2f7f9cec243829217b4e2e114fceda6fd821ecd92e676c438469f6cbc4d416bf905ba9cc820d547145202d6f08accbae089e3977804dc7778511ab5053a06e2d1d77727edf901581262aee6bf72738dadbfb21429caa6f73c3202327c5a6cc2c919a1c489f3149c1f23f4d2d783da7d6bf24eb3528024bc0f432077e368dc8300ddbecbac3bcab3d44845e6b64f4087b9b4d93def71a502140e1685b2e09b028fa6b17b20a55175479ba6420cacf070c7017f8a43afb811ca8dcd7d3e262ef9c94b1788c97102d5d14eb88828bc4b1956144514490b306e0096b71a37d9eff8736902e96da6212388b4443f725dc4fdb802b0d102cc9176af6b9b8e1f7ed644e8518a84439686aad674e50628a3b42281b08da30f2396b8779277a15c846ea3107c25da8b7f82067f08d277684a6d0f0a6a4cdb41af2bfa49a4c4a6998b167ae2da06ccc5fca296a764456c8a42e61f0ed9f535c3535650abee5812bb3fd426d1e14430d9c367b30eaaf1a8623c0d460da3772a523d2dad0b3a5e429d9841141bf390b810e9becbb305e6bdbcc7d1669ea51e1e53062f5ef843cd0ac53a11f045e83fedc4bcc7aff435f2d6202900fccfd560aaa5f96fee3e4194a7ec38978a5d52c1e5cc70e2074c242e1e66791fa55572dc18ee27561cf1644580f85664b6b2809c6fe83dd5da105f94b8d54734c2ad7d9758f08624d010530e37d6a6bba340089c7d1050340c7841a7f4a6f160d0eb85bd738845a868e127dd17176ab8f9f67f85e48b70299a18bf271480cbdc25d10a9787055f6497685b046184d76fac0875cad6e971d3ea41149ef327d9410e72cf51c7684d295c556dcbca31ec2f8d02489540eefa7cb760f1f81750d6da82a92d2f92a000c095ac51db43161c5d9890f37ffa9a8f6e45abf8759bfe0dc7e954214aa76e29f8632da35a869038018011036b2db1e0b14ad9bd151f72c8058fa6ac2f1e291c9558421df1e4578c16d4b498158f0f78460932235124a0c815fe28999a99d13efb3e8c3ad42f593f58518ae1b60757cbf24c2b01fb75a47456d18ac98f2d5d519afe20b1072d820ebd131c45aae24d466efde1f985188a4212d1f0f71dbdf6f729b0c8551a50768948dede77d0078203a45a2661fd748fc6160e331008907d8208e994e00d6ced2939dce35ede557413de5960184aa1081ca345e69272b6823e4e9e031d3eaf00dbf4470910404af020117377552ea82f8230f554ce68cda5be4a7d7d07422784c2512c7c6fb9b8f9395559e1b14073b20d2ace9caabca7efe883119dbcb655a11cb7a6f07d7b58f0f827b875a02f7d24fc620aae547c1b3dbfc775e2350c3847c2d40a9bfbdec11e0665da8ee6cfda1f942c9cb6115b3c2e224b224ae31b3b1b8e625ec255c6bb5b2e91c4112223a6cfbe2c0c317b8bd7cdd5f610dff3c5593877b12df029a68469a955a221f973902d4388b4441691194e577bebf278b6bbc2f9116fc519b01e78139a5b60b31c39141144425972dc4595be9a545eb5b6607d1312a179b7d0d8479b213d63aaaa6d3077b4b9d278eeb6f3f1f3c184cfb00f5ed8ddd718286b46e7458ae8ddd4fd82614946a20832565865420fe71f31c8a8023afe4b45a1dc064d9fc1b405076034f109f991c820c1d0763811bc02237f5d16be74ade0831f4c84789475db45506f377d4c512cc6976ef24cbbbe768652582a32b868e9d1988699d7b55e2a12b0ffefbb771fe26dc008ed41687ae90428ca666451f2d59cef8fb761c9823618582a34419132700513f8013b3efd135d43812025dbc77e79483ebe5a6e12c1f6289b92a0423c7436a0625a8283adc59ddb24aec27cd07d5553c6f116785048f5ea0df4a50ab5f081a40c1fb22ef84e0b32a835080e5cc15e5ac41260936471a33a0909a1189f389bccf1a4cc81e056bc23f485e02f1955775dfa4f00e8e60f992d5bd3065bc22179ef5b314199d691287faade3518a8586c7e01de6cf329609ed855e431776f86e6ecf44f7ef11f3a5997df0a1772c3226ba640dd6aba1f2558939067e5a9da09dabd4a7152a9bec03273682b1d3a3abfaf82cede2faa86701410da39e330c7377ae001eb52cad383b7cfe620324f63a006731d768d39a67cdb73b7c74fbfc2c12ce412093fae9cd3402f40b7cf991ff5baa36d84769740da1dbf46f9ab065b50ead450b187a33a0b9cf417f9d525d53155afc5b8fd6656ae79682c106a6dbffd2639cff54024121df3cad272b3649370a82d8f55f882cc30f1e97a7068859743d4e34f6747ccae2479153dcef34b4749b9a1865818ac322127ed70c124a3b85662be1e74262f03223c7a7e490b9d7323cb9d78f71ed4d5a70ac255607750d8e66c2e4c294c1e2a0e4e35878a0708a6b614c9b82c1d6b5d1f7033c8e5bcbb521044a21aa03476b958b687c3816417cddfe38d23a2b89988b0f3f2910ba3aec2684a5c92bb34fb504a906b5baacb1bde2aee4a0a4f5548a0f3139a1e61bdfd915745bb70cf7d8db27edd500ab2429500b3e850541d66fbb0ea37b9da380701ba2f768b79b8ea8991375b3d2c46b64df3151e41bc3a524ed90926a27030ae51a881875cf503df891805ca00e0f4c8ce4fccfd4c0d5988cb6c284efbe6321d66ba313c414700f0325bf30ca5d703617ae8889a79a41d60f4a32fba1e75457cb4baede347f3d116782f64726091fb8d116e1e0fbfeb198121eac0a9f6eb6c519a1ef496172854a52563d4f3c62e7313734188baaf0385868f7fdd7fd8d8fde3b5f6aca47f57026251d66d6686d294a1b7b3171032bd8ad4102e00968026bcf9e489e8d64a083014a064016dad249bb7cb90c36a850cd7b31fd5c9ec1d39e0fe489b0617126e17e1ea6e143938d946320fc839fb846ea7f7b11babaef2243529fa0809f1dc43827a93e41fd78145a451e16b25015ab369556f3495b5b78c27027de6213da00d9ac467252dc0e4f57424c075f21e3749958669e1428e7f0d6b67f084b79b76de2f8dc540125fe8c8f3259a3042e5822cc33ad719fd98642d746133c5b07cfdfde0fb9642798ba13dd7a88aeaf19c0e6e23c6baa4052f49ac903b3eb35cb6025ada1af18b3df6b2956d27ddc12340cdfb90e4f5ac7c3ac4492152273d4ee68c8aafa900165270a0ca128e26eb420a76dfd70ff985e90b71fc4b0a504b875bb608f07f1b3998395916371677ac0f1fcf0075aaaa4fd8d2ed2f9aef4264577b233b22494ed2f3b54cb7e599dd5cf7b44d3f994d736d298f8bc11242959ccee60316d9aeb10e75537cfb8db1dacac52de02bd9c7f518483fba9d196ae5ba0df33abd3baa0510b298c6fb797697bc21c13a07a40f05b91cce9fcafe25867558a5ce0a2f4757a8de24d0338e9306087e674c4cf91febfdd1eea07b9749e0c40914ee3b42c1871b3864cbf9f357c2b97fff21d1bff6fdea0fd3c116f68e7c0373bcf42f1d0792ca78d4cc4737b9609cc55daa3cf2aaf0c136732d625594302ed96c38595fc3da43036736942b6ed3b828448083707a569ab6945c7ca2746a9e0acaf4887e91f19b35310283d15eb6ee5eab5ee75b51da04ad0423c159363a4e49a90fed03e43463862147bd2415a82c09ac7cc76c3c8082c3061d9dd3acab406eac471fbfb3804345da8640c378f46eff9a4581cb6424754086c0aadee898b4dadc03755dc878ca0c5de81965087460dce41509b50e1ca1a2f33b2a206582c2cdf5f3d06a0a80f7594e6c3b78a232f2247a11662c36112e342e3cec3712e79d858a06b7caf683fd5226ecfbee40e08eb875fa1a810828e8d5b6c843165da4e01477c6034269eb5f5a3462489f746585efe50f784195e17ffdd9c524887b9550f4ee68177ec97846c9ff9ae0d5b15115e39e95e075e66ae7f730fa024436606c048e81ff80ea686e3560e480443c5264583b16fcaf632faf45bf86309461022820fc79003a3e4e250d8ba3aa3bdce660fcfb03edcb58bb62ba5eeb145d6dcfa98348e2fe1db89450c0c6ae68ea8d3844ec34111a9cbf05f83cb342f778c1baba9305e0433fb16e6fb36dbf753172176033c1d1f8dbd35e700f4f4036072df4146ab7ea4ec04e8b0fa6b8ffba994eafa974321379efce8558db9da21ef0e8a183bb5cc702ae78617f0ef341ce3f22c1c834e8207a4596be57bc6b4b2a11b32c802267ed83ba213913e43a1e03708d1a80db0ba5b75a8c101019e5166905dd9ee3f258d9157c9f78ffe563a5ea375792105b1ac4c809e40dcca4f922a78087a85e3807830a88d9b40f8185124a477d98f545978b174051ddf33dd3487ac584b65cd429872871e805982e98ad8e177503df36948902000f34bb1fc39940e9323261be099fa1e4b29bd5da458158e35a7c97a40012b9da29db6966036b01c525d0a620f4f4f5bb0ce87c2de6fd1305f924c8a0fbee20afeffc01b226049e56e6fe1ad307575e8c586708f3986b3ade407d26756c14d899dd43fd361e209dd8f88336688b69782ef04fd00f14f45747961a84a74594d957f7ea703c3682820971a51e8a2d79271deb8e7ab8e9ab5ab263d19369407a94490cc0d0fd6bcf398a6e0e3853e54a4ff1f99400db80dcf95d0a7f0a579e96f5d0457c149acde0fc354613fcb4b4a0e23013a90b3e0609bce9f983d71410b43208430ce64092465ff942e3343e42d085056495b86ad6d799f828dba44cc267044020c973292ec88683b37d0e7c1e6079c8bf1ae649964e6fd5c4997f7b0bd76cf39f4de85166033b50faf65f6d26f92d78f73b2be7ffaa7bcce141d6c06f430b3b2ac572700dcb15e6525d59cff1840b70f02588f5eb45340f6f3ff78d076239e91d0e9d7fac049745cf6c9b106e8a4d01234ea9d24651264a0025fbf947f426f203154a6b4b7c3a31a55794dc8e8f203a624959d85863992fd728f18929a1d5d18c63b5518965f9671871e9d678b20eae902256556a552a2103b0941f2b02765a9ad025c00dff56be8b6c00280d6c78f58dbb2c171ceb22a35324058da5849cf45dff8bdd37bcf6650757527bf4c905b16492eff40ac7936ff8becb24f51f2d23f2d991acb5a799e2123c9662613a0f6afc930ab76a7ffc797e84a2d79ff0720e297a4f01b6196fe575194d9685308de7792ec2bf4440e38509811b28d919ea07e81e8971262a466724af647e0583c70994b9bfe39cb73aa7198633d939d56d6a7ccbc4a285a648a3077ba610df00f5da617e26ae369de9270be8829ec98222e6467729c17403129f22db435bc16417f5866f0fcda8bfb240ebd1cf090ebb0f53ac7457a00f518b5468a1c76fd0897d3a09f2741178ceeaeb20b79e552e8a2a2707fc4eafa9432d9fc983db0729922eb89cc520d31f79f7149a4b0ac7310a7c3719b6cfa757f4312a9c1c0d2245ddb07353e19356288fa73ef3752aaddcc184448ce5d72936a1987a02ce28c98347a0169fc894e6194d682dc3fe5e31435a1b72da57d38ff195d053d33f2a8d400dd3c0ba31f94f5c6903fcf16c5ecf5340098651df2fea8abfa652fc32e36197ab9a10489adb09d7d656edcf5cd764d091662a8c946b9432f38286a91188ff257f91fa455cbf2903feb217a6292d9c52b48d5d2318c7a8227874cad1caa65a59998e5ba05f7a64e9fb5292d0e3cc573fe98df6d751e3747997dee705250ad029f5c23ce30f98f33455f411a0b88069f085850c341682025cb5e37560165bbb64bd1716067083272807b3afb1dfe109114c62fd8998ba96092fcc88bb71caa9af471375b08a53027df553d80a94ec12baf8fc1d4c538c6ecd6c29eaef4d142159204346549b7a8ce3967deb60f87e98edb776b02ae9c83298b99a46046d2a15ac794b3c33d759269638ec541e3b7a327ba7d2530f9e0dc8db29d5c9461d2c9c98b1d30605a25885176e1a49d4ccc4db0fe2e5af1f2ae82542a149bec659246b1e4b3f021cd6ef90a40b7e1a43f44a4315007997390fd944d7e0febc89bfb6a7d15d7a4107a043cb8ab33cceec2e36a9d7c8435a6bcc574df0d0f6a951c142bc12b6860bf7d0a783503233913b0e36b4d71c3be7aa099047f1206b4b9166479768972048df9a538e0e543bfa8a608f6904398d0f306a12a922594a5163fe578c0c00ff07d52a3171c753823bcd1dc0d3ab035d3105ac459887ebac7f65c311435f0ea0320cc8d8340eb1b353dd45bfc7114b1aa739def5389c10b41113c0bae6aad28d54c96a1318adce2393a6038f39384c75d641ce044ab6ac168539943d4a89c7ecd11af92dccc0a246e4f111a28fa3b0cde9236be458c828d4bd3ef47d6533a2c582333246a9f295488882563fd02c8fa5a8d8e6ddd263b1abf329d93e50475cba1d5d61dc2298f01b1902cfa1c813252a155f543d3d4e2c81a5c91d57fe3a0da6ce0b99ad1ecb723e88e6c19fe5892fc462542446671c46f0a439e704f35b61a807e1f000772325331848d0578c69c4dec3906a75f50e751c704c2a56bb883971730308bb8d5e6f46305da67c0bb1f70d4f9bbfe0cad0666030c9cc2ee99ce8934f159fbc89cfe265f83434c27826b5067b67daac97456bc31c15f2245a238fa86089d62fee73da4c1d7e33c11828cc4e63d4e1efa539d84663b030729a897c3504d81e88bf10741ee354ace9634c27dc6660ff94e1db86e1b650595dfc2fe17d4c5755443f9a459c5289f4c586231beb1aa36530d0dcca2e0296d8119d49baba189e65d58908367f37a7e7dfa8c785eb327eac3562e9011de6c8c3ac1da9a65400cae72688ba461e71a5e2787448511bb653c64b11ac3e3bbfbb77f4ee391c3995cc6f8ccbb7fdac6364c13d124843ffac0fa5b9ea1a6291399c8e391571dadd28e9798c5b7eec011d9361da1848716b1b6b4c8006867ee30767675f7bed780e3be1c9665f7dc1d5a0ddf322c8858e2c356ac4857b6782849ea9dd06f79046166d54652f019ac08b101df1f725c2512c5ec2be3fbaad4a3ce486edb084437d82a960c1b1d44b0644153808c59bfb9597a9569820dd093ee8f5622c04650498ed61321e27996d02f34e50876888764682d08081446f0434e9e6146cf7bd58b005d22f4e45dd8d2fbae727197938750df889f2e4a921551da8490db1ad39b29fdf447f75dfd2d3057480f9f224f0eecc9d234345823ed797b7c968c4974027f7a77d541cefeaf15e47e579d1480f054176849717de063b7b6e39cd86ac04658f41591a532de7ed170bf9875308ce07b9c167b902f478037bfe675b8a5d0123cd50f73ffe921b83debfc0f41f09e04151dc7ab1535e2fff32ec2cf4e654f615cb51d1e722ea50f12ab24a009cc84190f0971695883a7248939aa5be4aa809c9e74e0a37eac83ab04ae86c201357534f863acf41195bea620a6ee5a1658ba2d4910c536cd26ec1f615b7362688707ace9ba249fa8d7a76d5c4829aa5b213fa93bd213228b38db9724422f50fa21ede5ea823c96c0347bfd27bce9b6134eed15b75b8d10cbf333140c23afc552ae9f59ce7117a36e3c61c31c3824fb491823a3f59fd87450453bf0cfe4e7f6bddc4dd9413f9dec5f39e1c0aa4631b348dd8445f533e95965dab2cf250058aa41a819103180a00b4f2a6038418f3099a071f482df314ede9c8488cf8cf0a88c81c7c44f87ad68cc4d844f9fd1f5fe476b0c262005115eefbb0c029497116cff6767a3ab41233371e3aabdf58092fa90c70f241fd5f5c7692319efb77e1feb76dcf8c9c295cd2287c01144fd7d4e3309e824893574ab739737acf548114f85dcc9c44fbd244faf076742c7a34c5d219140ae149d0a78fe50ce0ce8ce94f35027c9cd55da68e9931d7108a1974330da51731919355448b82345048af17e1d42677ef6fbeeca9094689efb330088384e0f763949bc79af5a5b498b339e7e540c81784708ac48c23339e7e8750862219034c726134bce3927e85928005882c5464de08ee1dc14f6231fa2c4a8c18b671b0f9bdfbbe6410fd94eb85ee5db46f39fe17cbffa25c3ab1837e331f5a906a3d633f28881c420ba43a0c9e589244a025666a065ac5476d0667d3a22ba118fd40bac93e1ee3678b919c0f673a3aa2d83637f2727437e7c41adfdd829efa23850c9d87783950497bedd72e075ace818943ec136c10247cc81ebc8d9e4a974964cba3c96dc59addf95b340aef693a01a5216106fb9c0c66dcfba581dcad9cef8e7dfe6bfcec25c422e11ccacb1c803be37536c1d5958db580df092aa3929b372fce2dcdd4ed36d5809e37c906755187eda0babe822086f9a3708352a900bf36075c59a38b2fbf037ac722ba3bc3f21978c6a96828f6f9fdc54cd5a23954ed0172470f68cb7898c3f1e5658ceaa37b97802a7f1f11b3058b31196fd701ca0a6407515acd863dc04a8b513c41b6bed5dd20d4111cfda7b060b4341771a70f7eb63cf9e50200191b289e70456cbc65146c9b37c74d9b1419590acd0c02cd33301fbe372a0295fac06f9aac13a101155892a00e105a13190df079b035d50f328e8e647ed299c6a18dcd3cda4c2a32834a009846cd2d053f16bc959ded9c080f401c2591288ba3d182cf00850556a1507d8a6f5e788bc085fe15063f425d803af138433e1cac2c209d7a9f32620246d187a11df7845ca640a5ed2bab58aa42e1c9601e4d92f31bf74633bf27fe547861956a60a8bcd3f7902725ed09a261c45afde8aa75b44b49d73f4e9001575103a8a1ffab05fe7464702e11316b353d674d806186d41b5a880064ea11358521d2b6db53187a930757c1d6faee9efd7a636d96244b95213708cd66f83f46b1db1c5ddd54bd93eae2e19903ea458b95bd83c6b7b5c98637e7898073d298e9d2f8ace24d29efea67614130c8d2291f20e283d64e6e6b61dca3a194418160db584c7e363876c3b4766d83a2f44d83d419afd9570ae9aa6370132e0cc2ff23482de7c5f21a8e6985e1836b30a9159871e68dbe26b6b17a60392b69268b80d147553776fe4d88e6f9150ea50b0c1f37052d5337cfd5153bc4c33ebd9a138912483bcf1fdfb93c5d3b9275e36008496c51b263c24dad45d8b377484b7956c89b09aa50468199e92044b50bd6767c1b127c060570f4366150ad87b5ba0dcbfec3a77fe3ca2205fb984f4f1b1666e34315301cd4d70bd52c81162680957496bb94e00868108c3710969ce0cf432de5a5e3a0a7073b24444670e05504dbf87eb640f12b3e350943af6c318fb3ccb1d5b27b89b288c0b4095bd1f444477bd67224bc4afc8ce4062705b03391b7b33785c2e6a9b504e22196204d76098aceeb85c29989c7ab024deb73d3dc3b10faa2f77a56e0e967bc216f5fdc43d9c0dbce8e00f066be4a26e50e267a27c746c572d0852f74fdf0ac8d701e1ca713b8bc5af8a0e0edd990cfd2d8f125dd88323a99024daece96f4b2842b01ceb7b39c88c00ef41b45c2e5d863fc44fa6be122be97f4222e84c3a6fe45afa8c1d7562338c290d4c0cdd68374c76c58adc62181e46801440649a359c3919e3000fad1e5bd6624be4391c71e36e9be97736e8779909f9f2d92e14574298b1379de923e8233654647e48f85de139b09db4e42070dbf798442d2b47bf4b8fb42f7b74bde9186427783913b50fe74079197a52cc6463a4a0c7ca40662d8631f33ad35b243d0db9d6e9cdfddad63315852f394b9bfa9961122ce5893d90b23c00daced31bf7b705d1d8e22070eaad0a4ec77d639831a1f4541f0c434f92301921ea43c33ecd0d9a748e6c4447ea4a670d708f87b325855ebeba02a65162f465c5cd636edf86b1fae92f3c8afc32d54cd34d098e89164ed46b4d61bca72931c898be8a1080856e086cc6aa9608683f72087f6313d8700a5ad6884f317e2302a6fc37010337610eea9661a32e0e939807a3459bc7a8920c9b53e20ea9b4a85caacf019130d372fbfea0d9106958bd6fbe46e27ce59bb03033f1043a718314e4b5df2178d685f1bd29e28b3c29f4892b60ac5da06f5f0e00ff2b1548b021d3f2ae5f9e0ac390daf78cd34eff5b47e1c9406a779dfe3897006923409a21c36bcfc43b08358138df0423a8b00b16a73edc577766fe23d25ebbcc2055c39042534e1853e36e5378a857b006f123c13185bdd60f6ce0bfd186c9a0628b3ef78df82d60ee4eef4a7e4e093a5a8efd8474ff35e5f8ac17e5ae029cd9954b72cda4998ab60175aa62cb230011e7dee2c53f21e340d7d3f9e13066aa001868027bd104fc204c009746ef03215356b61cbf835d4b240ab34c2317d7c83f45521ccb0853009f7908b6ce8e66ef9b1ef89525c6e286c2197dfbff5eb9ce5565b181a6ec8e62efaff835ec66ce1de8d2bf015f7879555fa3ea315adcb2ecbe81ecf43b4a2c1b21dd245b651318103c2c52f156f0f6f7c333f7332082f16b68196097e416bf5128e55299aad87fd99fb5d621a00c61a43173813df1273f193a26d296078c0fe84b58b02958fe8b514a440bb702d7ece86b5de5c488e428396820115dfd81a66c2e19d0b98f0bc4fa17dd57e42157052372a7c48dc2d004ee688435daa2a44fa7700adb089cf884e28530f8a79d72311b84856dd47f155458193af087bf2331545ddaae678277e24c1fc585c8f9e4561f08546f9d6132b0ebadb533f887244c7a6e9a7868a84c072ad99a76d72546ed8c7ead1f13d7877a18cf36c9bd37bb833759a4d22fd7cad947262c847422bfa1dae8064d4dfc4c8edc38ecb1252c4c43c8f0fb3b4c7ee8a285d883a5f113217cb824111065ef60952f409e3d4f48c53b9077cbb15523d225bd4dc8633c776679747481ad37a60da57ef9f308cc451d162eda838f4d005bae6df5bf07bf3ee931298152177db6035014c7859cb3ea1a4916cb505c22e1e6d925801f30e0361d287632a2fc3d2965a618fb852c451a284830819a305f9973d9d7fba890026d17c3cd22a63be1344b1f09e2646036e143acb776a60b359d9f7fb01421a41e69c7336393308ad995a55610b76023e70771621820a6bf5b2a67f2a2a3cdee9fa56a44662a7c5e55aeba1e708cb11084085755cafb895adb69fbb0692e02a7cffa34e58d94979234780923d3761275745c5168111fe79946b9d6056722d1127ca98c8298ec824683041aafd0264f784d0040ec4e3cf414af6364759aed58d1973a14ddcf645ac4f582f4366dd5a4329e06ce53865643041962168c478eaced85a038346baaec0d90f9e5a1bac040cb9b347548d364e40797cd4c79bcb8479d7df1b25efdcf3d5db4eed55229e2296b119f5f9ed566c0bed00644dc13a73e7c196283055e116ca600bb268b38971792cc5e12c1d7c694cc915acbeb6646ddd480d99db790b3c5ea3c7ef1cd02e5d651339ddef0b85504249ed496fb135993f0a32534971602f8dab328061c53ce46c37b8c57d0624368eba5b0ef03dbb2892f92adde877e1866e2a925d545508265fd7206d0cc06c77df0cf2be516fdaca2c75112c1225d7c497e43e8fbacb5e5fa8d95ea0444da88b48e0736e74a11df7834ba636f78d5042e83eaee0f57986c137cfbc913b45bf98a48871da198c0f6fa3905b848cdb9cb6f76889739a985eab6b2f7c4b7e4a3f03c3a8f510fb28aa36f99fe1f829a6f5bf1fa20e50a85c6199aa1de82109c1883889c45f1a655132206046fa0ee7a88b6e7112c3a8c94052e45ed78ab474a195a87889069d572ca7bdfb6d4343c296e246e4d2ff79e4ae9f45da0ad9860b85702eb27da824ad154145e057584fe02a0616dfaf6381b8474be30c8849e5b154c04d48f1d5b4b005e10581e776599f26de95173c41885710099df0f3436652d8291e087c8a18b6cb10edf1acb36cead113c078492c43bbc3e6846f5b7ef4dd3c7d5539883a8f0401323dcde0c7d5649035856e8256562677d6e958e187bd4e49ed692542c62c9082a6c817524c72f99fd05c031555878b4464e837806c0e2187eb38a254a1e04d14d5207f756f42a8f3daa02e2407555496def12fd6e50204f67c6ed4c409df3de002389f047a5650024130cc8c191ebfaf5929d38b2dded686dbe35022a3cb43cedeba6de755e8af2bf14c6a0f01327ebeec5d30b0eb6139ee158fe443cc792f02102c4d65b8b6190fc3a8a2c2455b453e60a3af78c7a08b05f551a1253946b479ca1f6174e0d9d969fb616c816938f99738272593e7aecfff1d981652698136ba58158322c1a0c5ba5c316f352bcd8d09e4b364c1be2495405520be9791b20a322924a73b87bbd1343dd662645826a86cea6ca7be05190f38b84ff82e4d82f70767a4d33b98d19311b18ef59b34f80e8dc6767bdaa37d0bee5dce4f4caa2a49c65695dda795b06a6338b62bfd1aa6713446cf590ec25087098444ff18db3ec824c81eddb45f8ba8bf20ce98d58324126a12c04abf06a060fae1dc15395e4c3dbe0a35430b2f2f6a37efbf6f1aaf562ad4bdbd9288232837be068c9ba0a4d5f31f29ddd7c8f8beba18358198fa27f40ad13e04c537c3cf7c587803170d09ab1442ebd0c1890742a39442f55ccd11c366974493deb83c79fb77ebb62ddcb3b1234f5704979b6d47d566bf9813e76a233e00d5c21485bb36c7179938a66e45dd8905b025d179219afe3e52086bc4e18659402713c1528ad7d62db100a09023a77256812c2eec676c41a7018c2e6e4bb80cd0de13d4565d43907d7f01d984b971f386a9e26195989d9bb51a61cff05aadd2ff924a99dd266d1ab580303aa265bfd45bfb4961afcd19d1107cdd2fca1a13561d21d40828f18c81e4a2d34a67e456fa6b1572603106fc13783519317550a3ae9b5e05d06077873f7c994ccc1adda8c5c982a30d83e7140fc22d1f8d3d8de34864dac08f20fbad5147c06e8aac68ded779b964268583d30e6e4184c0d5336a36426ebe022308eb28ebac54aad39f4980cf41aed7f2f2e2e67f0801c2283766d88c8fd89e734a230e3a22c000661dbabd3ac46475f852198ddf73322d4882067d79aa942dda4e975cd43bc7a911c0e5a95200e50d5fcc54b8f1086c16c444d42f8363d2e152829522e806f8b432306f625eb61c058520f049c44c49ba73505307ec29cf366cb7c3b1251f308847a57e6f26c81cf04917de7ea68e854af5f8b65244d9cf4294010cc196f660c9422c903910626daa89e54455c3b538edd7003229b09d6f35ad5eb6d88121f14694ce6a58d600839afae788a4ff38cddf9ac2016bcc7188f3de717c6ea2e6a1b1276f03949593c8158418d3e8129f1931184316979160333fa9c50affb10a4946fcf5350e44a201c60388406e1339fb2f65881ff586d001285dadcd97f42f1426f4bb18b42c9a6695bcaaf9ede7ee7e3646e06ddc551573223e5b10c92e54f959e5c7d4ac64663b0cc7dcd464e3a97be056aba79639308f9a67d1f89a68c9eb67b509f0e41ac49b28206a7ed6ac2a2bc67bbd44c61e9637e46d0f9848ffbcca522fa05750d0e9c44a9aec81f048396be3f3df00a7229bcfaf7fce6abb6d57e26447af3eb57e1c8b404987a6c3d26ef27f4d4240ffda3bdd653b666b2c05315cc7832e93a07a0dd9a06efea426c6f8775b1c044c05b04a04885e0c6821b44b5bf0a4260ec1b645c56c5c84d28e3439208173a0854b0baf1728135889c95f3cee6e1b087b05d04dcc098ff96fcddfb968e04cfddb4a9ec33ed49741b78fa97d6c4ff95e8ea1872b1d388eb7ec2a82505d2dac233c2eec9179c3bccbc7d4d89351645c5129a28adde1292f9c0c7ce074e6ac5751a5cb0a449d294f71a256afaab3c28fdbc497613d105b3e55e6b7c160a4e88fc631985a591b7d5fc0675db833e504199917429ed2595db22508c24ae109e85d8822cde5aabbb0e1247013dc45b6aebc87cf119a1fa0c494b86d1e05d5bc647ee084abba536a03318e8d1df1663573e7d611ab026e6f4eec22eb809699704f27a5db6904ce56228c9bf2c24b1ede3835b75bdd79987fa43251e0c04e9377105ccb9791030ae6ec1b20cb183659c4330ecf7e52db970bdad9fdedd77917ade7ed8313a93f14b212e7c8248e95647f0b96b0a9918e51b4241ff6070304470bb6244751dfee2bacde56271baf1065e835388c7314f8137494149b7693f1733db6d86c7179766fa04f02df5133d94eee7a186620af37ad8f5c244d865c43f42363348095d34c4b4a3ee1a3248acf0e38f7e67bb37a78c587d32d70fa2c74fae691602fb0e31a03a7ef3b1838b842e623f536eccd1df900bc106676a439e7dbb1ff3e5e7083ec556046fb69f80c29a76be8801dd03c862ad06b695ac6b93febe9dc78e128940218c16271e180b95393b0791816f9cb433caecb3c18099c2de05690cf7bab907791e25a476e138e041465285dc1fc4fbdb812704d77a91a413bb05c02dd2caa90812de4200475076be300dc9cebaa7e656ad18b9668b977e7b7f8607934a163deb663f19b6a5470a1f2205bd73df1721c11fa6d47fd231873eb651515f2511a57bab8140c5d3f4408adfb52c26843850c7533befc580ee09087f4e6ecc6df6ccce13418e63af4077e8695c29fda9149cfcb0dbb15bc5da8f6579126dc12e4b33f4aef49230ddac68b0c9211b93529aafb94dbc06095fa3f92eaacb7456de1835ed1935a86c2f26d5d8c73d64e60426cfb087d4314943e2d13d806f1f6b4a0b1c0102dfd92b50a5ca3278bedf0c2cb93f42a0ffdc153095cfa261bbe9cf549554246066c9887b4842ac0a5f111ff47476ba91eee289a9bf83f82a96c9e9ff706d022c865ed03d7285d7225b2ef49c0b93e6319ea54277eea530808ca9ee4c212eb29a13eb9b1140b403781e189355d12e11007bb4d977b153d24533263de5a3350581cea4d48f4322e8692f58222f4fd27fab080017525750127b11a1c1fc1d20400ffcaad487dc27cea2e6be4b77c133205208d5c9afeef05a1a5ad4a2b172178f6acd0bf858173874ecc70f6785fa9fdf9a1c025eb366df4c72d0840661736fb0ac9f0c567f85bc2f2ab92e0eb87e4171072bf03e47a45708694099c0150d35c02aa4853a82600e1bf710414c31e5548e3950dea021f1552b7171f1f26ab93c80a883e3d611afc31925a0e1007eed49f9fbe5a88086d9d06b79cd55f2617394ea3f895b3f03891178967dd8fdd26417c13572096277f133e2cf5b992ac0676a19591db896e9e818c9cd3eda044c022da5b2db11efb170fa34804c7995a71b25669b08c8e4ae247e81c575f9017bc56bfbea0ec65f6c2076442f664460a8b2a4a86a9c92b25a8771f09526690ac37010e3ee126a96f7a6b4efa4de39119be377dabefeaf795454e121deeb7cf978655a92f0861d8569d935077629a834ba42ae516a0dd5be1648fb8247d2c5cf1b9b421eeee3a0dbcf716d6f253b4640f07e1aaf9a8519c6b2b914267819d532bce46458c68182bd88c46a7569991f69aba03d4c8930e3930612434022becd55638b6bf75082796d479370d5947c098e27437f66b3709f1e43230b3a2d42a94f79b7252c3ec733c3247868df068dcc5e875d82022c0cfa32bebfb6b1c803a3683431b83956ec34695f99f1a0c7c86f6d754e39c599f8f8dc113843c43c205fb4a6f409bf613f83fbe932c521253ff1ce14304596451a6894df8249f7e2c03b742d29545cfe3f9b2b40b9c1445534462e020ad92f20ee0c5ff36311d92557b55688d8489d940237884a4d2972d0849a489d9246b82fc5edfda3c97c62f31cbe915765405cd8104ebe446817c416b6f325f7b972d159d0ced25fc544a2a578488bd692a1c0469fdce5ed6d4d8acc4e301a8792a18420c71dfd062fa6d81d5a6323293e950720b77a362534038de28bd6a3ae76c1843575d0cd9932484769cfb309b4ef695e60bce551c09c82a43b6e11c7e564676de8cc3e96c3cb042f022d49bccb7ecc73ec7bda7fbae1d193293277d158eb8d39a7750f21bbf0b06336e424d2f8565b6844189c0391d37beeac341bdb4c659e4ce3b2c75258138c2f60031cd577077dfb1faa7ad4067d77dfbb2667411b1fe3e9a9d8002e4ad851e5482328d4f3890c9b95c47744abd5d8be9c0da2243bae726317cc18eaddea04c8c28c7f790b8eb016992101deb90506551d4969e8638a62d80a00fc7e41d77f9e398e2a9439127c431f95beedaf45dd193f70115605db48b20422ffeb1f42738d0e1004eb42300b40e085e0b6f8d2c1fc06ceabba0d7c05d971b5c0cd77ab93b9ab77f47a883628d4d8a81639deda07c5a71c4760efb60f540d26caeff1d1f3032d06a250ecab34aa8712cff139c02f4c4ccd54a20f08959d911efe65fc4e868dd30cfaf7d2f659c964ecdc5fb9c934b1f454c415839891aed8115e02199758504633140cdc3d79f8736caa1a56c5ad0fdb59b1229aa5e296aaf1f1e459c8fde12db6e20842b7bf77b8f9d5256bc474304c2f725f343e751c339c11c3504b7b4bf40cc0a2309217a495bd287e64e6020934486ba513bd4705f05673406020aa4615a5710382a6b3a0036bc32af29a65115767cea9f0f25b6f7e59b720845398b65c7afae3788a490a60d6cb6bb1970da2be8788fe4b4b7a5e5ebb4333dc62c09198c3e16f1766647639bd8aec7b7432cd67aa991bdb794524a19c305d1054505489471d2cff203ac9c18bffc2648cc4d115b53ec1d316b04ef4a0a62bd291eb884e400a1bd36a90de2efc71565a606cb0aa98caed9e26b82ebcac63f2151c486e0ac6270c2f42003eaf0c0a8913af3caf9f5d01ce921e16a23cb3ba8ab7e961f704d41ab6505e13ba3021ea5109a4e0f73e510bb42483a8ba162ac807a43050fbc3558a9193353b5576e5705103927d25465311da3d5830aacacc29df4aa077aa51383673f5f0b784d3c2d71067641da0b82c94e8ace0d38db3d01078a287a5231577cf97181236ef4865e16962c5d588823ca5bd3265d82054d7a64d3023442f4007f53749882051512faecd02e3eac14857ad17e271882b70312d449f88345248d1934ca516ab50b020a14b4cace59553112050d3a25c652d0cb123733d40b132557c65e390606a651628840d1887957841a2cb40d4d83d4976e41b5445aee0d10b9375dd00c94b31253c59698374f62aa18e304ab020b2b8a340579f5f0be64a566c6342111451f9a26de125bfaf9419393105fa102db9d698ab2d393cb3922ac623f20ae50bdb2d06c3e9ccb2209ecf7b342cc0f0a04149f9415349579c5e85161b503112b29719ad8c476e81312df130f4f8439b93489a9310923e0601fafa7039622a1022a74d8c3c2be2e697a5dc230d1050c1459566026ac5c50cdeb02429676ad69c2e26796ea942a8717265d83818f11d9ef77856e7645103bcc3640730aa49f250baa58a15db04b7f495859d24b624a96244e10e545d43bdd1829e2f0c6b8d932e64d2a26f40244abf4f2849681d1508ca6d9e153c208d64be6cbba3b1eb9de195d8fcc2f8afc427d6c723c3639c00973ce3767ac412faf99ba67d9ed076baef0f48c47fbf66bf6faa6b4a1e1c025b56e69d93aa266d942c26e4d61633bc41c2157b421cfa2bca4f695981548c6becec87acdc2d5866b8a170f9a90590af2506b53b9ca5a6131355c0276c6826e7214194e962e2c7493ed2124bfa09cd42837ac224e559f2b1636060ddac6a25a19cd7939d557902a22d14e76a2bca8322d4b16f32ac3e6895a441315b32c2b30637f7a2da2090b1f23b31d2acd8a15bd846260655e58398aab03ced77f8b547bf5b1f53a060814ff5d89cf97bb7735f22aacd8bdd7e85efbbd86311ec56bef501994efdf0b840279e6cbedc517df31ec3130b4606d14c5d1c7ceb744c19ee4696f3d66798ddbfefd756d85651b33c276afd11de21a067e9e213ce6125f7e9297c47f2bae58eca1ce39679f9cf31eab3e79c8f3d6dabd57c447ec6a42ae36e79c6b39e791d6467cd92ade106b10636c83405b987bedb5324eb1d75123dd6baf95918932c638e35c6bad35c418e35c6358fc63dbb7f9b0ed6f28f525c2eec6815987301d82996723126a1d3ec9a00e618ce3287bc964b299088630fd24044310a665b131cbc61818c2f4130d86f9a5413ede52ac325e3904f5938b6dc65f69b41d0cea273bb21ae0efd46ec6608761f83624732633a89f6830c3f0cbc683bd5e8fc3c7e2eb5f6208eafc24df8098b8386b30145fe0c3c6b0c868e803197dc3b001a31ebd7e6718a4ad862d0ed918fad74be70d4324cfba3b486e18e338ca5e32996c26ce66b39c10cc431b8c0fab9a6b9d874452ccc99f535f62f939bdbe4f4d5691b695916f596d95017e0567c020288ad522815586feaaf3ada5be1d04bb2601d87126b10e8d26ab919fb68377766435f2efd4eece25a8a2ce35590dfd35dbebab11ad7eed160d61a171dbb0c854c8fd45da1a4314edcd5929c9221da0cab82ad418779ba03b2653c061db60b059d599fc69420c45311c83ecb157305052535052606ff6ab57305069991deb150c14d4eb0a140e0a05c1d76db34514c52db92b2b4088e8aa08e941f1418437242a0182733b4d047787641f382b04c54255fca1a386213e2c54c523576d66598449ec9c5ebf5c4de9e750ce2e893864eff4fae5ca49a6db621c134c21ee2093a5b1c894c9b181cc975187fdeaf50b19d99aad7bfd4286d7a6492fcb8c2cf6992d1017017afd1648707d0fa4d4a31aa38f60ff45403afa28fb14c5a0107afd0da8789d011eb060d77712ab41e72bc763876dbacd50821188200420f040073690010c5ca002138800041cb0d400062c400137543880015038a106099d00232085500482071dc8881100a10d5eb8e01ab400baa0c7b6a393238bbd5e93404a4ce16bdcdf4cfbe36fa67dfa9b6985fccdb4b9bf99b6c8df4c7be46fa645f237d3eafe66da257f332d93bf993d9c745894062612c810030c1fc8c1010d9c2f5880021270e1012db0806305a5042421208502d830a10493c60044383222fa60c69000607050022088fc0c30f8f1e1a9d1f66c843d48022981e2837f336d0d7f33ad8fbf9916c8df4c1be46fa61df237d312f99b698dfccdb4507f336d92bf9956c9dfcc9b59df32e1e2d5b66f97701f257ccfc0b2cfade36512fe4df6f948b811141ff2ed73e808b76184d3c0edb316e1382c119ef4c4cef117ec10ee026f5b215c061b84e778e21607845b745fd9a7457f70abf3c16dee878de336aa066e53a91e3c7af088f1db31702982aa695aa2c7114f5ab8a8814a011a2a209cec0eeb6477c476ec88793941112e57746803a6d6bb6a12676b88203d4cfb5607b7bb266ed5ecd3a2dcdeb82dc1cc3e2d0ddccec02d9bcdc4adaf04dc66dd609f04dcfe46c0ad56992d03bfa808f8c531d931f09b0b01bf3a1eecc76000010c20d0795d002bb5e18926355f862c51840b982d426e806265daff00bfa907f88dc2b273f0bbeb00bf541cd8000736f0e251e3f1aa5b64aaf0c1434cd71b2aa67d0df09b017e7ffbbc27bf18e0b78436fbbc2ff07b017e8f70fbbc16e0b702fc36b129c0313a018e714bec4b80e35c0438d635b15de0388500c751337ad8274e1fe080073860f6f3b520ac593d6cf9761041c648161948cda409420795113798f65be078b7c43115084aec13efba7d1638e63580e3aa311b07c73d06707c75d4639fb8d7edafc0b16f011c670db19538fe2980632d25fbc409b891801b23daa649cfb034a9ca7262a688ce459815b841013a84922a4cfbb124159254b0fdded8c88b02ca4d7b88f54b145318dfa0aeaca0f14225c6cdd50b28527e600521049c9f691f013ca307e019f7a3827d66b4db4f81e79c0178d691e0649f39d7ed1780e714059ea340f0b2cf9cda38c1c6093f1740028a87113880b1e1c9089e4cc1822541f0a43431ed9bc0f3ae06cf543f50ec33efbafd1278e691c073959b7d665eb76ff2dc79eed1ed33d3e099003cffbcd9671e00cf23f0bc7fd86716816b24ae770af6a98fb80e81eb1f27f6a98db82ee29a0424fbd4445c83c0f5510dfb03ae791e705d4542ba4fcd9bd1c18c0e7a78e20b269268e1a1c90d0e3e6e525300a1a50416545bde98f687b8eec9e0fa6a882d00ae7d31b8ce4ab34fedebf66170fd0b00d75a20b0d9a7fe75fb1c701015e2200e6b9f200ae636e0a06ecd060007d3171c8c12b34f30edf68338e882833f6d36c9411ee760550dfb0479604f030e5ef5b04fb0d7ed67c0415f0b0e6655d927e8ebf631e0e00f88835a7bcb3ec15fb7ffc343f4021ee24a78629f21daedfbf030d7c343dd0c35fb0c73dd3e0f0f531b0fa3ceec334cbbfd586da7b643b3b2016a85669fc6431e8270669fe12ee4e1b00a0bd92741b7cf9017f6c22b2c649f076a9f612ff4e1302bcb3e435ff80bb5b090fd193eec33fc856218c279a170420b2069b2e68d1240b4286142161d61b63489a22567da8f815c2321f103cfd4bc9aa295686591eedb17a3709168258adb0a93e7766265d817ad44ab5ba4414f1c23fa44282e11eef645ad4b54bf3c81761bf542ad442c51145f4e6254ea2415a15c22b0db17a95ca25ca6dbac1ed52d900170c77f02eed88945aab21ab2fcf83367a1b7372a8ee98956a7885ae15eb924b77c21b005e3cc4bc442313bd48107ffcf659ff52ae74cc53eebd5e3abab372aafbeea2fae653153b1cf4fe1ff710c6551c451cb945dfbac57b8ec7489f029665df9c62b64459164a2c19c5911e3f5b39cf58eb0c1d16c28144a38b124a76ad2dd13748b0ae814a4c9d60fb22a456c0921cad21f9a243d343c6c690979b987644d2f490d5b47e01078bc2e678688a55faa1891a0f5764c4cd96222963e053bf68975bd7ec9020e8b945f6b54ebd05135867e5b97467d15eb708aa37654bc7a64b3eeef6a61145b8d76fd35168e1ad5a8c6e99cd6e95447e55ed6cabd8c05d6e55eeee55eeee59e0eeb445dd7dfa4eb7ce496fae9e65c2d8d9ba3f294d86b7cb1e32dceca58528f2c697fd418faf55bfd3c3a44c055b80af7ae2e11ecef7dfd18eb12bd5e3fcec2faf1af1e596e618fe3a810bef83b58f6eb711cfb5a6680f045d2567dc08ee9dd528b20c5b61ff22c7d5f8faf1f13a944d6871a858b46d2e2b0907efd1a068c7edeac1c519cedfd76f7c3829d2fd5a5babc5b757bf7ca77711777735777d31bb5b357387be5b359f667b5ee8da78dc385177260192c1a13c76a916aa58e6d9fc635f5e7146be533e7bad6bbf0b6702256834e30d7f3c7826ad86705bf2289e2de3e3edf4b22ba629fb72a69bcb2bfa68c64a2c11cff46b69dc635b2414db4993f86ad256d5b1bfffddab539be56bd03c81f962f51dc3e58ab1ecdf216d34c957599c83e759a7fecb3274db30e07522dd2a8510815497f7e9f5a84b57aea91f819aa67a3ede5ac5a3239726de625fbac57483188568bdc76ac858b6c1516caefe3b377cecaf9e25085f2ef20a23d43ddd0e6485e1e164aaf09aa8cfc414b36fe18c4ee81b08b0bede05790b4c5d978042c3bffc5ba37eb12bd3effd5e9f8a29873ec6fc7bdca4c08b3ac86e6b683b85b6618143dffeb77d56f8a8bb28eea79fbdcf4b34e7bfe2eea141755336a47d573ce2916aae6d6b2c127d0e996485d4ed0e9a2b7bc91bfca926c1616ca4fe366994dc73e6d15cc66d9aaa1a1b2fcc71967fc59a268737e2c04e6684e84a90e09a4a4a393331b9f46c25e947149fd4cf177fed6f337f382bf99407f335bfccdd4e06f26ff9be9e26f268dc644dbb2d887249052f8af7f914caf0fbff6379fbf993f7f3331f89b99c1dfccff9b49bae0620a9efb70793ec44b226870232d1870206e0389fdc35dc01efc760ea234fbc43ffba80c6f768ddbdc0eb7b823b6fd9348cd3ec15f88e2220ca70addc758e09a72fd661ffd5e14175513d7c35ca8fbd51837ccdd0f75f74314fce9aa1dd5cef6313b823ff05703b5765ec9b6b3f33592a9f63b5667535dbe9fafced294ee885ec14835d1c146daaa1e084eecda6faf5808fb4294c6995a0c61d25e87336134555539983b9f35f81d48d939a1fbd85775de86df66fb1e92e9e648ccf437139320b8d93c5fbb33d45ee767a8a2542381f2ebbced757e061e12289340376acfa3a4f3b6af3d0fc9544589e76d24539553079c356dbf420645a4a68e119c78260d1914919a367206fb7b1ed2fab0502d83225293e76d7f5a1f181b79512c744770e29935b262214c56e12a2c84d3d418978672099349e769bfc39968b05c8a0401854923ab10b58006dca36ac1145387ac8289b8ee89d3f4fb15a7a94735639b411a09a41f08bfedab59754820fd2be8bcad9a35677d6535f028cb61d5c4826cd8f8578f7e2e91d8ef99717de77bfec6f34ab6e779fc3c3cdf4332e930eddc765421eaf3d5bc1fe26c361edaf3d0f00c355c757bf7ab8cc449a3e08860b2a4c9027a44e962f3068a104f6e8d04d23b24507e20fc351e34124893d7679240994cda79204c02ad40a3fd0a3a5ffb1a8dab4366671417dd80f828130585b5ebea62de1d2e529a5c91830d28d861dec7bffb58eb8254ec70fca36981bf5bde47eab2cf10fdf51ba2b84827447d7e3abcc6c9f9a9dfecd42fbe5a9b6394889d63d4019d718c93719c0b41091cd6c5384e5b18a1c351afda109b2a34e1b7ed9f986ab74f0ca7dfdf0c2edb7e98b6b8e94ba22dac767d0fa4d8f56bbc5d1f7fc61df8b0812ed025694468d8b7617fc888472b8c56af4c56182dab2e42bf3423fbfb8c270245948af0c0c1230a0c518280480a020245b972f776af4d8291156331ac1cec3613ea84b301ea17798a1b0bc160e0dd4916e9923a1556a5d867ed9df6c93ed1f8aba4aba49eb5b42e4fbda7382ee2700519a14090112351ac49b1a1129fe2fb60a1ab7dd61e5352ede10fdee77d7c5099957ff04936fbfc147cca2fff7b47d8348992242da01152b2cf6ac6a7fcbf5704eb989bb15ac06ac18cb5e90e29a92e175c2eb8b8ec100c1dffffdf4203721cc726fbfcffffbf1846f9e57f6ff684935310948d20a82449baa64cd9c1851db87cf8e8fae187ae1e7ae0baa1ea8629aaa92e9c0ddcbd5430c61a6b8cf3bdf8621e5bacd552d19f79bde52dfb647defbdf7de7befbd1adf7b31c658639cb3d618e37bf3bdf8e231eb0594fd020a179417a060d94a58b88ebc70249683472dab11b363fe25a9a99ad33e6f9ae7d73e3e308c301e12a1f26a55ede59d46ac42cc126fce392f494d5d22f0bb95d558929a02472b03c13b0582e492d4d42d2b95be2445e512652a3baa2b4b52544b52bc2b5377977754a844ddb22e4951b965ed639578c3aeb7ccb7048f9820176482ae1f513f5c6ce170b185e40ac910198604e5d25c978b2c925c64010e814c308662c89881010630d26c0c88f2d0d0d0bd9f49a321a3a121981441928254acb3fe62ff3158aca71b8109b3a5d735bd82e9f9fa9294ae7fed78b469d9278eaab11417c1a2a8aa60b71e81afbf222e921185e3eb308f8a54ab8c6bc174fb27aee1a99fa2ec6330ab6effc543aeed8bf6bc616c335e92d22d49e9aa95e9fb9a5c92d2ddb2f625a95c5f92ca5da225a9dc9294d64b524d6e59fb9214945bd6be2495ea6e91d5f525a9237d492a57fb92d4d32d6b3fad6e49eac82d6bc7e49254ee96b5c3dabc38a2f5e248d7d60b5b4e9c74d938b55a2d8ab2cc37a87c7172d071ad56659fa59256ef67afb65ca16b7b69adb5d60e95e54db70f25494a7a24f500b2ef57144857ae8b398ba2921168ad0ac1d34e61bbbb38213ad7436e03288319e87faeefb6997d8f37ab84f9417036e61efc3470110c7c3dee59ed3aefb567f5d4c5ac19d303d06b1265ae6475b1c7f44803ddf735787197a8cec89bcbb37f3d2e6b0cf196af146c60b1611657d6a30a865f35af515d7f288e2428ab11065df037339c855f65339e57029a3d93cf03914a3c7f01c974c1f390346ec86150b2388b16b18dca12ef7a968999caeeaecff6acf1695c23112ed1ceeb3cfef1939478fe71cc9afdf8bbe7797e859f07ea799e9f9fcd6c5f6527e45bcf30e46e236f1b2b637c1a78f37c4b996c24eb2d651fb3a38cdfafddaff11d9e697ce4b5f67031fc5f8fd5d81df7ecf71e777e18db0a66c9afe34747304c8ee867ed31d9a19fd58c06fdacbe3dce6a4cd000cc667f82edb32bcb9f84ab7e19c9d4f563d809fb18d7b21ab15895990074e357f80454d38987f9830a32515059216583d9c3e3a41a320407254e1086099387a4e1aa877feb599ff947d9cf64e4156265c07ee4a78deab0d7b07c6130f2d645f147a67ec2703b88cafa78893238d6ca33aab5d65a79d5a8d65aab51adb99ddb831342081e78b092c30a0e4338089141c88ea11ddbca720e1c4465dfafb572e97afd0a9fced7633920987dc0db784b0b823f7084e1961fe4b0c13f7707499f2d6ec9b2fc319b33986b1609c48fb3141d639c3908b2cffac339876d228a7bfbf87c269568f52a4321eceaca395bf2ac815f41b266db6557304b74b557fce2cd56ed0a6609ae57590d9d2aab5c1f7b12fba01a1b37d13fe60ebb6178b3462dd2d53aea51bef1b4cfd2fa50896aa93ff616876d139b4289c2afdfee92ca1b1a2dcbb2d63233d9e0df3f2d8e89e7e032700dbc704bfda26eaaa51e7d2c522671fcd4234bb26065275c9cc5d99cd5d9d446d99d96a2518da2a84635aac71701925ca8344b19cf92d6991911194020200033170000200c0a068442411064411e07ea0314800f5d8a3c5e4622158ee36020140c65208662000040188e01008062108461408a024fee1567e2b9d02db50411e4b7d4259659c8e480de127d09c7b6b1c56a8adbb0482449e6f239f318fc3bd309249d05870e332bacfcb2f3739354bcddca9b43f0b9391c8440a0fc6ea3e2b87f8de867041ca0558cf9f994385824cb077801f41c3a3a05d475cf4a5d58c77c7723b95812daa20bdaff9a5a2a40c806ef28c1cc2406398631e7565cbb4d632ff4805772cae4437207599d001aff554c61d904e744f1714601d8655d62852c087a65acc777d57c7fcf86eb08ca15ca31919b295752c318d85cc1706e257914615732ba43f93e2f260ea85ac6d0de7c5f7f376291540ec35c1356c1623e1ad43273aab6f83d71dde39a5a39f51a6d719b40fc846cda52e8def910b0a64197b6ed38dd31e46262f46b44efbbf863d7d117c866e3e90d12c13007e9e1593c294e8ab4c57514cdaa52a84a7a45f4493884db5c2195a57294ec4e22473207bbfdb4ab402be6ab5634e3975d5e302de7025622d282bce216e76d208cd63aca4fc876ec7beae6301690ea656405f8923e8bc2c12a3784dfbbcc75e8b675dec3e3352c94a4d4ea1e45b73b5793eea32af345fc53344aa7f980062f5fb8efa3b44a346276c06409ca4024e9cd3b44ed50d1d12c4d74928bbcbe77997dcdf782a4111aaced40d0bfd0bd435d170c5a7354d8f2f44715fa883577945dea787823e161ac423ac992d99ae79b432642ff69148102236cf63a058e869eeb60265305bdd89f6a817da423d648e0690b7bb98d121de56c8857161414d02f068d46f82bd0c112e6920ce14e0e5a5920f9767cdf84ff820ee55ab83685c636cba1b106439583c66061f3e6b2664343e7a25afccd3ef78d5286128c12d5c126064349c48938aab36d829183132a00fb0b33e4d70d1a0676e04f0cf0290bea73a5977e2c56394eb3d5b2fd34c6ad84f4f271ff8a215c086545214972237e9be2ad7d6b97440fde18874c7204024b1c01ee35aef95ba3e04850933ae8b1899333c2aad6268ca94cc2b26649832dc0ebddb1d65f46a3923eb4ec78396bbd6fe4f15fb25c6fcfb1e53067aed66af87e1d07c6ebe276cda7f2b611e9a207ce18b67c0a6c62e24ad7b9d8b9e360f21df12fe1e0b65b887e41fd114792e42eb63b7c6c21bdc4c0a5c292df8ae35b4843a70592e222cf2c62a7417f929dc567298e6c5ebc924645598520fe3f49b05b0cb6c239f4e5911c15cb2406fc775258a64d7a6ab9fd1ba77321ab4145bb97e1ebb5caaf0a98c3a722e396e09bd8917e03c1adaac56df2ae43a2389bc72dcff791bf9230bf96937b0d82aca4a4948897cf83d81a07dc246ca4ef095703f13ed20c580f659b7aed56d4f62cf555ff0de35efcbad036b2d3cbedfc32df85ec1ceed9f0e01758c12332921d08a3da911ce1d53c1fa30ab950381f6ce80534abe6aa60dd24a3470fb5bb9488bcc480135945f2bde84f386ee1b698b9d420b0b818b22467b19de011de559a21883fa713c2621956f1213f488880685418decd1f2f35ad3493d7cf69b84ffe9ee5ee91c57dd9c0299256850ba5c5159bf9dcb98befd94a1fb88a513770d5a8835b9f7873d73e71c071984b54355ebd7825893b298698c8b4d58ae464e143334fc0c49216b8e610bb3921150bf05fe61e360dbbb278229af0f58a989f4773afb8d9c28111077ff275ba8fbbbcb9d78c909f6720cb9f856525fcab7d481e8629718d9d0b404e0a3fee17d43649952161d5d9f0086ce514c515f37de1644c89c5986d5f8e22216076db861b32f5a4695f703519c546be386a2ef92dee3179cb973035931383473125d21635e198fbb0e698df4efa522a432abbd617f2b7a2cf06d9d9c06eec0b21ae048ade97605bd0c98f3c930ae1b10f4f26666c625f3d423c087ff97bc18d853a5e90efa2f91506776c1bc9a8225e81481eb4e8134aa5f2963bc5120b9924d0bbe89b70bec2493c8f27c69c027c0af82bd985d84af4af1d2ed195db8749e60e79e405bc3ff19f40c871e1b647565815164c47647e59f4b92d068fcd80b13fcaa9c8245094a23942d9776d252c226cc4221c9645eccc7720df6791574d8be4a2e46617185e0372418d11d1b0ebb8120c66618002a83b8c9318bcb9ef333c768c9791222e0131e54d0e00f3036e9a8bde8119d03fc470f9b6625f8fe0816d139c2c67bb2c000414700a48894762d6afc9f10d275db13e216619d4daba3e8bd8d35125a042ebdbea88291bb9bd42d0d0b300fe0958a4f89f58533d7944648e14d5f2eccae65db9c5143d904e93a6d3395f5f6c865a31844801716a457275d581abfd12ccf36cd77050bac582673c403ddd8785b633f4be7e67f7e739bea7fadd5c3898d530e59397d988359388ae625da182053aba783cc75a98ededa4174495570204d2b1e19f9b1180feecf7df9c998a6ac85e26193a18577edb7144c8aefac6fcc69716b149fbc0f1bd02dd39c6035194a99d3185fee14fa6e89a4f92ce3cacf2035137ee470ed1a025d358010f6b926214b7b4efd34d39e64ccd9ba380a20e7bc1fb077f7922a2f242c8c04e0b5ff031b0749bd0b30420501e9c4d867f3d3438c1f8b0c2b8d0fc87b204d2f680335948807855cef1618195ca40fb136e9279c92c19b1ddd8f2658213602cb8f77facc89e4b3391a999be6eb5ef0773dd9743e75978f7536595aac82676f2edb78e48f2ba802ac4076b50163f09104f7fcf75154cec06363a7472371f7308795b9a9f08807450d8490810bb5dbf25ffd8f69597f226fb79070c235681b86451481c7fdb24518bb94402796f19dde2219408933437d3edced118fa6659126e1a4c3636b83728389dd9c9f5e2f0cf2e284e2ba360a1871c2233527916068939f3703d464bc87f87ba78fb4a6715f05503a5af058badac47701aa4082f572c20387ae97f1d6a460738d99256b580e733d85e1a4bb012862f3d4ca6a905e8c840be45fc473ae6bbbc6a0240ce546bdf4aff6e65e3b5ed434629793deef40549d64f8d29e24da714a8958c1db7a6bbb89c1864a591f22e415b4357f66b32c3979a399469f3c02f23f3b608eb87206ca49dda44cc03ab662f99472a6e129a09d9629758fe854e71045e52527f4d1ab209e87226d90830c3d451afcfb9959a6681a012ffbf08ead5427e75aaa026494064ac3a2eb59079446cd9d50f78bc039de31766a948c8b2504254dfaf0ab2b350acf638e6592f8d1918541acd46a885ff11c77419902854be08e342e4322fcd6e3951e7eab4c7b60085bff78e6889d17b1c37798a599167f876b816f9bf8b9e0cb786dbf7af0f581fa2b2b13ba407ab1a3cd560b61409119d89db1d323a5e96ab004d11f8a8340486d78fa139fa3c4e64a0a8cf7bfe1ce9fc816fb2c72842c226e0fc5c66859a663a74ead22302ccc853adafb2a941288b6d23ecee8685cbd1361e79dc5bb7e3831ea16c6be6077b287ca67f54353a51e05b4f54444de571648a34647516a9f16c63d93c65ff640571861c7880917c33765dd8d7cbdcd8a8435352ea6eb009c2ce06b212a3abc5b69a240b12c06733ce955dfe3525c5f531ed1da1f07ec520bd675b5eca01f38dc18f0148ba5564b8ca167f067758e66f7b084f60ba934095e4a4be83a5fb29a2dff942c72ec19501fff4644755bc6957039fee7a084260608c84d240cc14d697c51c38a988441604e2ff122a06510184a619d11082aeb9008639c853402dbcb746c43524fd89fdb0dcf7a0f94a8be6f52a67c08ca27a094420cd338da9f521b67f847e898e32faae29d50f4b7fc721daf6f3351a04d4f6dc57b98c69f4ed8e4370c425b2c258a9e09edc84f0e994370447ac9ca8b312da8b852446b9a6c14a4f5a6e0b94ab3660163c942cdaeecdd64eda25e0392a3a327363778b2ec6d1697c6c2cb3a314ed8f5d01990e58612bcfbf2715f90a2d10d2e5d3da47d5630b0a38e04a6a8ea424f07f2ee3e58206114b0f7da80845e8f29f000d428f17117cebc83fc964d392f69c697d4060a92104c42d2fb7513775464d5681237bd4f618477af4d0e126243169845126fe5dd673a97206053e6775c28a9361bbc648658a36f7ea961d3a3ff2500f905c5d1b56b3d5ae083a1d462466750c79a0e545a6bd65f083a8a37fa37903250d0cbf38f5d649122e2c9dc8dd3d2be06325b4d96c0e19816ec612f569764ceb4d874e97e2301bb899e12f174c52bd80b8e06e1ce3d657762c80a38e485f9e548ba2cfab64a830e99fe1d48bb977b9dbe8e90a88111c48d6c749405e763c6163904ec48c5289130d8d930758acf743fff1b3d06abeeced0448a59b95d5e3e1eb58bf26ebb4e839277a3eba59088c271786aa5a06e83129c67c0474f66a7d64cf22f3fb7220b05978836caa26cab6501857e6a90a76991a5bc5bfce035b769da56ed127941372cb3ea144e82dbac412a1b7d427965818e7c07ab3e1c14f0ef1d8c0c7c8d43ce8a8ed6dd0fed45ca5509ae2b4dd101ae98e0a4e5855374fe42f9c098e782630b075a5d46773415d22c4e3a0c14148cbd59c77ec74624fbca9b72a85aa8c96843b8265cc9d2980e18b91c63deef641c5296d8faf99299b014050a6f10364b0b7e6b21020cdd9610760c27e234e50ed7f8d05bfee38e4099c8bf30883f2551d7ad76a13b35239ae4f67401bb1d2dda43c64776c2200b016288d6594ea757a5964d45195a3291df753be0b95434a2b4b058c3aac40b27c069a78f88e31c304c0a5c4313c2b8c9c605729fb5489e272a550b37eb8850ced62313f901601178b9c4dd55b84f8feb0615a459f66b9d8620de85ea25cf59e8748e3f1a70c1bd40df4973f92847b113a84865857e25c4acad1074960faba0dc24207d3ef532d162d3152fda7251b1ed35d613cb82a59ca6b211e166a7488e947e9e2e3624deb6cf01a4b0c2dc4e66e6dcfc132af83aa4021c0c506c8e656db2a2571a9796b3ae2fa74d818054f0b67c331b5055e4450995e0e30f9da2ce53384aa33618d25d8d1f701157e3773a1338bd84a21776d949163c8900a3b02b32479789f191b45a8178b1fe76b3bbcc1c7299c2e031f47970e9a40241cf9af93393f83a58c9b53cf14cfe0a20342225f54cbb0eea5ff5bb964c27155716035599b4f0f61dbfd7f218ef330b858f8bac76c1b46f68cbc2b6691e61a221f7db57d1f076143bb60ee69cbdf3a904dc97a7d0387b113063faa1077d7969d1fea81ef1150794ed9ecc83d9c070821eb114de093368f83a909e83c86f5f908d4fd68cb9ff79b457f1cec9f3efe560270655c50ac68bde0de7fd657b0bdd449b8d37f767ef6e0f94f6c05fe51e95e8d69317c83515d09b97dba196a8e2fe848998fef5de8a8ccc1256b7ece8859128bd8560688aeec5a7068e40d81c523166758a78f94b6594e37e1c97e9c396d8a0583c212ca08237c4e145f576e09b710a5706e4349e8c09918779a1d2b2368fe85c69e7b6500f83ec42dd8ecd7faf37916800a56ad0cd32ae2b8690257ae99ae3c351d48e2905075dd2be1d21b30088465ecffd19832ce8155c377b1d96b06fdcb1826cff1846339cdfa59d83a6804d7adc861407fe96ff72c3c93fb5be5ea3d2b767b91e0b02d8ef8aab0938a17b3283c9a3bc40a125493d18b1e3e1a8950a5293670c75481901215f4fcd865c94cb97bf2b0825c1e6db06fe233444d826edc6372bf5666ab5d8f56d7d2487a9ffba74b7472bf372f9410522e676e5ba869c30c1c4fae1090df93590a9b42dea0d9797d1f0ccb05fbadc1ca118a31451540fc709f351bb0007ac7d188273dc2c21f46c747b61aa5347c47c88ebd68ca45ce4a730241d17848f94b275804c3e1bef0707b75ae6ba26cab22a9db0168245fe557c78ed63100f7c683e91e23e35fc3bea44ba432d323cd2d6c1a73a9494a389679e7754f540bd983b493245bc0883933e66932277cedcec4a6058b8fbf20b07baeb1e1a47e1a3011bac26e2fe68458844d2ef96973fdbbea5aa16d0eae820c41124960d6e64e187b0c33f19a486c07e64e596a7b4a0ca37f31b592f0d2266836e7c95d3d76067f9eed196002b770c9bfaf317aee8c0625674382395cad75dbc5a5147728e11a6ea402de06d369ee3137e03ef91342b5103762317112033d092b1adb79775cf664a6e2f11a8f59ce4631434aa34db003a6e244a63b1bb83bf4b9d65f47073da93c3d70e1de618384fb5a3106296fce5a19f6e46085877d3068553e76cec1e5a4f0fe4eef501dffd60d89383951c3815defb94aa182410d0cfad2f83f7fad894e0cded27f44afbe0e45654eb014eb1908cc0d94286a463b2194587d09aa4bd9d4b98e4806d5e2ec18d04d7e1489792ef4ec013e23fdb58fe6ffdfc26c09efd60851a371d0fa89e0473f178c977140f5b8bce688276dd3b51ed53b0d7e2c628e4fe6d74febd26b8a92cb0c2f836e2120524be6a087ea1af227cb3223ca58bea90ac14acc94b52667383cd3865f8fa1d08693130d551688498e4a07e9f51b18753a2d4250ce22d04700312d861e1670c453bf1835065a34f649b000c40c99020e7ea86a59b4a5552323dc1dca9088b63674b1417b0ca684e94630ed26f424fd3fb60e0bca921b823cc81b79dd7d5af54c663579f115a7dfb40a693a1284b197f2411cba7bf31291cf0a0eadce56829be8c92789cac0cbabbf4c92f904682e5a6cb25981b2a86f375ed4334bfcad0964d647024844622790b31e4c4961f5f7b7d89d0e0fa3c75e906160aac6cab1f6f59c8a16b88053de04221e01cde57eee32e4ebcc195c816f59b7a1f78535cbd0a4edb990da15da4515d52900ac1d3486e8f598e508cd4929b660e9ed3a1d06e894f70c0252b5048378a9bf444f1bb812db8b569015ddc3f06db389df4ab880b26ed4587d7da5dbfcc8a3c76b4822c5c04ceeb61c5b0a148b2bda2829178af5fbec2f7b81ea0555d17baedd2272e6d1519fae26e7d8140a397c96e5b8a17f22ead94ee66f8322e9aaa0b4a914146068e6203a51b1fd6a8f070d0b749d93dffb88448ff5b9ec11976b3bd2e5381660a4f2b4dd2adaff3c8a5248c36fa14eee0d313481779cc51c7570a05f1945410ac952f84c7a703cf5a343fe39d15664947913b6d43c94b097846731a1c33ae520b73f54c1f1fed389144d45070d70c76b916f28bb3cf101dd1ba024229b11c068609980a984c9ed73fee9953c0e2f878c83c885ac3b65322a9c7b6297ab26f89b1bdef3a083b6146c608386fd8b1e56f989b21fd06797cf1520b0a9e34d085a8500a69faac2a1e89b9ebdf9ce500be0b7ed3605b6d4d7c7274323044ac5d7e1556d5373dbcfc17259ab10f6995c6a7e96137e4bd790001d485f2ead99429772ad2c00713864c9db7f9d7d9fcdebd9812eb58936990d468e871961c0e7ce0723212704e1027a15d0e86a1ccc55291482681394a7e0bf4f0122568e67e950ce98def97190d0d22172151719650282dd0bd3fb1192703130d4c762bcdf73a21b268e1ee3cd46a8edab28d52405310fe0e52dd3a8fcd8b078c944bb15a027401adf1078a76b5011719957984c5d1c6add8f1e7bdec77be03d3f5bf798ab291518b764ef6d041cef3067be384386f589e3ff5319fdfbd39f7e98322753a59a2fa901a218c2ef7537da1d4cb70eda10643f3984f74d50de5f1cef39f261cb7604be9d6e6a61812e39ae2a825e4ebae53c2316b9eb0498019cb2ee78a3c7184d7c683d89024aaab8eb50671f74edf77ff54951b088f053465d2589afd44db37f465228d1691e0ca6e23c2f5d7a524b0d19705984a054aa3fec455af64bc772a637b19aaa2f47f103bc6f515af69cd3848bab14f822d2e60ea0edb0710ecae3a7f524312cab5a9ebbc53a71a2aee616a18bece1909355471290068396b794b24917e2831804e27940594fd4141d494008c0412bc86c80107462ab281118e44fb16aac891fc40a188cee499cd84a5357e77519d24b09938474c8fe226556a0b6e1db8349f48585105408397861a191f7158aa3c149f7ef86686af49090da420f88ddd39e5d3524c32729c4f4c4159634aa8816e1073c6fe58e2911aeb4d7c700f442f8c6e19e928dcb17ac606b57a4582722dd5185198a9ff40f3cc56956acea81022aca8485dd52b45311c05de55e3abf88fe0abc25fac071903d170d096fb78721c03a38348599f63df690f3db0cde1848367936835e45cf9427bca69e59dcf3db3cf50d22d62e8a4169f66a7e47b5e862e9c9ada71893a49d4684210e7d6667d1f377c8932c870fd61957854b64138725b92ceae5f355c4ad8e6da79c7f207480f596b868ca153df563f8be427fcc9fd47a4c0d548c5480820c02f309a627f5ba7b0bc5001ca6188bdac367c5e6824aa54fea86891ad9db9b1567f8155d82bf99c135d4d8879261c9a1f53956d119662f175d8eebaf0fa806108e724bdb00f13d889f1bd63dcc62165b0131c6b88490f7c1d0ea7d103542aa0d44aab0d4aac06e11497c9a81545a544916a9c07c88fe5878a811d55fa55a83cff7f8fa46498ad156a0cb2ecdbb1d4a512ddac919fbcc1194359735e93944b23b5f7bc272204abefcf57e7c781939e8516dc5871f2b811de55ee8ee7032e055b50d0e0e2f05ba4b9be0eeb124a1a3b08fae5c8e0c3a577b35a490b7ebf06bdb84fd40f800445dcc46b62c376596c500b53decfc40f8e5cfcaa147bd15bb5d8c147c956d839bc34b80ceda2eb83a3c59e02aed833b979103ceda56fcf03852e8aadc040e9f25491e48bcade39b719d77ffe1c30836cf9781d398a0f195d514b29932e5a0d7d9ab50ebfbb5e4488bbc1786249b1dfef4ac9cb5cbd96fe04ccb7116031ce214b7b177bf5845c744b872164d53868c7925639388700e1d16c02a338c17999df313192f0a64202fbff034ee8a447e3937b1a668c03767a01a66c05bf901df7d0d68afb5ef017ea94f5a7aea5e42f186740de3a298391812a434d66612446da8cc947ea2d9127967ead3c252cca8227ca76a43a6ac998ddd105cbba6cdbf11f0d32728d4007e838c8ecf5415ddc74147f46328ea23523082c795e8a53dc49fad048387b9e8e788b16eebb4dad5a8b0fddd208744b24bc2d9b11768451ca2718f3062e25246456ef72a76a10eab18521a0dd124c5e3dd3e4757bbf4b85d11a5a0a1a4323fb14af72bf5300a407725089ff935f0db13163d271fc61081d245184044949bfec4e7864fd93f9fbb4f0788a44aa398cefc56fd13b7b43cd55470268ace669f5d31a8ee0b31fe5881027b5dce27b0341404cdb54a3e6912ce48473e53200256f8d0b7920b5e77eeeb0dd784afa56000548401e9255eae1ee340e193e27f22b2250ace80b692a1bbd0da60f0658169f50c821108b716d3f9979bd7f0826d787583a1d427be70a103b8df71f3dd4123e0e7e3576055360641c3829c9f110f4ae6665880b7d02bedf6fbe25bd746075511a4ec803d3bf7b0433d871de875d8819e830ef51c6a4731ca5756aaa310edbd278222ee690150a8ad1a32459e5bca3d1ebc11218767fdf34c71adbc35ef5bf9c227062e91ab48a17859bec91c5b62f7566bfb228be6478af2e5b940d11f833271a375875917fc456f0c640dc0b88cd0decbb851ba2c5ce130dcefe0aed541c934515305ab887fd8d4b4b725495a6f9c9aea39aa04cf5f39ea4e1f7661b0924a12b6ccac0da193f149b5d028610e94eed260a937814e85619392ad3fb9869fc311ac0dbd4548a2cc155c317b305f677d0a90547d396b8b23327d853e18290e1016221b889f26f9dbe42e6ba1f49526fbf3f39990abd0e0cab5b44e3e2f1364b4618329bfa0d8340914feb92b6e8848f5904228ee5699916a39e0ad62109e6b0092ba5dee4f97a3b69dd5edd583c6e8369d96d2a9ed1e6173bf6047d038df4384c2b4137596208b3e3f965da382639ad5556d095ac9a2b2fd37e423ef66900c701fe33cebbe43c1a5cfef6a62df2374ee571e5c8672b045daba3699251d15ecae9baca37a02c25f8c18f9a8e13a8a15601d2f37034905ae3ef126896b62073c57bd4767b8c625c94336082f46227810f3d1bc69a5e31cf1d49397334f3ee93cf7978a748b0d35418a7a05f65843519d3a18d03b692949b94baf3690b38fede4bbee8bc4957d3b565f2c71bdc64031a42d545fd0d536137c9e9e9d44ca4acd6875a9ccbea709a590f5a4fb410fd4ee26201b4a32188b9b6ce776d2f2de96eb97fa1fd6a191984468682f3065e980d5f8a153496f10be69b455aefea116dc787554aee35487c7645dddc826f43235648ca190bb1ac0239b980fac0eb0ddecd02033e82e9e5bf0a52b05fe6f11ff092db77f0bc49ad05ef7b7c8d862c62c89264ebec4dcf2e548c8a6cb7e110e726567237b219d372555f34f40ca1fbb50986b199b4087318efa41baa10f6a4ec51f14921a5ebfa86855d5a0c1d2a76a7eb14c67628ced0effe6f89970dfc1ce90138182821200e966c2cbcdc9460529b1d3229b2ed12cf79a48d6e0da2f89dd2093725a39194a1b8c383428a07dbc1c11a2420e214fc07ee6a9334ed720fbb3802d34df4037e519563a34b723c7523988926f6296eed52d93fb22604a88e53ecffd6f8f7894b9682e1ee114f2eb5ea233555df1c3228e762bc09fbfded5ba17961ca98d05de1fb89a895703177d6d31cea923e5ed1c98c5c51511c1bffb863b04eacdc2b4148a944d45ba7ba47c99e4ba649afff258a3b037959d97098afed20ae83348533f8809928a10f523b507f9710992518a61a58b5f29792f32ac0bbc19451edef14d8f568ca67ad56d1198d69e1d88b0296b11801e978362f12e385279574a73cf02040d69040451d43074e2d46d2116bf05f4289d2fb78669adfa8fa284201d32d44a57476a9fa3125702c13d5311f7311a301a4c09c8406eb0410144daccc8e1ac357660f17cbe2ba9bd1ad52d2fe67c9ab82ea9c1cfc9dac77edc35e490986a1d1d69da4787c1b3d22406daacdf9eb008ea16871cdd991c72f7a3060bf0f0f04f5734dedeee0f6150fa7111b8a4561b130dfd006ceea74ba76ad4ec005cfd8d3c2b7070f10faf0cfadf6f9109354ee3fb131fe9c262174390368b9c4763a82f17779d43638c4d9d41ea58dcabdd8288386c508848f231882b87acd6df071581489701399873121583601a428b70fa26cd7d55c91c7e207290a2715e912d4a129ef76d65030bd99b06ba09fb3043078c7fc29ca0768767e2dbe4b9fe58e9877750cacc9fa262eb15a4dfc061138373a69775ead784fb907f83e0e6d03ea970470e2e8673e9253e17f9e10db1c54f781951bc3b76dc8c88e4f4ab910804c0b4af147badfefcc47c98ac491ebb6b1d6f0bf830b557d8f8de79e1e8cee885bb0f6c2bf0f0f0fd22b21cc232bf7a8d7ce1c214760dd4c037e3a54de7ac1548a841c3b731e2a5fa84af02328f1e09162fff160b5eca8a42a738166aa63bd3d804d983356ae33ef8b5c00a353f12a0aeb93d5bd147f7501adf7fc97d78a4173614fba11da7df0a689c539579edd5aa4fe5abd840b706580bf8961eeb1377a94585f84d6b5a03331e0745ac30632af46caab605c0f7feeec3a085002d01a2820cb348189865809b1ce2686d83715d13243f897bf36f6ca93549fb2e10d348d31ff46ab9ada1a998cbb16796efad31c007428e408422c6e17db02625f087b3a8cb3369b6fc816b702408d50afd2e99d0fef8f943b4ddbecff95adae4ac43ccbbec3cbe2cb548baaf86146f2db5663ca1747117ed99e55aa0837b350386013e53dc732eb04fa1e1b4a41bbcdd7a19f72150f66045863e5a636c8a48f33438a640696c7facfa1f8b793e26ae262c7dab3e33983f480d5871bee9aee37cfffa0a8429a4a9fd2a308926779100951fd56c2823a16b63a619885d24645f6ad85413bb8d88af58b0adfa33bcedd7dc5d1e66c60a7f55da8e2991ab0433af8e5cf1ad04b9600cd13db96fc48d6eef82b56def2eb293660594deba7f8705aa1163b21953eed845b013fe5ced8b4beeda6e04c52502c46dc523edbf6d991a7d06079c23f1998814c91d8b26acc689af5d8e3f72b910a0b01ce60d62f3a4e08b9ca3161acc08a46269db14eeed8963d71132c28dfc1f14c9db69ed2043ca7165b382544f4b138214b613c5653385774962f9a64b8f30849401eaae91d236527d21507904efa859c1aab094cc76d29c85938c83668155112ca7cd02a9247827d9a8b00befd35d434adb91ec111e8bca492eb7f05b540e823a392d5d0852d88228775893aa0fc4d44d46594bece62a8479fb34ab9a6d279567f8c9da2043965165b3015412bc837817a928342374d02ef5660b8f5e130c3fed1a2eb9b173d2f8f8a8e784251bfbf6089d4902233d710a4b9bd89112e5eb87a26340d64b188977221e11624942d4ea52e1625bb5e5a7de4509fa4ebec775eecbb7754f9c3fcc4c9127887c65d5f4d66ed110dca43c443e0cd634b48c625dbf38320bda7a6f499f6ef04e6a0f210e9d7e4ce916911a448e0ebbfc74a950d2d83ec35bc9ed3507435adcb89308f64462b9400c4ec8c66b5e034868767384b86bafe9251bc27defbc04b32f318f3ea5ad5beaafff955a7fb3b634c2579bd34b439480dd77b4a0bb1c4e6e325b9bc0bc84326d0539f55e0d1f1b5c5cddb3227e2a183acff2bb3fb05307cdd0ed2ea0fcdc800b844d0cc8d0acffd0a3626a208c1e9fbde6293d8d0033b0570558437f100ff8c1d00ef3d5a7b510d8bea8ec6a2205f33d889863215c2ef6bb824dabd04e120aab7cab7c5c4e54a4f4c66ad0c0e2c66a9aba3337bb83e910e62bbd61a36048863a3c4b431d429d9f6371ae103707e4e0faab918a01d38c302ce2b09b02f03087285cdde0713879642476f1081762b9f83c1dc7e27b36ad72fe63c7275053e176814e8ba808a03e46b4ed449727b8f165fa3b011a6496b1ff026a893fe0227c95486d9e6857257f7f90fed0a165221d73c53087a1a16ecd40a05cd693b03fba09ba8987d3c42b7a72719268b0226720ceb962808ecd5bba6a6bcaeeef4a9d02dc91cdfea0b1fde7788e502aa0b2b98725da624ddae518918fdf57421ddc1a78b5366dae9794a14eb8fe1abc355606c95726288616de6aaed1253aac15d3c0d5f6c547da7670aca0a8b7e1eed977905f671b5d3ac65543b3edfd4dbe246e555b1704581ba93ff2ed9d2a5856d060b58b3faa4593a605ed922af208519cbfa506a01e0f7a270bf7934e10ad4339c5b2da2cce04ab262c7a08cabe0b24e6dada8fcf6b3c690407f039dff0a8664e71824adb28f5de87c00ec39dd7ceb22a19b71555682c2c5335b7cddd200b130a814287e65581b65c21e4add2a7ff4a6b3dbd94650d604b9c786b60ff861bfdf8fe447a9233674a25359c65c6b26eb8329933b19ed6459b362455f6b80313f9b1e7cb49cd2d4fa515d411b49281b7a8ad524cb94654ecb7b7b35a618b6517ea7e6bfb671094e46204cff485f3d4b35db042d2d9144dd38f7bb92ea507d22bc9dde57db70a82bbe44ad8f7aeb4c6efd9f82766f11bdabc5bb8442fa4215965671cf8af579b5e1ac9cc6f4d5c63765322253bfb174624e0a26e2c316791f538a166b76bea9ad92cc92e0a5f11dfe9b9bdbd7a8bfa62260c8816449512cf4557e590e89aebb36611277ec4db3f688bb1910f8dedf6f6059388cc9136a72993512d2761a508ebb4edda68a06dce7516355f8fa357b082ecf78bcf6a1965eab6a13f25374156d28941040fa5261bbc2eb7db66f39d1b93af3d9e96e50abab6e54adac4e74c9f1fbe12a6275f57e283e9d8de83fea5cb299fa3aeb60697a1f35368b946edebd2ca494e34e212a92c072826a515f13da1151dcf702e3a8ea228cf5cfcf7d187cba3ea4f00af7544ab0ed17adc3d8d0bf6f9cef3619bbca22f5d838fd58b1ba5859064e53a7c97b334b915052beacf0611cce617bedcb1ee65540396a44c86c2676abdbee37823ad5f22cc7c0946dc2371d456cc8662e63489ded36c4755cf63ab0244462b43251d0d39e638695e2b9fc04c3f6a051776ea883893835218584c174adf4ad1ff53612f6a556640afb884723b37b4087834223dc1b58dbe1f6d0ded9d0b3581c5ab754fba242091b8f0e15749402664462ca0ef389dee40841b9748685d622fdc10a16a2336f0abbffd818e4d66ccce922c903aca5619d24e1b0084d54a29fc3a4a1ab82c1308d916526ad0358bd70a3214519ac52599c9bc864ceeea268a018876d98c282137fb4652ebe76896e9c8e2e3c226d22ca11a0de7489befe158933308b221f129956cfa7c84602c17b93ca1084ae300dd7d528b1e940f412ac97a98b634c457c83372212681dd99f0c1d46a3b56e66825044de22a2e0dcad88d870808a487d0def45a1a679aab215e9900d63a6da21e73be218ad6f13fdab5423fc4c796c2b0d19acbe7aeab8dae2110b64d4069812d227c42d6815488f58d6d5ae6f52218b17737ddc1e452d4a7b372706fd012227ccaacd432b77c42dbb732e7a4297b11b5ac3be17d743706e9c77673477bd98d89e5735762da123692ec439f40022fae148c816cb04bbcb5b8d9107d56b4d0070966880869aa7e3b6193173be21585f4e75fd1cbd2339c99984ac97c943d8e4fb06f6288dc37c008a5d17625cfd2ba8248eab0c0feadd56f16e6178e783e7e668646a16402d1bc6557ad4e061b1fbef7732e17e3d3745dcdcf68c83ea9bb09487222331acd3184a323edaae6fc03f9de8b8ca13270cec68bf1ed52318c71e062b88ec8b1e188486bcca0883fe0483c96eb6aa65c98e71fb69adc89e6eb174515c2573c44f5720f351df38470765dd52a8dfb2bb61230b5507bd2f9f8850e0bd0acdceb9d4d104c855fa5f9f4ece855628734c54ad558fe78bac127f9ea3ca0e5a4ce7bb717e30696a50cdc3153b1d8b7e50ad5b4425be2bff7a07108ffc685a93719ce093fc8cb79d494299091a9b2501490a550af3b06e5164d0189449c9617a967dd5b2ac3b0b45b5da189a62de4b4ebb81dc14af8c2822f57e6bd8e9b22bf0e09fe18e358b35408044c93b3fadc0cd566275ba4cd858fb619ee4463ac8e7519caf7c99b532310b586ee21d33011b459acc7fd773a1b62db495819c1d1d67501b09f5ffde4eb9782659bf49c6cb557d7c09dfce702aac8995c582050524a0769d62001703733d18fbb7a77d3c502c8777333223b6f5f409f0a6e00ba485774fbbc621188655420429dd832b9e5413086c4d6e7e9ac1f566d98c385529f108b8f3739a7ca031e939690bdc99652ca94924c019705a705d5054f8adfa1ecc6b82af3570edfcec81350e46d12b3b37312e748f2ed354a5a1c140b5d667eccfcd8884a0d542393e520b5eb8afd20c93899a9dd96c93a8643662403329a93d26924c32193e1309219f940dfcf80f68767b76ccae3a451f322861f24197ec0d6ed1793614ef19de0df6058ec9661b7fc73a5ce3332a5b9e1865164217c1a1ba802bfbb1884df3e0c6bd8b099633718b637bfac1f03411f4fee981b2cb058e24c9402cd7602e4d0cd2507e90ed1873f77a8053ac86f01eb57df02eeb7dfb144ac0eb0100e86f1b2e1768870860a21a13c4f1f7e3feb57bf02f79b6ce8067459cfa99668b58ebe60fd13ab6101d6af9e0456d791c0ed137defdd7ad44565ae9d3b5cb44569cb455d56e8a3944e9655c0ad0d9f47291f7646d2e5aa02f086bb945d92917b0e1682ef9f24618449d0290fee0edda14ff9164dacd1dcb0c7171cb802871f768361efcf5d4c968022b3587d16f2392995c56e30eced736ee6a177b43dd0fd994f7dfbf39ea3a6d454ee624d07aa3efef67af2e79cf53dd4608ece886149b38393d22e69be8c72300c1ae5488233cac8492c14714419ed0ffc39238d9aa253235c1f584394820131ad1950db5935fea6fa079ffb20470f76352ca0fd7c12b407a203ec4898cf7540563f1f08f75653f5ea6e480ada02eef7a805aa77861d712f203a60e0b7dfdeaafbb9471fa4be6ed64f34beef98bd8f91be8fb1eb39e127a008fdba3cea8bee3cf48ebebe2e08faa6474dd129bb6c17e0a36d46a3ee9225af6800b5ffc5e0bdaa9bc160cc68541b54ba888725222879522c74865bf5b387e58579bddf5e7c247b4752cd85c084727d2b24f97a3f77a041c3b0662114e4a3e063567e1faefaa0bc26fc43c3da60b241fdfe966c50bf02e450ad03a20309dbabb68e7ff46ccef7da239613c775405c70b4750faa7ffa35a6252d657b93ce89dad0fe1f3de472edce5c2130a18f95945e505f376b78c714599583edfd46676c504f8ced608526916c6dffd64191f6331975e9fc590bfe4cdb465041c8bb73c4fd9079b4e158721d6d3f9b5a277b3618763988602f15ecc69bb1a37f6e6c9dd6c15ed5cd58eb426042df7661a7326c4752e7a01e1912a772fbe61b90a2f1a35c39c04de525d711f7db6be98fb86e47ff243d1ecfc6db304e7ca90e583d60d3f8b9a669ab69ad62f99bb0414ce84b7adbc5075688032bd49d0925bc4048826e9db97af887df9d36a52ea17f9e09fbba05fa5e7b62bb401fcd4d0427f47111a687786cffb49f7a54a534955cdb5352622a49180b117ee2299c0512399264c90c30d87f8a0f633cdeca02ef68fe16392841507a619e154a0fb279efd5a9ef65dca5a7234a6f93bbbb495868a3a2c04001f53d3ff114be618b9e96b5f1fe3de7b0448fcb063da80d7aaf003954d501d141eb80a8b8be00c010250913fcf74248a8f6aa7f4c3d64c46fc4ac54e7b579fc70d4a10cc5ba22f5ced4e5babdb7b537145ee556dd93da20fe5e81ce1a0aec9c96fe283e7f436121ef27fee17e5be843f3a418c6fd44ead2fa32cb29be11bfa72950a074b307b759687ec8af90098d2238a13399ac87f888dfa8878dd5527d9cd0998ce849719911f3b6348e2ee281c2976fc43818c6463286bd95045e8ddd0f1f3d8ceafe701b1b6b6049700db030cc08ed2c5d5b61183f511b2b959f060848d0f78dc34677ed4c69e24c115c3821035da38deebe6bf77747d8d667d6504ee812d18895ff7d7c054041dfefcb28279066cf3c6c1f948e1d4649504b323adb3073ce09dd656c23a8f8a07265c715a0974149a9291a38d0d95b32e74b1f33094fd9f580c1e60c208c5932e64e538fa60fee00f9e08e0e3d74d82084124a081dcea387affac9cdd75ef08d7aba36c8fd5b2950d812421f843fe7ca6eb2508c51babbbbbbbbbbfb4709fddddd2184504228bb18a58410ba0799736ec3e80e1db252985fa8ef536c080ac4b05884a907934f0c3d7c62c8f223cb0766621f98f121c9870f2e29d5950d7af3ee3e33d78000accc4ec5f6623498d5fef0cbe801c371dceb182f34f6e7ce4700953ba8def950568c6556e536e889736e896270eb04112ece14d7921ae55a3d1c171c1825b83251d18c9a2e1c53193541d4a066065b176a6e78e2089aade74f17f33c00ec22a067837f062b9451f90095e18b7b179dcb93bab44da5496d4a1961b37c83debb376c56bff6e515b17a3bf4ea2c34277f0f6006dafe8afaf7bddee138dbeccdfab57e79bf57b74077b7f75ef3aeafbaedeb9c615d101eb6ad01495acc63b6e1b9778c6d677301f273c844dfb7b717bd18a530e4564e0dc628068af1d65460541be73c9ca81f042b570ef0ea2ac08d03c3bd15e2ebad0df7158460585193b3adcff3eafe8a5e118c1c0b747255be603f46c698f6396197295b08ed7faddab816dd60c76383f8dbd9055c7d5f8d62f2782178433d14bb1cef674b45e52e39bacc57142315950c7832cfa8e6490b13071aeb463d11a2754d5a10c9e104ce364d5164dfc3e1d78c2d9ee0995b8cfa5e9bdc9ab026768a8469e2264c932492e468f2d4a4cc54932d4462b0a40916177230796a92030c39625067c616ab2d2a28d228a998a0abba659690335fb004156b96989ab1450ff5d53b339f38d4bd7ed97689fa372836f3fadb2008e17747eee4c665e8fd7689f60d7c5b8c1a75bf37e879436fc8deccf2f5f419fefff7f3ff255a281c00a06eef496d1d816d7b34c4d0f7bc425a66a1ed7d3668efc93017f208294fffecc3d7ae0b4f0a697f7b1d128100d8201ad56724a82d63610e8012c4d70b871a0a6a77f703987e1b73dfc27b481235ade18057db23f42921edd11b0b6187a4ec5afc3282720c6bcd39f715738df3b8e49a3ee77b627a7a4b4c52e06842f3a21f93944c6faa3453a50cb454f9b469896ba8422a5555fddb998ed47e9eefa9ca078d787f924d7336384d1bb2a8fd7285d49409343528a9326ac8c10621b53f7e2b69e34f08ba07752abf57d14eaad4fe5229350192232cb4f1418b0c64e80c1c7192e60573b0d470e7a87bbaa9cda4caea4f277d0670c24265eae402538621a175aef91afc9c0ed5d7e0f91898cf4ded6175a5477eb0187ccfdd53e1cd1bafcb3bd2503cbd856084c6ba2f89e2d31831d605542a94f1b99bf980b5144b40abdc71f2f56283fae30b06bb7c450662980fccc767d31cbe4c7852959faaf2ab2ac7c86cebb335d7ba435df489b8a03df87dd3a68cd09b1902b04b4190da833fc80c292857fb0d104e60a0b346082ce01c6de526fdf7b0f7f4bd6b369c49f44e581bfd1b2346ef500a3c0423f4d5857a3d9628a8f6ff581c08d91756862212ac8deef7578f118e213d1bc52bad9078b8cc204ae0c081da32840cb8288171c4164e454481c39d2a48b044f2fb4bb044f37bc2cea17c4d77087d3342bd2e73d0550f78bd662e80efafa9faf892af13de1d1faf9eb0411bd4bf856084cacac9ad1ae570811ae5a8e1ff6af82fec1628bf11e748321a52012a34d0796305981ae61c75901b54e0e18a2f43aacce1b2492e0423b4eb8d20b506854395967afc5822a30deaef7e11b6c8036ba3bfffb543550075f65f17aa0374e85bead1ffa3bfa7e17052546a62b158cb070eb5380ec9b6ce4c56032d0be06fd559ab07013ba4816d0e07ff20c1d186c18ad61999d0ca603d243ff62e17a57071f0764350ff99cb9594dafddf5b188415f013fa0e171478776a8702f7bbe0ab80fbadb34ee8cadd6e50bfab3b574fec7192214567aea41ef281f0bbbc0d5c3d0bc7d754d12ab349a1995031192cf630d7ebe81fe8005a4fe851fd9dbe14ac4d0cce8a6783e09ba13c15fe91f642454b8a4d9482b97da0d88d1d3d33599d3871eac25d33a16818290dacac87643b3648099dcd5ac2081886837fe073b3258b75b2961194ffcdb633a7a8cbf57b3c686efc0c16920c1692cc13d82cc5828d1de8eeee32419779ab1d5f1b33a0ef9784d8e9d81c0c8bf0e3c71d0cdb17090c731d24f8eff00875f8eff00930ccafd0f5ff1ed221f5efa53e47b2c8b1c116385cf1260d463c61d26036bcf0901ff590c308951fb65a31e861e35a1c6df53bc5f1a68e0005ec8a940066abe56e040c9aaafb27b9bbff5c71e25a315595d5a684f0b5093f4a18dda1730f61c9e101863a8b7da1b40bcd06ca7aa3ca32a5b2a14ad413ca5337aa0a5495396160b1c413059a1733160511d6a493a3d4698917565030f13899e198584e5db62998564e3fbca08a820ae744a505edc8e624c585d98649e5b4a4885cd27a089238e9e428d21468669d22108b94f2a6054792622a42e142235111064ab9c111468262caa5848101a98a3652867001a94d1bfa949b934694396b9e682bac493297ac19b2d282b2eab094a02c2a92984ae285293142a684602541b9ba65a668c02686a586ddbd69143a4bc91de7a370bec90e5f6854833effe046485b0b5d92f9a3eabd079fe572fc8af8d9883142d8cdfa7dbe51cb97eadb07ac2aef9fadfaa91a028adda806a83e2ef9d39a1c75692ffbc1317bafadbdb8ce15d283daeb4df8b29ffa1e0a66000f601c6db9a0ab9b06cf0a2972113ec9b55c4de3c15c1c6d7151cfb3b142923db5368db882ad57e16b2b7c3dcc3ff360caa83da032dbf6fccf9bd9999dfb355b2dccdcceee2e658c8f658c5d3b6c6666a9cd602a468e0dbddbdd613f8cf1a31c5a282323f8fefd504610caa11a4a462328a3308b46c62adba3bb3b994e6fbabbd35150551ff0ddd85d20189d2e9959ce7e1a14b3bb2547e8eeddddd19b8bf8c5e9dd140a6cae908d67d6b5e36cd6543c4be7a6bd665c5bb68c1bbb0bc4f35ac1e8749e6dc6636eb1bb4f19359e2c1e3b8cdd4d51ceeea6a97537699aa66a9a4daaadbbd55a21c5df57c4418faf5fc2e89d97c971dc8a9bba69d5922c1825e74b9b589a8c220b374a8d9b9ad454b1a552a936a8e5e05d349e4a7bad6bbd14b49fd150fd0c469dedd4b6535babd5b9bec5821a5bbe0d183b1e74a82afa2b627fb845ad6743d69d8a4dc9a6603cc4833ef138a54c042a1e4fa660d12b92cd686d85d4258c80612680800b990866f098d25a6564349683d38b2956c4900285aa09cfeca12942d37caaf63b03aada8daafdd250353055d37698aa1a151daa46458baad1404bd53e562506d9a45c663d55fa54095425972ae5531db654f9ae15aa8c9a01982aa3762032e54e4ce33142c29f422a9c82640a143960d97658a2650e852ac00d70e80287a71a07892c64804149e988e994f65434fc8c324740d3bae18b0f15ae980acc5ed800fc94a5328dcafc7444e51b98540618a1b3599db6a83ce9d360ab7b827d873e6085dd6c5f052f48ad2d84e7099575a3a4f8e0268a1c26a4546992b23404290d540a2c30d1260a1768a2c8c112a58a25a4292c51988001498d52143344909a801385cc10242696e6119455b74c136536209ac842441353b634e14489268e7450b7cc1310f2bfe0377cebdeefbd08611c9ecedc5d777c6cc3beb7f5c573f177dd1ef7de077ccc8c1423945383106ab383f1e5c31fc318a173c3e8febabb7b97556bb65dedeebff89d79f7c541f884125ebc5d00781edfdd10767b8174580be5a67733cb58f93e3e1d159f85f0cb8433648eb0262614013956d41047881662b8ac9d2a72b083c40a2e9a74f1a60cbd4103511165c608940f411071133c397385942655cac870e424b8bbfbbca2fa162aaa16230a3a83c1a2a414f19970ae6cbccbab37b5f7ba1938a0b3196321e601cc40d5b4084ee8fc3d9a2d17efc917b08f9e518b29e281ce7f9f238961cdfdea674f4413b144dc6fc4dffcaf1dda0e4260421f77b39cb6e71506f8687bd5eb2901f9b17a95d03f10d89ffe59070db7cea87fdae74149a8f7b257c452ccecfbd143362975b96435f883d41ff0d51e0c7b30d83f869d6c7b94a80ddda70102124dc50619c3f605f0288f6498f794e93076a42d574cb625891dd85c5a38226e9961862d42efe55a5c94223b18253d21b26431674d155ce87c50c4116fa248c2063843a8d1cc7c004683a3b1994ecaa7d40027511479a3429d2257b0400921c2402951c68a3441ccf152441633da8a6f9765c32b25c56664a7f2f3484189a76e14143475d68d8222556701aeba65daf800d5ee8a0111e05d2d10b45f18bd75030804998b000778021ca05fd3b486dd310d06038add007a0274dc564bce90afaefe323e84104608e3b666bc185dfbae6db9dee57235d75e213d97febc5def72b91aba770cc6d236bba7478f1e9923f5e77677970edd1749c713e6e8fa08bda137b76be5642e3520d03198bbbfd9abb3f76af5eb9bebeeeee6ceab6cdbfaf07bcc76b6ad77bb6b9ed1cb39bbff267de6c36f7bbfd74c9f2e236cf229236c6a6aea2e3e72faac0be8860f0ff5f44c18ff04606df0778f00bad7b341fcedd1670fede9e9e9e9f159a2ee6648049a0904a9282929e570c43d515241c4a9fcb3f5b836d307a8331fa0eeed4266b667d2d45e3673fa1179491e941bf4eb42e69da9dd8fcdb3a2f69b0354678f0b156affce984812cd4da0e0a8339ed29ca536776132b5f90c149a1b5a88d47e9716266aff6fe9a1f6c3622cb4515bd8d4e62244ed3792a1f627e960a2f6efe852a7f69730a6f6f7f8c1421be5e508a52f5296be5c71040c104b98c024f1448585360a8c14b5a3c24011092355032834536294d4fed7e6c111f3ea88c942698c0c96c6d8394246882545286162a18d2ac28aa7325da860810a43248a0da3e990a02f4c5d2d6fa4eaac559f76c5b582e6ef89239698424817364558a0018b1444dce034450e8e7829979970bac4603ae7933b2e083afbfa1ec6af0500282444d871b96af0d142c49227028b739e669bcee44ccef48e989ea8b04b4969891450fbdfd276b73ff58f33856005769dfee99f4ed07625283caec33033efa75f092527969a8a23b5e128a98dc2ebfef87a4a1bd4cf061bd4ce85cf217233e7716ee8fecc2bf0840817ea2cc62242575db08ea06e87c502a553a8c2501848084179c2ac8ad055104e5069452b624a548142a7b8c586190cb164ce91550b432cb5c9c1a43c7353c9c8bac284c896e385d5152344545a2c7157547841cbc1c2d26665ced4028bcaca142f483a529a153544e2a493a35ac0b1024649164fd38a0c2ea74dac4149d3498244a709ff6c9d4d6aa5c891305652208234878987289a203d511942e9bbb803c50a710ae5ecb0a26894c3524361dd326cae08a2893b6cceb0b0b0e9e2039b2b33b0799abe8fab8f6c8550a232541b2629f17dbc37ed4de92a6eca43b35fffd6aa5ee3cf1757f9fedb6a85e43f3df6f8579f73e6c1f4d1e40a0942e89c4a6b9e723eefd1e0afcf1ee801f4d9332774d6ca21f4d933a70754ce56a7fae01a63db56dcb62a6666a60ce3e674b960ed7a6da78cd099236466666e66665ee60899992364e6661e8a4c99237ccccc9a11c3f6b81d4639579a8a536dcb422a16075d3f6332d8fafea42e8e9bb3a6c6e2912a8d27520a5fbc70183062b8b7c768cd87c55eb6a2dc9441612cc4da6670cb422c160f121933ba28acccdcee0eab5708e9eece6ee718abcc2757c8bd638c255ec619e890e5cc659c9943f8df6f8fdb679411b97dcd2295b1eb3e18f36bbcbf66323ac618637c798c254177cc0b52635e80aa3be685a7cadf33c6853495df672b09ac74b43d9dd1eeceb2a39c2b16c38055c5699c8b42193c2f5e4cd9c1cb7d06f743fb295f7bcd135cfe9ac1b7aa80ac29e03941d6d89d00762ae8ea54e3020b75b402f92b984febfaaac65bd5f04ec78cc90ed63f5b639fc78a764d4e167207e2d3559c4f3b74226308fa7e4e39e9e89fa88612e81a3b6798bb77b7978d9bb269ca28aebbbdacbadb0b8b67caa629a3e87bed88f528b9a96993856475b87553b10f0bf9fa6b020ce32425f46944d0f7f2b5c349c78300accdc11c462b96c7564e3018ab7d9ee7f5c800c3edab3e6b023bad147dbf2ce43edfb8e69c8f3a962638fff2831031ba29469a0602894d8afb97095b68ae0cd7b30d4ff5915e528558aa2fe60d26942a7d9e1512751e9e771e9e2c572a0f1cd7b259fd0681c3ec0284131e6c61aa2ad77e81b832df1a2533513f483d3358aa98330e0b131fbed01e22557d8718c73100890f48aafb4f286454b2872974c839738597345aaca1c1d18cd67563449ccaa8d4edb994d6a9d1000000b3150000200c0c8603e2704020cfc3802c1f14800f65823a725c3a9c4843510ec330866220c8184008310010420c5186a9a23203252fd9050c3f6a66d05f400298636e4abcac614b49f581d6c11fdf36509bd384c70070196da858b152b9159517190d7503e1209ef9015a317532b6cae00eaeb25d81ee2cc0c397c60983739d57220db27fbb64410618b757312eb495f79ab6101b795c7c15fb3b978daba3ca9984bf1c085f85adccae5f9a2182f5133f77904ae705fd46b40dd2a34a1ad9aa19e028c43c4af6fdee51c2534b2f44db85fd45059c2250202daa9894052b9655930c56e9d64372ea12dae6f096ac0446f55c989b5e9f27f86efbf4d8eb2765babc37abc838474a585bd235844daeae89610774f3e6982753a22eb6b82b49c63b31864c8c57de911d97890eae87e0455b851e23577d233a8cbb2f43340de4cb1a898b678ca71ec1d02dfbc9b54f003c01c8c4e96ce0ecb81a51b74a641404ab5522757b15b20bf7c251d95804113f776d24ce11cfce0ff4a1c18647273dc7e2ace0d94062d08bc83f64bc00fd9d3d7cb813bf9c53b02e049f011a38632fee79f0aeb27eb27a50a158d728175fd19a8d29c38fbfcac24dc69a9b61d40317c9ce3bcec654dea8ac0b06971e8b56be374ccdd3512f99717edcf83c2cb9a5a85176a92120faeb139c2fcdffc40125c326d84677bfdc2febc3ef1f0fa6272e4c6e242375cc20884adc72191cfc824bb74470c9b807868ebd39b7753caac6c4134a30473efd2f921fdb6a1a19e2a03f34c3210ecc118bb94920463ccea2eb2b5de68e06703936dd00e66c0203b3ab926506053cc54cad6e0eca7d8fc3605da960c1fdd0742731a8d2d80fc2fab789d141a7e12a86b1934773b41c2bf4a03b3cb03ced9e60d6b52cc93e2a82cd83de0907f3cd2d8341fb7de103425ab4410c44e45c5061b03b5f5f4bea19cb20528d84c6a27698bc80982d1e9e98f273cb4b3225e982b506874e5650a19e64f201451cc103b38756b46f1dce78750c87c924d7708b436175388c1faf38cf9b3cfbc1d689ba53fc3461e9e9189446dea7dce68947e88512c492acc484f7fb02cd57667b8cf4062297b76d4e0710db9599e4bacae98a0e67ea5ff7fb1c89de787122878835caa9b7ba775dd62a0aa73844b6c5646f1626bf90b4812b6a869c84c571e5ad26e3c8abc027057699eb89bd4572c520d26de188eebf66c65a55d7c0b545870b91525273bb047a56bcc200605e93fa12023627031d803fa736077108a05c2ee858be2462fda09803ee5050fdbbf1280a5c6e006adfe47ae71f08bb0c6a3c013ae97df0c2870de16c1f8f3d07eed5a07c91b981625103c63fdd585b318bc74e4da883ca3970c600c761fe19987747a30d091ead9773d32970091463bf6fc6b981f22beb5a3d836d86bd47c38e48cbd98cf938ef16902e210ebb23b88ccb8a1e08a4c2622500722d1e3b881f6edb00b14bbddac7b88fd1e5f93ac0aeb9561d6fdd1971bccf5a6120f3e7e02a14eb8769094379466e5c1c807e9d138b34424fb81cd888c1e86d502229d354fdbee028a7a5c7b1c58586f4516208fef0eb246f158577071088c2ebb42718cfd9a75aba4473f9140bcfeb45198c5af3ea26a3be1bdc40bd53148f1d6d50ad5211ad26e2458f258e6dabb4d8147cab8118ae80f69b278e1aad95bc5d1655406735b4f5be6120b7ceff973e122033dea1c40c12a810cc6cedb7fcd3f96fa95bcedec125eeee9edaad33f7e2182e4dd4b373a64d341dde3daba3c0479674d458b5c473bd801d375055c0da819ce9d8222e3fdecd58f223321b2f9af2dba95461acd91107c66040f92e3be9c7223a1bdb096c8cfd8ca289a4080820861e6b1a07b80b25d370738cee2b337035a726980ac51e67ca4bbf6e0cd372cecd7b2e0c741ac93ad843c906e1859d9cc1d71025162539d3909b8973f923342adfbaac64a12e489f95ed35ca0eb9bc6e6088ac299acaf6e0dd8b6888c2836183538f1e2f00dda01dbba1a4f9b579817d96f1499b154001cc499e597e95014fbe0eaedfbf2bde9d1333c280aecd54b333701354fc8bf95fe42774b1bea148c2dde1f83e91f62fa426fceb506bd81975e60689698a02d51b0554d872e037413d26e0ddd925c8cce9afa7fe408a7b8435fc0194fc603572615df3adecb4c129da34ed0ebc7780fa8f256e87b30f5f4d2ab48dae10be88b4d36eb8d8d2473973b197d4851ea80922d76a130852e6a7e8ab935014803c71c61482731929caa00a419899dbd4c84a30822a051ad6bbadabddf8bfa2da46a05c52dcf2cca5d1f5e4f38032b3cfbcf559bf9603b6ec125135cf784014dace90bd9ea4d52d9c9303ee6adcbfc649f28d59efbd81673031465fbe9b2ee6d2a4bc1f38078d4d6a33d7dc28e025dd11ffaa23e61d94102b61abd40c0971e3c2c0b182a231b65cc0d49ba165c0018565237263a38f01d8a0afc279096967037d41012d553a2a05759050c7d6f952451a20a2f19b36f3f49f505391e2c39ace5f0bb0516d1cb81464601dd896bd125468ae1519118296980b1a318ca32adead0c1bbf6eab9a302045d5c5f3033cd31922dd2f4c4cd65ef3f00907cc0d81c5bde0e8a2f20667c6c38b96cfb90d676034f2682338a4a632c54a034de5a3e900489e1774d017fa4793f5c59e4ee5a8b14a72c1d5b044d1e430cbb8be8ddd741814c8ae02814043ff4d97591eab38686bb7da5d7e82e04dd28286d42e80911d2a708342aa61456f06e5d0f6dcd2439c269c32dbeba7ea89191ab1bf0a0538ef5097b31cf02d00857f31c20060614e4519d3172a8e2c841887d157fc8e4011eeda238a993f6266a5892dfd64ee41e1f6a639d2452ed42cec7744f24026cf17ef6b9866a838aa06633630dce65f9ec02eb55118d2bec3cda3e2af5049ee56077d6e0c5b5fba9644039f661b946448c355485fc3fb9a8bf0446bd5e48186aa66d2a917eeabf405032fda24bd95912b96ad1020b618924e6ee8cd0282c2d90e1b614ec6c2dc198b90900311f7621881f400ccb46d65a12a97fd200c47c2bdae0c39494535827b87c1e44a6106bc039aaa2d702ff08743e598ee59758e277bdd03e586be446258d861e5b38bf44200d46647337aee44fd5232ad4c84bd2d412f6427b719feb92c579e7b564d87294e5c9b98d0f1653a39e7b0c7bd5ce44c3382d711aee58638ef789d2f46ef2c53ed8c18abb2b774106ab022502449f7b6ab72a16ba16883f907b9bc40cccc3474ba38808e08bb30be7fa8c67f9a90fcaf2568f2094258c8084c9f096faf0a9d235662e2ce70989ac2e55a4725b4d22bd7c5a5f7232682f2a8a861a16308e470f5048eaea0b2d232ff2c449a6d3e24752393f3f731936f2287e48b916ded9e1860678be8b363f09aa6d203bb3c3238cb1593e97db9f9fe844431eff62c9d5321637244f13f8da2ac03a466ba5f4c21559801b4bda5ee636d0efbfa6f39a5f66e080aa94ffeb63f43b2111ab1c8832010f4b303ec19c0e42ee6173856cf0757c2885eda29f6e0b82c18193628cadc197672428ce227f9822cef294b95c678c6409dabc51cdbcdf3e402da41eaaae8f2384c4dbbf7b5025c70dd18c088becc8cabbf0a32d2a1069062d4eed56453f7924ce0db231d1460128a7ba2639bc0659d313bb7c0420555e9c9935b08182fee085040ae82c6ea6ba348d649c7e9792365c4314ae3b366f0f38ac4e116ddc17f79dcc270e5eb7d7c5b61246ea2d7d17d4e1f3580be8b272e8ba5141f6f212f721ca3de0953367d196483cf5473291330f800eba604875724eb5789e6b9861c4d203ddac5bda3f589beab2fc4ee0be0cecc77d4cc07fce793ad910ad66527f24b3a28b8a01f4b91251bf2b46277fccd45b0bac231bec5d9b009b223d1134d1c24d57deed612b4277f4dc01ba4b49d9f05605fcb082f6edaa0dd7a36427988f501d1fdb43c75da33ef6806cbbad532102b5b7ed80c11cff0d702131b5cdaa2cd6d77a90191eeb30b2dafbb92e74bc2450d5855f853cbf44be5cd1ed2569063124bbbedeeb9831df0d26996ab6b1e5fa693d8e0fc7a2a687f18bd403bb8d45de47391db9547eeb80a1acb76550f9526756bc6db477c076e114f2aaf95e5408018261420e3dd0f531a47756fe131a8467285e4eb071778278b260f571b4b5745103167a04e3ebb422727623b11aec4fdbaa64a1f9791e97b74dcaced667165c7807aa4b9078cbac5f48c875ac26ec16d82a816312229a9f25f9d8ddef2e8ffcc61650f9775c68beaeac75300787e135b76a9081026fe4560c1759755dc1afa61b9f3bf3f939924df966737ee01862bcd1883e65ff3c44154c9551373dc60eafd220c13e606645b63662b11cfba660d19a584459f1617b627b16eced199f4eacc3ba46822b6207e02b309c41ee97238c81778a52446c6ef1d016f364ed8a8f46d17b266ee2041423767a4b8ccbffc3a26c09dd04b1902793addff2bec5de84d65fd59044433453547dcc5c6388fb4b8af3a027425033f5dc518a10f7a55d3631ef6d900567a45c3462af26600b43f14d6e891e127f620ee35b62f58526bd93c56651fa1effb02bb36be8d904a64c30a224e271e9a450d98cf34b825ce7f88b0800bd6367fb7396ed68335d50d83d54f5fce2309a020288ee302d07ea6f637c0d2d42b0c9ea1b8e451c4559c363d7adfb643595368a3bc00c86fac60edb4459a11f82a5d728c18706acbbf0db522f573d0627e499f141611b8dc7c06b58b14af9b5a69195a166b5efc2a08fac6fb1c14f29a09dd2cc68b6bcc5fbca18a8adebe8d5d5bec3cb0df4f70a3e8c4189378164db048db02e76693fadc48cc6175066a68f4801360fbc7a4eb7fe74a011339ade4a7e8f7909b0b304e4bcb1fbb8fa89866b6ca91bf28726592fe452d250f320130e536c22110ebf425a27dbc64a85f9e631037bde653326010a695350821ca8b694a9c273d7426b5501f06a176ce640e31d1a1f1d664acc6fece445d4d43ddceab238971909ae445a6395188dac592202b98e2a4e52fd3e51ee5419158bfe39a8b05b20386c4360d4879852df470d64aae2f4e115de59a117bcf5485f84bc9d31b7a363e86a9ba2a24a22c0a5b6250c9a3375563cb752cb719265621663e46c79ec2c31513b95d77e054ae055012c529a20f5fa2b8cc7f113f5e98a17eb83364d48ef1bdfa6da9b90f8a0ead8887fbb27c433404ea69ca35fa11329cad0f981332f47685140a87d736b9b295ff6a3a8036468910e1d317b440e1cd476247760db732dac0f24b76549c50f3f37e5fba4214103b26deaccd0c4241f1181483f044373fd9784113ed65f85756d75d9cd66d1f1d5c186f7a81cc0e0b3066abca5ddb430c06fe964683cdabe9ea4efd598e256f07f77b6877134b8e7ba8ed2d0dd8077920e0086d827d56f62c74bd4332c6eb118b3bbae953f2b2b8eb95063513265e348eb33cfb743148fa99c431deee49bfdcb3dacd6208dac4bd8909356208f6a73d8b6d5121bf11652cd1071bbfb7a7e881df84bf8b3b850ad88badba983bf1ecadb83a06e3494801276cbaf1c9543c75eb59e8cf9c86627b928e440caa2f300f7ba7d2e5c2f9a6c9ac5e5b01ad3f099eb4bd4828e4052e4ccdbde53241a6685439a9f6bbda5be8e4cca9c5ae3949bddb5cccfab563500a6d86a3aed0eb3c72435777939742dbcfb5c194eb7edd6ce9a4f07ee18d46b85f8f991d72e462f923b5737566a585053e3ea7ec89224be893f83f6291d4c59d8d28f62374daa93198fbdc21c8e5afab573dc5519a208749cf7949eb1872325a3cd6c620ee8a2c83d0d212484f8abdcf086eddd3e5404b680935ae8f93ad57169165c1e196ceef505c37f22b984bf27d168197165848f8f6e19d658917d76d9e65bb5241fb44a22a29590ec1b8ad18cbd414612d31d97f514ed301c03b0609a1b865a7b34a0ec72d8d69cca0cb1fbba0422703e4d0a98f988d5a09662fac190c402146fc040fa82cf7b6489ee51c581427151686513aacc4269cf7e7ed1aa02940b2f82116c2e215999ddc40d3c74c3613546b5b552898b6f52d2c595d21cb26fde7fc3953246d60bce805bacf09ca670d4d933b2101b2ec13956dd636cca05a2e70265241c07291afc1a8c34ddb044452378c7ac5f96adaae4f4d42c09fe28e40e0368ee1d783d50ae39be7121adc52895eb83da179d4f85210d50fb7a359355688206e56a22a84e8ccbd8790a2b3759d6b52e42be7f76957287d2fab5e5e825e142715012a7f88971df552a3811539a6eaff5141e7859c38e2e1ad8c6b7170dd5b4cc451217ad079bd9abb1e958af2f385668b41dcadf615c94524aaa04277ad88c28ead2ced9dda377596db392b2ca302d43b570b645861aeb355a08c0a51ef1c2d94b1e2b9e6fc069664701fed59cdd801d943d66a3ce34ab38540df9ecad7a7cd7c9fe0c26639cf5ba1192c507ce755e5d79669058eff0c3524a345cfc7f9f9741f26cc18efec9b98b95842c2ef6340abdcc2f4f794d982b2ea0d92089309abaa3e13a60b1e4aadd4b6f4d33892666a302a6b90b8a3bb191be5ad83ec6e4d73ab1cde4635b0119b602a0352d85704f8fcae13c1615dd1461bb74faa68bb503070e6d68c8b4ccf2abbf917bc65d8ee7b12a886215791ddc06c7d462b1a85a9aeb83cba71fa84c5ea1e4ac5a42ce3811e6217c8fde2448c66f97d92b8bb5841837d3677bf8411d9c8b5fe96e8610d767a7c099d7deff95675a2f4aa2459f20ba8597ca5b6c6d4d9397766de4f2bfe52b2039cc8f73ec6b1ff7fec5e2fc915591ce87f0d48306bd972ed18b56c5ef5e219674152dbfdffc2fb2b51d440d83e38bf33405930f3e71d1b6863af448d65d5cb16ad070c8fd19d297534a23efc62ace3caaed980f1639a970518a5b75f77cd63294b2ac90b294381345f24dd91f1879a4299e881ee52d880ba3d32194437e133230a9a7bbd01fbfea9a703e41531e7b507424aec8e843bfc82185aba8cda2cb2985dcb62d1925272523c974a49f4f79b3970e285680cc182b7074d5c95515f41458d4c201b2800733fee7b53770e0e1165fb1515791f743383ceb925890ea0aa154226f5bf4f87204f71eaebb4712928d0fcc365c91df0eda64f3dc920ba276c0c1256f7746eecab4444ebc2ef611ad764b59bf0d692b1726fb64cc5f3613cc43e2af4b48c6a70944a427e54ee60e8e8f4a975c1580f6f1570183d7a904e18c88f762ce8f5c4327928c6bc15142d3bbc8c888d7d65c71dc759a30597785e7f8d56e23972c968bab4186e34dbb0470ced4f68d32f51e400221c011cef7c5298b79830a7cf857d63380106e41e402c6b79e00ed8989ec30710b3dfaa5a20533c34dd18faa510efce4780a377bd26569d0fcf6009c11c8ccca8cb5ee6e05544d3bbe1d5c34dfa1d0d6d4ced213819d9ba6d94bfdc8154d9c08e0d1496d112242acc43435b01d972635497fe3e99077e101a52b2fd48749ea1ebb6751dcf59a93cd1c4c242a157d2d1094ae7644f38107fcb3b716fa26c7cdf30de060f5967740223006bb606e3b1e7a9fdc5a0c6a6c2f957bb4b495f6540151864c99035d24330d9cd446a06c48f373af37cc9b4ca6cc3d177c3ced5e30f3400a73f96be58ca4d3952651b9fe3954cbe861a85e512d967de4bd918a38af69e9531f46ffa69226c484101ae396e79d3b3e6fca0a319666c27acc24c8409650c4f967d27aac3498c12b0f23971e09aa3e7407bbb843b60d75c652e05fc37267a1867515dd13ea7bcac01e1f1de25109343e5ee1129458d3ce43909f16f8ab6c9bd9dd82a41aa34811f5d3e6c23026e38fae41331ee171ab33b4d5172cff4293dabce84d4ce6972e70ba3c9d52549fafd589d5942a05b0ee315be1deec95becf567cc48520b7499d3098db190653426c63299f99d8746a5a74104d4ae3f79c83c8217b3e674021e9690eec7e77034d3d1bbda8114af884aeb160030f910c74e263c6382d0e6e1cbee2d67c5b6204b130c45c1c8271ce88c4305cc14c6c8497268fe909d10b383c5042e591bace2e78e1293d8b4b38e8b7c9f90901669b8c14c22528512164190b293e40c4d271bbf8a503680e2fd5ab86ac84178c150f617661b08df7e40c47b93d58c927c258479a636ca8ac5e596c3a643d33fb5e2226b76ad0e4b51892b06816cc1a8f3b21cfdae043a2cd0e5a0b9565e284bd4999a07ff7978cfb9f402cea5e60cb251b8ac6c972db88718f6860436960f88aa9310e5d424121d8e8f3c8140918df1fc0353fc3167a464ed3f8af69dda0f3bb726d53d4864a7daef4b445b7c67b127266dc8b4dd387b341bafbfaade2c859e32ac41b4122a66d69324c7c131f853592dd39ac9af3c2e9135581d777540fd4b2462a940daf7ae62c098d0c4b7b405a718cf4d624bf0afe579c61f5e7c69179ba705c46705d34ebeeca35515f369aa06219100223165e996bf64e78021a280f5f8a01094883df205b87fc241837fbaf195755fccd9ed219e73629b86238b5d91ac95e8dae582c7f0b51200c036c91b981ff20282f8a94cf6cd5722f492418b12a295182f3831244ef8cd14f706190cf5dcd6774fe2467e688455fbab78ba344a484757e6962b456b76ad4ba573a5ea4d1e649fd90735a6b89c9c7ce84c65a7a5a6ec33e34fa700a3a53718bf69e10b3023c25bd429bbf384b2c8486d9398ea4f3a55d95372002fc893659002545a069c229d123c59d4a067fee66f9cc187dc98c26c73d8edb4fc1520ecbd8ee44a59f880092112de02568585ba76dc98b1ea381b2430b720dea411819b998b049b76a6ca3957037e5d4352c8d4968605e202bbd42478902133ff06ecb392c3cb09ddbc14c033a5eeef212cc30c4d8c4d6338fd3ea84606096572b857aa781649c226c5caa1c0772ca46a529004cbe7199eb90d92bc9e27b62d208623f80e0ba93a91126b7eae39a6707012f4dd7aee4a31f53383699bcda162591897823c4cfe8996825187c5812054dd039ca28396b35e9f45ec565e8b28243ad710a828f7a142cc5f5147c8f398bac031295d59b8847eece207a051433773902ded201be7d77da93c7a93447e7005ed2325141d5c1c2b26d7735372b636f4456938c9e4a888e2636ca49712f51ef7b68dcabb0bfc3438e0b7e7e373956c2d80934eac1b5a151e60e81af18e60fc401702804e57b6837034f3701dbab261c443834a243b105498d120e84ed1652a9d1075f35864ab15bbe6a311a9344cad02d79ba2656f7effbcffbcf5f0caba21a2282e4dcbf5eed24e2cc3ec3ec8108af4943034aea5a668f59b116b9e923b68e83487a8d00554dee2f4bcee95e04fe2fb5e8cec4dd1f4f16afc28a4ab266a347ee2c580fe648e0634deb99ebcef00da842e1d298e19b51b03a551b22bf2c204154ad490ae774bc99cdf3e2f275b9eaf0f84a7be94800146df29540744d7e1614ba47d5778f8d883b0fa20b787b1b1b6acaf77786bd9da362b342836be41ad4812bc0b826677982b07dc3acafe7af056d15a5e449d20f3ada97bbc4c1e565d372eeee7f4abfd361974f450c56b63a86bc66f2c0e5721e9337063ed4e12e42e454bb95761c08dfedd889f058f5fb00064895a8a06b8ea05f2476793f799f82d5784b1d7f93a612c748f41bca8faacfdb283ea5841894445189b3ec7b2dc1981c60aff5b4eb484b1677c80a365ecdbd240637e169f609134611dff9264dfb6bbed5e28e8462cb217a646c69f12e6941a612ce1211305772fe9d35cd07ae8f8ef0c5708012a285e2b44a85cc70463a12e964e4829b8f2ef2b3b3f9afe5ed2ebeb4c7f8720fe968e6babbe05d28a6d9ae107d872109cc09b21a8a0ef9516ee90f5437aa2725d87b61e5db5d1ae39ac21bc013fd89395080f4f1bacb7181083258546b34ab245d119147b6da98295c31e9c58a826cd588bf8d4aec66b5a7189fd956015dbdc7d7b77bee2dc6189c07a3da1233e3ce09ae421a179c0151268c89903f89ab4eb3b668884e1423859aa10a7d13acefbdca9c100eb63025d9935babe943a548635a9bcee3361a92b118150cefafd23dc3f53634d605e7a904afb6a59597aa5b309115bb48f13eeec4857876bc66fbaa6d90c61629ec8d5a8bae37291f7957ff92eb9328df6cb84e19b669a77b986f3af99f7d680a64c9149b2898661ab69d0c9604ba551c8c26f114760bb3daa5b8e9782ba60f0e970e2541c696ebe4186d6fc0b9e5a83d35dd59de3827033b9766c9ae0e1ec9672cae38a6347c4a48cc0f8d943d304584a6e269f0531c7dc8589e39a79cb9d39599e9281cd6f59c4514627d80056bb42435a0f19d71d13e2ede9d6ebeda953182ba7fbdce4e47adb1a22b90123f2ca5cb0b3b72e8f4a47341f49dff7402077793bef22c5b8fa535e7599e2d160916ae3bb8be73cdff0cbaccc9e7ff48130377ce5d2afb86e2219a0ce4bb3361b616a6ac5a052a58cd359781150f065aceefc73d0be2ede046e0b7298e5ced671563e40ec4489894707e5037c3366d0dce8d228be80f06d95f086d9e49ab8e5dc01d5d26a9ec5958a2fe072e5ade18d735a8128ba9af22c46be2e57b3c11cf36e97e31a96d2e0913e70fadad2bea5586ca2688449db37bb1af17e2042e2499ca65519ab9a9b82164a86017676aa845f9087b7fad80718443910b9067453a98ac1d8fd0f814a544b80bb1a53dc18bedadb5898f66208707d251bcf3d9bd307b0762d695cb1ecb498fb966ad17458a65285605d91d8b7f6fa9fe350fd27c0fbbe6cdf473c4e7895d1d88b7dce22fea837fe7a52e9dce1a305dcf99b70b0ed7036a4389cd0c281908089c3364bbab3595608d4ac8817afb30c3f3e1b70de12d3e05ccf39d28e10b8d75c59ea2c740fb71fec4c411c8669351b99d67664cd5e1c3a6bb36a97fc2289393ba64303ac58d9de8fbc42df1cf2deb392d6c33adb3c67140ed03f222b9e8c15e9117bfa30c5ba13a8efbfbb0253b4a29adfff19e79d3f6c6466fff8cc50a58cf94aac561ed4bc6c4cac1cfb3049029529f926fea1cbe00e6427e441aa54b47b24eb95a29e4f17435cd7b7388a789de62370cf780e0475b07dc567cc3e7fcd98720310ff242c2cb961a2533c06204e9dbb0ba66f6d07e0b2393de39a1f64513253e5e945551e567dcf03b5bc2ce89f4057be6f8ef955453bcb4feb229cd4e39f1e16b0a68089cf942ddcd7f9007a14ad1db7909da810b1f42b8b1a8c241c1b272badbba7ce76adb2a3a6977beff6496598db92d761097cb9ea79886075cb6cc0fa725f095336e9a8b0a7fbb209a436ad29cf4704e55a6a377afa137cea20e4900984537f71f2515000cf688a73f266823827e908693e5153373bb9f5ae546da0c58afde90b69619e6219526bf44207b10187276ef931e134050f8d0cd4c5b05c5086806db5217e72c8f09ff8c971180f5f674c3c19f8f91b73d425a3077f86852f1d6994fa77e978d536a747c12d72fad5ae05d8d52150b7b59dfc20aaa8a4c7b4a1609c2acb9bb8e3d2a3d6cd92373709a60a354ab0e7eb1ea094b953858401005a728c1c0b15ef3052ea9a610a48f70408d563fe9c2dca5545e87f377c4d8dfc4caa9799f1a8bce8469dd4d46ec031fd95b75cb91570976401e0fc5a8ba7fdede5ae2a964f30071667ec906bd1d454b1b40df2d7e0130ea806297c0e1d16bd1cbef5370a00a5835e9fc8b50dc710dda51caa54643a66299e1156afc1cb3e0ac4cbed84b1b9f86bf07097b65dbc9927184b6b7f2d87a0e236984f2b37f0a5cdd7cb6024b79e851191d89b9f884aa20fa7670d38794172d8583f64c0cdb1e36830046208a48d265b4d423cda69408ad7223deba03c3f77a011cb7967b413ac3a0c0c774cf262a194badc9ac39d71ef13c2b691c6d3dcaadee41ff9ca1e03cd07e6972e20b980156524b370f4cd05ebd0f65323b4257650b430bd0bfeed768ef71988fc529d5ef2a156f722f37d86b4b9e43e4f13e33e13300d481e04a270582383ac07861b6116f87f6085c5499dc0aaa3e14646e63940e4def75c6b28339f837b5314e92d22fcce72ecb84711177ab1df87d1b781e3cd4a700b8dec1cf45048d9eb12b1f63a4e3dac76c2e05a323e9a1e201c20214b0b65180948de6df55f6ed7be2ea620c6ab7d3012eaac8b73a209375f3833029ea65e3c95a4fc8dfbf6223ee800c7ea4d432f67738d72be278abbf03794f1c08a31a076a60d84aa33f7160417b219f888c3ce1c49cc3913158dbb8034ddc0d5064422133eb78fe4d881250048402abf2726782ef019ebe280d3976aeb0b6a3d870bd10ed8e14d5470c8492a010619dc5c1aac93a00a93d18e9981d6b9577f549b51546d0ea2a88217bfcb479aa51937bd75c26fc7ff096fccfe213ca0037dcaa5210fbfcd832a40b81eb2342212ae9c67ec57366ce7d7147144c2aa8658c8391a106043efefef35a0837203f935fe6a4ee7d6bb086baea1178206a6ad00684a590e65c3526a1339d548b10f9ae85f2442ab2e45d74d4f8b87a7375aa93ca1ad35b9a03684ebaf2d346872c38c1265c2cc7b179a6c770ba344e1b69799d8900b709c8368bf3174670a1b82cc6a2d5d55af2f09ebcd01bdcc301f6178cedd7acc0210c708f75dbf589b2a7392ad1b7ef476c0f3405f7451223d13350a11b2090753457a0bbc7041b12db24621f381adeaa213d3b52b99e0932eb71e06e44b8371518695076b2566e505cefa35e19ea56dccc2d52a4cb04ea812ed7ac86ff91c2ec3804fec1cf597828bee5a924157c13364e061fa67bf28880cac22f0e8e0704627d82ac08dda1333418cb58c81da5dfe77042cc4671888c85b8782e4b3ab60e179a389522fd8bed9f5ea085706666e9beaf4ee804e1ace18bf679263d83a5d3b9feb66e2d191b2baa60b7be2a6c122c41873058419ef28bdb9670461e349adda293e22798cc278059883f40499c088978ef086a18bdcbf7442d7a5cda2b908273f2b79fb7be5c615a7313423964fd8b51b7fff622040f8048e48633b276de6a7de344806a57ca1d0c32e2022440832e410bd26eed38b10ed8d2db9538fe1668109f537ea4d76b1f750678d239d1bd549cc92cbea319ed28cb3b1895d79b3bac9f02c570eddc1d3696cb8198d6ff85d86df14fb166d12d80ab43335ccdf1478dee68c6d914cc555e415e21560420c3dd7ff47b81c73828ca9414d805d98984d61945f19384572bf2dfe0da3488b7f018704a77de187804b48fbc25ba7ec0d3c53203ed29a805be4612f8ce11d17a89c77f31c1ea7b81e53a010a57c40eb3dd9cd3438d335a1f4b5d8571437b2776048ff07d36c0da1eb7caebf9047b5cd5354a74253d60d1eafe53339e836936dd8fdeb35a09f9c591ac55fdca0af3a9c6066a4c5ee7120507200e7d793f209d31019c79ce0b965465ed07ac91c8669fee2f26488e1d20a288d5eed1aa9674e5313f3751a4d291d5806796a171f347a189044f7941bb2ae2308f7e9b4206e165f016a2e95e2313bedceaafc4475dc66cad929805a88cd0bdb84a55bcb4c395e0a950082ba20f3601cf7ea05e3f7536af45f1fa01ad2b1618a38055189d406c06ad48a1a483a91ca48874f9e26b3c03487c8fe81f9bf22326a95b2dc469eed617734071f71986b8237c48ebb74d702e090bcda5f87f35657a3ba9bb52407da106d1c035546dc6ba8e4c87bc169583cc701ca819a28b261161f58aa5e6926e19862f59bf201a39a4afd71fb658dd93b11e2f8aac96f7ddadd012a9193a18d69bcb42c99d06ed265a220d7b343a6a55390a59097f805104cacd14e4fbae400a46577ec0883b2dc9b77b52d1bccd51a0b3d86763285e4e5c68af07be8a4ef45e050e1063e8bb318acfc09c860e8801f2a00d4404715b9ac4482dc694d2d2a7c152671145f57700d00fe482c49165a8d69d4c1a172ebc6fed06e257352815cadb40ead3467823c9278e00f214302b7c885379fd05c5fe84fda35f5fa0ba755175d9cd2696971be19a5d3c975a4f6eaaa744a557af80bc072faddf52a10b22a71797428598f37b1167ca074fe2a00abf5b0b4cf28418bbeec296be4ac6ad74c485fa3a992f67751f8fa5f43c920ce486161ebbd79bacd11303369194a5b59b278ee37e69eabb45cf7118ddb3d4d0592a05079f006bc8de3e1cf8dc4ee42197fe1d1becc6de155d6a941a050b7a2994e2ed155bbd3d330cf5a5e51471538d203776deeb260766d97054c198623a9bc1ccf8e4259453f6b2f89d8345a31cf87576cac5c20079736175fd54ce44518c86568a988729420d822d006b475b3dcf8a4a625650e6d46dd7383b4b60c8be4fde59f2e0ff7d82c5d61c3a4fddd5917e5b67a25147f4f5e96022a27b0e623491b78a6c964d097ce5094213889b21666946dcfc0b2343a5fc0134019dd6a10f75bc41a385e0c291d9af471b7d545304233167f476d5f1cb773c92dee8621ab0e158a6a7ab9ce12dae4744b9fd3ccfa3aba2c41e6d44be312382545bbcba52f8cb6f588676d716e393576270598ac7529cc4a538cafde22d2e9d0a72f16a6e0c07e0b4fb11e4ab320a2a19511833fc6245c96b6414d107e424d5ec3e24b71d96101a7b04d733b555a2929551e21a69d67d73236625d37d28a4bd1b50c3f4ee51b84f3d3075527172cf007a9843f7a321dc7fa96fcc46b7d078ed24a4b9edefa198ad7b60e0cfb84059840ee42fedb227b5a090dfb005fc9567d871953e809a0db2a634a17c706ceeb29a8031dc289fa720f864ab426161672e612cb110e9a4d62d21a91f5322af380a100df62d5d8c48c81294647b7fde3765debbc5c7d624ad04d376a5974aedba5738eec6a2dc74623d7e0f9da4fb87b944b94cb58a551dcc251b861d900357b6f86badd8bedd66eccc877d1d9536323c8cdb5d41888b06c6b5320c1fddc310bf011808b3b1e4b2f00b0855fa17762552c9c41d074ce54f0d22adfac71c165f4e18277c8f0bf9233fe2139766797288743db014e5a4389af37fae0edd0b358c8fb4b2a201308ced8a43a0e90648d6816965a54bae4f420a5236b86b3dfa3883894ebb9af95973a2cfc35f017a1286355bff9731e2e24a45ec19310a0c5cef3d2b09378ffebd28898ead6af2e8e509d2a7433dddbb894d720996a5a517df632e8c064721bc136749c75ea9ef8b8b45aab81be9552da13af2d8b9f10d7c46db33385e4dbbe6b4690ad3b75ec93fcdd7a9b1fc039e539cf0c0322b2ab21874c9b059bd8e9806fd724d136ebbba50614acc59a0fcda87fb60eb4e0acf7ec375e26c73b20ddb77442bdf8c61bf737deeee4c1e59402ed9f749722f6adb04d4c5ea35ca087265753970c12a237bf4eb35c03a8eafb7fdd8cfdc73728b4b1e255e8a40158d64962343f94613e239394e35a4806c23e23e42800d28d5212f1c3ffc61baebffe155e92c6a4c37b60f0ff9a355a444b314fba88c1341442b688d8373a77a49d0958733103783ab78aa6a11a494910313d9874ac52aea89f26da50f6a23903553489790dc6f1c8237538c82b6b920e8893dafb97629d0231f4bbd0811a3d1b4b1122d652383009470659b59de68e4ce6a4f3c6813e0243b28b0e26aeb07cd8ae28b9f8fe7c64280157758fa2cf510e6104d41610cffd07fa5957659c055d834f0fa4aa513c06e9e6a1cd42d6176d447984b2d20f54f0164de7f032f226dbc8960681b80eaec135f7eaea08b6fa86fe1090d14876d241c9a730942b00afe93065723a44395dc37f5952c1f3a6d718319fbc16e4952c6628850c994ff5a44f43cb481cb3543f5988dd2307f818684e93230d4fb45c8572b411d7f9e1980653ad54d2d30441a58718aa346ea560a3fcbcee30f493931451cd2b72697f98b46905b31fc4283a7e9085b79f7c5b27eb2baf7f46638f0f532a7c13735a23db2fe96be4970d7327c2afbfcc018aee6932cf2683f86e74d4a2cd7708b3ffa92107485a96b33e10ebd9379b687c9e98f1e8b44384d45df63a3cfaba1d56fab8ecb224b4646fe47cfc9a5107f9303ca62cb6214617cdfc59b02cd0e8d47fe8028912db7fbede22c29d0f3f154c8930686f5a3a7f6072a4b62cb5741f30f708e39811d4d2a5c7ecb496ae3fc2695974d309a4ca30e95abaf3ee978e7e560b5b3ab81a1f4ccfc625dc294a73c4c319e9aa0e16a60e27e14c9d98ba0f3df558c9a0a79db7d0ae6eac3bcbf14941111076b61ca76ffa3f44e1098ceb3ed95bf87759dafa15a17d452d49112c6e224011f5db454dbfee19556776674e25e769e9f12c23442633d70e3bcb2d997ab20b6b9e302abdfafa79205badbd883b96b0f2dbe14a998964d5ef785ff4ac39ac8adc41b73b8e78ebc792dec5d52a58979b7a8aa87b860dc4efc465f345a847395b64e829299ec67b81283fe12cb14e53aa9facae95f5b99981be75de19afba2a4c555fc0e8ce012976e95ea9e7c4dabff2b1443e96232014ba893c3fd118816d53f7e764dcd8b9371851d79d557e31dd41b235095aa84d37de9d3912cd2107a7edc1265e981213ea22c59a02bb7988d044106bed6f65dd5eefa9972e442d38e1832e6ccf4631d8ad425ca73b235fb775921cd0454acb771cbc8fefbcebde3b754ffb19ccd7cce32f841ef02c94bd51906844b218fa290b603e3f38a0c62b3aa674410b47524940f83b9663102fe180c2e95025bce7ceec40a6f2a9f23a90407badabf850380581b727e5448409712e00a831d938bdbad9d4977014bd9c4989f3cf88faba663ba1a498704ecb9cdf4e2c194cdd0765ad9b01174fbab455e211e7cede2bee0a750f12753561f12f2d842357e3db6d6a6826f30c8329503a0ae771cdbab052a4e739b926714f26fe6802419c66ccd843711d6afa73a2227cd5e5b84b17e728abd5506be9144006f7314103e59cb0ed9b1d9c0786132360e1874fc172394429338e0a2e1fb1350ae59cfe358464cdb861de16b34bb9d03486bf12ad9eeec934d58a9c93296fc8d1e0773954872019fb410ba4433bdd9a74122020e2a67987b8233ec68735060ca6b4e8e7126e2230a022d3325a379c0e8956e7cdcadc851ec7ce336ecb1b1fe011c7e401626fb49dc9c99a1413456b39916825268a56f22792f587d82b1869379707f0089a8773f87e61280ffa3aa1b2c0658ff7649b4e3f3e2d7eb42f7a9eaa9df59c6bb613a11f7cfb7fad35492df1d0b92288dcbb8e2381dbc0e5ecdbd2f4db8eaff3e383f3400fbfd86df6b949fb25cda17904e5513d0e7308f524fce7e5cdc747f72071ccd82d35e8440f3b9bbf8a547d4380266cd5c96b025f4bd0b061a0d5071358f35ff71d577c620ccbffc526a1c403af911f7b6789ebf144cb6d29323d787575d1b1900022417dac8e3c351a287a1bcded5cb9d64426eb0ff53982237a03c782dce8eb106e80d728002e34a78fe58cf242c182144dc1fc2f6511e93505a2688a74e350cd68c246113f5cb7c0975f3b91389e287b7ac7ee43579cfa807a1b22d8825c4146d36287adfc1c8200215611fc5ec4221af4c62c56b4b0ee9209c098946d142341eea0b6a912d4adafbe102899c8359f631cf631f0081c05c72004d13d089bc03bf9e1059297cd489d37fa1c6f0142b07ca87efb8a49c4acc5ccb8fa11068fedc6a1c20250fd736d1a6d08479ba28939737212b1317cd9931399561d8b142ed6258d1171f5639d05f86920eadee17be5f6fd9b2ada99e588e1c9548e2b48e9e2eef05314018420ee91e5caf52223e231433fc3dc2d34f000ab47c3779e1cd80d5d610ad50322e2d9617955929cd0d7d4496abcfbf3ad072f7f710cacfbd69c7d9460644d5761622dfa2030026902e154aa0da49cc0c41986164f68cd9896ed97a6e534f74984b39a9d18791c382a822fb5c213d51158d1b9389122494404617cc138a4bf3e56898fc2cd961f9a308e00e87d1249a9d15c66c7ee5fd5565191b1e4387a87b370b9086901d51b1a25ad8556d2bcefcab126c5cc2bb7976a8abe95cf46526dcf7bb504a6fefa21b44d482f7393482b966a194c199049c44e25b74da5f4675ea425f636be71ee27ce65ab06abe3726096dc47f56ff17cfb733c11511f4f66837215f5375370132f63e4966e442583db395cccd860407c12c74fd801f187954fce4895e4ae84fc96111f4e5d706a47315de11b2a43c492b08234455d399e43bfca4e0260ae483068043fd944f90dc3a2a415dd7bfb18013f614b13bd2b312567482847f5fd359d9ca83c12c88048b345abde50e587e0d29aa5c9bd09e6b40565db283c26a7417cfd1365174235a5440a3d1f751f03f5ccb567513f1b06c1b6c070095b07ecb539c024e8943008e24f67cd415b6e470908f25fc0dd4a5dd2d98c1c435c619f62c6fa037074185fe5d8e9f8c17585eb865b37b3312aa8d03ae6292ada8c6d212e13a11bb24d198cf010d6d9456eca1a9ad0561ce0ca784f66fef4267cee4637fdfe840d28d4ef1921f8aa360361a6fdc2b82566ad3cc0c884e856ca39ab6fcab21373faff9d5152ec111f877a176483ddc0f93472d1d9609e8318a96ea34959c34bc5d2a064a7143600c72773ec249dfce8d8e0dca890f65a4d2cfe14b4ca7c8a660328333e51eda5381c36835ec88749efc08f1b2c1baa61c77998828e245ef7d277779607ec8d8fb4abc614deb8da3b10221757712aad52193348ab7685ac2eaeab73848bcaa44eccc6f235fd801ec649b5523ca5e0c12cd581d3647b0ed363c91b88b63e53b1f9b1d00fb9904f46412dbc96632e95c2687dd36af2a981b1fe4d3d886cf01aa560a11ee536b3ca339e1adf7183066ae9e246f7ccc8f8fed5cccb6946eaf521bcecce996c1abfef921c3087b843af559d72c16cbcec317b005955f92a2f9f59ebe7f7a4ab3840edf2bbfbefd7c81ad55f97efd81d5dcf2afedc06dd4ee9c93ec1a4d9b7049ee34d9313ef1a82e7e42bceafe8628c0600a68c2d407ce77629fcc7f5235a7c5cead76bd3f6bb0c7a04b4c40437f4fa38ca012f013f1f63bf9fde21d537a0302268e93a822c024928d2da9f13bf8439def5b4de7998f54b111b6b2f4ca506ce3aed54e21b83684837e99f8c0e6e6f5221c5da82e4f94191f4291a38c6e306a2badc328720f988df3f151d14882180f0eb0a501193a5679936e8385bf20970feaee2e1dc0fabe15d1810a66748e4e0d85260ddbc49d2da9532e2c217f7c1a4831aa514f6b113a3b648548e33d44897d1791b0a22ba812b611708a7a9a390dab94a41ba10a2c1acad85f0ad32c8b656d4aa0cd688e3a729230d642dcd40ebd8cf5b7db867195169468b02ab07dcf05681bcfa6f7acb58c6371e04266fae61508f201e74b142db9095a09be1c569c8ce6ec266d015401310244be72130ba5c95781a192fe2186a3cce07b1ed4981a21f9b05d6957519007d8736f1166bd6de68237d83c43c60cd0eb6042027d866134a51de780e6d87dd2172a1212009c8b43d34c746d06af5ab34f48f2c2e701975ad754209e113a68f6b00a003e2776d7abd81919fc691ee213f38d72d31ebfdd74efa970f9d4df541bfc467170184ac67e423a3f268c03cb94397f2b62cd5008be00ff0758dbc134fceb5fa00797fbdd14d3a5834343e082cc4457646cc6ded0a85efcab4e7cc18996a3f94bdba59d32b90e766767b0522e626be4ec7dbf30323d7cd108332c24a4189f9f2c665c9942fdbe5cfdec0f928cc29d785e5034ca8c2e279b94a732324715d4308d3331b6c3018af438fd366830f2346967c9043c8ae5c5d48ae08126c61ab39aeb6e2f12d8e1b2459c28f34b8c2d1955da836f4230a4767e5e497079a0c00de64bc4959ac0f68263400ab67d8434613062d305825dc5cc1d52929ebd950cf1f012a741301800d04013e6831ae256cb1fec4ff93e74d3e080c6217605c048ff94f10c827d4929c635bd7811d83e5a5e15f2f082fcd55d42d25495402f81e02e5089fcb0741ac12172fcd2ab1cf143c1b097e623985705df9221d95b19b98dcc2fd34e995709b459a52cc9cecb6b6491fab8de57254c8cb8910e7533025dcacf9659c03ae3cb8cddf79b4a244bd052ead291daff44e309ed4200695edd936b56005bd375a5f998eac0960ecd2a126cd10454e2d72d819adb42f77de437841fc5746c79fbd9164f9575308ab579d12b10841c884a473d3abd29154c64f26ea73923be628699671ee5f49f8d26a935998270b72fa4689911e651ffca744533f130594ae984eb8d41b29b412af3c301be74555f5c4cce729e055061a8d05acbcf33f7e33ce63f84d0c86fe115b10724ccd7e36855bf03d81fb970a28cbf2af221b5815fbcbd80dcc9f523a5d9552677f31f5073acb01ccb69b14792b0eef414f0ac333208d796678ad22cf41cb606c3201fcfbd443ea98f494f02e6948fb28fa709798db850af7c25021d44b3c56424f39d78d3e49e1221a34b3e3ff108813fb6c1f97a06d22a8246d0f21328b6cf11dab164972482672fa82f3504903ec6398c723e12c35a85480e428cede46f007876744730e62e32670d7d37f62ec89a06764a84e34f5490550166b51187aad21a5acb0880b9b7ab348c4008d0196537d0e13a1a53186ca878d1662ee74b3f3db5e7af531cdce6d7f8ef2006eb028da171e5f21371525b15fee1db7d7ff4dd160d81ce5d7b9cff9f9cd78c9451bf450a4229a48415d5920336123a05c7c0c94ef48644d2c480b440d8e02872ea051487e09b95c4a65658773916c17d34e96f4ab4f5f32641a5f3ce0fd6ae5d024f10e28ff1481d2f27d8961e361a58ec68be38ce8f2a63fb43aa3468bf27ddcf2a097337b87ebb27c8b74cfc1c20442b0de25a0bf4312d5d6c30e9e039b4d10433bedb9c2a5a689d41ec366466df08b0b65b90b3cadc26c717a8268d20143f8bf205fb7ed37fb01c734799f3aa8fef4d8d3e12050621faf15de95fd5e8b32601f3e7f09b0a5df6ba44319d00c5f07b145bef8646c16e205b51583580304761040cc4a7cfa251386220a1b70e73eae969ca45bf069c816cc667e012f29825880b304d5ec17052664244d38ac5f1c93827ddcf5ee9b1c7755e7f33e5fa103fc3b083abebbee008f1ff6b55467dc8efb44e4547bb7223cb81266945f448151a364532477196330f14c89513b0982ab5f019cb7ec7f62afe4378a0763ab06b0ba182fc281cc34ce46266ff532191ad8e2d5ac9d32ebf500185608c79308b5bc96fbf474b40bbc804d6edfad37d898bba9254382fbcc39f3961af12e0ba30343213fddfb9b8a45850c3593d8b409cdb889b00aa2f4929c50f9878ba620900f345565da58454a1a65036c08e31fa6444848711331698a9bcef6f10a6e542cdee3b96756a3137dcadd7d0035c9e525925c3994bb73355374917c1ed76e6ce756ef0273ba927cf19fc86ebb000be40899720c2152122218efff4b4e99f2a2c2a917fd5f2411bf485e45c621916b3a7d2f2c8d82ecfda3de9fa9dfeb38fddc6a8403c3f15922db5a804cd9f890de56d4b83175c4c4fbb07636730c8f382c8caa6a784224c70ea1e80beb5450668eefd22a3f2d9790bc5dc02dead1b9102ad81b578ced8b66aced4379293c2ee28f80373c9454722834454f9411d006fff9c71c15a059ebcb72702a35a479ce5fcff34d44df005d1004139f9260de3a564c70f3591dc72ad25c4270a39a9df90f6b019531d800cf9efb785b36d506294ce4a1d4936082aa54b5de3143fe39ead0830d4e81bee7e85c4efa4c5a46681e4c6cce41afebac70052bd7052a1bf0b42db5def71172d1edaa38f9ab4e0de35ef7fb46348450431fedc25fd0e193ffac827072e9736c7688ab8edaf099ec1759d43807259465503fae0e33238cc83e27bc2d9917ce99bb015456645db649ac2e821428c640dd441ec5cacad3dc30e3597f4a13bb0333b170a3101c40ad60e0e202015f9ccf03904d8f14a52fc0782140ca3b18bad9634e59730fa4df235029c44046479721a28a00c40ad86a9cf240114f160deae481786acef15ee3ae5f7e254edb37987045e531d29a95facb6f1d68091a76e603b1bc1ff878adbb2ecc613d728eb04f2113d7318110de6d14a5bfc04b5679b4d891712d987dc2d92d07b6fd1a9c1f253b89c4ce89d9cb98eded2c5e273ca44876d6a85045208fde3bc6d29c5aa590c10dbccb3cf0dc7445380273d58ee1216cb6bb7ca8cd6e87af451e53e6ab020ff965dbbdd26599683ca9843dd8093abfcfea72b01da267776ebff5ed505bf99a22c22506ed1518274705d3197f7044e1a62bae05480f08e704ce0fcfab84149f61292c500d7cb244596c2f6cb0001a790d0cdc0c42832ffd3014c3fb9be53741371de2870d82c3565885a8be429a886194010dfbcbbc34deccf0a2700216014f81892184677843f14a3575baab0bf460211e9ab64b65366979695487214a753406ca2889f6941c4226c629b74346d8f1666683899d586c357c4a72459421678a53bf816f059351711c1150cdbfbc1debddbdbc21cd2710242f7d92477aeed4bedf86ec93ffee0986db5b51ed8fe748d9b3e943c4a602cdc6dcd125d3daae0222baf43e2c3cd9721a61ae6007af60fbd03c7d9705a5170cb69e4dae00c4c019665e746f3feacc5595214866f28e562a63d3fe383b51d55f970ff46ee09b69d9c3bcd23db5067e3a2ca1902cf2282d7741c1d024155d1b5997ac6caee451173d8e5440b3129c18a903588921317bf9082aabded14a94934d7378adbaf64bd6dfb64f75177a7c06bbc283361abb00a9ce97bc95b04fedd1a14f619723d6157ba1f835a847670c9536dbf99581ddce4cbe600401badcf2f3ac2268a6615c2219e78aa1725f24eac31bfe6335fad22443ef6ece45d9ad9b89d20d49948323918906462011cdf886a08fcef6be65f06f17235dc7350261a0c4ea2d6da5ce885d5023a856d684ad2d0e79715a8fb7001094c21fde9ad22c338f774ced8053b41a5012085720fd96ae2e2db857fda30c48590a01d672b50fa6ba746ba8faece32230c4e1ba387332f0c7c26adc48185d74a42db7752d445ada5848252b133bf56bfcbab42ca1891287a459eba68652cd459020694db443a4405e8050f55fe4c2adb3d107fb92d8054e0517b529510badb8a1e3374b73d29376f02b5b6daa16a4c2a8a4a972474043071be9644aa6e877a0223fa359be415273484b646ee2227918fed34ca8dbdeb05c6c5c0214bf34d277174fc8e927c809ab59c7f52b22142e3ad902b56ada76412db406f6651c09aa1824572b71392bb3364e002477951c4a9973044fbaa51cbd6c50035cc507dfeffd388edb2a2fc87ff9c2b3a640fbe63c40989d9be7712ee62d104e21543ab0cb5df97ba21b8a3efcd71a7da3b215b3a2c41645d6ebc18eb3fba71812787b2e7d64a5ec3f8bd8a47f601b5033c666a422ebb53185c74b27aef7bb2a8941fa02e77d54bcef4c138f630fcc3bc307773fe7b8dae66ea288911a08b33f0317c606a1b13ba8fa2b25290c4a535a5c8e6be875a3c4f62b3b4677137311d081d75c2c5636b518d27beb5afa9cc561ff4c5130ed92a60605c10c2533de3e55fc08e8b03a5282388ee39188120cbbebe1e19a3578c4080104fc6825def02f9dfdd573863fff4bc448436dec05d679ac803c56a0815a1b6a0016e82bec6ff52bad3622dcee0017511af6211ff4bb77d72f614d3cfbc4eb414cef73027725f4884740d8765d364a36d073a1fd7e25f08ad6bf6ef73cd7df8da901d60d55cbb6873afecdb6289c327e7bd67c5b0efcc3c87dd954abc6d62ddd67f1a9a69c6c8704bd64449b1e86f8f8d5a6f38dd8f0647ac2a85edcd3c4674116de878465f753ed1f788e58db4ed6371eab746bec1fa9325fac29da37d286205bfa22261b939c39cb3e5ea8dc413b50448604a89f62528aca300f837220e009ff606fcf98273b0f52b1acb159e267541386586178b9ddb2a6f4d92acfc3dee9645e7759039e582419aa5a89daa90ecc632d562343773800e1e67eb5526420c9f27e8241a8e2ef85eba50774091342d12d1f6953305d496536243f9fe3b7347491af27680464add6c7845098ab5aa5190eb59303e72c06cb9f3e32e17d9a49100553f4e3e84922086402e7ac29933123821f2d0b9c7304593130679fe8a609c30e6003b90690825cdaac8aec0488dd0099cc8bb8e9e00c955bb643529964d31713424193d0afe6ed9ea8e0f097cb894981b5a1added8ec1d29839b175330c5a31bd84128065df8daa9241788fb09597f0eab2726b8c39ec14f28a1bfbf84ff09f10840a107187efd69d3d39859cc1efb2bb9c87c8a22e6093ddf9b3305dc0d6c6de3287a8fbb3af0a116814f4e8316756d3037f1136551cbb57ddaf8ac7ad36a8c3660eafac3df4c9fb7dff72c557e65d5a9f58e639ae7f0328621fba2c43ff33cd704615c0aca2b8ca7e51f3f1fcf769df083cef3e0f8ccd125a03cc5a82acb33ea3746feba022b386837081ce13e8ad34d7471d7167c13ae1e9dc9ac2a35a5a2f4804fb3650c65c14369b760dc485058704d470d415525a4a24fa915a234c6af51796222ca5ae628990ac58eb86ca2c3e2a2c320398e621c0775a2741fbd28d676ee88e623876415ff6a51250925ac08cc8451631fb289474b32b294d9201543b99336b695c9a4269d72485a6296a93328df461e2790669681466eadd32c2bead42c153a9b25f8692e93780f73a1423c9762d110ad3892f58bd127ba72775af24db442a26e893f6165eb66d64b2206a14738e84ce722a0b64aa4018b1f04913cfb0cfc3c471827fc91a8475e698a6d11f06429f488de78896be8e0807a49c209d795d4cd8896a26f9504abc8cae2dce4c1c45afbc19115ebde90d885cc1c4d711e198c279d9a76ad6049b939a87c6f5bef7f4227fc8e4c12f872a6da652092fbd62ad8b7bc2d1eccfa1fcf364eb57e9c72e1ab649f1a987235b9c64a4d0763280d61a7d025180845b855be8338b028cc4283008a96dc211b2b548d293089cc94a29430f44b12f3415de2ffd53e9a3834a9c4a5082a8412fe4ba485e4addb91f8bc3381b5fdc089c299ff793fc3de6ffaa960cbf44bd224969b8015fe1150d0f7ee42cd97160e96f17fdd2f89b16b1a598a882db37b4e358877cffde7bb9924d696227a9c6cf589133365b987f8f4b7a08b8a6ed0a842a25f449fc8cdddd6127fc2aa12750bfe44abe8aa96f825ac3851b7e04fb492aeb0de464701fca703eaad928c5a20cec24a074d7df00b6f4f7917fbb2189e47f9c5bd24f2b38a9528e403d782be7fd28342c180fb72fc2231a2bf4cd331840b9dca29421712471b5b0b40d1cfbe45751d700bdb4253de7381309f7d2209d97bef2db79432492903ce086608fb0819eba966da9852549cbfe451acc4932f753ce9efdce31f9770d8dd772cc994ce97e08ed7fdcd75298d1cfa237e09a290b58ce93e937d09ee90f3a5ceb8046f7a05a6f94c29fcf8f1f5a707a8eeb163490e772cc975c936849ffbdb4d2c6aec12f14f2c48f633539225ddb964736d221286e4ee9f89496ba2ed3d5d3404c4a5a0b61fa5948ba902c90f2175fa5539bd3d7ea64a749b9c5e2b6aad2e8761bc615af5f5eaeefe51b1e24ac58d0670428daf21056cbb5f43410e93efc19e41a0079b6efa2faae9dddd6bc8df833d41b0dbaec6a33d44bd29db6c2944eec8af5517ad1073ed555c2177e48360449e62a61aaf8de7615b9dca60d253ab0ba162ad95014ff20483ec1f913b5455356bb50c5a962f83499e2f9d4a87e1bad5cd5a5bddc8949bb55663dd63244fbb54556badf5e96cdaa8b5d64b5f524ac12d2615354267f408d48ca2a2321a8d46abd168341a8d46a3d168341aad46a3d168341a8d46a3d168b41a8d46a3d168341a8d46a3d16a341a8d46a3d168341a8d469b1b6b1eb9f37d25cc085fc2be77853c431a843903d7d7434698137e9e1e81d068349a138d46a3d568341a8d46a33945a102458c972b46d068341a8d46a3d158f48b98d46bac877bf9530c9d6ae68d2b24107e89f32d39693e934994c8f362958b969be4096ba67c7eae7c624802591f2ccb49aed92b6df94feed36a853786addd629ef759cffb3aee036bd7791c0657ce711d0671589610b10af9914f522a48ce271d3e8db5ac9a319cb0c601b6fdf9d4e380bc6ba0000a85bbbec7c91d5b4121d6cd4173c0f80a08020c2693f93483908c5d99c6d0f349873c75a497a3582b0f773f9f9c7e9ff5e8a2dfb3f498bff72ab0f14fd1f338aceba6b1086df2bc42452f7432a1c63535c534e1c5ea9e189e288c3ec64ff3c95a2f7fd2bbb22943c87023c92471411395315e90a010aaf2224b9a1ab47063439917d8325142bc8608dee188a5b2430a2c942e55a47901882935362e58e1c40bd593353f60f1220dce2200780ba6272f4774a0c9c0bcd0c4902f29d842f694e68a315b6437027024513754997a624272a516812a55be884112c4154f6560c029f3aa4fcc701aa86189299260799306cc510b3fb0404393a82bb250819913706692e4f81495374e9886ea3f98695ac24c1120d6a24c1476893265363fe25defea024546184eaea7b104ca66b3a04b2861457d5a42841541c703ec1925f64c934d1f73b0a596332d6cbb37376aa07491c28b272c9e14d992440d28367491824407d91246e8565f7b7e509a8c3f840fa8387fb27419e28b2e3e6c61648e05960cee82c31ea5d3c6449713600a622daefc618fb20a699c4a86d8e3a44d2a33aac91e67d511539878e0a28b1ea6a88a8da21650cc50e1431923a2aa9ea6403245e6c20a86d0214acc0134293aa4596a2345556c66003544bc80480b4bb0b4101b27131a353851250999a4a530b171364d0ddc64a1c1490ba65c99121b672d290b3743402183922f42c4c649c5a58acd8fe0f285fe94bdd9f4a753175976e528f628427131486d6a85b7e128972fa6ba292eb822c61576d5a4a976534aa010cc2db71087fdd9edb0c9dbdf7f0975f588bedcc955024950fa2777a8c8db1ebf1ff5c739ce9d82150281775a4e1b9f779dc6957b4ea7c03dd675871e8f76f77277ba52714e5f752d3639e7db6193375d6548a70dfa30b84d4937e4b1cea86c769392926649b3a459d22c6926817e90ccae3ccd9ca838d1d91293999257b94f454261fe35c96c86c4dfd2a8ed6fa1e48e5f1ffbe37793dce7ea8aa4ceea6c4645ff1a69f2e8544ee55acc1baec6d748c9d2e4b1ce66482a122a7a559a01b599dd264ab1912def774fef77cfe36edfe9d78e7ce57d1edd5f6dc444747f7b238cef6f5abee66fbf3d8fee376dc444c4fdf646d23bcd63fbee3b6dc4e9fcb17ab113408b5c7978b267d709482385e8bf84e8d77610ba45e0daa310994cb683b8b6cd2f66570d010e2a77ea5390d220a351352a2aaa565ae974e944acb5b43a55295e9de48eff8dba51178a2b86498d29aad3bc3193a858259d566787c9361a3c1c636888343e30db3e058211e6ee61028feab4019333b9fe589d6e8dd6aa53ad3ad50610959d2410cfbed4c31145f6f7a7b511ea3bad51d1ab135494d3937b95dcf1bfb55bbb696eed0030e4b13aa1d9fef5c75bdb3e5e344e54fe45336f54dadc207bd2beb4ba688598fd3496ca9393d3ec46915798c5fa4f1b311179cf7a232eaf24cec7781eddafb4d1eabb8fa18d9888566fd4bdfc8e2cf57ef080be9de74bffec20087edf9780a76d015164ee4399380cca4ab94f7e7f4be53eaccfb3edb6cabf3a552af589f65c718c7376b9fe459187c79d6a282f93ab848a7e97c6ecf1aed97ed7dc27f7b94b14e68f71ceaebbb4fd2e0d202a2ff16cff8a447beef6af51268ff7e949eef8e390225b599549a0babdd27fcdcd0a5ff459ff9a8ff347318c1ffff744f8bf9fffb11e471779cffa22ee31fdd67f0f86389fc317fdef451f47bf66f74438dffdfcaefb952eeaf48b7efed6afbe084783dfb394a8b23aab4a5556935ae19472987f0e271595ad42f9d1a5ac24a5c221a2132a40459f9f1f1e1e51fc77b94c90d961fe15898a9e24bb9145b6c92cf59c785e2779dcc87c6fce89f5f87b1221d29912aa4495f6489596f8beefd354a9d2a8c8354a25828a37b2e4f91d752bdfa66bdcec39d54c1b733674021115e7a4da0988419e60045860bd7933411e3586b19e545eeb925d8d4f5111c8a7a8a8151e5a81c04f0a1e52ac386cff994d90627ec2c9f698b452b900b11d011dd0942324b66f775bed81dca908d815029bb576f4a0042ec47aa372fbe001dbfef474246c7bb924e963f8a514b70a6cfbf3bf306f77bbdbddee12ac73b298ec3be4d476fd5110e35a372ba0648e61af9c5bcdd84beeb6d4c245071610f986ece10feac1a5065976e5bba5162e31ec5184bac2c3b4474abc79eeee964e15a4dc09b2ed1c724fb9e33ca0f16aa53fb7968455ffc0a642ad4d591548e2786057ff6dbbf5abe90a9bfe64b9a6643ca933664ae77631be987e23d8b6bf84b65d7fdbf5b3ccd575a5f40ce642444a0b94973df2a881ba5213e22a413de92089ca614996b16596332db0720649166768d0019f019863eefa1ad4fb5b0c1581864041f85981f40b31c69b06ae8eeb38d78c8eebb8191b745cc76df07acd00c06052aff66e98ebbc0f5cb1728bd5c2594967e1c4005931e68d6fe7c8f06464d0b132d0806369805dae3c63c6dd6083ef555fdf0bc461ff05e69899c60fc5f6b79a93030294ec85dfbcc1491bf4e513a7b52777e86f1ae7661a00f80010001a000ee4f734628c31b62d0e3e6771f714c12d8ce78dfcc979a395f30acfc72e1bbce9db635929f54b88cea7d6eef9a25457b943e9dc21d5734e3a690a3c4fc60b1c6f37289dd3c6b5d569ad7ebdd2ebb5f61859c21c16b435237cebb64786cc4345f91cde534cb7774b9262b5186fbbba9173b7b35efd5cee5a6b078220ab8d278aa308eb449193326b164551c2a828778ed45a54ef4657a0f872b6ab9ed3da6deffbbaff3a9d8db94ec70bab08555dc81376403fa0307153d165804e8b30d0236fd575930bc3933a35d8d460e3546a6a539935dddde994f60537551bbb725602a160a2a553c39c60532b91ae1827ad0d1391020990bb123586858bb9d8946680892b5e7600e28a0d415c00a98a942660d0022a9ec43e299af8d9de7b200e2feb4f13e0656c9953ba897d6edc477a2f47717b9e27a58986edfd037ab88f74f2de87fbbcf740684fdddef3fce01b5884701a72c5132bb29817f362de7bcf8138bcaa2e6777628cd85df7f8c8ee3e479166779dab56fc388b8dc324d9d98324b2bdbd05716c20ec0b0514fb628b058c9b5d5b64a4e8210c24992c2b6d707a5844c135a00537183b79b556314bf1d04d2da3e8404a140e516a367d179819360553c517309bc7ca7f61e2c1ae5fb1d47f630e54995dbfd627a0ec5adff544d4aef5a5e4b1eef934de89273bdfa78314ab7e157f57bca49182872611f173cb8d71ce9e4469d29e58eecc9f3db77c974295e80d550c85d58fbaf6d21b24d05d85367643561735aba464b5243abb6fedbd971ea951952d55daa6d4549a5ea617ce265919152d9295d11eefeb5b240e872f218ed32faf4ad5a82aa6d630676756c9ca6c92949454084a4a9622d53893ad6c4a4d296a652e1aae4a91669db579e37aec86abda4aea07bbf2d319feb9e5ae511456a3a2ac2ccacaa26435aa46f1ecfa730a7398ceac6c4a5919f7e39492e2b62f843072947b3b61f27dcff33cd04be17bfbddb7c2fcab90f5361c6709dfbdf7bbd5df6785d861d79bdbf37e156287790f8623de9efec214ee77eff957a5684f7dcfb553b8ffbdfd6ffce1f23eb832d6a85dc5ec9066f6f7eee00e3965b7f77d5cf89ab52935a7be90dd704acd9a10530a6c22db09459f1ee130376b534a886f274c4ea1fbfb162ce1befddb09ddffa4fbacbaf7debbb72048c10bda3b5f2d2d7df52d643dfe705d967d1f5d17e45d2837b6e10f5795a262f5ea548d721f2bab5135ca7d70ac7e95b2b28c459eb52945c5fa4058641b8537ee399ad481247038319e8989fb2087d567f1fcae3c38fac565fde25a4fb4fa968e22624d280e8acab825abbad2930a565b9f9f85f3ab5fad9ef544ab67adb4265a7d0c5db4d238bad6d6af9e477e562ba65f37c961f555f7d52fa5a8aaeacf1a8b458f5023544667d386bfeda80170f0a824900af6f13bf7ee3adcc7d5dc7abb2ee83e957b6750d0d1cc31f790dcf12c2490fdd0c66cc8daddae35a97aef9c373c5a001140dcc76b0eabd146cdb421846aded860080f95587ba92809e5d95ffab62b0ea93c8a0dd8e36b07f7f6b9b72ff70694ea8c8ab83e038ac8639d5524d46746ac7b8bdfbe84f096200e70c60ea254d447b6294209cb133e6041432656a5962e4cec5de9d7a5caa4ceaa92100af397e1a43c73753614a9de9db3477b9c5ee68e983c53b00f4eedb96b9cc95dce5e6775d669170d57b73109f33b6fe3705ee9311bae7615326f70bb565adfc33166bfb8c72ff7bc2177fd21af51587d8c7376b9bce635b953bdf6b3eb07a13d1b37938008a9b399dca9188804aabb0651910bedb6a126632d5dbcecefc197908df70d5f47bb86177966432054ac6278b4b9d0f7060ba892add403999b93558806724389bc63fed52fa13bd67dff6873df8e983c86e06883ef352a8225803bec5fed81235821fbf73d9004f0afbebb06f1099600ae3c07ad4dc1fee546986f8228d7e9d78eeef1e7e8f418c47f047373ef3dbedfe7a0cfbd0786dd0b0939efc1716e10cc1b06f1fdcd0d7edaa9a858bf46c56a6bee5367b5be53d559cb862c0408156b7d2028fc6d2ca9d8fd4bc83e7eac6794b78124a0a96dee570077cccde971470fd9be943245d20ea237845ac262691913c67f5fdccb8d7f4836389c916dfb5d7d9d57ddd6bed59ba54416d269206f3dea4e39af183d4822db574f31549c5054b4fed549f7e05473cd1e27d5a41212039f1212c4a992ec518e753bda9bddb68b47ec638f3f5cdb9d80e0b11f447b44d0e1922aa14aaadc474eeaaa9a55f267fb77e03f8ab2fe288a357c0a923694bba90a572aa33e73e956e5fa1e9e7bc38fed92046232c9c81b33c9f7e374327fd8d6cea96d676daa19e7d3cacea54c65d65a9bc3b63f4e33dbfe17d21917d2bd79c1dbcf4db72e9c492c4d9a39d02312486e12ee2f69b53278191fe35dcf44a4c1b7bed5fa184fd4fa1858039c7f74b132d0affbad3f8ac9d0f95b4f94bf85f3f9af2662e504d120cab166ceacede821e35f9269dbce268759987d1286e4fcaccff918cfc4f48a00cee73c11cee7e82226ee8b7034a789703e862efa71987d1cdd7afa0157f9c1e7c1fa55d62cfde2b48f181087d97fdd6d6936d99f34fb37ec012e61fa7de13494fd59a34dae8f9ff56207b4a7e3b4775f42fe1ba062b53a2bc8a204e29937eab68f43ded09936ecdb1f11c085b0ad7deea76c15fbac709c529b6e0f4fee3758bde7719c9e1b0ce75e815e56f375b6ecf9547bd21adbfed0bcc2db4212b6dfd143deb64ebf76cceebfefbc0777f785b51d3d64eebff7bc25396b19d376ffbebc97bb1b7f7bb9b9507661e5d1e20d1e0279d6d954a23df53f3bac7e210a5063f644012a7747956627ea6359c6052eb04089490b364870a6d0c20a30aa86886a53c39c39b0650b0d8a13d0ac34895da819d385931bd298a9d110f2233489d162861866382411eb01861a169828e3e485222295daf7bddffe47b1fb7356ebe3aff55d17f9d7d8f74515e3108739bcd3e9fe7cba579c717ac294051928bc88dd9fb4490415afa5340aa5529a01d644ddafe098e3230209bb3688dcb95f001df2f54a696ee79d69f6fdfa4296404524e666d23877a0e1a947d7a629ad9b4db3fa709f177e16fe9e096ba2ef59ba08fcef8b56a3a47ae10f72d8fda3d82a7c61ad0211f82b15ee83c00419abbfd24545efb0fba03e8af9cb98f78d9f80237936c99dfb2ad4d944ef4fa7f028068647b11d6d72fe7b7f2add1d6ef2389b684e739fea34936297f5f929388414d607c38e8a8a770ded7238a56892dcb9f7290d8a9452cabe94d2babbd2b4d3e37c9aa10f8751cd262ade57409b4c7fc87dbcbf59fa94227d64ec624e8fae8b31de1e632a95b1a047f28fdc49402daf5e43721375311482f0e1b03984747f7b242a26f9e0e005799c4924e1247db6bf33894db59442f2ea1f59eb7fa0ecf1af2d2a4b402dcb782377bce6499d514a99e00f744476d1a03d4f85eced69e84a1214c2dbbe2b8d477bb30f826ddbdff3f19833a6eff45dc903c0549e5b6a29f3f269b7e7f738c9ad7e26a05953c44b551063c4b480481385c40ad49414338f63e1839f10a613192e3978b236408acd95bedf1e879482a07eeda00f7e0efa601d8bb60786927a1f448fb6e747a68dedb970a4537bab4a36a6329c2c54b25032f2c3961668588e3ca174e4882088684064cd10554aaa9021e2036a508082336892f8128321d88b94923a4241d5140b4080e1d205931831f490430c609e94c2e06455a494dc6a153f3f221842454c1524b87cc1a1069a3664b8b020c50c3554d981c80abfd9aead2e35291564b44c325064b66cfa58eacbf96a6ca9854c1332383891a955ee0475516bad38bcd6d1eed1ee5a75107f4c454ac1a80868527f82c05ec190c99dd9da7262710150e5b122a0497677cfb11a81b5ab745088d269e96a5461fbccfaac537f9cb533a6ac1a04f3cd8e9a5abf39a7cbcfab5bb7e0038e5e748f3733e14d6b2dde1c46ad00a8f2f86de9d9af6a9d9b437be8638ce96fb66afa23de96c3db5aae560a8e40b7ff47abe5b6d52f216bf58fcff5e3db42d4f36f5609ca2ab52877e66f4660fbe39c61c6339c3bd39e4c7beaa4d489fd304b707be992586a0f62c31f2aca6dc3e1f71c7c1075eeb1f4e99ed3e37dac47579893bf14ee6f3a53d13bffac672afa0d73ae0d615bb73cd82ebce66d37de6cde5e5fca6aad8e8e1884949985dd9be1c8e3e4b55aba0d1140497e9e6da7f451468db276afd76a7f7c662ad2fa5debfef4bab5d37d660c47bdf62594b33d7c09a950b7eb6cd73f7876ddb2a76a05418b7cffa33db27ac77dce559d2dad8f45958ab2c78e55ffc8d9479b05ef8ddc412246943cbf524ae928ddcc314ea976f7e12e848a042893e7d3f9e5a05b841861f29421449e329ec85892e7cb7ff2537e21ee41ba1e5f5e37beb80fb794b2c7d70b3fdd7acf3dbeb6fb737f061b68bf2c4562054572473e0e45903bf2b730849027ac1489976bfdea34bb66f6eaee1d27e957af7998f648995df5ad63ab6b0c31c2bccbdd550852f712d98bc78cd99f31ab933e987c09b1b63f6b2f2981d5d861d98536546cf104963335bca04b0a8e78b181694a132b5e8481c1e8828d0b5696943821c315139ee0a1c892206a5d3cd1792ddfb5609d07e787167c4181114a2b503aa2b139a24d1659b0c00087d8c8a3c3dd7c41e38a15168680c2c5134d5ca0ac59228a24304c35c9a1628dc144a6fe540251b782a5801350853922650552b0d4a8a2cdd31217ca4879121b79bc686305191534d1788042c3962216b0039b25bebc80e4cc901860e4d1d5939390886cf72d24973648399c0953054b145088990bce1c91c609305598cd14279590c2089b3032b0d912c61114343db46922891162b06071595150040936446a0033446c74edcab38924c55d5023a2d85c69c2780186a937554662f5452c81e8a644f6a65766e5388ee3388ef33ccfcb2207cce6353143190f8a9b9970d1e7a18fe9bf5dc14a4c15f795261fa2d8d4bbaca4a09ec7858fb34826e331f47f7a9ee7799e1e7ffc6c5db7e4b965d4c6dbd5558fdf42ce2122a7bc315f6a4002b1b0e78da927121123b1515209e1032c733e8ab5f79b1ec5ab479e4df5a7ebc51b589167107dbd39b9f7709f892461f48dd4a8e6d7c37d64ac463559f8414f2554a4f4a792699360eab4d2ee93405e0123097445517c710950de10c102f84cb6820b1c42a6e2baf201f5d1a143ee20e5d95929729cfd29725f9fab9eed386ee801ee434485a40d3afe8c3c7b87dca1afe3e889be0e29c71003db7f86f6c89bdb95a58df7e4e00d174b4451224d11283c145112028828235c50f246cb9b29ab375003c832854a566d134c355c2122831568b00091430d539ca8e14b181b72c091613e254d52a07480a24a13278cc8e2822559d8c0c08508ae2283e17362753c3925ab9094e4993757c090e50b1c68f8121bb3c8f324a992665257aa4b79010b2928d98e21a6a039a3545352c1529421f6e882fa9e58515655e4f0e9709d480d9152b2479e24d9db528bd40d384d9eb1a516291995142871818d0c9963339557693a2261ae179975c58b3148705db2065b6a19b304882c634b2d638ea0604c91bbc40233fbb450adbc4015f1d24481558a746a943e26235c8dca3b0206bcd415f1c2a6e689f321865b4514ce41063b05d48604869a46e97a992139154d0e935e9292685dc28061845a529735308c404554064acaa069ea8ec833b6cc82260546a069a1cd192ec02bb96e99e54c166faa70c1192f33e40cb6cc7206094cc4199a4b4bb85d3326963b73dea8d30627d2ebcaa998eebaade6a637c755b9bb29c69a5afb355090ad88b72c3d7bfe0f75f75a6bad5edde9ac3589bc3dfa397287a756ebee5ebd563aadfd601fcd39abe049570e7e9e77ce61bcf976f126f250fa78fba9f182b3a8d72bb1fc15053fcf3be7b06f575a108cc8a1b4ba3b9d53e7cc72b91ba1546eb0c4a45eeddd30d7795ff7811db8eab88eeb56ac8f95bddcea5a381c4e8c1839d573c779ce912123830c401c38f60b4ff654294a7b64e71ce2499dba42c7ad918a023f37a534838f8cc9ec537197b32bcfd8528b993719ca2669c3792b38c121895645258a1f887c4a10a1828d49ce965acc5421842789789925e79437a98bab6715cd373edcc7f5524a27305c5138b125962da9a438783ef8114102e53db59544f6389f7c364e2a9f551463ea64fa50285a44baa640c180d690f323bd01e747bac3a6b489d3248c7e067ac423ced131b4cf70f49d51b98f439130fa523013798b769adca12f23294f972be719d2a136bdaeb04ad87d0dc2fb39fbfe6809e5a25d692e57ced4359fe69cfa025a4ebaca7ad215e89e9b15aeae5b29dae7bceefa99c07a5a4eae844e4f29deb7b3debff3093b2d3b6d3ecd710014d881f57c694d6065d0169299844a3aa9a4abb98307821679bad7d06db5b3cd769b2091d29f0329ab4fe947a2c8c0c990525ddd7d1fd539a578520f9e749fcd7a6cc6ee16d60f648f6da18c5d1bd2988c4d1fbcfd127231552019b2adefb9ddfab672baafaa969e02d7151b9529a6385c040a165996c2387981f3c51150a6b0808813292e6ad3951655c3cd07b85cef2af34215294852a22cb1e00831426ea0a57112b504d59533d9866f910358a505338a54c0c40d5b289151338504532f4471c2cb172da4aa7cf0aa541561837b01873050ac8c614a428d0492c64c19f326862645a83029c2d3b03817c04861c10e6e6a37a079e108090d47b879a2298629cab0a9dad8bce1c0b17009c3f5347a780265858c95305e92482b54c46048132f4ab0400aa9339c931132f3e4872b4d48646621609a218635475430030ba8582634e05a68ba4a5f112b4f4343139725596268f2048512496c7902061b9e30d1c50d5db400e49044d0f100fad34c97fd66a6d1d13173c547c66a8c7e41646f4b2d66a46c9e8aafad3e5d5a6c66684e30c83e6f7bfc3cb8efb8c7dc1bad5e82e0f3e87ed53d883d2f0cd231e447314fe4710ad231549dbae7e1fefbf07758e6d4933449ecdf6f4ff4fdf6f637efb12ee2defba2eebfecf76a22fcae8be8e32ff2dffe2866dfe38e621df79dcb61b57e6f828cf977baa8e828467ffc317bff4084386cca8e625c78141bea21a9a08008711fd9508fedf1237d5abaec5eead4ea42cb695fef63553aab2e9a4bb0fb240cc9bf7a2622f0bb4dea998c759fbb8ea53f9eef79cc2b9e5891c58c56007fa5796e7dd90aab37ea569ac93ef8df8f3c5a40fde9d7f6df6be3e1fda78d8c78749fcedc1771fad34541afcd7ba2eebdee16bdeee1b01ba3eafee67bb9199d6ddb06ca1efadb369d362158f707b0a5fbbc26f73cfc39cdc37b9d1d24e2de5f93fb4d1375efe9a2d79c9ac88b5cbfc3e41fc5babfe1ea3efda3d8bcf489fca9ebf1674b22cfd33c0e93d267c81d4b002bb9fe7721172aa08b2cb70cca30199b7faf1246e40e3a98b559137574a02817277c14b3a1fdfa445313d5bfbae82816e433cca16206618b3cd2d8747aaea9ceeb38d1254feaf809efe1378404ab240cf9a2a22f6222e2debf12e1f7f0775aea3ae618b6dfbd8c79e88f9f07dd9e74f80822a51b2f526a24559008d55a6b8d4223ef39fcfe28744f99883a9d1d6684b57498cf2ab557bcedb770001bbb8f11137e23fa315ecec779f9ded73f8aadb6fa44fe5517316d5f547fa5374d94f39ea3a5c3c03f8a81ad574b8f4077ab03ea239ba0baf7de7b2fa5d252c6cb85c282e9deeb4363add546e3fe6b31d3b42fddb66d9be0105094fcf73d074bf036c77d178e47bbf3b6043b07418ec3fb9bb5fc9fd7ca61bff5477bf55b3816ededc170cc1bfc1c8e73e76f85928aabf7e89743d64b3087477b0b83d0cdd2b3ccb4f1fd2a1c2711fb7beebdb0d352878a127c45807e8c27a21f43634d341f670b41aadbc57b09c9972f37fd56d57c717e76c950ce1ba07af8183ac1f5d45feecf6e9f844d63e7b0fa95f347bb87bf0fffa11384eebf76e0df7ed3296c8ff5cb45c3c7d0095b98805a06c0969f634cb6624b2d65d4ec190455e6caf61f22924e73ce10a838ef036013d11efdf673d4b7fa2579a8487f3b32db3504da935fccaebc2b500376ed791d125c76407b441a1b6cff0ea828fadbcfe16ff5eba3626d5575008c0d6386d48c2c61e1e60b9818b448c1e64952ac7eaeef9a45e1cbbd3f8feea936a2dfbd6ba337f2e73c8fe72826c10874dcfcbcc97de775a18fcfb3633cfffd8383dcc733c2df61a34fc6b0c332107f21fe3dfc7d7c2187bfd346a027e74b4a9f0d9adc7d6e6f4266c4dde9fcf10fc108fcefbbe71e05ef31183211798fff0b8d3a19f326f53a8913834c7f746def2177fc55a8d47fa0621347933bfe1cbc204f2c2490dc3e2e2cb6db2de652ce39ebcf49655dd27c45007ff73cb8dfb4d1f6dc77da8889687b4ebfa69137d43dde744c2454a44296e40e7d2d5a241094f4915192fed4e1b021f1e513fdab27809fe4d39c734eaf48a850771579e88fc3ea73e1510cd79738d72b8a3ceee35fffc77305b50f87c5baf738ff98587f04f13a0e5e902793d944fa742ed855caaeba3e0895bbd7ea7bff03658fbd16aa72e16d19cca0a00932766b38c2dc42a838bd6fe1e3beb5a583235024704830f6943bf30d076e691f7c145abf7aaf15be86ecbf4c90b1178fb738cfd22fd712eb57b5cfa385f3d63e0fd6b79ec5fa966e79e862858fe37215c0e9ca17698c98e207260e20e60624b260418b0b49b66f853fdbe7a93ce4b0ed6df8aa5a0715b797b1996b0b0e33246270022e3ec436a9041a375ccc90a87c9121b6fd9c6d3f9586aebeef7d0bf6bf0524c9e344dadb7be09cc99ded55a8bbe5a58b926d802dbd3451b5e76c2a31590a8f622b9cd6b6c34ddeb69f4b5b8efbc4f84dc6b621a4189f3384d47a1cf01581fbde9f60fffb9857282a6e9b182a6e5fb7cf09a753386b726773da76da43913e317e73297bdb7ccbdc6103eb2a94b14fce28b399646f93c9de90946cdbe67586a43a4e38ab1cb67d6bfb560cb22b5171fb4efb8c8a1bd09aecdbfb709fac5ff5c11eeec3d2af0a3e0fcffef746f73d501bd9ff5ec6b69f48d467cea68cf6f86f0fc47d56bfcd69646f0de822a031a8744db6653d0a95b21100002000b314002020100a874422a15024184f4649f70114800a78a2407c60170a644910a3280c42c810440c21c0000000888c0cd1900de63f77015a53d7a0b0523beca53829aa8cce751d9c4c70a755bebadd30f9db7754c8593168122aebfa84593c0b31024152241386e7732deea1c46325100011b92024eb53ff65192b510d68d56910e5c33eaa82cd3ef1a2d213bcd3db8611ea553551cf5fedd5c652bb9fc6751a514c2bf7be981efe5299b692523f4555845c6048c21e1e9d37c0d6308130ec6a56a355283fd287afb6ceae822cb73a1eb7352af2d97c13cf554f0fdc7c6cd67fe08625c5dcd104103bb2a43cdb1b9b3f7f30a11d6f079f191560c418a84326ab420ec472eabfce4dbd96410ae59012d749309bce56ee176eb6736b91f90f649e676296020680aeba530b5f918061f5ab4bf1d19156706e0560d5618a770b535c6360ff2f20a172543e4b951ba0c6f4dd19ad775c3d536b5ffa186d207a7972d7f966698a3af4a3d21cbe39e2d63c2652a86b902db004c9fe1e3d06d1eb1c1198c8f4b624b61122a9274b825d18c335d8efb3474b6849411601060b1ed05a53fd78c1685898221659609e009d611f87b9a91d21b20875ff9049e626741c98c6ba8367a02f2611020793d587eb473816fabf982b3c17c84ff47d7b27e1b804233b9eecd390bf8e3567fc98a9b0c89033ad13deecbf3864ffa31dc58b57f3a585a99a4c51ea7e116b71370dc7326cb800c3ca4a78cc9440ddaf7d11db5c0b593e7c8c7f8ab61ad9d8e19b41d0b50b10b8203874bc7dd4c474230eab4824feaf70f3da31098c4882861cdfd6cec39720ec119214a391e435311540b1a4e2da6095f22af838a5a3b882c26e4b991245f2138063cf67e41b963baf557701c2772afa857eb635cd952c82767dad11f6a26347761d627377741eadb4bf0590b9a20193ed66fb490327d688be0b2d41eb44e167c6da922db7a96e2eb7b5157197caaef51db385d998faae93189e3a84c2ad095f78fab15c81f08e1bab49957aac99e89aa00316886712a574062ad618f11e48f7cf58ec390363580b77a4e307eb8695789e0a9e729913b10083561e3ce6944edb0580a7c1d72517e247e8f4433b83e4448023b65adc481b54697d18a37c594f0d43550cb5ac9e059760d5423759a21a38c2a587e3a18e0225418c11337f52a016470f97b6b2f76779bbb10581220271b0cc4a9d087b438275fad9d302909090df7e55b781d6243856eeda76b84b508a1b63aa36d40e8238b97dc1a1afd406a3a417b58408b7a5026fe02538b80cfd27420ac1d84b11189c60a65dfe649480ed203fe2d003ba822cbe50d1cdd04eb25284680fbea7c12d8034ae06a48fb40cde1fbc05b5fdab4ee3db705aa5a40b4fea82e871c272147cd89a836a938183e92e7977f085880eb3d0fd92a954e0dbc8ba914d75c248bf04d9a47bccb5a7b5ea7bc855a811b70e1f6e9dcd71950dfb512d6765414bb108c8b02b010df4a09290fdb49a4f1a27ec251aea8201bfe010b07eac2ac71af5906a2f6c10c1c461910a282cd8a21eceb4aed5d5e6fed0e7cf10b81f3bfdebf10414d6c474f9fcd6279d7d6d55b474540d409133b7f3b1259bff06a5efe83e67e350ff728f59e5b53108b7c3c4100ededa5d5f900419d4a1296aacc0f660de6c1a02e342bd64085dec535759f167ba35411c1cb92947a7706107fae5b4625388140f46ebaa882dfcc01a8d8dfb467160c03e8b3f994669e7d3f9b82a8d590808746b3fa101871d31d554a0cc9f10547271ac48e06beb5941666a55225e6fdddbe934860d355bfeceaecd2f4dedc51cd7b9fda3bd6de2f5612ff2817e927ced94f1e9b3e2dabeda231cc3ead7554f5236439c9175b9cc1523b67c3d749cc69674afbc65e7ebc8b82ba703ee60d3464854b20a8fe8f28d4a7c7531900119223743b406c2948b7a5647ea04f8395b5f6048d790d41937dcb922c98feff30df39353e72275c6a5b5713755c01948727dec1ac89638b036e2d361f76a4c827911f50b0b567a3d6c3f8595cea3610b73192b871e72f4660abfa21f33f104492cb996fddf47275ac5a9ccba625ddce9e9891c369c8a00448f81d16c7782a4b18e5b4563c1f2d36f59e2f20277e5a3fe691ee19ad9bc513044aee44f34a3e6ed366d0edc7897cab5c9e4c16f5e1cb1ec190c4ce49f4ad79ae529962beac22f9add437955ef65d92a4f6605b629eb86447f4a54ba20938d694ac5eee48e79947f59678ce609db88aad589529d7d7133c9fdfcd15e2c00934a8428c9248513e086e3fe065d74d7da07d12ba23ba8515170961086143c58b7ecac71b6a6a614f2ce1700e7fdeaf8ffa7615d0ee1822286008a1a05e842394fab8d6712e83c9f899d812d6241f9d753d622b6bd980560cc39156be88d38607cb989d0801658927604ca7afa6b07af5d2ffc754c8f977d942d1b45a05446bd21ad159021eaa6362a31191b910f214764c0096db9e523c81074ae65f504d4a29b299cace5560e12ddcda0b653e0be31167b24a4a48ed51030220aceb5992b3803843e2be40fc2045f50587ad3138ef47db58016029d0a659063b435ec3f68df8e33da3bd1ea8b883da913be0daf1043522191ffa316eee4b25cf646245a71591c0536e23ea5da68514bbd0848a1a1ea530880c98271aa089b20621e894dcc0702d5edd99e0927312104bbe084a5c33011f81938a5559b060e7ecddffce7dc4ff597ee39b4fe6793909094fea9086df8798429662ef34fed02fe29e041dd23990c38de40de9987407498d49569e098029ffd41544e0882987404cc9c22653017b462bf2ef1ed0b3d80b9d90b9bb98bba59637282e7dcee515d3a9502f3336fe27225d860450241b074bec139578fac4277c6c68fb3733f36ecf01f7a47820c0bcb18e957058b1e9142453812b30554e9403f50620bf6b2819cbadd79967821a694a4307f27e6b8104d5f7f86b7e8b21e926e662f3e5ef26936ece0ca5b15e424973c71a676328e49673111c6fd6af4a1999016777bbdbb55215c8d782a0fba86a8607e6eaa7c46b2c90cf760abc39ecaa491455992ba6457794d9ca7879744e66c2f0fd27a834d5bba83eff7e5c5e3100bc3b1e1b310c02959b984a006bd97ed325999a2e32154c4f702e267833dcdbdb259f437bc0677ca36e96399e41fd2fcdda5577c0113f64452f15707962c187b908292716a641b9042ddc3e0bb1127e3f33ff42d913366f429cae8b573d6308ce883811a75cf93b365ba95ad52e69bf9e674d957efe04fc95962a9eb84fa838a8c4ca23cf3fd953834344244271c60a515f65709a9217d564eb5aa454bd0d5cf71fd41995119a2a2cacc882de974b13ac1009cd13a17d2ac54a48eaf28810944942a0c50576055a92c98065ce5860bfbafb5047e5f2f6ee783069f9f794191d5fa5c3d1d273467956f5518fad8d5dd354e6d6ca6b93b3be20f3d4cabbf84063c44cbbb12172814f0a73f98d51b1796fd7dd4e532a2a1eedb47110b23f07c5a05eaefe16e7d4bd5949b2b17b10b3d517f703e1b3f8c3f68ae7d2f7ff9ba54433b707ce66420d7589bd81bd974123a5acfa578c6a99f4c980f1b7d3d3e592a4cde2756dc711505a3c0e36b210b792e6575fdfcf3455c9c714f215f10cddb116595361462a52a489287401dd8aca59666e101e5cf9feb21487667896cff7120218557161e4872ceabedaf2c87e7314b2b71fc5ad62e7a480869a1f4faa7072311fb239e43f11e9491bac007e16ef68c048abfa8e1d2cf138e1b48f15a40b9bf2847d28197bf60791e37d3753f07df056a0f081cec8911d8a22b13fa5890c8cac31dce65471ae78ad17f0b7b322ccc88e7dc12e47b2098ca8f5b6195e82e45e51431f782dc3748f8942bc27f67cc02544e2578a06cecaeb5de31b127a0389cffb356fe1d781794512ff1c078196429060f94c1a5457efeec1eccc0afd63bcd26c0c16178dcb15f040e26a50f8c5ba4077ca5f301e244075a54548e116276bcbc9e33cf8a07b7af3766a8d0fbe20f22bae2be302d51b30117fa6765dffaf36fa6064c5817dd83251b4a4c7a1a1eac87e67098a25b0a02149ad7a1adcdef75dd30d03ee41675d05268240af85db39a12dda308059dc2be253e4659aea19434ea8a068d6774d129b954225503c0952623186885a3fc360f965c8db89ca1632f64436654e7a4da2c7372013e0bd9044acb5305d8e76464dbe987be3513bfacbf47fb15d44bece6d312725c51930facb2642191e8c08f71fd6737a4439191ecdeaee3d8a3661974fecfb1fecbe486f003b24a6f4688d34e01914ac8e213a506e6f87d79a38da3ab1aab653a48d3ab0c7515d8066f9f9a11e80216e647772fa6b880a589cc0dd7abc49c4d897c486a33a2ba3b81ae6bd9874b005def390f7d580bacdb4476f48acad2d0eaeb4a5e69514478fff7fc0501f3877da52d383efc8c7da5c7a0e14aa73252ee8f29e168cc18d8f86aa508e194ee0293b1133d2883929f873a230e70de420baa642df22b19ede64d583959376f4dc146fe4059f515c9006921c78766c5d2382beaea59d193412bca0ee2089879cc142ac877ae7ed28fbf7701e0faf67d5e9d67576d9ab571838aa48594f5b578da3deed5b1f95b0da8128aead2666e2b9c1f1761fa468305783d2750858e7631a8f542bf68feb19beb6104af54d7a93b6c525bf8aba295f49632e4a2fae92fea20e223cd626cac3955cda8b08d915775ca3d68cc9f313bbbe5c00dbd4c5003d485d64bf8385d2cc417728f71b7dbeddd4e5f0df9dfc24f3b2857e007b658f5fdf475d3d256afff95896c536efaf3a1dd3b95ebc5f2550614ab8b430b0787cbb2eabc40b4beb6d72f1fe2f45d84c778816faca60470c5d3a6d74fed8ccb948ccbb2b3b0cfe944a25146857948e8df89182ad2039211a350b37ed7d5dfacbf322a02f485d49c25ae84e0998fa07051a61a6d135764b344e728003e94adc3efc7e640a1ee0e407ec660b59daf3d2d477cb8943a088a6869c4e8199427612fb74ed2da77756d92b5109bbc53b1c5dd2b331b190756153a132e10877bd057b4da911e39546788bdbb5e2eb4433e5e058bb868d86ac14624416939b6a045a5d50d8ebaea6a80331957f445e44757912276e5b708164fd2ac40dfed8cd0b8c320e05dd925f6de411bdd7cc9d907da53d0a840e3f2973cf100aea445ba1ded29c5fbca72a73d51a9ece11377964090f2fe71b896b6419e614a6799c7682bf3bb9d28a682a109b62f0bd22fb71ce1d5dc451b4c1ef3e337d48ea5298df35adc7195141f0f2d243c1f1abeef4867d45bb1daf70acfd711e817ad803caeff091168fbbb6bb10f9a7b2e8d23e1a8f9c90afaa84f4d32bb665540d35059c80a7036ed39602418939abfd1242b1dd34b5e2852967cb3bd2a305e7a8e40457f27e10924bf55182f443007375c28ad83654310332a04b62d5d6e6f63b9e69eb68085e9ee331ef6d64192242b028d38e4509186df47cfee266e47225b0ff6919f8685cd98cb09d5b1e9c49f6a2c86a3a9435817fb17081b74df0e58b4864cf866b6cfe04e70da5850a1abdfe0dfd2923380f69bb05a094095b68106bc276c83957e510054818ea9904b37282b00c8fadeaced5bb6776f00295591a36ef4956b2edd6f4da68c34b27ebe1a77877d55e10d64188091182d9fac8afc6be002631b22bbdac1d8900088e044c3f0323fa677e22d5ed6fab7c48218eea83b3d5e1aa16c6557426e4494d155da1cb2d3e3c4e71d3e9bbd894634dc3bf45e023b98edd88d06707831eaf1bbcf247cb40689e75e660c9ce9300609516d745f7f90ec6b16647b090a2a68255fcfa6e21a27ce36372895a520a46f38821dcb9cb4da7243f503e8343dce281d52dd338d2fcbb640e67da8d59ff7d622e1581403013ad14b8899abbbf8ef32798346c70af70e54e62deb529e8c99bd3d5d71a0e7fe1f2f81c3561404098aa3e98e5cd5be4e009b8fed101357836f59573eaddd00d8125c817de727f3e0405851e2bc986922900ccb070f52533fe6f02ccb367ebbf45a8a67cafb9df952f0267e58d0b8ba043e4481f68af7219e20e125f8d06984863d797f9f0fad9eac0c923eed6ab2f36d89ec4bbc4d6c2c8a0a87f426d16a34ecffb42f5eb30276d7aa3cba07e0c6600e494303c12b9ad6fda8d24375445252f8919e28883aad828b527064a95b9791a97f6bc20bbc56d8b0df03d58397811cdfdb0cf594462bcd867e856270953c1ae0cafb18bd72af2aa127afac855fff17b416198dfdab3741ce8c9117041d775bab55ba7015f02d106e9615b126c0c9f53dad14e1df6752da14508abbad3df07e2abeb3679ac21bf0b6637a05d988c8ff3a6bf786f81b6dd573c75531a24c60f3b0797a649771954506be27401b5dec2fbd0c5d22fa1b9e6f11a63f840468b6a58bcc406c15b4aa27467128d419aca23b2c37c67bce666d7071dac5ecb54faf395d32ea56dcba2308e411d4bcd52cce8479c424e9aba7bf59fad6e9ab5f21cfda72aac330ffa1a2b50c5d869910dddc3c0cbcc9a63963abf7dab17764f801e8d102755cfd87f06c880898d96cd040167f050429d4ffee36056af395e4dfa2cc6e87d88f9d374241839c27e0c73b840788993d16a619361a531773df76ed78c599dd176f2ca2e876e81616010cc4081619e6056cbf7539340887fbd182aaf57edd8efadd5025face91bfc29d89d8dbada9b534696c0181075108de9d317b8d8802ea0a4a87d687ffd9c217990d0a208891bf62b32e3c4a997095a528f04110c006d86723f0782a71e0bd5b81d6ffab521fd04a8bb796ac5f5e911ce3e0eec9c6b41610fd9277e2960b5665bf61618f9383b47ed0d791fe904b38bd4f4b48196abf3ce358589612425c8e5a6709664e60207a96a725d61195d206c0fb438c0a0009eedb63e5d1ed5d6b2b449a3498ea040392eb964236090d989a40098beb1f7774aa94fb65174cd26db1c8809c00c82f931bca2639087c8b2ab7061f5361355fe30e70641f59745231fbc63412139a448c1db54c2555d6723a96a292e9091abd0f6316650dd32c051bddc62e0d1b0eba581a91e048dc30b0c4522b12aed1a873d77638a024dd939e2fb8da14c1d882bb6cc9ba7eb9c0edf0c680b9a07d1e5de319af51b5d35578c781ac03cce154464d0da79ea68687fbfb1834549a1a972436d9f7788daebbda8f95dd37b7d44cd240dea5854d7346ef357ff3845f2ca6535f25ffac15dc1bfbb7569902be53cbbd8e151cb6f452bad51fc409c6465d5142514a0ca5ef838987c1d872b6755ed4b5f37c0de59b193f03d6e49e5774066c37465710c6074e0cbd5f18618f0ec935aad34698e91e1d9494d357cf1a68a8ad0af00814d8d8815c2d4c3f0675b7e79270838b743b852033076e6f1fd3380084c2fe2bdbc8d17342b3a1a59a16b03690ed8945acf04e21ed9f5b87782088c17952267928724afc6be7bc1ef0a6eb623a706f69ddf15409f8187dfdb2620f698a50370bdfc2ee0b6714fde18c33241d6d4ee9d5a1cc52d5d98be0d0e84dbc64d4d355c6d11f7de112a0bd4fe6b883eb695d064757b23344666f26745c151819f831b866485d1a6de416ac0b44e42229315243803cc66fe8d93a252028be6498a8c99bfd70ab16c7ee51ca6556c84be17b2bb142d8da8a8281b8ee32cc2bd61d3ded6bdaa2bcc68cab82edd278c79ecd63c543b48666875d811a1660574f9d7527c592fc64b1713ace08b7145331958a671784528b57596c2483f72a865b3a82eca248efe5c552da39a5a4152adf6c2c06c00f284aa300ff1a8eb9c3f47f29ff145ceae9e301a00a0efe2d7d87141d4c371b0a23f3969f980867159e9011ae0dcac9f1e8a518a872dbbb6ff57beac07cb8169c4ca7192ca2557dafbb8d3feb4d69566d233f5e775306bf94e3973fd9bdd5db2e0ef82654242301f65cd0d2388f68526b912c291795fdf7d6796ced7c749521241fb83639b11f2967a4c72e1a3c84208c01725921006541fece8ce649ae5a5b67f89a6652c065ef3a8407a27c3fa7ae5e919d493ff9d1e3b016b400143d489b4bad0e54ccbc5d4cb743963207159bd240692159cc36ee9335ea3de1d3d2d67e4ac86c77cedceed5d41cf1e3e9b9c05d662171d6f6a79970e2810823c3c9dfc45f87d9cd58a71924138d1cdb66a207752ab22ee5d716c6b4929217b3b093d187b68d343737e05f9d07fd535bf4b4884860f7dcd7211c35047bcc16b75f3e8ea2ff3c8483fca61ea6797ef311590a460490d32705149a5c6717fa16237fba6890d40865013160c7362c3292eec11257f1f354837270eea551abd1ab5686aadb5934985851a5e5ecea9d0fa613eb3962ca903389114f7314dc68836b9f9b50b0e256b81deeeb951472321b57549c508f7c5f7883ee126d7fe2886632ee4c9c5ec2cbde1b76ae6a2cdba55c1b7584969edd1e56df25f53846e5cba1c8e2e8f1055ba2e835c7344ffe546f67ae0704bd6e1598d32c9c2e9d398bffd077124b5b1fbbdcf676817b4e3a9129a671974c942e62b5e9031c4547d7e1e896be5ee2954d3b8eb891dcae0372443ff6596ea57305d9cab49bb9a4ad97c43b0702dcc1fcb0fa0d1687021aa6d2d2615f2cb5bacdf55b7ef15f2ad47825f2348dda863a5c347430038d0ba2ba09ca25a54933aacf1cc4e6a446f8fa44593ba82dd2427e03f0bc45da8ef7ed42d864a33271086eff55472180c0f5f95830e4d630c712c1cf036f9b532382559c2fd02cfa2fe90c84960208ac2672ae4fe499193b86c5b74fdec4089255944e17328984f6db12ed5e28e8510547724b4d77d1c6782d24e3351295712045a387e59dcc4f1a5c716930c3708250f5b4adc04c75eff7a8b3af0c1d272c685bed7c90742673505ccc63289858dd1245e27dac1209c92acda29707d853830a6e481d354c7329ca6ebca7ba6a71c3bf039855325260a4ae038e7cb8f26e5423770259a5d2ce53c6d68c2c1fefa704bda0bb417fb3e8aaf2da824af3ee52fc7f0ec1f643a3e2cb65adffb10ebd8330c3ae3e9a427525ff4a47b780aa7ab86e950fb5b75c21ae9989f179b74b9ab4957d340dae76218354775ebef6cb6ebf84edd36d9dc80730d7f0da5a69fcad9c651a106740c1c78f0c930067b7561b5d5614051d98393ac92f219032a7d47e033e6b8c5610088cf84fe89373a47f5152bd4aeebb37aa41f4cb176abd5be404d62cefbc5cca683347c644efe3d55983302fe9fff4f774d6a06fa443a28cfcf11654ccb0c193fcdf8b91200f288dff1f298dfd97fd4c0e53ec8b45a1db20982d3984246c6015d4c5d679146cc6058d5e3d7518d47a623275ae700a6d20d188d460f37e8c0ec389bbc73a1a9e21683f069119b1fd440e4167e9d772cc6f24343bcd9c9c25c290604c8d1248ffd679fd1188ba129727788fc2a4f062b1ead484bc87a43be3bd16d68dc95bb24db92591e7a762caf8b3acb7d2883b14cf55cbed3de1a2668e4a15fbe8a4fb2cc22d456162151696879a7e3a31554007fac41640dab9a3cc17e2965963e73ca736b6a262b5b393e60fdd815dca25e027f8a64e0caa04b076d050b489742200cca9c2b9fa8e73200572b548cb8790d444fbe870aba5abda9acc3f25ffcc05200bdcde9290ea002c28d774b132c79ecfdf87a5e7aaef19af2361e5c2c8d7bde759caa8c3ec39ee16219d0b7ad13274df295630bcf3a28e9300d288dc810887d0034366ccc09e0af0b9f81991c3381c0c02e04f66ed09934b83197161789051ef3f515fb5e28abba4c6dc4bf51354e525d4e941c87676bfe3ec114d75a83ed9b0cf6d6ca2adb328373e9c440ab2f2e1a6f65509dd518563ad590f09d776bd78a00df63f8496a9c384a9c118507a2e1ee6a2736ed704df0aa1d4319761bdcdc4941527c3d8595bcfcd2c31b71eee50b0b66ad9bd7eb29ec6e836efe2758d4520cf44080e582389461fc64324fc4918f1132c977fac9a5841bb7696f1a7a20f7a42b499857e426f7a02ec1f21a65599af19a1113da6a03cd9f4db8146adb6c0822128153498f2db2d62b4d44d94cf83f431b5d0afbab8e4b8107948f831595f895b1e96ae19777a6e5ec509b48c995ef1534031bcb915616cebb814c66fd64cdb334e131b1f9fdad992a6580d5bd3339f71fed3a727ae666948c758d9a14d1c16ecca034a164236f2cf4aece8ad707328ba97b0ac67bbe5a3fd856582393eaee5a624f92418442980558795a69b33db5619a157a9e7a200e2e9736a2680cafdd1249094a29c981602c98e5f001fc68519f41dd48ec91daa69e1043326c237f1900755bba8fadd8a3721efae9cc9718456ce55c81e7e5e243e55a29a4e98214b26dd401b4d719c1d3f1a9f2f50531587ab173b894e1d490cfc816a46619f9de51c911d1cd4cd8126c1269e7534c1f73254558f998851ae210085f8ab44b12eb3ea919ebcc8104e17103d48ca1bd574cb8c9d30dff9af8623c86cd9f457ca2d920307343308d351b2433a019697e408b796c99f93852f337784d8d320a3765b353ddbcbc999ad39b78bee50ef68f74d7d87aa41ddee76840b803795f59bd464a7b20bfb9ea8d6915be3880adc4d64250ca03400cf1a536e3a95671009001556ca01c2beef1595cf4dd59f3841f1e4358accda7540bdc8d8cf51b23b29810c34d36ccdb92d80a5b7a182e694f2d3e360c008f44ad204cb7135319c484c82a1df1131e4c9a7ffe287b7812a2e45df9d46aca9056a9ac3bb3ed91b87beaccf17caec269138a88d81c1200fc2959e8e130d8d2c953ef1083d5ba9c0841e106708c50d8f79a165e4dfcfd5c3d88d65347bd180256ceca595624188c9b3a9179c84bc76ba9caf4b7afcf7a63881c83e2516f8a7a8733169313fd0756a0f7cb1414755ab42e20206f13ade73a4c59506b1a4ead516dd8a23480dd7e18984ed00ecafa8c8f9cc70be7836cc0db13497472fdcd22ae1228f12910425a811aeab7512aec16947a2cdb776374cc3a394dc2576842e29f46dae0b679a6bcfcc83affbfc58777ada0bc8e964ff130ce815edc1b59faf05d4cd4f2f93fd8860b61f339d238beb330e78c78711d419ee03f4d1be97a862898157c429ad8e5267b7855e9e1202dc2fe88492e61be115cfea9ae2a05a05fa300429a883a50e83fb45f18e46ebec186da0f7b0a0c27c68a9c0f1ae506ddcd6261ddd5549ad810282bac77ded134fc875458cf1b8e4251daabc9ef1182dcfedbd10c0792d0a4bbddea65a81ec4213268a04bdd20998388a66b5c2e447f9374256efcffe7dbae08d35fe99850950e988df62480f7b6ce901a6595e3d01462042eaea49c24b0e41279c97b64d015cd29b029a96815f33a3920d9abacb5dd6e78086cac4d4ce93df30f71e47cd51fe4f86a38fdce86b7440f1aa1de1e20ce238e1d8228e62c7a460c01e9cc14ae58645bd45f18b88f3c9d9f06598e1ca3ca71f875c69473b4db0674f251f724034060a12c995a917404c3bef079e50911b788b110a92ec5d410b1981163b7c07f0d76804f30ce52fae9967d92a47e4c0a4bf90deac9a1ef3e35065bbf1ea382d9b53e2f9e225be74341bc2b4fb6cb5c017db2916e845da7b57ca1114ea7a1f02a01d722b370de9315b95628317d58213b6dc5e97bdd60e8713acdeae4bd804a989cd172229a91721f2a813eac646a9717da56bcdd98d911b7ce8ba4840ad82754d6cac7179427623c286f182f8c03ab640b6e3b58000d535f35a5f16e72f6eb852c86b5b1610b881c0d6b28cc0be6893e849d5e01b83515cb2f636744fab3d2f70762354b398847494687998838f8f103a3e90b53feaea3db4d4b8e8eb7088c80add78686b0243c6bed68b8e0b7ad6c546c91628fb19a33f4d65b52e53c6028cd29b6a30b7a85a0f625ba52258900f2aa8cb964a6d7a62a439dd8254f05e8444fb85104d27aed7466582998d5a385265cd0d5735ba71e6eb675121a762944119205e4615180e31c6b41b1c54eca0c702e551e5b911a4ef756306e48613ee6d1c1faaa48c0055001ba0318656255061b687867e193269414527f6be18e83a9d7472c650325f130ac5cec1b16bbf1cfe60ac45cc1f515b2a123451548d9e47323206b08336f9fd0d099f2a345255b3905784ca88221533bc62cf410e8cdda7a82b704c17b1ace768215cc8a9c1147d046bfc5033ac90900bee174ee8481d44b950f96349e8c8f621325e4931be7090031d0688077da2e9a789569aa695b464137be7296628c962729e220ec88b475d69d5e0fa53c962483fdeb095f11b017670779bb37043eab6fcd29b87a91804c5837a04222afae909ab42eba01ef4a7b8524439a1c5290cd7c854861b92bf456770ce54dadc72cc35ab94e8783b89fa25408331a403218c71109177ca38090bacdd0f7f26e00d2c2997537030def2cb0040c7dbe53333601a6bf20a308fd6d3d56c42c811bf1221151cbdb5e96f521b316eceef8cbe2313ec7d3cc0b40ecf63792206d8fd9712259f8913019fbd2d5d81c0aec2ec4b1361010d0066070f31f22329869b0c132bec062fc6441ffc2992be1d8f573275a8ec17e5e57c3ea254a191a913aed0ff8a1838f05eed39d3502abc557df69420e0af53aa2a7572dce65a8afa3b5c22f9b7cd1d0294bb730e55e466837ac9d5530f323f6bd7f87aee610cf5161980a98242086a30d8716a4e50f9f0cfa3e700de6732e823c8f9eb53a6832e413c5a24c4ebf0aeed132ead946e97a81b1d55cb4852725e2ab6be290e841973e2fd741eea69a14c8215e44982b7404dabf4e0ff14e3434d1fac77bcc6565b911a6cd2761f4ad84d69583e0d5d2c0b8785d0ec0b252303dc14a9167f76eb70189286f7615ce842c6e18d636b536d74680d513413ea7f2a0d9423ea5d9e18622f1c8fd42944100b7b7494a2bc1c0b4898f3667464b3131711b37002e5b61cdd7cc4349577b386f59eba69b3a595b2c265afdd5ece4b2ff17b91ec07335145bac19a168809344bf4de601967283b63b44630962711e600dd616c006c589799cbdd78ace77882dc17da118e83c306dcf567a27323cc456abb8faf2a1eb0b2fa3e11bf76dfabcbd2777993a65471190ec8ff5828d5ec0f0f0ecc09ead9df7af11d542cb0ec00c7841043e5e9908b21df01268eddad070ac5f5803484a75df141296bc7d99f9888505d07f44797ad5c0f40dd0730d866f81c40fd96f98045a6a7e2b1e2de57d844018f011ba9c6b8a62f2df6b52ced87d00f94e887b2f27f12785c49a6cf9e07c02f888fe35c4ba5142d60ff1e34edda24631fd47a2466640f8a984e5a3e886a6ae3f98000098af0d025ab0cb158da7eb071e14417e4706db0e3608b9dc6beb719da818b6e7e99d394093b4b4c25be144813081a032b00bf0e366689ca44106c5354cf2653c1b5310acf9041c5da54bc639cfa4ab24c686acb283c8bcca1d91895cf9121616c3ad567c9bc206c1bd5f3c94c706d8cc2336446b1362e95e7a10ca82d4861af4907ff419cbdfc3b99f9dfc38746c93386ccaa80d2a1269a0a1bdcb8d05323b155d6e2e90d4f66a556398f8d789394639a9789243e20202383231e5774c15ecf0da2e1e2cc36b5e2a250d9196ceebc15f2ce455a1409e815837d69f50ad19d2d733383fbd2778eb66740bdb6c8624934e197c06d00e2be0fb9e8bdf971f2d96f551947fe72e8bebdf43607c70b6b442e60b9e814514adbb8a09322f7335c7d06615b22534b191dedb88032eadf9afc3d79159dcbc62b6d270b63b7c9162c5fbd61b8227a2341c445c90282baa5a5e1fd146b014ce6b159e743b72b85c1cfb8427ea64eb650f092f3d08cb50f9100fe9ec08ff6255760e500c248eed4b2911d9b53a4e0d5119782b3c3d6330f86628079105a41068abf1488952374d94b1a701da15df0229a15c234c87c690dcdde41e6e8804a353eb9cbd6d684418b13c7571e0bffe8cd9b6719dd81c61031b3479ae085ad3fd45dda69027bb7285892affeda5f47fec5951dce3ddbad7d14d91229f673c7d2e4274ea04ff011c4c3d79282467c5098a38e57eabb967c89972e693bc68af2ab301d3a1c80a467990782a204d204791cd133423c43186b08d42697c702457a409ee9f07703c7c2193e600970e268899a6718bb6c7bad3803691f2521f7ccb55794783e9ad90ebded845e9f3e7a877fe1eb837f2fe5279f8bc5e973ba718e4a5f5a969dc2d3e32ffe3bc430f353c985b5b87296ccb752aa6cd8d6b388e82b3d056c90977b27c288d25068ed84f1678c00cd6fe5a69e02421b37a9a5a2e1790b75c4f58874572e222afc76be6a945fcbdc7f602c664a0954a8b85975300b4a8b6e0612e7fb66ee3216172af58fbf631d06f3fd45ee8c81da6e46763e45559787808669fe137319542a91ac824778e13edb4474385f0eb26be004793d0eb82a80dd815029104bbf3050e3f040812e2c05bf1b328da901e27ebf2939ea54d0c1cfe033317ac73101cdce28c8cef524ff9c49b80dc2470ceb3672c6d51778682a7a03d65e5a0420581ee16b883518d644de2130946dda7b15f7c38560fc6f0561d5b360a3fa6a44e0b771df1c53ea5b483e985ed4118a86c094176fdf6aee6e63deeb5b7a77d3806d3fa7eb5935d70235443a00cf7e81fb04c80557c28d017321237a93e2cec541f0c23c9c747767613c8ff36fbf4405c33143776f51c3504dd15aa405badc442d0812fcc00ad238e73fc20efc4868b4f5d41b1c407e5847225a007222a7ae28c82cd1a82871f10680858cfa931a97ee6a6a3b4ec3654bfa383c4eceff195a07c0491ba5ba08f1783b52bac3e7109ce30a1ec770178f9500c0df9a717c040cc09291357b8db6d7a091a0af305ce81d2dfe36582dbc713de0e30b2b9a21a49bb1d248812c6588f90a7fe2f50959a3a696b67288db67f7b69f087f87103030eb39701f2158396fdfa70f0c2bf8f636e484304b8214a0e13239c00205fab75e26032c90406f4d638f20e71dde7e82a76eae0dfec0028a0c8e42c071fb72200ca014310a8ec90beadb52704706802cf161ca242d57030e2e8dacd3be4c6d453912cb48e17cad64cacbba19b8c0d57b066a4173b7b3a0026f24b61136aff7ba8a0cc2d6d70ef5ee4ad3988bc2d3a3d9dc3c3599651e33500162a807cfabd1bf1696cdce6e2239b5f0b1bcb4fc53afbedd427610698501cef229ced01b55b463b31a3acf030794a4dc7f64581c71b484be239ddcb89116979c517cb3ae35a3b3ca26ead23b8453ccb85885588f65167ceaa442a145503805f0f41abe55f16a14ef0063bfb8abece5b473598746c59c204a59e0dc1e4b67cf2a03314125d9c2cf5623cb6152754c517a5a59e08cf0cdff111ba49e7262abe5d4ca893886489cf1162f27e965714379afe2cf7fe2a80de19240a5431f855876f5f2d892d9babadbbf8e983ff48758515f53fe4ea2f3182d7e2dc1e48a72a9e7b3c5286bfb9277528ef4ebacecc31e483ab0bb076ab480b9e94684ab12cdc75ef41f188d29e5c8e0da7f1e50da81dc9ffe979daf78690479e8366bbc03b0279a6e13885106c57059b1ee6380a0a24aed85174a37fe4133738a4deece1052c6aa9334eb35fba12104705453e6f2a0c6ae892e090f791dede96332740cf57dc0b80e3467a40580c0a4700cfdce4ddaf30066e6b55bf6bd545366e5805c88efede71806b1195ff3741d9a69b62717347e9940a6c8088603660b3e3dcbf6dcd8c42d94cd32718db4b6b606e7a834f6bd4fc82d09f995a4b3339932bfa808b830003b80e86f975221080ba1b44012d255a34f7dc255e282ee4229cfb90c40fd58fec1d0f79f386836f10926bffd740c96dee5b8d8e26b9f816acce78ebc1419c58b7b9600d1fd6d44595b2c8b5a08d94bbb2a706b5e14f14e5bf36fa15ad7e16265d6d9e9dd74d16255ef6240e93ba319965a532eb66fea8a491cb13cb72125dc84b61be5ba9bce7a149e124d2d9ac2444eda23c990d6ed79cb4217a85ca145dd9d2c68ac2f0732918c9bd33bf600310dd1cafec6c85e1207b200f3ee92822e26450c9606f49868f91ed4bf5188b23798be3bb225accf69091119bca15d66c4f096bd3ce6c35bf7701e7415dea1c189a3e67a64acfba8d52de7f936702fb940a9eb2002fcd5ffc61ca43299837d99833a64c7063473b0465d6ecb2424499f39603f199f98e2a4730380f3e3675f21954c2cdc828496fd83dcdd10b4e881da2bdc9f668701f6bb087d2a39160055e1d233896a5cb10799418120d3ed581e81e95da35c43572979ee66746c14fe677439d673549edc9e9ca39419c28ab59900b1e96706edad1c3ca1dc2f17640d5c7209ea6b1485c72426cfd79c0736c2d9084d5482527b16236c36892a7ae3b4124e5e8844144fb90af150e6f67a90e5364b9ff0a62acbd26c066efd96ca1eb29c2752641ec195f84ea579fe5c1a30c6086426f29376168529522949a4e60b66f58b8846f4bb06b3318d3fdb469adc3964f30d70cfcb99f1ad9735d9858aff521c08780d10cc7eddc119573b1e0c6a630e220146f64657ca7d6cfafc97f367677ac30658e324283c89f66402b842660d879d103ed9e8939473a9fa35538a7484c3d4132c541edbcda874f455de3c6958e36f3c62272b0736b0e4271fde6af42af898033b82bb894768f21fbabefa87cad46f15fb6717ccd49ca77a55161af8dde86c64c30e6d53d20645a2bc1dc04ad11ac8901e3a8a62649959e38514eb0f3d28e79c58f2465641eb82114cf4f790acca9c2c2bdf1d2555b1cf4bf4f0e4f555a6b452ed236d594515cc382a45a69232461b30d68a1a137a04817e65e4be2d2b98a87264956bcb73cb1d96a3288c5c1ca230940a081b6beecd78055d73264cec650729b56bc1acd42b2aedeed40b7c128780c64282747258ace79237cd4ba71e74b2a22f495acdea47e2edc68cdb04c5d3afb68708aa669ad5fe21f928e90223a8f8755d63c80908e7f6300075f967f6d291afe6a32b35e17b8b575aa96c9048f48749224ca51b39d466414fb7ed50a0586be5ccb2be105cf271e4c18010f6c6ae1b42319d56ffc675a266be6b90db378d6be2809eef58b2d2b6889a2966b640c4f8508a689a95c8ce614cbfb32f7aff5bf70770bdcc634899d594afb317355d1272c78788290954c043443ac79fb1ba36083f393aa9eadb29a48848a5024e825b21aad44eb7dbe08935de9f79931ffc8665d81b3bcc47c0f4c7c6a0d6d6136bbec1fc1616578762e13e9f3422dea64f52bea5af342a88ecf79211a251dbea518dfa5a82a52d438f0e8184bde2a82414e5371b01973ef009900a4b0aa23ee839453d35d80b75a396cb5ce05467e4c9035f7dd3122ddb8d4f0693e2ba95c37529883696ab1ecfe4b5a97820ed5cb4a1ede75275fda71be598e474c187d51865f44ae801678c930cd7d420a212bcc30bfeba4d073b08de08ad1fdea2fde3364ea4afa6f20e5c556bf374089333a234a5510e44addb5d8a2f64334ad04938579ba21187d2881f17fe6cd3fca4d1cfd98833dd775ead0b1ee2c3e074ef8dced7f685b922f73febee3518e3d268ca676c81a8a424c91f59eaf5714a33e649710890de838c8b902cc6a987e4af74ab2d3428d5240a3e8d34c3448036ac1968e37ccabc07be93d177cd2a72fcc78d1b9249b4f5bb3a06771e133f49ad0c551ec9b4c361c7a42c54e679efb3587b289af2690803eb53222bf7ce52ea21fd665d9a58f1d060b99b05180ae8aa35ab5b65d57713d2427140f1eede320b9c07516b8e51a9cb14cd2c7a63f22231842823cf75d4863bbcef769e79abf4a6e82ac892ac9ef74a0d8db33ae4375c22631f2220560ef3004ca44ab612544f602b1e452a501bcbd87be605e8d0d436f34af338706ab43f5bb8a807ce023735e660e93929a3bcd8b5292027754e686f369500a8d30897950822d9f6da548fb9f8edef9548178543866c4a8709a80f9f78a8700d5a36959ecb3183f57ccbe784e260fb9a389c6f4115d7146c72e6429fe4084a53005d0dfc9fa9f465ec547a1c2c864b0fbec7d418dc62334c219764c975f22f7557484eda4bdd805449868650b6f0bc20588a0e768fe08d24fcbc2486be9484929379ac4b2c1dd598836253234c14959720ea02628bb62ae7b52e421887f1310cd5e581792be168a96555b69242a5b5aecff48cb94e6e2430932a4f9ec2d839e8981f6219584b8b75079063af2483e09d572ebe277472b3dfe8baa4b8b4cc4c010e4ca0ea4447b0d70edb0981dde0cd56c569b65c86506feded7944704acffbd35b99511486b8fe57c09029b6696ad1e9a26dcb6db90e42cab43901a829c2a910de2305780a97f68843a0a2e39a5294d18c90d300906eedb4b013a5284e629645e19bf22cd6d4bbcd275e82637e1e13913ab728f7841df0c3a806da1a61c3e1a39368d18e3674b98b67c4c2e518b878ac43adf92081296af0aa63d87398d624d35484211addb5ea6a9fdee8c7c6ad5ae70efac1b2067fb7b318457680eebfe6dea92509f80d77673fd33eb6583b4ffa19dff8049938c9dc04ed31207bfa4eec2a7eed1175312889836987184e877f3c0d72f03d6bee0d6b92c45d0d23ccea5008c108b11671064ceacc506435061971cbeab7f042359d0f77e9f8505ba9b9d56890aee19f8a9c86116ae0684053157d1b644ffeccec8982ccbf6780ac5037f64cf69b9b6ae390e9d64290e8777bc252dd896f3e39286e3516456dc7ae577fc43816e0245ac61f221a6e48a6e486c5294df38b793aa899f4e80c33bdfde7300a0eba0a93aff8bca2ffb93ce4ed4d60998c6fcbec06224c2d4178f0d0320e59c6bac5d087c8ed80de545596d9b39a4a60d0d988601924710b49d1517cd065478a574c9b4233a0d2caca34b5c3d3a75671dbd83135b83d21888f59c3ca73488aa71b8e7a0cc8c3329a1f8b9218fd71224b4614fadedc5d8a46921940a2db8ece6e97b2b38a346c3a17d768ced5e0d98e0e9655787ad6d06542d2212bcd79f9c06bb2233f9877121cac9e3d8cf031a2330e3d7099ea0c527d6963d9dccb141ccf41ae20c24a35eb12f9f7bc61874d901210ccb8f015afd4c261dd44ce1861d58c4c52217f8dc503f220aaac391d2d6de57eef936607d56940e0245ffaeaa2ec1d20b29e9be979cbe8afb7473171e8288a0a4b73dd1af52433bd3e8625e6f102460de178eb0a57d6d0e2ad78ac486114a8054d3b247f6d00a01470aa2580c1f3fbadea24c6ec4ab02fd30b19bcae72c9bc91b18b038514b1a99c53633aa9d74bf7eeb41d68741aceab856f4185c284e64785e6c9e34199d6647d1f1394026d499a13de1cc0c6f84ba3b9465ac6dc48c0cd09865949e26c38967d8a9fddec3e6e4e9f888d4386d45eedb021f94b59cfd8d2bb276def39d9f00380108d1fca2d03b70991cc550a6de1cba88a622c37c13e43e1446307fe88be31fb345e933bd4b9980a8a294d478dc8cd805adcd17dd7f5cf5983004b6d6f5f3223c2a65adca2066a6db79cb320e428b6d6dc3ac059a199f7084a477d2c8516fbe7ac0807a273568666cde3a64c15de2d21b6ce86e72fb8181e460a2c660d490efeb8b89f7a8052ce62b13fa0ae0f744b1b1d55acfac1e754afc5e7607619ec4da991ff721a10a4b34d60dc672b59438d465acebbee85d28e1da18ae6464796e33dfaa6a5e2188be5ae301b55f6050e4d4ecf720052caaa3733518d0e3f67d34e4e73ebb9a3a2e194e75c8dbbc93569bb3dc4d330e44bd97b089cdff24dc1f7a281b89d975cefc225393f210d0fe477538c0c69c8a4a0a78460038191c0f43cfb8a89a8788868e664300569446005e726398a773c6d027724a375b53042722bd78cc8a1f5f004aaee78755865461e84a1056eb751c285e657261bf0d9cfa9a31266ea3ea6499162cbab60214009ac927291b18e5f90e4aa296112fc68fdfcff000a1a582957a24e06212e7fa9486db01aebde25c701d5f03c0805f23e406c102e2e6c1cb5aeb1c8389930ae06272b588d12dd165f3150d0ceec63465d7e92e691482cca274c04ff9b548fff5df3cc206d475cf38022e022bb27c75e79a45cc2c0d96db5a10f521955e8eaf78d2eb8bbee3e0d8504e04344c6a12e423fc47930ca5cb1a5637b0f6f634f568cd39f5e8a1acb4db1e89508ce5a90be0016b2cef327edaefffb81b085300ef8ca4d729af4d7aa37c7bc4ed1c1303f722e3123b62993bead3fa5d58cdba9f5f940c687393aa6e5f09ac490a10a35406e994ca8846629ce19dc9e1ff823791a63808728e28d406a3ddb616a251983ce0faf05a4166f3eb5e929994f7a852ef5520b70c45ce30ecb0ac55c8e783285f95e0d44804ca1b541c4d0f0b5ffe84ef9be16114b21a8f952858147ab29a6444b06e984329273a30b9ee5c72d2c55fa69298859a95b1916e16144534b68970b4657f2feceebe0e0817f9435d36340e15c56ac82a1ebe7da24f29d9fbce95fd0851110b4e2693afeeffc00488e485ce51c4f28d81287f6ddda51a92933d5bd20f2c3bbc5527b571e74a5c4eb1c7e6f6ccaac064c6031e0dff2d2228034607427f1253a4eeb1cb05667b91a8f21f835416016f46a060d0655df8538d8e9205e1fc88309ac94c37cbc4c3c5ba8b704c7fb4cb33b65d3033d0897243fbb414f72591c6db1efaf08c2293c1e61bbea802acbb4af346e2f5a531fb6ea40da1b03953d30613511c6e01e84d29533c55a1eb20fadda5f561238ad76618a1e9214d06ed17022eee1341e266efcc0d4390c239b7efb26b93dc976505e03a11945bb3c544ab3a0622014268172bfa4b25e867cc8417469753b1696e1224c1d9d97f7739dbfc1a306a0cb7b454ad6ffc3e8b3fe27d59cf52113055dce206ce48bd92f31be9242ae9e2c58326e8b94fb8b256f2f6d8174e5ae3ce5c64cbc718fe7c8e48ab1cc7ebc9b0c49e9c783348ee6833336238c208b66099ce02a05b42b298610c41d1419b122a4ea8c8f3f2f09829e8be6261164c73c102d25923f28202602add6030532a7fce7b46fc85e4eda585684a9f0bc3fe9d355557ba0364af5111f72828c3e1349b8445e18eb2ee333ea666c185f4cd4a18c319e8e2b2f041cd6f5ad598dee5048fdd4d26748324ca7e82939ca972bcaa5b09d941143ae4d4450590af81dd137a4b8345291084f4b840d5c2298a3fad5d289906957af71c57cf7c7fe85f1fc71c8d8e1f14a56761cea07f858fc2a60ccdf1806a91194cb65a338f2e71a6ccbeb12d1f324522c0d0bd78fcb71b83217a7580281425986b9a88aabcd303c3620827843d36e2ac280b85b6dc208435f95d3c494733329273ec55f372f7d7248c77fa348ebd8e31d09caa02386c9c03a923e6bd28541a82e678a58a90d28b6b3e39090405be2213aac2f9e79023f2657c7056d6c6af2d88b5bdb2477aa8e830400fff993f4951570b466029287448bc2d3bb5b74f072b19473915840dc44688175dc108ba101a61fd23884ead5e0a2073c30c961852901b2547fa7fe8969976d4808d490b0d8f401658d8a82636881d00b6df507f899acbbe021f0436f143bf87b4a382af959574145b61cc67ce97dfca304b89b81322cac33f9b23e71e95b6b3d22178c8e74e8480ef1a6f65a3c3c96e0bf8385ea0c1cf7d06b3f86157152819acfbceb4346a266324e7fb830576e0173475f45419f7db31fe924b9a4bfcd8b08e27d78c6ff2667a77bfe1f13b821ae3dc9497ed45c58998fbfd05cd073c10f1eb791fd5fa96442f09252c12be4abb76bdc1dec89fcda378b4cb0a4f91584e50d4d1c9bdf67e52f41420059091dac8695a6500da7a3241f0a3a6eb6aa5fccaa06a8518b658c1abefd01b5079c114feeed7d57a953d73f858e2c28581a1afd35ea6727f966d4e5825f8dbceb1c73fa0025407f271649af76b03f0c237c92ca417847d22acdce6d68afb14e981ed99eb5a38332c2db498535e68341986123e391a4f0bd682dabb590cee5010f3ed62419912e5dac42a468177b698066e218963080483462e2dc2ae086e843c0315d65994ad48e86c119e5b31dfaa001dfc4801fe92d34153c55689d79251a3c16ff0e23291be1804028691ace16038c207d97f75c13e7eabe3e3bb5abafeb2020701000decbb24bd70aec515d645a581695dbcc6c9dffc094b0bd4cdad8223653e9acba757daa8c8f977222863f32b5125522d47b35734f177cf3018a6f01572b91d29e4c164c1e3f499d9ab3dc960c04f02cfd24624b0adf854ea33731aa3ea605a7eeca4a6483b9076cf6e290ee1e04e5aa3caeaebeb2506c6a1c31f2f435b3f51ea15433fa6de02c1fd093b086edd1df02337e36367bc378e539f4d823ec39f85f71666b68ed592268e109781ddc16dbf8dedd74a400be2ee89fd20e6419349c1964d402d1d41106473eb9be211c191cf939a98024bb3a73197511b1039dfd6c3c452305cb4ce96dc1a920f072a207226e9ac2824e39168066c9ac7a47da3756692bd1fd177d2e4cac3a78fd17178492be5439a3d1a8ad42cea72036135e4c6eb3da40b53e920a008320ca3136144fb4e22c9b53cbf022db2f32c4bbc6c17b28b87020e44fd38e986c510822e962e6c7437d78351146b34152cd91942c49df692d643404e7107854b3dc027c8ced2e8543e55aa81ca10d68681a1018ba3084211a82024a72d033689ecf0b689d0ef6f4bed477c2b6bbe9d42669945603f085f08b4a9637153df1fcd6372092424578fadc2640b51e17478dcd99e7b0e5a12ab4d357621220ae7a00fc4c6320c5b0916218f1a269201c613973ef6bced57fe5c1d7c4da3f329b30b72803359bb5ad88fc973c960daaed590161cd60d1d970f809b9594c73691939120412267b6b3d0dedba58a50d542315d2faef9c5b087dca16d20eee7c3e47045e43d19da54867b045dd00bf55ec463c40b9c42816bf15ccc35548fc7776319eb5f8a611dc565aeac100fbbf287453e278c75652dcd415d9aa9ae7cc93949678451fe831bd1fa45a07ae225d5df3af97ecaee1d9e69b388134f0a4e1769387fffed685093042f5b0f147eaf6f740a3f027452e72295e011b23ed10e87daeadff897ef634714d9465829e27bb38ba10d3f4010612c3d1b62111d0371e006202556358479409a0baa5ba8f03f3a78a4f9fcea75b5de779b6f5652cfbef4bf3afb3c74aeadfcc0d3517df77b5402d9d9a2231e7b3092c72a857de758b0f5fc4b6486e4571ef490c6333a667e49b73e2f652b366f12f3152d8b941f08c03ac1201cb35ed5d2916db6809757e0b897fe6699e19ea38c0363e6afad79362eceed060b4c0653b67d59423c47acf082c484599fe43dbc083c2b444458edbcdb97c38d1603ed6231f999ea99643b7ef28f72a65da5c39aa48af9215a6706be73015c7363db20cea2239375198412ef006aab32e8306db3b751b603efbe127d8012c1f8291ff18a27e622861d4a23a418806576372c0243c40aedde62265261252b62f22218a4025e40b798ad038a140c32865683180491f9a37ff26ebc4215ce363244234e06b0468fb0383e52e0dc7cf019ec67dc33783bdde842938be501cf56360a0a3760cb624ff9cd1b508d57fb5a9e3c201d21a2e5bc456ef79130651eedc81e6fd4bd73282d8100aa4efc05c6e1b58a3689df1523728b8501a05f672832ca7c10850fb2a3608be88c373c52b047f3317127688b91aa35e933101fde9765a75237a62c72321d016a29e625c2640bf3a9ea2fe083dd8e7291c885d31a71b8709a5cf4ea7a83b420f763d0a027243e434c6cf04eaafcb69d468ec0681e1ef6d1db28e607ea11e1d77640dde499e5b974617f10cd3453883846558f84ac34c447183eca8d52add9ba4eceabfadafd5fcee11a29be5e7143de0c7c08af439c0411dc8d94c92a3247ec80401e17f88aa2b1f45d20247b978ca64a8cc32882baa268cc5f1d1ca2557b93085d3fb40adf4e9c525220e669ada0ad452be51d890704fe839ecc2401d7e6fb1c45d7f0cb8b52142e9440c672358391a0a48f10f2cbe557356151cc36303aebb1507c1b366e2cbc53aabb9678404316cae888632fd2dc0f689f39d04d502557aee93c188448f215be8ed831e765010fa09472e05427a475802b34b5ad124e278e498b33bd2d1298987957e4c8efb96dad8b08a786d1b9f5372e67bd905718470b7c574ab8864499caf1c27896e79cbcdbe9e6696c3f73d0cd646ee16e5ce84f6e9991b4abd973375ce3e40680e00a6da0b92ba675f41692e00a7d22bb9aee36d1cff910fae77e93319b4db578bd3b0cb7f35fd38e166f344bde16bea6986b46839677cf0913921b6d7d883b9f28a6a1b4ed608b277f6a3d1873f7ff55f56c719901e7109c7a0b10fb2f0649ea7d75e3fe5b760da55ebf9f6223b3a7830e6933e6c62b06d6dc6b5416636247fd11ce35473d7ce3ecc89314a23e0fc6591363a9f3d9e28fb9214c5f83c7b17b04a2159b1b0ed994b27ed2b216e8d0ab3544050bb2b47794165887d1d91aa90273de990db16ccbe6cc273a1afc17d3bd9e3927bba4f7e8aed6fa26af0da74254805d6414a2e89479be651a6a87b778bb384e43281f21786db04934277fa2bb418a051c3dfdb0c7a57c2db71f61739b01824c9a520fadcbcdbdc80c0958c61abfd51fa8702b99991a2d4c01e29e8ed062dc048fb5023f9d45785a5638bc824357bbe99b10ed907467fc19a32a3f828e816a27b7416c803a81d50aba541dbe43d55360a823c7dc881d5b6fcf8dd2d5fb1e05c0e0a3f785e9f797b710d9f7992738435b3849af3743257dda0fe1ab04d1f5ba97284363172b5716c0c696dbf427e563480fe6a3e47b191e405ba27b27786c995f84cceca6da2a45a718f6996b332d360e82975f45f8fd1ae9eb61e708b97528182068d407f922d7b0e4719e4a7c13f8feae003f5b88739e7e56f412079ed2e4ce5829debc5e71034a1d990c61c76185d2883b9f747b1510c285527f37dd0260664acddd8d5d62a8f80addcbe15e3a6fc743f2679dc7b1398c0bff781ac376460e969637d1c1d65f8de8780b39ee9d1e49e3ad8f45809fd4c950fe96502690caffc77c216e87792783ed548cf4db2f43470ba6cdc39095480f34e58e717735afe593ac3dd4dc56732c2259cef2e3deca8367f6c1698880da57246e2343073a9889158cb69ca884f0e9be8b1d6859024aeeb083f1cf546b4f306a10493800fdbf120793f3b7f776762f80ca6ca0df66c70d728b80e011257cbb1474d5eebfa9fee4ec70256600c7b0abc44e04e54fc03429e1443ac2723924f12bce7fad1af0f4bd87e79ce9fcdc71880dec9d1368c98947418142485d8a55fd134d767e11b3f4ce196da5fae01062aba030f375cbdbf58d379d09403ef2dad000898038d8aadf1afcaec1e66a1d0ce4b48ac4dd01ebedd5dc98df3138fea636c32f65f2648498c02dfbb86d3c37aa59e7c766923b92cc08652e9c65a0c247a835f27015a1a994c6fa24b93ff27bf0f687804fe86c635313601c4054dd11ea553e066506ee69d45b89d614b3322279284253445d54a3e4eaa07060533659d083f281b4a1098cb89147ebce23e42bd14391bf65584f88db6980b0a76acda84be3f81dd341035b29d74948cde3e4572761b2b92f02f903ec95bd0b91e2cbcfeff4d1de81221028899681507d65c143d8b04a3bcf744b10cb83c221188481d48f19f227bff24a197d50953f937fe1827688ca4bf86cad47a8a3ddaabf2917455e4d90883eee15bbed55bfe92644457882dc2618510c666f1ac0dccf9af6e6cdace35cb225a51099c2629818240b815888d58a8b33767426e4ae46d87432f85ddfbe7ce90d921a2d163a1d8d55b61bca7fb90bb420907a7f6880a3de7a8fc7922b1661a19bc4afa0f84640d9c630aaa46678d22bd1320f4bc9b461232838bce35ce12063e7ca592cd0751b32238cd337338ab8e1c16eb008b91f616ea5e53413e990248b5ed788b10dac3735e146fa0808ef99d8d4de8f921cd7c744db0d3f2e1a9be086fabfb3d002238da66f62af2f2b54e65cc4c8f6819cecead30c0cdc2ad3cb22b4da5d13485bb4ceab3d8ca47b612696e26d7c485348d495e201e703ca119546405fa8b8d9d12ad966d832a91de90b19159fdca4f93620a0fa9c7d4465460e7bfb4fc6bc945152fa222f6266da54f1bc8c4cdc364d5968935b7af6f00cb2ace96524ed48bdcfd1eb233f6435341ead834c6d40f75dd42d932c6bef869951a3ef29e263e38ad12e3d380fee230b469b1ba7de4d850abf4c83e08ccd35281614d862aef8b8d9f4fe9f48c1e9c64957d7be046dc7dfdc77a1b64acd87105aeebcb58abc1ce7dff1c3f8f2b1e4bccec024d6b1e5cf5e2ac23554062f410bdb15744f84aa51ed55d81e2e9cb824826bc94c17ea54cff0adb108b255986d65a5285e5e394db8e0a12337dfef971a4c64205dcf935552ee56e6efef210362dd92eb8ea81f208c454d7dda3b31da32cf2fe84746d2c50cd84c2be9390506aac295748a5f6c5af7262cad9f25fa89131c0dd7ba6d531eea2e9c949f8a11fae75588f150bdf2bc3d6c6ecfb8cf3631a88711f50936cbacc6e52826025e76851b1b19c8ea08e578e5e125ec4586a5613678cca48232433c5decd70a1249cfb24c93d25fd1c0951b1e283ccca375c2c8153156a93ea3b168e1e987a88a844e1d041850148b859eb1a6df8ace250701de4f1da70fc850058d00496c7fe1e6d4b9104b680f4e758a8553aab6547d64937e684ad2c7be329ada6d2be546969acb4ab2bede44a99fa524bd102c59519469448e0e3f761d4b9e86227e9961a16d50f8ba621bfa2c58eff1bbcb74d9d4588287f6ca53562307e6d7bf2d815864cc371b005ca518238281cf04920c082b655fe73477e78ffb77f518b57a0e6a5f8a4126a1014087b1d4a25e8816727f62330a6fe18cbd61e7371fc1b1e83f5d2df729666c047c25f22fe27b5c6c03dd69f9927e63c3fc5a05fd2f076a0b8a527f9aeff847e9869fee3a42ede2d59bd0c6815cb0a364a13e10ea628985f05d7f80272c165182c11baca59f3a5643e1a20116bfadf272cd3052231bff976963b43377eb81a81e294499469aa21698e083d8f83de80d00a49a042500c9fa3d646db17a396b79c4e87f4d0d475448b71f40e387e3ea5a5c8fabb34be537371fa08740c72377e438ab41a72e7c620939ad18311929e17be90e0ee02de165a38a7958609e86734847168af7c118afb9e80c5986b790208eb411f53ed9766c220fd82f70e752fe56a24829198980a56576568484b01319d8a0cc883e4991c05bee6c7d45510e2c96305f62a892a884c99d7316d9017b1ee377b6e0b99b162025dd9f60bd735e492b18a0133e38c4bd9d34834ead51a842bafb1c8b251d738a7da264c9579296626fa36cb50460d96eeb2daaa5aaf6b60f45681c381794ddbce13201cdd4eb6e095a79b7b971dab25702c347628d1d9a6f71497b9d4e4298a5826d6fc86c4755a37fb84e8d14c2d5a2900a0e8c66554b0913a695a1588826069907c307d5d2676bb31583c3bff3bee3dcaaa5f8ca7be22780b0123f2a673361ea5eb7877876907b916b9e04a5d85644b83bac29157e18a52c8947edd9e3fb3b3b21bd81958b4590229fc95509fa01e41a14770484833bd1cabd20f5dbb1659f80e495f52b0008391fd49123bf820dfeeaef805d33ec73da80cd8dab424506e9a6a02ac18e7998d8837e5314815ff8cc376262f3ff3c7e4022ebea5cef9e621bfa4b8786bd9a50c32c91248abf84c28a8a5253b133d4dd4669bf7e213ea303fb8a7ffa749ff3a276ee2acb4621d31ad2bfbac589f4921fdbadebb4f0db7d45cfd2d5d4b0f5235e9dabf0ee90ee33aba7316c9e84ef35731d9a46102af28f2de7e126e7e0b4a40c692125bd895aa5d691959eeab9d0b14147a46f1ef765d9d670deae3b77e8a8c79bf246f6dd7134041c010200fb885f06d8be747defc7b2e410ff162a7f43333811b20f700f741d2f5dc73f920d86fd55f8fe0ce43135ac72c24cdc8428a7faaef4dac016bc71923a60dcd9e7377ae3b98a6c4c13a01c7e3d78d8cd2344255c9504b4f4f0ed80b1d69e4a44c2b6b4a5db8a5e33c68091be64a374d39e9d830297422b16982a80c05008d961c64c87acc52f6f462688559ca99d85139f0017726f3d489dff12461cdf6e5df72c4b3606ab9f437993f4d67eb08f15bb0b7e5274302f969c018101d24ef5a23ea510a3c3919053c02cf82793a2bcd62bdb1b6549b6baa20750704ca7e36437b34e5b1ae6cd6850143b3028054016e2fd840f453ce3f476aa5eb5de393eae1e26db8f93d992a77408515895c975846c703268a7073c26df4dcb69d71705ae2d2d12e75716f39007b8f9e6bf175c01866d723d5b29d7a317e952a7a312eeddbea8009b275ea464d3097426601c0bb51e3c5245a005cff11317fa57bac37605151083698448f9053a1e4c004bdae74be3699b6c9e23e2dbaa07d248857028d1669c33c360e30769ea001eb2514a967c7c639615e5f1278ffd1e2fd8b616603700b1aec42dba1380449bb443cb8a65dab8aa56a427ab1c49920faffce2e42a88169da45b8623a68b2ff3acbd1a165a1a21a675dbfc1e6883978234a7b31fda13676f541fd6aa4018e470165b9d1f9ba2bd0800f34be4997ae4860e424572a5cdc1315ccc7945e3829bc5566bb800e55e06253b539f3fb3c583481655e67ad3d21f6eccc9a82c0fe4fd32da07dcb7d6417b7a5d54b1b7a61b9bc7aa7fb606cbf68786339156daa617b09f014b422d1c0361fb6066644906823ab55a02eab2083c88b5fae595083ff60726f17530387f8134ba48234410d2e3f6f18c6f1179785cb17b879d2e587b8cb869917520e42070235a3c6f14ba372819c73c1dd720a731cd5128a1c70272d222642d51b4b08896b583cb8a010df4d0070f5f49a50ea2fe58c8bd444122137acf165022a1d7bc3ddc177b0f228d0456aa7e33526f80cca2d9d5b22faba30d64a35fb8d62fab9a4aab969cda23108b7368b77f4f4c1d55302fde388df7d2f117381c18cb480350aca3a771120d1d3310d3b4566a543f1d8a8a4dcba6e14e36a03607be533dbaaab0f004ffe8f6afdcbe4447ba168411a3a4c09c32eea9135c94ae938e04daf16f024530e40ba31dceba6e4f526d030d9dd1b1269e971da5423e4578a409d9e9bf2b1404d42258b2bff7bc108a36651be8203cfc96d8d24fb2890342241070ea3eaef35d227e31e0e45c02245920bbe44664280f1c0cde0e9c4e102acb1141cdfc94959bb8422b85eccfaa9c7e01f89823b4eeeec86e124a6e178a998c88c29ba709e073d2c1789e50c71ba896bb25642f8b062154879faed85fa0f2b86451aad47fc181f13a03cd6e110e2001d2270409b88ad5b8dcb52a7e1ceb8b7745966860906ded58d2ad31cd8ab2972f07cfbf2d6f13d339d569e7b5d360265c07cc68fe96bbc0338026cf5fd65cc804512a23c42ef4913c640291f919d9794a6330c20416291fabf2c042474038a53067c592090424e0761798ea5f5fbfc282e260f109e7384dbbe8de94fbcb9e01d3b96acbcb08616296836dc817d2ae5b202805b2ab7aca3d1c990fd617aad1a5676fc11fdbb71f589d823df87f98428af618288ecbdb7dc7bcb94640aa107bf078507646833315d74f4dcd9c589fdc6f96a9c9ace90695acf5a8c133be5fb3ef1fb86ee47743fef13b7af73eba43bbf8fd4b8dfa72e4f68bd86a1805eb6641a941f40dae7f3e6ab60d43e5beefc1484b0e0716b717a3a53a3318959fa02c516d914e289f55a889d13fa6b9515f289fdc61815a138149ff22070b16dafed88aa7152ddefc1cfc27e4054a8754ca14c5d354f4d779eb94a6cb929b9f329195aad2319a699982e5fb46cc1a284640529094a0cca147aa404f6d4aad7277edff7894f77d2235ebbaea6633eddf7311b2c0b714b67ba137c4ee4bea770ff99b0fdb7fd67c2f625d8fefb90b01c860c2b77fb4f4c16566ec929d02e151382339772cfccdd923f9f0fcccbdcf88359f441d103cca26f0199c579fab7a6eaf69cc8837b174bc071ff7d2337ee9c5082efb7ffbe1bb7ef2994fbedcbed1b4aab684fe1fea33ce07c09beefd8f71355011c1c31859bb1fc702cedf584bce3c61fada217a0c184d2531a69003978d1a0591a33d9185f6663308da1c5bafad5f369ed231d18cfeb4571b460bbcbb5bdea7dadb5cec7d182e570b460b7cb4f3b88c196aea5d65a6ba5b5ba8cc6e8942f0cf4359b5a9ba634b4324b5bccaeb8f4882ab92e7327ae7bcffd9c35ac3b2c4e0cca58a32264f825cbc2235f1d1192b9139b34b5324d5bd0dcd9092bed93e45838218e78e9531c0af8a52bb91ed3e2aef05d280577a1de2b3896762c53a36a3af5eb08450295e849ebe699980e6480bdbf9876cd23d345b26cc25836612c9b30964d18cb268c6513260a4d1b936755f9cac957fccfdfafe699cc3406707e92abd32a96cd8eee5c815e1e66b907cc6aefc177857906b3fa594cba254f18cb61c688f17c7bc040f33210933e429a63c0ca1cd3bbd63e659f71d5b44f6dfa2277e6c05eaf9791efd922c60c6e19a661e2962931badcb286aacc41bd417fce401128cc9c0c0c216b15cfe7b1839d5f76edc857fcf367ffd1f5d77606e4d942dd62fdaefb0ebc1185ed1b51d87e66bf1d2cb13b7c802df677f396206c2030cbdf8f18e8e54bf4fdcb65968b711903dc881503c4d507e22dfdc5fef2fc358ff4caddfbcc99aeb58f9a766a9f8d7e7ff166ba3e6962aedf80c2bee61772a702de4ef51e09fbb7c8115efc6006cd9117265e90fe45eee21ac0a0cd133030410289cc6391856c0736529c9942fa1947b2e080c3122ba834213d0a3baf1156d6ae0902034dcf03e17a09420090b0fdea236e6ba77953c020355e9745be95e3b8d7657187fbbe7c2790adbbbbd9df79305b917e8b2b10b9ddddaad9a555b30326b6ecd70c92799786c25b98ae0e62aee67f1f0d1a0210c038262001376efc284d1b73ec1a4f1357d2e4cb96a5bffa08cae5e76ffe86b56bd25a8953520d698efc3e0b6d00855e5d03490d243590d4405203490d24dc35905860e6000bd0c682b316a08d6d9f1d0bc3b483cee5305bbcf0eceaa865776e642fda58feb2de19d4af326ee9e3a4a20535326ae4f8d121051831bc281677ce313d7bbd5e3390f3ebb4a18b71cf610bc04c7c8601f7e9889209c58beb4ffd8b24ae7ff1c5cc943066ae3883e5faff9c794213031a2968944033050d607c01038a3090c284c1a616e6fadcac308795e7063155aec061091a30291205ca92298ca0024bc20b0f861a6a70d3eeeedd218da18a153961fb125863a9553366cdca4da0c9d65287de08ac2227eef4f8dd23517d6f34aaa31157842c92f295d33187fc263be726c0c4cef724401190b0f345d042a9ab5a55ddbbbb6b4c1bd46773bfdfee8698cd9fa3d512a188166d1f6b7fe3e83683e6876c5bdd6ab55a5d5f1d76fa4ccabed456ab6505acdb053bbcf38b5c9f73ce392765029c5e73deee4e37ba71ddb7715dad2300c472b4de373357d07bb2c771d1ddddddddedb4bf64666eef927677f786a64ef7e9b48a7b15f72aeeee5e850baf307bdd98459faa2aed6ff61aa5621a8e871be71c779d023efc20cce96fccd125026e0720ac15b436952307a804d882dd2e872963839b1c58d4e53065a89081c9a1cc12540ca8c44796a52ec26072d4451730c8ba1803835217522cf1f143d3144f90c0bae802830f209cba4022098f24485dfcb084c71125eb8457e5cc0da0174b6bc8b204d4e2cceb0b33627840d8efb214669afeb214612c59e3cf35a5943e08a278d08e52bab953906e1bad3cb51280a73df02340075058fb668c616b25c10c1e1b67947172bb9fb65e5ed8c08a26236ebfdb16122f60a8247c9937e00201b77f96f0a4c35b8666d4e00656dcb6b408d0bf7ab57adff7a1c6ef8a42addb0fe99efbdefb315469e3a4db48f48daaa61ecf680d8620187e37daea3d87faeed97bee89bce746d47723f7f58774ffbd504bc67d7d22eeabaafb6ffcd4387f487dee8778dfeda0509f7ba2fadc98f2be1badafee4772dffdfbaae7f85d84ec3a6699cf24d7774eda5d9b1828e95a5e9800b3753a429d900907fc38cc9a381787814e185908dc39c12fbf5f9e7e1935471a34254cca0b0f7020c4ce0e1f10b88111211f3bccc0a209303748f292c48910c43873c5cc0518bac8d2c6ca4d103f5e929e2f4fe8801483180f6d3633386862860f352f2fb4a9f1e04089a531341d35d1e60b8e0c165627d5fac971822e9e6082d15e5bb45153c453115bca8881a4091cea95db32ef8809145415c36dd4c1d4354fde0e6554988e6946a86399babc10eaf4c7c6fae5304c5c6e1247c2504799ba6d27d31001a81e3737f45148ab8044b125cb5e08e563287cbe44a8312c0002d8a7730db90a58e01055c02760150be61116d385a5206790e68e1acb8654e0d9ec8c1764fbefc146519052f0ab62ab553520b5d088a5a5a2227785e15218860c940ae2c136ba07b3ba565ab4d43b4a5eba454b4b4b8fc305960bbd5a4521db0ef8f3823e76c071070472607f0081b1fcffedee4b45de14901967b27cb065edc196b4852bb6ac492c1e583bb4604baa832dab15233954b125c50189ca0dac17cb06d6149614560dac28ac188b06960b5833b0a0b09eb09c34b165851db1259581e5028b096b094b49cf19ac185830b092b08e5848aa12e05ca2566b5329da8f5aad4da5fe5558d8ed4155fd89eac2aaaab6714810857a14eaeddf8c466f250a2ea411911c34e48f89660d79f345481c716767be1d59c0198d78c4902f6ce4cd98250c5558d85a5b3feeba11996c148fa19d39a2d024cee33c6a04e2ab7612674cc10419eca66220d7c4d2ab5e71d0bcc2d307663d8e314613074d60e9421a1101c11043debc11910124414e2c1d423f917ec96044002ca411911ae4cdc81d021191448d59c29f336906cb3f68b4133030f389ea4613e67b3bfe53c876c3714749dcf17126e5681104c6921ed8e8b0c5194790fd2cb88b9dc2288181431535c8c00664efc025cb15a61e5e6c9a90fd29b8ab88114a74c94153104180f105d92fe45f7f63d9b2ceabd5f338aece593914b3583dad1c32b06f98a06941fbf1c35db47144e99b1f2990805da9b99a69669bd4083ad8926922e0a0145415daa7f3d9b81030103784e2d1a33dcf63cf63cfa3512c0dee29aaf36a45f1e07e8a346ea34ea8a81e3738a2d800dc13045084caf5d8fb29566615d96110b800ecfaf121195c058c8041c0aa12f0aa7fc8608cdb1f984d5891068868de972ce667e8e78767fe0028c3fe7017d368a227b6885a55a4811f601136189c28136e2ebb1a9b72778b3261e3b86efa9cde759cc83da9d416c581a8d13dd3ffd60ca2239d6501825acc5c9cd881089288e74218b27b66e2f27fc0ae8fe4af61438b81fe7221b478a07a34b33b77539db6e0135bb670b08b83b835837e7c17abfa37110707f1aa5bd306c7e0f6ff50f5d4f062b7478de58f8f256b72df7049d8b275bbc5ad560fb35a395a2d2320d5e2f68344c0501f829f576f4654ada1b5a9540553f0e13faa177e20e9cc76ec2dd875f3224c1a038970bf4e72cb3632dbcc32a9b11bb5b48ae78b57fd3d4ef659e7fc19e4a5fc86194d3edcc537ccb07d67469c6e9ddcb675dbd66d74ec99b449a3b43089255b7297c3ad9af51b2402163250df7757d8a11a2b32ab793a338a3964a09b1d3096b3b81ce80eb0171cc61ccb6673e7f59cb1d2ae133951eca1ef6317ea9bc85c90c86821a9b87385154c42b83093201923856b5106cc139d81193f64b1859bc854ac79e1455291004cc80134919b68c45fc8c8f28424e252786143b760948e76ae20a997430a175a482a72103ac078228924c26264e183139e2424119d17481f5f70aa011249c553999811e7a00c316224919b27245b5cd042b6b8c34412e939670073449b6262a957b7ad2291030e6a806209bad123c048aa5dd79961f3022b4c456ca127ee10551298aca19175ac3f451edc4c61561860439046de13e9292f5021b3b827328a4737c5b225564fdc21f258c82bfdad9bddeda7382b13bb8df5561f99e31ab504c835ca77be2548216346ba087e41821307982a602089e8c4d8740e6890c048eae20e91f324215d064994c848177992cc2340aeb151ef0727153f14a1d4c3840f5348f117b694d942676c099727928a3d4c90e0f6054910579020a7c3164090601736d1658c322458432070900312ace126ee106dcf8581a24d0f641319d5b001b98d9632f9f873279e701283a4620d1b9061800cd4648b6e44151eccc8481741304a28e28a16d245268d1c8c284d24111008923b042a1af591304a24111d55a43821e9bb68345f2411f642d2310b4d32831849c4c6196d9c70a37984162389b460a8f1d04dc860268d1612ec422a1a4d233d2c9144fc05923b8432ec38ce6390d17ce1a246ba084641b6386f67b9fc2a4a994826f92d55795007608014aa79d09059fe054863557e995956de7a2ef67c909bcd3c86aaaf788e4466f716e08d2b2966cd9299993d804177773759059cfcc4f4503c6f706e28e2841309a4aa161d55377870facf405365eba3784839915231ab497739d97da352a91888a5e8c06e745e6bc420adf94289cd9135646e40de78e36de38d372de60d2db4b073225d77df28a53c67aa55ee4a6c498f7a52dab4471a9cd2a6811e5158fb7067da6763a02e0c3aa34e502ed408fa027a0587a59292b94ed312c5fbeea71afaab9d92b0e0cb96d665bea58d5318575a38a8a268f1269ec4c8f52fbdf63efdaad510ed1797ca576e9de99e89350d4d43d3d034340d6d6b384a8041fa9dc5faa294527e6f71870aa15d0bb94de4eadccdb90e60feb3755ac5eec4ce77a578eac871ebc7b4c64a8f0fc6785903a54b16b3bbb4af39d25dd4dc8c99cde4458c09ce04ce6714f3ec2eee8579320ad563d616c910e2f6a31888ef9613b6cac7805ca30c615a28a52fd4ad257669ab6a69d8e5b196397dea492e7523973e739b4b297d700cc7dae42baf352f39a5d269342f39252f39252f394e2996da9c969cd2f57aa4555e8f5ae5f5c52c6fba2e81bf74e4acd46ec9292df9ca9f870eb6e4ac205d9f6353ce0a97c461699f109604e41a4a60f3358fa8716a3a13002883c69863c5969803158a454298c58251ab62485b5a35bbb466ce0499e8e8ecb862bf5609c0dd2be87920e879a0075a66a598f501b376f880c09c5c16245d0302a41602a985354a29aa870db3068485f60147f0a16b35aefd6840a8c9b2afb821ef4e5404b82f6a554fd40944234e0ce611101618c88130ab7f031c34b3b05842093f3f0c60c06a258a1f7cf05c9b5852502104352607022609c335c632b3e88be9b8efbdfa20c871e0c7c3408d0ac3f0c39b30bc41856118e6e876f868755e68341a8d46a359fb0cd43d29ad1b254e12147788c20e6e106386342282ba01973103197e111225ee10a11e7c70e7e7583342c5c231cbd7f5b48ae3c8b9d37dc94b4c0cb4dd39613ebb60d794f1aa9f4a938ac6030fa6cc0c1698b5022a7744a149702cf255c3962ec040b36e61cbf09c4d93c604435347bbed395583088c93f65d0763cb499bb49ff91dd78d3bfe7c7ff4ced5c0971fac8c7922460d65fc400a91d1c4115ce000cb4109d9ff53eb8f8f657795e36ac7711cd7a2d12c925a797e92b025cf5ab5ce98d9ddbdf270b5eb6aed3a2ebad661b45cfc5e3d5a9f3dafec75ccec71c7ef3133d7554a69e7792fd495d6e75aab3bfd6f7377779f1f6d55ad1ff0aa5fd52a276c7fd94b60d7b731bfeffba68e5e0dd574009b4aadd6a652ff31d58cd5dab106c02d5537b7546d333663136984264b9f07065da7734bd5093b0f9857c8e4c96227ac551ce6969e87844221274d1092a55fce5ad7c4da5bfe8c122b922288980d9454018319c8fe3e9ab5e974d989196c1cc771b1584b9195904ad114a5741c400cd600b20f52e28a1940294db18c3b1266ce282ca5c1719579e63010fdf91ebbbca7e1ae22586a4a4d4a44c101490ca48f162ec0bec0814d1a18d9fffdaa7e90a286ea0af38ca1218febb6addbba6debb6d4146ad5e49a7b922d9102afde3b38439409dedf5caf86e2449a312aecac27b4c13edd7310d0e1f658c28c4160c66250588002acea9f3108cca0a16943072e2600c50b0645c94c49adb5dd7d362453530b836f5021f8d9f10767ec7ff02bfa01dd297d9257e0557f9bdb2ffaddb46e7efcc8576d860520402a0361d6cc72d33dcf3d6f8e3dad1c3520b53d1ba60c28d051620fc7a1542e2eeaed13d8c5cc40f3cee00a4689a28b20fb701db04be5ab19b4a3aa76ba54093c8029c03ea68d0ee18e71401716fcc817d50e95aa8b534a878828a5fcc5c71461745c4fb6547155e9e8e8e8506edb386edb388e55aa2b685a4cefc7e956f7ce54ddb8d975f3729dbb44e0e23fccead7c1644ba6a530bd4f95f365dbeeb00fb76d9c3be79d7b37eb5ea8ebe78943b48759defc9c38191ce63077f1388c87593c37dc795b3928c5f18487098664e3f67b8c813cb82eaad07ee4b1d1a1b4aa9f870c3e5cbbe60d64df705df423ad0a22a2c1dff19d07b4927f8ffac6fee2ab98378ea48f5a0cf0456ba0557354a1bb2033cb0bdb56b030ab7f0ca0335685564da7266206d11fa68dee21a6dc20f3069934cb14fbf6160b866d9996560585b1ccb225f75ed2d24b5a96b46ce346a93b1d51dbe65abc09b3dcc95c4da5353dd4bc86eba39320a6cf3855f3bb090371bf7daa075be576ade1f6014a87c198d5b11925c640dc0b785e9938a05698676c1ba3e8c80ee3605c7750832339950f719099415cecf6fb7861000e4a41bdfe1b026e7f0d1b686c3fedd936ff90817a6e0fd290fa65fadddfcaf15c0bb3d96c369b0d0d79aba552fd7b5535399b3c27e3b0c1fa170db56a36c44002b8fd4523dcc0728f09deefee2ff2712af191e3c5426047ab829eb0ccb9739c3bc771def35d71efa6354d48d3dc2584d5d0580d4d080bdd3796d8ed96acc69bcc939985667a091921c9fa1c61772659eb7fa3d1f746f5bdb974bfef235f4da54b0b21cdf576e6b833418fc6e71819a13ecbce50fd093059c721436e3efc0a704e2e3063830d5f5e2f72c8f7ded11232994c162ec1401ec219bef26ed9340f4826eb778ed84d0c7ee28b3606b6bfb4ac63b207ff438dad07221c6542ad39240b51f8f587846398237ff9ea06cc762c76a669fdd46a6effc3a6a07141cd5ddd44a3d5a6d3eda3dbb49c238a208105123488a25633020932480f425c59f2c14b0e48c806610660c6489141152a4ec8fefee22eae5129d3448618a6a84113e48d2516a75fc0aecec9f9e003515cad9a3693caa689c04928d07ca5e6889d4eb55601d58ee611cfa30ed5a3d6dad3b4a671adb3651666683637706e3f419019c85d3fdf83a1bbbb833f7d85d9331b6220126e48f6ff0841fb50ee7fdc8502affaaf68e2d260876056f581a17f1f7e63d92ef2e8a13cbef0c1effbc0ef03bfaf86e1a6815b2347ab686d9f2fbce0f780620e1958f0cb9edb1a73b40afc30fcbe8e2b7bec1a02c752c876bf0f4718f653b5caabefe017e27081fd6e190e61bd2e53a20a35be27c7abb6d8926743b3a159ce9749e5e70744f5e81fffb93a98b013b631d00c22f2e9d8a94122311de00c80808b6a663070c42c28333661ad9ab0ea9ef2947f0f7a1ef8757b9ed7d3cad1aa2122662d157d5078182e944f31c8cdad016120d4bdfd42eede9a48fed5a7184408d8e1dfa12277598b1a8d86e0fccd87396f34248bb55f84cca9cd358ef3bcae110b1ff5436e1e67673e11eac36fd4ce1c51407df815408d76ac00cecd087a6117ee210a4d9a30c5b2afaaecbdd1c73956cff3e6f4bc89f2bcd9d3aa568e1f99d01015566580c152b086d50afb77584e0efd22dd491ef39b39fdebcf1278cf3d3879436d94720f7a281e1b0864587f21a7a209e6ec964494bcfb9288d2f58674f0463b44394fe373c6161421759ec6eb7c7f2be5ae9c17d9459b70f9134e548f39967376e77bdf816834648c1427c80e36d8068581eceddf600c04ee10d130d2791a5fc4831da29c00bc8ee834d19b7ca523ee1001c0693bf5751e001f007187c89bc69dfa0018e911cc573b7544a1490fde835167a4d4c9d6abfe5aad4da53caad4c496944669eea24a35e54f6b98114b95dcb5c17ad55fed58568b33963675339629d8a34625d45899d06ef80d63a05a3297db428e8230acc4481a2293a118648a3df806a9ffb9c87d8ec8247db0a1d85275990a1f2efdaf765f6e9b276e4d503caaffeac8fa586e305a37d806ab309cb6616661b85677d59afaff215454c44004b825d3849a74d90835d872d696449e1fac10d378b2d8d934cf30ab730a6d75729a1bc771b59a0bdb6c0be3e44ed3dd3727272777a29bfd2697a51d8e48236f6c225e0ca447801f48a36f645f790de32106acfc71271516d65145f55501fff9118181aa1437485f61d6ccf62dbf9394b48a0be3e44ecc6a1ebcf716ec5143a1241c3de98d8da5bd93a83fd1d7e84eadf22fdd696669636955275db1a53bb993b36fad1ea7f9eee44eeeb4cdc235dd7be3db5ef9105ef53f3d85f396bfdd9f417de4c4961356b474b9589e19217379fb6962e7ad0448c2f2ac85a3cb5d08b184864d9424c4a891750785eebd37cae26fd48ddd4e8a47356129a42458acc85d13964ae14e249bc6ce23466b9e82cc27ccb2d13f73ce983fd77f9c6edb06834d50cdd25251916d5a3b8f52ea793b922ca53eb5236231eeb97bb5f3baba3461decf3004bfeffb86888a90d29ce105ade8dd41b0fbf3c06dbe5e33a856b9fdb305ecf325b9fdf3884f0b7376c40ce2760d334cd7cfac72513ee783efde818ff7f3cb315d9c2f2a6cf913544203d855f43383803458c44b4ce6ceae084817b4c9829110359f073ee8bdf5cd8f0b99361a9552838455fd9f385de01878d5f33563f3c96c41cd5462566be0fb9297848020ab013f6c14aa51a8b0875943cc9a536706a1f07a85d3b60014424b12962948b056311466e14985da0f26a2251f50b0ac958379b4902d71fbc19b01d490c91828e752306618a8fb7eb036d5d45ae9664214f65f474058a8b5d552b5ba9fb98b061a3349c0d87024f685ca92624a7041a50d10b057d3acc91290a664dc9e35e942ce9ac8eeec89d2e5d913a43277cadc05a4572d5b19b1dc837565843966ae0bebacd5998c9e67926eb7131adc32bcb02aeecc8916d9cfad3ee5dcb2a57d3c1dacf46c09ac3b0ff03bbf87dfd9aad5da54ea5fa56a99b0dd89058a6deecb29eb21a45540982c17657869dae28ba7a71ec8be21228b921f5e5170e181ec9fb2fef9a50152ec4c063497cbb857ab57bd5abdea3dad1c32998c0696542a9512c2b2afb61d288cca00834dd884c160b67134b17ecbf0f6c5d1c4a26e19d68aa349c740e26da1b9ea6feaf781c296133642cc964ce3f1c19613c6b2199b0ff3d77247157af4b4c103ec9a4d7070603accd8f27518d14064d8771c4d6ce862c94de5cf2d12bbf37f8a2a70130f6138fee8557ffd91f3837d240b3021e5e584cd9519b8c0623f8ca68d7e344b53dca71f464c7b0a270df309aba6145ecda0099b367ae670fba79327d991a3d784bdb8aeeb601346613954f41260ac7138611a825675531a52d8149015fab7d8a24c993465eaa6acb841668d597dc30d549a8706a28bb8fdedeeb22ddc8c0bb3533b8959ded8494935c9dde76f210e27b66fd949aa275bd224249dd45718687ef7f7d1a071cb4ee2b0dc4ee2b230abb18060852d6912962becf27aac6312f749d8db53826c9c521937c8764b9a749b26c9c072427058681216e67a9e9b7d4a74d0205b827dfc553af3081469a09044a6171bace082ac3a82f89620907054496f842315e98d46dc98249208372689ac5f0e40680691d3d57135b81dc2e4397947abfab28dfe0630ab5f8859fd0b78c19240426aa6dadd3b6eda900975466c4a1b104a4a4aa1522bb5b60dbc41c6f62dc311b2d87222592161d34968897ff06abe0c694eb93f3e4a0c456fdd566a25064ac0ed6f2d958b75e28e00b3d40430b66c25a516c25b4b2bbde006195e6ab2828935505e4648f655d889a084f56f408f07349625537417c130605523c1ab6ea569a39f97dcfe1804c1aceea68520851fadf4f2c6525fb5b1d417eaff774a299192d2a684c3c434d6c2031e9052176d0c152c4c76a02d29c1e6071dc6ece085982bb8dd6f26910b4cdcb0a5071e8c88a20c0dd650f1e2c81a999aedf5c21829485c3c69418c6c276ac801cc1055929a701c3d41155e94805561a40555908da6cb161b9ec0d8b4b0a4eb8ac080092992cac8224d1637587286991bb84459c303965aebcda3be0a2294cc6e584a93040d19822d74c0e18922ce3ced40f6b7dc552449152dc8a2768495272d1cb0a60c1bb8f8a0a60c11647b9e7fefa8100443100443100c5120387b72fce8106ad1c0be89f264fdcbbe61860902c3962d9ed9a57de84f61a03a85c0a264a55753ca9d51d8464f2be097ad57afd8948102b6d1e60ced7b1a2593019aae1f0670108b6d30d08d8fc5f9fe1603e57c4f6145cf2014d8c6fc92a9987227528fbe4e4f42986bedb8fa79202acc099f53a8d44df6453dcb0cd108000000e314000018100a068301b1604424524445fc14800b6f923882603a1887a320c9511883084186284300008000012333534305001ece032de03d00b0ebcefd27e2ffda7762dd5408c5ecf73737be811a8c2606c43acfef9e87548d4b0011ef7288f3d92cbe5b751dd8015e81e0b85e3a900017237073203f815347a4d1205b911ccc121ada48f22f6ff6f45862f556e6880cbbb6e39a7c7b40186af891505140d065097429357ba36c499a32259fdbdf4404b63d021d646c591494f314ee021cab8514a49b221287f0c1d963ce4361401a79bb7b822d3884686a2764d0f6154f6adec847c18ec6697f44778428314b265268d990392198d57078a42dae8234a140bd814d1b0f21fa3c74422fa1de5c4c068ce5c9a05d1c061877e1d2d243bbd3d963ee829801c61eddf1fd29487790108d178cb7750a0e2219374c8f8237dc258aac5cff6d3c410346bf7b34c39578f0263ebe60914920b76f1b52f294d1680d0e3e90820ae0c1c06c15045cb1adfd17dce25e075b2ee662c155f5f0b70a9469a827285485d9b4f6a381b47d1e78d33ca09a992fe3a915629e2aef486725f3fe482ec36a2fe43997568519cf3d34b9e89da68de0ae00cc12ec9aa7b787cc94fb1d9a3be99d70400df305f9d0bc2cb0a971bddc89ef6bd3217c4b0811b2d6853c4e631a8ad4e54fd6adc82408bf5a929cb1684419a30ba6c8087b1f9b7f905c6465b5a7e72b65ea9908414f6984ad98170f3c0775e1dee7c66ef627938f5b9b4f3ef62468f0292052def6e506527c3ff1a5113212abad055c0d8cad916dd629f210be63e39f93c7fdf656a59d2643a88d07727bb76b2b4805b27d4d926d0e98f351cf401705b3426c41d61fcd925455f857115e076dd12e8aea07589d61971e9816b83743b4fef9175ccf1b54c8ad672ad05f8458023c4493900c470293228868c1238a3a462ef89dc98ffda5cb5e2c74696dcf4a4d3bfb71463e0c69e0f2be7ea73b8cde6a3d59eb54e5bfc7768f9e382f38810e1db3c17c8290fc065fce74f056374020aa2a391f53c5b26f66f46aef20f2c8c720a90442aa08f68a6b87f22c214502b55c12e02403c8f066a4fab87c0c393018d8ecb94108cc96638d75a8bef820e031f6b525155d5bcfa8840600b9e95755fe012f94c282219bb6d1461d0721e780e132e7883bb6aba9d7b253886d2fa4c011834072ce78a7c504a528f0c06b8bca54983c1ee0a53ada35bd8f7fa530c84a321080973a1ab461444610202f27c4fce700670841a08c38e4ea3023ee5d10b0c2233b9d75af571dc2c239673c6d2b0c02c0c993d13b661f035d078319fc67a53c95e88e5fceedc7aa0f800f93a3b8fc89953cb9170241e0c3baede9d3246140e6730903053ab5d3fbe6b7f106e4ab1c85d80c05470211d5940373ac96929f197f5388c6fdde67b9b5f4e60c37838fe7318e6becf8f0fd4f909da3bf7c078d3fcea69c09808cfba40c636cfb423f07035f6486359408f48871ec27c0498a65bdf1e697fb7168228cd86ad98e439ae7f6588ffb4c1eb18c59a2e4557c004c83c3c196badf846c24403d53703ab107013ffaf95f5b4958192613a5214930b35ad7c2dcd1bd90af8ee6ba1fe5dcdec224bd12c4dafe5541dd18647944c508378727e743e8de7bf407c692f66802882c479ce4014a57399db1a0b6c50cbaf11ea15d6be4b8f72154ef0abc11a71a77333e1c9e823f1fde69726f246b6cdd6da9ab0ae434ad61e608406b9aae50ad1c1a72c9579d4828a676dbd287f685126c8cc0882417a2dbc82002d7d74531a2a8a2ed60382713013e0d169c84e376c220fde0585d2182f83d146c1b41e8f5352250a62f80afe1d1a7e07c34485594ab65bc8d79e3b307d1e0d6b8795296f2234bd000ef47329ad7ba3f1004be92fa4c33859e54844b1a689cdcf7f0dc72b6c41ae2194e878cc2dc3bc64b8974c66bac1d93a798bc65ae4c503b8ad913fbc4c5865013773354ba907ae2c4258f1583551ad97c5dcd54ac2f882c057d4a195fccbe8633e4a14d358b46b49244ef313c163c3dffb5de71c8ac2e3b19a2de96a1a68e4ef12cc34304cdfde93a23e7b83b3629e10c73d5c6f64da5bb273904bc838d06ed80b792b57d73280ee359da2d445c1dafb98a65c6867885bf7513a48fb03a7568cd153f34a68f057dcade38a84e9b3995b2509e34cf471e296e0f9c925402c4808e046ca89db6cd53e81aad4e4d39b0a980e8404a58d7668bef63d405d847282a4c7c66901e391b886756b6d600f9a6a6952dda551fc89f6f781a9db8423313425c5422239aaad526c228ad819372e8600e363ae9c64c12c92824f16114a0d7d4609f36929c18a8a3713cbc3201e023913a0f5211dcf1149906376ded33dc772d5406ba59c1bd96851900ba4db8e5b773974abda232becb499f26e1a1670b8e0c74a7858f47cfa573730460a6668736d392898396d1d394423fa2199c94bc696625035868c5947fea7248182e59b22cdd3754798a07c06e5843d52f6ce4cce93b203b7559f90ed3ba393a4a172a67c0635a803e61af4acea78fde5cd2949946a94d298fa8c17e69502911bd551849d8094905c3700fa08afeccd29e122ae98463db11a881429de82502203c9fb3aac5b1103ad86bbc06832fd8006e97074d251d7fc656e3e3443f5d03963dae74c5ed5a0984838d9f3d30cb310f8eefc85c247af793ad1b872a6efc3a1305a7da409e10c9e3520bd4ece2d2d5ee4a950996385a0f51b646f0f3e4469f897aa6fa34717e9ae260993e6cba2a7028996d2fadaf2165e80d4a68914e2b3cc911545cc2bee11916cffe0bc2643a46848bd77334046083c4aab82206800b260d59127889236af36d8b4922b7c4a8434ae5599945addf5b6d482bc4fc3c9a0873f5f1d8bea4d35948f4c82b99a5b4a46d333e0c451222ca42e2c948be1755932c824c5b4f4b20eb1cc83b2b50d715c2342005c6e7d3b21688c3424eb864b14388e78218bb0f697e1d4380535405ea99fd459da1a5854d032ff5362974365a4f5a0e212fa4714858cc47020730317d1df7cd4f2095da6b35bff474cea7b77ccd42fb809b458f81675904d5721af79fe6225a88acc845426fa7f697ee88eaae396ef326ef9b892c1fcecc2218d1268ef2ccd8cbb7ddb52a606837761b15e78f7787294c9aa9adbed2b3f01f262456886f015d89fffb5cb83c2f81e251100bb425855843b2dd4ca7030096e92318e59dde4273dc3075169e8e028592876a8fc6383d9c60d279747fc959257eb4860e6c190705d733c899fb02f2b40e4d9b7098d862f66c1bb8ecb215267eee5af240112bfe78f024056b606e76f049d1286ccbe71ce5ce1ecd07aaa557c01c5a9eb34ba0b568f50ef4ee1d1fea95cb9cb1edda39204551b49e39128a420fe6573ffa6d394660b66f51372fc2043b44902ba443150c51cd696155de577101040d6799486d32bede4830f7d1ebbc65dab64c203e5a7a3a3928effd151995eb2e80fde3aec6d38a5aedf0b63b2fdb9c14731f76183e2f274540a132584dd32056fa1bb9e388ae05e302be48876fbb5009ad3f3e0977289a2b82d90e411666d4c1771e1079a4802dd9374fafabd83fa1095d132b1f6a8acba20dd7532440f2c324c5e6481fba82230a0bf02c4d6189a2e14f4c72f6971cd58c6464224ca0e0a1bd8733e46d2462be1b48c4f27f9491835f5617c6291ce403e8b98444ec2e54d6ce6a5b89435733651d61f64c234f10a1dd879c1a5e89c193c547a4b987e2ba0d542261d3bf646d560e9f9a97acb830b7b2b64b15f109d5477e26a48590c84e74288d086086df4c41b722464f929c6ec8f539fa3070e7d1b587d152ef826b7d81693d2c3f2eb424d0e5284e150bd25eda3904ca7602515de4fefc8f4092e4657dfb03e4e13fa0c3e6524b385d771e589d96314d119ac5d26988321c6462c0287f09344c67760a49fb56c1754ae97aedd8a7e09e3f3228ae6e3256440d46b8f744fa7c571a9678297200f05ff3e045f1a6fb139c6c0bfaa90647e61b824a8bf0db6d72627c11893e0c75c49814097fbd2934ebb85164ae23020ae1a96f097015725cfa4510fab7747f675ec9ef2ef91efa1104a3e8c7bd30e8abbdf7d832baf963b2a5c2cdbd8a8a55683f62099802de726dd8cfad8a67b39b10ed55d8f8f09ea2c54a0a1c9ace12639f688304cde6052d707f3073f2738e2fda7d84b361a26eeebf6c9d0085246d00c887aabf1f6287351442fe353f6d69dc632b8bef10938d9d12bef97bb0c062ebf55644f180816d517d57da41592dca6f5c7cea2804a4ca14c28a263fb82590616081d8c26515509c63b69007d06a4335578e848768a6520335ab14098020cf215f0950d0895b21622b922fc64ec1bec78eca2abc290455e17005208da83dbdf18eb0197cc525d301e08b8398004dd906e92260a67ab84cfd7c83dfac1438358a6dac136b79b02afe6049918d5be3f82ab4550b1f67f06c9395762da043c92a420c089b575330b7c2afd1cc531c68242c9a982fe9eba4798bbe906e837d73bf465da80c9c80d78b58f3eb36e3b7dbc902489abcd8d818f4c5a81c834ee872f92e0964a381de7f8c50cc998169827e2f34d0253ac82669299ab5f173c606895ed41e3dccf6e8bcdcc597c9870b9234f935aab73cf7b6c2b58dccda2bb9b7bb24030d8bc61719c6de7429634cfabe63b7e2d0c3477f6c99a91020724c8fd881c50fe2b85b6539f862ecffb45c635332f527c6047b74718cbc7cdfe2e229969f5338a38fdebaa78aac16e7e6c6b239a8f5502a817d434ff1f3f80514ed16494c395dd9c5653e92cbf3a347b14950c42dd1ce1ae9f71a68fbb7462b24c688bf1f3e8c3fa08cafec11bd4904b984c6111e0fabb87d54d9efd454222e998f97b06acc08cbb1ae3b10bf2a244ee7c1d87643be00c5ccf2296fc4ec741fcc4e1ad12a9140c0e218678854ac7729bf806c16065899174243a9c32a2baa80415179e3890f69c1a628538d0703c3c044fd4424b53a0346d5337c11788a75872a8ff8adeea50099a875f48ba631611a53ebac0938bfdf48dec61ead2889397b1d76ccf39b9984d8759af100c4f42c89e7d0477d3bfc75dcca69d9f6f9c0d04e2effb2e06dedf812092d3eb09e24421838455593198822de495685875c6fe75b225ba3376157808ff112fc55783e5ba2545364590472621b7b235b47d02b5a4487f127384d839a3510d0bb5c880a4a28bc680449a268aac43fa75f1937718f191ef939669df582012860fc0cce4e480138d97232250c242d79e2c7d992fa913dc91103ce2a97297da75d3e7cb20b866fca96f83532c8da2a2106fe611630f66846f52b6489491d02b2563aa4f0c1d0afa452fe3a946cb778006d20cadaa2b5f2ed79c2fe78f873d8bbe35ca9c971cb72362af6c604802ae196f5bc181280dd121f444255c0435cfc826758632d4d9b28e1d89cab0267f18b542ae4ce9b92ad7541bec5495e3b8f75505591a7caf7f0beaf54054aed6edfdda352be0799bf299355e1a3fe859e23957b45b7fbd5e5fab6baecdf8207fdb7b5986c48daa148fba859a6e6602eaecbb00c33025aef5e0fbc52dd9bf4f07d0d8c36dbf5322886df1794919bcb718206be0855270049e1924921d3c1b7177d164168e0f1c58d3d1923eb9b8c23ff83abc96bb6e5990a7c2ccc517797e18ea341b30a1032716e26fefc223407771d57d2f26b7cdf449d0fe6274c9eb86f2c25ea0b963932ee3b36098e7db29b16dc90139cf400ae6054de0117e7a70e38c49b160cf60d6a0dab8ed2ae1f0e95cfb436b5c8cd73f5a5890bcae90bd5eede19341c4f455fcf802ccfadee4c6da3ac27bf6ae2b9883b358e285b86508f00e7dad2ab2f8ffbe683ff1da6169148a876966e1dac4a022771260f50434b0b9ea5947a2e5ddfa2410dc6761963b6f612adf76fb82c1f5bfd74d2f8a9753dbc244b63eb68eece7f2bf63913bb69cbb078dd745e570d55a454897327408a56f9682def834764f4085683b7151b823afae5edf00b561fda5851c5611f558b6a05d8eca4b992f7acf044cedc821cda644bbbd09a3aef22b85e9965b5a816001af0ffbbacd772ccb640c8b6490a012ef89fae32813c17228d7b0626180885695a88217b23f54424c52ac964ce2ab26e17d0a6ec88f71f9bb76a3578c9af6c0ff9c39b3e98ba4a8337aa1228d726d9cd3f4a89645362c2296125a70498534f06a4a99cd0a35ce240d904583e02a762cc021bc4689e42a54ce8d67177957cc00c80d5d67f3ac8e25690f763d3fb646ffa388a6c55924908b3d939f5bd36a8b6426a168110f2b19440fcb4c77aa725d5395dff13d9db683d9a5a651f78412f5fc853209928b6247bcd7f70343dd47e4c5430a4d1ffa196269d0815dc5d295f7624f5611ac9051f2373d0f8ff9bb98ea1ce664f90202402986adc823a38f29fa9408d78880a4a2aef01f8ade2211d1464900c77beab032beff75f2fcab73b0ea6016988eefaaea29d52fb4f541caabed548672d5ec2862d7f78be468a26f121dc68e1b3beff0750c3b3a5443e8c470ba15ec23415bdfaed616a68a5ce6e6a42a54078db4c4acf084b69844635fe2e25807d35b29fc24dda59ed59fed1081fda80b30960158040a9c8247f8bc8a0b653e4eef4060968ae9e4e8aed81dd22a56287ab4a0d00482a0eb4deace78f560880de53b02447ceef219133b3029e21b068f49672c7a60c5c39562f743327dd0c2af6de12d353c247c727d286b0bb124ee9d36ea38bdfaa4166673d938fbbc883f71cebdf8d332b95b8443a174e6db340327b2af30f0f7e6510a34244024fe0222b67789a5b23b172969a770919a6168ad773bb44f241e2d20565f5d12a5dee2d0674f8115604f9604c3226b8d6c14d85361803ff58c6184fce4655abbfb9d45c4ecf6cd45d1f3c1426eaad6cf25833f07c9d9ac0c7a6be0179734b600295f0d45d805c15a2112a70902c5200576e0c561c83c295ecafe103b0348d9b063714b3b2bca06b5495216abfe7bc0fa088ff72249f91ce234bce34727d42c1c712eb24570384e8f8b52e5ff59769b03d934a2dd81a52c5ac6402ae0841a39d092399018809097efb0c1f6a025e12679098e0b2117365d2e6c55894db984ac24ef7370057fc79d505111e9e6fb7f4dc4d793b4c354a33dd3135882e82945bface0321366d15eaa9f1ee936fd77d6605636c56a98be92f97daa5d7c1622377aae61b3e359f1df80c7a51164ec06d68d32a29bb8a4b668bd4ab50d0334fab08642d389a5b2a2c71b46962e9c35c56758b5a993fa0a594b2d3a296d853562a6926b6b5141c3920ba6b981e8b034c239d76c3d2d115ead6f6851c9c2fc64b2f5435456b5dbfab9a563965260d6d7d3931bf82ec7ba14c081133bec7496611752030e3df770c40ce68b030741c6982fb119a01396e79487e601d837d818d6bf760a78ed11aeca429ec81a9a30393e7c3e435322d9f827d16296a8b1e6fa639c34a8bca19192acabc91ac88f717337e8fe4b29c32b6b6ca88cb08c22ebb0fc95bbe48a46a3e288b20c27281562d34d3045a7634b9d37ac1a7c98c215e6650c09dd4ae2fe75c60fe4a879f45d1f3d268d114bc2fcda146d1461f00d3688e47a1a8d46be84feab9d4c4dd8fc4d80c7b66742e2eff1a33c9749699e4c77f1492803aba92f99b39fcab382b95697d0598723f8f9d9431595a28e3704dcccfaade77293d1e13cba8c659e98893d8fef6d1981d92304499d8ae29c61d17398c829a2f699be09eae897c4553a6c3c7bdd4b49e5f5440356dc5d4f316f2b4bd0c1c2da21a44da19a32166a04af220f135e3c669cf6593179bfa54f3a0bb2eaf4d6e66b79f0ce6e82c1c0badc3625a86fc4cf25ee5b25b0ae87423cc6458b10e073ffc5e6e4548ae54257a2bdbf50ef6b7aa516816ec0e703f470b26617e31df0ee8977056fece84a73cccbb9e5d7a9076680a9ead682e0dca115bb79926246fbab6979d48065524fa542aaa53d90f994ce6575a4007a72513a568fb8ae895f89bf606895f7f0eb382bb7d9a0a384b9eed95df429e928db9f5df729540840d00eccffa1ae1b078a4f7d15f2740a5083b90eea5a68491894b45979a12236b49a12a01c23902847b146f5c4c702c4300ecfbb9dc2deadf7f01b4a1a5a1eec2b31ec773a5cd7289dd98dc90e5d7130b61a0273ee4af26421108e525b78fbd5e979811d891d0afbb5d5e0383a84d09d15e6ce88ab67ba3d8bc2c3c1628087edfe639726464a6584b812ea498902c372e8e0f55290e6aec30a17bf0a1dbb8e41712e884328e43cf23caff9409e632b63111d834231013b32cc4ea9ddbc6842d52c31ec7b1c6dd5189f9e8a297b41c0fc7a70f9acfdb7dd96e12d48bd20fd92c169f7057fb7956a2d3ad1401ee36aea282df6ea4f8991171bd1086aca4bc5d32352730bf2a9720025c33daa745d970d7a76b3fddf5634581b511d122ac3f7456db4d8b7320ed944403c49e2e801217034b20df80a0b46050472f7bc4155c0930ede421888e7f14c6c338cab0eb301d00fd0d42561266c70d2786876567956355649523c4143e8d871e522f3b3c949a674de38517a4f4aa97558425f01f916ae7d6e5fd335475fedb299e4a6e2703c6da34a17213f0ac0d983b249c26a3d1e652781d5a6a676544728611d0957c16ceca0a3a870718dffc502140813e930788fec7f20bcf2821681b673978f61a4e9dc4c3ad1d068e904dfa97e017b45c4345e4b9b86e79d62b31b8f1f4645c3852f6418757c05dae35fa5a9561142958211f13eb722d8b34f371697191fb9a98bff181027b4ba5f083cbe36fac6cf943546a21ab6646ab9e076c66f1bb7ec326c0ba88029838f37f21d41f7ffec0df94d7105c3ca375445af25ae46da7321bfd4bb75003f5c35140e789a1c07b3b3a54a55fa62185097517b85b9a86fd9856e810ab8ce81fbafc778ab715c189bc42e7b88cf47494b86325ea9224efa60b7115e32e6bcd5604f35c3d1e728cafa6542af10432d801afe113adbe0657b09d7ca36ab2aa71830e52daa813ae7c6f78c037edd32abdcda2bf3079f884b60ef4512859c4c5f0770aceac847e25c7890d5907053461af380541e0424297921692334d49307f31462cdb37290e0bb49209ff74066a48c65b0717e032dd714fc86c8db504613985e6cd356ce9d04181828f2e6914bd74cd4772a33b90a15a6aa5c0369a00eab2557ab5ba83aa6de19092c8912f61ff3ab0bb9311ecf151c1a31a4f255ce7a444ded57922225318eedb96193f0e81213da3717694ff3efdabeff57b8d35da9b972bcbb8de713770aee52a2163f689af80dc50267d5887db5299bdb42cf149c3a9214356e4b9e1da04bafc11c2a61d5ddac0803475ea3f82a9ffa2ce213619c54d9b32976314a72a59353436eacbbffc59377784ae3c01007db58c4332d5e70ab9fc26005f5d19bcd9b4714d28a7821b6e5c0320a3f14b5ecb5e9297325d89598aac1da0d67825f01738ec6e49147ebdfc8d480c0625cc21470d3af10224508b4a529353f1eace5982ac752a512e4106236d86d3110529b08f77b96d6c6ecd8faf6bbc61cea8020166efa2cc05110859212e63b28c3d30c4e92a72e129cac814da2813e1fe62046c19dc815a505b60ddd703208a93bac53587369bbbcd89b1d41575b80cc1f6b778c96d739bad4e49bd3586070a637d8f35dfe469d82a97cb03cb2d1d6c3e21d02a6d6892a215b8f07e88972ea1d87f0e40fa7672de87bb60552636c5026516a1472175e89c422f7aa20945c76e10c67f53d2efcc4d6772ed33c1b4da41c5125e4c39961cca3566c0fe311bd931e1ab8d342f2a66da83947d057eba62be476331d762048a257acb76f59edc167ee22904cf0af79e695aa9bafb963dad129e6e8960670e5427c60e8fa877e8d309eade59f6cef62a0a8d60dad1c85787070af4a1a1a9ce3200224cf4f4eb0e2fa82d80bfaae14329170ba3ef1736a84a7ef6886245de109b027fe79f642e071cad70b119c6a3bbe8ddbe031b06448bbfddfa50f8ed8db896356e1101bbd6d2e8532cca4e3d62807304359423a021608a43f84a04632d3177577eecfbd62aa1d220651a7bee72d4fff2d4be3576c8914643647009565fd6bf68c11557a69c6706270ca61cd06ab748471cda011f6f5d7c04cf4d6d8a7af2f025c14cf66210d3ae8e976c6cb8be9912066e41ad728c2b4a864b9612f1375338e14d88b05771eb791a6bc9538836d00810b8bd51c6d340647356e98cc91f50ebe0905fff4880cfd9e855643ceb201d0088034adbf904aa77b975c143525a816c837e31972ec9b4206f9c4d41a23263d48d05f2d08601009fb70ca1ec6507e7e82f408d124de84e1cfd11cd149024554dc5f85645c0d1b028518b33bbe97c8909bd4e8f53960186bc870d76031bb24b4953a3c48e87c1e0ecd824dd93a570ba84e7a26c9afdda9d77f86452863ca784d07a43a7f48a2f873b979bc7df4ecc660fb54fdf4c6b5c5cda83271d0f82bac6985de0164951cc0ba95d3d89e6fac3918a324842fa008cfb567ae61089772383dee9833e0dd26f7fb92c58c04e82d269eb85e7c4f33ecbcaecf7a074fb12b7184a7ae842c59abfc53250da516e805841e989c4d1e54c39aefe140c8b2f7e8793929469158ec464912d37c605294ae930ead965983a49892c21b4b5474b2fab4a3238c995f969b5905be5c35e38f7d992a29da3831fcc855591db8c29b8d41106233a5a3c1b9cb8d1c1de4a715309dd0c5a5af6d00d0fbfea3a47e68408258b88dc5ae74ca0cb850276be428200d97d604050735b0d255349ceb6bfa62d14711122a63a527485d7097c112730e5eeb575f6fba0547050e348e1f9c88a9029dd6dd500c8ac157f38dd96d6603ae70a03563c3eea9f42a44a178badd4786d3292685bf7853f1000adc7e57466b39b6911cef71a322a82c5c1a0f7faa4429ad1032352a9c6e28ecb5c0c2fb662cdb22931038cbce64c7fcae71c029312de44921ff56936f34eaacc62cd71d96e0eed60280b71efbd3ba6752e168c1c47a9d29b4787a283160afb99f27c8fce96079e341af86d40754a0b7630bb3e64bd44053b999e34dccde878412dc3d0221fb42f8285414237f04b3054dbdc41d108d756515c90034384bfa733d40e27b988119bd81c26444d463f2f9545a2514bc2b65076e0b105755166dc99fc70bf27b8c4ff3b8e91f5360369a38e313afad199cb8928c19d51afd8396ec41928150d6bc41fc0e707703a1bebe6c7ec50fe1e998a5a3de3dfd76ee1978a8ed61c11541b7e5150d9038292b44267ead504302d8bfd140d909236b13c7ed529306373c18a91546bab43ca25859fea9bf229e451406ded0045396ac5f5390b3d26f01a3f5738fe2ab3166c56e887e91312655f5b052924c7a4a3d0898b47c89841a06dc7254b2cec85c66cfe2fda70d4c251939035a37965452f952aebe7f35728845d171bb264a49d2fc56b0f248442ddcb51c69402847b159c685f06ac98fcbf6773cbcd21a3d828bb3f09b362ce3a40098b813b7295e82db6724e3987c3a68fa170b589d3c0bf79457c8ef9965149b82b0c002f68c3b5696ade345b3f0a455e9b6a858c2fcd1143e1a9b37d8d75d18911b38b07ba4cc668e4ed8a09c55511ac109473cc20eaa422c813c5357515d590b36011abd58cca51a341aec9d11e6983a9d5fa65bf77cb3219cb26394ca03e82f23611c97dddd885b3cb4e36b75207c6c68561836b0c3aae5255cb48e35cd05ee572adf9a5e80524674d993da043a99a0f04d311ac10cf64f527e79a1bb0908c4639428d7ec8020ab4e2acc5d251e493822489338687d0cec890ecac16c4ddb377ea90fbab75845f6ef61ceab0574f4baff4fc896624e04c829d0eea5ecc46be99135857a280dbce0be855741324e2f5e7ef317a2ba9c0b3b67b4cf6bec757fc2831ea56e2f5223281712aae630a295460c4ce902504e3de4cc7a7fbc9fb2b74fc0912b175a992951c0ec9a25854327735c5e4b64bb67523038488e80f4102d343294effbc0fa68c1ebcbe98075e231fa9ee55906005103d3543e6f5d1844e4f683a7a7ad834652337f61302099cdbe6450f0f5dbb890f08c7d97d769aa625b9ac5c578dd728055d7749ebf1121b5f18925c74f5671cb5b8ce1e21470b28312392f648c905d25586635b66b7e11fca005dd62c44c011b53de79d45dd512aae301b0dfcfccd944b0be878be8719b8f1e61150735082d114d5f36e821e8684de72826a87840a80822d11092d499b80d7504286778fa2203560dacefe70ead0a9ae9c7c60fbba5e42cb9c66dc826c27c311f949b38d65147de596fe3ded750d79aa08f8565916e59ed9f43e57db524b4d70820c6b93b505577790705086446246453cc2d4eaef72566312d6c64a66ed0a575eb0945f56cd8ae68180c28e4e612c9bebb8f689198e20cb2311109609b84d1215df983238e1a896278ecebb1e179cb71c86cb1e0503740cfeab19ec118c6832b32a4f03195ebbf25c5821440a79ce482b86dd2d141095a2016e8dcb00318ded72a8121adc3af017903e3caea84b42e797af256cde03bc3c44ee0851907ece825a593eeddce615a5d310ab910b95f2a6e5fdf4701578a0fc7c0d829103b60796bf4afc9ff9ea39d55f4c61990a14e869d418b6ee17a0a74690be30b4755d683ef0008c72e705af91119c489328f8a4a32f0c09872d890375117dadc01cda9869fb4b927f03884d9d37da1a61088b3af81f274bd7d9e0c2081e4805fc2363df252bfb3431c376efc8e068d031e761ab7d3dcad5b6221dfcde4d9054556bd61646ac3cdc40c4e624ca8756c3c05e081ea289e7d89d086ac7826cd257e1875c6d4476ce1f1cf2f15c9422ebfb1fd9190bccf2de3089a1e6e6429982951ce9c74862d77cc016371336b48f8ef250d2dea2de4a4457a40f6aac6194a3a0729e07ba5a7b7222f00365eb458e113853b670502138bcd0c07a2ac7e12fa21eb893496f434eca6e992d7678ea4a7dac6a879ea97d461a0952479b14247b67005aea26be985f9a2db1b11cdeca9a0f10379a755c1ba694ae904fb4ca242d6a9b8a36a8e495e6bf0feb8320129facaa10eaec5b298741c0a8f0b7a25d62b2bd1e93d51950be2fe1789f8e4c9fb92630205c3b8e2367d16e231b7341aa02de51ae4deba2b6cb1184ae29ed4525b3bd1c3be69ee90a42cdb369d8650f3a5811509c22e9c15336f06963ede74a7744085c6fbc4aad1091ef6247ed30b81159648e00c96e5a7c7a77685f02a9010e410adaaff42ab677b384f31d78001ee8700a584e1621c9f03d26809408a1f9bc18d7a8c7861b7e3d82f2804eb64a9935bf6c0f24c64672e10824687b6b6aa9120f7c41088537ca9d9cd7c9dcf69b06c48a04fa689e9963161e4c16aeda5fce2be4e7ed65be8256af3bddea9e138786246db93f2eaad9a00704e935c5ca152e995093535723a14008267e3579700b7438f31307a30cde645a1e000afd1348d8d4721e3889cc613fd205d6784a8fc4c877513bc130c39c708a78711c0cb5adbc83403477556ed1aaa43d0577bce5b4cd44db6e260e3d6006316a4553bf8c3f963ed0daa753ef160326d3374c2ad3887c45492e995ec6bc5e8d06986f21ffb016d6b7db41ca968da95566498683bcccd6c1edfc15bbe97028f6108e9bbb347cf6b1bb645a6efc27dbd74149f7266fc82da26e771851aee7de4f5c7a561b32376319d90ec4a6451b9f8aa2b811a974556ae52d89941c029fa508dc1b4c0b90956579583430f4d8a5521132fa268f07938ec12338b03a6b9cb4d78531cd61c414a2342c6853b2158109126a00b42e00a7998160b6f6633ce0532a87390c41cb870ef0b7e17f9327290d04bc26512326bcb84cb082e1cd001e3f65e6d62f04768aef185b152dd0b1d401ac4ee899c7a96da2c0dacd94d7ea75b00a0a97445021929ba1667435c718a097390ba98186add3fee229d1ccd95d1c9946a1739d0d7b8a84bb036410e353fa2f475f81460b4c4c005b052c2e16aee90cba83df3680cf78baa82a1b3a79e5a74b5bd1c918c4b02f50f04628b820de59793b37cdb0dde0d9c3a48e8cca7dd4a66bfc2b660b65faade0f63263e7c015f2169652695fcd45c096bb8a6b07fe4727a71aac0b8ede5c104a53b65f2fc019e66f724ef8eedb4ef37917c136de259e9dd3c2c735586d97e1ede09452ae467d5d8e79f7aebf60e110e80b54e7549fae59ec86e83a2e2c1baaf9a62245adfcbe9daae0a15fb3977b7fc0664789905581b7b8b1d3bcf95c8581ad72adb09d2bc386850b2918803bf3ab4ad34793e2eca0026224dd30b39aeba26f2c40e33e03f315b06904cb3ab100cc6fa7b2f8177d04cf4150049316dc6f9019f44e73ba638422f06527d16bd1743558101c289f0d9cb04a3a46c02c54676d2af2f4fe1d55369b7f866b6c93ddc40b166ddba3a5a229d6168da03601079b89754a94bcdb328c30927a8687559eecb4d9120024f6da2dbafae9e96cb698848c1ec63fb674e9b4393310a6d7fddefa04b84bc8824a4b4041d6bf450a32ad2709720ec61a9164614f4476309e6d228c35f2e5c486fa1c03fd6264e362f5f2e6b79c8c356ba422d2b4b3395efb1c733d2fd5196966b66c5a667e65b100da990bc9656de1e45f1ebca0550e1862c2ca9001aebfab6033503930cfc4114db9dc48aeb6c73c074f3f5cbba4633d29cf91b1e031202bddb1a8a17a864a092487707ad9cfece63e1159c323debd326c951e7f978b9a6691a832a1a3f886a77e9d97f28b2e78618067b8e826d8c1d46576ab025cf344ef19b3b0c3347f242686cbfe04bfc18640c774aa8bea3facd9731b350e775b2db57dd317f67e49b8884bdbce910cbf6f05fb707ffd7031112e59c7571428c2653a78276ece8622a69a02e3a59f503c1722a0a5b4a57fdd0769f2edd4ac2c10532832d08e03020001df9a6e80d861f1959464e1705704964aad81d7ec8631ece7fdac0fc246f0b6272c34832a301eab4fb48f166f3a305639549cd13ad33edbc9a072eed934da4f4e541e9e0e518f9126ac3cb8ab3b543646332e590f7a50a0fdadf366ec9291cdd22fea5cb9f66d3bcf7624a174a0215f8316f128d0cf18bdabdbbefe5eb3ec005d2e36b75ad508d74b7d6b201bcdeebd632c584d54c169cd59bd008ccf8b0fff2866fdd65a0064462b0366cd04cea92ab02a44c7d66d20577ed67df351f0ec40ea413349e21395f007dc7afc6fe1d2d03ca5c8735c96cbadc1a476678ce7cbf6e24ba01e8e74d79f01ce552bf8fb34a60937107d2531da168233931330c36e82148644b18cd1adbea2c80e48932c46fa7caa0511a04720137d61e6269b31d142f32561f3a26b73ad70eefcb5f2af5805b6e0601a6ace5c73db85b491a6b9b0d606f983a1bb98d64db591700e9254185d003fde6a33d63a3f939663a8fa5f4d7d6f9843a9a1e3a61346b3bc6a9e74cb784bda3c1b7aa8d6b9aabbdb9c9efa47e36c5daa2c51ee34a3e0c99ef00de451c9e8c4b877ea0f4c3d75fb76ace321dba3c3852c2b29e8aa7fbfb5a135082b3c6dcd845f4b69558450bd76f0ceef0ffede393ac935e41d3997f701651638fc3e16cf9a8a8f9b0f093339432e333912781ef4e70b900a419744fedd55d4dd50462ac254f996124f2fa76449f5a518dc885226d182fff9257fe657c35e4c73b36063a38350420dc9230fefcd949b2f978036a51af2ca7fcab474f4dd317142737e1c99b1699219a8aa51633dc56754da3554790b37996281a97f8304926beeed68ff823b3fd2eb0b920f292819839e6b1a16c0576735f8421ce3a81a3e77e51ba8d2296bfaec19d2c55ec1698a6dc3b835272879f69500f0810f66cbea68ae050853ff31b5770327b1cf74ad3c18f61b9750e8eb92a1593b2eff904d7c5ffa7b50698e878434543711967620f41296a5d0940085c237b30b58107d36a774043933295cef2a925d8194240b41b0d09c033c21d932c5303c5f0ba9a7c78ee4b2d030eff6135fd0c11fff5d868578597080eed4f4c14699b04198b1cb4fc70437a00117e0c0ec256337d44f67716db83a09b0c19f40978a5368a10fb8ee2a940874dfc7874c03152f94752f69f1155bbc36a3608a979de7f9780fb4efbb19c5d2ca1f56c78db3f3341aef66745847e10511279aa04c5565487e0d2f6cbc099fc71e2decac28cf88b5cce350258b0de8cc6de9b7b2d3d63079a4683de3540d415323405c88a88762e55463aca66e71855cd5ed81085af72b4501d7c5447f0ddd6f45ee78fd5b7055dc319aed23f77242402d3db6463d12d0756e919cf0cea388cd0c1489b5c5ad871ad4818ef66d9d062d56e2095d5092a019a18f901d75d62cdefa0be2bc90ef3ab7ac91c12c5fa6253616f698731abf6235de0b39af11736dd6335cdc1cf3e90bd91184045000c7efd09882931392ae00dba52d6e76275c8e894fad5f6d221d678fc0f38c81cab12345869188d304970b1c6b0389d73933a2b8209290dcffc6e0cf22f202590feac1d9e0e55de06a4c3b353960692a363711f1b60ac0fbf8f33772471bbf4dc315caf11b0ff55742e841428116fa3473783ef277be2cf08f9b0c0b980326fe1e0fc89ee9bd424c0f2b116533235b26529ce7d637ee6a665c7409a3e28f6637b994070f7deffd0b9de5ebb7bae1a085db27890a3900a0bdf77325ef23d00a44667868261f8bac1a4e11713133a14be68a0133685947c534bf8c549237f231fc1cc7caf59b9df846001e1bd580c7c8fc9bbd1fe129140222f5df78e0a8d44b02b26d0b26930f53b2dfa52cf25b62155c5c62cbb20e9c0486d6897f4059cf269a5a4b68b388dc2eeb44b84f2fde22247262ad753e58adfe0d436010def861e06d752ce8e5b7b08f0573a9900e1806c30e6f8bdb9ba12b8866a7d05a4a9bfbc332069f9d771f246d14bd53088eb5ffdfccb08e6390cf981d2d10347f42039d7b74871e80ab3e37048b6d72ed9559e44e4c99daf83d6b69c2685a3b681f049a05ae7a23c3700829708a82e01aa27f537d30626555874922bc6fc4e5fecf4149d766c14bdacee8a607b89b4e1c256c61a538bce9602966eaec534fc082584a06f48956ffed8910a3ffce655a068c4082e3401a392c02c01b5e7f87aa4b9e03ae75be1c4d4023298548e4ccd702c49d73d6aca6d323cb4052d3e7c2fdfef93d70b9481a809b484752b28a1f50872618f2bd658b063a11cfd512a8224cfe365333593ba87f9af5c35edded1f249dd8d02c2dc27ec2baae8f60b0f85c54f9a9cce00acc80e889e71a92ecc8a6b7db15cd8c30adc6140d7be0c2f80a0c4a49161934d9a73ab337b1374e853f32f2d70f2a08c8e2634628ce8670a84e8539306711104bcf44bb84fa0a338d44d81f2aa12c44c84083a028286809e32c927495321ad2bc083935fcde9cefe3af06909807f9ea0be92c98c360f1ad3b0116f6b98342eae67fa1896e8c35b5956de082323bf5e50e7378aee2aa201c33ca0b6a9cd076c75ca80725d2c25bd8207034339ed8843f68dd161c42cdcc11ac79d677afc091868d9aecdda1b5c658f453b8b2d9a5f34eb0a569d37dbcf8d92bcf81d64bb76c22ca2d9d4d0de4b7246e0a9cce03de9d42e04f29226c0536d2e77bf5a66b31746bc3666cb301cb61145fb3c798c53af8e5be3e68995078a068d04568d07641d46da9880ad6f0c55afed2d5e206041bd5e82a7be9d3a58c5c30ffd884fee9e2e2352a9ea3158619e5c6a8782c759738758016db1ca051538a5e9387720e6a26196c83a11e6beea1798a77a94b9fd144cff60dc1d69ac2e269f62891d91b03079bf1540a90b3c9aa78dbcc8a327855470522480d284f0f03a5a1c6181dc0c033e277520495e0107dd0d72f24d0f297631e3865012fc35d080e5f114881e034e84c1c283ce8ef4dd76cc2cc1fe77f7ba1895f9f11288c821fde217ec6e819a27333a5054014d9eaf92886bf28dbd258123e0aee8fe90b616905d85f622de36c633ce7432129f3977c0ff4b28f5f459a1ba1d017595e2c4d06a52c9aa4c0ccd219ac99bb6cc7b1e105ba2430913adc00b4da3353c875bab42cfc8c19dc90c57a1249e48ee75ca109dd6b47265b889abc779680ff716843768266813a002a90e06f08a758f5df36ee828e85115c33e9484d85fefe2e9e953bd1e68db05b92fa79880f21e731d561e72513245bf1407d80a4b977baf35269046bc1f4002744e3f157da567d067e03da273368040e111e7e06b2462f9b0ab3ef818b3e53c595083a14ab1e3cfa6a715cbd8afcd9f06277ceed81d214d6723db23f96a256a68d68fd85d6b4b696c59dfede58fe0b74a3deb7e28c970a7ef07c5321f8e07f4a04c4c2e3be206b22460310b431f6393edd1d5c00a20506ee751780e8c3020863b96cf742e441042e451755ad55078870d397ffafc13a7a82089738f476bf1728cde30f9b8fc7e764d4c8457048757604538ab310687419cc39e21f37a1ed8f971926c18899bbca436e07e881dc0ec7624f40ce9fd483f6e6d7290b73f73c048bf9d20d77a37da51a5fd15e4b0f911ce4a1a94074c2b7f0ec5a5de0f9ccbb527a3e8704c495d874c12e854c4a21f7b1615dd7f948de96f5901f669c780001238d8febdee3e53f0c31f59e29fcaf0fb517a35d05056cf229426dc84fe0c0de1f656bf3c6537810ae402f072bb02a3dee8223421826eed58febf9aa0db8c70597f0981578e29d24e36998535dd50f2e8c85dd80cdc4ae5e892bf872dc4704b18999ea4825caab563f06641de894f281cbc29b934e5261c95439b91899df84bd9dd5d7b51a04a6746346ab4e2c219a0d4c0f79aa27ef81b040911dd3005ee670f2e34d2fb4deb670b082cf6d2258256482922cd2d2fc47509795a77cb587458b929692023867c294b2fa826289443f463063fa8754b22521198b325d2bd7e2f92fcb1c4b39de2d268422b424c5d26aea11068a28e8544c9163232caed075a1dcc9a696a4a7a96eebfd52f1131d4b89b70ff2caad48feb681e82cf36997fe28140b8d8b2d1094e2fffe8b047ff8ef4f8796343f94d97c72d8ac65184e7f337f2d929cedca9e1bd40f99a113c209007f7924dc94846fb81b35bb23d6ec686951f5eb90816fd90b45ec9ea11ffff91ad698c1848fac318d3a556706930d5c072d060646231c364dabfcdebb23c8fc4f5ffab53996a127dfde168d5b9ee8ac54a6f05c5aaff139f4cb33352fb30a501b9d5bb183ed39fd766912b0f9f8c8d06348c4dfc607677b69b41a868f0cdfb20668c9381d569640dc019a87b02c80788758820e4f62c1528d473bee4fc67f1786447085fcd69575cc0b3859a21840fb00e46f3ab5185154c07644ab22849f64c2f8261304523c36ca021ce732e45f8fa9c309ffcfd94901dd0804cb223c04b503bec64602c879a49da5363077dc80c38e1b1c16e4835e444b53d010b285d1998b5a829a4a7789adf09fae21948390746ae15865f2dce7ff7b75d16a4a5c559b58a6aea6d1d2cf46e75de7edb305ebb938c882a4f731e3fd22f6d5b019d11f677a55d8ee434bf48dfe3d6e313ba74a39191118bc11baa1fce7dc8387b560808881f0f04c5f1fb839e60da4d01340a840f6911e72811acb2070405d8bb3b8ea311a4fcaeea79083b4381741d52b3f2411f38a4d3e18f0e481e9b15b798cd6b8d9807789c9df5559682c0503c3cf5e62502969589de5b35034b667ec574280360af0b7b3fef91763f5030f5af4ba6414341364f14a66cefeec40792adfd55d7317bde4298ba3ab2d78cbdafd5c26b00441343b213e78b291e24ba0369e7c2cbe111d78ad2c297f90492b40fcefca21c4ba0c23c82c319053d77e00519c9383e4be3b2159366158d192e39fbb940826221cb6ea736078ab381bd0f329fdb69bd80b7d5bbc4d4b6f1799159c7007289c175727efe0fae422577c23bc938368cc5fc670cab290e5a30a4fc9fd7942ac07aacaf1198176ba6a93eb5eed9704f67b680d0207177422b8d383667db1beef2738df713d78c5d0206b64dd1ae15dfe3917a05a60787f39061c5fca0fd7959055d413db2428832516d2b2177d68f5790c9fb016dd4cf501acd4f51c1207fef3a7dcbbcafb956247424d43c80953c1263c238c8c30d82dddd27dc08c45f66193bd037b744797fa89deca38e04d9a8c6edff5872943b1a251f95eba02359b4c195db92c125508b42a8d177fa0565ce40c5de878b6d07e1a3c601a7fc035e8dfe84431d7d75b1583763296f6274ba722cd9f67d34ffec8a4859c3954785751ef8df49b54922d9fb5233619f74897b8d5b6bb2a429d8b7efe25868d5fcf41bf0e867433ae528407e5b1b31f9583a8abb99b2c1ef8f63c91302e5ac2c17d3b7a42a83812a015305bae386c18e80cae7baa2cc28b55f92236d171378334d0b9b65b914fd73f235ce9772a43bf83c8f91d2f9bdff12abf036c69d3bc561b7f8601b0ba5d9c1a21032750b763a93d5f362ff5cd8e83717c452b036ee2b732f8c8c5679b80f8fd02c05b7bd41a345cece0d45d5232bae40a5d3c19d1645d114d0bee88ed4d9ebc6bdbcb7306cc570bdc0a4984ff25380bab191628e9f7729bfe9047167515c5ccf1848e36f7398dc5cd3f2c390c816701e5db18737b0d5de1a48a4fd97e108a030b86d83b023019fdc56c703d254f8a7904126795c06f35b37ef1af3fcd18ac48ab326a9978316741da4dbf783f8bb3689ad29cbac2dfa182ea7eb0257cb2b9d8a728e275e69142d499f647affb669c966eb8cbd2b566dc2be29b120cb7622ff1240bd2896a29a38f0f76c70a0c8c4bacb3807adf12a9c42ab5ab1dd4d9fb0e19010c261f8dc6d8a0df370e3d60f720fd039a4d7afb3695452a07d0a7460134c691776ce571aa079327b38b80478b62ac6d890e6441a3720e1d7ea4343e3e4084ab99ca8f5c7dca45ba2fc82f082ca58bc113d7920572ef557e0bd65b9d1093b3ca7de14d31d1b889bf15d229f6d1022fa33e127a21ab3b466bc8c37f4e88b6e98909340e06ec122d3483ef2b625bd0e0522362d4dc099e79f59e6bd97da13db8694343dbf2256f76586cc1074345b96562cde5726f4ee2ee6f06735ad3a0afe9210d1640756f8a981da0a4c25b93d58124f3344e2d9011221688718baf13faa66c1fe9047bebbd34cebbde7b8bd12757b1d6a835e59ea1c31e547e6f3ac19d245888ae0d5737ae04c2acaef0a42964e2aad4ddf1e96eaa0f3cbbb5c51760209aca0ba06cadc62182c3322788f3ab5925ac03d80dc05ec9aaeee4c98d18861c408ce5b63e77283f08c2afaf694452c0657fc8aa0a29ec8e8a6c942787b757d0e49d305612dc85c936b0f635110c76cc4f2302cff4a5dd7923c055f42a8c30eee23aa92ff5fd2a9adc438ddd2ffa181da2e72a771de22331daa6cf349dfa266331aa08ab2e50b578ead2d285104c20be7e44280edf05cf1f708e03f83d124820187b649dcfb7c232eda81bf959f970bb470f81136e91b203b0c07762bc04e2496549642cf9fc328a2616fe67125d9a786b0680165f3d8783cfcea47bacdde07517402c32bcc77433ba4fa8d3f963e8fe9886edb01006a127eb0c79cfb0a540e8db47c97651507b3b5c1ac7abc9b71d2e8dd093493a902e60775c61179dd912c180e251a2122a14777b5375c53d8349354494ac5070982eced9a067c0c0f5818f846080ca20b4831a0e3c6fd33a8e52c09443bb5b576adbdf059a502c382007151a2319fc4a04d53739e10399f67942e742842c722a3624ce65102676619545a910af821095425026b570207623ecc5c9023c0a05a1ae3d866804b8e1581a6e8701bc36a5af35e313c5b151ec7dd033b804c4528752363badc9d5a827c030ab9b7f39154e9bb7dfec3786576abf92f996c4027756f9444b9df4de1c23581fd2a0abc4a3c4a79d9e6f02143e577c1780764bf4cd590d3682f5dc49a13a637101b706ef1655a9842c94563d46adffd310c06517c7a177fa2ede90b425fba2f585ae2a17a86565d5730858294a0cd5a380820d8b2d1a37561938d559880d20a89260158488aac00888a66b635858299bbd36725d6e5a000bd617e0a00f1cce2831cfad9eb8dbacf0a645aa15a0d788180a3a1e2222f2031fdb297b862a1b4107acd16ed0fb058a3259d00a1979446f4272592e12631945265f5661d1104f970c3cbb14d91e0e7bd1048df49fb42b396db8647d36b69c01f324b82eea32f40a427f0f0a8a852b0ff0300366ac47bf6d08d9f51001f0f3dd9db9ba40bf59dbd091f41323ba182304a83a066b77129001a405c2b4b4cb30dc07c4951991eb5eaa417e82a7dce1ea80f2c747e150486f20e774fca9dcd7b75dfc0c4ebfebd618ada22360dbe265d9967bcb0466775762141c8b64029dfd73eff9936e31e7df02583b2504eb3260a5d7b8c3618fa6d55cf8cd0ce478a20a78316d2a4bbc017584911e95b74e046f813adcbcd79095a8ba2fb17b1bc7defa8b64b7c05d4f2950af93904c72b8945f2e16f80116a92c13194b1709dddc7291d03b9592415d899756bd73cec85c0ed936d96f0b7ac784dd358f95fcf2e515e0deeb05409a1ca187fe6b117a0b56708f51ebf1562ad034742671ade82c79b242063a0d7f8c1bdbbafe2b5b1844acee67c62f123c7c10f7e97970788bf81ad083e9c2731dc0094a906f66953640e47bdec858f1f936f3a3bf2b80f3782d4ff15589ef26a7d25beca41fded433fa828d476f2e20aeab3779a21fc4b9cb5ff89546ec72a406713ef76b57eacd2173ed20a9b4c4524705b2d1259917759e21a93899d9f1ff54f89b54ea3e5a928686505ac0db2f030e4504b9c1f37ffd3ca2e70bd89ec0554b70fff6546bd112de5335568931bc3870f339f4d518463d48a2c4fa45854c55edeb3fdb8132e4db73229fe63e140cff838ef1fd2b7cf927373b5a3de23b7123d02674e24662bef3b43693ea11564f13a1737c2ef8fe92f24d16ac8e5c4965bb48a7135f06d7b5fc501ad91d1ea85ce8e0d139953e1e3c1a9c9c466482b017b137d5f325b8ce737428298318cb73c8cc5cdc352c46832cc0a7b342f90025ab6967ccbda9a95027a881a4e459d3ccce16d4b19df4dfd795a148ec9dac30ea14dff4b8f4a59aee3e9135aada93d4e9e2b53bce2a1db31b35919415c1aac9f084d9cd2b53a72c247b5257007dc29970247633af3462ecd366ab0eeb79f65852e5064c9d8a4e4220d3c6081123dc249b33cbbc6e574c4e66c754216deab84e7d4430bc75a3335a024d40d87129ea87a611f20b8721a8fe8c9807e0166c0c9b340102c74e698a531d7e1d1b96add42138dfc292fdbd8d9d9537d49f5fa0398678a9dde8474e0a797c67230403f07cfe766ade123707012453ade4bf22f477c92e068b2b063052ff418ea44e5cb754375d3e97a42208313186dfcb989d1fd8b43fb160b37edc4c5e92c3b8191f8bea8a3d3569546aefa8a25cb918bbe9e085ef8b78e18328fc68c08d7cde99dce6a3fd3ef234b82613ebefa93ec54bcc2ff0c682518a3104be18151c7211015f477a89bf1f07590ec8783f8a04519cbd8390faf44215e48b4419ef56b9f79f8ac37e79a25c1fe5721abfcf4f589c0839afc503c9f99fc8672d020959ff413f3a2726f2359ea0fa8fceda84552ea1d1770f9f7bcc582da4d08486d3e820efddd3158a9777e789d90c2c8cc0c453ea3d100f6c576ca0207d4c35018068c5e445497d21ab07a5e3835baa7e1072e8ab42463c0890dfbe7adc7100ce9a43d23d4c04aff2142070271e444b8b991090390997d49c538008008d6235826105a216422fc278457f1eac99566458fad64c0803a3fd6be7cc38372f530caac923ae45592ef33516999bb905a8bef2ca856fe6724c75df46e1ab72fad979e84a44864b01225ee5faa3b748ef9f495d9c80ba179ce7047918f6b9f374670525141814643e2e1be62794923372168214057be2f59fe6a6b7a07adf6f3b2046f8e303878c53dfe19190ec55f4a0fbe7144ba782638eff2c8485e0a7385e8c95406a1effda6996812059f9bf54fa9922f98051fa01c94eaae58d7904f8bdda24063154c7d84077ac0bb18f9379396c7b204de073957d25640da0d87b2826e8cdd7d5dcad8eded51f3f4d8ba32e4fd0f657cf4d11b09664e7f323de51d9f7b7d37e2f2b17749d61e3d14d256099a4b30ede5ea41fd10a25d1997ce4467be86bc7b60ec374d3f5cb419c25f2dd8471708e57d70e30e088904e7734456dbe06a0c66152114f5fe2a3c770313dfce4866113c83b4a963ec6bc607434b05190cb86cd02f1c0817f6b482a706add1fe044d272433d7316829efbdf301dd96448e30c32bc6182b8a17be30c964e94ced537f59cd8310e0570de916aa5cd41fce4f258dc99e0805d6727ddd13697988cc94e2e2b206c43017842ec816db75a56b4d4eafaa18b5ecc834caac210a162e70cefc0e79df19088265fbae6adb2d2f41a78acedb94419a4fc36b0646258fd12dc9651d8edcd62f1041498145ce68d9e7d04ed20da42e42c7d9146bcf68fc57f19f4bc48c5010f9c01a19f8f00008691767936d499d94f77622b8a3811405d3ea4a6d3acc6d9bbde6187ca7f94b5b1b82ae3b3cac328e8bdad04ac82fc8d9dc5d1d8d948bce935ded0b511d065e3e381aa4e2af11218fd775157177b65e0b16e46888924ae3c6f9486be969c6b3e3b05416914455aa63a8168fcbf6010ca89f0f77ad347c8755f32b6aaa2bc69febffe8768ed8109a1e5b70ee2f75dbec3904cc8bd6b5ff2dafb1ffe3761f9a30d00aab975fd0ec1a90e721b00ddfb6ea7581c1676f06b82d78b4449015a7954fdb223a56a0042f51dc7a289c14439fd1cbb604c86a65fce89c7b10620f2d5700924830db7434d81473fbaa996ac5d3009cfb6259407689e78cc7e8021cf886befebad8e67e8418cc2f1f15a58c5e75ea38da346d0241a4b17fd4ec188d314cfc6f2b3e49a8a60cb0e07f13fbd78cb996d0933030611c4a0760663cc7ccbeac5187bbcd30c8614f6bd168bd10612fa6e6882e91e7e035a6d157e7294b13c3ba20748b2aa85ee56df5c52e2508237db28b27c06ca294fbc5594837e3de2c834d9b94516a75dc09b0c24ddfcea6ef8a465449abffbb0c36bf15cee3a2f66d3eea6b87a0a599fe2762ada757b32825de4ed0d694e0e2e88396c212fe9b6f3ea7817c89d968df4ead225d8a6d808f4869ce859b3ea04fe57ae46e9ad5547097f1e41177feca4021fe1c7f134d486fa4bef75ecd5cf5d045bd9f160ad3a59592e165a3c6a12ad2b4384bc49ee3f2b3b137a8f1d92bed2f0903f33f23e54542e732827941494016c5ad949391e89851d69d618941b9136f62dffb5fc2f97d0ebce7bb806c9f07e60d8ad498f8c96858095ea6d050a2e107d7d7a50750b35bd7f24f1120235edbd93a7f34d56dd701a06a2774ac401f7d24768fbcf94b06a14d12435ac35a1bf237f94ef76b4690d1271ec3fa7a24c53e8766d53c3c22f820fd045904ece12fe6b23c54a9a38c3fbcafb09280b8b88103cb3feffb1a27a392813668be7a56ca06ad87fd14433f4e20b38141c145dfd2a61f0a00df0a14e2ba265cf2c4e8440dd3959ae37962186f070601409216e52ae2e69885c6363d8efe1b06aa2fcac3a8cd7ffc482609d80b162e8ebb69b0631e7bbbdd217335e146aafd495a038109407ca2ed0b50942687681d9eb1f59d2c928aa4fce437aca8e4c03607d2f1d2af84d610334d6fff4e2d1c7e6db0f50f724f9766e83cf28eb6042cfc9203014aa12450da3719cd64576ba998f2e4445b191c2719776bf78dabcc1574f89661368d5249862f8aa8ea4a31e5be6abdba0340aa0d6ed480bbb89f6ddb0aeae7ee7e4a5eeecff820397ea5bbf44eef0995c8cc074cc58f473c959d108841b335fb75d554ed9fe815e4a73ab48baef9f3ee6cceeed067b91c7be9b9ffc22c17cbf0a5a3a0b417ea0c0784f482ba7493199f5851130a3961fdb64c708d10450bddf0a06208b69daf97957e14ae277a3cfe5b68fdc350ffffb965774769dd2a09c0f57f57325386c55fcf45ed4a8f766f9652f0811a156d49c67dd496003de0e2939e20012e856eb0545aedc2b64cfe78d5050dd74dbaeacf746afd8998031330e7729d3a5f74c69b865264057edddb38151dd2010163178daf19a8bbb0a7801f74395091bf9fceef406bf89af7bccb253c65dbe14838bcb0f68a4f262eaeb12b6ac7cbdd75c336b3f888275c97370b43a8958a106af9a2429ae234ea18838948c9d2349c5cfa2702c6ad45c73d8ec840ec28b2c6931a2b68b6e159a895e58cd4355399352969a68815b4562f21ff3bb65110ad75d63954bef8c58e16c22d28165cc7dc617f9378d8f51a01b9d79e9c8013007b56578150b6d910745f103fbe5a3110c5a3ad5687f06734da411990edd4f7b4fdc61d73bbf79ac31dcad08273ec5d9404c70b91da8731c7a2331effd842486484289adb8be3e978779f5a50aac86cc9aba8e9bf6cbd85efc4d2537230d5c0786968a02f0d567eae24752f630f5e95cf1184c40ffa2d279c8d15499d536e158733e257452b21255d30eeb1f9a854c023a1f45945aab1649b2a138244cea3f248cbc82b2b4d41c12f5813a147781b79e2bc72d58efcb8df04320e0a76eef95f53b720e213253866f99116960361c8a69cb481989d3f8eea1a1a1a4dfcef34f1de4c3bb8099373022d6a3cdfcf20fc68e06da81a2fe938976363bebc0d9ef18726fa65e8038dbea08d1bf77abe399435705060dd510f6b8f2c56fb937f9a2d5e784b25a7e954fea721596724d33a9c86ec8f77c3357cf2f7254041d97efed056117aacfc745610121873e3a456c6bc422e06de82095fbd5b2a40c608828c360dfb0dc097dd7dafea38249768c450a1d1ff59ff254123c8a1149b7a6db10091fe6ae05fe4cc8c27c88761ba154b92fe39ad02645ebe6915473488e933e1fdf60b033d1a98e95c02d636f9357ef23a8cf2695a39c853dbe1ef289eb5afcc45411dfd4729d3cab601751fc33f87ba52b0e623002f9684ad1ef8cebfd6f6b7d644b8a7ce201706524e28ad8e9266cecdfb2c28733c0cb1aea1641aaf992f6f63779c352b93ae975c2b30df925bc44e3a7835b38f0ae3c2e58084a4e39dbd3fb6d6b28903c00f49803b7a5b203e0e65f6f4be7024a5c3a8ad9826ff60ad094b1ad42344976401b94d6187b3627667d3687de6be39e69945fc6650994465b63a7611fb72aa410c3bc4c844cbf61fea5aa8f3b6b12f60ff1976fb0f5dc2318e2a1727cb282bf187dcc5fb60fdbb5cea247602b6ee6d3711d46b21c0f16a521912a651ebc82b1b55e43a9e7a42fb56f8349676c4a39b234be8c7dfff3ab61e53ef6773c27fedb35175399e9c96cda9ea886721ed271520e656c997f288281cd1e551e50660b20ffe68475ce517c79c3e3451da8ce1e232f21594327d7a3c98b10db5d77365974afc175b9ccec5e304a0a618bfced03738916117bb6c6ad52c3f21bd49cfbe2f6dd9b4b4be6391285f3c4ab45b203107d006b0f2d666640094e5055aef567191fbb23a991f916dd9d3122f7616314ba2c59d516fced3d5f2e3be13cf2b199c5970527e3b1316bd45c246c851f675bcad1b694852a578fd55b96f1eb6840bcd35eeab724d02444bc980678cc0f1b9e7a7080b418ec692249ad22651473b58015d8c53c2848852c0f86a5d85f3b21e3d0756308dc6224dd99885de80cf2841fba2eed8bd2dfdd43e948b273e8da822d06a5817bd800c368e8bf2be1751914e933cccc506d817c90cf17d56d30b0e447e11ec182cfc6a8542a0c4cc39a826c826ae2e29399ec4fcfca02305fe7a645c543def2164979268152a6457afe7b84a9f1ab8517554516790ee9fc3bb965979ddece0b8b8676d069f6fb1ab5df866660ce9e09ea1666e5bc0d913821576d09dbfaf62d80ec3ef58b351b8fbe8da8b578c3016d1a6eeea90f8e29e327226e86b3960c3c951fd490057babe04c46ca7d858d5dfe923286ef9573831f92c644af3558ef254dc55b2a1a16d63ca9dea3704478f638f2542bac456a5c3fa249a78b1d82f7eb2d4d5e14e2c2ab03f08b6f214ebc401b8133a7ec98a404b63f8fe433ccfa41eac0b7aedd89f8bae34fb6945a3ed4bc713fe5bcb69207960438963381fe7837817cfcd8f732217f1c62a8218734038eca1c22c9f1438337f75194e15d43e8ab259c64724188bea2c0962ebfd30aa747f7360512c335d2f898666e62759380aa47d75073dcfea81790ca851706dced04cdab8520f1e015c5af48a318c085185185f92ea5c41c61cf28613323bc8efc41fea33562531293300b9148cdc0b684a139b4dc8057769f242e8e9ab079e722b2d3b5e2a46a7fb9f6f5333d954a72fe789a8a36c044928c446a9f24b2e778d15bed41758376a3fea04ba8d1059a4d9497d18fd63380dd970e205ca232ec766c37e97cf57fa52f8f618e03ebf9f53fa74050c61a3768aaf2db02952ba6780115dd0b2aa64100a714b268d7d50e6ca7c09d7272cd2b1e66ae5c83337ab725e559cea893acd3413fc511b0cbdbc5ee951f839a5ed994670b6e2e593d859b223849c5cd5c7c123b1cf9220622ea5eb4af6b5ad2e184e9a0691726f4cc09140b82fa6c0becdf031a7fae835a209232520717c2290ada79544b708a037732f59c4915e064abbd5207f67aa2e1588aebd5581d22955387d16e2a443b5e35e5020a730b0382d4114d82694cd6f6d6834a085ce61c62dda57e347625e20b227b37d972cb2d654a32100834082908484a2f9174658ccf84a975510a2b5d95c45a6f7576bdc3090e335977bee02724589d4430ebaf7efa94c436fb86c959549d609bc9da46ba2ce2c5ad4b5361eb9918474830c7be61a69c8ad66104f3c663f306bc75a13219ed2e9d8e8ece8fcfbc99000f3ad2792bd2610e435626ab42b1bdaa4374cabfc26a85d55a4b0490c17c88c993459f05a72e0a8c0539cabc81c52c0c6661b429edaeeb3a9a733ad9212f603f7e64f9c104eed7bce138eec76495ba041be09a1e574dd7b42805fc6ed5f47c5fd32dd2d7c0d02dd2778b249e68ca8ff48c884b17f9e82e73cdfcd329ffabc49d900e65248da3b5c05cb9ebc79bb8c4b8b98ab8cb456f16fc41417779939e6b5ccfabb5ba5cd7c1d807a57e5de714f41d4260f2391e37d4f8f791478d20b4b877816bee39dbb99e2a927bda713698f4808510517491528309c68c5a1157f4e00b2b55d8e8a28b247c8081e172c5b0c50a51d10a72108296963f87f21c1daeb3b6b39db59db5744ac98529cbb2a4ab1f775aa27e8cf0978dca72b22614d99fba26abf3f734d4468be811bdf9109d5159a6b412c3282d964b950930f8e10e231c93a7512b7c1eaf179c80af827c74579900cfd6346a91eed172de34c1a4d36461f820aaa6c1f78911a9eb4be0db1a07e371afcda3950b7fef4f651e77212d71c09e679ee67de4b818c00fc5184c5fd3e1fbc87c587a191cf31883185faf9a1efc184c0f8a351d838d07df67e68d803ff32dfad07cf8347fa4c5e38fea7102dc2245326fba037718e19b771815d5ea853eef33690affe7815e445732e29d21e5183e069a1d46b894c95924ced05c3af3320fc38c2803032d81c0a4c34a1ff35cd813047ef843741523967272ba50e4a1a91e2e3cf3ac6febf572b2bcf7772473e5654922d1b23669e968641749b755779a8f3a37dadba01e9f333075d1720ba634d567f4cdfb3548fff5d7d44b42757d8a6a214c26d9169a860ae8af1f09d5df1eead6f7502dcc793dcf16da85fe19e873a87e426b1ac859cb856168444b5ada92e4248ce143566e77c5eb93e59e29c78175d65a6b53f1e6aaa798a9d9bd5230e9aed99cee9af7627c3afd8fa3933a79ced9b1399d4acf548082abe82ed614aca24f2b156b5ca0a1660a662a0aa19cb55ced5abbdad88041b85c2e17bdaeee79dcd4753b6130d92ed244c5557505a453feb5286edad103fe32690a59a84f9334ed5711989cb3ac80d9800981b90a4281f89fb145e6618e3accb17b98296f170c881ce68dbbcb3ae88876d0d8eedee372fd40e6844cc683dd79e8eabfffb7e05aebd7647f202fb8aa3ee9f359fffbeccc40de4af19e84c2a81925d88a3e7874c1f4491e37d4e091c964b2dc55f93c8cbd9f487574edd6521d93e5ee1fa53b9624f96c3eba83d1316305265b36c24c918a35ad2a86fd3b8ab903829bbb6ba063b2e8aa893ce5abcee2373893d558e68dbfc5916967f1940ca503269dc8bbb88a741bc77dfd649ef277db174c4e99c93ea9e35efb5cb5e2a8c3cecaa1a6b5d35a17ecaba0e046e1c81665b3d89ec980c0e49489300ca1a92c30cf64b913d994c9a64c3665b22993b9d0bc9111c988a898f70ae7c2eec0eb3aefdaaeeb461e3a72666e70cb2eccbd184f3ae6d0ff5a4e0954a41f75ca1535f307d4652b27e7cb9243c295800bf255bd493093ec4fb267a1b9a2e6c4213b8a2e676461cbeefe298881fbbf7b6f23992bd44cf95ffa5caeb5d652b082ed77069f051de0fae0d327b992f4f7b9076b8e29b89fbc55cc5104f692fb4412c627aefc66b699e4acf8e284b89273754f3249240c9017ec71622df2d1ff4b9e5cc9c54b15277e509bc28a1f5a477830410c64424d605064a5e5693cf9c11733d88112524c58411a573c39fa0112285ad6b972ded0306132e54ad0385c19e4a3378e3f871aa171fc679c60cec5e2024f960fe64ea73171544dc61cfd9d6ca3becd1bae09e65c5cd922d95938ae6bad9528f7975c79cb9957ad8b9672dda65de5ce7194628ce96a8599f2a7820b0b3f60808b7296ce54acf97ee6a3a9c648d362648fe91b6e457a87a749308f4c15f716e0f16832398b50d7c12325133e48f901971668d1448628578c5060fb72c3142db721c495a21891962947ad17c27001134510c1c312565a2df433653fd68ae44dee06638e5e5a8c5adfda8c2f8afc356f8c74ad36d678d46a210baa1044b0176ec3e8ea8a2f78ca1f46026f188624f085c92ac1623d65ae806490fd4914ec469a2435bc7b69430431a4020d767003aca805b459035e5002294cb000838614149072934204134b7aa832832caaa46183d74c891e0c5d89c20755b03441434a1817632e4e7ce94e27da1042f6bf7b821b475c44cdc909bbf84a3c1f3667c34a2e4ecc728b3f7ce491c93158f0d015ba3ac28428160445163cc8010a2c060b83bf7401d53008820d6b58858954aeec3aa125fb0ae55fa70da2a06288960da01247b4c09f7f9aac56a300add92249c83e668b93d1d5486364b2c99a4d1637c55cf1506e0ba745762ff20d126fe9a30b935c97ec4ff3d1b964ff28344661b7749557fa592be228782a09ae359504d3efb9a1c43d3105b7e26460e01aaad4803ffc1a621e542dc1315f43f8f86b001f7ff83e310ffe0c6b5a1443d14815d1c808542c51e30958d90ac51367430526394ee6aa492ffd17c9dba1288c888ffe202a449114964a825b14fd13491bf2f78d22a7ecc931534a29a5e20c44b8ccfdec39e7ecee43cdd06fdffec7a1c8cea48e7edf0cfff5ecee26753f672f67c55bfa90a0ec24775137d3d982c13aa314909c2cfbb3bcc0e494f1c864321d9c8c93c966b2dc8bf1e9742fa53a2f23ba2e5f2718ca14211286c0773ee9b6e057e5382ff885c9691b62a31ee95e9277efbdaf2f28b6561748b901fd3493a61d4fb037ce7d1e2752644815dd638f3d7a3e86d8bed8f5c69cf0047e184f96535a0ac18fe4dd52087e24f1bbdf1427087abfc6852eb9bb288adb4df0011719e2e33fd919c29d387dac3dc0b5842eb0bb531d9d2ba6c0fef59615009a47365a6bfd9751ad334cdece7237e7ea78c70510f6be302cd19480ef0f146448679f7ba7a94f33f86433c9fe2a1978243a66d20347c831c77c4ccc25858c355c21eceeee09e4ee800df9f368073a7fbf430558a69f7e0935c3d7355c01ff0c81cc8cc59a999fc13efe1931061aae71c13e7efb588cf9fb32e2f5d1341d40f3367c68de8678a2a998d2cf9085f0f1878fc59f3731222964cc2591ec0741f3f857ea40872151b9c509fcf8e833879ee85306fe7c2409171caa1c11842f4d8668d5e860888a20a0607245192d159eac40054459645d4469a950050fb8389a8204182c681160a6fc71ee2a016ec2279a9a37a899eaa9257b0fdaa9dc40320e9ea08e61b3d9dcdd5a1b5de5f01c3972cc9b1c93e54e73db6c7df31ea60f138835dae6e5e95549e0147ac0e43ccab1beb243a787641faa5dbd437a7f0fcc19260766ef9044191ac7ff3e29360f3dbce04ed4d2c4103970618505b12f8c20830544602879011543b4fcbb81742d9cd566b3eec91c391a8dd966ccd15b8d99ea9db65d7143195d73d8d117235b1bcdea25fbb3541a40124c7f8b238ef28e2070cd648e0c03f83d28629af23530d9369bcd66b3d9421d7407014130085d81e0d1dd11829020be7afff1083c2107fd428604d9b182c9e7b11c8f0c8d4385ec3930c31c67ca8394544c3566a491509418ec08c623c3947546393c8e820c959193338ea713c6e49475ad9f453053486c456e80719498bc39375f1e25cab22ccbb2ccc919c71c3cf657570b98a92b881a74778a29918b9dc70b3e7a9e87777cc1fd2a32b0ccc7f93aa79c17e68d3f094a601e1f5b2485cc272acb06f8f43860e2f80b3eca0001b74b646981efbd65594bf0e642d0ccd088a61911fcbccb9926cb677fada84c9a7a3cc164db88687e856dcc20c355a06db2482b2033a299162ae68e0c8de3114d561784a68ec88e91262a76caecd80c2a46047df43ba328c38b1247c0000c1a5c26196970d1a20a2c3b2071448996c4b6f9e8230e4ba5924ca92423f33c5e2ac9c860540bf59370a43f9a0890998f0c6dd4c323481f51580908afbc61daf2605db69c297f5b7ea4149cac6abdb9aa86fb99e9fc92c95a92758a59657425839fac5bbe5c311a9a59caec649dd99715b2a575d9d29693355dbdf3659b24fb9378960073ff95f085afa083c9aad9d7681ce76a47b6dbec923d4479917771a3dabc119a37ee64fafb77fe1cf71cca33f7a852b6255de198ec42fd54c450eeed01de92116d2923232323da92a6b81bb706185bb62d6d694b5bdad296d6965e19e3a119ff20f8e08320f8e083208802ccd17efcef9ab429c4b0b56c984338411347b4ba7baf68c4668b960d26235a9d6843823b6d9b1761e29a5517b83bca2c584aadb596ea3879deadde4f7a3dd40cbc24644edc6e458adc6e5dd715a1ab1e3ce0fa6e3922370043044cfd21326b6062485c19f271a873f71c1e3db72248803cb4f7f25e4180004dc164f55e749593338effa79351f62f8529f8ab46d95b34ad450d5ae4a44175eb6b90a6738f1de8e9c4d11c30596d47ae3ae104b8731794c9b906596df9c806eb3cd8731e0a470f38051d60b261422a153752c94882092c2d1ba85098160e1d30e9bdbc17e9275dd9c78103263d7a13c99b31ee0fafd8131434f341f30950033c839ad47b79afc94a40f6f784bc27aeea9a8f32ba6a58a7fc4defef0dd1d58d9915494c2bea44ef350a400a4c5a1b0a69e09967c4993789367ee67d70bce971bce97b38c1f449ef8509e00426db466d6f42d5f4db68d1647a1ba2111b6f7a2323dc40d5e03ffd91160daa06ff8d3fd2fae80dc7cf564d8dcde3106bc0f13638dee66b10e16b7e0680e601f03090f001106bb0f124d87812be86119ee6b381f25e9e9017a3a994ff08a8232d1b365ff3fe336cef85e34528954878ff3a1486356ff323a0668be649184184c7f1d56583a2b71a5402c2c0e07f4f7aaf9e20d448534e00222cc2e378eec9313b15ba1eae406ac17e672477a829f33394f19e0265ef792809559f80550855e3009abff13e347f43049aa7a2cf8d3f894670dc781e4ad692f7f271031475accd56be2c187b73d51a5d50e7ea9254236a6d26e791e7f57b4a66ca8907e36aae548ba7c46660b23c2564afbc259df2f786f07e28a313bdd70bcc5f0830c335f6a7ccc823bd17aaa456b2d317647f1fe42f740cd8ad962fa8b11aab52541a5425acf50b260bbeb76b2bc2f4c96beb5c45ad2d88b7e3081fd5d8bcf1efbc57d7792f5fdd0c956589248aab86bc265c35b5d8b2d0a11c64120c734626bd589859263d24bc2bd9edcdda5c35b58401e3aa7a4611d6d6b16bcb4ce68df7baeebd3c185d1500cc10b07859d2848b0e2d7f2f465718c8820c2fc09052baa0072d7fefe509e178bfd1223902a1573844cfdaacedc6ef60e3d4e160c27608345e09996cdb8c273321936debf12a159924b80ed5985705930d6b22a64aca74c15cf54e8d09e1166b98e783d7c31c3d2066cabd57e3c4885812f364f3a6edcddabc976d9badc64a4acbb2bbf7f2e8f15ede0b2c1dc16e802cde9f94caeec94c11a6edbaaeddd5693d4970e5c795323fc3bd724e0e27c4b9caa0f273302697beef3faaa4dee771ae2cb9f2492d7c2f83aac14f437ad31f697d6550672e88acb130e6c99bc3d84cf9875ee723f334a2119a977912ca67e64da2111a142daab121d2229aba4ff336de6443aca5cbf42691da68447aab4bb84af31a8b15c58a62b528bb938ab81d708fec0fde6fb2072da166ee1045039749ae449128b2ba4048d33ecfd6d39701987ef7d71f46cd7c09d5ad185450100edf2a3d0e39ad98c78f51ad64a2b083ec26d90f40b60fd9fb4937570d8b9550de9ac18f4b28a0203455e383bff45804c22f23f3336210b1a61f8b5dd2b2a4ab199643d404272a53ff84dc3fb443f29e34812c21b78ddc0f80b90272638e3055f6fb69e6ce041ac777eef7cf4c16f74d666a36808820666a66f2aed027e4c621953f1a2714a9f84d4bba2a4229951bbd812df2ccfc510e851970a422bd03343444a9781ec166de74a71c403ad973866c449837feee7e3ae51eea211b46c084084d9c4e12983c598ee3baae39fbaaf47a5ed10fac341d41aba7d3ff38e6e4d44aebe974e082bb57a5f76a08c51d983734cc20504a49a4eba4ffec90dbc309ec3f2d8eb153fe1709ad3db0e0396f3aef02edd4c6100001baa26fa0d1508305112283cd0808d06c56237d2008829f48e2d1e33364cbbd189f4efff762fc4f29ed2631f4aa555044af80f43a3d930b1444585a36d41b80302226d1c2c1b640b14a3761e204cf79c3e4bbaeeb6c1f099fe61d32bbd975627bf77af77a3787878e0ec9c11d4c2693c9059852da75f77623193d3636ee3636366260faa4cd548d815db59a5fbc4bcfbcc9edc54a0f8af8a12c5b64cedba7a82f57ee3b190b2dd2b7df41dca388d85cc389324bf0016e635811628a1243322faf253a9081066d5645873d6880c91c522ee2aa7a730f9918d8cba4cd13b9c5c0a54cda80979c37558d0b5ceee7728b93242301255c99cbe4f4356c38a1c50a93172c110493d60ebc2811c615330003c9143544f9621b638b1948acd13ac2836b0740f0c1065282b0d2f2ca719cd541da62b20c8065aa6c0da68a5b01d114ecc3fb3d94020c93fdf221ea575a0aa1a6f54e4934e22efca4df90bdd578b2cb9011c93e8a1181e816d9c52acc40238b5024db8a93484e1ff4acb1b448ce21784006c864bf601003938f1ce7969b5349bffc45fb355be4c9721d586719b8df7b829ada4c593ac0a429ebd05287b33a51c864ae2441fd0a2abbec3153fea1cebcf1bf910626fbf532b98a874fe83139c882368bf928a533ba9acd6efcfd1e3189d921847b8a99f2df526482147cd4aefa44ffcfce4a2c7aa58383aea26f30775e681cffee2d0fb20eb2f3783341e203bfff4f10b24b2c76cc11809f8a4fb2532c3221fa0277263b76f2662cd8dc62cfe60d18191c60bfd97c6469c14dbb698cfa348e97c00e5be899a9c7e0b478534cd6b541ef74f67740c318b103ed36b1dd43efd26dbdf3332b676591db660dcec059175defc1138f01fcd83b03b8de383d6f66336a238cb642271ad3166406a136ae8d18d5123c690a67ee18673b409af6ac67b4d6ea79ddd3e6c0ee02b9821625063bf25e470e8f9ebbc536c62773bd99aa9584ec4f64b266d6821ae92a3553fe5aea12cc9a7d51a5fc438a3bc4366d43b85bad8b076b1cc7bd7fffff47a9fdfff45a11bf0a5ea7df7530d73408fde2e1f57a594aa9b52dd41d5d30e9c9faf9ab77ae50fe5456b4ce9439993328d3089cf3cfbc51325544601fe0767926fb75c51f4a9f3ca986bcaf1cf773ea74aa5354ec548bf49b5f056d17a6b3620d9099edb730b31563a0e1efec7b4f92f27de28fe72edbf5e3e3105eb0d8ea062639c80088a11c2cd15aa1088a302f38010f6414b57c67aab86a44e7a7a888abb6723f3ba805b9ca5769efbdd7ebbaae7bbd5e322ba0d17aeea5f4d22eed9b52488f4dbe22894d6ee9fbc239bd4b83f7446eb67f576960d2ea86817c3ce5df620f1a989c59c0340d4470ae4fa928a4fb660f55440413c7bfa2bc9f7e1706ee58334c7e872c50b1e79c1e8944a2f590b0500a45ee56313f5b06cab87bb97bfb49946e714e1c510826d6da910bacc323a7776e268e3f0ed86dbb6deb9837355c9a3a560df394af3ae6292773a763d91eea44da64aadac91c9dec44da42f3c67f004558a80a193259f6cd10322414a2810df48e9724e807fff2e526d438a3ac854a2820100c29f7a4e7691c974dd6130d45ef78d64bdf1d82dfd7eea1cb84348e509609e1b8efcb4d1c123a0f7d042f6aadf58414e0ce64ad09719509654d75860d97ec290001e4aaffbaaefbaeaf64f011c8477f08f8b400933d79867e9a027c33593b5c21061a05df04df4f9a22fbefcc2d2427d727a12eed7e7c147d66847010201f7796e0e9e36dd457c1135280dd05af92e9c9555cd7dd0ee81bda418b1ea82c4163468496a21bf8c001472c01042c58104611553cf1f2781042e835635e20e925e42a6fbd60b197d017e378c86157ec932430bab24a66cadf49760bc587ec146a3bd15f2ebb05fe66ca9fa356f6318f9f7418120e7328b3e64de0d2f338cd0ea3293b4445d25eb12f3bcb3e53ff0053b0aa0b96f999271d0683d1d76bb2a6ecd53b602756f1057bc1ec0bf6ea6a92c671511b9d31e5cd283bec06c6366fbe1cd56233148caebc099f9245244f2fba02f27ac5804c3122bbeb8abb4aa2c35eb058a9542a89f6e5b2496cd0cb06bd5eafd7ebf57abdbc17e8325e1c1d0509528f68adb5fa20c2a739a716dfe94483534a2d4d81528ea31ced4087f91020430a272c7020858f7994812048661a938ceebad1870faf8acc89dbad48917befaacb77b6b3d776b5118089217165e836742b22a3c14a0d4c4edbfc6980ff02e6dc92dbe785c9f226113519604e9cfa911e34516aededdcb442e8a592974aa138e70d0a95c3a367de74a81f8b22e2e310ef861f5aa406a71f07e3d429a54fbac7d40ea0d16aad2693c964237fd601341aa5dd9112d17f812445996b5c689214e54f0b708f8f1d70cf11983e39ae8044cddddd4e2935816d0c9b6d88c96433d94ca669fa4c4f70779de73dc15d264da6c99a2693690ee91d713576097a4c4109f697a1e787fb151818148d54f1013f7c2b424f8091f913cc7922f9b98f641addedbaaebbf6dadb755d77edb5b7ebe6ec4e6db9db4d1cd9f44824af6bedeaa32d77fe62e807c08071987bc1b394a1ccf68b2bf5ea7353c53dfd9e2a4ea43fbd1c7b5d1f6177e80a2c46440aa5b010638aea6894dad65afb8179231221810a261bf67919b2027e3ff306147f68d18fbbff1cf130c105b8c8a47455127fe837898ce43c8fff1451b1489418cc4777f79c5b111ff2fcba684ea3d115e820cdb738e8a0b5b6eb4e3003531448a34d968eec96baab53fe341772139860d25daec354f13055dcaf3c466549b880c8594c2be6e85b4ca7f95112eea58a79e3b4f4991365f151e63197c53a6c80670f9a373474ae29901902ef9400ffa094524a690e8f1e1a0d44c3725dd7e50093a7ecedee2da87551ab0101d56a40b55ad735d79150c335a7b0021f8dd35e23600c19be273d3965b50ffc13460999d3066005d187f4f34707441ac201b90c9ed2c0c4f11f43c80f203cb376e2acb55647e7a10b88e747844cce9a119ffd04c7713b9ce01132f9ee63111f81d8c9025b4aadb596ea2095737e366c421d395cd591dd3377210b3d9e0072f10a3da0c0ed3a0011b8fe0a9f837ed5315b90c929cb62efa573458228b234c18327b0fc4046abff3457475010c40ca0b8016184850c5afd73f6dfd93f79dcc3db759702f16265598275c713ecd56a6dd9b9b443e4d589b6ce12ada3d382cea197b40e133c73904ba7153e0eb7457a1c725adf835fc53e0eb7153e2d5bc851f00f518d644e143e1ef2dcf15126326c45134acc555be5c0fc0c292ab2514aa97b5de7ddaeeb2c57962523685a68b49e1e1aada7fab0c9d52b9d944e4ab94aebf9a1ae49d3d17152edf1c4db2304a63b4438eb0c9fa6628f8f275badedaef8238b0ecf0fa0203d3f379fba7baf8e1e1a68f4342dd9ffeb4e055284dcfdd487d780f2a8e0636a91657a81a994512e3103db132b5a538d328e5802882586aa80d112412d074cb218caf24397234fb43011035b185b5c535aee23cce467eae27cb8b876714194528e6b9755a930477fd246c5f32a8830477f170a66ca5f09e5beb3b0628ebd05ad71ba89972ada4b1edab45ee2def5430a4c368d46a3d1381e341a2d8cc1e57e52fb96f60e8e8961512d90d8410a335a3620a0092226ad928f18d148ff8003162d1b6e84d12a95a651a6e26d1cf1e6082283034da077223025f0a3052673149127130df5c463b2bc079fdcb94f2620072093390490c91cf949d60e0985fce42ab74812312b147fa8a96751e87961686d7824bbe7e8184b681cff1fbaf261ca726300f3668a25bc3080c9ea10a03221c7bc8940f77386317d86f35edbdda82327470ed0411e74b5ae8b5aadd6bcd6a84f8e3bc225e7eaba7a3153fe611c9151d3b8dd5abb623727c75dc9fe941b2265ff793acab3d66a6db28e7aa754bf64ff4b39570a3760b2d69a8e58a9742c0adc1fe6cf434ec847ea2529de7bb5e6467ee4359d1b8a94b964d2c6a6e6b55aabb55a51e447eebd7b9e27d65a2daa5db8d45ae5e21c773a9d6aad3a726aadd6ba1abed2b61e63369bcdfc3dfc8602837d813d3f12d7f350b3ef3731c164d7fae9adaa26708df747b227a6008527f64c47099e19d6b3990d7ae022a2d55454302c05b8862a9dc12f3d396f2028c6883a3a6072de00c004be71612294ddfbb94cfe0f5dc5bcdff0142376949be5666a22846d267fc717982e80cbd48b72b289356c2708c6f1b810eeefbe431d1d1dcff33acbc160b67a84e4314dccc88820e892015d96eb48e017825dd728005d0fb60e2838237792d76475edea7208062e40f2ee938c5e50217cff1cbe3f10577da14ca6b66bde30c1258c856aad3ae64d0e8f1e9f1f22f3a688111f5dae26710113020683611016935bc85353da08197837140abb32a80dabe290205760b28560340a9b2cd36479d9e9e9bf8b03bb35de1fe049990ff0a4a3f8aa9334957c05169b77761227c2e519fabb9f08c0dd93447848813b5bd01d04adb5dc0e2cf86612dc81e546f6f2e7811d2a607ac9ddd37bbad5bbefddfb2dcc7c45efd2eebbfbb72829a4ef97af48a44ee24c66c8c9b876ba60fae49cfdc347df810507e9294a213d8faf4862c3601763d8cc0bd3a08a0e491c6d61e5073b44c0081e6880050b961d50d18a81e1b2c6114b8c30a38c56cd0c0758e4b0c5892f64d0f27f2d787c8075c0603018cc84c30c733a9a4714070e8c57a71c5f17d9cca27f1a02ffd05796e4134592c66c221ffd4a0e4e5e5ed465094c36d1954681caeb8a8f4df8e84f8f58184253ddf98b42a14a2e199543000c937ee447140573d561ccd5090a7632af92ecd7d6f6a39972c7f8848a0126fd15c6f4345e9422c96e75a0400577141b34704d8ff7b3754cd6cc3732797222195b23e1a3ed26d6508e1321937e24c2407a4a57a5f17b1eff487e458727faeb1586fe7e1261ae3c0cef8872a10ff8de53d127fc5287bd8f7918488fc51ac2277d8c58430da05310047fb6c09949a81afa31d4c72391de0838fbaf670306d7f4907e66b25d0ebe7fe258f6932813a1975f7991447f1bd62880a34ca264a9b5524f267444261d0c165ba6c0620bacbbd229d9aff4cb5d0598f4a21c988f517ce4fc88e3eafb91af6ecd6d33735935695c927894a3afe4c2042d095a266992ecced5a6e52b2a2f56c5f097944c7a94ec4f51b41ada3d495f42fc96a958d3890ae0f295c9bae2aa5bc586bd28133f9a374fe08e72b4a50b2432e9b62d5d50c9fefec555ddd5fde5a3bf0d10f06dc604d93f4a3d4ac4c934e15841c064d31ed02d8fc79be6aa2a522a2a80cb32479932c9fda7c90a6782e64d8b1d05d6aedc39399d9740836f32009f903b7ff38b71625ef956ccbb725a314f06e0b26acccc6354b768454991f91894ebb664be87462ef014737cac75a8874aa8d91ab908a3d0a8946e561535756866002000410073140000180c0a0583017160482c1c2f2ef614000b658e448064389648a324897120849041c6384300000110012182da0601aff441fd71f53909abfc97e8822f5dd56e0e0728fe2bbae5d579081d8a501950948d2e5312e8becdb36a31ef7b6393516e81a4db310745827bb5e22c3c10ac6444e98dab61e2ec21e718bd06c95b507e76e068c09e15b9a6f7509d5997be5bd995669409296acb360ec8daa2931a3429200cf9fff8df4ddb819b0cb861c93581d2e64da04e8cdc8b4c57d242d555a11aab8da04169b4839cc4748716a8789a732a233b1ae7cda64f1df5e0600d0ab1290c803f92f619eaf11384151572c7823c48b1e231dfac005f52c6a13cc8b9037420bf3dafa021e1c5e9a3a9fcf9fa4be4a58fb7213e56ea98c7331a5f81c462718647da6eda4563ffb775ac375ca0091baf353753fa2b2f070295a160882c06cc1d55bd4761c680f66872d60d6ed52fdba0bfe43ad0c95c5e6b8c700482ba2fe9885425a0360d01cabc4431bd9fbaeaa5b4e4cba729cd0c224173972dfead9fb433450434036eefc52fcac30d21a268431fa7c2df7e4d054389062f897af32c4a0bea03ac417bae63ce0db068cc40fb817d609f0dcb82f9f57335c6dfa99e00713a5ea97ae4d01525c68e8fd34c768f24dc63d62f8174a694adec8c9204d8a10ab19755ce2c107728752c82d8810c45fde76ca8caaa20c6e3f345f300346e94bad8c5f3cfa3b3813c64c5116fb500c5765387e0e27230f8fbded1a310b67fbea3f8e9459351d46a97e7bd2c6725b30b8d6a16d71bca9d36574ee79a896175b7b0e51b6d6fce99c6109d16fb5702074e9e739eae785b7cf2e34276bba101186ec585fb8662151d399e4674be21cf47f0505975071215750d7a977d4673dd680f45a81e4f64241a67068c9772df3fa636fb43a57aef4bb948e390d4bf2cc391544d2bfc32be54481dc7d6e42bbfca8a85b4ab6302ba62f7198ab73ee06b0b1321c71b921de9614a2862328155a0f8fa0e1a908db76731d5fb6321bd16f85c4244a287493b68a56e3bbbb49f6af9160eb19b7d514512ae5fabc792bb033d48b264ae1091740cf24797ecb5c4c9220d60ae77d1f9810a9929a7aadd31f89c394d13ce50caa80f3f03b660d24d22bb60eeb9c68ffff7b7bffa6ad39d992d9555ae90510b069c0baaa5241a3d4dd18ddcd1595ab6e44de95f42f7ca7d1e103cc2420f48e9201c5e156f2d6048ea01e5d5451a72a6673cf55a83cd4b34187ad96ebc7d352d544e73e681ab2ea9b1bc6a1793b46c93c03c899e4ef61c55a9c0ac1b3d384765fb4a4b90a79dcd7287acbcf251940e087fa1767891acaa6a57446406b0f344c909961e30439f2b69071af98eda394336a6dfcd52104aa0d20db157d4d435e84f90f214d5da086bf4108ccf97fb9dfd45b0dda6b5404cb1379b454860caa34a749a0a59690d2b289c72f96c14114b31cd3646a6109bd29c445d28f18018c36058451ae1ecc2fe8e356cbbbf9d785ae87ace6f671223f81a0ec797e7080b0099baf0135b68fe807f7af28923aecccba6eb10287f7306535e87b9edd8eebd44e272c8b93b383155a3c711fdc2dbc4119e903817dd0667edd0a7cfc4f882a7b97161b4b87a1d023e7e0d55be31cd790533284775699d7926981d29820164508399d827f6cef2e81ba0ffd7570a91054a59c2d508a3479c521a08180020dbeff324c215a47a22fbefa66ba0a7c80bf1850b8607331c84f9b7b47164862eb4071c21f307f6cfe7f3498f5887c5ff170c13f00cb99227b91740462efad61700f54b1f739e7de53b73c0855f981a0d471fab1a24a194fad12e4ce3860580fa80d378804efd83e86c8c708fb4babe0ff4c88564340a15385483a7565a68b86b20ab9030145381b3caeb9879076bb3463870ca60e0e4b80e4b26a6399642e0442e8cec4f5a84cadba594cb8c26d0703832fafbadfedfd691855236de0dadec38d8bc7a9b5d1d2598f25b982ed0ccda5ed385361ec94a8ecc7e00d3f4136d06f0f98aa3c73c5cba3525d89d94b94b714b155ca5bab6923920bf8ec53bae47e2e51faeded2bfe55889bd9ca2a748869e69fa75f2acb602b136e6ca3c11f35a7de881d6cfbf40001d796ff789d4b7f9f3f608078f90cae895f54c9ca3a55c432e9fbbad3b3df725096ac3c6ecf233925ddf3abdd170cf6b762a72dc1a12174577e14282d05585d4787528bbe22ca678aa2c2dadeafa49958ea37f3d4717618fc1fdfaf59c6d31a717f446ccf1c3610877f3a021726bab2b4454c70b03448a19340f718b70d6ac55d71de2b741d97346bea96cc000f0f9dc80fe2063cad1dd47073ff3614ccb1c7ee485318691f27fac564b9a0073a3e66ec2cd61da10dadb0f8e6e5e40682fef700a81db9629f03751d89a4ac717c303e99dc897e374d4e5e11e2a46eb970a579a4a230f48edcf3e950b8c8e2f33d4c5e4adda2a0604b2e1953504cb90dfbe86afa2e9d15ba4d9b2d0dbef450aa193ff9660132e6e04097a0fefe33029671da916363cf1f62722325d3671022d95eec5b5d7bafc7608d473f6fd477468a33e7530f15d1912da2577b4b11cee21a57743cf52f61865fdc9dd5756b3d3c686e42c96fd5a9af6492afed09364f806e00fddd17d7017b7ffe383cb631903e3055e794ca0555c08bf19b3a06f459c613fb778bcb9bdc85bd62452b861f52e0731ef7f166670a397c730db4dae460a5b9c494fc98eb1bbf307b29df7ddbf3e25ff41d394f059b7429adcecd39ed492cccb7187335636710c43777fb0359854c4c003d028cdc5179ffd0c58acd7ad8de712fac0183da5aba9587d26a32e2241916d9cacd0e0b0f5487f499a0cbe7cbdc7e2f3ba342cdcefcb43a121709f96e4d7e19acea09e70daa2be35e5f6d8cb123a85a073c9e7e40bd8f658026321d70b4a41d3052a2b4d996e15c204d3060866e24d63db4a4940c9dcd664ec8b7e52ea4b9c8b4b8a529bec5171ae67c5f662a527ddc3e50b966fb0525c7979531e99f8197721658d6c870413d7936df591ebbca667efc0b45ac060a57bab1986906e3f32b56020c4ef63f6fde15d480d88fe42eb4cd730aea9aca445c7393f740cce7dd19aebefa32d653ae3165823436b688a64541eecf66c1a41b3904178d470e225ddc28fac4a8802ef6eaae518154b64b0525814da76449985526440b65209534f7a6f574b420771cadd3f4b3ac16e870c0e90a6c31f0ea04164808a4406dfe3b22547c9ba6b8bd51d522fed9644afe5f991af2055566aaba2af7627a44203e9d227a9b7d5f502f3db37579e51ff5f1e36c69718cff3b2db0dea43a1f64f5faf28c841f53d6ca2771003aaddb0590dfabeda1352d44532efb126e02477abd9506b56163c4eabb920c7239d43fc0bfe977f80cc623f943ac1be1c727f516ae759e28c31187181881ff96fa153369cdede95ce7880f36a944347aa0fff8d6568bfa2e86eccc787cbe0c62c39e855a8176a507fc51bab2cc961ef5fcb290ceb0decc0fb8f95dcf432fd036a0b4df8970d765fb01f590f08e8c7876b32d9fe3a17e1812952c3560465bd0b1d7ff0ab4019b227342b9310c492de8e2f419f6b8790769354e3f7ed4d9b021525b6781677ec3711affbca766b5ab411b6c8a616ba35e52bc5ed49db0d21b7d82d820549f8983e4657a65671b815e5c94c0ebd3faf75e29f9a02231454cd2a66c5fd3d15610e6feb1b2b312db699a42923ce469bded395f4adfc4d02c7c9cc00c1a043dbf6bc4f3b953cc37066b8a1207b6a95142eaad07bf6cf91d5b3e2fbe4054fb14c69532e05e767c6282b505a26b745026c09ce3d5113c08ed7c631a4393e7afccd4c4bd4bdc08c7a36c19278be7bd9d9006737c7ec9737b17bb19545b4ba1d6bcf524992f091f7f1b2652ca7cccc1e8c9930a3aaca40cd463f9a467be9996a5bebb7e758857f2266d02f81c084d7df93532aa14e1b968b87fc731ec0db1aa3dd415219cfd2bfaae31abb0944941f05a498924b99d51c8843196c786406ef8f3d4dbd62023f2688b3760a7e3ec6866993297b0cf1134fde4fbca8e52f9da51155af2ed38aa1fad4d86179b64cc5e31719b46d244f4af29bbe39a1ac10b1945e51e91f9f5c72b93ccd350b7a585d128be34d4d10c4ec9e41c9e298fe19eeb4d4e31a74818286bd864ca20d1d4b1414f14969cc9a62e444e6e915a0d5492153978e84e6eab3e7745bb4810063b9f0fc53a56c17e28a640f45a6cb610fd9be1c33fa1679fe7db9a6d3e1f41105885093dacdada650999096d90d5844d9146eb38fd0f7f31ef321ae862b8ee5acf5fb95fbef372ac0dfb1fd16c8f184571b556c64a59174ac73d15f0455c16070741c44002da3aa250d94603fc7f89b116783da36dd0e8b33c9f25f43d2bc47a80b41ef91b336ef07e1c7ff01e4cf82b0830c2466d56c3447166071247779f38a4ec4b80715b208c1c3d7e097ae484ff44849b86283f1558790bd81730e56f9e1ccd0230b4a04d38304c6342f094a0940ba6dccb05d0c2683d86512f092462303864f1469bf118bd89e399ee1f327288d6e2c9485c9aa4f9c338e9ee8b21298fff04d92ac3bd5594fd0dc98c15e3ee20a43b425ac701baa4be2869cef0436e6cabd5b8686ce2a8fc304c8527b7a40fb807d563a43d5b681814e54b8fc06bc31a73c6689291afd534249cfcaef348c16e11e636cb6a9e50c985bab44d9fb367fc7227ee17f073e894c101210d36fb4c1cb0937329503e9a73dc374c24a5e88b864da0fd8480a6270844ead5d7c2f46cc770d611ebfcd734bda6a44e73aa4c7444bbdc14a0014feb1b65c9199425a89a5bc82ab60c5de43c22b29ab9ab6397810c5e0fa10e937a882dee31c0a438bd7cc5eecc5d5cab4fa446bed1483464bfe9a193eb2319847d4869c3ac2f89b617818f6b26112078183a209f73d7813bdf04c137cafb250284d13eaf83a6c18a121d11f82ab958b6e76d804943735555671d4ebcfa32bd48555bd4f7bc5fd0e2d414c9daa0cfc0fe88380874bc1ed183b78f72b43f076a6648c59ce84239a962d00c1a28c9af2e2b9563d0ca80ffb5bc472e8004481573cfe07a8e9db6fe2071987ce33541e11a6736b6e0d6846be365b577500b674cdbde1f3e635f32d46c7c20b9e2ffaeec99793b56b9b7454975ba1f320e631beb2e0ac1b02156dad95d33ef2e8476968cdc4606f999da5c998a3dcb862bf7f09afce2d6bbe4c11d86170d65e839027d6690aa48fe43b4f80a7d72132c6ac4a4a39f0e9b75176f7291a45c9786d9d9ac9d08f541a93a5f66aae43aac4510b5dfe9309462c1e4e334ec9bda2182dcbf58d17c680eb59be0619c15a630e99937a1e0937851ee5a28ea1b2e3f8d223292d01d830b1f4cde2e1fd4a80ef65745c38121c6d01c52a2a0c08de1c508f77edc73013df13de498f243e0ea68a9b80fc99fb72862e0203aa83254ccf6102e0095d8504a14ad7e70eaa914474d38bc6c2f8b8d69a77040bc33a6e806cb9c221ffc36ff9b03b010224e6608b89851485e2d98f696fbead36ebb4730800bec31e6cd96e566bf40f1b706a7ca046e72338a8194e87a47771c4b50ffc493d32ca4209de82d7d468e8f14d84564f9fcaaee19316db0b8a603e0f7134ed271826de88bed53978e4072287caf2a20a6e42bbcf22e46607e36c0d8b7e855814b35a5c20f172827ad5ff11448a03af8131d685845c305931887c30770d1aaedd575cc52b4771516cb872384f8f891aa80004c9e08e8201dc768db3b953dc8afbed99d3395bf953a253d52a48eb634bc535726c73b71fd5176666279fd8449f6ccaef44f69b616623efc6aeb16c990161b81e665697c5b45bf687d4988f65de7c99f94bdca1d856b2bc7f9070409a02215d8f31e43c185677fb842fff153ef7c08d5b2c71ecbaea5d13e6fab98dcdc96b9ed14bec5356b0b86a1836e65ad79a59d46accb27302048aa702f9ca77e7cc1fdfd9068ad981b341b0d3b771875185a9725a1ce25f10c99bf0816278488cf8026aff5d0b496745b4e7b6841ab51f9726d7db74746126fb2cb403105be9c1a35862d78822a4bce646e9c495dc3edd41e9a07ef5c66a0583aa89f297a0d7500961cdf6fefc07b3b741b36759c0cfec5596427d1034e2edf70231eb8f842af5a243e5bb2cbed551dccb028a65e08d1b1a175f1e687fb70399c5fa9cb1d1527b509252b80a21a2d1bb4fcdfd4782ecb9e7d8b1c125440ec79dcd18358217811703b0cb832f8fdcf3958abda64d47282806a9030e5499047e4f74a61a2d2f39a82d349ab835c08244e55f3648b6e58b751b8f5c87c790bb4ee8e430718c87eb4ce5165ce0791309b81da4f37d7162f9153f150a1c9e42906529a6b539dc0a89093dba62a203990475311262265d10d8644332071dad2ea5af1bc0832426d1e521689906cf14caa4828ae43bc6c3aeea0ee137db2c469e1f9ba616fce7e7f774da176db20a2f1c017ed0eea8a27b7cd8c9e8d4b4c0c3d04e2e4c62288dc593fd7faad1262161ad54e33d8b30042e7ddeacf14059e586ccb736ecf9a53f5321283f394a52cfd18d24afedec7c34209bd17a30a1f6b7f2366e7473e1ac1d50b8e0183517c2926dd0b363b75d4a475ed7a91a54c9c0e8774223853a2ae77829fc3458edccb95ea4adf13d5e4935ca7f8349985bd3e88b2caafa81eaf277504641041b176bab7931e130b9335b8325514e80841d5e4531f06432e48730e5551528e0d6936100fca9e187a137ef692f5cffe9d57c5357f4d8029177b9f6ff05f78c78b44d64afbbf2e74afcc8c3d13fe0b0ab72994805a96373d4e7c586df359a05a0d4ca2145775c19c98c52cc9ce861014527c977b5f6588c5261a9ddb08d9143b95c21df38891f3c790bd586bc3bcf778c3b14a135f57aa3685b59c38f092f17616883319b2fced6d574005888023a8f3d3e9329b2b452612ff28e515a304be9195404ac12af392be139cd0fa181329472cef5abfa6850171c6304741c5017e094b8e473c2630ae7e5ca541f7c00a1ba8ff0eae6a428dc116e1d72d04e8a2f2aed1f55682edf100db790e19372aabfbe7d31182fa51d1b5bff2ff7cf7fcfcabb5ab4c4a5a0085bc94e66e80d95c2f7aad35330002969e417307ba5f10b4c7a26a384c8d8d783ccf2a4db66fe3449c2ac109a14d8d27445ae8ec5bc2c7829a445164f3c0a246c54df520b4d1d7d79020eeb6e8ea490d6d3105f93a3a6d9a5e5217386d4e7855a2dda31375cb52bef14b322d7c2a2056a483631d76d03c721112f42c6cf6daed1c3a21e493fd9921cbffd7d863ca6f178ea32630c811da91e54fdc3cb79d14f72868dece1fcd7c94d52f4a2167d877cc3d9d11a3c3d2fc98560119f10a8781f92b791e9e1660b1ebceef35f78edcd6e2e88725b74fa6cd06409cb5d853a8fb87dbee4e2d67d2dfd483c30f92a2e2eaed384fea69c13cef59168443ede089b5429c90d4342d20063d9bea55e548188080d8b522ae579a4f8314929cff7351c7c36e252f38aa3bc5f3d3390fd9c079fbf9122356204f77b6b5a20548518ed699ed8408c047913ebceddf34dfcd75cca4b2aae5f6454dc06d8237ca7cc04f8ecddecaf6ea695b67d4f9808e5b86162a7927878595a2f552449a636c07401d13136bdf88bccf7ef6e06c9df38d0978fe1db230b27a48c80916b35e0408cea46d373ed1e2468160f9cd9bf20ee5c61cd266d5c1ca22cecfb418aaefb6b12eded5fac022b26ea942836dff46556528ad6e243ac71bc1f2bd1636cd4e74a72e151c07a03b62507d06da6d786236c8077167fe9407c2863d33adceb23bcd5d7f2686f89da48747148c28a9c20cf06b8d0d6a9f5bd5e45d4dc9e65efe56b5a9309258cc1d9739297b01431133e5e49a85b72e2e62e053f8f3190764d9e98cf2ab6d03af862c2529ddfe3d4244385dec618f763b950346cdf467c5fdc22a65d9208e23872ce820d798f8b7c94e8b2d565e81fc780c8d93e321bb0778c18a93db860d3a3e3e2ef142520c1a6e818ea210d4aa7283a55f466309b27d0fe1dcce0af88ca6e4dfa721c86592f9e1deb83af760a4f2462ad287f8612157211e7878f96797e03f827405aa69f9ff4b7c2fc13cb61ddd4ba0293cdcfd577fc9abfe5cd9a523a737f2521bdbea468b7e772068e43ae326fb8a533e90a1a7bc07d196e1346ca8a5764ec48dc0b8fca3952cd5847fb485a5cd7045ce5dcf485d5058d2a18b74f21080c64bca07981a38135f94abbdea05cc75f0a077109969b53c5cc80428b2ce7cdd2b5141a3f9535013083d2e0bc954b580087575063647752b05f2801e2f88c0095ad96386581ac7c4191f526798128ee75da250e5b0b49689a572f4f18bb0349ce182c58af5f1cf035a8946cac883e4e97f6e1a771779eae857864d0aa220c6353e8303fc50c0ddb22eda72413734825a9c9d62e56d64a00b941cadd4ad584ed8ce96bfc68b92565f88cf577335fe4bc98e29b74135775dee2a9a6c01bc1702502b4c5a3dcba5104c67a7789b0fcd456212b21fa5afb2b78ed3c51789dd123f220dd32aae8122831fbd12188128399908a474384634a70469bd7baa679c2642e73544e239c631cceb8fff1d48999bfae0e7e00cfc0d1c49bec18c7893b5f4a35edf5d3a076256b8f3800179e73c1a4646942f759552212d22b58134fa97444602564b04f69cc4314e375d583c41878ca973d850464fcac393037158f27286fa35f9b5172e514c693e0d8260361f242a896b8b11394f3afd0d77d4c3d3b75d64c4b8f47817bb29e692c54388db6c2c6878f59d3b9b8b377e4ac2f687b38ae4d271fab45f491902210659d0000fc58844f9650109d2144309d12d32ea9769236dc4718b106833ef7977183fb37a5d7e871f6b0f9d2713264c96966abb33b570284597704981307044b0b929f90e421f084bfbfb3cfe3a284a516b229d6f911b20c12941794dd8a975b4a75ffdd00beab0e8b14408bb274467396b795b5b053a27c286c90b1aa7fe7ab350027488997a2c4092edea164c32bb25c1aa8ec9b73e6260689c5c97671df7c6896a961c19da6da805c80a8d55bfc8e9ea53456c75c80b46af1ea2543fccf194187fa1d5d006feb7befde346bbb926517130b8a4c81ed2fbe28b74bee8d4e6f9c5f6dbaa8afa851d89952d69bc2f28f3df4a545482618d1b961a104da9cec9595e674f81577694576c89952bbe06c2948da8721a33b6baf30ac74e7602a7f64c7b9c73872c3214a3c11efd76b6b5e41c4f34fa3a48d04ea46cc7f2ec98753802fa1a1edee7c16153cc104bcab44d4b0647e22593e448c5a436b04d6584e058a934978a0f149b003ccb0df25549e6a7a10996d095089308702d85426d287aea426064e1200fbef79653565ce3fbe1f3bd8675477a55746cca8fdc7973575e7b8d4c89105ed382ea5ea96c33dd74a5e7f1cc5638da02902802eb9d2aaccae3fd22013046e2729e06845939570ab9f6fe97a528a4a60b69308a565aab960db37460816dac7c77414d829325054502b14dd0cd4f771ef95dc259d2488c83a8bd3a250432b5147902fc6e0e30aeaba237b6a460cb98d5ad589ad5fde6beaa09f84f6c9336cbac751ca063a77de48b83c140d11ef55f727409acfd7a9f40461a228e441be329c734e12300f86af8c2d05c2fef1e7a0dfeb3cd4944f1bec33e9755aced141ae2bfcf12a4cc03bb44a45ade230df594d0b597ebec7a8eb88a77a7878ed34dfb7922e3609ab279c88abe527aa0e099d3ef5e809d2292585722cec2a9457314c4a1aca17b7e1ec3d35436a04c71816c22a443415550b3c5fbfe5578f986e045e66749053567c46ed7b4e1bccf82c759a80f905a2b4c47ba27dc217e43fc307d324bf1f94bf03d82bb1af307658068ffdc11cfef33801013dc10aa8162b25a5ec0c234789bc4df89fc1497f653f19601a2a704ef0bb2c914f30c322f180ae340c31f797294e7a9cf827d48b1c7b5340975a80598b1b157099978d1fa0bd524cde83a97988550f8d1002ef1033fbb169d2ac49bcbe7246d13b625d0575a679a06b1faa39d40a2a4e28853370a7cdae715f35f9321bf56c936d8f87d0c5e8a3384181aa25378c2a5c428d0f2238d4fe08db30b6ae42d971c5aaa1e531bf3b007a4b3daa2aaeb22b169c41639d9b0d224be4ef14137e4ead5a12f2e8dc31f3c759970c57b2bd4a201e9db3ecf47c0ca00988692d201c77d2a2e14e7030b78461526669405f1a109d855e466fa35640a229228bee4e839665f8c6641632a0399b3d2451f08a1176dd805120f5aa7e86e658822c99d17616e6dd59c230290fdf59dce57b078250e35906dd20dde060abb64863efe6d18ca30df530862e587772ca08fac2180dd20d87a060a088ade812c52e3d8e7fb58daa4079369a4bd220be90a93429db3e8c3bd760197b69a174811adf4a73f7bd9a5b74010b00a51697f483e3d63914a562e95e199afef403ed4cfa77c4e2abbf044bf6f29674ec3210212b1db5026ebe00402932f47971e5dea7bec61724702f04679cb6ea3917717bdc768e80353bc45f642d66502ce00fb6d8c27c2d807a5a9d8b0ddb73e42dd21c6ced053bcc3c3a489b53d284d494f91520163dc1bf769a5acb34268c86c2a8730480ba489d6545db76f48072119debc58acdab0f88b6f1b91ff10a6ddfbb63eef5c0ce76a0d53ee94dbeb70ce3ea1a8834742badbbf649a5e075b93113b5137fa61be694e705bc996c42350386837fa6228a041ce39519f68bd1d0ad2e925b769b5c673f5db043cc5cb1699d71b169015c29f68ee8cd1a9fa4bf36b2bddee1d99a57b9621229a9575132b3efd91c89888deb9918accf40c9596a01cd7a888ec5c15e6a2012b3eeed590545eae19c64ad26ffd18042df16b456b282a7e93dd0126f20e4eb97e04786f385aa5aec934d29464ed587a1a828980a64f4e083bbf4d0a6ed8e002c3ee82b9b0905c4e9c1062e309562e92ae00c9fa882e94f78a3c33e89092cfa988cbd59329487251a6f048141e085eee974f145f69780bdac54bf174fa9329c63c640d39510ffc405c96dd8032884eb81b6dd756a762e193eda3fb2b0e12184a067f6dfa9242cf123928284cdbf28cf20b8d5e1e10454e96cbf3428f6da2b1ef3cbfce513edd5f8c521930ac72172ef5d17ad57f3f5fb78b7c2bf17ee3acca1581aaca6d475d30e35ad69bd53043dfaba9aa6c4b05d4acacd62358c004aa1001fec32c949fc1c9b259333575d2a0b66711bd396a66b90e4a3105045352ab9fcbc9cb94fb0a026791f1db5980086af4f3bd873170f151b8dd34258baec180d97babdbdb75b6386c1b91ca383ea839be507140b1881797035143393b1cfad6ebe7ad99414395537af417ae90dc18833f913dd2bfc24290be3228b57c14f7ead0a3390961b506309aeeb3550dfcadb96737e6046c6ef81e227a68b77054bb84ccad995a9bec5afbe804ad850a1168845b2f9d2c85d467c729c3870ab1cd1af4d0bd0968ec9eb64d11bc1d963161abbde72aa8ea585a6473ea77ba9bf5429a47f71a1d46c00899d8bbfdfb7687e4e340691568d5aae2b8b1e891b997eabfe5f104707430bfe077a5271e7ccc4fee2e8852d1551df06c690bce79ef93b0ad9d0c631b5186f78f98a63d03d207f97598e3eb93086942e4719e8d32b4a6af24884df00344dec08b6bc51f8c951782c06f74932bdc254cab03b24e13a6cdcd7177b67378a6e925183bed3493e5d13113dd9ab12479010eae8db8c6286020fc0b91e0e8dd242a3548c2ecb4cca2f16b6a2d12d8ba82d0c40894f4276850f9ef54d852700bbc6320ab6659911bf2a57f544c61c8d872be8a55655571ddd5424ed2381bc0e534329c3529641ce777bcc38ef7704e211de3a26648506a6b766c00f2ca43be7d7d200d098495bf90a0cb5b3ef160507b5c5b568f3133d5b45f7401b415ff8ae25aa69d4f48693551c0ad04ef12d4e5d3aa50cbce4244181e8937a674c13ee3251c70f009883d082e1e8d0af4648003c5070a94292ac725e02a9fd85a09700b0bc7620b6f7e0758578209d64aa73ef4b44155eae7aa510c04587721abf46d645431ec24833f31eeb0baf8dca8fa5ccfa687a7b692642552a1e8ba1211450558d5138f9fa1698e3a9c088f0185945901543e609118ab9a6120f64878390d127cdad830c865343d45e04f2e46aaa34a9ab7c73c4c833235b068f5e7af78b77d3da14425e5075199a0613b56f3010f4d6620e07ecd25703284f932f38793321e3fc54605f21371d97a428e4b83bfda36d4f71e1b1c20f64e3390bb433c05cb289e507a129d2280f16fc13b2f1ef2d3db0373f5a18f199e55635d5c49db85cde06e911a89021f61816c980df7d393b40fa5e92b041fc7e4b607011cf23a82068a14368f7a79d3331df259c79b4a9d6827cf69527f493b15f44284c0e4126a05802102b80294a2c0e32687955a802920d7c711a0ebe7f8916788dd3db5835c7787e38e95cd3091edb02303889186446d00d92238f76dc73db786c6dd4f20f06ee661df6b854bc44c03b401f5b26d58d4981825d8f69bc07e1f11e117d3fb4d9e087215a1130c87e20f21b90aaa73b678dd06097b9f3964b5423eb5a9cef26f5ba50651396c2e027fb2454499010593999c4a6fb1072ca629c960448dbdd73910b7b16841e963e02b77d07999e28df255dbe9b19e4bd2ad372ea7fdfe258e53ab331c5c2ba00f956677212e4398f1a45c4d1875f612870da14dd9f3365902120c37c393a286d8990aac22b2119a219670635a34df430cab8b4d0fccd74b7d0b440c9b8ae20de5910859a2cbf91a95a410c38e69fabbaac6614b93d5c2e2b56b1a0cf72aa729999b1fba0ae0e2b801059378ba289753073964318eb573f0d32d175caf239508cbf073024e387dccc07c868c45baae0f9f7274004aa2b85cdd09c56ced4b35b9c4709745294566fad92f6954baa9e690e6ede5d843e131b11904a7ccfb4c3729eac528ffc3bcf83f2c3226db5b18f109214d7b50c86eefbbb1f6f2258f54b1fa9c8c5f3c3a1c575e2b4f60d032c1c96d24047d91b0ee90902162b40cbe4ab80126b77facd178980abf02ce59456b20c8f87aa3d018a311d1fa03fe3b521fe55a91c3008527ac878783902d8b2632a76d7e3de767f7896362f91da226e17c4828ba272c203fb519a4b135cca17c0e8e23ea3ac9510aa31998cbf616e7fdbd1bfb54b4550a4f9154d90ebb4d2e8f768774116a117373bd2e58762b1b256f8de5e7304181be72c5e125620ae92cea657399ac1488c2e75c0b02b63b4a4296150e743f273dee4c4da96a09905812015ef8f2a2adfaa3bc136265ebe859d2775eac5374a0e4c141bf583c7e6fc1f9698821286efa60eda19a5f2fcd4d158c90368d6d0e85360991bd23467b7721ba3e66e8e980aacb73eb32e82b814acbad88c7d221583470917e7acbe631f4fa750e6670a056cdd0169ca24bca6cde524d43d7da51e03be458e83ad22ae2ea8f9d041dd997d5edbe0dce52455f25cfb82f9be508f7063b9234d1eb571b5c9dd77bb3943782a6b00537fcaff6a57bb357710485b766976f052c4e803378eaacc0643193c9a840f709415ab7acea4afaf007a88b97a8fda5ed83e8c1fa3a844c0314369e1aeb7fbbf813ba2f0644801daf0b578dd500c23fb4e2d7c062258661d4364bd79ed0168af9bfbfc054be073201833c730634f857f03b367dec3038fc6f0d94bef6d628a287b37d6c046fb847eb41118df1da52b15ea58efb79e7e10b9a6a5f0445605bab0c61ff273d3b9a42f86b1635536f10886501709da3db4c4ca29e0648edd6691645d8494161f3d7665d0cf00db2a213d21ada802537708abf5e9941e073fd10f4391024b3b6c1a45fc0268e3ea03ae473b6f8810adae884259dbdd796cad31f4287cee567410fbd112e5e20b66560ebf25c2d8f2b0a8ec68a8a8925862c761a5e524d9483e985258f63148b0e02706df70f75207425a7cf9a5636a05417b224559469ad44ac6d21861fec0cf2b00a57291f55e0b69d330ee1e2cab623e69e65690409b8dd6c42d0340a95832a0502bba0c5d362f8312f9a63da035f40287907790b74e26657e5a721b54df46b8425aaf7e8208106464160029760b8a4f5a840650c4f3f3c3bc92a07b2f49aa671a333e9ff4ec1bc8a866ef6e6b64800cda089dee60539c2dd60617bb843785c0fe565a10fb0331346808283f215220b596f13194296a57973037ed8181e569a1e867b37f87097a7a9b08d40a4b965258cd8eda3be71542a7ca86e6410c23de93a80375156bb01d897868d3f6f4528c6991d1663e9457eae3f95fa1bf2f21d9f5f8bafc135a42d2633c51dadd794ed0c262ace8b29b30d3597b499e9cb7c71f4990ebdfe723758d7ea029c0b8b4712b696d97d386b14bc6ea4acb7fc801a04cb038fa570c57b79e8426c3ffb78e36dee74cf323a747020c81ad21abab04909ab51003c2b9d90ca8a9578f15b6ca106c07bac5dc2776b87f26028ab48ec47b244d8a88661856029b273e99cf3e3883b002768dc5b0949e1bdee5a2757a5d60a1c3625a012a83b1106de08f220a27db259d20f9087bc0eda99a52480423d8e75b848e90daa310bea3087b9bc679ac23c953d18cdbfd23d9e0f5aa09644060ae5a1f43fd096086368394dcea4c37a09c3b908ea3677f1e96ebd5ecde584beb46506518c7aa279ef8c2b7caab72174f2ac8379a86b15238df94ed5ae6ee49ac70e65ea93b4e97815850c361175a0f8b460c54429815c36a37ec69774d7307613ee97682317c9b7626895577d1f064c27d75cc60edfdf09fb061d8db414cd4e504d4752cc3c6643b40dead87a7de8eb72daa975a820c689272ebe12c03929bcdd388ce3dd32a9f92339dac062e757801f11442e2597a16a605ad04a4092fadc82daa871c558b59ea2cdd043c9d745ae41b13c30ed14bfcb147705fb3332241ca3587fae0b6436778a829c4e3b59955d1a46ea33dff86a26bec133898ea969ffc168b3abcbe40901258da88e6da637ee06c1328527bdedb6bc754455bc2b801d141e802d07ad5291c20f0410d7bce1a258dec0b163129218eaf12fcd028b8d83d922e9b7ecf401439d13168eefd649320426f91fbc8a705946c48199d15755d29ee02f3f1d979a64998d833fe7d03976f8923912dea24fda65c9fa0fd943ce36226567c3c9a3771eef253b1b6ea21b48a964c1286b3bb5ba8cbe07c02996a7e8442d9d9fa2cd7b1b66e42ad369703843adec0fece6a42e582b69a5ba105cfb7f0e374171c8db57c4ea6b6448fc8ac63635693174037ecf32abf826c743329bfac10e8be2bffde6641c1f6163fce54eaa0e16226dcd7e1392132ad3112a81c48c5b7bdbab1523670296759a648314147954536af143c0706d43bd338099506c6f59d6b5f6844f9a39ec304e48097413abd4e314286774ceb2978f3daacf05e923d8e053b213b662de7fba2691dec42b2c9890173a53be862562b0dbf32e8ef436275a9b436f344131501d60e7db9eddf484191e38f1691edbd64fa69b755fd513f96de3dd3cf57a4fe10a851d544f61f7fd9174fe4a1f46eec5b7f2b83af6246d16ef4f37ed57fc619805213a48f8922ee134567543f3610673e07cba24cce0c31bbd46a5ac669a1345bd4816bffc6fa01bd8af39ce21743877f12f630372a24ceb71a0321ceb93217b47e5b003ff0e285250d2b3968289b87bd936e53043418d5855e4fea7269595ebea2801ae10bc350201b3a90db9fdcd36c102dea4461811aaaeec760be7dff99ec06bc3bf6ca06c6ea91da23ddf0b93528270a81cd1994fbffa810d74c674446152e0e5bb91af12295a72d73016f1bc470942345dcf05385669bf07505a232e95fef7bb905731e80e7ae21e4c9e98e2da55993802a81be73a74842d75afcee045a38cb40184389aa0a42cfcb537f7c25acfcf3e47461e97f78036770240348213dba2047ac9cfb638b7c2f35ec4717ead5764bd404083ed60bce3aa87513e080a67cf5aaf9f491f5aba323476fbaa8082dca66ba5c019a7c75b02dd6742f9affbe06daf45ad57876ac6157391d28ba38f6866635dc0ffb4013e24405b1ae104b273297a795b5a0d52f174f0e505d1f085764ee40b09fb76ae9537a4650df2622e1c08b6e83eea3725605315660c1b009658b0ac5d38243823741d73c316db324b911173d9d751f25c0ec141b8d7d4d6076b4eb60b37ae1a78619b096d416643089954df431f2d65a124e543930d0d3ed959184a9e18b0e59c35fcb5bb14263808f08fd5b40a470355ccbe2872e5ad570e6083b5ba3dec84096fc22416209cb5410fd1cc4da164fdb6510bbc830dd8a82b7d2ed03ae4a052da2a00a138e57edca0e0d05a2086393a2540b9c8ec8f5708fb4a49c0d0422b10a60cc6eedbd121cf867e1086e0cdec9eeed8584e744f02142505befd5ed15b841bf691e86a623097d64e62e59bf7be9b2e507d7773ea3ea0ec2c5f3462a9952059107b6102e34f46586fa50b7bad6af7132492653e7ece06e007b76df77b8386308f5cc10d9ede1c1323c9363ee9b0525872919a568db288fc9fc7e0255fac584d5716e981f85d4f83f29d7220ddda85d2f6d5d09e901e2adeec8b9494338780b56ebb7f91aef5eb121c1ef5b3ce4673416dd645037e578b16b29676cbab3ac3ba392effabdabecc12a6a7504043c6dde753583d7813dc2268e5673177baa903182d2ac1e949fdc62dc9561401f47616229673d00e6eed800d7ce30968f45e8158607a2e80447183dd6c50d2d9f8ca79904cd8879eb3288f9ab1a4b23df012a0c489dc3410bb132b105efae1f759c58d4eb0399bbf77f81b44659531d53de7c71c00f17aa13160e94c90d3a9477f350d75cf9e1e3357d61d5324c54600e64d33c6600509a9ee0f6fb3bfe3b142988f8e64730857c821090e1bf80cedf2d7eeda8d689ff62f500a7b06c41e080d8914c648e46ee3fd767312def8db8895aa0502a707e7f71b0acc0f31a2e507c798ec829d497d2191403edceb0adec700b86e828fe9ccae239c26e415906e78a6e7b92c08010175ee135c0ed252adb9cbf062d0e37ab9b480a574ee4a3f41aa878f1f208ac9b8129edf7c0d6ee5b2a27375ac6425571c5b6919a52aff57df7b4ab4397e7626b17116bf65574dc322e0afdcc61dd8091c882567425c9f7c2658e8f8ba860d12282cf7e385b354a2ce1b3eac7b6e07bdcd80e2c272d69399d5f54380a917615b33501cb5142e7d236cc687167cc2d74f24a7dabe53d4a3a596bcc997a2fee99dc2769e57f907bea2d3c90eb5ccd85503a13ebfaf54550c018406439e96fe59ed80a168a5a041ad425f4fe58a31f66b41ea214bed856cc02bd15178e3f044912b5445b3560d5d92313a8d6fcef0506092215fd95d89edd8fc777300a1fdd2c258dc6023c0ba5f5c72879152ca7126ead167cae98bc74fcc18ac7a72662d8bdf5f824e722b2019edec5a25d72e3ee9ede757d81e4de073bea0a9b47e72fed1679fdbc843b0683503eb0769c25b4d1a71839cf58c2522c4e30a0127798b5201d14616d1f2093ecd4196ef4cfab3b7814d960d063541c3954a9d501e9fd1f276094f6f7bf11103fac3dcdbcc09591b78e9934f3361c584badb39c63ff4e37f96cab7aff5395b9acadb3aaf856cc8ffe6e2dc388943c3123db5233a212578ccdb65e6872c03587eb93db429f3a199becfc8138bfb018037d8338ff2fa2fadbd6c11008d99bd4288ab4d31f2e1228cc4d2b60be9f726ca37724038be9f6534b408cb0c4e94e8b47ba302508d005e53d9adcd6a0148542bea1a6977226d8a0b4d1ce7e8441b5c6ebc6de9841061dac6706082e660683137c29617fe3a71504aaecf37bbd25c540f771058853f13850b4534610e3a127da9c85b0ebd6e0840fb141e0c03bd2ba466144bdad8585047b71c551e1315d79a0b70b95982d7655311d9e2bd110958539da3fc29603ed8b43a40b48e5ab5cf4fc2a72af9be0e426c027a533d4ccb27d8674d92715b01da4e4443c84f82e7a9847eef31dcb81db2af502bae887c8e41d6e73132f9157d7682ec458381df59f45a64c7d4586b6e60c01eb4467b13b848e5aa24699aff0f1053d1b62dcd8a23a12ca2501932a7dfa7eede1361774c342f0b88f51dce4ced317e0f20b1e4dc9d5cf9a7d7f9269a957a3f739d8c7c648fb7d999ebe2bc0c36239f35f1377e4a295c6254a0817b864d7f4c78fccfb6db1f06f3c0d1cfd3fdafb768d632e994d230e125a07214dd959c022be824a78ce2fede0cde50906e40cc0e648b9635a125d27d026c364276e901a2db81116162a6465cb5d96bf0bb8d278aec0acf2b268f68078beb289e82aabc8f5f96d3df44c84dae31ee74a2ef95fff9d5e6502b510f48a0e8afb6f56624a373f919119ab42100cbaed9c627f1984b7a7d6e35c0401568e6620afe9a97946fdefe4aa3037c1ad096ece6efa493f7ab0c77c7855ad7ffa7283e782201d37fb0b9ab56832e71bd4357a537d412347a5d971fe9a4a83bf5fecdc26464a2cbdb75b9ffcc204028f98c3dc8f4f0677cb64d562c01b945c498823dc8e4af53d1add1a20e5dbbaa679dc677cd3d989f911617dedd2233c374f2af8865b538be72ee44b27073e6c789fbe24247215961ff3458b0a5b1dc74a7240ae1445f33a76389f250070b373f65f8b4d3dfce1d2b3785c6f0c7583a94d9643aa09272755bc980cf030df2982eaf3a23f6b233987e01dff89954fccbeec56d3784318b9d40e6fb3ae4c5e8a94b3c5d610372b3b400310e22c78e11175f5c7410fa0c6e3ba1da6036af590e4a8b1c2b8214a8ab217c28d93dcec434e8f11110870ee2e3644be9b8ab6915100e71b569dfedc65b6abe5ffdca3877ef085c5690b716175f79f68c0e81f6f2c257653e2008df070c2958beba87b44f972abc08c73004ab52a9921810f71c7b7d4acb8ee0c9653780aaff95956fdeb299a9eaa05a0b297b947c2d443f444e60c3fef1a2d62845cc3679ac796d80b16b443fd7343f50f4ca63e722094190bb1040afc60ded123deaf2fc913f98eefdc98922f25595298c48f3a693ad32308d08f747150936b001c7b2d5a7a9d1e4c9ba759b7ae8f24a94b53805550ba2b4c8839f1622418afa15706e654e2ecb77e31b14d27b83604694a1c39b180691121b101b2fc94bf45be60a9b41a279e0e5d01719f5aebb59b35234d4e514ad560e3fbf44a05c942b9904c6d1ff0c1ed03711cf3dfd53a36415e5310e2e111840e0bbad112b3089c81f2fa19e0d8d06a81c046937702d8203d3bf31cfd69fc776d7257e4211db113f07eb565a16b1c247cd34f6d12bb0e61973821dd2fbb76aeea008ddb5bac0d0194a2d5bca43b1324270f4abb6436a7f925650b03cc7b65d2db2bd159c7d6a4ec0af818992920717bb311f69473866b2141723a290eb28fa4eafb44dcda20ff2ab08a17093111051e589b891559e8e14f8a721089045b24f434379f14d0cb2bc1d669cc1b8b8054e3103f0e7e544e93b2e1854cb33010eccc9300e58f40f7e6ea05944766f20385751a1c47ae9b516f87d6236a9f3e57492dab6717ed77bc9d3d25631a7655d9c1f5b2db8480beeb89677ce44989788bb1944409c1d3e718d234cef5df9229f5e6c7e69b45d3e21d7c62da3fa8f782506fa28989ce28b89c114d0e6cd1f496fc3c134cfd57dbae06dd735b53d3cf57ec83310b1c24bc95e34250d90d2f55231f3586fca24c4c97416fa3a2be5e600c9a631d143f20edaf3ea5849bb40e5a0911adc0a295d0424a46da378f5f8a771b7e45bfa48605169003924ef597da295760ca93229508b90b46d6182215ae0c0047658c46ac4e844cba031c9a01c7df20dca609229a2f6f8ec43a644755cb47109012905f1d237f2525c6338c26f1035fd4b384438e1b2bb9d4f1ce2de2e73722c24b3fd9e623b7f4856eb42ce1f58d3bae6db1724e6571a88596771dfef9c9448f48fbe4b65023e8bf735bcff4113bf87c2a1d93a15a44076a08578f51d46f1762559f257e7100956ae7a24df25e3571ccb857492b26d89425b37c26b087d0da5e4fb96660e1f97cd5662c80a39303f880c38beb398c68a172208fca65a1aeb8179c1a103160d49c45d8cba3f1911f174bff9a5c926361cb072481b59bcb11b0ede0daf04e066f4ac3d4303d08e28667d4b473516d947a1d560b59ac2ec9dca9b35774b1079d5ac1065c51f6a5f53a015354ffc995f3cdca7ef6fee4d282c70503c2ff5481b89937207d263192c0e784e44b2387e552456bd6fed29dbf996c57bdebb4d441c3c7bd58dffe9b0fd78436696d03c0402c2e203376719c55e85b81e117a19cc3624285132021b2b6e3a52cc98763b3eb4897c88a2bdc2dfcc73a43aff24ded2ec836d1cc3292f64ec26ec8e96f1241a8f83368b6e977719fd5ba8010cd5049c380f8caff05c08a37ed2951a9408bce2f2eb2eaaccb24871ad00a69f92564241325dcf3ce29f1b57185d4e8769396512c93b0bc54dfc87752fb2fdb1a6102278551f7d23e1f20095336435ac0cdd721666f754c13f6127b0e1742e1131550e8a320cbf1e7a45737fb24acd1870ee77b7d95285d8a57f4e8bcdcdd7aeeeb2c4930f7becc945577bfb7d71b3324646789af40c9c022d216448fe97bfca1892f6830fccb3bdefdf39505c2e6499b0c63145eb539bb05779b1e743b83e5347e77bab33554f53b179c58c7d08d54f5d2b991702cf02723def8610031297ed77d2002e5e197a00331ff78b36f1af795369fc2d508c145abd98dd092e6a161de4e0e46524c69a52b612d483a62fb2ff11931f1ffc00d1f28c387f31e0ed1c6cd26dce8379e6dc8fde452cef463592f3f5e490df3327838a78cc8361a216d1078b8565d039fe39dbff331351fc062a28deb8290ce17b0c9cf7783c626b3da1b650e7f326452901de6b505db7b782915cb57e30cc095703646e1a51f61f2455b3db62135a74c62da351a2b5f4d90bf280fec5519811142af2bc6bbb7861b3e0e8ad8d7eb8a6bc6a31770d6a1c1600490034d58c6a0c5fe2ddb6fdc2224f88733f37a60f14542ad74323cffc10eeeb169a549a21a66798b37af016c2d14ac9f4d181f6318911103cef69c5a7264bb86dea46e4c109e37ace9982ad10a084581ba864956a539474b432f966d81ae52fb1a668136c357d20978dd55169742734c81bc4a5e589022a3b4d28ced6e5aa14faa50dde8118a87593d9092f223eb2c165d6e8460667b92b0c12ba48d8204dc4882da7f4b156e985af5d00a0f01902c6a78c62994ad7d74172f49f850a61ae5ff7c14b8663db6bc0b5521866e5e070192de4f325cedfdfa1864c1d246ded01ac0cb35a528ae8c4b6d3435a0a80223aba5bd0bf44ea570f78c8f6e46224a6453e178054f887337af41373d48f8bf5055f6ce84ef8b303c05dc99388605036e775b5d90d5a56b21837c5850bb69c9eec4db03b9d58afc771fb61d1b7c1efaac41f1085cdf1197985c86ec4711f22efd2976647129fcd05998318ed62de2a1c4ee97db84446ead270afc065545b6525510ab906bcb8801d441b483e1997270df21b6713863302513194b84939d312733405b43502631250d3201783101014cd605230bbf261057e44fd5b09b5e62d500d596380f5a77b9eca04df14489d1108f3302095b4efa7ea510c53ca7982085d34ea39b82cf56d8712c045d3450ef8e756f18056a38d82a8a051d1b271f13057b544620f73d39d72b27bb1dc28ef367a852319fc44011d4df278a65d2667e1882f08aa0e52a5f45d1aea0c1f78d239174e7e355d1328919d2e63f075ff1b56430a1ef21705646e0699ceb621146610529952fe34b215ad0b7c3417e8a5ae901afd1c55ac01b6621a817ba58bc4f4cf628c49e75ecbecdea1fcc6c4a4a247039ee493ca2745778e5345f9757a520338bf6a6105b488066711e2dc3b866f3e81428803f09a5bf80bd657fd45bbab5985a222763db19806b817803fb87172112a945770321b8e67bca988217c1e515abd7af4d4faa3540ff9417e670f7e0989eac2dba21daeff6829409f6977dc8befbaae63ff3e77e5ab0e1f57dfcc8d4f962b2eb8b47e9fb026c1264c87c1cec001720b6e50dd5258f91744663a21eea3ddda3d325c8ec7a62e765d8a6cf3c9203ac79bc45f84a8baa915af82a3ce9879efa21f81af3c8c2caf523485a83447dd5d4a2f3e0f24542d9be081a8078c65ad1a3ae45ff737d4eb80be5c6d13779d09a39253dab6d98c9f01a5aa0d526ec55886a0ddc8dbf921cd0035826914098e73ab5d855bde1bd677360a824c6c96d5d4564619e6aed365424d4c4d7a326b335fadfced92a7e342faf00021c34537668f59cbbac89a4d788aeb6dacadd083ec6d0cd6be5f69fec07e9dc16f237f75660b17713bb62e2380b0f14312452038086674ce5403e3b96d46cf8f186ed11ff3bebbbff11eb96658eeaeee3c208ddb69239832bf42bbc39c8135d317ea392d4d67b6e2d51940d331c2c84bf5037d51a09158c6f01614c2ca09b5af45251ceaf8f17b6f4c36f325d8c91051d5bb6bb3effacf5ab865b057384c81573854a5abc3eba2d71f1312a53e49f204bca80747d0822900fe583a3893c4e3097f64579f5d0d0e4e33ff28d62dacbd1b07fa0e4d4b3c8b7040524c8f5cea2d1256c17394cfe804aa7b8b92681c88bc36b87f07f888603a67d6fd051801c829c2ebfb1f94aa86ee58372db262ed82caf006e99e07dac7af5f340cbeda647a2dda00c367b08f377436be584da8876585cb53f55edc8f7d7acf25b876a20fa31f0043f0bac5a192a45d8f005be1222663200aa80174ba3fc24cb9575d350311056ee449a70a06eb9fac3cc96d2b57651980486b7f6e4f9769d7413162cb095ff77f6b039ac1640c0e63601f4981b221cc17295cf4473c6308b73e36b82bfff3238a3f8e21c42da42e08e6f11e2db754c9095041b3edf9d0bf52fb6e9fea4e242f01916e383c9b682ded23eaa254882920d0f62bd6d14fc9302a899fc9558a8e83003af1c76c455e391d25615824536a43cc07df677951b145b960bb2f3478d9c7bf3586603046854bd238dda479afce95207958e3150d396cd3fb31d16ab77005082a63b204c76299a8285d90057929f09dccad46176c138754d8126501e5396e8576affbb27e7172a2edad4751be2fbeb7cd3e5d436e325ffa7666838f8dc714ce72005bc7d9d9a5759412250bdce0d29c6ccaabc03f5e8cd5af83299bd4fe6a81875c1ea73eb43c57a7e81b1d501f022afa0bbd81ad232a183b2342534e1405ec64ffcb448d1bf09e2eb6dc0f1e89c4c1b9082aeaf371d79d42b2a0c52b28b157a9c0f4476d9526c41c0579028c3d93a3f28a197ffe807efca94999578cbc08236998b1c319a25d34d8593cc09a645ad71d87889f7797fb5a4189597095680ce756494ee2704886e3a68871483ece3cfa2f6626408d9e3e8f46da865a4558ff487d5d4d881fa5bcb09252eb84b51960d4ec8c6c9f7d26a12f0820507e0f421c377d68c6ba11e6cfbbccddc3295f0a29a4a300486e0d4dad846cd40d81b8088011888b4596e88bf684b54a42c6fcee4a180e67702403932cfdef75a6ad7e6c6b9d1226a67a7db8c393aec86fc39033add0ac1087a0e1279fbdb326a4d01a6dfa8da2f18dbb5cdb2f94d83084f5b2a3e9943a40cf5e6d486504f0ddcd246e3387bfb3df84fae99fc2212fddc11dfa573cb949b113f27e49f3bba4a675d0c724bb05e65bb844bb41944f30ec48936fc78edf61e344c7621b9f82253c667a023a462ecabe2b565777d3468434b935226c6b405af65fe18b94796ef7206499403c9f129126a9fcea154087ba1507d790957b459eed65c669418f29ae954e2c4179059efd316848dea1b41ecf5bd7368a4e50dc44babd153cd5d4a20954c0b9e2cae88eb73f97569ac535926ac750ed62046899f6e999e8b2064034ff97f9b032801dff2352713ac393aa2b48b8b2c210a912bcd72f9d64ba1bc7a44f1198722a45a62161ba3f5490f9f45205a057ece4d2d39bf1aac172e32d46ccf5157c9bb6ed538260c081477d894d482779645ca6bf85c2cdf012e2a0d5b2d51a01dd20cebd5fbdbe893a8547c34cdf20a5971e5bc858f0fe1b8bdb930289743fdf5a8b0148b5a8a225835286e655f03bc149ad5475258d5f6965853e0d30d3a820cea9c1b2594920640b51cf991eea8eeb4864424629548fed94c54799b8e3b680c4dff61c85185df81e08d057298ed544542a0236ba0ad1246c1c01686458324d59b49257c6949cfef0f4cc10c0059aa16c0617aecf5cff1590e699abf940e9ca5f1f5c0d2a889c8582cbfa795827343428f22ad24f9ada4a6ad1434aaf167f57843537b138cd66b73292a7f9995e4daae5e8a30eaa1c449b2ca972759c5281abe0fe5762e81df80f51aed0daf0a806b813b267cc3da93210ad560bb4b6fe26b0765d919c4b57c4d18b110654129c3b4b9da309d284a1efc515d3ce46b28804d6351b56276b41ddda0dcfb1beee0620c48617d809bf803587f5d7a3e40b458f20778dcb962964e1716262e655ae42abd36aa57a937eec3564c2315277f2e97a95683b5ea58d53328335f0402457f1d0f335dbf87e1b707a9514c7c5bdf18aecbf0994407bec27347fd491cb4eb001a79a4f33df6ee5ce432cb5fd086b06b17c3228c5d821008ae43c6c054aeabfada6c519d95e399ebd0807ed8652ec107fa2bbf4e0e24628e6d3c5665d993a3883c4061042fa1750f71d70f67e5ee5fb823c78c779b119815cd3d15619a8898ca778845c108ae253bc400b8a9cf0011c0c5700f4c6c23005a11bc6c0d4c83532e281ea21012401a1aacfa73c00f0107323eef80d1891fe2f3e4e36b12208bdb40eb2751fc2a63e5ed27dc3f7a366356837519cd09dec29fb644c0d55f239b14ee9609f52e34cd2907b97ada44d26dac64b996d38550bb94ed9dc5a2472465e5033de7337376d8a75d41814689dd8e5ba5c4c7ec6612158ef39adee6ecee608ed708f2c71a793a38e5cc620067a4de7af438a063ffa48685b637f56e8c5626b38c43016491e6596e16d03cb09c8264256b8a1c2a6c7a982b31bb45c89e1db5dbf6cca59c4fb488d9eb8347d372507790c00891621dedb30ec7d2d3b078871add1ed5f633482dfe2653d09485cec59695c1a367b97b43ef94ea43b35d1fb2da7d69f883e93acc0bd0ce9bfbaaaa9c18d8e7ebeb67e4cafa5533c3e5bff4a7eaf435d05b9e5b53b6e8b6538c26ee02ed353cbff75f111abfbc61da561eb28ef738b810216929b059eb41908c48d086a5e0a55d58898873cac6d3327a3ac1ccd57bea3cef5a11e423e4510f5c08a5af9f383743f4dd2c7d27c82bdb494498e293de77362c54aae4ed8fe17e1438a6e01de67ba103efba19a33e4a502cd7ab0fc3bb847f9cdcaaf5ac14355a53ad67063e44425e5d96cd0b22e142bc312efa937f1a3cf25ab1820edca2e227990b63c3cc8d955f07badb088c47ba2e268052a86c7f27507c4767fc4a54f278fdbfe5cb61cacf1050aa519f69dc27b1e4826c8ad0bfaa2c025a01b26be5862dd12962142630ae414214c0c82f7e8027937a74739424daa1dd7df54b02bc0c83cd4441c34978646cd9c4851f3288471e0d1f052f5e4bc4aa2d2c3e83e9be682e0556cf6357019d65b7f696f42518a7ecc3c5802b84ed07ed9e950897fdb5fd5d2b28261d90030456b35357e399378d612cd9f6b82d11968b9af52159572ed48e04d76473f76242009a847c970d4544671ccecd258c611d09898b0765f3a045d41a94c796f15469b84c230a9a9bade513914ce448ef64c7438cb429cb9a42f5f06ca7236a677fce534550665338f6a800d445d25fb9c0c16f4a1081a1da2d8808523669eac7d96803be6625628ce0efde99a6513b053d892b11b71e86f8483ebb40c3b26e4b0439f3cbd67028579219a37e5110197b8cc2b127a00e1ffc1696fa667ba6976bd8453b949e3ee97e16767cf5efe4626fc80a5ab74a86b525b7347f21ae38c44a95d5d46360ff4dc45427521f5993d2b3269ea95f05302a27c9f41f0426001e90e4085f2b011bac97df9df5090ec8833f9ab6500ef93f506e14c248df6d51f6321476f63d77439151965c8ef227cf20a0f93c9ca0c9f81cafc6c681ff32752f865b024fa9bbbbe18bac7ba797bdf00d19d8cd189a1de7a49a9cf3fb2dc72889257e7eb38fc987f5f4a13d6402e43d8249b98524a07d159972dd7ae750bdbd4b170a26d139e3fba6647729ad59e2896ce899ca1f1eec899d9431d13c5db9fa401136f086c7059670323878374a017f4774f04036d7c0b737680784edf6afaeee4fe89a57d67fb23388a58353e4085bb483d68ffc8578bce7d212dd4287d80b543ce534a7a2f92e5986d43834f01590b873f5ba4cd835161ad495da01e4a3f68c932102c91d136fb2b1eb4774c415e2af486a1f2b429370435af37c091b3e4d16395830cf7269554cf38e4099edaf9bac3b4cc217fbb898f97e9ae147c4a338517ebc20e04b955f0d8651438f37d0a1812e0ff4ba3c9405c980d4078111db908cc5fc9a95e337aae707680678ab002f1942c7e9a67aaed7a9156108f49073d156dc62b0ee33753f9d6c3890a730d7d6382256b516a1fb95db31a3c7479a549e29f23f1e728db434c106ed5d180842a82f79cc55e1c603884999937feede03f99df10477482064c9ffbdb27d0a35405831ddc1b7b1ffca7a8b68f54db066f2ecbf79c1f44cab7448c5fecfb9461198b41d9ad4470a5345fa4138287d84a1246d6f9a59bf00218bf61c0e03259699e6df3e559c884386ee5aee7f7baa7c10208b195dcca7e83c1d48bf6fae748bc711f069a14886be70da980c4a12ca5150c043bd679ffda45057c292c131c0d1677af7f71a03230be7f76910c652be28aaeb789370ec54ca41131bfb59f54871e48302fcd9c75f400cc01a078c075c84a80587a59f910aec6e5e7167110d1ef6a094e6a851791150660b05625aa335ee6031bcdeccf2f6b858ab2d530dd10fe5e7220adecbb54c738a6fbe110903d1c106552445c034f260cd1b2d412d1ef2fae92528a9799d98dd825136e71bd721e1547a1fa734ccc77d3cce42781db54979dd463d678e83ca0e41b542d10f6df49a3a256d864fc372034d5001bcfba2f26bdf0b0122f50f2b5e6bbd6dc122720b03a82d8f61a48e2d0810400b9d4a13148ce3d0c4719cbc02f80adf71a136be9fb4cc5612f52806b5ade5e6daa04f95e2e97e3f2b25b37fa5d2fe461369ab041980b2b04229a1ab9c254851901ad8c83dee917a46c389c6474810373718d02d36f7780c974cf32013b2a295ba25728e077b4847d4983919f5ce7600421f8dbeab8312dc1e97629fae27e4037a04feb21d96ad5d5f0ed2e26600b91b4887f64f21ac0ff504a0633b4752694b670b3b17e17291250eea69c1bf7862e6fc61a9d1663f0b130c84fd16a9509db2fda84a87de068b45188104ec4130ecd9524edc3583264d1c07eb30ee11da7e6450169f3ae9c7ec2d49d9c0d5192bfa67467c70b43316b8c201a6a58425c6d262ebabf62eb1e542b3522fa144ead5f12f672fd974e004cd87dd1b39f6767ca3fe7924117f9238ca8e78e23e20c21d3a163449973562ef22ca9db70b864f1d0aab268dc36cfdd84504034aa604dd0235f8af6f299678c5de57b22d0abfe103694147c753f98248ff0a4ce5bd270883be3603165b42a1d35c915c959a868123a78f91e2b540796b1659ff1e5df759883944a9c6be1340667c9fe08889aa60699bf8af00559fd9cb0e72552036c767629abf7e2253be3d58f1fe82ad1f06b8dc2c7162f246b8a52d23560cfc28d369d3c5910461e071b09613480a7d9db5c06d104c5d541a39279dcd3d524253150da2e6018579388ccaf6b6c05e46d6b025365c943b73dac6866417336a99ddfbfdd20a903543ee63304fdaaef94ac8a1e686043d718d60871b7ddd12a3d5acfa265fd73d2b5e103bb839cb90b62e9cda17a2067e061d07be3e602a57f720d944d7a30849e892c9db0e5085d90568a80aad2052d304756b9dfb80ac9f6f712ef49ed5dbda309805a5f4978e57516705fe6f8d07d81a6405d7dfdd6cc855577f33d5faa4677926c18be631d59fa814ebb948204b942c6073262826edff50d099812b203f906d1a54d2c1f7529e063616ef48b678baf83bff4e9c7344a05d11d43f9096ec15ebf41e32852bb28b2e798bd45c7d6769d20282f684c65a0fb70adeef430d358d11d7b80e5212a50d6e7dc7c2790d902fd3a1103aa8354697dfaffa403241d9aa7b12c59ab2fecf6268e239e6eca66e504f3cbb2f1ccd2f89779d1edf8dbc555970d3a960e2ce219741f19559808e705035bca2ba1f6e0b0edf56eacd6a124deabd340874ef7ead2b10745fc7e8dc56371da70918ca51ffbd20dee7260a204403393bcc6a1546a0a29e1b5e65078f603b299f442da35c9917d1e8497064f63950f673e16e710ba9ae3c4c2db70013f9ab0aa48a85dc2e7a6462ea883066d038154c3fa9d5826674677580a848b045b9ee07e259ee4ff37700d625d6983838c7cfb115ab39b41f583a92e7f02c54232cbf81810659b5c9a231cb06876853c93450a688e582630dc1730e4673b9a664784fa2f254788e28258960d88abb532e151558e5fc4f50428adf9e4b9f31b2e7de697bb92cae80a1aa153bdc0d62a3217bc4aaabe91f7ef7c5068465e7a2a0549894d310eb98e823f64709798d9249a926bb551b6d3162171babf7d47408dbd2c46b081a1b9f4570fca74221af4a092c28e236be8be64194ee59eb76170aa3ca5db161103f429a32293422a309260c6604402285951ff3a35f363c31c12a439b6529a73b12dbecc19df50a56bb701149e5ec54c7870b11b02032d1cb20b870170056af0606c64ad463dc2f445c8563c08aca0b901cdf7030d60f5800e42ac88948741c807b26194d382dafe23fad4b2da6217942151774765eb14e1c7c11e67b68e7e606cd3a3931b4e7199b52dc79bbd6614609d190d5c8f9e5a3984dfc1ed6a502821ccc99e2e3bceb433702e9d376a6c30d7b591eda394f92371b1936aacf5ba5a1cbfd584dc69fd296e47814221c09b6bda3ff465a2f85c12f4169b06d4fbb65b8207038fe288ba5e23d60df031ce921e3c52747d7017ed9deda82a30fcf6d3cf22db0400ed624ed99a10b9331b084d331075549023f17dee5a386fcb9b09cd1b31093ed5c887d31f6309b5d1fd04822a7146673a1198b62f132444a677f18ab83daab1db0009a4a539e662ce81ab41f0c5cd9a68a7633c065b354e8a725878d02ba9572c3c526fb0054f9d058cf2ccf001c7f4bb432bd55a145cdcf689a690e4167d752a12d51ab3313559db19617f73b49bc2fe1237662f7658bc4d2e1becc1fb1a3dbc3649c5e2b2adface80e704c3f45cbc7286496efeb1859fea702b17cdf0e58beeb4389bf2d7a07c0e881d88c05af7c5d7e73c3cdb0069ef6661a92d1165be56def080e71f594e5baae50153f49680d9d9a6288a6c2b5d613f2b475bd889ccfab09036f17d619c5d993e6d08023d52ca67f91641d8049d046ad08544594c01a7cc5c8341272690558db1354b1afc28f70a2e8493164c94123370c2267c3240a1baffe622fcc155e41450fe45a579ad623727b2dacee57b235af8130005c01308f12429e67bf0d59104252eefbcaaf8e22f2e6f0851230e8dadff378889936b45cced9f6f0a77b9bd601ac4211cf2540ea02f9c21c1636f69087d59b87361231f54820cc2377f00619608f65a1e1ccbf1b9f2c9670b522bc868b7345094f2eafd7349f3acb5527d76eecf4ea2d0248c155af6438875009fa2a47f68e018ee2f1973e9aa3a1487700f61426ec37b4c99094a8d1458d0451f29e40a75d8c335f4660869cbe1d26194f1f0ce82b4f73758b7e52ff64170e1f937e699daca815bd541365fcd8b090f2c649db707a06a5f3ae543894b39bd1ca0db1d6d297822757ba5ecc3ad9bb51eb37d578cd564e585b0f3677b5202f9f88587a0f6f7eb793656d4b44f7cec7a8efe0c72bb9799b085fc342bf7c5a4663592bcc36f07c1edd1b325e83e848dac77ec8d278f0fb653f4ce67ff2ee8ffdf52c8aa93705c434d34491440cf51d1e87c1afe6aa4f3ef14e9e0470738fbb605744f42017c9ff0cefe8637fc5064a405cd45c122bd59e5ee1932b27f9deb0509b615979c4688543a34c22d9fb442c20ec4f62001fc6147390a2d16cea79b28e46b182cec486debc3277724ffb5b1e5584a92d80a67dde3d2345a4126dacae12aa5aaa806a75b4a1f476bafa8238b0a18e63f5a50b8db7f15c59243564eba8f20db9ca0b6a043cd4410d2e7f3c6afac58dcc6f6bb8434869c08996aaed037b98f993f45bcf98d1db912c8682eb95427fffaaa520340616e529565217db936ee9d81e9820f1bbdc7bd1d2169bd0429eef2e3d3fac67a135140bf8fa1ea60f0b017efeee40d8508e15e39df6609cd313bfb6622bae3d15e38996e7f4b1b16df5ed417acb4c8ddca34d6306ac270a0aa35a12e814fc18e09c1debe9acf329c7e9f151fa6e9ca5a79931fe064b8205278d1f9e5a618f865f128c19cfaeb9c4f24e1c0b7974f6eef425e915db5a3aadd5080c3853b113ab6fdde0e0680cb3b0396fcaadcc1821944429d4bd22671ea1efd246f98e88095f3faa385df8e023d289a5366e8bac2014222dc60a96862150c1a77a4751ee7f2a05d20be64b9d3ffcb4cf039a8791205e9a7232d0e924affc820dc4d22b6ea7e7faf25fd5dcecc8b312ebf774d8c65e8d603098baa2f692abc977a34dc42e81975b569b274a87b7f7ef981e255c130bc9a3c31cb32ca14f28a5af201ce4b34758f91a3b734a094c142762550ed20d1c4945327d2a90bb3f228e3870fbee52d3e19d7b29b4983a0a5284426d7dcd9bcde048e32cfe3e479478b0c57b3222f5ded3e64c000497dc6f9a24ab1c0ae91a82db85a88cc543e67bb4b11a5c59effe3889ac482f8152605107613203b2331365e825859b7b46a7def84084feba443b4eb2316a9af0dc11d5a55ac1de4da588cf2e2a4a9b290dd52be6c11ddb8783c58afbf8fd8af113b2fbdd3853253d2206ce4a621fad5f521a9df7af40a2fa60b1a32fd128b4a415c424acf27aa0041cd3e555ecafcc492f99d1b94c39fffe00ff0427d30fb432fe6a94ad7bad465987a94ae5ed891cdd283478d0bf048bac26bb61d75f87372978d0554d1e963b888108391a607e9b5ae7afcb4c2fe7af49732e5d841f1b4d831f8105189f202b55d9e6778895950432a2b54677fca6d27b1f818c51f2d620faa5697bdf408e68db68b7323fd015c16dad98d87439ed023f228b2dd4be0f612be6fdfbf913f655b1547cb94d2481b07608266580ae3070df29a9f4fefec9b491ee8b2a6a8cf4af488e19266651ae23b304e243ca628c0b626910236d5186d81ae3226c7be4982096fdbc68c33be19544f2d175e2db78e60c90fa0cf3c5eea40e3d5dedc83dcdbf369f8f4cf22ec3a900a3e41c2d98227052571defe013e33dd9a4ab8c5ffad227f3093eee35467ac400260c2e0e7f5ff65c22285097a13fc6a0ef024d109a2533c6fef11c5c807559a0c36599acda8b778c75b680c45206f50a67208802199e38140bc3a8e8e24eca5602a92a6eaa63423342c8b5e9b460ed18eda4271c2652d8c3a5b042eaa5252c78ca22d5ab926bcad9362699a107333d73b9a8fa26acda417fa10149efb05ac6c6ac068c64c50bb21189a1aeca6450398ab838f6e11852ba8c3c1ff51576fb51719ebc0bba6b586717285c28c4af5a88c1cdf05e8cd938c297613b1751dc1b4101586ffc241bf5d72aa47d70e42bd2587a6ab486ce6c868122058b0f7c3abde5c2ab19681c650aeb07313037c9f7581443e01fe9e2b2396fdd42aed9671e73b149386b65bd2237ed54123e49ddd73690b155f50511775e6ff143baefeb37d1e27a08fdca4e2688ba3a05becd1529e31d69d26fe0db5bc3dab4ab939a167fda527f6ef8c859e42e611035af8d3505844f110a6c5dd5c8fb94996beeae7290252e98268fca734ba0021e5992bb86bbce94d20192c59c4a0fd0bfe5d6e4e37c4fc9d77065d9ceeec68b93275bfdb3a8b14c0f337b47d39bdd7a7db021ced89993498bff52b0aba60c1e97cc941d064ce7495112ca911ffd78d9b3083e0c5bfe0614da5232fb198e37602acea1cb71456c6498288b422e3b32a05efff1f9822d52c92617520fe2d993abf5cb6f452586abf9d8769df4d1e33ba8d542ba658ac13c436af22503cde2f3cbe475b1131d2fa42d7f09cabe7a2a43d125723745852d12c209099e278ac947641c500e84f5863465c515cf7a1b1a95be1fac006a034baac6bbe86160757dbee4b22125ab2b398d8ddc5d29658d76f8e683cd353567b586b1e15da0c5ba6c806973aaefdaad1b46fc2d3bd361d0a911cf5380dac1f4acdb198d853f6193e63a8ec9d78d22f87ff2a7c7eac49f02e06aff913376b8fe54697b7e93abef89512a88f7da78a1e5e0b0f2f772ca394f293c8b9dc5ad1214659382fec3c986cb7ac86112359322f591dfea8f6caee578323b64e38ed706079a900312cb782fdb4c9c9691cd834a013e2b85e1bc0f9ef5ee06d51bb22d1b6eb7249dfd35a416cf443e24ca5dfdaf09391983f61d7f9cf27e83679574222e3a27ff4ae068147c716252d69f1436a9aca294e30fa47d0ef19901142f208b8e29b2b811deba488154fbe2c40f4130ed74368d4858f02ccc51b9f080d1725319b5590476381fa90795a976b43b84458381bd108fca507448033acc8d5f5c3092aa9a0e723a08429d0f49914a152f0e34a0039f323a0e23e050e0b4128004a34eafa8eb08faccd366f199312fa66ebdf51dc0c360180ef1c871ea9e064cd5fe83368270e69d542dd3dae803277241a3c55adb7b6fb9e596292519ef05dc05db053b4f04d9e5bfc3587139d1ffffad175564324aa9e7b9cc9a714dd0e2a2b287c17e1c236ee95441f03d8fed4eb3d5960926f32445760ca23c142a952aa1041450286d7c2e398f58b021cd969823124ba6aca8c9114835d93ce2e96f5bdbfeff5f26f3921affaab24a39077ef4035973ce39e79cf3fbb8efe3ec0f6b29fdbeeffbbeff8f62105bccc425276d856b48369f62579f83a083e067e3299a8e098b59155f745cadb5d698100cc110e4e1071e6e386738c3c9a1b88f079f53e6af5831e525d7dd519e4b391d2d79947ab6db76dbcedafb556cf72d58dc7f6b7be7c6a620c8c810445c01c505c32734138198865c25e0686e97068c47982964c722c82060a660fbbbee3b4abb982eac4dd569452c83eb3906e31eb81b47e576bbddfc76b3f65e8c1b731cc795ba8f2be594b0c96612fb0dc877d1c50e9470c14091fce04ae2e1e9b7242ef27f924018c0930b030177f92d3b01a6b82d507208204529042dee3bf155872b2cfe621a721aea953ee8c3209e38f0fcd509dfc03efb5500c49ee510e7c388f3531584db6db65a2a0838c41b22f94220a0fef6a9d38dbf88e41b91d68648fe11795944f2a59c5644f29130f953b20300f525277c24f2d14f3dbbcdfc36bb8580c5b55df48c9c953a20a731712bd88a669590ca64cfc29ecdfe228becac5fbd14ef37d6fbcd6f9306efa47c279ee8877c94f9e863cc9463cfb25c00882f8ab72ff25b5b31e76cce66cfe8d7aede6edced86bf38b95159d9ee1cc7b1a8a876d7181e5e930832f2a4647dedaedd6189d64a3110c644e26a77ed6661769192fea40308c8f3ac73c9c9146c749c4e3a80584ef3ab9e9a06ea19145a5de361c736b355f1cf0b05dfc7d1762f3987d4f32b5603750d0baccb026281a348f4869458ac634f31c7715d67a2f9886bbd9e22358051a4e757a7d751fa53c76c4f91aea167b6721dedd9cc081043cc94774ce682fea18b3aa633a3f5ec0b413004c110a4c95e3391812307c7d8842a1c47676b84ec8e598eb13391220b35b6b8a14909e30347808af8837ae013e4c84a15191b99a99272e74c0d5826e72cabf1931dfb983c7e655d9765c9b55d4f7ce1207235f6b00f20a01497c5f406239da1d90d4e402fad30b9383fc00b1a174c848a3c612486256bf41044c5124f98f8cc92088e5081114041430cb14416bb29d9e289346c70f91860f0c0841a40f460c3cd851364a624a8075fe4000c4abb5abbfa3d94f42425b9fb704d3905da2567520f105f9d7c5c88d366a130574ca6631b201d2a4190b89c78c33a514a3d1ae6f4e982c20e971c6374d8ccf2ff29a5e3d1cf139849fc2ad5387ed6041a1566fcb860701c6638810b04023384c405c38a12172826b134473f7ffe7c9b8c23c68767c2b8641bd181290a531487aa78277f459129e4b6f9a10366021feb99c33b3c73b3e400968873e3a36d1b1bdc1d9e1e3a94d253ad3d7c65c24d87851f4082b2dbc0a06432cc38206572da7020caafca511ba799489d714829a50e9848b9c70a140f5b58ee8aa9e7572ea20d6b5bee65399d2ec62b6252524ed1b59fb2b50c41782a8d0558ddac6635c56109044b21088220cb471b1f6f7066a17f38cc3963ca3451ae2b8914cc20c618341c4071cd3480789812e40c2a587083cbf1b44ea7aa099c27de5a5556a9a878d12aaf57ad3bbceb287802d0f5683e8699be5e5d435330436b71854fc1fa1414a726ee11492de8e9540aec0d97489f7ec88e0ff0e492fecaaf991d5cb29bd57d47bbae63d12f95700e0188b8242b77197b262ff722cee19517f194cb30532264b2632f87f9c80264692891340e49a7d7d17d173a7d598f7ad6c66e130c8f95a5db4083e3d0af5823d9618629e332245bcd5f35ff7ff7d70d2bc2a9f3fd7a597bc20ef7756666eb73b3da2d901f21e247bf78b86ae8b00e20c46d204e43718b5587467bc572b0436d8617e6cdffbf878f9714fff37ffe53b1edcc95ac1a038d22192e30061a3b63eeec3886a78517c99d3c42155d6d47f5ab50543dea052effa3783ec5bd5843c5a531e352dc30b83bb5da8e8d523e51963737657953e2c88e7964d105f731d226fb6a764ba90dc66d3ce492739660dc7b9345ca719ca5d5ae7177ed79dd5932d806bff0cb0688e7c563859c9becc281d57e68b3bbdd4b5e4eb969619653b08dcc780307b32a66b3d96c369b51fa5ee4a31b65d61a943ccdb29806e822fb18b945449f72d0d0b33e9a32b3a222b78d9cf85823433b090aa23928c0e0b6f8ff2aaf055588888888888828a55d478956b53b3f45910c0d1111113db1a4c950d734d10c0994a026866c6624dd886e5de56e49b72796ccb19bcc9437514369a26db19e5b52d2cd1486a6521886a18f44442b3734acc2ba39ee478ef2e8f1c687a2ae30584ac885d2c4163eb880c060a9d4e04a026218544518a1e24a6267e00317aeb25fed74ea055ba25a945df04bc34c70c9ea93eb8faf58b05317140cc52f380617578bc42accc7c66485550b030117fc827db8e0978b5d441b18480b7e591181acb860f0ede3afe4020224898f971711c684a70bc80b8631e9c0702204ba27379eaed2cb0e70ba5cc0cf8fccd6eb91ccd597e527f959124f0327c8afa1ec91a71c7b283bf3d12631538e5f5014c5cc1ad1203bf6212a6cca887668ca7c3de255085561b6e6952ad6a017333037f0a5096619e5ebc5a3f630c71d2a1033e55d536155a80e51897c59cb477adbd72aec6130180c56f29725de5ab1813ce5449cd0e47ed9057f7a4293fbd5e6c0ac2594e27ecd56db507eb376cacdc6c325fd158bc562a4cde142739d489e4e3e906e6b79915df04cfa0be5fe7f04c47ddacfb0b8e4cf4c98e22f7fbd5e598034545c09cc960520306b7acef8f09fb32948b57e8e09608860edb5496a6bc3f87f4a2bee4c9e383a39cad1a71cf7b8677ae6461a341a8d46b36178378f4abdc5c43818335ba67aabb79a54d1982dea3469f4cace706fe88e480a48dc8ad4675cb2de6c945cb2226524a7a9d8365b8f4f2fb849d8a80d09c7d1a7b65f55dbcd66abb75fcd396ff3566f1d56c17327fe1659ca8dbce334d4566df566ab664c19c7b3dea654a47a2bcbaea3b4eb68d735b6bf2aa1deeacdbb3df16a6cc23d829974fdbfeffbbe13cab8df2e4309d9b1fff853565b19367ddb54b9ee3a6e8532ed4473a2ec2826b7e20e77a2fbbc7cf4b9f3532c7fad4a70a7ab5d3329282828882e00c90502ea3002cab8d3d5835ff7a284bc1cc88b88b1841645c400881a90bc70855f784219d77340dc336f2c2d145cffc13ae4fe117bf8eb532c4c3ac8b31dd493c48649c31cdd719849842cd0413d1d94742aedf03c10f44a20e843c702af57e82f485cf437f8ff36502ec5b456fa62ccdce82ac6a3aabbc6766d5037281e2b363ae09cbafba31cc7712aeb4d99f2c6c6a88c2aa14d7bcc34ab50bb5c26e93462a61ccb66ab00b3d5adc6e9c10a4af4eac74c798be105173db0b0a64cb62c062d83ec3885222ed9b276590d11426e8024e8e522e7ac6f631166abc3dd1d0a06fb6ea2960e2e396f227c71c996cd8cd33deb59731ca7a2b2b00a020471dbc5f09adbe063b1582c168b597b2fc6208ff1e6c7582cf6273baa5a053608e9c105a405c3a05282840cae24216e1193d019233448e8dd86902f5ac897304575603ac91b785cfa7192e7ec6728cfe439fbf1c91efb55cb2cf8f8c516d233dc3e3e0af1a1e2ec679eb5368cb0330fcf197bdc78ce12fa4db8654fc515d98e0afb86bd094586c044761f21b8eee40f37d875ff4f8e74ce89b310421ebbd80626010b6ec124b8d8063e8db38886c86db918e631056ce08bbb04f32266b9d889dc4e3aec44493465629d07792c766a613a9171e206365cf17a2742e6632c44cdcc829aae6fe6fb892ee4c56ddaccc79a15dcdae38d67721601cddacea9bbeeaed3118bd54c0e421055df5437940d15628c378a25b7185df345f44cdf549fe4879ee86531d971cc9cf36b2dd700e76a7cd594c98ec118bab61e06d2895d7742801777ba7af8f87cd8621f107b3d9e14979ce54d5902f1f669cc95729a26884bce92f3d20d1f5c1d7ffb71b3ff7fc67d4c86d92b37e7acddecbad9756eebcc3674958e9a3bbca313c9aeb1d8576be6fc6302b326043653ec2eaee2228c553438e382990cb9479972a9c3fffffff8033706745fe48a6f7cb2547145e083274794370c09230b1719c507209a582246910d2ec73b3c31aa5a15cf994fcc6958d9288524e8c97d48751fffe95716f684e3c6cbed58b0e336729a161b371e585a09d259cc94e3934876173844b2bfe8313a69958f7cd646a82ef2d1890c65bfca7ead88640b316b25916c1664c7611b71cbf30cda9479bd5e2f19eceb6badaf570c38fa16a1277aa294fedce9633e9d4eaa533d9dca210ac801e682613651e207249e7075e2c9b6cc8b7df400b4e4907249954a87cbe768c2c5c5c5a5dbdb0429b76baddf72c13893c96475a8ca66b3598c8f3eabd9663413a4d4dca51f8f8ac89e7efdaf157fcc6745d384210dc30fac70e30f3fe6268d0bd6cb8fea6151383c72e68e157c44a0e2d963f63e2aeab324c6dd1877b587b78376771c56050cc47dfcf88c1b95dbed878d8dcdcde6e63629d8d8d45a6d12903d97ed6888dc0e83e2b52f92d135657018668c69148e9e1bf95f50b98e267736e338eef683f38f0b21b7a5566b8749708b830bbf61248ca8399280ca8e614566eb73007c40f198320c98292a3d7eca4d99521b6a29c7319ec348b91d2161d884c4a846d8b823a4d6163261230c0683c160dd3022404e875229870f9f0b31dd88fe77d6924be79cb1199bb16eae63aa6e71b8b4e373c3864c19ff71213e306f87396cb65c666b25bb8ffb309d05454664a72ad6ac620775cc7d685cc8611e2b12abc0ec721c87f222304a4557ddf050b1686a701f7b118fc142a852a54a1597e3e90e83c16030180c068395a2f0b8ec203b4fcfb8f7e189f1f7b15c9f6843c8137b201871c71578f89833671cefb08972c9c9e3342ed0ee4163b2fa6bd76960ca38aef5ebc32ad9b5c3a79e210d32789ce4e06c31032a78401b3c478e1c3cb345332ab37cc6059d4d139786c8ddf994db1862d3962d26ab2d574c4b3ba62d77e7a8aa48760bd366011d1f41e0441f3d3b3cedee3b1f915e494a4a4a4a4aea19478c933aebb2a89ec1c80b6a7001e9441e300757876370c120b9ec0de428ed50d3d5a59c1e3b64d4ba9f821b59e0d999493d5e522099da2049494949493ddf0f6c409bd5cd49bf3929cac1effbe8d7fdd940e2caf4e082f8521bbaab464c6d7c64c275b82b570cc390a3a51c2ff98573c49d9ff27023315d30954c9ada4bf2ecfb0fc39e32f6004fd48476a2ccd5cd7fb305e260529a8d84c4ca091925217b71424642426df4f22f4256680abd4a2693290c4dd8d44957f4cc0ec89e116d61c59429ed08f1154d86155fefa06fd05af4ac67339049336144087e5ff8853d65461f757c609ba292b3d46e546c369bcd66b3d96c369b6db4f825dbaccddaac2d35573d8399726cf3511fc96c4795eb3c9510a30f301bce7306b932646f34becc91e45ad189dc9db84d199806642abed0b98a433dc64cf59339243bea943db19dd85e2ced17b699d3bc874c1f84985cad1c759bedb682c4fd1d9f4e2b5d62350db3aeac24f62c4709583769f6f33c7b4467b66bdca675dffad6f6f3bccff3663318e86095164c5cc2ac69a19e7179c1e3abda84f2b12e13063bbc25ec826a974f92afb4c3d03d0c435309bb347641a526021cafa0549e92c98e4b33d971ed1a14e64c0d0b7641b9eba25aa86b6acf38ae7e3383791a904e40739944180a98f00a5e1149a0e3d22186ab24ce4fc5e01212ea175c981d7e34c214976c2124846472cc640f912402d3b582dd0573b87d309d86d90ab1975a666be6cfc3add9311f3269bc393a761be6ca75c88edda76b72b4004a9071cfb807316bfa488b53c665478c64c7e078649c51e45e4109afd01feb2ad56e25b35d30472466aa85ba5c92bd057d84f68102982dc72f2817940d540b0ae5a99b42c6e26c913065dcc729e32c18432121215100991c67cbd47272c916c2e1b1828f2dfc78a1a7242434f36200bd654a8338941a8180bbb80f7bb6ab9cc5060872cbfef9f1dc8aece5fa8a795ae056389e3a3d92948ef93c32c238f61d63955c2cf6de3de9aab5b6abf600422e8dd53b66ee6aed3affff9e51a20a0efb799efd40775dd7759de7799ed7d1cffbb0f7799ee779dff7799ee7799ef7791eee58aba259e8793a683a2b47aa28baf9920333e53c50c37e0b5cdce9e337cbd9fa2736389e69d8a6965e464051380946aca0a01a54fdc60fa7ffafb5a4c2e95413c68b3a1430c2d1e9549fbe026ae6e80b98ac9e713c4768e9e061dd582c162b46a5a307cbd660ba8395abf8c5ce5a6bdb72311c3a08a96c2d89b6abd687602194830b8614a6d4c27085a5524904d23fd05c30b898e10a459bb7b6ab96a5c47d191d717e574f51d4eebf7bfb6f2d4dc7073225ae528de3ede236ca9b323e4b3b4618e2921d13caa42db243031df11d66abf3673dcff33ccf7b994da35ba5c2f8ded2766f55d8e2c234d0af7a8438eea6f4a8cf869343796b8b109694f494d27ec17fad569b2dcfd47aca9671a94d0c72f8c845d73c0af016355c0bc2bb6bb5aec96adf4f690e1e2ea9faa7949e86c26845b1c10dfa4459966559e278ca7167108a3a8abb1e7305e2eee6c184d25cf59c30579386c38d55b3a68be089e7ca84bb431db98fc98eb5ce29776511c8754138093128c2f408612880812421bf043317883be09257008a24c09f12cb2fc1cc55c221266f490c95d058cb5ef66436813253de250d49942028643722278662b296e9fc534a75f428cb5aadff8fe33417a7c1bea4252d6b7022dfc873e633cb2017725cad2aec709d9665d16c85b979ccf0959fa65c247f29f6d5a03efeffe3244788fb45e550634b3a2df3f81884100fa4040ed98504396187ebfdd669df64ae7e3c14b3c53deda33c149a9df62cf816340d25d22316a4d34a3a64ca38ee50d0c9dce0f2007d49b798328ea5d468a5159be8877ac671a934f4648e4de60865a6be7c5a141fa57c28fee652bcd6388adc51d09e2861459491d32ecd69bf6a6bafd33a6badb56f733265a0e8998f62a6fcb520fa7f2a9e0914377826548b2ba6284b22262667c5b4b34429a575a47d59de40c11c33782f0f2b7706bffbaaf775a75335a1b1eaae66e3536e6cc21ab773ceace2448d4a9519c48a0c71c560c48bdbad4950133fa0e29a4631982149901e60474ab866a8d88ea05184c3ec07ae172cf6faa11cc771ff1cc7fdeb050a01c3768528181f200e710876ddb582b41bd9310f8464516b8d51d5eecbc877d68a0deb195700111863b860e8cc20728120cac611e058a76b5cdaba50da75363eded44c19c7cf42e3543956194720ccc7d1ffd37440276490d011f9e97649ba4de434951699ad1f85827a38810d479fa94619638c359a89a684c97944426aaeb05cdc82aba0c289db7461e8d907bfd0545ac137ce725bae0db185e5ae984a21f8bd67bbb2a85b1a2452e5762b21ca73178a2da5d6aeeb56505da335ec6223da90b63e5c212e6aa23c3069ac08e6aa69df427230e5ab6450846acbd99111cca23a571a6e0511c90646464d33ca81d18f175a804da11935cd681cc7ffb7229cee6ba58658f700b33f21a55d77c3b1f3ba64ff90538dfcd3989c355cb91e5b94320c9beff4d46a492fd004df4769de05f4bef3fbfc6b3c5ef2e445d7856bffa2c5068e971b3854aa71bc7767629bb188c3da1bf7be9c4e2e18db105b06aeecf0cc9b148292cbe112f6306913904b2ef74a67d4e470e74c8629996c19c7718fa29d3916ac92ad60fc541a976c99ec7125b10a177ff7871f65c22c288e7c81bb256cc2423021ee1ce250b91efef0cc2de4167b28182bf691ee1c24ee8dd3ef9c1b9c92cb2faec08387eb92c97ed5a19c1e3e8e000935506e9913f958ca71e165b2eb2c39c4c4c4c4c4c4c4705c4c6771496b436c6a228ba778f3292bb2ffeb5726136ea9f9e6c325ec0314613c13ee1196b015393148e879c20fc946b6d1e192b384e9d1a56f9e9fb71f376559d6c73f6e601532980c79c933f541b6ff39c1309ce10c278fd96a99292ea9c2096fca5287d2ec1e3eaee6cc9312e0751f873d1ceb38be71cce3cb37655996379506ee5cadb5de472a9f284b2fbd2ccbd92261b65a72631f9d727cfab955857a418d1fccd61a5d639798adee052257c5715cd7e5c8c195727af8085f5cd28732a99a47496b945e8d5e22bbd0b9fcc10b3415af7a5ea861ca4b0747fec49b38142f69354479416186df889c18f2d187ccf8ff7f4a69597265290dda4e4f20721f7b0bfe520e0773029122a68ce3d76a84d75076a2ef22b2639a94c9307b91ee6e2f62b602a075a8640f7874094b12000405d314000018080805c3c18050402898ce5b7a14000b5e743e7c66429c07a44914c348088218640c4486004000314486686aaa02c89f7e81cd2851053791c960ccf1ad9b54026f96ec7e5b07bb2d3d592eddbe1c803e2d238c60c537ac4f6b0afe46930c27075d0641746c4e77e04e1f45040b252409390a44c30b13d1c1182724c01322ba35680f845cdfb6a8e943f70e97058f0e1353a48029fe30b62e349a3bd1be4c56bf2da7b69953ac1ac8f6937394094b508cb1da026f311c337bc24c8d99e27c8b7a889d5ba5ac93af63203ecf146572daec5080b4493739d758a4ce4702e46cbb3f6a4bcb300b41ee8242b5e45e2902765cd52e3f915375d7592e8a22287995cceda34cb9863019c8cf2b414ea5c549d7fb492c13fc9093dbdf7c21320c551b729d0e65bb5de7d7ce542d640519cfd413ed9bb160a7222d7116ba09195a3ca43ee0672efc8f8ba6e3d8646872923b83cd2829f22b0f56ba758c8bb4328ae143aa2dabb92def9b9b89408f8a3c20e4f3184e7f1d12b9cb63be30fa35d1eb8c0303f8c8d9fc69535083c3f395e8ee7280e13a33a2d464a8d5500bc0da225890d97c3f4f672489ddfcd5b77b26722a5a3c37a7e0ab707ac458f2b5eb55ec074a45b9320315f645b158389c7faecf393318789121ba9a3952e70f595e667f88f65142d3314a3d761d9479a232be199d1c42ac57a61326871baa125c97bccd911cde7b82b0edf131ea6f82501a2af2a5856e242bbe34f6221a49a89ccb475a074483fc6fbd61a5cfe02a4fa9429f49b0f75049c6eb129bc2369c1741bef0564fb0253aa38541493dad7f4edd6b93be0a88d1f6efef51b930d372860aa9127a67153b193ddfad3f56c6401257003c1f9ee20300d1ede56365e9b86d43d006a75adf150f4f2b68476c8e744a865dd896e108709fa518d3619f448c5fe7c301ac1de859c58fa984c02e218096bacf8aa956fc0fed00bf13ffbcc591cbec320a35bca3a0035e578935b29f91b4dfff77781318ce54204d915c5d250fe0891d102c328a81e17e5eaa98973b82a09e38027e3b08abf20e0b76a84c1216cf841594dc785527643f9fb2dfb24e2667fd5a044a07762bda109c79e052f6d084f3ca5d5eac8d5c438e887da9f27b69b300378accc190f1a38c5ba0334226e3d99782e825af73ee6883b9c3e453269e8e2063a310ec82f1420097c3464a102e081d07947a0de3bf49f288f57e95cd9fee7161c5f8128f1473ae52663c08302e58d18382570ff201b46fa0ffba483758ae6a30b2e90bf48420ac169933e5adfd40fe5a519e15b7427868f92a3430ccc32821f32641766018072b26ebbcd56ced3ed83593b603f449e1c49bd7dd6db2d5c7e6264200cd81f39467363d9d2e30eba118f466b8440a9c223bc5b726b428e2d67b64f7b5a3c53cdb36607a6bf5774d41c0459c2eeb8b469de48c77b7009702e51477ac00f2322406b987347c870c8d3f0201e489e29a19e98e13ae279e5227c011f5086579c89bf789d23210681321bf7da87091e41d7bf38ceb2366d9453792173002ab4a62e94ad445da5add21f4a403cd0347daad5c7159510ba0dbe79bf44bbf08b49da6ea76fa9a81c9570e9c60cc79eb92ad151d697bfeb0630da5a72815d929a75db7e3564001d2816a82af67b7b369d641b246b45592e7b3e66316c15750757b67886f0e3bc61712b8227aa111392b63670c8d74b4f477ab6d5bc4742fa8760c0ce40601b03b299ba4c87d141afa227947710fddb094b4f0d7ca748136874e6a7fd5afb60e5d395dbffbb19cd9358df14c8888246f16640dbfefecf2e1c9a14d3941930a4f80ac70b9ac71b194dbe292dc0266751a6cc6053a665602ef2cf91427676221c1164c568e0834af47030e7490c134512890733b0e0c7c68a7b5ea96e0dbdeb768af32b9bac2f6fe0f9e974d58a3c66f2df5fe561f1f80c4b835c1245b5c2a7beb3508de473afaba089ed3ff49b684ef593e113ba0205b0bc708bff0050677cbc3dde7fa192b1a3ef4b531b1a26511c1f2673e66b57aabdb765a2ac36500082f9835c78cb4638257cefaab79953dc1763e046b7e0984571a8253e84ad4023a0701e53295e37cb2dbe05fca2934a7a569706de3c045be1ab5273f29499bc64cbb82a997f1f995ccac9987b3cdd256f357346bc0dd93b5f7f540aae2c5c869cf04ff1fca0aeda48517ff279ddb3f9979fa4081320783e0013fa4a4ebc2901e246b2f5707c31fcaf6a9869e746a4926dbe636cb158858c9db25d3b333d16ab233b6a4000cae03f98c0413800efc4c3b2c46728d81ecd73613bf6e6b77a4609e108b96f02f6fed42ae3350285421aea254613c510afaa326b0af2f2f738cdf5f44f9c79b0a6218bc66c6df8d1938a2b525e2b967d0358662725bebadf552def014c1f65388a69e6bdd5d9b6904ea930c65d4f3ebe06f3f712cbd5f336a2c57a978cf3b0da0bded203ba5bcdef7cc95e1df2a9f395e65f54b4f1743feb515bfd0b39d00b6a3b0a9f7bf403ad3c83398d9141212228819c25f0271116ac8437059551518877439f024873093578846fc079a2314a9e3670bf0782c841bf15218638b6dc929edfe7e764d235781325cfc5d52dac51502ca584f3b4976f4eae4bb875c7c9f90762213eaeef6090188d2b2b95e274eaba50b308c8602908e89546bd90f47443e12c094ae611dbf39194cc8d621ee3672a2db30cbdc17ddabbbd7a98e6fb035ccb77b6e3ab598b35398ee9e11cedf4f5a838eedde2358d1a47ae3652c55195636450d6552db958680abe9009e8c6adfd2d7e9b5906e7406a4f81fe08b68f0b37ce780432cef0f34cbbf0bb8e64ad81ffec82eb2b9f7d979628d50de39cb53e600a6c2305ae7c4a0d1bcb0c72cd6e770b31a812a9a110aa5d70515134bf2dcb89a9b4994d74ec9eb18e83ffede488fc16dd47121304db80c7c0ed9ba0b61d4778e15e98948992819e41ee15c86de1b2489cfb09c189fca36d05032481b0acea0bc73489c95824f8fa5b037b9c883e02fd4cd4460fce23aaa381fbfa5999330b53bede496c6b79073024476b8801b9cb3b8cacd220b4200ba9209dc127ec77a2d627346b99d07cd9d15accc4c59c1752f7bbf6de492de2ed7754900371269d9a6a7a04b27dc1a25ef712ac231463a6cbdc104f13dbd43f88f66e98698356458b16ac9a7d941e431c2dfe1cb0d83bd3b408f975201b7cf110fbb971dc3ba464b16865d244e2a289c39268423f3577e73488f838713395beab7211e4e3153cd36460be67d75fcd180fc5b90cc271caa131dd60dceee977de6ab76646f138966d9417dd732adc13b9177e3f8a1d78353ffef9398a9c8067e32a3fac147b17657ff9aacafff0831d27ff029693889863baa07c6f1e2042c4753063042d1d21f1912d213d4fdf0006bcf1404e6454c837b8e7d17a6bd8987eeff8cd8d0e6c77e7d96f6c07c0f69b2a2942cbbfeb6e0035c989feafb785170b220683ee881a8864a201aa7bcd27cc00728490cd8bd27cdb2e849dc338496fa8aea8cfa8a58c0247ce0f25b0244a9cd25d82e91d495b17b1f2d6296a90e1ef3db6fd63520fd818391e064ad553dc8fa43e65ec9c8025b898acf20a8ee79741825c6fc59e1d701bc5b8c29386d04027f7fddea474d5b4d27f34f4bd941c5c6e1b6758f58ffffb44039541397c4bcab33de1753e2b8f134164b0e6cd0fe9a80af51f26f4539ff402b4704010b9b83b0fead40742bc44fede4ed025d1737ec6841be874f5a4cca7ecd7861da22fc1a0c26259285c4b677f88705657f8e85a41961016146462916e0b9091da1d591963efec456f63c6432a88f46a3404e50a82859acdad6718ff06e22e6ee71368b1d584eef32bf0bbb41532fb3a16b088bbfec6d746016d2d0cb6069f3f38694175750f0a14a00ca61dad4b492c12ef3188de087f10a26a8e39246f519ac6b7d0bfd0496071620abd6b6c892a9bfe0fb3ec8b26713313d3819fd04f3c81dbd734ff81a0bd4036c480858e481c8036804f509fc5f7cdce76acdbd8ec279b4bed6a84ddfff14388541c1786dd4f50f7845d46c208edda443e0b94f80d255ca33f71df9ba129da81595e0b6ee73dba53bfd1dc436c02e909e819b2c108fe295004308a3c4ce8cc4a1ae5346968915116d5ed4ec9233b1c4520f3e5b4b47398b49524e76e22216bca1536a0e31cf2cbf3ec097a6e3fb3a21fa09cec3da1a8891d7535941ab0f8ac77527ca271e49f9dee15afe45ad267862d263facb3e8457711911e19f6d89f36ee108ac528b5e17d1fbdd8b11974b0f3165ad896c3e9583633590e423f72a401c78c165bb7f8270cc1b53ff005bf6fda34358c8160286fe49dbf6447496c55fb5add00ba0007e77243a2911311d04fb46c807042652db21a5d5f8051bd50d3f657cca10c5690166c99ce986d452d60c7d0df678218a4826464708768e9dc48166951d2a654dd8fbe894e0124cf2419f6bf60fb6af26c7716e27a80549e17b5bea5854757f3ebbf5aee301c748d7f08bc80c36288a021a04b00c3a0b338ed806c5b7c93e704470cd3f5109c4d6aa848449beeacd55dd8ca83720819258cbf1ea51d49c973640e6b917818edff0ce97ebcaaba3ffb47eec0a36a8bd38c12eb6a273edbe1e1e778bfd4b2be0df1bef1adb39ac36fd86eb6ef6fb54be7129d8cbf500b1bacf0318c96a1c19446a9110b26a7865c3e13abbee49569aa23c6d29d4162f3f84afecb88464aecac65d180bbfa282dae56d4570a393f215c37d906c08a449d0a334b1932389c181ebd2bb6452c59bbce711c721a410660ff00f6789556630da5fa27732c4b91962b51db7a46b598efd9169d9d147824a1f6a875feca72e7a7bd9052c7ac7842924230c39839d224ceedeb2fe2377096b554a7a8b15ffa7884fa6765cac21a4420b67b24ad7345338dc8a829b50f9408aa459db8b2479b13ee79672511d900271e0598aa993a67db2df9ac4371f335a0236425941dbe36ba05cc39a130c25634985cc9902905a0dcfff19ed54186d415d6478dc08bf7a90fb1ea0544eaeb299829e4140dcbf9230d9d2395eb496d4b9b094fbde68bcf2ab91216f133ff565937e2b4c2d5d87ab64f4fac71d6f028293e4e95950d4d8d0a1d19ecf929323a91d71884ad362a6ce88503ab6d0889a88086eb7c3040397a3591196d10654981affbb411b67410d87bbf139a5226187b33a14a1a24fd962a4185ba85a3d81ad526d96d9001578a73e75b55e0a87bae1528d841a783280b3f5cac510c099335b057429d3195e62d456cc61e5615d26c1175868b1ec62c3af559379bf3b6dea43301621b9ed2894d89276e7749ebd293097137bbe4d6575fbe6f275d50c85a720f2ee0a67f546e0853ca706c3e977912ed20dd054b004bfe3fd9d08abab001ec45e5a38c0933481c87054953fda0a803e8cb1eb592d429aa698a25667500b91dab12a36ea22fc702add2891968e1c1e8502ffef93709373949e8f9924ec7168fa252dc8d908ba0b2a8a8f07ede0cbc3c3e5c53d5d350cf3f6bb60080b35bb2a42bd1a0d666a4cd3bde1d98653fd5646757b405d092c01ac8d9cb9b6dc3b729b950d7b26c8aa8539285e4ba3debfefaa56be0bf8c2065545e08e4151dbe56cac3250cd8d0a97d33114609e7f94d7693d0442823797425800f2484cbeae58c9a217a081161f29745d18ae98c29e016da3d5212f1875b64dd2bb411fe4c523921750ade3e2f778b11023c5c811c4d07dec40ee8c6c5902e9638820a63a48d96536e3d4704cd121756b93218783b2b9fbaa470e0f92b5704354e07a1bea1098a8c2db697beccba596b34b408bdbf8ca6b04214579173fa51e26b9e40707dc4cc7a9d28e72082fa273e0c7e355959ff7e5a648e98ca4660abb9bf73eb1a3fa3a08fb9a9d91bc2798eef2e8c8eb50976afb008068b9de0eb695151547666729d3952cba025d2aa214081ccb5f9e4b92336e985b37c0416319f0ba952ed917786e903aadb3b9a912b6cbacc5b9e0db71d42993c6b5f57327dcac7cdbf43f7e9fab02e3bdff3863df700ba6e6acca8333c426549cf6f93da58c68b3ff740a883c6f665f1b0d68922d6d6260c390bc353b58084ae3feefcca2ae6315f90d82e64d0a073b162086c1c69fe946764a1c48a16f439275d73580a62a9a2e629d788293f068871b17ec031151054f97e07786ec4c3092604d98db07210558ca7419d34c7a4289477c492a550c02155d2d96e1e40cdaa3ef44e96a512146f6d437dcd218628f032d07186ce4d7b00164197d3edbf190d7b836f019b4bc86882ef9d7003da7cb54761bd3a60e4506e75adbf333844a60ac8246c3bdbd2150e3abb0ee789ad1b07031a3d04660bcff96a8838173ffb304eefbbe06a3f68cf66bf022f68f603d0dc0e29c373b475d268188128b84fe6378582086fec3d8cdc0159ee410dd9a8a966b6e0848c333c113777e3bb6854aac88a2e486d0652537906f5409bc91e1e38f82cae75dfd93867387d34b646bbcf1062e2cce397899639170af4f09ba791579d9389cc8f770d8e34c8a5db809b78e8757e616640ed56c1e4d5cae93927fdb8a5dcb7c45fd5fdf2ba830ab58db0660f679af7e344f54a6f08a3a91b370abac711cb7b88cabe7ccbf491b9ad3810ab497007a7b54206bff5b65113e429711045278304a508f26c437206c9cc841a4585ed82211a3bbcee85664d68b241d3fbd9232545b8265de12ba119e4642ea95d4d31af264538c2da040aa58bb6220128f34d240d64a9381db1a7dcb3c2e93736c6775035447b9c575c07bc0822f5dcbc189fab5250711c518032e0df18b585501bd604e0664a9397251b7e1dcd75dc6ef1d01492585223e624dce889ad98c15c92fa83fef47551f3527c15df57c99f122c0644be3746aec42cc23ea20a98d6d4730bbe099c3328fd0cac04c39d4cccad6089f86880022b84ba9d926331b81dc0e15bb01233cdb27be8815377c7609dbdb9aab22a7eb8b79b03484482d5d084ba9d302099bf407bb722ece770a679c39f9d6b43414566feb1ee0b09464e5d2d87335eb9e24955b74b076f1c219a66025d3b44cd8ac06184aee8b53bc563690f8bd0cd5aaeeb418779a7f0b1500ca823c4f5d8faab0ae276e3c4e8242c0f36e1f73a6cb76078c1ec7226f4a260f497af8c6e038747d4d764e7ef70b423c351bf5878f08f839f0a0fb3ab4abd196491a331e7d480a9cff637dd0591f665fc937c04e09d124e336f92b60a19c3ff7541c10d095b752ee1dfa9502106378bebf4c7668e2b8742c494c65d63020404ad272d2dd682c1c96b229c73c7db6459d2c39288494ada0714dd66688bab3bec76282ed72e886b10a7d4f480c17e0ad53e83da16be9b329e7841555ffe23b786b9a7ed12bacfbf9d050aa9b9bc65dc907cda9a8f53787261f37029bc45fd127d548fc12b92746faee9835b0b6f56b96ecfbce8915ab20f7e2604a87f6b586166c0f94cfc1f2afc20813f3d6556f42b46d427f65b2e413fbd727800628b0829825d74713a8a721301e0c0788dd8c8d658df8208fe8f92358a6a302619e37d84de2a5e3018e39a1da91d4ce17aec9a5a76e4e57bc8888a29c1b13e8d420d3bb703d0551af54fef98f12ef78b7402ca5bd825f2d0df5690e50cc76a65689c9e72b2294d86f911749a21078a89d59b0731310783576d10f14406ef4dfba6c6f656919063e4f5c90f15083cf86cbb68c6b56909d740f147492526d92284816f8c831cc78e42ea2a0f2d385ae4682a43f695f11dd7c16807e14975ac9f1abe1faffc4223487bc64e0899158b3b3af9bf2c10438422867a86e2444fbaf2a4601de91b5934cffb870df997ea64047ec2e671dabddb1f284f14dbaa1959debba21cee13bb414f6d0e4fb4f40b6ceea68743bf414ca39941cf3cc65df9d6c948858519205c9758a48d6b6a14080473af653e61d54e9c01220465b75fbee7fe7f5556bbb9fff65562eef16f77c6621d37d3022c145e6187916dce693b16d9995fc5e667ed5d97d0e3891101ea63f397a25a541a322cdb4800cfd5b9c7ddcf9ca3f5ca3cc56f99ee96973c076f8237c2fec4aed905c014e51866c6cd5cd41cebf392d38d850eeabc61c9bf087694be628d2ab1a0850d8479998cf64e36fde841bb2b4358b285042dabd1fbe6bc315f1b700ab35ce058b5367a2e1a4d1e63be4d44df861fbc4e32218ec8c9b44ad3652e8ff28c9097586e113d00ed3400880c2fd002dfae0a2b517033208a9c533cb5e044174fad61a89caa5f0456970804a17062e61294a99a6e5937a2dd26c1a8294f30845cd19e4f63923743c2c69d9897d16e3e999c3092bdf860b0814dee6acea2d88002a734e3fddc839cb7d1350e356c60e455039b69d10f25f01b4ada2c1559ea40cf8a80473d4fbf870eb6386f481d2b2f77fb418ba89496cef3bd4e2f2b1474bdc0d6e3c85951bbe44525c3d4f49c704d9b45a3fc286e2235c426920331dd09145a71acc5c044adddb1911f63eff5348fc93bae10e8d175ae93e9287b63f84e3731110810d66d0a2c4799d5347be817f3c54d24c5dd59357c91380a88a96ef514818271a7c6aee1a1037288e986ca956939b1f39b6da6c1aaa546c8c1f14d15b46762c56d298519dc17b8a0c5ae760be8e05b55ef82088e56b0f465ab5fb4c8b83535fa7e80ea36a9f4d65997ab5b459d385641ca818d311ad1b412e87746138177d9389d7945a769d7b662286c018f97b3da964e1d2b4342d8376d1c4b2df2b94842482adc934226cd9f42971f9ae201adf996ef175d12b0bad7f89a280027d0b3e6af0be8fd9e97517d1b3c6f941d7d006320d3f5e2f2706961419b2f8d4c492a00f1bd76ff2c282e8a8112b7cbe0a789eb672df5c6b89e6df3237dd9e8380ff19a265e6b584f92ccecc1ce8a25cbb9169140cf4b1a8602f06dd5a674d17d713950b20323d6a3cb87784ea88f84b28e08d455ef917f786f16b1363d2db1b987435d90d76252bbf6a7530a88fccfadf1dcf4d6fdf4a1c6cee1512b7bdf5e345d0215fd1c301e9ce056a2aec51dcf5a185f5f4c882a99d50094ac5387e6223ae266ca194cbb284f9419b5214238450fe3f33e7c8793caf98f57d6e200bde002a3ee09124ae539a53cfa2855aad1a747bad66fd725017f9d140b28862453dabcdf61ba94b2886e2148da27cf28927d2d904af68344b1deb6bd46ca4d57dd1f759b4bd81e508a28c80df10ac4d8e9e95dc44323d9d212bce132970a75ef52986c2a115603a1c510ba2b92ad216e37e67eb45f99205a13aa23b99258212362d398afdaab965ad66cd39d69a4c6edbc0a19a7a2b615402fda922500d164fc4caad07721e6affe1b106e4ea7310bae0bb0137504c47431cb206c1a815ade418e428a36b2c326918a62f294665138bef6a8acb38bb050066eba5570f5d4f0b19132c0550bb0e1be91c2d1d2fa23c7f10ff36a410a174228aad8100d20f5bd1be17ae240ad0b12c4db257a4a98bfa7ea8f54aa805dffdfb1b58455694f5984bdf44f3285e2d4da87068c99b416ea916696a1a9ac07f4c8487a7611f670cf9a85a420032c923380b1fdf97c44b14a12538570e2164a8c5db2b988e4c47aeddd6f62862a6bca08a1bbb5cf9875778a1caa97dd289a5ad4bae0415eb2e7629f9a062a2dd3d610cc35b8645a7da24ca4953c2867412ea3901537b77157ccd7375686caf4c4fd14eb06e26b512c7623540f55955cbef834998c3dd811e8fd916eb292193d2874923d311d2c55ac47038c569a22ebb23979825341909699a18851f0bfdaa1f542d064343470e7fe2f3a7493938258e092448c891551211f6e8d646740cea0115bfda3b58e4e8219a7e7e25f4e606628c2ee144af690186f9d2b61e1689413aead2bab3e26343d273c28f442826b47c90ddf12ae280f727fea436fd938a1040a96417508acb0e5eb8fe8fe8e5e86aa6afa5683af9c62dd7713b35756b010b5df1f2c5d553b28011471afe21ea373040d60ce23a8d8bb8fd5b34d3a39142e23693a720dc6093ce6c264c70b2041c2fccab1611c88f0a5cc0903d9b65646ac1426d3d18227f87e1030de879111762cb285f8eccb9df8f705bab93635527efc2db20dc19374730185e65b1b2150d775879e3c2e97c7207b332a75e528fa8b6d72102701809f49928eed327b4659831e8d84e9611032274165fe56cec828255e9c33480f64867b822171794a73cc31991915d1725d8ff1144f9bf21235fdaad32c07d2918a17579cfaf33848cc4a8d433bc324a2aa915b8b1173a855541d9e07461d56796d8b041f72e369541db9aab860df73ef46729a6c96f86430ade953a62db3d6e0c24bd35ff743d2a45f404c813c9184f9f6f8878abd7d26da9f23571ac317ea6e117b9e28aa15e8c8f2d4d84b74cc90ec9949bfa83c355a2d5a7b98e08f062e17842ffa1d510aee6edbbb0d2c0e8345b504cfe54b7c9afaee1f03922b84ff0c424f540ca5ecb2fca60ec0b582cff1072f8af3029fd2b28c45ef055b7413696af39bfbea3b9511011d0805e5193920059509b34622b45c9be8a602d423823c8296ab70c951cf45598ad370790442e09ab8d1d19ece8029966071c84ec38b67cc345ac6a2b70db45a16bff28cb5a1c56a21ac7ba33da6012a03cdce984d9bb4db7aeea0ba650bb47b0905ac919e567f94aa0c44374af9f6e66e7763a8dd2896a3158c7178c3bff3aad05f3c468e6afc9dc84a9ce39a9a7d5a96c0a15e2b4cf403705c8969f37ad645d41603c146b505c99e5292df2911a57d9e75a71a9aa9446a11b20d68e418dc24c37bf393f47649bec659723f095ffe65121dd074b743e123384a1a9e02bfb176959e4f76991aa2e832e656146e5d9bf716afe7589f5b4d0f8bdbfc33228b80153deb15f986ae62e8cbf519c435d818c9041e7c3a8c3d4ec1e9cb0f0e0709ba7b642a1495af2d0af615d8f807122ff7e58c9d47e8a7154145a84e674a26283782b8ab902a7eebf3ee46601aaefea1c09811d1fa24558350587fd5ef8ae4432a17d358bc41e659ede7af42e511c9ecd849deb22d964f1b968d67d735e5c136e53f662c3bad23c8fefe075d8b857db372be10bface120c0cff68bef08b23cdbb90544798bbe57003bf53745687c68a7409502506eebfdd7fb0bbbe02d27c82419d7cec69e69234a320f69f5c8b139e45019f4c81941966cc9a43ca3dd10c9cb53a03a071d4ab21c19394ac4a03074582be387f219c8b45c6b63b187b7f671835c3302ae6a4df43694c3a042eae61b510bb2e626ee0425e01d3ab7a6f5d13bb26337145a39ef14839b93151cb76ddc11241db222dc358884a94952fd6b21c8a9bb32b1d0945feae47fe9ce637c8c18987f23006cf08319ce4e285ddb022c5d744e53c121a4ab8e0810176d56f21a8f39bb7397e8a4f456935d41a1e29069e7ccd4ea7c0dcb112705e0cb83aa85d139af056da0e3884c5fa9f267f2ed27543932356fba22466860e5fab409013f6fdd8ba4892e6db0a1370d8407777f10e0d008b25a0a894fe209d8748388d41e8aefbb14113cb06ad9eb00fdd6f1bcd703c9b8ffe6904511be479220bee7ae2c0ba7b2e4c717c6ce75883d56df489a7a1b42dc770f64b96bcd3b46624ff992969efca8b6633539a1f865ad36d5a345b0bc249ce1d184725f2cca2930327a343e170e2ad2d3e4a132992319dfab2c4f733bdc63609909130b62826b380966dc4ea394f5743f09fe9817e3e1e2ebcf9d66cdc7913f135e02a8757aaf5f284129e973a8cf44cc2b204ab4fdae7f36ee872149b7db4107465ed0975d08598403a395c693ed41ae1f71bda62257d6d0786f55fdf748f21f7ea9819c13ff2fc7319333f6a810de3030070fdb665d535d88877cc8b4d0bc32993633eebfce54e47c27779bc543e52eab11c3ba373ccc72db56003e87659236c05d8e41972f7b6a628557462681d06ea231690c01d1014b36f30adae8dab7e0b5ed95b631aed20dd07d5f4f89de030b765e9e9d8dd7758fe0e9bafbbd072faa303ddf2f71d2f0d7e7fd9a7f593aba505126ec03cb52100dfbe73f7460ff628efbd5b76eecf7b473d25a67087f9afc563929a6bbd5f2adbe85959f43977deade39263c91591414d3b5b6a01ca5873972feaa064ed0543c58d78113587a1f88f6af0e4e2be695842741e8962b9d29119f21d802c226b6aee210a4c70f7c47b171bdb25cbbcd633f4ef8136c94b58dc11c1ea09d46725621533cb37923846ced90fd26582fb1b4ff7f7cdb09ac5f49b9232d3543b0f42af2e9ba02c822310a84e290f1b6194a2248c0fbf5c5ff9e4b74d2d0851d6b2cf06a6d57cb140dacb9fe83c887a4cd9b69f737df6941dc4f8c253d303bc773f3d486b20006e99a01ab103a24fcd4efaa4a736d88eef5d9094c38eaa452c2776271c3c26c5d6a814f2f09b3bc8f029da09e6a8057bd4f556843916e0843caac18b145fdb667f7c9a39ce5fd0b629e7dc1e3d5d6c9b29d1a623c3a79c8bd3d73bad6f5fdebfcfeccc9aadadb6012295034459b07f6f74479425153ed6497f4a6973f70894f40adfd80550e04e1fe145f8ae9aeea748dfcb97e518155d3fe1352c0db31c02b0e4eccc1fa56e24ef922e6f3606742f5cfb02998d104a1b5f605688e9c2ba50536a7392e6bd1490d55e77188ea3b82632551420a74c65b179061579d4648f42f6558c2c4eb3d8883250ecef843c2c08ecd0b6b89963adc20f150e8fb0bd51c390b88f4ed8efe494279385d6c547e1512210213c28d14df8f680d6978637a0b4cb8ee9db83cc87345e0449cbb44e65deeba34c62144ffec33cc75a80d2ba5fa4767db4ba505b8b578ab1f49473ef84c1653b7e57fe85438380515759bb5fce96cb2060de215d68f1148300036faf5ac0df0573de16ea94b606012de9d1eeb35fd308e12d819c781ec9fd9229d207b2d77870a1687465509dcf57c5ea01ffb6ed6d904ac78a34fc17da7183cf1958a3d72695f25c3a623c571c689a958e6b636721ed238463a5aac3cf24a5b5d83389fc0f8c4cf6a4ef753b7ea8861e2e4250a75917381eb95bc80f2d503d54a68bfb4ad8387965bcfd3449e2834a8241b7723f88492ceaf95f40f8f05199922efae2bcc138a6a22a21595d58dcdc8ec2b0fe91bcc2e9a27ec594ab3230e0fb5134caa41e0036b94d439106a814c824b3123229fb41db206394241b8efb6a88ed6b88e136ea593075b057e574410475c92d653d23e47ed4d6c5502baf0d2baa525bf9fa73f14628329217950bf7f9c82064cef1ebe5a9544d4b7c7e8396b5622f5f740e3ddac4aba0f691177d598a48de06d31c1828b0bec7d8b117e2761889d75034e39b644b95296c20e8cebdc9c388568b338a44a2d695384feebe26b5191c49d228b0de296727c2a6687041b797b3f8b0a5e6dfe6f33a65b6963412b847e719d5b4701d0cc772bed81af7e23c825e402d3ffb991f614d0278800f5c9b510af79a37b1748edae97f713606674aef4244e34b82886fb5f5ec8821706fc157b780055aac51025bb507ad945d6a764fc59bdd7d527573e9ba4e575a4c4fc47b76176a8882f13a281ad10a515e92220765922d24ffd9cec7af1c26788f580641bb3367a7a04e4d79efcfc617b6d259a2a55b4aa8f02b296a3193bca61e9e509eb2583eeba5339881fdefbb93d17265b456b3bd3f9efe31db2ee61f64637b3b604b09d1b6620708984a44e074bf3a70080a2dd8df09003bfd804585e2bf31878ad5f706c07771fca2e2d1af21a80461c4b70a7911d42eb3f17061ab6407cfebd4e86546f1a72a1ebd7ccfa8db29b3aba394c1c3bfe132378810956a7a173980dde1be578674c3f7f0587f384f7e9d32c592fa1b4159bcfb60c2ff43bc7ad0d598839c681a2195978c3eabedf4d82e9d33f1b163efdeb3d84cc7886bba46b5018d75a0bec0227240e7deb874865427490ecb19070dd7a15971ecacfa3d66d1c5d08efccb7a9ba7238eab8a560b1a88a12564c92922136ce469c10801c66a350071990c23d5406051367b89ef52031a46bfa18ac3ed3b977fb62bc61aeae45c1003749e3827b4ed0f3d2fcae7d895b25efa2bd7efdd0fec7a732ef4100bcb990929cfd27296a7fce845fc2632091c76b5e63008aca5ffc1c7c80a66daf65c63f432f17effd5a862493c808da3d20a8fd5699f8a37319d54c423b565ee35c533308694bd6b47bd973b5436cec0b86bb0a8e94481499f3926c9c098962bef457ff54970a5675b8adbaf787cf22c798e4088503ba0cb32ba795383749b05abb85d649afde854e3a04bda6e799877ed3f0a8fc6033261a22e310ecab75c909f810a9f1d24a1d9c7024eea96be42fae58a43b1a6d855c49c22136a68d82a41723c085799362363eef5be472bcec26aa61012f813281823adc159f616e87fd1ff0fe5c3467b45b9d5df06c85eb7dc4c131b6c17f1838a6aee3e35b091c3a45e206b05d0e0779eadcc4445b31296f6c05471213c2b57abeb3252490ef7ddc135d32d87c9139d5d0c0379583f164cb36732318ea6fd606415003de064691b75f1100c2c820d516ed213f8000fc255a4d5fc4a27b7741a88a20b42b513dca5356318f071143e93cecf09fe4fdec0e99c0a65ef78a58c667594485ff25d4353888dda4af2182f3c0828a855ca9536116df7d6f2fa353ba35ad549ff5a1a4e765281f112b851f2b4678b4519e34973e8f3b51b091b7838ef2512d083359d1728e974e62b592038e92b14cfc9eda0901c8dc414131ba27eb15e1be605d8c277fc9c8324f62caad7818ac194f4c546d484223d2de3f8a2f4d15f070802fef8829570c10bfac92a9428d27b10a8f63497e436a3da05c8e2eea52e65f63f821820143034b7a3c9bd6bc0c2f9dcb0caa22b36df23ae4afa842f7bd13f0f6e02262e13c37af67719c67834da802ed53d04c7bcfdee32b4ebd1d952e6d4bdb1830e806d624833140e61fe73034ae1fd6925796f755fae94f3f9db0b6825b638c1a4c25e5510224048ad14af55cad237c1ef3706922f6f0c4dac94689f42fc41e6974d6f2c20b8d367b8276ee897ff0225f3a2793a74b3ac0e5233bae45247596ca3a5a23aca8241d9c0ad6c45aec67c9a587bfcd2e2050480a19d344fce105ea201fa104c577efa3810e6a56d7cd69a8b3c5bfa497991d8502e729914488ba5d332d50f3b8234fa84d025a03197a3d4c4a6468f17ed8d62135a55161885a422a79ca344a621bf5919fd6c0146b254583fc5288de304543f82c476781ff90b24e01d805971c5f59b33250e29adfa4e5ae838e99e04076cddaae2fdcf5c11f611a072bf44244a31e50e0329c22f94ecdd2a89e320a5b4249fd1140225956ebf296a33ebdcc873830c6b4fffd399e5dc13a5908843a0386862c59b37df5fcea184a7f4a5a78abf6b39db5f56e20a38aaa740a492695852f818083ac165ed6fe61287e77bc58a2aebe2bc02d6c90a2a30676caf5f54dadb549de46e86798c4fc62c3626b00d018851affa80e93d939b4e52fabb1660c41cd9e420f48b908ec8f8d288960e8ba0938e23f219492eff471a7e4168f31d341ae81d390036c38c4ea220e0683184030422e1d3b4401efaf4bf91719b25ce00ce557b5a9e32279d6cdf9850ef546c3667c938fb61b73d49306c4774d15dd11c76cca5f26e0eec70abb74e85aca16b47a80b929abedf5b8b092e7e20ddf9cf3398f44cbf152d0edfe623f8a813ac58a1979bf89ca8b5823d9f413e42e9b88b80c27479091e3792bf5ff7b57094c9a6c30c5f39a61f14ec0e302daeb4e97e6ea2cb59bfb2c9151dc5e7f053001b2fd7c7cd294389be63d9a9a9f46f651d1a0fffa94328a457fd2a205da1f5da557d0f6557d94d3995e728feee18579e7288977d59f8bbe56da0e1439e63efaec398c143e0008ced5b5fb864ed35d67c2697aa3cb2f937dbde19e307d2606fdc1eec9697ca2d60f05752b9ea0b0d7e9d41b057a67ef781cb14f589e43f595b11f4143168ee4cf065bc01c097d546a62fdb9a1d53bf5067af3f262427281e02bdb1931f06cf680493835a88939ab2f606226008d62a66e76dd6031f7a36c2aa3edbfe07123ceba926b796597f44a1e7422376c7a4501a905190ceecacf6804e72bdd69e4e39a6111017044678024d81833e3eee001db908e4456e53d4b3ac2b02fa8834f8d0097b973700df06ea899dea020a8ca2f6219cc1e7c9f5fa15367818e54ae2467eb05b2c958cb47d57d3687fad3e41813158a480c6efeab89d7775cfb772b7086e0442d333eb1558bde5084f23748e498a6b0418728948a453ffae1b326da0d4e181e22d1f0d0128f38ed935ef8f397bb533795c9b3d9abb8280dd2dc78ea298e67cb3ca435c6e8de5e943a086733110f25df4915f4e5b3f36fcaa25c135b705a06e27af6fd70bd84c8995375960d262bc5cc949aae2ecc894c5beeebe4dffca5739223e34eb3c7de9d52ab474130c3b317d3b2f2bcdd7f9b684bd6f677e8dab4386edda1fb7acbc461a9466505c0d72f8aea66123e8a46a98a95beffa681ab7e111fb7d6cd5755e6ff466ddb8c2de501dc323fa43fe84c703dce72e0c1c6fb942e47f79cf1ccbe9073e5759bc713a2ebb502e01689b2726f5f8efd09ddbac1292006e8da961393ca2582eee1948fc06fd4f522eb85eff1f22051529c14e29634631111026d00fdfcd41264816caed73f9894b51afa8ab06f603c221497c3b53234b3a5fd2eaa393b1d0418859452f39b0c15a148aac4de4e1320ef4c5b940b41b9b5d43058274115f48f003a220c90170b047b6b78825a0835c87230812f0762e8622f9dd1ae6736e2c112376557898c145302274c9a8063f0bdc40cd5e490f526bd60ba804a9cace7e8610cef99dbbbddc5cc4f3270be38e84964344cc6b43f036895f7481c0ab7ec66a44c6502860993539a5739da5a0c27c0745300a0ade949034358f06e1e83404610f1a505da9886b4350acca111dfc0789e39a5da982eb4ed4716ca5c45f42b932411f4710d0bf853a081d1226060f6e241536cb22728aabf1f0ce001c26d293c88526ce203815c633df06c10d5614b60fed99684bfadf67eb49274c0dbd29e25bb94f3b6940acff03455b9c682d563947e192c8f0a53ae1bf80006b36614c890a230e833080b081ddedf4ab1efd286ed93d3fb4390e344f6a8f27144885d4539bc25c3252e2a490bf076de42040952737b3188ed31dd1020ec49eeab80078a7d6908ae02e4817e541ab40d8e0a2054ca1c72cddd4022d044922a65ba60783b26d78f0c742c94f98ac2f4ab8fedaaa14355d2a161c76c27eee98d83efafa2264d1106fe7309fac372d5319d514b83d42d15703d2aec95d5ce14f57a0d3a1a7f8052c53ae8dfcab0c00bdc10bf757be6eb1af93b268716a48f73629f69a07d9750655a2f9c26fc879388aa39dd79b10f51dac6644f15f912935070f071e6a4e2dcc1aa3994987aeae2901f3b9fe9e7aaa46d5322045fc16789688b5aa0ea8d692d24acd975444263675264ba4c430e584723ae997bf4885961cee71a920eeadb2b46ef920581e8ffa7828e00b5759438e2e47b7d0569e08cdd992e2ceab722ad63ca27b4bcd200ff099cec09769471f9dab5ca81395f4d4273454b67c148460e71c97672017e33d4e9e106b2b1bc47fef6e2e1ed38dc26407cc21c974cfc9f050a4f93915ff4ba29f4b9b7a5a79f656d2c3967d80249c41d1bb9ffc633d8025c8500fb564685e35992a04abfa14c5d3fcc4e0c7f9180a00c76a02dd0e102a4d2a778d609b690a90c869e49522fdf10ecdb76b388fd52968e99a15f4439689c5837b74b3b16a8814c68c8a86a8f6ee8dc21baf6fc4184573b0a54c35d621128081f1440484f6adff219dbb9154a6c33713525e587112a6cc9e2f45e3beca7a7983274aa4cc358aff8c84e60dab7e0d8ce67829262b69a74534480ef946280f481f52527a3701ea43685d402e2731e48783699aa9fa9ddc2d22d1613b41a225d48a591ffddb69c207e2a96edce7f31ea9afff2a232e6ede2279ba237a6b9a66adffff9e544bb3825c8e2cb713a4b4c9665a5a58d2ffd4d32aacdc5b11b73daf7fe0386ea6d56d955849141eb23859d98df4bddfc4fa0447f926117cd344fdc8ca27b1472a86e74393a5805efb8b01bb5f03c64238f58e36301e422260d0829bcadd4d1b768739e0616b671c6c3e6ad96cf36e629734b73feb984b72fa166c100357cab6eeb5be4bcfe21f05d687f1477950673955cb32d6a7e21b602bf6a9637939b095a0449e7a15c322a4ed11c8891d8b4889409726dc7013fa1265b4122bcb1ce04ecd0f50b88cc78c32289700451706fececf969109de48bff974fde2900d426af07fbf234ed6e5be26430efb479f4364400c5cdd3ba545bb2ef2b5680afb4b6688975e058e9506295a51cba9d5fc701475124d4059f1330d17b6e8e4a08aad4eb5a435129cb92931535b0322daa15ee5715dddc5c6da20be0fe352cb3013d07cb1f21d427da21a0105abf1d127a5ec63fe783eb623a1ff90b65094ba7760dd0cd2b9142187438b44591ce4555cda59992c3fac92c89885a4496071ef56f00a884a443aa2b3162e35ff09cb7798d65a83e997d9d1b773732a5a56069c846784db4e10a3152e037ebb34febd0b0abd6841f8a9d1a72bc98acbe7015ee4268fb1792a0bd823900c96ac8a690bc174ebb3b25aa9f6e874dfc19cdd25d4ade1b442f5e05455b7caed7b30a67c0c23ec2a3d762db7aa9cd40e6f82cf287dd08f98d0a1ae40337cc1e5191e5342fb719ffb1d851efca62a1180edf7d534cf9af2f7f33e247b6ddd65e77b2963cbb09e98054220e7ccaf0e988d87e14f9793c5c2d0c9bc20bcbd4ce6af8409164cd5097f4141bc052a0a26448369a1b02fbf8ae95c5500164eeaa7c545e077599ca74e783bae1aab9f9620dbd72cb4e127c4ade4a845eb53f283e3c9c2b7cd3cf828a23acf54895c2d2c5921009e0913b183be070895e9fd065f417a810681108738bae902536d34bec81e961de39b6ef37dd8d25101e106c740437c21a3ccf04567fe071be80ba40984df4b4732d7fe9c0379a73c038fc71fdeb88f5fc30f1b15e370e5d5a2640b342ce2cfad7474d3995ab55b6d87b85ed141ef66597cf19c4aab6e3e21f6fdab29afcaec9dc52fb2e77d569c31fdc79cc53e45f957455e4feee9dd73067d5a7ef0df84cf2bcab16e0e03c95a9c695c19e0ec18d38ddaa15e8256c347dd2cbf32e3956cd52b140c6c4aa3aea4530b94c2ec1dd135ef28bf5f3daa9fed7286cb4bc9f5fc2a62423eb1368bac597d1dedd90bb74b61ca60f7800aa88105fd4e412efa32c0ae7e90f26e70b693f400442fb0f5f2c9599112e1e5ccd5218bc1bff1f8264769ea01c7bfff4c62b0509cffe7163cb5a5e5ecf5a3c6904f331e4a185a4e7d4cf121cd578c5e160223696a60d95801003e5c04fb5362f82872b55e28c828270de62ff7682c1c878c544061e04d22d5bac56de4869ba49cdfde847978060d390f0857f59691e67603c65ae2f50d7a7d474dc8f4d1e4816cbcba141b746b932634f9b347df30b47d9dec7d84bb0ce0396e68c7648d245cb075160bc161c7e7c81a9a8ecf1946e6351575e7cc54293963f174af2922b094359f1e29d63694d1d81cb84835eef0e938dc1e2f3b8ce890f527b68abcbc8e1e13501d71d6f110d27be84133589f9e3a68ad13284300bd30a4d6a930d6a01f707a59453037406d9a669496b25905e4c5408c6e2db16f4035e1a890c4516de582ef6f2b39b095019e91e2dee750a61251174386086c81db5d917c58d6eaa0336c0e5c93a489a85320e9b63cb498ab227902aab60dfcc3bf71e47c5d77bd028ae37c3124d583dac4a19305b8d48bbdb1886787666c3a37f8b8081a97ea4fe7a2b43f2da3b90ae00b140058fb7d249fd9c70441f3e74a4c13a1f37c2503a1922842305d108a42fa2380bbabb7c20392d3ff9af9b165cde227bd20ede93127f7b0ff9b47a38b92d956cd0d2d036d0ea85a08f7442fd4165ca38df625979e29fc2f21d97a1e80cf81a90502f0d9041e65a93d2edafcb0f0a23334d2ed3b9fa3d398f47bcc67bf42d9f49680b342b46dc5c229c51b92c7a262af30d044a63d8502611be80e075bfb4c2209c0abcb9b2648af5eddad4198cbbecc8184e6be985ba2de46e23ab4675302e34a77db7ae2f544c56c28ff3d4b2ad9c6652311efda28b190c9789d52651617c448e61d8110595cd86a3d51fde3fec89b781ac4369c9d80bad03687f209acde8110ae9be7fd6e824914bca21fb060bb94109ea0c1292e7775794d3085a20ce4048f968a313cbdb5ba80631659a6b9fd25bb545558f7a8e91610f3cd676d1347cb360c2f2f873139d7a650c83cfccdd56ba246c2f04d314b8aaadc6a44c6f9607fa4d37c75abe1b6d61fa4b00b6086cad6016c96a3366c623bee7fac160d9f0b2da34e4e5f903c74db50f8906d4886d267d1c9b413fd4e265254296a112a3c0549e13800ac910cad1129f71928698394183e9d3f3ac34a44185852c5ec99f5cb2b68aca565485bfc173e6a5d5f636d1101fd511abbaf71e9616157f643122cfab554589e6861db150254f90bf905b55743fe2e0b3b30cb80b45b8ef788e18eb643ef89eca182e81f7a311bc052dc55edb257c8a783c38e62a15714a3f5bf66f37df727253414ad92be21450a856caaf64ffbc6608d5dfad6c02f525be4fe4809038c318c21cd6e3026bf5ddc12df3adb5f5b7fa29dfbb585171046b3384615812a5233281faabb318f85cf8d7a80c907b10593413b27e02f0df4cc553d97caa3e1d067ad6dda1d95d8356f9af161d12584093ab5cf743f328976c1890c1cda8a856697534a58096edf914eeedbcaa909b7da68e698f9986e380afd893049e976e7135a9225e29c8d9d0e1b08732c2968356206ca80982e7ca30ddb6581c646126e6dbf8348e6778a212bc95246be01fd8427735120483ae1672b56ddc3d1113ae37bd167c73df60f5d530e2b94adad332b591b3174fbdedce00272076749f3158fb920585bb52b27d287e5f98a50209e38e114ba6ae615f0cf5a26d08cd5ca863422d14cfb42b537dd8ff73b38a9bdf6ea562280d161566cada45e2710922e0694fb5f62842d113807f38c86cdef35c51255dc0fbc65811a7bc9209d56c35b83aa3dcdb7b2691dbfd61f98a76128347e664b6765dc0021d0c566cea80edf0dc66672e768edb8f17a4f559bc25f337ff29b653ae15bf8b2be3f49aa752ac952f9cb7ae16b26178f36dafa6a70c4963c710173508b0f27731f083b2f4089eb35f3dbcbf767a1e2923f36f8839eab70a08361e8a96509f60a82953fe4333bdf502289448fe0a697ecf910e75190f04af498f83e6f3874b2be30548ee8400b1633653a76a5c9fa9ede2c7fe0b71bcf5b83338c26be35b39ae44bcf5942db084b2c3126c00734fde0081f293da115933c50081180b957b1158666e16b3b164f6bcbad419d9c769747954545eba7b495275d5191e57c2a1b9b86b5d6139ca9d125639a8e865f6574558209e62f42526d5204782e596660a737282261890a5cc5bae96432f60e520f81a15960c8564885f22dfce7b6ffe1bb3a40db13f61dec52b6957f956c9a72eef90ca68cf41f8511490fceb2e712058368c7c6a7810d1fe59289192fe8f040b58ce31527e6e6ccde7884a7a5311aa2f9c75b9be0ffaba235d831e6c82562bb7a494b898860b063a98e9d98dcbdb8d0602e32139956ec2bb3b32d9ac734e982253eb04ef0d3138ef865e4f934feff7da0e8f43df647b42c2fd7d8a252dea2e835e785859dba12c42e609ea7e4464cf4b43045f3b85cc881cfe12a56b66a0a95120d214ae1e7a8e8c241212c6b8c0036e6584a2f96e87183ae2bee2cd3181a08d520474bdf747f783dd6bf05e274cb5fcf64c2ba5d9d53961d8ce24be1917c234d6c4488d9c7b0e7801b48f9d08e0da780205edba7397fd1fc006cbe214ede3687125a8bcf3b50f407a501c8035ab2b75626ab7b4331471469b343b76aad672ab4cfe7dce790071c7ac74c9ad606cfb59fd79388003d253b48e8f04253835ec60c8e156610d02b895b9f274b2fc93e7fdc150e2d3e77845cc8c284ae0337fc4c3c675da1bb28209150bbde3024e58714a43799ea98815bfe34ab21f08b6c6bc4911a0182c3ad98dcfa6c5a7f4d4389aa7332df249bac427cd74bb6550d5f3ef23b1b6f68fe1b277c132e7ad4c56dca6482003bc1013d243394dbdcacdddf40c404e0375964fe2fe0c994f8141c7cd6708f638f34bbc644f3cd97d4ecf9993918a99ec56bebfff907234b047f12ffed2713db9baa5451fd73f035e3c370a0ed2a9ed4b503295979a3c1252ce0a0b6aade304b0013fbeb089c3c8ef39be7cc7543550cee034ab196ce81f13e45a6e473f582a1eeb247603917bc91b8e83dc99deea34da0ef1eae31933a9b45db63f75b7a689451043eda378ac4d194fcebe5dae19a6697a2b0e767e950b7e83c3d41fd3855c57314b4f3bd68e5f8427ee1edcd5254e5cc246795bd662bca3fcb1d120914824c2f54ac5bc4a23c477ca9aa8d8f6957393efa3c4f0c1d3fa6fa445d9da14e69069f209cb70f42d5a98f49de8804e6ef89a4a9c342d271fcad2e74bef1adb6245387698dc0be3c4e5f6b41c25ce940ea703bbd61eaa498ff3b645f12248c0a1bf121add21e17962ec12f03631fccfa1e2bb4a0142eb7103c0cf628e56c8103fb79c43182c081b10e7e62e36463b2c6a728ee0c0c4b01001e43b8d81b97ecec3d943ad23895863a8dc44a801bfaff93e27b920a061f2b555efa5efda4d20716898da6522d2949822c345cb282d03f4974ae846800355b8d42a54d59c09b85a035c352e99dbe11c2992495ba2e8c4b49d1d034868c9387ec3f605acdda45e779252b0f3cd2ac63bf53f203294035968f9f1820b741895aa0ee4a033ddcdddf9e60cf226123be1638c2ec87475cb38f79ad7bf3fd2afbbfc1df005d3fea946024b58044bacae38ea2fa13e111bad27d60bff312044174dd75e0dca295569a9f56029852ab33862309ceb7137f1471eb3e4d5a654c1fad2e339ddd8b7c4b10e733aeb7a1f31ae725d6b091763dc4a67c40eb5e7a4fa6bde05ea8bdee888bb23fa0e5452d2e24fca970621bd6ea41692e1b2e96ef7d3617c0cb872aa92d360c07ee15876beb16f863d1bd8159055be6885fb6331547bd0a501b84e1105ffaab774550c0a6dc091a6c1e0f7367b343fc0e14dc384b562c477dbbd21cd347fab3e3670012e85ba1460a6dc0086da4bc83168645950d9ed3857a228f57b067e4a93901cede3898751869ac67f58fb1c16d93e1f8607bcc414f7ac5b7b3984957e8ebaaceee55365be83edc52012eae938e837141f2a0122b57b375cdc4abc04cb81297bdc1fc1c2b6fb33db6ee3a52902915fc6f5e99f082e50c5280490662b53960e77383978dfe32e56ff0e28e3e651dcfa2358bac2166c99d657be48658155db08aed18192f9f82d0e9ebd1b37e24c81113ef54dd1ef2e1198149fa396dc6660458e1aab76ccf2b568fb4d3cede8e6cc409c00ecb5340fda9d18b59d983d5b78ec50e5095a2ad2972fca0f6f0424c5ebbfd1dd871def43e935fad93cc2074a08a61164a7d1adfa00e9bf542b0f4800775f35dfb7b9cbc346e7aaf3707c4d19c194f5eddcaba53c3ac9693098d0a5caa012d526f16a618700d47873c5d8d1339771111351f1edb8ce725a723ed6fa5563f7d22a01a16a6591191f63358ee36ac2eb6ad4811e1f60a3a7abf16548d9cc29db3f8b7df7f2475d736689ca941dd082fb6d1fc54daed91e4c992a3aab59b683149075235319a243ee8e5b824404e7971641539f5e9aa4e986b2b7e4675c1d9fea488ec2277e700ce110d5605c4504cfef359ba03ae98303ee3fcd1e9ac1313e515cfa87f3f028977603e1617c80db678a954bd3e4403454201cc292d1a2b840127dde4e6391d223d2886227ce9a0c6b00a09c459b81bcfc6ef33ae7793fa5322e3a99fb292ed0ed0860221ec3420156537522840b710c682f84b9c2a5fac1b5c9ca577b36a288bb0bb483fd5d9826f3578154f52b698d14e0117373b37841e0664847378a0334ecdd9a6a34eee5e046dda5f6280c8bb7f67c3d123f0003091b74dcc43b3aa07abfa1907db5fb5e028095ce44d0d63e2224a1ad908268a2aaf2b2b9128712c56ac0e262775d25d368502218f919784b78345bc6d8a54968464b829c224b5e6640d6c8d144535e2aa9cd48712e89e20b07d1fa0ca9e89dcf627db9eef6ad57d9a9489d8a5bd1cf626523afe1a8b08110a83d44370a84ac45ac1d46e47f430c25f6183c5ea228ecf75b88c994e934a839efe73f96eb4196e2be18ff8e0b03d45524438cc59741758682aa46acb50acf8231c9d57cb5c10963f9bc7f2ecf703cf1cc27e0c413387df23b300f540f5d043b8249da1486791878303354c8331cc4f78ce14483faac4648e7fd40421e0bcfac674d5bf36feb4aba5b8cbec4db4d42494946c963ab85df24f895aace685483f0050aff0e0761c809c05b496a63080cd57c4ef23432301f843c7a69bf98f144eccfcf031daeb52c3f06b2d364495c5c2017830e7b3166c645ee5000ea60d3a2062e4bf84e6a6b2298268b659782ef2a673f4e0c1a845409e436870ba75622fc920b7f25f3ab79246fc4b50be0c24e45b18fe9bc0a9180e5906201025b3c2dc818e49ec762dd9e581ad75ff2c34cc1d07869354ae64307c5e9a38b4ac6a17e3fe99c06a16bc45d89ae5ef19787b810f485fc8a6f1dcfc17980cf788dab8ab48479b5fdbc6ad33b1b9f283ae32c3142bf4ee571440e9c5dffffdf77b3c04f32d8fd69ac2b2c93236873c65e048ce1936fa2fea1eb8af7e4b4812a53edeed19e251708d05a7ef488b2f9d5958a1a10dd764c6b3c558cc00dece48e161ed020bfadb393c252f09081d1b77b56c11df15799dbf25bd4522390af4765aecda63fa9a1a47363a7ced633679d5b8619b4ed629d04efc882a6c36d0fc7aef3f17713360349922733a6d68331151c510fc38c434c50da3560e20051a10b12f3926cdb38c3d5ddcb37124e7880116f476122c6d1ed271ffff97c42ef8d6889fa6566db513a1ececec86bed8c20e45a88a6329e732d0dbb47bcf7ca54802bfdf0392999c360aff2b55e2c9f06c1f24a145092833fe106a27cf1cde44a555cfe21ce2c0610b249e8f89995964660a0c367b70b79b996e42c132ac2c1d5afacc77a6e1cdec6e496fb79c057997b1054b17c3d5b34874f5042bb1ab97170f22d9c5b340da2158ec050b357de4214e4791914ba1a1c65ccc132dae190338650639196064282cfb462d09d43919f43755a648b6675587910ec34ec1bbc3dc130b0666f23d8ec82b4ae7cfd8e36ce8d3114618732624c31e9180fb98819003b65c61939bbef048c70ed68027909994e9d9957c5df2ee14f823dd5d2b6d0a2b7f840fdc443e51dfc08a0516c9485105196109d343bfef51ff5e2e01c4888d01e040643ce417885ef4c9e979f2fb7ad1d73160ef97b1ee41ae0f31b3a41457c2cee9133ab7d8673a193ebcec033058d6d3adf7a98c955ab594dce7f6e58448ec1bd38506cfcec61df378b7b3f1600f724829381c3a97d1d757ebfe34b010927b6202420e1f034283f423ac26804a88f3ef2cdea0e27c7994fd7abae5136b1c69b125bd9b7013825302de1a536eb6a1ed0a2d28ab8e4cf0b4979f7af8923353670837b82c5fa4ab7b032ef1b8285546c5f425ab7e9d5a9715bda38de9dd01a90e99ba3afe689e42b1daadf14017f34d7b0b5091e84bdcab886b50c3959488b047c33e06a1fa142260ceaa7d3903da79599ec052d76b9baab39e525c15addd3d0668ff5a61fdb50f80cb02dfc6dcf502c2d16501fa87c07aecc3be7b7d6295ea9591fa6dbd38361d58ee48fcbf6778afa06cfa7fcc19b3ff5e3b1f2c8e22e4a1a2a90d63b7f09eb97d6629f344bcc572800062b014e2c624b594865d0f1ca6116fe539d6476cd32d42d84797d54c783bf323c223732d7680c770982aa6713ba072f9804cf0102efe1a1010f2032b0763cd94ee13b86b6378fa35fce5f15fd82c724d99dc92b27db4f07a0316ec75c554709c519c9834d2a84821fdd800573e5d75590fbdec856e74a4d4149b999b7dc77f055277e982f3754490bb1beba5fd0b3c7c0bd48f6b6d670d6381ab81c41e40164fcb2944b5cef615f1fa2f4c53846f7975a1954df5ff49740a53b2f2b752ab73f6b082fc98636e0756ae8b12b36a94c517046e3c5bf3f778e60c28e50848bb5d8e1f7bb82ac657a3202c3ae3c6388d6677bda5203dcf65564a72326a76b07e22c05d7618e7d5e3fea3f8217f453bbc00734a4c31df8862333d0636f374c03f4c557f6c71d82eff6ea1959ce47e6ba2dfa61c8de78ea340f431c45d02856ffe813044421a5f2bd71442d12d25bc2321897d84b193befa9d3327d5a7302880ef053f6ab2466fbd8fef11b3fc5f881ecc930e46bb90fa15c6faf549720ba4cb229698318dc00268b88dd19d0d71b581ae99da4d21d5dd2a7e2d7fd5622f6341f805792350f14e24593c2011dd5c158b514a02c9cba7b6aec8815f4185871bb0a6ff682821075c7c285c09effeed586d0b656c3808d5fb280a1efd1edf3279935d5e6eb01e6daea3ae4d0dac5e141790a9b38dc534a46aae4567e94a757733c7a517c314a1bc3539c7d8d5987209f249070b8168a19d174c0abb1312e330c0dc829c662bd6e03b14cd80a41f16a60b96504fb17f4d4ad73aaac0c010ebde3a6ae1d0b524d20d30ad67147d4ea8e76f5ff12a117d7a7304949738c0ce2f0a611ca83348618ca118e3771b7756e59f624e1d3b22ed6882f74362f64d5e72899751cb2c138e60214856efa3eb59b3df29d45f1b048d6b0ef6c35226b7a1b2f1a7a61b8e7d4c7ce4d3061c9ca587cb1b27bacf9c2e447a2a90d2d0031433a43076701a9aa61c1270a69661e45fab88e820b20d5411071e271202314fd4d404894801d1c45556ee4e071f48530abfe27f70e114e129196c0d80f9298e7ef4bbb922f1f0fd3b7912adca7fd799225722607544202ed284ed90a900f3d4665cc6bd5cf7b4a690d0474cd3c4ccc8d40c401b2f6c4b739bdc5564314ae17538b78d4ffd10f870a11c0ab9243b8647e0b001e4a4a31fc4ed2b1cdfa029e56d0d1752db0836048a4ca6aee31f4f5408a7649a2dd8713d66edc77507e5387cbb6b18ffcf7c0f350077a38571200d549f20c6ea7f1a08403bd72b3cd7e11f0f492e4a12381579766e2b0778302ca9f2b818508ac0598e73d3e889142927d708ffff64e1de9266e085d697b67efa15a2a70d515e90935d7831f5113a836c0505646911f75ec681e1d0d37a57187611bee2206736fad5f1c99c41ab5cd0f6b6e5b8ceb0bd67675f7a1201b6dc7f6ad847dbd3625a953a27fe0e1f366a62f5a32d2e25c7fbec682b07a66d3b37a2085442ed3f69033641a65f6aa0f0a1e8445936d16d048ded39114c9c903b7cc45688d37c47be89e9a56ee541d1692c49c84c03f75ca03d6d39d1d9b4c44ba395f1de5724a5072df7b3636c8df97c2918879c664544e56f821e18375b988b8ecc2593e7278b98ff5b1704df6ba64cd8a244509499535d5bb8d8855dac72b3896233dcf4159053d3835a6cd2943f3217c386d41c06581464f00a22e0fa28a58f3163a5dd35803249459282c10bef8e66b413a70383853110f2c0874553b7d11e9b6997f5088cbd4abb5f574a8b1b1b837d1732eb34c6694a0f8eec7ba5d0a3b0b7ccb2af4941e647cdcbf6298d9fa9aaae3b42385a1b610c6e5000c86323a10998d08e65a57778b061456611f648b3c9cd0c752662b87bad22397c9d314315b0b99f00ad440540356a827e6c7ed5984a0d3ad387461d4609e6d3217f6cbe46b6b1a56bea53c0aeb84adf07ac0bf95750a18cb44b2fac610c0f599a1f1d5b308890eda7e88817e18118652226043e66270e9ce473d5c9600fe43a45e4b012fd27a34408191acb3ca78a9f6b1990d7fb525b6b2665e83b47a5d76938d75ef5e3a98a0cf2eeb26dd12b1f1c79817a8f2212e41f78522851da7b22fccd32df7b76d8f23fff8297c98cd12cf2763f56974e30652bbe151af73a0cc60d19d310122069d3d375316b17d861e7f61c252c0d39e8766044621f59fdc41f62c376a2737ac8f811f7757fe743c3b79e76f66e5db87396b145be5f8541eb0fd9a4adb6736997d656eeaa28713c2be37a3f17ad54707791d8565a7e23303dbe2f5dc0d8d8355871f3e8e947285ced290a78debd07a7a232826b38d5fe4ba7f280fc53eaa1dd784d4831d9073938b51738a29cd6b59e2cb7b2aa02cd56b077413ea4072967a0c5fe120361b29e37cddcdfc13ed3cb67ad1e11e1edec8aa16e700ccc42cc1ef58f157d4368beefd110fe38f0d5226ded4d9250378f8939f23f8139844664a5a8e39eeaa856bf7e617f01e3e454e5bfd2c52fa3e695339f53a79757a7933c4b10e2ab1373f8897a0580933694068658b0bfb6a22295cfb4bce79e82f85dd505ce343f7d3c2107128a02285fa39c5d0b461241020314ca4d6578ba8ba43011018df3059062a7ea54545f29957df5e55f13e09fa3b4c2bbf53e1c797a1d89fa22bd7e65331e62eef6ce88e79b4d4f05b10ccc0967b3d7855fcacd658a2cd5819af226a71c595b927127d74642d35d8e2f5711f123ea090290ddab736b719e763a8b58508af761eb2cdef060c7c1b16d084a3e26e45990920f2aaf4d8017b002958d4b60b4ca0e6bf1634dbc2af8daad90155416de2001cc42d2057285bc6a5e3076b73b8f4bf068be3fdbc71dbf1baf2ffa1c03e4f0f256709971d88bd1a4754e0c715af37758d12edeee4949650d907020c19677cb5ca7fc8fb74756d0b8ef6cd4b25984069bc75254e60c318129ecdc44ecc8936bd8b174b5190cfde24152dc56a222cc4edc2e38ba4460052053f22dbdf41cde341806a5afd45e7f50e7c082f8ca1b7c802729b5cbf2b2f523027474ea1d630718ef53e958b1e59620ed6aaf2401ad09d8bd2aaf16e5a582aa5583b794a18e58aee42d82050b17c254727869cfbec6fc98a861a0b2fbfdd3a0f7f3e3840da5779f05570eac931cc0165afd48428c1bb2b12cde7e712dc3bd673252e9dd486294b0dd162a1d411756825ffb21860268c91aef9a35bc85539b0e398bf9ad4781d3b6917781331a2d7804da017667690bdfa108fc57be3605a7470ee3656e20242a016c7b039a33f2745d301232e21ca55d3a289f22414084b6741bfcccab332962d72b2b25e5f08b2deb7765db0d1d28997e126d3130914da58363886a716485c314843188678865c14870d9340cda4fd4408e451acd7d0885e0ed857ee9a5a546922491324919460727073b073828a0c5dcca021b204e8212541f4060ab1db0a93e3bfa97fd91464664ae353636db1332923b5b9763622cb646b20f6e5947480e8cd67d85edcec260379c5968adb555c9c8c868192da3adf04197b57693a9063862b5aa62fbd79aa7ee5b6badb5d70142e80d7eff0740206fa173706fcef75a7b73920fd41a2535876ade803c70f307aa0728abbb218001895985092b43d8d2b70e5c1647ce93b20c7059f6c53fad8be4303034751467b3e99a2dc7e529e9451bf46897769ca1e9563245c9f76290e983bc7c8d9737bd805fead9adcf829e0936e8229d250b65d9231be040bd197997b2f2df78965a83c50c0e039fbefcf7414c0f924af49bfe234dafa4f42f4f5b2974db7e373a1794a68b5ae3eff9631fcae26f0616dbcf1d3b28056541591607c6be0ef8a4d7f95efc2e6c006d755fe369ab3482af3fc8f7354825e27faf3f9855994898ee4d2ffa5f3e48e94da412f14bff423a8cf49aa4ad8e2c338c2519003ee983803aa5179fda992049a690b4489eec8c97c86c676276c645144b5f72f9d297f985449d56a8f0954cd17979d22b51f24292be5cb9944821334daa39cc841b74e941d692303a0db04135bce08927867cac8a44ea90c296ff90ee8661c1fa8fa376387ea390c9962dad243b47ec0e4222852f7eb8012259433287aea0db252d5a402582215284c876f3d3896c28b2514a6961cef7d5c7aabeb74e44693c84104aa58ff4d389f7d860afd7ab7aa3d108c77972e7b7e3b9083cc47c88c562b1582c467368d1f8b568f0d66aaa261ddbeb1347a5cad03516e5894f16339684a691c6b525080871db658db58674ec5d0778e55692baa53525a328a516636bafe5ba9085eb72b946fbe3403c5a1c5eaf97f6ebe50a0484b1d6e097c1eea5fdde7ca1f597370594a50465794159370b2f95bff4276e4bdc86d86e844f29524151680277e7a1acd28dfe92dba5bb7c860de46880b11d688ced39f8fc69e944f703ef054f418cfe7a39056e8fbef6d4347ad2b8591b4410358dec0511c40f9069cd958e05c18badbbd83d17fee076f7b502d57e5b33043267a04c28aa066a77b030eb2f1bbeac59a98bf791585505baddc85b05eae979bd347db97c894422694d22f9388a87d2c0506bdc63701258db63c376298d746b87c1a1e867915e24410e2170977d591a48b6078b8316b5f85ad424f1743ae93063a58345c811eb7205408c7b73e72068efad0658812e7d066eea456d88a31c88edc2facc6794c6b9a0344dea0d146ebbb972d66eedbdd699b04456e54d38d1752dae5b615d0aeb4d38189c6b61854be1339ff9f80c081f2b435441d5d90c0603930a11102402899e701c87f10d91b65f58d15b583588dd68a15d703d9c98798df57041261bfabff7e20f068a425dd435a1e85e9825746973674a38815a41a168554862a63424327fae42975fe6d4e7ad78803fb24ea3581e0c6540d43bea862be4f0befed78199b2bc86268ca1477b851cdb3e17e25ceb4fffffc16f64513d1cf5996652a1ab95f521d315a0ac7a631f9f4e63a041b3ebeb751ac283556b50a052bcecaa6706b01358434ea0523481c46af5430f388c7488898989898971c5b8688d19ad4220cb6136eaf27ba31c4f908cbcdc551b3818472639526d8abe124c50459736366eade5bc31f416ba6e8ee34c3224ea0dce58bc62bb6f6c06b757534bcf095851d8d7ebf5c257f073f4ba2c1eab6c56eff7e38a2a93c964f5f57afd2061649406892bfa8e2e755665e416fae2bfb75a2b448ef22d34b74b938ea36afc6badb5d65a6b7d551a5e3ff480c3f6979570a8167c6bddec461534aa1349e083a0bba9690a3b5b8af83a5c384a111f1c5fb925fe471a6b0c453eb70a92466702458b584b1c4318d05a9ff364c16466637842cbeb32d1e2767231cca0871a4e42862766dd959e34f20e61d8e81425a0e21a3d51e2fc40d25873c02286594b1c6f70d1fac02dcab8852069ac3004d160b6c44f14b5589f34d2249628c1d912470098d1fa50e841975e5e1fbb84dea06a0df72ecaea466ede1a5af2c628cd0f94c6c9fec8d236b12f1e47b996d01a7fcbe44626cb4c00972e2f4cf7d4bc4455288bc3a55d63bba4349a16bfe2aa167cc65f4606070e1d25957128b25491e60cb43945e7a69b0e8431aedde81b771db638b40e61d05aadedba2e17d1619befbdf75e8ebbf7d67aef8a43d172462eeac3d4a68d55b946b9a8e1e5aecb3977f988e728a0d6f823b9592a9480da29e048026817585001e4e601dae140c3121b20ae980fb1988dc5ac4a46262643448b8c4c2cc87d28cbb4b155657bc5f674a38d92e2a2f4703c5a278e7a02035d5d8e226107fafb5191fd6e9732323987381fc5588604aab23f58194cdad8e895e41f3da764f4f919f0bd1764347af771fc61f8229964f4e127f94664926fa755ba595247a5e13e561572fff9154a138e30171c45f04390749fff84bc665db6b32f59d6edb32e6ccc0547d554068468b39869838468b35875cd5cb02f57a2de5c236a8d5f56fd58acde228468b398cf4059f55534586d66554e44e433a219d1ccda6bedbd77667fa034164a95c9408475c10d0a12b11f6644b86005b1984f0c081f2b4354f9a927d451ddbde51170576e845981fb111d952020c40835fac60a138246bef73d2c57042c2d50dae0ec0368dac6e6485a83028bede10a36762673786ef175b48e26935825b2c022f4e372b5c027bd8739ba8e9476030d36d69e70d44968234466d977dc2f5716a033fefa4484d2f88370862682c13e15d8c2b0d97cdb74e8d84e5c87cb1954a582a52e58740a7456852ee90c63ac6301f55352b41d4fbba680d0b65a1b0bdc9b3c849b1e91de09c99f6cb71afb81aa9c09dbcc36b3cd6cb38ef459b5557ad2cb71dcb58538a050ff6ec1554e8da3363628945eb95730e88c3fb8ab8f1543073f0051858ced1fc3842e1d763f55aff5bab91187cdbe77956363c31c667d605aaa6a44ba1330bc209c2747a96974fea4165592dc42b499c32cc9618c6de20a6c380c9bcd266413b2c19a00b1591510219b90edb3e19006774985b01894c63bef1302855cee0dc11cb745ae9a86350162b3ddb06b766b56f56255e05fda3d6df76655f53ca35c1e3fdda0fb7383c84db493fd64db4afff2d582a1b5d1edf2fa2b195adb9207981ec6861f44fc902cbdf841484a5e9e9447218ecd22d631e9d478181bc4e5c10f123e080f02a944f7f01aa3d6f99a4c2fef85393c2532d429b9f47c17e6f0b8bc7e1c5a9b69b333373b93c3735fae3374e9b297fed2db97de26db4555d520edcd44ba8db4ed20c7b2e003b734d002d993cb0b594b248cfddbf6d7248c257ff8e6a6d8ec8cdb2630fbba41e3173f92f822ea398e4cb9347d7047196f6db6efb3364a63c5b0591f7a6c76e8b49d9c2dba599becfc48608e21cd050ca7c55330dce9c510c7711cc771dce52e599be852a974da6cd8f6ed8c1c0037802008822068033579ea88cfdc24d700db1fc9db9a3f35862ea98dcae8959946e2a8931147bdf473a08f94e5a9b5d6cb719c0d895aef1572e26e01aaad150bc7c1dcdd468737c39c10926a4897b4765a555afb420cccbd9cf4c06ab095ce6a85c571d8e8185531a998a6695a950b4379c87481d2d8ff5ce8f1d2f57bcca0f17f3447b9d5bbb45accd0dc2ee9900b94259a2626e206949502dd32c849681a6c9f62fb7f90b634774b734b734bb3b425bac4e62cfb885080c781edcd53f46e1132361de545682c30f5895c455b749b3ecad02536afcb5169b88cc00719387ee60b70e34b3b4362ad4fec1b6134bdb89434490cc1efefbefbde76de5f0d4f048c6dd41aa1e3ef6aadb556dc711c08e0cc12dd91d7e5a87aa29786864cf242cbde30d18ddf697d33e38d718684a94f83cfed7f83bcf133af73e367befeccccd3904966480c7483dc69dd182936ed8cdb130794c6d66833236df9b0428ff807129a727846422d6b6d34d57aa386a7b0a7b0bf0d194f9dbe3e2a84afaf63c5c35322a4bcaf305f1f488ea7465f5fc753315f5f480b433c0580afef02114f811f80af6fc453e1d73fe2a950005f3f89c8e3a97f35f114e92be9443ff1944c2cca008270f9f11401806ad08db1caec8cc540f64920472047b2c4b4ed26b2c4b5ed4f80b14688339a46ba4d23bcbce9c544d62012c6fa3300d393f02fff99c611fe25c4791961847f19813c82b70b69cb962ddbe5c585ace638de4dc2587d6446f897ff5cc6f15d429c97717c97912cc263974aaf2b5076c9a564f708f6c9f14bffb98ca62f85382593e94b26d2a44bdade3d8e15f6a62ffda7c7979797d72f64111d9bf4527b428b4dd224b23671e11180fe9727fda7479727853824179727b9886f124922595d4802e0f2a4ffc4b1f46288432a955e2c914570ecd00694a216ec500cc9238eb274bb8c454a1ffe278efac31027fc50836f0243f0eed23824467ff81f38924820892c22b3bf182031b6d81ff8912d883a30e093c051fc4ffcc6bb4da229e76ed2a88208e287e128248bc46cef4d210b324ce410657bd407c8237ccf0b713cd01bef3681f94dd9cbe4ca517687a3cd97c7ef7388e37d9fe933e1006d8c79bcdf8538df351db9bb7b53c80202bacf8e4610469ea908f7a65c63f4be7bae9620f043ebc6bb4d21909d9dc92376e337852c6447d9bbbdb1561c0518a99d494107fde5ef4e67f5347cc00d6b86f973639c19054084c6408ef2efbecb9fbdf7463ffafe031f0c3f145f243d49bf2e7dc9e55d5efe852c2b09b3422d4d2fbfb35d7e67977e67ebdfd9a4dfd9e2efecf07736f83bfbfb9d3dfa9dedfdcece3bbbfb9d8d9f43435b97d17e69b428921882b6c9b6efe5913aea06a5e1b71c660cc1e46c1d1a096858118211581982073a502972d8d2530613514c00032b84d2f86313cbf00c9b1808848b31c7616c03b4c1d908bbce343d93005e00225c2e97cbe5c22e6bbb93cdea74729d5c27d7c975729d5c5d6ef2f19c3e062d2810412bc90b5ed10b5a53402a4ed09ae29d4ea7fdc2310cb3aa1aef6369a6a501a572a0f1bc5c5cd1e68ab8db08639e97cbd579f80bc58b2f16c10f0c41f0555d3b5095354d13c852b0441051d8ae7896392aa7600ad00b64414bb8a27045b179c44e1cf7b85c5eddb923314c0a8de6ee2e1721fb8f92f53875bd37bbbbc55a78cd3967ab8a89c9313934476161e2c7fd2746489755f69154e8fa967c800bb28e1e34dd95ac3fd4ca2e65462fb3aafa4516030d7d725f830cdbaf47217ae2a363bc89cff88dd3406bdc6ba034a3d1a87e1f0e8f2abaac3f5f0d92410e71c4d725aa721afca57bd0d6433bdad8345c61dc524a5f4b64f5b133fe2431fcf0495fd6af3e8e32c3af1ffe05ea9ba5b5d5a706514defbff7eecbefeb7fdf584d1f1168efe902bcf1f317f8799a8459c1fb4aba37796d7fa540bf5eaf97fdbeef4b6297f48a5dbf946981d2dc6c322f478c44af13bb91973bcf7770420b2bad17eaec89ac8956288a62e879b9f37a9cb0ba3199aa684a833f775dced6b3d6736b6dada9099121e6031431168bc562e2d8511fd02d2bb1f4221c67d09ba20af38e54426bc8a0290f78911721b94d310484b22ad64012a0807ae3f9500ff20d925ac3d23616bb813d64660a320b4abdf11effcd005276dde037e2aa7be8b1588ce2880189c58442b0c16e7817972f01b0eb4bc86cbd50a9d4600a15b44a2e24cc0e5aa5d2987dc7e5766aad18a8b17d81fa395b7b0b5f02c8a2cb6adb459e46b62c30344d5bfba4d7d6cc7aac3447d5b6d065354d913441b23cd55f9269d8f529adf547f9611f8984d2d45b2980ed91a533e1dc77a32e8bd4d8b6a4097c429747b87d8fd0361becf302479531b4d0a0a837feb2e0699720c6d812ad50699a0c4551a206259ee810011f6ae08419645009226af93f6a8949c5c6c6395b7bf801053472ce5790584b6fd65a7b7b985028c5f1e15adb79397b5ece9ea703c370858b616373d6fa7442e57dff6b3635544d474aa6ebfe30c61c17e2d8a72cdf5fc7e19f134a10f871ed0cc480215dbbeca85b4ae9e13bea5fc0c757180c56c4fb058c643e8cf10adde74fa12b42671b7b23299f915b07c394effbbeef7b1e19502d26f607aed6f732ac5a1f09634b65748fabd0199b9515a2457716c8fc81c6a4fdfa09b09a073127a8c494a801075a6aaddb4507fd32aa0550113560e18195320840fb22072f21a21418d1f29cad699664e0228b143451c045eb858e8a2cadbc63e5281e60bdd9416b54a20e1fe892ce74b4d61dc65d877187bbec511a1d5a631aa060c30d96503114c99c730e1e56b21e2ab4b072d46864330e71de515b966539852cae119bd266e02963b60aa0d3622872d063c12e411f36d0f6ab2579e868313103853f3f0a3fe816135dc67cdd7b98024e15d98ffec7e87b3be6e7c6f20887f254c6e5f7345dcdee9e878c477ac381bc47df7ba32f47d8feefbb7eff756017e28c78d027ce41d04110ac6273ce39e7ece59aadaa5ef15d6690e3b2fd82aa72a8eaed922a06ad51d880a2e044d799f55775913f9682b847648dc590b34e51a161ecefecba535074a6ac6a4393dae4bb5ded9a509ab7d6da1c1a8dc68d27c4a06dc795e0a38f98fe89ae9bb6cadff93196519a6ae5546320ab4dae544b652ad4afdbbdcf0f72802eb1613cb2f31e1c17907de34c76f65e47e518d275e3fce0182680bce5dd97b36f391c8fbca3effb64b21080901d017edff84a8239248eb2e50a73478ed46a963c5237a534f74fa753ce48bc2eaa344145eb85dc644acbf3c61ebea3870f14688d3f0278e48047adb55adb514c03d0e5ea9ac080e4388ae7e5f2225b445db47d4d704bc38ba028aa292b858bde68d6e5b2516071017194d384d46ab577b95c43d8d4b8d7938b139e9747df5dce5d672f18342868344ca3611aad624ce3b81c441c8d56c3593c757a6a7665469bd168b42b573c5565324721818340d83d3c556d9ec966987667180ba6095da1e52bdbdfde7b310dd3683d271e58747d0e638c31d7c36854d2f63cadaa44dad376a777a73dad285a22cdedd29e5714ef0d4fee8411bbeeec4ed353475095111fba1350d6f75b76c99da72a3414dd125d0c3a2a9d94ed8f7f50f11514fb0067a1acd19f78a82732b40e3017dce9a921ca12bf3bbb93b210b0fd3b22cafa82b24240592cc841b8ca9eb906aae2ce0e8c7abaa283fce784025d029a75c83cd05d0fea29c3b0fdbfd3aa6a4f0f77f670670f77e2d3aa2a10d009740259d3e66c6b6647f7f78d7457dda37b744f482201d98074d79acd41a4477fad68840444aa916aa4efcb7ac60368faafd85940d8dee929ee47d6096739aec7c2386b44b542d01b4a6bc4ec02caea605089a829ee896a524224396f34b22a9b33903d9d4e27ad61d9ac59b3567267876dcd3b01a5f18ea033eef94067fc9738a1b06715a797450c4e54b494ed4f1ab30f284d164a937f5067fcafa033fe3c8800e6c90023e3a403cdc5f6a7667467374469bc3b6d168ba53b39d262119f248ae28fea16c970d440fd06d499fa3530d156642dc0c0c1004a432f876b4dd639277467778e4ed19f0707c10a82e08988a3bcdab7d90209a9ad116b2d1e87742ed8388ee3b8145cb046acea6bfdaf9c731cc73df7d8b9b1c3a394fc43ac2a933dea1e42a487ccf5328284bb5f57b21c650b18a42c07b97bb91e2d38313ba9cd46878d4482ef47da440ba49c2d7184e1414bd41f2a091f049fb640bd55d09f81b40c3c8d2b589298275ae28363128a84175064ad242fe431f0bf70e3840b64015ffe2ea94c76a700ef052bd8611b5056fe23282b7f26ed0f2742e3503fa2469773e7d6da1d6c3085962144728434f1dfbd174609b7d69e4e148debf7e22bfafeca9e4eb5aeeebdf7aeee6a6504973b8cbb8ee33adc71197318cff024d4c02dceffdf1e379d4ace5a9f4eff361685fa07f75fe711a44b6aebba6e66d5fdab069942576e0368abfbaf1b85d819af853153b490215eb51d59cd26b09759ae56ab1587313e4fd69e4ef644a32cb731d52b2e149295c8042bf4b8bb2e672bb4eff264c932c9c73a811efde742477ca38454a0f34cc8518e050156e87cc5273de8b45089f8e18330f9e90e227ef83484c9640ee91b405b248f7dcf00daca4e7a6874a0b14fe935735f0b93c34473a05ff1d4bd4fffee1ada8a1372e41167a1de719c9929a18413eae934bf029e726cfef234fa12f57d69037eb9e2a1860f92e501c4ffc83245fa11097b8f2c07b0cb0aabb5052715d0ea09346a00249b7ad6d42eeb1992394ed33c78e9ee6d6ab5a936f5721c87391aad34d4991d15d3bca669324d93b280ea4d785108d2a3a29b3a546bbcc3dc579f7d4f2a070d3ee9be8e82aa3469039ac91b0efc0693e3b81fb8e3f2e75042dbfd399843098d2be7569422be1dbfcd8541bc25923c3accc08e7d0446876b854fb794b0eed2975c13eee51ccf50bde138265ddc21e80e7f6ee45c178896e07fc72bbba79db945dc232ed1be367badd019ffdbad45f16262fb7fe47d62bda7070b5d5eb3e79ad7bce635cdcef4fc2b7a814965d5b276d5ea3016f2bbee4067fc290e7ef0c042dfeec4755dd7754670fcfd318772d46a35bac27e2664319d5fdcb0f90cfae5e7f1486a67aa79d621995f51c153f5ed391b3a6b59b09c582ac638ce1347952a83316e60d85205ec06180c86df44598e31aedaaba61ceaa9895a91a82822320934945de9acae00656750f041f3b821cc6faa37fe229960355ca17bce07d6e35d8facb01859c4081118aa46316b0d4b0aeeba66972342868d236289883a5849ca3d6f16d6625c4f1e2b1919137d9b477a82162f4f35594571fdc4b3136b7fce212020740dfaa9f5279ff51c82c12acc7216b43992d09c8cccd97dadb5d61fb202398a874d97f53c2dc528bc02619732433f3520134ead060a6ab8028c99103e4cecb8a88035d10416566a9881bbe70f4c305e2f78093182225a3fa690b1a4768308769822099d22f20c9cf821ca367daadd528cd2540db43fad98f3aa93e5e9a9901d71bb214172cb19094eacc31dceb8ebaabb0b61f21184be8ee2b208d65a703402c1d1081c81dfc843a900a462234e2f8b3088ce7ce6334897178873e2aa3a0392712610d0120e5672346c7f5a522ce5052a2f101694cffb0cc618e393a8de7c2b10b46c7d7229e99349ec8c9db1f39ab5c6663391aff2747b8ab0845a6e9ecf2c0b96cbd9d3aaf279e69c6be053891a356ad420f1590343e32c58f089b19ce7799e273ef1e9bdb86883127b319174c98534d6785d1a4b4ffa1aa3fe97b1b6ec83f5c67b6a8d7fcf7bcb34d6961e6174b409442d4dc204d12f492e19360839d14a42224b5f22959492bc2022d19ad2fd0b2427ad29a3df697de168c4a5baea4d5dc2e4cbaef29ed0461a7ff8a694260c49ea3ae8d27b7eebb05da53bf19ed2bbfc0b384ad18a037ab305f51c5095e9fd7d0cca0adfbdcfddbb19d40e5196efd3161b8bee37b242a564339acbaa5cfec5c6d49b6a5fc63cda18411847b2d6f8d718fd4da18ebdeaee94461ed2977848af513ee37f479b71a43bfcf528838d0c5f02adc991c3510ae94be32bb7483ac01d5bb51f88b7ded3d35343f2ff7bb80f151c05244747480b435cd0a49e9e1b0bdd058d16ce8dbbecddb0b972bcd6bdbcd1885579a40f1580b430aba6699aa699bb919a6627040d8a582c96bdaec3b1d84d18baac40fea4c78b307651165efdf9c102899d8102cb1135a81a5181d2a85b627ec30fa8cf70c21f3802bfef4b978d7a3ca8eba9e44fac067139a8bacc632e93618ff914a227b11ea09e582c56495a93dc4551149338eab41a2255d31623d01cc642c88ec83ae7fc61f0e244d148925056a58247875be1ce76d6e6fcd5ddbf25eebdf7bedccb7196bbf8a34b3480ff48de17a73e0f17460ad01a2fb60bac58e5d05639339049c061425ad039b1e4d06094721c95d4141f01fa97ab5f8d201942048320f8234716cd712af8e8211b42c4dd6d0526708121634800760e39cff33cab8ce3bed1479eac0da13b59d2638f6379769e28cb31c61ce7514e54566fe8fdd2c178d9a0d083be57a8dedc27284b76679cedb1aaeffdfdd4a361dbd6aecfbe39d51af7981d3dfe19ed24443e2d516c005c68981538ee7766ea8b675cd999210ddc5ddae828218708b19c63b69e413b9503f98c7fbd7964acdec82a3c46696a9ab2561b67cc9d1c77ea21cb162a58fcb4608b019078011a5670c1a4870a1450d588ac355b3b95f576b3aa0a74abb750d71a7ffb852e2bcc1f885c6588988d25baacb0d89989b4ed7cbd57e77154965d4d3d78bdfc05f343dc9ad2f873f8bafbe907485356ed5e56a57d86b2c49d6368a04b7f595b7150cf33a122a8d4edd814b164342200004002431500002008088682c160403422968cbb7714800d667e407a603898c7634996c34808420621e30801000002446088a48815556f13df586d503f4dda04decabfe7e488438e36eb3147fc59ea966366b4800e0502c4d208c9c6d1b4c81ada2eca0c9b7206cfc86435575d67f572cff46faad374886f6e19699ae54ae45bdb318e1902dbe2d05d9b96dd110ccf0b41b63d7cad0de6898c61d415499f73d8e339c69797f64460c6960a98a40c4c27c6ba305dab995b3307779c5d056258520f2b400458590e4b92e3160a3f1997e38865d698d0e5905231bdffe92170c31a6d399ac7845cad18066cc28280d31d0aa83bac1cb6b4e54d7ee7869d8bde9c595b78b3b1654219455f50cc8069fefe90ed7adc078df251361a53c4843a43b31040cab7465a14ac338eac8054665cf86cb825d978407e151bb06d0af33f77597f38f2108830a307e25a3bb08da9e85e04e578d9caee77bfc6920b4ab9bde37d94e2f31ec925b9ba676e780d5babcd1d81ec5ca2c12d79962ef530dc44c6acf97795c866063ecff1ab4574452e68e544d2c43c443bb9aab2108701fa2c6c5e6dbe9c1e61a04d16487b6e93f739a85d2af714f8189c44c601a4fa65210211b5fb5d871be2e4a34b2e2ad7fb6101bd5b8acf80084b1c205fa328896e5e8156e16047de4048a646edf152feafad3f9a9936a45409cee55cf015fea86b7f7bd821bc65536bd68504338ea45bbf0a1adf065be0d20293e9150ad7c6996a554566d5519382a9140b2cf5e4c41c66b52bb0cc1c5a7b3ed2f9b1a2409afa2a3a7311456971a98921bf6136f860e5a6e13106c7024be9999260feb570c8fac7b9b69b7ff03a43cf0ea353a832f327b973feb561fefd8974f2dcec0efe4534f3527be969e9357f57a687ea4b8226cfd50e4a64e8b95e8a18d640fd3ada352c47298b07b7d0f39778445dff0d0f2948b05497dcb4012e54fa84208e680601411e5e06cec9509120ace9af9a9d5669a7d134b768d6fe1b1e01786ed0f7ca017aeba201f30b2f5a21530c692027f418fe4f0c3578d1a9ec962576994e99dcc4ef9dc2445820a4bda38fbece135fcf4864ab1137ad82e13098b0a7b4977d6900391103c1c03e1a131c910aac7c149afe62281bf7e9381f734d238210a69d9f084fd5b367b8779e0032c514fe142ab7a0cd8fd39afa966090ad3cb5d727dd1f6b262c1f32c50758e73d608042bec7615a43f712216466232f9dcf946142ae5297c64810468e5c8d131cb25fe4f430cc10e17e105f11bfb11037050d62832e765dfdfe0cb35ed92fd25bef27a8152dd54fcbdeaef4812aa7ef915116dc3cffcdfbfc976b3cdd0a26cee14534581f61811960d7a157a68d25185c01b4298ff2e49352307fa8e0e6c2197d97400c7f21508c89368a9f8f78eb4f5a6a1c5fcdb22a0f28a6e385fe03a3c62eff1d489ab5b2469587ce21cc11eda7563eeabb62f42cd2693b153bbe177f120f56f3e0a8da4cfc75b0f4c1c81d0d40851da099cb6a15c6da271cf6c4231b74868e45cd829c0c5f940b84e4d0ebb2d22f14068c22331320c3cbc9f0440f92684559af6d5e501714bbeca2c28da46af8576b3b64d6703671d8e1d0fd868789bd53939f17f9ef5f8888edc2f5517ff8ad6fac0840910a2eec7f24ec1a4f251a3afa0c1c2624d60b01c00ac7c0af0b674bd7ef19898d860cfa9405304ec89c4d1504a072dfe2cf2743fbd43127f03638eb9cbc53c62ccb135be9a7f04b4b193981cecc81bd59da0095611e2a584d5843325c965fbfe116c17aa2da7c499548db2381c44755d50f9fe8fae7ce3c5d94bac80b583df98dbe8c5f54f3c1191a952f1069005548c7a3eddd1fbd775dbf7bd82e947897eb240d628e80d00c908c79e794bd25bb9001086f50bc621d52bcbb1298b24db2f6803c90404087969e15431aa5eafb676d0b29f96aa082788226cbcfc6eaef4e215fa0bcfeb2999be2709d2d190c8a8b70881f23c8b0fa9fc7fe05b2546d4a3aae7545ab5fa28d7579c8326445079485669f36a1a904ab4f6b5985f247a3c091d0f50fbb1602fb6b11f6290fba1ad3dcbb291dab0f1be7de419c7b5ced2a87f3bd86618138d915fa6df4cff2b3b5d6d79a3510af0a291e475a98a681591c88d722475e6a11539270421e595e55371ce1629f233e3eae5be65682d850ff16ba22fd4762f1b7912814f4826277e05fc2d5d84e6ee9df8208d0d33d17612d97179951ff7f09101be38c449498314af9a071e2c6c7f55e2f0cc6ef6e1feaf95573b93035d7225f7fa30b9a95bc4c2709a4aa9550a02a58c29c2a14255f66004f06b94d4a221f14ec7ecd21e5b1bba1c904d78c574aea1391e4c60493a9696885328915589300f85d10437c80efa82c7abb1bd7057696daddf042162464f714190275fa005e765460b6c6589b2ef7dec0bd9a9c5ffe4ccf903d6c9d4a07624aad83beb6977ae07ad550f360c202e8130e8afd0172c4bfa13f6205fb467697d5bc7156e9df41862c9d75a5a533ae5d07d5142ed6d35899eb7ae07af60b92f481a5f4a63dab5e2cf791eea9d22b8bdc713859136d6323824a0d72349700f6b723cd2e580e0306ec1a02bde83c443875376bb873541e484114481da026b9fcf4d8b490ab2a831ea1290020061c5fc55381aae1af3aff89c8f40b7e4311b789a36b5ade54f765a126e9c068ce7d0a4e2b9e9891cbd29613c34c04ec501df7d719cb2bdd750aa4898d2d6128e861f3ee98b1e2e32e34c74a17b4e0845e385f417663d9945789954df57ced27cb7e98531ae1854d6ff344f4317be5b7317536163b002337fd44c5897b4fb5e6bb0211668433b7037426619cf9ed1465c7f049ad5f60df783d0b383e98f62bcf0fe17f752036cf0c350a0354fa94cfb0fa2c1784286b557c046a4c30de0b868f42d28ff305515cc57a5bfdc33dfa18dbc122e062b6b47771ff99fa3da63607af614e11dac4effb84489b0f2967784600734953a125c238a4a1b9678c6810143a5c1e125ebbbfefbca38cca2b77588d802092cab9b868e77ac690389c3408e83c2b280cca98cb08ba15eb0ddb6246f6ba83c3e3577a5bd04bb6de7b1833d6d380e6d3c68a33fe81dd886e089de091288968434c51fd0dae1643ce7bf54711137d5d4a69450ceedf77fc8e48a1b271e089553566ec7cc944461cefcb39e0fd2c762652d78e8811299997bb52a49539c1e506da2d3511d60ff36f05ec2a4a7527b980348efcb7ed20ccf82b9a2a42ba621c440b7c76bc5d6c82e553ec78c3828a075c9941dc8d6f88b950b387c9a00971a97617a399990ec86fb359f0dc2f658fd17d508bb45512c29162240eac3292426102f702b5d3401fd4b506ab9c458ca272c3e48a96798788b8b63aab713bc4481058a12c27474462d8c80428bfa45e64f383d53cecb08e5b99acba1dc9b5191cd23bc297553665c842f9f8560ef737949788622390562ee4e19ac43c660056cbfd9228540fad7e2f53767bbe4ac709759fd1ee5fdb8312f4738deb170a0c64f65d7f3fd8f32e62a250c31dd903a45db7bc0be551e2285e368036136ad590a4adb3c49b5388ac8da31aa55004dc3f77296bb9a4a97541690ad3a9a16111e0057d9c0af102417f4b03f0f3c3032a8dddcf075e6b725a400d5c146a628d628623b023e177a95385ba78b62a7d9f82eb21c5c5ea12d38e32d7311d8911a11318f8f5e1c4865216b14db30a183569b96485d488c3a1822e7f5f6d09e3f7178faa329ab4bd5318262742095f50418bf8a45f0623c3fef1f83789ba04a98e1ef8b92f4563df9a3c00850ecd58ec30ccf2ad3d9182bc6fe574d257fd277ee46625d6624c6e5be878f486ce20a953201f9b4cab47cb945e24da51f7d0ab053c0a486d94158936a82f0acfefe5a5869247f671d55364acfa7e334b5b12d0c33964aa50e09485f41d6853a319ebca608f472c416af4573552225114a35ed0472f16dc2c8144a0ba4dd55e1c20de32fc9b9f8b6755b752143ae6e410c7418e4fab807a8738be72dd3b5a3f5e0ed0bd0b960ce19973f247d5e5e9e4bd839424ec4ee4aa6acc6d809e1732d2cb0a3a9006ca022d8862267269426f1502444b6a629e7651eb58c8583c60559c26fe56bb72f1a0c25bd861973174ede3d46105bb09bfadc543aa975c2d7fb40145da147fd8443c37bd5a8e699513f371b82326d98eca491f54dd6618b3a14e13292d64507f3a74ed6ad3c9df5875645bea0913cfee50c4da5ddee5fd0d35f2e6a552990a457981b1d79666a6698d051701b844f8988ab5e961ab8b1413a6e0b6deb8cc04aeb8e933cad954034c41651767dc6e2f25134d0b2c00ad92850f31020a1bef11ae5332b9c427284609676db89a2bdbc036fa8b460894cd69962952d0c06840595493613ab9d354532ed23dc3164e0f2357d12c4cd4748e4f14e73584d5b378a2e458adb293b44a2e38b085abcef7e2e31d3b6a2f14236dfa387e90092f7ff0ab09f24899c469b1eeb0d7fb6b44c8c2b5f0db8926d736ffaa96303f6eb6f75f6c878d8aec2eb3affc34e171748e64cd2c2f71c536659d71071cbdd7f451a56eb804420ebe63c951f89dd87bdd8c6e75825458bf0967721af534b1581b26dba6b2c16bbc2a1f46ca83478a97b80ac2bb4cb287e8226f981364a0c2a53f37d5258343caa67e9c7bbeedd4df065014ea3514ed6252fe9055280893e0f3810d96d33cd23d29f844fd4436de4863eacba47272f8dd09fd6c1c08b628ae052118ddd6129603bc334cd451fe6a8602de8719d03bcde4f8733bb573cd845700d3807a1285b86a1b3a72a4408d6112d03e318652d77707edcfb63afc080210b99f26a0cb725f04ba0506034233f5d55074f26f3f85188e25856ff2904f305c4d37cadb1b5e332197f5b09f98b93bf0480728c5a87ba7a9d3b797322b855f80aead6290817e49aab4f2aaa309049b7527e71b13ed19a62edaccba635bd5b06d7a49e6ee4472f5812291c4716372bd7ea75448d6ff3e7a6f3ed4530bf748d07d2a0d9993bbdadabfeb8a490e6fa1b705ba90ca993989786232dd5962924bb1840527d921c6e45105f3b37ed6d2ebe9fb9d5834dbde965cb973af634d1c55e50e0e5b35713079dca9cbb14e6ed69f840bc4248cf8b0b526dc04531b733997a9b049b8149d66f584414ccec7f00343355e84cf11308b1d7427219bad022d9ba11906598aa6b5a7a51d35f4ea794fa05fb13385bdace54bcdea937c559f7bfae285b68b4b3857045600933317be8ba9523b80a2f2eb7f06b35f060074abbd7057c2eca374580c90ffd59286c6fff9016b6bf5689e4b22ae853efba4d2561c47c484bf627341ab5c58eebe15115e2433f752676068ffccebe9a97ff8858d0d7ab66e283b8dce9ab117d60aaf4eb6656eb844fa3ecdf4c642e95dec9a81a8c169bd1ce76a97d5e3ea8ae52a6e2f6d6a87d0632e57a1e805ad6ddfd50fc14fa3aff32aef2653d889b05d994f9ea0fee3fc08569fc67e72a24fccca422b543936b65ab13f6e3812bb492442bdd8d51ab1b70728b6fc6b919af20db67de66e4150f47d2afa0c887389dcb95ace68db07b6c830dbd8a39c646aae12b6bd210c987aff98e92d0c8f0d6bae1c4ed5d9825ff869ac6d26d3776d7f30cb2ec1421088d76c9d89e5c00fae7a36b289fdf0dedf51abc07141f35c1c539d8eb7cf94e4b5b80a99f289d6aed2e6509a5f86c12c383ed29acc7d10d71eab1a0e3a2da2245ead86dcb5ed856526bf3f1bad4bad336aa493aa1d5839ea77f8cf52797c2d7eb73102e1e9a858c0de35b44a5d44719c40456bec32080ffc7449f9d09a836666a3f8c73c5653c96c6d6a51534553a43b907205e4b8a6b7f1c29e6b2840547ca12f224eac489fa07e1c8c75ccf57cfe81dcd979bc15cda957e091ccdc9f7887d32d169f1b71e36517f45776b23b4d4bc93a19f92c7e1fd699305016d51bf9ea6eff02350e6bd906e4594df114361136b626fb6785f1739830ddbc6def9f56477692ad656530e4776d381b06cc2b749017f578dfda7ac344e5e02078d5c1537df8796ab63a964b541f72738b839643e362bcd32d12c1612dc6ba2f8be0ccf9678cefc2a74aa9cf016de8997138082b5034ac3e4ca264ec9115f73c56e28df2ae8cc8d515a7a11e64e558cdd6fa7c60f0b275b5d4a7faa6d72efde39548af0b79a551c942e2e107b0f3088a0989974adb34cafa38a20ea0e510afa0b1bd385cef2b9f7ca58fd2a2f34078056f8b0583457d3803fcdad4947c9a6748f07fd8d16458850f3e467499047d62cecec90d34129e65d34aa510b8cf9a423d2c58535650af39fad82bd2ba8bbb61ebd61bbcfa38562ab3691efc1fd13c84305df47b694ed9fd30008a7536ce6b8b742e1714bdaacc7113f49805556c74b2b08191e46c408fd54653de052b270f840b6e7d0c6dd785b26452cd45ebd16dfd7ef23948932dcd8af0d2d6a122828d46146948732eaf88f1fd344fef966ddcd76e81841dec398b51113cb98b2177e607adbb234339ec12bbf85182fe31bf68714621c81ce4ae6d019255ec99f39ab6d5ff3fda978e62264ad428024f3a957274704d164058f3b1472b0c65bb927c9582179fecca089484897980e4b55944eff7bdad798badc3a04062527ad6dbeed982f761eb52de53fc78945d1d864875a762886b4ce76ccbc675ceda0af75c84624ddc79e6761eb726112f770a522f073e657ebc16e2bd040bf974281419687f9e6b18e7d58ccf191cb81cc0cc01624e88dfcba77eb0d1051107e4c1a767e75357e55e1da82db46b208b1e2c67c1f5b2414aaefda79e358a602d5d1460edf9c0891e2c7e4bdf57c55296b9c64d62755f20e4606d2a39f1ac7bab5fc7e63131812e5ed91f6a01322b3ced88720055c270ec3ea7edf1be8058fb73f9cc61e33de0bceda1d38f3d20edf6309b3e535d06967fa662920df13dd3a9cbceb5bbf67bb367960644876d5e5ce63a3e9f05b278976a9ccba2cbfd24b07d41c95009e57e09cd1b364dc2ea7051b0d2ab4800b9c6feccbc69c2b4558005722ba1ea61b3eae78034c0b7006389b5947039f5cf88972a80c664f27978a904998f33097fe6f44d1f2126e80cf1df817f87c1e68ae51c089b40da2fd20784c342a6a27b6228102cb5cd61c1221f0c64083fbf720739268ec49b2e0ea96161e351bd6ebc631a4f47f5ca48f38b46523bf2cc0f650f4698c200b5cbcce50578db1ed96b5934b99a01ab7d2ad55b002da4704132b2e526267e9da16d51dcd4b7b4c60e55b959b5daca45edad964b0545e6acff56033970b36f24fe9a491065bf1dcb94b5deb8318209446fdc6f852d7ffbd494f5e515722227d8a0b234542e846f0ac29109c82e97e5d76f1f743dfdb9237620a479ba2019515fb3fb4f4e2572b9d81f86f756ab18ef44cf98913b0bf2d6886df6da356142c975123140a6b3c3729eeba014e02877ff72ff06b54864abf00472a1f6fe3c11f8a374a9571ff36cb2c4b93a0657fcf5d900ac0177343e9f1b00cb951dc8faaacd1ece7049dfd96d70d4db588baf75018324bfee185559b304027da3ebfb5b32ec22616278eb6c14e26384f3bc37fb678c21a4e6f66280d336e9bbbb0725cb4f6149b80f58a84cd9463a648316a9b556b5c1f3af8001f4d788498beaa95c27539a5e61b7aa41dea5ca2bcb02097c4a30daaa4a183af7f2c7314a13e753ca0fde226014d33795280a25ca56b2f9249394cc484350e318a1ad315be1c620ba7b9c0a2c35c7b29129a57002cd26609a9879ae0f5c634ac9c44f02238c03725baa6e193c06f40d712326043f5018959a8f47093bcd29cf29e59e8e5aade7e39748482a3d314ad5e1d147244d6134f539ad3b80f03a308eefb3c919f1e1c1f3ce4df898e5948bb42de845b6301fdea6f2a3c706b6d537168d5a018e909688eeb604925a0d11ee876534d97108352df8a7e01d79daee1611a2c77a7320258dd074054b261d9fb389d21724484566830a620346c63685e45df9bcc8a0a04b7693183317b28bd3333b615bdbad523f0377966ed1c07c3b2068db17cb19c0ae410194d5cb51f906121db6cb29fc7677a98d5e18a941a3561a27d212c7bbf28ef71fbe6b9014b7d99dee141cea11094f1907c08999e56d2db97661ef398c9bfa304639e3270fbafec0fdaa4d4798daeed088a0046870e06d88695de6febbe0ad9f6d0406bcf00426747caa586a5da5e12d3505cce8f731f9c326067a16bcdd96322f0f5326896a61142c7e017d0d140da2b2d165cbb8a838877b9e8d7d2de2c4e1eb5c8eb4b261c2d56a8be55dcf97bcb92b1ae27f292d5e27031d7e8074389af1ba78d0ecda006def61ac6f72c36a02ccae0e0a6c9d50e6974c8a2752bc4fa499b89cce0094fa14fb0d602ce6d90dc6f25ce580d1e0a3f88aa777328139a9955e3633ee664d42ea3dfd093443c81481d1e04dee5ddaae452e3d4f8bd63399bd4f92d2fb3609fce5bc3f641fd8266aab63f4eb22e1a2016c2b0fe395dc45ea17574366db60fa07951eb23d113c4b6f047b28499d9a7111b77af02b7d3a84f07e151a9236a83730154b4072807030bbfa087e35b9eb3fdce1fa78a5cec1585a916dc364c9d14b9f60154a1804540e94177b90eddf238d1250b87be1bdbc2fdb8ad6460b0af5b515c9f5f8f80e113617aeba090c3ce4724ea38e8210d507a95cccb02c35b5aec3ac63c9288afa7c0dafd95154b875fc54919b4164f10ba86039619bc8d0d5a8aa02ea58c43bd08778f90e14a28f7474a48f467ec7a109381863940f7c65e39f26f035fb5f5eb8e5942889f6410ca4a5b1d9d045f7d36d53ba7d0ab83c1ce62c78c6565f64a7a01cd5e62596eb16010dc862f35561a9fbb234e42ad473570f348a5920f05c24b9a5dd167c2441f10ff98f572b6714d53e6d2eb5c09ccd6ff2921f579254b7d60c5061b28b517a4df5490c2a421ea2f81d2916b26116dffed50f90636dfc52606e05c43518eda22c3c6e63e87e4f385cbe0177a389d74a433658ced8445b68eb79d32ec744bd1c2f5954669b5ae406f8c348aeae12d6ef81044de685acae74a9df45b8daab105c911bdc35b7ec4b3f197a6b8c44ed384c9f36d7ade31d997d166768e19247453e368cab74d3d1f0fb047f70412ac13b42beb7f5b46d78442475b68052095b6a82918f2a3c4bc408914ad5d9acafe7e9439b09f07e29679e45db03a3055522b3e2350203d9dde605671da9f6041eef14dd8251aa5894e972ba41fb98311787228e9be533754dabaf0096f8c171e9979bca61c62a5e99726a599a54c6b91dd47d52969d5153e3284607c75d195dcc957c7391318c611d15f10e26066ac0146cce68de8ee7669cc7060faf796f63eef45facb9cec2c1eb9b84db21873cc60aa69890253e1ed2efafa25daff2da3503b7085805a9610ebf3bade1ddfcee16c750d752e9c9cc3b3559a9018656e9e72bc94cc6516b2b608d1f2c764c88fae4d6bbe4a8286819565c9a450ec2cafcbb7be18bdb1c1f93c334185b8baab1a80ec7224c29b5afd508c5e88be691520c610567db88baab72b4dd48719dcad1158a5d8af0068133fe05928f8800c9e2bc96ebd9ea102912ce2eabc816a66355a3523538c045cd52ef4675d199811d60046eeea780422a50707b1ddbd295d12b116360c17a9372059a784e9b60d052dcd1fcbd6c91a3db1565c8a77a3e35aec441e0396efd126876ff0de89e897a6473800614ad52b56cc09f9943f19526c787ad6380f20171260e53212c10d49f4ac30b4a5d04427000fba17ad8facc7cbf2497d73519f04c0fe76839310d13a0cbbfc572ef33838637cff1e5276e8cf6b25cb8905922caabcc2e7e88f7f7239d8d49ddd6225d90ccd7c16204b33668be003ad65b9b229fb4ede2934c18f17e43139be1d14418802572beb0d53e75e0e80f1d8cf3855c35c524c63343dcd1433570be80c4192ebd841b34be9a4b03945bb425ba223ee3a3ee1eb5aec55b756401a59e0ced1bcc3a402b7dc1d48ab9ac6ac7d21716dfae30a5e90b9ad32c511fd889a9a936e83d79ed205f2274dff6f31ddd3b6c32abec85bae4955a7fe331eac3f889c4afeb3b280091aa109935e645f0deb6520fd53d23f20113e541f9f282968a456fc45310c24693aa6085430c1a41423f2c0e4c3a65e4e6fa108a42e9121261187cc5cb139e090550c9e11caec2c261c51f6b76b8e31942aa05481cd717fcbfe700baa83350cb766ae14b5362b679f02095efc80568982078631021386c28d38b9e348a81549cf72230ff19bd83e24e9c736b93cb066ec014394de80b9b0464d85e7757078a2372e974ebb9295b126905c268dd8da3b5c1e84f61222865c2719a791553989c6a6050ffd0d0f969fff6515bd23fdfd922c94a33166048bd3ece4dbda2d07f5c0aff485008edbfaff0dff66f013b254fc3806b814a656d3385e6607454b91a31ad42d5edd3e3cab67aa7b00242ab1764789d26b2840af957df6f6c71be4a59536a3a9d82d3c92eed5d448e823e1e218fd7e980554d34e7b0811c38d17f1c19c84eba80803873e7ea4d6044cde04946e1a183c23d9595ef8cfdb63c4049642f01ab71e8a0df07ab089bd39defbfbe222dcd36d9ed526c41765312e16bcd1ec8665b189322623f5e89122a168957a7eb3009b2d0484580160a2a4c9ed7b2d3d07e5220e2e1cf274f9638cad7eadedd2b68d314f9b4216ef33b03edea74a2b84af2e208476be55141565c842d9555dc0122130c24d8b3651fff9c2e91c7343069bc010583ade6f0dd0862fb4eada4c749a5255cfd2ee6793f6045b4eed0a3721d7bf0522d031b5a1c9f8f9d3ce6be17967d6dbaa9e4a3a79093e8a8577f23bc4e6f7c118784344ab44043ee065d59e10764183bdaa8062fb499091344be5b3b402073bde3c4afa730ed901cad31e0a80bb41f10e00847cdea5ea827446f50f61665d4637c3a6558b6071364c52d9c5d9f7a65ec17cd3bb2578f85adcf045a87f23484730a3a077c7ab0d3883bdb16ca4d0ca0dff24d4ef82dacaacf8e803173255cde4c1b5ddf8251953d9b3102a719e012b531098b210c7fa0b78672cf98276618d03b4524b88dd1d68ba30451de036df28ba5f0d00508be8a0ae7c91f511a2cbeb499f917daabcf81aadfac587ebbcf1c842929441dd711cf2be5fb54cae82ffb7b0c1ec845e0a1f3f71c02063ac435f818023ea9cdcbe9b7cb1ad4d96650708dbc5b929092d2d95c03e6b3978e484af6da6191fab9d4f286ed8aff0919fb60e94f8c57cbfa23bc98288b984676d9758068d83c4ad5120843124ed544cbb3c3a8b7924d297e49feb075d253c182e515482dac13e869498431c3b3a8828722b9714673b0680d4f532543f8ce3f1c1777773c4f31edba509eece5723d989e083d0ff5b867a3b03e5cd222cd8a3d174ce348c818dad221e9f68a45ef4aff3a64fd205b66e19a0f4c4df8252ed05d8ae5c87ec213d3300239131b6bd0415a91eefc968a4682c75cb29e1435406117142bcdfd44eb481e29c15e7ec59df13152e1f866077ded2b286501959b454d9f021e488c1bb6953d570a89021533ab76827cebd531dce57acd7abfa4f7ed6c92bd01e8efeb1d05a91c2e0385422abcc6ea80fdde8032219c322873d5d782cd02435625d953c4e7d81ec8702a761853b3d2db53f7c3a76db43ff6187c414a06734db8442ca12e2016f4c2d5e9be22cb84e6e0bd7ec9847b0fe561223db4b2b831974bc3717d6529489b919d132a3113569573376e45a2c901aa671703b5836418bdf89f0b780b61b23b2f8d9634249cb6dae152ce507e48d4ca69e6ff07fad8227427b2ba5696740c1f59c754a973baf93bfe087a9151db32ce98c83d04199e49c22eaa9bf1495ac30422ec32895f980d28e19bbf34b1eab929894444a1c16097aa887cd39debf0d51ce98f236ff099889d053bd3af9ccbc4f1b0d0ad321939b23b5792fc57eed89da72187debdbedb7ff1ec4fcfde0219a5dd84bff527fc1045413c7a3ccd519bac1bd51db248b7faff5dbaa4761d696f39de5e25e53a983fb2fb4729a145b8468c0bb4b13e509c42b0638b5be80fb14bd3a9f59663d0c39bb7b412ac062336887ea141ef2d42d65bf20f83f39240898880d65f488417c2fb7221d6bdd72f12dfa47a8248693809b26e1665da680adcc0b2fef2618ec3dd1c71700650bb11bb85d5144cc36baafba6064d512df3c7b6fc726e94d03b64adce7f5c28294610e2ea59d02729bdbcdb5ef112544ede7316c4240e034815c7e0235c62980f6f1ad4d71c3147d93178a641508df59cb5c9e527cedf25c7bfd26ac01236df81728635628910b4d2dd866b274e2cedac19c46341f875104f190668746e835283e2acfd6f0ee7b8f622679b2e97ffd65f48d11cbb97b0a80a11f190bd7702b056742a22a642cd109d301c4444d634cab0201ad8fc7dcc7d85c06842ee6b5151f2db4f55c86bd177994e05101282f77ecdb48f847e0a42c026e4f2057ee454ce50a88200ba5bd9251d2494ad52840b1714bf73b4532f360ca0e66c1cc46602398367b169a9739e71233ac79938298f1d7086821517060ed4b2f446ab8d41cc51bfd969e6ed2b573c8d5e52128fbed2b4bbfec767c52127c9df30f1854fa92af96ff9ac26c32f00052f8566ad31c0e159eed11babece82703dae449e25f0328e2c7bae562207180a98b635adb1b9a7f77db8428ee1e4acae4ae537d746138e8b472b8b94f5fb7a4db017103a9955d70301c0ff6f1524d41d923701e15db8ddc41a56805779c8ac654d162634bd1b2aa48d2d2329d571b4b674c6e6486c1993d3be90d1c752917b0c691a1e92abf434155ac254444c238dd90494f3006cd84737303e01946383f2f4effc9a32f1fa80f093e42674f425692dafe48e36af433372c3a637559259e36b699a0463f1132b7c065913249ba8c9431506b3b031a6202c34e805b6fb91c544391d634fd1a8d1b7d1a61763c8e94a7012fc3486c02106b98d2720bd91ca632bb1b1743b7d8b0b02635585cabc04b7572200f5be703e11d7f9c43c4d811fe8cff061a31d7bdf43e564fa401e358aa8d5671e2e5a6e488b3a1dcf1b27d65e3deb6f5721f21340c0f7d5c7d5274a8e365e7cb3d14fcd5421024f63758203829a529129e931814d362aa27802ff5bce053521557b4b890dd3353571bcbcbb50e48a5b016748eb007dd03b46f6482b2376644642916811eef614e841072c7fc37caf38faeaad493a4616559c08f14bc02b3b52a1b7940cd4f8b49eadf3aae2ab5181a84a3a78610c12861d4881f0c6acadaa31cdbb061e4111af712b7c95434c74891576bd541eba319cc6a728fbfe877cb46afe45f906519f5957029aade11e425dee50a6d84cd16ced58950106df6308dafcd566a0f3e8e4a954ec1a5cb1a203ec9686202bddd51941b23d5ac430ad548404e161aa52ebe92d504b49790db56e8f486340d63c3f180e4e52f1bd573b58cc9cad09aa796bd5ecf716568cd8170428acda2950179bde5a1d5e74c45baf114c2c1e93a7a7716c1c01af67ee6a1b3e752a9ee3dad1748e09544e98339b943839822992b91dd448d91239c87a6bb46f334960a27242de2a5ab1a8907af9b767ac92874caad5209c44a15780666d59fff70833289bbdc9cf7c68ed936158b1ce959a6663d987244ca7ed30e7f381b53100a02d284ce48cbc23ca826fa33fa0fa77ab266ac092b05e566f24169c4237fca70a8877793455851d50984987019f90b3167c65a1834cfa7c84fc497e9f1b78e334b0743cd268c00c13138b50b70567df6930e607a37dd7c7138588068f2c5f700eabcb00c44b740e335ab5f868ea988828b69be6add8f6e6d8fe45249ea54388705c43946679c03b36b95f910df7666cfe6100c179045b2714355a508b17cf85473eb1dafa4faf7ebbbde21f0debb8e6e2df931a05ab239954384aa2fb0e1dd04fb968e07a4b409752312da622f720b9eae924a9b5b30184b0385400890895a8938dad0124fd84880f2065eb2eac50b52db83c3154c5ea9b2021a255aec61e23cfd52ed9bab101639245a190c9d12a91eb541241b0b799e3dd8f1769670c7ac71eb032199a2dae564f609d6da0951f5a39957ea29481a66b37d2bb75b437c7b12e935ff421824307a2d33cb5aa6002da6526ccd7087923fdaa70d6a6b25eed3332743c9ba93b5f4b14ca09a8210c34dc7ec0876981bdacdbaeae86132ab5c0e8b30903d834c3a15696e8cb31cc89e5136037cf34d4b0bc89b4ba585081a9506de8074cd859c1ab894b834c90aa853a9766a3b10483ca2c179b0e12fe06b5b47798ed79b43934865568a24c21fdd148d194177c2f389921a070ddfd7670bb3a472a1858b15dc303671ddde862832dff5e3e010988615fe44b4dd20cb6df84b47565c008d24d15cf75b250611d722eaa34f8c32c12aedc17e0613c1eddc288a6b3e1d0c1d1a88119ad27e162d68072f13f74303c16a11c8c3e4d12ec4e903c0ce84cc79192b9a0985c438bef3910dcd41d5cf3ff0d3632c0809ae7cc1b5fcc12107dddd857b54cf481132c074494e0873b8a24cf80f4a90b2197e70d85b9249205404fc74f82dc79dc88320fe2fe028cf0f0eca4eafade49d200c0913c74f82809a9d2a7c0647d9d50986045baa0f62616145663704363ad207c6951a2f06ef7c6050b3c40d76bdab488dd66049eb83b834a5ffb9c1ae057d99fdd2e5c0b9026f94d04d48ba7c530063720a720e10b9fdfdff3228f2241fa485409645443bc35f8da8feb49a808f74aad9c1a474dbdb2b57090a2e6376c099099930cbc4708d201b140168d8555d96cd7add053cb7dc55f805b8778da0ea17f27b54be908125a6a94c5c7ad0e4da5e2398d6999ac2f773574c4884b387428d803160007b61ff44809c591389bbbb0dd4ad910b826340227fd16aa8c48f18a1a2b8d4681ed358ed1014f7a9b6cd7cc48dda30364aab67b32521ea5153ce001ef9714f28f4c193b927341d0905f174c622e4c511268f36ad0db37e4003f0dfbb06cae6310d5317753474999814a9476aa10bdf385be4080024f803c9dffcc9e55b0087ec3106c74f4bfd6b4d8a549e46992d9e4b40c16eb7c5a1a9e20d96cf28a0bc757860eb538182e652213c4b5d6c283c0188b54cf16e11c2f80ca35cba4dc004f369eb11c12ea093307dd33de40f7b1f57aeb0565dfd012170455bbb489942c1addc2dd94717e72bce5f922518b07c017fcb16a921ff2b11f0064acbf730faf965d5b7287b3e4227491fe00c553ef4bfda6878e899d1a43924e8faf23ca22585e7b767fb4f17a0b050854aa8d71c1c803507e60b8194df331525f43fd94dc61f5613f509e1a6acfa3a60101ccef8fef14b4ebb3ec187974cf20b48046c828e24ae57407168b4c8155f24fa6befe069343eb598b11c3eceaa3a074a7bb21576598204e6320bd970b8317cfa284cbf21b23faa9900b3eb33106e2588396e3310ead573cacfdf8371884ec3fe38ad6f32c17f9aca164572824d66705a1f40c170b655af9c8b7610a50969403a43fd616e3dd171784bdf9ee6a3777ebfaf05761a14fe42be2c7016ef1e3e7f7c718f82b53d5551d7a74f242a5eb4855c987b21484c9018630a2a38c385d87ba7a6386c38720e27e242db248c2f862710f2b956b766a201738f7b284f1cc3774a37e7310227550bbbe887a46376a10226f5a31e86526aaddf9b00cb283d549742d6ba434df4e7fa03e451e1a9551899e10c98e06bbc5104e9b58777fd9312f3cacc782a39fc5428e1574d12eec3da16b522cf3af5e8f7b4cc9399dafaaf14d5b0dbc6e6eb32cafabf91d22cd518458868d2eb99e3915b6e2c1b58cf2b80db0481ec0243b3e7952e7137a380edc6d44af3193e8391ed8528a7dd1d043a9fdbb397f76329d6996197d3fcb02eaf1204168861ad722c71a5ee325c9377dba6af15d91d27e14a1d7090d6494cfa139844287d5e4e4f897fd7ffa49caf29eb0e07aaffa15669325292e5d8bbb8fc8a6abc18ad3d65fb5da698e5f026aa925b548e9f0d2bcaaeeb432a59c8544e82b41212af28ff14e05c8bea6c941d74dc9dddab90f4bc875d312a4334afa6fdb67cb58d3a18c0092aaa328bb0b0c54c0997bd394f9b19a9d97b62e43da61d362ea30eec967d0ee395c8d33164c2d3fdc9850f3266382e5404e616ff64c21fb6b259c1a3a930d872b87900a76f8dc4a163894623439dc401cd27763f78ad202996347d980b2feababb40fb81d21b6eaf6d84d0e174cdfedff8f0cfc72a4b71533c3960d2bc6e565cbc6b561bd0b8df963b4875b9e152d66a412a332ae1e238f781c9a047478c6aceeefda613d9a4ca2cd50c52a39fb60670500273820b162a79e71d5f197669e790566a05de8c8a1fd48c6fc637ee20d9113d2e2518d0a2892caf6f7cc49f80437a6be718bf5760e63eb1b85dd5054f2e1915b97079f4aaae216517f2980469ca7bc5724a229baa3ed771998dd00b495ba8d6bf265ce497aefee5f76dbfaa8c6152d528283e49e6c162608f7dcad3abbf21ddd25e1b682d804a0fd9ee5b2e18feb5450258da4090112050343a482df1c6a224bdd51267029f708a2dc08b8103a2c66a183d7ad72d70df41c9d95e2f37fc904f9f53ae9595438e8f3eb7316bf53f34f90f72e45ee377dcfd66cc04231ef996b369712a946865434d99547e69a60b96bebedb89a5e0d8c83b1562087bd9882bdfe705bc02a90d86658ea3c7862b2a2f8c2a25bf63c1883be98039cba3696d36cc0318c83f918ebc67ce683e3115313ba4f4991447d7380b8f86e86cab10bc23e06372563223504c20097909030a59d735372e177e94e4467669c09194609038dcff4fb865c17aeb2d6f127a536b8071b7452e142da47a1197e1d5c1755fae2078b3562052dea75ab831267a4a7a4e2391dc05a27d525afd11e855f9e7530142944db9356ca2a69749d0d727644c6028b7395ad758f2357b0521df1645b0cb3a50847c806922a84e56d85565582a82a21b7f978d8166a1843ce2ccab0a212fa5152ba66a5393a52b70c1e52711641b6f2486d9174b15acc014ac71867fb49f5975ea0b69168282bc95e1a0efb86b1bb502fe9a662f803791f5beabbc971135b3c99d129d7dcb188f810bea984117b616a6b808f15e96ab19040d82c363b64d8c4bd721bd365b18dd8ee9d2802cb9c4b5d10c231a0f98a0303dd5a73dfbc7cb202499da55703316890f5ca9a1104ac8cbbf6c21fd035befdb18f8710740dbf54752cf24e51359305de36cf7a0ec236b3274e667f46c8a92510248c332b2102b98339122da74524080230bc902ba20475558233922afa781160a478fdf2ca18bff14326a957cebf0bc5116411692df231079380c57cb14ca27301457c436f11a9a1056c247840c2a545efc360a472dcb151d039f0adbcb473989a72d718418b7b0eca395eb57da2686883bd5eb6f2d20ec3a239b164e96bf54566b0d05f23f4468eec0608989d2c034dd580217476b955d3c49ae4f43dc126fd74b6317715dd2671936a15db58525127f97acdb5ecf6c427235cca2fa8bc6a346789f336199a3f94c536e09c4fc028dd00aab21c4ccd9e2aab617b332ba4fc155b5f1bdea2371e35632951ec5b4b288b953051504f22ac036fd5343242c1f15789de861465f3aa1d1e51d12b5cdf3b394240f09e171cede3b6a8c747d61ee8d3a0f129e96be57347f7bb8bee352052f59d7370453f0c2a64c91c37c9f3d7ba8bff4ceed920798d0d676e0034c582c95a10804db4819efd4029997912c863b2f4af5480349a620282f568e8b50251ec8f63e3c48d9219d2b9216e2da675a66c3cc5e8d1bbf0d94212c4b05e5ccdbfd53ff226bab22f7ef29306f00c91aa8a97440f765691fd7cff3dd2f75a5992badb0e604d98ef7d481b006c5698fb7cf5f52be0aec9810b4599107cafd8963dccf972a8c405a7e439ac5e2b66cf03c14f42041ea240f9737b75b846c397d8218a1b4857cea8e24db493018a6e9ee84f3b6d880aeacb219693d2ea0573b13fae804c9e47901e11b3661ddb0ec3b5491f21387a1d499dfa753920740384a34a52f5dcb325adac2f573006447a3e8ad5bda27a8e4c3a17032404a6d0451e82a1873b0b4463cb1b408a85fb401c85467b7dbb907378517157f1b422485119680aee22d89f9664779e0c315ad7238ead3a2d2b16bfbe8b05dfef2adcef60ad683238e21cae11aa724af1462dc8a6d18eb1d72abc8afe01be8c29c589ba53d916a4b6121a9bd4ed240c24121790a76dcf268fcd603776ec5931eee4757ca09a4212dba27bd82499f28bd1b16bb7f2522bb9a5b91bcd29eb4c01ee4ab309a1aadf0db24619157b8cfda9bc52283171a8dfe79478a450f79c042d69ca011db2916d220cc7c68c67e6721d96abb72ad4bdbff5f04c939926e56f34a0fdfc56221f459e85178522e89e91c8cfb176d4ff599123b0bc20d781b0a1042c2588a230459558820e0fd8630b00c781a67215e290447cfb5ccdb6b575e2819fd169859ff59f7784ae0671125286acddc11ad1caec362302131d47d0ac48bff99d68227d873daed229f767ee6f88c3912be820d4dccfda638d4d3bfbda94b82cac71f53d17bafd79b1865595debe81975cd9f9d7016f6ea3727bc43319c595b7dbe292464481c9c59d295dfb618e756e4834e4e85b44a44b85a010c60bc8408bd131c428eced2ef91d3a24cde51c5a62104879dc8108cbd56c85d0a034f47342f4ed6da38640538acdcc9a7717d9530c0ca148cf4001089dff412e8a7bf463b42334638007597611a432aa90374fdc518169293a720746ffcdd8bae159aa53ebd4ca56979f72ac49c896fcccb79184089f7cfa98acda76b45ce7f67739c2d6b45d0b52278f8f3e62f45069c3045e1065ed156d78aaa3fb1e250d78a5c1544055e08fd6b55267dda8a9be11e549fb0986672d4b1014e857164a2ceff2e89e7df982afd9db7f9575b3198f818836b0804f1be4df3998b2dc127f6e1c22a6d6dbb858137cc4de540eb1d69d21da20e7dcdbcc6be7ccf7c528888d4b64a85239e7b54107fc4875c548ad322e55c9c33c8262af970704283418a2d75c34ab46c2545335bc825afc6b922c8dcf401c6ec596b63b766f0e8e96f554e6c0fdeca62f1e6c2bbc5b1b500beb95dd4cb158dd86a21ca53a901c9a897a213af168bed380b3adf073b08f2d7a900b285e50173a920ab2b04bc022240993a4f4f3858979b5a31f1b0112d5aa9472a1c5a9ee48ac626782a87abf181a14503e7aeac804cb025b75046f279b265cd1063979b957c0080c2013e1e75ce04460dd05e9a928cb350f0e98f824ab5653175ca68401b58619c388db9d500062be8a2e87798f267d9cbfc9423790f83178700234aec5a3e41f57ff049e5657530ef2e9e14b3fccaff5c926dd96f534799bab83eb9ecf057b27b20869ac9884636cb1b0fafdbdf0f1f7b8236d0e323143090f776c390581596c9000ecbfcdbfdde8ae017b9b18a5f28f84091d05a8de3cd57127762e5f7f96af0bf0bf16c697dd1c0077b93c132687a45623050e21b17ea7270584a2367fa1bdddc00039d31c685a3aa6bc92131e2944cd1871938e344c0a655616b0af72f115e06231b0f6d8ecbcdad45a84fd2b876bed624dc25002ef62c7ab430c4e07650bc16817f81d00a7dfad4f5e04eb91cc476d5a7fd12339b19d25c48b6d674be35cbf3c4211830acfe5f6864c9eb73f9ca254fcb58bd937234b27725de541db94a04c62954dc9037a83e1677d4bf74b7323e273b4b3d81d36568a880750b468144622a4d1d4ae82fb9c825d93d9aab0228fb4077c2eb6964f176bc7ec027563a005b7b18e093760f02005f87dfcd3042973809d88cd7e8b7c1fd06e6ef9ebb875681f8c67d270a356294f814cb019103eeca1c8b810245b211ea24e02be48c661570c3268512814dbf7460fdedfbb71654cc3ded90e284b605e734e8daf8625739aca0617b2a1c57da7365cdbb038d597d7febc2bb2b2f0753fee6eb2c7897e56f883d3701746eca490ff57be7d9b3ad9890f8608aa9a69daf1c89916ba4cca9dc1f165596d587f6c987de304ffe18ab0d17f78ba648f3a8756ae883042042ca894260001799e5689f2aee54c959723f305c3c868260e23b04737c3c6c437ce0b7bc614c7a017614f957c8c7f5c31840220da38f3b82c289dcbe6604c5a63ce70ccaa13ffad6e58fae0fcfe97ed18abeadf0d21f593274c07eeb57382717c5ea49cd875a313dff021041e02492b85c9852620d45fe5befd3a5d7924ccf856dbd330841891452c8d73ce0bae2e24fb8e22c70724cd10d6ad46e46bfcdfd1a52dec653e525a5439edee21e25c9dbf1d3aca1469044337fff94b1f9cfdacc162dec34aad7669f2fe058f301d23b81b35639ef77dd71292d61f855132ec4966661962fb1db03275a23f30cc92fa98297a88ebb4b25e9f2a3b0bfe5befc7e7d70dd87d27b36e452141429deb968ba95dbacc34f36a1b950bb6d715097ab1d489cfa6c23e4082df2d3c424a10063959a3764d5e16c1b5909d67245021e54d12d5f078a669072b7280c6395aa7468d1bb17e7563612c0bdd819c00596ccfcd1a311591b0acf0ba8405b9b8fd4fc3ddaa211adfbe96d42949ff4e878d0286fae68478d1c01f99fda51efb811ef8f5612f1aefddfc8935337c398975d501e1ccb24eb2bb90ee727c7478984523f4a43b15a328690cad947a21494e333445975607330ebc9eded61273d50358a0b13962ad15238d8a4232d52b39846a65d5532dcfc293e00c26156b6645c1e3084150a126d7361a994601124df2ec4ec26cec61be1ab4e0f723e79324caa11b11fd266a2b357134ea82c883c94ebe32dc5511db1b93e557a6aa4bbbc9fb882e8956bc8e2b0b14bf00a0e2258ec3ed1ab85c7dd17c902ee4c4eb5ac813cd89a90b3dcc8003dbbc3a237514ba81e15887f5d0086ba6097d269bb5d4e1be11ed0f077ab4aec1a30492833758d1022ec668c87f0515d91e7071a753d27f04c9e5de228e571c283b8afb4356c353837ccdccfb4a87f79c659adb1356af2382bf4aa37574f7c824e1af3e7f5459c3dd4059a71d588b641b7d447476374ec1285522046fc508dd357153488af4e714a7ff9c3813721d5d21aef8c841171f68914b16edfccd4f198eebc17dd1c19514eeb1591cca3d01fbbb1cc9e084e3dd5951c9ee2d4577b0343b5d5aa21b704cfb40ba674dd18e7713582d8697dd8086ec9f1e4bed9bb56cd30e9b9721883a05ec27d39784eb76bb886d5972f9cad7186d64637283db982919910ad0b98ecf0c047b41f6e24c9a9958158e0e785c38dc806392428528de9ca48fb8534a0800ad9d576794812ea05d5076617ef6e5d76e9a7931edd77efbb835517fbb428e3ca53eaf808d1f6dfaee3e8f3630e7a06f203ebb928442be728a8f25c2b6d178616c45f94c0416dac64aba3c7ee2ab7f08995e8d80b93c7968e3c199b5809d783dcd621902383b4ed5a8904c05ce50b10bd2ac63885ca9a5d0e4b6e05a0e2f4289716df3238f82527728e72d96ee9bd6cbe772a4953c41e1d0a567e371d85658ae58df81ebd2ab23cadd9b62c55b73ec66c8cc4354d58dd8e2b43d3eb552f15bcea73a9483a705174aa56744d54d48cc196475862def065a2b76f46a7fd024956d8f7fb2b735a6ac10cd3c66814bfb7e5fb1785b4b7ae6b256a2fce18f3209cb56dfb169be093e2ca526eb355dd7c48da30e411a6f94ca44232a973c49e3371d594ff425df9809250426d6595df2fc218e7035252f94029bdc20711471d4f18aa67a45c67092530ea969bdff785b78c0ff6eb18c3743063c0a3bb65f47840a184b3ba80cb749a2a668792909abc643c8c8923b685cb3d5260ef505e9027ab93f1369cc6fb85722abb326c05b0317e76283375de1efa946d0588952cfcaa69e354d5b769bc54fc56d843493451d4d19ec000163ca6e843095b11232f3dedcf0ec9b107b06bc334cd8772b93e409479ac21e41ec011b069559bdf193289344a8816114479ce7ba35edd2b72a3788e4659907811ce94b124176405ab9445e44304e565ed6c1a01e5962a5ff7a1d9ccaf1ec069716a643544b1e30f7d8b1120890be1f304667cf1fa3ea87b7100f4f0f95f55faa2abce52370f2144b353ea6643ddc7048b8d8922f6e94402b5620c365ce76bada0c4440c9d84c9280b4131147cdb90ca9653d31a1a8a035d436db769d44276a37ecb5f12a618033806efff8494d13b8348f981887456331d7da74771cbbba40d574fd8354ab1234f0e37a41ec9ca58a75dc18b6905cc15dbff99daa7e0feaaffee9a2d701eba9d9180eab2276a2a628d6f87e55d2d124045fe4cba8cbbf914e9a18b46eca8561a9da837dba8339fbc2768820d1df4d52b16ed59a287046bdc723a04dd300df3c29100ba15cd842269eac42a83ae422f6c8323afadbf9dcc726d0248ac18116640240cdc8dd806297b58ea9dde565843453b290cbf36294b1e80157e252da1beba06bf9b7aa93de8603892b76ddc2f56c7e59c6a411a31afa3a56cadf86a67b59dc7d6384f664aa92695f2920ac6fe146de1053620c9418c78a72f3dd53670df01636843043011fa25d401a2503bd1667452f05adfdf1fbe8b7952c3edc65e3222c2f520b0db5c43c2a5deb071bb847db7af3195d0fa9a92fe087fbc902430577ea593a4391bc2b42e9c076c0886c3d9257ac86819015cf39b1a2979e89cff116c0d6b476f36096d0cb2148da6aead967177d96fbec8bb95ddec2ea57f89ee032a97b34c751921248edf10d7d45aded1c27d5058ee459297f15bae7c3ff5dda15e2e010fa69c5a0674b0418a3b675e5f94dce867de8fbcf982167d73d83577bfb6965f23f866ae60517800059df25201394857b9a4b27807b5724b2fbf2dda939b78c49ac1447c1b9feee7d9d02a8f4876ad253687efc1910d8d3464d127437fa0ebe6a6df93b2cebbab51710d18c4ac58f87c1a527b189f26f46829957af09064562ea3e33c67efdba339bb071a0c0dcde022871bf2804bac25b41a1820982495edcc9ee86607525f559275f2d3d6ad6f2e542497b2b9cd6c4fca04866a0b476ba3abccba6ecdc163e1a2e0d571e8ca1d704f8420cdce1ab27f6d3be7d53c8595a861a6dc0a5216a4ce55c208a22885f6e339988feacced0bddb7b6b02c5ea079dc4c053397e763fe36290a4135fa8b32a16f7fa82b778b9d88e2544570a58f79cbbc9f5f7d2779d0ea2f6ec537e0a9416587c9555928a3665e03f8cdbd8b055a429afcc8fbd6a88c0cd1cdb3ed28343a3050a7b89bb850b136d59139755e6a36af1645bda4c504259c63ee24ed934c2d7646465925a4664d6a5b17d39807a613f04fda2814086a8e1b1baff2462278ea7350c0aef75b50c3bbe8e2be05d407cd1084e0d6df9b6bf1996233603913fd6fe76a112b361aa3327dd6d697f0022e09636d4fb5f567b4ce8521e214147fec858615e0535aa6882fb5a0540a677db2e8ad9c4101e4b8c79dcc1279fef5108af6858116beae5093a778f7420e329fb74d0afa4bf069a34e20716559641bbfbefbc139197faf1c081223b88195fff04e3d68bba41d0f5c7abe60a550da81f19da4fba043e7165e7d5531b5b6f2c74d8a095ee9ea5294298a78e4beb994d53c4250bfa1a4a2a60d105b82bb00654d53f48f3c5615ac8eb85661b6157ac19c3b1ba386fcde1d56eeaa4d58ba436919d7552341dc8fb4e0aed5de36286e02bf40cd27a1438569d1bd1e50d8d93599f18e5b300ba9379ea5389adf765116ceea101c9f0e9e2ab52e12c820411a67d18391441e51009ce6f4f06821bff5b0b1da2d87c10b68a3f61744dc94242fe9aab9f64f6c29481fa0948094ab330c61a7fed8611bc2c5ed2f6de6e6b7048d495c7addfb13e081bc6dfc89e22b35d8b2f99a44ad467bfa6eb4aa18cc39c0277fd9c3be1f1936001c0152cf019df4749010ed2dbe561785ba411b2e25d6a97df1932ac8483b504f2842064249e2cb4ada26cc3d17f624652a4a48d5172cdbdc312bf09398a224fe1a48b1969e27fc6ee6c693d10e1288351ad2cb5de4588baa1fac5f5cd315e7bdbba8e12baa78bc358c96c110d4f93b06f08945db5d40256956220de5b3723ade79a7e49a525250cb8b0aa04c9a2dd21cae6689e39841fb0c97f89c01b5df616f60fb323d146187fdb35fd65c3025b8aaa28378f40a5d8581e9d55fe7e851427ec1b4be83992c244ba8dfbd515764b524284e3bb25c30ab12e280df68d1686146d8c26337945b2da679e380cc6879f5ba99be41b83b8d9315c75ae2e223a66fd50ad4e81a4affef05784c8abfa15d10a89558f0d23a11b7a1a68001504ee4b1f24aa16565d55c58a98ac199b3fe3aa0dd992d62e2a1c132ba273955c102d2b4533c4f39dafeb28b94941d61cd0ddaa679e63919da50a975016c617776b6e7a9869e7161f44479652eb4c49ace0a777dcfe53ae5ff3c17fe59bf82c0b96ddb8e308a0918de856d070c93ac6d123b28122c255ec4b822450087ec00f96b0cdae3e84875c4290d843e2b6528b19818f1dec24eb69cb11362e591e352a7ea5f900fb0e24371161caba8b7b014e85d72ae277c1eaacc3998cbfedecb6121967afef66e27cdad5a23bd351e9d2994a2a2dcb7043b33ec5e86086b0f6eca0c55c7995f8c64d7bc45a5be5415281d80e511d8a390e75185e5aa425c0b1d3306381314c2d32c30d439a263331a938b12fdb526265c6db935cce59d01ec7ecf3cdb012ed580331bf34ffce3e2102b8115a099e5f583393f058b6e66617424dda862f48782b7e7fe518ab2a43c5a5dec8f9b8c2ed6ba5875cc60d332c2ad8a0922e3911b6d06ce6478c9bc95ffb468182a760b9a4c7929ad3db190728c085d7cfdde886305e8bdf5fa654053a9281ad9a5b749f5b08afefb50601b53924a9f4cd1063ef92dde5c4d61379cc32c1ece0fbf87c97f3d9407a37c5d9b2f4503facddaa594a9a701aaaf936d685f0d30b2edf24f1d0b4f772bf39dc3d5addfa074aa17eb58c66d767a8034b12705da90352eca02144167f8f2c4bdd4d8fd7d4d8bb2d0db4fef4c2f9dddf112c21855726e3b2fe5ca2cd485d172912a587832848ae554547307f6440b3f43868e62fa69a2f7fdbc7a4c030d9f120e9d609ab07e410aed0d6e5d9fdfbc3768e620b2a5a2ef7bd5757616e3b5eb3ecbf74896e46794ef5b07563c4fc27b9d86de7bb07d75799d966d8fc6cf25f0d3a61eb041029428d3eceac0f0a64037e6053e853a723dcc1814d3266fa6f5c1376ec6f745087f2ef66b80f9c8a1294ea17adf5491746932d2b275943562f8e7886d504028187b1520cf763eb1a47497affb77e8ebaa6be024c2d5fbf23667c21de17afaa193ea3dd0287225b874bd7961adf1b66b7af3944986a96eecdb233bfd0969a5d8ea1ef957f848e43d7259f0d153348e021f19a2262e687c4e65ed42432784329ee09629ed30dabe8ead953a256681e5f063d27c17e273008bf99748fe31e81271bebe1f9ff156992b91a7bf2493295aa2c83cfef57d5563da04c6574f110945aea1b76d476a5c9eba662893ea5f4c9a84d3fa15bb2d93f9e2b4254bcaac10b71ba33343cbfbb72793aa1c7c2586d46ba2169837a800105b22ad6d87458758a70d5f9adf4a97e31232eec61b17eca70586cc0d5060fe69d41153fe4dfff47ffe117368a37ea61142d2494cc5c1c4e53e610857b29fda30f3a4dc00c3e54e2416e20d2bee3b23a739a4283266016564d7edf0eddc6c47a42c405d9011d942341f33cf4dc4fd79b644713a15a90ba206db550fb7bec4bdc0e95d503b5b7da8a28e409bde91e948d7b96c812c54a3af7b6626fbed45a010c0e2aec1f7f91337a0caf30e8485f9c25bae12dc34575cacee1d0428e7e1cfe64ca08ff69a4b31ad2637c61b3d6d591feb200c756589f6f6e5eb999c9d11384b89324559535b0af8b6d6f19d6fc3b6fc8a687c651dc98928711939021c0e0eefd1a3e8d358dc0e82e009cbd327710ab14eeada4daa6b4e742608fd14922f7cf921f0451e1d90ae30f971ce4a6dc37cac37c4c1c65b81c1d8580ad145518f9046e7a1e571f9ba56a890b98d068b894d3661c332a092d6bd4ea91bf96727f54f76b50c71b2457bf238a4887e9b43ffcf0286bf5b12674fc0dc78ed3585a83fcdb4408520fab419d4eed43a95612644b8946d96ed905bcab1224ea429f6b6a8b4a0da6959b981da78272253e1fe4ce62c203925e83fea9c61a08beca392ac2e90c0c4af0801b8a07031e0d607bbf02a1ee76c952a6b4220e029ab1ce88db4e9fb67131a8bcebeb44925f39c4c8ed4e6e5b86570f4473b07cce6fa09f515947ef75946b72ffdd845b137615cd38ecb4ad1bc5251923c26989b3353d98a224d24f5eb1304109cf78c8597ba5446f37bc730c5b133bc314e0dd73ef95590f9b776ae2041d90ef9b95720233cd282d1f6583c537fc753c665922069c36951a3402ea8b21dc44059409b279c611ecc28e23bf3d06155e22cb317a20b2a1f455902faabf6ae76758959858c011ffd2c82d3be31d9f713f623300da40a2c06eb9facfd9f29775e5a7c4726697b626eebbd5fcf9b4e6ff4ed67b1be406583e745297ce8f3c7dae535fa128e14f1ab497493801177bfefe5179c6e8448617e10b4dfbbe928832ebefa757f24a4ead8cf62a931d7cb9756d74c7bbc094b3fedffddf3f72ff44ba76780040b888d82f44a640ee0745174c9ce15aeb9c90041bdba8ac620fdacc77396a83564bbd73ebfe726ba21fc489fc9d387e019a4bfdfc3aff355a5f735cecac32ba21a7dab978eb7ea876d4da7c2e4b9cb482d6e96aceca3b237238c8eb90663b969569535d14563e7a113be76026ca72ce3d68dba0d56003754e06852b51aed87abf1718b6210c95a174f041ecc8a4886ac3c5bc60d414437add7d0c1666ea6f1d9cdc9a5d01dd526aca09b6c7647a150f0e48495d51c1e4cab59581925b78317a2dc58723bf846dd5091dd10a1d9d1d011ec1657c983be82aeec046072156577f425710354ba939bcb5432aec5f23f1c01ad28c8c332a8de6e7f92c8834e9c28f7e5f85e5514622367e32470e7eab23646d645775aeb22dee2b3488eb0c5a0fe9fc1582cfcc0a0472990714ba69bab9acc8061b53a0c2effbbf49fd72aa2bcad5dce952b01c31ec40d7b9505f7b655c83540d50498122242dc640488dfe5cf6936a1ce6802229dd65bb2282cf40566aa3f9ce911a6a940c975bf2bf5639f0519a51c41b93b5c077bd00d1fb45f2eb0b6809b593caa0c8eb08af9cec2263922dda4efdea4b85291db299362d19f8e2614c0d16269ed471fa8ac10d6253e101ab016b6f6fe462c8be1afa7a979565a8537ed7084301355465640bd2625f1b5744626bea153f573a5b1ea081395671fbe50efce3ce1303bb1aa3e1437b870555de02d2b8b72935c11535fb3bda55eec660e15f544d895003edfe0deeb4e9e47eb304a14b1852d5203c88149e1e99382620a9278b8d85fe96f66e37006377bafcf49bd0137527eb216ccc2ea176419469116bbde5ea6809565363cfc0ed44ef5ca1234f8dcc2688dbd5ac4939da37ea0d80e035401d81e404a975b65f20e8ce2986e4bee86c507babbb4ba05d270ba021bf538845bbd071ee3743dbb63a451d336397ff49afa1199070b53617e99afc1ca50051458df0b89e5701c2b4185f09f0564b165b95b8045f065170fb7c874f460365116584405d4ad01e256ac06466d4ff296ac7631fefc06ac5d0663ad1e80288c6b57587684522320502a22424c21b48cda3c532f80c6bfb6499a67f9a56d8ef75a785c7c988e4a4e814e5139e517101bd5b4bbcae143e94cab769dbe4f5a1ada3424130cb5aa20caa63f36b68f9c4f0d89bbf3aea770524b880984d94696d33a820940efd400e6c78f7a0b615c7003c63e0838e8a1d0d3edfd1ad714a9e522f4999816ce22af2cbc5a162bc4c9422cfe6e248d811843d678ace4946983a2811db0b036fce56d71f6011ca18c6573c2708a8d1acee38281456fde1cc03082c406849daf14cd68a8ba908e4430264998bbe63fd4f391fb037dedbdd0d5eb7cc6305b2442d2e482ebb5e5ac16226f9dad0b774caccb134a357e44544baf49ed42c35234e4c6cb1149e93d12a31863d8ccf1b9b3872411db2716154fc198ffab802b4e0aebb163984940a80f31b175809f222f4a55ecf397f2e51cad953796797a5480dd1e1411c3fb91c87916aef49757e1c55860b92ca100e05b42a0c7828360a72bd52af2a5b0da29598e44ef20dc35521093a8a9ef6047550bfff1e2109ad68b39f181eefb8f64efb2d89f00e490f1914fe034e47f5bf24c328f5c84dcd0145944d77e215817772f0d7cfbbe45fdb1de3b21edd8eaa8089e1ac87146e45a2c1e308cbcf1443d6a1b530a882c52a990a2c1dee1311d60cac89e4e2ca7caf251c6fa8eeb33e5c1b0bec99265258e6ef3918d2f58bbc7ab2638df9f00bfed7a7f7cf922aeddd4d47de4222bdba9ebe81c536baac31289d7326379c18c712f2b55bc773ef2f8f62d951adedabbcafe520e4797a9d975aaa1207476d4f4a81f13d880790889456bb29c1d371b972ac891401fbe8274755d6913665172e6a8d6719da9005b26d8270e080704067037f44d0a9592702d06d513a1990c4ef66672d078358d01a640e19db96ede7d4b34c1284bfea6d2d97ac0f3e300402666f9259a252981123a2849142f962811a2de409e9091e4c577a5a1e8994ebcc719c40e73d2dcfeb6e99d9ff93450d5859085e590cc00be8b167ebe60a1e39984671189b79517eb06b0293a9c19eb8b9d2ca1d823a19aaa68dfac58069a71c740fb7deb454d3f0b3ed0fd401f3b90179f4038b9b1912caec0c16459cd57d003458dc9e4d2ca632aa7c422d5e341e909b2e0faa6fdc22dbae95f7f6f542025731ddab45fde50f6719895adb98b8c4bea1adc8ab309b5814163651fe48bb7f633243fc7ba97e147a68491e322188a41124aba759d268d5bc9ca6b9257a26434bd54007a8ae7f7e1dc76c7db57779f871a89f60d203240ba36ea51623285beda8a2918f43348cc13149210bf103af01c951d7964ef4baecb1e28595279557e1c22eba331a991b681c55f09917dd0c336eaffe499beab4be9f646c0e33b33e5d58d792ebd6621090b0ec555a85f5e7c8f12a64994dbec01488f964a9f7470d4e242d8689c6e02b3b7b2104dafe7c69e946c482f164043c33ba4ed9da693da30b2972170c0ed6164742055a87540fa6cc45ddced85c62f2ff6b2e3fee6859962654b88e340ac4db2592570d6a2c470e4bcb64233e100f6ee8785861e2994bc0280462778e2bc54462d63e3b67c59217362f7b1f8c0b342386ec214ce4befa6891de13c1d9c9737242e7ceb6a16c997bd226afe4b641e2f4de47e79dce559e27a6af620f2f7a04445994efe8a6d5bca33b557ca28c9fc450f60f56ee8ba1d7fe5f3ac8a74f4a97bd3fe51ed5b39056deee548cf77c6c9a886e012240d424dd65f94b086df10eb8729998f4053d2f322e3642cd8dc95ab529c99665dfb9b090d1652d9195953a939b7bc24a5914b44a21314875b3b2eca8424b380ffca43a23bf634c0842d03aab8855b5d30503a6e0e8aa3d0acae57c71c2fd6ddbff5ed1e9e8bf7bb11f45edd5281cff9dd13fa90730e4bd652655171fea84ee176080b2d2e522c2ead0030ea5df66639fec8fc6374ddbf16638f5816098a037bcf1796c3266a24644b99529201ba0596057e055cc682664a6daab516b5537bde7c126e8067c0b005757ac063a6df2eb20692c42426c957614c96a4c05456832976d52fa6397eefa514d31cefbf9c981cd23a45bc7279ac47ea90e819025560da373f4f5652976910b8db03ffa436afb1922409c49d38e22dcfa0c08d3d5c6cd00591c76d29854efc3161c4ea62b12af967657dadd65725abab470b54a76528014df50faf8aad22d555f358492cf08b231669dffce4ce3c5ec93aa4c8255557252b38d22bb5562195e862da373f43fac6f3569dd01c2134c756265549c5a192956455f207cb881019ea1092e4c8194c287571ace1b946eb7416c188278cdcf0c5102152c000315b411648aa1871d4e34d50c1c5062a525a40839e12c87c68e9e0040ce417940a8fad56da51da51cae36edb566fb4007f208e95fb72cd29536a867a94d475df65527743840e200f7177f9c743a0529623f3780702ddad7f5ea5c367b747878733c0d0198f202804a027cfa703ced2679a81c964329d3c4e191b6a9529d1cc6868686868688eaabbf8c9736bf193eb74167ae3398d45e5b81b38e01b7ad05ba8aa894c62602f5a072613135d12bbca4682567942f45c8216b2a01b3860521e69483d3cac998787ee89fdf21477c4592842a14ea79a9a10429831a3ebdc95c3c02380341eda5881c726b21fbcf0d8b31b10f142d621916a68df743d9b01ee3ce3ac38d2d41b38e0a67dd3651e27ed78c85365c850eb9b3ee357dd8bb1d78963eb08516bb51604467c49a227051f64e9b9e00b3f664c4f932d8fb8298d522fc6dd27cf38acc0637be0d8df3d8451e8ccc28f1973830b0633ed9beaa46f3ce38762f22db5e594ed52002e13919255629bed8e0d372c2600293d7bfd30041b22ddbe0940f75bb1d69368aaba995e192115f8af8ce8a449b96de3366edbb82dd392dd4c1e2feec53867a0d50f45a1c2d0cb2995e3d127cf9f49087ae2d8c2711ca7430f305a29041e41ef406d6e3cd33cc15ff6aedd61f23e93b86db39aafc66835c3f90067382fe7f8b2979b94401f5ef641df851e167acc983162c4bfd94b81c644165e7c706c510426710593b8fa52833b5f60af97eeb0591e7409ed1d68e8033df9104a48998bfc26573f3a94258fa0dcd119383f65597e5084d75a5d0491d42384d943a74dab8c0ad4c6f39b6868e46cb9dc7bef75bf1ee6c0ecc60cbf38de1c0e905ad581f19248d5ce66dff7716036bb2008613aa3a19486e6697470f8051e30c1016a8397549aced687a74dd8a1b31d1fb000706c48d829877e80e9a0369e1bd03b74466bc08417b1b9f0e2c5cb8d19de2a0dd2b183e4791e2913b3b97e06c05772b735deb3caa10044ff98c063ce5f6b506bf5ec63edb65119133accc009184a2c390248f6254645173d40a9719c671fcf3e9fe77d9ef797db2c6a2623c4344d1c1c771c1cf7a867672a50ca5ece51ca9ef73535843d7b9b0e34b00f78c4291ef0684a2dc1e30a9f3b8f5d96808d0e1401d5d2e50e5ce1c110ac40b5880d8aa0c370080e8038e27469a7085cb3973a2b009504b7ecc3a966d10c29397414dad944981f61868823ce298310235f3ae1590fc4f3e861fe593374dd753f80920a9027ddf70f89ddb5d4f9873c4565406a10a9161c744ee725589ca0e29148a42eb7e9aa0f6257665db440f91f8e84dad40287d6423b49ddff0f9ea234b802f64fa2f81fba3bef7822d2c3202ee42c0fcf28a699c5df7cd60ffaac8e4422d57810b218191995a86a07fd68314aeb3a377ac0101e296d6c18d8dafaece14582aa76fc090634a7a9ce1134a76b19ed2a524000d0a811edf33cafeb3c0fd641a8cd0c7dd334b412239a0d62cbd0a4ee193a194c4a7018d22da3c642ea2fad45676952d7795ed71eae7678fcd4266db54a5c7c7c6231ece333c3df25b591d17044ac4bb01238040148a8c214534c61b2e214dd2d560bf948820044e0b1cb13767cc02a6880aa40188177f1f04c41ab5acc0c16b40a6a40944100d14034100d84388b99e0218f8760088da1051647514cf1e26bad65f92da107309d44cf3e13a8d5940f4005ff122ac6ec4ffa878f81e6bc389bcd667ef34f338001eda2eda2b276519902bce58524495cc92eaa3b0070c8008f4eb64972d9f3529f1e92720e0fa44feb599bc6689daf8118a49334d8d931994c26ee72e40543a885845ace7221275b88b6905009a290abcb65e9260e2e983aabebb205684f0776250f34c9641278ff9449e0cc05482ddcd89fbeecc994baae8512e8b3fa40a098bfbc9cb17ae6ac1d2ed64869dfddb9207660975b1d7873975de8a13d3d45cbcc67f98b88d21e3326336271b9c199201f2e568be84f660bb1a09844ac8de3b81a3378e0386ca297dbeee5b86e6eab4694c003b6b966d3ff9b4c2653773fea05efcefa00d5526bb5b63e4009eeec1e702d0d72b475747448883e840f4130c15e99db075718d2d82cf76da50810401c69b0807d74946a33bb1105d53aca1493b39c75bf7f2cc63449922449926fca395393a9da18a39d4c3dc13860786c99739c15c79cc37bae8d31b04cb73ca439eea2365842086186ac6564cb6acf059dfc5391194070bb48171e5740b9e631e46ee6ea46922452d691322757e0b28d244b5c6a12349ad328ad8b07a84d518c87da506ae3b4cbf5f0b0561b33cc3997b2d5b03e79ee86c5362f778a7039b618f1f49aa78e5225f65c63041ebbd54734a7b31754e769a0373407652d1b9d36b6cc9d46cb1f84866143c000095813297e6e1143cca2bffb2b077aa06fa0a9cf2a2fdf634dfcb583e8201734dc8286de053d39ad6f9ec525e6a2362dc3f212a550a9b16f6bbbd65aab189146333fb8c19636890e1e201e209ecf71d7c2135541ae3e79aea93165c1589ab88d8307ec2a410aec1a22fde5ed4de88d3be9a5b596e3746c1f0f50fb0fd4c62b895ee59fda95034d42777092742da13bd0d09718c2955c9288880c7a15a5f46b5f6ba5363f6569f117efcad00f880a86a2f4a4004716574441b5888243d11c1a225e35212ec0713c944119c123c61bb6f8ff51280e499964f56d96e3b8d58a8b8f1c581c715145169be5ec4672ee8ef30344822df179306af38115e627afc2aca5c1b6cf8319e0717be229224fd50c8b4255b407ff8ccbc41258bc2f18823da930a20dd6ddfdffab708331b18232f394d7130ccda1b4c7481633895000e0e1bf56fb4646464646281c23a02b3e4abbd66aad3bcd7bd89ab9fb250a5cf0bbce5abb6971f1bd5cd77597eb804c40027f1e6b4df580cb511d1c12aae498704cdcfdbfdffd77dd77f927079037e5de5a75b6c0413e58be32f9cc535b8f17688f190a8e5e4f886035d812ad56abd50abd562be756b75a4f543902d39382db9aa2a7c9a342128ef48c5d3689ffbfebb2a8004a1960eef8c2245a71447d972b1884564a5be1bb6651ab7539211a0ddf32871984888a6266cbfc09f37f39d05d9ccb5d25fc8047ea52891544795853a305adf345f48d0dee723d11234a74aa9a017926a24494c8a8d65a6bada61ba1368e03d143e184494c89e938f81139d69d381357e22e779d2048880c3f6c15c2f3fc9ee7f99dd7b3f7bce7ad5d319eead0744f934bf4dc953d62eef2b0ef977b7ef7fca46010826012c0034cc13328d899e6f2cdcfea5af7d68eb044b8b5ede8cbad8a15780b91ca5857c416c7ad8ba7c6adca154f8d9b162db4cdca26dbac68f9ffdfaac882c0db152b5af0b85919bfdabb3c558fecd1767474cf0af6f0f0de8badb5f69ed6a786ca942b5a2c276eed3cbd53660739380d1a3468845b24f04d883431a633c06ad2b9c9b66d546ceefec801dfff377958d70a33090af427300c733699eeed4a25101b61238c6f2c815f1c51289ae33ed48a951802b6f48c214a2cca2ef3d40c9d91c056c5076bccd49182c76ae257794fb71525aac07a362b6ee819431c4ff0584dd13480185c8baa59633bc0344a0e68621b99b11a200f75fc690c1e69ac55f0795535cdcfe7a79a2da8324c69dfd4ff0732bf31a85beb33a2b539d3a0a1417b045bc1ec211424718b526d06a196840459e924ba054705880ca0b8fb76df358b3969e2cc2888e89994a9d8a4f20b722fdd9dbce58b74dd90e2c3c3ae79a4516fae359ce839f9dfac160a37270a3a010a5ae52492071e88208238d2da58492918041b5ce01e29c4720055e0f32e4e9da808b5711df1d04b771be88dbb107ae319867222d4c684f6e97ac5ea449e22527a99f40e7bdd203ab5e972074f79a42f437992428f1649798517bdfcffdbfff68f82dd812536fdbc9a1b7a38b6f881171d5281b7ecb9b53dccf3ca88d46c61d3af5fbf76cbdcbdf7a2363072f208de129babfd22c8530dd39fc21068ea7ae89ee96b84f96e2318e11185ab587b9ee779a2fe5e8c513c7955cf339ff9cc673ecf9c6df859ca57d6aa116df97bbe0fa4adafc1db423411040c5d5e9d3dafb28d31b08bdb8fc9de7f19850dcc9c386614c68e8978469319a97cc68c10603258587b5c76543b6567117df25c2315e1651238a6bedc816309175603265a0625d9f9c94eef5ba51f97c164660c46e43277e24abb918c526aaab5ca649d7b00839915d46b351282e8d96e338b2da3276f180a8381c52fe20f5bb53c6d966556dfc72bf695ce426dfc0a02e0594e18d882630f755bdbee1e54abf56c362bb5cc243eeffc403fcfea5eab9f0df072263a698ecc23712449a82a4482c4343e123f432a70d581daa0509a9ccc6012bb09a037f40692bef142074968b71d48fa913c927befc5f9291129939465599665b565ddb6b24b99d67125a2e756d2a628b0134a5c26ed4434edf054774f897d34d9ba1de99afba6f2739cb035888481556d100c4a4899eb4891b2481059ab91ffffff8fc29122a3442e6f2cbc5841cac2d72f71b5725cad5cdfed05524702abca61f4cae86dbb11694e49fcfc317a728f55284fa8c3761cd5ce7f9d2f1811dc3511fcb130a8ea536168aafe50df787e1bcea1fc53a8cd5c1c0c189e654673a8cf5e43adf345afd6ab5534f47ad517b5ce77e91bcf1f7b7decf55f247a181a7641c30f839efeec9bda7a014c2debc7bafc0dbcd40d3401263bbb38c1d417c280d19c9b731a48a7aa1227ec8cf256ced3d2f08408763e0c06837d0cf631d8ab9a2461248cacb5ba8ea80d98be792fea0c4d9662889eff0bb5793075c897eaaa335420bf833fff3c85903de860c4b48110c5e85e950ab6cbd5fa97340a7300dd31565e7b670bde38eededab59ac27c213ab5f1bcc4aac85cc28c99e666fa8f6ddb56ab5527d4351e05ce2c81472afb799ac5dc9a59e1aaeeaf096eb7a3753e208289b78549579849cfd1a3df4284145e781012033067cfd7dc9a7b7fe3b8ad568eab3574ccee15341ca8b3faff2412a9abb5d64a3d544e0181473a4bd900a764b8451a1a6247ca9d3faafa389a201d3b3e4beabe0401212978d7c81069894710a9eb48a495ccc689511ee2fce400524187873dd3f1d12875f7d4101c0fdd67270c1e7170dadd573648282353436bbdaad612d91a76a5bf73233894e0d1596e72220f69c8f8c1557de42ea49dd5479dbfcb2cf9727b902659ad1caea460fff1596f6531b7bad662faa893824b36bcfc775f5b3ac1c697928d2db0e70979e81e0974166a95c3b65d5f263b8b7608e4e5a9ed7255ac380c218937a4d8164ba8f5d4088a8cc6864c478afc0a0aee5ab8556fadb7defb7f4bf536b5e948e28800d1d288921283b7986f76d31caf81aad5c8b6995a50150f7af21cfb2954f5f3614840e963f92cdbf65388fe577a983487db589eb259686b75f904fb263c816da1aa6fd2849ee39bf41cdf1c81c8d5f02822ab451f7b338ca21f99acd66a32994c262f0dd57a499ee77920a9c65d7f1ac105f852cfb4eb6c177cbfeb4a6882c78ed58d8685144f340eac0bdb66bd0ae712d09b64dc1448ff480b79912095e436f057b35e36a055fa097aea58cf5a8aa6426d62fdfaff078ac564b070b95c34342e1a178dcb45530026f0e8664a0865768bca2ee9822d7460bb4839c504b7b73c0617c9e522f550072894c9e425a0a72cf4a8478bb6680b04fdff57ab2bc5e52e58fde4b99af57fe706de5dba1ca915624d8e722683d6f92aca1898a54985508b655ed900cde9afd59a15a5f62a57a2672da0a2c4155168513841c5344b2384e8a1ba69659aa511b9066c9d1118b0e327cf455730ed1b93174cd822b59a7559d2892577c6c0a3252d4942c1a31503db22354b5a571896b4a57d59d2ba6a6358d292d7925c7091ddadb5dd20b5f673de8ae0380e0e0e0dd8133f9c5583ad05a7042b564f36f3330fce54e0669b735cbbe50ef461f306cebc8f2d5f70c6859ed51735a67c4d426d3348fbd389a9c881335dc15a5bb02d6c27cc5480cb355f80032fb0814d7e9b7fa2311eafaab976998939f2cfa79565463d2b5fa46be6fe7551e3ac61abad71ba0bb08b22bc387eab07eb33f809066e3fcff3f473e361e7070d1a5d69d01caf11a8b55b346c8a06786ca27b3fd7d4203b0ca98d97ca17e9b2e1e587be3aa23249599665599665d92a17829e9cc669388eabf5fbbac05f1e696aaae8719f8d2e6a78d0659739ec697826ebd80a1ece48a0cb5ffec0d105b103fdf525095df0e835d1532b78e84f501c5097a2759e84a1860529abbd0af513a8d5ac901dc9eb3c528d7c1848d7912ff24586a0290e063485045539ac75be88cb3c26a588bbec8bb4ce8e120d776b7e090d77a0a10ff4e4444ec510af84dabc8b7956cd43af39ec612e93955fbbffbbbfeffbb63f82e664c6c4e8a3a623b0936722822ef3263e2db23896a625f7af6686e840b44eada26fbc09cdf9befcf2032b15df47bb884d424d80dae0d4d861ca6e6865f9b509cb8ca2fe5e8ccb1991e93da859382b67384cccc968d516400513402c81332d039ce91c38cba047426069c2840f5364678f0c4f26b7e0e5526ee1cb32796c236b29a5d4d451ca1e7d97f94ad9cb30c8e44fa686c78e0eb08f263e68145314c1a58619abc70313f044982a60f602dfb973832e8854c441a1ac78c19dd5ca041e73023eb11c3f6254007af108d2b1c36d975be02a52008bb6bbd65a7a50b44343cb6cf07abd5eafaaaffab254b5aa75655a99baee5f260481476a14c3662b5d0155ad6268cd50e640c4445faf154b056ad3371aa0605e445b30e065000334870486cb1540463dbca21821c45784acc1c7e7559ffb6881bdaf842078a433e06a0c30c33702396f62e76deb68df586a83f2c941ad161454ab05d56a4a4e0da60896d8e2c5301c4459def22bcb724cd79562497348103ddfd7ed81e6b4f82aad602ea7b0656e1beac0dc1d4bec9a5b7a986305df3cdef2b2c4f1961168cf9d8960bd573ae12fcf77e32db72c4206ace0cb12a938de929628b03dec5520d086e860a4872e37f0d0e3f912bd8a6708144ec46c4144891a7a3cdff2befe5e8c4d6559def2963806a91a601ac3ad81b2f60814cd66efb5dddffdcfa1b6314fe98f19c10598ded6b9a26752ebf8adb5d65a4d88826338866338866338b6a3c6ec83bd6a22d1a74bc1824f8a2e342b87d8d4ac4bba582d6bad65b1bc2aa6699aa669de8bb169de1fe2a59ab59ab12bb32ee69169a48576c6bcc8b49845e695eeeef6e25aba0842b284c4a76fc282698da2ea31b3c81c823da693047fad6d9a5128ce949d26a863314d193a2893e02fe70499564180167d222dfabeefb76d332168dbb627f9500148c718b859414635aeebba7bbbeed640e144314df3cd6b5ed374ff863757f37bbbfe1743f14588494f0a64e050d483b30cf08256ecf3fc0cf3dfc41103267979dc5a41dbb69d826027dd3cde2c7e147a9af2b237436a8a32323299beea4bee7a58da3e710c2bc0f5fccd1678c4a229de3b669301ce484046ae390232c01eb694ebadd94a353c3cfcd253f5bb726bf926e41bcbc39b61a02abb85cee88cce4c2dffdd6cc531c439c70cb0cbf887fea92ba5b0e38adc7b000467178c3c018382c81731c648d273c2921860e1ea92c5935a8f0b34688122491632e8220a263d272881dc9044862a7620ebf1cc639ad65a0f7240922449d2581d813b8b2f7619c78f0767029f2ea8342fd86ccb680000a005f31400001808088502a17040342016eed3f614800b5372427e66469a88c3b130c8910c04310619670c308000420c3188c6862800a190a769de89c8a21100653584e802d9f7c02768b25c0d030bdfcce82758d18587055acaafbcf421275abd4028adc592bc49cf66d98814ac47574602e93d170ac25ca6d0054d3b30f0560c217cc2314f32bd1f5eeccc742e11a515486fa732838bf4f33a9550903ae08cb45d3cc3d5493246422dbbef52948bda67ff3b2e0303ab8d68b043059d68572a82395781704200f54c4f2c6d34a0ea26a0c3eb07bd1978d3cce2ae80c85b57f1f9e7e2519788dc23f6a4111d143da875a6b0b1e3a5337a141136756f23c0d66e5a87c734c8e47c63f1cd9e33b9262b43e12f64768bc9eb8edb68934f2582b3f6db33ac93999b5fabae648b18f4d5ff6c67674b4b5989c93ecc6d9f9f524d8250fd33f35e1345c0bc1dad9ff3538aecc5eae7816d0084f45c0fb487ad4a8523fa2fe590e5ba9c7d1fb767e8a3d5dc61f39b1dc37af8b4946eaff17fbca3ffb6533ad7c38170b0cd85a72813717fa8c47db4560a9d723df5e851dfbba77c919afb1330ae01b2558cec487d993d98791aeca63aa77205e8d0c5781895a0f7f101851e7cc11b1c64bac7c3d93ae30b2585b1cba563d19fc3c0e2e086472fef3069f1c460fff8fc19502cdf589c3b7aee55b702a228d7af80dc1780af6c00eda222988d0f072f41aff7b77aba4ab7b956c41374c568f4aa34c6075f345c8cdba4025552614ea2b40278786fd1d097eef43bfc7c646aee44da2e2a2a5c18a2bec9f89e62170ded53bafec52af577d4938df746bb4171d19052989bc0e76ebc5d8e140f5ddc13d0091f4d9619a25c3656b3feb27a3401bec6eacb0d9aa55c1d21e04bf37e6002093e60aeed8207019904ed4a4ec30e1aa87e0b1152694d26a8785acba161a4df698f8505d3e346cfada6447a0684e6b19af9b00279d871db58bdac3a865c7412a72499bb3e4c823855ba34198f5f046dd4c2ce480979d9fd124dd1eed230794442a464d30dfafda7b87406d86a70b827a764e7a642af6ce03f8451c11f44c445938cdf6ff2780ac44f11209c596d61c687b1e5c5aac34f77e495c3811598e4cc12172b195310ca4f768302a097863f4e6e38d3db6108a3304f2b3db57af373214d034f4a13164bfebdd269a16ab57a6eca9e3f7aa45571b0ed6d281429d6f0b49d8b642ae4a206c8da63759876d5b557520a01116bf193ab496d978b5ab768ba42ba8e0bd09558bf7eb3b387819cffa66f1174cdc88ba1780d3d5cd30198b74bb0d700d17dc005bd669c3f8e83f4412855c913f6cc9709268c1e28b0aee4450cae7952d69def00bdcff57cc2e4685b14fd214a4230dd730dcc4cea8350a307f031fb4738cba83b1cef0e086c80c232f7389418ac0f0c2013b32dc8fbbf06dc43b6b0a0350600047d5deb161f974f9696f66577acbc1b1d0b77ae24ec21954f38a319c0f7e1d90b1e3235232cea906ab207d057c19bff7f818acd4f0a1a4664aed07527b942937b929077ef13a71f8602357ab57d2cbf165a9f8b14dd72801ca8124abcb70948794efad203491ad8248ad1e3cb51df3220405ae8e8efac9c5583ba77af42a35b198249e1455d475f6ea80be880150935a2849d6add4dc005a37a01b43343ef31632858dca2a5f4f51f2518ec473fcaba36e68b53f47c45f1ddd9c0f886fdb3daa870bccdf76abadc53913953062272f0d2a5f8b766899cf04b801216d8d165c1f8f4525ea2bbfbc26df8e7a929fad245afffc281ca4cc099397d1ea3a32fc25b45435f8cabca52e9b38e8e76d25f06d5ee5824f120aa54b6785a6d101068102e201aa578ce51a023944c213d96935881a6566c956cd06952c414b3c8f6d22618ca238a51b8551635658aa92b1788f7045ee19ca865282d134413b1ea3d998ac802e25961bc204aa74691a3ef1c4e3100bc013cfd56c1611dcb287a37085dd4cc666be882dd35f5081696568b52b3ef20bddc0b423c91cc80eae4ebc89d9b42fb5212e1be3500e48b0c29348982782826a5c5e0fb5af97338ecc71634f17a9784c29748d1b750a243eac515bf59667e90499c3837171fcbee84d888d3cb7fe17d8d8300e3a537f22326bac6bc193d72d87b5481b41f887c75030013d8193b2b05246a9a8d6b342480d6b3b1abe409b568635b078271fb4062b09696f95aa3c91c0221af8c987d35c84f6017949eb8fd24acd692485ae6e05150bad7ed6d6b9ee27335476e852a1efcda97a8047058f1b6a7526475ea51f3b8a31f045e6657d1f30a33534bfa2d0b55094bca893cc768e90a2cbc52ead617fb3e91d51233bf96f5bdc123fd964b16d3d9a3b38ed18db3217e40fa75633c5d79b3547b42d35c68cbe338e1288bbe7c753a0e40b858a464f9a8b2ffd3d875079540d712743a8eaad990290f1a8b65022255121bb33c06fe7f0481b631100e4fd422d077aaa404777be0fef84fbe104654002168940e8b69082d99a81c50848c16c81241c0b7298bcd27b5bdb0080268cfdb31a149870c2257c56d72b769505eff1fc70f7ff56304ea8289d385d0f433896215d2ac6797e3a79f19ee97b3f0a5d39b51b5f3a37842276bf0ebd9136ffeb8f999f86ca320841bff0a8e0d51915905aaa85753be39f58905e3d6244f17a662f15487c839ec88d19d85ca778f81c03eb746d4caaea55af2c4d7847eb6983ec041e5d1023cf15692b8e5976ee90b0990474a6653aba3ea9f944ead33c5b3fe07cc6c932e11b6f603bcced4ed60839924d65d5b0ec19c4c1c5c0aff3fe6770ad60ff10f967322fec6569fdbbde912b647fcf5c544071e2b736fa1886a05d6477638c55a6b8804d1dd8a3c9f6d73be15f970e29e87ef3c54e355e647297432d4324ee721c902012a68ca7ee0321f0040c061770b8ce1b39f402ea0339402424468cb0092fe8a9ac60d42338671fcb3c18da7e6b8feee1c0d49db3eb5f2fd3f208501685d597339819b1a203f911d4a3297d3db1b1a4efd4ab574f1af78c140afba0806cf0758c17f1a75520a10d76ef41c632456cd4331700ca709a9769c65339575e4e23fe33fb0c5c281007529e0187c94f2669cf0bc143cf3704f1f50d30a83b7f4367bc2f467d26fc28309c8c5a21befb866930c63a1f2a4bf4178f32b8835814ec448f8eff6f2e1ad51219ad4db1d266c5127f0d24e2742490c8191253dbff0bd30009881398b87b55bc3462a7557325e4ae436e6a532967eda128142d840709dc7d29a8b644c689bec1dd2f7f4b147a7c41b816ed93459540e12ae409eaca6658354cf7c148dbcbc76d35a601f46acea913e0287fb75e722a5917aa716af5ec4138d21633686846f688b562fa7e228fe92ab34e0a59ac20ea2d049c5282d53e7b4d77e8234ca58f8c036e0d7e1bfc2a34fb869bcb6c4055c63e427253f13e70c93758c759d3c0f664ce753a4a89a9ded9c520da85936e4930dd9583b7562042579e7fbde4f219b2f7a9a46f62adc0f9c3381ae8b11a45f1555e8553837d9afc77894badb35cdde9d6937f07d2b63a7e615331357d33073d2c6b73883fa1431a39bc9634d5b7f0f9696a55d87a2265c285ee248d664c66203f4fb7b997245319cc2065cc125039d6ee921fcfd81158df5f7204b9a11061e039586d8c2a1b897dee370ee5e49f72939b7be399786c997feff7e2f476de3b672d9c42d4c48a3a16140fe135d43d4025d76d5162f64c1ad235f6b489a4aed3b4e331e1d1725fdad30b34570991a9a639089915fa4efe57a991291670cf30633c5395f145617022237bdbb66081a8711bf84eb42149297cc14ae45595ea690f15e06ee35587c66eacff8c856e001920d4df2b93f8966aabf88886a9a298eafd279136b01b78497b6664c80bcb764b94393ecf7e2b7665a3794e49755f72d3c2f16cec100762ded2fda6b7438a58a688329e44140a18d25efe35ea761f902256aeb72a7af29e9d9d369ad3bc7bc2804e0dbf4c6b5f904790c5e4816e6c6c01695e53c02b24c2831d621d7340f4e54bb1da760cf19073fef20da141799b4430c191bd48671c88f4aa947151334cd10de18d9d6e0d4b45aab776312169ec29bc2fda5b8c51426f6fb72c06fd0624867d746343c6d126f56ac6536a6840b4aa9472152e85ddd3bbb19704180b129cbb99c96616d0497a7cd7f230a7b6e618065d2317e0ddff865b7da8a2bed0588eb921a14cbd50ce36af648308c8efe693b032271b09528fc4fec212dfa6f6b5693ce675680928d4d2228f3ab089e3e212a7ffcb237f7f77f6ed3d4a8629e2c6e5cd4c1d44ec0949049fa3ec018f9ff8ae83da1d9f39417257a7ce3c627fa36e885cce284423115d7a0628be883b4ee6f710c10d001233856fc363cf83bb2cef91eac6259ed0573f4c4fccb8e4cba67de5f1d7103af83f928cebfcb182a44a093267ad14523ff50ad5c6a8c315d352f1ff8889227e096969709c06489d1bb7fb67d5b52033df22e301b689950abffcac100d9cc8cf288ee2185c4c670483c2330f5b989aa0e822913f1d315c8e649c4b22a649b8bc21dec1ac51a08a358a029dd6e13769cfdddf10237441824e8f14cc229f3acc421320b15b6048db0a534359e96df26e78ac2650c927363d7f7b4c2d8b0fef22a64c5914939d05ece9b1c922a92af013c24a6241fc6019e35a187c6e0b97399151b01b714f051ef5efec953a93c1732c3ee38294330f55b17ead46789d7d2e5fa548e8fb95c6ba303845c2fa54f99af4883d953e57f26568046b5927d60a7de68a718cd9c4c70d99d9ed8b254c0d02d1d457b14233b14e20e3d667a4a0fc96accbd9614a81c8093fcf9513656a3705f90d0a938bf43af8d58964812107c676c508fc7e323d7891d79e251ce710763d7aed914fd49ea098c276d042a2ceb45ba4916fdee54e16f611cefc32832c6c1606d71dc44116277711a9d437edf24b678ef1e6d78f3d45cd009f5371d3e7faa96bf7e25409d944cd99748240e11b2a2837b3bc94dbc9b5f2a262214efd90643f69dd47be1c2b05452fb04ad35ba13537d38f273a0aa5ef1e5df97fcde215b22ee97156a741ad5ef32a09c9908b7af122f309326ea5cc3a03b87216933408947610773dd70e7009b087344884a065c87484121deda941a34ffa40f9027442440c1477013460f73aba8bd959aeb52f1f1e46d717f345806c2231517e8d77a91a2f8b10e10c6c36d444ee2c05ce24a8a89cbe1c4193651740422f77e2009558f4dddc0f7ae67a0969649f46c301c928ad9ee4743cb0efd39e98a07b0f60396b52cf8122c0095191f29c6bbd9412e033386191801e22ab92edb9cfc839666c6c2f5a4ccde2735f4139af129fb6b89cf6dc03918c554a6d4969631038a902d905ef63c602a09ac1c26e49778ed28578ba93bcd447c0579141905218ee9b5a13ead830c1c64b56c128d62f4d3c32ad3aaa430dc964ad27e8a4626f0af6c434ccc29dcfb01db7c0e44c6140d0afd0cb300fae653624937141cbd1df5dc07fc95bb9511747f802c816ed0c6572aff0ac8fc8bbd40f13cfa3c54f1190a400bdc58331e61a94e292b7f36f1fa746a276af106db7310097c96b17b2e662830d769831d6d85a322408bf8b09ffa4b05cec2f3785a7f5eb9a223e8b4c014a65112dc02c1afed34a4495d5f6e6b1a673a83ee134f2fe279e4c2936014b1803496bb9577494abe5aa2aa669bdda8a26caaed94bcb9f6e2259b28158b3be90e2c53966a684111eea2b9a8f760267c6e8705f37bcaae6301b2ea8459ba3a08ab1209153e11bff7aa34752f0d4a589c51cfede57ee7f78c2b525fd2b88cd26ccfba956eb405be43ab16a5e1c83dcb162a5e2fb3f42042941db5be29942279a65308d84204ed5d628d178c8786faa54848a68ba5eb94c40252d1d0b2dc197086928c743a0c501060ac6e0af8232a1a8a0142078e07ecb7103a0c7346706f0c60c2dd56e72ce5a1b3de12b1246342a8e51fa5d43dd6b94e7fec389199960275c6747f55f114fbfbacff57798c658227164a5d6e7541ada18a67d1e117168f821ba92428d3635c67f58b2817ead7fe61425a9622219ea2defa780d2875d50c5150b5120799b1884203298a01ae8a507ad7700dc085b84a55d60531e8d793702de851f2758ff0d36e1a86854c16df4f7a511c0cd982e719018b8097750ac3c8d72e49f4d1272181fac9da669642a45e0b77e978a4238886cc6345229f66b009919bce5a55fdd90ec77b9f47842f79595a3bfedebfa2aaa6ff05e3b76bee522cbb62485c3c647edb821eb8527365c8c22a32396c423aa9dd0cbc433a82c18eb2bfd133e502f61e50d91026b75cb98acd20e1b7340699ed83bb729ce521f6ca50962d0a4e93c44d0bbeeb8fef69adf802e6c4d205fbb93777f28b88b1cd9f816b41e5cc3de466269bff703945b93596f1505367efe8824bafd7070e6038c5bd13f74ff8401138a308eec19fe00128bf6565857a0ee075dfc0660f7b8e2e7ecb0b454882d3ac343eecfb13bc47be553b6e97543112ed2d4743a55647d62060a3076da0df22caaf9718a7906ae36543b9779447eeefd2f64ffae40886d7a6dde648063c9ab759593bbcd56c78c9384bc61ab34e2c3720d2ef433fa71a1f7e409f5465be7bba193eaec48dc1eaf5da99637c56cf90a38d1fcdc9a64463007c5ba6f2cc909d24bc87091722655dfbd1c1422e5fd4c50b42f5780b90747d5a532a40e4288064e6761a7c6a2a17405ef9633bc8fac73a30e29f63dfca9c0d24a2075aca2da2d370c1da45834aa3a570c6da3fef1a85e8005fd5471509d8271b661dd590cfb63c8f6337e6b70a08eab3861acd75b2ef9f721c17fd4c345d34e9ef7ec2a13af899bf4c94a5df3e8c4f4db1eaf2a96be779b87462fca09e8e920f8f2495694c23c85b71d70856fbda816ea210ce8d6020a1e743109f438094cc3063c896b3b926f95caafa1ac621c9ec772ab8f9b1130f8ae322cce5cbb7954c456dbbd0197e871c5ea07799080d7000842147bb012b92e35d3d1c042dad14b49c8bd2e1ff9e76b5ad32868e3ea42af49ae1cc990df715845a3654b272b8d259f8c9e177f4b47453c4a3d8080c06d2dad965d39217148921e28ea013a41eafca314e4bd6e62b5f1556346537b42784accacd0e3a47d7b83ae656315bc361db680a6799139a4fe2ea7b2530dbd15f6530f4703647100aab288fe6d0dfc9c459f66c489d219e43b670cbc5a68fc4f3569eaa62a58bbebed44d92e0c17b2e03e5eda1b33d8381ba3a308690518e156fca00c9a72a7a7c57b25af4ab9c93afd094afe83a0018c2ffcfe0e738a0082c86c3a29a0b0ece641f08edf7377b9a57dc8405670d1101653e063a4b785f9c28377190817344e61a76c7409135d93427e3e8a576aca3aa1d47987b57d1ec02afa3b87b804472c13db1d40f0f9f98d86320dfedc11af57723f511627051993eb814e015f6c802f5a25b2452f8de9397f150943019995d09f5ef62488befb1a9c00af643302ae808fe4228e31ec8141382a81d918d3c828f803d96877462a7899013c040a70501828b699b72139a7a16e3e1ae6b13c85096edfbc355513d06530cda636577fba28ef9503bf404507541e57fe49232824f5278de9bc67bfe28e673cf16afcc41298330692e074cd5793f3fff00e5a58c9553ae0f5dd8864ee9699f4a596e6c07890ca47f8014bd317213dd108e06e0fcd2cfb5b8d4ca3d0afabdb01c0da2d74bb09dfe86450d6146367326662e979ea06511850ac340cb3efc2f0ca3fe41d15c989cde9d5cab020fb9fb6cc0016b6629fe1442a58f49ae121e85cd6a9b4b03581b0e2f276573f8aefe296404691b70578041c4b2ffc36c111e0bebbf1045ef65e8565f42925f8177240c92e615126472aa75f21fb2aaa1566da706feb940923033fbf4345a33dabce4dfcd2fc39ae3595c08b2cadb4251936f091a985e5b30ff1c2dfcda18a9e2114b1956d24e373157733597bc9066b48ca64198b5be1ad5a0b5ffcc44435afc1428dc3a16c43f1d78a9f75c08312f6566dfcc26a41e51c1c4b91e07e5ffe49c03b48480babef3e1d03429a44aaa750c6240efe5003db2163e217a7bada8d8ddc474ffe8bac87b5642b1fc62920ddf04ada97c78a632f41f64614470d4828d7c949a2c518b15f80b5f57222d42c1111da4451f4ad31c40e4058dae8b9080cc2d87639b2e4f36cd6c0f225603f55204bb15003deaaa4b76380ac979ab0017e3cd1a89821716dfff38da7c2ac53550a890ecfe8ae655eafa59644a1fbcae4ab9e197ba69acef60186c64e2fc2c62bf8c8ba6a8d2f3f8791b203f8d3b6c19e96b1c41c6addc43a5bb52bbc00e05824cf3e167ec6b4f2004ef0080fd0d022eb5f417c74d9f4445c8c89132dcb808d71fcaa5bba81df7919d0445b89219db39811cc8e24cfc991cf2ac5dc94102a0c08fc0c908be1f500f5e1346de82192679879428043d04489f9f9a87dcbb9295a3cf43d4d88c91c995c634abecd32ca08912b1215a4048106a4a7fdc124c79f8d1b55f2550884dec021e657b28f601a44fbd65b9caf29072cac5a1464ef245cdd3617cc8b2f00bf3de6aba31c2a69337572e4513c778f356ab1ed2cd6419713e23b8e006c33ce4d3ecc9089c77ecbbe0286b63479ae3fd73f5e0483345d4c8db9db18f28d923dec649d84e2c81302539302c58250ec2deb21434e4a15244f53ae4b1c49fb8c7190ce9f56baff2ac181d9733a51f4cafd035a0e9b5cf2c0743cf2c93db712e04162d15b5bc3834e4695c643ae17d66604c9936084e63b3701f51a7d9647075e4e583a04dad2b57dd92427105ce25af82c400a22728c15325da7c37a5df8cdd3a12600dcc6f2eacd17e67540d895ea3767c20b809a4811ab028defd334ceb04a2031044cd9838e1917ffb6ac151fe8652910017dffd00a86bdd101235441f561bf54b9a22aacaed1a28214e0cf41002c91ce01bb820bdc26bb515309bdc15244cc0dfab8b987227400ace205dc58d539669739bac3354c1f68899a45266bf0d84259f69337eea1ab67d38628a28e02444f8fa2556f88c7315ab84d1807910690435bc2175720a9c17dc8b269ceb3bfd51e8edf576a4de86484691449b792cdc40e340f17cada82e0808919de486f20fa744133c60678096db422911ba11324e5210ece9d5f569c1ce426469b5720a789e671ed7d51e55f98a151d5a5a05ad0d29c8a395dbe911c7e8894c1a87ce6a193722e3c0800696e7158201b697737a990f0da43f88066e3585a431b011e9eb909c41279de9af3a3c469518a4e0f8e0b16ef205c3a0a64541914965e892d73c52408bea08dff3dba0213502b56ad282ddc914cd880fa3449fc1284867f6939d4da5a5fc04ac474b06760ee02162293e2e7ea8875d591057d3616e35bf1ccc177f20e8428c65b465dc5007e573a2ef37489055c1f4b6f16662c7c2f303a39255811e4738d618757a8c87f60fa9c25bbf19f443ec6156933083efe49a227bfa611be0be03c26ae603022cd6b50a3b62a796266aa3f5d878614d82137f5c67c711665c8c46713008932e0796b241b424f6a4f12b44805531eb2c23ef356e36e6a91d88d2c53d30869c7b2d846502a2c1bcd5c9140e4e0cabb895715ec8fc023635a83c0f593ff2d9bd38df1846facfa1d2948711d6503f5dfa855bf9d3e5c01f89a668569706e4c3442b73cb47ca9f37918c1971fa74fa2b107f87384d2c3fc06bb3e534dceddd39dac19ba066e7486b18354ce488a8aaac66376a80244430d59e5a183536e1e6d4f66c012bf3a3226b4cd93b5cc2f72d7d37abe96e1cf195deb3ba6875332c5bf934160c513daad8b06a0d55b0b161b9f73241ec7df2b195aa38ddd344f5ae906ce5f0de87176f9272b44284dd25dda05f5ed8c5bfcfb9a1698588ccb01bef7608c771521f4a92d1b4eede43039328eeee076940a4fcfe6451ad28349f381c5d0d40ac3bd403da904b9faef4b1c19ac2a82e23661011ae14fcd19be2c962f5f60f45c58f3f0784e2da2c6f0347a2e0ffdc896f6f1636235a00033e16d47d47203be32fdfd1e26157856a9a757f9710a396e37e085a5211a6b977ce568bef36b802648e206929514b99f8ed01f42c88b394ac1aadab4a697be0965ba4d75c7a9a7b42fc1e79bc8562462a8334f609b15edc5ba051b41fd806bdcb134f8b25392fe58292c6b0aec25c915001537a0226fb5feeadeed653cf732a765ff9ce4c292c2d523bd5877350c97c9baf4c39a4fe4babfc348ca52fad0d56485250b18567f2e6bdae83ca93f5a0628b0da31b57c72c4f77574db0435dd2a82e8127031de742623f19b93bd41c1b4720f16abcef4ef8e0e8696cab13ec348b121641deac0218bcaa322c9f417fc0aa9f03e9aa2ec0252972664041ab965106a7aa26410a9313ce135c7289341c85b45cfbf728ddc616e8b5b937aaf7a280336b58e0aff87b13e311240962c7030fb7c67a86332084093805cefc06c1263fabb4bbd1ec021125e36796ad8f89c069ad1a7dd6acff259f69970174c8614ebbfcfe5f8260bed5aedc2c6825df874b7d06e19ec001a349b0cd6d20300a42f875772ba7b87a935bcd2d6c735d779e7dca39961f3097b68b9cd980a3e9529b4b135099f16682384c21b3a0ef8e8fbef2bcb6c2d7f5ecb449169b816fd75436d0132f59b46bdbca38f5449b1b33053c40dc6b31e94abda5dd161dfb25209a1067b294dda70b65e8d9628b9214db98a6e8d1be3218541ee2dee69c3ec6dafb4ceea6d705895130d2f1faf40f0d1f8bf3abd63cd7b96e04156d06b9aeb956309e8d333a547ed2e7ef84e31eb0cc23054993a97745062707f1756b807acfa572894135e30ece92e904f3650e82ba8573e09612d51a3106483f392b2f14c3c702a5cf1a20b7a424a9f5ba4731f07544e4c40a33653d81a52b4f0ad7195ee7806c403d510b4dc77e86b43060145a17161e39d98821dff3cb3e4a408fec945c51663c760a3d8e6a03691b94097c77b0ed6f4532964d32cbb6703bf0061952a179669a31c814c3fef7b9b9335c4d250ac0d1bad3110c7fcf384629b449fdd17ceaec5d8e3095bfcd4bd4f69a160cca100086ab8b03d3e6bb9099393aeac6671005cdde60c719b0f3da5479857e8e524bae7ae3662404d1ccf281b133fe6a4920d824b08cf7ad51d9cac102a69aeb123f5197797604b1f0d75f12e3f8ae74d33d1637f0491cfe1154082d7fb687a580f7c8cb646e9844d809b43418050a8b80f1885736959d7fba07abca4131918ea64b62db1a2e2c7d836a60f5db011185cea7e56443cc048a4f338b52d9775a858b28a0d3ba3d0c8b562df278f854ecba5bec72e0a5747563c494bc5167cd92cb03e08467f1e9d02e6328858cd926374f6c9f2750a43c1450611e287af555514077729faf195b12630c161e5e70256634353c876b99550e15578af1dccc195adfe04ce60cefe7c819787253b013032fdb356acdf8956bd579913e4f80eab38e7bf0f5882fb2d952d7aa2444e7223ca22733e983aa2e39d2b1960259cd8267e478a54eb36152efce98c941294c13776869907c91ed1d4c4f4e29ce2e4e8467f5d01f4a764e8b077f6e932dd6c3d4b75e6d072c159ce437296a1510108373b75b28abbeb55275652926fcb243b7146050eb8342079572b642b9c39749d58f9a403f13ca13d8b68ff46f443db0e3f9487fdaed09a4fe791dcba76cfe85ee02f438a678331e5faf03c0fe3f35bf3945baa8a56310dbca4770da756df948c9ea5a605eb3167af4b9ad1f4f0c2b8762384a39887746dee6f044c9913242774b16a9d97e430150ae2223fc37a0ca401c140bfb9e3e839447b0b62b254f24c8359e339a9be141dd0ce356edf318f581cb0a65e80d65ac6f0646af0946ed348af8c050f4e30dbd10ae2248d65807887d7b887e66f05b9109489c1913b29ba4f2c6f6d50f655c9c0201721754602817463561961f79048a215dc43fa3e15a31819c0f77df1a690e10b3a41a6d0a28617719bdf3151473070b86bf74c02913576f1771734d5d5df92cd87a97442c1038d8d49b6aa75862eab362996bb8930060bee5770f217820b15326eff2e2ca4a7e424c5510f5699caa9609dbe9d58713a6f6019fc95854b56f749a2b96a1dc6ded1a5f012c0a928c26d73abf552fc6999408a98fbd5eea81c7b8a8168f64c4bf6f7a114e24eeef57e4e1f8adc319d1f8ba0fcb006d95cf23d415f4944863939dd40cefc27c87d5947c0ef6f3b10d0297a6ef2230291b0d66c7f2809522f8d00a7e996680a820b2a8c48ca2cd71145306c4efa6d266cd7c46fbcdb37482317fd0488b420e61747f228f18f04488ba5eb212a131d2b547710bc73179c542fad1e5373c5a75469ca65144520f44839e6104f56620cb45f1f40d9c5e2980c3e350c9178820e9704940ea68705a144b372ec92d57fad50773ff6a1c389802e518a6561a2617578dd527cf33a1536c4bf37071155d69469945ac5efacd68a7ad23c622b16a1d6c884488109d6a39b5d561cf31b035dca416c1a0491396f175c7cd81a1fb39d75c8e246722010f0c6c051ccd690c80bf20111946f27c559bcab2bbadc61069c1d7a92d76b04d3666c76644fed510a61fb4c58d8ac1b00dbb61417c3cd6badbd2d28f235aec2cfbf6bca3136ca48b58a98032bc33dd094d3f5331d47d6b9fcfd5225a46167174d9a3ad9bc51411c61f86031c7a0ef0444650d52b3bc0ab4d837353c7de7e779897ff6135c81844cfa8c3966cfa0d45ab2ee5c6f4c68ad1e71235e4f0f9e8ed36d86e8c11b52658c00f0b600c76167ace2aa7375b6c87b60b39c15fbfc8032267aacba6474498129e7a99d8b6949b2affe865365d6ecb21799da4f0fd345366756d97d171726c00e1d92bcece6a21df42919cb214b556f233ffbbe3305d809e271b70ac2767cf12d3f1e7017a6a9a02c5d3cc9f4ebd674850ffca5323ba7ef7ecc71388b53443dd64bc2de2f8e707e7702b1009fa9c302ea77b82ebd355608cbe243393ed0e0aa892c9d476b02d639a044915ba815aa9a2d39f2d6482c0105633b21418b280ed08c01d9aa97806fe4c2a4fb94da511d8b5df5bb1d9a4b87775c8094096ac092684a650491d3ed561d6ac9c6472bd399e5d736c480930f980af60921af124ed6f239eb4d0871d459e880a06be5c140b3032bbb8f46dc07b7f201ba445d82158b64befd2b980634d60d407624b3c2fbdaa2a8cba79adf7d30a58707be82015ddbd66233e76e6fd4cc9b5521fc2d07536e3efd8783013c2c330035049ca3c0de3c38ed3e3102d4bd2e65fb7a155ec55c2a92e4a6dbdfc524047abe773ea49df39913e6943858c21ba80690c361245840c471558e679cff1450827935864cfd3c485ea98415327cf291549b3af2d8b5f266c2a0f89860ac187f3bb45b714175e26c9ec37dc9a1428f4cac5b0b2f226b58abd9ca21c86d582990a8153558cb3dffc758b8ae3a1df2c23e25dad40c94fc810e550c240c95ded4014c1896a4fa0bc956997f956f31b49b5fa907be4c264b8806dbf9dafb87a11dede5d4317695d62092d78da866e21ddd08bc068bf2d14952cc78d2134f15aaf4f1bffef042bcef0989c6ec24dfb93629b0eda86afe46e2e6c56bb9848e9508c035c938446779dfe1c32bba960674b63f3b9b90c3d0e508c1f8ad80b98bda6a588da7e415699906231d57e09d9130ae4d3167f3d07cf4214015614ea91f3255f777e3e0389c216a83fc32758f42d2b0bb3350400db869a0d28e07c92a4d313f77cf87cb262730fadd282f1540790b835558247da7b37f626be64117b83f672dd56e271ac621aae1d766631690b494e6a1d4d97581e0066a7d12eae4bb5ba96bfdf3ae9c9340a9fb302c629d0685932e11fb950e46bab3a905e9272d031b375309a990e5f5a2b1699a67c69a62f5baa067e69f3055c591f905fd80810b3a23c659f46c129a5fc598ac49a9c05391367a0dafb79186fe80b105f5c6201a59eb684930353054a2c70dbdfe28e57a6ebc6732c9ec0b4c7b6dd9c699ec82a927fa35fd5214f818d06f5b11bf1cfcf7a2c9dab46d50ec0fc06cda5563e5cc56b4d102499c7683af41b126997301315af14b3d7d1a668e64988d81c4c6dd9404e9d3a381f894cd1d821d9c7f02e93291ac8d2271fb2473aea26fa876c8638994fffeb55a3e879f931d863559849756db9a72d65441edff712dae18341ec04471e4642e4b5ebe80f37ea4da88cc64d3584aa91c2dc58e106b0ee1a28268d9f82dc217f688be9a708da9a53cbbbc2907287e8f2bd43872ea377c8c63890ca367ae73709558947ee96750d8f2af2837936908e4d30d7ae415bbd72833af6a82a81fdbfb7ec086c027eb49a5e7e20c17276331cceacef6b69da4c01e2bba6920ba5161b9cd88a17ea172979e6853c7dc20c455aaed55a049fabe3873ea37dc44dca1bd2be37d9f518871ce5265a4967e8ad5111af466de5079864e7dde0c3f4b720feda7ad568f51d1b32b1a9d25258ce2e0bfbd669adf0ad67a67039e0c4240329863e36309862e946442409074e5d71aa6d69a712ec449978388bf2abe0bcff5af0862fb02c7f8215e8d30f098c2abddeeacf12d4121a1e8e0e691e10a65875432d1b5c93741266dee16b55c897db0c9bf77e989205a833956d14b9b526de43aaecb325744273afa181d4ea2681b678a15638e0467b8698ed3d2fa4ac3c1bd6928996832a8223520c1d5406a8a0494a1949b1d89d5b510765fe49a08de0c10a78271186d38855995f1fa3a4d760d4ed217d21d437c430ada18319c91760b8905a30e4aa79ae2b9075622cacc008cc076b02d424044e5a9eec52e4c1d81a3e3b6b5632658536ba0af3819402964205aacc55a052d55d16e3c59c5a766814ad43198f92ca1f5c1f9cea69800b9ca4db0fdad582942843ebc635b34320f5206a1190d9a1c3697286923267ffae756f4ad0775dfefc11296fee1c73ff31eae556959d2215fa21bd8b55691803f9f7e3f93c14defafa621e81d2e721db087f78fed7a98e437ec3792be504eccc90a5acf10a18ad699dbfb58183c1b4f3d064e73eea96ebf29de6eeb6d05cb95e4a74155d5e87aed000d5c61c56fb0f45a45cc89cbab1255b28dd6dc5b47ef755e8484b3b449874ef8bb3d7a16950832fc40e053fed84832b99e946891c41d950b70f9cec80f1ed2ff477a56061fb9b1a7950919f3568c733f3d301a56f14eca1f49f22b6fbf52c2ca6b40ef7fe7ea2265dd57e8a1a5875bfdea6e24296685cc08c6ed6f15a4b208ed97656feee7941e2b3a850877f48f5b6ea99fd212c88426f28d2eaf54323ca001e4c01fbd2b0f43db3ca057026125c835cda5ace6d69e86a49867ad4c5787b6628e9021740511ffe3411e47e3ca2c1f87231f5cd992f9c3377ec9f598a01f36d2e3e8d3f67a9f37b39c6633e86a06b38b13b0eeebdbf121d5ace7f336028138a9129c0882309a2fadf755359bc752e9a6a35e45233599389d45f67f05366a764e724b103c38215b599fcdc05b171d3c33b6dc80d4f06d8b2c2a0b90de6c5b50133d23f79c226a85271a9f9a3f187379a30ea93f137168817cd3f72d01f7410498e8c57264ef80cf4f41fd68ea1e71ff611a85a812449aed08fcd545bd6398b8c144db36899cfef31ddcf344072493d366ff4db104d4a8221c4ba3d0f2df074fa1281ab565e34d7c4202c0445dbe513c97f43adb75e656b18b57d6782c9bf848114403954d67e38aa6d7d3656bf2d41eec17ce0ce87102ea1decd159469aef328e6e6b3b5522c08ff62c94fd57b016a65892d3c443a18ccf31190ce94baf0ad615cfa1e26ee0910d608116c1be83c9dfef6cd881ce3c558ae7061d00c133dae80f20f415a0551b994cdc8baea5c4f34f17cc65f135453cc47dd637272a3c84022ecce97dce84d536a13cc23d10cf4e800ba7158fadcd2945f0d878b5c05f0d35f2c979b60683b473009ec3734e99246172152453262424afc7e331d7c09303e19b050bfff3f9cd4ba61cc93d6f0a2e207fd1627b2ee7c6534e4d66875ff20439acf7f91665d8fd5bfd43c5dbe4901710f00147000416c12a8b9de31d7e51674acb9c5e3bd1b406407ef56617f0a316c9577753b0f7ff20b005705a597cdf8e97078ef2a11ffed8d28d8b7e502aff303b79bbe74db063b453e60b977dbeb50e343b6c6047d43dd9d8fbb6317f649c33351bfb35679b290691c03370ebc6da7c17bcc360a1ab184f3f878ce2343d0e36a48aa93091f9d0abe9be82eb7cfd3aee54b51b2388d43e4da9dc4d318f9bcf9b9ae9b0b7637751a6f130f3f9885055b3bdfd8780a63daac9dfaec77dad9f129dac4f7901a729989c0f290d8cec641800905dc5173dd6b1835f79f9e3162c444ea550a5fb8456dc7fc71d0c4467cbcb6dbddd10cae74eadc942acfddce8a1c48fb3a23c809270702b110d640bb1726140908ee9d40d543ff2473990120d6f51371e28c48f33ce532c9bbada6d9bf951a1c8302d67fadc74e26271b9fcfa94cc97311f3c964b2f1b18e4732bce8f527301ab20be6ab9136d25cacfb3e6aee618749c94880fb78fdb1afb137d5f5c56829e61958dbdf75bc6ad7638908d422d53f895b4d71280a6b1dbe2620b9bc83d2a3d630cecd4dab53c826cf4d4302b1c81a868d2bf5ca04b45ea4956262b720e54c695078871f2236fd387e2f8279d372b6c9088ef99c6f24d8289f6560b7c4cd0c14d29f368eb47acdf40d2d9c9407749af508acddab61c8bf6b218c8359ab6afaeb8469fb6f8a8c0280e60f11d0c9fb8758a8dbf7a099f15828627982de98b4c2aa528e5f9b010ab2755147b8fa5d9a47b69185aa81b8b4e124de4d80c42e468b35ec4cd5de2eee8574df0319b2258398908cf54db106cd966eafba51e307764bc7e0cb3f3b5f8c9d0d492dff69d23e01b05c5ed52bd68bf8621ce5249dbb97e61c1fcf5e844411b254a73d77235b272194c5c39b742c115ab5b4b762f4e733eed2235b092b9dcc7eb48c3429d01f77fc61a46aea66c4b6283f381c1ce04bb91b09d08c6592889ba08141ff4323c2dd58a890b19ac052d024f477a2b6e1636f5e9c3ac729de03d806d3f4feb0220ba1dce6a4b13548101eb29d48b2071e231cf6fdcb83c449c253d9c1e4f09bc3be528706416afd9b14645049be50abc2f71c8f8f3b9e6a04e1326260b58fbcc383561a734a301493942864fa10002ca4b98f544e3bc5becf579fdabbf01217caf4c00200156b9e04287172fda7852bf9b5ac256c57ad9fc0adb063922fcbfcb4dad74c8336e7b5756f8b06c8317da199f5362c050b9bc4028fbf140e033fc0826b7231d44b19d4218864b3138a577e6030a4407700ca66cbd1b38df8f9f67563ec2b41113b6a2ed1d12d801c111d5c5f5bd529c01e42387d75ad1d7d65e00be3010b42bfb33bbc85cd1bd5722459b536a55afb95458a8da88fa382631da49063279648cbe0b5aaa34e7e708b8d03bac75790fb4971ce277cc2036d4f4d6ddb00eee3dcdba18ad03df1e30d6fa33681c19b29c38216766f0b4d298c33dea46b968e952793490465f3242cc08dd8cdb914018c20aa777a09274e3e7e423e11339838d1067e52b584d8d919f6a4044c93e30d20515e44ad11066b823a6b1e81940205c384d6abe8e52ce15cae47e77438563a3ef64d8c9ae81edaa63a1c484436f5589af4c71a703b494dcbcbc8e41e5488ba26e6fe80025a57cd31bff9920be09e4efa27f881eec112a45e0ee0ca6db8b682a5bdc6296ff2bab4b4dab4c10cc9216a263bcf7977bce4507331d8687503b44739a1f3984c3b519769b16d9c0a69216aa769ee378fca6a21180ce3ef4f706edbeac33046eda83464c447aeb88ca0fbbee5dc2333895014aefc8f5522b5098f22b2661c6e024b28a23453a84db60d773f417b42ba1aaa599964723da91968696a15b0b5ef888039becc82283a53183d230fc4252461ff3cc4149781c0837a68048fea3f7df53c99b5871e45a53d206923879cb78e96d7e12c16140c4c53a629ce5b529d89c98e7bc4b6acaa274bc87bee8cf47570ed06a31a9ef0ded30dc5d703e8ae4e06caad283cb809705b39acf9bf58580c501e33d8c42abd4ac594cdf95c0382c19e8bbd1a41b53de9c22d8bd75c8fbaed708b7b4edaeaaa287c628deb11a97a027967f8423bd098e31019c45367ed1932355d76641e0dd7e171f1464674082155cd94b12b1306074f789fd4906fd37d018a6e02af523a22028b24d94d6ae5e72143be9725000cb0bc56dd6c281113a6f53c3d371f0999103fc20af43936d9b7467a7c13099ceeb8a9d96e0af1f8960b8caa6c87c50434dd769bb9a9fea568e9a2c5ed7026cb4a03bfb20a26cb1b48067d1103a8f6cc632f2b2dfdc5c5b1616df525decae4623a6534f489a5de3671046c2076513b557a7500e1a9d730ad42782c2a8e3054225c36169ecc670d9124f42fbe13ea7d6d7ed8f445da149e8db7e3f8f6af7f07a8def23bfd188d4230887fc77e4779b3a22758fd8ed08baeec98ab64b875878de877c8dfa281fc7ba453d73c2a352556b11ab4978a0b80f692a20ba00772436fa5f40ee6ea42f99860841bfca3f400ecf217e0ef989ea74b909723f303871d74315a4c264b4e3cdb0d2bb83a0a4679094834fd208c6bf990118ac1fe433514cd206f5e317b643a2a65f123e59cbdd1326f7223cfa200edc746f17e8759ed9bad6aab1517d4d19bb39740a8f215c19bcd3c6a9ed9602faf4fd3cd61578b00ef175d70b21217712b3e6849533a6cd79ff9e29b31c6d8e4d778671348cfa9fdf97b1477549d7cce0dfdf3f5fcc172dc4104dee0a609ebc87a97fe66150f3dc6c5bbc341d09c598b260b1c200914f0cb8c4aa1de85b1e2b85f269cb71ac85504f2268128f0f900b8ca49bb9782d35eadb01febfedf103a1e215c46f2d135564435e9c0f6b7f31affc999a12b87cf25095ffd926e0ec2efd301a9a29417243f728b5723d1b661c5eaf170eb5f06d5f2254f528511e562b49e00cb4e09a3d159619147fe746ff8d222e6cf64210bd1a1742c574f831fb0768288337a3ff5776f1ef2d78cefb809239dbb68443d8046fb6c62e6c0827d7b982de5d222c1328fbf97be1cc62c6a1c8ba6e5997741f1f2c63abc82f8ed81105726f11e97d16c7cbfa21f9234566c4d71e32727075a08efa957443bce40e183090d157a1d7b177fc5a61ab6407a537b6cc6ecf4c6e1072c5472347b64186690d15b2497614a480e2bee4ddcc3ff857335e4905c03e49c2c74289ad3ad8a7283dab3911356d3c70102a7b6e7e7af01d27386f63f4e8eb0af3a67c97dd91042c5bc8f888c4a1819be61a14fb8c64670a004f242bc2fbc3291be6c892b21878b5b1ddb71a4ecc7278769ca21affc8b53d31134a35b0963a7d3d95baf845859fffd6c42848d2efdfaabdeae68abadea02435851a8a61e17c90a17d5db4fde6d117b9780ddd5e6ef5158aaa7321742ca8b1a69ff9591ecde3d1f7814636a30d5833cb8867fd06d9eaf668d97776c4764c7c5c93df2dca97ee2ff7997fdeccb57e420dcb817e546052144eae630de5b074a7496a74e2af731c8f02e7b3c9b090d80245bf3bb1efd1606b6ab965ab7b2e97b0e9f9208b9012a0c8d8375aa1bddd24cc75e90eaed6b0f8a23cbe9e440d924ffb2b07ed6adf276ac225e96459cb136dc07db906573a86d7a0468618b3eda325d84ba2e29cd3746eee3562c9d7d115597b64ceedf99130e4675ad359d05afdc67d6eaa32e17720c8bbe3dba3c9ac28ee74fdd65d279f5d1c503ae596b4b78debeecb5254b1cd808e36a4eb62519175f34db97d0f53a037d51f0fe8455f5537a925026224ae716abfdff7487d1c12dcc0ae4b58ca02cc0f9ed29106c8e8ca01a63223b806ed057b4e2522a0aa197d1d5fab048a2d06d44dc59eb0338a0d4643cf81793896d44bf868b50e6023c31dc939807470b92beac3c57361870c25f53eb8628b8c2d9818d264518c35941515c845b4e40a40ee7fe3a63992991ab07cf2d1f800ec94b74a98248d01e645d0a6c3670b7803af64721b8dc3fa367e1ad3bdf80efb3d55ebc150c8a0adf46598cade979633128ab8684f6a4f1277446b4f796a2ffc45b7e725737adee43f95a93843dd0f716afd3a8b5a80730de5ae28583b0a230479967999f98501c1acdb1847ea53ea53f50fe8f55bb022d07c247a375f94a794f6cd748eccaa0d80b13651e85a0e809910d689b347ed1c868a8f4d6d42dce9f96e5edd8bb9e5de8c55207ce3a231e72e8c683ee30e2afd3ffa5d7fa54cabdf1d8c9836b5506974c9e0f77128de501bfa6fc2c154bae431ad8765e67fb1b454d8bf70cc9143a377d320db0c8195505f07dae7c51005645ea701cf969b7e99b4d169486ce1e3d4691c9ceb0f7cc65e7408fd91b61c94529f2be3d4b157800ea0f13dad2863705087171f622feb93da9f4a13846e6550810582543a4ce1b3dc8d86a7cb050c74162bc4b6b38f9a8cfdb27269510d5eb2e1377e43a8c1e3d992c975a5ebd5f01a87ebea0c73ee31d2800f5a46df0c33283da1793761cadadd8126fcb48f3da9084ce9ccb63a8df86d4acddfca22f591e7dbac055efca850c3eb233f90db0e222324fe6c14fe14aeeb1e4429ee622da10254f678dff94bc1b15a48b574fb25d3d12e02dd2483c237924d36f140571b33efc96ec7350d3ba0953455d23adda4e8f1aa680551e734c0d8c7188096083c9bf2f50b65ce3cda48790e8343b25e40ad6803ee5a9b94b62abee036c1d07100b3b856e1c0aeaaa523e1ccd40c6155022506a6737857c997816da233f3adbf22ac91297a4aef29c7710a023cce6df000e1bc08cf6d76f070359710856f71cad0a1ea12ceb7513522172335075624853304b6a053a5a6b02cda1191b767b370728117b7161d329d4bf6b1e8b2b2585d6794ca53ba48ab5c4ae783299fe410445918f3fa36f4d8ca56e35bfeb0e562d369eb26d535772673beebe9b8790d15d98283a1816acf573cf8becd8f192cc424103c55f2e0d74b552dff71acaf89f5b5491b8f1ef7349174bb68ece410718298258fdbc1722723c888a63d402026c6aa027a3ea03ebf6a1420fbec0c6f67ccdf94c42c71b0900d04fb5cb7775884de936fec3ac59805dbb68053395183ff8b02f01a3c182a086983a959dc8c3b6f9d1dcb63faf3a1d73b8b3362a73ff10238cbcf8022515b77dcb88c1cddc2849e9899226b36352b4c3f164ccafd5c2f0e0b9b9d471611a4106a7697b540cf56cc798ebec39e05f76e9d2636e64517494afaacf22627d1b18b2e8c4ccaeb8ede9e6bfca4963d4617ef8448d0cf10bd7d87704a92a76daa44ea7e1478342846651130450468e8623f5f9295a297d17a80e35b7db97c50a98255777890be2deea3211e4cb786801205b5bce905c8d46d0695e9bc83689902ece18f67e97e16edbda36cc4a05807bece39d654f02c44dda4ba835c6c105c2aaf29d5b63a7158da9e1c299e0df824a3069a4e878358375f60053999f7de5a022a127e1bc82340c0bdc669f0eb31b1b053851d9b9352ab028789f063504608225843c01c1bb1208e2a23b4237e48892beb951e6187bc57ce33fca74aafd5612fcbcb1d6c2d32110957177e56dfbbf005cf6c6c7700c922a9b45b923a6c9f16c520f301834b6f7d68fa0091c747b9d527f79cd117ef91cff2cebc76aae37f2549f60a4b0aa53264f1b066e20ab412a1fbff57d17e3651960237542d6a2861bfda31173d17336930a676544f363821aa20e5c6821da50c4e59985598c26ee8aa99d490ec2a5a5e15baca7f3110f8f9ad580cb3d78c5d7e8a2eaa26bb7a9983bb219aa4f60b56bad8ae0dde1cf0da6ebd1c1b6899d556d3589c8e0ed7b19ee94be4634f9d796a985ee0d345a0dd829bef543a6455732d8122e5a5cba5c36391d0dc5d396328908870bd7391679aa4f26e6bb00fc997bee6b34da8af8ab18966d679ab446380b8058d24ff38086525ed2240ce9bb3433b96c7e4da05e8f65a893f145716d45b16000f5d2bfe6866fa6b1bd7710bc889ad2c1738bd392e98f9a52fa9e9fd417d3391527c033b7d62ab7ef7113168e0664241a253e3058ef629370070392959e995f9c957dc46ba23d94063e6289c53957ae45d0a1c5391949b7f937784d5318cecc19ab6aa3de1db67a2ca17b6d240e3142d99a48f0424d3a053af96da66c1f13d1737a71966abce83eae1b80f3892118a8daf1fdd7239255a4ddcfd69be01a09558f74adbf160e535d3f0fce3150673bccb0bd28d0621f36e007408ba1216a4df9677154d15899e6cf22fefd2c9aa7c656145a9776399996c49bdcb4eccca965e1a96ec2d71079f5b75addfa4600a545bd0ce8c2e412937d57dcd5539c8b524f42c0164ac7f0f6ca271478b7a2e12d8520fc33e7173ab05fb19c8d4cfe9f4a33dfb0a1dfa753d567e3b4e11c2c5472e7b557a26923fbd6d6e810ee922f8ed6a2610e596b2f10425d27425fe1aa1535653cd1bc3610ce610c71cca6ba745419e40e93bc64f7c18bf440e76f8b43c3658bcbd640f1c51a1c20f73d6c4b7ef75b3e10b00dd62f3d798f5a060242761cc7765ba8ed71b06879bd4aac40a56e0225d19599a4bd658e3eae5e907f941812fecfbd68ff7f9c747ba61145cfed9805ce7d29ae2cd1f0c974c53d9d145ec707833be6c93fd6787dd4853b4c29169a35f2baa590cf7f34b1572f383e200335902e508b780952c9f442399ef24f5f70593ff2e60134a6a303401a4fc8fb138ff019b5f864fcab1be8c494891452e9f91ef20fea7e18b7311ce1a27a50c75adcdd3484639869753ea2726151830803d680a4872d2db4e78affbbbfced7df4a4fd11d20fa78461918d36cb9a55fa662e4044395e970de88e8754603d342af18de037d3cc966078a5f87622394557098c22d457cd1007ce75995457cb912b7dd6d32a394871722e9322a1b1a30b6dd26502b66f1908f215d74f2ae2a3eaf59a2ae8b5e3b9cf1ac30c16858fa4358fa62e5769659ba473672d98fe0aab95e1f19656e29c28be8dfa87cc3cb206789317785ef1c260683a0f8baad1232bb1a11b84a51bfca698860ca527b179e510778dbd2a7a3edd1cb4ee809f69773b9a89be57e1313ef2561bf0915071ddeabee19f5d069901e6edb2793589f0465e293781553f73af233a035a122177845e85dd62f7c9e49135f39e2bb572f5c3b7de695741c895cbac1b4cf85a9d06170b70bbc3ae405936d05f8186628704aea444f8e2648fbed1690de86c01ef79d98d48c9edce26564572456c40d008b16baf6f24f0f2683982f2d48179e916e7df793135b589b0f10379c0b2f201adc7a911e081e4e8eb7f9d5257b51d590e73c31e64ad4ec650f6a1b38f4db11cec1492d503d5abfa238019bcac762797d6ad687deb222fad86023e23b015d12c3668dc54c02e7820b9c20288e5e50a71d6745e653bd0389eec1941671bbbdb6a041a96d156735e9600e9e29abd0be2f786a84293f2369058216d7a5a0b30bbab72b1cc54e0d4be8383d038ccf790b9a919423909924a58d489f998ec76cc8bce035d7859e9fe0db00cd4c48d1fb08406abc85602000f57764f78cdece464b60f131dc96f31c1b2d2472c07a5168e82c4210c65a619b0868e5f6d5eba6333f355cb9ad9c4835d929fd3a21ed4323fb246bdc371ece4525052702147effcffb0b1fe2d3345a89d8eb858625f1ea0b953a56986ab06698906cac55ff0f92bcb2b4363dc20062ac66b6c51af9e0de08054270ab65c43fb80a0060ffad938d3350076b677fd7008a9b056376208bdb48b588e5f0f0474534ac33018fedde3d48f3f294cbc25c6edb99c03b9b40a84911768222b63d6541ea8761c61da302eade2728abd4e64d8441598ff0f4424ab2024f1582ca0a26698e31532145581cb96da81253e23ce4935965e278c73dcd68cbb8cb62afe17702fd0c05993025e633b7a1486c0db56b4e472360fdf728d35c94781074e1a809a45695e9fd66efd3d91d18ed5885fe1ea8ea5fabd44220598ca1d0db40d93ecc3030f3b8be79db4485d0563dd8c0589571da7aa13fb48b85d1576c59e28478d10b3842055b7357ae3ea395cfa021774592b534719bd7b30a165f2b107cc4bc6110d6feeba8d11d420456e3f32bacc940b36ae7fa290e787d262bd486a6d140c0c220d2520f08831224052feb37fb1548adf02ce51f8bc7bfb3044ecb547b8b071db0b94b75a84b2b0111a42aa928f1d1c371a70a5f66e65bc205a95bfee9116cea11711725cf871f4f5546a42a3d5271f86f63afb8d716778d2a25bdf9392d4ed10142aaf8c0ab2d27c3ca99dc48246399534d5e6dd7159468902e21a4082eae6e7c37c18d8cc3088320a49d18e66815c0488102673870b002233c65f5f05bbbf1556117072bd39e056e7c17c842f18da0dabb333c81cc29be3e32a6d63eb94f2e6f69e9ca93c8eb340684f10a1deec0b166535690246e36da49e97e1374dcac83ceb10f28adf4b73efd609af1d7fc088b1f70a7e4d4facb97e37f511fa7e05b0f3980a3ce731913c9b3c25b0fd34a14cff3ca6f98352b39b6acff160cc01d653d530e3786c3acaec0c563b0ef9e7131d718fef80652a50fce9ae8f4d7352b3c7bb7a7a5c6a035a00a9f5904d0f915a4ab1cb93d435ab6cc9535150919bccdf40dcdc63c976c2aae4afc503af510fa366b3c08a9d2bbd15d843afbb0ba2f533c1feee066af8ab31c0077bb63534e4625fd80e1cc9f260b4dca0b93c30f08eb31c3af997c13d1d194b4b2803431c58d77c86039c8f8bc903fa56e6d02cbdcf985575d42c1c462c209588bb05a17c885ad7f5f7d98d599677281a0b4db977081df64d717407993f4722be00649108b759d54129642e77356373c5ded1525be9c9d5cf471a6fca4590e3dee09446e432947782da11286ef961664ec573ecd88e4cd9d11e1fd9d27a5769a1094b92b122ddc778ba6c02ee7db9f7e17d83bda9413c7c753e107c69b5af2b8737a80bb89c517e248805bd2c833d54cf7e69c2666418f4710f43e7e5a852e5760e42bbc06307f0fe4260a2e34a902903a0657a23f57973415969492695b4760b59e303c82383677b7023ccdea9c477c60a9ea11348ba4c091e9cd06db482a7ad4a317461816bcd0150320654b4702a99494fbb8e3ef249499f09b80272b9357c773e46d9b7bd9d2d3d85bf7c708d9f96eaa5a4cc6894044e5862980634ff71526bad7fabda65781b6e6e7c558e42c79c566e0cd00d65b6d40d0170bfb8acdb3bf4a2d87825a6d551b92e6a027ef22d494715c7f60e9051dc195fc97de44236154b99b6b700fd296a0fff6117cca11e2c9ec1085fc0e28c10e6cbb1ec36c7ef91f670cf1f53e1664451fc467cfb1121666d51f0e30e1f065a43cc59383b73be9a29074146fc205a3eaf6b6da9cf1dcf07a2c815f13f2847ed6d82fcd223c80952e8eabf02e8b2d4aeda3b351ad131e1ff1aa391e4fd8060dc3fa48903480926633dddcec83dd5bf328068bb28630fadc5771720cbb5d8c1159ebb62caeb1b745ab76c9d99664d792089cc3a8d273bf5525dba79be0be7e458458cacc2f39ebaa4bf2df9738f1d20864b969591ebdb85ffefe8b550bc1b88b9a7a3d2c3816ed80f24e7b9a535a570a4f2b771b3d14cbebd3a68b966018c5829361c3e94b6354316026f84f7192289334f1f889c6b275d4e8cf43928c61ae5936425c6ea81bda378dab8c2510cfa069885beb067b68a422ed58ca07be4b6f8ae848546bfd00f0a54b2c8902d024127c3012b9374ba310326eb34812306e4a02c67a0d092f89558dc802cda1a21dea5122b052a2a4a7448e4425ec2f27a15542de19183e8c8b5c126303672c735e6334134b38bdb6d5818013648672e2f8c326b844099978a9beebef64281764f26c6e46ccf307432ef8192313184d009a264abb9a286d047971ab88db6b22ea34f3561e40ffc1cb502e7d5eeabdc462c8d1ccfe9f38d8adaa0feb2013840bb10093de966476c3c689ee5bd0a137cdb6abb9af10bcc5b35f38d409bb0bec2ee094dd4575ed2e86f4e6021a59ed2691639e29caf8c6666b995503d71177098e6754abaa24c3ae3fdf4441e5bfef5cce3f48cdf88fe6074800b5f46e1a1a2b5783c4e16adcb8ea2622c99c763370eedf3d2601348d82424c53b26a8641f9802992ea80ca4f9d387565491633bed91e08a09198048cd5d13813027efde9fbfb3d46395f7f6a19e55bfe9434d348aeb0285b0e116acb215acff6381640b3c34860bbe4b3d52a752634ea4f8aa9aa1cdc4c1987a81f684d615f2008820550c8f457ab4f3cfbe6b38f75bf0576ef2c051d3206d6bf82b653e9955b3f6af92beb7a015f339ba27d44fbf8914931036a3ef9b31dcfca8eb3daa0b65fba693292cc863835576777750b07986bf646934c66274b688426f9842c370171da80fac5b33e8d4909d93fc2f19020ecc09d3318367c80d7b3b755e9e5972e8aba3faad00bab5105062062b9ec4df4e6ddf91e7950f4424e6649d07ad8b59c43132dd39bacf99c0721029c171e5ded2fae0ce385a9db631d09baf08ce0a9ca2f6b2c82a7ac0dc7431f193cbb7bafd29ad08e072b65d09a7e00b35ab7c7fe28f63171c1a2bdbc7d6da18b8fde297bd87596e35211d70809396d91f632367110638e8bab2a923faeed9bf0d5af35135337add650ed0207ffe8c026e00c76d6b129dba561b47cb255b10ad5686c79c08751b6e92d75aec3fc92b920cbf00ab4d1c248ac4f789ad855e4a802b5c7a0bef13c84c0db307b6d6c8b7b29d12eba1b35ee9ecce82c9eee9a8dbf00a58e0e86bfc0a63dd51ddfa8183422323faed8f60b5ccb3aabd76ba692a86798ecc56268b56bd1e0056f162ce3b7dbc3d0b3a1ebca7c72f4e45e433f99ddb96f552a2e3debcb0f7f5634a188a8613431d8089465873cf3dc494db13c0190e412edcd82cdff4dddb469027cfa073424ebd23df46ffb0eda88e5c9c4e4b796c43ee07c905dabe7589e2e034149c1ad8fc4099037792f9579122f40b3d6943578ef018f03b79e828d6be96841f6d9fbe19a9b62df9e824ba34cbe9c87180b7691975470ec658e7d3b0a102d5c35463f8465a5d8039a49a20e948caafe53b8622d6c8c8bb56ca903c5f3cb64526e2154bc1f417519b1643268cf583fcfeea631c0695341a9eed0bd16ee060076fd97b961b641b875adffc5766fbfb5aa90577a7b747d8110d725e67aeb6dbfea44cf7bdba763ff56a9b078911c0c16583980b15a32451cbebef74ab11b9534f86825249a83f78281e290f5f929d02aac2f7f89b9d05845a1ae3a5bcd1037a95f283ed18cda71b138c75d6e4968b7638becf436ec6ab87da286161f55895523fa1ed88a284fac8fc87751cedc38492035ff669df90da34fa7411ad3351b54f49af31642493f9d7b29dc8d5c4d2a1116702b5fa3282c18cdeb05fc105e19cd535ed03c04efd1190cc014c09baa686c69c36d8ea73d141580c69249cf007974e85b28a25bf6066216b2acb3ef2543d0e6d781da0d29438bf34e318e600b54042d0a589b8f4ee45b85979809ff50be41254051b1858eaad49d7eff994ddd2b2b08e6eb8fc5e395786474a654473e5ffc2a6ff399c046707d23a5c59a969ed197d8ec38891bcd80d3ddc36d1ca97834ee1d493426094c2c9e3d8ac5a93529d967169150140cdd99b19fa7ce6df125b3ac081d2676e2b3830497057f98d8acdba6469f51962a7844aca049929c84dccf99ed434147fc4bcd12d8f0b9f191c1c26e430872a8182246a8e319b927aa4e6365558cafd11faf83b0b92210b844d070338f7ff82c4c6a03cbe053ddcc2b6fd2a7ba0bb4b36f0a89881e4728a578a56fa812a1f5184382eb1af3243b02e5a7eaa70f32f45c27a13570d85586955a8660284f80e2b1d3bd9f2eccdd8def501de6aa565d3ebe6958b1d94e59377888975f80fb14b40ff3d9f839b09a547a4070814f161dd6aa5264e6eb88b5d52d13a02aa55378e8148fa43cd902b101a618400de22f0fa50e2ee832774279d5ff20b85cbea843c46f211ca82aa98e14963350fd569ceb411f8d0ec18a921c74baba6d2fb583461cd376b29608baaae023dcb9c3afba84ec34e1fd03fdf250c920b264d322e6640046aa833b4a7d5893ee1738e3e627702189b5e98dd898676dd0602715854f8683b0060ee3f5db183bcfb7025f1610f0e8497acffa53868927217c235b5719cd187d5084519b58bb558edbcb621d30b2cc1ec68b142e719d90e25729d1ce334d476b70b548f1c8d49197bdce36a5fa39ded1b49481105f0be36d68116e9dab2961d86bf7a8ffb474d17b107c29151a4188a3eb92502cfbe7e3aebfa4622042df4b27211b35893ba8beace3244de0a9ea876a059faa2d07d40403bac1bd5d5e301616a903f65eacaa9cefb71f6c1b2020020109ebbdbbeff71f59ecae8a33376f4a2b5090aec7bba2a4d8069d39af09891f28ccbf95d702c31d0d795c2166788724f240020442eead1a61b604e4ad2afe016b42d2f66e22b79452262903c905c305bf059fadd16cedbab4d6df46dbc86dc906b4e56003da681b8da3917c450575d6fa37d5e249e12702e2efa6d68ab1bbdf22723e81d8f4aaa0131de9cfd3910a192a881f66fecdbbafff437fe9858cfef4220d322d01092aa4f209f111427a953ffd0479b400a1081bb010a2dff4a9fce979f8783f44e54faff29dbe21a53ffde84dcf63f4a62f85bd8f47e94f5f0a7f392a7f1ae9cfc6a3f81d18b5293eb45dc88bcc1f46dfa1a30e73d64c50c4f3d4de7b3b2fc90ca05133cf49be3b13daefbd2a6ae335502f7584fe57263399c94c6632933e5e8529291ee839636428586bad1beb46d4c39c73ce964af5dfd1edad169dc15cad58364220fa4c755cb5e33dea0b68061488891329fa208f14157d29fa1c8f2e45bf14fd723cf2a6755fa440b55562ef7cb84107298c6cdb6907ba821ba51bae5dd4404a0d10a44819c791526be96847277ad18a6847a236368716b156ed616b355a8b6d5ffef227a2f27709b0d8626b6d0bdbbd89b683375669b82f888341c61a391be90f85c09cd9f2912122807e643b522289d9aff8c66a41663728e172c118148b6d152583428d2b26a8d40373a280c25cf9a380426e89406fdb0a37d0a929474ce1c410bed0414a0b5368ed4f0029b4e8c556d094a0a029f86e17e75076608a4cc9cf581b33c7596b69b064827041bc288bb2cfe49c3f555df9091f05a594fa86f1b661bce10dcf2e0eb002ad537afbe22c7d66bb342b60aee89326fd911705a4df957cd0ef22531d400f639646bdb04874bb81dd700ecab1026def8679d45c6bae35bb7b8eab788884fc0441ba8b83cc957f2da816546bedbaaa84ced60b3d654609c2ac11fdc53d5a809241fd5c6cf1fd6142de204193657acf711cd7751cb743add8b40a5a830a61aefc935069a905e85551430965d6702f4a82942c4a5afe9448fc3cd144125da79289a58009e501ab68b0a80838d712b61d40df76449babd6cd5572795c908ae270836dae6da72ba1369e241b0d5b91d9c6036dfb2168738d365368fb4d57cdd55cf98b5b4cb68d5ae557b49349e3aeeaafec4fc8d3df7849df1189c5f22d2f3a293454abcb356b5a3bd4c6035d8f4a9ff8a5d79fa8d2bf6d2e71b336909b6b73d1680dff966d5d5b665f3f2a192a2644565835e23b3edb2eb4497fe22bff26a615a4ec09d9e6aa34399b6b96d3048df6842c4876fa9cdc5ce4ec743a9dbecd550363cae69ab26daecdb5b936d7e6da5c9b8b73693f3df130d4295a602c030533a0a33efdba531340210a9dc2a95983695ab891026f809eba91ba316352388116672953fa188918c7f1e5e5e5e5e26a6309bd819df55e1c87e945f60968cb172d142f5a1fb05e4f688deb60e4ba13565aaa9af8245048e822842025993494e64a445fcf08c99cb9b23963f3c3c461fa52d082f7eda880b8a1bf9d5638b2514c1beea34fbe273f00dd5a311940c3ee3b7c2baea41eefebe8050fbdef6657f39c7356acf5276486b0ebc02bbbb07a775ca5e3aa1bbb3c7e817047dbd6ec505dfd582b04a546e14aa2f411172c16ab6495ac92c58a75f3d21d9866b55c7508d57ae9ed2b8d8761123dc3440b61f984db8bb610caa3c50a5c9be869b942fd4495f515eacf08519b494714a99f927840620c3b28427f1c1b5c68bb430688f54343896a3c2189ab504af468bacaf2b8ca472eece08c12407b764a5ff9e7ac350af55f525a0eec673cf9a06df84089233e331ac46094404c055254e1f299e245ce2a284edaf6a27f407e0e733b75ff7e39542ba1e96b874ea1bcb1b8d0f47e94c74d37e807775000020c2786487284145938a1d841124dc829402d284148c40823308882e70821e0b922e4d10324ba60c2862c481045e8b408e581feb065ca72a5862848809a59079c49694f4c5aa658d43c519d54eba43e8e7592e9e8b55a6b691c15435b881e383b2e031bc860cd343f1589445cadf5f5e6be135c85adb801ce82dd6b2f7773cb2004ac1dc7755c7d58a8fff4e20d9cd9ec55f448f4dde72d52b01bd5da7da283dd979edba2e67ce5e5ef465fda327020e9138daa9d55f4d382dddb7b3b8eebae0c0dd60d8eb7c52a16070d290d90baf2b903ca820c3be8982409e7511ff958695c5693c892c8aa7f0faec32af182d4cbf85a140b8597c9ac26a2e20f006324a286607ed6a857b1584c8f430e597e8eb6199ab6835df5502befb269c86272d91ea2360d59f60c5f2b3bc563652e6941b8f2a55e581982fa15989de2c18291b08317b02014c2f2a55e6079975218a10f7e2133906e087d443fc376c30d421fef89841128a9c9f4d446d4837a96bd9343d47b77a47549eb927e96cdf238b0c29547fdf4198ddaa6b982b3ec5900cfb47db40c8132cc1afe463095bb8565abf6ac2bb28e74e8376d07a7cf6893c9f4a12002242e30df71a2594341d4b7d059337a1352f9b7979fe18c5ff918ff02cbbf7c435e9ee5637c437c78bc3ccb0f89f12b3f431930ff65983d63cbd85c4c2f725279d9d41524c6b6b180698b1bc38cf1476dbd5175b5670d37e10862e559dee5f369c00c5b5ea649234fe5d3fa3321974c26d39bb4c9a4e9488749bfc9f469ad7569c7983139705ca5801c57f1e811011f30fc888165a58e889c5c05c91428d1821bae53369cf136d682901c0da8a53840fa3f80d0cb8a8184fe396588228c6031822f6a3882480a9458a2061aa65051430e217d1ff47f50a73e6826e953dae71504d6d6582c5663b1588dc56275db6c8dd110c7f865c6828b89f2822c6f74cc860f5a447da83a946871928f61487d0aeb30f4e798722d7dbd7c682154ab0f6fe4d58c451d97bf1df5b70d5c707bd14e714f41ee475b8cc9486048719f8f1ff9ff3fe6b95e0268fa0087529c4ab3c25cf9b74065441a365a3672ce331cba029aa9576bad79a594bf15289a8667194d97d088c1096659f4a3453a2bed5322cca2d8dca035eeb6d9f8419740d11b02a9109dc54aaf36a1b499ab66f83a8f0eb51d23f09417f3d84067fe72f1b85c3cb5d6fa375855451a428601fdbb99204d9f03278d062d408ab76ddbde86b1b2b2b292c3065aa5caa256777fb9ac7b594e93c71c3911f83aea30c47ad140900328ce59f92468bbd041e82dbe17e37bf1adac8a69435ba8807e602da5d46bade46cd65c90baf613afee872ac13eb3952b9cfb7705dfbf9ea300118843a34194ba3ba5e448d680246f6e6e6ad0de8c4867f0437feceb668b1f9fa95f4303d1ce1803b3a6664003f30b6ac30a5f69e8ebf5af7f751ec7793973de8f1ca18e29050cace10f70d688a4d8c10d6e4891053365c9b4a2bc902f18e36d7ba2932049018093bee6ca3f3fa1a380a2248773e6d0953feaa5775ca8a17268a8d2c8cef34877a741937468e84585270bf024a003e60cbe3942b01904201a0e8080bd80e80b8895f3d531d148c43cb9b4b0aca89c46d388473ce6ef64329d4e279593ca496592a3c71f1eeb3762210c84c79f1cc48c49957e821e36827da036f7fd75407febc575f90c183eb3d9daaca94f4bcb854332922ccb3899acb4b3e7aa919c8d3f35db824973fa9cfb6aa4cf44c240c8645805f8081e491f3ee2309d3f1f680d6c8489e96ffc058a57a789cb82616b33c67a316bd8d27e010a0dd9b145ad6cb4e3184372c455355ee0232557f980d3bc3b7972e3c8f6f8699037b505ad6ddb2ccd1034056dd5f8b69c6cb55e7c835e2ac85ef765cf186f4e547fd6aa73a2ed753e727adce04cd59c53c489449c4824e2442d1f22f8f7bcf7def3de7bcff372d07486a1a5d02ed903e9ccd9c5468a169f524a69dc68c1d1381d80fe5d0bcb8acac9a45b5872a6d13e9656516a379a9e1b6dab387f9b496f1a76a6ed39ec80839fb0a39e693b4f112e18435ade004a2d3c993685c28310b0f074abdf4ba7bd5793eea6380842422d3cd168b32688da5070c395f6234aa6b7d746db68db132e14f54613613163024083166d0d24fd04bb17b70fd0990936b94d4c1bd7a135681707d05fbc3800fdefec8e95c669c8857af6b656cbaeda685bb9096db42dc87e31694c5f278a8d3e8cb11ee96f9bc19c240bd9d636261b6d03da68a36f030a9dfcb84f94efe7db0eade1dfd925b4e7e8bf711c9fd93e4055be81e03ab934bf4d5c359b31b78959e35e1ce8fcf88b84b15ee0dda13aa3ff8ef36e7a8840f11f74180c36a2f5072729cc490a7392c248fc55d88c219d062144cd67640d6647cf23f86ba529f2a1fb125739594d45d034065382ae3b3c2f57c1604efe406910548820b5d1c805128944e3b684d1c386eb098a0db3aca541de641fcad207b5a52da9ad2f5abfb7dcc2af75deb88ed17dfcfdba37d0e2fc5f85e1462acf8b519ff3fd5a37f4870f7aadbdb796655996a39eacadb522d18e1e36a5c6b7c5a3d51289ec9d3431503d6c10bedbc5380378d4715cc7751cd7b90c9443a16666c9e4742e40e2063dd3333dd3333dd3b31f38aec2ac994214d1820bb44863d4c3aa835624d406168b598befc5f8de7bf1c5b703022e3115358a0d6a0867702794843e94d6324aa5aeb22c4b9f116124a317b18cc6563c4ab2e9f3cede7defc50749b9ae48afb7266d8fdf85ed6edf3df67edbde532cfb46243157d5254c260dbea19634564b1aab258dd55267c6b80eb896b5c4e5288c144ca02f800191a8083045a8f5867e302780216f6e0edc6b90db33ec481ec77d43b8ef7ef4759dce21a9e3ba27dd7b69c8714e96ec844266c84608b9cf07ef9c00fc1be8f04e214004e94bf4d4c8d7c33d9d3f7ce5ffc3552e845f1e5847a4278dde8e72484f4923afe32a878492540374891244e8452f83ea112f4b2594f78ba0ef57d2f88ffffcfc608c771c4a15d5d58324d0a4cc3c0bd2aba8c1ee78125c8a67e1a597f8e6fc249fadee1722c2ecb2ebfe19b35d4430a0f81e729b86db05a7b55ad2ab664cf030d05a4288d4a04413b4502484024f84f9fd71442f4484f9892801c88831147d33bcdec578db33ac78097ec4e83299cb688f120a61685126080daf22f43563ae0802424728a60d0daaaeb2e837ea026a73678df501489d703a63d12374f4a39efa98de84a7afaa343a3ea56f79faad4aa3e3b3f232747c54dee5757c4ecff2943e9d35ddd3776a337afa36f5f4e9df549a18b47a1d6acfd0bdcd7a2d7b86d7e3bad3e9a4bdba1dec669d493818533c8a3ff126bec455f862923362a4c2d0623e79781b0094e183162dde3884d0a29d610b60b7533ba88314ecf0be01eaddc3f2b2755d719fda2f5bfb0a1c87b74dcdab808526ae0ac014bc5b34a08c0516e03d0333c3065acc2d1ede2bc82a596732827cf0969911434712b498511ede365680b70ad355dd17c09328d1a26595f0aeb172022d66188f0033643c41cd2026892f696922e3490a4ef0a6019a4c4822c306323cbc07b083085ab42a017cd7757b033138da73d620ed39552c7b4efd20d7755db76ddc77aad58a122a9026ba2c07100198e920c1cac33b0515602e1ede28a490438c87f709780300ac0d55a11a546795ac344ed4f86495acb31a546b8cd062de303370f8a0c55c000fef0775382100ccc925ca094378cf004d3a892f494146c333ed1ae399b67733a64d41bc65802f7b56133c90e3fea5e44f5c85770a6ce160c304d0b47bf6ebddf35fda3d30bfb27b66bcca7e98272e515230a2e5e11de385640105be08c105246dd3ee79981931f674ee5536f7a73d5df5b2a7af527bfa099b7b978dc3874d40ee4d98fe71df327d25836bc9316301777010b1029a760f8b09b21d456c3cbc55c019315260a2c50ce27db2f1012d5a163cbc4d3225404eac708fe22a98192e325a52b468f1d6a51864cb8c85276e7878975af0f026c1ccd8e1a3c50ce230ed1e981930335a3ad801f3a5ddf3bfb27bf6abec9eef4fbb070030dff232be67a92e006caff9caffdb3ee4fedb61b6cf7ce53f63fbe82b990be12cf871d283fc05080d9a585c50d1d1e19976cf8cd7bb27c697768fcbafec1e9619315cf0801633023cd3ee01c0ebddf37d69f7ec5fd93dff2abb07e64fbb67c6769a9700f83e275bf6e73319ff79900bcce742333e1faaab560a32d8edf036d256e2409ec49778135f396acfb00583a6dd934a7db9aeb8ef683cbc2f68d22ea40ab404984c90a56064011ede1534b97c69f7b0fccbf6d17f4c88f1b96cdb20c4e50a5d3e276d00c2f2f909546831839c0170b470c34604769f38049c33867b1158473a288d9399993501221d41ff3a8e9e0d341a8d55693f515d0b8d46a3d16874db3620e66ac53a02b33deacaeb0eaf195484061a8a8b890594171fbd7d1e43e2aaa019834ff5488f1d82b060008d8631f61115b532d1aab7e4331e8aae7c4a0b3cd078136516a5596b392e7f1db920ca9c88964eb897c9e151fa28c91ad46a41eebd18a3aebd16db3bca0491426b7dea0e52908e5033db3aad0dd6522164d6da6db34b668d0700a4c1a12bf71e40d2fb0d5d4c1575625228ba9f7e23a65ae2343f6acaf413e49a38a1514c1c9dd91885915edff77df41337154a957f62ad31a8b62dc74097d08f9274e64426afc0e9a21cfa019010d00a65420932880736184a32ca545e6b2549525353173e545a55359e62fc418f43ea6b4b5f40c1e301710acd25c0309bd95a371c286830a13cb3bb909050fd413313376fdf8eb5d67e37f75fc049448745b96a3e682d8d5264ee88ecf4d1b5d24a856e5cf543484828ca0182d0f513e74c854306fac655d4ddb922ac7dcf55f6abfd64a0958e6aadb90ee045345c93ecc47390783359c2692908e501807eed0f60d64cfa788333c65739aeba09698d9aa3529c9b9c7366895c30180c0683c160b0087422b8d7da1cbdc160b3a606a8e233a3ff501d3be823f6b3fffc70f77d74d5cf7d250e748fc460aeaa309f119d0453f7bdd2eb7f61f4dea7bf213e3ceeeb27120e197de97b40e9f5f320bde9ef9b4aaf3f21dd973e7f7d44c2196eb81bd2bde730d80b5eea7e39a36fc00cb1572c2e36223a1006dab6e83017daa9ed5d89cfc0e0aa9b00ba042bc06d7b9219e34343501b6bc4cb07f6825118cc98253312267431beb556168bc5625556855598bea2a4a22c6b594b26b556211a6a149ed70d1ea8d568681273b6c4c988fe74f68a9f207e7ef8e1e1a7c80f0d7448674e9e39736730e5827e41bba04828a2447644490e32234c6a696775f5e32a2534d01fc86d11b3c692171801ba2c56574233a66201bb8287b2080dd50b3aab5cfcd472ca502d4b24889ec74210f4ac201de9b02758245a065afcbf466e24a13f1ad74eade2b15e475d9952ea9a35ee4e6f34a165a477b9e8e73abe726b7fbbd6fedc6aad9b9dd64e6bed2bc0356b28d5190294428bd4455f1bde86a0a150a0608105175cd4a82b68c65017b5459c07ff218b44323458404441a91803fe0ac430ad88017f73c6d8af1405956e2144cb0de75c6b2e91f9de9b73ce7588c66768a5b9a12bffd9cb093cb4520208a1455a0ae5a747268d8f227367def0dedfc70e8df7d171a79c38bcaff4a33b46bc2376fcc60fe740074e364c7780f4c0834daf984120c22c698df6408d5085bfcab7d66a28baa1212043f74ea1efb75c75ef44bd10a7d980afdc46060dcc187f1df8f7cc3a0fcda13dbb8e34a3e811836868a8e2d168848768a0433843d522f4b13fea1991ba9dc3831e2a02e8431e6408c8ac320d02a92015670d08135af4167e9195690179919460b11c85ba41851669d068d5da0d0eab552fc6d75a6b2d0b07010a4d07b55a10b796d6e66c42c346dd82155a6c618c31de2c7824e62ada8303b5a0590b9a3bc80b5ad7f60002b21768c98c24818084545710144bc609d96b0728309eb55699ac833c6622ee78c7d2a86937e8d69d4a738b982b7f2492b8e33805d6c13bd8b5c40bdc19c759f3738168413868f18e77bce31defb884d0a5b5060628be8062dda9b19aeb4e5ddd318b25eaebd22bbb4990b8ea22b9e31df3680490aed64a8021b4485ff565a4762fc801095200d2124c9bed45da8348345b0aa001a934d31da43f3058e961d6e410501bec0d45a1ee23075269e88b0201f1bc805e5417419224499224ad2c9693efe424fd8ddfe090291e22d11309b3c7c4a7b35658a127a26d3fa0f39a85794f263ea18f763c48bf3b6d20ac8e5e68a8e6a4cfee08460add80193a2945e3f77ef42457b10a376857559108589f06a9a0a36f0c4ca15e645a44e1ef7ef4de4ee1e7f497fe01a79f41d2639630b89333a6542a9d364bb758378cd0a2c36e8c5a7418f69ff84be59486743fe2defb198a949643fa74b82f85df7bee79049ccfa8a48e77c5a854340200000000131500001808088482a160402c1e12ede3da0114800c568042745e481888c4b1288771100431c61847102080106088310a410dd904342c4770ae2c5a59eaeeabfa259724264da163ced0cf3e7eb69ae1a8b570a57c4e6fa8dd6b4a9df1b1a39d9eb0c6ede7087eae68774d46320a9f7a54faf1317058bba45ccbcd023ebeae75ce72adcc958ca4688b88e52613cb2981472f23e6d04446ab91cd914bbc1c74b26cd42ddb1fc531cd031c7f942bacdc9a53c6d25d10961bd21e717c8a53c5a28bbf1b55b1d4dcb5b60196d2ef4b93ee9cab9ba5a3155715087a99967a44fbfbe3ca90d04c1063f9a8fc4114468958a3aa965dd51898d15d7b02488ddebc7a694257838ca3beb2934ca7ddbca2a81c2e690275502579ea08cce993df165ceeb4431f912eb4e9d2531268ff92e79a76ca173866735a76f6434e4d64035f8b9d5a39efe7da0d5e740cbe44e98a43f09d51fbf3ae0d80590280d7823323e412de44710a1932e62651a8452a40d7caa6fa808420b66ee9c77831c894e1338aefd26d8997f855242394d35b4dcd0c682004799426320f743236c753e3fe121d605b3e003b8282fb33ef006a8314b8f05a47c32b7d4776ee3ea2170dc9e81b0e5d5e213acc9e30d1477ba894f8f424779ad87042dafe2fa794a8bd33b8bf84363f3b9bce8b9a8fa594cec86e41b907f763e28c271f2971fc113223c8b8c817da54981241ce72ee713ea1c73d2b3496cb57490d4aee3920bf51fe15bbf0c48fc009832995f5b563d97b69ca917e2148b53c9ecc691c3920176327a1a6a6832bfaebf51111aeb0aaab97cbef3c74777aeb6996e4d4753e4398a0313af1c059b6bf7eb5ef7e8d712dd1892054c67c3584b0d929e63c492793512c4f4051c752fb801b4940bca3ae9ece5f180a9125eabf5a3e7591bbf7d38d33ecd31feca92bb7f6ae0ac13e1d83a853f69c85a0db64c527c261818b89196308d899712027d15dd7075f48fc4981b574e241a3270b264534a188fe83e422d51b6371a78ba05d432792c6809e8881fa1225962bb7d79ce03376d444d2985ac0fabd6c16f8b2119c059b5a0bf697f4a42a93c085164e578aab4d052575af216dea3c847d908c16c19a0fe58e3a2fba2a0c1204e60ed81e9fb418ee5595940056a625611d825be25132cc486fd710c5ef6d4fb14dbd6c97c89f7771c52ab259d4925f7329830e3fdd52dc82349e9146ebca3223312eb2563474e86ab03d34d3e00b6983343437e24fb666f6fb1302822395a257888d246e872157139d05b7e589206b65ec8ef8c65b48c9488aac8d680c57bdcebfe2b5ba14d5c95abdf61a27c53a049c36ddd3a0ad09458daaf508b99c48d5bb799a291da561362541c560c5204289ef2fb09a0ee2a4040ce4e4e27b53534423f6ce841b3de02f7b1deca73ef532d72a2854b9564dc0d1b1c75d5e977e1b29fb3cd431af2dc404ddb0b97943eb5a226ce1ad96943029c777f8c45425c4078bd2944b250d0505f2ee3bb555ba43259bf4dc6041cf98927e2506569689ba2d97f6fe3735c84532d86358dce2f3ccea23f152f6e954a66d4dc4f249e4009877b39bb7df27bc2d5b1e7162997161095879a5cb9710da0e83927b93266cf8b4a60b82366aff013e5bd1ae84bc7fbca44d57e4a3d9b5f149a0b7392925ed0e24ccf7d9454c162444793d505cc41041b5616888554117e6ea0517e92503941b2bd92a895df9ef4aec5939b18ce6e037f4abaafda1a4bd57d473dc150f06fb86c2cc9d0358f2f39e602faba43f00f2410c22221b51dda25d1e2e2a986edf9018b021630f751fb0e3b85c8237111693921768abf392445a74ced5d2f9a36533b4dd7471b02a69f725ef924bded6d5bc3743cbee9033c5640abc15ebf07763bd026eab7b63f5c54197f6f6203d602f201eb67d0fa1bc20ee8822bb32ba7fd6b048ab67681990fbf4d167a142bcf7aa88b098814bebcc36c26ca8c65886c8fcccb954b070e145d72468938eee75a32ffba0adcdf2bf1fdea532ff2c2903ec2c411badc7425d78e65c317309aa34bd7726536bcd499f229be61526488978c892c7f06b868301a9105df84f3043013cfc2dc25722aaca4e77536f9382bd18eedf1679a0b9e2ea5b8b141d8182bace5584a46aa065b781502c95d69324aa1d9a3a50322d5abd3fbfee012085e25412f913c01e2bb7ccfe96f123a6801d958a720a3e92d7459d5e5375bd9fce4c010c9b9f26862aad867bcaca5bc10a5c5bdfb7fcae26ec2a56c471b9f80942189408d38807c8ab74baaa1d54c631bd506430e9f9031e9a0cc91234202e31d9f812a7fb036f5741d4c133a6073487fe8482fed43453ea658a3e9634af6f68196b417b2336738a27ea0980811e7b226e36560cd927eaeeaf8b7539c847333b2fb5c620bf654d94124c9598a207cafba40df557ff9ed3333f643e0118f2656b8077d0968adc69b73f496ec24b4ccc237f946dc6f10b80f3d876b51dde067c3e40e4d50510b10ee98ed99327a18a1c01409c0ee49708e56f85ce476099df4eb663f36f59628c573bc8399b9bcebb132518ec5c8116eb40154e0f2c16976acb7460d98676732a4be0073d314e33d71fac61a82a94f61cd7912237a48909033082d88f9b67e487004167aaddcc46f31295be997d24c93442dc8c28caee267ade3432ad282c2d545762b13ea5272b88c6ae68bacf79e096cbdc5ae40490302e33d63078b1d0613c2908f531b10d53acfa58c104b09b4cfdb5413e468e13376e1c47ba9fba9b17b02cc6a9f4293b28d2371fcf70b6d93b2434bf1c187adc8bb37efd4238cbdff730e8044558a9a01ce09b507cf63181157fc15aa42ec889d8668687e9c0551ae8501f710f1c93a473134d3f26a9060c5a1c15d2d9167f207d1c39a02b821d5588174affc417b0b5c1927cb1e0286ca9dda4f6d753157ffd5b04470d9159e14887a80e6ab8a1f19043d422ed06be8133800ad9578e78bdc85e72cf42d817d9a3c819c98941050120501aa10d4de31c28249dc82385b7c7c5079d2d4ab38951ac56ccc445a00f0edcaf6546e1ef0734506c443f17cf3f8a7f84dd7597042cdcd012c9bac57d837d45950092c8ae9c65ca0a8d9da75aca6886013415f3d126390a30173b0ad845894b7861572631cbab4fe5a9e4f804e90febc3d9d8b99d0a96e44a64723347d901114d7471a99ae7a7b1debca9eddd3e63969b47f0e542204f954fe485b08757f91d1a54f3d6564c7c8bd2fa04022c76303a57624f5a3f0f194a5dcc4cf8e5ba42b0f51486a55b283291d3a00a3fcd8a8015c064af9da272174708b00b5d1f420aa4365c78c8182ea06f016fe9d5108dffccea4f6ddba764c0605471df50127fb19ceda2504ce0ffbe79ee29366aa9c170e063323296a013cb86aeb7760595a80928c8f9ce47207b0f84c77ffe809894f92ed8c22fb13f2dd029258824b78a7ebde0aea8d088488c7eba769cfad6b53389416802edabeaba8085290bcc3f5264c8a24623a0206cba54e404c6198509b4eb80c56d16640f104511f4c08f2d70b5cdbf0d9cfe5965dafa1fc55c709e7e2181260be5cfeb56c0712cc5eb46a0756de82b6578c148f569c15c3b8dc144d4a78a75fb96d11e3a57efc17bc811240a9740bf5f0e4c929a3e5b784ede12e8040cba8bd32056a8ae4bf87504ad8e575f5f7038be725d76b822a682577709b4671a67b64ae04b1e81eab36c969cf5255e760a579e38ccb751f0c48c389cbfc66119b9e07900c7463601eb44c4909e23d00ed40af4d0ea61737b4cf042e1ef5ac3aa3fcf47408dcd0f7fb9d19927cc8d7df4d382b85728fce512501a61a09c5a60dbeab43b3c4edb30522f1844eb7e4460b3bed72d4f589ba3ccb1ee83993ad7ba13804a0bd040c8d02b2380c2b94c60c2751713a447a0685e354fe192a7e36bf456d6586e19664584adb241a239646dc1d1b48ee3cfa5796a1c21e00a4aab3e96c89660ec1fb088aacaf8d1d6708cea3c6d1b3639abb8a9d05a7172c691a2f417d1cda14b39edb4de4c725920b46c88e49c8d26fa526f4467d144bbb895335c0acfb1ebf24260fd659596d6454a00ef7d744a8b5ceda0314057eb9dc134ea9162c4e5e3849f037e9400b3752a6d3f12413a5db908fc47ccfc67a9cfa7cdc20764db038f0284dd70dea8fb7c2e488d2fdcbb6392f225e5ae1b50ff42b6f844ea7c6a7f8fcb4f748d02998e2e2cd768418293f4a80e4e35eae5ec0a70e68ba16bce7f227de3bb51b297bffa5bfd93a3394aca82bbc86cf9dc90614fc67f245f2a7dbdb3b0f409d24c3820a2ee6eb676ea9b4f0f829eff62ed7fb97f7297e68f9a5130638ad2a7dca2825be4771eb3cbd22f0114c56092e3f5bd468a83561e6e7729d2aa1dbd5b094e46606e6306fe2e6649a1b5c0154bf3c3c53325cb1621bf692245c16f6e879ed3583f4d0904b38fd47ed01c387df561ea5892d4ea413b86275773cad9f198ba5adc1f90bd017f6f718a7346d4592cb34c24aca5ce127072a53a83296ed56c4f38de7b9b74e346a45cc2df6b35321a19c25a947ae37e6183e755294ee80d7e97db28fe5b9c0e6c5c3f3a049453f8614e0e1e8c53b885045ebcd66bf04c5c7cdedc4b95fa55ccd1ecb93a0288904fd7d12be14a930428093ec45eed85219faad90e2d7605ed62015701980f168b026bb1c4a929023e532d1accca458db0ab53af14701dd33c031d28c5f2004fb5265bf49a9204f16067dc4742924888de3f50e2fcd5b873fc20094a8fecb1ced477d2f5d8b3a7eb2b2093706d38866cb01ce69405e105faab280bfc4c6b5b5b30cf1102c398ab5bc6d40bdf4ab4f179e4376605479504296e4edbfc932884fa2272c594a567bae4f7ee2260a6f6d3ab329e6ea9212417753a7da37a37247b416f7ef093553d53bce42318ab71ecc0c56a2622f85a5f46fd81d2faf682625b16e3884b583af64376e970997446c5aece1846615aa870af143d19aedfc69dbe1d388729804fe725eca306328b54ac10509cd2f6495d2048d746fe7b9de9130f83147eecbaa14be8e2101ff76974dc6674247cf211646de732da45b46f8821405f935196c6d17cf7e34748f65408d3a256aaa1b8f3277e265caccc581672012ffc1caddafe075810a73c58a6c6b695f56650d6cf04b300b1e9fbcaa7b9e13e569db14180c1206e9fa6ec72ade567bb080a2a6084b6836c1827dabff80cd56a318962ac2954ab746d78ad049b7fc6aeac38e346edc028430e7825e470c68c44537b1fd26c01272bd05ddf1e2d85d921e16f61140b8356f6809e20237555283fb0584e664b5e6717cd841318944a333442c028c14b92c6040e7e3599512ac7d61c822b7ea8fd4785259cac9a4f6d012fa44798781ca6b56e4707f3fcae6e4d9917a1eee07464b8613f7fcb429d10b500cadc21f41ce00de7108c73eb4781880850e28989da905b94b45075fc2b240246286d5b44696686208c8be10331c5c1349bc28f1af235ed644c6ea0106d11d38d2495c514522e01c0adf9384ab8ad7b65ea8802d629d62ab9861ece06620e65fb5883c0d2db596a1dfd2574eb63a153554542e10b701f6c65fa263cf1c675756d76f3e9977316a6459162b5da2287fce181a7c92c7ae6f16db564a3238fc982262bd0345c1def70b8c4b898ad59e53f43d3f9f521c0ce3687cb010d68e6b764e5ea6e75583e4e419d23c0c5de011eb7b8b975f36411e286b0252fdd2c6259c275b0cd55f7fe97aa9ee0543bfb586582dbdbe334b4695aedefc2efa566c0534350f303e81247bafc3de31222d5d854facb8da3d84d885b7cd0cc143c705bf51ed1b9f8f0136cbed72b3266a890a44b1afb5dc7f10aae153c4b72a8af644a9b66d237cba959d4280478e21c4e34e7b717159afe10452c7b43cb99b0b8e65f9fcd9bc8715d0aee04f79279e1e6a5c09b860b9297f788c28d3208ab73d14f70b9e7d5cbfa2ec46e7db7cff55d8672e4ffa599436a0c2a04057b5d129368450678b4a2aa42634be68402b9296cf4723ff0c6572fa205766af45a161a41bd24733f1abe2a573f29740a1c42275f7ba9943927398ee2b9b8a3b78d12a5c021a158209027aa2ed3fa0c888f619bcdb3fc94871b44c65d4e5ca5ebf336610c587ca372d817c3574c76b22fa39d4c16d1be8c28dcd0ce90a9637c545beff40b42fb93d621a3f82802ecf4a67c0cfbdaed211ff8994bad11bd7300aa29431a6794914b92984148721616309c4a23a49b4c0e9a0cda204b59e85512580e4c21f4d370416a7bbcec7dda02b20a2d5a2224320e3573b39d4430cdcabac878499ce273ad229e70191931a6c2636ee928488748c2e1fb8edf42693332782c547e70b70f7f5cd07c4bb7ddf9584a4dd6cfba13694d6677e1e20e3246363e762ffce19269c51fdd4510dd3c64e3e682bdb1b9da542f09e144336df0dd1902346a83602d9003054b573d4246f042643d24f6590be512214420e9dfaa80aea3f7cfb165bb8869acf794c1ba2c4d965266ee780e84c1aba4481f2cf90c1424600cd1b271cabb406f0070a25925ed4fd0c88b13b3c6192eaae156a8c5d614a53fa50762f42d67603b65f7f39aed38f52e615a58e3cc09462e2d95bb5152e389c7d861bbf866f87c3a286861ef0824ffa8bcb3da8abb4cd4c7f7b19057d69b45b3264b7ef116a3f2ae862f09f77c748892e499ec374ad2599beb3a3c6a802338dac9c8a9bc0b77868a024b2bcb889453ca7d433780f23091c654de6d582742796c93d6bee187f59a90dd0578595870b6818b108503ad85b7ff099bfc6d58fb9e6ce50d40cf1c1bac24aa1f795ec2fd9dc8531a7bc2a4f2be5f5d16062e5a187616e60dc43f68b3b4306cdf3517b68311f66b2aef0302b0141f461dbffcf7bc2f99db2f1d50d8aa415f61794f7db8ef979a3204d0f48b58efbe3446a65e103b475300046febc8f4a6703dbff23f8697cc7d6219aa4cf3bbb3bc741a42e5cd34a8631dc56425705420ec5f8d081eb110576aea5f4490ccb773bb2c190115bde56118d7b9bc03a554bc7347fe3329729dcf8094ab43842cfbece87677fe7e655a2e8cf448d95800b0458e8229950a459e2e12467f4eb246bebc4c119a4213ab980f48a34ac99b9581ff5ece98171067b4e10ba86828013796591b0e09d5042bff08698c7f4394cd95d66177a9a9d8ebd3a006fec018ad1cb7d23b3db21b7ea8e6e597fe3e8fde2e378690ed4278e440a5d09da71e3a1f6eedec6a5040c88ebbdff81d87a2f831880e3ab94c5c1abfebe5ce93d345e585694e62110f078b74ee7682adf5d64141c0f9eb03ad82abf3268b1ca85be5098c154198e725ab2db4eb6ba03b9699c636c731348d7b79f456c0eb01eed0d3e3052a292c3172b653ad33006894b1132fcaadfe3194333ea64a25c1e8631f78aa477bb4c740d381398f4d0916849fd903e0078e8b1ce64ff10a415e64bd583898f7ae50fa67c22f374910e264107935c459f5f602832509b91593651b1fd3700a18a700974397857b0a4ee8f53fbdea3479fb19fe37fdedb5ea2ed28e5da1a5bdf8417f4c68844396a1d2fc0fd71986768569d0d93cd6d61e753bf5a526d5a66e109390205efba8364895d714c2705798fc650b1b0b0c80c9624e4d2fb24d1ab5656f9be8587e57b1ed564be8d4f98970a8c5bc09dc58caa415bb5e478b987d8ac851a992af03a8c0f3201417f8932d6c937f9a886d73080398241d119b391cd2439a2e2c3c8417209e69f32d7c076923200665aa584129f6ea3499d6c0c2d6efaf0e4c3733b4b9134cc6c8905de4b79349a3450cd6492ca29c6b14d37bc8fb9c546e55d092e6ae24d3470bace5d035c563c0d993cfb1e1a20239e530684250b06c742c004b459779453563af7b2ca46f3a59cb372ee907fedc79bf24ba377f5f39c9f5a7449138bedf18f007bd3060c9a66867ebe7f039a80064aede76f3d1bbf82bd2f320c7529945f936b4980b3bf25516b5c5327bb57153e3f03d47ce3d82b99499a401273e89acff3434e6526a0871c5c5a0da18f1534cc37c8955c5a6ebbe1c4b6c464bd83c585ab29b61134b3df09eff43106c7cdc3dc65674ff3c80468be491f0e1420cb74465ab20d97723f3e483fe586569adb7afbfce0aa6326e86d1bc6ab1acdd68b685e5f283145ab0124532acd4a003e3af8e573bb3425ac32885fd64c3d484ee1e891228728263f41b9f01c07eefe8565c047a01e020a4c742c830e5158cc1a02f124b3924f1b43e47eeca591213ea336c531287844c6e3e491ca2d6884e9e6897154b018aea4785bc66e320fd4118136c2d2646b5d8e3b3adc87963f44ee13f678f1a6ea4f783bd17049171b40eec2e01b531ba03767a1c63c5c691cbaffa04ff49e5376a33c141f4d604f8f7242ff7f8f015b6254ef14274d355dc471caaac80ba204c0519c780c868ad8c1374dbed5c0866e74edfd9ee826f8f2bb987c4c8206f21e79d9a3141acb63e752edd36008a862567e47e0a2287e20e3540ff21611c0abe5ac3fd00dfcb0039269aa28caea69e70dc2d26378f54ec8a53828160f35ef822b5e4629f841f1fcd299745b7ca8883180820eeade6f0003cc745811db4b0184b724f9ee000f5532fad50d971a6110d5bc2e28ac8ae9890d883726980c7b63453b34cc3040a4d63971635ca44a76b4d942336483916e4d44e71793bb05d87a940414175926c8a5707b796e801110f72d11e589a4cf828e70e1986d3637c14c22046a89dcf20c404facca3c8e8e7ef41a3d7bb3474c5694ee7b1be7e99ae84bbb812302d7f8ee5c23d1327737b9601e431e85d929c9f43fcbcf28bd247481e904658d7d85bb2bc0e0b684f42b111802e29e1bc85d6a41ab408b9be2983104f56d111cbfebfc5d4074c064eea8f6cd38d5e1f9a5ed3897afd84842ece3c10f2d581279ff1b70e161abe92e644586ff021e1a4d0ba46b3e7bdeed7b96a092c08ec495d1254e2e5af1b310319efaf82af5f28e33329c6e0cb52ed8fcca8080f0b3761260098342d53fc86f305741bd065331ebe56befbbf83b78c3e6a5b09493385ce68f4fa58bfabd63528640eaa8defb3c27441faa748b98368cb8e3dc2384ef2fd5c819228bbcaeacc395d691b21db099b6525976409c7f4bada593cb173bd9725a181d3d7556cd2b33d922b965d2ca8350218f0a2bf5844b9e0eb12f94ae726d560ebbd982116df8d38e09740c588a38912fd72f2f985ad403c4d3af76f81fbafe1b012e9a9732d35e9abc33c615ca05a6a33e74407464f76332b5b8263ec25cbae8b140adfd76c30b8f4ab680b48189584a526ec8b5f73221efc3a621e4cd30e7cca2aca1ef15b6285c8efdb9104989294c19d37a65fa8c7bc10349158e1f7ae0c8eb426a51e7989e4583a6817df53863da0fdd7a1a2c584ca66c151fbf4ecbfe995ecfeab2ec4fdee534652b5ce88ca852d7d44501bf95f5d0b3648f60a43e3d4846265bafc6fa74d6deedb6bb7564e64c9504697532c160924dc9ecf4e5e01ff847fabc02772da92ac5700350ed3065644070b83dbe1202ab764ed76e2208720481dbf91df92f6fc2129312d22368bd604889f5a176441818e30a18714aa90879dc8c0f27eee1cd0402e232e96ecf12519c15560b9ea8354b59d83e03cd39598fa3aebdae2fa0353fce1797c53bb7a38cbf19a1afa0792ef4524dda345382513ef7a1e400f79cf80c2df3eb14db254e1f807ab8e22bac4e2b404c8389cd071261944ac79bbf22ed1055b4d000d2c93e59b1f630477183c6dc74c3699e5629fb101f712abaa2c2d0a2794ce35b3e2a13f21a02e15137274964b4fda76a9fdc978024325f8b247de1b75b2aa5458090fab5b7f5441a3cd5d4ecc5988c739885b1b9216939eff8683904195a2696bcb3ad5cc673f4875b330ec093181c9f7237728a9442f88cd25b5541b44b93f4c875947c67b7417b039c38f90320a31690200b39ee8683db566ac001d15cdbbbf710447fe5dc2246f0952f1378e9ef638940ec562d802d8b7947384e6140ed920761bf3c36e1c570a9e1435acf1092b8bd7e632d2878b91896392d00874401422014d1c378ac5885c5f9d5b426991557544aa98503ddfce52026ddb16764bc6c5f6d146e81248ce5d11b0c5ff15a09d63c44d34588081e39dab85aac4ddbfb1b6345a2b6c5be7bf8beb20e4886dc71599904aa3ec5b83efbad00395a5c6461eb4593be78b46829acbb6d95649999c8c400ee6880913d196a4511b7408a51fe4e0d67c548a5bc8818faffa6e42d1557d4b01a6f6ba9c658a60cbeb33c161e2e09f5f259cd7877525c499dd5d5be16af96ac15544d0957dc80d9f86e65e1a1b1f7215211a9692cb363d61345a30275d25b923593fae9d4c8b5cc236e358afde4012eb3f5a8ca181ff30ec340f5a370e4c5c7b128d9986749c42971cce72b57955bbe54a34cc5c68e7b999060cc031aa3da4ee547472993d2492dda3d23aca792e62fbc3ef94a924a87b8c67079319eb0968c5f7c9b6c6ff2b7c0cbd5cdcadc3928500a511030a66b2e496e10fa9235951e8648f9442c79fdd3210e78c75cd351ca397c879955091ce3c51c9b9cf4c29d24014640fbc0ded77651e96c0c09f2cc026b01f85ab1ad2430bc20d993e33cf726ac62569fabb6458fde05ae14d48d373f228a2096f9a1b32702c3c041532bb7582991874fab10c90070cad5e39dde0722f783e931bfaab0443af50ca830820a715468123e0106494fee2dff5abcfcc79e62551496e8de000d5406762560f470855c1393df2a85072b9ed60027fe4256b1f72bee1abcd74052a747b858f5956c17a1e39728b3bb0149fc911b0cb32537014f028454aa7f6c115eed667dc4326552ee28cbf5021ece50be0383066e953d330458d88e48a7009a2cd50197358a44b5098f79f35e3a325b9765ac22da2c98361df2d391c3650280b335b812f561437c9549a23e9d4c16323faf334877a3231b6a98c5ad35e6f0dd6509c777aead8b5cee83c79d5b7e761988334926118c66e3f2c438e39fe767e2a197832a4a2172090ebdaa3bf4cfaceecb2acfd3d4d67f7f40f4fea7e5c19faf79c2e5da97fa2d69d81d703b1a53035264eab7c0ad96d1766d75a1126dce4652da256542ab9621bbe8b7be68c911fa76f00cb182692c48e6966f7eb8205606762fc009e76bea5c5194f7de077ce8a12e1efd5ddf1a4d00bb2b2dd8ca55d131a2649715532d65fb19646ee50038af1d4d4b9f7220f5b2534d186ea4e308e0f6212d6047c72964d2c0a5c43db9b93a08ba3bd2075ecbe4a9515ae6a646d5c111f4386e3f616580b9695af3cbec66140b77f44d991a5d6e52b0f5b05b18696b7357b69d983bf92232110632673e56c3987080866481b682550e0ddc665708c1d5bdc75558f2a95cea89852a621e3dfea00d2912a885e83f2cf706c24d4a8c2031d35e10feb98ac288771a2316111ba851c5d26aae7317bc255e3143d42869bd743bacf0e7bca92d6f946b357d657893dba7b65ee13b64b5577389f460beccf921b994a11e8c9d1f933168b77eed1a58cc3cbbfbc6c02308854268d48b035d3915fc247ae11f3abca80d29910aeeba517314c070e55f5453517a1ca3d4d062068d36ae7953ad12ae68e1c4f31f98190a6ecafac15a0704052b6228db390a0541556da9a1ab22b7126cfd65681408f1cc6e88b08c9ed640721708716a1fa7356e47ba9ed1c99303142d17e54dee081f31b2e3cc3253b34446d8be5e1ef08a9b1adf4c9e77bf016a8a09c9981a0af2d882523800538f09b52e0629045a5a876d8fe42d8a655acf1b8206d0bbfac17487a87d47caa9447c8e5482a1ce153f38c108dd0bdfb85401e0b03058323d79258679728901153a3dd1c097da829091be99ba72de760974ac7e05ec584e5d9c1781465857363a643283363305bae0730721fd0dd4aa5181bdb60f76182f1c247fe8dd5ceea0b15e809f9235888a4488783ae21aaff0efab170f9965756234d23a918fab696f859b3a8e4dafc1bcb169573fe74627e572dff95d8502a9a07d00e83bd4f5b210ff09584c7ec3cc900a767e164606665baf260ddf89620c95f4b22abd938c51f3907997b74ea87e2b5f702f9c7c9268127dbc5ffe9837b8ab8c8353c64ece2f4b12c99494d479e249ebbc28e7d30e514d0b2c4764800198e92454f9c5ee89dbbce553ca91c16703465a85d2c8a032e2d457182c798105afed62f9c455c750bd9ecc893d52be17011e880150c5c6539efd6d7f0b52e0ab867190212de8968170ce9fa56c11676576d5a26ee169f0ab4f715da24b14fae66250a2a62f87d9d08c09e5b2af8856c315e7389eea4a079dec7f6cc32c1e12690586f6722c6983a13c8c6509efba993bd887a86cb5bd1925204eda7b06e1b803643efe31fded145872774cb91f76514a6d36683b7ed367911e24737f9dc9e33a2eda993bc477ffcaa3540627488d18217b6ec0ddc177f428b0fc02ee70c71f9450d5e17ac69347451aaecf1ae1f8f45ea47518161a45d1fd5072bc0605e83a64007db0a310170bc6ed6ee3aa1ec59ab5677025586283d5e2959206f0539322e8ae217c8d4188b8346c6cf18f0615c9ea9010ffd10515b87a0fe1efae3a6662a2593291092ce50d82a972244e1699ee72734dca67208be14188d2bddb987d982f9738730fa22a9a521504ed5fb0218997db7c05dba6caa996ed6e161b5f4c793ba9cfe20944e54088d470b612251f95d92449cce73882b700565f64c924bc135d11e503ba444ecb0731bef22618c27632407f59b51aa917463a5c300a17cb821e88e7befe9a61dd9b0e2d64cc69257ac27e03e624ca2830703808937a440e5103d576791cb8a6aff30c0792c98489ecf63aa271b564ea565dcb56ae14ac992fff327fa37035a7c67fda8343c7334253a8d49dcdde040207c11ef456ad45ca319152f00440dc0daa661f48b69b32e82084888aba470579bba508ce1d524221a5ab876b885abbde06e9dc4929cb01eaf71e588028603786c2c2d1857f6fc3d89d691104522a6e539eb51db6c0ed27112ee91fbfaf421fa77d148223b018b79e1c12c81b98ab3fa28733bfef18090a64823300a9374cd7a40d1062fcd62599cc8c8280d4ea3b294c162692b5437eaac1a1d8cbf9988f587b44e71f65bbf19dfe7f235da5bd7795e2c3a0293533f0109541c3f33113681f675701c81daf1d56245577da77b376c7b73a7e10254eaacc7628f3c96206e56f2c4116d069abb50f39d466769fa943fa190d264fcca790411fd492b9af819f0e501de6d2ac28e69e6606e92865e908d8c19d357891300d12c61012408bf1b0479a20d6cfc5a1d95a814d4479aa656cc070a6b4078be6e29f4108164f61202a9beb077d10f190241f7a0ec255fa000f651f29ee21865b37b5d7721cf7ec1da367026fadfd06424904e4517ff3b582a8b0fb391d4114b3db0c0cf7d4ba9376805709f60d297f5203ede69f9a2cbf9c814b9cafba620b604f9e066e583561f5c109799ceb5bb731d4c8fdc76f220622dcbd0413a1da25ee185713fa53e82614b07ec6261fbc559e66889bb08d48f3c4ede89bb7361c220bf83e95697c4da8f560c7840c1c02aecfb05fb51c184f391579d017c094885f70245ac170caa758213aa5ef1474bae2c14907a62d69c88dd6ec448273bb077bba77b0bc3560bde8e0fb4d1d2eb3a9efdafb0c185d1a13e14dd70c68d09424197860d0df04c2cba42e2961b8d665c61d98eb95de647561e207c53f2b6f4a5412fb7763bd00c90a94681abc0a04cd9e05bc38549c66d18f14d46b13108790d2535ef00c25bd2f9a28f2f75959832f05727eb054bd80acc218404474f74b4edca44213aa2874c230cdc775749236d257d18da6942bb77bc9c3fa40a67bc10f0940e48e49062acd79914a0e57d915b09471591f967c5ab1ad3dda434abb8ee3f2374b8dc396741756742ce7d55c2652815b30340b3d651ef2bca11efa1f3a67a8fd3b3802016913cb0d1e3c4a07d637493db1678786fca68222cd43377749bb94be14605b9b2ca4faa5393be75bfeeb96b413adb27ecc991f56b579e5173c1aadc29230e28bc19babbef88f9b56ce35e54accc2b360051a9f52ff306c1e4265c14a11524cde6bc8401509eb9b49748dd7fd543e383b2d59b4e89fd25115020843f53ee19d92e3ece51f2ce9d948eec10499c561ae8e77d587a89af6450288e5fe8acdb2f41916291f408f83f0663907b97324d9278d4c232060805482850845901198e580f28ba6309b0b697a94f8aae4d03554b98dfb8806017bbb44460337dd362a6284d62a28e709c4ca71927aa949aeb24472745dc3f21fa33ac61a6adc21070d33607c18578e0b66f7c6579e37e7d55ec8e043a8e385043a25138361b4c6c68251970b10256befbb24181acd0ea9d1f0bf9496a08af91ff9505c049d9d45ef31a2a629871ec18aa2c5fe5bc541fcc091833bba17b939c41cea89e9e529d747dbd81f6ee0f446fbd0d91688e90f083b0e44e13dd0ddc700550c40f8999171c004aad5b8377e2badce024b570fbdd89a772839822db177e56c9a4b6b0727514295cfa6458b2e72f8782192f9a19b5d34b13fc555b6cd5ad95c212f6a8d8ade4cc6bb6cdb090486582c18e59109cae8276011ea7aa4e9756df3dd149f0154170e9034ed46a129595bfde196fb720b858c9a112d7804b33b435d949498431559ea03d1db49e0b76945abd88a7ca92a39651865526bf52e999cbef3a6a8389b1a2d3323bc423670e0b25f026b504022d5024c3813c614f7ff0416a9b5b01e04cc1aac201477ca613fc4ec4efa57b25498d3bb1a63cc9cd417babc3bcb97e89bef90fbdd88fb0e3a613a28a4e1daad0d2e66a9c1249a37cfad8b728645d2e51018af5f62d93aa1e4628f6ca8e4a814a0d869903db9ea08af733fe4c55e29c1361c999c2c57cf984f3b48d7c44bc4459ee519141bb81a315f3f43722e518f31be73054d4e1274ded15a455b70a06318f7c536fb0d3f086982dad870824657584f1dcb9c0a0a9f16bfb0e02e302078278cbc5fd36a9f2ef257b84fe970770e0c3dfb030d1436cb162f16373df92032a136c6f406c5fa5c0a42f69b1fdec3719dbdda40bdd83192aab6407482cd74ed82793706ab619ddd4afbcf0f4f45f8e282bc41574061bc8eab606d306df24149661f0b75aadbbb3347af5481f9076745f11c4d65c23393c90218c066a2aacc916f0f9fa610aef344334a68d5d35cc2d2a69f9214bd113807fe7d6cdf75d3ad17969ed2ecb69a5ff9c69d4eb8162ee0ca05dbffca41a17c56d992e7ce3af445a32e9628d49cc6f8f0072c69ce55909d23f52863ff1e1e3701247f2aeaa25402d793135a02a51cbbf9c094184782ebd767bd4da4d4447c225d574bd5414ceea20fa0ccfd231b4e022ce8873625f51100ac7a90cd08502d56595a9cea435098ff91286fea9e705f756a27d5fc31f22b4d808ce7658f46b8cd880fe44d0261f36ff3d8fe94815a6392d78b8ab8bda19b1f40722540290ac07ff6e054d63133f74658e9ede5a04a06c84dbffada085db26dc90f62ed6eb658c065ec2608389d8c1352adae201c7e4b4e5e39eefe6318df34c597105811fd0ec6f5e815b77ea7aeaaca36f689baff5188f0b4b42f05c25df77f997c54dcd2b89596c73379cd2f095487430091ffab44732f6fa9191796c6928695190b317f14bd3906cf26887486293e2e4c10da51665ef00f67f14fd237d3178a55c04e8f02a72239324ab87b0bd3a0275a768a2b183e39871c1b0b0122baa8cee25f0da6fc86e1a8c89988745b1d9d77ab20a6d130b5cb61e8059009e88cd0209e0d1d4be27ba547ea32d51018f4d703a4888be6b077fe0091d64129a484e072adc4ed03bc529b5d6e723e7b13c95635285188127c5283ab050311c580afc2109036b879305555134605d9814b5f97118adf11688772b5011ed92ddee29a722ac269bd8610e583d08282359e3bf11049c87953ef4dd838bfc7bae24e73bcd0e5d864990ef62e355d0845a2c68f2b01675acad28ee294eb3b1a56f3283e6de45dd4c401dde567571de0ebd3db26de12be2e115566205c9621e2466a8b954832bd4a4c6087a1b2de78eb57e33a6bc57897498e4f09eab90edffffbed461b94d882227feee1c9fb5fb29f766bcd78a4622d4193bf638b02ec20481f3a4f8bb97c4aff3f2bd447c039d3663ef8e5dffeee0aa7e53a03a08ef153d85147d5942888c5ec44e4606fd488ebcdd4bf3969a3bd8ed5e09f49634020933ca29f006a8dd0bf972cba832cc85e4115a614b6fdf4d31efaf01a0613593cb00cb1b73a3a5ce1dd5cf4cb822bb1748f8a3ad8bb76afa0877211a51df89bf5342b71fa1e528c259cc465a1222e765572334d1493f025be1ab8bfa60f1a7468a71a394e807225ab177b6cb0e080f7ec4419b2b3e2b9c09c6325422a1d4613583a310099c09211a5340838f6c7e3f1b448d3eef8c2f34d14852a9f77cd0f790c70ca86f66c5dfa9890c17ddfb31a8f9f2828712b6dc0706ea0e8fd56260d42936b085606bc400c20b02e5323701e28028faa6705741f8af6195baeb603b6f174ac3d0dbe583a392bcb746c850716f539b130c4067f29b5dcb8d9da2f78201eb1263150127c5e82c078e3bdc017bb8b2e545da42d3b5a37cf29174e723604e1e7cef99156aa9a24168a5ab91189d01483b0983300245456e6a4d1df07220126ca9129a8efd137f553493187ef73aa19217699fad7692cb533b0ef33d783442b4249bb40b53221d407c39b0bc19e1f10b2d001aed148411379876514438662ae5b24d4108dd391f9cdd702a1f3ea7d44eeb0e22aab692eaadb62ff41c408f680481786caaa30702bb3c3f12ab9a57005baf36bf71ef24df7a2f599768ead937a7f69f1f393abc2400811acb1e82232412398048d911c0406571e63a4dd91ef7284eefe7f4c87359087117c55201c9e7c885f2b9a94a545b6a629ee6e74d30d4eed5c0c904e4780230b5255bff38d0b907293d37ab8e2819d8f1670ec99429ed1380f095b586db5b9a4cacd2e7ce401470b577f67c19f12ae18945062e49c51ac4a069213b0d22c8f5611830d35b91887a387e697b92e84b1387eb7436abee06940633f5d097514c8e93cf5e85f1c634f94930d3ca0f8ce76d179bea1286d0a1bd0a9fb611a8a87687f347144a68967be0f3e07b1899829d296d9d184e532da2be9b5762fc5c7167b4c145c150e31c75b7d59b23172d187f8cd73f3405c54bdfa0eb3c1e10117d0a39c76f5c51d2ab054027940e940351290ebd3eed5a6536179c3014bc056e9b5739ca21ec8881a8e9be114ead8607c231de73266366668821daa927b0602a0e3152c6056013e0eb93edb1d8792aaa4c69889150f20af0e315f0282156ced62979e171e487b599e84121169817f572266728b85500083462fe00cb4a49479ace0bb2c89198248004aedb8cc1da2eb70ef7555b4f2d584213443f0fc5d8844fa00f445cbf9ab570076f2000a8ac6850792122f7f1b14edd455a53293e91c364e2da02de937326738491321cf37ed1db8411c04efbdf42c0c7f420a523863cf07ec43f2b03cd98ccc3120d0ba7cc4051a2859ec667d8fa7f1833e43085fd7e8b052ebcf99c1141b610058d5e321313faf83817856f0a5051859eab4c762c40a23f5f4ec797842c7e45c49a660711ac8ce1ceb37a4909ee7a6dd8c760eecbe0b1ca9b0367c0ca3c10c17a2a79bb8dbd59edc805dcbe26758cf05c54c2b720676f8eeed1f1066ff8cc6300ea581b7efb71f812f14019e6b7bf676f56bba43ee8ec66df9eb9ce0848e5db167a0e465816455f4618acbdf96cc3c847cde5fc1a8ada8e6b45e631e0fc7d7cf94d33e32f6ce51d93d88218c8875268ebfcd0b2bcadbe152fce1f7b9f93a3794e6f31e18ddcaa6070cde02593d574e12098a0d5dec2104bd32bd4a6c641c1a1107bd8472d2600f43ddfcb890a820ecbca7259f324b126260fc15248909ac690dba9d1ef3cb15a48f361193baa9ff2a27247d53ac8c25bd4739e1bb8fbb4b97d95a7ec4b2cdd3baea417ec02fe0ab3c3e5a3fb014a3546232318907c58235520a0745f314f12bb048c23110b3bfaf2584ed0da2ce71d8a361daf9689f7f8673034617ba6d3bcda3fbd6684a11f105d436c5a176a6107ec974e496840d83e9a481a7a2a76703cf52bd359f98df8d7feaf4d06111b46e5fa1820bbab3af416b590d95257f1c19e7adfb6180e731ba5df60073086cb5eb0d945c01792b1cb3590696c4a489ba4d8f4e6e00f04a1df1882201ac3801bddc4adc62deda6f6978631f9f84c680477e4bea80862dfbf2aa5c83c3245c6617a67367dc1c2f9dc64693276565a1e2ab64afdf4bd299b350fafc1e66aab68640dbaf77359515839613b5dfd57133e1ada5c1010aa8c24b084486f8103c1b9253c324d2c2434ef455a6f31a228f067d6b1c985c23a29824d348dd0da6f114a41477971452b115dfd2e7de544abb40f92c658c516bf6791f7bded223ff99c75bfd3b9de101b9227a71c3951643c6006a84147116c8c9632d6ffffcb310d340316b25d6e9c6771f0316f89d6e1b984a92fd671bf1b5204a0f10158e712f2fd5fc4467964bfa102eaafe3a8fefd35918145abd073d1b0f1aa4d6d65c4594aae0ff125bc9e3bff4dd59371b8c401e6083a0fe8e335bef96e1ecd9be7d3132f9054cfd3ccc507127881450489773f12e746dbb1dd5c152a3c09b8f3113938e05d7eb7f03c550c2ef196c799f10978fe320e095a4caf84eec65e2cc1c3cd9bd0d07d7d507c1e16234b34215701d5c60a24a851e584cb4161cd3eadad885fa30a141a023729f621299cdd80c2416e8323eefaf122bfc41cc9098e8a6585fb7420fb829aa3ee0e3332560f3e57ac31d26ff349acaba6dfbaab5b9c5f20248d5a7daf268933697cb787a1fea415a59a30982019220a0296bce135df73cb65daf0e03039b9e5d417e59553abe5d1eb9c11bcba9075642084eeb32d2cf582122c00364d3cece31e90211fd0353bc85069ca0dd45e20a0c9a9ef0ab82030b23d74215b59d8bc807b8c5ef34a37c35fef496d32640ff54ac0bea8993b8b9bef04bcd090d4daf3c154d7ee0dd783a0559fe33b4a8464a853afa0e222a37139e0eb6655e307447b59833536967c6dcf48afd9ef1828f8d185d173f546742abb4f02ee8de6e1377474ae8c3557e1aec4fe97a8777e60dcb109c31aa257742276b75fc508e22e53e4b2abbc0f0fce14a42997d08201adfe051e0fc146cbc5f4d232d26eef64e2cf337a2f7643d34963056e57c968a490aca5ba7cf24297bf0028fee7cbe0db24547bd0296c5107c734db5dc8f31f809e0f7503579b832865c32041c7259900dcbf8a10c31e5ecaa58bbe5ac006a0d01b010c598273539d44052d23b3100f3209f0e8338beb5869e7edc60220136af86675da1587c95cdeba51990b1b9d36d23f85a8fbabc0418414b982c91f6689fe41ddf3fd7156307279ebaacb623ce59a5c54180f312ff0f4af2307146c58090a554f2a7d4d618358c9afcbf0e5ad73b540c198e0fe962428ad6f899e8239b841f0ada88e213a955baa38760eb26c9aab13ba841712956c6ff7ab307f8844d2f3ff169b729782205412b25dc2e9445a049d78854c8ee8691e25210b1ec42a382c8f858cb4e83ffe80346441079a23a54302d975ec988aad437925ea399bd0d4f4be4e896f3c7ec70a2e0a092da52fe43351429d59d0982fc7a72ddff202560958f59ca66f9c23031cca0d0f35cd2f24051c160a0d38e4d14658461378306919490927f40daf73f76f228e1cc06f47ac97ef53f3e0c0fa75ddb40d6e0adf147b09f1ffe7860d10a54f91b0b32135b8ff5666bdd73b2832eb9f0fd3c3f441284a8974ef8474c1c7aef773a71617207db9e8651290f7d2b558933cd6070b8866560a82d43d6085370e58d069a88c1b705e41fda715c5de3d3ac0e31ac1706f4e5266b3719f1fd9e196ead2d4a109980812864bc7042c7585078a529313b564568e40c0d24e25d942bba6dede0f69506fd43bfeff359e16b4c73a63a21161c7bf53c527c6e1418cddc8a5393e55e860f436038ddd63b25781a438b5b989175735f726ef65c2919634104b078930fcd79fa5de01632d696918479a7df63b6253f94a2185077b42101028aa72a7b2974c19d0ac76deed13a24263731d358f76b119ef9cb79e2ef04a10e047f2ff5639f4e2d2e19eaca271e0bcd24a768c9035a4802ba6a670169b2cf1cacd2170c6bd8778dc1b2d95485056f0db2d67375b501b00c30f80584cc87bfa01c21a61acc222b9a37416bfd4c4a62ec02ec5b371268737aa96266ef439d0ed11a287a0863894f7baff05a3af8c43c98cbf7372c66f8109698086b1e33c70db4efe44d053592a8a8fbe8b46ed135521c9ec86181169313fe17255a1959aba3f5fc92a267df10fc85ab080f115ca3a8a80810b3940a947035c7edd8b131bc32665814814a73f7fd7c5a72e163d2a21e30b174a70dc310bef92e8d1b64b93aa4be73ed3cec1438205cecc18149590c7bc2030c681e47ba6b35001c273c533e3b1ba2c8ac531a3563f3a31e0750998319c3d8c33c90ccbff092b892d0c50cdf3ac60a4dfcf6d29ddf4a9297fa303041fd65ed9722ec9728edb6ff463ae1b18dcb8fbf37ae5b43412d03710e1321d4ee2ec486817e42c46e2a4d98efbc14c233df4a4266ba551a8d99adc8ec3a02b08cb64d31952c28f6bb2bd1e015c1217fddc5eb21032c2c9f4fc11b49044a0b334762cd9e61fd392d3a9ccb22926230cd41cd68a583656d5e16e33e2fc088001de92281be3bf23f76443138ec4bcaae88c1dc1606cb733e70e41245b7734512dc37d112a6653554015485e675f8cb22bb7314ce2842fd5399d4002da9512d3f1b2c6d277039909ba06eba829fcdff81dceb0381622bfe7e0b1fa54e9300c1d40d7c43827b743dc60f59b64096283ab859a255743a12d11abb1ab338f8148993cdd08b0f3a55e64ef41129b67de6ff1470ea87b80e420c5580baba35d8ec13dbe9b2f5ecb4b1e0c6a8d3fc01614f26194b321b361b125a078b5dbb32d2610386a108b5899ce2e660b19261aa6dfe506808ff415fccc7112294cbf08133cbc36fe4ab2366bb2e51c51001de1c3f849cbb9f297172c62af206ca6e8405cbd31115a41ea5a681f24d28c74a3b8d364902c4d83faf3254eee66db3af2a3a6d9be8472cc9a6abd3347fa9568279583792079d56011284c33f215a171189e88b8680df42aa4c342b573afc949b6d51c36cb33e73ee84e933957e3eab0b290a61aee3994840fca3db66faa073c1d6bec375da15c629fc09962cb7ca49e1cd494ba55367f623db7879e0dca6a1c32d32d8156d17ec0e23287297f6b6e99fd84b1a53f37c1d680ebefa8b342819292204e6b7d1d7bc7216e7a23e890c6412aa8191b40b582e468ecbf0d7034236a1f78b18c3fa12b740106e1c274321e37b9f04c2f77ba46c8333496e898b84c7407077858810eb34addcaedc9accd5a0694f8e5ed5d4264adb1ffae8fcf11d8c9096a0a78a10c98139d3e563bb2f84d8121e780f2cb099e740fc44eedb40224efb5ca1f8927008ead24b0521f9daa42414531b24a9b4d989adb424f7c075d1bc219094e807e436626ab17c11198d363f6c780d30dfde11eb643a511134469216edb3f4fb03951ff6a749f1660a0d0cd833e895931c1cf448283777f8ae0726a1a41b98d037c9df3d3b21a44652cc88639e3deae6dc2a2add5a58a6dc2668130084c87dd2380f3b38607edd9cc61bbac8b1d2630a667b0b4f7ba69192869506659af33a05ea31f201b9a836d61aa39667f40cf89f064c8a362d9ec78946e8b0fc70abc182f5c4ed364597a59385e13eefdb8981f6bc451d35c05a4d73ff2ae877aa8804d6d9a1300e2a75af62cda3b97517c1f5ef5eba9183bc613695aa2af3e1d04ddabd2339778d75a677870917e7f108bf0b855d39e9d8605b95aeb00f54f03704e6bc07f95f7c0261365e5269e5421071bf125a5a5e17eeb57407e5e70165a36eb0a3e0e58deff89b75e2dc608fec0757523daca3d815a68a0b092e04c08f6e6b413d38ca6b844ff8b2b4518c5b6db538bd0d1c0e86a0a98e2a89a526d5e81784a7039c9902886eac3d66d0411d3c29b2bf5af65d2ec40f1ae76b0798e753ed8575400aa1a4f311c864c8a0d704512fdb8cf8f07ca53a35197287e5ac04523bb2dd82e56abf53de474fa12183ea878e7be0ca847c47b4e5b89a03fc8e84adf29a752fadc33c855c5cfe17184d0b5fcaa42778da632738d5b2d4d03c3f15f44f1c639de4415e69979bb208b102cb70339275d4a53e1298207eeba7f51019eaf2134401f470d0eff44f0b37daedde3fcc63eaf3725a09060085a36dbe943705287b28a406d654c10eb2f54be6ec21bb9d3dc6d9bd470b60ebc888c066d48ce2c0057c79d4135975abb070e42c9e5e2794d4e0efaf10a9c2e566f1ec4a0b4562631ccddcd80768d66d6b27f8e33a5434e6a81417168f1e041023e79c0bc8e26c67c64c304d9d240ea2a115fe8327113afd37f247382f59cbb6ec5dc9f1c9c79d3fbf226f096c072132870d59e8e266428ad98baa3b04c0942abe64999dc768da41fe87e45df464a9b2c7199b12c07ac6cbc2a461a9d42205cc086ce8b587a555ccc0008a4d0bdae34a1580424aab2d0364b6ec858a1856f3b4736404ddd4e90530c2f3335842cd9484143c4cef3f6a90066283468a23717b848a7213482bf5159a28d4947ba6435f56402185ca5e8ca5fb5ed22890ce052f88b500133ddf419f9f5c206f3f5cb41604c60df9460e6ab8e66be8923e90c52b70b2fcc0bbc2d3453f3fbeb9b2a3bb8756846ebaa62e4782e04ddc6cc61850c8ae8416258e4d1f55344422e967467c064e8b702b80f532d36c902e4a0f8e8667ac039d61ba86282fa8ed04af4b10de86643601aac1e77c450793c18e97e0913de08aa131e3e32f5a23c17fc96cc51d43c0b1b735ac4ffd75ee1ea4383c47e0ea4122bea8130ba868488842ad4bb7ed4a67103c7d359f0dd82168e27dbdbf501e4b04600410ddd0d20955dbda259380b4bc5fcd464b9658b4b5f0b3690181225bac5be818adbc961c00a4d18f40a178acda1ddb5f5f7bf95c5cd99871b8feac827abe37f9e3085d580db0caec296e5da5071853daacea299a412513a462fc8d0323934dc09a07ae3a9be02eee5233f7596e28e4e17a3b094e83ad672b3d001258ba3b5ca0df08525f10d20921e6761924a4b25ee117012149094ec307b36a833283734abe029adaf5b8405d6b38da3629f9c55ce67e6a6174ddde5f8366980549bf5844b405206151531240e3e0954b97e609c8a7f2b25f2f2c9f4a6927fb9042eea6cdcb6e3cff99223ba855a47c417b0baf89a0289576ff5859df21fbb8bc831df189acf3f4cc2068ef5147232ebf2a8939d1f490c6a7921591ec4db5e7872d0b2916258bb753b41c0580b13edf9ef32f90b02c8b1f671e6861e85f3e0fd0c187a4a12eb37b23ed45ea26867011398eaa17928a31ce6a696230645250a4c2f423a9c953615671d1e88262b725f65aaed63b349e097c292459e2dbabf7043c45b82a78851db38d73a4c5558979c0f66112b4fc45a0c7b696dfe97399fa0a32eb68f68405c213a42c3a259ce85fe8275728ef8b25bb2d1101a55ce6798ea686b57db1e929be66befd0576e75e2c66a3918b502065d280068a84db3ce172c1b1c2541c71d613c99996f5e055898e0f8c9979b1c5dbb291368b9c97b2412487e8e8ecd969eb71a69ccc4729319516a8c4b59536c34a5738ea38828fac7fe34c4b35ea67075e3682914d60d16ed9a882e80c15982a392418976fcb3263b042262ae0a896042c499f1ab1c7861c1a1e30b5b0689e0cc78cdf27ba7fd0695e3721257caa5354cca72c7c9754bc0ef339a85201f1bdf273ad2a6b7137145d99579d6648546252127dbaf1b0c60552c5469f51e7ffd661ccdc1e7fdb1ef16b97f2ba6c5c834ced79e14b1829fbfc04e6824701aefa87a7724ecb83e6a52b821c0c5bf8817a77f09843b7fff9aaeee41c7c9656638d412c6bcb1364b0a3c467a773371a6839db1d4936578ce265ad3d9e184e57fb3d796ff2a6c74181df08e1935d4914381a43111a34eed266548b58a29a42cf98fa7295cb0f939af96014041327405881c3c88346dc9e7428e4d4fd03e77eff7f5f31959eff5b7bf261da7f5eca26d68e43198b8368c6f27ce44e2aef25e60c393df13780e310c52ff93c77cbe69b997d52996723793c2d0382178359358cb98d489b237fa340a14e5898ddc72dcdb007465527310707328281bb50e7b5d326332a1a7daa9b9e1a7e3dce13bf03032113f8326cc991c8701268dee1574ea80585aa565edf49bf028e3be29bdade401bf9890ce3975c8bbc6e41b50b65bd8be9d2791b34c0884578c1051d50861d5a22057ad43b35762224664784813738cbbda3a5b4567e5d64316a67fada093daa8b134bd793e3c2ff491922d2d4503ffed5622375d8528715cc8a9cfc75f73392da3c94300d5619b4afe24dac208aa4485e37bb165c291c533c59e8eb20355464c08062469b1842010a5092537d8c066810f9385e74989c384fca51710d4893ec8e62f22c331711a15eb30f749ef3e75fb0303580512bdcefbb0d4aaa0b36092788b80c369310485779b164c88dda72d73481b4a7e688596c6a5725117c008911d7e05a139918709ee1fcfdf1b5e85093bf2f9632e4cf0caecfb6ea13029d195144d18bd26ecb007517ec6fc099735b554ab853256357d28d479c26b9c058a326e9aa1522db965c809910998e68127c5d94c15d2c12a91d522cd928b2668b47e4dc2109251c6a177a37b468e599605b9315f831bd4d3885eca2eb22dcfe750d53308ca80b4eb8a99e15ef1dc334ffedeeb66d2f69078c4df9d86cda9866ab7c602076111a62028f09ecfcc34e6945c05e1f458d9e955ea9ceb0155e014c64eb1ed7a0c39e52a9876b90a60ab8d402432195488ceb0f58609b3efae6001309186ab97c94653ffe28cdc027e8ec841f8de902f76e3ab382f685b1d24892bbe79b48627e12a174056582b1153f69433011f61abaf5ec36a5238ad7198cf2527f1b27b27d0155cdb12f4dccf05d256cce7facc58398d8ea5738a5b80050e2828b66946e34c2db2ae40b72c9cd6d08e6b1157140aea15fae97a7f40e85bab7814d82e2d02a767a3a9791259ed20994f46657fba1af839029a4555e9d19db2f2abf4512742903cb620257d7cc063dedc98b08300243ba872ec2f63241e59eed000250b7773b12501f7e9f019347fb382e7863bdc5005fc496c2e72af34d726949c549409d0018c044fe40e983cf2440ef265bc8bf129d427df7f40b617c97ddd49f833736edbf9069a2690300c4852475b7d7823b7f907e6a4dda07c539b55782c3de81eb7731d8bcae67f93c26c53ead1a08b2f2e66beb24983fd529e95fdcf6b18ff836370ffe14148ee0bc90074150797b00c9074cb663412cdeb5f0c7039138569b0d65d21c0e2950965e1704affa1fffb664a2c079fb8773e6e043a4efd8284cefa0d430e23f53835f7bd45a5d94a995e0378bb52f7857a977655a9b30eff6ca5caecc84750b73b53dcbbc51817bc47b768579aea12be903cafbda4f921421c58af787958fb193ae318db34febbeea56955c3fde03942451145c10745e0f0fd1f56815498d8e89edbec9737f02165abbfe0def474cedc58c30f57a2b77ce8a58549f45e5f41db071aa2da0248e8a212bf23cb167107f8bd1f3e6afa28dba89bff0c305a97bd0ac588e14b15de8c66d57a2540d7a0f08ada9fc1e75d602407749f366673fb4e574dca04eb973f31f71d8d123f176055a2f122870afcd1a7beb0e17fad12c21c23dc5c41b62b060fa4a2f2b6ea74423c4d275289de43327cb9cfde67f8830462f4bb0cc61fa194c4df75aea62de04a09342fa16f8933e66eb64d3e5915d7079d5a93d4b4d19f49ba84a39144f94c88e138743c651a568aa459abdec76fb0f7fcb101323e5e7a052b97c026cc8d1e2e9c3aa0a516e34004e60a0fae475fa841ea0557a5194719445a28da4580c6910406ea54ab1580ab8a9cbb9fd35fa5b3f1284acf34c54b17a80b02e7a19b8c3a9a855d6c2d70c538c82d0dfa9347d36e0229b2776c1c8270a3d48114ca269241e7adf10d56323eef87c595439c39d2e814a856d7c40ab00ebeca0e25e679fc474fc9942d9987495e84da7f2d3e1a2089716b542ac5d513b00ba4a7de1bd83abb2738514379263513a41354fd0c3f0fb0c0fef72c20564cc35e73e3d89b6f9f3faaa11d34835e47233f28b0f28a6f363304dbdc52d1046c3c027a5179475d300c526e0e49f7a2e0b9f67126cb6366d3fcd0d859417cf36d175dda8850f02f71d9dc7b7c9388ca44b084ee00186cb2f9b9b95db74716ec51923f8b976c5d1498f0ffb87e3dd6f53e194f58a478fd2144b586a0f5d226a14d6492520658043b045f04a1c558f012c682f2075576868dac9a2b445ddda7d7eb367327bde654aa5fd9601886b5da05a78dbb330d0771f4271b26ec5565f2ae45659460b331618c5b2d844ca89de7894f7c629ce3c427c6f8c4273e63f567dc75bf6a44b61e1a7bddd782c6d7eb6e749e479224799e380837d6adf58f860e415114869292bb77f8c50b25f145fd497910c2720dfbbd4dedcd005af2a76a01bdc9d96d136dbfc33128f9868184654bdc1c5ff1d66497de8e0c10a2bd8d77ad15e337eb9247a34d7d63f32d669d70a9d72ab0076dda8dbf831bb4696b35f1f34fdd4429d8a624c6d2b4310c81c25784086295eb88c6a50186baba34019d7202267cd0051f070c2c2b2c3b4087b3909064f4d6d10c10a2bf1d963b20e4165ece9d3358eeb45ab42acb6d65e103389202356d131a34bccf66a41a52c6fa83f4eb656baa57ad56c3ba89711c47258def0a14c75014c57114c5704489e328aec0a90c0e9784839224c4152a35ae0ed2e7429a739ad3a04c25e72b9f7e9a739a5329dabc29ce11a92ede8811fa4a9bc8484992333282be75e14468285367e57cc6ebaa3e5d4ec7ac698a747d447059d77c0d5d1f1aafdc2bf7cae582ea0a16fefad7cb4a2dc56bf053104de92d4d797c9b032adafa0b2b23e807c6d89b82fb92732af6bc0e2aeb7e8e072c085dd767adb5eefe223d2344bcc85718ae560ff47d40de1210d291b640e12c35c3d90dcfd2a514cfbeeffbc21998e2e0051dce66e12c5c59a08236bdd44b3d674d92ee4da94db9f80699dc437d32ff66dfa941150d32951aa4408bd7c379376735c1b38dae5484b3b0289c814956eeeea47ed27bf2520d9ee80a0399eeca4b1b80843641a65003283394d44f7ae97f78761d03c1b359d01210500740402820a099fb545812cd08ad0979291a6d697785673568f1c7afddd528520199aecb96287cd0387c68d36de9f7fe5fb9f33d3bfe757ceba5decdd66ecde8f260eb8fefd8a6073a190df906ed848c22fb61df0763d7c90c4c3990e199bbcdb2c0e4cce615e1a9a0ae3c242aeb7aa9d7848f784960d41bc2f69d1e9ed9f00ccf6c4269da4288674c092e90d92b550c691eb112b85c9f199765bf9379eeda36b94f0d9725a9eefe7d200882e0d7e45452586b5bdcc8489dc3ae9bb5f679a4f39ca29873e6c93c9927d3dc878727f3649e269eebcab59c71c7d32366d44386a246624331b4c7c8537f52f7864f9a149c275917b9969bbc9cee7cdbf72dd8a1cd4cdb395dbaaebac307339756ab55b672122dd3a268bba5c4d04049b3ee2dc9a3b951a639eb02a9d195e631a1d1ac4743b14d8fd6c4a4fae4ecd1322da5c10e574b5d71ffbab247fb92d06848349a5176a38c9493682d54aeb56ca325b5baaecbb44c13693ab9304e4e0840c93879c17dc1e1703c381e1c0f0f0f8e07c7c383c3d59f0678b7a51bee865bda4bd795ffdeaecbf2d8f72b4ee79e704dd8087cc3370cb6896f0ef0ff56162c42d7e5b7f486bb31e1b82ce1dc1d1481b8b7eb7685d9eae78e4842a2a3b98c958c9b1baa5e8a14368aa56d499be0681e086064d4156e0218bd3e76859cabeeba6b0a03936c09b5494ad66653ecaed3051ed92bd8e688665a126a64adb5e7064cad1d103488edee7d2accee0b86d9f893b0751c1bab70e8ba42dc3a5af47b0e0ad45871a1c31e7102ac4a6ddc669ba0eb36dd957d26262e5cac63d9d6ff2a559fab5459d5be91118de6fe1758d9bd66dccc96f9ec8c5df77870af9584da732b10f8d57d8c5499e0ac1e7fb3e7db5f2acecbcefa41d7c02d4b82df4f05213934e493d7ef3786650b92bc4a5d18c2004194073428b9e0f3c03004c50e65afcb5aeb210c3105e617772563866db5c29ba1e4d09ce7799ee799b3d6ff674bafaa4daf76366eb5562b922c81e077a3fa51798e8a75fcabed45758d6e83ea576b6dfbca66674c6569a28d9bbb3933b96aa69a31f35225c0086ddedccedf35d7655aa48d93ecd363b9a79bab2b5cdc3895c5f5b9697248b9ec030e8f5b6d179c37a713c67adfe775ddf7753797d363c46f48abb55afd6b1242d6904ee96cf1fb40b0c79a7c3f8ba0a63a925882918014b3042ce7d124d765547fbafaf3dbce2c4631ba3da6a6a4bbc17dd1da44f03e4c717696cd417a9b8f8d9ec430043f46187e0e55de5b6bbb2ed27bfc44a74ad32e794d77c5e4e192b874a93e5e158c26613409a3491845eb0a4fe98c466150045b2b6bb64918c5349c84516c943f700caa01ee08d8fce1a24f8591548c31c6b84811c61917e122149e9e3ccf4351013c0122bae74884654bb12ceee77d67d313ad25cd7cac30da34d64d0e9bcb91a62ba43eac128eab5245ca87745798c914278369dee4399933e16830ea4635a604ce4dea381c4e64b34202850e0a7c5938487c514433a53e7c7ff3d5814a8e235cd787aa3fa23d92d52ca9d4bb8a03f05f20f8166c939c5d99b32e0850b8f145d7bbca317ddbb7a1d6392a152d201933ea0afb37e8854c86c362c9aa74a444492e4d16135ca958964c099286a9083466da001541a12c97273eeff34e155dd7a938657e00eca88dddcc5a739b91d378c44e051ce9efbd376d8cc757d2ac91cbbfdbb14d9be5b19fcea3aec06757e29bd65a53af1fb89fe70946f170709abe97e63e9986bbce7d9c46cb349a23d59fea48f67d9f9d7585cb1cc90a4e43baacfb596bf23ea1ed9b1789e6b4fa63b743d94ee5ca0270fadb66de9e2ee137ff2255d7c19dd49547a9aceb34b7f90f4daee36ed3c539ede22ed275771a345a0a8db560c61887a14dbd5953b746e14ea92a6c964587650bcc214e7bdbe4c9cdc07c43284e532e890bdea871ae4d6f10e57244e1b7dc7d04dc0faf8df705b741550018e46c2f2d17dba5aeb05e2ccb9eb16330e80dc9cebbba984767a428032e4fe743a92e9bbb2b20d5c73eb99aba929289e8a30dbabca1ebc21dce596b92fc7fbdc23067ad1f872aafd9de3a6ac48bcadc2aeb7ead61cddeea8f113583b964842c89d570a4ba926a99e4208aa2d8a1bca8aef0197270178a6235b8bbbbbb18e2a5eb32b112c6e228fb58a9c86bd78510c51d517477c758dcdddd5d0cab2eab2eb5d65a6badf5de7b2d6b48d712df55ed965875597561e5f074c64fa1a396eed8165555a3112766db06a1ab162762bb3eb8ab963871b699fd51bb6a8993db29702def5b3632179e78ba917323278705de0eb8c9f9e0c64d9bd60ee9b0f5515d7c30e0802486bb45311613c5a19838248a437628271345992833f56ef1e92540106cc5a0c40c0c688f1de2c0704cd17283127088d8e1c4037657085373e188971792bec0469072844a910e29fc0003ec82f9836e188220d8fd7042c00e5eae173372ca72040a558429026dfb228df60f7f045c8e0413846a2c111a31c69e8259ffde7cd407230c0f83f9bdf203dbd10073f962460d21a5efadb5d6dd53a131e810144551144573d69a24572b8bb6ba16a98db695a2ff7bfbf494049582e4f5fb3e6cc1361f158269b79ddd150044b82f84da8c5038f77c42dd73f77c5c1ac5ff97adb7fc6028a62eaca6d801a1e6b6d70400f9255c2ce9ee1d5b777fbd2cd8c6dd499204a3c14dba4febb2eeb73ec8d92d03cca05598d5b65b4617e70f04412ddaac37af844bc3ac4b9c6fcaa8c91ff8e50c86450cc5f9116377b7f7ca1ce3af07fd3b0553c814e1e688d316d87542f2638a1716ae2801bb5f73ab455543c3c173acd539188fa37b5efe9856d8e66519e79637a9c93433628436a16238826268d1157a551ca8277ca06ed09a2124e3aed071e5e56a44c7f7f61dcb746777623c5e1f2c735637b42f511ef54d81607654042e2ce7f58f9fd22abfa976744abfed7ca9d4a348e9681fd845b1b4228d31f5398ff29bb3707efb72543b34743ee77572ca9deff597f339a9ef13bfb7fb1b55155661226acce37986170512162bfb6c48b5d49be7fc8207ed75190c43500c41300c730ec1303b19dd92c4d02a60410b9c15702a13a686d1edc8880a1426b71ae9d3678218eecbe79d5527e40f3d0327f48fde005d531e3110cc1f80a8cf2ad3ee2ca2f88a82a1f341b7deb67942eaf3778f4215a4a37a31e3aeece7a884eeea86510eb0a5992aff7bfff0833cab706c57edf1057ff37b5409823baac4dc4343282c6b20e9d5df950b202910ea5d816069e26dbb6d8effa110692a24948e7a1cd331f571f43caf83409a7ab09fce0e5230df6380de87df93b1831f972f6628c180e1443fc65dd7d554280d89887ab5fad7dadd6dba4cc00f7ddff2f810aefe952655f75e152d9b0cb087b6208f3abe16e4482cc638085d2d8b6fca166d79ea8f0fa5f8192d8ba3f3f4188046bb7b59e3ae5ae579566791607948a0fad8142aeb4c6d3def2acb1a016c93e7f318d2ac12f12588ede21d3d5f10e068b3a699c61afb747a9f8a54922dd36ab5b46d5d8d3156d25729d5a2c7bf67030c76eda08a67f152c507dd6bb72d7b723d0a10d2e34c119b12381902ab6e9e98c858396570d30446812637ec00c28394a11b88b2b461d24588344a5b60d7b6f0d78a34ba9aadd64e92be28771743c345c927daac351bea4fdd3fae23b4a31082269c4dc7be641b8d1fb53bffeec3de397eb5361b27922efadaa0bab0a76571bfc31f996d55d8b36c71572a5ca818b788511c1d0ac65dd2fe5d69012cdabf62bf2174efbdd7617b9ea7587b6c8faddfb3f218ced575b951d1f6efb92eab623b46c1c0dfa9c2d7766b94d8a9f491ee6274a5e7d214dad9430180143a2f8ea8ffc0ef54666be77b14ffbda7e269818326772090f3a9a791f3299dcff9afa4917a14a508f4a7fe1d558ea58eaa0bf21c5525afebe3b92eac3ae17b0cbe7f7967958dd6feca9bafcb7bf7d7d795af4f86e5cfdba2bc9cdd3f3346dd27d8b8ff3dfeafdcc0cdbb537d09e3be9727d4da17e5ab843668c139eec49774336a01d835fd21cb9133202bcbfa0465dc65cf0b40f27c0ff93c35277e553264d0f62ec92f64cc209fccbba63f62643e12c96dc3cf4f84067dc2af713676181dc0e709c306c1f77663540816983654e1cbba18ecd0f6af971874d1d653f9bdbc608b0eeb9bed7dd0b57546165db3d470db350b152314f6bf4049dfb77ff1e7ebf2b2c35ee7295b89d0f6ef7f9eae22d61d67012dd85ab6f0a2f1d79fea5fbd565ceb180b76c9990184be28180b38a2f1ae299111dbfc8ac3edb542b2116bcf9b58d583b19522d61e5363f7fa9f8169a3fe5dd50fc0d252fdfb7705ebaab59ca2471289c69eead49e39ea8898f01c7887205100d126e3ce73ef6bbd3620c4931b587893e3852655054852d4cc5600a5c8c8d119ef680d02c01d6ec460650997219c9c3019b94049a18527a9122b3ed83024f481684c90d6beb745a40348542352b2c75d5322226ef08bd5563f6b1a6d62990cdd18e73e49b5cbaa1b3f96b94f8561fc26cee1af607097557710981b4e370e0293bec0d82eab6eb335db18cb5e95651f3f49eae8e024b14d545760fca3b2f01bd9180bd91863cb84ec5e77f7fbe8b667b4cde9186374aded1cdbc4b28ddf653334464b32bdb6b1aca64a6afb93794ee0efb6f55d77ad659057fcb5c618a3bfc26e6966bded7f41c468fffbf863306970d79428b6f1d71e6ced2daafdb62f0c248536b4f3878f990c30fb040f5acec86085063137987db2659b7021f66bb6826307cd072a4532e8c8cd90d9d4c0348416324882f460d380111d46cc7005ce953536e230f1440d09071598008452c714b1523b4233c41015ffa100469abc71c18632678c8224d9c2ecc8414b8f255ec854279ca014c9b005dd61a4c6983640a820c5c60091e4a4cd119c2692d0d2820e211c0d41a64c0e9da1e9497dc306cb532e8e106d5290c3b638348db9c579a286851c0e25b9204843868a9096d840a45b96b306323122206c4a224a72484213440d4570100123260ed30c689cc28c6049981c4e3832270b19d0b28492d9d0131f4917898a840b79009a21483625d40b1c383a6e4801491037585ac0809013ecd04397363f5610258a12399c98e488f1003a01ca7106290284480a03d804c78e203daab0c0a689992520937d011f98c47a08a3020f47306b85c80fb9212596a8f005669fb4800433d85025cb16312c60218092214abeb8015205c90738479e4b791589814c8bc8b0efe731c5981211eddf3525d2c40e774d8998d9dd09c4db799e67ad44b6b9dab6b5f3ae28dbaa626de6a1c47b155e7c301c3138d61de6d2b451b1ecef9d00398dda358561cdf6f754f82b4a842a667725c6a0a9f6dcebc4aa4b950ea874ae18e5d4a9010d80800053150000200c088542a150302018134bebf20114000c587a407060409548c4912c48910cc5300cc470880100180008300829c350610789807ba54710d67055a0a2a0a24d6f17f3cf9bc9cd147b19db6b78fd3d5138701b0868dad515c98a150eff147aa5ca8b549a895c5048b933a5a43715687f887807a3ecd4dfbc49c289ff9f31f64d905c2e8adbb18bf7aa55bdf1100e7782096a14fbbc33a1e80e27ccd369aa49b399d83222ae3673679228ad3add83733a9fdcf1718a563c5f58c92db2cc50218c20bea54185ead706025c0967de68492b9211f7b6c8467513440ed7c59dd0d3b484e2f387429c9db7be27cdfda139cddfa1d5c3449523352b0c85a923c4bba63160e1f538d796a56c372739cf2c46613c8d82095165049a21bae577e75cd1e9b57ac8536f111853e6d7e46d88ad7e5c87127241d4ab0a81326c18807d2c1b05324ddc60f80593d42067720c066ccc8b575da8e075dce74c4172443a7a8f7ee5d2d07b6026ca5dd87d460f6189a890806ee7b755e57782c62a43baf5a04a75f1bc06d53da5b2f2f66541bde20c51c5158899b7e0c0b14bcadd258198e26e7d0ceb889ab7d5ca4816cd36596b5e3858700a1b12b66c3bc33a845ed11558a2facd58d7407e0c3ff2217b223952322f87a1a53f9ef7a0607e47ec3a1fa6578ab76f34b004d5588f1fc30ec42c36470be3f1c730bc07ebad59a230961882f96ac7f3f27093e4bec79a0bfbce7f87658b9059aeea97521e578a0d8db744507b6b1643a5ae8f222b7f28896a8d11b4e0b063cd5b92fb70e23116bbd613926e705c3491899c865d816940eae565714ca44602de74c4b3d0a6a963b56bee74be562284d1561810ad20ffa5365e8161d8eaa3714673f902ea00a7ea4fbf03ffeffef83d5f29b7f0126fb4f52ceab4afe4041176740b282945120443c2afd69cafd3d2cdf97bd276c935c144998c844618781a3de46c36ec9bdea238159887202234cd517d28299a52b4ad2c9844e7f3ee534fcbd9dda4c94e151afe552a01aa1d67f7cec618e787c620c2cf45df2e60885536a4a20fb4dd4be7a80aef149e1d2cff777cefc13c683b40a14ca743682779243f648f01d9945efa05b0e57ee5b6e4ef9a4a322d24b882b13d4b3c90a0a2cd0dcd24a5640abaf28b3b01bdaefc4a470c3446a99225d9ecbcf8cc2e64c25ebff7456580df3184e546ddae662d62576e9d8102d2614e7421e8c1eb121251762402723307d2303865ed788b4664cbe754e6e64ce80e9eb85f3ac2f90880649372570d6f783ae045b9fbf08bdc13d75c1316880ebbe60341d57987940218895bc4f1b09159082d19c1f60bd76284f5155e3b88555a0c964dfbb3681344baa51707cc64814ff0f58f98bdedd98e71157cbc909dc104c9f464976af551048e8628b9e49d7d6993be5d952475cd764eabb5aebd933b5c78a336d3da8b4062b5107753d920e8480e8ead32d06c80c6f5db00f2607dfeeeed3f71de5276af3768ae3cc3934af14d523a121fae51d858c42d667c433cff7620451c28a6bbcf302f0ada9104d54983bfb5a5611451854fa9e7cd949e0ac91ce34ea798cd376e35c9c683c55adace958f457040dbd30877470fd423df0e75ef8600dc3da4dfdab8d9fbf41989aa134af4430f9d31b38458954e2ccb2e3dc81ad6b1d156aaa4998b47280628ffd6d245f5d6d976c7d62bb833219210e6c34fc801e75f225690e37c1a385cd0df6d1f719129a79c65e891f4801c6081dfd36d3ecea33c9a3de74b03f7225933c9519e6afa5f90a27f870a5d647dd48e47682eab946025170e1144a3f5f29300f39aaa6749388a7484ef9a5abc71c53d987f0e2bfa9384d730104cfb85d9f41613b3ccb98ff29d9322bd454ead7575dff1cadf9f554eea58d8de8ab48e83d4ee54216ff3036d128b2a550bda2a19782ee0cdc65ed4b0151456223eadff616ea53d4de6bcc244664ee298ca493494b9a71c8da818871d7b3375d6c75152a1b2c647afec8e8dff6aaf8d9af7034f943dc4a605efa6352750851e3e00f3f8475378d7ac547e352fc641b502132aa977a898bfecda79d5c9a4d0f771eca0ee4f489ae7156e8adb184a5b22de59601759b9203087f71e26d107e51b12196881c67eebbe9a3da3554652ea3827108d55f227c2c3e7cc06c89909eaa2a49928369257f3bab9590ef8ba39f7aaf2c135258dbd9bd72743389a74e658b340fcaed63e384d0ff44af7dc6b6863256e9bd743917e175b32317ff6e63f429a30724ddcec735abc31b89f1ef3f98d10b120775c8885e6e7874ac44d97eb03f40d86f6d31d0c3afe4dd84e09013076590cd2e1f7ee284f01c9faaf92a6170e4e1a9100cfb90c5417dc9210db0f1b565be0fa17a2d6a0aba4d0f81772a66bff73b9967f8b982311f7f28632dc02accc5948acb466eea7d172a48885b7321395e10a6ef1ddd0a2b0526ab49960a9762fb754c8ff1aef4753a4486682cd9519e8600830034e8b1d3253ea61403722e9afe6fdad86335aff66ee1935d8e04dd4c7dc5f805f3bc00ed4e9d6a6cfbdf4580caf05f0bb281cf83f6e3fce5d95504442f376fd93774d437a268a3d49fbb81dd797ef54ffcfd0d65df46069c72401667b6943377804a827ae486a3a35ca073adc79f64f59480970893b118c3bca7054706e2c0bf527e89398fb56519677f4b2766ecced5112340eb9e915339a6a3be1a681b1776d260d5658576bc063d54023aac5680afab9c516b16249050a59c23ecea6604b5fd5d93ea6406dc36e05bafee16192125ef355644ac3f5107a3ad94f2669d01a0ed5984654e7da04481964ba5a9ff162b96557afb30a527a9a1cc83c4bd9a8fa22056957ba24aea560efce8cc40ba6c2e8a6f5bb8c509dbdb2871b0fe6d6e52739543dfcbbf1e7943f63ac2aa74b37cc2414a3b716aeb0ad16b77b066194deb5de571b20b61235be9b0788e24cdc6c5d19feb41e72e19bab7a84c9d7e5fd08a9f3a585a93a2169f7c0612eb5be670f22608798d7ec1d388f0ef5a4c421b4ce037635321578df2988eb105c08480452e0d2bd51d6d97f3da155d4b53cd7d6c553049903b85253ea5f8635f11667d18302f624a6c001aa072164ca370402ef5ee0a3671e53f59c627a92198fa9f9bbd20ffd5c4d53dbe0f1d07b76a0afbe770366e8fd126dd6c93dd7dd7ca31e24e6523e2f9437f4a71d1eeb34e2752b589c04b3656be65ced547f76af8c3da6bc8667cbef4c31e3df3217949a594bbe9e7c55260dc33489f10edf5a294b90a799e75be6033959daff278981c4c934b958e5cb9c54e4cf829475358c2caf2b448782e1b0ba3f9e1ff1561855a1cec50a4bf4bd69d5ae0be24ab78c75825b187e922d677ec7c1fbd091310b4d09378a3ccecdef27027077c9fad0640e1baa26508940c328488e1488304c8f73e64984e2da344540e215ef1c8b364aa0af328fbffb6f8ebf4a2179965c435a33304d459af9775afb8fc9b5910ea0f62b547816f106df03c3339e265e4d808864985bdcaa1c603e5ecba0ea9b71031e2889af7ed422a4df665b5340526859be0d7c8db588df8c15b3e6299b43aacd2c16a596bb908c305f1bd0846c66f44ac957fd2fb0adf4ee80a9335d1e849b219b0617cb03160ab22918de93184991a1bad9436cad4651bbcb29d60f5e8e9d52a96f77f68acb0d44ade373c44ae54046b2f099183ba49b78bf7683473d83064d718ff6cd93f5efdcf20da69799c4f769cddd71d5cb7d12f37ead6408167f01482957ab5bd8504ad5e40f07c391c97d420ed09b3092e34334d93ac82f96c295a29010750fb6fc0d16496f528d1ec5ea4c821d8dc357faf58ab4640529af37a01b1fcfa36cbddf0ecac11ebbc1a2cc03688bd2eec800000ec880c3d5e88e46101bb490eab2cef7970b063d6b7be3e16fc498e072f1d25d88d91a426d5f0ac21265f759ac3dbd8b6c37eba7af835ad2bdb8ae6d6207b5bd23e05025a6244b8fb74f53a2a91c670fc2d71bc66e50988159b7021bc66e81bee599e204418211f25a378e47c188a66a47cf1b6eb65d50abadd04cff24ceb44227d3e59afc56a98febc50ed3f61ffe5ed08790f67c64adc1f2524b4b5476535ba25af7c0f3f0540bf75fb96af188cf00ecf3bd43904a4e48286e9e697b9e95d8a1828ff3ff33258efb5d45e06402c82cc6ac1f977d4a47604eed57f4c7044655d8366566634b408de82508034fa9d19722ab1461b998223c0a9d2c76c5c538d698dc0385fe3b2096cf0abf3faba748252aa2cac1587f05285c0981f0d11e6f6fb5c622e8afda608c68126633fd3f64adb031a1a367b19aa20976b3bc1c18d108d6076021aa414007640e67a06bf592bc268d45a1a576c929e5baa29fed6c675b72df80f8e62f2e5ccab5cedb38a802ad3d593c8f5f11c562228c50064086f7387ffa9c22f9e24cd65ae6f9908a492e5bd3f652f9bd65d82fc4fb3a4d30d0478bd2f4cc91bc22d7e8af1eb13a88fde93f1a647b2c8c8bd8767565e6175348a8720e8d5d3e30dc7d791781fd687ff8412b4fad400f606a321a9115f34ebb923d645c4bae02970694e95013700407597f75e0b16a460c0ff4421e5ffb6b8f0309ba90bf78cdf1d0a2fc517b23b45cfc1fde2bc7128266411a16c0bd9a8032c873f8ed7f964c9b53dde4a1f1d4e796a61f411dca0ef9ba4c2876804ee73f397bc56ad6313519fa8400291e8bf42ebf712f5a0ff17aaef5843e5c4a742a7774a11384f8703fa9dbbe4a73adeaf4d77149e62bd2c47de97743963be6194473be9efdb35281bf8b39497e030c4c544844efb9c4d203d906d21cc53c21c5a29a6ff1012cf3032ec6ce25b2d19dd2c1726a9f6b8791c349d0d7e863b62fe32526b829bb8b82d8a6ff1a17152f330d87056029f465666bfde6dc11212cae69a46371a2be3e444a57dc836e0b06751fad26d1bdd0dbf9f7b8cb1b26621f500fc755ee4a1314a44c0405b5400c972ba6187bacefaebee7fb1ca1ce33e2cb72566b2f07b7b84b0a26d47e02d7a8abc40c1925928b531b13a2385ce33a13991d6ea34eba385d35cf8d5b1ddf1a21451b23189b09c0afda35839d2874227487c3ccb9873a7be71bb76d6fd4ff49b561ff58b961a63982aaf8a44b0565bcf834506ee08aa18d1fb6a4cc542cf9915576a136dc4ab1a2e436b8dcd9967e94006e450b875b06fe19db192708ea86705d4a43750791f033520921a04e1952b21086c0bf7fda4f3c2b9aed7d56ba718ecd9232b1ea4f6e4963978087302fedddb43bf50e60a6c2ee5fed7555681c9e5c175db024a1786bb2fdd07110eb2dd45051a911e050464ad5efe798bea4dfa74ad0bc0f2b1f67aa895fb635bb10688c001abfca7534827d9fd5ecd2c2882bd36720111a72a5cda2191714fe3c1cce1a3d9c8822bd5bfac65cf219a2f69a82ca27047e9de980869c31fb439623fcd7d35196d4beff53404ebcb59bf24298e466b4412511624c571e322d07a91699bf432fd1a12a8b284d64f8bcc0f0366a7dccd50946c6d133d7f6e323429ebf21edf3f3614e2cdb851b48cf917f4be5b5bbcf0f2fa21bdde1a637491c981fd9b101c5674347ad087061ecbde9860037a3719d2ff4554059a384d056268b486200166618e372b84008b68ba7384a7448d5ca40d6216ed7d25ef6587243a8d810a87d3b5f7fe66ac856ea13592a781a5ba9d9c91d63f54b1171744420890fcd07ba8921aea4e7d44d51c21bf488203296b31dbc6e5385816abc02773c596b486d9caac7585fc126a49a5a27329de02c196acfa8fac8b5420976d32d5177034a368c4e260053d6339743a5d53d74f47d851b02a1fdab11300681eb5dfd5f2b59f5b1f4bf585e51b318148586ddd5d45d7683199c1e378c1b5ac54203ff2565d045b2b2359b64b5f3f2c94ed2ed6a0197f9b242b7ec0f42ddab5eb48f7568051bd7d06811ff9b63489eee1023801fcccbca751bf29cd569fac8895df24a34048856f3d1adf46229670d57af6f4ee3553f3ff5c5ca90fba6491eb75c254eef0e1e618e583945e64d65123992a5316f5e44b39837361d39ef3add19f6ff32967fb70ecd12f80c3356a5e2c24a62c95875fb10b340196b117b270008125050540e818c2327b819eb26199bf0340d6cc62a6a2cd258f9c387f86040fdbcf673e26837c4e7a3b1d8f7843d573297925013f9c9802f9f3606e32550b4ff4c0a80d902074b70bebe76780d5d7b84cdab28faa0bb30ac35b1f3f74b4723e12e08cd26d510a09f766a36cdbb93518543e97f33b9aa5c03fdc3f0710aef5e4faaa88bdad22b62a6839980962ad047293e609478108b29e51d47773f15c32d455fd53a8384697dca2001902cf1bb891cecaf7ba0b30d9574f63894417d48e805ab74d3beb13cf4041b34ef3efe0f25d6bf823c77b16ac978931bfe0e8ca1246f691f4f8a505eb88a907e61671a23a3cbf41c40ce2caa29e0eb493bf4320aa168a38cd53a2bb92cb921abc25023abe204d5167929aea9417010d8e8931198838eee65691d82bd1504d561f5039c831a2f75d0f4e58a0b3f121fd57f126f9a1275127b6ad3752cd2b339746df0d385d9cc4e9530fd7e632c4b05be6187587abc9cc9197e7aa0b331a93994bf2878685d40cb20d2beff9347ec2066a52bb595ec439ae7ba8f258ebf7204a2f77af75997d8bbfa98575bf5afcf5e9b06fe1eb2da793a9b901c70057ce81877977d54c80172a1e5680a21380aa937a248fc4c63e96075a5d9ecda98196d3312a656b04a83d15cd1746445f3e63ba0928e29a89927d4c964f058cd657ed0561a2121943b9b902f28bd20471119a357a3a989e6f5a1b40eb7faa8d69b9072467e626aea033de5fa6df48c350faf00a8eca8cd5caa7a5625846737186cf2d7a38a701c90ad3bb4c1f6fc63bf3c51d72681e5db79b989b3974319a761dc6e154ba1413c3427b184da19f7c853b6b20dbe16d42168248c33aa35d33b30084e40202b6bc5874c6d0548e990dc23fac51299f121281173d2d100e141caf3e4d459cb8b20e1956fc61f0d469a91ce608764ff1e629f626da5d32ba1792354b16abc4192890fc4b4cc2f157fa583334e23ba59649e2ec814d4cd9ffb163d88d6bced7fa3061487e46ac28f5cae3b7ed3be8e33df371c2a379122f8a4ecb6b942f85dad560e56c5a064ffd9a9bd5e93127a3fc997cbb9356050c9c0b3e461aa1d781351942bd27291f5248bbd3deebd57434ae1a5c49ca415b0282ab55a881aeaa73543a4198fd88e8ee200ef99665170df5580f35cce8d22537c145944d1313ca921febe2161ac96f71fa9a55f20485e6a124a1ffaab7b690ff08496852569f757eb17b04812ccf9509ef09f4603558196c76aeb0fecdb5690d81fcf550bb8faaa6035122ed1725a2af35c474d9518aaf7bb39ae5b10dd21e1fe48bad4f05ce7d4b48497767fe07ba571cc50a79bf14e3848bd159ad96362e8645eecd4ec353a17b7cad852c58d0cb8b914edc21d868300b64ad4cc5aed911e10dad133eb459892eac41b23635af80f73e13caa19e74fd06d3073f969bdc9b22534cb35d9c3896c17632e3457c1b895e99fed3ad489cccdac20422a116bac6462754a8f8d9fcc29a1f70b3bb990ebd2546f7a9c1cfe462c8ee9de304d00c26c52b6f431a271363baf71a6258e10b1370f7c932c86ac8a2cf3cf38f2c475dea8350c069af02e8358fe02432a0ab60dc6a5b1e11663f931f8e41ead14f5f29a2d56b45158329a8651ed750b233c582935ba0ce0ffd9fd6268f92f47ac4170a38166386a0f145ee7a573abda43fbbaf599ff7373903733884aafceaaaddfa2974c2b8d2506601ff8dead9f3d2bfcd4821cc6a9f309c46ea1eb78eb7288ce2c252a25127da7a6dbd71a65101992e89b1048cb2f15e522d68a13f60cc2bd260b09ee77c7206ac9eace3b562e621449e2b4845a17f96a4148c178c2f65b3a47ead7bc24591dcb467717942813fdf79cb4801e8c2cdf4668f106c36fe867020025866e2556633edf611ac19b88f53a7521599cd70f321378fb5d3990aeec572958b1e30c2aad269d638252613712103eb143089246f06c69509484c85af1d621b3bb2bf5d9bf4f3c09966015ca3796b7129b02da4ad8eac3824743a294b2da3f462026ccb747db1242b810450bc03f909ff7fde21c952506892f493bd304e0bae26994119be47443443b71d100a5c04a77109e915248ec8ac72112edc0f9f08813d7825e8603ea7f7903315b27094b936a3b752b30b36b2199f89ae73e981367648590fe1e7c729ddd1882d6976add1b69146946efc8f83ebd65605d4217df7588052ee5e0f67c4fe145a6e718d09871126ee249269dbb79c31541107f1042d50805eb49105dea937031ce3b3972b3f8ec7c553b04bf59d4688aa5839d25326e063c120593cd0e4fed26e2e00547d0469d46ee41eb4037ef10964d1188051358a886c35721f1f30dfe2d4b4c4bacc2d4bbda22cedcd8421a282658c4b9d644895051939b6550221cc63ede42040df507bbd4a93108e92a0be6e870d638ecd2e2c92243b31d9e78c83a6bf0004b978e0ac9f5ebf38cf9afa2ec89a242cc44d7d013ba8e7fd945775ec38f80602ed4b01f7d660dd97bf402e0011d9d69eccb483bb54ecce57c9c22d89da3471c2722f54c3eb6a0d1de9d68b5c073b3d8f86615788b38e7c8d19afade7c2d8e82ac0d1c03ca65802a62cc7e111916f26516dc267e99dd91d6b3baf2acf3d092f94b7a082280132c79a7dd75070649340559d07c073341442953f083b49c9da8210eba869da95e440708a7c76f7ceafabac60b813977e59b07e0450fb36de173ac1977fe0bbfc536052d5511edcb47264208b78913d89e783cbc4a2ad6bfa53f2f073e56b477d79285a7ab514d93fb7090538086385906e45053e7926580a9ae1073ae9852997f9ed3e78b1d03201c844ec10f8c425e738f421ff1f12126a767bb359513066237c7d59fa78a5678735ee8552eb7a2c577627d1e9a102226fec3414e2b25af46e35e3fcce67ade014a7878afdd477a016a03488df35b8a69d19e9a03ac43a38d62ab8b3ebe4ffa0598b1154d1b2a5d63420c62b27f9f319c29e773dde348c3a815ef8fe1c16356b23a91f7c00cd0fdb19dd0d9b46509f827847d5e91750689a0b6a46472849b12cb38a7b846af3f33d6340223c5965badbde24353a68102453e083b4ab095ab6ae5a410c44318564ccfe5b54cf0212eeed28a1fee6bb59d9f0df6367917861a184b83ffa40d74919ce48b156c635030058b702b65e8cd127297dd742e424d380d2da9289cb1540a7f85f2eab17a4ba3613effd76e4ec8937d057f87a2d1f7d51af95263c62ad4dfc0582e06b3ca88e64795ddff961206761d91d81e81cbd78c90b49ac30e94c3c231e2c406a9fc4cc9b8511b8e137c7561611a92a540d21aa5adcf095a5d070f62c708440b786a11d152ee934b4072dd9dfd95ef376b58349a1042e4130cad39e00a2dabbc1b6fd5f4fcb1b83b511c1258a21f1ff46c209345b8d2819fd6963911b8706a8404d794456717c46f9de401de1d928a31b3094f0719e99ada354b8a27fb2101816160444a923fe1cec74eb83c2f4d92b04bed0800a0ccc5c9d4b996f189b88bfff77e2ed0bff9f6358fbc0a5e719932220e7f4170964ac41d69b0128602855b32d89c38c997ba90a6626dec2895f70e8dcc4b9cc3af424ee7b6f03049b88b2115e0940cc6352affe112e9805255cd73aa7046fb166864cb4a5bc39e1472008bf2cdfa370e224aa1ce19a3adef5a5111be2ed9664454a431b10b6795d80ca92a68dd092065fea2bb1552e3c0b7a26a335719c5b396a46decd5d18ead3afd380d4b962f510ea57adb13e78b474157d0da48bac48356badb3e0b883ba89b495f2bd5081758fe09df89e9145a6f7f42018cacd246e870177536035992738fd63df5a97011970e2165908a88375b9d41c2047b40aaeae86018076cd2c4626368dac13890fc0274b9dc2368f9532676f85174d6ad1cea3f402294aded371e438e8cf5bb78bb13cce60eacfdfb60812a9f01c786feea6981b6f8901461efbdfaa18a7f1ee7792405e2179770cc6ddb6f105336ea139e493850483b1a368695f595a5ea41453367925a1cccddf2ee2549b97ce61d104371b82ea0c7f998a75a3a502836892d8a4d2fcb240fd7f214925056d1220d5d141d34b6343c04c1d0d55265c1eab7063e7f28420d811c0a83aaed391cf2977daa1e318e1e16b40fbb1e0d18d8eebbc56954f637e0c3f09e820b91209eca4a8c8992b5075d296ba59329c6650ccb771995c2b1f39a7a60c334b366cbcc29b5aa7dc9c848fa33af3da550e058a70fc9fd344096b63e3014af00bb409c14148639f67a0477d6b8c7bc1d0ec03d36d5f8d1ee8eb9778ed3155217885ef3c29a0d074a0d0426c7e1897a5ddf83d5bc347083210db8fe5f420e1ce945508cb8aaf1fc11a6cd2a34e70b24d0315775fecd3cf3310eacd6a239bb1602718f7f7884c5549223507b8af8160a682c08e4972da2c1bff914e1bec0951215c4073837a55f9286f95105d9658a05469431f3d0af82c0b5fc8829155a526b4abd4ef1a29b462b6e3b5d49eebd51233bfb027cc628a969a60540a52da9a0374b6719d386dc8896eb18d19e60273cc051ad8a41592ee299e6ddd05f1b882a7a3b611689739dcbf5c78b4b3bc448d68cafc2cd88766ec0ee80545f9c09eb80656ed4d72dfd3a3c8bcaa799ee24fb5c8cc8280d9cbfdd0b7e788d251872e924d6599b5edddb5c8a813f7411d71eb5d29560d57ecea4d09f3c2be88cfbfc49cc0d9db5fb59557de34c8261fbc67ee1e0bd12cc78c10a903f30e5fc4179c45bcf590ab925080ad5b42c278c799ebbc3d9bc4e3da608bd4c8440155d650a2a8fd18d832a532b667ea461f0d4aeedffee6199c108d8e58be1fa7284d3e47cd1cd74ade8e6e2011ed4be754e99de0ce0f4c557508a3b4710109bc108c284201e2473c93aa34b5c6746a63353117baa9a6df3a896b83b8434f22dbcd1317dbba679b5a7e2c478b679150de101171be357f38dcce178c7f9c0d27fb2f9c930417c014b0a6c7c81cc2783b73cc14ccb94ca9a29f8a362344b2a1e3c0a14e29fbd529e0bc192bc58f933e5345358a820398432799c9c661a4195dfafc7d759562a75ab1e5ac1132f61c8e892d99cac614ca6de3c4db6f9022808b26e93b0248ab4e7ee7932299154bfc3a84a7924b63c69ddf90220024b3d1c02ed679de1e7a5a36dcf0d89784000ce61c9db6a9d5cc2bd2a1eb84f8f631b30ffc0cd1776db399a5387ad3845b975b06332ec2959fd1e134b27ec2a002db7aafec4c2a5c1997ee61c8042d3d7538414d8d376a0d38c0a297b2f3f7bfa4d1de85c084f7b8d5daff6de8f38a9a32517b6e74581742c6dc7381b0a9ae092fe116e1fc461dd48e2e5904fef1de8005b47614ef13d1bf58e7bff399b3cad03ec8733d919d3fa83e8eabcfcf2de3bd071dc0795139bc630cd7d9d48ee8b50a64e6437de13bafca489b55617ec4007293a504b0289e529e472b7f5b66b2e8033bb9062d19a56049341f7d3b7d72bbbb7ed33f5e9789b70ddfba2ba862bbbf4a3f4703304bfd94247bf3c644bd76f1c91483bf3c77a0f03a736e9af734bcf9bc8cada35cb10ed5b73414357ae1becdce2212019a488a329520e32cf99585f6c9e5af1fbb337fc2119a3d22409bd9a32fb73399d888176166e740dfc6a72a93bee4b9e63723d2256e4efc3f3597279fef88bcb1ba0f35c06796d08889cd3ec3beef295c11d13582690cb285a29142d872adb5fdf5e7578cc7b24ec68cfcac54c8e4c865c1e688485e38ae7904e87a68bdc992c557f3cd9e11a1ea0e10f45c69a5e6d1c3d73c32c53a1670acc3b19faa54778308f9825b341aa72a013b11183d2c10ba21d4f18ac61631eb4d60263444b1feb7537f6a927c0f50405b35bedd00c5a20deb3e11d517c3c1ffc10e266641be77fa6e7715d010efae78b242285050a97a6cb8850e0709d6a50499ec3cc9dfddf08f0e9ced1ca2218c642c0ef1bbd420eb2bbdde5cfc06fa57a677e85420edd2e587b65c5252cd6bc1e9140250e0d68c23c31220dca12490f25228d8d8d1bdff876966992b409cb46943b5c66ed57c18ae94c616a43abfbb701aa03a6f396e7f505f7e5fa8dceb6bd62f463cfff95fb99ad46853191320bc92adaeebb0a17bd3064df3a10a63a72df22aa01c38cd73631a9bed06f06751ecb1068c66c40e43b200fb54eff49f0e332d2657fa7b6607769b8c4401bf49f64a00f456b13031a669ea28aeb90188981fc85bed69df5e7013d7671021c66fad1a9f6b209f1bf9d5f0a01c96fc355b29bdadcdcbda8c81f8909002a29293e17d355e79665d56d80758db7555326a0f33baa1140bf98d19826e6ee68ac63b75a9a5c2059d565484b3c5c00f17b24e4a51b8f63b63b230a67ca0525ec817978c7de346ea9783665c391451564044a9dd34853d85b05487718b37ecc2f59257cea41b027806ccbccbcafcc485a21b1ac0c883e5747d0824a6188da288096c23c45404db38f5e3e2eecac1e069785db3bebd360945e6cfa7840e8791ff71707228fc3befbbd38638c4605b25e4c1d100fe1819fc01fc1c75517d1b66825a4a9d51c6066f52c64d2a5376edc01197b9ef628c6fc8cfa18a440f6c1a3ce21b5b87c4d6bb0e60ebc24bbdefc87b0517fba1616de1cd58266b9cc9febcfaa6b575ce4224d113f5460fa141da4e47c5b1479d882fc2bac3723df9b538ba9a8788f6d0b0b32817d2cd75cef2fb7404218dd825a14fd6f417d5e7004ecc81ddf5017c63b36c685187dc6ec0c41bfab9e748b39d3fd16ea58c57bcec7dca0c2238ba06001d673f7f5dcdfe7f53b0ad434a1a12f5c060170d96d222bcbdaae36679130dbb9c8388e4ea42576efb303c01d56be7dc3a352a0f56fa4f32425a327cc7aee07ae58f9bc87be86952da9041786b27cb495dc753a8c9d015244b83926a887a78d462fa986db6a9a06b8772e232d3a229636c745632f8e97e22366bf1f1dfff1a5d191a19365aca3a0ef7052c1d3ee20007f8f2930bf34483f1ac6b0f9c8b0236192a990f7f15ae041f3083dc8cf9a8ed19f94d71614f659fb32e75e142f7cc54dd6324b0139547b19531e3d3f3d25ed63093f1b2a033d99a88bfa47433c28df248cad0bcf9356ca86b23c662985efee7f19cebf9b5f985f66b2cbec7f734209ad34f25a704ae31bb75a811160d61db3129671d8f9c6c0b7492bdc0ad13b6eecd4a74efd08fff058445e350096f8adff7921faeb7274472728b106b565efd6d686f167dc909fab8c804dc63e622e9a082447b41e0891fe77b3d66acccd8f48d594fc4b7e0536f0ff6cb324fdf4b6ffb1e22ff4da5fc8ade14cee7aa60ce8024ce40181c83c492de201b9bd0ded5424096e7b029af7a41276bb8022901a5d5ee40b0859c035975d56b71d2ce2f356f3ae9f365aeeec021bf6f98636b89905f05aa3c4e988a9a276dd038891c510d6d5f145680b46ba8dca7f7fc153720d4b66411edfd4a848efd36a0bde2669a048e109baf239c4e1f994cfca477e38831ee58515e2f2bc6982710a02f382af8a6e04af59bec870110e3979f2bee4c8e199339cb2f23f546d3cc65998c756b114289698f1ce736f2ddf8d387bce77830e2946446a94124a3f4cba013d2641d1280f1d921d34f81aa2c69c772cd21424f9d8507e57236c8cfb706763eaf3efa468d18a4d675bcd27ba3a7fcb15213c89d812dd46acc05f55216bed72026a8038ae50edec93a574385a1fc1e286397f4803908eb3cbca8c54957c2bd410d4fe37a3b95732138f02e31b182ed30912532d00c11c6281d244d2b940a44fbeffa4076d09e6a4363e60e9d04ba63a7439e7e84b7467d62a26d7a6a9dca5a2fafca9674961e9a02c35c9d3260049b5e7262df6d7a86096cd27ef692effb8d2f174ae6b09f2c9b839391bca30cec65d91ed47ba02ea94d23852b819f9d89204c2659ad05161e484a33790377c784d5e121ad05bd32de6ca57999dd63af8016caf5c3af0465ad88c8f9d4c2c2ea65c8d7ba0f4ccd5c7aa21948e568566122c8b8e5082aebe9fff55315e95596d3c6cb61e60e09161b771a6657b531c29c4b438f55b97bf26d20f9cf5dc0508e14b649b98795faf64c0d904a3893d81f27ef5b2c6d32600da2fe1a75ce7b0b15cc22aa5c524e8a34337e3ff464660e65ef53b19caddb5ea7b50a1254b8e7ffaf54ae41c5ee71cf82e168a632c93e1576aec8381bbb61bff0f43c62994aa4d13160d137b472a26aa67f31ab2bd38988dfddd7b161795b210757f2816a3cc4f2ad4d92a18e37b4b85c1fbdb02306505e804c4dacbec92e9eed544490c3669524aa244890e7aa6bc1cd3c97d0c218f1aca97e01c2b8272c00107074970a68c0bceda5f94481e0f2da937a4052bea70b54cca949e8eb3c25e2ddd2725b98c2453c94559eb2d2417954ceb0bfa929c7089aed337d5a9258c5c0eae346e0def7f6c6e09e7a0c8be0bb91e6ab4a2db493e4c3a5826411eb7e197216147d95846775f2e0555af46048c145eab01341091c5a9f05b43b728af0cee081684a498d985bd5ef68bc5c35e6acc1c54fcb3449922bd908538b92b983233c71b4181c0b9c5fe33dd8665deb2239680a68601c149534173efba9b6dd0318458abb2b059128428104c3130a7bc433ef5f093d8487313469f4456fa78bc0ac941c5f94e8bb20f5b0b340d0f39693579130f8ffe0a0f370a0a2e90a2881c56a7a22c2657c02bb3170d4eb919cf59e153e6ac925b93cc172e3e3ce765054373cc188cd89ba5f3a3b2bbba2d96ad26ae5013edfced6fa53e326334f542e7edc23e2b5dfadbac0b2e85883f55174eb5439b1ae400940816e654f7ae7de9cf9411ad085bdab476c48ca988e993b687f5e1d81caf1b757c9c1892a3bcecac0e607c941311b2e0d9cd2fefb1792ad1a45b76637ffca366af1867300108197111c50958eb8348928afa9f7d727598e9b937a3ca30c7deaabdb58f6ca39846b22f6292b0cbedc90e52f54edb25e4bbcc58945cbadd9bb61f64e64599bbb58fe94b9968490b1865a260352d719360e6272ead31b3f6787bbe7824207b66603773b1a106a72aecb204c12492a23c3d049b2f5cdac8998e83c28d81cacc19141aeb5591a39abae57e160efa1ed81634ddef69126b1984704fe3f768e0f746a4d763dfdaeacabc4cb29d24d108a83b80276b671506a3fe907864806f00a65f095c508dab519e8a3fb279e0e140a58919c0f25484ffbf5b7c7264ec676d2e0957362c06ce844245f66c207ed659cd1cee202f8e793c44bf0e36db9691e4ca0b8eb565dac8695b065b9c3cf7c631370e30b7c456c7dd8dc32623cab73d3f74d6104d9cdfe6ff9d6f0308d4e74e6c68517fd0fb6f37dea627e79cba2a125325486b19a5ebe548aedbe47fecb27116be9de67525be2ebedecc677c74f28b684716913af57a9a7092ffeaf2482c9c143c7083c37f2d1f015434a4046dbc107b802b1b6019328178bca2effe4f51e2355787d842d23ea3f1eed6df558314d2f31492c19d5518a0f6a934cc748519a4a32f50666ae98043e44423894b567aaa16386fbf512f84bf8268ba228a011e30816de0a0876bb6c878c1711aa6423b59a1a924c14570915faaeaa65fa6e952d6a6370ad28a0d033f8c18cb01c39f7c7583dcb70fa98a078523275d86f6c71751efca5416243055baa2e694873252216c9c4b18e88078d8ca3c779f59afbe9f4070ab44f7c0d356ba548673f8cbf060684a80effb9fcb1007d08c45fa8ef6cdf68f1611d5ad69d63321830ab5bbc7d24ea966537e811aa8056ecb7dce590fd918dc5f58616c5cb4f38c605ffea7c1dfd6c11578e4ecc7d86802b6610f63aaa593d8818c8d3a89913ba54cdb0940712a006a891a7b3c821a37471c7dcbbff55a6eec44f323bee82420764ebb71a65c1b4835686a6cfc67d9d818177b63e3358e8d3cb19a042c3e159b6323bd83af3f9698259fdc556f9d489209267dec776c44d7b39d9bec01ea2bbc6d03ef65b726b38bd699796c34d5bd5e78e08a0ce9dd62557ef373434f3fea62c5ab4067d6ddb7fcd8d8ebd5034221b5f600c691296a00f35197884cb10e6db87710f3bdf3c7a2ea66a06e876e95d3d59930e75ece076f27a36ed8e0fbbfdafcf63699ff1c1508491712a4bf16410bfb3dd46c1d42059a8d767e1ab6303fa22a6647b628681a2a3e213c024d2f18f308684509f4d7bd597dcdfa21a8f2bc730697b54c8f08cb6a8eeb4bbd845829f71b0f5ea68cc2a9ac60012913d5921f52e44c1f9297d86f5420301e73a6a2c63b284204cddffad3e1b5cdbf07b018cf494752a566fc3720e4f7267de340a2ce834152313642b6bf41ffde1387fb5c92455a2303e51b8d1c9c62c492a62c8f39b9e5b93d18a07d854719871ca6c7acc31e5578a577ec1e514254da711987d331b0070718669fbdd4f18d7b92c72a742ac8adf4645a62d79a738e3f4d3e3dd2eb7bac69bd975ff1967d6423b7e149ccdd00aff96bc8062b9423ff7183ae513834c1d15cbe58431fb9d829ca40fe38b8f98274975bed07fa47f0de4c7a7a14f99e720b4d1c24496312687c4026f1eff75e265fff9b482a6ad7434dbdb31272894d5d49c0a8ded8e00289aedb1f31719b4a808da48ea3f9395638c33bb9ee8b934fb9127031fcb55b099b10afab18fa82c95785b9ad9ca02540eb687ba81211f54d4d5dbff6307c122cfc904e25ddfcd674e19232fb5cb28772db07ce74ad6379d98f15f3a25f462833ba9db7874f1dfe8fcdaf23cc5eea9c77e4862b117cb290711fc5a4a6d048e1e7278f2b72c165220c9a57d13e2c347a3be16d6d4eeb24a3c66ab8e813c15b81e5477e208c8fe28b812cf74c9a57a68c8d65f21512d04263c4ee8ee9de350a86a4ab7bc466c8afb6f001fbc60d801263e06f5915b59d2ec74bb28721958491f219d8b7407b0876db4bae6c11545a24b8c76d8fbca2bb1a67645d1f0e85a76958eba89f954b46adfb820496900e4d000ea95d65340934213c3119cd099acc6f3c983a1d8cf4a59c1b6e39bff5de41885a7780407e19d6d4dd099092f35e2943f87663de08cf77ec3f329b0d98c2f55495b965327479a12dc807df0b0d429ee3af2a1d09f43c82ea8b6951e4278c1602e29e2ac7f4db0162441b2be3369739a99ec39eb8bc36e3a2cba0573044be2d9c3c09c4a99e8d622826a140fc916bf9fa033200c4cfb76ed4e01a5d86326145a6549150d8f49647be80a61040961f0890708598acab07ee12d6f2a274179a5e753239c93f80c130e0b47ceeeda932265bdd80e01b7b7c125cc498e0f9fb14aa85c31448296999498b2438c325fdf941749b2da80b8b83c1c8b1356be164abdf926d91ea6e12494b5a2428ce8660b93e6c335ba382f5b95dfc777cbcfa4ccd266f903279e28e5b7e8f52d96069e997ca0ae029c14f30f7310d35ccb5c3ee56d29cf3fd2a8336a5dea07481e2640d4689a697e208fc4b49f966206b2cd9acfbf16148b621a51f5582f73365e5c7f982204214cc4f24fd8ddb1679202bab58539996b2268a50cc8fd5b6c2ad4428e54ef72763d7b940597e59b43ec639da44d93240fb1d471407b13eaead5fa7121dfc0269e2f9f1ab3fedb0c7dcd42979ed7244b6f470f15464726cebb481c55f848f6be55c1027ee7398d5265903a52a1a2121f6ed2aa9f64ab84377268c9be417c725d8aecf236069e3a7ae2ffa51800a6267d54b01a310ebc39c0f0775af519a76dd5c0aaa20050f435ca9eff7efa427446514ae9062d52e00d8346b63bb3343cf095277f296e6cdc150ba799bece0aa1110badd07afbe17b9fb279811fd4c78c73b80727bba0a5923564b216eb15ff7aef7d53aefde08eec6dce13bc2cc879d3b5cac88f1b251971cdc9e6e78f556042de91c13210beee928e8168fceaa0684e6ef5b43cd490b818ad1bdc09c742da13fd86690513d6fb3324499d2a4284a769bb0e2e51cba2c4fec8cb1a0133388722619c22078a19ebbe3618b64fd987095d7fd3874e1aae6c8b4395b0f8f17cd395bd2714c0d2c335fd1f825dc9bc15162215cd305524a71f79c329c6d10b729460d868a0b2d949a9f5c6f7ad19e018a5d74416b92cbc60354037b03af585fd05d81419c7bcba5167093a65c744eb0d4c0c7a1295eb52dbc199bdb2eda04487ea94252d6594935df85f7d866fba18d76316fc40f2d1330f339c3dbff49246e99cc494713b2210a0a4c3e12c94b47a45ec8454ddcc55e01d3c1fd610a998fa997646819900486373d73fb06671826564a7844c3821b089e4f216aa87ca8c2823be577b73f46753d9b6d4bb64d6c8e8a43c66112234e1e6734083c8983da64d4a7fcde2d3dd2a2d1516b861f2b33f1807b40f64538d2e5a36aec335dcb9068439dda8678b52e1041ba00f794321d8f67725086a2cfa063e2ace8c775648b88614d45997c9d5c284b97dd43b2da053c82d1bf56ce06c24aae167eec2259c12805fd12efe91cc06ecd0154f7d0606dfaf360d5cfcc052d0789d40ca0c8b78f10a6808c12071ff9cf7c45a8683fb9016ae8b0f452546f3083f0e193638570bd16bf1f455020b4a085f8f81a4d4458d6ee1ca78379ffe0dadf1a7e34e6b2f4df700bbd809a0363de9c79c5622e260b2de7360fac63f16fb1afd5f33010d94880e50c2a54a9b473c026a06607c6cd75e58c143deffa9c800cd7e156dbeb03d880b7b8d323c68a35fe48d5f8cb1392779b16c816b588c5046987638fcc02e9b9d14b399d1bf3930cab1ef86b8caf58065c96ed8e4b0e59c508781ace21246b4e34a601ee6781f59646d31f98405e3e89e1384e590ee8e2afcae4dae13670fa2417a81978ec139b00ea7cdcf82826ccd6c680b01c6716ae81c38d793402fb547098614a7d7e0b00dd5f316a72c22dc99d550da7076d5055d693dec4cbb765799ab6c31da745762fb2a6868c4dc449ca6ec25289fc4ba60fbf46b230bcbd62a02c3d709f0200ca49d9c63d1437b18721e1cdb45b8f98441acaad64f291428183953d992c4734997a797f5f1ce9c512fd5b2880519c2d38eeb92a9b2293d836b5028aebd1957cf13547da7bc6d38a6ef40fc9e58bb4e9923b7f29b56734243e9af6d199afe3d4fa34b6d71708bda3832d392d356bbe132ef9306fe1e87c7ab96d702121d11dcd04387f9263f7131fe44049e4d85e7c9a29712e98e1b036785c02410bf1a54a539873dac2e5a5e4b6316a9752c263b2b89595f1b3ede4bd4c2cd1c7fe11ee12579695745137118e6f23dc3680d8413ed095f9665dbc3e649e034a9926815c40d615271d9d118ee2f0fa33ea43b439cabd5df1abc96c35fc84a98bbd02dbe176c88330073164bd5705be1c82a9a8356cd1dbd5aecabc8b99be58512982beabf2b698aef5de9893cf8e4d88a847fd618f6cd136228d6c42b6dc72ef0f08d407140831e2f988d18ae7c960e9bd7ef5b48bf2a0ecc7f038880c78727cac07639e0763f7604c060fc6481ebcd5d3ee89cf4ab4dc3312d9a84467a3901fd98f39d22586f723ce8b9488a31243ca5fa878278ec13bb10582a674159552e930f6a2648bd0c3580ae51789a51495f73f184443bbf42f80bc98457310e6495181c16321acea951bfa2eb04e121f504fbb2118db3c7853a8e59efb53fa71c2a42bd428fb08133f4d30d1d19e4e43443de888442600e3a7d01db808d0b9226fc608a045e5198b46b4d353cd46233800d57a8e724ae27045d5ae9d72a03f2ecd0e6f764ec68e50ced110110f27190f31885465b647bf11fa88fb0d3712d948c4d3b13301087510d081ee29984add4fc79361c14114b78c0f3a6c0f9cf2de4360bc1f93c0708176c17d0e7242826919ee627abff01a31c0c00778d1e75cf0604cc6062cea8c513443741bb0a8d9fd601299191711f57463dc5efe837d03ec40b68d2151ba5b6ba25d4dbacf38423cd6f246bd6778ab7b3f76c1ad95f799087c51799f9380ada8f3c3137d80e43cd6f2202180a92ec1ae769e818a518f189d088d3c486bb25b3a173b940780cbf0581ec353dd7a01b88aa79dbd78573a6f88b5277e8cff8895bc21347c06cf3ec669ec63a06e2d10211e2bb2f222dd0c323ec37fc4ec896fff2396f3180da9dbd3a46e13e3a9b3a5a1e1f6d6dad8d3f01fb152c90ea1e13264fc470c0580a34e0380a3ce47b15c86b5917196dba0ac00fe231643757b1ad5edf936001780b5b10fc06d625cf51fb19497f358ea2d1e10211e4b3de7311a1ebb98c16309800700aaf2543ceda6fa34788c2355fd1882a8a3137f76b45beacf402f4a4e4db111c54620f5dcd7215d50326c8ccbf0a8c7c312316effd12bc33b694fa1bc936681a0415dc619006397aabe0c6b83b250aa7ec40e631665b5c3588c7fa65bbd4ebb8de1911ec38371eb7987a2510ded6a87b0a55acfbb07210c0fca183c183cdb9c8a3c52d5a75cbff36250ec8271588877f286c0f80b930744887ece63306c0dd882b0df87e116270153fdd62ebd9c07ef8b900b35e8d52c13812d8d9253330bb32e4e39c1c53c298c92c38ff4078666248ffadc772122f2b438b3271a7df9a721dd51aebd5007578774e9aebddf03be64ef0803d8aa4044179754f5fb8858c487725dad149892700ab763ffe4216f74ce1375efac4bb480193bb13aa46ac65ca2a8ddbbc3bb9df8a3ff8885bc1373dc6d7ec4d8d36e14cdd88248d5669b5352c200a630d1c196bee6fd005bfa99d7230631b9a40b1051d5973d44066a9f94823a6dd71254f94db19870f6098084aa723f530c1d48c742f674201ce386846eead5edff005fe8edf7e8d704d13de3146ca15e952a12509d877df49369b4937eee98e7c1a99e5fbc8ed81de3f61f38353d1e9c6a1eace387a676c6c2bc38d5b04789122534dce2e300ea815b39b835dfad03a802754320f9438744171656f15938c592cffeb1ecc858dcca2c4bc9cc22399b2ccc626953e761fe585858322381852b2d4b123fa895cb0573bd602e982bc618638cddb1bb9b1b06b38425766c53fb0851c1e7fad146d00544c24488192490e0841682d0811717fa20e104b310245d7fbabb638cdddddd1dad92ca625556ac2b17faa8a08925fc4c298494c08327665764436826ab1cdddd1d636c66dadddddd43b42c161ced027ac160807a098e1e72f8407d9078828b08a9898383834324067f4a5b768a1fbbff532c5e051de014992bd861b2a45b480c748013743f884408215348c20a90c0c8c0c8303333738c91819181b180808074441c90988216a8703f8844089f15f0f064173ad1e48afb411e2120a183c41429441002124b309949882c2e58848991cccccccc31729431362ba6582c168b5b9087c707890edcb69087c9122ba01512d8948048a6e81e15b4e007c9f4c0d4b2ecf59ad37edd3de79c3de5b45ae6830e1e73fe7bcd39e7242de99e8c0629d6eb05f382c1bc605e30dc8a31429817ec057bc1487ec1b858509c922b2972700ba25edfca87d5ebf5f2111284179349058b0b068be1818981c5f0c4c4c06078606031b361312fbb923a7830b1848799613f303f320de3e1d92ef4518113789a70713fc8c3449b41fc41ad5cd1058b7f71aa3fbe8b3d98ebb1c5549a243d8ca384718c2e58ec734a46970b2e818951c61863649eeae2d692170bcc121c2ea8922ee9b3020fdcb6d29539c14918d6deffa8d6da5bfb8e7e0ca7641f8653323ba20cb7a88ba497e1949412892807196e3f0646867af04a1819c9e282401faca20abee4a930dc8a919799e196ecd80d032544427d5620e4b6fdaa166c20052739b63be04f1ecff5ccecd7a3c76e78626beec8db0177e043bb837b76f6f8796dbe376f47f6cc7e3e6ef6eeed7df536f775b0bb73f6b4df06939db7a3878fcb3bf8057aed2ff0d0823ef5788881bc8deef3dde74534babbb5dd01df173df3e8fb309ecd7d3b4c6e5ebc5364836fc71d7e33137ddb01661749f98cebcbd91d35f2c21df0f06e5e8d7c81beff020f2da8f351073ebce67d99ad913ba6ad9117ee40baa7b636f8f0364cf78367289ac1340b9f214c6e8c0b7d58b0e47227dca147b51f972f1fe996d9a85d528f87297a5f7bf14e1f33f2d7e83b2fd2873c2855914bdd48bf79bf9dc73de46d8fefbe79a14befbbb1c19fef3c0f6eb71f0ff6c16533e4552a55d247ffd07896809be7b6ed945b70dbfef13071da49bc2d49a859bfb36b55dc6c3bf57664dfce65a1d06901f2dd69f89c7cb7013e17b25fb679daa9a73df3b4f6788a27943c61046f093c6812218f929e265e16a04f4fc4894f28f9161a8707415d4f93d83bc84f1e5c014258b220a8f239d41ff2997c9f7b61f69f884570f1518bc843180590a437adef396c91d666645352d5ef512f4ce4c1589fe33c188b30c6e2569ff31a00fb38604b5f48cd2cccab87c96be2683c423279ce7310cb3b7c84c6ccc4ad61661e2df24cde812f2ef2ceb31022dcda59d21dc648788783cc1e1ede09e209a23cf3bc3383702be8084d7efb26779aeb0ec74138d14dc8d218298aaa59c689419c9ac7e189b8c3b588a8aa7920e2fc778631f6889bb285c19679be240dd4ccbe2c8b87357528939e73fab06ace7b91094ecdbbb0453cc28447e4d67464c8c56d518dd1bc0d3b75bb3e2bf8d23814c1272af1e9b70fb74eb039354f7650333b8f03909a3d48ba4c972552fcd4cfc3397b32b9f3dcebbb4ff438ba6fc7217a88f34ecdddc04585f7e4dc35ede4dcf6fa1bdbabbdf9cd49f791bde1eca9ed89da056cef4eb3d9537f3b8c75a7b9e8216e47aa5c39ad8453f3212f2e91aa5977507b89ed6824061bd4391f7d26dff9b8845b3ef35064e364e2d43cbc30e2cf7c049a8f3ef371c9777333bb822d5303355a1614a75a9a54faa379b342055160b283387fe68c31c2eeee382d8b759bbe28a5f4c5ea76bd58af662d79b960342c16a53d2deb473443ce434b39d51d25396006f3d95fb4e7297da4ddb469534a5fddf32f180c8d5a7cc15857777777cfeed990c90eb42430ca888270f5828fd60583ff5c90a1fde4e3597e324b963046ed91532ef8d78c082574c1202bc5535df01042085d3016974bba9a20e5535f76d9d1cac338c5f02f082fa1062184f6d360bc178c532c0f7bc140a9c9178cccac8b538c5af1390733fbb06296cc2c190b423eb082197453bc98cc2be2cf94b0572f17cc05a3945298ebe572bd602d5d3016a7e6cc58eebc0b06b3c4e572cd1d972b0759641263ccb22ccb6876d697652f98ec95d55a2bcc0bf6cafe82c1c4f882899975ad3835ffadeed4c12d1fe67cbd5ed9ebce17932a50f35d2d693c3838384262f05c9669daa56886a675a89bfdda9ccf3294a6ad6a9d999dabce00ddb60d36bd36b76f3bb5ac176b7b716ba3dbb6bd3835bf792c178bc5adedf3aed74659af558aa7b2b8f5e21685cd4f1a168b75e7b1a042e4827d2a0a85ea60ae97cbf5c291835d4cb2cfa1e0121e387a802f2edcaeb00b139017103045c5215d4bba51a8d3fd50b74fb9ffb89bec3a7b8a81b77b0d78bbffb8d1fbdec3e5771e0f3ef51cffc7658fad8803a03038d5264e75e9f29fe3a3579a8e8353fd52c7a94ee3420b1874042b24c3292a9c3912658843a1986dd4c5255340f21cfd7629bb5396216fc66634ee9bd745ef07d822e391904b14354443369479d1c80f1bed01e113ac05258216414c05c8c5cce6bcec02cec3a9654358169dbbab0967035be6b919aca87c1e0208b772b8a5c3ad186ecd6cfb486766f6a3b56a539b2b177736f06574271695ef8eeca12d147a0d4e69db763afae68d9ec13cdbf3036c9934361ff3037cd1ee9c73ce198360cbbce85c8ec8fbb667daccced92cdb913d1631a9cedc9973ce1977a2ceccb2c777a6c32e3bdf662310cb43706a9e81d8706ac69d8f8d98938db8739e8d8838f0e7a30e106e15311f77b87544f699cd2ccbb22cea40d5fc9c339b7366f6ab1ce4b00c54160b96811a7fd071030dea07816ef38840f465991f976dcdbc9c922b56763f162be6c4233436ddbe5695e0161135747a63c713f711a70584be9d2664c33d74ee226c69b6ed9c0793b123b0a50f6335902046bae800e27e04025fe2edcbc842fd62ce1031875bf1f66dd9304cd07f01015654cd7e9d748943e4906850338b8291a305188db38d60cee07a3092db9a941267c62de0cbe88a3e7a5fe2704e17b743cca5eaeaa4695a7ced3eba4ded46707411155d647fc4429a7dd73f62ec71ceed2bd2b4432e8ade599b955475e8bc82557bc2c3952412896c57adcd48941279246fa6cf22cdd274afd686f4ee5cdfd5ea43f25233420ffda391e8239b3a39c9da8c7e622f55fcd5face6add45b64a95e6c14a451ffdd53b852c1034f59da9b336b5a6ea5f43873191e5c8238f9aa42a5e5479b8c5347019a98188cabba14318d2097d832e9c2355fdd043a7f025bb3bf8db43e7e001ea76fef6d56497e553e3ddce2d1ad5ee84f413cf2482227bd3d19185a790161afd46fdc88eea8d9b131b47f6b128f2224e77bcc51611074a83169573a44ba5a67a53b3fd6ab26f75a3dc02b6f46dc0a2c6508b6848910eb209842d2b1aa88c78445e04d9c981597291b3a71cb86bafc165fce36eecc1cb476c04f2e6e51ca088831375e24e3313d8d2b7a9e1145fea507e81052a7011a594421e3e89bc44727b668c3f0dc93a7b76f978e4b106b01584743149957cad26d39f4aad564c621337076c91278016553e7a5ccc91d91fa44aa6d400a6e483902a7969c4e55aad52a9df244929a8d1676ee1085cfc744ec4f9010a314f9f7d507a0103e7acc45ed88045a52fbc53bc97f2177ee3c5613ce52f7cc52bc2dcd99e6c700c86b835dc57f18098eec24b1e90d3570e8307a47495cee469e0a44993935764fb8a27c463305cc513e2b1d34b5ece63309c77f888252c052b11bdfb61211e2bddaebc476fd2bbbecf3e80ad6824461f4f86d23f26d2c373e4880fe7c820c9ffc5a09318511e7f241528928e1ebd9aec9e4492ca47de10157be20d89719497f3988caf782abf81bacaca6f6238ca925e64f41b2b471d656f54be721893614f9cf3580c8b7ae937502fc5f84dca51bf11e3e6c5631c9e9cd82131ee59eb5dc5f37e13c3ed614c06efc49fe13076ef97f11b327c067bf3e2325c86bd2942f3e232fc26e53f8ca1502fa19ef358cc9947a56af67cb48602a86a982fa0cb0b684d2f46d4793a4f6047662cf0744f031a400fdf00f8d2a1af58ba6e76ac9a2e2618a59017a18abf796c1ac285133ae1b2cac1aee6e7ea470e9899330a81cfab30157bd85c7e574df30639d092fcd265c66abd0ef8c2dc71c09f0927bcab63529a4cd2c6ea7e14b87d19e3b8db3c8e715ec893148871738e481fca95a4db6c2b6c9170360c7020236a05592c2b1696154b320b4beb000b121c447dd00706a31f8587b9704fb97050f9dfcab34037737fc57c96cc1608b9ea4f1f973f594abb6231bd37c42455f3dfeac229c05c2f247de639821bc428a39431c6c899b42cce38bbcc6696d197647e65f39562b15c4cc36249fb55d60de08526e859d816c296ef871a53d4797823072e740247c98d3c4d9ab8d3099c2377bee3568c976366e62c8793cb4d606471c1c4c0c4c020a4310c038b990d8b79a55832ebe02125ec07e62746464a292533b3641f2a829e60c51674804c56af1818192431323032486428a554062606490c8c8c641819188bc5076619866766c9cc92855441052ea6d002f5a303a49ce220fc90e4368dfeb85a28949d3d9209ea7648b7b3066366961f840c431086203343c8cdbc45aab10c33333364c890e199997b4b824a2959ded5a47e5107c82f3fc4a18db3a21fdb762a3afd0deee7b2903d65365c66b373d6a648666d42e76ed37d38382fe4ad2e0e4ec9cd834995e4ea8d27fe4ff476fc2cea44225127ee64ecd1d06e0e6c91f1e2902e3406bf725d29a59cb6c43a4a260dbef310f5ddc48730ee6b96079f6d37e1e00e6a6bf8cee811afed4c50330bb7a8f190214ab212300b5a706c17b2505bb6404bf053c385909974a747bad1bbf1c58d27cdfb025d2ce41aeef46ab85034c3ebaea50a6e62460a9810a405175958f17282fada001416001469d754a081f1f130f802218410c618638c31c618218431420821845910947c08fffab4437b1525d505eb489a3ddbe369aaedede06e0379621708fd02dc5f340e4e17717062a1472f74a1c8429e5868bb196a6e1ab510c2ee6ed8524a182f9ff281900c5c2f1a5ad032052ac290821a0580130117b680b0a589cf499b4a2608698b1595c6285aa050e3e177e821924a521430191c343994e0c8419343490e93c964ca418343090e9a1c2d9b2647cfbc6294046dd1c316354a687a70f4e4e8a1c7245d6894984c4a4c4a94683a802fcd26a8f1cd1d33d3ddddddddddcd718686d25a636cd8138520a85d5e1ea50816170c2c8607260616c3134329a53130181e18580c2ce6b54ab1583c787828e5a1150b3c3c3a29e08239da303825e55bba283d66c00928909e80a8d50b096f6142c7844e02922e9819199a243334323449686aad95466626c98c0c4dcc8b05e354165964c183c90f41f0d4d8f0c064922449d2446c19cf323133326646b2e43a13236562666266605cab1899191a202967685e52b6947247d2e01e6d221da9304a2d4d285940ca9652b6d4023c6587179e33081f5930999819d823c329863686533333dc8acc91639d89e99189998999817175cc0c0dec89e1560c54f1a1ecf140474ebe38253bda550e792432a5b59a4c504218131d0395467b9c5242da14529672c52b66ea75430aa90f38667240da4529056d6e75403a5a8b52a9540fa16762d5f4acb05115930e4a6d496547487e9329c9e393416ce2c267f173caec93cfa275c15c30ce38a330d7cbe57ac15aba602c29594a2925b364c999ce84486009c6852cb0e7e72d08eaeca81d881a7a2f1c807c8de9ca2369e2f6a78c12f6a887bc9a85c116f94127aefc7ce5d6f72307b7ffc1ee6f8f1e6ef75193af806d83db47bda79412d5cd2c9959b244c2ddf246241149044a253ade70230e7c81ddbcb261a7b68254794eeb34c6619cac86246a4b0ae8d3758c035ff8f20f112347987fea1199133b9a23a5125b57c5163a9c8508c6de22a242c9e43b73a64a81e4e0ecb466afdcb84e24e2c1a712d9b47315ec72627964b7e051c7554c1a39443acbb2dad9c0841aefd7574a23a6af126969650791b6ff02451d459c1c918eca4e3f8e44331ab6c8735b6cb8f5283ee270139f7a85ec36c2aa9eb307c92ac9a461840bb9b835fa0623dafda21123b3063857f025c296dd590fa7fa74a23614b2099db327da1d93340e4f5424dc43e7818720e6b4ab6e829a5770dcc334f8c2f4f4c4a4628c0d21a85a4f4c0cff501304f5ba1ea28ee8f100d2c18373f8b06de77e137a77837bf7cede6ce76cc469202958c3f6900724c715dbac0aaafa42d0d80db75d6ed770fb303964b188d8e41606b6f45116c61559166464c2b09e9e9e2aa4f891e2c26e29b3985dca9ea984398d7063cf9c73d26b52dc794ef34e37beb2041868008bd38c4d119aedda4f34b729f20dc98931ed31e820484cb337a66f964ad50c7d0b59a99af334965920e295e7649412f62806e6d5f362ce5ad0f104976bf0a5812d4d69f4d4791c2813b8400e02be0ce09230005f328d4d307e609c2038d5ecd970aa61d0b5e151c3a98671659f694a2ea9b1ccb4cc16c96ed33da4854236e264fc6d41990d82eb6dbbb1bd3b6b92aa1a8f802dfc9896894437db4536e65c8e381e8c15c1ad2268b48ebb598a688c2e07258e1054ed7e70898806b6f4a765b1b8ae60093121fa1cc1aa8e1dbbdb08b74535261f015b1a72716170eb04a9c0b95fa402e736a78e30c2d363e4084c2e916f0844bcd1c78dd6646ad2f520c20e50839a5d27e38b03b630af6ea3dc3e17c12d6621b72f610c113abd0bbab856f0f1eba8c7a1c621a76ed6c4291963666e3255da334533682c5dd9dda837dcabed7e624f5e4f62c7c5518b08eec00e0a6874111a518b887a73237a77c989b88f7e83fb88079f1a81808080808080628f7c1779dc7cf4b45096697d33585b091c39ee440fb8990fed9b56136fe5140f3b3d4b6331a8b24993fb954a26185cf43efeecddcec3ce2ce6dcedd1fb681422abe26e3ab85ba42d6f7fb6a56f20556b2b25b40d2184915bdfe1fb2d9540c81c55f231f0e0d979877a140fead7ad3a0335e8676b1933b336629e5b7766ef337535f6475e0f1f5774d1612ce2c8ade62092d0bf178bf9dd89cea311eb883a1a1dc6230bc3e3c1a976ad52bf96cd1e5a3e0621fc7434d2458a01eebaae72a512bf2bb15ed0d528da21e25cb625f65ebc005be46170ca045be491d4afbb529f8f7026e6193060642b38c09656826183142af301e200e4350fb603ace2b285219ad1235e03c016195f3cf5eb4a9d6442d32ebca615c14526d825ea3471e7ef106acd8aedcc2c7b30b2dcec920497b0ac32f9e8f5f0711b489178211e2bc2f0ecf5003850bfec30a9c372dbc61d2cea0797f8c0ad21383571b08d40b80188a05efac22104223bfa1193cb72a14f0b905c17e0b440c80dc0853e492cb91ce43a5e79bf0afcf8e87df11727375de5aaec88974779e6f1e965cf952f1d4982c8fd2291f94844c89d8f4acc73900b75506403e56cf9a11d48eff78db48fe27da46b4fc0c96b5440bc27d9b79048079487443a64a77a69bfd30ea49faab54122fdda5c92859ccadaca93cef537514cbc27289687185469773879db1d27af7647e9b286bf130b39f5e25929076aa3649b532fec4316724ae5cd2915d621e52b87221d52be7218a7789f8fbbf2bbb2f228d2e18bcf7ad041de151db21a7953ec7773571e3a15e9c077255afb855e23efcaa18806fde782fd7edc15ebc243528a6cf075e1d273213b7b3cc4a0d6c82b1faa8957d6f495970310413de570f2684f366866bfd0ed1dfd51e8f2e823ee48a41fd96346fa095f6e827e740ec61b54e893c4ce1dbdef1304c8e520b775505483643fbea4ab3cf3be206e44f9ca8afdfa66af47f92a20494fa927277d35ac92722aa2116fca493b6af8a6580bc4cbff6a9813d9e0cbd74439d08f9e896cb057a368072d8330668f2f27a2c1f68b9987f2af2fe99dc8467c86f2896221a748874992f775671bf2d6b3c7f784722ab3cda993f3ad76477f357cdb8eeaedbccffb6c4238b78756132f3d8c6da85c6a5797087506264686865b3029d48fde1ef2c2e50b39ec1299f0a212f345d4cf14594ca54b6a16208bfac1f9696f15f5ebee973ac2c37529a7f8b339652402b941a81f0caa9957e73148109147855fac406adfb6f6e0ddb66d8b5d7335a6a845b810081aa8e2c6fba1502909049c216e0c85766c3636ca5e0ddf33bf4421a564494445b950feab6179482fa957296c16d48b163228624359aa2d75408422014a8166851671582bd78b4d17fa1841831bbad0c7882231e09e9442386167b3c67ef1b3ec6d61643299186532991823db18638c31de076ec1c340553c92c81122090501c63b1f5db6c7c85e049ab72942c37d13b10df7ce42a962d1e827b791bfe1de67eeec8de8f2f1e4dd4f2e353b1adde8b6775d67713aeb63e623bb3a6c099e21c82e8a66cc0011598ecb808f686f7e78677b90aad9c19f254e2cb227b63744e744d6a608941cc79db33e6e6210d95d64a34ecca6f88678910e14221b8d48d53c0f4bf4e506b8f73720bac1d993f6ee86c89eb48b4e5ac83b697626b41381a48a098948e5235ea2a8339b3c30f3620f8f0c20a81f17011481b82575e06b4cb42ecd4f8e0957a8264ec5ca8f9f1d1fff12458d314e9a43102a8a537d2323219b879f5de9f05fd7df01bf0e46cb5ae25477f79d5eedbadab6862f9443644a3645684a27dd06e56c4ad1c048d686f4928d3d4152c52291fd66aee833dd1389727928ed9705a756ac256aff8b4cb6c8c9b9b05a29379b9d05c045251de5a1a09ca8d19e9eace7e7a7a747ba701007f5c823b209c9843422835c3ac62e30066517128783a26c6973da0e51accd69b3435c388ca19cf4a08e9133a393bc937cca614cc543b9ca6f909e626f524eba8a25fdc6a6088dca537052ac8f95a75cc59a52ec4dea28368aca41765ab0a8f1dd3fde39ca574c50a0909638a2c87691c76375fbb1f3608cc4e2a9f1f0c23848ca2224a7c1171a6bc19d38b9140b808b8a72d243b68b53a35c95e09d2a807eb8a78766d9a49ac6943e3b8ab529b2f2af7321a5a4507a61ac79bc23853a77826acb09f5e3a07b215409440d78398724b5065f0ee2145f061054a9334fbd78e790d2e9bfd2fda40eb543508690fe492273c7769c8a3f2dd904b7267c812e28968348b6964a1647eae87090ac958710c0152aebe4c4a07f9cb3e3d23122ac840e650e2275a4ad108a72d8ec6986747a785b16c13b5215040b55eeb014eab476c50b42aa6e8ad4801bb82932ed3784f41b310a33f8014eecc607e9242252c53aa48a3d1c1fa5df44d20781a050b150aa9640694b8ff20f06419162a144a952256d730ac6a20f0c23b8ec3619ca04354702c117949b3d66927524ef48224c8294000165212550eca2bbfb3e464051809bbd3d199050575cdfe81eb2564291665364dec64e4bc3495516f2aa07a54b278b0c631994d479188bffe00b7df6c84e4055762aa8c0028b294c61753320e2fd561108b664510a6e7df18a9b3d8b4aa292acab1099c894dc0c4208e315f02502c196ec99669907b66432d0207b84419665d107926913388892f14122038a2a6a7a1a8e5a9b226d43afd99bedd96db473d96f429fff11bb119d5ef3e86f46d77e8313eac89ea288bb769a8ebea9b79d653805bb48cfd36ff624e969a676b690da576fe6cab7d7cd6375251440156afc5755702555f0fcd42af443728320a404137c09a186a8644d58443dea18a20100000000e3140020200c0c868362a1582820098220fa14000f89a44c644e15cad324c87198420a01420801000000000018d1847146b70595fd6898e236d4dce1e960b595ac0598e0766eec7193456577fc225558480254f7237a00b7f0fd7f262018f00c889c8cae15d83b51bfa358b43ccbac67db2d6d3eb15e60467d7d1de98edcdf4043a82f428d06199f04f273dc2aacb20f7224b0baa990ec769a92a8c29d751a0aa6615db7d4fa6a8896836c674f2099cf1f48c63e070b894cc6352c01e78ee1cbd44e9371a5a35e1e8dcb03149282fda6da6a6d85602a7fad5fd0e39c6fd0a388e9c506598ae8cb7f9ff076b4f51abbd858423727204c7116ca533dedd20a83a11dd2f79a9c80f6137f2c7c0373847906671b332db158e16b24219841ea94043a52905b38effaee4100a4385e10d04f7a6099c20cb6141e191222eb9231caad812e38ee914da8f4978dd5a5eaa61f404c8112073477c2f45e812d5fc1b28b6b55bef69c642cf843e1aa89936a0a9d0cd43649bf7c7004be86b281b9b2bfdb859def19fec785bbafdb110d6e5c16175359c1a2669114d0ff213123779e281f0603c1f1e3c369efc5ad1479e11d10b55a63737832a48901fd3c7a1efc71171207ab942b7d6deaa71a639946750af577ababaebdaf3defe381f22e7dbbdc90b37934bdc51c798a0150475658fc01702276e19db6ea24403da1ac4ff5590950bc74860848a205e41c5833d1908721b3335e6c68b70a456461d2fc4147e84b2f67877278ac09030dc2a7aba64ba1e2349c6cf5a2a824f9cb201453028d20105350c7e93d17434eb27305d48dd9c6752cccf4db29aed80083407384971fa0224e0c83c924597eec6cc4df2b0d1f58448e28882fccf3928279d177407e6e43b4db6e72400b95ce2ce15e44188001fd3d02bbb8ca4a13cb26c3cee2e76470712dea66f321082124491e45a173fa413f6d1d214455e4d5dec144106152cd364234d5ba223c5466e3f84e700b8cdbcd5431b0447f23997c6d83c2d2c5f44352bb6251c0cb764f94f054202d887a4273e0167e50c62e7b5ad28629beffcffcb0cf48b42ac84484528833c3f3ea53c0343183c04f58a3dd6373b2c60da18a4b8721d4b1c9b4131ef8c64bc2d6f9b6bf8aaba9400695b81e57372c4250e9d608f182a42304f54528807c4eeff100b2d8f6f134e6f33f892c15945597f0e7a51812b71d93b63db85544c7a9b2c38902415fc0d3531433d9416ac32104ddec90f55e910e432bf043a511c3a492b626006bdfb6d09abefdfb9307688d788eb9dbfb41694a05dd4377169804a1ac03ff7502f5ffa3a4a314dacc622e61809206afd59e61a1a4d1ff0dcd9c2011d987137ebc74dc4c7770649673b239a23e78bf001d7a37897d86e4679b13d73c2a4dc232969e3abd5517651ab305938a41e143b9285cc330d5673d6413e2e5aae7e562d3a5c89ea5a4072e35d11540ff155c0b596f895765d8034729fc0f7251981d69203008f10b36bbf00c321020ada4989a8215b6ba6e69ac1e45e04b78de912715f7aa96d9927e720b452505cf0da6638fc1299671e69851c614e67fd0cead18a36c5d1cdf2df8c6786bc8e453f36d6091a7c884d29722426a6074a6865f20706b257a519ce83f9a8b002840442778b6eab0f52d13d4bfe1d93d6f10b5cc52bdc6a75d1239bc8197261dc4efaeb68faaa2c84efb4df7de84dace0b314844e421df015699f28f521033a8fd1c6650a6f809311e35d9ef6d94cbcc84633a9ee06e00beaf40e38c4591507b697522828f920a286c4dae677ea84a98d875708adb5918773398d47db9b8dbd22c8eb8da7669035e28e5d42bd0f3a63054e0a9980228af3e586aef5c23c8beccf6dcbd867403e324544a987247d7f76cb7b545904aa0c3d6ff62ac71af4ed8591c6dabc61cda1c496ecce1fcd9c6eaa12fdc3719ef92744ab8f93c21fbb6dda280eb1598ed0f81d546ad83ee2685f960448b53433341c29210bd30700d810407bee20c38038339e150046aa1420029937a5338181857fd3ca421d50cbaf83c326664213821b77eb33782d2cef0a3cf12575cc462e15fd7dc789437dc2901c1589ea264d0853f29e10dace0ba6b2f41e0c9efed177929f9c7f794040663e399fabb44aefc3786e99d62a8a1b3d5c2fdc7c3dc623516d1b63b719eda8a626d41d62167daccda45e614cffdebad17f29e52be0c648a20dd15723bc1829eada00f5ba3cf592b44d2e5c909ada6da35180bd5b5ee11ccac572adcae56608c8d53390a4545483aea1c3f6facfd59a559d39f9acd539dbdf4b66c7915b67fa45dd115916179a05eba21967fbb21c9361d768081f7e44cd4f8f1430bdfd543183f13c683af701ec6081c6e6bc3b7b243f41c7cd4e68cf278334958404a7e5bcb4bd1c8d4604b2930c5860081419b647aa64c374ac973def739047e6b270ebcd6242cf034fff720b0aaec4da7140b3fcc13623410b3e15852719d14cb53b3fb649c49b275de532c4b423847c7a1639a284f31157009bc771c6d2b53ce67dc99e4032c210adc1a961079ed8195288ec17ef6a239c86727b9dec7de60240094a0d667f345ddf487925e127bb948d10bf63c4bc21d6acf5ab3c3551219143483a2c663494da97a4308f6ca61093a4864566d93d7523d8752825d4335cf6baa9bf8aff2c394b3d4813e678506036b5f9104f3a2b6ff1de400049eb5111419981244908bb1cd7cb8d18297eb1c33a0b1ef712f9b946075703baf65d54858abd66d07a22ee2d62d85b9f4e4ff5c1ec549aad1e8c6664d56ddf6ae889eb88e69707ae1c611bb898374fa39f0033c71d660b28e10c600d135044721284bb5600c636fb472e01cba40241913e7ed0621acb4ee8d191d08c146b21b41f3e68bb37f71b946f865124ceb8cb093b110586258828668deb2d82e46ec18b9d627a74805d9ca8804be2af48b15caaa9b50047494d24ef691dd220c2c6f2265c1ed8e79c71a099195e8af3472106210be80394a892314b8dec05c70fe8cc15a83fcf928d9558e4fdafad5110a13e0e58f2c8c11e0472ccd59c3ae628cfb0e223bff2a1bc0f883e16c6cbf465b4dac86c670323dc373110a095c142c5af642a908437f0a94f6bd2f47044894caebc07cff60e6b58d3ca932f9bfb4cb0ac90c5dfe70061e1ec28cca7967c620afc6aa86f4d1732a152d3d51bd5b26dfa990be685570508be43e88c21ad2935c00be18d2a56a7762e6acfc75fbf2626a97e08a4d99fec638cfbf29a8affc1cd0199338bfeacb9484eed73bb1fd907d82d4a3e57306e291c46de1c928f96ac6746f9f364224496260b8efb8fdea71c4a7e4844503a254ddd5a2d80290259ad64fb677e6fd5f660f159a921f323102b09a185c943addcf940e5238b2c5c47f86abcf43635563bb7b12f95b4b80aa375a3a980357b927a9b9de6205473faaaf9bd67e57e954e875f000e66f8cd35a9fcfe219f8e033eae08031bcfafbe503e454c39eab35b836719ffe807c76ab20e20213dd37ae5461aaba82f93fe74b82d82d1a982aec7a6a82fe7d9cbc75ab9c0d652090b63c70614819d4fbba6d6cd2d66af51a51d80138bc4f4989144a40f7100b41d2d2300a10a6dcbe53c1f546de31a231b8469ca8986389920527e55127ed8bec1223d8f21a00ca73b6a406ff031db606cebed93caaae479e22252f37a7868dabaaabe7a6aa988dcaaf473624b0e03c5f15c535b763151abdbefcbd51a54a51d7b0b8a1330cd9e7cbe72795fe00ac2ea1d5d5bd0e01860d3d4bceb9ae0eaecf092b1e18d571550a0796110a857055af1afdcca603ca2e65739a9b08600ba7dbc3c60c964c4b147f08dbfa335fe00ce69948cde820630fed654088f85e2ffdfb22e1f12b7717cbe6e01ef2d491a03cdba9545636bf449be2bb749c8de520fafe0f8bcb8f84921dccfe4ef7309d12c4127891be0b412b46d0d2b786a1a0f20eb34e8ff7015f454c180a9c35c09bcae99efda5066daeb1c955d6f2dfedd2152c1d28d58d82c61eb7aa4fbab108035db12671c7c3253f6be3e15f6dc379dd623e6783f5a3d681b02b5ed49c06aaaa9a6011469226342b13d036cef54f9bd589195c7b1cc1c78a2782a20f0d2b2b352894f04b37d806bacc539ca6bbcf4fe9feb4f200b36934e25d82e5eb324fb913fd8ee599b69b0cb616174a40869eecfa981074b9d13e5c601dfb06615f5c9333b2bc3453da0c38b0747ea549b6b2aa4c4954891dcb93e843276e84a7e886fc92142201186e959cbbd0b89a11962d4946e4adc1e09688b93045f6b95a68b71247415cdad2f8fdb828b236a89def91c9885182726fe555a8eb8ef407e081446def63dc0b847599d2268391d4f90a4a101adb2b889d294b0e8901d0754f846c30b5bcb361a49cb95737d8be182f27f4e1ea70246511bd93391a17d819abd18713bb54d3fe75b768bb0e09399ab370f31e7f0ea12f8b4e65dd62cf852f3c7f28488f34eb59b86351d64a936d81c600a60ddda13652ba8361025b9e9189dde19dcdd56c59c5ddb940aa1a025b2c03c785deaef07c64518d666003a6b5e05b7cd29a7f34732ab078554c67725cc8058613c77b6abeca634cc3c1b12e1653a59f202405b4391fe639cd4bb69f45b944aa1fb8cd98740b178de59feac2e98aee6f03c3baec57d4f9c13295bb4955682877edb772c731e15026e4775e9f42cafff8acf0c1536a145868870fcf40abc0ccf7090db4d0e83e0bbe93891d4b8c12b99b6d6a89361619e43f64d6183652370ea623934d817d2dfd79549180ffda7a8eed0e3b55a2427f68cb7591c441f7b934712a541a3e8c416783300f5c6a3129ec1d52f54bdaaab7da1da110f9ddda026e6ff419cf6401a999cf00e89ed6acea2d5401c74d1fb501c91dcbf398a1510937eec374fb043265b3d29c37a3f6fbab1122721946ce6032194bf5d28403b546b14c017cb4ae2cd01c0536f5697e4f860b908e6e0af618b9d4b20d6172bcce31e0d15e204a36da2b27fd92439b29440b291711b093cf7820c24f9586c0732b0b5911f0f193ee35a35c00ae6e352472f10751c2836b4c1f18b596c5868ea2da621bd2dec73487285edc552d8256cae5ae8e81a71fc996e7393e6504fd03b261a146dba674d99a434a80200500891804d0351f32d9ca0ac762da4e4bc19b2c544800b7c6f120e84988b627a487646bf192eaf3852a3faea20adfa9a027f2694036b7ae15900f15e586ab14443fd79d7a26ca73041800f1175cf2435ab3ddfc14dc414c6d774fb9a09e35d7123ee38a8e5d4e602ec3e85408937d54c8a4e06292dcb312a5055abaa35f9ba00eef47dfb347d84445984e965dfec9daf9b5795e52587ab7249df58c35e3f9c4f1ef82e81529d19cefa4c39a6fe64d76109bc8c33cc7e9cbab4a83a072d42388c535705d293dffebca2816dde9c7ecd3680377a5c0e4c83eda656feeb2a9938f0960ddf027de062aeb0890d50eade35e6c0720093205abb85ab7a549fc586f9317e53095636f3d301c53280673b3f47001607b02135ec179f9d12683b5fe97e69a0ed988a8011fca48cacbbf499d819384a300aee7e267270d2c87adecd83ec6d7947dc352fa2caa6d43049bfd4414d8f00c24449ee51a916c623cc703b1a965c0b31ee796abdfcb0e4a2d306ccc70fda7bb5137e53924a754d826b29ca6ac27f8de7d447fac9818100dfda5cb12325a845f7eb311b7c12fb9c578439c7df2420be13c5e4ecd08f6393aa2f25e69028243980fe36a65b239ada95bab07c8d46455da35840c1764218dd7fdee674dbbbe37d38a9d65d35dd7efe2015cddd31b7a208c4be4e58a358c5c1127cda73097c9a00ec1fcc9e52c93318b24fe5d30b970927f69b68406c0471682b3c4d413d13375c7e3b6c73a5734d1a42d65c3002e6caded025ed160fd21ead7dfb94238715fc1c8a47504e7056b5f41be2d335334b234391aafa1e31d0fc15e4a14adc928fa44a5a2d30a378666965f2273db6b3d418269e344197ef1875ae114f2beeb1178ceed3b690a6c8f9c705f19661011ab234272b791d570d2f031a3a32d75ce24b48155b35a520ff44c4dcf3733f0bbac0996b7c477d36c079aaf5d52409d1ad547a5b90648c23b9492d3d3abf4cef3b02f7637332257e5d719a0fb79c999cf60f70e659afc6158a436a891243fda4fac768467e0065f643fe3118b9e52bf76911ebff89e083ba8240f09350bbd1b6cff39b57b87e17793118cfa187227a07d80aa12c9c7ea99fe5d8408d073df0259301f14b49f75954e5479c1034ea214ced6d51f16796e22651547b3231003e07a73f5745f9b4cb3f5277eaedc2b648482d49044bde3408b043adc74d7ee0073ba8ee6ac9a6000cd95dd8c5313fea0e829fc81a5064df36f7eee16bc86ba6622f51931a43b40aec38278319b73f09d707edc7b1aff6fba1c88b96d018b802b91c917faa6930b547f4f8947c3f869596124359e5802d73e800b5ff5bfb0b563b08c27128a24c50703eb7844d3d473364cffc263426c5f4c31263822fa012eab40d00c0b6ec3b1d640be90c9aed600742123c16acdc514b644f6606ae79e1595e9d860a7e141bf6faed93ffd5483b856aa6051ffd46dbe7fabc3af0fc3cd5ff9ef0fa9db62a7b00f5c70fa4238502a0d43a22bea4bb95439c2bbb9623cc38c28e9e19bce12417b9693124a7868041634538f5855f4cf7120fbeadf0367d4abe182bd8c58a2c7807448b0033e93d4d43b8888c180503f2c978a5d12c07084ec51879c4ea68fb9f77c1a1efecd52a54f8383955e12aad07203c7bd58fad2c1a007634c1c6a2e66880f368075e143f290d79f09ccc27bec65992a560bfcf6859e059d9c763e245a7c5b67cf48f2dbf111a60d9bd8a661974add7a534796e3381292d6b1c8ab69a46a658109e615e8bb6143ab2a23b1fe8734a4c9a55c1740c513b710b2f3cd76df1578aab055c5df87dcc4a1a49c6005ff48a4a3c1446d83997676664f1ed80c589a9dd2145dc697a56b208e401f6cfe212f3145b114bcac74c1f75e0717106abcc997944ad254602ed2cc8b32c8539851a4adda093b36a76b3781723677fafd38dfc0fac5e09b9e77da29a80aa6581bc3421e237309706f845e650f5e0b5650d8150e7bb237175d9987abe91a733e35998f4e9b8ab9a4ba3b24e7ed54571f5cde71cb964f6fdabd367d650c973f6db2b369f98f73af0d043c1c0ca5842a75e2bbad906738b0758fcf2d51014e410271c3903fe85e1623f1ebc57fe36ff82a057568c96de394c42e41e5e6a49234b156bbd64ca8a1bbf72f8269240280ddddafa4a08a7b9ed97035f95566b9b6ddc0e1583fc9bd4cbd7d0a0ae6cb5be7c2bad88223f23c30cca89c9a3e62f045a6f5765048a46cf0ffb334a42aacdc26a6ff9ada55f5ff309be45cf526a8a4db2c3b26ddb8095f8b8223c90f74e4c55eedcc47638dba7d142bc6b9c68ae9aa3d84a43e86b37613b3ef87180e06bae5f564522a4815cb092a1782a40413452215c6ca829ec656824132348b15b1f82805bcd0369a11dd0426c7a51ebb372d21a47e9bd114bbaf222d668c25f71dbbac88c1bcf7716cbe555159b506fcff39361e86eda88f1a04fc53b428c12ab5532eb671893658e842eef0a50670c1f7c67abaccd612e6a6f40cd321695dbae96cb6e83685914383d97e4a86c911160dcfbf402c92d45ca7c2491a7f0340c84cd7f3e11f41a30c6e2919c63a5a8266876dc6373231b57c1d5ebd51328ca61d010ee729124b19e951c21b84389228d2fbae632f2accd638213782baa35bc9c0fa52efb28e9cb49ddbe2cfec64ab8c7e7bbb1800eebee509927d6cfc97bb5ae2b9e749e3e95d139da7de95f4404bb31bac02e1630524c094c36d47c9cb0ba69dbb91c186a8d9a60733498d1d49a78834c09387ed7ebc687b024adead635c45620e6bfeb2fc6e7cb50efd223be5cd518aab14349cb6a02bbe8dc81a50b840140a1d574990234319d13a2e6c44c6df214d7cc4777a6a9981ca26aef2a9b54d322259dd2a38d2588f559d794ea3f6aa1e969aefe91efb2e2e03967976c4bc64ed5699e2ad818e716d1024eed4f6fa6e76ad474be8075872489fafc1f938605eef5a647e835d3945a000f691f101d80a630c2d2109d4f3da50827aa6de276c4a5a082a8245542e797c6cde66f0949765e5616db7f1f31d263f38d921ccddd3a4caf4712c75804197deea6127ec25647cc7890557d19c6a36ee2fcdb093b6d04bf511d5e60990d76beb64e09d10c3521f02c1d719c2ec6681536f5193fb4ad9eed13d1b2d7b9d030c38058e5c9e2ff32837f211f564ba5e5179420236ca6a65530cd4e7a99cff909557b0d214d53b30bf744159c202af05892eb91ef4c41ee637ceb5d923b3985b31f006964811b758159d425747af10dd0fa2286fdf2f2458708a498125618b530e5af6eeaae8c0a2dd2295be2b2df005b966f43c1d623707eceace6d316498272a4b53a6132bd5515907a72d837e63c62c2deef62b3d3a1098411a0219075623b106e9c1f9c599c55f5e8c11d31865259b135bed983cc872d84d9cb2812b95c03dc4e8e829743a3af5d017fd25269f84007c25a3c2721350ab9f551d96e72213cbc026c2ff4a329c5436e76dc8943e6350ec308a1c9cbb84eb4ce441429c25c0a640e143c35986081f11abef6f66b0d6ab012ee8d18296901614cb7f6cc016003d032859d80fe28dad3684b2a50d34332569bdc89a150044a69066cdb0b159b3f56c79afd961191d2b6869debf0620111f3436066647c99ee73574cd5b4e9bd5f40966e9c788c2334f69602fe72d7c02896be604a412f0150124c8963196bd67412ecd1e3f3623bbf4e110ec67304f4c29051ac2d0d21870a0e8de0c32ffc1fe252ce8adffc148b54f512d93b7f8739c97a50fd60782cb7d3b14640921c82d08df04c60a4265ff305674c67cf917feede9bf863e17bb60bd6b14310d1c2c1fa8ec2489b6be93721ef90cbf94b830e9f136c39c9bc32a9c5262e676c61701eb99cea96293790ae7e3e529a03114d9075f65417809822f2e391493247ab3879c8702d84e01dc0842f510463d47552012252c60e4216d42184b2e5e51c7faf3e88ce373efce723255b33899f14d736558fc7206ef94f1826b2c3f41cdb96e9e0a717844fc5c9dad207cb2e69519f437a61f814bb6f8fc26bef7127442d51aa289f870b76543d2a354160891b208e26c45205227dc6c154e622016fb1d63c81e9d90219d3747856e613ce602036ab343be1c960d2e874d66635db6f7c43ec7df66febd22d88fb4b64e2e48d983db281887a164df0a84494aab1001d78a88548e333d124c171f2a3b2064cf2e02b1634878c9dbb5f5766e243b5a15089dd61c502466881deb67bb47c1188608340bbae7767cfc868c6100a33fcf7149287efee2aa7a1c4c42ec0fcd9f4b2c53c415e981e1181c9774113c3324206a73b4173ac96f3025038f5f6da1edafa3b092f764baa9d82b7abd4bcfb37ffd66525578610730f1f03dd9f4b12c87cc2d7958a72fe0192470f76a365ed762cb43018ab084d31f361559f1070dacbdb66ef7ed29a021f76f305f5afee6b177dfd2df34a4628be00c34bd299bbfb542ca67651be4f04905eacbc75c406a5bbac77c5300cebfc539ad8e5f840cea54d2bf749a53cf6c06c45f00412afe47f1a8f2f3d5a5e7f15aa9711a255613f767bfcc6213f1ef197b95d8d5b1aa676cb942eb99d85d0c444c69dd15c09df5af9118b2958389c41ca057e9f59bc2eb7a3e2b017092d57ff81a4f19490e2d7f7e09c627d44e889d7b370bd0d2312893d4c924c3af3b90d509bea096945de3ac93af6aff6d71b22be784c72c93a101970788ec6724bb94e1dcec82171c44191a9aaa500d450051e4c78227e53a7b596b112c39489423f0221ce4c3dfe0846529c7c42d51746897e4bb018b4108049764e860f8419d5df3b93b8ab1a112685bcba02cc86216ef5c28f01548af6ae49bad0756f6dfab76f2fa75d27cdcfc5355e5d4946748eca7feb0fd9cf7c9ca9651a93eb8d0f0f0e2ed0a3c5fe096e35bffde35df672dff4e89ac0e7afac18f6ae2e8ab8eddf92f2010ed7ee2b5d72aa130f52a80ed7280fd2e4b7594f13fdbdc722aa89d9c5f02578fbfefbbe6b6eeca2c51304ea23bc44dc5efe27156f50ece6f64e5df44916a0d67dd5fb07d4db7c876e79a0ab68613b9452eb076fcd529eaf7dde254ac5a7dccda1dc98723e7a156954477f7bed58e04c0c3fd50e63f1357e046757355ca274053715873d4d801ee7a1ab5cbf63b985f646d474542fec1863e32c075831a560b9105d95542b1d8584fcc798eeb84be37759f5db2b8694f3c18f1a82b8f3e716929812dba40a9ef7344b823e9ed0e8abaf22548d4c4a015679a2071c4574a82c88ac8e372cd210405836dba820912437d78bc1fb477af14f06fc29eaad166af164115cb0956548aadf07f5d5739d078c8826d1185b6ebadfa04595bc41f1c60d7ef88eb9575342710be7f5fa743825ea57f2488dbe31124c67cff5a054c667d56b255cf8a19c8903091494266b5a052c75f83de2e9c443c818620ca894d76b9dbb07d8044cc7c7af591264543eec9ee2433d27c038793a40b6628ad51991d50f355267746b1079cd10787d668f1356b640df22719bb4c84f7529320f0d95e9bf8b3dfcd8ec8174a86505e395087a6be9b22ed24e6777ea4081150dcaaade80bd4653dda66c174257de4acc8bfd3a393773a65656093219202bd43cfb56c84ea1cba6f142d7c287dff6dc3fd309b2989d5927ec70927fe0472b02a9c9d26f23354184521672c3cb7298ddbac180f2bb12da1d1bbba55bf206b45da93237cf944a1e7ca00e785758e8be36e7d79b68d1f99a44d8a61aa1a2b276e223c0e34bbe005b575b3dbd557973fb3d0ff1f2d2725f595b342dd6f9af36dd576bf56db54b89c654b20b0006ef40908c69dbde57f97fa7a56d4f88b34d18e66eb94a477a44554db53ddaa8c42a583a61b5ae5ef1e45d582c86f852cb5b245161582edad59667e2e933f56ef42184b749096fa6c8fa342e9521731251d8856ee6c4285e626b0574ad8b7623391e1a28e055a6d57b6f60d2a4dd467382a363a8475c00744ec2b076e0c8722c8aceb712507ca88906ea8c8336c0d99efa93b6d58e6f6fa81b47850645470270dedf317aa6ab874f9f1ef5d5015379b7a44792cd64545aced67ac18d230b5706de2da434a3220be04922933301e139f8d81148860dab71cb42f9dac93771025f3de8e221ddbef7f71676396d51cf6eab4cefa2a9bfe855e54f4087e93b0d09561f96a197a04ed61788c1e9733cc674e099249659ae3d764d1800c0fc1c4fd45256a43c053a147257fe6b96837b2dbad4d7842f26a295605ab64980f9241d5ebdf086c9c48c10fb9c85a95e79f2b987ea02a0b586d25bf98df794c139e4c5c729b867646a61742d953fd9a9babf6084f28d1e7f2966d06b04ef01399fd78046ec8136171d9938fa4203f1f073a5db2b7f2e8a24cc56730f12c1bcaec04a6af0c10619ea70b163f518fbe4513ecf1fa3ba61c70bc0d14e538750c4a058cd044f5ae72e821fe1539db5f89d140c97b58fde172971f0395e597d2001dfa154535f256624fa48250b4e895a24500022638b63440179523f83132257be5d2bcc2b9f7b6854f49b0ab6d221f91a3624b745c20fbde797f5a161f798592d53aa55f815988d2487086ce0bbbc3784d610a4db00108a14a2f6e6a5e81838a61ab29397ce8ae8a1e9381d8e0155d128903a10a52082d84e758a89c37bc66d2cb4bc73f7dd6b962a598fdb9cd2a8e719c37f8da099e943fab33c98867c9e9c74e659a7f5e171891ea114042fbae80b3b544172ec8ddae7c238d4c8551fa0db7a41dd554bc42344e3d8a42a13071795589dcfd0c80d93891df51f4b2e68c6b21f04b7789315541b62b30e48a87c6babedb2274e6d93ce6efb0a031632009382d60911f74545752021b8dccaa47362f854f1fbc7685f41cbac548d6aa8d5115c324e260382c89b0fa113c5188dcbd97be1f666fd897f8838f527c5221a2bff9a39fd805013d0964bfada318643c6ef828206f2964cdc5fff09186f12b0aa0cd76d37182f851701c2805ffb21e3a2b8d38fcd507bbc4e4bdfe618e88bca45c2ff12d4f2ebd5eda1f8c4f1125ab8e7688ac36ab9560f1031b0b879137e5860c26e31ec5c2274fb836be89794a4dde0abbd029eee48bb9e2f8233dc4373b09ccb3037bd8698edb1c91e08a525a098bfcda45878c364e1bf52a3fc8af9691adf1fe754dc90b9e1945bb64d2a512fd0f20bad7a5819a7cb1494e170fc79d4675913520219f1005a6323df6f96cf458bb80dc29e61319405df4c6c577fff09b7865ee7e18950f59b5e6d70b148ce65dca8508eb4279b4180e0923d28c9265eb1ea7ac6c89dcf5c3fd7e4a18a8524f9fd96c80079c3e31af52b7bd34ad399a13bb119a6e851e3b165a267d47c1f843f8b23ebe96b552d763b0ca8cd793dda8c75d42666758dbd44c4488ba5e5c1e377754101d2c09c72708d8c528b49619ce5c768e83abce525a5118c1d158d15293626f100438783e4abbe5d2ff74561fe973f4b16494b7e92ef848652f2642f9f91e26213a0e026134f6aa89ad2c430b3c0c1250658da1fcfc160f84b30ceaa7e89ccb1eaa9417561168f94723305942488066ac0a768ce747181f2cf6c8d428583454564c342288855dbe42b2b8ca4e9444326f2ee65b20e40c569b3a7327d604ef4a7b31f93ce6d070d661054224a04facacdef78f688ce8fb0cddf74aca0e3c6ca66dd61b9641518ef68e4c21e058c4c1ad8e46eb306e231591d8ff7c61d99fd8a7e0c5f554d1e072521ba5f963bb4de42519415c61003591c05cc44880eb73444236840fb8d0bc031f09072a8e3590b04eaed4602e865da703678be5a96703c65066503008de4f72fb82b69432069a049144991dbe4834dd143c02207dc6dcfe4dcaf29f52f0a417eb9f47043d9c6cb3b06209c0d1b61c70ec14ed33027206c38812471f3b9f8ebe9f95ab925f8c012d8441f983d483031834e50812e65750436b862075c19454bb89f04f1c3e4a87625d854a26486e61448c830cc0230aea392bf35b549fd37289c2603b335aebc0e219c025a7d24040b4ac65640127c81b74f078914a74023e19b17866a63f3f820d18f9da4d13799bc57bebf60de88f934ab8a6db66fa3526727a8f1f64a1ce929c0d5507aca2368a3c1104c4537a3197b1840412f5349a309a00751d755de6edceccf5ac09848f5878c218a21ec609f954de4bd6225ae5e4dbc9868799e50b277825073154051b7b3eb2927b4f6f6959755ed68eaf1dcd210ca99109772c0550af674f0214088947ae9f71d1b016414468b84dc4eabdf18f858c813dc5a121fd0c798bcad36570c04018e0889887344c9d3b45ad8604fc863ca9c7a25f3621d64286e1b72b823b9992c68042374ec82b4dd142aa5deffb92fad08dc4c089a81b175a8f37f139c118395eb870833ebf62de63d7e96774126596c810498c892315814ef270bc86985968a59b5323f2804ffc468818af6f978b2460c30cb86e1349b155b1817a430b16a30942a842cdc5fa1c0dbec1d3a6181499acf71b5a57189985e70a3080a5ac8e9e3c6a532b5c30b1a10cf431e2bb3721c41c7afdb4d413ac8d4fda4f71a40847bfe135a1f3902c54b750f4c9985fe61bf9cdebe5a037e926f46550cb6948a661e3b29134e3829e9f7c4b9795b0cbe3e3d71cf28516e37e17f596ed4ee00216936c9edf44c9ca900deb533c4fc78ec76fb1e811a869a54088599da11bc2e3b2b1cf48c63c823181faccf4f610701b43d71e3164969aa0c675fbabf08a9e9a79fa42df1bbbe8a699529c09b640e725c52802ec0fdb000fca0725e1c91150021e4df99ea61822153f09bfe5cc3fbbcb720ab8478d674d4b40cfe51216f36299f4664fab28014af4ebe2b8626f0befc1de9f8b2e73f7cd79dcfc0706979a1eac8f39d31520ed6738be7224cb8e5423a3d88bb5400edbfeb7c380006b4008c5dbd73a3cc99e59a1e4bca8ce9543e41dc3a2b9e9d6e3075c1c01161e0228f0b0143724fa2b847be3c204b6a8c5793c594fefafc6ba423d1757a7061d132a531e10e4c36f7d1bfe0d00c0341e49086ca8b34af1e289d2a6080b54ef87184837d489e1cc7d946e064e7f892867155d86600a9a812ad39754730681aacc82d1525d8c19f98811e6ff60ad4134a9813b5100c2d7200704af006d7ff0dff113b49dd3ca2462343948acde48d1b7437f7f50cde689eb78c5afc4b0234ca450e152d17f40ad801fee619e0a2a9379e2928b83c83799550712351da34c41a30c9270af9e82c79cf69b58d125815edd4621ed9ac486c3a780a19c1851168458f97b611a3ac588150214e7bfab4e6435f15884b44c126409a4f3376b2ed67ca6e45128c17c09b23235561041f7203436d4ecec45c08acf72b0cc01ddad88d215b7c2a069b067fe4b43b712b4b49c5b51f92f5a11079660d05bf830e7560ab44b790a5446bb9874ac4d239ad60a268beafb402cadca42ebf69dd1aeacb1b9a646f686c6e794c8caebcf0726234bb80509d349312dad2248a02e0b10313168e2e34ad308cac14c358c655c2600c55fc23d82a010e240d3ee58158dd68b2e492c875f5d37d6214969141848b044032308bb3d20b0d48fe8a95c7a3ba39d64148c82a60788872759dd0562d48bf8044c1b7e8dd2e00bc92e836c0d497a5289b940a3b9517e90a587a62471d5b7bfe9d4554e417d91d8e88c0d0d4d302b5eeba4496c0411c8ca157544faf84a9b970e9d5ccf26c8e4aba4c6b4824b0bd1ecc41270447971e18f7669b9f85bcdde3ad6c32275169df56aa135f659ad5aa1ddb6717425f83717a3b1199e7724e69650ce0010f570497c860ddf7cdc06d8e1a00950b0ce1e1e5538bd74414f67a1f7aa9c03ecbadff2274086521c13704f5bde1c56e93127787a07e80787fbb89fcd94c483540777fd1a649732489cec022452ad165695167ecb41ebce33be8450d1179e31e334077f5abcd8a2242fbb04910db7389530bf5ef19e8ed5c485f785ba3d34c52046624722bf690d65a3e2ac7dbea0995ce60f823b8c6b1852636acf73ab91520dea6f1c25310beb9d0195319ea4f142075522006be9c0bbc65c792784a948059e1b6edfe972b5670fb254691ba14293fcd257ab92608f9b009b41c24473e43d0a02f06a768c7e0dbf2ce6c887ddf3f44ab48e81cb56def327356899ba31606189263a642418214cdbafb7829662832040824cd0b4234c48570028b8634ed4c16a045b3e8f4b785b64667ee5039c5d18a06c4eb6f0493d72e1754b15428cd4a424b7295b7198496ade06fcf9b4745e1be7f773cd55337e4f608d30436a877a51ae00eac43bb861ba0a0c7226f916f48ab36d8b27abf6a0ee4135cf0a05e0b168946e471835a969b254e77b5c34d4ad45d89a9197127a9025ac4ac0f55a676eb5bb549cb003b1e1bcc7661a639961b5fe1eaff0f65da6842147ea33a04aa06fa1079c04285d7d2e47e0fa6f136b03eed212a0b6266f1031a9148fdbd5850ce6efcf1182f3fd2445a78e2f7941f9f662b63b6dff14a5fe53e2ebb745e5d0349d0b2023af1b087a819965a129c6a6d6c479815954da1a5a3cf3343bab87f3985833e284a13662a8c715137872e4f733867252887df27bb855fad966ccf11b9a0476b44be34942ff7b681bb62c66f3a3b8734a343864e2ae783b12ce6fea8158f255b784410638aade72bb82284d0c7205e8364e38de005eba153de5337bbdbd1d74bacd138fd1e3587b9e5b715c3b4500d681867c18aab4d9f9c82fb444fdba812603261d96c48827449a6077b8d8ab05fa1403bcc5068b41182f88195414cbe38b2bb155485dab8a88db43663be3b3c65768a55f5493ee87ee6b820aa75e74cfec1be82df5a224a6d4c804c165d30fca3cc126c01166e5a168813e9b5d1199645b229fc4ead6745f91a420e5c11bd4c5e1cd15c3c238a50954d131d131015e79fb898371d7e1a41ed51658347d8ee19244a21c3ce950210dedfa6dd3963d68ce034aab75165a0f8368062650077179ffdaef20ac4b999a061215e64aab40075f2aab8497b0297a5ff7a50fe7654b280445a9b35aa06e572448bc6fca3a54c0b25481980f72aa4a6bccc2fbd448efbddda4870f0ba45899b8cde730c4d764a569aa3d6727777aa3d6ef4e7db10c63a3f42540002b7bbcf8590812ae48fa8459392552916e0c51fb3882ffab10254d58cc4e889505a047b207b1d385a1ba1d7d22d219b90724343a7fa3e1dc13ba4bfccd626b158489422619d75ab5d26a2edd61ad8371c37bdf6d1625073a745f624537bafea4111d1fb68ee4fb1593af4548a1b0e7647cb884a1265f7de886fd1b4a64b0b92216205e5dd5f7526f45d625721e932d15aceb40be68608c4457e6d952a5a5a042a33507d09eec838a9f1d31893b93a553c2ec9d34b3cc4696e7aecb612314b0ea5f0243e143e927c0872d5d4a28f8d075db201a44228adee55dc50375336882b1cbdbfac3e86e1c50cdde4460ef1dab6de835d12d49fdd2115cc064cff68b92fe4142fe69c1724ffa2c899df01ca5fdf794baa4067eb044c3c736a62a3818a29fc0799e4a593bdd6306305958930d2553e15e1c0615a446833a24ea4a57957a419596796668b1bc9bc0c320ac4afcdf4ff01231e36262c9e1424049dd1c3e903587fe0b7daac4470bc2eccc8bf9e7e757acc39a95ee435e538c6deded77948a2c55aa06d70e288a28e3577c25603c5e98ea3e28d12a6464405eb98dbe4eaf78077d452e6808d24d090411b96d276e12ab17d918eb946f0c37771ff0c33646e0e4990b93af6029d92a75391886aebb94ec37175199409acf43aedd4ab6ab1c9cfb8afe534d4a76c61952fa5fbe945a0f49534d2a0fb54f8902be7fe612c3f58008d19181ca3e7ef6a8cd0ef201db4850963497e8a85d72a3af2a2b37341bd80df313542daa44756c5850eab92e7b780965525231130f2120441dac129f7fd8f105a4d94dcc47febaff6dec16c367d3e041d10e00b849aff65ffc1955fd1e11f388495dfe2ec851ffb13542aed555e4a91aa562327420b806fbfecb53873d6a668bac32e09e7ed96d19243d24bd610dfa28fe44494a3a508b2940780181dcacfa659bdc08a445a3623aa41a3c980e3cdc136df6c63f696293ec9e3e7ba28d443c2e0439aac39b12a716a5e2231d0383be01e316af52bf380510a0af35a59916f4932417a1ac0e9298625b93911344d4c96824f933653708f64a04aa8bc5fa1fdaede063b0b63acef8ddd843ee3791c66cfc504ad9d3a8b2dc35b3d5941dd4cb7046973037f300295adadd0afdbfa7e478cf0c44f3e8bca7660198a84b62be5ca4d20cd75541517060434e6d669eab4ddbd21484331e5c76fe8613179e2fab65cc15bdb415ce856a834017909915143e17c59bfd076dfdef280c382764fe192516f38b0bed01e342601c36646c82e43cb3cdc0156e1ffa1aba925116e104e6fac9fa9aab8dbff03a82c28da80d603df05aaa246898b803c3dc72e08c1281ac9aa0a1e62b9a05ec0848a5c182efc3db019a9c2f137d2953a3a535fc3693ba6eeda428bd904852cd26c415c9d71d5485edefb88009f87a4ecec610c193091d3f6ea97f6708a29429d480672bd71d97f6669482a1d61b50247bf2154dfa92c876b4b65de9d5c6e75b8a37acc0d9d07509cf1e7b91422823548a82b07974031e4c7703d27961ec606c037f41d9a96d576892cac4e3d99e72156ce1d29b5738a5082924b335f801f583ed2b242a3c935985235e0a1b4026f41d006c089f4b9800ac7320df4119db693f99bc107c69072681150646d652cc19118c69490f5529236b356104ebaf47ee4260c22696d88e3c807204d86583cd66578a0c6cc216c0ad3bde33b51a15174a95c6171563ce6452cc98d58279ad0b932efd13c0e4010e7d12cad7bd4ae14bace95431fb0efd791a00b4be247bea50b349ac4f7442a3b89f6b39ffd8c8f35cec285ff33d39a0eaea7edfebfaaf2cbcc898aa3d797ac6c7e0070d5b76bafa66495a8402e8f1a51157189297c8e939fcffa11a9bea218a3f2c036628425141c6b3b9fa83ecf8c915ef02636cff1ec10a64751fc422ef0549aceae66e13e17b3c1c21ebb6145e29703b3f3d0239f4347468ceef4460f5ab6fe0d94b73f14e0f45249c147e91ef2bb18cd66ffdaa6ee251799a59fd6947659ea96b8aedb4fee50f78ac42dadeca64a7e72b2916ef85751f9c055884f5c241e60eb11877f3ce2875b76c79ae502baeee2a5687d88c53a8cdb23ca5be1f8810d4db9d9fa5a26f241d517777dc4ba18e5ad8f77e6880659bc685020717004bc27dab398777a9f600b3212a7f519954799384cc8f3ed0bfd0a61339d04a25e0750d2df8055d6bf45e1d7c23433566cf5dcbaa4852c1145cd43ca3bb8529a26759d610c1d54ee45c6dd739c9be619e488675577bc093b207c55270bbb311324a354d51c7fe2fdec31a58f91a3aed017d4968676e8f767d0b9feb70a9419f8a254af94ab9471c2655cb9a700844babf7941a98e3ad53c2337a83a33d898902f30f83e9fb0546720a7a98c26261f0dd5c7b842192b3a9092db54dc7a888dd8512e4038f90d8b3d27d84e209ec2031727e3da96a9904761d98217ee80f413f3a6a641ab4a37367424014707a9c88a08286b4576b793c5f52c5d167b9659a7df3cc4898cc70a39676f06f61f72eef46a4f3938ed9485884ae249af3ad381c6bbd836a61017d59c73714d6a26fb679acedee7458520f30ccccc01433637e983ec42614c568056b49981cfa1b61dc72c2461c5a2f6595c0e8be843ff2ae9097620d568f11cbd8eb2608cee2cd9d035813ec407d8f1df138e5be328424281ac4182c1a3333c3fc18ee2ecd7b4df67641ea38d1cc21d931620e46248ac1ce67039a022e62bf63e89d1c98eb2e6090cc49513c3eda5d1e1fcfed77b6eecc37bf8be1a9ca7e8c172ebc8c3e4b01c125fce7398087e960070d7297c45e8ae909e024c9e0fb63de00ccd4fb16faa83c319e829757ca19056b1e65a3c0f7a437afc2561c878858830c97f86819e46db0fc301e98145c1fddc2121031ff793281f13122281d4fdf3e2fd9d1552b025d01d385e6cff72dc3f17c1ff9fa924114a2fbd335093a174938566d8d87f8969d69106b2bf638544ba45e1c7c4a8a74957f3893f2e484f0c9e98dc584a5d7106c5738fbe6a8c8d01450563f17235f33000c380713e6147e53367c2a2e844b6fc0360fb956f8f51f5f4e39adc7da6d3dce2c6d8a7e4d9565398ce0c9e74bcaeb1aa50e7184c4d6236175368c67a137aa2349cd39cb4c530b1e0ed242c3ce59ea0269c57eb45b8e2ac929193546cfb3342c5c632696306d917c35c08c92bdf082bd6ca71c5560f192a098132e53ba0ab36ed4efb9896d90193c307300dba261e0ebe113dab96d9c96f54d0f1bba23cbc606fea1e143782c114a3428a3f706dd98b0ddde52be064a1883eb36aaef9feaf982f8c2125b92afdc678eb7f71672be2a8b3098d71bdf131e4b9317826959b6f984621e6cc2df3df08343fc7901549dc0a4cdcb16aeec472535a69826572a9341fd0ed1a203028fcac49dccf155f705a659505af3a6948cd23401b311b2ef2666735d4bda5ad9d03c80e6acccf7ab8a92d05ada1176594427451892291c1803def269a687e36c0690c02cd0bcbc5d67b28a33d0d49e6a2bbc169d9d8e2a8bd2abd878dbdb20ac7ac635c0e0cc0793c882041c6354f15b77c8cc529c8b8991ef306cece5ede9e7ae8628eb671053298282a1ccfc76be23328de04f1868581e3bf2ebe0fbc971e7eb74cf62b63b6aa42023771f1d6dd506870be4be18cabe7d861c3bd989f0215d9bf5c886f3212718b3d5f46f0f29fee35c11dabd60eb095d0567f10e6b55e782af0ddc791767906c93cee0e290fe77253e60cd5d9c66f12e36cfa710134023cce53a9b53602e4749a87fd79e7d5fe90a1a7193f0a59e756e455764ba988155f3a01f7bee9a3ab644af95956ac47fcd10827f4c5f1940017b8ba97351b210cf4593ebce748d732671877223f9c86906bd249cae3930053381f0cc80273886bb556b1250eeeb255876ca638dcd5b3844f335495902b87116c525384f0856cf821ea6c1e1d0c11611de9089cc800c86fec976862a34bab8a634ec771ed35d0a1c70601ef88bea53ea691b20f8da2c2742d850672440a53ecf217df3ddf40f590929eb66a675c4f7bf9c82aeb69f3f672a73bcf56ae5b12d2e6d689c116d1c6306305cab83e79c18c4f2961c7c9cad5d7b758e92e4674d1982660199b1c4d92b5679dd092e00bfe6fdd45f8e63150103dc3181feb186d80114eb3dfa917cc7ae73e9bf4505d4eede1f7c11f929c8220310593f467634f765fc33aa0aa68f999ddb5362a7dca89a9fbbf7c16c0893a8d19d62b56556529d8b922253d23608d8b99916dd0068dcf923003b3af91dfa246fd2ac472d5046241c9c0b58263a8a769e6d03d6dfb2b21086dd8afe4fe32043a63d5772b769012eed2c9579c70eca0c21bc717083050eee374d8da74109ab32eff2fbaca863665f3d8b141cb8166d55ada969b0b3b66ac130045b3115144baed82de0b079b4caa2face3ebe2dd614677ddb4e23c9a3c0590f4fbc17741bf2e84206fb1f9aa7a5f62f83393b236506ce84823d6737771967202cb4694f3a9a3cb5a65f9e8abd7067b83d3513068a735e7ecddf8860e62a08dbfbb56bc99ec5cb44adad8aefe0ccd639cda40610084d8c272d5d991c220df87cb09548d2b05bc2a1d99ee74f410092cd76e010ef303706ba61c13236996736b529870e64b25806450c715a6ef88d7ac930f539921b2814a288c592e1957e80e5d0bee9c5973e121b75fe5437600974dc5aea79ff071af110f1c6f0641ea5f7992c6f5591399419bf46f1d00aa89ac9a67d26e9eb7b64b26623bb2aa0ae27c499932a10b4ea7784e0478cccfd3723555bc1ea5dead605e2e8c951d185c5066a4b994c803042d28f46f93b87199c6108a7015d0e958920c53ba6b14d7a536be32c7e10c14c21df379b7c057a85be67a90618d7072207f36febd7a1786d3c0ea9e094796ce54b8278c1151fa3a331ea4067c092f8b21cd239baa57f7028101579fb889ba2a6a3773a9706fd46eb51eafa87bc981ecaff7d09368e9ea501d344f54632fc793ae238c983c74c0494a1fbb86794539e4da263018a20533fe15851826b5c91bd14c34ba59f9c253af20d77ecefaa98ce34329a4d5b6e80063bfc39c9ff565c9a0857c3008dc0e2f7fc7221840b208d62521f56eb4c29d97de4d38a9aaab92d953b318ea0d569022c98f76a020d58632798ffd2edccd2aebd63fbd430008a599bdf468e08748ecb0ec1ff18fb82359dcafe2393357aa4c0c45aec99fe9c94f5469e94eb08991e4658265e0e09ae177d910a0db07c8af4f128c46452809702def9559fff07bede948a06f6d611852c3bb76266c8082d295c951596388ab9190f0e11d00a858d8cfcefa5d8a2157c8db778d81d7deda7ef00c98ee5dc7102f3e9f5d8791df870d9f20332d9405f2cc7cfaf972f6f6c143ba8b78520de3bec55a5900fc326d418363155d15da522ed7619623dabe31324ed5fc17c1acc2c8b45693332f000c28db4ccf68eebc71e0462c1bb9b5e7beec50e81c7d8cc5680f75d77ae0ce0963016e52fd13d04094a808bc29f92cb501e663c7eca24909219574ce832b353e954029504d90891f9a8443f079a408f167db47928e9ed9497301057e6aa2940c32723d7c0d6a647e53bd08dade58c0e758284c9d91f0c7c5e07cdb52e79e03f486a95b1506e74395bedfda26b9fd776887ac888008eac2d0bb1d50ca2e97c8a1ec99f022d28ce4d79a7890ed85d4093e8e94d419e6297fd15325b8a79aa64991725e21a1fc857fb2c798b7367e029e37d57d1cfe3a0119a03b119fe7d05e93379a59fa47cccbd8e3df3c6e6c25434e027151322566c565a31705cd49e701696202ca567952e96fb002066c4ecc50c9587bf4a1c197f5f4f360db541b0c0fb84e81c6453a13d221d0aba9324b048f994f7887e2063d8f72fde769cfaeb9ffb6f359849796bf59919b38aa86c3c9f96b39e40810f833ee6f06d9353fd4e81ea8f8dba56636a8a4135558da35e60c97b83acde92e49b86bbb8b10f9c38f1522285e2b9a2bc5ff69751f5f7e100ece0465baaf515d2332c6f01dd4aadca4adc236bc986588628654105b955f7596d23f933a62a9d489df54ff0bea7a403d9e036a48204a1034e003dc4990c88c2feab7d6b1ce8be48d3225dbb4de353fe4eeb9642d4fe4b6d79d53ea69806757a254199fbc8d66ad13f264c324807e84d067fbfaf7005ee94118484055dc5a7e8e4a295613bebe2c311396e297adf14b0f2985dc5c1d22720a4fdbe922857dafad63ebcccb0d3860ec4aec2bdf0a08423e1752904fa99b364b07e47e27cca5731f8d1462c4d286a997c715adcca003242609ce603cd64611795acfe0a37bc1bc1a855fe6ea12aeb62d7a51458417ccc15bb72236a48ae4ed05e750a7f666af800fcebdc602938f4f3556b2e8cc1ff023dffe33d144708604d62519c22c476156c610c7e1384848d92d0154c129f498b534712f8ae551650125f677c4cfc52a89e2ab047987d91c16583c4f39ac8bcf47ce471b7461c38856a699bdec9df8b89371d1fc19917c8260cab3eb5b12a1a3f413fc6613838cc155e1e94f0df21655c8d08f8f4e24f77806d518470e36f3c3dc2f34b20d5a511ed1cb82bb477e890c6011854b9e4d866610797e216038c140b6e096d127548c20b37b7a08d9af9bd674e01191c3456c14f346cb2af1fa6188ffb52d598ed656d399106efa9074879e46301d5654d60b5ad00759ebff3e884906526d9e219d79b7735607640ab18abd66b3859456679f0527098872db45e651db998828cf656f442116b05ae4fb46e6508a61194d534816f8d37f48f175e16ccfdedd9af7041fc235c35746b4f072dae94a351d8b04fc79c31b6d73db42cdb597b43d03fb5afeb09f4a0b014e5024fb1f912e640fd7715f4e344a6956e427a52c0dca1cdcf6dc471baed50cef3b0ff701681c107064881d2a34612eba64a75a2de6431dad039b106f2198f155149b43e4d745b7e81cdb363f3c43a90d736f38f2f6a9807c97c4cba8a7f9fde6ee1a0d6614779fd9e034e0ba5b7d8f1cd2f52156432a7d43d3813990f7a21b2149187788550e39119509fe8e8ce58351229fc2d5393bdfa1271af55145d4411d8ed0163e4d695ce6fc389f28427498507ddf058ada152c89c6df26469e0884d21b3039b749254d7a5512f39032f56d3d87145e6aad8d1e69729727460944b2fccf31ab8ae1100bbfa7f2711bafdcf4fd57316cd4a20ca29b15e9ab7666ad8847fde9d18baecbaf941e26aee559a59bbd958ff22b38632640bfc0e2f130686f009dec67f585e31d6e7b6bd665ad1dcf8730a3f7e6af7aea9fa12603e04b5358ab3c87422afa6dd8699b6f1ee2f12624305531de5b683d16f20eb883248bd83c6cb722354cb03bbd950a377b04652aa809f1b96dc524fc72284eaed222f4eaa46f52c3eb46fac74b2f0c3669b7e111d989602cd671705b39a36e459882b27e9272c430736bf99997916c1c89b31998ea5fb055017d76723703329912c82048ab9accc82e976ae7405c77f8ac40c9a707fe264ae216df9eed6704d8cf5a4ab8b306a7213f30d698267a417844ba90f9c16a4907fd006621e7555f7650cec97a69d8c9a6076d45ad065e6f2d1ae94ecd7bc109f5665cac71e6d55ecd74824bdf5989999014e295fe0de0e225f15a3ae4ec64f5f6b64bf900e0242bd38f676e8c45aaf1f471eae518ced357c7ae543db8035907f284e61024892352a20609ef153011450810537ed30601375d08904004b225b0b6cbeb46012426cfe7bee0141f9cddb85d8b77d23a849790ed214f7783efcfcc8ba50a61447eee8b0891887c2d51fc2c84db43617b1b58df2b51f5952111641d97ee0883ca084a92b7a8240c18eae9fa3e4db3d13d8d4425845883c67c3e448503c09add8b2923bd5100500a642492592118bcce9ef231dbe49c575fb51747c7b0975f495c7464da9ae96e1199f615e9f2f0c81c1b0d74e7354c028abf614ad2655a790a726f5693388cdde89c1fab7f818d02fc71893d8f91aafef579e035487e8715f4eb6e46bf7fce57536fa3d5a93d2d84381f7cc0d29f343605411b666932fff84e299a03f6e21e51551377c8a40b0c71ebf50730316357d5fe350b3144b8532ee124fa6ea48e17af81b9a57ba8bfcac9d89a41ff151e77a96e36a7ba410a7502bd3da5bb88ffcec7b856f4b50bbe7ae23026f014dd37dd7f1d3e46800c521d67ff8cd6021cef1fa8aa7516d47bf6e32c04380fdb8a353c5ad64780deccaa13ce21153f252153ececc3dfe247d64d24aac1f79b4da3c4486494b9b30ec2ac6b181eb2cb1f58430830c3ec320c13b1af121f8b8dcb2feeea81ab0caa5133b878200349232bd571e240568ac4791c2bce92afbc32ec7b51da103bc7c1cbc8fad174e2fba7b8547bc012dbddbd940deacefd01201f3786119d7138749b89a8021323ec1dc7d507d14aa834a65ebec42be4d1f5d40340e67e0118253a54e71c207218f4808e616fc9d571db0e66f2bd832985c8b3a0e1f8d8cd3c28aaa2c9762be80af0540299d95cad6d4802fe99624fb057b1362faaef2f9837dcc541217e42e503a256cd6dbfca98e9c3ba4c91f28c18b85ff2c0d7e4e03c2eb68b2e842ddf0a4186dc648d772097fcf0fe68ace0fdc9d5a25babe0468b65285cce41286ef321cc7e391cb8894e0124af3321a64dc70fb9011925c542d8f803b2d52d6adb04d8110f9d7c49323c9e2b897185794358b074c04177ec166936212f09936370393cf4ca285ad0f05768453470d6e510a613e820e9f8eb5e32d6199a12cfb1551dce39747b81c51f6710f298e5da4619946bb937b7cc8e5aae458a484071175ceafc49c397c6cdff423d891d1c60e607001a52c0ffefbb6335a4249a95e2078fe8968f4028695c7e1f7ced2b4e353c610dafcfea7114217da1838e5d01a1440724c93e006ac819625fdf5528b7d340b407de4995f6461463604b1fe457ded880713c4613f6b43d669d3337ee5581ed59f22912474b96dfa1839aa0cc9737ff9580ab9ee83300bf7a6df034c5025f70a2b7573c92616f0a13696a44662376f51dcedeb33bb1e8d552c7aad82da6f46def9db7317495b92593f849e13a6cf714bd4338bad960953c08903ec280af831c9afd96d94f016d8e0df2b9fb88e000733da6d7507da650edd5e6ad3a1bc02257f7bfc27aaf2cb82b121f64ff118671ede3956db1aab530f2f44485bf7861bf10094ca6e66290e50213b75c0741aaee26b1453711d13d9d3b952d883bdabff8f9d1f8c3bd0836aa9702754f70ce51605d1715ef543353444dd30e0e909e23917f13fd7eb8f085aadbf6bc6ebd64696b6db41ff1d3a3de65f836afdbcd45ddeacf6b2818cb1e8d1c1cae7ce02f09d3220f54f8e284cb174180d51a86d979bf78563dfd3060e1a96d44cab9c69e72832f759eb6168a2ff68863d00344d60b87664254b5ca882def701909216c75266a2f01a23cb668d022efe2493815b61d73151fe29e4ae595d71b2d92a8e3ba2713ab457ae4cc82abb7a180c11138edd1baec700966a22c99684bc9512fc8b296f30f279d37800ff2a2e244fdc2f5463cb5f021f640f7bdcd930daf466e6e9abcf8d18e5673f23dca72c2345bbba78ed78bf04a76454140359aa64b6f8c7c5ca230f36272f0e52509e69c1a4a0d256ebdaa7344200ec7921be9dc7ce4115f60184377d7b878e5b04f9686948f6b9ccb485b87d9da269f81e147eb88c1d8ecf537e49d499caa5977c9d579047f6f84ba402740d614c628a02199b1f3370a461e7f855983ff1550ed8f2b3df22f8475450ff212c4b55ae540b516dd34ad6ceed32a5b926824c2b5b5b95c63d139c84585f2d3d83e941d882a333d7ae5934bfe4310ae84f3aa2572bda09099f9445ad0fed7408f4dfca61d5bf90aae67a5f7059cc3f657cf3e042ef1ca43ac6c15cd2a221f6fb241b7ac765b6e9580c64679ac1eccbcdf1f15c5fd9c7dd531685c2555ae4240b6662cf98af8e8ed0ea48eb2d1dd96ed32329027fc1f6c3d0f3b6bbb3fc620cff88a4fa03d4cc040b7d366fdb90a2b66cb3966e1eeed47701b45db04ad75b823d5554279599de97105f7d65a02e4cd3c8a667df1df142d89d5ed4a30c39d057196a3c7cd0574a59cdcb72aaeb7458a7b133da5ba7972d644a6998112ed068faa3b4be62211487a7d6a4baa174d6f064d6612d13d35186a2c3f03aad55b23eb0d667bb9373fbc3a8595f8604113f18426d90d4d517418828dee97139ecb0075914ed4b849fc5d3ed56c3d647a34ed65bbd5549a3ccf5e3ca3a17874fc6f988a6980ae6495a423ab7918ec66b68fddd8db5e1cc0f83679a38ade4f68f0bd77df29b8b818af80195362228c05d003646d25e811a08f86ebbd44ca85d9b78c12f40c740f288058e7b2fab33b22cc50240baed6ce6e6a3fffd2e8b65140cbee9387a54e809b81c4c26518c85c96dc410112a82c134d4e24fbcd82cdaf0c3d5da6ec9316d2d8eeae89fdfd6cd79e5c1603bb8b4306bfe7fbce4be514839225f77057e2797760d26e5ed7d8710090089c90e1df11c41896641c5825ec257ec58e892546e4e15361b3388b37a0d331718e951384f00b22e4c17b5c27c0a75c85957a748d5ff882f5baef2ffade51aeffa01715c41d3087962862e04cfcd7d3cf7a83b7f813981b13d7953183fffa4092f19370634e13a545ad29e99369972c64f56ec4a283d347ad2aad4c72fdb3366a96de7d83af1869e20e80cf22422f29c9ffce4b3d652c05cee1a93d1048935cbce41f022633e118cd04bc209eab4eb84112406eb5652efff76e2bee2fff10e3b535a57e5895c823ab5dead3b3cdaa09741f6f2b65c8f6bc9f896137b40a6b7559a7d04b11573eb2d17efcfa62ec252d852372c399f213e95f5742e0adfb8a2b95ebec1b3bf674ccd928267d340363f662374e37b38eca4d4506c08b7b81f1da4d03313ea71e685e314eb09d69fa5eeeb5bcbad880e0dc7972d895a99c595daa01fec9af7678335b7537d171750a60c70f7bad757e9179f35b0ed212b48c7b89bd0555110ab5a805d48026c7176141be4c59d4176f5b7aa1b3fd9603c8602495098304b008894c3b249c118658c0787059ddedd2294d2c394f251ccd0e64098c8a331979338cc48f1fb217657793de91364c8b7568140c3862e860724126d4d31b45c56e7d3b120551afffaf04d2ce67a086a047e37fdca296aa54c2e7893fd44b81ea407383b0e97afff8ac509b6841b0af544fd32a8488b1ab9bda772a3660d06e18369ae2b1474a9ad9fff688046050b11b1db157436799bb997132c7ced0224b1492d206774a8da92eb7b52d3f75f5b1473ac774a9bbf0265018789e491ae6ca91b5fb0ccef2698fe64fbf6dc97b5226d4e3060af64a85317d5c780cb80fb8a5b1f70dcb01a6c0272a7c24b71a149f88abcb998fbbb76fa796b532f8d18c5906b976288058780eac53de960f836316a3d0a099a1db656e1297d99cd5d9fdde291a472a334b48d2e20e5bd1ca9819d1d26f3766c8ed38fe57ae619c2533d1ab75b968d16c88d762a7cf2dcb59cf5aafc556be32292e7a06588df62d51ad1b6896ca179fdf64617880dc50564a692208fd82c621ccb918eb45be5c715633c1544f72fb20d446ea0b95db47e316531f362776dcb04db5baf394663f1075d392da1a6f193ed0ef7af8eb2ce81a0e6434cb741f98f068c1952c8db03f14f53b4208e08d3eb8a74886986a4abea922659319c58f90822639fe6691175675b926e24430fc7d539cd2d046aa5f44bbf478857b01f67e2d17f192979a9675e368850464b629b97d1e3b1df75a43cc490daf2cab25dec1fec692b30bfbf4da0ec029165ebc66e31637f68eb07ab1c136e103d1bab052ce95941939865bbc62460dd0f29ff44a03d67d7d8660f1b956e94c041fa2def16be260bc5e38f80b1b6e735b14809236363b36f501d8ad921e6f05938b80fb1c5e4625a6d8f7f5408294bc04596621566e5587d4beed45ac81d92030801faf7802a5bc3273230fbe4aeacc01214f0c340cff60c3b4138d3071790841adf613c2f6d81e3c9c660b2c6c1c0931490e3f4408502e019b4555a9699c49625f93d1ff579681b82d1fd60738de647552d6a9573a234bc506392ee31a6b842aa2a5cef55b3d8e846727f1f8e9b8798afb97754144be0e57a55b68d9073b929b6dce2f94bd8ecddb128a951c0fc49aa3e491b941a391a4fdf89657e4a9d461aff5cc28755e3d55e5ee069e11ed5996544c18924353f0006f2d511f9db950e1a74b43d7b2091e013c9a48159116d77c70645347bcc15ab1f8e5d97a87963c2e5112b0f8860ab9f5953b9e3ca8f03c55f93db9d538c7ed30e3a4aeefc95126ba45f5c7c880cd31d94a1133c218e84d66bcaa800c6320c3e2000379b42b69ef800c07e95a268a44fc1da033765e2fcb512a631edda258abd1b9fb21fa4431bd2fa48b3a5c02c95ad5eb5a2d4bd5d72ad6ad087a1ea5a795122da5251ae4d2c54eb13ff39d1f521b7544f7f17324825edc41c69c34361ffa2082b7c0ce3c221808aea2080ab688b386cf4a302b02e81f916d57a97c495ef157021e770354d4fa8a11eb0f1b35d8e61c4740b7a98c6ee94c3b16432a24b96805afd735b29cecd529d1b046db4e5fcc67c4342c8986517c892a8ed99976cbb8f14edaa00db96f65e4970496f4118f76080cf32438bab62608594afc134535e4746144b84624f1b7c21f40d12d6e1e436a60fddc508d90d455baa57828a86e9963d10737df3c4e918aa03e98593773e1ae69bc57f612977e9739fc0683da1bc2dfb385b76571828a4f4cb37e5cf3213744beaf7f5a081e8603498aa5dba3c0469b21f2ab1911dcc02d5ee9635e33ffc4c7d26dd433185958fa0c601ea423c2ee1b47e8c9293ca4a610da5a4795a5b229a50644e6c2ac786da4f62cc10bdc1a1de4c980db10a66f3c1185334bed14758ef170b49a8e899c4fd9dc1f6ea02bc06cb35ac21073f11c5f8c30ff45e08620037f1c68e6098d862600bec31e9f0ecada94c188c07e4593e830f91b5042c250234ce6758de6084b56742834d57a0eeabaadba3b7067f39d8670aca2b53c3da0a6a4ad5546da150f6bf6dd856b4205025e78f2ee93c2772a48f841ae2dc52aa379012a1b678965fb7b7993c1910d12721430735ccfb1f32148f66446d8dc93f8e060e3857b56363d24276de56be5e6b9eafeb38c2c6311dc603ed03ce5b822507bdfa6e3e9d322d100e619fdf0a0f1f2e0ff56287824f8517309e192a6afe893d2add87188f937b4ed2984b362404e7035697ae549b63d8e16461e0203ff36068fd4f82b819ad5db0bb102ff0f29987113a82ae7acd381bf8f74f78d9493b7baeb072b499aec9b5858e35ecf49a8095ec43a5d0ff34d8b15bc28814d8cf136effaf4da7efae2a320b7f82f3ed73f9abe74d441bbf719425479c39f558310b93b078aa2a114f1052bd5f7a1d18188d45265fb568a6da4b163e9739f880bf41ef324a5b7586ef45ccb0933e12ff91e02271eaa4f299294ca29ad5bd4543448fb722419e8d85fec32c5d4fc7b18a0d1bd64bd275b02a4a8f6e92815d98a6c2dc0303f3f91e42392cf6c4c6dd22b7ad98209e12db588b5b49830dd2aa7fe2531fccc978de35a90fdc69b4b23319308be01c7329f3a74371a7b5e59fcf60511c00130ff57eb04c45e13d565ba8aacecdaae95e3ef8e0e5764610b4b6b4f1e34cbe9063bdd8615aa8995457bf44f1cd6deb676339adc971bd9a043cade7596d67db74a04d54d08ef52d8a46f58bbfe233840e9165f60eac0557b4a04c6b0935f6b9fae9f27ae0de1422d4d3f579646612025018d0742c107912ee4be03aa6787b15720d0ba6dc6c39307b5767a36befa80711d1c4658a5e30c0555020bbc265c8c62c13be98bb30a51dd619ef97fc1b054581c94abb3db4eeb31b828abd30dc795fbc5cbeb232969f86d64646d646d6577776dd76c6f29a50c560aa10bc10b0fe1ddfc3e2413abfe12abbe0d3e31016e8b747032fb1d299d45be74f274495ebda1df91d2676619f971f253bbf216f59c2ebca926c9efc0786a1f1cfb0901c77e7ee01dd325223df5d43b64d19dc93b7de539c01e78e0c14f5ff989a9f6e01e649def53a954aaec9a64499ec42e1dccd239ec05780bb3745e80c3489224c9f11b4292aeccd2798f7390593aefb92bef21edca5033933b05ed3a89c9ef4de7979fadd65b2ad5e7d76aa9ae524d575652f5f77cfba95479d3fc8973c62c9d3c42cf79cec17b6496919ef3bce73cef426f07a668ea2b0a3dcb4c69a2e957caf4078bf998668dd0731ff791834aeff9d4943502cfe7670e2a9de7b3c78ef7e0808303e0435af5e13da4bf77954899c9cf6f48eb3eb5c473f2d8aa0fd7cb67dc2abf453d4b57e9fa741129bfe3abaef36fc755980400bca93ec1f2bc844fb03dc7780fe91ed7c17b4873c0a3a46a9eefc04aaaeea15fd9c1a707f31efcebe02516b507dfa2eec08393a607df3af8fc8878906dd17b14a0a7036c8bb03503c3168d4d535ff41bd07059dfb668c7bbeb79d58777d627de9b66bd9b73b2ee5359a7ac7fdebd77d72bcb97f72bcbfb0d99deedb7d597779075d6bdd209abaee19d7da9b60c127bd234acfac9ae3cef3ed68575beafa63ae7f87bd3c92cbc7d43c877f3fb976d91cd822d1198bb6d11c5c1c1b14feee97df93dfb3ee707aab22c0fa0cbf7983f7c5e3eab3ee64b9c8780712e0407c12a3c278f0e28085497e5eb37a4a4a23f6cad1918f9da644533e7b75a7b685b547d50efe1e96d9aeac3747aabc6e5d23be40eddd976e8777660aa3dd54d78675f3c13563dc453d32529cfbb0bef98767d4348bc334dae5824f6cef2bca2d56ab57ab7034fdda94e9e85774cb3de596f07ab2c310e01d5f3cbf33965d94393ef4a2c3d015dbed1dff7bdc8d4df63bac41b53e0c3e551efaaa7c2adcf6f0a61ddca1dd00dc897787ba0c9fb58127b676157cec4d417cdbecc0f28ce7bd3c9fbea9ccfb9e773dea4ce794523a6c6aeebba8bdd531d8f8f3ef27862d31cbce9b6453bc3d9c15bdce004c0423d597753ac13e94c6f992e59e26ebaa4a2e9ba2e7fda1fdfebb56194b362349d3fea139a183db5327a6a45418484e0f343ff20601e01b8fb0feeaef19c3e78ce10707721784e9e2078ce202808544f22eda262e898ea03009f755f974a25243ba34d2ab56890acf27e91795f953759e67d33ed7c8841f7bc4c0f75e800bc7c86466fbaeba8e7da8876ee3a0ede318df34ef4bcaf087eabeb3cd5e93755de88be2165debe21b38bc9837210c7ddb60bd729ce55a7b75df4c086de16551fb34c0f6934bd3563d31499273fef8432a14214eaf41b92f36ef5f90dc9f7a965de992e4f9e7e476af955b993b11df32c271399b93cb9c2568c92aa77b22d238001f0fcf52acb6fdee7f3879c9955429087f00708b94f56c1e7421e4256010b90cf855c85101ee4f32700efa857c696c9ac185bc68ab1636c996dc7774278903f20841c8007f86421f948f446a285607ac7ce8e9d1d1e9f1f09d97bbebdc4357bbdb000cea38747009fdf9001e0caa5bee805803fbf213cf7a93bbe9377a677c84fbc7bbe5973de5d08abccac12825cc881825c481ec2527e68da0914e4422e240f553496873e488efd94795fcfb224f1eab39c391fad4a12ca07e0f8b6c8ea789965a4ea32cffada39eaf93e76a72ea1df815f3cf8852b9118fa93d5a079abcbb22c83265116a22b59f60934ada34b97724b972d5cba9438045497af59b2907f25c235cb7725d2f44aae59ea8b86c0ea329f40eba85dbacc777951fa89691d5bba10d51fd90f7dcdf2f3c5dd35064de96b0cd5c7ae68343da575680a05874a454ab582a6aab13f623ff45d96bfe3d3fed8591d66839c92ab9d1d590e4000b2ce8ebcafdec97995bfbc5ffa050b92f39973ded96f08758348d5e491e8158da3fa20f3a69a3c0de17bf3f9befad3fe08f2fdd2e56f7f087979ed83a7e5c165ce7947621a477dd1e750f29baea1a91bf7a942f0b43c41f02704d3e5e79032e7b4fee4785f919aa9999f2e28a5b4bee6e9a4479d7c895779f7e8f224de4080f43cfd864cd227d674f9f2e4499ca4ccfd4b3cf544e14ddef5f90d590100ef9c7e38ef764a15de54a34ee27d4d7e8537d5ab77252e3275f9ce7a3b78f5f92d60ea52f5af2c4b55def3ae7f44e6738ec2aa954645ab702c072b19e99dbc05413770ddc76ef5e572e5acbe68ebb688ce4daebe2fea2bafe37d92cf96c86edb2aef7b37496f9fbcccf964de24fd6d9d6e5b99f7d5ad56ebe0eb0583b5be81b430eb18db6f88ea1f9ff316de31dd3ace6a45561faabca9569dbabe37d4eb052bca5bc948abce7aa7c2240bdf175c15a5b6e8b4fcaefe3ef2aebc37f21e7954dee4771fbbc2ad9718e7243e323e27e7e4e0a971f0be4efd561facf2f4a4ea1bc27a1de9727e1ea340f5cc42e35b79c7f47816a67a54bdc4fb303dcbb22cb7124d934f7de22d04d3e4512a92fcea65b984288e729668d03c5196e52cbf0f4497dfaff21b567e0329bfb7f2e537597edec79618f5895327f1d4ab913cc1ea1185e71c3fc7fbd42163deea4bf4268ff8518b3fe5bdb5b4785316ef470fef63f73d5ca4e948bfec4d03e9519e58a847675fb2313e30dc9d559a953940a53344d1513a9118e14696263b3ca1bbd975f3cb324db34a2e2de25d4a37a8e16e6fdbc696a67d831aee68ab3ef08ce98d7e45e8577a86f790ce6277f2e0444d378ec4e56d4836d697a8ad6ed1114834d3fbd8f90dc9c61e4190ad2153efadb56d6cca4489218a14eb6172a3253c67f8f0340389bff96edb7df7819955c249cc2aa8e0e507882a98f27c62fe64794f349a52ede35e3a11adc88d2ccbadfa22c7d1cf1257cb5b08497d7d3523eab6ea63ce8f46a7d9d54ecadbbd5a3b0df3c4b1ec04b5d61cbab9a36d24d8cf46ca864cfa461a31a091028c2cce4c11c01275a001431565e0282a63b4065b3758a049d10317210cc801a0ac8192464b573f772811fa46d3cece4d278f22568f3f4cdc4d6abbb7bfec8f0bc4feb84562e79cf4368e0adb7489a6625be87eb8b899dea93e7a7a6462ce3431d3ab1f91ae7432a53abdfef5249e93c7bb0aa730aaab9834e2d6ef3b8ef896a7f4899ff6c7e9e3814e1ff31096fa6531ef0de83474cb53faa9db4ab4edf44a7d597b0ea2b87489b51fb0a3fae3da6736b3d9694421b1da135a180a02d55976c2736662f40690ecec5340f561bafd4efd81ba7d4ffd91bafdde34e9a4a7f00b856fe5e16eeba789c13ba6c15d9fd0f5f403df5151145f646a318b8f695dff85bfb18b95683acc5a18bac1771f0b7e99b55ce99bf4f2dcf6ddf0ded1a3de421ecd726bc94bed316aea21d1a35cea38fbe68ddeb67bb5ac9437125dea0e7080faaadce92908a36b9ff4878fe5a9f955b95cedbb8706525f350b117e7ed3f23cc0be79f313e60f342181c9fdee3dbc782c401704022fe6a179f0fbda376f7ee64fb8fd01de76fbe68df6d9b2bc495db72e6fd8be8485603e55bbb6d16ffb14ca23e4ccd042143adbb0d16834fad0b7c1f468b41ddc907899551aca3b4685552a95329077300f79a5bc4fb086defe71d9fca6f68ee013ec4669e858b0953c0eef0f68ee94d26f08573a87956442b04c01665c7b2eefd8856dfb7a6b178229c9f47652de99de5e7a02c645775f479fbcbaee5f47bfd16aa461bb6072e5882e66b88c41c483086cb4a0a2868716a2707397fc70461b1a5628030bee8c0f6a6c3813c68c1534ba70660210e5054ed64861e60d1c3bc074b0c2491b3480834b18311d560083c49b22226090028ca9468e30deb8610c1821d0e0be60b530a68a35558eb82245037898218a1b32d0a207388e488306151aa87993c5192f2ce084055ec8e145146b50e18aa074d144126fa05801050c53d43125082f60ac408c0caaaca1320693293738d1450c0546a4008618d424b164063b466c851994b8418c1632675430c5024dcc504710536eb8b2a40526a0b022860d0a8eb062db8c0153e5851796c8020e2e6650c6851ac8b0450b2aaa7031023351ba5851a68917da6cd125ca136268f142460b0f1e1d7264a901091f8e4863481115319871c1143d64a1c5971da218a3055c6610c70bb208838636596cf0820654a4fc7019e38b20d2488114504c2f9e54e1f2051d69d068824511689aa0a24c1a666e90c2de0082366368a942264a115570194c3041420739d63869011d4f6a28c289376eca5c11b301082f5a70e3041628c028136bf286056cca6ca143125848493db1c54b17265ce49062c2d1822a52d8cc91060ad680810f3b941103362908828a34648a60f384122e4879c3cc155b1119687c98628a0bc4a840c31858aee8824a1c6a5841071b450c81851330885a187346115ca66041cb1862b4f0400222b4a0230932494401870d443c8c91038c102cc85105114a2041658d342b204386a322c80835bed060090d4b80985700f1c4862a7e3043082fb1272838c3cc9a2ce890410fdc1455c6c0800a2765785183174e8c9e230b19195e900215bc31c190a68729339c11260a1040781163881cdcc0f005274507a0a001952c5ea01081c185098193247e00034d0d986033803333e0f2060b1b58c4a00443b09152854a0c57aa3031d144716286274ffc60c6164734994fe4a0c30bb668b1b2a57e9111b1a4873254a2f8b2860313b3018a1984c04225893438f0404f9c362265a44d08881eb31a0c21850066106521439b2a5954e18124aea8e109304914b1269341891b2e55a4608a306840c197a21798a1e202142f8071822b83c9972b56a8c20a270568430e31735461f243132e0abbc3048e406383933155c8c026b799a30c39caa8418a125e1c40c50a675a80c1153167705070808d1eaea8228932b0601385021aeb2c6f6cadcd28a554086332324dd36aadb4cd0674f6b1faa81a69ad1097925a341f33d3348df41aa36a232dcb42afcac3a8b3fbb419edabb6596bb3aa65999675c968ad36ab95a4de1dab9a1bde2e2931eef674cdaa96655a56b764d58e1bc902a1695996651ad5b22c0a4dbb7db5767b9666ab69b4d60ac66a9a66ada5dbd4320846ad44d3d6e67a667a282d28496e5bad359394be7aad3b0ac1b47dc5b4b596a4a4d14940baa8659a969190e828fbd48cea3336ab73c35ead34ab76f37ecce0d99cf633a8041beebe77ac3e328fa4b555b7d03962a10d969842a3a6bba53392ccb28c66d6041510afd7cc6686c1cc322bb2bbef1d77fe8efd5fdfa9afea59ba53ffaa3aab5cb66d948d46d9ddb63b1a8d32728599cd993ddbb467d9282b63e62de4d346b3256e62a171d4a2d336a0353b1a6d128f5996a710777b1a26bf80d212428d1a1136900204481b2d2391326e237d743b1a8d48588936d2469a0d22cb328de5ee4c238d60757692dd3c2554dfaa026d6acf344ddb485d52626842f38bcef2f62b3ca151d3fbb4b9542b6925adbd72238d0a79d40ded4ecdcb3608e266bff70292d651006b2d5b2dcbb489f5bc0e9a134f4d08eb2c672d64a34ccbe668ced1361a8d46a4111d8d5873f2d044cdc11c5ac685481ba12986ba1969236ebb3647799cdc6682d63ec2fba5474f8d7147a32b60ccf2c6251b6d5e7543d346a3d148bbda8e46cb8434f1beb69aa6e59d9d94b3cc53a2e92cb3f50c6d6adaad77476d84e95659e84854eb515f7394e96c34ba9661f5956531ed04b5da1fbab963a55a991f54bd6f57cac24b32e692ee5335d2b597d57ecb41f677dbcc327235e9775f3d569e6cc3be63989a65abd54b377748a339e7248d4e5d2e359369df5996d56b9af6595f549b948cd1e8d69273e66b9b565bd05540cf4f1236259a9e19cef20a667de9a38e033da7dd1fc0f3c7bdf51b8c3c496adbe936ca33a6b7973025cdba448aad1651461340cf324550d15d687137fa3c37b27b488fac9dd97764d617250de96c48ef7925b51ea10fc28ace4c26cda4a554b38c36a1f2ce50a8bc639a9af2164a6d297c3a651bcca09bb89baaa13393e984427d88753a3de7a80cd43aebac3c84429d72b26fb33f724e3fbb1c1cfb61b13025fa869cf0ac2f14901789036483b2b5f2e9947705347d9e96c795615b7457bd1c3a51795fed262db362abddbe22a96b63eadabb49c5e060050dc4a4d11d11d2c98b98fce9dde92653ea30fba37593e93ef687e92df1acd5fff993f37d4dcb556695c0baeb0fc8f973eecab90a3867bd5c2eec63794ecfc130cb737a0bc32c8fe92c9cca1b88368da72813ca64c2da47bcaf3e89a7d3298e69fba5dea5b0f60d31bd9b1f0a65c2acd34da71f31ebf4f1344d7d65cfc1acd3739ecfc2acd359ff7130eb749ce3b730eb9489501296dcf09b4261e58ca68c739637cc95b37b4a647fe064271c3cede9add373f0e92c7c3a0aa350f5f8e953bfa36ec2a88f780fe9f1149fee53517867da749aca5b7d9d4c26cc7dc4de292e89b7e0c71195778c48a37e3a7d339d7e39cbf49cc77e5857a5329226386f9d65ca3910eb3979084bea433899657aec47955339270fb532cb949134a15028d1633fac6cca2430b9bfebf929589eec1fc20294739c0f6101623de7435880f0596fe5212c40ade73c6482e5c9de3a4e1ec20284f3561eda80e5c972f2d0b4ac3c2442fe9e62bea79acf9f561ebf67514e86599ef1f387953fe32861fe34b909c7f43c21a9aff1282c348bec88b553d142ef216dfa76c23bd327caa24f9ee0bc95837170eca785633f3998fee064169e3fa713e66ec2dd7deca659f64b8378dbddb97b780fe92e2ba97ac4e58d6564744abf86aaa6c2bc3620f4814c77d5a34f680c27fb131df5c0ece9237cc20988944ad5d45dbc7bf425ba525f1a9e1487fa1ab299e99662a11d2dfe1c713725328917bfa38576347dea156fd328a3e1d2183c35a9576cba288a2613cef4fcc49c7afd8884bfbff8f4106fa11e5d3ae5d799bbe76bc9500a3406da248521325a7374f421c87179e44d350f235dadb5d2696463b1583110ef79b02ccb12f6f993dfa75291a76a4800a8e69cd587aba35fbe0bb72ccd3c176eb55c34682abae3bced1b92ff619d3ce45dc9fbb0cee747c64a5f916fc74b5f29eb5ce72bbfa354961f6de435b2fac82ff375f2de86903b77a48fc8fcb2eba539278f8cb7a8493bc9d7cd9bd587ebf3dfe737a495b7a7cbbd8d5083acc2a4630c003c92a4e020a589e69162c50dcd739e6bf145f77c534df29086872dbae73dff482670fc46af1b4b3c1cf09c6a1e1e1eaffa60ddfbc4df377d6a3d7d4328ced995b38ba31377f51bd2d1aff5f90d71b95c77b95c9b4a9577a6bf933e22e475e808f50da1da47847ccf3facba8f55e11e3a2350dd73da731f37c07d6a0bef93402eecc96bdbeee70ffb84c8f2d097b4c88f03d1424b7143ca162969a47ce9a837fa88944eba0e26cd637c1d3a14030184ae82000208200cc574b80f009f40846a011c04ee234ee72429e4dcf78e7adf67de9724ba93ac2ffac14b0cd26f00cff0318b08791effa7ce6f3dc885dca776744800f4633fc001329090eb3c14c2857cc8e7411efbe9aa2704b30ef09fcf9f20987580cc2a21c8f51f20e43f5985102ee43aab800528840bb90a3e0ff2f933bf00004008fe3ed5973ff3565fadcfcff5ede916f9d107804f18228083908900b9ce5d788b1a5f85b7a8b703009f40b5ce76fb41ce745ebace273ebece2dce3a3600f804aa0d90b7000ee4c754eb608ef50d6ab8dc17f33c2fd641071d7000e3e1e1c083f9cdcf6f48017a7a7adca7eea0a5effbbe1d7ae2fbd41e968acea07c444a779dc42e354553e29822a68727bad3bca9a3a3a3a38dbe51e783833c042ce44030790160aa31a6da12d92724796f2be7e707b9cf4d08927d6e82900f6855537a80410c5b8a6040b482596a52420110577ce0a20573cc10460cc2b4118122329ecce08933369c516b0a40dea4200292ea63ea5a9fa04b9800c2ca0604142fcc9bae32d1b57ec9b22cfbe144951a6220a68d3555645969052b6eb2d80a56bcc0859934cedc70e627cbb22cabafc9a3ce608519a0d1344dc3f16209346544e1851353344dd3344dcbd8d09ab6694dd3a28c1958504114747091f2a3699aa6e52de46952d5344dd3b4ecdb283b2d71a7c74216a586728c71c38515ecc084882c0645e21ce382186e9858710615363fd95f61ca8490c51631bc6185092e749498645a036bde18b102305ca0c50a995bed1857982d50aac862861c4f4a4bbe703c5c69a34c9b2c5268b1c4977a8615244c150c07c060011333e07883cd146f7e80c2630b2e56c006942948dc10c5fc3104112cb882284a193aac80cb0b68ae2c718619512657038e06567eb8d9115bb4c800c7982f28f8c9feaa224c142cdc5004c46b078b1d336666841564a089c116434ce1eab032c3098544175eb250d1c50e6b701126035364d1021cda18c3cb148e0e2b2f684aaa2803862d5358504588ec8b9222a028b2818633446ce698e3fe70c30413374051a60c932f4da630030b176811e344129c1c150b379c8f37d820e2428723dabc30d9682173861742c411c30d590e6b4604e0a2c50d992a4ac4b0e603bac21254e850b40415519a48c9bc84e1c5a2b821a3488d136fc0e030029b37bc98028c2c5e30828ba3ca179ade60091826a6a8e18d23ac48e2eeab6b19d924f3e40b29709c6122858c0d0e285622d8b2450d4b74d18415547c56b89bdcd9d9f99165d6c2a60b59da90418e2e57c888e1de304205176ab8a2831a2c48a9a29ed6f4b0a1396ed6a0c3cd0b4457a464635499b28034a4d84284a5093284a82e80d56a6d20c2cd0d3bbc691303181031031abe336a96cce00d17d66c41833036b429038e216a78e306333837aab8409a68ac443106942fd4a471e3031a267603155dd66879e3a5063098768836eab823e8f2831159c258e30817c4313fc84a526419509d686400eaec222820db6cad606a756dd104167040f1869a2d7ebc5891c38a1d68b8c24407cbb1c1b92923d6c58d135faa7c09c30929b610659001e58d175a300608c9a98ebb49275506942ec1e264adae154cd5546b19a0c842070f5f48f9e267933aeb224c1351ce2083a887ed4b962c59e127a381758129491051c0208ae205172dd431bc58a1a2e50b13177e3ab0e16e7f865f3aebf94efd517f6a6b7e60c1e8e8b5d77a2071ed35ea0488b6a78f46b01ed5c7f7d147b3248226755997755997755df71197b77bb71a50f82c7a3b0a9542dd8929a581a73b31e519a3416f17f32691e88ee11ef8e76e8a8475ddbbee7ebc93f0a6fbf140f763064a1d651af3b43c4e5226e8eca87c2d4fd66516ab84f1a7038d3f8d2727a69826ddd78584809c608b799564831b12e9a5d537d44d27c7974fa9cefac0771f160f6eaacd1befe68de2e7f5fe15f9b6ed5e92fc5faf0dd320eb8607df6d1b2cc3ea6b6eefb60c84935bf996e7fb86e91b92bcd7f2ccedd909ce5b1fde2ee21dbe3e01e3b67d07c57bdff016416f9fdb762f496edff74b6f5b6685f7f26615618599087d33b508dd875946c27f671509e73fef53c734d5f3fbef04e7add3eff74038e187e99b93131c134cd0de87f3d6bd139cdcca22686fc33bdcc67b787f17731224ee979f6d3968fccd41aa6f4240f4f689f7978580e83183790b01d1aad7b3529b8a445dfb9677994aa15028d4f61ddcbe83a8ed03c1d56af50dafb6d2b6711bb8b9f94ef5f799834e4ba5933e52e9a4fbd4eec31e89f4128837100d7ee22d829e273fed8fd4a7fd319afe924c8d2656ce2b55263538e67d0dfe94f74d79bf347831efd7cd1ba6c1879ba6e0ef6341dc7d92beef3b29efd2bf7bf523017c07669dd6f38170aee3c2e07f2739ae9cd3d2c138cfb8f565ef2d9c8f83757e8c9f835d9f78031921bf75273ac7c96f1d48e738cff90f0480efe4cc3fcf3b01409e96673ec66295f0e303e5dcf51fe769e79de45c673e77f53362b5f7ef1b01565fddbb7713b78eef04e7aed38f5542ebf840ade30c847357bee5e9ee3a3e90cef319307f9ae0ec44275fcbd33dcf6fe2ff40aee7e0ecc4f59c0cc4f2748fe916eeeee5a0d22dde42407429935eafde220029c55875558437fad66d253a1b651f9d8eb08fcd46d99780982e7d2b7ddb7476216f03425e89562fdd066a5caa6df5b873ef6ee5f492ea7beaa855d0bdd85d7cefc993f42dbaa329f889824b779f1f7d47c45feff725bcbdbdb1bc9c8098eebcfcd27decc5f720dedeebbf8717dfcf6f01577c4954a2ef471f09a57bde67f8793104311d6611b8b49759dd83c27befc27b0f43257a5e89167dece87e17f1160fe624485c317fbf39e87b9883c85f21310b79fa53bd94b790a7c9d7af50f697548dd77ef34ea150738e378d378da6f9fbee8e26d33b9257c226f1d73bc9f4d2bcf83b9aae9d647a695ef4f2d6aec46ad39ea593299f4e2fe153de5497ee2ddd7bbf956ea9b4811ae2a9163f7310e532cb88fdbcfd9c9cc8d9739d68cf71136f25e04d9ff54769cae1fc7d897decc5df27de42f744d19e13cf89a2288a197c884d9fd8fbc5dbd3f7367cd0bcf7f05e0e6f4a411459e283eee75946eee7bf87d90a79bacbdcebad4a74bd15f2340a545b9b77e8aa8263ec964b3525816a6aa5a39ef61da1dfde75dd3996eade573f710fcfddd373dc4b2e77b3d67e4650bf799f708d42a98f84e7381004c1312720a64df7dc41ee28bcc5cfab3e8e3c0e73aafb542e27412223c1f4f0dce82301fc154551ccac04c4b4f83bfe3e0c414c8f5904ae5d017dbf2ba0c387a36bdc35d543bcc3303f539dcb41aa8f39a83c77f10eb3124dab32587eae6ebf11a8913267f5c5caf756ab7bed92e45327efc17720a9691e171ed4b8fbf020a95de3ee43316f8d7e5fb0ebaebdbb4fe570078279771ae6ae1d7c8903b917299d3b6ccb658d407578aac3dffcbd967417d47d0be94742f7ad0b3148bf8d785f8f17f1ae801641306f97067f8fba79bb727270705a2d16ab2c572b9254a95229146a1c4f27934914ef0d4310fc3ecfebba5289e3542ad453784e1ea8bcb7d437e983f2accff901ea5bd39764e53dd2e057abbc47fa3e852f9977a6ef53e05118fc9c3e5007c1bc4f177f5f376fefe37dec88e7453cfa29bc77134681eaf0d967a4eaf0f41b8186dff2ee1e3ec420fd12109b558779531d8ab7f762ded7b7ea8bb77712f81057fd5d8339a83bdd5e56a2e92e6f9f257cf5feaec0102d43a3956446507a45c72f5d17f23073f5290fcdd9567d04d56b24d46b4a6c14976a4dab3e32abfd5ade4e4063b5d2383ad2cf6c624c8373d3cdf9c1d4b42ed3ba1e61eebc9d348b554ad948d2648d1b9a4843055eb08182284dce5c91a50c176b40008d31d24071051d6784b150c42ce638e3852b2f2451431217d044a1c10a141ace10124614175e680186346f646698c0092b548851c4182e4fa61a6cdcbc4143515111380cd145066aa0f1c49825aa14d1a10b296ce008430e2dd480634d151c5a58a20637dec820bb49628b14676048a3030f7484a1831639dc50c1951778e26061873698f0c043511b09a8c08a2d3364c172860c363a4b04b1021fd8400193367600b303176ba8986283932f30e0850c2ad89c71c40b66d634c08a9b1bc4c082891a57b834da343106161edc00c20c2a6228b1c5124c2c494206694c3abc3843060b186b5c918246ec08346d56b0a1ca1438a0a839c00a486ce1848b2229d0c0410819c24842062d4cc1028922b890499306073167e860c30d2c20024b0ad28892b3c40f31b40043182e9c099758230c174881628d33689409a2090f58e88832c50c2ada28a30e315ea210c343195aae00c38b398a00b3c64b1c4af8d0840c3b6031220a02aa00b3431b2d51ca5c91a60b30533081a589304ea220038438b648638c9a2996c84108357c88b2c5104e8051420558b47821c51318961823f6031b62e850470e5288a4d829688421c38834825801872652b00ca1c60f5ee67062cc14265e9851c30d166400610327c60b64c810f1c395175cf102874689992caa6c014208354ca4b8b1a40536687250011847f840650829722083a50828c26883821ade30f1618d36521083306328a1021a50c1c5182ea6c476f0c24d1c65e010dbe685e3b6ed1e988fa32ba48d95dbf2be776a1f85c6eae64fa8bca7ba9325c781e03f145ce0c35173dc0d7fb951ec4450e48474f8d14702f71b8ebfe316d2f75b48ef5104f106c12c3466620eea6eca41df8885460dfe8ebae3f2161af5077ea793e7799ec7712a954af5c428743fab8f8b0285c66ddc467d2fb8e9ef7bd4df28346a14e847056cdb924ccba38db692075e8dfc2b091224b05a4313dc4954cdcc331d4c82f3d6bd24f9bf5e4038799bc451dcb67bffd72b4c82f316104e0b896914c7f1620e52994652f579564a45a2ca540a8542a14ea8d56ab56aa2054bd2f23c1007a8751ca009b33c303476554327ba2c054d0aaaa7fab4493f81a483ea297d0862babebbdeaf7a7a57bec320088260a7711cc7e1ef25f1332b951e86a1c695b8d26f697b88bf833dfa1b5292ba9f46d3fde4c8ca9d722a43e5fdd2197716d6be24acb7deb56aeba58ef53a65d20d4316789f3a8ee38b4c3d3ea64f9884770534c984c7d34be2e747b22149bce176107f39c37803698ecb5ba867db9937a41ea6aa5e0e5d6e0be7e37fd65dcff9ac3ef077a673ba2ec4f52a8cf2b4f98d803a9d4ea7132b497755deac3a359056fd9437903ebdcba1ca8620185640772250afd6632e449ba7c2a8771dfd8c9cae5a5df5f91de91e26e9d1a88aaa281285caac550eaf3aea5d06394ee4448ebb8f0ddfe9904051fcf7e97c9ee889a27873a67a473d1d3c7fe6c7d5f9e363499f02582f1fe27ad227423dea21f64efa164035eb1ddeab7b3909127795857ab2d71cc47a9983f05759a847b3f2acaf1f95b7508fc6237c4670ceeaebf9ae9c9c5a71703e1e67f56e85537e45965fe194e4ea75d56ab55aabd56ab55a75b9a4d75ac56dfb88641f90f546aa526555187a63188418bd7a4d9dc4bb4703e972b5cafba557af37d5bc5f3b3bab564baf4ea77c1426f56a8f57ad56afaa8cfa09b5ba69f5597fe4a33eeb8f55def7e54dcf78561e53f63e5fe2d12ff69ee23e237504faedd96744fc9669927c9d773a231dd6bf775953a9b22a0c555ba8478bff2ce91b01285fe73eb5d3a93a37e1ede9ef5dc6b73cf43bb2cab3be2a4ac43ba6c577d6cb78fec4f46a952ab189c4aacfafa24ee298ae2ad453a8a3f0bd884713de40f44742d5e0c52bd493f56814a8ab665878c9bf26927b49f27fbd605b782f49dadfbe5e17098c0a2cabe202145ce243d8bd24f9bf5e61188aa129bc17c9b6916418c26021120d7e23d1f7d705ad160c0683c16048604c64d946d2b2a111a556702979a6931f59a078b04c3dccfb844ca380a3516202621a959394b9dfbb83ff70973299c404c474f7520862facb2270e92e975e3289265369628de5387adec93b799ee79d3ccff3b87c6ed45a6badb5d6aac4775abd2bc5879d884dbf1e4a7cdd7bef288a1745d5bd07b7ed5e9214474f545deff365e79d565df77ddfa7c4cb042deeec80a9ab5419f5d41ef52541f0f7de595f184ca5f27eddfb20b6b3f01fd29682ce8e9030166df2f8c01a2de34b9deaa9f2b43a99c4ccf49d4c2f0d89dfe9fb6eca412bf1f356aaae4375a8aeeb3a54d7756397c771dc362da69f4e79673abcc843cc3bd35ee871dc263ecc223e81bed1e1e4b13dedb5c9329d91f2b41fa510d3283da249c9e49dfca90451074754cdf4bb7fb903bba3f0fe3aaff33a1035a46ff8bdfbd4435ff86e68e8eb3c54d59df72e07791773d0f89292ea81f3e5a934ae4a7993a753189a4c4fdd149ab4124e815d093469a52e6f8d865a09abc2300cc3f008d03b054f0f8221c77ddfe78545bebcabfe3e1ec4f7a2c08b4789df4d3ffd7a7734ddf42f4849d5a68c02d521c77d473e31337249dfc39cd597f76d2575de6d88a41f197b2d693713f46834daec56b2236d03f1b4af2cd60d23baefaa32e4b8cd1b517069d3c1bb6df792e42f82bff75ef186a1097bbbf79bbcf715829816b3085cfa661334f86d820e1fdef0250abd5eaff2ebbaae33c2f33c96e7791e088220eb7a1ebede3def050b57d0cec27fb22329e8d1b551563db02958add22bb070a65359fa0d4ba5939b377e76f41d29597de41e38c1f22258fe1ebcdf4bbf78a7a02f4b7c296fd691ee60e9a1912e3c984b9f3a051d7660f912dea57f390912b794c3f2600e2a2fe620f2a510ef9b95585d7ab3543a9dc6d3783a95f0693c9d5e3a954aa6533695b0a9542a914a252c1cc7711cc771dc9682663de4386edbb66dab2f6e92f0d523bc5388432ba964f55a7098cebe8e441a8d90e857e93e497812deb091dd46254b0291885d1231df9ce4035a3b2c464508e6d58c8822ca73a98fa8b3aeeac2df87d8740f832417fb6d66dee9a0e960c812c3d74b7b9ee779a6cc1271805c39393c788ffb096f3144dd14a23c1312efe07e852117869925fee6cd62854fd23ace93b89e730fe6cd12332bcc25b48e73a0569e1607c8953fa0c1e77c00890651bfa873390875530e22cf09c1749885601ae5cd772a729562a9549e97fa98fa981abdd4388e77f452e3e8ddd12bc75c96a55784e7ddbc63fa1ec41ede48b4e7b16c49a64693b5e071be7b780bc12e4d92c4c3c1396f61178c5502ce730e8473a096e7b14ac839ce8172be037d30ba04096c556f9a7f8eb65d01ad4d6d6a539b9f73765bdea426a7e7a344b3410c3104dd3b9ad4d2a45193b2fa639b9eb66df7922489923eba67356f2b69e7b2f62dab3cda2729cf9709af52b56dc084e0544775a9972757e0ef416f65adb5d65a6bed78ef74efa3efc83d78c474f16018b24ed98809bcf7f03e16dc2098ba08a6ee53b91c9e7e4d08ef8120086696e917bca66c04ccf7539ba03d30f58bf7fd292741e2de9c3a9783521773d00ac4422fcdddc3fb66a1974e6516b9ea542549866146a98e52a13c150a85ba07a2c2df7b2a142afc0551de43ef43e5effbc27b9ee7799e10f754df87f46178bbbb8121de26e8305c7db33f5a27c7f02953f831bc6943e57dbd9ff2263defadef21de422ff0de7b2f068fdc7bc57b78bf8c8417b38fbdb86aefbeea4be835cb642f4ac326b3d5cdda75590871ec586bed9c482acc67a4913aea51da5124d507f81ffaf2b65cfa9d6d1e942d3a3b85f2458346403289eaa46a16a5f2d078d40fcd19142df4fc866ce1e9e1efbd2008bec8d46005343de14df5e9844d9f1f0d7fc2314d4de1c530049fa4ccdd31224d8566d1fdf2def6edeee81ce9c7f64331acbe46b16e44d9a9bcd9260f7b25b4cc9d64a4a0d1dbd3d60a791b373fa831dc1674429776f498c27067911428221cfb16f120033d8ba43cd1f358e84fcf221eb668fa0b74f494cb269d3ccc644b749923d8686e056cea0b658ec0c1a46791182d253dcbe820263bf53c4c569eecf403c6ddd7d97baa8f7d7a551fd9bf537d6ca1acebed075b874369c7485dd7bdc8ac1d67b597ac0d7403ed9b964d0f6699688fcd0365f45a1e1a8aa5d1213141fb03b26b9a0af45966d9f96331f98c84f9880003526b5dd3cd49661cddc0d41c973b406a9a8348a7a739d3e8b710a9b98f48d9d6d2dbb67d7e43c2cddc0152ef0de82c07d1731bd05c1622a777b9ec1d895befd27523e14dd28f8448ed491732f490430bd480210540945800e2cba90406882c6d3cf1069a2bc04cf988987c2183e8861e6230c249a64dd87286182cb461c64a141ff470f75c439396a79611038824ba4a9190e142881cacc4a1468e589f8ca8944b98a80329c9985623230000008315003020100a864382c17838914435940f140012899a42624417c7635192a33090018618820c21c610408831648686846c015569737354042fe1e6dae4987104d3b641bc0b7974dbc693e3b5c3ea9e30b56da0d73d993d4637db526277e57d01046b3b7a8819cb4e9784c70ac8241d4aed948179b189ef4b8630997d881927fbf473188d691f53264fa223836e61deb83f80721bcf53491c53fc8408e2c093d652959b57ef71a87f2b6e6dc89ec1d6741148be591ad332790bab2b01dfa1c85d024b3d69663c438cde5dad8e207dab036c159e81402266fabd5b3ce3fc2d5dc69e17bcee05bd1e7d847ef4df4dc56729523ea38987f6c0b9e9440ee76fa50f8f7302b710b5862449a97abba262f591a9af2dd89448d2c76c464b88ce7896c2548790fa9a04a4b87a23ee34e308ce90db3a37339b1f038ffcd21a6f3e7702bc187489b2a06224fd05a8debde37b84641c3f7f9c7665e231471cf79bb857fe2d95137beb877dc7049639110ea0657073c8c35c31a0bfa84ae043868be1b2d9ddef15f88328c85125782744683593010141c7449c741d4fb272ac39133a0706e3d2c342263b3b1ddfe65e657342e916f356f6992ae04e7684a0601b7083e3b07746494870b6a677d0ed22ba7678c44ea02bb2c66a52023786891273ef9c402068d276024bda5bb03c25700a2fdb4fe8daf184edd6ab7a02f45157203b236cd724c49e7096c83f93b7639fdc3970380f45287011d47387fdbb0372de5dc7f6697f420180ce2188e0554d0b458df0efd57f940f8a854d3b9298be02e320b724249fb82c24dc95a652875f2900e530344a79e604fd8d381eb8cca928800b83e7a78e95e7ced5a4d0fe197ea960bc1ef1f693db783c2e942b0d8d223cdfb2ea0456723c0511411bc2d1eee876ff50f99587b42a8bc8d857f0cd1d82d3d613339318749fb26310ab8ac6dcff6588d338d20eeadad04e7a36abc3afd8b333664f4d654bfa87e36d06ab69ab995a3990e863596c879f252aed27ede483f431797e0f08fb55697333b1a32ff2ed9f60c24a4c6e8ff3526c8a13855b64e0a3d1016f869016103dfc10ba1b403f28ed3290dc0a37ac51620a305d5aa15444e8972182d3ec2ba534246aa9273cd7f9b18b6df2dc01ee5f775d8e98291874e9fab7484b82f2a5ed368c685b27aab4e3b12478e2268db54c117520eeb52c2af9939bc87ce3305ce75e80b432480afeb2cc714840bfcb28a17b315e7bda0edc65acb82c387638ffede75e8e83da7c16c7cc5233128392398b62cd78923f0e8a8eb17f980b7918562f33c3ebfe989cae3e75b5d360df2dd1a5726bddf342398e43526981f5970df95c0affc4864fac8f31a678d149cb8cb51e562f076ce279fa8180b2ebdb130844983cd5c698240b648078936127c52d39f8f6d5277c622a06f33a16475a4acbb17d4676fde809977e5ff52c112879b18afc78e6544518614e6f05024b44f625c2c08434535a702fd835c965339ef764b9aeb66ecf66d8cc754e21d4b450a0f9a01e6b2607ac8b54b0cbc4c9a1bd95b8ad8880bca484b9bcf8c875058666d83f0cd6973148677b2eac6591f9e46b70a46d750af5f12320607292e2815267ee28c1560e34a6421abf021dbb560b410bb1a150a3cf6be47e0ae311602c58ee668d4a49993a7216e401a55255d7e1ccf8577d8b57edc1630082a345d9e53b34af3c3029bb7cd54b360ad9ddd6733e9263ccfbdeb5bf44645e26cb500d9c9ba0bff273ad9d66383341ce634d304e5ef6e7faad372c0e7915a3f7e2ff5cfa9877ae9b55ea163c1b574054668781856e95c5756dd73a5e11c0b43108aca21e818a26998ccf6ead956da3a152fb5aefe4ac106e1e754c59cf6f7d00172a3a147d37def47b5e0ebf07f960b93d9e0c3e80b5c096236096a3d89461bef64b7a65b8f1495c8a3abd811e58ef5eb1bfa57e90da95fb886bb649ef11bc98125b84685bbc36397ba836cf219c07800818daec5ba00ffc66358183a1236e303f2377def5428685a9762de41ac31d2d77c2b2a5405efb145574dc05a443f62015baa6354b0c997e4101d5fdede76022d79377597c34b3f327cc52168dea75fe0cc6b54eae5c5cf501f3808dcc2ea106e982fc97202f73470fb1ed0be1b5ece80bfee05800634c43ce86c1be95b5aea8e31b9b6bb5b708c38ac5be80857d162ee5c0cf271a817d3a2e033587d091ff5bdb977d2f54503f297ac01493e7a59d990dfe5c4a2fde91e6b28305fd68da2d5e6f4422225ff90dbbbf64226b5c010ed8bda03eee8d2851aade2a1adaaeb52c351da077255dcfdf2d591bdb638f7f6f78bc2ba98757baa639d03abd87a14b7016427e30d24fb7d9d56c70fe319ff42c7cc829e98ca7ec136fb6e3629d8c2e0cf95ecf0d2e2c693eeea5b41c779f70320725c125b2effbfca2a47caaa6bd2466e2a2269e5f0a1824c65ac2706642c0cc84c9e154f421024113bc3bbbd1d2d44ce85a563b16ece9e6c52575e69a7007e5878b5b8e32d33a8ad374902156eedf6c2cbefd6f4973b07172e9272e6cbb0dabdbaa39791190043d5129a54d49d725889b3d25537504a666eed02b4cb391eeefb2dd374e752bb5437896d12fd5228e0ea81b8a580af79f0ee7dcb41da2b4b122fda0a488ad1c1d6ea3cba560990e662d2e86cc53a4e6c7dfa873108295b1711de275ae1120f5ec8b553ebbd9cd0a22be76c46448ffe0c64de64bb66358ae402bd7ddef9aa2bd0f322a178513b421558db1039ba9bdf13fb454cf47966ad7c022b48c2b9729888d43436a04e980a3e908d496343c3ba4266329c8ee095ebfd331e62a1e5295813774c9bdbe97a3b2d01b50e66d48bf0945d3035cfeafcdc1de791cf666eddb087a92b26f40ee2d92098cdef0e506545f4afad86a6a0589ab4849d29f5aeeb240f0134660163837c53350604d770816f2d8178a047a318a5f19ca9bfda9518774c61785d0d7c84c0543c11568806ce7b1041e212780aa891e2d73c19d89f3a260cb3f97fb0fb5574a7f97f5aede619fad2e6b947b3e714d15ddab74b5eaa58686a539babf19439e17f778af5e3850348d218b49b7e3a3be013ef92076a11432f2dc807163762cdf70bfa74b17b770da5f5d68cb27953da090a1e96a4d20e1fd3b4cc2611cfc0ae1cc57b8fce2957db384581b8306b494c903f015eaf9bdf27684d4016b4b39992ef7ce8ef90dec1321dda2e1e9b33b1ea52c426347ccede0441fcd715d219464dfc10c6a2f3ef82046d7ff36f83ad66008c328cde0b1136e30954e0c255eb09b3c67f0d8c8efd429f10a3641eee0d751fa08529c206fb3ac858ec94021807c82abf186be8e39cd3838a782ce3811e5f56188f6bcc476a2f731507cb018cefa44376fb089f38816b1ad70b3d1b606ec93b1c84499a554a44c0112be88af6bec763c1f6c0f40415d84ebbf1e6b3010765e5b31fb4cc0ebd92d7c0a6e40db42a8ccfc0b9204c7f0a2adf2c67368100ae3ab7a52b6cef5e60039441ab5ce394c3deccc2178244a33daacfd304a0887807523d090432043140107b64baafacd1c47c41e248f7f772c8f9071ac6af8b14badc281430a41f94b3870a184a0128908079e5a0832dff4c6c1aac70e07a6050e89f86245d7099f277fa8137779b8c9f081df6410f1c7b77c3bb240fc7c1e3e72cb71fc160ebcb841fc9c30194b7fe33307c28111e67338422833a0bacc5610703b26a58e6055e9b96e673f9ae18c456d971eb47c85691cf0ed400075047f650641aa35eb420a2b4968397d6473ae9254bcfe72dbece501e50231050825b1caa39e5eb987203017dd12ea5791e904d625eb20a4d4bad5a63e499065479fb85f80d8fcea8880ffa9c1d5fb67e5c201543d9a8725de0e3bcc6a9a63426cce713223f37086e6e08e0e065821e46c6c4de3d23c56f8d5b51b1311b24691a6a3772b6996ce27721120e8cf801899a12f73198fc32443a374cb01f86aeadf8287004b4aa1b5a5c119321c0cfd144e9f7a56b50f5fe7c6d960a30dcd997b306c0dd6211812fdc476a4058dcfa173bbb0d22ad08581290c7c2de8837c4783507867cd3494e3c0208cf882d27d3e95f3f975bb0706f58ee69fa917d11a039b9b7a0d9cd3ed67a4ffa7bc1597802ebe77d0812f3008409e36ee04b427f119676e9a9f805851881dc944d65f6fc308caa7369e6c647e853b5cb0f4514d45bd86037ff2ea51592015e091f235026d2123d3de35a272d72ae9b970feb00c67a3d229e21805e0d2225ac1db97bca222d89bc009c910866de5170cc81412f730aa29ac4cfad527a623a5a0b3619ce7935bc856559787b0d885cc6580c43eb4518c1b707ffa4c47b27999894ace9e9cf03ae3f221b5c6b9ccbaf9cd7073648844fb1bc3984d0fd7b7105da778491db8e3a66ba45a6df0a46a3225dfec1ecdc42aebc07cabf605eb7d7cd372c79026331c124daf4147a2e59d487f15c1f09400ceed006379f39f3885e7975cf1fd9df6384bf121f320c89fd384f845ae34053bcfed69aee4d7949d113c4eaf35d4cb3d3aa69d47b95009e90810d8a66b70f3d8f6d6e855e9eb9b3f8289b90cec0c7bf5cd973a21458939f7bcfa4438dd415ac1e532ed45c4d2112b0080bb7fbe1ffa444f4350556de2cd8107fa7f0f2398b33a68dc18e3660d3716a55620cfce4faef47ef4d2e49a9b0143834fc24c28a3d1416bbe00c20d8dcb06932d609e097bfbaac172d5d8affa049f4a1ce71d34acce048632f84f992251f58f35a70e41f996e134acae24e80d970a61623691d0fcc786f98891688c589f8dcf1f373b1d10a17c3d6c890223f06ac05da386eaa073f23fd0c826cb7db68cd07e0946a4c93f8c4c3648165cba4d5dbc2fb8becb64eae61f53169361097ca84a73705d8bb4b758ca60347192b205297cb0d88e1d3b4b86999a6556c950868a7546c12a7b1d9b4901cae2d3694a709288d1bd1a2d24f3e8f3cd6c339ea8c1e496b9b0e28185c369da1b339a8845739ea6d593417c9a2e08e8a0b4e0bf303049f7c074d8406f1bb1a7c33a7997319439327d8e40eef12ee46ce140519bb1f8e9ccf16db3559f785054d27412bc6ab192e10ce4327253753a2de5d96bc1830ffd512dff11f3d8906e622bab21d365e57b97d03c71bbdc0da17f3a3cbaa86bd452c7ba216c760c935a103b78142bb196eaf4ec6150cda97f0fb35a3e4cbabc5c5f1f46a3c31b093f8c6a7cb4c7554264e92d04e6e19d0f73d38d388f18c687bb254f10adc3c916e64c22551c49b356b26ea1ba1a5e696fd80d8191d11bde72d41dd2bdfb62aba68ca01290b3e7c48fe5d2d04161038eca599c9787c31a64807be94e6aa1f220bb84225db936b0d52ea2d90e6f6f316a58532a868ea22a84ee488f04315fc3c0e06e70e80c110c2554a67b8cea3a05482e49766a15c16ad019dc524ccd219d5270600e97153950799d230122d83b20ab90fbb4474fdd5b40f45bb3f7197b416f433ec4355dafdbc945ecbc513148ffd62daddd3772202c7cdaf236c943f50716d5291e8e995b3351a7445c4893886f46e2d2e3fcb55d2b38675cf7352e668a7bf4c10af1ad6071ea4c049ff45167c9d3dbc0e239ff93fbd107c6e679fb9901c660569b62afdd07d7103570dd38fb5bacf462017a1c41da201a351d03050f16863f915956678c5ac05be3d2e603065864a3f69f27445564db1b1cb29902bbac944b8f2e78abe8240bba6fbe3213677d8a80fbc615e2830a802e6ce9c4f3c598fe6dd2d249bde87bf1ad22b60ac4c7bd3fb64d6dadc744758f74429826ce129444c28044437bf19240c3510697ff9c9fdf460b6ea55d382a1c1377b9e731377154c778e22722c482d49dfbf79415ac4dad975f4ca6fcf7e0032122be369921bb228a589d83cc421485ae08b38059eed2fc7fa9fa5184b5760fd24021db2f6cec9719e7105276b9aad901a54a3d9cb1d1ee85051bd6d90baa2be210866b596e2db4158eaedd9b83f00903a50fb532d550d7e24fec28e0bc7874fea93d48dac3c20eaa3bbea4f56dd218a682b9ddb38cb1f6124d353644d00717e48260c614604ab737a1b566c1ff08fffe32f3e60746a505d08b0735690a5d8ebcccec3469d767002f677471b8cb345054c9fe7592029134f97ad3a32cb4eccf2c289871d11c125d87b51480ea41e9827f28a6e78f1844e6aaa2e19c5193af30ae39cc3367f216e095ea96639e439273b8fc38588598b7005e4ac7982987e2a534388fbbbee4b8f5267ea290b91fcac098ed61254019054227c069d4c6e6557cbc698a43494bf34999dce548c10fe3022ac1ba87ca3ba6b77c43112d3427b78805415dbdd8cfc16046b6b74d7053e32f725914fb17710689373a6a0ba790113c38dd99c47106867c79cd737df54e6f35bbb7d8b3a1c5180c95f2ac54ad3af0d11b12f6d68c2f23a0c43a62c5b72e3aa25da1bbc231c7c514af49d3c9fd54f9312b1c9dbe455266e096a264373b9f517958136850441e3b944883b2518d1dca2d68fc8c9811a5abdb777b851dc940358d8e63e3d4ba910cc4f578a1455f8ef59a713820d5b2eba38730855813ccae461a3d83161155b9dde24c8c06695cc34044e4986674aa72d6490ec6e60d6bf1db534d0c2d4cc88d9d98c44aa4d242ad53e6456acb8495027a251687ebf943a95e6b59ceb9e9a030cac5058daff6e533ccdcd466ed24bea7e739d01ba78a62c093580552e38865cde4ec76e43dbe10e055c0437ee2079aaaf83203d8b8cf0b142ca372de7d6cc031c58a131412a03c01ff7c715776ba1c3d64f75b77257a5bcfc20a887027a80ec33e8f6faeee9434928889929a5302b0fa79e4096b6814b807c817723d06ccc808e5de8a6ae4de072def9d008f77c91696d032dc5376ada94f115c16b4d095752eaeb533caeaffeb11b42411d69da55b38a35617c0ee8a1f27e94d5bb7d74c292665a4024e8a3e9ce0f9d6a9b0fa0522eccbf106da5be852bba9400213dc8b1099d317b01d8eb5ecb8beed94af616b44a1085fd4f63aeecf0c840db1d0fd51d1bc3bf6ac21bc4f1077a22fdc50fec98c9cbd14d0985605b6653a64fa0cb3dc3e983dbe84284f8c90dcc81b83439956c86c517c8b36bb76f2025c1070bfd315e39d68c20be64a3ab239d4a4fd367633cb36614d48435eda8606e72c9c2f9c18ee50adcc5811082affd8aaa55f4bb69669985a72e6808bb31a679787874734af33b8a682a8b1259c6bfd859186dbdec2b845143a9ee41e2e97e02e6834638b3bcdb37972526c60fc327da3f04d42a0c2c22f0876031a803bda6d408ada272613e59fd8939c3f986815ced89ad7247ff5d59c089ebc14ced331a1535385ccda96bd9a82c8ea043ea43aba6fa6d11a9069cad2af62b508eacdeda1ce7b11a69fa25502c74a3497ce984f459bc7651d721dced10f34f8c94d4cebdfe0930c2dfd1883d02e9083abcd6b700228df6ef0ab3223ca5b1224ce0a4407b48270df5c811b253d53790da64267c59e9fc757602b24034c854ea0614b258f2a2416d9c0538e393c2bd15c1f9942214c2a8d36578d370358a941d7572f95c5cf952cb98863533bbecce26b249974ef1afc3f882ef99bc84e0b9cec42578c8d8c81193b2905947d45784f651db73794d40c84f392eb6d503cca5d48c28476d502ba5b2307ca5c320d41a8285a5aa748f2e19096882ff4f041ba82fca171e49f020244b11cc450f8d061e96ba2ed88556ab9506c8f9e74386ba5e3304a390f60cfeff72d478e10d276e85ec1a9ee41983a6fef7ac4aa8c6a593c66676d5d322bf93d3dad087905af36bcbf2939778ea5b247ac24133ef45ec718a1a9de25b75ebabf672aa941153f7f883cd156fc05f26cd121cbb4d3af94a73721cfbd672bf3e4a9ea8738303adcafda6772382ea7355ae288f438391871ad9cf4249ef041d784f2103ea615de383b744c3fb85178d556c61d22ffdd9092e188ebb3180606a5494bb23d73047f48d55dd7705bbb7971b916a5ca322cf588446a8e39bc71c3ec1241cbc387bee3aa8809e8ef7a1b3132cf02e5111e5ac96ae2e204c31accfe4f0561e8fe23a8ca26336ea089af0353d732dc9be5b0a8a7b8a663cd98626886980229608217c324145efc45cc226e8fbdb97713b3c4922604fcb144520268212b2632b54b42812b04d8a32da47f5ba19b9020cec7adeb091f31298fd91f1116f1251f244d828496295f88fb543889b0f214180cc21a832566e9a52ed9f1bff3df87e8e558569cff58a9e4f707fc1726454fdd2d89addd6841443afa72481c466de93726949cea044188da6ccea844ac031c8bb2f579a47e52d5e79bea2472a23a992eb33ed7f62079512b56dc84f663fe88bff5fbca2f0445f398a4a11499df2a9a51d18238d47df0276911fe0fae0b97898ace0977c79a6af666ae9de076fd2a5d6b10b0dc32b22279e43e347938311b5e757416a68b468b828b19e7e542f1f1148f5be5cd23d24a7f9f228024bb4113406792c08f7dfb2f9feafaad9895ec671b1f1c3bddc5a9ddbb628f5c67d02c3e7c384ea31166cc16fb28d188363326d9a14d7a444ccd242ebc0181be10ac97933da48dfc53e05530a38fbe2bc4cac15cddc9843ab6eb25764cd4f7050108a568599e08a8b362cfc1d2d2b7bf63e7f5e14bd6f8291776738099a9452341474f5b482692521392ab4a4cb9fe274e3161fd383e0e605f958c400cb165c9c88427d0b4a823b66b32975e436cad6f9a422b449360368d77b32417bb9f0cb963e2ee4760c38c71d6ba3380be83fb09c7a3103741cbbea2577a5379b3eeb7b6d7d9399775237373e596785a15cb6ffe6fa7eec938e19a1cb342fcedb616386a272497fbe22850485c92eccea0a3c8507a81ab70b8538ed54e95cfdf0c22dfcc076803f786b3bb9b4f6effaa623d036fe22a7af9886e95134ebddb63897cd8ce711332063ad01fe3d66106f5e0523d619112ff6880e29acb1d9fdfc4b72e8e6a3229cff9a7980c12ef945312f0a346f75893bdb412074165670be3fdeddf67962c6e0feb3a9a39b8fde831642400e9ca93e66bf902e91a763ef7c5fdbb4410bcc090aee3d71af1d417460376f4405cecf01bdbab37c4444a31c1388276a513269d7d611d7d9c8d308c7c8e18ee022d1ed3d0eddafe0be2eeb7da66fbc23a1edd943abb1d25a2407b246ad3b9ec0e5cd87e287558e509e3b00ebea1a99536300a3b60f92fb3a92fef2e7ed7c4cb87a6e241ed3a70d40ebcf0ece60a7f5e2ba47e09950f32f30764b793233f21d7d8634093847ac66b0c87d434264dbd072f45cc732014df9b24249cef8a28ed22f9932409eb65647653d2a3acb745017a4ee6071d642dff4526c7740d1b0b35a890a9347cdc0b72e27ebe9df4d3f417a8a7cd44e3fd7136495c893bf9f3f307f52087d8565700e216b519b2d421841d73f3c97c7a51c54f73253de0915b166ae1a1fe6129846e4b960a92a16807ef682e50d01f60f924cd67e584ad01807a800e5f5d05b949bfc82c4664b44896dca268d62e966f86ccab25c96f9451fa5f427a7af229d6b5512e03e2a87727b7a081c82514e3c1bdc55e3195f94881d22168330f0ec4130173fe925da4930e586ec42d7b55d960e000d43a5984e0b166337e5efbe96c1730f69440c6916ad32464a73d4927f0e1b89e5baefa12880417f63f68de89165aad6d95af003fb9fd3748e1bd76846143a6c3518650bdb27966f85b85b928bab48465c1a309d5c0b9bca4f90b21b2cec0321cc4cf6e68d0f827334d0a8ae4e1e9dcfba758ea70602e312188ccb39241dd75f30cff216de87f3e0d09e2f5fa19c42e0cf244c349e84ac463efc04e53553d4c1237173a7929ec75cb0dcef9955ad545ee48605e94b99e93bd7c3dfaae03a3de150a4fc60068f8ad728404622775023f32a3cfe6fafa7014fba47b0f0d0df3c71404ad368870409ce38e4fdb195507b9f3cfa6a4f97fb83d038143c8970f1ecbb9cdbecba1205ac2f2a686ab990ed78be27ca3d22b382710305f5685bc0b5c95bdb81153456f0c9bdfcdf46fdf4277adcc9739590cfbee13cf103fe4fe3c0a161a28b4dd9aeadee39fd5331c5d65fb5f49bd09f43c6e656b1cb0b7ba9c76e10e72c6dbd577b03baf8f2cda092381907021d9cf7f4228f728bdbde26322cccbb53fdb27babaf91ef24dca99f76bbb0547860244397d5d5331e88c15be0e4f24734bb7de906cc8925cf71e668ffc17f8753d8885805abfefc554f0e3885071ccf90f88d3326bfa5e67ef0eae0ad3cb42ded23abc082cdc4fd4e9c00bc6140d48e97d2b8ae918a8d8c58e47722fdfc2afb8fb80b458233f33942aaf91c9d55092a54908bc99afdcbdd0e1c2bc8e18dc0c26fb2f34a5651201cca331d2e0cf6e6b7d19afcd155ff89da3de82b07aa3bc71ae782c35fc02c0ecb1dfbdb1bf5427f064133504ae2b59c4196e8117b0db808f2f73435da25d2ce5c6d9d4d88e301b78767e2c7e08e1eb1d23e4eece064037cb36d1975757c0c440c094f20a8a974cc3d0ef32be17d7e06e42025c96c590d61cf9295217041327dda795c01efbc26eacdf25e923aa220872a9da4722d111ea28a564a390399cd97db78973d5f15ab808583c0490024e4c282ff985c215872a664ce42fd0cac7d55620ea621f9813a7f2ee1b3604be9105b423f8d6cab1e22d0590f3a596345abb1384abbbbc27e75c8e310cd599b3af6c350e797302510113d0cc1bb953f83012a16b7d249a03685dd0730f5b60ef142e38cd6b41180ed6bcd4108b2c9204b4403c035c1b3c741b2ae2730a74a541cf2be1a382b251267073d96c08a04a9f34b8f6e9d48225819d3795e9495c4a2a1add8b1fdf04202f68438efc62c551b3da02a4296cfbce944038ccd70269077cc1bbe048a59003425b931eaa12b644a0115b63786228d2222cd58096e4560129686e1efca7374a7e71302dac8a74dbf1bc90b6b4f50ea389ee090c74697db604970ca205bba09986ac1ca127266431f11466568df9a1b92413472018fd4671a3049fb6ff527b1d7f7d3e40adc4aa4be025e72e8ae27c2e20619626528c68f0b958a829d08306716ed2b6072624c752fd900f36f4ab80f90747eb820117acf0b7a8fdc2711f6708049e67b6dde95ad6bf5824002a69275272c37ee1afd41c75572a6e21644d46addcf78fdf96d9bb143e637360a30e3949dfe362f0525cd412b0d753363c985868df1cb5de5aaddde0674041b77df857d75f5f1613f296ac8114bbae132a042234bbb2cdcc386c145e49a348c657ec2a6c4f7af16ab8e675a8bc0bbc4f26967691b5a52d9ed2bd744555e4ca3516438de66c8a5589094960a535ae3f95e7b079c14041ee590832b2ad5132765dfb6efb76878aef7de6f3582f9ad72a9088eb320beb96bacf929747cfd056a5479f262008823bf6dc61c895c6e25bfe2cd1b0f67ec72ead77d0a2b694225b0f3fc70ea00c0806d8cb9fb506ff7f61e16d68e7ed4be0ccb29fddaa78484865670d58a837b90042c299a24b1603421eb870fe8b180be91d6d5316e211fd4659dae1828e56772049c3aa80315c05b7aa3d5859d153c333a02cf41f457a23ffbb0a40bbd8858809ac79caf6e88bf096b478ddfed03be2c9028e2825c0db230e3c69fd150c4be937ab364a4e090db3eae12a2d05f3ff55174382f205f58a09fdab5dc60fae704fe93f0b7b0f5eff5a35752bc6aec79803a16013b0702e408d3c8c69b507a01780fff14bfb4ff65dbb62cc4ab241b9356866b1869eb23183f715efe16f63a6528913f94702ba311056235a58ec9cfe72eb623a713e3e4932208649d366c25482202b5d7f6cc544669c405d3f37e6d07bbd3f2312e6132864a6cc1add4dab4018d586fc9596d4aa0dba4d87f30ce18ec2aca582ddc69a481184a1f0db69276df36d8cda0924b5f136a638576d089ec3abf050e5ce36ab9ed7f47e28f432bda3a646882c3687023626b051aba6a6f45fb79f83a7b4a5ff5d29b5163746e8208d4cec73dc98bb373f6f5cb7150b84f1653302b6cf50b302ba8add7f6643c5cd691b23a143ad2bf019f6cbcd08b40f9a2a25e9c42dd7f2a8b58d59cd69bd97d1ecb28f166255076cd637019ba1116efc8ed9603c4aaaa1ffc6b43d3789faf5b8aa88190443504c413182c70812232886e0188263048b152c46706c413104c508122b78aca0588263088a152c469018c1b174288ac471520d62fb92ce1d3795d678de4b2f4891a3acb5251a73a9d845cf4d2f2aa02ecc891dc14496477ded8bd180f4979987ec3834ba35b27e0232413542b905806acad8b5806960d0d412caa63b65651941f657acbc75640ca9fb2936ddde15d18b9af8206e4e31c4faeaad334989af43f7a5ebc05fce7a691e3931f1572422da1f3632801dbd25d7229748d0db7a392713573b0756c952b0adf97d9ffcd13cc76f6162bf5ce284e9892d602286b7f3d6099f89028ae4da76d336286808bedfe7ec8907522703129662c69546f2422ee0fccc5bbe26c690be251351f43a3baf3cf762b3a49fca0d23b84b7ec62ef63b359138fd8be831262bf7e3931f83edc9d5ee8c168921c828af3a1339ee4404f08a4f05afe0280066cba53d081f7f6265b5277b2fb8f4bf1cacfb49c5f29a781e47e558fcad61c5f018a879f98620b475f3fe9c2f2e530759692c29dd4f923d7001b6715c8656dcee7299a8e7743a4fec7db161af512cd8a7ca1bcbd78237dd1931b2ef4e96d769d84cf8c83cb97440aa5751e9e344e25c34f08e6cdd7600ef5866a13e29ef7849bdf5c417f8c489ec2aefa763c18b3c461978d1dc1b3aec5e87e789f52edcf6524ec2f454f58c7622215def49ecdb173d90c683e9c93749e6fa3190e885927e772077e2c116c67d69e513a6bd4b3dda171b8b90f29f8a56497c6fa3ecf03d06d579e93b100650ee3a5152ef88f7827adc75f4a613046c9d33717c47c972ae7dba00891efac581c49e4117dd19e9910c2e8dcad3606ec66be58a9b1fb460d96b73ed334d9aa287db5b30f2248d531cbab9efab3a3ccf585938a27cb0d36df6019a9de3e18958fa4528ca6010c6dd673caa00b2f3a61744e4f58e38bbf3169dbe8abbf461302eb5ac15acb8710fc58581244e189450673ca92fa8f2a4c71c044be2a08bd6ddd0d9bd2eeb89fd32d1cdc06a5fa67778efd8b762e529a03430ee452b7a1af02ec933764be6f24e0977779f4e4687f77c22762ed3ebb1aeb73df4774bd3eebd53bda17c62db656412751c41036eed534b06dc01bd50628d1702fb285c3074654cbc3abdf41fb160fdd549f1e146f766fca6a3ba429e4ed103a2c56b1f2ca2ba61aa1d5cc449a7eb024bf1931210cfc2ec0afa1994a8e0db345f2ed915f2ea143d32a22d4ad7baec8158c8cef83d0ca2802c35e32003ff81fc735a5d7fb9bc8bb75e0a5d98e178d1bad1c6e7259d56a09a0631e980459a36edb22e9428bb64d2c64261c051d2dd7667a74e5a4de071fb1ce84b5d1f7c9f461feec9efa6d370f9ca6bef896f7509e1029a043dec1317a5b9f30425ebe665f707fd7b39511dc5eb6547eca13c020fbc2605702ee7cb2ea187bb37050a55225fce18cf2f85ea675f5d234d731a25b5bc9fda38248efe9a4653232d3465b7bae6d5198b154ae6dd8815d119f1aebd7888ff74434d6e4cd33d2e3b4d141519988ee70fbed78f9d6825f489e9816c9ea72a59612ca236549d7ac857b2ddc003a2c5d16ca89bf7730ffd462856c90bc588bc79e606db8501826c3f5a10c80b985175676903451b8ab9216181f4d9abe2bec225270260ee1550b40d382ee53634561eeb5094fd51e13e8b1fa132c963088dcbd25e426e1eafded106a4f7cc00a437b0031f7588bf3438b3fc52a0dd86a622faaf414ece1a060cf878397ec49101097ee1c54928e5e03da07c6530b50b5dda32c8d31ed16845a19438b0b7f6e1d57d0bbacec332b52ff78d20343ba01a6c4570e4038e6c3953e828fe74a2a5a72d29d085cdfa88716d2531cb421b2db3075c336cfff9d785d76687f30eb1097d49f61e98ac9013f833bfcc516e0eceadaaf73c26e5ca4e3dabd3113ac7c733fa02cd6e7fbe34e69490d6e33bef7bf71bbeef44b4b8622fce6adb1f271fbb8aa041e9210c3ab7d06368826c74e633e6503e5169a10d9a0781fefcaa63929b1141271f5113964b112758219b6abe824d9e876aa960b5568ed0e5dd451f80e129a0c6af255ca3616aa563205eded48f0507191656bbe91de13b231dcc6d506bcee35da11f6912dd5ce9cd15c6fe38a688632e1668587db6a1ae0085c51b0372314c54a53c0406f21c985b6af6aa79bca027efd054c4ff445796ce2b1cac9807351d0ec328b5117f16621810d05771c6c670c78095de6d6fc60833d837b6e913c18945c3c2afa985ec801f60fa046c8954185766010c15e0b8fede2b5c32894e87637e4f2c8bf27128da1e903648338797e4ce1ed12396aef4448e1d330b4f9994ce30fecac82f78aaacd466ddcd43431e3d1284cb5f4897609ae1f44f3d309a048d469705b8f9a2f147a1b1b327a9fc89a08faa2a6f217c7413a3a08cb131e5083e8334d9b6c6380126f3ade8fc68a79eed8c5910a270809b7a24469c216389157b0006859e26fa5248acfefb730071551946659682b5429c0da3a8250dd88c758b5cb17247503c0e8ff4f86e9a7223710307365f0e6385f8779ce1d0cfd3a397f5e3d8c8d604d2e0a14d0e42fb5139db1e3ca5c3da9301af09708a5b7a241e0df810cb1f7ddbd8a45849f3b7a605ebef2b6d9cd9570895451eefff868ae0658f27befbd8195465619d293a32a520cb6a2c6418d5cc5a32439f6889ad2c4898941431960ca0f91f78c5627f25e98d07bdd6dfca0f764acb4bd20509d19f7cdc1afde4e34c46e32262ac2be45a251d1f98df7aef62f63f54d6b87376ce94c4cafbb27dff3aec0dc150fbe12afaa76353dbfcfbb2bf844ed9cf017c9a4e44760188217c80111cdda5b47748bdb49e7e92e0f4cc9a813fbcb82286e90c79326a07eb647032a79e04b17286474151a7073ebd8b9bc1c9924f684d85746c8a2d1de05aeba8ed67d4d897287563ccedf33492e91f8d5c839221aa47def490315942d6c370a93ae04fa607530af7a97e1fef60c6afc09f3dc6c4fcee84b694a800c254f84a2852552b6b40802f2dfc9d1a48ab77bcc7ecc6d2af656f5dcdc42fd33fddc443a6cdd80ef6c2bfbf30aae536219820717c43243fe35196109a671358537be3710af864c6a0e520196c6d810a34e98e864c050710e11b565611976ad23ac4b463e6c2faf0d10a217651f9b484865a8aa0cba1ccdedbc3491f99b0ac03378d750378fa2abd270e6c904a4c458728ef13b33e03acea70d3a99d17132cb1a9bd3c09142e7126c6943615f9aa2ef309b0cb2f7e69e2206ef12b512930834434dbc063cfe3d1e582e8b924a0b1f1fe6523b334689fe39edcb189eff107bc0ae332de8cf5434ddf9b81194d07fac668d17ee363aa4838ce1c5a93038793dac05535730c313d11f84a7745d6ffba9cf430f790646f99773b69c501821ab9a6e8831e8b30a85f89433d70509b3e8ad2b90c1bf75218fbe87ad25b52d0a965b54108f3f11f5adb256c427376a34d274e71592c7a03f406f21d9338061c3df4c1b5c55ab609cfc51110c110434cae5eb0517843475014711b1c414a5e28090cee4892286af35554ef8873435840fe96b6c3da02de1038b85de42d53adbbfda0a5856b0e28fc3a8e7f8245a321eb23d604557827aa11e828283ee239da9e74091455128c22a8b79b19333b2fa3744ee452e494151046376e74eda0027ce634cefeb07ec5f86feeb477b9f0f21916e5d8303a8c9e2b9ef819ad4f1b48c70a6cdad71e5e63923ffe8c660feaa5dc68efa3c5d4c7b32aa840130849670ce1ff2cfc2a01a3d2c7e8701c42b0b854fe741304ea8f4a1e579e684114f03f5e878dd3444d3cb9150ed5342c2d447c8340152ff0c65c24da9b9b3adf1923971123f5215ba90dd2c0abcf3e871e085e36f919d1300cb79c897ac4c30db143e74374658b66a462d63b132962efe22134493f44a7fe967070182156bf06bec214f9cbcac7094e2fe70b11060cc378616712ad62d3356c6d48c1aa6a8bd8d8f3b2143501afb6c6a719b6a882c506ad1703b697f098084d7bc29eaa52f22ddad005fd57208f5d69192908da2b100b0ad26b57c47912717357413ffa7364944f2cc4f42e9666bf4911ae73822e0dadd3fe08aa3cc61c8df1a5e367e49aa76a0c050346fca4a9c8194b530bd235e4856e084fa69dd2326f0f99fc60e5c9bf34735cec08648d3024940662df555d8dd4d382ff26d0fdc50a1ee1e93334b17c0b4dd7fb70b1c98411299130af26ec0cd1a6b599ba688e8d05244eb31a946235181b656b91024da5a8928a6a6e324704177b1438d6cf0f4aad179d1b4ab63c311cc5d0c713675e43fa19abf58aa0297e834314a62e86a4d54f06e8d9e68952e7da48163ab6d4e6ad8895abfb4f1845d01be810c8207846d5ba6e0793a5b47a3d511f508bb7b95c17f77d8b000f2e181493942fec910a66f2f2c2cfadaed0ed37654b8aee2c1983cdce2bc1acc52f4a106533349c4a2547d558b9fc0e46dc5d32dcf0d8a95ed81a0673d3f06fc9278efc55cf95ad13ea3957585da66d53921d2e43fed1997eb2746bb9d92dd06661c1179cd67d4c47fc64636eac58cf2b3d4cd80d3d1bab3371ae06018c3588dd4636746c7a9fa7f3b7540d25522d07a263520bc7549edf087de6790ef925618e406533a76175a601f1ce79cce21e7db32b8e3a627c6ca2e551b070e37cc8b622db7faa4f442316a5ab8f20bdc95b3373ee3641123154d243941820b03b16456a5eb62b64d4c27fdc5b2c94811fc1e5382a43f76c9ece85fe531f451941fe3eaf40ef74894a24ac81ee4ed2bbab8c37d52d23445bbd0ea4f40ca0cd1d7d13db20ed5f6803a3691f6e460586627956078115d694365dfa5d8dc9eff6478e7d42a87a88b1eec1b41a7e7948014513e57402b5825c65d03f675c1e845464c9760034d8537b491c33fc58c5ee13c40fa69d6f6b6b0f3f1f7318b04d930c0ad30e6c6dc7000647aac13a640f1d218c6cfb7c7c802d2ea146678f3ef3cbe167b57052ea593397e5fbfdc25ff4ac496525737d3c109f3260e7339494196be2aa5c0ff4ca8ed0a4d72e1be565e7b7c9c1d995d658e9419a43c299abf04b67b666526136d106661082cf510234514ce65b1aeb3531a25972f093776913cb9f711d3b7b41e133e04224a695f62fdf3dbb8c8c00575019f6dd9e81bd848ff55409cdca269ac04d9dd82aa0c9ae796e0f9d71d426e2d1240676f31973ce059d1b0ea3ae438d4432a4e671e640e073898e695ff040d2b69e909f5c1c4962c4f03c0278e3456672098992fd8c3e8ab5e586b218b825077c1446229a99a063b38f43388938ae9fa8c19d532b687fcc38e0a7b59c42f6bf87a5f4a2dc501dd43a5563593df8e19da57d0833510ed678a072a86000d720dc59136f0d8dc4111b54c1f2a383bfd777617c60a8fe295227adbfa0a96c23913bb39fd18d6363368ff4078751d46426f272101823f089457ff51d58b1ace5277db1746cfc6a170724d4c45b9c8964447df521920815b38fc4680c7c248118eb9255cd9a02b43e521fb2d085cbc65af4f54ba9506926ff716989ec05fff3b81b8164daad0ac91bbeeccaf940ec9759425bb0808e0d49afdc1934b1a0258760de40d6c55785f7086c5888d86efa52a76a3dba29e11fc024b08574f91f5402899700a8a74a5ad70b70c1e7a8b35f776f24ca61898e513a95e15d05fdf5fa6214d3032085d3d10188187eeca6f7349a6a45e84b71f442c84f4976f822349603f37c0717ceb4e792f826b7d6dd5b0647424b9d4e6e15d8af79a00e0240f5dcab8304454870eb08c1c390dcae8ddb0bbf066275f48a6920c49d121c410ddd5cee47d1ad1572a6725570afc7f691e37429da54604a51ffe92a4f82edc1e5374e3df7c22ab4600e8d9a496fd9cb1582d89db9551866e7830167f298d65a611e69d56adc6971e2c1318ece2b8e92206724289e08a919dc3417b82c90bd273d1962689edf0934032807701f9bbad0e8d78df6d4b2faf57b7a5109b8cdcb3657b0fca42d8d2d78ec617c37af57ea90aa3abbaf31086d63bff97be34b8dcb72b6bc81cd86073373faaed4831495e602c4c490cddb995381abd0cc75fc050b223d11a69024bdc32eccd076e89e5729b6c797e99ed3ba6767feee5644a6c3879a5121b3dfcbce2b5909fa152db1fe63823e5978a52a4d86c75fa036ff301c3c16600582de5387d292421c01a8c15a9595c85efcc1fdbf4c8dc4f67d2800a3346724ca734a2f742bcb3500d4ba9b4679d783f8f4bf24c54e7609214f7d167cd44e2e9c07c5e95610f636d3bd654e17aba51fcf0412e0d9f08080da6b0338d11011a07b97fcd169b58ff691610423e4d4b39bc9a302eaab3ce94d7ee328f2d4ecd3b9782f1c82caa340331c9a29c0763ca9e767a707573bf1e7b7457e6be9a625fb630a1827cdb07940ee010c20047303bdd302ac52990e925bac481823144574b4323727f4015582652312ee6ad94abc3ec128f1063bf976b972ec2e8c1ddc15e700f1fa4f4ca5e83243c579c87005d50d6a5da9cafed742fbe7091395bd3649ecb7ff3a96e970dd40a7e39c14782dcc58cc52b67efef33bff79965543eec33e33b168e9fcf319421577def97f2226d14688ca0de516d794edc9192c0338c43176fe09e77d03f305e21e641b86fc83bfd654af203f9402fd970312613b340e027e15174c7428c281bca211b1ef05560618ba4323b7bb60650f50a04b4255ed2babd46fab6be3425e7f8208161c108dfa8dbcad4784779a62229f7d069513fb73453fb0e225893c9df1ce6e2bb7f457623516735e06aa23e8d8f00792630f38c94d4dd0a22e708b0af0fe33a96960d6496da705a04bd48a726d3bd1c1760b6fab9de603125245f7f9cc13e0f509c48b709081c251a433f45cc067a13a65fffc808f29819fc32b05057eb208fcb41cf033df42912b8c619da8e502be6a241910527b7393c03f17d10e57b81342620e318d8f8f1b8225449deb2252eddb6ab9835eabcc3d16027b5e8d65a865faeb54ea34ba6cc057f47ca2d5fb3f3d830aacec4b06296593afa9615215554ab9b30ea17f1b9e5d8a2f8615d721ee471aa11d346c3e6195ed604883e22c6ebd1012c0a76a2fbcc9528d1bccb5e263b9a15b08d795b3be66021eb492a5e580d0b5b54e05643210cc4e358942afd02494f62aa92efb41bd14f0226693e499bb53b7872824ec8b30172ad941bcd2762514f29719e134cab4f0e3b9571bc442d8e8a3da025a574933c62eac3072664342ec5a80de274226d0676de56ab5cfe82ad507005b5977e5addcc4f35c16b7e43d1880dd65cc44bb1110acf94ffdea5fef25ec4b2bb50826b609e650df71ef2605e527a2f3a0069d6feb32a862addd41f4f98bb96101afb43b358629010e6aae3634021c426a65db4ee23cdab7f12f08c21b8d88975719fe54ab7da5a14c918a69ff88828a2e643fe68319b7b3d670ecf624c5aa526bbf01d8871cc643114a48f2519a9602a013eef70dd483df8e14b45c078aee65a6177c94d69c75a99662874ce6dc193fe5877b8fcbb68b816a92f8bc55ab1afa4adcfa7721c38a3501427c090822ed011a666727e8c2c026145b9d936b5351538c99e5002aef61050fe89af16109b787f375b1313d86d22472952070c51c471e1a7b54d286360ac6931cfb9e44cb11cecd0466b9d9432903ac8173f286e9ba779cabd2d4cf70c2caa1fd90f49cdbdb9c79d2d7b4f354420066e834140ae65784b24b5716ab4cf6d90f0e74476fca68f1ef98ffdab656b2f224cfb583b2ff7d2e2ebc5a71bc43a832ea6b780e3576b5d0663d0deebe05ebc8bed47e1912c4ba6a3843ce864ed8a8a8919e5df31f28ac9727c54c63aff87a18cb6fe69944855c7bf9ca310eac55e1186bdab203ec9ff916b1e266322b9011f496ad4909ef8a3b7cecab34fed789c2347b064c74f48ec635e0ddb08a28ba3984c1f6cf23072444fb8a288c85e8e1ae4b5429e67d68993dab556b6a95885115254fb97b438554de3787bd850d8b92acb63d6484af983cbb920b69ab1213f8038417d6fc20ece113f8032960996cea18b9c245a35b902af2984f10992a00d65a629d48d383c29f164cba7f65daaee8dcca76ae91efa6f863ad3cca0f4ca3a3982a755b27ae5b591d195bd4e6092e26d7d198e397d1262acc9f877ebf96631ce3594a188d00a7f46b633bf895c9b9d9e9c0d2272102de530ce057572b3c13262d2b56f3386a3260022e3a2a549c9621947e71087ce5aac7b7290c6f4d208da6d37ef30186c1da8467efb6ea7508365e606f206609c7fa02d849452bf2cf6bd5a3381b05709e7bb0f9541dbe5b8c03369505040781d78824e0fa7255d7f4a73710bcbc24ef80bd6ad5a650685c2b3a203a2f1f2706e10a35fd4425021d2fed91c72d0f91c01e437ac1540c5606e42597369efe5816e5c4a53ede7972e639ff9e9968fa4282bbfc0c6859b15cbdb0381fb71d19b534d27942d8d6ebc11ab817d2b235048c5e42f9cad8dd32c8e46ab8b78582b77393d029ce596cb8955223a7011894e055f4a8766db4873abd887cc643b119725bf441c7472d5fde88aba00a4243126c47dfa1487cdb205debab6a7911439b1d4aa99ddc6a973811169592ebbedafc8b39b5cd53ba1cb53ecabed7ff50318f8ab949ef3fbb6652859e1b24d78c32b6e9b3fb15ea56c515746f5b716d3ccc54e2956deed03426cbd8856d5cb9b3e963431bc93a583d8be925d4f39b0a8d69bcd4d17b365b7a21b0e11c313e64464be47ec02e128787723a0ed5d69e134cd4b164a2a676a90c1bb01ab77841c14f07f755eb19d8ec08fd4e82f482139f7676b68d8454bedb9e31fe1a922bd17f92f8a51a05d5eb40d52e1a3319c35ae534031662761f979ffe0ec4b7f509114ffa1f1931f9b716efe09221dc917385497e826067f5d2a7835f825fe6a4467d00becd964ee8ced4326ab42ae112a76e9186f78ad3ac4292c1bcf39deebe9d9687d70d81f2c77d8817fbe591b771d30d729948d263b82d404d49366d07c3af835e29d6dc059954a5292835067924926c8cb553f5512b4cf840b72e2b11bf14a6181c2ad16afac42cc803679d6e2877e14b4e4e85495a3e7d7b11a6fd921320d2a4ec9b8c2b31d3b7230c5def8496088456487fd4256bb0cc13f32b8f85a5297d0a6e48b597f6834cc40f888f1fae8658c5c041d6db52f72cb4965740c964414983bbea81a408df875dc678e3bfb00d25ea1ee862fa407fe0be363a1798d95a9a26e0741378f4acf3678959e39c21ab717117740e38a70e8407322d2dc9f25b5a5b068efdba344f7c80f37e2f05b670635e9f825926621f41621978857670c29024822774fb6ec547f97584a0ee254cde28373315dc5b8bb7dc54a611e4da783500387ac294a6ba925fa3fe6f5d0e4df65d359c367904cb5f73f1e27f4f7dc9a10bab44bbd34993f7e301816f063aebfea8973af6fdf6843a8d2fc8b8fae9087efa8bea09083f0f72977a1d64f7d7c709f20c584726e3a043f1f9b88f3a406c70c25e1e18fa22f93c5a9c9b6554170022919cfe0b89f56569c92dd0ca4be1eb0780971ad4f446d0e8e5750859ff8650372c4e600d629eea0ab2d1bd1ce9b76d7238eba2b082379523eff4c492d7355e7dfbd6add7e4e583995a74484b4e09425230e9f2d35134b3973973afa6497ff21322e19afe59d06ad4918923333cd75956865ef8c39a383e0f88f63fae03c81bdce43ba6a1e630745bc09d05a613f1eb5e96fc9e84d73a8a59e8c3c04722cf01c12b553628f7a6db27522ab5ec98c3f2267af96d406aa6e41f990c0355274f2150af3d8fd10574f1d54c1eca8992baa410db7f26adf90a2087b7d8e2743e45b8ba15b13380831ecc11e36c339352115d97a59d3286ea586b4c38de38684ce7bf3ba16a43a1d958022f94961439fc8197faf2af07330ab77d761a1bc486638612bedb272936cddf9ea63e03b3fadbc60781b0bf0f7b11ba3e8e787c2afec01265cab38c7f2badc1f2730d44d1ba90ce43ffc62fafeb73527d5e87049233fac591050dcf375cda0a20310a60a37c0c090f719fb5db6186bad3ab36d9a0106abecec62360cbf12e2676d712a2a343a5251532fb5c17d45083340567c46a673822c3e0447649b3d118417e8702787982f434c1c5d6a83eb83c8b00c565acebaf4a67724af25de94c7eb4bde3d8c66c3d6aeafe50a6cd90d3672887f95f33436f34dc80909a3942d3ac69d96a069981993255018fdc20f1aec272fec8014a18bea4d573952439bd9392b6a03faf44ec15809d361a2d61d420e74c16bbb046c5c7b5f8b9c7d179916225930cd05c5b704c3c89a1899d949bcb38cb28a1a25060b3ed461b6b19b91b526ebb3998dbe671802d9dfeb1de6ebbd16d43897aee7c0241d6d56b98551831e9522f397e4ed2b2585eff6acb918e3bd17646641b05182af656a92936f13f7de52284dcfad028c4db77061170e0ecc4e61bf3686cd16c4c9e41cc03b88eb47312f91c708e7a31879e54178dec38fd6f9dcddb2e10c89184078280700b199f6c56cb803d425b76cc7894bcef247c2a4fdd28f001586d15d9ee3022ddf8c35bef30a4f7a1573e04e72016f4d71e23fac9570f406dd044b90169f67dc23bf666282cc86788a926c25474cdcb0b52f33274e274d63a16e59fb4011996ede2e3ee48ba76ed7730bf8f8ea664229763882c1feb3286c1f808ea389c9cbd1f5d113b1c641bdb90668e3c26c18028130b4c729e98934a54f37ac942d752def5f7971ffffcd4e2a298abab97371cc395270e5a719bc52a9aacca8bf081f7742a518f95ba3474e488816010c87f27eeeff30c9c9e9f837887464f620c9545147d75fc0e714ca5ed5a5c5f7e16a0923609d2e85a16c95dd35d86c9136766181b329b49aa3611055006f59214a12969fe212d6966efd46491ab7159a55ed95038b00292ef8fd994e404482ca5526b63357e0aea025465f23130a593d02a181ea76c782580c6ddea994cd4415366134b82efa288092e58aa61d39a83e8b1f11fe332d204a913867ecaff7f0b6ec4d1e47987db450aa4ba084ce787e2240ca20740e8b4bd915d1cb081c28c6db9197c1a87a86c12d06c1988868806ef72abfe9c3064b9d15218f45ee9e99bf60ca5777456e968dc2b0d5933b380378d8f66f02acf35d68b756682f6b0d5f3ff83ff42caa0994e303a80dcc3eb11b700e697b2d640dd4156ec1fdf2572c59f95ac40b74f1344683a87c72ac636f8aaf20182cfd2d1341a9a2f401187eb08e26fbb55d985d91b8dd99c35ea4122b664135fab3d4714663329179f8c2b004cc1c95aeb695af1bfdcb22b1744c10beb15fe8f2e292be2252862d2c7ac78ec8a2ff07670d5cb4167e406277d10b6118c509a49ad88b783754b174fc2640110ff73f29f13858e699add6707c3532b9e7e998d04972a1c0fc256d66bb4e0acad44ffe993cf6a26cb1238d23883bacfa6886deed47a5cb9d52df7ffaf7987098413662d0d6895b6fd24a88283ea2829d98e54efc9a30e7227b6028fb467e6872048bb7e95162b398475139189334a8882b780fb1a13c842a7f44b0da06c3c370cc6a992faf8afe383369e12c7031124cd836f43950568b7c8d2d64e20af297722e5f6da50853cf0559c5b996a98b17b0e966a39f5d10f474218608dc6523a48cd30e624156040c6d278e9b2d855860d7cb80afacc01a31daa7a9fe6f9bccd1d68a20ad03c6a0bc2ada17c9cc7c56bd8009df1f188faf090ee758537103c20edb7fbd4641c5dc5de161e4f2b67998ccad6e745f5e34c5d06ed8e7cad43f5b4d5012e354debec613be1e6e0d34d41a1bd2be49756f1e1c7f642d06b0f17953b764a69a8a08e21946da7715055438768912f218624cda72048440b200bfec37e51309cad40332e1542e9e0f4af0d1fa152c044196d847b0ba36ae8619cd62b8f22db8c81ee0ea0024de133840177072b39b3495f20676fc6fc262d51f10c5516053305226e99db507d6e1b9df7097e195999c2bf4550a5eaecf86b7c6b0cbf2b70fb189138d3274d3ba57f3b07d394e3ec6edf170240c30c640e29247236b74f8fc49ac8297b75b8a0468fa415c51db10b07516684ca7f8f74489d2485734cf8b11f7a0f80402b63707b026f536fc67aa096ca4c0d1929b924bbbb349fe574cad0fbaf9d964b8fd9072059e40b2b2fd558f4c05a0a2681de55e70366c0804acc53382a964f0ea18caa61ac861e6db8b6211e9441a2cc110960d4a1d9d997ac3417b4ca1a2e0f96e6e5277c3e0f7da26a1d0e3c29f28becaaebfb46a46c588d92b646ba050a675cf8278d5243a67aa0aa3982dd0f9679a3d52a4b4b662aa4829c326e9e31895319214ee7dbd52c1354b239d1388e9f2f6eb83b56075e1781446392f3a4181c2fc8e459ac7039d546ea98e5bbb3228feb80a8e33d964fc2e546edde908fa63d5ee061957d2ffd60f394109d3bd08680e75ca139d0a7b1e1d044fe07517450a4bb080d829c6cec1d0184c4f41ffac44394a8ea194ad6c5604ee476008fa885ab24dbaaa264b62fad8905b599a7a7d503ac82d7decaaf20cf28fe00257adef57dd58a0698812b83dbc9755e679d548e3f91e89a828df61989c2d03fb6ec5bd4a65ab26d925e6ea0512436a1c09c5432505edb978b76adbe55a8c4157a39f14986eec7098094a1cd9de85d572b67a55924d86ea6999d4015f6b62e0d74140c93fab7352315c3577be251266cb6e655a0593c29a0539aa8f2922c899ef2c65d40a7dbc43196084d9fc40a5ed9a398f95861b594a9ccafcc93ef37345e85acf780f6bdd3508f5f84ccbaf36ab4617a16c8cef7e3cd73538cd2ca57b18469393401ebbf27ea29a158cb35fa8114487c01e5c9faed616615ba4010d70e81272f47198bb7426983fd5af548ed61462752f12875b7e5b13d4a5b11e006c0a3156fd3e5efc39c8cc95f67cb3828ba669ebed0bb47a54705272e8edb13ba4dad7db21f7c9cdde08eb9c83af4fdc7c55dad47d1cb0f23fac071b738b9896ef8f5c28f8376a05af05478329578f4722cb304cb968fa05a4d4bb949b836a9272a6553d2e3ec7e3f823bcd3398c510bae5c901175d4b79bd1670f13678958a951a126677ad6a8423c6f5e01913d61273dc94453eb03f86c71de63516578ccb25e95191d495796b27c885f106fa2125bb2cd6f43b67daabc1b5374a3d6e5ac4d6c6df4ce25f07fe0397cccae9a45f67e86e9933857d5736a27a5e243d56933e5099ec72c97511c9f5ae108e81f53c8a249f9b31347dac4d16426f7d5e0c8bd9dad1cffd454753ebd99153df522762ed1a55bf022e66b00d8a76947e38f2e7c0c001dc0b116f0415fd5ec210a5b1ec1838abfa098de526c2b2e3bd2999c3dfe774d7a6eb984a7679acad7514e6d65c459cb073a08f3090aa037fdc9afb0992fc53034aad8943eaddb63140da2be1db69f572b4ded7a5d48b6c1cba4e57da6c87f05e6b5d6ecbd86299767d4f32e3e69408a0abbe776d291ec7efb3c4204a95f5cff237e84737c401d5b34bf81b07920b0ae1b4aa580b21a0eb20098def3f63d58dd640998594177e72e79c52e730ab10d345efe16fbba9e2b492b7cd504f92466cb3ca861cd353e9da3bd34a5886d4c78710f26dc04b6033d735fc01f38f28dbdf3ae9aa101271944219b1850feb2cfbb90437144ab3ecc530c800bcc1665da1662b445c10b4a16e624dd6cbde2407d2727613d9b44006df05d2b370bf0c0d9badbacab60a5b65ff783936e4093a83fcbf14443e76e60c4f9348b0eae11ce802b80ac6405f46b550431056b305bb0fcfd38ade34fa696e14a5c9f8d4398c307391dc26518b949f4814343e2bc6badd8364d82c5017684c48062c219e9a8d856488f85bbaa0f69a0f95b911a65d9e272ce7c5f0b48b87a2604936854688fb527dc6bddf4cc89813fa4e507062d378bc2ecad6c4411a53845461ccefb18f81308f3dc665b2e0dcb1883bc7aa812ba28bb2fae20aad694afd42eebf3d6bf398e8c3966e28b40c9f53c75670945ee5719922ea58fe3aaa6c355d383bbfe9f8d9165f55a2f145b1d8fd823f165c7950528e06e86c95d2ee7eef98ed9061d13048429182994ef64506a9850da4bae631294c2022dcc1db405bc4a0cd04d9e86791a316a79b4c35c170e8ca1298620cd5a12116bfed9a44ca507b5c2b33d5b3eb09fb0b8319c3369c57413b1a70dbf893c3d08e0cff7827dd4e41952a07ec4cba52000898e1e9ded1c2b3d1682d50998d66eb8e1a128948e476080dd4170733c57c1baed134f780c033c0cd8e7e39ac131146663b42b839ac249af3affd255e2bd661e1519bedbe7e86498a25332edb0da8df8af561530890ef4ce210c34b4b3f3060ef975ede6d71c7005046f5aa07a8c4190e8205a2e4bdcc9a4eb9600149dca2202ff743cc1d2ce3691c0540de91bcacc31801d06856b12a2292d3d8130428e503680009a50a1a13a1a011401f0aacd3d748d140e4b083520c437de1b832ec411218991c30093015c2c73693ccedb20a7df998e1ad4ab0c2d9b6942926059ce30a6d6599acf93925bedfb04cc9d9df2fc28417243017d90f920ec24ecd642aa18b6229e8960ea96ca5e4ee23a5477271c7ca7fa6237cc61960654e79dfde072041661d2604e19af6292cef0783af6aa2065e934ecf63351da9833d42edfe2efd2998992f2f25ba8e36a076e51e0577ed81fefaf5dcb2e904087132bf0323cddeb5a9fd2de17cc4ce9d8d9d086947233d5fa501883d9c8185c0b31a5d593b167a0ecfce67a82c7e06c22fad1a00cbeea448dcdb687609097ef1ac4769092ae5c01b7f49686e4b101e6e5a0f9c840a9aff6fc4ed9872820434f06c632b124f91480f1ecd5bb9019d647354b8d5ce8832d41a525b8021ee08e82e2af58b1865d2ad5fbf7c2c82cb8dfc616e3537e41cdc531ac9e5b855bde7fae2b3d35bccea048ddbfba85fccbe3c5ff67cd5cbbeae7494b886467be04120a29562daf332138c498f167ad3776dec17e11a18a70255970e4b50e26d8592cb86c2c07d7dcf308ffcaac12aa58301afa4f92285c32ed503a47204ea857fa956309c15251d3303b15c6b8ffb733967a3494a003cf76a3706378aad7ac7715c689d7a6b848a127e3d5dd6701b022cc86d0814e06129d62117f8a8846b1086636dd196cdfcbcda2ffa6dbf3542c8269bec4d36d95bca1d540a600b2e0a41a0092ef7edcff4edaad13638d991b13427c3359ecdc6909de34edc794efa39893bcf49db9dd8c2b63477648c813a173558aae95b733071e36c137d4bd0ba5e8263228789064a3ef0fab9079b5d0c7766630d194709293559d86e828fdf210db81fa41c056334922da79452ca274333cba66ff05a953c9fb7beefbacf6ace19819bcbd79292a33669d37defba4359bd57713c0bab880919bbc9c1d7ce399e97733e40e643c1f1f8408aebee5028041e45b139e767dc9dbfb952dbce23bbd374d5c99bebe2fbf46ee341ec617c5d652bbcf7de7bef3caa57bdeabdf9deec37afda3d73ce096d0cd1337c3cebef6540bcf9f7ac67519ea68956daf6ec6ed5e1e3a9eae64aadbdb854b4f1266731e74c48742e8459bbc01f00099be381e7f1a4d4510fabdd80b870cb6e756e46adff68cec51936de0b7c75b71e42c135ea8daa73630cdf19d8218c9e21dd0b3f038246101dd33105b89079be372704dcad76b3eea4eaf6b61f52dc2bc699782d4abda23eb5ad79a4d52e2e3e5acea14d8d804ed0bd4c87f04eee001ec8a677e82e3c8c9b6a8494d276f064f0ffeb89083f8e98ab108853ceaa82959cf2bdaaaaaadfdc39b9a97973598350b00ce8c58537e00dc54f082f4808ce09e004f0a985035b33641bbcf06dd3ede194dcd78ea110a9bfd3101c713f6bd43187c18fad8da67ddd0d7e775ff8c6c1611c9ccb3bef043130048ffb35330d32e9ee64d6d2bd70330aa4948f652b8110c2f71e0c0e0ece07649eabf1ba8831322022a0d6caf3a6a94ed304e1344dd3c43c4d70baefee9da26c10292932748d865742980521e4320d681b240497e149732e01fcd69c3bc00d03e9662cbabb4667d18d51faea0d08e199efa0fde1899619625dc850f6b91b04945223383838259079149d73720e0e0ece0864e4e579b3ae02dc11b273dd8e087676443084076cb88ea7081bee86dd77025cc753a4092c195eeb2a6173f9b00d177e632b1ddf0564c17004ad2cf4b89d2449121f1d45ddb969fa85104ed334f5d0a6e79c438173ce39170a79e1e0e426f7e2c0ccccef356486dc3bef3df8c7ac59104208dfbb6b972040071d847683b93034bd7738cade7b903a749475ef05be0e3858d350b818292a42182184ce2e012f74a18ed97e2b2a9b55f5aa57bd071d74d039e8de7b8f092e4e11ba43373de79c7b4f50e866e2a7699aa677aa070c3de79cdd207c69f87befbdcfd3ac7679da8ccb341838458c00b1c15c273f56c63364484bf70d88e414c171a2850cfef154d1732d05e4f02167210b3977fac3b9fce9e64e53bf7e77fd6a8ee9af1b42c6a1c58dc6bd9717085fdff56b425d0b85a1823b82e8a12a766e7511cfa5600ed1439fb41cd8adb716a53c8c1532c798d6c4bb14bfb2253e7566177a13ef96521ee52986dd49cb2a61779789a8458b3d6accd40282a3fa35b2ac3366596720b72a597797098b7de45e6956e9b25cbd8172b63ee73b92105869de5dbe94d9f9402f8d6a5b3c6d506720bbc5d3bb8db7257ce0dc2a028957826fb5db4d64e2e656d6391fe8dd6b753e5c67128eeaf1952dd1638fb674dd7202c3783cd91866379a95638c73ddfc318dce6376639c3bb15319eb41a397f5127ce32dbbed5839886f699785d5b2f0ae7e66ac4fadf4b14dc01b5f91ea49a0578fa4fa8973ab25706038ac5f4dbc1b2d8e4cc88db6c47729fc8fc638f77218e35ca711515df4ae44881edab1f251146922bb8934ea5bcdbbd465f5d0ab87aa30721d1b21733c3b7042296571cd21ba6c4bf17ca73916cd559a955b51bb4e2b0dc32acd88bee2579abb97b639317aecb9d00a6995dda6ba63c5869cbcfc8af66a0eeaf594d2b8eb8e155b73b0ac3053c8387ede8855db98b8b9f57c5a81569af6b54e7ddcea5ad1d83a68e5b1fa8ae6de4b75cb65a058551a0e4ac27e59a797162dab56ecdb75eb9546c22ed265695642c75e5d51237d684843398b36aa349487b40ac5d2b6cbb27e1de5f59946c2401a3d8a0642d1285d822fa5613909fbca47df304bb3829d451bfdd2f88e1e35ec9916cf42b382d9ed6654f36ebcb38838c0e5575a8f77a36d02460a19df490b6649c66f6a4a9cd2f836dea471e3847a850594ba37e34d4e83d66a5b767f5c7e6f3be2b7fbb37df380747313649ca669076523e5847b2f3e1e73b1839c1c58fc85901907f37d3587ebd74d270b561c0da77a233ed61c51c3c1efa90ad19b749546f2ad42d67787a142f6deafe6e0f75f7715e27de2ab6d1990b74308de6e84e0f327d468e4a775efe59ddff7695b46e3acec1c3fcc13401d584131e798212fc1b7ff1e5f536f7cd3249d2d9170f0a7f3dd9dac12946d0203dbcd6526a63331bd89cf9d2c13fc9a7a192a41b56d822f371a9e4569ee94a24fdabc4fb9c39aa7f13be6ab78d6d12e5047bbd874378982157a6874147851aa7f8e9d7eb4ec98761d8423ebaae6a8fef91cd336f891d445effed16845b357ff7c5e550960bf2a897e078c93aa6a49d4d6afd0d3c0a82759aa5e8fd4ea68171bef33674a76a5a43cb325504ddf14ccba0a14aaae4b24ba25ba2c914824bafe39668944a24b745dd7755d51b8cef73a865d1fec1feca28117973a3a31edf3c9b2cc3dec23afeb54ac38aeca3b7650f1aad6e7f309ea681778e945c3827dc5ba779d063b635647bbb8cbea6817089fd29f32b420d18244cb91169e969616245a5a9040a2a5a5a585a70589672d2d2d2d2d2d48b40489a72edf8c394d3e2e9470c73ca5d978938fb88307cf810b5aa7668da415b2ec56b323235916ecd667f6c96af6f191ed209de5ba4543b29cb8a04f0dbcd9adab0662556545a4124a118942a1508886326ba2a0a0a07091f9b816e87396cbba6a60c672128b46ca584e62b12eb50452faf0017dc0345cc90c91ac679ff4d3b2be428f65393ebf3212b5383ed39a873e6e864969f9b8960f1f3ea8656ba05503af5503a7dd6aa065854217894417365150505094643e2e5603b32c6b17e8c3c9ad79561d9ce08469bae41ad5a7575cc3ba3badb9f27d1d421cd3e92f6d668aa77693775c35beb38590a78e435ad72e5475dda42cad6219f0f2113e6a38e6e3a536332d8e38134fd55ccbb218be2089a88eae42fa7c1e3b9d1a3da6659d819e7df2057d624b5c07cd4b96911df449411a0eeba05fda8c654116b64b761ca019d02d10e8ee3334b1c3f7de7befbdf7e83f359b245959c9b2a42550fe390ec732369b9bddb18c4d5ed03f7737fb3cfdd8cf47c361fdb27e5d379b9f092dd07c16b258465956536a0a06fa1c4bf980a64824126118866158922ccb66c078f64b9318569f812486e178d6b157494ba03c3b8ed041d63da4814e330d47e8d951b49910f60c4776eb28da4c76cbc2703cd2129f63c72159463dc83a9681693840c7fed1664016e2c09efda3cd60cf4eb1cc5aed525f636548906f468c9fa696c524465268312b69ae482b448fa1cc5166591725cd99c475cd39ef6e12a44f6d9bd3f6189148b3c7e8ce1ea34bea315a514949118944a2299a96150a85425a4829a594524a4cdb92b818ca5db68384a1492947d4881ab5cb2889d1eb1128292574e239f1b4800494f2946de5a2872c4be5236f13302ebd32ec195df967e503819b7b317173a9d5408c7bd98aae7c567ed9d20a5d4919a9a4886a45a928b5d68a526bad14858485654e2955dab202357118b200a1b0d451fd5068633305ce2a21e75249a0430c5c47a06750446878f47022094fe04e1629b89b5b924510eee69864817337e7e47337c7062707c6e120970f5fbfc73954573d80b0195a53e35357a5a5ac4f4851713aa5599f4a3c9e2e99ad9e554c14c537a46511f13eb99e4aad447da3ee96280e7aea956f7105a5a4e60d09e7ac39ac5376a3b72c6c976aa71933d0304998a456aaaf4ea99c1a57ad479f9e52f9a9456dfb06e3c6d0664139a76ab196817e654bf2d29270444b22025238a84bbbc99ab6464021c748513176e7dc7eec98aab579eaea34c96a9bce93a2a8eaf39355c2dda8ec857942b64969732363516a6d6e64e837a983f6a30eeb2423b2bf93e2a95bda0f7a9b7aeb4f7bf647c5f95169aabc4c7dd2a286fd7a3f6972fbb1eab0accd8d8cd55507b536cc3aac5fd2a8f9e86f4cf38c40c4b11332c76384253700d7f118c1c8e5ba233b8d39ba1f230ef6777a982db20d5eec6a3fac5f9416b5a9063210ecf594da0d8e68b8c84b7da34e4d31d4a431d5db0da5c4bb2de56d0d24c20175a81a0e668bf42ffba316512d89866404fd3b9d2165845c47511a3dc728336935efb63504074e16e10c500e4f1186dca6e164824c2308c72c4a32e39239128e0ce74ecf5aae254d931582716e84dfa124cb702eceb5d14f5b81833782efec0ff7a308cd0fc78e5d0ea8e327646e0b2c8c5cb7c51341ae01aedbe208525c8bce204366e3018e67088e0941f62e4f5de2c0c52193a73ee2c7a322a6c86ec34e76746fddf885146cc10cd71dba19ee0c43587206218ce0086a7022e31cf5b6407f23c3a799eeac8d3bdbf0a71b99e9efe547bc19a40713840a979ea1c20313c4103447a417468e34b9d60e114a7037b7736409bb25fc09b695c1b82d9773aebcb4bb1b5a2a6ac8fa30e7e670d7b5f0ebd182c70a9c4bb1e9a42228769aec933c4df6cf49455caf37e2b2d51a91bd9709381990657f1499fe39fdd4ae3fcd7aa565971af6d6aad749a3a956c77b813faa0e900d92d9fa1f3fa8b5f15ee08e2eb267dfdccead2e37c78359ebc3f2782fd7adf76b55d15f9a05ffe6a451cada2d2d3bd511a4c22eed8f7afda87e14a1a9acdbd145b5a30bf9cfab04c1c7c2c0efe8c17cddd183cc3a8db5082713a46df567a5bc979661d33a6dedc77cbfc22e2b79ac7ada8f2234d392a6fe8f771aac8f4d6b237fdda67a321247c8eb6fe0ddc9b04cf5de340a6999fa4b0b128206c8d40b6999eb94a6a33e6a137032f59366c493b93eb51f18b5364142e00019eb99254d364258c63a69d27e14a1c12c693af68334595211d9abd3609fcfac8db5a1bf28e7ecf02253c2d1e1327153cd6fa0ba93a9ac7b97617a03bb7a82f6696bdcee3310c2699a8470ed12eb8c8bcfbdabce40e87c707d39d6199e61763eb8f36d748c1ba25d8c206147e6e81091c2880f2424d1a3a6c7024f9cb0716207098d8e710e27488e8e190c11019a2434da65c911481cb1e488254470e078ee7c0822540099c1b80b0c10346c58d248127a7494b48e6346c23c5c1822757460a0a3a3a3d3b3059123dc12132411e2044e901c1d33182202343ab2f7b264490c2bb2cd2d3962099ba063b6ec023647f0f0919283c4114b90e081c49223965442420e46bb486949296518e6fc7cae83dae4a0f3014a08278e73e216f05c5c5c8e0022022e3041d81842070d8f98cda16104a3458877a5f3c1c5650444045c6082b031840e9a2378506fe4321a1500a6002e2ece89127068d0a0e192848fcdd5c1a500405821185bcbed17d72e3468dc1e1df3002468d888808e23785cc04147c3056123081a3468e03431b204c6f9d024891e493449a289912aa86b914d60b044a7c60449d8e008c9194244523c7a70041217704ada258826a102c80cc65d6080a06123892649b8264690e0dc932a9a501104064eb8cb29467c2021891e352c0e08abc5c9d0e82e0580a141bd274eb827f03d09dd8e11684bc942f8091fe12155b01026c254740c774cca8ea470ba70c286831431c9b8bc17296510a102c80cc65d6080a09e908e812c8485589925a57c021d624a1a4e480a05b7ff806c94f50b10ce874c525918b2cd251922a3e931840e247824e1a3c6898ec189d4cbb208bca723024986f8c2494649ed45c76cad33672f692b9470097276783a26a5674a8a48c76c8d86db306829589e8a422e3fa376e11275f98d923674e5dd251141655924758c308018b5b8a4583183a9d754740cfc4482f75ed7f8a2c638a842edd24dc58deaef5b5371fb55f0bd5128cb9c14a14b344e757a7950bf71ee529eb236efd2929c8dfc9c1aa549a739ca2f0c198d37e3c7849179ff415ddeba735156cfaafecbe3cd20d1ea49bc19d4df8da0feec8f2234f4c7bc0c7527f35c2a1a6ec85ed541dd91dc6bf892ea6928be5223b9ff2842fd4791cbd2c0cb3f8de42ca95a9a79ca9264a8a59187ff012dc9599876a94ee3bd543450909128895a521173becbff809f3742fe78977732ee1bccad7040552ba04b34ce74171798974da3248ec7f5d803ac803ac955b63a3d4dc59686f2782fd3f4e99b8c1ac9693c4b48ce395ad170713ef0e53fbd5a1aa59ad3a45569241a2bdd6b1af249f9b46b0ee6bdb8be8f48f7b403ea5a2475ef25c24e40f5fabe9199b4f7a0b5819f6ed37fef4e66d2defb464c87f687fd518406fe31312f01beb42942f38efd591def259e44ff7e23d31a895ad28e4fd6a608b53438ef40a6ff80819644ffb6246a97a0816f6b9361b608cfb16f30773298b5f14a24b65006da2deb411112117ce589a0a7f6fe2842331dfb0f1225cddb1f9325514ba2a7817fa7214df87723a011d3adf328226d7ddb14a199fede7b7f16c8f5f7c9fa782ff1f159d709d86c2ee504b5364568e0a7c769b2389305721d67b2ae13406dc5b9b41f9ca3d5bc4b3191f7d283e9f01b13b9f196469287271531fd9d06be651e65614bb42536125bbae10181c9a50ea96fa3215afa41300b9cc0dc94db7f40cfedeb8890ca3a66735cb0fa0a935582309c0f6c750c94e747eaf65183318dac113cc3ce90295cc6b9ef3c8383641be3f4753b2be8b94c04e3dc1c5913f0427bb3c1937054175a25b0fbeeac7061eee6eac0329cc63bc81801ee5c95f87d7f164614a86bd9e6ce659aebd62d6b73d9eb73cb92682c2c24df0ba3805e2d89a666eea11639641b8a268362491fa15812dfe5bd305f1956c80247c6c9a0b09341b13cde0bd71c2ce47084203c34bfe6f7a8192e643dd7f160a1e4b6eb89499cc814381e2caeb81d95741771c3e3cdb82c4907cbf038036c90c5216e0146a4b8d4b7c7331a659973517e53b9f148eee79d44a7432920918e91031c32834b90f39ec0205008cc813a10064e2e1f52d1747ad38a8ed926126615d3c83cd231ee0a9783f05e4ff929bdfbe89a76e90f1bb276894a98748ce3f981131e01912540080137e998142b905c7e74129ff40c96999f4870f9746a660ef291ed1277a00661e3e08a48dae53909020e845ce67adf899e719d3922e917c8cf851f934424cf359920b87c16b48d3bedc242c0e12029b8fc243a865f76dfeb2cee74f3b819ae0b206043174a188116eab0859b11b281172d404114a2888318642a23ef0a2f5e4f90bb452547a8c1154c1e9de4dc2db2c1b92d64816385448209764c80726915e01a6f8b5a4f0f5b0a0ce1aaa20544643e1a8c16c850b600d043186224085ed809c21c82c003eae6794fda9073df0369a42756b044e6a3c13022431d8e2eb28d6f122c833fc385ac06d7f108c18bfb36d784a763b659c5e56f712722e918d886cb7f4e8c3c27710a153ef2bc19d40cd6f085205ec4410651c8f0e39237a3850c59446148142760a2850c3feebc198e0e54c8821856e0040c4194f066c0e8e00d5180600d2130c21264986b74161d0832abe01ad8cda20341268df7c2c7341bef859f0025d946e332cd55638b1fec700dea0ef15ef896a6e3bdf0630821c3725e128ec087021490208c3d71a7677c70629229744c193ac6f12081c96527972dba8383bbc5259779769ee0bbc52697a1cc169f5c3eece74448c76c8fe7f2e53f36740cc4c2e5bf27381de378928005eb89bbc11b89c88dafa73e2d5bfa3651feaa9d7cca6e9c626b9aa50c6fce793e4b938e79a74ed2a1ba3795c76f2422f7fd437d9aef039d14c59bd6a66253e64bcf7e6e4d4ef990786aad5563beda92a26092ce9d1fc63e3f9abb20edc3d2e40a8bd956cf1a5e264511f9fdfa659db265d5c9a428f88a6d0a72a793a2e01a73c70fb21e3dfa88b5b194e15a8f54edd147ee7c9c8e692c65b8f1a4284851b03421454122428a8242e1101056aadee91c77e8aea4b55676936cc59596a1ad6a9d115d1e760c74d513391d036f30ad37a0754f13dda154f6715541595dc2d27520b7822955c57ff043ee5693f2b84a79299d7351aceceafdeb1555536dd4a55612558755455d56974d41d12b4a9e82b75be75cea0f7e83f0afbaf8d056cd96745d9efab1ea6c37e6b7908e3101d7e06f94bc08ab332b675be28b7eadc8d0fb89cb0acacfc7729da95e8276abfe57f1a57b76abc16cadbdd3d3bdb4782fcddde6b7c67c896c34b7096e75aace88387b8af679a551d645222a03313d08c42c6d89be3adfca27b8c6f62888fd3a7557aa36caf5ae6364f5b08e79f415e8acd14b9025cd2c6eb23a75a65eaf6f6cc4c8a51eafae4efd89ebf52da49fe01af546cdd1e07467a4f4774adb4fb00c0a464406ea5a54989bf0910b2fbdac2abe9ace6c23ad33286ce448556f4c1a8cd645daf549b31efbff9c3afab13ac668bda64b28998cb1ad68a3b39a83adbe65bda6ef242d1863fcf466ed633168b2999c2ead982e1909a595e881dcc96df0f229be42866c893a15c59e547288ecd67d0f7b463659499d7eab8144d06849f47d0be675b2826b4c8f72b250b4adcea87cb2a5e928a72afda74cb7de5525afcffef4abeae9d6ab6c32456a9a268a627d622b66501e6f69178ae66e756c247b33dc271302d798986d3cb41b67d8fb42a0dc85b76437ecae4a609e314ba26cf4df0c09e5a75b35f0d64faf7e691384793360bf588796dd6a200b419ebe1202d77037aa2377ba9416e79c9fd34a78a96859082c63722146f9a256b9a4773049847596e4dc39fb65daeeeed1a8dfb3b55a3945763eec98ea6e95445cc7d47aa3424a51b4ec2ccf6eb06a5b766bbf73ed77dea41515e540eed3b677eb1d9544ea29db2ceaeb284ff4877291ddfa699ba4e2f67befcf9ef97d7bb6e7ebf97abe9eafe7ebf97a3eb6a5eb287ff5d517abb4a294bdc3f99e24c29752708d779655d499650f9d1fabdd241537560772200762a93d7bf6ecd9b367cf07aaa00aaaa06a6badb5d65acfda9332cb46a3dfc50506667ea38162e51496243abff7defc7a2945a5e2a2d4ec57cdc1f39fec7efe4ddecf9d9bd144decbfc67a3b1c16c2edbb7d1dc78e04ad53a535fa2ecc6b76a0eebd637915b2231ace56187267267b51b1330ec468364371816bbb9acd8ed23bb8d628a9d72c9251269ee5ed725caac9c424a715f76949066fda168f499e62e68fea36d6e674a22138651d5c422bf1e935370bf6eab2d5b9aa75e2faed7ac9a9459361ad54a83c6ad95b1d7ea9825c9538f6f7a4268d080817171f947a32c93535c548c4e8ea61d1e720a39050d1a30302e2eb5a7274a22720a3945c3e01e8448d1042b9e30e4c25cc7e30426b7095268d1b385906bdd7924176ec17313701dcf163a57c9934b875c98916ed55bdfb8db5e3507bd5ceb8c4accec1eabde6824b5de98d6514a53b913a1cc59ebac75d63a6b2d61ef7352f3d40ef559aa4befd8b18fecd6ac6d6fc8edef601babb3f48e393af1e43989dc2dbe6a259503b9ad6deff29cddf1b56e4f67525b5f95737d3cfdf63ea7ddde9049d5f4f6ec7cd37cd37cd39c1f4999651387cabbf2a7ddd892b0d7c7db6021c19000bfedd6f5735a6ac70f321e1ebfbd21b75e45c3eacc7cdb525fe557cd51611c447a28a579b03bd4b9439db6deea5718761b91ec96d9ad6662b114c974b1f8bae17dda741b53995139f5a8f55734eba348afa2123fe322948fdd465946553563662e55d9695b7ca958db7a97eaa9cfcf39a95b56b635b3e956cf2c491eb3f15ea68f469f8f98ddf1832cde3a151feb0cbf54edf6a9e6b02edfc6a73ab99a89ed2d77ad1bd690abc16aba325eb9815b71e056d5adecd4e09538e8a5e2c4c22b4ce0c9e9e9357dbb9b07a78b255d24b93f5cc7d3c590eefed5bfa65ffdabafe9b02fbbb11074737683315eee57bce2e57ec5cbfd2ac11b637cf14f89677dbbeeeeae6b9aacca124bd16eb7e2634489f4c57f34903c8acd42769398adb1d55140da47cbaaad99ae65b79b6aca9075b5a401149cdc015cc703052457520861698b7f0702e3298590c2d3f7eec6376ef05ed3218e7e2a98a7d43a45294a9f14a5eaeeb2e628659eb7a85b0f06779baf696a9578976e406ec9ca51fdf51b769e20f3b3a6211490f6d19cf5796d351b67766362c36c4d5fca9e7fd9ad4afb54c032a69594dd2ed6940bba08c285179762707b3a77eb37b92ed7f128d9b95c28b902b88e870b29b8187211701dcf163d77cbee8dcdd43d2f876b58f7eed34a4ad85c6d7b52dcbef0fcee6437fef6749cfbd3a1504017dd6ed67ba397d4411ae8d451de43367b222d7b2fd415d232395daa5db06aa7a9e916a799ede656b666baeffd9eb6a6b79a6e2617beff54c035285be2bfb6a1760132dd601d7140df1b06c151d301acc8b6ec0040c84af0d3dd32ebaa80655097d4df34e32e7c821cee96dd02f03c810db71fe24a59c732b69773dda3ed9e767127025e689f0a588683795358410d4a289c8e715640c393fb1e9f748cb3421aa670dfa31ca820f7ddc87df09ff73f6f12b4dea7b1deafd6c6e6c689239218c22569e296c0db64c70e2d4d48d4ddaf96047f9060ce7dd969bc97f7876e533f0a59ccdab88468d8d848d97073b1ee642e586f04f61afa8fecd88d08bdbeda1fa287ee64361a3baed79360484339a6819ef21b19e6232a4246d686a9d0394285109d144ac8c63a2a548ccef21b99958d8ff0b387b08bac8db5e126cfacc8da70669fd81cb3369c244b72df458cb1d61a29fe73bea591a2251541df37e2235fd968524f16aa60831b88e0e0c85807bd08cde7940a7a90b5696a9b8a77faad85501d2a52fe847c3e284d4029d626e5d62d6b9362fb63516c085806d44f5856469a8ae6b2bb2659f6ad9f88ee64449f6f4fc8e87d9b2234f4a2db14a15139bd8d1007c8a48caccde8d645d6b23623db49decbbbc8dab48a0d01cba4d8d0b73e12b2a4f81b9987ddc850427a0976d18bd0846eddb2ac77eb088d7591b5793af61da102458b208d1212e313ebdbd3c16e51f103b3249aab5eaf241dd627e05e12212d831dc8ebaff71d50784bdecbc3ec0f2038f438a01028e4bdbc93483adca5c9b0e300b3afc97b79db5b124f40243ea16719a8f35e2e4ba2a127c1439dfb4846b08c7596794f9adcf71d5d5892f56a49d0ea884f7064b6f7e4be7f7ab2bf6ff1c97b6cf21e79e212eb5b3c095ab8d32eef5b4c4286ac9a1a941a15ef12e8800c15ba813de201658c87a05f60c07d1a5f7ece8777d2344104f0bcf7de1748ee7baf73bea8c1b39c3ce18b9e277c31857b27c8d6cbc27d5615820878e167e085508aeb80123ce3a0cf467414012dd27f943f8d3012183821babbdf2e7cb9a38429308e1cd8855f808ee107e32d21fa9a461b01f7c2afa40c594ddf8a819899b9dab67e8853bb73eba151a69452142bdb0588ff871edaad0eb224e9c4689465d37fa8a7daaddf7a6817882beb4cb54eb9bc19fc99a6b6c154cbfec0327e204255f3871d88e0e0503c54928e5192829dad880bce416b74144fc7d41bb1dea0f8faf54aabef199454124a09e585035154124a89a4a620412814175ca37a0451f2168512b23c379e996da5b1f5eac578c553573c457971b7ab1ec88d5a5f7fa7945053b8db55292eb8c6fb55513cf7faab73654b719b97a22edd02504ea9c4576c49d6df2f1cf154124a09d788a7a2bb55a478ea4ce8d196e2ebb1d08bbffeaed0f55e29ea295a0c5defb2244e9431c618eba5e4d657bf344e398a865d4513d54a256997c804c6329b3d8a0b9efbe47b6fc6eb2cb3a4e9141797e3713cd1c9a59717c584bbcd7b7de32bdce998269d0fd753b41e8e47a44527379ee282e2824a427111299e49515cb08c48246b511b7a989e609f92f480ac4f488e3c79469c3c2a7afa7b319e6b2da624f5c69bcc3831be0389e51aa584a8396729739f939ab725ec19c5d8b31efe7a9892bcf7fe3e7bf836af7da3aed9ad7bdcfb46cd779ca6508a412199943c8ef1fe3625b1db94e446995dd6f94dfc267e1363fcbef862668e41c59019cb9bb478da36d992b2cf96f300e35347a1f7762624efcdc7e8e1317ab093162c63d67aabb5f4f0addff2ad7b7ab03513db1e6c70cff71e3e0f460b0f770f00761b596b354b9f5c6cba99e62ef6dee1c5b4f7b21876d2e24d486ec778bf66bd636c7f76dab13bd84dc2b096c56ea37bb9dc6907e64e34eee6766880a8f7370cb3a0490bab6ddcae9e9275ea73bad7655993169405d1807139efbc97e9342697d1a40545d98d6dcd64612ff1a4262db8063669b151af1365a79d498b29c9a485c61a171444cd6ff4959a2ccf154886a46479e96551da67524a6929ab94529f93a2d5c9fe8252b5bedaad3ef4cdb228a592294d912a525eda8da99cddd34d3a86c2769154cb4e2933b39c6f26d3c69354a248495fdf4cb886a413c5962ef9792a4321a6fde0fc361fa2f53af66dda1ab8311118b524ecf39494f23c69ad4db23a133ad3d07c7fb1891e925654475324b2dbb421f9529df2b3deb074aeebbab08c2545d1acb796f2a7a91c6a239975cfe7cc6c49937ee363dfeab14f89fff9c6f673f9e92f8cb0bd5646d8a9ab6899dd305bbbf617f5567f41ab595555554d49a1d44027461dab9b50568c91c66859b1b9bfa0dde44e305229b32c46aba799603507bdea0c76cb8a4d6abdd15664ec4e2525442dcb7a33b1d840b592c8659645df4cba0cd512d1c76e2afaa89bc0b6a3b6f5a24964fb8bcfaddb00a1849a49a45474eb9856eb4cc4a2f5518a1545b4cec49744550c59140bb2b3dea8eac7dd5a2bdfc67e3969fd4cabceda3429b4fa0b6a599665f9d162aac176c17aba1b5df291edaf8b4796b566ac97d86e4c590c19d64c5f700d2b9edafea27bfa8bd84d668c524a19272862511c7430aa753e51cb4ed948254a396537b6822bc62a235c3545551a46516c847ab3752097aadd14d5133a375b14e814c86e7debc64d2e9fa26c5b6d4bf556f78d4d555515b3a1240f04d2aaeae1325454521b37a1fad1aaa75489295b15ac5e51caaa2c5b92f57ea4288a39d4a4ce60675bc27ac70f42160b8518ab6d2d4ca75ab5564b52d82b148d422de520ed3a95c12de3ca7156b2aaf853594159f6c2c65658f4291a86452b6ea4982936d284a2280a4527064c02739e8e9026cdd230074201751e8f6db4b9d02b04aaeff5835254ad843918730ee11af3b51f0c5ba2eae76d74638f71ae31746e73d7c0077b4629a2674bd48b500a960a73863c0883382b0b0bd48150708df708752ecab4b0a7b2a0a0b03c96518a08424151302b774f45fb051a326b65a92c3c26d73348d7ec2d0f7693cdc39b316e4d87993160f75c2a2b300945756370c865eb4ccfa2b94bd258600e0c4cca84b2c1b840087b20141242d803a1807933eca7f37833ac9d96f4f0edf6db286b81e9c172ce5ba40480b516420161c5a63b0805166d4fce1d8d600e848289ecd03b5c41a1a470a22e3a39264040ad4e29a584afe9524729e784d296b6ce6afa07ae310f25bd655525dea88d67ae6c4dc3700df9093720e4441d8c9c58d61b72d2e829cd6e6ca63b98eba256aab06982a17137d06563b6145f619fdeafd9f863b706e24a90ad89978fd292aacfc3699ace97879140dcedf3796ad5197aa6f33f708d8fa5b4aa33d34b1f4b3f6b0eeb4eff816b4c7663c2318931c6db1507bdcdda74aaced0cb438d9f6973d2e06d3cfa03d7a82da7ca7285b75a52fcfcfd816b4c8767a94eedc6fcc30f2ce30719298aa26e9cec0f2c035a778331160527319cecbc23d727e3d1a87ba5df9187457571c5525bb95311a19cd2ebeaabf40ee472c5724a99fbf2ef0a242cb604ff64436681dcbf2eb696b9aaa87ef594dc8d5a3990dbf0fabb826b3092bb552be76f6fe73ab5c9b773a957af5ebd58bd58bd5831a9a2a4ac38567eada864a32b816749cf06b6030fd7abbf2b2a29b79a7e3bf7fa8a8cb112e3e26187a78cfeb088f1ad7bee755d364675f1c382871dacadd5097c10c2b772c5cae529ad0f43ab2769d959b4cf59b3beb2f28ea888de20e669023d2ca8eb967aafbeabaaaaaecb57e7aaaaaa7a5517f5b0c046232ba9ebf18a577c5848fbb078471e166fe761c132a8c852a4e74b72e5d341911ae8b47b5648a34f16db4c2677f73c153c9d8ee9aba9536a695937cfe6d93c5fce55c2aaee979372be4a95d5d5b1b64276ebc99f734e7b55c73eafabbb3779ad9441ab5bfeba6467d993d7e5e9b7ea7df9fac6b2f7b7cac6bfb7edeccaba2bb6f27aab5c5ecfac9e175ffed276fc20dbe46b77375ffd54d04f052f4955558c65fcb4d1a1c6f2495b79d4480fc9db78590642d1aceb2010261f3c8fa6b3dde4e97651946e26d605b2a4eaa940622c593d495bd146d727b35b33b9129b977cadb5ea58b4aa347729a5945653661da262c87b432866a2521d41cf3d943213940eb5a8b1f77b0ff479762fbc67d90b2ca70e3ba6df11ec8547f5ebaab1dc8d4ee97563433155aaae85a220ff7abfb8c596725c6cbdfe6a61269747547f6beeeeeeb6ce3736fcd7f1b193bbb11cc8650d5edd47f4296ef22e1616007c6326672697dfb35b0f6beb71bd7eefbdc979f1de7b2c2cef0590be5117c6b778fbdb747988f1760bf8fbec16a0dd4aa0f25f6b6c492d7f0fdd4dbdeb626672a9b3d4c7d2540f5fe11700ea75777777d73af3acbf67372602d003a53dc46a69d1dcb52cab85c5b217585e01a0d15b0d744dfbfc5af6185aca79d0b0efa089481aca5b8bd559588e689738b29b5461e785dd54de7c4bf6025fd7d6c3ba4a7dea97c597d59700e65be5aca9645b0feb5eaf960a45e74343e7035beaa5cb5a9fb8c6b317b8066537266ed80b2c239efe087af6023dac3728934aca399bbde05a26dba32c7c2689e74a12912ba9cc3a326d2c65606a4e4b8ae21343b94b9da509290a12918ea1dea426fd7cdae6f9c7f38f54454f6e42bd6dcaabb6549b1445fdd5211291cb7f6f7bf33d8a8a14a98abbc53fadd4f3d09a93a50949876bcc3f92144ccdf83edfae53940daaa5a8a40cf8a4450a191a19000000002315000030100a8744a3c1609ee881a8950714801098a8506a4e97a64990a31032c410600c0102220020202033d236003a0507627c72fb8209aa54e14c50321e288d3670415d57ee83289e124756f6d824333c68547f743d0ae31a9b54a1f152568659486e6824cdeb4e4f72829715d95a9f992012ae4f0330b5233025df043a82d05f3e624186c055fe2a57b19ad7464cf986627b18f0f4e74c8c14ef147a3358d8f10e88ac32643c44ce34805e33915e0e1aebe16c543cefada326d417a73b4757c08ac83fa83b1c7a5c865b1addf62bd772d466aac5cc6edcc5d2c97860ab64e1048afa3cc2d4a4d5850f858480373d383eb155b69fa3e75e3cc7576c2a18d940cc46a7c35d4db455acb1961a72d244d3b406d90eeb981ad2f24940a74926fc467f2eea9af9698ee18fb91dc168d97b64a694babc45b5b0700c98c35a1c03d122be0bb2e5a750303ed53115b8ba2c3ac7f2682089b6bd892be8343e3955f15a5b9d354ac481b9e315825c39f7f2aefd312edb361f9b8f065950b11f7d27fb4c28c162a6191de19076fea308875d33b686bfa7954ca760f7298a463326ee653d534013a30570cd0bf755a0fd03b18a8f4dee64bbb5351039cf4a658b8d33fd34a1293e4749f61c4f2cb9aa5b00810220e2d8eb8199c20ec0bae4d7ba31235ff98d8f5853cdb8b95d56b7568daf75b2af008996f9be033340dc57c7b7c1eef32c0f7cb99007b0ce5ff7f2cb56a0c1f202f834bad34df4d93783633e3a4cd47697068a7228480f625a9ea9e730ba9018323d65837bb251984cb74d06460e12724052b6b5fd3f67682ca678116c851dd75965bbf6593873fb9dd913eb47af3f049d0d56cb044097acc88fbf1438fa74cac330911b113c3fa0235c97c027840c65f03d946fe774afe050f0a38ea912b1e17c9b83381fbea016e9feebdc740129da2e5b9dfdd39974e719bfd0314739ffb350a2de83c1859854a7030c75191f4352b9fc1e6478e0ae9ae27ff44eef585561f57bfcd971846ec713bbfc19e828b7ec04d3ba8bb97c1ddea3080bbf6766d14d304cb3bd4ca331b47e8a7e8ff2c561888b917423592748271b19e171de8337ff93580fbf35ccc7f0b0ae0f6bcc21142a80539ea79d799af5df478e7349e69d33e3f52c35e3a39f6335091dfa798349028d92801e7672a2222598b44eabc086428ae69a10a30f95cbcb8d249d67ce4bc5544a411021c59d38d65b1c01bd6830894ecf817320921c56980fdbbf2cfe00f459cdf186c1a228e8ee7d54e562d9356b580083325c371c14379813f35982b9f12f526ef85d7ab60e476088584b047aaf08aac7efa6287175f719770f84a6021c50bf1be83a43a1ee43c44dcdc3ea2fc55b7ef0caad7214c43529520b6c98709202ef0ec3e7746e2f739910b014254c0422fcf2c3398bf16e8664b1cd9ee2f0d6aad47cb891b527ede27178397cb306f8ba479ea14cbded034cde4378a4213a4511565574f2df312ea4fbe48e4a81edf199d078118a219960312f0c741c7a8738a40abcedfb22f4f873960b9e12b0a96388b2767fb96f29bf050dd148c906a2f4586136bcdba10f9e0b99812641f0c7fbc1a2e2fb26c96cb12a752c2270c00cb9e51478f28394549edd5d39b4dfc38e3c8e1df6af3c4adfd5e064f1841771bec6b056fb0bfe02c4d62729fb01f3170c55adcf467ca4e69016cfb1e06880fc057fb2bd7f241ec207e1a1cbbcbd6d3b1cccfc85d7baf8cea47f7db3f888a9654f933ce76018ec693d2689e025afb509b3a3a014801d8c4055eadfcd5ff077f41bc1c327660610bea9118722b10e208b1d9980b95dbe462da4d1d5f704f58272eb9f89efb695e6332a15f5ab6788c7e797c944c71c4ee2d973b125c14ef494bc26df200164af0e2b84e22562a4480d99820a81c72d00bc45e7684276252cab5678b0a268763f9bd66c04e32c08ca4563eb1c25c815f27c6a225c3483d3d80d5a16490ed1df77353612f371db4e5d46347a6a30bdb361940776c8c9ac4b556280dd0eac49901b37821273130a637c88f6bd21cd5ba34c1fe33583cec5ae70cee23bc72b3c70fc6818b55ffd87f3b7c4a270437c924f9fe2bfe55a9960a1d39b002a51ceb3d3ff86ded3ce3b07b9c51f7c0579b0887166316da09f391cb01192b70342ab513ea9fd0f4b6a0f8102ce63febbd93b0bfb31e392e114c554b90a1456a6c4b049b83d588859f7b19705e14b6b7e58097902509c21f5be01ac7c04c7644e0e2e1bc950979a505ed8f526e8416b4e026ee3e7531238d355834f687a11a61a9e72151f476fbb7a6d6c9ee36d4ec680c48e6d35b5039b23a23f7a222c0d338006e721d59361bb4321f3d2bdcdcf1fb3907a022f466f8bd09f712aedb227c3a4234c03582936353675a2641ddeb6fd2f85ede359990c5556aed0e5bf701a6c2ce724419b6c350c7e807f69554dd817237cba1a4ec6da15dc7b79545fbfb12e43037d5049f8854941f6d1e3ed05afb525289351c254f3167c608bdb0a6c0f47ab92b6bda0b19954fd8e8442540dc5e49e9761181a3b7c4d6a2e3eb392b0606e37bf3f75d7d992312f81432dfa0da8f5a349f999d98b30086b8bc2b43e3c04d270b90cbdead52402d0455858bd6499ebd7e0cab91e8637d81b8239822631eee4813d3292edff0ea8725aa392bd70d8d7082d32779d31b9559fe9ea3fe058d3ca7154c6b367ddbd607bf57e3d10d672e295f26e2bc4da3815586e1e2f2337142a2afcccadee46866e06798f75089f057a5911bcdaef9e877288244ccc749f6465a96355d66c870cd71153644f235a06c17999cac29fd05e34aea0c265cf4e2b14d88224bc3b0436afa5fc4931aa7eb43d04b540c0c8ac658b0e0c02c1e3e779454381127aeedc10a5e8b17942b06ec60c508da14582c50611bad7092fbfafa862cdc7ee4eef6ffd80afbd3f6f4ffe6a54e287c711bf69014c3f11542aba16925349ae8b2ccb016f3550a887324356b3d41135afc99bb04a359f10a277c05ddbdbd79d15eaa5f9b10d06836f93137c4e68c619becdc04eb8ca1ccdb6e70a59cb9760ccf89d315edecd404b03aef5c6d491372092e26598785925c3a7aa77362ff3e695cd8d94c14662b00bf0324b7dfd81970df55b421b951733732ee296db3027c4a5ef4ebea151263f69100cf8c1d05164b06d33b35ac2187740135682c100687254f12fe412462ab701d7e9a3f3006cc180070d246170b9d58ce1f0d40efc7bd8bff963a49d4cf89c6ee853c08be3e22f78ef7ed22c15597b61aa5dace8fcfe9fc6193eb34f82f7fab0ff1a849b1ca18fd835f65a1dea21ad0ddc56d2e2273678d1d7158f2e0d0dfa15991d07c0c54244f9040f9c4ec96c4a24e93e7993bfa8bf4e00c70563b5c95dd2e289a93f5af72789307d819d2dff9f054e801f137d298921d55dc3b71fefc2f6959651373428289c4d97141f8599a4cb5092c842ea4056a1823b220930e3ce009c5a4b4e4fb3ecf16efd5f0acca748c0e955eef0920ad937eda4d766b5301facbbf5445111b73809cb5a71eea77c99acf607a6fa82546359d1a6f0f699c21dfa4c6e9ec0e77672e9c844df5e4c9b1a43fdcb0d8342aa5c21c6194218388d321a12fbc34326239d2bc6f33f6aff3b15f61a9ecbaa330dfe63d81417617367749ba25276943341c85b446f59871efd5e4084e265c6fc6f0a9db85f57f85a24ecaca665b3ccdcd5309bd14e10b535de0e2e9bdf6ca3431b4588cb662272b072e8f9ff91a3198d8d0d365350975b3860fabe91c68634a9ac6e6b62fa108095e746829d4b6e3dcf7ddc0cc185d9205d48b719fd55de647d98a9c7e46917de8ee9e7ec232c72ca968ebe6fd8feabb1055c9c37eb19aeb08391b99b6ba18496db20b1318067c3d15753016a116f654fc5443e166f93a91f708ef3338a368c0f6992fee4e74461a48159fcde8e3157a6c4c7b17b7ca22b21a581ccfe9325ac2450f65eb23503c220f3ee66064d6094e466e1112cbd33cf80b8db5fb7a1b1b889b4855afd42e04c0ea05ed19ca9097fb7149e1385f69c4f68bd26cc9b234bac46466f049f1348b608b9235d04b332d9881bd955809913280c1d3952f2d3e56f18a7e61717d8fbc741b814a8fae0dcadf6916f72ef22f471ce11d75e876707ce22b43dd51e6a49e7f3d864d0c8afeab52f2be3aa3debf3352a330e1a76e3975907650e41a481194b765c33d3583215ad94c897fb74924063164bf26e155a90c065df58519f2c9b18067060538c0646bfd141f85338d555e5aa2e1b9d259935b7c1ce2becbd83e91c407c76ddf8b97c511688f756e57377f411cc2cfa3ea6e2a4b1f8b3f3ad6b3d1ae3c0c994a645266052c7aca4c479b669b08724a6bd0f6c37c7c51c2f5281870132608adf0f0cce4b1bab67a6f8d189358dcd34a0e4cbb04431d3e947ff4f34e41e898823281e6cbc4838a66c98097db2e1db152f5e2ed981c01610c94ed844c1341c56fb075453fcf76ac7365e2db54e20e857e50dd97ebcc0d8436188180454bfb52483819cdaf27c453d419d540427502e8daa6adf28ffc206383628c6ce474b741aadff2c0b7d6eb42d3f0e4435f02ac91f32c1e0a21d5be29f78e62a97cf4c90f4c78a9bcace6d579f452698dc191b00d30a0587a4857147cb04df1c69b28dc268003aa445ed87f4a98e36324f56cd09f472ab26f0f546834b1085b992130498f87b53be2c43db9d8e574365eadc2286fac12e02c63efe9d4090dccda92d6aa0bcd866e01ae2affdcfc2dc894ee2e056e7b5121642e5a9dd605d3e4e60b6918c4cfc09415a930e17c119256bbe9e82c409b0f17d60512288b3f0d11989ee57d7d8e0e6806da336d0b3d501049444d55b64fc9015e2171dd974d0c4f4f6c591ae61a9891ce93a6b847c2d0b693f70591abb582154bd51e6bfa28dba280ee74edcc472b521c32e7ec8abef43075dc9d47c5246f76bf553c0686e3cd63690fa185e76a6149b8a1bf99622b9e419536fbe8dd26162408496c34f7ff09ac1a47494313b4cace830fa4439f60ab968c325a97b2587fea9e491bf6b8a95dc23011817c2c643f84db7a8cc7dda28b1ae63a19590587f97dbb576e4e3c3c37ec1d3c85076f08760bad6baf19160050662bf346fd4cad04ca6ca98f8ce8f72d5f91ef62b14d26cf61373b3c191b96a6ff2024a4544752982e857588a3b7273b25d1e1c52767e2145808a50dc0245788be43e8f6893c5f0fe6348cfc20f636cf894f630b652d8bb1098167a8f33390924cbc722b4719393470bd1462b756effeebaa3ef89fd0529a6b4a6202dee900d87c40d3711294d3017b4d413760227a0c87eafaefe87836079562281ce381a4775625ad1242ad8b53d77bc8ed62d144f8a367d3083a507da6d2bcc9faadfaf68682de9f6e3b514be69f965ad89cf0ca1ac160b1bbd28e9376091e12a5c88afaf1506cfbb83f83644b2f9580c5d5091e425fd8c69bc1c8e362b8cb2c6428e84ad571080ecee34d50a2dccbe36d8ea8da6e9be635ec079fa8941b95743975a5b4c892b535d5cd1970a972372e2a0d17525c87466ea42010af14b9a51bb3c7f8bda87e08ce2ad0bd5c56bae024eda1f364679195c1b8e4dc2de83abfdd20cc96756ac50d221f80d3d704288e9ac705c9e9666cac3a8c226a1bf6c1ab63858ddc49149b34dedb4522b346bf6c4ec6592498d50ed6b25ee190568df070406da6d3787b8a58b6465b864f0cba294f9ca14921181e441bfeb590d8af1b292050e2b9d38bea2390c65f04241b555ae82cef584114477e05d2852153282e8c0b167707b570e2bbf29432eaf1144d11a587897f483897f05c4a10e327a81606013f26e56562e75f6593c4220236e6831a5a96a7923896625557c3f0f69f5532da237674f798bb5dad106e2730d5c60f97a4755d4b0aae9aa55732daf2c424f8a5cd1d9e0e6ab7e22a39039fb9b5bf283f7304cb357306f4b0ea67d3a5bc240504da24d0dc88e60100e5bd45e828c096aa2d60d903dbcfcccf556c551ba9840a7b3a445d2635ab46de8e1196170322d5a90a87ab19928dec45488a71a5ad454ea6ecea9a6364d4dbe54c1c7e30ecc9a7a57e9a9d38305c84faf2ef5c13384f6a846135622cb47f14c3e0cf851f5514d61e286c5d92a458ee3fa730a79fdc7bf013b9023365d6e648e13e201568eeb1dca837e6a5acd52bfc1c49ee51c9da6ead2b96b78581a63e405f3ee1f751e2a6752e05c3b1b7740a23f6dd3b8a2b4746aa0bf3c9a5aa185e447d9fd91e21c89b826fa2c8b90ff350ae201ef608d65d561e29d9afd99d4b485be4b2d2a8424c8accaafb478406c39746e2d9da25a4ebd4f66dd8f01b76adddaf4dba5f76194a9beafda7026e78cde93f0638f3cafeb03c8ac3643bda288448df6429a9abcb31e6368b2b7a1cadbd44d1adf178ff6461d09f26a3a9f3089dc024b2ea5fbd22f861ca63161755c028a39b83a3d03243c544ac2e974b1229b49ee191d8fa46d72686c39f3b90db4c83f54edbb0da90f36b6fb85dcd270b8e6646eb41616651449c103104efe878f64463b7ce0b4f0e793475cff891ea52ecfa083ed7b2c85429c067c6321c0292c1834fcc5542cd8ddf29f642ce0520b3ba6d2e25c2e89f5fd169822cde5cbb28a56057f9cd23560498800ad095b0be0526159aec3e15d908f362096977ecb02969ee91bed732f8e9acee9cbc8ab326570f370e39269c62ea1c58d747692dfb047b31a85c9460d22bd1a1f5ce5cc72da2695fb5d0f6a2355d54670b1333faf442a15e8cd438f5de2f434ab7d93f339a5ae0db7c391846364d4eaf50013927c5ee56af7ee806aa6d13e7179ab9983fd6df8901c046ff2fe1e9a96b5a1689b452f073e452144b64be63b186090ad03248a0558cd0b8120a16e3cf33fedbd39b30a14883ec5b654971998fdf08fa8aa7d1a5d3e7302cc78eb5d8dad5a4b48e00a93c2f7330f99dc9200d03013db01118776589217a8a4cd04665530a17474e27db7b06a1f345f516caa849cdbdbbf226988f7b0f5ae624a4316b72dfa371c420388bc32e715f8bfa13f3f9b301c3b60812a1f809c340aa8617734fbde9f259f4042c3cf902e446698f84163be0d4facb9257a056c992755a04f46844a7a665f10e96af45aae19f4965afb714c9fb7bddbdf721177f9f3fc39fe659326e5c59ff78eac38f48d5fd116c1e8e046e279306b1e54f193c7cb62cb1a7916751d600610a428eee175213bda04553a229d0a02676346d3941643df68cebcb4d18c63f9d4a1346e1ec1760bb3545104815f845daf3be45d5a28f7a357ca5cc4e900a848af782bffe61c66328c43529a31ba955d512351dbd76aa4c19fcb46720a070b3bd662140555f5a4e2804d53a1065076c32021cb27d6a8f18b64a9ad1f1885bc6f157de387c348e225f7177023ed16d39b5078399bcb0b192e57d0607942cf1606d2c92bcb0962767f937b897788c0c7dc03a639f0904b8e129c3bd0d4e38fc977a70fc4112540bdb6003f873c30aabfb33e94bd503de417c2f9d24f15d4321bdce684e449b7882e3d3a877293475cfc74a8dec6687b2846d550d019bacaa5f1f394d8b4f77b30d55ff0c315d5dbd54ec469808288363faa5ae5878695a94a1a4874fa3088270b874c6428836634b2a08f3a5f871c2afb37c4fb824aa754b67383462c32c4433aa313f7d2c10b413a70b2a53f206ca8a8cd5e00c92948e2c10f0951fa3c9d082dabafc3a1b25d310193c1cea15a625e8a90670a55fdb2d9f0a925052f054a4c4a2b1cec3c75ab9a9fe4f1b8dd04ac4c79ea528cc6f45f65a0dc74a7bb0eaf2c2400dd616e2fceac67789b68c3874f997fbe32c7bd051cec631b97723f39833130843c05488244f7d7f1aa4c393c457adf762d7cbdc000311ff32f3c25a4cb915429cef994b93ac240af78e6700e4f5990bc7f99eacc3bc08008433f83f07a1c4dfde86677546af9219ae5c104081e0d4ebd48087d8d83bee9e50eec92b07695ce67bd1c2c485c27078cb9a68bc83664dcfb7392e7d413a4c0772819584e6606a1c03fddfd56eca74ee4d6b59b13d339155c49dd7ac31fee77ca52d6ff2caaa691cc65b5925266f06dc8ca3806cfce721de009ae4ed0c411c4993f9b30882068dc144e41504243e337e5080b24e1e1d0c0637d28bb7f9b2dfac49a7b89a071fbc4b99da9f1660a3dbb8432c7a88c1aa3be4952d7538bb7a909898da46b710a7d8392244dad3c62df8d312a76ada9292e8eea5413d6d7d49057ed3094998cb47586fc854e58ca4359010c686aec809d211d782c25f71f19dccfe61f234e4e2122719150ab1bdb11dd4169ccec45dc30dfe3641dc05ed1a5e17718cb795c292d5b6edd52bab1ef9496eb82c4ddec5d481d40ed9a04d778016f554afb44fba7348ef6030ce6f80c74d4909d03b215f2d2c6c589fd2fcda5f9c46bf46c2224a467d004f9e34d58d8ca49a20b1337bc0408e5ca0652b323192eee3e60711bb5032e4752533cdc2caf7f1099620cd110c58981f668f5e020f40816452563e402ff9c32bd6976d29338ad28d225e2dbe94beca28d50e675037c03a8e1c14c3d5bd29a465b65d1c174d11f4afb274c449fab329bf0330585d1163dd49a8b2153550215ab20819b1aa0d845e8a61e0a6255c9dfcff02a2f497fece7b3bdc316d4638cf00f14a09bf7d471347f8addeda38988436c8a91eb4cb0b797ca04b8324070740db30910b01b6290231111666e82ba2f1ba6ccd745b4cc86bbded7819a6e31a9057719698ce9854613b606763ce3d6ba666a5705dce715ab094b454c7bd1c94249397715c8ced25fad4ead674514fbb4a6afa13518d0eb42c93c929e3c214b4ba140d93dc8e26bb73a5d9243683c6fb267caf5d46d15726fbabf24dda85522478a93921656ad42d8cb8b243f1d8af583f7ec3d29afc98a3e205227baf74aa35ab6be3fef0809a0d99f578cc173125c3ec80806722185431d62e406bf79f2fdf68c4c2afca5f4f5e486e8a0c80111a0946e5a90788353753325283ae1aa08dd5fc3b7cc30f872989640038000764f2bb9acf904965a1a258ec5dca7bacd82919ae11ec5f56d4b9a054a71eff3e90753d59e0c137b6c487186a6014e39ebfd51f30ce3c4b46bcf2845ad1b633c9aa4020af6a4701e5d213d114fb92796fd2f78c9f06cba43664a4353e9594a256e40817046cbba4c9acf6efef74f078a3aa23fa793e205a8d2b4a3ae66fcdfa2d283953369d99369ff1e450e794c67b7d611e5722f19cb236cf8256e5d6c488f2c530c01945ea0969e28f66fc4ee51de8bee3d4e012c3d16038b24d0f80ddedbb1c1c8a367df12c8756a0c96780c19aa5c810e2646c331a3571fb2afdd4c1728175151bcf15253e710afb1c2d6b2137291d22150fafd0bda4ec75d47b4c229aa0315581ba39cfeead39f90cba9f3aae12976bffc54fb928733bf776ec125a427615452b084faf441afcc5bd8100af87e84c0847ba77c15e39fb82c90242dae0e6cd7a069c8887ef46c5f3a1cab85a6819605488a6dc083cfc2886136d4b5b4acde08db3ac28130c5a05fb1699ff0104ae29b1205bd6e139cb1d70ea05e6326ff1194254d6d12530b3546d91b067ca82200a4dd7e45d995f3e4c1d49fed3cd7973244621776a1552d2b3a6bd2eabcb1fe8a55c87515be1b5222b356b95a98148659315f54d2e6282a5c6c13b8dbde855001e2fa78b8d950a9bbaf14edb42dfbc941ae4e02b8cfc390cc51ac214a68d0b3f608799fe13c365cb3510d59bcae41016ea7c9da5ae3704aa1702cf5efb666057d9f6aaaa6c9af27b09357df3109ec37a8ad2a5c034c5d7b2880aa0b2b15f4202d26b97e07c749a79ce002e3ff980e7048548252515dca33cfded4c4aaca8abdac44f8ddd1b05340247620d8fea9c464196d234d2c5544ed11794a1269ce37e2a7240305aa64d51886543c8f487944fba6b7a5d0a7777c9e4df6dbfa2bf66fe2bbe634322dd015346f42badfabecbcf15218284d1e9d5ba17afb0d7d68fe94224dac4fdf7d318386e7ac8701c3d1376d05f59159e29505654be35687720ba5da6001e1c9d1ea91c209a3bb06d1d40e4a98aa53c622299ed47e85db5db2506443785be762a38fcb0df581c42b2c8c1fdd919c7ce900605d0744ad17fe31b91619404fcc4180f458f760d86b1a0ebcbe0a3d778b741afde361b7a36ff66a998e0e8da00e89acf9c091da113eb742eec3e21aee0ec498b7448bb41c127ee1a09aeea2f7b865efbca1c4401d48894e81975365acd09e200e22da22409c515229aabf63c857b638f6bc61f35f612a8b5dbd884f60c70e52697e5ef94346a712911591c78f5329c5a145c140f9e8408e80751589c23376685196cb47776219307fc9a9b3fd784e7b8977825bf89e24b57ac2792aaa36c006393636629e1690e50e8c10b5cdab41dc60548ea7bc4bda97a2d1055ea186ce0281a89d24d63df42eeeebe66aa803e7a8821b11cc2482f3505207a4b8474051a719c215f7c446ea3780d92c6c57338ddb4090d7613f05a3bed1276ec926ef71c5526e850c8b95681d75194811ccde2513a24e13d170285aab4ddc467ea91632c87415bed096f155a2603d6ddab2b13a866ab7883ea1430f2ac191230582f24ee52930eb0bf1df61c7463f4a2db1c4c776611c673a4a0634413336097bd0c9a6259b623559e910115b935768baae22183c7a92271be6c0815e95d144843a19d938db7499e9c81cae02ffe7a17a024fc80750277af2c9355ad07f5e773ae89ddb88b2740e96597dbe67c9bed34a34642f7c26437274422c51bb12cdd48b2468e84e26af2726f29a02bf466482d6b21cc9d98c3591d68ddb8dc4cea0c874dd7050dc149702ec824d99232341981a3d8fd1216b8d85071b4dce5bc181db066578e44b62ab5973d1a70da4056e3c6d3341b2c6715afbc9d49561ff116977983ab3e8749379a4508a970f614b413edf52bb2af9656ae8f8d8fa125f7e4b1e2ee561db486489880d02b94456db9a01603006ce8213b7804234f330debcb0e67e701218386fcd74bb19718d868f56e0b7353765cfca67013c0a7978cba2202b3fc9bc984e34b7e6e6ad7b6b32f5dc68321e58dc98fdbf241483418a8ac5e2ddb579d5bd39cfe8fc7c1397523a38954edb4a64e539a947c561337d7ca826cb4f7277d330e3c426bc82e41dec3c2f92376efc7a525eb7f8d7356d57f2e64bf053aea949843ab3e67fd8b76d807679381dac9483c5ec67aaac8b19e88327085d4c74f1e260c81c44c484b236e358671b25339f665d016170e6544ab840176696f24379c7dc28901adcf2d56a8e957e062e04bf1912aa6fef72ed186e69b24c188eb29ff0f4ea7a1fa003959c62551f1c97b4938f12329baad60e94f2deec95261a97fcd96da74601ab74cb1b02f30fd51e4043c2196ea21b336ed875f4f70bc0ed0ce827fba57b724896ee672d7fbeb9c8dd122a37d1dd801ce6a9c9441525f49f9722cc93fc632ea83d0f8c74c67f2ce8a56a11c20feb8cf92883024b78d4d43475cead2672ea134f0e82dc911e51205138280b824f80dcf3df9eaf9e2438cf7ef999afabfe078ba3270ac3b4f044f084942751d72eaa5f6f6283e8535a7328eb68502fa07a085b42d193cc192002160903ed8047b83b1af3e45518c559427aac4838ab8643370ce32fa0c5935c92edb16c187f2e2cab35bffcf4e6afe7e00df5aace2b458022e4e7ed82bf7b4b297fecf81fb29bcb5216cfd8a438204161e8462d4f55b4a711aaa510e817af658f4c0306ff0ac9a339523ecb242114c339db6fcbb948b4d2224bae63d8fba7147bd71ff4f1c969fd754f7426093687d829676eb3b71c8e3d45a24ce1bf50ccdd6966ffae90812cbc76be2789e362344517a7f71b7b6637eece53c8373aa0a6288d6a3ac0b2eff5c995a18fe44145f4c428c3fb152509165db430f33854107a8ef9de6f44365459cf7f109c0a554b92b81a2b62c381b851cc2996648e2af70690e53eca4b2de0a58c17ac2ece633cc64da8018fbf3c706ee46b6ca5d7100347ced5d4efab79e42705b9af104e2622463565ec56b3b6660cd29011201e56c862d0eed154d4c947900ce5ecc8001182a6499869bde8c0c298f5b3e04991ee32086498528336a9776f637a90a8e142f2ed71a1ff0be83a6669adfd10d549fae6e9bf1f897b1aae88cc11c959d526c9e6589b195a084348d3bd4051fe2b5e449974e9f68b40d40325fa7e7c2102fbb1996cd174697d1745952d2e59c847b62fc93d761e932c6e842cdafd446c5778f70537699c358e41f2d303c4ba1cc4599073f095091f78bb5c903fd910f448906db7d22d0bd7380bf3b300edbfd9bdc9d89187bcd965a5ec2e47bc96c4b1b12a6c015ba0577e2230c4aaa1b1672f449eb17bea91ea465136c850ca5c58503b1c61d41d52d0bc5151b7f261559fad8dd82f8928bbebe1d58ee26347efd42568cf2330d4c94a9adaa4d211c19a312b95d3918860ef99e3402e39a8680a979aefa4d651726ec4b0115833e3121491d5b5ec2bdfda4e829a26525810e70a51eb390de9acd63430361cbd6ded2da21c03ca3a1d98c9f9591bdf78c7a2934f9aa3589acc92fd4258ff8904c67900b89242004f37b4b19c4e756413dc0d61fbc71b6e46834beb743c88b6d03ca3c06bdcb5c69967f8abfcaafaddbd60f325e1a73b588c9e8f5627978ce90ca63ce3bdda9e719021490c13e2e75c317b93569084fbf090eb28e1df64f40546385fbfdc51988bb68b258492f4928e738bf5bdcb1e9de83c1b38234a68174465215aa850e9f8be2fb758fe039daa9d8c5dc9eb365765852a50ab692bc3ccb6417229cb7be9f4177cca8e86e568667950fb63abf8c1cec4b5829d6b61cb820a85feae59b9007459ae8d9fdab20c25a00ca62f385db75c1b14fb613df2c3c47c19816829b5cc32d8531d00eb9be9d135d2e9583f3fd3315b34183d910d07c46d4d29d13a5cd38476816ade1e8f1be58fa88cab11d089bb26c3299efd2113954b7d253fdb84733ca5dd8b3c843e3ff32d47b4f459b45058abb3ef4ad146e0249b08c36ef0e195741c21ca315225c8c425867b1911d28e0ee9e3e22c1c2125ef461e42b459f6edf3ff3276e5517d181d5396595c66ce84843782b5b4e8e1d085df23b4d08f510bcfeecf94fb64153ff92bab24ad11da90a951417ef0ad4b9c75ad6569c3e7869467ca6725b0084c49fcf4653abd428aa610570886650a5c26cfc4f2686b2b048df6e50faf1522353c48fcd6ac561e05079424ce0f1411cbbc6b335c9747bd2f3b9de6a691b51cc896efa1804214f1204dc504a0a6646a1bddd5a80b1bcbb0f043e941ed984f5a6cfa9cc4763b8845c4504604f1359969a5c92b505d7143ee4ddca8e5839682c804aa7638ccdd3224e9a4623a9a08d579da484ff4c03503f9f3c21e28ba6442c784bda70b07b50e197f96db8255a80f28e52f34a5478eb29f1d590a935b5e21ef60534d7671227a0298456910633e4f325acec3f11005b37d810c81df445a6affe23567915cb53c527d66ec146745e53e553fa3cf4285d82517ab2e79602a134e1cd74ca34d90121baa3322438fbdc3a996e2be0469dd770413d0ff2e503594812d3ed341b615be2ced13e8205b0dd77c80e1ae84ed66f21e20e07120f28fe7d9918966977acda8fb8fafbd99a4540fd06209673ac9fac02c85936d0c655823efedcf86d89f7c7e4e76a531c8b3199750f3445f3bf73a252e4c25165c93628188ce57f846f6dea91586a5eb79db3eda7cc0afc59a536f56a5f18147e287a706077bf8344984dbb20555739a044d4ffd55b330181f66ab3e9ed7341798cf0eb60eda843d9dbf14343301479c780e2608979c0a8c230c85ced874ca5497f7646b24f50eca6b4594bbf5e81b77e9c7c4e6e739ffc6085addcd83ae9138effbdfe908cbfbe2cb75000bc06c2233fd9adc41e7ef1d627f270ff91b965c9f109d550146cdd22f090f6b9b772fdf3cca50c9bd7bb6d642e5c5c9812f1d0975c4c0eeb6b5b0ff01c173600efddcae2403745e1b8966f21b707768e4f5c524c765e4d8303f09e34f3619bebb4895170f4d9ea070c33a205b73d1068eeafca61628d328a5d5a4d3facedfbe189187b0a72860147e9685588e78d9e171f12bb3c13f2362126fe65562aa165282454b526bc985610a70c6d5ef57de9d8d5254b97bd6006c97222e6b547d0e64959e85821d609d581c43abce225b99d6492a3da4ace69fa34fa607ab4aeb2a654520d599c85792962ec8746a9c59046c79f7a4e0f8935b6e337985d8dc88991e201cf802996f56eccc6075f8745b480853b3bcc589718e7b7c4822b725a90de67ebecc81b5e3c4286d67a73b00a6938bfce2a0ab2dd0abbee880da360ff17591567ea2c4a4e80013c8898a16075e8577ec1060e47bc1021d66432e0d6fb151a26f243c046fabba90025cb32f1992ee113c6dd58ecf643eed9b185e154e7b2741f59a13e12c5b0e7512de893afca3f52cecde89addc77ed2711699d492e48ce0673050a73c89de5092e39169a0e2ec36639d29ffc2c441e1c595405783aabab805a2ec41bba67a76083327fb3610547dbbb72488d782f5787117cb39d8f4183a20cdc87921de32f892bc7a6ed0d48b067d04ed143d488d7b42bf7b81274d3c3611d74c918670cfc2e81a9bcf1a27fb52f18f53535c5add99725313a5a642d4bdb1cf02e8201fac1a8f0029a6a6fd847d08bb2799a64e0e112e3118138b5556b31455799ca60491e65d7613abcf40e0dfe93d24ae06850deec5f4a140bba10bd4c416e8e612dbc1ee302c044569dff215352e835fee67d00b467bf8bd17090681e29d1bb0a9d91220b74883b6ec3465aaab1aea4233e4c2ea6b9db1e899edec971144aed09229ad43ef168418a382428827f5a6b6032f0ca500763e41afcd84b7042cdfdef879fe712806d3b3e3b79e04ac92286faa7d1964b3bff5fa642b73595dafac9976c80b114a6614e898f1c15ca3761e03e77b7717c41e1ac342e462868dfa03d3036ba94dedc7224ad9f8b27a1f747c9d4ffe30da621b2b4c69701985fdd4c84a9190d087e03397a22bb7b7352581b0939d50a97d7a0a37d3cb0a90494cefcfb5b7ce3843a4ef4a0d0dc571934c9c4591d6aadf69cf8c08a7c3a38491e5a693d825a47515819697d573fb3b7ea5e3902e2151e6b2249e0727721a7dec36cc10dcb27579a0bde8ef03a43b51864b9eb8d15251e291930d60441387b5d7f405024fa96ee86e469f41c46e98b68d6f4898821184e0c51d1391df70a320cc245b5db46202b683fe6307196a749ec87a161b2a8897500203cb0a1df1bd0fdd36364f80c23328e61e87ce5e98e6356e97b312644af3c56ebe71b1f6b7c402c69ea8fdd99e6a2105d0158b81cae4b162f9f7578a01f540575cb4327236cb85b59a07ad1db2882b04e61ad5d0a084d579f08670c0473b2a922e1bcef5c8b115af9b12ee206f46c8284c005ec9dbb2c8d407532ca71c676bc169a6cfcc7984974d910ca7d1bf54bee301e6df630fd8fa811d7be077d9f40777d6ce6c210e0ad5c140537a93c8e28ab92c80f036db2c1abe07f677cd6d034a915afbd6026015614f0a59f945037a4494dcec7ce2978f38ec72c46dbdec161f36a4966eb440409bfc6f9be3b8e8b3d79f73445bd2258e5acb0a3ab8586798c05abc134ab0cd8ac5cdf403a16928561d3c346879c63056406a3dfd413697b7d2fdbd262ecf18127fa952eb88d5dac5b127dc8d7ea557cedafa105cdec3b49ef283aa5646431458ecdbbdde765257db6292c74e9b7678cb1f2f5880d6e841296c325fe6d79cd4ee4dde314cf8511417eb18383727c34ca50794481330a81891bdc12855b52bcb9c35a3cf0e5cba1b9912688250af479412432498ec5f9a44855e594fb664aad2c0efbd9115d8f3b5dc205c786f0f1c030782ebcd9b952b4c3b71fc543d12e5926563b9bb757f08211452e2571e69c8e83a41e1366250f60c7964f0b2d758da23679e9ad09fc65d92996a42e79a77eeaa96283e247f2ba1dd9af244a8f85be5ced7649ee867eb33542ad1bee9ae85b239430ef2d8f0aaebde95e483c9aede5d62923f832d945f698858cee3e7e826d609e55a0dbf9c79b7ec678c2785110d0e9de9093f346e2c30055c86aa5e5150ecb3a702663efa0ffae731247d4521fd99d89dce6eda7315e7b92e07fa3455b1bcf97f1ca592396dc465265c5c8b168e43be26aeb1e79b959973a141961a9ee2698c7b170d1f25e37a429aa86fc1526df8d5282c3090d2468990f9f6a9309e2281e52e265686c1e340670802181ebc7db66165c50dac4be5dc5850130a69fd27b71ca9e2e5f69669af05fa5ff7001e00ffb4284b99d578b4ee7d8077896015ade09d3d400ca3d1302ad2e80e674933f572e6f30e4661be5aa4cd3b4ba150a95c4d552356d5c483db709d78c66f7c4f94e4c326c74f7a01419e11386c209525d8e0109559d029ff9aa3e9bb956648a3ff0901d7f2836d0149f89a0b1ae5fe746439bd47ad96b25e0c08a703592c8d16e1375c0cfee00152aa88fa84619fa2509837ba15f9ab0cfa28f80e35e3b116cbe54a455e25682ae88029a47397c31f760b91736410d08716db3675fc626053cbe341182ae2ed2cfd398b792d69be0556422d2be398c7929497a3224227dc53f43cb191ffdfd30cab6abdccca97fe701b3b91584641895051f9ce23702380b06856e69e298f4d2bc397198d68c7846f45170eab6c283f314383b8554c4530caa197d853bde7371a6c66e4f8799e8a12919a5a3cc7b4a3736f1670804162e8b695b7df26bbd34fd778b123334c89b8c7612bad1d37e83e1fe4af90105dcd3aaf6d34992619267efec218b771e7cbf99460e85e71c3c0c1201fcb35782840bff09c38d83b6c170f690fe311061b92d29146b16705108bcb24c36f133b1adb2e20da882fd165b318bdeb86bfe89b1b5410d53d9fc99c8e248d37c1d347f8cce89b19ded9cccb6d78209b39176b6b7aa00907dd9f30bd95be35d4da305890c1e0b200694aa9a30e80fd5fda48976f5f2c141afc0a78e63d6ecf4b00b276139264b660ebb4dba7abcfe3645a85ab0c33cf0675a90d993f22fc39d50e7e4f236ae9e14aae22358ea338a54c5e90569479343cc3e22544946c3df3bf39f75d3c2bc99f1282fb1599844f8dc751c2e65d24e02cc0981d81b2a76ea25effb4ec1cb32034c8c12b7fc7745bb3305fb070cf3a5b8a501ecadcc2ddf665cd296dd4b2085431230e60b70dcd984575a284e80eb222fc48d5b8e4d853c170bf8d842d4bead900b1d403105168ebc4f4b94e8a2c23a92adafbf925fcd2b7360b1e8f59501cd53a40cf918dba17f29850648bbfd296016b2818700a9996e1a2cacfdd3a182efe13d2d33d48a1a072f9be48d179115480523ab8b2949ea946105c81937138974b52a39ea2a4eb9d6e25994edc197fdf9d08c4f2b47fccfa097eff4e4e03e455092fde13474bb3523e5b743c4d6b55c6813d54fdc2d76c8fa3a49f4f01defdb83bc5059d8a316cb1160455d69abc9ef72c1dddc6701eaf231bf208d3adda41c51d9e43b4c00a497b5f657a889c9b6bf7ec9793f1720adc8e4d81ac192d9aefd337c38698cdb6a78ff306e1ddbde571ceac4ca587d9e136c0f95ff1d5d027c68e3e2c156296746ce39690b7f39349c5d768e1d8d50a7d5a45d5760d3d2e423bd6765b82dd08bc9ae2792b1d429e755f0fe35e327615c2da6c5958df71e796575fa5aa68b372ff28733e5e616da29d45daf88d4f423aad36aeacf26e9bd82235228fece44539e94eb1f02c07312bfdb01d523e090b5067955b3ec0c79a1330e0e5541d31c4a8cf633d0918798c51271f32e8fe5aeab0e2fee495551b6bd621b978b9dd12a10eeb1118e9199fb554ee26a80ebb7bcf965431bb049ef00785c73c9637dbef78bf46e8b1dd6196ee2a639d9842a48d26680f28c4cd45672862ddb45f501b06abb72464b100e2ca5cafdbf2ba104a8dfa62f7d2f012849d822e4e1cf33996c9ac8107db5857eaae326daec5f4d080526500ef04c2190e8f88f5b6a45fd7931b7d75f0498891f937491cf9785f7bcac7da5543e5db9420806e32d02300671264e62ccc4f244a54ddb8494e3480b0f238d872f547a635a623635b1d69d9243b074b43c5d7d71ecb2d791da24aed8834fac4267d3f2134c22446889f05687faf8a4a8f016a5c31ca4a5a64aad1cf3aa0d357b8d3d5eb248b7f954997c8ae05295a7c71ebdb375d2e081dccbfbd26453431d1b585de6d87e2a888195472e5cddd266b0e20ce13f7c2b1dd27783a744371c96ce122f437b242990b4b97c22017af3c54ec433f141a63c855d2b56d5af9170df4df5f895b44eba94207a7b56bd7ddad0430549da6163ef102be9a6748255be8e4d1502ceeaedb51f9fa8a28e9e619e4e64ca09e90b1947e2f65f965b3acb3508d06560720d15448d594af84f3ab3a6b699d6749f910e56dff33513e10ea966be448e3a63af99afc9c1749ea3a9d61b5d4a11b689cd50a6792fc8457259212a9bcf8a2afbdb57bfb32b50f53383b164d6f1f54f3c582983c60ddecf9bc2c193c18342bd95b62865692389618695f02876125d1df3f9534d460711d0a50f24ed8927e5f54432d2ab49cc303ba8ae5459913c8efca3dc000a6548a8e5568c3af76cd2c11d75954c7bee734919fec37102a9e6300521046281750c1e45fc16f178d24b81d1880d7ae787131bfabf693f551cf3e085f3085830ff0b5421755087797054391fba7e29802d4727de4e0a07198284fdc8984ca65045996985d338850816474dff5c45d4fb5ce5f58b2804b90b653dc777f6bca1ea984141db60b1df291ccff0e538cda46e18c74e211dbe2689c68678ae719202a361bf6b011d85dc2a625088975f6c441c5977eb483df11486408fea008042f7c42e1680ace55475657f372c91c25594f6b3fc3240bfb54366c991cbab4e217d12d60bfc6380a0f3b428767496953a0d8f6cc83543607853820a23affc0de1d8947208829febaadf6d2b5c80fb02d6b7cf34adc23ebc91079949cc0c45df44ca567819faced8fa04832c5a1e8a39ad451cf7e7b3ab9d91860b1d833231a939010929b5b76b16dc8511c7485fe598ac865c728017d6518e618a80590a6e723ff174342f63c83ed4fccd3d7ddd77241cea2a6a4b42e64782fc48056e8d6339b12bb1e4083d1624839f2a60e2a4afaaf42f311f7abd0f3834fd67e5a45fd4a0c5645fdd591a704903e3605b67a109a4ab85a0e50b88d878540ba0eac5d1921cf2c3732ec0e6c3ffb247f073bbecd362a71cf2f96bd6f16e58fc4fa7c0c964bcf5c9cf8819e1d9afd68eba3a846a421c428dd519ccceb72492cc14b3054dc88a8f8096144046204c86856fa417e2882cdba168d34c1afac766f24f7e4775f4d253449f2adac7cc2ebe34c1d3aa4cc8c44546dd2ccd18d31e89ec89d53e2b4b9b4c30f4fec88662c269f7992bdcb9864e36bc58129328df3b3709a6015bf7ea0177cea1c9eb85ffc90552733a8969d2e4d3cdbba9ab2d3ed2acead80652634c31dd4fadd4155481bb4f028447592c34f581153f8d2d4c977ee51363c2cd26331c41ffada0d614a38ec88903b57566966de8657e2f3280261ee480d7a48ebced22890a22c611c5435451a40ee5d7ce7b202ba16777b7e5fa028d636c18768708aff63c159ad7514860dcb2f28fa9a138210db38eaa845e9a977f45ac8b3307d87f00682a26ce3aae64bf2da17ee9e8be31d909d5edf71ff84f7177f50c2f97378af98c2b5d7c9aef4cdd4a91acc5f44be4f8c665060edd2dc5c9721f8666a8bc8e238d3c31c696a010a0fb4d66256c11773de598a4f21a74735b7d8169dcb4b306a92cf24f4202e6ce1965860410fe22c25f64c333a96c74203bc9d629264e520f8388d1b18ad995ac80ba8c7fcf207f4ef19ddb2de673f832454260e83358032d056e60b1c5bce782cf0fdc33b10cc0ed8b8dd01366f00f29f33d1faeb5d036b2dd67661a4e835dee9316f1a219f2f8da5f594b3ffa21310f4a89bc0acb1a9f0f294d7a78f27d21cf64c47ab97a23cfdf6dc42d487be7be28e5e3dd1d1d0fe7d218c52adc077e5b5ff444a5070f6fedc5d092aac16445ab202636e9e957f70bec62ee34279d8a4e790c0b28ea1c00351c5f52ee92b6ef5c46684e3ad3616f8fc6c6c55e87f4770e1cd7d19cae800e1ab6d81f00e0166d80ff6bb054bf4b1e72ce338ca1f1c0c3507af8adf220519a60624a425e84e2272576bc6402230989a4fd1ffecb9813adb66ecfd89614398c897af27b06d8e04258d4c00b6bb9a013c02b081d191cbc51224f5acfedc2f8b0866360297a3eee347ca5a8050e8ad5c76ad37d3364395a0655b711ae40af4f4d35222580561d3eea5d99d964d981f63c5a4a50e8f5d665463cfd4f4fe28d8c76fc024794cde100b002e063ae4a6d95c343b94e995383b66835b52dabef1713da8818ba5c65348e7e1676ddc1ec25ab17af2a8d80496d34cd6e092b5cf2953348a155497cafd020f19db0c242f95676890d4119d5f88cb7280faa11b70657d6f6cbbfc363e051cbe3ea8cbd8c525a7724a39f90f2de628afd713890330ccc1d1af35ecab313fd31ecf719187578763e22ecfd181584bbd81945bb8f4bdae2a1743f2699498518e283b04b3c8f098247b1da2b8cca24b1cf4f48db47416d0f920399f8b41779f1aee2b5bf3ce17f61294c2568c2d4c208775357772bfe59488a45d402184b5aa9ae1885cdbf848f98b716e02857e8f6b6eec6033b3e871dca9e986ccbe6ca4455b9e96d830834933c4b039f0ec40453d4f90e432b1f73874f14b2d076a3335a75ca63141fb7cec37f195a109a67a9b2c0d9880cb6ee60fa01194ae9458c070c3325e53df4e98cf779fb9437b4521900ca6706aace6fb275f2de707eab86d2c48e100ba9b693c32543b125a527a363d8b685d571b0fc20dead212e13b0fbdb2d2df421ddc9fce9aa36afc9adcca9c8e3ae0cc52024211778aba00858076eff835e6d33d71efb42206be25796b0b5681517d5f005d1ec9fdc116ccd3ed6c6764bb527d8025d4f5711c8f7371a213aba917d72483df981c2b8d911a391593c76ac793149d0021c7a00381edb40b3171c29d7ea8a517fd81955a6dc935058521d1ec66c9e3c49d2d10a7d5c34773c9bce12bf5391cef8f3be4ebff19d13eca2ddf8bd6471cc7d163dcc32002931efd42f6832a596f6e9ece33bfbb7a0e7c8fd8f406c05be9f08963e42c0a5d40437d13955d34644ee3352f6e16896b4d6a625e3ac095196d3175f05d82fb0e817859cc9cc1fa25ad9d04fc54ad33623943336245760e17f610b86383a8f0ba8df96f5e11de5b4b81b4cfcf45e63a95aacc4d6069dcc995195483036c1c2222643f72a2feb63cf457eedd61e7976b4bb2405e5f14988151ce3b5b47279868c4431a4ceccc133d33f23617149ec32d89a101ab30cf7c31f2a1c5417fe0321bebad7b2fb602803a909562d601f4128ed8dbc1380025a6b17c2b172899ed3edaa17b4a0ba60e2512f91ea1aaf37ec8dda58fe01c8c6470a087e182dbe2fa5097ff559b5fb36c2ac67df45da261aa12c2e19a821f3acef606f1155c3f50d6cfc8a9f8adeb94447cab1689c0dee83285e27f0112f1b52975fa3e04624c9244e68e31746dd3d69797bf455395ce51b9fe17d99deac81ef6acfc84e737a558cb90e9de8f9d3929936c5ed68784478c4d2cc8ecd0ec5d5187a912fe2321564258d269083658eed512bf4ab3d85933226039ffea35c4336a59226e849447ba5c80addc98faeb0b92b91ddd8dbe80e0fe6a6d98d38d0037f18c538b17833abacd6ba8c19995074a5e452a3bc761047044efa286e6bd563ce2cc0be33015a6c185fdc04a50da77b6c581d59590e2af7dcde576d05c1c3a68b6b4c58207c4c751aa6467e4954f8693a794ae6192dc7b50fc38e1a7c21443b8651b9b58d02b7eef927e5bff99d618ba29651851949d94cfd9dd50b7039b4cc27348b8d8cad4b3ff4d00f6ff8f52cdafabfe9112935ac37181532d06229bf4521e8f20865f07d1c3e65b0ec812d958d4f1fcdd638b2da8150923e144c735843c2fe23e94b58862f928e7630ebda05c728e4db21e5545db80837129b341f6b7fa7d7c2dda413c761b2a859f42d286c88adc4bffcaca298a08d209f0114999160325fc13a5a5bba61966b6604ec313e88e1f9c447d88ed89c3e9ba1c577d5912878038c65040ccc990f12d0ec64910550a0d3be2f5626fef4af706fb63e48586b53d55a10296d75e83cb3f178c5a4eb07318e90ce71ba5f32f9ba60626f42e50e8fdd86c52c25a055c1c97794a4d81a40622049b379c863c39c5469d6f335f681db04e2e62f265ab58ff0446d135adbe2085e08657eb58aa10ef9cafc9344af66c0fab292e87c3d6484a1fa8476c2038f840b45b6e7c0b74b44cc91938d0aaca2db55b849436ea8d166f67c0b3d10cf519ba7ff6e2704be1c723f4d34f48bf2353887bd44540d163763f22bfe54ae2c1075847f2af2b7a4ac84337df7cf2c283f49261f440c4912626cb8014faca5ed0a13df862414e2461dba1b9f031c43848226df287e8d163ef0497922a6516a67a0ce44537a134be9c6bf24a1fb927d632d826e24715918411d0274a846a80236e3e52f71b04a20f031fd6dc0c0eda0879874f9672162c2fb144ff5bdd83e601ca6e675654aa3cef95f413b967620c961253da15a0843b018824d65688fba40781e9d5193b207d00f88fb4a2652c9ee0ce1c4a78e890935cb4ce640881cf68680fa2d0f054cfa7d09eef2012a069bd90c62c430e40ed02d7187e6c724402f4c64aee31c2bb922342efc9e268279428142a75a7a4593897a104b54c609665456a3de2842c8b01beec0093b7d31ce3ba114d579b52c4fedf11cecf672aebb4c5bc40bfbedf71c987910e1ca8421c6232940bf637d4a1721b039b17680ce9d15662184813627cee22d2c3a6a6619cb85d81d00affbd157d7b716050f0d9a1138a09a6b8a22d20cae5f6e0ecd2677580e6ee6d07ba6c35bae6bc435e31b8f6871cd202936b6e17cffe78d2ff07586f7ad818d94315b9d1f2742932ed8f16434735e0b78004e86a1288e3d01d87534906b88811d1099e9e46390e6fae8b81bd0f210f17845c1ad1b386afbf51e9f74b6321bd940517fb8dec3f79c2c2746af19b287211c2be02cc5ba821304f54abaafd6f363a8c5d1b3322cc1beae8c7fe5d01f37da03c59c5aeb7ba0602a58e0cffce6fa88b4618f04408a814d792cd7da4820eb0db00d26b287860c487497043008bc1875b300e849cb4c7491737d8b1c0ae81622cd32886703c06526a285640a6531650a60e6e28dbd0edbf06d0c1b9af3d33204f06a8479f163b331af3813a3c47e7d755150b713dcbcf8369f03274e717b1391780d29ea10375e4849dc191c8c0cecd433a7dc1f28be8b6559f8ea44c68678f57d50c6ac7c612b4388f9fedd825081b13a7f998fa2499099db42415ca4335fa89cf1d0ae5ad9329ecfc90423cbfd9afa9aad46564a940a964c20ae236bb3dea3ee5d6ed52dfb17aa6d060adb48b71261c461fef0d75d2a68acbe8b98aca8f0dc1055af9b48e05e45e496bb4eed86f723d5ed7252cbed12ee57f351f07a394607e04a774e7f26134549d6abea419b9f356796f53091150b44b0226e36e0e90ac653568003a9536052c4b086c64da8fd8c1ced5a2662d10bca17bd11bd52037cfa4b74e6af7f8c0e9c797c816d3e39ff4067feb73b813bebbbac79670d4a0af5e84b5244d9eeb9ae6699e149846dde76dae55f52489e53082f2ce319fd7298abc394780e9374f5992276f0f4321c23e2f4b4406f609122a3c33e4f7cb87d5f999c6b09a652c16eeade71590b069dd430793e10abd681d7931a0aa379c3234ac5f248ef47971273995ca442e250618904fc98000fd73a9ddab31d3786634f5c304a34eb52ab07549b733ac9307e8f6928543c391e1b2cab4234ac32a53b260a5010b97e86f14d1bd5f2085661c4d569245b6ad643de69d3dd5b66aaf464987b7a5ca5e2866edc3365a50cf58e7b946b0c7fddae1b7600cf1b69305a3d6fd4bd3c226fce14ba2bbb0eab72b8137f399e004bdc3635a9cce64084234a6b1a2d995d957b0f18db43724603d5a46cc342c266143284ef363ce960aac7fa8631fd8ad59b47216c84ae5bd1608448c16ed3353a1c8f2524db52f207b8527f15c9288e08aeed43afa9d85ec0c071f0fd3cd177e480fb2db61785bdbecd08b70adf449086102f5cdf1f3449a11013ac2064e1c9ab8d89c6c36a172df675cd2e31e30a5b111709dd772c31b72582ca47ba66a8b45bcc32625faaa51668b20f7ba1b28349716e43c436ae225f6ec438c5bd6a54e1f76947ab4636179506032a0e81f98904925aff952339f1022ed33cb11b304422db02a59031204049d8624eb50259e1697191effbd40611d36ebc319f4e52e3c4d1b51b7290e458b6541bab564e0177d3febd67eabfd7b321a754daa652a893896db5d6ab9b26603413bf41b57fa2e801fbe2e6aa6134320a193a05024d37e5071b8c0edc805cf14600ce839e47874fb6d36a31801972de63d37f93cd1e4aa38313a252aecd5a3b6d7f816ef577e908a5b00890f469b08417cb9952a6b3aabbf741a87055a9603b967ac984b91c1c8048918b7adf4dad986ba55fe091170ae1d6105a0fa342f16d671ba2ee7c153ff21091e9f324c94c8b0373d3a80e460a4a2cf0cb4b34c46b28f1f88443d31d0c5223f947701dc98f64173a24ee04d8b898f109e6d6228c17e9f87f0a34854016c0cbf331b10e53436afa087e8c9e663a0d55a6ea59e75f49d4dfc5719bea5ce795874a5127b84cb65da2f6d40c516b2c10dda4c132de6704c7be88dd09284c0ee854525f58efb765e17322344369c24251904797347f14355fec558a88f1c330723d4b5a14cff97212ee1b36f6192d5171105c7cc51d4c3472540647a688e5b425817b78550846680aa254cd704732b500a5591489488a75933f0555fbb9888ba39f65682720a08d91b461ca211963ba22530786f3a0eb2616feb6a4623546171a9fafc0c88c86bb6f862d3cd85c43f9941c7a9c4fa84734ea9a22762de6a8471648444e4025d24b289681b3063e4f56dba011a0249c7d6c9be82704e6769b04bc0a4f9de181fe6e200522ab2940c9ee1e5d1828c4a6f11cfb08c80e597ffa1afbbebb9e6d1a7253b6c061a4db7689ed6b69b50f7ae71499c78ae4267e100cf7d93fce4d993e3c1ea7c1c57a9dee0ea4a3b2793097e9971655478641ab0c7a49184d97e79a5b39fcbb264fac42a5a17584000094475a02cb98511ca2b956816d0b008bd5d826d1eff83650272f2b519b5cd70f4bfe988e1223bc538105f2e37add7c584a4d938f81094b7774cc4761c131aa809f61a4ff1b038288a5459c10d2237d13486f15493b21425e3a1cf6cd074c27193d0897dfdc0314389685e47a6089c8c10b782ee4fa9d4d0be5791337bce4c4c93621eee3550a958a3856ea1f7a5a36e5185a99c87b1d6717da7f8f9158368f43a1067c1bb88e1a7f4faf124641a4dda0c0582f64fc11d4f3d3bed533677f82ac87841d376eec8287254f035d6086bd50797d4fc9fc8ed91e21c47c25a32249a3822d4cd9806ddd482124909ba94d60c087e084befb3dcad6d277c11886946f5d1823cdd55d0a0a832f59f902078a0857245666354e77a66e3800275b71f4484d56d16be224e6c7ea9cf288f0d9c3d5b2c07698bc8b897836a8a40ceaf07763aa7c18f3c000c1b970ac046ae676e1f20c40af5daf65a6a167a24208e38c5e172a2e1679136ae5eef032c449860a9ec9c1ae2500a0db78560fbe876bcfd8b970c49299d8fda0d7de22f7141701cac7f69cab9dd8b895e14ca86c3759adfe47c56cdb169d0e88020f4fb3c99c4b27f32404d1961b7aa764bdd02fac698c444fddcf6b255074c02c08bee563e65f0b8b43cbb61cebea5431731715e0fa9863e8bbc7fc8cb6be64f421e8e809320dd5a0a1bb890c3a8ea6e427239f6d61ae3f551e62856bcf5429b15cdd50ecc3eb68129b00acf5e5bb206ce922e4bc6f8426938fe18d3143a654e2bdc16dec276fb8785d29e11920a2f3094927f988cd23f74965409426c31b01d44ceee21e9e5365e12fc5299d6c751111eb27f46fc4fcda024e3ee03308f3362c59fa03a09142b4445311bfa03bd2a1961f198476554715038f154980826566d258848306d03f11d67a49dc74f8c1799199a7e72215829b6ba8d558da86b5708f0c876824d78709bfebfa2b92285e95394dae7aa76db18ee916a0b23b2a0f93037110f15b38458e54e0cfa59e61285de884538719413f365d036dfceb7c87536adf8a7981af839e30e1ae851f0429bf8587afa4c1458e12b105730b4d1f77558a452bb39369e6528cee7f1e03a399f9cb5ab83b67a5d6039cf4a6cb2d68a36c76744793d5e5dab671448a8978d6ccc46c409e500038b4592fe729bf0610d8f8c1a4eead139e6d68061bfd6ce8379d65474a59a03fadc863410d9d87803b56b220886d3c2409d5bef9494e50feb9932b4faf4ba53294472f8cc009e05726f1e88270da9f454d4c89f8e066ced73eae66da5b0fc2ddb4a0302e2e5c58fc31dad3b6b7b401db53c2dd46997f68d30143e844f9e0355b258200ef3e248cbbb2d49e6810789ed96abd947415c2787be0896a9e97b66dabe8aaf3b003778f41b9c27f5f116fc9d30615d4763a74edad11499add7de1ad3971142eed780e83fc91878ce030b868f606ac2df72a365f9783084bed490cfc3a354ae21fe3965fa9cfd1d7571f13a572f3877ec8fd40f490306e243bd726d327fc47b0521999f7c5ab097442cd1ac2286dbdca14bc7bacf8ace263e422e422191006b4a4bc257a925aad8a34f338c71fc882433e2f3177199bec5a7d6d98cb55540e669817a8ff5ea0e1897639820fb936081a299040cb2f9f9de75dc8c8933b7e18de6847c4720194a1c531496b9de62021b882161de7d8d7972eb37d213a8d46904e07adcc885ecb3da464a8d22d63bc8bcd50d6b313ab44316b13a3ca2bf3d3ac3039a2ff4a1f7eaef92004e729c43f84a2f94d4e80b78d38815fca6972ae150245b71467144040af1473b50b6b9a10deef7103e333bd87d15d91d4510b9d3e025c159cb161e2d55fb6b14405a04193697502628949a2c9c1d9b10cab1e454fb4b0fa795d725bb896f18d56c0d042b6063b45fd69b87358a5f0dbe06519f3184ad62d92724283ba475a3a394070a46bdb18c6a61fac61329b0a7b33ab8d83e4795f9092c9110a93ab10a7cf872178dda4b1144aabae60b45110cae0d4671b549b0bb4ae42d2f383191ebbd5c21a70afcebd94ffa840488675a516190133cd729720fafc2a4e241175017341129a625e216b183d67ffc836672834499a45d7e75d015e4042aa4e85020c9d9923b56fba9f4ba47413b369e515bdd6beeabd7726a5f91b756f8762026cb6297a57c3e75d810ce869b2eab28424736afac1017ce0733f209d230b89e26232dde1757a5b205009a21f227f62b119a822557765e99afd510f95cfe1d4436a32934d40c21c18508dc4708258d6bdfb4915cb24196c9f4b8bfdde1e387024e76181c8af128358d713729103c66fd5c9542dd5d65f1f51680ddd0024b49dec24a135190bfbdb830a208f488e58ca6d7e604cf602e55924354c180c38b8899d562e8136de27e0ad0765257b416f40d394838fcf5426696e5f1967b407602e92ca9b34345def2d16ef8ccc010edc9200b5e68507b37b81b8ea40136777bb3a73a9d5d5c737668b90944103c5e608508826d2255ecde9f44e59cb6f44a75a36e32161bf2a996ec2324f37c4a0a09e591336f9cb2a27e84fb37fb26ce1b797d949f26e320ca0c67845e7480723a48217d8a6620ca59d6a9ea579834c4ecdf329f06a745418c4984056c7f13f1dbc05df359deecca41310f73f59a1f429aee7538c8a6edc7613e4245a6e514ac84fd7f911be4650aaa5cb24da978069dbb8fe7956465dc2b6c7a707840b2e1ac027cd9e28a80952ac376547f3816f274508b0908542395e28cc04404125b935382f403064178a58627e4b0ec05931dc3ce9794a87a77d1a3acfac94aa4e061d658b0092147f5847d44d349aaf77210a59038b3381bc54348b4120e450a12e4814824437a9891c5b5db9ef48bcc6445239ee0211330d47ba2d020523fbdf641a07d0b75d13531e4ee37792203a51ff6c7378e30dcccdbfc6749f4540119fa220d4744b134a947e4cd0df30dffbdad01ce1800f904735f6059800c07f9fb61c6cf73c90b12b9fd81d8a667fbc3a71d7dd334466e933f918f0bfe8136e2a32f995746bff54c99bf410acdf7cddb513f8fd8afb2d4c6724b07a7f285014cb6d7ce36b875c0602c3a1ccc3e4eb922ff898bc5b0d6b1cda026a0e784f4799a02205671138e1d8dffd6b16d58bd393e57265b6b8784ee4889b4eba5407329bb0bc8c626af366b3a32409600d209818b1cb26e50191d87478f449b7bb3c2756726644dde29002436d4b8bdb204d7691eec80696ede3c4b6a8991689da1d1baf2fafe7e01f0c31e158607104f6c73b46630cafcb946a52c89ed24ee0b2c8714296d1cf9f0e8226d59df0ba481f40c45aa9c7c943f60ce081e4c58aa5e5699d826a9a2d9478a8c542d4c174e067522b2d3a2fb4b05be1e478b77756b471078e58c7162bae3fd7c05b2ec5f5f99709df8857651249ab13646340c056760f89c316d1dfa1addc61149e848570d049e6572a91a197d29411f18312777f1d2972483cb00a9ded358c4b535ad9c3e0440bba8adb1b35c3baa186fa0c80fa6b7f331411f63f96c28e0065c4d71d53be84c53827352c1f87c51e6bce75341f8826edea1f8da25ffba762f26df72af8ebb475d58b68bb14a23b45425047d94eaac0fc92235096ca701e6680bc8d531a5092356033ad052f8158795578d7856b32718bfad978f76dbbc1bbc90f447ad75043d589964d00113fedacaec0d230073dbe22dccf0b08aed110480c90e0db97b5fcb1c78963935fb6981df7460f5c34f011e10e523ac4a2f9bc3bba29ab5e9497cafc9b0e1dbe44dee7c188550724bcc2454b97a7bd51172d1f114d8575f998fced564aa59191e9a085af283a68c2c32a93501e39270220a59dd881676914c7f349414de57da858514993ed8e840095ec7e6990a1f95798e3a36b75e5aefb36c5d8ed145bc86d43c98e7fd89134dbabf0ddb4488b0ea400b09cf13e55c93967df38162fc42a441e0c312918048c0bd01f1be597192a9dfee9c1b159f13592573b2b337720855ef084230f7a7c88f6ef8f87f851762caca2d1077a0fc55894a6c72a662448ac2aacf3349a9fccefebf646023a3fec94afa853ed8c0572daf681474f1916c0d8d181c46e3618489d7f1809d588d846ce4868c67e45bb124b6384f5937990e644c667aa27a4f4d5afe843344a6d9aa4710bc3a4ebb429289dd57932aa9f85d49c38eba399af88f4ad2dafb99260fa0c94f831f011e1debab5f7bf4b7c6f1ee2ebe879441eb5bbb90c0bf50506c33d7bc2c9ac60edd893f7e951b5dcf77e2a5b92972d4b4945b15ca7f02f15890973770df99b5f96450dba60882e5c34f422d2e3fb994f9dc075fd2c88b5704372698ed7cb6bb724670ec9bffe9b21da6986bb54cda8c7ed2e0f7d344b4b5d471b26230a5a29a0207a22ec69a4dd0e243eee89358521781152563a2e22273f28811d3e3b61bb3937b332b9f97b9e296b5bcfd63e848241e74f81afb85976d6c50558b6edc40b0cd67d9eb08889ec84ccd7e7d8365c17df00599d60cdc66bbd8636018d108a37dc9def7dc4302e3e7c73fd452e62f5cfb5756ccea53bbe359f065cb709734a69d8efd1e0913121f30d288667b85385adecbe3a34f787dbda16e4660f0a7b76d50fa49074656a51258bb2871cc7144762ecc56e2cc93a45559839100c4ac9d6043ef827335e0e4ff41f24690fb89e7b0e06d9bf6cf99dd8f6ea8adf0f45bf0e1e0f5f43c394b2641196af6eb00d371eb008a3f1f295558406418100a761a079f7515ec3764bf36fcdf2feba3aeb40d19d6ca4dcd46ebbd62774b9c97240839f1c9ce130720bdfb59c1c7bc4b26b16fdd04790282392c2aea8efc6907ce35dd1603c508743f14324f20f29275dff003f93d397a91b4885f7e482e77f8a6b2b8362d8c1d94a8a6432d57c4d92cf5d332c8692171c310faf92e0c6411d7ce25fe56593dcda13ad106815282edc2c9ce11fceee5bf8f9df3ba30deda3df5716b8c7745ef546a0c575883219225e87125a70c33bc34f1fcacf0d69eda973e32c0bad6e49d2834db59fc0515e8b3817e647badcd289c9a2b9368cf452384570ad1d25e5ed3904272a26dbe126de442a9725b067e5c1716ae859b410d6dfed032e6f92bfcdb5e0d6cb7f09f41dbe58159b84875bfdf7b21b2ee2d249c6e1da57a3b9acab6a01b64166273e3190731aea699a895378408c31719548e3f16fb6f32661a056182917fc6621edd9610132898e5afe8b9f48012b4e3ef8d2b52a93284f3ce256940530d1625ba754530acab450f6d487841ef763860f55ea606c7ac0f6ee41519610dd8bf50528b1f17ed36a5262a4903fa85677a6960263becb2d7a4a45be93b936b9a9c1ac343e610c8673e872c549af55cdc841d0fe158060445d0e910acc688455e21830b027e8ccc43976f75c82b7f16e26cf5d31aa2d8d2ada3cda739ae914dff17b058991cd0b9f6ea191dbdb43861c42218c6cd838f690da11baaebed2d5edd4a0ea1e49569e479a3d7137d85eee9adf77fa47c1305978b2d294b2a757b586bc7ef6d0ab5fbf8d6e3a23ec9a2c0c9deaea33873a6c4f31797b2307dcee555fe177791b4b6e914e40aa629f7b0a5b2aa04cf4abf2e524c340c509dc0cb737f40e7bdcd84ab09a8cd14cf99fea52f0ca5e334d3eb531700ea66d2aedff178a9bad5f47d0299fa0d30e1042df6a2a3e1f7b9d35cb50e1dd3aca06aed1db9066409117952cef21e63a6adc793b6e146660c1590a6b65838368fe1abbf13cc9308d1700af7acfea72c5081d209d034cd31d50c78903138626b75d33beca62d5c4439b4fb6fe900e2513d4eecb1e6b8d83ed61dc6087a1ea7a8d7e4113e6fdcde5acdd5d6a749c2f4f2c774c2a275fc473a767d1f70a21030d459a1455486dd5f4c7e27544faca7de608aa4f31dadbb34ccfbb769ec2b411c9621ccac5a83b97c9d3aed969526c98e9e2ff9f478c3f10e916a3e09e0b429b9fec9bf0ee6113de36b78d8f91611bec3fec0772460b321bf97c60581736de56cecdcaf6dc97b712b92ed46b7cf47caa287d8bd034063b602087c669af5116aa31b6d704417d343b3a331e1ff4b560cf486ca743b85419d0cd8abdb1ece1219c7179d2c610809061e4916bc7af32a1597fb0a59014265d85f4ffd27734326ada6f08928987d129956ba583ec9dd7c0eaa6cd5f67dc45b5e07d4298b4068161373b5ba336097e58f857010f791fdd51cb94e8b893b10dc029c068dff9419697895b8081ed14b04833e6c7b10b513808b05f9cbb15a59639b0d8fc6c84fa488575f9059a15d5d5eea59a90f960ab74dfca486c0d826ca57eee2899248f803c69accc55b596bfbcabfc9750a7bc75f85d4c9b02f9db7ad8dc70d5cc24e433a1c9bcdeb09fa2d6decfdb11a1e3c96d939095deed422bda53b7ee85b3255d2930aa352e2f79377935bbfc6ac548afb85ee0044aed49ad8e74e9f1e95da8a1a1c0ab8fc57f862f7708b290b84c2bdcac74438e28f09c981e029385c5c67e861d0b5dfa306935cdcc400e996460a981b1384e0fc183703fce283f281d772d86fe0197af77b88e7abc49c48d28c318842458508dd664871359b8ff59349711ce8e94b3fa759de68572481a120fb9de0aa99d777f556db0d541971eda86819a10a4c70847455e2c5a88771b5cf565550c718a187eeab97a02edd7d7452ba5ddd67ca7d8e91a62fdb008135e6c8a8fbafcceab149e7c3982fb57eba5ed0b2ce53d1640cd2c68c185f91037a07ae94a7a1672f24b14c17eb9c9843e0c436fb5b527892282b7d6d36234ab95d722f9a7b2ad6e3b70aecc2151f20522f048fbde3b991258669717036590814ae2f8fd14b319fa323295298e2d9221585b1e63d02a374ef1c803f017104df8031255d04b8ed54a71488fa8297874d4804549acd6df4ce24f926045b7b64981e0f233b0cbb9fc4c00be86c965c190997f7b637f09e466776a7c8b701c74c417d11b3d75d697946b058b1956b6b5c0ba1ec61165af81c614565c3767ae499bc3e8258a2fbcc6d56779d8bcbc45ffb7334a18006c71d35119f36a37cfd55041320bb8fcddcfa47d42d8802b845795529656f64bcad4c3b9c79844df80d3a13ada6f367a9eebbe103d76bbb4bff2e100498a2cf703335e6626bab79ee9069e7d53200a26a9ba056bf7af8dba7fbcee162720c308fa19036c9c80a93a7c40b778e460f3a76184b3da75050e0a55125545ee73ccee4d5fde4c8534811aaea58fdc0134bb51ab5a3255ae4aadf9d0abd5d6671972b0a7942a2f63ada9da76f71b75cd753caf6fe10149f6a21879bf1cb960964640d106a4d8139a688774186b2818eac825a59f59a5944ee34f88fb4854bf29d4b715b9f78e7f0d8ea162f17ed5941ad60fafe1bc4ebe173bda9e8a9f77f005b712239b0b88a7d302bcfe5ea2c2ef967ebed8f9fda56e9016c9719942323fc093a1f0235245832372809b9e68b6e16ebfdb8afa3d47563f3e3911ca04efe230b852763750623163083fac8ef05624c42ce8eff6c0cc96bce100b538f62227d162f5820d5d361f9707ef4699a37a991dd8c8576d644417c9baf5a11055eddb650422b86ce70dd1a5ee091e1df5bd5d7efa148b2b7cc1b288b353b1b50ce6c00ebf33c2f417f2bbe74fb26735541bc0a40ea2ab2c97dbff89d93510ac57408fbd215fc86afba56489032e083e870cbe35309de0a1350d245e7f3afb86bf3f6a0709405c43a00554f3967b47085ddb9a2c88ec340b7ac401c3ec443c704ca320767aa45e6d1dcbd58ebb5506da256ee92d76427bc126d22c4389ddc965212e597b16d43a4b104f8e8e66ac8df96f77ff5b863d31925ba7292c5dbd74631b34d11a73616ea95200703fad1c469494b5f52aceca46443dd2035620add6018565e64a6e0d1d557e09ac5854fafdb87bd2de263c6cf4d582f93dd54d7894b6bb0d32bc75380d9dd1fa8dd402d17772fc2c280b08915a1099eaeee299507700b05855e4c25f93aba7bdbd4a51fdf6c32c21cc8cbdc87925d4e2af015460d2e5bfbba61dea14d4ccc34cbea376ee9bfddf03bf60f00f6dab9180b10c3743cf9776dd81251a66d8cd34892d8288c7181bfeb84f259414593d4e2201a2a51e6059a5d3eae338692a0525d821b1dfb304e77111869988feac67ec8f2e7b2a6580f52dd5c9f73ac29f8c52c6386be5483c40586c20ac96d9bb63a58c333e8abc7b345ccee30681c37c2e82c8e82a12b899b8d701c3ff5539dadda325d9e4b777d8046c505a01cd747070c26b336b15c1a62ae5fc5682c5a0943d2ef3339719fca16dd2edb5a7bc48dca6f4ae004328a8a27093b9cedf7b5c0f62911cd943d0cbe9ff845964bff6e788d7679195953e9b71086746cf8d88aa7c25765144a356200ecf5b47bf24a4054fb0883aeb2611f7acc9890f64a8547a93584a83924877eb2539ca8c56956b08ba8fa4548dacc1970dd053afdc4a167d5969ff1e8cacccfce293cc921edfa0fcc4cfb380ffcd107f4aece84f99beb0f7736f561986ca0d4220c411d91b025af691e65c3d9e2469bc7c2c4809e1a6b1f4b836a5cc541a06ef8eeb751eb9ff11ab0597c43eaf7fc235dcbe6219ab67814cce44273f8f312abb561c0ebecdfd206db887417e6fc0934499d83861500e7d7538e8042363e33fdfeb79069e1c418440f4254f08c7becf661e899bea37492771edb741e37ab1c306dd69b603a2fa8b5549c336121506a9ef924ea16d208355dea09fe7372196c0cc53d8ed4d82dacd5957c82904254ad0377aad85fe92493f21a14ffa80b086b7e114f6dc2ec0d8dfaf44944fa98a3962afa9388a429f9c5ff5435d2d4910b4bad75f3bf474a511b3774f7c88e23f5a0a34d97ab1a5d96d27a9967119dede877b05316d3d266b8b64f409b1517063feb16adfd5e1c002f4bc15e1f1539c4184f194c8ab5c27731e79b6035a3dea4436bc2d4d1f4ef7afba1ec067dfce652324556281c167a1e1424924f054f238028ac27ad6628dfd5c640b74b73259f71ad2ae6cfeed2cccbf11528717c2eb8b038e18b85f5b71b463de12bbac8941fc09a58f24abfc5b32c080558d1eb8b21fbaebc1b991d2bfef1c91981bd5aca1de7ca47d6ea4fa2606cbb7ef308529a596a2754bcecb03fe9e606e582cceac60b96578f6bada7e04a050631d5121e922cb30690c02abbae81175741a8bb84048f394533031c2118d7c2784ec04b6a07844b345ffa530b29e072c9e1cde1cc0d618c213a1c78c5f26cdea267766f3d6d8bed3d0afbc280db033cc1f64214d8fdc255f24aadfcf66e92a7262ebf2462825da25adebcc292773ee7cf906aac175dcac37370f389afba8d92f0cb9a8f3e7879caadf9cc84a3527bb836805a262b7ae4c6920ff95144656f3bd1553dfdfddae4c02dbac1313010aa5602f2ba47f54cef5d1d63a60d0315e372241dabf273c5e329df516ec0b3edc4aa80e394148bc05e85b94a2b2e5d816685ff50ab2da36114c013ebda51fb047e9b1b93cb600a7f8323bb7c873ad2f273ce9c97611654430ccb12790eeb8a5e800b4abfd4cd0a94320c6e81c645b7c4fe6c1488b94288a8e04f2872317736a115217221ae4d162a12ea1e4bd945a24f2b7f7a1d9117d0af0ee1f90bc3a856b4165e335e473ec6f5f347f7b2a25841711118ae8728541f8db4b5588f2b777c11c9cf7ead2290e2a023efced03ece954c26b192ce9335595895b93de95fbdbf7bc93431ed17d86caf655e58a8085b3328cc71be48ce01738370cb9fb3b9a0d1eaaa7268834ce113d455ea719a1060a56a965f8259d5ed5b227d0eb4658d7ded16ab2733d1bf4d5e6595fbc9e73235291972b5b7a60e6876d0f246f5ae2b5d7dccb2375f1e46fb79b6203903f7a0e4314d7981c4ed0f7bda7da8b27d8e91edf43cb63e81c4e6fef6738eccdac8a70223301e457e90bee1cc82d7f67dc8fb3fba15682445f662c0c6cbd46806ebdd36db57001e2589e460ab03795b89c71afafb721eeb8ec7be298680a76117db1aa7f799fed661d3965448095ef50eda224ffc1dfb22c34876e6065e3d8c4fc9337b6dd2f3271ec1e897037a6c91dadd66e7244305c804023ab6639a1317c0055a519291c1aa3ff051417a186940ebbdfcc06cce85b6d274e0d1219ab6ec2330d6e922c7d38fe92968149e6e9c2859694adff3b23fce0a12876a5a838a0eff9c42e166673200e4bf02935463b580150f9760bfc3efb2393a601d48f2b12a48df7a235e8c2371eb01c68857201fb13c25283cdba443e7190816b481b4076317051cc737f0d14f596137960f25f07c4870677505a6dd0745833bf577e60ee5a9ecc58e338ed68da1674692d6d4c5a033c8a4ce5241df2d53151b0e5067abe1fa5c14ab1c4c2a2bdbad20d8ab7137d9d0aed633610e8fddd23e8065b28f4aa505a687a37a9e30adf705a119af53b4b3c022c66731efffe4cfd70ea3cb200e87802f78ee6192def8d162c2e3d82030c00eb8e65ca7e0ead856072f7aadf0007f82d24c8e8237003abc0b1035032c58649d532f5834568d32686b78e46ca0ae3ecabc42ffa9e450394395515ce67fe4db3b91a42d82c0a2d5ee199436c99f0e33c9922369e1f15204cca1bb7fdb0812bdb177d5ed2edc465d34948958a8507974078a8e2fa721785e612b13c076363069c699b0d5b11484060070a3ef767e604b448043a145f9d5a30523a4e07965970958cd726be742bae46dc4082cc4e90149a35b2a8d6c8a3ff862e6e89513ba98864ec28c73086c4301fdf7d0eb143905a571115ec2f36dd6090e897e43169bf92d7d966aa61e99390b6b7dc5b4a29a54c49060e095709010ab60cd616561696100b082b87c5437bda4fdcf1f0efeccff7ce7f5afca2c53b0f5b4cd376ec686f358b77d81dad03f2d8b183c56307d10ed60e1e3b583b78ecd8f1da4faebe6c2d7eb156ae8bcfed6bb16a17b563078f1d595b2b2c94a289143dd9424d928947508ce78921d42696bfb1f2678f3bdfb88e45b111c719eee2c78ce19d87b5dfbeabbfe18e9561959954b1d68e8d78ce1167a07564a075cc0fe2d2befc60bf6c57c69d11cf40ff9013031970216e3a336e3a8dbb0cf48f378481fef132e0824b4ac0c257b7dfe46fdcd4e4cf7ef976bec4d5371ded3712f7e0a602fdaa833a8223e48632d03a204f9e2fc01c21a7f5f6ba4e74e5957fe776efd5eecdeeedeeeeeedebcc88bbce8061ba3dbe89bbcd6da6b2df617eb92d1cce99e66ecd6556c15d3ed6dc39dd61da6c37498eb5308a6eac4244df24d749a4cd589a956d9664cb8d6ecb7fa5bb6996636d45633aa9d664c1a4af3d38c96bd89fe940fbb67dad45d6a526b8d333ff98c9bfc7ac949fea43ea94fea935363446cf0ca26a994f2373aefb665dbd5b62dfb5bff6ef783b876b70a85b608b537e1ce08dc4a1b69d3b6dbf5b66d242c100bc402b1949c6ae19926a5dce9e8470a491362d967264dd35e05a465266ec7feabd99bea9bb2d64c75e6be964df9d04dda6b5a46c270061bf16c226d5a96611577f2d9b8a9290d9a6b31be3625d5349a44f326966e9426c1344db3169b96f4db8631497a5b7adb9d806495b81257e24a349f699062932145528bb91da6c39c4ea5ec7422cd18d1d49c6a686e5721a14eeda40ed3613a4c87e93026a74d5c78e5ca0bb340212804b1402ca77ba11578e5422e276bed9ffaf6ed8b3b2804efc51d6ae8de7bfbde7b6f432c100bc402b1402cd7eb14547552aba024aa46a951ea93fae4a250d509aa56a141a16a507552a5bc00696cd428a569e3bbd2975073d6a456ac9c6963d6d0ac562c56ceac4fea93faa43ea94fb2184ef2244f72daac665e744f271f3abd139dae2d9d4e6fedbdf40558ba463cdfeffa86ecbeef84bb13f07433375f5cbdc88bbcc88b9e82210d411774428a24d8c4544b2e97cb059d946e56cabe5422914aa7fbddccf7fc1b35a268bee63bf6dba8a141957e76f1848d9c80a79b31750957f8037fe00ffc813f91e73a156369cf39b3f724595c419e0f8b73469961b42af9f9d6924aa55269be774ba5f924d22c6da49f18e9e66212097727e021fd0c673212e36f9c2b691d53b3b8c35c0985a24aee17e4f77a05457f0fdb5afb2a202a65a7cb7efe0a32cdacfd6ed99dcac9b48f6d1d4f5631691df4e95b8b7a5bb2a5127d14b743fa97db5a4b1f651f45fbf6934e5fa2d877b2e6882a7da974a3f492061bf18cc2dd0978bad3bbd4aa986c1846411593d681f2554fac62d23a24b689334dbfc05269964aa552095a293dbc52825c4a2578254ba9548242a552a93e26a57decbb1289665de99e50da2d95bea6547a1ba552099f366dc6e28e07a55daf42f05a65add5ab57af5edd61ad557aadf5a5639d913b33a73591e2d56e607525ae2472b141e89452ead429a52a29fe9cd21b46fe1146da51ea9452acd2a7f3067ddf20b4dbe6b8f3eddf0d318e1fa7610cc328add4140ddf36b96ddbb60d6d4d664e875bb76d6db46d5b8c568b5bccee24e10d637f6d57991d06a56d4eb7f89f4fe9a4934e3a69acf22fc6ff87f4217d48ff6b507542fffd0781cf75b5cad37faeebfc35e83fc2f8e853fa94d2ecb339b5cffe311366feb7a61b4f34efae28ee4c289a99bb61353397525a431f3543df74a9e9ef3f9d41d5a46ee0f82fe107f02f80ff00fcdbfc03e01f73efdd70dc7b378f3b13e67f099804dce5503c02ee56291b34b84ba14cd76986d24cf00d0870526ba38dd4d61abb9bdf5bdb596bad93d9912fd28f305a6ba7b57652dc3df6dea54fb25fb2947e8994e18e07a5512be6a470564aa1157885560ab950a1088532dc1ea376c6f4f44fdaa5a9f451a8af4f43f3f56b6850a7a7dd681b3602a10fc10c422c100bc4328be02ef7f124de84469784aeec94d24efb4a494f6967049ae6fc4bb1ed8c4ccc63760cba1257e24a34975f404861bf85f0bd1af42accf3fdcb95be1a051bf1ae46c914422834631f43c11a081f76ac0db7d00cee2a0dbed8515e834db8fb12ee5624dcb136b761c22fbfbc323326dcc92d33ff8cfeb93ffd7b0f0700363fc2bf8713001c013c09f54d780170efd970f5018039eeeb4f137009b8cb2101772c960affd7cc982eee6a7e5ef2cd667466fb3b192685ea13385482db3152529790524a9b8ca4b08d664923dd8b3b23b1ab6cda8455608c5d257bec301da6e49288fe9c15ce586b7d15508df55f7e5ca79232ab2a2866aaa05a6b87512b5eb17fa5ffbee45cb590732b99468c6b818ac522ccb011cff131f82a262a262a262a26728df8deabdf73c2f93898ebfc971bce176985efd51b5a2badb5ce1bcac11d0c43281fce0831e6128c13129c381952bfc4249672324e7a521851ca8b3aa31e27f2324e66a34e26cfc78c7ca4bc08a3940c09247891634fc286197991132fcafe1a79d166e44546464543454ec66698170d8d80c3ec1fddddf5657a3d566bb51e6ddcda9ffde3f14e5b239d6bfc1f9a919e33ce7fc518638e6833fb47e93b23ddddb3c67ffbd6c4758dfdec1f2dfd4d5d756dcef9b278c6d93fbabd679dddd548d739e74f5297bca835b5d28cfac8527f8cb2a58cd267abddcd3c47eac7fab19a78ba6ae55b2c9af00e669b54ab355554ec6ad71af10ef6a48f52fa7812b9b3452b655c4265acee7a2a25eae577529a244ad28e5cadb5e3d35aabb496c6df4a1b036ab627d5442a35b1ca1823aed924ee5a53125d098661d856b7b74fef9b6c3ce452db3673da66bab7fe8e62708a7dcc7635122b7625269ce26c70a52995689aa665f53a6a49377ce5d88f159fc8feb42440fa307dc763c70ed27c3b6090f768eaed3eb9ed2947a23ee1ccbbd9553f716702462985cf06a5588d0dbc8339454dece14f1bd8c3a0dc5f83a1119f734ef8d3f21c99ac292577db1bf11d92bb7d56fff0b7d0c9d694b4a37fd8df3018d41d869b3acdf68446c86175ffec9ea911e6f79b7307c52a1b6f7fab25cd84dcbd97bbb39a52f89b7d126dd297ec901b78049cc27884869f1a81b431c0f4db10f93b4cf6f9977c7e0a773cf2f6f585d9b0c1bd8c61188945f20f026b38d3d370f7512f6b1c69c8ea9a90bbd5299b31fd108893821d26b8a4420431c638c5de6881ca7ddfbd528ddff8f5c71db9e31f21b0032b8f27b7fb6752ea5f2bd7d1efb72e9f27e20cf0c8ee25ecf31e2e39eca177d75ab1692b376b7d0c77f0558018cd1e4a99598cdb79ef042ab94ab39ff055806f3f7219e4c9966b23e85b0c534e620c834662a66dc5576f6a90eb36a275b48e7c91e3a93d65d06b5705a9828ca25431b961a462d23a7c28c3cf2931544c544c544162c8a01a40b718ad52568c5d78e3fd54ce19e34c3d56c7f801fa01fa01fa01fa01fa011a434638064b81bbe8bb6bce18678c1273dcb52bf1c1ab54e4b2541094682e252e252e252e252e25ae205cff17ab7cc2ba103d7eae516a14d5c3579d357ecdbf578e9f9a37549946ba27d47d1a69c56a976ad627d5490dea9ef681df2f88e382dfc0bf81bb572695c2dd3bea570da6419d664cedbaa576917ee562b172d7ae1cd798faa43e1953b58b5df1925ad618048240f2312ebb12fef810fc09a2e588813f62de4ba621b3fe9e3c46bee2798166ba82ec3d05b332eeb9880219b7c6d861da007dc49d3a6d326e7c39e5fdfbf78ef36ee446dbc359639c7573222ffaff3ff222d4d1adda9d6358771b9c540aa090af2895d94b0fb79f4fb196d5f833f34d73c6385f72b175e0aee1951cbfbfb988a575441c6408c449f90d7c61f43ace9112d4f02d88a50d7004c39e2be878ca984d97b8a57f6fb3b2d10bddb2aa6d71bb2754a1b83bf665a6997eebe6c9fe6d9b06ad580cb15c68e55e2cbc58792f962c5868f742713b774f48bbf72196d6a1610d62d1f085562ec4b23dde2c8658b02d70fcfb36a2b14b5b4c0e397177a87d8a659b951bf6d8bfcd663d459bdaec12a59459dc4965a669981354669ad6615a47d64632931d866a3d456a31926aec300ead634e58f82e508a71e45ab517cde4457171bbf6b9948bc4b4ac6926694b5a9f507c84eb9e9ee188f7883d33bc485f91562957dcf9fd8830030a5c6e2771f512ef01d44d6c7dd23a308c752d26fb749225f5499436dafa446ee92f29e9f3e87befbdf9a475f4513604fb6cba6a931f8c515092a5b836a77571bb27542913a4cfec567a52db7f1b895ad814f3c801c22307c88b425217f3e5ce6f1e405060e27610210f1842c47b48ada8756c4674a342822ce071296a1d585a4d6ab2b327e0c9136315cb8701616bb0cf06477ea8547d718ace500073bbaf4fdc9dfa32779fb3f71e142365f373322ec3a6fb4c8c4ae140a570780ff9e29ce2e538a72f99555cf99dbbc781c213b773f7b9eb7c6c73d7c426109b1c75739f893b9e8933dc55ec4a642c495c85609f4d475f1966799faa3e3aebad71d5a4688c36962868713bf79237149ab83bd94b8cda0d932ddf86f5df308a39c341a0c4d225974820e9924b24d08b528a97a3942a27928a3bbfa54b023571db8b7f7130446ee462bc87f650c5a475e08e8772c95efc8b0fa99864986a378ce4bba0949d7465a86272434c8e98dac6b49892b9fc5e5c926c49e29f571502f92aa240e5e258b5e83d34ef315fa428e0e0e54851b0e2ceef8cc20d6ee7ee76f6f053f0df6665310f840f2184df1bfcd96cf6025c638d8e91e32ebc91af71de35c512cf2f5e524a8c029d78508c40a5962553049a5f71673fc34e250d3b95e6a78c6e70b89ba552e9742a9d9e04aef4a5d3e9843b237284929198c56c697e2b7dd4244d2c7d893efdb8c309ef98f08e6cac258e3b00c51d6a7777471a9a8f2fa594345b80e2166a9aa521710729a3cb157788401d4fdca1e31257dc2102c52d7187eef85cdc108863e3e1099b70090bf11ef25b92eb58999600cbde6edf4725d3094a1bdc6b95606299d56c70dd5ae5faa6920df9b304f5a63e88ae5641414141d2c6775050505050ed201bf8019313d2d5b803ca6b622022222222628188122d29d1ce087c169a8805169aa8c3b070fa898ab24c24038f5c0c0b4de42bba7dd744bee189e1a642e75357310cc35d11ed4db3c87345b45c2d26e1b7fd9319db4a14cb0e33335b23ee8aa032fdac678cb1c391b3ae488e2f749e7804a81cf14ef699863d8983323383caf4ef06e552c0f4a7879bce862bfd20d04eadc4cda7dbcc6fdcfc6c02a63f5d6ec6661c35697e9365bf75a89c65bf71d557d9cf709adf64a69fe1661882b4bd40e2a0dca79cce8baef92a85e36d2ebe7ed344444444449167731316296594e804067913577c1f722dd1acb644d63c5649a85a2f097735a32aaeb5a2501585aaa8af2814eebaa23e55d3d9543f565383772aea6b1c57a2587f50353518fe5c0c97c01fb964c992254b48a80ed2a49f2c4bb2684bb22c5992e5a77b7c6593bdbabbbb67b7c9f3ddc77ddcc7dd3d07880962eeea929f253f4b7e96fc2cf9a9719a2148a597f8825c7c4b8e3146d4775068a27ec67adf3e9fd89cb8cb3ec21bef18c763988447e11b8f7a55553df638b8f76e50ff1e0e8ec79e04eebd1b14ea71702aee06c71991292cdefe982fded1e0a330ad79992986776a3e7e0ddee997394a127c582a94726a3f67fcee6e0dcb91d0510a9b35133583cc3967cb39a79c534ac9a56aba55ebc1fa399946ba12559369a49be2baf5b9a27cee4dbd4f8ef7983fa10ff4813e3a4352df3eb0d67b610a3f78938371402a8410d2380d1510a851351bfc812ef80381b64017fc81405be08ffc792deb1abd41843f574b41a088c251e14fc4b86aa96f0cd0f07b1357fd86fee5527e43bf44f24d0569e24e4fe26afe7234ab138b867b7e53833d8a4bfd89bbf1359c8da7e146b032f526eec693381b7fb911ba756384940d5f9db8ea37d8d37029bfc11ec5d570331fc46b3892696686c523c757fdfda6cb7d0ae807e807e807e80708fe6c3cd6b71db0c861d8bfad312c6e4d229148db91d091ec9c0862698ef6c32b9492bab1f8a050432c1806ad60f159803770b3b84b6939256c4b50402c500862811ce92b47491be7f9a66c7c459fc4bdafe83471b85b65ba719edfc6002c054758a8dd3db3fadbf4b4b737dc54608056391ebe7a50086221596199e82aeae2f09a7a8dc6e84033188537f0bd88fa901739f4212ff2e8d08b7c283e1fa8871ac6e00cecfee567df0dfcfaf67a0fec21f67546f6cbf72a063f7b8df4bea1b8ceb8e2f772550173013ec42498d1ef9ef9784eec27c5a977c2ad5cadf5deea5d73c7722f7a2527a654dc5522a5613a6e3a543e197b0a9d531ec4413db4a5b728387177e6cb0cbfb706c8ac51a3176118d2f61857dfa2b8d29fb8cb000dc32714b75dd40781a91387e230ec6750dccc9f38d3d3c754d0f0d62dca75a98c61882bbcc11e56acc4598cdb54a88fbdf5d70e495048da6bff3616bc45fa20b0be8daffa088edcf35587691df1a37ceb01af4422596b6ffc11726fc9d4f3011d2787e78038c73bc13f72dd9adcad1b141a2672bc135e2b478e1614018d17182d5248c1830f8ea4191bd4b20229af2f460011841e7411c50b2c8a98185b8adca55e1a594c9982064aca082242abbb66e4909dc705412061461057fcd09343cb359466c60d648e68c0256364a494e124dbedbd770e937d6300cef66d1b65eb61640bc5641b8390bb992584018930c0f8d0febd7c3eec3f3cb30364ded15010b3f69613ca2f94b2f6766a45d9be9ec17d2f3257a8c32c665926b36c6659d659966559bd41ea789c64fb8f7b2f324439e3bae73dbaf7f26387bd93483ba4f71d56da3afa9b90209a0448dd7becade0e29535fcde09365729a5854fc60efbb83d80a707f9bd1c1df6fe718300f6f0318bbbf719f7b23f3c014feede3f5fc5687b6e612d8cd1e164e5ac2a8c53561c59b3d3bce3ab0cddddbdbabb3b74f718a174ff28b9d43ff71922db0ea39cf31f8612ff830f715c80ef23acd5d2b862bd9baa0f27086c8cc5dc96cf28752394114a2a2bc5ee8a95937118f7b612c2dc7ea7744a19b1cc33db56d36ab77a3841a20bdcfd2037f55e2ff4e783baf02e3c1b9f0963dfeb6e996376efdc757b671b638c526b6e070530c257417c9a2c37d59b3942ec849d2dbbdc2ed2187169ba4418b5eebdf79eecd7037e8c30560b217c720cd4b86e26e3bc16f62f13f19e56f6f4fddda7b6b0afdc0c35e4b4304cdfa7b632fc7c725af5b3fa3e392decad439b594d7bdc7b6fd31ed775f2e1ab8660b9b3959caa01b1a76766991fccd133662d9d9bf63639a57c5bd25ee9059a25de89f8beb9a99edc540f0fa115debc87dce3eccc94113e6f4afa0221d40221d40221d422637cd80f3b4a2dd47f1545f7c38e823e40c8169f0b080224c77bc4ef566f2b4cdcef464a2c43d27b27bc96e4e12bd6a4feab94f7a8b33b92e17785f2e0cdeb56ad520aa1a401f6836b7bb0a92287d2112dd87270677eaf326ca859dc2cbf17194520652163cc196418913164c52636008795314436f596aab543bc07ed53ee378171bb8a65df7fbb10828445b93eb8600302a8d4c5cf0d9a0f65485ddc7083b5b2112183c1168d8c0fd6c4c8fea005d5879e4c0b1ce80f3dd814384c18b8aa133eb2072b90561ec41fa2cc2a374056cd61f1c86152c56f5eae4caef8cdcbf23ef1daeac1158194f4ea87a3ca8238b533f61af271bddc02e2056f5eaeef9b4ec5af4dfe3557c789adfeeb3d389c21644c81372f5bcee6afafc27891c1021b6bd8f8aa572c202306262e8646e6e56ef9bdc688c9fd4643981957cbef35c60b85e2dafc5e6398b0602e96df6b8c106bc8182b621c8191bb542cb2eff998f9de544a469893c3823939f0aebce1830fa626498a61ad7f9511faec47491d4f76fc8a72669c3091434e155994134e2cc5a23ce82f199a1af58cc52307884d9753857e15d2501a2c42139a6254ede3adac7b53b14ec9f53d04e3384e94240a1849f8f4c0874c14ad2efa642fa3888a2fc02023081f5aaf8b51b27f6ce2382d048fb2bf13d42fc95d7495994107c57cb1832a6fc8c1ca29ba0244ce2696569786656000d144fedee33324717755e14dac788f2b4ef27f9d6fd941eedc0b17642ef451233b4c6272d8412b59b2e70e66992277f04b0588b2b4c006186488218a965fa1b7e595e99962a58dfac883bcf32fd97d08ba205008b2e821063ad0810c0eb26875704b7620645104252e3060c600d31a638a4c2345a6f9d3a643f37a48d4cf6c3a280d276a5a3ee50e954fff70c8a75310b8c8a7318cc8a7376d3aa7940a5e6e04c3861c04f5b446e05274831eb814dda08756ffccbf0e35f32f4b9e9999f92b860f79e65362909167fe6e3a339f65d397361d53c472a7e54b45be5fc514912f10c0e4fba44de7ded26f9b4ea9765a26e50e95498f44ca91495b32e92b186332e92f1399f42952184499f402020f32090c1a64d26b9b0e89b5b5ae0172f41ed5484cd68c9a64edb34d47bb3cb6e8d1b103c831cbfefe008c9cfd8302c9442dd7dca13290fa831872fde7835c53d428531a01903b2d4f2bf27c15f5f0fa2289eb527c90e39381dfd5a7645496a1942a8bb2be0953af6915704406185a00bdc00b2674a842872c70c029476ee881872c6650d1828910323864875e96f765f55e4747604186c0d42f59ad3bb815a77c8583621d70b03ae860611313c3de57d877291cbeea2568c8256a68f583d45abd680a134c2c31e68c26575a5d2aeb1054d28108cb850a92a04214c30fc0b440496bb58387fb72ea61d6e34841dcd92c40c80368f71c75b14755b27f4d7d0a0ba33c93dfeb4b0d4759b2281c42d8ee459e51aa0198182854f233ca8d550e80fda557710561e68152a6470a26c470420650ab63c527b31cbc6c190365831242a8c2c78a314568398410fac05bae239bc8498e1565802d5ca8a1831ecabc40084d5489e2431010354832a695fde8203bce95f2a2ea5de5c8b04c56800cda0ba19c9ca3c5edb4dcab1cdacbe2005d58c9d595fdef2bcc142f58909d7eb1cf867ee9734aa552e9ed856fdf04e9aca4285844e020488640f2e04df6482c1ed23da12848d80578435bb04f9f48f65b8655fe1b117be4886a886908d51024431099f9ec91b47044866ed1473283ed6ff8c8a3c06b9500dec0ee0dbda3ed5ded823744903ac885640822d9cf478224c33d05dec020fa1b6e2138856224a5c7b0ca2756395e813e361f8986554eb1aa57988e8f0c21ff88c444ea10124f6b6255d35f613ea58f44152756f50a1449c5aa88a1588a558da154f84f18019411901f972c7af2db8894f08537ee46be82be71ee036fae18ec44be82ff8389dbf00bf67a558e33eac9f0dd05df81e07b0f7cf739ca82b0cf06f66b77ad85ecb37911b829e8e9e981a1351e6e877a8d0213f20978b2639503723b74828b26f9bdb828939dc8efc585948c8af5e98c5e32fc27450f5086b89632e984dc5dfb9d967db7f980d90426904fff9d0021fcd8c14abb9a67965df52cffbd1f11dfdcb9ab103e612dfd8adda2226b2bd91289db66c5daaa6a1c8a937804acbce30f71ecc2cb0b8b2d2f2cace4fc5e584841e5f7c20228a37cd55d64552b7015de94c1c2a762b5422656b5c2910e638a91ce2da8fa2d98d6110ba6651ffbcecfa684c4fd5fdd54c6bd77f37c25afd872050cf2eb0aa3fc5e577cc927e4f7fa729433cb0a900d96f00107529069d11c9f273faeab29e8b42c2bd7c2ebbebe1865f814e6095f72f1c11f6cd770a3c9bec7a91cb0f3b89d7e2eae9aee102381482092ecb1f8fe2dc0ef2188c0efc73824f1fd79b0cf4635a37f3f11c747868075beaa562aa594524a29a594954e29e79c7302fe31c347e2fb4f4ca41fc347e0f7bf9258f8905335e07d7ff3648b73630a2ac773a22749ca86c5233b1019a31910420871a7c5760d57e51f79ba49b882ca508e0fa7e0926dbc47a7c3461e91fd3529c064ff9b8229859b0229852d05eddfe3f014eca790a580a550ff7d0e4f81fe7b96a730ff3d0f4f41fefb1c13f72a894b6d42e0cd1078c302bc8137f1b70ca1fb182c168bc5e24144919c223945728ae414c9d9c1430cdef3e311864dba770485828800df218410e6a0701cb568b843de0d848fa3410821cc41e1800e87ba368264628dab9a1aca35bf7f4972e766c2e4501021f723e3339774941ee4defa5f6ff11e5c1a0638e40308459ce93f2c32fdb9e9d0fa88f28c599048628504132c7cf8c1072e9a04c1a407b9b261a576a8fc23c3af6a64d843162552bda5523484baef2a6e89f5fbf6c3d9400fc0584207498041840cadeee617021b2806d9775881c61735ca58e248072d7757cc367013361d0f729cda0307972772670345ee72743c80e8d0d3840e4d64d94587a21da8ecb0060f4f00f190e597b0e94828332891e0c389ec5f97f8208734b23f8e5b0410372023c88a2a3cc841abbbd687303bf4208a9e2a4a321e82d0c23ed5a603fb4b0e64e4c024fbdfd874fc0641a58e109f962c397a64f9f5bee08b2c3ff5234496ff3f41780111597e6a0569d0448dccddc6a603abace2556185141714e192c17545964aa8c8f26b361db97a541c01451150a010020e524021825ea7a6d97460fb0087962e2de041172532242993fd51cf4343992c56a0249186104fb4ba9b5f142f6041183818c14413657690010f4e53dc2e1597c89d967d4c76a1244564ffd34d418ddb5529597e943fb3e9c87a7375328406dd638cd1b4e9c08812ca1d8e00fc48c2841b68e872831238c88043141cbc60c10c7c8ab2fcbbc506a5920f1492491492c7a0082184f5be8d1c7d7290e36b9b4e240096a02488ac24c9a187186001d3832e6828d2011751092646a9a7ddfe620317d93f9b8150e64fe4619b4e7c69a54d0ab9cbc1434bee80742f8b12b97b3de40264f9f52e91a5fc9f418a2c7f954396cfa2a14b969fb343971ab2c8b28b0d4da6804286a533cc90fd671d40105e50e9418b933384e0715d09130695356878810d53f86083ad36b9d352c8fe7548861864ff78cf0042154d5031650a233e3085124455e4208721c6643a6439450f5564295f4807d174b95d2a85c371624bc62e32d8905de600c3e4e7871a7801c60c5af253dec3a198220a1159962f44fe03e4136141d6ab5d58696220a35e0268e912830f0c2e1a7a5cfeb3e958ef61d50aef0892ea0790b82b41eefc9f8ee476648c44ded7a7c0fb1a330a9e27c71c354323ee6be08c31612441849fa31c3ca00c1ca888026587306268fde0a58232ffb5ea13d2297011a15f5314a756ab9c1c0a660da1fcb6e4f752a34c7ea96194df18f9bd8a80c6ab4343aaca7bc4673d1c17646f69bdb72c164b08ecb8a900330b456c09622a82d5458a183138f82284154cbcf841117ad0a1073c8019a2c7c70588d330dcd046efe895e97927748faf11c5145638e1051722b4fa53007154c0e2e42564c6174f5c0001083ae0c21b7a4310c386339cd822031042700102872f8220baa1cbcf46643e9df2bbc705b44de0b5e4fbaa4b48dc1e9f29d16bd10abda535bfc8007c3294898f744bb5c244427f62151499801984f2ebad85f9f4a6267ef5fee4562f3916bc311d018f0040175d845aef2d1415912fadb1c61a6bb422462279720b12ab881ce92dadf83cad23dc9f05ff204288c88ff8880acaafe0cd107f16dc3f881008668a10ee5d06e268f683b0efe829a856d890a8e677eb48b74a59cae0600695263e9081e7072a43cc1045164cd6e00189abf0c67444f792ad7b7cb93f34cc00436e2dfd2a5c71db9572b9ab9bb8204ebfe0ddf4f790fb8388a279bb54f339d5fca79a778dfb19e2945086151858104311310ca1d58f0c201011841045d080c807ad7e77ca3990bb7c26c98538dbf70605331d713f88cf4929a5944e2adfdf6a5c97e93aa881e04ddb22a88d02b08561ce89dbb98bbebbbc47edf756731641e518f1ea6d8edf5445bbdad5df40fd6fa3406cb5cb34c3e5e1c1182060a0819221cc6008ad9cc31765c270e1428a2fadfe5ff914520c5f609821bf21e4f7a5c767855ea2a55a21ca8f58f5feb53622f1253ea282725b2978b3f596d66bc5efeffe20427c5542e279621023ca0bd248634a182b1c68c1186174f9628a90101c4bc8034461f89043183142d4d0ea6701e288408a2c693c410335b480d1ea0f2224ef58e2bac31fb447851054d440b3c2be975de51e83e07b942ade83cb970c872046ee5c4a8636288d1a72e7568630041dbec7b6b0bb9f019efbfd4041cdfe4f1f85263dad98fdc6ffc1079f73e112a57ccfe2abf85cb438175fc52ed525c73f5d71e34b97f7882f8120ceeba4957a2fee7a28b7b4e242bec55fcf4710991c795ab1d55dc72b2b377e1097f1a34bf1e8f167f49e08fd8aec7ed80f1b366cd8b061c3860d2397160db75f76c3860d1b366cd8b061c3a70d1b36ecd686dcc77f65e5fa7b90074969f55c0f92ef3d30065d914db2bf1c121282b2c997d716e96a2bd205a3e4cc804a225d4be2f7b768b8397c35e4057158ef468ae368efc6dfc86868e8cb972d4230270785c281a38b41b95fb691d1d15197c9ed337b2618b1f304ba55ff1de59b2be69cb842dc10431279328093a8dcd3506044333d5cc84084b990a04a6c41475bf0f0dac2064ad01922284f1cd1854f931db478a81c31031ba411c4163c00e142e28506517e2f34bc6413f27ba14125c7e7033608b27f029cdce61a46edc715f7fd8346f7bd85343f248aa0447e4552774c8f3f90fe21737faabf1b486e20401ca70e2d60080640804650ea680b189e972131b9c974f7e67e1c684c49b9bb2f20081020b9070a4dcf4b0b3153a800a3084c66bfe73d8eb8fdef3d7eee7f3ec0b8afd57f65c9f3925f97237890ad6f7ec549eeee6e87118acfb7228ededbcac654c6fddcdddd6d43dc71e5f6e46a8c31fad75964a5e3b1e622b0e615c479af4c510f7e4034c54916381c19a30b348e70c24b1631687507c13eef3182ee22efbcf7cfa66b9bfce5b54528862faf2d42afcc3b7a4640385cd9dba78becff5eb01601b6a18cfd12be2784e093fb85d0b3a3cadd7183db5532b4a830aee6ab3ee18cebff8a3c2eb91f05a0db158088fb72f75e47456c53b4a0c1a54512318811bb5db7ff99a619473f9ea022d492dc6bfd03fa873f97125ac7195c6a785cb29e2f40561cd540ef4ac8fdfddf6f83c5aa04dfe27be45a78dd9bfd6622be1af280ee7ffdd5c583ebdf6389dbef70c8ed02c395fcbac02025773ab2ffcb925f971ea36ce1d605862e301c65777f5fe4ee3e95ba17c69f1f047e2cb2d29192ab191659e57eb83960042e4537c8bdad6cde579ee4be36c5939798206648b2458b841ac25c0103a230881043cbfff957ffc88319553209f9bdcce0e13dfcf8ef99bc08228992315fb4b0020c0980d2a832c519546690c47b1bdce7ab94afdeff1a5cd440073210a1c4aba8c5e384083a6822872fba28d1a1d57ffb534cd8fe519f8ff95c0ebc81dd2a85010c380e083c7e67933b160b18f0152401ca35ea58f121995b7d2e94a2678699bc82164f6cc11f025d985ccc0f335dc08853150af3a439279c71e577ac8c0284dfad320b88d1956fbb4a4cc4571efbc7ecc9ef57437ce54120ce0d0c5af4e4a0250a1d70d0822f04e264587400258b1761fc18b5e0b3208e05b250820315232d344869c12ca068e265a88c32c828d1730b6b82f7f5733552733f1d8d637cace2ae48c5de7b15764bb9efdfb360102c121d844864f884f20e8c30c618bbd67b53a9ffd5aa63e52e2737ee627d4f48017927cae8f207fb9e8f4d7bcf66ef61954e19dfdddf7befbdf7de236131206d9acd26562abd9a2126bd139c942dd52165ffe7e391686ebc6ddbf33165468a3142edf97879236901ab46a864cd9755b96468480000004000f3150000300c0c864342c168988772a0bb031480107fa448685616c9e45190a318320811420c10000180018111da24019580db791358418921c4d7259cdc7f40661ef97383e9f8d7ae2d8b08f41f18fe487f08ec477d8c4581555880607612fcd81aad1db5690ad6e065192d032838f04a95bf0cd0bde043ca8b26daf83821c0c8931d1abc6aa51615ccc5b3ab44378f1650eee0230b8e770bae82afbed0a3dc7ce92b92a56415813e41b1b36b3950045dbabb234aa4c067f2e7884462552fc8878e31d3b1a389aceb0467339e712f80a53b716fcdbc74b39cca69308205c254e4805afdd817c111fca12f6a06e6b466b79e3607ff4cbddc0e003ba1871030f7a60649a91e0c724a0feafaf0591c60ce6ea8d6522b31a5ecb0afe8674788d7b08673f736a37b1e6b911cc50301c80551463e3c1e0e2afdc201c02730003f8657b3685adc17c6a77012ad8e0a7e737a82da3d26e308343b5cdfab0040b1f617b5210c2b4ed2926a2433db08cf409b0bce456d0d6982e14460d4cd22abad12038520062e3d754194ba9b29439d891e58ea20ab8b894642078360e6b5fe34659f079853e600ded5ab5f7de2972247b6bb244778a22ced2e0d1278386a5e57637e097ccfb9cf70901f12a06b18e8df2edff9b427ef3453d3d101d8895edf8d709b777d2d942f303346283a2a133dfec0c9d8f6a0f8432ca8da9326ac7afa1289c6ee13d81cd4be73d08ef1d9ce14e94079224c96ed9a7d481fbd645d86b91a366d9ae2f62d8304fe992dedaf9da576de3eac53e4d1aa1e38adcb6ee32d496c5fe37fc0135e4910eba16412ae07a986551143bc54c472893c34437980517be744e6bc51715432a8043aba5a8e77dd8211709b1451030d0154c3aa49e38804e1aef0e74ca85c45778c17e26f7e14c9ced2ae3d373a45cb8a32d02bf93d84e67a04c8774506a3b73f3bfe00d0ecfb5ca21b950d498232b2960cbabcd3286cdd51a3d5c622b52d4b540e14d7b50d75c348fbad38821321d18f09100367dcbd423003ca9dbbb3910f03f02fd93d43bf40571c694e2e380137aca5e09a2cc7c87cb13bd5809f902fa48518fb6a564b9777075f75455405057850cb784b5d5c2430cd7e614892381b5042a379f9e49ce97846ba987b75594cc0cdd120f9401b15986c9dc87334d2d165299624ceb36a2e722a5a97c0d9851db19899273021949437b5196b4d0e24eaafdc85fa6f636b7c62a2a3b4e007391755d28a9eca1c7442d0c8db44af4308ad6af687296e10a7f1579ba98c256d3ce16bd3a2c36ef4a96d0b46cb369387dd4bcee1c3f4222363e6f407ef1c2766cf9d507fc8e7dd73f4254925fb7daea9b530a0dbd5511e4429d657f4c9ab4b321a09ae0ce8f5061b8fed60cca332ffba0307f811ba71ddefdb60ca480c254f398af4fafa601bcad4e70290b89da3eeadebe9b1bda28c70df678082ebe17ce267d680eacf7e902bd62f572801630d6114c5a3730d9a603f5b0da752985b2e7765540907879b1630c3e072d15b155f25d2b03d730ac67aa22f6a93c76fcbc57a0d25d6180e8451d17e5620b2acf144aa8b0eccf5a74c2c963560b3c4e9aadf53dd7b6dbbf65dbed6a1e7eca37fe76fe6dbc717d6ef842d3c1dd711fd4a0b11df1cac994efa800822885e3a5595473f8a20ccfa8612f4601154d2550db81493c43eb5adb81f6081649c048ad76baac1e21a1271e6ca36eb5304e1fa516081dc99cbcbe3f9d4c3f06348158438fd68eaa8f9c948c24a10fa7d2b42510c1cae2a8588d024a4207b3f9bfef2570baf8653b2d6a5948181db3a48e34a7cb66706d294ac142619a588762068570278f91ad13a7ee0c0b679076b7f08a3c89b74bea058bc5c9ec7261b1726c8bc11cd8ac829b8fe71ac3e4c56aa4358a03974bb397175bf8281b1f8664841995e77924bf4c2908388f8640dc00da2bfbf71e58301831c26ee8b736c1f2bc5def9678911a7d4200e380b4910bac5a41e12ac00e0e1862708a181229bfccb1a898a041c4b6afae4bdb757584bc5d471c63164959ea718b9523039a24811e45d7c2289aef8858b20f8c1f79f4401cde85407cda6c56bebc9e971bd6e24b6694582c870bdcfeae163327d6a2f730a7c83815e48a146c584ee567d11170b0e1a29961469ce0697567f01f652b166dc52b38e493dacf690d5b0538c49da22a77a75c3826fca2ca8827f966ead3497c338c9d916b1dd148c089ecb32215e98be51cbea13486836382c9f4a8eb8ccdd6fc84ab234573325d6fba4ce35064724c3e858e1e47957e498d80432b302d8ca0a6992528efd2750254e421e2d523b3fd1f14d0b837c8b540b810d8bfffddfcb108d1d3963d03fa0cf6ff03b1ce007f46f4730f0ab29ca7f1a28ca6fc9cf52e07329f15850cda732ac5a42824de98900141960f0b0b9b22a20b2a14c121425d14d7ea1b8b6e7288d5bcb1626317ba5459ceb1844c14c320d28416fa6ef49b7c245381f07127527d212783104d3569926c8c03b089a0bb5af237f89874d36a356f48fd594a43f10afee8eada3b1becc342c5031da04ecc51fd4612f2c5cf8373510be51956fc37f1708b48d1d4d9dbd14cbfb9d0b51e25854885cc5b938a047dff48b4a3834125af832369e291ce22eb313950c55bca4c4dd219b6082827201f4f98662cc117fb2513f51036d6bb85261ad7f8dfe90b266df81e61c78cb50cc81c4f8552c9f78d408a89f6ae0192b8e61c4b8ffaff089b8696af79703f636b6f1db5a9f2c8b06ba0e779a785f4e1a9132ec081619dcf9df88a1178f1d54b21251c4d8689d787223b84acf20bf623a40ed0b349b98074e1471a1065d01bc627331d783a3d01c462fbfd9c1f9ea2ef34bea643ca0fad3b00cdea90b3c5d5a7e8fdfe88cdc3d68fbaedd23c699ab220ef6d9f925405cbdf2d163e9885c778458af1bc1e74bf7730a9acbffdfd4d00c9512d920804c224a25475dd8cd3081db95e6c96138afd9a281ddc9887c9bf30c3170ada417f5c5a64e93a4d00b562bfdefff25e576aee21370af7a5c088a570f479578ce588455eeff7dd8481b98b5601c71db1777e1d0c2bd34511a14c2da5e1e1b348697a433ac7f09f63aae796e0286bff5c77facd374a531d6914469efa0558169265b7db63dcf77d1b5602581ed632275341b80198f4fdcaed4c53d9293dc759fae6e61fbf8b0f187a901ba6892c53e629d5cec789795c9a958c74f6ffce2108817bffd30f4305d78ecd11f203c022f6c8b7c08e1ced33b47ecb43d29a567190457f7fea6dcd585790d2a457fd6f898e4bb5349d6a775ca4a49b9cc1c79e51553744477b69c62250e5d8ce119e8d60274ff9cf37fc27c0363c2b945fab92c2de7b924768a2107f1ac606cf2f98f3b1862402b5371394968a6ec1404c27ef01958545326e6e62a177280d1f0ae04179a77d5d97b50c4720e65b0063bfae77b661d8a9b44ab2d2aba5ba9825aaf6fa3dea45326863f7b5e367cc8ebdd2033ecd540ee48863d27d7f5c2352e09985cc68468778ba32142a4fd0c1c748c234d945e2c1d924cdd9b4ebaefabf2cb6b221f7c5c166a0ce53fb0aabe23daa355719fa4e08d057e0d443c9d9f75c056a3439766b5dfc8a02577119a2a5d0accc6451bad10173715cb14ca6bc624ef76f1e6df4d1658aa3092e6a2c4971ad9465e1f7cee95d2ca7b3438883aaa3b0024e3284e7ecc91952a9ff24625b4f478453749ff3c65459a5c3ab90512bd609c185abf06b1268e33a1a0e7c7891aa4c9f4fc510f3fcf4d5e984d6bf544315e0d1fbeb5647254e40a25fd18f37af095ddcc5a4e3a5fa11df1e0d2a29f7d5c73949f3a77e21ff8082a8cd2f9299968a46cac1953c4acade4f31b93e1a851d74a358d6286b9251841c8af263393dca8c9889be6dbb63432eebf498a99ed684fa8253c4667cca202cf219f1c2c56cbb15650c152187c3f7deb4931cb34f3bceefdb1bae70e9495ae6c92d014452d1299a2096cb0afb7ec6540aaa058698ea4fca0c082c3bb98292a17ad12e00589cef669bd90ad4f779e9e1259d86ce0595711f394bf82a8ba08c7f5f9997b1fcc40bf8617161cfd0233ebdb958331a1e86d5c3607c92ee399e5cf0bec7dc50e792f859e3d8286f9c5829be5eda19e3ac5530b34f6bd9b9a122549cf36078e615ebb370eb2b11d9c9f8e930c285af867b1486b4889a78816d1ed9de6dca59990e02f4273b63aa9f55e19dc6654a0314c7d267513a4966d35b7bad12ed362588d4d4c35f8ecb42e68e7db724506a01f6eca92f84a60e861af209b8ca66ff253be57ca47d985e1f240c0d97af66e9d07480f414be3b6db3400b6ccd022215918ceeb5ed7116c0282d14430e3c82f4ac1f44419f75febe38397d4db079989ce6a5035412428edccba15b893f08b9ad21f1507570c5ad5f23245196e0d20aaf0a40ae95f35f84b3193df8b58115670a35ad2658e80d108a8e2dcacee1415e953a6cd341ce70faf293e534acba7144450030064765b01ec22b8ec936748aefa20e65f91bfb9113dcae471f4813ce2d9c9f35c44996e8f1549f341692cb931385ef28adc5b523db513a08e390900bb36fec9259ce9057d44172edb8dc56230fdad0f8e343e24e699d2b1046fdbe146f8576f11c311513f1212da67f1e875a8c4a9b9f0ec57ab43b5ee2c5944f5664457102e0c2f63e53d4dc0b6bb2feae4977864d026684382207fa4eab6c9ca74b828771344a1c459dd0a14b9d97d65b609e72f1bb96d17f23ec7540dd984822941b973530e65d019c6009d78b63d60f4b4eea2c222b48d6767abed2ed101a105571fb7d578b70bde2a0c63eb079e66cf191d5f46c0096540622a812b1c3183b25e904ed784cf91f99f87f476993d7f86c5d0509ea80b10059292bd0deac3bc66872dab475392e1cd6fa9fd691df478f4528d682334e4c31f902929386725f40e2399aa73d34604dbca6ed35a1156031983cf25416a19b7155d8f3c4eabc0e7cb8bbcba869286a54ca599f08050f362ffae5b66ad501e328b08423079e4d7f4e491d93ffd13956f4d4d43093c2e9002541944bd7014b87b1fe32a13c3b313b5c401bbbfa3609a0c13596b24f4a11d156178f656871b708e15d353db1a13615cf9fee30053df5bd397f9c0060ee41d17d482a318f6b2d24980bc94e363b5086a678d2ba1bd08a61ffd1d74eb040ef233c53c2a63e2437267554ae0e270fc9c0500aaed6c4322f84f2e294856018c136bcc1100d7d548ca5fc11df8b176799b2a128a707e3b7e2220de574abda0e36c6c72bd3752b1bc9622e5114710af79b231074b1cac77684a10bf13e5c7e9060e6f6b0ad0ed4d311df52beea66cc14d463a7ec1b6eb92998a879c2321a5ae4ba471f5ee70d60ea4340396f6803795133d54a5dc45021e45b423266667a519bbfb30beef2c2d94c44d2f6d82906937d4d99f75c6f91522e0725ae5fbd70ceb24074373567949a7e707e29ef6ca2b1d97ed0505289656f1fc9536e231b57d68008cfcb14cdcf24aad5c338a9f2ae9fbb041eb08196730d1782ad73e5f331519cb0b0ebcf0059c7b6b9e5dcbe6ae761cae1efef6b32aae6c7ef8938e4c5ee71ab9fa0aa1921d041e6e9ac8e7f3c8171ad13a5e31c849104e47f21e7823571af14143f8c7551d83dee6f6567dc9a5cd046328daf0df3266b161271d3cce5e70f10208e3cf4e4d6cb4012b0ad13f5fe7919074dde6686ba9607811c8c0e30c25e293903203036c2ab4dd6d1f4a9f8edae0230f1b9a7b00c4319372860a9dc89f878e2d97421d8b497575ef3f42d02418456dc5802e1674096062a0ddda1b611aa5a87b80ec8e1e6643ecf01e2ca280e21880cefe2b18352d6e30a84d59d4426c0103bfded8802d5eb3c7dd6c81424a0f2dd631a83a245c81f7eba01d3608b1ed039fdf4db63d939e53ec9770548fd160f94261fe5515618aeb70313c044f9d1fc0b8f3e3e09e3a6df3fc08c19e1f2dba39180a0acb079b72d4ba0e88f01cd071cb13e64e824f727243ecfd1ee0a05b86e8a07bc6b69a073e9b9cb3190069a8b1588568ed6152ba6c86018cf4e1c938b8018466f38f0f50cbd597bdfe60ac8925cd4e828ae01a3749d4cf11c3c56477f65da133b43dd9b08330babe99217c98e2c63b47778df9532b267c3f1a28990bdf2336a942eed11f12fa1792c0ad4c965e668b37c44818606eb25cdc42a655c40145b618be607f360b4053ba5a345322c8a9d0b8be93773898cef375296eae41500e22f7ae80eb81d404f438f2aba069b94a6ca35edcae72b3d793b6f382d9ab30e9953478af87c107c0c6ac631fede17ece6087b9af8e6bcadb930aa84ffa64ece5f9d1fb83e398ab2707929b5c4fca86b9dd8775b1e6fdd9323570f49f62656f326256f26e10b9d57f68e66b41178806eede5c4325a521efa5e80ee5cd8713681dd41b41e00aea97aa4d13dd17b874039cc0d108ffc83b402f0b6a0b5e6c907fc805a917c45ec5e7e1a8dfed435756d529921c4c9f30caf6f38ac491751ddb0c9684cb4ae5c841e752746bea798c499253e8af72183f19b97dfaa16c74af5328876c5dc9e8e1c85c7b80ec5e553cba489f200bc4583d5a7dda2a41bc4d3c7c1573fbe8e041154e46cb521ab917aa56ce15b16280ce1240d7e9701e305db88a42d6f9e9dff37cf08bfe9bce128f8a2ae202b6b53e4a74b2a6952d169d6965641b2679d9d387a8e118ff8a3e8938b2151f9f2889582d44cfe8b118d99597008fc9c0eae6ee03997954888c129b257de54d44eb7a5b60d4de07be93a4e548a9a18536decaa4195f5ae32f4d5b6a0bb04c6128744d9c1a74d76936af9a72846622d142bd3afcf6a3f7e434997d95e810721f20275e7e9b128aa64cc814447ca00971b6a6a048af2529250ce86d7b39165ea1e40bef60414d59268b97cc68bd46520f39e951249b5bfe60430e40960d2dac41a5a3a3818c3aee41bb4b9bcb783f4c6049ad213af5930ed755eedc05acd540fc82c971ee0114d84ac71912b4dfca0e49a786bcbad5a478980e9e06b84f158c9088afcf433c6cf21acafa186a67f66b2dc1d8e51e068eda4894212cc48b2e115e59fa608ad306c36235aacb47dd75295cafa073b022003e85a886c1b753a5a4e9687a4780350e2a5f1c58e84e72f68b518d4936afdec88cb534ee28aee97097ef5e077fd0483cfbd87976afb9bfa5dbba85bd15e6bc36489791c3298245e752d5dc26baea457e5ebe790c15815f538fad577e8bc9b14b89a23c2849fa8160d7ec8dc6ae9e223edaacbe88c5c713f35ceab59997f559cef1641324275e2480bde7f6527587aa823201849d641b02acbe6dc16d306f991ee030b9c99f6d0b4b1742415fdc3e2a677f36447037e94b25215394abb3bed457993471d8a7018c897a0ab4f06b4d255131807fa44c64ab58450a5633e4d3c9b091657ab288cbd6a1a1ad41a648d84b7cd674bc2434e8faff89415086a3cba686f444fd88bf497d6ea57779d85805533f4049c9a0408534a7fcb08f706ae3c4524fd68c72437e0477b98194cd95404077a35c08abc505aeef12fae50654efc22e4deb4d384394f72718a6d4b8dec2526720505a6c3d5422db580226907df13dddf0ad2382948f08c99674ef84fdf5afd42d71776a0e213ec0ea0b88ff170f566416540aa3b42590d4fc851e4147b2ba99e6df273ffb93363a5197b032bedd375606eb93f418a5d9aa8ebf1a6f0b68fef94f7285e5c68faf8d7fae0cd9b5f6d50c84cede41392f26627f7d81cd53e31f020e1dd5864db8f566dede7de5edf285bc51d777b02001490b669ae4556bb631c7f9803c9e07e33f60be38cd8092959348d89353aa45ea9f0cdd0d3eefbd21ec103673680b0adfb14016815fabdebabe0e2ff3a95c8066e03d3cb04e21d2ce013743607aa37f98eb05542f62e131c7e7b4f8dffa554831f8b8db0ae323df9c6f78be4fa4daa3ee942b988f99d4c28e039f763ef7854c7dd7bf8e0c9f7925c27308c718c7ca35f5ed7b76b3c9fca337072dd79291646a18717629b33bb834cd56eac4002af385865c18c520bc2105ae0e31b6bcaf634c7fe08bcf223108de9a02f538ae2ff4c1fca28c6c087b475ff26f49c26cb30aa5df2654467df389e4202d36e5cac439dd0d0475603718f15751e29ff34c20cbf8dcffb564905c2a5afe4f2bcd0454ff5be8e7c279f65e1ca21d5e8e3d1a675d4262e4855168ec6afb7eb0ae0bd5e9fd60a7022ccb24cc76b3347a0c0d98a6cf35fdb322734c68c94cefa28ec7771f2f631071cacf7367c76669880d99c0a8c95fb01c83480771a7a931d96188e7a0913a2807bcfd9cfbd018d9112f71a3829d0eecd374fd7ab31a6ba3a6e3aa0a6a9924f9fa67eb13152a2932d9f3b08960b24fe4b1196bacaa2d57be1a74b28780e6f452fe735b82f64a4435b45ce4ac0e4b25b2dbda7268c236285f6793648de9f16ef54f0170edcd71f803987baed365794e1d48ac9c3898a798a337ec5185bd9c0cc04751eb8e27f3400bdcc3daf6655daafdf1734d1f939170f94787964f714a3249a7887be3a776634d9920fc2ac0612e2aa5f0683cdb724940a5904af39a3b88b721175fe89a9f231db3980fd520d58f81464dc054e0a8326ddc2d92787794c240637572356f35fe54b6103441f66ca7c99d9ae8123684364a82d2ef0dd5c38b70d30be3ab3755979ed650ed6f4c466b178320d7ecdf04d9acb8b154e969e30e90277d4b499b7c5900678b58bead015bc883125d1afe8c9ac4f5006bbbf181699b197381cc4cb73a90d0116beed715ae9759f3e5d577cc5959cb5f2286b6ecf85f7181ba5e1c0e33e16fb6630f2838700079d054149d18ce04f358b50b065c8c66b1f79c1a7ebe10ccd5d7226fc887bf6289053ff08c4a97ede0f1930c5842c831aa52dc17e618742eceab76e871ef11e1510555184d338c68745b98af869e862f1c5d4093626392224b37d0c232d1f7e9293ff3cb34091bf31d848da1c44c750559dcdf7a9ee9d4965e030c6052c74a86e68ae8cf62fe68cae0f649176c712fbf2c6fa4c58b1121655474c53a9970813952f29acd55d7416969a7ddda41eee2126dd5d15ae814a64586312206e4fc1e365f630220cd80b3f00a07147834437d575ad9fb7f46ee69dae5dfcb2cfb0890e2d1dba2aa9b73483de2789cbae1d3e0fa91f851ab725d79474d7fb6b02e405256da99743c9aabbd119d9cd6794bb3dec4980be986b7b0e93e0e9c1f632631dfa0c54dce3c8f1b6bb0ae8301f5dc882b99160bdaba0eb7ef05c3042c2f491abc1ec34e8f023717d3316b159aaa14f13afafef93f527710b0e4ffd8be25a56ec3a2f1bc17ef4b0f91cb8a32209c8f34206826dc807b951d0e81565f45138e45955cfd94faf75a4e0c92b89ea5409421b7ea8705bfbdb1adefc7e13cf18cef908aed013ddcb68bcd46f802faa2a2ea2cd5c3fe01db7d3059528721fc6be3913a8263d519e62c83f953a8dc01b239793fbece17150db23b0c15f20ac8e6f4319c0319f275bebebc8d9926b540307f8e1819c163c04fb5743c3939a6b5573227e82383d5e3c9afcc356d5f0b2aceb8efd40f6fdbc155594522277f96b4e60c3ec47f86ddaf11614b65afad904cc4b8490a2b48c5373deec5f8a45946c206e672fae73af580cad5ff3d5c2b5997d80acc92c0064813f8bb8a66676f11ab08ce44e214804c90f0a91e031769aea4a841c8e324840ca52f828840c20619d72ff98544169767d5bd78cfb44e12355b1b1a1575e0f3963ac16bcb9973d27afe0320f3629e1a33f55a57ae1ae05f08671d70190e04404b45efb8ee05920d2bf1b2e8328a4c5be3827c6f777d08a204e6bd8a880c3bda585b0f384b7bd23fd6905b8084c95279e0b8d2b528f77eeb9d46001c8b68f23a9dc7d16971ca7d7a745c0e4a9db0c16aa2dbf4589e9f2b8934fd61d62b49c7b9c0cca36ad1f280bcea359b2730d1d539a5b84e1b3a92b35ada98e83262bb3ac58967ce87dc8a05e829cf6e0cf35eaedd53ec377b5fc60a4dc5435b45bddc69a830330c53982733157cd5b7d087be76e063911acc811a24122e34500247362ade78928df25854746324394ab5a0a2c6831de55620370417e56d55bc31241165362ade88928d5236156f6c4947790b1568bce047b15d95452f80845b8194948f2e0686cc89f4978b55110829bbffaf8c1343a802401635ef2a7c8a67aa65e52408c1804fc014fded28c08b163db86a63ba0b91cbe6aa092691f277142f2525f6156bfa0e46efdc2f63eccd1fa80dc7b5c82a79ad9f1fc41b9ef9d7e7f89c747dc0ad724a5bd09c1c474c662a565df2e45b5696e66a018191c68567f2959d7573d91e030346a30d851136fb2cf8965e9b7e0ce13e5c2065256e8652c2793516b191151578af412b0028aa8d9c24209008844f46cc009398a3948bacd3285ccecd19fde0c16483dd267ea0218d7e82b37ed2f43cb05c3c10cf3604fdb68a280bcb139808e2a7ea1f0d18805578094a884032127c107edde9465c05e9324035d3148931461413e07c9f3fd19bff6b1041a6c0fd28010d477908217703b8008f7a221f43abf8272c2bf4a2cab2c73aff1c412f50b7bb074c42a0023a707975c6318b98befb1cc3be6bf2a90f21215e931503072b7ef425f098564c4ec0d6420810ca6a612e4dad0d6f0be251180dbe89d663317e50a810c6bdcf8d8d968a3abb280db483f4d4833c58fda407c51dec8e4031789953e86a92f8e7e880fca73bb2ddb1660fb81b5cbcc40509537bc3e3a815a115d4f83e4a5fb1915d8a548ab4c6e85d2d55909a61485d2ce65c1db7b5f5c0516014002d3482187afc7c65c00471cd8a6b44ea9abd7e3cbb51f4837090d90f6de467d6250c8020fd123adfd68df494b380235b453f59b00c1cfc5965279f77879818138c48fa6cd4d691b4b63bae3b0dfc5e3d333e0b28920def9a86a48f13d10ef99ace71e4059404f4cae95ff4e85df5c6830a0613090287df3491249196fd83f81cb9259c7caa86249c46b936be3540ba3431be8fb03b8ef327e241d4e476b21d1b77f7a1d70c9e6f93de4c877667c854ce49cf8b6472f544b203f4c6125e3f78169515d05e3090a89bb5e2488045aa6a41f95a5c47c56365348bbc4e12ce14e84ea2550ba66fd410dc1a0450a3344edd2c22373023029d2dbe9b795b140c319291521797e5758a3dad97883de7683cb3820e42b431b78e5274d1acaacd80387492f51d2e421dc388dbb4ad1a6f0295fb0d83507e65845951e9c8f5e3adf5a62d6c0b85d8351f3a1c881cbdc5f49ea336352f6d6cd3c8239995581e30d95f710f8febf9a51f97258e896838e2ef7fb25f1339ffdbda28e8552c0f4049cd504081f977318806b2fb67491a366a37644c24be808915e3fd19b96ec8d81e62804671cfe0e2d8b4dd327581d59f477541a7287179e7e452a5342d8f95c0adc7ba28b70ae3a9206cf4b4472b6473c1f9424542b0627d468f03a5fc6db2152cfcfa877359a77875782b37983e5a13e76d4cd546ae1dafc851c8451f18dc89544941878a8d8ce33c0582619e92cf3a306fc2613de1ca083f343388049056658881034c6189298313d9b2d2eae5c1395cf5d6586c957f387a490387496e9450fab9d1f9b0e436d06dd8065c018be2cbedf55efb79f135937d6a58dcd073a225b694d3307f92bd66776de1300a0bee2dfb97ae330bb95c6009ce226bb189ca8ea457545936c9d1bb6b767c95983fb5236c251680e42552860e466ee33d19713fdf110dc4da737caf23ffd331dc7f922341fcf47674d51cade32e7cd0576e3df54e1a518f0b0722bd1732bd5625a889d9317edc7cca6dd517dd8ac5d5c9ce6e17b1c477985681a6697679adaf58c4fc6a3239a5c0020b8ad5e0b49d5020efee278dba5a55fed36822e75d60d363aad4c76e3ee63e1460952f9058f4b9f4bc9f8a96dc9bb7de1aa5055ab97254044bbcc668b09854321681bf348a6790e8b4b094d53499df8916d93036000844c8c635c5e604fd8543b9150fa782a0d6bdb5cb39f9af74a4606977350a13106c0387b32810b4a2e9fc78b4b62777dc1ac2d1b72315286953d1caedc508c10d074c12e0f69326566939ce9e7478ff80cc3df49629e0d6d9498ed7e37dbe494138d2d959e115817c20b01e53b4505c9ee8056e53ed07aa60e7d7e9e07fe95f87a4b55cb26e033421df2b89835a8b2d599b97de235df9888180d16b3cba649d73a3bed3f10499e7c262fe91a3e92e8633433fb9c52e5eaa4803cb4de2533a9a53c3b291ea92b8cbf5514ea11743b7911c725da714a7d6b065877f92bfc68529c907e24843302e5a41904c5b9d05f51a420ec1e309ddf446c56b070aa0bc1640142495ab33e41313d7da84fb174c35a1ae8b0cd29f047ee208bb101a7469d0c4ebb854103a04fa39703d5faef789c48a5ae4463cd81722e31db6fafdf5c40d3231be83b8fcc11c99cf7dab69cf19a4f7b3219cf3b926158eed6567e04efc7faab6f447eef75bc24352acd43eed764052c72da42d095577635bf3f733e20d92356a9789670d3dfde9d08c118ef5c981dec4df8dafa0ab583ec9f540c1a415b670a72cb8df773e6379bcbc4fbedd066ca3a42dd7beb7db6721d74a02ee3e2db30b286441b2eb5ae90636618ac064276b026f712775f0e075a56c5d043d95ddb76b604d689a00abc4a68705a749f01760f69acac2dc3303f50f31368a41ef863eb652184bcab472db5760d3760f0fd79d2cb20410f8a559d424d6cee3be0b3783eccab2b13d814f4f74a528848567aa2f64a3bac6fc0a5b8012e8d0128a5cd49b0cffcc986d63678c1ed82ea2317b65310e278065fedbfa3a9c76d6c3fe966d8689ee5698fe996249a25af14f221007e910906dc1a09f3dd12d57c9779e16e78236021a00b50702d2d885c68d25fc9438e185016c0eddc83300e3c50dcd60e5108ff106eead5530178293f82f2d5981da1e59b114bb4111cfc0eed0ccc357afc6ffdf9857e3c3fff9f457fe425a0747f0131ec09235259df1068973cf9053df867ba216cbb4794f82f9bf1107f2fb71c4a77eb0b658d2ee9415e8039248e201685c98813cc88abb38bef0fd1b3f374e02ec3f5b3f3055428109ab51b7fa7acf084ae7abdb402e8dda8fbe0e380a510f4ea4f49948dca020240a9e83b8d84513c15c70129e8f14ab539a264a7e8efe5ee566746a66335ad9d07e48d21662fa855efd0f2522673e0bca4dfb00a48bb6b3c7fd83ebfd671380de52523fea90b996bfbf1fa5eb4a6f586bfcaca8ae0a07597b137d19e0ef75eede1c37c4b39ea39207bb9ef6381405cbee221c5504fcf7b41d54c8d5a5422f8b16f6d29678748407ace89b0d20acd58fd0fdcfd58e547078fa407c95823eb5a5751a1f181b020a06fecdef27f942ba97200bc32a87207af3a06aec4f8672e8090daa02c410c27da785e30d6ce82b78a713493788feb7b45251e6c3d12457aab2103ce948e021d27da221e4fa74503cd23ce400947d503735187bb2a94c85ea63f4416f696d2e3d8a8ddc48d0d4b04c27a787aa7fbff50989493340cac3248079d6324f9abf6806d8a721461e01082ef214314528c72020c92ede4c6b66ea1d3588658af46962797915ed2ed7470baa09b5dba45139758b95ff81e7eaa9e53277601830858d08ec7df5df0c1e560ab1f0fa886831527b9c42119417e2ec72c61c917a0593a2e2fa8700a59faaa785210a882795c495adecc34b3be954927bdd5ae71e492ff94e3614774e9648264b407609d119f76a1ec2e8b31a91f5a8acfac715b4acf0559045db7b0159bb754afd17dee629abdd5cc8bd2e4fdaebc7df8f5dcb80bece388fe66329ff02d6e67b46cbdc99ec8577b39c857e9b43980871e43a678adaf832f2d519500ac834a17c1f8246055757cdd2a63501e9830006a9e0973224ec4ac5c11a34513f1bfd6d27df3d30f81b123b84a2cef6924d48f0abe00c9b9f4a8d28dc3be10f9b436bfebae56b336c2e7eea9f65797f1dff5e5f504327ad93d69415274cabb3882a568911ae74f6e51632cfdc8875692efc4bba2e504e0efa28d0bee14a50afb1fdeaf22946b1e0469bed231e846f0dae09d2f2f0e4567e6f3cc4ab08839eb20d8f1ca31214fa48caf10c8aafb9558b36d0db5f6f55d54563dd4aa0de6fdc0421aac4d0610b80a6069466a74545b2011b6f2571659ff4f7be2cc8639f122ff952db5b919580e94a178e02ab2c3dd8ccdd03238dad46cfa320245d2f4e521f0fe84ef66fc5e7059473672ce7e0e9389ca271b66c51fe1c051af639fbe8a8421ea43a36a5f8854ff82ce6d97538b639214434057874337b9cbc8f6cbc2c99ceef02a829e69cabf3926933dc29e5fd1020639fe90e07cb3b0f1967a97a404d316891e6afe4849af57bd3c8d044928075941823725612f059e214e1e433f0d3f96c72dfed0c214813652cfd34d852eace43cc81763828f8b0ff9ef95229c47442bfc9dec3963797a4a9f7caa7779747678a3d58398dd536213218102de2f59bcba2767f1ebc674e62db7ca3ca31d6de2652b8a6aaf378e7fd0f6a492ac62f68b50327574db1935759b121e3d22cd681e69a16d122919082fa29068262cca790fe07d7588088a7b51fa598f2619e6a4ab336812f3a179fc6f5157155986aebb00ac309432781b1e69c65cb3c6e0adf7b846e5de6c2c67367b811c13f76564a6657dc01678b4098f85e9f1436951100f341731e9cec1e5853d9288d7530d3b71c3dc8d899ae7f30cb555091bf5963a7a05927c2e8c9249fe9e2c6a158deabc4942ec46d3b9d24cd747071daa0061a5f5214e799bf1729f916665524c7aedc5bea1a79784a6c6911b5a180161ba85c9918252c380113514c6b854fea0ee58583c2b44f6c712a815eb8b48c33d9e03da8ef9c46d3c01b9706225d2975a12c6e51a54c3a0e18b48d64e0c0dbc55f7534f95c3a0290476549829e9d89dc78ee2fe8ffc067214bc5792257d8f32af0568c093fe78047f70bd7bc866db06aef8661f680b04a5c6d8db9faf9925cd7a3ba2f0949c40e91ebbe130ce922ed976c2f9032889eb564936f10c5cb0f3223c62d09375d1f8ace691f3ca3d1cf49d306150d78d7c317b84408b14480992f4ec0ebb29f4cead13817717ee882ab44b304be8e08d865144880c0f9181db5eaf44ad24fc5db136b816da3179af47ab6a3e390e09e4a3a00671863cbf249a6f28c1576e0df187e121396e3b4ec386cc68bbfc4164e16e51fc6d1da6b7df09facb3fd8c0e5cbeb1ae090c06cea3934114894c4121bd181383886991f021e0aeb00de0e7349cc9b794227711bb32a13ae6d08be4ff1b22886adb0024aa11a023314743f240fa153e88027712f95872b198a07ddf7c88316f7d8647abce5f79926ee29fd0508f3fafc2e95801af6489ef935886cc979421cedb66d23dbc9a2836034788e5f4db4e2abb1df4cef93f095f15eaf6861cd4cbe73e62675297d99686687a02e464e94b3c899b94067d70507208a3fc93853824405d5fa39021167ab84857018b8ffcdbff483bb8ecf33ea022b281f5b49997d3d19a911e0ed2cd396387a73008a945526aaa0760707ceeac491a71bc3358839cd138092aefc01565fbf8a61b728b1a41756cae905caf96eaac245e504d93e4ff3469da1d4ab896ec396a59426449ba1119a0aa0e01b9d826db86b335d176b15b58ba6b61e06abe2a632ae5bd91501ee3c7e4bcbf7253a9d5c37e70e58b75d2e57a40bb4b0e3fd0dd1413498ecdf3d7f652b88673183f05997802e58669c7a6672adf4561b16677d82fcd817ad7eadb59531f9b503c70e0ed94f2ba0869502ace426c4b7fc4c08cf28f87bbe8b1af4ada8f6447e92d8d8d8a20a3f0873b0e1f19535b2e63b9b3f96b1938ca8bd8af704655776ff2df9eaa6c40741b1d35c0fc9af688ea766e73ac0bfc5762627b7ad9410ad60ef5837eaf9f80aa557b80833a6133f50305c5f24c65531e0867b9f0f61dfc4d74b2dc357c3a932d4226b145322766a0ba1540c1d98644c2689bb8ff378503ca11d5569dd1289877d7abbc45c1aa237a645a19b1dc155ef2f800fee1fea26da5ce0588651ed93ffa0ee58a7de1bd3873d919a661f69832db0264b659b5f54cfc1095634191fa31f4c8ae66b95dacfc310724e382805a9c68d206d53d2e1092e8d88b518362012f0df3ac0e4c0761247d302072021cf41db93ccdb41a09bb6edf889d7563de1c33178cadb711ed29004f0a3fce00490bb693f1a9575ae2f6b93ae452dbfd56d9bb7d506323c56f829c41872df079bdcf52a1bc2bd828ac11e1b35ebc1c04cd934bb2b300ba4958a359ecf34dff84a129cb5022d9f6eaf3d51626ae1ec254dbc1422cd4fa8be6c3b1329946e3ae152fde8978f8ccc89ce2eec3b1176fb1c4e06e0587ac915f2e4475cd2fbb7481595dce0155443289da29c236d8b08dfb34257450a3fa79f1b24da6b12d836133a1f9178461221fb88b123e08bf1ce42024242b40864def958ff2812240b372f46ecb26c36a3b11fd198602dd0cb1dd8b3e7bd9e5122ce4e30a6067b23f059b1cd8f466ea0c3e95c5e74243e0b3a35559284fe3fdd25ec70cbe73301dc1eeb089e5e468b38f20eb5e09663efd9ce0e8be24fa1ad36a3152dc64b2b7e1baed4c372410baf370477f0f271ff6d33719189bcabc3d4388b50325bda336d08605c8e4443dda40fb9123dd319c29a3bfccb9ae1e1af39524b13dd9709004bb618827eb1f5fc3f465df17857956bd9732ae4dda2d3c932b8b50fe2752488206ceeb71861ef0a9c3b7b3e21272a342cc1d9e0777072c6669ea476882ef0623e99301312b1fc1cd85066c85cd730942c176e2368acccb6bdcb0590ebe360d5ded30edd118a87354f60e576cfc18b91707ce25af8f623c560b9f387dab9ca019ddaf37209eb89f5210e66f7f85b0db354d305256b8713d22c031b395c291e68e779a11f3f031edb356d312f431d957050adfb972995acff761ad75a53916c8e39530ce790dd2b0a64913e6587ca028ab7958d75255b48908e1928541a30404580d0699b1050900a8c21e1c4cd975a9c3f56078489744e6e426e92b8e799218eaa647cbb3ba1ea9c2955b061fd18de886187e5e25fe0fd4d84b194fa623dcf0cf16ab4283aa5bf9cacf5563eb5d98e65696895b5ad9d17cd4e7aa943d1f1c74de2ada8578723e7866baeb285d338bb11cd2d9ee3d818d308e296e7331897b665c3f17cbe3dc71144dd458ace6b7d6cae2b3b54e7c46ca214d99d01a6818076f66656a625dc394c96c918b00f0a4f00acb7918450173be4e0f44d415d0e0e171de8044982ce2138fe1d6420ae30c428f5bb4b0b33d6ac58435f844e450d14fa3c7c3316501de64a9deb6651f08f133605e7da49fa4072116730592bcf41ba95daa7f103cbeb35190ffd0e3587e2a2d5db99dba46f78a7b4739df8b8aaf7afcc7bfc905db647f51e06b30978e48a8c757234a88d3cc56f21c0db793f338620b078ca81cd898d1b03e6d0dce80adaa1c3279f7165674db5d81feb570d5b4bc416e988a34c7da67da152efb8575706f63088033a80ab6c83bd51c4aba6b6b2bf08c26b8c3910b6a230d43cf4202460a42e3b623cc195e83354627daa18fc133ea47aa08ce43254a69b97ea812346ed6d0069ade3303408c4dd99c18a98337a093b79e610322888f8913b012e2de80f4a54a11d5e5173055040b6613cabcb0ebc76f81f4599ff7100d9ae319b4e0c18c6b432307d3f892ddaf92cabaf4779dde16ca540a849e1c093cd480929db86fcdb62fa6ef3c98c38744b2184a53fdcfce5a3dbb99de9dfba836bba5141a8777ac35189845b1d6d0447b279e0680d5beecc9a4b416703250da746a015cad3ba9169276ba7f1008370781d9850cb481585d98ed91521bbb016c1c1fdf920d916814b2c638c59ab07833be8c5deb629ddab51a125b29c82d89e84707cebf8131dc0c0f3a8f478c05b899228c5e6f1d94691f49c09cacdfba70757f6c2851227c5b6900c95a5ed26347a93857717d1794d501e8b3179033c620a807b518f31d6de31c63e502dcbeb37f5274a29795dddb89ccd025da091f3da726669d05947b7217ddb19afe3c24c1a8a63262b0fb2f60ca9adf1719878c0c03e73046f16a5bdaf461915e314c84b5f5f9a56d7e80a5639513494e602abdf3c1c1eeb4e3599b734c14e3731c0df899bd9067d93ae1bae2d384bd1b4223d5a240c3055a9b5319f133eb416b23aca118a143941e10383e62b4b7fe2e30bae11c3c12339a01a1f8b7baea0414e73dec060cf8077afaa8d5909708c172eb8331d45a48619441a8712b92e9cd585cd719946c10e514c933ab5a5faf416f3ae4b6fe1052f4685ea1d14aafd0a910361056b243d216cfda15a5983e428c292a9141b5f322a154096b219fb97df79ac2391629856061733114833cac356b3093a2e38e1f6bcc05cc72f239107d231b258591690e75faf4fbb46db8e62d342201f5bfccf93ea32c4dc693e0406719daadd384e2232771f6fa98681bc0899fe32f713062e24b43714c99abfc61be266f0fa5df9d66f447544aef9989a9b252c3105af6821782ed9960fa2420109c06854647f78c3b85f35f7ddf36e6351f91674132942115b95b715ce0cb63df938429611cef315573824ad99aea284536e5e58ee9c9c754d3599eb8e1ec65c0b84752abc3813f00e5a151a431016385d2dc561c92fc0995695c0311d161c61eedac40cddf7c2a767d6239e3d7d55eb102606f3e4cf0b991a92c4bee26b86e6dafee3dad3e4bde62cd3310e59934172d13df94a107e2c43d0c785015c0f8a4b21425fdee301c7239270780adcc366c920f13c16f0b334a1a35cdf5764e2b98d82cf3069655267443a401f8a5f474a192bff0d2bea150d1ab17f1bfba1b0618c4b4bef6b407d2132d8ed478f85a8ae916c800d7b4835ec202f128b1696b4abb0fcb623bb531f83799b01a434dcb8413c43584f718bc3ddb961d41d1c2cd91c6268546b4f3ab065aeb92e5a8656d9120262ff8e95e5d6d9f2472678d0670bf411adf682e11afdabb7cb06814a0c9d9f0fe22612b44649257ab16484e5412b0eaeceb9a9a2415f0010dcca7024b0014513c1f746dc11a1fe402779ede79ee89884ee150fa85c4509158d8ca929a4612821407b50e8d2cd665d36dcaa64729dd61c00154c1e95738aac6e9554d0708e0c394a3d1b9172f19febd8c235f7386bfcf31a7032a333780e4a806715236aa8d7b36fb8845bd659b0b1524c611d5c4e7604734cd602a7069a850a976b435b5ae73a15dc5308f4eafd4cbfc0b5e1814cbac090b5f3769af2707f5ee09c44a1b93512bbdce9d884db6e42eacb5860a4a855bd096b399b4c6fd9c828c5531f6c834a25c9ccf01087c58d2b067fa3f1cb869833b771bc9f88b535d5aa0d38c3e2e3e69aaf0e58ba1d7c8234300850ec992d6fa540f578d169623443cff030b16938ae0a889e05e2d6cb038997c7da8de8365bffc2641dcea62a9cc93a26d5b28c8d68df865cc1bc1db3895a51ccf1bacf45e870bc9cd5fa1ed3fa994c14d24831dacf595e1eabb6cc279291ee1447d5499fb725e30aa182b6fa58c05a4e235f44a2f9a0e4aab150a4c1ebe462ee142f42e6701f53dd8485047290e0d9009c1a23a83c34d34c9669598aa6084fed03c638b0fdc1f3a558eaa955a7e06d6a0423a2e76a9afa6b00c19f1e89c5faaa631a870f740ed365ec29f18d96f26fe7b34f49cf06c092ddc7283af002cd91bf77f2292ff3fad41cb64baa1909d125d8cf2c605ae8d7ec256707899eab188022e14bdaa558bbf76a9628bbec2692b13baefd92db9e3f900d89cdb1201086faa7fb302a03c17a51d0966c71176b3549efc6df57fce6d60873ff49fa2989817bce74f7abfece120047a95825a3e75fa3e683f9ab32863ebbc32d470033e4c64a63ff63320cf508b9bfe3045b5326157bd71fe3f4a94ed857fae7cc0ac7d1a2d0feab607793bc5386b713ca57c8b1930d105837204143ba7dc9d097769c91a030123e9e606465dd6b91a88af6a33f42f2b468a114a9d9c2012be9593d1666fac9dc330923e1910160df4a989877264ba9a254a6ee564561967853803e861242c51ab4dabd7a8bfe9ce3c9272672d8f2fab0ef308b3f46724dd43e7e37f91d4f215e08b8649bb1d404b6bc607617209ecd45978de33369b8e4292983b6af91a0572d2fc0d8614a1445478c56145ebe129a49907b391dfb16e3e9e48c6ad96efdc455bd981f0f3919ace89ce23aed887005a31ad964919d64c4d247d214122829d482d12e22d02fe966897f6049fd20d043479da441cfd9f57fbbeaffeb3a6a25b8c1828e15e2d905ea79f2b9864218fc6d362b4f76f7fce57239415aaeb13dd78cf27061c6581cfd928b85cdca1581ef3e26740f873713aefe612eada32517883f824adb230304cac7dfb1386198819e76e0168e3f0afaad6ba6e3f55f6a35bcb5734e8e6740d46cc333e859ee47e00f92e825aa80f4340ecf3288a4a171a8f6c7a86c077290d2c5e114325a3ffc7700282a6259fbaa055bc190fe85065460b56f994b011e6b09607852221509f2e1dea5a1403de8b6e4b5442b33e28d3bb06384793d2660d1b3ac4bea1c6f35c08d0acbf0500ada1bb37cf7a656124f029d40c49101aab685c03e99ca71f57bc63635634712f94ed4b05a2187a0f6403c6d148dc4f64e82e8a66247575e244cf508bdb8a6c20d27475291877387db82edc6f43e2fb6ab2f6ca1eba8f1bf39a0263c8e4c1607be54c01986663e4da2e3b2649f3d94704ebf339c52291bb24d45312831f1f537770935b7c3aef4f902691bf7c0961a1647f90e052428364fc5f8a52bd59641db3f751c44a2b32ce2fad5ee7910de59e29b29c74453e4693a46c499cddfb01963bb31da33eaa91b0829d528e1fb05a3f1b991f61c678502f94795ae0d540f68f9a29ba7261b490ccbf16e6ae671e8969f3890dc083f3fc70a7297ff82ac4ec4ad1b4e010d2bcb240860bc17ea82107180a8f8f44212b0ae8db7963f76913e187b5ca4539dcc7f12b0a15c15d09fc0a899fd67a27ba6aac997ed6efc622022b74582e8e48df564de743361cd6cfdab4e5a61b473ade2644add131d1aecee5e217a0e2ea22114ddf405b11027acd977e831b89947602f2826da7f87e9f7dc4d10c09b8ec476dafe1c5effe589200918bb080fd3c55c91118c8a7e4ae91056d3f03266bbed242020a2e584e969a1b3058893d70cbdd22059781915df2bdf5073bcc33323182a631a73276059cb45e381c011ccff812684b398afa5b456f51d237fd86c0fa1ca353620ef6c6b0d0e0f06cedee5c2ed49d319e5cd2fa2a72600ad72378b18aed6f09f058fb81c32b70d1690be7bf526b92fdae18d6bcb6c2eb4c54a4c1b74b451c0d20aa706ca2494348b2ab8b362cb6e0768117fea298a02efff0301a42560e5c9cb8c41844d075b84905150bcaed26baa8ad0637c8b6ce477d419b9d5ca71e2e78f8f49b35a99b9510d7de6c367581b1711ed66c0b8f8fc4359f58caa128946605bf4f94ee8736a0149be65320fcbb24ab56585cdd69ccde0938a934d9e692743d05d5de25ec949abfff28967552cc5901752a93c55ad39ceb2a87c9ef36f2b81257434f8173a37255323a02e965490c1497845a4dac055dc3b84281fcc0e4bf05fede3eac1d41e23aea7a4701292e73555c6d0fb0225903cfc1d77ba7c3eec5c05a1846d95d0cfc8babf1284f8b2b1af8c4009a2c8c059548ad6ee89a86820ee442776a0d9003ceba135cfd90e6bcef35c11e65faabf23fcb5d9f9883b5d5dda10cc10e05c410f607557020a71919277ab105911c8615370c2e79b4971653b1dacdfd47f8a3878eb0be03965047d6a10ef12c604d579147cc84621bb1ae201462c44dfba3b80802bac188d4da4160240993f6a21531afe2695a1831506b99b82808035ae79b75a0f2f180c1371c7391b3870644ba32c84582df1c09386ae82ddc1d9cc671fa6a1386a54c2455f6cda9546edebed4810d163a2a17e2a43ac6fb0ec671ddf0b67448949c8ee12557a584e920ea40acd10da7e667be58ca60e92444a1005e16471f9a52303c4b863963a56df08ac5b2bad3a5d2a2fa5e5cd2de3a7117505e7092926d99de039ecf756237c6c6498c420e71f680b9aa60b5a20ae98d90f112e65cc6744e0c3c8133f37201491369e3a6b9695709f8df3c276d0ddc90917e0a977728de2188ae40112213c3c82dc8e9959907450f987683d406892c2a440729b22effacd2a1f1aec8e0a2ebf00f00c6166d6f2c0e7655e2c263a0daa894b3ea6a807b1f090f7cd3728bcd233a142ecdf4e719569a24d89e3faf44f6b1d7571073c46313660e7f623e6e2fdbbd13a0129496c00139af6531e98b82b46eae29060781e719940783e7361761984209d88a8cabf1a28b729e0bd8e97b1e723a5937ff7db30c63635e99af11409c2960c70515297840244ed49294ae04fb3ca5da76ec7730140c16f6005eb5070c2e2da8017a4c5f03cb798b2ac206ee116e593983a5fee6367ec7915fe7e484b2390c8e046e0fc8d3af23396037d8c44e1154a4b5f90f579624d5ca10737c8651fec1421c0244854fcdab97f272ec563cf376e97a49c64c4bfd7e6a6452c506d8fa0223d49c12dab0d5659297f06a36aa20f85b035c40a548845128ab35acff73682e93727fb2ad2dca369de51c512b2f83f4f1b3c511b86bd6ce39860db0f7c328e6328675c00720cb65113f8c4e4822b66b664a2c271cc873726b8b25b33828d09d6740315844a4680a3358b1d4fcf19055bc8fbdf575dfcaee9b7f0ae19bfa22cae1a834c5a937ea68975a17ab4ae20194f029953fe46c6c24ab09a99b71a2fa1517f95758a5741189b7f31a028cea73d456b429e38c8b72fdbc7d89cf512b6052ac7fb326541f72be2fb39ef48610fd1c4943f5c1d52143025bbb0f03457854a637e576cd5d98929e189b6da84444d756bbb108f4fc7f294f9640e178b5b17846d83fbcf02a8533e0172eb948b56ab0309dde23a094b03dd7ef5616d13f4d9cdb72324e8adb66f494ea053db81e1da748322c0dc9c6e231fbfde5402e76c26fa712067a0026b0e9ce7fa8b830d3f37c985f3149999e72068b247bedbde485936d5be7572a18f069eaaebe4293036687b336bab0074c76b82506fb437f83a174433a4f2452f36bdf689aaed005d2e673c53fe2241c4f01aea92c27521f88730369df247cd751ad0bd296a776741cedab9f2f72b3f507dc5a182de3370d541a21a0127b5250175f126e96be483ea8bb184916eaada74fe848bf5b1b1e065b75cdcd0bd7e2c4e2aed1c1584ef3c76c99be0eca140cb478dbec135d3292fde96558c12ec8fe107992b3f78e5a413205d42e8ac380f2de77af014eddc1f66651f3a4bf2d1ad84cb3d977235bb98295e84e988b7a5ffaf5307dbb555886e45baff955304a845a41f7d71ae7dc874fe1b94e1e0bb9327ef024cf6acc1b81fb82e7ff535b6049e064217ee61a60e92f67c65bcabb39e47a8fd423e764b5ed81c9826abb9a31e4a84ab7f3aad1898ef213c458baf54bb0a07ec068fac0808855ed6ace24cfdee24fbf1a2d68e95af7e51b33293d63a7a1ba0ea0ea696a57803d575f112a13c039a652ceffbcbd20745c80bda9a75efa03be6bcd5fbd6767cbd11c57837cf007dc584fc6676b192a43c97a005749687a58fd515479d9123602b52c5d8301971361ab688064dedb0fdc02b323b8d01bf24152ec604db9ea6dfeb9c132b41a2e97ed3330540f1d89b2ad8096e57d5cd0e64796c56dd4402318f787345aaf4fa2171ebc7593911d4b0e5024621bf07e4db64f1b20af4618a3443f0f1b2e4f4d3ab2a56284855b07ff1d3c6e8739f0347ebbd9c9bd080073a1e2ae23662fb8d31f6ea39ea013e22e2e097281c3b15fb4b13885692fe5486c6676e1057523aa450b54df7855fe2f1c77fa2f6d002ef10301d97d1a50a4362c49fed8241571b95782740584ca34e613def5a286ff1a65ea4b081bf92e7e40df92e44e6c195e79f67aab742ad0d012598eb8d24ad2210e46f2fefa7a953941523038ed302cc3d139a2d67cfce73472210a4a92a79f2d00a8c338993fe1238248c7f97fd00443f858802d2a74ca043bcc99dd2158fc7c632b032e3ccff5db1ef415625b3a1424ed7ac5f3ea6149221fa9f6ebafec8d39ea7f9749cec41001c6d934311860c97ea219f152cc1fbc6e906842f57120f2b7cb320db12a4368d863c59331d362a45ff8321a6d1f2bde908814c70ffd964aa92cec7d6b3509b1ab9462f1fa4fef735fa14fbbe8e80244d989faf50c1618a0920eff549f8caf115a05b920aa4bc807c12c0f7251b219c1c5928e1197bfd25b7bf0a02d98e6a0d336016e19e386eba4e21386551f8876c4e114f4bfa6a561411516b4cf96ec52ea8bd749529b9a00f30b75606b771f155585c63e7cc4188c2ab2e2b0c22196d94c7d6573c77ed423fde8f6a6632c3adcd833c45521459f6a9049e8b360829756d667919330a2a9475dcc7f4949d2a14ce87b26352339e1a52264ac5ac0f1247ea31cd7e76c12dbfd80fe85e7c44950a413168386beecf17c335b01aebcc1254ecd88b07d326f2c61809eb5d85c3403e44d242b143c3c803e72d2eb0390593a6c89b57e094ba7cb58d2572a303e1804857a1f5074ca1d3ce2a5a8bdc3e615044aac4add07dc5a87122f758b0973efb963b450b8bc3ba960a2779917e7147ec7b1d0d63e7de0f1eac3e5daa341c47f54e8733d3c043ee8099a1edebe2306bb3ca78b8cb3a379ff9b87b19f905b68287d167831de1b94c32521b8a28d436f6412b9d99d2199d1aca7c1ea71811dd32752430fd35e1234226becc1784385d28056e976ec8ff514dd4e5ebefbcdf94779cd05fc1d74c8f0d916a43652fd728a26d8310161b5e6bfef01940d1d740ecc7876281e8aaa1312f8c3b42f3f377c8a2f081993a51dcaa11b08edf81d694bd332a83ef89e5a6c0c50540bced1dccea67654750a6800385d29459049e2ad5af83e8b84e79f3f5119c575363b3abc5b539158f807ca426f7892cd3cb2715458ff53ff5b634e203bd50ad50b6cc942e1f13042f6a399397a045314f2230e1ee80bc9f6f6a2d5950631eac58b20d0060f55b00607946da605103f6efb3a60be5083314791745f0046e4ab3e718e992a1a43df5b209e6bcee53723c00e8332328eb2c8a93d26fc61f2bfc6ec62c46d856d37e4b24c7365eb051558aecd3968645824ec143e423b32f78bb93a2c7ee2d0b3faf41c9d3215d4dac69d2de79317c6e5f73a11831fb5aaa885511a9c1082b55c964761a0a25b856226ccdb823a57681437b191b365d7234e43fb0c6e1ab43716a2a6e39fa2057eef9c32083f36d7f588d0de00f012a80c70500b1e5a4cf55fd4193e5d7c8dd47583115101bda9bcc439bdce7620b091e687cf415a76720a8a46b312bf4add00238978de352614ce00951562aae5d0ab67a646327d2530adf341df3267c1def00e707e3922c80b5251083b83f09806627efe6317e2665892249fbd351a0fec60fa69326450cc987ae5683f4d9a9706b1278d380f1cf26c17f1fb613b8003bc8cfc93a111c866199c2c261a3203c4b091711840a538c49bffb143a2fcde0388845f22b3a3cddda6ee2131b0f40d1d9ccd0bfa3f9cc13a245d112e065945761daae1b0caa0c7d8eeed7cfa8abc2a955974a5982af27fccba7066e3a2174b9f16b13147a206003d30642c184fd72a36c97c2e279c7f2898f8f2ec813bfb8a2108251c0a3df60372cb0330969b220ae180ac99054aa066caaf62ad2428c66304c24d0532224ae8c04b959a2e56a122a8e80023ac39adae61a2021a073a8c4777af8170b5456084f572c8ecd26d8257a43a6090af780b9e20f44a817e9121f06f469841c99f0b5420eade0a20ca2132833f1029e08045691a3fc05a4aabb604ad2d4b59eb4993773c868b32ab743e712620c285af081072e60fe590016812d79eb98f0f7571311141d250a41b506f79d1915b422e74e717dc25bd1d0fe8063b7994435d87466675d59e2604f88d7f50fe5193fe67b5e70cc5af072206f7530653f01ed83091dbb6432494564c5e860612a02dcf5a5f1e4ad002c0e97111968118e729fc83cb104dee81b1549888598226f27179faf9a764d766e10c110af17daf060980fafbb4b58fe93ff6cb6533f8c0bec72b57a6b5e9f8d70b3141e2acef5349148dc92a95d210fdf9f23dddb98b5ba88ecc82c6c59cfca8ef950848e8b148b9461ed3d4f77cf631acdb118669a23041b178cb1bf53d9bf77b9b420b2cf5f9de571826f0e91cdeb0f4b45c3dff4ec4c7b969c5c8c0a0c80e637c73e9629f5fef097d6fb9d2517d1aa5a638204fc7f55978b78f7e459478296243bfa1c390207d3b72079849e80f61494a3edec768c426a0a8ee332ce45721657e3d1e778b29a5bf6d476345e3ddf204e9f79abb1b836956541be0e939ddd0bbb23b5b70db8914f34ff0370cd762338eb5c221394938597ffc59a2b0b42c2b2bea7b1dfa184d688acadf1fe682cab50bf610afa0192e8f5d999d304f82e60ff78e5c6329a06eb1aed781b43ca71e2f259b21496ab3d3efc212ef317eefeaf1c43cd594c25bc2067cb1cb56f0fd5fbcf1f3f66104a414c53ed5ecb300170c77d4bee28ce63f22b38777482ba4f0909e551e6ac07a27e39bb260099c650f64aaabce8b6712d8942f171df20fbba6462f9338bf87128ea845330055de91dc8605eedc9280dcf90fd39948ce0da956c6da2f84a9f30b6dd8e9c11bcef3ef880e6534b5ffd2d9e72934ce0a74fe2f422cad4f4f717e3ff8b8fc1a47a18c1aca6e41518860c810a995e1fc3956f11f02596d3e4405170087c56bdfc4aa919d3fab90b64a29006dc79edefcc0c398a374101ba7117f09fecb69ba27d0c966e00d8ede23a54b6ec467b18e08029ac02949e6765a5e67feaf0968b85444b95f0fa0118229475b34233bedc93bd7183ea23b540e8cae9bb13dc879f530804657d3535422eb6e3567fb73fe7afa6b71a825e26f00cd5748b81385e2de219fc6d9283230117b32f9561a2c1ddecb93ee97e54fcf5566a22363d8fef96e517124092b5fd04d4c59a74424ecd5e68c645ce68840c934bd4322501665a426e081088dfd37d650a5eecb088761f1972b8f31e82c93892906df4791034390259aa81ebfc1b4e2044221dce56069c8f7276e96e3f0a0beb2858aaf772a0767641cf61514b0fa3246215cc0e26f0b1f1ad4a9c951c757a29d3066c12be9fe9722690d77df944499c653ce81b40c065980c83bef82b0dd4ffba464b47d0d9b6de2da8256e9010e3aea932ca09a4a0e39011f4edd47c33cc0d11de2e4ba4f8851a6e5c6e3dbc8c1289981763867a97cd04189a3690da2b4b892bc6d7895642ab93bf2674e1a037ab6609b83a34122c9b11d1bc678f1933dcc090cf9d07984bd9338e68d886cb4b55181d17ded86906abff2d1424859dab2442a8136ceea9ac02a8a9904c5eda2b515931dbf1964418f3edfe51c2296334d946d9aadd052ee1bc890f8617f34469f86dad8c58e62c5e0ff3472a0486919a693417186d183fa935c947598ac9030ab8f1a14d8e47e10b6838df3219810e390c7e1b90870cba0e3cd9f38486dca6b811119835e7c0ca608d405f1344bdb5457f84902c06f77b11f382b67273245c1640dc4f0c2cdd548319d18220eafccd10e1c99d4ea8b91cc3df025ed7d3f151ab1a031e637132c5eeee196202c928dfd3d94788773ff8af5e113491f7ee71d66790098299fef65bba6bed13e894e16036f70b40e6169788b2f2b51898253dac0050e74ed2dee8b39d70f793eea19f017fda53b9700d82ee9a968b399c175e5e4dd8297b93178f22c3b97282de573c0600867fc12218321f4b0dcba39f0afc577ae75ce77c8df1ca8ff45ac131d625d63295d394242237b18796cdff7c1033c1034ae8176a88c289dfacdd21b941fc3b6929baec2e0d7313a6deaa68ebf60512da418e8e444a60edbb6c61850337247ac7315c5ccf0c4ed9b5d6a4eaa7503110a7a7719617056e772654ccb46fa0d9e1445064681ccf815602b9283dfc71cfd381aa4c0962615f8a82501c21beaa526abf4b3a3aca14b6796db1e2daadedbcd7bf483a26abf0f5fe422f1b728b14a0fd6b8e041540c667b791aa8299e701f5362441d9c2e0d934fbf5dbf0f184bd7fc42e3480cdd05ce792306494fd8a1524b4fcf356491acc84570235995eb98401bb06da9d235c7cba03284a028c54307fabb503286e93f2ec0f4e0beb73b65e73c4444b9a10bee3c1807fa87e0c721771906b8d7446404356b79b14dbbed28b0b6ac2a3a0566725ebef101816cf8044f5034b71000f030b77d739d1ee4b63474cc7c1ac1646704ec8b125eb7808b48c20adc8a44baa88d341c520fcec46b9aea0a60288727cb72ca717aa10bbbdb09e4ea58c9f221717af5af310c386a51924f94cd3e8170816e884faa8a3d37dcf9d3fc00e63cc13ff463d7b486a73dba226cdeb096910afa043d86b2f8306af048cebb0a5000ca89383b782e472c2d5f0c8738061995ae9f9f6b0cd3f490ef54ddddc266172073b2ea3254401e4b2ebdc7ddeb0317a8eeced16610d1f9595ddc5fc56226fd82288b7d1100435d369883c1032ea845450fb2c0d8dcee865951459ef00f9ff0a36ebd6be51a30146758b23df359d1cd3176ee58a633133adad4692222b85555bf3c312316620526309c9d96bb86d6c154d2f9c7d7c4d374e27398b54f1b355dfcb817be00afad7ebf52156d344fca59c7ec105f9a542195a5e3aa3bf8d51658b75d5f20b3383acf8f8872d43788d056a7edba96448d4d8e1263dc8bfded247501cfe4c6970ccca5468fd406d0b355893d2d2a0aabb3ee944a837be34582bdca40306de10ec956694716a870bcb00a6c5e9d6c9f5b0860074741afc1e983ecc1ac4ffb5cdc315fb0385228ac81078771be64a4ff954fea57bd99124597a98cc3a05db00175d5b39d5c40f9b34e6b373fdb74104de34923d793631b0af383b58e7949b546062c9b4b6eaecbdac0577f15a55f6ec4d193ce3c49379713ce8b8dfebcd2fcd56ea0643076e6c8635b37b03f19a70393d3bad6477dce9092a36492d4e4e51cc8ba8eb41ef44fbfcd5827e1bd2fe1adeb60c1d78a0e3c2307b292e8aa0adc0e4c0e70699a18b32666376c998e7b2230279020a6c7a2c5d0e4fe9d3bcedc8f6a4d977d31962328133ad50162314c086df21a986593685fd3d346674c84e595dd1419063a637a1ef74cc138d80da7235cf7d0517bff4b3dacf1394398a1157cd6f7a9e220c00d0834f7fffdde2189037509d4945fb818af4abf99ccdc7e26b6313be2236b26d084838ac9a3235d2f77c30d9875650b0cfbf366327f15f6fd85367f55043620f64e9c4b8ff4a2ac4879c7416d565435f6538f47847d1c668f3e48c9affe824780cad883871d6db8436c61ef8c60a0dc42130a1613141b5bccfb84f2f2a31585cf4b98bb76f545b4c8b7b09df8974bd1ac3232ba81f1823ffff1a82cc55fff0255dc3e66c9e2580f48525a21bdbeebd87bb03c1edc1243d7b4d30c62351e440723fa8d187ada9965e9ee528252eb2533436b180f94f023b9ed6164a047c0a54b72375bd9cd7e89b35f9a01948d3a028e71f4f4d650d7b98738ef87fa21dfad9b939e9888b2c21cfeb4ff5b7a708b653e01fd81f266f7bec2808bd9b2bb91bb2ce9a3f21d339a9ee528939bf5b26f3c4beda746500712aef710674909721f20d05b052ca181ec26814623cee001818ea58d05e730c801a0e340b21880c03c3fc03a73f0297f04f8ceab9d55831bd0a22b714b07c4b0b95f0edc1d4f385057604df9c2c1b84af299c9e6f233b21ab3233fa986c0263868088c4e7842d86e12ec66da9703011281f090472d81067539c0bef519c3f10f1cead3bdc3adbc1c50be16d072e0df4b67eb43696af6d516dd26540d44f3ddfc7498813492fb73b40e81b82cbc1cb0cb9547e9e4035043879506debca1e64b5347a4167500b27280ec3ecc75b1173a9a032bf3f10a79e990dee7cdb036a83ccbe0417a1cf1a84d8aa41d9260948d681d6ad854413fcc68ddcf6be900ae40d0ccc03b408904af5ca3dbd24c90aadf456db7c4703acb924506dd4b3cb13f85cb7be45d502cc67b175b3a851c038739da0302d7813d98e287877ffe2efc0cd6804787e3fc2dc6d87d77359defb8f1fecc337c062ef8f5ff2b84bf4482161b88a947068226ddfcc461c9e67795be396302c2fc4dd171cb1c6d051b95fdcc5e791fa9113014228008e6426b60b01b3f3804d50fabed00ca16e15fae99d3ab5b897f7350e9b8edeb7f4e6829a3838c6005aba2e434c4f571da6c42a36d62b28eb7d1aad1e3f8d65e9185e2b6d3420c61af20aec8153ee92bf0ed2e911f085c1cf6e1ade1dc280b07e14afa24c34b0494fdb6c4dc66140dface9cde77485f5a11fc12b97fb015e049280cbff892d70abe3e7cadfc2642b16204da49b2d20e0a49e8d941bf26dea3cd7944ac554d77e444d7e388966f49317c2046a49383c13c9f6763626c2b7d592f6e992c4a2823b1e45b5038400f51a9470e5a6196170c505e020fb0e38ec16fa5d87d130568aa03b87f0d6457c68b1e8e16665e1ed64039ee4b41d41eae61182ffa6ceb7b1c12d08d21111addc07d8c21c9a57aa842af6166ca5587642fb8cbbd66213df46e6542f287388c8796d58aa3d556e56b20fd426bad8dc429f1125c6ce07fa21528a6205a795801878725b0fb9e6f5b87f1f01ccf97f6de6dcda2f94349d1319acb81c98629790ee3155b0f16c0f8d2b5945b40d14e5f13791ec209120a9c1ece1c667723291beecd5fdd2987dc5d391e670ff8a9c628570541842e70b2d321b6ef5904eb4f084dc5bdfe524633b52d7d9653099f38c2307571e039c5ca81f126599f050f0d675b9133b8c81d72723da5c8501446610aa90e4a5ef0b2e3027631739184b0648f3098b30608001b99317474b115617408eeefae79fd0884a8fce80a8f15a00f0fe5a187ac37543e3235c55a1503b5b7c0039cc12cbe3edbee3930ad3877fa54e946bbd3de86b5c8f846d5b53ea22e58bdf6c143167f250f334cd66fec9bf2c9dcb56c498c0c71eaa139c89bca137a18dfeb9b20fc72f4bc61f9b22cff1411beb698a790c572a311182187be37e3d4b0079bb02ee193c0b610d0d91921a74a4197fbf78b86e069178e7db87107e89bf5b10b6349ca7fe8e24be66bf954375e052b6be6992d5bf404a0adbc55019448a29c881a578ed96828e3cd0e613f89db1a4757866b3cd78eff24f942630a326e1a07012b1fecac3b67de51fc8647eae12c85072e20d4e6b8c13474dc37971d4a73f3646dd450d6b75092d3c27c976310378863e7056347736c9ad7f28c1b1030d1a357d4bdc6266bd9510c6cb2fbc1717ce5ee7c5d6b08ff820eb25778e2c8e9ae63ea6f7defced03e57936891238c313b18a04934041c5449b0714f8d115d7fefc799838f6f6e14d425c2e79e4e9aa7c453bc1932b9f1b3d1fa9ae83490b877dd054f9f81825406dfbff817a780b1e47be500d2bb2c7d0f5e8b98a9fc61b3f061d679a3b8ae42c4b81f1504c961b266a048168d70a48f776f037b0e75d891b9850a9e1e83462cd7841725e5054e91a5108e1980c96936b1d160cd64a3b27a4f8d23d342d180da253d18fa351a559eb9ff6f1e128007f354ba5935364d3a0c4f46c52d49a980df99a81fc41671d1c2a964bf1e2eeec630c22961e5ffcd5be628e49410ab73e4d7655f2034cb05706d5effec00c329b1aa935d9f95645298744dc3b0bc2c1f41a4ab2d9764028e2908b13a368d1c7656dd2a887309a4c856012aacb904d21ac794d815578d4ab0a5c342bf1cddd9509667563b394a6c9b6ddc56908edaf108e1643c6a9be38f1bf151ff6a8bc0b84b98f7af4d9c63eefc38a5fd6b746b733b59b65a5205939ea838c4abb91a9d931e3a805eba2aca64863870b5af0cf67485d218f336f4dfb4344079819249b7922bfee920808d9c5d159aedcc4ba4f21ec6d8489b73d38d474bad9e1d9f751867d67e4cce5815fc8afe6f2b384a9139c383259cc129659ed910e1f4dd6fde5e2883b1b90ff34cb8740786ad108433e131aa5b5d971e534a4636ccce2ff11833e1e2cfc9638508dbe828409e09070a7dd78b79384c307e6972e42ffa1107a68744b91236759115635400ec2fae79fd904ea8011670f2686d812e5d3c002aa62fd00cacc8a2781236e844a7728790df0dcd784c6592ceb95083183a359d57f312a042f56c854a40c97374b933be9501d39dc56c3c2c924c7a46ecc760944f7ddaf64f8faae7b7a0225119691bccf4077f1457f0b5fd50224d25f1d3325a8da055c3f98017a3a2029e0dcb8e07ce255b05a4f2cfa727fd9bfabf58711613e4e565a87bac19b2fcdb03a71961a57e1fd50cb685a6ce84da5774c297f24f493147459ac1facae33526814163c984a6266664ba6cc29d209afa8aa5ef3894ef17f23809472d204f8145fbcebbd259a6c6db5f56eb2686755d61bb3187698bd7c89f39d665281509609abacdd3259710b4625ce01a5deeb768062353cb59d9c1b5943d975f05724157dcd575581875c8a8d08957ab7d20e02e9e1cea51d599cbede813260719e35e092b1fef8247e5e3408c5b9751cb027d35ac3612fa96eafb1d62922ed049b0715c7db6585d56ea03e493977ef16969338569f91e30f31ddc48745ab93e4bf1a82932d421bb854721a5a1cecad2301461f96f573ef50382be4fab1aa67b0b23c4d14847e4a5bb078c0187aaf84e7905cac1b446f3d5b554b18461bac85c0006f3a822b7a81a8a43b0f4ed970f51480ac23eb32b566f2ba6b991e591f736e97d2a3185e4c658e718312d594c9788d28da9a5add215ff6001dd45cb25bd028f690a64048d85e47d0b7272e7acee7a739f6c4c8dd17ecc460ef0c452d9a269895fde28800a5fe7c9d522417a0b0926d3d8187ba0a88f49441cc7b2fda2857ad6bc51662a8fe9e8ade0cade635840389a44c1f9f6ea3ed37a44d14a20a463b49c9b682a5546b841b48ea6418f973eeef3cc43bdc8309011e3cc1b089723cd642750f8c8dfacaa41fcd0574fb2d138af1647727f164a91eb597fc54f1f261f6f014b059d2cad79c86b2acce4af19bc91064d73c88337a7bf8f2f7698cf61588a57df1e052159e9ab7bf92f2e90b295ee4f25136fa61ddddda74b0864e23d31e3646c4afdfc1c622df19dd2d6a6f03ba8d46b7b271d2c85934ac635bc9556ccd5002dbb52f72364a8182ff33e42a5e6f6fccd54b2ae298b4a0f370074c71c6cf30ba7544580ea207718257fa23a06ff502986f6eb56d3941ecb6065cc51b52c32ff5f477ee3abbd22e896b59446d99a15ee722e55c9b34a07d3cf5b14e8cf3acc9c6d1c8a1eec660956ecebe8292d21e08f1fdaa59f3a17f29d71ee675346ae9c3db7f5943318915d0a41fff4c883f0a8bbc04e97b2f9b686742023d33627d90cf3dcd26dc83e8af4d3385d8efd999cbf6d474923f2583f4b2c84058e40ae2a31793b55da6df0329f65b709092351ec72e9e1b82b69a09d0daed5bbf576386f72d48c971c19644b332a76c1df462cd2c8f14fcc7486aae514fb985ef52c81118a2cd210472f85d825b3674b95bbd0b460d1405773d4cc14389d2edf5273199cde313259d18f3266c3034d1c4c6b009cd5d5dc2b937f0e9b9fb331a965eeba8024572493d66dec37d752efb4491514c2f74768ac21b9b60ed3532687bc3eb9d070df79dc0cbceb52b72c158aa2bc9cc2a0ff6338a0b341194134c9657c6b5d1b2307fbd4d59b62449395e2f51637b22bf5a7aab5642de92920ad5a8c2590be427f68052da9ad186d97ca26d8d6f3e49a2b9c8667a017cc0900415e7764d8e1e52fa9638e7e05edfefc355306cf19844db32e5082dcbc28a41734f8d0fcebe1d0bfd4c07dcd4fbf0c8b1da83616dffb32e234753d6797a4387db1af970634ec01376612607ff512e6d690d010178b7d3fdc94f43cbd5c6b4dcfcbe481e2b563725a691de3a76c8e721feaabe1f075e4db4be7aac2f75e08f37845d356f425861f69194a551f50750299cce7634c60e0c4824da124b4158ea02ff1f5e15159332ebc7386a9e02ee6858221e9eeb502f3ef701a7ec03eb857971e93f098990bb9f3e3c2e509099adc6c1e73ca852ff32594f28b4a48d5d729a822b3f12d3ed0bad06bd706058ce82a384572e3a86d9ff9834dd2a0e13b2ae0d0e80be0a255a93bf9ef905393117b3d62da18933c1e813b5784548fba1a64821aa5f508273209c95efa0f2cd33880bee4ef01a3a116402f0df411566d5a0e12abef4d386025127a8f45a140e77a38267f85ee85e82512f7126421e78abc1a63440dc2d10a92677e03e9dafca07cb162edeb4b12c3c6b4b357266244cd41f5410fb334bd0d0475e177d2645417e3a325dd4edbeaff9a0794b4bb45af4786b2370fda3912facfb69a7b45dd3c02a3352ee73d119155f2b388ebaea76f4fa69c824be35291ed42ec6ed84b918f500bc56c1a4523f861bd9269c1119f5c8849ef9cb8cd9d001f38407e99266543c9098c0c2a50ebd9f245f00020f44ce1db365aac3e64f440f308090e3b4aa09680111aebfd0b16907f1044aaf51cd1435759ce7c864908c524ff1485e4379fcd3c081bdd63851bdd7c30baad9bfbc329fba9c27855c4b8d4868a92743dbec8023e1a9740fd00cf607585d824c8c6f15215b7017a431e6f4c7f502b6f72372cd3c9d9d0d9c0b6c8bc5f39de6492315e1251c9308f3187dd96a867f54751e1df22a9265d5e9647bd438a7e25c394fab524714c9fcc4fb591ba5eb58a3bd5de98e7d8028cac36b9f65a2df264cc66f473552961f30b1841bcd5d18d9eec99d14196cec778b209f1033432ebee00bde0fdf88c50ef272708e64b7fe6e7b51143563350d5945846585e5f3f9541ebd97fbbfba818e44250870d46ce37b535b0dc453c1d2274bec2583910e34d0fd9432dbad5d9d4f742f9c2145fb828418c821a32365faff9cecd262ef4b78f38f1deb4fe1417689e40a4aa7fdc3343004042224eb91feeccf8f0f2d1217a4c943d9ea3fb95064ec34b9898d8f3c2b15e4992479eb8c75d45daa2319820d4bd2184acbadf455c52a64015ead04dc2ebb62c6570b2694346d5032498035abc7e8d5920d2324e078dbb6d39ca0f1d53b47706acceb021935b9ada3fa3f08de17f035b3694035084eae39e526a230a9c59351d00001801ee0e038145ff1a723a49f1fda2c40544ad6c84789756611125fe431eb5bdf7cab6b74c49a6c308c508a708930648fca401979f1ec4c94f1f32a108fd9cf3b503cacd4724221b35e1ca0cacc4c195f664c2c568b319e3d9a797a64fece7741762d83659820c9a3c3b27590245892e4430c144cb0e0b003566d0c50aa01015210412473041a28183e130e1e9912dde58c38c1d98a881b11aeb8b5d258a1430000210a64cb1f256c084172eb44a5c3a5358c4e08acdd2982b31e8e1d2c32cc7f6a3a0439d4faa4f95e79ba710e47356e97089290c8961f371abfc36bb38838d1f49f80d064674c68f417e23a28d7ed6d191939fdfdc07a7d68cdfbc6647a39521dd1b3e26c1c0f96471086f5ea8b18448090a5c90c36201820d1948e9e1072c2f94c5cd379c202e2e2723012b8a46a7800f6c5c71840f67709962b579905625f909420b7e2032020c1797d5e6beb9b8f994e962a94460b5acab34978e45f9b183be3f2d683ff69016dd5ebe6b424ef33f6e84114e5c6b54cfd93d3d2ce230aa41b17b7ae79ba77b98f8760030a92dfad844ed6309c8496cd47494180a80d21fe176b75a35573cddafcd29e2d40a69c1c4b7b3174ed17c3bd7bae85b8726881a9342d8db278b53d27b046fe75aab7e78fbd46155ff048d4d03a9623624aaddf366667af408432040fe841ff9845fa95ac9272e922534cc871075c4912eb9d35d336aef187710a748de912848bd115cba046215ce28637236ca2149b399913d5cdad0a81ee5920f801b6155e852498cbb081ee4e5ccc4a314fe702ee2c2918663291cbd261c451b9cef700c6243c7ba86e1483bf7c2b19ec2118761a28b617b38963817210c01e53ec2b1ba299445402a45cdc470b62c7291ab67291cebdce9355c441316f5fc5cf2b3c9587a01f88f988e5561184c3806f92286a373f9e95ec7ba8ed170a473d2f6114eb2d6a8295973ba42def145165eb430e257480b9def676cb8c8c2d5034fcb0421a0f61502a2e25708a8c96f872c78bf7d9016643773c10155fa3bb3e2c426c7ef8c0c2e93158391905533304a3a8d464454545463addcd97fa9d2914c4005155248a1a6c6878f8e8151ccacc627d7778645adcb3046790656a56f10be5d1b7caf7fc1424b45ae516969d249e9dc972ef8a2c21453428051b163a888973da4d451c23c6ebcac91a0138ec2b297ce33d84baec245ce5e24eba5776b8a973ca4ac2ea58c94deb11d5efed851685ba414c2a2c9f717297df6c849a594524a295f3e3c2465cb7a365912fc1cbe477c8e1c4eaf58e373780d89488e3afa1aa72111a959e169ac903d8dcf9088d05013ac665c864464865291119291f1c92903bccc8fcecbfc5879192f59f1c4cbf876f1325eeb8fe0c7c45421f4312f68e263aae8e1631c864424a604e3241211181215533cc9411211d20793fde71e89c8d7117dd7d120530c5185b8e08964fd2cc105433cf39439a44c0f28e5707cb8d9361fbfd990d0021e2c2d58a389124dd690620b1c264a51b431c212334a3da3e062dbb624be6c3225e70a6244e10314dc0fbe76fe80044f3464604a0f94fc4e71e34b09bf53dc08fa21fd35b83f1dfc40ff26027c683be5c67c78e40c224b0b38a8edfbd3885f21265e5ee8891f4e4927734a120b72ce761b14541d16b9c52273acbd618ea8514498d471f28a7d22f163bb787e943522541288874660b3b85b43dd3b542c8a3d8b97b127cfb299d0b38fc2510e6179492be3d9bf89c615341ed7b8b4263f72a3bc0a2aa490c2b834aef971694c1b2033f6ceab8680e16a06759c63c7da87ea33487bfef4040a27ac0775fa287f292df5111b46b2b7156050bc9edbb5053669ed6a9edef926ecfb268c5507e0d4ce389565f62c674ccef8713a799e3226433fce2a73e8796e99cdfdd0aea14fa02fa985b11d04f23f1f79536f57ab28adb554f27cf409733df7c98415d4716930ef8867a7e102487af6f4239c92e1ca19432fb082071da8acda4babd24017257cb0e4f003295856edbb74dda78ea3299e9d8613289c309691c015436d9441a5cb8f134672c0ae749062c4e1dbdbd528f60924c5e636b3297b66186ad8bcc3f903635156371f27cc04c356434f2a8301adb7fbe05487315060cf3e63ec53d6ec13d6eca54f8a60064e73bb23eabbbba7111dd123b347b343504a25c014fcc58928282842014bf6c50096d07880d180cc79a465170b9032255c831ba46c9fc736e736bd4ff257cec92406c0f3c46900bc94e5f88df536e73625cba9f3f1eeb6bccc37c89f7ea4bf8b6f5d4e8e9b1cc7c2fc3dedcf1fea48c24b975e0207f19b70dc705220617338972b724acee66ede4ebb35f8ead65ddf215f5d55922c54000bc28aeb07275424d1e16583177469c20729bef8afee7a69d777d7e9ae2f024a44c0bc5e4031422f2daff344ec16507458411b30255d34812ac232b4c314498cb145942fb1d70f16f0ec0036f1438b2d4c0b4845456ff0bc81450b60563b61f8e470051a5e9854a00b1762b091c51238782326f4f2d159a2d342092de1448e5c4eb9494ec6c0fc521e5eb7424b04f1369a5e474fcc2d9dfbf9331c25cb288494181a51aee7a643951fe5f0fa112d6134b9f66d341a391dcda7dc367bd2706ca741b57f7f8ed4472165b1b2c85d43fbfc1adac1a6e0de909e3ba6b2c8c2ac8ea3d15cc1cc7f523e4bdf17d8393c02be34bd70a4e697c524dfcce277687aa1c759d31dce2453ce1cbeef64039900d706a007233b1d4ddeb66d93b4ef6596fcbedceddcede3dc86746fa7111c8d7c1b85f4c4f237003e171e017fe57f5c4f22db089ca7b1fbf500b85103e046958efaa5f9f596657333b07bce39e7dc36d6960cf06ed116c9961796456d54da1998ce73899c869fdeb43158b2ec3927ed64f66634ea1625c301b9a8910c77473e6a39b76d1b6d73e3e6fc7677a5dceed136b76dab340141b0ce7b60fe043ba456aaf4cdf54df9d6d7e69793b455d15d29a594bb12fc51943b924706c04b5df745ed0cdfbeb4545a4ac377873c8d90dcfcb455232a653843a3816f6f51331bf8f645d19fbe1b085aeecdc626f8e6b669038bb3f6539ec69a97dddd2d65ef72733208262005f5842a75baf409f694bdde1194bbc14ee3044901278520b346adcc0817bc603c53f8e8c0c323459703a98d3af32b9444104c0baa8fdfd99516d0352acdefec0a0fcdef8c8c1d9a68c91c5b64869c9c134ea76e192e44ed4dfb0ce9de340a5454ee81e226c7dc33ec8c0452b51202abda1dc1e6506f2fd2aacebb6777aff1bd687880ce6aa9f445c4d0b283910cdbc6791156a150640392deda3737db271543e77b4e4a6b955f4452e994086a6f7e04e4db51b0a24adf4e9d0f612c52b87086bd81a2ee0fb5f396616fe4ee6c77490ee8bc130c928b9f4956df926098cef976aa6186a69169141a617fa2c6ec6fe8df40207f734eca7e3b49d9cfd37ee730697cecf3bf250de9ef5bd20af9a18e7c0520eac82d2a366773390a21845269eee4b6dbc2f66597774038e70475acd5f7d7a643cae28e209852b640f75b2a31b750cb2d198efb644915c82fea64005ae51e6eb1cb8a217b23d7029b236538ae9656ab552c864449d722d9a83179c958f646b692d66151eabc6ce656bbbe14cca2672c3f4f805f212c27f8fef99d036bbb29520681a8a4a58af1130a6e159d3e9bb379e9c9b6b2a0627150aa75bfa355c7aeb13210ae00441dbbd6b556b1368789cdd141e6d084547514123587789ef970c2093939acaeb1ba06454b8dda85e312c9718924375a2279c4e66c196814155236416913955c68d4b7a355a794cd91ecd3cdead9c5aa5ce8299bb303996a36a4c8ce38d052c700e3b907db831fbbc63e2db4020f6a2b9c92d6aa1d258d5bad12c552d8612b0ba98554511ad4294fe5d9470e7940b2cfdeb0cf399784580a6659a0f87132cf9dbbbb3e9bd3fd536e611f06e22d7e675312cd50d2a449ca1aab4690cd9a4dba365db367a6464973716abfc0a2c3a9e9c67ce347b077ba256d73da9987b00041e105553a936698e9a2aecf7451a5b703a07021841058f449894693ed5819ab55930a15636a79f65662be264fa36a7bc3d3a77db0287696c96225201f9f37be87c92e6e491fb9d5a77e1d16794a993c3ed46eb17addb4c3323c4eddaf537a42ced2e017480e4bd91c4969e52952b5bc039992252ddfc33c78cd4f04ade22912c54e8525861142cf52647ca8395dea086447abbea47cc9d7ab26c3e66c498a015ed64c78e9389b53abc9da5c9735562d1616b394704a72797e31edbb12841fd935c6971fb9875fec3357cec6f032dd10ba427b96af8ec0ac3a906eef10b537eb459e0ca4a4a1f32b850c2fbfe3570a1962306139517b76f0849f988e549b684157b8c271968eb876b9b2566144a2382ee0a410c3b6a9c0a9cdb7060b1870e91e444133eedae1eac98f9fe0c47b521dc8c46c5ea7d415bad2bad27acef7f3e80a5754aee39c25d1d06f3e5998dded9bfcedc5b90d9edbb89000466cf9d104cff90bfc1c052917d6d44a4944b8e60a2e5c469c8f5a5d212b425666cff96e3e2cb6365816b0df5eb009b1e2e6333b709cd7cd5915e81c8c7462d6c6aebdd97c098b1b89591b0b582aebb58455a06f1b9193dfa2d48236975998e516e62d0bab76b5e5372ebfa5b6d4540cea287960cdcca27586632d719c9c6dce31ac0056ea0df44d9c27792e943ff22b34b15c6dce4db6b925eee4a3c4acde1c8a16159c05cfb7361e7eedcd2667b4cd25911c12620dfd4af9156205f14b225244fa340a4a1df9d5f9e633039da7073ca5e0a83e2993e7791e3bc7543b2516c717091362e9f06cdbb66d9b7bcc711ce700d04dcee2e672652a22574956314f1c0c5952b6323d0007134e90d02403031c3e0d71a1519bcbc060639b7f27234558dc7626797adbfcfbf8fbbccf6320f450c4cccc3316ab70a7ee3575b8b62dc64112c6dc8481989939ded9179dcde5cf9c7372a11c5a3da92b64e5e739eec479ce79a08ffc9a81c5cde76902431cfb7021bf90d0105b91dc6483081a55049e482e49111021b622392904432472053a78cac08906169786420efbe01239e394c9f3fdce379f277e710e1a1574ef24bb530c14160e41625481e5500617363080850a8896803df1c197d526058d339ab08896f8e18bd5f6b2828d2982b0831b5be2586d3e4fe029e6492b872a874666c9ec505750ea0a59e1798e619b33d0e6fc621f3f22cb9847388e2b4261cab736d2870a9c9a511451a554e9a47616b0540fcca72ccaa13ad990a2a48bef709cbf030875a452accb2ddd1015fc15b2e20351f57e85acb0b69f679f20534a9dfad031658105eb7c928874555e3ec85aa39656e12112c750a396ee500195c10885e1032c75fb150ac30bce8edfd90d54b0d31c6fbccddcf267f3c86d2b31c7736339674b6e96f2934cd94b30404a2a322ab2a522a322b3b1791b9faf8423aa646729c3b79c1ac7c9bf3da5e4810b2eb808615cccf9c352d6d439431fa5d2732a129127e4b6cb280e4f566a50a55cee2c4a41c2c8e22d901f6baaa0f1eddd5ec3a8a2c4ac203f8499a8d2f2e1f169d580b79b9f4ffdfd4ba2637ced6bb3b5e5162f9fc1a6cd62162cf701f99c7327f9cffa6db9246c6833d291be94cb39fb9c7d8a40151bc7cdca22e8aaeb236d2a351500a94007182e236446b44e547c888a908d20142bc2b5332480d910114544b44428ca32044cb4416b88961034ee8b97102cd76b052f805c4a82a885413250060db18c624b10b0141011a00b16105f80f8a6ec2871fde07229b02f4431b2a02018095c10f9d0e3436ba33eb6c0df2137d2a72c8e46bec9d168340ac7752edcf58daeafe710da9e526b273382a315a43c309e296628681c1a04278520420c356a2914201440040f164a86081aa24a6df2c38e1205ecec306a7fa495c4048472858b38b6da0d7260318b8338c6286e117c6e69ee98734e9a39e79039ca26347473ce39b7d973863047939bafb1ca988bbb5cdac1342a7ec1843470178e740b479c668521e5c2511842e8262f51496be7eeeeeeeeeed3c9634edc2ceeeeee6ea72177b708cd8a01807bb8e87fb2062f39f07dcbb26444e5367aca521155baecaef858aca70f52243b91ccb9f1b6bb93dbc2d24e95cedabe98bd6d1b770e2755fac7cde63979063854fa90b67043877c054df1e24712a260f1239fa391d71d7ee4a51a08fdc81d891fb9b805118e08b1d5b623cacbe74792fb615649e5cc4189d16e93c916716071460dd0106235d69e9f73ce86a0c1a1831222ce987d734e11941ec423119950e2383d7b47d5a8d27b4c1f3f6d7e92f0630a3fe712e017053f7dce18193f67ec8d9f4f641f6e5ae7bcc354685a2449562419667b631a79d7ce8d42df508688c53dadd720e0e70a3f717ea66a3667daec0d4a56c7b6f939f62fe194cf9cd39bce09fa602a7b43677b434313f56ee41c0d4d23ceb9cd6652d601137bafab49aecb10c914c97891a9c97ce194e9f39d61cd38b1399dafe77c02a150cfe5a9961ae579cc933a5dedf9e4f17cb2daf3d9f27c466746c9ccce6fcfefcc925f9ff1f9f5f7bc1ef20b679715f27559aed52ace3de7669bf3b9e79cd0e650d99c18f77c16f51656edcaa3efe5f8baa8f1dec8e3f2de1c7aef2b6a54182b04e62547439c22b9e7a32c23daa8cae680eef92cc9aa570434baf25e0dc7529885abbde71c18abf25c63bc9783f7b834def3597b8fbee6ab55bb2a71ac5af3c6b935aec31f90c3778438ecf01cae23c4410a233b3c87e3a0c36b3cc7c9246b4e26194acf1122916247886487e770243ae6a9888e13f782e5e0f101e23cdf1ca75a73aa3b5313ce9952f5bc6ff69ed7c0f810961de8fc0b5be8ffdc73b58a546b94e7240fe62585907664099ec3bcc62e0ba768adaa711006ba4017e8fa6276254f359445aab50a06a64796c06aca6a52ad49b526d5de7375b5f7bc167dc99c3eda97e51b62f10be38a1260f855d91baf7dec581dab63c1bc607a62605e30afcfa1cb4b989ef7d6d379cf67ab555eadc47a4fae644e5eab519ec39c3c1d163d279d3c168b9e83a7eecbde784eda91423a206c099e7b5d1cef9176def31812cf7b0eba5a05f35a94e7a552ad0b03bade1b41d87b5e73fa688df26a94be5ad5bd1ae539a5b5bede739a27ea08f385f5b138e5b957f3fcd361158d7bfe296195e834a7203327a75576acf748309f375bad567db44679ee79f7da9cea9e7b3a9c8a71af7b79b5bdf162c22f0b8b5e8cb7c3a2e7f1b0e8794ce8b958f47cf46aef8d9eebbd22e9f97a5916c1d3ee0d6535a5b52eeb3dff4266c1c44c417c6b3302813de83ba2d946d5b81edc793007eb41ff72286111cce1aa79b520543dff28fd0124964015f8038851a0afff08da9b58a53ea25c557a11951f9ad8ab7be1a803f6a0eb80b1087268aa5e47683de83a7e58047d2cfdab5523077d44b91e6cfd58697c5a45d3923c53fb2e1c9da6d52a1a9f4681eed1b42a4deb419a170a33a8cbf936d2bc1e74b18c15699b231f74118d07778d07451f3ce83f683f8838551d74116873fa411f7f6c79f00797077f143de83227ea3f865a65922b24a0832ed2c4a2560d000b2037a69ca0091ed658812ed65a35440a2d0838d2b8c2082456a08b34d04522d07f008194d61afe007ad0d7060c6b0002a336a035e1f1a202a292cd3853f49d7f13a05cd8445bed3ba7b5277b701c0d7930198e52c2b400469531499771120b26e9db578731c91086ed6bf879cc100f0d3dbb07f360cf6104aaa82dfbd1bf8938d8e6b077ce51b139f23be7aad81c18ef7c236a557b27c36e2b82e3471829bcf8ce67ac5574d5f994712a6873a4779c7713e83b9fae56c5f834ca8a150202c91110a77678e72327a3588f7e364787efaae4535f3edf815a7ce7e3088befdc0bc1300bd7b817aceaa330a850bee3baa8c1c0bef34d364bb43ad45be71f3df170eeb4ed03783817e2208511ce37c7a187f3f0076c3870bef9ae4845746868029d3a0fe7a8f37023d4798426d0394fb23232da4213189a64e0e19c1be1e15c88440ad091f4701e0e869c6f9e64254ff287709146810e6eb52056f1f0968be3e9389fef3a992f5eb86ce1e1a34c96df7c94a9f21d0e3cbc87839bfb70d03f597dbeab3fdf15fd18236b221959ab7884750ba33aef6a3c422eb3efaa171959575a11ce39f7e13e600ffa928cf0084d4536dfbc87f7609f0763ba1849a4e44318001d6861679cc3167ac6470a9189224be89c656666adaab1d90773f2681fd08c4fab66668dea7c264896d079a9d41f50cff8f48c4fcff83c49a6a58e24d877ee435882df5085d526d587c5eac496d0797de28b6f48475897ec4de743588422eac83c0ffa0802cd6682e4cc0c269c09face613c528ce484539249449c7ce74dd4aa1819ed63644ff070d389146b54e7a513c9098b9def38918058ec5cc789f4b3379dcb44914248566c099d77242cbe9389c29f4546f69dd758ab66668beabc54aa35f62419ed3b8f91d11c517b7c43ad02871ad539a5b50e7de7344fd47166f69dc70401cd3835824331324e6d184bf47ce7315562b2702a87d71289b484e4d32a1e5e63df9180be731004817a87378948c99bb439db390a31a8a31f9b88c7a9c2863687e49de7e03d201f1c8a91ed4d579bb0d879108b9d0f6199222a69c662e73224c958ec7c8c917de742a8d491240b7a920f7de7e050ab7a78e7208d5339bc73700b48c4291aef1ce4c2a9ea9de9246b3b4eb28845761d27c90588d25a3fa0ef7a9c9c8413ce290516799ce4cc69c689bd09029e4ca093605cc62b189a603eefb42cc6f80a3fd4ce6976eab835da77448b82f10e666198d5238bde0b0b42b4d4960c9955b3391340210695fb25c1b80d304e0a7168fd6822b94c58c33ec2b587f198d3d83bdbc384265208c3f6a083a10c5177610d3345954f4d380b8bdb999959ce14b2b83a2af9b96d8e92db9d9022c0b199d1a941f90b285b586f500aa5a7c64bb40015e0420c2517e7afd0184cbc1db46c91c30da6942535ec0571e299c11a1f42578884c66822895d55f786a364fd9e40305fa8bfdebdcb05f822665dd59aabe97d325257b3ddf482f71d7620e69f988d6a148b0acf5462d1d0fea4b5746692680cd74cd658dc6a6ead71bf941ca6a393f2945877a335bdfc287be4924fe2e5cfd39de2832638a8e2c5172d44b023e1d43e89638767492467bcb20a8b2de4872afd0752e50089e29ccd8421190d72724e389d78f09021c439898d62399b15492636677f777757c4314186cdd948601c914516473d3a2559d5d0a18933cd212d65dfdbdc662f9d7df6ed7c0cb4393b3b4a432b8b15452f85db3d592a655968d7e54a180db476083f2e6da9c8b0373b5a55c218cbe6b437dda6fc0399a281452964e420bca46248e95aea0ea4f40fb62ed757061a38257d9a6ca1d384c7d99b752f06dfdac8954702a9022247a0ea02525ab9616bd9577cd84819c2091f3730b3582cd60d2ccb90476419738b1afc8431d9ca11127634e1658a2324948084118595d2d2bc30a2b0b234da2217f116239ae0a2a1146886bec8410a568e883c82ccf839226e10c9c98ccb060ddd30a22c16eb86510d0a47049d51638508cb1e1108aad2d749d24130a7ef3628493d89cc293f094bf9c3b74e65bbf7e4c1e5cfb94d706e345cd4edb9c2937e084ba29f253405be28112708151a51518dd572f1ec3a966fd9c7d7804f4fbb3761d7802379f0b17f2b7d7a92962f2c270143326337b0cc42ce522babc0b23ca7cf75498281553b84556ce27c75ba91ef6934811166ada877271e82ac462098bfb9e905f9fa6deb9049262e2c32f27d237545392eec40cc6fe113d4f7cae3fc1c25eb594f4f7b2241a3a613b9265cf98df14879e95f8ce4a16ebf319e282f5dcc516b96080121ca8fa5e7590273544e49e7223e29875a51e6ef502bf6352cbec1cc2e673f82d27793015994bfb199925f1b8e852114472cd4f1c9b004f8491e2aff0ac101f3097549e36b7cc0210b7ac2e5d16dc95cc85c3b87b367b773e11cc91ab31c174a6e379e64c424c7259c203139ddddeb6e1e9b3df450657e857e10f423cec80a905fa117d00f9c3cc162528423598a292cea384729b9e76699eed4bb8575cebf29e7b67b13df2a3d2c70e24a8d0656b4d1a304107490d881c9152992849dd92451c79dcdd0453687c74b37928241a5b3376e3bcc32011649446618c96598222c4adf5911233370188445c9399f4671149f36d75c73deeeb1407db41d117f6bfacc6deb93fe643105d59f06e919905e64868631c207b22126b102e4cc60354f52081e7ee0b392d1a2c436782f590671c3265f70168b05c6b73623c99592411d29159bc3f990944f96c54bff785824f2c697df01e294740ae3d40abdc1e5a5d31f4e3175f25d4461a9e6c2228cc5eda7842ab8fcace442c4a2c4d1f2fa62a34fece1178b92fef0b46a83491e7e6d30192f9502c1581462451d9ba8893865da18284d72c0ae244fa3383a9acd92c371e4437a14fb869ac2be59779feca5df38a934bf42352592f523fde16e6250c72f564423b5a41076e9241f98e7a58fdfa9b534ad687336d8de48ef3556b5c9c87434e8e5cfde489f42ac8a5ab1515eba84b128bb5498dc19f3541ed20f3aa8dfef9538582d6ca9f3f74a10befc4861ef9946beab8e564a6989ca28fd3658ab28158b929e05d093972ee5a584b56a5740b19732d811b1c6b1c1b6d826db601bd06e302534d63020920c72d5c1c035f0a97d396fa19d0b398e0b3720167f5894bf9dc20dc6a294e9a1ba498bda9fcfcbd3c8ad7fa273f13bef554737d8cbb9ea420afb622fa57fb36fe88b7d32924b8712baf50d254c5c4ed050f0a2073d4ef42c19a271a3c9929f25ae9817272ca0b12047a88d2039e27a6e4dc09e09d8cbb003a32f7f03bfe90597e158821fed0d8fe801bc4e7ad24772341a49399272240d7082c90406880af32bc4064d84dfd91b3c346354e9ebcc416acc86c3cb5a76c6629005590c5d1d3de10479c6c1c1d99c6d19b0317b5559a2f6e48b35684b5459e28422d8123c4b2c49a91145092f4acca07cc1832125809478d18006a0ebdc2075658050bc388ed26572f15a63321851804175bae034d2b8001c6db85a289869c1440f28612041841524da5863e53a004154d3618b1665ac469c2e39e0388a501734101005185ab0b1c3952a84ba087589753edb6e62a3d6413a7b8694456fd40acd6f9053fe1d7aa0fe689a7efa7df2a66d086f2719f6667d9e2afba067f5ca22dfb0fdd69b9c93e338ae86eb0092af3f4bd327e7dc0ddb6f21f8376c4986f0e6822e4a946829b153a34216988c175c9624912509d84cdde95ccf0e39aee9fa9873bd9a31eadc475deaf3e18593c5128b74ca11734d0f2ae8f33457dc7cb77d61feecf9bedd5d4a5784ee76f64d763719312855c0d145ac31a3cc0009182764745c0051fb7cb04589a30b49012ec4608353f2d2f62b9486cc0ba63e1eb1791552605106d941a5bf4269c49ef352b95fa134b4f88d288d178c4ea5ba3e8628c08518604085cafc0aa5d1c477bf42691cf1a3386363075cd250f22bb4832f7587d00e7492e849a225644ce205acf6ef8c0c344abf331c9c20071815c011a36e173fc07ea43ed028586b8c306bb5f9d6b0ce29699adcc9344316565bd80ac2382d4e5f6da3df5669c5fdb6ea6afb0d41d0ffc40836e74e2dbada9c494626c98864b18c6c6cb55c9bdb36a7747738a707b693142dec6f1755ae428043d17881f136df2498b1e50370060abecf10e39ba8c9b78b68e8e0a8be2c2b5ac6a4bb672471838ef339d613e7e3a4cdcc2c033388d0418be338cec9739cbb1003c771dc1682e1dc17b7d09e594557b5b665d6d3430b400e887aa2f4f86cf1852a072c24908821a08c2f5ab428a179af47193b2ba0ad805551b1fffca32018b29e759e6b8a9e6bbeb0c8ac67d7f3a8e3f5ece2cc45e39a1167cfeced343cad9aa9358a279f3a1c6960fff9e733b556d1f034eaf3aff3666affb91af579de8d34aefffc870fa5b5fef0f94f004dfe137dfef3b5f9c21a50b129c587420ceaf64b43e7cebea4223a9d7b4e7a180f7c407e3ba525772969d8e1a503418ba02531a3e38dbc3b7dd3797a73e1686adfc7a1f59c6fa351686a9f5c386ea169ce1086eddbb79f6f6dc6ce8656c955d7755de71d9bdeb2e90d9bde40b4c872fdd3405cd830eaa23c9cfb68a39a382c02fa7e8729e9a58e22ed3b3fc98052ac255174df50c64b9d813219e9a421d8d7a6ee86b14af2008b32eb2c4e7a0bd3b6fcd84e7e7a45597e307da9fcd8557eced9443fbdb985716a4e375cde3f4259a2fc741a36d04f87f9e97249e5bcc319168b52d640178b3b3f37252ccef96ad4b4418896f52c2c2eedb73bd5b03ef2cf04454d22b29b8f42133be7a71ab6f008d77e9d6bbf91886c68e251ed27d56171b6ba168b93eef050178b93468a3a8e5edfe97442a8d4f6756ef4f2d14665ef6fb4631aed8c1ceca70fe8f3d520785a12f5c2e2749e1c10871cccf5b3d3f9e9230773805c81e17c753a5b0c09c9617c91c8f88cef4c2c26e375661da8552623310eae832793119287401b9abe2f34edb248c7868d1bedb7a29fb056813e8b7edc589fb9a8746db4964d0b15a20104000000b314002030100c08854281482822d635493d14800a7d98427658990b646914c328c818430c2100004000008600903234355500f3286c3ea8574f59b196ee75747429fa134e1b9db931a41485e1712d42c927badc9f0c8424232a0fa2dc62203bbfe7998d2243094f272a40134727a01ea60c0ee838a2f30e1a96d06d4f76ead125dd40484742e9183a061a6dac53b5401f15facda12b7f5ca68c8da14b7f20db8fa5520ee870af31502d2821d2fa145dd6036d5363e39e4b7960036b1bf4c8d0b3088a38a89df2d4c1496cab1a74f4c2f74d028f8a182763d9d0b85cf7aa0fa156dea69a7bd7026edb5c65a24de44c71080e13c8f2844c4fadc9a2adc4b6d5d5d90d2ecd1096889b105eed1e48c1ea0c28647b6bb4aad974f4f1d257d270188478cf0790357fb5bec5d80877581f34721982589e96dea2d5e555a31b30752d05073a6046f432f51930ddae8681cd6f10d853227f3af1db8db3e92c6e6ed8dc024103d28d8fca5e3380c9edc392142f58ffd172f6d52d653bd83ca4d7a9d3f37e9aca76406cb463bdc935c82a01ea9f3a9ad4506ddd4e20aaef9d6ded1f26e00722145e8e85ad196ca1156136ca8fc78ace2ed39049082ab091da2194ada06bb9b06ea97235b8ab1e7529ccb08131d74f03e9c19327fce12176e0e5ee15ec61403f5ddca70c18aab9d2a3952fd1b0a42f80a4529d1d462235f5f983dd4c13beeb157fb76a7fa8d61a268e2f5105cfbb485754550567fd18956ae2cfcf37aa8039b568643948a1d49013df743e1175a9d4152cb028ee28804292a5eeb35a27fbe0b302b92fe6ebdc69a3e0b809bff7fbf718806e153514a32a92791cceff7d184c2be54d7a58b909e564593bdd913213bed085cb06b6744dc4ee6ca9c306d4e8b40b5c9dda19763722e0bad6a045573ba54c292703a5e6a471ce17a00fb21ed29e933776ff65cc73b61e09a56cd6fbe2f7ed6db320bc0564d4c352edd37cf52ddb9c532cb5169498c1c5f67404dd6e7635874edb2d5c578eb0abd6b8e9367c5f254a389b4f02712e2beb1068ff0d247b54110ac9997a2e76044452df765c81621a40afca8d624ea8e15c28bcb9de8aab5ed41eb5c56ba232561a726a80856dd35c8f8ba0da4e6454b64afdf85aaf3cf46b7f74d6e8dc94a451745392fbab2c365b92f2782c553cc2e4e2ca80df1665b99f9846c4847044815fd6da5ffdbae09c807b1f39b417fcab4debdb2d2e244fc7a31aef1366c7cbf924def74fbbc62999581668f890a1f28b0a9e338a098fe6d47ec74f4232691075e3eecfe42434ccffd082eb64ce28b411cd328b4cf53c75d334c563cf2c3875b371622ac30c3ffb47e248af8af8a8cbd24f6d757a75d043c07cd468e70051c8a8713b63426e696061a84545b925e5e95261b69ee837194db9d750e36340c32c459bc3fdd69e3b2c0b4b65f0f4c6f867634dd0078614bae4b93eb6f1d873094b3240b91bc6ee3a0fc52f7c6262cd87704827afe09019e446b1c411502d5faa477b76a2178ec99add22c171ed85b511f902eec47282d003202b2416436f3bb04a113556e07c8c356aeb4410bc750acebbba3054247becc97c0b9c0c90b95818f75a31626262b5f65062175b538e70110ba4838b00563f931d2af5eea6d4abcd39e854d0892e4a585a6370a08ee6d8ba3ba403bd210a557747a534de67dab970c03de147f101340bdf049d9d10706c07fda4510836ace06c1cb30870bb6ce6a112fa8c24a911f4430a62547e185277658586255572208040ec64ece5a977f951cd66920c45f2416ff83e4dc5b7ce15e7a7a0b9b354885165a717b31e3fdfe7c430bdecab91d1b7457e142e9a08d6a5875735d2fd481d248dbb4bcd4cc71a8998311809f709264b35dce0073aa658c5c76394fc96c5f57c948976f0f31e18465cd8240153e2e4b1f18624761e4564d0595c32a7165c8d9204cf37d0d5f8abd49124ee3fe15b7220880e0e936036833722a6de67ee5f8b2e52cca8bb79638f08d8ae29afa6893d5557540b8acab2e4f87e63038979cee9fd84e421c104a1be9b789b3dd3a556548293e0b6a930fce95bc266d6422b716ebb1215c7d5b8241d8740fd74c5f10541c42e22b851507a642bf13814c9e7980a9985d8cd98c7b8ab4fcc2c149fa4675ec314fdfcf67eabd5c5b1c9f7b85d0f64886b231ddb7decd8e2c028035acbb5afbbb51304d66751d86a87a2c4da2f5eb3f09f84566afb86a94288e10fe56fd9edc91a5ca9980e0231a6e208bc9d1ca907008cbd2d010167b3bddfa6436ed581e9e99121d1085e92a469efcf5ca6d0f686ad2c59aaa6abf6bac8412395b894dcefb8643f2fce62b3ca3cca6df1c1b6f1ec6b9eca2a04384520905c1e73c5d5e7b87b88dbf76ae7675f19084657abefc66791550c8b5ae1900fa244139dff28204335e8355f96322e4d75b7833e6e5c25705d5cd96d2a5f4fe3442826a6173c6262c9f1cd6b4ff5731322570389b8ce8b417f5b4c0d0571e6e0bd24d825a17d1f3feafe21fe54468dd02b6f0e8e782c0c1777ff116a509a278989c912ca80f624128386a90fd44db316a3838e5cebb8af12c37028b1b555e2806c3fc586dff51734376147cc3b8e129edc4e4e6251411bf04813b50e8b06e74417d7820185ab967ef06fd39922f20b4f81b5209725f4727ccbc1525827feb02611c222e02d9e6803e980bbe02a5e2eb898318fb64c31d16c9c9bde6e024e55b2c51235c24b758434d0f4986700c92f337d087e70a6a0aad919734003ea5e3041fbb20d84c4ca57e5146970f1361e4f174a534b35fcbf589c248bf6f4ade052bb12435e7c7214d664fdf1f80a25bf2e133b0488f610a84f3ab2d11321a2617c90e92ba61013cb3826a8ebea6be22f20135fee0ef028fdc65051f24d7aa4fdaf51bf99f151bd49700d398c1f1497188f75eceaab7e049c5a7750e22a74a36f72b9e4cb27357182ac8600d2567a9ecd590701a575218247d0a736db06baa203418dd55907816e027471cee6dd2519d0e435fc332044603734df8f27b5bac628f964c38c1fc73744d2b23b25dafc7365121861ef14aee9f89402831ae5163cd329715a8ba93faae3e3a022b6af01dce18827118e1928165d8cd04ef415ceae8948b39a1790fbf5f1bffdc347c38fc16d52877b3af896dbfe8b8cfe9b50b58d483ea2e18819efd86ff8d6f16ce42011297b18c12e51c5625f7a7b6cae17f90f4b1db73e756a3269c22c0548f0562f0be096ac4a1d6b7bbf84ee6ab7eda2f86c1db513dbb194ebab833713b8554dddaebeba834edfed71c044d4f57ec1407ae6cd4542b0ce0afe34f9e31a6f3ba545b6916061b2ab62c5e650083ae8be70548bac2d240146cc27470321a2fce9e4d8119c97ffff0bbc75a79903d4df28d2e92b9209e5563682b11c4a16f0dcfb402e32a250469ddace2ecfd6469aa036ee292e5c2206e602f5e42959dcba8654e84f354b7ba4a2a940ee14153c61de61048bf42eab34e4b61f22cbedc17551268a32eea0c8f25ed0c226017d86f35f61f142e66196094c9545eb9464a9695b27be977aafbd6491b397243771cb9cbdfe88b9c9aaf693d4d8e291057c73541f4db43ad12d273071c7c225c1276d8c6484ec2800cf8bc45385d697c53d31dbf9225b6cef42745d24e089ec94f8d2446f0e27570dae0b78bd54f7bfdcc11801723921fe6b0812c776a2cc537e3983d106c57c0644d0772851fab2407a70a021d7f0f2f2a9762869cd198b67ce6b100e50cc403bce0d4b3b18a17187d2675df78293ea710100ceb6976e13351c9d6f8e989e90ac375fff39bceba3030518a6874ef213bc858ee482246d74844ff66402baa9734309ce79c13ee5602d30d0b31628e838290f279172c275621cb5f0ba6946a600b3c26be048b9d0c5796d45df5d1dbee2f40f462bba535027ecbdae370043532c5c919043eeb5f6062795b62406dc03595a06b3935001d32ccd187558323022b29c0076b1c76f283fe8bca186a922a16aa4d3b8dc25f370e2e9598746ff076635aefb16e86162ae9869b1cf0bdab1ff4cb9ffb2c4de26e8d911a75374a2fa5ad40be6b89fb24bf62efca4d29fb4d720767f3f6e94f1b5bc2265d2166f8fc4c65facf5bb2eda28495ae63fc6d0d3c340e02b065ad5ef8b898fbe4b0cc11a557509e1c7ab4b817801593622bd8d8ceb717f4519f3b50a5e6d1fbc8a0df02d8125fded20982f7702fecd7be7cfc652ea2fd8e4230db2b726a1719a85fceae7f60fa515bba467dd3aadfa86503bb2fc51b9daa870428a16c791c9bf7d4b90799a000ee5825e844f6083ac16407c2079da04b3c1df7bf91fec5801b16b3f60daf44fbf757312b01fb4ce18bfa8085b4b1600b68b7317a27f33483cd8640b32f3af9678252084bad0ff5a24fd17686e2d436a954e78ede8387e11de18985728aac38176c34b8d11610e465d4e8ff16d68bdd92a111951118510ab645ef7d342e14a3f493becab499f016812fa60b76548772ee46e9365eb17e86166343aa7ab99bc5abc2a844b04a0a64829bdffa5348fe411c8a7d382eba3752526d7c85422574b45e19bc2b4d445dcceb4ade200caefe9c9e17ea4824a27d4936e2f01f5329d7721d7bbeb45140bc34995176b63522d7abee5a2ba0b99e5fdcd12fbcb590f8af437dfa7c7088eb4fe1d9bd51e4dfe8bece5bd8dd1b49ee8ef91fa2505ef0562fe6f03317d914fe1899baa8fc5521c8809f9d6f1217e04e4524da631714b8da6f81cda3772f28f67f52f51ec2f060480295e82acf94394f8fb124d6335a99638b67570ed68d76234c586efd335acd0aa8e62735297b75c4bd41433de608545fb12a01c99917db7dff8fa727ef88a70f0995c1f0cc9bbc5bcc4c9a523673286a3bd6d24c4979254c2b8b4a1a133710fb54df03d094b55df61484614623bde1ed6549838aba5db8bbd0acd455f133837b40e10243baffab0fdabecd39e39132d4d5788f629543cc4beaea7e13cd00b7cf5d3814213accc030174dfde2b8119fd7623d9e8209ce8d35037b589fb79138752da8475bce5af98d17e0350af3714888b7f95580fa7bb2127869e57a8b3c7062a0d2eecb4f7ae739c2b217441ebb300ba46bd5ec58fd4c25e196b71f331e23ee66a33b17b6f9d0ea7d3d0e3b556d727e60b0fa35d82327d351ea5d91ae7b97ec106b2331f1ec2e055452f49c6ae9a8d172ccd3342c929266ceb22a5053f125de3ab9b1052b1fd74179c8514ed8c92d1c5884f64503fc1295d61dd44aba05ad7906c160d67659435ab69ecf41c85df1a4d8623315016eea4fa7513452f36c36f368d3c476617cb82228f7bd6f0c7764622f9125ae53940028f4534ed2189856f88c2655fec5d4659e6e3967387eab37b3e0d8d2651ba4dce500de17928631e632787b8381e477949b595fa02867c144bf19ab52adc2ebc6770d100fd3d0e052aae21a7430dbea99d96889d1f126629232c633fb9292372a0ac1ffa0b023255fd4f3410f6a38a120ef35e5f8ec18c5315a111f16f23185a3ca21d8a87473ccba08976ddaa1530fca0aa7002ff8d48e32b3e6494f4dbd89baf14478f6fae2fa08498f6e76c7041ec54ffad77af657443e1424c7e5271b7d3f2e1087625122a3d0344c189b8102755f625ea2f41a53aee04b25de4a5331b57a1b7bebab6357a60337ba2207954e65a275eaa0234bf5ee24d2e3c4f0d38c36aef6b9820f96af1708d72bbf712c166f5613f50757531f7d49de1347c19eea7772bf957191312ce62fc7336980e9bfefbed9bde0a37c1ac1d32e8db49191f475b646cecd8f7430caa1378795a0e276c0869ab2294e2ccb97a49175466f51b2f2efabaa33725d930506154690f7f37aa8e74d5d14c1c02a6a0326346fef11491e3a34bae2aed84e8256a27cb5f0e2405028d2268aaef83f53aeaa2051d2c5d183acad7b78604aeca4ffa4d05574e69bfbfba40c0919c23493e4d642b6cde7f9627aa422e9dff2f0666b05b5e888ed5d51299b8942f06c66b0156dd13bb55017291582b75a1c5e7e512b1bf52d72da9236bd965062bb471dada453878b8fe7b110a2e44b7682453a964135cdc5efae8782439df8c36cc64318edf7cc7a31273d26782d008e2d0883411be09f1b2f5fc1ff040cf2fc6c1ffeda22117f84d0833a3846c3ac693e61af8b6964d89021e0c446b759132125e3db4d48f591e40a8aecfed0dc9e69b89318a061b93669d4e9e113f134033812f44bfc4385e16592f164c1f0b7ac41edd85b43a95e8c491a01ce8a2e67c8d7197b72a3b4bf4db480ef012a39d8cadc57dac8dcea1faf89d48af2be5dcc01e27c5f567603f22d13f1cd8525100b79854ff56245ec48902a21cd8187f710cb895750da88721f87a0e93ea2140c7ef5b5fcb8b9a6755c537d55c37448fcf22c663fc8d3ec9484faf3d72d099fc7ae6c0e1020d0eb9f2a2b21e30cbe3da6cb72e22036f17296d5ef9dea17605a2029f2b4a9c7447890241a2cbf992d08967b90d985cce3953b8f2b2c7123423754c8dd41f3752e5d2b04a0888bb8abab4d03d166e923679721f2beb8351fcb4834348b4d4c605fa9d05a284fe5c4f962bc9fa77762c35cc8d12a21b337bc67c913760a3f0932b24fad40bac4a564bec5dc60287bd64c0946c7f87323c9c56e1ca628c15de916075b4969d8b5fa8fcb25fa489b093ea711b771cd616d1f06616fb56d5050ea2d1eaaf0b872b65ebab83f5e9056483f5dc1a28bba7b18dda5712a6d7f5eed5b204ce3728ce1e3efe9ef3d6a50c6f0a3835d5a5afbcd12ef07e63a469aebf37218a19664d063954256624c05ab1b9e23468a8140e05866ea81dd15e3796ad2a646413613d24d325ac4921594d398ded0b0d7c77d645137560bffc1e6928c1d9832fc9018da0f68c753eba63da09da86e1073a429ce48c47686fd665dfdb13b296ee7ea55726bfd7aef8e217fbb2b0995111a5d036ca71630bac1741bed00f95094fd13080bea1593a511e27ac30cc0b3aa66cb9faa5707bb7fa9377efa39e841f86325befbe23f0993d7a90a6895f08723961220b0d73009353cad1bef09468ce1446935a0e1d16796e47523ed652c707856a1b714a166c173debb9844e931506d18d26e9dffa43f2b2ccd3af2432e8c49b21b818d13487734a6609d10e52c300bdebc30a96b1d3d1510f9bf4e44465c0473cf273a91428230f71ddef7f41362221c4667cb3845d716fee55ae9f2bd41ace10cd3039b3a36add92d66f01119d1c486354ee33280a2a665c18ae153b20b6cca2f25752574dd1bcddc08a6bf5527d3ad79d28ab16ac7e584ccb8c405a0d8a3cd6d5f4165faf6a295f2ca9085691eb56044389f020e88651f0217850fca73a418d3994951231104371c69b26a8c17ef2d82241216826142743d65a9db10289e367d3cde02917b86e60d952dea35abc9bf3af4757533aa4298dd28d4e31e5b56ad89a47d08ad74e3ea7821c5dfdf59c6834a39ec67a731d2db5e35cf1fd2d0a51c159e8e938b19c662b361a16fd713c986db431b6845ea4fd44520c4bc8971e07938880580c0c4b91b2c793a05823f248b6e1c2ec2512ee707fa20f975fa0636090fd62c7cf8ebc311b40a77efc529894e05e7acc1841d73212571abefcf7c0c46a497da59618ef8ad35ce0f58b651bf0c308bd47bc2e68584c88e30469a4c37d225d42b1149641514c48e87e6b1ee153cc454dbeb27336b29e23b40247434e8d45a260b59bb1d53f51654d6f9765dd55c55870eaa5ddde185281a1aa44ea8dd606454c62de2bb7be756ce9143b5638e56302c16a948f437fab9d7d3dde8fab411f43c81a64eb7d193af4ca82d0e48670b13f51a21f00354dc9e3446868a3209b92e383df8c056932d7f6b7dd5d356b4f075c5841577f8f29ae73695d0f20a64bb0e4c6fcabfd8e2412c42f916d0ed2d022003f72fdfd8ffe9ed24fbc1235360b87e6a4dfcea3568774572f95992e50828a0adb778f9a5fa69eee937420608263d7025db93f6c432820eef338c60f7991e269f5c8b55226b7f60b2e517fa516b1146c53ae5aea614c396d4aa13b0fe3de0e85829bc60a5154c8352462d96f2a64d44c69d555d1d780a66a1a61456f0d5c8bcc290d947c1dab4ee0a936696abcb0e10e36bb581957ea69aad85a043716e2ad9040c11742a4900f2274be010f38e8339077c19d1533dd8fae4ec7c850fe6256bc89d29f1790bbcc48e9dcb7e26e3a5fed1bccb9cadd2ad375dd000648201511c56f6496baaa278bad4e4085c6f8107bfbc2b19ef600a2db67d78e120efd066c683492980d020fc2e8dc502835584da2f8a36f8c51695a0f4fc9e331c6ef128ff1a01ff0b2cd7d81b3eeaf9ef07218df62a7422c88a9e3151d7550b33c91f0391cac22f8cb533adae765ecdb78b103376f7c8bf394b0049832a786122aa8b2779dbe12cd3d5f5738221800c4e87ac0e063d148994f031ee269a7677323e280eb0e6d85d4caf4e9b5b532179d8268f78566d108c2cb5c1399d62b52941d67faaf4929600b276d68425666ed397d4862fa80e311353061793e22c4bd2784275938bc28588e5ea8ea5f853810445217c0e12f4f79a455ca30c6029dadc120f4d72e344fb47f7d996c9819accf4bd21ab08c482e29f593c722c73e0b079b24ae0696efa31aed9dec043911db0b0a7b1059e0b5efc00d99cb6bc2e4e27918565432429526e9210206a3cd091930747e5b58b7d91f99d2e019753bcd08c9ecd2ae8fe882e7ad0aee034a381f7293046c2312e8c390b8acca0ae6844221f0287435e870bea92c85de12d685c5dc8a0f9dc6a811a6b35381d71c973229f1d31b5c31d859153d919283b5fb8a01d6c5bd5f8fbd1b74b05a26a9c6113db2cce6c05fdf035b79de40608284807f8f84d4e34729a62c93547f885c56400ec80fb11390d8e6d81c41626e1b809006d5667a0dee5e9f4fce3949182f740197b23fd42632e08b015f55fd2b4eb266fc26fa992d20142863e8086dc290832dd1f27d09e2da991266ee0e49d62a771cdcd91aff050dce04fbdbebd62e37424870f3de3e20902e06ca31199265c220f85f31822864427977d9bbe4a6ea0ef3bab6dcf62a979f4c6684a4dbbf8bb013e8bec0bec946840618cca4242cc82bb57c7c34eb0cd1892e503ad567d9bf162b50f64971884d4446732985731c58c805c0f957f396b1601b53d5230ca0d248557f8879a3d3ca2437abfaefdff2bceb4938a2843b7e4c5e4a33042c9c02cb00e3da5fc953794f56e47d36d7641eaa9105a166c7e646dbb6e83bc410fd4d252a1b9e55c3c20379fc7801fa3b463a5f8711e2094ff6fbfd47156e327508a9c4a1808cf74dfebac82b155488b676a8400b510e3438cba631d1fd952c16c316a0221ccfa4fae082b2ecdf49594ecb5c28ae5792a35ba4b9ccbeeac900336e238938bdb9456dec5bb178a5dae05b332830784aa5e456426de67b05b7b350f7473cbc99a2d189e3747e30c9c67012b7fa9150b2aecf01e024174d55d140b4527a2d38eeb8175b57600aa21c424052096ab3b800ffc6b00fdb931cdce3856b829b9591f1c02c529b6681268192a9939af94578445af9ddcce58585bfd35521172aa4ff4612795c58ce1655cd9cb4f769a8bac30d5d425056d535247a7c4f84fe24028d3bdc23a50369e7e9c3170621083f39ed34105adc9de92e3d797cab1eec7ca25f334982ec85a1f77c477069720d336a61606cc0d516730f0989567e64c8281f2db4eabb85bff83c9e3f71d60a71ca8e8384f5a7f98dc2010a98e6ed7688a592950983edb7527b517e265dab9529f6f711bf237ec6f5d7d81ed16c5b484886c88b0d33239cea158607426bf08bb28c1fa0c50cfad241fbb3867356da4144d4ea02c30b2a1c426ae52f3f99f7d6d6b821133b7ae53ede870da5035d809b0abc01856767d43f7fc7377b9e86fd27d233f0667e5f96d64b18f4bf6705eade17ca0255e0f0e83b3f8ae06e2c039bf3d5aa1306d711d09ce0b07bc8876b403d5bff9a5e5e635e353983358a5dba89bfbc0cfe61192844fb229bf2d81e1ce4f1bf090eb4167a68dcdfcc3ed7ea347b7fe566f545a2679880df31d54789d3441a6a1de7db983845baed632d68b870f485867064e0f6f501e53d652063b0550a0edc22565a5d0f2d88f144266f8fc314df0de4269b9e4cf3be12c0dc87679bb5f1e992de653ea358253d8ee05603558186b3d1b5923e54394392f7b8f717a03723ac45f72e9464b954fd4e5259953b5c08bb53b495d9c6659ee5fe2f718807e714099f2bf32067661b7ff53ac5e084c1fe98e3f0ef9900a17b42227f039be73d215e3b8591c2f824897ce4f1e732e9ce02454f9514d1097c3f39b6eed9d0e4236a7bc3befb299817c4cc6a1274b9f9cf4fa38edef61af4f919784a38600efe1635d8a942b01556abafee3730bea7e257bd056a8d8cecf96d40af99c42159ecc10d88a98bc416bb788f5ad54c9190e63caac6adb4747b7523abd574b8c30c3b7a01f603e1448afeab8debe52a0cfc954ffafaa3d0ebe422b77192abaed458c80ef9dcd66d502897230ad26063a83abad4916604fa8ad10f4274d56cda717005453b70ef07be0bdc5b792097943d686fd3032e79b18fb075458d324f7095b34442ccb04539f161eed7dddf6bf46cdf87d6f24ad2d44ead054f656976e8d4eb2784cfd552ebe04de43748d2278a16b579865a1e0465e3e5975e175a3ea02028b569e5135c112d4082bd068e45991774fa9e9e369850a77c4f668d7c90c9279f175c052d02ed81e8b297794e67e007018de500979018974603f0918b3b282aca6d803592bac3b8b0a3df18105b7d182fae7a83d1699cc2e36ae7848426e4cc41d078a1b0b7d994fbcdb10b3c52f0022dc458d974a498c9aba3edb100ed951da668addeee61d7a3b082eb231ec188e15bd2451a911a3bf5604623ae8334668f64cc301957a09d550bf85d44fd4e414989c066a745fd6cf5a4aeb64ff787a2d2433a68f2553ecffd1d5cbc4081b7af4723f8c0d1c870d937e26e8e0c5362fdcb2e4a9cf592288f52286acc3fcea6fda254fbc1ff60a3ed1101fdf9f54ef5d002583a1e432f5757f00d0437a210ed6eb4f4bd762424e20c5246ac118532742528fca806ce8c2890a79555509164af5f54dea14b05aa81804151c84b0b9fa2406b60c9945e8568b46f54e03f4570214fbf7680dccefa0f6646630acd49bec20f8853bf72733eba6e7362de42bf6a4275de6379c0408bbe9e3c512e729975b09c040b3d89872fd87c072b65fd49a4d16ce5fc4f2ed1c8167a7cf56b92fa24a28f59509cbae937c9b859e81daef662600a7dc2e0595e283873ba8a8c3806cdc8bb6bfcc43daf9cfa2f0d1ac3a2dbfe335c3991ea8dfe4f5775af5ba50c907b3a89386efc7431e84537de58f42ed38620738e9281c83d110ddbab0a68e985b8c622fc6c0ca01afe281a0b6e2bbbe522698e0dde3cc3c9ba1dbf95786a2857389f595eb7d01c9e4b070cc684034517130018f0ba4b47b80960e189f9686c83abc6e96a1f427798a876732810b1e6c8215245d82dcf32d75903d0e610c2963014fc5f6d8e91b6fb7fbc334d336d8ee410de7781c938e7ea7b5b44cf7cef72de63e3b8cb61a0a43043050be69b9599a77465e547dc7685d7b3053aea78d991fb22530cd3854947cad773c74689fc0041ed4ebf5f6dc5496073e12db24bd515ace1f2b041911fd69b1bfba26596b517001a811e5d155d6f2ffb362a6a7bf76cdc0438bd0646196bcc6bdc1cffcbf5efb6b37ce28e8b0a50a0ff22caaa98107b18e412daae1ad0a38899e8b6e0287e21e87be50dba2e344c2e71cc2114a3c1109910fc3ab3fb94438400bc132850a88fb695f2b26cf2296ca1d0f5c9cefdb8ab8e83d0bfd946db4c9bd5003c3875c7c21f1764801cafa5dcc28b360dda07f575ebb1486facefd44701184e9ff2c4c2b5015ecd6b5025b51082fa293483900c3e99c2e91194996ff65529e3c4421f46316b94e6a5549b03437f4966fddb109dd641d84271473c4db43321ab0b634db06c02387a51c5f7e3d0a1f8bdda2dbb2aa60508df4921535b03e012ed59908eb4425f498da639c012d1124a837bdc9847a3deff4de588b46890144c4a6236d33c2accde227e6f7fdf258877c104a3a45ecba279215c1c061dc0ce7f65a5d9836f403b4682c709d09d0cea7d4af13455812be94a59e6e243f0604e4c7fe4bb3c4ea617dad103c5e1ec0f9229a60e10cd7bcd1cc47b0b96ccc4320cf6a26c7d8ed2e10e8a5481d0d579760e594ffaf942a0e84c42b0ef5d7f033637b948ebadb6a706d2dc3590880747df5aa0733726e5f0fd017fab356d7aeccfd896f9aa64cda6f176aa11080ca1544010d36608ba866e29f63ca8f929fca26731e5ca29f35b647f99b64aa0546eb94e23bdea51a52f8d5cace68d2fe0612e68462ca63654105a0fc308dbdb12d62f421227e0cfa289e849a5732c0e87a642d2e1da61e70849b6126d343d71c69f4e54d2cece5342d5c9cd576a4ab8c4de9e104e8851b4f43daa22db92bee95c2e54ddedbbe22cdbba3caf2b1f1862ed3c8de9d0841ae3944037d39a0c35fc49378c5a9b4d2895eb53b5d84822e1d28f8e6adf48846daa19efbea11e0c8e7f0c7f2da127f8f8d3dcf3fc0f22c6f4a99383cfd62a44081c3f4e7efecd06a9a04e11968128cd52e48217f52ab81622a29ce5148bf97a63a523f3e154380bafdff1c724309a3a3e01b2b66e84ff721a28bab023fe42750fc09887b278b10089e2d3acb3cf42a64bef5317771ef48bc5a3aa3d8609179e4ae757be2c6e43b3209929972be41e8eb960d3b2461019b4ff33168a93a5730a374a3af5ef67b015886cfa85ed162dee1caa17f301de2a88155efb2768e9ad98ee2f524b13cb8ffebc7426fe487021d0b81809f02fb9b9a290a8255e8caad37446dfd54304f7907b0ed797f0464755f6d7d34372846684cbc10532c54d21d3bca59075ca0e888fcc1917b0d551f20c83ef42f3bf27672595c678b9ac034f772741a40a1532190c93c8e944d9010b3865a277c7f67a95e70c93deb03e84288f74e16122628a07ba3e264b0475cd9966faeebf0aa67e056e08efbae2c902c49e6b36c334d8d58e8843129064d59e8723d66791823ce761364e36432068f1ce992328d31970ea9937be833080be6b05d90548882210a1ec9a72389c57fa3c96534ece2f93c1edf57b6a59c3be7e32f9b96775c7c36dd6c5f6c330bcf12940416bc8121f2886114eb9970c07ec1b00578558c2fde82d94d852b0ea7f70be8d62e5be0bf49f1ebafc6e9000d2c8054e100e9ac4083aeb41d3cd4d861f6b8f92b379d49e157436964d88eff9a67b0a2c682e7d32d9f937e25a7708b938330063521a2163d397bd87126854b7327c73cf73ea39b61fb284d9b1fad0e65cf649e9fb3a858afc934bb825083fcb29fc18f53c4c7ff1e7cccc73b483103772a691f9b9777f4cf2c18fe6ec615dff6b1e4ae7e8437dc7363a1851a722d935c5d2c1d68bf52cb47b66ecdd306346e81bb177aa7ecc23aa920765c12830fed45ff6313a33512921b837464b3605bfc7c22370cccb6be0c248d0ef74fcdf46cc22bc5fa1904ece78bae910d0390da4fc59c768b32977cbc4d60d546c2d73d52ddce69ed91a5a3f382b2f31f4f5a7e3a69f14a328019e8b8054475ae6300e6e292a68183825701ea8117ee41ed46cd476f9035fe476351c4d0804301f4fd71487a4e68cecbbf418275cf528618886437da93eee873701ec798f34e2c0e02c587bebf106f7de51285b5763c7d0c53ebec8ef7f6fc05db1e38188d2aabf36de80f6032fe5fd80c98dd07920646be53f22331b497492fc2495e7b748df9c61d22a56bf589c70ed1d10c1a1002c713a0fe2eb826d9e812f5c1dcc770fa16a092000d0a703ae0b9735103c2d8fb75f3d5531770e5d58c7f242cda6ed9adaf1feb5777f5f4490b25bebdca7e271c253cd4b2d18323a4e377f457100bc8db55a3d5a01c5796a76797cbbc6b39227e9f4431301bd20af60d65605f33cb566a843efadfde33a167755aa455bb77c653d1ce25e757341610fdc84721a714750b31574f5385645e158df768579170335dea040e4ae9a8c6c83ab56c501e85490681f48fd17b8a329805273ab9f3cf287fe8335dc81c21d6ba256387ca29693de36b4b321776d2160daf4769b8bcc02de2c334ac70720a9744898e34d2678f1f6515954d0a7611db66eb31c38328f91e3a765211c227c8e546c5358077aaa66ae973c261cc1348f5dc27dbccc5b1df03e808737b72f46d121ddda28ae2f72324314f4867451e94b7854b10f6fd509eb3050ff09ceb509ff1fb746684dbd4b9a5dc3d2546153827f4d18bf655b0981d1d1202ad321c697d6f65174abc7d0507b465711f03e26f01065d6078f4b93b11cf0633bc7ff412cae3676e6341694b2996f0cd23fbfef9351f6847b6f432e4e55c38322dc12d7344b433149b78d0d8e71df0902608f4370a3eb081a61b9215226cb979214edad347baedc3db801f8f08bfa23667f8b110f809f732141a9cf3c6dedd128a95cb47b0bd0eaa34b06b05648c21683a44fa096f64ae166101e131fd0903001dfe6008a532b04918ccc2580781016be21fe7aa9256d829bfb2debf979e6f296700ddb57450aa2c1cfc5ea3a45a5a4b477f2c515e76a90344cab7f6e4032fed1f79ea3bc9005d27708c67218660eb1d50007326028e8788a73ff87282b22e2bce0df4d337cd0ce2800c1623b98bbca098937a4bf1fd18d82778cb255ab90b05dafdd7d501393bade8b77106e1ca68f9786442a438d5cb8e003f750e5badcda3ec8591f659a1422a1b348595ef0ffc225e9d4bb2b9e1e7f3a446d10b9ac72a6efb22d181e939210b335e5c4c8f5641275bebdeee4a80172a6093bfbe4353b8f5219525681cd28646a11288e9aaaa43d0950ad61ea85523d7b0f01884a51ca4ad094052b480b55085eb96944a43e8598502cb653591d6248229f7e26e27a7086199ca9f511719aa8337709e413034a4440423459b5ed38a4d8ab97d5a8c8e02f0796d2009bad781e24c76e1608f03ca170f780f17f544cac90086d0932d929d4be4dda8887735683e07c962723157ea75800f27b9ce2bf6b0ce995fdbd86b7c1832573dc8c378cfe8d3696d2948483c8fc313e01c10d8d7235a10ee615b9309c145efd70b91a43f47e5302cf87d4ca437872310a4db955cfcb710fb77a2acf2088becee09fab7189692b76a891e667d00bd4d5b4d360c24a98c4cf595f6768edd42ada9bd09e4e98af8724fa86e63eb4c3d88a712075bba410a1a3480af93a888c78d649fd09838645b82273c7af5dc64057f769d2ad943c2393ffc981b8db57435d626933ccbd0cfef08d04378766ea5937d04b07f28f8bf62bf3865d0634060e0c22c373aa30341c708e34ac9522cb9d903f9bd542f3635093a621d79cb341c33aa9930329d0399b495fe6dbe0250550c885cba6aee4887756be1f56e91841b3fa66eed43a45ec490ee62f9d90f63afbde79eb0ead59b4044d07cdb2052821a716b9a02e78575e98ab5925f649b63731e4437f0e8061adfed0d331ab350af5664382f67c80b7bae0a55226eded4cecc14112d21fb5506b481adc2107b0cfbb7f2bd18773d2c89886f1ca56cc11fcc9a5402741fc2b4287c76070fd63742eeed20bd8cbdfd42ccc04451cf6dc024b1e4f27e8fa16d84f82d544fd0041454aa960db83ac710f6901a43f639c5cc6cf2d51fd4ab40115244d51de20f063858056e1a1c21f3a3880f469938fa143c0609c3d886d48ddc7dfe90abc6989df2c04c61bb126ed3ff2ab86edf64625ac76117b6526ac660745fe7428cc17e56050035c2d3a3fa57469a8d978242ad2f6731a6235b2c7beb0fb31ac3a1189c4a5a5a71d25387deea6f922e001a321343f102328a38d2524b0eb3e0e4edce1fbfcb0a8c5a6dd31696a7b0ee414346e0b71107436b490e49b19f7039fa0a3594c4149c27b509ea75b96723d7f79422dc5bec097179ef09e96414e3d63294730f0fa37ef92a1f5c30efa83bac9dd9187bc6488ba6b1a8d1586db70cb9fac6d328f9d87239372afff3c60c6e518cd753e1d72a7a9017dc5d4c1b01de3263c50eccbc06250a7d1ed0a8aec7d15cacee7b22748f5d4c886719120b04ca80f5dabac317f02891688aa02c2dda03bcc2a702412294ba88a2d700ccb869a06e4c483ec0368927e74ee9e9393037e9228cd448c8edcefc5371991c4e4cf1156164865a2f1fcd70ab71fbc4ae6d17de8ec19447e4f8f7db1d9cacfd1755b284adce2fb7ea2aaeaeba44d2c78301015d5e7233a07308a52379146901e885a910848b3ec795b5883be7aeb73712e0a42e733c6ba2932512f7181eed7b8db8ed494ee80cea288858c450a9397806f39104b8f4f431805a181672ed233f2380e83aa793aafe14787521b619f68f9180fb432aac071bf68c539d8329481fcc3a921e249ef8bcb6e59d1478a26ad701d6965a7e8274016b6a53c417204966e13173752a623299ac13342006a8664d159d63f86645d9212942ca78814b87688b02d61b5d0325d0f60d61b2255c336ffbbb6c17b7e48159b68e9518de10b0a2f526028db901a686d381b8aa10fba3349376b233a07cb2cb3bc7596c898cce9ab8ce211112e6e5e032d44783f1ad90b26c767e1b34c5028a7e90ffa6cd9ec008a9f7bc766b3e720cdb4036ce20a522544362328306801e18a726bce5c2527a8080ada6a0069dc71556fc638355b6131b0118ec91708fea9ee64f3ec49d1bfff631e3a2bbd706c197a8ea611e040388ac650e50c37da1e6aa76d34c2bfad620289acf951aa3a451ad923317bc36e5387ba0dfb91f252940d55efdd9c020f95e749325ab3057ce9b231f906f0e4b250821fd1776dfcd6931c316852ae569e72a84f2de8b2d8cd4e37317445e43ff2691f84fe43dc708edc078ea87cee5c146634563efb8315967b3f685be54d88da17edca5e742c26797e934806629a8801fae08881cbd8840631382f3621b3082f550c8c31584ba8378ccbed36fe5fc370d53c819ffc307016eca3f870687a4cf31bcd1117a199fcf5ba56aa0576548b9a36f63d0edc6aaf9ead086037e2847105d271da8e7e42b178c1729645cf9be8c0b3953e4638dff79f8343ecb5d991dcc9dc87d50d40a53c9773d47cbf0608ba3f2d3da952b91240a54b380da50b8e5025d6dfd0b024aeac96e8d99220169fc887335b5761a1be71886c244eaeb11520811e3848338884c8f5c7de90007f623f2342c4774236546dc725f712dc6eed5aa16bed7c8663a72e7c275422261a8224ebb78283acf822d0ab6efd146a41539e84999b932c759983067b1437b2ec4cf3192f27307c973ba7ec5c9e8edbb2e8393c1d646bdfb6065d473bbea5aa8459a62ff498d34a54badcffa5ec4260661120af31809c4b8b1ac5a02b80327946cfba1493acebecdbe774e14932188a574d549d95378b809e83011097942d14d266d375362bf13cc266f7daaf5923ca215a88356be40780e5333482f090838fe93e78f8b3b8f52215e91a975045a3d901473ec88485c79e35416a6177ffd86d74d367c48853a74b0f6093d17fd75094003c2a07f2af6d75071c6c082087345dae7bbc4a9a74e471769c5d883dd6809d0130f6201174c92c6e545b1e4f8e6342b8d2d1a6221da213cb3204d513d8db2286a2aa7decb6b2e87910a1a405f4078a040bf3fed041723f686873a6180cb3007ad2febf210cb05a6ab8c553548daa5a956ae1df5862fd1d00b6ea06eba6fb0d6793876757276a88dce60737a7e4ffa861f4ff7507a28bed65e662e56c47aef2e61d6579e2a136caf8ad119daada01b127acc3e9ffca57e89b269d18155443d36892579e78fc88c47ca596ab9c8d2bfa412cf1038f70fcc5d28c8bd1c16360b7c2a3f9ba9522154be929451730a492abb2b4d8142f9c49b9d3f39b3e82bd9af0661c17f1b6c81a2609654c5bdbd1a92d32c74e36417cc61a0cd66ddaa4cd98196065d7cbe3d2abaf63f64c2b139708dae57bd4ce1bebead14bc2d47185a236ceb0d3ec20e775bbbb36337d6ec292948bc1c00c11a8f17e2cae06714d1f57117d8dd2fbd5dddf269dfb4be2962e9c4b2a791bac8cd4e549e5484d0b668423674b103a37bcdf2e921d4f5212e51f30f6752c0b65dd8cb91b1ad473b9c76c36fe9e1a15eea4b731a7267165b3cce815d16a3acf1988ef08fa91ed6016d9afcb424362b4c6242b76d3f1ae4a4c7716ec267d379378a797ed46e459f5c56e35b239deed0f637b2c8de12a4961d4a8b32e60dfca70e022337c4e26e602bea226290d7ca24789fe8c64500cc77044ba5a04ef27c58a51bc6e8ebcccda7af0d28b44a6bfb8d14e91a7c27fef597880e44de005bb6cfc316891eda4f0a7099d997712abde09397502eb857331a3d0d64830dc63c35ddad767107ade5a635e794e9e3908534d95226f25de86eb0e1d428c0174d59d64d9d178e81ec0847536141159e8bca0a13ed98a3d3a04006b096418d57a3ae4bc7e7b79b7f0ce8f99c2f863c6b707509868af67af0249f50139b7044a069f4046fbb99a2c15a6749fe517bf78a3a5407df63cb56ef91b74ea20bdf5ff29f520a7ad2e06cf2d89154d281d2b168431b246c16c2956a651932a426c21f922c53f20e96b04e2c87db662d0be89ebe45393106475683aabcac52438f59902611792ccce16a68f9d0e2315ad46d7084b4781f9192098ca2c1d74d57445cbb1e55919a730cf3055aec6efdbc0041725abf1ec0c3a0d92e60b96efe73aa5332417581003c7de083325d0f753718512903033b43eeac0f2a96d39ee8865615862f6646d9795f60527d321a9750268e3ff28dbfeda7c5f342e28315635e4d2aa018d70239e1d8f7d1b816ddd7ae1cfbe05f48fe1927b80182e9c460278229fd237832f87faf10e35f984034585244b458d2ae1daf7343ade8ba21695ceb9223a4f5194702872236bba423163f117140e2cb2e85e75a5dea7ded2a62abcfa9700acf90b128abb36678f926895e78b1532d9fca89e06749e874353913aca161bb4e79af9b2be07fc8c5953be308012bb7730593aa80a221b466ca7919c41ba800f41a52158fff359ac0754d7ac6ba37e23418f56be39ca9385959aa11d5acd785844b8a1c9670732d11d96f9001cc06fc5b78702d4b53776fac357c89c85e8a65c28a03139866b7df888916e6d0ba18d5de1252876853e703b1238ebc95fb13a44193d2e99e94a4194ce875da2c54e9faa76add2594997a7147d85efecbd21fc11de2baeacedb4b57e882f73002c80611caf4a3e27cac53bfc0fb855212df90f8ca3f7ac57c6e7ea4cb8cbf41d755bd9f3d66222f15badc717462422e65bf425ab6f79f2338b31c108edd359b197c9aaf16ae22d5b158a9a47650060633ba4d6bde119d4bb794b98bd3d6c2b305cc074daa0e1d98644569f24b450b9ff235bf762423f4704d3c307133d3e1e5c24ee4db8c57d27abf66fa29e4e14d3c3f7841e8f2757812b136feffcc98e3d9ba49f2bc6d4f0bda027cc713f658fbd4cd49b8191a32cc37ca0b43294034a4acfe1e13a706bd20dee5736d9df047d1cd1a6944f26f47cb919ccbe4dd0ffc44d0c03bd90f64a63dccc594b7c2f20dcb5f6338790c247b6c6a92729593b1b18819bda95377b9f0d40d48013dbb6129a0e86150874391aca223e67c5147ef0612d3b367c612c47874801a111111c0af02e130bc5208d8c5110067fae10a4920842f6ad0fe90ae6468c748d914ba4e1c1f9084412959acb9b422d27b537247309ae9dab33807f51500c6617e5353b1795eebf97a15f90b2d4bc068543e698c0e1c63afcc30459224e3b05399f52a86531de1f5aafe275dfa1235bd9ecf39f717174f38e7a79f5ef390e956344c309998c81975d3405ff122a35119ef0b8f8f18578b4094a0b4f40968fb75b94b52a1d33050bc83bd27f13393bfdb58f45d56ea74aed486eb2e96dacb1a7e27e97a607d2516768ff8e38a05f49bb26022f0c760f4dcf09a7d80475db724bbb9bda7ba3ae4794c38801f04beaa52ed726c46fed92b2a9cea543af8d403d483402ba36b019cdc9da60a4e42a44780b44414990db000348924d721592f710465c85da1c7b26d9427fb0955f10682f21d1010a088648083744070952115dc59b6a43fce8f9cebc7d95c9e7f95943e53077689d74686712006ac5ff9f40bde24e39e04f47f5b90192b8709a5b99aab8b0aab8d2605c7069ba12e25d99f3b8b056bdd2c99fe2e090d00f67469a5826da324b1406473a4e4a635fa329f72b2a291822b05280083365ccafe8c30c81fcca3800b84630b529305d0028ffdfe818283385aaa901692103b025f6f02bbe035b2266aca220e54682fbe17ecd6181d0077ee5880c55b23036aa8f92722c92786d38a98cab2a178469e8573cab572c1a9261541ab423582db4682a83e4780ccf111bc28573d7bd93dc6296dca21711aef631fcca380ea9b06a675ee2be3f5a81eee1578888a8816ed2e88592f3cac82a2092336b3406596da2fd0ac59c61a2c4be5a43d348844ee16a54caaf6c35b5fa5fe6be605194d35900cc58b1497781a38b4b5a09f40573e0d177bdc752f97f6457d043570d2dea7b9a587e01c0f0183cd480f4757b294989c46446ac07b17a034225563d20b6d018263bbb7b535511be6f2fc2c9ce76f603616e88abe05b7677b33906cd469ff4a7181663f88e6677e01329932e62c83adb6c330123a88cc26ce3dcddbc6900a34c1144f1ecc052556b6e0771748331dd5783f1da67de3d337f35753fd19a643bc9ff9c21dd4ac14cf2a7fa9cad4ac5c6465eaa36d427a0d748f04ec0243397b7c3bbbec65a938e8dc5ec296933bbe73d32e7ee81fe3af3ddb76562a1f299ecd266f87623b326737bd46ec05ee5813a5b3a91c2fea1ed2c44c02210260094f485957966029bac09f89ccd727ae195b091ba24f8e2b95b7a00278f0af0d0ded7321ecefda8a9b934e6cd2b852be610a2981d379286d33e3cd394a223d6b40e9f0d6389705a3d6484f7b495fdb07c18d2de91f52e31566f8fea9439a62d8fabad33de5635b1daa2ce5a20e0ac300eb60f8796c4347160e243b16d75761a26b3c8ac415bbb5d76491c4c0c5c0a40d600fcd11f7ab73edcacf9ce7ba318e25bfd05a6ae5e241ae8ccf2c11aa42f641a5672a11516eeba56d217f1cf22ef25310dfcab018dd7c887289dbd75a44b4f67edb1dc6e21b1c35fec57a78024782dd172681e2e4d3144d346621d2917fd5bdad67499bdfea275cf5a358539e50507a66b2ac9b3df5c07f79ff80bedc1a399538cf1ffc11cda71594159ddb22a66423161958fb77e30a77c842a4780ff38daa3419b4ec7494a504cdaa063020a5f2da202bd8a3c604b2497410841a674e273db6809275434691bd991c2516343d5b2f76a3cac98ca9130f447ce07c443ef5bcf00dd57194781e12a324c929e0b77727a2fb3aecd9d7a9730b734a4e3e62b2ed3c1f9a7ce6bbd2655ddcac5b208ea0a4045785a8b6c7159ce9b9b9add0942653ea86bb171307d5adc1b4aaf9e903afd9f8b8ca8a6c248e15378d94e8efbb0ca7e02c6a49231261eaf22044e7deecce9ea83abb4a2b98aa7e2d71e1a996ee75ec89973f1895a4890c3b9f6a4e020aa682d843ee7f6c19f0f2e19dc2f6e452eb4b258b00132397ce765d8527aa5f4f77c94e9498135ceea3ce3a7b3c804ee077c88e276d15d46eaa47ec7ae802d85f448849ee9c8853e7ca668307cc351e6e4e53fa1383597fdf8e0894b2eb0a18ac86f9813accdad964f4efb744ab1eb2b4ddf28aa24d9aaf216817d108e05d8b45b4900f00667b7564accd86dfeccf5adbec3293a4d72543b0dcd5f9e134beaaff6b9dbca087d229756fffcadf869111e920edf6bcae9ed9c3c8864c4572a2cfea0a31872ba872a72a8e6a9ff0f22ea58a98cd2902dcc1ab2856a43b644824953c1796c2210b73466f20e2b61b0dac12a45f21b52760d926dcfaa5323eb103d64740253583f6d5dc55dec26def604861a9d5cbb9ab4c8bc6976432011979fab6c778f194da842658185c9b2f9094c8f49c831975a3f3921e4618bbeb8787c145c7e9996c0aa43f8f8c33d1e2d7b9934112f4558ca26f93589946fc779b8fcac7b07947d4c977b2e1a6279f199f5969d3979e32b4781390affd54923db1ea71b86ca8024fee52de859e10a47657e9ef284291faf1d93e31219a12e422d425ecb2f3f8f2a136718af844d78dc7b1edbfcf350e275aec774b787ccedf921832950b00a609053bf269dff891e0de411d153b80c9180624da248052049a9bf0bd37077cbf62827ad08bb3b681e46baf16b128261c185e23062ee2507ca210657fc58f5eda6a449d244df9b3b8157231d67851aa9986da9a80d552eb795b3c9ce8ff5afb1ace095609597847375ebf12287db019572a86bc4a0161345beec150c3517da8fb94c5b59e2fba1ac61ff0fae3303bfc63d6192f6e83ab1202d59893174d27281437dba92975b6b5d12e5a5480940df214bd804fc0f3a874ee0c442a26bec29fbe6f3231302c838d2b4a1ac12a45925e4aaac46b93c9e6cde778dd0958e0b6d3b8fcc15cf2cb5e8a878dce08a69a9cc9ff53153a69147aead3a822300450dd11d67a3275a5352822d4605f6b5e8ee59255c6b44d945ade65973571659a53b0d66a68b00faf8b8ec0703a60f9f5ba9903bc3ca8fe90d73179d5c50963e38a1e8485828347cb346403026a4ed1c5ab75875317192194d5b07970fb020fa720b895535ccb5b960caac2824edc644c968b993c31c4dcbcaa2f8e93c7d7f7968db1e5352e718773a6c5e39c7feb7c3e220a44aaf8f0c1e2e434d69a6d7bf89341f366fd560be13cdb0f5ccd738a26bd6866039abb9c250a345ea099db9cb645afb322c136712106f5ae96a279ea622e64ee022ba55db47b81558596218ceb61277bf397dba4cf31180a299e1a5c5cb4b7e924be4a96d849f4ed8a3ed06e7065b226c8e238b645df5d6f411c74b94be92667cfca69ec47c1e980586661ccd1c7d5aaed59237b5f5a94049aec19a0a10a29e53a70c1feffe1d0d5cfc8d614e9a8b2188e3dd0b35464e96adc884403b90a0000c779af7d9c7f2f69e4878efad4a58a0bd816645de87b0e01c71bd65023fe49a40a827d357e115be9475754665543ad052ee2bc7fb27fd812cd247160102ff1dd38f63d169ae2aafde21b42f21ece227a7b00fbd1922b52bc5576d68777e6455f72e56923a626a2be424d183c5132943c2768ed6b9c8a3f7ff4c9193c007444fbb675e354409551392456e53e053e5861297bb087922639987cf283186fc170569af4419d6841941b8ee2daa6e9d6c6ecf87cd28a026f151b65069e72ecc006564a7838ba7333a5989cc0f8470a623ec7964930f3e3eed733100a653dbdf18d1d031711198e37633031a251c6fe52de5ab8b46bf5a3b615107ab1d6fc7194af6d8363f7e52bc93bf2be3080a4e30bd3292ac789502db26c4cdc675649108cf8f1f3f61d047f293663dfd01174ea8e164a43dcc59b2c6c796f4dce4a7271d8adbae63f3f1764a7352d0a5b129963fe55a26bbb966bdfccfb61b494aa25403463ac5d8757e15505425524252f347f8639ba2322081417672b9794559ab2ab6202ebd67dec1366b0caa5211a5543f8b6d726dd47f5bf34ac7f8b2cdc24334f93c51c7a9d23043ad04c929f226cf749eae6f4f40fc372664241f6deea59252c556adc417c953c5215e172dd5fdfaad75a2b5305459667468074e917759417dca24d25b64cf142b88d75123886539ba99101cd156222d4c881a73e26194fc9473f1933314d10825311180b8630f7e3cfb50c7ee87c8e31bf3e5490bd887e7c8f910429eace17ba0d54744108389ef0834e279fcf0953ffcf8c197fc37124eaa7093b90d325b48dcfc1c894f52ddcca46dfa585f6d20d50431c22b12b955a58f1093328e2ccafaa8f8afac49f2aa947f54b9f4d66fd024d915ec2e303463a8fd9db03e8134bce36228288cdb4ec36eeb919194409e81c209120af054a97438db5c0a67a9abc722917c935b9ac966a4a99c9a918cc43b180abf927c6936462236124c2c077336d421d56bf3b03a2cac3b09481141b9d0134c318cd58a6ffb278cc62911a961d88b3fe1ffc8248a2d4d787eed41931df13e51c274558f702554c21391c15fa5edbf1fc605cce782071de9bb4625bc90044b2dc5f05001788dc1b12bdf05173f521b53ea111c64b49f7c63b3491eeff31a3f9670c88db9a0745f7510ffdcae00411793f056d09aa63939a725f81f95471d109a95cfeb018b4481f2309e24ae19d401da359df2c39bd8ea1f915832813388bdf1c5dfa4021a0464b9b7b75e6068be8da19001d0ee05d03c07c1f6d0185840d33047a85452a070b04ce0ac030c2db171befa494a5fe48130dee54ee565ae025fb95768bd1a0444bd6e464047651ce4ec89879333c02b789fab4cbb01891c6bbae3e8e39abb6697f0ee3fc9320cce97996a74f4db6f643c9da34ceee04e3d34b8ba3b8abbdfca0ca0582b8347d3d44b9211cde43620854d509cc4a3798aa4ea910d599a9043c0c80b8ce5e549b875c00a7acaed438aaa38d3d6ea1d6c85a79b03f4778a43bc60245c3ce529fcb740cf74b47010c914ad266a3850e9f164b621ee9aa43e3cf6fa744c8993abe4c66ecaa7260c02f4b3ccad5e6129123f589c7cdb9a8e969478baf8d5b6c670a6bb2cd574dff5e8d469e363f567bc628006e8fd78d76a0435a28e4c9336faaf910977b993f241f6cde33a4f484a35f58171e414dadba835464cde3ef7e2e23f0c75b7f53aa8b2fcb78655131a902719235533c8cbb05f38c2b3ca28fe0b4cdc69ca872448f23d4c58484ad289cb1d89f218bba0cc88250651ace53da4e6ec79da81635851a78f017ad2368d00d0329eee1daa27865c238bdcc652377f1c88a1c44f1ea16002847cf5bb9f43212e1c9f2150327b1f87dadd29beb7fba2f944ebab0fa1f93d8efec3aa8ae098ffaf2c701bcf4d06997685f33860ab47e8835f83d17eb639bcc7f168ff471c71e1e6833575e7605e8492c5b99015d7acfb5cc7307834784778c5016491714cba05912c0232c6201e92c9e943131d2b36e99932a772629cab5751657b6416c793bc94146e3c71a27684722f79c76980d0cf17a581fa5aa93d60b44dc8c2e8b9e5656f637e75e9c7403f494a44fa04ecc14c0056136243b14ff0e37b60a102bd484a3c592339851894c03e8050330a0b26da52b810760ad71d440fc1e7fc805a4ad2c19faf8901007baafc6d179a84073026ed553b30e626e25b821226f70d77967250ad26445c8c98e119089704f27649fd2ab4e3c80a70122e32e79533159194a5aaa8b4127bb2a9f4a916762b9a486676438b2e1d08c97e0c6131ac5ef30b0a69391dd5b39d11038f2bda77e6e49a64b68481b5a31de4a93e85a521db0f89bbb9ea5d4efc18814aed6f25d090e23f28d6f5e583f7ba79a1406049adefa198954d18c2af988b6091469613329107a1a48c757c50c5d44aaf747df63c6ba0e5bf2819569b46908aee4d12ced774b4e76bd511a8c969cd6cc74a3461a615ade962ad424ee2a01d17c357810b7b4959ab9de467aca5edcbeb31a4cb4f550606c5f2b6eeef35e6995e0ad3070cfaa68950cd07be555ebb0a66ed5dfb39f704e9fb60ec39182f48c1c0150d663e97101bf77c608177cee967511cc1e536f6fd73f6203389fec88373b2673f43b6b13d6b0766989899567b980d73e350c524440336f59c56437972b15a17ffef7c38811b5e8548cbb103f88c0deeb56d96d239231afa529b4dbe791ddfa99a9a127bbfd917dc008e642e8b51e9132c845a8d7bf9412399f6132dfe3fcce6b7de6b915eacac7821ddcdc6b84c8082815d880eb75829ef0f5a4c20274938aa7225fa5f204b79e24a6ee457c16300cac5ae1c1bfadf01b4796366bd4d64f9c7eac0e26dc598861fdbe2bb727fb13d22f79ca7379a9d5c5f8eb1ac1cda103f0130e8866da0deef4153ca4c71c3e87634742f273f19a55aab19812e91b4e21e919a2a5898edf2163eff7626c95ec8cc3a674200f49514c68d089269603bccb66bba70a8f7a27fdcccb8cb90e7038d88984a984232dc2a61425d59162da75c2e522e9380cdf39371c8dce00d0da648a69cb164622d310f1ed6691a8fc79813908def31224b7e2ba52f8d551c622183e4befd9229ff4dd28bcf98e37ed651f9b16f55d13bcf37c2efa07eeef93c95239c691dfff783f990555ed6cfe6cdb6d4994438e6fa6c708b108688394db2d82c460a00d169303941dc2914c27c0bef30efe87ef26c98213d5600a8fba1eeae264daf43c698bdd416bc00fd882a1cd430aa6dd30349f028630d120c25236e43a26ccef660c0c8b514a198a688780f405f08470b0fa2d0d041b07930d490a8c510d4b04931199c9406a247cc9029660749239a2c341af95461712445fd829a4ea22a90fa043fa50d9fd8335923691fef317d4e7857198679e0563c3827e0bddc4ab501e5380c1b8c5e17ccb5c7205e523b57ce141d5e4a2f902d0b881841dca0a7de2990013f97f6721894bd0bf428c14d6c32816cec73216def32bf3f1e24b82e28e186974fb28838775008c1d2dd667f05a1a4e1d361e2cfbdbe720df6b59faee37d2a3befbba0a0a32773d42239a0e51620374f6957db79fa0825a64572746a0c328d3692e1de51c1a437b91548357cd774b896c9f3200d8e13605b22bd950106230f750a3a5fc062b9eb6482cc569765724a573ff7c54db281eb71535d26cfeea39482181a967474e298dc539f0f83f4eff82f3bf0c6905d7ecd823121d0aa83e639025ffea17053c5c26396829dec1bd351143ee5f77dfd2c25b24a1c952617edd57b5d04822c9cb563c1a649aef919f8d35c6be590b4d79b225940e04ff73bc76a61907f1f638a1a6393b20c632a2e53a1e97d31c13572db64a3af6f8ac63019bc4a268d33f4adb3f51a85bba17fe1c551b99c110f14cfab0a303e872bd55dac151781eee1102b86df8a2ca8473da2e6368c110703267ecabdbf1eb5639d3bc152437f6448d849474053a3a6d7d688ab809d6d30ef18f711ea068b214214e4534034dde9d09eeb2de42d78bebe8952793df036b90441224f851627c0199e5d75678611974364d2ff22c00d190abdc8e0a38eb19825f50c2c2da753e7fa5b9c3eed7f30d4691cbad27ce34d161e56ad1e00070395b7019129178f30eb58afc635eab3d3bef9d9c36af5b033b180c626bb2d2e1343c74d7368f7b6ec0f3bba2dc7ddfbfc4ea86e06faf6c4d1685957dece520329b6eecc21ace1dcc302e9a903f099200d813ffefd34b2667bc3191db9cc2b0aeeb7d65efd8fd85cb1d2c4a57869805722576e44c8b7007d31ade5e11c54b2c41ef8320d3308e26aff429fb8bb266c32ac6ae2edbb376d55a741b426bfef2ae36fc81e2625f7d598018483213586fee80d2da840d7dda06bc8b9134f2ef33cf7df6513ad00dfdd0269795d4726ec697adb9956a0dba41899b13dcd221c56de9228ac71cf1ea3360ac41178afddfa36f97feda8aec3efbf31d2ecf6335f9fe87e67f37fea203d79feffc804ec014f276dda8862f2c7b7f004df7694ac300682a733d600675d9f99afff19b67e9a43a8fb90746e9ca5e96da4be8d8b8396f8fc952b3bfc9c51f17cd58da15caa187f1f1df1ed514581795d2ae442f348a2bd08d82a72f697de4e80ec8133f12ea4b99521c8e51c043ee3dc2f4dadfcba135d3f01356ddf8be174b42f5ea3ada7a17fa151752e03db40138498b4017aa4d0b93816ff82dbd3bc1ea97cb0279c875904c5ce6a359b4780ac0a9465ce3d1ea11b28e6a73c306aa591f0f3f3439e055ef929e9f08c74b1696ee6379b821c0f23ceeb450c2ddf3cb9cb82f70c4c56ae9397c240963fc87257c4f378a794ee89c0cd87df1f6d68a88cf4c5dc4142e5d144fe49a230d908e27a3d40643306cdb3fbfa55f7d916f2665d00e036dabc3c52b1878f753865bbfca80873818d4b545532b004a50cb06cc94351addaa52113d7042f009f5190813e3e00bfef6b060d63f3807f4b150cf7b0630cc3b8b09b729b2085a5a68a446912f3d464727c7fda7b6467e0b3a741c22f9d8b8d7942bd3470275baa5a925bf704f19bef79bbb8f87bd0050b6848c2baabf1503777ba23a5c33a37e143b94aba23185d88b10c83852b51a2a36e86f2e5c2d0a9e191836ad399a65bba5121ea46c449e2f7b1ba76d79c016bdf795541494dc81e94a11ada78a9971636bd36fdf54b819f61d6d020f7b63731e5482ed660ccb0259fe79055e82e0a03a7d0247d00de701d91d0a34e38d67d00bd94f3b2f102c3837aef327ed3600e2348a6e64d8e55f2cfa6898df48118efb0ed2b7668db712f0da202b6337c06ab01df16ad215ee9f34280cd2f17d5eb85a778bfbc3aafbaacbe1cb13792c20ab519730ec777beb423d56b31c3d8288ba63955dfa79c95aacb2d0b75a3d2d02bafa1c2c26a9a4410a4e90dc917bb097f7b43439a98f59018bd02b2edf58000dd32d989aa094db57a36a3724bfa5601023b8e7a3aab16cdf0c5328fe1eea4cb194f52ddbb79066e1af61d0c072918e3b2c0019d523c9b0740f8a6acf3a7f27f57044388d5605ffd72b437045a3f7fa559304e334a07440f406054c522497132d58e05d5d238def5d305607691cc151b9be6123577b5bbd520f640418c2c18c0c31faec82d4bac3b260133c14468bffa033ce9661574dfed3bf53a59076bbf2484ecbdb79452ca94640ad4090e0b2d0a34449cc3dfdce60fef7cdbab6ebb3efc90f9213f0d510bc2ff78ba470f2adadc9b4c20877a308e3ffb8536dc23afb719615c6f2ddcbd8d08e2baf7096ee0a1831dec84f08e098fada494720864ba431cc861e94fb8d90ec8437d0f7cf76916f7c339fe28ae9be02014e00efc57be72f8bf1ac2d2ae89e25899e038feb52e1541ddd9ad828461bf2e925d87e2e11ede8176c9921bac4c41484343636b381a0ef209f5a94f627fa60b9a09ca12944a4012f6badc465de4df2fb81454dbae8bba48f59cb23ff33541a84ff9690301f5a9ffe9a646c3411a1a794ad9477d92994f7541a99f79d4cc07a1de3e7b59d56a38f666b84d7ecd0b79296e9333ff939af99a0ec8fecc03a13ef5421e3c0dd9e4cf3c7b280ef5f693a46c171464693610506f3f84d4cfb8cfd4c860531c04c33df38b38c71f5ec141ba09eee004bcd32c348087c7030f707038ae478f9999eec239b08b212c64824b65eccaaf37e1519d43a3eb10361a36bf6ad614149c22f95b4c18cef18f74c629ee462e450ef170238310420863841c614308218cccdde6eccc6f822ca24cf01ddbc125c7899faab593e2b7173057c53d29943442aad2484bc091754a857bfa690dbcd343cca3ee7a0b12a84f3d8c71cb8d317e23f94e6c729cf811691586d5a28a3904c58d71881b93b831d5e5ce21dfb16fbb6ff5d9219a5a67ba59c576b3ca8d56dc138d0a599534449cf3d9b7b5f65476adc439a76e6badfb68b74999e21ac535798c4d58d774a3140b3312508dc2724929f2ea245c42752438ce52ebc8aedbe4d77eda1d12d78171e2c72c376eb911e9c6f71ce657f9b49bdd26e54baa251323e39b1a2af6a59452d62aab9c524a292b9d946f640eda5f998a7bb8d2aea99bbe75586aaf559bc526266ead6f13718ef60938b2d77fd2e82d0a55f3120dee992fd3e09d9e628c4f1a311a9f34bada43a3abb597042061e57f65f222d73e32718f7f91e86a9fcb71356fe36afe824bb99ab371b5bf7e72cc345f53bdd664ae6667b7cdcc4fcd74dbacd577541d10f4549fa9b4d7babbabe340a825c138da6bdec4d5b4ff0870b5864d5743758e44aa3bfd89696ac16aa899c1f67f5c051858e60be98c84c9b1672ff4f8f4a4591e6151b31cbe00899ae5da9d1d098e03bb4dbe8c1f8d50c0cfaa061c6df0ada3555dd3343dd3b653bdfa46b5d610cb8e08b4a2719b8ddb71f8b4cee96d5adda335e8ad2100be9f99a00e550dcd4c0ac27954bb8ce13ffc0ec668d355e17eebbeaa41f7d9ef013b861cc367e687fc909f07e4df0175407e15e4af81347006f25bc89f82fca8ee5b5d0e00706208f935c89f410cf25f90bf427e0af9279490dd37e0e753dbb456a58bfa853622e18909ad239f2fedab135d6f29d7ff8353a6442a0dc43f835266b5d65a9ba8687330cbb22ccbfa2bd64529cd721887940fc67171fd421b751cee58d80fc671fdbf385aa789e851c66586ee172f06e678e1b6332b7a85dc239f3f75f9230734d88f97e6c313f76841cbd30384a014d4eda1848f6d168480fcae0261d8fa0fa8c092ed2a9085854fe30e36384477777677c94c395da49442f812c33bd973ce39e79c73de5432438ce099c15d4a69c4a7cfff945cf6397d4ec87d466e131e66ba0d7dcef67677f79e9399997b2673c480b04a75045e3ccf39e79cd367bbcf59233b479fd3e764082184f0a6592fdfe325c59583a56c77777777777777778f73ce39e79c73ce39e5b5c30f2eac7fdce0888c8ccb8b29c6b802bb3cc51852b0f70ddbe52bba186d70f90a2e632e7fbc7c0597322e7f6c1788e03099e57f73ce39e7646ebefbf449b9e9ee1cbf2c71fd639fd02770e731b0f1214b29a574be62538639c6eed3ae4b29a594524ab95a4908a594524ac952ca2bc88835881d198caab4447077771741bb7777df760821842474377f23649eb5b77be4e8cc927e70e784943e85369c431f4208218c275e352bce39e79c73ce39e794f1f4060094e06901490b4b09e5e5eeee3e84026c1842cae529b648b93b97a710a28b3b99ab278882fda610a2cbfd62f48f36dc98c51a5ddc68b303bdf8da9c3346376c8c6c528831763fbcb04e04113390ccd16b70c0177e383b26fe18373784cc0dabc4879c7f6419a98c109b8191962af33329a5cbeeeebeb93ebabbbbbbbb6177777b7777c7661fccccccd384e7f6fb8c3ec5b0dcd337b27cd860e21cbe5fd4f161a30baef065f4e18a306c4cc8144238e19c7c739a9d6a0ecb0fe99c7c714ed49a153927fe0f36ec577bce39e79c1325e54a29a52cd25e481f524a29696497d2ddddfba59452ca771c967429a59492a59452ca18690a8644d90086c92c33309965062ec73132f9fc543e47009391ff933232771f946b349f917490c5126580ae7c28777280c33069c25f8cae771ce0ff80eeec3eec3e9f22c05f8c2e7633670488809eba59dee3ee925b5207d51c3646e6cec2f3021b226c7cd72084382793f8aacb845fc8bde30087f9b8fba05c868015fa42ba8af34797917af7a95477ca18dd5b3e032dcfc9c11d1122ac7c7f318278811af79b932de7b8193ce79cb3bbbbe5ecee6ed84fb339e7d48674f505f6ebca46a52a436b7c8d8b8fdae45576b98a1abe98cc91ce2965cc6aa85ab3e2471d44f6024274811df0f58f463fbeb0fe91260c397e06f78b31c63e8275d304e0f82eb1827deb7e6cc60b4101aa5fb1eeea8856c8f1ae2faaf1ea7fd58bfd842efdd6fd5437725f8d0fd1f5b5e76b7df408263b0e70982f7656f8e3193ce4f82597a4832c9628e341a64150f88b91c7ddd0c3ff5257769fea3e9f42e02f461eec80f8578ea3ba6d5021c20622b430d5bf38f62a37147d10410a50c021098f68851c0f7e518dc7442bb457bf88011efc8b2b62805781b2fcc00752b2543b20238ee37fd5871589dd8802859534b6e8210c258f3d7ea112784902052858624905633c9e9f1f1af2a051ede2871896bfbabb3b43316c52b8f95a5ebc065c421cba4e804e2873a7ec3ae0173e932aadd5fffafb1401ac76e6e387ae139f6388f6909452b29473ce39a5a44f279d534a1aaa286394521d61e3cb97081001470d10a083ed7fc83df359be641144b84fe46dd51c48645e64704bac31c628b4e536612f0d3b1a2c96e3c7662d9131bb3b757767ff2967d701bff399f0ec29a175e97fd309a41d07384c731533d8e23e8157f644c2625cd9313b333373cb868c6f6d1d2f9ef878729b681afce8c2fac7da3a918bfb456621874dc58d9ec8620537daa229861ca268daa21b6ae1eede4b5e7a0b77f7cea2ddddab4c214e30c5ed2a5b54efa569a7bb7bc32be4cfe69ec0e8eede5bacdcdd5bcc160e875cd3c2f928b6167d45ec5ef2a8858feaad5e727787efbff27687d10d12680193969234328498216909ce0b878686ac38a14ff0394e18ba22c618a38c4f60155d1f01000c51ba7448282a45c40069e98399a22e29f8a04b2a0a171774595acaaa3862cad212c7719042530bac58f593c847318bead1c6a1a8dea4a5a3872b7c68d27a32ed0c9df6a88715c5694a5c78b3e8533a7bed4f5c03f922a577a0121e7c864a5c21cdf550173d4ce2aa2b2ba5943435b363c661d5752688e2505a028cd2125e886ca7694150b02eef05afdce723ee2aa83ee590f1cdf6b36d2fe4f5787e1f30485ff83f9f9db31edcf6a3c1f7f81e1d90cd6bf042dec66d3f3d7efbad03dab28d836a0c11c58fdd5e486758c5b06bc6054dd1b1ab9a30a4d587a9f71311774192e5c123cb76d8548a7b224f43acadcfcce3b3a8591e8f1447ca84aa2375fa1397d1d39054fdda3d9177f5f08484833265cadcd58a055b41d81f3e9a15440496959ea0723f1f57d31e7efd54ad97eaafeeab7f4abd1087a721a754f7445eedf9c2cb27ed559c95adb3db110e73353b045d80c4d8556bad15021ca68334acf6a9cf56ada3759fea7f3861eb63d867d8894b5da914863a0a83ca85dc747d701731855ddfc3a1d6f96ee0b35a87c7c3870fdf869b88aeebfa227eaf99df6c38f650cfa721436a4ad88ea4feda8ed44f7daafbb0af9df64257e8f2e8b6d4f3cdba1f3bb82df5f0a65e07b75d0fb7fa704bd170a9cc2d97e25acd6a54b75d0feff57c7d401f1ab784e52f8ac0ea7f3e30ec7a1fbda3fd10f20025589ab81f8f121866dc8fbb2881b1e57e9c0406bb6a1158a66e48fcd62fe2b7f6e0d8831f2cb42fb0ef8371e0c3dae43e7c5ca355af8e68526ac116a521943852f24106a521ae0ca180d64ceec06163664353ffcd7bfa4fd6bccf3c7f730f4d97458e72aa66c9ffc183c5fe535d69d33ab1fb80bc4ce8f3cb972fff79304bfe67a3a36a160f15a7e37770fe3cb8fecaf97c1eccaaddd783c70e0e041daf5a714ea41f39fa1a47b4c27b29d4e96b3e4b09253cb197e69faceef54fea9d79bbf1c65f2fcb8d35229b93db5a0d0dd79cc33fc3412e352f3f8a5eceb938781a427f070ecb644228373b7216cfd53226fc410974c631e1af9f4dce3426f3f9b1e78c1f7b1513fe207702811d8737faf5526da39266066ba36a96fc204858f82a8e1967764e609954635f9290a294c40b4a4a5051c282a4a48414a524bab8ac948497fb71990b7f009795921832c2335b082ea630410aa688c20d0f7e9f1ac0860d0108cb5e065f9e369f53b75d7c7fb22ecb86e4f26bdd76b1174f3e44da9fea76fdcad3b8edea7cace3c0b75cac09240481c2522ee3b0af7eac0b7b0b169071010b187698a2e50626d858da9286953550f03840a4458a30bc00f3050c2e4b50e142851ed41883ca9034e3484c18c7a2c4f02bfc55eb0d141056bb6cc59735a8b0f2b2155fd09857d87ad98a2f61d87641030097adf8e2c4cd2e5bf1850536296ae10410262432464078d952858f314ec4300329316861021e2817a248e19a438e3b51f08685528a15c4a0e1061c6420c3024c6869a18d2d7064e102132b54ac90254a194100e17dad36e3f6bf1bb795d4b8f283152cc4000c307f59090a2c2ebdac040515f76349295105cf058d1a4a208337cc50c2b15c08bf0aa540c60ac0f8d00514610c3d11869d9795a08082cb0ab5c36e3f334181c46dbbb24a5890ae079795a070e1a22e2b21c96193ae963334194dc685cf423b9811021f821003c6d1178fa1d8a10534dc38010a17708102d628a74f8a1da1ed540f6af72a1931e5360eb65e5632c248a31dc9c8d84bb4420ced9b0600b1171c8868f2a04431299c5ee04169d5eb65061254f19aa349c2cbda893160a018f2a0402bd4f0218b9b1078503650a2b90dbe0d0b1e77ddc41944435ecf0c515c391af2b2e81d1dd5515a38a108af390d8cf03259460c2a74f1a05025231e30f0a0b43cefe2d49a031200150f0a277144c470c2111e148d4b972d49070493608115613c28591b4078fdde01c12482b0a2020fca490535bca63c6948ea6204c5616fc1a58b1e9a2010304849f29a1300952c4e807139b21411e5f8528482a61d9a7cb87205896a5e9bcc0b60247169128191d7dc0651baca113b685a731b98c0730e08b6208314193c282834ac18557821e33517002f5e86722a44c830c583a26591022e01f0e241a959ba8ce0f0a1c96b8e99d8029322852a68cc68cd09808ae71c5013c9c1c31b1e946e820aaf3610f8348b175ab478827e01060c315ea6aaa19989def0c42a1e74cb0f5a98bce6b8892c1e9486be54061632b0583186940b39a7004f30955902bab2a0c0e441612e46b80003cfbf39950f9e77dc40b809186ab882855196295c4511596829c10a7228f29a6b6df1b249b318e34b91d79c0d0b1e948690876cb5f257001cf6abaa9bcf870f1d926ac082e465708515fc50e4658d440f475ee65de450c5cb629829573cd86504522479d99442cb0892a81516b4b04082388abcecc28289222fc398b822459197655dce2003c454a0a034c683a24af2b8817c364c46465e86c2828b0d7178598a09294eb8e265960a198430f2b21921c84cf1321a2680b8e28a97d5d800839197a974c032e4653a54e01283a21d28bcd146130fcdb956a1cb1526afb9d69197ad94da30f2b21e9a739068862998bc4c832a8a8cbc6cd39c8b3068898205c96b0e56b932c6cb6c34e7a81647c840e9c86b0edac0022e5eb601165e5cf1320068ce31133244a1c5cb3800c006369b063d563c76e850d5d0cc70f070852396b8e23567c38507a56194c1ce704fd2106b4cf1988915b09064a30435e736a8c5112398e2f11663aa1c795b7ca6228a1430799c74440a96bce6b6d86d4a785b188f93ca4c19f29afb61c5bb69166c1a5e1073e4b918637040a2516690e2435d818c142fae25221778c0acc86029d39cf3c00a0c2a30c36b6e464a0f5ea669ce21e0882ae4c0c16b6ea6892b5e76d29ce3365a68ba82d29c834ca0317425a539d7369029a3c96b6e53c2cbec0e3f20cd68ce7970a58c22af39f6321acd39fe128229495e733f80f05a30861b495e73364a5ee4e0cd549a73100c2d9a60f29ae3e9c2cb76cceca8417d42174a1102229abce6a0085cf08420946e2f43c68a158e3c10011547ac8c7dc78b5e64d84432f61d39d984db0f87b0175ba73b264ffc6ede1de98fb10319937ef8c46f77db11f8fd01bf4cb85910b6d8cb80788c32e03063c883826531c5cbb221e130616e07593031e44181552e7c66a52b4b17764ffc72b360100f32bec91290844d5dfe0fe2028bfa2742ba6fb4e11ec8c209d7a10c60151e0634e3fa338e7fad59d7f19c0febac331e81d105264124e80582b9fe9475676ace5ff9cff922342bfe922537d859648425cd8a337e54a9baa099a0a0d4db67cf72334fd305d1d810669e86c6d2fc8f7d9a974f43f3351d50ea6d6a225514d422d2e9350dcb1e4375b43b75d18bd6c52efef08afb02ee179316707152014df6834343737668f09df3ce25126281647c67db92a452cf5eeafd9b887ba62c9a9c7c8173fc539c1c528183c8107007fe1e931a50adc724881493a016782526c121771ff2921444c9d61a13d8cf5e7f9a4fb2e38b20521053a68cd7016de0862f71986068c84bfd4c1794e527657d90a6ed80b2cc0ec8762dc7f10762c7f978ee67853c212ff2d0fc8a869be152edc5cf521029a6b0a8fc6352aa23c171925aa7bac6f5a364ee070232dd269f765b7c23ad77ac90d56b06f67f0fbf1bf20a3ecf5cee71717e2a4299f0918791f1cd279b6ef69c7dadf06eda5bec5318f65896f592e3646f6d3db257cc817bb0cfa20ebce343304ef65917598675be8573b277a4af9724d2cdb2772467cfd891b2cf9c72ef38d947ce3a4e26b90c16ddecb1131acdf429c99a4e1dc6850f838a2ef6995be0a2fe83d2744fdd87bd8671dbe9318dc33a7e376a9ed6f9fe83d6c93e7b21d9673e9dfd8fd6819f65cff29dfad9db95efc85f8961a6ecbb0aeec17e43bd954d616445586a558824d5fb28c38677a9fcd5a1a121fe22f1b27bdf86b77e77429c7ef2dba17cca9d13bf3d74b7233d9464450d0dbe822196e973b112e3d2ffbecfb8b4fb54c43f525ec9fce7f7693bd237be137e22b13bd2d7bd04ff8804de26ab79fde98c9f8dd0640992b53d632cfce8968b6d324210289a3a8d8c6f3eb630ca4cca069286955c3635204d767e9440ceb0f3515180c0c0ce289777ac7e743c108fd7d16dd9abde67078fe7530794e5f440f275fca9fbd9f13c3aa0f83b5e489f54d6712ef64e2e230c8245b91106a11b08f2551f42fc1af93afe47be8e2dfb1ad5cbffa9f9d8c557bdec74bcfc9f1d1f5fc767bf63f53a3ec9ea7574413b9ec7ebe8be078f0fdaea6f59b781b0e335f8243abe878ed740c70769f03b9e3df656cf9e759cebfa55759c2b85d2543559f6a9d363bf3999799aa7e988601df7ad6ef618f7652aae488604de5367b926ab7bfa14b7695faff6d8b5a459d708cdba9e6f13dbacebb18b9bb0be92220cd24570ab49e2cf74415982fc699ea60bb2ef4f04081a76ce7cfc24f661dd6aad40f1675ec8c33a6291cf80991da215def32f7a6f66c766f5cd80f8b28b24ec000b64b9843a4e3ef185b4fc25be33335b66514b8009ec15613bcaca8e87a724edede8589c10aee538f27570461c47bedf48613f5efa58fd4a7c87e6a5fc2552f5abee635d687481ac95935560e94b24f2d2f81eb9a02cf0671e763ffef6fada3a4cea7341fe3b3e72413a3e365972eb33844ce0739f0f11e4b09f34cb8f77dbf5fe3a9e0bdaae6e83fff3b3cdf83b3e89bf8e8fbfe379870e081f9b9f65efe47aed8f3491091f63249cb3ba18f01d56e3c897b27af2eb0c92154149b3e4ace1d8e590eac479355c8abd13a7c472b12d56b3e4df484ca8b64645c637dfdf0983704ffdef341967d62aa481a06183b2601f147fe6831c6e20c49ff99ff85bfd998f3ff358f7e3dd56bb0d84998fffe36f3fb34bee76a46f09d8d3df8ef4a5ef04f5a93fd217fb544704fbaad9138a43022fd67193d5767dbd17b7daae4ed5ac3967906ced7ac6d8c6daab688acd009fdfdc4de3cc6f3503fae7b37ce7f2e7ee369f9a65cffdd9cf2a5aea4d0d164e996f02f79cee7c38c43d7ca3a6753c8e33df87cb3825bec471e65f5ca5375358a0d6f9aa09ad039f833be7f39cf339e01ef9f301c03df1e77b136c39259b4eb3ec85b0ffa98f0165914042cffa87dadf8f04cc04dfa99f7d92ebb1ac0bcaf283fd957dd0f5b5528e3d99d52411e62f99ef335fc994f07feadfa096dd063b10fcebfff8d7971f9445763ffdf4833c763fb413f241b5f3f91e901758f9f1fd66c2965eb40a42defc7e15843cb9c5a72f242504ea16cfb3aa95f55b3ccff2babbbfc8f8868188b1db536e8bf37ffae74777e9b2fed505c1af718bfdb39b428cb478e21462a4c5e3cd213e44fdf099c963f0a41bdb5b25b0ecd187271fbafdcc87a722f05aa13fa3473fbba9c10425dc73baf5790916f1444759a9cfa724edd56ee5382d8e47b2fae6090bab120d785eb0d0db9360fb1cdcf06917743d0c62e82f82ef6cfcf5853cff25beb331845f3b200682dffd421e73dcefafc45f881197ff53ff6efc4159e207f5d70fca32bb1ffaf083eaf75fdcc6dd263b10faebff78ec7ee0d30fa25d0b081956de907557e65ae38f66c93fc1b382513824c401b46b801c16c23ad9c76dc5fa8c715cd2ac1e8113a1051bbf02c11a46a00695210f080a57314493873d9454174b2079d9576e8466b508cdea278284bdb969067003f93ed811d238fddd3ac01cf66326ff51927559e61365a9bfc27b5897857eab7ab8d8af09cffd4f755bccf56eab2498e03b1ab0e18a29de68030824c478fd222cd131c37ead16f774d646d391d7bf847a2bbc97a5be4ee594b47cefa691fb800b1fca9d0f23bcb3723f68a0b022400c2841b21f3389e028145c45f0308a2df092352151c41594031a4d30a862cc96383c5834861b2688c24a0d4020e5703f25242a173a000ccb410bf66bf2f970e8b17b226fab4c854e1c3535b1e587940bae647c63611c5968e102155fbc314411dbac5436c25f1da08b1328b1460a54ac40a5c51f1f3ecbc25fc167f8f55b524b9448603941879a279876c884a460b3d5df167c1ef80f9f151d1086ed8fdf411af65b5e58567a22e9f2fd27902efc1b56b5f152e613117ed91cb97b3ebfca48ed8c30d2cb7e23aa15fc5a3ff2c7fa43979fb5215b4575346599326598ee93bef42be7845eda396940f7a46f7f12fd8282143db434193143520f4ba02045e5275e788268f3e18bf9604ee470f98ccb4a4d14210405dbc4159e5613552efc1f1ff8b48aa004f0c57eadbb6af1540d16e0c5f6d38e5f486bdd99e0c118f66b7df0a3c523c4041ec2575d31fd8e911bba12e333311d8941fa2366ee67ee7aea04e8ced390eb65274fd1fb23f742e01b81df82cf03855ad9f7ad1bafcc38a6f581803a208c1d4ad3e517aac2ef0448cb6dbe1188d7895fc738f6f8e4ddd55a0aaaf6600c18bf27b2a5980ed2b01f5371fbfd619741e829617b87ccab6bfed60331ec673f202f5fcd21fc4184fd3ab8feb1c85f48bb0ff8959d770ffd178b857fd52594524ae79c94525a21f39cd1bbca38fc505a68766c62d81e297d48e43bd873d3056a9d215efa56b546f81d674eaec99266b5678375c22cf96db870fd8864d828da91c03992d7b81286eb22308efc4b3619d9cbcc54e52ffd39a710b60c69d3a2a16b0c5396c314b18c266c8863cee8e16c086161a104532c5d69010a171c400395221ec058a2cb156c1005a146cd0b5a0b0fb43b3a668bb9fa958d1d9334c76071bb9f5835eb8a70286b5ebafdc4fd98ccc762b8490c346ebf9031b75f84398656bfca2e2b7559baf4b252972a2e0a495a55c7d9fb8948c63ed6a90e4a43e9a4d1f19ec1a7af7150a583a626c6c824ce1a9ad5b7a2270d5a6979ad14bdd79ee4e05dd238138ed0acf9708eb0a459f2ab8eff6a955fbf49ebd46ef2749f734d283702e4968cd03bd04392812b7f84254de6690885f564842fec4468d67c25cd9adf47f6e330f347286ab26442221edf198171e6d7cac37327182766b8291d34aa55f7e978ad59f3331d9c4a878ece366bce0ce32237f37e22723df6f05424fe0cc7493904ce701b12fbf1edc7682f8a2bba73da34cb1fdeb09ae5f33f08eb84aad6815dadf323a771f62fb3d5544fe4952f64a1cd02f3c20b2c88176890410f2efcc034c585c39624205250228c347a542182062d53962853c66c21063fa4204b0f61c0889100910e65d670228613bc00af2d34187a416905393029f170c6169712172a4356d0e8f9e2831c947ce8f9e2b92874e91f99b9b04f47e2c36ebb7d8acce4033989a573e81ce60542bf77571fa8e533272f4ce21becca362b478c85aff9631d3b4eec7eb007eac73a68c4b916c7913f05e7c8be0c06070b97b883494150b09fd65abca30a13420e87c539f15b7e31ca39e5947d65b71d91d2bb872163eee18904e7e8c4c8b1835bba27d4d22c6ed813ce4f8273aa5c7177378253e69c3de7371c5a75cf815732948e8c5a9086912b1f15640c4be68364a6148940922cbc343ff39306928943c9f599a7e9201bade32b9eeb4c65c765a5232ff7e15de285cb4a47715cf8abcb4a472eb8dc3a5383a7225a57a594d3a963f940a8b04653a2b09919dc23463ed459a24c615ae7089e9020e0f69fb821b4bd2fe5e4090902a60aac4f798484d2d1960b617b67019fbd9fb5d0867b5cc52bd6b91ec20d8464b6ef678d3800e35a8ed3b6b7f98cc240ebc4afcd82dac5dd1262a4c5036f8a4b9d80114c4fbc11831336f0408120dc38a10b38b25c81c1eb6ff1740fe09c7e37ecdfcf3ecb32a9d2051844a050841336c0a1050ce3c33fa0cb04fe17b3d688d460e50789ccee834f9a65a7724ec203299ce08222aa445104122cecb0c61152a00087257ef0fa5bfd3c2510238df90e67e704943b6cc1a3021ee69cb375bf0e085dd76710602674b62eed3e6ef9ccf13c223b9b66a16ee45669441ab213cc9e6660f870ee3afde99d8bcd3ab9cf0c5299b9a6c1a750a319d784c6192e3414a47264114a960c5972c229c1a034eb400ddb5f6bb39a68b7890685cbed487c19e30c17423818e1c409d888e2072a21781283175884a0888a1fd2a06e742b8c9615f9be233be6c2d66a9fc886168e0dd4e0628d259e004385223e8283ca11339ca0841765bcfe96114a7499438c0a54a0c60be4104436435eb4fdabad6a2778292ef6d79001182d94b88860cb0ab2711ae29a6cf2f77bd51a5687effc2227b09aed160fabf5acd5bb75ff91a591d45cffcaecc1f65068f13cabe6e0de8fbd735857fdd971e42d325ac2bacda752fa8cd1da73ce6e85d1aecec57e95a8fe7ca2eb69542202b55cecaf963afe5421731ffa717a785cf82cee891e5ca81383bde027e432f1ff6a75cede094348aafe645ef9365635130314c3280617d678230949c983ff2cafe259b4c4f0e163468d7b50d753eeca5ebe165fab443026eed97bf67c2ad28590a475997c8c93efdf5f4a39d5e69d66e70801cc0c272003c6071da278fd467c0700608e38830d2e6658e10bafbfc593c128a6b3e6f83a41e21289972953a6cc9d2e3f8bfed1bb12a49f88c0e6e09dd225019638010f50a06006461479700b99236050861816a8e1c1b74d46c6375c072677247ea04be800fe93d50dc239d061fc27f52a8073e067b15300237178fb7444de9670f295dc073a428e28277e63c7c339f09beb00bcdb11d99d56f9cafbf1dc0feec367c1b7f0573364fdd0aebe76bb33bceacc735b449f92ca2a65a5b3766b1eff73778fb0a33d56d7f93f76dcac8985635614c08d0f2f70fde19457a5f0892f0332aae0b063e89676d5aa2c16b689558f7a31944264b0f9630b7ecfce0f8e9dd62cbf3a90349ef19683b1cfe34470e08a193138c28526a258718024aae8c1081ee018810e0cafc77e66b5c62126314d4b6492908e8e90927cca921b7951952b5a1a16d1dd700816d5296dd4454c629a96c824211df1515d8acfaa7f8a55ab1a17a79306942943e65eb51fe39cd07b754e38883f39be250c899d8f66f10f81cfaafc333158fe15333fdf70c7a495750593f10db74ef63f7e48abd923d8021f2c8021481b4930789452caffc123a5645db9cd6d5eff3381a290271f9640ff49bdd347e3c8774efee44a7862af0138473e0e7720bf4f445097762cce91ffc1142b6fe69c1cbc94ab37935a6c09d9e344518e5e78b2be13a3ac3f3b22f26dad5e4536c12adad3117ba19ff840fed703611f5f3ec669eff5c2fbc5e6a4e48ccab8fd689fea82ae3f3dbd9bfc79e1c520476f8d8ffa5367e4040148ff004a582d18c75efccb6b2f9c434388dd069f7e0857b74168e438943ea54150a074e538b659f499e8983132181304858ce3039a45bfd23136de122233fdef54ff53cd2b2e31c23d3e2e7d9f1f25be733da5fd010becc748466af649fcb32e2828be7749d91539d919b9c17e3c1f509d9d1d96eff838ce492705bb1a63676e09f1d267fa81109ed5a52b9ba4560129d6203058f8469a45df0785232a47c6375944400cacd797ff535f769bbffc0d5ebfc14f223feb826850961ffab20bf23e7ba4ef277495704e7c681de706a865cac839710ace89b10b08a65951bb11b6ff90d1b8b289abf615cf8afe0d8b7e9084c5b42e28c6207facfbc8f98a2fbcf5a75ec139f4e114abd258b0d0b9ad72db4f7cec7fb02a41888f7d08f1b16eabcf5e08defd90e5db6e246d68baf4330ae3a5cd491476350853eb5031adf34530c080491589eeb060e567110131b033f78b5d60139c43a1980e32554a19422f935149e94b1a255de23bcc46a8012ea5ff83c7a953a74d9b3695455097c539f43f9842ff5b8756ce5ed2e7130bc81c763e64eea9305eb088d0bddee3e9068cedfa42ba2fe4a87ced95c47ae3a908bcf1b54aa419c3d0b0fe361576d1acdac13236ca457dd0e983e2a3fe6630f521c84f75a84e04c7a91c16e566f08404de4fe892c039f49bfe0df4e30904f6b28e4886e11cfa37fb10640891d628770ccea9d4f67c613f9b4b635f2dc8a29fe014b13f68be7f90fc960c36280bfc20fff941fdd27ffe8ffff49faf42bfac3756cb3df4c65fb56cb443b0fb868c6f7c0321fbeb7fb2bfba0dfe60bfc1eef4d3daf70b79a9971ef458be04d8bb3ec54d6f5e50cecd07453d99fa9f9f7e55ea6b3ec8cefc4c1794fa9a2c35f3250ca9ef33f39b8fb5bf25f9d4d3e7664d8eaabe669b33897d1a1a9a59a39aa149d9c98ffaa24b3b6131e91d27be008922fff46fdeb7e2f3c4fff82caa09c9ae5632bec95877fac85c632d7123acf93c734e204db6e7ed1eecfaac66f553b0a3dccc358ceb7b71f4f6694816356c48f43fbd90a6f5ce534b63f1dcd8346b46cad92837a35a6c1d2c4a516c1d4c8bad53a35414bd40e0b0d1abcc9e2a647c9365f2e743ef82e457f93568be08946392cc17f2a9dbfaa7765bd3ff913ff3e9cf20ece927a9d7e69d091e1c729ccbaf2f6148bfcf25a5398f18fd5ae9d1e942cc434a82f485e6ffc89fef3ebbcde90371bfbac2c12a4d962fb76011b08a94b2e140ef7c6015c7811d4f5bb20514bde71f14b53cffafe64a06b095ce56a8fe8f4662302bf527274251255a81c7f3aea87ab58b969060c2eababaefcab184588c8b7f73646314b3cdf82bf7eefea06b2b61963044be4fa5374be8754382cf12c78991f5cd8aed4c4a44fff9d9d34f82fdec82e6634fb10fa2ec43e96f4926127821ecf8b089b2c74e44a04f5d52a10f51e60496f94ab9cd7f93d7f549e69431e3aad319634482fe8cad1fb1451f1af9cee6d1ec3d7b2debb6e94d4e087d23f45bf479e8478ea7d56a166df963fe91bb3efe0f167f3e36afebeab6f95bdd26865d7fea824e7f9dfefa20d463cf1e9472a28fa29f71f4afa54b1f6362ef6a390e8553a051ab4af7bca272b63b4a786d47ed0c0ce8f457b7d5d7303ec5bf9e764e679db5f3a9de9c67ec5c2f63000406b6e9bdfe27fed56df3c7ff7a2cab8f6595db9c108197be04328ebd29a5f52e6ea39d0f7b61dca03ad06d68c36e03417bff24a7fe1376753eef3874d52ceaaf9dfe344fd867dbfcd3cf6e03e1346403a163751c0ac40d6802f7beb25c2cd0936651fa7c433b2670280cafd52f4fc3ce8f9dec3c0627acfbd11ec8be963ad9674c7bacfb39bd3d6129d449c3bc8d8c6f98725093beb3d1aedfb356096cf6588775d671249037ac4b15eafbab707dfb78b7c5aed69f0b88e39b498dd218e5b28f777df79febbb03eabf7ea395dbe85c62399f5a03a529a8148e1485412c99aa19113010008314003020140c074562b168341a87cae81e14800d8ba046765097899320084248190208300000400000c0008099a91a0db04997dc97492f5b8c9e634ab3e3e8f7242823a0ae857296a0832f3db2133dca4cf1316152cbc9fc12e011e712fa26b08fb8997f7bcb630ee44464b5fe49db07b57361c210efe34b1746427854f16265ffe9279117a01c545acbd631dc5172fae5497b9fab7654ae7db5c5535e21ec5073d357705a99ed5483a8399910b54887a859904b3e29c48e25fcad3737aa8bdf7b17444dafc6e7a537e96897b3462fd1987ff94817c55a9b0e3cc1ed4fa53eb362cf3e1ae532d36a02ae54007213544ed93fe5da9de364a84a1f4b5c6d155c7d1430f41b6b7ae1ecf8b328459ff6d6f956e3c501f956205bcc6364cebb0a3b7fb8283e794c9c584c7fad1afa81ca222be33cb4c69ec10ef65b76dacbad62b693458eb25af207bc4ec9bebe81b2a1fb5ce55558202616e6598ebaf22d9cdf7e28c2425a6ebce523158fe01d8e7b974b50a443e2ac0a367750263f5d995b55994b1999e69912a64a58a4b2862b531ef4772e792893d0c3118389e895ca2cef57dfe7210c102db3e837fd79fbcc8a24a2b2d37a229f52039aa91cd6b540e69ace8c6b3c99f92e858261c28070fe0606d15c1fa04f7f2a47b35375aeab5b146c2f9b79690bcaa61e21a35082127703d01538fd3ebb6fffff47c34f2f064e5c1853e3af89f83d6688c2c4f92ed416fc8eabe23feaa607f94ab3873c50b52882f08acd0389a5e8fffbb30bab5fe0a6d04a6098e376a77f1e94d8ccf2793029022d197474856351f3a80b5094b1e652cd070fa0cc32b207ee29262bb22aa797fbfbacb22c439daedc7c983db3e662b4503322413302fd1fc45e3abe95002446423c4341e3e67fc02c1c1ae285bbcdf67519a5a339fbd365cb5612cda85b9dc9c9c34e667e5f77f23480eae255e76444e4b0fd0daa5267e402751827598a410ebb52c6781ae3bcc9b2888c79b7efc43545a2f3cec4b205c7e0e7d070abec866c7df63aceabfb823b170a6c42c6253a077a58397e65b28e0696be3627108b452069e87238b2993d9aa5b5affcfa1c36231d0c86a77a84e5592badc2b2723a5d426b2bf87c935c0ab9abbccd83844655827e66cd04e89fe01e99b9c18ade17648f66d8778bb2fdd4afbdce849900a65e22ad420e50ae4f58fe0d317243c7602277525d9c97953aca9682e41b3d6b0d8470a02d3ec46b0fb3917e6ebc0c09f2698d9212041ecd2dba7b720e82ef29d157882f68d68230a611701cb2282f777c7082d9e33f3a2446a8900c208b92871832d6895fda480c9772d550d85ad372bfa090ea9ae57da1ff9784aa873d82aaf2a93412dad93eb8110d26cbc6e078ba56c835ce01b65fea342280c0fb203cda09328a165a14001bc3d15a6f5b09c2a323495d9217106dd589a294f1325f647acc55489fa549fe4298793e0fd2ff694dcef647d7aa792e258cd1e8065df70f75012d210ed90831e499a0c6004fbed16a160d1b5002af51d5cd5244dbb5f93557e6d3fcae7398cea137ac3388040a04a5ac8445e4b2252e089e72422c66172ffbfe37b558f00247d73c38966839cfda97400700b042802bc146ead07c52460046eda79cdd3549903acb6c0836d190b056a1da681a5827c49451d9a6e0064f9133f26ea05437193592dc1e236e6e6fbe61f60b48d4b3000232be13ba183582df6be59cc3ec6382b6b44c5457e10eee3704d5332d630aa08955c397fde2aca1041c04186240667fac73b6bf78eec4d67c640d05da20d3a06f0573d42648a6413f4fa681c69af28e67a8bcfb7dd3a9b2cc0e26f05bc2e37b879e2f221ab43b6abb7a4bf6c307c1a90efa6d56cde58a0902007062c3411595248501d5731f8dfd2df29a6354cd6aa539a20d78ef63206ffa996ed7bc408855a8c381f33e62d460098f7769df8407cafdaf4e6076602d31f686bd679d30852d500caaa131020839229d35cace44bcac052962c8a7eb607439eb3d00dc7162d0660a4a5993f36f04735be112ce4df92ec347aec461fe6667081836c29cdb4ace0fd36bfaa1cbef5646819846c4bf0e9a049ece18b273ca6c3936c664398381f460218e885daabce9aaf1c24c76090ba0d1921cc4454cce42eb5ff8e4b1357ca3f2d4397ec3a25491d90380552d402ec79ff0a078a38201b5764bd49233186e2fec02ce16e0ccd00c701d1cc27ae652eee94125eb5c692f6ac77be3e8310204c0c9c276ef0665a6a4dc0898b8a62e9414cc79f04ec10ef1882fdf1ce508c1da251d62090235fb1c702795550ea5f98920ccc912fd35fafc54b896fbdee38e8005ea4e1e7f084614bfbc4e152f4f6c5bf77e5a974dc862e1fb9812fe07abf10e6536b00938190a3f611c443f235e61e6105461ddcf81721be2011da7f503438d5fa168efa70516aae1c4bfeda11db4c9144d384f17e40d46900a5de8aef5e7af880a881f3efe730182d9fe7489963abe4dfb20cdf83685dfce9beb1ff211f3aa8ae6db9cf46f099292c72ac2cfc950a26f43e8382be393e62626b6e57ce6197823199e10e933c2b0720201a1e89c28dfb97cc33573591a636eaa052c21312545a07c2d735d0ba040185978afe6eafde605bc7b5e82130cf4e6c87db7e71f02384ff2f5211a20aedbff34608f2f3e9cf1bcb889e8767803bf5687679a9ad1f3e542c3737d10103e42d9a425bad1e1691a25d7651f56a4c9975d0fda237d5ae5d7c849f34fcd0f085421feb496df7625a6e8cf093c5a29c2d80984c0122b500f6ce6f51828e68b186e10741dcff8a1869af098dc9d1e54d6f66f5c9a33af13c917c666e841865928050410bd188a7ef72d0eaf8a761191d4c40ece4f85683ae958979e22dbaff27276b700ce475369880e34613f173136ae4ce24ad98e8282f685041a070f58b0a80c2be418ca925226edcc28441356ec32297b4245fd1bfe9d281406d24e7d098a4d5838e8db5ab55377a55e587a492e12a5e14f5a2b32b76c0211945f3a0f148aa453d02f101a8b662159a1137e1577459ee91dbc05f9515fe66382ddbb21b9babe85f48c83786510182750cde3638c9f7f8582373f10aa7fdd3fead967ac275ae827f7a6645da8f3c664f141b942a29b55b43b8391019ba5a549064f43a1ef0a89cae0db0093f1b7494eddc42fb692727867eb6cb29e7a4fa9f8350e3ce1e7848af80be40c88fe319a5f255c88c6a47774bbc33519528a5771d656318592831d4e5d18a7c4dc87ca7d12b7c1e08f0feb9ef6ba447d91af29888f158633598f8c583ccf87c2c95664135042223b7dbca1ca0614bfaa4a479816e0086360b91b6fdc493c89dd50880c3a0c24d02b01e20594031d1280b3902441f3629a063dccd730a09728ffdc8bc09d0293d847399c40ba7edafc8ae7a0e435dfc612fb814f717eb1fa2f9302848c6d8decb489265aa873a89be735f6aa5fcfcd2174a216941634ce668b22032c64afa34cd8fe20c95d0a2d1301b6c3b81f32366fe08993da74c80c22a63600bd8289b476569b49ceae744f20185527154646e7ddb8d46c9ec790643aa021b0f27672a05e362c71440f21ebd0842501974ef33b4281853cfacd13d2cd4e0e79f3319f1a58df0c6a36d220a5fbe67d2f355c2807a500f2f61bb4713a128738a9973e1c52539db2cc167ffc308f8399bb084066565c6dd0869a6385e0d40739b3d0a8571cc378dccc8bc1569a34e92b8e00d827947bf2ee2c20658e0dcf319f75fc62fe7812b4c816442fdd109831e39d214e67df1df4f3a6ac71bf10d372fde042bc083637f0f488204e0bf6e2021b82f3d9fc887cb2557149faab9b1ebe08950211b3a984c4a0af04661b820df2b02ebe8116c5624bc7caf028f25a1dae74ec702e2835ee78a78c974c20cb5a069d0434e712d94bcb2045a262b085eebe2c9e9124405d11875d2a0d5611e036b124a5472ac553ba44a9dfde070137f1c02e5c01098412376fad78c541962ec1381e2001dc4f72eb770510bc6a886ca996c03aad5d12e4d45542a072e55315db48d472b0b936fa925298f59aa3f7bace5e0161751b5d07fa11799391d21212ca8a174c2351185cbef26777ab31b3f3840ff7d8599c27737129d3aa168007ffe6d4624e47b1347c526981045226a8fd9ae289c7e1f22869603bdfefb6158f131309988a41442c1de82d340b7a57b85d97b0815eca9cf5459512a295cdd4a2f30eec231ff28d1ea12ec3a83a0013d6a61bde390d0256ba299489ca1fe7b79634821266eaa5352bff05a3f312c4ae2cb9ec55bf24b11579f0677e0d750265d4520a2d0e893a3dd285b84bc41c09c20169766db95e901e4b6904b8cea59fea1ca0fdb1e91c889bc58a2377be86f9c9fe43dbe813d27e1e763783007e400c1630c1a23f5767392d0b10001a1bcf743b75a3f9951441f822cfc2b832bbd270589de238b56e5ff2d40df43b9a88228af2cbd54c8bf0b8f120123e85e8408990823e2228c9a0e894319fdf522e20c5985dd5fa87bebd0c0481ea6baae1f290a3e6c1df37a250cf1df1ffbe1a58fdd8f8b9ca7af344a3b2a58916611969a65e1698f48b50601513daa0d697846d548d1a4ade887293aa07ce551ab1caf30241e5ffea2960a19e077001c1d46829e210fe7c7e26f6ecdaa7a560e45bea622b9c0f648361fa0c0edb3376554bb0c0b5891031c2b477b7c713e0ceb256779fcfcdebaee420ff12235d2a2f585790a0615912d51aa0617f95a2b67d822e9a5db3413b1d14450b8667defed8c632e672a8ff7103529b494304d55fada3df48ab7a7e886c8f110be9eb2b20376fff250d524cbff5150d26fadeca0c6d6eac867ca9bcf9bf7243a51c637889f633fc8203bcbb9d1a4a8d45510cf09a281769f5d518738b9afb19525b25a718a8886a826412d7f16472cf3404b13c45046acb6d06f40b35354588dc019c708254a87c4d91d70968935eda83f16242a8d63088ec8aa1126e38d5822d61c66c4387cbf82034229f19f2ad1d36fc09dafdb2b8cdc72bf16f62c23c5bc6d814a176280cb950f77706c21a12b4c55718ba8258c432a849409438a44271368ce5c4e3ab5e0b69802eeddb8a6b6a04cad9f9536d8a8f0bc2a0d78d3428ce5890be0984713d6f8af49754b43ab038d120bf2daef8f05b5ead42901abc8cb0a880123d3661a4ab579ac47c2bc479343773896bb3d40989a7a9275d10c2598e01103a8b06a55c274ff387a6049d0c24a2b0ccf2df1a33d85f85918ede4fd459e7978872b1b2d94144c11878d24e67b1c0eda89229a194c4a08326f99ad65685614ba879e659d85dfdca6e2651c52a4f57a49f9f0579987c8422af13e43b508c245d7a0c3a8998bcd284b899d32d15c54f25f192d495cf3d84cb1a0357523db80a311deec097f3af5141a5e96bb5c67225069eb1e0a156486d0b7ca55b6c000c4e19393f2131fdcaf0e6e8176e1442c93b95650379262ed95e30db96ccbd7f697bfcf8f1fac1c7414bfda910d8e088fe278545586e580c9c7f369a68d0b3f514cac9cb730f4f249fd14f19027beca0dce162851398521cdb6dd5bcc9455a9493b873ddc2d251102b3679a89d7c71c507a85be52a3b38418ae5a11f4df355f3ae31d943f0165b97e1035934761cac6d89790bce5ffe0cab4eb6ed910c061b97b1e3473dd18233ca42724c4f270a22f83b0aa25ad01b4ea65a764d5f59c41ea16f51f2a0ee68cb52d851d6b5146b8d30eb094d4c9d0349bfd48f824e597113d705fc72dceb5210262703c4c9938328da4317b3b9d0e6a253eb35743277c3d99f99132db1f8419ef3debe2cf3852a75d720351c8d97abae50e4f90c204d2cc446ff80f3dedd7eecb52a6bc9488ce35a86e0003dcc47d6df09465aa28c8baaa203d175aecf743303c033e096a57b0462ebc95522be51ade81b2701fdb5e39ad8d1f3950b2dc8e81bb13da0b2adf8f3ae78cc4b0530a2d94c1157c9114829b6471f3795ae607bef77124d0e7829c9ae5c061f38298f4d75700196f8ed5523c1cb06a65c04e08c50c214c1a044988c96825091a44f89d93bc004bbdcd04a2e4a07d34e3a13d2537ce853c55c326c849295d1c7d697b02ab866a5734feb34df7e23c05d745d11e8ce5bde924425af720091f80106e0b624597fb6ef75c8f242c3fc75b248a11fc040ff0cee0038fcaac0a27e592acbee9065fe94d877b649ff2b227be4a9f6c580f9cfbde5a304c5a9e2e150b7ebc57e79bb63c53aa7d67109dfb7a592107c47fa90192dc1a068ccc589b4e9e87987baf6649c822aa38753934c80027a6562dac5397e8c8dd059106dc2a51d1d74ecbfd44f05711946cb185cbd054ca56ddfc0567417da19db0b2d226f061b6bc7f27bc185dd453b8d7e72187fa713958aa3c599f31fae928b5d6dd0945eed830ca991252afb5fb68ea1c745127c2e47c5342684dda275788a9294e3c527cf8b1ffdd69140a26bba35f83534f09b39edc26a6997505df3a0a09e0360891d64044f4ab96c2361a5303fec0c8f1fe7a9c057fe495d2284b34fd6149fd38c4843a739d6874fea573a044692d742ab3cd059e74829c43c0b0a6a59cf2e8815015a42284bb2cc1f5c4cbf0bb700790b914c4f033bbeab8c419f5a160f3968d3ffead0409b55597df7760267ca1555b0ec1ad36050444b3be4c1faed3ea1e56f26ab300eb7f1ba6aea7c35ced849df838500f1576a5e56f9ec3fa4b3a3d091e525897ee4079b7c54c2558e539c989ad5a1093f0629549b84d644b347176a0ade2d8a4f07d3b15247b89e7a874dd8d98cd4fa920c300e7b87149f460620dc3c2038db4a5820777d7d8ffb786127776e1f1788643521c7d9b49f17d3ba095e86e3dea1fa25005f5383c27cfc458d08ad69312d661c96495b1b1d8e075ef64dca20d14ded09a0574c7fe070bfa75c77bc4740d27fd65a0aa68c2bdf453efa09cd7d4ec22b7c3fb7548e7a0cc149987c207d83e35e8383939517f44475d4e71c29411bd7b92728a8b71963c8d5a6c6812687b9814c629ae0e964d952046316a7a926b88f88b60bafbfc2ad9d2f0b780b7d60d50197f32bae75475c87aafaf6ef231548a12bab0d1a1606e03c8ff064285d5bef504a76f636323495bddc190ac9744e247e02095b773d3b780c45f420b0bf4c1d18b0ed46acd45fef5d3d15408390860bac307cd8587a743b2114322de19b466e8266379a84f0b2f6a91bd1bd8f2524dceca1b4aefbc12845e8742b58f8eb6fab9d1f2f687caf97aa1f916c2a3357f0f3536871742b491ed938884ef0f27481b6b1cf37c805d35716a794ec895240c4cb4d1b78d09a944e4d7bf632fff5f2b244a51a1297f361a40bbc0b385296bbcc853bb2620f92c766c893671174551e7d0d17bb36c46165b2a1e14218f06b3247d684589df04e58b2a10ad65a249c7b69e1413d301b0ae0d4a2086082b3eee40a62cef70283b0dc23bb0cc44c8516d6590251c91ea0d5637cb99b86f042049502333068a57dcfddcd499000818ef1d72323d69eb1b1dae36111bc91506bfe52d157f8f9c2fc35a704a83294c0be53fd50cb68b797c91f3d7d60c1edc8455f691de736f8f67788e61c8bb5506a0029e6b8159b23017eaaae5dc4439515f9389a578aae0f22b75776bc3994192e427ed5a202606602770bb182127853606aa4f4cf41ef3addf63075ee52c2f30df3e254c821cab441adaed010c5ae5d8fa91dc2c00d29d690d13bb432ff43113ebf138a9a3161711e7d882038d1a6ac8d584a13733e139cff4650d8871217e102872093831ab54476c020ba2c4a702ab8042640c3b9e6effeff0aafd7b98835453eae6eec21988365036e8d52b21eb8a86c94d2d5d411fa3ab75c14ba7018b793270d442bdc7c12df9c32eebef3948a267f08dc012094aa2d6a040c36e5b26a65766d209d5e05be585cc93f43c22397911c7cc1a15fff6856c967bedc96699eda5e9eb7b8957d3182ee09fe4243e86d2ba5ca075419a868217cd718b3e3695732dd4ea60be88dee40f86354c4e7d48fdd4c384d3c3aaa63a1e28de65fd644ed4c31f4a6e5835ab1bc134c990f3abb1dc95c08870a4b8fae5a1cad1be7857e432af28efab061cb60d9eaa24ec33a6b86bbab444ceb3d8ed8d8b9c82809d8c469f1e814230739adaed3c7ee66913318827438d47468ca35558c611b0193f5af58ff71f551844a7bfb215b51159a0a1ee53df203d21af6c5cd016ba872d30d05b7b46e1506530dd0627b59e53d37a4a36e6f40e1feffe9f7cc0c89b100d7c82ce2875823511332faf0c59579204dc2207db356043bc92f61a8b06d69a59b0b5b5b1926a8431fcf3ebe033a3c24b553330bd5aa4dbbe1b69f26b098be19d9dbf3dceb8de16680e073e3ddc533510da312305bff0d7ecd821c64a995a0cd12287e50e48888fb4ea68b3684c12bff85915c30e737e1cfd029ccffbd1f3e7ac0252728b3f3179a303b861ddac1219bce6527aef33177dde5d3b8f9056561aeb485982f8b5b8be945e43329dfc0562475ae32733fe62c3a0c2cd738193dbb1cffb3c04629231f71b536dc1638b8aedb95788428eafc6a4f8d58d9d6b1e290e1b07d5d167681511f651417d9e75aa28bffb1e8b5dfb26cd68384abe03b4657ec85e72424480d010779838f5a41e8cf6f5f8b59bc7931093f9d1f30877480feeb16802e5067f433e2505e21a8c2cdc9647f2cd25e4481a5ccd20288bd4992524c725c64b56453ac6b6ff08d731ebdafa52745e1dc86791531517f5a5692071a78fd148281f6a64c17825e0d09831063dfea7d27e8639bff117cd12de3573acc2d2f14f859ac1dc0b56d4359f9916417daa870c7f48859dda0942acea52a4fd966c44b5c057e9dfd6e163217cc18df291d53fe4401c5bd7cfacef254c9e0f038ff8326b4ad0979443ba07db0fe6996e0065597ae2d79e0bd8c2bfd310d74778c68120baf69f03ae07f8208ecddca2c11a2a2506d72765f19b98a68cbce5ce78fefcc38e2fb2b91c06a38d7846537646cbb1fabe8ea9c17e804574eeada392f603fb0e1753f63c522dfa6669d8d2392d3f2a060e5bc2ccbe856e7a383898b4bd7b3b3c23fb201c7f813a87b885251c0249180581c55a980c3f90310c8c3d54e480a2495044f5e95fa2c34ef8352c4108a459fbc19709758d44efc2f559463172af4bd546fa0cef59e1527e94d16992aae32a538a966eea0fe71bfc50c8bec22ec5d4646ef698426c689402b6e1e230877c3fed70fb1ac8e459b0503516e1b5dd979fbbc5396128ac039444c40ee94af580a2b8113992592a8ad5a0f6fa68aacf755635af27e0412de3981a940a4bc6c7ce8b861a522ffda1644600073c940ca86e2773c8dbd8d3fc71a6769f36d8969098e2f653730960b1bde4fb2b2ff89363fad9974fa02b0cf99cff10ea37952d205b6c98789be4dd658a66bee7cb8015b75a423183146f6c7b7b1ab587f2e2f411441e85fb4f9de746a3a076a1853c71659c528296b100b8b5ae364d1868b4ade12cb87458771fb7c96f0008aa3b15bb0f510162517c785ebe862abdefc8623e2e0a1bfd2f87b15b22a8686331722a7c6fda1c0a33c51da06bd8555c96889c9770e69a2880a76093478f47c795cf7bfb9662d6c163fc4e386831de17bc623c3611fd2e7e6bf869cb36ffda512ee709ac643efec9ca26034dd88a4e64cede8700dac5110518fe329286040e7bca29d102622d20ccf33e04117f2106414d9ae011881c6f61370ad5fb01d34e08d14c2acfbfa72c8de23b02c62f9e2dd3167850913c1e864cd7324ec6950df485c25c9380784000bfe7406df07217cf8b5fdc05828eb4791b042c3efcfc2577e0e6813633323a11d03ae131d3e02ec935bdec1b573e3d8f4c8d9f8ed55c319fa0b0ee67c920591b248a9c5a68c2cfcf53c561255cceea634528b39b7d148ea6f803228089e5318d8d5a4766253f0fa0ee5e41d4448e79fe26f60373035b4eeae2ba23ddbe96a4d4ead0eede9abbd5327d44aecdc1f3cfb10e0328043220d8585124205d2ab2d34aba096b387e9412fd4846f762e8ddfd2f3a51fdeb42de9092a8ee40d83aa4d16cfc27930860a9a4551944b34f36d2a1ea5966c5f956c6f5c5a4d6de751755f3b5a54f3fcf1b62faa21ef4348280fa1ad7d5c089fab6edf5d0a617f7b2db0250c7841cdedfc0137359dcfe762392ba1a5d245266c49eb68492762613915965b8714b5f140da0d0fd2bc4b6710dda1b223680d91a4f48918b91c6651cc527d6a09698c26dd4c5d54eff033d822974bb68219d60c4e410c16805c0841782c9b92e834097e23d11f7f885c6098c05c2f65cad072dfc1a0454e01cd83cb02b9e87305be56b493a9e3106068541922305672d1f57970e573d589e9bae9c866b89fc08f080be830258487ebb1612f88f0e6bbe491ab88662377d33522534ea103527556af446698486be496d8f72ddacd811e39d08448e6e37623f9d2b3786db431edb9dd9181426e2e0d6f2a3894265207af41576406cc0fad5a50af9fda8c6b36a24c2ed9b34b5f241237385b9355346abd770f52083b9227b93367d3d7e504cbf0ec37e1199d0c3481cb148aa62778e5a17071b9df623fc2633cda02fa8078b0f1c6db11b2622897cf31654a4d8059e584ad8304c89770f2587c4d7332a4487990deda71bbed9ced064afff57d5a5a33c95691e4e6714ec321779936b62dcb69f194d87e2b0ab78e827ad704a95fe98fc21f2f36ff5c4b0d3df1a6338374f041521b9063277f7d0703d8694921e9544fb00a38c7044ceb05e99bb3c691fb916d92711645071662405f979bc36b9c2bd1c695d724a08da6102d96b6351d9c2ecaae0a4d30a3a3b490d2a7bc3611686efa682911b09a265c9d776b47f3da3b086f924314485427820c9b6b7f96c33e50348aff576632af23c984df7b2b54dd406a0cd81b2296890f16b755a6f857fbda0fe7771fb50d33151fab5c53d7df5df6661815357df149df9fe15795559ae251f1635fc6a727b8dd621fffa5ee4f4ff536e35b51a97e4b19efb3e06e49238ee2ab5ab25a1cef31f860fc196e9d7ebdc627ec56d3dbc8941114b36248365d5b6a0787a606c7e6b3bea9544c7d9a016b0905c2cae75fb9ff4ed92fdb662143441b2a9479209a25be38a3db8cb6495b5d5450972641ae10f1510829eff854d6a64e5514eeb8d8951e87ae6becea687ecacd86a79cbfe6ad542d84ea40046efcc01efd7b6aeff497edfc19ea9d7cb1f4012be568ecf1578140454a5a1faf47ddc0e786722019cda130a645f0370ce6bb16fe59ff912b5ee7321734916eab65c1720d5c009b2ac1980a66c58a7100281ec9a8ec589d97d36714e13284030a23ee6318a4225c5f46a8d9837db34700d7913bc7450dbdefb51df6e4907b93d5ca73970206f2183b872b1f5bb0ab3c7de19980684029f8ee138cf7cff5718ee1c83a231602e8d1405c430032d3b0e50b5a29dd9d1680bf2d4f1bd1009a8661a774c25082c4c647242c60e9ce59de9725512368577be277030776133c0c8056cbd7713fcfe540cdd6576270e70045673cb2c3576ad49dbdc0483e8c7a6be2a0b7ba458391ec898e021744df7a1934b792af5c5560ab7b040a40c3f00a8a40265e7d38061aa324f4e0dc44e76f3193b81c2aef4047561c8557b539a0d0fc3aeecb11ae54c55f86e1caa35716ab3c30a06cad6d8272ebf50f9244ab9cef355b366b046cf6fc064d27088a2ee844433e04ec7054ee61de2ac04023605f361f9a8edd557df1e6f5a855aec71d7297e800d4f3f97c81f4e0fd05ff9128eb26e95a1097cd6a328979e0366627da7e450ca552369c5bc7d0967e186e713590881be97a9b55c9685250e4ec579a784fa8bc24973763cab6ddea69c8453b55097bfaca346815c57449742c1b3eeea50b77dc92e069847b348b5bd8da6f6002e8831e35188d7716e49f4c7d312159f3a6aa41973d290ff66a5c8658f4200f227a2028f4506723c8e5cf6d49464af4a4b70ae331dd3ff160b8a408b4e32b21bfbdf8822ca80c4ee7a1dd49e67fe745e5ee1dc4c11a66dc121621528c848b3228535cc8bc0a0cddb36b84271468c7647b6e44b497fb70641341305e224fc4ac10308c6e8fb4b675e7c744ab102bde5d1c3fddea055889efa84422da2c898bf2a6aa3be282712410bad28f82ae7ef05485a352c53900ea576f6663f08755f449dc56e0b2550093f196ae662bd7c1e6857c5bef075c747a0659355da8f4e05a6108ec71ccf1669e041449c9380799316fd2e3a4ba5d08c44c0522b833e54ba7563cd0182908943ca657324f4b381f06082748a37c8259e926d521c5abd5c72364003acc155409b15e196540d5507c8556beec130edf42791ae24f6ed4218999c09d5f75d26d553407b59b74e2597338c44695e005c0ca1a4a9dc6f0b94cb1e3b079728069fa2098daa67349afe1e10c9daf2a6bc32120aa34ff88d3b57620e2066060d66cda3a32637b764d76e227dc7e180c8cf46f2352d305532e20312a0d84675e01449303f34403cb58f2910e62780525c902a377854db803b5110e5ed20867ed792f017a54c4b111fa2d2d0889e5fa35cc101b5f2f2a3157e7c710f0b541b6fa8243a7f451bc97e4c2adb903223a6abe241ca3f3f2487072c1b1a2a22b0fbd1495758d16f9a260fe609e98e1afc50ca60c2444ca6c428ffedd360b0f59a60ec221eadee9a8bb07b1c56d5f7f9a68be6fa46c1b343029f92f9f64d6c2c145039651268200cc8377070c0351cc4203d706563dbaf6cfb74935ba18f2e4c93a404376be9857b8fad9daadce0b1598161b321f6109c679ffe399d6db920734939c9310230189f78c5f10a90dfcbb723966bd0f48039a73b317b6f8f2abadd3eff17f0b16f6c68f17babfa2f5f996ca6879e236d74d58a257275496cd8f5591c6fa09b07fbfe3477fd85c2c8ba7ab26d01f07b171526a1484658824c980f938793816a17d34051e1b85671c2df674ed35076feef6aa1feaa5621a5132bf3f1fdbaa13f0e21b1a0c1ed724cbb67365ecc37a916d6ee61e1e686bb9530570e862d4fbe84fb94c1eb6aa01ddbe210929cb7998086cddc8d2918cc0eb4aca4592148022b5a5a970420db37e801ce6978480d83e26f12d6ba69850c7545aed8577315f34e39086eb94131b2197ab8e6e54bbe0390a642a97861fbd3d92b1c4cd859f9888fc42ebe95e4acfc0e956fe9177c914b0a2cc7751eb83fdf1c0b8b98f5dca84edb6ee6b7e5e4170a58bbad14398ca7257508ddc6d4e3ad51b1108e639e88ea372282b7fb9d41ec58ffd8976542a26c7617a37c9d8cdc8497930fddf7bfa2e88a1f98bbfee1291dc4be74ff4119817ac833e18f49f315e5c24cd71f47f22025c73759fa1ce4d43405439c0d7be6015f9a728b34b9fe6a960fa9455e5d28d27285bcbcd61c582119f20f1044f5ee6ee52e90bc44bd97c64de35b25df632b382bb1ad8f06f079c6bcfa944432e1ca96f0c72203fbbac21daee47b2a52f4868351a28a4ed3ec4975e7e3081942cb0fa745ceb29c07d786623bdd34d9d7751a3958e6f00080040e520bb76d693dd8451784414bad412c366ed74b072771636d59fcc6584302be3c66c79a5bea158a8f08f6b1c76b9790b0e2532a3d5255046da4055a5954e18bf4662f2c4a1424e94c35349c32c20d270e9a48db0a445d66126e34b050bf4537f3acc59d6a911c87ff0673732e4e0390c66cb6e1011a96feab427be11d39f3a3657f8c5b8579b91c52bd5077334e82e3df9afca91f94eed4553801ecc9353cbe3bf4fae39a49f03c01d06a96378212a56930aec8604760808f1a0f06c981979874c76b246be07d36e24bd0a4eabdbd822e872b4eab2445c8164414a4a171dd7d8733f392af5176a0ea29b922f90d901440246ac562df4a315dcb473550237fbdd74977125a5c5b058db178a10a0d7a2e5a949644d230f82f467296c188bd64d781cf9946097fcca466fcd6da0aede3549d3dd2162e6da833b4cad46542181883489b967fa054af1c25b3b65ab02249979682c9e091d41294e686ac3fcc51116618349bf40dc20d5d4aef278bf5952801c7b83d5340c8d9bd654f5eec2af0aab278c9e645c514e9093df4ec4740cd4402d457c4d1a420e02253f4d1ac00e55295ea9f110fee874988c7ec231b4f01fb539c46221d5c2377b44c287ab171d57a215559663d91bbeba3c65f515c29f97df47dce401987cae0d5c1394351ac59d60f15bb5d701a2c03a295db0384880e87f89c69d15f27efd5523e9f86c3992db16478d98f2127126a4c20c06bc65115d1eb00e0e549d6b0a07de841d1dc84c6d9888cfa2ba8ac0f396fb3fef561255f2e0741adecef9189cad2172df51700e47b8131713f021adc3bbb8218b300151044736891822b78d0ec1a00a3a35484dff4fad1f5a33ce31543043168e674b15a94a06ce09f31f2e60448a1ca094b94505e11d39171f20b2fe576adae93b7d37560c6203a751c4064793c406490bd54009e69c0a34cacb942aec8ce8663a2febc865ac86cf04694480c54b42a29f4a5c710b940a592811cdc63f20a5459e9c4a0b123360cd515d848d2c7027d1527d69f0418322b74b6171e86d29c869ad493fa01f292f9042906c4555b853d4d8168ca986e570a5a81400c924a4a9b292a1e11509c75880c0b66baae016ef7b506b495599fcaff0b64e8ba24092397c7bd8975aeefa0b47fb6ea9e2fa979d1026dc840e858b749262df708cab48d97f59ca262bbad2df117272b7648341cca9b1f4143dcccfec7549432055a898c98fc88f864c0f2b8cd7e6f6a8b2e2cb2cba279303db54f60b2bfac6a53558e3021530b873f11831dbac0c2edfd43262c94b02c94ba3f7c8d663681f80036e91b44c71e95e9a5008af374635469a3d76517cc4a2ac69dfe0dd8f28b36f6437dfbe5ddb2fa4cd5648277511f7546709d099841598ae711ae69d7fab5516864d73831e396c1502b148f8fb9f2461c193c56c05d0c31d31d6e76a3c07df2a8ba24ae229972d53cf0f23f012e19e487d2620638ca2c7f3bc3e4b4bdb8d87560d048ebfc674f130bd592e6a8d5cd681ae919c4d7331f3782e7f100b85b32ab0c59ce87aefd2de69530373440f3981b6681a1d9f47b1f70174ed47a166e47b73e077abef37582603c7c7ea5d4232d0ba90770a12b4ebabac8156e20fb65b763db6d85afab7452c4a32e3552d76c6a33e0650cb91aa12678d5a2686e3cbbcd62ddb39da77d5ed9332b835e4e213f4807bb5c0fa78a6faf4d0774eba0ada2ecf113c2b315e75899e1837e16484466c52cfc0f3b8bc842d737558a0399d7802a1596b5596cad6491b9d28ecee4f64ab652c6f66f73404089ce58bc34a25b9f7724434f9ec181470d5fbf94ebb0daa1043277b0c1d0588386e1a7b1a95bb34963dd9300e9d6e42cca1235479bf9f8e12c86dc685ab8ab2d609af458255e1073b4cbcb2414e976dae578cd801d55efb2fdfc7ee1dc415413efb5f92c196b49161034ecbec9072f19decf4a83c6bedfc2a84fd7083450ae03216225db80b4dee5099e80f4a206257295c27840f3e9777da1cec705d0859a03973c1e402bfdd6f5616336df9e7348666e9ea3138baa5f08fd69c0cca24e8f7c80066c1b40bd3dbc70eacbad1f6193dd4abac9080aa4711790765faecf1bc905b498df50c73964dd82296cdb830418a22ae457c34b34c07390d05efe17eeccfd16826ff00682adbef208e965eb5a2edb23a5a0d67db0522d4f6b3c6750b43d2c26af8743f2fb7008936109e1ef90a7a7bb23fddfa5e7c91422ba89f1be91441846b7c40199642f499ccebf385d9492b73f33c699c85c811b09f07e40b9862775696acab3a809b163719b4c64ca61a797705602c724018eb0dd6742993295bffe511f06e34b56f41ecb8bd24d65cf24283841d2dcb266a66674122c8cab851760d077244e4dbfdf1bea373a3f37440c6c02c574b1e2a4cfd42d6afb323b50fa13486a9f09d6d1e41f8d12a28e046831bc843a20ef368fda14b2bb1d6e7543323d8b16067ca3e930eb9c02f5977f2b735afb2da3aa1d65603891c9be08d7d3ce42bf97ffcc61b1943c698ac666b43908c7f9412a9f422a174b1625960d88a596b59a32761209b566a2071193fabd1b5c85894b6bf6611f64fc15a26273887df43a99afe63946f4b7e011d4399710c4ab581370c96e943c3108ad1289d48751e2f724d8f9400ebef18fe51e1a62d2d53ed64f0c8e68c8fa5786ceed51bfc5ffa504b34dc098308e3770884a52b5ceba029ced8fa2e039743516cdebc786b08dae1db3cc82b29e92846a0468d5d7c6841e2be5c3532020cbc8580d6fd5adc6065795a9726f053c5b88adefd76a65d8b7fc1b6eed42f52146ff5d0bdfef7ac50dbfec80d789b90dcd37a02d6ee38e92fad0464e039b10dee6437b4f08e6a6c5bf0190543052615dd85ca169d33258ba18a15e657908a0658d4177554e71656fcf719da98d4394c840ac0465bda3c1414260473fbdf812a3aacbfbde06db207ed09c35f221d2069cd88adc9f6ee07535deaecf093430a6f3495fbf803b425025d185d6cd6fd94c37ba3a4a39cb80ca949e2cfa40848994aa5ffd54608190487c2c4b6db47590a62e53753bcbaedb8faef1661afdc6a52aa452ad33c264951126fd7bca0e31cc7618dcbfc150b8c5b5c5a49ebb5666248c5cb04eb5629310af4ee37648a2f482bcb03465e0f4986ffb18d59099a67bef0b56b7cf01867b408225c05b96dfdd79064d3008cf9e2a72a7abbeb7dcc2cb2aac6aeecfef411e89f93e7289750d01b16e2662b1b623d5cbe3b2062e992bc4e4c63f186fc26e5ae84a85a977860e90e1f692f1f70b7db306a6a0ff24c3e2a7de191a7b1519e4ab3b85bd204da473707b5088510a62cd8f7415282f28e0e999cc7e54f81db2cff2b6f6f421d589ff71146a00888e7ea89b4212f94b0e432045ba37d42b43b8962855acb3a9dc2642f9a8b723ff5cfdc9cad5394d3a9e866c16c151ff44cc4b65ea0145901a726d09a91a7657ee4b0a808bc8fb13d661a01c6956d27f17f639f37e09fd40bce03e5b16361c634397be53c84cd09cee7bf84b1bf5d9c59e10623eb8be0766d1bb890e8f3c90f8ae24c400c68ac458942d0cd7937e4589561591a0458c5a1fa0c0336890e40c82925b9082fde2b8e18dd401ec2cf6c2d1d698fead0ebf078202ccc5ac73906d1004a050e306c98bf30a319c3265492186c0e962d63a161ac783a907b1514843a509b1fc10e07c90b28d39ade2d285aecbab20e20be0143bff24545235c95f9b7a2630f1d983fbc939aed3087a3e028f848cba33db8fe89c5ac95ba848dfda8dfb23b47fad0c1376f64af598f063bd18864a792f18526c4c621b134ac213bb3f194068e75a8ce06a9c68321882083b2097608f55c1a2b91cecffdfcd40ca5821dfc1a8e036c024bd8346b034c0720d16140e0823281a8956ee2830e57ebb643e627bd210b0d87c26427de6088ab546fdde63e0c8941aba42b221e512a70e48881edde10d911a314a2c0b550d1c1858c469d6f071129dd3bda2daedb08c71be5a2343e84a92c9a0842a5b2f367993027e4986bd36a618f7e7201df098075da930b9e8be8dd62edde9ed2e152e9858b4021a489a6ad4f407266d2dbfdd0c1482046fc7cec778b0699c548809474fc50ed0e9121e9047327999681a7f8b8b6214d4313893280e357f48d0bf737b822af53ae7b306ad781165ff492e05e6e618feff1512f729d88320d71dda71459a3079e9e2a7aa2746972b02d8cdf12a55836dc5e21c676ed62109ea186c3aff445daeed92ba82b1d1bfbd5b4c247b8025127de7cb353c1f32ecf516ad04c180196e4cc95d5fc62872c1f0720b92ea71a2aa747a10c0d4f382a4a49a5bb45180e50769c7065e5e0579389bbbee151deafcdf9df5aba160116ce7d8a6feba6460d9f881540061d9a48cfcc292c925fda83e66bd26c30ee7e3c3bad0652e5112bee1f90c30cd02efcd281b27dee8ec02a8f96b2bbb1fef04fa095505ab941c0dca43de5f19fbdfd00fabcad205788553da6ccc3ac3b54c51e48d16291eb13d8df4c6f342e74215bc4bb72533fe74d6a0161cf4fdba8848d04678b1e73255acfafcd11fd429dc1f83519cacc9a08ed74ad0d3f07d651edf734ee26c8bdfd7a6916ed86786a96b6cf1862a1a09384b09bd6100fe63ef753c03c9647ef343ab419ebb5eba8b7205490d56592a1cd6223797b077d054911c5a012b2e63a7efba4062b312eab80f2691e315ab3f8a105b4a615e9f7fd986b2a2ba1898f4de1e86723659c7149449148307a0d176481ed05b9225f6354ac396d6c61202225ae1e75e23e01f1c975b73639ff3015263abd7f75d36a81ac30089d1e087ebc1192e7de172284195efb77e4db98b28e2579620e2f8fc7d4fbaad99e8f11e1e8f02ea80b9c4749cd791423565fd591b4efa9a003849f0fc421fd59b05948c278038c6c219081063ef8ea94238e38e45a5ab3159c78abd6c7f48e433920e61375ae923bc972582e3cc11db35ba20c929cd015420c7d18b796d0bfe4dc6c229eb1a5ef1e73dfa70e6f3c0de3b59494e17850a0fcdc6cacdb509c55c55f27f19c738456531343faa12bb998b8d4a7bf8eb83f7fb1264432564321545640c40d10cad4f3110cbe766b21df45b5ba1168404dee386a2f6f0dfaea035cf02395d0723732b489a67444ba6af5a27c80b599d448c66930f9dcaf97ab3a2c1b1f2cb21930d76149553b73373c785082b1894930a70119924ca0458bd9ec09bdbf9fce04c43d5799fd8e9f08356090af6c873faf9f1cb1df326445542e31b0aac7025df49f67e89c986aa575359f6781caccddb6c06d85b83b99dd03e6b11bc799a5974c26fac7b54914b091cf0468487c785818075936004f46e202be1a1e206ed28c30f2c919797863a1986288b9d3448722dcd86288dccbd100feee167963a0d11db273ac7bea9523e851cc2d3c7c4c1b528c4e05979d210b9327aa5edb3c5c8b1c31108a6eeac0b1538c742c1f5fb081ef90a4783abf5171de6bd12c02b39a0a127e5f0bba4f7642957da02eacff0e130d9d4b7493fbf0aafc7cb2b10f4a3c7e7818b7784a504597560bd2332cbd2efd943a0681d63d42764c12c9492ff0589755da1672fb8550e51b5c037ce50fe55ad90d9f5ac713e88b9a01ecb5fbca5a587a9d291c5157ba34cddc5b9652c102347aaa09f65cca1c29a26effc17f771dada2c802975f967e895b5763292de30dbd4055b09bae36ec4566c007211a00c47f020e27e53924398acaa361beb18e9550805bb94f257c0c1a4761f776232856b27807d5fae6dc453d69c2cc99329e46ed9080a429b7c6c37882bf3dc02bf20f74e27a5150acd282936ec1f6394eb5552be442837587cde71781b398439895393a406e22cfe429a34e8a6ab3d5de75326bab2666acc072608894428042ecb4abb0a3bdce239529e0024b3d2f057216afc256bac9b72935d12cae9f6f633d28fc74b50a7c90598f9543f2938c8c355f4cc8bde888d359dbf1656dba999c5870493d730d71bc18d321e141b69c9a0dc13561577aa8e6317a934c1e60eeaa4ebc8550391c076d6296aa2145504ea2e2d5898149ef99da420a92dccb0f302810695e9e041dcb077deb8b0cc79fdd621cc48e0b798b85a32ed62e2bf031488221b3765c5449f9d183320f8e9ac7aa77949da7956fb2b44542b75785b94dc2d949e15037b605ac04bc0362ced58c965cda5e6b92bd36623fa009bb4c84f9d0f66c0665e189cb9774143aec6a9d048fb37e408d8d05c69aaabaa56ec5a2a2899f3aee7dc1df6cbf951890f549d82732930181c5353289f1071bf9b6a46a3533ee1e4552cd204e6b5c93d4f17ef6b758cc467f4e03ca05891a9f52a01c84e0bca10f928f4777300721da8653a6ed52429e12804a5d24245e54fd753ca36ae481342110ae4315113db1cd53e715fc00b684fbd4f55ca3d3cd4fb637a5fe8c15efa5cfc4858a06856be00b74326604dfefea9a45e84e4157a6b202200f5fa87fd664d6323601fdd96e9a8513458a4d5870b68030546a1d4bc9a4b7ecdf53def95dfd63b61c2e12cbc2e1854d02ca86c66696586e0e5579e404d6528b3e497e347b41963556aa26cca3cad9fcfbca2cdc8efb3309c648913462cf03430dfc217dc77e3afcc704d759fd7388cb1d9ebcae93f8bf3681f477c983443cc47acdfa3e802dc1f44607f9c244309325d30e14bec7e6be9526be02a990ea7632557b9ac29d3f30a734e17b0caa3011a555326bd5bf6945e74626a3c84c776ffd532eb9fb1f64f5cba14f1c8f4b10f273e1a711bb6374b2e68f430d731cbbc3e028cedea3c99d41bffdcb707ecee16e75ac3de86e3c324f384016badf871b033ad9fe91b8b1d045670556c4fec10a00a032c0041a621dacba32383c5a4f722a0dc5a66383250cb08531b3c68b2f7cf73c3c1054c759c8007b7e33a84029a5662fa6b86a299b3dd0c0fcdf27b3f59ac5546f20935690c0d1d9ac081a339f99d303bb5233575a02768f3e2ed8f686223df6c3fb26078412b719c8983c47888d8306fecc5a6e0d8a05d212fd164b76af18fae005032f4eb6fd5f3d4cfd701bb296242050e607d05e1947925bc750c2502d8029168b48100998a1ac1290784051aee98f99ff9aff4b3cfb5e5ec473157d7933bfa5ef49fe2fb4c08f5fa399cc38d68592b14ffbc0e6829f9aae22c71a269ee7baedd908960d9145096fd7f2605cf913f10abd08cc93321a8aec645f076045c4517c08cad0c8fda0d7bff423932d398151c13650a84b1366323e0d03af30049de57cc6ac3bbce3e7d148e49c8fbae89d53689289f422e17d0341796e564bb05c92fde30ab0db5e7c1f96db073b8da89c935d9119b726a1d9de9234beea20dcd114c93c8fdff205439b418c96c5233221c70196d8a99ae49625cf6ca662fc32065382d9892b608baab89f073b6a0f289fac2e05be4b0109ead6b971fac89fa0efae322120cdc32ada6b63ead528f948bb6f6fa7cd15e2462666e63c988635cbded8a7f5316e803bd06c0d88d1e3bd988e948a24898dbb27ece6ea542fed349a8e6b79b6079f8188fba31e88dbdf5777f93f5d4cadb16dd043f41668166901b3ea7422a8625408e940ab16e1ce4e4cdc91b9be549ba360cc491ff63b515c9422c20e69b8a2f3c3b8606293042cefc87b86084ff39924aa31c0348c9de92ab27ae4ca44db4b23ae3efba52dac62050b18cd2b6d4370da18db3990566693c85656661057c7614d7c299d9febef75700d31c0a2b978948628e526b2b847e66e00c72b3d3db5319ef56498ed918ae13bbbde99975e7c810bffae6a7580c5031cc0df7f84a1fb292c6cdc5f67a73a5ab87f18992c58e42b0b02326027b2df59811b50faf0a98ff5f7bd3b47041d71c88e19a1c52bfba7523ce0fb0cce8cd5379b0eefdd8df6e1c74162ffd2d44f293cf5e33605179f71223daed8460c4a287d5bd1ef4b1b05d61d9c555f8bba39a1cd3e5ed5456a9ce7053e3be9b3f4dfb5a22d85ee6002a9811d0d0321c544d547d1bd3120d0d15d4b5d39e097529a61466ad528ad8d2c5d1770bc859b0f3f585ace64b3ec67219d1f5659efac734ea8a5bd6742699bcc18923a7aa1b8945a2c43148a2fa4876710bdac19543aa2fad4602dc17b46e1e0daafd015441dbd56518ed7edb34b49751cf5628cbdbd6815dec98e20e80acfc177a7f424b6b672b88927508e7e40f41b9b315d86b599ea9040d1f37086f5516de176fca14324f3401ce1d373a210874e520a2c543c1d28fde692f1b4b19eae8e40e6e876f89957e7fcac7a41cfc9edd935f8c42b49ce2732cd1554e89866d21ea8c8d5a17b0da8389b32a32214fa9ea9c0897e2752eed8d763bf2d5476227208986f4e545d04e653db6010326ee07231822586c29aff77be512ba2858c41d606cdb0f9b947e9239b827cd0b7d6e78b995af90aa1cc365f2def51344a6cf330130c6a9fc5caf58829e3cb58514c081cd09aadc88f6834aaa2cd3ef437b887c8a41bd3ffff84880e2b9a27b24284ab3df1602e9f5c4550fad6dd57f5d4c8ccdd375ac42e15c18d44b9147e61542a7fd69797fd0d01eb951fae66e2c228cb1c2f9cbad25455877aa157baad814550f2fcb01f057925e414aae7875596e7f51d80523416944162095656eefd55c2546b5b0d6baa33fa85676aef18076094105d90908539c099b75de0a7b61a5b580b59d89979a47bbba23f6638f9a34a7874fa7f70bcc29d581a551b3adf149b67ec48de6b7414b754065c2a0d23e998bb49bc7d7bec6ba851d46f212ab83df4117b711e76d2c7e93554d48beadbd1cc789b77aa89f43380890a1f79f6954aef8aa31f93534579d95fc508915ed5057351cf4ca96f359345a3191b2592f9a4964f221c6421acef71a3c85f45cf9d1b76c6f48af25ecc223114514c64fe90cfb90d1b4da1a169b89ae610776366764289ddaa93f7ae54da39e9040c60933923217312cca2ffe48d0649881eeb154d4af3e4af260ec7797532d2ea084a0528cdf0469ddfa6d11c8eaa1155b63b3d31a53dc99a1064eb199ae3e7ed9ae5b0c3050c9a24c33bd2cae68e324d62defe6d4775d27a0a379ba36c98d46d4c285ca8b15f24a93deb1ba1f268260d16d88c0741e83858dadf20a17b9b10d7f6f0992ee045e82c2e7fd9e1cc33a7f4b498e5fa313762862fae2b0ac433c219f38c362526011b6c74e6b3ddbebaf62f5633d4700be4f8752499161e2203a383d753958a9abce7dcc20bc53fd64b2894d7fb85769a5594a8f166f2762f2e193cc125df4d539e419ed9231fe9b53f90f049195f72c7cf0524f3bdb8293d3f2693cc8e9dc467c5e237b00e9f6eeecdaafeca8042bbfb96cd7e61ae2179f28040996adfd890b0d708d33099ffda6282d3e5cb45754c91b217f994657ea30ef5e61e533f4471e5fcf6daf35bc42c5b43e28a465cab57ac58a20564b66b44009515a9f950ea06197deb0c8931ca05855d9ad5692008db260b0df7d6d9c063cda08342c3b7fb256714e4ac31053861e585f6942ea62579e725e901fcd939adce56d74e7b3fe73404001a2f7468d1fac0b3fe67c97d37e5e1b60d419d68cf3622c055393ef68e63270fdb7641727c8d0625a37aa036b3818b86a9fd7e3a53301c792c6c019ff50ec3f6a37df6ab2ecd5ae176c718726ab70b3b26d8ca65533a23540fbc005060f5e9aa9557ca4d5cb7573642ac237532f5542654a31660a8b864aec3f549b93f03be1cc53659ab648f11b2d7ac5c39d3500f201e90bb5c62649d162c926bf72dc768ea3d455225f0c06a86fcdb0ecadc94a801b35c6bbc2b72f73bc6fdbfdb08502f4349aabcdfb23c3f2196f70f8819c35c7d380b51f4eb185280b9e5bb5875a7ffda9c5827eb845644ec511a976d93d614e9bb093e71aab34bce96426692333be0cfbc411ad714c831ef062f56e3ea648f5114a54d0e2803a5da9e2ea7aec024d1b607dc4ed92bae8db6ef5386962b00d602a9e6b5ed9275818c708bb96cadd003f0d827b6d62a5456ad0dd0c7755846d21f5b6b488db3da86dbb2563fcce10640bdc2ed70d3c27cc979b845ed8fe6bf95319d5c459b3184726b1ff91262106cf58e0de017bb9df24fd78a6b2d9c2454a65d23daeaf4e0330c341958a6e2f659a8e290e7676ee22b87776df2d2c537678816139b2f06a68d6743ba2de259b65bdd7605354b9be46f1125a5fca109daae3b4517c4844d944adcde23f3c931a2b162afe6e0cc78dea1a22061fd5755990ebb215615db55b40a613d5361676b1509cf75f6d905a66f170ca55fc93cb07563dc3564e712b1c1f8903a71fd1d3f5dcbe394d38d564ad01d0d110b43c19ee02e89368948ac6699dd8588bc79a5acef2b7cfba0d97b23760c1ac503eb5b0c218b3b96aa58aa96f1b20031d8a21eb5fd3724677405ac320a6118d85699fbbe799561ad479c94846b5df98a4dc16bf419d72c19f0265f6b8cb6bac31d6b08d4d50bbfad2cb653e8c38047049815850bd4423cc26867cdec1833498fd1b91c55453c728d060fe99b88d014d3a0ee6e55689141d48b44744d565c956d82138cd255888d6f148645acc5923b78ed73c92633d64be82b5445dbe4a69908ad12ecc821d47e83b93dbc5edeeaeb71ee3b5bb2f13477f809ed7414e879e874e8fa677c11c20f03fae7e6e88101c1220397e9e7f0cff5dca7b831ee5e87a46589c74952df2d0fc0133a2323a34d98b48fd751836f58d928538885c00c8c2d0c97bc4ae71b585d6678ca6026b00ae39bedababab8516f8d1502d543800886f7e9cf27bbee8c7dce6702fd48f435057b4deb2b23a45906edb0803f01238f9eeb2082924f4aca104a1506c6e0b481501a17e9e0e31e8aa2689fcdb077ec01dae9a9987e9037917a0f05b9b9a09a818826cb0e67476e8591a42733690b83f3c3164e2b1c1b3e866682b952967a99b8c4801f60bce2d072030bd13e41608f9e5158f6046556bd82eefeaeb5c28e1ee085f8d51d98b504b29ca924260f2c58d1c8a9411e463b102f0b841e4ccbc1e4a6d1740cecc35ccd69af7736f0c037f91d426282b29fcf1446aa14df181148a8ad7ab19b97f54b386135d01a682a63edf22940a5b6ab52965d1523fbe098f5fd87ab1136cb85b41da99072100776a0f2f64bab65ef3881e0c428d075a5ae83e0d2866808fbbdcc836f9867897083e524a0401755a3f80d8c495a8824c7502746742fa07228c69a7d87c0647e146e3187143bff91e381d1ad4ccde481a5f0773e3f253b2ad5e6b5647d881e543398a100e792c39c2a27d1d629645d024a04db4019999741ab2b3605acf86f7d424276294e32d21dc1270fe236e2ce8d78ad568d1bc9fd912621455c837840adcc02c27c76db7026095f02fe125229281ac6d838391a03c2d4ac922efd029c65d6dd5e2b180c9333fad002d35448c54e6ec41adaff4b4988644d015524f8de6c520f0144df558b594895f3ae80e3e9233feccb4f7ba8e1b78a22144101d6637b7da63430ddaf23167611c23d52538cecc15a9667963fe09ba48ba7cf5500f7a4e65658a793b61a7aa3253d7528413298f0a5c00682273b91309e5fe0ac17b5891bae52688559f3b9e18789901b919e5a6160338fbb60366618f8bba04050f0b9615b6f8eaa93babf82a859d3b879bf9a5ef37e83514647938642725f1cdc3b936ca31499038018d0c31540fe6e75caf7968fa3109180072a90c1c812d6b8221c4552d2449aa2d404c163d1be73dafa029dd3e20b353fe2709026b809395ac830e9c79d2d0783480c1d9eae65a207338d53423d6f78a73b236e9b4c761f7d6a248ab817f1852f74c359d6b486a8c50f0939c00a86290deb5036034d40b70e451f7b2e3d8fac99a293c11fe19bba9349fdbc109be35182ae740d31766998a424c9f8900d0c66175b634e0d8b7d676c77db6cdc2bf1069150d56591d84fc5fc2c1215a504c55a953d492ab7805203c373c9dad242f3cbffc8bea07d9db268d050eae547db6792b104c6b34b97b5f2d4a9fdf1aee5b017f7d13a210370e30566a59e260a849611e7427e4ac0795151b0080f626834fc58b4be0ae57582e493170b4bc90b38e0c8562f38a997188fd00c08d0c69f3cf72d87abb67837893e4bd0adafa6441e7564195c018700d96b2e71d01bd02580f7b9c8cad53a2a089d88aeb53814e5b99682b6a13827245454e468592aeca9a7d5b30f462a53229f9aff6147297b507726390e82fe65c30cd15a9a55722fa7319925afe902befbe7663486880b4ac9d6d5ba538ec057f9377e1fd5484a5a86c8f2ac3995d084d2dcec61bbaa7c6e7e6adb81ce383bb5e62936024103c9d7065a4cd71d8da790f5fbfc0609e67b01ade1ee06994fe703250dab662703797a87067461d0533a945dc82fa74c20e711a96a9028bbe18adc5966d9b65b35a6f06228b1645b4966bc092b22693a8b65a86c88120467d5de4ba97b69ec033623e7f514d434c12fc73a532c99a9958d8cda4027cb5d62f3cdd3e2c5c0438921065662abe28baca72f1053185c27f8f9e3c02327e67a06399732114ff0597d163a293919038205aa573ffc0a88807a0df93a26b241d430b79288536d88ccf349bc42d702d49329140dc82b84e1cc13e0239580c1837dee199826e11b45aec91f6135df9e7634c3ca406a0c895bbe8788c6c7a3d9b9de1413746d81d04a27ef665a3dd4a03066e2f3dd0c912452ed318ad84a183a7f3f0c49d56b846698ded957b5019fe68ed9d2cce1b1414abf42208b9c0fce077faf4526b030cb226a94114d3385003fa1db483a67da7d23c601a679507e832e41f9fcebe5d556073d69a823d7e07b9285f2c3cd3d3cdd50062c75a5cfecf531603c330ac356bb1c36f2ddb15ae2da0e4cde2007771f739742a5524c28e904507aa38cb90daa9a7dd083b4d0a1613f72109c6aa1a3575b4bbe9a03495d10e741035e5c20628931e4ddde727d830b763039f29b9bd575518880571b515e449739f9551fbf46c265b74548cb0e10865255a155dcd798af7abcbe399564a1912e8b59b8fc18497301901ba9ec82c4c7f2d4314329c0b2bb2e2acbfa9c1d61088d0aaa93e60636c96284da77557dc3ba2dedce33885a504add674be485a71a4bda1ed759db28432690595e20139ccc0886e50ea0343ad47ee7e953fc399eeee768d9e967c978d411d75a568676bc4699353c3aed4147f96f5e39532b0bc34111af41883c30a495a9fa7b1d4c476e2f6550981833df5e49551feca24ffe6479e8b9a1831c0c0137ae8ad1a73c27185afa6b33373423957c21f92d1997bc220ec76a4000c6a8f38a1eb8543b0eb0d046a90f526700869d96730d8996f8d3da4145b514aa8fc5f2c841bdb711ad1b64866e0bb296f93ae1ea0a54d58e84748570c01f384e1c5284f5f907f8b6adc05eaf1ee5861ec118f82df2b7f6784770fe5a947641b865d4c8fa0e43d1c2308a890c42f132052bdf930e80a3f61983c32acc320dba980a727bb3b9fcbc9df18a2696646be688af450b03417a09e8bd07017f18040296053cb9882c125eba2ab875dc93526ed11f3846187e18990eab2d5bbd028f25355a161eb13869d4cd5d70c97a8ce95711bab78e0eb34333b0f29782a9ec828fe8d0659d5e7e86603b80760ffe6335a01136f456586626c3dd1003dba24b0bcb3afd7cf08950972ff005b02456078fadaf4f684616dce2d497172138d105e345f8d9ad6ce481ce1a3fff7bff187c4e52e4040070e9104407f4c8d2678c2909e728f4d54773ee825f07f16313ab2c910d91306cfa3b860c7f508a137af477a67186c5183fe7ba386899d0d83e38aea8ade393b452f627a2897d3a831f0b855aadfc6b9a1d4058ef1d14ce5867a796cf3d4d6a5a9a02c78b1f1cf19e8e06ea9ef5ed2131849d21c2a949abee623b989860aa708b9cfbf0b3e0c19edb14a2eb93ea1609107ce1e2b4c6cb903b7e6a36a0bc2ed7f3780126d9887230b8836a8a167cd55c339362322f5a15e0bd4277e04334c6b7b30f4eb02629b041a9c3456c083ac0b4eae74459648e49883180bdbaf30f7d7e49a4f743c4d0303c14ee34de90c021889007d5aba2cbd1166edd33ec646f628121b2e440562396f057149846fb6611d10fc5f207a2b2025bdc0541ad5027efa241c185662a31627dff1c20d405faec4b9d5f88a3fddc3e5a103b650899e547dd5167660b040da114bea78aa867697f4832b87921683b6978193ad6fc4cd223b098570c0f1bd4827b1da05a6155bc988802c26772a79ce9831474ff2d5a2a46a6088f1d365b7b78f162bb37303470c47c99fe95580627e641c9b01c855e44172aea35b828c073dd7b4c3f18ba5e4e731393a053cd2cd231aa3b7cfe82e78122eea1abb9e3238a9975df3c3483ca28b4ae27cf284aa54d6df2c3d6267fbd8dc82bf2b71abe6a932b58839352bcdd8333556ad8cfbd6a4a0e532d7673f0b3d0eac0e758e2a5201f159422f4ab706df8901504a1d298788a2bafc80794577565fe17e7f182daed1b3075776ee3ba6c8a4768f76d4ab38124ec710b4600b6ccda3964c78628a28ce1885b6ceab8bfb1174fa4099bda9725d3eca27fc170373cf58b2f6fe4076976d3f710617a8e521459f7cb920681487f6a2e34f3a6bdddb069e459986a70516d8da28191a85af6bc6c293174986c80c2d1fdbaaf42034664ee9f2286754b187d8535e488c57bbdea2395351396fcbb791f30c7aee041cd490f63e8824ef81f711e2076499ee7f6342ecd779ebb40fffbffab39af0c02de6c9e6c758003723e4815128a7ba696ff9307ba345e5fdbb9acbae99f179521d7a328987971b81b3038093ef1eba7fdbf050e4f01ebe4fcf83fe465fdfa065b821b0ca34d3d7fa640089c4cc707a7492af1be8d57c756d79e5e2859dc00ead3c7c68f4a0932b4f3bab67ebe5db6b48ab3fd2e8a2372e9ea21ba5487c30c468cf767430c8c041b81a3837284d5de08568a7cd8b7089bec24ed9b256b5a1609d9335ac66aacf5a3a8c16d38c0d3e4252960b6067083cc30505c2222b3fd84903945eacc73febd8d15010416dfd5d65e6956d3eb6d737e667d915595b2e4846598b7c69ed2db6d5990a1578dcf067d16f24151a70d4828380fae00a0ce8b128e0e9804ea030ef6feb263fc51ac4e64c89001db242638be85e124ef214955719c0d74264a1a6737478d0291c235ac015a488d62007d3f58b977ae79ac4f8c88a1065e0498b86b88a0bd7e5cb35082df69bb88acf22bddb693223abbb4537cb0e241fdb79e6712b2803d170704fe371e45957af9c9b64845bb8479cbf6472fa5683329ece421298d96c9869ff886b737a3aeaa884b04f8d47549e0c87def0f988d5d818bbb837c0414fe86488ef0076ff137cba4898fc058f86c01ce7ea026420e3e49a1d1601d5ff76cf95b1111661d2b187894ca6a70df0325d31b38c41ea0f99b89945d546de7d251c702c9a7ae8bbbf8ebcc0b1b086c638517705e8e6b773938b6d6612b67cfa9d3f9ab304e82ec746f279076ae0acedd2ab5f9c8181e2e2c07b5b95265baf6d9bf8fe84c0cc055169bc157b788078cc6c7677ea9a05a43746496a9d5a0f5cde9ccf976decdcfe927560e7663e5c4c6f508e5592928aaa64bb4432079f8509e5bb0ecf3e61828233ba07780f089e3dd27d3794102c10485bdbd568321b0883cfc2961a32e352280645e0502d8dc30850614f838c9015f533c843240058b4c0c8c32cda9a7539098af163a04f14a71554cdd97a103d0f0e500e9c76d9645425c03b5d400948862de10115b52873e94237893ef5ac3d4de7732fa5a4ed6a6f2202659561dfa1b4c6126ecb913f1d4d7d0c5254db2956c4332e14cdc01b63fccbd5f1948755d5d22923c458ba06495a07b544f179d482062fb1e6a58a8747b42bf159ee91ac1725f980594befbda37bad625edc9148258e9311fc28ac82b6eedb83e72fff413ce837fda8dc78320c73724de11ac2d66346bef890024e2330d766fe497c80c625276a75b548b4fb1376e3325ba240eeddd24cbdebcce73c6f89c2a75dbf4e3f442043c39cb7f3f8e2905911fabaf7fa04eb1b7fef097335ca81ec3ed983053c46fd200e4d180ebb04ecfb3d741cc0918bf22d485b47aab1832161e4b378ccc71c88657524e24663345d1ee5cc592f3a665688c6145404d560241600d628393327f8dc9817e604fcc328821da30f094d181e5d97059003d50b7e112bf553d7ed28c7442445f9d60b49b5deabf1dc598c59f7cc485d9b2ea9cd32c0f2a535ce99454777f6aee323e1c849dcd48e6fa6529e76453fbc115054ce6e597306dea82cfff7c1dbb972ffe303f82ca171705076267f41f0351be7c417a9ff6af611ea4d329dd75c53a19b6df8e66f0087dd04f579aa9b0382221fcee1ca0b2ff939673c4d656264f3acb183c0629fe5e71709fef77a69dfdcccaf23938aeedd25bf761263c28d166567b210ea20aaba6dd9fb31ac0d611342139c13cdc8c5ab12c27af329d8b05547ca19ff027e85f45a37fc05e2d6f3e1adb948d4f02f9007918998c71691805a29f11261fe5b6464e8eade88fbbb381d7b020efb7356bf20ce19aeba383233375ddd0390264a345cb0f19449dc5355c401fe7fd9e7dd613e382b3a9177b913b13a3dffd813661b60d9e38f116111ca4ce3638cb1ba66740e87abb11e4cba8b3e5a700ef34fdc6ea709223bd257e39b37a2517b70b9f7c1fab46c465c9c0cfe58a422505de8a8ae32247d206762f89e6b42c226c82831e6653bed378a95af5dd216648bfab5f772f38c72c9423334e2b1d32b7ba6510a391a0182c9d77cdcef078180fc0256aff8c12a93d2eda315f45e97d12aa55774bc45888cf9f7fe62e2d191628d20dae6154d725a84e663968687883023c40f1a2fab0798ac29822900e062aad97e549c9e25b0e0c28a6aa5e1ab3a600335fa4dc3c7b34d40a51dac245823e0b1422d5b4d1cc31d4400edc050693736c92420afc90c32dbccfe0140f11ac0c31b82e3b84ed0afe1049a84ee35d3dce9ee68f822b7ce84679e0c06ed1a080447e8a7fd8e2506d33727d84793430f251380cb9b838786e48051a236e3189730095a475eb78347727e76fa979ffdc68926d4475f7757e89a39bd6577cd162637ca1dedff62e23472386812f2077b1048c98cc8c56852354ff23cbab4af8993ea076f46fa2ec2e9de3cc10ca37b23f488a6b5c4d51e0906903a11c06fb7e124e4d60b96adc3fbda97acf2e9b38a8eb3d4a1654280e6bf9b1016ecde3777c65a85186365081402f6ec4086567af78fa718f24ca07c95dc8d64c62c4b2f6b4c70f4571b39351e65aabe8e6f19fc3352ad698c28443f88a2e9f43cc8c65511639e259bca51dac84bc57b149d369cc17cb29ea02c8693ef82044d1d71da6b95ccd4773c65d663cb229746cd13864f9df3fad209cb45d4426f7a0cc8543eb0e64337c973340370195c92208033ea93d3d96b426ef3e470e088f058de84ec9a39dd9cdafde20b4e28c6c2132f972281cb5511a6903703a4a6d48d95887c70dc4ac0c5f720c7ff3ab82c0e266687e0b7fc2d022e4a83dff6ae46a3c6bb5ee343f59034db47c7044685124f08b388f6963810a8ec1562ed9d3bbc5a97dba8389075c18580c82717f76e382d73249a229765ee2a5b73b286cfdb039bb4a33a00dc183aca159420e63a4100a8ce755a3063b51a1d2b8da7365abc46c85fe89624494545527a5742596fdee3fdd322f9a0a720dd0a0f9433925d1ef63e16190740efad81c7a7d99acf8ba021ba8d821d23d75a1b274fa71d36eea65a8e8aa982a1ef1894e9a2c008c33533455231e6985069c0166f3836954af6479e65d9a99aa25f3d55562e6100c067c09cb473aa4da6f1d31d421a94eb481a89f6ee025816cf43b19694a25551ee6a8364f25e1a39b621f2bcb8296743a2722d244382d99f7bfe2ee84a59571480181aa429489f42b15e0d3a5024ff622dcf2294efa574d6c74bf7820599ffaae110f311e021fc43ded5011cc508ac9e9fb1c755b70d7ec12aa74bf26f123c33f209ec9ccc628953aa463f1a6ce919fdd5cbb97eb1e64c81a74333114bc6fd0834b1ca0488441c6b514bf73fe95e50bb1c16b7f5c894b608b39bc1512412598a6b35d6b99b666efbe9e8c191a73d0c1804d79e607e9a6e762c1b96a8a86a2b4d15762ac5694288f37721811c262b284aea600f8258e6fec5831b2b6d8f41f6c0270e5507350d8734da4e7affcc43497e377a3488f9d44aff4ffff0f0a785e61bdc81c99b77a911140da47c598d0e7f519d56b8e583644c877c47ce45bab801d015b6f0030f257415ad0bbe037a16d3d14fb9f0f0cf9ec5117618066d9f74af6b8d4cbc188a79cb7cf9d4e7d97007978bd7244079b45d11bdfd4a1af3ea2bf919f86705ac97a65ab60a0254e0b226fba4e2b38f6eb98bd48e7befb3bceeb18d804f9567e13d7f897dc884e2aa49f467107716cb4ba2c509ce1ee596e6773bc74b2392801e68f56c6e00637ecea1bd100e7cd62a807fa5315b2be94109c6cfb3bbe194cb5acc9d88e8d26882e194feb67aad45b21859e8b6d77b4a5c73ee01073196d7effbdc643cae5f5f66fa97dd6f330bc42b88f0ce29dde77b4d2a855138665191caa5ef12625311283bf18afc908f54d9db73b35aac59d8e309f5595bfc761662530e7a7c90003cae91f2d8c28a45b10dc9d7513b652746abf3201e35c1b8377afc2fd0b8129770e2affe5721702cd2cbc60ee0f641c0807495195d52db948b94abac1b14b2cfb391bee1491d4ee77835299f482fcc6b8a20bfa48d4be4944b89df54efbb8c0dedacc0fbbe08f94fc3d3bbae8d2c33128f07c18b56deb804baad7d1b42628d5ace36f366efc5304bc7888b04a5dea8fd1fc7026aad6b0da5575bbfa9fca56b6426b3ff110f85b5af4243ab786cd9c3bd1027d0ca8ae2029c1eb31a3f2294b5eaf472830d6ef9cfd5f546cfd0e1984276b44e949cb9b8d0727212261c8d2130ceb253adb460b8244a7cadd49908f68b905a553d3eab4e497d0fc806661f29cf3ced368b17d618b436549c9b64de1cfed952bad2e450b47b50704bfaea092618f8854716035b78251853c9463ef1b19a6e5b86082486b2965b70531a6e10212aa8c8126d09888f82e1e244b843049aeb60b85bac72e8e971b55eadb1a4843423c0c9e98eb20a0620153db6ae0a8444c1d0679f01eb77ce44afe49761f9160eced1bc0c6a06cd689f98cef9b074ebe79306291e45a0319869d3f311b962bd42a102bb9f5729b99034a3d7b63da37573c467a2b780d3efa000777f0d9696d06db7d90f0ea485702537264eba29a0a29f360b9d83bfab5aa98fa942673c08552a9509cdff6d7cdc8b55053b7b398dc3b853b3e616499472d8f16e5b17b0e9ff964f2055186f3410dbb9918b386ea4e0b835d7187d5498138d7af8d9e09fd91bde0b4cead67833a6a4c79ee2edfde4f400d49ef8c558d3626b6f271b7d8629db5821b9728f3e0a7b367247745264170fb4df7d77ec71f69ca5f2454d76d44ec618da621b5e00fa433d761797d5f362c4833c8f4b0113617af10baf679a4b6e4148f39de3e1bcb2b6fa14b1a7b571c6a308e4539867d0031aab7b10834e92c29db9a19afa96d399efce46446267b523348a10fd9a4b6cef27e55897ac28226249495a0d387763dd5ed1bc47ef947a7c534c44efc6fafd1b13d0591d5ad545cd1ccbc64a7425fbbdd43a07965de1fd3487ed9838b211db0e7c66739a265a6a3cb0781dbce7eb5c9bd5360ef2166fa8dfa7acb516e5ef9c240c6d788414fd1a4011fecf3895dc235d4fffa5dadbac935f38d1c3c6be57a8e347b81383e7500e9a40a8282ac8debaf1145c60a5d775d592378d9d3099f7dd50374845035431ad182c96a2645f762104b94a0ad66422f4590fd00f6ce6bfabf7bfd2cb3426a2ef5b09b2f56a185f3a24ff52aa73bb2f165e62f3d374d76cff8c6a104319ad98e6b4d962fb3441af845a2bf56415bd6287dcc7a40da067addbcfd8aae9b291a025dceaab0120aae956e678b1d45ad504c873c7c9cb549e98b8312daf7813a0466fa444c998367fbcaf127c165969ca2ebde75a1c18acc55756fcce6a991d75aad6d435d68ccdffa2962e0e340e3a988ae6b9b1e00e133444689f8bc596df0cbd00dba2ca21d5a34247272674c6ed14cde5f6039e8703c44e02cce4029ae079655b200e4a9b0eb9cf8c3dc7b9da5b7fbbbfaaa42d833d308dbdbe7a53fd6564a5fd2541638bbd7f9926a53bb9c3ea53688ce0c00985dc32bb019070bba25ba5a28f71e8b45e61ac7fa934c975ae6d7512b1828dec6e5bee2da54c32057106fd054606fe95d65cb5ef9b6e71a0eeee07f99193d381e66fc925ee7ac3190e0c4c24e018e107b0d6efae92bb3b28f7c7285201fbbbcf19cad0d4c7fbe56afd2f2dc50bb6ebfbbee7d7594f59f75e9a2de9860ba444f0f8de7b70ec5b37f6cd3532dd9ad5374cc63597bcfbfb945d55d9f53d955d2ed774f9dfafa31589b1b9be73bd5cb2b2e639e79c73ced9b9e6ec29f26c2bf274e168a12902085c30f9e1c8dd6340858bc260f0c32f1b0b7ff97a2cbbb917267bc9beef461dd635313002388238c6e04e6693d1641c81af573645e51cdd2ff5d4946bec16fabe47afa77277bf71d07bcb9bc9fe6465f7fed4468ba2b198686de7061488299363728405b7f924ccc7310296cb4314bafb024e4e521e3ed2b09df7e3ddfbcd3e175841eae0ec9e39c4c3ddc9bb3adff7aae19feb65a3845c92c00b7d9cddf0355faf1718f64d08765929be603ffbd9cc561c1c1c1c1ceab341980f08af9bf7351bf1642528e1e60afdd5b9d0c7f227b7386f6e6edac27a0e81afd0c7201a356e066137b6a398edc8f2c04a268c63e2cf8fce4fa5be3377da83951dc0b19fd8abc60d8ee1bc68b4f883f3aa71837172725e35ba8c439453da4a22eae26c0b2b75e46ea1d0c79dd0471edb8d4d4ab23745652f818727f49188468b570d9a5b843e621ae22bf45187868b17d89383d313ebe9c1373db09e574fd8d3d3d303f6f4b8be9e9eebf574b6d21eefe9993d5d0058f981dc5332507659198227270f12b824cab3887eae4479fac8fd160abbcca7f3cc4db929936132058acc1616489c24e04498227cf070420a5162602cf572961fe00226f2a21adaa613d9e6519e7e8d28f3644c9b16500dd1c1881d31ac89e18a2aae081ffb8bfeed7f69ddf4bf71776b95f1c18b1044d2c010058d225128f8e202102c70de7847712447ea5ce6df25f3e70f94e64481f12bdbc682e42a8c15235657e45040628a135868f081091d6ef3fb89af561de8cb74fc6259560842cc0e319c8047111db05093c50a5caae05e095bdf3a695483c822156aedce616553a6323c5f445379982f3e086c5175d2663ada8ce77708563f4c7da1e1071b2a3194d21ebc661d0e5032248d145a46d050850f24fe2f728c3c87ba0a11515772566aa29c2064c5092e306165081e907477f4bba11c6a699698e2a4090e65a29ac082c31220781069e27403f93327bf0edf1d2d3888fc5959d62fed979ef7c94a32f7bd4f813a7bb58ad95a0bba7b8e10d06c6404aeff72bf40a84e4e98d69a8a0b4dac4c2dd1a54b9415dc22cdfc9e3c50a74e9d3a1b16c2ec20d282214e7298a2872f567e808902b70310b78964052682401962859927b739c449182f2ad890660926ead47392c8507039cb7336cb93a475a43e9dad072a952d91b9b1d897fa288786da280317d2a4a00927c45c79bacdef0dccd1858becb1ecee63a6e398fb4543043e8298a20725d84851856ba2aa8a0d1b2136b0e02b884d6609ca1249ea74d1ccc9b06b62d13b2992e49c73cb0d97c8aeba21026da8c97c717ef79080298c85952c26ca649105f617fdefad5dd6a2f925755ae47dd88df5ce393b77f6e997c1d9b36785598ad534a2dcc9bcebbaaeeb1ec97dec4009d9b7ec1c69b6041c315f8c9a7f6db4cfde354c819a466db6f9e2fc3683a383cc47a9be01325046f2271d82c04db9001715644d961acc1c9932c40e42cc24aad32027694ecea01994272da80cb244b3ca3c50f3122d5f9df9e2fc9e7f5fc0421bf32416331014d484429a1764b5312305c39923d2d0e0430828a2aa40e236bfe75f0eb8ffe7e93ea584fb913c283bc1ad83664fa3e607982c884803260c062ec8c10aaa2156e872e536e71c0323ea89d49535546ac805b18102e409062f4064716bc0541649cc3c89414d1437d88e2929c6a810c30a9c747ca08b951504e962428f2eb71945952844521044cd0e205594ce5c8be5e77e4160ce8966c602196eb8d204ea480bb41cf3c939cba6208e48f3050bcb9827511cc921cd94336a7c6491029322b21cc14289299478e23681b43143c39421698c2409627546851d5220620311574431d1a5c813463855a1a65fec998ffbf88c7979da7cdbfc9f4fb280dbccf91d42372db98226890a5448228bd5029cb0da218b871f514cdc9a98bc10150448d5d3114d6e1db821ca962e5340785441cb31258a2a872f48607062c5ad993c21062a081fcaf478baf56311803e3efb29d98ffbc510803d8b61c19fe78bf37b021ddcd0c2d6ad93b8f5777388c290fbca0a219966eff04473a526eb8644d9bb29a35b666405bb09347f9bfffb93fef38617980c3ef66fb632246fe20558eb0fd669b18b68cd7e57493ada9c24a2599aedc93e6aa17e2cf65f29187a76671fb0d3aeb97f8a4ed28cd4fab41229f1a21e93c764d0434aa912cd6b7d445557cd2b2a685c57559ca864bd28edf9b785fcee3be09229eba85ea3c7e4f913841ea8ec83f04ff2a7d93c2b60bb5c4e84dee7b8dfde83397478bedf5f025cd796b3c7b276d005bfe845d37faeacb3f7f264d736b590e54811520879c24b104d2a4cf9f821668720d0f4a04ab488404205aecd0d16d081861e392c25550491a2b35a7ae9bd94de4bebfd39e9bd18bbacbcb5de19ddb950d2f7afdf8d0224fa7d9bedfed604ddb7f1e2d1f6a42f01bdefd934835bcbc8bda0e7cd39e79cd3279113dcde778d247ec1554b9debf7e69c73fe939d6f75583cc1aa7a138011f85cb2be6d3aeab67ed77548de759d576bf5ba204f3623ddeb3aafab601d73d8afee7963094ee52e979aa2b2fd6e7a3fede7c9cace7602bcffee37d6b8b2f255b1d8b7ab028a53b6df574fb66c4566676738399396e0b2ab582b33f27db2a6ed6365d82e89b96de9fd1d69b9731793b6eeca12f2ed7a2c979c249ac2f7bb9f39bab79fa3fbdabd95f5f4b1e14972bf27c99da42884296c2b928be47ecd8852c40994684952c6872a586e938b159926647ec8fd98729bff64fd78d4df32d35a4b5d3782d96673d25decfe195e44899c60da435d006d83d42f8a18df4b92e5d372a97399046d725902a74cbf8e606e5ac33496c6059228496a48c18e158cdce8e1e425cb13d5197fd29b10abb03948ecf47b7d8ef9a18c0e3280396a49f300d3af947689a4f0ccee32bf340aca841659cde49cc8fe33ea8d219ea1eb3d1aadf5cdd3d165af3e7d9056e1996bb5de2c757473566b04fc4b6ba04cc7815c67b6bfcdfffd496f29cfbb13d03c8f091c663087fdce73bc66a6e398c3fbce9e87fd2a67f6bc3147f733e7f6db57cc27e763919e99df1fcc70b2ff735214784692d75acab6ac9cfd3f5ef46345bca4dfd65da55569cfad33a9ca906678dffb57e7cffc117fa68c3b87a44a7f3bc232f853c6d8432de45f65a58ba4655bc1d1353665809575d28cdcc97076d83611304147c0048d8bac604a69adf6abace9d69f7d3e92bbdf6c312cfceedfd7a91548d9dbaac164a51b4849e0b49f14425549e7f79c4d2d520be506f20793dd59d086e66ff37f7f925ee1455933b4b08ffdced7c7feccb6f10bc4ebf36556f86b3773955d1fb03ff6effae977a50e2223f0ccfddddb31477b9ebffd1afed652235746334d21042be8c2021ea8b88a42e27f50c109497a3ced40c16dfe93322dd88ed8fdf6143d81cbffda2c60c7b9c2af8f3a85954d09a8b903b34d2c86ce345a538097145660b20295266a3e60450e44e484e8018a2c7fd9285f1f7e69e415ca4ab82db5150a6c9cf2956d207b5f65fe55e6fafae3f7e04705cfec723d92cf1cb7fa2ce07e7f8dfeabe3fe575dae799dbcdffdd68ab125fc6dfeef4ffa831e43c1dd03545243e0d6444106eae66b5e807ac189902a4ae46efe4fd6eb04ec992df2b1fed73ecdf6a44eac47c340430e495811850814b77e1badc1586853c50a23655e80c3adfffb4933b72f068d8ec0fd25ee47f2fe7e39c0bd47c580d50f597610c1034d9bdb5cc20aca96171aae70024402606e38e1052c58f9f1c32daa8b0942bc400bcd93db7caa05ec1905f71625a2b27dd915f6f18ec1e5f7d7d25d76e9e7a0fe751cc01518893ab5e1a3f724e49b73fff474d05c5bd6e9203a826d8dd7b9e9e0fce0d921b5e48c126b582883441729657c68a38411616ef39f74298e7f6a95393899da2a974de49c7376159e38fba3c1dfd4420a9afce0c48992333268f0840854135746a65ab835f938d282144364c87191d267a2346981052a98c169f14a66abd2b2e856f6dac866ef47d0358fa98dc62a2913b2f74f39477f793bab656567e556fa3bb7984868ba5581bc08693f081b9d07a923d6dc5e1eda9bc73fe70b1c0f1b3d2b8817a7db6ba445dd7cea4f1c218e11946ee0f01fc15fe9860b65ff1b6de46b9c032bf02bd694c64468b26bafb585306883cbae62a240feaff1de1b001370d9550c98efc946c0801205f2bf1941345b5249341bad723101da8e889c9c3e672e84c0227811d6cc8b02382a289c673d2aec79ee3aaff30c85f3028503620557854a119452dc142922562085528a8b4229c50d2104144a298e528a7be2248826514c80a094e228a5384a298e528a5ba2e4bd7c0c1898f60bbf3c7e72ffa4b7a9a7ea7e2e324994ab54990af25a5010e5416cd1ddfd82d9170df0edab86e79b8f2767a79c456a6a723f085ac67c22a1043adae8e645f01a0e0ae459dcf022d8f783a0d446ae3022cca1f7ee110e0e8ee5c8ba85707062f3777430384e1cc659c4693e81d3e906f6c25182100b9461b96c91794484296312f16fe2e0459c3c3289cc273f95d470346798334c291c77f1002905e7bbc2700a813297fb9c14059dcfa61f8ece077d37741d276718ff88ce05a49dfd6cec4a796e28690ef90705dd2f585a1f7c008212addd7006d0680ec87d300582372add089a32189085b1b003823e980aef966d825fb4ee908ae13f194201efcf570dcf9576f6b3a012cef995aa21f5d09150cbb811d446df7bf7c8764837fe7b0a743259d95f01117e44ebe4a2e2a3e21e7dd5a7c1f2ee07ba7ac6d1575999538165bb9fdc6f3bdbe79ee779339cf424efa087fc4b1a798016f2b71d1dfd8822edc129cd567fec97606e261dff5a0639875c9fcdc92943a887fccb20d9d0acb2203a56511f351ff0fc5a0f787e2d099e5fe301cfafed80e71bf9d490e0f95d3b82e7d78ce0f9351df0fc5a0e78fece2bace100cb39b2dd84b51bf0fc1a149e5fb301e7868846cb810591b522787ead063cbf46438bb04604cfafcde022aca9008735197cbad9ff8ffd11c5175507c3083b7b8cb036e4c3da139e3ffec3aaba2b903ecd5278e6be823224b793cd81105c8a6a88dae032cc575ca4d0a13a54464405eeef725f7181224f19ee949d564ae5628c31c658a43e7acbc9c9090524584d9e47583946e440e189e14609f062a9cef51a27254f6616171df2cd572fb2dd0d725437c4ae5c8619e492c12d3f5c6941c285b75071efdfaebd68dcbb257b5727c0d8832b2b28f7e22cbd2553fa38892a147ce4a69bf972418ceb8ab7059d0754a8a6e0c97e33a0c148270b0bd9bb642193afa86ac8fe2e0eade992ddaf074bf8d51153b2ffc5d40810bca0e779d4bbedad314ad1d649ef753aad37bb6ea3fb65f75e52ad6bee4d99ad4b01f4b141733fa553ca54e2455151da08fcef75f31336633f9d70d0b2b3fa2289364cbb97ca6a2d409952a8643a9b403122d35fd2646d82a57eb2a9a485ec12aad8388b34907d3c2aa9ba196710d85311acd7389d1ac8062961ab3a15f1644899764760b155d69934b15a328411519e56e82e536cd640810514352da80aa3814bca57c3121caea0426a873438ca9c80c4901ba496e8d05181e184972b0a170f667d882f97ed44af293bd75558a018138a59c26908d4460ed4461e5efaf3332fba4f8df8f85bf83d5be8fbbc6ea1af1a79c9eccf2f7516b041b6b2fa6a23a1bb0ea5b2d0bb2953a63ff1751ac567484852a2805981d50e3ca4d0688e5c71250629b2a481920408d0358412315f1158a001a9dc229e9250212f1b40d80b52843ce1e572f0aa30b154b0746eaf0843c20aad74a6a0f00961735fe8e19d44991782d4ad172522beca50bd000548164676f4b895a412961e82687172e5861f6e256d0c0c4b9557ee2b2c4ea0c0395fcfdb796092244458a0b31964494e0ec160ee2b2c2ee41267248ac5c78f5abdb5d19ccd80b138f9c0b8b395ce48faa00a16f14deeab2b53e49234e3794a5600a3d96844de85d1ae8cd1a1cad708a93467a6784ae894d24239277d4a36abc860a14a09f66e7006bbbe1f741d8dc1e5acea771e5e54de84c9fabefbb9c67dd4ae9c555574f7154215fe3c5f73aa85ba778db18cdbc8f59d0766f6c0ccb3aa853a0ae4c9c98ecee064d7b94200024ffba271ff0c76e5b63fc7178dcfe9ccf7a68d6c9133670460a404b80115f8e6feaeb3751d2c77b79b3a77e664f757f6c34116fcf3dd8847117764da887ef7f348b798dc5529993e46a0b5ef9315994f33c8745ab3d57d32a51944239decba20b0da7dab8fe47e77da0e133cbfabc22905d8b35b47665afbdf51c4e4d390aee01b14488902f9bced5cc173aea1c2a3ab424af6aeae40e1b1349ba1ce1cea845feeab2b4aa42c9b2f898f0a74828a1024666bf944117b8bdc575786649cfbea4a0a49d45a6b8db550c52dd4bfa365470b9e5f7e10609572e26792d6e62170f960ad98c47269ed3c7b6f77effd9f49a335d7d771e6e4a5d1f9d819015e434091235f0d3f3a1cbe5c197a581baa3c2127540414a9eaa680a040a1d6d8ab291354f08b6b24f154e75d93c20c0139f8a0585cf0e39321a0862710f012c475b168b372f99fbb5257892824f9228922f225ca05265127d8813b369d176cd7c480632d0091c03b57de127c43256c026326a1192636b860c03ab9af9800716d610104c3a270055162755d802f1970078ca3e54b825d2c08b17028c5095728dd14b86312051039803ae09cdc5740b87005c40f2427d82970cd7d05c48e90088655e155c1b1dc574bc67c6530ce7db544cb0cf895fb6a89152338cc7db54488f0694954854017acaefba111d98ebacc90fbe29ddc574e54906beeab2e4fb9149580dd80163c3b3a39585859593768ed06059a8f13c3397cf1077cd1b0ddd7755e0840607fd78b46e79f3bec1582aef0bb5e67b192288df6ff77bc74d26824691369b4ff7f120707fa33c69296960696b4b4b496b6989634b0a4a5a5e54b4b5a5a1a58d2d2d25ada625ad2c0929696d68f4f4f522e67232997cb254d7d9064232997cb794149b99c8da45c2e9714cedae2d7c225a385882a643c79e848cae572b91e9a3a9a351a36b3c79a3568d8f4984074245981a149531fb415144a9583496934210e3aa89376ad3d1bdc992d63f6900e0cf6ca09ffe77ef720ce8b46e7e9c45e34bcd7074d79de844af70bc6cad2ea5cee68369b89b3a45965625228967a0b18289492acc0d0a4a90f926c2459816926eaa4337286c1ac8d7a369b611cbbc1c979e984fd4d5539cae51e0725d5496934210ed064ef204f5c9e5fce1ed346522e67232997cb254d7d9064232997cbf1b85a7c626b5d175e4fe703c349f1b5961cc81fac932edd4cc0659899bc686a60beff521b75ec7351b656e92208057c0031d86934e5cc656dd92b8337960c970cde7090c19bc665107b5ed7598b319e62688b496fe5f11dda3af54bad39f6e274552caa314a29a5771ad59bafc25cfd023b0cc117a5d505ebaf2ff6621dcea536a773e4ad3a94eed8aa88c54a2f2dc98f518baa08e3e08a7f9d4eabedbceb02c317ec06c770727476785a882e5a541e173d3c3d3e3be016d31a1f9d9f9f173937baa6d46255d328c68f495cb5c5d4d13a1163dce23b5b795ec0c0b19dad9dad3c3062c478de56ba13037f8c182f1a9e38deb83a7ba9f77d2de4df2f9919efe379d1a03a4878d1a8b21b0d787ea733ca60ddd696ce4bf6020000c2d90c0310033100a1ad4c01f832c8e0325512c803d2a0ab3d1a886b3a5b7b041054fbd2946862d597247b65d7eb7111244471edac0ba10138ad69d529534973d1d93a80a129de2cecb5b3b5b343b4f0e2bf345bde6262a25689d698fe997c4bac61b79108eb2da636ea203427c07276b77737ddc93a99e2640ad670566b6de775f7edeecfdda9bb6b3e514a7550ba450904c150d6f47abd60e11c5b36bfe94609c762311c1c9c1c9deedea9b5e6cedd29d928a5b4a04a69a534f3b4105d504abda7a7c7c7c7e727fcf979f1e2058ca6ec038196ba8dc0fe08ba8f51dbd9f94d79d271524a638413e796f9d870d7f1cfa0ed270ad2385ebbeb0afb26f6f251727d6710dce9063ea6b5dadd393a3b3caeb0c7120c7b2c5d78cff4f19ff9c261cc18fe7374d904009d390601c88004d220001990401a08200312480301049140ddad41d85ed4dd2e827c5af004090dc03644a311e00a0d608846800dacb53086ea8b2dacb52300c21e01d082a77f3aadd111c65aab4423805b6b3708db8bbabb006159f64fd9d18e8883a230354a0da0d442fd3ae1b5d6725054b319c0c85a5bd4dded45dd6d3380918ca30eacb506d8d1390a3b183db0d60ec9a804f81857a664a3056d7044140306071dd460bcb07960f4e2c75a2be300b5831f1f6badb5d676d6da0320e55b7737780bbfbfde7fe3ed8098a99d61a92c8795e1dc5e0cef61bc7cda36adb5d65a3b236c1d1ad6b11ccb5a6da5613d0266c018305ed0da423eb9a49452dad3b9105b7c3cae9d2d4f3b3a614829a5d45ba8ffd61c1c584829a5d4fbdeea250d31be89c170c2574e18823be1ce168c039e2e9eafc5153d175d8ff5a93ff445e830c29d2db4169a31c2dbed751807abfe87954df9b340e1a07050388c4ba1d65a713d504141e1a0a07050382a281c8ee9e4c462b118ce4ffcb1d1338831c6b1187e1c7b8c635827870a0a0a0a0ae772c235e79c9feb5bf67df5a2ef93350e87b382c3e190808282c241e1a07050382a28281c15148e0a0a4705159c47a8f42d7aa3d6a9911a008002e3150000200c0c86c461b1581627aaded40314000e627c36685232184c83b14890e3300a831886618831c610630831c830c7a6ac008c4ec10e8e1469781cc7cf4a6dbfa1b0072f4137acb01d9d4575dcc31611bc1cd0163147c18b075859ede4b8cc236b59c87a7b4ca219300713aada56776a7190a5ad764a228a413dd2530b18c99e83be6cc3a4871ef459882ee8cc2e2287fd8e2803f74a7b124cab47c396435437e2a98642c5582b9e1a19f208cc9c5a66aebced608c7594b76d9c34da1397176a48fd73f8fd48ffcae94c86d4992a5def1bf2684bf446761ad768c0be4ba33bebd4f513cb31274012292fa06d739b0441c70818a3bbeca2f1d1ded9b2cf7c94143780b5096619896bec6dd08d4901614cea38c162daa939b89a3e12a29a8058998174d8635ab4e9b14ddeb3bb924595b53b8aa8ee51f2b9fb1f8071b720a4cf2cd4bb23ac8612fc298d511a7085cf49fabd8cabcfff2e8a34ec4fdddf547a42bc965f1be64d2e756704e5a69824c0cdd82336de40db3050e4d3b436e252e342f69c47f014c9d00fa455026da72cfe24e3b73f976f8272d6220e07225ed10e4094416a3d7c9d5c1d36647543a869918209e272853c1624ed9aad8650e74aefb4e11fe4b20203545e2449da4e3c92f852425a0b47664dd834a1cd5f75e6bad253049da95173a9faab0665339480dd56daf9bddf38369b2f1f59de5253a7a94e1274420494ddd3f2cec465336b3b1c047c1896a6feb7e4ec79014ad1505a5100c70fd5a3319fa143d3780b80fa0996945253f1f98c6da61d98af26595569260d3136607b1cc8e6db2be999d0a6abaaecc01b44058a7cdb836101dd6f420291f1b54e821047090a5a55928f211f922665296960ac848eb476c3eebbe614922cb024bb43f6addb6527dfa18963b55e24076db502830fc506d340ea48987ade2ea453198f827c0a7646bc2886799d91145974e4ab7e74562ed487130ec2eaa02065ffa88885456199049899284b619d743dc0ec53b26fd2351b2c471379b6c5c344857299a3c0d3941675f3a8e4595f76fc8e6b028d626fb5258dad07a1517674b0a43ea8932829a7d8a1d246f5de0be87da687bb8f1d7602b9df644334aa6c10c6850bae5188fe48245b7163f402b6ef8c5590ceea779c0a288229b09980e9892f75d2e8a4c9e39abf5b05124b9b705cd39e8231754b719facabfc796f41a5573c40a723268e6bfa686b1448ddd080428d2d44c7c09dad73155c7210c8b8c918ef8aa2d2e33d6fb99808a8138a285cc782a66ba4d5d5174b8e6ab23758cf81b159d89e9ede45ede24a5d041f038a316df49be844781f905270089204da536863a96a2c17c9f5ce623bcd67ef477ced4e9276fa11d7d789cb4616ce8e5813cbad3ca3fc29d4fdcf061e5fbf8e131c1f83650623c5949b71d177750f113fb3d11d832760f7875d542abf6d7ce35c4bb8a7ba6011f0d20d25082372098b5595d9c9fdc8e64799dfbff4e26d4ca781df965140bcd1da65ad8b3e29a4e1d7dcd9800b6726904c2b6994d89ce937bb564ea0d56d0315efd108f1ba3841f07124de7e5f2249bd3f6d6e51965802edfafca8d2059818f9c857400f382e84ca083d6e582f3cd2ab29ff56c7764c809fcca345ce9eaeb6f7ebf1280bb36181c2c54b5c972da59e45a37dcfb04a3e522a68e8f861d13372de2a239d946334b9473a9dac0d621f6402c4c51bf84b987bf1223806d60f14806f0299e5709b0fdd51678282f78532a0c13c20eada88d25633e28b3795514b50f443d59d025b123eb977de1ee8c34ff54013e3ee53bde0099aed84a3aebc3f848c172438e45108e644f5a3032b55494ddff75ad04d7b23c28b8b8523b87dc9f5c2baf44df0fa0e07c8a3876536b2a931ff8258cec509a23d41deced30617a997934b1e0f1485bdb7030cb2345e9368417a52531445ef0c4a9f0676ca42195c292d928f3443592a2c920b746b79f9505565d629756af991037b844afc894ad8263af5f6883be5049d5b8683002659ea1cd38d248634a7037c5711463b4c16d4dcae3e36b51f103c7dd3f48e95169e5a5e4975347c1b61a1555dd8817dd3ad9e351b39896331643ffdf712ba2f13d0ae7b879f42f73109222d2328515412d59fba6ee3aeb4b645e3067f29dd82ef2be18e2da468f7cae36c96d722092e9da15eafc5571e1c80c5ce7cb77520ce41812532a780dfa54f09abb131993753db185ca8eb7f7996f0e05c9c04918b7ad953828ca278eba6fc88e3c64f58630763fe3a0015112b003a89789a1bd3c077269dfd836789de1ca0b90a718e49df9cc60695e7a982b97d437d77be763fb80b14fa891e093e599fd02b0a17968351453fff6245ce36ee666837748d4245cb7cdf691f4a724f0c092ceb6f5f2d2e473c9ff791ce436c86c3eb9eb25e7532273bd43c4bea763dbd7e6402e9bd854abdcef56bae3e8197bbd177ffd965ebeaea77b73e63485ccf0653a2c525de7633a41e3e5cd170e324f4d52a95d31514e43ad1c14ea1ff09a9ae40f4f3c7f2a92e77444337c0ca8996c7998e9676435aa2adc82592aad0b372a2dbbdcccff8e72995e804990d0f41d9b78b1826383420a0babf01215acec5f4db3776406dc164c08587ef2761f9dd34273c7c00066c26ca681f137f953331d0fd7cd51fe72d3d41aecababf7eff55aedfb957bfbf944fc712bab2cedfef37c433581f997e327257b8f9034a9aa839f287e552bafffeffa6620508870119cdbcdf451a2c2e2e4f4c3057db058e3eddc0d117ba1abd678b9596bad940fc73f43eaa4adea1be061f55497ab8496830af6a88227586d52aa55675ec670645c5b18acfd73164aa73e62121a86439886944f849f30b1d08a6906e19b868d07c8051318b726caee5f8dbd2a4266839bda04fb9e18c82a27cc2252ebc7e590cf4fea472dc80320d529eba39870dfde4649208cf81c3c230dc593834d2c59d61e1f7b3649a71c8fceb18ae1f5ff92f8322563db54c4a5c339c043b2b8e7bf55dc0e80d17b67da6d86ec3cf82130337d891b18d0f26dcbbf5b682c1866eaf1e62a5cb575352c2051ea9dd7fb5d9b4cb0fabd129892b839dee62ab5939ec42665f657a1aae02357bb76d66d480379ccd4f22a368028e9a654c4ab246885fef61b1f9ceb476c074030f12b5b5e5c8c2b63d237374b2844c82f1b98d571659978a4ab37b0bc5494cd0a335661b2afcf3058df691f65d4ab3a07eda413a790734792eaea89808c13d1e6a1fab908912bb9d210a4b752af2afc005ed4fec82927f36461a5a92cb7e1eb0f9f701a5298cfb3c1e64f5640dba0203edd6567073d173d2cdbd4582c46ac2bf1a8981d6062ca25e65ae5ceae3f77132fe2d54999058c44566a7b9cdbabb9a6d80f9f0fd7c72a2dcf9e0fe108f5e7e8a3fa4de2c19fa6f224c386be34e347d354dea178afd364e00e64d820255669c79b1626abf5a31600af23071822aacc0383b20b95dc9b4401aa263ce6f86f2ab68c048723eaff92821662306b684b8518d10b53fe04628858b35766630d81081a6a793e3205d59c388702f6b70c40e062b2d338f8a2de7893e0138ff84d306717bcbc1039c4e0c392b9c78d443d0955eaec703b1a6cdbf0bda3181efed7ba1a31381888f871a4c13bb58a9580ffef23a0e57826de71e80d0ececdd09b345ff1e582a439e20d241c0d339ce04aa13c1087967693a7c10e3d0c1b932f45458558d9db36986634a90b4984e4201480bbe200b24bcf8f6302fd6ebf7ac1e6a38d867c9c661730897172f5a5c434718aa975337052be6b22b1634268eed3d489c40900cce5ce4e924f71c3045eaaf89a011653bdb0df7ad6359110ff13a1c984c7967ed384b6ac82057455b98e93b0978fd9f6110ef24e4997b1cb8660d7aea7794825511de6fc2118c5ac2e2b1bf3c3aed96768d10a78b2c6620244c7d229cc4551726851052219a16eff5ff92d5366c8151b39670b7cfd36fc683ccb9a4ac00c2092f9a0862a461e41a0c9d778656ad806b887941b8dea25a856de1be6caef9f15da1ebc213228f6835f0788bbf736d010fa9c0408c8c4e1fcd4482ebe2c8befb86c2840df9862785c020627d7f9c0e988ecabb6ff035f6a04ee124e609911849821c9aa5a8f7e1111194188aaee92fdd1f984feb6c2eb4e8fa19884d235668cf2e38d615a09dc05974403944dab2d7428202e44113ac54c0716293bd726168061097173606b873e2d6af7ad6eaa0e07173142a09b46d7440002c292d10b6ded4f04974837152f69b34d1e0241946038359e9edde413f038a1f0178dbce0bb527fc3b9824cfe030179233765251a811e19f9d9b45fcda104f2e8414d1e7aa2c1f4909e1aa1ab2a048a409071dc4ac49fae30213c4b3cba6b0459b26e8400b0687c446d17bea27d90b2001b23101662d934781265300ed3a0758975fca77018b38cb2bad324595a946afb7dc35dbea173147fd3e2813c8805da637a0a9cfed96e15e984f5cf8317acc8116056e658a1833af18620b1ccc882602bcf80e96f2130018b733a3011b240378ac0f506b1c970d1cd508c87f8dd187ccfbdfe30dfc6794408f68f4f8c7393a54e6f634176371c2a6c600f8403977cfe0600ef74ba52cb198d55a53b16ea5aaae77146ab90e9ab0b5d9870ae7bb96375b440f0a4d59cb107ffe28c0da529bf052673c2e817d386aeb9056a6272a3b71e414980435dee2f752a7ef327de981844e0d254c94cb457a9ae32df46d7a8751e20774bc68faa411d39827913ffcbc140c3900ca976f33a03b500c8ac6be082e6e2c3c8311b2471a248d4dd98de8ba7b4d55e017b1cd2c5fd39238a231907034c33257cc2212c4fa18e999f62d6a3cc8992f9818b2d628d69ba81cfa1378d39785a51d9fcc5a70afa0add26a0b9b730cb71bf58670f7e0c83704c5f3b50ed51983460ff1d5b8639a2cc40e4f3e3e5383366a8a53d40a902ae4df2fc67ec9e86d0ee074a30094116849954ce9c5d006aafa0399fe5496a02bf9d1357d07da38440b35a68389dda98f1b8cc150b93d5c2d10602ad87af8d0d457141c9f3b47bdb0b68f76d15bf2f055ba2a4f84b404cab876692e5ef546f28d92f7324f1b62c1ed5302c5aa89fd9060da9ae47396254cd1f7ae6c3adbc902e4b2b2e84121457a669a6d0d8e9d52a5b8e76b8a5a8cb2751ae76494fcbd64e49b2141f3d155b935763cb4c4aab21afaa01bdd707014f31232b79c8c67f64ad30730206ee70a64da55f87282bc7266ca1c246f4f906e822b474fb1931fe7bfc7032a000ce3cfc1ee8d48cb22aebae88ab146c6ff32b091c9ff280e66797790f450f06bcf9c46555678a71198d13eb6e0a4a99784aa2969c0bb908da405200d4693e7ec296a48e48ea473372ca0029103862075064ed43534f09492bab4057fea779ad20993f0a1e856a6b2f712f75f21cf9a57246263d3b7b49b7f57923655c6bb66792706cd1ed66f176c78426a29595cac6d7558d913838cb02cc7a123d85b135ae4d5c66ac0522f72877c9e3e47897359bff040cbb1194894ffdb4db60318c72e32f5eb9c1ee05cf370612467ba3107de5cd5c83d4a7e7cf36203f194fce8c6ea8de4dfa55dd3b42bf79ae23fc423ecff127515fb0b410acf83db10ea47ed88f55ebc29ee1ba89b220a2db89192501a02c90319979b0d22ff11ffc243c12fd9f7c8cae9ebc25d03534656a4043d849af34747cc697a8db5602b27b13e05b1d8ca791955bd8680b8dc8b049ff7602fd70d3e49484036acc7ae6bd8ca64b3391dd012b0227e9287d62468b2a5171ed7d42259e5d2af90ea9a169511677e1ecca449dec0b97a738afc4ee0a1fcfdf2a23e733b6a0e4bfee672ceaffb81cbea1a34c45cf205e109a9fd9a32e54fbf3bc244f2f05b664bed65c3134e8afc5d1b359474db933d399ccc7bc4d8a70a69fe59ede5719d746066ca86d66b1ab0a3f80400cfeb652cbe6b3e6a6aa5ec07e0b0f017dee283a487f01fdc3611bed4fa3ce83537941995cc85de082c3690dc19942029bcb7effbc7f2c6dd274117716740cdf4cd5753ecab6062e961d6ae835395455f90425dd1901ff668c4892974515e3cd2cd67ca630f7b61d350f58042017276aa6fc72a224746af552c7bbab60a9b5766569c5ca067ec23f3865163d7d8b8f9df7f396d4c5bb4063087ef31d3ef41b7c6ee2c070915ec006febbd525ca39539266053968111d619192c39230c9b16499e98a060ff5ac62a08463592220bd61cc817b6ac92e0b2ae69a41996f526e333325a948dcd22d4b91b1c9331e79d1287f5c8f04ddf078365318d0efba590003f221b6a59386e42fc665846b456f17f7622aa226186ab2c0b590117c6e9004e8a2ac795f08cc48b3ad29bebc0c9e182d83a5bc260e548652b225fb43ecdb1ab67b99927217663e306373637dcc89b24cbdc1ba79ec87bd1afa5326b41b7711650d9e49bcedf67efa556979608e773005b568fc01595464045b7d487933ed0efb5b5c2cd3d391903e27d446789f9db9c75ff5434efe28f51632d807ce5b153005b7d109091ba0d4e76af459b3aebdd620787f959ff743f2f1f446903a2ab2eddb25671892bb9fc6bad8146c4e8611824013f92d775839b18ac779d453b5379b8c68fe7ef3fb3f619ddd1ccd095a8ec7be6cc4e8eddb57318cfc9c08db272069d986c0d39650186a2bc9962a1b127049471a354794f6126d45cbe7cac69de63948a972ef8491f1b1b6edbd870eb0d3cfa64ae71a98261e89c522287a1bbc572127e35e6963c0c9a23a65356e77c57adaac2825f6fdb379919a26a2d28f2f2a21191446a5e41261fe8c62276733ed6f93e1c9c0af9b72a2e5ca7935404beca85a08ae9d54ecb09d9ad32742b4e0989fbc8647eaf03cb5835bc8e7f7c45c89da17dc2f3da2f40c587eeb768e4ee972a7fd1f2290fb7013612c07e03364b8e2cc331d0f3cadba67b96115815aff2831007290762195eddf1e8b6a12a6d5c0c6504eec1ea732f69476feeadd3dbfccd7487bc59928c7606bff2dea14f1f7d4132451eaac347da4221941f2860ef41a5d92963e397f31a2d4dc6b73e650df6b68e943a0d3b3da0b3075aa6334b8743ace7c1d7058d5d4b3ea6d551dbc062c34033ff5004219985ac7a45d78badaad25f0b7ebce72121232f01f1d9280a9fe58f3e951af1ef08af44013ae8d0c865c3665159a9cca1596ba7c5959a2baee44c15b2bb28f955e8c62ecc00dadefd9a3d48ef97a8bc0b38c788505b3352e1bc77aeb3f96d4c955fc31a7215232dafe3313379fea265a4950d0b34b3289a0f0c6a28887cab623f4b0f9bebf16e523bdb86696eb6a712c7172712a587470f3334488ae3795c0763d4c28918a1cc026265cf98bb024c51d63eb9f3882099fed9a3773d0bef0427d816667d383a043644a275a1a33a998c47b33e85a933f1e506b918072d4ef336a81499df7a4b1135d47ab02cd23caf763b487061a082287d8e896ea5efdc5eb2101531001225bda91ed4f9d470648bb9736d36b169b046e7617c9df19054b43149019dc5e00bd3bbf89fdcc92b9dfdf45c73be0460477e3a64815c625cdabb31aaf901194eb2c6b86fa35866d228f2fec6ee8a8788023d2122217986899a5416bb2a41ce32768d65fb441f3c500ac70f679d9d3b07924348deb53482d1e5faeb7335396c92c684984074e21415535a7e56abf5100c9848fe3e8c7b58f00249ce510c93ad4315f966ac4f4b1f21c571a01beb0851c3bca58bb99fdbcd96d88d52cc6ac356cb7cd6da5be82e60969ef78be80c280c031f7b9012dac8aec2a4ff964945cef2fa52093cf99c61b26f1ccdd8504baeffdc51845d5d36ee84cebaeb29689d76d40a6ee7de086dda49ed717811e94e65adff4b2838c6db7f58c30727553af51873466a12d83c5fd5a120143912fd5d5ad3848a667888d8c39e939b3380589f84852f1220ce244789efb3103be32100064da9c7955b64af2c06f4066f42f9e1dc912cb3cf520d0bfe11b43cc590e2f28eccb83d60543cebb1db68d17fe2a6fb196c3e4cee9b4ebff1f5591ee3123f4f9de9a431d261e8acb304258c187b974e79e14185d6542af3c9557a5dd2c54681bcb0ca997799f422fe36e6578ed42c8113468065543840ab6354fd8dd811ab69d6a61be8a02ac90300ace764f8aa5e5d27f811490718333c3c7d80a69d25117af3a76c6f04fd310841496004c7f42b07ce6a27d1af3784ab7276f87c8be2aae2261d1163e4208e0cef7b570325101b3007dc8979f195826e2d429137c48a028ec7247d731d23ebd5d2f5715de4ae042e870322085054bc2bedcca026a8f0a26fac40a098f65abfcc226271da0c2fcf28ee3bc99f2678fe9bcd2134fd3ada4c3a8e47f65e7f1544f92d14d34b64bc8fc8b9e4a27513e819e78657f96d98ac6a7327a4b0427f154c56ce9f25316648f8e9ddfbacd4681b16d1c3801114944a55037fa770c2f060b0958d731699fc5276f24bea515465f53625d5609e448616f5376e19b03accf05e62d45d1e15752a6b8bf949af0367a1fc71080f51536c84b87190812fd0a76e3cd58592de48aa2afd48fe6d80c84958a6645174200b5c3da53fa6c9c5ae0d656bbfbf55e7181f107845424d16586aaa4b809a55687c53fd97ae19cc8b8e10ad78af7ec2caa72e444c3c0cc286ba6fde657f3e618a53526b1474f07c1d1558c2fcb391dedb75207af153559ddca6fff31a75bdc4bee270768f5e41c2e3992f68724642d54ccee1462a7b2c5ced29c91dfff21a5e1066edcf3456da63153caa09c96ecaab6dd6d7b7d5412302b533b80dca32669550b82d7d5b7e6e5d6e7f538780642bc50d83650d736bacce5db4a8a85b1a2f3d8077b9eb79f169ceeb084d34fc242da6f663017b9b835c9b065cd1b0dd0ac66579f4696ab587f2bd64f28cb8ae695c4da4665090a9fb57af985302d7d0ded828146fa1ed59277c768aa599273becf176ee7c008e7b3adf969d052e99e2b5e30e1ca006473121601f187fc16ab48f272238beef6bf0600714371e6ad9d30105b8f136b025c09ea4cbc7bf0f084efb4ee637d64195ae3f67c761340975a67494a60970dcd7ba6623161070e2660aea2d3076a1ce7d18b4e1dc3f90dc9c68dbbaa339d04006384e94c9194d8e3a8536f23692260c0ce8dd96ca461d2ea7e7e237540dc1a37042d03f3dcafe5e87c92e7a948361ed21d724cbb1f22e4eb0cafd83c0177ff423cdd0cd05db6e9d333b0c24338807357f34ae6652010928638cbd0c4fbba9d0e0a8808488e093d362e5b7e04b797682a0eb50f2fb9e26483ff32e1248728c6cf3384c55820c6412c8a1d82e91cd482441be99c7da17d784d34a93f199e9d6905a748a32f4aa566ee5b178480a565f5733d253059df7dacf0444b24767f031554cb83d2b7bea3f3ee4acf1343ad916b2a219578cb68f30cb7b20539021a7ba8f87c7510f8d0fbb2939ed289b0aab0d6cb6e24516dc3fb3a6363b4edc1845e023f397076ea63aa0016428c1b33737a071a67f7c9d840cf29ca39e2346e831e41c38434a506d4176eddbbffa7e39abb7d742926ecb1e0fbac32676b5ab1f05e6f5f0140cb7001fe9771be4e99a3190f71feb60f28c79cf6e0a2be81a163059940ce49a20db9bceec5106c581f0a25ad882245be4d0592af489e3fcb80bbff0caea909354da0c88931b8b23580f61028cb804ee18dcf2923bcacd76907bce447d2f6dac88bdac32d9832a17ed616542e2f83dd6b87d5435932e1ce6f1bc5633841db6e406e409096b2d550ee0ffca1723beb64f8a354f62238d99c0d04751b824593420463b4e5986dcf53f73733383812f4afa2c11ed8602a1b513158ab2e46723a5ffd66e78079d13ff4fd833604425be39a7df91e69df5de5c4b8e710748c4afa184a1ab80482eabec451b85148accb9b88ab42e30e9b42755ee039a76bd660608b4dbcf70814225aa3922c3ad20a43c6fae0be8302c7438fa9dc6aaa122010073d286a4c9c486dddbfed0673aca0c6cc1910edbeaa86ef038122ee6515925004d657f99f7b9a608018d904aec6f3fa345381d87301b754ca7abc8e6ce1c54eb11491c53ee611e1a41280699d5b7cd1551175263b52ba8033b1009b9ffb44636910d5fc0e6cb5c5dc15af079926e3a2177f7ac3ad8981e829d026c444a4212e09294d1d0af60ef051b0220219913f0e17b6859924c688e811e48fb4e0bcd7ef74f8efb01232140e3af5b95f8293f59e9938a5168044692b2e8152bd96dfb2610689596abd4ae368c64b36bd6461d0b6b18632fe67904c4d12b31d86bb87537af7775c395d9e419f88e388b77884b38dd45dd9b7ee0210f273751490c9c59e05eef88eb40c871c3c9bc740df6457b2b42c62e0e48ddb68d7e75c5b710faa0102974a4d940de9186bcf38e642ee661bec52870a7dfd0b9099cdd8c5af56e3e945dd032efde8bc1f4d7a889d06e3740f4db94358253996203c6f892a08d33c322be2741596c075b3679f8b5805133e884e0e9da55ccade3b8ab7f8b937299e625ee5b9a83b7a820c09d130e3f20569d2162b082b61c7f3a1ae07457f823097eaef4605c38b35e327638a81014e2ec7571cb41f3aa7c0cc00f7693203cf33c7e651f657c66e701087fd70f868395f5c26e5e3e2136e04af22810ea1410aa9ca437a8dfd4674d9f9cf35bd876551927dd1312dae9c3ba82721efea0a0a53ec087670f0bd221fc97c9d346821294c3bad41a015b6dadb3ec534a36796cffa860d614d40439f83d2861ac1ecc0a185c51e22f25c862223cfced158979d79255a9d0db52408ab5405bfa79e36049602d55a41c0b6c7053378d6ba9be6c30b216d8a5dd0a641ec5437530dacc95309e9065a17d2b5250835fc6798f41d617fc9a94ba49dcc9bf5705febf53e6965b803d7f039f1d983b50a2e4bb9973e940145fddf3a0307d059d92efb6ddb54f64a71f8ff64d48777d81f57c3bb1f5538d904ba9fa0f1e73756f170660214454bee1300186e9a2d83eb414261c19a86c9ac0013a77219ba8bfdd149fe56f9ad96443fd8f16b40dd8c43ff5427447cff3510ffbf2713cc0370716b470e0515b57c8d3c921b5111daab06e8a4d0aed9143cd6f8860860f78b676a849a54f752319178b444d2d340536423450f072217879e039920c5e10d4ee834f9623118c4b37b6216f65b69e739cc608660a1ccf76fabd44f39d54f4a469ca6c9e053b26fe123bda99534d44a808b348d87369ce54614edd7faddc09f3a25a1008110e2fe24063510cdb3e933bace519be4da50fdd21791bbf343453881e1a39c52a6ea7b350f19833ceb9893e08e389f5992139e724ddb1ce2897bc0fcec16e0e0bf30248d6f1a6bc0ea881eb9489808c1b124eb11a281970c71637b015bc73523a41b8bd10369566c9fbe5ba41d7fd042148e515e41fe68807f4a10f4e4a14e2f1d76e50bea0f0c10b5c4eaa2e4a4de27457d08e846a84e7e191afb0f3ab530f86831ffca3468cae76d5f00b9d929c67fdd15a5ff31c71bc620170194d5d4ae1196fc55d5a6bec1422512cc11b08996764146ec38b0db60863f4e308802fcd7ee3870eabf1ce6fbdd8a544593bf959212affdde47a03a34ad1c341aa7a05596017b63dd3e55d100e4fb9f248828fd8058b025c3d6cdb363b7fb9688c125856b45081170052cce054f44f1471d9c7d29bda67f767a388200a3fae59eaaed5c604cd0061335516c21b577a0c9132d9466bac3860907751206953995ebe0524e047bd48ba212da95f44de6725dadccd0f29e004e0885d7047e1c44335abc506d00986712973a7748734ad86dc482033e1865deaaf0982f6d29230ffce5688da14bcd8f3055d4ed6cf9d9cb5b566de6dc7b87ef2a5ece0a61bf788666ada4c178bcf82c8ce35f63692311dc0982e862ea3a8820d6881659cd663981c34c9beb434866892bd426b9889d0ad61725d40cd20481967df13e5688b2c7010b261c868050ade5ef7adb7502e505cc0ad7410e56961a0ed104c18dfffee5a05ef05cb08708e3c98813e724f4b3130c8ab57f5738446244e3af4fdcf400bcc842417b4b66563ed3de3f7deaf02b40cdabd76edf56876ce1ff00e2063579550f58177cc0b73548161c4c035360937f3d97ada49169f3656ac9dadcf4c4ecf12feac47eeb6a88ee5f2a15ecbf8ce64b52b4869db7ec5384ff155c2e0abba688e5d8daa329727db3e92d32a1a233afb0563ca994b4ac2fe328143e08b71adea15d6398d219e5b898a674e40145fc72512c2cf52c5670095d49479c58ca26bb1b91ebeca758fb233e26e7a6b52e8dcc5899dae2707f786d1a69b9d591daa60fefc6bc9afe3be0150e4545451a34f5cb3362a9e77ef1bb5e12511f1dd775c79dbd90a057da63a027bf23d5a02394551d5043f2d6d993097a104aa6a7b294ed4b9c1596d3d7d6fbc0b1e6b040caa042f28c5f3604a334d2b4b831d26be2f6c90aa84ac5768b206b079aed20ab209760239512c868a0ab2e8bd70f1a741b21070dbe23b2955ff248c8b7ce099f8630589883753284efabeb661faefe3a39175a5d4d4f37cf2f0f3bf9a409479531ecf934108f736c323957c55cc0ccbfa5f909502b407ab376d818d0651cfa03f58a6f26635b585d33eb8d54bf5182d0e1d4b96f5149bc10093acb0f82406612be958be6dfc41d1abb1f0e4d3790e95d4de39cc35e0a7e6919cbf009913884ffa562e1aa0fead35cce2aa6a641efd5e63cb67993914c9793de25b7623e82aec13a9915d9f23eb32dc5a555051673ea2a59be452cdff3bfed2bc410c9c84e97a14ea6089e620164a366a012abfffd7de7ea1352b1cd0c3d9ede027df5e37d58b67d1567c54d69fd10c6cc3bac1e7f3ea3a1214518e8e514a436967164f88b024ee1010b73c088b9ddb2f44d21285c99447aa505465c71a90d559a70b8d58bb2ca013fdfccde96afecaa5c07cd6ec58adb198e56f2b221ad943d912bbcf0d7263931530dac39ade999ddc1dbff42a4b5453af4e5a86729a0c6430a79b043ca05a06ff82c0ee801fe1e7953ec4fa29fe38af802f9823401f8162c7764bee40a8b562e1c5a68a3d4de66f5734203efab2360615b9fe42ce42cb2d0d12f508181895b8df3c1ea99e1d5876c4f096d11ff193f8db3c3fa939f376ddaa1aa8e73e781420a104ec97985dd097b470d99e4045771aa97f262c591aaff6bc817e5184acdbf44db14415eeee67da263b730a668edb17fa8302fb604898b353afb4ae96977ca8402d1987da1c2c31436f863dad539d21d4a4d51009a8c7b522c9c4c891eb339559b59d7e1152683a0983e7224002d56165e221f357e9bdc2905fd6f523bb8516b06c00064bb578bd8f4bd25507a06c7cbf4fdee45715b0b603b2d600c9cd144f2ebc0a908f3b89df2be24a3183a13a8c4033850a50a7ddef4ee8abdc2107d709341a2490ef105427b01b0c3ca4daefe705f555911bb5273fc3ad3ffda49a75aec4894296dc1eab125d6bdcdc98e8ba05a6ef7ad34de85d438e18cde6064b3337151603ce2e65beec861c47aff5c074883c7c409c5a248c84cb4f2de79243e963b5209b72391617fa4bcb8681d9184d15b4c54c27be1b519961a588359aa1011e5f095346db108722cb829fc39e12ee599a6ad05caae15f41a6cdc48b89afa526cb025292df4ce0c8c4aadcfb7c2d261697ad41cb7c8476edd6a65740f1550e2148508211bd46b20ceaa579c229e5692dbe750b0c5cca084d4219a5e151bb94f1127822116b09b29f297972eeb5b0d766cedf3292e14299026bf2d7ba3bec2ca7450c30640f8e1ddca19fc1627b545d72636b3f8d02dc81b8199561c018a4e51c59bfcc0ae2d6ad1f3dbf7749c913799262652dfeb36a209b4a0f7a65672fe94904ad7c41349ddfcbcec0b564c6ad2f58c687b6cf2f08aa6e4340bd504482ca47ded3441be6639aeb7655170bf58aa8aafcbd38d178487d7415f81de88b02b980e8e66bceaf5604c23fd03795f405bffdab29f60fddb487a0791892dbddad1fd8fdb7b464b7a38f79929b1e91051063fa77b3ba09d40e7842ebf9fd20755ef85b3147f86ecd9acc707e0873fc3e447bfbd6a578befe7a5b0252c0ca8a3028e1fd8ef451deb8effbad8bd842bcd3fcaf5f580124de22a0540c2afa3ff5fa279da8cb0e83c4669bde1566ffef8923b836ad0cedb7aeb91e4335d4a2b7150d58041a7a4e2282294677ffdf0797ef0800d213a2f6483da6a2604682cdf46e610cb60900364a690b88894a8de1f4e7eff20b3920eee0fa67d4333c798ceeb89645f016087905e7728142410bca6b4d3a31ff9f8b06601efbacf9d58b466d2503fe0b0e90cb890e93bc6fd2357ee045c49a6e34797c3c12493968ce0250e988628eda561d488f687bf31714a5873d3750321d4a42e127200a580760bf52f9e210f311b26d1c3540523bf31af722406c6eb611b4d96b9d94888f16f284e077325d7c758f1065c95ca2d2c3bdb9d8d2a053aa25a9a7ca065c17be8df388f8efd65043bd47bed60b3c6fc853de1f989ee6351e3d44883a38c297a66847f85dccd0b44c236c8c269332076354b83763ce48eb9246642a2359efda7e02fc0da48c2397197800e5b6f74695b4225a0316449bef68414ad04ae452b8a9d9b4caa7a0c34a74b599cbdb518b79fc06c53b7b042652d0b04ccd73dc962943383668bf90344b66d7c868427b5d4caf0d87232aedc40362780e4e116dfd9a2d26e687ab6dfca586fcb0be4371492450ccee69cbb97c3bc8803530d213ab485ac76be76ed8bd999307d66e889b3327d8a4cff3f84a95e751abd43867d9e5fc7d7696a3c6cffa5e835d7ec365bf2aa49e07b82bcaadceecdefda8d07f40806ba2f5d3663bbf6c3d20d4c9429dd332ac43fd000a701d4b71024379d6b1e639de8e1c8e7bb17e8250a0b7aaad97b83f8967f54d5222540b0194bb218fe8ceb04ceb16de0f44edd3483d2203d0aca5bfe2e23ab8bd9a1096cb6c5faced6a4d4817c212101a6ab362d9ac179aa711ce46d12f866f08a3054c6d23c19958f33da9dfb76eb2fedfa19aab8b062afb90a82cc12a5163084367cd6df1c7fd9730d5109936fc7183c99d56187cdc7cd321030241fa5a9b41078ee13654ac596eb600d601a37f0d9957e94044a670e8dbb1707eeb59ddddf7433ef2d8fc81428f12551976f51fa47761d009d1375b2458c3d5ecc965202870b9766b536cc8b7513fae5705360b0ecd71c9e22cfc0c55ac516dd8465fd9653df49c3174306adcc2797e688e01bbfa5f17234b427be68fbce63ff8409286f80282603b44b4989adb6126d2869cf5e960563127690b5e95ff11aaadaca394fe84ac05f3699f332171c6e1687b3f3b6ea9cfa28022b3582983c1700dc5f9e12e106a0604a22c6c286dc4e7437e346c66411b283aa8039670ed411343e168165390ef5de9e5b1465b463f5d0d23813d78a82f99c5e732576a484f23704fc4c68f5cf4f6c3ba30cef6d04b4f4d4ebe49d5e411857cbe052827e3e935d491a6c81077ecee5fe7635002b3b7ef6bd3223c1f35bd83a9a150a0c7c12be2a86a47db27d27a3f9c563375d501d5ee62c5cc71447701ba3c51ce988bd52370e3381289070fbb6f4430ea28d728ef0fd946329ebeac0afe242b39cc3662dfbd7f7c1269e433d22fa207f78910e68ec113056f12e551022c7745faeb291ca3beffa72541b93f940228d6473a855731bc5e71d65771d7c942de95c42071d6689e018c3530c99dff27e265c59cc36900a8c99d5219064f2c1b677df8c5566deb5d6c88c6f44da52bed98d79971de76b6ce92de821c5ea22da1a368bd338eda79c2478b57729b291ed674eca7e5c9c5406fcb0f0ff93f0414d01f8227ef10069ef0ab6399e1c781bad31b0b3562c900191e05ec602adf67cda4801b781cf2de0451d79eaf9a1c537d8bd7b80eb13597081718b5bfd4e713dc1505a0612921d65cd5c70928061888b63f9de46f0178e6e4243a3d30398194c2d57ae49554927c0e751fea2b1a02c29de12b2631c47d12ec44793e265993be2d62b5f9ee6d39d9c0689b935845770ddb421cc2814eb110d203d29c642add6a0d55ee70aa699a0286dea9467a683413dbf1b332bb29853e4c9cd6b5610482382098a8f7384612f0a60beb608861c8585e3274a8a4e7e9e09c336f5406c1c83b201a60aa8f4be6c7067915bcb8bcbb3634d36b068b9d6a0b16ee7b7e0eb801cb4c329b145d24da239e87f84fdbb4780ef74c0667c3352f79edf4092796c2f9ac044079c685f9cafd7331a26976dcc71c7e3f1ac3d5ca649eac4ac886c16594842db3e4c3fa650d3a9afa85598a7f7a29db0245556c941c903ac00ac685793e26f4727fad1319c29939c1bd1b04fb8ffeffd8f621fb1051397f8e9ecfaf8011004d50c54694f4ecb01e6a44d7596b936a24b21e6c1ed675edb1a64b240453e216b589951d0ef38b657512bc1798ffde1e1c439bceddec02e08786c2f8f1e36320de96bbd5ce6d503cf07d3a4291425499ce463374b1efb99dd225fabb653312d75f0d15b367f5083605cb625683bf1e9b8d9f986930fc92c28cd4d86a8cc7d532572238bae4e7a27aeedb1c6da0d7974dd2a53342370d52bc322cd9abf3b55ebf1a4e6d169045763727cd66d223854c8d6710767793943a4d20275178f85ec25800df84afbab1732520b5f1ac61d185de801ac667e8dea2c05959c155747cdc7c880d6e5309ac174164d78f6128d1461bc77209e22fab1f9128cdbc5e0b4602010fa64020c51c200315878419042eaa6a91a20d0d8d88eb309f99c6db2420493a3e36564bbe4a69b65a513fe39efeffd33ee3a8cad9bdc4879550be08548a763d27e9519bc4a0e475947b4d8d3ffa1436caa314a0885ec11d593eeb873f9d41767e1cd1e033df7088e70e4a84ee12c8a335ee8d4922ce8216c1f049110eba5bae2c3d3604a6781209f7652422168fe1c58c0b584122e1e2cb81b6492e0e40e2f9d3ab31fc0a156ef5e268faf6b9e94dc23ea8c710ed386bbf81fbd2ab1c7ca1402e3d917f552be4382fd4951ff8c076636a92a86d680f14662e36906f23380d6587e7e76681f30ffc49233ccad3e5333f33c8b6a9bd553c9b35fe453e79f713eecf6ce56979340d3df06de402f7f6cb12a769457522ac972a37a5cd4b2945a8e5d5d6abbe5785d39a4a27cd6934f250c84e850fef3286c44f9b6713ef11615f20744b7103bdfaeb0bce786f4c939f55ff80aece4c3ff0ca7e6a04cc521c280e7f630344a0e6467d29b64175677ceb2324ccb9ee95c810e82a9d7b22ed41be812b002e634e66889da005b461abd363356882e3509283c62b7eec44655393ac48ee8ac554c6b3c9b6a60b4cccb3ca8ae4d1c3ee458bb05c00d18d32896196a26007a81ad95b64fc5b2437a28549378ceea3191befea63ef8b8140a8d5e1769ae62515b03b739778c07479f2ccb105e4f9ec5d62c657a375cef0ffcf472e70d24b076ca9afa38bbb0507ecd5ef33417bd2e83022f41c8a6eebc256b8abd368007f06b909678ba3460403aa5eaad909cd2f30aaf89a9bd88d6c157b36e9f4bd406175d31c75d2d50b13534f3cc486558d612cccd44f72af020100dfe92bb07db28c06b485550f9bd9ac746693027a2f4474b4602138070f64b5c5fafcd977710068eaaec8547a6ffe42b08d1786e249891f4421f04401d0bd81381aed468c85769649b5a34d2306b109baf340e05ca33f0e29fec4c1638b55486cc7aa4a9385e892be067197ca945b154241cd529de9778527729457eb6e36ae1bee73e18604c1f72788693ce37493a409a500fe98afdda75f782cb2e6c0a2090e2d7f10a831b6fd9c09030fcc0f8994dd7c56c56af9d59ac70defe40e6f519770af21169173e17d5458db2c77b1c18d46151cb148b84994b3447a48a3803e97ab7189158c77b6ed90faef913dd6b9a42022a3068d4357165a9ad38731ca02f8b36c497bf9b5026469c1c0474233a3d2ad383879ad8a8a1215c53bb3ac31845cc6740ef84130836c10dee10a5b41f3de2333188a5b71d083b2ec3407ff627c7fa6567791e8e948f79af2fa97d023ff5b6f397f413280962a7030142f3d99fc6dce9ed63ccb352204e912312b40d4c5e0127292cb8b316fd5f0fe004de1ce450505d569dd278d93069f5f269fc0bf9c739650173b0d9786cddc30db004f160ba3bc9419c53277c8531626984efb67d346d5ce06febfb259a5a940440e9aeb3af86519aafc46fc7c2d294a1b973a657e418b3c0515978bf86513616872d5ab7cf4f07af33f962dc4b0bb30b2ad75e881ebbae54fbc4e42d306b50c8214f24d84fea9415c5f89a2d8ff880ff99ddad7156b03c794aeed18ef6b64cb333961cb15b35e0175aa7b88e5b74cef9b406cc75df547db9135ee74cfb901062fccff6ad320cb66fa17b3810f394ab39bd2207acf2e6d289343b2aa380dcf7c4d65939f88edec516fb944ecaaffc736819310ec438b81b0c7049d45cda323f3a717390b66a13c0577394c80535055a80a5f315ef7966d2f855af91990b344e62d111259fb190f32b0717ebebf839ea7f00509dd7e41f7de560c57721d33fc386f839d783455f0b208e72e542c5e3f09b782e5d633aa10cce6962eec14962fbbdc2e1e8722926a4fb9e95703b791e1521e15ae97f68dd23f6deb5f487a542e973aef59496da7ad73cb1a875c270feb19394da3926add7c69d3b389285108d94759a4209c75019d6de736f7092e15662397c2a0528b57fe6944e396b50213c404d40c5f065e55ed54c6558814cea6daa163650dfc6d25e9c88590eb983ab69a1db2388a6d56804b6b22d993abdf1e06f8bf23597fb4ea42d9534f8be092cc89bfc3ed2831da54e6f2c42488a5c40c5bdb83817f065c478993747b055bda05b0396da8124e2df39323acfbdfc63706fd9c71b48c5ab194ab9203e496929ea88852ad5830e4ca943e9a78111ec884d90db598c39a09a73a0ce654d92539094be9fdf9cb91a2d732aded0b86ee764e7c401ea40855c17fea4892fc7fe9890818ba47297868339437fd8c74efe6a807346db48d10bf94ca5b81948bf4300aeed3e8bf475264a7b4112fa46e72e534c8f11e95e1451d50663daff5edb28549bf1d0f5010b60a8514e37ceed39bab098accaeca49d9f13aafe232901e1fb0ccf8b88c93fc5432023bb6b65291bf146cf3e0632f8a0002ff3ba9365d27fa48b8717594749cf45a24afd5905298b0bceb270d6438455066f2c0170935680609975233e05fe78af718862beb5cb9fdc2d08eecf8da881de44143026d01efbd365558a2b7be3d09f077aeb5560db2cb6f8e4cac55e8975772c9633534215c1e03c463539c42a7dc9895364cd45052ebf46ff0acfd3f139e0b557ed56b2811a34be5a32214a4a937b86c301290f0dd43748f874c2f8464ada6513652e245898358d4209c2afa6ae163887164adfc598f2376b51e9db2c78541e5483ec9942fa3d6e0466309ac0ee70ad7dfbad64dc1886eaa90bda9a837aaf2aa6c29f814239b529f7e459e2a26cd649964efa0e228a8e78d5f5226111c565bb5933f58e0da23f312601511fe72f8266a66c3175142dc8f5984b09d7faaba9ec4395d658a76f5d6a26512cc943f662d567ee676cc8a469c63947bc71f70aab80b608bf547a96bd4f4b6fe907060c680e6df9875f3094a31d84b17e7b7c86cf54b7aeb38c1e0273646a30ac6b7b1161c7e1c04665a87f9870da88f97ab53067bda1ef54fb76c5a8d795e0e82d3934f864d85d3b902f0eb4a56958495b4aa8341ebaad367dcc3a12c83631ac76ee110f86b404791d2829a03fcee61d5e713e1d9073848761a170db340ae7592ba311d22cbfb5d87cccf94efc6ec9caead83911f0b6a94ceecf2f1a0655cae62f24c33d5cb6b27ce891f5b256855e127d915ec0fdf71d524ae01ea65bd66c8609a21b1b64018f0862c2f741c1c12b869b77333d22aa528ea3646e675fa1062c69c712e8cc67e71666a8ae7a2aaabbae2b574b1295d0081aaa7515bb8cf0a3c193af60500d549e873a219d3abd89c5eef06f7e1501c1d800057e298b2e5cb1247e6c2c27308eb94214f0dc87e6d0fbea215b7f96c4e9aa3386d5637c16c66a001b84c9b15792d763ac6ade6dead90b424ee8abe0bddc8e39df62e80a702b181a6456b511343f2bb65f17b756ceb1d0b5b2a0e02ce9d122f214d007be9a6158659cca21b4b8e0dfb29c905a50e131852866f4272f4f9d22bb0e6ca3c590b8053da7ca787b2a2d880dc529f4a4aa0ac37b04882c806469838dcf6d61c7e29d8f08fd9f7403c0c17d3d4c1c4adbb69521c8f37de20c3654aa0a0ad5282c50b4a37403c56a9ac7d8749d9d9a67a8e76c970d1479c10d5dbea2df546ea174008c6990003a749e936618f108fc0f91e7955f7d40bd6b09f80a947ebd6da59e98d9ff0e1da22101bc554018831571eb326f53e1aa6b4ed84cc62991cb4ccddb4cdf229574cad68437b7e9a8adf184249310c6d8275012ab7b50e345b8ee005e83d46193b199b825f96c3070ff647d4ec40cdc61bf8a3e6c8e6595d20b32a147738d692d084819f08e97795c2b6ffe5a4abb8e14937b5b538efe89c7533ce4af7fa29d7691fb8b4b05299b9ddf2efd5f38ae18c48edc33c768af311a377c422ab74a74e43fb5bb0a1c67553e68e86d0fd46201fd8b8407f7cf8d7c3748b21f253f80026d8dc4bc484b4d14a09e7346eaf1ccab1fd6ba476b3599bba89eb5f13d804b264ca2666d6ac00cbf3d8a38827c3381e5d613c792d916d529cfcadfc2d57c02b6df0b286c46fb6a149b50a8bdd989db44309f1bb9b65f6bae4c46f7e279ca3db512f9e4dc15c4c8de49e6b4632b7c758dbd8f2fbff2fe78a8d69edcb1d365a9c63156cfb3ff48ac99fbb50484303ec2dff6297a4317d62f8e7797fbe5acf1288e8f7524ae676cc02b21fe236ee532150e241c9f5c11c8ae37ea54459cab744b0a39e4bd3823a84bd0291738ba5c59fa47f15b766d84bd46a1b2d3717dce66f2befff6704cdfe106accd2317203d55ac102a5d9ca47a445086c347fba29b353c2f29e081f8de785eb7c34677801ada93832107130b4b78c9a0a1141541b6ad636a67f36269355a5c4ea78f7e859427b37abec8d1c86c1813d74d632d06c265cfbf89948cc67f6c9e8020d09cc0fcbe89a2faf4e24aa144fadffe567659001a19b11e679d90c479d501f9bf6cc1656211a9dea605592ba438c88b0452149ed9dc30862c217ff69a4828f5e2a23c9c354ba071435fbbfe7aa9c2ca07ad269b6030bc49dd702dcd622b575462ab3918e8ee3b577c4d2ec852007f9d828fbec6a6da64614f01639bc6c9ad43e18f906dc7c49ed268ece8d1fa97bcc22f3884200546d9e2b89ebb6e2921657e891510fdab5717f3a56360b7cd883f623af5b0c9dfe1f520db6e7eb502789e9a06ffb100e96cc4baf404338c89647172ad9dabf89cdd52d44d140006809f045ffe7f11b30ee69e0011d387a20fe05dadac33220f70d947b3a46ed0e248659581b9a1d6d6897511b1125838cfffdce415bc0fdbaa5f4e5f80a3401e9f6146412ca3dd390e247e9375f366e9887dd244609c1461e2f58075844397b557163cd54e6f688a5aad8a64a3fa3eb90d2c93409ebe54d7b8054633c47443d55bca8587327b67ab001484b10f1b5d52f8ea6a4a17e54d2b0477b1f60d3f98de7288b214de0997ad8283e03f40377989a57824764ec5093efed9735080a55987cd947397d4c809e556b911c1712425e39001b40dbf216af10569bd0a40b52479a3e6b13ebe4ff9a0dd861ee8f7c2b15398aa46c0c6356309ea273a54d149bdedf71180aac6986dafedbaa1f4ea9a77fcb80ccfb8fa6683922101e00b10d068d0ac7bd0b63f421528fb8d2d6a05bc85aec476278e61e1b947ad0178adbd9a7efaed19eb6a4db3b151b1cd5cd0d985ca3409384dd93a692ac884160d9a9e614e00691dd9bb9415fccb6a6172c684894a9d7f0e0580081bdf8ebb45680a02aaca25fd250d9190d603e49ac9e30a28f1b7cf1d6880307055b5000dc174f94a95043a66eb787d21f004a00b9fe1fe73936bbcdc44f3d01e6800926dc54fa9e66f76e803b7f483c97b391ee48b4fcc99f249bb5e200a1bc7d8fd3ff14312989002a0f3f5ac6240274bd3c0126f96b9e0037277ec2bc08344639c3e0fe6d4f89a56eaf162066f6a25c1d1cf6c9a94a7d8d3467294d63006efafb1d6a12e8e35ca8d3931fe9ff1f2497ffd718890bf32760182631ee8048a900d8622696a9000318e6c9d2a23aac58de55243afd5feb8c0e202e45f0e14b4452583186e8904756b0d9079e1c12d4fb664cd9d023fa34a288f8066f83db736dd75998a62fc7b1f5e6b61aae6c8c5780bc8b93199a702a71dc11a9d77883c8b18a86a310ca6c5f115f7a5804421623beacf9b27d2fd7ba66fed8958f666836480ac3128a076759794e074a19ad773b384161bd73daf5f0d337ceca775bef405b6682eb8d04f230dbe6faaaf8fc517d3365ae4b25984585d6cc88544d5395a48f0d37751d8165a901b9fbb9c45cd91a910f9317f9b033742aff293c29010bc60b10f71638276a5a260965dafa789bf03bf786043ab116482e6b2659f4b48263cc00d7bcfc403066dee65227450d663d32207ca2100244e69885aebd3e014cfb8dacf05b1d14a34b09c7bef0c696b04f6ff37a8e9c30949bf0d4df875179c43c98eba90af9e24c23a33f86ae6a5c2efc4ed5e2e2883628866f588a1dd737acc847447b65424801a051e2248c01748bf9ea979845425e5503eebf418498a1aca8d3166e0cb1da2cf36a107422790f186dbd3a11b33664ee2d1f7a48b79096655e4eaf5c3c91451e4229c417a7995280a76643c468eea3428e84a53a29702ecde916950c3966b93d9ecd414fca09bc5bd8401cc67c2e9c23e413b163cae90b688c3d1030ac8602a35c16bf8717c42b72e6fee0d02994a4e30239c79e053964655af26aeee8a7a88b749440c3a0798e1de04798fbba6511a1019330c864a9c30731d8a5b740aa36490715c16708d3037e7230844a247604e955843889906ed04bf1481a7f289432a3b61cd1552f3c47743472ffd72e445e2a217d7c0788eb64bc68f006686de658bc7c22633d9e691196ffeb62c9a1216d6429af755c50d53fd195c093896ee0fc03cbb780325164232a8234f7b245dcdd89c91d3c78c5f2c0be08a6d2781ef4c71d14dda5473b678ab631ee631a70c57416994da668459fe2cc1c1193c3ea04a8f367352e8c0af9bc3c77b1bd406958ffbb3ae4841f147281fe4f369ca24c97b9012eb8190f16bb7759620797ceb9345c64110b1f1fb6c726dfdd86acf096009be458a63ae520b0b77858b67864a9e3e5a25acedf36621deb0a0ca5b9a69e4a6baeb3dfa63324c51c16f38424a5c7e4cf6879365d8881f4bed51bbd7cabb0abf4985d75ffcfc3e319b8d9b78291782be08b5c2fa780a020a08479c670de8d8d3c8404492857bcdc51f78bf243ea7e47b4de6d09bc269085b9a7874db4edcbd6a70ff3ea707d8b426ab72b09b8a666641970704d67106daa607b46f221d27592e1d1b0387e4ee03257ee6d760a7b6335dca3a2651b1ab04d0bf3545086375aec2c46afb022d40f041da1df4ba57333ed2fdcf880304b186fc980c9a5a99b9c8e4e21440d998b83249aa300edf72220767de89dd8d20addd6fa6c38e4502bf3f00435930da85d1fa850e61e24f24c79082658303a09174621051cd7af2c189f2179011b2eb372406e5cbe0a0605577dd7b1587d17c8dbf6e8f93e023d05e8562c4d62f306a05afa43bbbd6a8641870137604b4382953c701a3e1d0c06e123911b0ab106b60ce30872f7d10e8e11ecf73b3d209e88c167b8aeab1b91a2a76bd734779f615698783d42713554505d579187046d23806a0db69e7497f49ea0fc7fa9e94dea942fdbd596acffda03b429044f1b58109d55e09d6671b7a2b401c883c3c19bf3d44b80cd6ab9dc3d38acd53850ecae15aced222080433cdd8e90fbb900d9decda472d1e7d776948e45036e0dca71fd95f460c150bcbe4f4060b1bb79a8888ca3f50d7b118f3551538c8e37ab5811261562418b36749ff23d964c7db8e84522b4335b0d9d06ae0d4c5a1303e2593449da71e4d21f865c769ed1475bbfee8c564e3c2b38e64bdad19a51f0686d95f2634a6dd9b4be281af75c14f102208337893be87ed6fa6d2e06843103da5b967b5c304eca4a07ba1a1904a1aa223e5f2977c2a15a44b5a346371f0e83a92d4d776fdf79107455332ed32f1eefe34b1de4c9a49e74f8b821fb4e1950e6372c4c579dcfb3be801d3dd0a868ec73b9b4835316553642f6de5b6e29a54c32058f075a07a807200f261a7863e75b803c5edacef37869e06b04d7f33c8e9e6f011ef97ccff380474c6ef87ccf1fbddef52db2f81e62d7fdff78d0cd77df53d6f32dbe7bbdeb73f880b2ea7ba5c20d9f7f813ca4940f092dcaa909b3c1c3f3c221c5162fc516dfe2eb4759f50299bc42f050d05ae4f9514ab9275777b25837dfcfd7e2c3aecbbdd78fded193b207f170726fdf8fb81367f223dc777ffb8e7e5badf6abbdf952d9411110acfb2ca7478ebb64b8de750745b0b49e5dd1e0646ba4ab8166cfef3e97f9386c45c36553e0d113f2a0fbf38b8cee4755c000eeb68fa3600a46dbcdda57d440f3ede741c7985fbff99e0b79389f42817fa809cba73574dd414de77be8633605ab9362cb6246ca92d124d216bbae77f9e47ef272e6893cba9c8e744e3fddb47677f774d76982c110fc2f78c43e22bc5a3af80267e0b440ce18564bf0ca0719257001bb5c5778a9218f3df332c30f5be9c42eec4508b64d948e581db617a4c159945a7819c102a4aa4a7959408046cea82142f59214e5054876d7bbba50919fc8a3cb69cbe13b943f639221fc5c19c37dfa2e6882e4114f185dd0fcc8f35b3eb5b607bdfcedef60bf7e4eef07d6b2b23bc00b1e3196e17990f77423bafee98aa660f9fd1aa1be7d1c94bea5e0cb5f2289472e5fba745066210282634540f04e98748a3a73c688284f9c3973a66acea86fc1a39ccaf49dc993a6727ec4d99df84c9f4c5f2174efef9d29f774490f31994d24d17dfa63cfe49400a23aee7b85c075ee217a02fb134961d60ede8f242171f53f7cc8362293fa2e5c11e79d0417bd1f3f5c7871f52ec444d6dfdce0cf99dc37937c53c9379bc818344703e79206a2d287ac82ccb3a906a2934903d19f4c53ca7ce2f324d3d7f99c897e0ece27d7348c3e76275d80d159c87400a3bf906907a3b790a98f2a7a6fe43f8fc472983d504ecda861e4217d9fd9758be6cc190e9e920c85397366284c1591ce7e066e969f01579654663a6194ca0edcc13ea5df4dcf6db8a6bdbbd40eadba9d7352edcb417fb2a4e0e19a446d97b10863021f521d485ad55a6b659165ad2e273cca2a6fba1327e2f4eb1259758dd8ea4cb9d6ab2181b2aa4a5649369a2ce361ad6a7156970b6f1f15e9d71d4efaed9ee4a3ac4f556b11f5b9d48a65557d299d3c64e361b5406bb07f95a4539b0c1c14c1f0649ba8658c9c96d16820fb78ca122061f62d0b70cf22b27d565e21878e099c60adedac025859036734907d2233786ca8b1b378d00823c9beb56f82b371a1b1dfb67af76a3e6557ed8630624253d22c5454308a6c08f2414575ef957f7fa765341a76ff72c9f7c70cf21d7ff2f520133cbc7f6f9edea474ae9043470fcd7c7f02274c19fdebd7afdf2ff6d11954e01c1e34c64cd071ff369613fcbaa0ee7d0408e9982b1910acbdfdb0b334640d116684f9de1006089e9d48035d2fd240b7e5c20d85f39d4eb60a2a3154441de8a49886691fb5810bf0f859d3ae8bd083b4d71e46cc83289a2a8d8906d2249877515f7324243870c1ec70c21a365fced94330f2fc580f71d95fb6705884058fae31cc737eab65529c47a4f4285430883ae085cafa6f724dc3ec7bd2ec210eb27d47ea219cec4cbe64bd09f466d6be6d42936864190fed7f724a9699fec9a84f4ad1efaa0dbe60fb128d0759a86cdfbad7846da030926802f13d04a687e45bfbb2aa81ecf78422e59444234159a66a9465b27d8f5e4ca79450351175808a8a8a8a8aaa082a4e50515191e99f8e00672801ce6096008ec09f3d888205104606853b8fef133404d7b737b973ccdc729ed040bdc58b904454c84ba51ee222959c1a887ea081e823d93165423429ac2450b17e48dfa11a887ebbd38439114ae9039dc12ef7f120a7d22b109d7f279d7483d289ec6f974f88da3170c6d6cee595449e54c52d8f445218049c3c7b452389fb6c8413667ffb82c81f362c0201962f45f9c4839ef478f084e5cb2954bcf7626cdfc549430b43450583880c19a9201f54441da04ef25561be3b5276ea24a89e473abfab79fda4140fefd7ef7e39dde6e5d040f7bbc9fe7dc9d4431ccc64d5bcd795f2bd7f5fc36f3f2a9334d0fd220fe05132ddb1350a65716df1a03b8649482877ed4ee5fbd9becca1873cdfb73165f5efdf71cb7e7fae46a8620595c82532c919ece57b5f68ca98f8df379ab223fadc5f2647f5bbfbe194ddfcfdd8ecee2a013df2f65652a4ec9fc67aef73dcfc4aae142033eb3db0e7fd09def09ec7cd7bf71da981ee4ba609bbfff2e75efedd572d076843c8432fe3501376df8bb2c0670067eda5bb909007793f651d7841399bb02b993cbc2f03823370b3051c296b6f0199b5af5e571d4d035d4fd340f7e5cde1e17d09daf0f0ded6bddf3f1744813ae9a8381aa2ec902e5dae07308bdc4f5db07ce962826ba58b0d9b54970f683a606c858604be91c2228d21026a895a066fb99fa08af8414a8d01140f2b2950334421a48e81f2a13959f1b485c835027b66b619c8744fa242b084125b154b18b189c15aeea7259a96983d2db1a429b9f8ba3816600a3f5988cb0f427462423119424a762e171e72945a5c6800010e0e4a74401004efd09413bb5c5c007213138ac910b221ca06291c6c050b0946036475c3cd8d3df101efe2ebe11ca058b705495d12272b2538d18b9347040cdb91a90e0522b83a5439ac911c7677487258e711e7fb9cab0442b40e63d884c7964ae104da44df0bbe6cd43bbf93da865d1386c359833a09618207e59050d2a9104d06ecb9edcfc751dfdfc8fdbb13a6699aa6693dd543d7801e227df9bf62fd1481c71fe7521833b23165ddcbef5ec822bcb07152449717fcac082f2de4389393271289e9a4e7d2f542807bfb5e36b87fe1d8bec7832df335a7ac5b10e54f64969684b29c4941f2a7110fa23090ee2b23efd3daf871bdef47af18d0227d2337c269d6896a54ce2373e9e5cf38246aa3be942c74f329a50af0e877019470bf0e5209ed873031101126898876b1e7e197228ad0195533fb0588a5a96656bf3001e233d238d12f4b45e4145233a6987258e7f1e22f4266a84122210c1287bdeb046b079c41eea7253d703d2c31d264c90bf7861eaa7cf42005b7821e5ec022f713142a33283a67bfcbc3adebe1966bf3e9bcab2dcff370cbb5855d570f7f9ae847c6f01f61b9a158df515332c6588691b9ef677d366414d4f5f95bb5bf32847e604534cf8f3ef779eee9a84665c88dca10fa8165f9de4d1ee30000a176ffd27c6bd56aaddafd7bc119cb422bc9d16a699d99d24b2bade10d432efcd1c209a3770c699e7276d40b478ed6debcc5958ed29ea3ecee3ba3ba0d478a618ee5d66cff6c4275524a29a5943fb9411930c239a7a4726e90e5f7c8526229a51c3950c1745d7777b7badbbbd277babb6574378c2f7b4829a59452fad3dd17a42092aeeb0ef2a7747a78eb75f7e93e152505154e77979552d0e9e8eeee3889bbbb778f3ddc6fd4d5ea76b58aa4ca79ebbcdad7efb6d4c5d2bad738aed338b0350dec7bb58ae46a48e66cc73c58f23ed5b4ab81ad3da56023413227d82c2b564ecfae68d0b7b6368f56cf8edaa2587800ed566b35edb5bbd1dcbfc3860ea92c32b4ef460e72e3ebea604de42363785beaea3aaee36ad7711d078e3b727d59c1ed7dfeeba5d635f0d2f95b7f0d0f922bef66ecd97778639ffb673401d7da444d6f3ecc72d1cf57fb963b32ed0972ddb592187f725151e7799da5d4395f2d41b3c45360a8e048243046e8c8bfd46708cc8f2ba7f2c4c1f51abe0a0822860a0d5232a811238e381b497db1320310212e6841748eca08bcb074b4d49021b9c505134c4ccc90e7741df1654cd0d4e2734ef7af864b183e372377771f6aa2364827995a8740bbbb6ccaebae832298866c0dbebfbdac6afb76cc09e8f0907653120f52e2414b3ca8be7d6d45c3adb5d6ca231e44ff4ef0c8112c25288d7848ff95670d79e4650d7ac204750c35e1f1be9c80873ad6e0cedbdf1fefd5d140f47b05824f1e52017d0e3aa88396d55852c289c81b26690bd96ebdc6522bd14e522e9149fc479944569fd65916ec06aa4fedd32b896412faca97021dd2af9f043a44a1615407a5ca9446a08168924c951a883a25d282c329f3924822d931fce9778f05c874ea90a99572456382f9c60f65d5b09393f33a3a3a9f335b1327cf9d6f8147addff99cd6effc51ceebd4d6ef8023e87ccee3d00173401c3b6008ba260f159552e48e546ae97c37e7ef5861ca7296a63c928d3c2707149a309d6fe76b7d3f56f0385dfd57aad9f40805c1fd61ccf5297838a74c68cebb5ac23b4e20aa01b7acd94439c9f3c9092669a4b97a7d95805a3badfe4bd34e70190ba51d3c88ccef29836879944a4bf335aef653134ef24e9e0f63054207d9ffb997de43f8b9a73d84f39cf763cd9ccd1c37e2cc5dda40f5f1e70d54ffe6930d549fa5e5faabfa5efdae36507d9d06aa9ff33dcd35f7caa36ed6ccefbe966d803cf1fc6e589e9b8c0abc7d57ee27addc93505fabdf711cf75b7dad72dc083d61b57edbd34fbba0e7219114eccaf35d3df422cfff70cae46cd7fc5e4d254eda273c1083479aa72b06d3bdd3eba008f6dc2f33c80ed22b6eae3fcbf3773e27b2e4e17477a7ff720aaa70a3c5bb9e84167f9ee77180df031ef53cf83ca0ebc805f268f12df25c9e173fdfb774defd73231eca3882edf40fac31612dfe65a3450bf055a5c8f32f1c92a7849e7781474c6ef4bceb79c057fda31e90490b7c85d0fafbadbfe02b849ca79ff3f45d3cdfe271b8bee75ddff32dfe80af0a82afeaf3375eef03f260e23d8f57f72fed7d5ee0ebfeabfecb036fbcf89fff0179bc3a50851bdfcffb3c8e9ff7018f981cb90079084dd8fc0f84c201fef71f78e403e6005f80af0baa70c3e75ffcfcffd7e3f87f81474c8e5e803c421c1abcc0137a886337bdf851c8e75b7cb5a0be6fd1c58f61fe163f90c92b041472bea5bc179f8bffbe0cfee7fb073f0d781ec706effa0ada68f139360099d0eff95e95878767830700c883e7370099b43a97eb79781efcf9231e7005f05dbfc19760840b944913f6e27dfee7c11f65d2cfbff812c0f7015f365ebc78297edf4bf17b23eff95ef537f81e620b1b2ddee7370079b4781f9049cef77c0f917ef5bb9e8f07931b3ddf02e4c18484167f68f07fd462be06dff33e5f8211d8c5bf7a40a964c25cfcebff35f87f175f8206ff025f365cb878296690c14b3183377229babe16793e29d64f4a992f99dc88073938df897810f7f37dc969e6d4e4349351b2090fe7dfa7f7e7454b07fc5c7c39df7f3f1e563c61f5ce0a841905cec131fcc63077bff3f510597c2c9ee76fb0789ed79e27492b2a3fcc2c48663c2d52607013e507ce94266e95166851946029c14108a16d168959914ecb0f47b6193544707dd893fb690a1aa6107243cc0d0aa670414614532061e9ba82aa61534576dcb66ddb6fdab6690f5e0bd2da734af82e4ce794b429959ef780a58713245dd2c49046cc0ad860b901138604655ec0440c42a2949ec012444a0f4c88b419009028448c90b162861f546c161777a58de4aafc38b352e2a4f997c980164cd9a2e4022857ac189538594a82449436372cddb4b0030f672588961690bc2b534bec8ccb9227272e00b1021594c1c2a50b1b1368a102e60446925013c5882ab0a899925c95326accf49a214f5a70c51369c038e17a971a971746bbc2c687ed0557bb32848a626abc5c5741f6ffbb23849a28ae479134432ce174868929512410058a2e3a78e08929ce10a1c1fe38e2663e09c970bd96a7c68727b35a8d6e544ae0f9a026078c5d58cd0b69d6385d6981e39e77daf5b129abe0cfa4e166be18610d31a319c1160638b86025c4115eb63c6149338446c402812d960d4a0a6b0adf2735608dc94d12cea161d5429a10581fd2002183a68d07a618836350bfa0913a73bd269008d996ba1b6b228620f7e2ebe1d98475132f80406a0c1b1868c4d034c609199694c6407dc0c910a7313f88804611a4313614a121c31825213496a670da6c60801041967fe302103e3c262868a640911ac212c372024a122918c18fae7ba8a59383836fb66ed92bafe3b61b86b1588d29732039344400020420005c96524a19285dca5c563aff6331d9ff61188bb9762407a4df989955abdb76df6e2fbfb673db36d0ab46c31b86dcf4a19786370c393a572b1a75abb456aa71d4f3fee7355a6badbfad2a57eb56a9c7ddabddbf17b43e5a0d2ba5d45bd1a85da5b5d2d9cf0cdd0b8e640c78eb745d4b2767e238f61b777797ce5a799d739bdff9b6d600dd563a85a64ff93e29a51474df617500d6489fb445ab4ea5b3da1cabe168f8de1bcd68dbd97638961175ca505cb7ea3ccf5b7595ce158b63dd6c95ce1b7c318e86e3750fede4d8ee2640072073393db91fec1930c0f2629ca353755ad467a5b3b533775878936bf674ea3c9d95058fe471fdc78c2676a33abf4557e7f2765846b31e6aa029b0bb5faa02cd18a8b947774fef6eeaee73ce2983520ac3fabb7b2cf44fbabbd6f5d0d427c5c0c66997eb56ac1b9c1caee55dcdf3562b1af36b7fa3cd7405829cde0eeeeeee6e9ae36a6d77ce39e7a493ce1daf57945ac03579e8d534bb93a70c18d68358d01f27a5e37cfa1da57452570fedd16cacd65a6ba596d2d9e352ea28edeeeec640a5d13fadcf39a766eb9c73cea674d639e79cde4e12de9ae6a45ded6ad756ea74355b690e2ad0ae76fd6ab6d21cb43be5d4ee19aacd1cb4ab5d5ba9d3d56ca539546ab55ba975a2b5529bc3d52acd41bbdab5953a5dcd569a8394eb935acddb364ed39163f6d00f4b5afad032ee3970072804bef1a17fd7755e7dd7b66ddba6743df91e954b2ed9cd29af5cba74b55ab1a6919090d08a46fd9576e336a4525196203e95048348069131fcb51d3229fcaf968954d276c824492499c8a41bfa37f862df216338be4f3cf4bf2e99764822c9a463f837c9990f0de472c992abdd2b371d2a1967f0139a25a694775287cdc7fe01f7f36fbdf78439679d73ce399384baee3fa11af5a3df0f11d85f3a49a7452ea633ec4b63b4e49c39e25219e9a8a2b84f68b870ae3445952677996aa1dae1da7c2996335d2e0d4b6579f472f520d73323300326574c296d8d3f79e6114617e5b1c8490a2af27c570c9cf2fc9f5292e7875357e4f931333848c143273916a6933c3fb855fb96f627cd615463cab49ff3e23a7fae6059e4646e91b34c335ec13d000d52248199fe3dc00d51644a5f5bd1a054681459322cd30324d1d12bc325530164fa54a68a4cbfae6850ec845b5436e5538efe4817266d21f2d84950facd26833ca924324a2349c82599ca27ad94e9d3bfd8f5a154914c5fc8a8860d289064fa39743c65fa27ec6022d35fe10928909e48a221d3974a1ed44f50d890e9cba5233f94bc00cac90f4f30b022cf6ed001e32b45647fa72dac28c60020a3a463c3b5329df7bef5e87fb07dd2a693e9f75bcbfd91083a0efbf7716c2f09e2b8200e0e7c10778c27d883e6f3f0903ed20a3560f9d5c8bbaaa5152412a5d456798d09a33a6cd8daa4058f5dc56385aa0fe99dba5adcb7efb73e0eb31ffa07f7adf57efb6efe7e3eae533ae7fca3ede9c7b43f811c22a5cdf6650824d494dd771181af44b923b0df928758ec8bd14096d57546be6daf1bd76ff7b703ef1fdd975fbf93553a6b87d5fb0a871457208f1e227ed949272c259dedcddbd50a34baf8bbf96a4c98fdeed3b10266fd6cc132488c6c3f4624db0bbeb4e77e6ef7822fedb70b767f1f47f777bb7ff4d2568fe3be071e797fbdbf7fb4b2f6934a1366397bed6f1f934c9a305bc3c8436bededa1ad873bd74477b5babdfdcbc532c74df0e79c200a2b1250a0bf6d1cc7714ddf7ea394b9f31bcdee3d77a7627236eeb2b4ce5be19c1c1d9d1c1d9cf33447e7e61b1c9fd21dfaaedbe1e0803fb3fd5e09c079fb9eedb3f85ef8fd59fccef7c2e06b84f93b8fc39f85af123067c6f92c20dbe4168b9dcef99b16b7ad341d9cc7f83be7dce0d0efd5f886b5f23a6ebb1ab536b0dab3f655df73e7561a028f2d95c2d57cd096c3e8bf7fe04febb5d6a746390e0c8d6213562307b6612c64ba44a648b08044077cc8f4b9150dfa1fa4a17d65081012485532fdcd4892d55dd19843b4f9d26648f6d77094bd424b76bf4904e5b165450c32bd42e98a14321c1152822656c411f708228a0d4ac48881820c0ca251930d50b4661018dc99662a4afa644593ec5628a554872832bdc994524aa9076ccc64ff66b144277fe3644b6ff59ae7adee6faf11b4b77f437b0b82bd7dcce71f599f1b388fb87e0dc4f4489bab1bf62f48c11bda77a0dcb8cd1b483ef5ba82ce5d0e3550779353a5d4041d0dd41f94c343efb92587093a7a68d3f0c5df060d73f9e01600660142c8f5e78ebbd5409e2fef05e9b41a5d8570b3c103565fed1d1472951ddebb815c6bae7903bb81ee57cd16657700840de41f0443582995b606329a9928e80ca31a2254285a1811b244d18245092e6aae88818a263bbce023062b32e030040b8b5341edbaace809709bd9c572c49d4b66e7a282045d13acb355db52a398d544450d68a88801df255a16aa8e0a21d9df08bb301548790c9db868c11244cb1522b422afe5ad81624d981338adcad4956492541e6f161a825ff9355f13e4401e9c7cff0bb4ac03651087d120072905e9df06a29b34d3305a04048f324926059132c80b462b68434edd6ffb5ed6febd4a49dc57b796ed70ca1248c3e8278ddd26d3ad822a7896407aa83e750f23cd34109d4d3834e0b965666101f61f6716a7cb041c53e82dd5354dd3344dd334176dda5c91b72d79ecf1246bb5b764ad35edb51f8b726b3fca187f461f4d7b182d83e1b5cc6b98f6da77fdaeb764cd6e09901f76a8bdfd68871d6a570361589aeb0f76f5d57293e54fc065edb96577ce23ba8b77cc00321a8421249f1619b100f70b19f590cdf2674c2754fcd4806b60c079f8082d7389c9f46df410ceb40bbd0eebee4b697f356c78489b82d030fa947609c53458a381e804671411295194e9e3167d6f56d1c9bbc5aa46b73ba5fda9c5648d491a933139ed9431a159939c56ce9f43f4908d49199b4941de3fc79454d4a4d3650fc95c3466cae985355454b9e228044484a9e28824aaa801c4fefe8833c6b2540371e036cad94f50091bf9d7f08f09752d0861c1f5a3948240470364fa3d72fd6a1e2b68259b99f500576f7bbb5280b4b6ebb61d60c1ddea65ac17925d701fd162f21287f9af3e99c461feb57ef7f6de5aed8a46b59f9c7d444ae0ca3465d24ac3fc87981dd145cedae00e9452e4139944c912b9a52b12b2424c5836c9190b5e20c80118417219613aa94aea49adb6ba6660a28d0f619e346923ba00ae40a9c28b133e965820734d98df27f2378010139ec44f0db8875ad96566bd070dc1ab67fdf42c4dd2a903e5cc4337aaa0d08c9bb5d6e97dadb5d65ae7fceeb3000772d7d9fb2c203bcf1a81c1a39067df3d2b33cd5e4f093c78600abd2577e0e7b2dfb2bf7d57862492f6c720bb000bba8001272167fe2278f843e0f9fd444aade057e4a1d3286642b3269d301c34908d39ccc23a86fd1ea107d02dada168dbc5005686681af0e872bd078d9acf8f07c9bfc95dff7e0974bee6832e2c5847bb330a1915af7d5f77f74761cedf3e14e6d7afddbddbb66de0fcfa3e424fd8f4ef45ff66eaf645c1960f91145c0022f02b3b61620b10554021a209517aa0075a707f65ea3c69ca80c47e579ab2f982d8ef4b537664ca68192e5149c4860d11db8a219630cda64c4a492122f67bd3947162bf3b4d99074d68a822f63bd494e96c11fb3d6acaea17b1dfa5584c4089fd5e35659ad8b788a403b080050ab19d0462ff3c32653407b17f2aa14d98a4920e66a688ed1ae234651fa059420245c5fe29c56a9aa940ec9f5553e638888d4412eb690468968e4c997646ecfee00c0e3888ed2510fbe96ccaaa0fb19f3651a7296b2e6b740842eca75053a60325f6d3a829935134816008b19f4a4dd90e0e624b229ca85421f6d3aa296b7111fbebd30e3ec4fe9a3465210c94a6ec2eb17464ca660c3e40e58bd85f954cd94e0f627f753265445c4e3013fb2bd394e9a4994dd94d0f4d41a06ad494b952c084d85fa5ead4945d29c4fe5a85346531364124294d59cfd3d29129cba0044328d9c888fd964903189c11fb8afdd669cab626c47e0b65a3a66c674d9a16c46e2e62bf9d9ab2dac5071ac47e5b35650110fb35a429eb1113f52369ca7a4aecd794a62c06c3d294c92353d6f9f041899329d3816202b15f639ab250ecd76653b6f1e001b15f6b9ab2297e40e64716b15f839ab25613b15f8b9ab20fa0cc8045ecd7a4a6ac9524f6cb2a4f421247ad6abc48b99190903a80248e37293712121212120b4848e27895727b89426c7105260452c4161b9155844d13710749ec290246ec17329ab22e860f8853e46040234eb165c593d87fc28e2963c1021688fd2b204d593b010393a49d19a4965a449c408993296b2d25616a1991a5094a8717c46689fd326aca708e8411fba5d49459f11a11fbb5a9297ba4febbe44100d821f7f7c6c4bdc00d3c9440ca10499024d10305532471810994406386480c37564880b5644084152bd83204c90c49db0d21a06282272d422081a2d3b4c309d14d0c315305072637dc2006862b57405184102900c20a182b63b82c77460d115c1faac0e5a4cdb458194267f8d3c29e4b865091d7f2c981e2cd68d4141e7aa88ce1a922029d20c02081a79409220d4bca122d2a3e565294b8a214b991e2c35545871b2a41b88298e1860d8b2a647c68a1d413658c0651927433a99694194f94a629243a25cbad42b593822a6f76a45525898e4a8b1914a68205151d56526858b1e04a41942b88a76e76654545894595293c4130ad52e0c54ef9b24dd9725305ca7dc202a2069d62a8542cd9ca6a122a433300000000009315002020100806c401613820184e56ce3d14800d79a23c6858980a244192c3208a6120c418420021c600628831c620a5c87800e01ea2989c61491c76d5a3d007307463ea9273e6607c3dfae697dccb074739424342d4cd5b1a094727c44054bde51d34f4c82c4be23f7933c95b0bff9f6203c453197126ff814c2d3a4b1dafef06ebe32816f836ca247aabe049b1f8d3e08a368d15a693b8586a8cfd82ddcd3790d27ee1d2ac28a87b533730abd7b528c8c5899c1a44dd75133b7a6280ca3b6e1e3bb395852902e6e094483dd9c7ba584ee11e3893dae3dad3a014b8178af0668c43f7d3ffc5d046c35a5d6b858a9ea47af110250eb1bd7cb1859565bd7da26d95e7c7e10b9f6d3b10a04aa2f56e8b8ad1beaf3735f8fcc867d9de9c04da32dfea01403b3c83116f6763a2903b92f3fff07230bb8f7cf097ace31e5a874a1fc21e43396b1de42263f320379e44d52a1fb75b7738c0ddcd94403ccca0750ae106c575358c3fd91f54c36dc8f203975110c20dd88de56fbbfbd878ddbd819dae07acff2d0268131a5c2552eda664078139b7694ab33134a6e8a54a0e47b87068bb4570d2ca05ff15453f9fcd4e6da97c5b1b1443edec3fd54657a2edfec7ea710629bfdd5cd00b21c9cd1b3db20f1899e115ebe0c41663ff00e1ece2e9d915a745c4f11734ea23a6d02a7d31a4011e3d05405e25561b7c9fd621796718a5cf6cfcb45b05995abbabd42a685040c4410e5e86aad5de9e3ae089f2ac21daa6ae8e3c50989520933d061cd480ef61aa44d4b9a96f53c89ecf0a0e73064d06e4d9b5d136597afb8b3031b3fe8083754bf3d640baea529bf7328cd6065be285572ea8a757e8076dc6e41949224cb2330243cfab9417214ce5f0309270fb3aa73ccfca6399ecc3d647bceb27ef3e9c222d5be4fe211fd43c487ac20e6c246a5ff3a0036438d5e713c3fc5145db92b122cdbcb02b7de4f4e764538ed42370cc719bfcc1e5c3cb9b23882c5fb87bbacadf2bd02fe51bf57068f8b144d893acc8f64bb497537e6bf84e907ff0d27708f2c3b174b2b0f8e6fc3a684bc47e6fd6a2133e8495f54d8b0bf3a4a0012ebd76d5117d5a662ea45f25c0ea9d422c782eeeffe2f1b2897a3cb227679700bb8047dde4138af16211f00a858c3c4f5dc1871c7e9efa0263aea5d2efa892c651e807c668759ed2feef344d0a43c1c6bfd88d3a27556e2bc26eb22ccecc42357848b3098fb6c642bce4065ea67e6798f0ce527c497581ec3dfac791bfd4720047ae257d9eba3fac7f43cf686e97128a7ea463457eccad0536463c0201194ac9985443bde53d1207e3108abd91e746b544f97c0d260640d1a97946cb2cf6f76e6a35aa99674c8a9d28a4f6a5f06e601e8594b925c5f3b5bf9b118a36a1424bef19d7cd594c5c5bf1a8accd2395397a26491e04a5c527bcdd31c1d2aa5cf9396316e725137bcd39c327f0fc91bf2235d560ca9d9fbdc6dd0f6033e9606a224d4b4b98b6a59f0b60a7cafdbb81982ae89c8504e1673083287abaf2c78ea297831566cd68e250961e832e42405b1d9fa23928688ce9f18c7fe89360c44e91ec6667bb2005fe54ec8458de954ea53b204c888399fac203a40a719a728e303066217903c0c999abd8f9ccb10b4cb07c9003c9cd9df1f8dabea96a6695d46890ca111ac498c5a03084684c2d82646d020d58eab086b13520f151f6385be33171692073aaa27ad62090b4401266c3b987b03775f1a39a3a8e9c2f269027c9aa92f36ff77340eed666cf7f838aaec279142a9edcd93585852c1c959182d4852b80e4f36ee283f86179636346c63e53e6b9eceb6babcf9f9d00c6e36ee272af6323cd42c206386dea7c82312e1a28e3c9416a276dec1ca119e3b992516694d0d094c0b6862940557c4dbe430becd51a07f6c8dba879aac93fbaecc0d55f7634f3a659a201def37083896a278ca1ccdf532a3aa8fe8d81c493191eac0d2f8219f7a9c4ccfec233b80ee1182e7f30e8268d2459851772f9ba2f314d3ac90579892a7f0ed206f74f90b34be89f0b8d1d8215fbebcdf8f6c43e3119e26432ad6e8e8f884c806ff3fd0a8a387fc77b3f580b696643037825c0b8f4822bb998a565567253edfa81c04ab2da966864a2a3c3f4eb34b3d43c7661388c6af2349e43d95394c7317c0587f2898d94a8fa53e3a0df190c2582dd12b1c65b25f6cbf2e9d3031fa5080f3729568edcfb63476f4412df7a045a6fe5891ec1754cb4002ee8880e12482e41ec3c110d9239c0aeb8d613627ada0dc416f2feb428a56cab2209f0291ecec6d9748f618c5b4da2d646d5ab00eb014d986347d99e77cc3d8c08908e60f5e2c58b63be9cddb6b41970a139ca2114b22bd8a1773de3a45f8d127a34befd48c1ff782340c0a0560db95ccc2d84fbaac47319985d7a4dfae778875e24a0e976af3583898daa8abc7bb62c40e32326eb3973495eccdf4d29a4a84b8c3b290e523f5524f9533401c870b6edce022e3443fc1cc0efb8f0dd65bedabb2b99b6073800fdb960184f1517edd2c9dedea1507e5ab679b014a9634aef92e89a4b667beab96b4a011202bc013d2f659b461517a50120855d5c23c62094bdba8402ee6f9b7bf73ec888be0dcd2b20d95f5a3c472cb18293333a3450a7ecb6951ac5e01928ddc9526c47c613f655836ef5920f19bc8455cf14d13634daf42a05f7691d3db2fbb068fafe89cce10ec0436fa093844406164f66c365c9b74cce3f0b062e235f390621e61d1f5c497bb4db2a234e8cdec3d175f516ef1b5ce9ec3f6646e887bbeefd1fae3071ef45a3e4ee8ae2f517880081e72eea4bc0bbae042fe41cdeb6619d8630c79336a0a7fcc9d3d11929b5f25e715c6b437722065defa53b6b78089ef787c070b6fdf70fe33e07b46ccaf6df44432a8204d935ea69768c632c86f65a37b258778faa06e30dc20178077fc2cb6f60e9e8fa4ce1fb8e9941dc7008e69d32830d0750413be05563187648a78b094347c8fba6176e44ab2f5209368b9b441f681a3cd9ea50932f02262a36996f607da71a33c8b58012583bdee0baf0872b18c8fab4f8dff3b484a879c1c11fb2522ea06eed2af6cb3917c704baea7b8cd6897cd9027e9a264485f866c382b4e9b4e131748c522b44f7f12e707991eaf78a8fb83c028913427aea85a87eab486bb08de0dd161e3c18ef0179a0e69d1e1a0702aef80d22ea2cbe49efdcaf406b7dc257b90402495d2a035b699f63f86cd5d348a097076198dee208bb2d80254efb81f30d4431f4cb06454fd377d44e7bcb22c78ed4e5fa9a79f4463cf1b9548e441409c5db8531d0a8da541c6254a8cf78b8cbd42a36a87d7455322a91e2ba919e607a678dbab4dbf18931d96a5c1d4aa630856788b8af58cb8acc984ac588db95860277dacfbf952e0c7d3adeb203a4535d4ec8a28c01efec8925aa89f2b212e1642f7660a29b4ce4a7dbd0792303729030b59f7094eb2aee24b920d8581c64807c6dcb4581972a15aa8e68499a09828e30152bf9963248a9fba3c5e035214a1959155e9adf638d6c6483949fe6290053adc37a8f5d86053212bc148bb08dcf8feb04306853e3d2b3f641afccda1f6c90c986642fca22db0d58d2ceb7c2e4ce380f4cf46627cdf581f8faa038c4ae640dca3b053dc070038ef388cb834fccac153c3e9f7332cf58d5303de2572bab74c868811427730da9ad83a04033a9605ab1861cf48620edacbe572e4e4b92cd3339e27986f6a8d7fcca6f15648c1048dbc91d64e6d9472b1e4251bef92e746a4b050b0c503036aa868bdee16e883c9678611cd6e82853ed46027d4ddd1c7520b1aec88aad9b2922764a1f76f384d9993551f6410dc2ea61e71160562d18d06bf4aa399bc2efb8bcdcf23651039ad73069b4f7d0a4b167a9bad3b9c22397459362abfd5af8dfd5069901792b1089c9f639fa4e7dae3f493bf308c4fc32637849b354e677ab13b7a35301062d5275f0415fb01a52ac4475b9c8ef1a40fbed23c19774a6637c0da34d824462e2fc461cd8e7ce9d403261c116f813336688c98a616ba8860629d4ee6cd62319098df3521fa93769980957d84095c5a81f3a6ca5311565ce4b25c243ab8f38d230ba0a12e980c7f5a95b8bc42dc19baaae487c33604f5dd1793ae17da3c0beb7c63342c8648454b4d2f8f9bfe50307c3113ff289cfa0abd6ba4bf8fb721a070328c260c8e9d75180000dc1886350492bfbc1c319bc999cddbb8c6333ae26c8c96faea20111a06feef4835331eb680cc012492f5093b09098da1c3af17c48447b516bf6f21ea54da19001149849d3116376f52592247648ef806a40ffc320044bd978969d0a8587dd26d0862bd0578fe3c87badaf9e28d93c4b1fb651e9613324429849389926b7794c09a1916c9ab02c8233500bbd0e92c81f1181af87e380214644b261a7c99ee7c86c155f76ad60fcd772f83af49ce96ec661473074d7a5f67c32cc2fdd71d8721b1346e0a6f61ba694a7af27f452e92ad5c24834dc0149d854968cbac5ca3e355513b00692cd64e9f3b61bece82a1f57c935273a0d8d458345f0b9204c23ce0776a902f373129fd2fcbc068f3cd36110b6c9f6f97ee1178138863e7c863647b0c5214a1d76c2b7f40dcfe4cadec1ee1ccd6fee9d61ef7efe665f1f4fe3471be7725c5911cde8ee65eee77e76a6cdfeef4b5a25d25cb9ac2c8839f84c7d589ccdf9886869eb300c1d7c80b49852e9b8114ba52787545314538b10a75e23a30952f4d75111dc428f66962e6fbaa38329d97f06aa655e227cf1cadc4d90409a84b831ba926f66d28888defbfbb3e8d1674b10a93f155afa178e0f509da2bec741b1a86dbe6446a57faefb90d7dd7986f60c556ed133e8c1467afd4c0b77009ab8fcb59f1e1cdce6ea77fda216eaff9b43a5be736786360c1422776f99e4d9b08439453e4471abc97c542fbd4536b55ff051486b1ac200a90a25d53b7fd92eb21a5a55f6c7c5fcccf3c7e0f93579b70f9ef52533ddc762e314dd7246305787e28bda4d3af11c92572db7824d26a602dd8ebe212d131a78995f4fd0d0dbe272ba9d218485f5bb63ec5b50c854785fc413e204d73797ad3d6cc67ee3a931cec9ae9c2c05f8286ec279fbd7eb3d99dbaa50bd3158e7d605531f6ec09d89c908c84c17e24edf3e6df93236ae9bc8b1ad359829cab42aa90a3dbb29594140bcfc40448aa6713866d3dcba092823bd6940b6abc5bdad600fddfe5cdebc9eefc57633b58a64b05c6e0bf7e98344f717428226028e07b16c1c496d41505a1651d684686a1579874244ed8a70314058d044d0d12046c4445ad28a84770735ee0b851e816135ce441f1e07210ce445160d20de1091810d884f77eae6f0984208904480d12006e4440a6d21c64024c20488633892d80fc1602b224023909144162410050d22770f7c40db12bb28070d321e4df4440c72d75af40e0739da2b9a62224bd0683c1a5d56fd5ee9574480ff01185fc8800c44a1a1f18a12bbe60b82b1b2693a0f672ac44ff5cf47620cc298514b0311de52b2f8f1a9fef920c33213c458b5e705e6742f194d2bae2bf5fd0129d0bd406cf05329d427e8fc66fa622b80ea5e48699615fb3340489ba78c9858b5e1136a8a32778c927fbcc9cd99d9a3bdda0e311d029d50417b342dc917822f9fbf6eb38f90ed5b12501aa30dc2d09e46d8523261d9de2488fb16522ac26cd18fa1746c085e1670bdef78c1f3d35e8c27a54816eb94cf4fe5ff9b6992a72df8d5c9b84aa6254e826096d247152efa6745f14ec1bdce093e3b2318204a5199bc346e4890f997b48dd7e136bba45c6182bbcc9819b05c8d764b63723af69c9de24cd6bd1137d7d06335fb9542289cc3f66dec9dfac08181fc7ba2ce4b587b5aecf382de876238d545e5d41c04416dbeb0db938b197833034539f5a9c91b0dfc25b553c7c8c1b9718ec9e97067869848cae06af27a1bdb31e92b821baf98a2f5c6640255b42e23d61a3c9958c855b5fd2f79fd9d74cc5215178c38dc8da3727c90016d9d0304d2ca6fdf3b3eec1aeba6874132ac2fc0dbf7968fb90a93598d6231f390652d22c3605dafaf3452c40e9d422831b3fd14c63e981a52fae9c42ee25c80fddf7300bc184685b121589b2137505a14bbd0edbc3df4d21d3cb400badc6cda14d2b5c5c4ec9e0796e21866ebd815bb461439dced4cb12b73136c4f588fc8444c2f2c775db0115b63ec9002b5137aea0849f75aeaf739301f6cc4cc86a2662638c1a0c655ec5e0761b78e43467cb3cabcc616cc2528ef77d47cd753597420e7efb5ce59a8b6a7e474c55a0f8c1b11b301e51d94c549d2031bae82aba29a049b37fd0eff0c22b0aa207d0abfa295e82504ca37bcf896abb4dd06a886493613311dd12511c7d536c1a0165e62628193417e898aab523d961c1187f01ff012b8ee45fbf11cf436bc041dd696e95077cf1a90f40ef67afff645a9340e9c6ae96039551c7140a76398e2818ad5130ff7442c5d396c51a6235caed36dbe4bd7e1ed537cfda69ddf48d9102bfdfd65b4dff1a7b00bd5f0a4146e07478740d7605e72d6e8ff126f66826d1dfe66d4eece22976b90a689d499a27a3c298d703928a56cc9e529e35d453e353ede195149b458fbfadca109afd03869102ef118fce6562b6f063c12da4a56587364b6157474bff42533844a8b2939218dd1cd7970d1f33ba64f181619a12bbbf7e42ae6622e8d327d64397a20bbd718d97fe692755d20db31ed5145f442253cf5c407841e03b1d63b703f04990ddc051d0021cb4b43bf3901a0032ccdbc41fb4fd3b87d8cc9ecd9cc45d9033952fc448368d19e0356851226615096244846e97a808f496f55fc7b5bb1b8675ddec3c0f96b5bb094ba5625369c7657296ec46fa3e1ec58b046ae1ad62e110958e415ac591afb4165ac5549a2f6c7381cc339889cb72d4538d31ce489beabc2f735d057834a21ba43b9246155e431f03dfad61b104e4276ad835e70ba978fbe717054a12e735943ab2ebf89d0de1b38a299f53097715077f62ef5ac50b2a1f386097aee0db10b9fee6a3494b62c916370d369a96feef23f31be8b1dbf7b709a65318e49042a572235a4d09337b61ebb6d5c39c3013452bfe310ae1df3d41329907b7030e4394eb1eb50ae41999c18ffee47760a15e239a065e43e0d581cdd5ca70ebcb963a51f8e971efad02e72ef49664b4a4c8957f8d90d457595c3eb388f9bafd3a9726276ee2f8a70e61bd5ebf5b46a6325c5099cc09a6a9e7fe579db68cc08395ed24944e1861c34a91e7201c1dbef27d7a236a41a90f1177cda02a288e066c1ea2762cdca334b5975bf05d7d8c9bbe198c180d847009f7d53767a2fc7d3f02274f5a7e0de9ab704af58a1a38df604bc4a6010e66db9bbb49338514c04ea5f6dfd281ee8bb4da483333043d87a717143aac5a2e6b817e969da41ffad48c5e0815ba6445bb07a14cbf5af81c8822b3d027d7b6d99a61c4ed3adab77951187083a17ee1417406fd158fb6184ece0a64d80b6c4451b39c6a2f3e148e717e6459bf683a2f862fecf26c50f08c6dc8b02553918e0dc304db43043464addd20f1dbaaa8ab34a48bae1365bb7df3020f42dccf362d10c560ce3737b8197ed055c074eb4e4e73cdf74a4be69737de89ee516a60c2324638db9173c46c670d226c0da116c141d37b932488308ee4cc06439babad72819a1c52f3cee4de2563db977cc2f7cd857c8553afde077dc44dd276658de6f2f052549125c38a58ce5b7ddb6976df5af50f30bd2a274d99ff29f29b7c9a1a10d7a1c69e9c6005682d1a041220f08604ede65d79d954056c9dfeadffa5f56e0049c6e87fb0fe8f050ba5d1db3b87bae7ad5179d08aa213066c39bff808871fa34e70a407b3f4d5401201267b30d3046f31315fcd97b3aceec55b8b8fd89fd11ff2c3a9661efcdedf6f7751bfc4c6dafdcea4458ee5c3608678fb7afedbfdef456bf7e5f8a797a0ec9946e6bcc00627346ce688970fbb6573a721114dd2aac32be74a4e06bdee0a87c573cfa75968737a4012e0a8b2a0afba7c13e2aff4e5739c029acd636c90d546a9f2f870fb638c18438e418c3355fb01b2d79fc2143b325c5deaccf16ed600f6ea1467ccbe0b5c50f816924e84473a1874f096bc2a09edf43252b2377c906ebeb3c0dead7c2efac61a9cd81b313f98fc13e527ece2039c051aed66dc90c54149fa73198486d0838b1007b82d92046e599a61b177fb7ab30828441da23880e47401035fa4187b3e23453acfb91deca1a108a352eafa21d8f910c4416fd4a3bfa1c8749b8019a8af1b007b52aacc45cb3b642863687d64353030e1037622797a7b2179c816004a3813de4ffaba9753005325327b9bb04548c42c397b3092a7ca27631024e4d49c4faf4aeacdb4f62ea59f163f386add9d9cc1474eeec54968b50d33de79fec9a12494e958059e170ce02c52aa1b8c7ad77ed8c18080189f310b2ff86e5f1517d5141445b741930b08ae39451e071615a1b900e761bfe953ce0fb08fe26dbd9b175b43d93b01cb413cc54df8d4c13cf43da7c1daa9270cdb00ffe6f2ebd1d310f01aedd4d9c9038f4453fac5894b0e250aad8ce854f142431ff6f615892e42325c0f76b1b23c06e19691dff0f1091b34f7703abaad8e0889a98f7b01b0b574d2474fe381c313f7164125f519631b037e60454cce8cf511fb0f1b194cc73704b9d85318539fedae44eb445451cf5bcc1a612a37774b693f9e34e4957adefc7748afea7b7c8e3e0a02fd1fb171b34a3c7d1cbba47b30831f3eac4cc12c5cc570748024fc7c298e876b377f545c93c5b554f9a751b4b28eb7bd56d96a01ddffd751c9f52e9824e41309ee9d366c1582989fcd1ea027ec325e10a85d8f3f9fe171f09258f0a334e04adcba5d670adccf922fa23fa6b5c53c095fc75567fe99e830b75c0a22fd642e63ddff1aeaccb97a54dee287a200dc6281c258e17cd9087e9fca2fec5a550aa195e7daa02c58790e306383b93266af2dfd0d2a55dfda73b0eded1d65413c22fb335f307215ef4c57ff17c541e338089f486e651eff93c40d80799a16af9465bcd661e9703a6b4ce52ca2e8c49ffc554b3903a6e2501921df31542b871865952fc189e1b16c873550179015ce6d7cb2053024af51c6afbe8698e81e1a41388ecc699698e0f71ed5743ce14bb94ddc6344fd9bfbe039ecd21cc128bfc03c94e98354dfa0c3dc70033ebed5658939acde2595cfb2d5dddc79cd81a7de5faf94d51300ab54983b5e1eb283d7d134db08c6d5c53509bd84e6e42d96c5d3e74a50f217282f5f71a3e33aef885a6ada89adaf468bf7c67e35b287be6d5e36a5684a41f1febddbaf268336f8aa095352cb5df155685d89c8fd3104ebe6f6ac21aeed3206cee6c8e5ce8132dc8de69e6b882e7570b928d2f2a572bfd865393a337b4862a924b32f62ae1d310638eb48660c2eda9571aadca56326536c4a5b791dff124de5482a3efc0289192abc7d5e417fbb158a7f598b6f704e7cc7aa0eb563648728bcc120524fc5ae3f40dd9ccf149368b359ce5eb8623a206d255a358fa126c46149a0e2ade73b9a05b875a4b3c84a9b53d08fbffecb1d778f5ec935fa796fcb6336f84af73ba2f861db3b13fa34ef852ac7a3c36c0ee39dc1e86fd7f7eac6bb832bb9bec7c2486d9cba638964888e227180255d8c8f7ca4759ffd22c02579885843474fecc2192cd3c49f9eca53d0ee9c05f1431208acb737de6b4493cf25e702ac52cf4bdf79105e87352698eb1e0eee19b3123609cbd135d99d38ea1116a87c4312c442584921d6375c7560d5b226e818fdf592e11412470aa6967608c3728d5a61681921286abf861a32b3f9c8b51a797aae957b509bfe24ea82c7daddeea23162f753bb324003069a6de16e8d5b0c51c9ac5e7d705c19a82a9f4a313d24522d00c815cbfa3a84c82979174ea1603a0fbc5745936c7b0591a6c1048f33d43449ebd809922a882ca4656b959aa693372f3886e13abc60e6e3baa9207208740820c844511f055dfab74aeb418a4163a1b26f7305938a92aa47899905ea38947985b95a67f74ffbf70417cbafabc9f5c3f537a4f54c203302cdd42e2816b70b6b6b8cad507d9a17f1e0ca57835f45833862a7eadaf4a98e3407e10a159d6f3c9cb1805650e088ef5c7fc425415cdfccb57930472134e307ace3f75f2e3a723e77c96b40d86bc6ddefd5ba1a0a67854773351625314b8752f848f44c061aa22432544fb114948ee409028a8c80b8267768990abc66b9984f14f32850d87ca1082157842464d910340a0b5847b4fbf0ae60149fe7a96b86e0a1bb8aa2cbcf8f9d8a8d2c458edcfaa5ab132ebca3acc1a9f0476c858e28c6a9b60b602e5d1bfdc260a481cb7fa1a136cb03ae4721e072e4a138b1c05b661fbdb668100db36eb9abdb9501d33f8eb02794f1226513a457b993bb5e604a370bcd0206facfc9bd177532fb040c43ef520723201d7a675066a83f9a0ac9d0001d78d0b4454f9e87a94949311d9b88a799b64b9156e67e1213552394cb1ce5d5c668888f9d678eb83ba9cefd66dfbddcd3d2d02ce5d9790f2831fb218970537a45628f745ec18d24169c73d45ed12495f7abaf128a3900bcdc1a5a6af65c9c7cebe7e2c20a224dfb2034f03976767a0e541f6676700776af2db31514663d40999137c17afbcc38da3e62e021d83ca3edb69f3f5a674606e1647da29940edca10eda257356e20c24877b57e85067d8c115c508a14304a05f9ccf0636956034d7caeb20c50148df4a3a0343cf24b772f9737afa0d170f6c84d103122e4ea815fcaa643240b481a50323ea566eca04bf95930081cb61ac0fee4cd00d5e2936d0fa57b55a3e38a5f96bc2626d7ffc22385d173591e99cc0e7f77ee07fbc020c95154634c1f2525503e0dc3d80bca79ed60de85f2b16f7de8c5833455c0b88ff1cc5dc8709728efd426c4de9a64c96696fc926d72ba0f54c32e2e11455a41990d7e6bb2415088fc986d9dde848fd84904b85f284eb7ba2a0e220fdc009032418b4e370f62322da7ffd6662a857513b5d9304400df16f92b905062cf7ff0e33ae60e916ab22c538f8fb48bcc9bb10c20012cd81531533bb913a60d7e485efd0a122520a9ae216736f160c5b37531385de6809ca92fb1bdc020dec4ef678f5e20693e7836dfd855e2fc8e0de1f028f7b350c93b86d70a149690282e7283cb73430013a8a267ba31adeea48e8b35dc2f69c5eca69204da7a5cf5d3e7867cf59d758abcb6d90c16c1384e2a23848207271d629ed7e760e3ea2894f87a88a8ce353f59f530dc3f0e52eec4003e836bf4c30fc5109c7d4cda88203de1abc9746cd59e7c0c6dd4cfdd3570608f666eeaf52fcbf816ab3de6148c789cda37f1dffa1894949d0cfe03693874e209651c536f301e907ade071b39f7dbf9ad929594fe992f208ed57d169fa558c7992302b0e8e5710d35a759b47b3f0d15ed15ae15f7b50707287ea5c19961adbcfe30d9622cfb35dcb174ba2d27b6c6392a5b26ed0a88ba8b591999c6c695bb028d8a618b93b1bbf5baf41b3f4c35dafe57b4af893433960dcf03f64a3d7e2f384f4c5e76c17c6605faec9be775edb2f38e4f996098204194de9582097f154bbb36c2ed56a161509ef8910b2bb5b11ccda5ada166c44463f70c6e0a801f836dd6975088c570fea583346e501185d72fcbc567699480a50f801122ef565020ac8920dbc9cd790450201ced064909761e60018d206fcf6ba4cb2fa30b9d8598a6d387070809a4bf2d83c05e3722209c6b4f0c84d7696f14ec9cd3e2adac063066a2e6230d79eb125a8091b61b825c40a9c108d74521e4a1311137a0fbde91338acf8c0be96eef0e0a478ea9539365edeef508a0684751b66fc0201781f39c855f9a22d9029212d5ef437dcdc3be94cb6df6fd5409e95d2d64c4a851e6cd6ce0a3ac16cd3e671fd360b16a7f4129e6d7a6bdf75132b5753862086e2a9e776c89f4afe97cddfb90721d0c85d612b5a66515255ef55bcc93ebed4ca6da3b97d0e832a795defa4dbe4884cb356d5d7b230539d3a3bbc00e033e561698517547e4426f1ae932d5ad2223a5add10101e92a45339fb0d01892b5098907f77260e7ca0a708efe7e7e7180b9e145b88656c7a41770752dac0c51cd1c366a7792f405c8c23136fd7d7a4ee03db40b9902051e153bf15d3a4fc627cf4196ce3b6d98048e132561b9eb12a5daa0e555d795add1cb2df255679d5c83efc198419a13aa6182dc60d69f661981de801b02763cdb04723e2156c90bd48ce5ac112fb14e5300e6692c8f80eadf6ff26c19e2865d72bc3177b9046a58fd4352f87bec048772246d182665af97bcc41a57e26864819862077920b70a351d5c1cacf57001c8393e920ec752fcb26c78f319adcca7e8b9900daa0d38be974ec7be631c3c590176141f67d7f0f4e8f98dd8a3fa208b2f31421f02598d896d55c45c2f8531896f2dde5dc1ca2751f356fc31d34f6055da806bd84d0b0a17466571f2499070a70c144069463dd159f4c792322872559551a9d0035409892bd52c05e2e69eff27fd3d0cc35d5be38200e08e79031074eb147e18c426752dd94b38af53d20797b3136753805bc767c2b795b5dcde0f9f7d4d9030ade3042b46c764ac198730baa326f0280a215e5579c819013fe0912fe271c193e15f3a99fe6670bbe6d40b683ff56576722ea0ea7f495600ffb5378b829eedb82bdd5032ba6cafb092125b9cc314a5475229a12b3b01d89756e5bc661d733f995b5efdb9b78cbe40bb6b9fefb0a810e681933283664be12e8237b1d0cf423839e9e327e798a828ed914685bd547f6217b200a77959452641da76ba019b0b1e3f016b7fb91dd34fa8df6ace716183af11352fcd9093faf85a75d86b659fab04e908740c575f1cfdbfecd67854ce94b6ed15dc1f81fab7b6102f4a1afc4dfd6446a154a5761819594c02af86ed22b1247424e5ec6a9a577eefdcfe0c852555e03ce4166f100ae381380fd676550cbe85288786c79190c9440b5d6d3dbc86d511de39ac12e07d5f4a15aadd80f03b548ff33151ac6bb104a015416be267a8785e35c550fbf1cb2f78d03a9822f9025ced1503d173957e52e3044fbb7f487a00d8f9f3ae63344fca3edb78bf7836bca40531c2154481c09d70f31e2bdd12c114eb9380f7b440b107e70d48a4b8345c9811f60d1b827c419ec02aefb8f79c941e3b723f96c4bb7ece044ba8bc20fa9affdc726c75ff726e735c0505129a07db72e61bb750baba4ec5e3945a8080566f11a54497261a6e3c00555ebd6b2dabdcc23fc6bde7a39acedd6159e703c1cbe852d6a7081a02c1955d4311e98b273d33f92c9266dbc0417492c4cd3b4176235078a4e794889cb96829681b4c107889b6df3018331d91e4002d4aeb0f5437085f12fa4ba54d8928d74f939eab1eb3d51b79015991dc52ecf0ebe18372e29104ff7255a290b7eb5973d15b66427979caf50d711bde4073e6a8492f6a1cd861ce618e2517fe8565abcf128442d92c3d764e9dbba92befdc0f94a235ccf43bce0a0a76f95f751fed663368504ec5977b8754015797b729d06cb489896a0d893a0797eda31e5546392ef60a2b263a63cc69cc444e14f973637a2e123308a602c08244453f00e1c8c749e3e3f317cd5288ce4179458f69dd46a11c69c50de4de976e4033c8904bef531dd5aa4fa922deb678b649d87c9acb7c895649774c255e83eccec761dc850ff6b670d36159b82af7e33a88e706025b5fcb7d9b16943013f12dfdf34c1c601adc0fb5fff56e72b43f97a8213c1180c835c4a6d9df47a2711723dc550107806561e00da0e9bfdde88023b49804b8cf29777d6e1778ef0c28814d83ad20e93e597e1cedf4947c38e02d1c4cc89799fdcf93eb98af0812369f65b9a4389e55d68c15ff3b6bc3214509a91ab71c6b2a44f9fb79828f0c0a2672a2696531c3015e049c9d4f9d2768401741bcec27987730d705f0eef34e10a020ba022b030bbece461c11d8edbd96cc6fbef5f38fd927b4b2e4e789ff3524974f7224406cb32888ece14b2d15ab5458e90cd03cd9348897bebff1c587d1b23135f78a9b55375dfa828f56d85729ce12658cb73c20dc2e539be8b89b77587967ce01d2f084265078dfc1221ef6a170d9ec3cafb85a99dfa38aec413b0ab80c269592d8eb49443053baa46b01e9613c16ee0b9d444f6b4a31c3f4dc0e8de1592f9103582c0620ad26e32c7aad8ce96b6e661de45b1cbd13b8506a0e3d9f4125e48de5e06231fc90d9f7d24d6284536d1c5911b88da169e64359b77d5840b23f950f7971f4bf3b91165093cca29c156450e9ccff1286d920c2cd9189ed6487af7087e8e7b2bf925bbfa45cc6ee3853a35beb0bcd3dd988e786015d67f39d8bdbc3ba1a3f664c69a54e016ef72f63e59e6af0b2fbf4061890803426072881a9b29df4d26c66b74b1fcf74c5b14e15f5e14d1313bfa0b60f2512f684b179ac73816bdcc0dd800f536b92a505f9947c91301188f2f1d72752200df409213db55fd6bcd4b616908c450a38270564962e3b69ec30af6628e4a6b53044bfd8a530a38dabcc250a8f6864a6ee22bebf5636b3e3400cd2d7d1d6e82a860c2f85ea29e87f9d40a7d8c9303724acc5830ba6bcef02108483ee5c3b50b59b3b8d429891d254ebc6b08cbb9a9723e70cf678a9528c618166eacd10f068b0c2bcb6318651beffe8eddb8199879d721dfe063854fc67e81239d9980c3048cab18cee98b80fa7c7b006877e0bb5b15f905a090258632177b4a4724eb9d6b477ee672f8271c3a08495400bc0d6110d18fd82340863c9b5705e02525c71caca28b32fa08f1f311878e4191490bccb1ce7b86a31de647d58c02b00f0e74b3cc62620b4ee29fef31a4a270d14b448145a673fb3b1b572954e41a7ed3d2808b45c19f6a9e0ad9e9ad85af9d5d3bc00528b9b1c26e3fc06e34a59533e8bc262c9bd0c44104d213bb511dc0ed514987c91d60a50847e186a3ebde90fc09ccc67ceefe89278f4db8aaef2a5b90e010bc7b03d7c559eeaaa3e1a503ead41666a717192e82b42a94f1da9b120766bf6275686c0decd357a68b5ed91ba6d5701c1f9d131234a1d8083deb01639189056759bdbd3d99243c8ab707eb1045a79ecef56c8ed6e84f7167fa4c5863690a2c4d4e2faefbeb63d1716de88d41030598ef0e2b9efc226370ba87d108a2e8d34ca4b177a38e1f0069b4c8fa20bc83389e21ba1f7065bbf5da7bf32ef1107705e7350667bcdbe0ec779aa1b53b404358498f4fdc06c767c3d829d6573341e69e09823fbeb7f64772941293b0f5c7ea0610232371e4328d00ac7162ed0c3930edf6b6df98e6fdef3a450b7d41045ebfbb352cb4828346b24c81b87be2867a0b6bb0a4a990284a3a2412ddfc07aea4d146127efee1859620f3d81aba54e76e9ec1ed28991141e624708e78fa244664471656988be4557b198f2d61827222125f4135e31a462e96e0eb041c32504ee7a2c5f3ac727dcf038139314a5457bd1e9298a74bc0436c1dc057a252523443d50ef07f6fc786ce65b24ee0610cb7ed6df45209c5d949564335e3e04956d5469798ebff43ee7f5babb2b6b0d17d102f8f3e4100640f235daa109892057b3484092dfe85fb5533271ec0b2f871348cb3b87a5720900782a7c08cf9631f8b773f7a11f7f9393feb133e9a8f79eb00c7e0f38d6ae533f3e3514013657017d1953164c5325c3f3db7766678b05dba111dc7910c228a8b403400ca0d15b31d5a6b4695c07af55c3fe9f5d80a6ac6290af1741b948b0863f656965e333ef48f65638e7f23a75a7be4703648407cf56c18b88c8cbe6c0e6f6c4cfcb77be10debcfbd895eb4f6929676f5c8f235d3a08fff50dd968f0b9adc8d2438fb8490796419ed35077e4b34f41951d45c1fbb9fbc5bf082306094bd5cf4c5368b8becd9ee0c9808546cef65072a088edc88a6328c0b2e8ddec8f605795978cb7e8d09da1599d9c5f4ce4c732fc141709d1add814a225fb53ccbe2a294ae0f752cc5253bf31997285fca6116fc30e2805db143796e63011a7d7832efc5b74df7547ef65940e1c96e64a08803b901b1f40635939d506e1abb66a058d17632c7c4786840cf4a83b94573ad1aa0ad4bba082707f0b6f414f4ff46ecfbea5065c59d647ef102f6dc1d87a051fc6a0a21fe113446c2738d826fd770ce0c0ab9116e7da907a89884358b9b2e0ab76ee455a719bd2b2268e44e041acf23080371dd8fc066196dd05628db71f7f3acaa6c4ffec0cbb81b99dcf2dfc7bc91eee0302b20cc35c2bfb549f42d056f65f591b7f64936460c1261ad414c14f15b795f906afd0575a1763f26bb4da5738ac5ca0ccd04116ab7643ab4eb6fb3df3c6a519af41e4febe6008c3508b357d4e917f76838d52b744e24137d3a07a4b3340d4aab33769bc84c57318c62c4dcc363ba3f0e0108afd7e23fdedb713a6e9130be07d3b202e1fdf8620990d7f6eb80fa30a3d64be511e32c50c835bca0a84728913ff84fa35555f7c4be035cc4e600d555ee65153d06f6847bb09fa9340715270244e3051c12cad84870b51b937a66e2f5d31394613872240759f5884a6d1292a97b565089962d0374d6df49a9f0edb13eb5a9610677558665927f4dde8f58989e4a411149cf3005c986415c8f85def019881c92ada8c12c9ed8400fc054aadbf7b21680ff941e9c490f272cdbb63f157256ca3f0b51715f668b54a47015e218495691500a5ee397a62a9879e637cedb7c33954f3b55511fe01835315970eb94673349df8a906d6c7ef5e4df4ca933e41eeff6b2ab7cee574f5f01875e73d8be215c0f33387f37f9746c9b87bedcbab17c523d2504438444489a2032abcbb7925a31c0d8606282fd9d82e201c4db76e08d1e58193691642f83716c4db0865b1da9ada2898ce71251abc6b776a218170ae122c4111238bb0fd899de8904b68369360c0b542f1b1da5863bfe66b83589418725a526dca268f9bfa91b916730fdfbe5ccd3354861e3904b92aeb82315fb95b0439e25ecb9a2d7d07d72d6b0be398316136ed056aa0e024bb1dc5b94a25d7e83c79c2191c52eec2862d59562d464762cb659281a9c2bec6f281966ca166070bd80ebbfb51f9556140efba22ee686ec8c71d7356649d95d61575810900cf61fc6dd4691881e572183173710b423cb4565da800abe3131e4f510df14b0619b6f805ae5e24c99b5e140a77a6c144334cf689d7714e4c41cf8fc6ea7521ccb4258e2fc88865ec64b149e483efd0ed92308964a38326a86021b08a6d42c181204ced0077c2ce9a264b51b744121d875d9ac6d35846a970ac3184b54a8ce02528921166ffa5595999a87416f54e0d886dff1f7e619efc70a27947a8b4c090ce6b2a4e944e39ab6a8e21b45595dda350bace195804e3ac8f554c12ed8e2b6041b2f38da400555bbc8a495d5dc41edc5399de47ef9f7addc22bc1352d4c2ccaf77cede6316c0a669bb8bb3aed39f2110f6ddb82b44f1eaf39508f609f63a1c8225714b35c707c5255aebbe19ef9440292f956c72988d629fb06dbb2533746c61dd91c10f07a1d5659ccab9ecb5ae0bae4d0002be8321e39550464518b7d0501d7e85d4dbbdb057a226f4ac2dd08a5f7110c094aa83504914e8c99c1538b4ed2670a99f458b434e72e11e1be7be731c924cd9d0cf1bcf3656fe0e2cfff5173eb1a50b221938062e945fe730786d87da04e45305e3dc405620087c02e5e7bbe10264d146ec8d33d9b6f9d8ef68713a33c588f7763c87611e095689f18bec3e9caa895cb838ad98b337b7ceda4085cddd31776dc95c0528d168cd7b709f23006a93e3a8acf37c564df094f58e055d371a82b548c46167a02fe45fc93d9599d31059eba1fe749a1f2a22f61294bc8b932b95753e59ae7bd9f7e211242c1afef06a3913d700e6f7870982327ddd61d35399ccf58afbced065153242b43c3fcd5703d1eb5a8252c99b00260a6e62f57013ab02eb8526c88efd0fede773b862f0c59877ef64604e404cc42d8322a9e906b0f5a682d393e3fd98c5ebca3bc74b3e357cc1bf977e0ceb1e5c2ab47488127b00df2b2905005152b8b588d2c12b69fbda0e3f989f4feca920cbd676800a9030e6ee667e6dc7082e15b265fe3fe609875ac0bc538a6d7521ca840eaddede81ebb0bcc356f7d970269a4756e5b1d89019c1b1c74a16999a7c77f0919ecf13a965e99458d8385ec013d2bb983e3c6a8fb8b5439a20916e7a20c762d53ddf099cfb5f4904240e7c4b06ce34f960b4ae784138b52a971c7861a0f0c1a1d4e93f94ae8839454d28b2060a54cfc8530100e3e9fe9f20554cd7ae8c97d18a91fb6613dca34180da3ef6eedde174e4ae7920962f2f5e388bac8abfb7f402a509570fb9f405b165c288a7ca3c4d0b2c0e45012fb7684082c45e83b2bd232278e5240b6078f54120002284371385a764648da71c0d8f1edeef5504afb6ca3d0df3b9ab11082a2dec94ae10fed066ec468739a4a14c350c4bc7f312841e2afc2ce9f0f3dbea93d5ed669b3d11a0e1720031f77200eb44a0f545d070a3f860591382b25b656863360e6071a2a6c1f201daa0a0057d477845c35abf2a347c9406f0e564ca85c1aa764293c20b33364ff1a161facf12541526aa755774b68543a4b27a742d4e9fc6ef10edca2e758edd6aeccefeeef7bab27af527cd9197f1e0f032e2420f6fb4b03fdacbed0b5d0600d6a724d514c9c84a69aebd2b55df40b866939cfaeec49138420ec5980580aa4689f11b478638e36fe1eb39c06d021fbd116f4cecb7068f2e9746366ed30ff24ec23c544aa9d5dc015de1f0416a8c39b728af707705341c9a734b876d4ccf2114322eaa78c9be14af093f6242bf96559caf431d3c0bf6e2b81d27cfe5c7faba66c142070ed26014b6b710b60076b7df290f1563dbb6750652416355e356bc2812a6b0ee2aebda7b806e456c7eeb9c105282f322ea143f6a716f9e8b88ea334afcaf6b441a1c77208d3da99d847650773f92ea4769bb350932fb71c806439b69747e12faf51eabc68df348474231c074dd14890f1695ce7f6e94c4cae24c7b7e7bb7bf608eae8bd9f2ed5d3eb5c1efacd14927182b1a2f7e5893258fdd6552709ec7915b4c4c715a9972198b62b0c45aa7b3cab599c10dc7c7fa28139e5062c24c35dc5a77c4a3a0cc130501451efe5cb27f781ac2f502916ed291f0c5a95e521034b6477d8ce87430077325839dd934f8737584bf57ec9cdf5700400153502fc02c7f5c10d9e670ee1f1e23ca05799118d222d6d4f7c32ba4339ad3248414f08060154ccc7fee1b2852b785d65b1d62741f04a69836d9c54a4cb864a63d40cf8a70c6a49051e102d4784e210061fa21c12aae0832b854caecf4c2a793c71ca924e6ef604639da79ff7273b0d44fba0510e6b6b2cb96af853741746cf78f0ac003d685002da5961e010bf3d116a440e8290374528a0ec002fd88e34608729cd2fac2ccaa294cd17abb489b6a7002813fea329082f1a611cdeaa7eecf0058a4ecd394611151ef31d32e91bffbb6f137ee8080eefc3d941e5ed5c2dce65c45d053ab5012e1541cef44dde5dabfaabc2e62cfc684ea76c7288a5c775d85e165736d2178174d411a880c95f0572eceeaa97928f8a6672b14cdf5ce7e968ef6f76f2d9821287b2102fb73de73a686ed47d05929303cffc84f3f510b483376efd99c87a10cb6321191b12ddb2599d537193a3a1e9134d099913379d60b118d027fe6fd11077de8d9234ec7f556d4667d642c467d4fe4b7ec30999cf09dd966628cf2ff8995655d260db8a9c5bb4e606b40f4c7481ac4c116552eb3be48dbf8f0bedc6b820a103f4e4189dc669b9dd8a99ea82f54122dfd14735d70094a33a1f8dd813129a5932937e8f5bf286f90e50e7d0b1e24fc164421e2d2bd673f47117a019d79165c486c0105c6731d41bef6c1d212ec937060379b0ae8ff08c2aa269c58c923c36ab9b5a07dfb0df64ca2ad908bef26f2d41f33c4935137e7272923a819d33388587d95ed92d02e6855b819ce0bddac5a484bfe9f8e09d06437aa929655458083eae31992772e046dfb5d7e5ac0e01c42a304ef15a63a928c60cb3721202aa20ec74175c2cb3f4a037da31a1627b069bbaae59fdb41a63f42aca202598af07606279114f851bbaed19776752cd4769855b08c7d945c3274d9593c50811b461108c6684eada87b2a055fb34424db1b259b387b95a88ed41ce1f7c02615a2e2f602bb45f107bc26ffd2cfb034d00baf76269aef1cdbb87596512b07fd01aae62af958322924c8e9bc9f7244f93b17cfc00e3562ed6895eefeaaad61da13bc7dc628b9bb506962f60b3edb105a7f2a66b4f5fb7d09f0909e0fcd754f8d36215d5eb3fc574e339bf0a06e25fb4f2c09933ee178656655ddf653da8df164b5132f7f5fe2eace746934d392676dd19bbe679cf0d3a548989b302b42a03253a8a488955c9fa392be1bc763e4116c301636a4abe2a5c256e039495cdd159f28ee991da4b2452dda411c5dc32b0f465ae22b834f2be037c56a59cff20f7c8d54a218b1a859281acc1d5248a95c62330f31c26dfe6014b3bee45066844e48353b708200731aa1650488884aa693ef2b801bf86a82537663ed25072469a78cede37d05b5654bb91e5f3e30fabc9aab35a21d89faa788fd012c9716abb856be42c870c5d71b03b76ff206ad5176bac882fb9dc6aaae6f626d5dad23fc2e7719f2e902d36a0a60f977452d985849eed5809a04ff2e96506e8a8416d031e76deae5e088874916662844b6717f251818f7f224e49c6a11e45a350548ee24dc1c45bb0317043bfd63158d0aad300462a7c22cc6f103796c97531e5b3eaed67eb82ae977e4a79cd00db86122c4ca1c15af98905f2ce16e499ef06acf198dfecec6ee3c1c5ba7e08c85ce6821916f715a47e5c338d9b775091be26bc6d93e3eb1bb2c45503995e98c3566387d311efd63932c99d519f1418267eec0698765432a04f57a236e781fed1d3750d4b17a238d6f89349d69bc5cb38dffbc39aaf9474633c4e151b7ad2d1a453318945058614c4de8355e6e88d217312d73c1280c321d5223f299d8aa2bf43811bfa273aa780a8b5704da667f761eb3f49710321d58b48a5eb4de9b0cbec7dfea1d72be386898a79563445a63d97e8bc286c0a26bdfb831a71c36806a30dff25f77eb6aef16c6b2e412c8d3469376a3744fccdfaafeba0aec16deddfed29ae4db4e5cb3b028a0312c7c9c0606a97847b477fcfa46fc3e2847a584e498ef1250b44ea1246f911ce76e406a93b434616174794116e894e947e58d18053c026a5a5a67a1348651f597da61841a209153aa5aa8116a8d10d6be6753a068e8b1b87d508a1516ddccc482e4373a83b39202136bdeae1f0b1c09506b425fc4067911f34569a5b25c769b7446beac9691e3c15338f5ce39d6bd40719a37a371af9aaadc8a188c92a0b6b73ea205997b31ee50958640729e878168cca250224432ba1821cc7a3c69bee61cb2200521c3dabd79cb34804955e08909d8a6d09c562bd265ae0b2a03db28a17a9115309c7dacab557e48726b6509fe70b488355e45b7a3c2cf2825fefab0fb00ba0d9bc956836282c404d1ba5c56f29ac8fc562e4a746b2611d457761d11ac72164b6407ff1ab4531cc2b3255e7a9bcd1dac27edd173d219ce5a817537bc37cb8456fcc83a52cf7526551367d2e6121aa274d141fe00977541a10825838c3ac9aa8324b4a5b506c5fcd2d142c1f2c62e36610a4b123466552dbadf45606c430a0052dee6edb93691d1df8d442677069ff56da1b4c6562b775f373593f08d9603925b2e0740522963ba4d8d4118a4aeea0de1b841d996b6e9edfb12c128ce7252989b6e590fa23c429b873febab00484e78e46c9b58d92c4a526525ad5963aecdd8b2df1b6a6be4962e7f983dceedd5e0ba56a52e690700d7cbf83f7e37b382e30108ee45ff943bda54386b1fcd9b81f1660c84bd1c245bfee112be6d64ad627a7c48f953386742fc5c91a7d05425f801c854fbd12465dbd5d7e6a30a38211d0850c30cb999a9f31315538a04babc0b005d38d1c8412427671d30458cf382d1071e030fae549851a273b89e62487b8f77522c8ec2f40cf9ba8ec0ce0bc51aa2228d4c98a65aad4e1a85e0f0e4b78a8b1f35d77ae1384ba9020f27f56043cc7eff35f219e1c76e157916a964afbf57c5134ac36408c2143290e2eb322d5f8eec3f174bf6945b405b599e370d223c9d72bc6a210b1573adc43c71d8b0723cf9b66c649141f21ae69839fb26c9a2549b58cf8b3d2e0ba9bc14f369f28a46f11fd7334f3dbeba38e9959444636231f53392498f52da4a7bd1733004437f7ac1fdd10cdd7e62790beaae8357d2f05aa4acc9a927618c73b736d2d5f3c53dd9d81e10b796a095fa30ef410152892b7e8acd94696e5d64db177246b2c7986a6c1ba15765cf07bce620c5f8a71ec9e70cd8b1d71e7a6da688252d2fb73c15a251657951097ab96c7248ae2980c0d2cb6d2b71e3917ddaad5d848362e3d1a3ab7911961ba34459121f6056915c3f49d3c5c5e61d81cb248d456255daba15b96312958d931df24331d28ab73649a43f61664f426c04b736d153d52f9e62bc1a3052cbe3a55b42bb400254f42ccc568fddfeb9d1f5fc2037691199374e25a17d5834e515c6b6ee6c2d837961ed1d8a2650aed62c21c1b1d644b608bb91258710138b4f778f06097a9e14b62451ac34b5a2ed844065ea2450571cad395b0ee8e4e3e63fb7805391b7386ae932932f1145b933f09c911dba929aebb9392a01e67ad5ba5cee0365c86ac0d813a365a5d395f9b373128254d0e5f62e33df5a6d376da5fb0c15caeacde812d88001b6b76b0b19a085ef8c611348117228397fd9fc85d11999e493567ada83172e31e9be76c07319126995470162757f088873ca77cd8f6823063e152a879a0dc640845e2fba87e2bdf307b71548357b11810ed4ebafeb2377562da5d4a907212fc015d84ec91914ddfbb0471fb540fe7eb3fb0c5b4fb141c6d36792528c02b1e4690fd2dcfb9083c629cd2e5d8e8a105b3fb0d3d201223cbc28c27220de2843429b235c70ca40c7b4d4cba3bc8cf248aaca4eb6c2339496e4eaa1ecf65b5e01e7e1a3b530ff7a90902d704569c7d15fdf05d1aaf0ad65ca7e37e0c5a8423e7038fc7a8cde803a78ae014cd0b50679f121160ecb204406f1ea8803864e163c98c2367359e2a28e706d1da41189111528e8e6d0b82c1e0f8d0440228f6205db3eaada553e680e9920a1f8ae002559fc3045299421b99a02b4d5e1310917201c0a228bb5d05028f55b22bdd79ef2e3372fc203da4675fd192e39310f6f7db4f28982e134fe748faead1ab4653248a580c01902e105fa7e4a2c64549884b479680e12bab4979d9998da9bda62b96cfdd8adc9fb718674c8b619c4fd40241046dd9fa030026185c0fdc06a6a96ccd437c5dba8392c62d5578d16a4029f28a37a1e146d3e5cd16845b325ec4e8cfa000337d6106908b5c820eb6252b6c63264c9f715612810220e53314bc604252d7c2e7c7bca2b3eb84fa06974cdf52c1f4637d6b51572e707646fa5446fa8cb1acabc1a110b5ddada989cc2c9647801d3b7e7e87fc65030dbe58d03900ea28e0a61d549bf2b56030ea2a3e027a6beb59506747b418a06eb483953ce802e33cb27af890d147e7e9974362ea6e7b2c302806e4fdf01f8065bee41f2eadaa5e79d92767f92095b2fddcbcad3dd91a9e96dabd0a622869a8f26acce6c211a069e4cdcf8a66ad2b3adeaa94e21bd8243afebe76ee0fca19dc05986e21aae8785c54c6be3fe74a47b50e4bc9dd43f80dc471d08025b218bd441991dc9c9febfe69a027a3c8aa2cd8b6aca7641c065d5ecfa1e180ea341e13a37e02e25c901d9bf9b4b77689d1d900a4e9e1992e6f2c65f590dfcc916555cc20c8b073f4492d60d6a52d6dcfdc71cc4fdf903980976a0553ef851c7291d7e758119e4d280deea6268deab1c91b229bfc1acd1665beeabc62d6c3f0fce59de1a978412d0209c67ea8a90013631f497383f02f4daf0aefd093a47ad41c3d14488ecc50eb5315f77cdf109f45367ecb68c9eada858e1b73c5dc14bffacc21e837226f921f56d7a434e69543a0ea334e4c410d9b0dedeee777508d1b75db98b309285498d06f941e8b8a14e5fc4076e99d7bab364a74493114f9243523ff54fdc80bc718fe723e4a9b4b738cc065b6d0c8b94d16a5a74592375c7be2c4eadee99b57a33a3850bac83f0b48010036b1cda5eb8e051a1e34ecb76de5b4f0c0d451e50b0aa6eb9e61ca3b0b407b63c0f7e6d81f7a2b3990ad792fdd59ce9914e6b7308163b8f666ff6686edb67c817bd680661bae96b69dcea14cf099e75a8889e7217e5bcc81b1aa0b483e7d6c3f23cd0b1138eab81dc76b7a57b3934645289ed28f42c92ce4b5b7be0685315335bd1d5ea06d02c006dcb2c401fa95ea3ec92231a12a2dd11402d4ea81c127bb8a3cf204d4790fdb96f7976af08133fc5b5f2eb0a99f5b4a8bf6eeb714a269fe8eae203c0cf3f8e59aad36cd1a984e16bdf0a20cb95b146322ada5e5a5f6641e3e40c5085fc1aa32e09a2be9b0972d32152aa8c9b8c43a59188277a3790895ab013c3295419ab9ce697a127a1e0d86ddf6ba6be2a2e11c3e745d5937a25b27cb8b5e3916cf45d14794808892940256a01d12b418fdeaf2ceaa28f25d35ac8ec4f6736f47af1aa4284802932832d49322a231395586926d061162754130dae049cda9764688ba352403763a392e61f7e525eb65a3bc3166a1c03ff27f7521a2644233b1403813fdaea0cbaf1d287a8a45736578a7f0add88051cf9e748dc9a11b84673f7a26cce39c49d4723b42847e39d1405d158019546c6f96b62228ac699e4e6302ecd470442566da3b8d057f78eba808010253bc9f571089a15d5412c4f3f60560db1e7372c75a6be34a5b5275a6f34fdc25177ce8e59ef557f6860498dd14b339240a009a6ea2443da18a1d368c4013b63efd8aaacccae3fb9456dd1ad2a34bfbe5e523194fcdba2e365c88d7440a263480785b7910665055de12449ab63415a697132a5ef44e52b430c8d587b505e39b2280ae065784cf54e00996c985ab2a8f437f2b1a23c86fd3b87cdf4eefae29d7d54b56c2278b0d9f92301cf5ae0672459030a29c676207ce34fdf5c76010446e440cff3603add7aee719d8223dc3a28051992e784ff8e456641b180405b199720178cc86862dab73fed4d2b7d1ca893dbf0014884638c9f82ef923d662c582289212bac1ee0ed1cc0630678ecfa9ddd29b7ec1c009b9b6cdff7a6752147d582c5e21b901a4d00ac0168e93895b0dcfc40ce6b9f1f62e7931edfe3514884e53b113514bd9db14cc7059741ccf41544a9e8fed9ec01c4896256499fa4322cdab86c6354a87d8de7ee0df1547bd1e04306cb6b614adf2f5c91983225faa22cb98ae325e02bff326edec7762c44d27cf0c50e04f96697315478c99bbc873935f3ddefd19a5fd3257eb6fe33303431c766661da568f712ac2367626c4e341deaebb07b72e6edb768e78fe63c7d1f5dc0e6c4585d4bd1726ef9917052e1db8835333ea7e30aa40654a0034ab1668f5510382a6b3a181f0a557c5178b3f05eb09ea1e9abcc5ae50331c8eee76d803eaa79a87c6e3dcc1b09464aaa1881a2a758f6d8bd2ac8d26307a054925acf17ccc2e2c8effb26542183db480b35b2bb6db9a594524a194809f80895084b149172c5116038bd8962eaa8da8b7948c88e91e8fb17d512c0aa91963458649519430a2e2a9c28251a47153c9cb18a32b3e40afdf1a1239d21b0406fd90686447f483e8f1c5171b62c298249135457565c72bcb800bfc9ed9005182656539cf1622683b1d69bf2418b2f4d14ac2d1a8c00e309244588c9c2093168904883250b979f7c25871812043144132aa0d8c20b29ae18a2cc185a3d9ce04d97c49626865c56f8da9aa3880748f3b10293c4c35e5a814913456ea1c59b3324d04a0395e3747941fe033041822b6e78b2d27202a4aeebbacea7ebc4fd82955a3f48b016eb2b16bdb60386deb55a14424670a5ca134cdcd0a9e2892e5fec0e3667b4ac96a2682286144828791246115ea2c2e4383d88007b5a6bbca0000e124418714254d799f902cb1a2d4c4220610569ebefbaaeabfaae07aaef3a2c5172f822491d2a5e7081d4755dd71d751d767b71d7755d57ab7716db1d26f4d62448a3fbe6a396c8122974bc70ea414e1a6badb54ebcede1cb5b3bc40d5223e8228b0f4b748164adb5965a5b9d5a183c40137de8a8466fdad7329f34411775f9f948ae4091c59c20d654b909d35501d5e4f3a1c5e488247298f4c0c57e10455d90689727d220b7b444031048d46ba8021c68450a165fd03c8571c605821db4c0af2e4450664b962b5744d99fd1713b48d1d6d270e3041c2d7ee081092e9ad022f502228302345773d8bc400934a0c7c107b40033c6043f5461e5824302dad7253db091420a2e709c6c017a4d1e512ccf4f6ebe56cfd9133beb799ecc343a526dc54af30123a760b344d6087cc86da982092c50641b303141141da8b8a28242d621114c91e20d166b5ea003120a9448d21fd2b5c4571da6e8f9aa84872fba9441a28927902a28299db2a209cca9624d89bdb162c94b42e6d526891a10ccbdf7d2ca0a1a25dfbdf7dee9f53abef75eeb58b477d22c9dac2e8f664ab3e744efbcb4b2d2e5c32204e641eb975656a8c49c588152022b361051e7871540a1bf9756554a0045046da6803969efa55595aa324b8047e8eea5551536ef895586b881ca6c3314515d347e6955858c54152f5de7c25d98ac69d4c9a2a9476b469d3852643cd154abc3840d3c554e3d75d448a1c1919251478c949d38583c757c609a5935d1ea509181a06aa78e13279a89393d98a033d32e8812736249460707581353ba8a571359b12450c038503031ac983e385a2f31a89eb8e0308162a0c121977160a2e4ac33a8ad72f526c58072322546952754622cc1a14795560b5090430f1034b5000b871e71722d78424a0f27a45ab0464a8f27b05a4004530fab2b0db8c82f2a108bd41a9815edbd8c23954608a9a86f0cfdbd8c23a5e5c5464a073a5249ba255890a7d0f9651c325e6491094113649ec8556492e854a06b2fe39021e38ad2335ec62163c5894c0d2e2c6356000343db9771c6a4c0cd183a3a8cd982d65ec639d3250a213e298d340e77c5203ac66063a53197975db9c3b9c22abe165758157f5ee087c31515dd36784a3576b70d7e9442d3d35ac7cf194a7ca7963119ec83e2b5994bd2f1a7cd2e3d9b63ad302bfed0f187dea6679ab39d15043318abd160e1f8e34303ad9d551ad197591ac9e7f95923fc622011483b190625fda13e1da5659b67be65db591a787d7bae39a5900d336edbf6e83371d09c417af3c9dd688b7eeab7fdac49a139933b349eb6edc71634ed8fcd83976e7efeebc019fa7f199ca1ccbda5fd075e5b29a5139452069bb9203d63b2938e81c3a47c0d4969c11b56e89973ad663f9c5dddbd7accb55aced6abb53a06d90bafed5cf8bbe0acb5d60aa352c66caddacb396b3b64a50c86a98b99b4da8bbbacbddcb9276e5c163b1cd2bfddcd1e16a5107dc1305f00527a7af6629e0bd6e15bf4f4edacdd3825ad302b8ed7f5fa64794a50f6fa74cd2bae168de314b5c3fe82b9469ccc565cae65a53cd2d16a9d73ceb2a29ccc93372900394a0f25d1e857a9128de3388e323c9bdd9d9126e3a9550061f494d1337b6435e9b263bde1463ada910ec94f061bc7516b86103f8fff9b735e1a98ed7f77f6d3914829bb2e7baecff581a07e51ff5ef943180c267bf9527e9df3476b2feb9cc5d5e50ea42fdd95672f2d0d0f8c3742df7381dbf6833f4b033328634a29b5965266716a504a29a594960e4d4f3663ee80349f1fe9d6693c32c0a12873dbe8cb7ec68c69ab75673614c5a6af40a3a76f3a020ab40d43cfa330b4fc9fd99455a173cef5deaabbe498adf5b5a594524a49e4aad5e54d239797a5bc19acb5d65a73ce99e6f303821d885f77088aad37aca03c4f48b92d8f9c21285feb8ea66161eb143d3df4ae5b7ceda56f45596b75e35d6bb57855f421de4b04f76c873d7b73ced6f372b0989dc1d6cac5b3d7b3f88a3896acc7a5d6eaa6d65a6bf5210e4ab7b3da19622f11acb53998132775c8c90cfbd5ce5a859b5aab1bcfe60e5fcf3a61bddce1eb64c7c61233f7e3c91958210fd378edc55df65c2f03d8c76ec10acbe2fc66e04bf692c78a15772d871ebe93f63d91d1f33c99f372b0d895e1e29876d707829f8b08387b255d9fd59dcf3abe4eaef90118434f3fa2afa3dc8e2b681c69561281ee792f25d137e325c6575e6920c77b4b21bc0b881dd510f6c9e8e97a6a7806c8c5e8616d86961d490238492d9eca2a9e527aa392deb49c88607b69485bd5b556fd480a51a1672f1bf579255df7a901e6089a4ed5c7678440474ac2cf91caa213d41360e7a8c64e0d33d9bacdb599dd666bc70b552626063804d8243b01ec0918e5020b8f0d2f22321370ba95bab266a87ecaf0e956ceb65658ac9f6eb3e890b4aa72e52d9dbbf4d32f131daaf9f40be552b94e53ea9b9c2a55ad5a629aca696dfdd4e267ccf0da2b6946cd7b5e49b524be870a0edfe3325e493d5986f3bc9264f0e4b026db1ddaeff8fcceefecb8cefd8ed7546035858acf5cf64a9a5d59e14026d684c5c71cf64a8add1e962cf82fdabfdcbea43cf1afa62fffaa53339ad3ea862d2e6f0acffb79cf83b2c57b518e78ef031e002b2836e8582380a7a5b7707c847eff183519c1572b27427c7d520310a385fa1953469aac7dbaae5551e1492896c8f9820b1910880007dcdb2f52709a60c945110107c9fa9859f03609396b7c70c5decc38a2bc2268870d4b303d3d653ae2a98f4db2d820e5a96b5c17e9e6ad5bebb10f5600324123a786276f1da661e0428bab245500e1c49c2f6f827822b5c49c2f3d4897125abedaa44921367ad368d2a8fe84e2f69be6a34489253c3cb55a02c653265a9efacbad130d3cd65a6ba71224ba78ea9f06c1062985d16f9f24015d7c4f1f7ccf2dbe2717df7307df9307df338beff9e47b3af99e577ccf2abea715df738aef9983ef29c5f76cf23da1f89e517ccf26bea713dfb306dfd306df5389efb9c4f75cf23d93f83ee2db03be3be05b06df1bf01d836f23be33e01b06df457c5bc0f7057cbbe0fb05df2df8a680ef08f896806f167c3fc0f70abe87f856c137037c2bc0b710df407ca7e01b01be51f0ade4fb04df25f836c177017c8fe0db87ef1fbe43f09de4fb7d23f9fec03708be77f8e6e1bbc8b70edf1ef81ef2cd81ef0e7ce3f08df31de45bc8f7cdf706be6ff806f29d81ef1fdfee3bf45dc3b70ddf347cdb7cf7f8aef9a6f9e6f12df33df30df31df3fdf9063ddf558d1a354788bbcb32c20823b08c5093264d9a22c4dd5d114104115544a43973e6cc94b83b2a3468d0e4d09c2953a6cc10e2eea6cc98312365a68c94949410e2eea282082208a820a4c488114346dc9dd39831639ac6880103060c10e2ee98c28409d32d8501e3c58b972fe2c65b5151515a515eba74e9f283b871960f3ef880e543972d5bb6f4206e7cc5850b972a2e5b76d861072871632a1e78e021c7c30e59b264d1226e3cf5f4f424f594c5c9c9098bb871d4952b57a0ae3855a95245077163272b56ac3459a93265ca142ae2c64c39e490035eca618a1429527010f7dd6a6a6ad26a9202050a941bc47db3a244898215054a93264d9e88fb5e3971e2a4ca49931a6aa88149dc97ca061b6cc8d9508312254a9888fb4e2d59b2446a49387f2a595a5a9a3488fb467d929904aade9284f3e7d29123479088fb3a79c0031e68f24038ff48073ad08119c47d9964904186bb244338bf031bd8c00638206ebb15430c3168c510cedf8011234634206e9b95810c64002b03e17c2330c0000306c46daf8a14295255249c0f83052c600122e2b65417b8c005721708e75bc005175ca880b8edd40b2fbc20f54238df85165a68618bdb465180021480a24038bf85084420021310b77592800424d02481707e04586081050888db323de0010fb04b0f08e7b3b0c20a2b3840dc756bc890215a43c2f92ba8a0820a0d1077cd6200031880c58070be0a0a5080021620ee7a254488902a21e17c050001022488b82b550a29a4904b219c0f040108404002c45da7504001052914c2f9085052523a80b86bd409279c007542385fa984124a3080b8ab93092698d0644238bf840214a0002488bb328d30c208756984707e017cf8f02182b8e9d68f1f3fb47e84f37d841042083dc44db3929292b092c2f921fc3f01c44daf909090aa90c2f9ffc1071f1c899b52810002083910c2f91fecd8b16300e2a6533c78f090e211cedf51545464246e1aa543870e281de1fc220f3cf08048dcd4696868a869289cef01071c709043dc94a9830e3aa04b1d84f339c081038700c43db770389c162e9c8f2328282800e29e594242425842e1fca0dbed060071cfab0d36d8a06a8370feedc68d1ba3b827151010500e289c7f23830c32d040dc73eae7e747ea279c9f81bb8be29e5161184285e17caf51a30606e29e4e366cd868b211ceaf4183060d1f714fa6b7d9e6922d9c4fa3a7a7476ed56a3522b5707e0f8d4693593c3c3c4378c2f934994cb6236e79359bcd9466e17c190c06d3e29654b158ec2816ce877ddf57048220eebf9cf3e879de77efedc45d7b8c75bdd53aed44028989849e4650169abae9b9fad78119031b5fe37ddef61f06bd90c67f1de88533fecba017d6fef3402fecf9cf057aa18cff3ed00b79fe03412fa4fdf702bd70f61f0cf442d97f31d00bf57f1af4c2d87f32d00b61ffcd402f7cfdb7037a21f81f0df4c2ef3f1ed00b5dffc900bdd0fbaf07f4c2fc5f0df4c2eebf19a017e2ff68805e78ffb3815e68fff3f96a803640cfc6751a1661f0b12382bfad4e7ffe11d552c626ae371d9c338bf7e27b49088265731b1fb0ceb795d375dd67adbd17d3e0d99975375490878cdee0c7c117bdc15934467b9ee7eda29f5eb560fcf4bcfa063d77a18a34dd753a9669201d69b57679de16a4cdc817b9ff426dfa3a25587a23f4f77c9b08dbfef8164915b7ec37f6ddb927628c67d775b5566b6b598be73475a9fdba992b3a4a6944a71c9a7e6f756bab748600a423b5d66a2a5cd1bd15c4786b8c7157290d67adcd5ec6227843daa5d191d21c7e572c7281dee0531ac5d83ebe97862da87b746fc516a4d07439822fa2e38de077af094b2bb7dda9426ffbb512816ec57ddd82d68262bdf75ed10bb7dc026beeb7fd9a7b18863c96b9dcbb9457b4f6bbaeeb5defc25aad75246fc53dff059c4d3ef1120a4dbfa9754ccad1da5ae7948abbfabdf6564a77add66aabb5d6fa2d22a59091ee7dc89f5248d2292b109f9462a561c049e9f5fab48a94d229379c000cf0d46717526f46b8c2d3296f76fb872b3cf5299bb30bad5f40565d461ae81ecf2cf0d4a7bc5937eabebad423e0af220c728cc7a2a43e63b5522f9ffcd91a04c12b7edf5323696715ab346ac256b72005e9ac13ac7604fbb7bab86dd51e511f6435a4e0ca9232349cc11a1246962b9e4c21868b36d26b52bafcf9d14c69b60206aa82b1e2c466b9c2609c40a94f55b7ce0d54669bb534592fa24c5c112e47d10e4ef526b39cf3c487962a99bbce8595dc286ef08145ab8926515f72517c6469ca4c90488197447b5d7839edc2e285258e8b0d9a24b2a021820c1aa9192fe3a801e2de6bef9dae17b6631e4717f55e9dd7aac4d85e7bedb5b7e27aeb95f75e91f2c831831e07f4d269f6aa81e71957ef8270393428b20f64ddcb2f6ba717ce9f39089783b6b961695dc535bbd76a7731f670add973162f76f9581bab4b16794ddb49ab1587f5effce6c5f682da6b2e29efb5e28f149a5e63c977bf0ad26a5f3d24c57336f149b78980a5189342f8e52b694a23118ad83772bfe2466bedac15ac5562cce6fbc47a71975db45edc65efa3d4661e0fe71a5f0e569b3dd7071341afb04aa7042f155d6e3e233c2fb5d65a6ba5f59f597dcbf03f5248fad5820b1737d966dbe1cbc5e60e5f2e5cb874467c531a7dd665af777fa4517e1914847fa411d8753e7a9c3868fd20fa933b79edad5dc63ff7b30e0a0a0af2c01f69044ee5e0c2ea8b14ce8797d2691c21ee57ff41c2bc7db1e1338d6614470c1334303149e205d2d61b18c20468d63ce1a1082aa48a42901f754b9c104c755fa7fc8c46e8891405050720cd0a93808b215c80431424f0a18c0b8aa8978a8ed5f35aa9f016492491eaddba76efbd172bd32cbcb126a358948ae6b06bf0404a685bab7cec5bdaa1aae3a8eab8a93a7622529dbe52d54a2b1a29541ddb30be54944848ea565971b3e8101875df3a5fb1bed2b95a770b5f9aa343bba299aa5ed5fcf01bbcf75e34d2887e757a0089849beaade20b878ef55661f152cda1faea9f57ffe8775fbe92e6122954bd36216d8591208d988adcdff9711315a6228570131d2bcda25874acd58dc0d0d437c5f29ac01b3edaddee9640839e7fa38ebdeb9d03c1475c9fc5a260d0250a85d2794ae912caf4b4894e26a46f004f7ace79c473ecf2dcf975219e63f7c416ea2debc8b55ea323f5a123b5b22d2cad3997694ecdaa58136bfa9c998545c7297ab941b06afa8aa3925328b4d2fc26f7557eb5e789a6de03456f8cb5beba0def141d97e4ce15e774e0a037ae4e5135d2c87abd4ae4adfa939d73f8ea5ecd52ebe1ab7735cc57c757ebeb158b5c1b56353a9a76dec8f4f953b4550d1d6bcdd5293ad6dae57a9ee8e9d27ba0e8eaee4453518810da3a5de2f1c99f5d697d29743bc8d2aedfb6560cba8ea411087ffd873452bab7864e47fab9cb67f67bc2bd9ef1adb6fa79ae2ecf2212244bedeb8dae62167fd4db3d9242d78196d036113aafde5dd1565dcab694ae07b97e74fdc7f5da42adb9aec37aea1f5da243d5afcba2a74c4d352787a25195c6efeb84df0ee049d727dd53f7d475e9a43a351d1594aeaa7beacc74b9ae4d07a793539f406982529fd05792d2eda0c8e8ae4bf7344757dfddd353372385a85fdbbdd7891209495d2820a6e8501bba2f9ca771c49c2037a609bd6a9ed25b67173a44bd3e51af50d415c553add48c34f241ed14c3e986f7490a512737d6080cfd39f5a4b8fd3f98449f788b7cdff85de4f228bc1a08f2757ad389b2de9c6e4ca21d80dff5e9af53bdc9a0383df51d62f4c4b2f4ebf2c99f9db11efb378027bd733c86cdfb84bc611d53f4be559452396ddd55a75b75b16ed5bd9a3baca043fed6734dbbc44cff3976395fb6136af5bcfa8049212022f4bdf2b068053bc8d2b3832c7de548a1ea57ce9528deab7ac3a077b11ebb052ac22ad55b8583de3237b367b0936d555d2cec370bfbadba57390c81e6e818751442919b45deb0f7500be3658ac097cd67a6c7be29d5e35d9dae1c29846f151d753465e90cbefa47e5913fa272643ae87b75aba634ce582e2a7aa2e89e2a9a2ed1714e4923107efacc49a34b973cd8d25b664d0fb6f4ec6229082d21ba5001e794124d322b27252788a7ec4b5c0e569707661be89d0301bd13b303c9ddc4e2a57f9dcbe53625cfb32e6a3dfb117555afeb3a3ff2cd99abb7392552eea6ea94149a9e35023254524df435e912263a5e35618046efd98483241aafcc2d5fd518a931604cf952eafc88d22d9ae464d54a6b0bd35f2012f5d34a0c9d9fb24eadb5d69752f7c29ca24b7eba66a38950b18539f5593ba7285106337735e7c8ab49676a564d2b7e66fdb4b4360551a1d65a6753250a61b609011755d1b61eefc2157dc8a75b66a99954e8383ddbaa389b9c9cf4ccedd0a25ba8449dd32c4b27edc14153efb94153efa1a2dd5dce3925d27459efd49caa5f9c798ab202141891022da4eae04b0e51af740953d18a87f7eca941e76fe639e3effafc28d875f50355718080f3988a15106a7e836f05edea908c2346ce63ab02338fa9485a5f620ec10f83f0d8f5383b962e97b20ed78082733507cfb4b6ba2aa7a61a3ae737411d3afd364263a17c25c55e3d60deb90f98778ee4b78732972f89e4656884beac869bce7922ffd997df904647ecf495f412351db1ebf842ef49854a1733b3100c3f28a7a719851d5771cbac2e2452898e70915651bd49591bb9e34a67779b742b45db0933bf0e84e65614916c9ed883be97a34372e6639f74e890646209cae3a2c718cf39b3f73a594487e4124ad43c761ef8883dc2e33bd7672ec43acdadd376c223d767a24d22515169d1e58a89324f7a40c2352c4d4c710595991c1824ec3357b14faa8abb3674c4383a62ec31367a52d1117b877d471a2d73209dd10163920897ed9520086a5a0da4e928a47212514c7d3cac80a8214cd6e7975661b09a7c74ce1cf25673e4c861ab0a28e4f8ea455b726c94d6db83faf7657a7d7a63b842eb3ee44f1f738c1132a62f71e8c3faf524f953edd6ac31274c98a79f4942aac064f1b3be845469d74bab30537e4aa32aa44acb5e5a8549f2f3be0e20bf3893c5042a5092c51a132049799b5348957ebdb40243e73bda759dec6ced26089b5dd0e7e1a477a5f2d5a96cd13a5fbdeefa4a95a9122dd12d3a5407fb91ee7af623788a2860ef9630b99e9d09f6ee478b7699a551f7d575bd8e25be75ce87dd66ddeb0dbbc535871eac40e325d53f5b6fb3fa84429a75b6d9d14453dfb38d9d5e279d4f9f072e88791086de60d6ea42743475908eb30929545f56294e3921d0a09647b050c490a915866080102a9011028402bea4f003901e508042809613b028e9600295127018e186023cf9c1e48349d2a421042448333c0740d0c00718e04164470574eca2090c41c0030774d0000e16800b82230142070832c00624dc4400ea7183003f47190c203472221b396a08c016001a00a88d3d1af088340c663eb2193119b01d507f2fcf953b4c7d83d9898e2c84bbc3fae943c2dd55fdf415c2dde57e3a03c2dd49fd7415c2dd41fd7421e1ee9a7eba02c2dd2dfdf414c28db57e3a907063ac9f8e42b871d54f47407842b8b1d44f570a3786fae926841b37fdf412c28d977efa08e1be5a3fbd00d37f84fb56fd741f61521842b82fd44f470a3f0421dc56eba77f10f2087784dbe67eba8e705ba99f5e140e85db36fd740fa677107210e2421ca15018146e10de42a07053ad9f7e23fc0937adfae919849be67e7a187a6823dcb4c916d208f7c4fae9b5b027e409f7949a857b36fd7459180b61e1965532b77138bc549aa0302dc94b757e524ae9d64f6abf03e3a7672d3ad2ba837e4f35bea711be671adf9308dff38cef89c6f72ce37b9af13da57ccf207c4f31bee718df138cef19c6f7f4e27b46f99e01d9d39e2be69a7d30a925b7aa13ef9b812f1580b6f0c0176803eb35837d575741281d7fd0d35db358d537486ca63dcfb3b3dcd58c38c0d568d0203208cee276ea3c5544115f0b3abd7a05f964b3596783389558d77e76b683b5f4f47a1564e706a1cd683cd68e384dc5339351352e888c590fadf928a9c5e1705741aeaeae7a66b53906d1b63643dac7e1705741aeae66cc66b0201e441a490cbee0bff1f7c1b7e59b774a53dc53534ab3b5ff79049042e17d0dded663fad03658c4d6638eb61326d21108beb29ea11572948a70413430c77045428ea051d75ab3ccdaaaa884efd4204d4a09661938c3fcdf8c52ba03ced0a6943f1a38799e766997862f0f6d874753b1b3fab229b9beec49292f78499042d273048d3ae3e9d3532ac25d196e1e6badb5d6867f67ef02bef7765ffdbbd805de1d1a8da7a7077de93629d2177fce78793eb6ac418dd06d4aa3b5d66a6b6dbef67a1501a450952885aade08f5a1816d7cfa3da2e3d41b19a7ebbd4ee21f10d7c2ed3aa23db61a3564f0cca5183008b15f7c795eb64b7bd9aea8944522f566b78c5da594b41b6e09d67b036fc050fb3b7632787277efb5f7de7b2d00c0209b527ed903404848070083167c4022d0d3e78f8c4925ad7657c43bd67ac9734eabbb1a03ca42c33c170844051be94054400004aac287063405d097e9d0ae2e5d566b5d36e6b2da585550deea24c543b6d67c67d3eed080b2d0538694c143dbe9f1d1c216dbcbd365d62383674a1a340a04d00868b65651ca714ec9738567ce397d885b5bab382bb6d8de10587cb94c282eb6505c6ca19061f17d228a8ba3b051c49159af57cce0dbd2e3859e128bad5d6ce1c462b118977bb9587cb93871b1bd5ceee562f1e5e204b6d85ecff33c8b2f971bb6d85e272cbe5cac9df2867d1662af17981823f93983a490133d4161507be7ececc55df65cde078bc564b31d9a9427a339aaa73e79a0663d326a3c57863b830608d221ef8501da771ea64df1caf1da7c6654ca799c785e22dc996bdfdecb643fd3210e57086be89fd268d64b6dd8b08101a87d360b2794ec048aa4b1d03d18c0feca703d84001daabee66b461c6c20bd3033a1ada4134012d12859bd46a34451bcaa0f24850ce974c8bb161f55a21d973c1098e2902b3dfd854e6cc1881589cc40c718e8481d488ee60927d38e3897ac7448b5ecea2a91c40cbea79e9708f2c70574023d7f34f0a85446921aefadbd4410c1978baf24988b37720c73892ea140875e27b8948a3a3cab665576a91f290b27168bc5602f39548d4bac7955d47ba4e048495197a174e5e587061abc92b06b90813a22728b2e2d6d00bcd4c4413bc757f34a8e9c2c475b41a3e6d0281228118da2371a2585a81f51dc49cd1df40b5de2c9f34a0e6d73a5e6e9154d96f382ab02021a315db2785ed1a86fda1941298d6ef7da2bc3579fdfedf64aba7edbc0da2bd3b9c374e96ae2a0eeb51b52290ac4d2bc9a3be81789833a5dea681871d3a7d1281a0580da7f3a9448b290cadbf55978ef4412d2325d857a6056a455300a802716e8e93b4fd24199e3047a7a093ab668510794de7ae797be330920d027d0d273185504bafa90677ed3f4734e2626789855610567099c4c04f19d13d95e0c7efbfc403105d04b397fa5156f9cfefaf5acdf60f1d76b4998f9eb3e2661f5d7715440fcf5a2244a50f1d77f5c574af2d783d02169b584d55f23d70cdd7891bb1c3cebdad47394f9839c951b323272164ac3fdf661f305511b304fbdd6668ca7cee33f90a194524a29cde678eb920d126f7de79564b3162b3651b38c6589354e6fd684e0a9cb5e4954d778a0e016577c60cd53d7fa693211ab71c9f19b96b3e1ad723a3c75d82b89860182314ab0f0410936485bd7a82c74765e9b7684186f5d23d1e6882d6f1dac794182e7dba0ca081618e1e2a204cc0b409c30d478d1b52b579e523a84524a412ad4582942cd5bc7ba87acd79d4294928a1c639a2488807aea3e12b1e6a9e38a784ac343122d3ab202c6530f81524a29a51a686aebadd502a5a7b6228a2532787aa68e159aaba93167a6783a678cd1faecf4e5f9372f55851356e1a5cf170c3ae6ad8b0279cbde5b29857067ab12f2969d64bf33973577d024b4e6a57ab5a411089ffd6e49a33a2edcf4f9cbdec34477beafd695ab4543081c2dab5e7e8f124d850e69dd2d8c9f5c2255cd59672b562a1d3a68df57cb8330a60e2cfa8a3547c75878b7eceb6ad1313b50115afed59242d981d45424a491fcec346ad6d1a26aaea05948ba851c727976fa0269343f7ba5610e5dcf5e6b98439fe72cf5d92b0f92287b75328926d418b9a2a9643eebf0d9e5249ab26b92cf4ebb904473898660ee984fd4084934a4de9656808227acec4637f17953287898d173e7b1dbe4e7acb3f4ab3acc8150b729c16c40605aacd13167980389698789360c44e631978936cf2592cc63313fa2351c1db3cbc2a27acbae71b8ec38fc41c7ecb150a9deb2c3325eca8e99b25fadec772bfb845233775c3a50506a30c60e4acfbbdfebbb97cea573efc59e979ee68e0925eed7cb7bcaddebd9a5fcb8b840ff2ae80a2f0be4fd428ed9c590136aeeb85a1347f68c993e67ace4f34d8114ca50d682a29442d7ed904a54b3d6589fddcb55a29b73ce184a0a65afc2a163ae5574ccee89958a8ed9f7d5faec3bde684b479b7395c8a37289520a59973f5974216bd18822735d1d3f2f3bef863c72494574ace20c48905ceeb92befa20a82ae44d98be858c5233388419a570472446b9114aaae4307ca245beb8512c9d62a73d24741b98a8045991bad7351bdb4839a52268924129db5d62a9b6db20dbbd79bc56211143c77d50e209160388044eadc25ce30031224dbf9d6d9e28a7e2041f24224482384a15d346747a8a371454752954ed99ae7ae0ea6689c14b25ec4fe2bc95a7779965ed1ab292491cbadddf40a056f1df7d213458c1d9c8ef1b5ee2473a3e91495a2e3124e825ecf5ada4a546b12ad511af443c71f2e9f152fdd8a8e152f775e8a5b861f5e933f0670e878ab9aa411085f1d3b49a3d857c74f7488765e71d457ef81a26955759aab9ed7b94ba455f526ca2b6e7af5952aa2c0a8944c5a096a9a99a10100001040100073160000200c0a064422811c49b25895dd0314000f6688406c5832978884591cc42006628c530410020c01c4184388aa681bc20bbb24d9978a9fd01c927094f2843e5091b36470d0b85ab66b5c8dd138ea6560c8a1984d2f47352c8b6c883a69926311a9631110fd2081fc3a11b2e1afd9d22ea727612cd34f8972c8de2ca24eef5fdd95825427138d00ce62197808b9204863e0e868068b01e772a692ec88d259b648ca1a20fb16fd3145bc9b2c782c1572ea341b8c21752453d58ff3acfffe499796612af24ca8163c3ca4f3c997e71b364b7b578f226469032512391c8b745af095a34eb2f3e13c4d435687a1c099b7747bc641cbbc9b05adb839577533823cff0bda4209debf310e8b6f7082e3988343fb5ae0bec0ca17cad83cce1b4f1aeae53d60366c3789b03f960da6b472a34688ab04f9be9c863e597fea4c597c3c8b0043c7c1080a32572de8bf40771086f2abbd9b287f6d5ddce33304caaf21c599c3ba0380931e10462880e20de7e02e635223729e22b3b952138eaddc1fb41dee558251f596265c448f1a677a0113b8d5cff52bd9e9cb4cb80b760700e199a193ef5292b4164941ac7571533c83607a2519ce769985e5a299ca1b5cec32b484a1082f58cdb8e5860215a9ee06c7a6db0a892a7dc52001fdb03ec5d53d6ae381e029f6becd0d4d414e373d84260288728de85c3e336d20a092d769f38dfcfac120d686921358d2d0304394c901926f7aeb0bb22ead3adfd18ccd0b2a056e1338fe7fb28420b9f02d761b5d1414412793666884023c2553cce9f39bda6fe534e583197b4083bff851e7823ec5a5f9c5ba4cfd8491be4c8c13557c0732662efe826ccb59d26f496d32271950bfb6cd6590c1cd7a8c305c2a9e2c29d0fe179b60b74f49c3c73c8c8d4d4a532b891dd54254cf7a2886f3b1b150a305e632e0c7fd273446fd6134bbde0940609e4326939d2571c2b84f872bbec0b6abba7802d980de6a0fc46e8b98c694eaaba786b8a133050718d1ab29ee2e895bb395daaa8cca228a8adb82d2dd8a07a2259e50fcdc008c390844d6066651c8aeb33bf2bb0825b2afce5ec53fc338cc750d12fad3561c4cfcbac6500b9e0627ed3a1d04763a22d6b4f68dfccf012df203896f0d2bc2812d0978ed0ff076a06dd6678e38900610660c58c2adf183c4a01d7c8d02e22d70e6e280d3426e4ee9d6299f0f88e2047cfe25a90154ad14fb02c0d2726a38a72d9e99a055742b3f5416b685d48790732634f4883bd0478a74525ad4268741c7f678d625ad46830d473821ab487a33c82f5a44d1073098b2c1c9034c200add96418f913272258629d4d90ad11e6a8d2380f60af4372b43c1caa5538d29300946212a824338896bef87358ab240c7cb1a046ce58f2c447c406cb836875ed8d042c3319ad94a09a1a84689067f6384fb0c5f4e8b58e30a93d91c65eea2b8ee67e9da1dfbb7a917120acd1947d29f9abbfea881901a9fb129c1ed2b68b2f9d1eebf7d0a1310966c4780362218c480eef3fd90758ae170146f36195593fc59a91ec0da9d3d96fc8e3fcf831d5f464ee4d95f540ddc6ef4613d6782c05c5ef9f788eadfdecc8b0fb14da252a12717ebeb64298dc355e57058ebfc32a63381414b34047dcb1be59b3e99b887b98a780fd71e45c2b89674941709777d74706ab07bc1eb003f8afa4a2656830ac9d543ee6a4b5b1a505aaa829d48801faf7e08500fcd6af7aaa424f6f05b8cf9dd4f5565c7c3836d37aa9dea0f29d4ac5a78e8a6f5b6654a4168e374389646acbae89d47539c2498eebbc18138548891883e4f13e3b9d61a2d4a07e58df60ce2d8eb5ce2387d18b98b4c1d206069ba9239b9817022d2e67280bf4c2a17b181456c982316820d42281d23f68f12746126802a4288ae23bf7f4b0d6f52c60d5614a199894ed8e35b2983b6d122aa31c28759c987da4913a7b0a1b2d29a61a22820ce8e8a1375f67edace243d18cc9ed364fb5af184cf55ec948c4d961a35df3fd11eff603d13facf93e04e72e2a6f797dccab730ff70391c423ebb3da48038c3d18f43e407d8531c8833bc1dc876f91faae634f342de19be35e08aa7727bad8c7c494b2e81b46121b4ec8477554781127975d7b842536e480e208ad60184e498d6529d79fb0a3366526af683548809a6d0b36bf7443b6a15febf844e72de8c28bf5be9cf058a2c494513b6d223416615ddef6abc17426c032e84713bad0ca56bc77410afcfc13e8d7238a05e26240d3d665b593595273202e7b9957043220a65d80e4bd6f75b509ef98249d4bd4310c5e3a0dd6b84141ace0c8ad9acf2d928e9a77c2458a64c285eaec173fb7e705a4f214ab31f688149927ff3a77794ca27e74083fb1e94ac12d7cfd2c319e08457e3d98636cc44e9ef5a9b8e365e18b70f56186a5d510fa05a3f665ab02aa03c2ede69bd122d5be77972ae37ad5fe20c9057966f64ff898f9ffbe99ea6ea225bd2712ec98651e4f953a33a8db5dcef31c4ed75d43c34a3031806dec63196dec9b71ea20e91c39183749c7526b866654ad21b5edf51961243d420f4a9b3fc10d64c2806395c61ebb1b922c31a47a1113334ce6d194ebb25fdc246ef3bc337c64ec11c8603aeb8833260405a3ffd64b4aef64a800bf97bf7b6d1087673123035407ef680a119d61a9693cbc4b5001c24861c57cfce6bf81e3262fbd4df15df6c3b1a9f9cae268a42f549c35f1b2dc5572469b3f2a65b5c6b60b2f6a3ed22b7570d1166a945de45048b478d55c8c2de2e241aad80b572733174a054477b81df6dfc4c7e31907102240bd6306a82993e13d181cf87d5aa46191bf687d57e4001684380c071122f430e65d5643775e79f3d1af79f30986f5fe123c136153c660f44b5fc117c54fdd8048a5237664265fe6da7d6f049d5bf8622632b2631babf6ca32e888121b13890ad0cc920fee51468c0a5e7d89858a69718e6cd49f150feed2738ea84868e88119d981a33711be023977616f4b86a62a5c815861bdff35a5996c79facc3c6307ef5581398483e3918d54b35bf3fb967aa17837e3930eb1d582f67bd4a5bd133815c62106d7caad7bd58ef15eea21522ad420baec735de0fde628d637825d7284d5aff932679d2336e3c8c0fc758bc923b4a4e43daa340629faf4b4040a73254c0e8f4bc836e9c932ed5cc269ccea3ff89692c73edfe8861c7e49800444e23e03ad78e1856d95607788e787f7c67cf3b000b43aad7348ee86c8bb5720ce922c61f71f0c92ec50e138e49ffcc3a93176f3d795453fe2f86aba7f57dbb468e2055d102331962e23d2eb8d08a184ab78ddc8a2137f851baa7b6e5163bb4962bf872518dc94d9904d04fb3ea61e6330720aff970127cd4b687bdff5992724fb8954839fc7b619c3606f1e8536ea593d36565c4d6f5adc01cbb989b6d84c618d76ebf697e195e769be1b549b7e622a03529ef421ac0ca047ebda48149b10f16824bb1a7294fd379ddbb05e358781334ae78dad50392eb1c3adf7560f94cae0bfce0be3875e5ea2572564482f8a315e36121fc551e740b4779be8ff04ed6c19c63beb03c3027dcf0473aca08b01c52845a82f095280ac1e5d3a565cfa196979ee120f9b0245b20310f264937ecc38e6c833f25d6b18c87028adcf9135d9b7175a3842c8b52bad5f4b29c652896c4396c59ec6efffc09f82e45df4dd4fd228dfc9d286a2e2e95781e3a7f302545abe5e07c735302b778ec9b0d317dbfdc8fe86341c22979f47243bc92ff619adfaa28486953f814881e534538b3f0e89f104d630f6b173b601c50766d391ebd9a86d7277921ba4437af31bf71d64d640041eb484088519db13aa2f4bfe4351216acf5be64a97744ae90d453d4340cd4363a16dd00dbd958f4cffc5a2e90c38440fab5d044233f530d78672dd3d80b7f96eec7c309dbb8667263b8e9704284fba6b307c47138313972b0d26d6f944fab5d0ef25c150ca8f8671026770a16068cb934cd8296ef85bd9955dbb3b3cd21ac1688b622ba0ec2d5048113e2d0d30a456712b0e86780c9d94507b0a8009c0bfe322e26c326f6a1b013065d1028aac045c3258ccbd7492b21863efaa8d6d7000c92d99d934b27418c77d4707342349de433fef487c85c9e5952c9334d29f5ce4dc2635b7e5de42b621469eef98920eac5d6b5192652d2c40b7bd91062a652b6986f957f9adb7623d77e86d3da542c64407797b744f3ea6ce42b3c31809e7d5169a9455b2907677dd447151aa7622a46e64b26d34e488a616fa5e30287fa5440ddda78a19997a90cfb9a422978a86375cf178c52a7e8b3bcf95cb0dc02642dca5934ce994595c248356c16f628dae11371eaf75f58070dbc7c1c5678eadba2de5af06263dd268651d04a2dc2b30c561e7755851951d4d9e7b7558dc85e1076d5464b935cb238bee6490cdf9570cb020a94f62541f50de44bac21941e9e7567039f67b817e7969b8e7a213ffad8aec8713f77b0a66a28f2eaec7284e2d708b74e109b7650a3e41a0533bd81516bafcc22b896c9f53cdf7955834d47163e4ad93dec2d81ac1decb0cd6b5fa5183115df5510de59f1fd9aa5fd02e22f6c2fa93ff4f001ac995320f7c45d9bd451e4ad6d2321bd72ed7f126d69432657befc5fcc7762a2ccd8621ca331cfe208cc9ca13f1359f482de354983b7ae6721c1f82e7f0f2b86847e6136a9304502a9b04cdedbdb660d21c6ee9c7fa13554ffded4b91117b48a14d52d0a2168d12185b9ea81dd88276da5cbb55940b01c4a8627a80a8cdb08f8d1f5cc0abf5bb28a7f865838d665cc3b9b442df12b676daddacb993200a6607a6b6eaad1d8448e004d6f9e7bc34fa03e1fa995241a668953636c758e65ac837fbe212840aa29265fbc13e29482666463fdda61b00618b513b8d88b99096f1803e19c931cb0980de048636aaf22420d320d88a0d4005d45cd480eb6574e1a9d0a3d5458ec989bbe782862c3dca144e5849f5e7a7e9cf3c15393bd78cc80574b033ccd59792dfbab594b66f06a3d13d84cec2622ecf1e3852556a51a5dde3e4834758ed8f7dd446d17b92599ce12c35bf073a183cf2576e960d2639dcc4f2a97242c1912cfa082e8d26208857568a3b66541c8447b2b8ff46531879e242d7a044676388b8ff3cf2dc986e1f2584721538fcbde0b5baa6e7f0d1796f1081eb7881947188e0640d0b7907e657103405fdf6ffd5eb31dbb22b257b9160b63984be24fc710d7b50847cf096de19ce867e30b0498be2895793f93132e514daa0b8ba6f06c9bac4cd036e271358efc4c18939f4bce9504f2ed7449526bee36990e8d7887c3d9e729e267de33365e3e63130cf4eccb9023354f4b761e3cc9bb2e3c8e65988bca0a5315c99bb843f5774d68cda26f4fd88ad45b593f120c762d05f6ac646a6008e76895a4c8e4c89bc6ea12758727868a5843a4386fbeeae9501d9ccf2d8a15c397c611662348913df1312e1c4ef3290ad5671fbbf4dde45de15e8a6cac3207884daeb03aa0dcb4976392643c46f67f52d4c0bd080242930e1437341a6f582a27355290c90cc67c1df378bafeac89f02c41ced2ab7fba6226cba2d680e27cb6925ec41dd2210ec25c6f919d81c7558fb1150a71f3e77d73bc4560076dfc9bc8f4e2f5d178e4cb4304008d2530772841edb625431ead9720e025eb6efcd590b7d462d202b840165985ac528c7109d92cd36ec1b52f5b5b1f4d8924873729c2d022d764b6997c938b846e1eefade05da59c4bfdcd51f1b98a5b70c4324422ff5317e905229d91e046fe7d9f6044af553570e33f680577b6d70c0086c4831350a73e83965713abf7f643c2997a2de31a1682ac47bd1644e94da1c25112529104fa598ffa4abb5c9d7e21d56df1f384d1692a804683cc595cb2164ecf99156264c5f9d2e9af537bd8062add5eb471e0e03475392387e9d69058ce12089b404bb54f00727959b9a38b9b67dfcdcfba4f38ed5dfa947123332799362fb26127ae25ee523ff13d185c9a54630421dc3484522394c74b806235a91e4f41fc21f34d6cc241252a90054d40da1e22208a9f63e1d44ddd9602dc46a8a795c810220a2cc80774fd4c2db37048e61435cb21b499008e252793a8f5867a03d6098e466b92222cf3372fe45b222604572a76bd5b37184608163ab81165ecbdc8ae812c3c7df180220e3c91326f69b1bbac27a073b237f58868508578913ee2bfce65529d76993aaaf1e4908e4dd88a91731cd41985ae1670d2c6e141db08a2f634ac5b94904ee2a38b97f529ba844f9dadd597ad2ac22b41025d2e4880488749c5d59761aa0016a6453a20890e84c235346d19c240f5e93a5c3cb8f48d21d4135d083cca26701b9e927417455dda89ba1e0e86d006d7934586ccbeb28e733d5959d729d0895199edb36c69cee14a04e8ba4a940398263549c5980d69cae9697d74b45319864e8faad011b8ca52fc185fbc3d0e4f8cb645d7822d077fbc352c9bdb09a831d086a2f16a5c9d8f5ce893e31997432c69c697aa9f9d987f6a51a737601b429387acde9814bedc094b6ee211acf839c36f406c4859fa9a27f78601ad9d1230f44fb937e0881fd7e5924b855eb03a78320b8d528753bdc41cfbe7b9f3d977ab6eb2b05ae0907915948a0f1ab6efd81e2b526535c12531c40eef39a6c31889ee1fdef7aa07c2dd6ba88ce0d1d301e0e80929322925345fb442c7fd3c2c41e88492ce13714bb0c07962cc68c2752d8b1269175d419082e781bc3342067ddf6d2bbd8f9e029033a0bce5a0faac32358c69971e6b77ab5d913596eaf2677ba5aed19295eb5cd71db5bd91790bcf67d7050efaed44fcd67b94ad82836af9791123a2c60f138ec92e6962e68f349132ba948963fd8eb0db458a43200160941242df7ef7eb386f82c6eb2fdeb15fd1e337d1a24f93d4921b602e34b215dc2dfa3dd2e4c6a7194f4d3e8c9c2b6540b73b0e006dbf590fd42ce903ee4585b1dc2c524f7f9bef414aa1314897f43de3e81089a0711b27776a20d51ce7742e63bc6e61b664b35a7113664d68499f4a7e159356cd7298cee82310433cd3586dd50e4f29324952ed2237166ce719516bebdd21b5fd89cbb5cefe2f76f8a1122ef7e2088a93ae7b26ea22675455262ac959c1ecb9447ff6d99c3fc886bafd5fa254e0f36d6f5b9c0eb47efb11f75bbd7c14939f9cfc78e218546dfafa657668d1d4ae03e9808fcc27ae4332016e2518075b31a27a5516515a5248e6c008a3bc11a1e74124af9a383fbeb019a74a9bab6be4a407444f1220281b88e60825d4c99d3dda903dbaf4415dbacdb3948130add493caf39ae5e9deee2e48711dd8a501175803b37afabf35f475d5c4d7a23e54aeb8fa8b08d86fd3437f4a9eb882a4c7a1a59ea09cbfef0582ea728a51650e15848ff089295e02de491ffd9673a87ba6a1a4e967cbe3738deed24bba55154c14238fbae1f87a895bc43037f580350393f1c33b5bd926b6a85d126bc76992d33ac573e55c47c412ad895d6a6a9b69ebdba8ed9acbb78f188222d44062e81715342ee9b0a39427979404d377ec92482057e485ec827e89dcea08c830d6fc6c5edbefe40d73b41915f89f36a70de8f53ba6a75357117a146d29aec00a45febc4235e3a3ce48240b1c24ea5511ea3998d38d785eccef742a90112a3b8bb13c19f86db00f7a4b3efa000518838a50c185760049ebec7b3805c1e83f0923aa15aaf75371377fe5a58b25188522ecf7b4430d558d2ee13f9d611ed3da7d8f239b15d0758f1afab2a2f83e6d44e95e65cef4f5cffede9119240e9ce2a8b1bfe893b6140dfa8b931c50cd7a64d27dc77f05b54218c014145016df4e690fff0c8736c7fab0b8fabf9d294fcde155887aeb242abe0814c743d683ca4c1bcfd14ce7741f5ec6f4ac09961acd297ebd3a14a6a021b8d232c7e8a8ca8996676017d38e99a21cf0c697bee201abaf45df1e0fa9cbc40edaf7d41af87deb4c7b1f2f772206c3e3fda4a577882d0cd13be9c3de35e97db67a3c53b704f2e4311b42bfea9f07bbb387272aa77d97cae531ff90da05bc6faae2bb0c591677a2c0b22411979b894ac87ffe6b79af6696f58e24ef557eb735a35a911a01791e9c2dbb74221b45191d958080110b55c5e8b416898a365b883fcd8950b9c6d0add71f352001ed1b81115541adbd24c3259ca30a783243ac4aab49db084cfbc590275f053e55141d14585730671ddf65af48f2a88537d083b641a13be5e69b32b661447599a303a3df50256bf3fb0b58b700090145c40e5f9fc33a2803c0b391a1ab3910b771bdcfad88b4a5dd183f91d0063d8019d743129a81368e7332289d0c1540c39da3e5a7722a8526016973b3b27df95ed9433f07e5838525826d8908309d95357e4fd5343a9ed8139191e6c73340a1b015e932a0d6d20ef8c7094bdf96e8a7273d39d3157f12aba590be857869301bab1298930035e78f5c6feb2bfdf5e68f0ea1c849f74a3217dc658860265a57dbffb44a0d89cd6b731fd919a697e2dc5fc3d865d88c72ed39ea84f2acb9c7114252e0f6f85a654a37361f552e199f04e5609dd3e27ee35d904b26898e459b35b1bfa378741425274b96db32edeccaeadf7621bce02460e3cc122c1b9f9133c0bf105e75026a18ab0c588211415b13edfed22e0981e36ce292aee57d1a26e80ef5a3407deeb13f1e2eb0bb5952faab0bacf568a5b62ec195753d60620922d15596cedc821bcc799bb9773091a1cf61b89ab46cb32dcc3cf009f8a6f878643974715a7a44115cc62faf59cf07ad69970e2dabdeb6f84c73ec0ce3445aae4f345b7ae32988567342538800af4fe4803bc6af3fca9727e52a0c45e45ecf4eedc26189c9dd54eb415476b823c7e6cbcffb15c657cd7604ec67be39714774924ac3c28729cb6c0e78b39a26e6863b122cde2b9dec1edbcc7d052eece673841e5d938ff5fa55e9881bf47015e6d23350ab55ce85bad0d13149ec22534301248d2ce84c21353f5d2b13552b546d113616e9085f57af45db1f3f38126fc4a3ae57e18861e3afc33ba2b9951613e0ba62f4e001e64674f5cce7c42364308470ba7fbcba472320850a57d4a6832b72ed7eaad50147924db90849e6ef49996e51d394eeee59439cc4b28ff16864bbf4217268a7c8f6ff50346bb40c3063f492575a7d5154c3211f03804b4a16830cc6712704ea3cd1069e2fe39555d30c007e74b9482b179f09fddd9fe4b696a8782b16a8e16e6782c9a8022c64407a7d9e8f0a8c37adebf33c52d315745b9a863ee8e291825f47597cb947ea21ccc7f2d8d7235af47e10384db94cd3bc088fca2d1e6203f56ae705d74c9cc65c8461971fa7c95d7ee6f3b94f4ea71cda926c9707c93e4a1ee15b5e2b6bb488e17a2a3eb09956ec29480f3431b6850db735aec82180d833c49aa293060588ffc60477cbd6f19c1b6315ad7ee0774c18acd60f7ff2256f84312a03510743ea157f1b8c5ec79ecd5f3cc0302dad0261ff3671d753d626c006ec6244d7d8dd1aa6f8fcd89bcac710e1943f036b1e1f4c50e30b2c50cb12ae790a1ef79180c31504fa26d007e397dbc18aee3dfa428a8e57655a07572e5542a7d110103a9149bdaa440dde55ba2c864dc66c5b8a626c4890c913767dc322f18f7110ad737d6f7b43e7b636b0bc62bfaff4952cf540001e054259964f86524f46685d1bea4299e0b7ef6944f963002f0d7eec03ea8949597aa782e215a33d531f79d0706a458f91bb38d93f1187a58dae4840b915f5045090d90905cd94b4612846ab1b56321e6f41da24cc49b6c40427a40d270f42f0f7233fc1472f421ebfc9145d973441d70ae61252291d80373a0f6496ae32d4a98892cc606e176d52474d9fbfa032f641bb52bb071270d6272d73570dc066c93a5661ce09c7cb990edb29e9c86bc612af15fcbbde03e64a929491339fd95ce2fc7765ff27826b8c3a7a5ff70fb23d65eef772e542cc1f9d2391795fbc52d8fadb8df3825accf6f0ac05d3f272a92709923dc29d4d99fd26910521981746d19827d629d138543f98071e049429033bb82fdaa9d26ee5e9ecfdc6ebffd94438956d613e87ed55da8b7ace694ed3a9c84496448dd38fe0b31b0d49cb789aee13327fd73a29f6d7af2fe7b6b3a66572a621ca5167fe95f5147382ab0bba3eef5bce8dea1f091d68e2307f52a84cce1ae5b0ae7fa114934429dfd9a764dda3556f47937adf2cdb32dae2cbc7900fdca769fa15e3eb854a914a0412cacb1710d19440330358b4c5bff94b03d04b58a1868d52310358b52d106b144f9b1021854e32c795c9de1ca7ceced60a6132f3fe49b0d2a4b368654f8a66f6e0a8c2513bd1e1708db6d9c8f4039ffc7fa56b18bef649472993397286cc0796d71fa78fc5d932556465522fd2a8b1db0fd9663e27a4fffc39aef3cb515b020eb3ae2c2f85ce2379b14752d49afb3b4f06a9cd44129254bffa4e15e5d0550ad810f74979c9eba44207bb663e88a1bcb4ce6e1a09dfc4b835a52768df92e07805ba2f317fe6d646864b36c5f54b3c94b64df05a3af1d06b8e556a04275acd8281c4bb80148bd5d4e0ca71e74fb4140c9ca8135551253e78f6dc2f249d2e57989b0f51986baa98058fa68da88215329bf5bae43ba865f33f095dc5f0919518200db02ed797e68930eabf30cef2ec0659d0887dead360eb74917cbcdf5939d520f374e8530be81dc33ec812d5beab1b4cbcd332ec57ec4e16b0679c1323646fac6206f9e0ce7453f4a1ca8f41bd3c33110f0b1b0192d7c29c4c2240b823a9be553388d2fb9ab063206404160b4ce1b4aa2231c44aa68fb89c4f0e6681ffe91279ba41ad80de1387b4897ae46eeace0faad46733295d810d20d5c97b94bc6f269718c5a652d682bcd1a76f8281e5ad2710dbe96d06fb0d40d1c9f3485660e080b123f316443f97061f31597393034b062120eec716cefd5bf49ced0477393420a276d21853fe52638f1aa0553da7081ac04b3ef708ccc84f4bb27058008ae4ca9f948c522c7afc442c3f24c8614e490223b713cfcc3a111cf4cc6388c5cc609efbe5329dfb6dc726a59cc605034b668a55eaff9d954701392ee588b19af356b695ccc5603a962d60074c59ea391a9d482532b10cd6c9fc21ff1a2167e76dc5f21bd0f94ae6364bad4e3faa2af1ce8272909b292323e30b5e9b146a495285c1376e44cc8c4ca6d4e782fee0915a1adb5940268e0a8285dc94fa19ba4a64dd8e0f799c9f10fadfbee10e5b215681290147d6978d5b9fcffa470a8db0096d67daef509eb82f17e3c829f594cc51618ad0dd2f728d3d41934c2c6916cc4a49408c281fd9e82e346ad2bd83d547d1e98ccb7e3d37fc78943c38985a4a091c64ed9b289bd5107287d2920c1b982eedb1f5efbeb710d255832ea3bf6248467e861338bbbf519ef2732e3c6427a7714aeaa4b4010ec70635af08f1240eea14810f7a01a1ce69475e268c67ec1d279f9d497022e37d9c9ed04d6e5ea7240a3db48aca1d03094f69aea6dc0ccd903765d208208dc0eca583eff898693f017f43761f54ff63b9a77972751011231c149e5a8c4778dcb4eb3d839026ca78c1d9b934c4c04faad227145f67cc3e46d7d4dbee359e27c8e5f4f9b8a0f0f210663b1ae2ec0ecc33be24504f6bf2b691eba67123f710879d5b1946ce976cbf3d6909a55754e3a16b1fc75ed1df6244f5cbb5d9e7482d4f531afbae747e1ea9e6455f95d4197742428d7ea044c112545e5a1c3ee396ca24e8b72412dcc7a17e9201eb3dcb2be964e0f4f51fef10caaad441f2ce7c1b088322c6225d5808f687e639e2222e8ceeeb6aff75e938b9ae9af0e6002b095c024344cb37e480e81a1a252c97cc1b3fe0160305586dd9259a6a1142eae7c914bdbe714bd39a860ef60fc90e12a520acde4acd2605c943928292a79c211b034fe2f60b9a67e4f71b11cbbd309482048763625129f9c2a65e66a520cfd341676e5004807d20f482330dd3a4a08efe928e7b7c786d0a4ae22645f2aae2451bff736a90efb154e3837bc4c055200ce6150b52fa998f97e1e6b20a0bbad0f110ed621b9bd4b08049bca3f73755076e261deb3fcf7d26f37853e8ea7f8175f5228f0e95edbe59008492015ee532757602c5ea17026fc29b1365d89b95d8d4526a9630ec69faee96fb6f0e07d4e6f1dc8ca1b0d5d701b99c5016af19ef5b1f3616367f090f24ef5245a892f6dc6c5849119d710e8eb61a833286c8fe646c433dd0148f2894105582af390a1dd9f20aafb279856ad74f03d0092c9e070a6aa5675315854dc024427b75e788506dbdba8489791ba290888d3c1d75e5125ca984bf82b861d4371cc9bd47861bdec1a1338f1aec89466f846e9c7946275c6c1eeb1ffe5586556dafc97ed3bcd5e9cab764320935b925fb97267c94ed266c4c1e86e4f4ca4bb4d7e2cb29f09329c0632e1e3a9d195aa171c1446fd84290c9f215d160c227dba8c43ec5c6e56c350375d73049dad09e8b348736973ce3c5ee4d21e5d80c84b08043091b53e397b7da1ad11a46dfb80afea9edad0fe3c3e0298a09329af41175334e076308379e4554346d2aa70fc7b45f9c4a7a290c9c10085982ce86a2a14ac8a260160249c2009a0e4e1b386b28b7cc1427236f053da3b1c8a6400cb9dc5e27d326995edb314af8caf8e4fa14ed3e4217503bfc26267df4f546a748022bb3fd9d714b70296625753fbe2974d8e8ef6a670d568e872faa85a0f23350faf9424a811348ea81c9f999cf22da88573ca1fea0dd635318ddc84e7b69b7c5ab69829ef45c02ef0c4a8b321892e7e28d483cb8830b2b7c4d09b15854fa15ed13a407234ca4ded73cf3a692721209bf7874747f68caa0dab9c52810cc7a5a123bdeb57c33bb1d58159b648c5275ab1f2797650a6ac8dc1d0c7303c20d1c30c1f9c79d46eef02b06fe356b9675cc18aa5a2ea8a51a86633b7e34c097e808cf2ed1053861a9b197377052702365ce837cff3143abd8db10b7905ed711f436e421556c87f33634f7b4e7ffdf574605535fe33cebc4e3935522c690f654555167b72338efdbd9f5134f23ba92c4ef239c23677482c8c113fb82cb2b224bd33d19731843490d024902d6c9757aa6c6d496f7c1eb071cff57ca3db00b5fac0fbe18a53494af30883473361160f3e68e73c9bbffcd7f6d50a78caf933d06e56fc90107a674c912cb93ed90153209e88bc7e838756ab4a34456fca2dd4ff16617432c8c3cd9b2672312dfb074a932aae983b66441e7cd1283e2f5e3845560824f2a49999d4e208ff6b14cd42b9b940ee0b0a7da0ad2c23bdfa63b35d4b8d0b7e6514902402a8b152aec3f95c9db0441d040c8ef39488032919e545d42659595f79d44a97105e5bc3503838c807cfac7e92fd1379a68b69e6446d9d3bf443054879110d93c47b8714abca2073c62db8843fd1945d6af59e46232a442106c02ab42619cef22638aae9a43937282ff2d7f24577c179ae57df46ba33ec5d276334a770db4c536cf2dd8d923662d106aed48eed1d50f088065bc4fe26e88db240074d3e769f3562e487c660b32a3bcb21bc6290f9b5483d324dbfd62cadc68e19d6470176170e42f68f57006412e6148ebb3601f7c5e3987bb00f13ba53546a4caaa63c844daba852ad6f548917246d58fc603818782e956cffcd5161c56c7ebce5aa904e390827f88b261ed43f602aeb4fb9532b4f6b9cc696836077d430f4fb1d6d2ed47629c0f069c0c963b7100448020e87d478838ef1fe2207e5949e3053024245fe695ef6d8a41a96465919d196d7074006c19c9dc263ecd589968b4361b866baa7113080f0153ff62d3850b36fa48b52a8ba974ce65ef85c385fdc04a2d4a3f5d1528abf839bc26dafc47a4e32c7e3fcacdc0d4ec4c083f850f0fe82380efc4cff2cc46b7adcd6244747c86391bdb792cf063781cb8df13cc3a1a1c8a06bf8267013aad14594a8e31192687a4fdce5671e1027b4395953ea21e8cf590b4f978242d7c45fcfce4af4cc899f0b8f672a8772caae1152e14805f0e9e863dcbf1046abd47acfd3e10bb03c0ac8264c3d5270c472fc172c3b9e02140e3e6fa03f88b7206bf36d7acdf62de60ab8508bcc92e1579007b5a728765b02032dc3c9d708d258045cdf5a32b193565170bb80721f442ff2025bb5a943433723e27bd3569fc3a9989d5be48191f9840571a86489ea57c7c5c729a08cc7f185cd9cd20af141f37aed64c0d50994e1d0e330b311f4ccb94a26396d045c558a6118fb54827226a118d68cc524ad1080be862512cd244235aa68812772c0dfa0ac4cc83440568b379e8779202bcc944f0035115de6822fc41400d693c1bfe22a08435300d7c9254429a98863e90aba08dce435f8855304d67e18fe40a88c6b3806f122564c349c8379102bc6132f4934805de34610508af0fc1aa6391303c64ef1ee5647c0c2990075849d3e3e967c28e7efdbfe563ee9a367d272af6b1429e659da0e29114bf8321a13b648ff2a50c63eef5579fe1337baf48e6d083b063a20cc0c0dfe7098a9f3d3f7b0de78ec94209b297a12a83922419bcfbce2380ea338a2e0e72838b4a5c3aaf9a6b493e38d6fb58b6c259d44e5f79b3b7118f948fcb5195c8da87719b37b7aaaa041765648df2cf2643328012001d2809d13d95e9e1a0ae12163486d249ad6f34e74b3038a8c1b4e45ddf80cacccf505be76c236425824bb592c0a7b0ed9049d50fe87befafac32f9515b3560425dca1167ca8105013baa4a56dbe8ebfe8c12312a61d316171b254059eae4040d9c200f1fea471a598009cb8b8d1a502f75768a064ec0834b75228c38c884e56d4549280b3a25a11937e8c185ba48461a32c5e22a8158b95cbafc1a2845078f39b07405b98105c498042e87238d2cc084e5c5460da8973a3b450327e0c1a53a11461c64c2f2b6a22494059d92d08c1bf4e0425d24230d9962715b5013cab2ce4f69c20d80a55e44bb82b9c50a624406150791c61c60c2e266a106d44b1d96a0811be0e343fd48e30e3161715950128a850e4ed2c00d82af996425901f18447222ccfbb02b7981901dc6a3545497c3d984976f0c31e321f7fb5774c181e75e1b761e42375a395b00996706e30e68b1e75b8ef636be036ed839f64d2430c78209a4e87c4dbfc50a5fa32dec9c129392e7b0c2842072bec26f6be549c8a6154fe18cc4498cbda0080f9ef1dbd87928ba61c1f90284bc338c3b428b9ddc76dab1f31db8d1ced1472ac10c164e90a2e76b3cad567c056fb173969848328f150344d1f98a7e9b054f461bac798533254e30960d2570f8cc6fd3ce43884d0b671622f2ce62dc0145fc748bdbcece77c10d1bce3e090967583885149d5cebb5b0e62bbca59d538254d21cac1c1045cf5778da2d3c09deb0e62d9c91608ab11668c1e1b37e1b1b1e463658395b88987786714c2831e75b6ebb76be036cda38f44d249cc5c20982f8740dbfc59aafe22d36dc121292e7b07284283ab9d26b63e54978a335af90ac84098cbda0050f9f79dada200f53049faab36debbc91fba0f3cde1f28017b2a565f6cf87320f9eb0102221b3abce7ef95af1c02da126e2c1cc314f2c9cd83b5f26c18d6dbc29f0f92718ba921cb76d72df96b8a64072879cffca727dbf35b2791c22bbed83c175ac382b0706479c8c8a3aa8c9c6e9d0a95ab4e738c7e6dedf9746fd7c28e7d0a11c0d0e79d0e4706da13827f0d0f28c9ebb62c298f39ff4b47cb2ccfae28b51cc82046dca4331462cdbbb7ef04e704ea0023bb5e861dd62ee15facdb54a5ad3aa98b7b7a250c3ef1e9adf3d9bc7454a8bb9c9693731aaf555999fb30ef216860c3bbe10eab103378c487f3679d7303b97ac4183b193670cad2f85579de8896cb6e93aa33a8c208fba66a4e7263af711a2ac9fbc8394b1f466eef7b8afe5eeb940c5750bbc8b800b9a8f0988a05105eab20d834040fae61d19be2fd481788ca0c4033df3d7c33a5c64661c1b8ccabc78c72d4b0835f54e4a72fa038c1ae4c885852ab00111525f8b815593b107948c7b5e54186d999078cb3763dd59cabe21510f64889aa0351178955c53b2c54a62191b61fbdf2159e703a0fbf30d9903523994273f89d011fe7ed84bac47468859351805d7ec3c5f9f31c0e3b394e0107a34f065283465d6f6df9a39e8609ee579d2053a60b3ff09899cd945c6b724e3f0b65a3e73ad04199788b0d10a374120b64e318ba1518b6bf2fa6c71baf3bc2e8a2566e3e16b2d0fa8ffdf5c0d423282b848ae71ee19e36c1c521d91807a41d76a092d9e49b148a46943a03cf815a9612ec0ef40d6b785adcbdf778baaa760fb1d1fc94df6ca4609459a397b3130bfda5210c5d4093a0eafbbcb5ef06da097404af33f58cf1934ac8361a82937486b731e163ded0c3b701c6fc38dc6a2de15a5474fa4463d7b58a58dc46313d1ac564e8f25b6b9bebba0cc4b8703a0da66913b29f04025db7ab83b1632711b50eef81a825244c15fb070f476f2d0d642f48203a6209275f1f5dd5c13c0e793cc76f173f812f2a69f68298bf964f45a26855ed884a3d6c080797dbd82183562c8b6ffa858d2cc10663f3385aaffcf156314c8019fac96b96395fe0a089773886caf5b3d0536cb30fc2eda0dbd66ff51a03a06ca18256ad7af0399a2e96b754a949a2220e098169784a866d2592bef7f04bd6b44cd2aec0a9ddbe02ca7af4fbe566c7722c76d05f8db29841957038af752b6f685dba8bdc3d0c24852099715f1506e9c052839b6d5c492a5806214211253a32256537a948f8c9cce8db56e41841a690640902e6ed06637aee73cc9d88c62e841e1aee4a01435c56445f283cd4e71b4a4a1b6b24b6e09cac4439e24c78e1ea20d68d2352edd4e156302b283c368e460bac0c6b37e85b1376a8a3d8b10b9ca76e976b7d0a27eb30e3fc3228f824b5ce4672920d0321a4504b521b26fac26410647604a2b9e218505905ac6830e578d5da9a0b1cc5cef3836533812e601048f36beb6943a0e29d2e4e7581ed82c6ca3264b2388c6344093f7f110dff0e24671aad4fe9ab7b2e5068302b86ad44016639bd73440f0b09369768e850f2a527733564085d65181ee5042d43939784aa4d212dc150ff9169e34973722e9988d59dbbb64ebd52c06e32d1eb44deac95a6a7f9dc6ca0a31929158303e25a9ff9e78c2d5d2fd8336c544269062dc07d5e299d89dec338e968e3bb37384b699555d934a44e55dd1350aaa7890d0e1bd49392abaa2ab6a423ec45b2e1b972ad0a5e4312a23200bdf8a861816f8b798b9c525af0a7e9225ad5d7829f13d29ae9d565afa74c0b0c834c540da124113df24eb437202451145bee4f9ba3e4629d8b3fd6ee313b0c642f3876e6330271856f17d7f0808ceb468c8aa4461501b52cdc11f25f052c318aa6079b3606488eae3ef3129e3b50c74ce954b170e47d49708ce09d2707e1d660fce5c7f96ba51ac964d6b52872ef167c72408151def05dfff55d3bbcc740bd2d1e95376fdf220bbd016303905ea2e37e0eb7b4461a7c7333775136591d928504541cbf053cda8587f82097cdb9a1f29eb8d35ea07b5b44bd4f1860adef535e26e0bc64d19d49bd04441a79729088a13c44763ae102d6fc665b4e0c5a3b5473f297c8402adf68e9e350753ae518e990e50e98ff221f2809c38472025d73d0a57835a9949d97fc851be3cf7bd884cc0bb010220dfe4904b78450a1a987f9cfc3ceaf122a569415cb65342143e4b474d50797d3671b3cca55159f0379c516f3f8efda9141c18ac38664e8d1b4880dd31ff0a7dbd87f1d66a276cff943d454262b65832355094e2b9649f8def5fefb1a0ec0c0b460081c1b46684160e0ae4e2b0aa333e1966300a7f536fba290ae26901b0b1ccc9fe6d5499c593c2b09650edaf9c0df192f1428e57306ec859f862591fb744c930a1375081ab442499567a4ae94d2ff85c04b626511394feded1afe38144b8961124058ee6b9f7ecc8195696248c482af462c79a6660820f62309e36e529120675e43c48ea4576c3ffc69a10b65e59b521483c7cac79633cd62ceff5524624e986d50c6f121d24923531d30cc0d58a9af881fc102010677fe03f6f6d5d2e53de4fe093359f71f4ae4c54e50d28ba4f2dc0a27361a03c1b75569a16612c883dd0f07a3202aa2531253b9fc6c3479ae718e3661280e97c0881cbd3324ebfc5e28c6d5426821712c4c6d2909f2c4bf6b05d55c34090925a069297e83758dd70484556b70592587941a15cf8b51b2c566637a5a0c1e11542ef3efe9f1559186843cf92a0ac7649a01dfd07dda670ea82b4761e3ee08323bd45352a8a167bd1d2fc6e57b00db702b5c653507ea6bc59d30e3b4314557dcdf3b5ba99f72dbb0cd50b521f907eb9c0c1a23befa716c1f17c360799db9b6af2c098ac58d3e0a1e7e03bd1a410de8acaf49809c48ae74e4b74757b8742f469626b17c36353bc2f283d268f43a6f3844c50b049d90919c8b880f817c2c38f47b3d112977b0051a67c3603fa0a7c7bf6b85b00a61a8bc0a111fb8bd057e4c3b31cb51f590e6010ddcfc07f1b07ded4a11b11b23ca1372b4b4e754e0b7e0bb2fab952804b629d341694df23501e1f4cfabb52c2ce287c3b1d8aa6fe9e1231a58f92a90184a2a96e3fbf97b897f11cbf23920c09b024999598230e0dea10b3419acb3384a51f8280a98768b06ef0304670be32ccc4885f6913fced15c970c3edfd1d3c3cf304d14cc2145c4d7b92b01b147f48d7ca1a0df677e6eca4990d1ab1610b34934809527de6605bae023ec0d991cb67ff3470c8d8064a2bd746515a18a1cbc10b7c2c37749177d46e54e1a1e711d958600a2619b71c1e7699f69e10a1fbe87f1b0a5dec69fb78e2ff026caf2a01d464dced4d9633ff00bd4be747558c687ee30fd97b2f670145070d9513cb64562900faf0d17bd2203f27d0b24b3de05970cb1cc77c06ac4ba1697d590ac6ffbb1e9454c76bc028e038d8196acbd1dcd20a89e401c8b55c0fc636abfa2714314d76ff0dc10d761ce848d97758fc9cf7dcf4b187dc81c39a7b1175bc0023f0fc832f52ae71c49e95c49cf10dc9434fb0d45dea0f2e9a07ace7e4bb86ae6b417f46d0ce51ef69fbc85a53065af3334bf8f4e748f745753effab451ad6be05fe07b63f27df957c1c65f207de845ba474de70896750373fb5c71f06a9c09a1f559f9af3fec83b460cc631444930d1f1049cc506f40d16885c7604b1498488a98f009db89c8ca7434e6681529e08c7737873baecefcb2f910cac03f19f934c75b1fb99a5a51cff246b9f882a62176b04adf151dd5b975c23b4b0f1d1d5a97f5efa529810b57fc15a1558a9c0713bfbada52bb675b6253afbd18e33a0f49af35112c48bce3848698c9c1ed690f7d7876325a294b55aec2c18485cde97a38a1efb6947693f73f25b846829c1a64dd2447c7a02fc607c41a074142282c6a375081916b0c3812d2da24872c38c01c34542457093e3e2fefd6441c0186e78f06fc732a3ce0808d82a4e8079d19e8c2deb0808eef02bb3c837a0a41a981f0f56d15160892782141b5454e9997255bce5a012172870c17ff4deb187d770e9f9db018200ea7250a8fb0060a59734ded0e2ec06c429a6bb70ee72d58761b2418a69ffb6aeee4d32d090e8e8ddbac382dc4d503295a2c6990a3d2702dc814566309607945eafe75b77e08e52da6be0af89890d0a82499ddfc49dbe206179abd760a955aa5cba994477afb55c2581cf85d7351a131316b632e76194256e7e9ad19bbb15bce9e1096c11cf1dea108713f4c82a6197090ed74f73f478bc85c0385ebb920b6e1aeeed21097ce049d507a5646c955d1670c9613e59db1c25bc3cfa0fcc26cfc6fd83a90c0626e6522000fde8e28145d215272b915cc86fce2eda39db0550f1f4d0d951ab332de1958f44438a3cf36236389344427b332404b0c887455849c8d1a0db2adb4efdb40ba4d260cad3a412ad91b6d0706ad68786fd1708a1435f4a61a2247ef48c3e1ab8de7173dc32905752cbe09906997c4e83c48b599b63499a37ed0142bd3567451231872407d621431799f97d39a4ccbaac6a528d3da948d961ef9a87dd7c5beba82ed1fd8295fc009287c730499cf7ee891f3d4a270962be5a10c33a16fde6e67a302e3c447318dde6bc4c216f87aec37c5eb5ba329b836568602ce815cebc0e671417617dd14be1e69e481b3b8105fdb5332d2f13831cc7df05283bf72f89b06da0e1e2e63b60259c18a03604e42d05abad91f70315f3e3fdd5f472e16aaa34f3542b86178eb53c144e412a196f32e7bf363a86a9262938e63107bb6ac7aa6010bcc913745e237fd427abba480b278f36d6ea78521bbd4d860899d5df4988fe3341210dd1dc4b606e22adcc6713ebb2a4a38930ccf4f6bde8b0450a51d18b504bc9561aaf2b83cf40d96a153ffd0d00022f1ef56580543573aa08e2964531550ba6b2593e9ffe35b118a2ba9ae5017979421b9dcb1c6156620110c3d9896b06fe2bb4ee778b3a5d2182a799a8ffe34928884286e4ae20658ec769533c74f0aa16575f8831127854f05eaf03092c97108b06260909a46e6ff2bf7b90e056e57932a19eda3469e1e155c8d350a8dc6ec49dd49e86e23f4fcfa9fda9586ffa48334b69bd52d16596445475d2927d469c2ea3dd29585a60952374a97430be42744536196fa057c627f0455b90bfcb87bff138561c8fe44e73c9131b50e0b62c261636424f5737418f3ee0c3f66343f50bbdaee30fb96230855f7386ba744b24675322d46105c56dceb46cf6ff4cc819d6af61bad6964850fd521f0a03e200a2c7825190efc3d346736744c69bc5072ad4faac8b11bc0733f963e30a316118b59f9665c3d16a4191ad801e83a325f27fe1410e5fc8d884f903862b5d16020331e7f16ac07063043ccd3deb3a28825c729221daa2ac5640d4deb58907f2df3a9340112e6ba446679294605ac38beef203c8a3009e00b4c83e77d6c1cd72053d0e43638fbb1051912dc7bb687aa9a84724c13f69ea3799280ec7c92abba8b878d5decd00d3a978c2719cf787e6be10855e95999b4b551b327adc8298f1bfb66a9f4244ea388254e32f9ab336a2fad0197899c45463a9af71a16b5d5ecd450b21430281e8d9f92c1448fff85d0cc2be251aee44b377b084f9e38d93c21bd01d14d016ad3a729de1d07c2b63cb745e6e91483302dd2c3bfd6c4648321e1ef4c2c7dd9ea9f748e9e0963bc0fcd071e232cd5815e1ae84f8501661a45ca2fa44f229864c2a6aa6875cd4776a288fb818b3684134574de2997a99eaf75360ed73fc5772f90e89b502825feb2db4bc3cd548013de846b76d8b6fd192baac6117b24e68d713b2cda3bf28ca84dd3aaf26c516e906ad1b827f4a924753ca4847a2930dbaf9d54f09e51e656794ee9a580b2c8f4eac7bd964d17267842e4c3730a434b9248bec7f7a3c12e4cec3c6a6145e33962faaa1dcfedcf7f1d199bbad576f24e0ea7bb989f8b4413bb63f729061b38d9d6a07456e5886fc57d09e9f3de940903c8e29a887ab1003d93365694cb9c059d6ec112b5d6d3f81c835d76ef9589763ee2bd5a827347a80966140a5dcb6e133cc357b5850f866f6906b6b58c061d5f6486ef53706b38e4a10ff7985056431b36c5a3f1e5d265a97d0db41937a1f5db0be88c326e6f21b70832d6c1f853a6ddcc4eb855d909a5f82fceeff01416d016f4923a1bd793a90e6c9e4471a81be286979a7a84ae3a2ddf98321c1a106517e7e0ee97134fab5ae0c956c21035e122537d5ba0ad278926de1ae8148866203ddddb50107e34386fa75e6106e2cc9c583cd9fc58d8450df13691cb70cecb4c49329b8c409a8fc9b25bf1b4f3beed5d83add75e2f95e21813c78b3db41327691c6d9b303bfc264e57f8bee2181edd163cc8cd0ff912811d0f8b6e8686ae14f11ef6ecb361e5d5a1b848f132829486048ab820b66ee030565542219e824c5639dd989b14fb9b74d9008f13a109f49e318d37a206fce276a2f9e2d787411948067d1ba3207d3f5d5c0800c6b44e8c3022255fad9352465e22e4bb624b87f7ee355a2d0219b14ae94232aa2d72d8c53e8c0bc2b4b4dead3c5a496c7686a6976d12c905dfd9d4f68843759a4c80cf486f50ee812bae91e3eb0eb516ff7c503b3fef5ea4ef8c0d54bfd5d160bccfad7d7256102593ff577473c70ea27f72dc5fdb6a4092c7336c90562e986635d60a78452d7c206b647fd5d151fd87e72af52dc6f4db090f137bbab1d70eb59cf2ea8035ef9ebebb6b040cd7876ac08bab1062d3a8ad328c2291c0a34dd5dfaf240346ff908310003b2add040d79507209b053a884a99c6d8236ae52dc496962ab718cba4a00c63ac9282f28db1b4eca18da3a7dd1f87a6f9bcbfa46a35df3277582592e5a2844eabd3bc375f398a24710b95b0a9f3c38f3947c18d95103ee7286225a428bb619f5241994bee27c45b49a8d620aff560d6c0060a35b427ea2faf917ed1c2693d2104554e3705216b0289e4c7b28dc2099417b6cb78061254073de602b18845feeef487d73d49ebf2dafce58e9a37aa5923deb507a1b41ea378655ee4b028333e2a3bf4f0cda3c39c701bd10e0cd29e24e535fa9e0caaf2a4ad60846ee8580b2e7f5b9325cbd488b3c76ae6e2a90ff03591500fc3e0391083ab640bbe8d439831c20529d7e50aa209c5c9c3fef4c4786ffa195722d7de4aed5ef4d914be37b6e66a6c3cd63ea1b031569c4c172117dca1569b98f245a331ee00cd386d5a2e49a69d47185cc74e30820a2dcac48ef6e53e9426f03bb43985a2876145bd3f277e71593e9b3b31e66ff0db51e39bd64c544657237ebff429925410eb444e6b11c7d98de1c92ec47760ef620a77ad4a57c31ef30b847b899c44820092815419910696dc573b4aa420a4901f77519fed92aa0f800a2537c87b3828b7ec3b1d2eb33324590bd1828a2a7c5ff7fed4953fe0a5cd9056095cfc7ed407e7df2c555707d461a058375cdd84a1935822f837c7cc1f5df3b43a7de0d4eda3bbc30ad0e7927ac713c15d5568d2044b8cd5b1ffc5f5a15683250c43b70a687f898e259cc800735cf525932dd925d288fae06072dd812de86608bbb3b82e0222020ed3e4324c75aef44cb3cb14b71546280bef72b4c341982a0a86e78f2a29a100ca9d3188992b0e43368dc88f73ae494d02895773b818424b7dcf633c07ae30c90eb9389f6d0d475f0c9422813764fef5a242c48a04f151a56e4dd0db8816be4801a5055e8f61f2b5f1a0ae3a2e008b679a8da0abc5cc1eb5f5552edf65eb78aba4c6c966e0b683dff0506b294583ac14f7eda8bac32b440cc97ef8143b1d76702853dee6792f859fb056069f3a780f013a7c1b994950be815b448a1aa8f5e2facc5a49d5b0e2e442a0ffde8b5837c05cdcb91eae0bb3dab8c827ca01cfbdbd00b0d094f73461fb89cf308129047004b679549f9eeb2e4c23ae7a59dc821ad0dffb2168b6000a0d759b9b31f39f5da37b728bb9638a7053d65897ed26a6096f7f41ab00e3af235b0156300eeb837ec8ac889b598acd35f2582dd26852a3f57e4f95a8aeb140e1b4d16056a1c9b6e3793b0f42936c55cf9088635b82db19ab9357401f2848292dc98c2e18bbe28d493a995a8c6e6ebe5bbb73f58dd37e28b54f58d1eb861e34fd60f256974e585f7a1366a415a0c1bd09fc62eb44fbab18b9f53576d34817f457c3203041fb41d13a64d4074fffd502c355cfa80391f9e11f376670be0712a8b551091b5ab37060ad205a38e9800fc963361e94b6ac19b81ebddea86dcfada726a5faf4db8d20919bc0aaa5aa89e04b2956ceeacdecf005678dd6d52e1ff45cf743693c9f86e0a0452595f47865cd3d16d13fa20bd13ba6de2cefebc226574aea3b25012475bc5e29eb764531f15897ef13c0c8bba924eb16eef9ad0be4c803155fbd69a0abb817bfc28632cc4c0ffcbbed51ae63b7cec7d2a8f5bfc306ccb50cdab998f8497229dd86962c94f82adb3a6cd55706507eca0c5f7acf584124bded87ccaa6f500d5c13376493136b05561e08dcfbbcae73f94b575e4ac8593a411ae58bfcea4e106b0e3c8c4e1004eae393c7a8fa88a881d243897e27095a0d13524700b0d72ad3751e49fa58eed561a93dbd5010cafa687b7358b89e13696cd8820b264bb94f03afa50d74f1faff45b056d34b6b4e9064553e798c724497d6271f6a100da9ea201c48e9393e129a0fffd22a85869dcf87c9eddaaedfeea8ce468a9e786c6273ca72dab34a18d3d1cbcfa05b25cba931f48a47fe266378efe9727191a393c0217b302987e6cbd973a04e24f7b03edbefa327599e932bb9c6046b1cae71fa4ab740a53186b9ef8c57493b60b805bea53e0fc14b34a699a1e08c53eca84429a7cdaca5ebe92cf92fb1d5e43ef96103193b7403310623e68b37987b45d05b7c845b1bd0e0cec4d855f68ac1b45c0f7bb403fa933c87f619dc29e3ab9f856ac159994240a795ed4ef91491200f8854236711dd823b6b9e52f6261e62ac9d392e2b3bf905015262ad1629e511c2174081811e7459f963d6dc97556f2ccd11e8acb95fecec99d6d752a9fbdd222dfca4a0e1e2c34b460b0a878b1b58b321a887c1b9816044a835dea243bd7934a35b940bfa8d974c722da2a1d2fdf943200d80dc5c17e93e90b2fb2c5d2021c280ab7e59326cb8b24aa99d3062941a47dd1b9e67c5a681a98d8c4f5c919fd047862fb30b69e624e7c53e9ed518e944c4eb5d1fa1f8426e8cfe03122a338ec7bc61b7d4533fc7ed8bd89faf8c81baf7de9dd6d0f46ab176ea33648dbcb7d4b964b486b259439b4ed1dad2f7fd6f95c06c673745aa06505f5be35add950cb9090f625747dc20183c5d31889592688f7ce184787ed77ec622f8336ec3e7c2f6c33ae064ff09dda6575c96cb64532e4e2d7f28e6244fa8c3201c1111631dc14181451601ef460d2737c79b0346fc73f10ed8aa919aee35fdc674b947156bd2949b6caf4cc667257eafc8a3d889b079c37ba8890b8ea14bf6890e60309a0e5bfd1b5b1b8553204c717b26a89cfbd59aa99136c2bd420c96f938f10dfa5a1ed8d619ec444e8d9725b08a3e4c4bfb71ac199c318cf1cd658b0d316132d8d2236111fc56580c0f7da5216b565e741cc8b799f5da90ad105146f4437e8a0145a8a553de5b3a8db826c3b598ecfeff142199ce555b01ab3c7e51f4d6928780656d8794b191b0b6d9f8e6089d1fb9312cb3d3662d53228d1a8509f456f8a395045210388ea066b18f65f2c958a07a1c94406e3316cf4aadbc6da3521aa76b33761b00934c7816a63b584df92ac417672f715f6d36bc154585dffaf515af5bc12286b28d8eb435ce45d132ef647595f81c2cddee13af6ee708fa83249d681e5eeefb0b140f2c58b984f1b6a3eeedb0bc8438fe6e1af80364037dd882a6991b4aadfffd2b8a9269c50d959c9de32e2ec3fe7ecd99280698221bf73816e82d918431e090e12ac6c65866381cc35cfeb7095578aae65ca0caff47f48d744cbfb6133a347a58eb23537521648dc3838987d08ef272c233b69553259102a68b3eb2dd6d98c31be862343dc14bd4f64296f7f0954ad61874c4acead9189e407a189ecef1d3963ed3829e94722c23b46f2acc1f0ed2d2cdac1b9bb51eaa25558bcffd1274e88b065660fe571d7956f1e95975cc57a163e1e157ed2cc5478a34c5b1889bfd91a05dc8102ca43393781773a1c4d26ea28607d3cb72397f54fde069e6e5653cc46a03e045566cd60a67ce0da8328e979ffffc2a0f7ab157fdf1c64ceaa0d1b0e2fb4d06027ebf26064b3342af12c669cc928a14c874ac3312fd31a7bdaa113fd0291d53ea374af4431f951e33188b17216588551efdf57da7617429ac8c6b147c24f1d91a517b12a098576cf8d41a4e8e976781590151875479169f0390e5be724b1e136689219ce81afa7a9805fa4c5f527e3edbcf45e25694391031862c2d6b8711d9ba3fe0dc7836e43c4972cab2b0a6038465d5e6370e7c66ba06a3994db37deebef7de1faf9a7ef8710faab31bd8ffee1a0ec6c108aaa4a220fe98b998b274707244c6a34a7545240b4d103ef778cd2091b63a6dc19298bdaf4e931fca2ee8e6f1687d218fa8e4c5717a419e76d4911c4d283cb4d4fe9b0a57d1e8fdeea10de8cc45931718d7b2e123c0bebb612a13fa77527e6769a6bb10c71d451e001f0596a6d682fae94a23e36a47ec3e55c29318d8811f7e736a3cc1e1c7709140e0b681d5b977dd3eff7dfa0c18e74306dcaec4276e9f6a5f254713573e16aef40e33195144efc32af99034dc8a069b2b5cda51489565c38cd56d639d31edb832d5aef348425f867f8c4ef9817bd0bbc6498e36e871979f7a301015c8323d82a3ef90d9e14886bfe8076f53068d239f89880a257766c13f631557f5d1eb8e2b78a95e65311277095d3057bf10d46bd1b709e1019032467331f8cc6a49acce6f261f50d2a201067f994005f04b9582e2d02b2ed6ce5131753191a19c81c07af768b00df8d12ac38f536a40dec12a51012bbc15aadc87acc3e64db45c5150f1e6681dc201ec8abfdee4f5360c2780c5e0179be90b4f585b396bceeb139289a347697ce88a800b5a7fc5139d28933f1dcabf8d64c30ff5c4f5251ef5177c0563afde0273bf4f7758d5ff0d81d21f6a9e531ea1a662581dd9d98bfda00ee955ec609b747d5dcd9924ed998cf870d973bd04dbf112d1a2ecd92bff315cb1d7b37de6289f6ad79360d3d65630b526e87052b7543b3780c4f393a7bb6186b275df4726b07dabc82037ad8dad52489922323883f2e249fc4e698bc07b735afe7eb5a9986a324964d628a399530238c8427d739a08621523579bf5b131146f631023fc87cde8d599280cbfac588487991e48e8ecd461446bd968805719bca5dd0b98f491b27fef6571b831183782aa10da8b92f9431f9818722341b804095c5d87c3fe5e831aad4b08b0cb0dde4d24c5de9ef09fbc86d696b88dd505e60fd3266919606b48218a5742d224a7cbd45d156e9192171142c25084e6f4a95e282813e91a73fd0584c185b5db1ea8dc20bc6f12a3e3220e496a03116ca34614698cf67c12bd9d96ee2d84557f9ca3487e8d7c1dba210abf8b67202370ab46c724c9fdb170197c8087ccc83fb2fa028e448f9ab111e80ee4a5fb68678126efaaa39c4baaca109a5efb75af28ef154a114be33b1a6af9c2681694f0a759c09941331b1a51f3c2a570a00c6456e75fc03d2aa37f1780d19cca47ea1e4f3b655303ab4e90e0396461fec6860f37612891eee6f0f8519c7ffbdd69c0e72f223a810f1744e8a19e6327f60cf19214e21ee2438e5c0386e155e644afd788e8218f44850964b24487aa304d47704828192cf0a9030694c3904f6c878c2cc638623026e90a4eb2a14f823893c6933f32375057f0df8950af3a2844177cd52d06315869bf088b883449182dff8c3a52c6d3d464ca86bdd0f256423f1f88ac613cbda33be35281316efa0397f2fa1e486400d2d54aff63b27352aa70c386c64cf91ed5aac00071e84fcc30250ebdd80dc3017708f6dbbbe62015052cc0091188a7b88180117325a655b41f02ec624258daf3069280da5e0c1339626eedeae5c3e87d470215aca51b498bc60635cd9569a88c7a4b5b7afbe2791e29fa3defc7a0c62908ff3bb2f9a34fc95b3ea42697a0039ace382befb5695c22afc9a365044aa0af392e3c206203fa21f9fc0812fe33c50e3d459bdc9f1e5d06bf0725702d9ce07746fe4ffe17f9abfdeb69ff821dd0c1fffcaa9d58c33ec339ede10acadc67a88b35be2ad6ba651b7d2be83a0c669e91079f1f678ea15d90c082b1e8030246f188250b53170eec8da2f364dfe3eb228a6a37f85fc410144cf275cbf70601e3e5ae2056e076745a603b88eeec486cfad35591afea8454c428e08040e281d05b880c9234f2f59614197b754b5b575ffa751303c990b2974a484aa6d70395e8185b2717d276b3baf91e9fd56f63ebc7ebfe8bb09ac224d58caddff39e79c129cd31addd699df9d5f73efaf1b53c45f33745623b9fe36e3ad02ad08367131e7f9e5267bddebbd3ab3e2914c210cb1dff4b3b0ab13c3137011a8758c231a121621fd5608c88713a8107a093f59b89759841f639f2357ff1c4a9707fb12bb09fda115f8b7e1aac1b21cb05ac0cd6695717ffb11f42c32d1323acfc26a42831cb20e9a9f8f573af8ecd394bfd8034abe6b0f71c06ebe41df2ff59b04e016b5b3fb39b76e5c57c5807a101da84f539c0f1a807d8a58b9f1295588a9c7c669f44c2ad601d88cc0638e9be03d645c09187fa03d4ecddd319fddb333a86bd14c243ed5c23799e39cc946bb8c2a764294c53ae263ffac935b8b06510862ebde36b20444f1ab9c0ecea55616f802f0ea416c98a0dc32c364eb4de35ee4479ddcdd06c6c6b0ea417291171ddf1176438dfe996233a723277228bad2e6736b7aac66c72b82d4f2c5efa7a22b742b401c6efbe28b6ca6d7c6cbbb5773d2e599f1ba0f13a6784fa838770eb38108d3994274e43200922ca935dd05ca2571ec4ac87541e43f2ed80a8c92f3a4747ad83af7e0f7f3ab1444e675b8e06e5d2020d919dd402201217a7754731c1288c7913bc0a2311d02310e5f54b5cf90781cb48a14395a7b9319812e496de7548810337d04edd588436f48eac34b7623d75eead662b7edcee37deaf56eeceb8a452d8418ecb7d9fa7553becf187343a0f9541e28a3b007ab50db8f18d7fd473628377221aa70583e8fd980f54488ad7b031f9df69cf16bddc61b4176d1eca6b74e86b7fb568c79b5740b8982dca8ebb5cb64c11da6d761fd2d56793982430f3228b214ecb2e5f4b8cf879bc13b944311f0031963802ec3e039a2036735920cc69950e45fdd1d5c3ba554b3aaa192c97008f30a8184747850effee18af06c087e97c7c8f77c722cf6055b07887030ea49f5d664abf6d0e31b153286459fde34f80c89e67a2f75f78f8431a595a42f6de5bee2da54c52062b07e806ea0636f3a9cde869e5dba39b3d47d95b52f61db9a3b6bd37c9a11b473ff4950ca0b6a3b2da68b4af365ad9c31ed56fb21dd597fd0b39fac435ec3a92f8eb25c81af97e8f4912f7bb9944761264dd25f258497c379c91fe42efe4d9fd6c04397b77bad8628b2db696868db089ada561236c628bdfb46f649ff6e6c6676d9bb4a7fd99b791491a913472c95af23e26857e46d2eddf39ae212444d63da286b9e937ba852a581059e3e4c8eae5e657ac86acac5c15ab66bd48a2a5f88df6a0144ffaa8dc4a00c87ae514d40700599f38053937ebd3c8ca3542bdbac2f2a4fa7ef32f9ed461eb5eee50da7977241f37eb386ada9fa6d1dbce3c2bd6ae596e5627ad11e9397b549f46525bd62d0bc49e7eb34e305878f2a4ef85ed452a9f8aadfd8ae55b4350b65ad91843b694daf5eb039d79c2d8be25cf1db5ed9f2db6d8628b2db6d8e29a553a6b38bf25bf771f679357a72c5d722352051bad9b8d46521b6d49bd55ec49f5c959a7906eda7e57ba8eaeac4f9ad4b7e1b4df2a58e5633f9f3cba5d734586f0d75a562e372bd725ef2009c16a7d52c1dcac7f03732ebff915bea9f00b8410e2c7a1f57874dbcbd98f509ad7819fc98f3c7f7f9e3f0ddd697f9fc9f37ef9cb5ffe7216bfd827fbf2f7b29898c52ff6c9befcbd2c26e6373fa5fc7df9c9d892f540f0fb0fc90ebcfd951d9c4dbb2b778b92068444bf1e69d6aa739d58c15751c2be2b291e84399babf40b17973dbe8923e3025858790869a6a6c8635bf2e68e36e15a57d0d9efad51c2ec49f55eeb49424ab362cd9b7ad573c1d6d3c6be5f411a3d529ae1313c6f63f2a9d97d5839c8b17443cd76003dba237dea665f14760c6d8f18404d04fc987941246df488e670cbc4b0ed003e19d44b1317ad41b7710983bab83f807d13b0ed57ad6128605ba07d3990c389479b40f760873bfc911deeb0cde13aed9c83cac8d83d2f750adca3bd2e5ae33ae515e6525f601c54a7293dea6e531c99a97d9a5932c4c11336449626595d611c1045081fcc38a9528203be72612a06d845fb729836c998b0fd3970f236c5918102924b61238b9dab1b9e703524a159543804016626082e455cf0122505170642ca28115226ac041a488481831526ca09b48cb113163103cf20051104083556aa4850f3011d4ac025668b1811b8805e5400af09362c31a1f3c67dd2c04d7164845049a9893351873e395ad2a57028036fd3f73c990d3ab030479bd814a743081d08430ca1699be2c668b1a0536c8a1b531592d1e3a6b831288843f4884d7163828465f46c531c569d2b2c375f169a20a0d0c94070583ac8bc70618171824583122c197e4ec0615181353400eb4993ac4dadc91c48483182d36349828204a7142f8c5084e409850c4c44203af2a4480622250c01c922c293e40411ab212e13424ee4da951a4e18b3cea24e0265a296afac50821235a51a9252aee1ae10912291751635130957d98a10268c18c245c2734d8c9359d659d44c50573558f10283922024b799152925404e42438e6826205341467e988e70013dc9a6b415a721b1ab9f2094884c2370c9d61409999ea662654600a3c098a2c2445dcb3714610a329573edcacef9459f8d3997e70edace9f75fe338bb9d42264f911e5ca39fde5475404b0379b784c46acbe24473a2561b996ab0431826b4a35242510e28070c7cbb53827dcacb3a89984f0611a02c48fe83eb34e03c554c2540e489892e4ac903015b9aa92528449c9935a563846a7d8b4cc1631312b5bacba235b9ec44ed027362db3c5c8123e5e122d9bf3d9d14169442d57e01a2d564f5aaa7861b43851a3458536595a92c4a6e8bc69192d2248d1429b96c912265bd3c1d1409b96c9028477248bd60f0d59c44465a9214f962be19e2c54baeef314603a3ca1528d82bfa497aeb22a757149daed76b574437b976eb79fdbedb694ebff073db5bf74957580372d28a98bac2b7501a47fc41fd1eb7ec69fefffe7e747ebff9fdb6d1c75fdff374dffa73fb29850eea72b08acd59a8d8123c4e1e077439795baa820497333e715c461dd657c6f0101368b9df3a9a2c4405871606d7a00eae2c3809bb5a662d76741805ddf825dbfa42e2a08863327aab5adb4af7e626e0babce5a72b33ee9369b4886b21ff1faac6637ab26a1a4f4f3238bfd5859a52e764c0c6356169e1069edbaff3e1c6335be5aa27e5557fd357560d9e1fc4bf623efd7d0443511b3d1b43b13310d52fc2d8b707071717165ac2f3390cc1f758bdc43ab8b8d56179b375b5b5a5d6cdedc704141015c50500030b59a0b4a41171caa15c54b730f1b794ba7a9d5946a34a2991876ab7df3431d1c637660d3c30f366eb5b51309a9450d0685e115e0605e4acd1f2180838b0b0238b8b8b870a499000e08e0e0e2e27a318c4624de6a71a499000e08d0181bfaa68ed57a048a129fb7980aeb0fd5f11caa43344cbfd02b240a7628fb91c9646fc210286b7d7fdcdddddddd699ed459db59da794c1ce144571b7aa35b506806a119aabbbbbbe79de3f1b336afbbbb678f5aabc79acd7a747777cf5ef6acbb7bdeee1e242bed54b7178b5e0ee01530b10c08453e2ba9504b8823b92a0cd45a93c4abf2f5696d89d061b1ca5a6048c0563cad2d215c2b2e7b44b39693a82b4e5a2914c9f2a4153504cb97d6930c60e4a6656ac01a52f3b55bd3af75ce601a2e2d33badcd03bbb4659e9eae42583d269d688436252ace49ebedc15fd0037524d7aa082cb43c656b9e060020e688884b161c488dc913d82b6478c18f1423721a1165be885848484fecd3565d65c2720202020a01e9a6ca01e88d840406f7a12c5a9d9b281d204b1815ec76a00d56e677e66fb9ced9f9fcf77f64f1a313c4c8da213146884c897088726b6ef97ae3b99052e8f1a2aed7946fb24da9ed1f6bcd771b6d7d5852bcca34923031c1272bacb193d1ae90c983c6b32fefda17466002333336e0470266a9ccdec931564f666992961fbe39cdd4d7b47cadd5de88ba63b5bfbb46d5b6cc9d9f6afddc1866d77c8b3edbf69ffc66ad89a94099ff517fb2422715f5b5cb63fc585d9fefeb3595312254068b9e91056041dac1f9ca881f2c2c3858dcd823c98773495cc16f5ebac087742193edbc5279d53103ab6298ffc31f12b95e14967f4699d76b54e27907572a72f03dda88b2a7bfbd603fb99c83e1286461dfd3dfebaf509ec5b27fbf5768b3d8dd5b8ef79dfd3afbcd9cb5ef6b297fb02e30acbbabad11bbda25942de07790fe401e5a02c94958032500eca9e5010b9643dfc37fcee660f7bff89a5076a78a5d700fdcb10f879833567adc7f1dfe985a2e8ff9bc91e3c6e19a366bedfa80beb5dc262789dda1bd3d97c572e6997df3a790cfa66cac9c9c983283be54952b49cb6b5b6c9b6d6cab6d66adbec793d3c09e73c13faec3df8398600efc10eb8691f298b879b76665fc87e1049da9b49f03d1074bfb987f5468f6c8c18b59a69fe8fa3d6b6de62a796fd39be683bcf3ad923fb598fe38be55953b24e396b3d8effa7592b4fcfaffc8b9bf6a9574e95d8d6063db154d60906149d94c63ed007f5f0243088acd923f081486abdcfdef7790f020f5fd209d077c0c6002a3d6f1e9ee43737ad7d0b65df4ad9a7ce49c59af03ea5d158c65fc14dd3af9fbffa5fd97d06492537fd491edd1ef24aa43da3d3feef6ffaeb1157c045d3afb15b5e609ffe57dd48486927cd123f7cfa35dbef3ebbbdf75e2f753803bcbbd67ef6db7de8a48d2d805a7b99dcac346cf878d22ffa329148ef96c66e5943a36d698386124dffa45f3aa9d02fa6310d3c1ddedf5a9e9ebde46dd15520ffd1bd2aa4344a8d481fb908336ec26ce6d3481fe010616c4626e9e3c70a322dd802f054f4d460a3bd11e9e387680bc0fbf8a1cfd800f03f663dd868250ce0eb161bbfb6f6eaefc80e7eeca0a020124ffe92ff2ff954bd02d002454d559f2b31e081f142159c0860e4b481a29be84f7cd15bbb73fa74294932a0afef56ac7014fda4f429376d3ee8d3a3768522fa9ae2ebcbba32c49ffdec673f18508c4a5af92886dec9a1d0f1f5a7b12126bafd31a0dbcb086415bd934545b71d357b4677a132f28f5dae0546a38e2e7aefb7767d15a563b969d62f4b92f42f24759306989ebdd017bd97622477d4f690f56cac86e745451f82e56c8b68cefbfb431e8d1cf2eeaf7893eb96430b303232cb217f16bfe28d4a67519666bedad7e2375af1464f339ff60e58519a256dc7d881dde3bee326b33dfa9e467eb996f4b6cb1204ddf65247f926ca37b13b9a5377bfebc0b34eebbc0a059575b52bd71dc796cb93ce0ab62b886657a75de06d7f3176c358e8644d93138dc81744b060edf5babbbf75cbfde6312811372727270fe26425d9a763391799b07dba97dfd91eb6abb5d6734cf4c822135fbe254b1547ffe387dd671b83f646bf01ed8d86ec9bdaa8f431644b0f6c60f466e9c3a86400b529d1ca7c59fca9442b6148f1d4b6e24f73570dac0ef79ab62d7afb63397e0a52477ebd97ec48aa7815cf628593a7b71d95487e647fc98b9ec65494b5923ce92df62479d2588da2176335c2f7c8a22fc9d89b204f1edd0e3fd68d3b464c345a6badb5d612151515ed1877d15734f4283840c103efdba178efc0c71e3af1267ec9efd0d7580d143f43ff13d360e8c7efaaa07df9bf6d499667fe3245798e1b7b493b6fec53f63a76d4b689ef4810d43db4876a5974d113d5a13fbd97fd890f8b486741333257ac30ad2d7aa2efc8d3bf28a4310c8aca33efa2bfdf91a775da5d1657ee0b2c2c0cec2bc795e553fe84caea767575b3a2f2273e0516e64efee4501bbb943fb95318d8ed2a8b2bf7f595e3cababa55a82a55a7ea132a2b2b2a6b2d0bfc4f2b4ca3da56da260bf3a66474ea71b3c0e5d93dd1b358419aa491ec976c11497717e659b277b2036f03b58dcbf3c6aeb11a443b6afb44114937dd4427749c288732886d131fdb26de44b981dad621fb1bbbfb1cf6a87e930dafe0c01ed51bf6a87e07df3380da8c7e45e9c307933daadf643bcd8df18a3ff5f65890be82463bfa0890d13451684ea8ec746129210e0e36ecf06466052c261001e287fa42cd1777b6f33caf0a459ce93d4048d9a1238412344cb2006962431f3557f4c8f101496946c5ca3366fb2dcf97283cb07fb997e7fccbbf56b0e23a4fc4d9270f8c3d8c3ddc7918d617f82b3924b56b79e2abfe5bf7ec18d75c3de96f0b21bdda5b4d762d79acc8f4daf0f3cd9fcb5c9239db286c2600374b4921814222f5e1bff7621d1767b2628c699a7dee103389330573063ffc34763f2f67f2ac395cbd72c6345809b1e0b90d82975e6c6f393f8d792197fa82bef798b4339c9596d6ca72a92ff07b745f4c7a37ea799babc63a0ce87651d44eac6c1eb77ed55ca5aa5f19534ae9634a29a5945660479fe348f434b3450d4969c60cf7ca44d612113dcd6c5143529a61698d65509dacb8c29f93c7dd5d57e3c7f6a4debb25ad2fba3f6fd40955427d11c6a0b61edd9572d39bbaefdcbf5e30177099215600a6cf9925b22506d4a47768db115aa7925265830363bc43dc98562f376957bd706d8371cde1a86d30f6aa5e5ec54baa57161ca5194b3466386a9b1ac86cff7cd3e7ffdfc230a4b19a739392766bcc93cd62d32d3161bbc7ae356cb251f5d64ba32efd90c6146091d417f4fdc9fa3d6c148d6590b757d2469167d3fd4bd65b2713cddc1cdfe893e89c6dbfb181279d3b68b3f1d27d49b146664dad24dda1a8ddb479d1e7bb7ff1f4ec70ce0e5dbce488aebbc3ce637688bdecb0132f1962d9a1275e92c40a3bcce225df8e07bb8e17f8b32d49714208b151806a72b3790947aca86c92345f5f3627e99735540b8a859bad02d153e729089d3352b61b930fc06ca1273a4944e40713e0a9b2fd20f165f3ba4c3f3e383a57362789b4d87e78adb790526de1bea88b90688acd964db4cf0c3250d9aa2d9bcc9cd32f51725b57431bd8c78f4b1f48736cb66cb220e8f9f264b324bd61888dc804db257d781b243b50d97edc32586cd429e8da7cfd907989b3ebfff889ca7977a2d44a1f5d9e32555eb0f9f8f153848d3a053e7ec882d4ffe105c9c1469d8293de7ebce6d82e39b4812d6b383a5efbbc4474806cffacc10bdaf07fb8f4f1c3e641ba7c0066b364d1171b7e8293c3859bf384fbe1697f2738b5d79d4d715e5e38af34b50261fdad4ae55e50b67e5df3143f29cf30c3765afd40bb597d70dabe69168efbebadfd3e0d376b69c3cd4adf8627e1ce4647d2a076fb33751fb3d144e3688b2dce16fb688795ba1b6db73530b0650d5bc3d2f842a3a6f466b735dbeedb072741e0db9d9c4694a02eaac7bc1c6147583ba32eeacf76fd9ad29b36082febf38e5ccec86a55617cd1e7cc73d8fc1543d3acefc03c1daa0575d3f7ae3c89d6fbfe4f6e2a833e65d95eadbc880522687f4ae943550fa9e3d888f110702fb420ee4b29a5fef6de1b8556ef9ee2aea4f9917f1d4b195ac4b4ae71c8c4a8a83c333498b9e1bb3293064ff132edf3706cbc0c01838a4d716c98b091ea72fad93e7e17a3dc948a6150f77d5ade6b976ccee393204b80f9a03db6d51ba0605b87f7e1cf8797fc294f0a16fb38606e3a94ad20968015a94dcbe891b26b939c3e1dca00fe4319d40735a87bf675cfa81005d25fbfaa05691c2ae84fedef50d65f28838f633540d1267b4a654f6992ec67e4ddfeae4209a3053dfed0cf535b8987122acf1c549e1ac8a14a9023d0190dc43ebf7d5ffc8ea45406f8eebd8c3cc518793641ed1d22e9814a9e55cadb6099a90bef97dc9ba134469f0ef5e551604bbcbe7c28413522c2880feb1775e17fd62f25252a4396e5022cba2a61d14a0ea59405aa830a4a32e5838a71326589ed476c4b9626b6123f923e422ddb8fd91d5b8912860b4305a75d35c03a86cc16660dc9a76c8c31862621e45c9822a78dcddf9fd8184243b49828b9253121059bbf43b91409f23eb941e8d3a13094900305019f669072216a06215f1d3c276c81e3a5d06dfc7f6d97cdf2ecdebe4852dbeda8c56a58f76a1a8c7861871772473d19c54cc20e4506893e1013a1c8e07f1fc61f06bf0fc49928671422febe0f9ff802fc1e8ed5b0357b7342183bfc2177f8e301bc77d4dc6bb5967aa1ed3a4c2d767777a7744b7177f7ea79e7755e672dbe165ff72cf63aafb316db7baf872dbe960be7eebb7256d68093f312755133184aa9bbddeed6da3b6a7b14626b65dd628b6fa5a3b647d67ed7f3bd17dfebfbbad979b11ad7da7b3faf0449f762ea6256c5de5b39d8f7de7befbdd45a6f058cef576fedbecb5f87f165010b634b86a9ded55ac36030c46016be6152b8ddc518bff83e6e0f638cafefeededb61a5d80526a058f8ee9b5b98a1a5187796f6ee0f5a90ded8c04d5bda20eac62eb7208467f72ccec066882c97cb13fe909bc324d7c6e676188149cb97f51c16915a53aa2129d57055439687696f535c0ecc999be7819d579585cac041a26f415d477e64b002c2014a76d365b0208959c9fa11656596a01062998a9521c148f87158add91e557c5f04f85ad237c5d75a4b44299dd15de9bd53420ae4b553e1951f58452fe6853786bdeecdda8865fa6a6bf1f5ca9b923da2232c11c616db19d61f9009a020214c3413e9bd2348688b3116836455b8566b6d77bd9befcdde78adb523b694fce28b31c6175b6b2dc6b8daab433d1dc664eec5f7de0c7e93310118b726f8ca60b258a78a94761da6b1912ad56a39f068cb2e879fed556a41138ac1341b81a80518a82f62a4486ab2033bdce4e118a8166880bef0fff8e8a02ebceb300e039a00b20069e918667ed572e09d634707ba1c6095ce35ebf17a16bd41884a509448e5c4ec9729b32fd1afaa5cf570870e9fabad3bb6b35251a00998204c96c490e6832036ec18e5fa3ae3054f940ef7643d660bc854d5da02c106364efb5efc41572e1aa185a829dd55dad772b6f540cc1e6bd68e5530acea3acab9e2bd5b5fc0f6f5f6bdf75e2d5a57d865b67fb6b3fd5d0b218345cd095b6e18f2e6e6d1424344ca852646b8d8ee7d0e986c8c3a755fc993c039fb6e75c9ed7ba3c634b69ee2ac88aeae13546ddf72f2603b958724cc4f6943e0f7f4d27befbd4f6b2800047557273769d2109d2f9e11cd3c0924f38b9e7441d093ccbff7f7b53953fa5f455a69a520054d7f30d7bccf5f6317640fcc48370d481df913cb5afebe0349ef7b5cec1bd096682a4b5778375bdde6be680e7c0fd7278c023ddafd864792209300860df27b4f82af84e1d46000bb037cf68ed9bebf01ec8404da1e95a02d0264bef235f8de9f1f81acfadf90fd1cf6c8fb0dc0f2b6c1572e5905dcb72500b4680f2ae79155850c25e5057d56a8f392b01dc78d4d833e698e83b7f5c993aad4dbb2427d0534e8b342f570da157bb672335b6b7f44aa593b8e395b6b62535bddebbdf78e39b6fd4b2ee5d175ccf7de7bb59b14a3e065cfcbddc5e2178a26c45ad3e308fe077e5ff69e80b9168715cba9b11ade8761adb5d66e1ca98cebd94b6588218c4d4f323411037348e6300cc30c7ee4ceb55e990886e55937f895d74d5b4b52bbf95ab1e22f2e26cbd3162857f208395508828362052b9755045b310105ceca15516625481089bb42369b44d8d30697e5862651bef61b287b4ca0a10d14af3e5ffa6431338e444f1b9fe8a74ace55d123d6c9d993828a49f979aad224579192d77405e1e10b0f40e0ac00f406082b291831534454152b5f151a8aac0f6cb604b1424586134aa852b1e44a941b3442725ec02a684ad8abfcd5a7499f237942ac31be18e3f25320b99acf94d6ec91100f30e8ebeeeea69b540e953026e6a7e1d36cbbb9470e3106ad8b64b5c9c84a8f301007806875d9d954a9797f04db71d739e85786f0535470671c732edfcb58abdbedc665062eb79b1b9ad9c2b4565c6e57be686b5a9ac31ed151ebabae3c95ca7a63dfef61c3c26e0e1ba34e4dd1504609642cd127ad407a7852a54ca80c3adbb6643ae9d573f0dec29781a90fd8ac49218d1d2b3f80a91a322667e68c112db1aa3002b038542101ac7242c84111ac5b9511ae84a035442ec80b579c3061a2a76a885cd527e86ac98d3ff6f160e7afaeea49feca94e05699a02baba8c0294588dd49bdc2e8954884cf1e100d163dc7f6f91252979868e0fab411a26d887ad47dd0e84e851d53badc78e962678b8b4898224cec10b142551b2a2d8ca0a24504e550f9e1abf22014aa2a82ab8ec4e89d1eb6bcf96107189c64d9010a1339568a7c01e2ca0d1f153224c03896e6443e70301f3a7cd454d9fba7b5d6924a6e76a5fea13517521a95e105a0f623a93483deb0e5a594d6ba1bd9fe8d8e92b45e17e880544e10f5c8a46cce8bb25486c4b8c8966830d990e101da14c7478b78c40383781346a2f1a37203c20183f8e0ec9372a59873f594450a081e34b131c14192439faaac21776c425011a24a580c7b8018b19df48a005a36cc497202217b6eb693667d5d7ca86cff9c1b7fe4e3c23ec7ac0c4797403f85754a2b050285cae303242b0aec2b434410611d1719162a2ca00e5f3be3a68447569d8436c5f111d3e109e11a19f2c037336e61066e757cb85ac1ebc916dba9bb3cf04deed56cf122439d2e50e0889be28818a3554b8c1e113440391151b54fd1635cda4c8b549ce1c216f5a638224a28f2f3c3579698303870a61030031a306e52d8810a991fa6d0f9f13463c03332d1238248470409611177b24efde5ce6b614f1ea418daee9943c44715f44cafa95d423a7cad1eb3f4a8b968253525a42626543edcd00311255d301c69c207873e47aa58e93285ea9b9245067e7989ca7553c27433f6586d8f7261076d8adb1355a58b2174d2c3270b874709d59d183aa82e3f4350d6a94f8e4e1120df07578e8c0a170646851b020e14ae4e1cdc105b722e4e8f5308cea020e58549102d521260030f778838e1852e3b43280c499df81a42e1c4d7d0d4d094df7137eee539cfddf13b5e96a78377e5e9e05d79595ed67f77bbfff7bcefc357f8067cc337e01bbec257dd5388e4799fe7215d3dc96000f505ae6d8c07f0d65e4b7fde494c7b20b9e9d6adcdd79b72c5403481504396992c28f4f1b243e3742d81c24212382ce00102496946753852c4992e03c5046388b489e186d5a485ca107284908345c70737356fed53a90b979237392c01b341ab098b1014eed8b1020303449f9ba804ee57252d5433250000400003160000181008860322814828c88355b60f14800e659240705830990723490ec3288a612008628c2144110290410619a78cc80089a08ec5ecc6b50385a3c7e16e4b3ac6204e4a70c7a11677d0573c1d8a1fb9c3c5db8b438f1dd72db27e029b555bd268142bce3a86328ce7afa00c4652cc0cd28c2b23847e7cd3ce6a9538071026677883348d752e7c759c9445719078e2d32f2fb21e8633114698b1ed628857f92246930e081a23a2f8a4a806b40ed590427e4135070ebf65a16d95b4e88e215aee3e2b8485601f12ab2070a94333e04aa3fb50278af5d30fca14332ded896a20ea2c817f6b59a3e1962b263ece7380f7b61b221d3ac33b6f2f37e354a9ed3775b71939f1a6900c7ffcf1f901737a33eb50131a1d56e7c57c6d78e9ab385ab7f041afb48aeb60b5dbaaa179017da34a96e0951b09a5734a35bcf429f7ab5afeb5aa9e4ca828785987c2c41a2245e82d466af3eb00fb8b7d1ae490f46b54acda3e37a48e40ca4e17dc79803e58ec9ce5ef20e16ed5fabd530e8f306346c3a702f929faa0dd2b81c84771cb65b14ad1fb8a7ede6ebcae008a10c6ff2993adf0fb0d7853c33a26078232ca04d408fae31d738f0caa4385b99d5353021b6101c1f90d4713da3c1590c3606d208d077ec80adb16cf17f39f02d8cc73c6ea6cc774167d4000585d0fd709f74a830b0f9ef65609016e02447369671c29f3e447de225d75e96bac7dffc8899aec6f4231e7fe6d66297715a7a38a16f9d9fa4bd8d667a7b7f08174806fdf626cb5fceacee6fe4a44703681dd1d4e651c2f3ee065bbe63f34857f7356f54dcb3ad0a7382e957d3ee43cc6b271acf67d353df1a95e96b595c5e84062c9ee37a175c0a4929afdb7d7e3a1a41b672270d0fd31354238a0e40f0eb32937d6c9ab140f6b1b043724b406bcd11b821d4942699e0a4b918cad76d35dad72cb5b690ceebcc2a25843ed933092fc3e8db74f0b0c3755dd458957a50947e06cb60899d2a3ef0ff9870b02cc34d48a75df8765d82463d30648f9db7be5b54bcdfd6acd84bb457ce407b321cba67c61519de667af293181bad26d8a38f9e36eeaa4c3289f4ca65c4abd318d1993b5e4751ff04254a9b64772bee43591b9b6913009d8c7b7d25b22017fc0c3720a480897a087c0b1483690ca124cc6cfc0b93704665b05fa216ea54fd485bfdd2998e520c70f4839732d3021bef567d27bb16f1e1a2745633da6d83910cb89fc5596800f90091ea1f20117e4db6a440f2db3a1d739e2cfc3900ecffade1c3987f2536af13abedb35614b542fd03b5a3d34ff6c0070d7201280b5e9a8950bea63038754f261b96c10db7914694dfc57ce128c55b62c79b6b28ebdb8d90dc0668d7d986dca71dd84a2dac2190a298e1a59513d329fd5db60d2de4e7546becbb2cd95e523aa740c0129868fac77806c8d42fd7d5e8fc1900fd147c5c2dbdaa904a8e6b87cb0de53491870cd9b839592a045ba39db0d450d809530dc8d13f24152305c304b3c6561021b0215927081c8f3e022aed9c0cdd81e731258fab0055dccfb087eb3eb6ef68b7793f549604c2c18193d768326bf4b3076b458e440b266a64ef41598a0881d596bdd06f9299e167872ff78e0bc71b4ff268c74af96d12bc1c7d108f7a1a8fce072fc973fe73124e6d8ccde52a17b4198d4114883a402eddcc61c8dfea379932a38a454305ede6b11f51b2da45b43d859a6fa92394aa0c43c4f6cdec0c435c8d47258da03ffae05f42174269856b0cafcec121aa39dcad8253f7b26452c506fd3486e407c3020950da996936642458810f8596f6ff1c6b33abfe32ad210d50e01b0a1e2ad968f582e968c633183a432d00d2654d7ce4c62f3ab1f9cefe4274888f9dfca91e99016ebed06875ddec596a9100c87520edebe3cb89bfc3a5e43c3b396f12ae7b02398a7c540baf676cd24f07c2c4721fb40e8aafe9c3f467d71c3ed8b846b89d1460077beee7f92f5b0c5bca01483900fd02610af140771e4cb56e1d10a522aae162860018eb6a83329d42a2f3908a4d34a10a94a2b2717c99b352bd7ae879decb7f204199651e82d99e7c51451c26334c0bb1208e5b7626406f891c05b553ccfa9ba4b016b17a360fac22a4650bf36e8e3de532292f840e74495d6ff2881859d0645907c6a1c592710d631b733ac234c64e40fe7e78057407afc69cb2f2040f99cdc466e341af00bba42a30bf7510035a02292c66534e0f1f55064ee93f95efe6d5050264365cc033097bd1c61e1e5615c4786307d7ed1c2dc507520c80844b74c2e19696db3edd5415300f98c5e163bc30584b144e80fff39cbbb35d45d51cd97dbab17e65ac88c60cc5150100b7a6be68d26c9b018789e13157292aecdc6933e8c61aecc0cdccb02815e73a098a3929b570c97071380124e008f0931100a85914423aa0b5b40960823b06f5b922aa309ca69a8687f550b1119d9d10f31fa73938a80d3d54a3f47961242c7be3ea392da81efda3ac46d8f859c164db19f8a26077e2102b2794317a3c9d5737fd5506633352f6e801247c36fca19fd1296453a81b9c71b661e7850dcc74f2e337be8a169c7fda4b13f2dd9db5c94d3c778b8df4996617eb1908e2c1e028e44a3514b834c83ebca41aeda3b817f62dd6633b1d85954870eb31fbe33aa1aa18a57b42597282a348bb5cce3409d4aa974e827e07dca299408d2962e7da59e870d9e8030a6ac28ca0750a303408d75265f43d220d96031bdd127c324546e4183a0ac3d494b0bc014ac149fca2a2e72c305534c0d8a36e42763d905367087384b7a6b68839944a0a5f3cebe2df83aa1fed908e1924e9cde9f77868122902b2802041d94fdaa2040cdfbe2297dbbe868d21169b4c357ed67d3a5c5d2724d7a75d3a0a917cef126a6a9c93f25633b5d9795736bd0a746820a2f0e976cc9a63ab12a594ceb0a5d23fff954847aabd02fcc066956c888be2b8a1ab5e86edd97fa5b8aea1b956c744eb57340b412c84742456cc8656abdebd5abc13f873b800f1f4f162e8bfaa840385d2f8e2f5bbb8d7d03310501a03e254ca5e3316c400eae29aa8ada6b6b1fd159753ee2fb16e905e6d1d33cdb18d36f7ed0158733a40d5649c2015f48abab8dfe380d9ce769e87a6a2009b97c343bb70da5e79f2c99b9a074351217d20b8473282cc84973563dab26f77ea5483e3d994caebb1f40e639dc16ad8f989be0475c7ae8b3987ac71895bebb7343a8ed83e4fd8aab779368fb5315256cf2fbc5b75e22c8ffeff59088aaa7db2ba250e985005034ca137c589e3f201b0c88d00ba9565e721322916bd0c454eba014c92f77e31decc0abb7177cc9f88d08b72d3f00373daa77341f5d35e7b2cd3efa44aad9f644df66d33f7eb7886d16e3b4193a3e8e7a405714fc8c04c34fc06440ae30b8aedeac72b2a257ec12cb0bbefb3eac04267e5a0b68cbdea7a79dfbe511adc12fdcffe0cf7b3817b25b9099fff48cae5beb1d504bda7ff12ed8824609957a25bef3d77b2a0ae642baac5bd8e4ba921420a24503d8967b223101f479449ba42d0ca345bc954d61ac3727d2a7688d0fcf736c41809ac6307370546212ca274f1ced59cd3ed4a1dda9a047d129084b453b1f7cece4e551878f507e61091cdfc9363b7443362de12927036dddefef31fbba5546d90d38ea361a32e812b9f07f5ced69787bf51848833301044f96e29adcb21556e1d02b57997bf99cb4e2e81a89cfb9f2d40b4e429f68d85ee45307c12128cb7a45cf0dba46b024128b010976b2fbdf90c378e1d075ee17af4a253011837dd73cfbc62377f2ee58cd143e256158050c62358a5c0e24a53f83527366d152888bbd2ad25e9efb8fe1c47ba01c5f38bc56739f3fc8e7e23ee3f06a2c2089f29526df8e000f0cd6778963de711efe3652dfd5da5c90f60953270ec6134374a348ac672036517d632f991500ecc61cbb65c5f6db9eec1ba32876a45da5bc408eb9b15738693fb5ef0b42e846241148e26d72314a32b237191d6f6bf721da1f976bc62e8dfe92b004d1cac8d93e426143cfbca78440be1fcbd9780f9c3b160addb1b9ebdf254def8e263b0c68b20c90750e4d2ed80a482e88c714566ce7de511e8653cd740827fef7d7939b6ca45e072609f31e4ea09a873a0de4162a4825046a239806586cc467127cd737208b4db04aa6a27863f9715b4c4f81c516998dbff19c39b50e366c5f3b8a21a6cf2c26554641262dd18b3773e1ea45ce0310deacdaf832a1f106b2ccb51cc99a3bfad6ec519171a3d09cc630ae1e9b5e300d1ef6e29f0480dd4dbc0e931907f2afc97711ca10c92ddc1b743d85fd1aa656c1318074351926133e5e07c557c0ef705603754920a88f5923ec1da80fab069fd7d374178672c1e4bd095c95eb6fa50fe388edf2bb4f7c3f32a47454af2d569e78db0680a08c5432d49548835ba071e08d4176c43bed85cdafee5e5f72c92bda638e6a9ecd7d48b3c707ee8882bcda7d49ee988dc87ac3f519ff5cbd292d9d1505579b7ea139b1065a6f38f00f57ebef5c36bb22afcdcaf91c43942f35bc781ba50736b327110e3b15d5a4f76e48d55d27db93704280c9254a8c55dc0e63328febee9d7bc6f724dc2002fcdd10fb6cc24126fcab96f8c8762289616e0a9abb3585b257b8b3c9ba485414c6efb86b1920d4f2f66bb841ee069ea813150bf9b460c4e864fae0c772421c2ec807b38b050c2a1972b93c5b6f5eaec7faf37daa371d4f6402689a36759569bb1b88e55580d99350addaa702ed763a0bf5d9b684cd8cf697176b4cda8ddfb395d862a70a75efdef19aa87859448d22642e2f8ea42881bfd1d7b0ec9457972208d4da25b0450c7afc4111593541a6296fc2929ebfeaf52a81c61bcf0bfbfd4a0d8bbd399d86abe19f33aa5ed089a9d733476d7c16c9f4656a89edb63487bb56bbdeb5ca67ae2b9aa1a852444704f2a2f6abe92e6aa8a87fc434b4ded6ad467805a397910a3ba78102cb6969552fc670fe15b28b8b8f11dcebc8250dcef90c532b22ad9811e83d80d1c1ca62ac7ffdfd1f3d8a97f9816b3977e054081103d2eec4e98d55a6f03f9ea6b23a51eca0fb3213ba9fd3cf91a19b5889c45049ded2f2a4d166441bc4abe8c7ffd39e3d125aa4846e88db2509c3f36e17377336cfe12d3db0644478f3781d8524018920aee3bd47ddea14092bf962bb2175e24a0522b248648d4146bb82da8990d8c85136d533f116811a6797fcc459080370b3c61d58d9d42cad5bf9011df0a09f7f5041562c4c1c1e24f2e47d23ddd65b54a14cda9effdf7f382ae6b75ff88cb1e6d4e6a0a47d7c3755677a139277a0c17cd03aefce315248b03cefacb0b5274488d69f85b591779ef2d11124716bd141a2f4e4159ababd6f46e500ce4c055d492110b274fa1f37196bfed29b8e32829a05222df63d3133258f357843802ae8c103325b01525285f0b5f452a6580d710837ec9810c3abe26ab37eb02fedfbd9f13be96c23f0a12329e3086fb0b4992bd6dc5992a6b9b94f5666c3885efef916eff9e344e8e272ff8da96c3aac51babb10845c3a0eaf8083a352af1a1eaf61a8ba62512bdccd5b3c9ea7bf232b1524030466c39a792835b4233b9697dcd3760e84dec8fd008a9c87936e6d0ab2719aa96afea555cda4e2c7a2229e935dec3c0af2219951b8d5d19408232296925c7340482c9018a74cd576bcd69e962e6ae764bff3158ddd0ae65ea35410f8c5210973d15925d78a757bc599ceaf2755feaf1d0297ca154cebb8a8083dc68f6585ea8bf273e9ec654f6a1b6f7706e9ed495873743c6982b80192e4929307d27f6ca358c33ca1339fee1f25f4eaff5bbe0f9c3caa9f7d63d0be8bf466d0f9e7fe57cc5f04335321a1b0fbc3e5736225b489642e59a9fbfffc2182a07119f4ff0d3aa563a12840e03055fe64e28a39a013368f69dcef30f1480178db2065af7534e25d8e12c8ed138850acbb3d0007811d2b8ff66424079ba3e51a5b04c763b7747dce1a8b7deeb936e10d07c84054861ed3a7bdcea0e17a85dd14fdbbe8a34fe0853e895d6e682191ac3cda49798ca184c2e664561f13123faababb60e424a39b3726b82fa094741bbaf452909fd8add1c7212c6360e660b5eb91a6ef31abfb477909ac68dff3e9889533f4c9c2d5ca066625b0d9e094a4eb1c88bde393ab0cff0d4fd13451ceff07c4068a0b514b95013747aafee8593e20308688f52c71d93aabdd9324096dbea50ab28da40e38628f7194a615dcf415feaa5efde18ade536aed37241f55800aa5f2d748d36721c5de6b6f5888f67b7da7d99b7bda2b1fe124ad6366916c8c618d86cd8f679354b0c57b863f3ed25a08c1714bbf4fae4e251106a6943e878994a8812abb1a4d7fea6cb49fb73a62ad74d186520266f21670159e639f37e60cf665c99c9341612b85a3a171dd976abcf843e06063a665d44527320f0e794ea9ae38f1ba04328b30295168e3911a95efb4cd2c8cd89bcc0e5c1184dea20d7591bf94fd1338da68a95ef06c29b1d7b274254432567c017bb128dc90d65cc909f69488b1abc3026e826dd186c57cf550b83d8e68c356c351b8763498a0da2cbf570fd57839adeb45029da80838031c6a3b8c6dfac3f4928e7aeaed54ed51ec657ffd4d26c65722316699168e1be546a7f84e03ed1724abd494b957ef5ca853c9516e7416fe59a85642c207bcbfb7ab5631b161ac822084a122edbd05ab5c5879a2a7e522d971fbd09b22c927e45ab27c84f859fe5630245abd22c2c564181065246735e70ec85357e5242d74ff517091aca58cc7acabfdbe98055ad480a9e9d69df6c7213031a47550fd4ee829f0874e807dabdcc4fef881549b4f71764e144a672e0080ef2fd3e21ae7a6d54280888ef895cea07b48ecf87af5af0695e25f087b50720edce651d45f58aaa49ffada596298c4d54efab40e2e7719ee4a0ba18f5e2790e5e0fc2f56f1d4f3cfeba5a4680829f727b9e7b8ce40c6d59ed2899d25fd6e323a21f90f80ece45b1d5c61a513fc3f747e9d033762a1f76542810c88ff4f064156f72eb4fa8146b1d71f45712d8860dfb8c3afce5257d5e6141dc65fa0c0c89a0326b79d1c62802ea2ce02fd005103f8648602104a0511a32c4ba3083f37a3b72839f4eac73646c3d1a58e02f4075243fa4a2c214898cde977aea283f033344a1f2fcab724db18008926eb58007520b5485fc552089224ab5453b4fc8d22bcdc19b96de28057af0d4c7f4386b4db18a8f84457fbae255f61a93e11eddee4ace560e3d67493d3649bc3be884ec38155b52e2808d3e300a9184230fb5006a25204dac662ab5d06ccf9014453fe6739088f331ed94374eb598afa5ffddb898d0aec1080ed85a389296a20b5691d6a8d9e225a354d8d062b9a7b982d148c6b588d1340cb4851a505c9019acdd14aca3c4c48ec030de5a39ac8afd652f031f85b5332b9344b565a3be765dc29e45f47d68a86ab6f1411925b420c818fc21cee1dbd9a7558b98459b6b91da68fb922b10b82940fcb47e16bdfd708c7f10290b6222789b00fe0e70610dd83b9fd76721389833bf02b187cc0b0f661f2a205ac6e6cc4c882db0d208fcaf415e4c6c5e1b96b7d19a5349e7aa9e96908b54a147c8b26d2e6004eb7873b67ebead61b9380b59056862a96408dfa9e0173e76aa0a0fe15f81f9f2e7aa63b9abcfa3d754b69f4babfd909180b58be58728cdd686bb5da5052f96821975a647ce9b1dab42ae879754f82bef03e136d3e83929001aa11a0bbab02527a004e14511d0557681e36861593e3ff18fbc0287c2cafe292e4b6579e5fcbf70d73af5cd1b1717c86015958af8a734586910016a373dbe68020573a129fdbc6a5400a4d7450900658889221fb121f86b32abac4030b1e6b6e5c53e0fe0b087cd7220b67954d06cd221c615789e564a0e0b9c1661308d2cec40e2d53d4d315909f32b54ad71e645e28f837f491307cf0eac8362a2afe0025b0cd9e40af46e73c0acbe9bc2a26a2be29f6acc74114d61fd8f82b3a114ee4ee202a050f65ff0f318d0e4b4910d5e9a9c7300af44386d2ffc3c06d80285ab9e16337e289d08660fd7df3092d25430c8a6c7107910b2104c7cf3df91a58b8224a64e5e29088a126fe48be2d5b3527231ad4efd165106322840fbbf4bfe783c4cc386464d5d950b50d470001226ecc721e0ac33c6dc90d0c7ce761f86ba34e049758821605463d25a4cce7f79569cd79e12c4b0b3248183eff4e282089048dbbcb08cbf3c6eb101cecd55930d3d947d37f21a301f26272da0bce2c5f5e20898e1007a518c37eb309a52f871ef4a5c4630778dfbe65f1ef402b44e5938d9cdb37c13c1f10ddf4ca823826d3360e649589267364d7b369ac6c654d613e1a89b40e1dbb305145a3d6a5aafd05d23f5a0f7319dcc8d22bd7d66b567f2b2203b8329135b514f8d2f723af78d51ed7358facde509deb9541c642e4c57455d2b547e478467e18496935b09e2a3312bed31a01a526d8c51d82d55728dc7ff5c676cbe4f23d1b18a0eb9861a2668169590f4472c5ac786719ced85eb5629067ba51452a520c982aea512ee1c09f54dbdd7f1bc721cc0c44dca1bcda9a8244f5d6e1cd5110cda2f294a5dc598b64df486409192db1dd7ca97674a210a83cd1360e59c1bb4784fcf7f7fddd6fff5bd286d5c3ea45a386ff3e49ec4928b440cae438ad546b149b5310efb1b7068b5b379aea70263528aec0b415ff761ec1d5f15eaadcf800b516ec42fb82ba2a1325f58080ebc42796f630e24a91bb080b98bea04c49a6829d26b47016775f2686f7880f5809e3bbb9a19249bf9012a792f22e347bee71cef73720cd040b0f16a6943eb22bb3f6b0cb2c9e3000e717839bfce074eae591e61f6cc749efae39128240c4c5baefce3464a4c5b262677b16d970dcc4b21fa5705a395d7c5f53a442654a8a1945b9e8833af4b4c6365ed66872e93de86c6ae38cc9c82e1c70769c404a17e3a06b838b92355a64927f54ded317b805e81fe19f9a165022c680406e1425764ff8577f1278cdbc551876b7b041b1a8411f5e0d70411bb5dd252d5b4778abf35bbc0b23c760885ead80c9a3dea40a103d7b04dafd900e17008d5e00cdc075772a685cf993ad9fd0f1d0ea56fd2679c5c9b5f2c405c00761aaa99a4b7960327062dae111ecdd42b8aeaf1e575f8c138ec85b0b82a1a7ff43ce0b3026a4962112d9a3ed66802aa2aa3a2af9d6380e8188fd2a7088914896fed7b7c1af9f34bb266c8c514b18a3ad4c64cd432fd8367f250b60bd22f3a2facef34157cb364c2235e9683db32bec5ed00985922189e13268936e01caac6bee3d92440b7f1cfdb1fdef838556c547ae0d391ff01d4331d23fc43dddd58bb04043a217c1d283b980454a34061ea395b6ccae6719fb39d0593dd991a0551731b47ac9873512432daba21f2099f6905f60c88f4dcee2a8d6173ca6fd5f790b6e0552fbf6991d8520420a5a512a80e66837e24836511660244bb0e0941f1f8f94dd523859826fe04a25d9219c68fabbf72157c81f72fa16b0cdf07edb6560f53ea51fc0ba7d5fd1acfb0751a5700e7e825b68f43e2b1b8fa855b1739e28b9f318385a5a66d3e102aa5bb149210a327348ee479975f6e7d6cfe905b20ab7f2c4a0fd1ac9f424a42d24f64aa342d59a38b9b955a014de36af376e01bb1be4595a431615cc7fab4840f3215355a04bcbe8ec1e7ebd7d0f9cdd626fca489337bb215e216e717f3aab178d100f02845619db3eb8a602082d3bde1136d0e1240a0c3a1a627c3906da8aceeb45ae0570e182b924d6c7e97ed579ba4054c1d6fc1f524cd916df1695ec4a16dc3d4e6b8bb5355d93635f86398f004a435634004210ad52ebabef5289d9a4ef936cb728a45d742926f91b757fe3f89c3ce77f7038c6608af5aec80e136afe93c62c24453a383670d9fd5f81edf55987d09bc64a8af5fb35d922b84596e9c6b10b9b2ee52bb5dd7457a7f0c4961d3cebc040c65dc214b965b7463c436a55fd82850010713f3aeb61af79e1f5f2f150710995b611f3ac4f3079c4044a986b4cff2e8efa36401d9dd7eb44d8830dc2cff4815b136e01d2f53468b8f182c589fef4f3a7d0f6b15f239e089301149c61f80535e08ab2a3c4ffef98e9e3e2ef789381dd8a4eb5067fb00c5008d2181472f3611e98c3bc0312e9fbbf4acd9c48b3d454dffe0699424aeaa6862a580d186a891e4c507f8e3af002c5ccaa3f4bd6d61353cf774ff9927001a4259c988f514af7d2deb2e304864239f145621f06127b1e62ccd1bf228428729708ba030aac0171c4a4d705896f182f1a717a88410274e78b5999741676b774f1459a9ac5bc08d286d680d5ab161889183289c5af62a524f4a546975609e4ea191fbab8c9a1b3914a9d1f85087b13eab3b339010909bc5878cf88731e490eec7e10b77e3ae230a92028474460b7d047c1d2f39376cb6e7bd44e7a279052d88b0d9aae89dbbb2e180fc9f57f1883107c37e67b084053bc7921d6ee1064dbd4df1cc163e1b22159c84199077e3ead75aeaddccf5d43292b664a3036ff86ebd1586e4575418a708f6b353ce6a661cd479add97668f0c69bae1ff104750e27eded80e9ff1681476701425fe5adfd06e335efdfb08ba4b5de6a2f800afa11c7653720e3b43e07bda4416542f0448149d4c68cbd2de185549aab74861b9e2d11587bd2cc1de1d18471f0ab414936ac06747ed2849671b1a313010d4b0ebb77f3ca47f8ce5a2418143309dc7d51a2eb5148e30a3afd566d49ee5187c06b9f536ec3d5e4ac843bc35dcbee12e4ad085edf0da32bd934a4ac64afe57d46505b3931829ae0763e31d96b3ce8e7e4e2b0481bc7933fef0e763c8e51f7d544ae74ac7f986aa6a2c67caa9a9930f4ff51cd48d4afe9690aed280b8ec978a6ced821c26e61bcba1165b90446ab0a0fab1d8447770e517ef79764c71257464a25d5090a5e71e989e5302db4083399ce769fac79de9ebd347ee17e9f9597a6b323eb416b9b3b0d5969ef79d3cecbcd09767a0fd403200dd3b28a812f44a46bc9ed7590fd21db75f45e9a0eeab6d097a8400226e388069a05792399b3b44baa446899a2b511545f7c46474b7d1f906e9160ef42930a1c0e00fcd7b207b637448f05c31cecd30ef2de918d960edbf673f911520054586426ac372b08675a2f82aa0cbaad5e2e5002ae8908968448cb5cc0d650294b3ec10fc4172e3dd734f17f6a9564f6472f6a370fbc33b8cf540c725b6cf605cf93c1076011f760b97233536a52d1684b724e31683b8d40d71685740d7035a0cb74b514728f1d456109a203d014deabf099a641bda0b9d2aba895f9bd49b71805b15981cbf4b0810833094f00eb77a28d68485a53030e068ad23e88217fd5998861900fa449c392c9d8efcc9d1c17a606e6e16d35c39e849cd33612b7ec428f0d9748244a12a119f8bd9e487e7fce258648f7e30686f41618f4d1ae385675fefcbd49ab60a47900384c6b4edce6883fcae47f45429694bc30ddb48177e1e2117119f3126c38b7ea7e2f129d1b78080eef7ac120d6ac7a01c372fb280949e8ee8095ef92c67f7acc40a27594ee1340e333e3488bed63ffdeef568c81da8232f89a758b89819cf5a2042114baae794485f8fff7b8c42443f32cced72abbe1eada66e10b8a87a9045cd247bb3af69ec9a77667d6001faf35d27713c0bb5fa75081214c94000cf8ba14a3f29cadaf6aa88d27e10f125162e5a252958ad4e96953158a794314dec7920e84227b06d8c2440d8a5bf354a176867b6771ea06a84d8b34ede22dd32331d112e81d6314b803212e3fbb7a0628b7e686aea5eb72d1c0dada41c29b9fdf9a310e1a7031d98b27c78b5b2c5f920689dcecab0cd8f097b98743a352307f579a8fca096ae11fd4daffccf592fc1fdb6ea3589adcf30a0c3e2147ac7383909a86bce55903ae0932cdd35963203db82d3c34e09fe912a884ee14e640a8c02377e73a356b1197fcbaddf9ce4fbb4993d07d4e84566166fa77cb70609f34948c8cae671829d9fd4de36e1e13ebe696121938ccb438707305de794e395b552d2d86b2d4de84e0e3549a1571224b41df40b8371775b5211e632adb06719f9df86684988dc88a6ba2f33ff78f8b46ad04b094ede7b5529b19bba7bb7ee3141d468c81354299fa9155715442a67e8181013487d31c94bb9a4c5fd3e5aeefa56ca40bf60ed38bb53f8ab469607b7d6883e449495d3934798024adcd4916b4011adf0b5c6147e566cf12dc602045bfb60aab9e220fcbe0ba8397185a4ec2e09ac0fc4f788e80deab0508fe955044578598e7dca5e783bef9c9c6232ddbf858523fe1cbae943301cd6b0b401130f8d0ad1021097cd95897dce1a3b20b1020f83f63f73594fc199704ce165143e450b8384822b012b9bb05338513b29e7bf882fa7f20997a006029bfdd13ff66c86338307f0425c8a5fecac7df9a688b9ce3c921b0145d61170b9a424e5f174544b9660e54bf5e5c684d5a4dde5eb9b0f9dbd9e33da5b208608003e0e65fcad1e9049956f22c1640f2964494896c826a1d94c127ad6643b92ad1ac0c9f20b1fd169ec8a4194fc1aa20813485d1d91ca92a322fe2d061f63befce25f0ed5b862d3f80064a7efada36b63ac46d729ebbfe8fde9d04264d1058d02146d405d21d6aa4c523e3b7cbada832c574bc6d3d91a4fddb0934b0fe7a29ab49a5e1d8959245b35faa9d1f6cc59a63478239b4f009d75ed1a11ebfbf43714298694a0f593005dfbf6049923df5f40511110658b0abc4c10d98b3179d6eaa289c0eac23a568012e1a59d805fdc3fda6dac2f599065b708060faa0ca71027de4c017da1faac38d490a1920536d26109674248ed4149c2a4b508275f2177a81f7744bcc6c0419402b7986a0b7c62340ee682130c6be38e38ba8b55802263138d8947dd897d88fb91119efc36af2410161b71622c0837636f76852d92998cd33383142444c906367b9a94dc2459c38d93478c7ce4258b03eb80c38036cfba0bd122ad892307d19574c3867a06877738a1726e6349d718b48834f7a25c09206cd10c8be0a32d4ad14526c2968523f75146309707eb7ef84046338128ac830984a97e1f186837cd09e0d30270a3c42fa8c1fb8e2beba3794d67cf561967fbc5755b04f6e9b8361fcf3e308bb496c9be2407017ded84b05354109698bee61e57b394fe8d99263c64f8e1c8746d102562499f02c04e6651e47c89ae5059ce72611cc09284963c1a1e047ed7e74f746d2cb86228b294c935359ec94188a6fda346cac9d8d8c65169517862187255e0c1b2fa0c9e9d7511a6eb5d1b97cd253e8c37372e38a8a8a346988bf1362fa22dedc0c364ce33d9b587e7e1ad0d86bfc110c3ab7fea7812c6fe98f84fe751a1e19a20281937d240060753c6f08b71bd76dbfc6d4b4071600a8e6aa237b8094d8af12c28cd67b29fa789d7954908e53564249ae1c1b9f37dfb6840de99fd968e2aa84bdf3a3081f4963cae8f08b6b81ec7a675f301e51f025fd892c872ac46905710a4dd2c49eca34ff0be4030ac0653d51a3fa1c57691b0d19813a1bb64595c936345dc63688a805d26137099f0d17d22f16f59777d1ecb7f942eb380e18f765060157488a5050badfdeaa64d6e43b9e2d5626406308275250852d856c79dff1e132c4607788cdf29864a2fee188ea9de443a2acecca8b0fc4c083087238ab9ddd00787da6922015d41cc5d2a412a709532bdde5ccdde01cc00f4aeff6edfd6ee606c82afaf47a08082c8f84085c93085f6926ca14adcc042dd00b010c951328c905e77cce18f1cad7128b8ecde2c76c13511ab7ec5d7c3f6204e9d37c4c2115c81868be48a0105276ec3140826e0ba0874570dc805d683e3ad35f65d0bb324d98d85515ce5098495ddbadfb657f4b154da43875ac134ef373b49e48c1a203a12f71b454295213f79107fe7e38a985da07f41d330600343b31b389e6647d239af73741a6148936259a1186f8c294d1b9f78c4dc54ed95d21baf758f79550c364365be90e02cc6d1762880faf21ea3f510030368da5e9068aae4ed096d5e1ca73ef32ffa5e8201589ec57ec97a9d88e6d3350c2a4466d9ad56368c2ee56611b27e0754ea7a4293618d773452e14465394c7a076e10f9deae31c49234e075e057ac8afd525328b3d0cb1283d2f046e81f0b6e833f6239731fb89850b804b3ed2d749a3b68603d3640ba8761510d96af9e6cc3b3c8e94f678f3973dff4addbdec2ae20937bbac861f67a29958662f21ecc67da4a628ad831f69a68b77f8cc1a387acb74c0fab64c724663526d9d1bda59bfb9a723ddca90281d3913c837a1c3913da2f3033bfd4b7c8491d77a29816885b8c050afde248da8146036bd8d2b6898a1a578e69b74b7d7e5c091a808fd465b5b545c98c7cc01eaff896df530f84167488bd399d902fb6d0eb359e11fef640f85c807db3c1290b7a07909d2028c156f08c671722c6e3d945a205b8520d12a9bcad1f187b99cddd5defac042745bdd30ba176ca44d71558203173a31050fc95db451f689567e43ec0483c035eef5708e3f2c1751db9fbb8eaa06c9034f284dc2a764eb83298f6985c7c24b7cde336cffc9da0bb2d732e4493a79cf1e18f57608a3b00a4f77389a30f6e629eff9f34e2bd6cd31c0a5a4d7d4a8eab703378e4d7e0ed53bf8d372d4f1c9bd41ec5ae45323d38c220138ff8ede3cd83fd42dbe22667a2f84e0d97f26d5602aa01ac8c72e1c07992e26c9feb308b26f4f6d4808a2a0ebc88a66eebb893ab48bc9a022e3c88a67e6bb8939b48fc9a1a0ebc88a45e6bb8929348bc9a120e7c2277a151b2c95e6892416db3f8ebd3522c9aa53cf92b92818e54026f1056acb30f83dfd38f33a97481a031727c3fe9197dfc2696147ead2b5b9a0665e61e35dbded24d84c961e90b1986d46b3c48551063ae7c94da64a9001edf0554525ef33addbe2acbb1ef5c9b3c1e883e8533e8cb6a7a14a4538ba06deaecf42820748e903a9a3bea27c15bc47735adc7a4d70a085d4b938c7162700268a69ac6ba30eac2c466b3b596f05d8d5587d3625a9a58ffe81f4673f8a2175c66e3138ad9ee01a4f81faf4a75eadf6d965bc13980bc3862af1798b7d48b3056fcdfa39b3d692a4ed9754d129ef40aa7549ae7d0f6463f85dd300e35d9b22cbdb4ba83d742e87901033e041d81f9f3f236d5b0d76812f10a20461f5bed8b50f681b169a6307bc9b9e23d814559eebf3575bc5da933794d16b52f456ea78a5661c1e50390c53c7537a0f4c60b9368e4359397331cf3eae4d338536391791a59eb54bc85154d53704c15042a2f6b5f8187f42be7758b3276a9049a799f29707612829b9a8aa57a0f1e9f133028d003f0086577f2e2919b32504b1ecdc33fe655afec54c51b2a924120e749523ee66de75d296a4215cefe6d44b15bfba0494e052b7529bbef9817b3e90a210eba8fb8c58c44371833af97d72b6af3ce99d7c06b749d680101a547be0501b26f097d64ddc28a8f1a2205547c82ed3a901eb3159003d198b59e27675de0925e0907043941494a6845792f00f4236d459536cd332d97aa800a6caf6636a66f604700527b33c4b22803b556515e407064ae7e850aa170ec50db3d49a2c1c3f057b260ca5531e986c9a6f1d0c314e772a9e0556a54fdab21cac9051518f530ec657f20c682df8694fc32817e3f710d5e7a5e099401943ceb5af3c5b130a557c3600c2ec8fb02b9183c4b48574605158bd58e1b48fdd712ed9c9c88547f04a737024197db6ec5ce0e1dc2f9b7dcc84e16770444ff6277cb406878d8fff2d6c284addf1b3951f08a098612a3cc04539f3fa510fa8fea9805704cf2af6ccd76c4392776274bf851e23eac0de82a61eea940726185572b6dd53c54574474812b3ec91324cfc3f6780927b1b7cb03cc093f71c31b68b2d6e4069561aa2979db9d8ba3d6138edcb59303fcdf6eb9fa3ecc931890e45b25a5c8c5742eda855a5633d62d1b9b618b4ad7585d87757d11dcc46498e6ab32dcee448fc571998ea9bf8101448d61ed48a17ecae41ef5828967ade4b90164e8b7bdb8ac3e12bc6fc28cae766e1fd182c12c873bda3253d84e06a1e0d1bcbca3cef8c4046226b3bb1546c7025e9835ea22bff336caec1e97665dd28fd9ddd0057c51f7959c00ed9504e8892f9e11999f9350599f00fdf0f23323b1d90296a9c9900f55fe07142f2bc7952a15fe61a5370d5c8cf4be7e37f65ea0bb2ff9cd7ad82a716a985e0f6d6a351e5e52ff55232f5b81358ad0d199ea79a42941dc1677922ad3e30702fa5760e8c55ee8d071d045ef39614c1de5d5404071d73bc2dbd84730b50384ccee5e0cc7f4a720a47a8842879636dab47e7a64e04fba21653004abfb194e94a2e75c7a8b54135be2fd6e0a543769950dc92a98a3288905cb785777da3369e64d219595226408b8a590b84c1925c65d52c8403b053663473802a8b8f80e09887fe30e1bf497a113ee60d726f53fd503af911a4e8014da9751066f907fd82be5a47ed97c76b912c758324499200f83c9a406d807c960b2a62d388bb6b90f936cf08fa5d5940150cab5db561a6109e5ac40c9dac307b75dc94da10078443a63eb896d31a5cddf40fc17438bd6499e712d0ee8b261236762b41b07cfc9e5a963e62b4200933687b017bf37ff50fbc20d25bb9a8ca85fd1cf0dcdc4a55d2bf602cf4fc86c68f44e6c263b5c63af3e2e7af2a618c1994113e50f4bffde21e03762d2cf8d0ffca20ec8eb3e81babc3d085b30f7a33709a34bb4f2f209e07b11b0d274ee29a52d4ab2d1f694ead3d90a4551a145909d3df4c9e87aa764d073895b47177b336c46e1f4bb05a08d674059e5646489a3035726c3b5fdeb7e643d15220bc0c039aac733ab811c1819572746f937e59bc028b029cc04b459644b9271531a8c56cb95c7bbec71c2f090dff5dbaec2f57b617ba555deb634e9c7c0919a18c33c3c0ce6cd117f568ea39d3a4ef9a85e3964e2df24eafd93f675c30b932ee45438abe0208d26f878f26a12309b5296b2b3db591fa0dcef041c90c38ffff9230c204752248dc4f3038869963b67013698b62db401ecac705e741b686234d36f619ea2be6c950f9b3aeedd3e4120842f620141f89a87e19e1d38c4c96899b4528a76883e2fd08298e6ae5dbc2a0da009c3089b491d617dd7c52ec429930943e5620159a97d23ef04dfd09a5ad7292cdc674c7e8e36c362fdbd2e5029796741fad46de3f8a9c823095317ca2b92af9558522e63dfbd9556e0dd52bec9c890288e53a9fbb118ddffd4c5825d34f60055411f5adc307f8ec192bbb2a579d6ff9069656906d22240b9b9b63fabad970d7fa9ce6620c87dd0b1084aeadb3567182fb9b9e20211ac54d4954f6bc42d369764768c3d783f124e4b2ecb5f85742d6164e2e9683b97bb642a99246b5de7bafe94032f67521b44610bc7cdf74571332002ab11a1df1f68b8921dc466420c142e85218c84aac191d98eb63a4539569c4b7d2f33c9647d8cf5c0057837a2a174588e52df33c0c24bc3356bea0303ce02e10e0021d4d369dd98ab725da5d08859dd40afd3ada1007db3b00d18cba2bac0f6bff1711d18e442eec49a4b56dc70392e34d5844871a1df80ba7ebe092e631139d3aad90935397ebded6fbf05b412dcadda937e74255e01928f3300831c0076f2804eca2b76673b150cf44c971a3886e3782189ab6731c83d3fd8222a3e70edf48dc2fd1a6e4d2b79fa2d776dba8d3364ae86cb8613ab6ba0778e310c72083362d4da0b721a5ae3a5a9cc6975e5f48d1af75425a5ea99c9073d8dd9e330952e15607aa75878538484e9e6f3d42c9b3e6aa0b1418cc7f936cdd7fc9c0404075a6de0474c929608aac2a8e891e9894bf29671c787641c63522a2433dc5a193e3948264eeff2bf0094f737c2b348da08660495e4e25054de70bdd00365f6281794559a1362d6c7ec1442900583e82a222b24bd36ac17462f277a0c489a160e6f714d887592ecc9d15eea744852c795ce8e6a1f65267461fdbac8d53ac8703a2a96afce07eb42992747fcb1184e0f2f03dc7260829af1040c044f8957a3c02559190b8dbc5af6f9839b0dac4ce63f0e0dddee3ebde0b2ab06349d3c2518505eb206e82eb575da5afcd3f77e370c944a804d5fd8de20bb017f4f817779534e7d6f12667de022e96fca1f939e08256cab6e4aaa81793477e30223e9f71c0d955901fc9ac71adb584c3a3f1d6e824a6f4d845c0692e9aaa8d713374d62c74fefbb7a755443a697388607475eb101148e149a704d8301b3aaf485705fef4cbb1d17fa52b19c133103e9eb8c14169c48c1f9d4221cdb6e53e4e45e5982db657587cc87935ad6df4b1cf5a69dbb8494b3ebd0fcc8842c85a84591290ec4e145d26ac551470591d520d76567ae5bb7a82995e336e2597f0ca9cbc912d0a8a348aa5e51d6eccdecab6b69daa079a0301360b94035a724c04062771a8fea96b4a27b7f19e115bf78e9043c2d2cb7ff91dae585453f5d27edcf63446c21c05f6da82f303d6c5b1919948aec9448acd405e27389f668fece64058e3bc81783605b85238163ab74389c3ce90337637e6605dedfb775d20fe8170ce50952259d184f43ad72e275297866e1a70c1c844f6a7785832ce8a481aec15668221f9836c229d8b1a66118a24ab4425b46280ee4db31dd87a3e1db4cb629e9f02b5479008918dc8e51c8771392a259a21256ad9063ccde1161c4390f453aec89bc5e3e81092e0b3c0bed64157911e518e92c0bdfd2072f41e25f42593abc22146b6fb26593603611ae581293cd9a415660ad1c3730f9aeb216b282e654a983e1832ffe12dc95d774701961cb287cd11081e4e6850142f5b2385e80978a842373d2f37164606a5fee688e77f2f4811ec456399a83db7fb39da61211b9d5881d458adc34a5b201233eec45fd154283cd997daac77e353028dd164a18e6d53fa74283aa8a5c47cbed55b1b26934404215ab9b68412a64eea66f852ce1e6765d53e64bcadeb86cf327e5425fc4de2a7bc7ac278e8f44cc8ac1a663b2e8db1c6028e6a86fc916b407a64df6ea0d647d71340a55ff6e45108a1a730e7f21db7fdb50cb66dfdb43fb1f80e97ece03ca3dcc1b7f4259e52585aa1e1ddea955b66c326bbcc74ea4f21297b510f59657c723e5d36e5012063155ae5589044ec1e40dbaa7b6c8796ddf3bcd0d4bc02c437353b477f44091335246fa3490085b41384a35584bb4f288239891fc7ff88b9374c269024d4bfe6585f230ec816ddf075871b3ca52666dd70271d9af7612ef2d14b33feade82cd67100213db3fd90adab5c5fbcc8accef30b253841080d07697af4fd11cc11b5137e4347a33c4193ec8f01e8453174188558ea0167e675b3e89586c44ef92568890cfe619bd0b4acbe25ba94c1f74a216979db87464b971ac82b86517cd725730a682e230742a3608edebe78ed40f2fcb153d6d11f1a0f5f18367c7495e23c77b2d9f0e28e07f6d85ae25a749750cda3d55188e78ec484093fc47dbb4c60ee0bfcb457730812e34cc97eecee80e13a660aea2d59ab0208bd76bcc74d9d39248a7e2f39407878694deb25130c5a04c5ecb1df50c06704dba5816f5cf683be29eb309afea75d33b6500e4f4449b25b5db10ded110b19bc4b3c08b26dcbddbcc9d92851228053e33b3e84d4a017c69a89c98647c99e4b7c6af89524f98abf9505da4afbcbcd111ffb755d0a27beac96fbcc13e96a1858dc4b25ab553c23fff255d78e17d1e91c065fd539b3e4256c0a7812f2c50a27afd3121e1ef75db04c472fd768aa26548cbc3f8e7da9ead5af75e0aa8bb7fe8262513228c4f751ce18dc2984c428b617ab78b9b0439b865f51797a945e7fee41228dfad01b36d41820bb2cae3fd811001f4adc32cddc6ea2883c552bff3e88a3110bcafc5b583a70bc48feec0c8555386789928ded2c705dc0f44a2bf0eaa015aecb087783c52c2f8f06e5825eae31f7cb83e603915d198e3a08110dca9b6835870c8d01413a43597be51c37b0c041a600cc26008d334aaba2fae16acefb99a0d6c1a4b8c742f8aaf27099a19611880ef30a487e8a6585e1ef2eb6b7bebdbfae23259271a88937216a9a9fb676281111c923d3a975f7e39a8eac8ae4f007195da429cdb464802f5934d3c417b2bcc1f2152e5c35e8292011d910a612140c097368dfe1f1fe79282eb988a291f65389a71d9e8453184234367b40a58c0db7d8110cb847d1380a32ea10f50274e6b29e11cba607652038ecbb0ca1f7d5cc0e87ebfc5a1d3835e52f581cf68b4a7075a1afcbca5bdc11f92b795ee2011f511c70345615cbe4c9d9a01bc1ee8a3c959d619f38f68f989548c2760bdd9269bdbe581eb505462329b28c4846cf8c9003f614370069a1f4ba80e260d6a9aa2e6560aa99322bf102c3fcd68b0a4d796c9e19a9e799d4bddb465d73dd826f569f00771400536c57579d2d04974c5b41c58135049748d33d3f692a603182fc3b31a22492c3249afffea38af6b05b186f443294012cbffe566eff3407c86e195791e924698d9dc8da1b6e8d81df70ed2fd3c129085745858f6b605008eea737255c6c0696909cbeb1c1faea6590ca5373538ddcd6194a48d13b49596a3705d4c25b3599a3023aba69c9b10c0ced93842be122757ce9b016cce6bcdd4a48d7e8126891032477b86fed03c219d49f0e01b63a3b33a1f14d3777aac2f6cf51e4e02aed5baff6afa1b9d442889831a3e1772074dd7b4dde87709d551631b86cb73fcbf6f747a11e7456bbff0d06d35f9720b40da3a4e8c9b2c7b54fdbd02f79438af659eb2139ad4c4c2dd929bdc391a43c32e64902c6afe1112909c6eb6a5cf2126d6d1903f4fed8c2b286f9cba390ce511b40027a701516ca6827518f94493ad2603bc19b5e4dc3489c95a033c668e29043f2d3e376a6517d89dff7c1a380a042f95c35807b5c66c048ffedc973f8581fe6ba22b6bc8cdca83d87195ec2a1ef8b3acaabaa627029a1be986935428c89b441f08fa56e9422a0aa293096e184ec709c294864c015aa98092a01920423181ec57edfa9a9d46301f2f8cf320aaac68766fc7b4ec232b27a784246d092aaff2814e981264647e6e9475cebc0407c88469ac083d840c88709e92a0fc410b20f2828f0851aed53a80ceac5ad65053a7035c8353c65dc9b829d6a7bafe548cb5814809e1b95e22266f6233807819e56b21184dbc28704baf7269d3a09d0c4893d4df8e0be73ade0633c939210d223e82556a33bbb4b22721b41689f70d772a41cab5cfa6597f1991b414452433b4427188645b057035648f78217d751a65412aff4c884762fe356ab5001ecf0040398cef8e05509c7dd11309a5a7d91c6efa165b5d7adeb9273f3095219a96af155127f474004a04f14b2c0a41360596a9870868f6dd24953704ab77e292809d68fb0de40090e2549e297ad547b84b53c3ee8891eeb551fcc52c328da0e36b2bd2d5b2c0f8a6ba9ed0acd9f56b094c460f4a89254da68ebca74377e32707d70466c9c2529bd1aa914e04a3c6b83222856a06cc17dfdd9783abbda1de096241f3ab169a5239fc8840e65d7151874a36dd0ddd8d0615994260adc58b7489489ec7fc9e01011310a405c12777900aaeb021f0a8f9f46c961f489d187c68791dd512418aa094da1732a2cd55debc378322df0c1f53a3fc3da6c48dbb020f254db993689fb39a6fab9cbe284a2051e001dd671a4c836d472bc464c7a8754d72c3518aaff87eec5e3548fb350e03ed6504283842602650307762e69f300ddaff62ff0bc16928a4ab35c423f2a956ce50beea911bc7413a0fb7b8b2859bd42a313e0714a76f8c57fbc39adf864652d826350cda02aedba41eb638937c326afd0c8f8aa977c8f44f210ed66e8460736f3c95853f17d84787aa3137fdbca122ca428ebb988f168442732676ed18528648e31db6ddc06a9a97e9c27468d326ddbdb86aec40cdce5bd5e6fd5428b2fbaa5cb3b9989c8d03a1f3cf853532cb9b78316308d759b726537d17d763b5cd65ff40a5dedbd8a53f4e9e9680b7b9c33ff7e067d80e67914370ae8f83e2c65369c8af3d83a442e9b0b22e147ba98f68261407f15267d8d8f3144804828a9d83308c03d138145d87bdf8dc84aff0e938694b09b6be647baa52dbf6009dd62c120c27fc21636ae3a98aba0fa3caedb93b66418c68f573a114282b01290729985c22c8de55c2c05f189d9061b96a5e9964d5788e8249be690dd1c320104566949413e4a9e7863c6cbc6935f26cbfcf6d1325cfed63bfa28751816a725b963e702a4203b0f96e0bfb2463a1bb5999c572046b108c44c83fb47adb096b08e1efd49fb0bd769aa4721dbffd58947ee4603f1ffc04b4a399c85111f1b395a6b618c085e01283ed19cb41e153877c82b0fca1827855e4ca187eb8dffef8b6ad017f9ff21744988c2c8d7e9371266ef4861312cea485300a0a4f3fcd34efb9a751ab1c14f0b3f486bb91d21bed4c12a45f14c71902869c990e280952f5015ee3c7aabe08e06d84706f6744ff26ce1d2c2ed8b47f2699bfbb34ac1d7c948e2e63c8ba070a5919395c0e30a70723ee670e8a5a4651ba361cde2959a559e249431fbd71e2c311cabde6954cb9f076c57a9a71401716ba7302d4a23dae069675ccc3608209a90cad9308d3e954a07d61301fdc2211976f55903ae56eb624015c75fe22d66384f77f8aa9ad0408f71398ee79584da8c17770b50d4f9d7b47be8d6d55e1ce3f61caeba146b1389b199c32a36f704bc0f5c59fbf95374a21a9a89a9aaf5fe69e750e15a3705c18a2d68fd8f468ee9d66aeb51696bc51174f96c3b8c89696aea867b001fa891267b2ed71e06b0419ce991ed7d7722673333cb973bb8b2b4c5c6c6623e55531e7050930b7d0ca68bd0a8c94f57831604ccb164155721c67517d3ef0dddcf370a4072906d1a106f51b007b3121d21f104fc4b79a7dd121d25f1de2c86e843ef4f7791d06c7cad5beca47a2947ab0c5015d2e0f4860a2bf8589f4d7f9af2ae5b17514a349fef5bc9e937735cc5d4c66fef528b35496ed5f0f62a630fff983ea180c4c2e7b459481eaebcd8ccd29ed770b5d9b1b444dca34e2214d75fd79bc28a421b881ba4d1f921b036825d8efa35b939648ee2b0559cf129f679912b5a4242db58ef784f8724a0698f67cd00831f01c3bec5d884f46c72cc75b029001ef37e872f5bee8e462a76f21dd8e130625dd5767837cb51d1193322cfc76079b296a5e2ae36c1a22d0c88d4fd84b35581c10fec836e632025dfba33727e8f462f9d755beb3d95839b23af0342655426f528ceb7b0f2b12ae4ad95603625e4f153534681f5c0c8ef62988bbaf464c3c695ebcbca527d59f102e1d06671d4b50e36070c4a279313d9147f1902af394d9fac0c1471f64118b0df36442f9d8862b78009dd6bdb865052ca761cdeee0cc63af1a6c299aefb568c5cecce8d2e4ae20e232035b52d8e82ff99ae81a8a0853f99a3d9585d8a9e3b7534ef7752725dd17285f83c6a7269472aaaf2bfcde747853650588c769ba15cfe2f48a0010d7e8755351ef2d66df1e8b424c5697ec700093ba2dbe3b6fe59670d1ce04a9508c7d312b71d58c55287dc3e2196c1057242e566866c6c8def9f7057af3ee1dfefa7e84a7061c21bcbed84fe5db9b17810cada1f20ec828b16013b97d9c677a90ff8bc356682f295eed6ada8c9270305a76f649e3d53a9a36bf249c2f5276f649e1d54e13cd2801a71163ba7268ceadd40b6ea03366be29f3365418e3a838e4348f29344a8b00c19a72e04692d8a25ef6d38d32a3c88d001d6f8a7647cc436726da55177a51f1ea8f3fdfc2424f3ca6a6674143d12e821caa5a6375125bd1de6af832a0cd2572af1ebfa58edbf3b755a36a45072c57b593505ef3c7f022868eff51a48ef6d9cb4be39cc0664ab8c29125ce04633f613befe6fdaa567f8629712ae52f12b8f221656a11cc775d957d12735fa6ed29b702c4014f8ce47f88fc987eb4147d86b738fe8941f8a3fac276b19e495717a014b48b2c84d90d0bce959a1768ec38ae716caf7703e9022f3af946cb55364a4aa658e3f46e1fd15e8df797457ddcf7961a1c4c046778f2b1aedcd4e0a7e6cfa9a9fdf45e6b70879de5e02b9531f74c31af5b4d113aef46cd39e02bbd7aa24f26f7751890512993967a3c84481cf11b398acdd4672c416b5dc4f18526dcf1ca2f55e2779160b65323ebfa976cd2fdb815d04a21bec2bb1c69d6c9c1db8b18c73ea070e7b2cba90580f31e9423d6d7c22768a5eea1148d3f77e19315ee16ab650cb176ab057f10c0219ffcb9f4956ae71221197d4697ab813f17956dd566fe62bab484e307cab3e0df47ca483d5d13749518a909b2b0476403ab55b64c32d22c7234533b7732911e8056801f77ff29b016575ba7aff3cef670cef982943e122f7ccf449c9f31163f1b85492ad207f8afd202131862afd772b355aa0f8440ac5e08f5d661353be39367b2d0d354f5ff5baa62d9b96d1a8977a524dea3a6c28241008ccbb61e8789d894868fa052c07a4e00cb6e425dbcfa6448bc5fe099e4cbd6b617e5a460bb887a8b98148c66a1684b004bd6df4e2864945203a9f69516334b4bd3d2a2617d35d73755f10c73f2c9000dde2f2bd446937dedb445ae7dd88152464836d0cab7d0fb36162792fa640d35b10a8fa7a5ee2159e7850a5f2705c3339b77519570adac265fa65a8b13fc38c02c4b41017d3630dbee9516bbddb24abafa94e90836efe772a6dfc49da900bb17afa4408c79da3cc522357fdb3e417bb17879310c3b5034eb7cb244c7f90bd7d957039de4916559f5254da6258bb754d8499193b52d32a315d58b75b322eccf2a317cba884cdae1157068bd11f1ff1789b85e8d2eea64aa3a295f88e077c50c35b8a06aadd390b371e1b07ea47f0e6c0505df03df37f96a5a6fdb69f5f2e8ffe09a8f42956b007599c78de0bacadbb2d612fed1b6fd36cd12d4d86ff560a2759935def45d6ce42eb2d299350117d808ec5f8f5cbbaa2c01aaad19a51263c146112246f654b25970c43186b6bebab56dacf364b852470652194a82db0d86f5c12d5f7696ebceb50299f4998eb7d5f781f39c584049771deee45691f293fad3e31879d24e02b1108bed5bcf752b3b2721cd480fb34547358ebb585381d00e6172b621cb96a0d0bccab57cd27ace1c4c6b5bdf18f68b5e41fe6ec3beefc8d2a22d5d2bc3aaee5276d503788f0e526ebcc4bb1a96f29df9a444ce87a44a7bfa8f692b22d2d01f03020a1d13025b7a05665154bf1cf236ea957c66231b4305fdfc4d7b7f87183e3b40a37afd9da3b753dd51ebb595cc44b265a5ff53957b794b9d3537bfcb4d81281940bce555d2845d10a7a66b7a83b9831f43b19659353e9bde44604d6d014f6206986ac278a1cd83995b391c3049987bd3072952642ef523b506c8c5c9592edbf7ef52158069299b28c859165bfa84fa73a7cba110748fb97e409fd5da731b631f3b5e4ae45fb190cec222a7c48647fcbec88124578fe2e0c4e89df43cce5bc98cd31d391192a7cc84d2e4b8503d8643a1bad0754f5a7926f965da98940a9e5877ad4d38e062a115b035f9aaaa07dbe64db0727cb368a08a89384dd6e5626de15d5040d3bdf43badd62cfb55bf8b92cb524e284c18c0257a1860de1984e2c8a2f04825fd5135379d9f1691d9a5dd84ca1121b004a1ba0034d30edbe2d2572f652da10c4a608db55e849cd07f60b50c48b29ed014448526343a82b353a331dad7f7e34279c1099dc81583a1deff98220f7d373f8b88c80804de8a498cbe288cf1725cbbc689055559e144241dd2b556a54e8fe0c07b13a825e459e1f76e677dbf7a780f7f3c40336f6baeb20142e93d41b0bb8586ae4c1f415e38bad55341eb67887554a94652d3165cb30c25cf661e2df1a6190df099e458259c2f7528401be069b15874f6a824f3cac58dab617f3a0818b6a313a70d69ed6f04b72c1788e98d7ecd710dd05cd515cff7cb0a127134a9f1cdeaa551b13ac80250a786a9b39891267f844c7e502c9b2591f8f6d81d2144247a203c9edc82f81005582a9628913fea26df3779e411a3ecdc0b372e871f5fc33a1ccf3021a4fed5d4eddf057175cdbb8117db8897508d9875284725fc7316ebb9174109bd043a03a96c45b8748e9dad256558808495e8a163a68b82bba54e2208d87e53a3e419ba4596185b8b58e7374d85d02ba001572b5e2b070d0a30217d61a6fa63f3ebd6ccdd9c42bf788984dc8366388cda2666d66c7ade6fa319cace8f965a550b9e8befc19f4e7d51ff1118130cbda8103850b72cf9ab3895b6a9cfe645c545726a5144ca495d5420d2c54ef19465befd0b85db7d3d8fb82f0bba69b85043bd463ca7cf24974065c0ce5abe243b101d389083f883ad80612cb2e4159227aff180c26e94d7169f8ac9df0b61743a8c2c6b774567dbd1035dec8f186cd6155ebb7f25ca5d6462dd1d57072ba4cd871cc48c25c56e07c472a8c467492025a667842d2e6d7ff7e450d21f618d9fb694015d03b66037bdd1da1ee4841c57ad84e40c7f5d0745e69bcd2e042d6c411b31e62d87c66187323156f74822cb4e5fc9e8c7c220718dccafbae10e9249aabb8213b609a16a1f2388950acdc1c0f1ae90d1fe3cda2c7a2ab5f76b33308db4fc0be2d069b65a68c4eaa65b9ed5cc64179f0bb733935e5f947e61f913801be675e6d9cfbb28206dab6e41adb88861ba9bcd883bcaa32b70a42b78a41dc6b5810122a655bcdb02f8f64c9567293e5c0c7d3ccd6cfbdb318693c413c29412c9eb83d6554ce21bd57e74ffb279721e0f326d46c7d2f1d31ad1586002c0357966056252cc8ae981a71db47ffbc698e2f09e733912fa9fcb64c0efc77f3bcf8dbaa4302cf6d59199c5f956f4fb52848dc029c48a339174a1172f9e076debf93587c01b00ee33b527fa41e99e775cbddada880645270d8b39de3d5dcf3c48d8680a53d0af3516a7bdfc1602ea6189475f40125a4d07af4168d388f23dc68eae670f835a576a9d7243333c7aebf76db9fb729446b66f5c1dbf9cd977461f2983dd09c15ccca8e09fc05f2039f18f41c95dbf837d4df404e33538a200877eb70fe157955aecf2dd6849937b6f99524a017a046f045304b2868684e2a2486895c3a5391577669e2a3ecaa1a589988f853ac6f8a0ed04c91044e331644886b145850811ad16155903528be24a4a4c7c1801a19920680b1e2c756d486e5e121fb517882dcffb568bb0b1e53de7799ee7795eabe582795cc7b5605c4c8bb2d52a82b95efcfd27a29610449af810d4f169391e0d88e0eca0453131a194a62aff98aaf2bb7d75bbe2975408c74a903ab6e4154248b88610013a22c410a129900c01848812458688011264658a072c8891a18e3140868070d15ed4b5d5767e6c3414b898c18810181898998719aa1254c5923ac2b81d8ccc406406ad961195a0a21d3490cf34587d2681ddddfd5f6513d2a23a911d41757c9accf9a42082e3c3fff3c360362437c0523d75843db14f5480696c458ad8a02b2cd88ed4d0beae98564c4ccbe51de3e2989898a4b50509550f475aab638c0f17756d4bfc60b2d96a5acc10e362ee7e74557e0d743366b8f85db019eeedae198caa6b3392446485a43aba86b06cc1fcbb19351d07aba1c19c9d612ca85587192db12d77d8d7ce612dae09557ecbd95bfd62a29b9e2941ca6d6f5b9095ea2d2adfc2484fe2e07ca03d20d38f43555f96d59e74e9810ec6b25ac258b13dc9bd27bd6bc9c9e7aa0ca53cc56a2c7cbcbbda9fce1c8ef42bd3f0d1dd5f06ccea2d91e8e852dd3f02ee3990124350ee3d7fff4e28f0d4dd7bdd3338ee6d5ca22a9e68f2dd4df3d42877febe526175a4c1b1080110e090648a5995b27f03b02a391548599db72a6cf48c093dc328b4e40d52764414a31b14d165409a1831227239d1a3b6515169848e2a950b76e55c42554127399fd0c6e1fd4fbd13068ad0915699dadfcfcba0f70e8eb264e293cb28a3f277d3884d55eaec80d7197e80abfc81aecc2c8d98587cd073d3a209a21b122c26c836f3005accf93bbf10f53a6c663853afc3a6f4fb7d2a34e9b029b98723f7f5d1d746dff735fe7d449c13cee5fa4b7e0ae4401dbdefbcc93fecc3d57befd7e60f40a3a3acdc73dc737f7aee25c73dfd3a47a1c21708f4a3de01fda8d3e95127d0f4df09d4513d70eb07e290d5d44da43a2ba33ca45613dfc250b6993dc351f041558bb07ec93f000ee808347ac60b6512b4e5e9cf3fb9705c692279a08d09a4bab62592aa02eada9638a2aa7a66d26ff13b81a38e7a9228123e96f00502f359de01f3595e472d810ea640d42fca75540771744585fc8465be2f81358e7ac0acb34553484b0ff0c439df9333649f907e8d33c7851d0c52b40026067aaa6b6b21e8e4022dd5b5b500949a51535d5b0b43944e40bbbab616662df4243d291175493a13890bdc8e77450917a40d0e8cba2b41f0b80d1520ee4acf0b5af85ce189c12609e88a4e0c365adc2655d94250abe3a398b09c808a3ab664906234a350afab440a931e294ff4486102069aaaab44ca901a21a0f148a2f2a2caba361e59d45185836f37269da50fd29ff3e9759ccf8ef339bbd3ec7c7a539e9a53b54417950c192d9f83325aaabf0880e79ddce4ec22a35b2f2e8002ca494f72725151a4bf3ed304dbdbbbe4d33df75086a5e9a99ae3ee96b2bbfb391409dddd2b84dba56cc939c7759273aae26ababdf34e30025e7b5130470bc1193b7464204e82c8a677865b4691b0fe629bcacbcc2181e34215e67677b74d55ce21ea04141bc495bcfe97526932d0ad7b6d2fd098f6431d59c8c7a653441d99484756475ec2468cc45347b642d66a178e7f038505552dcad0e5344457fa784fd86baf9bb9e32f842954ca2cf83605e56eb5eebb1a0d12edfeeb403042bde7bef49f8c1663d040a1ddcf709216fd9725af73a96dd10b6b30cc57de812082d2d17ea9f4a65f9b9752f83281cf647a15beb00226140dd7c60b4f327f994cdf177e2a98c2b59937eb2baf439842dd6ffefdfd3d50c9d38812b4ea4f97f42a891fffe17fb112362e64594ef30f610ae567b22fc6a274f3251b4b55bf81d0021d79c98c772dca5d6e91c3917bd806b6d445f9d7961e2817ba9c6856a0c9964f64ac073aca1732a0dce8795d4759dbc7978ebb99df52b936a0abfc1619d639c896f284b0841625cd11954614f1fc9abed13ff39747a9eaa50c210a0ad6716bfc837b68c4a81eee773cf3554b14ff551249b6dc2817ba9c629037b923659247eec81ba4ace764a5041be3efe71d96c6c55fd385874ea57a9509bd9a93521186d0d2cbcdfc19e6609bf93a6c4ce0122cab798769788795e937c157cd3c549755a95a8ca0328c6dc13d52be8519a55195f363aed2a2fcd1a29cc99e16e50b217464594f77a37922536851f6e41ce6b12fc66157f265894ece69cf59967c118650af7acec65255a67e9de54f959f651b93c1505429a5e423aae413540944956c02274c45955850a9321c55bcaf171caeaf52e13869b8be3a85a3aa7ade7f5ee879de7c8f6b34870e1bfa6b435f3edb3646d433b28841b96459f22928897c25259395f197ecf1957cc980392955a95ef6d41623e80c6509244f8bb12da8e4a9f29965cb924fe384f60ba4343af547848ba0196588910f233d7cf04c61e40a2b4596e07164091e5a02707c2845c162c507756d4335dc3829a5949d94b27bf95f27a5ec6c18758725c09228bb5c48b8ac1cd5d1756b8296e32571b95cae2148b63031e99290ac70244a4cccb412b382923ac6f8302da1e53471b98614d95142754002450e9217ae3811edc8028908a810e9d13bc347888ad494302da1e5088d20c707bb74ef97eeedcdeeeeeeefdeec5d43c367b4e80d10a2e3aceeb4a6151952db718254e0dd503ce8142382a4b0cc5033429300524b01957fa75d09ba52840d478e628c7c18f981c8941a8f224e76dc00c4e5423571b9861881811528589083234d4a3c6a4554848608819c9d3bf73d3af7ddb0dd1d5bae16d72d59b66092f3ce39f71a36a6e4e622f95165d0163f756cb5c0e5a23571b98c68505c2e1725ae187589eca05247d79023a528808668aee47fc92ba9e3d3726aa91e1f34f038f7388feb38ce658a6861e163e6607445070548d775eedeeddded7d8513b560ad8eebbaceb9f3ce39777ee143198913ad1691c7c0e57215a981ab34823aba86188922e8ca147fc5873a3e2dc7c404882dc8a83b776758d73dc3d8b9bbaef1af52cef44bd9b94bf7212855c2aa844223c1111f43518afc10b4c513d261355e43437e4dd3a094521a35232cada3e1b203292e8459567f0a749d6579d7eec2ae7498c6855806869de1de3b06383491dbb02f9f390d3bd3bd873ad5c3990ed5dd0817ace8cf81cec48afe3ef3972bd9957b8d65dcc80819f8f812cbf21fdbbf9396e5efce3fd5672ee4de7ea4ba9c54ecf7ce35679a1a3aaa1f55307ea431b8e6c18fa8d992c3a233a27ecc3cd53faaa3ead8339ff347296480720a96f17f01e5d1b264ad885df9134918464854ff0f421aaa03500ab1a2bf0b288958d1ff05286958d1df05286158d1bf06d3c819cbb8b40107d3481d96f10fa26991d461ca17aa3f0af428eb55acd796e5537648e2a0eab84939a8ce4ec53ba13648410cfe22b7a3a3134cd3ebbe9f3309bca961a3841a534d95c209272ccb7f8f6ef4abc31cb7133c858de16ccc54fd653ddb73ce90c3e6cecb918213baa8143ad5f8447c449fdfe081726f7a57854562372c01fbb200f58dbd5759493c69e105eb3eeecd3baaafd56af102a6ffbe54ca610a55a1d862ab7bc749e1a645af31c308c4926887299cdedb9d996dbca0708803e5a3da853f985ee52f1b53f41777375af49fe28720dc5dd6a2bf8c09c239655e4326db5801aa3ff7602ec1c6bcfaf30e1b338d6cf444134766384e25e60e9182ea5fe32ffaadd66e8d1a14d817e3c0b2b54dff1714aa8210155408676ae0f7f9355e3c7d76f12d5f011721fd0abc086b72a48030f223074638362d1770015d1bd60a48860041e37092a0fa8f05a8f307b0343c8295f19f2ee6cf7f01b24cac1ae0ef7e72cb08e5da7d57c38872a3242080daddf895957e821f7f72a61c707ac0e9595e1e80faf90e40fd0c6196c592d2516bba7bee1e059ec26df10bb7c51836660ac5bfe1af399dc351e5813fb4842c731aca5afe9236feb01a590b2817c6c4a0c0c81d54a398c8dbb4d96c9c15f208491ec92389e40345b22dcb36b2ada85f3dc35624b12dc9001be3e6f78eab54a59022b5c843b9e6387d8eef51a197c4553aa7451d3e99ead7226881423d7f1a216817f229042936eafe4ce382bc793e8c64d77ae5ad752d6c67ec4c3f8c9fb3a361026f6ab4e80f0384f9ca5f05d696e5ff4541bb4f402d7212b51eda57535142aa75ad918ad858abfaf76d635ff5775bcf7cef8e84177126aa92eaef3560b12f14a882a03d54ffe5994353d91dfc2d94718f8c03a8cd210845d4f4637f23f9ebe563fc3861203df8cbe29730c69c30c2f0048e2880b416bd461a41057404206af3848e5cd432dad87cffdeb1b115dac7c67e6cccc8c67cd8970d5fb1b0ec645f2ceb21d5db8816d23a74f063db50bd616871c602ac231775ea654d232dcb7f842128d7efc114fcd51e247590e40c6403c88190908ab688c5db7158526106ba464dde487e8a416d53d880653592affca7aa3a01409859c00096d55dab9d7f23f5a36eb58306c0cd0721a55228179e6413c919b974cbd0890609f9c78f1a3fff38ed02b805d4340d7fb10dffcda454a5e21af37fddd3e81717d9b929e1060e9d9dcacc6b4565de2a95bbdddd5187cc84a373e32b7eca946b2ad146aafcb5362fb668f8ca4397538ba7ebaff5d5fcae637cff78f0ac03d43696f167960cf005e49d16bb8b1a8b5df97751d18ccadce14287ea5b0e280abdeacf62528ea1653fa81bcf4f0ba53c303c60a1144b4b0cda02d436a6711e14ca0320e6b1390f29d0757019cbe4c093e2617a43f5ffbe130b9d50dcc2d245e1884275e07242b90f1f2b35d9e94716ea5b5ba9fe1db880cd32cd72b6f80117f94b1ca77392dff861ff244e4ac95a76fab1fda50a944fb08cff07a0b42dcb5f062881c0752953f5cc994ff577f1262e83153d8906bb621a2fda51e9547f8a53bb554755513d8a66c13a123b41c76165fc3dd07558918715fd59c75f5e647f308d03b18cbffbd8953f133a2ba8ee2d3d504eca68d851b58c231fce73124ec24938c927e9c149885ae63bcee33b3bcee3322ccbc599bf80baef7e37b615a805fbf21d6ee62b13fbcca4e861262e83412904721f916863fdee37a85ec5afd8957be8562ccb5f041bacd8e19bdf9cab8d5ab9b3b1eedd035c2b072dcbddc67a42c516db7ffd6d40650843e3028ae341217b589ca9de67ddad9d7981c0dcdaa5ef5f6fbdee2e812834071a870d20769ea0ba1fa1f2a0eaa55d1beefb53f8fd29dc0e3deeb9b5a2facfd4404dfffde8b3cf67ee3ee3fcc88d7a76445113278a86821c6859fe6c547403da3df71de8bacb3ab5d8fb5bc756ac071d22f2243ac885f86c635c3d88d39ac63ef3597bbfcbba000ae81a552f1cdda76937eefeac2b6817ca1b2a854a1a9d530c53da240f222965920ea5504d0a49a19ea9f590a2a78ed406ca27c972562964635c852cab2bb5410a887c524a5974ee650cdd58aa72df7feefe2df68c0837505999b971703c9fa7d7d12b9493b125a6b0aa4a8e5eb9cc21c20c5566a039fab90e70b56663a7f7affb7a5ff977b3c6045f2dd21772a06ed1cbd789eaefed900b16a80c65b8b478c4c5773e17e2413c48ff04f169d11f014dd020eee30e837d31154836249b0dc983b84fcfc47cee41bc8e1ea4fa4e8eed4214b72be665f59f24951d1093bb1eb1459fd280d961632d1c24dccc9085f93974d8ccf7c01cefa614b2a0c2cd0c6ff84a52492ba594aa4e52ce208fd8078a64b3714c160d04d3ab24eeda8f483f6e6dd68c84f39d024f18e1c65f30bb64a433aaab7a4ced9156d1a5b60ce62492868ed6a3a3d19f9f9faf6b5fd8b416a2a185fac53d7a48b1b19a57b11e656750ef2f61d81917ef2f69d89917ef2f85d8990ede5f12b1332eef2f8f36f6f2fe720aa691f1fe5216b172266d58a35a54896812896a0ba2ea20757ccafad0be207172309da050547727343e5454fe5996dfb2406159fd44db30bb36d0ae23ff7c60ea5f80a57701ce4775cf3f5eab6d4c6663291098a0df83e0847efdb55a8d6ba8ef9cef5b47a7a87fb08cffec65a745e669b1693eeb1ddace0ec8bd0b68faa42b6abfb7fc3a8df27527fe71ce83fffce4d201cf12fdcf9beb9407210aa0290b9d161daac3529a73a8f67b3f4bbfa9f3381a4ed067de4d16e526ce89d775de3f4b1f3df18f739d7707937ea814ae7655397548060000000933150000280c0a040362b1603c9a84a22afc14000e708e427656321107234110c74088650831c600600000001001c8cc9088e4017a58dd516173ff35c5748e782b2ed75a52c60bc9a654c885f44dd6bd08416cedb934b8284e61d96508ede9a551db98880082b65502e14d4180a3dc77a28a21686e20d256a937cd6a1818c3465a52d7df01b43fa177bbebddf917210d42215d60ecfcd8a39592fd91e4843e7b240ed0f22af214cb75aae305509725e924e472d83ff1186c9f95e45cf87d1dff365c185c6fcb5da06ebd60f4e3cf7cbfc6f78600daeb0c1f687a00b0a21ffe5a76fa2830461a8bf670e64fe43aef1273c28af297c1eefc5178682d292d90d865b4202e5e1f6e4f5260573ed8b1fd5a7ce429c57be209ea190ef9db5cd6e8cd1c8e5822acf7a085e5dd2e874a0a316aaead1be32f98249bb9034591a4b1b4c3967a9800d9564e8f1b11a47abd2023f2321e2caa89c57007810200fbfa05477a3ff313476d197bbff8dc0e24b71105a988e16499cfcf9aa8b37874e8ff20c2364d821c4c1b9870eba6c0915eaf58bce7744a913bad9701e34f27dad1196f66431a11b2f71ef24a11134a8f36c122557240fd7ccb49bf0a3b7f5464b2274d06acaa6ef72af42a9874447478388472a05029e60493b23657a40171aba4de5eb048d737301c5cd4850f7c175dcddc4d4953a727556c713725e50df95d56f1b37c9029060b3f1ac8be7814528dfc7e5baaef9c1c134e2e9b80278cf79eb1ba31a9814aa5a2ad9a584290889b5853a9d46b62627ce05ca078d89cba35e6da1de8ed2b6bc33faf40f028f9011e403bec9fab59a17f5e40aa07809efbd9a300efc334cd730de05696d40b7370fae728378efb3b77ef6d2cf817b2bfc8df88a370473807d7c7db4c65ce7bf54fdb923f66ba8d01a067649727a1cb311bb004cfe201f8e4fad7bfa7392f143fa7ef4b587482244489a23079c999699084da4a7272a143589fce2194b8e541affbf9b3ceedea5768f78c4beb3934164b58ca5953e7951c4d6f9acac018eef4b27c35b02628fa99151344a625ae5cc9e66296a4058100ef90c6422ed045d3f9094e01454d590c6db4bd07318c7b9cc5e2917f059b334b0a142d0dbc6e348ad7d2d8789854ef6536a04634e39a1b80d8845142f176a1a5d38a449ae4370f1096e88875b5ed8535ca258c707e8132c3ed570531715bb3760ca656e47bcdb8d842eb4e691dee6ed5f5a4ef4b3cb4f5e44df318819cab8cbd16daadfa688867dc62795936ea2dd6ce77f7140012b7161561542def92c374b65191e5511260eae52e3a89d5b3ca223c02ec3d2cee42eb136bf9bd49f9b365c8e0a4a04c0a672515a3aad2551e09a8c900f1aa8d299178ca9464d45e37742b4be22128451e9a8befbf4d79afe4af9e827e99ffccb9dc1410b7cd077a387981567b71ee9b0c2bf841ff2ae1c100f10b768bddfab62c5569648fc25bb958aa8c96e6a916b51cd4fe961ce45c81b78eb30ba61553333b375cf2c6bea03e2b966e8daed1ce578afde83ebc61179b67aa47ea612450432fff2ac9adb0538deb9fd17a4be46e1a6c950d3094b958b95a96adf21ece19218ace7c3432d2f60d65abce1d31dca395d543276b95d94ace4f4c028900a8716464bfa2fbdc8a947244a9b0aa801e1b103bee1c7d1a3aa7b2adf2f23dfcda996e66726c0ae39095fd2433969b9e5d0e940b966448cc542da98a714651b2349a2352784bb22f4ee173b0e5e87c3fd72c5a2c13777a798edcda571a5810a5256d87aa0509aa68a666388cd37937d77e34918f2840a3c2ba4522b3a443aad052261b2d631ea8360b8166ef6012e2a2e7aeb4d146e021f1c21072f95d861f4399f492127634cd114d10a27b1bee1e634bdb8efc3777d05a600a2caeb7450a1790940c6837b38cd80536ec8d2035b43a900ae44d578b0d3c3b88a3351c770347430e6d732d65b22bf2bf3df0b60b590866d448d92d2088855263fc23de03f145d22eeab0124bbe589676955f41896ab4af70c077075ebaaa3ca8fd9b42f0b5548ba85ea0dd45a95460d505dafcf2f8038bd7fd488a924052a455834a4fc1ccf0a760934ec1e44bdc2fc8b516c05941c2b665f054c3776147176c2edab40b0e2b1f2685545e9cea89f4bdfa57ff443f9094455c53ce5198fcea1294cd0ed660b824af66a547e189269fce4c37d43091c248817c9e32184b06ae67499d06600b3db9b478b020407a97e7901039acee0d027e7558a2c6d53e27a3eab1e1d9c1ea067042aa0bd40d876f96e8e14023d4b814751f632c963f263a7bb8ba0f78573eefc237171bd0a555d47c2eda82b2270e13369bd4c1bcb4effb950aaa866b2053882da8ebe700a0af4f374dced2b127e39fef51b0d99d60241bab13e23754320fafdccd1b75cf2103e1bc30c82d1e933e1459485cefd4d13ee708cf5871f8ef1e44e2945d493303275634654d730a00ab60d0c084dc143d67e1e2e79276dee6198403ed31c7fc0ec204886b4c4ffb64eafa1165ec4ab947c2ea9ca3c0ba8f563d98a069b21a07ec8e304d068249b00493d30039dd5f6aeae516fdcb9060e90ec8ed801ea25202568a60b4ca0c375217f9c1085c46425b07587af7054664d415affb70c01eae648dd5240bfc50fae1d3945bea29bbc6fbd23cd1361152b10009c035370700b741a05dab909bce354b20c1a7417c610786c3453b1940d3380b77b749a8cd07906dd3e427a950c95ce26e813124613133068120211cdf09e98c934d7a0096e6e6284ba3cc0479082c17eaac4872eb2e3812de1c9088685cfc4436a49ceaa603835d712c020fc91b0e60d1127fd83a37ad0bb4140d37c4211e11bd190af53588d1b2a2b8a0d45e71e37ea67ee8351ae7d6f7194830bddb80068483511a993e7a1c6224074cf6d3fc44f7d4e7db301d191c097637a409ba03270090c4b10f8f850f6e0f87a47b6798162cd42540ab8cb014de249c71814506007ce73d55747fb8a4faca1f0eaea7688669f679d148b506070209284fb4d8e36c7094e72f43a2fc6dd666bbaa911d785ad1373f6c415ea1398b1bceb413d2e12fa6d0432cb89b4372806cd9a09a429aba378027b83ae7d03f8d1f520974b7ee305dc9e9a8882c02e84d1b368eec5f37d786801200ed4549e5d3e9e639fb00829ec9776e260040ba9f8815aeaf6555a390b8e39c4d590b6e9762743a7ae144a5e54f679d1c2f38c338abc817c68c64b5e263713550f4d14ca9205951c139b669cd133b2c145814a29d596a739b872c9c70c32f6d59f07cf7bdc8f93de8fe8a1c115ad0c699a83757e33ab198830316fd8b9a1bc4770a47ac65cb381aafaff1576f5e25c2c5773f4f2861d2031c75abc460c75ffd8510792dd5446cbefb1bbe7c803e7bd2839d8bb2ce31f4813bc20688b3a349e67e06191adaa8b16c090befb2edae40c45adf59460922563035b64c6c45d35470314028c3e3120d952288e9ef8212a969183c75cb38393df8091d61c67a3d5dc341d24a32e87b0885a20322e413b96e9ec0b0b580454d57124e809408cf8ee4c6b6d0abc47ba679cb99c31d96ea2c1ec3d09b1483fc60b58626a9da6ab08d46412d7554f6719102565a4c7b136e3beb9e560684d20b6427783447b3f911336cdd5225d5df64af4df3f414553b72509f98639aaadde425c81f129a0aedd01668106a9a9a29fb4c2005cd6c327521b88674fb64e330e2c1e65ea8a67e4cfdcc805e74a1091fcecc09a4904f6d6d36532ad4313cbddac939b9f49e30edebe284d9618171844af4d28cafccbbaca0d1e88dc7d428fa8f291228c9ceb492f4f2fb532448dbd2dcbb2152f75317a0dec8255f0f68a20e61909d8b730b2031d2951fd3f10254d908614958fe887a2ec8f0f0361ecb3649124c3b2240ae57fda13fcbb1cfaff1fd624cbc25b0094101bd6fd645afbbd30e1093e4dc373c4d0a208db9813d08fe0220e477b15a28d4b8dcb528d9e9e78d9db27a78ccc65c3be912962bef251c07565405c852c3b1c1b5465e424280420748aa8a4213f622209b2bd8d39913e9d3a4eae631f768ead2e241b2a31959740e534dd8168fac4a2a385d9a5fcb5ec55d4cfd4df004581f05c6f8eb48a943f02eb55ec533bd0d3257a7515404ade3718955a4b7404bab1ade8c3cc80bca42170647878974f57c88b0c83fe2a1cc3abfc1cd19b168c26069d205f1b87e2dcb7b971ccc0e728a5d08f6011be1ac45a35e5950558375863a53c770b366f56b673c401265445064a63e424ab0637b0b50d3891d0350027292768edd50ec4c92a6211d3963d65cb38845a2e366a477674a7aeb8447a697e358bf8f04613585866dad57006182b04747caa008e265ff748903534e5729fee367b48b4413ac4954747e900f1cf2bdb2e7dd609dea62f6b7b38d42df814e63687ac90296b22e075ebdf397b4f4ac564314d71b863243a80c7db1b4ebe23ce0f454ea593c46697a79708cb76a6091d063200b71af2f048f6cb40a65f51b0472e54de5362914760d0a4e61327a922e0a29311527a390aaaa5fae42360279bd1ba8ae5a3f14de66caa7c4dbdc792d9b45daa473bc86dc5361a9846c7b1ef9ab3c59d3ca4590e9d1d10cb359933451b02f1b9935fd310aa5e789eaa403ad83711a5747a40a2be215911f3f51b46eb0b984163c6b3545fb81b3ad0042b1380d0e4dbca36b0c5495753182c264338b9bd496c233ac98dd47a99f6bbbd3fc4e38877e38d2495cb58579d0b955b657d27c4c4c4f703eb9ef1c4b8555ca7e8db3180697556870e19670af909d53f35369f016f8bc852418cf055dd09c0f769e904214576c836a86512bfcff14340a7c35e36f446524f27e795e474191db65f611ee87704c3707c230282306e39104ba727e3da83d3894d7a7884d10d7b0c93c36b1365b3fa8c5a5e812e1fdd339294be421bd63ab12df2fc0ae8a1d7ecf2bcba3c4c088ed78df1e7eb1a555c42471961dd9000f48920c1d25cc64c2dfbd9e637a3c17f4cbbd8bd9f58bae59b54824057839017aeee22518f62c377db1e355196f523e932facc22f95e8451e08864238c6214c0c264a0349fba88cd932e85a467432d514f95e0ff3dbfd951439b2a89c047ee0a32d0c4d452024348640e210d907c670449ac41c7567edf3a070b4671a87b0a1c22e5a367f2e4b9aff37c357a120f66496abccd55b2361e4961e85486122601ebcd36080dc7d025bff66870eaca66355c2a96ec6e9172c6c3c2d37779e4d396108920786348696341f1074637fe44e3d74df701e2c6dfbc606bd4311bb28d2cee20dc60419b934f2c29d8264d91871c8b4466fe14cc433924895f7c56ce1e35de8fcfe996f0e2f35901b0b864a9a9429cf864a2466474c03cba046e434dcd34bfe6c7aee7faccd304337c4369b2e63b0e5ea353bf400fe520df42dc9605cebc1da379cf7b0cb667b0320a9692300d684b51cd44d69e7d00aeba305527e87219cd8e76eb94f73161d7ba5cf45a44a18b4e85351b655243ca76de71d96834739b7a9c16e362c5310510c01ea1f999976ad8e26fe0f3d14ec2777c4fd73e8cd6fe2fef0d475208a00c83dca1bd83d76eed1ff042e9a3a4881a487ebcdd139e6db6c4645c9aac8a91545c6501ad556299d38b4399594e750c1c27ed0678190dfc95ce06149967648515571bacb6d3e012d8cc6bb6df8d6caad7e2b8fed577e7c17d4b18cf7bdb20645112ed0a290739c32b9d0fe4340dad7d55ce46092cf01dcf1b9f29e242435f312329949747993ec1709ac02ea28d9d06105ef8994573942020ee79bfbadf28cee938c39ee4c4a35d7b2058b1c78a593a99a92af9e35451659d24bacd4ac8011a3d1c935cc65e9b03d17e438ceac1c8b259ac5c59883202c48bf51fd4fe4e8e26dc2d86e0cd1043fe4f935840c1308bc8bdc8b79298e272c53ad9da3bd77df0e4f808d2863f2365df23b49094a57c82ffd71596099fc8d952c4390d3e41ef92bc81e054cc5390e0b223502e4c791f15c12713676baea8b1b109e16ff2af7620ba12569f1349029b6058fd8d2caa3404fa031d7b2a3b569e5f45d42843efdff21faa5684b56aa30ef85278a85c67d894f2486636b74120296f04ce4cf50b965258d2e274e03f7784bb1259515976939489f71ae4d493fc2f8dc60249d2ff67cf1ce54d69a63d169ba697f6bd1b36be7af760a3ba95b093de7a4e3625ff269b85999b0157a6828c6b367c25eb69921c8f48d4b80f18c3a435be9a944a587e9a61a26773a4365fd7d1cd343bed38d706dd8f2049ac59a76b41e78bd36f6ec8f4584ad592efd5faa0833364d9707c63364d9fae3c332fbea9d1d5a5beed1c524ba166e77d69dfa1f2783fb30f514145132ff63e901f06a06d3dcd3a58515bbfec94c9c1d7d431e53b60f9fddf586367d3d3e545730616a35e1b08210b7732fc3c21d83d71bd9dab203e668b2295dcc3c24e4d5d501b438f0b0a508244c29eefa3e60c7b387d55dca4e256eda1df02c9650343cb5a5345895ae92214424c0078fb39d3f7e60cf2420b2e0e4339e5165063894a6c644612d37123a15e7cdee982501a4c9dd6a312910787ea0a29a746a5f19ce50318726d5c033fd3bae8c5533490d85524fb5262c98168284e2cf831b6b09e849167711b1c7eb08b1dd529ba52aeda9c1b273000f61f9e03fead38bce73d9339d548c2328c50920a57d9f008558f9a9cea3c05ed28c5b64560751b6c2af23a082428be1438fd8cb9749502ca1d49223c471c534f3b8901aac76f12bc4f664945e7b01f547c97b4d805fb0365660c300d47b2542614e0c98c3f69a763d67e61a04cb5cf75d32574245890713cf4ad507289a95c7e0f5c4134f19966417bf9b5bca8b10a815aac373092b8ab2e6cea84f3c1f740b1ef5f5ece641962eab202c0bacecf62fe87c5a905f5f557f911dc5dd1a363b0d130130308a272208fd2a5f1fe2a6f9c478a509326dc8f77d136cf3f3b3a5f7fbdd98fc1f7137dd9fe2e7ae22044c80a12da31b77dcd804068fea15ed4dd6f3b19996ba6d4341a281c7a56f791158f2ae96d418f14f716b892d6e9d8f1383e08f33eab2d2eaf0c7ce1f7ee9e14da3b2ef46ee794f95befea57bf15d0435b6fcd8b254e74ee574233c1161733dd1fc483b1f2a00c9a7de4511b0d5ca543fe532967c1e9e94dba2ce6841a2829b3259ce466f6dd394b2784e9e11b43fcfa5a54897d0cb82b6a2edb4105f3cce4cf68b5b2b3a2b77f499b3a89d1892b35a88c00ce6266e3ec15909baee94282da0dfd1109f23a58d91e15112ec2744046914ce3e587c0871b6427e5281ce95c36487acf190348bf547ddda3175b855c9a0f460467b35e0048e4c517226f35adb3b89aaf5043699266a2bc77331b3342f3cc150a8ca9e6f700f9db5006bf63f3cbca95e994516fc375b932a30060eefc0cacd844b2255729efea9c69742a943b6cbf2bf2c51d50b2140ba640a74ba926e4b8a1fc9691df1da3f2311b6bbfebf30fd9b2c78553f781de8b7dd83dad9d6b721d322dc8cdf640fc3095720b20ee922fceecd0e7a139ab930cb1bb09d6b83f612e32bb2797a2b7fae204eca9720ee7b3cc68639fcf1f2c2c21d6208d5355d6816e630e7653695dd9d17f914c8faaa5768493e71f2a65a174c64864bfaefbe77d8a68bb6833eff071228343c0bce822f41258d0c503a5079a2f58242327c042eaf688f2ad84fb2393868201d83bb3b02e6ba54193baddc3ba0a77358c2254f9988023f44c7816be3c66023d184d1c11a137048a2f55a86593c080dde93621309d9be30e071b12c8648ae2926346ba569f38bb1d98110c3bef65c0b11427c57334bf18eac9870f3c041f0cc95d159117e7bea6bd8858f49428bea15c3af0c67344166dac0ba5feed217e9ec965bc4eed8f8744eee1aaa14cc05a03acf1e2108cc3e71f6df1bf896b9c419d0cb5752d88bd176b3f6a5b43dd57e968770f5698372ddecd9ccfac0a13a30bece9c305f82eefb0ca4c6eadc02254c85860c0832d60435c7b71bbb9834ffde7024f84cda445f030ddc7a6fb7af451bc80c9987da007f013c72803d084c46d1105c83bd0dc3aae5164a6dcc5310c3c57bb0e43611850d2aeb5a30b4b18c74b98af635f76727f8d7b4b593b14dca61a358222c2e5d588dfa03dccf00f88da5a70294fbe644785d1442025a795201dbb60c8ea89e17bb7f4734d9d299a7bebc8141ec997ae6c7ace9a0d7f7f934c72c719a94264e6ae7bdafd87831edd4de001f6a6f3c62864fb7b9636bc2dba8fb69cce53b5560a67faca9164414e2df5189fed0426f18761248fef023d3c0fe763c9c603b9833aba2db16eddd8a15ec6ae960ab388437044feadf0bd5ada03a7986b60e127ac99f2f2f9942a489bafdc340eddfc7487a6c3b7a87976cf6c540c4ab4d3f056f7441ddd81c08668b0a074b8117deda47a42204134a598ec15ed3e49735093dfd3a29c3177e24915fe1a650c1bd801036ff41d7baeb0cd64d4378a47fc56f9182da1c75a5229934ff80742a4b01c7bd443f9b9bca9ad4b38d693b86c15648bb29c74705f5cae1f360a6ad49c99cbd434f6e05da748d3adce522079017baf0ca3fa5bb20fc83755f8d755cb8b8cd78d2d8a803e3f134bd6e343036a64732fc08702094bb7c69d0518d60fc239da90fbcdc45e89cfcd05291afc8e266de3e20e0a52325226539f1a8d576c372e759ee78f78615d3c1b14add56846dc4c680eb4097f0dde6783135abeecf8ec0ad4d4cd141f8ee517f2abdd11d745e380727d5932395a97010317b428349df5e750a1ea8dab31eab93de6df62f8cb9b469006253cc91d2b001eeeb67412f434e81c9c00ce486160da0dadd512b945e6980ed1e56870d2faed534e1fa311f68c305c60295e03b1104a0be7cf7ade7ae45192d6259238806f2d9cde03be5d03ee6eb013e6d2773635786d9d85d8b70e4f23f71e79ce7a034cd6cd8c130db3147bb2f1b9788179f7d648d13425e5b65b33ae4dec686c742da71e61dfa0e9ec3859226f7517cea9479ea66fd00565158856b5cdeb8e3923d44671c05944f08c027e9a3e0ced3886d8003891d40ff71e114c46e741e679639ef4451a7cf399197fd1b9b3704e96c740c8fb9b0e73adf3e9d84d6c2bba871f3db464127dc6b7e8e8d87d65ffc23c7434f7371af125f67df4b85f1be53824939dd1a047ca897b1bf5a8f0b56ee84c5b12a3efa5dc4506da3c6ade2b2dee80993aee3a9d9c70ce7e631608e81f16185244150d5d6c6bd6f483b6279c5eb005f2d208b93a9e263a2221eb64cd4c58ec5fa6fbbc7fdd1fb4a7e75ce963163229e9d2e2190f06f63f73250653c0bcdb18400ef4481324629da9b29b3dbe5cd035aba49fb12e26ca43724ab2d7040c246b06be8eddf1ab1e801279f6c4cc1b9e4995b802c63ee33b885120b1c35e41a91ce3b8b8a62cf2957d12e7226fcc1e6bb63a0fd7eaceb4a912c30f32a498b4574e19aba24a803f91eb9e980d4f792fce5ece14e7018ae505751c97a4ba96c39e74283c8cc182d6848d7b9f22c219cf8d2a3567b1b43fcf360bf88da8f1881d97ba0b79f627fec952025f4a956f649afc0e299aeba8bb256606c244b6da2030864608847ffb384b86bc889f6beae6d33a046722f5ca1d4ecd2ee9a28d92951c6ee25243580306c321c3719f13ae2e14d69e395f8e049ec339926f382f9a8c3e103c8043bd2b9ea835244f686db62604bc86257fb595d62e1b2b3d61d6848ddad1cbd9741c88bf728182fa164b74f23d0028a56800b892dc49f486677596c294b7ec900d5d2605c8545a9b4e19e7dca2aa245b580c33e2b1227f69ac3acc7d5d8426b4777f03bbf5a21cd940874bb09624486f51119d0445c2530fe2c1e97227c277aaf9e847966925833d78862a37990087d24e6bfd55e4ca80c3642bc0aff4bf577a8476b4a9d6c88599b2c7e932efe894a16ab387b6da8b69412a9ab5c5634048fb1aa3df60c3c2e56d39e27ecec38e2507d5056dbf15407e849ca1565e4e63ced4a3e026d5b9e1f36c4b77d0eda26d19f0aab29afa42513b5eb209bd542d598c9505ea140a7c518221971d2eac7aae166ce50765cd83795e0d64d0e24882dab4627c8befe5cdd456ddd0e721e08cbea589922e65d5749b48827de4d74aed8792c1b4fb7a8b3204851a22d8f018ba47105de64cd79342bc8c7db7f6cde64dd8482d493eb6f0d8703ebe67e7ad4b38a2ee6866dcadcaac3bc5632a4194845b7dccffe256b098b23a946eaf2aa8b294284dad006037ccb55abca6c4dd19f58cdbeadb0e38a746479834fd50b49aec082344e4a7d32c8d13a2471c14c3f5dc1d7d1b791671a47cfb92e6f9bb51aa803127df309c089cabba0563e42fbaa081c626285fca90d8f2d66adadbd3f40a788a210960ef749ee9d9275610b6db1bcd16c4b894f8adb2b1cf03f3269590f7cf113bd5ce12832a3012378aceab364ffdfd48e9e71cb934029d537328bf67469850f3a21386547006c4b90cbe31976898d8b0d2476f106cda0dcd84b25c5c918e460f4caacc12233c2eb90f0db75ae697f0fa5b329709c7272a79e1fa4da6fb2e607e96ba69933ef3c17e73df7d49db499a52999909b75b14c71a5a99368c77f72554ef990081dc080bc66c67b0518c32e0d53898c370f5b390ad9a621a8d7825a20155f9078197ed216e34fb953c685638b02f90c623b38e95f9eb2f204bab7a3157e2315f9bc34422c0f6c2adf7d728875eb052cdf8b8466cbf1418b23f257ac007d7392c3bc10520ef9d4d9540de9c5278ad219dab47fd2515f7573ab60df44d5f0c877b8027747db7f6215de6016fc6bcdecb63588d1ba14e39d58b127256750c07885b800069f86a3a4e6aae05ca790ad995160648d2427c1548be800dd2337a20f09b5c9fe18a327f41a61c91bf4dc0055bb83fb3f6145bf218134aa53fc18402b8df3f90631fa2a0c8f463acb5fd5e4c0b0376b65591e9868127f7275bc994cf8909fc927998a4e1aaa9818d4110adc19a3c1da13a51b619d654c40b924b72812ea6a8a8dc467f990d1f31c3ef30d0bd359ffaf7dc5d66a98ef3f4b887e96e364e807a34e057c6d60e5f2577060c019c998a8d3d45a9ebb8cc06749245f6da7309153751e1b6fcf817f67f6206001f539d05f5d6ff163fb6fb5ee7b53fd74ce4ca5188a76ba72171665538c457430e013e7110810cf02ad8855442297b1f2adcf584065dba0216bf60bf6e142f2eb6a1742b9f78d83285e95e6d985974160af989073ec96d428b0d51c3043f262c53b2f87c8ba8ce53e911bcf30c28bf4ef2a19ef5c3fbfcd808c69de91a077e183a2e5dfce60278590123a4fa38483e80fa6e21a4f374c9be3962053b11044570a70edde2ba6d0f1d59371484881acc708ced3345a334691fcadec490d09914dcacddcf2441f83c95a70b3be3952b2f1463af3661705d8b6cca25dd6a5e83fa8f62b9a25dd4c18cb623b5bc1ae897292df989a797ab206f6e6526aadae69395980c156878dafb980514fdeeaabfa8f6e30970189dc966ba2aa1b3d86cb6e65ae2fae8dd45b4fba2fabb45fcf33b8ba81238601ebd7989289b7b02c8d3210938900e6c6b87a43720af64df591198b246ba533257bf7c2c33c2dfdc3efaaf1ac045bad8e2d522b66bd70e979faf4c42856332f67edc288fcdb994908fce0f8c6fadb2522e97d91445d2003e0dd6e41dde63bd082f76d014cc24f50f3711fa1594e1453c61d3bcd5d3502b088ffedc4c71fc9d44d81fb9abbb5e27ab036711629ee96b5bd9bf1ae6ead20611937b6d5a849ee441e0edfdc2001a67d15ca85cf7e1481eb2f984e6ac1ad5d6decbb2655c1825982d9bbf5a6884feda079c23dbab5a7c7b28582ebd672ba12c8d5fcb6c413646f3f8a9c530ee0f9dce080cd49c9cc0def8928817ec08765a37dc1f6ba2cf4bd1346172c779ef3012ed0fb9ee26039c7dc04c32a01452ec7157ebdfe80549e17961523a0bf401849131d86915c84e28502caad645d2c444cc0b2709e83275fe29414ce1971634746fc4f9682f06527d94d9c06ca3762ef1f3d965780741c870ea8d6a8acd31515407fa8aae0cdfad39f460c971e4a2c7c7276321163070611fa0a0ccfcec47a811b20a00590e2ce5b42438c7f9cc3998591100129ad74142f1e1ce018110981780d2b928b10d9dca871f8050b0507d7efc305e12e101c450c8f606c761e4d6cd38c0051dd2416d72e7d58fb88a13e968c240aa16fff617154add0042729c7ebfef1070782cbee3388dec3697f0ce519f07c0b71820b227291c0d41494644af1805e8ff08349593e78256983f669b8d727d3d2a42db853ebb9a632d1b688fc44681c2c9e812b5f09114beeff037c72c7f4f438314940c61eb2c2e03f433134d6e7eaa84341cd86c96811adce338b54b6db2a45b6cb6c6cb8bd7730cae480c873a94230e88b055cd04e411dc3f88d400e835d276d49637dcfe9e991342f8124aea8a06d79abd81e0a926c9980863a05b42583ff35bd6c5308152071d1e3539c00b528f8ff136b74ad0c9b179d69b148924289de496206791a2a03f2e390000ccc9fbacaf355935b4989baf8fdadbe831963af4cc539727b89824e4b8bdb8f6d02f3fc5156277dcda27efd7f60c12e4111cb37c257400b0f25806ea31f91956f1cb73e7fd4ad41dd17d40a42bfbd8e6f0a9f6c09d45451af467f8159a47de2745aaf6193c7dc1998f0b4c99a5c5d6ded529cac189e70b21bc23b56fb68d2cd363713326fe5dd8f9eb603aca8b31964dc44e2e6f6735e827b041c8927e74a579895ff0a2affe224271210e36ad7b2a10b1eb090b5f096c41a7a69bf30c12b1117adc2b6f5eb1b0eed1aee8a83ce82c028a604e947a951ef5db31e6ab61696099bc77f29feb128d0c03963d96e1e26e919a6921543753db54a9c996509946a29f058a2c4b43930b8f705902f3f3e0a6bea3bd8125e718d08615d98369bb91857a64aa48f2afabe117dc8138ec8814f5afbbf6024a1390ca610aed00780e4e44913c12b4e02d45c25ec853c36d3afa51260cb6191a08bb90ac8deb6ec3f672688a20ae4d7a62befdbf43935aa6706387f3903583543cf610fdbb6c6338fd43fe0327a9267b6308ce3d64c29162081f4255fabc64ce10b58212b1d185388ffe1bed5d130859cd4f621da9a06e2976947d286bf919ebea4a0be54eb61d7739bc0245b26c731c7e58f4a8d6eea20f6de3bcd05f9cc47a848cbe40eccc95cd43ab99dfa00d7442ef0a17c68d5dd80f643908b36b1dbd55368ac85e05b2dad534a16bd3c83d43ae01551c42e58e6d11c90ae4d0d2505a1610a66af5ac855a51d3216eb1d570a61bb11a5052a3e5622a6d47d4d1c985684ccfd27788153528f2ee461c3bb73d904a0c45c89fd8ead3569c65ce89374070588ca007594db90b9ad7d20098a4a501a89beb730e0e0af911f65ddb8b254855160f2cadc26f7d1fdb292306201445a0a180581affd2910f279ec38fb07bd5b1224660e9fb60bb6af7006fb521212f742aeda4350c4f27959aabf5cc6cdf0c27d95ff85cfaca4834f9d0adceac380ce8d9ff546e150108038279ed1b4a6de61a67e99e638b820f6681a2af569658ae860cdfd4397716b6c5ce59a84acc1d0553514dbb8b8a0fcfa0133d384ad8ec4cdc60edeba54c2779ef490cdbf73f2826474a75b540452284782a0fa18e941922bcd7d945f38df3ae88886ec68017a72eca77d8b689d70070a44d8913c864fa00838298613137d408fb8b607adcfbab1623b96876b0c9631efcaee79e5120d9fa7708e771cee2f572ff3879e0a3719a840251418a8325ab00f7be85bcc8f9c4b978f28ed1b7c989c09417c9515fc67d3245470b2ce0cf526a1aed41824914df193388ac74236b979878229aaa2600cbfbbee0f451d0e5159654222a8280e1b6c6a02e73b5f19c28bbde2d6e3f5b6386b6a2eb2ede89d86c5a925d9a8cbf531d3ffc5a6a14f7be837d1ce917dc6f2d9030184816883384d393812f3a959a493a77c448f06a57a62b85467302d93f2a6f00aa8d1c0d7610008d133016d1c7487c226b521e40546c290b2ea436b56c218854c898a894461648062998b837b1a0b804ffe079f9e1279b5d1d900b57eb1604adeaba520f42e639c2153568c2ced6614568cd71e32a58f3f946a3597897b450486d99850ffc1f3e2fc46036d439af5423713f5cf274225bfe15fad0fb2ba48924364ea42480c023842af652fbc8b6bc210d693d00a6fa8e0492a490702496ebceb56585e6ef9fa93e1d4e39701eefbc9a6f3122084650a8c019632e2644c4193031897ac91549730b98db696570e10242b04a2d33a29420a35e0d7738684861f0f5bec23cd64f222d3c7fc726882eea28b768914c74cbd2bcc5a3cd1f9865adad1c4a45a189bc4ce3cfa4df0d39ac9887d80b352727882dad4b842b106d2ffb003d3bdf159b030c6598f713ec7422e6cd0a26b69b1c52c20680d7d11c0de647842328512880ccd9c076ed969f1870c706ea17548b7a25db15151ab4ce22f7bc2a9f26580006adcecf9040f9664a71706c6d158cb067e086abadd5cb754da93ab3a51ad013532c84d8d198ef887fb58cd5174dbb996a0627bf3f0549109fd18060b242040b19679fc80d32a0f3bab83eee527b1c231ea02596f027c33da42c1b1143ff199f793d067e73c1056eb12137e1ba530df963ba2042cac27c1ddd8855d155c1e74f52841e761576b158b34d1753c0da6882fe769fa1d8055306ee078c8ea62323c19c37dc740ae528960d76d62ec0d914115df95ef34343d842642d0c8de2385d382f5f6f4151ddf7ac001002c14ba586e51e8224c31786f65bad82b7a66005e726d4c41bfb3d06a4a69a8f383e628d10c94e8911378ea6734dbcfbd10e51c90abb25e669315094ee68b3c0519aa3ff1d81730a793a910ba02ea1679b76a713623011ad0092c933fe6924234c8df402172698954ffed0358b7036efd2c3f31de8c3a0c840f0eedc280dc292228f592878cb2df444697a696a0f48d72640ed6ffe1c927c78c3a2cb4d8e69d3a14827d408dd8a3032a63bde63e33b410ea11922b64fa45a634d08ef2209921224afcfe8f9b814670128a8535a8f9a026c3c1471d804fadfaa833d8d89c2b24034797342c4b1ba8ca3d0d14d617067ab4e467a4a50ef355a0c16f6c98e523380f22b5e22ba6933661482c47db5ebf70d0002445f10e22be6d0f767ae9bd01f8e4f18dc0ee75625bddf809b1879a3357a908b8ba93f771f3b7071fe47b451805af054e18de119f17243c77d99d9c0f8cdf28b752cb93cea820e70fa829d04a433f4c4cc0270c64db6b83bf607c14d9b16c7c22375b992fb23688026c405852e2344527de8b87925101f60873a472d4dac0584ca4943dfd19b5fb8daffa92eab5915082eccc28e4accd85c6b62e64b1bf67dc2ad52304b6a672b770c9e16c9481da9f2d0587b8631fa4199d96d1c52aae6482d80781970416007a7c029561937a3e9bb3e13d9bef41c4b822b9b4f4e37d833ebe450541d7953edaaf594605351914a8c081c4146ebdc19e89db2500d495ce9b64b64c26b848267f2b47f72d98e2ca60266db58756c4eb46c6e0d89f5d691b0fbce1134ebed1aa222868e8fab38cb34587ee98c3b42c03935d76108d4509e2fe67539279cac13d4aae7d67d030badc925763093467c89a4101e918204fac6c79e4c104dcc91efaa0a39a8c5fbff700b68524993c02128c3cd58b931ac62c773d6eaea6c1e613eb9280bee13108d807563e181f4594e648be83ceafd651a6459f470d13ca5e4355a708c6192f10a68223ccf3d7760d82eccb06f1591b960b5d8fe7279edbf639b685a37f73a8ddc4f6dfb81471c5da1b297e4bb21d1459c11b6f9e34aab64a44491e46d61526fae139e0d88f127c8d91bdcb50a73b98a6cebb4be5cbfd194960704a600d361232470b76eeaf47de2aafc9190e7a112c7374c34cc0f824de0f5325eda020002740a11ac2ca98d8643232a402e3ce67a5c20790da1662570033d7a343301b9e9e64a32323f2219ca7280f729e76724957bddd8d6b23e5949418ff6c36d973ba4660ab72a0948186a74a06e7cddde1a0cc107fdf396f614b6580feede3bfb86ab75f57707ce7412e0fea217450b4c09ecd41c244b982120907527e7f5abef538de547ae7d426b5f5191f6bc59e34cb7f78dc8ead2eb671fe6866b50ceee81c9c91100e3594f84475dcdaa6fde1a4d56067afe228dc5bb0a5a4b3ec522328c9052eea12144c624b02ff68580fb4f6bc8223fc80570e9bd9f18f61014548e47a4f87f24031ea79bf11098e6eca045f28be8c3c5f58ebc27b79e232e2cec32883c377fcd65274baf86ae26227a6e6679ef4769ca29f175eb619f7697d29a0c7c742e414d0dcaabde8334b7dbb0f9e1458c55854a6f9f369b5a40771371afca36f906ff8dfaceb925fed0a37eb820a8116c7e16586bad47459fb5db55d85aa5a6566aa6d02ee9abbe842b69de7594f016042d36a1e4e3a93aa56e51ce4f6e0d5c4a530635bed125f5b9f332537da2b7b5f6c5d66e34471f33aad5004712d09365f0199e2aa820f4613e09707787f41c9f020ba8dfdb71549a60a4bd7fd353032ad9074dd1f02828c2f8746ce7a15c6971726a78a3d6ddca8e615db417cab8c60d5542949840dee9c12fd5b03bdfa70d9434579621a4f341e419d000793e514d3ac82583eee180e8364c6b9ce1aa9901b513f7112cfa9701d91b247e4ba8e66d8df455eac1eb95b1523165c6cc76ce858782d9b19b27d3c1778b7634cec59717b784be23f2dc591df4391e920fdfc02fd0fab076837d14016861902a2bbbfa5e230b31d6c37bddb62a8ffa9adc8035a1dc563f7bd9b1aa8dfb29a09c9f16cc5b247aa113f58814e40e8bec2c5e2d58c4b80505deeca0f7f9834a96da26761ae9db4b2517e7101485fcdc3a1df6f09349ff14a68ef7ddee90a21f6cd683b1c38c9c671e20319c9325d4a3a762809d0b90edf31c5966c4ac8dd051c066da30a81788d9f75e5db9fbdd17784ad055160a181392fc4e2664f43ca04180e989f3c58cee90181821d436a286deef75c239b0690d5b93169e5c1037665143e5ffb3f9ad39120d388daf06b91a45e33ba1f82d1d21ce548490c5c395e89ff2884317acb39b3a5d6a1cac8855576d680d84e7682ffeaacf73adc28a6aaedede99e52e5db1c83b3e6184f24fc873feea82a8a72140f5c55448877f693d9f2479be016cb9cb3cdb3d276081b572c9cf694d26738e2777e366d29859df5a1d2458f55626c6ee7730652a149831f54650e60e6bb6e257626bec0cfcd445cc104d863f0e11ad37a0814dc9af842bf66d79b8ff31b1c1747c329581a3ee490f364882144708978eca2cf54e00a90e9f8526128471d453982936dca4ae61ff6012110590edc75cf4d213e03cf5db2ecf7c374b305a64d5a4b8969324e79408971c1f7dd8ccc70824206d7a5fafc18c4484851911e21d72fc7bc369fd613632f2066f6552f06b08544fada6a5019796603223cd8a6dd7d8eac000d67a0f7d910baccde08cfba1c7f4c91e2a98fabbc37c0f60b2687e1486cd321668769f4056486c374ce682bab0c1cf924808bd6dc9d7ad55c1c379bf268c035c807280c907c969f116c5cd2032a8f2a835a309a15a903b999c6dcb53c4ecd63b9ce0df31b75cd9af703b44360461bb311bb205afe39ad47dedeffa627a6be329377003030360261d43489fd5447e57b806a4d445ad02f20f3c8c9051d95ba0fb2559ea4dbee267bcb94520a030822081e081dc3152828a70e45851f486514c94d5ffa6d98caa7cc16144555220add6695a84ac57a95964dbcbd6629439ef751e0e61cce59b930ef19f6f5cfcc9beaf6b7d0f7d7607fa1ae79b4bb83463a5d91f0e5157e4867b8a20a81200882e0ecc1e41a0a85c06b2847a1ddd7be442291177a0e79629190be4274baeaf55adc119ac038e246e5b9dc0e0f813f3ffce33770e4d05103a752cde93f3b4434e7800780efbf8347c744ef64870fc9e576386063fc835beeb6c34ba2e3a202ced66e3fb79fdb8f6a48ad6d3b3751c8b5a64972fd3b18d72c512a944b8d44a1fd700cdec606e9bcb9833ffac4906b37b59aab64f778bf021f8801be079be520ed24e08f7d03430adeb876e3da8d6b37aef18d592ba94fdd4c2a9a14d1a4491324dc346131a283c48811234c9ae5dd3dcdd3399e6e5be536c2bfe1eaf44068a2ff9a0f43d37f1fb629f51fad39d1453dbf49ac216b128de94fa937d5a03ee55be553684dea513fca52241a22d1382ba350298fa2a63fd11a9537a54edfd798fe84fa14ad393d8abe7f2aac9457b154bdae705de12f4934a56022dff19c0eeadc3f8952908ea88845d9d3b00cb0bc2606891e5c26be17fdb7b3113ff8e07f08f20eb86d8461beea7e427df5fb3ed5871bbee9446d9850946f7469e1f3a344741584e94f6f434505456d58aeaf85aa450bd577da14cde95129d1dba0de947a151e726a21a2525e4469529ff234a64fa1ebadd48f6c4389e1f676ea4f2f4a21ad8248fde969527fa29364a2364c7c6f637ad48ffe3da6426d4eaff26c7ad4d3981ec5a239bd0a7d37fd29455c7d0f849612519ffa032c2d456b765020b45f1a8a16c15fa0997edc1c0d1a8ee0b7aef04593b84e479d112826a9876631a53af823b173e1e819a86118d2af811e20128de8ea87d17fef8348f4de7f22117ca6015224cde2125d240dfb768280723fb7fad51c1f6123cd3212c313928b908523758b9005222fea16010b5ba8cc43a2c1e26263ecaa8ef3987fc83e43ddf33c8f799e6f2d1efc6f632a0fd2b1ffa3ccd3d3ef51ee115544128f17f38ccc730373ee4f752a120fe999a761a37ca2fa8fafaab2faa16b84c87448e4fa7d7356d2cd0de9866fc6579d9e3be987d015cb37a15c6d21daa8bec5ab88364cd0a86c443c21111643c671a129038e3c95f7279152502614efaba44fd1f143d17156d29f28e9271dbf92be44c76755129d31bc7f0e8fa9b4f811e509e9b73c30a85a809479d695c554f916ffddf8dbc081f1ababbcea6954284d8b6d7d7486722d441591d44328573d8f7d34679ed31025640704d5a6258c339d38f1e1635df23b249c78de77abd02a34b2d6e4795e48dc75f99b44bef196fc29fad859e947c7840cf91b90982d23c075f4b29d915e7e0eeb854f1265eb928f52923bd62573589c4b951f1d5955ae0e4e45c87a30629cce896f656565e5064d0e4833e3b1efc3ad2431f9a50c0b4381afceb0330aa856be63a5f7d06845be649ef14e8aafd993c93f1312b7be9c4547f9d24b145afaf685a363eecccf3beb9ee9e883c5d4a806337c21e494e9d023fd007a2391691e01fe028b243a8a007fa1f277747d705dad74f79ff1bfe11fb258a4f49fc74a74a65b8e9b344fe6e23a914813fa8fce34cb6f34cb4337be6fce1b3334334d7323e4cddc6059e1950f873bf3e7dba3822ae9e26614bcc9bb54ca0fc97cdf8fbe66f928ab8fbe1c9ccc51e254aa4e0a21a90faf12489d2e059b80e6b3bc983ee13eeade0b7da4b09dc763ac50446b4c7aaae3de6e3506b0317641ce2da7c6ec04b3c116638c9854a8557f956ace1c1e55d004ea2139ebf2494bbf3f9cd33953b4618af9de2a328d4cf14311676eb20ee748618a1e7c1758cc915d443ff0552a1ae6d80dcaf1f3e32c15692e4f93826822dd03a9441a06be01788921a2d86ac99091431df7677f6a786c836e5fed1c6f0599200d3d695610893dc63715cfcbb6d240284408b70053c6b20c70f6a95ad5aa9651655b6357cca5fd2853ad775e47590577a8645e0f24114d601cd13c3efcee8c1c3718c7b71739735c1f05eca0face38f41ff82e7a042c8c0cbbf89bdeff87c7509ff2fe3d2f244788a47e0673bd018a39aae3f67c34bcef26d118fd8c9d9592308e6f23712472e9c11f5f15e551eafeb03be9c3118f4c27d3b7a0ab0870e575f1cbeafc1693b6789bd4aba88d16af7a15b5417d0bbab4111dfb866730cc27eb99e3fa7c504c521db7876fab1f58f429aa4f799516afd2e25578900cc07435001e270c67b22845a0eaa36b6f8b4a02347cd8fa91be75716f97469b1a5202f08fbe34ead1a4ab1fe687efc3a4dbac17f825117cde018ed8d5397034db7e78cbdf24aa88ebade9315ea265180601ebe2dfc342f23ad24414b0aefa993c530e606e93ff0352ea1216ee3dee3d38b723477670471ac6497c788edc7c5c704a72401d08b66076ff85bcef7ee45b16b36f37b71b3c309989919c4e489cc7857059ba3985c51cf926b4953fe0a250e5dfdfae3628ca4fdc11f8051944e6278b843b3e42f5e39bbee99b1f3ebacd62ad244da9b4303b0a63c4e4c10947a350c7ba1c26373d9188c2c0607a52fe4a26001121a594524a29a5944da494127492645df25944d525c923809ae03ed20dd43115ecb591ee6e23bc2321e935f11ef4be0ffc5eb49df48c64d102842cb248220737b2a7a787831aa8590d3404c8494b23eccc4bb08e821b2c4cf4c4c294e04c3802c3a8de5f2ad9598bf7f7112cccf7fe3e6467e0fbcb1d8fadfcb39cb0b11c168eea66daa650dd87613808141b639bb756b0310e32850de736c819d2d33564eee9317d23504c799468fa93383f14515e2496de1bfd27a69e7bdc5b6aaafa3b91ef63560d8f7150fe3e54f501ebf2188f6ef98f46360d5362be8df7a1b7f91efc7e1b211aefbfb701fee74d6104125b28428d69b4bef5f0d89eca2f4d4c665ac4fb1d1efdbedcf6c860b14be8d800c8c7e746f7f0d1944750eab9e6126542b9f1aa7255e5739086f97b49f4f98d1fde92cf35dea952f67a95e8c8628de8f82a19d411c9e2882c6088004a02644a0248060c54c3881123dd72c946d6e546baeee56f6c69dd15aa69023736d37546fc391792dec668f4a411e96d461fd255471227900c0b735ca0872d99a2f16f406276cfccc33ae8210e619c08a8f60ad38f33907713fef4102244080a110c23c22107260dfb64ae1b603ef663e754193ffbb167e2d260c4a5c910977683b8b4185b5d2c645dfe455c5ea66f80629aeac84284ecacf4f2b0279d6a48787ce74fff226716e185ca0d2b354c48c352de631c869fb08b0d2eef3ac83c50cb8f3de4f5b8945781a1d62c77df99313c0c313c0c5e6d676ef3d68b67b5f8f5180dbf1e8067f1f5d1efdcf91026ae54bfc303a1bd882b954a456960bf03ad7179d8d7bc542dba0a6287e7e16976687d4dcb5755dfa2eb2dd503a1a9e82a025c55efbd4cc3c4beb9ed85cd87e4f8d340c7af8ede051d3f163a7e757e00e8523ace50c317e938c3cf4047150064a03b2b2b5a821903f52030d07ea2f2f84b63776d2482a24a4a8bf8f236883bfc4b84bd8bc8830e3060c0d0e15d688d0dafc3d7b43c8c0742931157fc2e0f845f4f53c3bf9eff25f32eb4c6e565bee6f5353c901651006f8338e35f22ed5dc4fa293f8387074213c0cbc39e1fb6c3f3406b6cf81dbea6e55f1e08add60742a3c19e87a7813d0fcfcf03ad6182290d0f5f698dcbf3f035af873d10da9238466c9d1622b6ad3b880e62f320f60e62d70003f622b6cf1386e921d6c51fa816f1a43a0c71693a884b63b196c42f465c1aa3e889b2121bc47dbdcbdb20aec2ff16f1e5610fa33593befcd25c7efc17faa25172115f620823aec287bd0d3f1357215d05f1f2afb7017b1bfee55f6f12573f84ab01781f7e380155f5a1aae17bee0fa482b5eeee186248305f1ef62edff2a3b7b8882f0ffb51d622aebcbfe1e2f22d7f80a5cdb8fcd2602ee12fede5c7bdd51d8ff1ade5fd9dc76335bccf0a135f4419228cbf41ac61c6e5651a46649e89314c629118df2e3f3c069b2dae8ff1e3ac3fbce52398cbe720aab6c5ae12fdc42f06a3eb2dc781aeb748540eb12e7f91d844b04b10b15bc4d6e95c0d62bbc4de11db06b161c490f17333c4455c5a0c71692e71692de2d260d41f1e5b5a0de2d242e25797e4830f1e4c7c05e445c7b044187e3765cc6429e73c190c4cb6b3fdee6364befb1daa1c16e6856b78ccc5777fc3632fbefb1e1e6bb57cd72dee876d22f8eaba6675b29d997a9449b633d377cf358fc5f8eeb77b12fdf598ebe70c323c007e57e57755bf1bc3ea577e3b949c8731c4d5e95fbf3497b83ad15510ae77791b31fe15e35d62bc8d7cd72f2d00eff24b3b0580ae8278bdcbdb78bd8bcbdbf4bfe87aebf4365cfef52f6ac3ef429776a2ab08703d753fb28f4d0c97c83b54a4b27575ddb34fb733dc0040c7afa2ecce50f757749c818eaa1634a57b5309668af29166758fa26c647684b9cd32757f3299e818fef75ba738b24d0814b1d4ddf07855906bab861a6a68b55a35fcd25a60c080d1d2d2f236f261fcd2167c1734d040830b7e17fc2edea69f865fda0b71b51fe397c61259ef7a1b2f3ec68b77bd781bf9ac651177cc68115b620f6f75ff42bce1adee5d8835bc5543f734882a86c9615dbaef7ebbef5e6a576b1097d61297c61297f6425c1a0de2d25c6c5d712bcb52d9baba0f7530b7b9242033f4080837b579f0086293ddff2267c63e21df2a2f7f26f56dfa3ebdcf0e0fe7d0523cd655fa9468fa1c0dfbf02515bd0452c3efe7d163f4a7efb731fad3a71ee5b95f8a312498a9f9238f7e9c55fe8b24ae24158286f4f30fb03416ad21d126fdd24624d12f2dc54408f5a3eff93de3a58422e778886de9076d429a7dbcd56f12f9c638fda57e92d89475bcd5cfd3d159c76552fb675a52aeadabdf2910339a05739bfd2110518329685204b838c761248c0409c3b4ad1ba813db49d79da0a9808393483a1c6cacadd0408ca4819030929d956a0f3f98be847f00e7b8dace36053b133d88c3e15c34992323a9ded151b3bc81c649477469a3aafb8e8e6c80ef43df89a4ea646507350b685685e951d944a7926284f3e1845d8a8747e61bc6e24a0c27ccae21b3cd729997c2f4eafef7f2b7157255618678c6f7fc3a1a1692717161f6efacae4bbe7c710755ca1f658c2d991dcd923ca88e66b9aa30f9e587688c9de9df74d9a599aebed50f2c51a0981e55cd8f05d3ab65d192443bf362c0fdc7ce50321542799cb2a359fe2891470f1f37523ffdf29afb500a539487e404dd04dd04fda8c0c638091b2484897aaf757680fa06a806749373837333e4e6934ab9f1015a1294f249adc8a01595d49294ca8f0fcac70745551e0af5a81fa7d742be115b4364e0e49073737373f3add68dd776346c857a20156580d2a37228ca3eeb72cfc6436a3ca45dc8ce038302401a711236e643d47cbce6d343a9a2641d985b534c3f7a6d1544caa77e3e8dca7fde9a1f8a3c1ba698ae3ab24f127c76167abf11c18a6087d8b0d9db4b4552ef241b4d4bd1126926f5f37251fd5d48c3405ebf413dca83a20b2bccd16b283afa10da10736c20ae282066c10fae89482ea8986ed3f120ed427e3ce64184805e2332c70d8af1c00c6a25cd3abd7ffb346cab575d2c618eee411a36b692eaf3fdbff92152104d5b6f4dd3ba623c314f0d33bd7f3847364c3159bc9dbd14a25ef49fabfc4fa2499ca24a49e4243746b26324a7596e5b97d772c841868c564b146180816f82685a8a7acdc76b3e32690a0f7a604dd8a1d71d61b3ad2d7c1bf0c370f4a2b70957418c5ef43646a30747741b87918d2cb12e5af84dc9449ad538d6e54b9a49a008acd12c97d130c838cdeaa79931691145e1e948d5cfcfcf8fe879c54b6af71de7d919a97fe5ad3ceadd947ef423eab6913df724eee34afad62c7fdfa1854cfda39cfbf19d919d9084709d66b1fcc8ba9c8376c64deccc098609bd3fb313930a3c1df9c40bd5aabf0c0707c7713c8043a41da783dc88b4499bbc911f685815a44dc88db4b9f87121ec51696b96bc9136eadfe738de02e58d4d88b4499b14d230ef69843c4fda5adeb8ac35cb3da85936fe5106b16dcbfffb7096a9b4a9200691e9bf429a55f3c1451673f4a0204f6290b666791532543047af79cd63d2d62dff4fda88c4c062f617249d7475749c06f2008eb45569933712a70b5e60185e6279f847665d54b08bff1276d67509ebeae44ba836e202aea76786ec99e163aaf275c82018f86821192db42b882208a7baccc33bdc7276ff9887e0210e85fa08d09350b3333387a458aabce38cc43f47b31cc6dfa16f1d3b60de02854278cf22ff954804c600e7ee7e0492eaeeeede2230140a85421f1d5fd4b18347b35605c587c3c99e1e1a1b73e11242f51725cc52fd71e4d041a3093354aae128071571ac4f1dfd483ea93edc6677241aa2efaee1ba30c21cfd481c53e1b2af9746a367d28f6ade8724ea43002f87e8060e90cac84274e58d989d7cc1e8eb913a2de5f7873c24ce79676732b8e7d679673165edc183e45679a759f27b1cd9384566477178eccc7bf910d818a760998c33051be31aece0789477d6255f002b98de7b8948c7a44719c9c8467092ccee19c9ce78e7fb6a3233ee930593518e214c6e1812cc51953a42baa64a922449eec78aedbc23fdd0217757474ee29e0f32891195a561ab1fbaefef28cb4a1545ad8eaa286a285030333b2901b8f9bd5e1a6b6a475f8a54d7a40e9ac098429326308ec8e5c03acafdecac55656d47799d9b5aeaba99cf6c1c9cd0df20a178f36da0fca4286f63daa0fa44571ecadf40d195478ba47e6928ef3fd0c6e84def899d1884e84b567c36d386099a4957dde86d50e8aaa3ab107d115d7574c68484d9b91f181f8c7eec5ac7a47f3a37a198303f9863f300e00693c7bfade877ff610105fde41a07e89b38d56bf8ee8c9bd8a5d1025526e6a55952bc8440422d9202e587c76bca4aa4125ee2f9841d4a9e9d9572a862f6ab76c6fb4357cfebf7786e1822437fe3a337b6e651d54c8a9f208e136ef7d766f772a6542ba3df85616117ffd1872c2698234bc606b1ac9d9dc0ea9ec3978459c5b851a88e8222963e518ef1eb56d2ef6ef82cfeee2e7f91b862826276b2049d07dc0a2b7420605ddeb51fafea1fe8d876b7f0103b23c27b96bdb133a6bbae9766758cd5adfe959621e0c5e23aacb082d5b2f2ddbc550703365681202bacf8a16a966a45a20f454c8c936566ccbc6408d859f750aa3a9697bdc414012d2c506001fa9cf8763063c02a254a68e42aa169993025e6f7e083629050be84c4185146fc95211f1431f0d1c0178936190da4e24a398075c92b6647576650f8692dfc7c4a942801ca3161261de31ce44089bb8faaefd8d59f5ce8a35934629ab554d6accfa5c894cfdfbb0bd1364072748c6bddf2675bd77c1f7effb84f70ecac546be042df620f1fddf2f0bfa72f0aa92af4a32af4535628660f1f1358980ecbf20771b2961b17f070bbdf3cda3c3db2ce3bbe428bcece4ab58d541d9c66b9bb4e7700d1c3f0e1b649feaa647ab7a261a3af4ab487ae25f9fed3b0aebe55d47c07c911aabff7f8ad6341c21b0e54a161dcd3b053f5f7250d5b254282547fcf75c9241d47089155c20124554e51fda59432066eba8e7f0aea656ebf924ee9b7247ea5671cf9eb47765c470b33c4b91c93d3a73e75a2cc44f2ca52911856bff25e935d11196c344d065a73015a0c38f3d7514a3addf237fdf8c9c74129c1b0c48ae8abced546afa223159aa2272a713ce63a9fcee83f9da8337aae7ecdd2e1e9683150c779cb5f4608e6474759c75ea2717a837a27288b197272aa7c854e32112d2d1a858998894394e158b284712c097c1c53964661d88370cee97d4cc31c7c955f1cb835c4b1805d32c406f5296f93fa16dfe2536fd3e2532f9bd534a816bfa84f791ba84f51d11a2668bc6523f52d5452a88a65fad39f3ef49fd975dc25530c3b5034f9401a00e941facd3af980f2e00904c193898e3c514a23bae3575b081fb30710100ffc8932313568c884303bfad2d202521172ccbafcebe1f6dcc38cbdb1339759fd75c09408f22bc3bd0f7954dc96bbaabb546f55ff989df57eccbafc25cf98a48ed0d3d3d3addc6627f210957bdc5bd59ffdfbaec1b0aad17baa35a4fb8621b38d20e4871e6daaa81ede306486aae8c3a711fdc8043d3742badeba0152ae79cbab1d554521c5a893a254b78198a9d12cd5eae858cb776b268803ecac7b61d99947775daa66f56ce5e547963aaa3a99ca5b5f4d57cca620910897657c761726e63e5724735c592932b736f9770647944a22981ea284c2df1225ecd3ac6625b5db6f3ce67dff529824e67ec73f48902a83b3dd67d28ad3919c5de1b6822960986819ccb850821ac8a045f612f31213f3227b7991c578bfc4bc583c2f4a64e3b83ecbdcccdccc041e511824ccfd511aa0b777b777bbb7bb7b7777bf6f6bd0af984ed6750bebbe6fce8ff232c770b77265968e5f79e628ab31fc3233f8fb54aa7e9631371da7ac7632e8468baae3a8ca4064cace0bfb8611cc147f9f1a551f89c6c7ac9a23194c399b62b2b45ca249114d601c2159f61ce1d20c9f5bceed66bbf1cfede64ee08e6471841225343c7614999db7c3631e7dd1c83010e62ad9c092ca435d251ab85525340d13821db02e01578089a2dbdded425e088b39a6bcceeb7c848ce8286654b8a360e0b5d7edb5d71d232323bb773b21b07e5db3a01e3460912cd5a59452ee0cb71ebc4a1424d1f1e133dc0b163849e2740339e33d0d55454ca9611759d1342df44d0bd19a0bd03cda5598219c05105cf066042e29b882655e184247786427c7c81238cbb61f4f7800e5b0826697e7f5c2c2523913c22dc0d481c6121d682d7508c291f5363585c9dfdc759decba6ebbed56ee3a7ff33e7f2f6c99f9a7e3c0902143d887f04b08e648ce8008c0c3237bf9efce9800240391d9141debe5257b71c7ddca5e2fafd78bec256b6181c2dc1f592abf70eedeeeeeeeee2e149c48ef3af99ebb479999ddd9797999bb95377048b9524ab952d2d57a1f80412247ea888f063323b04e9763e65c7773ce89178c1292254df14a4e6f1435068e1076665d0ca416f19ea6a379b4e602341a9cd08085c93fd342b3606558c1a294d0dddd323e98fc2ca5cb9ad57513e50bbd7643a707b002b30e22d8d58cf738d4aeae64cd621cea2cc7390f00c94e3edddddddd5d9905b9effbe217ff6f4cc68934d179eb75bf73bb4dd5a53c541548c5c2dcef13c8c0022230c5cd2f0605084394fdd6c5241a210d141e92e03347190324ccf13bc21c3f1918618ea301c8faad4b8928064598e347049d39ca21cc51e2e628a58842084960008320ccf103c21cbf1fccf1bbcd51faa00773943ce899a3ac0bc51cbf1de8608e1fcf1373fc723083394a1cc800494fb3f661dcea3e0c920f5c6f3047698317d460678632463cd0c0091e9a98282f241accfc1d77fc82c30d38e080830d325e2e315c2d3070a8a1c57a41830b161c0240451c1e07550b9594140e3878f30e606d3ada54a65f0e744862f2ba06baee97fa1193715590cc8f4aa93aaf25c5fdf1e3dc0d54b00b16a60993731d8a892923c25fbcdd8df9625e642f2fb298971826bfa1ae65c83bf75ddfdd755977f7cb8b112f2f3de1921f9f1d2447d6b57b03e484c7e26ab4ecd64277ee20bc8f841e1e1d6c33e4152054c11d58c27c7fff26f31b10f2d7ce52eb7a97f18568e75dcbeba5e5653b23c8ddf556c2dc1fe513ac8f555dbe4cbb20641e2d9510784501a6d65357c670cb4a6549750c26d3ac9e4a82292711bfcfee2f7edf0c8bb98cc5be6296eeeeee7abbbbbb3792f59ee5d1dddd5df984139d1198e5b36429992533b3941287052925483f6fb54ad67091c6259d696f77cffdbdbbbbbd1b881eb81f358b93524af91e9bc1fde31e84016e715d177064f5c9e4ef18998c4cc65b6f598c8cb74ca65f2ddd2293c9a0a8422693b99309e68252e029c247b1d0370ad17179644ffe5727cef0effb3e7797a9e12cf301d132199ee5f9f1b0c0f107f3d02e9dd13fbef8fbe4b4c2743ac3c2e41f257bc1bf5011f097f6f97e319e7773b3777777f78c1a40cc0062ad1875747b772bc1dd3bca6df577559e9490339f1cc9118bc5628de427e53792231a20a4fc4693e53129592cc9923fde12309859d10c3484f0db172f8c2fb53ff06fb2cde501a728c2d403e333ab42a5f27f7715abd2625e604030f9af8002a6042339bb420fac8fc58a7d26d8c1105660fee669c60c109e48336e129a07a23d8f3b0682866bc82cd0b84c7c48264024d9249d90f985c9f292458ae77127c1e423e0ea386befbe482d9f4367facd6fee4f8ef98dbe6f34bfc941f8863f20a5943287c7beefe7fb3c1a84cc2e26e0fa347ab48aad4f1694a0c48e143953f8d06a6a4dfc2c2187450690a0f5bf641e0b0d79339daed01415737f4c751de0ef474e922409b3a0b2346cb5cd72f93beb6af88fd3ef0b85de7b1fa4aca1a88ebe6dd63681d1640a4d881044052a746a3c79c24f74bcadc2a3237eb233eec2c63a063a4f749ecc3cf1561555feb17d6e782c5cf1cc144520ebf0dc7476c0d701e94ccd3a088220b579d1f763eb00600738b4294548453a04e1a1e16ede7a32e4a3dbbb2c674c51cc4ee27a743e1c84cb32763cd5fffbe654a9fe59cb9fb7c4dd926c27f16e147e4768a12e143d4857fde0379d09655a05f40155256d452fe997dba31014736e4039b7f680429f56a86fbc7b78c0011dda8a0d68a3aadedc6eedd5d89927a2fce3ad24b81b03796c695b4575ec9bcfa56cf64a495a7cbde06e3041668d75f9cf88b9c5743ca11466de00420ffe0c5f08650d0b19a0abac6120eda834ed749f641a0a859e43a15028140a718843ccecf2a594ef21c1235f2e4fc736b649f93558529044835f1eefe0ff483498bf10f5766caef2376367fd7d3716b3bcb5c3f6b11843f5c06a6a622e8f2cf452ca6e79765dd7756cdb96fc8e8e936d35d20eb268e9421238d5ff6d369bc73a396d248795d33036c2dd367e822d27676730761656f7dac3f07bd17be2ea07115d891e48153d4c893923430473e49cf7754eb7fc737239b99c5c4f1666887e9d63053f411eb182c393450b1092087d1fedc13dda47b39c67f5efe1a361a13f7d7787b8d6e3c7ce264db3badb517acf240a47a4f91ff7f0441d252b62642f2f206f1a7ed303a17974bee969e69b4e3f290be527fd75d087093d50501e05e5e7f79f1e45351fe544e70c0d455c1a7b2714b5997fa2ef3419991544316a11502db7b38ec2c6fa085b2ed7c28473beb3578c12fce8782b468e65a0601e6996cffe5997d3c679ab8ab6350b05dfe7e20add361acc50f78d1566c8e79604a6c47fdb37a24e016d1c9c39f2addb76fbbaad304374c493e39e66ede46c36183e71da6c36dbcbb636994e94693225bf80a0d6b8c6f54eebf491d6a9bdd3b0edbc631bce1be7a41f5a36ae713742a3c6d1e846fdba61c804699ae538dc4fae71edd354a77578246e67bcad5e77afc41ca4a6594f424c5a24cd92253864386c8c529d8f344ba759a1c792d948e52035b57d620bf5f821058eb7e251a38ca8040e172541ead08c0000000083140000200c0805c321a170442c1824c9f714000d7a9e427a5419cbd32cc9711443c818630c0100000000002232036e04f21138f086a26d8174de93a0b79f8d060c2e606b5b94034534f10dea508859a2ea977cb6d9d12633f2feff9da8591d725e4c6dcf56f50d41c7de7710973eecf0a694ebe91f8a709357a11e74c332d62599fe6c6011fe67df07fd7a127806ef13e0e7b9aec0124566b7d859ffe055f9bdfee0347e3518b046817fadf7083402ede830ce1fbab6bd683e84c020b4d9adb7a0425e4ba5cb4cc0728ec7f44f19d88c81074b042c355adbe575cea458ccc445c41fb351e8fbf39e4b3ee58bffa8b5a3359ab41ec10293ad7043c9501d0db7fdf00fa2b1d9bcc1f69538c682de6f4812a7b81d6cb37e0c6cb9c27e8055f4d0b7d2f7472efeb63e7bf5640a09190b3d0da15b86ac1b79e656f5ad19dc321f910d424886bd76fa1fb8e9b0a8337dfa6e786c6b94c96ceb4fc6b3120cf044edaf53dbe2d3e8acdadf238dae1c5c785c9ccd8979b11b1b22feb1b31dce10ac3b39302474d1c4ea9c0b4e8d53a5003ca5375fd26713e80476fc1795fac799b1c11fc87f36c23eca2805e670104a6fb5ccff4e8ca96216683ae4e978b13f1ef060ab35b0d6b8aa99a1d6ce41d312904c413a23c08502fc2bb7fce8b5e2886d844837e6b81b27ba90ce2841b4c044da2641b384b93722079bfd26f71b60feee521b77e515c6869423a1f72131ee22c380b43dbdf9c2767ff2edb798741419a9d07ffb34a866298437cc04e75a1847dbf046aceb23eb0a10c32d097f03381d406a01f8b159bf899572f31cfe99b89c9b56196361896c07ff0265995f18f492ff637a6241da29e5f1ff9f4d62d194ab91e76e14c7d93bf6918947ac876325637a5c39c002cfe47e0617198145a1dddd513e59829386a85cae04d834ac98aaefc6598e536a0d7a53d8cdd030267b693d154a40772d39cd545c62441a1b00ff39700ddf970d71157b8ee5780ed065b9dd2f9837e5854124a0b52c767c56d50e47f4e529b85fb8da61458304d042c94c8f0c539cede0a02eb7619261aa9e5682aa1986cc46031a05dc879ed465567e1330f93b479479563a870405b145e5367d43371d5f4a88b2897a7de2947e45ba712a280eac449309db6d7ededbdc9c9743c93f718b8ac2999628d5b061c0f763885b12f63c7e86fa2ff3d230e168d30a991344c40dacf4df4e716e4e05817d732ea67e28852353c0f063eeff8eed3df2077fffed366e49960a7d3ba2bb333e5aac7ec145d83e6645fb9dd49fc9b9427142278ac86512058a85d7577f6cf81cfdb41464baedb047cb69d75f1d65d7320b344599a886163e37303a3313240d2a907d06c12a8850e96f771d1cf72d6bb99b37f28e5a9d62f6a1f69a787aa2e2ff46e226bff9444c9de4e8287d0e4437f54c82b5696703f55aeca38ccd1c9e1f25f271557341bdb8df98600ba6a7b2103b210918e52657a914ca30ff4270c3af08ad7cd982db6ca5cf4ca6fe057a8835fe1bf5a728993fa6904fa4348340747456bd85a3f754d6903f2b08cef30f343b01fc802b01d6f5ae8a60a4db33af15428ca649c6bd56693b55b711d9e8b5315be2f912b6f95d2039098e7a4e34ae86aec77e804ea1422d610eefcdb9448078e9a24dd8d78cb9f81df3e3b29202c1c3b5e0d81472d0c9b8ba3348e92e95d415a7d30e0597fb570fc9ee94855c07c225164c49a6d771a0a95c80c4cd8a3ae1efe1f79177f31723b53260292539947b4420320b28fcef9f7eaf5df0b79d12afdc452fab477d34b5431636db1946f7f38c68c17b6f42590d494a921f199e75dcb415f59c1c684fd154da05a9c84a9c28033dedb882c61cf8a6bf54f36b46680cb88b53bda81ccb55d45f3ada53f3d1333cadb8bc1566c390fd3d88cefa01a1030c882cd688eaba7680cfb10dab49683f6b9ada778dfbc8c9d6243816a74485c856eb5e85f09d0bb12b9a830000c5ff697466f79f6d23169dc7ae60fdac5f029b81067c616851868a55489173bfb42ef610a70040d6b221d08a190157d6ea70377fe17fafa30aaa5a4e91764be0c6bf28fc0afc607b9a23f945e7af956b314eb3a23ba1af9da054a91ea2c8432f9afc3b19bebeeee12b17607ffbfccc786d7eab683137564ed65f725f0820d5ceef10f63f2e370eb0971c6be685c20af1a2fd83a1f61deef5710b095318484601fa4cccffa549119a08df10667ef0deebacf0a180e383587800c505f13e04d3cebfd208d8af0569bd4f0728e7f6014013a37976e8f8ca63de6eab440a7feb6d8260afaa7fbf805ecf3aa69b6f6683dfbae681c250f8a7cbb01bcf767248ec3f5abf70453d97838d47d66b83f3c08d88c4aced51522a0d8339a455e8fbf3e2b89104a4ccdb644fb36b7bb1cfdbcfba2084ae1bc9dd8caf9ba3bc4c1144bc3cb1346622d3246ae995e49269cf63ad1bc65de68d3613eb3413bd5fa7c0438b0a9036375a923279633b5a33a0624b643ee0a272d526eec98945c2bb93b7a1ed78b2c92ca31c6cdf4819b580f1098f4df44257a87faa59ee85836cd19c1c3de57c5c64d01aa82ec5f1415d6792bc06acf8c7b849549919de09c97b780e8c65e47f3a0d9cfee430d2c3d862b170d4db6a601cea6fe213fbeb8e6fc5c234f6535825c322f3887f87d8ade39b008d9d2ddbe86f2261ccf8515db0f849c4a005453167938719bce1cb55cb43d94e844a8125c34a76d614fa1d71c8400fde0ced8d5d1a102ca34679d1425689bbe84137c07f4e1214276211042e4df0d2fda3f84a7bd871a58361f530070ca09a960c7313adb8cdd5ae42f7ea55ecc44477f719212327d346777ec7d08701642c12160b18600b076281c199860fe20190c00308908c4cf93c0cb18ef0f579ebab3882c39d8e6c0b0002249e57a1c1fbcec000c4de28aaef644ea0272a36681dd125961981146497b883144508c7d9baa51a2df88f4e9c81e6cc852826e8a1c264e1592286906a788f2e11113108b8afb438a6d470c21175a322867cef98e7d2d3c2022a058a9f90ade9f671a7779300dd43e3bb5c67363e09720e57a2ab0287df9fc5caf70b65cc735a078f55d72fcfe1e0e9622bf24fb6498036dbe48663618d34c2bf306ccceae14fac60b4409d19a1132777248a86c2a3b1c8c9af0a4f888328163b24dc38fd11e116889828961a92b52660c16588fa2b48d6b9bbf0fe7245295324f6336a0b1d9afecfe6f6b205c6300db9e6d3d82ba74bd1481a8306d25719f7923510393136621741ca1eda700190fd6a447925920e015a682f99e6ff998973dacf8ee54ab797b9736a85237c000700966415853ac9786a38bbf30ee37c91f3a39677636388c126784a2ec0927096fab42fe4710182ff81801c8e1668be6f3bccde4f9c2a8abc79929f066e6d5d25a95ba5131f3689ae2d24a15421e2e1ddf54effc56ecb97cc6c04787f57003de67f0558e4def11f1ac1843269bfd0a18f89d00c434eb2c143b52ad02cc51dcb9688be3d29071d88b924d64d2eed43691c5f34d323c1414ca78bf945010200667f474007be7149edbce05a15408a8fe26d78ff2d5aa842e078b88187313b70d8bd5d105e51095a9296b91cd620620720d09fdf90a5cdb2d52a23c85e87faeae09b98a1982a2873ddf5d171adb78828761a832160772532a9933121e670a8aa8b80d9353933c3416d41b625b10bb7f51ddc3c3e2b19659a7837ba5218da65ab87ae56454f8ec1fca696da0043a05f576909e6898de12a35f5978cd30406dc478f9637ab5c19c46956ef07d6027180642dbeebe79bb1ecaa8962ada15fbfa025292d1bab20304098d1359915fd35fa850f6547059361563757f2697fc85fe2c2f463d98827f765005885fab559105ecca40997e5350e105a36e3e7bb7bd075bb539edf3a76f3e5c594109585adfb17f757729fe78ec26518e2a3a6771038e1d2829d2b617fba8ec711d83e242616e06da145c3995c24c68b3e0835e1e8e7e191848d4e9583bdae4e3b1cd0d2db9a0976d734f589c6346ee79a70e30c7ad49a4af99f6b9e690734cccf81b6af145bc9e6632a08ae4056e2a65e02674d058c7cf6ec78f660c70d49f33cd66d34921cc8f8030c110f2db3d0c518bf6a01f184e2af97373c7cffde13dc9c39c7639e44f706e8f0b40913a701e8091d57838dd1ecf6545e8217f3e2e65032258b4b5d04e86d6834b526321038adcdada57b38ffdc0949d1ef0ff28afb217dc0c5db5a6ee74f6f6b593a6e4d670789f1ea430c7a90a16cac5a376e802c94c718594fe1bca61600fe2110efd2883e86f128c85dd400dba73c17beef7fa61cdacf5ce0206bd6cf4ec2c935fe85bf43ced728c53f0934b78c4803c516127fca8f29f4c7e62a691abebe5c118969db1ee0c3e695dd026d2bbc7c67bae9b21a44a5b78712ffc04bc084e4ea48a67aaea1c7e35a16c671068dbd8298f2abfca822449e46e6e3f5eb9b35917a64fd7e6ae849b23c3670c94b8da05b64722740fac349872ef9e65579c9029ec918d93306ecc8c00e5d4863f369970331416e6bd50cbea9af2380ac6323d3b97453f01f7a995ae1de0d204b6fd87785c94198125f5bc7df14d77aeb7ebf6e6c6131270703f307f9a71a3c27281951a5c230e6444873ec19c98fe041695ef2d15ccb4ab8b988ec8a9bf4e327d96b50431d321830015ff29e4eb73fb66fd3902f67f279a9c9e5355b7ab804c4b53c65e42dae13b039d67fa55dc508f957c9ff81df8e70e288730d771ea4ee8b7d162ee2182f0df15f84763d44b544227a85c491ff4b69838280f9bd942056ad7b4aee6df28a480e8a02c6e104c321c353ed8b66bf9594e67d75f3b4b49f7b0804565ab828ebc110a2c6b6202e6ad045c26c8648a56d88616efe03c22d07ebf0c7e58c222dd6f5efc0f3b596e6f6b671010bc7d7f839831e0175acbdcbfa9257553d544cfab1afc5f2626fdb7de80ab359b97ddc34133b713df27d323dcc724c4ddea9c6e55d1fba87437db17cd7e60db7e6a2010482ec32046800b89dcea6c4016c060e9204a4682bcc4c46b79982a6e92c97c8cf72209d7b09ab67e899801425246398bea1ad4202659bbb19f57a5447827edc0ae2fddd3614793ea4fb710e005f5e4bf9612d5eb36f1434905ef2d85a476826186f853705d6f4cf5c69a46585996cc03f9b731c7904f445da73761e1419e0e8488cd6bab22c0b07fd9efa95fcb197b91ef6dd28c29b7c12883c62bb8f114347a9fdc657068bd261c1c4dc37d7fde9430d4adea46f7fe1ad42ccd51d67341fa12dc8fe221fc7d3c7d15588f1841c8eb26ef67f3156814d47f8bbebe7478892ba6eabd3d50ca15ca63752f62acdf52147b2bed85d74d2ae64a240554788824c1f06fe5d169a84f1f69105e5abb2ec19a949b04b0963fbd7d7bd325748c37dc48d51d0ba1e6f53e9f93c2ab7b11f464bc1fbf3ff615118b32d87762c0d456268dc5a3218084881125a00ac02f4438cc56fbff8067d0ec237cacf0a7be438e183f623f7be45d936759382106a0f16dac6dda3a97fb8b13800c8152a5a33a9eb8bf09d37387432ab94f2d24227f39dd56c3e891032c109b55ec5d61d732aa72da2d9b73ed07815c608d1d4e9dbd8a8e4f028c694616a02599da2915247827cf5fdd344eaa351ab5a4c3740ae5b9ec60f51a73f2b95fae7e3c88b329bc197043d65ba5170b71aa0d0e8fe7cb503bff38e230257713147b57e2aa94e96294e48c2109e0c4eaad7d88ef94b1d395e1bbf4448d5e3acd45f215c1d0ed61e652b0a74f9fd22b3bbb303b269a975ace313b14e93e906467e75da4d38ed430ba0259dec537f8dac59481e79b33f9e8a66cecb51a7736d37e9558e7a26d4a9f3e702e9a987bc94a46deeb9e2512fa3b4713ac5040235ba3a54d66a0d6cb10fc090ac403bb3f090a3045d851648312e77af32e0ae0bbd0a73b1ae75941b71491c4d2f4e424ad05d8fa40e65daf9071030cc69800d30d6194e5c561fd82ba2cc2683bb7904eff45cecf824c5dbf77c2cb15365e05fa8044ae612cd1b1ab7371f5cbdf1a3116e1695101ad9fbcfed4844d408cad23dfad499c56222e18e06ae6e77fc53340d17ab85ce3cfb7799f37ed4ee48b404759ebe0d173fc2687aa52ea772b723528f467a86571a587ce14398f9a9d6e4f03fe0d71dd1fdbb5b6e28dd05b9e2d419a525d1838700048f74bd05afb97565de2c03f3576fab4c44bdfaca545be77eacd97838d7478289631a586a8bf7c24893a52d02b8a0ac89d50ae341229020585fde87b6dc3394a3ffa6ef756e3c745ba832bba575fb8ab9110c24271306f9fd842324ccc26530294d3a90b35135430df4deecf91931776a4a87d59ba49e3ceb05b5f900a80e1876e8d0358286898f8db9b3c7607b1672bfee5a74f0cc17c65c774c1ed930fa4c78fe7525dce9936b4b5b5aff06bbd2387e77aaaf2d05e312716ff9c9887378896eabd308feeba6aaf49ed72719c1ababb9c18ce66e965cc5ef63687c98dfa8f7ac5385357d46c303388b9521417139036074eff470079d45d798cfc0e443d984e1bc23c90b587f5ac6d2c1a9aec463925a689a9c9ce877fdf71c15fca262ce3e60a8c2e9c9c90026b107d750137a44c2bd8b7d593a993b848a2d99e900dd4cd2252a7b38e9e4e2e441fb8f55d5f722725bf36c6765a848c371b46b4be9d3dc1bd0ca444a91d1e34a8e11fd201cee51bb3a4b4e0fb2bfa491f9940a921bd04471d0729300f8d7e3a958f643d080d17d304dbe1a58a94fbaf2bde6d95ece43779be591396ad072c6f5645fd0e4ea96610bc3a021c1d05b453e06c5f5dd627392898af44e4e119a2cdb0663a01874017c00f934a54ba42f5af084d5a4101369abc1524f94f4e7cd090ebe25cac9f1ecd3f12c8b5b20610e894e0626b8da1232e0de4a5a5754f8aa2807211b6b224e8343101e8b5757f751afeeb72f6ffd089f622e477a64f14cdb6b2fb61ca0c8382e37a1ef54ca7943fca4ce9da0d2e7ac9af3ff239e1fa31254002c5e1d183f3b609f41b82a5e6015efd1e450e6eb1cda3fc6eea970a838af0607adb25171bd5a9c7b52821aa899139995b1d4ddaa81526aef84a296f974c0aa1c69ce160a1f7d48a46c837110612d1e7f724bf209f54cdf6c63d8d7417b6aac4d6be7b2bc04cd5f7b327bb15f7bddf43bd171ac758911f1455df41392278178011b5e418569e657a00ca902c24a74419312de07a869f88dad0834aac19caecd37009ca063ab226f0969a9558b88a84fd0c7c7a29f6a1ade841afe89bdfa09f65d9a1506fdd633f274396ff619434fb5d74fb1352dc874e3c3ed512f4383bfaac7a54294b23aae417f9e036192813bb681345a7039e79fceee439a34ff990fbe5214766e3f2e3f14bcb78db7de7170c7f669246509cc1ef24ba218130deeaaa2cb32a25f84c789db97adcb162cae85b44c403f4f8ffc7f9dd6552922d94017947715e16fbe6ae7f7cd8637a4020e9cdbcd0f9b77f8c77c56ca3b01dd79f5294f169371720ec041862a7e4c30ce4b819c2700ecf8678ae7aee5a3863af7c39c259a5d0819524e60b2963a281f2df93956e0e3a162aa3f40408918c4b2138c7b6a49a2ecccad92f8c86a19b4b2db94b9bc018dd6390cd19d9354f2c3fd6906713ff0c069489304640476b1b916ab5b61efce9526204bd0b0067ff3aafb44c001d84cf1238620a987be9b5f305ed233d75b37547100ad663d54e1c8978b21bed1f2b191ea8cc26a94322acba4af9642a23db3acdbc8891daadd3fc6257a4238f283cb2d5b257acc30428544d8e1fb9160745c5aea9962d22f597a81102181412cfb6bab41e15f954f091152a7d52e64b82d086b13ce7af0383fd7b6bfbc45294f5454c78180d549849b28e721963e33fc84aac345d586e63a3169252c4d098a7f4d39b591b847eb62ae7027a4952ed174a993beffb7fd0cd407b05972a542f31b48e4ff4065232e86b7b4819bd18a9ee2e7985b1555eac3d08c8437d845e1c091d256304d5f5506ff6ef0700cf7444c7d7f928b45e88ff0eec42e2a0c41954128c584f57ca052b23c5a32520f9fd24b0078cd7e9f3cff57fea32e2e4bc01faef453d942ab463c2ba3fab5e81937f3f4e8919961d15b01faa21ea5ea82c78d267aee0a5941e980fdc0c32492827fcdb0b883ab1f68940f5c942a57820bec9cb86ab55a045efb727c4188b2d0ddacbe1f35719e5ecae190f02697f40592524613b954e72f48c60d54f1660e5b02b3b546207edffd0b63ac089776b6e648b438abe54f40c8486520ac7173d0cc9fdbf8c244f2b7e809558096424bc4d937b10035b5e2cf0a08224f7f1fdcbb37965d7f0c7b4e1e3ad15c43ea24e67ff35e400495de8431df386d169245899f5ad45d4011a4cc668ab4cbedbc8691d92fc40857be7d2d3eb0eec22bcfd313ea9b8bcdffad548866e22b231e452c101718bf604270a57165d817eb3c5f643592cd4215dedc8805853d2a87c1043670989c9bfce9d79562f3ae900238116617cb0ab664821f5235e88861d9a2b6bd28c7d9ab424cbc55dd36fac67ed8e20697a6aa533d9d7e5f2b8a3400c7957597ace99893e0d4b87f8ac73425be30a8de1f6d5a4ddfda212e0d683eace481c2637523c73a10a7f4584d62907f6d6361e4e052998b5b24731149660c2ac004ed9c36c999bad832ea5e0a245c40add4de9d359113180cbba091811342069830b6e606d34bb19acda4c44caa66a1d4534366d26c082ac0795cddc4fc605e24a7d62c08ebcb49806bf3cd9913c225014c7bac6f2cf16c529bb3431e45548715922702baca4fcf4a3f52362abfe847329ea7557ae2cdb53af211af38d2139747281999ba277828fb849b1a6bce6e6f8216f80b36ec3df186260342b20e130e3176ad48fcc4dc3bdeb5234cf601f6b4e787ebe81ba5d3927646f2462251dbf936583d109431ec8cf18c32c25c47ef24867fda5492554afe4b3981b51e0cbe0db12c5e1d26f8c5fad41ae0d85580ae6e9695bd2446c6d545dd46b15b573fd138de308a213e1bbfe9733919ba79418fe28bcd3174cf2ca9f445a3f2cff9209e988b2f543492795f602217947d44d384c027a4a0f71e4a69a838aa6a7ca799e7c11b22121796d8fe2315ca593b4a23371cf65fffd828e13fdce71f731426e470c23c48c50a83f94d79378d541375962e541505741716d3366983b83879fdf4d0524794aa75bbf79c1cb5b1bfbcdbbc3e7e1de71c7e59dc37d6665cee0a7db05a70c4a6d1684123051b18ceaffed2823864c0b06d703294e619c295078ef6766f32db19a4d2481cd7ec32c2b669eed07378d3c0aff739ab8a6ce4c83e6d18d60971f0a78082efe1e2b105d3af5131719259b2a3bced3e777731009cf785e7105c7000acae448d70f302e851559087f3ddd80c325d0f8d96100086cb734e32971726b4108a0b9c86033c71e107c636b9319ef5df26d3d6c77bb89e771e0e80a603d54cb3dc5c2ae97f7a1c290cb4d1bbf60f9b6c63a5499867fbe95ac603b5d9ede6fc21116e8d65da4686e6edb34313f30fd270d24d4193afc97edd605cc1f5d262544b81212dc9083c699ef94cdb0ac897418f46df8270a4e8862ffe798302db6525cdf3efecb0b872b1a889addd1d2d2ca5c433b9a74199a9947e05095e80a68ecdc4982b51b5e6dc05d41f5201e871c1579a698a53509e7872e60aa8496c626323c21766ac2d53b3c7ca7289f7ecbeadc0378370bbde79e9271e953de05d7c4c2d2dc8835924e93d6f5db8c900bbe9e7a6b6b014b68d39f32e40144541c70ab611f8d30ee6bd16051b1896164b88fb9ab474c3cbeb05f327914f9dc18cbde2a858076c181b39dc8bca9700dfec17bb32babe54f1eef27e2f6cc78745038b821b853ac404285d69880841c5430dd5035b3716fc6ac3a26047e672f400d6bd69d248c6d5b9edb47730f319b26fa20bd0f4b111f6b1bacea9c8835d6a5a0a93315088c842417e73c4ecb765280f800934716b94a0e3516a2f951dad0d0e8d032dce19c4b5010b23aac79276553472e50335b0f8c77dea5730a2a5efba7e419d64f62a8689b927b87672352d86139bb99fbeb75f704daa7e30a4d86010337257f9fac0e5bc061f6939ebffc72fc0af120aa7d6ea30298003d1faa4e3df383df4eb2888c9cf96a105c6956e823d52e4efc4603a722a295bc590b7fe22198aa7e4de26ee28d3a2bd9f47a9c5a80b35193f1b6ae71377b8b2d339112636b96f15580cb9dc943b8673c9b166a2d8983f5c6edbd90654c748b10ab4b7933a9dcd39aa1414bd36056bc7df3f329008c59b336e08b5360626dd559054c50643cf9e1fa6ad700901551f75384997fa659c39bff51f98ee859709ed11175bf5320da9b86ef1ac2fab63dd86beaa5e066d775683d37b1409bb44b677dc88262caba51ae9d7622261e576670b4678a83d2d7f492d1fc222b1acb8af0e4ab26f21c944fdc81c5731070297973a867ef2a803385798a18eec2e246703102afa33df22ecee2180b7a8f21b0b8ca4e5cd96ab54e56d468bf392c976a5fac864e24297b1a135b138911d5eebbb00fadc6eb78fe9793086263dc045ce6aa2eaf9d96bfed8984611ffe2545f0c87e8acac7ce5b09489feda4b946b868613f4250372b91a3ff3fe96c25745c38d4de7781a36cce7735427800dd4036e2b99924340b9bd98147262933282a8879daa27cd65134989dbc866a4e973e4f09c88ae8b0a0132b46c457379e4ccb16130cc218aa8f8da847e6f596bb01776c866fa7cf2e00f3a08350f1050117ecc3b29cb0d1ece790a7295d2c5377603fbddebf085772a1d24ac1f940cf120bffddfd2f347f6b3c10de5167405a524b079915851a2933d35a9e1db48ac0a2edacd7f0f76904fb41ebc9dac14f2670bc63d4632d87052c3e933453e8d6b683d0f95587a8b3480244e0342e0310e840ad2d7c058b9254e1dadf0357661d392f5c9ff0ea1061af78e4a3c33a34a07b8586c8cbb75f6bc05da05dab142ef77e3abcd9578c5bd32b07747712f873e00fdbab702f142892a9c7c62b90f71b7d6c71472daa535ad3885cd2bd51f285f8c6dc0324ecd86253ed932794d6cbdeaf3fe4589a9bec0442a6ebfd4edd96cef34b501b83a5fbad5e42b679bb48c048fb08a1077dbaee6e6c95db3e86b80461e1823fb4cb65d8f5705e0e46d2038461d32d66c4c944727220ac5b1006325622225e54509afbd1201b61895ccb4da19c9d02cd5db8d76d67a9df008ea885b23689763a64dba58f32e85cf14b573193cf276c614ed48737b8b01fce9eaba17016cfa0cc56abb598abe6caf1a945be48a60e65e0a1f886d951a382d2b3a3e34cc40421b0089e9a6b9f549c7c11e9cd1cefe9266f8b89cf4f34b1646c30b15d1134645002d520cf46b6dbf7b28596086f8f3b85ee37c038c1cbcf543b543be39b10bba64d64ab4633dc8edec1b9506ea1eba86d7131903253c83f495ac11f07212ca36d693b3c3a3493511098d02da93723f51a6824629fea54af10c9f6b6fc5c4194446caa6eed6874bdd0334100325079ebd056cca3797ab685767999216255470f5d0e473bd2b3bd38fdcf828574e203e3cb68ac39581ac59a1ba6e684853907f37a884d613c9c0f30ca2994fe89b69b29f96d47d5da6bbd0df5f9b473ad0cafc39c30ba97d580e5484069f4a150358cf28b585062345607ada1f8453e3ba153c90a8062d1d18a27ba60c313b8327bf2b5c08d80ee4b99abf0751fc3d99747250e5391eb0caf81e76c316c08eeb6a123063b07986c175ad3f0fcc1925d46ca8da2abe03f5a80ae63a803b526bc8c6502b8b913b99e9d6fa9f61d95340c3370e34b0b3445cd7cbe979f8a3fc23427db719327d9098846438e49ee6d388bce89f938acc6d8224f72e0ace12c75024a80148653addde74a862b2a181ec0f54922d9819bb5ea53ba7063276e2688b0384fd1c71093dc969422b7e2916d6190cf8a211d9b000019fbf62456aec45131c9f4c3c2c62be7a2098c91d613224da346fca103aab4b880563d99759679e826b874483ef6447342c9a2a3a15d45be344933df2109fd6be18b18547950e50494e5301c7a0487b4388e74b1c358288e7a21a35069023cec0480dc6ffab02c7b41c17c3aa70d5ecd8e4b216875a15645cc155d16e46c54cad89c3264b655243e1469ddc5a703db83b61d0f8260fd28cc656d179b285420489ae4247f9b188ad0ab899ab48d90e5aae7abce313f654a4f40de77b4af5da14f31032b1f747ec7f9e2303316293d4291b47505c875f0ce40ed247aff00839006e0b93ffb686e6a5ad102b82060da94141a5fab1d24423e3ff257f3d60f36ecb6c5af05086c7c897cb04b55196759facb42f2ab78b8357de7e0dc3ab26e64ea975257f80cdd97097809807236e41c6e2e12110e18d20774f3042de283a0cc27acd2205f760ef3154258a134155596e4a7fc0017395864da8a98e2f86341d3d54cac2283d7aa81f40c9eee867dcc7d320a6535c415e9a463c39b497afd32fc6fdf58537dbe90c0f41b4060ca33c2f5507b1c9d8c698041c2c31144d897f477c29421b41f785161476ff6560ae0ec47e8b284ebae3721077ddec4178bcc80bb78bb8659befc228199339be3453215ee4cb431eee5b9a63bf88880844d8d55e2fbacc52a6054944f1b3ed07e33d91e9d27bc7262886c339d354b163b43088dc9520d4c1119b9bcf63bf5070bbf55d54fe04d7d30c9e7b11a94daaf9157063d3376e27f7d86bf5480fd890c2107e42407f13492c94fc72c19c05a0bce24902e19c8166605ab597260d127697c8fe0fa31836d220e603d01fcfb68c267373216d8deac63ed79d75d48086f6ebe2bcda02c9d2a865709740fb60c50db99f84fef737eefeb15f027abf047fffb53de04dabbcd30a559fc53a6eeaca32fc9292fc188a7a118b461b3ffa8867ffa900d83fadcb29aa91d3e17e71fe72e41beb556f408e9bf8f708561137d69bca1127720a784b6768065dbac813abf5ffe5685454bee0245e58dd4e993e39bfa27ba262a0337aa4b82251958a2ba643ee86422f392757c83f06b3f3cb868b955e2aa69adbd68d2939969d67c31e47e30096303ff47d13f7bd44f1e5d2a822ad997922c9f1ba9fd8f3829b66f6bdff4dd6cc565a1077df70909e99df54177943008f96f1fe2081f1c697af1e80eb26769038c4d452b08a76ce208e3bd20614a80055a86d95ab4fbf81b316f7602b96ec11c59c98c37cc18679bee1812923e4d76af257962c88f0625b7972d5980a085c56df4c6ee0fd15656142f2f28906c0da8728cae313da934b5d19358160e097341956fdf33c03647768df0219bf1dc5497ed9704bbb9604b14839bc89041ce8dcc4a35b23e8a54602ab7901d828691dcd964c3919f60887b4ee9bbfb2214267a37e84a13d3ac2bb0c176405ff458ae43b493d5939230939ea629ab6bf27a9a0305a68fbe183adcce6e403941b218f0ff5a75f440f7f24be15ee1e7ed11b6078456a7a9cd2d0d14fb065eb44de89473536c3982694025d43ec1dbefcb136b9441e63049392f4f4413bbead581bbe5c054269291122138137339137c4ae49ea88d388f7396856c0973abc921010a37d692ae3e89c804a2a7d940ae066f675a0cbbe6ef0ff49a852ba807949b87f2207e2e42dfa57efefdfd62c2235b14671d0964e1aec65396b51c7785182e848fa37d9fb8571b2dd7191e7bd93f6519e6909506866e7f881d3278c24715bfcaa221945472896588ef8d54a73d77c666815fc623e87ebfc62b065e7d2eab60b631612001da5c2db9b6f650870be4ad9d9d4cade9357e8774f611754d8b7a82c27c1814cff74c99b853b8953eee5822c8e35aa9c05c43152e8f44de2e2fa1901df47371eb23fe9251e86106de8f63fd05105331143fd3e3af06a1b843b18e64c9756e52e8e8af28930d5d159665846762918ed5bcb335deca62e5669cab7b3826459c80d9ca6ce25e5072ed8a46e8708d6bc0db3929aff73b1bde7f6555260effdee7d0fb69d94692caaa4ea47da85043a4947e13e17330a30ac47f4ad1fbc4f6a63a8ac74f81d0d2cbf726d0a4938cea3893f03dce0ea285c5546061750fe64967222543823173d3828ed2ef899b988bc40d319f1ee9a5a6d78fb94166cdb4c05babce61105d638a44fe5ddb114f363c1d06b2e5523778e59a336b99dfbf7520bc5b2eb2c35b52bcfaf2e76602a8f350a8b6637c483b7cbeb243ad6e476b9664e4dbcb919ed8b2acaa70c829cb9980adb87acc771014fc3b7a75de3cedde3011d26b709147b4c0f0f08e469945b1710338f656cbcf56428d44cec5e0718337f9bb2964b5b1d83269d717c6c130a9bf7c58ebe4f88307532dd34264638daa436eb1d0b6cb0589f8a9142d0bf42e55f589853d8d9b18a2b2b12e2c8ea9b9ded0f1c08af20dfcb07289910bca7204a8b5ff68d1ff4c5e7fd3699d33ef4ff143306b7ccadd3b6a6c52fdf916872fe632f463ddcabcf2a402094cc868a9f470dd1bc14e09f9a10fb7f6f25b3af5d39d6240a6d73c9b864c436fc1c9f0f1a11d97ed0c027f24803d0a3a48272f6b676c9f1cb41461c68386323b017e1f0be2ea21dd91bfec274ae2a73c091096faaa00b58d22452cc8c04bd89e338797bb322f244cbc8ff9f6423ba9175a34fb7093a45417863d5e0c1930afa4aefd00935b2b5f9debe4438cd44c04b0a76a3573b7f4d0073ac267041a4817693a775bf2f3abada81cbc2e25670c98b3b00b2a688bba695014b404e91dc1c8f276604b6609eaea1a43e728bcddc899f453786e99a948178eea07df96abbbf674e02d12c0eaf9bdce74d5075a917ce08ca61833ad5dcc7b84993ff38d7f39e98d6208f9215fea607ffd4e9b8eff1cdc429fb5c44be09b6e7f78108c03644711d764293887ed67d3ba2611c182b32052793c109279d1744809e50855654a882e06086628ed7b8d52db821d7595bdf1720218f89219350b7cf0453e022ffeae8e730307d0e8b25e929ffdbc0d33c07dfff3172bd7a2bdd6eac8f1202cf19ee73062b9969251138df787b83493304478c57f06f0d46e6b9456885ee02682bba37043bfe3e10344ce3f132071adb73ebd9bd06cbb2c481ce8b800457b4ff916d77ab25afc86d4199f1eba7457364f55cbd0600b494ad642e09f71eee6cee432980385c7610b44bd0731eb47619badee14c7e982a8f4c8b306d7d4823c6e944239fd5e7a9684090f2afb2299de427e9b92c102320546c10be345b2d0c01d1bf11c28a3c940d7aba291ecb2d5afa4db7f83f09fa7e27a42b168d644e81fa40594c255c5fc739053582d09de92c7dd7034c83a47e006af3e0ac8ec7f0bc4cc420815c22226f49365cd0fa8363a2b44698bfbec7c041465327a06b9f07e8a0893d5abe36c2baae08038fa8446bb99294c391e90c398efcf7c211fea491fd2705b5caa39f6cd753c090c95841bd5c94a40408a1854459587bf0bd4f79e3cc046e80818562d351e05428221a7211ed2e1a38e0f1cbf88140914c20fa8e4ca828f2c10ac14fa3f134af9ea114cb4181e133338eaed6c28bff429ff1b2f7da5ce783477195df6b8695479cb8c37912dd1693bd29de5124eaab16ccf1c6714761b695ec538d1a8f82a331930899f2d0c286356d87204309014d1a84f5ef9ab766742b63ad0332ae3ebee42bc57324fe78319ef50fb8e6884a029c4940326c1ef6b7104040ef25676426c343b8959a12fd2a6ea7978112e378c4c7d75e02ecf7fb4581b0166d6eb223c6d16179c2b3d53fbddfb9769ec2d024cad4f1010d14b2ea38125a5ca8f0fa3b2a85189fc9630eedcf24813c984ab805df287e0689f84122d9841b83a0fe4992e1ef1cda4ea8fd7c27a5c8f3f6ef1cc7a509cbdbe3efbc14d0cbc44812bdd6dbdab6bb58d9e85bd87f944229da0ffffc305f263cff91c83b27b8c548e1f6ef50c66abf165e00943e6e0034c03a4c2b603d404635b9fcff8ea4d7d1a41f95bd5b45e0a393810d64dfef681102031b6815fb3e271d795823fbbb8b97dfa080c731ae137ae3eeb5f8ba55b6fb8276b142c8aea4dd3314ee59ec841ed45ce245804b53e4971e02d72bdad10eceb1414cb85f32e9ee03a44001153fb52469690f81f490e5ecaf9a39ff048ca4e3878c309675e14bfc1596412fcb0168917fcf25f7b03d51a5b0f358884d0c70a7c4d9dab167ea65b2b120914055ac7738003c7fad1b4b436dba458386d62de80105a75513e3691fc24146462855866fb0ef5952915238588fc1786613299cd88f6b5246a32c3bd2f78f608b3f9ca48167d3a107ca50aefdcf0d75adbab40314c80747a6258318402ce3a9720e22c2c3886bf5a116f5448425499f3b6216df01244e8f96c47b2bfa658f6450fddc903645189bb63c16f60ed07907cfe52281213f1704ce0a81ace2a21510b32fdcf612480c06840cf2f68a4b6e7eaf1151317f69420eb490dc94ee817704f05e0d7e0a21044518c973237fa21138c5dd674924f020e3f590363198787c26ce751468b91532a4faf274340bc7c8a2bb16617036a3c8265e17df89281edfa2c50a5457ea44fbe041648f2a878f49769126f1100baf0d31d3d4b0445ec344d769a1fcc8525ad0374db71ecc0299143d7ba2afb0e138b84577103e202c2afa82b32ee77e66076820fe63c6d05ff56ccb692ae3d93d231fc5d76c9c872ced7b5e4c196c8e3115114e61835dd77498624b3bc98152339838a1311fd89f842387b19f36a8f81116d5827934f50933b6eb5946dfecea787e884b09cea7b39ebada1fc8b39a587ed7250c3e9e6492552c9b97ad88c7980a6c911c2c74e4b3479b74ba5f1cdd3ba535e58b0be12e3d7e393e01c074573f69cc3a0026cc94aec90955824c3fd7c0424fc6beb66e80b589cc2018e1c49db953cd3d5b6a81bddec5c4a4c64a24dd4864ded95d7f14b4b7613a7d5295c54563610106d9e04e9a974586a588f8a3aefe1e431ab23bfd4e0b48949128d9148f808078b6940f49759fb3a186664a707b945aaa8784ad9804fe9171136863481c3e40d89211903e05780bd1c652ab55e2f47a2b3ed324f34e85f4bf7667949e9df6092ea000ecb605b40843b62e91c4718e265665da59119b2730b5bfc6c05f60d1061c310ba2d5129b49c646fdab9b75797d88305256c71e909bed1929133d2c5d220c5b832b35cd4e207c895f747f1122f35c93c097d9057b95fbc0a714e84ace797aaf2658188019fdb11b866a36d631914e1652aa82e610a5070e89fc11fe38eaed52b855100e0886261240229524e1ce485d0cf7738343e6dbd2f9f4370732ef80f34d72868f39cfcccf733bf4fe3b35ef00a6f9f01b13b010bd70cdca028f6d86bf6137fa9af5c5bd71efd07c89d2c5a71eea84df62655eb827df3b72a192deeb0073e3413c196a5fe67776ee9af90c7a27a940b1af25930a9c3a5f17edf4ed1c7a24ac2836ee0e6f3e762af211f329334eb79c3f13e098877def3c732f3a8293896dd7a9e9900eae64c9fb8120fa03f8bc0fe7cf9590bc76000ffc32573f1c7f544c353265dbff72d76f125d263cecef1a4f0e88ed6a0015b5fcccb6a48e6cc27985803119cc97647e156eb28f942bb65a145441023e0bd611f29965f14cb23ffe5b8688868b1120d05c11029f03051d787e0f9fc6517700dc168c3330762339151ce6c8bceaf8f7ea760abe3603f5d32ac51e989ef777d9fc8b602c6ed9a6e8eebc24a256878aaeb8156f95bb55c50bcc50b13d9639884be9544c2104b02b8cbae12863277b7616a194fe180f4f74265b68c767ead0fb9c99a61485060185fced987df378b063aa9409c8b6a5695ac1c4fae6fb3c95e5688afb28ad954edd4f4d690843689a484547323809dba4f1ef2e05819034847d5a1aa1fd5decf91b5b8771388cbbfbd4e58b9293f6fa5c6026853ed1a32964f32afb98e67afb6d6cc7444b41308a4cfea2417cd2631cbe244c5308fff45880fc306290f9ca992fca7232649847735969c1bf87eac7963d859c6b40cbf0a63084a9d98e9ccba0d2c9d22ebbf83ad2627fa1ee4098fca710366e5d9d3b15805df8390d18aa69c2447271039a358f32d66e24c417b969c6f8e82494f702ce7652602b96604983f7f7bd959ba2310a3943a459c635023a5298e8509f4742d804e2acbedfcc549d82164f0d49cc75cb13a9b0d28cf36efd755c4b00b9e8072468d254fda368c9cfe98fdb20ee977d8453b6f2deac72d25f22f7d6598d550a953d480feaa63237e5ebf9c70e110f1cd8abda2be07610f471fd4d34a050d90768e525b71169687f7ae38fe39697ebb034a84bfd1f54bfd8f4c2ae37245662cb6ee739f377eec736488e10b4142f89fb262f38fb92e96ad27a07bf12f3e1403d48f708d62b1b27a011cbf217f36d2640639797eac2e54610e4db6747c602e8382cae67d2eca09f3a0d85a68450765c9a1f819e829e8b57a85f4b114fe5b2dc8fe70cdf6ac77cc2f31abf0480a3bfff57c9c30fb7031f5698612941b288c51432fcdefb5eeb3c847730c49845f71ade5aa187e7d896423018316bdc401507b03cc000def18b477c850303a485728d9e3b0476591735b61f678d402a7aeb920dd4caebe2ce2b7a201d15ad89c21f259c46c8a574bf643488d4fe007dca14ed6d199e58068ca19f9bf19d517d00672072bbb1abaeec53e2d9a1f02ca568ec7e71e7c1c12c169f3978e18ae0e768f260dcb93cd550fe305cdef4f3c18f0ccc566c55d17b681b0bbcd73fd692cf42a7701053b53c8677d60d25918408001a31866ee5af6c77b202ffe58c49eb2feb623c7bd816dc4c66e9909d2e5d2686c62792dbea9fbf5b6532425e7794e6ab7ac44a48f50f31baaeef9b0dd92a7daa9ad88acc45f14cd09a90ac587078e6ada386f612daaf33abf39b4217284b0033310cc8064fb62db6d7e96166718bedd14135b23104168b4c1326986bcf5cd2f57f913da6473d98fb07b31e576b0c5417a306bb8d64832ec1a129411686c0bbeb2932050934f2a4273a76991ef6461f57f50762528ff656892c17ee211b80eed7c18dd8dc2353ef68db418f84065b7ab1d5ea2018a88b76409ffc8ae2d215255968a2f401d27ce545678885ce11814c44d1ae62a888f59108b7f4126ecc70329141e1d1a97e4e600dc33fe1eecd839a766deed67496406ebf59676b3ca2c9620c9ea80d62818eddab2b93ede383f5c8acbe72af2ff85920a4bd305a2756cc757a74b6132678a65133b4c38be3168eea52cd3972d97fe394ab512eef0b90a42bfda0e01ec9ec81051a436b9fc5ef553e695f25a9ee86c027372d6ab9ef4d74752b39c9d57bbefa642a20b36f6a20a2ddd44d24bc8ba0bac4fa6cecf1363a2e7fedf221fb47d67a42e01c8a3cc4ea5721108565cc296cc3639f02b82a56c49bc3571f0220efce405c5f762a50aacd007f66c49f89e379ebedf73cd0285b16778eb96075dfaca1637c16b551aa653acc9999927fe1b7c6d4fb863f048f8852275159b3e38c52f766d40ff70c4e4e63302b9f07bb0f1d78246eb4adcfab565900c3e0ff075adad763f5c01e71d106e1fca3a81643d82e937d19777c838bfdb60bfcad21b68a951680d57b8cd864e46bb5bdb90e9360539ca34eccc0f50920b33e9969e390e9b1f63955b74fde13c3d32c38dda8ca447a76001bab8e699714c8d568628ca1b4d2a5e93743afd278c4f1fb8315b4843af9ec19d7a449928d70fd7226eb84f1e026e81eb75e1e8a09a6caca90248bb90bad554b28f6f0dceb80bbbd39923d71d0d944d6e4f53c7cf4bc91bcfc011636ac5258257ea48aa1c810cfa976d241cb68bd1cb7622a50addafdd4b974ae96baa3721af1fb886a9978cc197323c3057dbe7269ad3ad03a563eb854fc85a02db467ba549a1aa14b583e0be4a01c6e66b3f2fa94f137eb75226f91bb0c6f7a4152e422d91c7ac121f92248ed51191799daa31a4100bf2117d41efd048047644bf205e3e3f34fa89263c6a0f45b74a8254bb6088df9b050abbe5630a93714165ba1d6e246565f898f9c85d1b12d8731615ae28e3e76b8be8f6c6ae15b58a44ef4c214f72b969f44dfa995afe0716a8009e5afc5eaea88d292e264467b32fc6402e1d0463e1caad6d935e35aa21104dec54b4a1480594e7a32c49886c3a813eb22d3fcc19b07e3b537e089c0670086dfabdf25cb5d2af562e1a6aad2f113491f10289096a01a8e2db2e18c8696abd7fe225c08362b9d3ad0cd638d68c0c5c4c613061e4ed5127c5d0853b9e5001346504449d9fb1916a393f0e1337064cbb15427dda01f3cf9ee2e6b8a5bf5dc22c55a84f73ca9cfc558865ac85a5341c6368bf4084621646c668b132776ef4ccaf2c62ad5708bceb8d1eebc52a299bd1b7055bad0c36f16501912f8bc845109f043d30b7d77c33dfbce0bc0df563a5415bed1a0149c11b9bfe24310a474453089e291f67afb31584b98861bf2fa4d3b4e3a2eb4ee51d99d7155936dc5d16896e348be69e2b44a48a9172cdb90dda58585c6ffc438152031fe36022d99bcd6e774352f91a0c3cdcc25991243126f9da767286cf7a56f0e94691fd804dd4b50add99b8da1943c6e5218206b205abb3f0f6d0e6cdafa5286bad0b8b11600acb810bca4e6a5435a805249098e89a874a8a05d7f93fc3071d7f493d41f493d135438dcbdd1bd93f9cf007d40eb278142b69b9497964d768afb370914f4aa8eb84f202425ebce2eda41124a10f3ce4a78b5b174011e5cc8ece39a063f992c3c3ddc82f94e08c03a93064e73c8df0a4f87bec0dd941c5c4ea96f12ce5ac76503d91f5ea9c31199b77b798bfc89e7f122b480f70414d484dc3336a793dca9a9daf70a10d5e9fdbd4702325e473b88c8b15c333ccc31090e42479a36394247fbb4d96f9a615d0618d78aec81538408c490d23d049c582e71b12cc1f6f918eff58176cf7a4520488f3a2c2fff1b47e023aeacf421c7df7043a45ee5262b50f7ef25d62bc2c5855f58cdeb7214bd7cb460ac9c618f16498464e7cec6fe0734b0cf3c5913f5e757876dc878e73820ab7042e2c9f2d9657146d5e47ec08f7ad946f78b30b6c090a581dbb91edaad10065a40df62bd400bae47dc4c8516db045a70cd98ee559589ee012dd80f6bca21f78d5bf5bb008e7551b59770ec03490bb94ea5dd8da7184bcd2da14bf674dd4ce0568dad763b8895381058848ae17c8268fa97c54c67b03865c27120ef3c39c50f31daf20f81b3c6928b82b5004a205b3f42040d7d965e07a1e34558332401e4f98105e846a3bd5e3bad05b5b564791d2ea876f3007c4b82ec96aa6e5d83be511d700c6447b45189941da2a7566364cf0e0589311f4b944b00eeb0a28e0c3ea0be08c2a669b71a867bfb625013e301a92065082773468c07b895c2c1cdb2f8ddca413f31cf9e8f6480f6800784dbff078e55df02e103a887dee0642f43c800f2b23fb2cef19f12c4bd4ef8cdafa33847bda588ad388776c401a51fcacc47c738e6f9b6d012612f319d1d1ebc73a86d351fa340271f3b83449deb76153053764efe5d28a3d0d3c6ce2c83053bd31929c410ab9d3054cb135065895aad8b8b3cb16c541160512dc200ded9c7478d5147bc49469e40e655725e30df604b2066fc74bfa8f9dd28602626e3fe68c65d2ad2312bac7221c9082d176acdd3ff95680019886945fa00ca3222c04f2e7f4b5347fa8dfa69fcaefb27052602614630c007abe5970af7860f5df5302c8f00c3f745c77c59783533ec17b1f729624cd743ead523c42cbf7e50d21364707cb59f25a5c53af8d7feaf1c2a2d81970c37a32daa0adecfcdeefa8ec3c955bed9ef995856d24cd927e9bc135d0bce5c7192e86867a0955819c26d47b7d1b23e6e784e4a2087b66772139413601e7fb2006a89a4c7078d25a8052c989f8b86176dc1fb5ef8833529481cd08b8e9dca49ab8e785a0fe66a137653a7871e1462c0192ffb442674818a33241a6e4b4c810f94ce72679cc4721f93870d85dbb4ee8a94707a9e7be6e8c3c6a512ce2dbe2dd52c9434c998db2e62f7b0b0e9fc8d52d4ce4595480f261d9258d92d560dab2697685ee14188a53ee2ed949c72fa0c381fbe5150462c030d6dd94db38581bb10e624fa8ec4c5bb77f4617d8c03a2d8e0a01208cdfc5042e24e6f637aeec05aa584f4c2aa54a14d2cdbfd1ac86d753ec32735c961465b92561f0a34ff2af7da9620d664eb090a7bcde854d9551cf2a91a0d9a443d19a5bc61165b3edd0ee95bb8f3e5ec89eaa4ffdcc1092c588e74a0fb8689ba4a9e0d5a3c411868256be31dde95a8c5312479497b7412f0261a4e1f364b45377b6bc1344ef9172497e6ee1f1032af9b27701183b43a1de109a65f117e59ae35bd1b94ff5306dc6ff31d45e90aafd8f73c1894792527b5065dec58155905692fab45aa0e60ab6e2092137430854d111b76b743c91106ad144ab18c2ba88f8dcee598483421ed30fc93708594688cca679ae403840ee09cd773803eefacdf83f69f250936fdc23f7e47f65959bd0221d6fecbff0c10c0264d804c2a4a2e468368276e205febf14162d5e57c1f20c81c0e67bfafdedac01060c9ea89b13042ff262c7efceaa33302ba9f93bb7cb429a6a2e758e8d11535042aa34f0ef65afbd1b839e1db6f07ddf1dad066a54e22f092578ff0efee768f0925e3749685d40e232c35b7fd4302125ec8bc2fbc04a501c694b3dfa653895befa82e6ff45f067a417e3ca21f616ddfc981b556f4998680704fe65077df6cc2f5381234145a649cb95294cb753c69260487d736925610cab000a62c4a4cfbf3c1dfe3d8d417499d5fc7651519faadf69e3a5a84db02e00bb24d9aa119c4619520291445be25f44cc6b681d7913926599156b05cbfa4b3c03c476b50c7785701d9694b2ba5188ba8e8f5ebb07cc1ad883c4155521f1fdb0b0a0347be16216e265915b103a772fff39a87a6493ec85a03a4fe71cf19056a7408209c780973b651a406e99de2b82cc340766d1db6ddfc27e2db7d4bdc11a5589f405630bdbac20964d130360c23c14f6f45d2da3c82905a9dfa9696ffb910bb8d657e2468ca0fb2f1cce04b19f86e6a0adcce24bf4d44da98fa46a32bc118da0a57ea44f86552f67dd313939c1b860facd804104900d56883cabc34000e9264604d424e87d87acb11f244017695876e888b0d33fc68ecdf25ce9b88f2e86d389e74f921594f61900ddbbae6080df50e07ad08aa3db8324d0956adbd0b6e73c14dd7ef93d8bacd9ea6519a23c726f785afde34fa3c68a06d171c77c5318dd054d367871e24cc854504f8ac40c37f9c01a30fb98b54ec47e4672672b03d9d89539368cf329f5ee20c52087b22ffa558ff95cc632c0818fff4600428e701e59aa44e9c2976d718f152e33c8bfe2d45b3af309ed9de9cca3ba56e183d9620f11658e7dd5ee9f495188e3e1c196700063918000805286635b45bf2a5b59d2b1562f2101bccc74f9068952805a472ca959656780d241d8b509208c83d74bb6329ff351cb15b994f9be9ac93db54520cc80d32c5adda835033b3e5875b9ffddb97a16e9cda8703778e0652e70b7bf80bc8ae7d1d371d82869af3a9c0555af2f11f4888cc8c1f35481f9cd5afa764ddace2051d950fef47f26caabde2844752ef1ebf82b92bef567be6dad51442a7569c6f0b8fb47ab0536ee1d0320a5130ef5875641e6d3b24ab066f392db9a37fda7365b01c51b2d2dd1c06f3d8f5a8f4bdbbcd5abee7cd247c189176425511eece639e85fb76987a5662c0f527b31c2fe3d03cdf81acb588dd281d9140c02f2765413bfef6bc8bfce1b158ab7a54413aecd31f3bfa1de8c1b71fbaf314d6709b8f1217bf665314c4ffc4802577c460111f4ff6a673c22af4b4d74adaee4015f4e79e5a49e8a8060428ad66e611a838a7b11560e5aec9c7bfe29a000830f3bb8ff83526201031c53fb8ff33edaf016800b73755b8d04e20f645b6635a648c07445581d5cd56301c8f57ec3b393cb3c56b9873487ab2aca76807dad3bbb8188f8154bba40b6809d3c8517782ed095c57434348d7d4d1955aab683726722c9a43c50474518006cdd5e8eb9560a85380665a4444ce43df07e42d40ba6f60167f62498af9f28fb7c860665bcf7f2c1fa9aa69b8977f67a1f206e16654bd3c71af4374f4bc2248c514bd34727e9cbe30fef93f7ec800e47c95e2c225a18c26ce8d86dfe23668e186d1c13c910a6281eabd574f7636732b59ab4c4afea3e70856d24198929cbd34f3138d53306b2984e4e1447231927e2164cb74cea35741a6c1817824ceedd6e87fefa4632ff5ccbc9f74a486221fcbdda0b8cffb0dc99ae2e6fbb61f3f7444939c7acc46f868c602b5707a347f2378b8d5ec98e686eed90f871d4ce888c907720fefd1185e6771d6fa2ecf1cc954b806d190244eab3c4dbeed3ef678966117a6ceef04a6c26a47556e24aea3375ea5b78f43ce97eccf9b9aa179b0382b370303f8a08d85ae406edb99ea537dad5c06bdc04f5c2865eaed568161f2a89c06be9c55e9ec4b1b05f3177cccb4a43d560e14beb58be6986bcd6cd078334d84f227a1ec3c8b170cb5b0aa26f9c67e9437ee27cd024e2ce9ea3e10f9bf94215ff73d58f49cc19b9ed00fd26bf6cca39e28c95d52eb74fd5c72cec4df83ca33881f607bf0c02a3ada5264cbd941e7361d94dc187d9bedc2d6df5e5029c2720e6456af66b0bac316e951e2634be30b8e0bf49068deb3c5436fe9b1d30f885fd31a1124bca86b999f9a4684a35c064c0b9e4cffd14473fd59e63dae7e9ede0618519157cfc46a6abdbc019633897a09a3fe4da9770a3ca91d466545d71f9174ac3090e7c2a8075494cab96ec7d7046251b89748193eb3d94293a7c8be2b0177d40ab9aa379f2d87d982d156a620ae3921e20c620bcc619664f8c39ffb6fbe82d18f93a8af9b35c61715b93bc8fa9729e9908ac6c60cacfe845fe7b26d948bcb6815dd05a6a25dbb208736d225de54a780b14445612ecf59c1f515dd43cc0fe68aca96dcf2616fae9b3a3336f869388c3f1f796083bff32d3428db3cd3ba88bb090dc30d811a71fd8b68e458b0cf715a6374e533bafe9c71c61c895a19a4779485c1f5e1bade9dfb8ddc68bf51adec208536f3e7458d3faa88edfc02e0aacb9014bff5163bef3bf4688ff5c84d147cd55d3b9795706d18b892789e7ecaa2b03daa0928238babef22679c6d24312866091910d706a3229f2904df7448e1c904c4893b4512f7bbab4ec431bd7e622f5a8518f2988f7db6bf667516af133df53bf13eb100d7ced76f7deef28096de9db416a1dfbaa18f0ebc4feb89bad14bd5f7d6ab2d1b3da0835cf726977e1f2ab8a9a1c742ec4a13f77baf8ba170c759fae2fc46ea9f3a384b4b8c46b5ff6a63049e1d61762bc68291b2672e759c19a8c581ae5745b8c56b2717d700d3fb813e67c3ab0b89c6d1cdcd700c1d5fc1d91dbc182e20b70328190d7262e58a474098e1785eeea45bb930126495e1e688a83c6191699976034976d6fd46093678d78053b1a672f90a0682c364086fb88bf334aaef5cb7a6cb8e56750e5423db68dd875413ba2dfcdd68eab3e941a5c71ed0e5369322f8f64a0bd153631d9afa110457a3eb4a2b5c0da29edf5e40d2522f436c6daf7d14d32d6879caae9bdaf82c3c38bd71f237dac6e624a2470151871568be4cbb4c52e1e17200112d6cf30ae90c6509962b98814c2e14f59b238361c8d1916643693e83169506cb72a45c63ac3009081c158a2bdc70907415b6656420934c036ad6a66412b064c23593394db9679e35b712d0b41b2ca7a19332e2a8bc3389342331a5ab9199d5ab99aaf9b1c2bc26d5123a82732bf4d8e74520a2042950de9a0a5e35739a51900e77577b0b904ca1d2eb21ebaba90f22cb5e7b7895b23c571492e204086a79d39089a01f5f8d9473e3aa1557561da5f3de90a34f6c3b54e01db5a91ebf8ef8d3b18d90845f7e8a5369927368891f3954e6820407d32f272b8c8f1fff5d81fcec7a3db46e8add7afb9f2107e4e7e8b1046444664a6ad829c0d991cbd073b5b1ed9c2e9493bf458909e91260903b9df5672b4a670007957e8e80f65ce217ab27aea8f14015b448560de6e80ec1500ce6fe20f531d57248a3917a5cc967daa524417c8ad87969b51a83aea7a480833ed1ff2d130d5f88d686908caf755c3788b632d235f1d353e9f741d3d41097d31f49e5b5d3a23143f0c881d0ab104c18c3f6be8a1e5847f5caf0e763ac14f6d32c79f0ff54faa739c0e71cace1a52cdd4e6508e95940ac34409ea4afba87b1580aaa9c1a512c1b95e0f718df8459df60f21b751db64597fcbd232f20adcaf0c6ffd34e7eb395df1cf5e11b7e60c88771704c216808155a965aaa394614697f47d6183568458a9ab7be894bd11b1cf051ed9bb4942ce006a5305d92ad2653a07e7c74e3dbc6967d950742b7967cb06abf47d1bfef6612b24967277e33daf798a49dc5dabde057b24b90649ee0ca058f7b05ac3f93328bcb2c0d214bbd02f28ed0a1862b3c449e0a1667fa5fc58feaa58ee259d7d2e6433a6fc008a0038beeedd849d4dc3a10cb29ab52490ab35034f3b39c385d0d17e9328fa142b24c79f3fb8d45100f6eb44479c241b51023f0519daad29885833a37a08f1d047d7f95f2edbe9d0df5657e7c6d9ee843477fbfa01f1a682979ee7888025ef078ecf99a6aa0eada9ff089711f77c16e9898ca6ade88cba48476bd2a04940fa0b657142314c04a902194eac5194d0263d299a25ea32744fd3514d4e925d948d8400784bc2036836a6c7722ac6add6132aed6deb8facbb22b4b2b994d507fe9b2d7390c56d6a898562ce97980f5d7a37d966ebc52142c362c8af199e31e65abf0b3e194694a6e1b1ec68685581d3273d418cf0572972a42cd856e9034eb2e35d2148ad2fb17f7cd4cf5e6afdbdef2473c7356860ccb6052aa5183bc5005bdf24e4a522794e92c652d11dc1c8a39a8c3f4a6a338d69db9b969eaf5ad43aa845816dee64fbce55d72cc69a12c76463ae066fee88c9f561d8f06e8cc9fdec8b5b0eca48d19be93cc3fa7ff95c7cd9a1103063b7be637e60005107892a3b83ffa412ff5137abd9019bdb671aecaca265283b4f7f481a095f59f40fa44450b6a700ba674931f4540018127c7b88e53fdfbf8991ca997b06e58c4abdec5fc87797916d9332f863b62160598972f408b5d5653ac0641ef55005ade563445dd80d13871652a777798f95037462ae89f5c0a2d272b958e80fc2819c22aab7014a8c2cb71f1cef1ed1e90103d3bbb2d7bbf63ee464127bef4392f28c6faaec6280604b241fb866975e90943e77acea7600f641e0cd4662e4d8ab22920e79ca469be09800d2243175f815e06cf6d547c97a2124ff74dcbea101aeda11615ae1ea3b9690f2e966e773966fd0d085746b79945b0650e934bbacfb323514a6f5686b9e6b65251fb6a29f9c8a81622ef322c339f2f9701c030e2b67855792394a296bce2c76ecd6a7ee0a5046be9c639895afadcc10d0274e6b130305598a3e552064a3798a3b2a7a3b2aefe8d7bcab0c81bcccb0a6a68dbc08491e1a832b12db36f2c76a112b32255d7b12ed08e017cfb60dc49e3a0fcacc912915724e88ac4ab361cef84345f763739bbd6a8cbc135a83316275217838562b4ab3d4d5a7b74a10111f53af02398c5725c5262a7c8db42b262b904e5ced99897a30f29eceea2a7ae50745d50b0d562c12308b96358b2f302379c37f4751b83770b9aceea6896b02dcc9de7ee81436d661a854750fa575b43028847164b9aecd406924bbee1e32942b34ee0318b1eb8bdcc800e8d7aca0e3c1bd5f0ec02187e01e6421aca2a9bd7e1e1a652ac9350ab1609a9e71575199c3f7ff1156c0461bbe8e6cc1e8066513f0f0dd0a02207e8943fc687e66e1831cc540290af2412d84ff97fcf081eee225d09049d931c257802524535dc865b086106c6740400f0a44af123e4191f0bcf11dab56df630cbbc5a7729592fa3a97887a2f38c26a13f6726d08c4099649301b4e1255d5ddf8d66ade3f836017185793c6cd7b33d6b072f94386f207aa4746bee32aa17b651c7736c18e18df59c39602fc6ed0014d61d3006d5217531610ff88ae0151b20b00b06d16042055a1231987968416dc139c02ca74b1bd0defa15e2df460dec291cf5fc5f7e99a3554e907af67a83578e560aa99ff6416c992032a7bdc7e31d3c71e920a6d5cf755894b45537e970e4e33ea7493a3f0d9e09d559d60b9ba3074e8169ee4227e6534db8d1c712502d4f8dfc26a78ae3b3a0e7810f3e8e15e314f6462dc94bd3c88d875b358bbb3f010073a428294231fae84f175413d1c84e997887c4fdaf85b51112bd2f7c655369edd5a5772bab33c5655bced747da7d5ef06d4a2ae9333d5a3388a23b81ad9f5e421400bf7e6f564782e2177cfeb57ac02b3c4f30d021cc1aafeee030ec61cabf6e57cc147ecf68621657d5a4608a14f8102725a8991971483f273c84c843bb3033cb2cebe1ab6c66840895ed6441eab5f987526c26415fe14cf6d313647ae23129b54c1d81f9791cc9332d35ed688309cb3200b982095333f507c9706cad5c7a23d9fa67f1d9c8a804063ecdc4dc61c4fbf73b44ab477619012bc0eda4209f6b3c0b0c4574b021fe8531031f6b6632a1cee79597710a805d3d0e0dcdae0288bb2f9deaecbc35aa379ddeda20ffd9fad482c40de8e44b539d08073b2c5f82436678bdd25bad028c29eefd86f77260d4bb3852daae778f76261e255f8a925f8678bee54afb389e443bf22826f5ab5672af10d5e0f2ad9d6db3ba03fbdc5e7d42ac5bb380ec2520e708a6440d0878125754871fc7888d8f82309c7b8d7e946b137974407b11b560e77b5c916477c253ff96426e4d4844781d4040c01d3806975c8fd0cb24e9100dc9bb224d1954ee8d3129ce307a60b80b6d700338fc48156b341dd209cca1bb180542bac67e8029e80344679c9b82a5e931de3b1eda64869dc561c7110949a88a5e7243342632a20a636f812b4f540bc5b8e8cb105a8d551fe589aca5871ad20e6d7a9a0ac8d1d324858377753020e7610052343b9875f9a56a926f944a4f274bf18f5a48a1d8a742300cc466ce6805133007aea5e992a78ab660c89f9a74ff4e850ffbc4f1faa310e4b86ac374da238a3214c073bfded9a71c0a33f2875194435fce2a7ac44cfb2db62b07db32f891bf533368c6a50f3da0995c95f968a7e4c5df2a51f3e30a8842a9a48980eaec1c71a25bbd27a54f8c99b6da16b70297ad61ffbda1ad2db29343a3c4083d55835a4a631da85f36f998d9ea6b82e357edaac79a3decfc88789832366fdbe8158c95c5e515d19aa3330d7d078d6c98b602d770e3de256235f50d01c4153e91b32c05d2d8117ae6478e9a2dd6996b2b1c5b5c8ca4f5d655db79022b6e0996ad0a784dc231800d24c81e3700e2658ccc4362e5edaa70e1116784abb7f273e397664254481e349232ca98494d25e1fe11e8a425fe6574e328aa44c972c5d8d6adb2f3f42b50a66a5bb97a6e1cb36f7a7630211d3ef1cb34b4cd7b4c7d04f9e8c3ab6ba65cd03406362dbb92d26a5cba03438da95d5d2d954473ad6a5d5c74481cfa4a511ac25518362279988c64dfa08a87196bd8cde3f79ca177ea0e090fbedc4d2178bab6f23f71e28a5e89d5dde0c1a108dd7bb1dbffba3530b3e78a7fec0e10abbc46345292fe9fafe43c69ffccaa6e69432892fde7b5ed90c298e87d4bd812a17fd084c0b5af8479d4abbd1b878bef77fccd006c6df9ab6244c5bd70852640e07ea15f6faba72bd79eeedabfa4e45da0110034b1fb10dc2513ddbdf81e2da9d000eb03673cadcc382cb4ee2cd3638b52ceeaa588c9c25ab21efaf0cbfe9c3e1b8c4fbed3e0a4d483141b0b072f04bffe779a0c4031a2b2d332281551b51b465be58f3d97bb576efeb11a30d27f648ba8400c795e33dc9333c4bd47420c289805a6f4095edda43563452fea7596b2d77127c4d14fdcd9b114e3ec2556a514ef4114316939afead83cb6c202f99e9db0c074f3136ea6d0c88f77357fbb28808e8eacdb2bff30f548290e8b7eff815ea088b103f07e7f1d48e6db1abb9bad4117f947f8e3f0b1eab82630faef110f492005bf80e96b01099c248a986b9c224d544fc24d7a3ab496fe02a8ef34da479cedacd4231e85d5f38e841405d1e82d4b0dd4f7611a4171cd5f4c13755e02305251d90f626c3e66ae010946b94d98621ba14aed95d69dc01a7c95259fedd81d508ab4dd82778e08a388c17c49398aabc70684f0bed2d7733bcf3eeb82b2e43bfe88f8bad72c3e879c200fcb82ca6c1c76264b19390e58226a7c316258845095bf641bd7ca488db2c30ca4e4eeefd00ff7f9d053b796f19f021fa98a6621a83cd2379062537a3d80884b4d040a48f2755476cccd89d80ee6c387fdaf8abe53c76c594a793ae1610df2bbcfd63a041a541d123073d2c0c9f1513db1165f92c66f151ff88eb172959d1c57a8ba5338fd254c75fb4ce751536c80c93678342117fab1e5c4c6dd70b4618fa57a6dc652bb0ab453677670da8dd755c59e22e6fddcd86afdc6d3930b463d1613bdee1103e60965b3cda9eb0c8dab2c2d8a4f35e14f93d653d4a2cf61242f5b86965d5aea84293ae865a7d229ba9b997b002a4af2b28410de3701ef69b0b508edb4bdec687ed253dcb0b264b479e83f9d6a8114a4658b4322386ea3c638c1cc9e44858eb995d65bcf6f86568d231c48e4acf9426c36583865e5a6c33c30796e0c0000237b15d8c9414b580d4cd17787661c8ad0c179fa1490a78eea595d3f6a175b87a0e1a95b5290f118d1d6d85e706ec0ea73d6c3744d432ab52afedf08d4750585b8f3e97ac3e493e5ec4c9dcfa7996ca2f8ddde640778c0a3c2ff2b46ec5a99fda43eb6d9295f859418f4e77ceff8a062e4250880cb4687881252139c13baf33539e931fa9d5dfc12fa669906ec56e736c1ed8cac711c7b8d01771d2c3b6382e3985d1a950f17e650a349c6295077a98d737c38b187cb331ec3ea10963be141e371383e2a6efea28013f83aed119f64131728e1eacfb049e553b31d049cf4c63c64cc23a69f92700f97526eac9aa95df640d4cc4c6cf79af33198f7171dc43e00f18d3d22d1e962676e5f43e01fde1135dd013236be3671d05548730a6ec4fb3e3c4117966094d4a48b17bd6930120d0811474e39eb33609e363b454ec4d86eee0917d45df6886639a7c5f9388e38123ac49beb856616fe200f64da439244855af92abc11b1031728c86713730b3d84985445be5a99500d59539dc2cb6de10bf8e6060fabfe47a4796d1e04ee1ab5780288c0ce975a3dcf9c63c79853868de33f35505022ccb83a52ca9a2842606b394edc6a00102655289a3a0f79901460c32cf10ef69c95e21ed719ff001de1c7314d820e3a570a4b48c7f11b503a88e0c284dbaf2a1f76d8dc5a169cce965872b161382aab0abd50fc95b778641a1fa5f4704201ca11a235aab41ba5689f3060a6841379ab08b55be85bed7e8812732d13e7575fd6b2917dc057b53a9459ccebab11becb41d354edab599689fc84eca4b85f31b57ef280d5c2a289e6be691014a34ae56ff09202413f264019cc98890cdb2f1a54bcb1b6101497a069a9517cc74d0f7a44416166aa9729161605db49d95aba5621c8e92db5cdf47219ba423ae96c622fed3e544588891943f536832c653c45039ee88ff2c87f36a9482ceb31c625d0b638b4b7bb60523650886227b2de0e211b80bec600679185e534a5958c4de602c9804927780c242bba1e4333727cc33fa6c2ef3653c1953e4383b7fe4ce798d7e0768b2f9e696c6fed9785847d2a6b1b336ab20feca0d328a511ef395fae0aaed0038ce56fbd771ff47d621b985dbe7934a87761e76767e86627e87830b5ded92914d090ba4bc0199ae72d9594f0354e467e8dbb18104383de2d8323f084fa9a89d0ae60855221505cea16280a410a7f5e9567df099decb13c44f00787e4182efbfbe9e69aae084c6babec717008f49fa4465cac54423b9958d15e1e6c296e1111033e608e070ec59ee7b0a50892acf0f25d8756a6e205a2092e1e5f2ade37278f894117c19c20daf35dedeb6df57d69183c53c6b2470fe591e306ed58befde135b0c90fb55098b3207643c1ebcc762256641aae3e57a7f01efd1e086d18031280b2c11d3c486ce67c563b9a036a2921839e048fca52cd995fd9867b7784fe40c5838a077d03ac5f034a478e765b30ceba4a07c2092e381a1a1cb94e325c650eadbb387674f220a88071098c2c2e3f0d1a0706f8f915b4b7f356f6c6e3fbe31aa00692cdd727d45c41e3805a4aa6ef74a1de0241b395bd90416878df3e9164ef2df7967b4b29934c010307a6074b075c00f194c587179e62caa90b1b061eff158677de13e40830861801c609a32150dd05872e6b9831c5481362bc281746a63830916996296dda51db01c923516477dad5266b35dc2c1170e6c08f0c27cb2a9e9a73ce39e79c79564a29a5fefde458e8b84e58eb0f4d1b4750f37cf746d0b4eb9da67d168e3e35b17b27734dd3c4e6a1fe95b9ab60f0df4afb6cdf4950b9379166d1adfa958b5ceb1754cc10b9be06a343395358bda997dec9018f348d5c691ade539d694e26f7f99ab478947ff12afee45eaa9483f129eaeeeeb6ab3027afee6ec96ff992320be56b1adda6f2fd7310297de4a0a27fff8eefdfc2eb5d0e125479be55214f2b522da47116ae5fa54bef01140693cdaa23a80f70f7e9230bd49d524a69d3ed714f23f7006218db6671e007c6a08e0b470e8be7a78a937d23754eecadfaddd14c427fc9f42f85c164a623d04ca7fc156c96bd33dfabcfacba687bc74e9f937e454cb982b9eae40aab728d29b5fea4eeeeee2468b93ed129a65bfb033e41be06a4854003f90464c0b2881402f4059620c0222aa8688a84a4a0a32025b07c0764e101684c1096397ff2f84fd9b2e7f4e9b3faf41f9f528e3a3c7a9cd0b19a83c78e00ca8204d9923291d0964e6a2da59452fb945a493d4f0469f737f4bcb97d06c06cad18bba1edbacf1371b42e0595d8b3c5fd27e268ff8d4338da9bf089dd7b6210a63c6daf31c30d80794c2167a0bb22e82cdacd7f1924de19beb3e8a454fea4920ab9ef3d53f4617ffb7b834c115a7ac0bd8ff9dab736c3116ce9c17c6bc37696e78d4703e9579e4c3f28081dba3dbdccadd11f69f6397e8470fc64ea80997dd4dffe47ee25176eb9865cb60d246daee1b6ddfb52c4a9a20ecff4bfece5a66208d9b79649f92325f61403182c8d4459249598814759c4434e99b0c31961a4591c57a8598a43de2333d6c9dd63fcfddf5f39e4ac291f2081dd47ff92e563c7353f8213890c92d946be4dd82d9ab07a42f273f80adef3f9cc5c1f9b9ba7f99ab77f13da843f5b35a2d81ec2f02f29f3ef95ddf7bd4aa592f92bf322749611653e48c6bffa1906c91d02395a852bd48cc589447af07d8ea9fa689cd5fd779cd7bf5bf8d45fb24e0674a60f0fcf196a6a5af9f605a88b922d61c78e1286807cdf3d10293cbeef9c851e0db4e5ef1d3babbfbda77e94e0cefdfa449c210fdf7b6fdf7befcdb4ce0bbd0e502c1de31d1d4da25389730d8606f8989299bf9493544b65592682948c92c79f2b25d540adeccfd9ebcffd015a80fb68b6e8974c95485130b1096b20cff739205346a1c026caa3fee91defbc92026b22cf8defe854120df021a980f80052601a22ef21817efd9a699106925a6868a0166514d3880c9252480f2493fcd5132967912bf101acafb7d37777ffa0693bedc8be0b5360a177e6b35855d46931c7693e0d256c36655dbb8ae0a37ee7ee2ac5ac3d4e60a2c70e6735cb0059e0b1597787f75cee7d7babf96821086af6b181a06670fb55b86960e8e37eb7fadc65f0a3d5a0fb6e9c90355b3335fd346f13fae8a7f9db373634e18d8d8d0dbe11c77e10c86cf3aa0f42137e369f57df8d2d0dc6cf9aefabaf1169c499d5cb88dd7d1c4aefdbfbc615ee8e128678f4005b6a95e4851bdf882a5521f70ad9861af8a747d1102fe12ceb6c096b5fe98d9faedddd5bc4b2ee41041e1bea041efe527a365de4ecbddcdfee6f275af1e9142b987df8db97568793e06fffb58c6f3d12b66c7db4ec7e11ea37984160bf93baa76192871fe71cf572310d06f9337b2db3ca749a55a6935400d1bf340568ddd6b93cdb8a5e41bba0b9881de8af5ad8e441d6872c8d4ea7f9344595332322ab3549d3c29d2be65f70faf0b8e5c161489e30a40ef7060d597f3e08fe803f3fe10938f27b38cbfd67e503a6587445b775a6fff06007167ef8d81e88a7c2f401d2bd7b14397dbc97b22c969294540f129ca1ee7178dcb0a5b423f7369459abdf63901f297459d82c6bbb7b64b1e02c7f2aea0425e17e4b24fbee16650ba6083a154f1c3ccef219fef0f0fc4c4fe238119c2d0779c0e011943e64a8893823ccdf5e84f9dbb8c2cc9af6b69338c9893c3cab253813693aa027ea3e4c25b2c80710057fb6af6d9bc8026bb6fc37d172afbd099b96fde5b82bfed87a4c214b15749c355471a4e3c8cf8a8ea214f94ba31851d13750c7728e7a72972cea1da762114d96854adbef811df6b5dff11e60e10336b2268e597b29c19515b88a34288a6c4177aeff75c504cbef2ccbb22cabf45f4a29a5943b46b2e621f0c89367965226ddbf7ddf7b174d68f1df5953068923fdab850f1681b51fc11c0dc716dc4c7411959b8916c4f2c89327e8e9e0bea5072d8ece851c986bac91ede6893c1a0ff81a8fb362803391a60b02b7ccdd54add0388eed44b0451c2404ff68ea294b724932c9a523d963fac87e0267eb48f5eef6b36f29f698d6fb6765f720b057aca738d0bb1ef300f2b7f027b44132cf6a1822c8860b2811e44237d814cb9630393f7adef2268edd77cf85e3cd3299392e6f6390bc6ddbfb6bfed459dae7f0dbc459f63717ed3d729615d2c4fba577ac8d2f387b7989b2fd9f256cbf75ace8e3837dfe4d1d27b88172a44eb8add342d32016e02985e449bf48c57a07072c83bc85ecc1b86893ecd730497bda0199a3bcca16396603762f50ce0a9a026a6ace97636247fc788feda9afbdebd6b0368bfe16024969f692d21f397b993d7ddd50ec567dae83a60f42aed9d70a8852853f68563d000979be0c7b0b6b757f179b3221b2274f4e509047d61391ee044e90b849e09b1bca490942d8514246639f0e3dec90048a0f4f20bd465687d1640926b01b9a7891e235ba9cf490fd2d069d2c7112431e594f5ed0d802af5c1006abaeb044b46857e08f0a194d94a4e0a113027bb9a19a2c8102cbe4866a22244c199f15fce586ca41aa3a793630a18133ea6c7841c9260484d48dc116712e5b060d9a16a8cd5a171819a2c48a089560cc14468492a49a2892222a52a4048922423f3429c1a1895014a5992a304c93bb0b194f5eb0e4b2800c19b4a8a1047f5352308e7944b08a8b6a097f4e705ee0ef889bdc5dcc90c2873b59acff7f106c17690e52e25abd4aebda94359b99ac34e0967365a5525a59ff36c57f734f30673f629acd6569c02de7fea5af859ee7a4974e4a9375b39b34e76fb5d276db37e5b0d5b2cd53728df20a93eb6d5aadb3ae60a59382a0b5e2bf8dd14eafb4d2776eb3f75389b9d227ad99c6b5b659bb5970d3382ebbb7761dd89bf7cdda0ddaaf5bf3eeee76fffdba37187877534a6bad19a595764b7707b1d6455ba97986a154daddddb34e9726676fb6879639ab9452cfba2cf3acbb6f77679dd734aaeec6ddfdddcc9b9bcd264d366797d939e76754d5b5976559f677d565abfa34137d544aad8743412cd3ae0faac91529e51529e5151eae4829af4829af3cf170454a79a5c99355e34a9fb46e3603294869160328c4ac76428fbb75992c228bc822b2882cc243f39eb85ac20e271a428eed3baa0251c8e2fea59222231ada037f6d8c3c228b3cf17e3c070455b24891ec7fb94dd56d76934a0ee2d5ea29b5788e61426425614cc0008d90646ef002d227707822871f56eec58b6030580d39a440666682b1374821f15044c5088c111819d1d264898c3562a31f658fe2511e9b453333df59f2cccccc0ae31ca81c94f8de7a9ed0873d1caae85eb6cfea7e8bb15be65eae3629b69aed89bc6d4667e4ed862b46463c074d1ce118c1004ad129606204b4240a8bc7e419895f60a975896187c2408161c58b192b20a2bfe85234250c17348000e34529a5d4de90b44465852e41a279426eb7980b5a6e08430a115008752942055ee010a5063040703ab1224546d499412267368c415d88324319675c09c3e435ba32fe105c31156bdaa1c809a61719504f20b1b5a3e9304d951cf450746547d3619a1e6a0394ecdf1c172ba0dd40ad5c5f467dfd5ba19ce5043b5014b6af7dd572b928513e39ab7efd1c272c9f2494fbf40a5e7505596a7156dd826d7db081e6d49828474c54da6cff1ac048669f2e7027fe90d2b3e5893fb07fad415a388309215fdc3024cc16afea638bd809a87041080c94bceacba7fa32aad2efcca3c5a8828c2434c060af979e96bd8fe052b2d3270d8a162b2f4a88acbcdc34c0dea154cb28cdea9cee02317d0517176218e202236430890922440d5ac2a8a10a315a10e68749e7558464712ecc114962f842072f8ed8424b12349c0bd380328c1082891c9678c1f472ef68ba31528841154d68e1e50b274dcc44d1059727554891d1f4a455c18d9139d1648c37f1715eba00b300735e27c78e10989062092b4b340c718286ee82059435ca8851b1c5134654268e13634ac934246b05c90f540b21c78e1234f0c1245cf2cd0d95e40918b42451228f2e9b06a6b9a19220d1b59024885b846d6ea82450a0acca0919bc319f098a74337843105d22445d12114784e93a91619b418a6302831db31d21d294ec112222990c51da1a31d4a66c0c111a029154b5bf7d31c3e4d9442d8e485111430831184119b9622404198e6e6eb063602f7717315190e0ae891d62090703b6b9bb8831b299a08b18a22842b42398e6ee22065693bb4b19360891ef5e5c3bad46e94bfae35865b5996561bf8d11cc28ed3580668e497b7a524adb29add2bd29c76c6a6aaaf429fd72c89836e6de6ea0acbbd2d9ddad5149ab80d179d6accab4d6bef64ce70c42a50c73415003d3579a0281e93e480473a99e259c00253ccaefbd9f2fa5a68a3a774518873e852a69a9429f36ed70e8aba8f8948a3cbc57fd8feef10779656a50f1078c0440c42b4ac92182efe3ef7e35fe96195146f5de8fddd485aabf618f4e147bacc41ef2e585324a044904821a38cb43425454f53c3a1ef755a20958c4a12674403c91051c2a02e944ef8a3d666baa443b5b13277bfb5ae64abd33bd08e9c154f24cc1c9a4948592f7006f842a4a39c6def7d7157f90e0756ba6de08a374ca3843ce9a3d8718435ff773b812a5d962ea9d9944b786e00262c973e50276a320232c7f896ccdb7aca825b2fb4d1c0b904759f4561c0520a5105249faa02475c8932580ce950a30956628f2f91ec53a9e02e267d5c0840c1224b2c401954487cc4af94d79a441d2444ed6b4c75a6820a6c9d5268f39b93ead6febe38ae4a886a7946a51609b459e8fc12f79d640449e4531e4c972ca34f342888c4ad008262a96605f5401c38224a64b10f09727d6e4d075e1cf6c9a539ce5b3ca5c9241338909e553cbd15ca277fcc78944f6e726d3dde97afa74affe7b395aa9f56fe2ad93c4963ec52c4ca5e42b4d1f4c04118e2e66326d89ec320827975a6262b2e7f88ce2ee3f709de74576f7291733e606af7c892cd96f7cc6bc47e6fde717fff69f6392645fb9bbbb3f552a23bba39147fae4346aa45eb2d358f6cf711f3c067746767777777777773772c3193110e3c405ccc79061862e5e189284f41a699308284072068c88294938bdbc8a178e8c79418b2b86c0f0b289c2c6e61b4ab6b1b199f245b6398112d9e6693c219bff20d77cb3c0d2bccc162e1c344f9e9971cd24d125cf3cf824cffc2b1126cf3ccb55439ef99f257248e28893cc636900ba62b2925730c8ab5779422bfc19ff477f4c6044b6b0fc7de7097d1e8e3ce6644f277baeec798f8f68cade834bb287c414d9833aa2287b7f3d218f1505cbdd739e5047abb81fe43127dfbf6f71c8d70831f25d72a2082c7f04862760997b4bb56dfb6ddbb60d8dbcbde6096dacb97445ca10b10c13b1a40a27929801851a30ace954a90f2a5119028d5c7fb284d8a2c5194d588e394344e58900213f4b525906b1913740608be54b502aa9364aa715504009134453182d0429c28a14a2a9a526b038d2054989993c764248891a6248f6efb0141833a48248a3c9882118aca00b198aaa6051c46b8c0e26a094524ae9b51d74c9fe568817a428657f0e3b51e4518c04dea4d3e4310784208c647f30885809bc647ffb2890c186d8941748a4d1b384125088b1c61640bc2891194c7ca194d21bc402bc021858d6244f07d94b1025fbb71ad941f7256b64f7f198bbbbcf69294da639998679bca14157590085ca637b69305dd32699be8492411e65103c0491e953ca43984c1f84b294e93f1435327d560f59327d17540f607c8021d3df8194e90ff5f02196e9a3904444a69f02914ca3649129d40f44c05e202a3a92e94ba3a32599be04828b4c9f2acd50f14289922f9044c12288d2971d98f8a24412519cb852461313ce052534904f316e3b70450998a0c089520ad01081132bc218230b1630a5e0456130a82b5674940663fc84090350798345f57dd28d5216252c4b5796ac6427b434133dbc070379ddb480dcdf63027250eeefef4704e49f06badf0d02b15bbf5835c3e1b13dcdbe860b65a8e25437aa1b117beb26ec97fc1e9cadefb95066fff954c31db3f57d9b54522d492d9cea47974b99fbdc0b657e157a2fc3d573a17c0fb99f099b98f0ffbc7f72ff97674299ef5e15ae5e761557ef7cdff1e4efbd5026fcdec3f18303202027207f4f12ca5bdf4be9ee1e0028f0289fbc69945af2f79f5ccadf0d483f10515f65f4fdf7567ac9ab3490e7597c1e45fe5e3265ff71dfd8e5efb14fbf3e2c63524a3ec928f79edcd6b19a26b5eb9dc5553ecd5615d9244539a577b4cfe10a40c29d35abbd8c4d6b316e4d05ed59d01e05ed532872ba85547a22c8cc817efcdcbda1cc69c01cf6e1c8ef973d922f8fb850e8672a05f059b639c8238ecd134af25fc17de493b7beef4ea33baaca513f31cdd6f7230e1c1e9fcd7429801a8e09dacf9f22101c1ef4a7f6d7614f4f0e7bf29e0b75efbd5f3da1fbf2db384e02415e2e2611fdcbc56bbb9715f80320f0289f2494ef71ab1e6cd577abdeb6eaa727a47acf7b1b5a6f7dbfbda4b789379459feccd6f7360b6958c3a609e5ebd60f825f137f48c1e28f99d7fe87ccdb0f426ba59526940971f04c8883451188f6336fb59f7920f665702020f3f64d98f97eb63ed5f7dcf7f7fbefb770eca7fcfd954c73fbe2adefbf974cf3fb1cabf37dffb1fea5287a11077572dc95e4efa538da4e9cfa3e004930164614c973ea698cf78cf2686a69a0eebfed3ffcdfcfa8e943f39fcd7f3fa5a6cfcd7fef58ba9d4bbb15f9fbdebff728aee44cdc7f38aaeffc7d9fffb7121df67df4bffadfdf84d60f70df86fb9ab0bdc5fd8ca2832493f4e0fb4f892df9fb7c653ccf84fdfaedbf6ddb7efcc91f75d6f734a14bcdd6f738f42fcefa7e0b3de6acefb51067fb9aef970dedd3bc09dad78840665e7b1aed81c8482619e459b407df7f2ac8df8ffe8d9fbfef65c2efddbdf4cef70a40c238dd8f347fa29408f42b7b69edd7f2297fdedafefbab0a65b6de5e87c5efb3177def46df3bec7b27fabe753ed10785d588f1c1b2fd0de62cfb721392edab307d6e3e13ebcd676106d913ea3237c659366220fd56b94cf336798f5be9a00b931e104d9f6d6ade28d32703fc1eb7d2718265aef92e94f91235504eb67f8b3aea46395d279c1f9f83fff13265fbe36dba441c58bb01c622f7345bf66b5e7a4235a19d0a6d1abd633f83d0c666cb3a599997f91177b788b362f81639cb7e265e226705a1008fdc93f78c1b2cdbb75397a877ec1592af9006ea7c13cb562a5b1b996f7454e91dfbb7c959f635082fd3bc5166cb3e185ea56cffc264d0b5d2dbd4f4c1e278af647b61d9da2b8e185c1d8137914b8313e32cfb406b604e4cb6bf15d91bee69fa6420da23d01e714ff6887b02b9341a28fb6d2adbb731689fcb45b7ec5b2eb80033daa36cbd6c5327349067db256a8cb7a26c5febdeff8e74a4b99b79cb025dcd344d63a2527d7b9e2abc1fe6cf02f97e5fafbfa357b42457b2efac33b1c5d672e74beebd97f2be9454641985fc04f464f625107ef93332f6527fad443b036e5677ef90ea55affaef6ff737cc1d16bb773e9538cafc89378817f6b83ea4f3b6c7d08d7e2da354e59914a6deeab7f80c2d64e3ccef29dede7121a0562dc13ab9a150e04213fcb9a1a8b04043830a944705ce724351916253c233b9a1a82cb10415a5145041526272ada042430f545a18f3f6410b5a6cb1c536004f8e90c4224d3a4f5ad821346a024017383c0d4522161d6cec50145a17d2114a38b0d876d807a6477a926403274a36ac0b29c9911c8b6d87718071e0b248448a589c6cadb5b607256f35936dc24ee0d347b162de6a1d3d4879ab37304303a429485590b42041f91f811143064a9a70ac6b0ad062dbe124310d906872a3a306a70c7c28b2d65a6b8110e2ad2e629578ab816802fabbecd1112635ae1f17cf8f0d41d8b064c3941b7007356aa0b1d87658c70d4ad3c68671642607a21aeb5241918cc5b6c34960de6a221d498a68c0296858e9009bb1ae1da828c116db0e1735c9eca0644465646a655d3b18197d16db0e37796a1285a1769881061d3a34a5714487d1141846928ab69841070e515d8a743cb1578ad81c9cb8258a684ca03009a20445d6658d9254d78f8be767c9d292291a86d2c1083552c488126f75ceb0cb96a164ba7e5c3c3f4cc654eb02834847114c8b221d479c9c6c39d2564752ecbb17608b411846ebf382bb05d6f2e8ba4380c1f9806b72770963059230546844c2443145135f11f8e6ee12c604aa24b04dee2e6190322cf0e7ee12a6056f0cac1a03ccdd858c183435711008840e4651ccf23bb0200065b955db797aa1c592bb257fa3dcbcc1794274a376fe536ebaa764523ae59c18df8cd23ac1488940bf5cdf634f489b736a130c06e66485e06c59d796837a89792a1aebf151a812a8538ed9e5707a8a9272795e05a3fabcf0b1709158b858d1551a0b172b7250d6e3b054ceaeebbaceceec0574a377a4d4b1e24f1ff9337d7ebc60404a536df5db623d6c4ff6b44245d5fb794296b351435946a57c2dece6ace10ffea1c15dccb5fda497ba6c7842b871544e1cee3db2f3bc26fb6f3006406e10433fe50f7ba73f5f5aa94e96415cf96a569b619b535a3ce9dbb073767783a0b5dadbb809e79c737663b15c7006416bed0761ad139c93ce39e7ecee06416be79c73ce39e70fa5e29cf659a05bba85e29cdc0666489fb4669addb8ed39fb8431c6371c6aecd68531b6b7d35c2e978bcb8040081b68fe66b5cd6a59a5199749ffa638b4c9066aefeb341b628c31162efd99e28a29f64f45f1ac7456cac2ddf299f6e1de5743de729cec42433a543a37ae81fca7d270688a1b1e9a7556ba929132ad0f7e68e8ed4c37f4eda3748f81c95c2c6bed83e3389d62b5562aa574f739e7389f52f79773ce11fca594726aa9928376349d77f79065c5c04c39e5f4b029cadddda5fb94534e9c11a44c9d9926b5df727b52f3106704cf32aa518d8a4319eb674b4a89e367d3b4eca60cbcc9ea09512b3717cb2da51d9b618f1226180cd474c9288e1b5028a594563a452dab56f39e4929a5f446ef349e22eb9dd59482c1400cdb5aa9463d21ea366a68d2a61afe484a29a5d67f862738abffd640614a29ade9f294524a5d1cb761518a2fb5d65a57344a4b53ad95524a2bb5b556eaba0277961994b2c810cba305735ec76ed9477dead2fef63aa415897edc3559f46db811812ffbb7769a563f876ff669b5af59e9d96fcf8a2ea9d1afddadea6e30b5d65a5732b19aa9fbd4b239c75a65466bba3a67bdb436f54fb7fa277735ee35ee8a1ba7fdd5b8396b959bf60c5082e5ed88ecebfe160a81e1e77545fb44f6d5891bb7fdedee5f9f33536e05767303678012cfb3dc6f2a15c771bff2d5ccccada9b9b95ab21c54007dc37b469b3ce7cf493329a5ddac13836f394f68560d72eadf1c4abb370fa7c1eeb7218a1e009d3a00fab76f07dd166a6fb7d742dbea66786f643f33d16e2f02fb38f76bf370a4153b6f36f3e7c4f17383e3c1bdec6f799439c98a3f48f0d2c47c43962c43926c4142421a92640bd290245b9ea0f04fe69c73d24aeb9c73de1bca27f9924e5b663665325941421a92650b1212d2902c5b908664d9f28493a2954e5a33cd56ee76deedbc95cc0c4d8dcd0d78a3014ece061cd800c07dd9e973272cc9c74031661679499368b6bc068a49a4a3e309d10f40d72cecf48455e0dbc0a13f71b08193538e4be178491ef358187a42f605b0fde408614709433cb0aa078e067ee49f811b81ee4d49ae04806e00ae1facf25242083b728e29d5cd274a292f9c4d369ed010036a089d08e6b0fa0360e968f6c79be7d20d1e1c5d85524ab3c944c3c3649a3e5c98bdecadb586dd6b7670c3d69a65f2f5249db86c36cd294c359e8c75e0095102d01e27a0e03dd56732cd9633354d27239f6964d4e4a8c6683e08ce4681664612c928b3e52fe325c9237924999a92a452cb13b27f63e6a86fbfdd6a2b4fa8d2264f688a7348b52385cf4b428185d97258920a04d8e95ef53da3647fa310dc671acd96d3474007cda59fc934992693ea0b3d2fa05fa8446dd944b574664600008004b315002020100a86440291389046921a4d1f14800d678e42765e341ac9b228c6511403410c320418021000c41860903145b40a6d916956620e8c58b37d54eef245da5b155bea42f3a11dacf81057e1df24e24b3a190b16d2d4b1e62f2937d08a8f33b05fe2af77d11da4c9398a2adbbdbb95974b42947311ba5a53ccf73502fd8f62ccef9cb34b3823e7b2e8d8f7457033735be9cd65aa6ebd83f3d0fb7c480c25b469c6858b20c8d549808d634b550476138f513aaa2efe168b75d8858415751abe183cf4eeb31c49b2a3c0c746ce03fbe5b1e0af7615314f012a284b5b6e980dbbbf00103f60b223375521178fc0a4bd31df5bafb1b3250844d41541a945f44b7ded8bfd978a68896f8aafc8422f87c3be8781a6a7d8a1a0b9078ace9cb141cc6272d4976a924b755b828c71d3a87d715e5432fbac6d3502a6ecb304b6a6606dd18ac2bf784927b8514c8903fa41f6ce0e03116ac97c15af8589b5ee12d39d5b4d026adc10e10058766c39e5c01a91d99427cd6121d17c57aca9b46ab3aefbfc0667358242e0d0b2a1a0717312a48b6d26368d42c183ca6ec5e2c2722a46d4d82757dca50bb6aed971b4a284ba88b799ee9d880099a5df40b18d7bb9879e3c319a1ad929985a3becc42375a63e5f55ce05e0e8aef1d5e6068801db59ecd681221bbac63574ed00be0123d27dc2876dd0bae5e08698f3878bb07182073073d6c3ead821e67596c8ad0d9934f90ae125f08c56a0eed5e3393d857c2e7ad79d9bf93af4810fe38b75e87d97cfebbffaf1d079fb3ed6112b0384416495f53ed681882762b1affad5e81e9cf72d3ade4750a542fc8087338ad20c37b63e6fa3c261e5de61b3c05ae1650c3de4ce4b4d87365ae249ac6c0ca0a818580305c0758528688d9e2829ee61d982e8c3b60ed0ab791e7a771abd60d06a180aab63589846fc65ab07e8d29c8ca69b86ee03d2aca554873403fc0fed71fae7903c2318bc34269d82b582e67c434f4e32aaab3afaa44198c45e94dbcb1b95b6d04060128ee99f73ecf0641f06e5751aec2b42f0e7b2a1609837bd7fcdd21498bf7ea219a5e92695eaaefd6eca5bc78c9cda1594fe1e40959720d3a3d8b7e5b2750ede4dd2d874a316461d5be8935e05a053eb58b5fec4e06e4589adc2de16f04663d8e37a827a9a55ae5de0d64afa3d1efa510a9b13e4599a9bd6e2dd50d38c4a575cb1dc29e3850574d5b3958f13bfc3432b2ae570822dcb3333ea2531200a94e874242c4b70e888462c4bf084967145344a22003420d0e0c956631492008a8516519cd0fcea7be6804e09bc6a7145e7edd58455bd4a814228867858e87f4e0c972f9c98df63a0179db413ad65a014d323766d5556b3d953e95f34900ce9471a290f951f26df9004480fa4f61e70f9c6fca2c46e23054437d45bc50d654e9c64d52f54ff785e8309080529fa3c095b72bf81c3d77c5d13c7509a52a74a4045b8988bf6317e831195a57ba89720b0f957bfd88cb496c82d7a9046d764cf3d20ddfe7d30269f44b305c762f63776b1a50ea21b52d352a586561d7ecc3d80552793ff6530623a0b5af3f749c5886a3c5105d6b39912d740cfd41c84be6f8699c4d58a466a7d6e7055d68383d613df19c165ffcf18158e427bbab91b74cff2b4105c889e168be03c20287dcd18c93667765d8caac025d36a8db9cf8d17283c0de50709571f90082c0d8ba709ce94125f4be8f6666a296d5b3b0f243b699d1bd92696e3ca789d9675ec3ce11ef78a8742a7e97de1e698cc81f30ccbf66f7f1d7f677da7f7d6e24264ad236a9a250689775c192e99262d2712e452b7f0657bf4ab1a2cbc2fcbaf948d0e29d772efc7652be3540b2031fd504d7e9072cdf555bc09ee79f704f39d706cf1947590bdb2d0d324a1d174ffc8aa2ffee0229ebdd6a75630a705f280004ffb726cb7df248e7ada78236f328b56ef198c9000581a79c1eaef57cc0576afe52fef41aab2a477c5d73341130fc1e4b358ab2a26419c3cfd298d7abc04fc80a198fc7463570b53dde0ecfecf2c7b93816cdc8bc145e20d036448f13ae47734ce854ad4b8db38b4431f7d05ddc0208e0e27271260988c1ebc2bcb3d6b4d98a3b55c54c0d81984956fc80f9f5ec79456b0305daa2a275451b67858ab06b7dd9f62b02962265254e10df682fcb360240e6031769baa2e88c714b7632ab2dd0363667531e6587420fdf257fcf41ebec6af34e265cb49dcb40d010e1c92c9ce6fcb2b7db9803c841e01027e93bb0eb84504d337ae80ac0c676bcca8e9afbfe043ebc7374014e102ed9ebe98a81a273aef766f334300309cf705643327fbca00d40600b571b9a6a22bdad93d8a6109222c0c87e6f9df96f47df94d00744c9d449de9793eaa66c31203b65d458e6e3dac7dcec378753dcc71f4103bc32c87abc59c0a3c47374070be298152437dfe6dd6b50311b8680c6e06c96a0d9e84ccd581e6d1f04e8b6443ef004af06f976d1857f2a7b2b400666361944f79cb100fd1472d5ad2a261055250ed099eb5c8b12ea6ac426bb67d570a25b1c10998e878d97a536ad83c82e6921821b3ed246f3a2dd7522a742862bf335f2b35a5ebb31ccc8db8be1c81327a5a3bbd45b548ab5c47416dae7ef1490148c62b7d3834e1a2a79a15b0090a9b990e985d2861878b2aedfd75edcf9fba90633db695cea43f30fe0094f31ba909a8a72cd14bb030dfefcf61567b4382aac035a1d76e7566e25533c60dee34234e1efa37523d220259627cceb40762edfd30156a7538e6719720b9676393f2e28c722f96153298b696cf3c0b5d7fee2aec84eecba3965e9fb7d7d3680ecc43bd0902bbd0bf1098ba9f9276d225548d69c251b8da579d70612e2be1943e4c0090eb4f499868d51584a51eb071d8e6b7b9d595d9748cbbb902f8298774aa3e2615cd59f82cd2f6d3d16bd47c2e578e72506a49cf0ecddc40bed31e0d77a6e29d081d1c9451e5110c4d7a9f857da3deef7db39496ba48fa08641b77d4b1c61814b09df1b657e629508206f295fff4c435dfd259a04726ddebc7540789ae0ec5c191b2179f7b30346fae97b3ac7f0005f75ddd4da66ca7ef85c024523d76ebf71bd29510bf5cd9732f533eaecb425a30509825ab8e40e34b11de98057fd311d3c3ccba4da0aedb1c7334e3f4789a36eb97a76f22e6fdd030f978f7091e88633a909adfa74bec36f9a7f239971e35f4b053725e7379550e0e13e88c5cab75dc6864f7fe6a1616050e1f8f1cf32ca93acb311d8458f743405bc95f34a5918a52beffe11d8598b9f95fa4dcf44c2512cae624f3dd63c1da8f33779a0945c342a101d28d47a7f64cb26e6ed1a608d7ad26733477db03b8b700ecda15f598715ce119c3845fad82d806168c78b37c6fd4d8518c2ec7d3f23a0104dd8baafc4ad2cfa3d08a23da2a7e04db11f3cefe4a8b02c1be4b78b3a406fe049f7b8ab8cbfb6e48103a1afe69dd19026ba2ab23e477c9e68f27ae3113597114ee84a40942b2c929545629d964452bc194ff25e71a602fac429fda47b6eddb3be87785668ae60fa851e6406237b456d63417cfe264596c8fadcf9e577cd287c110d9cbd405566fa30b5fced956a6f96e0463a16e08f6d41185542c3647620533df5141d81a5480326651f8d0aa95ce2e5bf62f4072e17b40406ac9fdab54257606c65ac937e3776f24a2b02bfbb7102547e257b5c24b76bbda887300a612b7f4117586087a4563e78dea045fdf5441c52bc810e1738ac247a54f05fbe4ca7c87b2ebef1a8605590052caf7f124ec6a9e8f59736c6f671f5164a51401354e7b8a79720149fddfb7a24f2ab030ef1e7353c91a8024ef50aa3be7a1ad30cfd9a01faf33ad2b298ae753fb017f46139674ca244aaa715519a82fd569aa10d63c56d6d5fe3d2da7f622274092422470cb5b010d755b8703e4c90e2fdc6e8b45e3dac4d5b1ba81fdb2bfe57a6c62aa552bf199468d2b04c1ea40f40607d59efae9abe0d52243535e3dc4e57dc1374d0ffe82a910beaa59df453f07210b539e742b9a1d05303ccab01b019e557b24d25d7cf54f134bb68ce5b7b30957d49e114edd5e1d039700edc20e1669d719aab870ec94870085f75865a51c6fe2699e1c4c18aa010dded34d70112a1aae67e3d02cdd36a86b19146420b9b6eb19224bc1ee5cb328bb01bbeac0e86d3b40dfb23873e34b13381fc2ae6d0691719da23d4288ec6a8e64e742ed356bd52fd36ed0036df0f99eb438deb53000aab7f758b12e9d0ac954f3f1aac958b953805b7f78851aa12824bd044c624eb7175a477c754a0db6c69ea96ecb6e2e50c1515e336c2fd0ba42f7c3eacc76c4491bf8459bd20378c611f0914a6b5a17c62d212394aad36a344ab78323ef1d2695caa085e24ea773291412f51fdf8c778637a10af136943c017b69a8ab737b873d1d7197923158c27b1221a96dda1a15692661ae02ce3452ee7fe369801a4eb2d3413a587975b55b7b1cec5588caec2a4e126565a9bbbbef83b7c6254e30d4674b1c47a4cb095bec488d3034224bf0701bfdf3ae718485554561e77218415408477bae4123bd473c74b7fda85ce1cc42b0cefbf765f86277a09dd14d50725f64a0b54a0bc504428b29064502f4796c6b8cf14dd4e7b8551dce428fef22b5b796b732e5ce8edefe93f0f0e0b9e5df7892fc7eaa67b2b85b2be6ab035e10289ce1bc2317251041efb5c6e5112778fc3b80bcf36e6da6c08a7152952bf04704b2814b73c6d13379aaeb16eea29530b27b04f2cdd32eb2c047c96fadbe1a2333a9d39f56950029e7da6c525832464cfc103901b02dc1498089b8ab53c2cba92f969290eaea2535068c745ce07a77efee501c9b9077b3149fc3531933f63207e25de322e5aebf5924f00a6d645953561506a1c860b761ccffc90e774ae7f4aff4bae41f420a12b99f2cf176b748e267ec28ca73bb5acf1fbf8e7acc68120a42f1d3009a58891baa7bded3138020351c8d1b7afa8b3b6b450e648b106d8e350c5431898a518adf00f264eb40e9368a79261483890ebed124996b0717a3a0a05ad290244dc970f0ba2c9b12fafbfa085dd82cf10c7e457f17288c366ec5797ce31fc680853335b8dbfcd1f3ccad320a2b467c63480d8698562f6eaa1f5c5c5a0ea38a80f7c80011b9e02e718a1081076a89889d5000008a069c7760d82f0adc5410a769945bd81787910df212d58b6b0f01010bdb5a083cdb1a5ce5a99a6075ddb84f9829b76faf59cacf41cd3031d167d91e1830c1e5c88b46c233299c3946806ed05c51cd834a578333719a03265321efe8a20e79a0e2730064919505a25e563ecd6ca8c98e0a292830d1db2631654fcce44bb50acc3e232957cfccc560c5853fde7f9f9acfa18cffff42d52aa572a20cf07de87ffb85147e25bca90b7f14a07f9e04980dd9ab4716ce3d5fce0c4a0f85546aa662185bb931f3000c0179275dee29bdb74cd23d33ae9e5805dd8e1a6439c53621d4e38c812880e37dc9060a8a6c00e1f5c9084bfc6446f67aae3147a6d786b612be23761ed939e811974fec9cf1e1a92fb4afb3e79564e9e714dd813f6ad758de3987e37c41558eda4390340fb75fac9af9f6ac10722f5dcfbcb44c5d413e885547e0ec26c29b8e189823788284447e76d3b7322dde764de8e8911575e0d6af14dd7af28cd01bd16ef8039d6e41580e78cb4decade2f2474ca546104e310dfa1134bd32328889f80607e5e32134f9a21f14910f511e0d55e803809545b6845e074a0f4e2b77d3b9d2a48a290cd5fff6ee97296fb613801b7bf3507abc7d1b06a1d8894120c84d6de9f2947acf90a9a0a85297781bf30aa293a69b301451ce3c3c83eabf684a27f62c9bd78d9a615730486729aa993df6fa5dea438cb9437f8f051e38211e9ca73466ddca38f1dff61f66297b316943d5b8742b3f2bdfb799b290410473a35b797b5e8396529d5ba00815e1d928099e0afae79717eb40f5dc55176a045957d444a7a2f7b589e3fc7f84aa9bbbf329040b57027c49a2855e655a13a35c617295552045b5382e07eaa667dbba8ec839b38b249ce1e2bcc9f2e81bbec1fba1930b2f8f9060681a902f3e1bac91ad338d9076a7bf7c28c71276e843c8f671b546466be6dd8b0ca945e4555a9fa251a36d8b99fd301e89c6d7ac6fe80d6e05c8507ed10957d932c8dc1924a6724cdcce52c323f47db4aabc56eba40d266825a85ab9a46a2b745c3595772f6b2f8c40d734427600e15715098fae1118a132141d2d133c518b0e4442441f44560b8c813b109be0e7271cc416b91f4d09265baf4305510b14c07ab1c81211182ad45f120d7276849f828515b6ac96cc5884ae4a07a0263da8b1a2289f3edb502619d50283df6b9f902a0696d22664c8d972dd5bc51695df7e9d2feed7dc56ef5ac43dc1ef657d3ac67c4bd747a18e4435a2c4b475e091b4b926f456dc0225c6f82c5a6bfc02a96c48830b1f900aa14724c15f4255a345255854503149c943c8d1912b43c887383e96f0327038e2fcfe04e153dec15785a1c1627c6ae01c9719e40e45dbf21bdeef25391df98f56dcf8e15b5c30d9994325d3a758698aefb99d506c7b845bbad58aacad11dc07edab79fbb3365a9d9e6ec62ccadae25c0bd7ccafec03ce8f8ca16562d866a658a33bb8af0d325f64b906428df367f7b40728ea24755700d28bdb2e9ed568c2af293b996aba600bb664f4c1c554832dc122856b3fe2ba88be0dfa969ec8e6d9ed853e3d57de1834756cbdca898a5c62608718d9997bb40b8defa59e9cfbd06c91a5e3967d793290a6b376562523584c4f04e69eb2d1836c3dd31606bfd7993250fac35e292ab671ac61c3f50a1f8dd8c57d2b1a7981b9b501c973f18f094eb33135f46412d326b3b41b1f466fef4b5b69255e95a2817a36b60627edf2aa0b63b00109381c6a4b264dc58e01f41addf1802ab195c3c06e5430e326f671a0701d8345ec6714a86e0e03750a2998e771f48747ee9c0e1528d17cf48c73b555bc6d205b04c737ee262dcf5919251ea47f8982c9fcff04fe098fc141fcff3817f4342113b7af5f81cc161bfbe20313b1715702f9b4688cd64cf38e40e76400b9b816e1ee3395d67be7706357c8965adcdb9d970aa9035632d38588cc11143343e8688fc8a02e0b325d58082166f4b2952b89a7325cfa2735dbf064da98bd1247c37e73d0c3bfd902471b354ce1e6b89ea8227079dcedabbdfadb4470302bcb6ec0f036f491484f3c379f0933e713d884034267f941fc901fd3119c7f888bab861194849077ba1cf4a67880c12bf71aa3d915d8a71072ea3d0c1ea9d2c05dbc7437192b1e9147468382a0ecac83e95862026b837b0d94652fd882ae70ed273931fdc5a6efa380bf889019448b845e2e8e924834ba325467aa6549851475dbbe2c1e1bb5057461af9b91fe4dfaf50104850e7c5e421b4db47434d3affb8c2cffd111ba4890e8e8c0d7b992df9447d0d1cda3b5b3d1e5153b3293f9bed0543562eb46a6d4895349b49659f139b8502215b4c398609af22000afbedeabf2dc4c0c26a0b9da6ba09bd1da83d3700f050d5a7ba1805be722b62c062a0cd766cf33ef4f72eee44627a184c9d843d6ee938a8328ace541f33704e00a53d3323f9f5c0546bf23f6050e2577084a4d8d005ef5cf432acbc5fcdc806bd504eab1344ada1ef6e0b1163f7a19e951984b8b5ca0554cf14356c5d579400b9757068c570ef9fdf6b7aec8a5e876e8b1b7438cc33f07c20b1b41afd1237bf11482aeb32d43dc2370ab3dc2f4fb530da018a8e3f635cbff4663df06a8fb4dd4c81adbcba9adee52f4d92c8fd68245e0dca4377683e384d6a8b21ccba260330f66510b45b2a4c03ab969bb456dc3e17636e4c99c22e048cb737b939e38f15638b14296f9b24b83507fd59a2393278aaeff553cfceeec43647ddf76a190708f00abfdcdafb5add6a42bb1d395a68efef7f3cb766bc2f41c7a3c99589143df4a7f553d7602f0fe3866154c98c4cae8e2b4e37f3cd8db19c2cb4024d5712a4a8349b56f9580e216c61d357b87d6bb48e98f9a19f546a4e3d055043647b00a3deace05a316ea7b195814bcb2c28b04fefaf4fb67e51193378097296c50d66f55bc898bc631197a93a0f5aed536e6cf7a49c4d71a4b6a7269e1218917003db263bc9362b60746f72942da2aed59d4f995be093e0e2b3bc3ddfc6e790fbbcc579228b6535db55981b32d883c564df2b77612084463f24fc78f656f3df4055dc1e611bfa1ab50f54251d345eaf89339268acab5d1e18e81b4a6001f9f9e5862f4b904c3e72985882a7e29c7ae1b83bbe6596b3ff0d2d5e47419331bdf32501a61ffcc042b08ef27a71a411eeed0a89d67bc9bf560a62b46572a6fd47bcef7a2afa6b51a8aa107af529ff1a20724eb1b7d0791427391fa62e2aa92f9af1b6a9ab2bc60a98fa040a5f66fe3a387527ee4a53a97820506ced5437cd33fd8a35af6550abe21c29ceaae221801ce4d7e89a3225585e01baa4ee971e765512b6635b36806aa610f9a1ac35b1b1fb46297bb19490329e588db43b749e586ac4f86bd901d5af4665e349e6d9ef5bc363ef4e6cce8e0c6c3a2177c08933de42374f58982a5975e4ca8b1f418b7e88b0026c85c06208ac88b7a31b15b9b1d7a31f1fafcf8b1ea92198f1c74219ed0fe617e9aaf627367fa9ba12f660324627e81082a0d9032294e97ac5b813a1110f512338b48deebe73d54f3a02f6e14f29e3a6831be8a72eae2f1d61d85ae790a2724ef56b30d4e4cc0b93109543dc613c52826511f02edd499b44400ceec3626fcdc6570f38f0291f39f2909d1aee015e336cab2f5349c7ba224ca740aebccadd730bdd159f1efff1e5107a282c60c96ec4ddd2d16d3d906f054ba683cd41d941d3a570abbb9d8e0577a7448b48bc959a732dbe596aa2302f63d2871475c2dcd8d29dd55cfee219dc966e97d15e794096e5679934c6cf078f51538e0236374e88ac8aafbee992d3a7c7431a7906de67a3017a3893a2b19f9fe28779c3c17ade7a3cfd7bb0d03e231c15c46c85e8eeafcaef7fa49d71c057c6caeac87b873e054637a3f99aec924d22950d64332750270d0a703f1ff36c0dc162da8459fb4935ee5e617a05c06e0a39751af72fc26b5288c6921a0ec69379fa2774b304fff014e1bc1795e01922e20fdc9c8f33d8deb067456115d058575911238801f079df83d9819e51f084bd513b1e8573f86bbf53f2ccbb1045c2db7c1eba36cae4a034b4e410eb337a439717aa67cbc54237a9542d358c3454db16c611eeb9fb5d250ad19daa4cb502d451ef10dce1c34b7f030a16971226b5c6a324bc20ee6492becfc21f7857f68d67a0b01d3668e58860c4273f43c8073861776249e828a117908800ea5ba11ea5c81c3316a7ae630922517d57cbdff26ad6db1a876043d77baad1dd323797851bced5804135b4f642351de7d2cf83a7c75d846c7e9f4d8f60f2916c056404faf1165ac6d89da9d72b7de27084c6cc010f2e9dc6fb1ddcaa7bf2630587c9bc0ab4b624bf0fc27b9aa3cef73669d18175c05aff5ff06d7811c8b972fb4f7467b6431e0c9326fcc1b6c771c90e881bbf6becdbe4e7ec16dcf77daccc4eef09c7400d8c546aab43953b20be58fbafe64050e9cf4484fb55ff126522893dacfa6d39e4966efc2e973b6203265d847e568d5232a82a03bc6fb4e206c228cef2ea91cb835fe2d71e17514ac9b695e4cfc96119448120dec4480a10a1d22a3335cd01b90a31eca42ee435bf945f75e62a3d8c0d27c855e3aadb90703895311b94824099979c3f6f487ad981bd74a4a754aa5d143d27a1149cea54b94fb710c9d4bb7b6409cdb11c42c91f228ba60b7f59d8ad747766a5f3a1ca786dcaf873ae366b6426c747b93d414ace928ccb6d6df6f5435fea80a44f80c01e66c6f55612d5db7be661f5c3e7807176590ad379253cfb931d654f981828130f97b1e725c77caf5453c4fc35f4a82b323899b4d963593fde55ae252ec484558bda65879a68b2516c1b6cd0e583dd091d91f522b8e1154520d580df0231cc98090426c2b9b3a08bb7320056a5b6a9cfa809685440cc3990e7dbe38d060613ed7295e6403c30884207385d2cd6429bd3983be82871fa9c911fc1eaddf4252bb7b8833aaab00374df80c7cf39ad1b33cc77b76c375709c5e268b6bd9eef29a94bdf6549edad298462f0d31a8539734bf90ae6dcd90f1171ad21486bcbd385700593592798330c32b353534b50186cd5227fdcbd329355b037924d64c4a7fd48bd6e7a1ad6f662985cd801e10092a1eb1da00651c59854281cfded3cf6bec228f9230e0d856c988a826e6279bcc737709ee8d8e8e12b0e3812f16be3939a909d9f47d2798701705035f485280440e7695b2a6dbac0b1edb237f6e0acde3700f00d4412f09206eaa3a033ab95ecbe831a931c1b962fd760507b5aa125b554a11c010d740220c8991e784daded71795c207e27b5f447983a0070618d41e7cbaf9d78af0d3490c6ac202817b861892705aedebf2b0f7edbd40abab70e9edeeb1bb9a867b7cacca47f2e43aa7181c1529be35bd483999c9983772848cbe3182833cd575208e4e4a366e4d0a6fef39821f39b942b1c3b78c20a95563e51d97bfd32505a91bc2ff7244d7bf380d7d19d33daf94ac0a48d9ce05fb2497c4ac92a3b8a692947601f1ee0b1e2575dcca72e8bd902a5e6312c6a2618bea8b7ebe8be01afb3561a62b50f28e2547ad342b42d2707dd0e7eaf06738521a4ade3c56cdd890b9c94e043177672f0e106da7015223eff8054e276eb1876ac728aaad1e67a32cb0a52c5d86259cdc1f4966c67bbbf187ed05b1e12e4fef4c5acd572bf729a323f03020060bafa77df6aec7cd1412dc618c99f2d1bbe08507a9f26d86b4d2dee9f9f5ff7e60e602456214021564144b1bb68db8faf2561d86626c18d99d7253d05437119b7b5388e88599f22e2798d075747ba1da6b167a13317f483b9fdc6cbb251858d3ad00340647fe37f310350e2e0a7d9140476ef2357e8b9a189ea6080fd6c2979033d90eb3f6783cdbff7ccc6652d36a00392f1bda244beeae5b8a4a476c31f288a966f78db9ff48765b103b253c9720574c907fa06459ff00797f7b07b52e80faa79b5f49263dfae3da73d6b2a0373d36692278da42fe252b0bebed1bbaca63d780e32b81037dc336ba12253dc93a4eec58c232b2edf82fed7b4a40ba57e5d797a52ac222575bd47d961cf2ced1125b53a167fe5fcc703e195b3d9bdeb5e44093a5c648513ead33a7073ed1e79ee41285e9e4124c824998ddc7bf322fa86ff56011fb36f9a4212639a6f1575a5637af72a65d30b7b78889f43a5723b77813a56bc4913b06c0b6d99499466570d36e85cef5dba890b0f7ce43a85635c4dae609146e5ab2a94c08e6d57109f42881b2140f7297100d0d72356555de740be1f4b31b6ed929b0b5351535a3874d563918bbaef92acca310f18103a8f537925fbf0315b895680fd01b0afc22299e88f1aa661db0c13e2c31bfdbcfe29e8dbf154c37b2c112ba8a4bdd968cb85658489f13c9a5f256d89c484853ddd4a7ce02016822f14616a6a8af8c5dd6df713cfbd6ebd33b65e99f5a77f2bc38401db81260ad13d866daa323cbce6aba3701495337f01d16224f0d1e02fbbf77c115732236e9c956a8cd3b001bab860b5c17ce9d9838a062b686fed38cf4bb8d4a8b7eb0822d240cd2b0ece3dd99bf328f6bd7e71dd153e852ad50392b38a8f6bf0d2b2d1f114815e4cf74523209000b030447d11f1f3e6e39fc532bb7b3ea90192de1fb582757edc44535b91100d064ffca66575cb0dbb95533439fec815a3e7f4b0524ceb1ba2d753798b3634a127b064f86c04042260fdf2febdb873a509ddde666337058fc124a07723a37c7c5585e3aa0ec57aa0f4037eb9168ae0463e0ddfb82f1ea74a9bef8b7246491472f51806363648f661281d45f478d00dd0b491d039dd9a3d81a2bcd1181d92ca4d1a9a882a5f38ce6e24b59d4502d1e88f9c83559d676354490993936a41c627a6b24ad1e29795a9a1b389d938f93be1c2e50a77fb8adf4eb73f69515c60f24efb7fba077f708da86fb816f545e0ae97f3b1f83aca675ff14992f4d58c542537f05914bd981205ac485192e3416b3644ddcbe5ac449c418a834dd27658e38a7a402db9dd04b740d51f38d047605cf1d76e826c79984b01a887b9758c47de2fe538732b70b4922de84bc1af641b2a91e53da6e385c0da3a37fad30cd08e8bac486dd6780b10885287153a673f0ee92b204d5405c86b1d28849aa960987cbf294670993c9789b4187a23a718dbbdab911efed32dbb1c358c49c9fc99a582e743b76045da1c69aab748e654912296d3c471b3774fdbcde62c9c82c6a3ec03ab8772086ba742193aa06baf125334a13939d051728ef62f6fe842498327332c5c93e8843f5c8597884c498449533d91fe58ba1cd32453c7822c215c40bd0abc6fda7247bc77e9440f17d1717c406b4ef97da76967742acdfc2182a4c924b9e62b2986451a9cafe8ebcbd33289d3abfdcc6843f2b4080919e00523816e6a99a893b4785909260ed00a6b1a9a26d680a7d31f78fc905b3ca8bd1d0b7c9af7181c15e2bd246f2ebacec36a69ed1626fa5f7754118de988e8b78ef10be8d0dc9425498d33d07b8d5536256d141fc60ff93da79c362d9323a71f88819cb75f65168961a80c7546805900c08e342d5c3348230b355f029299f22f6acbdf1c202435f88b250a198a047fb2f6e17f69a1176f14edd9a98e4b8008ab52ab48beffc7c47371db0fd8be368a1111cc3049053936ce37a355d7cf38b966130daf00e68e828b681d2c8046cfae55ba757fb7868e21a5785af1d4eec3d2a26229763af5c5d51f4d1a9f4f468454eed8281922a29487540ebc58f2882051eb442e9a4b108854d89cd0f8647a3fd36c3d86bde8640e5b6b1495bc319d0dc8876dd0f6ed56e71d7e52a1b5fc3a67018c18cb46a38f35f32b4cd556e1d675a28d3a0493fd59f940419eb41e9d95ec19f4265d259d61af14d2046aa8f68b00b1878ea9017f881990d456d826ad548478b17af4714426d3df086911457d7361f3ce840a00b4bb5783e4b78e800d1ed38080426612a410d84b4c51c6a12883487b9f675e931e4d03646a231162d0120b7a99f46fe7f0006269fb7853cff3b706c8eacf16a93166bd95442ca501b8b2ec7d2b261b52f3446c966475c1d35d7500a5ac4dbd72cf7e83640d6357e3616bb64b81e49ceb2d51225f978e799b2c508025e5ba29026741e40e07082d5bed1c36bdb8e68aa96ac23bd3ef01c168035530a4fc4bb2a9cf31fdbd6b682dc52ef0a5d184727d4347c1b12c31a350000a0f16d18fd4b3aea342e04a5b7f1529842be45f31bcbda12091de6863667a720755f17de09a9ed53f3f578bf21a86047f51cd0ab4c985b255ed73ee57dc7f81bb2895cea88a6f6992ee76ac2a01646a29e20289df17575a6f259cbc380e811e30e3f44c64df53473a7557709ad0add60d6c5656dd299118aede3c4ed67c6515ba8f06a905f4dffd4aa7db21ec1b613c0c790122f0f66a150daf39a5e85262549773848c5cccede8a142ecf46c7886778316397a0b16035a0e76f8f18a76d59ce09f244cb621a039b36782a9523a59e86336bdeb47fa8b06a65bff35235c3249e9c80a9aa9a7fa854ba6589168fc539357f929c3f6ce02c2121957f6395a357d2d907fb19d5c0a3dc445734fab87381959be144076cd474863902d85f2508dd02b62e89c8dccc53ffd1f91bb2800896cc13994a7c45eb268e3c42c4d551d8aa5c67b7c9a9a260394404e798bb7a9db60ba40cd3dd80e270e4b8988402e9f5ea39b75a064589b8600c6e03270c20d778c52d45b7959b2de1d0f45d89ef64d8d470b55e212053401cd480af33975abcec57a1fc5e9af6ab97d4d00ee299ce57df730624c77b0b2820aacfb622aef9411d836f8881f8de5044db43016a58e6abfc4809dba0165994d4c586ab84e9f6e396e5ecdd6a98faf4f8d9f4e5f5b76d6a4884b6959fb736c458e062b0d508782fa11e11471a0736510df769af70fca3466d2d060d69a0dc352f150a5ec8ad35ff59709c95d041d1b883cd34e8b334de63bbd1f4099499e0428cbe30d6f3ae4537a006b61108b594a10375a9bc0438463727118c26ff05c9163fe302f53c34574c098dfec94aa2d69c475a9a54b1fe69846c6caaaaf4825812730b05460c63c6e09efb9331d3a2fffcc0c6e395f2d598fd1f9c9bbe09b74b7d0b29baee2becd8c5b046a8a0ff2315894a283c514fc1250dc1818438b057209347b41b8e6711a73c08f0c6448578bf5791e6722812952f4728998d94d9f2c3443b3a38754e721c2286ed37d0d9c6e44ccaf49bbe2a3a1b432dbf116ddb98a5e0d9dcecb4fc062910c0248f5d218272de66d1a1cc9fd7b0b12de837bd1febf69878ce9ddf744556ee11f566406b2beb1c66acc562e737bdff455949c082757ee317225346ae9be6f2d528ccdbb430f1de269760c40bf35381a3e888428bd35f865975ae55faf2d0821fcdf776fffa3dc8fa0410fe27c35fbdd5b0a9d3fc4aa7b8d98581e3f93f78f768903f1f25912554abe9114f1ed04833df5c5727af743d981e8b710d73241adb7e7073c31a0cb2a7b3628d06b9e6f4baf1d622ae21d94bbabdcf0a347cb2eacf1eadb6bb46c3239f31f2e6d60783eb661e8f3ea88122d3ad555f365e0a40151d5ddb78214511787858e8fb78939b99a033b4b0789a5f6894b4713fdf034d972a0e3276c82f171a380d860c962b99ea83888a37e484d1990366f6a2a5e335f45d9944a4a39471030d2ee451c7bc8709c9a04dddd7b078445425ddb654038f9dbd2d840456155949d37dbef1c4e6c9c989f7dc606775c276db65f522ef7ce3996374ba4397bf6b0ba7b149880b55bf9d6066b214317799333082e24107def603b0273f71be52afd80b7568ba5b578740690cb627a190b5b04162c7487dfaef0f06d3afbed25d1edc146ff72cf42f6610f3efdb106ba6a888351b87d9a36d5a802ebea03a8536c5a9782ba7b875a63678b98170f2362a9c003a2c0106c318845c3791d047dd3bf51c5ce182b707a5462bd918117b4f275a961a8817eab4851155bd3b07d73a2f4c7da3dafcf5302487c92b7a665502b5e7931df0625a753204afeaf8ecfe3ccdff34778dd722b34c938f05fe22f46ecf19e7dcedf6c6597e8328257176142b7f25d8f28402ed49eac6915823131958f2ed75a575431a3a753a659b5caf2dbdac23adba56228142015f2db1be32b0156b9340d753b9e06095d49bb80d558177e1f509aec1fe878e6ec6475b0fa169da5ffa3984a78423ba784aa027d7d67d0813c0c7cfa97a5a1635899fc237ac74355f12d89757a42177f28574d1ae64e8f5bb9c44fb31f77c7068df78824e682d26040b5431c1dffcdde99893adb480a0e2ed8166b1224d0612f2bdcc7f2883f402271aa0e84eba28d81df8bba5dc065eea6a73498cfc265286122a0ca8e1dd9a5b128cbcc7ec125d004d72106f4dd97d33a45adb0616570ca3979933596592e76ee80192d8b10942bfb54aaccc036123af81f81af4e5c0941d4c889ac5a68470f65416bf5322370d2fab49440ada3a0f4be2fe05d2e4e0c6a16d30d5b2b7c24c184b964948cf2c092d1bc767b6cef90372848d5de82dc3faa83f57dcf2b7cb7b0161a34eeefbbe82982ada37143c72af06fbb5a1a177720e0ea4315ba62d36743b4b8283ac22b65eb6c6013f685473490c08be910d21ec72b31b80f56c8026393050b9cbfee695254c6daf7a0951211ef2ac0942b78624361d6436f7815607dec81fdfa2c56b50c509f2c16d72025beb788d543941aa7393e32e17a9202d4f013d0fea20f77f698e82a06f383e0891081c523249800d3e583f9323eef43656ce10a69705d36a7dc905c2f291406ca79b4389411f23a71bc53906262870c503d5f8d7a8369afd1c262950062c6db1239ad2b5ac257bc511b7cd47e66d08fa0f18608a7ade9329636352602f37aab534b4d3ce9b9fdeaf6d549de3243b8c8ebe393a8fad45b707039f64f61e55f414a5c7e052a83ed94c33e460cbd2692cd2c17c0806c8db45eae6ec8826187386051f0cc1bc7102836d87ce967c543148a16c2fa22a512e8428c6df2db55138a4a3e03e8471b8235cbcbcf02ed95276b83603eef0eaff6e65506a81c980b2763ea216b88339a4b2194c806e56cb4153cc76488108447b5f46343f19c33cd0f7fb12899aec011f3410bce5811b91c53e84440d359adb0d02a787796b00f5156f9e7583f9b1a0134ea0204be8911a3b7dea2a089cb22442d0192db6576b7f82bd4cddbeed029b5454ed071c5594be0a265104458f40bf823e057df3f28679bc8b748b09b887f809ae7a435b7bee2642d2af23e0023e0ce84a476e38f471a150273967ba7c40c998f41010e524a385b0792d43610a106299bed1329354f384d48d9f929d7daafee3f8146e803a2a098bb43cc45f62d5c2f30e10e2c0f281e0ddc485458ae01058ff1b380de6280f1c2bc6f9cd81d79545bf84ba7e8343930b50ca43756b0babe1db998d66564cb985cb7bc9269eed6cbba134246552944c389b5ed76eb40de2b4012b1cf68c68f6e80c32560b0e871c343a6b0bd10b9ab7837e005c82c10666d3a3776cbb81a84b593709fc59f1581cebe649ff1c687425b26e282d43694065acf58b87e8a21bfa538650075b7415a5461fd0718536d18cc4e60ac178044840a2625976c0c183fbf650a041f0f1c9ad7e8fb460e68bf9e2ab9b96380781752330b01bb7b9d0e5fe706d3907989b312afae4bda05aa447c1dd1ffe91031017f29ffb7e6f21e8576761a729e957f99d7c2aae498b5f33c96e7034f1270b78de5c54b1a865763e5e193133c2c65a9bc49a73019c0723bc9a4a0a5394e89a10b4c4b15c4429abdf06c979413756ca6b9dc2965ad86e20e49b65d14bac68e43d833011bbb5fc77ecf5f7f684b0c3f8f213209ca9e58a0f070cb5636a9f7cec05aeed9ba0c24abe2019ff43607ca8fd9e5c942fa8c18a2c251fee57f9c3b0fdd3a4f06218637ca01a592d03df0564e9d1af6eb395221220a6df42b33afeabe88c2a3d0246e3565cf71e0fac0a9a03c72cdae5f5c9b4c9c31dcd7e7950c88560d3652586b5d8c74df89eb37b1ed0eca69384dfd6e485770ab1c9cbb8e8ad0133e9d4c3e35dd902e688b0ea279ee9223bc002ee3554cbeead9602ba6485cca9498264964449ee694010a14b94dba915cf9f43632dccffee58ac6697790cc460970187317b4a6f3aa256f0eb4a176a7c2b30a0ff72803640c3fefab02e6e9835485331a0b129761082eb7b6f7ba9ac78103c54b0f3cbcbe61d6b1a20fd46a2bcf53b04466cf4f0e3f9e35e381f83220233d44c0b94dbe96d740b2b7c01b24bbef0cfb085ca9f3082dfdfb30663dbcdc310e8f43f5faba4d3c6fe5073b4464eb07745f0b2c93f015a89113cfb93328394156e83ea1c2f0b97f120d1e3a3ea3f3c7ebcf2643dafa4ae39bf7fcb8bdf040a925e56555cbddf1a025fc6dde47b57c4ff4c0f3cf724e383682ee58103c6225bbea4890c8e24cfc52660a833b18f8559d98aa5c4741eddccefcfbbbe90e45329ce1abd361ef13f861ec4197d5110ab04b0620dd39735e2f2e59cb5b7c472c002d3eab503c04a02b0bf4213479d5d7b527e96298ca8956d7d98e379e5b9104455932d2cc808739aa8ed0cea12236c5d79ddd5a9478ef8604e89823931b9fde23fd4cf666f931af0c5067f9a1c6916899f3ad88d645750e2ff43dcc86e0e306291c63bfb7dacd1534edb888bc835d5dd13378d2663bae31320f6136a3e8cf959c4cc76d23b39f144b4f20d1cc574d5e3909fbfa16495bbb1a74d4db1907adb1e4f29a19208c6d00baf483506c2f1835f4b30e74321c5d84a92959cb6a90b6a21403629de4d097d26143441ccbc179346a63f6a7f104c442a8b66ecca88938a49f49b9c5624953142002e35ea781fd0f6ea1d443e94c8f28bbe45b1e9caff6354fe43d0417cf16f02e4c77a3d11c77fd44af2681064cfc141535dbf5577522324d6755d66fcfce695c90a6cb307147a2468260350420dac8302e8fac2155a570f145707c34100dbd56d490b5b9e173e6394a4e7018fb34ee2951380eb4875af48d33affca621c05f29de67442054e42879f326300fb0cca8170735fa1a81a6f0f65b2560da91311ae72eb4237e949fb2c944a35b1e248ee854526fcf4d5f78c48e6059abba76aca4810ff3a8a9b914febc51ebba11c762457e069db47a295853d18b5204aa8778c534593d141b09859d2e65d6678c9506440dc372719424230ea7d33dd02dcfaf590954075867db284b8827539662baf9cf7003d873e56998b760ff123c05dbedd63d4818980b44a6aeb830901b886d89acc14f26b4e10a47072965f695a42dc154239a13ae1be903f3e04863222840b24cc81806b2f2d012c1d681075a226d681b5833b9016762a4abde920852b063f56177a411714b5edae3dd879073275cd3d38ba2fb532e3c421c3dc1c34bde6050269034ba7d5718934057764ca7e28866e5602119d55148184552c59e4ddfdbf6e2c7005010fae21bd3062f3dfeb7aa418374d4b90164364f3434284f55699e5036b1c9cf6116c69770d60c2604716f911ea643f29a2b2fb3810f548688b6ba5e6afddc6100088532d4a52e3ae0b76142a43580b654199bba50ff36892f8fcd5fbd8a6928d04582a96ca8d3a04e3cbe69e3012e268b2b27164c00c31677226a317621c5687b8c15cd4d94ecf3c59c530d847147fe0016522e02220a7e78f1e9cb38c520b883e1b9d605d48ffc1693b7a80d2ba063658ad1ab77be810d2c59dba47eb9d6f17be8ca2a8cc02612fc121203255041683609c3403b765d2b3c7ca68ace78671ecb6e7ddcdb1cd71272b6710566bb5910ab54c90475d881eff80d691562f927e3bc03f5401aad709ce2a41dd818550c1bae0852ec06845f16c5601e1f92d90e95e00d009c56896652f43113d9fa1f841406cad4d2cc74e9176bb48b024996b278a511b6f9dacb850217e292182006ea9e243409de1dd989e5f9823690e2d49ccf091e91d8c8153353cb66fe8a5c442dd5eda19d6bf68502c3b7ba0c2431eac3eae011caacbeb51b41eeb0eb9694601a13d284cc504718b10990c676384c901553a1b1f2ae5bb311f45c6472a22ba7632998be14a4f68fd434f08a0044d863097d9142a14072b9c57230a9d463e145ac9d9242f1faead3d4dff7908803c2e3c71fc1204761e0e7b121ec52a23a2dfeb85fc437adcde11eef5962c27bbe8a95e7e2e0be3af1d261c0b2c677254d60ebb9208dce0659ca155c3c4bf9676592524453f7f9705a6e3908e82fa7abec471524c00bb421136aae3646ca3b3652146daa9b88ee0e67e78375b3a3c963a7a94a7042b5d53934f50cdad2488b8a3c534fabcd5f960adf1e8174016b48acca0d19167d83abb4dc5a3c9bba51cd0380ef6ad28a4826d27e733f168f5a40ed76b8418f5ce0b5cc47dd77cd126121042f22dd09f5bfc6eaa574d9ee8da4b5b2a5cc51ab0447e084930fc1b5248028a60c0ccaac3d4e33e02781d6e735793b940e63a6e385e2939663bce642364917985c142042c449c71bd0bda70588c8a9c20f0c8cd34b2f54979ac734a1e74d11321da40aa05ec234cca7ec76b05af3f170af125485d636d19e7e2b21a90111855b66ed81dc2eeff3a1224dc7398f302cd480a3567d41b29b7adf03b319684649f5e8b7bd45349a3a3c8656eefb1a0d8bdce6456f69fa02b7bbdc62ea42ba34c28e8da1e615f1e2dd2734549a3ef49b025a369eaa58695d59ae95d248d0e43758fa5ce6a4768e776684f788dbfd7e64a30ffcaf4fa705c6bd4eed61a075a68ad115bb15ac8184532af157edc2368f80b9b772ab2f47e9b4b2a618472a534a0e1f6a835924a20711187285709d06aad95851ef2de6d0499922018172aad358d8e540202ba09017d40f84134488f8571c85c6c43975b6375297097c46918e60847d112ac3de93696ff6c4ae35d522127cd418d860a216717be8be2051c1acb4c586093e68c2d4d6eb7c2824586ec8b81ab2b05aa0ccbc5c425d6c4bc4d790348fcaeb82d938819b7650cef313840155bf50447fa6fc9947bc4f9f3c50474b790f901dd508a2523bc6f30bcd514e04ce0804b94f367eee160e4e93d066f8b2a4611132c173129404a13d290222685bd154ff2415b123bb4e58e88491700dd9a1331c1985be862f069a3840d1ffe455d9e3fca579d154975b8b446beca7e1c72e07eefbf7f71e7c6e7482558bbd81c3a4c01e430fb5249c9e732901b39cb77c654cf219007a04331a207771aaf6ce06105e74e64fe005d2542403fc6560dfa0375df2d58c8967ef4e49c71a2dc7e87396edb8cd93ee9b8f4f7b435dc18251b25c49b95199d12b91e840d40b6c06b66cea8013f9e33bc9997ed610dc65f753a2f7160181747372384c002100a11c886489c6a08382a0865d33db4cae9f711902a634ca0d1e698076c874f4d6bd713cecf5ee5650fbc3cf95528fccbb54085a65c60b7233c8e5355fca3ba621b0a5e871ca542ea703455ba56af3cf10c8c78ed888fa855f158156d57b8d3e1f30edfb7b3e8c0d2110d140f1d7be830506772339f5a9483de4b088069fe33efde23c613e306627f8ff67db00f3c93c6a7e43ad0ff523ed0e7be0e21e069ef49563677791fe8ffe98b017ccaf5e6ab7704912cf755b5d30d13c916a673b30c66af7b7ee70ed2fd61629ed1ec1c9d5871e6c94242d5532b2ffd49b2ab019122be7f0581bb858808df9429dce57394e10d97930ea9bee7c0e41220a5795380dcbb58593c9c63948f9fabce719db3b9a84d3eda00568d124f0c06e08a5a05bff5e6cd111256709337526cf2fe5993478a264ff096620f357f7e9dd85cf8ee3dacd4f89b62dea5824e3251e1dbde5a9a4e80d4a47f9e2e814d679a3cb812791148dcce87dc31dd00ca505b053182aef93df5172b1fa130c1a09be3e2b41cae1cc5b659859f5134847f6cb51648c6f67ea3656e19ecb0638f1a1cfb8a6646a7df48547cd4263f034c091e5b5dcdf940564bfab504a0787b8b7ce0b6309a0218c22fdd246d1586855e148fe7db2f9e4a577a0bfed5df829f5fa22d53d282e0f1eac17c078d641170f89118d1a542a073870efbc84de03863a5d3204e39227eb78396303d870324be7c092fa063ed1703bb8e7633d297e3ba94e25865ffdf44185acb0e41fc72c035f7e415f7658a6ec084799845806cd5a7ff07aef731531503e1fa0c043e275d95bc7a55a51ad51a890a5ed138f688de2426c5d86f3e0063420885b70ce7d9794958dbe23f82692c5c83d46565700c91ed7faf2c12503c6150be834cea2294e30ead2f193d83e1d17d237692efe463a029c5715c4dfdca9c617d52880a71c1449155dd2d8f401b86e9856d4d89cf450ed081808ec9d70c5de8ee4830208c20315db396d3ca9741b0a0d5ba00a54163b5dbd5718ec21fb21f26b71ce327e69c63b1e31987407007981efa81cf379265f44427cb3a53036261524c067f6a0e52442f1736aa920fc2cb4bc755653a82a3647b68af03b62338ab5409236b3542d6985d0e6b662be25f5810c54203fbb5239b7a6f30ddf09b6c27392cba0b1ac875b263aa5a5785e2d40caa8eed95bcb2a306119da4e448ee11a4ac5cb034d2906b5917a1378e6b3bdad42c8a3ce0ca482a4dcd72dda59befadd32c1f522c80371098da17f430925e3683f5fc37bac7b52e8f6dded7e33315e83b551eefb1cd78fac6c62baee591085fe75e69f37d8698f570cac1df4894e62d6d62b0f345093ea25aa26f4d336e617ec1465922cf6b527fa287d705890de29d39aa1f0dbce662b88d4600c9a0705533d6c9382c6b6f3b2ed1c5a56bc29c82c1a1585fed7b18c8130cb426324c1a98b1017a52ff883c84ebd0259ccef97573007346281f15df7ec5ed12743c38a389fee4b75ff4baddcaed76460c8890bd5b56826b9ecd45096d2153d20620ff29112e164587738156b37fb51af6a06da165a3fb60c01ea409bbcfa9f392b8ea4ddbb37690a17757d2d3a32413bdbb55bcc31272338a85865d7aaedc3f0c10a7f23a6cb97641b748d10f18c7849d067a10670dd2043f9c2cbb11c7652bcf60631c20c1a60b48f21d595e4b0ddcf204812d111eb51e77438fd6c63073548ab5e9ef0e4ebe39b49cfccd39ab2a053f560aa7f2e7d8e67b541b13a27b295187c896bb86e8729eb7678a8202d18a801bae4d63c04edec0dc0a648efcc39bd54f654d0c8ba4a931b3a37bd01aaa65b9a0ecd3b66741dfdb0f6cab804687df65eba3d5bacc1f617ae41dd03368d0c385bb668e582a87e0087d04d9aae52ea39343a3a6696b59e93a12c1cd51642995c27971d465a0cf702fceea43ec2b85dd3b67aad9a0368d8e249d8beb26b867b371d59f0e67b22b5b334cae26c61075329c337d3c1144f81895a1f9b97b301b89d3b06f924b09dc92beb76786f700b6f5ca8128cd04869a7ab9a7d754c4d4d55fd0bf90eaf516344479eb6f62a675d191505eefa0fd64280f4fe05c9061f67df2bc79a973e8a77a7b7751ad9d82e7bde92065733814337ef4014ddc8ede7a18e44a9c90fc47163e0c0aab48ac59e08090f5d7a096406ae583e0022fb95735b459153c813cfa54a1fef8331b462bd2b9a891695f3ddc5d750163d4d142eeb03ff5e14a05813d2130218bfa6e65f046c62c80f1ef3e8549e67d9251150d50e5a1e5e1f83b55ad6750642ed1126f5fb3ce008af817e615cc55e846a1c68107b107392bc63c79273f3d818309adee725ba3405a190c4f6691b80ee3166586c8dec212a655fed37c24d6c660c09ee0b4b8e64826cf4a76b3407b337b48107c288f4ef177176228e857a6816d46d21202bfb981a5feb844bd50ba19944e05e950465eb8443d04a230b74079d38fcf8714237debc24c654c0ffb3094876371d857cc3fbba565fd5fd483bb1c3e786af49e2bfabcae0d94ff3823b74cad77208dbd1d31656e2b485aa1bf7b3d61375a0d595d64ac40d220e5af3b65a7f53b1d01a16679ed30ab00f949fe9c50ed371081cb5dd9d9d81990dcee806dbc59b850758bdb81fa71cd691aadc8bb2638f399c632be119d811a9ad20b10752c5bd806942a0238ccb7a0c51e65655f1a0bc32a417fe963ffd05c25708b5f7f4842467fc60f6892e4689bc7f2ab0814bb339f9a3b55b5a787a52092f86ba8b6c757fb78fe1dd7e48ba05e078a82ca0ae6de26549de3323964423902217e055abf154edac81abb6ca53cc5801c28e0db45b6c4130f67b1c459ad5f24be964c3044a3d8273d31ec144f8ad4842592a4e8fdea62d1970dd7655a1b0b0bea1d992ea2b05a8d2c247eb436c39eadcc07a96f3cc7bd2b5c89a2ee606daa53cfacc239d611d4d9a296644e83ef9202f900ee5149f34d8511698f4496b32eacb6f1d0a3b2553905d2d24293970a1ef81aa3e0a074d573a304dfd403ffc7910236c67c80e49cb522053f7d863721859fe1f01dd03ff3cde1b41dce93f9a8d779b3ab9367c05eb82ff794a4170e5462420e6cae523724631d2bbf16fd2a8a82f12a15a132765dcc0d3eb21e58a5155d6bcb22274032acdc069b2def4893586938079a594fb895293075ef1c16ff5a1aae402d28e80e83144c0e5c4c95c13e99a68ed7ea1d32cc69e0ff7d5a9509bec68962fa53e002d5fd9d0d984f1c42d7f9490a8aa81859304d2603f078c00f6fe3cd59a1e36ac788bacd4582203623b5ec37d9157ed28a71f9eaa647b0c0ce4b72c275abf16c0464496fa41c23cbcce1d0a9ce7ddeb58f07870cbc51709c1cef4a9d78731d3af9b642bcdc58cce5f2fcdc0ad48c2a640dc6922e37891824c941799fd62bd9bfe0dfad71622043433d57b68f5c75d52504274d99a0eceec21c0d55feaa59547832b85c81ed7c725cdb80709adc955860ce2349bda6b4fbf3e94c1330cefd314ccf370453704ecede1c81e54541d6f697c58c991e1d678a4ec810c02d945a4722323115e9467043df975539bbc042f1fa40c00318a9d01470b16787bb4cf0638355438dee1e1eaa5f3a0501074c0b0a8544dc04d33e68ccbe35902cd31e1ecc0de3bb9be69a61e042284793e18d07b686a84647069b8a11cd5ca50df0230da0baf3dc144a46ef159a8533d41059af8dd2a6b68e6762763444bf5902796b0a3736aa22d42c40da87559da452136131b5f827d362dcf98388e9b63c842c99fa56f0738cf818426fdc8cbc20ee9045f17a323d9720305a39389ed3ff085bb65861947e1c08db0dac8abb0d0f04242f748098d342882d5c79fbcd4e980f63b2da194d67a8ae398cf0e4df40b819fdcb5a8c276487f0d196613878d26fb943ffcaa260367d48e256b271067b289da4760a20faf37daec360b591c8bc40c50bf3a19b26426191caf704b16c68989368a48a1c9832a733ef582c0a7b6d566fc8af3c6927faa78b360d90e2a3a950a7b10dbbfc977f7f50d1bc711b205f23f1dce0846d3863b5d7d4d9297a4b40f46cc30b03de5018bcab5710fc6528b5d79245f2d776ca8717e9eb8b60b12c856c5cf9a0570db69089cdc31fd40377ce29dfc839fde87a49065abd2cceb3fa3ba8d217e0098f9b82d0fae754a44589232c0b6baf46762c8ea4223874b33b45dc4b868c9f4024dab8a3b68616525ddf1cb888089ab57550c7a8fe5957020e95df3cc1314ebb28f0308a96371b1109e6038f3582cf194b6f887a5c93e905d6711bf72723d9b3ab541a8e828e9ba899f3830feb85e4a2c82eb79f80b7bcaae280dc2b60e44c5e5a63bc3cbf2168049371d640eae763a816a9d36d912b6f9482d79189c4d1a7018b281566c3b2d601e37ded892c288a1a6186a391567ef8a6a59dcca0f88e394c352c697f478c81bb2c865cca694409f85bb7e435d4ceaf7feef94e5ccd4bbfb9bcb2d45574144662bb35dc15be9825289b45b9ab2a431b73681960d0ba6928727da9c9f50736d813d5d45601f4cf993cf64c5a693432a3542152f4ec44ef4e431e066c92c9cb21c0a041e17b4afc1dce702f577a89fbff9af316a5e7e16ed27d74111fc3570860c28f805e2d5a55536aca1a517b23c57cdca7cb10383fe93c0ae2d4ba860a67b94d09c82a62c5b18aa37dc48ade0c87f6114f299b1118f9e206f0d4e88944fc762413ffa2087d220ec70337c2a869e73d661c1835db528b577efdee421ad2ba03a9031666c1a38fc22f1d62b265d615da3d2e879df0cadbda0b923ee1536305fd6d419b9fff68f1c3c0c74d4d05df886281975d1884e4caf883911517b9f722e262903fb9de44800ed7a053691100ff4f22b2510e385aff8f08a33d89187e33234eeae9c55c22f264877166456747a370c60ae2454082b170b6ab15f73d73028f5bb6e8b2f09871efe078a9c8cf9f51f646a41c9077de38d1b103f75cfd01b7cfb0b64804f6f166d6c9d63bee9d34f5356d4bcef05599f283c935d134ca1254bf8d0b86c9db13a5105a43d362a10d3403182afd047542d334ef539a260577281cdee4fefcce1fca712bddb4024525e0bd10b830b372573852264df1588ec4fa3bbf3dce4a04a9d6b27a0ea6cbd36736982e4c8ddbf4b99b42b1989ec3ece63d314f548f625798c60aec3c7b89d2ecc6a790abeedbc5bcdd41c0b03166cbcc67d948b1ccbb4b1d02106fd092aab6ef83eb531f3670485cb19b5e0b0c10ce5b14c475e5de7b5ea23933b614b09607df15416357cbff29485e0fe633ff0f34ae4f07237f8140d08279b6f492c9746ca8dec28ebed31553d268e01a46c6d0f7d2509191021b9d8781ddd0e80944ddd8303083981d5e19d10a0434740840990a183826ba29310dc3cf887b53190522c6b32a22462e3ff4a3bd7bd4007bc47df731382652d639764db6545c6b28cd5c6f498a6a973fb6124d008d1999ab87669b7e7617bc55bd604fef642b0e577ad6873e97e546219015097b3d57848dfff4c0b7ab1efdda0388bb038196fc1977cb74a11790b4b1f1719a93c4865c3ec2092e5a311866e0d7330345a93696d1f8b0374969c6d7878d170adeaa2f800deaa967238da4fa2035878691ae5f72e119f9cd181386421025417007d9f51bbc24ea020085e1ceb173d673ee93836b2cf8805ee801774da21578541170be1b63d1a6af288431c4497b491f52333d6a3d7aa74d54e44d179a3178d766bc17fd4e00d0e184f4ef9267e270e51457e0ed3590864b6422fb44d38be73d781bc93ef091e0dfa905418998659db33dc8543c0f6d8696dba26558683ad1bc1fa4779df54537ead4d1de6c6f5594cada71af201c119f51d80018b3f70e1897282dca043fdb9a2a94609ed2afebd3920ba9dc90feef029404d8dbd509cc56606a6553f35aea69901da90653278480d890c266d50b5d65831e42d3b50e73e27a0cd5ee11512f8db3e5c8453edf88c32e5f30754a884b6687480593957c6f337bd28388d804ac4b29d6436ab3a66bb7f9b3b2869d731a608bc972057098d1d8647c48830dba9eae062c8d2346f1f00a46b290c7c67f5704ff2af02ff8eaee996c7acf330bd047845a64771dac4100c2ca68bbb459820bb935f4c643ebd3596445a6dc459efce4a291bf203ee637a781b2caffa65e772370d2398e76c23abf3013ea49bcef137998e719e5a692fcc023730e05da4f9e186302de5a46fb61164519efd07c19b42f613d751bfee1fe829d5c9d11eda210aa94c12fc98141357334600d425f8fde2f050af5726a73322549e9fa86841990d0f0b6526b35fc3106632c556c755c8a89e808dd7eb9369febd0eaec443aa40bcd55d050d4ecfd567ad80133bbebbf09999dc3d5340cef0904c5d50930c00969c6736d644e943dc3f50ce4e408caf46c8b478fbb86bbae3bcf8171b661220f76f1105377a3b2ea1f8de2a5658f45cbc1e4495433b5a146ca74a6b6a2a832080a806f1c0a38bcf1e33e079289368111404115429e9072960ec3f8442e8c24ea10ddcd9d9ed2cfc6fd6c021ff273f71de82ea92ecd6aecbf46bda10bf4e06d7530f0cb43a8829b55ecea0910cf57abd839dd824087efba3cff371a2972fec334776126fb156bc804751c1cbdb14f16bf2287f1fd887fb48f882cc2e282f2240fb8252be167ea6856cdd60112ddd6c509b52ab3330cb8df515439ffc520f0fcea97845b41df68d13c9703b73b69524815032d96c9600f90f538d083ccaa62550a9afecd950e67baa3019fd142fb7d0e1becc641ea821003b6389903f30df073a9530a4b228872841c40e48a504f35bcfba4e54d2b1eee8444b800b56f6896595ca9d1ace803b2342b7f3de4ac6be5e63fb463632a3cfaa30d706633674d1b2d44e1a30222451d5e07d04edd125e97c9c2bade003d84635c92b544ca59ec6799d5648c732d7f2fde9aa90576a60438b84826da45b66af406a796888192b33102e9208fa7470a8f711fb2f915f5a232165f0d6f84fdeb50facf6d824d1d5dc72645fa5f9538b04aa4022d8870679d6b1ab4b32abe1589b383cb65da3ab2bd28945c85af1345ee70ee8e31a32fbb75ee621d87512e05b7a9cbf2a17e3978c00e957f80c72ff46dcf5321e3f4fb820f6fd1f552b76dcb2f37e4f712f4a4280bf4967527e05bc57d5ea1b45bf19d20601d2ba572749c2cd29ce11f32e9562cb99dd5f6f168c81fd773551b9b7d74b8c1d144a8df31a2c6aad9f96542639f7b80daa0c4f0a5202f30d5858b009ef4e25d0c5c27d5c451b7352d86dd81d664212e1bde6826dd4f525047f5a43a6d74821e3ede256e381b88d7a2ab46e1c2e9731a3badb87b765eeb86e07ff05834456e19046be120362a7643d07de4a7f53c0ad4a22d76d651e63924630f756e9c3f5f71b2fd3bcf852cbafba83c3b99190548a67a3ff50024793b8a1598e92662ef5a6d2c455e71719027267817d45424760134d96c903612ed99b597f438ab82d665fae74965d37dd7baa936ad462974ae074ac27716076877a23883e1a3c796ab5339e64b6e4a2c09bbe2c305c22c0102375d2ee8e17850c381ccdb04c80e012c12924e3dff7ad2d37fcf8c9580de65ab0c719926bc250ff65669a8142eb4276a647d28a56486150b895049d78fe63d3e20ae12731746dec6d012bacd99a00194f5024a52e68255200a692b1d6a434983daeeb6a812640150a22a519a05414a902885d2c146223dbb904bb074b56cf6fb1bc11500c175a7fbaed72ae5a8e3034038670567f8ed7305a4eceff30d36738c241bd97b93bdf796524a29030c098a074a08689e5ce1157c29f2c495c5e54b87e893cb72903525e28824667563a8eea8720cf50b7f0791325c57527ea879adc9d8699c5a541b1e9e9aaf3312af21a1f7862151ed980164c6901849d4f6ca39af2b1d5f3cface68a1d55003c3813373497a58a9e2ea5166c6498d351c2bb8918121791b81cefab4ca5c2182a546bdc2d793ec424a2cc70d151919355a6c28e5236a6d4d5ef6e8e4f860eb2181139688ef840581f19304709454e1210707ae0cd9a50605adf2c426e7628a4e2a8791ababf6a5a3d683075b354e94252c2e1a5e31ac69442d8a3f491216464eacce855d9aba4b56466dc9eca0f78533cb9b21050d1a5b9139224ed3246569a9460d2c189f5de049ca538e29457a307982a783a4a50b0d952a727a775f7862bcd0ec4d5153c5882512454f67879e1c15c4b0c87049b9d180cda4c0caf2a54d0d3d3c23e49028634c1e5cea964819ab4baad320c4c23d6e319acb642fca050c2e6269675ce2510da5b9207b4e498430f180d93bdc59ea884a2d4d9e1e1cae361ca61036920a132752da98d1983163a745d9c13f781a189bbd1642b4ee8ae4206690285a3f0b755c49bece38ad6973319addd2050e9b1c7b566c4eb66c00f5b2fcd04bdab2c6c42d910a1b9fd190c7e5879a316543d20099b1259832d75565c98c194db4be1c9cc14d41a3a6858f39d6fc1125c94a1f5c111c3e96440103c096252b829296c7c3f1143aa43550a6dc905d918d70689591237d5e614d558e6c0e5e6c49425595c38ecaf431a6a9529283e7d53406c4027496ee840548640fd6086324242424352d45a6b0c5ca8e322d622bac61538bcee45c6ed49ab6967c1c21d16e8c1e6e5bd4ca10018344274903b347788b2bd3f704a5491e06359eae792c087b430477566d7ed4f092c3fa2246e50addd415986cf630b3b0a0c8325313e38595a7314588cc39995a82240a19e63c63701186b4365f90c0886166375c7d74e82f69645c4b122b714ccea45459e1342e0b189b5d024809337b9b915406c6e4816387cd8fbc1f7b4f5648b384f665f4e4a6aaaae248c5a52d9168e32507ae499d1834b8ebcdceee478d2545a49026d604e62881ab8225ec0b0b3cbd133e79884b570e35715163627770c0321c2867cc0754e16af3c20e471930180a142f3c1df499d5b235a84df181754605048e8e01e5c9856d866f461c2ebd34176609c09352d7e6870a6541aea00011f9b818998ad3a74587d786303e122b8d1031234e64f6cc1d5076940a80537b930705ef85d7984877ad00babe5e90cdedc831450794270bc00d699b2383d7c6ed7d2cd19a8d94e67f194781b244fe7ebf9fba96e4d8833d5c0d75193006cb18af366c57a6ace2907d6a72709cc1407a3b72a6e6a505c6db1b1753c2e440db13cb336162f071cd68aba149cc79d4f0f54cc272b6081836ada8a6206138d0ea7e3f34572aa0b9d8f3e1026361e25e96e80bf6b22070df3bae1c2683160745e6055b41c3729ea1a5fd3a687c0647099d8e1b5996aac24cb93b32726f4a36ded6f67e81858d4d982c344d546845d0a3a7305bb2aaa2be9ed43d29dab363e26224a9b1a912c5ed065ad659415f53d4dd8dadb73ebc81c9cefb39a5e12893e3478d1f36d0a6b6adcb9bbbb2c1860a952e7cf6468a9b375568b0c9aaf1b4e4ee05d69b955db632a7d0902c5cd9d32226af490e2a71c6acc0985458daf1c5084ebbfd03da10b1bba52759c2985265405d6e8a5ce18115830c070e1c3c60fd3e39e7b2333daeb6c9bc52111657d29e96644dc935ca84a155bd711dd15bf3d163bbee3d3e503ab4ca7879d965d9c531699c85298f821cf90244ce0f236bdac089d7ec0918146334359e8d66eb78f0d93df1887b43e22c8b8c05db5d182d73c6999335373833318c0439bb137282664d96387168847c893a4369e2c2c5e6652f8f8c4a32822c5736bec8c0f184a94b6b1d4f7c6968bee400b3c7c5842ab213e0068c0e1b4d577b57f8aced0cc8887696b5ef2ba0ca4a8c257d726258410bdbcac2b106a9ad89349f328f1f2a7652e698a4a1cad22255b5064d0c8c24153638d966724c0db1220246aa05529671e6a2832d3165685c2d9133032487f71a1e8c763b484224e9cb8d0d0dbd36273136ced918342e9680c5a0b1c14c0ff7de979d5616042d4c0e3740e292cc18666aa206fadc6c619183eb4ad275a3d7228cde1b30b2206693d9d86f0454da9c9d297541b282cf709b19987846c61a1a7c5fea7684c1303352e6e842c6c7624a96306e3ddc8eef317a1bb0652ddddd687183cd466132db61950447d8962147b4409560018b4bd0db4d37373193fae97f2c04b244f83bd6a03d606c416cb8bb38523196285d3199bd883362d062ba13e2e5d5d5830e6f0c4f6a4d4e1e9bbeb5bbcff8f6c6292874754bd6e2f0947cacf5c0df5a0f7688b35388aaa62f6d557a5a7864d3851a9e0024b238356df4da4cd9c08aaf16ad095f7db65c9094295339663c51f1622e3d59e1e7012a0cdb585d1f4603b323465918b63748b0b29bb2379201514eeecefa9ec850528524f605ef2c0a9f9a120b262c18582cdc146192566475c4c692747c79422565cd16683d1cccb5f06a0af3d196c403058bd1215cd0607bd3739bfa81b39325681a24b51769e20c61d241a36127655c6a974c07eea8e8ac24c18a62263d511bb1b8ced810c337e662857c6f117ec0559811344c5630b8489345590efb16173665a349d252927e21a18ebbb66497fc5db484df8b54260368494df2295170981c1d6be5f64633b20b82be2e2b6821a3e3059a3591f248235294b6b459a345ec0963035ce1c29e87fc053ba0e290a9427a6361e780e1aa8c2b3fbe58ad690335d45a6bbdb5d6d9ea22b9a9d9f31284e90513312bc7ca8e8a373b2371e4b8a511c3255822bc5f843ddcaa8a1416300eb7caf310138e871829dbb85b74636b6e38a911c3c8d545c6f80434e4248919c3c6ede9ed6f0a19921e2cbce3b78cb658701b2b389eb498f08919ae45380e9990124846b2d6aa7e54b1186aadb51612ea5efceed0c9606b8e05d414b5262c701f8ff2282a6d46df8f28a73eab7da15c2c9a86120fbe226696ecd5e9b6df0a645109e8e222cd131e5f5166434b6a95c4222e8f18be9e1a2c08b1e3b719e334e29f44f8fe20c67fdd5b837ec2680f854fd7e47a76b2a7e84f5224d1ef8f0696e8feede93efb5651f874ad7ed66f7c6badf5d9ad10aebbd6fb83bdb44439695b6b7f3df9d93350ce2399b925d2eae3c0e0686eb403b28fe8082e7ea0b15023b1e838011a09a973558fd04848dd070bb9baa200eac11f1fa321f00f3e085fda382c01dca17cfd2598c19e2f53203ddd5a10bfd70004ea294f10ee06cd3f98e2b7bf141bc04210347ce8baa887eca5ba5a2bb8eb5eb2215936b23e806eddd8a2baf9f303c20b8545451e368087f48f1d450918174e0c62f885b3a7203c608e8f2836803df4e8ef49493c547e6a83f3c7bff3c1b7c1df01d2169c165860836fed5a64df07c847b81b82a94645e48e558d7e30fe7ad4b1b544c1e7f8773e98aef881d808a72060a17e60ba925d8bc82276f0f846180412b843f0f58b803bf0d7e8984a200458a83f98a6503142910f8ff5d2f59b18c4f0124c3ca3bfd2420f05e7c59aa09400ea81ede35bd5aa3c888ad85d0258a82d68c257a05ee20ebbeba7608baf64df51cd0cbf16fdea4362dd0dfaea8c35f0e703ddf1a700545158222c4c81876e0618b01b8a84423c1f1f2e04a1014b74b3bafe122f78fe9f78c5747cd3dce745f907d335043d2802f8fc2f3a02f85c04cfefbc11e623787e47b53998a6c8fdf7385d6f57df40ff0181b0f08aa66902c7078e1ffc11f8e4aafbce9729f0277ef913df80a8d3cea3f8fef0fc09c12f9f4725010bfff920f8e507bffcdf1f759cae21e8fc81e9aa3bf0777852abb17027d5798b72f477d2a3ced314b9eba8b7e96e401f988a7fa6a62adc3f6221ee80ff760980ed469aedbb72547cb56f7a04fd1acd8b951716bd6ea974eb7645ad9bfacc43da83047648bf04d643087648bf07594391f0f390b6ba58217cf610023ca42f6087f45f75fdbb0e78c7c331fc7669f2bd56b28ba5d0bd7c136d4571f6df9fe8eb35c5e51c68202cd31e0d181d812f3a4205baebc286ec03eeb00275f1c50f1a746103d64551b4d2a723a6bf2b60fda75bb72b569da321acdee9c1c22e5ab0baed82e6d52fd6c0bc924a44c6711c1330aa160b8df24e81b070bfdb15a72e14ddac4875511455f4f153e89effa77ceb658aace3744d9185fd83fc58fd29d53fe17e70bf547117fba89e96c85a327d26a32890d43853890f7c14033ebe8e1c7800c298a91ed3651a766885f20f67ae2893ec9982bb1f2c2cd4f809f6ea2ba69262b515f88a9f90277e62415892bcfbcf17b19f023cbce2c7380516558db1de5157e62fc51d9f6a26bb21742c51fecba1880d5f757a7e9d8caf69e6b11dc24e473fbec3c26c491283367ce5308ea336c79f26c7fc62bac930dc05533918c7afde8bbf6e06f782594d3e87315dcf7eeffa41838e31067d397321dba8493e9aaae824e658b81f03277ceffd24f246f7a99a18773875f8893e4f514cd7cfc772e767b0f3f3d87992a1a9908eca39e8fcde7cf373ab03d11498aee8a3e85137d314bbffd43c7637885fe2b82ebe511ec58bb4cf087033b87decafe5508eb8b7d4e548e23eaa04e0c0019f31f55ba1b5688b3783dbf7933783fb5b47e142a407173f24b21f853c670eb9a610c5df4ffd1931feef45dc0d475da72beefa4796296e2755f16ec86f94c7fbe2c6588e69854c0a44755da1d657f1f78b188c023c0ac4ffc17133b8a7f8a2aa9bf05577adcde73f587dff388efa3ccf1781fffca35e8aff3beaea0f8ebb613f991ae5f107ab63f5a2fcc3bcfdf73f752d7f63f0c533096d6a539bfaf7faa7f5bd2850a734b399ae3d28c628fe80b986ae5513fd6d51144ffc3bd3d5fcfdfd87e53a99a6d87ddc5b87cef8178332be72cbc672d0bff224c9f2f6944cd79efe23b91dba9ff9aa814ccb924cd7efe44a7ede7fd4c59d3389f59d398a62f9e24e49bed312baf996a71be8a6ba964f8a65996994a5a86220c657ddc7c73ed9c3f83db803f0c7d7e74802d7a3fed37911d84c57dd4df344cb14bb9fe49be41be55f7ad1b2485f992bbebbf86ee7f18fba98aedfc512eec5757703d611ef3562ea37354992e41ff571bca21c9869f178f3932f223fa9ef28aa99c6dd80bf848eb53d1aef1d23491f9f37b70da0a03680da006a03a80da03660da00ca92566b1dc28ae3d636e32b8e98ca34cd0da0b815921bdb9b1f609ad7da10da6a2bc4b8637cf1bd434cf35e8c73d67a6f714445e09ec2129118d3b5a7dbf4878ac09d8425b21a7ea6799e680ad400d4d1e17c672718e4e1e9492dd81e9e0b172e0477b80ef0027ae1347f172e5cb870e102be18ec08658a22ce2f8aa2288a22ce7908c72a99edcd56efe17d7c5515290c53b818d3b04cbdc7a228e80e6489503ce78ab014dc2bdc92cd91ea18254f60b7647394dc9876ef9c5888d6ed6f51ea564d817b078d45c02a502a337a43ac5a1527dc30ab240f15cf8f5f5f7bb506ee37c21ca73f25b04f1e1ae6f4a744fe3c34ecb0837fe8bac36ac924a03da8384a3a5bc332c4afa2026cc33c828d23f66544042023c3fc1ff46b803b94f931c644a448f16c7ba4a565e34a8baa20369a4859d2190267cc9b384baec2ec82f0d59295c102e6473c381838c8b45468a2bf984cfa4a8d65b76c8d7969ab22a64992b52fc6ba09298267860d923b136ccdee005f7494c18bb332a4c89c99334aa4a644856913c49a4bb2f4e07823078563eb6a0e8b7da360bbb53454149631e1e34bea4a93677ead918947376c9c5d3951d37285dd2401bb1265f656246d098f8816217130f0f6f44c25615b004e6b94f425c9bb93c2204d0693b6acbc3033405cdc07f5c34b5c5f18365d6c38cee69880b579135666011375a68b4697385856277e2b58391348f06263b156d663870c138ecad41a1adfd458978992ca091559ceaae0e022b514e74509db9c212ee4662885f180dc901d557c59685cba284d699333f724c8942126721a104075a131d584869331788f015b6669747664f26a9840e60486d37a42b54298d3163959e69bd0182e62764c407ca83dc99033a54f096d070b934b03b6b43859f2baf3e266024f85346db8a6d85083b2af48e14392e68b8d521319266adcd150212d4e8b8c581967a2b4c28547f605c3ca4d1cdb89ccc5c49713a509b9ecaa888eaf1e4bccdcba6c518ba34bea6aaa73e1e68491ae1c3eaee6bed0985aec1aab232ce2805c2121b179265a18798ae174a704092acf9d28cb98c072220bca0c54962a4f7c48f6cc1392204fdc6c69428273424a00d6549172a3e2820549db9591f364ce1e0d2e24275d5fa4b69268b1996e47536cc294cc9cddf812c344db89f20d450b2049beb264d0e833b31c7952b24b43650d6d8d893ef783c98991aa334f3059082c4c7cdca89145cd1413d05a00a92226ca11b2246d3d8ee485c9115912838893395cd0aa8624593c272ead2770aed4da903961460bcdd5dc5919a52b26db52df155e1128b9ac1a274a2f299ca43e3c2abe2b15b0c4c981d36a02034995a50fdeea946c91f3d1e4ed4a1b34ad392433dc04a1020128375263cea4f16232add83742d4a8a96257c766ccd665a59105c96b732a3b0bd242b20294903268b6ac59e54489a625634bad2d4a0e342526950e676da2a4b171240c088e528e39a1c12d6d0a9b2a47f4a2769bd7d2560fa92d34785c264e602b394889464da3c42b8a0a31e86e0449e392f555a587e5628a9e9c99a92b24be271b271620458e555f929b2c67a6148be624cf4d995d9f0e2f1ab040c29155c5034b0d242382b49129a387b5e3aefc121ab32263af0fce0d87b9c6268994293342ce50697224a6d795430d08970e366a0558f3834f4b0fb4a7bb079099a32b635bc12e2d53999075945a30205645162689999524266cb939337764889a1965a8c51e192d70796665473ba4da7040a1eb92854a1a0962d87c2d89a9b969f161871b2151d4e0604265b3d17d7929899125af4cab94b35686c8615252f5058d0d281b60c3d2f1e5c51b1b3c2dd7376565ca1c327668b6cb91373092e666d8d130a1c16c6d1913c66c8d060f35795c59b4584ccd1149a27624e34c9023545c52c27c996747337adc484386c88f303586f6ed09ac26471b565d9529382eb6701aa1227d5ac0aeacc151b9a1019347d543af87dd100318282e9eb2e45ab099f58b5584ec4b9e19932bfb45898fb92b575a6ac67887eba47d6b02c3613827dfaf7d1243b3acdfb73859f296c8cd9dad0d2f0f2eafaa1b2c8624c10deffb583551bc5418e2b4021bc336ae2a738638d56036b4589a74850d71aa416b98810b8b1f64600c5340dbd21f194b67e07819a6d0136468b101d6b3df6d450b27ab0d6c8853a0ba610ab65b2106e4b7688972985f036038482c728bdc227f905a2416f983dc12db5a8b69adc5f46eb2b5de60b80916c3625e2338393935318dd0e4b403458a32ef0643b8062cbc422096383ef1fd5e04b6ef55ef6fb5ab0b0c0ceccbcb07070e1c30c61c386049a33188e1faaa28cebdf7de5bebbd350f7c775787e9b01caec377f8ceee122ea600c6368e02189750429b4e91e9e8e6e42e1d551a3030b02faf2f3030bbb7d3bed74974da7b5ba7eb9463041d75a37013c64c4d1847e5d9bd61065fcf8e339698b136012c013256c622d3517b6f2cb7f7defb8ac96e6cdf285f1cb5b7b8b7c64f7a6f8d9d98f093c651380ae3fd984a04aaa2f8fc37c6a7d6fa49b424b57ae7ee06f2372a42a73e5888314f817650c783be7fc72803afd729928f2d693b89df74c37ff74ef38ec9ec61e749754da15f5c6f9906d31d4caad7eb7addb9db75e78c9859a4d43a89458a5bff6eb1ac79f51f1eca5d5c7fdff32befe758fea8b3b7baf2a0ded13c3a45a99a2feefdc037371a62cc40bff6f47c9e3cc11d31fd534e5bf5fb3ae68fd4515aea66a06d50e10e3884a9d681a98886c02a02da70545d8f8457dbb81beef33e9ae68ba7b6713358ef85d4426af350464330bba96a1b77c3feff914619a777bc726f84f7930531894368bf25434242d21ae2fcf7b5d65c84ed5bfbecad72602c4d4b94f7df5d5a22fc1db85d2dad1093e4169fdce41637d903649b98a5879f8a87d60fa4ca3df0000b811cb0c4b5f620670da2861194f84aae1a7ace36d57987eb4b25977314e98c9d243f909bdc98dcbfbdf79324f97b92fc1edcc1c41dd027513405be1ecf9d66bd75f6cef94dacf356d71419b849f249f2499224c9fdf9b78f2c1a82ae45fcfef779eba023f0eba8366bd4fc6d9aa48a4937fac450c5f5ebdfcfa23f7c6a92240109ff3d8afe54cc847fd8a4daa6c48145ebb883e984adafef17dae807e4a3ea7af4b3f849b20b33e1a79bc1ede46b340419d5c57ffd9bdfdf40e2389ae8ffd23504fd47a62b998ac88ffe4547e447558d85e4ede7efcbdb35c230add06acdb2dcd99920edf6ec45bda87b40ed1079b77a22408fefcfe41b610f4ffe4e4b34f19dd3124d3cbf26b112c9c487ffc8c447c8849c62c2a40a7ef35ebef6f49bb30511fc728704241cdb11932420e1fc773e04e698738c352a62f7bb6efcc194b444587d8017beda38fde301ee8c6590a7642f43e820eef2c4ad0375db65eccd1433c374ce9efc3c3cf8c0b74516c4ef799007d160f0c7c3f3c1204631e6e9ed3c5cbf8886e09f4f4b941f853b62e74be06989f8efa41aff881f840f3ee75fa6fcc79407310e9ea77de0ce58f2ce13d460c9843e0015f594fc7a89daf21203cd0b14d99b32f8b7f361b154c63a9fda7d4376b19cec7479d385bb3eb7585f4f93e70cbe2d53a11e4c85bd27f836a8ae1ab8f3b67c9e1fdfa26379f200531290f0e007bd456fd15bf416f7de7befbdf73ef03ef0febdf7de7befbdf76a10bad65a6badbd7d5878557d72be132cc951dc411d0c0683195f0be5971016e62c667cad3e621f042cd61a694d3702071a981f2c914dd7b719dff27e99c74c6bd513ebabb515b7b05d51e09b73fe9d73ce188c3cf5044e326b7df71d4991dc24a94992ccf8922469f96db3178ba2a8ef632d8a9d090b358945718b3be39f10d3344992d47fb3d6bfadd5e338e671c4e338de711cc711485fb918e39cc9536fa125b2d68a7a1c3511d39af762089856bdb883cb97b8be160be92d4c14ae940d60a1b56f7a7aded7dafc287abac6aa25719a4ee7e22b2984af9a4510be925b1d48ffc182afda075f492da41e597cd53cb0aefa0ea3395d47b7ea393a8e5ed5a9fa8d6ea34f75a95ea3d398c157324a89af1aaa27f5a72ea33b19f5f518bda9c3607ac157b2bbe0225f6f8173d67a036df14b5d665c9e7a6f511cc79124715a0a893ff39aa659fe70ea838620b1baa210eaf7b7166ad89f2f0ae679a22810a8c3b7e69c732e8a181571bb5aa9210479a22810a8f341838d02813a3a9cefec047974c63c9707a8a3a3c339dfd9e13b419e0b195f08c173e29493757545a177be37f7700891bbb5443cc405d462614f0809509ea0cf8e8f0fd7f101faa03ea78f8f8f8fe9e3f32b7d7cc8d1c707fbf85c9fab1e6d1c1c63c6348ac3758ce2709c2fa61aca2a9056f27684de0662de8980979cc8cb78fe1edc4115d555fc4ba63de2c5a7d63663ece10e39f4f5471f75f18db0cd633996a34ae2a7ee7dc2eff73b3fa2de4fb7f7de5b8c0463fc9e3d8f63d639bd544c6b33b0bfe68c7bbefd847c37d83771566d7e8d73cef95e8c35c618cf897b9323a9da711cf5a875b6786f718b62d65bdc1b4a5e72b5feedcf2539fe2febfbfbcd9defbdf7eeac4297e498624b94357ebbe2dfbdf5d6f9beed7bdfbbef8562ed06ccb7b68e15c7dfe7bef7034f13486612a8f0fd7bebbdd57c9a29b644fb7fa9b644fb4b7214fb7e31456fced23c6b9d9fcc2f3ea9da71dc59d55ae30e27e857add6fa5a8882d7e49f0550f015fc083f0f347ef940153c862f01f4167c058f610314fffd1b61ab21dd4b5cbf4dddba75695b13a3d2dde09cbac9f936bf84ece167077daaaaa9aa22fd5753f5e7fc39cf15f6ee344d007c90aa62e8534e82910c2ffcfdc117d10eec035f688719d29ffb5f22fd5757a81f54b4e28f86a9fa7345c8f0e9df4f853e485591bed0ab08fa0c455c5d8743c1c76f9a29909f9ffb21ee97b8e0c834f17951115bbd3f3628fdb16f3f4dff5515c24f5f05003ee88f32fc7f890cff6f8725845efdff12eabfba828808e9ffaf087af58f8625fe877e485d91feab3f56e5c0ab0cb04312766884df0e85ea052a91fb76080035a323e404a5a91d9a69111b5f2d5dd0d2019f248d7850d00a75b5771ff441ea8a578df290a9a656ce7ef08db21cb2fe641fcfb86e96678986d8b168889e5f00058fe149a0e031a83f97849fb720e8d31721e853550591fd2a7eeca76f8741eacffd20f5ff5f55f163d32f91e15375051111fe857e45fa2556fcdba1aafe5cf583d4154456a8aacd4325825e7d555d91410d52edf06868eea0cff02582327c890b7e5b34c4046fe2a034839a5e60dfaa3ff645c8f0412fc205affefc587501fb79dee479147d147432a4417f41aa9a3c13f09c9ffefc2c40fda02fa17e8909b8bae23ec15ff89baeff63fefd9fada63fe65ff0ea07a53fa6aafeecbf20c3077d890b54f533a836e88d324f2dfc0417d21350b8fdc2a320010a13a4b6ab413e290ab75f75b5e65b3031a416a442eae7a1df9b1735bf2795e042bade7ee151e00ea68aef9316deb460c66f37df08ab41e77d23954b60bb6921e82dbc852fd11016d420b2f7a4d60d0eaf5ff403121625a1f44657356ff06d0a0cfa7b173492488337e5799e06799e0427fb45efdb14ba9f6fd111e7a73ff7d57beffd7ffbc1d33eff9b7efab3ffff6898a641ffe607a93ffb55534dd5f4835e84f4837e7fd0bfaaaa30ca43fbff55a47f343c1a1ae534f828a4d0cff439eee71b610ca91d5a6081f40416f274bd3ae97abb4e47550b60213e4f6021b6db5eb4035377d402b8c3f6c0f77ab415c23867ce9c39ea1b65aba2b06f9d0416febefc895f416a8740a91d1a65bd92e98a42547f520ad2ad9259e5fcc807fff499367bc02db2e6b0beb00ceddb0b788639e2760a32f001c507b60c7cf8c04eb1c748f2033bcd80503f016bbc8e4fea2fcb543fe1e3db32d55d630f7a18c2076ebfaa563320d445f504fd5b3d2f8f71f736401c6ebb05627cfd20b46eb9344c5ff31bbc247bc05179083f49e6375116041619961c0958e4f0920e44d5deb2bee2256f327fc341b8f1df47f960b52449ae878df256cf2db7994a2834caa08010c152422765b3d44145adf968d2c5ca94eba0b6e66d6ce96def8803c8d4a191c124060b29305d65a298a060e1ab8333717444ee4c128d1e3af6a8eec2acac5690c3b5b57406f7a943a6a09258b5388bf2233bb141982045ecf09ec6b8995f4cd0b960a3e66d0e9ba60c94c5c1ea32a3da824bebc092922c3839394ef04ce00265cd0991b1b4a5333117e4e8ab01e7346329cd542104207967572c8eac9162c2910d1b30ca845dc971a564c61dedd89323460ed30a48da4ab5ced7654546d8d3d41c13019926a8d44dd5252dc9102309020000e31500001810080685a2a148922489ae571f14000d6f883c60483214076381681cc66114c4200cc4300883004490328c39c66e6a02a103ae0a1969d27b11f88bde1eb524f45eea907f27b00bff8564610f85d88d78e15668c26423e40002a69eb9082f542ec8581aa355e67aa6efc2e2b9d7bbad5ce85443aa71de8a0df483bc2dd58fcb786ccd0de951a45c30f19fed99402717b6e8a7ba38eebe3224bfc8a1ca8c9e31ab1daabc72436715c79aa34d477a4d771fcd3f5cc9bbb74947ada15909a406dd04cabeca59a1dd9c7594fef0464d620d300f9412f5a35be1ab368f8bca7b0835f7a1a15d55d65ce05c422d24a10d2781957b4310431b61cc474535affa406364ad3bf0a38252aa2558706f29ccdc41821062b2ca70845f93a1414d47d0c64b7ed7de4001eb89fde72c85fbec0ea3ed7bff404d9410650be29ff890fe668fdafe2a946f88789a988bcd96b0fa4fa39bad54430095f1c4f22c7bd3b7dbc06edab52123d4ce053e84732cb62b6a54f9ee95776dbe75e98ff81cb37780c523b6877ddc7b350d65884a95878cf644e644b2b9176e288ad4c2d0076a50315b920be867f4fff97c63f9618b9da68388ad70fe6a558c793bb9668d132a95a405ae9ae11d8be428c6bb2b0fff921d54e47245587de6701abbbe4d40d9e92bf643425aa158335b5150bcf0d7d1b48429d0201220173756653b1c9f1bdc575c4d7af4bf3a129ab78fe790af74bbdf19222967ff541dc41a286565c4b79a1e2d5bdb08ffad14dc961e4f08a0c0a595a0abc59578a3091780b445cef79ac7ebb2287415a21b37d7baaf13f3b5356d9d5f07a99f25b9ffa40ff5da02504581fa9f4444ca3ce6ea304507c0b42776f97bcc9f019ad9c2094f75050166b8b7f927911107b537a736a4d5f1b204c8de8cb56b976227f746c6e527397661ed38c7c9bae67d2aec81f2897ed185de5bcdc2a566d044977850601b9564b54368f31f2f9169a8e1c433dd1857905990a6d900f437ff5c83d4899507c41ec3ab25309430d9362cdfa2bbd66b82ea0e515b02c42e50d368d0cc6e2c204f65819735db4d0518f4d382a5310ff509673bd5c088bbb42be1f7f46c5f1a57b78c95b764f53e5fbec1419788b42b1e078363193fabd1b36f62907aeb78772080608d4028b4c2671db70bea6696ecbd16d6ffdafd2894476b83f2c169cd61d1f28123ff457481bf1789f0a20bb3bcbe95e9fbb072edf345ffe2841c7da15bd75632ec0b9e62ef70c9ad9f12b2904965f6a4bf40dbd7cd83452474ed8449f59b5d0bcea2e4a1d13851706a127934257dd3f27589aae5b9f990a4410577590c02c4933114e3ba604bd1bdb620605d269a582fca19c4b6ee2b0264fb9a0f33e73466cc6a23ab1df0cedf21af33c757325fe3f7366f870e2d1ddb3abe571ed2f1c706a97ca2b4cbcee6a899cc8200d60292ea6d7a844d3c017fb509e82f9d5d165fb8bd32f025a2bf6e8baf4d74094a7513be7256557600cd9352d0630ca0067469644b22baa07520413833a2757b4a6ba179dcbeb426dfd090b064243fcbd59ebf77996077ba5d6361aeb778c6bd75e0f1214c93181034b7867dc9255aa514cb7dcb2bdab8301c1cf4522faaeb787be8198905604542ca8f810de75c7b7c6d2585e8cff598e2dbcfbc1fc753a169fbdf1dab3d7e05ca9e934cf8707c63d59aacebb4d03cc304a9d905aec5fd2ef11467f0c49f3ec0d58ae5230cd2247462ae30ac889fa7b97dc73d455b7f642cdc10f1083bdc510a9ef87c1bc79b99db137edceb344957300dd67306e8e63e8c0840c8da42b86c0b07a55d96bc90e2e1c1139f7fce336e884ec44b67de51a3e34a277013648684437177a3e4d877c3ada140847d6d1ffdd20a6453edc98ebdefb9079e78b358c48727d55efcca8048d0911f6ac49ff1c0fe6eaa7066e23f49660f45d60cc06b521de79e39bfd7a4c23a709282275ece0ca3d070c89a25bd318735ec8ed53d778ff3b76b611f3fdc497a7152e3abe369a901a20a9f6d1dd7ea813c2cb704c8f21e7085db91060276ce5c165c228156909b9c8c8f706380318b4719bd6f778155bacd134b5a9aa532edf96a922024eea87aed2dd54705b5eb5dc7a4511b3767a2d41b2cdbd47c616084c54887d796d67b1d53c222aa7adada2b3858e142a6606592cc517f6e05bb8571820a05443fdd210225faacaa0801b4d4a977e962dc5240d491f1ab247237bd613ca03585710416524abb7a7b7bdf3e3bc5511de5d57e5755c09de8aeeda81c5c73d3bfd37bb390eeadc50d7f3be5e5da2f2e9d18c8e072e1f962d92d1a6cb12c227c9985ce50262448082176b40e79fec48aa6df965c0765e0a1e6cdc91f85fc4ed548f53661816dfc51b0b0860e851320160f3f0a8933f1db6f963990ac6f3120f77807b9cd64b3b421c76c6d984405e86debb2318d96e3cfdbb50ef076728311742f8e84e43d4f860f360974406d2e8c3e90bb446782762bbc68abbd5572b6021159e207f0a3f38c1c560e4021d19940454044b38048a3ec943a91cab3bc08d5436224334ea309b7ac20357d6e4ceb2e8cd7bbf1bea1f9a66ce44b2067f527c8aaf3e491cb0763488b540adae700ecfa4eb273f9644377a321d2412be7283e694edf7efd073ae200c0a118628d136c5953150a456485eb4550eab545665207753ef221916c3d42fb2d602252001802cd8476b2922da12e52b6e27832939f37b0deacbe421d4a58913087836658a80e8772c8385574ad7b634c56351900b3523045857f579c01481943798b5f10615571d37d273b0895158e169d8dd627865038dd84514a384f6273ab82dcfdcd4de9680ddb61e97ede1f988a2a01a025e1b746a9f93961cb53c16855a3d854fc70b254c113925d789e9e59c326f110eb844d71ef2ed04efc02e35695a4ec4b132a68105ff601118fea23ad0aaae97fa633f732acc7c1c8dc9a9537a04086f2bb673a9eae5ac93ca8bb05dd0430d56ee8ede56c91b941c9a5ceefcf8e6affa545bfe08abb1d32965e8642656b6adf6137198f4f69805045f15d46548905338f12532370625a4e8a7ca1f2a79e6c8e56c1cc9d3dcba144e2e3b762e0df2d569d522d9eb11aa7e4c2fb63ecdbf1478e924042c78f7fdf25af73b975b6c98e3eef0568c3ba41c3a58bd77b143cd2626def1f24b4526771debaeed6e08f020206c267d5dc02fdd0c2a55a6f0e8920814cba51aa25654e985af3832947bb14a662332771af72b926d47834464153f69478ef45508c3024e41c9871b588e313817f0603d6f501222dea7a6d3900f8ddfd44f2d25a9e5bf392f6a34da07eac86ecb6f69268c511ac47e1ed926b204748e9f5729f1908231815348c84758a80da68a737b01b0d7beb4bf13b8f74d481b1ca75b924df03aabeae7ae2fe627e4155e16beb30981b402416ae19c543373cffb98ad47b8312de4ce948fa267b7d7e71539f4656d335adeaa3ed3c73041dd0664aa94506d16ae0788ba0b2b46846444ef974f073ce6b3c069be1a3138d2dc4645d2643c1e316ff85f1c9ef3db5ae9c55613b9605d609c4071df1d4a5c97f711dfb1f42bca120a907eaa2cd4ff0420818a972e2c9b0e9c0e35f30f230d6601fc22cfa532dee04286f8254dba9d9a52ca5d2c00f0bfbf799049fbb1257ff27f425ef93472b8e3a850c1c63a2023131f88bb6d6487816d01aa4d6b20a3c6e1d2305b56aeff1b922b1895983e83a478445a85da53f4da41ca3037341a996221231ed7c48c1574de7b22373bca74ce19a9922a8b49c469327f141e3c1c084d1df12db7f449e34179f8446e12575ef746e53002fc64dd516774e82e59400a84ff1500d9afe59433297c55d13f4ae196df199b898162088bd5821b9ee8604be129916af96fd9d54fcdc2007895d7e8cc8eacecfc943a424a0c4032a285515a52a9e5242e2ef48ebd534f5017190601ec65b201b3985f8e19b65e9f93567fd016c877085b480852507837c7cf1c930421e92fbaf5e3901e541150dbd0579715263d782fa60d5aab8b98e9dbc5cdf1e8d47f248b79b1022e41e895b7b3fe9875745d73eb5d5850362280889f13c8853e17929e8dd69e1f3a37c49749057a435c8eba8c03c367cb1a5b7c5b761304c2ed297d43c037c81d9e590c144470510a138ea471e7dede87ed0e0c32bc1d757613a606a2fcdc2f5ec163ba1f035dee84c16da41d759f8219072b53d424478546eb066a00edbd6fa9f4ee5dddb97ee28c611cb48583f1e88e8adb251c05fee3c40ed4a7053631c15b979a3d4a6d45764befd3d3cc12621bb54a7b90beb2afc90c7905e52b2d2257059f1ca0c2f80fa0db1fdd78098102b9736b0d3e4725295eb8813e0e6e09054425bec3d34024bca6cce7710a980d15a0a79af40cd6f95129cb8d6c5b4971aafca30277cc0861da498dc87a4661269b8a0d5189d2dd2edd2d2c2fc1dbb02261b4e0c5da98c1ddfa417138bae4e8e66bf8711fd883b70e5c1023b11064144180425a371cb0b4ee7c0c2aac3909617dcdb66615f1ab567c0647cc0ce1ebebdb56d04c3cb7630a08817cf7b4e80e3b6ca76213b206a376a08368c8819d89468e49940a7e8e25292aeff6a11b139d0c5a3546b871cc60a96b2c3fcb5abe3c428d4c4f8b80a85b6cd410d948d55d28cfe0ebfcf5febaff81ae869c6a6fb34dbf002191703fe977dadc0088aed428b61793e636924526f0a27a074a91d11e976b31ae9c3c9ac2fa919836f65afa11698eb236de7c7c6ee072286c387df2c528c12cba0987d115672ae48e9e278cbbf738d33414dcac9f1768a5a0afe71ecd773b45633f917bd6ea6bb3e912f9f302c9416843a1d5b9bc017c5507d0ba297deb1c5142af09952e984fd9292a9b1b30dcfc5ec9c57442cd8aec535474262d5e934927c790b16581d5973b4baca4b8affea0af3ffdb0c049de6f0682289f7024fcc9ecae3a5ddb35c1bf21fcafbeefe9a32f01bd26fe0e73a742d26f1ce21179198800cb2ea6562caf689174f5497f30f2564a3aac024419d566dfc7f17ffd81a0e1feee7afdc35b419636592f41f0da3deb1c9f25bea81b3fe8934fb64f9f365754274db7acdec06ef3ce1d3fba7ada2aab20c5e2266f1bc8cb61a2c9d229db508bdb5a16fe97cd751499a4289e4b1a29433d3360a465e5d51ec1964f67724ca4bb50121290e95ce0f228337c85bedba8d1a561e98837cafa2eb8d4d1ed01aadd257896012298dbb6a81908b48b572603104fd5e1491f4fe841d9c14b3d416e4b54ffcd4857fe5acea50368b372260d8eb98193a7f0185a20c63a792b04fcf0b9bca71f09d41c3af6ce19b4cf5504b5256a2ad5149607f8872166a6f106d7dba820a2ab77d1cef3b80126ce3d47a915bb9949b5f1bcc0fe7bc675ccf91346bd0ab22b29f2cd3b2610485cef35073c8a0823f2f9144a2e5499c5475ceca6d88212630319cc805b337152aec3b052079c3281a0d04717f893d5eec1cda7c82f2305bc7bbf821a13eaacb3096168c0fbf204fd5a89f13cde65f625c99e3567c682f4235a963d14520c5a05ff8db50c1f43d127196dad2a496cadfc2ddcbf23f83e5d577d1a1c4db01bf8b7086abe278692b5f4e330e8e184d509dff249b609e305422d784c2aa4cbd72641dbb6052c8a5fc04503badf9a4fd543d3b10c4b0fbce26f5b41ba0cd21b19848a2e40a0b8f76827970f48368051afef507513437c40073e2393cf0ad489dc2f51fa68aa7e93744db33efefbd9c48a7b1804c2bbf3a273ebcf96ce613d0a2409cf84f807935fc5d265a4d1e6d7d9928a0f1664d3ece1201523a6be67796e8503baf1a2e9d19ad50726b5ede99514c19f6ccfc4c3d80c88927a486f5f3cb7a8c51ab3685dc5281cb4750cc14eabe02e921cecc7ed4480f0bd973e8d1ef1ff38b50c452c2aecc5614881d3fb7c8522022f3f8e752ad58f202ab7586d58a2d1e8e682aad17169b3deed859162d96e6e0a89f7fd1a2eb4a56afaec8a41c58c6e51a5b0a9cc02f3f9bec167230b8f38899b3e4620df3f4b289ea32a28e9a4d2c30c34aca16329e39c693aab87630be9ad685019b3a3aab072dee253527442c7e0f45ffffe30a26aa363b88256a58d70b38646289e809d83b154b066b1dc78e62511778376f7c966e62e7af8675f262f77a4b86156006f1fc9a6c6c0284f2ea539c07f6227a94988a8e87bd08e649712168666856ca83c39c574bf152fc78202880f85be15377ce051019e1f41984b0cc933b323deb5c27c94bf341376393b224b9153eec3e2f0c7fb126e48b2e683f8a96a979c2c8a35f0e5219e250f917e65633ad1894fd88e67be06ec2544c14327ae39a487fd5357190bb173b100e30baa54fc3313fd9b2ac804da72e6411143391ce0b48c3e7732d1f848780e6fcc2111ea6e3523c97886810893a0c05527ad8761d9f8545d30a969d1fe460e023e18ed9481f0b883225dff65b400494bb3907b876425fd9cbacd1097864acf0a6aa4dd8342ff7b722d938b2ccdfd90e9581d052f2276d1e877e215c0ae15bae9bc67c87c02576398dfb1a3a46d394d67e77438dd29d0f9cb23fa03900a8686adce5383d5baca5e40eafd53733e6d781fd7c6cea8a128f2451a11ccc9a1b774b892a43597a5b886dea4a2e248b59f2d8288c1e7801053b889784c5e9677820079b48e4da1f00d737c684e44161b47509040d70f900f7bfbe8ebae4806fdf307a509cc8857057e4c843febfdc81bbe1c372f00380442202462f652de420484fe8d97b5d6bfd427132846f20581f8f6c8ec5ebf86514a64bf795267bfc957de3dc2b4957f68abd28cddd838cc6ec565005dd259f8c2c6c853c468eeba368eb202caa24dbbc6b6de6f30c54c474c60b725651b7200152f4be6d610d62376f0340cbbac67fb4175d1ec61daf2859af4e511ef4e0aefa219951966a966d5eeca4f66a86b7f54e50470bedd44bfaddcac4799bba688df95dc30dc5e5e444520c40cfca2ea58da3a2cf2cd73d04044984d128037de785c3423c46071050e4d10444d296dbe4045ac7025f13ee37d21cf7cd64c206e1d72800c53d3fb7750cfe4fe05e158e95ece1ddf6c6b50dcf85fa786a3c802411f1bd13d771b462a7d9adafe4763093b951f225d96fafe749cdda4ef6903dc01234dc168ef5448062536f67401c2f98d9c3fdadff526caa37b9b68800bff1ee36a1c79d6126b720e40a7e3312edc42459f2aaa4ca285c42c8ff1989815bf94c4aee313aa1256af44fd9bea9085a05b06467a3fdd5d181f436db51335a3d964b5a7e42a92b01bb2d129ef4fae1e7a06055de666ee0a007ee07ad3d76f6542bf274eb48bf8c17efb4b509998cdfe0d2182ac6784dc9340efe5ae1e754c7e912c6879e0832da9f887d791e85571532df092ca1dc2f5328d8615a38d73018d32022565a89e92bb9b2e5e74f999ecd834fbddb3a08011d03fa3166de13d9eca3cc05d21846bec006b69ef49adf3c20b158717c25aee288be3d7277ef55e033e3ba0ad9d13fec49003fd294aab585dbd7297be99ab23940c805786d5418c39209a5263858e7943aea6768eaa2ff9c7c850174fafffe2c4c0e38816856496f09c88af33b643843c84469fccd6a6663bdbf02efb04c050469cd3070b34d8060d7951128771efe89ebc56c96bcbcdb7867eb2d7f1389aa6e047e4bb0bd0abef41208d01b42bc429e9be7162740d5d217634cf83c8eabf0c07ecea9eb6e90e35677063227072a2e343ed271bfc5a39b63055f5a0e84ae6f85a70dc8316b0b4b3841e79709ba0175069fe9dd09b528d0183f5aa6542f64ce06e023284137a0eec42758f182ff0a383b5a29847edac2e420eba0cf2cb44436b0de8c45ee24a273f2ac59a75d9601bed2a13922edadcd7521cbf728d21ba8a0b8f6c23c6a96c66747b1ddcdd3565a3f98010a942135ff25d54f1a78180a33133f40935af4311b611f157ee6d141d0073a64ded1b40facf8730229b4c40adc9d85b0b49fcf978ae33d622040823d0cbdffeff1e1b41e1d986889eb06908edc97aab83d763a9970f32ae9e005ce8477e1407f4f03b7e4d08eda0c3cc67bea02ad532b38e0b3362adffdb5fc46a2f01fabaf0414bf7da29bf8e60482846a7527a71df34587ac70dbb52fa72ec09fe10f609a3cf35d97e604a41557f94f172849bdb2058e63bacfe7ecfea4f219ff3d5bad72416b469e1b5ebf412ea4bafe434d214659859b04a8662a4818d8b60c08e2530c25cf5eaffce8cca0becefe012a747b3883908156ee57734f7c0dfa38f12591546349a720db307b4aaeb4b98b1e19a415afd00d10a0320588faa7e38104033eb19008f3256a7ca069c6211476612c1a032386ecd1982b56d4c9a19147d73187150415f6155471624c0ad9d3edbc2bf7616b7b2fb0f662ad70c3eabdee78bd45e30592c113af312a78c94afbdcbb62f8ab1eddbcb8bf318d3e806e60cc291c310fea417dce7ca3577717af88eb506d4a584960836e4885155e741f1b7c85190aef7d3b29666fa33502bcea229932796dac020aee7f098b868734c37fb99d727609b06666bca72e7048b21a42380f1f0884f4c2b67e41d8ea9e51bbb0f4e2d0a686891443baf17e5b76d1b98f03388872b760d8009ad13f3fa0996a34af36e10286e963649063d22f2192496c15ab2c56a156b1735bcdeb8ea910deeeaa8742838548bb0b8f368182408f83e5abc22b2e2ab8b52f25cd5ad7a1eba0368ad3a6d0440ab529052d5dbd41f9ac442446f7353b3c6bdf613103c2f1ca4b98da106803305be08ebb9920122d8079bc601466bcc9964c6ef0492971515c49061830cac1caff9c1c46d1ba2412b12fc840b808b54f691f427c19b4e7a33df872485bc2a4e837a31eddd79d29d6c8f1003b3e1da17b8fcc03cf77fb83f10a5f1827169d87e883b20de379e043895f455cc0aada7e87bb9fc3ce0cbb963e8128729849f1bdc26a3eb1b62bcdef5c360a4fe7e45c0c7a514e646fdc24ecfd7f0792ab6f72d38207841a84e9c0d71d779061189fc503ecc99b2a8509156bc0a2ce2fd5d5563f84fe16f8caeafca65cfb5aecc9a62958187e493c0b9bdd1ea8340f901843ec84d9eebe9b988e7868304661652f02d3c56fbed008bffe00d5f9b55b74246b75a86ceafcd22b6d817a1791f24e1f92433597f5f3735c494368e581eb91ac5b7f592ae69544a34b34fa500d3a23b9d908c0ce41d20facea5c9a8caab6794b3680c9f9e5d4cd96e59b06f5a513168e7eedd58c73d8e42e45ce569f02b0c43d177fcddbe4b143abcc258ebbbe20a285f2631b35f05c7ea5d2212f95f8cec1ba5f7d6990dbaa0cc398b9ca2384b4867691deaa3ba26cddfa8783b31d2f8d007c860d50b60010b41dbc2106408e1931fc126b981854aa9bb2e31a7b33cd233d730d80c6047316a0115603b460787b9b47c285d79ff287f54ccc21186ad04e73f6386e9c136f82ea367b68b477d9268959ec087d8c9389b2e9810a31877789e80c9bd5f0c2ebe355725a1f7b353c2a9e32608c4a5ca642235a3bc5cf204cf7fed51920edfea84c94e56d2592cdf86d180172369ac1249cfcc28722a74666cee7504f09c3e142aaad729fe4622dfc3f85981e2b19dd7285d1b49cd5b28aa29b15a20fea55d6bac7468597e204442beb636bd764e9b3327fd38f1dcbd4e924f978d90dc9b6c7316893da90e570c9ccadd39f0cf8b225143552bd252573104b73dae24f97277e3720075a8100ecc7b52a321c911664cb98af788ca9b98025f9f10480c6c19ca1cceaea1304981158138b6a53750333c983b9a2ea0ece929675d5d8e23637014cc8cb4b44dac0d265f5d3e9a2b69bd38d0f474749fa1d6c58c49b6a71a59b5d094e59fc3707ac415a02e28c37483823375d8e096b1f11b24906fd82c06cd05dc206b17dd81dc46757fe4aaad1c5442a270cf9faee55014d0c8c529be2b4001085d9ac4a490a7f2f95a6dd43b6f7e56a8194d030263e9d80fcb0f1f6c18d6ce9d41a07b37bdc168ecf68ca3be5b66da109afed8c551610baabbda141ae1c498e24c1d90588a5d17216a2a86c6e310c618648aa3fcc50cd3badc9e044249f24f151dddeb30884cc3f24bdd3f0bd5d6269d11061121ff5c40fb9fbf00606cf525960defdee762a17c3fdce3c9543a7af9e021e4a1c48fc63935f3029cda37017af701d06b42825f97817905d0d49c1135905313381190929ea02fbae2aeb3a03813c8925420ed8aa6f7761c5ce0b6739558790ae590023bfaf99f803ac7a5b542ecc312bacf8bfffed878dcced43a1b8712f62a48249af747a3909b874bd86e597f0c1bc07ec5aafc0a86b1ae59fd6c1f957573601ed25e71ea525d3e6ef7137c12ad605d3d8740b2632af196e3bade01704b86e1ef312675d891a5251e4a18d138d89c3e91b030e702f0c76e1ccb3a6d42e896ca48b244001a4c8b0fc541d882f55ad958663bf14aabdea586145b2175d43f97a7c96dc28b71cd8882210f5b17f436aac633ff9dcc852c28d00a1fd99c4cfb3188495677a608fb6134267521ca7136096d93b74a659551aa4f57a971b6e15a615c855406803ebddd2c96200d210d876952722205ee0aa00ca2cf86bc51543cc9afe10407ce7b30b588e73c4b8aa5130d8fa9701b4498545734cd6e9848a97694da7ac2cc6dad741677d0b45c3d108053819853517f2106cd7ee05a4d78cb33b49ad92d95aee05f2dcdd0bedbeee7637f6d828c7a6a2db46d2264e09b565182313e86899837068dd5f07c4b2f26655c3a0634389b50004196b93a2cee93fd6c92b289d6225826247be66737cc4b962281dfc3b19a95bfc04231b547f6b2735515f7c8eac6381341ad46264ab71c8640f070919a46bff83b8de0c7acc350c021a7eadcc2bb62a119073bf10fff9bc6a5c9495737d2809c35ab3958f99032962528f39b1704c1a8d5ff586e97cbff7093bb677ae83e9c3d4f272dceb8b266d1840183f2f4bed5cbe99a67e95cc4659dc36da91b43575c747801e43e2d1c5ea58c01e4e262cd95e45f1a4ec52f13b3531abbe49a56cfd3575bbbcd58290a1554606df50bca5112ad200511da2cd81e98038ac465e7cf3456a6539aa42403954c32ea66e4c9daa5eb904adfefbd22b86ba29f3c6d4a9880c89a2a56051e4e0ef889440e7e34d43dec2972cf3e592d6ea9ddd62db7fd4df3c5479991068586f1a41230a2c7e61b151515024e3f4423abe0891fdb8afd544312c79232f9a0e45a6caa3a1026d5cb99398892b17b74cd80d1efc8c74b023ab99961789f708bbcee02e924083fe38f50b2efa6f16ad43eae0d22c1178f3fb100f8d3bbbcaa771d0e6d39eb4e9f86fe5dfbe0bb7e595fbcfb0ac1bdb8604aee525333e57adc48669ee88cff3d770b433834704727d2fa410165201d906684470e441ee81bb85903efb957db8b26ed48aa28ec3449f335851ff532e65537a37f50f0bd855c7471177414743bdc06c07559e6b54c0d8ff267a852d706f79039ab0b82976d545b7d830d58c28ae3cfee65f361b7c21fbda1fdd4d0e1e01c59d11570178fb2b6a0a0bb1b052a92cf263515f8edb4776b166e600431458b1bc3b4be67615dff7bd6d89434f1440ea6adb839b7ec1781e608c40ce4b78c2d4b3ae5b88709d47c539992c9a7765d0d70127d9882c1d617563ed984928da8dc5fd8c901def4499a2b967ba8726d60d833696b824c4b4601186e8073966d91334727114448b9b432ec9b62ec243e3df69095910b10f890bf15298470a86e63f0b7165510950b257b8ac8654539787487b618fe27f89a53c77d453383a2361c6a8d5504352d6052d42b9b402675a1cc9c596b64f46060f3d831b8e5b9df4095bba40c41449bbc8a8bbd3a813b01e12c7509268148edbd4a0da1f303b832e625ac3a68800dd979f3e5541690bb160eb3cf65a9b6f4fef3e86ec33432a19f923e60778cd58b401dee662b832486bd91db8b2e32e7c59bf8d88f6949c8ae47dafbd808aaccce974d13c8138d2a82f394c1e1c5d14a58ea157fb962065afefa95377ce1ca5f8faf3fbacb3eac401365c577c7a44dc34375eb21e99df5624850a89eb08ea9fab0267f366cd4a581f6419777a2e7d1670e8f2f7aecc002cf9f05ee4d4a213bc0bdf465bd1b80cf0df2d6dc3be77c32603034621fe3a0048cfc1d7c443ea76cd22246cbbb1b4fee8a1368258e0b7a374960810a7107e4b9b0dd3b14afcccc2d965be636fa9a21a0eaee2c310f7227f163d134912f47064d1ee212da8b4b6e11ba609ae31defea794c7e9fbd1e31901583b5054f49d3e031e14022c8e0ca354e876cd71decfa7214c273647c5550450ba17a5f0f3e6fe227eccdec2ab5f01568660d5f59cb682ad025398d581dd1af705854f4b8712af28a2673118edd510d88b76cbbb66fbda4d2f5df8a19c93371addba590176cdec88d5fd40a171391788f84d7d5a69069df40c9df48e5090087e3a94b5a24bdda0eeaf37afa40a69e42ab5c0e9ed02128392b59a2bbbc2a05f167000951cbdc788a2d3affa45c772b9faa191160a591e3d654ced9b6d8dd84d1de5f0579c3f040d7f4545e7f5e4004a32e87c04e5b58ffb792ea53579b69d3d6b4b7240870a96cb2b15fc383e5e10fe470b2633f7bb03cae3c627c0e7fbc494038818cc494c74e16d9ee062f399e8d958a6f988b43578284e543ee8b62f5d76fb6af9999e73d59ebb7e3ea512f1d67dca9357f6e950492bc47b7073e78181a224589eb33bed2874a5557b235ec43a25fd069dc9f468013bfb1472cd11bdf0cb16962d049287a3819a314ea78e83c5309693621258749c9a86779ecc77df2779236f319185d7c04c8e4853d23e8da0e7e8d398942832a699fc83cd2e6f886c5a7eb4299dd0298dfe7270355ba9c675a2daedf78333fe29d5d6a2f7e4d93c0feba4557a25575b197e476eb4fa92e6a466725111e6e2810dbb91ad812095662d5fdfdc91d03d6d795bef265855c47c290e20cc41acd542ba1c8ad5bbddbcd77ab72e519edfe94f371868e79e53335c16be4ae59ff2edd1b0761e1aaae2c6305ddd0ba73cd0801a9defb1bba5c11cec3b44edb235ebd83fd017868ff2cd15b231dfcef03d33b32a19710c6d7d9d164617f911a2f233b49847c36f320917f82450ee9000c90125ad43ede990d0176d244d8c9351df2d7a4134020772984244d098531e509555b6bfb5bd817acda1b8df6c4488c91a8b063271a55aebc01442c0ecb0806305552e7ed0a3e19dc798b998fde29f7b4b3f90bee5990576897e2e1d031571c1012d4771c72aa13672d73660c90d7127c262ba3dd24fef469f1d7d194219a4880837e76d40912c685f0ffef4d973999e62e07ceee4ac16b71d7fad402d09226f99ef2001f91a2adf6d0620200d3420b5fdb915316ed854ccd66538420679f579061496ff9c0a12a8900c1af6bbdd320bb8113494125fba4c4de749111587beac5471687d8cdbac56a0b5e03e03e5bfdcba45dc9faf21a7b0177ff0b64b6928b86e8e7d9b48a196d2265e7ee58a656cf3df428c5a888e83d44af5110458505c1a03c5c5c8a96badd9af1c28d9cae3852d2187352965967a841acb07c66f9c32b96fae58c3e10ac01a0236145dbf6dbda1e2e15c6a7dafce1cce25999a970add79f750b7c9b0bf043eb865d1f934a68e7aee450fe49e6aac0552a5473f0eb24e08858e1101d21ad458b967d16ef8d8ec62257c3d6af7847eb42ce4441dafb6e4ae86658be707eaa259c1b5345ccbb666b072620d216bdfeb7a3e83777435a827c421226438f23bbc067ff8361c90a0a8dc12d7b767c731113d6eb735f09f083a242aa698548e7eaf269fcdd322d96aa344e6f43e57f4404d14721d8fe69c8772d029994a620ce6ea81e334e932395e6bfd67e43700b05686db6c15d909c974009578ae3c1097c8ab144ba4ef3ea3dcfe1650bd4d3d68f4e0c8abfc920e2931060fb99946b252326d5f8fb55ddc485a39f608066bad839d673ae529c42815475ad015b11b11d1389d26df71eab1467e26a6362d093645d3eb67faba2509bac49118daea4cd9b57ea0b4de89eef71ea8b5e60844d50748c14b591796ff561ebb0b7b2f4022108269967591787b221d1137eee1b4fa77044dfbcc08118f685a55f241d0080beb382fe214735ef24d03fd4fdfa625295b3c197aaf58c1aa14e5469f79a4eb17f09a96ccc4267425dc367f6999e8889e486fa2d1cd07b2882bf02fb174b89f56e6809a4507ccf50cc29f77b0247ec8f174d33f8f0c8cadfc1f72d768870531d7fc9e36b7a21940b83876360d49da1d4d1bc87b549d8cfaec3e3d815c56a581f5fd5d60006b0a66bb17f4a777633cafe71575a84138fb0252bb7161d4eb08437ea435fde3d41d1d2830a84e827de33e38245d4d6434ff449d1e49f719d4cc6abc54eb588ad7b0da4b520e59f84fa269ad901187495aa92d84f834304828d5427f5a8a81825a36ff470eeba6b9842fda37be63b484cb9045ecfade9d6b983c1ec99b82706aac42deb79fb281fd1140141958bdfa8dbaae12cddf557e40c2a9b56ffcbdf4257697d603b4a5e0bb5b5abc2e8ec68f3dc6ff54c1796564f87130a23f4e34fee55f829782c51666b6269c7fe80206c0ff044df1ae57822db9eff0a3e25653b48bc4cbe9cc73c04f47c70ea7c0c718148a4698f714825e00a2cf57b45e5cd3e5cb924aee3691ae0c0eb0c3e383eb64ac8a95c6b84a86fc84743948b7044eb26ca227d6f7416d94cfec32b19792dc2f55745a0b3225cda71f3128a7017d425505b3da82c1ed6102ed0acd28b4670175e88ce62564badd27dab17c4701e6cea4e6e446494b811c2b3b227f1e25843ad51ff0a0f5c7643165b37f7cd04fca84e1d462dacc3def2722e136450db8dcea44bb5635615fd9a14eb6f99814e1b57142eb66060c95074b2508839030457d7374d32142fbaed719fca72308d9a689d870645614113bc4ddaccf1b03bbdee4a3a26acdd9d145f0e410da54d4e22151cd522060e325a803539c27b3ca6507be8e5f35aee3b3854372dcebcd3d899e3e49664c547177da2d837ab8329c62cb40907a6c3a529a9aac6984f1cc5f602b9a81691f30b46583f15fe6b38e0e1cac385d1a2c9d82b44de1ab4142013de4ed2a905d657976fa1cdf838a3149d925cf6e9bf005c6ae48d9eeb4187144a7f7852d1468f7726e398a83045e5691f33ff3b62d211dab2059564be0dccf487f58f311746d74a52b9a76e89fdb4e4e9c4227c5e3d7b1a6908ebe333b8b2f7993d1e203329f45a4cc258955769f60d4c051655f05d395ff65c1e47c71daa472f0260b67298d192e57def0df42366eed5a6c18247f3d232497d18aba5bd37e3473db2a7a2bde756c9a45463f24739dd113a8e7498fe4ca7ee95d3f7bf22e5c5c37502df21896cccf26ae2a7c3086895822d7058787f52473f33977dd0770dd2d9106586d3b04696170d26702b0be433e802673a9d2a4d51942b55ec617293b61c960a6def0091bedbcddaee1dcfac8515d684b888e1a4497d8ed4a7cfa3b3dcced2a75bf50c8fd182822e0c7079ad3aa56975bcd1a31792f97830bd64710c2982090417a29c7026eab487d9676c75541df1877ab029135e2668d23d265dd909be1a5591c464fdb835a1b8cb25d940c6c7653c31e1b11b8df40efa8e6120976f81311d88160a7997e053ae1b349bd91b93761daf8bf4672e33f9e0bebe47fa67172b8a9b7fddec613a9e4a2ee4ea054ab3d052c8579f887f740a586489071234bfd7281bde169d125b982f87acb450422c9ee5c0167d02f26255ad23cb88b547c30e02d63fa1bc20e6ae5c9f832cc10251e08cdf96a50ebdd5f9ac94581326f627a811d434fab831f639a7392a52d3a712b3a73423236e764eac3cc2e79cf4d0de724d783f0fe06e223d8162f07ef1cc47a53bd9380ff6822a0e5a0efa50efcb363fe02490f431c41ee6dfcd3037bd8f3774c67b89fd5c3dba119de9f58113d1186d8ea6736c61295cabfdb4c1c464a0e45bc94408afc382be8fe3dde4c0cbaf435afaa2b36629c0a4fd0ff1f291bc92f85212af031c519f2cca22f99d7d25419b3f221271e2b6deaf21221c89da36e40c9b7392591f92aa337b1c3c264ba21bceee19833cbc609b3eede27f2f44a53cefc6e88a81f2f310b8cc6cac5649b04668f87ca875170479b155b6c2bcbd336a9e70f9fd938a3e1b31dc071aa7547ba0dba7575699a5b77acc0e94fe3172fa8d48c42eda17eb2a9bc893d3530f8ede97699210189cefd1a7af5db1f8730270f1f784dead135c55465e9f1915b232819a4d1b585cb717f794146e81ed4acb157925a30a83a06d17f0efb3c32fa3c5403c90fcd4dfb8c26fa44d5266a3569e51c390c33620befad12fb68d4be2dffd95809ab18901d6806bc638000bd2699f691e4455f38761c4841f47d44b01a321b7f6c7066473028a8279d3054b109c5d6cddd287db861fae151cd83cca06c25048f6a81b77c2a0ab804a50a46fa280f4537888ea1bdd66f36c3ee5ec0d42728c020889083f344a5a936c8a5a9c390b69f6a44e4c1faeadd32b7a3af3e4e9d01038edbce137b5436ae8d00dd62ef6ca01a21032741fc10f02cd59dd0ef93777ca7a2de1b4a337cc5a9f1fd3329937077d61b5b336cc9f0fb3b85a2f12f9e02b0e97f1dbb1cf49e3829bdea9697ad87bda68ea79fd64febf5f924586e41f4f3497e15f10d948477cccd15cf1ba772a272e44aab4d1521e9959c7dcab0ae6067daaf3ec130dcdb16ac8f32ddbdd61b3691707ac74f7be93c895443e1d1fc845e57ab96f94e8eb6f0e12549111e86e7ad1a4fa9aefe1f630106877031202fe8fb8184741d620dbc25160de1e26b71add85e111b688f7165625775c9b9440e919fc74af646518a506412e73dea1521872df68e01751e4c4a92aba0830469a6ea5bdc4713b891e07126c2cf4c99146b8b469f1fe4824ffa92ce9746d2659bc0db7311411a16be177b0bf2fd48477250f8ddbbc342d317be45d2a2c0e38fc2e9f3c0279625a94a59197a18a06f16d8cd62086b45694225bed710b8d1aa2678b90fd918d9c83f93222a3c59407605d8b5ce08b78570575a3f1e04e22e5027501fd42c0bfb93b22f6142f683cb3810347d874b7a6f6d64626cbea543933daaa81c6a224fed1aee30c239e13accb7b5e712ef8bdfb2a44f8598bca8bb4b463def79b1e681662eebed917613f8a512cf38ed56210f47b19d1e2ddeb79fac710ef6ca4ef5cc352ca75fd6bfd4448bddda1d23e78e096f8e81ca2f32e5ccf2cf1c30ffbf8322425a4bcc2d94991419a7cbfcb585cb5ce7152bf156a8b91da2c488c2ed840880d5471ea245bb02cbfc91b4432d7a485c7cb272ad8a330c87f5fe4f2c97c179aa0c96e00efdd9a9635769c3c37aee08f41dffd39b08cdf6deafe3a0eddd769755a6bc6a1c352ba629f58a5c6e1b37a4b3936fd9dad22fa6fdb216882128ee4d09895838205399d62f36fcd87481f01255fbd02accf4a6d8ea67a2fc4f0a19b5cb8354d2be13b1b6c43efb4337f14e3ab6aaeedfc7d48a4c46cc10893f0cfdd82bf02d5798686478d82e901747c0027efb8a93070d157e0ceff0d56637223d22781a90d4e7ea7090e620c979fec6b533eb6f89cfbeb577ad805d532a9af70948efafb9e38eba8737272ee3d627b1f24f96c6b6b9496a09200bc2e96517e084f98271d7d820a2e2016b3b5e268980790e374c108c75a98d2d688bbdd9552d186d33cfdb240d564b5535d0274afbe5aef2024d4d994475e4d0eaf5f86579e8d4de1155906e161e32de8ff9f6b9e854b30fae9134779a33084028514a21fdccf9c47f0224f47b9928ada93ce017404a16bdd2b31ae7559ebfb263741aeafd141fc8c017180e04ab70180dfd886a2b14e22864ea3a35ef3bb9897ee4272286a61d135115657bb08a1b3104cac48ee8640b1f8372897ff7f65101a1297aa94d4a0d106ad421c0a5686c2526952ec0834fb3d1b71d1abb31c165e3e288a4de32c42bd429d5160361a5a4a8adb1289227cb80924e06d95475ff53dd81b168d3178c727146c25df999416c18b9c731d32131cacd192bcddd2c38a35c5bc40b1e094beb5eaf934a408fd778c6646a9e4b9a52e5490b75876834653ac5b78432b11e2984ba8928c512cfc96768bfe57e4bb480285b57271d8a0ed04dd3505c504493069d3b336fd1c4ef699825d9a9ca7269549b062e59a31f3de1470d968bda92aed677bff39260927d613e67641e1838784f3d881b6f12dabe0886a85206cc2b1c83244f76e9533dc5cec08c69edc3a9be694c3cadc71cb8fe8eb8d7585e00524922bfc7c0c9bffa5890811f7e54a32471af10a4015541bc8773ca34d584d60340fb19586cfd12e7d554a9da065c9cafbd346d91b787d6dd146446b57e85aa02b2bcfcab49b5d60ebd610b16fdf7a45a4c2285aa5a5577b74d43189fd8fcbd926620f0f5c734dcd0808a7f34162b0248ad37171ce2a71f5b4ac61fa4bd94b032821f3ee45f1466183e03985d82a7ec4f51cddeaeb78933078a0370144b3b3531f62dba0ff2cfe0aa823b0f90ad0872f635c89576dc26dbc03fb8420bbc84d3a776742a83e6dffc822e2dd0a30a0c20554b97e6997c193301b0589a53890b56e356587a2e4e4439e0d9a2b72da7786a61eeb33aa8070cc5d771777d18e4a40681f973a99a0e38de1538c2202bde544fa498b8e21f384bde3198aa0d92068c775a7947db4f575f507b7bda31c2440df4ada0ac208d8e73c8c684426ab966ae463f7f7044e2e416a833ebfdf7d0ae72b6793fba9a7a59ac30b3d068e2c1bbff90655ee33bbb0fd0e10b303a0610f8171de2a608a44aa849df16803ba870e9ed722506c919ba22b666d0ae0f6c5d7bc2278824b307b87a66d0572c941772a25d6f3b0602c0c59917c74debd6bbf3447cf77c2d57d1c7cb0d847b3f4eeb08481e0c38133b4a0c4f98ddac679f0d6964e57354770c9d6437b54a3b0086ef793a3de9f1dee58706fb3a8bf2b8de1a4d6b0d86b1e1ba1facdd3ca00c8653f81795f14bd11f43a97a26886c096c54dea432c0d4c8d361d34718f04eea6e71cc59802955cce28a0b1ae62f3f06deddebcefd627ec7b2c4532593e5a0ac816ea044a18f0b878b3aa9b0a79cdf62d0aa9e14d4aa1b25fc6d3ff58b2839bab4be8045d96a0b22f1446df79167104df468a2629d2dfb283f576dfd2aad3ac6acdbc99766985e799f6cebf35875ac5ceb16197b22b76b346eefcce13ac048f3181cd3918a35f11af67f7a05298334898d209218e8ab9de9508e03c940a20239c921df0f9928f8d553dd9fe3c537c15434c66af1a2145b1e76b3c1b9483303eda2e3ee77c56dd7a1cb6f03ca90c0ffe93f17819dfcb6a35ef87ca4d5de91a94ed18643aec74688751842c519df48d3eeabb0dafd6ada0b807915040c9ae89395b20d0b8fa8e145028d769d66925951fc4d6df3fb5b0b2aa0fea7291335da53a23f440eb6166b6547ba30df278ae03465a620d7a649c30053e03bdc395e9646356474d091574065d398e1343327405dd4279a9171f834af6cfa4077d1b9ce003dda023f7faa2c452970cc08b51f71d866e25652bb8dceaeb8bf52cdf649ad73075331c0b43cd603545aed71c90e5d850b0b9c005f5fc5f55872a7b2b80a4c7546d5cb1dd60ecff77def5a87097d35337c25d9ac2a2108212bb678f4abc105781449c9b0c0dae8afa4910b33abdd76556b56db8eb0736ce094e3ff71afe026bea57017b066070de84cc8d7943b6e8077322ab0b321e1d1500f0d4feccbd33a3e2a4640ed861cfa5ba490bb95025f84088dbc7a6bc11ab2a134b8eb45f5ca0b63745682a3d51768cfb8183b09e796b461d9891ca4cdad0ac0db523da07bd0f841c6fa80b5528c68404d3481db5535773f66184973db9126a22b4b0bbe98b5b84a53018166054b5e4d0a655da773529944c7124234e59b15a6427ea2ede88f5aedcffe966c9364566f42044cde166357f4e701aff6410a0000321991bb46f71134f3c4531c7e7719ce905dace0aeebb63ad5166633d43aa4b2c651ec22c8aa476cca036fe26e9825f35d7a58c91b38bb478b062bb2bc382a324306b62fa55c50905e6e0b86e9d87ee13353e5d820d872a0000874e1b9d65afe9739906417018ecf656b04a17f21c3222bc3bede407e330ea778781322a6bede24dd8d74525c7ba762fcab2e99d893e2bf7de9a05ac67f2f2aed0f0911e2ebe18f5b701dcd119d092bc7d494e920950f0c4af4bda6644d3234f3eab96672fca00469cddf724e597e5d814550a23ad77b7518bb411348f71ca075a35b5583dc129f80b48ec16f113a7fcc3508aa49a7f7b6bdcc4d6a20ade6157b73202d75ef0789e679c368be93a476572b8886818dbeb113ed07a3ac6e65d900c178dfde9692d5cddf968e3a74f26c7e91443a4558a4eaef54d592fe2a02a9a42480368f57d01ca161abf28c453c36e989819342b2eb567f5eb8e67bdf326a310265d37f36c0f7a5c6d2c50f88837f237dba9a3453daf6e76ed343806fffd21e1c3b86cd76f50da203666917d335f766983ac8e9e6173038b812edb22517699b1b71faff52a75d4859cb28af2a55da3deb8a92a2116557afc22e4795ac3fdb53a3e3c7e6171170bc566a6417e65fc006ef73c52d32264bde24b10881a7fd2c0914a3bf5daffa1259e30052183f55c90b547aed55238ef09d94e55c47bfc27925d835655d917f3b24c8802d63e54cf26a6f8003d62baaaa5a6192f9066192c7454b8e679b64e5e189c211a0a06dc838c118fd06b60c339210e285c1460c3b4b2a82a8a745a818119c37638a070d74bae86e980c032671ba05bf197146e125408e9a3d8567e9a3339e4832ba7243142f142288d08706a224807542d8af117ad8bb634dbe8804413066b836a62236e6b29386c3496788f70c1b3c83aa60f5404c1538f4e6fb21857b4e9ddac807701e9c14d7f9a819aca651583acea0eea76877af747429752906c4116397581283e592539e59c7b08c25ae3209f825da32c3145495b85fc46a8a247dd51a08062b7e09de6cb1056e784309d83634a60faba861a22787e4236da89d92845913a4cecb05354f56b927c615af26e34c71a392851ce290afa386cfd1e22014b8c6dbbb29f4931fbf40858a539b391eb23f0c627cd794e25dd5d3c87878d9d338ac2d061266205de2b381907f766bb40a779638f8452ab66c7824593f20f2096e462d1aac2e141684e10bf69e89eb94111e9a8c5d6afc2197935b0bfe7ffff4ef021460199fcd2dee69e4ed8bae500856112cde53e1a2bc22b588efbcdb0138a751fd0639cc21c43a755cf42c6fa83da241c6e4af326bcba95cd050bbc1862bbaae2cb40f303f24df1612f7ca38280d97daea1075be425f15af6685a165b582d83be07767699320a9e839a6567d9bc905028eb3ebeb56d23aa14af276ced9497c0c915cca31b911c1c79519e80ce0475042cd2ff869564071ae1ac4730fb969414364394ec968e069ba2f9c6af3526159e5282c96c1998b87f0764cfd3555db5fb97e65744e9eca8dade53f8d9f0233e52dfba989feca061e8e688653fafcf3a35ed3ded8d252a4a553d40736e99d517b71a76cfa42125e1950b8774faca8ef41456f2810acfe28ef71c5e08f85a5d0cac50c7aa29a49c2ec93427cce3c89a12259a6cc79da019379cf8d3dc01e72390073273b1164a9da96be5025e24b8901ada01e4239a05e9495622a80c212895ee0a1c03a915d05b9d325f0682751a88323d07f4cbd5d8b9fc26b36b6801d8c3253a412b000f582d70553b91439a9fda9253f9b096b73404016344c863a1fdd31fa8b908aa527e3b58728c6564a50f365f51ee8e53c52bdab57b2d900eb3e4bdadf3fe140b23450180f798642c5c7d438b3cf275f7f970faec8a18474475f0542c6a30b3ef3a031a9c840b41b83d465aa39242f26b8f12f0437402e7a45e75178f717d6ff215e6070d8a459eb7a8a20508e3539f98fc5e0f353128dd483701933cdc1694cf0122d1d5a42481aa0a62fe9f0a2673087462ed130c553d4c83b1ed56eb665f78b919ff71f96d880bcc137b69c0bdeb64803ff17d47fdce1800b57953602733070545101c5e12b56ed86c17d7372484d35cd22b45bcd8dff8baace19c2fec941f084ec8317200107cb6d155d15c6d2bc0da8f72103d393d230061fbac6fe00d4bf0e860d23a0ae3bffb2ac7f0d64aeb2bcdbcc71d98b9aaf091e9af5a5068d40a46e3b18ce768528e7acc756b68bd10a41201f5b8705db2ade58be8734b81777280f809d0e126bde998e78360e30c3f0fae786986fcfb8c7d8b917fb34acf2f8d721d13b16443e94a504ca4fb7a65620181aa50d6dbb7e20421978987db5b0abdce628b77a77a2fa57954d6832ecf2d7ce88339ffe5cd523e4ffb80230c8d1cf3e6a98d21bb3ea0411a55ffcc50181214141910a2060dc1ae8ffb65b9394448456f6ce2403000a7b0a110a4a48cc7d065186201c8da8571b5a2fcc02ced44c39f19a88bb09c5b671132750ba0657646dc5152775ff758be8c68838aa9fe769b3cee45abfbacad687ae227dad51ac58db51bc6666df441c85610c6f3eb1882b2a2aca8d895cce4a94b6225fb13cbef9b82bee7f8a4f6f118e8a1f3f89e8d1a3e6150b3836a9144ee65e024d93524a29a994327b39a5f6d8534cd3e6ac2339e7e869adb566536a5b73c128a66123ecc232cc62132361987c0cc3f036ed85b713dedee2493a8db44a27c65208453333289b140ecdccccf7e8e16efc5128d4cc53b1728547d2740f7713831e57156891d48c2798cb736d7cec21b77244c8def3349fdab8ada494bdcc4b6b6992bdbc646e8b2aae4af2a260e1c478654021124349f6ef2c8fe5ff52cafa8aecefaec8659c780e954276a8253b1d23b7952b43543acbb20ff27266bf894c06836bc460998c8998376199ec1dcbf48e756d5be92b3dd45460eedf1c31ece96dbcbfbcdc9729b6f49b2bda8ee4ec6f768d789e8e2a7d2b69264f753ae2a96abc8db7a411b681dfa33895332cbfe1430c874a9e1101670382927be8f7602fa1e4f874c77346b8647a93f311cee8b322ac0853589bd2596bad35b335237d36a79bb666116ff431d29d4f47b7afe0e8d8f71cfa3cafc63d6888521a9d1520b188bb02dd15a8fd981df454f349e9e50de0582f988812fe57e3a68779d313f1f244941e06f3bc9af852ea264f95e1f8df4de2c8492a5f19f61b2a671976ff64bd26158130f7266c6850361028736f626624acb3fa18e632e9b63a37eea95febdd68f2c4486dfba561dad4a5674203a57fa259257ca459a5efd9ae267bc9b2b7a42f654f335c9fc7afb777fbed86ecd85fddad693242fab3ef8a4f78069bf69a621741b969847037fe36733e8782f773bb2eb2104dbaa0415d99445c8dbf94419346d2344dde8c90342d44932e2e2c04d5daa61a36523a79aaa6ccc5716fdcd3b5619af5b3a7d9ad5e54bbc416138671289bdba28384b79411be72e5ca158a7b8bd015a1182952a4c44c2ca572c9fe11cb50d9bb9765a82c732816959dfe51a914141de750fc4f146f27fbb65c5b96b83ee289127a3555582187727a1bbfcd1aa7938d396b58eb503a08c635255c11232be1b9e7fdbcd44d25e49494c689e139b1fcc655e2f9de3aea6138dbc500450c52f27c6c5e307e8e318e467883aee1ed543d276a4060c5d35159d633772a4b2839624a3894424986709b78abd9dd687286ad3d921b6f59e78bc7eb88d42fdd25fbd4ab5fd767a76a336ac4d5ea4c71919a37247a2210f98ddb39c5dbfc88ca17096fa7195c5556d394e4cea873a8f9a9a782ae66fe4c9e4fe767f3fbcaee76aa365e3fef186ade8ce456e7898bd4dcb8e77af9129b304368c84f849e0583a1d7c4c762c9312fd0d0a4706c3c07c3dddb03811f8661a8ec342030a03225deac8d783b358130b0db8445983daff8efbf4dfa493cd58b46fa8a9dab811eb7c762e6e3ac6479822a6734c971e65622be2eb6e4999588795edadd60d65e735a646773a2b133b9abb7db927b14d96d3efdf73adf1ce1cd36a6c4cbf1af35c13c1d1e3504014c6512b319de22a99cca105ed877a3c99db37dee1bb94b19cb9d3157e3e0570d4f7703ff0622396618f6a11992012f66e085921ce56717be2e92ca11f7d454f54786f437278534797ebdf2de2c6f64293900c4ca00e999d000e99f6816091f6916e9e5bfe01a57c2d3d5d464f71c79abc9f1a4eb5e4dfc99e56693bdbe96d937868bd0e41e255eee89784e58e54a92db9bf818393ecd16678866bec7c84efbc1c3ddf8a39e6af6dd7864fff7ae243cdc0dcf147834f9819bf2f21bcece90d7b8291750e69e05696686c67348d8377be3b7138e54d674b2e6c3554bf0cc7065b833d7bd1ad3cbe0b837ee4923fd8c17b633e9b719d2f3780b515cb10d1c834d58486809fb5ee94b09cf2965f4a48ca4fcc47ee55d71298fcaa382655aab612c4ab028c1a2a4b128997552a142850acf23fd8801797cc67f846df361a88ca532e6c373341d6c28eb3cd5137aaa931f954a09e938473da1f9a3392dd642f2d234dc5036607d8b63a9820cabf3fcb7b9e928f11aff39ad3d49c96107567b1eaf5038ca9f92279486bd9e62191211ac8c14bb3da1ef1ba7c7e293e7b5921f9837972294bd06d9ffaae12f4aa0f2fa79379f25323d92e9bbde317aeda976211776eb5cc494e747774a47ddddddddddd051cf94e7dd8ac83df1e5f76bf5358d52ec5373c55b0f715eccc00b19648a6586bc4cff658a8b98724fe3cdd47a5db2e40cfb442b799b40c992dc4ddc2630d22acddc4dfc6d02d3ddc49f00e66ee2bbd6017b0c5b47b516e4655cf18c3098d7d7dfa0f65bcda64c6732a529fd66437528deae979fddd2f5b73415baeb1f8c457672cfc3138904cadc654043e35212b15145bc3d1a2ab6731054e71fa93c710a4217e1479bbc0d91bbd539e22236b9710f7c6b4ae5688115037d4edf7bbcadce10f7f43b10c74a9873ca942bb2efef0c7befe494d94f88cc901e7c3df86ff625b1763228fccd07e88a1c1f4e91eda66438db0cea7ad8f7d03d5504da2c305fcdfb536700070f51d817807f4f46c8f3f48e517eef4387a777747eafe3568e8bfc9ed53be46332f45dcefebdbbd564ddcdfbecce9c1cd53b3c8d75a42d39958eb3effd0ea782f5bddaefe20e8f4e7c88e103caae02624511c2e6030425c3f7e979efdeef5dff80a47b3549e4f79e3b19747a4e0f84734e0c4be51ed8efd2571f04c2654feff5d4651f8364027019bb9b4f6a0265fda060f289371f1fb76acd6fec61b237d18fa95f437b1badd19f487fc33e0eec71dc79e374a58d1b6b5c1863ba0ed32f98744717bba52b4ad95f38b9226f32fbcb167cd2fbcf2c438cfa675a867594a1e6562df8d8fb8fdcaaf524b76a397773f1b874ee463ee9b6bb913fbaee6ee46bf7b91bf9f54277239fdee86ee46757ba1bf9d8bddc8dfc79a7bb917f5dcc452fc41e5fe24ce46fd485308b617f040673402ced759c6129c962d8c4b2acb16c846173f3a0ec59ee7665d47164f7ec4e05854aa5b68602734d33c2602016bcf0d659de1f7ad0162810fee642f199303dcc5f2f5ffaeb1be6873061181cf1102fb8b1e022288ec5135d890b396a87134bb173a16ceb2cd7754119143a5d8c9d49ff030aec36afaef1eed9cb7e75f9b2cd2c7ff3016292e3cba730309af631578dd193ae877920560c96b94cf25f2e3cc491170cc4ca9ee795eee6a8b84b1a699562ecf6382c2edece3fa0c0becdfe5dc7a6a6a3729b75c45339dc881800882c3feb9727a2067e895af6cef4314238150c96c9bec67caa172c93e1cf1e061fb141868780f91af808cc1f3161099fe761eec1aae3ac633a889f23a2dc05943a20280ed9d5646773939d4e7eef3d2219fe8bf2fbfa1cd692523c68bcd164174015ecfb0d6e3ecf3d66e7d239bcc938e7e59200011303dbff7c74b28b0075420e846f5ed7bcae9730073a473d2d9caeebed70e92d7d4ede819c969b9b1774adc5dd75cdeb647e9bfb892ffc124323ed1a0d8ab714f6d74fa7726ebeeb5dd2b9cdc7f90eb2133f02d80989558b2c57d0e2166d71974065cb16d039f80e46083d091cc05adc2c5a54cc025b1dc5530445763453be3f978109167e8f744ffe755dd7765d3f31ecf2108575b9d9eef2ce39673302e8e643f3c30b085dd499f918a373b27dd48f035136188eb38133c6fafe69e64564886bd2cca032848e821fb09badf15e555e5a75ce653f6ac5300ce51e96690e6f3e3319fb6b3a1781ec90c84e5ead787b70b174346a07af089d0ed6304fa0dd230cb64718ecd655acb0e20ad82ad87054d04e7a7081106681105681291c1ad46906421f972da0441ce5f0e6e3edae7f7757818ceef6e79a2807193608105486eee6e520036a41f0c334b17df41ec8cb0f3b77e32fa426c3f7f008960132dd6ff03554324f4000672112b43b8583b2e93106fb349703d64d01ed7b2653ef98bfd94cc66fe73a0cd97796104e8837f9ef316cc6394df321cc32d8f9d4ef84831733f022fbc3ac1f14a5949bb2e3706c52db0da61af2e99433ab0d9d976637c2fcf20da6920d8ea9869ddc59e94b4f7a6b4b256c3b935034ee667ecc1accae8deac9e6743abd486bc5b2dab9c2e8dccd9c573e4865a4022969c0946d2d0a1c9d17396403c61453c3468d18138cfc57833222495dba749924875cb409f3cbd46ba6d18b565aa1fc408536ce6aa943b9a330d2cbd4e52c2007b63ee9fbbdebac5db1a3dab10c73ea56191d6976923212c9da51678d660f5b61d93b7d274ded47259148ceebe618ccfd3e9a6284a6213d9ca0ca19d0925a9a311ba6aba67d9b5ebe314622dd88a91137d2d78eb9a41f694faaa33a8aa368ba2f2527e5cccecaab67e8e0041810c9630c7ace19ff3d083f5e07ddb540214d8edfb6be4be9675f6bd45caed59ea68c7fbd8f34f9c14c3323250d324ad0fddabbd556f2cc382819aae239383c0e5ff30d80efef26ae627dff8c2f9fc4f44f5896cef7a3604a7fa5973414de435c4e5a2c1a46b8ea636ebedf7b874d8defb74fb5f3fda7a7dac1e3fb759eea879761e66570dc387d7f11b8475775739ec65c97c52fd18122d549505c5ecb090d298697e1998bdd2095934e7de72a4d937ee33a3f5de736ae73372433069c8f9787dfb90bf81d57010f737be8914df74911453cc55980028ab8ce7bb8ce513c6c19c8353074948cb93ca6f4208398fb43beb979e722e077dc04ec64d37d4204114f1170edab919f002210709358d721111073775c35e6ae1e0631d70798fb32454bccd589b92a1f661073737e0c21e6ea18d59d6b80df710bc0e31ee087b83f7cccc5c9a6fb84c8c3dc27427c49888ff727be91997720f2f4873bc4531c3eb878a944ae7b3507b8eec9f7eacb75ce000520729ddbe1fe18b15907216e12e776700249104b8898db430c4835e6f2906b5c784bf5e5c61d328eaff1f486f6a3460d79533790c06ef0a5c65c1d4c54c4dc1cca3861613768aa31f7a6540691dd604c8db936536418428d1a7301f032058815ec064fb5c6d5e177ee00dee6a67ec70de24d37071c72bc4f08f004787a7373654ee94080010491c3dfdc98e9ab37f7e6be4c63bdb99ee9a9c6dc1a13116ed4789fac5429140a957dac00478db937ac543f50305377ee90df71757cccb521e755394f1f8c75888e9b13e173d9eeba350829097a4c3ac8ad60f626aa92978372171be45649acbc3f4d1ad606ed47b492df0694a70c35e6d2cc50632e0daa1500ae13f9aa6875afeaeae8a4522894552121478db938af78f035e65e1e26b0dbbc35e6fe0f22bb4d5c636e0e2e1e9444080a9a2c317786972950686acc95210be0aa9eaaae009ef6ce7de2239e35d4983b93a4b5b80e7f2792f8e17f5cc16ed0861a7365f2db27ec366fa83117070e316ce041ccbd3133f47fca3366c45c1bb9c6c7fb44859d63e733d7b9cc75ee37aeefb82e83745e430150636e0d1f546c6acc8dc9a7e78183986b1a02e2811c6acc85b1410bbbcd54ddb940fc8e2b24e6be645ae3e57a8ddb590810b7a7780f59a9c20ab25b1d9d745061a9a3a91a734b68b816aff197614646470b76833bd4986bb30f4ae0a1c65c520f35e68e80d800a7c65c2deb7461b799536b5c1bfee6a27ee7fe789b7bc3efb83edec69de14f37c7cf5c1a5ee6e2c771efdfb8ffaa9bf300b8353c8fcbf3325c9affe1f678d60df2f13e01f2a6fb24000f739fe47f01f2a51c00f739ad3d9dfe05fd0bfa174483dc243aac7f22c5e2f13fbcfc762a9ad3dad3e91f854ae9e8e0f0a6aff900dc2401f827266bc73f9162edbceae98ef6a306071e5a1040198777da0f1c70959adb39e67646ddbee13aa7c3e659be0dd7391490fbe33ae7e306e0b37c56c320cbe7f124cbffa15b90e5eb74932cbf86eb9cfc7f1945dc4496ef812c4590a5fccd469ebfe33ad7c3564396bf739ddb61bb21cb575de774e4eb5c0dcf75aea6c775ae86e63a87a2e13a271f5fe750f73a87fa1cd739f9335ce7a493ef5f38a561b789d9e7f198eb99e6d4984b55b60bbb41558db9598649a253632e964b45413ae043e571fb87db32dc99db5c64aee3b87ee3bad07528de5fe70533d3558db9578ddb438ef22a4ee453bcc6bf54868be135fe3f9cb01bdc5163ae9caf463edda93137faf0327485072b3fd4980b73bc4f5443362ce15163eecbf13e59bde93e513dcc7de2c3efdc1db7adbcac700ff9805be70a59960ad344c16e7388c70f3b3b563ee8a87274e0f44003ee317a2c8ff0c644b63957f57d47ef755cc71a6d5da5d1f8814b5a0b3364846d6508ec0209ae28c98e06243600f5e00bd8c1e81b6298b766939b86dc37ff9cd65e5a6f842fbfaad138d466e3433a3454d21d8d3e7b4d1b612f5f8ebe02c1b2e779f4becfae9c01c6e85332a9034418035e5aa08e88ad4d5b1b8dbe75a22ce10d2897fee5e5056ffdf623defa35d2f3bcd21dbdf64323bd4642394a92462398fb4f3ef9feba9b8fbceee90c7971c2c508f2fb09a3d4ce5c6715c39c4ff5990115ddff1e7eb7bff6ee8206f4e97a07f6338b77b33f3298b50eb1fda191f72eccd0df210f4839b076e73c0d3acaa73449ec2294ae61bf2e5dea1b52654fdfed38eafdab899873980d75efdcdd1d7e94eed10616f64f5e838f60e1f4a126970abbb087d8bce605afebba24ec3092602fb3ec6716639c1146e874c47ed711dfb9bb24d4d138082fec247cf2bdcde43f43f3a2fb138ad3811415a627bc162628046181108e078a4c51b0fd4451689267f4e99e369e41dc942027b2e3191f0176fe36dfa4dbc472e65bf776214db4811966348d80cf1bf5f7bf649a9221eb5e635853f2a377fc96e4a24489120124483f49f8c8d63fa4bb74c93d3e451afbf43f6182e7473845e902ba704336e8b798486af4a427ddd14da23bf6c439be6b8dbf7588cff32e2fd008217e48bbbbbb5b39ba7419437659b056e7aa84cc3de4866aedcff184f5cf7e734339dacec352f5d28f383c39caa777cedc1afd813d8518d486481d9ca0ca100a2a216b432ee8a47070503a987b0984b27777ef68cc84e9ba74e9eeded142eeaf4b1717d004e599e78c53179d925e9284067613ec679030f3dd04769328ed1c4b92a7c4b13816c7d279f6124fe23997bb665eff10f21bc7a0ec6fd3798e06219d4e6edc03047eeb48eca916d8ada3389c2851fc1dca51fd518cecf549f68ec5736c932e309bd57f156f47a090ce5e04f7640fb70c6f3567ff681ac20ceb8e5eccc00b27197a919a2106a2fdc470810b5c10734071bdeb981b1b91b14b972e5672cc35369504f5343428ccfb0a43a99d9d9c613aa9f97911b72503c9761d04e559a7e98a33d258e363c0a95a4a8cd8a72ea1da9692d12cfb0b6f39f2d6528a9c8bf19a506d33c9598b2067ed819c7513397b0c3855f64bb815fc0c6341f93561f3a2cd8bdee645a9cd8b5479cb7b889fa98b60d0196f08cb3421f0b137798e8b80532df18e70395a15d346f3fbea723a87fe237aefd5af384db09dab6989d2fb977ebe3c110ccc6f4d243520d8c3a640b4a63119ee22ea68b816dfb2bda78f43fb8d52fa9b6ba1cfc57328bea6a4f26aea752e5a1cb5c5b5e474f6f5476b7155b35c863d8b63712dae850917cfd9de12dfe239419e435ae2549ecab538e75a9c0a15d7e254463ccf84e5adaf6ca6d2c8b59096b42604fcec23e08e7039a3cf36544673f6d5e5689fbd7539f5b3c7dc0e23ad837f96fd742bfa59f6ae3732bf3dcb1ec808bb76bb8cdb5892d8e0d5c84c648abb8842a104b7d0ea0bfbbed1f02bb27f9c4d4c5e61cf7cfa749b48b2fc8d89ed4896789b7f65d46952b67c2ab1bfae2118186540c1492e22fae2ca73ed65df58decd6ef5d6dee6d3d6cb3d9b0580727f166fc5d9c2ce7779be2684fec41b951992b93ce4c2fefa79553be3755dd8888c42e6cf4b6aefaf2b3344f6e0a77d114d2c090cc33eae4822e1bd249c5fe156b815973bc9f3c50bfe25dd898b11310e2b0e71277154086c0b7590a37600c1fa101368940c73953b59e26429e54c96a62ca5943fb12f6c670c2b5273cffceba57ca61f32c2986070cffbfe27e3f7751999f35f9c979c34d2326cab19ba1147b9a5256cf166774835f7bc8dab88d02899c7f126e7bfecbaae59e49431248ad48ce1cd48be708ffccb48be9e76cd7293ff2efc8ebc8777896ee235de415ee32fe514c532c96ec50813dbdf5504aea8adcccca468b09c789aa932f354ba4a4ff127527df66fb3a3fcc0ecee3ef3f61535149ac4ab71e9441c758386dd5028179558290684f519c176eed3ab91f3ba66e99b34650279316a35110dc145cd4338ca7f3b11413f9d52293c4f2f05f3e905f65d411fbb1b2a635a7d387a24329c02e1832da17cf01d94d89cdacf9fb389e962d0d5605f2f36e73bcc275f6fe111e8013a7a49b2a5ed48c6489a1119c39bd4024208217c1042ec7b7a953cf2eb696a761d0afb1a3606e4eb338adfdd60bd3d40f600c2fad7ad24eded25dd23b286b76bde7728f81036f62da1c43037255738e7cf79dfa1b0b78f6e46e4eb9bfe11f9baa211a6925a7d9846a311e95f4af6884caa5390a8582c168bc551c1e2a35a139e1375a3ca193a40e29fcac77dfc9f4e3e05cbf43145f3eb0790ce893dbca6cd487eb4d3b05763aaac5594c66bfc33d8f8d3b0f375f77bf2b1927cef3d897d8cafe6877bb0c7b00daaa5949574693ca7f4f6dd2405ab825e35209de12dfdbb5bad106f4f460806f1d60a62bf15c4e5d207715b7fd6306fe597aecbf4d578e55b6a92829d5f7f08cf29a9fea91c4b67f4b4b512deaaf6913609fecb3dbd1a37c9f747a5b4dff6a6ee5fa7c1f4c80772ebd6e646399f4ff5f2d7cba557b59ee3dc9328cff977fbe53aef9cfa22eb232920ccaaecd95843884de9d57dceaea4ce391a84e179f555071006ad5814d6494391bf654b1091a2a22b57ac583961d8b5e98c748ef147c43242e6c79fb8e7c232e21e88532e3049bcc12a846a6972dfcda6dab7b3a1de832847b1c0f66f282c20ce68341a4199d103e5d1c4c1c1c1c179189c0ae70926bf9fd3f4de866626e3e0e0e0e0e05c49dccdd8934824ac0b2b437aa04c7ad7754969edcb6ebeee0fcc9bbb92ea877394dfcf77edc7f4b9f972224b1060960fb3c4459422b624a732c26bb8e4f7dbcddb68bb21bf2dc74bbda7dc5d7157ba76105ff59c773d9c9388fc4d2795e59d4f300cdb79b27f4241380de0583bb0c06e30728157a4de715d0572c34c7ad739a90d0212d841faed88dc78bbea236114fb11c6b0c6364dbad6413ecf7b43c84e0302abcd91ab8dd52673fdef1dd8d72739d5e9722afbf5bd7352ae77f4d77aedbd5c8dabe97fe883cb790ed59fe3e1cd487c7805db392a7b1b86e74f3ce1c8af28a815265c32fc893304383dc2f97ef2f4c344de5301a5f4cd182f28dd75c1f79f2d528e5fdbf51768cbeca5fcccadeacba76ea5bdfcea56a397afb915e9e58fdccabe7c925b955ebe75ab97975f722b9897ffd23b7c4c59e280613bcb76b43e7713a1bb893f8af27237f14b2f30b8e46ee2fbbf942ec9ddbcb777e46ede93aee66ede8fae76a9bb795f6fe66eded38b4d77f3d23abccbf4d248922975970390d84d2b327c27198eb124bbec84c8381ea2b09de143c73f462ea00c5f09f9cedd40bcf90fc007b0012901b3733732f36526f6d69567ebca55089921a80cffeaa705da6ef5d3fac7dffaf9c77f7f5a399ee65b3f399ee669f89fd60c6fc3b77e66781bbe86ff69c9f0a86ffdc8f0a8bfe1dd47b7fa69cd3c0edffa99791cbee6dd4bb7fa69c9bccdb77e64dee601f0ee2fb7fa69e1f81cbef583e373f89b9fd68d4f7debe7c6a75e87d54febf43c7cebe7f43cfc0eef3e73ab9f968dc7f9d68f8dc7f91e563fad1a9ff3ad9f1a9ff33ade7d75ab9f56cceb7ceb27e6755ef5ee35b7fa69997ef5ad1fd3afde87773f72ab9f16ccef7ceb07e6777ec7bb27b9d54febe5797cebe7e579fc0fefdebad54fabf43cdffa293dcff778f725b7fa69d9677debc73eebf3bb7f71ab9f16e97d7ceb87f43e3e00ef1ec6ad7e5aa307f2ad9fd103f91fefdee4563f2ded81f8d68ff6407c90771fe3563fadfa02f8d64f7d01bc90775fc3ad7e5af483f8d60ffd207ec8bbb7e1563fadec09f0ad9fec09f003f869614fe45b3fd8137921defd0db7fa69cd37c0b77ee61be00bf0ee71b8d54febfa21bef573fd107f80772fe3563f2df9447ceb473e118f80773fe3563fadf8457ceb277e119f80772f835bfdb4e02fe05b3ff017f00a78f733b8d54febbd11dffa796fc433e0dde770ab9f96bf03bef5e3ef806fc0ffb48ef8077cebdd4dffcf11f80198c70151c8fd0de891fb8d8042ee67008fdcbf8027e47e05fc90fb8b4800114ec8fd08d891fb870823f71fc00005f021f71311820060e4fe01a8727f105fe4fe21d7b91b213a9cbb09729dbb01727ff490fb7d048087dccfca3be47e9e1e3cbac8fd3fec2421f7efc821f7afae73373edce4be51d9f4ebb83846c8fd3de090fb79e022f7ef50e3dc8d0e37872d72ffcdb52942ee07c0edc7e13a77535343ee475d1b8890fb6bb84f73fb69c0b96feeed1cd767b84f860b676e94b912c7bd6edc79ba988d9bd5b834e656d3d560eee8e5924ad7da5b22dd97d185d1aea9de985bc386bbc1e16e66e095e1dd19dc4dbfdf1ceea63f4aeedc4db2cb2e53d74eb08e480a43d9b367d786b803ba327118e145e18561527baf72c2ec5f972e15e3d27aefd23a5fefd2ae67ecaa18ee60030b3db6ac70bad6214208238440b4a511a216ab4fda5db596421ec34f64862075e932c292bebcf5a7d470abbb54e8136a3f28dea10676c296d8c36bd6d3b41bd421bf1f3b92e3cb114a6ce4e518691e752983db852da2a082a1d0026fb1c5b542e5123d813fa0054ec116676c71b15069827753f8a49088e1ab0216da420a5a349401445398b201265c3da620c1079c00c20ece4081089a50821664b1032bc2d00329ac90424913412f4a88b848f1283c504294052e88b2d0240862a0288c2560449982023158402ae802083dc842052508c9a095c42c6817455d604294022d9a7499420fb078179a080116a7620b2650a6b802932d566c904611cbafcc0f58f4aaefba93a23008b1fc760a78c0c2b1c1168a587e1d12b0dce3fe7d3be79c736e6ed89cd59aa26ce81cf5de7befbd189970842370c18563b993fd0874db2035c3d7f3ad2f21ca182184304a08a18c4e68012506f9be2d2f177fa6310fde6301054c369f9c0daac0bf22cecdfed31645e877b3ff34b7f02914a1dff5cf27838745ee775af8165bec9ce1c515ce084319509240cdb84111cc9852850fa09062031b2ab79bfda722b87712801cc8ee895cc9417cc0b603e883f5695ee56edea4bf392a73d6078288114818d1715ca814a191654ba59b6afb9de7393f190fa1c91abd7be77e1042b146bfc5ec08e9b0464edb19bdfbd38c5ff451b9ce692d10af06086c966ca592ebd77ffef53e6d488ebeb5de79414a556e0561fe87ca7f837eefa3d3e1bda757bd7286755857d8d7520491e5f794be9197e75f58367a263430fa279ae55e4dbd1e9bd3c8cbae843ad562361647b9fcddb862b8c117047aa4837e382c61ca273bf75ec276ab07213e82c618b7c425365794fd02eec6bf9f4c7743e152dc8aecf07921fbbbdbe228771bd40596f0eba983efc4d2625d3e1d915a62376765c21a77e3efefadc2a16bfcff71e0c88ef22d835f03db1917ea68de894219087968e283881148d8e41d47e48a5c190e0dd8391b00f2fb53cae6f454479a758ad7be9ae7fe4019006ed50ce88190a3f2d3c06e3bf9b9f322388439799c9a681c059308cd894d8e8294e266d253689a46353a05cc144ec14393ced97a8adc2a8094d20f0233854131893671902b77d057613b08ca53d114e156f3e12bc0ad767037f0e12fa0553c740dfc7f1c385e7296b75476d5ec7690bb819fbdcc754171550f563a4a4328468655328457ae6c6b26383035e79c1de45631e76602bf55a001f1cef383749e3d855bf98313a7dccddbc0f6e7236c50ae87d9c36caa1ccb4d487fe2ada7403cad8ca597c79b0f2acfc726d63ebbf46e6ec865e1c30e351bca92e88d9c957286e52c679973d2cd8a5b3db00ccbde65ee7aff4c31cb4b0abe10aa81175e4499d9116da192a3a0f2dfd02c236fd5baca1179a10a361c256fd6ff2216dbfaf021313be671d44bc0e5d705dd950b7a11601c31640425236f1566172fe7fe82a72a1d74eeeac14ace9229b355e04a8e70860b1c9633886a5f39cf09f98591b7ca5384e738a22d4de41c3c08cc9e00b78a39f35c1c77f31aa73e8adddc950920e1569d86fb427eee31a101fa4f348bb65391fefaf8838e9b1a48282f65c7b277f6d1bd17bb5aae4b972e63808e5b3da2477fe7f29d297b6137872523e1938491253ca7bf95f8d0e419f72051a69b96c052c9c1e7664451250aa110348142cabf0b052c9ac04252ba820ea24ad4840355a491858544062c58f167472c43447c89460b9cd8c24262230c56848210c0200416929918b8b7852a58114fd7d134b0a20a10b0e0bdc10a96cc1071be1a1f431a54b0906867b0e203b16c60c282188805a3b0d3513a8ef07005095a8458481c041b28012b3ebc4764ac80010b090907ac88695c8747d84e3a30bc0841172c781dd10ebe00810abef840100ef491ac643b94a7944c4485254453b8c2c50d49ee7f79c794df7544547092aba08e067eec31e0a0cb95a682090b622056b43244c08f5470411660b0905c6160c18ff84867b9410c40c042f2acb0209e4d88b0788285e4dab2811534910e9c9832c6095848dc195a2c81e557a6f02228d6787d035300a388052fce1296ffe00b445258f0b60f78c0a2578db7b330832f4861d159e37568bc800915acc6db455e8c4088056f87208845b32140818226b4c6ebb2b8d2022c2c785d174760d15ae3c591c20b58a85623cc81032b23e4b52b32022bde231d841c24410ad61124971652c072ae030916450a96731d5470c28af7887f60075394b090c81038eb4a4e90e2093f60c1ebce58e20e77605bcb19565c61d15e820f9ab0de9d7182d585135144611181c917b2b0de95c182456185d77d31f4012a2c1ad3f082108b4a261009b1fa8926598458749aa08a2c51b00a6f4f01460d8458efcac00516cdb6f0842894b028ed4212252c5aad68c9c21516d5b8f0420a8b8e2abc3d06134c908545492c70628845ed10a898620b8b96aeb8620b8bbe54789d95339cc08445612abc47dc10cc60928585c44da9c2023458f0df3d3203041612130c58103bd761aaf0361955280116168da9f03615a6a440098bd6a8f0b61638e0421316b551e17d174715165ea7052ea0c0c2a2377080610c62a0c27a7706082c47e3ed8f0b13e223bd012ab0e0000b098d82355d877f844764ca3082dde6b4af260adbd8658680131fe92caec44088850403010b3e10cbbd2333dc800531741dfd402cea15de0ee240185858f479bb07471b50ee264ae08522d6bb3265b8134e9c382122634abe911d5118597afa7ffe75451921f2fde5fbf3bcf81e84f2c245e4bbfb12aa074e57bdaece9204c36274abec7dae76b1dc705abf5ed630f2bc0b9bdebbae7f2f49c74ba176b57337f1df076708ab8042a55032281bc771947b46c251b34ec7a5fb886909315036b5e6195f03f250d0f3f4e1c3177cb895d3f1e16e4e333f5cc16e38d97164a434087cfa40f9488e59168172bc463c639887d641d2780e8da3fc7750621fde5018134818f6250c6fd710a4994c112159c9755e339b746a738e7eced17d5783bd7689f41ff1310b6eabd933c764e2bb3c2313a9b0d8ea087683dfdee3df17ac3318c02533c43f7ec43dfdf7790f90e0042999263b24848145f617a9d320fc3132f6340ba8fdf011b89bf7c4a8f811f908f2eb2c44f97d6799597cbff2e7ed31721481126a50d4b983281187e89b0f5fc4db911c5f62df7a793e8f63f223bcdec33d52bb604337b2751692e1857508f694315829eabade69d64ae1110882972ffbcd1fc4b9623b77f79c71949c9f6107e1dcd13bde6398fdd6e1a54c560cf63dc4f58bca0314d6af58e9bf9bea9555d3a95ad3652a92ca3dcf5464e899f1fcf494e47824c2307abadf92bc430cec66adb528f91cfa3c25be05181ce881a65357f8504cd92106d68ae72108e3c324d8b8e379b32d636ba7ce5066488658063e50867603d6571bb0fdb187f27c4bbaa969df29265d1776f3bd6adf7b9d9a1e73108910d14c9ef3de3b52baeeb9eb1ede82c88db7cc8a8550e3a9136b21a8653be593bbb77c413b6f3e8eab3a282563eec6324364de03e5a7a5885513103f2d4970b1f27ed504d6454cc5abbfbbfb7d52b9482af734bc2636b117a3476c5edef2e71597d4aaf19868d5ea75afe6d51c91274e1756c751d5f20c6d3e8e7297458ec02a491912bebf2cbefeba2ec792638c0f73c432f181f2e9b9e822de805825b1ed5cd56f95c44a2aa6cd28bdae5a6badb55ef5ba46557343b93ea953afa6fe4b7d7beb932ecfeb58697d7a3df6aed51ae3755d92ca2b5f09997b9ca37aa6a37a5a2b51405d0d81ddfe8a6ff21cfad977c3ebe39cdfb342ec9dccd7cfe771ec6e988c9089fdc0ae8c90ecafcfb28793667056ccbb259c3242feba3242e4c44ab893117249eca6f772054552d9d3be7a5efa82c097bfc1afad753be76a4ada3b579fd423ecdc0d7df83c4fab52fb91b91cc7a8f7399803e85e318c08704e0904067510bfbaa15bbdefbe62b81af612cf94e4b6f8cfcdc76dc9f17b4ec722b7e4c925bf0d2863231da9dfa834ee75943deb108d08000000400033140000200c08878442b17038229335d1f614000d89a0447e549b89a3248751ca20840c20040800000080c860246d00c7567427a237fe69bccaff4755a09fdf31a657b065d8225c4ad0e7eb2b5bd7d719f2e5b290e40ac36f3e244b4135d48d9fde7020bf0e61fd5c2375013f6d990cdfc4972c12a934bc6cd54492451c1208cae6f9e063b928f3a42d2e89649e2769cbe050da9aa20e2c9b451c54f39146b048608e493b1f75499de3dd2db83ac386fe019bc8039f88039c600be69599b11b662a5392d5287340a22726984c3a209c20f1e18fc7d1227467056e064cdadf407ff6a806c6091ce0c41dd864dfa2c53dd277df428ac818a35fc426e4b6e5336bfdf957b9b1ea0f2d0df6030c32a60cdf0cea8865ba4940954cf9b9640ad135085351412fc13b1ef4fdcb865900f54c9efdaa12c3ada4c033e9a880286d9f1a5f0c9025978449e1ae7f16953d0551ad902f4b259771bb40b0cd7f192979ef667ce3abce05f0c1d96fa362fc9dfe6d8aa9613751432b77a55dbd50a2d28dc9998be4f76ff25ed64882c21d632be979b88f89c20e955a8d9a37908544b4470f65435fc743a3d39b5ae392d5b4cf16f1ec62ee348b114c8cc5443ccea367b6982ac5aa8d330295a71fd58cc9b47cff20ebdce57e2493094f5b355abcdd9702720f27a7d01782780b0dbdee241aa4eef4625e5de4219d78705eddecf794ed244fc8d99e06a9fb3e43cb47634ea879c91c254aae47c7c48cf71d103192191ba6b123ecb0029a8511bd9b80c5fd0574ec34c9afb04a54c0d77dda0cab9166a0976e61b8ba65626f1c3f6cbb49eebee9fae8c3e1be895cf8c53b5aca2726a262f481b716c2818acfc7e9f868b9b81dafecd5cbae4b7352dcd05e97e499d633fd81fa6e653fa7a11fd57d45523ef7a85b5e5015e548a272e8f2164a9550b0c09573814f70f30497bd4298aa06ad24160bac7ec1a07c362753e54070c37d9e59ee782da24b8c0dae23500ab1c9115bc9b774b78dce29e5de161e281cefbc191e2eca6a8c398b4bc66ce0d49ea4540fbab665a3366f31ea111634d5f4f472866cf8e065e937f28845cdde8ea6bfd00e0c2ac3ef87516eef8f5972caf66e7e2493528d8935ad88a3e38f5bd877ca109a199abb046828b7a2c70cf7747098cfc8315b9e780ebee85fa9a10b56da90a381a7a4b667b1a5270f940df25b54d947048eb88332273f2998d033e5ae797208d2398b4e3f7d543ad6009ff2dc77d20c8d87e12528142206d886ce625b946a4b291b85357c22eef7d30f1a9e71e82d865075960fa17162cef6ebe64c7385400e9fcac2b52411b13bc3b86bc3a43791fca36c738bd41363ec8c875b905a165d4bbafe0a7f152e84dca70095fc3d00839d77dba169a0f5ecb962f4bfee0620fa74741844694ddde40fca40adaafff4ed59d77f70e7e6afd8395e4529f0d2ae7e2b437e7d41fa237e9d597734e219431651772a607fb661bd96e16da9c711e0adb9ceebf1c3134beab63fcba165d1ab352f3c2d31e718cdc02380c409c06ba0e072ed0984e542e938090451254a8019f9d9a38f5ce1469397c960806b4d2e9859098f8582704bdac9f38b96896b407e8d018807906d57d32b6239780fe16ead02c6ca440eb35853fc7346a827c2f9343128623cbfe9ebd385c47af92342d5eed372ea7e4f4a90e01ae7f2307f209a3946ddf6c559e0c5b88e31b48ed4400cad8729fc97feab54b9173f9fb881d8da7d5aea511738d6ef6acc72653bdb404c1713ecdca4942b04dc3a25a140e5977b8d58c6a41501da2f4a6553f23c70ecf1be4047c79ace14b05aa1b1d45d9aafea1133d81c16120c1c6ee2f6237ce4098e85c0d30aec2a485bf83602da36999823f75344b948120dd9123b0c6df5cfb1fdba4ab650e0b474913e15eab1cbf4a520dcb4b354fcdbbf93cff471217397e344cac6d1ef6128a82f1cf9d53e81b8df98f444064ef708a32e8e8b1397be91d6532ae22426f29e20c2f6145061c4b5e4e44830a879476efefc3f2bb225d3edde2def840c08c1ae39bc3c3d8c63a259d191399b26ceeb748b4f807b6b8c73b71b6eac38a441a2fa870e6a4eb3fae0d50ec1108f1c74e807a7052c666921cc829d33805f8da7c65484ca279d2b8d8cef514a084d37343343520952746476c3bf82c513b965c0c3fd0898f63126440b3107698b92d2789224e7d9e6203f9188ab5025617585c3c9042f519b63cc99e6e7f21bec6a8e738d836cf2293c1e872e7af73daf869699c008992b43aca1609870a025153eb8c4f1ac66ee588d7cb19283eb9656067e18676476161856ae6f8d99b688cbe685b58c508bde2ee1258283919311c36b1e018d54ec204159d648ed2ce6e420639ea478ea077ceb3439fe3471b93bab286067022a0626c3287928d05d0131ace72f34041a53d8498426e52b7ce22477b7562f4d075db82cdebd6c4604066ecddbbe1eb48d73cdafa9b64cd5a556600d95a3145cecd9b4d6831c84d308706fa8f09c6263aed3a26cddbf5ccd6d823046c4c4af6e95372ea1993a30fd3aa413a08c4db989fe019f8b9c8124f32c7628047cf44a3c33285c8fd334700d1fd0aa60dab6339c5a9becfec6dd57fd99d3b4ca44a1899e5c51e08af3ae9a3e6dbad65c082d27c32f98047342122db6455a9dc9546413b998848e8031abf708fce40e00af7863db81e8b7131fb0643904120b71f83cd8e06ee4678a483f4cd719bd7964708e05dfea4f06d936f6cc4b40667d03d5dbaab192a7675775139bc8be5afb95c384451f3959d45ac9a2ab0168723be476cc21394b2339f48320b11d69ede81d5726a71233031b811ffcaf403aaa4a6b0b24569390850a85518bb26c0de7f7207a0e9462c96369590e0d40ddb35aee6450f98a94926a63825cbc037c222d75bcd33eeef30b5aa44316717da09dbf3f53aeb1197fac5f6f1e5d02133dca17e2986598b76b23de852df2811a7c97333f2eb4ccc549cffd540a0ba8089b464a200295731d4f1ec226b88bfd89e011c441777b136de76c78ab5b672ab2dbe71be52477b3919498b9d565a9f581dd0c52e77c36162ae89a195a9bb28e0fc41b0bf3bf34e57f803d2e2bae5d2d3f88f5d3ffd22560833edf8e6535639ebb6730031a21e11bb15caf89095141b9661163c7c85350434420cd9dba2d4644643cec4284f331ec83ed5ce313e48907dd60b741d8c87f16e25a7ead1c99a6ca57c18691b8ec7281ee38f678e04f3545d60f4b8b75a12721b240e9c8fad358e5de6c356677caf44f5488a865d71b9b2baa35e207bac6f292cda6de7b33bf14c1dab9eb00935f1d2a45ebfa8d55db2baa29fad3db302f70262a317450afbd1bb4875d0db5111117b6e6bb2b372464c3b1844029557922f80ac9c9401b986851210ae1ad809b3c71fdd315819b047dd6f89504bf090c1ce32d491f3f263d7dbcb7f86877fc72f67f977b979eeaa3faa562fa504d0c656e5e2e9e8abff8115dde4129ac7a8b63932f4889267bbddab219b47d74ab04c526ed49db2c1ea50fc655ca2a896b8f9c6004160cb436b719188a0431b144b97b22bbb1e49f048568d26b5fec0eb3315c180718735d01d789aa47f963d79180bb077ea154ee3cc51ac6ac452e0f840242a2da03eb919008c91ae2891a13dfcc5473849a5645bdb9ddce5ddee13948b57a3b83cafa3f96602ad3ad682634f82fe30a83c88ce9218ddcbbb2d0c4f526dbd605aa0eda3bac6726ce19b17a799c9e8ea082213bdeb5bc8fa8d72de9d0d8f132abeb87c3d7e01e2f7b5c0900f1598972c36f9b0078b279349edf4a09fa68495a39d73299ad3bcae2a0de92d6a45e16f46709bd80194508e48236e6925222acd96de5ada3a35b543e0338546e03521fc454663328e6c3a089faa2a8c867c659620c42878ae8e8814551b1718b34d750b4a900f824465f034e89d4d0a181f9d93b094684b36969e3ca3fb52ba6273e2a12a433d1e378f9940d653f7becbfbfec9c4091ab89eaad9d4d2038534fc6fbf349a260ccb411201939615b8a76188f7ca6b76be5631e1fa5f01db240f26418ca21013cfde32a80fe068724ac3b173ea880b15146bcad186e3a0f890433f506a7aaccf8acbab98fa42b653a54978a90361e3ab099ca2721ab954332c331aeedefaa923dcd481cd9d52bd427344a0932042041c7cf15787d2cb4c2f891af88da7a119206499a8624fd4892d4cc39e7d7d44302d3a98e458fc9a997fb51447183f5225984cf0b91dafc520361a4e8c142bfea5e58d13df566d8ae6f874c9994296956781976ce6d5d4f57e4fc9d747ac2c296ff56fb90464b5556d1fee69f8a8ccbeeb09f130ee8b6bdc93c16053088c79e6e7b0fe46992819a9bafa8346f0bb4afe84ba57c21e53b400704955ade43d347fb160745079f8a497b6c10e597c977f22f590d79076ba2e7a6fb92add06564d01fd1e97e8c35f6f7159b244c5b5acc4cc8f1d4ee6a9edeeafbf5e70f3219f059bbab1d700a40203bd3da4278a3c30df2a60bde8841e4c84b49ebf4e9350bcec77c3bd1774afc26a4b46e024f154b1f58bd95d5c955aa0bae47417bf0aedea18202d64e590bf0d474a1045fad24237fc6e3801714f0ff50d1dec8ccd98298b98e3cb803945dae362e301823b5735e22903785385767055280f1b8400be99de99113e86cd15d34a3179fc2329e161cc6bcb6889a7e15d5ba5a262d37aea928c5b5b67619294abc9d727fa5ba87baad496b5fc95e1357814b92b5a751a87285841476ec1a1fa6b09483e569a44a0f63eb37a83a2233be21dfac7e93fbacc8284bee0c2754e742f97f566dc64f69bd5cbd4a1391799714124bfea080c18e6beb0741186a86a78b8cdf17e266f80fc84bb7e0f56403526691bf3da67f80d89f6634855e921aff3180a70ffd4f37675e7eca48950e614678b0ac3dd6dca572b1fc0e0ebb4f536923536da964f699d537b16327fd462d571dded29aa9d4b2ac742b55ab8e4078c10506c86940683780480e6826c7be1719e9119ef90c058a10f1797425212a4c1d91988ce7bac71671d26d806454ab1844f5a73f0bc5f1830e0b67743c0eacfdee2e9589445a04a1ef3b702958ed69b878cd2d4c1d80694ba682bb5c69a1672dbd53286dbf910ec62da8f282982c34ff19b7ec08d040f24ea7aad50979b1093213a7d8d9f9636affa5ad46a5da97c2c898c55c985632833a4594590bfc64cb2c289a52ac8100dba887587e36d921bf8f7a3eb62f086e3b70dc243f934c2f52512cfd27a660564fb96d0f9e4cf49b602b2505ff5174bb77e1447d7297e8ef32b33aebe5cc486be79313efbbb04e49758b7f1b20b38073b30a710be51c8f08297f828647d30c348bfa007c4b5ebfbf653fc62a22d97f7eb67df31fe7a20d4214dbb2a434604b816386f5b4772a93fdf4c14c2232f65c9da60e0fcf53607cce6f0f81fac0cb01ceebde0c684274869db8704c4b640a896a5a0c42db0a950fba26ac6f702a4f9e11ae1103a1f607aa587cb973e1f9fbaaba9b68829f98da5157a6cadcb67cbc19ad6af1f16504d790227c4b533234d177c3295776123d0e9462be57aa4aa5300b5a0ee42810020589e991f64e7e4e6d0a824d6a0a2e3f9dc773ac33d472bd1ddecdb4b6af33f0946dfe6bd8d5c4eb5d8e28465d0aa0ec957c6f5a0ef66bf0d0abcdc311afda2657562cdbf869ffc3ea259a9c1f4abc27dee8c6a8d2915801bc21312ac3c9b05148c001aba5e8507c2a690e942b42222b93c46348e234d8e17c0a0ee028677f78678e8bfbf7637d095950b1fa3f1991c0d60403a5adfeef3fd94439eacea244af42fb6abc8805acee946efa4ea0a664d34cc567566214bd73705e8aace6e68407a5b69608552987983389d42ef08b044fe3dc19294b419b437f5148d1fbb55f4cbfc503fe06c9458abbc3a87e56f6e42dc43bb8aa8d87c3bef4fb12cf616ebd7c35dc2fd6196bfeb89b1841a1dc49c015a1ce3e3dd098d7e1554b68ab6ea83c9b8c35294449c4fcb4926cf21cbe47593396426467a41eb0ef0db235dac3357286ad13dc27d93c3c958137d3b104ea895054fe90e82d9b81790be19b5060b16074e0960c63accbebe4fa1105f5072f5f1037a8f42ccb7fbbc44d8edff83bd4e526ad346604f551bb73e9ae900a9ff0c66be976297d84a874a6ad269396e2e3b3fdd3075fc6abc4505cec6d8cb6f3285cea1a6e0be90a8f508ac3c0569dceedbc854c45e337c39303df2aceca66045187b2e01d17e97ab4b0a90bb98ad23490e52159c18129ef0d28f0c46211a65cf22d7c5154fb6285abc32e03d64dde80e49a5d9da9e95d6eb62481ab0857850e38c389a85e8325b12b867817c6a2c3b651c754ecfea3ac25f3d53ce69608be73803956e55160c386e10cd3498bc59bc695c136d6ec02e1a2ec7335d953d05f62b3e966e20339eda9a99d9bc307327846b4872e498f74d7ee0fa44cec5d174905f2f00fb06b2105333a47e66922cf33f9c76d522e48d4827a5e210c031ebca458633a5d7270104ef55a203563ab9d050a305f1c0ed6f262a9043f5916f958250212a757040ae1264ccd72569e293323093c770ca30d10912de04ef928526cc430184562c42f9004dd0318cdb421b251bf753fa8458cc7ea0d6ee9b012bd503e30242a0e662511c99a0b94c02aab53c6a3094ea2a0d5fa982c1d2c81ef5f2e3de688d3ca34183aa46d1809b92643efa9bfc0194db0e6b033674af13291113294d24c9afbd0e47f1de479f7a0574c36fd948470aff9726d2823090e0e26998e63fcedb010ca2fd39a960a9785b8894d7d5ff7387d4b16534141433b6e629c080b3815f2e50a19045e53e7599251286a260209aca05fa24deac6ff777ed22cbc7685e5c2822e20dd98ecd9e7c21b3c78751c272bc520ee2fc8d207c229b3608cb6a654d2624c49f33be369f1c6292459acd4079a11366ef3e87975b94d473e6d876e8eac10851ce3c92020ee020d90278aee8e3c6ea73755df79a78f34e0f58b0a49a0857ebd4745812ce72404f757a172c435aad882df9857b3193848557f69c7c47751620c812dddc098f34a78d43c9e879d8d589637800adf926ae672bfbf8abefb5ceec41e0e8dc00a3804f073864b58cc93a4fbd9984b95182192a686d9f207583acb9322bcfa4e064e35b328abe68af2bf7992765ee245158efa9393bd93ebc39a21b6708fa6c3a45aa2d87c83949ccd9920aa223266461595d889f451f68f25f5aacb43ba84c52515f121a7af11baf9d528bf5439d33d0d13c2bf0e56ba73c6a85c1458bf154d6defa1cfaa37b6a031e587d509960a629c7599a8592cbe8bdc893184706ef99403169afbb6b986f93168bee9fda5082ad6877c2fffab2fb9ee59d6a14fd5a78685c412d1a014c0a73f81a8012e6b6abd3991768fd3bac31f6387f1c2b095ee47b8a963b2dd1cbda3ac32ca6873bff8d10f462a0dc4ed6592b7e560f15c1e5ffa48c99784d9678bd2eb983b2365d0c86c8b4dc033c3706d3e1b624ec35c03240771d2ac7c66697d8eb506bf75777479d06c2d1794a5eaa26827b55e8aea40c696aac0dc04ab21fc832b05f64a3b8a450b8c75fa10cc2b888336aad8bc35b23dc1d6bc5042cd25bd4453308c2b28edef561aca92791d87666bde352ba61ddf21b7797882b53aa63d5d5745a7528dfd6e4370931f67c880d56014ea48ac4dd6a2bfefad439e1731c486f887969061402cb80b65a4424d11db47eb66fd4df330795aef29fcc29d489b1f7967b1d852c47a21e3a75f8cf38bccdbfaf106ed63eb75c6a08910c625a9a30f3949b7698ac59bb3b1a68741237fb1c0a827426517ca08799401ace60a7ba045bf190ed2c5597332df7af7f3dbcea4aa4821ceb884c2735036e36da5387461d35d06e7bb29f34925e040c2e9327a749727a191cd18a1f90fd46273a742a0aab873d84d10be53d6c2243d6b7c91f67e7876c10f496d1604af50660db6b134600a5b6d7bd2fa5615b330a67c5db70e335d0633309b92a20a00e3567cc82290b4965deaac3c0c3e724a3f663c29d94a4ac35ab1b1a87f1ae4467e87bd739f080a6c5b89fa7fce2b955cdce12f6817d7ae31b0f08c8dcf0fb94004bc64098e3aa57bbf936e35fe327221b8c30cf187aed011a2b292ee747a14f8319df54dd6d420d647d15f757414c66ad589e924341c37081eb52058e2174b35782a5db44d16a47396cf692acf98c7cd2db05411a3ee311ddca5dbb78c83ffd3c7c21236fcc9f55cc6db234a4c4f99418c125dd2f4630d8319d47929c3c8538b2fdda72fb62b34da4a84a18d4ac3a43efd0eccaf9e7ae352b604892da7c57de882ea4299a00b3bdb3044334de86797ade1abb43542c257162135ec1440b39f59913e9dd8e8e5ea26e3e045fa2b067e6eb75f0ec28b8988f83f96f4a0fe32d31e9719f47412b4c52dc82db875a734386b58cd921bedc7eb52c6df6958fb5d143d1b1db589de0160093dc995491423abe9ad71f339bdafe9e028d0f2a22910e49a6cadbdbbdce2f292d4a783592796733b620d4d80cedb2981751177f028b55c9d02321facab71ca81344f85220dc6ad63c9400e4a97c8d34bab804fee7a33904ee793b479ceee02aea11c9d169f6025502bedb5cf3aacd6235e2a7a51b6bfd75c922cc192619fd5db782e2ca1d12a44c481187e8e2cc2fedbc61a11b80cd69cb85ccba483fa642d458905870ed28341cc71fbddff1b059027fb1c031522d340e57ab6479bc337c0ef523cbce5703eeaf4a3b476561791f71e11e5011f0229309cfa624c80bc351c1edce23cbb0c29ee407eae56150cba9c2b85eda74455e0ea2948e871a59c8daaed04598b204539a580af6fbeaf9a8ff29a6239512852e72493e5c880f530180ee392b866de7d119eb418e8ae921da7e9e47a8cf6057ab35128ac9efc9eaa6aa8df0ee76842c78a1a6575b0dce3606102c4652e579bd866fc7187eaaebcbdc0f396393d627e203f51f0f1a6f07e0be97d62bbb7989bd88f53d899e9129501d98e52207aa622857ad79a5ec258c674e6960a130d35db58d6b8a0813b91c85226d1ebe84ba73e7bcff2c086cadb5435780e5d0cf53aeb5af63fc55480aafc72439ff020ffed4fa1bed7414633c23cdfa38418ef09b0977aa1b388fa60793c4b38e6a8dbd313b0457dff21401d728bd4547c5687255dd23002f98921484074c280b3fe60490737785273796d96741f97f3442145f2064252855dd27b2a6fad97e321c507960d502ebe13f0591e709c5d85f5e500a0d7265cdb622dc7cc5e9c6585b1d6dbfbd16ef367014e578609b258cd32c434b7f04c2e4153a4fc64d94c1823b5b572d074ff12610279e43deff01eed6a2a5c558f58ca845a375625bee8a0f76cdc7cc191522b78a83fb34839b7283e49a42d6bf51a4bf2f9ec667760d52bedc221c1c40577bb23d285417a6aeffd46aeae85fdb8b2024888ad362be42d02ab3e136962623bd9b12b4b706da98949fabc929cfa748adca76024f59b7a9074cf2b9e87bfacd39d4f5b0e2399c057859f3b7b281433bdee150dfe4aa7fa7bd05024d0699f7abed85af3c36b04d82efaa464dbdd701c5c903c1e3c4c69bfa2170c13cc79f61f385f1df7568d8dced0e86c42382632176d54552b80123f9a6556d61074e81dfe1a8b18e4403bc3dfd362637277fb4c75bae40d6b2d841c5b492230a4fdc21d6242426f61210b5b742849121690b1053ce7c745252b04ef0a166d50c44c43823393d49abe4b891e6d7c6a4d92b78ba570902403663b736562528a66c6e9d015ee279ca191dba139a46dc438ebbf01fae503d6dffaab8f143a73f10e6904fdc155a646c7d3cd6effdc5e2a9ebd30b6a150b9fddee990f791116707c444e4800bf04634c3b40403d65d982dde67726b3e9939950a8ce1c0ef02ab54a2e680df2f97a3fda8322c6f0d685ccdfffc62420283d4b4580ebc409195cceac5e553e1e0e09f59a377bb069a8cd8989e1c760d47649f26c74d10d4d96b95393e26a949761677c7f4e833d8c3b68453e75a1f364250330e10a8c86610fd9c5911a7e3b1c4947aeb52a15e9857597b955d4394836eec82632b442723969dcdc2ec454a8019692916d409a973bbf1012363c2bec5a79cfa8120d104d5d007a291a686772b4849eb8170c29df7fe551d7f129a1e2018658e5195b3820b54f18e2915ef39a7931cc388bb2bc8d914b2cdc78bcd682285411cefe867d20a4a52d0a7dbfb1eabb7fa37e79de4847fec6130a7fe270c9807dceb2865445321170423895d81d1fef681d0f247119a796b18e1125b3339025dbbdc586d8f25b16b9045359cbb9eda8eeff5ce6adb4aef8a4992d37189fc9b29395df1b199ee686d42b9cab514c07444590369b184406562a8b0fc10bbe9818d883790622dab528bf00d1b8e94276bcac6beafe2531d411ecc12adf36f78a71094abee92a4ec211f32e2e0ffe1f63e606439e2be3f116546bbbfb16968db433c775b74dec80e60147fc9f177163ee50a55bd366b619bd05ffd63f963159d4846984a5c18d572d4a70557890f124bea916c048ddf0224f928f207ee5b756c0709f6fc8f18597aecc060ee607c28c0c7213d97c8e1b004c86e9479a2c5af2c64dde9c6fc41aabba5ff6667d5348caba70af7687b7377c9daded909558011adda3a14f985c677370b5244dc92ad998f0e1b13dc1a941b4e17f9aa6d73e9f6ad14cfa3a58a9e7ee635a08851b8319104b78d9c340b02ab9eac2d529bccd4671d44ff0fe1c6b0bf37f3172cc4034525bdef76c1f3292eee68283380aef85745fd2f25477d067fcfe78c265e357ba33f1568a80687eeb8a8f9ef584746017d66156d5966012e0c2b03366fda8113fba7f8df44061feb95fe2e19967ae5b9a412b126fd353eea101311c7862409cd840b3f6c50afc8682318da32346cfe8b86741fed2f79cc191b5e562325c3312e98f41b61d8e4c4ff8d3db8c3e55dec7c1931d779a474fe566797944412e6a4d27898b7840c6484594e67d06c6730068a91ad588525e885d25109d3275f1c2d3e8514d5ca4d6176b14a955c2affd30413ebb93ff79ff6751f3fac268a40cb89cc93b3b723690ffa306557246b49ac2797119c5bc9b09021105ea935153bbc362a61a07d9a2caaddfcd4260d473fff59423575c5b12e97bcf60748d14f41eafe86976cc278e8c51aa899a112a7111da3e8e9f712895a2c9c38943dd68389eaaa51ae5cf3e0a642d5b3e2c06b503c30257a37572a41b99273a648b6b4862374d6604a32b74a85b450dc861f4a57ea4c4c254981b1845daa1ac8fc49e1f19bab53a96871d3b17347e7a99b50213472e875c25088e531eb723de3bb272610d389d8a2d954a9a193a1822faa5c80dd10a0a225149b2b9363f4d95c8a8981faef92af4d3c2c4ed70f4c93e65307bce287dbf93a06455fc1bb8afae96b2e457acc279b4cb5980c7700422088f3f9635ce25e2233827b81917f3819548a1a3ef1f15bd091921e398cd82e9b8cf0dc0cdc39dca3bb502c7cee509059a6712b2aca6c5c636511f38f8c407c0b1016a4e7a117f36e203e3415251e13ee382bbec3a08c9be9a51698dba153383f6c10f2892af596e0e5258bd280bb0d738b3bacfdf87fb00342f5ec40024bc666e97f15c5a0271e125dbf50f3e0cb78c52258b1da3f1a07de333baf4c7ceef5e2b2fae26af749c3469032b5509da491806eeb8b494582b432e4ce8941f5a41a31370777bd708d2174da816520f67656f5fa3008a2a9409bd06b13128dd4bb050cd827b7004d88c10c57b4af3ae4277824f497b4295a0f5030f74330f680aa34f30b2fca201697dbf5a85d44366ed13fe65de6ec5f84ead51d43f3cbb80efb1e70856ecb0bbf006c4d99152f5abdcc0c82bf3f147480ea0e9e9f4930e9e2cdd415fd39b6489a1c9a1cf0a1118461eff2a2228796ceb30f02cccbcf63e1a55b18c0cc6067074abb01a62bf1b0ecb3a16ce960a64bc17470e1881406653b275e3d32de206830206d04592c3e7ffe0ef5c11fc4e615db876662511e1fbb79256bbc6cc92b057af3d9d341b675605e538cb9980a8a5133a0fb2c417a3e149c16661964ed571e6202b1fc2de8a4a36ff56839060e0ebe5802f5f9a534a887a660b9d07557cc4a6bdb0d8798979b9e9ac5891e72b0bd4f48c471a8b882b5bd2d0d473c1c47f9fa4912ce6724f4defe65da12d2f2155888b0b3dafe95b842d7f69d8ade1103040971018889d6e881a1ffe36bb1210a590f3cde382cafd1250fbe487237a1750c245831489372b12f28d5e75b6cb8679e03aebfefbfe90a9282c4d18c918aac27e8eb3d9ae9934b323037dd524d301e4a0a1f8f0384987f4aa290c7651e1eb990a4203e274fb717076c851a0e04d53c43f84cade8c8225d07171a1af149f330fbea65a9b95d71479306ec22f0f9fcc15bc52dda6ab953ad9b51c00fbb049496deb7f60f20078d7303dc2c8b462355dd6941e11cda27ecdde726a856d39ca710f32b813d56ba122fd19b3a83c6371ff5d1fdd1dc3fc97d2649fbf2ca2ec4151b0cb9fb31bb7dbab0af9696e53761c13a47c5d2e1ac69427633cd4325526b51e702c6bece0044f4787d4df8688511d50a8570506866327212488624962210ff1ef51d713d867332ad2a57c542d7390f091a750888afba3030ded9bc8d5781bdd78ae83020a0d78ff95b721e2c4210be63c4e43ccebef9c47fcd67b310231fbda3eac96414a302494fc1751bf6ffcb31d1dda78bc6917e163f55b14e96d1138c91aa619bf0c24d16c25188170ae6fa6faabb602cb3e6bae72c18c14beb8a651e800f1d0d3fae210b6a1f467a01b318d38efb0889ba736811885b67a660e2f8255d55bca2ab5685c3e926e47a2264ac2992092474bab7affc4a0137bd6f42c433986f3bd6ebebe90e57cb086bc8f3c5c7c64c7ec57fc74d6d942b1e22e15e099007758348eb8cf7904c8f1c787685878f922e70fdf47ad48e4db23f6057ea826a0934110bbc3be7fb7de701ef36f1b499a884e3b16cf7e571c7d18474ad5f0d5d8eef65574ce8a0bf21ef4b043b8f65fedd0e2b19e3af6dd2d06577563ee9356e7f225a540a5f079e444c8511fe9a239de567d7414676b515b5f3a148a70c7c426a6324fef43ecf80d53496a0e109d01296e86ca2d2dc60bb9b886a3cc1b12312f3abc433620308c126f373bad3af15dc07a1f731d1a30031f6b8f30f8668e200476e5ccc5de3a288a81187383788ce74443146afd8ac1426f3bf48a01621f36c262c383d238117452dbc611a60d5ce85366c7cec7485a4c62ff0cbe2c403ae322e3b012adb77d5691b268dc36261d3024a58167c0241a2d4ad464112e8b890fa1d65715380f1b56a9cc10ca3acd4c2b090cdc2fbdcef51ac12b1893fea484ddd5d0229310168b86c4f4797caa667eb77cc81fe502abedb33a5f3c7b01f17aa056bf0249f3592215b50856d6a6c81a3c090d0f711ee870e95f5a99ed990fcbe3fe65e34e3f1a01bc3ca093ffaeb3071feb9c0cdf3fede17dfe8da6c5176006f3c1342483918e5013126444bc27970d72352c735acc3dea17829526cf116ba40546a8de231319901002d3a72b1841c064af9ea428133e006abed6956a1965619982f18fb98e372e063a2575fb9d80f16b94ef6aead98de46f89c359b01364f70cdfa3f31ac0bbfedf0d80f21823b67af0f111033cc380d1f1a0839592b87d7d8ffd8380e1c78dfe2578b60410434128160683fb6476c34d3b880edfcbf9dc3cfb17d1c5182b05fb1568c84cac0df054c78708e98f7b38914c30e5116ce603184659f5cefa8da8d92c6e1d2e5941388422361ae26b808d0f0c4743d9c8e8edc1ff6de0b32b19c81ccb258cd08237dc4020400c3ec9d22268263db13c5307452991038da9d2923bfa02c3a135b244af930e87325d913ccb4f5631a3d6cb90d9a45b42e8c13a674f2ab01e89cf7baa629edd1bc37e34cc084cb614b18f9b66d105be9aa29a60844866ca52d31311ef52549c9a12c38a4b413fa91e1a363aad8f026ca6429fccf17df9c320936a7313068cac1ccf85c82e5b8fdd0df39d6fcf824f9a26988489c43d0d6b15a928b6083edbc3113329b74fe93a40b4a84446c1f59a6da26937899570115465560545eacfec1bdbba8ba6375904baed37df651b7db8eda6baa8891d078fea4d3464e246cfc3249ed895c33b4530cbc5cd7a80ba2aaa18c6434ff6054d39e319e649873ba80a36d5a534a69acaa008a95af75fbef78bfe869e45a3394f83fd9e039b371c2f1f596c5b4e5b3f1d39414b268684c6c3a42a032c9125f21a0da6318cecf42704461b7887109e910336be1744f8cb927a30ff5514e0020955fe838a1b0411fb683caceb5d9b425d47e68c2201308c3b7899f8b8bf6e995793f6b9959de5408242139e2fc78d3f63c5930c864599ce72e22a8b5127e91b4944071094c7b3551beeadcd44ff17bdb0e11a26f33f027fa3a449e5347bf6df514abecd7dd05303bc004e3c561d689cf27e3be2330ae6e03e1496204836e9149b82c01aa876195af5922f16bdd55a4465b9fcb815b01327579501c046d234c7b0282c1b728099d0a8341ffbfe60f9a58ac8ed4211fd59a3280bf421869c957b8a516b1a5f18dc7d037519b1f88429fac26e17c468f47fc76934f81e70bacf91aae55f61bf2c485637267d68a894dedd927ebc1307b8c91863d0143ed3cb406851f7b598db29c0078dcb81db226421337f2d05ea38740ef3c19ddd2b40dcd918c43d8930ce11b966cdaf46f4320377ac5cf8fe8690694517829b3aa9e0a824d40f8c5425b56b20d60e81c0dc8421e18d19322739eecb8b642dfeaa88742ffc174b6c71d9959b21198ab836d50b0487189ae758d9fc11ee07644554ee62b4d889085d67232539ef160f4f61dad0411d4de9265d66541114c2e000962c177dd5e62ac89b9aab4e3e299bde016958357af087531ff5f7552b0d212e0ca7f099617e91134785544809fff9f5272034f490b9575839437d8b34aed5eefcd3a8ace599d8192b74026c5d477b72256a4d4b50a05f3bde494c27032b5df3c7af61647b0b08a549708b83653a12f1cd9ab2bebb6bb33a197699ab1106941c14044370ab88ef0270192b8520d26a32b2fb5be33a122a35b48677f14fde2ae07d6cc331b811a59de2d8d1995a0a331d428bd714b3c437782f579f464ec752efca8209030debae4e07b023b1c06b0c7a58fc0655dc2a6e90c1e0555b3f6b4c8e4bcce422cc0dccbd80ef560f4950ddd66d78b66e8d6c453784271e1f014b2f3f444764161e75d0b3bf37d940ce11525f95112bf098adbfe35e80244d6a8398c34b1e92e0f1c1e94127a938cfc9bc817347e07c3cc6a7a7f6d9c817e03b8ba044107a6a21fc04af6535366d90a5c11a6c0506acf4a855bd59df652eea4996ab96e66ade1485dd27c363961e2c64804e535ad33c4c089a01d788366b567b9550a442d7613fc2c59bb9db932e8afa7cb4e2e87949ef03631b2889589b2c5e80ca029a3b0071c3983c361e6f52e465e202b3eac55b1ea554344a6e84cf6e6095e26afaf87f4c128258e6d6f5d063b0c5f6f3304514bc9ace5c0c18f32ac486332a820d9ac039369883eeed7205303e826620f4d784c3d089bac468c0525069530c1444753d214861bd9ce8b85555a572aea51d5557fcce705784089ff338d90b6244de7e805ea6e44b7e9a027101bb803aa953ca4bb13d950b15d7306294da826a8bc83278fd6119c5a425c6a3c5fa93f7922ed4d07b6f30fdfce18092292d625161f92014c8db4dcc71c8e58f05922840d7b59de4d6379d777e678e1c466b87f7aff05584bf4a25a5063e63d9b506c8454a9a561f8987a952ac03a54b04de38a0a641ac3963aedd77b1faa370633a1ff35284c9bf0aea55b73129ac8edd780196681892ba2377a31cc5ce0d61b7054f234afd1cf33aea3806be81acdaf33309b9b5f38400f18aaafea9a52a9cc970d5382687624433e0551c08aacb01af267163b326ff00cb67053a4d30f6d1574b500591ba9bf823cb8f72ce2c88d897232dfe18722b574ba43364b171b6f287ca3826ecd76c30482bc2b7048080ec1b68534cb911c7510cf449079df6e4858a8089bd28cc9697711923d68829984fc2e5e52101e6f354e50b06e4762c2ad0bd1b5792a4842cff93840db2665e1bb92c03bb43e828722a9b311e59b11fc073f6d69c5dc11f985cb203c9648b42e478f997bfabaab116680249027eb920756b36deb34c085d33c7e05b807aa59130f0825b5089a5706bdcaaaa4752bc8d17e769c8a0e7a1310346c5cc7683e8339c6aaa1a26ba8fab0fa713ea7ec0416888e95c370b101787d13822ed7b65d4753e92ddbdcf668b6699c66b00ebeeca0b8ac3087c8f7ed0a1a544da75412f2590bcc11e7988297b4168d6475555096cf402f7b9ba32fc909b99eb6378a4a0b924ff82052008a13fc12c17785e33c4fdf0f0125e6e41dde25dba22d8f9328065fe1f59570aef4e4e3f4b4b7f9bf724c99c4f75968a8d1123dbecc02933805787220d613d42d0ad5b7bbedc3e246ee892f7f951fd94fa62a48eadda7ae675959226785b1972db0b7f10c5ac624740a00968c5f52015ebafeb2e5ed4fbdbdfe6b824e9ef79d6556193c0aae0116265f25ca7cd07418bb2af7f3ced59333a2a099cb94aa5a9f7b6b28a46b71d67bdd09061ed5270ce6485c5679da814125323e613d812012e8125df0afd1a59cdb4166508ddbebf646cad31a0c8b1827b49cfbaaf8d0029c63c0bd889a51acaac283f458325b5f8b6cfea7c2ef2ae0b77aa43a52cc9efe2dc0f9a36d2c5259b429a594908012cb771ea9d75b2679fa672b18859289633e66cdd33fadc45fa508eabb83e3f4b0608b32e81f33139d5beb949eae8f8c196895173c9063b102480b83526342c396a4166401ee3a49899b3dc14862cf11d1d06a75d9bb4ab421112af8d6ba9f057b67c9a185255bbdcd9b02f12ab9ed91ee59d85041e8a114a3b7c806ef2a8310cf9aac253159e22d4308da4d353bf81796dd3097f81c1a91b7f2960e8672025cdc9f94c20baa3442ced184c500048c8dd65ffa531d86188f4a5e3711a51fbe7929159b8adf36947e97a4de5fa06e638f89bf92e926c989919d7b550d04058f8c05b78bb4a13fd39e90226b002fa9c01adc9553826c54d139e925873989eecd2ef9c132cc21301be4e7e570940a08b1e530cd34687ab01c206afa612229072b0fad33787230a0d03a1fe67e309ce48094f38792f84341a0a4962a8720e2ff48a2bc8310ccf7827e2bfaf920fa9eb9c2d6e6b39a69fb9cbd1d19d274eeead808030eb73c00e86e7847923b3bb07508512fad8f6a0d174bc58f84f7f2fbf90b3ebc8f722ea0e930e05ba1eac1a5f072b04ac3e84bec9a2c94208153997390ae1dcd777f3eafbe3ccd209714221e420b5033a4b1d73aabeb01ac2777f3afae118bbc17a80c8bc95469b8e3d97558472cb38cc2ec48166f93e21f3898f3a9d9e95b77a8880b365eece7eb472a204b17b7488a0ecbc3035d40c0a57a0903d131fff6e537e75bfa2f75f0fb1b207f9ff9496610ff5931e3af2fafe7ebe44f12bf62e50bf44dbc3bc8fe1ca7257467df4a6cec38de047f48ef526c4e2bb111aa46ac0a8b07b0522c48686cbdb3af5b1fd7092513f0468a26c7f57f3e2e97fbab5786feaf54e8a4ea410b0a1a4abc39f3f8c065206dc2afdbae26626dcc0059e4abb07330e47eeeea02ccee7d5037724bdb6f9dc1e5b9e91fc3d59fe87fa57e4dcb452275be1fbd324a937c3db2e47f251f39afb03d98cd4573612b72a308381f9c9a52c6b45449afaf950077f6fe6b4be17c6490171ebae3f38ff08aa0eee9f236ee592b204b1745ec3c078c12855e0f055fa746085b17c71f19cf8e1665ff0c8e39efea9214b2dd60e1d299729d9c1595763fa05440c1b20da8ebf61cef23f833e089e29b2040fa613a00554b1ede3fed28ce1b59ba2836853dfecd268360f6baf468e1699e9077f5299553dee3f3b1a1d742e8604e3e6d71fdbe3fe1c90d24493364bafbc6bff9934de5f592334db528f86ddce7fc4e1fe302d3356b9c44559c3c405ef082879526a0100a953b931ec0feb6651a6541f487be180270abd4231bb323c6c4b4f9b402cbb87b45b110133f762c6b92762dbb7f87134453968bf6f9780094bc5b25301d5cabbde05d409c4cf85d254857bff861665879b939311afe4110490e4df6a157c01c0c8448a2d82f7dee4bf361c8b4bd30283077ce0db4935b0efd6cebf4e259316a48e00450fb75acdc255848286a5bb237462358c9792577bfb49181f2d1b37f8b329cf29898f0df8887d83c2f871417cdc4b117e92441c1357ff1f6918ad281619e3bcd7d1034ea277eab14b0a0312e9f6d16b86df5cddd72d1f32c529bcc073970e3bdcd831b4c6902840302c3bffd43b2c27974afe38bf98d15603da7522007672b810eca444da7507d9f317b798d9d101bee18f6f1e75b1cecaa467af449c67ecbdcf0b43a2ed6a4a1b90153e2c06165036fb6ff47530c782639655fd71ad6a2140c20f3d293b43fc05c08accdec017e261c803375c09699ba52e8ca0f6c32f300729b810bf8d8ac0716dcabb7a5b180b8fafb4e519148541c7797e07f8d30c839d4fbcd7c6a663b81dd5ab6edb93ed8ee03ac544e9cbea08f1cc26b88ac85f122d6807966073da97228c2248f1659c74ae0c9c5c02774beaf8ddfc412932314870c04945fb321eea8bb46a2742f2fc8f119f7c031b9ca2cecd3c8d6025def3b19e2a0b17dcce2c09acc1e985c66604b7dd5aae2d538fb4b99edf2bca62b42e9646e2c853c2eaec7e6dd5f0b6140eabdbc2dd754151e8261f11ed84aa22b944302b7bf9fd31aeeecf5c6d875cf36fed5767cf63ba9cd5b84158fbb6fdc54797a2e34d92c27f655d0888dcd331b8cab344bc5e572ad5e2e07f24475f933c60efb2c49750ebfb0b0731f4160e2f02bd7290b8ee5be507651c7eae33c35709973093a5f5b8bde91c928dcadbf50a97b41e5ac0f548c38c1c82a5299ee36812d224a521ec31cd307a85f74ad8a5973e4bde0424a456a5ba17e385b92bfa198db8def59134f086149ea4e54055b95d4dc9728d1380dfaea15b3aed2a2138b5162c818b41ce98b358b9e2f28f63524f1039c47bfcbe496c5330aab835754e6c26cf62939bc2205254d57668a838119d7ec1e9a2da82036815e2cc6f1636c1cd915011aed955e41a807b2c0c44782fd03af52647434f41a55603d459c7b757a52096dbd6e61bcbaea56cc9272941bd4f2a9e00a8ea103057d1a0524f5e12cb7db24f7a65d1a2477393924e13a02be668272562832d35971eddcef1c9a04e7c815856d5781a57bb7ee7b6021edddb47aaa6dfe6380998b9088ecf2755c650851cffd65751b107761e9c66fb13c20d69ea1c650cc7b89cb390b25c5c3a25e8db001a8beca6860aee3546cb03dc3978da2ffc36ff1def9fce3aec0f0c445a3c837540875cb429194648186d42387568b93ea06611c48f0d760d0578ace563ace9954efb12704414bdb8556fd0a54a06b973f8d34654b72ec5644e4c9e90b12ab3f42dcdc15d9b56d6f31fae19957a1131cdc51139d3c46b3a9dc4da3c15bd6182c73826ea2bc85bb8a9b3c70256c62ab00927973f30a4e04f67e1762728347f1b9c7329407e5f7a7c5dbe33800cc57123e0fe9e5f767c5b9638cd70aa3c0b3993aa73930dde9d38f6e88ccbf1b53404ac4b24d800a22917a0dc114206a1102a3e03943a3edaca5f5963f2c0b8d066ca9a8649082d749f319190998ed2a5ee49742a3041845412383221cb5a30525fdd5a36139a184a7b647e0a5cadf4fe1aa62fc90c95561b71a154cd23ba38a37138d8ba64ddc35e4f86fffdb23cb2d78f1035eb7a30db9bf53542d8115a31ae000013c2049a656745ea43d5352c7f4f71512b51843ace50a7d3c90491ee7775066d6a4a176ba1b14f7b8d2defb4fa6fa4d313a428513b2faddb897bff1523ae3e8edaf16173d8908901ad41255dd85056698ca8fee2099773887240f9ab762a550ade63420aac642db8ccd000498c62c18a4488f4865aa660a8c4d098052640a69b73e8ee092484c6709ba4fd8bdd2b767d8b95230d405bc90f74887414335db9e3c30e6778833f95641466b072b44fe77384f65c2083bbf97abcd3cdacea39f2cf4852e42848e059275d3d60deddb0d6613708b7dc40d374431f5665c19e7fbd70b58282de13043b477f373fdee7846bf7d4a9de1ca48bd9c2e58258c9e07bfd881a3182047e654dec27c3a302a6de926ec46a9a46e578649ed668593c1c682d8c62e69f4628be3f9d76bfc38bdfaecd9b60da95084fdbfdfc458f56a8dad3b0c47e920e28e2c94c13a9005454042d7618eed351028040a77c8967a176f53632e04fa6fd5b68c3a533657d0e8aea070696370d2cce073c271d249a4788b893324f850858f11af67e981a3b3b5a18497aff92c38b0c30ad212f3a3048a10cf54939606dd9dd5b4984c2fae8344cc471dd4aa1fb2c7e33026649d85d6b2356c306304968d187ff948aeaff5819d7e44eed7a7a4ad99fcc1fab6c0830270492a56a8f0e052acd95c7a39006f7c6bce75265e907028743d9f73e13745da33d9232237f74d62718addbb616550869dfb8810b85d16aa3962f16046d81ddaaccd75c913f1984b3e7ee0ecca206c1230a90606d70d90b863af3c7868df18e6814a83fbd3f9ce2ef5734eca70e316f6d8a6686ebae77b276d87403b598080aae200fa4bc5577a15409fe76bd4bcf825e6107902189b31a52d10d76663cfa1fc072ef1fbbb6dd07205d02076d74bcf5d3eaa2dc823630bbc48e7ef7bae57c9b9a9be71ce0ef4f818e1133a9cc3e9fe0887ac168b3f7f032b6cf817fa266bc362903351a08870902089bb9866aa3514a672c4c67647b2fcd1bcee91c982bdc2db7e27b9df2509ddada387a3fa87f4c0a6e9160d2584de4ba7f9811e26de9fda87df12f6f905034eed2e276a4fbc235f120c560a4f4e7497cf1d14aa5e57541bc6124b9fd6e9f71112d111bb310c7efa795cde848777bf982c25151c494d79d3d2d677c0e90ef921421ac0a559a5833e0b19ad87483178bb8fe6a7856874c602ed716ab98d467fd982ebca639237e64f5853a6889f9e027f5165ff83b90907467f65416237340d2b96d839eda917ac50830147e13c25f415afb5bc15a5fbe4e4ed341d7655e1d70c52b2d99fa448c9a64ad5e7b5e8c1cce6dc394a91a2f752daf45b25f482b0dee814f9291c4c326d75786980cb6ac684ef810a9ba153b1b4487d59aa9a02b90188f3519330747854c393360e6f8f3e307812f5803fc2b1b90d629202949a6fb6ff04d88dc587083989f4263c06beef709e16d9745e82cd03bb14ae74d5a0ab93ee99db40573ce69c80ff9cb04b18446b817ca28e86bb34d23a14646f514bd3732138af67d4559a534d95eca8349dc51aa1d348c8bf7225e5871d11694edd211b3d18b77220b3f6410160bfc2ffbb000885c203fe977047c764d146407a6172868e8c60161ff9e7b04942ac78731f2041635b0e8fecf37be54ca0e0dc2691d4158eeb06c7bc13bcc371054288d68cdc768f065637b0e97121fd3d6e9ab67922c7bdca61f0d0bdcdfaddd200602d0fa699e9dc5f521a97717fe7e6f023766aec8821d51c1c439613612332cd052bd6d976c1bdf1e11dc6cea223a6bb84fe4bed7487c60dced3be2129704584479ea17baae9a6ba31ce1e898b196636f0a182f36952c2c89cab691e4e8fb22b43da8fa7fe2eb09c0e05142ce5607be8ff2e337967c1b8feb433224b51aac19f0358bd22df9c4f4ab4499063411d6b72148a4395052de9177a04d29d20b3064225a7233a31a48858f2ac9ef1d18c1a6dd122f00e46b4b94bec604ea315b53aa8b9ce7270c4ba2493fbac91703a24946010402a579ef21b0520984740c755ad07a6ec691e438c205126adf89d769bfd21ef06080b9763826d7d76c5689baf63749b64d834e647fedda999d8d63c297fb7168db14111aabcea5ad77e029318f36d07aa69c54d0c67e23b1c40062f2c00ce5eb370b94d74b3505ea9cd1429318348253d7f82160cc7d24334fa1d08bdaff8e7e158bc09c9b7941e10f8c9cc90ba03d5d8776432d5e0c2173f4a9314ac649c4687521f70d08415718b4cdc2952807717d4f21a4fd27b46303de62c281a138f5dfda174947f872ef836b2bd379e5868039f3bf47b4a886ea962edb4e5059920fbddf408d2b188375f8b7203c2d4aca9fa7a996ec3b05e9c0078349a25ec4a07ea1835a54d9292ade33f8ffa52e5a7430bb0d7d8f47b97b65e4ae3915daf51f0fa0b3c0528b785902d2d75cc7d3331b61e84ab102e00458901199bf35480fceaa997de8b69cadf6eafd414b78dc7dd5b00181792cbbd5e09b4f476a0e0a7c3a87780012b44ba827620cbf1ef8dfe85fa84797a51a2099494d8a6c1d447e24f5f18141d02b477472592827c14dc5e6d47628c46373caee910987c807bd7ee148567b585ab4d974449ed33e1cf47f51c3abdc2cfbeaa5dc291a111e1fe27e1950fcad98669a4aae58dcbb5954d2d739b861f2cdb9fc8f1a91905117625c9707995d8a66081970419982bac52cc60798a100774ea6aea9845f2bd881a346fbbb1e600f3015958bb6f023724f97b309923bc602c5fe4324cae8bbd278b9a78537d2c829c7f18eae2ac09ed7a2550268df869c1eb873a11f4c8708313b65b47df63f570dd983e5a63e815c51274ec06d2c89707fd6e24e1a44c3f04e931ddb991f3b8eac9f84de2526cadaaf560341e5e6a2c92550c1d4b9f3209e91f36e48486c9e62afbdf7ce108841ce13e3bf2ce55e3f23d2f7d4daef5b5395dcdc8fef955fa38ba5cd323e4b16c11c65c1bdfedf31d6a99a6a2e9563510f160d3f517c6e6cb7756ea7124793542ac962741e4bf8f293029ac5d4107038000d520688628c220c6520858d9a4aeb9857339b6ceef2b8a33103d8425558bb316a64197c8c3c8b319174afaa9182ed8335b60f27433386fdb52ee66024ebca3313a566ec2353e85895b495af60fb385cc0233cd0dd0a9aa3308c60a6ee05ffac7e47170450b52c850a21a14308d8382134562b073cc5c4b20e271cd4303d650c20262036de0441e05c9fa715de2569c0e2a8f1b736e0eae1c71383e95ac6967e0c18c783adbd9a73c0be2cce6fc601b44202bae6f255cdd8afdf7ffc3c2fe9b997102e1fd0506fae4dc3b90c39073366fef59148b886537ef727a3edb19716bd9d46d351962070348fadbec203684c786e60a34bbcf8d403793979d2ff65985459aa11615a0f7cade3092fa7efd0fda359f761cc0393236073cc6a4952ccad0c1b26dc34404ad9e4011766e49985d3c1e7cf4435008ebc7455623e4fffbba3da2004cf564c67e02f3ce87280d1e9646adad44de10cfa4d1d44504531bcec036503af8bb9c8f81adf77d0e6df75f14caac56f04d5ead3f76db533777e508290c6aaf9cb6ee087e917fa22e19b786645caf142b67c38e6a30c9fc31bb355d2cbf1bf2e9fc4cd5a15b264e285b6c8f74f83fccf930671234e2ffd0e291f7dfd625c21544f384a6427fe3df26e08c03a67b051458260e5815559af3a6771494d999b3c666ac72028324cdd191a64a963d56eda3269a318dd9a791d2b8cfca3985b06bda4b40577c15843008ca3214731059bd481e5e604588e07edc6b8329f362e9a14409249e8fe5175826b846f81e785df8d92f6b0448eb977fbfc64470fdf056a9e229ef5f66e7766ee7e6358feff8dcd0528829fa249e178ee5b4985c8bef0e711f75265d7392b8577fe9954bd64faa70d3ce55a66e260779a279ff1c4e88d5f9c63a69ce4b555f24446fb5c40e35fcf8e339e0ba3bb083394069c786efbd239607aa9a00e04ac1277357cb04da1d3951fb9d85ca9da826e87c8cd9b71da8110638564d4a222051fe320bf6ed06828160a5328439b8c4b3bc6fae12e318fc94962b0e16839f224f8db2e04ca9b7b8dfb4976b85e8cc025c2283eb0d480949138c0d27910ad70960b748c4f8a0ab1a858d70980c3751086cc4f42acaef8d4f3127825a0bd350ac0c3a6f9332e96e262b42049e40c5a2a8bb0993a7a240264e05598cbc2b03491d996edae319c4dbe89ce6aede6cacbf8543540402bb61fa29ee481cb60448d19d41c1a70aaef01f51eae84702eb688046dc74a6035642cb4ef3ad6b828bfcd5ac500f1316ea79c075da134ab1f53794fea19e3f402710afaffdd3c2807b9cac984b61aedd6f21ec78cf787bdfa9bef1bf60fce8123bee121df08fc80a3b0058a19292e9bb1c1c8dae2d62fcb7bc0f750246496b4db3d76be25207bdfcfddb59ffc0c0fb05f64d7d8c3d912ec5bca39ea765800b738c95d3a29a59169c130ce496342ff30bb3ce313bd83cf3f0d63e5c8ac8cd0282d5ec83883875924270bf477729727b7195fea2c454f74e30a5315eb6632f2097a1a327faed917f756d7013c6720b9f2d543ab9f2ccc0b5859b668745492c64c14efc84eab7de440b58a28a529a7edac4f48f6e128b400ad299cdf114080a5489e7a86cd2c9c710cbe2e80be11f48ab885fc5dd605aaa7b57e8094c894a14c3ed50aab0f9fb55853271791be902d90c1d4d977e9f75fc7749c84696a7c7ae0acabf984ef781b63b30c91624a2bee9129ce96093abf50c85c6ec574079acf39f9f68c7359169a574ac3a0dc63015c7d300b0009de4cb9ca43570ae961e7f6a5a5efa5942e2132436144fa01f86ea07203da02e3e3baa4476d44f6195d8369a308793564ba1618f38b2febfcd0a6df70fa1d992e6b73960e2ccb20ec3a4baeb4779f7873aeb7077c758e451c17c69e2d425ca0c6a6685ca1ed58f0c2ec68acda10c0a12e0634c35d374799827a22da5c58bce1b108e3643cb1d944c8582b1d0cf0a33bf2385a77c61ea4d2116b71e277208528fe8554588394e90ddb739c11000afde10dc24aeae638606db5acf78842a3efd04c89d3240da5160a238fa65d21c761cd45013ad7a2a79e164e08934a36c9c71c888bb6bd9c1aaecd0f6014d9b92b8523006820d61bd8b340e0284ef6e6eb699ea0714f8dab91b905b10aa884220b0864908262ed46445aa3ddc1255259128364139f4350d1f8f3fd4aac1530230dd6781cc8bf9564976b45499a993407eea6208b40e7eade71ea67762adc854607277d0c92438106843b8807998e9dc2797dae672606f3ac44aa702a2120691de593ec4473143fb10ed15c45040401b8c044fd204782564eb0f692584036dc89273086849de118020d871e4ec8aa7c04e34b58e69476c810181f6f0cf22026a699801174d5dd9c112cb3d6efc15d33bb7bac5c71d50fff181e531a825a47a200744814d18f9fa491abd6b7e06e54208920970c21ad652c741d4467dd790a68f7854405da220ed354ea60149aced3b7237bfdb8d9f7b72cc49946505c932bfdcbb6c5508ef28797392da6e0f248bfd737bd862180faf8d0412c6c488d6e03c4c16d8658679daca56521d7f230163145e62b2e0bf52b2816894d55ac1d0e39d088681792a1fcce263e1c6a48138ce4092ca5c4cff58dc6139cb557c8f5ff3f23abf666c0364e1b576f97c5971e6684006265a01c9d74e37103a032bc13e2ee3217fc3de3c2c2f9ec8d84f9d46c2c684abc54b5a0b8599ea7fe90c3cbe5127897fab84dcb62e7bd1438f2b06f3f11791a574b7a88fff73ecfd810d24fcc54bd3985422f52fc2941e3f11e5ca0b05d83367d3e894fa8dd2cd3ccf8ce0f9f86c23d6c78e707ab004c3dedaeb14e5b8e291b6134e522ce0353a304e2a3fc22a5f08d59eac1b6d290ade75e1225a9ecaea54d06d1ff938d2f60c24be0a104f65a828b0f40a1c15f7fecb9b828bc9dc0f9dbe9d72dc2c5585801897a4c30510d5c56dca56e6b1dfa64b71587e48163f930fea6f451fda366070f0006abf0ef35cbb1b45103c777f8d9efaf1b3e1e0f91e5ce386c961a0ea23c290ab5afae5bb86e4f518013234317e13b9fb436a175b72218f1514051e257b4802c516cf6675c9bc4c0ea634403b47d762f5f411034c9a27ee7fcaaed0ea5aedd6f7abba011fbff5e4e1c4f992ecf3e707086d20b6eca98f3f5f10e188c61e5fad9ff2234ec2a834ae001610066620cc890505fa0731cb5f46b56349cc3d5650272788e21723e72f492e1ae09b1cb2ce0e4bce7c6c3ed164b6fa234ad8bf36894ab7a040bc0c61652ef1ce888b88bdb8590448eb724495faa63009bc9c11b395dd84c00e9193867cf5fff8b27075db4021c1be2731042bd8835e4d4a0552b64a85a9c57c463d4c3c640e564941265f6657bf5f7adf99fbd109746384bc21b8b4a0c0a558936ac639d05a7d421064686a7e3f1baba561ae42fb07dbcec046c46fcad918baacc44b5713cc136b7e8049865a686c7f044670b533c8ec36e3ca75583b4e20e00ba42408d3f2c67be4b41512b61ca358f54b7e60081710c3f418e57791c60e379b178542f4f03143f76b83d229f5602d78bf48d7a8d108e5047d4126b7a75219b0f67586872a59568449272ab2f7f50da98b7dfd2783b30c43665ad21b59252bbee7eb71a5cbe4425be493685701dcda3baf844961ef895fc603ebb130c9d5ca0f5a389c6607118c04233c41ca0a27e851226b85337fa19993293d5f6ab6eba0688d84ee15e5cc422e24103c920c4a3b5c8c3e106380f2a8328c84e846d71d9ff795a55ae6a1439efedd85eca853ed901cd338fbd2e64f0b99d0260355f0396f41434e2647320162f46925b48a68ca17bc4b77cec3a7472446499b8570c2d82a9fcea68503018831b762fb2197ce67b17fc8e9e5a1a714237dfcb5712a8cd5cac3486620521db69f1873a5f462347a838e3a66f6fbd1d448d51e57f057ba95dba1e4cc90f1c4e17f389fde60e42f7d5ec3a9045e3cdd935c990623748a84c4eb32a0549bc70373dd704ae0248c9163b6c7395cd07fb021de02e6102c9742ca7c82783a01010bdd1a13f9d985df8fd5274657df963ec1d0759a8a83ca8c8bd0da135d501b325d3576aaf59e8bd5bea45b6cc4d605369153c056c6b5ada95b250fd1c28e5b20335dc14c07b9746d64d60897524e017b201a89ad4fc79e0ca6ff6c35a95aab07fedc29a84cb1baac412664d8824dba63ac5bf59edad19ec7541db0db0385402ca592b38a4cf12613a24b3fed9c08095d87521b95940906496ca38fdcf723bb5644258ae19aebc052cbceef87f58ac0345910afa0a3f0ea2d32ce1ed4ec5e0ffee6f23856c1988a39595fad7ee9eedb022999dc1c6737b40879245127b1d6ea537f05a9f81742e88ee06cddfb979d4ea956e7b00021cfcc3dcc8128e4ab40825eb09de0dee67b15cd0d3396c145fb910b3b78d0d5788ab8c9ab7a8329e285cc57420f519c7fccc8f3893dc83982b2312e564eb82e110d425c84f9854158570e575f3ddbd608c56f6f17f6487c27da02b1d28f7c253c0f16fe8926c6ca0d462a2a7f0e4bdd60c0e5a0f434850cf901dbac5719fdabd1e635b8c70b6f7556e31926a4e6d6d2563e09502f46e7b4a0e9de6b2de312568102db6396e906a55d96fade184ddbd365c768d4f9e49b3f03d40530aa767b790b1485f812ea48d7c79381c093408c2a8313789f6a99d31acbb2de0d287de8c2f7913179482b850839f0a18aa948c137624347dab3f21dacfdf040a520b4794e926f4069fad9cfb69fc905db1d54b0cf476809625aed1a17a3317a071bf69ca596b1d09d5455bff31a1ed76b9a76255dcbbb0e78227cfe7dcdebf686598a5ea02d95cb9f119f892f674e8955eab069d780007d09b7f911158a14e77ea101fb322bb34285a2113479e98bfa5ef1e45e1d445c16c1f766f1dd6bbb6a75e99b794ef824ef3cbbc14455601c2bc675972dfd82d8072d4ce3a175c17e3572e3838866ac0add02f0fc8bf5d3aa6366db3130fe7e3240a13c8f83a398f847e7a889b2a2ac3ab43575524392a4a1a98e338f763f137e61e17697e55b1e6941c33469b9f42bdb4a58e32475e8820f2870f49b9be46743c601dd923c0c0166f204608e48a21c289e0a0c82784c4105de4acb807622928b8c845ec8ad470ba2a310e85c5a69adfad7199f19b95c11a6348d4d0bc22c0858aca5e967d694826802647cc7b61759122506a3050044c4f3679239c73a3fa1c1227c1b486562e0a210e5f0ecceebdeb7539c9bcdc6e1b764c57f0f1e416898e61770cf91bca7a7c2e470e273a1ff198f905c8497fa35428142b0b7f0d32b7fd76b6416d6dc4791e944e36cf2017a3a5e811075179b700ba323069c8dd50483fc9b940e843462b772873914abbb20b912baa3c2c769f5582752aa04df00cecfd117348281043bb2badd4d6738a6d6e1f5246216e3d36b2091db47f7895901d5f74209bfade052a29a741f434416f496da7fcc523e4dae4cc63c5c494c38bb892be262cc034d7b8af5ca2c03843dbc6ba4fb80cc0c763ea6d19b0e099cf6b5b1ee832c8beabeb702d6996c94a643bd31f5e2bf99e5ad694634266692bad9dbb8ca1f8c64a95cbe80d6bd0ff4302a619ea1f8afdae670dbb4dfb7aab6411d98cc36a27406ecfb473eb430ccacf7e25dba2ce5fedff4d15cfbbf301140fe564bba5f0782beff0384b32b587707d634d1fcfff48c30005740282a05b3b70ffe1f469807d55ff4b6a73253ca17fea517e9df72e0f081a59a3fd7fa1c531d3cbe0275e18de68c4d0c99d2173305a9becce8a12472b6748484b6283029d86208e4d014547e82e5a0fff0cf4bfb187dff98680bf1bbdd4012bf3f6a133de113b93a79110b027d72b4f660e4e9b97cb224a1542fffe9c58d93584b5ef0815efee3a2d0e721a40024abe06a5c4b1b8cb53d116f8b6ef7d9bb55a1499be1dba47e74c7098c51523b3ac698a295cbc7f0b67a4f0225547ee2fa8151fe04fa1cbe28252e76142c6d03dc3a4f1e3a1e026dacb4ce92eaa27f21565a09e94299b1c57fab03985ae31b48f10bb33db783a5e57faea561e3cd8a441769ca071e3ab6acc5140c05efab36e333c88ebf8421cd12337467d0506896a4130f5e77996df452bb2fb9c4dbfd5af228dabfa09cb1a996d28e0ab2f5d88b362d7bff37b1742165efb779c8f6c9c891fac07253c3c2872eab408dc79e988503b83428433562c5ec5f515f8d0bf12a5c4887ad18b7ce9be40e9680ed8717cfb27c1c4e29cd9cd5bece286e16592c38d09e7c94b891272dd8338cd04fe074b3750577c9330459145fcd20e7d2fd411e7ef6b99c8cdab3042f5c0e525a48ce4d79907141bdddb042099ca098524c696a7a62974c2f380ffa402759d2f3ab9b87f229d2945362c29eb9f9d028e5dfc324a53d49db106a83c230c979599afb2b4e892e1ff4415a075b99722991c0b531a5de7b1b1883294da647ae80484689362a68d8c93104ab6f259639ad22b36ac4be5dc3a49b342958b407e8a37af23d9dfae89fc5c4e25d26a4cbbbc978261eca70d042143b43b3c7c411330619edad92a18aeec462b87a6085b93b9fec5198de12e6045d2d466506b466aa050b8c9deefe9dc862af4d018bf26cbf03cec176016a23f46d97a9f9a465ccfffbc357ec63d35e847180e75c46e0d772299a7ca207431ab7242e5942023cdab05402b0ecb9e693e588299210be4553495169946fdb8c90356146c9101cd0f0cba6a4ac3d6850269e51b9646c2b2fc4ada93eec01134477792de2490b17a49f17084a46a9a5381f2ab8e3361b441d461e2e1e0b6b2aa89992794c5cd21ac059905ef6264a307bf9b1cd2745779c621eb2c3f0a929e9f9599e3038e6781827c9f74b5e864e3bfaa29163c8a184fb8736caa2fe02077f44cbfc657c3b68dc1e072eafd9cec9e38cbb1fd8d73e2fa1d4b5e97564cc200b7b95d70691a249a07c24799db6bf1c6cce2167247f567ebd02dc6188f0b5bf8c8d0bc11d9e1f4715187eafb2666c79e9a2587beb32f6c5a903fc07f3e5f5ccbfd4e242e22a6fccb3e19985fe52438350ba6075b6fcbed4e5439ecdb66c039ea9c33741bad7735d8e362572b8430ad506b5251506440b732c0c73bc186686fdeb9116c965c4e5e522038b3cda2f5a83466220fe49066683f3711a44995b0a75909a49227402247e2e6b4c427a3732c6c51b3eaa8c78b3c36d95af196ba22a9c6754a0d7f437b142eb5a750ad9b7cf7b4e09ec2ace7c299da01fe5a7b9cc2b2b16088107d4395cc657d0998f4c9e183dbb5e67be9c3e9c8dab72fc5435459888d69cac747766ed6cb682ada879b7005d0ef26d7384a0f61cb056d966acbeb7aa786d921a9e79106a8e0f4157ac708776d1285994d5902bc622422dce5976a1154d0dbaef81110997b21a93b84d07c7c7fa592f66d6f184bcf1f5f7b694d46bd5247a5be507068e1489cd4c875be7b6d0ba9354d0eb4a6bdd2b35d00c78e169d6ed2d8bbdbf86d2c69ea1498445ca4a9f8f922234a4b3319f49719936319692b46170884ea2f637616ea397b88103e1083d5a7dba14fa8348e61a972892b69944a4a5b78b8f6724078cff74cd8421998aaac0720d6436ab06e7c7dc0f9f90881a890285b38f6751168f53cedfc8d914a8d158438a56f909a662dea534d642692a7962c06946fd5ea149305cf125b5178b25b4d3c07ae026c2e25f6747adeb96e593d47dfe10964d082960d5a81a1353c52e93a92e64b350a41ef05b5a16fc446085249ae1a9c08422adf91882848dc23f655034e4a106796693c05ca26fb7c2651ba19f8372f6735251d83dd1a91745ac469738297ed21324b76a83ba6b3ddf3f89c644106ad4994592f7f1aa5c183ab96ad2f60bd7f002964d6be2cce299239a6b59870494e9a9f947deef561c28c6558abeb6fc111397e361f4261b89431cacf7d2b4f4864054fc67935705bc3c600166bcabd084b9b19ceece436142f84a1e6fdd3a5d9e114d9feca868ea4cbf8a7f3902e64d3d48eeb3afe933b03da9663925c13263c6293bbd9121ddba9b3ed085581068a10bceab5177639f456f2a388b76ce591600f5a24fac00d50cffbe14804bcaaa65fb724d21091b030cc2d410d551256c5d178a6c49cc70796a55266288cafac267e5b73bbff86f94a97475fea2c1b44bd01f49ccc17760958abad92a32636e4a23a9770a4a166aba6d8c0423d2b6d81d25508fcedb8e3acdd00b5409e02855ddaa260c4d6310b7d03c7a6096557077e61deab11b063760f07f0d56f707586c7dbe63ca3860955e85491f296a3d66a028ae3316ea29f45bd2799cc4a98f18bf374547e51a01691369613abfb2f8c835d525acc623f4bb83b415cde4bc9ac24721ed502d01ae2b301d7e39d879bcec3e818421be7908748762c835b3c17e327a4703f558933d1fd2bbd605b711f91043aedc88aafca742cb2863eff17b27ddffe90dc6a3fe398aa6308d438a4ae36f2c8f3d48fa7b63457eee74f337da99fc6c2ea93774ea0a7047c50c7937a42f8065c34783255d7835cfbc4014a8bfd2bdbc75f9b13b161c7804a93a59ab6518e1c4ff5de922f0ecb8a148b4afa79956d97d217d94ef4b85d51b6b805fc1f3bf69f9ffbc29fd70b7b1e7da6730d2e32c5caf21841c81deeb407ddbd2cb0245aa437855f2088e8d11147807dbd87f815215aecbd7702e6bb7c3044999079985044018afa8bedd9891c39a782034461826fea4c62005c20e804de197deaa3d532a246fb02acc2f0221626db71807050d956affcc22609018d1f2c2f4a0161187d87c0e84ee8647f475444b5551944acac4055f09427e0f2e5cbfe8ac8c144cdf31200491b26a2d1a4708f44ee297ad5a3a515c378cab8d83dcbeee5690cc34103660b46e7945c09a3d78ab9fb8084edcad1d1429b22604d9f876eac13c0241d6e0aef767b56ff3cb0b264964c2c008fbc0c5e34fba330d83696960f0280ee689c42813f34b33e6659e5a569939340decce39dccdb49c8960553367338acd141f9e2f63d3cb59625ac88924d18a2dd7c89596a71cc606a6bcac923c4e646332517f26444948890693893a16783818e3a760c3e382876c89b128cf62b013941a89c3e056c250fd26483aeaeb764a498706a5271b29b808789f8126255f5a71bc1a3f6d9c66c105ab5a44b09b629a77108eb54f7f08403cb7fc01028b5cb3c6b0ae0cbf258999f7162e198a211106c93c906d3241b68e23886396852c9dd838e6fff96827ac51c4aea6d3febfc6bf2c441d508f2a9ff0261b3161e152dba1c2a5e353eef1c9a94c59937a4a6d0b68249356559006cf05c2f022615a3357108b763adbb11142fd8048584eb3bcb122c9bac6978ad54a56756144c4da631311dc26a9a2a6396f0b083f824a3f27624a1a9c86fcab5baa7b14662069a08e98de30e180ff66da2ddde6699fb96fbc37f9a1333b5336f55274e6c8f038b3002ec9195d505f4861e07eeffd60f40cfeafc0186550b573a0a90f4050e12182f6e442f704ccdd6b159f003a54e1416a469a7cbfbf77514dd50c99d4b49f3047e009c7193e036270ffee0f7f89339ae26ce425b99bee3a35838c0d8b0b70955fe66897a326971b595b289cb58b167a03edb1f27017faf7e3cffedd55f9311b52445782161f689f3f852f2ecb6b0c3c3cf9fe06c11b6df9a88600f89b2b9d414a72d9116d66545a95d5c2346592ce580584c6d42c9761bceb764df7742f6325fbc45d3df794f806dc46c1fba29d94a72ed5a61277112fefe30758e5847a6b009533d9cfb71bea96439c97e4ca87b4656e088c239b6dc3e0b712eaf83152a847fe4c3879d2d4d38d3c18f4b8c3910706dfb66fa9464011ebee88f6e05c965122febe2fbcaa8cae416e20d4033a50db46fe5e5e307f316be95256b7eec9d90f4082aaa71fa436e7adf79f156a6a9103f2b9a10134d4f508c97af7af8ac71b2c63d413b1c51c3982422de244b9eea0fb242055dcdce964363ecb1a77ab3b74953b81519556108e2c78482cc51ad8c57d9a080d9f236f4569920f18e29b63446cd9d3b255216de1cfb516da96b825ddfcea983ebdccdcbb221060e8f24b4bb0f1626a4383fedf30428860be7b40af8005690a6b81e87e4e803b18166c9b398486066af254fb44928d0923af3d7a8a5e65228c386f0eb1605bbb6031c8fc8792621db2ba25ebd7b2e52fcb9894143aa0a82095b1bfb4a48725bd1f0a651f797a2e63407f933d9641ad898dfe4eabc3f9ffa16a202c3defc5c641d839ee055785ded33aee3334b26f89a1ba55619631ca80c45931f2d89b57b3adcd7a9f84b40327cff0e078bdc7a6e870050436b547f587526fb3e02d5962faaa2ede687743dcbf9d260d6db9228c2844c7c4d0e2b55188eb087d1419e3b0c006a996a6d2a2fda57fc520cfe182b26e9ddb10561738070fde879133ac64df0e3774f6013ff4747826dcbb20d01bd9556db488806d9d19d437339431ab15860fb45515ceca6b37e5d8a1c2cc33828f8b0000ad48d447e5c1e40389eb88354504eca21084c5aa3b0835b5630cc35351190911a8a714f8691e06f535356cecfa36d3b98ed745c9c7048d4b69de2c289da41ac5d009eb3243f914c14ade5547a8b9038fdd93b5483a3c78e0032503ac117c4ec982d2d75ca07cded913a1a10073155a503f89436e473d1004105a90c00088c4cc737d9cacd37182f619802b1d5220764e7d8d338c1b6d8903b8b459048102b9984e4eb05cbbab7f1d73aae1784c8b2a2351162cc2ef780636a740075d4372914296d8cc7d89a24af5d259295098c5f57cdbe5455394b6ed725b2b10c47649240bf968f64f0a8b240e89c4eded9133cab06bc0208fe68eebe8a1a9ebb16717755bf1a7be1a4e78548f4040461cf1dc518766c6d8b14d2f572adec29040ae9ae52673f9ca2876231ae1d5f3278da67bfe1b8d2a4f715c9212101cf76e0bb4206fe32ec3ee71dcdcd342ea0fdd8feff635c6bd3fb4c411b278217102ef49583103e803fb4b444d8e5e8f6d9823235d2d3516c288239624980780d1036249050ea844ac493549dcc4957bd7b848ec9d91973c711de4784f21fc072a753aa6055377ab1861fe6adc372404205538740b8dcae0064978f01de158a17307c89648559a4c2c74fc62b6452429dbb653cfac354d8c68cb00a8537d6bc1c0874933d7e09e4d0e58281e2ab7710f7e17aae15877954e9436cbe7d4a3631af0fb102414283e9fa9c376a7375df7a265ce24270036c8548cfd9b1ba5c5be651fbe1e51c2035766e951e9a46545ea6365fc17733fc96e7c760ed72b4b6c1836fdde62db0c70f52b5373ba00bf764df833943cb1bad91c2740eb2e26621d4d2774f96a4f7a2dc1a4b88798122068aedaaf5bcf8316f85f5620316d8877024da6b257f2b4d9e323b98f996c08ab1834656de6a7ddecb93d0539ce706088b349d8f76027321c84b9ad3b32d936adf93f71eea8915f4587a82c32ac033f6c2ad1c539d35468b20de1fb0d24d70a613606787c2fb0cae30ff8c27eab2612813c349a4842d25f237c31119a61adbf2cbbc849f4610260f08704eff4af9026c3d4b9e006c91ea0b871b9b97902f652f1b7681fe8097358981aa9d61e38cd9485b32053420f8a88ff814995d3a48c8c8c5b05d80dba0189960c1165190a881843439e0a74baaac4d9819ca405c81b4f6ca8b7427e860edc54981d2526639181420bc83879ec5b153bdf19c80b2f1b5318c8d38141abb13479445391a49c12835b811adf1e08a1c1d708d153df7e9f42520c6a4954b06bd7aaedf9c532556114aa9f623f704c905673bab5b626e262d305a4947ada152edc7b5a37735bf6e55bc150a12b71debef96832e6f5684109d564485fd46200b3667235359a4e6994c8649c36e490d7246606789cc273c06e9f166ec86b5124b134482804e3c4f0342025c0b93c9a6d9045101c116dca7c0ca542bad7fa8bb7810007e467cbac915127b8b688c2044bbd97389dc423421462b1bac00afc5c449406024e0f2151d0283ffea74a37873e129e791fe24a836d3df0d3c5d8f62508fd7acbca8ff3d3f599ad3946383cd5805886944fd05227831be96e2446de1eebb48f138550a45db0ae9aab2894254a22fac52060fb9d39f48f0e25d10e7212c1e33733991d2306723a19ff2bb3ee62820a94ccd2cb5dd882348c4972a413db09e25dfc54148b42c8b53963d164999e3d08c11df35d2a58c6dd0531a3e62260098806c7ea08d762db9010baf2e6a956df610c38ad07892d1e91bef56e0ff7ccbca91743efed47417da78a4b320f68041deae7d30090325090ca92f1680ddfb1fff7434e0f3d279e2067b0e2becfe76abfcf42ce1fe5736a828c5a7c7c34006d0a25fb50bd29d99f4b06586d6f9992d32394081681bc02258d5e7458dad92aab060a1911936b205f06021281116d62842cb7e79e695f9a368de4771721e9ec870a5ab58e8ed67145aa8f1973c5869e0e7298e3f7bc7491bd22b1aa287935c660c63a82cbe7b52a33662f306c02f8695cb2204b2c0acfba1e4b6f1769a16a2362c009a871f49e15a899d1b6dd473790386fd036dd24026880b2d4155d86bb7d3464c1022727e49511c07a721a86e684e80f8e30d7e4abd22b804d7ef28e4bfa3e70f512a27637f24cd88258e43a7deef01ca78a386086cc0ccea585367428df93cc4f05112b8242b3c1b62061b6c52552f80891924db9de3fea45365009731e9df2c0a97f7ea34540f976805eb060a0ee26ddee1a715b33ecc863771984a39e7ce43fbc2dfbcebfab129c8a900f426d89f9beaaa197f4b2f19aa8a3b213f1df2735d812a2b18bdb602d66db96627f6ebbe1de4f4311adedb5736547f7ad90eee02aa0bd51fecc41d4d0feb6088ffd55d7acadc736cb7308dea0c6353e695af3dea27b33918b15c8133110049c8c43a815eb084763c83165579f057fdd5ab3573167f1cd3480b4ee60cd02d1051a51b47d8457de4c06ead3ac6c6825bfa0be6df444f761cff51b736645543f69d3361e0334d64ff81d5774574066ec14c86dd062f4844b9798c94c4adb451d694d4a653b5ee8c3283ae5e8803cacdc777ab910288d33e3e86907eb85cd7769c49714fb30d423e59ab03179cde48e93b4246b410ee43f82e010f1a74978691e0de6645fe7c0309e79d65d73878291f45a090976d0e7ca4754e6c841421571b549b0b91a25a362e116325d9f9722b3fad53a2342c0bed918559badb4f6485dae51ed7258cd5f01c7785d5405b4dfe0fef022b6c1007491d08907954fef3f6892457946549e4bcda0cc2e683ee202740159fe51858f5ee5282b262fc68cb90425785030d00537bbf07bcadf446aef77442a247a3c174e955dcbcd55e72598da23825585475a53a7ad1cf638c320bf59a73aeb61cf62075a9043c3df0e66864ffe99ccbffdf9c3c08eba3fd4ce9f4eaf53892d3b9fe90964cba02c2b763a9111ce042ef90afa9be84f5d201d1c44a640edba11c0d44da8f98312090d795189f0badd1655571d60ef7a4056c5fb25eb87a8a586745d7138de373b49e8b2d2b0450cf526670c98d988b46a78e075acc47065dd7cba29a4537968204e4e86159a40e5f1109892bc9d950100d12cb26d7c25533022bc219915713240e760647944f0f5d582a8341b0b18594d0396d3e596aa0a462456fe44330be971ba56bcdb809b0bcf9dab8db200c8d1ec57798982d8aacc110c97738e68b8568c2dc05cdf6571436073d52220d5114c43e8d07525a827b51ef18446b826f9c98067e3a65a8b090c572da39977baa1519c98166385b5d62f6f0da47199c431fa96c567c102d77e2a8845e506edbf4cb5cae130e64fd9252a3cb01a9453fb70a15b39da576968d57e92632e395734c2eb0034f74358188087dddb38c9876a8ce45b843d9b295f68de3fb7e586536018dc958adc10d9da6fbb5fb3a3986d4bf4cc7c2231bdd39ef64c0ee9e0d263df6c55aba9c71c38c6804126420fd563636789bcd7654c846a3789ecec7eb0e52ae46506c7378e23dafde4bd248da88f01a80a8991976dc4a37b3c2827e6e581c1931ac65b78fa5d17f2ca4a0c7959a61cf73d20e2d8cc236e4a8d0d59587740b9b374d393361131165274e9be0cee1dd92112e3ea4273aa931fb331c31d58456be0d9843a4eb6fc678693fae8c754e222bd2d215d768e4a3da093838f3dccadfb97518f28c0e48d88b9ccef86ea0cca59b38a07ee18613edca6f32a20863441f9b6220608dbfff3796b39c968a2aa69ef20725675621a835879d0b077a1dbd105230074474b6739898a96e50c3a4930cb17c4c5f032ad00cb5496722f01fc071cdcfb28b5e286bc4d21b9e13d4e3a994ad0acc35e2c2ac43ef0574a3cce7825101c3140ee70a4d663642b0731b3c301d7bc90a332bf91bfc6e49b1f0613f17f789315ad4082d254f5c4b718596ab1931ee11b5c44ab0fddd95e390c37ea66c448ed4002d935c28874569ceb9b4c1fb05ce00c721fa0911dca676b06f4d05f41fd5cd1cf651e1362fe6fde357d7b6e3f33c10f7c746f81fd04c9f7a729657583babbe3a34e3607c33848b32aca679f241ba9b9258d9e24623073cbf1f5128bbb212944586a2cc5743319d832d816f3bcf5743831b8399d7b318d36a63fe767f68fcd53f946195be39d4107d6dd32dc63bca5602b763d703373c1d5e07c5c700c915b6ec8f331639253e87d3d66340b934c21ba383752c14f71665736a7e35c382bba307dff22c3863f4c22233c14dc1e36e5b1e9559b5b178bf5bb17b226010b46f846541aeeb0d6ec19f6fc0c35635007719aa6206c5d08e0efa5abb396554a7d42f68ae4c226e782be37d48570bc4008b2261f115e59f6322f386ef3fe396bdcd0da82b8c806d54db691b0d2693b4899a66cf1853f6d45ac2cd3b871807e8a29abf82dab0df31af51db42777757ab4874acdc13eb8d51dcc63df7ced6725e6e3c6909e7d7f7c0e2217350ee52a9eee1dad143b2b851b03352b3a1b30ca7d9f684e882888146db4c657a9a4e0364cbd3069c6534c32c59c1da34b924cc42419832c5a881029a6f6e0ef0973e533585e090167bc41c307214ac66fca79c125c3aa8750f22e38c29bd8d7cf08836543ecc5005f32b3f17a31083c13d5a5496df2cf303ea84bf79e1cfeb1b88d87b08df235712da8bdb8feaa32adb26e64d23ee7b62a6501b5ed4519c0969463160d980aa28b64acc256f8ed40de0eeeb6c28ff05a71d773438320c524df3d95f00a747b56cf0bf46e24b220cebed1ae1b4ddbb372ec3aedc050ab14221fb43a0628416a2ebaed1cd976bf2b19b481f564439a919f72e5e87660885e21400a3f11e1032952aa17e2b9d40dc9c09fe7ee4db62aa840ebd08c9456292fde94c059562effb44be2fc4d8ba8bf182c7b763ba587e2ad37a238d8b1112a09937921e02363f7aa2d658c257d7185650c4ed6ee648d9a705a6124bd1955dba35db7358474f049af1afce5c3aad9e97b7cb16b351bf952dfb02f66e4f1dce50495d96f36c19b80d178e50ba0aed2d429c99effe979ccf299beb9efa55dda13d4a281384dde48ce28f28618a83988109bb4991ea6224558f9caab8f400b33e87b3108a46a038a5dbe7b5b3090b29a0eaa4252c5ea577e0b8af765f9247ae8705baa5f2b9a325c1723f08e37fb45790a0fdb6c76a5a502ed32c41decf233f7e09733a510a5173db051bc09096a2fc0fe94f9ff752f9da1913a5c8b95d8f6de5bcabdb79449a6da074107220878fed01278fe10143c7f4886e70f2981e70f2581e70f2181e70f1d81e70fb180061c5a410d3864440b1c5ac2f3878ab8018788b0010ea900cfefa1274343e0f94342e0f94329c0f3879ce03914049e3f04840e38f4430e70c8074c82395295fe66c4472b0240fc246679f5e96eadd87d87ee5db592dba89f72612bc649b4582cf68250ffa6c57ddbc221dd7cc909c95e640755ae65f09802a6881595940b5f12d6054779aa97252998d597140b183631323f74b099f7af4dac2fab950aa545f68a2586e4309a22355f6e489494ac72b92dd996b2ff267358ebfdb728365f6e539eb8c89ecbcd4a763072b9c59c2c4da8eceeeeeeeeeeee5e6e4db2a771c586274c4a00050da172a365aff20211413c8102441942e506e583654022df7c75184ebef956587463f1cddf8cede4cd779e3f6fc6d2e65946b6799baf098b6c5a4f1316b56a9ee49a67854535b50615cb343f1316d1b0625821b35e262c627979e663c2a219992342ac68b0ca30af0a8b605e9aa864c64e493464fca9b008b7aceee4d4f7161ecbe17f6151f802bf8230e490c117a2c09f53f68c74e15dbbc5766f7b0b8b3a0264aec8934d087b916bb549f966b2d6c016e3d9fd7676a0c60c26fb632045b248e248962246bee842c806239880325322c909d808eeee5e9b64770288eceeee555c9632a59f0a8b680768b890e446f60fed6ab5467677770779e4d261368b4c5b38823bd83203ef85e4c52afbdf1c38386193fdedcb0521ba0fa27022a2c4bd8e6c36088974444f54f6af2f22382c24510509e7b001cc2e85130b3b647fc75544b04276ffe9025c82ee34448c996a62f3e9aa63a96f3b6a47477225ec31baf57f1c087403ae5a1cf6ea71b206f7a9b5521f72a54b5ed005d6110503dd804b8f713edd73e2f42dfe437d30edc41feaaa5448915c2992bf3e96ac1c18e01c2d3faf288ffd641d47e0f2155aeaaa4c7418816355b0cd2b4ca120175d00a894d6e72104973ff927670bec508ec561650f45e230989039a477b0d04051950a71b22279ccc95a7f0712f658ae98fa46f3b890d9b7f63b7cc5641b73215adca77d4281b25bb29d5c643ba9643ba3564edacf7e2bd50b4ccc5b9b12a7cc49bbca89c2dd8a07510c78e665befcf97922dba722bb225b2e660968212133635399fffc84d47fff55b02be713332c1a99c8fc27f692fda50749ef75f13775793a63cd633f070cbc9a4bf5ed4ffbc174d9b7367ceb5b5ec4a925db57893122b9125f1f4c9f29a32efb9f1a4b1bb9fcf9702c6572f993ed5876133132b96cda6a9c4b368ca6b5efd6aeb2b5bf02fd43e2f3a00a0e79e87198933b2f9e0e1aa8683690d39ab3454fa6f4edd6f5c0d0bd97d13edd2ea5ee5fb993c9dd53bac47d5cbefb239448eeb66eeb7ab8abfb2a1239d9d1faeee348aff6f1d8b70fd9d5ae76b5a3a243891ee56447e464e7501d18e68679d5cfa8cec505ff6a4c41f558351acd1460c6fa2d54bbf7fa5ec461ad03b817a13e4ec374753fbfc4ac27bf2f5f4ec374f9d4587e80ff1b4b98ea3d4ffa3b963a762c1d08d61c4be7c16f782175542f1d18367d5cc6a61f18391475d19cc46660bfe264f73eba15277720e18ef55db3ab793ab279bad7a1049e482ece15aad00f7575a9fc51108fdde841152ce6987c42cda54331d161047ee5ee3d0969e662b4421545970b0000e8d2a10690cb8934bb59d72f2fb9bd2cc674751e46f3743f8976c0653345f9e89c5ce4eebf13eea360f30928e0fcbd675425d03e9448bbbaef1c2a8c24b9fbb2cbc821775fba326d22fa18cdd3bd277a18dd41d73cdd5bd1b12075dd7b47c7d222e574ef48de951cb67df7aec461dc774f44bfdb68d6553bcca12578132184ded199761499fec4d1409d69ad4f1fc60df4caf3590d6493e71c1b488c0523604246d309ae9841682e59ba42240acb0a4f08cdc7acd9c3d738553099e9ac73dbe607465c018413502069718450b9fd1c379bb7edad93751babfdea64b5df65fb954a93f7bb610c88b5a0c9bfff75b97359c3037079bebd5e1f742982eaab7a001132277b62ec809998cb7e2281fa00a05df5eb0072fdfab58aafe6a9cfe46497b87dd25437de1518f16834490668449d118311311684912268708517226812a4c80d4e7a70e28b33ba980cb8a05d39438d212ecd93272ff84205265628091245053598c105272e1023094a653979e28a92d80c4eb129351808a144d3172d908184075a20860e4d784105ea8a1608344f8fe57e177b9ac703a17e921349a0ae3c5d4dbf7ffc2051f871f4c3c5110bb2ecd98c72d27f841fbd861a42dcd83292d1f7c1894d5d465132fd1128208bc5e61cc96ddb7ce6084ac8c08f223c846c32227209e650c91a5de4b2a1d6a881762d86f480229060654f21725849b66c069dfc5e90e9cc07058c489873be016a9eabd52ad355f3d0a11260b2813c840e3b6c4015e2e81634f7f6dcfcced6493ba311e60ff1c620eaf29fa71790562b01e07f3f82f7428680e3106f7c2039c8ab4882930e8197182d03fe47d4a7ca9a2825e1050e680421e4ef83029ebb06f86573473939bf85f3ca4926704e0daab4300228469821435311c31a4a673cb1c4062284fc9f9c019ee1092078a67f009ae918824cc716081c2b07f914f873f92fead3811a382184ac852359ae10f2ffa13e6515494ab0021690c1c48290ff934c95e926392122298c2d986a0c0e4b4f4da64cd103940861a080053cec00c30a82e0615a34700c4954930c709835412181866d52630951100f1e79664186098ce8a18b23505a3a0da8309aa0a2440db122b1269b139a195b641ddf9c232b8f40f29855f9a3e0146da9ca319995bfcedd1d34a2c9377ff6b6eaf781610acc3dae5c429b15c6aceec653ecf95ec0298e3e9c0402034ef105c4cb5f8ccc656170a6f57292e5ee18648153dcf2cd1fcdaa1bb435568c9aa7fdddfdc7dd7da715429de2a474ced9da56a0b501a758f37763e3c68353b4f913c1ee1e4f98b96c196ddb785d9c2c0ce200a73b687373bee50f27e7841608732ca7bb4f20d56d52f07dedb00a64e027f768c24f591a3575752d1ecdd351da51fbad103ccf257243c92d1072724bc914c8f72df765fdd252eaee2e962b13ca2f7bdd4a70b2fd6d075ab10c33fdcf82562c53997e3796e064bb58aa72f9956583e0b99be725cfdc7a39d9ff9265f207826158d4efe21782294fd1b8c8e051555f300c06bdec63d9327a61ebcd92f34947d50be86285d9ca983295c36fe5cd549b1566d1d4b46c6c748f935b8dfb70726c1eb105ba583a0f4abd0c72d20674b1fcf28d0d1b3736789688c70d70c07ba3f5b2b1010b6f00de27df364d85e28803272787b795fadee43aa43f8e10842dfbe8eefe4341ea2fa7fe41dead15982357ba71b98e386a707472563a600e1d97dd70c21c502707e862e91de7a2aba4ce7217cbf69d9bdd05ba58daeeeeee7691c9dbe0455d6d630316de00bc1c34c77de546eacde56f87076492952d2392bada3790b6b65a6bc5b5565b75802e9637f7ab3960f2f580e7977d4567fedf682672bf0727003a019e5f420ea560a58da37637eb053a3902edf02dce3962ec82ed77a005637e78dd00d2c1c6bd81c1a2da7cdd02bb26ec544929a5607777e3190c56589551815d7b5e46e801d3536bada493fd4047643830abf709349ba7bec4a8642a9e014117568a26ac0169cf5a46cdd3bfb3f359f0b3a19452eaddf4b571a37b44c133fd0a34ed2a2776edeeee3a7180313fcc174ef70b2fc14ef68ca182a98031542a2d73a60e08a4030c16d8877b5b45bca436a534070868747777b7c7715ccda736bba37b6bb7766bb7766bb7766b5cf75ce78ddd24876a6b5d2289b9fdfcbc5e24f9cf6241c9dcf675b35cad1f14810f60bf4eb9d5aba38a7ae2a49562c0a94fda511e70f0e7d9aaaaefd53d17b97775cee9962484141676ff5971ad3e9bb0deddd971216ffbbb6d429d6fb31201a4a4a661a386b33f67e06d2c6fc39b77473b76638562a6b31eadee74bb72b94f8a94d9e7711bc618731c3713b976d2596f9322e5de7b697d5abdb19b67a374dbea9685d3dfe89c20e4e9d57fab0ec58baab35cedecb6d5cac267aff729d9b6a7f5a9ddb6a7d4dbe826436aa3d7abd7ab1bb5d63ffb7dd6bb95dada756e5487ad4e207708e854ebd8ed727b44adfb34e2dd1686d0617ad20fea1e826ee36ab76d4f9de56a67b76db39d0e36be0d21450a2b0a28a1f781a192dbe4fdfb5cf79cb5cd739feb9eb3e0d8edbad772ddd83ad424ce90819618985146140cc8c87293e9a436d8e4faa36219438c30a0c078c11757bce8820bda165a6461058b2a573c59e102a7a62aa8c8b149f151ba798edc5f02054cf0b9cf711c3795e84ca24de7fc9a4f8debbce9dc91b5355bb3355bb3355bb335aef3e81d7b0239fa21c45dfe3e904bbe062678fe9d36c9a4e57f3ab9cb8d4557517614b97fc8c743c9dc2f91442f311b4a0fee7f7e5e2f92fc6f287903a2440ea1a174637fb014e441ded5e0e5dcef67896304b2abda55df132bf55c1dec9a01cf8283c1cc910d4459aae679b940b6b35df741f15a7b3d6cb2be0a03d929d83c35cc7503d91f446173ea82313f81eb01bc5cc79262d66c57159b64f25ce7c972ece464d64d4cf6b1d4c5d32e7f0160024899b2b3e3977eb75d1bcd0454d61e25dda096ba8072a8d9f856a62bd049206a9ea69fb55ad92fec65813bdecfb69745bd6b9fcc54999f9ea6d59d4611e5b46ecf8d40828f127a886004bee41d01c81ce47e6f1c63b8fd0682e208eea25febeb357b19d1bb6ddcbdd3db9ae4fe7620d7ba651034c9558c6d0c5fe3943d5be506af47d634c904e9853e1f3c41b1c75dde792c77cde4fbc4d7eb002da3ce62b9edbaadc9ed6f0732ad5bde40c015cda2c0e46ecef1368fc781ec3fbbdb81ec3febd156e7ec4585efb51ee52e41443da8cf7dcafac1de68bbb0c96da3150c3770c7daae0d44c1d22029ef0b399224bd4f1664adb5e597719a1606e622016dd483fa58a05dfe32c8fe690c2992c1c8fe73a3940c9a3b8848b2659f47e477cbed30da8392d3c98c42067a509f230b7407fe4818681eff7283ec5feb684205812de30562100441d067dfb78db55db5fa4f4b1d04de7dbb5aa58002f1354ef9aa3638e00cf2d55aa9ff7413aecb5a1985f2754fab7d97dc329fe6be77b0c0570f87811f7e8b53088bb35ddfbb881f06f2cd419efa2ee84d7acf7d205baea7a7c071368ff741ee3504d9feece6f15ca81d86f3e44d77e0f8868d8d6f75ac21535c59b3093fe2739dcd1fbc14c04dce5ee048e6709bb461b61be8ee686d37e08690b593db2a4ea6a4113d34c3f387a6c0f3875a80e70f4981e70f4dc1f387a2c0f387a0c0f3879ec0f38798f0901378dee4181af0fcd2dae40a822d04879a48814352f0fc1e8a32c444b895867705dfd0c034b00c1441e09adc4e4a4e3c1abec9eda42443c7046ed5ae171843793660d0ca2706fea8804b304c126012ec12c456034c93db69043478418c20086704cf88b1048ec9ed448313b705ab723bd110e5882737d0d0031534d8e05981716e271a8c84487885868de1d5175f0df8a58ad410527030e02fb7d30c4b78483097db698623be1ff0cded34c3105c92d30c4c52547097db690625332845d1d0011630eccc9ae87822060e9e623c4358f0c2062e98ed0cd12189cb098a8321478e9056903618b2c20b39664fae9a0b3a513421c7309263c52c47162fe048e144a789080ea89c265e18a758c21152040c22145138840481f4583c8d4292d070e38a9828c448111b5524fd1a2fdc50e1e48619466c5a40b3e1050c2d2a68375320a9b12266d304119a2a492dfb3aa20596d0ac5683822333425696684a902423f4e48495e4428c6cc6be5618e2c2ca620be2b72fa3829623305030c5a8f0050c2f546a2b159c9254539ac0a8808412867a41410c2e425494a89c5438428254124e0349286445139718b4000a45f1947ad930be29b5708b16bc2a33900a23f70aa6cf09176c93cc1b02493745edea70841372419255da849c963aa7202fb45085aae060a0422d40dacc30e2424d49755a2e8eccd7cfabe7e71b85a6c49cb05082b298e5844496cb1fd2a25b810c303e1a7679ea94c05e0b5c82c01f132927fc2dd5e0e493818c262919c8c0819b01192e5c2a98c68c6b02bcd2225c826972376591729bc80244d8248b1232b220b92bc03764909ae1192d72c03245162c475831b004a1022c25b837609b35ac0a51e11718e76e1a83e642049ec9dd34c613360b96c9dd34c610e11a4d63a080066324c1618c1674c0ab333e22f825779318579ef0c5225504b6b99ba06cb056845e604f8a4f0d5c9fb846e02e7793184be4f92a884144126238610092258ebba28d8b2c5b5b862cd93319d9db8a900386c935b7930c61c896d04a6d10ce0682413ff565e605f18842b7ad8166cd8bf74d7f9bc2d4646568db6c1cc6fdf6f7e28beb8afb5408bad414ceca612b12a0407fbdfe6bc696f83737c0c7d43567b3d72b88fa04fd7c01431c12fc6c5a3538687072e80d4a7b56302faa95e7e5d4afd5e3ea7f386151fd1a4492ab6e7b9cb0888a9bd8712e980d5e36eebf9cb088c3c16daa1dac13166d391b8f8b8e5407a108ee2382bbe603c0033000b6470030f07bb1ba6bfee0e0ac06000281ff2c16c673c78bc5c2b873683864cc9f93ce0c8398b05b51b0135f2fda53b9302cb2139c769238aa1edc64edc001b01ce0c8e1f7d7ce696584cea6669e1f8a443e6ead461c64daf70226d520c5767e7082ec960a8bb6d94343d546e204d17ce4c55e2a2803f66c16c68c8bd91546548c1aa87b969426800072df202dc9b363040328223d239df879edec34cf3c6a1e6f97bfd28d2344820891814b6b9b6713eb0e0e8c4c042727d38a2607d49c611ae98ee2387ba7d21c2dcd47731ac973ce90679e2f44444b14515491676391e750bbe6e779fe3c025378f4a0db29d396227ff409d02cbaf3eaf97198eae9f380791155e28f9395922e63381ed5971293c229d7e7d13cddaf3a9aaeab424430f9127b9cacff52c27f364d1d870dbb5511e6c7950823be5eecd76f262cda289d62bda1f66fec0df0866863fc70d8e0581077ffb5c2a20ec7cca9d1a1e930b5098bb69933b7d9e578915fc5495747aaa6115d989c69d5d0b05a3335359b673e0720ccce8b6a070777c0627daf1400c01a59abb1ec572705c15aad663d00bf00f408c082b8fb0d7aba9eaeceef07dcc1b1591db9cbbfd20f15e0422fe38bba66187313c6dce4601cc6dce480df0eafcd03a4f997669279d188246b46948911615e264e920dd28c1d557ab4e5c791078e669049e4c88b031d0b04fb028818cbd6aa650302cd37bb5e90db297fb49ff2c7b568f200f267afd7c271b25fcc39f903c31e275fa9f1c503abc0d50bcc5cc5c8cc80536c89f0446e2986e6f8d1d4b4c0297a966c26327f2f8253c4c9df08c427e702500c362ba0233838beaab4e2a0601de9466ba5b5d6e764f43b8ed61b5ddb803982d2178973bdae359526acac549d71e9c191a11b4e8c8aae5e606056aa182cd32e339436ad2c4a296d1ad24a2bad3bb5565ac159c2d7b2d9b3b937b45a1bdddd68ee3771a78e7f83e268c7a1b4299d399492b5da5a5b27958031bee9b4e674d652f7d56ca0a64da738fff6bbe77ebeccc1d0c141ebc67d4d63cd30d3ffffb0261743a4e33ace6e3eaa8fffa7f9a0d1683e683e7cd0a2462cd2ba4dfbfd2f56dbe94dcfe2ccddecad5ba059cceaa719e9894173b33308cb8264b2209705053dad22e1b4de207b1674b9778fd62c3664b43fdb716fbbffe9399e43d4507bb18a66fedcfce908046b66a6a3a3d3f3b303dacfbb9f772d13107477a7b356127455c7b998a0e6ba9e1f1e2e21f87d3896161cbfb199b8fccbc54e3bd66692fa18a694d8c3715beded455faf067abd5ea06f493a3a2b9b1756ab5509607474745e68ddb63aa5d0d1c154d8d56a75432a9cf6a3f0c83d7965f34a7a8d1ca63e4618e399d1347298d1cc6849a77eac1d01e020ffc6c2b6ebb3acb4ac7d82e8b5ddbcb6736e7ef9b49ff6db8ea3b6e3eae6d606511f1f9d4ce64d3e68d407adf3179edd5a738e2e2e2e0db48da9e649a51ac8da5aebd4a2b3266cb4d2950d4e0f8f9d8edb3a6eebb8ad3a35810ea5d4a6e3b63ac3988d848e4e63ccfad7bfcf73bf8df561ed67e810918028099112d1088868209a810809910c44317836b575724c129e2d90e8089e4f94440403d10b4446888a10b940d402119118958c0c488434e3c222628148044443888410ad70736d10a940148428b6861a69e0f99ee35b6af0e9a4409073e29b738e26b0b0040e1002cfaf3e7b9ca43f73d511045b6ac4082effe5bfe93349cf49148410283259cb9ac67bd8f7f51d8daeb52ac88f1c06f3fd189c2912732159fcc0b0c8eba8a329640a99432e8c90a5ed67c65f4e2521b34641a807c7cf83805f5321f82bf0eb7f74a9824f5b6c31d100c7590bbf9c35f06798fa6fce702ed9b9a4b24166befedc32f332331ff31e6b1e3329d027d39c02694e7134d198b5599b9991e1aeebba9914185e1046462c7d48ae1f2396ce42aebf124b5f21d7b74c79ce2798b134e1eb67c061def9f84ee238f932f600027f42a84cd640afae7ecc0a92273d39c9e43c8ae0d265b3367b6a7258d951e5648af2048629bf22d750070e787baf5d2dee41c7d29636e3d1659c11bd097589e258ba5ca3ac26abb98cba6a0f0d58596dd61c56e9af9cac329f3dc998be99c365b5e2b1bb2908f0b21dc9280ebb51e4fafe44efb02339f31ec567449fe2aecac40e87d21ec5c92af3a08accbbd7135dde5879883f4eb25e4ec238cd07f6f7cadf3b540389f97bc7e2510ed3f2ddff9e2ad11aa84ff7df57f1fb7e467db0023cb54c2c6378632b04efe9d3f71e48feb6ffdeafd098c36c9cfcbaffbc1695bfefbff7a8efbdf6bdd3be77a8efbfd93b90705f71f2fbde47a739f93d4f9689c561dc7fb583fc9b58f22782fcd1a8eba39f1527bfa7a33739f97dacefbbc95d830a923d9b95c358340e886d7a11879dd03d0a36cfd953038db9fa15878ad16b6d9393f589678cd90928e08f0602dd801b3f5939c3c83d9fe28d1ec5a320a0d5b9babbbb15cd53df8aeed41dd4ef446f6a9efa5cfdad3e28fa13f5999395e6649d57a69559aecf33062ec13a5381cceb4f9931f9d184f2fa4c4d0ec34f0e5bb19866488a50212bbcc234ae3b2ad7ccb2e23e2c9f57585a688e16d694da3516d30a33d1ca95334d1ad3a4314d1ad3a4f9a431b19c7625678b5a57933669f3ca849a5f4c3066ee470e2b31d3bc32a1684c9becc26032e53b9b5d1cf93e8d4299e814db549b3450fd9bfaaa64e5e4fd29e21a7d6225e19edd28cbb2f4aeb047f1282ea53d0ad109b03fb5d68e7409146d77ed73bab46444f3dcf0535fb2a6db20607b9812fccdd000a093f74f00bdff2a48a91b4003738deec31fc27deaca4c50a447cc9ae7be8bf4895a71f27e4aa432ba4491e80eee7b2255a279ae339d00fb148f328647994ee813eac32adffb351e255f2df25da2aefbf4ce9893f7ef7d9e2cf8de5f39cc820ea34ec025381d2ee012c43387952b6f72b7e25732e75832f72e82d8490e2a735d646e4be698969ce4388e7b9e2c983ec9dcaf30957131cbf5bf197d6a209c5c9f6e7158cc6157348b8b5cc3c8b58c171ab9bebb96cf4515e0d2b16cd972d3b8efbe8548070cf333bf7c39953cd62debacec6dd7ede080cd56f5f82bcb912845e264b54e8a28c289c58f45fb3354fd3741957d8c9f2651b7f5572e44621ce6f235e653311fbe23358f98af2aaac48732695733d1a2845697d263d925e61b4a0c8c08da9ed33dd35903d15cdff3684d2929511a23562cae4a96cbe8464a8721bb0bb96e4ab29092e6923ac9558bd77cdbeae4c083b40b0c52019753a93e110f7856e9ac005960ee91c025a874c2ec70f354fa34a3aefa5cccc92a6474d0b7e46ac3d159a6d5a750f5e98c3e711e54c11be47e96ff38c9cd544e4c1d32e0d297965ce698e51bd00ddb2f51b11951dac4c98dfa30d2254e6ecfb3fdf6255d92b73aa753e1418038f0e5db3beac8019bfdfb73f1a00ad6c9fd53d4c91d8660eb34f26dff05a95081646bfd7d6cf5e8a662f9a58ffb1d72dd571148e6ae157d8a939b8e27b89c34a62ee21a2a6fcf89ac59d3c028c8751081cbd5aa6a80039e3550f36d9eed7528b16dbfbd33396c4ecf983aa16b7c8d53724defd3a4068ac977fe7d3aa351eed3234b974ec9b752a749f295e5fba138450230c1653f91f773a2704991b4e4db519fd4df1975d11c66b4873cbbf785388c8bf916d732a394d27ba47a2042ad8af1abc61fa9c7ff23fc60be855c44950a664cc1e5f1bf8c784c01bf6a14fa7c3bba3e60e0101603c6eff22545a2dd94825b5874ef052105fce1a7e0f2a9b71fd287c5805d3e85f0f1a7907a97b7dfaa3f024e7d87ad3a26007ff80d70f9d40f792a292911c9f729916e8a64df7f681f12a8ebbebd58e53ef88f1f46083f35fe084792726f9dbc93a68c56c042e18bf5bf7b671475ddc762907216918475c489b4908b421389c32692397aac79eee7808129d2fd2b024d72d8f6f7a992c3b8bf37d44bafdf79bdfbcd1ba60f4da2aefba907c7f203173c95747239959e081610f9e2c943bea4ce4bc70f6cfaa4c60f42a3eac4c9fb64741f9cdc81844bf7a167f93269d475df25156ea9714251d7fd6b672ddf5b05a7723fad459ae77e15a991e6b93f69d487be305df72fbd21dff7b19c51f9a6e87d0dcccc01cf4c82a88bc98f0e23703995f2fd1ff721dfbf233859410fbf43231ad223edba7f6503188028d2d0a8262d5f24ea7a121c76ff9b95b6305df77b869448f3dcefd000a9fb443be0edef8be0301fe1b9d80c16a7246ae4f2f5049681ba55b2b85de030b7539299932452c0289224619dc05e6ea7244f522248b284d32289524a89a147a8d42c9a4972c9101100001000e3150000200c0c08c442b16012a6919cd90e14800e6a96426e58329888a22088611403310c630c21002802883180380459110d003ed9063ca677113c7d73d08233126743c549f2b5bdfc12376c4faa62ca3ff127cbfc600610ac0136c430b737b863f6d8d1b41c581f297cd801756fd8e037f7c31565d8049bff585fcb893318e0f4d85f968a65bb28191a5ca2fbeb29413ed3f974a29925de661299abe679a81aa0775b96e95012ae232de8e11960170393a29edf7ec64a881f66d5fe1c24408bafedcfb32031d88439d1398c066035cd5848ff49cf003c9d72960723b612a9d6a126f47432daba32d24c7aac74a85921ed72462e13ea7bbfe647181d41d2689dca5cf02f7708bb889f3c29f9620a56c0dc7c02ca6d508c6d6f38d5797de4846c73a7ad097a18c295d33a23e41ad3cdf628a84a3e5b01aee7ab0cd2a34f86f13042eb2cf05b7eab091491d619478c51553914da3a176c2107c5e3ecb8eb2cb014728a55918075bee754ce399d247bc53aa4d2ecbae9c4b8e056713dbfc0888cb4a6e2e9d19615bb60ce0f4d8b16de991b3de7398fdbc11e75a08f858e49cbce347ab4949e3676c2a2d4b7643b8be0640466707fb06ab96a6080316b780cf7bbb3fedeecfcd4df8d33e58bf9b5dd46746bb9e1c0c8a1191130dd3cb3b5df01e12e3d8201c707acf53b06999b5ee4c701e5455c01e1af535455f62963290870ef620c6ced3aafa09046d89c59f8c736f0e1a34c61aa3a7927d1784a93e779121ce3aa19e3696dde42f8d34526e1140eea93c428c9ea7253036e17e140782e773120d78e577e485e41cb97b51a81a13cb5904f5ded85b6b7029799058959e4d3089f0224e176415570e78ed15aa6d05e3c2e69392e8d0b1f3ec399a9e8fa863f2b63287d6b1d309797bd089a839b65c63e3e91bddaa7e4bd6a6dcf00d48ac5eb3b0e6681d84d74bac5cee16ac631e5c9921d87bf2d74242189a90347c25a77976f8b4fdce6b6ad2bb71ebc61665fcda27b37b3d0bafa216d11a32208f0015e60ad164faaf401f8b611b871d9695133e6085adaa08df2a049ecf7195b42653c4f3d3b1276fbd2f9d144cced71d2d4e523dfbe9482ff27a78b21b13a513a2ee4e0de0758db56e2e80003a6f3962fd123c2d10998b080d2b90b80734e6fad72609771887db2665857dc980c545fe04d5ea5e8715e94479d2b2a046f6baced740c7824278e3eda83236151715e48255ba8c4da2757845406833198dc7f60acde1c5c83d430fa8230248af4e78ffbc808a10fc409b5d5f07a1e520b7e5733d1ab8d85e24bdb5ad9d2a27e62aeb40140561e75f9405d841ba581300650a7c6c46e4d90cce9e970491f7e0736a97d675d98a9fc223049020c2250681dfa0a5879fc77ea00280f6866a95f71c05cac0a4951a5bf7ff43f40b668298facf334846952d4b5bc10ce8c7703f650710cc3fc8f290cda04006da51463d8a83c66d777ef9236d38709bd2efb3e132b83070d399d8716a25db2e392ff945223477ac571d3939bc9b1718c82f89f4f67a0570f8b67f5e2ae3e7f27da58ef97b47ceac659715906ca86fb89f33dafdb41e289c81657d2473ae780e86cf7f9f451436d82a3a1c36fe6a86b6288d4f1646ea3bd45992be9e8c28767c9eb8ce1325fd6eaabef9535e52a81649cb9f4b20de4ae75249b4405e9efae08584fb8a3d4d6d2e025f07cdc022da28d08352328bbbac12b5724be7d0eb2ac23aa2c4c594444d55223cf295436fb754011e02ac1eb646c2102ec965c894b49d5e71e9d601c7034616205e0f90ae5eef414bce0f1e9d54bee4c209222131773e8c36f1ac8f4f5db02a7603e450b6559665f489cfe45d7814b8db3adf4f002ec49cb7f6a7353651830ebee6da65f10529b6b3a89b072a2699b1b86ab69d2c53bcb6b9fae2b0bdd3636b1bab210125412bac0ee344f38325de86939a4823215a1caf091e76c733d018988a57bf80aafb41001c5730f28bc08d4c60c08fca17b8c8221ee9a088b1e5eba1f1b2f48f05642ef3ae4186da7a01bd823385b3be7befa0cc95edcc4ccdccc594e46e7d6b41a72411b0e4ed1dbeebeb7d4ea037381f4508beae08c46c39be8a1dda3cea5af10525b0ca3c0e9bd5b8b240e5208a8d7b380d6ad388a6eecc81235a8ced553bf11e119f25b01380cd3f90079baf188142e617185cda2e14d4cb0c7438147f59fea57ebb956c72b619fa43a97ee9d28adb0393d85b3ced555b1013074d6b9dde0e61c56b05edda5ffc7334473b08dde6ecc8756409f3af1638e9b0d79d8561da2bc3778031d200dc272ac13957a6c0554eec9a8c46fac6d12336c7662ed4d307a1dc903a7db459882c39789021b16a2beb48044af61e6bb62c8e4ce12963c16afc3fad6b3b86ddb4ece06173515d5127898182a4eeb4122569935c6500864f59973b3d511c079ce7d391d217f4fba75978e73c2b425c99a85f497a376219818bf40e91a0c77a8edfafc022957e1d2c5bb5e402aaea797826d39bb9dc4d7f17a47a541d0893e2590d3aa777786e9e0066d450ec5760830ad933796e90e37a027e02cd450a011a1beea126ba9abe479e26e1499160a0995a9ef47061afd0719128722ce862ab7cf4f1c03c094c34db66970859c747f0d2da422dbd49901c290d20e3eb66034268f87f16426488f345da644d7371aab2846fb1c4a0aad586cd854a307a895f7986988ad3884f60eb66da17d2e7faa29cebeecdc60ffc14ee007882305a136d583a5f57b5f9d4357a058ea20efe47a18d80aa25569885df38cacfc08d1cdcafbc6fe5f9bd4a0aeb2d7c563e8fd1fa8c053335f9f46bd0fa9590add0203d00ec5009dde2eeada48be48293996bd632babc5971d648d1dbc3a0273037bf2cf98ec18b5c86f2225ebecf8449b18b7d0a2536f53889a202bb3a68f1115d1b79b40a988a6b3e3567cacc21f87be56f8cd4e2338c0878eb4ce662e5856a58ebbfb0c89d88cca52db491a44ebf5536f70efb648a6562b9de8836bae97334f6253c74c575116a496ab79eff5b4a18e4499ba9e0012e42219b4880ae569b7681906d141820e454e6bb28a35a7312ba1593a2a8ae502acefe8c35e1dd3902cdd0d8436cd6caf0d71f7bdc4d330ecb300a2f6d40b865fbd9669e2fc43566452e4c1f063568b284622fc1465a4d766c14dd8c83ad9b81350fac750d7e3172befd0c24937605eb874d8b3642f45be346e1f5645b281daac029793d3e7abfc22acb1b0eec309fceee89e9ec53ed4391428d88fcdcd5738a995b74059e017c72d577138c02f0ed7809fedf521e88dd0b91765b4f9731f842cd3472c63a0ea2b4ce43ed7ff4360e8b45b0fda6657f48b111ca8d08cc07144addffdb4dcccbe1bce919a42659180c76b182d3ddf0c987234a29dd958d9a73346b5c8ccde15016610e73d208fa75cb6295e1eb61a73d64264f8e411c8651a25977c6e344e2352911d342dd6300d227fc245b19d92fb280ae53b4eab1a7e67ec58882e7b07757ed50812d315e9137a26f642bb823e97a1b005b7c3fb49e8123635ee6d2fca5e2f6cf9a90a514b55c4fc8c25c7ce0020f86bbde440f4745918128ce5bf1de4014c5ab537e2705910f6230d180eedaff4d444cf1a9e6c697600c4d45b01d5ba7b5b73c2b8ec49d8ef7c1b1252bd53614d6bd8e9e1bbec38744c7abb30b19ea9c743f253ad9f72bd485d0b74ceca8757db7582f32e4af7db94b8c5f6d24ca8d4a6238d12d64f4660d9f0a571da79695201ca39c3648e72a4fe3885ff96781a9f192499ba630fa1ab4a498c35a2de177eaea75734934f4d5936cd03a9c820cfe448f11f003b1d415e83f99e9f1bd97caf28cf3832cdc29434a7f3923427521dfd5b298efe99ce49ee772c1b64758b4f1a4e7f6d49c5f10e9a0b88fd269e3abc5cb294badf3032e8539de98d71e0aa15d25f1c8d11f3694a8ace32b7d811d2f7182ff8e486d4e840e6a2ce5adbfb0306d2871e64386ec6adc4ea9701d554af506c4be35d1d6bf691da2fce1c28da35008d94415fa02b38703b76d37df0c868e40f3d7d5688632547c5c81493b875b67372fa5e26bed8a869e3a26df606a8cbd35335b7aa401f4c7befa930f82141d85df58a349ba9c72ec19a2e7505667ba740bff0581d786987de3a9de838b12e242b5c718495492c7a75397c7302ed59d3dfc64dba009b563b1ab1feafb5bab82b634a49b045a905629e033af4a74c955ade00303e0257b7441e7d0effc1795d809adf0d99fb9155c6d710ff8ad38712a5054f5ff632cfe1314a2593ac61a73bd5256cce7f4707f88223ccf54bfa63c209beee1baf05236086251e4d89521ed2525dae51ebc179da8978a000fd04dbe7358a7fbbf80e3b884da1371befd1c5d914a3b4b5dad679269a37b48bcdd331c48c9b47e73978198eae368408a151512d0bf9643ba79cc0f5c9a93c04adb71a84abecd762c2f52506f9a52dd4e108776f4045b31a77dda8190dc2eeb9be47f9df13b1f5be40a52f25f040a548242a3d02a93499e84fd7b1b2ecc3d7449cc588e5bfe13f7572a2f100909b701095a18f05570e588a755f82dc61c585ce82da54acf704d8d95d6452812b3f78a448f8461a8f81f52ac05214c69059c5310546369297496f0ce391a8fe87d82797fa3132a0ec1db6990d0ab362ed60c1f97abaf1a049cd34aaa887e453283d9d7da321274187fd25b2029f64cd001fe8f27151bf1f1bae0daf8d061882a3e92ca4da6fe5d6472b1a61b5449f4bc3fed36daa7b5d23b36817af1571c95ce5df3363acbeff6a22573b2d95112e0bf6aa43e4b01dc641db603f1138da0e3fd87e69584f1dcc8e667d9d5f6be6ddc8097b9f8f7ce8ff49d5c50dbf318e35478d231b9ade87e6bb42f65c25e566eaaf213d42ec970fad0c42adc69b684b45343808ef430c1b9f068df3929eeedf1b71062ee305f3f161690502b4e36699bc4c77afa9796874f29b2e9cf95c52a32a7a96bc2237c3418abaca8da3d097b2d11b6d8a0c463b3b15b12da3155e70832a8e5f3f7cb2e93bcaafd637345b3037f5650cd2ee885a11e03fdd1f5d153a5e130a67e495d0923909405590f33160f806d3e95b27542a12064fbca394e4f4b261efe39f7e223d340e352c963b330e036e15d4b94b93f414ac5b99bcd199dfa0934009d2cf51a875833a68a55cf65fbe995fa88c421dc649d8e0bff1ad80fb2765244507d24f7ea5a0863679f42f5871b9ddda50593580daeafdd3edd59b4f60b6f68547a8703578dc23d4fa7be81df695ba36a588b209e52f69ee4d9774cf01890775b26a233f1041e15a8c7dad195c9f8b86434762e5b884da7f7ae4b08c32fddaf6dd523e7e8e79325c915ea1b5a785774b4954a8b2b5f2477fd275264f45ca40671ea5fda954b3e24f967bde6fe36b49f8a73ef864f71d44e5fb7efc7dd989480ff8fae9fdc5c4db1da642346fd899384d4e0d4484b5a41f453f56c88278681d6364915fbee31f582c35639180737bb52f2f754c053e3932abc6c718e49d2b53e6b114f9361e6de00941548a919d54e35394c9fa7449a9d43fca5e491dfb5fe6ce44e9aa1b4485bfe4edd46ac0f2cf33c092b3b40ee957be2974dd4deae48026b8295bcca2a1c26a76a8bb4e95f9422f5bc7091db8a7c9117cc75d0640280b2527afac13ac03add1731dfb83f4722a0a928e3c91275c341eb815051a6aa4b1694ccdb7a0863b479bceccd61639e19a5fd48d34922b90912a435cbda3a7fe9a87ab7d5a664daff1c0d4259a51351e34a7e89aef4c3db2b1070e66b41ec03847be76238c4a0bbe37f90fe5e7a3db097e205f5ed53fe1d77af3d08d493f5493dfde9bf897ba79a699dccf65e7597fe2df74c9b3de043feb93e7fbc97fc6e5b9c6c4bf909f8f6e27f8817c7955ff845febcd433726fd504d7e7b6fe25feae69966723f979d67fd897fd325cf7a13fcac4f9eef27ff59bc3cd74dfa27f99dd72cf61e53bcb057fe7cfebc7ef49211eff7d3e4dbd16b8e58bf103fb71abfb0c5fe663701c8a9050c5c3baf1279f7cb7da2b81e52988b586da2e5a1f9c2bb9de0f7b2f254ed497ed1374fdd9830bf1beb9aafc12fdce27f386fde7167a21f7abf054a5db05e19bde62b85657f78dd19ea17e293d75eded87758f99a0f4381245fb4ee09bfd79fef1d137ea82edf3726ffbd7ebe694df423d9c8f3d6bd097e2077aef0d94f0513d222b2c6e43f8cbbb0cd9c2af94c61a123be6e86f493f8c9a3bd61f13423e062a502905093aa7e4247c54657d12c49d2f130a238a5bd6fd08fa92e72f2f30c2445e71aa5e0644452a94a590b659c8840595b05346b830fe622724cc0390902d56c34336781fd51faee0212f512ea55cc3137cf31c5e2aa0a4c3a03f87fdb11104a526ac03c375e51144798f4cf95c1c58cd652a3af456a769300761a4f05f49c507b600bf847ea7aa0877f9901da1ede4a2d98a92c47d46893601ddc93a6803f457ae8f816408602aab9273c28a8213bc69e169676eae1aa67e1f295980bb46f87abbe5e5fd55f9bf95d3b12bd6ea14974c24a30d4add9a469453c2b039504c735b26f7cb855f484257047d3f875cb5ba438fcf24a67027f0bcf4204999bb21252b879128441edeaa8b6de22e1f904b907980238f5c0b41989a546445d5b0aa23ef66c44056290bf995152e73b4813e8a7068b02dabbf05319b272ada860cc50b2a5b2ed61c2a596ce1eb1fd8e1d12258ae79b7ca16aa1763fb9d67cb23a8105a11c41f0136a597d599cff95f64b6306462994000d0acbb0822417630bbf269dde7980e979a1117b3fbc4cb7345890568712a86b5e13ae2a442040f030579810bbdd8829730ce6dd1b7c1a82039e4c7150239ee488d19d8b4cb805908b02279b4eeb996380047b68187e5d88023b0317b62b75b19e4fb70e7b2e1d398b30a7b59a882334fb0a54975a602825b32811c88210dd15f39e4703e7472b44b170f1f7137b6cc361affea6c43d583318c49c6ac56f439c356b2b6f74f03f0bfb71a3881ac8ac77e105a142d9471151faa4ef4ba3ef9f454d42c43cd89c64f16b0f5935c115864193670983bbc9aebebc040e991fe24d6ccdd8f90a1590f2414df945a4352979d6350fd596bb9065ee06f84aabf726ca661c9d1390f356f44aa76586870257fdeb7d6ebad6f5aa58bb3217e2e060de4bf1345955767acc086ad929aa60a5323a03590b01b923362e6dfc0cb5600023cf504eb8fe10164a94e41180f44a919c3e7e275f44519270e9e4d44569fed71d1053b92dc3bc6509d84d7d660e005d773328c46766fc4f7492e1dbc2619c7fdc202a85179918c61b55791a13103bf5e05031ba251dfcff6b59bafb224e6a654cbe85a3bb010a593c30dc7fe0022ba359769c96b89c36134b277b804a1d56524ea89ced2ea2f266bb097d02493ab43abfcc53e7e1776f1b56d430ff4c023a12106d710a495c0f95bbe9196a55d16df8f4664fe4e2f72c711e8b7b965f2846849d2519d8b167d13a15a61aa04447d3102da5fa40c2fbfe50875b0bc3e186341b8ed9c9211941610d879f940f838fb2fe9f15f22e10f739aa9e2d82a2cb68ee69d7152d92cb2f5b085560cb2cb123b94a61797d467126a2a36e254aed10023e8eabbbe5f3ab0a28cd557bbc9230f1ca636eea29dbdaedb244f582521cb46212e5131802ab67a366cc6b3db067eb9b75f042cd00d96ee1eb2f05607eb43f0e3a0c45b7e02c4d5e289a9e8efb0fbf743fd007e14c4caf51dade03052c93c4f1150922e89c0657f4c1a62e0c7043faa3dd4b3b1a1466d8187659bcb018cd1fbdd9132e061aa5196ceecfd3384f7b452cdbd85fc011843a3a177f27eb06c874d89a35658f94592b932809ae1c0ebd47936df816ff00efb2fb8681df4dccc8db6be022612071748b2abd43a1449dede2a4deec5db597a17044c2504d427efb1e53d81b9040a823223b4277d388070f0414c4f27496e6c2ae40c6f793c5d79b1f29d5e424a9074191961e880b64b3bdebfa2d83cb0c03f7649b0e0c2e607c3f1bd1baa398d61e219c20bf07dbcd8c8f2909b8cee00b58040729c0e50c9bace0297893ce1ca28b0b67e32d87d832169ed020b4eeab59063186d9745575f085d6a2424fba5134787e200c8491e7282e37228d01cf0a5633e000f589a22f93c39b75733cf55e002ba660d5fb039d5f305f2564d39a8db9a7c3f803ae45ee0aa608ca15a7741dde3809e9db697e44d0d618e6456c1520c6b5b7689cc54e6893dfaf0b9945429e7c0c84bb5bc9ca6859b6ba1d35f9de4593a0a5c9a639c62223f3e72b6c3fc71c4d8650efdb87ddeaa53ac0552846667940a880ce300da04ad4ce309248a6eef74fcdd0c2f6595fe4a3e2ef24ee8abf7f59a38d1b1c64b078025909f52a8e19926f3cd465e42d79897509b3a407aa8926377ab689d281b795a59664b47ed842e14b1b886dc7a404be839f131d5161ee89c2431c948c5444cbe4529937ee40202770d3db6c1e6a7a0822ed5d666bcedf3764e75df2c6bf8442a03dc5065c3d07cdab7b195a9ba539126d1d159187b6f09de6f1849afd7e7ef7b5ff4770edd789913dd7bcb1b3a243cb480b299c8d11898f6195a8f7f583857511feaff4839f9c328d003c0c7b70b86b2868c022ff58a4cb8cd5af755dfd707ef82e2b48390954f5028fcd87825975858ff928853476d005819976a059908123d60a4feb20eeebfe7854f3a8583fc3a8bf86080a9949086e5ddb5a766153cb3d496d35244fc5775929ad9b687ee676191a5cdf0891ca709886de6618e45fefc8c6bba370a41bdd6271be2f788b8d6ca48dea3fa876c8c72d0c6d4223059b1f87f7282cd4d21d68f91569701665604fb5635117351cdae5d45ff4152e92f7d68943b2d97fcc3e11b071dc42d1ff8c99610b84705cbcd2334d357b4f9cda9b8a53d7e2e4eb83d8a3af23a6095e215450ea692332de840028dbe1d06c26b1202b09ed0e4819c772505246b98e49cbdf29a4e9176bf1f2946f1a50667687de9f836b4a221dcb5700834ee0c1e5f605f77744bc72ab0ae048525b4589d657dc476bee49f92468c99b2a5d4ff4d09c842661be6b3463260ac5d0372441d8b8f059fdc73a23371ce1fa173b9743a83039b6d49abccdf3d0c313f80f40560bbeea0be1990069ec5ba426a6659fd3090c39187c08bfa5af87f25d409e30db4f03014a9a85ec9336f108ed8f2dae29139689c538e813a20842040fea4f924c0663620d3a3c5103a5a50c951f703cc877d165e5b02cf906053f1ffd3e12f77b8cc30f9af8bebcfa0752d91f4d8f282be4d4d2e7a1a76823cb8add80eeb0ed486ee8c01eabd5a791eba1077fef62f266de1ef432de63ce4aec91f7df0667096b085373db47b802188623434d197b2f464e561795e4cef466b9b5ebaf845f7cf11b28da1dc84ee2c0b14fcd0c32d54c45d98a3b870b3d025a318b99c0080f1800fb8c6236069bf8ec9b3de507f90251cc7d47964d08eeb0009409e6062fae0f23c154f26cfdaff7935c20084f96fcd2dd09a830d5061f526c4c895648b950466c39d0132743d3c9dff352c2cadee1fedb9559f87cb9baef3b31d2de1124cb13ddd16a8587a54f7e04393249549105891627a92c8916d537a71a22ba0cc887a11f5e6800f4db8b7fd7c95cecb8cff7de58590281bd9ed79c760eff82589845a8c3ead8870cdd677e8bbb53f2366871b16da8079b3cc3d8bab855bfe4ed7a4792ac29826eb4f59d1f79b04c8a176b672be702742c6b75c6c60752c0345aaf42151c6da8cc4d50d4b069c61d8bed22cfb64364681f9fddad0835264638a921954377b67a30e502feb4dc0b461d1ee7586286a93412d3c1c7570a35c47910acaee79b1d6474965fa376e16f7a80edc1973b95661efd7db01d38b278ca6d708dcd653ebd5b19eca09d38e152154ddc0991a3653de2d993a06ded1f76c4604c43ab968a393b6aed5a0229fd48689821372b7cce332375b6d843db1f880b89d2d5b2e2c62b4873ba3988d3f56eda60b256aa4536ffe4b9b65d945381c66615f212ba17953b046160c09b247013dd2a3604d98266187f6e523d54862f782a5dae104a3a91a33ef20e15393115c9a3c72e85e7b61b5bc226cc7c80357140ed2dd70fd33c7499aefc159d679f56f2de9bd1ec32ed6dd796d194bd047f171752a889a694dd2b72259b88d674722b7955599f06736f53564428ee8aff271adb933a8cf3e822e93ac73147ecd1fb43903cb555f985ffc80aea41812639fdda2dd388c0c39b507652a82a7d55afa67625e4e527fd62826523fb9b9960ee65079309703ed53c8d5573a8ff05b48ba4856a5acb0c37b6df18866f3ec429cd0d399ca0ac6005e75065342e51f6e8a22995dc20b1f6d85625746bbc386e42646dff2751b5537c2083b900220faa2858b9354c484d7cdbb999255a2d67e2df642bc8e31250f0080ebee7ec4f69682dc62a9a081d194357047ec4541a972331c4867ae7f3fba9b5e7d9b04a60a5ee8c888d47eda1c576d5489ef882e6e5b72ba1d2df8e50bec9301f5a72fb0f6831e8b9afe1835a663dfb72b5d45144149f023dd9114ddd73e328d5a409a1e1dcd0ea8a564412c42cdc8df868423281436e3c288e42a32073b257a8171f7d9d6bd9992b45b6769034fe5e91f77c57380f0ac22d9648606158a9fa1f0706c473ee51ae57f0328696938b63659c619c116e03c6949558c932209b45c46225ff304ee250378be29c0db436e1ef7d473b260c4d7102a172f53b7428abce37fa32d7110a5aaa8ce001fd5682888c940611f776c0ca242fcac3323fa08c1cf128c9ba77ccd19acd79f89de0c385e97488cb4849d362382c6a1513dccd6e73a3bb0a5bd26e0327e0a260abbeaedc4194748308ee6eb91ffdec9658db6b6441d48298f7fe8b88331967bf465a7cbe283f29b3b88eb2ada33220d61e43d2d4cb8832da1a2071e0e61d0d2512bf56b8322eb699905b52ba55ec96b7e85f886e8ecf9ce0aea2f28fb6727238672b5651ee6575d2544906e36a298396ee85be525a350f37f784f1fd15edafa0d8dc122820b66d2e2e4d79890d845c120d937200e2997d0da6590481c9c8025a972210af6af8fff16831885a310d6170d9348b969e1331f6d8afcc840f80f4ad533345c366c14e019efe1628ef80d392f03c80937ade8d16a5c7d5333e025295ed2d5137e8fc9aee25f25a8689c8bfb49cbe9cf6addeddfd373e1635b37658a5a123ae32efa4a04b44c4522acd4fac402c4ae5b4c78cf58884729286d376dd46f4423919dbdd049d394262ce3beea33759b8dbb9eb6e73948872e59a4a3f05554374ac179834c0a8002219659a4c2f0e013ccd3c0d22f64e4d9813306f32f16f8f546878227373c72da61845ea4e40ebc80bdac41459dc1739725705d5fe68d62b26104f0c4b3eb54f24edee18f407e16623bc4d21856a6d22befec772b6b4c67dd55dde486d206b2c31dc2e034669507c3c54b02948d15cf4be1a660178d1dbd754310cbc4c35423fc720823107fb041554f8f6702f642f7d877eb6213744e70f9868086d90768b8567d5044546212d07f5f5c8a3ee0bfea10aada75e35fab316d587f7df6102a5ad09b43f292369e981c436cbb7ce532a6542b6312213ba581c55d3639f78324bde3e186989058285c6bc9ca52f35713677dda466084ed360f47f79d1a388bf52b1d42f51fd5e0eaed4e40580b28b1c083d3d93719380947105bb6c441ecca62fdfaf50ad084baff8d0650193748fd4952bb47b6cfb9b30bd2dae86f57af32608502e66191a799136062f90edd3ad154f51d4036a09e069b85cc53149da4240c700802e1aa43d8342d71189e01ecbfbabee0f83f651608b23a5b9b94792e3526ff922e50ae88ff9553212e03425e97f51d3d6d0d0114f844d712c9fb18d6581b6160f38ff937ca2c25ae3e05cdca6ec7c04c8d406184543dd73bf16f52a974bea88c7c206bea783354fb6a2fdd01aa2bf64f7472f8376bc0ae11caefedb2b70adaf4e40436f5b809514f8cd7e1b871a7f8257a436cc37bb271ee86fa54fe187262a4bb240065efa03249afacdb4a34b03b34808526a1595bce0f005abe8c2f39c9269f604cfa52fca6a1fb23958bde5d2ced6fafd2beef77a0002b13f4d020b8fb37767fce6dfde6356b7cebb2d7698e0198effa1580d1b816c45a2d1cf13f7bf402d6b6927dff90e3ef2274745b6c29470671db9b72f1a35a0a808f84e8099d706159cbae8bf0e36f6dfe957a241ab3e246d8e5f5f5b8bf0171ef3860ddf2271bb357901e7527bf302d1405119e1be2e950d73c66b74bbf01fe3194d8915138c5d4786780f4bb26bf067b61dbf06648e626ae263637a80726cf8d64ee0e6b0cb290cfaacf5ea2048c1d674139f164638c5ce29720124ef1a2d0e8c33232e25b1ab3dedacf81bf142914bde3cb018f2c7a7afd5bfdf4cc6e45acfed86e79a5ed0780f02c84049a6458d9fb5054dd8e54d473a1925d71dbbe5d5b3a0ac22c1af9616a4d34279542896ecfcb5f066f39871f6676890488ececf55a779e5a24a822d2af75f60c345c594dc787c3f796ef42ea9e06d5ee2a1cb11e796c801d65482b336cf4ca09838f4b49e169d4d3d14d1ca39b2c6809f707ecd27b1eca8c6dc0aa266cf19163f70f9a5686469f1a6657903822a67700e82d6734f2a9bdcdb4e5db8023b0208121c032fe2b76910187bcbd0478e9217f425242cef7473ec5364e6a4f496599a2afea41ce3d30b177745baf47c17c282cd4cc9a982510e758dbc1cf91dd9be177f47aa24b63d13c42a25467a382835472fa2f2f75ec9aea8be2e5a482b2686968c3eb27e8572de2549e8d4606580126de3eb74baadb895ce614bd623073e5725ca624e0e0a9b96a8170e40af22c0a5a5865609d7141484d46b68b811ef6578eeb260bd1e4e6a8ed79496ebc6cf124d18ad5ba162b3cabea296694c19ad5b4999ffd4396c1111dea3b62302d60817c9b0b77ead7377f00d4a9a734a6682ba56b4f097c462b0f3d61bd61d2bd4155b82603fae6b5b3bb3fbd278bfb2ef028651e05dd51cb1f507b15238e501adb2e3c09aba4fb77a772fc5eafe82443e4216d24e4eebc37eb529cc8fced2c53aa2539fea6595ac6481cb4ae09f14266dba3631a378e8000a95a0c3de6969102b4167dcf408599dab7f99ee146569986aec6b28c39bc80de8ec6c3f764b8279d501439c188f1b1127ad9cd402b129ad65c702b0e946f7eca1bd0f163e6d13bb7c42d1b291cf0db98bc41aa70a7da56e18715641a99710d1a21e3f35814d951d8d9b2e3681a6f64ad90800b954e5996d4dd982c841dfc56998123634de1caac483f61005989443728bf75e7a0a2cd0b39b961ace229bfc521faae9c641a86565c5ff95ab51632c6d974dabd2d687502dbdca08db3876411cb9e76facd8d9a777401484bcf2e96e03daee7858b3826017135a1932e515d6c1ee052f20350c46076f108652a0b2661b61ccf38fa72cd77b95e8a97ee9a566853c41ce220d300ef46a950b200e2a045a0892c4e060516c88bf5a0f754bd91e3e4e3a58c9680d6f1b2a6ff79aa904a084c730917b866c1f5a1bc1405b17a2016d7495a1de56ebef5031617a11aa21a2fa6bb1aecf6acd1b2adfb7c39b6d43294a5e7573d2a588562ec574d8fa8ee92e1126aa364620690d2f2d352e470511238bd8192b10b5752b7fe63f298a548ba20aef84804b98a556c15fcf2021902716f027b40fa00b8bae3b88548b6706d461a07197e67c4fb380e038cb3bb462cab9b92a52d8a5c31ca2412224206c8b4c11375aaff24ee7f96e6799b370344fce344c21196c9680259a04d0aa4ff28d4f1493adeebdb38f97cfc03d25bfe30838b70dc5660082cb72990a60096076e0bf9886d53a3c76acff95bc1d536f2c8238cffd9df5efe54fc77c0387ede582259a9cce8e9235c890423fb9a0f3574afb238611f6804c279cc4058296a04d2c8ba5c54e2ed67df6b071c8174d986ed85eb261878f66febb939ea129809067693f797303c363a06a07666ef35d7cb43e5564c62e0631cf57713a03f422f67a95b75a3114c8dc2e438ca71b0a54176a5dda715bbeefd444bc5a171a1005d26586751df706d7bda60049375affe06d4eae13fb94078c90eab671b44d4fbc07c6210e567982e58b11b2def2185babd11ec501623a82d465c417f70ff603a3c2eb1501f6dd3f164c652faba850f532a0ac59fbffcc9ade7ce0c7aa7c1a3654b81ddbbea51760ada565288b0b7c44e29735a541213ffaf1497658219882246a3605a48a312f506beaa71b8fdb957918d4bac4a535554502cfb43e8f6bdcaf0f8c2e036415c1fccfac6c1c6ff84ddebb212343bf40aeb0255cd3de6a02de6e28657221433971c5e54f2d44653f6e5ae6ebf5f79a15f1d727da7e4df6a68c80754df4683bfd9a446d0934393f031151e9672066fe3cb3370d73008590990a57845c4210cc39339860c906bcbc4087ca451833b9788ee2a4729e040487f0d10d1f4435069888ba99f6978db29cb64b1fe59793ffc01a6cecbf7a38628cd1f8b883b69810da2d585f6de842c710165a01351a2e177db75ddcf1ac44e2775cdb8371698d3880eae40ae36453870bdc19efd56ec4e427ae0ede6feffe97b0bb78989a2e2b96fc56bd204ea76298384b60f31266692406dbbdd4b630a0348bd9c7a9b43f4e169d1e487d67b78a600ffc75415ee80ece92454c028f6f672d069247c65925d7d3ff5bbdf6c51529f9e6e9aeba049db8286baa81c9a8c7d742f18f417e91f0dd83da4f3bb74e0fe3de2a73a48518c61e869792d60261531a8b742c93bf62cdee414f32d21346ba5349aa407f3dbbce1c0ceb7700eb287e8c0271b9ac69266e7beaa00b0bcae9deef95d5b9d183741b8b21c336f044d265d506d9493057272e805186f0cef2592a2ad04e1d0f0e90edeb5f98a815b4de5e0d8d3124633baadbcd8d54dde2f0458c4216614b31526c8561027c5e3b9719ad7ab51a746488c3cab2868ce0966c4534eabe50a6da3ebcf0d70a704e3dfe7ffec20e175c2111a8af6e52f3332817a02a0f29608e0131b8dc1fc6a528044a0f48eb999f47e628e0f19e461f9575daa8dc18e1a2fc21235ff0dde45de208bd24a38cf224b402aa30f34532eda938d465461cb51b993aed091ea180e338c79c3ea274b2d7a8cc81035293aae0f8986819419453fb1c0609aa61c6d3d9d4012d7b36b02906be626765482c25d87102c9768e94c8daf6f75325a4c704e96f201d8668dae76b98e1d79d865e36306ac9e0de83073912c6e5cbb9b91c0b9d2faf5589930aed93c78990d427937fb98bbc496c7280aeda0409473da5967c5da1d9a86800288adf340ab7818e12708a005b08dc54cdc4288ba34aa8f823e4010657a358c62789d94cc390000340ac48c541b4291c8b5d30eadba499abe51fdf8b66ec0b388228195259162678e68146f73908e1b2f72dcae4fc208029daa37e660a4ba21c9fb9f9fd41cf4c70860171c2f939589fa6b9fe339a7b804cf47b904752021631e2f83d9e156d4ce5163b6b0af2a82a96cfdbe76119b17447201f5ba71bc0de88d0601f521d8a881c942a7449be07f3d97a393b8cbe8ced83c608c0da00ab5642b04e760ab54c9e6a181e279cdbea657341afbdf096f71c1a42ac249ab8cff4867aa744bec46bd944ba678b5f10bb1d3fcd0c0301f1becbfde9c3ec8123fd27fbd8f0358562a7a28ffd00bfe9c32e7e4e434a09b05e1c60a393952c41af8bf9e4f4639954cd5a14c16a161cac72d8c57deca08b798b46161e420ab323743f174d0745cdcc1fe110484dc7c2c4d55891d45eb2c4df54489f7254db003f75a5965d919d0a1c04a329a613c2fdfce6eded6d2f3c0f447e873e48f7e1937602aa52cda070387a58bc7e399efb757d1313fa1a791981e66e5f9a581e46a182256dd81014a9007b08c1d26de9dfd397df906f62cac112552dc540b278524f6b14b5a27bb330844045c88f7f1fa5ea748b251a161da70d1125a262399522b250f85427ccf69c37c036cce58f1b69e60665b51ff91c8ef2c331a243eaf1a98220e1a47867cc664a9c05f209bdb9f5e3adb6928e32944932b26c167b8408c0a7ea86d72c861878da95ea9ec031f1c6cbbe0515a670763c854f770c68cfdc6f00d3c09c6ec53f80cfb1155bca0b6a10c771208eeaebf8622866625db23486ea60d212710ee3ff7d361dc9f2d40c8a1a510c410d30117859d388bfb860793ed3973e00bc03714f9fcf5e4a8bf91805824329b18095a915cf0ef49558c28f27bdc5c58e4a44da5253021fc482df8a9df9fdcddad9086e2819c6266b1452ad88f45a4ef4153dd23c45bfaceedf9d6ba5226ca8b4799f07a28e9f886275d96464dc959b74b347c9f0093767657f540f2443cc6e5ee1abf92b3c66ff5f9568d19bc15146d788b9f0cff069c2741aef44acbfba3a40f888e492cfd5699330ef804db96459903ac5d931583b2e5dfe6cde0871c5d264d72186ed22374a71a7b872856622178089751db586c1e2a78fb82cb5d3427be2a7f8ca4c0c65387504ccff9623922187d4c1688916b6a80ac9b548bcce372bd6188bdf3180cea7adb7ff0de72945c72608e3a64017eb42a5c6566cd414bce8217a460d11fdc87008aa17090cbd31739500ea19ba06566f188267d191adb84535a3045bbb559f8c7dbd51681c529fa8160e6c30e6b415862701973cfea8190ee4ec65afd51535cb68be1cdf0ce4221d5bb8d150e46c354719ba41f416f21f85ad04080f8ad584096f44c75dfa9efc9e3fe2b4403d7b78ad18421d89d8a4d75e621738e249ae46f6026101a29bccb9bffecb13dc044bf5a0d42a3a396120d1e5fd2a85e34e05f465f347d88c02c32c587f0bd565e2c1b4c09f1094dd096d8e31e37eb6615214c963ad7821e51e30d911aa8ec3832d90d84c2631973dd75ae09570d5b7faf2158f052aeb4cedba9d056e2a3c8124bafde1854a1a82865323d1ac9af38e7464015c5c1f580fd1d2ee448ce2af8a866312ce23a54e97ba04a6dba68c52301765563cb768d8881557878b5c0a94cbc6ec523748798e085b6fb499938d777741287da399c3f617377b01452cf782097a14788331603823580620b9a2b53f6094ec2b41a7fa583cb928ad841c647ac54c32f7481ea533e15f29312a8d2e4358d349a4741f62836c1c437c12d908e5d9ef1b2fbe9e4d10eccdf1c7737b31f94c4d6917f8ee8d35f4cfaf7534f64e76304f6356cc1c5cab2f2df05f2e1b946c3e862989f419a76a52e92d66ce9649ef8698bcc99882862ce97c3437e5256a7eb1b21d241801068e164c619d11dce9443d68c32ea0fcdd71a8877873c30a2bdd5f775453864463436cfc54b584390590b2d7dd0b604ab1ab0320ae8238339a22f4022ebd87fcafbcc12e4f5e961be4032f293e433b9d5da2397863c69312a60851243754138756b8ee576574fc1f3059c950b1f70264bbc3caa68865ee24148e88e44b69dd3e56504d490971cc1af51b823146188a56ac9a7c255092175b4a9fb3aebff1262b61c1708a04f1cb499c0647c7cbed73d8783391ad1c133c37ca8e65a9981495abf0b85e8ae8fb9b421ca3c8f8b3b3d6361e43d3d4d92fba7bfea307e70fd61d8d7cc02dfe5a6c532822a1c0725e4152c7224badf22ecb211fa752ef4bfca58f92195ef947b8690716b0224d38444c94f25dcb5c9719787fb6df66851afbf8b335245e580d5d073c7946982ab3105ea8a2f670f2a66c15f6d8fa2bcc7c128033643ce991c3e2ace49147ed9ba1acc77f676b8f3f197c959c568bf8ae82da35be6a004f98c537a89ef03da37c5c56be5092c21cab6a7cd92bb117d0e4a6ea78bb75fffb1e9be9beaa3ab0c5ba377283f647ca096177339730b3b261b11c97dbf39eb9ddfbeb744d338e167c93b7de3c2eac2a58cd71eedfadd061c66189dac9fc4971eb6e4f4a017e44bf0b59082adc9a1a5576a01edc1d01e52ed7e1dcbb7c9f135a9cae93afc80d58457af2034d3b90c576bf53c7c1aa467d4d3fc465883b08371b93a128fbf3020ce19e3a0fcc3da10e5e065f606055105317b1a46d7be1067a81924744f62cb1498cefb556fd484bca2f974c14f200af260014fafb60bcd021a35bb5ab69b81501dc627e67a8524fc2f9368a88b236a59b6526b59faad61e58e10154fc51ce295d0e68eec064ff19a5223fda606d1eb24c39b64529fdd8a06f7285aec48e26350e452a69bf91028c6870da3b9c70ecd80f2b9ba5db68f8197f415a40a350c43c8cf79819bb7a2d760d383fd11975f61e69d95538716c073efb037689fd67917807adf5feda02cf4c8533babf80a96043c688bdc2aa58988af6eaa9133f18cb5b8e883d7f62693c19fb7208b93a3c5fbff209744869714b3bebc18001db8f24b3350ba0df04144c761e126959264a2c6bbfdc58ae9155eae605aaf1c82d993d6f5079a7933a1095a96a01d761d623a4790e3a0d7c5d83af7d0860da54edb94ebf9ead88d95d7cc4779848d0bb3271a7fca8b9645381d75b7a0831ed5fcaaed22f9299c14b32ab54340bab5e2ac5289b97fb8b8ae508c161fb0a4ad2150b5863078336af7a683c335926b62c25c953450325353fdab6f1850a69d4482f8625fcb08029c1f09f3651911b006262fd34b34915713eda9482221d0d7047c250f04ddd2b9602432704f4b9143c99ca0bcb3fc4acacd1162bc93c1821b7a088d7f4116134c00e1489a615dd1d2f28a5d43cf41635592b506cc2b249e676c4e467a37d80b60872f8514d70feec4e99a4cfec1d02d159b877724bee335a1d75572656cc7d9dcb976790ba199b6f1cae948964bb06cf9ae2ad24dd03529a14cea236cc639938d09060e7168c4f4674b3e174de328b425cf79afdf30a622647325b143d8381d2bcd94cd3b5a014569098b5c5dfcc8db225887828dd661b4afe2baf5c79d480af5df3b73dcbf4bd29cdc5d45459e1ddcc7c00cdd66bed90f6cb1892deeec6cf36332360ce080f32b89150a13bc3ea5e90f06ec0bdbd024c05ad194d09eaff91ee7ad86556b435868619dfa8dc97576f91b68d9e9e436ff71dbc6536fa83ac8dbb2ed7c48b5111ce320f6190dd3eef7a9984933b95e2f277e8cdbdbb89761af511ffa79d5097303b790512fc709801df9cb257949730d5d07533601fa7358bbecfc3cb97af4e9cfd3a0080669e5a8c5daaeb05f08a38c44e0c86bb9ed331ce669a479d26a4d0f872463abcb49e78c43f05637e67966b3c2866a714f7bee8b63772f770c9b4cbe43a42dc31b874c4da95990300ee11123a5c2a3117b23248a7715d15673bc7eac52efde60c71f9ec676ef201c6e86a0ff7354a48582e07773b5b8e2d994d354b01e356609d2a6a7bd9ef202fa8f4c6e72c6d60c62070aa73b07d9b5317e046231d52c65df14ae6b968535e89a48e8d37e1a0e06ef37ab3654772977c9076a426f74f20994a2dfa2726c20436210b0404e747785a9fc7c4bc1e74e15ca288d5657be9aa62cb04637c33b53485fecfcfdb5418a8ec0a98594bc8f2a86aab3a269e1ce6494f4cb45cab86cbbf3c62eb62b8fcb874446f9bc98f7b45c40e1e7ad87a04020381e5b3ca7d25c88be6e95588fc43b8950f3f939aa1321b79a0eaa498395ab28774f658b43b2b8a26819b0a5d6f6abe7fa880a2ecbf7d3f543358e02793e4e85414ad1ecb3e313bfa378b3329b118eab1fbb9dae5841b8a6965e80433ec3fe7a294ae232cdd2e025e18fb5bdab1b9347bc8a1c632a89c236f96c0bad2ab93885aae207f2f736c60e11c2bf441d8d31fa3e5906eebdff2342ac9829555e2f2906b1c93451e4af4b1a1bb10c987355306f0348da6e946d0228d613d0dcdb4a58626b1f0eef9311b040a02ec2a261498f62e922524d764f85eb65a313be9665218130a8b60a4f8cd0e5f8c8a115f256d13c151598cb832d6fa9345c333d54541dcbb32166630c38c11f67da2a0e63e8e4319a273b7f6e685eea71a49890b7f4a6321db2cfb4863f5bfee6ebb1b34d40c52e57ae29070b6eddd642d0ba28d39258188f71dcc30b6d291bc56732e50befd68d7bdef703cba656d30b6b83da3918c87f706ed284474195a3879ca48f08a2f0aed1ce4d14f79bc2085ab55f4d8a62a40edef76c41ac4308ff4b6b111e349280b928017300ae247f0f4061dbd578c43a278d0ca52be9ee3bc3f83f418fab54ecb3c2f60bbd0e99eba01dd46a489a40e1485ea9a0a5be51e8018bb92680acbd91440f7c1b7660b77cdb2c618bfb23d930a27c03094da61d73ee5638253fd37495a42a6e30eff42cd84a52f4ebdd5abd089728615ce3584f7d9fd2e1500d44d83bc3483d05cb58fe37b09926fa863ac52651a2b07d80c5a119085a5de4ccdbdaadc9ed510921a9c609a6a18f1d4f0769a0afa8acc153e617b6c2596ed8cd94f284848291488e30255965162588679a7d0e28137cebf0e6935d0cacb9185c958f2b9559c71bdb31f0ae21e6ad6aa82ba119c8dd714d2cd7aee4c5140877962b4e2599fd754d9066f4826fc0adc9f46aaa4d117602a4877e28c3e2da88f6d9aa0e5b6efe9ee9759bd1059759241fec3cc98b39daa0ea5382c79f86efb1bfe028a2b114b672e61ca06a60959e9d19747e77961ed6a6da0e7f95d2b6b01574a0ee9a12f7df4fd91311a4480bac38d38a81f23c17a6d571e82375a5476cfa8e73080ec1cdb05d1906e9f8980393a19e31707f93d5de3eea2957b9153d83f44d800fa10ac18296ea6d4ecbe6cf4d700b0dfd539796d31bbcd21ced478c70a129c4dc7788e6b25db35df73e11dcfc224d3cd889a808e64ab35d54893a60d281dc06b81d8c8bd7a9be864a0e6678d2421a678c8627b5548f8d9b5b3a11bbf8d305c20fdb03ae05cc00cb5f2a172ea2d745b899bc627f0a23d2223286680132cb244d6dfc0a3eb5b4f0b2ddbea3faf63d69b8c2874716c4547e1497aec2ad66a7519f8afe7cb556be4146aeb7ec006cb3f485afe5654a130446bbe8ac64dc553a6dc29429b497587ad49736d90efe73a6305848b96d58144a3384849257ee991a95aa785e9657f160cede805283ece6fd12667acea12cf2e869eed5d6d801af31fd2a941aafebf2783144f109496c2fea50da0095a5e53d11e3efe026ee0dc08b17ad49983c8cbaa248d0407c4156726b533055f549c9673306eeef046fd868b7a0f1e4cf402f80fd74836c96e8a6527d11c0086e70571f4fd8ae215080c377899c69a01569aa675b34a25f1b3258edef043cf8a2969f2de50aa5f5bc524b7eadf82427947c062fe5c998aedcdbbabd6fc8b1a3f73abcad8aba938ef2af3bf9494e2ff4e069cdcf91d8be67b34f7335584278431a65b6b4dd5a625a803b1d3f15d8b223a9548bfb0a67d7a6618abedd109d9eb629f685c7806d5d495dec7e09cd34ff55058a362e05797ba528a02a1ad84dd7d92a84bb4f297d5880daf5043f52bf9f4a991d17a3af59b1ea47a1111d5f9a9a9695e8a567fb11752b5a7c754a2100e00566b76d5cd4e8626887c985b169a4f8eea845461ae8990f4a5e3c40d641d59790571bb0006810a1e3b02679f189ffa3a8994bc0443953646b39c711d5b91dc1d0ec7a13da5ef155ae9104a9807538b99503dd00ec80c36b25e77134161362cd5983ba7363e9098e3e3e8847e8c0ab7a080f6b152cc331f00a754a92a3f17a6f16ba5e2131e952aa2bd91738da15f6b1a667e8ae5b65eb35f1dece0b523d57ef52764abbbb2d5350f6da5f871113deb6a5cfda3427dddf3467e5e4ecdc7938b08d266776f9e0a46e1270f427000a2dc89722bd5b8fe7d958bad299115138bb80572a3d368d5a77967c88aedd5bc1e9682042ca45f2029f9fc3ab8aced2aa20bd6e1830cf33ec8d2fd177b5b0012a0fd5ebc117fffe7613c58ddde6c960e0cc0402302796a9bfb54a820531080fff48402d319104dc334e8b41e61ef523c78c75e13f54605ce25ada864ef67d818add487ccfc9c216fe6787213436a79b35c7d48a09acc2351e7c72b7cdd7cd831885864c7e49d7dc701abbd4e2d0a78cab1055d2f26039c385ab822291d20074848b1a048e88f8bdb80da250a08ce95a168e2031c5ed62e27b0b3581f6e2b46de7a6aa5560cdea94fdb2f4d96a5324d29b859d8a91b6fcc277fabe64c55e8e149306defc7910f90ac7ea1cc94ed590e95318fcb0af344efa6cf6540d575a1ba138c9a0d28e3d924022a52b54d04fba4e91ef6faba5ba9d86c2846af8460462b57ba8af5d91337e6e1f15481084818ee099614d316b9188f577241d8a0e05c4045ad10d5031632840b5821ed2fdad6ff1390bd616dd79f9c63edee4a03262a35c0d926c4cd8f03720691eaa554f7ced1fca3c054bd3483f4b0cb57a545fb8327d7a5c5d0bc6f51cc5ab92db3c0503cc1c9bd949cd4c13e94f8de1c5e3efd8eca8465cfe861662dd4c60c38e7a0df7a66ba504572ae8baecebb103bf35afe09076efc7ec157569715ee1079556f5eb82246a44c25ed0167852cb650ee70655fef3a1053485494bd8d43558cd70cccaeaa97123fe4acc7206e89c74905eb63475d6d71e816c351032e22949c408799ac97d6c64280717f6aad28b4a5d379ec66cf1012285ec647a56c2ed4da5ddaccd570c94ca7a08bf840e27b5c4da52f958d9c12a7959b0f1763cde07f4ce3c302d9b428388d0542b4d94138dd3bb2fda07bf445fc4bd34bdff144699749719e0ed388601f84f2bcc451803d50321e683c2835a724faad55345a6e76748f08a6dfd2a2270364f62859ced1981deb9200ccfe5df3d96c48894d96eda0574ae5a585ab325a12f932f5ca521c71019553e379ea82fd1ee0d091078fd111a4897044865ace9e3cc0d94479203e9c41e8e81f98268aeb9d815427753d046aee63a3114ef38d2bbcfa16d10497ef632f3cd7de8ca431e6a0605d18e2afa44f74da93279932fda9d337a2f8a478e9cb4d75d7601caedfa65de90295dd4fec38877d44f1a964256fa16b807c9eee32d69f5e448f2fb14a9062414b7fa6ae7c87c02b0b0c332a87ba75fd793786d9cf169ddeefa510c06ec8a5f8de83993e36a0c260c45ce10798e07cadf1927de11cbc36edb2f3bc4f6f7cd79b28fd71e058b2e25da58e8786499e372384a28547b9d06d200fcf9bd1bd84af0a1fa08595451b8813fc9c65b10da867d40d0835b807b6794ec295c5f98f0273bb0852b9f245aabda3c4858209da27450156dd3c3bacd018d7bd25d815e071f53ac0e521e8a6e7a4044d20fc8b202dd954c539e8b1886ac8f8ef740e6408e934e7e1354d5160a331701158a6485465d0a51051f666dcf8365019cbb530a84f811250dacb530328ec2d7c585036dbd9acfbe077e4c26ca4b165a8949690af512deebed421ccd38d97b7bbc6523fb9189e8c11a443e3a414335f04d12aadc70b752757221900a4ded1a420af496c45a04ef7cadd7db009e8a25f38db56a53c543d97b6104776958a03f281d5119e9070ff3a503e0e8669140c1e9d81881b80969aeb40f1c420fea83834a158ef4adc74a85e77f978b21a43caa66c95adcca99f6fae73d552e0fd3bdabeff4b9e47fd78a1dc0b6c1359a8da1343608b0252663bfeae34399a8096701fc086d08a178882339033ec1a6d28dc2b13448f3f8d16efc9d6a00741e6e63cb8772984f6882e4d8cb89c8b40d380862310d75f6f448911089fd035c942431a02b9f3babcbce922320be805aa02c2088ccbe705e4f1bc40b83a5613d99904758100054f16ba50b240afcaf677b7fd8d32903cb93060b7c90662cd8393555a543c2a2d2f703bf6ea4060fe6ca37150c86e2fdcce9be1a780039147c2bf668c37399c51d2e4c4ba96d0b8e122cbafc91542dcc786d9c4a7db8238940eaeaf108ec39e7c623df73bc7718006c476f98923ff9e2d86fd7c434cafa11082700541c44f6f1f34e45589942b60329d812cb48c08a13f98e436349d3031e38a73d53840220d67b11db65913a8610a631273e9a16a88bb3cf664728872063317d7ca3243bc4d5f230dff13dedffbffdb4da9b976cffc327d1ccfec5eebebb728f369fdd2c7e230ffa97bd061f2337127b3709b087b706bc0f80bad822086a0d022a61a1e1329377da30bf622ffae1d0098bb414eed94e0fb3103ef9e5fc1f4a00f44eb87699ceddc50a0d2b7c0b9eb0b0a93549b2ca12f176d77d2f426abd18a3384d3691b830c26b983ae680a1799197f17c607ee6e7d32bd663bcb988cbd968f0dee2b0b4ae655daee615a549d203babbb3a70018838d0802e1faecf57e2324e7ea08af9e67173e5c3f88cb476f34646026172ada7afbb1d66aa184467bc161cdcde0724e85d2fe08be5496f0a84229c70f6898f5f7525e0b4ae7d890cf6ccd3008e8a48ce1dc9837727592dbf458b54df3deece2240c7490f8b22703b745fad950e183724daffea64a099eda4363aec5127912398c2427f1c71360730b0f643d0db6fb2a413fc1ada6f93ee480e84c48efc60137a99f5a4ea244b62c02da2bac29566ec387086eca7ed920fe71d9306de8226b863af8f318961a3457e86379204c4af487a513b6868ed33cecd871801f8a72bd037217601250c215d6aca55382498943f4e1ad737c4e1689c9fb5f144c8a65999aa928e364c9d0af6ac674fcea6a643e09bbf8657fa367b2607ed6462453b998b9614b4f3d393f2dcb3218058d81e80cf0082371bfd1e7ba1d809618e1bb51b18c835b6bfa795d8de61efbd0ef9d4d18c20cb3a993c9c9eb0ae80995ec117d85a3d2957d1efa75317cffb0bc0976599cbb6541eb3a6ae1f2ae7e9cb83f3e6d59f534faa980bc8bfd35c8cdbaaeec7113041eab06c9795542439b696c50a4231c41877841540112e40f19c66001e3adf5104f5401990dc4ad88555a6a6449a132a7c3d85ce7ec7f2a860b51098e9b709ae07e0d3caa5efb569b67e51f3412d2d945c2f203cfa513c8b47fa7892f31fe9e6c796c070c677fc5ae08048e81625caa8a0fb471ca79b7b2c832ad00e60ee4f9ce85c2cb6d706b4d2145d18ced9c7d2d4f9841004eb2e6e60882b4f0e3c94e6de8a1dabddcc744c80329123fa1940c39f65e3be17904072d299dd9d9c25817340c66bfd251b92a1fe9517b0440061dcac1fd6efd91c981fc1c903fcf3e597ac125005d46eacf270bcec0f19ac4438e330f00cbbc34eb6a858b4fe94d0e911df98caeaf707e7aed2c9a0a91add106c16cfc26b67445518ca13d6a63bc5ad167003caeca2beefa8f54145cf6422277aa1c38b0c3e92270e21d6597d60fabb256128ca5a88b76b68d713c6ee26cfecbf863ffb15a147a552c08cae7a206cf6475a6f8d99fcd6c1010d457061caa733af476c95a0ca3afa4f98f7aec3103f11c77876d43c32db5f2e730f4af9b5223260d31ecec9aa35a30fd39ab5bf1fdd878e1bcacac7d89d279671f5ee774edbd92fdf34776c3fee43b1c79b95087a0b8c2964f68612d0d9aba5a23e04df5ff60fa56477bc8e899d7754b2d756341023536bc0234e22c7fe5cf9d62f10f95c688e43e6614d9d620ba07c3dc50f982352b82b03cca2d4f4f209ac325138421f2e7f71969775184727f5e72dfe2760361a789349ae3544ea418e8b5cb398bdfa62178cfacf97b11a6ab15a47548e241ce6f0cae787ef7b3931b070a8047a08c004502cd0ca96117ed161b3f58256c1641c9d898f5b94fc8ba169620e96ecd5bf0720fdf61bd5f59bf49e6c4664c05cf064f316498e3611aa6c530f554cddd2272290321f65c27f1159f43274f3613caf40c3d2a105878207070eed44db0aa616c1dbd3c806f2218dea41aac050927046fc976acbdeb9c51dfb5ee2e53867f290b8b65e763ba690dd206ac3ed948ada0ca9349e0cfa8390e9e52a3c1618aaa28281e5a4b1a3c1f900f806d3a760f4b0e6e430f4946c3dd2e2292329c85002e7f1ecf75b910d3dfe4ad2ae368e47bb9b5ffe71be38ab4bc537ed470a9282214679bdebf81860c56f6a97ee951f92378394394d3d57a43a0115ada7236a9b1b47d42a3f1d51cbc65dd2411682106bff65b93111c1d29a6719d4c0a1572ed4b6acb964afb9b8504b390c5896531f55f8fa6caba1a4689076d90df8817d344cd2b9401dcacc9bd3fcdb2b54fbe77126b4405487a1b7bb103d80466355a44d559bbe79643b7908a86c80cbaecbdd2a8388ef9bd7a2906ef4f7d193f05970e7f2a4528eb6a5876e343a3bd89125634556d147ab627252415b08a7ba88c99da4a2637e960e7153e1f1f0a5f3a0a06161ed7038310dfa95a53c21710319e22e3d5bba6fb341f8c7dbe4166832e94fb9fe70086a816b16167b5bb8b89d84ea2650852210f2d39c761f6e3a4c13c5cb82a57ac21a99b63df7ebf76755a496979a5658c52f4cb03004e0ad3159499837483f4f2d9fd9cb9d07fc28a337fcac0a7b6d1bd49644847a710d1ea93cf9ef495beb0ec8989d6fe79ebeae8f4e39c793d9147230d83a90be5408be30bb4afa40048189c35d0ff19bd5aba8cc96cc60e7de9c22e92bdffb122ba93b56b0ab7a363479b7f506d77f182c9c7efebe39df230eaa67841341d3b900c8f9315e7f61f21e55b3eb210a8997cc453448e10d728bde87ecedf54e8ecd3a40d145705265a13028530d659eea51fb8b781bb4db9b13e5fa37193eab40a1147ef13a2b514d85966569933fbf11ae8dfa3120a60e29d593b8431a6dba3d50cc820d830676b966801eff0098c7e9e2cad5b7427e7c4c68cda1bd24081eb71c0a14b078f9db68c2cbb04c16145c697445339d8a5fb7d189f7ca03530b8df9031d6e8068d3a02df90942c7e12822f687377eaaea8f48617bde48929259f146de5aedb4d07b7652fcb6e14d3ee7654d7ab48724902376e39439ef8a6a8fb960777c94c8d1a0adce84fb191e782147e510e179d8e18ac2e768f2a64994fb3ce1062ebacd0b4a5936ae8edca67480da410ad2cd49554571bf6d1559f9965c60e41156390dca234d37d3dc521e1818db600ea2b713f8c2a1f72d711628e6d4c4c970b99a0acaa45666f1bc2b31603f46b6428226423958fe28301cc030d1b0b143142b8a63edac3864ff63b4ca6ebd708ef1ca525363cc1ac49a89e1e3ec66e0f6e206b0f2ee71b6c21bb48f5804e543d8d0c00149f0b17f65b0e6a19495e5325ef487b5f759dcc4f9024591f9093ecd2d3e247cb6ff5ae70472c27906e971135a92d67bf899ebeb95a87fdc0bb525f7c6f2be156e632414ebbb823ffa8e714929970b36d220e542f29d557b4e0991bba76aa3bfcd242618ee59552ccb77d181d84ff6fddac64f467bef635929c6b6f75fbeb30a26d48450456dbbeab693b5b4c62e5d40976dc2b5c6c47dc1c9b41f01f1e843cdd5084a1f42127e06102b8f539e997b44c9e608454a2392487f9897b68f7f9db455c31140b5aaeeeb9afce46fcd8e5e41ceaec97beac7925b15bb13fdd9749424ea930c8afbc202c9260618c56a0aa1f09c7c35e62f589b78bbe6235365adaca3e969699c0f58d0f5f2b4532f455ac7636804deb2b5e70d6b82267a31f695edae591d8ff07ed584621b1d6fa8c977cb80da7c5a085693d071c21859878e4610aa5a3feb4243a4539d49546544c790dfad7283e3d8d0e1a9ea541dd351a9c0f2795c7e64f886628e76364ce248db559ff49f0bdd225cb5684797c6ce2f23cb6db9a31bbb2062552e44ec8c8c35a533d68303c53cf7077135f688afdae3320b3ef70d513d62ecf5c2733a26c4b623d888eba504ffa88de33079634d40ad52680771933011089ac3f2acd222f1920fb450de856ad8c23496f13da4622a96fba09c1c892afe823a109ae8966e11e244663f4820507e88144213dd4a6f14b90ecc1ae834174363f224c0e92b9f510295018102302bc6baf87c1a0ba05802161b778b8abde9f09e91bd6a87b8587e98f3d365c30c6b6ae517bd2b8f0d5c4b8b5811d1c6eca0d4d20429ead4ee27cbf336a02e0659f039c9ba888a5d4e9600f163c815fc4c91912a69d7897f8478a1c638409b2aec55e8c734b9af65ac14176e2a80cbd58e458bf03775f510a2ea8f68be970d7fc7c52bfe24cc83e44b09805e07e8539e441f1f2d49655ea693fbb25ab0cd9163c7f37b9958ed7c9013ba3948ec3dc14ff53b1f3478468ef81d0e86b10e3d6bb8b579adcb15f4760afdad3c997095ea25087012bbb86c5e5afae18ea34a13829314a5567d802954f090d81a1a2b19ed2cf7c7af805947d3f65e5c10d96b4e286db8c6a627e52972c57c6665142c8db20c441203faec65645d30d0b24a072afe43f145d8bc1c1ef95797196b736c3864b4324fe037f63f7d491c247e0e797612c3dcb0d426625447140040151c172148cb6478731f058a33d2c8e2694c960d13236f2f198c44d822d8109184ecbd3791524a99a44c01f80510065d062198d1499e39ee1697ae3674e75c9a1fca283037d69e17976e8e4b372eddb8347f16d52abacea54b82fe9dfc383d5678b347d780d6af4d1b32d4b9908c3b55f84a7a1e0d0d0f1e40e252942ca3489c70fef51c018418bc816501c49cc82424877d8493c33ed291ed77f45e7459c4c6923dc5e9f85c282e398dbff4299f8c2241ff204158735f1212bab23e69fd5af58777f515b9df0e16780929551188d874b34a551f3f021173a293ea0b85a4be1087281211492019742387bd24857a490ee990444288c426a7991f8f9056909948dbccce732291e39f9e53c469668efcd94b3b3b3e7cd4d4bc728873fde4fc05744e9c41d3cc07c283c693894df88bb24a936ac68e4d4b373645299384a6fbac519f4aebdcb40e4c9ef16b24e881129c552e21c149619d13856e1a27064970b64e903d979696aa27a94823094e2af83b36bf53affa03ac1e7faa0f0343a4f0f2ab0f03ab4f45a0a51bf06a95fa186e62ab0f2228c65e90b1ce69229e1282357932f9bd4c91c97310d071f327cebe994d6d6e939b2fcf7da11098dfbe1047fb421dd944cd3b311031600ed68d0e980f2733c929a780724a647226261cd2ce5f793289a6998f3d26f27c9507459e9ff29ec853aaa09bcec873cef99a3c6a9b28d8bff9364ed85f7ae04f7b6d332795c844a5c11a5ac4bdc029dfd76ee4fb9e848b6ddee9dd3a65fd64d0bc570ee5abd15713ec421497f2d43a37ad6323dff7a227f95eb7e1ba0c54c07b5fc7151c3e75699d9640a17cc235e4eb30e40b24cbc831378d95432011ec34f7be8e24f0d0951ecdbdf1c969eeef24915b2a6c483e3949f072915b2478efbd7fef7dea84024aa588505896435ae726a3de1f01453c87f5de36de27d23a9ffd5a1424e80ef3ac8f30cffa97edf3f1f2f9ca65080acd976f727ea1f5ab521997b556c9d43a38727d9945e234399013752ab5caa71aca2abe49efde5a7f52b5fe8f31f07bea79a436e592e7c4a55aebd24c6efa3349102cc67591ebc77013ebe6114a2d3f42b945ae7f80f9a92f895c6a1ef563b831ee9357f417dd413870179cc6c8f567106553dbd42363600b18c9d24e4c4b4e78c969eacb5a5f7eb2d6fa77a349a829b47ec5ae3c0f91221207bf4c41e2745e7d5782734a2e797a39d3feb5107fe48953bc18e5087796524a2965538e3f656c8a317e0c0b86f3895c785e6268bcfc9639301f5e5677837af99bb73de7854832f7f8b7d4478e7b2de5851818caf8571fe2e8adbc30fe26b5e4e87556a5b62bc1ed93a8cc1f85bb4a5fc9324ba88297e37bd14ada2c362cf0977bde950248c094638e9f2bea70016318d8169117628cfe0b3546bf8bd6af1a70ce9a6727c11963f4c19bd94984ae97386127f30a830f3a91ac81d62f2d88130e278edcef1f81340cd6cdc7a8ae062ccf1a04984f83947c318904a78e1658be47a127b4fbda56635f723ed6fea4f6a95669ad3ad9fd7e698382845a6726079804270e72046250ebdc845abe1fa3cd16f8ba7fd36321f36212267c3fec2ef9eab0826d0e63500cbaa89ba16039fb9bcee958f6df39f4b3efce7016e434f7b36c6e3106dde7ee76b3fb395a707dfa52492624c12009ded7d102c70b7471506badb5d65a6badb5d69d17f0f4511f2673ba46d6af3568edac6c639ac67edb1dfbe08d0f98fd583b3760db2371c25b2377aeb5f6651d8ad6af700ae519876ee4fb7c9811464be459c5d5c56e03744efd8e489af9f36b4933259d91c9fcc9cd18f8ec689b2e6064f1804b372403bcc29cd348dbcc0f7203bc23cf9fe17752a47c7977b40e114a3f6c443299169840055aa789481c21d40f5afd58f4d5c779934c24589ff3349f5187141ccaa12223244ef8b5861f5091f565945a67adf58d784e2cf206780ef7b276b1c893c8fad5bf56d9d9f1e1a3a6e6d5e123222a3a473e699afaf10bdba88d8000e1c18386c693993b49640edae47c88bc2063d869aa4f103a92c00d8847108834f5ebc51502314712394dfdcaa554a8fb8531865ce517b6195f88fd0bfb06b982396e740ce17cf5432175c869eabb1112acfec52209d60f12843f689de84920ce2cd3b54dfda1a3d03514bfbe64da9cd0ef9e3d7bc65f21006de32bc4336c6a7830c13539352f89a335657f306f38fc9947e2641fbf277ecf15d85fc6cf6aa59a4629edea1da1b9669d75d7da24a80910932126421db35293a42112272a3539caf17b244ecc1da3c0add46428b712932eb7120f55324f4fd753041ed29f8e15dcac2e66c99e6561918ceaee969f798ef28ed06e7fb9495005b86b5a2795bf2e58fbcc53e5c81580c6b8cfbc54febec0178c22c1f8028d71bf7d4bce6b399719e3be9627b54d7cee93c818f70df1d3d9a7b48d51ce3c07f224128ca99ca56da20f49307ef6b9ce1658fbd0bdec519f59cd6bf9288f4ec9f16dfde8b749f008cdfedda69be4acd05af5e56e226b2a212ef9882c2195fb9b6dd35a4b8f3d1fa0b994dd524a29bddc438829a594d406cde39c34f6a33a1ce2af7ee571231e6e07cd0deec8b28714cc93a30d5ae83260293729b19452caf8f325a5943e2a77ee4e822e039ed371777cf9949dcf809bcef614543bbf67cf9e3d7bb677ad29b451ac7eed3473be57fbf27dce49b7fa8aeef4e7fc2c0a6757dbfaab5ecbdf6bf95742ac7e413079e3e0fc58bdb3be6637ebddaf9e9d41b8049be74701cf415ca0bef5826eac3ee55298404093abef5ce75670fc195163482399a1ace57ceadb5747a747d5c845596b2f0a752d145466efb562b3d6c9d16170ed2efd4481c36b0587138a0a70788f7ea0f84901141cce277078abf8e04413389c4c18a1e0043f4f7e4cf0b3c44f097e94f849e287ca0f123f47fc90e0c7889f11fc88a0081cdea21f703889f889f213829f217ea69490831f10fc7ce047881f293f41dc13c8f7978be678b9b5d65a0bc8157a877c0918e1c077327865a425d039f7e50ff19cfbbd220e597e1869c832be4046762feabb9f7cf97a6d3d49d81ff57e9d464671a3f0e9f3e71439023167239e81fa599ea86c4a2394920c70bfe756e2e1881e1b70a5ebd58b293ecc109b4193143c0ca1b0609a5b89071caccdaa182849a980d954a8589de78bd74b8987201ab62de6b434a5c70390b560f55e2cbc6d2c97185dced861890554a476b042c50e24484181676ea51d8a90df8931ab68fe81d04347a5cae1a84639554e49cea3b165742e5abfc298c4440f3262cb0c1272bf8d25389c7e37ccea5c4272bf0842b44e8efd3bfd9ad571fa1fee0b48eeff800b0a96fb3fc021cb89411fd07072bf4f13db0f0ee623f7fbe40087372542ee6701a1ea71371eb9ffc58895c4097ddce47ed991fb593de0f0c2e8a8c2b239ca712546a726f7db68824608b9bf04306a6c0d42ee8f36e7bed8dd3d3a0dcb091c5e193012f53499f9200ef9ecd0ea31845d3968b0f1bad141949223058eef48e78817b20487d7fb249f2b1f8ea497130e670777c3acce95430ac6d33dc8d1fa6006e9081c4e5026c988a67b72754113b71c42cf110e6f4d8c9310226c5832e8d821c20c389c37aba3e601848a1e2a114a18c287116c8a1fdb8cab09c671e56449304960373f1a00b275eb5c2618149d6ddecd1564a747d2f59c6eec397210b25d777730bfb4c0a8ec5f8881fc01939984da9cdec8d2655facead9af5709567a371c7bc7dfeefa0dd7fbcc6e339f737ac434bfdef576d6eee636254e8f0af094e0a461fc9c342cbddd2babe8c10a9f1dbd1d84b2fc9e9b44923d5a80fbb56864a99f8082f0141a002961022726563419341081123c2851348496987c23f22d30af2f5d26dc3480b6a191058e1ff6148e4374797dfa7b61638165d251bc72a4e3c43f87fe7c04500f014e333fb9347dfa17caa42b615ca32a4b4870893c43d0ca8d7abb65fb728b13156badb5d65a6bad658a4d96842cf83e7dd44b26bf17b75b19638c71cbbe6e462468ed872d2c41fbf6eb23c9d65a6b65b4d65a6b3f3a90b5b6297a343c8018d96a81b2b5f6adb5d65a6b330ee838c1f5b51ce8532e53ca45e63c75265776c14994b8b2908005964d4c710b0d9f042d78a29ae8b7a372733e2b9cf0d3193361a727a626ca23b56ddbb622d91fe5d2b3af7948b2f3b8114a29a594d2ef98940079a9fc6a82c3bbbac930996c652abe419a709c749b73d6ef72c0b9fa5b25028f80524a25a59476959452fa9476a194d24929a594524a29a59452fa744e4a29a594522499449f4702e00338ec9ea866a98e247064d22ca594524a29a5b4a394d2a794524a29a594d20f12848da4ccae68fdd236edc3ae7d37080cf064f9cc71495c2214633795e2382e02e56dd3344dd3b22c43a150f75e6b6dad95523ae77477296544b28a2910dc8b715f89495812c5033b593eea26084a19f70322287690514910eae84d06ba7b5343d7098941272d129abbbb37691b9f3978e82e2593b6f15a6bad40f4fb1e8777dd742ba58990f67132691d5493d6f13eea60f8068c4ddac609171e68b0090cb2c70e78408b0d1d0043c88616c4c80ed434f4379eec459ebec0dddd5d6dd321a5944a8c557dc37dbd34910354e64f6c51a4985aa870473fd82a23a0a82a9c88a2a2aa58e5568252c44a8819e6065adec4a23c1f92e6e65dee75b7eb1982828675485d283fd832923a5b74829477a82a4d45176925b738a1641529281b80a2439631b9957c18238791c32e498a48822ac3137552ab0c1569cd64d433040598e68396eebb546e251faec84839ec92b22e7e0ce17e9b5bc90725b815f84084aa061f7eb02ff061c807fba40432cca2faa48806efe980137d020218e4d07c022528dec06e7cc07a96243d19a2a14707a08b5f8fb77b7177332c5d70cd7da50989133409f104cfdc579a7e9062bb01a6b9af340dd1c87d85065d5c67de2a5d743a9deed49dfaa4747a479a11a169ddf736ee96d2a9ec1a65ad5fd7f9389a02a1c57e30facfbef325ceb74d04a24acadaaecb285bc6289d8894767737abbb375add0b4d93f34e29dd674b1c292fa559d0785d95ceb6b1d6c6ea2eeaf4da4ae984e2b2f1f69cb68911a53fe94b56aadd1be3b4f66bfbd3d2ecd4e7ab865a4675a8796da5df8c39dedec0eac63b3de22f480af095f1cbb8766927d3ea6d271830986c01f862e1adbbf101db99f28b3272362387fd94e54d965898a004606481050f1c8845800727acec00e5880644c44e40d2c20b1762f0c4921e62619f61431355d44084851841b1b09d9ebc209f67862c959ee090251106732b11b520bfe45622528113f506aa45ae7a6cce91d01875c03b9f0f9812a22a370a2c732b1135d135e6e9198282121112b8c3915b8968286fb9958894e424dc391590a2c4c88b22c06092438c0b22259ac881942a3938993264451124c0b2022e68e8d1e1093368f0a2488b2d37ae2801069716ec1043164234dc49e111aa6169a3d5acbdf86ed86a515a1969a492be94f66694d28d3efd967f3fa87f97acb1b29c3aa5946a3452c9096066f12bcb45fb45ebd314f587d0400c557dad23c2fa02f5235c814356aeeff5eb1fa1d9fedd700e8c88d447407d9efa436ae440aeacba7dd6a22eeadacf5e73cf6c66ad372ac660547f48fd224a2970ca954bae52090a1e72b8e5252882ea93029048e229600441374baef5b1b5d606a0b3e45715e308d570adf2bf7eb8d65aa59435d3b4acf6c800c7ef7749e9929b64892006a61fb23a970427d5be10f7fb53af957d3f2df9fd64d46fdc90ceb4723ef41df5d33986dd316679d05afd32f7abb9fe5429c499311a0aa031662216513a5a31a23bca6f294f00b37c192313ad5f8f4506a0dc58829c7208b9b1042d916f96fcb9b1c85025274004b8bae65bcb84f94da7bc1bb5f6e75301749625c8e64ca0c9f2bdf9b9d78045862879951b8b0c42598b5b6bbec5eaa1bae70bdcdf5e8bfe2ca1451fccf62bfd4e00b375ead9971f5b15eca75f7d30cfdca8ad694f13a6df61a44f0106849d2367421dc07540fd5af5e9b7ea770298e983997ea004a15825315d3103882b38d800136710a9c66012061726e8e2882074381943894953182e34e1945dd04a81c6e4c71c846c21469d17269878897f83f82115ff4a99314c64e8e0e474032be25fb985fc0e062d7a5092c34ea9872439c69b17e056728294c3ae735725a763f1051c4e6e00dd45eeed071678b240b6809cc8004af282c88c26d7c91000aaf0e2054d4218a1e5078b7489989e8830ea0209c9b24e10c318590c799143162e0411e49485480b0d1886c5f282482102a358ccf2012a453118ef654b4c73188f05ce4a0ce6591e0b31528c2146512c46b210038dc17c0b538818eb633c165a90482cf1141bc2bf97d523c9f89164d523c9a947b221c9d923c9a84792ef237924993e923c1f496e4155c51531d63b19d83f64799bfc11ff65e54950e54950cb504ab22f217f843847399bc6c47c2cb41063c1781da331b81214573af9180aa42c9f2535154601fe1ce29084be25f847ead43d729b045f3e4d5114c6132c3b3cc1454c3eeea6069c38e1e1894bb08afbbae0d085328fe7d4488f31fe129cca611b7d64601e4913ff5e8ca3f615699bf8da6a04da534a842538fbb08649528ddc4a4ca404444bac150c7eb9b9aa1bd88d0f18171b92a0c400872c475f3c41c1a227064450aec4d003c6130c3d5b9e866658c236a66c2125873737098cea41cbe1de90197177d074c882c864f880fde1089b05ab9c2c11c64c348c19d42008a01a2c11a306377051b1a0cac093051c0bb219381d362b9e8830b212e94cbfe4ce3a3a93695a96c9b874aa655b0d2ec66767afadd3a98ae5944e3be74455778aa2b45a0c43ebd3e7381f3a33ee8478c61967785dbdbc6c9845376a6985c12cd5a4d4531c0a48220dae461687f80caae5b271034796bdf775f0315b10c1ee560bd352d2102d93d954282d4c4b493030256d99d1368ec6bc1b76cea9b328cb5de5ceda5e22cbbd0488a0d64aefcbc6ea66b5f4ed6b29cec7ae5893722bfc3576907b84c85dc24c4d4e3b72baca4e7ef900ffd5362823c2f0f46483326c004319b18623260ca1e20a1f8284c210138650f10591f923fa0b045f1ebc6c7e8c5033a3f79c1d7bc54a45c778f6363d86bbc2065b94f10591197dc80d0a434c18d2548cf0c4163533fab6a156afd78bc6a66532a899dbb2313333d4556d2849d265aa301d06159c8ca8f00015da065d060c5ce447231227ce9e3464ba1a33423951faa41b8ef6a2e6c79a5c6a8b5e67c99a0aaf5e605831346a64a86b6d752666a28cecbcc69c34684fd68ca9ed62399d2ceb13e6f67c41b9bb7b8635d5d6298e4bd5f8b6a98e1c9c73fa9c7866ab46bd340c2b86468d4e6666762bd5405e88d227adf6a2326de3522abc7a8161c5d0a8d1c9ccb45c366ee0687dcb6b7d33b382371666dd4ad8e3b8f17520d3c1abbbe9a3156c090683c170e0b6f1f2a08607ad1c346211dcfa2066561c42376c0ba49eb166b5453c27fb60364af6dee07cea1436da05d2c018c16044d080f00202089c8f87b09a95eef0f8d0da0a01d7d46c359c4f6dd9a89c47facc0f56056dd9a474e8d8c1b95a3b6e36afd4b1e319d84d8b8756a4ebbaeeceafeb3a3a9d478fcc0826c3f5408920c2f5e1e387fdd1c2c1c9a1365c392d18cbe5957aa55ea975c15a4026f56a8f680b069b81c1244c274eafb4d219a4b5c3d4c16030d817f11cd8c36030180c2671765aad140c0664b325cafeaae5727fac8bdaa2f7488e68eeeece72f7ed4a6d437578e3dcdd5394b55dd58657fd82eaf006b375dd8d9bd5dd31346a0d4a4387baf5759f94561b62960469bbf0777747a0ee7e3a32e79c734e0abba13573ce39e7dcb8940abf70dc8d1408aa0ee31508301b2ae582d5d62cd88d56e79c73ce5943aa9ac13956ac970d26a6bbad5b34b6f6b41a536686e0aa2167b66e1b9ec494d239e7f4c23893c3dddddd0b67b217e6c8d25936b6f642df70b88c6d83a65c388e64a2bc9dace1b36368378c8d38f305a6052c14be3f71167554da96da26c76d38cad4549de15e4d0be39535238d3b6b488feeeed3dddd7da6c68a3aebb45c4a8601d93f360d9d992c1a314f68c4c05e1d8450d32da174da5a6df540db71c39a355e494aaa1ebcacd4bc40b0836969654dcbb2c24e2b952ef1f0a68289146faa146789d4a982b7b0827979597d2192b9e14d534149719b06c55a28b35aa73e7ea87ee0a42cb57542b116caac562607b6b90c4cab59d60982a21568301625521b2308a9365c4248a035e6896b521abd317675d3e31c80b476b6680c0011cacc8be4a1a4f54bebf65b69b51795691b9752614eb562c5d0a8d1c9b45c366ee078efebe0e5418e0f401a77a7984eea208420631d26e6793ce0082063301f8c061cffd54108355d4d0d1f374d341b1a3a74ec88b9d55a6bab0737acbee17c288fe9ac5a2bf52bd303fae2d163be40b003ce84997b703eb5ff1561bedf6985f92292cd5252079c0ffd221292f55effde8e1d9c0ff73bb00fac6d454547472b0e3fde92250a4d89539c9c8ca852bd4553a2c2b66ddbcbcba669daf6f22f1bb72a3ae2360fab5253b86d8acc9f1951d24e3888a89024ff864f1f3f5435e6074e8a62dafaf183f3a9ff83fb9119d5f35627237187ec24227789a98948bd45465056884864129af1299303db64601a904c27082ac8dde911ec151c13c2c608422ac5365c4248a035c6d522816763b9c09565cb166d8bf2e4279ee8ba9933e7633fcf58348a545c9a8d4271876c1d8f37824912944b320ac520518ade21bfc9484ed1e24a406a1bf934d600b8828484848484346700b0758d991c2c30be6e24713ac618638c918b31c618638c318b31c6e854728c31c618638c31c618635cfd9438206095ea539c8f2a9fd8a8a46ddbe7d2a9990100000153160000200c0a870342914016a681b8b50f14800f638e3e6a643297c9624112c4308882186308218418028c318428c4945155e60467d84e991b9d893ec94aa9402d01e7c58fdaf601d803fc60699d712540198daf49acf35a37ca5914aca039d8a2a7cd2e1908798798d683718ff6b26902db5abf0f9042dab34b4a2697974000feda67b58e346f8b2c295905958f39d92753291ad0f8c9adcc4e90b74da889c27c2a104f525bfb9c25377e179929fcb5f8d158a9c79c7896e03a3c0f93fdfde1c9f43addb7019ee2063a708597d33db8f3810a88d3858bcc61f15caea3e8c96735a3207c4dfbf96f683e39dee7e794ab30ee9cf14fcf6bd0729fb83abdfd4419040522fb937a62a663a979eea17eaf0f28537844a5722217cc31b22380a98e68110aa51ebdba3bc0311da04c6376d267060f899ec06882b2017e40d118a87789c39fe4e02d00e3273dca89c3677121c5b8fbdd87186e2a7ca4ec6b69eeec01b837fcfce4941908966e28063b04031eb03aad8addb9fd4f9145cffa87c488d1d50b2fa347a3d490d749a5b1771d58f44aebb401ad7c451c69dc8848fa342591ed326200d1a1cf69b1a53bd266dc3c6237801186cf6ce14a9917ab44878cad4874eb962f957270d5700a1a2db3c208f124be1ddf4fcd29d44037a638a6508c2ba592e0e956266285889eea707ba81b4d9f52878167187b85fe4afd1f96e39e57972acca1d24107ca0fbb72ca6253bf22267b84ec4c4169280ae5d20a213e8dd8e9c14ca8690c1cd77278beb5b0dacfdd4114522ee125536915bd50e3929064f8c8c1258631585a3d815ec91adb146413fc163286069f4983338ead76148a6da320b3f5041048b430a2ea939c30188444218bfa05f299fa3dbfb6a993e2f548b40416c597ed224e7bb2990e46bf55b2e49b6fba68c0d90a60cdc2f5616f32abd491aed2340e5a89b2eca2997480bb92f55ad2ceedd7be6f83df0f7b1275814dfe88016fd818ab8805c381769000c1605366a6ea2b025eb0e0fa3b4d8cd336c53152e7986c8046f15c39f914469defefd82a631ffe9121a67e5fd2fc3693863caa815454293c51300ce421e571551d2c7827d8744af004c5b69bab94658d6e35d81e7b924e40a2cef0341069efc263080513ba9401dfc2bd5b616a5cb56257b5d094a60cb3ec3b2041040b38a2196e2a685defa877e85812dae127f497a489c47675bcb8e3100e29a00dd043fd4f4863662a532ea16a885812bd49ebd91c0be6abb90b77ce53474495210f3f5cedf9e66f877211e8464af8b40ffd7131a719717755639b566cf2a7ed8e6004ec485dbb69495587a91e943535cafb23b99ddf52b3974a9e324f871382d6a58444b5074675c0b3b273fb5248a24d3ec73ed29a304cc70072ac5e183da8d4b45b01cdb20f641036e643fcf1a0e74a949776a5785fe5f1e7029c1bc07dc6721e538045c45887099921171bd18c54071134af96af8d1bd01563a051232499138c1580f8840c63670269872083370c1698047cec28b79289584280081aab90d4d0a6c1bd3ba04c700316eb5886793a66af641544554c02d1d4dec30eb13d092703a2797e0311e041c3207e9cfbf6d20bceeedfcc160c090e765ed6c0e4543879a4cfb486672010a4370af468c4e45090e5405de95e62922da4edd1b281ef3f055eb0578d220b9de186ce899470f3d30fcc120448f72b0f04d77f82356b92f85d6f3219e29b6630fd8c3809626e7062d3ce2fb8d297c245387ce4443b8e43f4c69e3d52a4f9d9a05566fa8ea64565125863cd4dcd30ccc7eb21b31de03b45b95228f5476be7d6ad96b86517784c900e48d150f068a5cfd92f7e266d8db91262c3f117d842067fdaa06b3e57ea60cd9ab7182a205770e63b8b2b3446c9744e8bf05da34032ae00745c1ac3cdf9113c1d8407870d537c5f83afc22cb9b5b401c1aae9c4e25e942cfe788bb21ae84844b58cd77040d73a6fe42bb2d7b3355b42f8f8e72fb7c83753a82266bd3987e0b3022756f0ddc2c83a8e1951d064cee5059904b156eeb7fc10e0dc5372aa5cae973003fd3114335b162a033a54a6de3e9c00b9f0f8dffdd266890d1b02c7cc4cd95651c5d4b64c2b581967d3b5798229a607afea5b24e0a2d1c3b9a284ece13d346b81f93443a4f9d50bbff798162eed3fb9dfb39cbc40d6dbae8b6f8b6965f24dbeb386b655acc16b463e415cba2db8ad5e05472a8a430659918aa370346c010a9431439e8c97c1b8b68cc37e09d33832caf579f9e9022b0ec06db29ab76ab743d2e2d674a62459d52731afbc958c5c5cbe64e8b5e07f442d82b9a2d01a05768a47c85a52d42230476640484abcd5eb92572d04624e9f79ebce3a2c1914e393fda28d4bab978114bd1a95dd1e95233c2241fbb4ce4d609af4c599d384757a2a5d2d156babb87f74134c1de617b6db5638365b1a7499ff823d72d0d1dc4179f89ae47037f55df58a648a32f991be08d3be33008ff6f22146f081386371626bd9ab28bd6cd18395b69f9e7c3027eac23e49d55c23c69f2446c90c59cdf94d8c14a460b685cefbefb0b8ed55dc45b8d6d60d74e37787cb698ec22ebe58a987a12839975d115285e8931fd368d6e9435f6b3d2b9102c1083563e863092e848d62afdb9e98de7a7c593d092a5994cca51a7597bda4e2bbced1a0eb80f7137f0a20d7dd91add59f8a70b71c25ba112ce6b55d07496dfbfb58afc43b7e45e97db4e3a25ea356ba47955cb893ca8e3887638db2e3ea288098ed43fbdf405d9a7f5442cfeb0d7fa3482103301396cdf8bd6d55744dac625ee83d36a2b9624bedc77eeab67c0344e469e34430ad219a2e699720178e3cd87708e2c803aa6108375f9615efe2a878978286287d6ab70ab96ec33119bade305ce3e203ca45e27a4b2d61a55d9a87a1b2388164681d00fc1ffde7ce237c9b4468eced3c4339663e53a2dddd209bb99b9db966932659f2c127a9432e0c61f44598cf62a7a5dbead3843afbe90080d3c14375e57b1b7e2ff83ba964c08da0b7a985174a89995e82fe712b33a8f6c8d8b604caa8ad5c54d1eef7b7ba382c7985dba1513351d535960e56715cdc4e540e6c38611e42fa5b1231f37acb8b924724592f04dc3f19fe1e2eba0909e5a37d0585889cd2d8233b84c222b52e1d2e9927cabdcc8ebae06cdba7867c9fb6eaae0cbef2e56860a0b87fb8634d7642281cfedd8941928e0cc4f61648d9fbc913898bb4d37c40c8d1a5d9985f4266d03d733a4020a8e49ccd3c782eb9b68257366c1b2456f16b78e74411893441b4a3c8dfde674e89b9528eb895841500ae27785fe654a149d56e9e49b8a54e50e5b15d898c4d1824dc0c8b26a377e36ea0157099f4dc6fe9db50e0257d0a0a3a96bddeccfa27aba109bdc14b7b1c4d1ea296fb54aa20bb33146b7168ba13c43c1c604564b690ed1260db437ef9b86f0bb75e039b59be2f86cd838f0aee8225e328867412a7cc82f5678a73d066b3d608088291ccdb290146416e80f8dbf80f36a31c5a72713bf3fd5b735181eb216b56296df3421b8e397a160925d16ef699b73770bf317c9447a5287ac842b19b0b594da1b63210c8e13a05c023590786d2cf62b0e3145ca110b398426437209487a82f318475fc30266a43c87f78ca67202a684dde3044f3e6d20eb3ae509944a71fe3ab7fbd53aed7c502e952268dd1f6f9a932448a72d18a1f5bf9e56ab7edb04f29fa7172139dee9a848814ca28ce6e124981575e9cfd109802842cd21925dbbb40d773298a872ac4a27338558fe6e10acada7024cf6a8d4b3f0eeb36699e416af9737a9306c61dfdee6d1b48671fc3aa74e50ea16750a79ae5a26f34ee5e7916bddb5455f849c0fbccd13c3817a4d56cf6c0fa4d491c1865e468dd261875a268bd5006dca75d9625c0358172425df5cd97cb0923786a6103ddb3a8ebe310007a66d77beb1df18e2eb094677098b47fbb8584ff47cc6e0fac689bf941d4fa3631ac859e63acaaa8e308ec05d6744361e613800af631eac0404d792972b9f0e31c82ade05b875a813a62171d248db7202a2bea63a42eb1e347b461041b77e0fe68045d92af86d2fe25a2f5c2a5139e8658ab32c18ce1a83dc45ca8c255617ed2c50eed42510512ec418b8290f45fe4c904c0606a12a94e372a9bcf732ac058dc71c36c1818578c50a987c0b643020e843a09c1ee27a9cc772c95df4f2803fdbe7c6752f049934043fbffd97d30bd85dd1789d04c6796de9fd1f9433b1a4788931a13147036e5813574c803573c88e37ad96cab7959da476ed644e396303234f983b733f443cd5b8ecf060472792d877a38072d3d5f11c369ab5207d91ec67e5bd1cf0f6975c18506d7314bd6f569528d9bd05ed89c201e809a11d0f939d249a0339f45ad54484f0895e2cfb5582b5c6530df91e2d73182cce5ede84843d13fd5f1d7b4d41e72ddcff4af44950bad96e47f761c9ac77e5104fe9d34ce6e94ee76af93b41a430a351a85b09e286c12f3a48b79e89d95236727c8113b5eb991a021d043d1ae95023278bf1888b0722f71e1f7823d196044fccf524828f8503de3f0454de6bddbe5cf4b774a88be3bb1463cd8f7db4351c833e886d1b28247f8495bf82c58d626d66fbba1dc665f39d405afcb0b47f25061d8474a50d3eac2cf31f2cce064faf8339d0583e4c17d79a499aa449ec08d64d91e998a80c94704275ab919f68f8436fbca72a8d3c832b39b911bfe88808e34083e46e8b7028114150371fab82d7717d34af581c2f48b30744cc4174cfe15186597834ca14b6dd530e0d41523a0b6c982c4c4ed2787900c4ef1dbc6e9d151571d774116621bb4c8c4f907ec88a17745184568582260dc0fea7011a8bd60b777767f730d68bc130ea0d3f6cd7fe3b8ae7e9ee6a12c57a484eca0c4aae20614c5b0f6775a49c4da5194723b3b468e7743d71951e9c7d11c645a831481770685907962f9a89f6f5aec8c2fd47ee4c8bd1572858d45f78b7c1322b94484269b2ebf89909e7a20677237f6acb9c55f706048afe4147bed5393d01983a6893d939d51a29a41bd041c5b8756dc3386688885fcdb03519938480540f4f5d968032c71a3b670cfc4fef11fac1119ebb1a0c280d84bd1e2efc144f793bb1547999f6e6cb9d9cef76dacdd1bf0f1dec7875814087727cb688f25cdb03ad5fd24b8d582793b5280933803dae24a8482a1c6bbd79c575ba63cee8de9433a6cfc01f64704eec4db5094fb842d3a180f8ade1aa0cc1bca58814b9868ccb2f3bea44a27f3a20efeea67142755085c94c0fb0413f21b9c4b3c0858e6435106bc5eb580b9da58ef88991af47bdd505d984335cb14bcbb0902f5c90931674c7a4e781c8246d5106aa328da01c06c7947a760093d05f914341f0ef30ba799fd2f7f50e17894f3b1ab37a17968e2d6b1ec16692d861bd5ef40b2517f0b154dd7c96baf27018c838806d03ba92d02c5814e7b5aed64ad8592c7e8c462477fd2492959799af3dd7c893ab125ed6add48f7595c7eb8949351c8882cc235e9a03cd4f609df1d4dced884091684023e54809dde1aa3937aa5a2b3828df37f4ab74ee1cea1f6fcc3a64c8340cd0359f78e7cb6967c8e2196fd01a54162dffcfcbd53dc2f84a9c1aadce39efc69edf5fd4b98cff6f12abba34a5fe84f124fc5c86b7c7fb5a07e53d2bb32557b450be99d268f6ec034a92c126f63f3508d8ec55352c8816fe4bb366aa838a6956a6ae2c09547c8834c676abd429dbf0f30ae14c34c69258dd1799cf1e3ae50df3d59b8d6ec275e3a0783ae491f90f20e057280ab727c6ae1fa7f112bb95579adbc69178e66aee313761f98e57cdbb6ce794c85e7c239e289e69412a3216ba2ca5f71654833d8a911aeafbb73d1806dae5b17cf7c41f7c2c5e4de9b87c87eb8267cc2bfdf3be8df99304f4161f1948fe4a00e5d9aed2040c0318a20d57156a65e0435ac5708a7ad688c5a5ea4d3fb07ad9f0fe45cebdc96e7964eeebf351fa067853bdfa2e801c0d04f711ad80ae5e3fc42b93848c4718af2c50b8a3e66c799f81214a1b8d104428e7273c6ebaafd50e7c2569a1927e5a3cca796eedad6acd63908fed30900d32521b1f8c70f9560e2ec5e8c371064061b5101e3de2cddaa2905592ea36cf1fce723e161be97e30ba5c37edf2e2540ae8a4aaf69242322d764a99b4d0a2242610019fde458d1665973b18a60a9ad1bd6c7e7685a84bb6adf501b3d775c7cb7de5cfbb0a3bd52dfa33724cda5a84ff170f59575bc977dfc987fc385d0ba27c8e84a2892a4b56b1870e99bed0985b31b8d20ddd6ac03d2527fda11c5d8793e463ea379c7feb64da1c01522388d3bc1bfb8e7214efecb66461afdb0c9f3e10f6c6478e1d9da1a5d5b42d8d4909cef97dc680b94ebaddcfeac6deff2c50e42c076698638ebdd3ac2329b9449242154c30f39f3b58a2b2e8636cb1f96f9f2c92c62bdd584b22b2f346a4b13e1d25f30d497e6caa6cd5223ca9879d9d509ee91de7652cc51a22a7f6f68dd0265c964b50281e4e84a2cbcd18e8fd371700d5228662256bbe9ff26b66b0c1c68e6f2c25dc7d03514494106e2bbd555d509c2ef17696473390413366d89cd064fa8056efc0f0ab89086c76c6cb36216dffe00d207f95caf7394ae65684e09c717deb2a1eb76cd0eb0e0cb001c170300447446b2026db687989e51d6db7cbd2da8c04f3e991b650768b23d2450b6bd2c071bdb432b435a5a778b649d094cf70617d7455c535d1d7dfbe3f994276fd3ad3de4289105c5907da34993682365c9f1e1137deae4c772624589bde166cfe5aebdec5acd1544b7514b0a5f56ba1d0c74f5ebc9b7015498f9d2be41df21f4d2d2b265db9e40562d1ba0df59d2b14c18a6a7b78f00fe85de666f03c0b7fc5e553efd8eac04364412c3d006170e17cec1d97703a0119d447fbfb8e230d6c71f9ea41ac155039145b5095400f82f6eb3471db58a0d2daa3af945ffb19c0baa292bb89d1e1588aec2443d8b8a046be8f32d8a6251522ffe0ce1ff216443210d0050f0aa1c7a030c867a0db2e909ca85d5c0436400a3061e87955ac34c888c19a8066c9145fe02eb7adc93a382d4223b99d0236b0489e5e732bff8b37d28b8745192156f19eb13bca338c3973005fea942f6756aff2a143d7cb09fa24c9227afac8ed493a83011f40c6012d5a9b5f845092c32f51c85a0c6834f86ca83669f163486ca3dcc2aa087f0f270c2552437a0f3306bf96b21ec73c4a002b414c972b37b296cc37d4e66dc1e1b7dd5b029282c52e48071a0e347c08ae4690c8349dadae6e4d6a1cf0b6c969e56b4ecce1f60162961b9bf5cbb9eca5719f45b95fe91cc2ffbd2701a1c5d5d3ea6a29ecb5979e3ff80f339a9298762625eb04eee7d6967c3332d391fe33e6cdbddac8801366bce19cecb4b2a181d9257611f34b2f834546c5626f24f73f54224093ae43759689083523b663463397ce10d33253e62f2bb82618b7fa38c6f893400d6930efd8cd9c9c2919846660d98a839dec188450cd007a3c100ded1895e8bee4f19d27a3fcf04484d4add140c051fe009f049c3cb8e15771e5bf77455620fd5df94d0f8f3c459463c1ab7fabfc690cf9b766ec581fee763f78a15442b438ac4a92132d4e9e8b0cb35ab74339ac0c34084265fdf8d64f6791b100eb286787dbf719a81f19af2c4e3f65646918527253f376c50532dbab467ed952bdf28275378014f7744ffcf7113494907c3f67e74bc3c6e284a45d5b357d0df0950e1e088b0bebc78eb5da0d2f98a2bd4455a2b1faa603916370edd100b2a5260f69a0b95a9a1733241ccfa5d432b4f058038d56ce40125b736b53bd43af3278437a03be3270bff3614bc34b43bd43af327115a43e756a2c98297554f14d6af1ba7433b449e340da7c33eb02b224935b91d987a10f8d9e7b76ca4c85435a0742d0e699eb60588419614fc05593b13cb98ee90dff5d675e0c40d999d2bc3e0d78b6ac4c5adeb90c6e647d2d1cf86d43914ad868714785eae1ae3780328b0db30926f2dad68a7029e6e329cabff753435ea350a6eaadf6871498f50bcc9e023112743397421d69d1a3ce141ffb22e030b25a9257d166b3d58171475bf8afdbe5e1cf84b61a3f132418a829cebb274282bf92f8a5d1db36165c25d8abfedee3fc45bbb78715246bf5988bca67c0106ae19ba2e5175f4b4c36310abe8a30d2692e4fc946a1120ea8e1bd7148ebca51f78fdd4c22c823c36286d9c1eea5bcdbcfe78e04e0c4e138d4411d31b4520558da33c135c101d933acc88ba8e1c1a118598dafdfc8e4988e96c6c0f86c839d2231fa77e3144bbefe3d074d44c424642930f01823c0ebda0724df845fa1b66182577491a91bb9614d0a40fad050aea93b5d3ef216c9b112d61a50801f650c34811b30177414245d146d4753b280ffa7e5a9da7eba92c061aa533d5da126d04abed40534476dd618e96acbed05e91c81b213ff204a414504635ba6f2e4e2031694dac24dcb88e27c95b6f837185dbf8b29275af891ca97e713d6e3755f6582454c7e47df5a4a8d3ca76eab41d29c272d347abaaa280a41abf82d5aa2aedec4311581b39678035c936013efda69fd9bb958a6d34cf186842a7dc4a5a57ee056f2b3bf9209f6868494da6d4e38f9bfc7b238c941424ef64e34f30d12892e245badc3c2ad17f49483c1a4a8fe615a9d766ac065ff577cf5840a046fb1fdb19e917857599d722d7b56393d385cde1df4bc9e8782214a83692dc6dd851bd9c76325148a27a9a602b6bd4ed4773bd0d0fa66d340c1571dc735531a65eb9849446b7440787541561c63a6f892a6cbf44c0c59a6328ab21446d61ac1dbcad51612e2260a794804fbead34e1b5623f2e44360fe209d4791dcbb3b097011a5b3830f217114a6b4d42372af49a3284682d96e2fb151630540bc48d3a27f2fa336827eb9f363d137a5a88e394297b18dc8b392328becfa13ba12451f38073f1881b0086c1d3384954fb217645487a84679e3e2f1634dd2f56380ec6dac02b3597c656b3d7c683455d4007512ae87f3f2e86e28c2982412f5740d734ac51f64f61aa438ce09a36168e9b54806aa7778db47935f6e7a4c2bc4655b737b07a8be90cc4718348157ed260e86abc3f1c43aa65cc40dcc173eaad45e195e10a31572768dc93253cbcf7003fda3d400fa9896da9adbc08124fcce34e135c12247a96b65de612808bba5e01f403a5ca32fa863a05faec1aab09068910339547c7b74a3b6a5ecc11df6e26c80ca607471c764393f905005e7eb3f4addebc08b0f6ae86163fa37969bb552c93bf5991eb6ef17a58cce042a968e3c52e7c586464b4654363107c6d2aa0f30eaaee4000a13160982c01d2ff2166cd48ac396d6500610e93bd580ce651d781126f0350663b285494662c154abceeb74051aaae7beef4d264b82a33fcebcbaa178b6192301a5b4767b36de2b8d89f3997cd4c292735e87eeba3f4c0a5ffe01b64425f5abdbfb190d5cce8fd9c4b52b389743fea8e025b9003696ff47001c64a4241e0c06a2eea8b9034a7fedf5bd15739a873b3b5fec71b4d57bb5f4e6cf15b940605b42c79f744745bdb3c8ed6fff38bde00e83fbc2200016a2b9f2ff06a690949b42bbf8ccbb15f1df30d79c53dd9e32b36245bbf054900726aa7c8e0988708a39a94b379b4152c3fea5a7dbf092f8c28a30418678a9ca068c13c8079d133fec1c947f260b239af78b3fb321749d59248bf201406d0d90d4e6d40a9f5b2f5ebb6bff24ad3690f58085a6babcb5bded1d901246153abb8c2ac9441752d383700d9943c016bdaa757c18c0e31eb4d286adaf56881ee0438c8832292df4279d1d06e2c8349da7d1776bd61ad108c8ee87f028f775588083c1e81a1b0ad71b1bfe3ecbd60ab2a7e8dd75e9efbc1297d3236158ef92735afd903a7e0267a28ec474d693f9889f13cb73be0a9b857a123744415ef041101e5a89c49ca2db3e8ab71db1011ba4ac2479c3d25f72465c30f6847c01e59c38d128edca5e98c321245dd7248f3934d2ade56152a2f9a0c44edf82745435dc6e5922195e11a03e6ea8b53f0f5f42dd7b5c3247b245ea4c2bb3a4a3eaacbe966322e8e64a88b84f867c3dd580d25c485bde4d04ce4fd29895d42e68ec705ec73a0e43860b014ad814ca3cbffb6570cb509ab5fd24d33005cb06334f55e388e5861e1e16c270f29aeffdf249bbd0dec24addb99303c877a45d16de4ec9c68b7e3ab461a46833b62874b69a923fad2f6ff4917b2f17ad6471710ee1c42dd91e7e09b3006f9586c32dffe4b105ab119de99d91891abe298159ac71650a9100e2e2cd5186f5df1700474fa2d5c18ff1b64b55a5ee628a0fd0f28e1b851b65209702dd3fca5243ccc2051e4414f4626c02c7b768edfb0823522be2defb4b5b4a81103fea4acd53bca6753d40226d37ad598b78a59f885dfc6149a26f0cd95d13e21e95015f8cb58e37522a31d82ea738a766dfad33d88e5efa00c0841084a9718dbced58b56c431177321e7407843875c1eb02879b4674939e4c14e9f3fd97cb5182d06e2324f65208058cd1e55caddcdf2b20ed77b3eb08e5264e223774a75b92972e1d3040a22a21661c410e2662c9459e6184c089830c464c9f1d2119ea5204d597f48248491f6a6eafed264bf0fda5884f0e21a8b2266331e1c4a2b9ef3a5a65bac995175d3f806e01208656af6f6313bf84d76be6ad9db5d0bb21190ac142b7550d964684113acee708d5d818b8315a057b17f328dfcf55d409bfd76da7a8875b8f4d9dcb2df6a0d9982267567c64a104022ab16e3199fcc7a061a8ac2495de49d51463431140579ab28c7b5edfd6439f4e3ca48c7dfb8dcfa868cd75c0b9b93bedab1735e54f8c66be288aba00c5ac18fc14e157bb00f8ac3a90ed396d1923a84f425c236e87bb2668587a7022e102d1593bfdf22f3a2277aa321cd355e6c64ff038a0792cc076877bbb43d0b3edd9d650126e7a670bc0573b996eff39a88efbf69c94af2a80f5ba1e416cd1ddc4d8af059364b5a7849e1c7adaddaf452feb0ff2f068ef6b7e0049f5ba6adca581ccf110af13172b0ade8a460ea679b4cc32f45280e2a8c8f73bedd4295352d3bf7b99a9afd90098a73812b2542350a39837299c51cf849686d7714d42c08e757909d9eaf7028a11a02cee2a54d095e6e58111d94fd4409b24421fa212d97d2f3be6079544bfb706b0411deb49482ddac6241ae78943ebf6f36a7a3ce49ef13c4211cfda6c040d35db0d01efd2ffe6e80dec22b401bca8dff687e0f0fe874a25d4821e3d40e5fa69c44ec5d7450c2922a1e9e5df3b47c51ba24a86f178efdf21fd9accb1991cdf898508508178e69ce6f78229d99846705944fbcde97e0d03f13f73d45b419e07c71439c8b845ff5ed763e0b0a21e8137a728016b4c3fe89ef3955a86c021e42fa32937127afbfe9a3037fdb043f5f4a5bd1b93f56350b8d18ff562f68064238db0ff45a10c0f45274a201dde31ea93401a6548aed12fabc914273a9307d508968bc915afeaae8a1428b30d2cf15c3c1649d232ae2e0dce170c4ec4bab06d3de2be8a267a1276336b4c8fef202caee778d88217b83ed83054855f788b2d473e1403b434c8ccdd9166e0b039f08f8ceb19d5e4b0005d2ba5266eec0e66d911fd1e90c41c6b3adb9fb36d09c464f0f6fe993547fd349418271ba32c3bf59f113f9be037351e5838a933f76db034935311d27db0456159cffeb1b79300dc393f636533a1ad3525ac362444b1ee5d8870f1168726c9c3e01582c2bc9d3d804935c0c61f0cff9f48a1cf9142a0ee05c954372dd34a42420e7d782ffa322a44ed734bee4624a6751d095c348883bf8a0179eb2bca74f58d3772eeb628754f77baf99e08d4b3017d7e2d0185895e0bbf91070b4b065565adb4182e77a8a84e2496fc7d3118649cc27bb2a6c7dee4e2314a816ee04a712b64aa34d6cadf35b92fbcb0df5dfebd24e38026554630d237ee0c03146b1a722f1c23d1ba0b2ddd7631902a4e2ae2f8119ab70584e3569167ff8ae94eb015422c1298ec86813637a6fc202657deb3151074e80c3dfb7f95e96b13bc32c4a8bf994473e8661f465b3f51dd946648d30ebff5df8247bbe4e8a35497ba106e99f722199e70c5e0e8465dd53fac115a4c3f9d6afb0363628c4e81b9b935c4a746d27ba6a61b93894e62181edbb2dd7626bbd5f874db7a00dd78082239d62f0e4870016119487b62d14195a7b6badffe74639b678939957cf4f02f97c94f759ff8cb2f81d5f6441d13e9fef0920f680e927a51e5ac3549a479b5a26a762cf998460c202f0397b6daff238a33ee2af60d855b70d74949043ccb1648aefd799aea074948e144fbe96221552857d828522671d619d8caf624a02f5371b25ea392cf19cede80dbf78499fe39786413b374894feeddd3159f44992f871c680352ad87b37e6957bb803331382f3423bf70d97026a75c26142b9aeb31f3533e3182cd9b4f9917315307def6587a7fd3dc4211d68f3c4142d37c169ed3bdb91e9cde6f8625e4f42e109bfe5c3b778dfa1985c0f50a58ab9b93eb5482262cda7fd6edb9543d2207a7f516d06f93ee5a43449ce58901ce19ef7264c46cfaa9d5c3dab3ee59f915f07b75e73711bfa4c4920acd190495c1d00a836f5046dc72697f735e20f95ebd87401c5b9c673a0db6cd30d2e184dd1065921403b3af58fa6faa8379a7b3bfe7d93f35691c3040100c080a55e583e1bb5d6b4818116884a8cd244c9145f39c67a20511d6a42d612dc14ed90936a8d3f612a8fa7798e45328431f92f0901ef124944cced7f6c6d2e2857d1964074036f57705af4e57e7883ce8f328f336f27dfc9d2fb29543cd15d71898c21690479dd1d1d26b0741e3a4fd530f8acb28818f4fcd3734600f6f58a5fb282fb92bf67e6041a6df168d85c890ea2444840b0519aee2777caa9529f3b9d64dcbecff025a005531f4e6657f6ee9019bf689df6045c35c5c06e8d62c28206e17d74e61121d6729b027352e79db8a462336a2d79c46e258e6a2ccec15120d055c5e39122b128afadb3090b03e552798049f8c11c3f747245f7f9098cfc7b533b81d2ef94f19ff744feebc8ebd020997514c5614b9b5d2ec49c2287507aa781f9e8c9f419f47545b2ee7e4ca00e629f7e823d9021eaa8aaa543e179d278d2231324f28a807f7131e892f4048de28ab8a8ce9382c40e4bd631df9914e34e56c16240057088225d5b551b5a202bf57b4043d38e6b093ab7fb422ab21efe3e1bb280adc6679d3cc6cdf49409387a1dd772d04dc4843a894b12b58422040d46cde31892495157fa1cf1b4dbd33e06232a991ec46ad8d3ef9d1b92bfa36f649ce38e95834bd22388c56139eadb5e7aa1e24bef2ce9726601067ae142817bb1efd4620a206f3f2a4d1b747774b828ee00fc13c2310b05c886f9583dfa0e139385d111710bd8fbf7ee25eab516c668bee9f4f1291dbd0f45bca505e0e4434d02aaa7e2f9966dd85c3f254c291f3c679900d0b9f72107cd64cae9eea8547ad54f56df8fd45cc9380d23094d8fcc44927dac7b14144f72251c06371551cd5cb7d751919ede3432b5962f1d6f7e38f182b11bfb3aa8fc457f5011066bb3e5cec9e2e247d956ff857d2d607c78f7d8999f730005b3ddcc692a8aa90cfe68fd962bf74825a5743687b6eb228dac8bb7065a71d7d46e7252a4b61217798af1d7fc13b07a5521731400e94afe64184278d51deda61e7281aa5f898f42ed9aec0a6bf658133307f404ad896cbb2618d88d224be25e8a7ed499b90a7ed2003b4577c91dc0e2756dd132bc753ab087fe39894464c4976151d3c03f27e10c44c88c028b1f1015453a7bcfb282d93884f67cb28e5994daad2210fb5666d78b1a55f133e90a27d44b1a00a4b29e6396bce92050e4fced8751195fd385c726823314986cc572aa034e94510698fa6562ba1170105c70f7ad103987434ca45e9d127c87686933f7c00604dcf6e6a8a3f0d7679b316429b2d3ad074d65957c33c8f1cadbbbcb7c84e835d9f86c244c14c549ff9c86038b2eb65194a66d0d0b2fb750f42b6bf8e8bc7a331473b177ae74f3a868adc8babfa800971e4961177ed75448a5a7032fea197ec832839e8da4e02f4049752c84830619e9f0ae38e51c63a0794efad4863534a32ae3d584d40e90da2d8a7028e24290c26505d02a63a6dcde0a9022fc914db9d02146a753da9318175c1c42e4c38d475c03404fab8c262ecba2ad7a4359eaa6b32a86bd94acedbc61e96fd7c2507dde3bc44327362c7f5cd4c4bc23fe2ce197412c85c7ba4111f2cd2e6b446cf66693bed3f83738824373317634683b5cadb3e3f583aec2170cb2100661f0f7cd4bdb1b90544284e4845e9e999d557ec1345c3b9d58b522cd6599d870ed5a4c41b2dc71ccb9eb96081f24f03e92ad323dcab57bb2e70e9471d1c323bd2f89a9a5b0eec4a99b084f869015e22b423aa136b22a65a61e6a95bb17ad80856143e1e28349c7a0bc9da9c466e04ab6075d9c139e58ca7867a343ab9c0bc7645c80f4e3fe28b39883c69200b5902f04b50125e919c67d2c2010296b39acf17ee944fad6c4bbbc68a3d08514bf0ef4a20f70bdab537fa7834726d25f1ee379e8830c351d5a0c9b2946b9b9d7c9ed031e3d3cd9d79b49e75f23ac5d3da414262c2192bb0ced21f6456d63e5022af65a9fd22e88d98990acf1f21f4d66a0ba6ee945654bc34a18119d0a84789bc93f2bbd7086e06856bc704fcb887c280870e429a4c8f23f0b86352dbc01d35190ed22fe2a8317827c5c09a0115032ac651fbdcc899b4fcb46072fea4804d2a09d2644399933256728e479c189ceef71a562597a31b60f8027b549c6e18a88cd55c7a12dc89a37360e293b908108b0653cb3660bc4548d1f8651c6fa5ab13adbee233f0c79e8340d3e151e1c86da7744a1005533d1bc92fdb9da744837c0180ad0024001ba38d07b1efe5f2e03a4b0e0efccc035a82373110d9aa4bb93e3d42845538140acd9321678422f2c760da82b4a84475593d826dfc8005c22bf0c922f28d8808b738a472090d41280e8ad3b2ceb111809d7dd9a7ec43d580017c61721e4972ba8a82f88074674c468a81b0ffadc0dcb38f3737d7dfd41ad8f91b6103de804b22ff513294b2414cceb3bec599329db5c34ee615d22511ba4786120b454bb7cf4653fb7bf7609f6c9bcaca1ca77cf4f89b044e2f95bccd9f811d6082477b9848107caba3157e693a037741d728581ae97ec7ff59c1937b50b7f04a8d2cc62eb4ed6729ea7fac5cb46df3f9aba257057eb815392353f272bd9bcd896da6ee26f6c17a1be75e2edb6cf65ad61dd334bb723ec93f58b0388b256da73f51f08c8ddf10d6e13a65ff7e58777add4f9514d8c988e3f38527f70a271cd154ac60d233f5069aec6a1ad0cb72a64999c64c1415e1ba5ab417bd0519b2cbc605f18c088d3c0c408f39d4f9122ab5fa4aac90c9dd085d925a970f184ebd1673770044a406020f0e17fda2bbd3833dd234069994bb1fb60431dc622d3485dc63517812b8a2652c53242d537859f9e41f806c1ec7ff3e051231ba7268095226cb1ee8d2578e21a23c85c417685590ea75a001b0abfd8b353710c3552158fe8f559d885ddc207214344b9e57b6a3ea925926b4b8f2a899924a312b926ad5f87745dc48fe859723448149b223d29ecacfa4747eb3020fb2663cc26a2c5e614706614e3ca51424f6d305f7a86e283f2a99e0c8fd57eb6895887db1547d44e94c20b33b01c48b6c359025234766b951772c29697238026039ac19e602bbfa8b64bd55d53af00f71b60222baea1932350aea7145fb0b363ffcfa62a87d8457672b838b9019727101566b15a81e8f0c0081048126968643729615277689ee17aa8044d0df0ca842700f07c61b998db27c512d190c627ee0c8d7a1c436e93916e61423bf2634246ca8cf45d125ba29ab01a512355ba5c891f926105ac43824ce173cc7c9fe858fa31e3a5fa3b91c7ceda877c75d1acabfe6ae466a68b8b92cfd1fd737d6d553d2511f92078b0dfee0ce54a6a2c82459ed642c662dd5691fbdc7d0eb62b494664582a6b5ab8e75c4407950e82a426b92dec2403fc132e307c7c29b299b0ed7cb80737aed073205ab8c3ca3145b7e8e1d9d3e5b11f5b0c63e43c6df07e28724242311a86864eeab032737c0560889b881f177720801d13f476806a3dbf1ba51d76169338a7a3bf8287e0f2099aff69e05846193f8839dfe4bb284139f039124752fb17989c3bcf920f14edd1824d3fc928b041b6b170476624e3cb1b61c99d7578265f55a2b08476d2536ea5a67938db2786347c65a078dbebf1b821ce900cc7cf81d8c5f208a303da28624cac09585871bbcbef0dfb13f3726e1b31b1b96fdf6039d36448b26404ac9d23fdc7af3a1d9cded1645ec3c1a36db9be22ab65c9075940bc0489da3aae70da84b4c56c86a0fc967b447c175e258c6d3048464112fd054c684c2bcc095041a8eee1fba63b4c211efb3713f75e80a9af235294e0e11c1cc5eee563318d439dedd801e08aeff350fc1a76c1a2ac3ee43ce86bc9acd60c772f69ee75c82b79c240e41055661a8bd0858b9545e907e97afa523fc2eab5a4dc345bf2db68a240e4b34b114b926e85fbe2622e16c938a6966acdd9cf198e5dc925ab148140349927f5073a6c045732c5532baf8e39779db4de2a446f0bce485edcf44a31a04a5d00759df84ab38524e131393dcd1e3e0a2d18711ee62fc41b458f514ccf3af939999dadbf1704ecd7660d5c81cc48b23a9a9329929602413d25b9d9dacc80e7e91bce8943a91be4dae9bcf959e26a2813709ce2fd3955d927a66b26cf4568e2464b11f59f59e70707e11f7d7e730cd0679a2d89c09476d5ecfb8b7e10ea7cbe16a858fac702fece6d0b8de702dcbe97fd8f986347173b8890b276b1e74a00bfba74fa5f37499ecd290f8b250bb5992476e5cdc10e2164c56df092089eb06dabbd4fa0fa4cc030820d1c1c5ab509b3a4879d2a650b4691744e95328e20910dde2601d1f1027886133476b2fa2fa4d32516c17367ce6a7beb7940c1437dfa7bd29f9d78a6f6bdb673531c3908c087d1dfda290ca21bd87949321b6d56d7fb16c848ebe1ca713ceff432a3e1e72c7818530b8c4bfd02ec02b4f472245b74070ad10ae56253680d405b9f6acce5fb8eaf7591ee7eda49d29d65b8bd3542635406d16244d0a41da2b4dd3596844b5bd5b095d955e1c26cb1d37b69ff5ed8faaaaeb1db952972ddd9ed19522896eaa9e7f9da9fd4f13d25bdef5f78530bf6f2dbe1eca4e86a277f0e391952d62518c2711b960e582461758040c6ae30a6b2d45564fe2d47ad0b0cfc6fb434ce461a290c5414f902295088a9c252a5dcc5fb9e41403b6d96ff1b036302ce49eac1af11253e846789bc6dbc834791a18912e068297620fde9791000aefd446aa9a2f7e35427b540dc7007b696bc09eb18985d4c758c32d830b1e83aa8da46aa48df362873ab3742901e30759cf2bd23a5f87b8c96dd1bd875cb0064528bb47029f6e5d79622f5758fbcb50842a5dbaa5109383994b8592f22cb8399d4502029aa5203930aca8a2dc32c6650d40f2aeefd843c73aa3d9eb6db1054f234fb3d84795ff242c4ef376da851339fcc476e6dc39356527ab5303338531274f2ff603288c83629e6afd8be517ce95fb812f5993109d5e2b910974cc0b3b78b5edba501276a9c8ad17e6bc727a22dfaf6c45a10f277d95cb554398a0e93c5a235856d4af34338156c9bb098e22d4bb53036531f9d0bb931956b40a8c801379c5083961f08d1677b05800a06cc5fcf0458d8991942006226bbdc572daee19790b71f67b7aebc4fe714626edde31860b15f5f81869b9785c210b807f84d9b267eddd87a4051caffd98ab4f0c33c8062236ce76f130d454ac5d6fe5db576f49f715b89dd0668ed2c941211a677146f4c9507ea05ee7f741664498703cb3a0bf19249f09d33d51269de31f6d61ba225d02a1879110656e6badafa4772cf326c4a01f1b2934607efa5504f81c45cd66c15b31f0eb8bcec70af75757839fd5b886418cf899849410ca705a2b56dedbd6522bec4a70f6d80088c2eb834ba44a5fa4df2fc1630ed56da83271fbd111e8ab17c15fe49f622f408a4b13e2804eddeb0a3c4167cb57b155acc48948755abf0af4dd2172f0bfcb8bf992e3724c1fe65213fa4ae25499d81c2151652ce08a4b1e2e2ff083655384acdb1262b5a14b73a0d9e6b7ed3d8e63963c67b525535e00b6776ef7d8ab20b6168444db75fbc3443df24d94aec6bbacc3a093535bd033fe7c59b24917be69eee827bdbfedceebd461ab5cc6fe14ee2d3cd9e54ce8ce19f7c73b9f3a21a7712b441eaa002cea5b9ca8f5cb35ab635fa265e9996344dfae4f4d85d1302917b7d998272fef64552637c410b05ee84354ba60b095336c26cf6bc1bd65aef0887b92dfcc986d5e023b7baa820c26ad449bb4c756305e849d541fc3be7b5ff9258fbfc975ef538f2a96b2a9f1c1aca66d99a8bd6d38fb017ab6d88bbe4be940c528566deec01e29304c7c52779448be3325a6656f9c02f05181ae86ca7fc72c9d7c4372e336598fcec53e637055ba62efb4085e0cf43e9a4ddd76b6279051b8af55ee69064ce5f4ecb185f363c63053872681a4507742a71d00c2d9d1225af45c8a6f640d872ef0067a2c85a7e0d160e13561d339053ec704bb454db2f0bf42d7fde31c5f47a281a3139b3c13487a6ca13928840e36c8813019b1040e75d3b7eb79377a348732f3ad459a5680caac4cf8ba45961a02b006760b53eb0542cdf3a94e026b17619e95c076abb766ccce476ce22b93dfd151e301c8db134b96e47499420268db1ae30be310fe90e32764092c8d485f9169bc2d162e3928781b8614fe29fef0e8b636f6f8244e4a543078dfd4141144fc80cf86d2f2f468cefbddbc2d8de5c49d70368a4ba373be84b7fde463a99e85f1afab3aa3bb5bd36803bca40e92f45dab94c7d59ee438e32b92ac8db7b29c8c4ab49b2bcdb0ca2f878c7388fe7a4af65c4cf357d409d4fa0ec56c138ef5a6ed87180b3c429c50ea2f7987183de740a40999502e1019db1fd2766c21fabe152e2f089be0f16972761d52bf0d2c2ef456eb6d6d49162b8e4375323992a33e4e87017c1ef17061760a0e4b2c12d2301e1abb90d39cfa4342c2b4522a2bd03936eddd6f47c94062a0aa7fc2455806f1adf8f2599f081f498c852e3b63f2a7604d29bc8644d531427b38a2366d4572b28ef9dea2bf0b73bf73fb12ca7a3c8bcb9d3d100df8e2a6b26bc0c247664c82af7a87d93cf5b911a9690d4c91f75997d56180fcea6b7aed4d0eb7d4ed5ed8170aff9ee587829e254b26e2c98b2625711cc746dd005ddcae91116b19e234306ab1449b18bbe69dd94bebc288a0e0035709896fae66e255b85352b16ce340195d7a84fa55429b641a952288fe6d863e9280bf93c0f89b1373637b58f40ae6aadeaf66bbc766b1966689b74cdbe84031cc235abb91360490cd48fb04892d7e2f332e7336ec53f298185e410656f10bba552d85348a07b7c6d5581b7534513c1136175f94c3bd2c8c5f254853385059518007d3efc49699ce9ef4babb36fba0c57241813594c3d5151622d3c87424a64efcfeb5bf2ccd4851410d11af3f4fbcfaaa540fe262eb36b49b473cffb0582cc5d8e76c588e0a0b6670b97553453992129f27ee7401ad85ceae31691d1d7c4ce3492964a5ff587cf927400a433c122de947dfd1bbc98ad0d8f0d490ac48452d5c82be079cca27d8352d2898a7d513fc9d1af36774b9b2782f2c1e270a3a3e9256b3d59e31159149b3b7eab0e9985ce782f178e6ece47209f3d51166c4747cbaff4aba9635077452e59c795787a68f5f4c675fbcd30d306803fcd04d5842027ee39c94e18d822e997497612fc5e180ef193cfc4c77d1cca46d101460db53f4199545bbcf86699b07ff83b56f9fd2adfa7a1a29fb4d884a92c8bb9b79f6ae129eea8fb3e3b6ec08b42e9e5b3b982d70797ef19bd27a813447291ccfcd3b49f087aafa655a26e926fe770a457a2238a5356bccc5834b69f9e6f5052fa44c122bb70f453052b39b13553440dc454e4474c608dd0a72d24feb7549c87c37896771d81cd612c0a7fa462f126f2f5fe87cefc9440633b8113ddb76e8b049ce32d0b93354388f142526b4ea35bac60a43f8171b628af1808e4243817e51a489bb349d886c05176b0529eba3b2a2aed4815b1f39fbf8e91e8f5ea8ccf7f773ab22fde5c1ab7be3fda99a4e1e2b2d2390a35b00ec37d036324c0012e090ef1b7235fd962e750a2ab278e8e04f82f3ac169fd4982cc5fdaf0c11bcbf043ed3bea06e25fc5b1e4e04ec88ffcbc22c5537cd59b382f8654d2b8a98d1ac3f9856e0c466797fab0afaa009b2014e30de329c2727ee21bdc5491a0c17b07022aa3f198a11ad40b2838b2bee30970e5d783ab4af245bdc38df4d8676865ad84e9f551f5015685abc6fa4696719c15c518c24b5c1ba28274a81c2a4d07b011c0811e73e4be719b1421cabd6f5cabd4f77b1c1de5d84204b2b94250ab1463ba5fbb8448e1a09901d8914680225a727bd9cb4118d54fbc93d5e014ef5a9570f4f57c83f25fa23558ed53e3e94b5df8a29311f4010eae7e1a4ed5e6a041c24a73f25d3dd18e852d53ff373f85cd824f203b871bb85b8877697fcf979e049f9eb329f36058088a93a1552ae1e092da48ec9210027844e88fc28c7973b2ba89c65fd79d0d9d0c8d45c531b7ac08c7bbbd45a5dd0db86deb67a84609037cbef7c7448f427c9d4ea4d7f809e97e12de4b19c01a45f75bed8a2d3556aea1d97293a78301496da57b41d4d50c15e176c1c35dac4c774e1873b59b151290507c327b8edb40124b670b1a5c310f65bcdd14c2f79d7c4708c060db542165e50ca69a614d86857643b3e614c6da1e28098877ea402a4dda133e7a201951757ac83f16868f52bb64436cc0b1dd69e65748347dc625a76387d6519de7f7d2569bce115905ccae7b7408c92a6d6162a97c509e2e280caf7699fc466822c0311ae1b91a7c04a41077a2b725c89c4b805e40aaca6986120073812a0e211ff43f92e85aa7c952ffa7add42985486eb1f9702e402e3a761dc74f406ac74f42477bfbdbca6174ff36c776b09c810104393476d5cb9f910690bd1d33c338fd6838d2978d41989cd207884411c8235c36434611c30cd0dd7cc1b453c1fcdfb265771b7045aab2b4bbbe8114fa9c321713e8dc0c1822e6129e1ab49084935e3a42d130d4f8fb0f33b3bf90ad8ac38797f02d975369ff97262773c7cb3e0ab98e7a02eb30521de1b402a56c4106ebecd18c993228aca6358cbac4c573787caf977e3ede9767c05c9f97570678372b395a5202c0a3e6fb0c7134966206ae5b8ee56cdf838aa5298f194f6cf250816e19a23e580089b7b8d5fff3866a39ad33e74d02731b82a2a248b32c3dbf3822c01d64219ba9a408888859b6174beedc62517138e14cb3868acbdc79d8d1101b79a21bc6c6002285cca7f62b1df7abf14e20a3a0a1740100ffbc4a12fe1da8dd544e90d0e03d54866af0e79c6140dbba6d0b1cdda473ab2c59edebf8b6b4484d0314b50d4f6f6904c97d965dca34f2838cb5ab045b24c070f0bd3e4bd8770825ce049d77f491c4f7b1d68d8e4e991400f1b9e44531dccc0581b8a5be7033a1c2bf83ecbe495b1ab7d02e6297c71acff7e1747a0241f2c15b6a84324b5174e7c9736c462e1f7c41e641ec91907124b550a187b240bb45f129111aa65bd0112b2be3b81dff61dc8ab40335a4573a7173da5b3e45fa14c4f424a54664eb1f316305522936612d23c043e61623c08f875bb5ec834a5affcc1acfa050ef27329b19b69174bfe178817d5f0a4b903f3e30c9e93e291281398fa42bcddc61e572d67fcbe92c938a441801cb4338db9125583ade18742620d3ad0c0042a09de8f0ee06dafb2ed657d567da1844b3337c38e6e272019535fd6aae8f202a810f704ab67562bf701b74dcc851ad11150094e9c7ad75a0d8025b576e33e5e79f8c9b1f47522a5784b5be43a3745b10eafc18234482dd94eee176fd6fff2ea9764d0f3eae95851ceb1c17cc85399dc78094f8aba8193ad1e8025771ec020ec31c8d4426237d83b54ade64a91b52d2d35475edee1d55d51bb77ec2fcc10259cb61e8d681c40229b0d85d0ff978dce5be0a3796be333cdd3e6f7481cf5ebdba3cb68a9319129401cec509d64d52b2353bdb857e5a3c43fa4a343b0504d8635b15880b41dcf81081d00b921b280c5eed5172480d98468eae3023ad8ff45c45ddd1498ee517b1d914ad1da39e48208a59a4c39113d4b1b15b463d55fb5d9fe9853bb38376b5f3e3c02bb7cd10607c0a8166016a7e9408f728f4dc21132298af41fbd9407db3d2de8248fd67a35f37fdd90fb14967bebf9948784947010684f4b9251d60a876c1c7e47f4261a174ad0ba0a07ab33b7fa0e3d612876c13947e6370dc0aa43dd7d7adfab358aa4f0c4bf4a92f9c140b6104faa3dc1975bb710c85e97e6cd11eecbbc3a40650efac0ddb0225a81fe0e7f495ae5645fc498f841ff2916526727f76c2d7fdeb16c649ad53909e5f228c1a10afb75f4359f03c39c236233844a584c57da66764d5d75d02957e1ba432d9f32a33bcd4e478570b87dbf903539d32a731a742780b241bcbc13826f7e3886a56afdeaa589d239a9a392d22136a460a01e065f352d218c4bcd24236ce9c0c80da743664f10997d3ac50f11e05c7b971da2629d9ed3de0affeaa87f990b2abe0fb327be082cf518e3d25016e4432c6a80a2d17ee748d650970bb9aa699f05b358dfa023123f18e0013e20c9c7ebc20f5e98de5106045a8868819e72da4fc004099542a08ffd11063b4d3eb8180733335433375622c694f1b23b6e55ccc519ab4fb7a5eeae174758134ec8c7f725b11ea2af0bc65440298f584c60dd4a33d61503a0a1432ef86b4237769bdf0bb30c72ca6535684d254beb040055d0b6cd8b634d8f43de54bfbf5522eca1b6d0308e6bc17affe308d6c6dd15e2196279c4dcbca46387f7bd85f662042bc22d434201d0dfcf01ddbf724abafbc02666c19d670a7bfb1cfd43bb4b1ac3ce642c8694c205e4e41865843c58c4743a89a7538d0fea2aea2f6d7795498f339f8e9e5149cbbc7d4792ce5b3563bdf5e2372f4e27e112e3ebeef957aa0f5b515839cebbec3fc37945ee7ef9a3e24e263cdef0c46e677f0e652ac2e99c2a4fac1b17a7301a6fe4a3fa2a2158d23a94d7cf57faa3cd41ad248e22a1c99417d4d873e4f952178ad3a0fd6b91f5ae870f93f0c0ee6426fcb839cd1cddb2c4e4b92bd25d5866dc50522e38440d1334977916d7410c36ee5778774ce1c914e9fa7d0fcb07152d7d40a8e1eb5ab0c72fb2f340bbec498b44595e4cfe10661a583ac401349fe9c210230bc5d4ccecd631952965ea892bf72560e7525876084f6df3ea45b3dd1067ce6ebcb3aca6c0b61f817c92383688e3b95f2a23e24ee2cfad4cafb066a8009dc9542c15b265a3c08566b1c59088faa0340e150d40a69efa16969fc52151b847bba3fd74278d40e0f7ea1402093d10400a81e0bf2f164d2767c2c07b3590f9413b256ff988ecef871c34e01a65c92abd60935922cd38fa417173142d6cd9099c11928e3adb5e888fef6b303cad48a6b2cb187afc4798aba06708b01c3c356bfddd6003513ee38747329dea8e18c3e144cce9ca70a9d1f148d89cf9930be0f11beae664a7776e2273bb02ef3d1a376252c2e40a9bd5885c50620593a8ec0e6fdfb841d0ece77f309f20ce19992210cbcf4a1ce74773aea973c6d3ce404d76b0750dca0e24f28792f63ab084f006a97d4742390cc0a8f00949cf54619310dc2dbdd1280a2626975b32caf4e925c55e49f161583df94066dfab250ff2c621619352945c9070fa87ad121239aa8079efab1931b23a70660ec723a8719601942d126c5d04713fd75898495275d066b8932576cf2bedb1ccf190e7de2028b49dfc34b51ae2fd9ef9180d142812aae7724bd17daadb3d165a2ef0ee648f80c08ccf12dfa2bad3ca1463ed74efbd380e6b6249e00d3313814e0ce08aa5be795b94835223b61143d4ed95f22a9047c9083175c5cec5e9d5c4ef38b534d8728cb9f9fef2afff739f7fd4f771f06f87f33a9c17a992f650ddc7dce54b8f895a240391336483c43a360c41a8899a1f18eea9db60bfbf4186fcbfbc4edccc1adcf32b70aaa6e4db89246de711d0839294f078a27d59c061702dcf55525b5f7ddc6b2c59cb610d3ee735cde699a50b127216b62d620560297a02419c3d32444fba6ccbf41b86695626f14316a5de0eed9df31e4f564b7b0cc525c675bfa1dfc6ae789d229057a7dc03610d980117d1a8464f382e9f4dead04a06de0657d2a5078dee37586658f3d34dd930952defcc6d68ca06ec5c411034da686688f85e1c1556e7e449f0fd7b82a73e4bafee0077086af23c7b2cb70cd855d8113c909fc829940e5b01703d0d631aa590e04896c27dd9d56d18d80c949dcce2f8cf663404fab26f8538eb92eecad169d0b3fa91827eb5db8e1497a9a46eb505bcc41c9d20cb6072d64ce4e262008169a824287718bf1190629abfb3e75f3d0ea31e852b84743f4eb43ca1f1b9b7f92bc50891824c4c0f54c97dfc6614f1e40ed2160efb886f51dcf74af150363afa248bba889e2998e5eab50c403866f9b5ad2783bd5f7ac239acea1c9806e674569880afe532eb875eca57caba3736e0ed19b0cb086d49cadc02f2294d91fdbdf609115808732a3f811ab2d537d9f572393144cfd52101518cd435d1ad5205f7d6f7f04071c9ede396c9c6a963d28be9548be54694bb6c133a26e5574ad15c16eb124a9266a54e675b79346900e5a5bb40852f73768987463b75700eb140efb8ef131f2b8e3da3234aa7275289b5f376d45a472f70e1ea816c8eac45600c30379ebc6b017389b486706e6f371a0d1df94498d26f0de084c6db9397692f684cfabdb941d172ff7740f9f830131f7657187b504e5a20830667499623dfb6bf97fac5eadef9c2fa77dfcd10f3706544e7f4b76713e3528e999590f65802bbe1d115b0d5b688de01c486ea91337c89bc9a61eba7344213c2dcd225604ea21fb68981129b355132af2506f5c289206dd102bd13ffe39c91a3a00dbe61d08f3f0205905a7b355b6e9e530e27681dface3ec587b44311e017046c73114d3998c2d89400b6d522167fea76afb1404982c2b9be29e2b448319d28637d258c7a8bd89af6cfad31532c0a1b3ad50e7c336b6865e0da897045461c31d38b849b9cdfc815253eb4c5a6f96d8f486452400e023331e5acd81b79d304aacbfe25fbdb24d57267c1992a7177422573788bd6d468b10fb21f79da34ef74ff0ba98f0d8faa342ede8fb468717064112208bb73a116d1762715392aae1d916e092364ab1850e5285ef26546f0006e9b29d5d283794ad9ed567767b8cf9386a447bf166e389934d0789689f24a55d1c71b6e4b36917ccfe8d97bd18b2cc165a1e1e1ba800083b08caa4b7ed31f0f523a9d593794f25c8b300461f8848b78cacd37cdba52941d40ab430baa6e4e2461e66fa8ab84524a3eaa2238b3f2a4603e5c96b266084410f3c7d8c5fe8a89e47ab261a5aba240177a9e6b53200ba3598cff5820202fcfcb951110af13c5f3de33741fc1d7fccd62be7b9556f42e15ebc448ae8227f57200dac6b57d6af3d56cac362b2bcd03791f222478fce280cb6af84d114ba3be08ba19e464ad33d741f0ea943e0140d84ae33f650b1702d5d49aed42d39e350dcf367738ac063b2d0d35cdb2c3d426041297272bdaf240e15d6ffe8ebff2129d5cff0152a391c31821ded72b168a6eefe50bf0355696d8a82dd079ee0a5db629d67006ecf0a088337c60c69b45172caa130c6b82a83922feec0407fc0e846459e489440bbe1edb44b72ff7dcfb9027eefeb81df9d98ef82df66c2c6d7e9baeb54d34372fd8242c4005f77e0e7d1d3559bcf02deb4f389e9eb2eeceab551695e4c78f9c93e4246a01fdd5d1b28eb50b2f449cee1754287e2d10811cc9b26e60c6f4b1ed83fb879854557256104ef89f60ffa26ae06281276947e0f1a956f3b7d6471d4a0100247903106587e71f67ed090ce700470ef9a0e06d159420a48f64fff0d23e50b8c712916d560da404e780fe890f97a4bee1b7cb7ad97b7c7d2e1c66d2c854e3208057063dca7b18b15b4d3f1bffaf4740f04eaf2babf49baab41849b2df12ad94b7d626b62839d16863bd88c649eb8be0a056663937fd053602e1ae4d203ba98b6855a30d0b24a07c3b194cfc196c5ee3376757be5c44d44d5cf1a416a42d67615ff396c439ba690afb41e33a06e15147d8f777800423550eab25a262292b4011438036efd2b26d020f7afb6ea449e8a6d6b9290bde5de724b29534a32440818087e084830b43db0b0fcf0721417667935b9b19d8ab2c8e0e5f237162d3b46b6368f1bd819bb6517046fc464200ac738d63bf0bba82836b99130b9902573635702fc4f4229c49072214b5ef6206cb9d745dde22847dd82d7e6c22c426297bb2e029007fcf6582821deee6f1f30873fc6c84ca2641a5362d315a818834f356fe3c5c31a083bd63c106a8b34a2b8bd5c76d8e587de5dd43b353a5747ad0197fb713a3dba63ce5363ccc307f469af86c7dcc18991a2d531bfe13fc3d6f41fe07e07b8fe8cc4c8553d7813938128405c9f8ded68a898132331721de0f21444f783586eee079d8c42a88272504a292194ace851cfaeaa58f80168c2c20f22c2420f0eb11f0deb18c01816fea7e3d2f65c428aa8d0e64b115dff1afbc2e8b1079dbc61ce4e0ff323bef1a7f40816a933f98d437726278fafebf405b39f1f11e131fe9945ce74e4dbeee74cd7a7d115fea150f308f4a15ec09ca569b429f9cdf604bc61e21cfe5f05e38bd7c28aeb4c33f1a351655cffeaebfa7fddd2750ac53f1b0e600e2fa0cf1606e6f87b1a04e8c17e5b1ad77f53a2d4dad5eaff6b6d4ad7df87803b2c80fe04f25426bf71fea1519cc3df6bd3ea9bb99f1f1d5dffca5ae00db3159883992bd3f52b638c10b3fc7fe185339b958946d5a61aa371269947d3681a5dcf3e8a526b57abd8511d55e57eec8588eb9fb138c658da9522eaae801f24847dfe16bf5dcdc0ea8ca0429b30167edde162959e39d69c305f7b2d63d59c90bdf61a4cc5c06eb557c3034ab143548d0568f6f4a1abc602db6baf41d7d75df797f0a3a5143b443514d759500a1d94ee0a1babc602dcf69c05a60b7628d4cfbc9a13b2a7d9034161db7e7a35274c21fa93f31ac96fbeb09395b158db2ae6a99df85ba999fa29e2a0429b8f22d957907316a5c439b231a00f7b5d05e6f48f7b4e5c8e503e443087e2408dccb8cdc3ed679b26fb452828e7c99cb20805d5f1c8a0a2b22ffce3df4f85803e68409e7e02de1cf18f7bcdc439bc4d47a7000518c0006a6a66943e78c1fad1fd5637da903971971815a1f87d9eb0f6c228a0bae0e64ab6b228da9e45b96b7afde437fd4d6cff17a1a2a06882a03554688295cc31c618dd63bf94fe7fe10ebc0e80299cae08b102c610613a7862c411294868906264878bfdba4b7701729e1ace13aa5e4d4af5405c3527d4efbee357b19ac96f182a7df0b2386f2385fd743e1c564d3ff7405c95d55127d4e73ca1eeeb3beb04ee539e50eab9b701a6c8e5efa8e6b95e44f50dbcd78b2fdd82fc9c016cb09f6d7d0eecf75d3fc703c2568d7f7cff0bb5046cc5db6974ab8bdc8eea16f7978b867d7e139c07481132b062a5480c96f000c6c58f82f3b8b0030f5c1cb961081718b9f88148e0b7b162753e50bfb56dfba631e10b065ad0ade574cef701c8bfc9c0c4147e1a1b24abdbb66ddb46ab077b2d81bd9e3ac120c9859f4e7b9fce0d72bf58b4248d982408a6fbc5a2ab04ca2826691ee842722311cca877be487473e89d58066c62924384350f750910b12dfcb0d7cd2803e6e0ffe851d2651852912ab9667d3451723468ce2ccb98761888d9ec61b768b7b21ead2ecbbeeb917912c8c16edadffaf5dd4befb4c730cd5bd950618384b0dddbccc07a5086edaf4edf7cca02414755ea7d2620ba9487eaba1798c31fc4c4ba97cba9ee7ead0309b82be5b13efad9bb6ddee74af747b79804b9b1e832efbc7a07361da571993f2e72f96351ef6cdc51da6f2c782b0f9c4ba99774abc6a2df9ff43ed05137c288c479f8051cecea5bd1a8a85b3f29b01f90229c6ec10f3ab23022751d13a4a32e5f6be3aa777aa5027b3435ace06866ae77d869b00dc40184b0cd6f93d87e0e328176755294aba3ae53d174f6d73842ccc69c52cf5e5ba655cc2144c1950b9fadc01fcea1a601518508d4fd047db2ef4682813a0f536aed6a4573e81c582ada4f4cb75b0be7e84fc2b3534becc3ce02ecb29ed0904be5c9a23e721ec9a4f4499bf7597974fbb5a408a55b4830a7bfb5f04f2c02e6e827334a903ac979dce50020ed8261ae7b3068be285385369fbb0828fc788cd005e893e315a4771c56243ee7f0f4011956e8e53172f74b05e04d7c30e215379ef06386fde0178a85721edb637b6c8f4f398f8a60682a6ce7a28cde9225cc521f0b77de30eec7e5809a21c37ef46a1b8ded16fda01be8e63f46a4d14aa04f91b751c33a094769b4892ee59e725e8ab213f5388f225df9f1c708cbff8a9d7d41bfdeb8f47987d2270b6f758e7f60269829c7a5cf46d06775e9738ca9b00bb8086642d90936d98f8b68ff2a8a75c24a5c601f5cb026c4e7ee2917b1b808e6d06f2e30877e534a9f3ea54f61b444ccb2097e16f2640f3de9cf45cebbe5128039d2ab897f800ba7b840ed6054f9b53329a1cc81d450927a678ad4d22b2c50c8a3ee72c49df3649b04fd601be928491649f8e8e53c7c44a9e5a30fc670a40fc8b04d90fa0573e4f7ab8fe46f41e272a5144309fa402798f37c047df8e53318e8d32f9fcfe09d3e835bf2e551161863561fc11cf90d06e6c8970deb574e16563e77cd486e0b7c5be0259823bf49b7249294ff2385956f64039353cc85360abc994fd4c19dcd44daaf8e8a687fb12f22185465282218b1fd93a1b84bb7e64f8eca71e7cce67c383f842b42b8623f8eea227f3293cbf96d047da0ece26515453f1883e90332264731d46c567639aaa9409f2a1cd51c02129c391730675a1bfc48613f86e2c9c4444c34a160d298b466729e14201413141314930c6d9a8115cd0bd24cd000d4eb26e0cd7ca04ec1799a8a2f3370718239f3c1303db1084638d001def123dc9a3f6196fbd93b9b09e64ce701e6ccf79202cb5f388a290ba56ed5ab4a77c5da24d5c872454bc440f582b550da1996d3525360ab950c8c92255b9420c14295648717322d6ccc854d4a88cc2449d050f570832f98583b244993d20ab0044edf699671f4b92a13bb194f49aee33a9a955449ae83ddc7bba4f384865c9c976a8ab55a3d3dad72c160bf183b39b3adc61876182385127637e296c9c4d42943b38ae982ea4cc71dab15b5ea95a53dd7992e484aab69deb6d55a2b9d5aa6f9a435b2af9165dc814db768ec8fe982a255a562623338f85bb93d4a035cd6ad9363d6576342f764382cd578e36df38f77897b4243aef67a89cacc4c3977cbd576770dd800c2e6ddbd8613fab486931863fc6c4e7766662add6bcc4ce95945770827eb878c1fdd478c734e19dddddddddddddddd3b196e8f3235bb1564ec1d3833ee03294065de0fd6033ea8b699400264d236a5a4a41e1d9d2349bd55cab9a2f4151e7e716aa59285cc451aeb8f7092539a245758214adfde45a1abfbb802275780b23451d6a65451652389f3642a57652e63b50bfa37918d24d679542ef8b54badf0334df163777764b67ee3ededfc019bebd1420869b434ce6c55e3426ff5c1de7ec8ebb510ef0fc9558eebad1cc7acf62116761dcd3aabd5d052d6b0627975258b2def33d664b9f557496903884fc64eca59e316356dcbea94d28612cb524a29637c085fced5ca5af71f524aa992524a49df0328a58d94f261b73897524a193f2a8346e5207f08217b8caccfe6c62a6565189bba478f31c6e8cd3d3fbff1a1ad95cb6aa4c7c39579b09ed6f156fc8ca5d1ec2bc75196f6198b665f3d7b9abd963dec5a3a3d3f6752aa2ec8bdafaf8c915d09fc823435006063d5c1ea4600ea8d0e62b431d218bf0a207207352c00dc1a3317ae64aed77038ba20c7c1c598e8c11741b81f0cc0c6bbd07641f13f5a0fba12a0923b61e1cf2b3db61763838b4d5bda9ed09e58ca34cdbdc992a6b93759d234d7b65a37cd81d034d7b65a37cd81d034d7b65a37cd81c89668e68e9e1e2937af5acdb2743327c39be99e7663363d2ec5a518e5912897a2b3c061d8d997628c3099b8a464f9e352d63782a8b0635a10a6d3c3dabf06ba8582e642b764050ec2af575639d50926c438d8a56812eb806e351412ba54c7d5982d06cafcea868d814122d4632843aca00736c250180a4361280ca569360210cddcd1d353435eea3cdac6e2227dd33026ae7b3a7434d6066f6468966dd7a3940070b7f96fd9e882e413310c86c44566ba2067ddc0e2f8996e45b41519b19c61180c26656e74c0d1dee1a04c12965fc67420d32cf35a3571786b74ff38d8f46407aaa38b2744f7a34f62b491169d80e689991a92a8d1f4e40515d2c7509739aa0553dc1cb10545398aa0c107450411e646242862657a05b55c0f0d908e1ce0facf1f494c29c3cb962f96b8c1006490258c1a50a182a817f00f488aa0611e7671658111b7a940bac13260872756b0c086eb1fed02b41031e4fafb3b038e3cddf454613fce0994eb1f7b07e7babbbbbf0f20d7723d5e777777b250c9a777eec735b1e2f6c7de19c06d6a9283db0f391a6ac6fc0a5ba8ff835efa40fdd9ffde79a227c45788a4c10297d010c7c40b5cfe4243388270c51f6a58102e9a97f91a353ca18fe2349e13fbf1671e886b8625c3e28183fd6c4c17e3c9180379e4c7d8f6623a4ec6dceff7fed03dc7d237f3a3a745ca0efb164bc8bc8c27e49e103f35d1c2c82534c4352971cdbcd0908d2a9ad8e29279202e4ff29bf9d113fa265c42432dd78ce74a8d80f94243b08a4bc67362df1f888b070ef6e327d5dbff1c29363fe6250b764a769c34da02791c897b4d7adf2a66af12777a1ee3b1838d2fc451ccd085884b688803e30997cc0f35921c5cfe9125e4410f329e13f79cd88e931d27bbe3244c7daaafb08b798e15c3c2408cabddd937eb87bc2a2bf0663e15495bb8dc3955f854df790ce64c577226a4242156a26286934b68680b6385cb7fa8ad6ce18a421ecce0121ab271b9e7847f08527145cf89fd6fe5fa9d28fb39520c8ea55bd39d7e969aa05f71e7e75c8071e73b1275a42705dcf98e05facc3b553f5372aebe643702dccff9aa2568f7350db02aa4de3ebc11e85ef56d59b63d47f2a7f90ee5317752b13cc5f22dbc0bcba3ba057f258215365e87722caeb1fcc96770e77b13cc313dd6ad99391423d693dc6377fe4f0c96676c054395ef9f75f6e3f64356fcf9d4bf591fe06e1671bad5f2182bec5bfff89307f4fae3d7b86783637360bf8b55e87096e5b756e87d7deea8c7a38513bd37400fb6828103fac0ebee0efb57b09f429d2c959f851ef0f680175e48019d98d1f9d9f3f5a70e652b9b3638d226fe90a1d3486ab4b6e10aaeee8ebee9a7d4eeb8cdec6900e6f473fb7cb1110516faa458aa0bbb200f8d2e2ab4f111c2b0f2e7c3ebdf2d9b03272cdc6183e56fe6226b419fbe997712ff645e3b3512d0c7bdae02e6c41f216633990f6060a26883cdbca4e8d46a27274ff3dabf760a0ac2f6d720dd8a526619fd2277334f4f42988d14f693af1b5fcd135df1650dbd1f5f4ebe24912c922f098b925e5468535bfc27f0104438408abd2847790642d8e415bf78c7565d38b682486016215e6ed7f427e0c2e799cb453cc01fbc488bd7e5cbe306b632c746fc5ba0620a5bbaa4c041da8b911184626ef7be8672f95514dd88c78deb3f401eeeb968c579b1e6610616b01c9e8d8cfc3f1594dc62763daaf7b570fb5b602d2fa319903af645913bc7ac407e2a686e6d8e8dfa8d3c897a31158f336cf3f0431fc5e016c11c7e1e68587a61165892db4edde2e7384f68c8556bdc8e51017954cf0d1bcce5d7545e17c1dfb89d600e15feba04b899f77d8b7199cbe5875ed19622eaaa5ec7ccb05fbf5e30cb8b097e394f3b41591e67d87e7e7e01f2b495170f30d66ff81d7e8f1bb7bd8ec19c2ff6eba26ae43c1c4f77e91be7e1bc76f2950e1c1c1b4ba1f7adb87a3cccb0d503a42c4294e45391fbb596a8a630015e43d1d3c3d25a88e277479bdb3b4159d8e61f226c1fd580a4830f374698139b2c73941ba15cf09bdee18fe67e7cf42ef88ae96bef27073676f4bf5a1dcd135468f34110b2b05f100d6cbf334ba056e64f7edce1d29bd533bd48e96a15a37f364a291f462e9e46c9999d524573349db2618a152766802e1b24d172405eac2cd3ed8f94a3e1a64c992fa3a1295c947c0853851651846003224444905002a50c1d9acc1a6c541b7cd1acd86a4d5273789a4b512f706170b11446189a4ded296a4b6118134d31a24d4132e5e8f6fb98f2e4f6d329b0ae0b949825d5fe6f8503a88a104c72a841b694e408cd541736490173e9854d52c4b8df2aa659e922e5e97e3ad9173134a4283521258add5243d754a49ae2060e8b514a0923150b54674411366c56a0b8208868598c2a8c5e21da8c48012cb342a4351941c4c89c2289de400779e5298bb2c509829a625782b23845a982835294273704cd8028ca0a888262b1b71ca5365460638a67e3c425c60417a52bb8243dc12549192a30a2dad0c0162b2c160a89e3f6fc70329ad6d143135906876a04c6a2458b07388e86c646d5377a1f0bd7bdac0a1ad6e194218c5407e768b5562b6b29ad3bdcc3d7a99593b5c6da4302e7a036ad5b4768c252d6dbf84eacd61d877370bd23a5d605c9e81bcbc8402ad724b804b93fda8b5b55704b5fd8bc815add7d6ab971478c3146ef91714e1dddf218234d6c26dcc6bff643a8d9eed1dd21156751ba5a75c7ebdec7c26d2f060ae6f6286746b5adca689a8fa7a73a697fb7a0972e40bec3e8b3b9da4f4f75d9a80505a5369b134849493ea434a653e89d6cb5e3d3716d60f3f818c0ed6e0a05341a01fee4d77cbde26bdacc281a19b1d18c8a5f4fad379f3695aff88a4f299da114fa401b4a5a488570a1c731c6f79b125a98205cf65aa8e91ff2c6fee2f37b8cb104c6d1ad795b70daadd8ed68d49e99c708238c30c2082374d80c5b4a972e5dba74e9d1237402fed5e2cc248c11461861841146e87066375785b7f19a256594514619659431c6f9d5f8f3d55a55ba47994d1ae99769b1c69a7134c6544a15a3554d6166cefe9b2fdd8b9c945007e770bff2ef410d24cb9ff5e8c066123887f7151c4836fa4f330ee7e018fdfd7e4060776744e9516654abdcecb66ddbe2ac99c632c2167d48a30b19dda8909c9b063a149cb4984aa9a2e43a4de544ca89d56aab1d8b6fa65daa31771bc74ae104dacda94aa9669499b6a99c48391134ab467fa35f35c89dd23c4853e8567bd10313a71583568ef826f0eb5f552acb457ff201738444d8adb6b14302e9767b94b5764112074aaeea9097ba70330823c74aa15b9d494d03283851ae0bcafea94502ffe8e8e8d90134428f8e0e0940abd5fbb8f2995b467a02ed4c88f5508f10b3f153dde3c0e11f7f78678a6569c7fa6ec9137593b0a57dcc642c4146292b858ce5816e35ce536ba99563a8efecfb64bba0e9e369b23c90828f1dbd33915251685c591deb02232a7c7abd5e322081452765498a22d1e5fec82e68c626e453d984040a5c40656559177e38a0b89fcddf0f27cb115caebfed9d150dd79b929cb8dee402141c6144c74651a14dec9d1af9f0c228462e3fff20592ac88f3c384cc323daebd2d8035eab7aa0aeb0fef7ad692c781ffa743f5d4b4f9663e91b7ae5c7adc01cf4e1c46116cd21f0867eed825430ea42c183d15315191747a864002117f08a4b67d37502bfa964b5649388c2d598a433c8094b7f32cd25f8032f9d31b8f4218c1d2479669e90138a8614a418194f2f57e6d1025c31830648fd1fd53867e2d2ff6c8d1a5fc31342400faee9bdfc4f265d0afda6c6ff934797bef43e8924c4436ed00314322816565c4eb607e2aacec1251fa600c22534549f703989f9a1a9e5e572b221a007d7b7ba51bdc379e99d94c7c26872e95472e9f4418798f39830a1dc4e24a7494a97325d8134ffb91532ffb916977efec5a51f0293c76c74ed1d56b709cbc1c5cefce74a34de473d8fcd2013a0dfd4c84c18f4695dfab308f4914f7f32d13ba9a73f957a877bfab306c8239dfc86ea70bb406234a1269367af4be7974b67d4a5f3e9d239631336932e558239f4a593f3482a32d6c5a5dfc4a5d249c69340bba6278dfc86a66ec4c17ed229ce603f6974297d69047df8d2973fd0b7de47995ceac922a40b2efd9d1358fa21f40831dbddef2f0ad94f220bcc9f30bfa15e8fd8ae23c4ec376111a8df81cc43a09e61e1b0d0837e09d563c1839ab0fcd163baf45da975531e2dd22dce83b1eaad1a5759db854cfda55bf4ab6341c3d2cfc1c2d24ffde731fa2b401fede99be03c4e635563c11bc382d761cec392bed184c11cfa0e731e8ff50d7d4aad16e3b9137d8de5586870ea1de858aad4a2a6793ec44a0f4e18bca1bfaa4f678e6cac77605394182eed9ebe6be19f7eaae5d24f7dc7722cdda29de7b118586798dc828a70c4b2e040adbd3ce0a132fb026c9c3f3fbe0e18bc08472c3ff432cad2be4ed6c797955dd85108f0a5403deff6f46379635c521ffa0e292d50bc206163b4b081b501c5165be3c2262847d8006508ee0628299858d8005cd804e505153c2923e5c47617363d813af2240b1a4f96d089b2da854d4f9038e20992f4c276d0440636d8802176a309141e0020c3d3aa0992a21a435e369ad47003cd0b460098a93104981c646886f8226688d3cc104e462c0d5132432c1951c192628660822495648728e24317f48a52511d34386a29678344a5bcc0a106bdf0d44d51b405c5e0c449d94183d52637501a94826860daac103c18c96020d284a0e18629e488a6618344ca989431430c9ae1359974f1a0214692091635745010a448978eb04e8f8e8e1e199834e121084604020c354819438e28230835c3deb8108b972f68d014c58b13920c2f4ca0e18508272f401cd1a1c2bcc0b49051c61630c020838b3034d08420638a09051951a88cc888818d0bb1a0f1529a4438f3e4b88710c226a07f0ff489918a159ab2cc5587aea5a8afba158e2925ffacdb6f3363d16cdb26a5945a160aa821668515595061047d0070fd9dd828458ea0828a2d15da7cd1e8fad7fe76e8e868e1bccd0a071bf54d92d6d1d1c2799b158e1e9ae624fdfedc04e459c15909e45985b102a9d7b835aec3245828c01cff159ce702102a8c7b8fdf4422f0fa8eee90fc39c99f8ffac7c80adef8536aad6c3efa569c8486a324cd43b4fb59eb376e01ea37fe5917fb51a36883e5ffd888a90855d8edb24723a84d88234fc080862296ce881c67695663d4c03d6a88726ec90b228fa369d9d0588ee36870dc00c34d2828d82205765ed8b444837a74030c73ecd87da4d6d5c7d810b27497d1e5111e71c05acfcfffed92f53ed9db992aec9e932784317a04c33bca963176d76b5c7f564146c9b0e51f3dfa1f11e3ad2afec8517a31764151b6d7fc51e8ca6fe9c56ec5e8567461fdc226269a340662b6e6c22626882e06624b7471d93b0cc46c002e6c5a820c183bb24ceafb71fb91d46ff31e76df3d507310b62ae5c5904ac9ffc9792c68ffd5d4d397a9d40b01e24a7942ec779ec782f6738b4b546f55de9054d7755dd7755d974aa552a9542af543a9aeebbaaeeb3af9b14ba552a9542ad5755d27252b02d97a7ec12c216ceee620975cb773c69133a6f359480060ec67ef33e50183fd746eeff04ba65d104b2dcbb41aff8fac8fb34cd3895d507cc6719967cd67a7841fc0b93a5660999fc9da70dd340d1b5251adf3448fb57dd4a694524a29e5e669de0a55659d674a29a59452665996655996c9cf85fb0981f086dfde1e62c3256448665996c5185f861e577c2142fe2bbf813fe79c73ce193d21f1b339e79452be0c3d2ee909910f11c01f85a0086c800fc8fdb8df83d0000c5db1014cef10743ac281102c5b34e5c0894bc8493f101ea2bd5d51e3439b4f33410676d517badf8f7855d81e36f742405cdcd796b45bd253e147bc9bc702fd0f7e08fc2e21016702e7c500e4e58a4168288c12588461061a3808e3e25e081017e709e9be7a1e0bf465c6fa56b8d3e39670dfb186f8a56444040b02c30bae18601817ec868bf386702f64480810577daec7c5fd907fadb53e8f9790a11c25b86052250c2b4038b9ea0701027bbd5eaf204182c07a5cdcc35a2eee83c0562eee61d4c5bd4ce26490d7cbc53d0a5e2ece1b02b26406309c31440f42bc30852b085de22807495c4182c8405d31a8bebc5e2b570c591aaf97ab7e10195aae183c072f577d197a5cd51362a3822aacc09c14c1e18acb49ff4c912c969e7aa05203265c0e24499028820001451a5ac45cbec30baed890850ba818e25afdec4182b1372e6c5a228aa72592ac2cc1640b104b18414111a32a61722002abd245110d4f559c6e20825465c90891a82d502c012ec43246d3fd746c18634af6646d5c88650c25dc1663ecb0dad2721d7f5fb9e5967ca0669edfaee90999c02591706cb57474da637367515b514c99492aa57b4fbbbb5d3df5253527b4abbf5ded0999c035c43db1406115a3d4dad5ca85d613965f3a4527ffe242fcf2c5658c32ba5c3242595d5ac1ad4567ff8e326bba3441373f611ae3aa1b4208351ac3911209e1bbb9fe1f0140b8fe349392524a693665fc96ce6a8b5fa3c718b99845942c24a3d45aff97f2e5cbf73a631a9bdba3fbcf7fd8823a77fa5368fddfc737bf8f8fd3c93308b1b82df00e2766c1f537c1797474dc1df61f13798f04da059d7a9917718833583eca1ce98889f56f18cc83c917525215a4a9834d5dd854058825558c305165c846c4d20b9baabc9006952f54a29c926022e44b123b9ca04710a5245e3bc440d40306a72951443d62480a33460cf7d3e9a10c4e490c2e4b62589102438c2620c490c1aa09a72a239481dbb774765004f474a093f32f11b003c7c6f97e4b4745b36c4e2963556556669431de1bdeb2c1d1d1d19236383aace6cbd0473eb44c27c730674e1bf894fba3a18703736ad848adb2637777370ececc14eb3046e975f3e685dba39c99cc68a49af7e8b49e8158caa8cdadbd0399ed0201419f4053094849492903920c7d62dc2a4708343b2eec2d106e08170865ead5cc9bba402e37512bab05c2fd6a7054f4abe1a4a8d565ecf6964db7fa7a77777777777f3713cbdd3d2b143b531df7364652ad6ab4566e138a31375c7b1fef5116b189b1217c1f7f676884a0671a55b2b10b92b0255f93946a2e34bb12e24c79b133d571ac1859b7bad55ab94d833ef1ae6e5c1873614637679e9c18b72e4887475f9b1a58b0f5410656ab19da3b5204cd5cad9184d536d88a9f6a61634dd88a4f432025cc89f34612c459839bdd0ba247e1e8f4507162c71610eaf67fb16a4a733f1c06b89f8d125fae2b29a1b4448587ebde92ef5d908c36cd635d891f747a47eff0d7b8627dfa7ca0ceb22ccba6473d0ccb5117a82795c8cf0023c7f18217ae7bd30b945042875f400d56491071fd0a75f7418aabbafe2438e004142c85d47a185ca3548014fbd15cfe803c807a1f04f2bad2e38a5a0bc6e2688f468885ffd168a13436176884ded1dea7fcf911ee682fa59cac1e1650b79c08ebfff54877ef83572840cafb6fdbb6f98fec6a5f3556ab073b5f63cd871d0f9b6e394ce37ef1f676a98d94524afa1b2bbb52fb6e65251ce04ee93c3838dfc20183d3a301479a54a873c64d8e7ee58c29a5945276fa1953fa94fea4943212a5af4307879930fc8179b814874b79c8a5efa37960f74c3ae9a493663473eacc29a5943e64b2ac7d406ef45b37bad18d6ed99665cee29cd2f79a12b68d52facc449f91e87312942424286cc7cec8e84b164fe99bae07579893d9bec95e8339b2a7375541f0c13252f6945aebb0d31809e624319426fcc345c01cd9674f604ef69d61e956168339d967cc44b7b22d367b1d3a380c833e4c7c64df9365d9844e7ddddbd8a9534aeb9c1a4b0426ebf7a3b76b4a0002554b202931132371522c8b1281c97636390ba440a8b46d1825b564664600000800004315000020100c0744226138241ae8ca6a7b14800d778c3e74623c1ac8a22087411042c618630801c4000002222345c5194af49bb985e8279e531d72a7cea47480f407b73c31a08e58943948df798387cf9539882736246fdb9bf5acf6265b442900f40be0ae9176d60cdd391f33b295b01cccf36e96a8f340b25f245a44e36eb90fd713b454bed20f81bce28a7692431501be1c9e54a7b8039f3dc2025424b84bad7ccb61a26b967bf4de85e6d3b8a7fd4559812a9be6c6006238784f49fe8405f47b4049b78d15f7cdc8e1ab59d7818ce34b49b79bdd9648c32fd16baea024ea009f722ecefccc11ccbac4ed49fe24ea5dda4c2573a0446fb733a11194dac475011c7c39fc56bb1e2eca5514dedb54b8ebeb0fb5464bebca30d8538011888abd4fdc0a80d48f28c398993f6909864b2495fea4b8d7d573543dbdcf5a249515704fd5634c1c130915ae0ce00a79141f296a00bf95a7a686acaebf4c1dcbcc0e4fc022d2ff083f150150c230e5e98e794eb119f85ac08a7fc3bbba763601116a66c3ccb03e933f27f059855032a80ae0de4ea505885d5f84029d3560ddb283deca7a1589d78d1a4a2cca8ccaf0aeb0433aeb17d7a190b0facd831617df42cee8a7e0da68c68e4aa072a43e40a42626d1eed148dca90bf1f2a05c65dae79e4da89aa6ab74569810299795918e477e65a88b2637a61515d92e899c79969d1046d0580f688ed05300fadde1f413ceda6e68df983ec4d9df7e8b97d97706037c29eba1bd5a667fb04b607b61b9feb5be85fc9b5a38bdae86514f19c8f4821b8aa54d5474f9299b0ec3efb58ada4125dd47c32eca7f060dc5e8f9bd2ec70148671522717861def4261b167d28c9c168900083b364de97383a0754085ba819a88ab6462dcb40d23fb02bb30407e816d864422188c51d15f2d28b09d46beaa1bcc043cd337a722f0eccc3f738609a5a6754e0199547ce0bb914d30e13a9a035c9bcc994814d476c7959bff3fa5ce05a6d3b3e3309598d07bf0ea37156eefb656af04de03e0f640e9a6f1b57effe89c77f082ac7fd16ce7fdd49f42158a4770054729c59c3ba05d28658afb388cb08a09a167690650a3e0e60c19b892f60bafb2c58ad0514f4c8034a1ea932971be3329cd588847b5721e2b44d0e4e3c7116fc05309d3bde21fb82fbced9c33e840aaadfb75e98e953ecfcbece2914c3259de06b43611e5e3a8ab1ffab070eee9e815e416bfa8d1c7895e5f573149e5e6fe68c73cecbc4fcb2a9aa5931cc190e8a1d97996ad979c40671655ab9aca7b0b7b622d3025921a1df53e5e15ef77417ee024542fee782f3d5728006e84b759f16091a18f7de5ff1df78038c3cbe16e6fa708493bcdab98331ba3eaf596a448752f8a81033c5ce366ec705fe99e6560cb8eaa22b31cbd015c387e5d74dfe66bf7953d2db704a5331acde5a6b068edd33dea56db28499fa56d7b66a5676ba2572013631d8195019931d0f6bf847146c745102a3601a8ff8ae03c7d69a7385b841d45676b24fc180f3be98325489943301cdc84b46dcc6887cd028d83fc941b7e65c29a3444459031a572b7deb497dfe3dbc5c78709d630d8263eaa8d71fe1dea562d0d7f8aaa21f50f2dd59e66d342652036a934c8ee0a672b328c22e2e4728a516484fc28d3e2892c74bba9156dda8386ffedf7df75dfeb6e05daee4b3ede216da0f6d846011f98abad7869a3097f42533d48b9229eeea1bd1532c015157dc258aebfb1dd951d415f031ebdb4a4cd1c562c402c321270580e651b424c2ea7751611383decfa02f2bd6f9580902ab9fbe24293a344e1bef701133859d8e7cbbaefd0644e17bc8ad1eadb17359d26be2c1b48171d25e05668fc4655403bff80744e82ec20f0bb4a61de3d50f905770ebb9f4d74ecb35a3d3bd0b7e2e4794398bf887e4129a3c1a62996428f26fc7b16462167a155f47c05a816667951b7b4e92bed89d1a8b51fb9db695471983161c2c80272953fb1d286bc78d9a6913ad836c9c53fd0903cae00cc0bd8b7a02ef5ddc4195114cda30017ea9cdbc7ba677ac14ce158491b5812da2a68bbd7548000b348817cfe647f74c57ac6aa88d0cb9fba2860df32e567825acff64af4d328cd0225acdf9bc75a846f671ffdcf76077a288dfdadfdf8e93f6d6330b7761d05c6149d56c4f660d018fc516cdf51e2d4d5b4df8d162893551fdd944ccd3ad942f20f968e288152f3c2f64b21e354a8be8ec1ca08ab625d3f227963d2830dc17ea976fedd1d44fba183578bfe56c4dee31d2f59c7b3cbe7d8e3d905d75eadff60b0c37d4509fb1e30f59ac97f88fe01570db755afdab60e8f29735c55be1eeb39ff73337a1a2b058375689ac3b6ec473a1985e3257ff943dbe04fbf99f60f5d6f8045df5022c09367badf55c1bdcfa5f41d1fcb8d2b6dfa2e81e5aeb3de0ca4dc0385a36fdd17d67615bbe260f3dae54bfc7b61853a3d89beaaa87cc9a5bc2089b310f6124f3c0da1bb08fb11e44c15fdad97984ea676036a85438bd813ef2e029a64012711cd487d5383d29acf6b380a8c9361f8632178a3d2b80fee3c92c2a7d8850aafec1f7115b1d28ae24847f964c24cd00d02e160199f874f3dceff27d1ae12b1378d5ffe71bbd2d978a65a954ba02ca050b76eb8a4939a016fe073d81b42a923683897b9fb0fef99b98a1865472225d2b8f5156b689dd34bff3bd437ecfb1c1eb9b64ef6441d71818fdd38fad3e9e7b88a4511359645a6bc56cbb93ff2920483e6a32fdd20302d10bc1f452d70e37e0466e7b3fcba044b51c4dcaef78825eac7ea0dfeaa68703935817d65babe58ccff2216918c36372212584a248626c9091574a97d64766f4459ec0ff7ff8038e26b42867b7dac4c119c7c70f2054fccdac70e6cf18559788009c8ec7ddc1280b5b1280b44e37eeff3a680654401b1515a25805cd202de956f283b98c4e63fe3b59aa04d4cfa5b2d696cde12d7b72310e82e32f4dfdde960ad2729ac5d85743694d814c0602c85fe36b0564ad2af330bd10e3b772c248cb8e5f428fb72550370d59067d99198a9cb3af4227c8c941e71302326b9008106c97bd0f8e0bd7755f850baa3824bd1ea34ec699f4a1b860e11d87ca6d5d124822c21d8e999b55bad579234be88411a9217af81e634dda880fbb053fd9141b3f7baa7384ef3391102d02f8caf00481b82139fbd3995258f79c7368a36b9ec0082c6de16c923dd3eb47344fe049520b3a8b270af440660339d6782018cfc43ecdaae092151109a80dff08e3a75130fbaabf09f01b42452049c4f99119dd41da2b0ba9ee48a9884ee5296e4760a37f340af95846d3a6ad7ded08dfcb8f14315328ed93d29cd0b512ab845876aa1cfad0d721c526a8bf88392b6019b1a8d695927141de65f1fac6f3cc1acd01ca3be0a5b76cd7cd5347a5f59cfb99a85757439b9e1d992cce3e5d8a31368222eee680e00d74f90d98407ebb9802f282c6109b5a9c54f23ef5036fe64df1223ea1a20c9ad970541d3f9a0ea8d7438f46a5f453806c83a94d11a2790f70c95e885aa1f916ae75e61801318e6a6896cfb1fad8202976aa140ec9c030e585ad9355ca78ed2dc9e5470b988d5777310660081b61ab4378614b9753676963b075671d509b59c28018ed3f95fe18232d809cbefd65a8195f60acda0ca044a7f432fea8bf616f23bc53b6704d6a9440d99b4bcb0f6f25d2fc195b4a116f1e4e47fbb0595a0cd9802182f22e4abcd52c940836cd9834c0ccd1d46eb78e91a1e1ce1fd5abce67c15799c03d1f744a2d41a95cc57453d8fa509d15ddbdc3dd41ca66b404bd0b034daf1fd1e0a23709a9fae5c40fff37d2891911695b4713cf2d7cd9f57a44659365d0335db767af9695abfbf3828db358cc28585129c280639142fdcfd4712d7f1ccbef363363125e19f677000a108e304db8da468028c2f5c2714c68d5af40946c7fd2a3ee9a4f4095b2dae286414fcf132ec86fa24b57bdb1d5ef40edb93e26cce0d24e9633410aa8fd572b3626a365354e751a9084352c368dcf71424999a6fa99653141fcd8e83b8d2a19b7117d857023d113ac1565d3a6c48747699b054a32b7ed7256942a081358b0cc25ecb36f21ca063e3a5d56e4b063e4703769a5de761bcefd0ead6b81a65f8c8cd3edd45b5e89e66125d194ac749192c3b414b805347b3196581a69c16f409311bdd8bd6311e26a0cfc4f290f184fa21e92502954320b4fdb289a00fb8e530c8543f6038530601ba83c44453d19ac512619c474e74ee400df47e73ce2ffd9d952172f87fe88ed20015142c1d1748e9531ee933044fc25f4b27a4de8cbe4c63e8eababbcc09750b8a00c9f79da7c8338c319e6c9ed1480c110de39d3059b59b5628ba7a35cb71b994fb1f7782870e7e6440dafa768e20712c3e371b723f607d60a28e037e64c43fdbbb2a18898c521b4cdf1509073ba22520cd9decd7fa60fe2d5a29d07d036716cd02506256500d12a2006259a82c53a5a001adddbf6c8c41cebace94f56c93dc09c7b28d28c8809798bf3d8a7e64df04404956341f834c186b8b9f326905a78670bc854cbf836057c68969e047d5748adcbb7e27b9f09e3feccbba2adcdc5a4f00bea27051b011e4aebc1d6d80fe6338ade8e6c0522f84eba867dae387fed3fae3126b2b1bcad17ab2df4bf3bea0312f86d0b685141a189574b182468845e4b1effa60eeb6c2be0cdff374a0540fa81e9160050657f719360d1fc5498597486f3d0fbc9557c01e965ca8c9b5a6f9f7a45d49dc74c8b26f476b963b6b028f4ff129bb3ef91a9f11a367ebc4d3789e53e7c790a3af85accaee6f0f03930dc967600ba7aea62cf356dd47c5743b17beff5c169612b2b9179ab7d47c28ab6f058ba47298879455260da769e8c9675c9b4f38ccc0046eaccf71a17a96e157f26ce55d10826882ea81f0aa69dda31f5d53f07fd34705b59efc53179aa5c2050fe01742ae852610ec307d987d50d6b28202658be1552f519d3b1ef4229f4f35338eb0c8d545ca55faa7070ae10733e854c682dd53c9156c8621136a83575317f952a8213c41956eadc72f86b37f91b4a00efd6b96624eedd1c5a2517cf0b99abd9b501fb626f5d257cbb82245b6afce87f87a7ab99a2ee0ed661333861052c4ed505174db1cdbc19689fa1a618e6202bf8364ba7afcb088e047d6c5205806b19cd5e73350ba3ae1f69cee7850bc84d663850ca0c31c96518baefa56ae37c5df4801476f483235c86a41834125fd9f792f0eed5301ca37ff3bb1e0e30cc2f488124659c517d972001156329badfc7e20644a4e41620ded4eea279042377a3ad43bfeeefe72bb62bb483789d3d44cac88d8b3bf7dcd93c5cd02e07fafb8869f5c190816c26b9aca8d67923956429360cd1c077ab8e9d7a4c61345230dc7887ee44dde9f487309832ccd55380a4b70cd1a86b0f9506b5b901a5bdb63a060c8fc7b07ff08b3cc6ae926b81e0d0de93dcb9bafb1cfa7d8c575e43770cbca9325eec20301b9071b6202636be11932f08bd479e790b36dd3185c6cfe18f292d93b877ebb6a4efe8bd8b548a69ce7ddbf7b59943a9a27e32a11aef189b23393691ee43e59680fbc0db95622a65c4724bdc152159d1e5c79a7fc31352b43b57c15fa029fc1314e0ed5601e036e0a483a2ed97b4280f07800ca0d42672b1b0ba8bdf6dbb0056ced1a79743da785785e0ba87f475817080da03d261eaa78b0290ee3ea4d9f3d40d817d61a9e2ab5dfa94a27d681f32b2c1a9b7725c4b31bf8c4e1910fd0a25e418b932d59e6de8148776595fcd7733a93bab1e6a958c25832f81b4ab511a2bbf3622b6d6e7fd02f923349881864f4a0a3b0a945ec375ba728003f06b6f7b751488ce8c1730562ed4ed24307a0d0a59741fffb626cfaf08da0a829377900a7d884b40e7e4465ebe122c629e31652a256ee88f088753c2ac8f1d32f1683b0235989fb69b342900690c99fe41253fbd546ae62f3f47643ceff06fdc33a0289cc81ff0cb5387a56b57fac89adcfa4437057b0d5e860ea328d17dbf29f81494bf9555fa30aa19708e93b77f3d595aa35b202068ebb2b5688a89792c24874f1d10854ba0f53994538858fb4446f034ba06a09588b126e26c94676e07fe4a8c1151b44c930a03724f4c7a57764d2ecc61b8a9d61f225730956f3ce786b3b7d006b06dc8771da982f5f77a9970f62cab9f1ef585484a9f8816de7b746fb0b59adeb6063d8c3cbdecfa2afb603ba227533bc0ced4dce56ab5e4787d0109e2422c5d21cc65ca446968a926ecb8fc6acae820c73731e3f9b7baff99f51c3b104aa04b1ff1715a34a6a5f9ac3c0934aa536c0f861d0763addb80d90ef95576c9827e1c6262c2a5c99fda517be2765731c4f7911fcb4ad8b7f1eddbe0f1c61b623c450c70526f79ffecce24946fe08b9eb71a538d6f023325d02369dacac97e4dd74a7d55798bd25aaa2891f45e8969f19ad6a0cd1f146b2a9525cd76f550e08b872d3ae36be5de871d2e29d220d846a626ee6928de7a6aa0edf618fcd23269852c05f94f85346b44ae709110fff789879c5d86b3ffd4b34b740b489ccd3e89bb5bafccc4070b812509c684759e1f6f7d42e6e6d78ba8c58b5149a443b4c2057e0332fe854095edc24bec2ce6c62fdccb3a59438a150f23fac4916e3650bc87d6fd33d2c5bcf9fd8623510cbbdae4e1e275e0775e11994a645491222e6c485e42427c70ab18e4936ff8072e4369f3f27132701216f1b540f6a2798e50ac2a2617b295c1d769a2b8a860d1d6c2fab7df872544a08ebb280d12f72379b9f6c84a72107f0f220d97fddf950812279178f72d8906af441b4095a2c51ee9774c4460d415b0b06edb187563a5774223c108cc9bdccba5e7bf52bd60e6bddb086be449d0162d490432a29ee2a8c622a1dc206afb09a406b743253b33bc5e0caf133931484895a0573854067d574e5b67ae4db3c633752823f66400dec428792f8ffad3784291f297ab0de5b01ac3073b7bf799fb7867790dbb5ba827ede9d21ea8514c0f0ebe6469a7d82f10ab0e698dd6c91985d679a85a027f7c22bb89791e95c90840a177dca9d6ea410b7a41d2d2c0943352d4ffc33c0c1e504c4215536195c84e1f4c3c5f4c7a935c91adb8d1dc5e9acc4e8ff60dfdce93c23afef81f002da343dd9665bb573f26812944d22bcb99ecae794cec9211c465f24af6ef3af41fac4ade0e0368a80178ab63f949650e97d5bf9ccb7748a1caa942c11c01b4daabe14b00be588a9eb67d55befa0e5e02a10049c678899b4404d9f826753a0051a57c1959f2d41d056c81b67a4ddb17eb5537cb4106fa1e48d140114bed0e656b2c2b71fd022edfb3162e585350cc21a7b98d5611e19a3fb17bedda3bb31b7f93a1105e5a2bf3bc4e2be7209b5c3cb918a1d33ab9d436b91483b1bda49fced3a1280c679f868d8ca62a32fd58c19342148e8d13207d6d74ebe348c7438c07f430c6d3436e5c032a397e7ab047931365ddcb242d53fed2d9831514cc735f85145cd81a709b79e4f2c945f4c40251836afbd303b8f2c0ccd52b68f9137480a4b0b04234ad6ddaacc751a7e2fdc5bbb51310fc1ad61b169614ac03e7ea543512f1e2334b3bd7fc5081d0489d245ffe661530b64f686b205f1860e20e205accbc54a6008136ca350ec08cd35cd40b610069e2b25618057a1028c58136061aab70d16edcea2f6f010e1f547c8a37a1c9aa889707b56e793580aa2e66af9498f1888f71a3dc6a998d961d627e668524e856839fc0d710fc1294f8550067851d929e3dd12cd02df1e7660c33d5da422a332b7be7c245c3cf48548e8c66e21fbcf3cf1a8c18ceadb28b1cad9869444642e2586789494eafff3f9735ded075925cc00c2ff8433956cb755279f2cc91ceb74b5470384fe096dd5a5cf6b9558d1e4e4a2bf638317c9f83c24238257c357675f1623129d4b246b74959cba6b14e12390595ba3b8f098de3c45d06f9d476ce8dc530f523798ab93f6a0d8d17e0b2637f62fb40b10d1d003f577363e0b21154bd6ebbfe0721bc6cb873f22be800f673c3ff968567d0a0488816f892b33d09ea2a470b797165f1b02ca42b5730ec98783d0f2186d8e924c1f33e1ccbcf4bbf6945b8a2da5ff6465988d2aa93a9caa67899f49a6d6b1a81efa954c4dcb4e14fafd3d565fe80f83de55369d61b6c39748783dd75ef5eb411f6c45df34e027740962053dd14695ed3cc4be3fd1fe4c15f162b71d243a05cddd9acf231c22cb24440a8a4c91a808861ce1a60628d6b46d39dcdcfc973cd5ab868cf095190c34335fd547227c016bb6ea7713e598258b6d8c4e394d3413c655ed24b9c45f892f84864615a4d0b0c26219ca57b5659aad201b52044d62221b3445814cff4e9d6ebd4291db08e8c67e4919faae5989ae64aa04645d123b49aca54bc71990d11092fc2d8842c36679860f1accad4a9681c92066ca38cb3368651bfd56858a6323943788a76442194b65675783104406da25a5c4d7cddb5d48e18172514a1426361f3a13bed79ed71fcd4ddc1c6134a8a4aec8ad57ab18114a499401de9fb335e8896e238132ae8528a42a906780a2d582f95f036b0b22dec329dcefa1cfc412b63e45db687eac1482761278b5bf901f2434fc1b01e8bb74fd1245496ab2f3cd2ff2dcc1575ea8bca70aa1b7543da9f1b524d0b166137e46e1bff806c03dbdbfec9db863d6fbd0ca1a34dd8c346c6e32a73a0d48518b69cec34c290d00157fad086a37d84765bb5b8cfad56c90b39708ffeedd817d29845d077c9a09c0dfed6e1274e465dbccc8432dacfd696e52a0e1568aa580cddaf32ac9b1f8413e885753d8368ea0bf10f42add1de09829dc9b937a66888f0345408b0154c025ed5bca1567eb6147c5809d99428780ad83a9508829bede6ed726dd2e12f57c0c6b3e9e2a05384152524896f3f4ab0f68b97503a69f6a39cacb0e16b1beea2e4747dabca532d0e4905264345db8da4943cff904b8c62989584626d52603a4c51bf15c5b05aadd2c1e07bc6a61ea5d3570f47154333a83a6bc06dfb0f4c979b7b73017b8c8200be0f7c5ef027de64dfa93b57caa56bd89a62bc1b749f7fafca144bbe6edc5cc99b09cdbe793cb2b92c598ac86a717af7126edce1dcc872f3a3c6d8cee9b8a3bbcc3ae0be8ac026071bfb77e4d60b0ed04469645ec80bcde5c4cbf6fbfd15ba40e83d93cdbabbcd43fbc29fd55bfba00c484b144652e2ec87ac8930f4eace0c4522b61f70dd51627c97ac592d69890895c2f6e397085c4d583897622e039e71c111a2cd04c5dc9335ade5da4514599739bc1661428bb2e692a71a8455b20028c8fd83cb35877110766b948c82e8bb3ca4d952057c3c3a9871746b9ffc60ed176bbcc4d2fc6b110e6cfd76cd5271280a62bf9e0a0f99bd784f576ec256e30f16a0435d1ec80859f59ebd8cfbdec1aaaa87a6a46b79bf3db91f5c582fca901cd15e09f94bcc3b0e723d5ac3d42d564d16393f0f4fe64ca9979d83c81caa09a946a4d30968a6b33f2ff15fed10ddf4b0a009713c3681d8f6ba0ba6b81ec89fbbb5560d8a424621041beb473c417b5c3ea93c00058303124f157b070b6d48aa4638c3f3ae9dd4ffa2f97a46cd2fa94c2447fc3d05a74b136849b53f268a438af6c1e3471065c73dd5b2438c4748af21efed9d5893f9ea92a9494ac36dc4898a2f3aea45dabc155f27ecf088db481f29a7f4f3c0d2afb41ea64b5ce0db1b143a78e0aee73c33fc1841c133295211bcef1d0343be74557be083c791bfd448f268891eb60762529fc110db0854f6acb103265721abb96994053cc67150189145af36c6056b9f9f1b23e1dc46abc00792699e6e93567ec3093c22a56b6129f146e1ba290105a36e2082f4b5fe4756a212e48d7f914da404bdf13fb2149100bbf10fd98890a0b7fe47465112f44a6cc913939699100456edff935d6843e0ade410b6e94dc50e148257b59ebd53c00d9a4e4861370d93803e71bb4e28762bf9c0a2295f5789e04877e0661bcfd340cc5d8dcc7c38723902fdcd2cac8a70359cd8284e334d4231588b7a2bdbf7b681ec30db6e437ebb51c05d7adcb2b43bfa926516275faeeb2757b0e6b4f1cbb9b4936f70bafeab648ee107d91dc35c5784d8b6ade011f87fdebb87f05a259779c8cfb8fb21d61d7b13909ce5de991870e7dc1c32dab04959259ddf178925326451d2929016292bf05983486ea43039f9708e9f058b0b2428eb442fa476c136db9717516640ddcecd8aa439e0965230ae443e96563f01104fd0601fa4c40a4238a7bf6e1e0b134664db4dd0c35a0f1534756573c9be7c565bbf1630741cb23664f9edbe03f22625c286fb129b20f6d682c87beefd8ba8f766786597d4a14ac6823a2fbb92819b65e37977f5a18bb849f9f4996ac209050045fede135fd015f87292072a563ff5b506e364521703eae9c44bf3dba1c41b92e590c06403a762c3389317c6e83e359bb53550844b7160fec38a4ed70c06706d3761cee5158fed4641e944bc3b21fcc1bd03d30a334c3f1a4ab9499c242955fba86c82bf6a81c16a9cfad4f00d84f0ad19679ac889a09ca4b319e0043d59ffde9a3acbdda3d231d41c43ee7c1caebb9637efe24904a34438ce8563e4efafcb0accf64475533f3b5ef9eb4bce3cb42a399f7ac5cea21a422b2cde6942e13707908c3fb65b1ff1722e85a7bea45a1b507cf4dac699055c1e9c280b30f32e9ac1b6018d6ac03fc74e70809dbb7b0c1cca8897c50ca5d9b349b4ac5fcb79b5a98c8d7183270c55e3a900fe28e9f904549380c4cbbee41a517c69e81679b2ab14d5271a36813c73aa9dfc06bcc9189c811bfdf89df0f4621a198e1b918726ead1342ee51ae62012a2ec73f296eefcf8e75707b44e8c03caa1b8af6b6b211b2c3e0823060b46bc7c9f835c10ee3376181c571be848fcd1554f9a972a4cae71b1762135aad1c3cd4c021c603662a993d3bdde2a7253de62c3a77834f64717dcd1a02dc5419d05df95b4158860cb29002ab68bae6c30aaa9a15986d794ddca4d78532fe1845eba1260181d42d23e7f0811f9262b6230a0f1fa1b64a68f8b733fb743137a84abbb4151f4239d3ef0eea0bf1b2a778c342a52efd05eb824363d532ed6d7ac90d5cbe0289dd09f2f2091af6de3072e5f6a941514c610fecff02016ce9007c742273e8393ac6b32cd3069bd0c05df2701e88d6d151efaa1b1f9d492cc9d3e7bce96a096ae18d9846a70cfa3d9098ee741d1a3cf93ea932686275288e9c04531de8caef7fb0de90f532c4d4cf990c14de0be8d71b67abb5c52230e59d577001957ec620d22ccffd57638dce5b5c62bd4eb3c3057339ae065182525ed893799b07b69bc6c55f75983d609431e8a7462f3c66784f3e26d2c2e57b32c5232cb1acb39144e63266d7b189bc76d3dd3a76e2e05ec9259b69e2a33060895565f184169042f2f2486bd9ffa53e35168d5133fa32b91d1b27b793fdbd29a1dc1503d6db902ef2509a508000b63c3791589dbe877024bf7fceaf74e3fec2987ed9ffa0a6fa52b189e5d4ea02ee00700790d9050f00792eb82cc02b8793b5e71a4c95e78a20146bf98d874d480d8b04047781e16ceea71d82a545b00ac336290e1e99a9f8bc323b6bf4dbfef4c8da7cc7fd8fc028857fb618ade4b980506b95c268d2e46c91c8aadfba1ad3a0742da37da2a75472f48266d4d93f02d1783ea206c56a637e4c5d8d87917d126af480b5a9429d120798c432bb821fffc4f11be839c8349a8d22a1abf24051514e9e01da73669a9b7b318804b1ca7b2cce2be0268a2e2791fac952a60551ed088dda0fdc4c94ae3b8e3f3654d68560ccb8966ca029cccbdc5c6ebc4fe2054bc0136330396e78f5694836636d56ecf7c8ff07774bfce749d36e55c342b91f52331631ce64378828dcadc0120f568561b809becc9228e989c57d3eb616caeab00bd2e45542d2050ddfe597502b6f6bafafb6ccdb975bb0c0def2e271ae91292ebb50c2a13020f1586ba88315e76b16520dfed08dce6ef6ef29a28d7c0d1f1c26b56cacb4f62b8626d099a07dc9f7e8815caa15ee28c7225a50389961d300cf40c743b520bf863df8c34f1af32fa20d311539c7da5a431ec833fa952398097993488069fe40052f05f8142a8c975abb8ac6f9b5c49626c315c32297c708022cd1ac5979d59c9602bcd39b6752fce0556e412ecc987f10c6210c3f806240363ebe897762d90169d250052be3f9fe3bf580ab86e7021689355d42006b2006e34bc220b180f82e555180ce6b63069646787a697522f03141b6198157d7f63b2156aa638c9bf8dc4c442a360cc851d570333b094456b8e029024ba3eca4c0126725881185b26c32da7fa8dd7719ea39bba5fa74863955fa0adac253134a1c5758368f9dcc2d605a70b5d602e3960af88311227bc3228ec35e33dc08a5ab7b4742e71dd4cc0351e42ac0c47b58b1e70da64bcaccab2286ebd3f2a9c75a268dc005c20dc631d67d7e58d4ab01d410a21570dd7784f81e5a14d960e703caa783f026289d046e0593ebca4becb1d6b5882136d44d8d307dc75b3f3aaf5cf9ba26110475581159c1d43ddcc5c6b1ae8d4740ffa83a76257756e6a0249f9420461e688b990f3902f238520ba7b0487c0de4b2321cc9d9b5212a5479ba69b43c09768081199c88856c420f4327e44abd50652a43ea1120a9318bb4672334e95a9bf3dead0e21a0abd952e71bfa1ffeed4316e3e69c97d27ce7c2d0323a006238ce8fe0b240d5655cf5f940a67b1ee9be65364aa8b33bca9008c04e135c451d191b59ebfd672d4d2f0884a8f069a8c8f0ded4ea2bd221fd14e40a156c619655caee4f94ac117ae83a86ceb70a5f936fad712e2c214b55b027625d2b5edaa081a7f2fb0fee7fc458be654d779107c201a15e105a36f1f051264e801d44d90bb19e0502b84f7d8f2554717326037cac6cf37b84a9f27d65fc35b362ec6681c431e29c0dda3c48bace9b514dae66e312c956cfce068b75231c6d1ef9558d2660cd6179ada83b00abf7d2829a9f03a8481a3f410038833ec2281d1414273c65d8332713a251ab159dffd5583186e40068eccc91022c9851541e1ac499f484c57544885d214dfcac3e1f173a62a311583e41ea4afc3e28d2b79fa2f0e83f29d6b551dca32d456322ae5adbd47096c21e71ae6781544a33088a3da35e2c2bd04ee820221e7ba30e667ce8c6eec0183d0c46be6f0862b7deac8e93fdedc4e903d79a043243157874b4c17cf3f6b8c1de9fcd598797e4f04c2caa32693ad5503052a8591d6b7e716a534713135620362fcfbc761b26a0d6fefb3d29a831bed002e7c0f4db8ec67a02db101cf95c51af3dca0b2c9ae7338d7a7ca769612c3222157e208bbaf080830edc077c53e3c98aa07988b5d456961478fc47ff9338f37d4880a7ccbcf4f2d1dd9b981e386cae96f0f889ab1531eb7961599b838f12953e5fb2cddcc35989eb4c6df0d839bd3d83a6eb8debcc808848083e9f4ef103a60f9a4d020520eb0fd3119206deea91494d9bd04fef244307206e1b57013d8c7225e07f79d11e5771a00b71f0ae4473336bd038edba18953059acd6fb7d3e7b527504409829762337a433c26e973bed71b72cab6664018587386301db487584154fedb91b7b9a0fa2894e493f79ae644b4204a00bde12c16101a281eebaa587d0e648d4e8e745304c27313e4ed2072ac6ca22e3cbe530cf214040c1f2378f70dd2f1a80a668833a2ecf32c6f30d29cac4b5b8dbdbf07dcf06e4216b4c7a928a3674147a3b7630afb0a215d8529ed62e4948979cac789bd314269e03a03017ac08ca9b5d8cc68680e09a81aa1b9380769e5636a63cb0be6e2c68d24974aec66a9175fa7ea34147f9da0a9343bfb39c554dff7dec60ffabe3cca663dffead2b11e2428df922120af478bb7a9d7055b3992ccf4ad764b1f248b83383aead1f5a3e7d016d9fb61bda7305ede6580eee58e716a8222dca88ab27976a03d03eb71a053018ebaf80a652fcb6ff5f24855b0ef247035a0d8e4eaca6a9259275065b0c149a376f832c094565644a71519531d8962e7f5c1eb0ba754e93c52eee3b2bb4319ab36352a92bc04d5f6b920c02ed6e19582d0c5060421dbee544eb55d928dfb998617914ab98d5c807a62545d64e549bb520b47815a1522145ae9b68c585b47c162aca2e4b498ee1a5f91864663b1598fc062aaa98b75cfa0c468dd3ab37bdf60caa858a89afecac57c11891aa4598619846a64586957d7f4e3bd16245e8fd6c3f1681df2efec49d0fb1ab657dda4321ce011acf30c5d05330a76577b1bf0efe4f048502be036b9acaf8f7d2bc54434dffab846c4d4579623021ae2d3df61225b225a2da40599b54c9defb0c4b9972a898a2585d04cc9608ecbbc4926d7b69524dbc9177e5c73183f45f271025a98dbac91e32d3714620fe5f9a3c97c14fbfe196f821d277bf4fd4dbc96ca10857cb42f464b17fb0c7e5114308cd7d5ba042f7ac57970f1e19407a42c62a288d608a858a19ff4be961a26cf6eb5e4c87ad8a6fd4e3335268cd01ef5afd41dbfbe729d113b70165ca7e03ec1bea6e5f00d6d7a0dcf38b9529f5d39e2feaf069d5ce3e446c5d2d291db71505fed2a08d45ec1b5c21d1266b5ced2af5a4e9df01a12ac5901b87daef6cfab4b13c87653e742d8b74fb18d1ff4c761d50dca07b9cc0305aa5d21bf8a5ecfa9f861de059ac04a1770fbabbf3304d31b62b11ff19272fbf19e1f3a44a611794fd7109b8a4d87231631edaf1d47630263daaac5b85110fea333c6451cdb2416bbf2068ccf6e913919e569d0f1bfc2886d28305c9b9bc4a05db7834daf91536285115d69e9521d26c9d3d0810598d2101798360f8c3691d9eaf6b19e24f4da1bf13480064bb44334c06f8c3045e6e4868289677af995958145af994cdd28ab2fd1694fe1044e23a27dfb6d22940ece2a588883b40ff5034b11715cb1dc7558f0f0953558b4c8add36ff8344bc50e3e8663f725acefcca9eb954bf7c4ea821f469c472a6b6bf5f1fdcb2cb26561761e5553742a72e02d06ca5d12695fd431a238fb1c84671b7d25e08ed31fc92a0bd03714fad1fb42cdcbd3e3f181ec3e69d241f00c010f45b1719f3dd48b8b4c2490288493dbee90759c25a9aeec65b2436546fd271b00a465a0bcaf3b8f4a29d36477f9e4c2d432509657ddab93cdaa4f8a4e19ed64a3040cbabed62d5dd13cb8d5873757e81d3b3305ed73bcc0ea61dde5d7987c7693fffe64e48fc0415d234988406a8058916e1da536093bb2811b27e260de713d57e80c815c84ab269d3124eaa727acbb09f8188c3c596f48a774da611ca7a3cfa165cbe53b19867678df799b5741899a1e03c51c7ca356552571bdeec2043a103c1b02a8a47aaddcc16cb1e1482b1bd04caf56016cc37dff8abe412ecf4efa44377a531e9c9506d6fb815a40d909b7aacad2fea282d34b899982e9212cc7f0351e59e34113c3533f272930024b653d1d660704c737714f7d70ee674f207c09bbd91f092c07404978dd91302c4b92ab8c45ea3286553ac342504be64434f566ed0ed0ac011948b99b9fac464a82e0ef5447b00fead2488cb6738b7c5dc39bd97b6a4d515d37a7825fcebfc84da406e840f463a9a372b1af1ad5abed9ce2ffbc4f576c1396afe0ee8820492437302d1c11842458199a22f07a2d164ed48b351ad988ffc15af7eeca2cd24c863b83c6b06805fbda13f062872bbce0ef2ff83ab278e6cfe263121ec1bd8b8b597e21228ac72623c5bd72df52c780d84e2b42fa90bd968f289721fbe94022bc58872582d9979ec9651834eca85019fba4697afd3ff9f5ac701f04f004ef4deff11c31f4be97394fa5881262409e5acd65c0300830ac56b77d62f25d1f70edc8594e1cb3d406ad6f924aebf74c5780efc0aa55e380557c508b9a5c6d1f45d32e7a82a9b8eb3ba6b2b0f51739c84550900cb65b47bdaefad2d51ce8a034d1b6eb23e7223ba5ab91269a91f948be295ccf177f19e437a97e00860968cb301cab451703db1291deabad2a0c5758863ce343d671856554f24891025296dbc7a058f5dab9d878547a8aeabef760827b97f6477e60e23c2e80efa43fbadc0b4fe40adc49fb6d020c6619ff2f531110a00cff2f3b1108aa8cff2d9348084aa988fd0e0dadd4c8416a837f587663a1ac7bb744b62c8424c06afc5b3642247835fd5f66421258b5fe9fb253368960cbe21f19ce0282874e9e064d7823c20eb8b338fce4af99b3af378094e9ac10b6e82fbddbcb4688090af44bcfdb65e042c69c429a1e5f42db6a7a2761b4b5323c8f0c38bc5018f98ec00653adff939950045bfb3f2d7bb36804d5e67f90ed5427744c771deb30000362706df29fcc443d820d6d95d3525d004e720c7f86c221ea84fe0dcceb8098750df85d1590769e8f99a6a83b731b4f6d9d02ee471a8bb9edf3f236bce2c2be1ce1d82cc225e70dad97a7f84f089b0c371bb8c27c5f72ca47dd51e95dc491ae02a6bec5fc4b4b1be0d8d0bb1eb0015a70e5b6849fb29eb0d67e45f15bcffdc25cc44940b562b0fa2d36b94a624f95313069b6c4cd602b76ed0fd5de9046220260d242dc7f5fa39bf361539d2f2b8982eb8aff346dad09f4a62c7633e994284ca266abab0133581dfe88683bb80cc3919ca9db8311fd844621e2a6a6d52290000b0bac8506e03c18e5637716e97f33633c8f15700a1eec1defa9dfc86fb29a38d3c77f630cef9138ae18023b4a6fbe91f9abd25890b94ca7e2d65440b9776dfde9f30eb70d8234261a56b48a082e496e54db535cd59a21104bab4ddb54093842d0b659a30271cfd4cf7ba270ad3090094032006d350c3cad5765ab1f7e645c0008221e012a8edcc2caa5421fcc7031ffb46ddf39d4434cfb4cd3affbaa2de46e17a6a7eb45a699e6c6294a5b10e69268b65c3386d9d37450f75e67cf106c51a147e66e6ea1570c6c6549ff7ef3f35177418a43e258d25f3752ddc3d91877377dffc587410588cec223cd22862543be81ed70b322ad1b0d1f2c015d0cd16ac2e7ef2f2538cfb4769a69071fde90e72d6a47a38194309222b3b9020b33081173460f804c9cf52ebd72ba7e3a6e8bc190c6b6f356053be20716766a6edac61071c446107b7d4efd7250492cf0b99e95227711b367d003ee3e10bbb74158c6c792978db8bf4e636b2a089fd88fb4ab73c29837bb046a0a63902ee953eb087db5d3bcda53535b182968c133fe3d911fa00094431775c7558e38f5514a5deff441aede08525ce506f13f63968c6f52dbb27933143b29905b6244c8d9a4e2f0b9c683ce4916902b8abb6a4b92b7ff1e93d555fe254c261df38233c0f8d4def8cd27ce407b2bc188d97e59ab2d41dc46bad56d32a7001a1a9edf3b2152cf01b3639c25bcfbf50782cf448d306d388237fefad7e18813e948c96ff9a1d5912aafea140c6dc709280e480489c921a4a4b4f1d8127f432cebb4fde39ba2ef5a71bb2f04874fbf093c73511360e7233367478ebea65760397545c686573901e05bfdd32f9e3776d2f3358a9b7310e0bf3c91107cebd92c337b76cd007baf1ab28e205a44cb08b3e33ad425f67e591530cdc5aee007248616bd364076362ecbb0a86dff0a551a75beebe27007c5421ab60c6fcbf4ad8f03ccbbec62c31384d922da77c2a83a4acf31592efc169f289acab5518942fa9d9d692091a33ed187407131b0aebb4fedc93cc68dcd28721ddf78ff246ccecffefffd7599cec11f60f6efc056c77205a03f216e31311d48f6b752ecf792f7ed00ebcbd4ec417b19f4c3804744107fad37ea770e30d65238fc7ba6097b208ad38763644be9c0c332dd57ae88ebbbc1691108602eed0f0642561643eeebf490015da145adf528ac1787746becb35a47eb95921645d8f840a2b796515a23166342c79584534b711fa71e8774b0b9aac1ec85ec1fcb8c988a3735e00fe556f974a696d83bf2a241c7ff1e0f3746a14500978290c6f6c7eec8520827d7414ffe8ed2013d2c439b9ac45198542e21bb271b40ca78505a8621c375d9c68398e3b2b3779465f14409a9672cbbe4743504c6634bec44fd0f87be8633f310e4de63b45a85fd2990acbe8e75019a005402778247532a463248ba28d889b35ddc4191178dcff5fd1401780f8ed114d2077e44b1ddac8cc77b1517cad4504a6f1d910d446599322a166959480d3840a6b768aaec05e168c720442cfb0e4a74b8a8a6473ca5b611d383f240a1635107c47c6d8b9641a49074979d2368143485c4f539808d38923540a75045d65d79b55b565e2d0d79dadf7ca45e518069a415e848d11a9dcb44882f342305f675c40f52c67976c261250bbef3178f7a75bc86637f4bda01488878d06a207066431e3a087127ef412e8e92b280d5766c43202ad36e815feba3f2726e1c0ff602ba256a8965e74ed92a01270a06a1086b4dad7f2b8658a46964018f6e4567fcb000b87c8577a64b80512ff4bd460407dbc303e1f5f1e8422cfde372f803311610dd08e6608166b3d7c0a077521eff7478e4a179054dd7492ddc884d07e0e120fb4de4174081ded78311cb556d9002073c0c26e21807d4307bba4d2c257b162c48405e2c132cf618f360f7618a41dc2aa89c2315099a9574b3ab5e09e5d0a3bff84c9ba3000b431a140ddb782a7fe546b508816623ba46717e9f99ecbf5f40de79c2f6bb6ff3a486bb75303e18b5bf7b2cd160b32271872428972b5d45000472d7edc01413b89eae163f7814fb64b80da903257fcd88c835b04f403c1e12356a9857a9d48dc0c67276b3e9d2d1eb790ddfca080adf5ac2eab4e4931c1d2c5a59f2971e270b724e9ce5768ab0c6ef57676c64723b5081485d3f8207ac352adc0615f86f489d624a2985c4e418b881c069561164e8eef74a33a8487b99aae0d7b593fff3cd719aadcb002d1bed41d4ef199dd25004473868a9d741f31c004ca4ddde6fe2cee5c888c50e9d32d19c9d843f7bdec1f00352b0b7b2c93945b37054141295f00e34ba9b4fa53bc7e80129c2d245ac7c97a91197db488c55cf5ed5d81f523227fad38014867859f72497b25830095c76d1c5e5891906c5af208c9077ee5cc3b3b3695fd298f298dab667e40aff61aada0a00559a72f00b2bdd401385d401b6993f50c8a141c1027270b586db4010fd069a9b1c904624ed790b7b87ee7e107232d98ae644231941f134c74923c5b2e8ea37a0ff4d39d87c47adb24c9ead6eba77c2290343d7ad0860c7f5361c4d33b685cb49ac12b635b265ef1b69689b9b9ac3b53ca17872072e331ee7b8253c9f0bd3294a9a9d71b4a315f8fd3bbfda371ada8f841b608580f3643348a43c5c026185ec3c8f9b5887ae79c7599c29cc73a3085ac818459c14c24661fa1351282634039a32ec0bab491c87beedae85d68303bad40e2282a4aabf3cc1adf8d6eb8d2a1943e52cc0fec2ca82af82227a2fae015c33e3b35f8e88974534c25210fe64e1a9c3e09c835af3a0929283e1e2ab0c5d0cbf83d4779a7e7c13f670a6a9bd81bad53ac27af47db5369cab618196689002de052dff8c5d1c47056cecfaa2b925ec4b9f4c69e5575bacfa31c8efca19e85cd3d64b653b836fde849caf74b735f82e83897dc30d1f9c303364d792ebc6a484d8129a355579dd26f4fedef722e0efa6000519b28db121744ddd03eacba210116b903bae5db4da440e77d81e493a52afc573249ba5d875b2978ca7043e17faca024e9aa541ebcfda464a77f4c8b6a7d4b835f5fed70ca679c5048251d0b86b7c11efea11a2598d3231c10e08f9c3990cd4d0b18dc5534e22a2f5685401cc78128704d66712ebc6bbdce32da7bbe4ee55b1fb14267bbc1555be3cf85afe9d3cb0e9ac98123919b55d75b215a70a97148be493f05ab7848403e645ce6d909b349919cbb994e8f980f6f6a7518fb87912b90390dfef9071485c294b63453d67d5675e442d3f35103613f7ad10808af5eaf2022126243816b33077d0a708e3385e396088c9e26f53e97af59fee8515e349cb500e55d81b2fbf4b7f3065d295afe152841584317f1624c492490dc15941957e1b8f07c479d20e0d8a1915391c5c0fd8f93e3541b8d9586a35854f6215c0f235d47b1f118a8d3923b9e119304baabc2fe3c650038619203d9e9e8892a0cd8b2dcb3580f9feec752ec9e1a0543220a6068524b84d4bd8683aba7b3eebb84d4e41d2214dfa058ca7fe76d0cf6d9c051755703634e3e45ed5f856bcf0b4167041cb3c71a78e5db42f8aafe9c1c94a7e276134ed1d957624919e9efb612324de93bd50907a8655411db8844a0b656ca40f84f1c6e1329ca422aad7b84383495b448001cd248249ffc6280eb32c8db2a44f7387148fac0aff029474afd3445e6d0cc63ab5799332a597a37a79459036b13f63b60310218893645ff97cf9e0ad9adedbf3cb2dc293069c55e23ac8e9eb012434ab9de9f1f7f5c2448a35b47f5cb703c7d611e8a7355def9a2eaf53d87b7fa1157338ef8a2ebb68dd16dd842d1b0ba34dd75dec52754bb0cde440773827a512e0f8948b009aeef338b8c3cd4186a840607814f876cffaf1fcd0424869c45324e318f5d4b507d603d03e26f1459a73a6359257ff7def7e6c51a7bc095008ed98a14d5d2f7087107b414f1a11e30e321a71e20805cb70d9a16f0cdeb22a918fe3f192080c3a2e5b95511e286a074cacaac8bba38fcfb4863443f5601d38410c7f3861aa04a4347b891670ca4f010a31dbeb664d910c0f771406e3ad9d2b68b318ea90e620c6e293eecec196bed9d1bcd5b183c1378518bdcc1794107b186c5a2247d8f19b8a8604df6ddd0280b368e48fb11979666a24aa5d3d525b27c23ea8865086db817e129171603e1c121d4183aebe9b3cdf161998c5609111e28d41fc3e21b4ead80a0baa0129fae4d1f0e006f65eb6ad9268e52a7cdef8309019459d6bb1888d78de091e363b5446913a9a3fb0f688c81f1731eb5d0a28c2be480fe1558230b6183c8ee2acd68060fd3cf98d443c0700702e90abb0c3e2c739a0d7e3efcd017ee81b9a03f698de4c9f85ebad7367086226c75d34a57b5b37d964bfd30898ac4168eca3dbb0971087b394c331895ccc9600abb063ba2012bd769646400b3378db0d716ff1d45a827c3a80066fbf62c82f480079d70a5b4787fdcb3173d8c237bfa61d18377037b10fa8c8e162d1ef94e3f0b382928f5ad1825d96b44ec85163f10330f6f8d07de7bbffe4a8541099395d00398a9543d5b1e867e42934e758e431e53aa4efd8b2ffe7cc1b4198e41f0c23e49ff8ee6e14c301b29aaeb984a233a6ca3b81f4df4e618e215b54299871b5717a6bcdc9bc8ff4d51c9166b65c760dfc45d80817ddf84c9740e5ec3fe9afd6075a367b45c026be56b18a7a63d38cc81a98ef85ea65a339cedc5f2758929a47608a90292d63bb531313602e8c47027e7a46848c2bb484db15d12fd6c613c832a1116d69d071f418d0fcdb1cfb3f6ebd25f1fc28e196aa1aab9d2501d86e65308cf1750e89099b7b0dc3efa112568fe3f7123e9bfd5d43fc458adc2506a4ae2eca251a26ad3bca9dce3d3b28200eb27a7dc7012a9de95d53bf612c648e090fa1e030c57474b30e55496e8224457165e2f5330e5c92e7817a35a5c90298fb45245626f1ea8c00c1e124a00ece525c12302ad1a0af39171001458592403f52825a28955aa5e6ee004cdcf4e0440f500789e6b714d370d68a4b3015c084de6971e9072a6f632e45fc268facd22feccc254554304a16eb1502595770ee8e489d2c55d71365c22458b24ba718b1b953d8776971269f5c2926b0ad4822bfe4b56037cecbc321503dd19d970889c16b9d702242232ba90f8a37faba0fe883739519ebfbca019b9e9586b28373eec9e4f4096e4da2eb9b5b8dcac8b87970a6a0f6e699ffde705fad2196aed80e0bad816048e901c3102db30b9634a535c518f02149c0a35d530373bee5db1d0b6ce0c00294e8cf7868222343fb1be6c5309579236b23b84b9b7abd261385036769fb8865a5c5682c6fe16bf035a7e77b89ac619b0c748da5dece8eaa8eb60a6f8f1181d04993102477cae39891fb8cd5bf586eaf2acb1b2f470d36d5ff951ca5aee6d5d44f74268d18d185a8630fb00b4fd89779e21f99facf8d648582cd0bdb9d92bd0e846d8240614050fdbe4fc2bcc7b24b8ec99947c0e8030c4aa6078510240ad2372c54c46ff586209ea8b4ab8e16d53390614db15b1773904d08fac98b1f814cb0ff3cdd1d8bbc4378b1ca29f35408d380ce6c53bfe5070f3c01e4e668f2626e3296e95b731d81343b962f018164492f3918e1987b36c6cf46a0ae0f3f1528f28d0ccb4f003df31c39427f22b01c7f24045c92e1bde34e0534248acc0d9737c6f73f900493ef8938b0caaf35bd9494a7ef7fdac05a2b9d9b848cd2ac8c972e55791d587983628fedaeeb2d403c7cc9950a73d0e443cd3739182163d92e42ef360926e84604b5ff5c4a18cd76c4b82a06b1979f556425817c2e63687827c3157d21d9722a12c3f92e6f4dc280fd96263dc10bfb7626b6cda5739afcee376b125a466c8ab6f44076d46b871ef7c6c68b9d02d0becbc6bfb7d3a49260e324075097c88961732f4928bc0d6ed7d295ad5b3b02cd0eb64b3d9dfa1442b23c0e8a48ab4f9458b8eeecbd2569279cb96ebf03454f14d4df50d04a0d9378d2c4c87033ca54cacf0422d9e513eae14577a2ff9b8ff29ae5b48445bedc2fb2de3211d7dfda7130a5cdae715bc7ec21a7c5182b650e9d7393968bcb07bd233dc80919af51a0f540302b62fe5dc088555ebb279571810402fab0d9d5ea9486dcb2bc10e9ff43896b9aef03916d02e9c293cd912eb8d23c92ccc974bb1039446c6009a95e0a2d2f5f7e978e2740546228303e5d61410dd8132fbe4ffbdc585175dc16a03b4f88e225f7634a52536084a6d91b5b28a83f85f5f7bcf14d873ba6eb8c2e9dc6ff95784a01816016cb8a0f5b00a3c5f66291bfa8bd1a4b5c8858c73dac3cb9dd3a7dc451fe0f4163a42616bb7f68f69d57b26f62d92f1fd66b5f0016c43d4dcd0515f3b132e441109c8c0d55a3149d4081484f6b466a42745e331d9d30b61269c644092bbc5845f18f88471364d4e6e167463f18f35870e693555a05d442a3301d678c1da2469838a7836cf9abb883343227548db920af994da34c8e1ca78b63cf5cf8d64655390342be0b829bc72b3df1731679ec03fe88d307008d133ccb895222e66cc6f109c1e3492c5dc3ef459a2046e690772ce6dbe44d29ce048ebcf980e5df1913d5e65374d29df2424fa599d6db0e723a06a27edb95c6924fffaccd8bf0800096cdc991ed0426b20213033e40b47427e933a8d3667de743a0f32a45217248bb2f9446ec15807050163660945362040ae893f8d29baa108eed7a2b35365b70764d854722b200c2e03fdfe0780570851a6f9006c7950550be2f9c442aab1981f143773cfc4fbcea8593352bc37573b6ffb570283fd095bcd81481287b337346e3d76d573c62af2a067937a6eaff833ed78d3ff74b2c9ff949348d140c2ab3a27667e6e88e5904442dec120b154a80e02c69ba8e0a824c126a58ef6108da8e204eb9d6901a25e360cae0e72340bc871335b59a181c3fd79d4502253006263095ec7aa50676ad1d71091bd822be5d95ae0b28e5210b338e04bd67c2ec47adcf31007bc20aaa49c525df20f7c1f70d0ced04a0318c0fa549e3f930f9ddcc760b39397080f6965e4958a302c4489cacd095e25cc2c9f5318ec11beb077d0740fa17fba83100e9cea6c188ce0afec0d310982385bdd57a60290df47d52c4b1a401a359c412277f60f4365ffeab3b6e999e22d286b175a584c93bf93bc7ae601a85230a5ad89f846ce2c793d8c3141ea5f5f02946f7e4b28cdffee929b6b8f1f1e870200e48d078462106bf3dcb1be13ef7394ecd07c8e6188f376d39d89db7c329805dc63056097ce004162d821f1a3278692a3ea2c1e09da880f0f62daf8c5a6473bff8c4a4548879a98076f109a6e3226f5101178a4f0c4317c98f0fc17bc408b41eaf7a655966c521c99969e55b863746359342eb73cd0662d446616d77110995ecb451bd15f17915e00b142f1de06adeb50cd7643c591f12407cf31570e13fbc8180ca4df3069c61cb4b043c3e97fec4628ea5dafdd2cb418fe4879e40cfab697af1b821626b25f39cb6b8074160399784401933f2eea8bc46c63810fbc405b74ad6959b644b70d171c408926f94124010379672a9db4dc0b265d0639271418cb6529c91b12ab01c9ae054ae5e2a4d03d3b82481fe9f8e66e7e219f4c7ac5f20543b2fcb6af72ec928868dd231363d06e0405d5b12aa2733db510b46464498cc3e2260a2034a573f92f8d9d97639dc7ffd92828d7860a748aae0986665d577b1571073177368ebcb44aad12e7bbf9a1fb604dd254e4862ffb39552fdd07bf001514e75605ed659a5c7e4829e06c57f1449183129fab373e7ca442622171820eed2bf06379cc3177f12ed5fe42c4eef208d8382067c74dbe372d709250a9c0efacae6176fb2eb62ced80433253960e2518a3cde1caa9f91978aa4972c29e82a24730014689f4816cc525225f8868c724e19e350b31a5ead2381a92e446209b8895d9ae397ddb6e17d73b66e268b1d49a24bf5272dc30925f12048188dc8b32cffd0e8fc3c4819f13488c0905059e99a2e853f5df5744f3c635a9da6652109efe59df231d9b838a45ba882bd71ef8346b3281e3f795c0d08fb679d3aba634110ab97f065bf6c9f665555695594c910ce7b62b58963b4de51b6844b9a66aa24c023b82ebdc5caa479b0e0f4b1fc4ee2dc9d3f189dcec2b7f7e9b8346a0d735515db6bf155cbee03935e8ddf51258aa7771cb4a9af6da100236dbd9e5965b618c88c7573b76603bdff8bedc2a03e7d8f7098c95f05d09093aebc9da3c76e9b8698ef6b1296322d9047ce13040ddf960bac42dede694609d1094631968fdea38896a03884a59ec835dd0e228226a608a2064378623441d6834ca2585424f860a6c89b9aacfacda58f058e03a50000860cf7a60a3a48a95c5a7345d10c2cc6162d1588e56f0e0d861a449e877a6743e2578c50c061d976e5d18e397ecea535ba430365bd42e4bd2e5fb310c825962137e479288a2d23ee866eeacdaf93f9141801623e67a1c7e838c63c72590a869b9cc0c2448254680ea2d21009295b56ab1384f46ae5e9150213b94452aaea5d257b63bf9893d2fb4f0b78008882df9110d1718e1b2f1552c76688ea73908e32c14894489c2a354846a918343b8ad89bfcdb7511689a881cf16f0f14e7a3470ffc30836683567369cba27062688ce4d224b8f6749c7daf6be9bdeeb71c5a2bb16e58a60de9090f80cb34359c509bbd9bcbf9bdffb322a9ffe1f69b438c42605bb0fc04b2a2eb8002e6b74f05b11d38d3905bea4748f35f3e3d7d7ecdc42b44f2ba6fbf35bd5237f7b4c725a3ae0fd32840f411086e81b4f3d5a19524010ca74040ac4a2d2f2a8da413d245fe7fa8eca027734405e1fcb8af86e545bae99bfad45eef2eeed286cd79b4cb6e302513008211cb8d7ef89c219ca30558b3b8bc8e766dc377607779778e3055992e73d4655edae8685dc2ae58c746eae198d4e50bb0050145cf1af104dc4fe2155971ce84bacf27c07b31ea0ffe04e49e5549755c866b7ccba62267dbb3ff5631ef94470fcf39e081fc8c62b1d5840c04dc2360dadd39983d37f10cba73fc60a463383522ec3d1567c54ca3614e1bc4eb8d88375c8865c0fa9712f9ec62dfecb8f85eeceaacb7e6e5a81c93c32d01dd7214c1c0b74879bf3220b8f82b4e444025aa5357038acac67ac87f211c9aeb2e1ca7a27fe6479b6723d1939d95c171b694a6f8a66fdcf1e570774d938ae1ce2391924435152bb31bc88900534c8e5833c1d90528276e07ee705f7aaaf232fca8a8170a4f4c2e8ba5c52758b6e0d760b46c7f5f83e9b2dd7d0db665f859216c10e4c3dc00a392f7af14e35fd11f8eb1576db22eceb1d43105ac5787ee253c771f0bd230fa8a9cbf17f03eeb565318815e8053efe905a55fea9b8ba099ab8ed6b19750f25e17e759ad7056dffa661f8ba3c9c8c1ca394abba0c85c027e4b1f368e65a451e79121f3406762bf2463bd818987f9dcb0d409ba68a41efd31d2724a2567f6eb43fd347093cb0f7b8e31613ee03470908e9984894ac246120433454f0247faaa46b632c8ccb3aacdc47fbc927ef45ba978c32c2f65f551ffbc3c66304265e7252c3553265daf4cb3b157f926056b9ebba8ff5e35617d7fc37c7db2a4ee2c346f5277f20a6c7e29eb5f7879fc58396e40ed251b0c00573b67dfe1ac85457ea50fccb13d9296cbb121040891470d8c07307c1d454f1ef05f61aa9c79c05726ddf640f3145874f9a034314f603c6f80e7bbff935566df28d7eaa2dd2004e9cf0537f58da6c812aa485215cd7b9e6c2031dc9ac85f0104accb13ab2b0e3dc3c7d3f0d3ee5433ef813f07ad5b4ab24f721e56f8eb4e79f81936339d2d7469e58c8c4495dfad3ac0be05fe86e3e540d8c4485fe98894b843ef9d2dcac209542123136fb03a911dc6295e70039041b80d36a75688d85fa43f4881c1abdaff81211e1529dd2baedd24f8b4f1bbd96f9cd5fd24b54715bd9cca9d35d2e9ed0a7cb7b4ac4348e6670a49a13a10046c396cc901d6192b7a8a2ec7dddabc05503eaf70626c252f0e4d291714fb3eccc6b398a8e62d747652ed64446608c40a499e603b19d18a7e42c2aac1186d4ed42cd8535aa552626562d21f00bb019765f9ad5f3fdca28932c37e3b5a376696cb1f75a7678c64f34f25d7969e46615d8887216189859e79c1cdf8caf23c07e1da3abd5006e33b97adb5f147ca12b1bc77ed125520528dccc99698ae97a917c6aed8166ad4d8167856341eddfab1ce0507e63ab684d02721fce1f249508d5c9071710adefa5cd537988cc3052980e0a35eddf4b854077dd2c20131bf781991b4106e7365dace75d1cdc6b4478ea57d7b8ca55cbe6911740fbc902e876b8e6fdcf4f0b6281b2f4a0868e97d24332df7af3face89cb2422dc980f9441253c09bbe8dc70a66be36380b6ee291e3b63e23cd7826a26577bb52ee03e7c521b6256d7ed56f2dd87daf20133ca73ec09496f4ababc49210d6b0664f8cdfac4724a31ebc527c1c0d52d0e2b344a291781babf76f2e3772d9669afe0c0ff54e01a8d82db669c484b965902d576ff8f7fcf92e8129058f1c0ace677468af9d7088c62378824a30f5d3e2c89f5960572a5a7071b9225776841d252fcd4e6dd62b3c229e97040e0b1498fc34bb8833e766e5a0828d9d528f3beb161d8d577416e5f138f8a67a91d4a6e2e0b1c33807c5d4e9f7aa2ad1cbb24a6ad73fc98d2707768efd1a83713ec082c252ed58602a3a9476a731c9438160fb9f357f41d8c0caa9274a7c8a3fc36d6ab3640bb391bed568f99ee22bf1f564e1efded80f0262020bbb8d557a4d7cba7204888a89a448e978c229e7eddce182a918300bc5aa7190a0ebc0b179374083fc98e292940af4a9c1da6b5a23daaa5e4d407727bcb83eaa6840503c948b4a45a2888176236a2566642e1c0848c6e6d17fb5f571988e3ac5e6409e191a5e728489323dc27b7b7b1b49734852b935a3fc7df99e05f31e91f25f1b2b2fc28bb44742dd213d7e6ad15d781340364f27cc63fea2feb1d72a02328f2ace54febcc22e4b1848404d9ba0139c542702247411e400246ff117d74de2b18b0c1b3e160cfd7bbf28717b5693a91d9854a0a218bce995bcfa20e94abef2d2683ff6fd0ee714122ec896f00d907d3773795ceac77c36773509a37a74d1fd992957a906d73c1e3f433646de00fda9b9bbfbd5fc6d3e6022909ef0624cba181107fc31fca869c713c33e717ac2ddc741339f21c07295422e50f9f10d2e0d28a021df6246df066d446b7404b82959e4cec525cc4e5cd95a0f4448ca5d5f5d810700f8b700b3c10aae17046ca9cde0152fba7ba8855fd0139706e784e0c8c48f8ce88d6c05d8c06bb303efc9424edba69170dc5f085f59d24385b2492a003c036f8ad5b9d173293094fd1e71f0757428aee4dee07a74dfade8e40500cf0ff786a326259be7b371af12ab4311e8488797cd01e5f7b4c6818b4d6d1a871bb714c5b0dd925e6e4ffaf0cab497a596c75cc8ac01f5b3835ac4f6806734bb5b1b24d9985cf02bc0bab0d6603cff308f53e0c5806871a3869002a540a84016d711c93554fc5d8e569e69f3eca6b98e97c56a29b120ea131f4559bcc977ae1716b414f852e5ae43c214d2f084a5ab238a22c4dce1b2b41228d4b569d74b327fc9ce90d94d7038ea1aea4c8fd775257ccd984a5bb51c1c3c79d383ddf244e9060dfd85782f6594b10533d939f1ff4c829301f5a15d11ec955569415b421e3eda63026a70efcaae743ef9579a916b57800f62af5f48ffe397dc8d97dee1e406f7d8217b60381ee1f610f858547a209da33b2b5c3832fc5410a4e0c34cc1a7b413c191dc1c8fe1d7cb5f51bb66ff6db62b2be2cdc7ac165148353556dcba71904ea780232632932e020c33852d7be0db8f0372b04d73bbb93f35caa3dfb5e8982c56b3101ec3ffe1129832e91dc27af7d3e3c8d7bb12c537d81de5baa7aee8a55ad815fbf84e634d94d807f3e9501d08038b83c93422975c2387bbaa2c0d89fc81730fe41c7963f61d0c9dd36b47cf418bd2163d76b7460b15f607bac925f290eb29eea2edb11af0774a998655a4768c6a3ce3aa703e52038e6e23d4e924513d90840c9873849ed1484b1fc84a716d6c9ec08631009ef51e523902f9523f0a98377635299eadf8925a7fe7bea15ff6f1b5e02538ab60388ff1cab86d52f00b2ea3c7a19e18f35c14f320c0eb11f5a968755ec52b825cd0d0d987ff664022e82f68a6124ee601105d7a434bafbb5d88628d59e7b9e9948515ad307362564566bba74cefa66c907f3d0089dbc53adb72078ba2725ce2dc74d0a550dd6123b611bff7e2924793c35594c2e971bd4a13adbfce70bf3757e122b5cba99ee42930c2bb47e387f6a6da1a699f51ab4104100e3cc756748db49e72684d3652e36ef9e8714ebadb53bd825cd34cf4e0e44691437874a5afbe5c02b0cc78ce623a81e9bdf45c6a23f9cfa401ba7ae502ab4114258f420ba35fdc939fc10c2d357000ae777ffd91516a62a4e5928ccf19d6928ea149d35e0ff7094104333903d2e27a10f22520f0a0876c72d34eaecc101170facd16066e74e71018e82ce49e0a1291de8fb5397b5c3b35bd0f15675ab765013ef2d0aa1eb0abf69ca20d70158b48cffe9610a122441abd00ea5fca41a1a3e4d9aa49a90001f3c2c92fc63a0180462142642897b41132bd92b7c22878d8840f7aad028a818e6416ec2de7e50cbd7cdd094dee6da68f6acae7b21b9424452784cef86ff2b03d24f293af9fb164e86ac02756c4d50b6762b6732099aa8f5253cdd6759d79d3af09d0abf82a6573a8f0dca6692ca294c88911ed1ed053a1799d7ff047d8973faca9d87db452396b697712093b18e684732d9ff927ad92115060700e11ed098c37244a5e3ffc0b35e77de9e4f951cbfa6b7d1ded5e1ce65e704e4e05cd4c945e858254c7451c7b89cb6ccd32f75e2019527483a25146ac1a4f0e55800f8e08527974f9f52624c0b6f2d03f86e29c107a405760e8ebc17305d62cb2a8dd00f4df33ac8412dda055ac8040e570ce3b88bf66b174008db1e7f3b8ff1c210e0417ebdbb76338a6203e316da53ac0b2a6de80403203c27e4beedb640d85f3639636ab126e7ec393f54c174e8eb9fcacd92ee36bb3aedf34bf7e8ab2dfe76dc5ce630fd786e344d6541a1c642e59943a389035a9a6341d5f0a7e5289592c6cb96243b32bac6910371ffe8585f3c1243353d2327f89c8faa542eeb72f468d8b435b0d175198100f7bcbef34d27e1381d1fdeb7f9f4129e366bad1566a08ce35429f78ca9cad6465f7ebd43f2e051ce22fb8ba6619e45892796b5118b1affcb797227ed709c09c802b5707f2350e50d7c7033c9b4116e1a4637984a20fd4f2473311ccd2c9d807e82f91ae0129ac68e6398176ac441f6f7bd9cb99206120954e81e9e2117066017efb3c41f0c5016a770f4e85cc5a5f118bd8bf19e9ccfd981e102ba107c4851f892256e30201f3808ae8b81ee4eaf75c9de54d6fcedd2b14cab2168f7d754026db2ea97c45c9dcb651bf0360731231ffc6e9b62dac28dbfd9cfe107832f47e0693c47a82847e8f9c1d44adcf931e4d8370da10e586755f4504e6dcd7ab4cc86212b82acb94698acc6530faf6c7523d8d5e3a8b45f6e4b823b83116a09f33d12fbaf30d66f980267c3e6039d207c057d36d6d7d80dd5bfd5337e104374bda16d06ac78197652c8847e0a3b800922a25bc5e6708c43e2ca0528104f95d8512586210406a6b5c8273a53a14eeb4339b980ca48142a2ef97d6d2ac725f7112d6454c01539776d6a92fec8f5a87571f364ed7630c096cf2dfb3c92ffcbafea4e78b479e26297a5d7d4154dd4c20b4ce9977927c0d4f87b0fe735ce8335486d683b9eab9bdfee266b11421d1d8be64360fef9f59db4fed2acd7cc204a97472618335fd3556f995a948ff315b93fa26f8c6b6bb177b669acc882402e0073eb50d2029f83b22c074d6dbe6cc9209c860128d3b28025e0a56b691dd56625b7ac4270fc8e5c4f97b635c41c7ef4c9ea392aea5acdccc8faf3ec4779bbe00ba127efcf06893a829aa6400f4087a80546ef82263e5189b17fb5fcc035931e1cf1a2c3337d48f1a6dfacfdb0ef2c56555dc05888006657e047b839c5dee012f95b0058d2cf89287af20c06e56fb81a8383b2ff0712a64570038dad122b031febfead999235e6cc55f327201c27d19fa6b21d2796f3df47e08613f0d2318c549e7f9950dcd2c77c7720807c90376ecad53a179805523cba807020c80e86c740f2ad492b5d70cea33de21b4a2956b3e7c6e2638f974da84a41f09e59ce81fe8e985e807bde408d4f147b80b0dbab83426334b3f65158cd6fc2e0a4923d71e16f86e6c413f24debd14380b7729f81d3849ab4bc39b5b2f0dcf588ca62a302250b72eb8b56d89c3af52882a3d46a73cd61a2cf5c1f6e735cfd76e417e4a1e54957665260ed6558e290bb9dd96dab71ee1d74fd10c0740c47d67b8a83672e437fd88d47d33b00d4b094cb4162baeb52b0d193b65db0c1ade84f33d69bf53e1d8c69779c20eaf70c4991a9dcfc1b58dae396a74dc4f5e5179cf66d1e6de2728a6cda96f66ef8d8358f9890388d35da28fc3398e5ef81c8edcb7f152cacdd543017de061a22329c6c4d28a03f10b06eb6ccef50f14ca99d1b7af13adc281309da159f0828cd65f1c26f85ed3b1aedb2e0e94f9f3b2f02e191099909f272cf96f22ec0673932da34893baa7b374c1ae07b749e3af7b5dc7b8d9d59809cc7f85ee329205927350445010a093803153a640f34d9035df185997b4ffc302848df370e0962905dad44cb0401f9b370e865956424856a22b803cd08c30be7f189e577be836f93d32fa1e645214c5f7168d03a35bb7475b7cf7a35a7e4831917f645a54fb6d64a18f7e7d8c60a21cd2697a44061a1422ceb93a47af8461dfaffc17039eee1320831236fec5d03502cc4b750a858eb73c36e398e7889f8e39076d322e643c6a157aeccdb2dd661c8af331f7e78e350bdc1532090d2a73684ed6c4cd37f9387f29704285b33448fb3157b881b9760732afcd49c9ccd90a610b76b575804b18ce2eb51719cd91149039cf526bfcf9b69440b4c75c0b2be4180ec0b06d6543dedd3d07d01862bf0c91c2d1572038e775bf9ef033dd716c92f3a1c3276ad83430eccb6b7fab475586b9f6a1f48a0cdb94213dbe3bea78471138bb37b0b8235deb381cf88e7308b2f009f188c56f8247dac08ef6cb0b5028050578bc247c7352f197fc2c44c24ff0183936c640bcd974689bf9949744ffea2378231e24424cf0a027343744ba038ac4568f5c308eba9a0e2232c23b86c880f7391d7c8f3d3af0384c8026d16d9da0d788f5646e5c7a86c4e88e4606aee64f4462438f0df98973f9970a8200f4644ecb30a8394332460cf87f4a49f3c7bd56bd33b7de40216def6e5bee2d654a4906a908c508ce0837bcabf06c6cb1534a29a56fdb94726ea22b59fecea981fb6db3d339aa86eadbfbcf18ec14b923efafe715db3f3d040fc756dd5a48ea637099d239a7279d765d95361dc5a5ecff757dca75a3dbf65d61628b135338d297fe267e302f15c7cbb7c7f09eeeeef5bd39dbc5e29ce204216a72db3b1492673f4f6e6652fab56bce29da76cd14775c99794e969d544ed189f07e2e957f020a3a7744a244e77a0618f80657f2ce92edbab7ecd8aa4ce9e63e2512ee33b8a3ff24727760f7dbe07eef31584a65f5db9a51b954f77912e8dbdedba4ce8824d5d912364ae77b18ffe1a5cd386b21d7be7b7e9221d7da255d74c818c23552b323bbad2c2e44e1d66ebb19b33d87eaee75d7dadddd6d74ba2f41e7e6aeaab33dd766d13927e7923e9d3e99cef9336b4e27d7f36b7b7b8d07dfc1f754356bbfc122f63dae95f9004b2b2e94513d1736b92ca352fd8fdb70158edf05553335c07eae76ed6e98371f4facfbcc0d15a7d8bfeaed096fbe4769a55e2a888a3f0c2fa3c2350e7384ac94cdfceae77338dedcd57b33e1fb6b54b203be0445e8def3f8b335c2068bd4f8122ecf910fb02463c3edd7b0890dd171e01cfb9dfd1faf21138edf5dfdf48c91ef5722bf2a04c39951c9cdf5c407dcdc94486bd7f5bbc507dc5c164fa85f451b57bba68f1c2c3f0d0b36b22addc4d936333a1b186f7b6933ce39a7fb943269fe6d255eb5ac77e9dc71070c3d15865044bafa7d944a2e9ba76abe8cb1e8e2a864e66e4d81f0e48712a87b4e17bfd0481156fed8440d93e2eccd00ad02b0cc7b17f2d78b0dd089ad02b0ac7e57dbe50175511bb990bff8b7d06941d265556c02ec60470673e9cbe901195a40c195e15094274de43ff693cb2fa55ddc45621331987efec2510d1bdd87cbcfef2cbfe6499b2a8b0091fab1524a29a5df852930b9f4e973948a305321ab8b54fae3e7d1671596d4bb84c5ddda1b288248a5ab9340831f5011e6ed9c4a1cffad46a06fe7b713e7482d052ef5a70d2c60c12b9b94b23843362979f1b24834eecce25d91098290637623d7b06fbb8b3daab0ccb9b8a3c9f273219d12670c4bf270e2d8e4b2240ea78cc833eec6b2613b90ec46a7ab28d8638a233a5298b3590e7709f77c7f7a0341d07137a7a1148105252b58b0aaa5ce8ca48d07eb1db15911c10e965ed9a464d48452110d02bbd0216503d4e7944377c39197a4440e1587a1549208681ccda8ab3a5484b66aeb6769616ad20570a0477210e2926aa0611e6d494116701b6af48a0d7de406a779c5cb0d383c55196a3d624351b522e0e10b1967a4b2d8e9041786e5aecc4006186e0732b8a89d01850c8fe6e09f3f2ece10d16635b7d56a353363633337ca45d95143ce6a59ac3969f775f205b084a53445e9dc381a3a6e9b20d75bbd2e65c9a920307d86c6e6dbdae774f76ea63636746e939b93dbe874e9eebe35edd9ed8100badd5d4a29e58b2c56adce524a297b56f7217d235ff2bdbfebb21b47159eb461ae398e9ba1b1b93fe7c651ee3b191d3857fe903129ebca6be71c9d9ee23c9e0c82a46a883dbd56f9e37df27d865c9aefe7ffb79f9fa7d339ca3598606e766f8a74d26905e56a974a75ee74e38ddbeab6554e07bbbb4fea73dbe69cee3474ef7142e10e9b73faf4d0d52ef91531b6dabda374ce39e79cdbb66d5daabdef033f4ff1078220087ea96e73e9ec7c27a3836bae14afbb17711bdcb6551b3666b649e7067ae19e9df781aacf53e2eb9af0ba262a5d5921dad09ceeeeec72cd66b319078245582c2a5383b6e0ee2fa3442763c3b78e725dddbcebbaae6eef9b10e5991236b815073c69c375aa956be887e8fcecec20f940203c48591921dad09cb31b976b46e98ccee86ca6646a380d8b95aa36b3617ce5fa0b96ab61d3fd8e1a57a66ef7cc256c2578ad943ecf9cc50a6fa5617d4e9c1cc4b36d86e396402e94a0ecb8ec57824166363571c4f59feef38be5973303527039b32e62680004549096788d1123a88a1aac1081105dd40053450358b6e8a20308b6680225043c24357de0043d8ce1aaf3838a5e9fefeeeeeeee93b57829d2ee56a2b0e288bbeeee6ef979d24c2676b8ed04940d80f39bf5abc144d0ed30a6c0a951769c2fe5bad7ef934c5ce1001721cc888285a02ba49c6143130c180043e6965a4134c6dd698a7c8e09ec4843d331962d31bb36b7e7a793f2827663072a6837760803fc6e181d8581c40d377ce9061554f42001030e3886b4e08063c88b2e3870181d79c12345171c38b468e1916286c40d2aa8e841c28c11c7d559855ab4f04831c6931cd8fad374884f611dafe2456ed4aea24b9f7eadd6b2c6d71981e9c35867c8062b0035ac3e0bb4b022004c9da056832db66edb2613da15ad3f3333f3753f7ef6fbca81f5d7608ba5330df3a7b55299d086a23836f99a00a9ffdec3e7fbed0af92ea1cff27e5a86f47af30321c0f77b0f4195e781d7f3aabfbc297c217772663be26f33efd7306e88c4a14f5f46c636902ffa34342038ea5cfa5daab3512b5e45e7367daf796668d1a2a58b962e5bb66c51628b12f43dcabddf71de259084f91c061ce155c38792a79db82a347d15fa8e0f4694c4614f9259b2aec4a2234539d2a59313bf76d1bbe9b08503176ab03a2c6dd912022a6ee8c0430e545041dff37290389487fa45ff0699435f7e5f39715cfafc84871ac64569588de5944429a59d139183983c5c21e4d9c8b407a52fa15fb398ddb16631bb5f274940c7ec4c49c338142a072410412a7210df5438d385d6b288681322c0f841698b1b84c0b201197da6d1e721a6491cfab028b6c1e924880476645ad0a543e48b7ead960eb9949b4322d3865cfa33e4271618e29e4e9e537419ac772e7084ff4bdf864cf317fd55c843fe5a6ceacadf44a6b58b3ead6172d23e232f78a4e882c3090ed0feeabf281794b02b150de0c7c1ade228d1b8f48b47bfe52ff3dfab5e7e45d2f2aff132bffaefed83b030acbf44622a6917454134a15df47b6eb05efd45594a24cf7cbe41c676ae10519a7a89437f87ea5cb974254a7fed5c4ae70c76dc9197be924741058628f88bfeacc1cea70e7825758c1bd704c973c3f20b97beb4a15ccf32b6c8384d9f671d935550d9b404e6f64e95db3d65dc46e5179d9bdb5adcd18bba325eec5f27d508a8381162860509205a2c1a16a54fc5b779c2f6f34c6c81c0ef3598b0fcaa213c6933a662445ebe37fffabbe879bf231c9b7cd077c76fdb8fa7dffa607bca811176e47a34ccc7f3f81ecf60111f3cc4b1c9e5f11eba7b8fff69f77f09fe08411a203f6bc213685e5e4fce1f1f8e7c1f48d8b7455996a7c8bc045bbcc5ca262b4f97c70379cf3f20334082c63a5aaec253244eff8f260b0448686b449e022494796fd690ac489cfe59e35d355ec8abc607f1defbd1646bc069a526fc6ccc2b5a1ff098f3fc4d2e510e5f2ecaf9ce11b9a8269444dc4cf2d8dcbefd5c1137a56140be9f33923c35dfac0f22b2fe258eacebb15e8838daebb1de250a71fdb8ba2ad67b2f65ccc3f8ab5ff50d1a59d5fceb25aa30c2cefbbc3e007f9fc8f77cec83bc4f10518511789ec81391d7a7276cbd44203a780ebee73d8c1071ac2e0f13fe7c4dd83589d3cfcd6e7cdff871756ffc587bc29fef20ecf91bf651a8ba123440cb3a109ba8a7ff27ec79831de714b29c10e7a46142be9f9b499e20dfcfb1207932f87eae05ee817d3f1724795c3fb9299cd35f79be839d0e44a000889c90bf3a96c4e77bbe4704e240e47cc4564dcb0867f04cdb7224631baecc644d6431cacd6a4279bd20a1df202f21213fb95a8260bb5ce106ff0a87bc905083af09f94e9ac7b8d99cc23d4dc439dca4719376e794dbef65000b390be7f46f100ee9d720e4a7902fd744fd926b22d5e755afab41ea465dc54ed3a9abb849e2f46710ca1b24642689d31f0b5b35ef53e3f33d4fa4e6a58cc5489c165b35ef607a83de416454237a54bbb2581c359c90c8cd946c8e2f82c1ff348b913c4274fce803e747d6cd8ff6e600c08ff5e6c8b17a7d07f9aef9e640f2b8fe821fbb87a3704ebfcc7bdcf7231cf9fe78eff5122c12c445c2cefbbc0447e0f99e97601222df2302b5721e88c68aace7a58cc84b3049ec7d44a0160642c4043c900e0a96a0c97c3ee6e5847c7dc28e628a24594f4845e73dfe7442219f13caeb1302f18c8ca39a8c498783ac47a422e43d21e1cbf5210741b5abe33105c8d77c1df371c49175238e1600628fac202f0ec2d9aff9ae90a3700f2873e6051ca55e1a71e44bf37e6bfea7e7d77017c8f7780645e0f14044091a11c3136a9eef8fff08df26a4099b5c311c97f8f50f3f16b6e6f77cec8984ad29aad0c10d5e9021038a3d931b3e509151f1f77922af03023b72b3f0b959c3c66e4c18b2c25f5ac25d1edfe37b7cff4d28af8fb0e541edea967fd852dad5cf236cb9d844b78bccb09c90c8f5bc60b71fb9d9083ceff30c8eb0f33dcf601222ef23026d5da0c8883c834962df2302c92b4734d464b1fff15628ef8eb0c9d5118e3e2e2b1c25971ce1c8688c8dc4ed9f0989888c401b128dac3b32d1c81131cedc711a8de01da79196db1c378b8544420f0a596b3ebf4f6e76fb9b0128b8401a342e2c40a30c59d7acc04b09664e6060428bac9f9bf573421e14321ed14a99c71f910370a09443946c47acb150cafc0b9b9a794d36e81f18903c5d6ef3b9f724bf8b1d9dcfb56ecf89b4677b77579e35af746eee9bdf34e7db9c9b733ba2be78e1c26474544b1a8aea7298b04b8b5076a6cc6d74dee61c7ebfb3a12e3794127be1c2a454546474d4dda88d8c9aebad46be9ce3e30597c51b51dce8744a69374bc09b37a658ee99d38667d666ceb739e99c9b3bd7f5438933e774e741847577ef6aaa86146e9fb4fb8d7bf93adcc32f3f03eea9ae9b99e29cca39fd3760e09a7b26ce12ce0304fd1bc7f1008165ae6eb5a35dea9b7121ce6917e21e793be5b997fa5cc8693ee44429307c970bbd0b813bcad8e1b4d9ed77211e430879a92ea5722189d32f24247964540d1378fc1e5dd55c6fd5d75bb517d75b85d7ab0c60ee6eb3c3aea9e1bc602dbc2aa573bdf9f4c93993d239e7f4cd9b07119699bb8f86196ba7c8d16dabf629cd0cf3bbe5e956ba3333f320b2feec751e0df57672ce5ac5e6e6e8b66d949b3da1cca134335f8d02aec7ea079de855e49c7e33e990f030aadbb66d7476b30e09328eeea803855579600bc2761ae8b6d8ed023a58ee0948c392131b6ceacaa6a516be0d3cd182282f9a9e782ac25acf091862a846292c622cc01d493aeab078b12dc17464092ed562b9c2093da214c53999451b962c33389630144b520d5d6dfd6c135cfa256f6dc24bbfe41dabc58202189858c25284109621bb450b68e430023482bc235bc55431c6486dc06e5f98400c549415aa2936752593182625c42c31a5d1810ef497cb44aa6f4686256a00a618a267664468618a1f4ca0d4250b0764a3bd0500a38b101c31845017626695a1311b4e6d366be1cbfc6666434998f4e2850b17262625a5ebdf4832d65cba8964ac8b8a8c8c8eba764716ed8e4cbbe201942cd3ee970b75e51d594ed020d22f5877d2b40ec9437ffe0eeee19fef01f7f4cf1f00f7f8cff7f92e4bf2d43ba7ac9101fb3c5058f923cb695b743cd3ddf5afc13dfd343637d72b95b029d6eeb2682bf0a84f9fa292652597285c5e725932959fe5eadd264dbbaaf8817d0cd92295134833303e275fff402b6308249a4e80c4ec4b066a1e1882a988128ce08a0f4770de17587af87a5cd9a424e6a6ae6c520ae38eac252e327cc27ecdf31b9b78874ed8afb9a5abe63bb5c1e0009a14719beba212d79553b4699fc19bd629f723a59472fe537ee3fc5cac4daed7b0b5a8346b1597cceba27d1484207178b258b56ecf6ddbc6fdcc6cd44ece56a9445211df7c979d7177eb2fa71f1479430adbdc12f4c93dc39cdd73dd7f73ccdede5de67c8953e79c2c56adf367e857b9992a7e96d2e7c45189ebfa532495ebbade7a5358e1da76f5edc219dafa400589e54e5189ebbae824a60234efa6edfabe4fe8221d50d251d35a3a5598574947ddee1f8127254f739167efb65ff36cdc55e2f06f3c8d565e535f53294fa5dee54ca552a9944b97534e3965737a0ba8ac3935d871da509aafe31bdc25db9d0c869de30d28acfff8513a7ba37736db1a58939fb94e163373c7bc566b256b05efe35f76a67fbf94b3ba49454ae9df7627e39c136a7b2af9ced0b64b7e3353a4ee330db39706bf7d98d607f4bd7b098ec07a1d22500592921092e9d01102dd5822624a910c884737360193b09e4a0b04faddd3ef3ccfc3eeb950f5ad904af760d84e3ff0f713542a908411763c4d12d6b75e8207d8f134df0a81747ceb556104d843fa5c4875f0105b4f03c46406216b8954e8c3406554e6b342d6fb8bbd0c3bb2ba5abb62a959bfc4346c13534241ede257fd06be9d516dcfa952600fc94bf244af7695b0450d1bbd5ac7e5f28fdd1397e2b6e72e97e236d506aaf8825fc39b76b18be3cdf54ecc89c172af1295dc5cd0e3ba4e1c553f2ab9b99bf79b38761776ddff34d0ed3ab00b479d7bd3dd5c501c93dc4e3c41f5e08f492ef83757f560add6b258a999e7c860dbdd47d573e30c475054727339d1ab794846d819cdab7949ede2df918383f56a0d93e9988ef7c2793dd5cba854cfa9649ebb31f33fadbaf1123422f3363ad6d71f753c9653fa4f3895d8f2405ed51f915da70ac19477eab71c0f86e377abe3f89f6655d1653e4738ce8b43ec74844154ec8d1be2036eee8c7882ccdb7899eeb94d877b954ae53e87a2b48b7de060fd655ee6c7499379fb32cf3fa334ccb99701f3e54b54c3c6ee88e704769cb4b1e3d2b0b15b5af2586a969a2d5de60e9e6cf734afd57fbc0382f5d3a9594aa8436a5852c3a8d291c7586237a55ffc6277e421b58b5f26f494426fc9636a17b8badb46c19075db5d1c95ecdcee5bf5eeeedea5c0e4d6f7b09bd219855d9576a95a2a55f793d6b1580d268dac0c5deec0205dfe66d1ac328f2ed72ecfa4cbafeabc03d3b031350bd3b01415a999c73c24af26b412bd5abbf885a461c7d4acfbd1ab5dfed4cc53421e933214bc3b69a9a1144d060122386a97bc68d8b19b72f9c70e4cc3402f1d94aa53fd686fa702e704411f0386dc4de98c1af689a9e7efaa34ac7e082a2c5925d185a917640e7f0d5342a92089c3bf852927618a967a12c34dcddac52f83fd3ba666b368d2e6d037cbd1f7074fdadcebc56668ae213f595a58baf2a5bcb97247de513a5dd9230d0d4b67e75d520e714b9a2b9b9aa0e8c7cc4c37a71c3577f78d336a5dd9d4f484524ab9da143413c5711c57bb26a6a71d4a50ca0de0bef0a44ddde6b77a5cf97d3b503fc9401150b2efbdca24a5021f64df53a13f02984014a3198e907202207690f19be03109f8501483079a3882882064fc4848b820b07f4360471f1f010ce1c1cabbe3bd307d76c2fc68e1336ff747e6ed76787b6fce190eb934944d52ccee9c5c47bbb1eff60e7eb085f7e8fbf96143d8ed6147b67bef3d2f7586df1f7d46966c3aa376b97b7e1b2f8c0b23b25e48bf4b3dab0b8f74b1f3e5f5427065139393cbcccfac0773f96d7c927cccbf31b885b39bac10a0ee266661b9b04f0210a25b99dcede79c738670670a9c0213276eb8b472499d0a6617dc296b5f52703ff0aab85374d97cbbf897f8181b4142c7a42c6af584db881276f4a4219e2479941aa6c348248fcced2741f2d0edf9d26f19d92e3f7fdffe0598a0a44b3061863a3712279479a204133c975466dd7e65530b68dd3d63c9431a364a251f01346cf4244fe24bd3ae9d124c4042c2db94600212125a20f8e53fe2976f240ff72d5d39a1ee84923cfde36d5ebe37e7e49e25339c2614473472475772dc13aa61631b45356ce42b378c51c35af59b5f241877fcee38c554d9ffe3138ae7054bc45969981458b35352bba4919a1ddbe87621054c4df6e39bc87e3af94bfef56612472455e0b7d1f7aba586d12394670750b6fbef2754f538a2762959175b48ec8162fb5b4ac35a943f1e8ef3e9cab7e138975498abd0689c45577e0d55982233f1921196655bcb02c51f7b4a7314ef8c27518a3c1759a640890523198d0c329b6f22c3200818179dd9e3a3c78ff6f2f89145e467b136c3494b479264a9afff91bece0cabcd304752aefc9163baf2e5c84db9f225734857d2f7975d95d2531ad622a15df265c33c2da4d3150c80b02568615bfd3ddf44d66ab175009e27f24976be4704a2d2bff32d26e179224f4404e2f92632180e96c8f7bc914b9e22c9e31e6b2a69dcd2e5642c8e2ca7dddedddddd3e8d60b19f4a4a29a596da25534c3fc256921f404c180930b09051f9bfe07f7c13994dd84a62f3ae77894040dee69bc88e3cb17cb9b674fcf8ac1f5d395cefff7a1c1fe46f7c0c003ff3f239988d97cf71e918cecbe7bc34acc60b79f95c54c3645e3e07a663392f9f1353671ed379f955a861ab975f9d740c83975f9f346cc86319bcfc4a24a5631abcfc3aa51a796cc8cbaf47d54ac73678f915a926790cf6f2eb52c3983aac11c39a9a9066c64c0449a9d1c4cc09d788a164c2052b778e7165188621cfc2fff043717cb1f5818f386e7c933bf34dae8d6f726bcc7a428e27e488843ba19cb9f4218eb587385a1ea2eca711c7da1247bb431c593ac4f159e2e8ba2327790e71d4b938c229a65d37422a3413d22736424a14d229ed922f13d2a39022b54bfe2aa44bed92af0a299776c90743fa85144cb8cd52e1d685dbd026a55df263e116a55ff261e146f397fc0dc22da85ff28784348c0621fdd22ff91984f429a44cfd92af13d2247fc9cf09a9957ec9171252237fc9c709a9947ec9bf09e990bfe40320a44efa253f484867fe92ff0a27987ec9778513ca5fd2bfc531356c4c0d5dc911754c03a3d96cc6c21432be5cf95c15eea86341e0521943573e57e390e473490d536a986c2283e9cae7961ae6d43197c9efaaa786e4cbe7242127a928f253440d93223f55d4b07ef9a9290deba4b090fcb18ddaa85df2bf083b368972a57c8ec87fdc86131ab9a12b9f39a2f18210a8c6125638a9c998e0286241f6e38184402011322018a88c0a931984ec8748a5c5e2849a5fb6a7916b779c50a13746544d26e385afb464947a89c42955da269432aead92605a54bbe47738a1c2f9050ad195f23923e78e9c23fa96aeac61c26a62d341a6c870673a2b4598b9fdcb220398af5ed9c454e5ceb46b1382e9037746a6e17545789164440cdbefd7632f4f51ccec8c6d89c58b2828590dbf2b649e11312c78c4d99d3ecf1a8ada17a762c69d6e98a7851977fc66b4a199d08ec748e857bfdce961048c15c3f2f33512860545d08000fc19dc910077fb0f34204095dc7205506842b21ab678906de109ac2303f2d6e7a6c0c00e1ea8608a1a6ca0651983070fba2c65a1e20250596a3d7880c5d11849ac309ef0c18c2a76bbb2c907318af0210b38021f8c5881c087293757328da97df4fa9d9313ad87f4a6c0deaa256b8de4a991382c79b6cdbbdc12879d29933bc52a71b8c3beab7f974b4787b5d2d161d513de0b125bb7bad5ad6e75ab2bae229fdb64ac44ba1c4312575499728dfae9afc02274c9b61a33668c51511422292a1f1921a40d488942e3273c042ad9e121a60509b1936f880d27275410b482189e793a3c5b41491498d44d8e0d8011028c9212bc40754a5c50252471e2526d688ec0c0824b120f38ea818f44da686c96c0410a0fb954092b4893079a746c5c3753c90c8be6e976edec80376edbace5b8fa9bbcd62ff71604418e193366ccbc324f9eb4a92e965b967d16656666e62a8bc14a99834590d0f7ea1786c3b87f52d2d29293d353fb1121ebb55d8c81d6f34feb5afdceacf56de5664f44439bd3b674c17cb172fbb72a5b9018a886d13c6d4a4960906eb7b6a2dbdb93dbbfd1ba6c4e6e7f7fe9d8f78bdf876efb922709cdd9ac8db48842d127aa74fb29929327262f53681417305050a61d4fa58049e2d227b3f925c9c6341a2365d2c220dd197f6a988d7727a4309cdc2e92eee4f6bb1015b7a17c00a198e0220537ba6041d5415d38adda8976d2c30ca802e385dbcd546598b19d6ed33c0d588466dadbfa1658a435a463489ac78f3e37017249a746d3fa1d60119a9638d27cabd56ad1d0d0d0847c5bb2f24b09dbf13ac0223ba6b5d662b9568c2ed7da677d716d9318385cfb2cb0887da8309a2c8e30a2dcb022182bb061e365c022366c0aae0c184faadf1abf028bd440e2f65753ac9e58ad7edcd5ea0b29ee2aca03771565c61742e8d8a49a5dc98876258ef657dfa3c7af7af8f0f1d6c7df55c8f7c7633ec41e22cbcbb0aa26958a0395cf1d875cd5165745e4aa546f89aeea595fc6b8aa7f2f9cb8aa77cd7055afc3022b76c0b9441736d45875ba3437954abd15baa9153cddd4cb2d37f5f4ceca4511549395737b0935e56e5b9dbfc598eacfb3679779f463f91d1d99c49a3a3a66eca893071e90b8d1ddcd03726a0ab923cd953bdf6e01851651f33bf8216a369bc520e36fa6e78e34363743bc00c1c30b521619c842cbedd7d12204b7dfdbc9d2e3ced0dc5c41658b0a8454d0012c5ac0a2cb6d9def634207d3e69c73ce5985961b2a64160eaa48c38a2db7ffabdc7e575397daeddf79eae1a90a13dcfe9ad48130a29802054968c08a2358a404798076040e45c8a616222cbabb91a8620808c7ea0be0a0eaee6e0e32e75b167031e24e15c829ee38b32589c64bb3bad871be0d3f8b8a2b6e3fb1c588f57d4bb8a80dd5aa60b2c20219059e0082056188f1c20d5e649da4fb7b5e80488cdbdfedee6e234a586ea2228a3be70f41508631cdbd01800d5e98c2346919e3e4e5f68c189e9452cae973ee481de9ba51b2e34108f29b2c8f55d1a6c9b0a9ae700c3b63bd874dfa481e7a5fb2a823712a06a308aaf0e5ab3e1822f16c5779132710dd7b27b27eb0ee5c4f234e7085433ac105546e65071311453d84d1c5164bf87c4182220a2692b8c28b2b19c862e342c61b63074a1db2e3f3794c59aaf007c4194d86c0620c1baaf8816826460f5ae4302b0208a21b9040aa81c6ade650124c2cd120050c332c82803206151d4801172c3ec8604412403c303f02f0208454970503ac77813429a594534a773a5d3e3f81a40117fc8827580025051cc8c289042f946134d3e186212832ba033879d881c2819ab4e503f7fb5dbe03a5f2ad3f5c50cba28b1527423c41238b0ddc5a4881b401335ab882892c415a980b1b1b2b323848b3234b089b284c1f70c126ca640aa26d2ebdb28949ca1d594b6978d2a6c78ff57edcb7d5df2800f5904206c4649bc956cf04031995ef196876e14482251913190b04c956211597351f77eea8fad9b3711c9d49adc9ecf6d31480ee17e6aae4fd56df7314bddeec393d4b144be134bd59342c098114a4f7b82ea200b442bba8533a5360d46958596a3a9d84281d66666625fd37ed52815d28481e1a9abb64055e02ca30939560f6cbb2098da8cb328aab5cae4d6f1456f8b2448c3b7eccccec0e1a616666669ae491b9cc83e4e9e7fadcf114ef59c75903b227046e4672820397e5f5ab0a974435cbe49549b2569d40a15dfc1b78b14cebd80463c61c85c8753c86c443e01e259cc3cfd9be8c44c45198250e4b51c2fc4cb91901227032426f8bac2471386ac6cf42fc28ac60240c4b53b58e28ea4fb91498f0d1fc2de42abee4af297acd5ff39bbbfd07cd85275f6a675ffae24efef4a561adfa39932f754677742f9599d96bee568e3ce1a876f98b3f296969c9c9e9e932d411211d978a4824ce2c807ccd9fdee54e77bab36dbe10cd39d9cb9d93b6cf1a367a4d88695e6bd80c9a634c7e72676d899db8c649f3fb357fd6797fce6f09afb7ada7ffb66ddbb6d1ad678b38b4f8755c7be5dbc4609b48e2348792651020825abba423dd7e172ac052775bcaa507c39a719b85db39a48f0b72e418bb3d76705be7ca6d6f7169667181c84a2eb7bb9b4e8b84345382094848f0a5cd89276d98e54f2a999959cede361188896c030bc0c93611c7952ec9a3e322797f8561b5479f4efbd4dddd948698dbdddddd4da75bdb3a3beffa6276d9939d943d5c046cadd6b258ff2e17120f736b483483bed4997b9d55a14a6bd8b81919352c48caadf5c9e57f62e48a1d27adf3ee7fbaab35ace744e2b196398c7e1bc991bbce0376efb287c3a4661ef3a70a65a32ecf3c0cd19c155d66eee9daf85186138a0e32873f154e2993a85da9a076093969174d8525f6a65c6041e680626a7686a55766093aba50244f04ecd441f670df9207dc660d6bd9e7dbd5d4f353278f6d42fe5a7acad4301ccf34cc657ea25097e9930ded4cbb98ab9f3856cb52899c137f9d19ddae7164a55dac92f96dfb54297077d42eee6a1d52bb38295485a9998754aba774897cb16337c6766122502ff8ee9fbb7feeac59ea49bb6839949c3ce62df98b3fea3d28d65b9fc18e1dd2e5efa28e08754a28e5c4e88ed6469943f3897762902cf76307e603c3d5f5c24c2f343193e63ce5ba94cb516ed7f9100c769c34f113394e6c75af7aee37b1d58920b0d36c76bbdf5e958505a4ebaf0a67149e4f6a761694128a8126c6aafe7b951801ceff0b3b304c5b256fd7815bd7755dd7815d0786e31230ed12d3b0cd0bd3899150d0260b5fdcbb59c3462f4c8ad6b0d1137339a8619c9aa59e5c7e310d6b81708207a1b0a8048d57553d0a15a201010000000043150020200c0a0684629148244b3461963b14000e778e3e7256341809b328c75114448c31c41042800100184308819a1a2a00766067a0187d451690ce6f5b4083e6029ab844c220e6466c90c74fc562f89cf080e06cd0dea0f5f7377c061387870013390cdc4d66bd22cbc777c51c8a353e079bdc8781ef3011f74856db01f7a4eb182fd9b2af71c6f02aae2679ad50824c03a62d71115ced540a6f8fb2e57be6299c0f55991131ff13badad8cc2fcd1d610d7c92cf6c4d32794203d36312ad1c61309e97b7a9309ea8c86615865cad86480dfadbe08db847293e915616262cabc770aaa53108814f039ead86ed2b49e4a3d1eb6dd5cdeb1050e177807dcd278b020656aa6eaf3591bc93004980a89730f9284766db2cc5532891cad5e6207da738e3ff1230668eaae4cb44f1e8eae72082d60b7f668ff610c1de22cdf12a1a1274b9bf617acc5cdcd3a86c817a2a891311c4138ca92f5cb4af291404dde6f878c70982d0b3140081fe0f1bab77675d7602ce68966245181bcb60f3513a3c13ea7498a2d60f535a1470b05110ce47a15bb45d1bd5ca051cce600fd6e6149bc0992648c6321a491fb2877f3f46f5fbcc0fac8b314c5304ac011c6ac986fbe179058113a281bbf033563e71aa54c26358a70fd8bb23f9a85aa0708308135081ceddec37b3525242d85a29506e1ab411962bfc8bbe66713f605b4a6c8c4c384b0fc6bb043acd14258a280be1b0b020600dc6ac287df809d81097f788cb156e1f9f1261de8d0f25e38b1e729a0b0782cbe0eeae7573e2c1e8cb960c6e0f2030c2f865a8b70003b648cef69a9ff22da08c9c0980b141047296970e8988d895397c0d7781914fac423ff209b8dfd75940ee0ab4b11112a2640c2769cb55dd21892c199ad285d623e971ebc96805f0d8004be8caf623fc201410d9175020383db32fc71472116120800d16a1bbb17c4999950c11388ae22de4518946e06f1653f02220cc385006da03d832a03208d69e22e43357b4a3400560bc88d8f824740d591d484cb884a905f80f64be65509851a16defa2a1611e2073704e5ddc0585dc73163533d5d8eca34fa8529b63541668511a60b6c5353eb436e3c7ef8f52336e7859399b66dbde9df4d97b0e00d73d9f9cb0f01e93dfec45a0153aeb632f827ff1047c72c89ebd50b89c7c10a984f81c5930011c752000bcb270e47e33d076251be8047e39c877e6c7b9244495caabe931cceb4f8426da6218f25b1878bfb475a32d50baf834885b189a177630948308d0deb0981b22a03623999d191415bc208e46adc2083880348fd45855af551df20d2a58bfe85cfb653bf5e3b22b8bbc9e5b978a750896571814c0489994f3726e96907ea16362301566c3bfd7cffa8e9a1f94f66e3da1e65d30fa72cf74cfc0c9aa045d81d167f70d494e0031842fe8c33fbc82566918580d5e6d4a8c196f4c32d507975f4d0ab2239aa5905d28c55dc288926854eb734399040d68306d3ef4a74ad5b65e30ed265d30258c800911a3d4729c8eb342a73f87d827ec7f5eca1011e21ef927307db6833dc9fd911e2b0d547d10dc44b2745afd4bb39b0db104bddb815f12002214cef28c875c4a36a28d1f05461762cc58480f6c32f80be7a3ab9e1e9d9c27ccd974f414b0874e1336fa4f9ea387423ef4ad70ed7f5a445afba22fb745efb3b8b2258853168db11c72ca6295e8fd095cada2298b4a172b18c1c994f816ab842d316a3a861e1eda8bf1817e298b7842165fb0eafbc8fad3d16cf4629796f5573af112711428f65ad19924699a8d637717d3a36483be7a4626e59533ed39f31222a774e249cbd6799030bd2da87469cf852deb0e2329cab75194287b8b5c384400e05e30a09851ae8a022bc595935a28e5c0e115260404b63e2a30a76c7e0541292d51546f7a4bf17d46608447c9de29bdb50b256dc219427742a6c90951a641a97c481c78762bc0bd6b29e1af0d2aa8996f5309c3a027ffa5245a073d25cf3245ffa1d7aea59eff5c43a588da4f0488e97e2809a1676c0fa3516a367c36c77a183a5d5f930ef2de15d960322c84982977fe4640a123e3aa6eacecb3b039a1573e8421fa03c4ba918d12a2cbf8d1d69ae0b028a15a422f992f1207988fd18139e236e22fb8e1b7848bcb9df93372f1bea97d993b5e74583798cd154de0a71b4e7e53d35a346ec205aca748d1e5f6d886ed0e2ffea051ccf43248f69cd99bd303797e492d9ca946d99b335dc27661e326c806c46bfec5d72ef017d35a409e37f63825dc50a3326fd43ba23d440f05c086c59e6f22d6c6f1e672391d61dce519a6a7d46fc2c528d922a12c06f2dc405d3546136db240a2cf87ea87ee5cfb668e5467148f8f35b23e2757925c91b9f342bb3e5f05685074a17acb3967c747c425a344fe9295d0899a6f44da7ed8e225c329ec16dd2f9f3bcd4e4159a55c062c6125f635c028aa4dc7b7f1f91a805c5a64ba0011aacc116961608878e3780d9b5e62f01d5639f25af81a4fdf9a7d0e159abd58fe02b58e8e4cfc9e6b02e53071061c4f6088488c766c243a4b8bb69bf0fbd536e59aa4997011ebf1182c9a3c5ce8b4b5782571e11b70c6013e588b2bb16fa078047c7c98233f27ae93aa8f104e11a4de0ebbe8b813c428d48483b20856cb9d219f9f3fd3e36a95a28acafb2ecec901111e5f093a39d7d7d1613fd51ae683a0f4fc4e55d4050bdae2b81fc7954883921c7f3f367977316e898cd34ef00ff67c0475467b5e719bb206d49505da9a85a1174075b573ab39f968d966e3a2d5591930212c8646374a3415835b4553129e680bf442306026f239a7abe532b8329c2c505b6f2c49fe2f08ace8741f954c8de4a9cffc474372736fbff8656a3c946585d21eb20513a7158c014329aeb83a52b163a70aa25c501d9b39577a480212b0adafaaf4373b2b1d1885b301392720cf467c9e4bf02ec46798a3bc89290d49f0b425ed8bd65a03dde46bb07e99c88146216f7b507d739499bf11b944cc4c4a34bf452f17c13ce3222950addfdbb1dffa15b5937d8d336b3d994d58df5b9ff17e0221aa920fce212012fd0e7d89c496242c1d2af1057e4c126dd00b5e01dd1aff2ddc8295d4df765d9b002ba0330b65fa1506e803df158565baa39dbc7a8dc589eecda11effbeb8d30a3f3bfcdebd119efad522993869d3e498d1c9c9d0ee349881abe9ac817eab5453882c38c0ca9d3d8955110d5057ac61d02467e67481dacdbb52f657615f18639344ced19018b061629e6d16a618445a21864638ec255bad0589bee113bca774249aa08ade9fbe048ba85c6ea2e9265380cd5cb67db3aa378b73e154ec36e857b40ca734a25e55984e9eb095ed183da564e27914377f754a834a190a4bad714a8344d069c833385d90d805b8a8a121274f64302e9610e48ecd4fdf3b0db8ed911b11e5d2388eb3ea7bb02a7583be36afc8540112f76cd5b94d470a826d261e71070e316d2eac91e0d86f111aed158f7414a01fa636d53b7fdc5490e47f3c6ada79266ce310622b9d7d0ea00b49c2821e7c0ffa6f33cd893d8cdfaaa82b9e688ab030d91164c600d3b1a81d92f44fcec4adfd4d0c7b574be8063442a93439a7118d810a03c9ff5519dc680f6948fd3d9c0fdaac8072687ca904f4037b2e17575ff9af161b01ec5ba9b8a1c4e2f6bd1491f929f47b338c2d138a071d03173dfa5ddd5ba074cad790c384ac1cd6fc6a183dbaac40074423309bc0cd19308f4497be8d1c16138427d1ff002d0367dc1d8e5ad7904a263c1fb8312476de581389592c9ce251b52ab265fa84f64ef7edd07701cade87b1b5f577e78b560d6b17d0fdc5ec2faeb203dcdf8e003d425a8f82b884eca9e41263ac00e30d6dabbbb4a7e4051e2c69c2e3a27cf59c0a0552339ac0f4cedef280fa7c96e5e8b756f9b484bdb2cb25e6832371a542435cc739ec00015d94c896007b0368711a8374ba57dfdd3be60bb6e19d04b510b7446f09ce152c10bd6fa46f199a47d5413f5933a853568a8e34f254912137307035a89a2e3decb4873c08c803e30810915c95c0d1003e6366560e2cb2fa1381eabc0cbb95c81c15b7f41e899013c50eaea60713ad05273232429a929a198bbf2bd82757dd8c9d8f54d0d5c02e1075d04a9485728774eea26d44d4c023b2aadf1159bf0069fcfa1010036e441447d1308d0b4555d5f53224d65d85c97553f8c0a900173326e2cac514bf0659b73b780364a25abd3165953d71bfcc227fe960ac72f9c09b9b9abd848058eed5f1b95b918367ae63196fb3bfb60475ce0a92255831fc02f0079cdb8b1612fd4ad32c341d854acea7680ac018635d444593344c757607bf38d4a52c485cca29ba2ffba4d872a8f477bf661e555b214ee15bd62897b208fc57aab1f0765e74c4e003e8895a1a621c39e7fa4a333eb37138a9ebfb1462bc6fdbce0b10e6100d81543485db283535d5bcc18c6db172345e3fecaece6aa63ef90db66f27fe38ae1b491cf5dfe2387e021dd538da5e35423f4e3d6585cd983d412260861216b6c1974d9c015c70fe01821e3505d955de36ad443d0300ec2125878d445bb2b4461079c99681da1c8df947d709e72784140f5898254de0a44d8d947b556f16c98990e94a90bd8aa9fd7dc159a8efbd56fd5d7d9b64bc1e52db56be1058319bdd55b0f16ec5831ef6dc87dbaf085f9929e81df8859a8da2dbed1b92f03fe0b8915e826ca65b8fff2a006b51db2201ae71618ee6e210241980f321e12bfe09eed4deb83759a473a567dd16a388f4495191d3d83c6818e01ad3115f1d26ba8e50a6f1a0858a688c597d95b7ef70574518f405980013c7b3e6d2a646374c7a54e68f1b7ff944e6d7a15e66041fea5cd05eb1b1abc487804688c27e4550339614a14b51ebe4da006b4a0d267ecf0da60d9e76f2a3915ccfc6acf3f11a59c1b3bacc176a888b5944b868133fb80c1611e294f1df07bbbfad19da3a96b872300672d659840accaa6192221c43bf1a64b6bf8645a85a8e18bd9d5c7209408c0d5b9dc503e86dbd718a50b42260b93aed9c416d3b16e9a33e4462a26a0db111cf61b85b73e2c35812e56268f1e5a25ed432efcff124513d81756ae0cc7d61bbf8cba8b463384befef2c2bfc8e90f6a124d06afc82570d6e582f73bf34b057e59474502db1229c0a09483a5f0041e778bb5a2bdc8fd1b91226c452a30c753a3c888d5156dcc76eba7e2d5f126b30a6f44a658dcda5d3b70a5fa656421b2844e68459a988a1bf6df19208aa20dd4a190f2e9df280a74662bd004af93b7c4b9708afa656ff6aea36c75cc3c91f4b5296b95c81db905460fed414f790bbf7b304354dcede510cc9d523c86dc9e011771942498ff178ca373c64589e495837b43e3a12996b3b96eaaa2cbc953b1bc5c80c18e0ba505424f4939b0cd6d5838fa69f3f4f528fdf20099438bd0b5be215ad99d18857e8b20cc23b53de1aa4bde181b46e8556be0299a79cd504e73681b0c8d9f3a44e9e8253052d834a4943cec9d6d8f1abe8badc674c0e6df7c6d50a78b4c95177c09122e8db8ddcfc4edc9ca16b0aa0c5758e959906bfd079878ffef87855649e5f64c0f3eb3cf8837bb7b0ae0bef41883b1143612833d93e443a258f1279df04682b7b6691ee8c765bda73255fbccff81895e379badc4ebfbe084b18d2ff02984586a87605e705fe8255a59c6fc02cc8fc0f1ae97b1aca4f429609aad3bd7a95445274ceeb62e4f93b93a2177f3450a9366f1c5836b9a244c75b18e94bc5735ae7b40a213f555463b6167bc083f2a8063274bef9fd1ef0076b853064765002fabe0593750607256a88370ca284e1b595139b802c38bd21d399f6310caa502f994d2d17d2115ab8ee85018fbc9c9ebc95277c760ed1098d63af2b879c8c4bd2d9ea9c386226b4a8fae84d42e28f3316ff787f10566d4673ebe244eaffb88ac3e0599f6531b193ef2d04da79eaf4f2ceec87736b89d7519c941d07863bbe10d571ebe51229c1bc0e60dc731da0bbca709e2549f4a9b9ff935a383caffb3eb9defa1d55ecf551089824c98a8d5d11d5658b2526b40e737016410f78fe6c16c6145acb5378a3ce3179984b7c0f984368aa59b9967c47d07df9eb1d5ef1e937e7b9cf6c8a5e1b55c1ad73e8a57842e5d1eb681a2e182e0f61b610c2a2d1c410d98693f5275a7478ca9111e4f8c76797e954107048480170a6f533c8e1effd109a75650cc08e18ae80100e511fc1d9a4378713c159fef5273eb3916215d4780785cf4830103a47ba6c6d8f3fc75286902fb51c0f332acc2f0f9e88fe66d1efff92732c2c3eb3ae6dae913869bb60a4c98d8405a69e4cae68489119e19d87fda9629effa9def6a5512db9417ebba230df093b79ccdaf5d83ba40eb190361dbb87b206c8d38a3514a2fb62042ed97d6029e8f8a510143f7c9daf6ccbfa71a5bb288ba753ffe03e6f84cd7d409537005fc69936e3f1d4bbe5d4f426798585eebf3f3db9e2b7189d911d4e9aa3e643baa0bd420ddd8f1a29856a13cbe864b7f50a7f5164a0381fa70e9112fe0304efc90536d0c8e4c6057d758b427563920aaa96d47e68da7958f378ddbca396f35323a44819d55b4b93187b45facb13f3548aab82a40524360b5954a32fb8eb74a8843f8a59c2ad3d31b4519dc9d44f2b103f1937258ec2991aa9fdd2ec3fb9cbe716d5fc2e94a1d61b12e199232754455203bf84597a884f0e012d651f94122020a19579c4512d661e364735d7293ee9e2683b39892cfd690e8d6eb98d6edad3c061cbbdae68447c034206c12b222b733864724ed114d3aaa489af4aa54d3d4af4bf9fb7443f51f2a8abb0f7f167787c9f3d69772a0d2c6b230b52b9bbc32f6eaf826cd1fb5d024815fc2bb46b78758048e7601f8e76f1346df757e4c029464c27fb259748ccb0d9a2dc568de20d8d1539725d4b1cbbac3611c44cc6fb01cceae4f8fcbbff59def35299983118cb2a4fe7abe87f96b41eda02e1a5d3ba702f0ce07b98719e9f2006934e04a14b0ffccbc1cb1844da82996ccaf37d0925f2e961441cf43d8c3c84e3e15a4acc5aeee6f368448c6bf62c2438d89e75c466b2e04210cc685a0680f8825e86da903508df0961f8d5c98b0d5b269209b9c2fb9adfbb39b055a758f61f0f55c4bbba7e5e077b9a6c5a7a25d83dd851dd86664976ed149270cea136503be5fd31c56da08eda98857b0cee21ff55176e17dac44312f72ed5f559a7f524e50785417bd789ae410f26e9df6b99c93d55aa3de5d701fc08abc7650121ea35912f34ce43afdebf6477cbbefe7ae010201fd3d6a811f1efd4448fe6dba8d338763c8edd44f490c2b6e42ad0b7cabd6dd29af1b53b13db4bee49f78327f9495f11803e06ce8ef741115386dfd9ec182c464a25cc341360ec8a6a995d6fdddebb3ff0df687500d376fe2b9cfe19c433e1d0c5cbb968206e4713b52cec48630010df601df83f8e6207a07e26c89bf99ebc292d7f74c40970c270bb5b02e1b93c527ddb9d502652a62b9c25f4973eb007924ea591fdcbba09b08c1eddc854497a7704b8f2b3d41c6b429711ad9d4ccff9f763014645df57121a11a2a157882cf3c40a27631b345cd9bc48b6e8fda39951cfbebecd61fd6726e80b8bf8421ef927cdb8647c503584e026894e252025f738498a2824d5c6a7632939958a725576f145e0c88a0298c51d48761185a9dfc1ba82c634dfde779e31d89d705effe1cc92ed4c68ffb6e25fc962908d1539fa08bec72a704f99697aa6a39858790210c99a0007c6ecca5664902163a64a1b63ff295480a156d7baa5c1fc9709b76eaaba123c2791a8c04d66b98f39acfe99873422977a682381f1a19a8ecbd338fb79727593e561ea3bf19932137892d4266bd5155d922cfa37471905448f8cd42875d1e71a3611fa452de58739417120184b35995a323d271233a0cf6e26389b722181b04b8737aa8e700b91ffb833d0ae0a56bf1db4462df22ca55c23ee7c69fe9fe59a2d22f156353ed1e3b6ab9478c32238093da5a002d4f3a2197c777d29c3858a3a6d0d3f06440c3fa8c895912aee784a0a51c5e68c65512371de4db1782ecb0801e82195c23aa2db0e496cf3a71591106966443a7323503b18485dab8161eb444200ceee35a30441eda3d71d8a6da58ad29951ce59a7ead9a2ac4e55f18e55b7585e5617a9168cab0e881766cb0d6790af2198e04026defe04b8bbbacb014d7808270095774381246218df9422a39ecae19ee6180fcc024ba4355fae75d254450b331f196c9d2e7a363450ff5d989f3a5157c3b4b9ca827e070d22af5adc8969c73dd36b7cfd5e9cf74d884afd531306fcfec0b51b307685858375b9bc0fd3a457c22d8d22c09f3419baba6bfea48ebb436f240e3b8bcf4f9ad5370f9fa09d7aae2c3fe900f19ae88ec831ae1de921cb4fe0ebdc6b0f692cea495774078691aa34468534a49151b2c94f7a3e80599c9a841c9229fbef5f9bfabef6a4bc10050338bdceab5900df72419ed43478de713999add75e71800c65498098060d0a241fc319a798953ae3a7d3d87a0f0e9c67847b91c3909075103d307d7f7777bb8ff07a610db170a2e033eb002cf26e426c4e919381d5d23edb3f139b9a4d51403e7fc38aa072a772c388bbe2025049aa1c01218687ce2a6e678c5db6de46fb770c4b181a9bc992c04f927b62e212ec7062d051578e07091bd5b5ea6cc84b6c28b7132af0b2dc9df677fa6302c0ac7ce76645aa478a64d8ea9ec582c238624067bc1453a25d1d1c310019988592c340fd6489446acfb4315da1d9814df1d31cc49b6588614e8ffe19d6535605a1d20f6597831476243b6261f01a898267e531564900c786049b82fe4b5d38e1f8a180dcdcf82d253613c49d0e7ca110bc312a5a014b78f3ebf16f24de55028d57deff0caf046a431fb3a2afd1643e912ccd95ef9d644e1cd1133fb128754683aeee21383eda858915660f00b0f4f2c2dde5a28709c73e9b9af0108838b92aca28ecab8b61a464712a1da2a2110ad319ac4b955e89cd399e167e7d20673b6b6ed8a3b26c5ded6faf55bafa306f7d45958fce0f5787c19cf13cb5d82513f7693d43ac659d23b9408218581ce00f9d96c7153a6edf84cc5269c1dcd9b2945b81db4981007c6368645b63c8f755dfc3e241d824197572f6e9c72b69df630b4bb06ed107aa8d17109c6140d58b2a1c77d2c0848610dab52a328334a412d6b4a42f4255ca65d69a6f6b2521bdfd83745b26b65d58b6914152f811a2461052d1aec24c31e65c85e3f464de941381b0fbd737aa20b4da223243d90d891b62d1919eb8e8104e1f109f2e8083c24e6ab9b093660c8fa0983579a4feb7e06c22b1f94a4e84a775c1e104c3cf09d6bbd6bb3b92171b0c24f888e3fa11071d2b5487c6ea408a25d79adb58f2205ac9c02c05aae4204996e0b819ff894083a1862cf5a8d192994283dc1411cfff526754de772a5559f3d24479f77f8dd7d519c1d0385455c1b934225efb9f86d71f0278afa21fb14a0deed4312fff38960ddcf81e949ebaea452322439b0ada1441e2fd7d8830528020331d7d874d55babac9eace452eeb1e19e63a8a02271688af09932d291080805082a22b9d46347ad398455f4691a0af2eaa97eaf1ac0632f6c7f2fb49f22e0bb12d8a6f9244f9760a8d7d3b4d6d359001c83cea9baa56fdaf35635ef20c6591a4a15a9dea7200c43e5440905e176e58d70ca5bead30d80cb2427fbb02785267b5568b6a4876038666c2c1a315438a6fbf304d0b54dda645694bf0e2a1bbb8e37ebbc47efc83ac6df313854f6d40ef2e87c8cd8ab3f6fc05f753f2aec55ef06dd46e430023c5d9938b0f435016e3fba416c753d5a1774f4858032c79892462683558a0e2f9b5c3dfecbf92d8411049954fa364030c2c0515a8ac35e5438901654ccd79e07027dbb707af64db495346c8fca560c3a229a57dca621f0a8de7d1d3a53d35e3beb853010c45add3d13784b2c52f256f03f488d31a7a79755639d5fe0bb3069b69bcdde9315b61050febc2b6ce967a92417bb2af854b52ca2711f84940bd08d30ed9f72e5b1e2b217ba0bde52c8402563d60ac85e96182c5bd9c5f3120e5f995a51bcfe050afabd1be48950ad922cade3dadf3c62802556916e50ee2a25e25e7a5b88da86ba96f73d2c1c9005cffed120cd5f0331cd05af3eaaca2559400d5e26aa2f728d71ca19e026a8632138de86d66f2d0b3eae25407ebdc558ed996caf31de9a8ef93362d03f0cc49a47132642f0ae253ae223004bb79c72ab01ead0d2084e78acb7e1246feaf1d9bc62ca374c5acbb64be43fc791b51fdd7b7573db021c4535db2ee49cff246f4c7712ba364345df235779d7992da6ba4cb3a961f9ce9dda9602ee9e63780cc9f3d4bfa75cffdccea7e0608886df93df20b0cd8d4d6f6e63120d9cb42de6d88cd1d369bb693ee4c885c31c1a4bf55c92d20d98cdbf526e8de922a0039cb751797bc32a5015b8205e076e1d4d68c492e795f271889c738bf3b461ec7d05ef1617ec5ce8fedc9c35f332acf9e2b02db4b2ae34e2a73532a674509a4e62a26f30e136a9847201ace99b845a83f12e3a867f4184ab41df1b5c50834875bf0507c9f3d59eef2e399701e769b69978b71c48fb86888689c8c742c3c08395b937adb0e33f8f02aeeb3112147bd95ec780d1ed6db5143a0106fcbba45c1a5553c5d03b1a571e8285f768ef19fd7da434c23ee5704951c5891248a5051e830562c63be506fe116c7c91bafdbd193ba07a6355e1a74e7dd7410517ffa4b43c3df7c90a5e3e7e9d65e3326467b0e9c26862689daa1b4f803c6e2485dcb2f85f881aadc5b44558ac617d91b1102e090603a11bd80298a36ab3c30a50fded20ae3ca145399c25401a39bd30359290e81f44368dbc8d87f76080028294fce96fca942764813314748d19e1d1a731eb358f31699269a04e2be07bc5d8eeea8a93c02fb28b3aba8f1ce814369a1ca3b4f6860ed2b9a84b29649ea3e5290c91b391f4d1e41345d8d76ef512e673b320d1af3a4dbd9ba95d4b6dcb02783e7fc26c60308262af7d1d66f4c51b97b695938499b4607d39b8cb3638fa3c8cea4dc3a338057074dc0fddd013f9383b4ceb57421974a6680673e675776ffe0b2be1fe4c9eea0cbc122a7d68906fbd6b3779b7eddb680613c78c3b877a089bded723593f3a887f12a86649672de7787691b2e40d90f66b465a71d2542a096b28f89b825e8785eafce6931f60b074aee38f375d451f9248b551e87e7d3cf01ae8ba8c970891d1d326391468504eeb59cee3514d0d2ff6701c0d8f258c9c59cddac1302e655b407973f49dfeb0cf9f22fe784db8700bb801550d17034dddf4deb828c016540db6693095d1ae21a72c2871a1ee510d84b3a41022f6967def59f37687adb734a024216ce00e6dd9b40dd4fbe8bebaef0ce445c0411b509a86b7c1f66d93d7b7ab62a3bdb7dd8c9bcd3ae134d311299d8d5ab874036d98d0c25a2d63aa7918a442d504d147401d5c86d1d6b80e6b8ad1de9eaa5750d98438dc820d8f328ffbb1f939169e7cfada2b7009b5c73547d951dab5141154c2205009055c235b980c903457922858c87519ccc07f3c5f8b486c4437c992819f660faf5725832f6fa518dd6113f785f62ecbbbf5edd710151d39f8ed96e56b9986ff0e9373a3b000402e92857049e9d10c17f4043a5932174657655e827aad1c949cbf4a6dd2b114b1411fc490b7898c89182531449858e576fb70ee77a4c379d03b7918f914d627aecb111582fa795058175b02983894fe546f695d425d766f055aef7c1faf27b281afa3e82dcfc68d0087a849ca276166c5ac0460b239012d0a5f342843486a0e5d1d34ab921779bc2a1ce6eebea6c438d0e731071fd9b8dfd5f934483b73bcf62cc3feeda7ee83861cbc459fff4724a453d828b65946804991f4f4288e3d4f8f084d2191efc72431efe7c1335eec17f7c844d3f510af39f1999ca61a205bd5698af7f8865bfaf3df7a1e65a959f1edbbd3cf3fddb909c9881dc3bb88f90f2c1e0703dc3ec3917536047383be7aff39f91e85b6c74a6dfffd29a3ea270e1545831a48a6fc898d25b25a1ac3e849097f08e69d20924b9be6e615c36130bc412813fb94423c5482b9627438f11658cc4a28223a83ed88b211fc1f4367418c52959e820dbfe84823cac3d2ad5beeec0cdc6eaca0af997049598c4622b2f24af3ef034aa4d45ebebe11580e3f518cd5d4b8188c65eea26101924bab434c135db35672e7ce86853665d862cad7b2ba1c6ea874c69fa21d73f549aa5d45e8e00113eda51b3f11f2c7dc15bc17a2b0572476ba3e7ebee94cb91f8d295da6e55b4bef5762b2016148201b1d9029d8ba3fec0ddcaf98b72fc9345f63670bdefeacc41e3962602f69758f4bd6ec5ab1439ad4b0a14bc20239ddc2f82da3f1083976965b79a412f9add7735ddf555b7fb0507a66446b9b5b03f937b0dd0fa64f449068bd69013e9a6109556f2c36160ce8900b5c802edcc513cf0344bff6d5b51ce225bbea48b9e32647f5924d71bb3f757449b5e7f644088004ac0b0a7778594f5a0fb8c0f1ab51917b7d87467b70255776558a37dea4dd917a56d9f53b292e403f9a5783b3d3ab49cc910cdc25c3c7ea67089804c26f1d86042e598bd4b6aa4b5b6919c9d12ed3e7a4023449682dffbc5f99a98c7de42850d0747725d2ee5b0f43662e520aafd635f573ae7bd8528ffa25bdcb093989a4d6f73007bb977133c8aa25a971584d79543f89241322c45be9284236ea0102b6b01fadb32f9784008546509e1b6c4a36216c0e3685495a5eee5f477896f9c2715c0fc64e499e8329f67bda9a462a484bb28074f4b05555c816b0c0440aea2d044a50d4a6310ddfa8950a4cd0912416caf4b304ecae4cf225c92d69ba18aa50b22145f79022d7754ba45d60c951d030e5cc1a33772a9a610fbded286436bc1fc4e281d22d41d203c403f09df81a1553493d425454f04a6b5c8f249767b9e79373a8929d08e31af0d71aed4fff2f559242cc52a19aa4fe87c97995ada369020f5f99c37cfdd5f629f4a4fa400f03bf9ee97d171ad8c5c79c168ec83d2a1e4cfb578ca21a29014c21cefddf135d96ffdcd73617b7b073389692b9ca378ca632319140e5535224aea731e1a98cea752b237d91271578c0eb4ef1ed75fd5c731cf077dad34717eb8d6c879da14ca934e3cebed30ffbbea4f758af6caa13d9b1dec14e6fe7e3fa905b68123042ce843d207895ee2cd55028d1c325a52ac0935bb3506a7fc08ce1a84084de7d00ce1bd265087c271a82972a244ce68669b748014a9bec1d8e520d90b4f82c41830cd02b76c779c9049d337626bc0b0cbf609d0a05f42668f2a21d951d793668dca898f89d62cf0743bc80487eec94fe8085055247e7e9400b54dd36b94d50e9d61b9e842327c9c9912a2867e62111ac8070bb5b1bb859214d7a14297cf5715e7bc521fb59deef6c7613ce1898da5ac47328e4c800280ccfabb23d7ca2c08ff84f84b51ce8f4bbf594b6e6f92632637002f294ef33947c318d5072023930bc4ffc8bb10d25ff09bfc08d6e3c041a0807a51efca4d914dd9672af734f2146d63fef12146913e9e0f0f0cccc13300420c60d0da092b697dda657fa5b672091fb9eae2ead0eeec3149819c8167d8657e695b86e85c1a79c862e23acb012844f06f83ab9b88b00e814348b7c49b9220e6ec364227946acb29104ab516392f14f75cd2ef8d579ba3deb522857d01fd0cc2061412a7b63658b1ba427553fced0e80008d2d9291905ffe906f8d5f0dd06c06a2ef03b5557a4507b87272532e6d7dbdff3975cee9605b952371840fcd017d095b41963a582fa8ad06db727bf1f3414cd0e1b6a62dc05ff7246e4097bdff7d8f40e11c50b79362ca668893f029d3d0006bacb8646c9b2a9b5c28e224c4a3f1899f05f6c8765451bae523ec0e85a9bdecb9d086e9a1b34dc94af1776a770828f8421c8366bf754cef32a36a85c50ca9bbec802802e426a6024c60a3999858e37873b4379f5dfca6dffeb5c9ee02bd7949883f4043bdf2c23aca270787c86e6baba70787d14d5ea405b2657bb653892d85553a95a19c1d83f8bb31a52f7b1d26c83fd7cc78a5bf2a5b848f419c0092ead027ff7939fa74a00e9c4421e87b7131f305a36a815121d3bfd0996f42da92de01aa76d509de07060438b3dc0bc73ac8fddcf4ae40313c34c27a0d46d91a3fc6eaf7ef7f8a17b27037c535756b27c5eecc9cd397c4efac50f8947fe5cecbc810e27c70075a74cdf5d0e4fe354ae53822b5444faeedf3666fbc2dc84b084ba9fb42ffc0b75e52ad477ea4673c6959d2489ef12c10670d8f4f2674013b8122544c78b76a80ac5585811031a24209b2ca540982fac103c58a37ee3eb8809549b44f5190d75b832f83110038b4a9512981577a381c65e5aae214e9155ae619bfb8594e2ceaafa2fe2bfd95e7dee2e51f152f87c95f547222380ddc847adc8ffb9d378ddeda6e4e44a4d353e8bb9cb59f3d3b670371e4ccda3cca741eb073de90d7b4980d0ef3f95da05508bd5a309807fb48b8fa576e5c23b8e323d11d53919afc22ba6f9f967b7b0878052402be36d28c98efdc9bedcbdcdb9c947a5e44e32eec6ef93d18661c81db13eb6dd5e8fc4de1a1369ac9c7942bc1b6626a03c76b5c90e34479b3b24e4bc1314b8e3247d4e143b5e319f6afab3092eb6fb095ab745b0dd328319fb2ad721c849e996e7d549e29a4bd5c7427e86873966e7bd856702031c4bd5ba34b70736431984833cf271cfd453fa01291c2e13726d49e2b432583871cb96223b95f1f6170c307197ca8a10336625bf6044bcee1ec88f64eab3599e0974da48e5e2c38d2190686e88a2dbd6e14b93eb7a9165823ed48f246176ab31dcbb0df0f862296da4fe2a6164be99947caca63dcf76ed37fed9b4f8ef0c949fe73a27fc589e98636b29fddd63db35ef7d571ac090dd89f19683dec19765689bd02497251d5781342216f7562513078a6de19fef3fefd10a2f8b122262a9d2e1fdf01519c47ad8771dd785c803ed58a80969f118a8432ed7f735726b43e237280d42df4e4b190f86bdde570b8210d97e0f152a962c95286acb3aa2fed4856ce29df05551447377897f7fc7b5e99cab15874865fd47d55db0eae4b7bbbf0b5d33a3ee9db26570d7226e4edadce94ab5353c8b77a88156776a341dd1af53be64297e2a240188f3bedb4bfcbf391d63c7824edc40588390447f04293fd3e93d8a567c65460be121793156455b786b06cc333966d6f4467f8b36c61aeaebecbb05a1e773036b1c512970dc99a101dd86bb160632b308eea6ae3c66d207aebbee44c9fc9b8e6fc7105b3c46927fa6103e29b44033c56efe903e8a689d845afa889e1d63896ad49bb891d4d5c133e480ce74e6cd64d7495c565e31a4ad5a47f765fa001c1f811d86fed705ac93d7d19993cc5e8edc1855823eaa30f19a398c44856c1c9b576d3532628cca8f2d996b544b1f1350b5de4070bc677654bdc917620815921c60a262de706c7e5176abe305318831dc54268c2e043a24f33cdb9c88314c347309be5b8782447c89c580dffb482d814a8eea8b8b05d787835cc839815368d13a087bc7219b260df31603558ecb8e38a805b91b8d9b47d63b8c1992d7889b11cd46f1895a599e231bcbf010506b9fb2903fd1e6873622f78efddee860c673d2eaad68f2f1aa68a702fb1c7e35978b424622573f21475fab1b9aa5a8c2ea4673454310d3593d88e2a0b7cf340b0bcdf48e47e1b6fea8d1d3ca2600ef821e87953abf5504519abcd70be5b3daa7f34928abcf6f43fa55871ad081578182aff2c9e60c1783d533c5de95b6257ce08acd5e83be7fe28280b51466fc7017a0b8fe90cf59cc6940cfd0d879c4815499f9e8bcd05e943e8912eb18ec070cf0416a7d7dcae87dc2c1bbea95751ea43b118a9ca8136075c359ee697bfd87aad7c134a18ab2034f27e5246420f4e903e870873ca88331d8d09d04fd1140639c37d10114991a3dd168c92fe296875c83ad467eeae3ef23fbea92b15389c9524d2f4538e36ade3f01967d7e2244304b8772020565a7abf4f2266ca7464b8723c6e58a66a015a6ca323f11cb00e9b1ec0b9071bfa57d2aed00401fbdd84c2869b9fbac776c4275fad98de462396a93e1e280935068195f932f0ceda65eaab76bbd252dac70bc1a11b0739f4a2acc88000407854dc4088fd29d8ae1ea28afc86095b4885fc5ffd4a998cfc11814db41a998cd3e5e76224bd288e6b6960c11659d89c2a5e0c65b6ba582d225352b230a6ca44cd5455941b35e63302ecdb43a01c13fd5c724271858313dd38aa54167ebcc292b073ec440de624312dcc97d30babba114a42de9cee972359352ad898032cea7f0a42c1abb78b643df3c07c508296135d748f8ca12b457fdb588612203fe226d14812f14da80e41958490c31205ccaf514e09215c8f30c3be0b529072a5078724702cd6089772835196e467862549965f15fd4d2cc484236e23be7a25cbd36bcd148459b88bcc7b02d203991e290fe27be5aad134a0e26dfe5078634c8d5a9cc72b90bef9484f698067256725d2a0f180e449c5a8019b88ca6b132d92bc7aa817539560f3ecf7e3351e2b3806124d85b2d13f6ff8dad9c0361dc0d9ddc411e141cf475b17e9f1ef6084447ff069683df605e6fff658450ed5636062ae966c8da58c09f6f0183009f5039319345cf55b50668e1560899e6345981ea3f05895f2cc7eaed160b86d1c060ada035fd2f6b14bf8d64462ae02a7cda8fb9407c0c2914c9a10b953ee5b3cf4878f5e54b4c1c3c32567d8537cc57518efdaec8a874fd65f363d7dcdc22b7dc25bbad398efa313fbeda37dbf2d8942924578bcaf273c7a9ab0bc00147f2029a60843a29bf81158129869ea4c22c59bfad76783ea6823e690f1ff3ead35e9801839f773894c98b485265fd7e918983eac54a913d8074deb7b237baf8cd08fba369f651af9a476f7f797853e7c6909ce0236358ba9e76903ba5ecc852a1b7af67f117d45dc9faa5c3b1de39f7193c442caf69e2b9796317b4f4e6ccd59a2f3d4b88a06098d1877ef199e1ecb3e7d53016ca6c7c6bf67951e92fba1bf1366cb2c7c41384e8d722ca3986c3a033eaa872d6abce28ccc41614119bd483b668ecccb176a4250b656164227b6560bcc4a9ad49ced7a9f6f1b98344a65294d3c07cae6d8568aad8e49052535202dccf3279ebc20d2939da6d8e81fd10e01102cd74fa650845e83790ae82c0aa1a4fd6da5eb5533bf915f2a245c1b2ec890f0b2cdb24451ce299c3f5de9ae6b2d51f1c7e10712a134d60c3e14901dde9244e84ea1e8608ab576763b487f4cd9390da763cfc07590532ca842b708e5ee35b45f28a191bcd68282a3449331872c543a824dc0f81a412f2d472fa5c524e035232facf4c671948c5a3cab0b5c1a2da6e5d0d95933f344aa594e3ebada82435b90df4746be3e60c74688e28b1037d7c74cec3344ac6d23c2001ceb7da3185945683927e40c8762120b88e8213bb4c6a966c50cadb85254043fb2bc6933f7b16c70219eb90f3df15a9aa3643bca06d55d5a24eb794a4902f0a1d9a9180f4cdea1cd3ae7cd0680991c88ce6cce1d5728e79c0d4800243c073e6216a8a3159f689c463031a47f1df5edcbf8241e8b09008de8e3fba2c86e7a3468a69aa14f9a90f045d77d7b6322223554249c21db80496948e2d6ea1008902eaa391415ab2b1567cf390ad20fdb5a680385143821e814783c69982d90cd79649701847b144020b57dc9cafafb6db1608557976c0c86097a49119d5d76c1044f77aafa81fb857d742760b5ab68bf5be7ca37845bb9d140340be28a62900e660079ec14dda5019e4e5f873eec4f03e7dcd0603d043a417a7abcc1475a2ae8ef5eb24188e25eb9ee363e348a31472041a3582afde1860e4ad549e64b13446ff03c2f0a63af6f7aa626208e4c350615a5138b6ca46c8da2d4b5de215e457ee5ad3100e9d1972591531f974627a0b14abb170a47076a35fcf69905d3ac9a5ebeea54f99bb3056a2c004b55ca509dd59b64ebde2617a21c096b704fe1d1fe19d29aeee9e449b544d7cf653658ab3c590694819a98392c03f3dabe398459d647f90985450a522c670a8ee010878d33dc5031c956bad36d0d2ba96a3db61712a4a47a8e48b805f3672eae5ac3c8002e35860ef074c16af15e2a1a9609d47f886c175d4f3569a66ba1077d0633756e08a300653647ecea1e3080105e4b1994fc7e84037c857032333fb338a0cff73b3c7b503c223a7cec4b49aeed3d003a7bed8907fde8c161a1581f065e16256c432e558e4b327a756d1e6c7c3c85039b8fa3ff3a8ffa596876dc88728f2575900618d2ccd8993839ee027bf81258e8b625c8be18af64ddbae9eb9993bc2bac4c7f5b21c48406640f628012408d4e1ca9f8b8cce2e56867264c6bf2e3bd4b9e62adcff2f117fe1f42cc19ea256b9d9231160b62a46cbab57085fbd70487b5000d2ceb55d5a90b753780a30b37ae935a8dffa1a7960fa316b81047bf7dcc8c628259fb358b001086b94700b0e134810e80714de144c790c18ab2330de7a67d5eab27970134a3a10b324478ede76818285766e8c94c78dec356c2361afb55a410c97ba144d7b5123c3caca12b1a8f8f2763d2499a90cc9d00cdcca0612043936cae2af53da163ac995e3bfbce5b6dcfd03962c53e2f043c56448b1ea437dfe9f23e6ba332323913d385f791d999e4f9bbcf0c98f286ded240deeab95d80a4d369df17ea9a68cc3746b71a64755f86174e715a8d92c104ff0fbf05d38caf11e138c5ed3428d14d1f285c7bab6c3768c8275f38a4748707ef27a103a56017ce52828a861415430894df99ee532036674b30791e6186acdc3e5a2b64d8d3aeb7e25e0e9d739ca4b1c078b055992b8b32974a3b1b9ab8c7a2e0704077303245844aab630f18c66658b12067386dc09c30a81d49b2bd7bf95d5fed05bfe6c4120f743b37db64d28b35d9bf57cec969d00e411381941784c266e7d3526e364e30200ecb7c7157263fca73de6ed88189ac2e0458396f2a02357a97ec151c7da0783aaee9f90c698379308a0a761113a6f1cc746089a5204da330356dfe87733c82fa574bc9360a01aad5384366f0f051dea7eb1d7da3aec778c6fe4ca49e32a7bd8ea436c5c3c8ae9bc8fecf6066024f23bc94b60d8e947a126964dc87ce4e7247651bdb2adf66be33faf976597c64f981e3d0745386835bf7531e4da0680dabf531bb3e3900420cce39a3fa008bd7ea40d7ff4e7a8334cda4d59f6cfaf8e370464069482f7104b17aa7e39cba3c0f058eb905855fced3953a803751ae4e9923e169bf81b071685a667f5c70e5211b66d25c0a083c047ac78416596110e355d9845789c6937b4f4e5dde22134f4c9c6017fdc9db6759de205d0e5c8acf8a56a7b8841b4db057b249989f4e15b4e04ae8123b296504166dcce7fb4e63c0a511a86a76103ea5c9ddae24b7f69140d48c4d12d88c50f2ddd75e82b7d80f077c0dd0be575c7d6f249345253b1962a10e11c99492dd1bf6f3c233cf2d8922d49bfba6ff67917d96c0133163b12c70adf2b1358333ef4c3737935382b868092d838385c7df09e6747aeaa1205e994ae8544bcb4d05738850b17227dd642b7221001c45499ccc348a44d00cee2d95d44cc919469e758d34da8fe63ab51887a894c5bd388a4d3548a9fa71cff3e2c655b803d859441034dd7667506782e5247e7d2d02705da23af70a5de88faff74910cd823798358e6e31371e853b5603ef4d6cf4f35acf677473a5a34114bcb7ce14391c65e11975e11d51dcf01c68e2846b639ccb85dd97ffad74d3dd419f78292083e85eabde17e799bbeb2b12f414ab41724e5f8c672fddbecfab9526663cba5996a4311486f21f9814a8de6378ac755f3b95796d4a3f42ddab2a0e843bccef92da8ed07686c6cc9ccc4adca83747734d903f8def60e1209ffd9f07574fdb159f346547329c7192fc9844e2301d1993cebfcd4fb7c7e8c5ebdc31c136b9143ec69acfb6e0449a06e0c04074a6f0234aed6391f6af1d32340ceb96797ad63003ea6b824a57439f3101e14ab7324173808b0a95dfb25569a861f67b1d669f3f7294826901d1b1b2eafdd3b48c56232cad391ccb245119eed989360e9e02fdf62c2d6fd0d044cd7cac8aea08ca9689aed962a09cf0eae49ed9b11931dc1a7306293d356c9ded9fa4b29832300e5331127c5619b185047d3a00aa3ddaba4066f4b8160a19df85cf928fd17dbe8614d2f2cb69995b10604f5499a39e931b092f1f7c4548f7fb93c8c6123741d62efc1214ff4d9810ba7856ec87f444706249ad0482d7292184352af258dfb16c7341d98f01c940592b9c59ae58485e456788b342423c56a51c6a42f22a7c433dc7c1725d39c51a71d3761019c13312490e437d7dcafb116aa4b93a5935d836a241b05fe18f930e3a18472022e3a8b538e6f92bc46ca823c7c78c926429ea9005769dad75b5d217704b857dee97c3bb96220278e02d4e4a677d4acfd8f2c32e52b2914130623396850970583b936c22fcd94cd062a0756835c912dbd812e468e9627a70817c8a7bd1d155bcf34946c7c7dfcc6ce90caaaed9d6cea808b7f1f333cbf713ca955487b497de6446a32cf330a7e199f6985ca48b9ad549d1e8ca5a23d50c408a4230f2061084258aea9d87aabaddff53bb1ace810d0834c5fddac1df39227d3183bf18dd0fa887e8259680482f92f6cf1b3b0830db9235221b8ce15eb5754798aeee102e326b62ae51ec3f926e46e21a4c1dbde05e5a1a720b40ba9176151dec1a6ae6f5eddaa6452a3b59f4e4f96c22c65302d5d6f49f3dd181c93acbff5429f98f262d6a10e0d6c88fa2d9abecc0f9435ed1031809d92d2d5332c9b3ed416597de9910e239bdc5dc90526f7d054699de027ac80d13e4ad06f393ced35a36e09057eab8f48a3da654bc8643d5d5ec873dd01a96831feee82070581dd1a83dc227fa2b4b4d9aac41c0456fbf45a8836d43abf124fb1f8643f4e98894814fe9460b6d9649daefde08bc272d8a21740a2e78a66cba772db3250dbf364365b39ba73dca14f12af038dd7ab99d114677bbf64c7149fb693953074003cfa18fe9a2a0958c6a5267c6fb635cfb5a2fd1ab5ae5b38ddda103a32cadf322cdda179f004a3a13e5990debebb53d947aa1e1efda44015bf5ed77594b4f977b48b3c235e83c0eaa061b5a1dcede695c68aea23af2e97ceee87075a61b2eb497b08c0cd8f1db6019c315e0dfaee4639555ebb98006397141f54ba476b3ac7d341c9222023820e10cd763c3183630c5b19ae024c63e85414872ea3ebeb0987d3059ea14d3dc52bb184c99a7e920723988cc9d2dde721ae8fbecaa84709405216475ac823c6139489aa2479549b8f8bbc1031ad05df1fa9f330b7d33bbe293be09b2e21889250c2606ae5de6f14b0ec21deae5d61cfc5e4d11afb415f2f47ddcbec921b5aacd9ee089b32e43cdede2791d0db371d0239d83a1646f864f962253326179ee3a52bb989b9fc6dd995cd062793d49136687d95c3092b1befddaf63bd6654a79f891370e170c53fe3f1bac4105bfca66d353aa4b6a5523fd556352b4b3621fab943d5a7b1480b5162420c409568a74d2aff9bcc78045cfd6afa47ff2d822ebddcd8f0cf4422fc064f37311f4d9cd301a8e499a05ea57fb6e8bab65e136fb8e4fabc392aa88171f496dc470d44278ce01479820c2981f8b92e072d9541ecc93757e6bffab7de55464c81565adc0e8ae829aa994a7cc0479431240bb3561a0ee20a42fe43a0cbc3485425d8086553a508559e57b5f20981f25da1da0e32a559b7add683ab1ec8bd330cc33a2e358c0c643152e6f9492c4374797bfda145a0cb164c280e19298514f6a07c0ea7c2eb8a9057b78d7cafed8e57589a54f9371b81c8dee70bf4f0945a593006a4a701b18b6c19f1e1197232a24e73a185f823f22a8bd9868e75745ba8549fec9709b90ad1868ff2f154415d73982332c42af2749356aa0bc2ed45fc88c8a0f85cad04a81f50e394e44e4663a6a89286a6060ed7a6d0aa27ccbaa694ebba71bd4ab7527a0e6961333f45018a08325aeb8f92b8271888e8ceae17a8705cbb8eb213bfd5d5a83df8e6a55a69727612119daa203a662797af41915d5249e4e0ed8e657974064ae840a602b317b068c1f52e7f73cc0ab858520cb361c3373b46149bccdce2a07a943228b85768ead919d0e2f06405985b1636e4c3bce2a31cc3a54cd944bb9cae6bb54651d48f46e585b65f5b2a3650cd088b024a76e1b2f72d122cebade2c978889f468f8e0e355a37ef419cbd8221d552edfac258fa79998574d4a39d2bd23dc65d15266d4e8d8b678fd8904dc266663a4266bfd332905fab1e87d2a29bc1601ce4b2ff9898d81840267433df2415a92b03c2bf39be5c89dcc96874b1d3b951736f19c66502a52e92059847f1531ea8ccb1b6bf7c607ec5b7a9c0671a5055aa57e9624cd84c8496988a93dbafd88a1fa6ea15b12aaeebf5d1b7226dc99cb1d26071609e0c0dfe3aef00ccd7644c170bd340078b039fa6c206147655b6375bd91480a472af445be74935aad12cc41098bab334d5aa6b6e4298cf0b4a17208ad963fcde817a0c22604544ecd5d79ea4dd7fe27c6ef97454819360c6b08b15855a27f8131a1835345da04169074d8490ac849712b40098d8e878dc61ad347f19a8fd54e75632b14776325e2c750e21c4a442a358c83b855b38c2bea1a6ca12ac5082bf00827c12702fa1212af72f8e6f182998f0a68da4ade8cbc0d4eb7d150a769c9cf6b1b2eadae93dd932ca70e599089408f56d1b7dae3b0a0b5b0a4cc174878fd73c7548598852351787699ea69e6e08e617ecb3e341030711bdd1e94e165fb04eaa4cf943a1ca703229521695bc52a39378eb16f1c3fe92f69e51c377dd3d2268c013113b1f07391b609486a3dfa81cea6159254daf8a6747c9f7499e2668285030ca34be8432d35517457e234cc15acba02b903c9ea4a4035822ecdc32d34924c3e01bfa7181cb1cf3926505b7cc15e06da3bbc1d244f990591a7363c9e197789f7123a742984747b0d7fc029265cb2448a5888024b132a27879aca645198d6fd3a3937107f035074306c81908ca7af69e3320ed07f21217ebf30c747cf1888fcc9abd08239a2fb9cd2f5225e99344f1a83beead6baec88eb10b72c48c39d0942958393deef3e8480097d6aae04d2060958075582bb430b0091cca0993d35a0d7cf1076d51b384d4b444daf25d7a1b6be3c427c3a36cddd6f13f16ccf77129053b29667cf7b1eb444310e85b052bea5133812729c2e6a79201a0d4c60dca1e89f67223b4a9cc3b40e22d8488d66e2555bbe26db46141873367c1e00478b7e96504e5a45e6910f954d96b38d2d010bdd791a025abfa63f69ca7660e020b48d8c5a134ff12d0522ad759a9665afc4c009cdacec5769350a60eb6840271b6c930d348afc098bdcd1093bf674a925abcc806171b5bea6488a758c3522ac96fe40125d84b590a7c6391a86900f57d580a168895b597f8f20181fe5a774362181508ce294aa26e62f9f85f6934ce04612f62b4e53cb7496ef80b87ac97316406fb1ad0d39ab8e108b1444ca9a4647ebe3c720f237fe81abe98772520b19b4d65229664d3f5807fc48bf400f38449a7e9838d7593a173fafc78c327b8c1cf332ed57b27e4bc8a2377b91c5a36e25757e1e6dde547d8a23b552c580ac5a1dd5393924ca45abe2b0e7263ea20780887a69d33ff8152af981f957f58201a91a5ca6e70f2d206dc928407dec176874a959635e67c0a90948deb15c13bfccc07eda2d14020a57d8973d2eb91981fdf92fd1fb51e811ba287a82d9175c02de4fa76379c00102718f7c4cc0cd3ca20628399265be20e96190eece453d3d096160030999caf8297774c980e6bf0bca4d06738ec1d65d76ad576d61807ea344041faebf9aeebe25ff7d1a9958dba6fe21f429558002e0886acba0ea0b75d1802085ca49109848acb7b35737cdfa819ac93de8f432cb670b66c0453c637b61c9354e280c4d553f959d8bb109c4a67e9dc4b8c9e2a7aecec5dce46295da02820028e2b7376347cc66b3b985a8f5ee734c9e9fd4f6c4184c31e98156bed6f931988052bfae2db739f29a267e525cd13c546377974bc51fc537e614bfcd5b66310ab3f269a7683c743054e7e529c56b73a6776372ed5003c7fe2032ea9440edec39bceccb64d3a8c95fe8ab776e514eefe6753b88276553c09483ea0d2653922e6215d099543cd6ef3e5ac96347bd3aa690d80c94375fd95b13d84334f681ce46d5e879ada946dca2c0faf535547ffc09dc841813833cb66461e3945fe103adc26be4523e70231bea111710c2fd4e27306d706d38e40d82f06096c0854d2d29b6a8caad22f0a9aae1d583d2325f96d04ddde104c88d132985ee6470d9fbeb93154906747590bb838f08f00a9fc15e4bac88484351a425de90aa5e7d941778d233bac72029ad2fe2d6bdb185cf070b912f814abfc099242736d2119f9ea0f6d30fd56ef1e76db57e5fff18feda4743e40f3e2a5f2da21698b548abd5ea17a4d6975bbcab8e32b7e4ae8d13f028d49d873ca69ec0914a485f99b3a1fb4716cc7128135647b2010f161bde67b0564d956ebbb2b15c041c208db472e89d80880c895f6df90b66e80a069f3481bab7a0f4f5c4d4b113f3bd6595fd367b1898784400dcbf8290f1806de1b4f6ee3f9e7de132a5e640a0f4ba483080f2ac54e9bf1649b3d24eabafbca975e483b3f4c6bf66a24e8f5b53211e6d1d6ef3a19d761368c9afd6dc1d12f7611593f403a24896709e5738da16ab2b2540eb87c03f6860028221e6af71c63dc0cf757d1b84a6d4a2e211e2e36650c19e78a33f869d2cfed01db84cfac0f4a34711e86c05053225b5bbcb26a779739f43df730f2e32f8366a4e02764487bfa86bd0c2256afbba7d867efebecf7d7f5e98076e90d56304f7f610aebbb04f27f09de99116d1abae658b2c65c37aecedb340988f3197a57104b1bcf4a0e791c8fd5a7d872768a19a1702bb120ddffd0faa024cebbd52291f40b0a3823ddf7b3ae3813b74c80e4f6a1ec3240ef5eba895e126169b8a9bd295df1b9852b3864e815a8d9d1f365d50f57fadbbd3c1d4f361a64b7516efa597f8bb7e2ed0f7ed5030e47351fe7e8cba76aaa10202ac1eaad185c4002352ce779736fcb9931a7653b0f1df27b5e8d28406aa978c53d971aaba4ee18606b9ddf8e1d557fe3c1b568761440ff1cd2dc11d6417f9cf9a15843a409e0d49b51c837082e1be8b30120efa9354f84be366d7b33a6cfe678b3f6b8e13e842dfcf1e765e85e148ea9789b67cfb83971e3ee2aeaee426098397e5abe8ef24fde6c8f02d7ae7ed93c0546bc836cab32c7db000ebaa7f985d7cdb1c2b4d9dd3aad2606b88855bcb2f22791783d108d0748bdfd7fde9e77e93acfb98bd0a6ef5cbe93523522e5562b2629a984eef933c1b060dc59ae757f73049bd87c9bd7875ae2ed78b19857ea4e34c1bfb1d7944bf324e72fe0b024f1c8f41471719e8178d5b5db3e1825e1fe0e4d2efeed44a5a05565bba3a95d477a9cbb96a7fbd1685bd7a8412c7bb81b3232aaf795ae5a208e5da0a0f276dda45aba5e1927cdd3f8e8c8c228d7fd7cad7a93351184fe03caa7ed7290c2e549df094f4812a555bba99fac7102355eb1371c747f2d42fd1e6efc0b17c78abc65203da0dcb5d6c9c157df68fdfad1ee7c558dcec8093cd4cd1f12e901415d9f5a9f3b6ccb32f01fb73e838a9ef50d820b5a1900a89717bb6719ece5da4bf57b5683592a407e2a2c3322d002734539db62cdd78bbb799ee2695a0b2ce7de48adc52316f60f6ed28cbbf62243ef6988d5be4f0135d99bc91837a163dea0f2db42abd4490ea8cdcb5819e5dd0fa79d30c06a5772ceca157872b51c4af637d0db65f33d45113e5bdceca2584b45c057bc47e7324cf84cee9dbf11ab3069e682c676b40a0d714c8753e12f52a751d454533bb926434d12d9db91a8e2f2d16002c0044bee52c5378948087ab83d72d0214fd100399dbc1ffd728c0b50b04459b3fd056122079ac21bab2a3cab6c21a87526f5cf178eb8ce3bebf15511eba32660567dcf1ce57d17b95ce15153eac8235a6e07a7bb7d5887a376a924c89ba2d1ee598a338f94259d21bef5e46d6adb1fe294e8c1cce7955ddf81df6c9790377a653e494b3a6d41aa0effc9b72414ff83b9d59cb813951c168b8c89db45925a849d33d28d04cb095b8a0dbe3cb8d8e453c3d4eb0f83c78beba1cb747695e22f96f9c552077e9856796f07c7beabd70a1c7811d67a98d3a1a06a2a5f53cdc12beeb348e9447c8b9c020eece5d66f57f3ec10e4da8e4063e26ce47b70744b14264e63c5c3d9b0489583e6479a32f67cdaf87279d602b0b88ee17a019337ef9f4f0b1b60a021b9485a96498fbb78418a0a14d3e634acd662977160501a4debb48236ea803c6367ced697dd8f2eb4fa46f8b45a3d7ce6d8169054aba32f20afc944c5c41650c7b2f5882f8750785f56dc98b731c5ab679cf07d389841b0d022c976cf198f07c0f010e6faf1df94a9f5c1b8d1b44f807695fa4b79e7d078d7883ed872cb96e6fc78d1247d44dcd5520bc53c07dec393d1c514cc9cbfd142562a516ded2efd51639b92873911b4e1e0d43ec57b68dbd4be0ea1f793270ddcd0eea72667d03017419076de2ba8eff021db18861885f11638138862008df54ee9730a1432af9e3bd2a70289c438f4a8dda84f8e5fbf4685dc8668f08c7859cf1d1f813a94a2b9bea14d6f7026674069555404b5add1d01ff2cb7727c7a119bcae25386c787f7cb6cee70cb3c6ea541d037a9b4d95cbf3e1f5b9a81f770ae5f2085e43c6345170a5b2c8f9b96337a1140a985ccd02c82a8f35b3aff31e1fea10d7ff436cc65e72497e7b78d7e0be414d19720aca23825caea65c7f0988a235db9df0bf21102711583cbfb3285ee20f704e63470083d6782bff04d3efcda273c619fe08753edfeabb6bc48e48166770ed717f02f81e3dad4e3f33e5243c91e0d00dcb2ed58a17bd48f4c591757912013b9b8f8117af04f563bb85425b7c0a6876986dec5c6f189749600c093b93fe7ec989fa704ac5bef3dff54d8753c16f843d45e68ec9c66079649300f589619d9b455d7c4bbd2797a415f5033b43afe1beaa19415c5133ce77299ec3cc86092f5907eef26600a0b08b9337ceecf2ff3c1c0f195dc18abcb89fccf327ae0b1da24832bc8c25d89b5bf02675da6d5f3d23e309143b53862a75e1bfd22cb4267078293f6660946877a5eec66820b70c56a7fcbfc754ddc1aa80f12f5ff738bf44ebfc976496f299e900bed403e74fea25d9386cb4bed4dfbd39f77d3b7e9cee4ba932fa709641bb86d7aeb88ef00f9e9bf574945691514c2256d080762118afe10d9ce3fdcf909cfbdb5926eb858a8024d60ca80d13077dc08debf44790d23fedff8c86926807818c38b987e03a9f6449076b8826e9ddd53b314bc9e386dbd7b4507d12fc5d384ef4069424cef8efc610029ee93afcc74dfcc7d477e38c8f61dd0819ad502323b99ed89e13db8ff7864ed7199ec66fa2330718ab829c3bdd06aef761bc1ef2a25b3fe83de4384f15af2b13d6906c826a0b5eb372c8ce13e50c5bf256fa709acee26846edf4fc4c1a88ab1bc859dbcfca2f3e5df63936ee6b30ad57562dcfa772de3198fcba5e71acdfca6ee82560870c0b24fff9e1bffbaf62696e4af83eb2fb8c7bdb17ee77a1edce66fc4592d708e963b7d02b3b28e9b8410981ef901140fa34af5c663a52146e63d6ba25ff20a3062716b5e7d4f63948e3524e54083776301a1d460fa4477716ed4cfa99eb3fbb99bc16238e0df03db3a441fd0ab9097b45a1104463c2cb5346e6c5a85e8e35e03b1de5fd26ab26ef4b2fdf268d48103dc084c7a8aa03d1ca4f7fd6f2c227388faf916f943c9db3d6174618240dbab174c13990986f27cda070780dfcc34b710e9c75b955ff3cf88bcf05054bda29b7f0ea04f0f7257341cef005e24d5428bdebc2fe3c9d5bffa4ded301c8a3dd7796a08600a2dcb910af1a304d5f1fed10211d94b163b8b1613238749e79d73e5f0f72d4bc65fa4059bb7c788cc17a7265ae8d663849a4f7b389049d38f2501934e7669ab56fa568b57ad2c8da88fbe648f3c4dd8841c65699819cf724924b77d8d9990e6b7d0d66371f3c4ccc4bc46af3283a4baf10711bad70be2c35b83928bd3eaf51259f69233942b64ffc92d9f2a4bd5b3dfd1848362ddd742307cb075e1f0810dbc412a9df5f17eb52c36d559490bdeb446df0644ee1ed9d515d6bfee56c8947a138d508431ef4ae47874745bac83f0cfa0e5a61fbdeb2a1aff8b888dca79fc3597e3f650f39fe12e8cd8283fb48c57b903db56a1ee3583955073bc98d8129c936fd080e6bb98d0a8a2545f75460630d96cf89f78cb3e04d4a13cc553eea7992fc8ac0c295eaebead64dd5a77a353be02672ed1f1e5662ed80a7cab4afa259cd315e13da9afaa64cbfeabbc5cbc2986b467ec0dfb533cc0cc5601417ec734cbcde05be2ec80c8b3029e0b1911fdd9b593603af1b6fdd5a4368fe063d3aa5889a24faad3623d5e26127897a0c4ba70443e6e9a97be8c95d5078b902edda86802900f7ea1012b8a19742d23006dfd8af7828bb3b58958a1d267a9abc28d5caa98b33b2dd2ade2c6dc7ac56a568c29fad0abfe14a8c8269a113f8baf464fcded1e0ee57c3f4cffdfe74ab511e4f9d6235a59451f1b31920e3849e3e58f3d35104ae79dfa78a2322f0a6d58fa60dbf5675d649b90757a40fdb50f2198a259ac6f9033b3ebd4053f93d2d02085ed2865a4582463e7edeea91186b02bfd5bb6b06e9818190b07fdbb8f9569238a0f35d8d3e90eff6066fd54d557e0283d1c6e1a1b3912a3545c88986dcc562bb6391420b7fb1e917bb03eaf2262712962fc1ba8e82bd23f56e27f802453e448a89038405284b8ee7a89e3961adf32acfea53b305f584ed19bae39acca3aba58db044b8c488a1e96af71bc6a72a4d0a80948eb5f58e64a08e0103411fd0490017dc6b975c7cca034534b84bd2f2e036c3d1fdbd41332fbed63f18bb2fc90356c014a04b8d50780ae81e481f1d481bb2392fe9bbe7d285acdfd2b3e4241946f41ce15dd29dc4a87f48856172dbbaa4d0a78e5fd88587c7c155d38609c6e5c3621582fc4afc31908a26b313aa7e1f2d0e06d210e00eefe0b9a55ebf5a4a3146a7faeb7eb50a91ed2fa7667e471d6b2ca63b29733e31995711825216a6fe515a96d7a63b33e4eb125ca0fcfe1dc5485fb278c3d22f6cbd874dfa8a7ae410e0f6255bf0b4716ad556c9e1589798ea209412e36d43764cddb739695fd310f4d4d54b9cfbfaba1aa3e139e258ad13c9a716c008f162ca4d37917a88f72962319cb04466730d01fe08082828b9536e639adb8d8b36c2aefd50084606c89ed5dcaf35e346d651dcab4927fd09d8a18d56c3e5919ac82473c8540c5c313bd09226190102cebf556b2287f3daa256935de3c451b7f55598dff4a889f44fad34c830d438f2f0181873279aace587ff03768db31916e8fa0dd9350e8a325c80960523dd8b271e7f54a2154822e7a390ef42b31fd4b55026aaeb4a389887c14b1f4dcd469d99fe4f5cad26243c54d77b5be7b797b3ed7bfb62c78d8c570f897c5b02da9407c9c20e4ec49efdd48f1ff7d2e14e7381acef777418949b4f91c88fedd6b35273b10a3d04f49c05d5a7f3ed07e6a8dcc735ea4d8a4efbe33b09e474d35a7e35a88d8f7438620c9571145d950f2c8e3cbaa7e0e4a19ba443217fecf35f8937ea615de6cc93e01891e02329e5b8cce7eccb6b6fc7b131bb4ebd42a6f38740a3e4ee64898be16b0532c2f71cb3f53fc8c1982b7a0b91c7086eb47959be5f56f9c45ece67c11277837335d161f9cac7a4afbf21e6a8e80805964a2010a4405465d300ad2a20ea516e79b491f6f039562aa6ceb54145c9100856405255dc1cff179f6c5c505836e45bbc0323c1c2ca8d2e7e63b0f1a8148d54220588a41ddd2359ade796c17cc95c7f24e286a6be93e365c6b0b3455db5d42f6de5b4a29530f04390430046f33bd034c9ccaab7d3d5821870737b47d375330c1d9feab91f4058987b937c685aef4dccaad9c810b9db6d9cc39ef9a5b8e23feb1e53e9ab7475bdb7a6badb5d6de50c8ee2e4da7e5d2f07db2bd77845550cdbccc33a2b7f1e7de0dae09b3cbd72bb7722b1fe0035abd4092144591e76a7022021319d4ae0639efff23c13b54ce8fa7b5f65fd8acc33e398fdfe6ddedc98fd1ecfc590aef601b48263ec52349f03a11fc8a478abd8af7138fe2912678d9075d15a7acb562c5e7bc8c159ff3adcf51f1386811ceabf8a29c5ff147a90cc5e7bc0cd9e33c8acf799d53d64a91e2755e468ad7f9d6eba045512d5486ce3f5a246b7d4ce78b642d7448c6ffa9ff448b8ace3fd13f4a53fc51fa9ee2e0a09ee6a018c57964f37994a6383dd5393d959d47397769b9821c5a44dbdc3597865fcd5264d085063430e3cfbddbf3135195c516bf7499ae57072e6b477f16356ff9780a6b7d78b64e11786178ea1bf4e6837089d37cd8a99a80faebc30dc6943b088be7f8af2be48f41d7d5cbbc1d1807330fe56d7c811bb77e03a0c6241984332fff6e8f6f1c7ecb5bdebb347c53810eed277e82c7b1c7123cc64ab809c5075d9cdf9eb08d5f2ff2df31e3c64868d5b17a57b07f985bb60f5af66c9df78a964bc30f85f32fa0d0858c7cbbc7dfdd1e31c707e7ea50a89cc78fe2b4a70d5a9d95e0b4c0084eabd9e8c8b3c653cb39ed7a77f08b67d16995ee0e461d2b834bc30fb341e3153f56c27f83f82f963e825d0a98c86fbd0cf25b6fbfd57a57d647a9ab3caf550321e90704611997966b41395b4bae28a365f63d28bf6d3c1f20e3d272ae05e5b7e5afe5ffc148d4787e6e38304ba97a8b5bdcb218785b72bbb66bd72cb89b825d667c6fb62a94a509f2f6e06b02d9f05eebfe21bef7de7bef252f49c662b18db17b053c48fb14788b9b9c097bda2eed7ebe3da150e8190b69102587b6bbad03792866bc0b7779278a236e915a6b5aebb491bb9d4d936fc3bb9dadd106f0680c8575f9687bc2fa907f51f22daa6ad07ab5c7f52a01f67d3500fbbeaa02fb6e67c33b2b8ca34d74b90b675f9befdcd77ab4c5c81ba3a2cd815cb69d2d3c12ef4b4906027e0bb655afdb6b73cef8e4d946f7e85e6be6e24c66bb471c665c966798d28035a6a1c8c294389ebe93ff6667670594302738477095b0c048e6a9ec82068d4586a494c52389b128becde2759a98818ddf8a1bdb2bbe3ac058a339d3898d2ef3a655be4ad84d01d404e0982850085cdf09df75ea8d7353d274a1d3d8c50c1a7780cdb03646c546c7a5fd4c9a2c663423573bb65a237157482d188a48a208229ccce499deddf13177873c63e6ee903d7489ed1c28a28c53113c9d18995dfc51c28b901b1d6e1acb0bb8c29ee83073374f3cca1d74af1f101e2e3356e66f05d2e2612dd1042177b8b9c4b03002a55a5b7c88402b120a5368a609ef0425d86fed12e65ffaf9c3df511ffe3e666565656deb81ef1efe4c2e34b659d7755bf48a7f6b4c8961ec6c142ada68119ef8bff0dfdca8256afe853dec41d0a80afa8b8e52fda5f872e1c2e2cb6efe85aa20ecd79337377f83b1083cfd52fb85aa26386fcf100a5f35f5fb6efd0b04ad1fe928d52812cec35054287cfcadd2bf8ce8cfa04a3c4e0914877e24180c0683c1603098d65a6bad3fe927d56fa46130180c06837dd24f0a7bf145dfbff7de27d7d275d9d7c292106f5092d8e716d92c385c20931ab9971f413ae01fb8a1899633a9917b791293ab20cbef09643547c2e07018354c9aaa9252b04aef89c11069199a45f68a0b99d4c80679d08043089c826319237ed09150449ad27bcaaad2b28565c82f2d5dc135c1f49e322ca9ab7161f7338d4435e1a5f79401d3f2752417457763e2d336e961c88fb4845917b0aca452230d66d021789e2935af8610582590fcf0628563e385285c8e894f1b25c798a6f49e2ab6a4a5095e56935c043f76e84e68f9b55925f811c9c54c7c7a0d392bb8b49cc0c4a73de2fb61292d5198f8bc310493f0d27b5690c5eea08313a9b4d431f1e93874615a4acb1451495498f8f4304e88dcd27bcac0a4e50a139f452ba8cc60951ab90d3b4c812223931aa1507a139f37cb902374a7894f0ca4e9cc12da23881c9002139fd7071a22b8f49ee799b4087b200a8f1b40901a6970858aa9c80e49f2a54627d0a418c5e76d81aac7522a802b0409285d7a4f1999d4e85a51cd58e2bcc085b4c8a9b6e0a8911a8d3caaa4e4bdc03ea98508294a522371aa978e5e84b831951a8d38b0905e709496d7244f598b44c9744465218cdf0201a943185908e41b8963d674fc164a9226796afcea40cc6288ea8c31f2c467ec24f1cead014bf04b6a848548c73f4a2fb88f73fc8cf6ea20dbd0668b51b367a6296f80062a989616c70dddecd262a28d9d255a48c24a45b1a814221533765d1427b7343c4b21d21ba5f459bed688ed1f74fd84baf9dd1efc223cd1265c2c2d2f0588fb3eb9cbf0459a3218e38b62565616d61e5128f2fd6574b1d2a8fc72915f0cf3d32841f52d8b11defcd4947e7b64f8edcb301a8346fb236b5994e575220c78d08e77de5f31c26dd19bdfa5f95fa8d2671793768c05e28c7d4272b7e3f17e3f7155497115579bad2e0d67a0b7c0f8b18d4bc3214ae6f00e8e41abd8c6c678071ee2d67ec4d2f6c1eb2c31fea03bfa1d3d8b18eb74a67d498045072b30814bc38f7ad16604535ae509b2d8a27e2dca737beee3918867f79cddb367cfee8e532835f6f9b2fd45d4dd02d5a9f4aac9978d1f628c711489cac61f519cffde7befbd9ff493de472a721581418a901f3378b9a54519d578c7e69c73ce395f2d8aa2288aa27877548c31c6187fd24f8a51a4a36b145e57905287031e073c0e78ad291cf02a48d2f6d5eceeeeeeee37641c661267bc54e6cfb76de2d2c208eccbd30ec6e9b65513dbaf52235bf8f99c5ad8d7de2817c0a606cdd6f6bd3e9fde429e8684c9a12f4d444df8102f496118eabb637fc8161bf95f80e0ee98d8ee1b026597db7d43705bd5df46cdcc84994e2e8d1913662f88b83d26fcec1e7213e10d03e7898b8f6ddfa2b21836a3447663f45a1f4f931fd309c244e9ced2044962639626c853d22c4d866df705f91144c7566b3c293ad2796a3f4d26c651fba9f19817034620e1a1bb2a3245c9d192324e74c8a1a6d7831121376e84fc3071dc24c1d399f45027f64d59c0047f4d45b4f981c2941a60d42c5969a1cd1139042d5329f6458441b6ecae73d2b226c9491aa433af31459c884162c80a577e188718cd1bb1588ca746e2ed3e2047c478615468f30f0f56ce799606e7ab9d73ceb3349988adceb015912a3c796a486425e941cd0ea75c02764a549072958398aa29d18b8e9994bff69373c6f93dcbce35e00b06cfc813db7d403cb05bdb7d40783907057c4d385f902966062098f975536ee71e1369e7a7e1daedf117417296b3553518eb39f880e0f040986cd7761f90a7da9519ebee2d46d2d7137b22901ddb63611886e17f00429b1dbe6962873fad3a306f5af8e17f97ed1ffe2cacb155163b7c8cc3bb3da669903b635114451167db2e0e84b34351f4bfe22c446778900cf3c207bddd07c46963f4cb1a012cb8fa21d07c408d0f395f36978db7c00f7402167295d12607ca4dfe65ab36a341f7450f1a6737590c863890eff0e317ad4f084c487cc7f684c0c4c469bed51b2a6da76cdf2a4e084c37a7590c42607af20a7cdf4c2b5aa26cbb7bc18376df8f2b3ea635be1f517c3eb4f8987adbee36fe126677f8d7bdc39702ec6ee7570cbb4568b66d6c219b655f31ec16d3ee2c0678d5b1ed6fa11ce8046b635b286fe10f740212241ba342d6ee1ce884fcee2df0e32d5c1cc8eebc855b2e5db003615488dcb946e9968cc67f7d3ea27c3e40e9d7ad12b7c06f074a9f5dd9257fdc34218aef2eba189b89ef3af5ddb9df3ac9bb739f1cb38fa7ed1cd83c6b754bdf9e4bbfe50c36a28668d8ed7aa2157b5471160a768f2f14b4ae9b28e7545d2f64b7ebc5d1103ee2ef280cfe4ece20d5fcaebfa72ae4c1d16ea1360fcf1930c8c73fe3ca62908fff05f97a713db8afb63ea3a46ff2bc40e92ff2f349e38c61c797b576f8f794b5500fc2275fbd976888c68a8d9fc876708114761e72ddbace3889f21051fefb3466645426e43a15855d82d006fb9e34ca0d43af4411ec8be20f4f75c60e513081800d1a70940ee1171ab3b2ee43d92f61377f2359ba2cddba6e8b627119d91bb250665131d6baae5ba521131ab3ee9fb085eccea88a515b7e6c5159b617e7d08aaebba3cde4255b59bbc82fb5ebccb7af7b6333ec922a91ceba04a93e0ecef9fbf987ac89fdc11d721dfefb43775d878822d81f6094c8ee19b2f0f1a3435616a21ee4c74332fbe6baae9bfc20a36a04ec5665f64dd84477e8ae328bc268ad4443795dd7bd89d40bec755db72e5ad775139dd819558f52d8328cc2c84f43826d7fc645035356315805a10475564eac724a72545654acaa784e78352839519a023e01f676b95d103705f7452a27f59bf2ebad52562ec1e0961d925d103926b99e4e4a776372db3dd9e9764b76ba2449b0725868b064c0babadda870b89d1215a51e8f0aaf77c3dd7a6b6ead6109cad212d4921412292a2919a47a3a28ba1c951c151009b0f714ac02e6805f561956aa9b925b0f970457f583f29b2108ac275841602dc1aa5ab27279926bda295951ba828bc2ed7abfa89f1213a531ba281d152f069eee57e5d7538a41a9e724178c0a62f1216dac6b4a0e61e5d6d34dd17d5991ac37dcd5c7539ce02d865b2e4a8e2a2815ec5929b1a2c241e1aa764d76535252a4aea0e0bee470b92a26565c703c2aa92552c124c12cb0ab254d5b7056bba8a5295e145e550cb929a92752533fa81f55b04a90068d26382578052785ab9202a49ab23485ab82e3f293fa7d518aa2b45465a9f764ed356972554567834a06a184d75b02bc296c602765d76b2245e5e4a663c2eb492d01650076e9f10dbb8a625585a4c9563535f59a9a3469d1344fc7ac4dd6a92a2ab72dba24ba1ab4ef9e0cbb2bda770f4a57a544894a0a9617d231f07ddfe540d6c7d3bbd59cab26c029314deb5669fbc674c40469da97877c181cc819bd341b8e3946b30c48d2e1ab3a2169959442185274267d4996c4172ada23ca8020b41adb37bfb8267cdaed416941389f6d683d348c617cd1beab4abf631e9803093f788c37021a1f3ca61b61071d093d8c00846e84323a00493043e391406606011e3c36825f5b83801a2349507fe32b811c7863f47d00e8402b43fb41dfafcdcc08a0077dbf360342df9ff99079d0f7673ba021adcc3fa3efcfc8640de8366dbbcf4a6ec3006a01dc9fad07febc2f2a8b61d10cc3dab7f5b83914b1cdc6388e466a88f862648c2f09d5f8244d0e4d3f2c46e0aed27134e2dbe3b8c21ec7b165a236157eec9b267462db7d4fbf275e92288a229428ce445414455114c57c6939c7b6f8fac811d2dc6163d2bed5ec435e5c2e9711a1842d5816251de93cb59f28d17d3f48b9d22507114e9678647c008343182a401f4f4be3539013a68efbc4d4e51d3c4deac4fea9c6cd1120622d148bd1554a1ce9a28f3471c5786aa48924c61b41e03cb59f234a320c407438469bc553c76c3c60e0b1551e1b0b7adcee83e1c656b56641d3db7d37365ba55d164a9fe9c4de889a6ce4aa85b13099d9d9081aa61e98dcca20f9b86d40870f72bbef46250ce2c0665bd279bbef06e5d6e4a6c486cdc7b9dd77cb51a4cd566b3c203090a487841430526c6073d403e70295115350494618e1e5c8d91639a2d5a50812fb1611b35d362044a1ed0749d208af0e233a18be1cd1e13a7253d2d001d6979c931b5790b0920196d4d49a1e50567418c9ca475420b3066c4c4578b719b6b9dd770ba204975f9dff052d7cc7dacce2fab83e7040efae40b87c448ed8aa6b19b355e7ddd28cad7dd9ebd32cf693a426d5b4f96933ab5dd2f38863a4902d8a76dda2f8352da226d010e073e61725c2c2e5c2d3a1cd2ffc9ccc10d9a142124494922082a442122f10b1c7edbe17ac42d105ab21453805d98171e8a46387be341b63e394420e362e60e160e314e5f49485f039f5b6a344d7005743dcb04a7ae5d0c6bee933aa4eb5ed90a68e33a8246c58ad6ad2315433122000005316002020100e870322711c0a134992d307140009699638584c2813c7027130240e84610885500c040000030000c330008560140564240722b843e779087fb32787653708ca6b95c61dfa37e4572df62fcad75b96982623cb59f4ebb33c41f6310d074b16f32f2bc57d51bbacf755943c39049e8a7f2953bf0c22aeb324e3e233998cbdf34199a595285eb314df21e004f15fd33dc8f5fdb64c8d1626c96159f54d3db9923d18167a40573298a1fb53f3df412cfad347cdd28a93fff3d4ccea9ed5b0b0afefbf0954e3f13d415e4d1fafdc1b06cb11f6fb954b4cd3c802867ffb452943c82718f9343d8b24e0fd174e7e0a32b6293e0e5596bc33f52f7b36d5f63d2c97804e090e8615ab006dfabda22cddfe9329014b3febb2ac8ad3bee6a9286f4f342c2de0fb5f89d4eaf85487a59f9cf8b352df8aaa72df5f953df7b9ff858abd2afb1ea5640843ff5df24849254e890b9de5545cfe25d9754dda3e7e69fb434fd8dfa772ab4669224e0e3cd3fa833e0d02a5356679294eff568a6e08e8d1dd4796f882034b1be6ffb9981a079bca6589599af89cafd42c77eecd72d3177c6529224dfb7e4a0487473d5834aef04b4d55cc89284df6902a96d7c0cc87d92956df5f776210fc9bd20b14cb01afea214e387eb664efc759f26ee7af942c525196054f2d0592db3f4d1d4b2d53f913a0d253ec4168ae9e6f551b229f784b5856c7c52397f89091a5957ffda2944c436dffc7bf3235171b0768c192e3683edaa4c2e5b1ebc49a33c1aff400c192cc2afbd492122eb71f968b12aefb898753ea1f542b49a280358b843de7cf4bba1ff215ef7f6ae98816be4333f866dea43ba982a5fc40e737a672877a8650bca6f4101d58f4dddf1fe5947dcd045089e58508f56b4bfb1cda19207d6a9c620847e8b088ea53ffac644f2458bc832ddff3a761534d78b2cd89d12f4a4cff81a5957ffd294ecbc2bcfbc4207b552504502927479f2bf1f50796dfe9c72b9ace1c227ffa7da5d23611277bbf2643883929627ae1d2cd87f6ef71a57da0fc27f1df2f95e0906e12faf570a2b0f4d18965ce77bf2c615a8f2cbce9d75f9698f2018b07f1e717a5d23c04bcbfcf0a4aa5fe99204f81f764099892a7940ea9a82a943c524f5710a59df490fea6e4e503e09cf8214b5a190ad8eccb95cabd688777fe6a49e29f6099752dbf26d498a286d32c27cbf5ec53f5d4e9c5277a27c87eb752e97bc0b96202240abaf0760d4e627336fe650958932c30cff5832377e8d77362cae9f00fd77265ffe224c199fe3f68273ca0b4c42c7b85dbe784d609f32f4e60fa2f5aa2f23910794a09e1f3b7d3f12f3ed53c7c39276a9f917ea597882cd572c9574b88f5cc4da7d7cf495cce075fb8d3ec8eb622f0e489de09e2dfedd3c28e7e967a83e253b58b589891258c8ceffe4a0963b9a6b53dcbc97013963bf0ee274bddae32e07b22dac9f1e74bc23734e2bf7f975fcac29c7b12ef33c117054b0127a27622f78ce48376751787c58950eb434a283e7a9cc8fe284acf3c76b5200ecf0b8d515e97772b2416b19fe438f1fcf352d9bfa281dd47933c22b0ea84e4d45ba4d7a752dde080306fd00a2b7a3c9e0271682d71e158fc3e427a56ba7db764ae7f1663e802f783fe7bd372344f333a3af75e860ecfb5c66fa04755b39db76e549460a1509e6c0320c0ba15f46fc59e57ff09ef21a24381ba8a6014126f1238ed9a8e8ae0f9c7011dedcaf32435ba2897824c9844e27a38da2781002fb7bc75ea71477af4b8c2bd806051c52528ae8fefaecc1544b60a267cf7450db55bd7ee57a81c6564a9d1da14a45eceb236b842588abc01ab081780992f1cac061c631b8dfabf334c8ae7d10ff1e7c9b9d775b39898848c04cfe54e83232593802d32417e61229a68bf85a5ef0fd113618856607db49354f4af7dd55dc891402704542931330344301f5b0a637b24db7fbdde49783c0a2db325eaeae6da4c5084c1f933720c21218a0b60e3591ea02d895611f13849a635ddfa94abdc7623e27125e3c8831a5e0d1c779a0a062fbd9a665899aa1bae1121083228d8e76ed7ecf5ca98361d2489eae229d6ae8505118cec79ac18ed9e0a875dd571c9ef160c2fa19d57e3e289bda81689e8dafe6888430f9d0a8ce20ff1af2d88cc0a6930e8795c54024000ad27e339f2c21aa280026041bc4f82ff4e0bc7d64d2cd322aa8a12d7bdb2d0329819dc55630c46d05ec6a39b1901e250f3e5325b27bcabf7d4531c0b19f7c466c580926932c4e6eb9e22a6cb11366936a6c6403b47369d417074cb6544078d25885264ac82d297c825b7367f9c8cfc07103ec28a274faca906719ec9a97ff06d2fa95e45255183e1059baa17d7070541d34cb071fbfec699b8474cf054515f7d5e99366215de4b6109d72108147375e33e385f406aeeccdeeed3eb8f8caa6ff1408df9a5b95bbab717dec1125db5c9544196d1c1bbd994e93e4083a4eaed719eb4bc3847fc6a2996344bbe6227398bb49c467a78bbb80cf44aa8b1c51d4033b7ed3628e314548eccd4f8d1ea394636a274427e99461295c39a628d0b85dbc0947b83926bdf75ec0482cbd3baf97aa384006e3a4f06a4ef18c58f2f2289206b6e84644db437c47056f817ae3803d2045d186f825aeeb309ca582963cc327a1ca27e34508720088d2365861fa42cec1fe90d2c6efca6d4ab1d10865b86f6090daa041114a3e0469040a35833cd1709ac16cca937e24a653d3d470ff8806f7f306a0bc12b55f50f5178d3a2800288ff37fc05ffd457cf8f6279c9adab372d473b36cb9f72ef0a457d69d7ad3720dbb39a1fc54e185af354443dbfd6cf050b6fd0723eeaf6ef0a3d59e8cc963458b6c68b0cf2282b673c53f18e20d0305a2bda3b18fe45d5ac750e162211894065bc3b462df762657375791c7f0c75352617a5e1c53e98e3097b75174a33cc9fc1eceb965193c47877507f1d69d82a181e87752f6894eb227d49f31848fc5d14090865287040f9f53df8ec5f9eb33d144d6e2b7e03f74f6d6dde7eb6c8c0c80ecf6849516d928e10329cc67b5c0d8b8d58968fb86f4df8d2c28ea6868e667aece09eb245afc88228fd3e696d56259b9bdbbef833cc8935c55616dd42157d46916b973b7709ffbb069325304bdfb343d699eff66fa4262328805b59ca1570125c9b187cdbcdc312b82c37a1205c9f00f7f2d990fdb384d29045a01c6459dc4256ead8ed31fe489d2f33ae2d8ace05e3cbdff63ec087e13a712a9048cc058bf55a34d603c7e5c9e075e4e82e2d941f6f82117b886232c1d7d25ab5c7ca779d0871671c72dc28f0d8eb80d7a012781daa68381189ce8c6c0d7b0950252ff8ff4ab3b36b8f2209c373265bb278b38111dc41f382b129d7e8de35c83528afc6622448d3e7bab954c5618ad29ad2a13bd1140d40908bc1078a69ee0137a3196344c402723618823cb930ed73d3f0aaa4561fb4ce07dadd8cc794b2b23000ee88130289075e24a5b78489ea781032615168107e3ee89e14acf51b737e34a36ca0ba5e889fa6832103191b8792be0bfc1e96ec265143fff49cb8c681a3ffd44d6fa26d0fda9b4e8cd7d8425af5ba8a5d57419b47b229a5b2b101870d1f60d7a98e943731ce97697fc09d255fde02fb9c866ae53fd1554531e644814c6a69a20b253d654ead2291576a6cc409b6f054fea5e77682a510c2e836dbcf2a98f6b78b37efbc3c30755f359576ad8d5a72cb7d6dc34024132e2bdbbbd86548ce6aa02a2ca817367bf2754742e0b11d94d5584e2370936437b9e5ff6cb54e2c016d24d81b350a41355d9ca88a90c6c7251937de6794bf1ff51a94e3298ebe8f3deac072d9ea126aeaa789dce7868aff4befe39d90b7523fa7d5d68062bd120fa5f39993eb42e6dd50997025012318e113c64a908cfb9c0205f13ce1746c5ccc1956c5850a0a3a5a33c5381fcc5fa20ddc2397d08964c8ef2ea19d01f6848d891aef00b5df097e9fc95cd5161cefb9b72aead440a76c24829cfa364bf5978180ae4fee2bd742222341869d4d6483a9cef6f35a2226b58fec6dfa4d7a99fdf7045ffd81888c9ecdf6c6ce3408439fb51d6bbbe0b4f9291a6d2972bbb3c1cf42e1096d943bd891714bfad7c51beb70ddc130bd946e5218af3f45fd68f11e6e174e561a8d97430bedeaace87605f507e10815fa087ccba71fac651e17eeb73b4d3018976767c959d693fad5cfd9ce5125fa3c3b23ad9d1d4539a94596adfd0c09b1c607a2a5eeae17cc15738cf291eb706fe496cf82d78b7e259c6e7cdea995813af04d3896b88f5ab0eff3ce6130b0bccb5b4606d1dcc79502d2c2cc1085fac047e02482d2c9e0084a443bdc9ce476f241cf8f1c8e2a4009dcc79e82874e6e1cb23e48a6a76691187a3103e512ffdbb2a2da140b5b74221a0dfce423cce133bec6e8419692932e619cb57478051a4aba8053f0b7a619265a52c477faf4721a559bbe72a374227fd864879fb06665a6080fe77acf0a3bb6fe5cb587847f2d7cc10bbebf8ed038240b27568b7ba3ab8af370a456571182205851ab200f738b07087bc027673068c955d13db8210f873f9eaa3a2d8de68e2449adf3232b92fa8d98548a549a2a7c61e6683ce4e3d93f0d32fec6cedfb21f89a4b61c75b599cf20a447ac05922d8d7ab0e63f9c6d13324a36c611fb9b8c851b6795996c6f72fa171951ab01a14b51d4a9e9fdf8a620687a0508502ceb7118cdac3c0d633a2fc445e90ab950fd1849eff3c7969373b1d9679ff1f8c1fd408cadf83c2e8cbdd4902330ee20d12359c128662b920735d17013eecfc34b7b33ce6daeca0fe03de5c0454cf51b8f1522d5c20439944226cac612984293dd909a3bba2d10b52ca71cb211b81784738d2dfcfa8191fb56d13c29c34188fa1cd7bd39b119da6ac795d3ccf3e8684d7acbe308daab8bcefc6cc2f4280c109e2ec8346ff89f36ba984240e16c2174bcb00d191e24a4a3fa83e7ee549ffd23011565c8661c9c12b608b8c87dc459e879e8b078b8637d7ab294c04fac64b05887ff4859217e11749a455d5207eff47a1a5e586cd59613e3b6a863aace67ad403fa7a5cad32b65a614fb753fcb8043423daf92daf820b1edbcc41a124a0ce9e0a31ab3c90744b7f565ed919af318d99e2ddfd79ad2b8ee70f717cd7adf10ea88a037ad1909c4744d595b0f4a73b9a238b7601a67b766b1be15320ee79a2e4a8ec18e08ad4f75460b07fdcac6c5d3d4d44e4a0919cce6c4e9c699a9f761306e25d422a5d2a0c9770aab47089c6d93e0f5de8ded7fe0ee2164741083ced707ea6ac1064be77ef42998fa8725875629d1a1f065008755d0311f4c20f36a8b5c12c37b0fc69c7db0f4c39718dd821fbd05688a5cf0706e81513c05cec989e22971e31cd015344a6647ca1035168f13637933ce7e9e1b835bd7bea7c922c36154f5284e4dee52273d650a0b337f4b15f8000d67110ac04fb8f4091fb0d6360360e6a176b54861a99526467e8c7225166a96eebde5600bf49c79c97433fc712d8c46f10b68013345b43ee280d63626ca66c0c56f9ea501b598c20139c2ee7dbf82477b76900444c42b6e1b13eb678ba00936b96765365602094a1c33f5148d26a3874ab906a04f874b00fa0b52006c328394e27c36bb47258c17c3a67a11aa03e96771fc20424889a79a4eb06e1cd17fe75a26b32f5bafe2dedada4028740a0aecbf037dff3e66aea5035656767586c8f1ad4b7f1630368855484a1d5605c38b550ae0665953a6d7ff5901b5675df866b6c5fd9d6d4df3db9516c60280939b10a62669e842115e5441d5da4c6f6dd07003de6250eb3322eb58403c3941c639d63ce52a57e706f53dd831a112f8d297c48cca46bae701e9e4520ad40586dd028371d0ba5b915a9be5467c4488cef4d34c137aec77e73190851c34dd1852d97036ae28ba6ea29c1bebb774d2be486711a84744b4432a0a86cb8fe0cf373bbb22f71e5db5594b4aed0ce5a1e966622279b0e7f8f95c364e0ccc729e7ebaa3aa3ff114ed1aa140b9d63ac2d916ae15cb61a01bec32a2e397d382577c003d4eb06216802864dd5e0843155fa7bf31b527df200af9441c704171e848d41c62e8ba37fb8a7b5327d0ace93f96e051458f23005279e5f4a6500f3e6acda0adb79a9abd82ebf06a93d25e24b2c0ab50b2428257a651951eac16b89c6745e9c8b25bfcb7388e6f171a80c1fa38743bf0d78973d0bef36474e94cce60d25cea1a8bcdd74647bf4943db307106f59cb4ba8d7f9d11bd93ca0d3d33cf5b54f816eede88c8e7e25bc9bcdcb4739853055c9f3277e197850b18e2d942e13e378efe9eafa79afcff2016d766f9070e5ae0639f2b05407e6a8cb1283513199112ec927b207440e1a522bff11ef9dcb499b2f31e2e679b4d4c66ca6fa4a37d81b85d73b50a59fa2ef95d53b1d360d8d77626179982e1c0c35c9c741764d5e106ac161b51691254bf4fd3714bb8fe524ddea5243edf344c8754d868693b8584c5de338048dd59c617edffbc9f3bc462d9f73664b1ef2eba92d7c4718835ef45aaec7c6ae30c76445f02b3a1a0c10fa887d3ddcfbde39f542d14af1d8445b0480717fce8147e2e807d31806292edef0f99df3da6f1339ae7fc01f47c97529a9a8c7ff1977cc592f1b36f03ab71a343758e139652f3dbd70e2c7ae51553584aed7513bd7612f43518e056adf9dc134b1b8fcfb9025cf108b330b7e4bf243b4300fdd28f184e0cd53d1fd377d7d4830e0de3d346f500c7964a1f54ec301f9966be1ef5a9f7fbcb19c92461ad3f716857c25a4b7123895863e878ae05d12ecd511f1d3330222ceb713d2bc6ce122692b58d8e79f9c219090367454eff94907b730cb93404b4129158cb263da48b8d77d10cec31556a1c4d04cc3712879fead840b48eb73e2ebb4374da71791618493b813153031004b4f416d68f3d3689c10810df372376fd683b75fe525ea18bd0c8c017042e6f16f117eedc34afd6605ef06c5bebaefeeca854a8df53f91708a9a417141af2ef7a5d762cc48336a65143928ef204b35e3702ce28daa8d279e8701aa0b0cca0b25a6032b200cf05e44ee62308fbf9041284115b865be721e453e35ea1d1ff3b0826ad72460e8a914ff237860f227f60c1a262d648c914ab06a4f073eaa0cef97e4a9eb178c74379c743c9bde4d3fb2718ff9fed479b727042f1bfef3f1ca8367fcfb5eab8fb577a49c4bc911cd78e5297975446f1091cb6c3892cdc83ed507953049ce0b3b66043f88ef90c5220f96f4f06b11f81a40ceda9c4119a06b8533536c6311bc126b081cb07f6d98798e09434752a2e0967b1ef99d26f6c457e1c8e837d1536865fde7631e7361ff2289f29923e599e4ba730a5400c7b4f6de9b8e3c9132fd1d06f5db0843a54650dc9f69331262902f2094b62a8e0a88cd03031f26e77ff951b8b97424069c88b4675723bc79153206253be451194c422a1d067fd2f7675f2d6e27886ca695fe6d967d71be49e1837bff6a375705b15782808353d6a4839ba3a784a8e4b5d3327e59ba05a03ce49b29c8f0a24c7143a8bce4a03184f1f8cf4e5835e31a1548c83b328e7f3735a53ef2fb99e903c30ed3f19ed7839d7de572eff6331d65d8ba91c34485c1e3fbddcabeec863a2e5eee260d03a24849c4ee4cc79bfad446ed69c8e054cdcb49dd0b0b0f4c31450771b9df3d6aa7370ee666d66a1cff04221c7e3d0b48b45341cadc4ce4190241009d0748c91743b17530b37da69fc4d3302aa858acfff681584f2ff2eafdafb8ec81f370ecf7a5d5ea39a0336c5e827eb52936ad0f21765c6ddb47ac74250b0350f166287c7430f2bb1f5fd4a67c94896e56959d863e48bb3345336cfa49f977f0f21216cb06a7dc56e140c8afc7d1283f785491f015178ac5c5730fc1f33ba13ad53278618557a0e369ed1d0b06a6bd17e21a5fdd41432a979c2adac453c3d2a87222c798e31f3b97bc8d6598963f2a7590480347c4dd580dc0fdd0aa92c790525109a83706edefd132d35891256a0c585428acd8370e0fef869cbb369a666fb9e8156e1d0b47e31eed24e6ed1c30830fbdc9caaf5f05020c9abd084b2b47270f8f3509cb7cf55a17269d0765165b0b83957282d7794c0f26e9c0b4f67886bd35426a1704dac6c4a112cd884d4db9afd5b2c1de68be3cb1f35eee6e2c8458084009f97c237f338c42e79a2c7e434cc110bc62046aa3acea6c6970bea989c1385a364d575885bd28de33bfc8334aed320856ef8c6c99a162889d5bef0a6cafb84ab966c7bc28ac570ea2b54a5edd2a630026c3eb6946b8865fea2ea3ca1cf8e4d4861b68270315f424e74e41f100e08777947e664f9f9e6673633af9c994c7a1f7e27535a7b6814b124c712cecd6d02b102bfd6aed7318b584a5ba4affd054089e4a530ed9910b8941015faaa9601db321f6055dcc3ee531c883c853edbdf3a67de28b3add0e91a1ce813133e4a7670d4da87020fe3d336c728e246724b6f716a77a7b57c22a03731ba903b854b9813b751d4c7aed4cd24091a61acc5e3a36608808db461cdf461950f1162cd2275e34ae3b0052441240e922b51f7cad50184dff7187d84d1f0e5b3aa8c26dda20c80ac6d0b3f9cfe93b687006856d041f17316649adc019692791882f1f5aeefbb5a9c77d0f727237d3977df2bb783800d215585bb99ab0fb2a558bf76aa00d89b90e5f9c3b8e9d70546eb3937ba859eb5aade3b54a2ca3044faeb748697020b6be9ac46392c1c42e5b38599ee5559694f51f82dbc33f178f65be2ad1029deb233c2aac34c805e73f7ef5dfec3c5d6e2c10f16b0aff31b05fe5eb304adc8defc4c887d95612c4dfd5b210614f7c076387471778520cdcb8f64f0465aa74ddfe19e03cfe22c9a2fa6d6a4d8af389855161bc7ba1848dca27f51fba16b009928676a8e9cb4de5dbf00068fd7cffcef75b0d4bf00660ce46108b01c46977f76727ec885bc943fe9ee99d2ae90ee65021b4dab4acf14a56da32ea16219b0c282b2adccb41ca3248f0e26735ec69b858da11704aa7b0cc3e2661b92a01412930060895fe9166a2eb89491a8fcce4b529c56ef426a9d2ad9a0aca14d018c894e7e48a85dfb45e8509158a34721db118e9f00675c2d1845259ecb1b8ba26a61329d3015ea08a9a02678870963c8030f7fb985cd5f245b6095e5c5f1564ed0157133d7c97d6ada18523fb1224018a9518d86a2e2bc57d3cda81dc3cb2309b17102447214bb1f8efd2846053d84e290d43927330c1d207a3308fef562d9d6e3ab8ae9fb2428dbc89ddeb719da5ed05a804e268a4f17879590b8ababb07c26047adbc12c5e9359ce74f904514b47ccf21c5611232227e2952c182f318e472726c3df288db185ec057d5bd76675ec1f00553b8ea26bd73c714bdd5d8f3e3291d6440cd00dd89dd5fb2e7c6b8b602fb5afcb9b7ecc2788058bc27324522ac2c54fb9dde85ab4827e8e0f61a96e53bb0526e96acf8b4a4d6614b2a27cbf16d2182f6fbc96e5a03c0a0e2383eb2ca8e4e525290ad1d7473cbab31158dfe0d8772aeba026f54da5dc759e2889c242987305df3353ae29b5ba2b8832c69d23ff6c73045b5ce65d194d133c3241178a802e16cef12399e0583a3463360f05d30a2620876c8719544efe5866bad4270b1861fd0c82052107a9406edef16846138a1a2ebfb38b05048ac3d1a098ef6b40e08578e7f7997504f69d40c0897e3205028084531465b934f51abccb1176ddbd879d33ec398a9b14a285fb0f4fa1914dc791e37967882e50581d9bf9fc35e2cfb3b9172417656cd93d23045620d9706e16b29fd9b5beee1bb30315cad860a7bd06e68cfdeb73ae0cc5deed480691b75c878afc97b5df76f11e34a6c4994058bdac1edcf503f06ea0b786cf7706caec11c54d37316c1dd54e9ae9c707e9e3643bc80b94d85d4cefe0253733818687f2053e23c2ed4bf236cac852a706af82bdf73950b6fb9d2d9efbf650cb9396e0d8fe6a91bfdb66e670a1068c9eb51af8af00f268c83496a1351172d0b22104c06381c86973962ddf011d50293b03e17957713d3793bfe5df0d9fc33aeb36095cfad7dc814ca51735e5b3fd2af0b0b8f0a605e8ec7a8aff2174badfa5af875ce47f81ec29fdb45d7f013799a9e0ee83556eb29d926323f701745894f0146a2085b1eb061809935d1011ed549843126a7bb42e0eb9e54663d9087a10bd3a252b24caca7ed2b88b6bced9658f12b2f4f05884acb46344660aa70518dd598774585e797d5c8f5842a3431de05aa23b44a6268c48af30f2c2956a6ecc661dcf04447d5e89d0ffa13e2fb91d615c31174a73191e30ff34cad457c437eaea9feee8c3c27480daf602d1b724062db83f3263aed18d91af7a35ea03ffb1b6e9d62f2e1f3793fd5e28c9266213430d3c7dbb3b47e720e1e918492a4724109a32b8a5cf1dd31eb75bb4dfc3d6133d9f19b85a53788adb491acb90de6abcfe2f32af37edc4fb1e2e94d33a0340e99947dc632d6de9cfe6705d2b2e06d3366b4311229e9b7e268ce5cfbecbcea10ab198b5fb1dd275f28cd8c9934f7f6a3e8a57be574064df0291addb9824e0180167f7aa68d31019fcc9029b3b44a4e14a449a89b5681c46a1aca33dfba0a7c02b4dc2144b422db6edeb5519f29e222496cbba355eef284e19b6171769816396b9bec15341e2529055adbb1b9104e41627313df0e8b28be114a40133f34d390909534d00ab78c13b22d28128cfa0c845e6621bc06634ef8d847317cd5e6dea5a9901d2095847d4de02d20118981b97625ff129c1d791530062b2dcaef79946af17c527d66ab1ad3b3bcb3ad5c50c276910c1b87bd28cb40dc0b46ea46f4750c732f6f041c4de0792a80458040d335ca79eb8bc052fa4a98fa57231fc1628ae03fc377de683257177cf150f125d74576c5ca559b4f5c055e6b19f5400f024eec7bd86d83492742363fa1a14d835d468df1872a37524349661d4a0e705355a86f33055ddef89a449b420c1104d169bd3727692081b6b7d5019392be2badef2f752150b07d0d58dbfbec23cb62bbb13a0b04749a17d220676af39b894274be9402cf045f4dedf7fcc6b748157da01b0c14fd80e0351c6594ead1012d02ab60e53a5c12707dc8dc0e0d8140aa69522b17178b864cabfed0f3fe7c72a52efdedf583c8b9164fa64318325ab8a0c115e616a8b31598513325b73a1e773456cd14d271d546424e1b7fc808cf3c681199d3dcf0787658b8fb51e666e2b1f4048d0d1aea42df8a5c710b041d5178875168e4a4968f22bbb36e0aedae3db6dd452bf2e84c2909f15f53d3b9c3c0df8e8ba62c0d8c10fd0df483f5ef571aaa7109a8a408ff59ab382d6584821147b19d111b3573defb209356ac949e51e5b15978e3710fababd989dac5a073fcad4da66ae2ce5e5525bae32f20086e4f1600f95a8c94f927aa82f1470de872457973bbf33eba461d959ffbe892895ae29816cda4ba2c90ce78bcd94587ec00dda885c288a4d406c8997da2aeee71fc9f0db65f5a965afc13ef1b1760286207bdb378bb2335ae48852de36dfce2e1a56f8af6c03c70dc13eaf1d2bd93d0f16095fd8e190047e2676388db9c4bb1e1662532ed8d337c3563a083d6cf0546dd42831eb1536c71982b9a5e3d43d54626de5040ab2ae3af960e9addf4c5d6bae9fc431573c4d9492d87ef13386c1a9d3f7b598fb9638f05fe19411bc70c5c8aa53c56e07ba87e05aac3dbe906a9d80905f81ede0ab33f382808792786447b6a0a0e13a7ba1dc7a4a1443325c274100da5d1e3d4c14863f484694b08a8c0ddb0000d61feb6b4ea6c2759f869db7ce45ef84db05f28a469b6eea48a1a7258ad2936eb94edea06cd38660711c23e14f54376213d6b45ced5020b221962284ebac1b508b66d8ad8015acffa9ad7af1a09461428bfad027a69b668ff24b2267fce6935552b557ea4412f5fb7b58f8a2b5b5c0a9d0abc650ba22d17721405d04dcfd7ed6dd41151509c8d2ef7587dbaceb09dff7dc3e1cf4dc27f37f5130e1f51660b2a88da8d984acdf55d7cd5a34d2c24161c93d8be759f160fbeef313a44b8e30061a69acb60709569ececd160a7185c7f0d27580440ba1c37cd34501f033035a2f2c001928008057c106195e1accba37369f24a541079559ded6c5cd0167e281d774a7efc4a7f7e79a75d3608fd6d72076b52abec819accf527b970acadd40b64736cdf6679a2eb0feac00cf1706534c405fc26766a26cfbc625a0d5ced8f4ecd0394fdf2ef382dcacdc1312caf740668615ea5ef58d5e9d0283e2ad96698d11862f8dd322206743b74a98b7b481dd8e432af94574add72ba2fac1e6ab53d17a7ad6f42405a12f7fd569340089ca4cfe612c2eede6a4639b8dff0e7b4e833696cd7611d5f79032fe1dbef5be393f2a5e039219e7b22431f2839f286e4062c66a69467246d7e8e70a1140be9ba9d5848e186cf44f8a0b8f6426356f5232063ff899a29a9099b15a9a41f1900406b45902cadb01695b400a299d0ebafe9ad49422266c20f9756438086871908712e138a0cbc30107ea144c2b05189d408d72d1fa876c467a9a59b8c2d61df3344dfb2ce398f61c90be7171ccbf5434c6bd5412930ad6de43b158b5376db2f796524a290341064a06e3063c65374904a8fa6f9b69eeabbbde7bef7defdedaccfd9a5fe77942656b80d3581c16df1653148b29907e49d15be30945afce7ca1fdccb5f7a24f0204bacbeb7eafcf0708bf7fb5e6457616e71bc204ff4109253f1f1f4610320879f5f1119c3ae2a5f43a6f8d5e6b7f04eb09f0d6d8852289f0d1cfd0cfe2eb245e5fc15b6392a247728604eb91c0fdee6fdfa13b1e4fc545a77a89dca77dea95e12d60f7278f17c246dbd7fdec7858842dd0206e8f0742ef7a36dd5ae8bbdde953f53dbba96f37cf6e8e90e922fcf917fa6bf342bee7857e5eb070fa642eee325dbd3ef32c4b8040840efca9d510fc9f2a667ab5ec666f844d17e16f4fcd7f765d76b363a2dbe1ec26467ab524915fbd9f17a0e2b7e96769e2cf67d7da977bd65dcddac7a6dffb362a867e6103191f6e71f6f0f5ddc874b397bdf7990d7cce7e1770f6dbf11013f932feab9666b799e185c8d0af6fc4ed365d26434fbd6fd6dc5e76f3d4a7ee66850ab79b3c5e88b38fd06647790b40fff4a91fd8ec2bfb8cef657af6c9bff76fb7c1447ff69217c2a6a73d5ec7d0e3fd02da6d7af6f110034bb293d9828fe6d298bb4e4373afe91bb1eb67bfbe16b7837a2dbea76fa77fa6973c1d7cc4d9cdce93e9337d7779bc6e791b98fdd4aae9532ff1feecfa49d36fcfa4f1dde8faed65e7f9824ef2b39720e8e78190dfec32bc5ea1c77b1a03677c2a0899e485b87d84e993e99bb700f46fef6627cf7e7dea0725feec329dc7ebb8c5ed609fd7350f040f17f5f47e5defec91af533df0bbbeb3176319f503bfeb3bfd3c9fdd9b65cdb569f3e0d7c10f4b6b0f7e3e26f8fc0896f79e575b3721a8f94406bfbd867bb1e0b7c449b9ae88f8edbf9ea1490cbf7d03906ba8c877d71c74baa4e0376710ac995283dffe6187490eae0106eedeb325e4d8855f07704043358357400216641c8d2e60019f1319d8328106c206dec8f8dd1d9841a1c78b8d0b1246f109ba42a2610d12247e7b08a42293c80acea474bc4a515046ae8e3d432e54d69b2c4dddb943793233bc028d851a9b0b18d20c1a6e702290008d80a73b0ed5d405a8217e77bfb1221a4112e21ab48ca408c3336c1569ba28f1dbd32f2ff40a157e77c7300666331683df0b6664344554f0bbbbcd45bb6756c721dfbdc66d8d4705e177770b97cb85dbc9386ae197e6ceddb8d3c5d178e37ef70a41c2372d7e3be785c04478580428057e779f412a7ac352f4bbcb3029712d4bf8edbc28289ae3187e7747a9a674c6b7237efbce8aa833f670117ff7530b8b87a405bfbaad6205ac6311dfddfcf27a63c26f2fc7c06c6c14e17777d28c8cbfa0c1efee1bed8cbf60e3b76bb7b5371b1c73c1704480d2f01c8ee32287e382845ccb9b989068a8a5e7c73023e5220d6f8dc5152b17312961786b2c169f94a2a02cbc351679f47841514da56f8d451847a6ac32b188428a6b61697191b1b68a685f72317f65af21c62350f61a0343c2c46f36cb644388c465b28c96cf865ccde533b7355447cfd7daef5e72c970439a8e4e7c7732cfe5b89ab7c62143270409c140211ab68d0d7ff78c5434631685332931b1a295a2a0502353a0a8f49490ab9e26535b5b69a290a9e315a216d65b18d6ef9eb78a34318e3d5dc5df1d7f79bdf9bcf0faadc734d8f9d628848888063323ab20e7844ca3e9b3193713fa4cbbe9b57c05075780e6a2e1c82a6f3d6b1a4ecfe938b2ca714bc7e97e7921828415c28e53fc6ea261a9c46c8854641af1b9519499944c23654a5150bcab37255039f74b357575ec31326545c4c01da447d6266a6d2c99b7c620347ab86c2c9cf5264b5377ea78796fed62102318fcf6f26b7b05094af2faddc931309d9c4f13d8efbecdc876702bd9efaed1ce4836377e7b765bdb1d9ff0bb3be602b79f1c7bdae07ef7bbe7769caec98e0b12ea9af42011120d775d5c740c71d699973b462ada75bd41f1bbfb25994825adae630f1052e977b75150bc1f479f25289cf5264b5377ee501e940e10d83b2e994aa6f2a98cc239bb43d9640dc05300d51417b8a9df9dc703913b6a457c3bd3c2d225a861fdeee756d1e48102bfbbebbebc501a4729fcee6e8e81bdf1bb7b6946c68dc0c87e7712ed0cccd9efbeddc8352da163152e706f49f8dd3d9373641cefcbb1270b19f7bbe32021171f1444c3b79e2dc3df4ffa4a264bc1ee3e4b785916bd3566a1fd7e6bcc3a32fdee3e427ebb5a1695605d4066de1ab3c0944a505292421c8eb8c73dfdf776e50dcd2c8eb0bb09fc5be69d77d973d7f53ad9eb00f83a5fac3b36ed0ce05fb629aa30653d76488501c21302db5b8d153b6e78a9e2b93d45b5947e4a411830da886c41ec18f981070253cde00f3d598864162cb27d814e9661e1ea04753804b18069284c8e1ce12081886aac24aa42829810175a3fb09095588e66ee9165675881d7a436c607edeb713bdb1c0351b735a35b96d75a77e0869a244ede1a086081ca39f675377fa74743c04d9873ece7acd38006b76d5c6dc5577fbb2246411146bf9b35be02b736c756a5d36c40329a25e2055b8ee107361b4247daccf0d6c8a6824d0866ec20f8ba24b15249067572ced90af173f6f139679f8820b344b1bbddc44d31f0829df8cbcb3d282b4a7f97706bb4327c6b05e85533f7acd6f635178e0adc94316a3d86d4a4d49ed46408a91da5108182543ba2864596b036b6b686ed9035aa09d3d67a6f8d6947d2a68c69445fb3f7deba738ebb9de7ce0c6d4ba7d3e976289a1500de1ad15ca0fdadb1ca1b6f82b7c62a6032288fc7e3c9cc54893a7732f9b34fe5c0ebb276162fc10004dbdcc835467a0dc5fe42a258ac5029cbd2d419ab14ad1875168c58f1f135373ea707deea223b1129449c08de227e7b06b219510c78b2378bdb22d2d85f61bfe006f111b95bfcb6f8e2ecefdf8eadaf1782f6e16a895775bff1395ffb48ccbced767d9d57ed985773c7153821cd9ee24cd1d2624a14a4294890a6e498c2e4a3b5ef5ae0b67a833be649640e9096821b02e6808f160a5f770e90bb8390fec6dd47e710f0939d44de1a5ba05febcb17d3b4411d0e60ce8d39e4bd59ccec9decdbf25a7713bde494a033f402149fb10d7fdac4f0d6782676d60546a2f07bf5f7560879b547d038f299d3598ce19118f4f391238f608e70afea80993d76f6e741f0adc5fa082585aa83e083b9f0d678c43a5afdd0641438b3391b39e7ec533bf8995c77d544b394a5cf39e7dc6bb8f01a9c23454a9014e1ab354628fc780965cb904c3b8e0f5ccab6a968284f8679074ad830dd91bd4e424932dcd94fbca43e70e5efad110a0e284cafea809928761cf8b636738302e62d4fa7af3b906b9fef8ddbffe10b4c1eab011497e0adf18998d76f8d4fc0bc9a5efdb204c9c056b3b2144f96adc83e6e3fb236b2b3b0369c53675a93a71d48621626ca79496e93e75b05e535294eff5993a71da813dcd1658c4d40c96d62ecc46a13e5d6e469df77cc4f9b28af4971fa8613dde9cc923479da813a41d3cc8163f29af4cc6a13b526f75d2d703a1c646678e8ce9a3ced409de04e0f07bb9d58c6e93fe0061d999e3579da813ac19d9e137379b847663c54f0c0bbedbc26c5e93fe0061d0ec137b8d73d979170f6bae7f5eb55f4b1016af0ce7adc51b3c733331e2a7890f1c0f38076db3bf6b0eb1e4e0fba6efb06ecc1ec1e4a0fa487dd6ddfa9d0e3bd991ecf3929da03e69c60ceb9fd76b3d743f624902d9073aecff27ef4e7ae33c6703b9b1a93603819a3f4bbd2624eac3889026489bf9d9e0f186894d9e95152dcf9e0e56842d3fee2dce9294b93644106adbe84caa055a924852fbf4e647b16b43235bc353a31f2e45ba39320335d76f6574af0384fe27eee3746b12c7fef13a1a0ebb33b1f23d77d5f9fd52076ba4fe0c4e9490a8071f2ad716cfd5dcf417ea751b39721ea439055aa8a54796b81bb4e66f22412e5c9de07125f32cb90ddec691853f1f6e63ee9c31270e21603396020b65a822f7bd62806663e808dabfc71085f071878fbfd9d57a3b0dba9bbbf1897b817831d8911e5abb6828f44077c3adf0f6ed5ef27d695e277558a0919feae7410adc1119b126b7af5a7c5ecacb518d014e535c4922c4b0e6e1aaeac2abb4eb02c4bb2848d2f723bd8c2740911a5b082b6c5c417ae2b249e5289d9974aa6ec88a48f95496e9db119446b70c45a84edc02648ed8dd59900b84abe9290bde555956459fad28e81722f70dacb9264332acbb2eff47acab2244b63d8f1cbb22c7b8a3bf8913e579ad4497f3e3d7ad20e3436113ece5b639891b7f0d618467c55076c4c180d303899d4081684afcced60fb047c48d03132211a977c5d0c2eee8051f0783cb0bc374fa7d399a6ce9873cebd4366a2b5d64634da3116daed76c45c963b239acf8b868071a6616693e37eafcdb9f8bad87b67b00f8031ee80f5d6a6e5190c3b0fc6777fb607287145c0f80ac1185b9df72ef340687dadf699d84422c9bdf7def7eeadc99b8061e7293d94be20a11e660dba06bd68f1d313bc5d4f7079f4ed7a62edd55fd61315d884580a134c82746f57135dafea80ddd8eb09b2d504da6aa285d1ce87b818d68b4a8c9d1f222351fa43a44b0c6f57133d7ee6ed6a02ea559d3de367c56f05825a85542bd0978a9f219ab72b10901588f833fc397dce57b29eda9a0c97c0742d59244e8a0425f1b106240531345088594a210649488c90116fcd832c289024c961a58945f044060a5d9e50e5100bebd9f920060885b9d313266e284c16155652f09e6c2b1dc65c8528d013cb091665cbceca6fd920abca32a2b602b1718cc1c20b972a655b61b688c2fc2061a3673459eb09de1ac32c99e572939acc4c3e6730dc7eeee9a36a498ea844cd78aa32434689a715665a4f4f4ee2b4f0f430463a63fbea8e13c6840b2e624e8b912962ee78f4939b635284e55221463f393dc7e3551d926a0e470ab9b91a4122e4e690c62889c1c175e634303f503063a664c65ce534116068de1ae74cbccc5ba31c972fbf2f414e5e536e0a8cd596536b91fa500c14e1859b38474eae881cd6ab9ab7e8f283fbdc55e0eb70f86006331cedbc7eca5c9e9de53100fb6ccee9f17a97472684797b3c5eefec339707f7c8ddc99ed975efec9aec3bb9eb9eaea33d8e73d66060eef9bb4f83100c55ba236f48f2820c701a4860f8b9db9c99367ce6417db17ad56e7d29fab1cf669fc9ad7f543e8fe07804cfbdc6c29164189bc6b8350d42fe8cbbce627089bee6bebd477616e77c81b5d9a70e358feeb9e700cea3bbb539fb48ccbc94ce3965a8d70ca2961b9615306234673c86b49c856969c1c44497c4963605382f62440049b519e1007b11232e6b063d4a3d111981d2d6a4842e22b0f032c7095f006f8d7130e25ce8e024a8dbbd17f77b7106e13ef6e922c5cc21fb36ce788b9996359ddf062f6b5ed05ed509c27765505c0746829724517cf7d6e865c8ab298a03485a42097fbb0821c4575374841dafa2e90f1cafa6a809345e45532aa65753d448d2ab680ae4e8d514edc1e25534951abe9aa236bc9c78154d87887935456b7c79154d8b5c5e4d511e6fafa2a916dbab296a95f62a9a12cf5e4d511a505e45d32ae3ab299ad5e455349de2fbebd51425e2f52a9a5e6dbd9aa23a8aafa2e90dad57537407d6ab685ac4ead514c522be8aa63ea85e4dd1a7a957511139ba443d8a71ee02f539e78cd5cc117e3fe086dbc126b9698ad36f07eb0524e20a57d1477b35b783ed027a115738eeb6b705b47d14f8e299e481d8373e3df74bf240dc2fb654757df7333fd92d799ff4a9f796eaed1f94f8dc49e4274b2e441877297a3545616844418833ce5946f7dd16b186ea7cea883e0244d796825bb3c94d923e23721f91f5ae442f2fef1b22d2d28269bf190964ce08f68e8781db68c0414b9a8eaf99ea0a13dc90ba0cd97a70a1c6030b1a060045c7141e576a8c695b128ab2ae35dd3812a5ec1a4b508e10b3b6b088693ac1c904635a16525494a7b34994aa29b0154b17ac7ac8d0124af5e832b380e4485518113620b81c6162702f8cce64a85981f26483418c303b7c14e5885a3788cab2aa383ab224f76482f4c6d4dc989009115b8d134ec48862d2058b519953008654207342c98edc30a362e50415550ce08163c9ad0796a1196b066c952415442c9b4155011372c450db81a40ad1d814c1074e30211ca2830dadccc6912f29276d4d8c1071e2a4c39038c98d7d61423296a1aa4517165186e686c6703e08d3d17523081828333ad0386e21e244c6d18858932ecca957e04419935411b434310e484729f8a83a9a12d2a4898fb1518624888509223c285045a989058da4223830a7ac01096aab08972a37a291e969c696265cb0306902c01027de6d8102050a415a5dd60610c68952181f25a808b264068d2256b5044b38d7c64b9b9a7114e60d4dca094d699031454ac051c6b50a990091b82217d8d592245f1208298184135bb4147959434099702cad6b459426253416b2aa5c38b1116171e36dc514122517329c38497293c284132d503eb048d5f06da1513c363962e30a1227b2048f35b5aa1743a22b63b8a884a6cc18218556979749e4c799095b563c11a61d6d38c911c4a5c85cda91a76bd72daa28299c383a11a581138a60c32e45b9185d3b92cb09c38e11d8d88e24011561b0be40537343b28464ab575240348232429a1831c70937a5a0aaa6aea32c467c432ecc58b9502be2832d87932dca51f1927642919461911a09a838410695347745cc06625d6008a524117a41a449a6c45092121e26dc987445a9400864878ca363198ee26f880835aeaba11595a422ae122ece84868292ae562c424458717a1bcb7256bc2607d882ac9502eb04836719eeeaf7be26df10d042c4186eea3759f69ab45b0c96f8eeaa0e87ed0bc2ade51c0bc22c7be8072e1d612b912fa0311eb8df5d1be1c2fcdec4216d6384c0a04146856707f9bdb72983dbd709c24105c1356cc1b56f81356fce580b991cece490866e9da00e8720d1baa5103351262488850a292c524ac894151d624ca8a4502285a66003ca6976fda147aa28e7f4360fc436cd252c328ea2dec9574a573ef4c099d9c6d46bad75046e60ed6d43896bad75aee84491459d7dd889828beac27590cd8c5adb51584c9da08da25f8db2b5c618d80c71a7f5769d0afadcd396029b73c65a67df2af5f5fa7a000337694c8e61a6027fbd49991b9ffd1cf81d6b0dab9586115277f34e30831a4b3e771decede410199069e6dac17cc1071cacf1f5f9ecf9c3156e736ecf39e3b0e17cd860f69bb944a00223bb7aca32640a4f982f60665c6161495d3caa4e8d24386bada1a4036b6cd5942ac80d05f724e6c719dc2113fca142c3c6a631857af9a162dabc5d69b4a0217c95772d53c89bc9d529c793e42f8aefedea94a229ccabbf1d607c9b997c9a7232610b1a34db4f6dfae92d0749f28806cd3eec3c619d4f453e027c2468568e55691a237f40f94109362131d9686262a2aca96ba84cc3dbb589eacdb76b5314d93a236886705d827bdbf5db75c9cd3efd8c716052d22b13530e8e994b51c2300d67202d9505fd88ad4b6242e88f982e01f0765d223e7fbb2e41bdfaeb11160cfb8171f3c34e4f12d04e12e2a15b825c6f342657da69724139b974412e33e94b46dc5291d8eee6c7c7712775a54e67eaccb22ccb12e34e96ddecd867ee74efe6478ff833f79bf3c4c919f4e4dc819f397cb65ba7ceacc93dcda6699a23c8aeb517573908f8499f09f4719f7df2c9eee757eeb2244b72efbdb7ee95e09adcfd1ce1f775f6f11d8c6e0d35c14c54525b6500bdfa531ac33418ebac713771afc45bde0d6224892b89485752310908be425c636005b417c2be1984e78e923bac6f96d99d24efbd97cc160337e0701277cc87b84f5a6d7396d97d07df94ddfcd2e7a380acf3939f2d103016e25cb6f5db0a76915c4f2b328c18435d305a0c7f5d308254fc74956f57a43026207125f548bada62e2722a368d70466583488b1b59d4888825399d495325aa45e66d8d415c61680d8b70b5196182e58595aaaa2f4b625e50a89a8ab124e9c50e8e2b4671c71033835c26d294e7bd5d91c6f254c72aeeb9ffe87aee656fd7c95e82bc3def9e7af343f6dcb3ef77218e5ceced2ae3ecedaaf485bebdee7a4dfa7aadef257da4feb2dfb25bbb9700c1f293f523f8e307c6cd0f3b3d48c59d4f901283d624cad397947dd2d414448ecd688a921aa68e0b6896a232698734d44844c12c13559282914ec49c5d746eba2ebadd35dc1c8255c82bc1ac1764e5fae218cc32f5be3a785414c21a2a31ad473ad6175eebd17a8197d528ffd15a8f905ed5d121758e8a5e6bad35f90384447d580a50020aa01a278e24a4b01eb998b2a2c81891315c86d4e0e4dbf568085dabaa0a160d5dc0e0dadcdadc6bd1d9b9f7de3e8cce8cd6708e7db3ec6923a330bff726a188ecc2dbb5a8a948e9d574aa9797dcd845118ad5c5508a1f1e635a14593069b185050f6ebfc593b5055811d52f470e0ec10c88882b82dce0e7db9505d74f14aff07665616583f3b72b8ba80d40162c580c5f05dad865d2faa4489f083c3cb03df3d05dbdb1dd3e9ab3362faa7105b6931df71d49fa40c0a3019627042294c2d2c7e376d2d72fb6e0fa46e8bc6ffeb9fde68603d207012992ecb863d2170260cec91aac71fb2148cd9c63c9b3950bd66778bba200f752bf9373f0064096024c7876dfddf6266079b60f04c01cabc11abf0f029e736cbfc9e1c0da313ca46f276f0064792ccfce666d48f8e6c767de1ba961e7d9fdc6a74b6d9f083c3cd0d9ac0de92bb0fdf24048094520fbaec0fa46d89e1ff7deeef21cc08542a19067fb843c7417219bb521097978dcf8e87efb192914e3c5bc801a962cad11886a4c307042cb5bd208685627d6c82c26eaa6af5021b31428d9b87f9a04d225cebb2c7f76f0b2dc619aa75aef13b626bbee5a041d4b43acb8ad2854457225eaca53a4cfeae09a4777edf6e34462ed9fa69f1a397e68f0fc76558163035005d31fedf00a2815542b884fae2bac9accf4edaa2268284e8c8929b80e69adc324eb1096e1cfd29071e84bc64f8ca010128a1a69d1dc7815222bf58f1212ceb14c111846ddb2c7c1cad46ad3ba5baad7eb90a851369bc4ed6f430484c0708e508edf6f57a1a857d3a2144d5e786bf3d602062806bcaef2aecabcedb742e75de5bded3434dd82050be88c0c0fddd1fceda7ceb4f9dbcb0b7f3b8921fd0cafe129284173f30e0cf035684521c4e4a508ed888c48c892ccdb3588485a1d9674a834cb5aad6ad299c101000001c3170000200c0a8703418ee3489225937c14801467a630483c2893452291702c88824086c1200462000660108081204619e5a8a15a01043cd24cc6dab5cd4d0156a17e6c6ec5c41201172d0d433afa961cc48546634ed23ad1c37acaed98d1d97eb48429c682c50002be7b9114ff4435d0f374ff65c8926cafd57573b325edee74218b301cd026f2f2f294418fd6c49b0e0825d58b95d36e9b7ff6627eb932f86c9e88942799097f4f84cc218e602107b9200559d4c65dc9fea84c0b9247aa0139178febf1f59fdeee3f4ce6f01f81fcc55d88f2c6eff5cbd1fd89f8e40e63e717c299458fa87f5d9d2d6ad2b1a6e9bcbacb2135bf9165e254c91214dd4fe153f3831fe8463fc41807f7ea3576820abdde29abd4c4ce4cb308ab2e78400eef80d51286c078fade3b0cad00c09e9c9e05b21cb66198de1c5c8178446036385b971cabe76fbc8c09ae4c0e6905cfabec575640f874158f66ade8364fd307733cc57c6857312b20331883581fc9dd148f289bc377137b98060d3860e45fdcf738c4132404ee21d4d0009a4fe78615c8f3945773dd7c6cb7e49c4bbbfb7cfa8753a8f3ad5fb23dcd2b96dae73c5d7e61eb5d08b04c130e6abd9cae85392e907e25ea74979c994ceb540ee925acae51295c66cd9df57805ac67743c7b4bf48131cae74ee4d8b8b50416163571c3e07bd97265deb32346bc9eb873ae58c64ed5da342601833bbd7c284e4d43d1321500642a08c2cbd34a5dca0c767108944ca38cf85a2fcde067d9cd8d9a9687f9161ab8a96db5d391d1a7a9005c2553084feda74f498f3db76221e5b494740d3ae89b0985a15c8ee71a5a26429b63466842f7650a094a5327214c889df2e425955c7613e38840a6994ca68c3a4907b94e447ff1fd24a40e69b7955a86b5af1ec4bdacd6db188d8f54e29c5b5283c2ca4d15b9d0e9394810de6ee76736382845ca380893b106862c713f6fa3381fcf26a0d5164db233c4b91776e6dc8c841984aa28d4ce96b0d85124c901ea7a91642f28cfe2fe4b880ff2f6b1e1461ce9806a50ed353cf13edbd5590a53f4922ed2a1b30a703468caccbee469ea7a945982322822f2c09464b8071e90b4323e4948bf985355fbcaf3c2b89b890b839e8fc8672a7e617723df2a35f32d30b9ca3b335c379e72a67215eb092c37641a580c26baad2f67224569d03621ce9f5869e0b381651883547c7ffca8b7c0f11ecf7b37328e277499b50417b81879bb6814b2601462a73710bcc3610ee33a3fa7f242944043aea24b9b62e6be3c231da5d996665eb5911b76cd4a245cf66c880082bf148909e1efc6c24487c175fc7624201e49ba72ee7006ccdf60642b7a39ecf8bfc040096b991a5b967626fc9f500cc674e66d20c6704d1e7204051d3fc924b7ef00561d449b6c9097f670a24c732962e547cc8e3649d009dcb4ae84ba714e04add1b446093ff9080ad97df34e3a6284221c80095b105801a171b9d6d407125280ec5a6f806c3ac2a330628e81491dd69e9e700d026058254461b334b8b8ef3c1e89354d4f317386b838a9cde2838ce2d6c34c270135049f777329c6533ac686cf1e5fa2cc09e092e7db8646a534e7d1aa8e562c5006f8ace769cc9bd32d30db39487863da51a4df1a07e6f1a2cd40a1dfe55060ce3b0a994fea94ac571d29e8aa15f455b1af918842c7a461682129135dcc037642ef837b42c1e1750f556fdf8e2007393b07098f8ff1f9a4f7fe5f3e23df6bd235de0e394345852da1f79183bef7678ffc1d4930af94927584646a920b3d59c81f3e67c0a690020ce17b9b9f33c732d52f95d78a7fe1f026fffa4758f3be0dc675794ec9e23caddd4450d5d578108c995d1d4fc051e7e6b9fc5a772531936e26c39d25a06ce0ed7e4f5201fffbf3f59c13b5cc15e606b59519cb6e96607e6a4efd6da1d5be7d1ee4d0fe5c4db2679513722b05be450ca631e6d511da514929c896a400e3bb62834b5b41573a66616d3427e51a5c005c2c0a92940558d94e6cf551eb2cbfd0c88ce484ce09bb172e2d0ca5ea3a6201371dc8afd7dc30b73f54cd4a6cd1cb3be5675400c6b748ed5921ec56258166c69c7644279afbfa81736ecf9fb0a96da85c9d79211197a8870d758d7cd4040932414823cafb117e03ccc2ee876292d8e706acc1f855ff512050b27223726d9b2174f17098c40582c55f36ee9db125fde2d1e65152c4030d7bfc91e71e15cc8e9c9430949b13cc423ec3abb5a8b241d0a1f531221b678db7431c008dc307c542b0a59ef4e3c08dd2bf11349041dd9c274f5a0b3668fefc209371ce5f3f3466e481680d5e6f340e12344281fde6311bf0ae471c2ebc066f24712ece6f693e85a7b4e9f0982d71192c879ef9efaf0b212c70c1f5d9aff94539519e8f7bea037f7ea478c1af426408ba9186a69d12a773c89b1035190f26ed7dc4b86abdeb9695641854c24001722d3e7530765683edfc008b19352d16acfab4d19c7b4d8e09dc2a4cff448a37293c9026edf3038b9a0ddfefb44dc070fdb4260359fad39e7293e064d0413a4289117330061e45b0c48b5fd4958077dbbba81308868a3396c9c1bc102329e3c015ecb84729eceb79494173e9426e6210ebbc4f5a834003a2e4e71f9353f2b0a1e6df92666ea3aa5d0825e4aa9214c608efb95016f25109b96bc11402753d4f2cfd8f9250520a9d28471eea1f590c29549acdfc9e10b32879a6d8739af9ff57f87cf4c761ca76784d99dbf79dff01264eba9647bd55bb668800d5ee7ead1aee11382dbf8eb63c4024c483693b2f266e451363053c5608941e4c0307e695b62425ef95694c50d57c507cdfaf522a8f4773dd6e9742e9e34418c6954de12fb20d31342b32f04d83ccf3ec055f34f53ee911b9889f16298f57d4f45463a65799c64dcc9fee50e4a2673b1e9aedef63cf328593da5931d6b3f5902cc099ffa9c453583cf939961ff1838d66bc069b8454bd622e4f05e573ab09a54bcc9079089f907c97d551991f939701a98ebc68d3378dcc1f6d3c82da2eb2d317e07c865620a0a07417eab183b366ec4080e3c1fcab93d8213906242a646f559c72b8f1aadfbf5f6b6dda0a88ac5afb03de80291b8ddcd84dec46174b88dccaaae0eb2662e21471b0730d0e4c1457e35cac6b877dd6c1f5261219d9a8d41a86169337121f3d6c2fd4dc114d0e723406ca92b392e558eb494abdcf4c9962017228971e037591684fc7c2f2a967e8b634548e1a72b21abd50d8b0f99d2910f9661582606c205bcb83ac46ad773e90cda8ada2b0613970e41bd849c0a0e54b26c313e2259b736d4674c9389272d286f8849f129440d941889e0799526503ecd3dfcdbccff966dae7f62e2a1204e4f3e2cdfffb98de3ee58595d33aa463d6884a97a74953d30a74b89ef92b5170560d10b8d7bfa7a608c997cba582f802b8292c89430058a060e77773a901a5af15d929a77e2370aa462d374da14a0115e21113aaf80a7d6c8e4b4fe73630b18d306c367d0bac0d8ac62c6206353dfabe2293c4fa6d8b9ba646a3d35344235477cbaffed7ba7b40b1639a8b3c78179e37b04262a836464580826d42b2ba5bf3217d525aec5232348a5134b4bd0b58bbc805ab0a9d7a76490c0b53237bb62a14059e74969c76f1cd38429428d79ecb758dd32448ac7f960fea7b469a4eeeb3470a8a4f513e74250bdee9e42cd74216df44430446be82d9e3689a4f526aeef7116dc8904415222311b092e10cd230f193178f168a737512f1ab44b28cd6592edf137e7bfcd526154ad4afaee06527513d8ab240e4a76e436678046d95dd35a08d17dd13baa4e137e149a15d7ab9a356ab21bd2dfd273d00290c4a6f6c89b2c668e8bb6e6a38c2bf705b65088dda77b5b8ac92acf13a2b3bbd0839427f275697b5c8666cf411cab15e7b0994a520677e0cbffdac6dda60ba8889982b268c0c78d1d0ce66a0f30c58caa18ef9162d14dcc5a0d114998113189020ff7f339e7abc1714a62e178a0323ff239d9866b76b61e12510b4a29d56494671775ec792884da06ea13389df42fc98e61c5ad4b9cd99f85a9061c6c51a7064e5fb3a73aa0523394772811cdf3860ecea9c8f1ce546661417826713363405cd0dd3934125f1e68c117622e440abab6c1670c5bcbe11a5310cbca078d5b3843154700506cc684b5a4fb2c39b71085e6f6124a2abfa0e5b97f885e1e3d7d482a15f588652b1ad61e4dd2ca9536c5cba268733a5be7e488c9ee1e2177e7361c79f323f6c4fca51af103d4971af5e10ff803f6ecd01f43d276d5797af801ee97a1e2a58961488b651badd474b889d6dd50c8df6542320e8029cc15fec17c225b4c5f35581c3a6f54df4e72f6286f43b6475f1c8eb2f038905fbe17b8e9e49f252fa31747989b011f5f47399105ecd2f4e59474da3b1a891a1667b7f5142b56637902a243bceee5103a6ca1fde687555936e2bee22928bb15446b70cc5f296dc15cdec07441c630f3753c622206b9faef6ae488f77b739e1467603640d71546a93a600140c4eb82066e61a00909a8479b4436b994dc7f0ce516486bea061ca613668177d1cd03fee0dc1ecaeff79f2205e8bec5cc36feadb0db3725a45e0dcbe1fdffcd5da512735e2216cbfdc1d68e588b9d217f16c10a6858bd08683b4e19f892b1a858a595b1e0c80b0ede00627705ac13a4cf507b02e13f94c6323929ff4718467bafbd89d54ecba102007f70c4a792bc2b97297f0f4a161f003936e7b98b2dfa1e56a2505de1ac95f31d2dcafea7199173a1ba2a98893ec03511991fd829b76031b5eb04f2c43b76f062d9a8a128e9cd668e4c2b12ea15d849c9633d497b2c81cb57beaf15243c8210eeb61eaab3828cb060c712c247fe759a3f8cf09272889ac95c7d8451068631c3a5236b6a807cb6e5c543bcfaae536b431aded2ae0ec71f9237959cf1a442221927baa59a3cbd2bb0ac6f6d2826ffb457293c03bfc23efd4d32dde417fb3e9c0a337208c319f05bbe04bb7ae9bae32e9bbc1b08438019de115d86ffe20c5702717c86546d185b329d29e001d3c6fee5cc363d7893506204a95f770a58e3ea09094846725b87cbc7fc91c4265f62caf0317fac9fab7c96f84ed67212e932fa8d56f24d83665eb4646d77c767d2900fd22524002efd0c7f9e5aceebff89df9cfcdc814375a35c6c6571bf62f07b9545104677222ffce042efb7fab040fbb310638428a1cfe372b90a4e58a1c4511f1c3bdaf7d40d96bcdd89795266b231bb77ca4758b5ed1a086d311b13eb1fa29084bdee673b600e9eaf6d9f7d34e221b263bacdeda3f8662f9f0fc819d57b99ca7d38be743d22e5b663986dff6dab0300cafa4a623f759b0a99d2378c6e71b3f4994b3778f2eabc1d263ae988f32f88a0b2daf735725c5c072bfaeb134a1d6f01cb37a8731b984163e644bab570f6ae2b2da800d4eac7f55d67bacea1cf6e7f6009a35598d9867117d9dd580b28f2e2db04fe3ff8543adea00cea03e68b4f3e3f74df77be27b6b224eff648670df45d74f053fe7ab17e6dcd471e067be3fa54a7455535a81e5300a52c13c290e7a1127f1eefc566850a26ff338b3f95b2806ab7e532c13d47f66b42cc3e7ae46520d217334b016e16dacd29855b0050dd71b4716206b1514adcba7a682c798194a5f0d245bce5c5b7c910528cbc3118dc710900a31c0817e4f45abd924ad51142575cf3feb6ce6cd1ff1475a657a881f5b8a1427f3e549a771c218cee77fe68a4a3c75e54d5228c672e638f2b978696bea22e343f88c8e2d306c993a8a681a202eb453dd43e38f6d9c8fc1bdfd0b0ab54ad4826f6847b6c8df05bef3be840d080a73915d1046e16ec2943554eac68519a3f65850b8b8bec6ebdd726d21f9d7759037e0a0368050232ad43669bb84e679dd891585bac5178f04675a17c6242553085b6b1f44a1cb1041fa5aaf95bdb2cb6d8f68232b22f20aee7d848b1478f641b1b29820357caa6ea8956a9c253a2fb6977bdc6a3b3ebcd378ebf882ad68be241d73455648e0a83457f08de40e906d2d0a76366bbfefbda4d72a1a9d5d20bc4c17eb27c5196a8b18763f91d0f7983083e19adc22edf18c1a4019bbd5b2a841b32c16055bf5681f4c6f02739a79887c86cc3323b8b3c5b880419f572782edf3b2d64f626b94fc61d06c6ad0a851043a010fb1056e11172af6eca4492ebd3f86e3637b826777280aaf2883ae36adf307a25d5e037fe55ff034970963ccfd76ec6d8024302d0fdbb334999ee7e4fdfe855f71ff2c66ee0f0d8d474e0998bbbfaf3e30f4b7f7d59b73937143c999368fbf93955cc68f402d52000a23f4da19aa1d28b7a06b080ef35dcb097e0b85a05fddd537350ae9762d78b5811fd5c1f28e83e2e86e901b0545ed426697630db75c82c94b5a02ff1ad38e4271958375f4bb9a9c0901dfaf04250e430f7e8485f81bf2a2c12f958c67f1823da551fd53bf9a21aaaa70c1dec9340442071a25e51fd464899caa105551ea22cf65ff606df8ea065cafbe4fd988abfa2c28b491af4f904f5eaaab58a568b2a7cba9a38725cd0c7136dcf4cd7ec3179517604de116c1c77b071350642ed71879fe49c7fb8f61916fe70b000e11ec392bf29bccccf94c99989e32a7779963d99f30c0f58066bf04085c18771eb75c61cddfe1cf16ac2112214a76223d9274ec9ea766c7d4d03fdd24e72bdc4abc5e40ffafa4736b007edbb78af2561ed098e3aeb2f0a5e64c39082899c86883b1f1e5742d538c83906c57170f14c57519d0b4e2e265954c360a6f51ad72a302579548b57e5c74a186e0df044306ccb4bfba9b9e38ae908ff3f132bff0bd0eb73990c9bce7f15167492a7b0141e08bd9e2686f2f7de0247666193ee4d68bd8d28647e8e8458b7c5af972fae1b566bf56a6110da92e00118a21a1f264c5d7fb123fd98841f9bb7b9e38f07ebf43d9d5a1ae317fcd98de04990747484f7621e53b9f0f2957ecbba4992da5775d9aa55cf14c637a150e12a4cce510b8bd09b846a53f6566fe81dec68db21d5245a13aafac45920f6862b603590564f6a12c66b4dc904977643cd60c656124c759b424bd9ec657db50962553563edd1c7bba618bb0437aeb516075069b1bc2c9016ebeed97d7a67f21f9a438b1feaa3e52c13d1047e5a350aa11912fbaea32d2f749210e0ce611717ef19e6ff51b04a103ad55dee3bf483271b220b43ea340d24d0ac1dcf91c76385289af998a00ec512d3da0191dee973a79cedf4de72d51d0a6444450e84ce03178895fe87873893a289189de814def08aa5681435dbd6904ad436ec12d96b98f376c2ab803d0c1cb2cf484d5b38515861ff80d6c0e7bb6e9bc605de76473c0200a594283cde1029317526948598537928be3079e8ada215835af8e449f96634d24b8608cc0a6e991d23fc125085ee3b9dd3b367ac7beff58ff1d3bdf71eb3f6d78c796f6f697688fd3d677daba4c9a2f49f3356ddf25cda3a4f94b37f7a9c69f57db5fbab94f359f49f3356d3d24cd97a4f99ab6ef922639ba23230026941d9cd813ad80208f58367d1b0bae5f58baaf4c9933435f24215b5853bf5ea0e2869fa5f2b24639bfb59db88a94b1603e59f48a56afc915a5092b1018ac6254fbc98bf01e4066c8d3830296e864fd3a5565f0a0ecb0ea7a215c375f1218f9881a33d648d54b0cf6f88c667163cff48b5b08b543119caf5871685f17924989558d6103e7eae3d46a2eb01540917cc76f41dff541cad8b51a6833824c1d4279c2b8b48826b80fc4b685f23b89a619c1b17ab60e5005f1c52c8ebd8b36f44ad4940d4116cfef916360a439c25eae73402cc7ad9d9d21175c0d181f8cbaf20dfc06511aff30a9c11c91614423beea719c03acd1919c7f2c49a1280a76c2e179a549b99db03cee53c261fe669186107d36e76f2462a3d9fa6e71b7e5ece1f43d91ae933bcf03fb748a0fe0ce60471eee9c1ca48a052d930b81b74351deec2089a83bdc45aa80d0e9bb693e3b2b07215230e72a52f8b25d59fdc99d05a9cb9d9f14e78adedd5bc4e5e7d149f4f4f51230ffeeec2c77a5039c6c7d49c8cb78497cc170d6a87c2362fef80a1022055cf875515c896b7d39d7a075b7d6d7630d5ef76b6d3dd68075bfd6d7730d5ef76b7d3dd6a075b7d6d7d31a58776b7da5e30a0b7c0f4b7a3dfacc117732226706db8463417b11d398044a9544b8bb24e358abaa04d63b5fbc07c9f81e6ca45ff8bd06b235e7f1cdaa4c808e56bce4aab1ac334d100721eddb66c50420f052b4b1ac234d2e71fc2299b555732bfc2b1420db6f7abf63bbfb3dd809f48182bfb604b642edaa703b0a21ee2cd64c21889f1eb98066b8363588e6af7041b5adca044821fd5e2b1f266271117cc50208b85e834db5a121b6b151c48b1b5828f67945be726ad0babb5e360c84e17e86b5cb2d34d8b679215f691cfef7fbbc22942eb9ab4e5a51622045f8bd463e4d046e6a2e772411b68a0696d43d44027c65d0354754a1cbc2b6ad4ed2521e1b512f1b26891ba6d263b9aff2842949f0757c71d8334d244a18f55fee2b340102e97ecbc2446eec9122883f3246f8a7cb87355d1d8ba37e627157d8f1ac152d050521575f19d7c9114f6ec6ca66ad5839a6d87143b98f2b423941deab215d01f1118ab98952beba3013c24b61be865f7b1a797597927c3b087ff5d8d5f9410122dc09103c1af3033a40e83f30901f98b8816799e76a0b1a91d8a02167685fc39ca6a11b09d73d46049fe29b5a0111b4d31444df1dab07338614be5eefafb6a4bc4cff8f42402f21f34694e9e2085a52887f6bc1896bedcc6a8e35e166d9c0fbf73b81520a6f48a6f36f21a982190a195e8634e2b4df08802a2f0d0e6ff4c43de8fe64e46e3603671c45cc0ffa8119be62c280a00aa8560e3fd4bfaaba9f169eaff608a46ab60d4fd537dd15b5279c98528ef3049b60caae22b93f0f98a2217693fa470655d89e7af8d1dc0e2e86581e09d20163112be611b4099c07f8c6b10578bbae97c727889cca1218237a4844e8195d6c885b18b9935abd30b91ec2873dcbf5e6596716100e5ceb0d4cb3b0093a6c8fe6acb3222730b0ae52b2831e7b15d5c08a174f69de2d1bc3b8e36833d6f6617c40204ccb5eaca9576d521a026f1f262c70563687359bc830c8948a1e2860b420af495ff2c78ed02e7ba9a39a55907f48fbdc60e913cd8487990af9911277a88089f09bdd194126228e90326a1987bb0d8e55e8a9b0e463f0f72dbe89dd554236464939600c499b4a582e892a9ac0001b03b56c48cec7a69dddaaa4d798ba220cbe954a5fde53c07453cf24f1c8b125cad38ae3be8529df742b246a156c50f2fdaa9b3e1236dd2b3bb8e59bec47f998c90868bb0c82a30cbdb4f0eace1fef20f2ae24910e4e837376e859c1e6bfc7173d7316ca12da73feda0cbe900e12d42985b9ef8e37348259bce71ffc78406fd1e47f3d14e38d9e4e0367b380300c07057730e7af4b710241b3572a89006b35f5e39ca880c5d06f3a129aa1af56053d14a08f9f50907edb52c74423ba2c5c501720454d4249116c217796f51838707fdecd4c9b66548a102bd928c0c1417e285f2434d2f36602a158985a39ac5db4d198609d81ccb3b4d25fad69dcfe30d62e3de2b5b1596c13087b650011a48e0aca186dd8df22e3988ea741dbdfe081f4c3957589e008f257b04a471508fc351f9fab3c495ffdc81d5b045738171105780bfdeab19e84b5cecef6a3882236518a400ed129a45bd04a9455c75182405b3af3b6f3f769c7114d7ca51028495a4c26652ce11893841f3bebd8ade80504e21bb701001208cd0300152b05367a8a3fc0e2410b99dce0812a0f16598464bf9fa3f71bec132c77c8df0da111ea0e39dea37d6a4185114332c2cf3746ea596c60868cea91405d52c8928aa8b957ebf20ac0ba5734d6db63a841c04ee5ca35841eee54d967216a78f9f7f26dd26ea67f64c750b57cc97ee4ae0ee27adae3f429cfefab64cb9ae935d72538c51bdb1de1121ad56b7553395be42b42558eb372e79391c814c4135e8c4d3a9be6de93c5aacbdb8e81243da24dc5357c7091d588e9af2bf07464464b13003f895eda76042aa4e39c74e35321b35838130b5fcf36d37b706ffab154e07e17ce3646aa9978b674135e94c4496f49d0ef47526be6463e40a59e8d92d6f907f0eb79aa3fab0d2b049cbe850c1c311600c64471428b3842b5fc175458b7e75202a7da7ec6736cba74b2b663905aa2d6ecd8f8eb2db6421168a11e99f11e0068af4820e710b0b44fd8353be0175fd66fc69d612236d603ff3e46dda6999a6cea63fadbf5107c3cbe298a674cd003ede1c68d47cd49815e484af5a9e5fed8387ad281b665153ecae6335d2c37063162034256eea84330df363db1ff197553d1ba29eb7aa2013bcb464738a97f1791e3d6b30690cc21974fa25cac11f109ea7ee024a5cad9a813ff366296ddc4e04c9fd368446711da6aedb18b4f286b5cc2c5ab4d2c3956affe9540bbb5eb89351345c506d2c687262a01bc8fd03a6d73e45fccd8de8bcccdd81b3e67215a16f87c61973a353563bdbe53ac62781ce8567596aeb28c008f2e97273d218d7c190da9708180bcdec0216e883c1c2c4144d88553b55e7cd9d89064533578a8f4c85153eb781551eb6663114e24267f4d48c14b9f4ed0e0601dcaf1ea2c16700e88800bced40740bc7cc1e0d660fb1f06bd10af8015f5e7cb96d8e61a16e1ee89b80c1c00a1cde71cb7e30376393915cf41809c7b911e0c02ce6a67ce7ad0713cd124b5dc3575aad503dc6b83234ea2413cdec53166157d820b4a6df8cd8fc1f547501a3abea04ab05be98c44e226bcfa1cd91b98f925dc70576507fb2b6620121ab44facfdab28c40ca59c090e2295be028bc78145bfb32a2d9378ff1c98c1ea4b05cb7997691fc1bd5ee106de83539894dfa1615634ca0bfc3ac5abe718a3818bd1118256faed28b8e00e32ace908a1949b89ec03caad5761ce5a181fc7ab4b162b3586bc989914c4f48fe1ea0b383802f9deeae0bc16a8274ec6061829ab60f7a07a11cd3519ed0b0a267881fbb9c5c6e3a2c3a4314fe6573cc8823ffe8a6e83ad6d7e5156b83e1b80e287e62b8d03c47bc2a13c3e243b74296858e8799e26e4be41fb9dfe4d3413c772f59701fd9923ba484685fb0623337548e4be96a457089cb27b1bf1e03b385020cb8d3f79d94f890dc20b8d66f17c90445c8382c2bf5a7150c00ae6815ff129d8a52381488e07badb53141cfb3344c03deb3a33d09720f41b2ebf961ce0b11604071b9e5a797458fee3dadb3b0541a797b86b474bc30d1e85bd1e91665c811fcc421d93aab1fe54a4a65c12d4c6b498825d7456907addcb009f99b916c8d1e7a1128fbe83df2a76ebd11936f042916b295c21e96a5a9d1431040dbfc08f2c8320e205cb13118da36536e1cc4fbce538984f1d4f1b808da50a4472d3016072c59a1634107ec9337ef3d16d2caea6cfc948c3500b35927f4ca7089a02a31ff82e629550ca4d5dea35fcb42645aa53e27aed4f3c56bb4638b163810fca849adc885d441f8451d8cf702c0bfc27739842ce152e17f6ba873b228ef93530fae429734226bcf7055c56d852109c00750119e9339637e2c4c61d9adc69c3107647625b957120c570aa8e8ce2d6b2db7074eb0f6e1bf7a77826ded042be3087c350be23d33f474883a2533d4404700079908e21d656952214690acf9b34731318a7896ad5666b1553af19578394da64db07ce91f66650f0c44803ba4de635dc130fa7dca3da258e3bca4e72fd71849889b4928d4411152305afbc73ee50f1299fb9f9f676dd90743fd92bb68796cafea083474993b954720e9255463cb2aa0d380e0edd6beffd199b3d55dce289cd4c33a4c759ec46ea461af0cfb9db3b3272e1c536fce8cfb20d88d1b9a70cda750b59a31c8e501bc99ecd6befa9f12967e9cc139e5c926246c4f525e8a5ba40e3d2603012e1269be6d4a3d2ab1b91d7da99c250bea167d771ccef07413b58e48fcdf2816bb1d525a38b552360a026d2a611e8a5ae34f3a629a74eb52b68c2f562ff4c20dd063b0b608c09a7dfa298d2ee9d1052e527d023a44b2b0c0868b460967483152a116e723eee5262e2c94327a885250f44c132a91af110ac0abccdb7fc45975cd286d180f1feb4f4b72ebf877d015a586b00dbaab6848fb654be0fb8d717ee6045666ed41e7c308808905be6d06e7a0f89df27b613d412c407e9140002a3543fc49ba8b37e988a3341380eed386c7bd42e0758ffc92230f684d770c42d70037be460254da2f9625219eb16b77fcec0f1fce6b29e90d349bcb464efe5a622028916a29701497660c9caa7904094ecc142cd7bc43589f35aaf84331587794e2b11da234ec9503c452584476b28a194b765679500e57f15eca31bc81119df4d778cb77788807d0c08ceedf9ccda3e9eb8c0c0e151c1bf6dd4ea3ccdf67e915b688f554b9ba6dfbe849bbf8f70c956b95d3ce57a86385353a864374d91882727237f7cf1e8e47c68a3a5964d2b2f9483771e11a72668654f10772f40abaa93943dcb28be1a188be2024a4216d88daf0a3702447c9aa22bca1f3ba2b8d4a226a1437d2540ede494c4fc8b92cd9de0435d5fee3fbce3710ba7f6d2fbdc0e0711fd09e12ac53c4533478c5426aa95b353ba2cfcc3f497948674d2ee66c822d2327338bf33e698329a941af681b24f1389261190c855d6512dba747a952e425292645321c480bf3df160ee894383ad698827c11a058f18b795a24091bb34d296d55c1764c84755c3a2637c1291e115cd070ed49796b95d1e6d6c0251b802aac818f6a172fdfa4f35f2956e3914659df952156bef22690363505080aaf260667dfd8ccdc40e7268b3841f8f3d78caab0df9e44253e8b8a5f3e26a46582bfbd6ef6c53fc258d53f9a14e04ddcb14949abb50115888dd2adad44964f27b94aff1097af27a507d96a9498eef81c7f314b2a906bb36455bde05279774c460e98ff37c6c68bb425867d3a52e00e3ecb3d93418f86f9d1392c9dec4f092730a45b5d4548d3be03ea99705f6fe0880edd805c2b722b02d8b3aafb336a8340d8e500dd81193abcb76a2659403565a1464283c28a8d25a309abd9593cbd766cc39833112490aac0c629b3d07f51d4733f7b57abbdc7ad79c98ecac2e4f9bf5a5cbb1e7d9940c01c3bb2214f675dfd3edc328915fb1ecb2bbdfb31093dfe1c05e26beb8863acf83152db6fec47b81e9062d7c14fce2ddd5beb200d5e4d4115f68556b135b6f0954bbc1c2e85f4357321e8436a5480349273b935a9fdeb1820092215309c1c5f873ece10713d7666425e2abd33aeebb466bcc7c879833d7159a1503a3758f636f0062a24986bb18f8cb10f0c7fd4f2acd7c0496293cd6ad97cf47941785def7b7b16550ba4f26d9fc4272299aff73dd42ea8d0c93fe66b2faec0fd8b0f4f79056b810d099c2fa17f66584a6dadd7a7720af4e115d9b77884477dc0aae73f5231ed05df2baf6af7422b2d8aa21670b768e95e404f230ea82f7d739169529958a05b9cab3ceddb8eb21dda02f68b567fa2fb9440f813e892c547e5031f55aa2b71d67192e0ad1136f09bb52f23de56aad334cd46b3f82de6645f57b91e9a2d94627de5d0699e4f7dc65191d593bbf7982d173eec1d876de90957a5b5676aedf8eb0e633719a027f10c8346a4a0bf38a309fb04b38e13403ec49222585937fc44d54983f5bcc14155dcb797aabce79738711a29b53e768e38404a7f0e4fdd2180e744339e748644265b6224bc52b9698225fbe532c3a85bfce1ee7365ac25c03a249a48b88736aa7ccfc03b6f436b09e47f5b901e41a8c5659f19002d5eab3ed3332555e782854c23ca25047528564e779c5f08232ad569fb71165132c5d3d5cb22489a3d94ce9a6e395e0529232e420a3f43108eb0bdc8670396a43e1de9191fcbf68192e5118d4018d3303658b25ea3ad12faad2098efee02acdca6fee72e6fe21c65381265f76888f18f7efb46cb53acbe1e75982518d91673a979e78e1bd5444839ce90ce3df15aa7175d1b3494f35e94b008c6385c99a5b34b49295a85eed59e75480ad81505fb136363da4a108965b572f9cf705b30419c869878b1e6687d27274b412a2272ed9ef14abf86e713c25fc28cf207e00ba10632188d61771421e7dfcb2bbbb19687839d6a090f20f94e7f705e2d491431f1b0c701d8e25a4a2dc23af4ca68b093fbfa1e520ddcc69424ca08b07897219c7338153a180282209d7821bf35a44ccef8e4d0bd91173e2e58fab50f9c48f58a02d48710997f279082f90465e5714c9785330697fd7daa80aa4bf82a6dcbd5f8f0c91cd57953a0397edc021bb85a26115d18c325eb7526b5962b1a323ca35eeffbf15c0e2a49445b040886b10f3ce90d2468a0bd684a4195f8a68172d353c3540e945b5b28db2c57534090b0a6e0a5caae0a81e26e112c3794b40a9ad860e0bd1bf71c9ce6ad1accc58f7f7341fd80213cbb927d105270695ed1d3ccb021751a5e5c2dd73236b764be5627fc669209ab679134f1665336412ff38baf542fe8e2bf5299431f94a81bdec244a4d7f9ec863f627df833aa949a5fcf95949af54a2416776ed92c12611daba3d024f76e70b05396f712c2043f008a782cd6bb931ebcf57e76db30835b8f3eed676671f88e326e48252f8706e9e7f6f7f9c583dc028c715a56f22f3062ba79ab879abfa56cdee9d45ff9e5cb22ab05ec1d8e73da4d802a4d0c796160ec2adcaf1865e679d7b2799d28909b147c84d3d3e49f832c4b78a8d4f43131e314289c20e0d7c046c685f30f5b24964227407d309227cb10bf8d03ec4faa8f3c43ab350e706417d3092485b38b701efc8b49852751ed3b0c42abc5f47cb9d0cf849f073d12f8acf442117ff94ae3359fd4530f0c936c2c67d33d68ff5000f4f7d5737ac872773936c9a544e61da4a7eba5d2e9016d0bcfe44659c0e639373d690c066fddca5b57982ad13a58880ae0c2a7b17ef3a10a27e933372db79c39c529f32295ccb2fefaab7484aed35050c74e76bd448280a9976963f5bba21ff1d72bfac515c67799857674fdc0896f814e05446ab0599b4ee1716f775196e94c6de415a1af2689fd89c9fc8c48f13895db4df34749bac55aeb4a9327d9c71a3e04a5861d4dc0896c5ed06d7a3ce3712361d1f4e212eaecec7eac8d5a1241080c420bf95997d7cd9755045bac870a242246d1e9b79fd9335ef6e9e78ebabec0696048f20f362fa23a95ff4dc39b5fc58320508aa19ddf44dbd456e743867be551fe1435dd357df4bfbbe4affc0cc566022123aa8123f699d1a3269ef9f9e59326b036fa0a8158749c7164d9a709c15e74c2c326b1d7eab6a654ce06b43153d529a160579576b7a8588cc482eb382b8a24285c58019c85063ab5151c84edf9665015cc9c249ebdd1149b3927573301071b6f66233c0fa0b794a5c490e3abb32f40c026482c8c69c310001256b038f0871c22af30b326aa7cc7e4448eb8b62a152da6f63a1f4e3a68aecca017b38daa45f9de8c663adea15d741ff0b4c74c1f6b42c8bd529469c52144a96e9c4019f17573efb3e1fbb6c18b975f65887a7b87406fa09e2fe5b83e1520c95ab8c4e893b5f20503bcd4d58b592a7b1c5790c81fc4b076d6b941cc17a0b3bb37a2dab9e5c2fb794964c43e52bebe9a0b23dc09e038594174211c6b6b05de8dee9de31d4f3e0a265834f06be33810ad775c080c7c9f61434d1958ec132b4bd50d2f2149312187db65a3c94087a6fbebb4faf3fd3354d365a90a0319c16e87b5dcd8286fe41c8f817d4e5af1aa0617fc040968788035bd363c1d7951ee8b9efe10b07cfdde852d6a4584b70fd7947b2f27e2dece7a1e99a01c61e973e6faf709e881db03e888fc0e0b056a93f0801a42820ec7cb47b05b193bb771d51591402b7ae82c15e4bfebde38989819ae07ef8525edb38785c4eac20e80cb590990d6900503522606264f26dcf64123c30aafe185c392ae341ee4695abf4c0aa1324ea15e8027129be381433a8213e0d0fb1624dcfe0332099c58c78869b21ceb066ac32fe0c3e0374469119cb74324432adcc75e69fc9cd84661699b14c77a628d3ca5c65d25703921c35239220f3829cba009b533db19f834c2769f439e1dad0c38660ba2dafb7cc6883410b9603e9fdc866b1b5c428d9cd70af78ed4a3bce27df6e20d3620dadf89c3be500606e5cd917c13b1ae2fe50c0e3dea50ec6e6bc0d609d652b2c697b471eece9ed048ee0bd7cbfdadcc8ece464f20260b42919c170e62c014bd4d39b7b6f13719d1a3a08aa359b1c03ccbe4abf0ba567d09a7e4979c36c9ccf7bb8df1bca8a5117d772638c6af17b92f88069e566243e9ef5424b57a30485711750ab0732adf99fd239bdbfd603b133b078a729f48e3ed9aac0232ba5f86bf463acfb0d9b2303655520163fa89f8f88d7deacd504fef37d82a4034dfc021e1d57e05f5ce7c376aec8eaf52498fac97524ad38b728e51eeddd13c3dc2b8919a5f1d6d6f100f6ee7a96df6e80a59ab4f3c87d7be2047c67225c729877f5c5ead14201aadf0529a0ee525597f40930b9c4a31e5d052fa0947bbf814c8e46eb952475d32379fff7fb8ee6eaee478b743044a16e7c457349d847a4dfed91937744880e83c6c8ce4eed904a2aac0470769ec4bf46d1acb933e6600a063be4eb1e1716aaabba6fdfb420aa12f42c83ffd017c31ea0240500daa13224968e9298d5e498980dd9a1b4478142411d44c953bf855d08160334c2559f5d247ea1c83f4807e0f898e51ff894ec10775f1c78189b327403a20a663473a523c53307027816409ce69002e6cec82c4573d04714d4a0da019a52e31bdf0c88cf4d4080fb20df83babd801e8fc96d81ddaaf12122efb4f9280a3051c6a744ea5d924435f80943dfb5bd86bd4502faca8561c6e5a0096665ed3204d880d588554c250cbce07bf12a4f059211de24e2026dbd6a2f31a8b1ccff2f9f248c25cf66c87e94210bab4c4b801926d259ee3e83a10f9370c640a400ddcc01852df99dfe9329cab4325799df4c3e139a5966423c3643e374aaad0ddecc413fed453dc9c48d2bfd9e3c01ef9779a6d2eb5497ec715cfce5adf00960e8c479454e09cfd44062ec3cad503e36878418784ebb2304e552e15e6c454392afea39a6a965f65036e6247ce761a95b82b3ec6ff4e08d62f024b9b365d899b4ea1b51d3df1f686004d9efc000f1392d30e39834565d94267886814074cad2f273678dbee27a61c66ae697c9674232cb99f1cc6ea638d39ab9caf8338977010969cdf57fc161848262f72775a4e024b28bc3cfe7950a46e2493bec3d53019451cf46ec9bfedbbb2d7af5c34028c919137d008b3afcdb29d1c41748898a3fcd85338c211e058c72b822750fd789c40fccad59119f7224201975af948517ad1f54c7bf99f12754035f4545b18f1631a96e5a94550276a67dae0530eacc22c037cc7ead31c09e5e9c11b921fab16b20e70e9b62d71bc889bbf1a67d2f5ec90c1cb73fbf54ccb9fad7c3e5e0b1fc199264f004d1d1c83913e66d4c6031077afb64a5f649e47123b0afe78187e562d43bffbd3bb11c56046a94cbb45a3092324a8b014a04263eabc2fa490c3a14ba5634958289bf65108046a1ee48cc89304f6ce3740300983b350232a7ab081240008aa8000cb0629c487d61fac490c75793d41848fbba156e58d117e38bbe6d42884822422bbbbb77aa0adc0a200b30bb37b3eeb36c230abb4e3b90b383e82d686180275ec1f4c172a80d593266cc982a360da2033bc0b3a90e9a3a12f9d059d6e57bacdc237f6f84b0b0a5d4568646222a07c9cfeb1efd8088a254c8f64e809bcab67e1a026f956efd5e59ce712e1c29dbbafd8d01d1beb65f21f732a7d6e6ed183c36f3f74ac0b252de6ebffd667c2c975e046654fbb155ad084c5d9b450d87f6fd06539826e4c23968fbf552eeb6639fc9ddf6bafdea86f6f6cb6596cc538875493abecc9d76695fad564416b9ae1599bf5b90f74ae84ac8e665e93677f2b5a44f43eeb7df6f97bf7edfbdb24e6a19283f731aad88f52e7b775d3ea7ca93f70ed0d9d7d3dccc7d267732ba1bda42909483b6c38d739006646873da6a452c9d69f84e8044e06714032c5b7e66ef840fc00df7c55a0486a02065500b82b51ff32464ce2db7bd2504126d3b0511d1b62769f78524ef8888680bc9ec7b2994ed5bc4859d24851d5f09d785eac6fe0276a15a84856ddf136f4ea223490a1b4660685bfdde8e4b77d3e6a0a841a067bfb7a39b7f525bdacea90408246e1967a2c6030829953db5a3776fdd3aa594524a0d352d48e9f24b3dd27ec06b93f16bc9e6a6130e8ee778d4805c26a8bb4bdda176d59d099bfedeebde7baf1c14dfcdbdd70fefcdcdcb8028dc43a1a8a3c88dee6217f7759443772674c1a13b541738babb0e4eba335961e2b1a9b56af8d821e101ebf55b7537f196da900a4aad1eca6e8ad99d762b07951ec3ae136ab7e4ad09666bf0965ea359d774378fb6f6eb3b3ad90642f8fb0bdf452d14b71c42972e5dac74b0c58ad71d6043edf0a5cb0c7377e96bfa89f0525f5fdddddcba0b96c39143c769fe1b42e46b11f9fa05a2500f75ed70ae592f715a10589287d68d5f7726d05c87cea171e8938eba5e83f1271c2d35794d0b829f41598fad1bf234f29be4fe64fd49773b5bbbd57e58940aadfb26bf7dd55aaf5ceb4d49abf3cbaeb7b420a5df6b59be47da647c5326bd265b2fe5b76f649abc412b5cb6f21e36f198b03b9e194ce6500b62f11fbd0ca73b13505677a877d47d534d7726f866ee8e1841d8afc35986e4911043c2635fef90f080bf970e7a777542f1d25dccb05f7a9611b78c3e59174c300185fa4d268cad1c5d48786ced1d121e96c61dbe9bdbd2385b2d88f6202ebba515c9b67668c588894d79ec9d5d359de9590634a17e96015178f3e85e1886bd2762d72c03077ecc115cf6f733c222e6082cf6ce7e464704b1b17cd905d8cfc8882c49ec6cdb5b176384c4144648f46074c417232486805e32febd77de6a8859dce72116ec0f0c6ccab4300bcbdcefb52c6859d082d963d8d6d326ecd223ad92a67b22f69e0883b46732b7bab8b3cbe82e6ead835e369429e94febd0b2a60ed29ec139a48a01866d5578ccea2098ddd5e720ceb25d200ad627fc5231cb71b7ea7cfd7da71dc3f43d6631dd5d2d143b4d0bc56d593242b86399bbf593c163f3947dbe5a96f579ecb00b662dcdeb3c8759eedb84af1d8d2e4dcbce5ab21e64a7a5e7bd53b42ccb6f6b9a9671b04b10eed86b869fc9f732797bcc372e73cdad5cdf7e104b44d5e38c651043986130200a35098bbdc320f607316de5afe3c38cf5c99e7b3d0403a260bdfe467bc669edf5f73599e3742734b7dcc12476d5ac67100cebd9efeffdd47e5c9d27add7755d97b53404039a50358e3345f834f1a1c187069ebff703a9dcc74956ca4a460c5104162392b0991a3c3e4c302ae74a962231455c01c3cac5529aa44e943a31a61e2cc19cd856cbd2aa8afd02ca5eadd303916efd6ab9df343cba5a45b95ff640dbe96bfd3dd0ccebb31bcf8e5934b74e225d46432d24adb22eadb2373b903dfd26f3ed5c259dfbcc0d9a9256cd6c1b0bd92d771912d62a4eab32adbadba56955762f4bad8a5d7fa95aeb65ad4a533343305a46b82fa78b160fcd8cfbcc5b420f847dfea5e051d52a7a5907baa7f5f340f8f59816ec9a86479856cd22a0edd63a90f6794a8f1d48e6f4170bcdef2f0dbb489d22a0d2ebf1757c12d6aa6ab5cad22a15f6397f0f647d5ea342baf64dc32d52a708087fbb8c56d5cb9c46432c5a453fa35532da16edd8ad6641ea1401d9df5b5a657d3b4963ad9ae7b44a856995aa48d346544540b647eac85b8d5d90973af2955efa488b14d34e172cd86e49d5bf147df78ee65f8a6a8bbb581a6ff9a3fa4dfd24118c96860b534ffa98f235dbc70c546fb5cac69e988a55ab4c26a9536f81e4ab56d5cba2ab5a975aa52aba5e64646a154ccd175d7f1a903cd5aa07243fb5ca4a1d59236c03550466c7e7ecb0f61dcbda6fde9e656e7b7c3cdc927b7615b867dbef55d87eb56357413bf6a1d304ecafab60f5139892f9f5218e84bfe13b4921b55dcb4c9ec0d4762729a4647ea5262f93ed650692b9d52aed32979ad4acd580b6735ac57d7b91bc7699ccc36555917c9111ac55308581b893b4ea40dbb156a186a4812597b36fd86dbeb4c54f8a92a4b061ca92527752485627542b819b1ea6bafaaa95589b56b1979f57da1058abb1d4d1b2efccac7d46ec558029abdfb352075a4db46bb46c2087e42d9e62b2a8fdba3c9ed845eac0ccc489cda53644eed823210d29a4c2d81cdd78c1f993ff74d210c7da1b7d64a3b5cfadfdc7b549306cebddccbb3845bb0f150d30552473991b7329ea1780721ce74003b8cd1fce750c40e750c1ed34df4adb6f7cfb8d9390eda56f2f75f0509bfeb41f35ef89a6dccdbc83473b066c938ba67e01c8e63a0e94e336452f009d6ef31c5a877e365a65f3138eb6093a09a139769a637f36f9a56a7212b8a13e09c17ee3d86fe82490747c9a9c049e84602f1d7b69460bc97d1db5b9c795f4d1650b0b55b8a02a02b239ce258e564122a9230f80dfdca40470789b8c7398816c8ea355f936bfc9aaa1d40dce6d3e011cfda4cd578054f45fea462e815832d402b5489d7c9be348f805dd431b466d852ca36ff2504a77db2fbdb38cb512b93bd4e6b290bab50b403e003927c32e52471e00197a913af2f91a86dd6d7b2b77415047ddc1a32953a6c0231d978761a40f9ccb9b9fa46cf7bd94ea74278738598573277ffe4d56dddcc99fc3263fb13905a2e389cd9fd83ceb27e5293fb1d14553274961cf2e4e1d74a3b55b82ece32f0d29a4709ee3545bb7f949f504472fc1f197bab98e67312ba94554f685d9933e9cfc38ef8424cfce2b22cad6229f51519638c5a58f25a7e3e8f8fb7b398ea38ff3d33bac43c771deede4c088d459c108fc52375f12c3cd7368a29bdbdce63a34963aa78c93ad76e4a56eb4207353ddc92429ecfb671a5248e1b80eed04c773e8ccd22fc44db5131cbfd14fea58c7749739c1711bfd322d2437d54aeabeba0a0e1d029b47266c64c246774aea9678cbd441554e0fa27f5a36d4805409c1933af14155427073aa05e7383447a27d677e5af62987e0499d530ec1cd2fd48cdc684bb46f34963a5af6d37e18b1b9c936da9423d196dcd08d6803834b4f9f16e47bfab8cdc9d2d8f1eff13d528333e06e675ec9b2a3511143eccd801d1f59708784a14b185db9120fe36bfc43e105b8e77c3d5e885b28ee785a2bad35cb737759d42a955206f104cdf20427ef8cba1bda743f1c7bc877f433a29e90f820aab1b6304281d0e80543ec9c1d8f9f4cec186677d99ca71d0da2b793f422ea4514d402858bfd6e08b3dfadd480d0cb274fe7e5c4af43e41011d03d7710bdcc721f7c023fa32b416cfaa17d279d55fbc18126a081230e44e1ed781865acb187d4b5c99023070c31634728a18c5a3c34a3055eac8071c10c5f5c90c30c5f66a9647201510bc290b103d5fa2394d7af943956692ffb8759ddc508779cf424e98caa3dadd7438bd29f2cfda9d21969ae961642985da5b4ac84c165d34fec198e3dacd76a59d5b22cab5a41e8e76306ab65595788868f4b3441da9951ac6a1df6a0995dbbbbae2ef0ed11bbd29c33cf5da2b12e5f6365d376396e0f65d161ccee86b21011ed0fc84744b42dfd4215447b5e08db42b4b1d2966188baa785684f7d039a204bd004791f2e30fc3b829d34a55782bc0f0f6489945919cb94302bfbec00d76cf9aa01795c66e95e34a51b588ebb44838928f6127ccd27b87be4bdaa6edadbd33d5dd84f14ab15ce3a2d8c6a43845842f022842c1b6a4586b24821da1f1882020bd1c63e35209209a23db110eda993c830441bd35b064d905c84f14566465e73461fa6a823ffae27c4ec0c570b5b8cf185318cf1c51acef006b47519d89d7d166db869e7c4b0398f6113bb5eb522f4071c02637f112575acb5567a693faab66244d9d967ec31eb9c191372d3ddbf9bad1718fb7d0cba7a48f63973dcd3ba758ce5ae1ebbcd1d3cd52472df77a76b7fba4ed4fe04ed9c70d79c44b5e7cc92c83d338d01d1fb72d9f77766335ffaab3b4c77103e2331b2ecabaf5b4df57310574a217bc8c2f8240c2cb6a497f944f7ccdd65bdab8f97f9746920d83ed993a581601b560d04dbdddc3d12268952cf386461e4010c2e1bb59f1110b6ec27735f25651155d28e7a561662b67c263528f20adc590d4a0f56b0b4e70d565136fd4b7f76ddfadbd3deac70043e098953d70c37d196a7a1b26922963df39acbc72cdbfabcb2b3d7283b3b360a625bdce92d1f1c6d23314658ecd2f503295b9ede53ac0d91a756e91de9665a10fc6326236dfbab655003e2811a0f5c571b32f39a739a10c6f67ca75d83d9a605d1b4470d88bcd613336d08cdb57395be5a3988e43304458783e0d3991f33babb4e2529d7e88eb4b16fb944f2c00e9a1d69cf5f4d852f0144113c08e3891a5049bda7c3fd6a42ecb65eefe57eb30c6a4068de13e5397a92eee6afab46cde7da57101008c140b031ddcd9ae7b1a6bb6b539c83e4e9af1c440f827d7347b51fd8b55f9a6cfacc37aee5a01bf5ef9570915e73d580cce3530dc8bce58e659b4f43b8d79c7bcdafd5e60fd367ceaee5a0fa20ee9a3df66b5ebf5a11abbe47d61c34ffec559f4c1ac8d0de7e124273ee34e7ce3dd7d3e4acbe26d7675b7c4da689f336a7b9eaa0ec9f39475f7a8fbc33abc9d94d90a1bdbd27d2607327ef1da0a3bf87a91e69936fe43c9383b25f92e6c9a72119a7738ae8a04cdf4460088a18223034b4a7de349f2128b420a732a374aaf692fdaecf1cc37e9a100cbbbf5776a1ba9358db9ecb9624d1e13304c5be316c8be96b685bddd18d872604bef633e2b2c514492378d9070bbcc21158c613e033e2c1941de3e6031e3cd9cf68074fb68ffd8cb8d8b22ff778ecf460ca8e37ecf81d69823e55e0ee61b1230bb1c7db2dc41e6f7f73c1c4ee4cbb078bfb66c026cd86cd458c1d3f23f4a902c32ca29e7e2eb85c9830e21204171bbe5823673fa32f8c76ec67f4c50b78ec67e445128cbc08a301fb19794184175066c21061e3926d91624b4205333918753183cd183739305a25b139a35510373e5b30fce59ea9e6064d6946c666ab35c01ef76d1b7bc4b81f7dbcc0106ad94aaae6d305967f72eeec6827b1b612198dd394d4fd02ecb295641b3e42a29d24850d4f4404e133213db02fde78691405131ba394d967015316e061151c82127e7129d442058a24f68dba8a1da969be2730ec37616afa7829303b4bf95a9a5a0d5ab0e83735adc5cb8ec7c981526e52cf1a5c1d171e5e8950f420c54c31e8963a85c584b572cd400a26e67e0a2f99932e506b5245446d4cae2cc0ca02701a0dd8eef0441493c5d7083b6639daf19130b76163c0bf1b599c88da7e46598a30ca62454a292735ca32254b0f27217277310c6da9d3b82f5e98868f12f8196561b28d9cd89f10ee236be024707f6068537d640d9c44fec81a98d29c84fec81a1848f71d3724028eeffede9135700486b68eb7032a312fb34dff8c9c984273a8bc2296c323f6a8c73d7af4d821fdfac5b23cd57e5c52c64dcaa87bb96c71b96e8d6e9ce12b61cbf437d8b5eb97f643bbb43c37766193cb736379665c965c8e5bcb33a2b80c71b019b7d91cf045a9eee22d9debdaa3d0dc99152d1ccd6768472d3477f6a90d49e14554a6579e1bb3d64a4be24a0684fbf9f480312ca706dce5f098f3d9378fd163d8c64ab201b201f33636207ee6c41ef41e7ac9e2e9883cf709c46f97e79ac46ffa491ded43fbe66eee8bbd667b0ded9b21968d09cd6da5659f96215c1adf5d5dbfdd52d3b699eeee0305773b76ecc41ea4d3f3883d644ecf43cf80d8033b95c966f28bd9b79c1ddecbdb4c77f7f5f038a2b444335e878427e6f79e76fdbd21295b3bcfee20b0351d943dc8ba9d5da63b9e6e6edc3da63dbe1dfbfd7af7bda7bb2c83f2b6b33b66569d6f66e10413aa25c90fec36890630239b5e66eb953084e9396d86e2660fa560cbbf1f6ca9e70786f69c6036fd69883cbdd4948b8d5d5e3b4d0ec24e7399dc61979181189bde5a319bf9d47ed8bc5742769be3d09e43fb69256bff6bb395b15f995bb75a10ab19c1891127d370ba1398bab420d664adc9866a45e8eda515c12ef5b5b22b44fe5e18b520327faf04adc8c46e6ff569c8b57ae4cd4fd7b2bffad37ba2d582d8cf79530ea2f9db597ec1f41bf736b9db3e6fca45e8adeeb0cf4fad08fed4da7ba410ec33bf9183bc8dfd946d0ed23ef352ee667437b42d1d359e8cb91cb4698c5ed3f104e44d61dd396766efcc7eed85eabe2fdc6cfeda4fdd13b1fc0168ef95410d88759d5a9739cb41d6e9eb6174a2870ddfcd4b6d75aa0de4cddd13a99604062633c840b4df43bdf77650fa1ff8a993a87627e16d62a6c5a705ad4f9194d5446db5eee19bd4d62b77702b91bb8361df5c4fb51f58dcf6b2d9943bc722dcf1c8f7c867196e9f2839560605773cfbf1ecc9737858a580f23c1175b3ecdeed3de7edb75d78b36bd91521c4aedde760da2d0d7ec76ea87110b87b60b6c9070b32c6fb1481dfed638df1736eec6218b6659f22ac59c1c2651b75344d9bb21f771ecbf657b55a68ce6d4526918423ea08acc522c1a8892d464d54f11e693fa3269668c2ca0c32ddd832ccd62619b810058a8126a66c99656b6cd9c4932d73b6bca4f6878f11180585a4cf087067badd6165c2b1a26559251f1db00987056b032d4014e0b6ee42ec01b77521182c48148b8c98a8623fa325b8d808d8cf680921362ef5c499a38f11f552cf98f948c1468028c0c2065a883d84c0713fa325a8ec791983b82fdebf0c4f29f50102cfa359c63c924189a39763b31b31d5aea7afb41f4ea6bb9c5d75b763bf136cadb5fa78d5e7090f243cf6352da8d5f9c4bdd0b2644fb4d773a88d550ad118639c133ebae17ce88294c923112d2125065af6e5e8ceee90f0d8f3f2c6a3a332beec38cb984747b3067425a1f4e161461f1e84a6d034fa118459ddc10e7642c772d0dbb283dbca2ab4349079f9a019bbc8a6e06e67c78e67cfef80104208a1eea60f098ce4a0debd95e4d95acee094b81377f68ebcb598a6746787025127cef9f7697d90c0728a979c9c1df2393928bb6b2e753b5d68ec0207c7c7066c21ac9f3825c0274874824c226ac318513b66bcd5f19635f38df3cacc850e6b3fe6a7d0dc34967c6cc09d9d2998b562ac5dd9b5dcb16ff592cbf354fbb14dfca9fdc0dcdc5a76b14b88460eca11cc1ddfb4192e99700ee571c6cf4e739703333b5fff4aa014e7ee1bdb6c4f9a67f3d24dd76cf2bca5fd30599bfcb629cf5d936fe45236e5998c31a771af5a9e3b7bd5523ae3e7900952336e07722e8d992c0c43d4c0046c987a086386196296b0b2061b526882a862030f65c810c5142a68620662d068830b275eb03a220c3163600d88169c52fa8c52f8f3849e01c69513f4703404096cc03fc06205053870a2881c526c6061e309ed87ac34460b2094e8a1073ffca00bfdc28a2a3fec600b94236449d13f2236fd6483059b629b6a26d894d29f1af02bbdc6046b30d93c70e9888a2d18cfc07a9d300e2e9974b096b59a071038dbcf480d317e82c0db7e466af060fffc80adfd8cd4c8c136ed40994a18270702d874356ab03b941937c6287da4640bd247fdeb30f74a88ffe1e8d399da9e1fa076d349a54c7543120c35609084c7c3c363d5f801078f87c78927a46461450f5e7060e249096cb072042d8898b245eb41a64de1913e06a082308e3001154320c10552b280418423c634d9a1862a2616336ec1638919625b6290a0b11050836863d396aa86981ed610e2470a1b566ccbfaa9e12787348ed688b286939f1cf0b3918c1b1aec00081e7800041a46487d061cbc8499410c190021156fb2fb6962f0f0dc602dcf8f0d3f5038a0f920447f9ce4fc38e1f9616294c616a3303d48a30bf7839f26f6b49f511829c26489d3c87cbc668409fcf5d391aa27a09d8e544dff04a6a85661f54f608afeba848fc6b9a566369259f0d2f32303f61da963e79fd4c1ac95533e2d31bec3f02f25eba9d541efc8cbb53e2ffc12ecdc6f5e5204849dfb929821f67920ec331efba581b267d7be452c75ac9f23d59cf49a5f550474e3f1d63d10fcbd40269336a2a156ed481deba4d7689275a89fd4c151ab2e75acdfd096ccd9b7accd63079ac7b4aae8ba0a7ffed240f29956412952c7821a6b950b52c7c274d42a48242542add21e559bcc67a0354353a239da56094a992f45935545464aa4cf6499bca408e86a48e54bee57c801d6108bd4b1acaf6004ae4b54452abc147dfd4b617a09fdb33eb7fc525a965f2a1e26214c1829fbbef8e256e5138029aa45464b892bc5608cb5df37d99e9d6a409ad6409bd6b266d50691fa0d6d99bb3869507d771d5e0a099a41f0f55513025fb15f2cc331db3a062503785873d60a4b1485ba9a76ff3e21dcb24c6e3bc6e00e854265dbf61e65f46903f3b08f6b00d780274fe1bf873397c7ecedd97be2b5b44d4b9d2699c65247eabc5ff1d2e25aab72390216bb621973a78a9d6ae3df9a91b8d3079d86cc6f9fdf8e4f7acc41580b459a83b6bfadd993722714b9fc620364de09c5d9c9e3d7cbe4274fc97ccb9d6a6f8f0d90d1aa171540af92790c2f2a80f41715b09d5e6a45eae33d97e57dda0fa1b8491f52159927e1cf5b1a10ed5867a7997bcc5b50f6eb5a3e0d99996a774271cb5aa14569edb8484b6074842f1b9e7277de48ff220ca2879a107a38b4a150dc301275d9ed22bf65490c33cf4bed2614943e66c05296269aaf40181196a2b0ea253158bb83a49a486e51c53c1a5d7e042181b7e0a50667c05d0e8ec57701db96ee00bc7cc43a80ed77781e303a0889bccde8195e26ecc004a388683f3985c584ec6204103190f289ba9f11981658486ccb3ac3cbb6d9cf088c1430360491936384397390f0a0d1019e337ccae0f12923c7886d5917170cc6edaa22a07bf82729a4b247ad2a028a11083e6ad5a6b1d4995aa59dc054163b7c0f7f0f7fb17cb21f4a41a293d52e489df9a1d4933a167716a4cefcaf675715f5489df9edd7a6554674a6553bfa1d45ec2f05532fa5a45ebe94953bf864cf200ec8ff8c2b318b294c70e58c24a8119e6c7a1ef497830fa2c24bc177f8f81b9f561519d12a9882b76e8f483d0119ff04a6e4ad03c5f84b337192424afe494f362275e85f863b5287fe47066c5f0464a98a4e47e0df81e09f5615557878ab554fc227bb4c2d9dad17943e47284209296140599da0064564217eb0c611a41c0104a3302d905a097c8e78cc0873860f67e830e56698ba312fb1fe34157a22cc2f66eb50fb80045eca52e1a59ad49042cafa75bdc91091f52881a1943df2524c2ead2a3262fd4a595033c2e464245e85978a9fc0e9087c3c10d445404055ab6880a97a4c3f81a97a38e3dce8f38ed499bff2d499ff91614e2b25f7857166b46650abc04bd95f486bb4e47cd06e4de012eb4d2c5d430a29b8a4be49d535a4908a46628c3308a324101921218a0f12aec881064f6460838f193e60b4fd8ccc20c30c2e46b0651dde5afb86d8f111bb0bb833d94e685af9ca42b3838756ee5e979d15cfb77d5aec398eb3eeeb55c5b6d8614e2277074cdbeaae85fde35a427348bc0f1827a986522423a4638e9359526484bb8c560da5b667e5d3e9c8fcf609985ef393f5ebdd50cded2f292f914540f2a52fe1ae2a02229d7495ccf16bf209bee62fb5e513d4a723dcb709c8d768bda4a6871d5f9397cc2ca9f976a89d8ec89c3b90cc395b0435d0cca5b67989cc395d73fc91add4c13e3316cd882266c7a9196182f592224bca9c560da548b7d908697efb0a35f64f7796c9a6554546b8735a055345a21126f8242bbb108fcc735fa1c6ea3292d8f156195fb600f6332a638a0db51fa723dbb917d5ab64be6920ee52ab66ce59c7e2ad93119abf0d74e3a5d7e4d9d9d33dd03c7720f9ed3e62e08e074b61e725a4978ef3929ae35f2b85a6ee90986a7251769c97e0d33cdea22c0bdeca58bde2b30c447a09b3b09b2c78e3327a46a3a40ebda18be269f49222207cd297cc5ce625bd049ff40e65844993197db232fa6435c1fa64f5e91e0888a44f963e5d7d84fbfc04b6cb6f97b7d68c20f63b5d1cc6321077d2af7ca4c8eaab9eb40ecfeded8a78752dd6c29ed7fd0ab333ed492d6d854cdf159ed4a9983612771084ab5de77e7dfbbdb2ccb79ccd3c9379f6aa15e17e9d48d7b6c9e813491f399d2ea01cd7d523af7c7d2677f8efda4957be2ebdc99cfb95bb167eb60eef0b9f4827fc154ec7f90a398ee36fb7d09d48fa84f591d3710e74d2a4e300e5d02eec0cebce85cd65bfde23eba55d46af7004e6b4f64b076927e12c779cb665d9bd37fbf6bbdd7bbfe19b9dfb762fbed976b36fdbb66d5b10b8c3cd3dcb0e9f65dce5b0de72969d483f6dd9966d2765b965ed19e6388ee3e00a2b701ca7b7e3641c3fe51c380e84731cfa491da013c769ed385a3bd049f398e2d6c5cb36c07e465f98d897bbd7ea5aa4855d6b96579ef64554d55d0b7b7eea0e89a985ddbd2331c53804169c0c036f98e58b956d7fc9e0428694bd4bdd078636cd4d379d5ef31bbf09c2bf2ece33cf32077f9141b4afdb1c11a1cbe63206175b3ee366cee12232271d67d98c1622a35f44616efbcd1de9ef11385d06e7ed4f2302f7e93df1ca1dfea6573802e3679f3f33bf8e73d7c2c6afda4f766e7b6737c6a75311d2b7eb9cee4e325a08897bbb85cd1d77a45708c07dfa95bb23f0a59198f676aec8e99b0e3a5d4607d9903212d3becee50e6b24a67dd22fa24ccf6cfe7e73a90d81426cf48c28933efda5bb1afd22eac66744dde07e38ddc14d4373ed34b98b616bdc21cdaeac1d6a3f1d7ef617511d0b7b3bd57ee4d6a0f6d371c7cfb4dc34ba5bb2b5d353ed276eedd70f77ecc2de74472f24b7d6cd88ca5ed2ddd0d674a9f467cfae4c66c7b210dc974f18f834046e7cb8f1391d74a33e0981e70ecfe9a07b8b6d6cbf4cd93bf63322e3cbbeb7f9e2bc1181089bce72d7c2e6666466748771e06d3777d271f2933a59a69dc3f8501b027fabbb7bfc9eb815791b08d61ddcf85b96a526843b29ee2c7719ce513ba74d11a5c5bde9a07b986924a67db5fdc3bbdbe95ad8ef53fb4121d14662da4aa0109aad3d31069631ac188d41c5680c294c683003867f465ec2ecf7b7f9ace4a15ce1ae346f45101b522ae7a373be39e77c4f3e3aa3fccc62dc328b280b4d807f50ca28aff922fd3bd118e79c33d61da510f98acd29e59b4fcef9e69cf33d9a93c84d231d22afffa2d6f052e12084da10f958840cbff7de7befbdf75ed4e26632be271a897105a2f050e8e085e6ee02398842872bac302ac10b362d4111448c1e84104208a1052184104208ad4cd6e0de3b29a51052486b85b0424aa7126b07c5f7986dce862a943488f15d0e4e8cd3b2a4b4a494524a6959748a014304864fa40e0358903eb0c7b7a07a27ccc768ddbab597525a162492d9d230441454451493fc30225160a0a30d2fdf23faf01eabe08e015b648ee30138034839c7390034865bb89b43c1a31d3bb61d7bbe3c05620fd3e56112ef8499cb4340fad0b93c0bd2076a00970280569e16d9c12b7f771def787607a75cb732121e243cfbfebad789dc208b3d94583b888815b8c3b187cde5af4dee3adac12d446a80ad116b665c6d7447b590b52d5d335346f550c005184a3332586015b00bb6693ad9841a401640662100391952913af000c89009a903afe175e4277572e0c0b1b2a196d5d10e2f393810883ab24785a2831b14613f5b2b84b01281afdf1ce7f274995d1e82c171590fbdc02f1b1e02559f4814b8dbb1031e412f1105e11748040386af04f8cb661826a2c444143c0ef80486d9f09dd25a6b8c31c6582714b3e1c144148421a2c47cd934c051bfb063dc5213b92ba218aa0b441f17883af02dece05a2e5c80a20fa0a803af71d684d3b365d8aa98adb2bd6e5acb5a0f0b3906397463e40184dd5b995c7827a85e097877a8cd2375e0df05b2e39cec6bad35c8faf69abbb7daf61d043692cc0c0d8ed798b81cf9451d93c6915fd4a9b9915f44d1e8889ad991d11dceb624dde56cfbce661567cb326d24a27e936df225228565c1c0165e35eaf2b6d46a24a2e67c4f7cefbdf76cf78e5a908f5288fbbc70b169153dd13e2ff79ee61786081518bb18fb562e5d2877b0518a5589dc007736f6903386d92b1c815f98dd99884c813b28e57a14632dcc0a03c31442ec4064b7f4813d2d888e122b4a893ae0d94177ce39e79cb2033c36cb5ba457edf5b5d6a3620f2513bf92f28b3a76c7b6d7b26c8a28fb9b73b28d3ad99fe5ee6a21baef318d8a288be94794b56eb545f5931a07c90c7b97ee893cfbfede7b6fee76b68da88b2aa13b887ed27cafd5568e18be8868c1d877620fbb3d9e870138a2ee96b388babf51e73ede67f758be72d53a9b5448cd87faa16deb2d4aebe9ab193421da536ab392b82124f2049e99fd41e4892cb3d65ab50681828724f65b8d20cbe6b1df6a0435eca709a95b2b00bf9ecb23091cb3730210a0afb5b51451f638a2ecbb4cf34f1bd83eb3d6da79c9035cca4e144a29a5f43f6c609ce7a076d4284dd889720de004c7fd563d6c29ec18ebdbb792070e3903efa0a6137d016e297595b8857c62cefd2084f31416911bea3904c8509c59e4900cec79993bbd250765848f5a6a2c77b825ecc0f61600c76304b89bde5702fd1183bb7b017a09e5d4c1f1dd8c4deecbf9098351031880b5b8c3b6c49e0ef64ad81151f23c224a9e0816dcedd8f23b7678f0304000385e8b121708dc01c0f234d6626ccac972df0180991451292fff7ed4c0f1585c20d05e1a5b675244eb4fd1feb2361ee658a13b7367caf03c8dd2ca38fe54b536c99f24602d0f846b65689d66b14eb51f796bd69a5996654521ee7b96648124b2d5088836dc44a8e0a96dd91f90103eee040cff563b84d93042e8c4bd8e1cf84d78b9206f5bb74e3ad1dfd8365b7e5afa447fa21a42a8ab581c9849517cef3d119281837dee093f1c73ce39e79c73e23c07f502dcf0f011c2286f766ab855be6c8399144d7a2645513b792a8b0aa8b7b25503876bc235f8593772684a0698917924a0abb101b84dc3efafde0cbf7931cca428ca9bee8b0d88b7515f18c2055c8bdfbc2fa7d69722aa1e4754adf53f6de02edbb504f7fce38cd2c2f4f332c3385b3eed47961351f28fa81f367097edc3f82a75ea8a659ce1128101a678e602817b6289dfec41ca7eab1e8878d8b26905224936a232facef4321121703c7d01eefa2e5aa07cd955acf7c409f35bf130c57e9aa5236652246fbd27c2fdb6bc136084a47abacfc68578bb984911d44ecea4e8bd1e31c618e38b39eeb8a30e522104e389a1fd177fd02092054fbcbb803b07d80fa5b39fc9c65e7a088a200a55106529f6e8a084103e66a539e986dabe7884fbe27df00afc563b78d96f25e568773a76bc01f65b49d1b2a305a3246e39e58bc087a22290527eca9249fe905156d1f1d286fb729814c13bb9dd384a9a6d4929a5446640640695d26ec6cb38c611842814a25bbc0bbb945ad94402c6f2eace84f16567ec51ab65d143baa794a2461c3feb65fc8c8f0f8236f831028f939f31acb4280fce4a4908618b283504810a0f68b440083840830556a8f1026d0667c02b3b7ec6bf68c75bbbdf4aca103b4ee0b46c95f149e1821f50608328d0184151aa336d146caa8312318a4d297d5dc84002123e48420643ec2045270f77f6502a05caa652749843b0960e49a028c8610b0e3d1872019435b61003842d2b1fa45e16bbeaa04500649083164820630a1fa8f8a28933a4d041092ea00e43c01cba950e3decf76dbf950e4c367c1263d482401be4ed24700c7cab1cc0e4d04546f86417575e5a954e19e34a0a9639b7e040079a6062c33f18841958e183155ed860031aa4e04d481cd1c414206ef0418c1c2cf1683084165b20c1030eb0e041eafdb56081b192c0818b13487b250a95cdedb7c2818a2d031cacac7098b2c201071c885651d0882246adb55a7615858b1d57519ad8a563d9a56b15a5ca8326bc97e0befd2686dfc1de1609a9481dc973e96e07a59dca0ab74cbd65d30fa5e977e1e1d9d941a12216a9739329462993ca9643a92865103c24da8f68fb501541bdda3a72cb852a4894ea913ad2da75e6533c24dad1da5507fd883ac91bb3e39558356c20fc522f4535244ac93436bcb5e390970604620f0a44a1f250af0705a2ace0a1ba9957c002bf34f6dbddcbc196446092061663489084115491924e2041c696150b5c90851329b94496328c00b3c5d10b5243445461a30a1161c014c10829a9831a7ac8811a66fcd04407a9212066f0620729ba486395021d512021065078e1440d3252ef8b232456b0031061a4482325df237dbc948d1606f7c5d52a67c5b3e289d0c202ef94e0ad283fec2e6786302c24a2f010a5491037208111108498810d9698620442647186124d50d18512636e0042c7116588f9e106197062022a6c2863ca1536f8c840081478b1214c0c8cb0618dc3a08bad0c2f514c1df2af783de694710ba110dfbd18dfe77df3bdcbf81e7c4fcb1a56505639395fcc99c3c50b098588426962b1744104309966441757d0ecb7824203284b144129e28a1bd82b5d5c01450a14144099a2e50aabc3af802b2852767c29472ba294f57c3fe874708511a898420b2104e1862f8a2a20260b156871c4162bf0e2062dae58d9c065f5640c1bbed82b5d58bcdfea06296ec8b2321a6265848295110e3ec8ba6cfe6491c9082597f7044b0d506cba7a22844de971f69305db275cecb9dfea899616fc38b1849d560d4c582d60c296f65bd530440d3860c1850c51f0500422807992c60673c696283218634c116bc858012373c2a509193b05490c210561e400061b57d4b8011a5fa05c2101152b275fb42a4cac9a24b16df65b35b162d584065c50610921b3dfaa890a76cd0d4148a04a173f1461073424318203187931238c319ca07283186016f05cfbad9ac820af1491c1850f4e78610320c23881620a15599cf860821e686145d38860c1cf159eac84b36282c5fe7e2b2640d875bf15932f322df38778655a2b1a56330c410d26382ca182298cf0431b2b2637e4d086188a62240311a6a0228a2774909a9a05f6b4df8a86150d5e70c0c353c55a1e2b432758e2085368396295461ada0a708a40c5061414f5d0c40d9a10bb436df8434d051bfec15b78131144f0103104831420710615a3249e58e202014609a0c80151126df8a0b621c60dcc87367860dbc0029b5bb411c5a5fbad6600838c36646069546af65bcd70c58dfd56334cc9810e6400f1248b13ac649022ca936cbf950c4a5858b427b21f1e60b5c102ac0d2c580ae0173298e264882f4a2c018322a878420559aea8c20698cbc698016828d096656126f092c92cd858b1118436c410b149fbad64e8c1b405fb7231cc21fed920dc9773a10f0a489d28bab0d64717805dc2960400c04301054d88eff277222a5a3c46549073c35544c5479ef86859a73c2abc138cc0c76302587b89e733ddcdd5d51d4e17ddd1ddc131500c4421123d13e22fbddab164c12edaeee0982e72b7b1e3982570079918b3e321130f06c9c3834269d3aeaf612c150a984c189f052a19b438884048c1822044e1c18b1c7cf0022ebcbc600c1718d120268d9a13b4400a91228b2f4810a3fea8740d94b5498d32c668448000002314002028140c078442a150381c91b574f914800a97ac446e4a1808931c855114849001c418030001000021030344a6550452cb82c9e6691b405492e38aea6378ef0684b647ece952169061080c8e5502f1a49246dc6c58ca45eff4ff81dd2e46b2b579e3e5fb5894df318db07ca307c5e49e012cc6e9332a30e24a30c22be47455720ba6b40f75658a36d43537683bc228107829bd41ea65f1d85ee029b79455257e1a2d951cb27e63549c1ed86bb61c4edab37dca605a5a243329268473b7228290159e19d1bb2b3123321546fd2c714d316bf99b220c661d8c7733b4f3ca9af686b12943d2cab1c80e97cac03b71c4ec02021c663191fe9940dcca245812129c0bb7646e46ff2653dd3ba8440b90c33518bfa34b66f05af50879c82f8e5395f40661c6d9b3b552db811cc9fc711d086fd872ce30acbeb6b9a481d0264b0c5ab8862f5e6216b8e39fec8c63205dec57e630bcfa74492efb131004c220c92cb92b5c815f00fb3fe20558f5691209e8b7f29cbc3e2fd60625b5782e1acb61d654f8064f14c1eeb8f479a90c22515626e47446770ef1a80feb63769f87cc52c99e42492147eec3ae3bf8a3488e002ab3426f39ee776d09a02b7aa9b39eaf008b12aa925d5157236d9fdbd27dc0f3307e8fd22aad311c7e03ab4f5a3b2424ff93d9a8181df25a9c21c3027e759f6059b462d74d710387ae675c8e5d06c8aa458679ebbe4ed12044c4c574ec52d3a4a83e72632e333c36c699231161a4a4f9297603892e74691eee5cb5d44332e003d3f4ebb1265800cc364f1baaf4780d1b8ff2efa8176dee3a48707791a74150d3bd179a1363c12f1fc2b4e0007d762405380e88390fcb0fd78a10bf3509ada65a100ce00b689ae45677815c1e984d97d694bc05cacb1e92234e7991edbf4344a96b7a059ce9c910b5797357c896eb8d981d3de550e7f7ea35d90b57d6d23663deb14cd7427169404965d79e9f9767931582cd7c0306994d3e2577350d4a34c94bd50995d48436094f8613f9db2798028fd1f29877a535719c3d8e9982890fa8fafa618f5ed64dd0fb0573c015e2532efcd0e962b8ebd48aee5bb8df1b6595eb58a1b415410e1618da2523cab9e0f4a96fd5e8dfe1c53442a426fd521a1ef57b2af0cf5328e249bdc3e01aaf38a9ffd0291579b5143fa05733f42c859c4424197acbf1adfa23122348f4e89f45fac16e44a24b24794818701d044dd71d0576b545b4e427840293eda8458e0410784e4b47c295fa14dd9bb8b3a0344ca570639b3ee9ad6a8ed93aeb2734a7e4abf87bb893639356221ab5ea4b7da9589a6fcfaa820d5f12c94eaeda9421430c615092499f16097621a2953a27b3a1e5a8421fa24e25a118ad8aa7f5b7e778c4e2e09ae3d68d92208128d67b5720c554cc0bc4f1f4e74e0054b6872ae1cedc3b60ab156cdb792ea271b92a065c3ad26653b20429742a4a62389a016ddc82926dd31fd62ebe7437a1f8ba4387f08ceb28b897dfc48e0f2d25cdda975c433716bebe24ec4b0977a6337fa38d339f583a9ca11b36cbe645def27b288bd9c37aa54afec2f7939374fa10830ec51f17368d6c2ac82fc944f616849610895741ed660de01ac06c2d154e370ec337d0d89b0167793d98111c1dd456644b5a6e174e3e5c78ddccf1b9086c5fecfe5ce12f98a24b90f2261f86b5d84b8588104497acb4035dddaf7b989fff72e69948970503e3ec95575393aae02113deb1167b2ebfc5695fd78b14100137fa81e7bb74e71fec26d09b8c66d539cafbddbce8435299bd3c585664138040660ca8459113a46321b43157352e6c8e04792022d8544288dbc59836acd97a759447eb6af944d9650d469934095c139957b51976b27842571c8eacb93897199fb06223d604c9e7a8e3050c0ef32cf3c02c455f25b38d8efd62fa664b16dbb0a62593b5f25405d4602d6c79b6d0f49866ce8873db1e149432bb353198148e3e927cc534380128f9866d5167fe4ae4166cd2cbacff957dcbacc49ccebd46e1fb906980279968bb24806df7286a54d402b40e2776d590995a40afeb3bbf206cfcb41a670a4368073fed1d1d98834c088da802f592a16eda7f36f22fb7714664e93ab06ff231fbf38f43720f37c407b34592e08b59201738751bbad0e963387bd68ffa6f4f5f1075a87bd22aa2d0ab4fdab8a77250acb46f23e613b78cf67594960ee7e18309f3b3d5dfbb5bde671abd54191715a9afe280352b4d95649ab61513c432e3132c10c806137b0bc3a8754f9ce06f885f91e76c836839ca2a9019a29d6751d16b099cc99038de0be446f2f346b7856e05c48286a1369ada33b334163ed82ac3ce4f92b4a989d52825a4912646a076e5cc74a04c3c8be66384923d1bce381e59de263d30447b85dfb305c33fd9d42c3cfe564832a822dd7803d8e17b4b0a7082a800eaa93a3d4e505b19556a35408e64d64518de2152577164597a0947195bb94c1bedb3d83bc358f8d01184e78e5b4296762cce2ae3a55347ad2389d20fbc92e0bfbe5dda60fa2e80dfe9480e778dc6e69bbed4a1c33b5c2a145786296554e018fe8951cde61d93d1604f85260bbe6edf298c6364022e3f903d30c8b33720d088477ad3f20c21960a2a5d30e09208be1f5a0e017ca6d9b8b4b7389f1c3c631cfa1b0083f335e82bb70b06360b94708a64dfb1b660a14e6459abb7684a1343d1959522422223426d3a17142f530359e3a9c627b35c95c15acbb6698af361c70bf6a58c1d71c25e7ec1eabbc85b7cd20476b9665f56a1b5552f9c979e01c112410b96e09ea972c3ee21ad9530f5509a69bc4c86c1507701b85cfc7f3e78f1713c24adc3652ec1b1120d521eeb859b272a0804dd19c524a66805db01738ee2dff273175390b39171de3b59a46c103867c137dd8831d8e309552c4b0ba6b6a20df727ed8905a30ec5bf9957440f2b4607fcebf3231535d9e7eac63418a34f32fc1e7e148c5626e27c511af10cfc10addefa6b2fb4cbdc71f075ab9688e7204edc3ee57f0e96c629288309651f49f8eb5cf36d005832c7eb990359ddbd4f75c9e865a3d54e311a560e8d0bab7a8606826b5a9bd59aa74f5803ea9b27283d0b2ee72e573fa3ea4ffafb22aa5ab19c9016888b60080329aa40f7e032bee248a88817044a29e3ebc7a148b38f1ca34fec0274f6a84a1c7b76a96d6961c0c384afe11db67a21d8db14cb640c8b7b302d98779054ec9fcb186be7df6bbcda72fa535f89c739bf22d4209584513d3841244654da4135f294e582bfc3d9aa0fbbf48880df812ed0cc8e47ff9b6e1385176898b80dfdb47f762dd462bc4d036f136132652a4140e4f37c0b8b3a6ef14035e9286612a5609092c6890f230abdb93cee2ba16b984e514884e043b3137edad12bb09ad58a127e07f295d78b08f4b946eb0536f526ac7f801d6c9f11ba2bb9679aede6e86f72ec2c817a3f5e4dbb81325982421f35204f4762957e1bf49b8bb24a66bcc05f31c60979567211f74b6913b23a487074c524411dc6a7932524d99be8f0b1dd2f8d7703573338886ff6fd3014d398b96ca9dc37dadb1ad2f288ef0d90f3e0b08478186178689dd01b8c43cc3398b5db7f5e0472476dad991d5adce4134d0e6e013fd222d56d527c2e7361ef2e053d82fb87372e7adcdb17b7424f5d85904d058e03d9bd3a2d5420a2690c8613bee785596d3faea45fb2a1d72d033c1ca55ec7d6278013c3616a57842638286dd1d1e54cfcc61048dd07b0d54d03b16be8f6394adf79368d091daec3c17eeb68bbb8e9e7a07e86094aec0685cd64c0c0a83186a9509410c18b506c51ed7a7e0e3b24487b204082e31df3b00b31887ebaf1011d34008854592c048bdfcddd29466e6ed7fba016643140beada0b4d49eead2a4ccbd5e8d08b55153309a9446c08d4f21a8f24491156442c83cf81e9458a3e09c01ddc4c944bf2d84dcafb4178f68cd1d468ba85de4fd54756fbe6e2f46575b9d29ef552d10ae409fe1a1b342b6c1fef9cbe0b53b2cdadb5762582a1da42105e27951a1dcd2beb025aa248b1c4a323275a08cdabbe7e94edcba4690a41f91cf4c6bbe7c056d4eef54ca90814b77999d75d5e39f3e444e041310afb8188b766ed44d050254bdacb5482afe352191c3d30134cc650ff9d5da6fae9ce809a89950fdc940a47add54e849e87c02c504ff09e8e31b89bba22dacccde13334d605bfcd96a8b89344c2962b68ddd8b2deb2147d72fb23d2302ee015b7e332a566a46e80791bc682069b656cc1eb91f0748960ae5e612d8c9e562074e1d94c06c33fb3dd7858b648a881abbcaa5f57b148e31e5ddb7a5b8c920e8694d60b8c0171662b483efe95e476ef1a95cab490208787b197b6450acbd1d0da102df5b41f186ccc32d995a5c28330f78f92768e3d798bfd6bfd644d855a9387613031b49b93a4231bea18ca8c41c88a7d05f99706781d7f53e1aabb393aad27af4a4cef1b8c0e4e4b785eca3e012a14b148296c69f960d4cd495f330c5db3ea394bf0f1ee2fa3d8f29239851d1847fc89ec361ce754e77b79f6a9bceb03ea42ad13b58718f6c902118eb70d0015f85c3dd64a7b5f83b5a77f6aee01311d0d2c36da00ccbe1e79668a4996628de001290784f375af7e76451b0158ce2b2cfc5f34dbf4bcb328ecaff1ca3fe50be5b05315cb4929df040e91f8c190b6974426cd1a2c778bf12860784aa6d74e74a762b0e914adb4bcc6128b9ca1b5da008a63545c8a54e67d8d23bd2bdd7d306d012b65808e74867e471b2bb33f6c50ba9dbfe1f82f3d06f816c870ae577b30a12176af8f46356c2e0fcc1a832201a3a3e33344099cd65786d7cb1d27c27033569de93c7e97fb14ad6cbe01a07900c3a18f0f6a14460af0a277e60c27ec22e1e56fc049cb04f9f030303d9421e91d22a0c369cc61468f604904ab7ebc6c0b3b994ef198b1158abc3221f3c665a20b4cc871854180615e5f704e34ca4b3a053450e7d11fce21100e6c02fe7a7aa628dac0a7cd5bc5f01cb0fbb96d9ba8b92b42cb8418f5cd49df6c5cc3a0e2833a1df63f83cc3f6cf97f300a89ef561c87668333702239b74c2f45cc6e5e6cb2f9993f1280d78405f077f6b2312e6719f5d4701813dccc6259105b6f942b533e75dfadcf19e3a29a22a662f27e838273cba5578f3735ed094093471b4489e0d5a15b088774ee09b254585fc8e2d6bd65b8e271a2349d067d3f1c22c14e80475048f201c60316fb416c2cb293afc06f1f79dfbf5d5555845f8b74580ca35f24815e4e00b40f692ea614179fb1b6c7585d64a3b8935785b527c48f0b3973630c9fd6d36e034e9c4c91848da3217c923ee2b25cb155a8ac314d35158d69a42e71d53570767d9a6269122fbf89b1f5f3a25954ac8290a7c1ae6f445aa92594358ebac6ada4661eed1328e920563a8d70e793c0988cff95f800ced4e26f96c1c068dedbe53b45c11e4de722d86bbdc802b2d2c6b93b35fe280e627a04c175dc50db7ac4db4a527a274f1256c93c70600dd31d38976c6b2bb8f1ed0acf62f7a500d150b27e18bb04e79d922f73c75d89312e1cd7ab10b3acddcefcc610f6fc3b95a36c1cd444b09f9bbc14438641b903c151047662bb265a7691cfbefcf112ce601d5608dc892066bce65871f62210813a4fc9fa168882c2459a40f373e3baa9724523aa06754668211ac8fc4f0ea40fb0bf60431ae885a1c145151399850fd6536a1b284cdfe5d9f9e211d1190f592ccd5d69ff5e25cf57536bb80b0bdf03ba5cf80e4da0c3d9c9d7eff7c939bb3376b12460d34da87e430c22377a6634df98c6375dfc9de4572e340699681647a172bf4aea5980048e10a4904c1cb925c34a54e616e4b3dc7c252b259d95f6baf3cba58dcb5cb5a5e979ce457f8a65d077d938cdff615e627e0b5e8454250a13e7fc78d845e312154e0a97a607f09c47a9c5f791e8abcd889e9cb96b01d48ffec56ed50a3c2dac6a31b7528e7c0a63672923871011ca1b307236a7e83fe9f64513674ebe4a35d4d141cb4bc32a8a45948b66e24477ed5197e6e93d0cccd1c5ad8634e536de3c42cfc8aa21b0d95d638f252862bdacdc0d821487dd116c6f8fdd9b53ecb72cccabb753c214fbbcc664e3daa9f0e35465234d08ac99070414a6df3b15451549a3eb7d551ef738297a3bdf8d3129f8f37164cb829e7aded5e028e9da74933b576f8b1f8e00f39c415be0e73912c589a0ac94ad3867b792a8de13d0fe20866d670f755a76211779abf6b59d11229e1e77a7601e169990fdf24121b1e98582358343c9334cafd61fd63c58a2605bfae06a85af4f6ba755cb26323648caade4da295e087ef8d93ba185dd7a02c02e9496541bdd1ecd256671c03b08862b6c9f66826acb405f53adbba1dbfa1e59bb3f61004cea9dec8365405d341e95b690ed8091f866beb80019aa097226d410e693ac99a7feb35a8c23128489f2759c88b615f51c42c18600ad1b847bc09eed66cef7975df9866bc17e1f7b3e253db43b7f7f38fe5068252df58abc433604928266cb8905798c4b0f8eb603fdef6b458c42752440feebf81a3d033161610f423f138d08a10d1319e1a826c3ac77ce62c14a89b7abd335ebe21aef2bb983f630a4ad88ee2658443878e68fb39165f672ae7d718d2bfd6db3c2dfdd91f9c516f663c84877476321e84610407b7b6091cc9875c13e224c7514fd1e531c911713fcc695fbfc2e80d2f39b5c66b334f10f88df55e1fe31f2b56ce472f1f806cb7257facc3790f5bb239327ed08066dc810740f64bd48095b7f32b8e2dba6a8e7deac4d8b3f0375dcdbd9701611b3ee58494b10f0f1c82bd781b9250d17e13e74d202d775e1da912f49b675c4bba434d507bb15daee7bddff30eef16efb7d83c5c492b62279ad684e12d5b1ef001a69e2dbf8f0c5e01aa49913a91b6163b9e524a7e32d3819be50705263c0f82532a11a027945965c44d191b15f83705a2d370368245ef520954826ed69da02378033dd2c6a2cb060c4103a860f0b57bd0687fa53ee2074e35b0a68365ddccdc6a63e735b3260bf129d8627906929b17921f9cca089f5a9ceb7ba5172e555e31463b4798ca616b636d575294abf49a8e546f39458959dc029f805bb28630fecf32755530e6cc605da30221e35ddecf791b5922c9b48e086ce6419d32610a5b6432d9769db20e0ea646aaaa3532afd0130ce4a848b4f77e181f647f89a39036787d2a57fb2b20d2a0e1fbe299796209f1a87404f568db173d09a13d5d7f8524e56328d62dc8f5cbab2c07d74cdf82a4a2697ba4e72bd555f6c524f3de48d204fda3520b09241018d6dc33cd89a1e91b09121dd2135952a9eb2734777762ec985349b050711773e2dd373b24683eb903d5d1226f8c27dd75e8a74ac56638acf108c2453e12d9706fdcd673a159ab187cebdaa405e5dc61fb5dfdca368095e67427ed0c2b048ec460c6048589cc7d1099cc307a90269e67b32884149f030541e28eda4901eb2142314051c2872d168a7a3bdd8b3fc224d2aac06565c91ae5591ab1555e8dcc069e435616a311336eb8f907d8ae1a54d7fc5cc364b113d1ed599b5b0a28d408b88d16c55c733b2b57c5885cf07f30087fe568c05317f90c24f8cf51b9d88b1e2866fbcc71d394bebd8d2b1e2b58bd90eeecf7e82b1172404e6a889a20be2ab1248395d8233fca11a4c2e4d34a11df6c581decb6b21b598f58af902f386ed22197a04a6a8575a20270f07a0e43acebb907e537d1847fbdac8e44a9669d8b91ae0c1908c2035d4436065bbe0dbe7d2397905542691b028f0d4a4807000d36b90f9d1bcd541870a981b43e18782dc0098e0ea335649a3d305ca623c9ae8387ebcc681cc4571b3fca9a45fc44be6ab0d79488c517ca31525422f1ee6bd73bb8992d6160c21480e2cc2492435abc6500b12409ae345ffc8daffca79113573aedb874e325127cffea14bd88c0debd6b6b21bb4a45b97aad8873cf237e8382fc72c48ea5885780c4357d6a4b009d3b222e832bfbc8291996975cf1bd494b56e5490163a56fd1989492c6506b3d1ecbacebb776bf4d9771167dacb7d6f4f423f904d01ed9078837447e439b1b3ad1235e44a5e48eedb12bd68ed007e0b2cfd0eb65a4c3d86063e9be244649b0463a504031b7ece3dfd73b0814172d294e1fb1f25929d56a9512fff9d2b88bfae47d4ba08149b643a8bd46c48d057af79f8e27a8ef7d3faa8c3e90b355cef68e6799d441dc3b712135f929d2af8d02bf370c91b5f379bf88d9a3730640df0917de4e9fa227b6574a0b7fcba1982a00fb4fa187e8cabef64b285e0ada09d33d31c3e528b034dcb3ff862c88ecbe9fae4e8a9522a310e90e9592eb0ebf376b1e63c12832b2e8ba05c6dd0ca1eec1389fd4f08948ebe929c043ac3f686f64187741fdd5f418978695a1fac01a073e27772a866c2fa17e7526b9b0b5a82b0258dd288402a5434d33db65300f1e534cf5aea98a22a93b25e5f97f0633e5e65114921aaffb83e1488a0ee611e84f37143137a7301a059c3c3cd9c020415c9978f25f1410e1caf4e5653bb29383472da2a582d1db5aa1e0ddc26c7e917eba96d4b722377bdb6e24dbf9a7a036f64383bd3e546141956f53ba9b0c286f6364d5bc8c94b02f4acd2a41ae94c64396b9a799eab3b76aa98d9535922a633a0af779801ae71c3c1d2ede78eb2793a7d10d6874202e68244feb94a95890e7c55ba920e8f5b21596e29e493f84041fd7cbd236bd4ed826474fae0097e9c6f9b8e6705be09f2b7220d30a1fc5f5518fad12fa607026ff16a6d5e51ff0622cc529c79d41c97ad94f8ae66f1894a874f0a4723b0ecbb1446993360dc2e8aa139ee286bf7e1f5e99b3ea4c99dfb58cccbab3135a16eff0e8b4e4cdc7a99ec85a80f0160fd1435961a8e30e0fe29238449fa6ffe60544403a87c4aec5f668d46f7ed0456100465c8d56698188ce72c7012d9cf91cb52ab9ed380248d7d91eb1fb4d38dab22e9afa6912d36e972210a6e9aa58cf6fc4efd94145029fd76604b9e97f389d7d9970e6838d8aa9b1a138d3d878e72810bfcba9860844df618ba4e9a36c1d76a6b2fb68f03e48e9184f2efbc97a3e8ae53089166bc4d47ac1231ffbb59b50140f5a43c0b283b742eefd0002a5ea0d2379a07c2bfc610815276808f0830e6726a04c8e0410308c4470481a0227d635fc095cbb7dfb84f0a6c3fec68a8a331da93aacc558a7660ed998edd504b8d1e3040861780bf114acf54a3c76ed2fa078df91c10f7528bb8187a9437e7a875541ed345354fa3edcc24dc40930ea97aa93b94648acd6b0940cd4125d59717afad157ed702993f78bae2ccf6d26e9c1418ae8ee01c99f5bbb7bdd09c7bbdc2f9f7ca0ffa99a7021706df3f83d99fc612463b13f8d1f343c6e213d33a4ffe2e3ebcb87d154fecc54b535dad6b22465ea95d7df92ca4ea472a66942b3e84bd8211d634912270e7006170edb2cab6a9c80dedfa0beaba68735f49566f32e2e4c5af5a0291a10d457de82234d972ca84e15ec2b15f1ea5259fee783827ae87955f6a2e64ddc06cab766f6a27dc22d879c06a15e46d23da5369fbcdbd50ff69c0850a228d37a6040726f6e6540767257b1c6fdfe039fba822b750b17bd7c5df3b1035f51fad1bc4c95cca1d6e831f96aa7f757d0205ab5a8596a21af1451a2fe7d29d5b682cce38d4ffaeb00d492df65c48ab5a0c0f5ed1fd2d5e52a53be2fe1a8c04c62979a78e8bff48c33a1980dba0da84a3c77fb16dade3db2f42404d4dc78723a9e39b83a2ae1d30e03772bfff8f0c79889b7f08205e6219e6f550afe580c3d3a4866d8d393348d3a90300e50e98410deb27ab2bb789859ce526c7a266b514b46a93efdd27e1a7986b4abc93ad4346a3229c25ec4d775b7f1156fd2d93f3292e74f8f20eee86b3ad2ff95faa7d85ebd5a68226117382a393a337aa05204a3f1b91ddd24332d6c994900a887694c8641af89d272b502d882a3c0e51329707c855b7b8f4665d09040be88bf63a685af0141e79d47e9c7596a89a8250721b7fdcae8aaa5718912f8b4596706f0c790134059d5a44d64f221cd968347ac24864bd73fb2cb7de0161ff7f4d8984347fb4ee4c15bf45850cb91680f2ad6a1482b63173de91a155b5742a6413dd92016792bb1d845627fb58aa565274455d7d975410245a3cb820715c480776958837235ce6d01b958445fdf2f972488474506a900dcb017da88c1452d4fd338a889be1f6a5e399095140acf1505a4601990d26aa50121b4e3f4397ea4cdfcc83e2276fd479e43cd788b2d35abe048a87241591027bf1f632dc387e5dc55293b10002286f15a27dea4049295ed91ea607a1e367053af6e93300fab310e143de956e4da8267b57281a816b34f6edecddf4bc4b98387ea3d328dca70f2bfd8444792e9fdfeab97a0987b5f511926b9807c35f2f052f3b268c68835d0bc93080a6691f9db2bc8106b7a14c3529dbfd783cefaf4c33d871eaaa6b94aeccfa3ccf023d7e822ee2809d69410c3755843b22059bf032157072fb057b04f7f39ab0109f6356a77c445f7ed65487c5b924d13259323639b5426fb4782b3f18fec676d379465d6d0e9a6e34af7fe4abb9dd5e73ad908c051cdca185a1f3779e65adbf8bc0f5de63f4f95305ef3b5a99e96390ab1141d513e5e7ba3f05851a6c7967049b46749c5c3eb10954e1127038971bbb671f3d11afc4d89ed213801dad10562d8525feb4f5b06f44dd22a2ef5102f1f738026d5a8d29359c7bce637b54392258143c3a1ba3ca2f46f28c956c4617d542309bc8b45749202cd82e025a9c214fb97401055ae9ea7a4a3ca42f725ffa44af3fef85dca9644267af126b6a33f28a057041224853b7023141b616e0d78080ce9f5172e12833cb28c72132cbe239f11c4f074e2b2bb8278cbac5d861f104f064451be69b153a3d9e3e1a5cf53480804521f3c4a1fe8d76b8336a314529b39305bf2dd7619167f89e880d1c23f1d11d6c83b918271d39b156c163a8416a5f61353333384db9ac23d627089861882e9b892a28a417fa1ea7a59bd754388015fab313f34ab426629560678aa4abfb845489e0d9c4f5312c793ca4c87d3c8cd49cf6b08444ad0a49ef7f8ef612e0d1b45a0553f19b95d3b42807a1e34330da0a75e2783da8d21313ed19ddb1e9cc476507a8af043f4753ba5948b5a5b486b106450c299260a42e1c75ee3f920f2238914ecd72af13e83e28bbecef97cf986b9452a44ff7c39591b65765f44cfaa84b3a32d59de53881e326007e7a39a9108a78d0b0da620aa54bc2d25525f57af2ecdd780daba7f8e1d4a0f8263ab9ff8f1012e742aec6c824feab426f09d6d9187d1ba59c43e0fc135692dfd58982d7bbe2497e4e1e4aa3b1fe8af366c25448801615fa419116c567544c8de92374f2454ba9333c02cbb680031a4e7041a6ac54892c30682f7898990057873989ab0c7ec61b6a7414d63b7d005ec0229ddb9de46e65f2606b25e1cf5189797f392ad0317b00c6b609878d5cde0d39ebb0a5986b42e0213892b7b494506f9432bd4c5aa1f6e5cb9f0e5c0f9399ca8bf3341e6d155edcec56c1e54239cdc7211309f0e10c5024cfd9cf1822e9b18b21df59b4a46df3baa927f837ab5a9396b2c78a14837463eef43dfb480bbc230e3a7818c9b1029f29001d49a884b2a588147e13f998f7b4501e5c644c3d0e05e48144a97bb95b277e07c472ae41e3078f0b6a124c6537d9e46e04afaaa21e9ea788d7ac2ec875bca4c39b98130ac2b0fd232fe78068af35e84d44afed4d320888c50ad04b4898c706a1068c1b47ab59212083513c9e19df32a28e663282022d53297f6500e10d52042b59b4ad1c144d330d799cd4fb845edb5be65c5f2e8c08bb067758405c5759bc2e8d150ed91f06e46153f64b6bc7780304f1247d7e254bd6a1e40c7a87c91bdf7ee101d07b2b9ed0f67812399270c62103999855a6d173080288032ace8296669ffd88fe0a5d3ac5f736a165f3e76afdfadf4d0b4b5cd76620f9f26ea8b7426813d5482c4525b5455b55026d96260de72f545d61cb29f0c2ab04b5691d14c38d6b19c2686c1ba7cea880e902b5af141d2455923638cd2b770e25dd011e65e07538284709c5b504ef7a1ebc374fa24cb047249ef8b32932a15b4759d2c0ca1beab6952000bcd53795f451e6d8bfd3a68bbb467f9613090df0156f84207eaf9c86c84acfe3e5ecf51d4554ec12ca1c19c662c0f8ce3d4991c3f59b92410d1b602f1e1ece3cb68fac861224c8a49d01356d587c3d0bd39ffe899fa9a01e6223802482a028811c95f7a3ecedebdb09560f363534bad13ac78145b0043b8e7500502d83e14d83e96ed9ed4eafeedc210c360e3adbe0a039039e5076fc2efa569af52e3aa880da3196db323bc104c8a454c409e6a65b40743d55a4567a08af38683110f717814d7e9ea2c7a1cea5a4436d25a0d9233ce1c78932f3773dde2f2871dd7b505a9911207ff19e1bbc4d22613f4b153ec8c4d12169804cc190648450f736a27b7aba5d070072893c366f940111e1fcd2ca6bd68b163b5166a832cc87c0863f099e2f92c40ff2958d4963a7b4de1ad1b15bdadba059cab0c19660527dc228e3a13ca313bbab106ac50ed5675902649214631dc66c072fcb20722fca6c7904a18acc493d5bda609992fa2ff2523d80760c5b6fe161ee106adcd50a67ad8915f91a76e955806023f0ac26ebc5150f76d6c5f6ade608bd8f085c1d75e08d96ad76435e3be2b79c7a07bbef9bdd6e4e112f75b85aa45fbd5aaad0f13714621b228ef3ec522a4559108df1607921ab59abaad5586f051da1eaec61cf1b76e4428e9382854f88e28dbcd2007cd7904ffd490a18bbb0e0698facdea378a60f4a3832361c1d566fb637385f6cf495bbf69ba16cd3c336f60f54f1048855398ccc037a60d77640b4d58f7a7e29be37188071c0509bfe770efb8fc5390af6bdffea1d4e3d86ccb3610406f2fcab6bf207d6673ba85fdb9957a414aed29c28a5313d42659a5c5d48efc53af991fee8c38963ea0b57ce7fb5477b9c00787e9bbc5dc3055eeab72f2497563ee00823f014f2a995da3a247b0a807ad3c3529c76e98f61d40118015f4295c0e3918a861601122f807103568075e54c574004f1c0dfa6b03bbdc460f00f5b639a514adb86419959d50928bc5131be0b30447fb13009664783bb358614556f3139c7790cbe2d72bba7522376b6341c4f89edf08e8f350c757166ae4a73bf4e1d818f5450786c4720e86b8b1a452d3d2baa968fc0d258f609e782d4a655b97f48d6082dd7a71971b891c648d377e28f14a893a07cfc9903b6043da6da4fb1c052a9406e2839bb9b1f266b9b5998b5e81c92dd18dfeaaa15f46437ee409f512da9efe6a4b6db3049d417847cc1055f4ff99b8e0d4d95b1f3a9c1b2849228a5f450b1ceeb0f229378025c889732591ecf7cdd461603281435d7f49460443500c47a060ba676da59241456d0a9c30466878f22623d1b38a812ceba84a5b69becc09d2c25be70104836740f08df9335dc48f96f298dff02edd19e4fb011e968ec0a4658abc2e92536aa79fa82c6e047f750a3950ed08cf801081f8aa271505a6c66d91379f554c447c755ff9c2f37641e6f206567d9a754b94628e3ae7ff4ae79729fb36121af88f3ea415d6e6627f5111c59b5938cba2119a82407ba0445df11d2fbc3301399cedd290311dbdf4a3581a05c67b3116c763ed7723d0fb45a08706fd95641b8662a6e5c1cc6d71b3d32c37028fdb9de6a5d200d93d7fcbff5b6a9e9d4be6758f629a3b7d38bb1d63b79378c3189e23b67b1f4aa35f01514067fc255064e06236c976166caa1d9733ff6979a8cdc0f003d21c6fe95592ecb308dd3ee7eb9fd46a0775dc78adac575e999ee76a8b22a9bf4fb0653df6aa36194dcf4e3170c2db43d1d6dfb241b1bd4484d5133aca6356f46249965bb713341c9af87cb6fbd2048084d821435b6ea4e28093b9abe7d14fc663b12e21e6f1961f18f09e4c6d120f4512ef8b416ca0cd4034fe876000b141434318e531fd4d29750a4b057eb27473a63407c4d939a5191666e99f97a261930af7d0c4842699006d53f39d75e81a75bc962b2dc098ede320beccd0b8deba04f810ca131dd72cdc21932f0b8e03807c0e690981e03006c35f9e7b94e8d5dcb9732f07d02fc72d6cb98fece2fc459be0b2ce0b2abaa78faf997422b1d7e29b292dc6e3b291963fb50269389f2f2c035ee82b687e64cc0be2329dc80e606c8faf3f984a76997c0538ec2f447f508f6367bc0aaf1c902781e32bea062591358414884d07608ea375cba3c5856e2736120bc7c199f3efe4c778639da952dcbf0bbdb3b3e8848a10bc05234a45ba477616fdf94af57c5ef74cd6b3de5d2cbca1363a67310c3df50bc60a3677f9223c5abb6b64b94d21db33f60d278b39afba61204afb2d6eebcc5a1102803a85de684490b11222b1d2352e58f39dd8bca26c1a0755acad45dc362d0168aaf056f51a500d4325be8e86a8d586555a5e5829e256b4cce00893644b5578b0512bf70c3c3b084786357ebacf88ea5ed8bec5cd7a8897796202f8c05f053b17bdf8948656d2a83b3ee48c5e0130cb2327669cebeb745ff8b76a3313497f5dea600b9788ec75688ebc0c683d3c9b6b2f230d14874837c17929ec3fdcd7f574f02188619e07aab68565ce52b300bdc3142dbd6f63d04c30013c8fc3b9cdb0771f38649e2baded3b52591494bae21a384cb01c13ed0b9f6e27de8b0bf891bb3c6e1ddd288f2ee421c6ea1bd9d5831525dacec99342b1b6871b0dd9444c525adde5ecd2ac7f7c74c4c6d416831bd7721913182e967bc1e61d1a09b0125745b1e20732e4fb5293432ca290bf4413bb46d66495ac9ee218ef322ba6fcfde565ef24b2fe3859bf3dcdecf40f01a1f8498a053e5ab8e42acf1d256860ba1ce9cba2e23dcb6bba5ce0ddc32d112b745898556427e9075caf8a988a471abf8559736bc9a8b2c1170613b42e1747d15bf4849ee9db8704157acfa1836e79a7151584b1a486e052d8b39162f5a9e17313d7d4f7b2789109d6828b0d0121261beba518824969ca062b79d1a2835dd31e4a6d88b9e2aed4bab16e91c42bb1ca5b7be3c6473d8f359750e7073b54a4769efb6022e16036d61c781f37a814deae9452d059e89a0a2cad5728334d442bfb75f48e721534890635b85d1a02e830b441495c4b493431886a5023d083e69d39c00a79dc851658a1a7c49439085f3638f22b2d5571953d2f806dfeb5cd220e5f3056272fb8ef3c80c22fda10eb61f8ae7e5f8da5db4c9a6549cb7c8e22ff5fa1e3df711d06b3b5f9b4d8d8501c6f5302f69bdc7eaa09b7416155863193c88f47c82ae30fb416550ab466979526b76211f923b1cceee61240e37ce43f3c8ddc133ee264474ed4ac60c7049317c3fb5b642716ab506000d664d5a24c7b54809601436baac567f99618a8c317a19088c744fdf96c4564de20f692917c6c3d782e0e837d59bfefa905545ddf560d1e06e9c2e1073f01ae8499519edc8769c782fc109591e337984d0a69ba1b98281bc1561f5abb2a6788bf1e55f5446c8a89077889317de2e3898458759af0adbd4143239163d3556b514331b34536547f706e60f8eb25a31e80b8b1aba9560fa0dfc0026ae4d7903befa98906419b6a5445cf81df008e1c30b47dd19223c09880ccc4527161c92a5ad1ae81d8ab884ea2a6baa33642f4e53f4472142178c4443899675c0d9be44d12c7ee29baf11878956cda90b4c4ff06871754e30d7dc54d779730b88ebd9cdd243744c330f4bfd9d98e859a59b65d1d3db038dc65103e85913858fbcd2d2cdf023e7340783e47ca53630d9e82b24243d79df28284b21d6173189f0ea94280ac515c2537a3ed7cfbf226c1c964cb0cd0a2c2b3d1e369ae893c6abc50809a20b18915d0a70e1dd092bf2b15bc0d3659d4decf2bdbd6a9496f0b247db53a2bf5620d9d0ee0b335283c8713495701347bb5efa2c625c71cd32fb24ecaca3d27754946b98d47f4cf20ac16c9ef88e386014376c36c65fe33a3b1768920a6da2cee967999f72698b434bf1346ea3e182a065ef0ef55911cbf56c5962d737e8924eaf6de95ffa915df2e4406090d401a5422e77ec00dc39e1ba919e43e16fef9235480069a11dba8c616712a179e0dbea61a929b7fd4da16ec0c47350e7bd32332f9ace3c5dc24c5883edb909fc23c6e2c0c8d05332a13be3965a6b7876949a170b5e8e276aadf01703421033ca548abcfd1384f3f7ec6052f6f0a78736e054948bbd76978185b38cb11c20fb93a35894c14847590dc515db2f1c0d3106e931e5df0cc671816aab1da166dee43a4b226e4f5b2fcc5c594eb3cab9c9f8dd1ec6b44011a752ffcc49976331799fa5958ffb0bb1c485a4204767cb6c81c26033e792c35828d2d8a413747b9581d6ba3a2e7197b8fc8b150c53c3ee234e50a3a78961a1252285ef18a178b629827778deb3557d4f8cacdc24e386a921a1781540d539daa23689c588613fa36dd3798f0b4cf76c9c3685cd0ee37371823590587a93857f284422c468e78bd9aa9be7ceee4dbd3e1e2b5f5516e2f38a1eaf7582bf57b50d16b644dbd987d694b346362bdcc0001df7c45e2d61f97b6538282f6ead12358517423491e887785a51e39df1881c10440650be1563d9f1990c9384920dcf231f34928be9d10a4525f7e5a63f41dfc014a5050f9ae26345943e3320021d5144add56eac48f04e6fff3c9778cdd13d32a9fe78e1b8655f549ee997fccc747e1bf0f2b42bd4d9163231c3eacd7ee2a4016761b2a4d3ea4728bda545f8522857ce87d6c40f8bc953aa3231f8359d8286bc20fe89742bb5b8e9b4b813e7af57ef028eb7d602ac19f512a4252eea47db0900b1c169f8ab74d3a75fbc3fd9c0712b56ca0aba9c59052d80f8c89abfd9386bcbfe5f7f957610a324ace470117d56d38aea9d69f30fe404d47b952af434c2f0fbd2446b1a6db29ac06e0a9d9a4a5d38ec731e35c796d22230079c13d82d0b090b3da562b5b0224636a90462152c97164327ed1053e8a3fd0020db94e194d0e04ecd3e0fb3d8ed462363133ac6b69dea2ec5af771ce695577502844e634299b95b0f4a69413aae9244c7188cb59aac2fed8b2f946e898b2b8c03025fdb4e16f4ba860e8209a7c7d6f48f424444b6f0f01fb547325e6a18a126a289db793323b2dfa0a6d437bfe2a4567b1e0bf612bf05680da365b40359bc944770e676ad68724120aa22d20373da3e492c50208861350747b2ef4855c36aef9a8eb918b80972cc54c138a39bda6bf577caad35086d14b62379f8d122ff342192bd5b7ba585cfaf858d39ca29dc56fabb030ad29cdc049bd96ba3d8f72ef5d74fcebcecd57265610a6c1e8a9dea4e597d9908dd8d8842c08396a6c5173c10a80d28a04f05a073844f56929124048e19251883a16decb0c971049c370d2ca1b1cff9da73470a5ba541f56581fe9aad01da117f9aac0290a2640aee63e4b4c778984a187b2b8fbeb7797148222e089f3d1aad4732842e106c46d8113f0a952831bdbf6b4dddb4e84734715da9aa046213795affe0684136f9f2063cf6026b52bd6df0da98e020dd1d0a56dd908133f06365a1511ce775a6dfa07ff69c06e591da6b4211a1b28b8764fe0d9c2f0b1941927ea57f1e223b3c9c65764e41319f705d9fb9aacf930648d9796042ab5c8f26b42e1662355ea09948ab7038a8425479a65b7e6b5ab62f0b4b44e8c19a4e738a46bb989438226f91ae6abbd6faf756d6ca0f81d60d738600d43e7487308d28290a1008fbc0056f62de3270facdfa48b0b3249e39daa0d0e29d9681c7f96b44287e75ebaa22f31c5dc352fbcecacc1456ab71e7c37af97b96d74db19fadc5efe8ad4eefd413a862661fe9c17b93b3e5e3399bcab809c16c57769e63805950c97fd46b74e9fcb5128471583b2ca91f458c15428db0a9d56d10be32ce238cf8bcdbc2d3841eb25e31b304cb76626a18db8b1cb8ab6be8bc3e93e0b8fa6cd13979ac21858ca076dbf90d597c5b3d2ce49b03c2f53a72f1009fb4d43a95426a9f8c659815d92f9f70c848396a46984745ddfd3ebc01e4068683da3cb996cd77dba1cf1dea6409e8abeb28923b88de51ffcdadb23407f305cbe94286266915e3a811d2281bd760dafd036ac78d33be8307218b01aa1d7734a00b14894b7dc6eb910802704c7fd3096768ab6dd43b5217a54aa0c9930c4cc2d588c8bb6029890f813703b626cbb1b9956e5c0490cdb91b9a32ca4de166009b030ba1926192f5c1f5f634def7030f218e181f11d0868e6979b3bb87b8f6cde92eb2ca9a7be78116595b4e2a4f722854c0154f18beaa79ec44893ab006c3db117325fb0e27d276d28e820f8281ae5a68475a6e5597a1851c27328395a8d5a7257abe4d7445e80abc6d42de4a7402745832cfa7252bbeca86b7273a15fefcc22b94c52b3fec1815756b14d1e198ba298b9287cd9513596ac2142486ebc9cc203a1553890606120a77a7c5eff1b65b049dd2ad3e5dc19ffc52b8d3b73bb758c596dcd0a615ac35c7c7f35f9925c8fda4d4110a0ee0849b529dc3d142dca02b403c39941cf6bc98e036c332c82d67ce9c920ba867a0396572522dcf2dd0a1244adcb550ac71085b1587451c12132c58f354d05b28428025b93e8df244f5b010d10bb866062eb1cc63f8fdba5b2738671f3c7675f05f2b49ee7416b00702400f1dbcef537a4e03feabad017f3e5155dca91530e8d43081762311f806bf0f99ba30b20646cd634aaf02314c5ddf28d4f470b9331b9d173dbc719930e6b42692b82eff39e20b73859604c384a3f0599f5ae328fe18af57def7d636f77b539323cf58874a7723f7d4f4cc7a33379ce78c0c9b2cbd5f45a591a4e6cc4c6a4c6c8443320eaf5a4d91765a9f57e68fa21dfe435f371e332c6b631764357224f80767d101f0b98ed3fc83ad2d9d313e4181b5b01bbced4f29ebc8b8d1b7fbaf0104cbd1a49754294f9172e49b6bdc1bb5b8684a3b97abf561d873237ba23e24f88f3411ef32f927a3de421428f9f9f931e46f17496e248f8db4d0de5586bd06414512faed65502cfd36ce8a73f18ac176af163a9d0a7d6cbb1637f6db681104e827171313b24d85f829b9cf5fab750b7daa2a53af229868cb80c00eb5498504f78636fadd4cb606d4ffded591037de813e114a22339c483c084cb546611c7743642b8fba3c83a8adc287f663fb667644d48eeed8527e7307ed014b473847faa945d25ba932aca58b198fd09a51834509b1c401898974d97bd59a5b5ccc0a9dbd24fc47e6c24c7202600bb46c310b8e4ba6eec36b2dcddefee3e375ea76803413d6b48c70c2ed6e1dde6c3005f9efd9a049214681a26c9a3f0e6fd81bd64b51ad946ccb12a0424033bcbbf184047b8eee34aaf5f338ef452e23bc4dcf952fbaa9454f65f879a29c8447e8b5f2167a6b05620bbd183646cf1d1b9c231d494d155e4518799fb4b53225c3046112452d5ec6b7fa28f0121290064f0cdf67fe2429230dfa5d25f6291c54bd227b9b3e08021c484cbc142e044893e298e08df62646402631cc04e8ef86ce7ec9ae22005806e943ad6637bfdee962e2fac935beb584d4620d2f246e5795d096796f0bdb7ec0bff21244c2bbbda00cfc4e53f507096215078b233ccc827029a9ac3476fc446e87ccd5f06c49c53f80acae657b8f7db5eee69aa0b387c439c9888f5812bc61eebbc71c1b70c0645a2ee11e4af37e04b2a7eeaf8e594d4788e346e01a1b48523802a4d01d34dd9f56470a09d8bc96fdafad90f07e8199ea6250f9d5d01d0c4e5e4ef6388f4d619158a1608d1e71caa77e0bdc88ee67b35bed99c43ee04c2c61ecdc443404960f011b11c1732024fedd42c3efde4c88afcc134ebf1380e81e0c414ebc119908cf7dc80c04e1ee0d637058a2b44a987eb86ec8b2b7d45a2df7e2a255a6948c0b6ef4e8ed3a88363f29590c807e43a8b5d60f13b1622ab13ce037f6c273c6fa8443c7b77008462b44e329e93323e8532430326749e2f157c8ed40abf786d17a8c285ae4cb286102da0317bdc0f8c11b8b64803d67ae421087fb8a04478d4a78bb3c30e32fcf0d9acbe5e7251af052494b63854b42d01a03b0758dfcb46be6f990c3f736e6f8aac853a049ac1196db634ab9050f7cd1464469cdf9a33df75d4e372e8d4cc3beaebb36dc35a25b1b90655c8337a7cd2d06bceb3a43dc33f47bdd30e8bb5dd241ee53d853bf6480fb4e1f88b82b693f877ed187379a1487679ebdcbcea6ddd1859581afb12731ace8132c5b25b2cba6813c47cff5ca0d9d23a08ae32a669458a6296d2adab8dbfc5a40612e09cef082fe5f8ddca86f367396929e70661c67150d4c1ecf6b3e729845df5de9b085ca6c718750d59357aa8297b948748ad4102f48fdfd6fbbdb2888f04798c53221b8f6ad10e50a6d809ea717196853478aa0ff6ddc004a3675b0a143926a1db410624f32d273424efe7c7aa3c97eb4f154b17c6fcb7a197c0f38e92fc5c56c9d3738d256491f11d8005501580a8aa56e6d5e58a265b36413bf4086335ccdf7ca20a99fa619f11516d4c81288fb1b59e8da22aa2f6d235d5e5732929ea09f23940ceb45497f49f5e083a23c2474ae4dcde8d8c39aa18221f4948f3f9176fbb31487c4836ba9a4bf245ecbd0de070fcddd0401ff1aa251f0f5f33985c5ee7924fd18885ffa7363248ff8dd70a37096aa4ca205acca206f1aac2153c48b4225bd5e0c0451d5a487d07d38947acdcc9fc1223ceca88730fe7133a54b52c00a1596133ec50c7865d179b79d6512ebe2450eefc207be34935618b180fb9212e13365f105a5f942f97ca62c3ea6749f51161f294fbea57cf1211cdd61241d54320df6b817b503bab0a498550bd4750243733f1d2614dd910dba42370ec684042a45f885b7a55cbcf4aa69b107ce87519c10df172b424d80011be1d19bcaa420a9a4674ded3191e752ff22a1dc9c3fb63e1262b4f77ef11f15c261010f35afe41eaee49f2a0cfefc709f35279e7622be55536c07f55b0dd198ace06bf51489f79d27f66e6b677d3714d5eb961114ed1c089e12d8bc6f9ebe87d8d56a85fdef11b975069a0f89a36b4b29d556ee45429178a19173076e7bfadabfdfcb242a979f3098d700c71d2ed3500a06afce87b894484a68042a6b0314dc1c3c0a864e2af4c3d0ed3d29dd71946333e82c9a6dd7948db7459be2cca3017b1c4229711b006ebc73df2f3190ce3f11d1cebedf92d006c8498db9efa72fce3c8756d9f56e05f25911df373e729012c665d442feecc55b2b335d42dc653f1a207123ee254292f94934bb7aca47810b0d2d7906f18c44a7faf24e0670c799b23914f85b6bd9398e05b1c45dd4aba189e0ffa11dfe9a565c5734bb48299f381fed29078a85538445a071db6dc1dabe6d48083276811bb642570b677f4f7b137865841f8fbeebe57e1f02d5a1837a0112ecee6fcd36735eabd094140e88275861e2edd92962562bab554e3758c5e2fcad454ad32ea5aed01a4a9653281c78e7372855c641104d8164e6d312d41380713c4ed69840dbd107d048027921774fec62fedaedd11de54203446f23294da1aa180b338996ef99636be8d3dd16ded4dbf1cd23d49f2c2b083e2ce27cf8bc10bd757d49193a8153ba15f258ba29d59d99b717c2f5de10c173e237ac46285c9ba3a1a843577b3ca38f6fcc9959a531f43fe1aa37972da91f1c42379d31c6fa2adc7d29871a264ea5dc4f9fd4a2dd6e7194da293cc9e3dded900ea969b970b621eef511ea654c10114c509fba0e89785f8f1bdaf2478dd629fcc1cfa05efc72a08476e915b27f6c263eddf244b3ae6c18e5efc51f509239ef5c84503f3a0bd824a73ac1775817efcc7ed1cb688aa8ec1a2891a7f507d41541b0ef72b1f1dcb1e2ed125edec5c52313b04c76e08197d8a91688b43026508814aa92f6549b5044e24b2dc644d41878dd07dd51ab896647aa18c27ae553c7674a7357b01e3b4d4bca1a9aea8ce2a2c59d8548f9c217645137435f9bb32b2b0b42991a7d021810b3775b2cdc7b82887080f23879a996ef8236c31c70f07cf58efefcf6dfef09b9d67653aa7fe50ab9990362cf2fdf645a3d5e406e8c954c5c5cbe699f065552def2affcfa59643486904830b4b718d4d35c40109cd3a9985a4e32a7b0e8966207708b91d0027f1f57cff0ed4c34c5ed5c159ff5e23ce8b4265f2086f92b530f87e3a14ba6fa30749969c867a50038a9d408156f35e1e1f7aed63fff6e6b8c1dd1d0d7b3324854e9ddcfa179347fa6603a0641869e902da618107c8c975e175e4bd470b25daff241f85582ca91820a2d8df90df8d90a5431ef4dcded3e47ae8195739a3597c311434c7f7d8a95f2927fc2dab0d397042b4249633ae30544ef33b26d040de6bcd0649e2db241627430b16c3cec097ce55f6061ae8fe8600e8b202334881d62f1f96c24253fa419ec37d9520b253704e574a8118db23c442882bfde344bdee43375cf995267f8fa31cceb32d19e3a589787a4ca370ba91098879fb033d7cba073c01e6ad696a40180379ae34d7eb79732a5e59cdda8196f9ab9edf5f2db14f5590be3107e1b899a4639449969c34961bdb8369415dda75370cd347eb30f01a5711a2acb26a438f81a2293cc5895c789bf9c95ca2e7a46067f82745b833c202f82f8291dfa26bb4739fc6acd3a291ee4478999a39c0fae35a77b4543968094eef50bdec3c514e7b49c5299746d164959a0183fd3c5c3271bd46f3d17250daf4efe0765728979e733862a4b05484d126915d977c3110ebc0a695862ef8e61f05b7ff458c93c1fac30b8d8bf5bebf9756711763985f1322203cf4111fab43bb9b8fb1b17c08e13c8fc3c0dcd861aa9143777d794d9946c9ddb229d9738749c8a19edb2cbc40f3bffaaad3c907f702c9b406e1604da560601416000f37ed4540378daa55f79540c53b2e4eb3a2c800fb0b0327e02db8e6400a7fa69c1a9512beba480ab8cbfbb55f72a32ede84d019bb06640047bca27c7686ce63be9cf10634ceafadec751f58b8cd071c63339a6cd695e734dbc9e51a6d12965da55a839ae3525f524c73b1dcb555645462d82cf275a94e3e456f3fe24d44c9f90e2c000cd636cb58658bb547a17f6c3eb35f19d014fe476e48831855112bf21617cf53125a06012424407f2ec76b9d9624a406e0544e2005dfb9b5fd7b0b054f52ec4aae6ad3015bded45ddcb3ea0c8afdc5a8344c2fb20d2b3b9ed33be27807499ee80377152426f7df7de179d861629f01d8ac4fef9cafb30c052d1c1783be92ec21c85d7f6e15ba0df322d9096d9c18716a2f35144ca0ddc62ec6d508c94981a32e63790c12a81c14d2ac5763e51c21a880f7e52a9eded033d2540586810ed652614653d54179c484cd8bdaa27e33c878995b2ded7de47b46712af6851ba14ee6a0f7cfeec6075aeffeb0855aa2e90a2837522bee74dd245f94144dcdf8fe88d41d1dda7009c4233b6f5734f06e46d56493d2dc256ae0dce200866611001a06292e749539d5bb48f17a14af7e9640ca321e9620c69b7ee03add188c3cb80e3c3d160612e2dfe715c7faf8926bb7be70a2fab14d8b600f5300beb7deb8f5d42e00a7567f7295efdc63e36703ed96c28a6fcb5e4d3be8e89a2cbe6ef5fb8bcc8a4fab74a7bb05fb297abb8c2a54b14e1d03887acfa3bf4341fef00e121a1f9f6b5476eada36e48b98b15b12494e0b9be5e3d6039480486c4db50221add516250f22d9e38232c07fe3667f066d2c7b0330d242d80d433bc6da0d14919285939ec9656b47c28eaef01cfb3ed2d987254ea0dbd44747d871aec93c51750478817046fc66801d6bea521cb4d7c79e853ef0b29a1504590b604306afa7bb24cbe6f89fa2cd0121b4972617fa08fafacff883e5ac20e43baf1ece312009a98ecc698e01d95289dbe34a3659f0a922142ed8003a156364f71e8667e697036f42fe8ddd05be8d916bdaf48a2e5e1d94525926c7524495e5610cbc939529998e0c37fa5611fcca3fc313eabe670d757eee6361140e4d1699709d0c2ad7e150cbf9d816074e14bb2a14567da4da793a56ff306589fdb8b81eea48073f7625448a1d1ac777f56486c7067184c63ad66cdb760c8cf03c9dc18c4c744c6e702da9ca32d73b29407e7cb943e61f8b6e0cd6160d6a1639a3caeb9c4cf91488a15b046ddd8751d326fae5da0e2306de674c1efb08a19262ea058920fe35a13df8af139f94cf2b5f2e453d9b26804690bbed8d55fc4b848d2135d832eff4f8300e492e5043a708976b0a26fbb7ed359cf14c85ae25a10bbbcdb06d43ef9a696e1a18b577d08000e1c23243be3097cbe8b7b53364c88fd7ee7c7e968a401f81d7024fad662bde211bd2966ab3fb39a853061a9f4744d9f2dcceff405974885ebe8536e2219b3f9dfa10b33d3d27a33511e2accfecbe167d3425cc6aebe4993d96f8a18292896cabd8226f43747f07fd24201037735965a7d70c82913414d0af58e091838c5b0c40957a36735c6097c8b498c8a0f371399a3e17304d8cb7cf839e680560b31d8ec1211eb5f8da0b4a9677387a62c39abe72607be062c345af46f282ba97b1267c2582d8ec94d103c133b7c4112c0174ff627a79410a5c9c15a43417a5beb8c72812367cc8a1be08fde2e91868df08bec749f64ccc1daf1f9ec0a1b70f84ebcc0e10fc23c9201477a3cc5c0c02eb46d395e4e601e31d6e468998326de6b593f1ee65b91c4922bed9aa1550bcb593aa61f6fb7f6489d65636820b881f5b04d0f64a329b00819607935065cf61b9e451cca30aeafe981e86c6b662f9459eb2e83fa1608123eadf117ed32597a20e430b939a3b5adbb705b690134ba8f0816e1a9957e9b39cc337a7b0245b3a150b446a3eb1573a66c2a88cb00c5d1af0bb0181aa793952312a0227c58a54221030fc5910992d681b90d851e4a8696d3251fea5c2708e5855e93d4f6bd2381079955013029ab52ba0be79773eeb924d2a8edd200d31cae9a3a94f2fbc3be23fe72ce711d1eed3fd8d58a6b977385edddfeb2ad58d44b6695b9c5b66184066b91ccd8d7dd24630837d4c75e2d67dfeaa4ae75e396f143292b0a9ae9eeb1a2ee9b9b2f12b19b5edff9e3244f12edb3387de3a4734a91d8d8c14407b802d9735d723563128938bdb654ddb7b208402f7f610bf0f83138dd6a94e27aa5741ca64662670a6fd44a0dcce23b7b81390b998b889f60413538230cb7861616c48f2522c7bcaca4ee87c18a28af501c29c4befdce4eeb494a9916cc9be6b152bb672970a88342163dc29fa6a204778538920f457bcfd4e47d559c3faff61ecf227b80abf6e9f30a3735cc1bf4c03c6960a10fccb96ed7686bbf7f00a94754456311d911e9a7ea50f46f0d77ba07f6c6929e0c8545c8052aae05e109bc82f464408540b47b9667269bb24eebc1fea3dc7f7d9a2fa552405d8e979aa4602aa5d2296f8d284289bcd88b48d4dd07bf385842857b0913172074a60eb9a12254ee415d02ad49a26f81ded2c4bcd0b0b3c709cbbd7c13414ec09f67220ba9a508b2f4a05397f83d8a711a2015082c309366d35e87343cb7772daf729b63339474718228c7edd54b82a121e91e7ac276d205c4c0ad1205e4f401a8a5d08ef20d24755988584187a17d0873e95a8c724ec95768acab40ae30c048e1c6b63e5afb98daefb6386abd1a25b159c5c26006794d741f82d535b1be168302943775f6b35b53e94d7a88f9609bd77d8864149ef3926b12fe61a64eb6d0d24ab3a32157c473d301551300ac989aa7d96264656e95927e386d270bd120ba86fb8f883032775723fd934396b9aa67205a9b53e0169aaf4f0a3bf83c8f3d198ee21698a1c151b18de0590c2700a85058ef85875c37c0ff38028e76cea890e31b1f6d13834d4f8e1971dccabefebac74a110d99dc08468be579096cb9e57ec5cd2d226c23a1e1f804511b850c58e386ae988955bf44c27e3a0e321b2c4fd36fbf5da7f0a0507216dbe672f2b9cc8973cd348bbc20b5b73976af1da689be4565a5aa25526cc0215995c34b51e98d832296b3830a3282d9d8830a6d4ee2a60d4794f097e5ad6065293d7ea5ac6a9585a229319754df9dd172da56a07951fbe37f680e95ce34d7f821fef37e50065c31a0215bdc68422da12aa207e2b28df26e8e7fe7698fe5cb598b77a5c5a02748e05e5d02a4c58fc186a5e8c5d11f8148caf33a967d707561d81a126560f37023b53bab7667af1f23a8de1b8d3125cb4105ddd119c17f07d4792a95f3ae8bc5a2773446ae824ae198d49d1900363bb166249c751fc7d9326ed56c07075de28131c4679684b3229bec99b9a9bd162226c090fd6c05df0c32d612723bdde07d110f98a71941c5802b1fa992dfaeaf1a9b424b55e8ab0f0abd1b7d4f23b602b32676d736df7b45838572d13fc427c0efd1e84e661b73e59d2e10458c1652021b761723f9a75102eba633f90167378bd9664cc41cf9143f95ba995c685fb99c21f14a260e6d5ff8691a95e4ce91d18b39b75e4dc4eedde66ae31b897a8952ed6f0214cbc8dc06d0c8d19278850bdcf6a6b91b8d51147e398a1d495da66a17535510b0a77185428a42a366bd90f84d5b501898df9fab107e1bd18365888daa19498f19c7a6dc78ba720af1691d24a1c2304575bc4971c1024e8c5466b2632c701f857f03b2ee9ab38d969d0d5e782eef6af8d1c4f88eeb51ea9a7a593059d500226180fe671deacef9080148808aac15e77d338bef6860781a548d52181fe7c29e0239fb5ee2633143b96973eb035b0c67ba532495a4f9988cafc40d8d57d32cc3219edf4ca4ab53aec2c8b4d99d02932315a9d812e7558076b6b06f3659206d2959f12f70fddad10dcdd448cbcd91bccf4fd8e249ba4bbd61e8273e00efebc5b7b6701ff9f0e17df4b5f40814220a2ed080d0cd0d1b805019de1817b6232d8a559921d2ed22e8fbba4a8bf0edef9e6d8d7265caf7f0d737a1cab2f013565c5cda3dc10881a98ed16c8c074a5c28ae5396cfdb2c8b71b13e8595ccdb6cd07bd721eb833ff8c9cab96655e1886452c334879d4da83a057c4370076752ed9f69f32802f461b0635fdfc0ba5320ccb7b16d7b0844ec52a9f2027e670a4da80d03e6ffe52addad3682cd45ecddbf2802f588773361e8b58ccd3fcf3beef7936217702c500987959b68d9359660029c7e6790a09c630c55ef0c467403380426b8f4e3a871ea2f3b50840ff3834967bbead19d5db50beab9e9c13cc1b346c8d5f272fbfc5be5597bb17a3b1b851894763b62db6fb740fa866bf5af9c03bb7e55d396920c7b1a1a02394f13d72d8a7fd1c0613085122047da8fa06c9a6188c5ca3650e6dc56dddc95aed5ad6ecb980273d69a12aa9f01b35a77d309207f939dcc75a86610e55b4c8b38aeebb5a0ada5ab73b25d38a3c1a4c198a2e3a03c6d7a91ef47ca6a10029a6509a27c716c089f6d4f03089be92cc2ac260115723a07bc6056e091dde4fe7a4d9fdc9d1501a4eb2db08fe550841e0a86f96d9ed8090a104a83c1ca188691a63b40544ec252d8fabce042dace19cf0402021e977a7b3e2808f36899551b3bb2ee598f7d20d6f2aabed9eec7e0253e1823d9262aea3c2cad1ff9c5089be8808911a9149c4a9e10b7f5f1da8057c010c0cff3427b4a4212e2c0ff414aa86e560d0606670e364c5494af22480cc5bcc28dbe8f233775f0eb40b623d0d9c05843dbdaeaf71fc2db13a9dbf5b85d42cf8e85110b79c6301cd4379d279b7710166c63429bfe61f8838958e5be0090ac10471f07cb2cbad2909f574163b27dcfd41a39378dffc9bb143380c6fd4342b26db6c460d4c4a9296cf6ae456b2f7e9035a1578c69ba495bfeeab78b67de1192314a37dafb2260188fe02d39dd8a4369f7f419f624db35dced6ec7cafe63c869c721182c87990c8e99f019240edecca54b0c161562b081dabb6d15d41eee0c1d9dd2892197fd365c22aba1366ceffc39cbe6ca6ff5bdf021cf0927aea1c5224e9b8bb6360e7c394b40f240ca16706a52ccfc90cdf32c3e80133a26b816d07e362d19c36a5dcb77b82cfbf98fa4c9b629461910cb2b1b2fe062b48195c4917d94765fdd131200a4ccf3c9df75435b03a2f60a23e0679f19a8b05349c45f9cdefbf239c62b64cab80daf105b6000a87043b191359fa5bc29312092bb893247b7faf8720c493236742fc17fd67786af471870392cb440771f98d252c64d62920318dc21624b6a14a35ca07143db43c92c23789a67970c277b4f902052a5ec7590df5daab756c8e747e8bf8f056849ba36aeba97b21aad4cd8f1c4d11f48c6c0ef49e6d71c3b0bf172f477c9b030641cf89c2c6e085c8af7dd005848405868100b8d3e1caaf77a3fa1ef10463d81b559b552c82c76b66802674015fea0ecf1333a504f6c5f758000d7e52963084c9afc4cca6e8c509a50f02ed809a7f61d1763dd63b73d335f79dca7616adc38b6d040a981713329f564025fc524581340d0cb0f284c8d8ae011f35712c46b051f7843c5ce2ff33364bebbc16a12e066d4af6cc19cb7b40e2b9ff1500b2cc5e818ada9a04c36061e18dec30403ad9839e6b8c234682a64c5e0f5604e517d78c396d9bca1db9a8d2bed82580e718a04ace04ff19d58663a1faf40c59335ace69bcbcbcf8b0c0e5ed35a81bf66ac9a0432a9aea6a1a04d4da91d461260a4868dfd8c04de7f696ac3d691901a1198cd10a6b29f9230906cbb48fc927cd5e323a4d4334a898871e63afb60e7ef2592ca206bb685f6880dec6bb39449dc9c578826fb73b4ed9c951dce673037ddc8225ce02b2b3b25b80ddfab27659dd0176bcd818d5cdd5ed06136725e81e5159fbb9f63c0a5e648ecfdcd7f3d87da15b7a9ed85d87e41208bf4d14e7ae8b18ae36e8ff7448377979fa0fb119a289075defe6ec70d402312a12ffa882a1682cb9c055af9cfe21140ea1c35e6b6b614553fdf67a92b1731ebdedab98b2afe1b11b3945cd7d738fd661e87de3f0eeaf1fec9aa492b7e0c15574645b91d26cadbe8f51b7574e28749bac1a1adf08498fa834ec2433d9f6ab69aea8098c975680b2dba51fc64c0b95a405c72af281e1fba6c6a21be0149daf2cbaaa19f865248e85af8e2e4f0b5391a682e9c0920fe0e4bd71a9a64e9333bca1ec0cd1532cb065e0b177afcba7810d0074fba863c07907dae910d81c8163f890facfaa1c44675ca048f4fe2eb390a7838d5ca8847c241f0a9735c35eb52629d41d42e1253d9b0205584d08409b4b9462695734a373002c5d3bdcd8d789e33f01df38e2c733e9cc06043ec00da3e87c57735e21fbc17d69f0e736aa071aecf9e4a5dbb3eafdf4225180a2ece42a1e1e0fac816f15eb8eebedd8d66c024fd8ad72bb60a3c063d99e162607d7e2f6cad3a0168286640a4b67dae51fcb12044071614696781e3f291943834e581df63dbc6934186038d5b4b1fb3b1cce26dc7ee61a880954cd031b9fe8c7d181464357efd8159ac5bd922aef0b2903f88b43038c38a93bac7cecf2a0c67b8213b4874ab16bfc64c839de1f0422b000e89c8fc992e4e0618ba197acf4d8e838e4b4799c111390324bb5c5fce2a7e86cb26618715982de452a2b7a423d6d619433127980da3a82951c280341bbe92c6ebbfcc78a25f4b85f2742c44261cb6ad39fffdc07155bdc496b3df181b2d4d6d5a5204d677b03e732cb01cdfd7eb5f10c2c7b38688df1d90d3522490666732b15530757fdb4ffc65036631572dcdd1ca4e89fbcc8b4069f3a8666729a55eb86cad7620246372f92af37538a28fdc840e74fed316f00d28bb207eb9d1148087b3a940a729db3737e1dcac03c0736a53d344b7e3e107651f56e445d38cf9ad772d77d4ce909f1db724ee63ac876e95ccffa2e89f5630c179cbc0cf87560f641ff6979b7ff80ec9943f03838e8cd466bf64a614ac0ecdd25ffc6b29c9fcb0c722c4563b564b482b0b5411b9899eb9bce544148bc50361741c2b7d28bfc3edf6597d7d34af7fe7bc938f1f6540e7d638ff0d2b7899a35e4dbdf85105064cee6281db4a16e3e7756dedcb07921bc7f54864179440afea66486248409ab3fc515e836bce0614d8d4ec24267811ccd1f5233b22b327224e5cbab0214616ecb9c60fc8532a60c4a75914dcf849e76e7c3e212959ba692c976d36a25b9b6821311c319c9b81fe8d65bd11553bb04dbb8c14ff16a939dacac974ffa74bdd4e917d4fe69ba53477417ac89f9cf3818b009aaf1c3941140e549652f4176e91de2b703b35fd584e4915910b1318da60446bfef45ba7d5c96ab910ca2b104c1e29603d9cca243cabc01b0b0a2dc7a79525ca035b6459420455a1007ee13e9d54133a99029e2c254b16dbfa5311ea5c67eee7024c27e49de5ef7b4782d6fc4d2bb60310b51558151e0bf7901fafaaade8464463e178b8f8cddf2170bfb87fefe74c4f134aba95cf959e87fb968b9f160c9c01f44df61b85231010f34be2bc75d7b17f101050cd48571214f58a746b82add18ffc278e40ec290f89b3243cd204f913387ce6d790e12821723901031c98d16ce95f400dd0d61ccdc6bf04e02355dcb0a9fa24f7567c85b590070dd412d825d8420be2787caa907d24c985693007e6946fd412cde9bd3754c36607797c683f7e904c4ccec8c3e5936f4d16d976d3b653b0a31efa156baca65f968c1e115018f2163847f5ef7d70f6f6752036d782e97079db507af54ce056b02e20373d2a906e256fd2fdf0548dfd499931dd16ba8301d728b0907b3461929f87e6c4f4eed3885b41ecd02034a2331830ed353bf71982bdf2e2aa5355f0fd30e167958b766f17cddd621a253809e23b9f55df92728263d49f7ea97ad8476d2418ab3be75a0008de8b60c4a0920bb8747ced80f05af12643fb231e8a454292a138c70e57e4e8ad94856b7490df0792edaeaa89b203c397f0773a398a099e38717dad26c15de4bf1c19b16615f5280c298d1cb6271712dfa96169be87dbba565de61b4ff100a70670231422ec582c96d8a1fefa561768b2ddccb57af59dc1886e1a04f3e65211059646ee9bfc7dc13200b2b1fd76d74daea2b14590b09ed4ef028051238bc5c164c420cf9f087faffb2b46b1b4bbd1482f1f38888cef78ef6e4953760aec1b80725503c2eb02cde1d58085617926a135e02cbb2c099126d30ee57d52a40d047589a1cf60b0d4d36a0552b9730a23379c2bb9b2bda268bd05dc93fa43e0c25ed5db5eac198fb6d189b06c5020d68f647251fb0287d2a6f1c3130aeef20bde856103df6018560735563917aebdc0de2e8e047b42ff8d34e0c2e7c5b97e2ab204fb947b8d089677b8e679cba008265e278e0f3bd48ffcf4914ac78ae7ff484f743b86461fa571d7a23f488376dc3f9d29123c1a22f59600541ad738c2e29dd9bc5c36f542df869b4509693f81bb66fe149cf3a22a5af6fd27d45568cb8f2273f0c28f465646477df6c1bcb8c7abebfb94913df71e7eb901eca40d1e3267bb6ec88c8b380a42a004201d4791eda94aff7019c8270e834891ea204ebffdb318ffa97c59f72ec4606edc845f17f33d60c5957637567ca7d1f547ccae135eee0dea203722e63e32202b680cce8f037ebe9568871e64ece8eec5bf21d2361b4a28c0c51d4041e548b33a97faf45e6bad26301fb4159108418df89e79c4f96b4e69e7a895270b96173b935a362cab73c621b564c7e8fc16eb112c428a5e8c70b528f2903ba97fdc749bbb9c9f46db9dc6c2addfbd34151f7b2029e5ffcd5ee2081901adf68f9f780260ac11e3e8111aeec574d1ee2b10c6071dac266b3e046e5875fba7d64a284e01a816fe6c40e79a6addef73a955bd1d463489ffd45b36b26356fe0c9f1091197a254ab706599152c76b00102b045bc7930915d39b981075c7fcf0a2a00158e6b8d6e3020f834f7d68797fb746e36ffbd57d52b3208970a46f26127b96810fd536428edc88e8700090bcd9c017489d9a433afaa28f4476243ba8159e41e469e4db73803dfab3c015c9f728a1d6e2a8c6a52176ad2a46aa85ec7e3ac750d8289bd3edb3bad9d96b7a126433238f9f5532ac3f5bd5eb82a7feff8df64d0885236d54a8cfc10174b7d394e8b5f43b0b62e9a6576f78eb31a59cd0617caf2a6a42f4ace711c2efaf461453dd1b8179e400c51276b782ae9edce27cc5d7e000ae6d29b23ccc06593feabd0da01eaa2bffa9be0f8de506ea3c34ff22be55d378750f443180c0e12e44b5dd91161cd0cf433544a5030c324ca0df5718fe69e42d3db20bbabb517797eb0e67a477abf6f2855269adbc55a05cbaffa7ff83182bc334741ce3ba4e005c8201788c066f59f3bd25a09243a60742707e3148e39f235cb8b2a232f432380830015178700d5ac5a720c7b294f580d51ade1ff59b41250a338661ad3c15d4d8766c14894f4a90068dcad4e335c738f719b2b49008596663a782ceb322c449de283da19a3158a6d3a12f607f8ceda38f54be518a1a34c13b0f75923dbb0f12e15d553a0c0e1875ae136c447e68cc91296d72439126d9049295cba8fbb49f279a1b723447d3f79b5fa175c84c283f46b257bfce82848474012932aa243f1ac99d30099d991833a8c9374aea2fc470c213787f43aa3afd4291f52e4a38ed25403827d35100fac530d031b838f7bc3146f5dfc1173812908f326bcd23031d372594001a42f83efab9aad8ad63247bebd2a4aff7e0cb5b977451c5aaba6e1d4b23b72e622393269f0431ee597b193b48d576a4353dae480cf3f82dd263b99c1032a9a489e5bfac3fa315db772be2802816ae1dca8c97092fe78d4702109600b638f8c688e73a3a8c7c4e5499708b0f5915d42e42dd972999a4ff9151aed85c57d0e6ae5102448b4c1ab02476859430b86bd26341a2329973ec2b630bfa9842ee29a569209322e935ed5a68cb26b6434022251bdc1c122254892117e2a44579dc29739c74920315825fa0047fa529f8b19296e4d9e500df1ef474b2ca6bbcd05a58be5512d1b4877f7ed10861e3692e21ecc57e0131262e1e87842b43c5e7bf22ff754acd0d76241fe2fbd97ac13d2909816f97da58b582c03213aa78bcd0964f797457d862bfa5a3ca03be1196f21121656de414ee43977ee5f940bd16149c03bea6b515e63a92a5f6e2d5675b4cb5d6ba79d994c83c091b54d6cd081d78913e0626bb89c468fcd2405213fa34a25a36222b5ba3540f7ca4f66f47784021289e150d3a3422c6b3c896ce0ce4ef6eed5466b8f3ed8e7c8cc3c0e3fa46a42b8244378382178754c06a6e710cdb97b766d50f6c5cdb2e978d6995e5149e191ef913a77acb63dcb008f1ac8c55e0f4b4b4148e122d38a65293146cafff86d5f53113f877f063e1c5a5da7cb97f48a5d5b041ad8529fe4b85d09c543168a26912d369be6c85e87508db704d9d7393ffd66590a04de09e42d183aa2db3504db6316e8faf68c52cbb977ee88ec8bf92d547b521a2f26176c775e53a780fe5c9c4ca5a6177cb2151b5e7eeacebc81ffadef17df646b99f6837b9ff8843d8276a530e701d59c40554a9676cb8237e1806153ecaba142f24c261ef3f7d56f31a9219417c03453f135c34352c7aa98b8234e968b6f270b31771c3f54c1572b65b54f3733d92ad3f034d41bba3397fa990bbe8899a013fa426013ad3b83052604e3137d698421054c09542947009aa1389015c253c260c85a1c974e27eba8a600a730ac7804f223ee9f4e71769e11dbc9d280414b9e46c01d843d52bd7be5bcc2584faf2b3e7a2de4b8492c9727be54e29ff02e602110335497761b5f914af4501750f5ab3008c87f5e803b5957d53cfd9dcae3be5f77ddff77d61f77ddff7159aa0ee436eb6afc96eb111a85b90163366c8ae6b6c3403986822c90adbfbc94bf3ef50c4f3057ee52d8e12d43a769d5dd30061db35658e564871a120897e7c584c754842c4f97788f214614fd9735daccb6c02ea118ed7d562a458a1d5e3381c9fba9ab05ff4b3eec3c22ec5f3eeed794eebccfcfbec327179bc860da3ad6b51d9b58f7f8575949adf35c56c0cea6ef42ef9fcecf01809d46076e7ea7438365695eb6d6cd96c1d0505352f93616750cf3dd57429be67d734fa094e45b29dec359b6ad79d25022ee7610a6ac98a46f762286f4e8a3405996b83c391e1dfe1c973cc86b2556a38fb7d5f3bc6bfaf909bed402d40ddb3ec9abff12edbe7c381fa0d4d7cbe1b6788635832b75855bb5bf5ecbaf7a0d949f615277b99ec0ef5474a0025469e6675410ddb05827eb540cdd56cec9a67f148b158e4d84076ad642f75d9c8daa497b041b0889d41472ce1858d71b026aa0b901dd6d18add362401e274345b76b27ea9ea2ae462ecda6eb36bac921c2fa0281169496f4fd8d5139b579d0fcf06ef5b9bf8773832d46778a87955de9b6d66b3a9b0eb2fb883f4900ee351f3337e827b9d90e83f44f60818769aedf522c301755fe12eec9a6aefee515c2a64cffc3c6efd78b3474f91f97d43e339f062cfef9b938d3e0b6fa7cc6db383c711172bd59c5fb7734552a906139d544ea4b43681f689031b9611310d1718eee5c742c5eab5925552436562ad811ab1d69470b1d63c3df323d84353476336f382e6edb751a3ac66c66bf0fcae193992a5482ac58e1fb8e4013cbf674e30800c7a7ecf5c7926b25fab32dc519ce56ca05c8e5698a2516d5b4b394eb3bdaae64a86a64d2339d604f9354dde31b958c6c65e720c9e819a825dce7d1c3e92552bd54b440d0a98a331acb5122a40a44896ce7c691b7a49d7755ba977bf841b9edf33510e6a985603105c372685bd67425e8a762ceedb54f342cfefe67d94012d3e718f90b96574ee113ccab15fd3441369e33a2b531461609d09c020153805c330dc83c26834fa6ca3346d7465c8a18741b8b1b1b181417e7b5dc8b11987b0f5b8a1554fcc20e4d8e88083832343ab41d876e8d40d6de243361806cd39e64165548e792ef4e7cc9efa9f01fef791fcfdde1fce186b85934262070f3d437ef24cf98f204a92ab44444037443c444db66af434aa6ee0b3d0fffc066ebca1329edfd01c4f84003af2d37bf34c58cdf39b28cc3385fc26a21251f98e022b82d217db1eda55ad08e5ea842a99c4b87ae25c799c2c0c4317a0e64e90c8767085c5de7befbd77701869092333654e6479cbd9d6f50ddb5903d6fdb1b0af75631ffb0681ed0c237ffc03a010df6e78d039b2cf9db77330d8cedc08f5f02101f770bc59d7828f8fa4ebc11a8b2cb21fd963fb64f36ccd062cfcad649fda2f915dcfef271a9d25c79edfcf314f5fe52ecffcd8e0f9fd34f240cfefe7d3338bad5d873b7761d6d7baeeccecbd7776167a10fbcc14766637c2bf211e924cfeec12bb658d2da623b2c0c3f2d2305c49e2d542f591868ff7e3125ffd9c9cfc8890f8e899148b33d2c7ed6dddf6857f30fca353f34c3e45b7c83fcf6f1f15fef5b9ad51968b73d1f3db47eacff806b94326163f70489ef918c5c83c762ab22cfbdc9695e5e2ec93e399c86a897ee3dcdc37cfe5c8f13883022cce3e2331b10c15b8c3c8afe7770f9d6f3d1459bcbcd5175fd6896b45d2f64095f42899dc3d4623bfa3bb1401a1382379ec7a607a403cf3a3241864379400cff10c1be115d8f903ee911d713c83d880cfc7e3afe378ece8f0bdc85441e885de37cbc519b2ec020bc2c7b62d41ce7678ba3c6f983cfba306fb157e356880f83e83e89d851099b348ce05c8b97f863a0cb0c1f9cc7bce480ec86deb91f87a7fef5f87262d940cad397949439c60872a23d884a9d9d322bce8f269f6ef541072b1203121158447a20435d435e2bf53a0e6e250779636a78c95ab38196c1c3098d6509c01419dd8e0ce304c79f219288ac46cb2db3e62e0435d43ed0a647033bb6ea01eb35fe868ec5324c40a5be6002023d2ebb7e96816363a05cdc518985753eaf3f46b8e9082683b121f8b46e5aa45e6aae4ebeca1b0a345b89d689142469f5471a627a2d0927e8aa19f1de59dcd97d50bfd6375b2a2c6e7b9fb377023d468142b8df5f585b43edc94f26d498c88a687c6cd1f89b9ab12415215e24d063d95437b411943454e98958b8e5155d324224afdf932f5730410954a944a844e9a4137e794712f3e74855a0aa55b57d815fd8213adc2e8d7403f2a076a86c4148bce14094da57756e7d646ebb190bb3fd789bf86a5cc83a27190a884946c3ad51aba47ca6546ca443983c677c6b07aa383d2e8bcb29f844279cdf291fa2b4a344c09ba8ee76739ff154c892814da4514086d83f7220ec4855286d97f018bd90a4145cf3019413f940f198e724e8606834aa14d4085fc68de1781a1d45ba3eb339a496c8cfa81ac54980829327bd222f667697ea3a7153aed698486716da2fb736c2d6834dbd87f7a8590d2329ebef4e8c704d14e126b344a3ca7167acca9e4bbec91b0db72fb532de81732b8aad26e4a9b457d13494a18723c4413c9f10eade4fc4c31362652e82a1322df7a55d6a8a34ddcbe5ada17b3d26d60b414d79b150ba79ea33821ea4e97f393c47c184d29f45c938892c655b957476bb9ad48b3b3c681ed700959fd3027ba23659bd0d48e96935689f9284c293f8749e4c595deaba391dcd8d2be97f5bf00e6c6456345af38d14f475542bf6ee72b39ef18ba6829c5694964eb4a7bd5fd166e6d6950eb8f0146e371d1b6d57f7252d21ded08fd9d1227bd14438328a57c22251114d71675416ef455dab74ec186b87e092bbacb896e3afab7d037d9a15d9ccaba984f9694529624c2733da993734b4ba3b964d8fa436418ecbfa08e4895725174d4d2978afe23a0321dfa0bc9e999bc3ad74092f12d7b23a9f8b66d67b406b48c9a26b111ca0a9ce7f28b4b795f94f88acc54dcaa4a5b74a552c454f47431c211caf5e3b1c88665a3a8254558442222c846f55080f48d4ca7907f911ca57179a32b293ea8de8beb2443cd8e79d0aa4a6f2239e6b920146724114a56b06ddbb67585ed5d64f316b57862114954cf755d3706be6d98bdeffb06cca2d5cd934f5583b6ff8031562716975362b1e30387e454174e5c3302038bdcc8ecf07d6ee5a1d0dd45c3ca45f9ee82f13e9c298fa18fcb672cea8ca5948e068d98b035f79a13cc51d97742353a274eae14866174ac25e4ee26c81a6380949d9552c90ab3109df7a901cad50472e57089c05c294122b89f1d06214f94aa6a974d81c49cbc8a7ebcf0447c6d6d0db76e004a243df0a8b8c94143110a3a7b2a9b715adf6c60987c501bc3a1e492092e166764170a0a9616539674baa4aa5b46c943cf6faa0bcf949750d4b36515750c8b2aa54e7926b24ad2a778954566c91da4e5800790e5160298022af983ccf7b97567e60955d923046f41e017cfcebdc6b33dcba33fbbd1659126b84626dff27dfe825bb4c5cb2cb9f776f6c0ed731c136cdb3ebbb3db8daeebba3735ea5def7a11e6e4dec12b807d5bfdb5d197ed2e4c78fe79d0bdfb33b2aefbbeefcbd6becf300cc3303c338530ccfe8a45598ee75966f63d1686611826b21dd899097b26cbb22d3b07d9641b17e396e9e181302ccb73700e02831e1e38fb148073ccb758aa39c8c6549ee5533e05768e8d32336659b6cf4020106864c61ec4b8009f423c07e3d8c86c93c98f8f388e81b3d008f420ca4ca10819f8148073d028b3c836010f6ce3590396c8b22cbb2cfb807bdfcc7ce199357ee00a61de801e677178039d45461d5b205b2c5b362d9d9626d0e6d63aff7ebfdf5650702ba99d0192605358fcef4783a2d6498211157623af60aa6a311d72912714c46e8900f9aecf96cce7f3f97c3e9f1086f33ead3ad8c7e7d332f33e2d17f0cfdd974befd067c9b4543a26974ac7290f96d11d862c9261120dd836ec492e91a65dbf69d812696a3545f24c79965b1ef1cc7d787363dd74a560bfa56fcb33b9770cdda37b21af80ed5d682932c581b7c1b628958e49a99e89f42841eef93b33d96edc10823bb346106e3741fa9416e42c1aaf7e12b8070e5a065a7e65ad7e133e2479b57774cfa1e8f92dd5f1ade7b7d49e8f9a9ec842baa28493068c02a8c4eadc76211a800d20003319000083201c079218047214c7261f14000735c2507064305084681209c3a16020100803028180180804020200180882288aa2680acef2000151cf61122185e67abd927c32b011c500886765693e0e5433017d41c4788bf5dbcdf322e34f7b1081ed009c9861a220c503a2de261ca155f88fac21cea577bb90f4744cef322804f11b28183eb9110f9cd7489055e7169e27446093bc2e4af773a88efdfc72a6f11c878311b5328fa51f0d60d004eb11d03fbf838e6314cc8c0923f2a3ea1932c8482a5e867220b6fa7fea4ab065e0d0521e1b341ee870405bb700b12debbfc4306fb6ccacd01285719942511695f343eb3cfb0ba8dc495698c36bffa86e77bdf09aeb8224212af1eb4c85fbd0e8d964925940c40c0371448f3c7466fe5d90f950495827a8ca94d02b9e8c283aaf90c8e2713700d3645c4212902d18829404225fa5c4d015069a72ec9e09bc6a9b7702fe8cc256d4ec73907be7db0613786f02cfc367804b1d6ce250aaefac07a1289d54c18782be69e74d557684e79d19e5be4f9f168b84ddd4cbd5d647ee43df06e99d14efbfa952e9d26318c84f5e26700f7d7a12b8866d627f76caa95deafb44f55aefaf56add2b206e620a8439ebec71263642c2b89dea8b5d4378e7b436285846f7c846ed33c8486ed52b6cfc6a09c45ae52e1a217786b78d8d8f38dfc832450d60553d9b05cc01cad5bd81df1ee79d2f003d6905c459603be2a4bc05b427bf92ef866e23c26fcd8d403398bc42f76043560cc9d26a3480fcc7c73ea240526181af7d7595faa79cba19d8aaad28bb989593d1deb985e37bdaf898aa278fa903cef9bc73c2a51be8ba5143042bf11312647f52d16ee5e1ae8d390c52021d48afb44de6f45bda8cfd8bf579a6da833ec75a3361b6d390f3e8bb60ed1aa3c248844977a3a5b98ca1fdfc9deaef701facb494760086287189a75a245dec914ec2447575922ab107547bb7de6857f88a002e7560a74beb07cd7abb19f0d695631ddf16ac63c810248289fba2b37d06d797af2902522ffd74c8ac5f906070389feb3efa800830a12d44599e003d803310a675e3f7651daf49f52caf5f444f8cdcf38b8719db6cee5003ebe8ac3bc9c50ad892588d266ce24e9495e7319e8cc8bce888dfe2bf65b054ae4018b4d2d141dea32bf12b3ae30082cf4478955a885756edc35a9099a9c3ded79435784072e137af75d80d8009dcddc874e312f04d8ee0ebe84230e206db5f5db02983eb929ef4135a513c3565ceb151fe8dac261eb7d5d405a14c46be8512c20a208c5c23b8703263da9db095ee686c94c409f244409334e414e4fec7a859343dc1d190ae1c741bc650d3a1527fc53f8c0e275c145545111d331f7888508c6a8beb0b9c3f3557b40b2ef039103378dc8cd1a107c4bc19911b09914ad948034b84900c5a4a1ea8440d28e8460321da00f522554a34cf847c1f791289c49f0e0a70ad3a6af18fa3aa12676919dce5362a0b3ec74894944b2ee7060b978e67e759789fa192306dd785d01fbdeae5d41d073e1ce0a740f1916a605eea13464cd0b5402f88908150f1bec22970701cec3f09c8c5524e5030c3db845af3a419bceb1c03c7fb3d3ca37b5f9159c4375c27e9536c9abc888d8985e84550162a8f75d6eebbdfa8021dd7f3f757405ba1bf4458d1fb8938a6a6a8125b5589b793f93ec9b1cc7c03d04c48196de94987ed2862d8c2c459b5565ff5e0fd90c15368bc290ac9f7b41fdb885c121c0b880fea97259b84b9fcf33a699de0e83e62c2f9bed302a0618340b040208c15fdf773a94742b92e1677fd0a17f1255ea47e4747d4139305978afb17d8c47b47498eaa9612d64860f204234bc8710cd1c883c9b17ffda6ee115c43d82c8f4749054e38d2b4e7d701584f0aa2d3351416d8858cef26d15c404bc50202eea9acd45a2ca3927acc9f405706f7bb8e0c3d22aea18285f271f54adfc26e3fb6fa2154d0dd4157c115510b2d3318ed3e5f323127b1ab9f746803919bf0443d84424dce13d10ac3df62a6b291fdf9dc11ee53b475e317730527e48d8c848f48e8924666675c71f50fbbba9c04351aa9bdff65eae748f0ce77847c416fc4548d27e6b6aa79e62d35ce9027e772212cb4156330d11b8892c77fd35a97baa206e43fb82441731ed790b7328ce23dc4ec9beb67b82f5667ab36e6b4ff5b7a0eb0ad8c5824f4910ad839c10154ab8fdbf19a2cd95d9fe81b9f53695b085d724fc22cfd2b722e199f0c9b401484b3430cb76c634af0e016c4778a61c57aa05f6c3e5ccfe2d4947bb77da10a58c162465327f6baa0f531eb6723679a1b287d5f6000a91d801c837152eb0b4080bff666abb80dfabc1f3133ad384e827a4e1b7d1e014e462f9101d50a66bb0aa7c2cc625485372a58821d4369f85ac8e26d5cfc4a1969fa75f8223cbf97026d93ee87fd05596c907c86bc71ac1c75056f011ebc1fcd7e216ef4adf9b2bfbb8300c206119b8c7f85936c945e8f5c8737f683ebad4b1b871cf472a5477dddbb55eb0d3561f647cd48b4c0d15ba8da94a2c3f16b8267973c5124e68e879d386ec767b18ed0940ebee9cce7db83b8cf2f4fd6ee1b822ddb745a4eb61d12d27b5c69be1cd5f34f7a1fa84a64b51072b0aa2377194b65fac03db3a6e68fa71b1e71d48d0ed56405bd5d1fcc9895539b8737cb8af242bc74eaedf8b15ea3029c065ac4a15827bcb967902fced94ff3422d401f9a60f349ef3b8b960763c4f448ed2d32a8cacffda673f86387022caec0b3fe21579f19b7174d76f46ec8b958efbdc00ca2d0414854d5b6744b2d1d62441e922d1e80397e2c594f3c682138b2f779925fa2495ee3bdd5fa7e027ec003fe417630f076f6cb88758796d07b5231e398c492924011ff28d6d4084014923c2a5fb716af8174db66ec284d124c57f8accbe9daedb8b0d26b95892c38e304dab3da09641ca1528478b175caba31ff00f3a9af04fd5dc79084746a72d35e51f907caa41810f4dd51a9fe8c5709c7293c41211c98606bdb10902a9089e968bc2017c01e7a035c64cc4a9f625fd4de1921f883de1438e29463355d99654da8454abb0b9bf117f608fe8465536e772aef5a557714437bc96ecb4a311ff4087b84e1b5ed82b2998259c468a4fe917d09d26fcaae77d477b024582a968f43e484f583d341c884d9534df37c337ec115fc41773f365850754da5f487567f4057ec052ba8168afda655d860bce9535c9c23e5c85f9477c06d5d39623d50958af831f575be3a1f5a57e4574ca7fe21d4905246f3eec95a27c96573591660474694e05a7d250f2035365fffb530ed385d69846ba1d908890b935c9fc2037562c688200a96c983e25966561ac0fa5b601698ce6c4d0f40fe392d1788133bbf6b76826ddfb30694ad89c89adaa1d034282a3942b26c20adacd7f2331fa679916b350676793a59503847ef19dcf11b120f0375091a3132ea6d88d3c683a3a239277f47b31f4fc4642601cb1561cdfcac490d0aa8e110bfe1ddee483b7b05af1cfa00f9c30686f16ca7cc883eaa01e4eb45935186bb1f88d8f1cb46dcb272539d7648f121b3f94b74084c9f5e939b3693ca724f6618a5d5d3f9aced6a1fc452d4dee25c1f425558b8e36381d55bb10d3c735c67d0b109f86448de5fef60e03a019752d5384f71660e3fe4817abd7379a49d77d577d2ee972ebbf50f5309b642b47287dbe407041fd47d7bc9fe32d5a9b541c4b146e3c149d94ec7a76ea14f15de8cf082599e83d9ad9c98fa372fa67c16686745f1461b62ee50d0a0629ba00036bfa4c5ee1dd80874141136f61cc0a64b28a80011d17532c805f5cebe02bc6917ed3b6a6ea05ab2d285e899515d2c9be492f1258c6b214af3462123fd3e79283af6442ef14c75671147809831e86e21526b803ff53c05714c11d7850ca8fdf5ebe4cff6cbfca84539500988b467ac1ba81e4ae5cb106a598fd952c6ae8bfec1a663c2a7c4a0105f11946e01b8c9f60a6ef688b68629eb02e813939ef9275ec73f66f4185c3b6b9a62494d14fd0573acd738ea7a258892c8532fa944450458e4c3493d6f5d2c4691e8a969c95cf074d90b4602ac6bff727b767885132b6b61e41db5f745c5e34f1ac6401b42de86616e35eb2ca1c28b04aa1d238130c29917d177ea970ddee5173f5434c7d2528b8cfb0cd05685aaa1112f35deb90087115d5d6c17ead7872244657df6e6764be1ffe4ae97994a8129449ace2550d1d390592fb20e751f09a635df51f2370a597c495ae327059b4c5be72011c2eea6691dd58a7a15d8fd93c885ee8f6d07895ed3a4b0d30715353383d3ec265670fca07f00b1db1b884f201c4213c4f6299a493f134c5c5ec5ca6e1872025fdd9dd085b23266a20c9eafe8ed12ecb905dc2701cb0c592c3b47f4ced31a40da7be0a0d4ada2fc7fcfc6f1d1dd6392eaabf442dd3c0434ca38e4c2f31668ecd35cea080f3197859da05a42dfbd2b0bd8c0a74c2f924fb6689229eb155328e6b782650322e6eefe16d0771c287b8abbc313720f9381c76b0ec1686487c44507a85369fe34b618b630ac4aae6d84dee78d356ff661ae1095b5711c4023fd00e88e5154bdc5e35a6b7e561cb04deb1c5f2331218b63e392bcad08ddc566984db1e910e449f5a933499167d41dcf82bae811474bf35d897a7bd0662a83fd92fe6c61d505c280f20285f2cdd97fc93b55a87eb657e9e76f4a11dd060dbb20f3c8febbf320498960d39cc72ce4ae9577963e9b4ea447b06632995d5706ccf4ded0f215cc9f3d60fd81460c2802e42e2f27b7baefb03c701fc1fa9bd4f05005a41f0252f6244f45db32030edc0e53006587c6333ea6e6550f3b9c4fe7e27a31e59122d62597a89292df3138f6be42fbc8a2fa456c3e33cb498eb5123e2901f075dd738ae12d7820f0733190d47c85bc089265ea7df1d71fc60f402ead67f235ad0fa3e4442f3625dd9e197dad7ab497871fe62caf50d3a3cc3310f16741b190d914bff058942a6180e7d7b85d4c7b6c71cf9fe02cbda77aada85680d589984e7c619700028ee4a34c408af880d5e7e7c7e8f5eb61b2e1511cb151a2c29c64b86e55fdc31b399ee3e6e3317012b379574b3146546dd1822e10bcedf833691aa99a520951bd718c2fb4342c3eae6236a3ea4682607bea66dfb146586ad0ec8f963c59965895d7337cd69150f67da7374503cd660ed65857a84f89c291f528e1dfca9059b4c96c2c49a201ddfc182b6c39974e689c778fcef93f958631306ec7b931f349abdf15ccb6570ed81453cd583a0f2a519ce1b702a9419d7468b0b7a9f8c1264406ca2745ec6a92462920fa519034304469d4c33eee844df320ca77e5e7a72de18abed12889ed84fd9fdbbb51803217d610e6e3144944616c378721e3a91ac6bf1433b460d4ea35917ade6dc076dd807e2515a8132712573301c70800245c608f3ea3d0b1e807bf4a488d162ee0f5188a9311d4cc2217f17ce5b170ca25737ef854f2a53f04b2eba81786e1f5c7e4a12b52f1620904340e5bdd9388c1b136a9e9290b6c42145184c8f1c481191b1fd2109c33c66901beac8811fe318c0a9cfb04ad32f12993baad770c2e57f85abbc6e159e84ff5eacfd9ff4485943af38c3316bd4aa867f2f83a3ed6f03a635d4cf902c470b0e1720c3c5fafdd5ef5de1e2f6c2fd9fafe4d360d0f159ae6910062cce5a7589b9328a7df08e6b8c932745e12bebdfa942f9ce1176bbc1960dcb2c898c67457fb4ca2ef44f973fdfd0b3b6c112742e86b97b20a5d81757d1fbe71d6b2fd824bb8654eb1e8f539f3c3bfe12d9955dcd30047ad2e26085f2205ff8b5c3274f0c3339939821bf3701518d4a4cfc3413c5cb7d0cd638e60154a5ef3b8ca3c154b7992314f40c0cd0f40712e8987dc6670d5034cf7b1df1d60d4a87c16f69e63542a89f13ad5ad64f8122265c5c4e45e0057fa1b08ea91c4b3dcbd6f9e01e8a0ca0af1d0c69ce76d584934c545df5cd1d45c39d99a4c8d4e2efefadd4ecf19369a2f6a30b595fc64f905dc4ad0a66ff8d123fd4665e616633c654eeac408eb1888fbf94f414b09a87ea3dc1ab3b0dc53cbd986aca9dbe1ec39c356ea10e216742c2b7931baf51116023245f6fbf9e760c20d6038320accbe2e2eb14d2396db218b183b9174290e91139676201ff97d4b63109c55e48a22bfd9d0f0639e8e2437056a670fa1eb69a82e08dfc6687ada830d423ec8461c42cea0ec97c73743212709ea10a4d1c6e47348bc4aa1b8c1b5e22bf19ce28063960e2ece03a64eb284249438a0a1d0709d1ce02e2e09f83908e863d050d9dd0f6bf20044d4bc9d2a1cd71e7c890d5a13705ca839cb6514264a789b0487b0af73090f317470e8e636aa17b15b0bb901d4074180b4923c8c3111f8e111dcd175b0e977490cc697302e870d6a8224f0e223d2d91281d1ac7d9118fc3a94d27aa7010d168f02d86a4b45f99548d48a545b67e4de3522962d04e491807f86b92cca5564d2076ce117474c42ccc3445c6e678dd9149d11298f991278b56b8b16c6aad733136b35f62da76dc69e88120ffee88ffd3a4c4323b64c4d2c052d32e2284213e69a2d226c24829735d443c35f67e552befd46552d326451c1ac7791c8568b4e72d249d72509a32b9298f1c2e027f04f1cbdbfa27cd2e988743f7dad1f3e3ead5410cedef715bdea8aa904868a21742ca68c192919bd62c429691915b445fa21fbe95f64c31e44e0b16194969ff42e3d0e4a074381d6bc7ee98c1e1c4b1e7a0e8d8a7a388a9c3cbe61c2bf2ac58e073dc38d48ebb43de713af68e56550bad51e6ea250dc1d3d32ce7e7284bccd85f76729e79038ba323703b2674752fea07eb299428025c6b10ed877074741d4d0e4a87dba174ec39e6bc46424761c9832323284c5854a95725e224cac49af408cd2015d025d117627720385026b24c7a96204a3d9c33c4323fd2e9e07480d641446ace4bf2cc56a4a6096d9b941c47dbf5a4ef2b35ad1b08c8d22cc990e0e569ebbd65d32f640c2c0f3880e3384d4f73be905834ff0485c3b68ef4ab3452c68e501c0d47673a0cd1695881e10830475996168020da81ac9ed61c19b968ff4275681d541cae1c471951c82b758b756627cd2af1396e0ea3ea20b1d1442986d468c117d316cd5f2c544420a413a4b08209687c3270cce250d763aa1bbd531b0e877fad30c7520406506bf63360ff661c201612589aa0a5ec90c60b1daf11f952e4ac84ee9c0fc081bb4429d21c3f3d28d7c28fc81835aa266c818d357f7c14d6145cc8ba6999919168dacb086cc4b402a9b5485987ab8aa4e1258d9c3c71cc137149bac7209f4e261216e915251110a4eb13431079b949fa34c830af80872516878b66c88276b9b5de8d0d602c81dba8a65b5938ebe4af6b2924359a93581d143a22b18ab429286d331a44025a87d9254db862c84dfb9714c78e63513a90f6d09a26431cb445621d4f8ea576958c2389a3d0e1e1d8bda3ac89d64bc15193637d0e221acd23211d1235a21005b4155da71c2d92681daa8eb203e9287c07098a264a215bb591114e541777a8a48ca06f416226e84633602982d22405171d65355a7ec94842fb95148ea31fc16ca716c31254996a985e44a8b5eb7f6910647738bac390198d9c642448a345e800cfc176601d47e726e17a462893c468812eb3c1303292a7bb9285b2e7111c418c5cca0c564f7560a7ccb53009330f98f0f98617a63e2d24661c44485a13b93bc0ee2009d1de588e0dd3b212771cd0487d1ee350805956d2d4427154e1b8395639d6e23064463b20c1396e1c4b87d5219b239c0eb37b9a2f7475a09fa691ba9856a375e5eaa01c25e328c4419b20cb1ca18ba4ff5d5c710bf94cb30bdee1762c715871cc3af68d904cd7a0850d2c6406a24f832b86bd3a7cda7df58a37c6bfebf81275e717e900933e17284b63476ab34acf33b815ecee596c8ae88bf80e8b548521b61e5ecff8fd267c7a6e537bc703638c061e58a696c2af63468aefdf8a63f45e52a24b7e99bfaa99645ae15d65214908daef6c8c58b3dad837576e45613d327b6482049240ed98e144d318dd30113eb2f9904f9e47d24ed46ed0517b5baba341e2dce367a5f0f423c0e0ca877662a63aa9736ed7afd7d90486b11bab4861301c64c7779f92e074b5f38dff3d24abc5b719cdbf33107eadb19419d16b1f6fb88f08055a00ed1be8cd1efba1876542eee6ecb91f50069d94468b0b3b9eea169706e5960d0bdfffd473da1ebf75754af972614c6013e84ddf870c7908965c809869af0be619ec419c6177cc879c42e8d975d4d2fe1642da3265dbef1278c17981706688c2842643dd0a0a9d6f2f5f1095886ca26cfe1f3dd4b28ab609e83e38af4dfd26231564d6463b67c1c9d30ffde86697339c409247665c75befc01bfeec9729579b881c6d5f072c54ce359cd610a082385ce7501700a99ee050f1587c706304ef0dd846776b104624e998527097e048a650e75401b3ea92ca50d928ccea6101fa607e210de759b9284452b48def28f48384c8f19687b82b803794ae56405858804ad12cac790aca62d7a2022c1e02469eb8e9896cbaf1ff0400282c6da09744c5ce60d2cc151fc405b52b015729a99d9f0f02e23c950a923e6fb414289f10fe5e3d3fff31fca69f7cb426f2e8cc17c37edde333a2b667a5725eb15054b3bcf100a01c6a4e50246b9ccb592cd9d89f900588cd3be1da0c6d6f2f357fa711a00731751819043fd469628eed30c4020f95947b8aca970ad9d76d47326811da1316150a1d42cdd1ede93d28f1396c7d9ded52abce2ba5724aa5612fde2d8bbe79f9617fa049067e5ce770f774f0b14c7a05e5d89b401c479023aad61525a40523a4a078a700bd584ab82dea86d06e7cb9f2498b7f6172b9a4aa80927f8cdcc5f5dec8c3d3f7b758b0b56d147149950fbc6980b662a81295f7bb02ab8008dcb4e587be5dcd46c9087b1cca8598e6d6def4db69452a694520a52057e05d8043da77d9b9a1af4b3cfbfead6f570295b7fd5c4a8698ad214d358b64e2baf87ccdbe9b298897c5abfa7a19dcfb2a2258b76bad093443b7d475028e03f4f318d7ea70719fe838f9afd0cfb09c12fc187a6f2e9f1fd9ddab0de85b0597a6b1baab17e3755495a526310fc07ff599bcef89e8bfbfe4493d9df47e67b4764ea74bf3a320f3075f50492b90263048c90b985c8b4317505c59779d510edecb7deb32cf80f4a9f7e614f04ad87ef4b6fb987cfe56caa394fc6bebac8e7d026cd0cc8fd93a795ee392155ffc99d5ce9e1e65e093068eff53d9d9ef9f4ef9fe2a388a2fc912828ad2dc534d48609deab9e573e777abfcf3da294e668cd5ccdd908c475a55231ccf72f8a1e53a7cea469bdb72b59df6b1179f6d87796e3ca6a66914ff8443ebdbbfb4bdd5373b0f72cc3c19b348b7c9e7e50fafa433b4bd65b406fc95394a8e87e4b8841d3d3fe7bb72fd7c996294629f3c0d65dd97264ea953af9c9e50f6a0e6d52ff695fbfb7953fa914e63e84efa3f596bf90ca3dff9e80c7e45f79fa41cdfd952846edb34ce5d87ec1aae9794459c6433be329b3bef4bbe967dbd0025951aab6e5cf7b4d4db672f54371655e1fbd8768e73e0963682a9f2c4fcd56ec3959f14b7f1aaa992a1ffbdd543bb44051163d6741fe2a8b5af6e8c9faf8f04bdbc9923fa81925eaa518b5443b3566428b91e98ea90db70dd5cc2755ab41fe3d644ed5ad6879b8dd222e5d24cc680932f92f31b3dfb36c99fc171724d3fdaadc0bc1f7d1e609f8afbff8b79c1426bc6a54ee89b6af6f292485aee74d75bdfff5fc971baa992750cd515daf41cd7fb9a29d1c9f331d97f5a7229ffb433573e597a02cda79495507b95f59b453a59e7ca4903fd1ce27c44fb4d349ef19dae9433bd97ff08751d63faeb230f1e78f973cfda0666ac60294e08236949a3ddb4b598e676518802f0bca7cdec3bd30ff6dd48f3fcba2755f9f1973a5d0fba83ffef15fe6f33e4e58b4d309391989767abb2b56598c4cf7ae5cc20b3495fb54d1ce96abc455a336f40370ed5fbbf9f49931781891600a149899aa2a42829979779779991902342a1e3e584ea6f6689429537fb31e5d22a947c758a160984c7d2966c0250c3048e816239a858b1ee140a54cd12c517001639f6cf663b384cb04a498400b9c83342a9f1ed040a51c39e0083566eacb29105004c54501583892210304f490634895e8a1c224e21f9bc95255822bae43a33a21091935d0e032331d9798a958a6966854284082543c1a66a6c3ddd0d34a2ef066884ee8681edcdbdddbbbddbbdbdddbf78846353bc9d40bd434996a63aa8443b47f8420adc8cfac03360259c89426962f533f4e5d6199d2ad8a495a4a3a22b0220727564750f101467b59410c215d7851c4073b58a6c45e92e484192c4be69bbac28244513d2ee511f4892aea9c1073e50b208e84a4d5133eb03c31bbbbbb1f232189af74b972c5992d1e92169bca152ed3396df2440700e8a1891034c0404a163785111a8041eae2062b8af02490060746a6c701eb2e7da5051957847417d38fc1449122c2189145134d6ca1569e64e9b2850eb804c188952a2c2b5c644a458456b85841ba92a0314aa24a18187e3849c2e3052d66c6b030841855c40041182b4daa44998fe60812aaa039e2c4830f2549a23451c4882a5046b8228506563441c221895595273a49e8732ba4d59419a82431bb8d98dd0d835b515102699090e0e566ea8aca10a432ec34bca77bd5eeae097612b14f9573cc7f17a301491712a298b2654a94a9aba32b7b94c3bc6afac94c4de20cf8d358125e8723212c1cc9701484059c242e458c5d82091c1c29492e4822c58a169248f1020427892f2185ca54e9b080af44254d3cb19aa0d25d96a881d9dc2060ea4a0a1152788892440c3c76c8a0c1d77fdf25ad11e30d3879988625db2f1e1efd1b8c32e1054d75e0903c8cea7f955a19d0be903efc98f9a814823df0f57da0c4b28c616636606a16317c989bfd643f50fa96fd6c075a30026c76bf3f214ab86053aaf42e8f71824da9d2059324aa6051c20495d26c78a7e828d1faf5df7483a3d998767963f0411351a0ec156d05607ef0850a2caeb0a28a3047c4f4107eb454ace8303377fb110b5378e912c51628b4f44a852742685c68e14758ec800c1929a4c892658ad9cd4257ee7842d3b95a039218551e53c3dc7dd52663b8f8a204102a9a00f1c203309b05120f304a5753a1529a8d0ade52a6103f58220a29504c6182c40e4b9899596b8d77c0810eaf129636cccc5abf3e3333738c394c02e8b40cbebb9f8bfefece7228ab3e18d5deee6e77d58648c2cc7c841148ba884e22a2bb7b880fe3f7088721c427fd0df893825823dbdd0dc46a4bb41f76c9da60d78715c2a84877770f3c30336b4bb41ae8eeaeb66487a64113e919b40e9d430f691c6ee8ee6e1bbabb5b487777cba0bbbb6be8ee6e1ababb7b868d419985419995a1ccc650666128b32f28e382202fb4c005201fc66f0bcccccd9b7118fb6359d8f5b1bbc22e0b7655d8edb167768c1563cd6c180bc67eb165d68b202c01c2eeee12325d8ce122690b2db21083c5155654114673014c194d7ff0a5a9d8511e7521a6f0d2450a2e51f41628b46459e93cb1ab13058b0b4eec95b5b25596ca22ed943d5a293b446b018a0f9a78c2c4123d70c203234d77e085a6d305257670d0543e775bd0982c01b25c44d3283b482df022a1e944024815fd61babd10d3dd5d85c35c268459139060e61d5a8c0469cfa2f107a1f1777790d51346588c34204e14b9a201b1d2c3fbf05578d0de072a464845a61c498902c5073568e209134becd0031a3899010f6ab0831d9400827735c66c9af0f0f8f3304adf8417b47ed58dd92d3df049fca0031be4c0075e2a3f96dce0a371d0727f870c9a3f9cfcfaaa18a48c52a5004e3835732e6f302a6bb94c7076b358cec10a70708466437b77b7eb7ed7edfd8ad33eb4891b6183a6c2e48e18fa514ce3048c23931f27356f30cda68753a2f5f3ef8e1b689873ee4948d31dca32792e496210c2061388c84153451cd408eed96df476194206dc47b41d4400e11b682afdc27207124de57323c634921c61c402418b4c78e8b40f73c31099fb376b42109a4abfec88817683a3390ad801034de3158c1401c40cbc3f68aab8a306ad9f9f75cbd46532a38777de381045d3d7f6e32e13136ca0a9f48b7492a98d55e9f8e4b542c45293d3e11b3c16e011ae570f7c804330021e217b7da215327b57f6d36c3c3ca3fbb1ed033ca3ffda46c033fa4b5b0a78466f7faf4c5568ebcc6e2d469ccc064cd502449018b6c7fa205346cc068ad054a50718b5379ae8480065420d34972afd32350707a1dae98ce240148d5f7543cb0f4a66ff0da6a15a801832fb71e458c8f186cb53eebb45954f3eb9c73eeeb75b997aef7d537120c8a12633603e229fafe77d3f74b5e1f2f49e515be94b12054ff11d0ab5afc3c3a5cc640506c8d4d50f86acbe2489598189c284c7f87b753b611a30fe153bc6f8d0c745ccf17cefb7499387e92269bbd9cf22399f2ded6e496a8cda8de746f8debb234498f4c32e137ecc01fcf8fdee4b93e9fec90841868cc7b90140d6b34d26942a6c5e2f55d7e62308957b16d2b29f7daf26f37196251d8ec64c383a372cb0e3032348818f1886f8c034905c36580038c38860561400e6e273fcf77c59d9cfaebe206de6131f3ee6b29ff679d2bd57d9d1d0005957eeb994dd8a0a24535754f0b09aa2cce4cc49f72b0b8267ce9c01820574f2e7a0cb172f48a6fef230f5553c66173253df799961f6af171fb35fc5636e919f3ac7a9a5fefeec5c22a07d7d98013da9e2716af923db069103b9d74f3991cf065a20158fd3f3d3be0bdf6eed16e34627612efd2f7a4c662d434499efb5a7fecb7adeab90f6287c1dfbd0e2315de53a715bc8ee744fe331d76aab0ef7bd5d9dcfb9dd5dd7384c77f7768a9af3367def71b0bae7aa465cfa9bcefd1bbbabeebebbebbaecebeeaeabeaeaeaee7c89683255e8a23608415c336964904c7f1bd780f60c69d21c97694e3fa639fdeeb9cae5aeeebeebde53a7ead4d21c22da7a73f3ac549dd0db2fb8e00e1db47ebfc1a81c97c34280bbeb42d8d405298ee62c87c374837057868c87325e860ccf809c54f1983f50aa8c59903392f1a54fa51c4e0a434da086beabb16e9f3e8f3c98cb7448e7dc67ee71f03e8e76388cf24f310d4d31ca4370d2280487b95729e4dec9b8d23b0bd2f711c2af744641681402bc02c8ea80f3f4a32e841cf07a1c1c82c4c133f85fd6c3f3baa1bd4ae70111d0511b35cf2f8187698e5395ba26e83994428f59f33846d09d1aeee186c3a893f525c09d15f6cc8e8c3ffde8c38752c848c6ab8cd7996daa1bcb812b345534dd441c3c036ed6cb1ad676c3bd0a35e50ca540516c80da287a94da4839740fd6e0bfc14e6a680e7f8d1a060015e7d85f5cee5a5c8aad197e9ee755154d7ab637abfb9d7bce39f4e1d811cc4503959de020cc80e2eb3bb796abe19c655df082103a75dd9c2a8569bdcb80e24375eb2e77bddbaeabe44ace39cf80a090f3714116f61193bbbf2ac2aaebeb3764fd1ace4186fc9e624e7a9d3aa70e7b85ba1093ca3336936acde0521c7eed9c73983ea0dff16f29f3e1b5e2aabf6de78fb8e3dcaf8ae0f27537507767391edcf1209eaa39fd8ec9e558c6af34aa71b7dc55ab91cd998fc2cb2184d09d5395463466ca3881eed6e603eeac90428f1d9a2f19d1fcb598d23c0abb43f39e01e94f766541d288268b9f6d2a8fcbfe3698fddbb2ccdf167954f09551fa42f01f94d255e5ba0d8beff97b9967ee590f8453b7d2c3cd49158f89fd40e931087b135cdb500a3d66499edcdf986f4423359eb1438886694eab8d22d364e80fa5d03efc2ec304ba6c870cda7b9d0ddf0d46f9f3f8731e3f93a2fd4d66d7dd7d03606859e66e0b980c657530773bcdce5c4b97217337393de355750ed2787710664a6fed8881b6df6a75299662c9da62c4b0f70cc8df7ab8a50004fd1de698636f6d187659976559cea827ad7fd94fe9650f33ccb984d9cb72bcd7feb2d7ce68d02e7e45c668e2bf626ade1b5dafd2c8fab8f958e1841e3d4a7f6d407e6799a1e4d9cd57b0240a0ba4ef324a4c75c3088869c77a954651fe883b56f7af8ad0afdcdddd2aa566399caf933ac64e7ca6c1ee23a636f69da326bf092d688eb9c7752608632a37f569960234eb80fe0623862f9ec8acf7b21e969e47663ddcebb3b73658c3daae2bb332cbb2e0fa5ed603821098019532b870db855b9661980abe674096107ceb9d2523075dd2a8248d7ec41d1ae9c3c78fdf711a01fe1f3a3b501fc0bf2a02478e96051742d798f5c039640424eed07cdcf6e173f081a034f2d5b5da88469e706dd6cd8d7169c817dec7b9c29870b3e6b56426dce0bc3869c22ce6e557cccb6161e6f5e05b757164eef6a66faa45882f136edd0591d980a9ab315dcc8bb12c47a6397eb9cee3ac2462ccadba3033dd9b9a4c30b6cc975215f6240fd36094ebbc8e7b94fb94049c8769dc60549c9007062dfed31127f4177a92ccb591518a6121048a2048f0554b191f531fc2572fc8ccfd7e335ac45801322f0b3b134fb85dd5b4f754dd46d35eabaa6e09aaeaeccd2f0a2f333373777733338f414a4013daee2eebb80dbab96f4ca65dd74147dbdd75b83199763b4ebfa1bb9b9b7dbb7db9b5f0231dbf62d7313373ab14ecccac4ac3b50b7b1d84ba70775b07f756adbd70a7ccabaaa9dac0ee9c73ceb935dde0cc2e17f3425666b87075afadc110fe933ae0e468e57277cfecce04d09c7ed38d3f6fff72ad7bc1845777ddbf07e7aa630ed39c5dc7c2c71c41b3f227adacdc9a6b3e539acdcdf69720bdcd13f43534197695ac089ff366cd4180aabb9adce46e63ba61c7c5e5edaeeddaaa9cd26c6ed849717527092180e64008618fa98172e4dae56576ce35e7d6f769ce31d6ddfdbabb55aa33f3a6349b9b7774b93b6c5f4ddbf6b5d154535ddf666656554f693637979427276db6af3ac7103ac8acceee9123bfdb62742793e6e8eb545656a9715f74ae539acdcd1636da6aed38a5d9dcb0171b8d35a5d9dc3096ee6efec9cc6ce269e2e6666ee7f7e6dde16d0a55dfbed53957539acd8d167ed4ab6b77779374eb3a3bbb9b7897996fb877991973d3164466ffcd3633bbc7b744477bf7f5ae8de906674c0d148fa25ddddd57b986d642ccf23f13f376667a26e67dddddcd4ef987df49cdc67483d3fdcf79bb2dd34673bd326cb4946673a3851f0db94e26cde1d56edd6e4cedeedb7beaabca5ec3d5dddd7dd3dd9d45175d5d651e74b73273332fa7c4945117b36a65140f71a98be911b1a5c09b2d553add4e567d570c92b9fb5428cc9638baeb36a6ddddf7e6cd61adb81a0b2415ccab4f3a38722f676353958aa99268e7981a2863cc88d15155ed02553c7258f2f4b3ff5ec7ba979ec7d48d88674942601d1055aabe97ae636aa0381ed68c98f72ccbfa855f8a1285ddb11e6640eefee9bb766964c91f7127066000fa007e192ac2b4611adaed5b1483d66196e550cd9be60a253abab1f75ebb0234c7147f5caaccdcddddcc49ea98ad603299579f4a0513d31c7d1d2d5544ae13a4bf526835c8c67483c34aa84ef3986e704c6e7b1d42f77e8eb90a2093b967d5df53d5b66c96e3a98de906e7ad9ac4284c7cf76d8451c697fda8bbf885126624d6b2c5b96e353abe476c29e066942a9d1a2d68f1553a33da306ac798379a6300cdd11c472ebe4c7e4c858b37a082a62b2eaecc55d26aaa629c51d5bd3b8c37c8c87a9646f0df03f23befdd0a50a2b03bcfdff9b8c4a2cb828c581a3df923eec057393b3f591427f33b770371d48d4db32c77c46056e0fdbeda603c23009ab3ff98801baf2e35372c6d96552a954ad0b9870fa1b3228661d8753908ade8dc4107dd83ee3907dbb5eb86385c4e5f3a95aa13cc6c06045f7f61673ebabda7da15dadf1761c434db9f986ddcb8a5927b2900c12c6a0e974a96b5ef498f59509446501a5d7fc168edd3a7aaf1ca14eabef7e08b8c916166ed876666e6b96582cca1c5e9228ef4de6feffbc67f5b8cd6b3de7bacba0b3703d22f457dbfbfaf4f629cfd3c1959553c7e78870caedfaeaaae3a2ec39b01f13399fd980e9eee308c65e2d27f1bcd69667eeb76ddaea3badfa6845d5e96266d8b2db3dfe6c64a7bb97c8688f53384bdb9bf7eddadc595953898a9b0d1a216618430c67522ae1835cde10d995aa854cd5a37316434230000040053160000180c06078462d1701a8639aab80714000c709446684e2c118862711cc75110c64008c2300080300c6018200619a720416c5177cdc3464866a258291560ef9bf9700674b97eac17636c071c21c6f550c3b9ca1715bf028b187cd545d0fcd02081bdbd2f9a9dfc8c4105ba99b90f0897a836c61c6d796dcd9e95a61a88c5e213b4f4bd754feeb5ffdd7e54a7ff251ce73ab92c52374632f03fc2fd2ca10648bef7fe763082545d6a00bc8b11c9ac3d73060455f7641ba8041562c71b58a93fa1427805d2353db72dd5ef37b33771cae17d5c3c65904ffc3ce290e18569644972ed917514ee41c3e5262ce5beee7ce343b3b1f260713c1bb4619008c56f2a17aa3afc22120b09ac589b5c658673e3dcd6daac686a460372ef3cb073372d01bf8b5581f8349a295d219cc5135886e32939f2422463d38764b6b56c446b0a692900e59aed016d59e100980906abfeb0e84784ff2922808034d562ef5f2ea1801e49e7cd39d58d7b4533ce83904f4c8254049b052bbef83447f4c45afa192c29679518f9f5d91ab48e8f066c1426f30c324e4972ce76dd044d9ba8ce1d4f2004ab18ff1b773627d7b0aa2776ea27c06909622ce2977d9f4219df5e1e585156f7cb19ac0454775684ad92463d990d40b60e868ecb0bfb2fdd2a4207746ad472b724d1180a66c13cdecf6e71790a4d65cfcab58e08215faf8f5e50b7c61490291cfa28baaed16c673070d2cc6441b05a31351480f6d99082bdf9e97986b5e522a34ff7c14424f965e540fa7b443fd7ab29aa0f1e5e9e85225e100397d830d2201ad80dbbf45f697287ddee05f268e199d587e8cae595403dca86ef084240123aba30e7f63a375b2fa81d8d45470643c2b4beb19ef99f95fe5f49294457f2e57c83a7d5f8a9eac6a380d3bb2a9fe79db61b6a09c309bc66fdb42070b46757735980a4ca28439ae83898b7b8f9630ab3da9a0b3fd996ba7c8401bdb46fb018225e8db16c4475aa5b4413418278fe03ed6a55241eb7c5e0cc0876a9a15c66a064241c190bad303a0925d87034cb81cc865afb80769a03c55a02f89c8c4c636b493d1db50ca34249593a372082c8d17238f17ccaefca5032fa876a304c58f82c8bf621532db9053897231bb2db98391db2a9462d34233e81628589331e28893781df2169952e8978510909134ff7ba20437b7a6ae3d0094439ca65d02344b0d7f95a65ae0b654ca848cdd64bde1e825208cc20b8af992ec05a07ffa226ccdf92d9b0e61a94658b66dbefac6294dbf11a7953431282948f72ea3fe8649d6f26ce5a97422591ac71076fe080c33a08d210460d436067a172271d384d1bb495c69473a619631626b752d0c7c3a62e2cd670065eceb527f43f6258e8e04d0a0b0bd3488437668d085d5a48d112c3372521b317e9bdc6287d34447343ff7aa92d4093b6171b7d478fc8b502987e948a3bc95b1cf631bdaa151c88807024497fd7e0ff9c8ab9b506469048dbd3c6e8f92966b25466efa79893251f0ff6f72ca1a39f1f14fb9f884a20c8d7c4ce56a7394514156afb9a89cbe7397a44427b166a682394bdd66fa977dde62d18c89333f9294c37f4f3ca742c241cf9849f6c9dc98a339fcca9c15e3adc90c6312e0a07eeaea1de0e65a40d983d5c894429025ede68248a5f803a2b3d0a525c0a5e4798557a2bf95ad1fa797d22e772b5f189fbc3cae7b9c018aa20b7a6d21adeceb1d7092c67876aed2a236780663a601371321f0e21a12744ea76ac854234f6f6feb314480541ea304d7c565359b024aa5fa81bd73d4fdd1bb4bf7d4738d73a3823bdb2bc115470b6b3c7cefe490321405fa6c9f0890eb325442fe2809f2f36bb981a7f1015de17e1aa514fd6e87ef5966f63f4615e8abb2229f204541c3e22f2429c7ee612c413404ab2b21c44d1d5da592b599ce283ef1744b367063c6880eb8bc05f77ae9cfbb67119c55975de7d1dc16e648c1dec23b563914f551645193ea12c94a9dcf5adff85b74138ec6e4cb8e806a23465f9cfa8bd026210c1debc788854f89c821b5d2f19e5f1667330cb7ecefb330b061284bd1cfbbbd8062d96b57dc40c36702f516ba4a3ba3be43cc3dbb7b3a5a5078ecea82bf6fd15af1a44e1a627f30d987f62190002a2b7256626594a323c2046cf9e11fe02db056a058e2442abc523f5dc375a2c50e543a106bca667bd45d17b155971c4b5ca2226e3e7bfa72005e431093015baf81f6a39529d89a2837ccd072dcc7fcaa56fd1115005cd6cc2c2ebf48f6eca301ef7c330675ed71bd50c9a6faf4288985c4c491f937169689c2899f0a2a0efa7bf2fff8b1e8f0a77f7863499233a702e45760d7371509553f513b68c7be8de0ca262787d51129e97590a39da7670a7aecd39dbb2a1a92cb498c2c77f7d689cf13bb8ccf70d964949049f197dc5ffa83bc35c559d094f46e74cb16f8eb30341b6b383ab168d9b065a3557a2c6ee8f5bec404be35ac477dad6f57a11620ad0cd8af5962f91d39de81db323d3a14910e28708e82e01d0882b1d0bcfcccbd9075fb9f124224b8c9f1b280bca826a53b138d5417ef1d469cb523a46b7c28bb88831c1f0822aefac07a95a33473fc2b753fc07d2f1c21720c26e2ad9676548709832037a79c36c7961148b0906db7d0235f15e029373bb10581bbf548dcf3dad3c80efa22c1ccd73de8e76bd9b43b5f949e2c67ebe5fdc3d79f89c175f724edccab5620d1ce7e6250f9b8a5d0217ee8a2837c5b0ceda08e6d71562fd121427c5ed97218c00cd5cf607b3ffe282a60aa950ac7e54220599b27b2c56be2e71c1ae5cb8e8c4aad2ccac2f08d2ee30ffdfb5f2a2dba680e20f325b3e85df67933cc9a8734102b11d677cc457ec2be44f180d2118edd85126b4b3fe8898aa6717430f31817b821e6a39840f5b37b80a97e380872f74674092fde529dbded0afb9eeaff1ce4caeba3763f5e030f90edb55c8ea87d84d6e27f3721bb6138f1d98540e322e45ba1a8337335d0f3466dd5fd8cc9d3faa0dfed8d0c8c79fca3b0756a301c9cab529c2396841db3e47a348d7b0e4cf0c950582a1041cc50bcc4a39507c68289dd7b105e013c0cf00bb817788861511ab5021392b9646a375e6b81098d9beb358754109025c95dbb78855f5e813fed9b1943e1764542ad92184ff8b2b5da598dcc8bcf868422fffc145ded1c49001b2ae3079c51a548a5c0113674e91ecf017e35d1afee3321b42de49dd111c572c59ac2119f289a745e2c8781a9dd8797e2b06cc20fb38cd8d949dc19f26ec82f1538165403ccd34156f651c85fcb452ff353be420e8cb9bccc10bc12fa81a106b7b28c67a1a46729ac90c77545060d266b3cd5dd84ed8deac4c1a2fe45b7271a621d3479dc8de2892094dae836630efee9bac805041f6de370965438afff893a67479e0280b77382c87cef24ee44c1782ec142ba3b45f0c125600bcd765c273afef149efca26371642e0e5a926a78b193cfb890113cb924f393e6f591349716040223901d199cd5930892890eec917bbe4c10ebc210a4af225a3b83c8ecbd73197f7ea48d63bac93701045ce5f2892f8b918903430de63152577119fe8de160ae027bfcf43dec397c36faae48479d9c9e1529c2871ab9a833ea2a12d2917902ff69a42632f496ce43bbfff3f60d56006be354158fe1cdee7478da77a6045327f4635c63b4b8e2a96bf92a45ab41846a14323c34a203fe069753effa89015dfb1cebe1f795b92d740df78bcc122978daa40f38686ebda359b02bdf01a3b57ca119e03570a011c94e8c513af8133c363b8d780a88aca6c00266f670a3723eed046fd2cad3c1886ea8da39b5d0238ec2b2a1026629cee80d406a32a513e815e8cc2e063e73d47b615a70aa439448d7c1620f5d297da21e3f747076ec417cbff048c3db7afa2f7e228615ee198fb59ab472d358ffc360c85712dd5ba0f015d5f49eb0e6674a3a3e190ace40800f772afb012add14d8d0ca15abf4d9d75824f866e3852a4206712aca22c31be5f418fbb95bf34ca5ee428b0062e113edb25739782a9137f59e332898a4e27b159b136c3c162546e04f89c1efabedbeec6ba416eeb606e9e90e352515f207ee870497e3906aea9792197a9da29000bc0493dcbc31c89259089ff2fdb9e2399f3d0a679324ebdea54ce15967c65b0ba708768922daf77319dec688cc62ea81de072dbf1e590016f32b1aa4126aa8143f23afa947fe1a50b3b1ed68e0eb38e54fdd8faa86d132a86745345095a3e02cad1c411383de3b9affdce802d14c9ee87c53dca49328977e748220a78b1d1bcfb2830747853e1e62bb17d8a7943aa3e23ef5f2b088a2d45f2f1cd696fa0aa480083f90eab3aeb398a72fc61876d77f06f92512feb6f20e2c8e89a61859741ef35a23cb4fcaf77fe50eed857bc12d2627db8b66caac4613bd6d4d80e7cdac6b6ef60a213ad578d6397c2a0611bf0c1da14c73ae6910066ade9e43049b3d930ccb3e76ee7800610df363f425dd09754abd239cc34db29652aaa5330bd4c1ce9ef910c7c87d1c85276d14273ad6905fc5709c81cd55011b0c9abe1a57a0f8bf7bdbd6810c6b8c866cb053fe22b470cb0bfc3544e984bb1d30203acd5e06265d599734df5d934bd618d2d60ca74b3488c03cbfd197f423d092c7d37392aa45d9fceaea60550573aeff5344678ea17652da17e5905b1da8e917afb0050d43621b7ba11c3a6859b5185294ce301776dc15d28cc322394802f21fc3a16502c38c54f0fec509ad030572704a551382dabd1c746a3db534c770e5ae08a661d3630e27ddacbd029d8f0eb0072dd0649d28989e418a18c2955316dcb400aec257b4938d37e4ea485145b6f252bbf15931909b817eb7a170276e427bdb9a2f4690c8e5527a4443bc8ba82c41994cbe5e593e76225e1f03f537aca08f74395022cef05e4a154d1fed094984ea0fb7eb45fe31dde358ac901dfb78b1e84adcafad78b978bef69e190122d65528f168ab14220c848753830547e97393127c2d73a3350fb91644b88dd51829f3f04c38d8d0f4fa74fbc24283613e3fae73f31bbeaf1ffe6d436d2f09baac2810074c981747aea5f9263e91683c84e76e9f23907d19ddca6dd126e9c40d17fe937dbf62dff37aa17fdd209e0d1cb64c9a6a6685533ebff03756625e7a429ad5efc99fa46999b6a46aabe5ea45c0c1cf468223db1de3468d401e02867d30392d371e62994a6c3f1e22e1490484e2895e686bf377ed894558b4d2d99e7255886d369da58c5d07dd8c22bc0fe33572504e6ebac947eb7d5aa9d3c4c24d782f855e0848f17a6211aac4f7e1e65cf9782fc71a74d4588c0a361b45094c9ee0612e5fa392f8459c3bd4045f35d76ff18e8322c244eac15830ef5d8af3ebc702a79df4100c2d2cb357447dce25422b5b31628a3e140b0846358c30b1a242e53c95950189ec8c778a70826ec59e7a1591957f4ad0fc07edb3df4db9cb3640dbf5cbcbe06ab862c2c5fe3c4d59543cdc819cce009219f79a632314f1f9c0d2fe5d1cd48db093a403998dbffab63bc162c73cca711c35540151514faca446bc0775855ea54eb0712cdb128bcce3f859647bc155d9770be8f020905ee72363ac8212ac188c5b3c12d0aaa87eda3d0af6a2f867b1dd2ab478ae024d4d8fc235f5b032eaef3ca235bc49f7cec8be21760ad9af9b38b52a19aeba10b209d152c3eb4b33df30b2f5a325ea62f1e679a1f6362c6d122b3908c6fe91efc90d341420260c91711c171a1e204a5401d34d78dabc572cb0e2eeace982e4138fca407d2a99434ea852ddf743f667182c12608bc134160552c26b3d852b89a93a0c22bdf42520fb840cbfa7480e639c587c852f11ceb6340f46818aff784b78126135b298950cb81f756d402a2757f9168e72e79816db566a1e01418b01b036ef59848a4759194404a4f04c53b48c84690cd904ea908b34586f361f087f4a451c57551b9491d4fd52fe51d61f4ec9feaff3fc2ef8d5d5888fc3d28c01dfb8f015e45dff0da31415f533136f2ad176246d342e3f455560d08d1a8188ce857ef588f6009f1760d484f3c6450f454747ca8598b410d3ae9fb0571ab888d355796aa9c69a52d778d4360325ddcd18c8d56820761a17c48797e9fe8b488e9522a97129287117e4efa58875e3d28e67e1f1bf09cdbb724dc4c30d4041e60485ee4c16bbed6c7364311a9477200d5116bd9293887f68cfdce82cb6a48ee3b0393a884f167cc37bf4da504a899593189bf2a3df95f1e7daf41b6f0525565608efc0939f5e885aa5dc5afe6ab4f4dd9fb6b9ff88910a7c2fdb040f8f8873a4b777bc5355e1a9cf38aa20a8b66ba146a6d95902defaca81e0c505856c0e7c06240de16b04723fcfa7d5f4167a0857edcb23352ad6c2e7f40e91c89b9e4bd222680820f557351037224f6d4ed63cf87ddb2c0c42e9473c4d869369a8e5b5c57d222eb81fdb890342d42e9591d25e86f934c88dfb5940a0103e716dfbd9658a575286a80890079b611f6057df18f4ce3af97fe36030d2bb67d465a0cdceb147ba569ccc6b18b8859b203859e100272c807b14504a400807f97c58deb81b238b8d6326d960ade89d3259776dca2827f4ed801c77321ca010cb7d1cb96a6dfe449f41899e7e8239f44d49f395871d8b2084ae832ef24e26af29660838f8c54f2f258ceaf1e5a06aea76a16c983d6165770389806ed6d29bdefbb0d3551bc6d96f84903df0d7338570e601b75e71e6f83e08390d98704346102c9e157b87f38ebb73ae8d41312df68c1dbd9138243a52c860718a08cf056724287b1b999f7995c58f3fe805351cea43d127d9dc82e48cb0d43a85a882bb7f339cf87a94457a2f47c29175b8b1603bcb5d2dd369ad7c2ca42382ed7e082ea339d71678fb156a63dc09d5e8d2fb122b8915d39b89d7143b2704f2d65b6220bd9331c357f685f186e750bc7ed46633b4dd9a79e5ae5b89e0d7ff29930c194e800e1bd213d7e45c098d22e9d51ee96ac53838786986babbdbaaf5377463e22bdf986d4a134c4a8e8b5cb7f1e8ee6556911ea124bb3a33279131c6b5fa6945044ff7299defe8a47313b8aa8cd34fe7cabb8e1c6756ab59a48f2db1d9ceb699e26f68487baa482b07ba2cda378d1dd4992216aa6b75d282eb4b10fc4a51d378ed4e50fd093ab29373e28865937bdcc57dbbd37b937c22de4c8e4b925b4fee1f87d99207e400029cfa97001e8c27b37486ba3f4a6f8d7dbfcaa89787cd17f8a81b61a2c02d78235de5aceb3bfcae9b6c3541a115264dba6456f1acdb87310bcc6dda9f9732e1857a1983b22028b90b7f5159fdd093e0acf03b576ad56861e051dfafc036f03233c42f00f72f7b1c999b78bf4852d7991668123be04f404cd0ad36d83c1b587f37055416f729bde56f6d4e93a13ee0365f5f610c802818293476d9f3dd4304d94c6d6b2959ceded4953642ff0db1dadd98a7a21bd5dab2af40a590e0d1f9d7234ab7bb432d36a05a64a5be631043f62f267d6e8ac93c4719228cb7345d3c9a026d5944a4483af37caf814ee41973276f38a7f315ebefac922bebaa84984f256ee65c62566ab75e30feb0844e988a110029e4efcf12f91637894be17178a280496eed139871a6c930b6593055cb19e4d351370c7f8fe38f16c12f68ee1aa6ddd30e8fdd1ebb16df0e3f0d480b9c9b53ffa252cc6f20d1514adae316000b2368d3905324db205156ce94900197f36ace65a9792997b830ca962e4a48612d0d5dd73ac8206779ec50d7d221ac365d29a53e99805699e8c7f06cef9829d2977d5981cd1d5b53e59b3a75ca4d82f63a28347cab6011a44f114003baa4f415b36bec6f8f3bad2f2547e239487c45d52f612773eef6cc435a48e6ed4bb6424a3917b937b9af1f75e2158262403660dd90acff00ec8a48d297bec589e82afbc4301dc8171f3d2778c94f06afa13ece0f7c4e6dd2b977f453a7af23c10a19069dd3f10374b95464a27a4ad414ef673005c6a045b95e2ed7e2cec68b2ba8c7a282a1ee8a683e0a221d1588bf025059a4cf5a1bb8512249b80576c3834cb3cafc5d5a81bbccce827d8044a6e0bfc238c48063a40858fb44d63f327f2b01e7e03240713dd2883e31b14105ea37a8ae704704c61b5dd2cb34ddecdbbac152d30b0b99c304be92272db13124fcf5a85fd59849c812664ebba632290ea7739398b9d6ec44b4f45631dc0229380b82fc1dc364c70545280be999290284b730175df45dcf30deffeba027c4a08733074887e69b4f7c811a93636f06e9b0a86807c2dd5de2e870419ba798ee42a94922b601fe9daaa4fabdb0327aec31eb8ba3cd29da32de87f77648b543a12f9d445940ad17c3f44aa6e5d4bb0ffdb9f7562eb66da7d99db184d58bf732d9b56e251c1847aa052f30f27fd668ed1750d338f87a89bbb831e86871d091f7c22ff763c88d6c7180847110bbb9c47ea649f1abceb6f9cbcb93f9e4e61fa81b2e2556bff3e02be7aea1c9c3c73332b0694058d72d59ecbd53922b3d77d83c8eb6facba048aec7d33503da4b01bd24b42e911322510db8c567223fd1199d8f93c5643dad1977c2625243aeaa29a1917735bf184e29a7b5c12c9a929d43b79a30a7c86619a933d9a815303b5e6c65f0dc0432954d0a697edcf3d22eae5e74109b7437baf4cacd325343bd85519ac7589fccbab69559eade6ae0ddd1ef573613c21b26afd3e4de52bef2fa5f59137eaf583818e3224fde165dd8330273ea8a76f6ed278ac2861ec0f6437d573a3aa7e5a7f18fc52a31039d6742da0e188e82d0232c80b433447aca86fa0326eb744f69c4b23dc755454f380958a08a04d3e60980251018fb8fad7a7ca1a85a4c640949c304659d16f78bb7913825d611bc3a852bf0071867cef0087667ffb3ed25dd910ae354894e80be5508c8609562b54d94eb52f2fb427b0144f574ea7c53eb26acee4be4029965b1eb5b12bfc02f0c2a8ac72360adb41a7a564117b14611b6647358ed3ffa866c4f122ea9d2d8a22a501ee918c4755591dadd8243062b4042f6ec84517e1cd20170620309922b88c3a4ccaaf8cc83bcc1d34704fa74efccc6e5bb2cb61ed26e222666397355c20134fed4872e6f3cc66057ead2b28beaa9ea7741d99453b943f05ef48417738ab108d47064b030616c21ec3ed415a4837bef51ff3ca7bcab9c1681797492ebf60b4b61b16b386d50add4ea8ad1546a526d72f8814e8dc59dafb6a9133da22064ab3810d2375af3854ed055bec3bdb08d87f2dec66757d0c23aae5e5a040809ce35e89ff950c451cb0044ebc068ca538b7cf54270ec79b87cf83568a5fc639d5ab857d5c9222ee01b92fa89d27c13d037c9f1c4df538fa243a9d0f8a0a9b0ff9d20c4954ad50e04ddb79abee5c8d4bbfb0bc30360c5b14523c53a693d289a21989efa761de1bfc6227aadb5b7cfee0d98ad0aa87b7c6010e1448d2d9627d7301dcee4e1fb09c84041bf5c05501acc3426a5542ab99a64ac7d910474b078e67a1dd55349b0773ca3b03c1e2f5036f01fb388f824f1d8737e618b390f8bf4ff4d59cd27386814f360b9a203f0dba0fee9adf6bd7e2b9d5adedb6948b948c2724c1804496f307ec3fd59f67f69a44d373677d5dee66e33d5b447fe95cf2b63808079d62d941be0c76155b498feddb36fddf95b24444598bce32c8a879f1bea3356f4902d28d188e3bd27fa7454c01a83cee9592d78ef23f3ca8a472a50c428588ed77e81930848287c014667bb083ea17028357ca4a9dc6491c1f14fa53dcba00b9e935270348db07e36a3d1300b4230e3b6de0f6fe9593568a64e745c00639d5269090635f8b24c5c5c2f302b1b96415e9025bd215d36f67df61f622657f26f9bdc28ab67ecfe3d2c8d1e8e1ed2f95c567edb16625a14cae37d395a8e4240fc3751a6f082f906e093ba25a319c2444aa1f5e41264fc38119848718c6dc0ad0e55c660177212b43f262bb606ef073d202a1a10bbfc4d05b11a91e3db9a436c2a6d4b9b1b2626b8178b5a93ed6ccba4e7911b7d0823948fdf2eb8d4634df067a8ee52803a493b4cc587d7b95d4646b8576943e1004617e0d59462db654a052be024d6cdbd7d9ec21f0ef1931092c0b04c611957d3357aaf058aece6d1620a6e5dc715cb928331f6327cf2893c3a883bc50f1e2bf51a11eb58a5c4ab2377ea3ccc0cca29baab83f55a0c56792f2261e14846eba0459312bdf0b713c54e4a6d1ada034e043db5ebd49a9e9a30e12642bcd2265c1f033b3dc7499ba4e86026692378ee06ce0f364f96f9680dbf1c6dcb78640deec1f2a1092b3fe5358520530233eabf290d19258e053b94ac817a56f117f32b3a43793753d57a7a7832a5cb9dc2c554c318347ede1b0f58a48ce63d87b1b10de59e4c8c230aae5870fd050532454979e024bedf5ff63104d8525b6f162f29cbeb47dd2bc078bbd60589c98911d35af7a9c00ed25a848d904fca76df07c118989fc8c16361ae53328034b011ee5ef7f5ec2f6cda1ff163ad21425f31fa363ecb2bddcdcb2c2cc7787f5088f388753260f72de33b4b8b4940776ef015269b3eda0bee9fbcbd8fe31d721a4e91e85636970689596c2f72038eff7151727103e2c147e2a962f50e9cca129ce1f4a034de7a089f993769167acd1678d4322e829de27d4d9c2a912926a7e73368991f4d663751bd2535c39ac64e169e8a6679496bccd2c9230f79f04992a941b8d9ac7cec4a320554e49ce903dd5658133c68353fb4c0eb249217859f9d2a9597073a032c22fc275efb541d0c21175e03945715ce3dcae8e1a4ae181cd245939f00beb5a9ba36a63c0f36808e882da552b9afbe36d0a5a03ba2739bee83f486d3a67f2f1bd0b3a6ba0d2a89d01681679210933e2265fd900419a31d8e22d7595dc7c12b81ea44145a9ebbcb6337f78816d825d70d261120b8207c3a3ad564254efdaf83479b12ab124689da7a8f057278f2e932a65a2031f46e5159fa4edace1ae753d3f2d6a6516c1b1bbd93cfcc049be28849cfcf0f792d8b9b91da14fb9d86dc0638cf57aef16b6d8d0a40e306a2352c20a9b2627e233b5f5755ffe0d9d2afa4049617bd5c55b2419acde89132d42725f80fc5b8124fd1433d3c258906f09cf204d4a48c58b125ef91927a974eea68c8b29fbf642b58ab9dd3e61e980ba14edf4f45f31d1dd59cd3a358662c828ef6272de93f115f72d3b9c99432e3736f30736f88c42550a3f432d93e2cba634deec0c04e8e82148b0408614c1fcfd17df493e59f81d9af7febca1a4f893e39c356b2070c889c74c8cf3df609f7a9648a9b25c913fd580a33789dffd0047be933a33e8cbc35cc0a9045b016281b452cb54fe2af600e3bbfee899d4043becfe8f6ee7fb93a3813ec04cf772a105bb3efc4b6c316cbf717c8acfb77262aff281ae00044d4b652d8e8ffca639b916ec71d422d37e126efa1386bd51a7ceab5737a03af08ade481d189300e99c8180b7de993248be1b76cefa21e73e362cdfee4e05567c939081f8b2e9a66725df056008b179439146a271d701844e9fc9a631dcb8e47980005ef236260a69477c29241845255b2611cd6b9b5ba476088a1ece3a7d8ca1e9b15cc25baa01104454506e05412d0ba5bb9b14e2f8a888878bda9c7cb0c36bed9d22bb8cc81136f879c693858b3ba36b5235754eb5f4b2688f48025cde72db8c78397f6c04b8f2c01dd78e029057706e244ec0326e6f6362dc5f4bf14884bb03464c52069b55d64b76526484ad0a1645797192095503b7e9d7217d0724a921f4ebdefd2d0c1d9ba3420d20a0e5526ce6256f9453a02fbd1e7175a92ce6ddade762b0a584dd748c7094b65fc605e2ed157baacac7285cb6af39d77063f88cc81398474ebdf2ac509482fc38f349eedbed794257e0656bc277f5f57b748f67039d4bbb614d265fa1da03477a3e5c042def7d342a9d1462acff42e576a0353151464c6af959abd004faca6a412d65602bf41f08d6f5735ea2908250fca911f1e6a8a9ad54c4b8f3f5e6399ca34856518514ce77daba122e44d63ea574024d310e2a067ef56c51dd3ba96c9ab428b09d4a9c4ce6a0200a0e54a591288aa2bdc5c2434884940bc2c5bb71fd123647f9ecc5aa04d01139ae8e6d1340d5a776007fa0b889ec6d51067990f8a7ee1698be0f28f7c939be00472072e1a1d1045fbd69450a88c0f7e6aa5b222b3bcf3fff3ed38b46cf503230e687facb9fb899be2aa4cbab0c4fadf2b8daeac3edc61904b80c46f47e4a9d8663c3820b54b222397f2d9ce1020ffb648c88081b1dd75b656fdfd8786da7f8a3ff4fff835bfc93f06c20074e562ff0c8d5a68382440b14d4e8608fcbfe903a2d1e164e2603322db4b774f5826204e297edc4f62a74b6b2e76a88c19fa3dc7fcfb4e33fb039f254f2152cc759353d35b7e8b27a2d66bb7424c5c330f2c4666f17b0ec624302028b9dc3910128fa1ee65932785212de462a4a2da7b4cfd613b7d78719176664af0e594350c5c403972be92a4ba037976d2d4d0719f5a2a47ecae8357a8d47b35a9616333ec0dc26b6316e92beb19390ec223004a544054dfcc0f7d4ab9e42a2cd391c5ccb86723151ac2e5826108c696c8ce9cb248a257456490d045fa4f01a37cddefc5bf463bc91c2bfde1d595e1e700c1aacb09fa9874d7f95c4eb33cb542fa335d71735046296841a489332938fc76bae21ee8d1854ebb6e6586ac032d6bc9eb3a16798d9f60c070e87a467d831e26ed28cef70842ef9c5e1733c8983c639b4c2add2468a022a1462aca8377007fe0c7dc401c2b0299a0eb83553d1cc1fd2c17b7ef94fd6545805054023fca65465c7f3b1c1d4e799d0126dfc216dd8f9bf838409bb281c29ae68f8b1bf39efad6c80cb5d56b131ead66b0e760b056c80abddfc7607c89c97514cecf5189cad71b7ca9f9d71dbea8746ca14ad9a4891640a14799ee5d4691eebbb6910d58b3163235640468e8391540334f646118fd04c5c980346dbe512b2e3a513f77e3729ea5a327ea3d4188fd8ae9000aca83cfba5bde5ec99fcafb7092def5f0e83528046e480da12d1ef9adc30901cecc29afc39fe34be2f2d1e65dbb162236763d863a7b92718453a32147cb99383d18250ac12013b2137a6ae1264142c94abad14845e27b9b2eea4d6150ec76ae86683c99006ed47640ef2647ed0ef1a5c33b38dc82065b295be50a1cee8346b274defd4fe90cf6be3052d6ca2600044230f7c7aa768abc8214f02e5afb1d2b6f47897a677db69b7dbef3cfd685005091ead7c4432fca949c4d4008105674dec2664102096bbab666932041b2357d5bd82c9630614ddf166c122448b2a66f0b9b0412262999745aa8e9a217eb52f4c563058e775c275e8e25f1da01f28c524f3e5d0e016b5ebd796ee7d993476f5eb9b900b457368e30a8317262168c4007ef37d2204bf5a1803734db3f3c6fe81016c112c344b9eabe0a4e792ea9b6cef202dafe742e35f0cdc62be0492e45782e53b9bf88877013876289c338c1709c3884250ec7898670e2102c610827f830468d26e2c6b1aed08fb58713d5eb898c97121ee5672d8ccd7c35f3efee7adc3ff80ed10ffe43fa03df01fde03b4c73f81dd20e7e877487f07510702ed8869c26b0425d4ceeeb50a7a574699ad1a7c721c8047f377b0d782d32927b596c8fcc40f054f0c5924b26adc61f16cab6f31e8c26ca765e47df38a3949eac26384dc8c28795528652a104adcc55fad3da7595324a0aca28254e854fc252f4a2ad857626c1b8154d6d2397779fcd4ff1521c988e58555b8b666d8cbfee70499d01ab1a6b588535a8f04dd4586315d6408d6f52614dabb006158e85342c13bc6548a822f9a175203eec3ac81e9487d1071c077f10462a3b540f3eb396bbb0e0f5a4e7f565e120770ad2d1ccc04ef8484ac4d909c5a7383bcb181983629141c5c92593cff1f261b0d67e3adf8dc64063c7d204176c391efb2fd138f1df7f2951a67515a148529925a8af3a4c08581b48110208c638dbbbf159e70de23893699125a07d943303708a2c41bd298f2a5a691fe14e464e95c608d17a2abb5cdf4014769d80cc85f9bb8d06f2f992d29a6ea8038dd89b7504af5bf019bc5c4e48d0e3f76cdb94b46ab703afeb448623c4c7dddfb389a474b88137d3e5b90eb72ea801c7f0c78066f019a617ba08863f037a83ffd605657f0f3a5dca61ae09cab991a68fa790256b344233df43a04c0daf85e1a81f7eb4c04c7936d1f522d1589ffbf14d7f6fa3cbdb0c777f53af573b73217b2e024cfde5a08b1242d6cd261aa395a64723573ef351b8d5167c34f4962a7c2a1fe9b02fd4e063a10b3142cd0e1a0f1a75f186accba89f59a49bdb01a02f32e0e7de2361de0fff86c0731e808731965cbd5f0e4e4eb2f31887a4462f5ad068580f9870c7e48fc41cfdddf30bd566d46bb1190575975a0cc09c100bfeb6f88aa8ce9c21f5c048457ae02061f77e1c27f0924a2976250a222203d50963b8941ec076671b8bc00ad048accea233200c3fee07e3e5ad58f279bf0a2edb400f0620bffb63d7d6caa5abaab447aa95410bc2743c64dd609e3d72545dad897a6f7e1b3a1bce02fc2f3ca3fe037442d94cbb243ce723895a6290bb513b00d92324dd7ef6139bbefef6f9554330809c6f48f116c2f6212963309aa8f191a478eee941c0fe9bef1eb84fb905fb70e51591970f742fa206ca5db4c9a0b58f0ebdc950c23ffdd176e399e5cd3da1be4b5033a8d205f6d6db2c31c6b8ddfcde99b1309529dab56fd837546c2bfd6ee57638448bb308e49c1d96ee82334e23118ead56adefed6022c5a06a2fe8265b0bdd487257f267342eb16f5435688a5895a232d3ba0cb8f02bfe4b9770336e1c3e5b0910e1cca0cb115ef2aa342a43d479220f4a3bc0568223261866d49752616516900e11dcc640896a4932af0bae27bce3d2cc9dc7c4c15bbf98844c56aaa194f65254d7153d3ac43b5118106427496c0bd3f427b6e98cdea7c44402122659cf9e4d3a71c0a0c44bce5dea27ad80d22c2d2f6f610430238c396d6b8fff413587f09e4a85ecfc2d6b37bb89758ad1af8bf67d34abd4cff8a47319ee1d090f32abb1f4dab7c8cb8ee2e944af7442fc0317df00b9c5a719cc294058b6d3e0959ee1cc310d5a16fdae72f490c1a2159b11864f1080b5c6490f0152345204430217600048f45b932960dd640d409993a2072dab68281aca3fd518175135e79134e01f1b0ae80500d8ce38371cbc572794eb97dd4b33ee7e140374d8ae2ee9bb7f74f7b8b47671b3018808351471784fac3bfe53e717fa35579c9c5a977850234434623c255b47e6affc03dbe0784dd07beb74a24028f4b41cda02ab1c9240011f31ede84a720a95434c9e71fd31cbbbd4c9b4716975653795951d23fbac6b02da03283a8797d5c61c962e472f6c94738b175863682ef1fb6f788b5f90176ea189d0174f31433765244431bcd8cb3dfff0a547d64293cc82417fa9881da480b8db04b2dd2cf703edd017ff7f6d7f922b4d6b4060cd5bdd6c82dae60c565e14088f8d7a7e2846305e9f8b1703e71156698b99bf5daa8d462a58af2e92868e2546f79b90b9652c5546de60de207210834827bee7d32e8109def1a17a7033dc5d1f5a2a49dda4ec32a45d114cdcd0c4b8983471b9cf0f4755394bd765648023df73303c1d54cc31696a896f15b79901250337e566e8d76d417277d100f327d34ae2b0987b2619ef0e04382e8d0abd09bdb8a1b55055e86ea015f09ca81b74358de93443afcb347275f12328eaf809460e1128d5112f6c1bb78ba6e9f74ae04fc16c834b872177a2ec8a268ed4bd1bb02e591f4964049cbf810ec6b5688227ea7956006a6d47a0f33ca1bca7dbf30268f74bfd43ddca8d2c6d17028b948d9e7e8165626bbc5b9103efa80a30a2c2911f0cd978e382565996e012bc816101372a8db8dde0ffbec0e3d0e2d84f84dbd626b4d1ff71b69ec55160552ef64608c15b3dd7e6dbf5cb103153bfd92221fa20b34b22acfc1c8a7690480ac7d5dcf121e5808b58825153238ff5a0550a72072e5785f1ff1e4296b1ec28e182ae4281211f6c07af85ab1878a34ba39e85ce73c5807ca05a8cbc338ae934361e02b01adc65346b3b8ae96433b95a8cb3267f0f06af7a33e7c803d294511978b34e95e76bc796306816f867963cbd2feb23cde3dfec5d309d4e8459b1519c22da7256c11b789e584be0040ae8e55d6ef6fac607649fe5c3d15cb142d60778031175e1164dffbba601cacbf84021c4a310380e2aea32e26b6b751d72b44718c08ee55a9174f14aa28978377038952877d19471c634875a6a2d6521e2e0e3fe2ae84cc536fa0030bf25cb88841f9cbfc4254199d708b1b09c045b351443b4d50aaa71e34982b593c7f36d1b8e1c6ae5624d85660e6fd7e80a4b3a08807cb0f3beece6d7c8f28df1f86c19fd98a3267ee013d933edb7d698d94dee52dd3d18fefaad9468e844cfe52c75ee067451cf403c45b92dbedb71bcd592c82a7880aca84ec54c4d30fe8b27f67d6cfdc656bc86951b1e0d3e92a17dda3bb40545aa07b1519dbb86720d2099fe4f2e69c8d22fa2a8a30428872c308b8b1382bc3b8e2b541fc25d73fa06509a7e7509f57c843c56cf4ae71f7652929218e6783f7acb7e26c4292386eb15c5a3dceae456c49d77e456b19d5ab53313596e135a56037b276486814f1d402bed87e2af7e89065cc4ced3890e103bd712d5f5ffe555fa55e331501dc41c5ea96d55ed87e4521d9dfda319364b8f3cb3a67057c2c0d220e2bf64f8e46996c40b60a61400716f0e7cb443323a65754d6482d780bb8ed62505b890387b263873db188f370832a1ac65d5ebb145215ad5a82dfdf347cf09a05ff8837f88336769cd5617a9260f1a8080e64446e8920496677731778c2f7c9854500c68420cd33cb0807c94dd9b83de6a4bc88b8ce1a1a66c4fd72108fcd963445b642d230f3db29c5f085252e6c9a9df4f54e8107809d388fb98bad8be1039106fafdec8c6c6ddff10dc2405c3c0eca8cc63e882422456e962e4309da13e5b2928cdeb1bf817516a9d850cf9eacf9ec5e2108dc114ba08650c97c90a5f869b802239bec11d81e8e40c5f47b7a408b2db5c34a9ae969c680d1dc6e480bce5032010248b6120363267d0cd4ce68b160a4d924f0003a6ba1854d617911975c99f2cba3c5d9a96ea6fac94f505e982592a24726a070355a9237f5e087015651f09af564289410505b886c244b7cfba70661e836c685105aac76ec05004195a7624dd569376193766de4b59990e7555c7d8b64d9eb7d4c565de12909a6f8700e4745301543fab8208c75b3f88e7caba4b26333198e29172048695a2b7ef8d9cf4be40e6808dfdc40998cc5840d2aa763e45a2be891896c319b67ee783123929a7fa42f8a1fd04b6f05c40f731e1eaa7a4ec9a2f440aa43ee0241200ac4e8b32b3049c492a1af3f152668c6f51b501f4f420ab9fa6500701b2ac01e764629b46a69584c7223a2274ac08df52e87572152ff0ba7f653f723b1f939b3baa9b30f471eb57d40f368a6002f5c792c76e9711234e92e5638b9f1622cab69df7cf1c07e8eebadfda52f22fcaeb994bc1b045fa8e74766054b55ad2522385ae89053525a12bff04e6febf98434eb51404591038462f49ce36c271b4be222f1e7aabc94f9ac83628e39d0f57fa792ec11533f9eff7b84e3a06d26c6051bfb0118b6e4921b142224a083ce6a04b0d6b2ee5b3d13268e6c4a1ec5eafa92122fd7e2a0fd90a3bdf5052d37ea17eceb809de7a0a7305066fd9789ec09de7baea3f6afcac7ceccdefd326e80498e9cca5b0768e062ebbc3baaf7740f7ec5402fc81f45bf5019ec81f503a41bda1e557f34c24602024186cb88ddcccdbf4b57524416952e8abfd2134fb60fc42f2906c532379df9dbc179cdd4f1d503372b152df47c3975eb4e25049cc6a1e9d5a586112bc4f187cd174eea2638c7d2f3fe15bd00ca3ae5011b6a87ee0f789d0ae6ead1088a1f93a47311480b6d4067452049348d589848ac4c1b225972b64db7b34832ed4ec260abb59f79476dc84b16fb84ac2b789b0905757eb02937061b93248903a19e87cc4fd8e2ba92175d13f611d8cd6032082e4cf8da902b69b2f94d6e6e309e11b34ff14129316827ef91e7c6731f4d52d8f83e8f1e83ecbad22a84394f1c08b8db97d09bac907dc8ad8ba7dbe463e1e4ac30ff4c40472abcc790661968874405856de3e0705d184cd5860af5fff64d3401e5a6bb106f91797e2c6c5204caac241f416f5c3c505e6760a87cffdbabfd4e479cd52bf5b4e501a7f33d564125f6db2d7d5ccb32879988f63b3425a3f23d607c6a35131bda5dbc68cbd0325127683093ead55a1f217d9c8c036f622ac425a23bd4f8fbe45a54cedf6ce2ff17d96ca09bcdf28166b52f351358a7dae917f8ab92a95e21dc6b99d06d3a8cd7b0f3ccff7fbe43ac3406a26ae536fa89c7342061b6b0f6d56b438076257425e4cd8ee9f8e38e36ddd6f11bbf538ec13a18bda15822773994439090384242a8aa335a8494fba379080932d40f409a3814271e9ccf59207d04fc60b5a58c4a4e534918c4da20b735d4e403b938b3f1a4e33b90b01010007e5b8367effd6d5902a91582a83a5b409fee873e4a57e5438bfd555814e972d1439d468510068ec5558cf1a98e700707d8cb7a25bd035273a305e1b874b3af14fcf301f7c5ffd11ba203b725ca87697fff8cbd8fcada923d01ea52b01eb9be3f7752594a790982d9ac1ac9f4db1be26bb050d4bf5b8ab08ce6a14634027c62aca89875dcf2f6afc3301efd31d5bcf67cd2d20eb43797021771c75bd4f68c97c59d11c97505fe3bdbaf6a5be3394189c34c138d814cb633b0653d3bfc82040b1a7c64752e0460ddb14ac31d14e952cd79d5fb0ec08e61b8cf3883d23e7e09cdf78b3775c4957a3a8c3dd0310fd540dbe2d608315d8376c9f0a0c06fcd14a0a599321ed74d4be3011e0adb2c9fd0f021ce7ac59ec94c75581306c1528ee34a167c1a8045981ca1a4b5936c0dee4ebcd8439f473337cc8c15e1cd91b728953ed3aa8b195de9fae766ef7779722b1e7e5e8ecba222f7ee094484f27b355119f59e21057013688cb0cd4ea5bd9f59a405e37106681ef573622df1259dc76b45d1d61c1c1039728685a824418ce25e11d754b5f37b4b03f83e10f18ba7870ae97ef406fca058756fc0a9901809478d8a78f86a25c6f7e2e382c84fcc40bd0318296206d1d13b79c5d7ab38637433f675f906652f050ca516be5df64f63d43abf0cc8134241544e2acdf254cecfd13932fc923d668f413f0edcae21c72bac26f451f1bbe535c5e959bb2a0f6f1536f2ceed08032ffb4b2ffb93c3f3d101d17c5d3adbfffcacc984aff26695452b13c0334b4ae7eb8a265cd6cff9c10727297f0fe5ac222910cee1250160248604267a07da55ff8157837b66fb59ce59640c0001655a87e0a6a3efb16064a7f5ca9047a43e9405390781f39bc05c657eee75a9fae4aca0d35761745f3e0e812929506d8209e5efbbe8a55d7ac2f93175e3d5fcd54c5a57292f40702801a5df718ea85e31537c00e16423f35e45dc4711eaccf7fb8faccb050b62477c8e4165d354ea638f0bf61f04d47df732392798a870aa4bd6fdc71f3c61e3856ee1fe146525000407466816dde00deca08ecb9f74fc4b8ef95dfe0bff49dee4ac22378220e2e80dd9588ec02eb7961eecc2a92cf82e03bbf15dd8886bd7780798c606adc39f8edab245115e6bac18c263cc8f444f1f9439c0442567835a53a473289c8589178ac8b7e5f99d4a9c45b39663fab28bbd1ef93976f77f689dfe785ac3807f9c96c70bf5bbef5a5ef8469f7cad691cdf8726423986e56209f7845914814c16c7c2537ad6f83901b43a3947d6bcdb520b36f0261a405e9cc80b78a4d4548e58698addd602ae24248e6b84ca055ba3f2756cbd96cd5bcadb0595be1645d9236236a578d23ca176719d689155be1fc1036a24c2703b260738b05b04a6f7d95c103cfbd76b8552a0a64c277ba06b99ff4485be3f781b1b52ab9a2e1ec54e30ea9fa566e23c2b67d2468291cfd00d7e75a7a90fda82685c39eb71890d79b273872cdb82f5b42c10b163cf36871a50bdebce12b1e96207d9c434ed121b292105e37168ca979f473f53a27f211be0819f6c8bf0011bbf9625ee8866553a7c2d585c604af8ba2d169b3ee05352eb6f9b8b7a7149603a2639f621bcd057cd6fe37b641e781a2e013db14dac3f90c49fc4a0a8c57e2f9774b7cb968c885ed56e39ec640fe41b230f20e730606c4fd71ac8a69ae3fb996e524940525463525d2cb719341d2fb9012e00a17309a43bc039b669e6b3195f6b50f4e108d19cdb7544daadbe38592af0d60df72b2da0630142f7e02bf488729a24252efec5534c67b1f44c3f2a623aa65c8487308c327d8ac158db2b0174a3c7bd0d20e1a9be6462c19e0c2a8c28547bd3bf79067f8033d6c48809f55a11472da2d66515d4b6a24db4baf1501c3787aa154343fe0c3c0660e1a8981ddea2e39020c0a21e998388828034a9f8ef77fe8c46d030a13dd4ddd7edc246a40f3892b80018dbd08590400c964ad73a1c8c24a0cc06d5993a560108e7ce642659d27a0187cc2733c2ccece4895cdfd948415ff1391c3913d2aa7d104d748c5750f673a7ef313288799d09c9ba9806ecb6faf50c811a81dc96db90b0622581c72b1505d6041b6d0e597f1dbb83e3515234a11726500452b70b943300b7258ed1c16a20229e80a3cb815590e1e8380db9644f8a9dec293a02b9036b83956d5f810868d0ebdea1d683c171148142d28682088db1874b05b17ac6012ad84ed1f02835707de104702b405a4898501ae0a4d70f9ec90b3e096b6255d0d8a022ff0195a0ec6816c823a8d97e1298ed2d10ff61a0261ac3728c6561aec0df914fae10e2ef9a8182348bfcda1f3ebc8be14ca870831a34eacf9e274af6c37322bd9611f7913675468c2e169adcb40c44c61a6ad597ea04a314990d422016a5d768d5e27f94421acbd29e23be3865f3539076b070964fbf2b628189d136531e363735cb2d06115d89e9b119b291614c803fad7ca93541048284b7332302031203130066b7048b5d91f1f0ed34534ea65165ac0c2f60e3eafc78756f3170ec667f541a9b34c26d676b5a8eb4f6ed8304c1415d12b13f241adcb25aa0cb289efe3fbbbbbbbbbb794292519d408050aa308bff3dbf6f3ddd3cee1faeeb7ce317e676748263d89e153173992e536f585489f0c7e97e6bb9711baf404b5ba0e8b116cc9f300789fef2ee0118f17f008003e3048a03420928e2bce1add331a305fd00405057d018f82c0f45c118687892b7c78809808031eb182ac20f38524d0136118863d3ced44d0585bddb7c8a5ce5ee1c303f4ed0478d433e60b49a09f20aba8816cd904c5374197abebbafaffe3fadb7deb7fc892de9f56ab146dd93dd0575b76ef335b41412eb289dfa0672b4014f806bd0fcb964140411f7e8f018f82ecedbea1008f7a6cb38deebd9ea206f2fff9d909b0086969e3e8feed6c127c4cc5d731d11b1464fcfaa32d9d6eed7e8aa5f1eb8700a85da647dc827aea07914bd532f9e5f99087e7390d0f006cc9d365c0239e09c2286a169a137c21e9f32cb2a70ff9d8b2c9cc37c11f5b3add9f1fc95abfc847b25c1a3ffc4a963f5a26bf403f410f4496f402b9be6cddd1f5a57847d797db1d6d59dfe7475bd66f7d9103cd1b443619e1caea32f9ede9f9a20622e7fd219bf8ed794603a2c0b7e75b306cd9f3ac0fdf875c62f2dbf3e13715e0518f9d6ca3cd80472c3bd946d9ddee79c82b4024ef6eb3460aaaf882884c1fe2335f47965634dd2bbe6fbae17b8de60bc98e2cb72526bfe187ef4d2ec364d8045c02ae6229380a8682c7f013ec049380a978042c869be030cc042fc160f80b2bc15eb80b4f31174e8291e02d2cc547b011ac858b60227808cec258f80a0bc15658041c020e82ab30100c02fe81a9f007d807ee81a3d803cc03efc053580796c2393014e3c051180a3ff113be816d609893931a68e8000736d0a4811964608a21034d9860e0021658b2545600060abc3001251288000492b8d0c20390b0b08203948e18492ad200062c80c81005085121850404018284c2d18f138c6e1102660cbd0240820ca13108e887a708e7acd1fd0eb9e99093457e5bbf26598a572cc78e7234740dedc49d6050ee011556db94d0c645c8dd7d9b427b8f02730fabb8fe239437d7dd59bcc32d67398ee35ea873704cab14142a2980f2b4c387c8aa7a0af3a1e0d2272da1194a29a594524ae998db426e69bf2d97b4a5cd9aa5350543b08a8205c5ed1f297f4b46a1cee1cf330908915bdd8227653e2a9e8c114f101b8299189c2a5638c59d31385f6e77b75ae39119f61f6e4bf14eb7c19bcd5af2fa394383304b5eee55d4dd9d16b9eaee464116ce30a794524a9fb16826da82d60c162491c5925616a3100a7c3062cc82bdc85577777b6885aa074ba69972cde62c84494341a74794f265b20d7b1cd4fd925d218df8ddfbd674b36dcb9c6e463217ee94316f31777676767674befaeb0ca1df9aeca9f5673195ccb22cab9f81473a96bf54da3976ec0cc35fdc333743bcbb43f29737370077aeb93203b3727fee8cc160d7f3af9ea166bc4c57f1adfefca55aa6aa25bd3a542830eb4bf17b7eb60e9eafdfb3f3fc75a8da92c979762c93df9def3e872cb9ef6cce3bb9c212a26899dc32f9f59e9196e892674bbe3bef9ff3a5f839d6b34c2e5a26bf3a5f6fb6639774deed12fd7ad9f2a5d6a9ea17f5f68997a9bbdb19a8f71ebf14cf8bef2052f6bc75e4a4e4e689a414cf33cfe790b3b75244c17bba7d486a95877cead2715fe4e0b77d22ab65a9ae18b6e14e97d2267ea91377123be78af3982950934dce5397220554923205642528252825a82addd675d7bdebb44be9d9bed4c29e72b9b72ea476a97feb68d7415501bdeba06854e720ed292cf7aeebc08e82e166594ad7bd3d65a8ae84f1d9830eba1429307ca8e694b28f4bf1bc31bd75f7065a96027ee73d8bfc725e03c19d30f41d29938dd7755dd7755234ff422952a44ce134293bcc43c5a7a9b4b99467e7bd30d498fd35abb1465fa9cd071e69143cfa9ec94ea3d44aa3561ab5d228bfb94b200d29556afa1ddaa5cd43ba3d48755a47b3de926f7bf0359a2951aa44a912a56f965ad3b277eddd0dddba5fe336fed9a6719bcb3a5a4fb7a75fd2c9a6f5e5b4fa287dd7745ed340cb5c6caf81efb4bb0d6d73fd3b9ff6214bbefecc858f6bd49d9d52d9c079b76d039bbf53ea9766b3ef21bf6f91307448f143d2dbe179373bceb65cf279de671bcfce33b9a3037ea8037ef6dee77c240c92f6d067435b4e364a6d749ae70b7fee29535571fb793dadfbb9399e29a6dd804793e767e8ee93e51e8630582c31ddc3e17fccfa982c99eaf6c3b0fdf197dc3a1cfef7cc75675de696d96be4120fc77161b807f71a8fc99a87e7b92fc3efcefe6bb74c5d8696a92f57dbfba16a37cf33cf7324e93acc377c26dd96df3fc8715c3f8769f7d2e733ed79da793e746de7598c8f85c1f9fbc0e07ec973b87f67313e160cc330fc782c8b611b5998cbbd0622f17cf790dab3c89ce7c8cc7b1e9e1dbb8921b3c81c5a0ec5708fccc1efef25df05c3efc1f7380c3f8e7b16b3e4a357ac5f45eeb307fa340e1fccf9b230fc1ada72c947590cf76016c3622853b1989ed81755eedfb9260e15d425ba734d11d6dc385b8600e7cdfdaef659d5ddaea82e8e3bd75cc1be48735f77aef962cbfdc2ea7a973f6acb79afebba672e0b9f9b97fb8cb39323c3f73cce9d7ba5ecddfb384ee378bec9108d97bef73eb3655fef756cd9f7d3e1b12553bbcdb277271a9c645c598397f599fa6699c650dc237ba752396d48f5af1c674b8ebaf53bcd32f5d5ec979f65ea9b71597582843f5d477b96b3defbd72ccbb867284ed34ad6d70f7340242dfcd0f96bc9b23c9e69cc93fd92e6992d63e83afe3c8f9cf7fbbe102a7c6e87ec5e8704bfc99ecfc83a43722af52b472483b49f97f33887bd1c29dcc3abb63db7b47df6dcc73d9374fb9c6732c706691f7ecdbe86b607f4ea673d29de77af24857bcca32e4adbb66ddbec46af965996c236aad83b52d039996ad967951d0e907e6559966559f6d5ca247b18b25ff27511877e9ff77ad1c9437bb6dfafd710447ea1d7c8da48a51f885b8b0077b363bfb26f30058f92e6f2d3d0b29f600af5f935ae1c596ed55908fff8c13d7cf4eb47bfb24fc241cc4a1a45d894e2d5d17d66857aa832b50ea20d48eb68f9e8ac326c6b62a494bed6eabeb6ba4ed3344deb28a52dfab54529d5b8ad07868e485ba310a594d21f8878608d676799673268a78ee6367b0d2ecdfc156f3624b62d37a8497343993427809ac20a96860a0c6665850676850d6fb258716171422aa0d694bce50bd455228beb7d6253a0aecf572b18ac460105450e5b669cf04c0e59c2138453447963a8784f84448043c5ea12e10d57a95b5ceeebf626bb409c31306eeeced7f758d0618a0e4f5c12254b17f87cde8b41039fcfb7a454b95f6252a22ef73cc57198cbbd77010c3069c2811828930c1f4f1e337c3c79b87ebee7229b6d00c2819f7cb47384e3c7397c5e0d3a9c8003028ca03841608aeb841d5c70329a9261041678f8825ca30b5b40999a461e88c109025152382020024e6f6c10327a9061841b83130b3e04b946a14f8226064d86119038c1e63c41c8ea10e38bda15c5583f40850950bff20f2060010031278d2a4fcc9e1184132120c1f421115059f94630fb258498e9255c69024b98e943599898fd6a1a6289d92f22949cb0033027c800be70820c3314a1e4842dae7ec8f8720299174eb0d20038013256dca4a505178cfe9da6121b0093b800db00078c68c1694e232f2e6c91c4850e802e6c41c31138a4be1bf5b728b93bb8babab29af3870c2e325e985302e00bf78d13380129dec020808492bbc5d5d555d59c3f642421e3277824812064bc508217ae15db004ea0045673ce9ff3878c1b222023891686388d3feb4522c66893ccf98027609221b027a00b52c0c6a76f24b33b4116b87c41e307b5a080ababab13627c90eb7ffe876c82f1f7436e89f1133c7a800e313e099a24432643015d4033279f10e35d64bd1e47f95c647691c4f81876f68ca9af367571fa24272f6ad4243929d17924bc0c285640426cc0f4bcfe9e249f4108c878193fc10890f0245829649052905f8a00430493258660224b18242dc4e925340186c53cf9048a93d116374016242652fc73ffa40d2aa25d19d987a2013422dfc9c89216ea86d1085c2fc59b399548717547570adb1277b44d72aeae14d527e3eb7b40bcc54be05e0619343ecce34f06192401125ec66741c09b2c329e849f6011edca88fca2e62d6e0012ec10323e68b4494e46ff594e2093850c519613888c6c4b1891f649ce9511d40da3ff094260fe9061a520c1f4a126276ad3134fff4fb427db930d0a3926164b801343f185641ddf13fa186356b8428cf142ae2f6acf6b065988f1317e8248845ec84611baa2f8418a8fcaec1933aa3e50021f4c30062926ce9e41e653fa22ceca656270baae28ea73f55d3628c8bcba3f3f43d95dd73bdd1fd798c5e32a4cc437924db00ec4216224e74de104dff8aef746b2890c4d46b8e3d30083c16e593f08c89c778ea4c7e96f24eb33d8a4fe8f9d61b425df9ff7abab916430014eb73e106fe919dcf396dee1430760739e102385f9c51da3a8fcc31d7fec0c30ae8b8a6f6b1c5a130aa4a420872aa0cee06045942ba0a0794af3048b1b54f0a40dff1e1fe10ea5c87f236c445a1ad82864b202d8fff4a12450cd1792d5e99f7cf227c80027a3ffa226cdb0c049162da081c99a0ec438b081e9434d2e6862a38117cc00031966bf5e5b7c211932cd7ebdaca0c4e00bc9f069368ec6c15cccc6517f360e1930696af364170cb8de9b2f7087255f97fd197c21592f107ea8840616a81fbeabde26180c06bbe1d77769f1f15803276e6a601b30b941057000c3ec576dea8202b35f4d39d0c10b24bc8c09906065d8e925ec40026f944c2f81791081e92594c03d80c0f4124aa8ef0326be31f0adefc5179444e8637c50fdbe7c83aa7541c8c6b04e77de1f3c8081d0c2ec19f567cf080212382ccc9ed13384b0c2101c4004a538478a60e48b24be2a026b800d0cb86101d3877ce8c94764fa50d3d310280a8822040715a052c821015282e800640ad20e5f48868fc2ec576879f88e66bfaa07d80a1ca27db551067882f68c1e68dff081278eee3f307ec88469a43282364a90c880888b1b31b0fac107587cf0032c5e50890281c840b8c240987168603857380854515fc24051c1ac8008c70f6d75b9602e1896846ec2b0cae76a3dff000a71c10044faf901f249a2c4ca1504830044f2aeeb3d6fce39adb65042e25ae3f280e7fa09e4720131100cc4ecd716e0102020170c881449e38afa78f2e05620df7e51d7aa4d6cfd8ba8dc51c120daf509c310a8897647201fb2098f2ed2bbecf3ec22fbf20bc0212e988b8deb19e672b948202ab8ccb85c3504e1bbdee33820927743d2e97a95641b660d8e9ffac5c1d8b8a0e8c7acb2cfcf45a05f48f254119291983578cbacc17d516f7181163b7cecf8022c42beb52409b32469a9803cfe8c50216eff3f860f34a47e45020a6b481211dd200a47528ab42200faf0590d38e487570022b9a07ec81b34a68c23f9a2f1aa568e3421f27539ddf1475bd44a44fac5403f3ec3c6f1d5af3a3ea70187b860684024205085d10a618367435494f7932421fa86faf6c31af2162a5355be7098d0325569134c209f7b86b509d6724c6e38d27e7557be90fc792cd2a0797a7a7a7a82e60a2b9ec22feb037d393ed0f399f05dcf558029b8dee739056090fa3eb60cbf8ea1eb1b8acb07c84abd6572c31f5bc280a571c0214a7be31775e3f0ef72ad70461cffe7cbfab35fe3f84bf581bea1c020f5812ce5eb01b9a4defe9073d618c9b229cbd7a5fef85e4be11c668d59450a5a8a37b90a71c6a0acee8c41a5e15e0077c6a0b25cde32797097731d35fc93cf3fed4c010a5a07b0c83f797581bea849f24918f94129340c765dff24e72a0e0c66144534fa7f92bfdc9fd7e2febcd75f6590a1660dee95a088dbbbbe5c32de9ff77936030e01fa9f67d8eba9f879a09fe71ec8fbf138767f60b0ebb2526fa70f8d4ed7eb215a8de3e7c3e732e010d7573220d228feabe5bdd74458b162a5d622841042082d57ae84a11107c00206692c588ef0417e597f7cce92250ca5740c0106d98618628b0944804128114420a1a30830c8564411ae9f26905f863f3e6b09bf3e6b0183845fb584e348924f32e182c308238c98ba710418841e714497024849498da317026cd9b2651c9518001248d4fa2589246a0553002e6090e6c2651c9720c01418a4a7a6981840972eb586793289cad10b3884f6abbdd4dac4901260904d0925c4e0f80206a15fbe8c60080c1864030386ea9b38cafaaeffa177a9fe587fb4bc041864fc6a4ba9fff13d1739fb95544564d7ffd427a70f3951c924116c4f7c2139126172c3afb684e18665d30d9b9072c140cc0ba2d8b0a11256d7388ee317b58b2c45301f8fad77daaff15b0a449ae57667bfca25adebf341ef22b7cb2e0085fc3cedd768cb25ae672dc021a3653dc740a4f067bf40f0c748aa1044b2d68043c67e39dd16804840545a0a3caacf532ed0778e6aa57e7cd796cf358eb7becf173567010e01fafa1cc50210c94505e622451ae40dd8931792345e2808aebe100d9de3c7723f92b389d580483a6251e05c1114227ed77d3fab25b4237c56bfc446a2866a4021a1dd796e025cd2baddb356000e19994ae708ff28e49e550022751f960c75b9e73ee4beab3589299d637ceec78ffb911cfbc57d5208c4f1f9c7bfd1af1ebd96e2cb7956019882f85d7301913c234e889dd5797fc602145203dded5dbba7707727400d696c18b9bbbb5301b8bbd3f7a7eeeeeeeeee3568943063e8150012a2b290e1e446652114c3923f02005c6310d04f8b61184579a3fadddccccccc50edd4dd6e60347bf271f2eeeeeea69dc1bc7be0bdbbfb13be32ea1244bf7ecf7dead2c409ec528b024f71825a75b3233c889bffebba66c275d2c8d69a3c0e70fb7fa609db77100a535c1fd7a34ebd8ddc7c48f4219f94320d6953bf660dedab66cb2543dcc296b26f82437c8adb96b5adbd7aad5eabd70de6990ddadd9d4b4089dcdd99527fda9957d143d5fd623d50b933b35de2f7f777221648e6d4dda953cf9cc875e0a33e1dc028ca66d485bf7a7bbbb77b7bd7ee2e5846ccccb39d703365be3c46737233659ea23ed7daea1c1c97d59d8ca4b5daa5189cecb77d4981f48bb3cad5aa55ad56ad56ad562eab97ba208a991be34e2da2686962ea10c9279dbae46f59ab5ee589477f0acdda3d757f1d469ee7b1ad39a4f65e05a957eb5679a35bdd3c12f6655fa51ea576726449996edcf7e5e8463da7996f115f95457d72ef479a10e76cb5a28859058da2bcd16c1c253ff58b76fe149220eab25df2d75ceb489847c4a3465e05bd73b7644959d3b6efbb6955805a6ca393b688ed6abcad737447118d9a71308802edd79367d4eee4536614e58d68e3e06f328a68b4350eb6e1a499bf98f4abb556ee312ff7d07e7ec73dfc27f760eee13f33ee9165b624e246a6c47ee6fee95b20b6513772822db651dfc9d108d19fb3ecb7faadfa6365655fb32ccb32cf4aa79b59ef2c08b7e2595276779f4f1ff851888cc2cf71a7392487da9d05282b4f61f4d93907c05fe437fa357d748ee9a35f73fb283f6d46bc751fffe87c10f5ab3f298cf8424c02f730621bfdcdb6886df42731f1549eba3b8bdb716eff0f1f9f2522f248a51b88d4969488d5fada3df7dcf3beafe71df765a455d75c129e7badf51dc8c893c8ef69a05767daea1c1b33f3463e7d4cbd66599671ec7d4e3265a619a5b452a12e81c71e90911bc4ec69307d164b21568b0564e489e8af791bc8d6481471fb6f33928408dbbe8b6f1b78a4912f9a7df9da2865ca9bb731d37206db687eb18d242344feb9652a64c1162d496e5fffb2e9ba5721fcce551a0db6efef7ef28c9eba3089977e9437a219acfb2e2091ce72166e2b296757cbb8bed4961ddbe027d2af198b8273398ab7bbb18d2423c4b6a5538def234f88e50ebaa35f3dd4e5cbe9c6e5c7628d97daef0302a45f45260fa49aa484c86ab59afe6b878f7929a5f4a3dee3752460b7a43b3e165c8e6dd9b1793e99f3fe265b4cbdaa4a982c4cc0ae9753bfaf92b3c756bfeffecb79aa55ef88136206e8ce34d3721d3be4ecf1b18dc9232704d26090f05bb3eab9887e52696e4cca8c83d93b8f288a3c3c2d761eeadff7f5082fae01ee8c1d417577b0720f70a7163ab8b95efd66e5af55c7ced717278fbe546b758ba7d6ea461ad8323225825f8e77032b4fada0906a677daf6bd7be5d4bda3c1fd07295b89c6b2e876a72ccd807ac5c36c0ec21b20da21b3b260feff987660f16dbe0cf441d3bcfff9a3c729ecb183cd7eb9c073b5b64d6f83ad2c90d0a42afcef7d5b1a5935a3f8714678dfa21c9fac8b1234b9d5b5fe41e248b7be84c1bf5b9f2a8afddcc4edaa10dde3c72833863476ce1fbda72fb69c48c80ddfe1b39ef7f270f1ed9a675fc71df879f06a2d0ca21f97edf7cd25f4767038fa6cef745fde9b8fb83fe448d187c1999125b6e8fec20ea7cc9e41928c47372de13c9923275f1fb8a39ae33bfebfe3d8f5f397adf75deede69c95ab5ccdb22ca339eda501c2ca2d5fb715ae0004566e27e1857f1ec76005bd7224f8917c67eb086bf53ccfb6c2d7ed57e7680d3c9aa1ad96d69ffe959cce711bb771e577aecccc1917021fc6f8a0e5f6d3b0baf433f668f6f3c596bb3fb7cd71092485ea97e345aa41baf767d92351886507a45fb3bd90f43cf2a3fc7964077e5ff0eb9608ddee6f83471dad9347b67152c4caf5dd846496f68b553392e66045d4505edceeceda326b3db05764f298f73233336576a64c9b9bde0956f970264acb9d7167cc03702ee52e9d6e0a6466cf1994829fb94062e0df2db69ed8233b88b585b4a5ecee45a8621e7013f3409a17fbe41edc23bb947bd02fe9cfabab9b01fa6d97e8f7276911fbf94814f7c8183103f496db659ed4439ad95209d7e725b73e25cb24939d69486d505f5abb9f52eb449588180f70be180f6e5a0b1ee210b1580b1eda2ccd9f5e8c072a77e7ce180fb05b32b94c0605b9d3964e905c5ee29f973e1581f46b7ed50df4fb492350c4a5a6975f1bfd41a45f73b20a8018a3050f4f776671a7163b4cdd233b88ec939bd2b613c92d9708ddfe48183f91c631d93ae1662204a1e596b30d93ce51f253ac4a955b7f49251285ea4d75254448a57e552447a01085b02da2767e977e52448a44edd76a89946cd9d6536714e58db81ddedc199bd2c575dd199b72e6c2d039e87346945221a1b149a17ed54f7a224e07d2afacb511d1d6511f48eb98464dce3b8b1411d592c6ad42b78e258ba3b41a787636a035faeff0f7b1e3f53476f828b3e3bad08b06d10e1f3b5e698c981167bfbe97bf0f1888e58b5968ccc8fa05c169d47893d7c4be88a305ec8d6b9f55b5b9d9f398eb0f84a79a1b9da39c6588ecf0f701c45f85244430487f9d53ebe7f61f9d8306123ffd1f622f2d31f711366249c3893a073f0d4a72ab5f3e260521d2ef17ea1c995b7f09653dd8fc5f54b4c61691b7bc0bb4c21262f6e5fca0fa538b1faa6eb9fd9742165497faeb67fd9a47acc4f2753d0908b15b2faad5ea9978295d13838abae49d311ca06ed7bd17923e5597ab559b3d754461acb68182ded3bccf67d0eb7cd0ef74546060c70abbeec3173b9d77215df83b3fc390a9fcf6f56c3d5f54d4f8530c9a45cdd5719b3eefbf017db70101f53c6d7dd05772bb192804e869bf7a5c43ba77b968ed868cb674bae3cf061e8d3f564ae4becaeaba770d19bfabaeb1eb44160c1106d073eff9903eef65a1166e9ce772813e3e3961a8532b4fcfc79307773da1d60f50d0e802c0081f4f1ee3d7e4e76518e1d68713f4bd7240fae560678b3807c0a9e2fa5dab6dc7cbcd9b2b3cfa849627ac1c09cd1afe48fa897bfa5f1124382821e9425f6a7377af6457926b7d4ad2d884268f6a51e8dbf6e5002188d9912188e5acba3346c68bebe010d636d508cd1abed1a8a25c3861e6ceeb4415cb89353c7bcc3ba74c9922d2d7a078ca8d1bfd32b234fa7583b6a51b11229502c9284b6afbdeeccb87fce9b29957bffccbd7ab73549e42a507e7f6efbce7f5c7200336f0ee7c3f4f1e52509b118b89c32428b13f64c2f4e3878f1f3945dd8e8e9ef7929ec47e4f090c3b7610edf8b4d7d1f9ad75f4bc8ece7b3a64120ea2ce6f4a3a16090d1a3c3c3c2fc443d2e0798eeaec7cdb595520d22fde21e9d7af9dfff7217f1cc4fe6c7ce7cb23c5fa1ef2460fb196b048253de4cfffe2bbf8c44afae56d93f4cb5f4904e20e066846443e24de1cb2f451ce2ecae9c565a26935dd6cfc1af34c4364048de85f12f5d684379f046edc496075dda96d9a25e1402c7764ddcfb7edab5fd967ccbdff111f1441d23988f4cb9f23897ac89fe8466681a8d02fa771fd29597e3f8c5ce1db05ad7ae051239eb21969618d4234ee342a7d9439c3a60dc3bc8873e7d73aa8113562a3f9bc058a18383726e64d8e77bfce516acf4bdafb7bc9e4d9926ba498d9b2da5bc4945bb6c03cc5be98b93125b6dc525462cdd717026326070a0c55f60c66cdf5a3ee2b3378f4dcc665da338844ff6b507b9647b30cf4ef7bcaf241ccbe9bc1ef12b573a9233f8dc1ec83824c9bca86cc548ccc192aee8c919972ef8c912973678c8c955b7e779281e27277c6c88491400960555e783933c59c5ec65c365e4ca7ec858a0735e9a495bbc0e9c20277af991b2cbaace972a6b984b9fcdb38b94c5d7e3a29fda6224bd59f6011263434d5d0c59f360e3a85c0f1669ccf0b24aa6ee803d695573772ba13e50b78b3dfc4bcc499617e9725ff18dcca30c29d6f834ecd54993973009979fad4f2c58d37f3063abb162b2f31f0c2a6076ff2e46f1e60d6e8f741e35b6e5a30885355254cb9e3fa38c0ec127559fdba71a364cd8fd50576cbd725722e949ec4ba8c897569824b17b12e577ec08229e28c4d85b9e577bbcc9db1292db76cdd3955e5ced814d4fdee8c718973678c4b17b7bb33c6250657e7ce1897344c5ea6625eb4545541c1e5f772388a58efacaa52e6f28b1231a688aa5b8a4350c586f89273a4066239d514f1772aa2f6f396f452f76eaae648c94894c85f4e35ae05669b7e06a288e50bc12f5b3be80e74dbe13a94c48f5f69eb84a472be642c56dcc635ac4d29ab4dae83d5433dde6ae1dc762bce008b98256322fb233460f1c7fce517d1ec0322dffa6ddcf3c3d0ed0eba611ad7c90cd05b7214b51cd5af7ea91ccf6680de1cf185385bb646edd35104830ff5535be50f83eb602a3dd46fc54d6679aae596a368c052dcfe92a3b42f95de8f86ebd926a57dd59875278842298aa278b35aa915a256d50fb19d54f2a1fed9af7e2c44ab27a4236dc456bf9ad5979b68c8517b10f9521f45241014c62be56d3603d47e22dd3eea6eff481bb1a43487261a92284112c4d484f3596851e50b37c1be6fa33c889fc8f4ee48a2a473d02fd2affe56a15fe29de011102356b45ad56b832920e0eaea2ac8dfe9badde805e2462c5b2d373749bf8c5821f2df90548424222415a1bc71bd230c785ed326b6fe456993a65bbf74526de97493a2446627ca2dc52bfb67a077697c1ad767a077a9ea4645e3456c8828979999e7a458c28470be1a6491658a9e3b635966a559181424bbfed499c892a5b344dd9925875816d81b2fbcb9e6967ce76f60b69d32ce51615877c6b008f10dc352e5ce1816a886e2f142c8db8877c6ae6071f937d6e1ca993b6357c6dc9215bb02e6f6dc19bb62e5b250cd6a7665ca2d67ec0ad48573cb2fee3a6de69c7332c78450734b3a634250111322cc6559b9edbaeee79c5b1cb1dcae57f7eebdcbd151249d43ebba2974fb32a1eb5d673d0e737240a1d7776408bedcbf33164498ebf9a7b981dd19ab012c460335b4ab9d974c69f5dcf33ccf067dbfe47dffd791e5d674b7ae7b8e74ba1bc9e44eb4d9e04dde98ebaa53df7c3233735bb9a68d34eefc8d2748d2fbd18ffcfad67a3b92deea75d5eb98ab4c3fcb344d73ea1e531c3cdf4c6c8d7d294967bd1bf9972fe515961069d72c1337762d394776107b6e0398badc6728c872c93b6366e298e9e2beee8c51b1e69ea9add8ad2f565175ebb3b83c5d4eab46a8c452d4de9b60d07cbed3befaa5954c5e5facb5fe6f5ed3e53ea3fdcaa4baa7650d1a38040cc2d92d33d2de9b46ba88224b038d60a0a9b33574c91a07c76596b32cdf48a6d618adfaa494b96e4f191fe1f1cf6d522249a6550b6c5a48926407cfab5cc69dc120daadef4c3302b08dec29f36c02b08d396f30c9df86c1a3264dfc8fb29f1959e419fd8ce426daa55913ce8ef8294991a653c655072a2a2a3161f8cb15a536dca60d17564a5cb4b142454525268c18aa8fa7f09489a5a1286da2dd2ec3f4193c9ada98398629ad95d2ef316366a5aa52019c5b0addae42b3e6ce2a15bcb9fd2f3bdaa2fe5983fc6c2002b10ac4192bc2ea3216e28c1591e6aa0084d5af241b88a5d09c16695efe1ac476dead32397bccdb3acc343cb4294204b1553f5b7edff748beffbe57fabe36ce73fbe6b7f14010046d50f84be0fb87e0fb83ef4ef723cbed7e4df7bbdb7b2049fbf5719f7524935f6e23cb99e66675caabf786b719c0f38e34214e27e60078b3bdd958b0b811228b1051ee5e33216075ea8db309bca41ec486f88199993ab5a26c9899d63365dcddc35899aad533d63e762b312b54a8bca41dc4ac3cc54410e7b2fa1504212045fdfa51a408f5fea0f4c80e44345764f5ab7f10bde378d3cbe9de7e4fe2f789ee7df3bbdfd3ef75c8ef7edf7f761c82588e627fbf88741451ea5ecae77d8814e91cdb774fcf33f88dcf52c1898f3421f27f3f3f3b3b28f0fdb76d7b8e2cbfcbfd17f23c52f83cef743fb2749a3576749072c49fe0f7daeb90e5763f3248b441729e7ece677c190cf28164f7dc17b9d7711be55a60a9a8c47018314c4505859a1fbca042e57a394bbe264b26e7366ca5c45c709b32b5d68a8031da679437ae19b97d5c35aeb5d6cd2e801f8a27342b460afeae819daa674188de74fa755689dbc71bdd6cd6ad27138ca2bc1157cda93b6721e84186c70e276974e4a8c19d666e00a79eb97b1038d2dc308af2ed052033007777777777a79eb9137507a2efa8144d588441eb148d0c000000482315002020140c084563d15816067a186c1f14800e81944e664c9a89a34910c4288a310821630c200610028600ccd010a8036fd63b521ba70b14967a966114d5e9da462d56cd8e3f24cc0b9a32cebb4787e9fcbf25acf0230e30eb511af4a7d11133cfaf463a521bd30351810635143f93ed8f299390e745f033b6e1637194ba8a6c6b009b644bcd5498e6635f7491d20138589e54708a0f6b83ee13dcf9222bf5df7f5126d90c057a409305ca6004ec46f811bc5de190c8bcb60f07183782ca358c7f3608ea2bf868e81cdea64dc196a20575e0d890f28c48205c57600e92e8cb32d9d8fbadb73344383cd9749474d008756c55c73230c79774f4c8ce23adce8d532d9633257e992de36d1af60df2a3f52e1f59ac5919354cd41c36d1f6921886a511040a9b943093766e0c43ceffa661c06c873a1be559276d2c8a3ffd1eab3239b2f90cc4301da0c53003f01f2b693dae196037c2ec6a9b55ae2ec5b842b0fe949e0a878121d018eb2100ad1b213c0eb802f81b6309ab30c7e13023303f2b666e37ace32e1512f4a9ffc5a7e5eb111cc25211fc8e6729d4f02a84cb594d139686c6f16ede7c2472df4733390b8b9156eff26741267a9298ec0a6a0417182019b9481543a973e0988e2e12e36c35bc87a22196785845de6c218694a6f0e7f6f7b6edd945f208b1824add7a3df8d468d319b1f343ec31820de97bb4d376dc4adbd7829f652e655a74532e71310bfdbed0722c46d9851e33096ceb0110755188e883e2518254e3ee92a19dc1a72881331671de5a68c203119e28be63f6547bb367aa8cb978401f8a4fdd2d857516119924373731b64a38b7f18154c95980273f8343be696026ceac1ebdd58406ac2784156bc6dccbe679ea8a39febcb6f1ce6f7b0b7f6b5868785904423d0c6f14d969017fb4950df88bb0e190ec4331394f1fd1e6f5c2011a6818b9c344ab96b4e614713014c3e5a728509da457da2aacdfe091a173534f67c1c2da9e937b9d8a8cea88e2b7b959c818b650884f41acf139f68f9759bfe38db47ed5535998a454ccb9ceb1b9d0eb0f1ef923e6c9e3b5acce87f8e9323d1d6f9e8bb3d5f5502e48f5ca1c34d44d43a305d821b6689163531c841acaabde22c2c21373e52bcf30da319ec032d3c335f06be64b4d96e78fb23b2a15cac80800a53b7ff2521c9411ee41c586383c6d283c3749077f5563626a32bee789cb2b78e4a75d45e12f77c6f1807bbbbaaeeb9a3a6b0923de0cb0bc91e95c562ce3ea8df3e6dd0a1c195812b01040e76800c6991b41771cb99821c0962cefd1125e23e83600cf6b60197a88fb99d7ad9b21487e22a6cf704eb36881d47fc91dc285186816d17b3540877612c815e4ed24b61204d144660e16bcbbf61296a1a66190c1013c0e1c953445cd38bf62a4ccd5c451a559dca0cdba730b8853dbea0c194c952e667d7dc66ca1336681d5f8a0d04879e5869287d8d1ae3850c4789019a7ffba0fe17f28120bc129d4f06b9055e9453d5aa0502b8d40c8a3b0e624b539550ba3fb0d11e061930791598ed7246f4180947c06bc1f4e401bf5f54751165e9336de97dd7996c0db616d2dd5ad87e7f23ed7f82fca4156b2c70dd6076c9d61506f3c3c2b8018fef81e302ca4c26c046947410d2bad2e2990258af359d649eb8025861b9b510f8d7ea58bc1f0e1e49e5bf231833a657188372331423b0a50856979c1d8eb3a92d3430b6650ce1411b582f26152c806f37414bc50540484e5c90bdba44d246c51fb67b1f0f0248661bd6940387b46f9a5caba7a8fbd2d84d47ba3af157595b1d4a4a542369296ae7a116731a2700e605553bd364c785f8014a3102f7d472247ee5434e5517630201375b6258157940989cdc90994c00dad49188c12f94e8ab71e801c8f7e88d5ad4ba491eb12ba9058bc0b0fb192ab573f34d86b01de51e0e460169676a02f8b1cf88c2f5736fe0833a7ee590fa0e80f1d48e293117d7afee61e186ce5b1334e2f9bca5389cbcd295ee2b7aa35cbf4206fd8c8a5d5b0eac4b20cb88465feee8e14cb20adb6c3ea5b632c3f8a7ab44ecc8f2fa80a98097f63bd81ccb44dc6c9e4199121e32d1028019761d1813069fb6f0205e8643a90c4ba497bc314a9dbcdf1b85ef71115e298b760ee83116488eaab29d166d02d9f61ae142fb333c4aac84cade7dbec1e7f4f78d84def1bf51da0d1c60560f9be7e7e193af1aaa13687a12c4306eebdaf57d3015777f5346033ce75f75b2d98fa54e8b5fe3933db50bd89339b46f65207df81b11694678dff7f8fcb8680157473027c1214c8b0c151599a8a401ca14a4812c21a0653082886149437ed63a6dc6ed82e8ff8fe26529b933a628d5b53f96f1f41a4b7106d082604c1f8daa297a0467110ed45ea64b0d8b9c0b6cb57a9e1af9b872eb07a87a83e8cc9bb4f4e5c85de160e37be76c3a45b01c2410c5abf88622e4c5af0e32966577a6dc55c6e12634064fe49d8b91227dc09e58688bd749a093942df384244b0c039772c82707af18118a211eed7422acaa8770f8e896e0f86aeea5aaaff08a4805c8827118d99df73646b884653e4e6b719ce308d55fd4dae171bfae29744c65691e360801bd42b0302c59f0a611cce489e88fb46fbffbe24d33950a6b50337bf18df5b332cd477cd14e842fe278bac14c6ea66464f5d8294031eacadafa3af7fa274060d0ea88ea5c8996024cc3f03481a0dba924e32a30e1da8fc1112f53b6b38d17e7b4641f9a2d672865e7b96d6c751ad9db1e8038686e4d87705f76c0ca5c865eee28d691876a818ec59800d1c499e0dff0cd4edd7bc8abad818474957f3cbbbf7e6758b7801feb1a4805eee0961053e3856339fa620b16b57745a14ed2a758ed3bf5f700720525afb812f69500410f6e0ff3af768efa4014c8974969bf4e31f87f5407a83b31a1a34686c947b0bdabb1971f43ea6e77f7a405c27822fdd268fd80c5982885d65b5ff2f60920d72eb2354e12a459b5cc6580e648343b2ccc7c5220320d7c4ffc65bc1f408f6e0f4b431f737288bb43f98d20c55ee928be5a258b46bf022924d03e89cae2431830800ddceede72f07960a51c80d356ecc565601bc5fc4714c13191254901d0df290b59651d36ee3cbc28b08a632302efa9075cee3b26adb04969b68661e27ee6fa871e6fd86c1cc9aa50647d8f8b03a57bd80b09828e1ba9b13219d1ac1a6745f04c9a8218b722e6ec443c7d2ecdccbeaadcca559b0fc02da8db4281783165fe8390da52566289f7a79c94584e9b3d7f4435db37ec4df1a92cb663bfeaf5f5d526993831ccf83c74e2c88e772f9e329032c22a7565f9c75d1201d91b368abdc6430dcccc21666d7cb75f92245e78f243f2fbed351fa3d3431df70da5e282ce22ca571e78fa89ef6ebf26bcf87c58d6e64e918e5be9cd36673de080e23067774ff3272ea6bdeff3ac6c5c20a2cc496f4b00410aade7345f720dd331d1e137629397a76f92ba8b55d0b4137473c2c1f728c7941fa630bf2ae058ec7021e2f762e6b8e01f88935e2100c8a96f531d54ccef0e93ffbdd382b87fa4083bf31dd6bfc98b10aa25b776ba16fe7b26d270bbdd7854760b97d41022b008f7090ee26b8cea9ea2753dcaba75dfb2748800acbdd94ab189d027bb6be2f87c13df578c2cfe31bbcd353e3d08cbed4ff783c9f4ee98c36182b5cfdc9ee44329c577b3e02a32e77e8e54eb3d1fabd897c36ca079b4609f2bb27827b514fd5951fe5135a06af70d35571bebcf8f491c74465c2025cc9360728224b45cdc6ecd54368dfd251d5873aa5d9b1c2b4ac00e3e8e36cd4cfa3d307baa0d10a75c1fa9295e018210fd1399aec850372984c58c214dc0c3d3e028362d9766605743bd4b2d33dd8f2c188c3bd31d39d753f54653f3f1037b38e812825c7b7214f348e6d94ec2bf811b9da5fd4d5deddc162b1f3552ed58e1c8e2ccf4bc49506741a0cb5af2f4c2b0104cfb485b21768aec2ce6b94a29ea322e23f0b9555c1f74c1678a9fd88e9c0bd84ca79071d90a2e0a473fe3a484f29f2df5e6842f884d1048bb35336d60a48b2268e82004719414e3dc1e7aba11f01df9e6c206ee63500b637796175c5e9f154f304a42293f86884615878bcb8eae8548d434fab16e9bb8b9267017605818ab9932b1d668c9bc6a38503453dcee7762156a3e943f35d726e6ed7f4fac295170c5bff1c33d699c903e4437422d25429a008e6426cebb46a69841a6288ca32758a8055c92eea422a3e90ac951a9f8b80507c9a25f2e1baa61be3c84d82dcd628cb82581cf50c554a61c72fae0c6e48a28482f10860720c500735ba213d7b2a7384133228fb6fb412950812bacc48d1496cacbfa2da49d80df719c842cd77a32e0edaab31c5f9d9830961650660ce63771c8b0d5c81ecd87497f230f72a54cf496d9f48ba0c8e712c530c699572e0a4b60efa37e40a3824da6a1dfbe88e5a01a6f7478ef7a6b44d87acdeceb61fb3f2f9c76d88efa192d3301847e0429b505cc67e93175c012ec2704d008c4e4411b696e1b68e72a9340b9662f69eae9c41badd8c50cc86cfa0bda4e6f96bb315319c7c01ed91b5f2c188c06e50397bb0bae02fc54e9f3d86d416c5379e278351e86fca0d54330eef466bb6d2efcea65a29ae82b5c5f8da354912f728c040a22da8a1f86f5e12641b57868b8ed7d3e81e214bdc2c01586746f4fbc9ae8ef49cf7ea5fbd80bd7658a09bc32b2ec5de8fa8cd53d7d500a913de4f229a868f038d9b518ae25f7e07d19e67bde6353c664cb73c33e848a948ae3b9adfedb597f331803f1c3df63264140be8b2ec096b84bbcb2fec0f8408b780e116f5b00440dff6832f50c9ed62049f4d67b0a2cda29e28fb968897d0dcbf42098321551db15969e4948df4356fc076270eff868f22ac806302ce65b53056d767ae6417d00083adddb77941d1e9ac61778dee86b9eec4ec66c63fb206d8f2a3e8efe8c9acfcd05dd0a826e91fc6313b029754158619d0a7cc5a9cd28e3c35b3b1d647a70765e865ec3af200ff5522b64dc7d66bce41834d790fcd49051dbf17716ce428a6b41102cc21ae9550f4b825e492a0429c47e400e837880cd56482c8db1c88853876ab2856167e136809615a6e13944631f35dca5a89ccf5b6806a624d93aefcc5adf232c9ce2e3110abc42d3445309a5dce8dab072d87a96547fca0269ac50ce28acc3a8c9554c612882087833e76bd7e02bafa8561a738e31ebb30521b1f8859e8810dd124cb9599ecf235dbf1b988bd35cbecffed7c856e74c7c569a6dd6c1c6214270cfdd75f1029c16af8f86e85dbf7c026cd372b5f84450a818cc6436bb69966050b1731654e73074412a3520bee53a16f56f05474cee4368aa295e2c07b37746f4f4699034fcae63e962e45ae3a42761ddecd9bc484e4e0efebc4e9a5bfb317a6620434befc385e81f1f48b57f93e1c3a9d50880a86dce8c222328cdcfab78140b4427ce7af541d1a275dc210504c8ca0d411669c7af8ff58694f4a61f4fea3ca61432e162c0ddd91c9b135613eb4aa2280ca68bb329785651280394ecdce6a940cc110039518fb17525a52b9622cd96da73aa8a3073ece62fc7fbfd8264d1953548f71b8bd5f6c0c424a8f277e1510ed216ee4a1317c295b3b013acab3258f1f6243df40c7abf1f2cc88505e84a7d297f43bb273700a6b5c6cdee69885e088765255340413ba73bc3e912b79d3e74e6c8e1bc125719872ad09c8383fc4f8de1f70098e9cdea2be73429ab1e0d95493924d4b29c35da8786d3b93b1d2ada10321c910db2725df3cd0ab6a1e3a6907590d632a42fa504670c2d9d2044c4df73389b4f9da31eb74ad4109f2ba5b6a4883c37f8c5e73ae66f9c6cc124a69a3bbe1cf46adb66f9b45fa656216c10841a39ee39230a5376ebab58a052e3112a08c753679b8564e15ef68ff5c379b7a3258abbe2af76121b2c34ae1cf053118da896a1c9f1f69730bd08c1467242e589726522f5d0273eecc2456345fad20ddb11ec18545f3c8875ab2c8cbfbf2e1ae4d0d7aa3b06ae9bcee62497ef83e7a57abd78b0513d6cca99aacd65c1039088619eb8c346946a32e1aae97bd2ab78aa80e91748ff5476a3de4e7065dae4c1358b5b0ffc5f57cdbe6959a6f922b3385c5b54ff741d3234ed60cc09258ee091fced33817e8fde5e1c318bbb526318bb752b48fd7e4408dcccb0b18009d803514ab17cb39becf3ae9700591e23245e2249c8dd18dd0132d2e2fed1086bd5acea67746abb853d698f256f1894bb2a806e83bc12f0f202a84ec0aaf4bd39a43505121ab7fabf5bd77b362bedb897bd902056dbf35b35fad289870585606f6098d4dfe813b489998f0bd88e2286f93e3da0c41708b802fd940b9eeed5ebcbea2402689e6af0c99ea601baea9fc9ee2845003d71d20ac053136ef89b63cd21cb26c216010fdbdf41bd1d60fe5607dc8eb019e03d85c62345009c66d93e1128e982c5a987f119beaee2ebb4bd1ff62b2192cb927a766d1d0de46fcf34d003fe1dee40a4b5459251f628c2de53a17e3d2ce53b9e1678b58f1136a2281fb7b1701a71e7b11a7a4966eb64c1f19861052d9ba75c838475aa62df1003f8403dce3f059b872d195ae4bfeca65a91c6c7836d56b5e772f52d79ec08b476c66c8b6969188cdcf595c68436c954b3006ce7e1a8ad07994a724b9904483d86544828962ae2d82dd8824269e3e8884fcbdf9f5799fd4d15866571e56b03199a2b6eb3424f9a655dbb5d402dd4b796451887f7b23764ad7e16297eab3e67ae7cfe429072e25893e96240db8a1df375bb2c2ae533c04cab8101a1fed93fe2aa02f90bf31598c959a91c8fed74648f160ced460e656bb76f591875c3ef50b505183a51a708c7072afa12551344d5c4348376568c65c8c063ad08039aa8d352d2cf495a72563181ae7d9afc86ac6c829e52870c0b76da4615f156490b930f2efbbb58502d3b26c5d3728ccaa7c44f32eeec924fc991c045e6148c2b06acaaa9a69e42d0d38a4968a7698cf8f4666f73274df0f6e989f8f35ab2bd6a406ddb54e261abeb119d6415a6d24f71f5451b227dd9c26dfdda52e655a84ba0e405f96181f44db743d7aff4fab1bcdfe6318f5aa890d01ff8ea1d1f7ec075677d31f7f033dffa5291be1bee1787ac6e1b9fa67638994d03b0719819652e54a006bdc40f715035129f52b52282356366fe913d75de2ffd3ff122dcad9ca78f9cd40eeb8624d3569c8158b62512f959a91c769cfddef5d1579ecb54ec8f7857e335885ff533cc37f0e437248ca6c7e7fd6b28a585373948a091e53d88fb343e151468ac777cf9296aabb96eaa35d0938c886dcd53b9ae5c2989acba417e2c6d9c134dde5e5727432c30f669e89bfd807331a134326079ffa7fdd78bfa54cbf5fb6783c20844bcea6f997e6729410c919ced93510c888f2da3a5ad0c4ad692b3f17f8a044010995270e5e521bef70326414b6312a7fc0e5ad1677e426f6aba1f2a5e405c1b6fcafb7d8bca939b8fb2c114b55fbb019ef10862e0be1932e78a337be4c0e02fcde7a496bc9546986dfe0d8277f42fe22f2a1d942713a25581ecb16ab900657294824a9ff21f5aedadd0aaf07af650dcfa852f7f5606fbb562f82078e641a249c82fdf7ca66fd7cab4dce664b6662ee4627f720b01be871d5a0f6211ea36f620e2bddc7a793b0c292b0416338619d5bf2b7e4d2539eab73aab87ae45409fce11363e2ac57f8061e67192eb7ccaa340e93c445a3dae977b2e8c09f2efa1e6db8cb691381857b3d338e4a4153fc5d9ff7b0b009773deda91abd4bd0e834636a2aac45f6bf6d8a2668800eb5203dedb0d514bbdd38b08fc64b58a0d9c7574b7e9fd400c32f3517225a3418e21cf33d0971648307e7a6c629ef1a4048b2a93ac1bcbe88a561c232ab904dfd972305b6680949df408cce1b6d83def990db35935b888b70cd17107c3cc204649eeb005da0d1462e2888a3db38608332fb98198bff76b7b48759016956c62ac3fdac42da697c400e80b7f83c0d69918e9593c84b604c2f703e900989b30c255688290732614e3f4aeb07d870b06f02e4e9e9d8981920f4b78909b98ce35afd34015f20dce05bc80e77284a920574f2285cc62ed80d6a8d5589bcf5a99b3c084800346c1067395f78f7a903944e1e8fd9913c5d763c6acc7cd520e9346464e69101b49d2f11227f2655220aab54185b40e8470887f24df03c20ddbac29f838d67e381a565d033df9b6d7e20e75a30341d8f1fbe7641b57f5c08470ef00765cb5e6c20e116c5fcff695a04d37ae3694795098b7b6fa9de00180b322f307128caea0219959afe5808b403e78d6171dfa0b38a54b8b3adf9baae1fa03a7f6661c94fc2925c50fc539ba42b581c999722f5aed3a8edf569dec8308e616bf0ed1eb28171ef5e3945621bebc21052a707b799e93d615ecf6e958f585ae402aa815ded6b1489cd927e651e574138ad0bf9441008ebc2ddab8db9b5056213c8f1ab8e2d597dafa7a575cd9f4403d732d734fbe688a364084023719367bbd7d57d9a1112258adc25864cb3fcc66026dfd883955c35b1b284230b809cb8618349eee2621ce94fc3909ead322e5c50d16d4f6050f805df508407a062fc3ca4d243702ea19f8ef5da9ced21cb0ba3161d6fb21b49a1a73dd747bb2329f4c24f685a48eff6eb80df466cc6ecb2f94d88c3f997eed2d7f37faf4f544639d4bb58292fba1f8dfaf1420adbb1db38bc08d717eb28f8ae6395f8753280d5d5319d02bf44df605516d3665b00ca8acc3c0c1e85b2b476f61dfba45ed1a680e1bc52eb8aa6a05604c272e689f54b2e80a8a984ccd73e86872999f92d9e0404da1825e829e98bdd0a24de3c6793d0840268e4ffaf1bd724612481f49553e525b064b29bb16d513ffc54d2e501ece26ed5ff0402516eb46b469fb747d39dbc465e4e4cff2aa8c6f7e1e240d1fed2236a13ca93fda2609f236263cc23875054d72d0d223955549528b06bde969ba4d226b07000c519c163e524ccc33ddac93879e6ee685c594216e92c4d073e7c5c6b1e1392486cbf5d6058b1fd51b583190c0a672de4c8fdf6e27f6a4b5bb53f50e63e5faec2717d6da3f20e2a405a125c7c18c67e420eb5c582b3099eaf5ab483ee70b8f130793df91b400fe2fb4b9fa86557a49e6311af4439c2a6ba5ae34e777542931632cc96d6156c640e8922d482fd837ab8f069af49d894aac4e0c12bf052a7526b9fca7eb88e37676f1e8ac278e30a72187964ba9875a3ea30d06b50b867370fad3ceb4def813e23145e89152e1dd8abf51912fe4b3dc9853a7ae0775c231b6b5e66c99911b484a097ff774769d63862fc148b1588204c7ed577b937aca0dca9a1ed89fb860eeaed15c829854cf1ee852822e604da6e72de03f2630c6f0f729147ef48fbde39cf0dccae49c2f29645c5d36c34b8059bfbf9f1e35da9d29deff5ade4becdce70ca80e28c8896cb80a198ffa66a7a56ed934afe27a9c2e4c37bf93862dbb38f74ee44c264c6b098e9ba48a363ef68f9fea235adb3de0dccfc4237da91cfaf67c98d13fd77b1761a75b50f7b5f854fe5b06ba19bce5b9aca5ea9e84da557aa7b51d58b4a2f54b067eb0a8f1bfce0b5f54e1d36f52979ecf4a4570f1f2bcce86db65eb3f434a3d70cbd66f53043af597acce861965e33f536337d7adba4aebaf7ef36abdffb7ababb25814c1fd5ab83eeeab40052cef5272077eaed0bd5eef96151b5315d2dd19fa1fa544740fc8f97ea084df808e66ea366608b379fe72c779fb0328a266f6d9b0ea864f113625a2785908f9a698e436e79b36d29466c2c8d806bf52a4f2430b63cce970106efd4e81263b284527707b5a68ca11f0213db9642f318abb809cb6ebb369e9f301530e34162a39e28be151f1df7c49ced9dec83a434fd57bbb6895544d43c848f2b1513845476db228d25e63d39b8329e9441ac54b09ed7bb48831d2b2903f8e48cb375b4a3ec52af93ed321510b406e5db761a033afd34929edea6ce1b32c773876a596f4dfa2819961c71009899806c2211449b5f59677d97384dc7b3fecc7db61298c35494846a6b829d6cf8bef9fb6bc627625720b111d5af21dbcc55c731eaeee83f7ccd63bf115359bd9f57c2f98a32d827c68a8c1d1f363dfd41800b88365e712419258609def04f27b680fe371c3f7d534b5a3503558be95fe14c014b2cb9578e41fed60548611254ff053c9df03ef22b19834b9dd491146ec13cf38448deb429960599a791b33448724f0dc96788eaac48deea81c69981c4025429d7c1322a14270ab32315104f9169b7909257c714e1bcb327a63837adc93459785617ae4db0264d508cfce8728657b8bde179cc4301376798f501f79729930ae39f8dc77d50503e4dcb10207cf80ce9a9d19e7f32ce1bfb44cafeb4c44d0fef3d249cfe263f1f775addf5c53ef8db01a55dabc7aa339a1e9042b88298fd66597a9bed4b8d1337d124443e1670fa1e696f6a8106ec722a5d576dda9d8fafdc44bee9d0d2976e0e34504ac200c360723c33b9e4fbf315a02f2afdbe0a2280f9dfadfab9a70103e9619a39408454603459a03b59e0b77f1189bbfac09fb531c508603c4c16ea5048e3304d719c975d600ace0de450a13f3c3bb9c938852d1d9ea6e92b60aba3d22239aeb4e0e04b36e6a4936ad3da39f8446cb7794600470ddc8bafc40539e980386b44229316e357df89489a69c012c187c6d0f0092269e7e698869a1eedf6445b82b68c5ef265e43b4b0595fae407bcb9be469a9796a724341e7cf1c24ffb2017939603fa06871693368822763937df2ba16e5cb652a72fd319dc32a280437580955fabafdd0ad4bff29473da008e765ff9df854c1589cf0a256c5e6fc1142423e79c0a0c48ea86ce9c91799b86e2bb889707e38b0c52a48516a0ff03eb0b7b1448a3745b2299056bcf8eecb1bf76c183f62a91cd21c9b58a7897f17283a5333c354ce37669d163db757f331edab1e8c8428129c32b3213ad6e93b5d234d9543362c2ca2b947ff668dc7e64fe7a7b6e68e6befcf9bb69dfa68648892acd837d137c2c68bb3b182d05514509c7252d0470b010272a8fd99a39486c1da5fd2683165078b1c7000b317d9184aa11011b2585e0d631b6ccf28d9d30134f41a1eaaaa22fbab84eecb51fa3dd3fd855224b85dade234828cc99be5799320437b9a394cc1799ce03cda2d2d1919a42a75b43c73d36dfdbf3070fb1e334105a6f062414379482ad824db3060fc68ac2818cf1f609b0541fd851b6c85d5cb8a98f91312ad73500f2a429d696c34e21c3ec352b667a4d092aa04e687af84cb0a4a11f6b8eb506f10f470853aa9e795627c630e540f0eec16ea823224e1ec3d2f21be49a512819fe75cae326abeac4c0d71712e85c8e9e3cd40b473fe13385e311e09151347ac813b5933a5466f1b9022fcd2cc82f022df1bc24361d892c3ec5bc1d2bf920488f16950f36428caa55849d5df689b04241ac1a09d96e136e9803dfe96de961e49efc2e9dcfe51d551b27155c047ad3684fb67185abed12038ac33b39d1b1575ced0fe92097864d5daa1897f0eae43c90434c5d20edd7682ce5b636fdf199983d0709817ec3e303551846a1e5d40b84aeb77ba7f73a940b469b56ebf61a48fd8623c15fe137add0ec4365039739dd036e16c8281db3ef4e7f89c20dd418f204d2ca48eea30000f0313f5e0e41486a880354a102c33c1b56a93c3d29da4b5396bfd67ed1e6f38abe5a327847237c8570ce8dc15344c587b66310332315ffabd307b39fa5113de4cf0aec4c680fcf43fec96255e097a31f07d93b988d8cb230f18f3ac2fbbb911eed67baa428436e47320df04d357718dab4de42e020d7cf1cd222d070a2d1772b0c831b1567e0bca61980759417fef2cd560f81da0d5ffa74d870d0c147fe8a9a19d69e70a2be84492cd300de69091f7247b0658778359439d34ecfa54585d44389a1d4638976f079ef6c145de7c8aa3da6373a2cf0705e9bada00e0d1389b2eebfc7859a55e77008651d09e9c5f8c3e60ea43be03d4bffef99f04d0397c2b04dcc6d5c231d09e5140f45a970123ae83b2469212175c041262ea3f921015d332bef9f06690c3eea98779667f5024b8d0ab5a2fb2b1f23174d9f54dbfd2c0626e80dde5e6846d3900de521bcfba73e9c1ae69cb62078bd8b7d304d2a007545a8a3462189eaa575def1f476633a947673093d0f2555c3215e24844ab0bce622d89bc34f769c8a5c5469222882b6d465ef9910ce9695dcf83444f5098dff38cb4d06d00c93a5f981a985c63ca6c00ed616ad47e9756633e425038fedab005cc014871bc16bc429f257a9891941e0d0027eea2db3374e053f61e8517ec1cdde07d6c2cd0c6fd98a22b0dac4b5521f6596bad4c9a5dc89b37fe8974c4489aeddfc2118f26321f0cc3d25bb61ac5ab5540086fd68dd15e22f11e95cee905ad4cda258fd62fa3f080952a6827445895d21c4bd6484f7f0f9ffb482c7ddd9fe8266cf5275c5726058f94ec0872b596fb0984145e100b0fe334986c7669c3aa3baf89377ec37906bc91f95fea4fef69c184c6afb4ff04d0c2913e4e4cac8bc2925b39d9b988304ba62f5e911e5ed0b02bf855fd2406285c5b4642e00a5dfcb4cbe6d0f93bcaa5d3735d5a67109806dc46b0a35a09b418d0f8b956e700336e50791ebb564ea42e4a88511e754b3cef4baf4ea0b448930c61999cbb11d4d8819d006b8fc8ccfa637ccb00cf25a2f3627a6323cb385e0347f589fcbaf7c021c219c38748860659be29d91eafe712178678821b00c7d72952f67c4fdce21b49250ab966cd32019bd32c1e3db361a2d557e3e4d5b2836958fa982797cbb02ca4f0582d68be7d86684cbb7fe0b0332b44793b3ea52e68f0e9dc6e7690a71648698edaa1cda744e595973cfa6b5f44e624b79d1a8d198143a25c32fce801d1670f15bd1c05b8be424c311b6430b8800f89ae51769ee73772ee8ae49987e893e7c200012414f7747364b81a6adad4a2fa880edf6e2192b902a21022bc48aa89fa10b20cf7f8094ca63bb3a7a0323faf47cb672c3710d2b9b6c6af9fd87716b8f1b0ff8ec5fb21ec60b239d1f11e7f1c61dea42e4305286182e535e39888fbff94f04ef2dd957e85e0900ac36b47e0cc753306a83f19a884dc88ab57687681e5e41e10415642b87f743899719ec8c63a28d7df8e5f696420891148fe8d67c47346f2cb7f153cbb9a687a8d0fe9062bf9c1de8290918f95b4827b5e9b58f36b168ef24e0579a215f0ee18f6a69c75ce4fb99d961eb4b52944c8f1474aabf285d24a65a40e6b2b5209ded496970e84baf1563c7276841aedceb11690412fd2b4427fdbbcda2c91a1286d6735eb855ddd497196bfa4183dc963dd6f4930dbd02c5ee1d036d1436276bf1451f6c73b88cfc1194368f27ba798f6ecaf7406f8b9320dddff8f6179146119771207e79b41b182718efc08e935380c0ec68c5e027bdc661ef24088bd642cf818e27771e27f29c2cabe6aeba71eb728cf0791d96c0f18f6a456e85afb1341fd7646a2c65851a068f19197ce005a8c7ba4bfe4787aa58663259e1c4c31f572264de4fba7a06ff7a0e937076c1d78563bf470dcf1d61f336566e44cce6f01ec6d004f36b15d3d3da45b0d1a783d3e4edc287e70dd820278fa0a9dbecc0ccf880d8dcdd22a4019cecb49c6a858d9e17731df4d5d2dd4ca720592b5e3531007357ebcb22e8d17935194bc671fe44b48150681ff2c3b829d48deeae6fc3910834535656b1fc0841927bdb990589b1ca65e30d570af31d6fb1fb55334337bdeab07cbb2246bd5725af7a71cf436701c63d3362baa3bd5c861782f36dbb3160574d6b96afe98c208527b386ef1b056c5d22cfabb7b3c52aca6ba9e3b1c45781c865244fa40d7bd09df9eb06e2a5c6846521c5655e9ce702051739b00cc94e6e713bc13bfdc53e842068121fa401cfcd10a2b983d1d261677b72500fca6085384e873b663e118c5ae089ea01fa3196d2002768e7ed720bca2c86760e535f5efc425dce10fa754533efa7a754e8ea963dd960eb7310c735b1270312a85246181b20248ee929755a03c241ea1017071a0a799be3c07191d0b5ed4c99b7f412c91e2c923c4d57b4f56dd01bcbba9e819acdbeafc03140695a0b1c03c7c9222b776f82898bdf1d74895bb131ad4bcd57a2bbeaacb3cdce3893fa11e02ca4db9ee964d5d0ea757a9deba979ec51889860a1ac2370dedc8e598a1257eab116eac539e4e822d6b4e8c202088f846b4e7c7a66169abaea68bcd73fca98405722f8f253c9ef93960fb59876cf75c9ae52636efa74c860f5808e8738df99822c3244276817e1678279b5c58e215af529dbcd119efa5c7b63c8c4b42075d9408dacabc2bb36fdaf439a7bb504dd0e2712dd70eb17686b2f8ad693ccb9f00647c4416b639bd682ec484c7fcfce7eec235e261564365319d5014e28b0ace40fbe10df907b214ab1487041121d744f130d0c1fd0eb4bc93e72e841d45d890db15d28606d462c932f3c67e611f7746c52b804d51c1210c8b829f8724ce3028a056c30a8dfed9c6cec92001b6950f0f2e4cf53613d1d93b1a894989656d59e66e9bc4a92c64f4a23af83e569cff650c12af1c78d9cf5122f027bbf8a833d3e921fa0375b9637a26d8939f318ccc63535607390537219d41bb4f634a344057e5937289150e8cdeb934b2c56e513928c0bc55017748462923bb6c820e8e54f000b745e20c9d0756604aabc42eb9715db72742e216567ab6a125d6e7219ba2e7a2dcf927743b61dc41317b0c536019d3557a85a99534be35ff16eb0dfa0b9e14557e8a05ed1111480b885b9c5e53545a7b8be02e783999ee9882a3f0ce61507128abcac700c2f910df1e77261328d5847f6f7089018806a62c656b7059970eb6ecaa6942d8f808a5387ca1ae410ba35801c49608a7ec4eb5510896c394fc2729d3f64b7cf23570bee0194814fb8d58a675f6592ee9d0ac861c05999aa180e678a9913b316394548009d85797a9c3bd8363d83e30c28da3588ad702e7a771b6945d400506e025e9ea15d07320ea60674b1ffc40b09bc2ba7969b6396747e3d8443e5115718c890fe5267e81cb57843ed497490a8419ecdb56b6a63be090562a6429fcec672453f9a46601c93269c7627fe302a0135714aa7f1ef8a35721ddac2debb8027de93cafbc2b3cde85711c7d78fd51ec9a6fc1d21144e17da59623e091d04471c9887fd3de198ff2feff28088ecdfad8e3e688d858a127acee28097ea555f08bceb032c08546e6a31d5bf11848c494704045dfa4a5e618b263a0eec41b8b14114bcd0b6817a578d6912af7611dcc585320c06c42424f10131a914cb06b129582c06b1b8f92fb402675c4f12914185a4e70a3640837d9eda161b23b30c573ac917d64db408134bbbc16c603212612b4eaeee0a4c034da18a082b088f487ef634d29df1a71b6a645e9a57fa30a9321964350f3ee4e7c8105e7a5a82b8f5a6cb8614eba813234d601448ff737cffaa94b64a5ea95a15fb38e8e520e39680eea11b0bce2f0f99abe1f9d4893acf3156f775a4084e0b36f15b4fc7fa1d07036d5fd6b59646c72f4e2d71e8e549e75f19d3b56044bd794379acccfcbf76af48eaddb76356ba24eb42934c190c40371134f7e6315bb988a0e63cf67c86bee468692e17271c2b66c41c3103c132187e3d2641d05ccc6a1f1cff4815338d63ddeaf87f2eb2a7b743b5e7c3f8087bc01689a44a0a7b6a2c261427be146012d8f33328a26b155bff8edff984178f44d0b5c676149ccbd4de980a0f1a5d991027e65b9ba841507944113238d993c73cf55204599b78241a15ef4e3c9a2584b98053ea2b29edc8f9623b003d26e2eefeda50a3905d7e4a5e36915b55c75d14d403d1493ccf6b127481dd58040634eab27c8b85f14ab636d2fb70be727b56e1ec681787cac9c56f805120b9068b0add076b6781d8c4d06c2e46900cbf1d6455a7592d708e1da8cfa25951f416e20638adf4b8797a0e28990b7d900f887d61d3f72a0ff4ac6b20c281568293a27b9f4a78347d29b4f2609d456a050c99613884f5232e764c21cc0a001642027514981455e1643c3be877f304dcbaddfb85602d167627f888dc2145853651f80d3aad8a41914917d519ed20b220b3fc372997128a12e8cd8faf83f79a42c9828e58294f4dee38e41e8c2444a555f643aa9cfd47771c96ca40d09a16b82d7b0f944d1cb4d519f29337e1d3bdf389638726cb2c6b045b7ecc858a173be5e9e846c514d3f207a76cddae269b2b799b06ed34dc48aa26c65621e251fe0a9b9f53c5f09f82d2f9fadcd32a21b3ba8d292ed12b811a5542f9e555ab2a4eaebe2dc773c6b63c00a9bf80d6b2529e5e85dfa5b04e3033800b3037416cfb1c8c0bdbb8d87019f008fb167bf13ca8aa84b8fb73dd044442a946742ff2c9167a36113e74d14daff9bf4d8f691e1c24f65998532b48c2837e648c7cabeee3402ee96b1e8eef51647a97f2a08371df2ef94911ca36fb8604c257a67cfc99ddee3c6a7a755aee416b2b8290b5fc17083fa347317d449c761241eded0f0edfe0962dd109bc28d4d2048bc5652d7dcbc56c4ee2fbbe8833844304d7084c5741c2332a10413d9018c5ae45a8b89898b0a7ef663b0a5af6d5da9bf893e1382aa1eaf6e9cfee1a96f8595082b1980424d83bf33d675d573a186cc45760a1a5d1cde693d90931592d5836ae242eb6a3eef2f8b50449888fd8b85b49d2cfeab785116e5163228821546d21daa52918e9d2e92ea1c3f40e491f2b895f65b7c6cd71778714a96c59aa845a86a338f58bfd0e4f5181e4e764f1968bcb022b1e7e5a027414b41e88683a51f6ec2c63b526f6b277e40e4d0b5c489c6493a39b1660da9c58a1dc32dd64945f571972dee08157f3b0b4c6057445342c3937b42b93e911f1e6fadd1ba8151d6c0a829b1be5bd01197e6b3a77268a2c542a46763d1a4d9b299af0c765de8d90756608c156797305f1a4adfd0e2d611e42d6a6b9ad1b9743a5a94c1ba00721684c3ad819c50d448f8b944317446b7e99331b5e1c7192158f62fdc7efa1505caa270b5777c58f0498d4a25f9051ed5e25201e8e44fb3b4ec4ad87d0efc0767453b80169b6a8733a1fbecb0b0ba1272a3bfbcca7d6653f98d8e925aea86e8c1875d137d5306227e9b1c85464fbc43f3a408703727fe7194a463dea3d00de8ceb45a6168f452599c997cf9cc4a0dd2c027e5019e0e01c5d127f9da9882bba7fc0a681e1a8b9f0a8d4ab44aef54b04c641aa77c34132d12360497b14fd521c62992f6b8c9444219069a42ed0fcc64523dc6938aad339839fd489a05f1b744a1057db24ad1454e8363dbcfa9b88aa35a0c9525a8d70292f5c3b16941209bc1d21e2662bf3b5974bf9bd0ad0fcbfc5875c9405f875ff5482e64ed62b323d54544ae9295b7ab20494ee8fe9bf749aea3a6ec9ead74f9e960658ad13efcaf1f544635b74aaf21b7a4aa31edcea14f448404cfc01eaab40621e1c2c834ff47eac247cd5dee578c8ec0e7e3ee6a7376e29a539c490cd67a7c7edc719b71974870e00fd64239d2cdc7ed6b8ab151e0360f1f2a8864ff4c39185f4444e8eccb13e963af0b6cf622c80cc154cc6a93a332ed5eed439fb3b57ffebdad9fc00a0fbe84b7dff6aeca1b775baee9523ecc0383d00f828cff72ebb22be5271a54fe9646954a685ad40edc7c798b003123cb013b92bd180c96bc90b17c8076fc2e486e73a835e1dabc42b40e51ab887b9bbc5df2e2e46f59aa2691a9d12e0a353fb82ec673bb446273941e048c6c43cede59f18d32562616babed26ffffcb214ea498bf92d6192501c64318d2c336a77b5fedf2d514632dbb9f1a20b6890be37fa6eaacdbc65784cf2c253094ab107042af588084ce868e03265064d601fd5f349aefd4c58f64363a4de24a360520f5bd3bf326c9e51d202def5d6b567ae7e2f9663a0057fc849b89767c77184e7e2d3ee957d39f94d4d5955c7789de83d0c75b165888ac7e569ecbd2adbd3c5977ee005dd7de0a8530c88d38402540787a96c469e4086297e4188a9d599a591d862da207e346252ff4ad63ca2e5f05a929a3ae62e362971d169d5dde9daac9e8960d1c35e352ba7a2cf6bdaad0871dd42ed544c5d260263edcd7f05121b59a19ed9e6106cb5409484c905fd82b718e526199f03e6b3f2a90f5ac94c8d6f15aeceb28ee4c709b22671337095dda07b4076cc810a3bf7fb10333bb8d16e40eca057b7d1e533452a3e8466772f1354cee6634ab93210b5da549a9519eca3b2a298f604e7927ca5026ecc3e738c4a79f7e12af84610c153e221aa7c2cb168af4aff31bdef5f3ac21cb86407cd7e33888c99f6d4a3f28eba4852ea43b99565847d44f11edc4e7c856a2c23b1f563d6fd29fc026d6ed5d51283e25800e4549699dcbe6d1b6ab5991d3e90dd3a247c0ab81e0fbab02817c490e6404df27725030e01f1e53a2f6b505a61400672931a5a0e86c086195267f13197d2a557f5109dbcffee42b3bf35ad920882640214d9ee226500d4f939544fbd8b7524717c48cdfe36d5c69c3fceee9748377013dd713df4e3aaeb863e20a5c12e7bb7d38d62b0e3889ed44143e13a0fe4a207e4811fedc0238cf0cc4cdd963e81f7f519e40b90d353e8ae68b7b86040725ccf0f1b034c136eed706f1abfc1b4f58a71a71ff97eb8593c54e9c610c9390b19dc2d9d98b3cfa78e78335e46dd01877a099af4936d5bb77b7f02e7585e0f5ed7f4aee2261902179e724b59fe9fb4a42a4bf32d0dd53fc1d1b931d3153dd7631763757624d393f401a25537db63db92b0b85504bd2fce003b3b653e48ad6502ac88edd819ad75f298a2c6fd84e90a31597fa346a211e2e87aa49f221c53b7ae0b17e823e8e755968ab9ac96f75148777774fe0786686148f12000b80c01a0a200a1e99732754a2c7b560c92dda0f0113d783d2284a5b8bd098edac70141c68863672c4ebfc1e726f289b567c42ef8a506998d0f997aabb0e7b8f47a7e95e8c26da467297e0e71d6186f2dcfc27c4c6555b9ce6dd6a9827a9496b3dd7d4b082cc49542815f44ebf4ca439557cec9b53dd14a4b79788094f99ff1e7dfca91ef0e8e7641870db6a7130e0a21161bbd0de8a029fd1da0c67049da8fa5e34ab6b49089670890fb408c3fa04e3fe6cfc21fab8c4a6cba4650123ff1d8ead73287b8e396baa855258c369bddd137a25acd387b574cfc5bf5cd3e425051b39a782527d2b5e2b752877178cd99403e964728164393fa98a95c1ac2f0ba37ea88644a23465936a1fc008198bc4a0ff38c1eaddd9d35c7aa9fc9c8403b423a259e4ab8ab5ad38836b1b11ea7a2e363efbd347b9ba4ea0c39adffa7ec546d5d872297e67a89e9672d7b2c933961a496ae9d9d0af6c466811aa1218c2c7f15ab999019987e4c79effcefa23da984ab2012d30bb68777449bb3d09744e08b39fa2aa152c17cc2d846e1ff9687135f2a3431c0c110c60c6a77c25525001e1318a445c855cea2849bb08865131184ad81dffd86891097cda3873557acc48cfd83fbceb07edb233887d3340bc0e240cdc63fd36dae679385793fe22909d838d2f37f2f82766595eb2574030e557e554230553953f7c325224506f098155c4444825aa98c3b50a8e05549c1e05ff3688205d0aa01f08b7c94dd9b8e5cdff929b00b1dd1d727606c480fc245dc8021bdc873dcc0c92cdfbb9d1445d9160eae63ec36042d6333e49c1e39396089df126ab24640440772b81a424dde3e71ab95e13e5a1d044d1f2124a62197dd79cd9fc5a3a666c2b291c9c79d80298876eebce1f85716dafb0290b378a997b36983a674c1163cc18017a82bb1c85304e67e9704098fcaf1c4a18ee390cdfe717289f407ab12366934ecddaf2e59ff4fba197f1848758d5ecc7f48074901d1f45f4d89c6d04c1924513b450008841adfc2b45a28387cc0b3cfcfef8ab3f08361306279febbe42b076de418dce67353c25d70b5adaab5b92fb3176ce576eaad21c787d1df2a173716ebf950018997e3250f6f5b6bf8e93f0f720b27825d9e28637e03525c3ab17c5871eebe6530095be30184ca13c7bc9998281cb233b82281baf7636ba6e4dd6751e8e84a49593c9dfbb74d640689c1220185725f22b330297122c45511beda31ed0f3453c3b0018a82828baa5eec41040966f260c069879afcf445f5a4fbb3f061928e6f4362083f0785a51a8c587d7932538b51c95299cca4f56d5d0ed4abcc47453c74ccf5cb3046cfdeaa9f763c5a8384848bfecc48ad443cfbe1b2ea277f46a8a3c6618ba58dd9f4a99b843562a2028c0eaaf16e97f9013765249838b47f53fe2162d4431876b51249495ced6a198a8f21807df8e53aa2871c8f5e41ff4fe5a202b751e461b700eab209ebc8518d69389f444bb58455e4fc45109b5339f2a0849a289b112dfd604d84c2736718d491bcf7733044982af4194ac503281ed953cda3baa6f0282819dc2853384657e4098c7c6c11118cbd1601f85968917fb97911f7226cfde377b809f6fe45806f178f5685792fda7efd29929bafe21bfa075d0274e37157082fab2fa729c2255f9e704c370e48de4e12a69a9c3f072d19008fc1e36a250a8d1c289769fbcf88a57cdbe0ba43a2ae87f976f6170e0b2e148a575586d811cf682d91cbe41433cc17c9689db81e0ee16cd167a44f2a52c5deed923a2278cc7ba9a2d413c6553af682ebf973296091d4fbdb3855707fa6f387577ba72809ac9536f11af8950dc1cce587bd669bbb8428a2ad4ea1e25726177aa543f2e1c2170b6a18b37b8e86966527510918ce368d068c6743c4834e35698ae11c6e89c478db947bf01cecc3d4367f001463bb5382318d7e900918ce5688051c6753a40546d4cb6cf270931914da21d2cbc65b6914711562fe1eb7d7da1b81a8782f10501e53403f9491fc0ef7c82af7fabf2964e6daed3afdd625c436313f2f3efb510c78498d85c1382136ce6693e14606e5c809d33db4be70ab264635189177791539f0c1292e343436f25586030e3ad8658bdaeed6b23537bcb78ac2b8e2eacc6b67f2a6262cab3a72d71bfc24d2dc49873d472bcda5300e772fa63747642f1ac7ad214410c00f42cb1e14434362d1f46b9f622933a0a1cf318c3d564bc83e80dc4203d40b437b0a02d524d8e7dc1850f340f505a9e2fcb2d053e206895c1b61cefdee0017aa17a77821a5b5ab12635680713db063e63affa66961580f73245e7ea6b2edca6770e2d16fd3e974fc64cf59ebed068508449c8807d382c493e68a8f433917d7f9607193a44923b81f14eae902071aadd9fa0a4f5670876d73a25e492f0fe668eb4c642af64247765094bbe0270c162f6e33393f27c2fc346c8385c72a1ddf2e2dcbba41e728acb0a37f8f4d088db3a0032a82e02dd9331ba923f99d983d2f9c29430fa0a6f31412cfc12dbeb2eb77ff1b5e2e42095ac4de523485b94463e6aa019ff69218690ef64c5a50792d792887ce409e042cbfa9db8c8dbe245e381545c88668b69f452bfc987808e65196fc62fe6217155cf1fa13b22c325fd205a84287b43ba35d992bb8ab84add476a1a73e19ad009d1d3f41df1f781f814303205f5cd3279a017960d676993dd03bf16b73939329a3c4aab407030c6a1d00312d2c685a86ba311b8053c665fdf3685509ec662f4a7c05546a24090034f87b317da9b1113458fccf9f22c267c1f24d3922407a00cba66036cab69ce2b9ae35790553104d789de1cae02cb2798f5bbe0fc63d1b05aeb7945ee8ebb158b3db8590ef789b9a0a3dd9e04e3819b56506dffe2f34e05c1e9a3c024badbf952e1e58936b5cb0246884cc7d6b2d494bdec75aa914d121769ae27eb6940c91e9fae06cc6b3f29fe686afa553f7e656ab02903a8dee6fed83dd9860e42e2641684d0c57cac4d37d9ee0b2bf66576aabe1742bdd0b95a2aabb008863f4e75ff18955eddbdf3278397ff85d61ff6c75bb66ef2f1a72fb462ee27f4e7b773d667f68bef452e6d79a9a62cf9775b5b5de7bd63e2be211af52a706230143a26599c5862e8960e2ccbcc8f5468d9dc4c6a90ce4a98ed8e6c058a6776c29934f374ef7f4ca0aa60df56aa74ecaf7734c5c8ebe1880ab44d63714c1558dea5c2122320e6635a653fb683622e942d9af4b793e9dc4fdae75f66a062e536998de2fd43ceda4fa4c6ec95f15e5dd1b0587e5fd116e0ab038ceb86434c6fe25d097cedd7f81d8b399b192538f41507f5206e126d000d1106c6d43831887c7b1606b19dee279c567df208b163be7095da1c9b0e403f6db5b626c89cb983b99f5ffc7172672bb74a96dc368ca4c78ea52fab90ee1b1d7f6056664512c3fb70fdfb946c0a439fee065e3f5aaf79b7dbc9bc3c608e96b1cc1cf6548cfbe36ae0658703537901b728bfb3bce10754714b1f596fb7f1edb1d69cf5925d5ac33bdbbc415bbd972c60c5ff460249c3da845037719b741fd94014e2625ed820e43486695d26a4492e41d710ac619dfbf287bede611cfd7e9bc2b53bae4660ee5cd0ebd6f6efd5b0c3790a3dd29fb0fd74bf5de460be6876bde150e9ad5e647e9f439a47216808cb5e8bde5f0b956934a0b36b33575b628469764d6d4ffb95275ab0bbf090f07e533a80fd40801aafab1e72d94006eed947f8f27b49c5412fca763f06b03e75caca68af0063deb0545312b9c0027c6dcecfd8ad852f009010d72515ab63144ec050c1c1485478cea32fb787a240c9c491c050050760f9112f5b024a754e97b0576815a9c64f336df0f77ea0e0cac0d26964eef77c3990607af4f2e22409e20db0c36a0f049e48769557963f0c80f1061573357f20f0b196b9fee5a6a15084ecc8bd3944694530258544e2e11eea2b72a64153dc71eea110782c2e3de435557cf983c21f87c473cf860b94235c0d40f94d5cde4ebcb18c12bf8a462ad03802a6c798a17116958ed3ec46d07f373da9ef077911ef024f1a840c49ccd16b1bfe888d773527741e2ab800942881ea9c75321a45a711328b5b380ef94ba29ea09632f1845696eb743d3f6d499f19a2f0496d7d7e0bb13e32b6e2327dd2279afd2cfe78755018d9ae33744692b1b60e725e61a856dc3b98cc60e065e2ac4933dca512add08b21f5f5de70fee8df4a9ee9d014749b4e9fd5f1be9c0994c0c62f3b8bbc5e503af152938e093d9cd75404bfc9f735f644ced0b023a0ea22272d13109e4ac75119f62a11ae075db2aaa07a8343d74db607613af12071bfdc09d4568a1691e0a225e6fa0c22596b41c2de79449286712d4c4d030ba3c42aaf5ac01b859e3b76ccbfc369c4ef3ff47a154db260613901a0776c5509730821c7951f084ccc171b9d13c2d9756966869498fcd44408ed6424f385dd4802f024d5dda82b04c0506743bb6babb11cd99217050543f411020803da5226a048d12545715b933547620707250df70a5ac3d5eeec916b0f6b6cc765ab894a6eb7057bc823568cdc7427d59825f9a78ec250bb789651e26fa93937b2aa48182784d3e34a3f57f423e03b4485ae5da586c9407f88f9f23fbeb45baa023b559fa1a56fad09fed7545e4b124ca3d3f7ca378d64fc851829e943184dd9110646df0cf03b1d3d9e2b658cce91bc64099fa06c3a683f997e95656c29f93dd8024c632c5e6bf80756723bfa9f12c32dbdf55759d65920b8537fc5527e234360e1c4c74a5d97f8d88f2e21e79f8a1bdf7dc4da37b21efefdd4c1780522159e040c113abffe1ac255b7042b726cac213fc33e0674a1e88a8bc71bde7431e4592518a9c67f0b0cb2a5df81f42e51b6f84763b474e8dbaa9ab8fc630f847e39c3cd130aa4469e8d4bfdb4e389055a611661b3438031cad4044185303ca2eb4f7208e77e063246c8040d408c10976e657d1cbaf95e6d72780c90df73e81410b9a3a0b456f258250d0a142c9ec601ce93cf72c37dcdec63ac5e88d497e40a178682abfc23fb7015a7033b3f35131bb97799e7376959b484be453e0e06919b875eccd0ca6760944229c947863981e435b5a8744c2cfee4ec7c90ba125e53b4bf126ddb5664a84e2597212281a3017512ea4be809880ec36d0e9ea398f8586867526696a7652ece268b887ee75e46b31f0fcf4db6215d98cb0ade861cd8627918f9a9dfdd74c040709bbbe5f9c6aa47086fe3d6bc78f2672c84b40aa5ec879178c0fc40320b93886f4c3030aac45bcf6135419c2b8282bbaeb5489b1b2228184877d73eac3bdfa57a7952621f386b7a54361f29b49e3b93c2bb44bc61f200e0a38883df0bf587e731cdc04fc49daa25a105cd996f5dd72d3ad3bf18356da2729e48bec1367e6b5b63496005d15a4d6de2835388a0589aa8bf54d53aaf4a1290bf479cea1f4c7b2950cce616a1af25918a2b68e0fc105d60018059e9f57d60a31d5b99f6363b365638765d87b48e1eb3eb94269727c78655e0d5c6324ff2f20de7cd1758d969cd84822ad7729740410c49c2c256bfbd6fb0e4708736434f9ab3a3bf621b9f0a35359a82aa08a88edab53b5da60265e3c8a56b5a1db49d2bec5e790bad9dcdd5e7a7328cc818eaef593c51755165bf3a404764970f411002ecd2dc6bcc72d6a1a7dc6881cd31634d37d02437653d8326a6351dbfeac7c56f892e6eca343c3a2d4ae64ac93e028eefd0412850ba56367a59e66a683524c4f43188a38a7c58278bde338d4b1452c35d3bb27275cbacd0fcec6944ce0aeafd7f7237a71413363f545fd7057c29749a542029696faba371ef87212296d38760a6cae579e6afc3d703ca2cd7aea1ca0b522b1856ea0c572cf00bb1867fa70603506193983d38f443b0865a89f133133a209f726feae548249b8c12f7f263f72e53ecd8ef06877173e3b2e33903ac0aae17c588d4f37291ae06512605513aeac9f51d3241be14df76b91f6f85ccee0af62cb068c86c6ca2a691c9e26e6790079e66381a294f53c80f5cb84ffc97176e88742330d8562f74dd5ba8fd333964d3f8f281ae534c5e90aff03c865d120b7f5301d0811d42f9c43fc91c9257159861d699a4014913b2810dc5abf08c48b2af51e1eeae0b2e3a2e82649c7f6b81d65006dd98a6315901b9088808152aa848364dd792344a5b253b9cab61d5145a51bcd926e57f1292562db1f2e369979aaa7e63747d3452d22fc924c8f0a5d2453376fc25b6ecf6cadb7e272b9d4305b2d59ac4892b9e28341ec748bb0681c2f87e73143d89fb76fa564e27967655044010d4543dfd4c602f699be777d2a5302d59ab67009fbbf2c9aa1088a1c3864998e1afdd79e14d5327e417a7812d11ef17f5ab536b1c41f64abca8c7991f3f3ab6b4e2f231c4ecc6080f293898292f7800a9c90df5703069542a7ba6d0e05d7ab76d907e2fcf6ac34524d8d3ba2d400addd9dd1be7b8b1cb3cf86826745df144be6ad2c3d3a2600de4318d7189a2fb048a1583741184d92fe9b7c71867eee8a3bff258a8d0a4005b2580d7c5735eda56d258291bd44a2391282bd43d0426efff2796383537c3a9bfa174321000da8e818ab575e9ec1fdd10fa18b2366285c01c18fbbb3f4b45f4bca142d0ece67ad5b298838920fe5e4d64849255bc7994192fc15833f6a5c369465a69228567bcb997fb6637b1884123f95bcc699edb0b480bf2f2744176040ea4f616f1ca8c6f4698b0f5fd17671989b2f2a8d09d918e78353329d86faa0b302d0dcab55d4ec58094350e855c9ee73edd251060bbfcd38c21635d6c9cf4993000ce5c6100dde90a2229814fcd7e26ff15e6bad9ee530315c6a2fb7f1f6a9f28757fdf4abe2ddff9a8f4ae2b4694348f86454131b4c2ed2f25ce17348a814690642e53a30b06f38788d71aa901726626d3820f6e97458e075946a7d5e863d87c0169db1c55113ab17e46a8ebc731c81996d9678c4f27be545c6e88edea0b70e49add6080b94f90831a66a5007c9b196d154fbb30ff801028889e22e1da4dd57d587c52bccbcc7a41fcef353fbb6d7acba72ad970b51bc98ce56fc6eb95e8566dc003039e00c5d5a7052458b5014110f0e551c310c8ec04885ec313f6d806f4edd644a46d40246d8c3de5d6726b8de02a202f3bb7b7018b14871bd02fb4b801857296f1b685ccb3b577e5f5b4cb8dd269084d4314b6d0d8703aca0d28ab983598f15a4c3bf24135ab17086d72cc4e6ec0eaa43cba074235b901a956434a83aaf8bf4bef06ab6b976b0ac708a044d492b3ff6aafed065c08f73efb60493c04d43a961137882001b7f4092174958ecffd45d53c4ba7b9e17337e0d1ca7ca83e27f7e8735938aa236e697180334cb6aec2a19a3d7fa818f9f94d5dcd5c3d8de1c69301f1ad9e730fb0b9e0105e0682cd7236bf83d36405ab200e6f40ad7fd29bb3ee15667d1c486fdb59606f406028298a083ebd9338fe5fd963ae402e3815a4cc49db5c873256795864085c2fe4c7d6c7ec8e6af6bcb16edf80bb5308570f7e3c7dffe1f6525ed2be0101f728e71e4e1195e28f9f4a2c9759bd34e5f173afa8e361f14fc001dfaa49073860414a1f2349810e1cf0dc5438ab9a7ce44db6faa742626df9aa52cd5ffff980061b0ee0d3f9952cc873bafdf068507a2b64f3b67726227d9899a4ae8cfeb443986f50e0301181f0e621d303f9a36c1cf8a665e074cfe4b6f22f51e02a0f85c79b068c3498520de2968bf6892391b3c5267ea77b65395d39dedcc03b5764faa3c48516cb9d1fd320ac76f83c64be7ace19165a744ca458737edd85359cf3c3baf5cd2c39040d61b10bb6104a478b02f2456e2de4fc88e7fc924c1746d9f8b51028bf9bad7fd9708862706e5b92d0ef57513d35dd10a7e503961853602570427105ac80fc0caf54868d54d33d0acd21032717d46f7e393433707e0506be6069c5e1713838bf04aef27525045f69f2bb7d52cc7de22ac0503d54ca16ec0be727a4e1b0e5bd882ddb3140e1977dab4a52608b392ac2ba6a65e4b4e1a891dd3177207dda2a1c172310d927111f4275465eb0b2f924faf6907834a101221e6073c4d5523fc8a952b0d978e519e636e67df7cfcd15b657f323c2f451ae867d89dc8a5620793ba16cfee69ca9f9c958aaf9a3b441d0d014e0cd519b66f2095dd61e8a53be343f5fbda5f96985a34a751d202e15b534af994bcd08cacdb9a6f98939ffdf6b7d2cf5ca0a09dc63a119035dfba02049155ccafc90a78c01023dc5bab9381044d6a808117f91336b98677e32497a3ff4fecec83aec80df8ca68714bd7ade18ea3b3774d7f2844ce40bd6dc0385138462e885e8954f38a030bfc31893af99edb5a634bd8b0210f32370bb3644c4fc4040df4ac548626841aede3db7417385f4111ee5190cd711ccaf836109c6607eb8b9e9db2d3adec207f262cca1992168f2168a1c4afe86b2ab755e82a671fa4ef7a24e664f174204dbd72f43f01e205cf9c485eee737659127c8794aa37d25a37a53d6050dfab97f433433af12e51a77b5b7e1d957eb38a07f06f0ce1585c18020d9cd019ca51dd6b79d80f0873864a74c5274439b08ec4b5c9bdcca2b1132820c1f0a56c36081d48adf9136e9eb56ab8a4ca760e37c1d2a56156b6d935f7a7ecade55b77348f3ff53b8528eaaaaf2cb414942921a19a860a4714e3e4703a539638f0775d5268979d82c3555a93f4eccf444698a36ce1f41c63c0f83ca7e705f1b978b9a928b7c0a2c2a976cfb99b4a1b2afb51cbc7bed15860351ee0327539def2b9a0ee4ac1cc8cc968165575092a6ae1b2751526d07af49c5e142642d836d3851e8e33d804924f8ef690531cc7647d07faeb26007e73c0d0fd7f694c87f486b5bae1dd0259918197f0fea2c57a61e1a39a907627e6d623b1b69890009d68ca48a594467581a11369277877332462fc2238e91bc23a40aecb6e3a092f3f16b86bcf55e72f2152f7826ac4f2f0bb123ba06ffe3fe63470d23ba0e3f2692436205627fd0133e07c6f3204b5f49b569d5956829da4e3c8cb3e30be5a4a2f7f0554e10979b13fba0f60688959a2385941fc4594669ec0333687a74492b0db91a2ad31512a9b3e37bd85494e50e7365f4d2bd405a2539d89c8188e068a7e98164f2e83649dc4986fb6a0b6778df84bb883474a16b6839cc932e250145e28453f6b0e9de59b92d39cac56d031f47f8945d149302a560e142501cb7c0b96ebd13b0b5cb499f87907768e8eeeda330fbaf0ff2f851f8fa4b674ee4d31d1cdc65c17aafd9af83bc7d56a4b4f35bdaa4df5254669257b2121c4fd745ed933cc79cb227c802ed0ac45509cb59f3926f3521cf8783441102c9a5e7c9a350db3f8f8a8840145b5953b1e80d32ddc547f18be677a30b3a91236d21767a3af89a1b91339f570b62d9087ae63e6cc6cd28fafff6012781f4abe342493c0a1cbf5a75056ba49d931db96720ec7941e76fe63dd41428cfbfdb11250befcdf449ade77a3ce78b1c87a1970d92b04f2786cb18e968cad656466df99ff2d4eab92d45f57b43ec136862be68d7e09a39f5eb08f75376ade40b661061af7e565a0aaf8249b904c8d2dfcaa034f6a95fd7223e22e57f34f5eb88f689ad297aefac56546687d4b71d941eb7989e61222fb5ba4e8b1c20281a2ec6ecfd1b366d401017a9044ef3b0387fcc11ff4afd70c1d6becef48ef98413cc067ba61ef256ba130ed125db88f2c2500647d58e1fad3763dbb33683045844d8d66c5fd082879c2918c65354993e43ae288f0f02db8433ec8af270072021918f36d6a297388bf2d68245321e5f0540e11710b7bb05a389a12b7227eba895cdbd115cf7054ea1126e4caa09731c5809540df860a32100c5c47389e6a81cc5bd5d28e79449b54e7c7e6161048ff1a6c0c495e5ef507362fe5253b714d6438db148f76d5a296fb22b7ea10035fb59ca1b12737a777d5b6c7afb2f75c9c2fc26b40e9396d5ae0162fc7692939fd5e25ab22ed5a430856d9ac206679cf28452c06cbbc84a69085d811116f94aa70d2127eaba2d53109bdff22b72ca2b1f35ecf64dfdb88e06a609fa8b86c92049a283c8bb7687c419a4fcef84d236dd69f7cb4f1e69cc85a35ca37d7e49144f46e0318df6276756bb1a2ec12cc8816b240c1bf07343208523fccdc43ca6004cae58c8dba3586eb7148ce9f404d9ac4e9333ab55ded8b500a3c05277f243145ae561b6a82a680dea2aa93bbe688a689c8765076066fd986f98d511eedf28e955522720fb8d312befe5d4ea4857d1fc5f0fe3b7a9558668c819dfbb1014084bd606104fdb5f9d122d9f4904a05227c759152d3d9d8ee0710e02acc3640172beef67eea43f555843260324a8efb41205b5db6dffdf9a8aee72e990ed9e8412e9b21c6e586955f78354fb31e74f28df113a3cb3a680dd1fee2399f17a293ee3169665da0da71a911c60b5ebe41c1b957690279f01e97499f604396d065522796919700f41a514a2d94f8a5140ba6d8c4b61d6cc85ab731a7df2b491642a618636646e7d31ba33ab5b4c17fd1fec936d68b8ff247a0cc07857132890be5191bb0580872c43d60da062aa149cf3936f89469431a012d27f6f4329ea4c485920fec2663b480d402bb97be3e9cab4533df786c57a13ba83c693fe8e7bcf10e83a96e0a8ccc57541d30c0551315e08d8a50a465020ede620806a4a5c0bac11441326cb58d534281ba59d63f0fb8dda6f877c71c768f93e12fdaec34352bf0be32671b8f6003a0a62c0077d048bd8c11e2d9c59d14059444cf16dc15e718af8a573c62ae2af0c4331d900837e5148e90c4ea0ce0a4843f1ad290feb88f94a56f3f8cc05158f90aad838c7382fad5f5312442b14da8777c907cec27969fafe6fae6700289bf6b247e89c54dde02805206883769aeed2eae4a2d9f044e174050856450215859bc9eec131a5c0fb6243f14ad055c76c7af9485b2ba8e70a9560d373e94ed285be168543de8ba2896709e154b5094583901e92604b17897946a039ff58cc9262c643784dc800d5ede26c454c07e0c58bb8d320d10bef121a36589489373382036bc033fa9bc7295d41342195c92a003ed2502020d231af5be8049966295dde1c0820fedc3421f210d86ef3213ee60c197bb3f076a5b06860586259eabfd66c205d3d8550d3a20cc353225955877c95e44cdf4a7676f46c25c8ae8e18fb73eb0ee097c19de7dd34dbb6b426e351c51ffc3980ea0ec319caf8d605447fd6944d820c62ce8a26c36cfcec25a8727b8168978e4f67b867f25c97de0063c2dd57582dcee74fa6542ef792ae14e4c703ba2047a6531028ed6ada01e8550a9197346991534540b728c0a0bb08271588b3160c849188096ad0e414e9e0881100ba808102500c88109952139bae660edb2c0e4471085a0a19e288f7f683d636b1465b1249a195ddbd039b0a180ada0a1308d8e48a573597a4d4972280008a4d2188200b36595959b228f838b3b2a82deb2578428237a32697cb0571828f3397ab926077afc38d05bf519aae132d5275289639131515d5041f6754949438c1154e4d4d4d384cf07136353d3551a023868f5349696932e950709b46b6699bb6307c9cb679444105564c915255b5041f659594abaa0a2c20f3e4042925a594e0a3943ac102da189dff9f25c1c7b73b46c309eb10bdd62ebd7e054276505fefec2956a51bd69e02141fab9a5eff4ac91fd9eb5f285a64d3eb447d9eea3d938380578cc2b4631a039cf08a2c48ccfc0b40a1294601c3c7ebd4eb75a27308fd1b4e9c1c0c2068d1cf3720948814bace79e79db7d61acb60ea4fd1663bb42ca10aedeca473d2a953ab0ef32ba5945617ade2acb5d65a7beaac624bef1e13e1dfafdf8e9de8d12fe78fe6cff3e813e1eff46b518e10a8e2854bb098ed970e4d975d36387086035bfad5975eabf7dde7fc5a8f586fb0e5e26f5f6fed7371acddbe4b6c89e3edf64171ecbafd2d8eb8dbd7e288bffb07a27ac664fefdaae70dbd49a5d580992ea44baa37c6f4a73e521c67e84f69546ab74cf05bf1df35af0eb99e7b559776fc6e5f268b8c2077a42c2283a8fd1286ecb7d065af9f7fcb2236c87e4cfae49ed0014c81240e600a244a939d72d1f72e594a0bf3b8f794120c59ad946186764e20e69c7b8a29d4c0c79c2e5da0b4069e020f9c8a630c8a149cd62a4a3173217b6e28e5095d3ee992ca905299477dba4069e1a8d3a5b4f2aacf4fc1c6e719a91b11233421395c4371e2f72a47801540358c8062f4e02e68188bcf55c8ae145c8e263992e438626805026c40a27962865b652e048994834d1f65487d7c2e7da485e9630f541f8d9ce9a3bca5e9a38cda80551fa5993e6e7b35ea5e54e95ca23514277250d883cb97584b6ab5c52a8b1c363982a0e0ca38dd01e3cb639388bf5d97efbd17638cbba0afe12ae03bdc85322298e8ae0c9f63b2984c1693c5f8b3e93a4b69928fdd0c2f3d3c37f6175858b25228485cfeec6b38b38fbfdaaf3dffcc624f4f8ccb32e732de73ee645c91e1d4f5eb0b9bcdfa8bc1c048b279ea9b9bcd53c7be88b259e6238ca51f604c01c992857114048c2bcb7194f6ec8bdcdc3967a43ecf4210c6539736cb22f8a24902309878174aaa33555d529ffc948342d4d502b7b7f5e7755ec69d6d75af6b776db5adeed140a1b1753de5cc52719cd9efe9d6ceacc8a4f6c8197df97f432a32a9bd87d2a4fc1d557762324e8dee95d59dbbafec64900dbaf2691792fa7872e2c0bf9f73c63ac0c7d84ecd332765108e3e88826065f7f44ca23305fafb9dd0df18a90bacde850d84f9724aa942fd2a5ada81085f97540f2d2d95166abaa4d2020d95164c6191ed5d14d5164c4a966a8b232a2db0ba696dedf4a9d853dff82265c4d5d2cd5ed92d90244f17266617fa46527da3066bc775a373a1c1ae2cf2ce8027e62b42abf161abd102827bb4ae5c6d7034af9616b04dc54d9818113db6a71b3374c3062078c8e408a206ce1e6396450ef8044198089624d8d2c651f8ed21ea3b269843070e0ad8a8800d342c60a30c5a183b38ea828f0c0652086183091e30197819d209d1a39334c8b2011b461cec41a4cbeaa0b3c3c7aac81b463e343cc864fc642f8e98419223f341ee09849c1321e49400ca19d1735c82723e0020979424a745287783923d44c86384ab25380e12dc60924609dd192678600420aa4957e6842a04e0e4444c0d23f16409852e88146e0f50ba1c868ea2ac51830a7a0c00dfb1c21c048083858e8d0278532d8c6180eecc01b640401917c624e04901502c8009294930e0cbd8852888293d34e0263920cb03d4307a610f2a5930d80101ab220d44a0cbc5808604ae1932484da00b0a98a90099199e2cf0040d61aa2061eb966a10c286eb839534928cd2b065dd90a6eacaed4b63b1a43983c53cc2503864a72c69be2869f172404a83e502b90d06f0c8618e2433683c353ae4343ba071e60a1ea6d822a607237cd8334403881f725042e306203c36417c7608e1c5c1858d21a88810a34be662c90a2f5114b184119f972f4a4778392081bb01cce701263b92f0e250a28d25d00883460c95190cc50414b6093358544a34755f9ca05a7a620b1454494e54465160b5218519355353534c454d41f1a434c5443330a53445a998b2e93baad8333ca30a6a0a8731062c432653610514371ce68a33b850a53249589c71d4e76f337b86f3025c52999165061d7dfe36d2a4a11899314365c6c9034a299d0498520ed192ea1ecab116693378efbd7b76f71a61dc55c9b403fbd75680678c39fe9c31cfc1f33ccff3bc2c3b24b297bd6c2426488242765b3b9dd81dc61877358df77d466272f6bcdbc9feca6807b6f32c7f62d1dd8ecbea8e05bb3bdfd0e08b3f96f9bb17ce20ed7939e7bc33eec2dc39af475982af5d77bad0e85ea37bbbaeeb82649e53f225c157deb13348cf8dc1c8db699911c6624c5665398c6d1a85065f7206698c31c618ef2e94417a4a595ff5b336ea3a6bebd5125ffbaae2a6b49f94c25146d2446a9951c6d1144aa3634cf551565197109d8e21d5e94fc112e34bffe9924aca4a1f634b97546318750ebaa40a43aa4ba13e435ef071be055de2f6e022833a7e6d831003abd397228655a73f855af9929466e7ac1d88d268d7a364f6d9c957f794d689b32b3251623bee7e56dfcea6c8a4761e03022be51f3c1ffaf85076e0ae1efaf8146fb0d5b93cdce1aeeba88f38167d0d5f07e9efdbdab17842b77d7c32bef4c9447d6618eae3dad2a9a422834ba75c3a7d196a91a1ba338fd41ffcf489a6bc508b785f8924cfe7650c76b2756da57337a035c6d0c3292fd49d5a1f06db7de855943274063f21079634b73c6372300654197a50e52cb84c4ff2d0afad335c4071f1d477f6b86842d2332a33a4baa432638d1ebb40cf9f721e656124ca2f545f6c6150998144196e9441c68c21d264b5acccb89901c5e754c617f6874ea10b3edf950595195af2a8513ed09f09ad84f6281ce05bfe6cf94373e4cf2ca3730ea23101e0a0fc53661ca4750d6994466942e80e7d2495e3a02c46b1835b5c75d4e0567c1c243f03a1a97d21bb06b75de2b2a67a7dfb435ff0d9c75a2df5b1350a1b2e82ccf59a6991195467ad5a2a4e0a2e39f247484fa2fbf633a5896f456b7df87a15e51c427fe80c6ea70f143df8687fcc7de7c89f9903862c9355464d992fca34596b6df6ca2c9551eabacefbca1c61f59cf3a7af50437585d4f77d9fdeb72b9e6616e8b98c2b98ae58a2ba22a9c7d2204121392951ddd050dd9e78c844754b9269cffb2f635c6badb5d68ab10da9e08ec5b1ca124abde794264be21fff88baeef1cf233f6ae8524669fbef6b18985871f6c1406509feef75bf9d53daed5bb4fffd6c49f7fbb758a577af5f7b4bbaef449d6b7fc8dde6cc654febc1df75b5bb17e7ae8dbe133eb16b5abf30d79d2fb4b403aaab74eff38e8d6fffca2253eed897f67b714ab3a21525ee63ec662cb7e499ef013251646e5c96b82c297dc1ea49d467cb4efd2120f8c83907f7d0534d7f1a57620c1aeac2c10a0931864bd7915463b6f4faef928f421b6e8bd89f3f9b5068c3eb4efd8c82151f737acd45b2fca9b7230d25d50395357d4aab22d86c9f2783cd066e1fcf505434e5cf94224a9bf63b221409a5552294569f8a3d557cfcce23796a1685481e1c8e32ab0b913cf55390fafb554c434b1d9dd54779cb34a0ab5e3fc9082548914269537f0b52286ddec7579422055452bb144aab2e5ce1a3bc7d1fdb86b522387d4d65dbb0e685d3d7306c1bd696387d0d816dc35a174e5f176d1bd688e0f47504b60d6b4370fa3a866dc31a174e5f4b60dbb02604a7af65d836ac05c1e9eb096c1bd680e0f43505b60d6b15d836acfdc0e9eb19b60d6b3e70fada02db86b51e387d4dc3b661ad0a0fb61d6ad0c186242b39186d1bd630c06d58bb00b7610d89dbb0a685dbb09685dbb08603b761ed88dbb08685dbb07685dbb07603b761cd88dbb06685dbb06603b761ad066ec39a8d87365bf6e8e1033eb0f9c1034a7a00d18120b284c8830b1e43ac2102abcb1d4b7678e140115746d4f1858e23e640c20acc0698e448220e25aa9680238c06c4bcc1849a26dc686ac309369ec841b186931a51a421459a29d078c265808a8aa92ace80da36746206b7a19332b80d9da0e136744206b7a19331b80d9d88c16de8448a338142404369d8d08917dcbe1d4aa345922440212034b4d83674c205b74c40c1da22aa89a86d43275b70fb4d5c98e1840d6b653ce14513509c61c2e90b31518011468a309698422a093198c6004306125594d105aa8c2f63407bc612283487c29864ce28c28a292f545dae002d8e8832a045638834db864eb89801ad1af3e711a0105092357cbe0d9d2871fa7ae6b60d9d6ce1f4b58c12c35d2d70464d2570776794ad748299138979c4fc32d990b34dab7b2512c89f4ebcbb5ef5fca0ed6ffa3d5dec332a92808b22882e714e591d8325e4a7e18861e8be883e1579c118a8e04e445f9620ebd48ae3acbd0ba9c836bdab9d8885fe82ef212a1e8120bd28089d40c619557589b35255714715775e87f1eb0e14c28f339f5fa7e7791e7eef63d51395d427baddbcfd6594625c41a1aed22be69b018d1fe3d7f825c618632c85d2f08f7006638cb1d7bdec7eb44f612816f5196d53c78fdf36bd75a2561d3715f96e666151273c706a35ee9dfb783bd65df796762d412878f071771c559bccacc9a64e2c6a247fbac7f4037208bee944ca46f2e0b7e2f6476ad5892814c1f3df90763d6fd4a72eb9f3466938cc10d4f8d12bc933071f271635a234fc37a4364ac30f543d7a247feae39f59b408bda23bf8f14f2cea83833c526b9043f0e32d7f466ad5c78955c56a933cf8a915a5e18fb2016ec5719ee9f8476ad5f1cf3314a3e9b86235ddfe8c42c10bef3e8fbbdbdba7060e4b531f330e0b9395f8c7ebe99eefbd2e25cf98bb1447fbf98918d1a1c5ec7c2fa432c37d4ca5ce96108df7a508f4bb4ebc9fc614ce0ad3d41d2da2bfef856ea7e45f383bddb176e6bd87c5ee8ad2b65064b980ea8172150667450967c3991bf0f530fd0a5bef857cfecb062efdf5416c40aa814ddf03abd7cfd1e1e24885f718665d3fff0e6c02fb9738be5c3fe6d91649a8d2f58b3fffd76bdc2fdff50a5fafd6c3fe158e2ff4d777a009def3d78c842a7d3f773d7f1804aa7497180109fa1667fa895cbf5f6f51bed0f9bfd0610ffb71bf60e10883892f91087c974814e45f45162616d9d78bf39b9b9b9b9b1bd8bff60dec5f3737fc61fbc67beeddbc5eafd7eb05e50af6b3c39ef39fcf390c67e50867431a0dc3d56095f3b3e72fa9ebf592be5e0f545f21f83c1c8bec86c1603058d89a20095560b09be7e1fe57585d4fc47fbf8bff7efe5b74fdcdeb812a2ca4fd050b699fc11ef67afe2ff0b9087e91d579a14b2ab84d9b3657bda8fae82d2d668ecf9beb65b81b94ba7df944f371371cf591e36eb08963ee326f106794d56319d050e4c0e180cb7294e79cf36f9ece5dc729c2ea4bbe5eaff9b01bd8db778930318b44ba0b5657b50f83515776b95cb0ecb22fc06cf7793718e70982797c016b5a5fafe7541c79878daf075d4f4379030b611f0b616fa98feb467c3d3825d6e9e7f1854e048eb3d396086e1b93e5bc0ea5c91e4aab02a35f141ae78f9ad201aa3b165f9cb30b40b21bc6f8862eb44069f68782e01688d6168cf4f4d068ffb25c143a72f78a76490a2d758a78634ea7d51d7b7b774111ba9edf0b93d01dfbb46af90585ae785f4b2c274e9245202bb61010a5d9a751aeb03c932373638aec9c23796eef39b4fdaf7cd0fedad1eeb5b4725adb9292a7be182dc2303b151a6c5dff0ec574efd5dd85bbefd0484cc7bb1056d60a61ebd6eabaf16de1effefbbcf994964525b7635147f2d89f1f058fee639466c1269b539a958a75afcfa428a9d8487549c5464d8f658053b2cdfad6da71ee9c19474b8b5616322ac99936974c2b8c161877ccd34e98ba64ee98a741259199eebdad2ceebd57e6cdefe50b21d224bf15017fec8b79b956dce9dcab86d55049746badfd6dadcddbe68c53f6d7190ac15f5fe67005bac6034d7d946dee8125fdd65a6b2da5f57f822274cf6335090da5ab98922315668e36e7253a7d4ef35864bb7c698decc1266acb8e42921d40ea234d56ad8c3a8026e6da4007cef44c2128ecc14723af23cb994ef02993489ef9539a40ffefc7e4d34b86bfeddedbeeda31ec11f999df03beeb3128e4e2d3355d138d14e8ea40a1964bb734f81264a2c5283340943673b4c890065f0b6dd0dbde66e289468878fa3da14fe30f7b387f058572ad5807a77ed7d518a7555cb3cb02850ef091d62dcd86944ebae64b1fb94f75c9d1ed1aa4deca03bfbd53cd9d6dba38039f68ff833f73d7ef85a30ce3ee180cb7a7ab742f2caa3d8bb38d39e44a7542d2ca5b1d5a0a68c89ec0e5d4baeb72a767adb6d7d721ae18776d7bce0485f44bfdfa6768b5b5b1df4f41a1bdf7eb307f0945b52f993fca282d94b5feddfdb5b5044d779d9f08a6f523d4222d9108a544464ba40b1f73cfd9536263febe0745229436ff8af7b798a42726e4d689b62727461db95effdad792c6282d47f6319637a5d1caa45edda9a44005af9fa35356554c733cad999a23ea09649ae3888d129b23361f40b2ca92b2881819358792d5192b282b27acbef4d81a3ceb50b2e07444f509baa4a2636a9c92d3ebe39ad3e9635152b0899899d40763e388034b67ccb75e7f4e8d73d413840302ce4b20bd5eef71b6a82ea9da44b5e1d2ab12f5c1555558badadbe1ec7d1f888921f789444c0c32e95324eb20745cd5d3bdb709de79845ae9f23517367cbc49596cb2ae91cd59353b70143ec0476bd5eba3998a3a03756b72fac2a4c40529c9d6ab11565695559a5eab5417aa5150a0e06335d3ebcf1aa63a7da1b45a997a1deb975e2b9739bbba5495a8cf0c237fc4c823980b39a47efd81fe90d447dbc7eb74451c35a7e096d2a88ffcfab88afa8c52c491828f468cc85b1c6afa789da88fcf12f51971559754719ce9b557ac86ead9be2198d9e38447396826ea1c0dc19660f7f260df0d8e651ffac7061244489fff38ef0a758400014324494638e1492c5ca1859b50ca14585824836d1a851329b4eae3bd89d7098a1d7ca453b962511f7ca666511070be3e56a3a48476ac060f3e56a533bdfe88c9e8f525ce8f584daf8fd1c82294a96232e4cff715a7e9f5f1197abb257125fdb3f0c55d2f5be07e29d5642b8e2563338d6813a9676ef9a937f8b2b65c41fc5f2fa78c707194523d2e719451b41747237dd2a99e292d8eb43eebe384f789698a5e83dc9be4a9ef85d789d2ea4771e2234dcaa1519f8fbbafeaf36b8efa8c01457c895ada825bba40972b5c97aa3c96bee4e1e509e7458925ac38966e4b6d2c4dad2922290f2f485e8c969a705eb81461f392d5bd5475e925e7c58cdb2b6e49aa4bdc521957583b587589d321eb4897381daae816c9832e713ad8d0713c70e912b7039b0dbac42549751eaa78c8e1b638e1b684a13f65bfa00960eedb7aaf98ebce7c30f729a802e73588e4913c6be68fee78dcd63851894b7aeaf96915c7fcf50ccfb277f9eb63714fa2fab58ab122dea9ad864e674bbaa72f42f7d4f342dd6d8cd2ecd7e5f7da5df73326b488774f9cd96cbd4a9fdd2fe2fd7e959eeb2fb94f9fca2c1d7ad697f4ef7d49eb65426d36de35a62f657447f62b8b7872a7be7cf5da064b9efaf27b6d4acb45bce35f426d35742cce98d0ae88f7fa4512ed41a987a3be25ab8f19b7450edc965c0f4db81e98f2c06d91c26d3183ab02578511b82a765843ab8004eecb17dc972e3326abb22a49cda424259acb55559bedc84a494dddee768bea3d97abca4d4d4f9e94d4d4b7b4c4a46ff776a39292949a9a9e5ad8663b722d2d31f12b7c85b35e494959292fe5a5cc04fad0b22ec8ceb66ccb47dd3ec5f1663b877336870d3e62292c85a7bafd0b418e8ff8866f38aadbef22c04db8093f75fb5802d7e3249c8495ba7d2f848957571374b92ed75575fb5ba793eaa4baa96e1fa4a0bb75b72eaadb6f5520b3a05bea963aa66e9fd3663b9dadb37547dd3eec82ababac6eff06839bbbb95bd5edc7845ca92b65df074f98c16dba4df6810cd1e9b94937c97e100daeeddaee51b78fb3c1d55556b73fe3c0e66cce5675fb39442ee8c0deeccd4675fb11f8f014b14b76c93275fb6fc426d924abd4ed871e589bb5d9a36e5ffcb9bacaeaf62738c201922a55a5ea54b74fc1073e20eca66eeb53b76f410875a92e55a66e9f06549392eceff40b82900060e77242928420b46fdd66a0640d3ed2a6a6215504bab4d43382d560891009fbea8a03262394b0a5a43a30210d3ecedbcda706200d1f67535391267369c9c8090110c0be610d8d1f27fb86d989d2ec0b00149ab57dc31a0e897c82c60715051c08293c998102a14c01d5a1337a1435f253be0581b989d26c56610f60dfdcd4ede7a8fc447dc61c95cfe4a65cb79f9d3294adb449cb7b4b659b4eb0842cc5b383963a636d0a6b6df09173d9fca7d19e1e23f5061465a54e98bab916645527af5e086b6af8386dd376e4bdc1c799943495beb9b43499f46c6a7ada70f071de6e33aadbda151f676ec2218bdcbcfde986f4b17f23561de4905947b74b52ddf2d046ab6a5eb9e6d5cc72c561e3361b9723e96593945e1b5882d125269855d30d6f4a7aba99e316cb373a7c58a9291cd6eae055079ad33f68aeca8706f848afe8957dfdc30d3e565bb5d52255a956fb633deaf6b50c7741be5bdb83d7d73916828e469025f87e872d29f209603a310a7e54f0010bd8d03cb0a3c7051dc0204b481e3c7864b066480f9606776cc0811dbcea207934918dc31a07f8586b92fca93ac81fbc030ff2c77bfb758bfcd16fbff6507da83fc89fefed57a50a84fc01df7e0d42feb4de7e1542feb8de7ee5227ff8dbaf43c89fd7dbaf44c81fd8dbaf5de40fecc55d2d907e796bafc31288561d248f7ddd810555dc67c716c1c0080ff560c8fcd1401ee10049071f1401c183108e007d507b0852dc060100034984948830c2921c4860528209016872820030e0a4f604850ba4800465288a0a035881002c6829400b063800025c4880026e58801406681989a634c0010f7881ca0d3040a0484b046290800c13a0400566b0000d556c3560b1c18a51961bae6039ba8243161cb4205db900067248d261071eb6f4e0c30f4a58800842882c5c8620a2cb95252f381461c4952f47200186290925960823060b135a9a6872e209289cb04421c514599e3240451557a0c6602163050e372c5794c1c24c165a5cd9024b94162ebaf0e20c962fc0d012869418639081064b19f7491633b29c3145a505a7050d2c69b0a481831a38ac91bbc2c69536b4b8a1450d0e6f1c69008e2a2c716091e3ca06ace6a0a38e2b0ed87107d69a1bf0b8218fac0ee8e101361f987bcc36b61a6cb06274c3152c473864d18274010ce490a4c30e3c60d982c5871fa812103608212897212c115d96b29722eae046187db172c4c6e1131b78c5e1931a78c5e1131baf38acb5e1f53555a26e59030ad524c9637f080efe7dde70766c7f4a4d29343589fa489c96a46ebf6ea95c661cb36ac2313530df986aa61bb38dc9c6cccd35a61a338d9966a23171936a4ecd33a619b38c89669231c798624ca919c604637e31cf4c2f6617938b1935b7985acc2ca61929a594730929a59c454c2f524a29e71629a59c5a661629690e1403f40214896aa159280ef48862a15768d29c78cc35136bde31ed981c9857b38e49c79c635acd0d4c39680f2deff5ed3a5dbf8f84da142484c6f676d9d31b74811eef5e187613f3f103882c08ceeca300df0bea0af4ef7b7f5f80810542429e0832e001856e06a01008864fcac0a1ec78481b6672cf1a770b4f83dccde2db004d4f0618680ec8e09bc81843782e003b4893c168f988c18301cd55440d7edf0341f109197e9f636ca426c5bfbf0f86bbe3ff707e8d01f670d6e2fc1d5009f81dee1ffe0efcee412c7e5a042b009bbc401e2b8383a078c5cf780636e9fe7bedc18f999f23585c1d415206c90757d4f10108371042b0828e1080c8006d6967a0d0ed774cd028d580e29339f8c82d14a5f58d6932cba6db2c56ddda9b96f71f86c1fba2bb5f7717dcf9b30595e0d7b87bf735be5e16a51591d05267ac57bd3a69e2a3cc92c1369de0e33c3a4aa24ff0712a292d5528f83899989aac131fe7d3d3ed46c1c7191525d549c1c7393595c353f0715655cdabfcc4c79935b36c5e06f8488f8e923e2af84895949674157ca44c4c4d1b8a8ff4e9e9068ee1238d8a926a91e1239d9acab9ace023adaaa257fcc6479a45b36caf2bf8588f8e926065f8589594966eb0e06365626a8a99e1637d7abaf9c8828f352aca89167cac23d49caea23ea304bd7ead55dd8afac82f7acd12d56bfd8277c9837366d6051fa1ee40706904784ae0c9d73304a5e8aa13bca8ce4da5c04705402c084269b31d08e6051260104a2113f0503033b060c88eecc1a06ac0433718523590e2b473b06de84409de254fc56559eada6712d9367472049f6f8de0d367dbd0c9121f659a158a22208f44698116494277ead7d96ccb580443920768488c224218d936741204fff901828f468c20f1e0c891233ff0b1a78788061c2041e2031f6934213b18d8d0490f7cfcae437d9284f2489f40fe0040f2d4af3f45a0a1363ed814803cd6010ec2ae00cc3b2b846d01286d1e40db864ec2e0a0eddb864ec0e0f4350068a01090e4a91fc50300d836ac85c1e9eb24db863530387d2db46d58fb82d3d74ab60d6b67387d2dc2b661cd0b4e5f8fb06d58eb82d3d74bb60d6b5c70fa9a846dc35a14a7af996c1bd6b6e0f47509db86352d387d6dc2b6612d0b4e5f0760dbb06686d3d74db60d6b5870fafa846dc35a194e5f0b60dbb07605a7af9d6c1bd66e9cbeae6d1bd6ace0f4f5936dc31a194e5fa3b06d581bc3e9eb14b60d6b509cbe86b26d58ab82d3d743db86352a387d1d65dbb096014e5fabb06d587be2f4f500b60d6b5370fa7a856dc39a149cbe26c0b6612d0a4e5fb3b06d5873e2f47501b60d6b5070faba856dc3da139cbe36c0b661cd094e5f1f60dbb0d6c4e96b046c1bd69ae0f4b50bdb863526387d9d806dc39a184e5f2b60dbb01686d3d70bd836ac2dc1e96b29db863525387dcd806dc3dab86d5863e2f435d1b6610d0ca7afa76c1bd690e0f47503b60d6b4770fada01db86b52f9cbe7ec0b661cd084e5fbf10b8e370d6217f4e0168db59fbed2db995dcdedf2610797fbd2ef460c85f643b6b35f6baeebffc755d57b768999d4e4fbd6eed79bbdb99fa8cf74159ef8761c05fe4556f7b0f4477d60fe28e43fbdac3dd83baa33e32f943bddf5a6feff3ba9bf77b23ee5a6ffd407487520a19bdc79de7fd8c897daf7b7c71b660f0dc25cea9899e6db63b86b6b7f596fa8096fae8973acf3006adbac445d105f7d15d2f6ba8c709f4ef5da191ebaf88a11242c76f45b609e2af2be844067d6f65b609e246782806ac9ff5072aa9df9a40778556649b20d7b7aa95d926480c16a514f235e9feb33fabf503b7bd7fd325ce894b17037e8f430d0378bfafa5c10eec2ad855904b9e10baf7306cfd1ad4bab55baf6da9cf7f10a8b75e6b6dd5ba6bf570b5e2ae9e12cdbf2da55566af7e9ecd1977540a3de4c5ccdaac5fd72df167ae05e78444bffdd65af075673328bec6fdb3b97e5e27e6257ef4292bcdd96c361f82eac7a4e48e9c923bb2880a4fa82177641f5bfd471739d405b7d5da4a9f60b275e6e867f912a4b213f4cc4fe3484f3cf59e79e595cd34f1a5c3f8fbbeefcb5e16379843baef669294328a107cbeb455e8fad5092e435e6869e28273220dc535c57e688d28250fad12898205d7544e5a5bb325348f285b70896b6ac23585b1fd89e9deda048c7e5ae913592f7b15633a9b543153d14a4973ad75680dafdfdd50cc5d15c164af32b9a2ad62ce6fbdff68b7d60e71805b5b43234f144387c8783a68292712393486e29880c2d2236a8d12dd769ee7618c31f6249dd976b826d25cd0040cca4ab3bd4363706769101c8c57c4199c182531475ad4e09cb8c23d81c4b544b1d99c1cf913cbd183db1f63e2bb86bce0f32be812a7c41315c72a76688d7cdb64836e43fb2fbde0afad0c2be8535a19ce3a95568662afd6e23539d7ef6bcdb2aeff0b7738ce51168a207b2b00d67eab258ead56abf55df72d31bfacd2f5f740754e91f52c56d193a601ade653a86f3f7dc2d8a3d8a3547856987ad4faf87cf3a22238e9636fd2c745140c895c4f43a7de7cd07b1007831308adefa2147455a83e1f47744d4a54dff5f46795196837d228221fe0d1d33c421fd39b07faf001a488522ac01f2b85eaddef1f20b8abe8791efd713d1fd8c75397e889f5a738731979d90759e23d7d02c17106d5b1076258ec2915e34cc4c114c411478a449f0814c7df94ce6f051165e298f7b6aa2e57287badd545050545f00124dcff236c3d0dbb07aa5ea8bb98f8637e89209f73829c5241915c2e91c87bfce07e100427a754707196df551ffc91227597a8c2137c8aaccfef7e7f8b22617134822fa5e2f7d3234ac53c22fb7e0b0a6da8cfa354cc219d086402a1aaaa5e55b6f9e256b6fa4a3544baeda09773b65f44fbed72f63ca2a20de611ef6dee7ed4bfb7f8756211edf9472d763f7fda9e79248f44f2bdf97bf2dd8008f5c9f4e65bbbaf32030d3db74ef43d0d7d5ed7ed9947ee77b0cfd4251275ffb9fe3efdfc92faf0fb72892f223dc344dafd776f97c5d9f7dedb7bb338bede7bbd89bcfbe34bd4fa3ed14bdfdf601eb9e20801cf936abaafebba8ff6f49bdf86f379e8bd2bdc7f43bbc13c02e28cfffe2782a038ebde7bbbc13c72df3eceb76db7fafeb7c13c32c5f17befbddf601e91dd23d26797bde38ec5dcbb2b6e308758d7748da1f59d7fa7fef17b7df1e7fdc844ccf6a87f9738304a4c59bda74b1c53540773d431e81277c454aeef0efb2e09a704132e892b5c12375c124ab824a464aedbae5bfb86fcf33ccfbbff8544ba7adefdefbb5e9763611e19b1d7fa96387adffa117feb52b188f6d1fbab7ffef444ba82677be789e3049be815a697d4799d9e22ad3243952b541a12e1a7a1cfae5b611ee99e4e1810fdfa9eebb738d2914e0f268eb0f76aec47d8fbf8b1be0f2f26e21f61e2584516e610ef3b6f056fac7fbfd7a008b09f22d17cfd1a6cb2fbecdfb3503fd68955f4e1a38ab10fb67bf72ccc235d0685be248cef12dd4111f47b7fc3f9afd6ef2b3b0bf308c7cff1cd8ffb613fba1e268e3d9d3f8e0a4af09758443b51feeec7fdf3c7fcf3f9683b1767f8bfbf2ccc23dddfffc4a22dba1e7c570b148b289d2cb0205960610eb9a2acf29aafaa23988eb849e1beb0f9229c3afd5c449a4e7fc7ba133de6d2898010e81cca4f04e59f55baafb5e292fd4b3db8a217fbb32aed139d62790f2025050f60c54bd0002174a20a4d1c481e20042f5d175a61457a56be97ff680630087f95a0d07ec6e2119120f9401427570ce6dfd00a2bf86fa812943fdf9ff8b3973dd18aab4d50168f88046171cc1597ac300aa10e2bf2ad6885fc196a955a6f125a0c147e2af6232041a73f2928a4ebaeb4dba494009854e85b3186daa60d05a9d01c5a019250a5d3c7610f2b58f1121c4008362901904515d2e0401288ae10020f398764a8d0dbfda47fabcd61f79576af7136bd603e0ec950a90f812addfec63febdb6b6300d2ab0885c51dc8c050f368d3a64da742868a60e403510bd42a97da349a061a2c307f3ed62d3d7ffe943ff2e79e9b625d795fb0a6704b36ac21b270435ccd56378bc8ba43eded42fe923c14367728ce187eef8b443c35491ec963bb962c662322abce1dfbfb733aae4b544b0daecbadd3b94a683a6377451399731e917248124a9b6fd4e957a719f5a50eb1a5d3af7f6f9742286db44fe91f11c1ec2dffdc5b6f5fafed835597b81eac3a065d4bd9cb7f427d705eae407d2078e902f5c99155b683b97ed4a1f5f49bcfae37311fff03c8cb087ef639df028572f26cfe129759049ff3117c8e3885d6737ef6103c080a4110813885d639047cf61264c2c51c319c49fcf9e3fc068570f4dc382d9c90bf0499b4c420a1b4a3c49a4c7467b65a0fe435280404c80612b65e824cb6c8e6f58fff40a11f45b37f3fbe1fe1feb0aea67cad2d7eefe33d50c8474b9cb2fbcbc7cb079397b8c5165e5f0685629f586463b1f0f504bf1effcd6350e8e6756f2ebe5267348e0a4fe07f3d16a7c4fa77a0509e12ebdd7d8981e0f8c34ff7dfd6bd4f5ffcf5f44b80bdb8cb480ba47da1ed9de779998a0c7dd4a09269b3bd8560b6b4c042c232fac2e58ea93ba4b06e40584f9d7e9233158a19bcfb242348224828adc784fa32195adaec4013eceb509a156d8ccb644f67aff275a84fade2959c426932071860e89e4addc3d6f1cbfdf2e7f77dfeeff35eeba967f7c2a70961a66f6e032e88a9fdd9baaed9d6d9baee76676d5de3ddd9baf63cdcea1e88d6f0761b66bb6b0edda1b22b7cbe91984b85061b95196cb6cec4fecd52f256f70e7becdee1dfbdc3206d6f6b3fed6076973af4a31d193df9730f10b2973f55cb6bb7fc9d220cb96391766f36213ef0b1a787881124404946903ff7a5cdb8bbb58708929aa94f776d06f37d628e1123dd1ada14bc5a5bfb0c3f5449f951f0696bb553aa1459e7a28cd2680a4a3c8752aaa2e3a804abda2a731a2a34230000000004008316002020100c070402711cca3245927307140013798c4c5e4c1b49a35110e3300c4239650c02c00018003202332323990223b9c7bcb04f65098014aaf2fcfb1e5ec9210f35e211f6bc702506614ed0f805e04b93163f2523d6557c82b578652ce1e1926f4eb1e9550315ec849612cafa5884b3ee8f0987e08a19325c50a6d64c5029f8f8ae2c7e26385c9aa05731d0c210800d0f695b924964a1a44f4733f2b7a1b4337ac44b09f087ed8639580aeb68369dcd2263308f038f8282c91f204060fd46e51d232b6f4e8ae36c51492a600fc1422c6520b6108ef9b21515151c43362f8023f82d3a7b06ace08729c49d1406bbf13527196d40f0b72712deaa5a562a502a1293b0f9ea64955b87a9f7c7dc2253658d6294efbabf635b04d9c2faf2dd4de625cc31bdda1f695db9fb5d2a60f2173574823ad5c4f10a6b61859c41c1310f1e3a0c084f7f33675ebe9b43a74df2791506483a6e82552075afe080f4a19e930f4151abb4d3cd71b66711f364b6691626d272db20ef33c575012046b129521e4356a822d2a3652e2eb770851bdbfc816e0b88e3aaef4a54649236496751d1d0877f946fe816291c80e4d5277a7c479a55826ee75c11e6c59f3c3a7b17e0bc69f09437c6f301b9940660139128392723f3414f2d27628dda8ae31f68601481b77c2675d1f074f07b476633cb1b8c7bb087097b9942f62dee38f33432756106c27fcb8cbe7000659a3261a178f7cb7352d629f611f0eb342ce9601626c7b689ac56c5529170e5f80473b57b3c3d0c2f33d7b8fae8590617a107cb53390eba39f64366298a0f5569390798372875cc261752cd520a17b8c687e0b20965de1b6c36525fba49243b076f2c2812942bbc675a48319ce75c86858d9bf1c4539aaa22172eaad0cd9083a6f3f2cbb54bd8aa7ad8df7ab77ac381fea75db0c8ed4450dfa70c9e8b16deb899401e9a21df4646177171391e81a090ba891bebe4044e5b1b3c74890deba0630911ad544119a1ebf40d16eb251ded225332ab796a5bdfd6a5ccf300d0ffed45187fa03140c2641e100a1c7528c331d75b9c0f75a9c2071dd05952c044081b619af2dbfac861a9de59d3a11ffd6447ca09b7ac984d2a57441a6493547038ed183f6db4e07fb7c362f788bdb747fedaac62de96fbaf4d2a03eeea06185791510ce75e69d1e214c301bec5d8adb02d2763ec9be518b158db9908a04cb286214dc3a9d25843922c7269c274852c5419e8c1601198b02f2d4a2d74e55a9924ef0a387e7151c9a02d672165c5d0c3f60a9d60e173655ab937d6a6367e367484b7adc141c1193d82d327f0dbe39fcebb75048ec68494f12aa5cac37cb60701a3f2e8f02a259f7fab4ccd563f659ff6ab87f13fbc8edc701ba28ba37f700de040d303dace3980b712ffd60102c9d091831bf061585f34c641c1eb2ee62fd38ea70f44706d125286de605ae05bac63e2c2ede1808ee23caa6f7d26b9c8a40aad492fcabcbe22614cf82eeea2e802c0a78009b14a01f11f2ec9fd5491e84011e3b61300c267f637d09189d1d5adf2a6b91748f863f6c8509542be0a5f82532cc7eea1fd676fe597db5f72bc5e577c51bbf23b2d5d6e7c919396f99208d76b78398d5a1c869f11dbc1be7f6965ba684ad026328f1f48015b54867c9ff5e41f4a8831d23343203052e8f031eedfdacf897a15d9d61075685b7e32cd90220417162f87e7ee1d346d81dbce4f2dcc58a26b0479f6accb228c8143b7324acda9aaab0c8ca406a1504de708ba9609820666534e6597057dfeb2017e3db1f75ae282aa3ebd57fc66bfe8b019c51ab7b73c62cfe5aa1147558be6c4f2202a351e5677faa145448d26a13343fd0c92477a09d1423a5ba9413834dbe45742926cfb04451296ae91d83d5fde87d6dc2157c3f31fc0cc69beb45abddbf1f7de3d0cd338340c404bd495cbdff93b5ce42dc53ae495ae5c387b5a3e98d51d18454b585c861116003816edca65e6670aa2612a56342c8c54c4ae0a5a483a4abe45a13e97f71fd8e4e41fd49b83288652f8e3068da1ba8227906c1e0d8634c008f4582e9ba3177f34425388367f59d1a8cb2ac4cd577875eedd08267baf81edeec6901a289fe40099ff45ff2f2a69235d6e7d6f01cd962c85c0e75bf6448815e236bf38a103bd9f6fe1fb6283aa643f2fd958cecb2783bbe93a343cfe1620792049e9b0547a2676756585e845d1791004ed924c75134928037445f6fe08e36f81322fe97701791a5006cf3415d4642cd02b6359262d37c6df5289b48b1b9a047d2994166543d0e5934a6570e9e70cbd343e95c463e2b699e124c2268b2cd5dee8031c5c7072858369432ec550dd2348a3b97aa3717079f596bb816006d659274ec03780b4db4672c1bac898ce6b4fe81acb396f3512f8ff630b42b7057ef3071a2f347a7e5d8858b25c2ade74ab3da7a9de6aad076047e27978b9da8ba10ca396ee76798e2761d2d7e4aca4e242892079569a178ad65deed2d5132c5f80e5bd39512aca8c96a5e189a3b2d69f8c9d20b17302eb29a1e2e466a83f6517ae4ff9d644881a4079901dfe0141cdb3b1b30d4551c22b26759ede46da52ad008881c07c8c57e2ec62ce22dcf9ca4b236591cb8bbc7869658c080cb3a349b9f98d6e89948c0033af8e951e2a28dc2621356679949775c4ddc38f1d1e02a26d229d6ac3da3305de35ecb24057e83400118c507a584a1cdbd7b2e6cd111ba74da1769120ee6ab99464009312f5dc8f2d92038fb5111caa3c2efd1d107827b1898b6ad5dae5ea50d0ccc4c9e53ebfff747579d38cd107233640e6626ed26808d926dc313eec3de9836f95fe74a1b832969bae9a869d435b2178d16b88373e8e6e2b0aa625c05434c01d03e564dd8f72624c2bc6329645b294cc554aa4aee0aed3789da78e34469e2dcdfdd05d7360817cbdf2badc607e4f004579cc3d9d02b5527d3bc2133e534ddb02b381ba618c2a49449c77b8cf8a64d1f132f83a2af26c412699b845882cd6b86b2e7493402f78c816b0a17613b9e99ac67faf339421295956418207ca167044cd86d491fa23921461abfa686ff6564bbbf97fe9a598ddeb9090d2d1d49956cd071018db57e89e67d643882014843bab775c42cb1abae7c16354e94657b2c4f17517d70f451d52b4b3ce13350c061af117dad669b6c3b9a113fa352829cb8c0295dd036a14b5f9ceb08be3101f537be63605423e087294c6402422261084aea681280fb3b33f7420c124b05901b2c11dcdc77a398ae61987e8612bb7438aa4960fe80957c80fe4b8d9a078dccc629dd71933338691e7dd359a76811cf079fd5c762aa80799366684531f82204b5ec7a91e89bf706353d1a36021dde5818d3e55af74d8ccb0bde61143faccaa2eb518416c1d3633cc5be376108dca1976e64fcc3e075a47876d7b957d2ff22168e454d9db7bc05f9479a2e17d783dcb86870d5f08643d96107d1cf50cce2c42bbfe77ed40d77aa2addb3e9827d675a3da60b68b96792dc55a3a9adfae3721f8c276b8aee9ba4f054edcbcf532294e3e0021a95d2b6f89ae9929ab733d8c1177229815fb932f4376346c882cd262c075a586c3ae6fc7a6bd0a3b3639965c19f8b970ecfa561c53ebf3a139772c469f33ccbcada4c1d9f67e5e5f31d89672b0559c115f044ec5162f0c4fdf77f1bd270b02c1d57d83c5a893519ee574f3ccab69d5c1bdbe9e115292adff52be74a31014e93333d02b8711e4f7b991acac346b48f3913d0ccb7c45469ad793c7c4f35734163e0c10c324673583257ae135fec0164fa94ba964f3c8add8ac1e9801c8f1ce0c5cc866c6439f826c032658dc59d9d0a0ae37c320215cd26af97baff3c75dcdcee067321a414f88ecaaed60a0f26cb0e33a3fdc8661860425eb6e9f250896d8fe4b68c20a6d04d35e3b9c9feeb2ba924acb395b84b714880ed670127351406a2a605040b97a9d38e69016d5930f2f36d1810acbc147771e0c82bc84bd40be84156a6022f729605302294968b4b7623cc335f5aa219fc7cba5fd614230fecfc7d63431dbd54aa7eb1d2804e046c875884083a18cfec1ef00f9ac94e924a4cd63bfd0d5db28d61d395430187d0844884838428bfd55a755799d06bd327a0968b700ac635e0b99acfe932f5a096f6ac4c25039284fff80e3a1cb7a4f9a6851d240c86720b8b4b9c8d04105165cc5335fd1bca794982c4238452d80f7c3785d976cbbc9e3c6d1b711716a7c57bddd3007565d42ab6ab4fe7ebb9157adccb5230e69f7daa4fd97c8dc16322f91b12926da322734c463e6e1847de1da09774997cd17a69b1af8ba3a76b190cb76b26ce419065071d08f61088b709104134ec8c02261b88251f1ea2f851dec6587fdca4f72a898c304759ebd4530d4c77e9fe39825876762982e1e449135690699958dba7ebf8906fed11b81a3f2b30aa49dc536db6112766bc7407b4ccc5f5fe7a41d15098561f2aef14c71057bf0fd80fae5238d2f9173cfc58133b7a57fe24655329c3603b297bf2bb5941e228a6dca7b1e90c2a62dc184c113aecd5d6cf0d0c89ce38ffe703034719f8c864a70d0633403f10d868757e1f47844ff1cd895602c59343059209bc53634ca17e7afaa2e75932f2f79f6bf5eadd4d490d17c55de11a380f6fcb46b782b10f52da163c9fb2686c11fca7071f464faf666dfb6abda1b82eaf7157f24c8fb24c894fc7481da8d2c43709950e8b3f3fb40b434db8846104da3c25b283122b64d90eb851676cb09f2c858c1e11d7d14c38ab7dd575998ede95871d5c1990beac14bcc7a6ddb2734a34a98dbf81e19fecd00d01e3e72f38d2a5d2387b5d8caa782ac625c83eedcacc3dfa1e7a12fd3a338939c5055416ef251e24840d4f4e7d370e71adc2c6971e9ee5632c064f1f5a9efdd362de13a24c5855eed3e60a85aaf4044fa3890cca4475229f57865bdb8efd2352e2a81e318526d9f98e7e63a718c768664a2e5c663cbd32a2ed879ae109e9504d2d52a2000406e7949f81ef69443328657388b7ec49e5090fc02a10bf627d649260cb16b07d12fc43d0dc98dfe2566448a24b8bbf6756a479cd6eee812b5e73acbbc5a27d36a6d93a55c482d7ceed60c235aa571b034cf7f25186d40dce618f0ab1750c931badbff552a185ae76855420c06915c0636110dce02f01fa5386ccb4447f191f0de830baa7b102e4809eb96f829eb08d49a26c4585268c55f36867c6f1b7511e7d619e3edd7af648d6927ba52baa900969c192c39c35c1f990b720a431fd1735d289aa0ff1d496c1a54c9b4848cd9e94624f37482ae5ab4112b4677f4bf60cf571cfe516cfeca0d570049a1ab69dd24747776c8795f3268402b7525a9220cd9da8f84fbbd7ae5900cdaf59179837b309941aba8f02e84842ddfb8dd913aa2cea4506181f974f5b15d58da8b0f4adfa2ac7fef26b85360be97cfd264ba05fbd8bd477d28d35260e0ebbdea56f4fc1113f93bd310bd39e4d40163ffd38c0295daea790495c7df10a407c18f20daf2de0f7f99f1e8e53d602fea0085b1e3819976ac25be7e1defca3922cc0b34d228a1063d1e27522ce851acaa267e3d0f248796f45580c6f9590b56bb1949ac71d6a85a8e8648bc614d60652eade239b782316c491c85108794c32f5b6a34702f2c4f93ac387dfffebe4f693569f1de98a8486d8257a5e2b751d67eb5622302bec445a5cb0bf57c85dbe9ca71b1c02aea0f7d10a8311b452046b82c132d13bebb1be793870dbbd98b15f262f1e69a2dba0f2e5681c3788d34e3557380ba9ae0855c41fb0f709d761911352828c58f7da2f11d0214153fb2c7634526e8953ddd5ef3063f5aa589a6ac77f3bbee3cb847de891e5caf99ba9f17de038740b87a4be02bb481f0b81fdfaab2e5a604f195ea3ae66b7c8b79b86f5d5f5e7121d68e20c307985ccd3da884404a4994d351662e5a42ec4f679a8a261f087b39aa9fd843b3ab39856cb1363307922020bb262aafd28c1a94e4657757f9b9dd89c2c719209bee2714c7bc8a87c5a9d0203c2204d6a67ceaf1977781d2c6b6c12eed87106ba5148c7c390da762d2b87663e6b739238819358680eb46377ed7c00f7b58a335693da4f7fa6529c6929f8e3bb48962a614aa2a4aa41019ea29500fd4de1475612b1afd741c164ed909cdc44dc3c4618300845a1b2d4956c05e43986f2206121057c64d431d7438ed54953fe48ea5d1d1f6c46c251c782c3f5534664871634fd4546240f2694ae4aa5c6a8708d6648ab41d5cee3202991a5a2a37c4a5116cf8ebc24270617cdcc2daaeca5a8d13d103233f3b9dfdfcab0dfe9e3bfcf81a3dd831dd42bcda96607fb5c81c0c45312287913a6c6dccf9f4690300aa8754e6538b92abfa8c4715c91a9516507cdf85b8632c741ff4d1c881ea9c6520d08e7f2dacfd956aa85244f7fb1744957382c9361214a975554bbe8179aa10b260ab4c6d03d0001acee4a165957b471af2facfd3a3fcff1cfc46505cc3ab5bcedd7b51fd0c7a839f9e61ea15005bf5d95f8df6c281804a3e8c38e5c65b8805f69cfde6c9a56672048f1b79452badb17aeadbf4283b235ef5351e0352f1e9ffe51d8d9b64c311316dd9f3f6dd3c739785aa556e41a3349a581b44277d50a0fbd444daf16ec74d2372345b2b6cbca38413ed9ecbd184ca59d8220981522e35e8f237ef4c3c8b4964be29f498e5d5d6776e6c497df22e98214997807b94e8dded2adc06ddbc5aaf4159dfc31a43baf78589c3015b83d1d485ccb6440a132392c213897e323a3eb55089c02cf6529e16b73109ac3a51f58964a8cc840f01a2a6e83922132ef0747b8dd1eeb16d291d45c4b4ed81841d59412c9c04ca4678a53da00066435944902f19135179606e875fcbbae1720753203d83deabb1b0681d2d4412549296ee1ebe5c129f11e984cbbfef951c044a41fe07ffcf40f3a809b165bcf287a2a1778f737d524440901fc8161d1256ec11929a4030600f0c7874ed19c89ded7d98247c259f42f363249324de1f76a3ab37be8ff90ff26f111c96d739bbb194d91c1eb790e4dd905119d547dd5906604ab67793a163ea08effed10bd00c73997c6237a0fcfb2cecf5bfd54233aadfee3ff7c5670e9ee450de5124a215ce7bdc3b73843eae0be0a59274d1244231c7208249276d9498a30804f342233582df8eba2167bbea065cb99918edd6912cf399d5a3c4874205338bcba219855db9e0cef92d769b333b0ebc9b11a092d97523a41d4075bfe6f5975de6efbe9d13f091861c8ead4ec05e6cffc53aaf3db1b2d77c2c0f7bc0c75f8b4af983fc1e8cf189761f4e287305992504f08c383c8d307fd282dcdc0656627481147006505e3bebdfcb4cfe7cf072079497987938100c99ac67bb01a6c3dcf59e313979653f758a5645c3eee1abd18be85101a23f281aed864a9e89fa14314dda41a020cfb6c4931cac6e1f42eff967476e65af2ce11055d99a892c3ab7f68142f12f15620d61d759c8b21fdfa581ab9d1d3191c4dcea894f0334e824b1e55e32c10ad2665da383da1f73c15be91a521ffe7cf1718505bf4a73ad15410f4e6002b93ffeba42f4a9e38fa84088ad05d60642cbb019614032444c3358b574e5fb992fadc5fdf2dc44715384816704c4a52b0d30b0a45b59709616dad1810b8afa76ef1e2d0dcd8e61239d145dd9b450f2aaeebc91c93e9d858c1841f6ae7a09fb4488e68a6f64cc091ba324d70517727fcd3c286bad44368dc75b0e764752de6b34cd346d7f961d872fdc35b40f60d194366f167e3525f0c10ddb3c382969928b3d1531b8886ad9277a0f47f45c4f7475cdb601e9a95e6e1d50bc03c4ed40aba49b99da42beebc95b136da496a765733157397015bd5fcf40fc2797844a9fc9d3db0fcdff6c6903fb718ec8a629743ce90c7a9a1c1f4873a895d5fd041c3b389c7f900ea950b3695a6b58b58243298089ca06d840c980d9497ba18220b4e9debe99b21d80f4fcdb6e4c674d4990af0e63660646b4755899cb2b072f75ce33200b2937c14ec7c5eef147de27f8d6ec37fe3d70055074696d69961e0f244b7cc9dc064ea8e8934b50664b0798fa33ca4d6d73a8557b3aefe28868b6c1f80e81668b34b3f8211df9a17ffe13808ce64fd236bf485bdf7067e5bcbac30e76c02b0cb880e126448122652014c272c5e307065af42079df81e91d011a91a103e09beb47c80f32e2bffd5444d1d3f2139b9d98840ad28bf9dd9d01e29b3f9f962bd595e2145fac2594164c8cc2d3cfd6246bbd4560c711393f30602273174d3a9144f56383039ef74c25e4b9d382d2e716038d65034a6d51a7a172eb415b1d92598809b61038e98c40a648de9ad069437721ddbd04529701e9c9d5aa10a032f78b9b7b9aabcc032ea747b33b4975f7fa8c7ad21c141f62857b0bebbf7f3cf7c20e3c3fbe89664b6c00f573be57457fb3ef20ac45b89ea5e8189a0a1b47b9bfdeda61e93a76074bc020af91515a908e802a8730bba4d9eceff903321937fb94b25c9a51444a874d51bf705bf48b04fe30bb76b4798d000e009c25395f359c89c10376e4c24f88c68e8ea17e31118da4d6c9e896f8b515004b3680691b40405881cb2b139e3d758279c64f11538b81f90b9ad169699054557df67ada0679944e8c8fff82ba449c2aa610f0eb06c6d4aa888576d0edfca21ceb3fe6fc8fc1d9a9b47882c0d5c8691673865f44e9ef7ea94b59308d3a14fa29b51d32bca6794f359112c9aa40728be172e3b5d1271cde2d4280aa53ab4654dd13dcdc794069353c338ab6aae6e219434109aee1425ab2a926d75b76141b00f48345d81bd017bde160368987d2b0accca2459724bb366a70a6a9b42dbb7b495790e2a1bc0f3b8f7dac4398066a872880057b5605e55fadce549587f63234faa85fabc4cf8c8573e427e83f017c7af7e8125e546e244d8601458a72350321383a764c63048068d12dfab02d66cd9f7b3d5972e5665e7b31cb4ecf8097a1eb9e84464ba1a54fc134a0ba57a26ff6b02834e9a4944cdfb892ad5f2eccb078368ccaf6ce098e80b6baca00bb493c1cee1db66213d353d241f08298fb69d3e1e5d8a0f217553320d3db38f307bc81a37f6090602a9a3bf9542ffb3c8f56a9f30d60edcab62c8302efedd13e7e1ec6851b44c60574455e5d3f6f7e9f5a2222fee6d3f9cb63c7e2b4329c3fb1d5db7e4fc7b8f3683f4afc63c8e50a0071f6f167cff9ce67fa99ac94c76c2c26a22c5fb3370af3d9b07954665f4c5f28e88130d4215c6fac62f0faec0e391880d3fff6bb25f62a8e47092d7c516b3fafbbd196672fd12c1ccde68673440b0dade7682d0522991d1af7c7621a93a815379ea928cae86944aa148f525b18e77a8343bc28f9fbd8b70ba0cc9bf817007e6aa07a01cf7b3194f884b5500ffe5dd263f66be7630f564252f16fd864bde741e84ab5b96dac16534f5ab94336e102504ea723e95806f2c512f2629dba530eea3ffa85922ec9090c4afa924186f955120efed3eeb44229ddce9f1741696508b5947a7c7d1a957da514771e1aa5e43ec51d2deaf512eca151855a8a6ebe306d851ebf1c0d455fa28177ad460939debc87dceb53140d87c946c42ef102b2c83bfb0c4a134fdd4f20e6866792a1d916df9844cd1d4f413fb32dd611149516c54ea51d9d0e42416851fb149cdc0b3492907f5279205c9398e8fd0633aba7960393a30a38cd16b54acc9cc8ef029b858d205a522a68aeb7f97da681a46bef2858ca08db35c476106bb78a9a445cc52abce8d99576c2d7bd96a0932cb375dc96f82d13b212e98fca8b31cc8191fff86fed1221f62a72c55af4fbf7914b119d7250976627149b453ad06473394501d2ed52c13f0d23d5e29d8bee2ca0105fa66e5f0c1941740915c98205946b6d4522f9f0d01cdb6c6bdb5d965d2d6c6e070905e6855c17a9cdbeeadd4966f358fc5fef49834871db6d7767a34dbe641b1993af18abb9bac6762651907020a84439762e78ed9c841470bde994e83c82045b649a9af136603988c560cf5e99e9b575eca745866aa6e1274811ae143db0d0514e6ffab73ef689afe204cc070462966209f7ad9319d6e35a00c0986e6161ec7c2648a2d1ede8ae54c5f987b41c95b554aa07e08b9e958b5b7126050d42162267e0239ed45faf945660e6a61dd9f7761367320179898c6a6284c15a23d0fdb447308391a4c7f4578495ec8f894bc1aedcae6def2e4fed6d710d8f9bb055cd3130bc2a0a3908d143421d133bfc27f429c5c9292024ba19f2eb15a5bb6fb4020c9cf6190abd08465c363dfb904a7cb8e88a728644a98985d2af60dcdeab9a762a2df23ff8056222c10a1900be4133ace8e3a87dfcdce7d252321f1013a51201957e01040465bfd2851fdbdad8909ff7161975d6f51bf2db2f44569b7bad86e157ce9fdf7a34c44007a2c392f2a1d4ff52bdb8b15d483b334468de676ef668217f0fbec528168203e25c0110f337d0a3ff86fa066b80f26b46225de8b051aa7b8fe0bfc3ea2640577da111605e3915e36135713e2d14cb3a821674c7bf1fe11a615fe7a2171d9f244f8f721d8876e698366a844299a02212369b33c68663b013de1d040c57ab14eb6b91e10cc41aef605befc16dee329c8a425d27ce3067648d9ed5679af6ff9d41a16f10c0c5f4602c84ca7fd00f6dd00ffa413bb4857668066da11fdaa05f879244a1f553ac1ed40ead6b29c174c2ef1d18b1a80e9be2e57f6c24f9715341d7b1b393ca04f6b4886369663aa6448da131be86889455072497eaa5e05a3756477ab94aed2e02076a71b36310b60062bc9aee66c8f675720c601161b6258d2603006c51b3ab643233c9a6e663003611b3a368323748c666c72056312663b08a1522370a2b775b1b199bda4f97e0048c04abdf02e420f9e2284bf2c34360c597c998f8c157b9d267a478092f43e203479eac2f9e44aad7745ff3168cc08a2f8333f0872b62a5c748f012148d3a6f8172720108d542e2ca10014ed2aa6f417288fcaa18059fc203666cba93e52b020ea4d97209e9a73513c7b8c6ccdc61145b9c5e4650e3960bc061823bf9110cd030fbf2048f7cc4883e2fbaa884dff20af2cce15e6ee4ea2517e255dd614d295949f203e406aa744dd21e961998d228554fbaea006ae37615acfdb635955dad82b8b08c37aee8e028174c5764a7be0ba1206ee2742ddfbfa7e0b95c0b21fd46a298af67edfa2b81b47affa3af7f8d1f71f8ddb38df2da3da3fa13f76cca6ecf0622da9e4da184f66cd065cf269849247b366209f56cd0e2e47dc91fd7703ffecf84fcd925b2567ced1030d6ab5a961034c61022982c5380c22402e16fb904cbcbb1b1fc5b05575561f4a1ac3f742017ae876ba2131c31adfefe4cb76aa4c3eed3ad1d45d01f86929c6ae7795aecc0087c6ab9bbe3398306f1d7bc375c7d924efb23e9507e67afd5cc5d649c02ba4ff673820561d171a72300b4254f246839dadf104670308788a9bd8ecb42a01a0b4b5e56b5c56224d03fe0d577ee0fe8d0d70cd4c174b07e9c9022d80f0a0df5e4276e6f49f121413ff18e7840b130034495f213f74709df59c537cf1d1834d4ce4fb9bf25cb879bf1fb50cc2d4340c94c1065bc93bdd01fc5962b68cac54ad6112b8bed36470d046473245de0b6f1207c674784b33be9242470b13d65e82a5c9ce02a8eb4269af213d191761efc3443fa522f80c6783831875987e570c1d28ce9bdd683bfbf951014f8cd416a08e424f2d734ffafca39431803779b7bf2ae12c33082dc3c7be315a582660cb97bf6c43b4a047f8c1fb1927c1feb9f5983c0aa6fe79035c5bc9d1a3d684e19763e5845c7f11a99ab5a49e9d98cd42d5ef86fb30a2c641df2c23ce685e3c28ce2bf21a995251a5277cf84c13dbc9c0eed42c6a2a5fe48dbec4a21cab58928d38ea82c56ebc9fe38aaaecd8aee15143aad5e91fa35dd0ce86cdf6da9992f50a13605019972b27ba39dda03cb3fca3f08cfaefc67c116dd594d595a4fe00d03ebb9ea2f5932ef738c9b24c1b2344724cd5442c7613fde40dbf1d3e9a1a526417b77d27530a026c25d7269f4a0932621bd3969db8135b7d18282990aecd749d7c0c39b0a36c7a4d1c1499a84b5e1a4d3e2c99ace0d4b9529b44f275d07036a22dc2597460f3a6912d29b53d36014601aea6b8b1579b6ef87770294daedbd5f8cc164cef6c8d21469d6a9b994fe553d1d72e5d5bd0a72111f1cf4d39b5ea550ace3df45d4db7c53fdb308f9af601e0be8e31af2ad80fdabd0df0ae6b784fd9d29c8a1d9090a375d33b8d3b345ccaf408e6a4828d4b899608fd3986b02ef7c9321aacf96b0305459f62ae6b6f8099c82338f7a3c0623cd90c8f439976efe817bd87c30cc80256056795ec975b3e8d04838365e9ac2764c6d4f505e68506ba9170dd8e9464c7dbd58fac67842edcafac7c17c913f0e22c806c07506afdd76ef9ebee0aa52372427698c1e790589a43ba7a3bf2b7a8a3ea3b7216d842849470e017acb036443c4213d4df652323f84fa2654bf9b59d99fabba88995d78fea0e232440798704b1d9f05481be5e3978b320ff6ca46fe46e06ce1f825e83ccadfc584f4ad079ffef4118f63be8be5f0d70f447fffdafb8b32f62f67e67fbae10064bf29c02623027e832f605cf58019b912a830b040762c037baf39f0f1e963ffc34c1330e39377450bc4d96e12715c78b7e08038db5622ce0fcf080c0873d304caf8f01ec10070369d440c97de251800cca64b98fa8fcba5a8d80ac08adfba57cc65cb62d6c416d583b9c8dd606c316e3822dfd7adea45ce4d4b562562053148d3b993696a4d3cdd06789ce53c5951d38d4d9067cc92f55b702608c2f968162c24de9fccf32bb4fe4995abfea5d567c28f51aafed79dbf5dd0e5254cebb22e74c50a89122b30ec802811d60ea5570a36a994088e7593ab88803afe464512af4ae174d4f540ac0c2eb4d764d35468066cd1c58599814c913c6f802a639c26516aa9ac28a77f51d8af4aadecfa933c9d4341a5967e9e48918d2835c1f64a7f7f7cdfa0c105ed65fdf1ff469b7560d960e42ac4feec8ba157db3462d69600855f6abc16df6a867e1b7cd5851f0419adc3514118e6951925313ea119e1842a2d5935ce9b9697de194777a0c5b64ec0154d0ff0227c530a54f7abd1d9da68a5bd4fad280aa3d3097941abfefa60f68283e9837cf87662cc28860b573fff8c65d140953dffce97a830c628b2190863a41202878462aa963d685bcee1c28a0a689b8a100ae42d573fe5bc948d7fc6ecd818569529ad4c873bdef0cef2b0af0604be7d0447f8fd323266807529663612bcfa0304df7616ee508df39c2b214853aa6aa4a11ed50163c6f099f1b27cfc831da7cc79330415d4d673660915c1c51074864f53fdd75dcc5fd3e7cd8b15f516610013c8534122da423b532d1a8fd835810c9fb830c172dac0be331368e99ac0837f88a83b5d9dd188eb2158771315e2ec338cf852dc278cfa7ec2b417290dc503abd2f49be808a21a29bb96b386109b392def40d819c0eac4e6fa788d81fab86ac7020e39c0a35899295cceb34d63c28de36d6c68417b0421f780a34dce316486a765e5c7ac59c66be80e1aa842d8d5889951fe8c04aad49cb3c5953e26aa84538b0caafcd4d28c7e08b28f63365e495a59a5c952352e53a8bfc643f78bc1263b1e8345e52cc399f74ecc848009d1cb4cd0620197369ddc93b505e88586d9cb240439f8a2c7630069bc631facd020f4c1d5ca1ddf2ae9760c808d4b1c005d677696e29c0654accf4f9404c3a492059cb3181db99962540ccb76993e3f77f50ba6cf9de8144c0d194c7b8705f72b5dfe74a0ecb6b5429dcbe9bc66b0518da74f752a053105b22de0c370e16b7ccc3ab2af9e04829694a57aa073747f6b0a597546cd5d8e2dc5e0ed3d22977c581615ee8e14118783a6488763a5b43fc0e86eef2bf10d4660914589c87df83ef42703d06759fc8c21e17b7a593cda07c5460ceec67118a69194b9c944393392184e30e099333120940b4ff14013829d96dff62f2eacf0e385d1365616e782b2e75b086c7d8f7e4d9decfd0ea5b35bf3ec973ebc1fa3711df84d7abb3122cb97742e631a67e4c752e54d100e31055bd239f4d1af506679d51c32d258bd02e7e76b5231414448f28f1de0d5172472c193bd7f96ea259f4e1ec9b0ad6b231eaa3524646a84c3aa50edc34fbefa81128c28cc42068e6d0f0367c0eff9eca5e6fac974c25ce365ce6b8a01653f78f296edf49b8b53e9be44872949dedc33c0c885a7a43a28f753ee4af8eadb436c35db96b1dcb0be8e05a6d9e84de0a23ef09983c00a02c617c0cb38339b5246050abf1220f30eca170c43bcbcd403dd62bb241cac211de32f82f67a95ef1580baf4715f84001b04c413acb3d1611801ebdd1abe27817c05542d9cc029d484ef983300e66db13f4030a6c9433d0a9c6dadf0dff697621984f78476d94374ade8c5d3733631e32709f815a869aa18135ed229d7f942ea8b35bf3d4e62ae6342a7441ed00390718a07a1624bd70cf611352f6597caf0d24d79c8b7af736d09e9b4007aa01b39081cd9addfd159d266bc311cd20c0dff387470e5962c6c08d15ff675d22d30fe2e0940d9d029ba3258606beef839b43ac56f3abf7f26bd1268b1691c6e112ee1adc4fd24287491d34e10835eda5ab3a150aa88c9ba46b6f03e7bbab40d0b9837b6039c0299871b1668f7ecb216928d1c8fb58b5157a5abf1e666a5cc0240e58f8440fd721a0fe84fef23ffa198f5bd96df671d1d73d181241a3c737199989fa27d39f44ade63f074af0d0b4001f26e96264f9f644e60357906ef8cb3b3f277de87d1ced45eed37e3cf974dc95c459c4beab140ebe40c0fbed70cf0c74dcd422a9307aad969898e598026a18925dcc8bc50ed76b4b0969b698805906026dbe4dabf8b166d5e0eb6379ddafc3b909b5f1d42ff45e57e07702dbbbd2d698409551786b4f88546165fe35fce15e31401eb042670563d5c98435ca6de4af15649bfa9c5618e8a83b43877e747966616e549a01cd254f6a2644ee9fbec7ff5ddc4ed3b248de5b95ed1b4103a0bf0eceb6eb2a25b261f8a1869d678a499c02a769e93111b28a5952665e8a43e66a3e5ab4fe104c60738a4a82a501a4668de224497e032a3ff215608898188aba207ce2c075221ab19c0ade6eb48d01b66a11d418ce3493fe6e2c9282b55e621d1f63a7718a16932a2e320b0b194ba693f5ad1fc9ba8952a42c20d78c0658e311056ff83716df7113bd0fb7c5b0ba786c66c793609dadf916013f68a254cd37cb6b6deedc5c6d3a37528195e1335810d38ed018bd2347176f89deb081c1678421d692e211959f4c388f8aef8c9157e851040c259b4efc9350f134b6913885540cb2c71dfaa2b108e5b018eeeaf07fc201b9f5f931ca2df3abf3507c84bcf8a46aae8708ee0111499b5c0324f00c296fd04fd018e17b4e53aa509a4b1afc00bdebc3884472d38a47f6fe7a379e104ebec5b4d56995f052e40501da7383c3c5dfe016d299a31e2f3a3d8d3b6858e0cae4db653c80002f92ec9d016bad8693f4eb4ca65b4e934bb3f2af00ddfb131f8d62d2a318d2ee900a19a1b8a9a97e336a1c410f0d84e124b010b73fcdbfc8649026e0321818bcb846e7d149751a0400b64ee6b40f98d08628b589735ac0846f1e98c0ed03b09acb279ae90c8a9f3fbe62e611b0c5319ce0b82dacbea52cc150b2dd30627063be68a6c22b79c2b1f85e818729ab082a0cb282f79134faeff849fcb3fea4c47f73fd187d47de5a841a0b4e4a50070608e3c41f8c2b8574f5623508dc2ddbe69d925a26758839ab8fcc0f70c2cff037df726886f9ec1d55818169e78b85add592b17a04cbec92fe2b502b54de563bbffc0977c9354003fee2a6aff4d61535d89cd2e3af2c56ba34dc3cf4a020c2a9a74811090967ac321b04d2d23ac182cc722826c0e56d1d84016c70b0fc42caa31c4a92ccc73206c422caf199d01939c08e23c3bc718b901ffafa2c16aac490dde1f11e0017082121cc8bea71d89b49b200f9360c409b406429d5c79c3a9633ba6175975d4be31e608dc1c5ea2dc33d11870b9cc02c151976a2f4431e36c6edc610e04bd92454d80287f4b89a0cb5d43144356d1bc953607f8e49bcb3da87f3ecc7c1586424501dad677a7b9829f05db23e0b1c43e9d1ef9661510f0f38e7a2c145fe55320a6be6d83927a8a4dbb555246851925f42d5fbbf96e63d6440e8a04b1f5b08931b5526029799f01c4df4d62b1d73949009e69e4dcbed5c25361cb0efa2b95d94e31c1369941dcd8172e8a3781e3d0d5b0823053405113a5b1856e6a74eb5bd8b750f5c580a3f33370670fa72ba32f825f83941b1bb73400a9f749a2e64ee9b20428deae112bba3e46f27f9c00697da61f72083e4bdb49629944fe9826fdde9220a6704b81f854ace104a6deac5d0fa4892da2b7b4421b6ef570a97797f341bab22b1621cea854cafd3ac2b11bf7365ea4fb73feb7c32706174a537c42de8f24fe4ebfd47d58765d48552126218575da0228a645b04ef7170207ff8645805d3daac59f04966d738c0039c0fdc5ba948d3223b9b5ceb52f8339b3ca8af154d28d442ef08b61541a39433db6852812ef975498928b1fb424ce5bb13b5c97116dd6adcc5fd7c79104a9bf2ade277b2d0661a36ef5c53e3e6425ff797daee12be9e94cd4f574df1801a6df279ae67255424343752fb64efac9912038662f3c420bad866420f74d3ab278639cb4525cfb208b7a41170a0cc4c4276c4d71478bdde0bbe107dba8c572bf254b79082effa731d1f23a8b7331c7f6f88332ee7cd5dce159d6da216293c3b6a6ee685a336b4838f4508361b87526e1389ffb3d097bfae38e2c7da34454e8dd5b9963c41fb173ae54d220c077459699e958fafeaf372740bf799e566fd0767ffa0b1f4ca85005f6025aa0e78426f39e8d7547f737186de4611c3b0618ab5c15c2cb82a90831e3529f2db602caf422491dd354e93378c492428a42f1b1ab013d27beb6dab2c4e8ad6c7dd6c87311d74fbb429a0304ce2603e7b6ee95fa4e8831d609e6baaf0b1d7d54a0aaa1fb4ac058e4742d380d0c11926f59756fc765bb263f6375174143613b7ddf134562967e0f2be7f6cdf87c4f24863eec78a63098bd4b9f7fb78e51947001bb2d2224013c8b1730ab292bd2e6107b2b0f65045e09e5c9f093e57b7c64c02f0d2b6014fc95452ea171283468e660b742d19212b064023fc5a863d6ff70d992589f904ae2f5c26b0ef53e2bef60f006079e9d6fe54bfd8e0cf7cba2808aa56a8a7b1ba90a3d6a15ae94106c4c72577e79b64e0c1f7261f790ecfbbf93c6a7f5f1b7e266bc7892426b6309293df3cd032509c19efda8938ac145f24aea74a308ea46010e04f131cc9e79e90cd1207e2446c5fa9223b5d6a4e3f124210229bc2027f605d2526da257899c7f0028b164bd277936e8a5da47c383c53f58c820c6e370e99f4d94a1fdd5f705ac738225cbe4e1d80cd5ea5cb01ad2a9e34027c88b49b79fd20552f5ebd1578c0c5ce58cccab82220c2cb4800a7952f6d2a607720332b9215d5871e5dafe37e87218e27937367e1957f33d8e5945487cb824a36143e4a610e0d479864b8e14feee1508eacca246a35440f91919c502d1ed66c04581a00f4d090993dea490c6990bc03991112576d3e69ae59a470a684cb515c29f4138ad6e48e60f16ef2e0202ae6b3052c8841e405e7bda377792f480f70b0ab524887596e69d138bb65f560389c1abb8a6daa66bcab169f3995d5da440346f070cb5c86599df77d38f4092b8d913253ac1bff60858124b2330ca7e97ab4d352aa01260dbcd629dce0619a7100963ddd69891ec500c226af86af7970d87755dbb7c945e0980f1c185295d69284b4345f8780f21f32971cc67e95cbde4de7c3345b8b415d6ee688730c9fa5af36df6e4cbbb45bf41a6e39d37e29b45dc5fb4480a211d5051ef8ecac88cbeedd90af8b824e61e5064ff9b119630d02948b1ae0b46d36ebffbf42eb98b0c14fdbfc6cc178dc42dba674282127a3aaa084d9a7aeee4057b3ec21768683721704d3fd9e3233f633ceee57c70fa38a1078fd49135d7a876f81ba21f158dabe8e9876ad4ccaa592e790a3a9c2dd9a53db963bbc8f0ecfe01d4ee4cbb4a04c2a508782394d0cd14308ac51a39c2bbcde26d820cfa4d096342402c609dd47259fa742f22b247ab42090f252a3cd42e3c144b3a94ea87d791708719628ba968ae66d80ce5843f0461d338c0f63453b3214c818e254da0610f838f251f00830151e6103c29901670c2aaba2b42655b8cfab15a84a3d5ae7da1550261aa08b38aef7bcced5bcb613a04ba45108d2f4d1bb456c5d727f8425745bb0fceef84df90dd740bdd97b0dfa0530f912d95e2ed6645c5251f09cd678eb7c5cc78dbb151d493a106d141aaec5ac213251b2134f1dc87a532e0caec971e97fe240c4281fbdb5cef5cd1a6923c9effcb92ae930c027c249c93a1459625d5fcd13769490969dfba9b1e48e847552b401838e7d4395223ce5070011d080177c0e063d61a69d676d7b2e0a875e745c10e8a478a6e9ef5f7ad1734f30ba2b7fc6d7ef5eef4b80bf8d866445722098aad44ff5e3b0ccff37c0d70bd9d0a6e838ec5009fc274427db9c0eca5387fc32db07a89a4d37f04f8f485c383c817d1dbf14892b515d3f75a2deba061663ce53a4b0412ba87fff943c58e9848889c700fc2f620bf073ea7d57b0da719281a7cdaa2035e9a30fc56cbb67d79c903248d575b485763da93ee74e0179bb7fd7abf77da4d0e5b077af65da4d0ffb0136650329ddc81cbee33b435d759d9f7896875bc4bcae42242b3ff1c1649f6ac981eb7b251da1bd9b48f2619ecf8451db49cf30a7a088cff526470fcaf7bc3fc5a09e41bf1bec821ea9bdbd8532b29d4e0f9f125923b6d7e03e5351a15fbea85ed1918dba0dfccdd0e0fa9c7a31ccdf2885d304990a151e46fd202ce1df686591444f349a0c2a37a44b90ca12489c5eb3242d9273f4ee473d4ae964908e64d799029fe02e6168b9a8c83c824cdef6efb2ab413ed2de23da66620d0bccea8df0b77b8e1f41188c047eb00e4ccefe1dd0ac5f19093e7c67506367fd265fad3400bb0c26487b78f018b93e68dd4dd7013b6cb7ee983a89c5b9bd67f1610b0ef8cd7377dd178a630e37d26de82b1754c1667bb2dd4d53cbe23b9cd6bc618d258574f6a07026975996c75d448c58822ce8cac433e53fa04cde175482c6181eff27d9162531eed4f8d38214211404c27ea1b4125c3b2e6d19f29890d2a4e22ef9fb84c1ef4d43d752cd678d8a9fd6def1bd6f899f5222996c1ceaff69b1a114e2a8cc454007e431f027f5110e93da72e37a1ad2b3e0b818a1d067c5414b48db20f31898ddca3ac23967700f988db84529449e89ddd74c8052b1c01e047b24d247326c755bfe046e90eba98d602defce584a06d654f157f8b364b152d7be01f0565ec100633c13338cf0595f00ff8d0dc4a9054a1f0c9ecdd9d7d0cc604bff3d0c3a4a62a925bb3864254f4a6dc86d65b4a42952e40ab4c1a19cd6a7adbd24a10f363444e369bdd7cc905e2eecc0a1bb38f4b919217be2c10f96801094fa5ba8df548cb69ebd17d14118e4bd949f732dc8380949cd8f839534f059cad1970639e53f17dca5e7bab169f7c76c5b8088fd9827f989fb0a07a54f881fef5f7a8b1a50440ae592710ad959a3a18ec860e0a5ad56c01debc2c8b991507e8967c15719a70771ddc904dafa020b1e3a60175e2b6599bfc76a9f81c2809e0d38e7a357d4cec66a70a4089f2fce8d79b8f1c23f623d04f1d08d06afb4624c6eb053ed49a2057f572931846312b05c6f161408d2a14c53eb6d0454e5be522f5699a20f096cb1641a7f943e9e66272f527b2ce3b9a3b0a0bcddf7ecbfbf278b071dc35e60b8bf0bdd10b3a26fb7c0302077e0790dd8da377cbb308763444db27ae4aae2fd93b8a0b7219c9d6ac36e5c3d3be6e2799407cfcfc281dc3bf4c05b69c66dc372b78239fdef6eb3ecb41f463a3979081bc85c6130e13935e8692a0670514f8ee5b882750adc9e1bb265259237c79edaaf38428b90e1fc7c93517745b6ac6378f7ddd9e2681f91d5190bac0b8a4c6cf669ce22a716727561b005083e583d6923feba4260f68a368a6bab46f087bb71d4fe94d091e29927bf41af2993f6481263f00834274979e99263ef3abc850d3e59f5e9262f3facdb5ac65038aaa5178ac2cbed16ace67fc922d5bc645a569a1703fecd05332e69d29d7652b9b9a1808a3568fd41a913121ba7ff6b0db9341fbe2341f24627276920e14a92e732152e2f0204dce735ac9d860045d34c8aef7ea035aa290baa6a5f31ec2c684a4c1839a7d65a28e1dd73d48fc8d4bca593c0a45273b9ce2563936359d753754e575ca0adbf54be84f8ad7e47191f1363f263cbd0354805a174f1b647132ce024fe386b810ca825f7f8bcf11d0df391b8067847c3b2a003ce9f707a1ea4be1bbfd18400c9d97823d5c92d0cd1b6dab7f866a64ab69aeb37e1c1422ca4de6f14a65570c2c55d099eaa98ca944a17bda2b8b8c03efaae1a387f9adbe5052378f50ed4984ab0d376279246bc58bd6566551789a95818537fa51f8f6b4d70056888cb3a28605a8975ca2f441bd1e9e2c91416b282110c8015ae6e279a87f81b0673f3190d1638c1ade80ca56484db20c24084f33f114c40d86d9094b72b55e73235dd146a1009377aa80620dedb054a9240e9e2066b1b769cf4870abbeb1ad0ed2a7e220a0a046dd1fc00bd5afac2412c4f656250aa1e38b8a4a616d6a64176d327521b822309d98436bec26b0d8783dab821956d18989450e55b192955e5962da25ab1c24ad565476a14719ac1b53fc28c6ed264d2c2b6d44ccf5a154ae8af2221188a74c49a572cd44c020a48b8dc31906182ebaf43f03c78685c4240cc54a3569deff10db738ab343ecfb530cbc1706c9c3352dfc5cd932245a751e7b2ebbc7ccd50389097eece34846eebfd5b375e190321d0e031eab9642062a5348cf762234480adde8262cc40d7dac4b8926353b43f20721fd4cc07c6b0c3281cb6ea1ad60df95250145a12a804494a0a59fe6be5c47149b8a120105c5c941c83970308c3a6463923e66ade18ded87d6453c78332ef2e644079d2eea8a2a05d14733748a0a60c62aef19b68e05a3e32075b2b54c28637ad25e8dacd8114011a3260486dfd99cc8ab6a6a20adf343eb52f4291f4e5772264fa006134615465caaed9da3eb3e7c6d3a79cfb0341393cecd2f3864c6ec985d95c41e83b6fd4f1e907d3d405b8e55a8db97e881fcacd9312f1f92b095d556f1783542e01407e562066ae9ac64fb74e6f0e059b74c2a3052d2731c79bad49a1cc3027eb5ab7997f2e75890159f6c39ba4a2d7effeac314f97718bc008591eb8672f0581faf1b95eaa108b334455d91b6840f9a8c82bfa3d958b429c115a8aaa5d6b383b0fb9b777c435875387a35b0ba0fa3de854a59ff19618f166783a9bc1b9c155a0744d876c0d68d0da4db70f86a81865d3422e353a0d31eeed56b8351b91c80fbfa123d4e80de4b4e04aac7e9705546f8c1e9516b2c8fd8cc5c55ae5e358315642e69f49d8107b1ee32507ff6f556c040453dfe1b95b62e9dba3a6e745e77e4ed51a95a32e82b3a3567a6554747d3cc12f0db4c33cbb8a034102033a890a614a326ab62773719404e4280988272241ea99e7a23bae9224900f56eabbd82188e2ce0d4dae4a0eac39e763e7f7bed82a0d8fb698a686771e06c85117ea2eb7b35c47fc403f065bb2de78ec387252fecf1a8577563a8b2f05e805c82f29a8de4df2acbe24e0757162be93bf3aa107bcc3a12b4658aec9cfe7edff5cd7665611a83a43926e3d991cb99a5b862c367abcab16b5dd5ef06c8fe0afd85e3d5531cf3835fc5f7d5010f973af19631fb2df43254a2d11f45a007d3a6502f4b1fbed2883effb5d46f4af4c07b57d4b0b6fb037405452fb7953d2ebf41f5bec02a104ba88b3050ea7f57be1c77e14f7f4c433d3445cf9d09cb1ad687ad60474d03952fc16c8c438c9678ff32b8feb9c51e03c92c5a4be35dca94e48ca46c3ce2411dc00ef8579e175222f7807bd0fdc7f159bb74516497e60886e31ecfe085d42d3ce010c3506b6547fae9d356decb04c0eb6c06f954b1ba57bcdf19b09f0c8077b16721a8c9bf92f63121b8d5d0ffc5d2ef15fc3ab05d414fe6850251c61d60b83998233cfef9b946c95a12f12f2f117f13dfd5b97262b73b6c979ad87a51f45e1c879695ef68c89a4188107e9dc34e49c77ad8e41eec678a7fb301e2f1ae8980a41f3860dcce37745b8a462bb274c1bc5b82d76983e51e69c5db29afe9227fa0efe50a3bee5ab60dd405f3c1b9b3c5d11e7b5fce3e34c1b0fd176ea3b49127e440adde4bd21d0a807e674d91bc57fec2b4f6408ff66932ac55c96e8e8f1aef9f1a0596121b0ba43672012646a6614d0f63f3195638ad1b30180be7bef05a4feabcd4b1ea577c079e2f32c3e9e3bfbf061c44528b36aa6501229426274c8a239d817ced470217663c35b1cf98db45f197fd878c1ac307bcf196bbf64bf9c79761095f9fe31674fcd12d09cfc9d96027e15ee165bd3f3a8d3648305b29b653e2c4809c71a6f33137d101d224ec36884791f5d09fae241a0e66ecbf5f5f71697adfd6d6862e0a6da7c03ed65f2caf0dfd2cac002556f17e4d084a30a63f9b930062bb87ce39c9d8a6de7a32fd29219accd81fc4ec102789f69b3bfb95a480266cef2c117d7e7bc20e3283cd2d324541801ec61ba702a14f0a5687e12b4ef34cb92545d3054be84a5b63d4a3516b57c3244b94b8c055646e2538c78ad3fa0dbe15f16e73aec914424335cd50991c90f0fb36bb76803a2c0ad0102ca68883b64dcd091247fa0545c46ac7d732ca2e1ffd25b61baaa9153bda2ac8bdd675f149d63ccd0fd52db149a7e2b7bb205854622c63d48e9dc2f655e8e2667d0726d6c075f7c8fa4e067603750b4d9343d3b7f56d22e8b93d33576179c7d23baabeb26be0d1321d5d59b29addddec721ec15204922e5081d5c650cbe0f7eec3b35a81996c43eba005469f022f260e3d95950206475580d186034608839be8ac79a52067e42b27d3354f4b954b838bdefaa00881a942f817dd4fdf9c9b8a3907476540e07c4201ec93f2c8b8dc83ca144ea1de97a73193469618881c277b06ff938f71156eb656bdc856845ef97c6883cc97a50a995b3f971c1b48040b559793be7dae4c713edacaf97cf8bf832422ae1a0711164089a397c709809fd77d0868bb26708bf57cac2e7c87d9eb13f8033a7a8fa4158e489fcf2c21c409d84fbabfadacd94220145645b4a7b86f0899dc907e25d0cb05e8289e18cbadd49f1eac9cfa689fd233b01c7091c7c6d42ca7ac8a9878c127d0fc561a533a2176145570dcb5f4d0ae38e48801b922829ed84689020b1699bb764fade413dcc6f82804e1903554fbe8692efaade226116d317d6b05710b2cc557e08b8b0326338721f1c34cc3aa474fe35a7be9755c14aeaf08423262437ba1017c07a692afbce4eb30f528b8ebdc0802a1098485ade4826f84e07c44c38d58924a4287ad9806558f1eeda7b3078e44006063e84977e954bfa7efd5b8cdce4370a738c82b0eb9ba18b488bfeb559ac4e9366d6f93844d36d67b328f44631c628b87a657cdb5e3d670d3be741b570d37fd4b5f3bf4685c152fbdc68dc2b5e4523bf434dcb59f2eeda1a73fe9172e0000b206ea179d865bcfa57ae8d33cfa4deecaa34be3de72dfb815dc742e4b2e8d9b866bc9b5e05670d3bef41b67000079433b578d8bc67dc95539e8685c752f9dc295c2bde4be7029b8e8dcaa12b9ed45120297a82950d9081f4f1a40a74b049de161d8593fa70fa56ec82bdea3f10d4f1b0992412e4f4f0a97110750062ca02f66f114a74f056495906ae048b0b1593cbcd318dfa404c91c726790aba283ed3853d92a9db34ba9841a43c01399e25b84a92ad5e6d8ab2c73d9f366ce65d988986c3bbd65aa95a99a6a63b8269877593d95f3530141056429a2123e053c14f9ea3ec24ecd4ee735f5acfaad9c3b9305bdfa23a4f45d9cce53f8f32344c7520842bc646af86eaeb33212fd780c9bea73056254ce31dc9753571dc2e3d9bd016604935f1eb6b8f330e59a952159ca24566daa0ea98ca0c02662bacde98aaa0d928e3addb6a76a3a01bacee90d32b880cc5fa52537151b86c601fc60130ffff5f1d12f8ebb20dfc7cdbf8203eb500c6bdb571751f691b6a109351f29019bed5e817bd7b9ff77d7ea9c2d6b5c9030da28d9d076003e4bd97eaf5324d2c3c851d05039027ca2133aa26b40a175ef19c378bbc12491d69e9b644c212f61d1640dfc71bb6a88a89c14c1b925498b305b4cb876c9007a92e55e26cc7a43bfd1df88b310b9f682b97991812346ce34aaf75618a234c061b14011a9bb301703e3c765d46a23b55dbf049baa77829a17be1efb3add627265345fae5c69168a3ce896a5600495f5bfab24bba97b830f0f5f4f5c6d81de053316530c7b56409a8debc7be7bbcdd387007d2d8630a724b085ba608d2c9f910827ec815fbd80af927849434093daaad148e5e2e01955d2e6070a8584c37dceaf96fd4794cf633b82cb39200780b12160b511cc04c351d3fa8531c21e64b92e46a3216c8133edc10a1948236fdb3046f0f73123518bb08e0959423dd1fc75eecd066b0a82b609bb60ae1773a1a4797596caa21042ffdd819097705c0f16e8e6c756e121b3d1638935621554fe0cd632b41b5fac1d840b1319589e955adbb698904e6ab2b615ad52758621d18209a24b7727b93f939afe45f5919778437186e340c5da06938a0eb85e8c2a1ea3c8304be98fc15c06d9b54acbf91122e75cba91aa0041932e89cf935eea4e47d1231332bbbdb4922c5448faef0f555883e0b14a46ec819649c98d79ca94d02006ecdedab7a2789c64503c0467806ca3e3ccee3cd8439a3d8fbd308681f3985f579d28ebfd7c27576a51705ec9837439e2ab95ec74a240c94c26cc0b8a498ec92ff24b5a2a322275bcaad608b7ce57202c1dfa70664ead6b64e76fd36adf7b7fb638d92b6015cf3bcbb46d8a6e88a0747a7d7a62fc322d94871eb73856cbc1f281464381c9dc0f5ccb119705f3d46e56a4b01730808c5fe6f354418a257f1b9a051acb720aaea2f8320e3650dc6e32a95df897587977c5dcbb72614a9cdfc590516405a37dce6d0ae9735c1ba8bf019b134607ad9a1309b393af52547559b7b33b55bcb14cac04a1111c37492019ed343335c12311b1ed3a95529780bab5856a0d48882432594d0b4e1221812eded7781b41298a13df45934702005c7041149f5de4acf451dda2d2b793fc008ec1e6d55839f1e02fc560a5b5ec621d01d0df35fbca8295a078e1408f89d7d2786faaeb829987921c8b22da2d88e5a73a90edb77872e3a45539d9de881c7a46b7ccea4393df00f0fff861569de4f020ae043b2252e27fdf50be392e4205d9de132a2003f64a4d8ac791d39ca87d9b536b3c530b479a27c72d1c5b48b985f905b4f1583d70e3d0aae3515451fef4fae9dac19bad1702d45210b13460f052c328c06db2b6cbe2c52e320c232063cbc1711da13ad264e3a154fecf77b8db2bea57cde2dd6cdb1c377d29c7f6243cb001556592f039ac90214f34071d123121c91a4703fdb7366a5773f69e1ef4fa2eea443abaf95f1e000248e2c18d3c5e070ebafe402ca3bdfbd0079afc689d46cf295781f508232c8550ca82197becd371a9792dbf0f4267f6b8fb6f433d439d3ba1dcc27a924d909a0e1ee59b1ca9ed8ba804202dafbaac3425baabe121e1203be7891ed61a5510cdc493694cf599de55cf608830755d45c8c2066c9a666bb34cb333b0c2b497fe868e1ce971efb2bf61d25e81dfa35b7fc9b98308ec81d2b4e96d9451f0227f215aeef1aedb212dbb625d098b9078579073a076bb1b940328cd012671591d8595e5e239e5b6f2f4fc107dd026cbdedfadece4c005a2913001004e7f600f26937825055883e993e8002d25b44f41bd7c7f19b78ac6b341dfc89848770c027d1018849171e2548a6dc2c6b7a8541fbe2f29e418563a51846da611ea81391bcf951fee932b877417470d5b82774225e9c9eccb3708a40f373b679d3e96a46bf5805805d040f15a9285894bc4b53008abf6ed339d94341e17ef71f1905f37c359cbd8cee4872692f849e02fcb426eb2384a89df09c61048158d94d5ea3e738818b15e4fcde2c5189123051ba41a240d22addc510d6777abfd3b212e7d89db14e203cfff6da4b6c850f49086c7b777d6bb81091e40b2012f4b87575ab46c2be6c0960a6e38d17ce3707f7f900a1d7dc4f644d8a563cedea2c434c3ee34c917c4ab8f4298d4f0a226294f25d0cb15a4dd407e99d1bb49744bf3392a20bf1f8a543efd4feff469fbdb1567ddf45ad4eefe4301c2c96cfd8de7126f87996af3f5383d1491406c4c04d135ca7aacf3bb65ec1f2d9e529b23c87dd11fb4bd16dea8a10bafd114d580df3e190761d41fe6cf3bc3e7002edb09041a21d10839c99484f5868f765e1d1a53e104a8714aa9d46ecf4a4376660091bc87b3ca8e670ff2c1d1ce0bcfb609940e0ea960939753654a66d7b4323a55687df8cfeb70117fc8479f8da82302b54ec8c668eca2884d7d8f6f384f1c822e111fab2131fac85f137876d5cfa454bc5ace7e9ceaac7a61238b4348b943f385c056993f4bdf710488923fa13ad00018ee16820ed41bd54c3189aab006dbcc20216b313f2a6362f9dad9c2c5e5a570fbf9bfa7da425f3c578dc368216c10041230759df20f7cb5595f553f4a939aafd5b6721b88b8e0aecbdc4753acbe08a82adb48477ee55b4f92d4a56a1290e67015ce9cd17ad9c6948267ca0fb5fee0e9e7a98f98403ccf2fad522ccac45726fc1e86a991070df5f52a797932df6c34ada50fc2c8c10b9184df3557f6488880524b3ca53761528a52b4f032d5dc6dac1d599bdc2425ee8cd2a5583b3788f88fcf46c681194ac4d69d013c868df3dd912bd2d7b4a4af0e9093f062941f4be094afb96b1a33301afe8f089222c8c833e498b803d8a5dc1c31755d8b20f04463462fb548d1eb49acea762a3372a841be6cdf21cb89cb6b7b6255942faa61b8dee05aaccf18f39bde3394567f04da411873ca257e8770a144aa92a6e66c30706fd6c6a29aa18408f32646580dfebf1312a81300e85df3ca41cc2b71b538df45103555e4cc6698f4e2aed9f54e163491aa9ef105fc5179371475a9a8d8cb5789ee12661f4036e36f57539c4ef27daf6a47059d17a98b3fa824b48a050e804ca43f58dfc51c53c04d01122a4ce748672f49032735dcc71f7378e021d1a46d9e39e1529af1ee5190aed3a7db0e2e2898f3466616222484e9c3eaf5d001bb0b2541a12508c58cfb81eb5dbec02aa2653376a93d4e8b8ef4db9f16de6260e74ba54daa138b5d707b77059ed62827fb2a87e363b25b26466f67b2356e30e002a2215a407a19caa669f902b14134a060c8639f9f59786f80a731bfe8f600100107120f87f1b7e9bd0a10ac3d573a0d18c5e860c452d27100625c7b5424b965ec60ecec8093d6a7e07aa0c3fdb7f6fa057645a34a26bfdd5cabb7379f386f6535c120cbf12efe1f9aa5e1eda7a4590cd88825d9a27676ad0fd82e56f9fafb661ee1e8b61653eb5a666df6ab4ec86b87a02dac0034e2a14213d62b3883c3751ed0543d8e5962cfbb275dd38be6d407bcaaeec75084165a179f30871694f4e89b72e03dacdfbd1d299e8bd3b404e718059c099e845e14053553c8d97fb0e8e40178ee84d37b087f030966ab2036db9fb85c374d2e9e2c4c2b42c4a8867c562f22c8fff8b5a19a035199316db065d4d694f7d15de7b3f740582552480078f7a7fdc4be13c8222baa44f9dda813a762148e26a697f1a65b109fc3a134db7888d7e0cd1c0683b78cf5361f7e94ef2ed634d71694b02ded477b7a95bc33e0c7485a0ad18a20a781ec3d6a9083235bbc36b915c76d888d6bc5cf08c1179906a29656e9be1485cc73a84c3ebe005f38f42f7da5a3875cf7add618bc535e2b02c03cc36ff752c6b0b5ebd2c909145dc50cf12537165118c990ec55b8d093498041a285b81534b531d2a11c86912911be37dc7e24076454bd06b97239bb5d38179347e0ff3532401459f66335971664a201e94843d98f8367904cdf4de3ed8e37a7fc15ab38dc919cc511a5bd1e3cb3bc79377315248817ce8cb5169a714c1eb8826fb4ba5af70732a8f8bab393ec496cfd2bc776f9919c777693e5ffa7c5e55db5f2071e729e1460d4239475ce7f340ba4e46ecb5c11038791e8284588f62b24d5d46dda1a8952a02e372191ffa422f771de7b805e0a0b31f2a7c126f794d68782cc1b3305de885a485f9a0d439a4d9167ccc8a0c353a3a30b97c6fc68c6d21ddb2e5902ed40abb1248aa25c9ee3320b31bfd497a0937f54c75acba0262ec3c23b4a61aeb93f93d6af2ab5f52a1fa3126884854ea034a5c7bad4e10280f291d85920aba78303c0639979b72664cc15bc1bfd671e18eb5f0fc5826b715462827920a21042200c388107011ea3b5be0abde5f6b7b56fdb0259d7a3366c46a37b265227bef2da54c4906fc09280c7a0a2dc026ef036a006ce23e7600f440aae514a5c59d32ea56ae6cbf2e21d27a9a2bad8f11804b515adc09c20d60fdeb69ac58b9e2fd95d6ffba952bdbb34f592556ae6cbf1069bf3445c8268c884e20c16acaec13666007948082893569a270428a27a680622b47217b9060240f7207f9e59bdbd0aed2cb377b8076953a7cf315b4abcce19bb1a05d65976f9ea25d25976fce8276955bbe590bda55e2f0cd5bd0aef2866f7643bb4aa96fe6827695367c7317b4abd4f2cd5ed0aeb2866f7e43bbcaa86ffe82769534bc9c41caf0cd7002f9663100f9e631fc7c33197f7c739c107c73197e7cb3197dbef98c3ebe590e1fdf3c678f6f46438f6f4e238f6fa683c737abc1e79b637bbe790d107c739d3bbe998d0f7c731b7abed98d39bed90e9e6f7e438e6f86e3ce37c711c737df81e39be578e39bf1d8f9e639dcf8e63c6d7c331d6c7c731d74bed98e34be590f1adffc8139df7c07edca727c33086857bef3cd7b68578ee39bf9d0ae0cc737e341bbf21bdf9c07edca76be590f39dfbcc719dfcc8719dfdc4719dfdc27ce37fb41c6378ff1cd627c339c6f0ee39bc1f8e62fbee39befe8c5778c5d7cc7c8c5778c6ebe63dce23b462dbe63cce23bc6a9ef18b1f88e577cc72db46bf4c077e442bbc636dfb10bed1aadf88e39d0aeb18aefa803ed1aa9f88e5e68d7c8e63b7ea15de314df7107da354af11d79a05d6314df110ced1ad77cc71e68d708c577f481768d1df88e3fd0aef189ef1886768d6abe2310b46b4cf311cd47263e2ef15189ef4804ed1acf7c341393f858e623998f767c44221e118df88e6668d738e63b9ea15d6311df5109da3512f17188efc804ed1ac57c142206f11188efe804ed1ac37cfce1a30fdfb103b46bece123988f3cc41dbea314b46bfcd2357af98e6c68d7e8c477a482768d4d7cc72a68d7a8c377b482768d397cc736b46becf21d3d40bbc63abee315b46be4f21db1a05de396ef3845bb461cbe6316b46bbce13b6a41bb463abee316b46bccf31dddd0ae51ea3b7241bb461bbe6317b46bd4f21dbda05d630ddff10ded1aa3be3704b46ba4e17bffa05de30cdfeb87768d327c2f20b46bccf2bd81d0aeb1cef7fea15de31adf9c85768db16f9681768d6a7cf30cb42bfff9661a68570ee49ba3685706e49b6ba05dd9cf376ba15df98f6fb68176e5107cb314edca7e7cf30db41907da35fef9e62db42bf7f9662eb42bf7f1cd5d6857e6e39b73a05d798f6fd68176653dbed90bedca797cf317da95f1f8e61d6857e6f3cd3cd0aebce79bc1d0ae0c826fee8176e53bbaf2079ef574653bba721d5d998e6f168276e53cdf2c8676e539be7908da95f17c3311b42bbbf1cd45d0aedc465766e39b8da05db94e575ee39b91a05d39d695d5f8e632b42bd3e9ca69746534baf29cae2ce79b97a05df98cae6c46572ee39bd3d0ae1ce79b9ba05d998c6f768276e531be590dedca627cf313b42bc3f9e60ed0ae1cc6374341bb3218dfbc8676e52fbe390ada95df7cb314b42b7bf1cd53d0aedcc537b3a15d998b6fa682766537df5c05edca5b7cb315b42b6bf12dbbe4c03a78915f76601ec0c81e7cf8610b03840c826ee7421ec6aa68f3bba773e2f11f068376e52cbe390cda95a7be190eedca587cb318b42b5ff1cd63d0aeec816f5904dddaf9eed139f18f507ee94ae83cf337ab47e7c485eff6687904857196cdb6b9e3a50c6904efcad98a8fd26180d2ee225d45271c7c08e3025b7ef8e2052e61bcb04017207697bb5e01e51044c332e215316558f912e15460083855769071ac1011c7051e2619558a20a3053063c27895951f7ad0c070c1083028e0c3115f7c5701e207ee4d0b48bc994018325e3c75418805a29bee721428d3c5d38e4a6f104970f11d96d842d7755d126ebed9cc16df7c468b6f56228b6f5e8299c0e29bd150a0bd02da01f243c5140c5a715ed7033f25eeae027669f7c1564ad784724da97374b948e9ba84490725f3ae4abe35dab5e935da75db7c6fb4eb5af1cdd1ae5bc5b78a765d2abe9b765d36df9476dd29be3bda75a5f85ed1ae1bc53710edba6bbe3dda75a1f80e42bb6e07be85d0aefbc47710edba6abe59b4eb3af12d44bb6e13df4368d74df34d84765d34df2dda7599f82e42bbee12df4668d755e27b8876dd33df44b4eb9af93e42bb6e12df00a05db7cc7704b4eb92f976da7591f8aeb4eb1ef1fdd1ae6bc4b704b4eb8ef92ea25db788ef0968d725e29b02da7587f8ae80765d31df2eda7585f836a25d37886f0b68d705e2fb02da75c37c1fd1aefbc33712edba3e7c6340bb6e0fdf4868d705f39d44bb2e0fdf19d0aebbc3b706b4eb7ef90e00edba5ebe93d0aeabc3f706b4ebe6f0ad44bb6e97ef25da75b97c33d1aebbe59b03da7571f86ea25df7866f25b4eb4a7d2fa15dd786ef0e68d7d5f2ed01edba357c7f40bb6ed43713da7569f87eda7567f876a25d57866f01d0ae9be51b04da15fef97ea25d6120df4d685708c87708b42bf4f32d02ed0afff87642bbc2107c8f40bb423fbe9fd0aeb0cf3709b42bece3bb04da15f2f13d00da15eef10d8576857a7c47a15d611edf04a05d211edf26d0ae90cf77016857b8e7fb04da1582e0db00b42bbce31b05da157ee0fb00b42bd4f30d45bb423bbe5fb42bace33b05da15d2f18d00da15e6f99642bbc239be1340bb423cdf0aa05da11cdf0ba05de19def29b42b8ce39b01b42b84e3bb01b42b7ce3db01b42bb4f3ad02ed0addf87e00ed0adbf88600ed0ad9f88e00ed0aeb7caf40bbc235be2540bbc2d8378c76856a7cb340bb423adf54685798c6f704685788c63705685738e7bb05da15caf976817685677c57a15da119df56685758c67705685718e7fb0aed0ac9f8b600ed0ac7f87e817685627c5f80768570be61a05d6118df18a05d2118df19a05de117df1aa05de19bef186857e8c5f7066857d8c537076857c8c53716da15baf9de2cb42bdca22bd4a22bcce27b69a05de154d70fbeb706dad583ae1d7c9e9dea9c5c200b2e08da95e96985d005d3d8e8a068e0a3ef54f74488c5a2f358506a283dadd4e315510cedbac1d32b86a05d933cbd82d3143186136368d715e30923685722288ea05d873e0a3890a05d8d9899020e32b46b11335494a15d5b7094a1ad37634512b42b91ef6a1088f4fac35b37d385b0bfe228f555b5b2f22b94d2aee3e89a4407f25f55a0e8ab326068d721dfdb03ed2af4bd3ed0aeac6f9e926309da35488b25e82ab162223a2899afbc239ed5a2af1b39d0d0ae41e2992eb8551adad5fb95121d19de765cad3aae39ce812810e79973dc1b399aa05d81baaebe390c3c6a68576a460c3c4fd0ae6da6abea9be34041bb7266aca15d37964377975bf9eef2721f6ce758ef6214b4abf6f0e33dd341c95ceb3abfe3149d24061562d8acf481cd925924f6082376cc16b16c100d1929d2dadddddd7d62d3b29d322e135c26b2d93f2bce872a74ea0af74f5311de3b3cc0d3552a97ac695da4d4a96441baca55ae6aaeaaceba8ea93389dad093c91965668d325739b7ed9ee0b32f7f709144874ac35b26dc35e15c8bcc3c9923334bfe64c62532cb293d4629abb64d0fdf40bb078a5d70e9043692be4eb7b2f2f0d66174592f2e50e51256a4fa4e602399e4a5d43ed8b67d30ef5f5480e1c52c3f45ceaf94187902bb5e5a7830265692548afe9342658fe4e807533987aac192396b11b184da136554038d7825a6219969f548269ec863f524092d31878924a634ae4ca83d704ac6dae4f9551a400f636dde3c8c59b1a7cdd4c3581b356dce3c7d186b23e6d7690b45d3a594f31b92fe02c48beca5abc4f2bcbb0bc3f2e5270c4b0d3fa58461d9191af60b05670f3df8e8f36dfafcbff0c1b07cf9cc353b34fc7624c03b3efb20148e5c43c32dcbaa1c628e5addd798dba494f1abc20f1ac530bde061ac8a311e46f6189e333bc4d0827deecaf1c6b977e1d9370f4b43d804238422638c9b259b90e76ec6508bbb49c8cda8ca5a63ba6dc7c1956a811a7a3406e984ac380868591e140ab24384402241b1c52a22c44686ec101148d4da234520008cc408869c88eb91fd00002588608b1c4e5023055f0512b0ab688d26801650b01754008f5c11c908030b18c9059b740433405a0d308001401293246d90012b69b04b01804c4996830d60935254b2c44b98b8030ed68326f881b7de12f81d44270f04c0d2cb07414060129fbec99317028b5dde19de3acc13414a39c224b2c4d4a216b5a8452d6a518b5a6cdabdc878b056047069e5d287a0925cb956895105174024e93023aa205e10219b902019c46296902734642312e51022da9c434413003282ccb75855fcd19560058bbc09843005acad600874195970c1111206489232d02000493698153ecc03025aadba8ed26e958ae3b64dd3b26cce4e6e928bb376dc078bdd06dd9308a8aa4e4db5e4ea9e5c4c16480e8e9a30602549bb4483eec9e5ea2089074a1f303169fa254e1e440148109e9a84208293119e9050c200a0442180090538c100281c00ea950202a42440010b98c28006384085074020022b4800c602950950a00517aa58a9c0150bbc7001183090010dc4b08118b3c830030d513568b141ea061cb670e992830e5ebeecc003981e7cf8210c104108216608228a1863c411489029938499334a2cc1049a344d38a1e6890e40b1260a29a66043451556b4f1c015584c65a1c5166eb8e8c28b375f8011061c31c620234e19669c21670e1a69cc0a3f0d3a6ac4d6a8c3461b6ed879038e38eec881678e3c74d461879e0fdc01823d7cf0c8438f3df8e8a38f1f21f863fd2c201bc8fec922c30c3444d5a0c506a91b70d8c2a54b0e3a78f9b2030f607a0803040721841433041351841c63c4111b1264ca1cb9c89449c24cd4229a8dceaaf2e5a373e20f21120fd195a0dadddd65627777777717cceeee2e94334e9520b5cc45c9cd8cd3b86d6a9aaa69b702f282080962090d21d22a624435a4cd79a48f002002ff221c2a028948105b3ba4481261a109e690c8a220eb49c4820a34a119e4daa836e4c8886369422c50759c10061768dd0671dd08587e06e9a01cd139b50e36a5ab0aba11b8093a289973b3727163754da6ab925473aa30a047523a8b06ad38772847620d8be4729433d3364ed5b45b0179418404b18486b45c5f411209ae18b74269e1ad1b41a4e86d64cc8b082f89e848041a3bb7b5e1d7ad0440b028489c208829108a15107115311a620b8e5c10c11e55240920061320a960938c32b8006a801403808493641003d03db936505a62a25b5f623c0e9a942c09e383edc00326723e60e204c97801b804c0a40c0180f0d42404274e4618e1c99326c195a46b11e1d9a0f3587278ec730054a9dbee782ab00b8a114b514c58ea9e5c2614e00403a07000a8570a08909200052c600a031ae000151e008108ac2001180b54264081165ca862a502572cf0c20560c040063410c3063880258b0c33d0105583161ba46ec0610b972e39e8e0e5cb0e3c80e9c1871fc200f15a21c40c414411638c3802093265923073468925b6be8e68c209354f74008a35514831051b2aaab0a28d07aec0622a0b2db670c345175ebcf9028c30e08831061971ca38630a36ce28c28a3a73d8acb1f53584b774d2a0820c3a54744f2e32d488ad5167b71eb171441b47b871841de97b44f7e462979d37e0b823079e39f2e4a9a38c1d65b6424d1da9c02ef6f8813b3689eec925c75b87b97ecff2a12ab02b3686976fa8c6aae1c4a665abc694719560b87f56d26505b0496e540aa3d78329f430c6c6cec30e8a635e93dcece77ffcce9aa31b2b719bb61c393939c8640563f2503c3fd6a59440b089058b64117032a09f3e678c4d1c204f5226e49c5b8c13cbc3e89087313640b06417194ff39e451ec6a440f33d692c417afc60b3764fb22e635ef3b8cd496393d81586e555d32bb7cd28a3dc210f0c1b8c6378962e6c71296a732d1f38a5612f9e2d50e4cfc7251b38d7c2f9169b828e67562d13b765b00159a00d91203b4234b522a14c6617acb4a881d356a3b6984de6c069ab69329e5350e55a54ce398ce25c0b91539a87b1297e78e86d81237fa5c833cbb9719190539a6c42971e2f70e26a14e75a56597cfe46c0a2811357a368809a531ae993a144973670e0a48503a73499c3238da39c9e5636bf42f491b26bb9f858bf5f2ccf9f0588fe4a918f1660bf026352ccf1b126fd6a5228f6afa4e6d9fc869e5421bf552b57b4af02ff1c45f9c948c3b3c322b0129566e5430efd0854421709373d52c488906fee488f540fd6889d5633529e53d4114fb3de552bfb714680bcca9a218a8ad2e209b18610712d494e69ac5cd95e8857d93f1fe452494e473e2deed4d2dc3f804d9eb37b009b820809727625b089e5ec4db049c8d939804d438838fb126c6a39bb126ca2cebe4112d854c4d903009b8c38bb06b08973f60c601350740340240cc52e3807d671c33dac0ffc430c2381984164426862b62138225445f4112b2046e2a1580906d827880703f4e30191c992454896a8205e1929a9202929214192f0e285c55ec004093113268c9017460c2be8cc983143b6316484584a9c3943449e91bcc443b1d2aa6117c3564d10efd606a947a0d0552334868df8a06a462ac9e9880ba966a4989c8e384be8887badfac2f6d489d417bca73ea4bed07afa993902c54adfba98823a40153a5d25cb66d9d43d63e59cf132e761d7128d9946464753638b716ba8ea341bb48dce8d951da0373c3882c421e44e901c2c3c42730cc943848e561d45ec30a267e80344771c010100f644c0c7f1a8797c7a48b047111f13f441419f0afc7085c0e80f0bfc5c00c8512048b4ebfec1200b12199266c880060da2025043122d1bd8a024b57403130e1c6c69e2a2a4cb921c3ad0c1032f1f7c61b2c3f3e044bb3298290c6880035478000422b08204602c509900055a70a10aed7aa42b0022f0fa49d0b568020a2a70195970c1111206489232d02000445d975a8bc36e59098a2810b916b64b0e3a78f9b2030f607af0e18730400421c4726258424388b48a1819a24b7404001178fd24289a80820a5c46165c708484018d483a033a4fc200a29870020a50294851c094060079ab008115605428a0a6eb9af144f54885d108e66474576ef3ede4491a74b4ae1cfcaa9a3972e483d0a837b66b10600daf0ea56db861e700fcc66be140008c23017b6701500e06443c0ee0391e10f344800e09d4c102db31013d2dec07aadc510108020becb9c0f2c1001e1a80796c400f2cbcc7cac0070d35d870c3962e3a7c09649bcd1edfdbc30f4b79866e84edfa05a015505447c4181b68f7ab6a86c88f1419aa34b840f4b1d8889dae12a30b9eddc8e78248ec95e12151c68c12cb44972c07a9c3af2acb4a108884fd4aeb8320127b7074ebb166f79062970f3670fba862b74f1bb87e5c11370453bc7f68b17edcec02d205dc40deecfe59306096851365d83178868d43c39ab1512b07d6b068ac96a5036dd85894da3a7cc3b681c3dad92d0b07e4b277b6cbe281396c9ea8c3d6c15e56cf97bd63f7403c560fc847dc3ebc21e0f5b381c02038cb0ac13340311c1587d0c24448711138ec182ed0881c8ef08204ef4086c194611f38090eb366828067c4ac1244c025c644268e60346438893d03975834b089a886b9039d93cc3b8a2978a3b88a3513ca6ae55328a52ba585ae04b0c3fa1179d83f18cc02127bd83fec830cfb030d304c0d40d8c041dcb0426c815550c1660a29a2580345079e50e3441369d0bc07f3808200ad84acbaa08eb2680bb56a888a2392655cb6b5609b46b54ccb669149a5916ed991a391b212dd93081e683b5775751d7e434f58e83c6326280b9977cec41ba90e8048ec45aa0af50110899d56084024f6568d0044622752578048ec43aa042012bb102ba8528148ec42ea042a05a6402476a0ca0088c41efcd08eeb88e398936d51079a23f8bd76f0e0439719c7296d9a47e1259533131bb127a949ece25861bce6a19f87bed5a1269e820c1e8c2ea9382f824d9bb3bb26ab5f34789a730e6b71759899ebbc5903cd379c9057302cfe92c1d37c83cec2f67979e8cc8585cd3b889a7ad83de9206aea3729ec719e3d497e30efe1f689607079d83dd12356ac8d3a8cc1c3181b7d7c473a2b1b70be612f47b872253d1ec501e7d99362b5a379c15cc01187e1c8f2153c8cbd41e7fd612c0e34df320e326ad4ac9e875139c36afaf0d6617c86d13c745623e5c16406871f27f4f797b778b87a7809f261256762c24b300a142fc1155c80210b2f6d16a931ac043d3570ea4d1c6fedf0127452cae4ee79e3ccc3d81b4dbc1c9a9e3df7c69897ec6229b9e44ed2891c3649b1128cf7b0128cbd11e7a5af1ecc85953c1fd60f47bdfc2af1cf9f0ab0870067f7847f7ecc054482ab64d90ba746bfc8f05e6478b085b386cd1a766d1b0823bb8e560cbb960c84c1cf14769d002184b38bcea3a78e9d382f67df40243c76c8fa28e8bbbbbbbbbb5171b9c081be474f18d05f627876ee4008672a294951a740c6db15b3ee6949f2c88e6715b64261e1ed4a88024452406f41a16f5cc1a4ac009bf6a104205212d1f973a34785259699f9496f6c0c401e2a8ba687b131b6f81dc32ee95246aa06189e7e94446699949f1415988c18a3f4cd6505a10439bf2127587e7ef0e3b772d0c43a28b1c4dd237af53253934199c6d4c785c138dd1b71ae91c5e872f532baeb6130ce9c2c66716606a5fc3e28f12381c9c545be8ca2c4ef545c9072b348499772d1c822105809c6d228b3bd1765c6d46bbeecd127142b49cfcbd635e90cbb8d7ef1244b297a2b7a184323eadd8f1ec6e668f9396a3c7755f64f738782e62868733af05c2b9059b2387115c6e4d079ae183cec5a114a7a942c1a41e858980392374fcb89e221d2c3181a7d1e76251c79189313e67997d77925854870a3e0a32433d468ce5b34d23c32bdc6149722d3515212565ac92e66d3a676e59631bd76e4694ab08d6acea469da5642d6a588972e85958eb2bcf61a9c5db641a4e8e4b043413a6df3cc52f0999087aedaa55634ca1cf29e5146988f2ee548fd3a7bb6d389eb0677092e05429e5f3f78d3393ab1036097e01ac1bc565c52ad5117bf970fdea45b6527ae1022b1679ac3261a5ebcec9ac86ff3585e040f63689c79d8d1de6417b9d965106966d15bd3346db51f8d953ebdbe78dff679bc5372ce9cc43ce968386734dafd52d0e2c15a734aea3ad2e012f5e9d38978694a6b3aaca8124181b0f504764d872d282bbccda7443bdb078208244c4d7355d576dbba27c9cbbcef0cc29c62188d2b86843ab399426867c6eadcf9395993b279075153df7ea0a05ad1684681ca238e9c569ccc65e879cdf9fb3638c1c35819587cf39ddfaaf63b664c9224da7694042e84480c91768a76b9b6dfa8b90b0f4f739817b99ef8ad66cf752842a43bbff9b6f1f1b64d83b132cefc56b95f3264d8054920c10fcfd9358be292abd5df0b0c909ca6eb799eefe685e07ae341b12b73189157a344a38c661e2b719e6d4e219c87b1386ebe258d9de6344ae6197473026523ea33f732dfae840ea2b0f8751058a983a8a9cf626578f9cc4960a5b9b499d28e943643b8cc7305e300cfd9496628e55cc138f09dd30ae4eb8481be2c5b7555e85fe9aac038fecacaf7690502ea9aa828f52ece9a2a19c7c1ba262a5ff956d886b04fab51d88520552bee7cebca3bf82ad52a6a59a6c555e7ab0a6985edd3aec2efae89caa977f704db26edbbed5b69a6aab00da639f76d9f1d159c3f63cd5233fa44d75176469ecf3296ce5b5a7358b451a288c0ae289ac3e01b2d0e13d634cd33781883e3e719ce15df69df2b070f96944402bbe6d37e2088c0aec9845dd35f8178306f6a4e2974e8fc9cb333ba465e5f78bb2daf609a46d935fdf5c5b5cef99266b16b83cfd4ad6b3549f4603ba6097f0a59bca423cdebac35091ec6c448f3db399170a49141ce4e5b0a9138c9044e81a0461c6e738d88b56d0637ae38cee1bcf1db4d88c4ad873138497ce6cc049176aa6c98b1570e1e44825d999acb37f758deff2e08d8cbcf39971c31e139970d2f0939844b2c38717829884e1d5e22e2d0f74e1e5e1ae2d0774f1e3d75ecc461179403dfb00b6a6d88548f8da60fa9446c348da6b32a131b4d0faa20b0d1f431b23c92873131e2fc764f2e40a4e91df777cdf46533f573ca383cd84665ba260c5159a460139c5e053651710136c13a7af434b1c73bb065331d8a4fdc35ac047f0906871df99973fab661a87298d762713e59df8a81c13ebb67ee1d9e3eb75df3d361884b413e7dd904d565c3465048d7aa4dc817e4836d306fe33cf4d5a4f370ed3c9cd039d867f73c74ed8331f5814890bdacb8c9f02ed41fde2ea410695dcc0a86859fdd831d7faf1cbce8147c1787becb20124bff9e3b558c515b4d8f85e86df3bccc5d4919541f2f46ef3904db86aa2c20ef9ee7999c51d3782ed4542b0991d859d165924934635ee8f15909196758e44a1b1a662e8b5cecda16bbe0b6c1242cf3cd654702968765aee29eab573893afe2272b9da3b7ae30941fde7458d16744cc6ab1d2f4326f3367b573c30f56f4dba2de36e464738edbaaf6b9e67647cff49eec943f16bef0f3eb90e9a16fec628f0566811d3a7961b17c8b5dd08568cdc778f922cb1e3b71a6dea801e280a0b62e8af4062a81c2269c4376adbae59e99e7752648af024f1b44821e244867420cf214257321dd095e3462f7a211f4564b48d72404f8452012fb531188045deb4c602714a453f6c16804b49f759b13c8ae208814d499b04e4192b2e4b8b2ba1020bbbecd817cd53d71df0b076feb3ada3d6ddf0b07d674568782749a5a9dce6f667e3170c0497e301a418f1c88ac7de9bdc34aebf943a6a93874601eb8278b5498310f570d9ba93772de0e9c6a2589c05360f0b27960130c63d7336f8f95589933a1f3197f9679d1284be1866c69db3c2f66ceb48495588af0e63367b131f559b670aa73927519f31cc7ac7dd0336827c2e985af389eea8a3dbc2d6f6d13c5f154db123b49220e837b1ec2341f42413ab51ccb9b59b2bf9fd4519e4ad267bbdfd090a02040deb38729345bea7c01e74dd4fbe9f35a16723a89c9993ebf5cdcf9fdaef0b7bc2d584cbd94deaa9097a2d3eb068fddf3ce049969743b02448de9d699c01c29d799b04e5cf7148506a096ab3a14a493e71d84b2b8484fd242eaa527915e0feba5d562796fec62b1d9b66ddb3ccbe85f79cd61a76179ad52a1bffa568a4522b4512c9f1e65178b556144bf10074fb28be5ccfa3676b5dc5b48d334ed4b21ce461786cfbcf3ae30969037eb5b1c1689109d1772b14b7abe55cf812a8ce93da1afe888e5b9a4c2f4ebde27d91514f434e46b1274851dd8057d2f1c3ccecd983dc34a1bbba69b8cb6ea8b8b0725dd774a8e07da7c53dadafd605d67bbbb9b55e1c06fbe9dd7aeb6d825fd05c7e37cddd46139918b305cc28091de9def07f3322749855673d67492aca0562bced75c88902031292e4527c94b9ee71990ec9eb4ef65032ce99d8995a42fd13eca4ed2675782e642be5c32a97df6d1b842f5885dd059558428494cec82eed5255c6bb5b556553e65deda2dfac0f60c18e949ac046359807919024dc1060f267fd1b0d216027fe65d26bba7e95d757641a7597f99abaaf31274e2763f96ab09e208c88881e04d4c8f9dbfbeb52ac2a3ad6bb2d9087386d1aca1ddc86d3263d83463b65315bb26d90e3d91fb7910090bb78c45f4172076bc3f3f5dc8cf3937ce6b5b8cdbf664fb3c0d0bc9c5a9cdee697e54a26f8c93bb27f1f3e8ab8d6cc98ed5227a18c3038dd7f2fc7a54c528b5ae89e6dc56abc03fdb847ac3eb1ec6f0c043c61899579a0796e3d436159d34e3cf6357d460d2271474f6a3598ba80d4f2eb32a9c328e911591aa2937f8b1109d7329a5ec4c4a3dad086306339f9bcc9c638c50b2fd1c043132cc5c66934f9a8fbec5afa8885d92eefa94aeb92486879a9f73fa9c0e88475969bac76a69d16172eb6388102b4806596dba043a2277a7f79b9cb15a897166b20afcb37df1c9f427309a6decd27383e8d0239c958a418531d3aff0923b4ddf2c1b05637bf2fcf428407ee2d2067642d86a4523672523ab24baaf7bab17bc8d7a9259f7248f7c0b224dea30ad879a389fd4b3cc697bf6cac3f435c70bcf4b8ed79d571c1ab7d1171c2e5682c13c76cda2ac8baf3768b79146cd87625c51569274cfd4b728916e8520fab2a311b1128cbae8eabd88f375af89687cecf856d1210f63784cfd729ad337db95903985b0764aa9c623ec73b14289e115a12f37865ab0a97f4e3d2aa81ec6f8b4f91ea2af36bc2342d8f0601bf5d35f75882c5d61a349858dbaa7f8a9b086d7ce8a60c82be6cd87313e67be3d02fa522302faa2d37aa561a4d2171a44aeee493a141c4fe530784709c6f848fdf41558890b095188f858550f637cc27cacd9f704f435a729a02f395f05f47586d75ee4a2ce4ab0f6b89426fa74226de8ce1354420244323d884f6702a10854a20244029ba24f08c70b2111e8bd2f8620eeb5bb2ca05ef75465ffa83cc8c3189f2ebe8f823666938bac569bd34a0491b67d03414e08f2a5c91cc8a366774de807f3acc2b4cf5656daaf64345b65ce8457197f739d930877c2f6480b3611111de99e5458815dd3a1e8f0fa086dc1a6233f3d3eeb618c4f1a1fbba7e8db55796ace96e3c631ae326fc951c655e6b0db3e332cd8043dfbcc00b94c214d74a06f8b46eb2a6e6d01b4ea68abb88d8d8422ee72591c24d47259a2883149b6b061c3468a3552b0b9c30b1b3667d87451fb609db35a7a7685fac64a2a17e22b05a7daba10540ee49dc1dfbaa74c95398bf3ed298bed4c386b2141661b6f769502cd09f4c4df0686b7fad8c095427a565d53d16df6f774aaf26e098384ad94fc29b5522c9275ae7b9a1a19dab67d720a7f8dcad7229696585eab30a979c4f2dafc348832898f1dc8d5a38771ce7d524ae9bfe4c924568a0a8076a66c0f811dcb2fe773e3aef06b9f026211313d7138d88ac4f4c45913bb434d4c4fcc8e330f85342c6208218490f5bc9fdca2c76f0b3b4c6e4eccc47fb670e92c2c2bf2d0b1628c1ff23066051b08c4decc70cead67190ccb6f5073bccdb34d839967db498fadd8c8e25f8715f8bdc02f16ce9bab140a10eab5560991aa7777e977049136ab475eab30a4674ef571de41252d8792973ae79cc2a6d62a21eab8dbb66d9baf12248884bdc964d73e24cf0e23729934d74c3193e6ace8d964339cf65991cfc47dbbbbb31249a83a3c9884677a6adb56728c9f94ce246e19941e6f5ddddb85c03feb50957de90f8b4e9392b88ea2ec42d0b657166f7feb3aee48df584aee488077ecf4a8799e941367cf849b682f5fd8a49cf2734124283b36340d07e025f9b6ad174354671f4c731a369a26f3dd5dee63650e63bd4725abb4a78d883760a969b0c52ed63ed667af3abc29a39f9e227ae6b9e489698e177d3b289f6bca2b9251deeec35ccf2b29d407bced5e5380c079c1d97c8192923e2b7a974ac6cda53f71bece2e9fec1995a4edb77b22b4c49c259e23968d794f0c3206c819defcf09e8fdeaf243c18477d6425184fb11b565a18a3430f83793ab844cef3e65b52a84db151742d0f4f73301be6f983c570e6a56f80cdcb0fc66dfee2e245e6c24b3c158da247874c59cc4726c3683ef29a8fceed513a755d32110ee7e10fb66e3ec6f958d7645fd745f3b10d1b45971f95cf584f519315e645e70395b0d422899e795c3b78f34024e92cb54a960e88447a5c3b5e4ee7580d16ee9eb6dee0610c8c31df1a7d95d936cf6bc1588ac1bc1447a97dadd7160fc6525cc026f9bd6af098cfb06ba59c543218731e764f945d517621ac1fad6e356eadd8e76513560243879fef0879a35c71019be673c17ba811bd79c2ac1f495f5a3c09e300988745e733ec82ace6689754496c147deb51fc5c747853c60e0a6b19e64d1537cf3cf40cc66ba47f994c7273b4d1cd355dcbf3b07ba2e5f9f9c1a66f5a9e3c5c38eedbe6a7413e33d7e51d6d76b83c3b65edc2c8737ca0eba5e061ac8e360f3b3f1a668130cb3e8f087e2f1dbce853db321160de0ac825d0aaa9ac4bf2f41e4fb56d53cba4ec32add3b22e46f81c763af975b0934c4bdccc514736677ccc010736900c03c6e2356cb4418eccb39a97bfddaa79766df3d841f986349facdfb6dd2cdbf931954b7725ecb80ca35cb133613764a573073c77e01c40402825dcdd4d72578b7de3d7162f3a1e3d9e4aca4c11c6b4047e8c523233331e37241e3c6298f1a07929b9c2e666663c3ba8a20d6d673b282c763151ab487e2f2fde3aac23859584c8b0d266da94e92c87bc34c485784b459c1a711574575c1afaf64c3462e7225feb83d1a87311f96034027298ff900f46a3200e733dccf51ce4b0a49753d8c5429f147631647d411f2cc9e502fa600e3fd5eb8e3a9b1633a2a5215e344466f1328f9b9429753429bb8cc133c3b3a6a91eaaa0aca382942979a494e38f67167368c811e70e1c39ec3cec9eacac73dd363a44d339c96d0c2594cccc77b8785904f402e1b6d8d5f023ea5c1dfc5e3d78f0d7671217e21210ccbc8e009a13d017251a01e1adc3923408a1cb25b069e5ec24a8da5949e79b1fad92ee8bb248baa32b9cc3ea02bbd829bb98fb9acc5f7d31402476f628da8b0f8f3a0ceea115b625657bba9f5c96016940da0c5ee69ac3364aa327b87085e19e385997310faf78f623bf6c831b7b14184e70e10afb4962f35eb824ecc0a22e1e74cda34b67e29ca147e1df32df2accf51b402e9e3dca247f3c58d14ba922f24d0b64c926e509ed79db346d6a9bcd22261b13d90c4f0e913e16fc5e61bc9ddf9cb39b0e6b92f92585007207c5733827e7dc06b56c7a06a3ab2889dca4c6429699794dd36606339804c223568a77c8408571a78687ddd49494915618cb236262e2564b7a92ac4cd2bb24f26392dfeb072f3a670191a0731b88041dc624a5944c7109c8d95580923285955ace2dc8b742f43e188db8cc33979c7d046027a08fc98379dbc7bdfa78ab4abbc2d6cf501366654b40de2202e2e49f24a6249a4ba6254c725990ce71dc37b401f21b169fc4a449994d39a1645a22e50a7d3cabb8cc39f530d6e78f871d148f5dec1089fda8888dd88b663d9aaefa5e3e7845db2c62255792a32e72fc8a5e7e78db56b94c6bc9a5f6099ba49c508014cd6f73b315b98a567e43dc57655f043ecf13ce2925cbadc89534e79c53cfb39330798adff608418a9413a4ac6f5052d80527b314815decadddcdb6db6a84ec62d612e7ec45aea324a357140bda5787c5948488d56216342d491ccfbe04cef6452620b05aceb4c66f1a12d284efc58327639665d994b8a472252f9bb3062101342715cc836d1aa7fa92a2117b0a337830d7cb252f622701a335a874cb5ba87ad829232300000000100000e315000020100a070422b16018a6a12e970714800d7e88445e4ca30704498ec32098a618080d2000006208d00800ccd0b60158a7d5496f9265c682062ab5183cd38fb7032b321b97a31e5400842f6686bd865480c56e668c3df314810101815b4646e1f54a0395efe77450fd6d4f44265960feae24d53620091c3047c168c330e6c1168f2649457a507f866a429b0b7560c730d38ed99b58d000cc67ebfe10235a006ca3097d0c167acd583261f743275fd82cf5cb0879500caa854bcaf7b4de10eaccca02b28e139578ba463ceccd168b925431de39f118c07b24edcd20565ad56a7f5a6c80c1a22cd5c5a4e21a2f05216babf810657dc1fc0b954ba0a80f2a3f31bb1ae60a608a8a7cecc3f3afa4420c4889837f05bc68c83b353634b790453122ca11280a1d61784bafe97c385c2aaf559866411dcac3a88536a4e9fe73fac8c7de900c674e3e4ac75e20879c2e59d40f38cc620a18a8b0ee679117a8bb21d83997217c177db02df3c2f18592b7725b2453f785a8ffcf9f4ed909386a9e8c15b3d82c270f31162fc8030f883de3a65115a14d1985cb83bd4b200c5174486c0f0bcd56b4a486ef7d0caf58536dab996cb70a0925715655d61224b3e6f9c1a3b6552e5e75c074326200a89329363f495767e1035a72f7a1908a8592187ab01761683baa6f2e5aa6069469aa874ff4646ab5346b2d017fa636c9fc868ff5d617aef1df0e103668a09b5be82843eecce81ed3f2e8c4607ef2746aa2966f5f44b6f8f100e237e19b16f55ea4f7a2de8b7a2fd6fba2e94d20b93761dd48e036ed3d5587697b960e0f411e969a0d1da2746c0e43aef399cf827f473dadaebebf06bf8c8fc2f57cc078155cd8efb0bd3045376d8e753bc8f49b40669cb9f87a1ca11914e456e46b821efd739e40e50cd109c1dee7a75f000324a0ff1784ebe65b6998ada753be923a28aeb387ae0d022324b8b1187a2f887bf6860a56ac5cebb404e2fe7d64c162e700d860ad2013d3c9ab5f88bc6c0fb1b9e718e9ac12f2a48144bce2da0abd689602aefbebb00bad9ad09323130edff767063903ae835ea529d58f4d4ace7ba64af1ac3248dfae8f11abf6b1c773030fba0783f21423fc4d8201df07f839d41f638eb478c593b9a1105bf68e7de390dc32b1562af5d0c4ba6eb95eadf339333aa485acbeb570c3932337e99b7c4e14fec2cdf59d9410aa3b908b2a56f09b88d58003f08208b8f0ba4cfa09d0b6fe07dc40450c3c15cdbeb89e4cfd93f0ca07ea5ccb2d1883799f0eccd606753a8392e56817fa92ab23c3cf5ea16b002163796407b73ccad8ea2e29662287c27dd1927b80bcb86f02683d04fb3303bb134facb05217b2ec52cdf27d648027ac5706c85b4754fc9b1626c80b62553dc2bedfc2e8658faef9ba7aa6cf477f140e72263765c42a813bd489aa25012e69e6d3225c91e87632fb81d5769cc0d62e8bef628dc15c8290dea2bd16f7b6b8d722bd164d6f0592a7038959ecfb57bf3d4df8b76a3de254f3507d7314d32ac1c15fc0cd05d60940baaadd9b52b364caf9a06f41fd6f8f1f8e5d10818d34b8384a11b7579455b307dce844243f90907287db5e9d696813ce7fdae2f676e77412116e9fdb242087631aac68698efb35d07e0848bd3d5ff4273569a62fedc734be35935cd32f8ca4ec2b7a087fc8b5dfd6eeb0b4022ebe268087233785664f87b5d16923d8c750ad5191e0a350849429e2d8d4fba3eb3ab72339595f34e45445bc6bc922241315e444e060be22ba74bd11084a6b58fd07830c14d90313375bcf8864efa7ef34106ae9004176d7eca361c3ef9a050506731e9b8cc3be0732c3311f15b9da7ca9287432d29a69351020f5c8a296223762cce55a278d6bc7c26ff607b0d2cf0fe774b8b12769c2d036e9ea2eb1a3f6aa921a5d4a79db92c168a83691fe8fc273b1479a7338ab1c4006355b70de0db5c532591f0fcc0d4ea4088de06c984353368befd89e1d3db6f3e6636e78e7004ec5e2a4184ea2a5706d1aea0a29d0048540f65a8f9434e0b9151a6a0cd66c494318d36c120b78c446dd10c235f355d36c308c2528dd7b6a6d80dd630e1d2c85f70ed926b3927c9e1807705bfe968bc3142793060ca7f669b474f5ab80a8bfc0d9ea649e933783e50c2d02b233eb76dd017662faed3cf7f0b6635a262f12e57c86513bacd888eaf097c9972b0520f7c66763017815f4420d076b0a29131edc2808a9fe2bfb302143bcd2de6183b178b71de387ac3634d0cad9be1990e8cd452b5f7c6d0189fe616ef46ea6a6a6587527eba170b482685c3ab87e8afe1297f7599777f8cda17cd5b30917960276d9ee8ca859b7530615e7c87c8e6e65cbe1c7006da555151a8f79f7e0f1429c266814140b11ea4dec16797140fcaa5af0c1b5f7a03b45d540b849e80b85033f59df739d2b20334db38a2a598de0baeb57aa9fb44e0bf37b466cc4d46d70c73605c90eb384cb762be4909b68d6512380dbb275407eecb5b90a4460b9a3bb96204feae5ed9bd73483fb989b873d31d1c44b7067f8731728223a1369b8921e42343ee537d7209931a2e07ab16e6df6a99c41e9dd226326249e741a4b4c9f1a3ab3f1acd9a70f62bd0ca1ddb11f7e499c594b87d68cc2ff0407d8415c28ab321463b6fef841950a2b361f2beec37e5bd3eb4985c1ff1bab5578e84d58a853d8e8af9b88559e418480a8505cf62991b243987b13c4f2d5ba76be6059b590bfe9c5be83c64d9e5730459cd1788d65bdc6fcc09834fbb351c82c665f9647c949230bd401b453323eef834b9dcbdef799c4d130b60b72884c72620a041c90f1cae890c2116128c5eb3b3938bd3665972ee84832a0c764d214b225a7d0962af6ca7f69b94e7a1564673feb9a5e1f88c0fa9f124df1dfa5c42ff21d4ec4289b971a77f7d5cdb65ed68b6d8efe243e988e58da1aebb94f4cb9b4409e8399460f3e9240207022bf91d932917999ca54a6c8da45523be071a26a184fa4d470f8f34a8146c7249d7f6895a2e09f0bffdb2c0ade2ac80eeffcd62a081116162c52b50a014a6d2b686a15b211d32ac0adb0cb22ca589c2f74840d2f2f5a05ce79e4b5a587f5b70de98d6f55972dafa13c3d21386107051215180daace077fff6be08fe541341da459a0a70c522fa427125b49f49b61f514d2091c88de4509662dfcae1a2b2830c2f9fe4598d0fca3eb4038f6497f30f141b80a4cc695f271b12bd1d5713f3ab1f57d4e2896b92604752cd34235d147381f33c35528bde804858de4b475b4f038c873c6b2133bb804bb1424118157a7eb7f83684760c4ce011bd491424348c4b101baa819023558635a83130585d1d1d570d48bd47585781998920015d99e4a6a49a5111664e64cc7383b1d6a18866aed53b2bb10f6d49321d39ee604c89a87b1b0f526042a4d01eb6f1ef8e83cd6f3dec8865e63c490eccec973ff25312d481faac6cb9fcf44293d45af5a4ab8cc8e7713b7cfb7e1c5fe7c44a4071a1f9368288bda0aa005a044862929333df695858384c38bcaa6717cae85f176b031f1de0f09b7dee6351ece734112cd3c8ac460e0dff1f25dc990256fd627831813a242a01bb8988468aeb7139341db060a3406b3b201580ab024f07801a8cd5c12980f92bc225a38de523e92ba22bd119e9110f3ffb8d8db18d82f4aac5472599532ac3833577da56dd8fae19ef39f72fc71ff22f4ec1ca010955efc9fef2c3553ef5505647fb3f356fcc14e60ea862f41166043e8fc92e155db62cce182daebe8c46a595c03217f93e256ca46aabd2cfe92eea4fb67c487e5a20ee07d3f2e1cd101554f8d5e49729ba0715ecc2232f79d8793ccaacbc41402971904ce2aca252ed1502b62749e180f3a5684aa59c01ff5872a573516c57f75df316843be2f7c63b38183476bf6d0d64c00479c998010b054b1a890fca529bfc56b0e1f9c3a77b82ee2eb2310870f559d319cb0a869fb3d6f44445f59d9572074ca24b47b2a57fc99362c6edb0c015719a4b71e332c4fd8122141f598dd8000e4a382d6e3d8157c437e17bc2883eb68b54ad26125edb0a3b4f8d1d5888353e9e172aa630185b70fb6e95b32e65a77b37dd76d6e06a0be00efe97c55299a0b8efc637f2764e74484b280b72aca7ad2afed79d0d5e5b4436607be843131c22579e71bdcdea1a12e7481085ba0234a858d6059af3a0aae24bd8e9f57ec1fb65913a4c0f06c375c412c42880bfdf9aa01b8b892ccbc4f2b9efeab8b98323087bec08027f823ddc30f33700d79989108ab8b39043503a83d82b5bd4433e02df1bde86f45903b86bd376ce7e0c5ac5f67fe845c484de1ccab1d111f9f805a7fcb0bdaade067c3aac93f227f06af2d44ab7c212fa52dac79365a1079e47a514cbc15287b594b2133221378377c059fc1d958324f43f49d2c5312b0866178761eea6787e0fc986b0da5fe1e308fccf99b3dab31194c7b6828b478888cb54c8e7570f3db27be9a99ff979c54fe090a5b9e394f6e53f41aab4d8f73f10754cebaedb74aabe04f2eae8c20440575d1a496ad236b6281348cd8ee6836490750e6f6a8820918f2e3e63e97ebba99b853ce6b8d4c44c7df39c309e8cfe2b5364adb23a89b58ec2d3aec616151f1f09e7dd26113905a76515430b11c1a878c06fe2398a7568da2e494c932d2f01cda1f1e38de0be28baa6aec3281f558179196875db654996f255adf8a58cc914ded3b7422469b17849248a52f93a4b9c560aa839fa2ac55185d33c8500faddbcaf4d3f0742fac1b9f6b1f6ba85e9377ea6d187c2825b50ecac1b54d9e03c790d602a676b224a43eb31ebc26bc5bd3c9d8d185a3f9d2cd0c0cf96d3204329d7fd945cfc2fc07aac1f8b955a1064c2c0d246a8d82dabdbeacf81b6865b5eec53ea19a9805c62b017c21c35678de8329592e48a61f91a9f67e2313be305340d0b500faf9be4642da0a9886e77990025905ea0a62f5be4f3b9b84780bf2f13cd4db9066e81493dc2d2ffe3a5b98e2af587299905c64e5ce359dfdca4a2ced0cf0b8745a95f65ebaaf3bd497bb23d3b7a2ec54d6b7698614343fb242bfe123facef72a10d8d4873d3d89e293c45982200450bfb721464babc7d4785983bb5acc3b0d0d341a0826ffa39a3fe23bcc29ca61ea30bff3ec422631461c500a0bf44e41a040231799f7394f43cd0cd82d1b7d6ffd599a6cefadec97a95c1b91f2dbb364ba8280299058e64d3b3b7f2d0dfe6d005c07e5491d38c2841c0f022b315c1b227348f68e168fc55e16257b2059931df91e74160aa247a077a75f55f33ff12404a8dccfd4cc23e09a82e60c6003ae8b849101aa14bd43f3feac019c82cb25138e45dcde521bd0b74a61de79dfb9b66f30ff2dfcdbe45e9b90563a5de6f49a63b4acb3089bf36791c6882fb0120d87903caed3c6708ded31208bbf07379302f223dff845fc9e22971149f856ebb15a7aa579ce9efac78d8251e9408b203fbb33b3f16de2670f65ee900a29cbf61b042aad82d40dda5020be43052389b5fc381874ee253a6bf29678fd3a5c6ea125536c64f676f50847f68a7ef1c868811ed3bad1c5ae6f53ae6034f1d73324b1422b94a2c74a1036886eb7ae7d739a105ccd6d9ace6ed8478b93dd974b064d46d1cfe521caa0b0aba155cdac97e213bcc2b51b4bc26efa2508c84c25a022b67fe2b8e20c1de23c04d7822df81a44d003d717db028f4cdb88ac5dfb52faf26a4de72059de159ddad11569f95d183d3ee45c9b0d83cdc2605cba6288eecf6cbbd0560a694a3224ffc33caeb6aa2f2ff1b46498cd298fad9c997ff41791e194de828995265954339b47e92fb445e360eb062ac63b7b859615c8d16683332f4898aadda5df2ef023cdffa84eaec253c3c16a37a0f1f3bca39987e9a95cd031fdc0e5ecd88dbec168818de87410a095203062c9c262ba72fbec63a83160b0ee06d89327e2c3190449a3c2db80a505fbd73cf7dc6165d9200775580b500475d74a30eac6db79a14aef686e6d6992f6cd8b873b5fd9f4fb1dfb73db50bcd372d0c8eb6cda0679cbb04058c6f1a044ba60d78bf8557cd4883afe4bf2a760cdfe0b329cb0b6210191b95522a4d8b2ef1202cb74484f15defbaaec28574fe24258f511c39a86c060528450192192388b3ce1f93ba9c4d66c57b1d21bdd50268706dbc522a55e35dceb45fba073349d42ad186e9714fb3142bf04f2de381154bb441d9c95d6016bf1ace841d9a1ee41f2258e82ba44fae31087363377613a3adc4d72b48ddc9035d2b4dae41da8b4cc5178019447bf1bd9f42df184e4ed28014a148d3fe8d3bdc8164272ea2bb827b6e0991d0f7a13b6bd804fcfac13bb92fee90f607589402e9d6399f29c157022255840e1a273afe806ceb89106e72a375fadf5ebc58c7527b3ff61ba79e3e54dae9f711fdd6def9c788790e47921c917126abd3871f1b4da5bded5758113185287f9a09506a56d1102e4bb1faac5ff864f3edbb721e2fcd31db44401a2a07418e3857cc25fd5894918dbc6a086051ae3edef0ea0a4c9b7ea67df496ece33944c509bd8a1688932b518b53e99e8a0a1474f0776e39e09b78f17ed4a510e95ccbdda95f78f6c36a5c60c45ed27ee95a947a71ebcd5f8cf29e29cadacb0980da7220b6d1a86a3e7a950cafb04743d1ba1ff545648b792b2c5fcfa46b67bc4f417a9076ddb056829e4c31f4a0686cd6e6309f3c20c7abc8bcd46d463686c0b017d33d2a7ff7a40171a14227749fe9676061b04da2b555c7ae5964318ee3c25aacc531313947786fac0ee63a3f8bd2e1e3f14a3a15a8aa37dcdab6ad653dd566e2223ae4a0e3b54a3d901342e90077fafe939853ffd19d6c366a85b03fd406ef363858f54071fd185abaef10a7f558511694caf8acf6252c86f83c2aa561f103377109686e4e1addcac7f0833fe6d265bf6ca9e5a702959794b913d1d0ecb93d9b47a344f1d8df4a390a1b6cfabdb5d8f1097a359901acdbeb288bed9aba9f46013afb43335102ce88161eebc14bf834cd8b515f9f09991ee2f0c277a9accac950097380f37cdd4ceccef0a4785eb87da6cab294a68330008e6d62a9f41b531cc342ce28ac183dcfc87ab10b09788afae3bcde6b96eafc36326b67d54f60ade6671d2c82a18c0b4135c985105e6f66802de02d3f3a3cdc68faababb94bfc51aac1bc3348e3661d19621cd7002dcb6d5a115641ee6e0a15f11ff7e67c63ef928a07a785804110c78e22ec704baee1a3445b10fc8013300e8d93c1e54e689b2321e808289c88786a2facbd21ffc70cd0e8d535627ced39d573719536cd5911f0d5bd0dcfceb64a1953ebf5febb38b124bc126cb33e0bf2a41de254fd158a144f26fd8238cb3f6f354573cc28918135f9f044ef309e1a01e21b141c601eb59cfc3e8ccbad2ffdf6b9f7e06ebcf1e1266a733a63d3f77585e3144636f110b38cfc27a6a7abfb423be28680d7300d4a98d3384a885ca8bb844882911773378f492fc6ed64afe4314e06c3f181eb6ae13894ddd98edbdde14fd233c3e2fbacc124fdf14f25e3152e7e63bfbbe9ecdf8aebde7d50662dc366bc13b2297ed1d1678fa324dc54bbff1da442964650778270aeee1e54c474936cea4584c992eb8aafdebee6affd02f1266a48f88b4671e7de894b6ab70800eec0135b4cb2e855596f34cd3fb8e854b3f334b49f8b81a77b1044c3afcdc66e0f7def3abc746c4077a9055a0acb75acb70be28344159605152207cd90f21150547579f5bfadf5957e08f97cd32d00e0fc1da94e68942cc779246aadbcf13f0d77cbc512f73c18f013a78967480f5d84419bdc88e9acacedaa0833bb62b2c6bcd158421d981bbd757318e0b744a8fedaccab40158cb11ec72616b7b1d4aa5298a917fd6dd4401ffa7011dcd448a33f2c58381456411f5ec1ae23fa846a7ece4160485cbc097610194d604244a2318c2cb49bf2243cae2d4f192b30fdd5df550fe0cc81cd0e56319e0adfc23a86cae29c6611cc7711be3ae4de49164088c5f94be9fe96bc612b9e0d78c5f61914df496c2b02a800d07236ae99eb3f905119f3ba32448cdc2a8bf1fbc896d5f0b6d6d470c878df893003ac97f11190fd0b46c83b7b0802a42ecca67128e58dea5fef8202aba2ac86ca279945c7d57ef8886299ae8010b1aec84cf8d13c7d9e855bbaea7da2402143fb87775601507ccfc6c8dc99cb029cf760f0afe8782843f218682f20af2fcc67657f364f461d072707fd8d7da6bcdaa2e018d85ae18e8348aff31df3121c12e5a04db4c0e126ee76cce53c6c22b87e11727f88aa5b554070ec6f259c0e3f5cc3808b2ac052ab350b457e06fa71ce57088c24609f987ec9f57d6299d39a421309d2e219e160e4a006fe7bcb9af44a6cc82583eddaf212bac0e5f9993de4b67fb8f818ab1d0fb4074c2e82cc07182639555b41575b1dbcce0979e73a49b2943e0918d9cde3210fe0864f66a186ab999ff91b1bf9267d375f01166421a18f7d739e3a555dc2f9096a70ba85b93e893bf9d31796579eaa68c66988ccd9e7ce295266db12833efe1924b6a9ad58676b09f9499d6bd59ac1cffaf8f2411919e1ff060969a9b5466baf26745c19ba4171c94b171ec351de7cb2fe387730ec0f8ca01006e5922abab8e6d29431ff20a6a58a1fac2741b17e350a116308b217b2441e3c02f9716a12a5181e83682bf7aeabc075beb0e2a70a262c18f50a8b0bc7b88d6241e52d20b0f8794fb412e74d9fad2f866e11a81e0c11eada11c2eb724898ae66aa8189018270c55d73200d591cb6f7d29dc5cd19f28aea262302c6c3aedf5f02022c1e34acf60447fd72b8b56a1cb92e64af19e92573f1cb9af86253417dc1f7b8ce122c4d1785feb5bb3a36aa09e073b04ba2b76a7cd18f479c5c73cb245e58a1bb6b43eae51204ea8ce8442f1d35462a1e6d2329fa80dd4879913638e32a229e64854145b781c84c810644481b3b775bb979b05167688be11748facbf724e7f32531f41f6c9cc31388a83d20f9142929d08c3a2040c8bd1c49a8c4df61ab7bc5975abcf5920e9d10b64085be6b3f1c25bf382633f2c05af3ed26eec8acfd229f8fcf8043e23eda0a8129cd81bdb46172207512cb161172f22cfc543bff316123d95352865032daa6103fce32af95fc93928f0935958dd67347743ed30873e1e55b2efc084a4bae09c49f32fa25f2a1535add6ad226a56c305176bbb76c0590da8c640de0bd0f20576c20841ab00bdbd72fcebc5f8001930868b8107871cd074e15f5046b94c3eb8924360986fdc3f6c874409121d8a3a796d11f1b898419acf55d6097e5b21c4d78df4939b78fbe4e8784f82243548916617a5a4136de1147f1af37fe5a9a458d425126155a4162bf31b8bd06a2b982e0f51f48b11672fa0094b9f9e2e6ab5f18ec282b759b6cba1847655853b095878238409b683180bf4bfe3239535cd169eb41f24a0f3362f5e839063ae20149453c5bde765569d1fa2a0c9d5dd4100c4a0a8841c1782bbc7b7018d6a20263b2ba4a3a4eab7448fcef0b117ad48bf4a20756466c11108b431ec437a655474f12d26a5cd021509fee1345822ad655aafdfa9dbde39f3deb0ab1cf65a015e1ac3414d82c9d086b2e5cd0c51091e7c1ad33063b990ede7046284eda0772561666fad7de051582e5afd9692dc11a91370957a6e5152a749b6f6831145451836443c47dd1a6b3a4798b2fb1451b4d23eb3fc25c2813e1f0b233ecfab93d321bfbf6bbfd6c1c89cf03a574f4d937ab77062f238c78bda6692f7489d8a08e48ee808cfdc2031d8d9596321aa5eed2b6acedc8281bfe5fa539d97473f9895ba8c7792acdf9d2eb7ee9320cbcd319c02289b83ad125470d661e9134adb39e28563fb6fc96a0095f287019a3ac77989dd07e88ee2d74b033ee611cb94c35ff1909ce18ea57a4549dd72be22d3b8d7c07f4c23227d99bcab2269be611a23b331601ee5e951f3b282fff9360c37a9d6219487cfdd73609c0fbd438a081948be116919813f6b65d30f8f48d2393a7d014181dd953b0e4b745a87cd5e6913b31fb0551864b1fbb0b521e1ace362efd4d1b2304822b03a07394bc54bea40044777c25d130e01163d450d01668f53fa41d12dea78ac56a7643d2091492b7dc0c2940ec8c59c96f834adc169ed2225ad35c79cfbee6f516478cd65d885aa6dab7c468c879a887af9c55f221e6987b311e58749ad50f80aafdb60c075d08b11e66c29d24ab503396989115b111c498857da257ba97b1030130bbb13babe735fcbd62fe4765b91e94c3accbe60971ef69e7b33e5f0f327211f02e853886c4740a560217c414f7daa8c8b5629c1f7dee5cc1b9b7a175a25cc9a2e7c03ec4f8965fbb98121d7ff6c93837cb6f111601e36059a1de5038983ff1df1b159231527d59ff31e9d89ea3d03978aeb5ef386f0d717f51b8eb40f885e791a110599de30ceda928dd833937ffaebb113f20a8eedab70d34bb35dc21afe5969f168c033be6d63e03e76992ba62b6414a2e00f607fad06dcb1c9cf79cfc0832d023487a863934e550aac8419877fa421e1da4953a00417d906a92e5cfef535b12c755ed9a62854a940943c1aedc23b6bca2bbde3dd63ce151bdbd7d4f020e63443b370661f18833c8b5c6e731e304b158c477479ec85c1ae167f72efe00315a1405266ce90004582cb8e229795c0efe6dd0152aeb4c7ab9e30ec39f791cd8abf4a75f8a6d25a7e99ffcdcfe8c9b9471a44f3d282d61943451903cb7f53fd6644e231812c926e1e2cccd55f3a0ae8a423df710297183e07f7415894345eba1c5cf6a270ca9814fbfb0e8d949e563ee9c947db3bd2db6795323d86bfbe089047a3a117dfc4bec4e02d0daf753bf7357f397d6f1ac2bb640e7329634f89ecb7593a74907d37cdcca0f89817643aea80ba9b89ab0a0429aa408db1cbd74bc8910596a3b6467e00e8e1b52c402e7f21ca8fd1327e9a2ad59fc4aa7e2930f79de0769c734e4e5bcbbf6fd28f316719f7e0e4eae2deb45c8267f6141675b4ea3be2528ea770e71e18330e1ed194763e298e1144bc839a1b1aaf56719b4f25265233987e90009e6e3447bf6db96b4340787bd9d193375a6e1ec3bdac922ce56821fe8472e083f9e3bc756c4fc7251ce042f1c3c2a2c9ed5c6538800312dc879b3edd4d14cf05832ee5ec0e778928b84e3196d3e544ea8e911b9f524984962f5045cb573cddf147eb59b75f854ca70be3ad4ed704ac5b450e891a257eb8956c6b1c35cc8db399616c2a59e5ca397bd597274cb77393475eb913ba27085c442ba595d9f5548d238bc7283f8d34b091b9b9db1544e06bb4cda061fd366483d71032f4ab985fcb291fc074a90fec54760ac2c8e0f9da905de89f211239c068921fc0c1e1c873878cbe99dad86e69453df7ee247e5a67ac6ebe51725883f46187818791a53803aa9afe1ba2cd7906718663ff3788f2eae069b2426f6a0f220f4522b09f41453e26a8413d53c3d49cdc9555e62901a3ff336c232e768d01062710adf1bacdc3d06ec3f957eeb8374721c66473b9ee5c44c05de36b580088d4156eff5f86cd1b7c4cb69d08c8143d8e6331089ca11c2b63530c8ad7e4345243446b333ba41f3aa4af8241bf57c4fccf6ed7cbad5dc44e7e6bb906e56226805e866461acb4282b96211d1289c3eceabfa05e2b7ff936426db62faa8e7ba259f6b0a546e84643316ddc224cebcb645ab05a6e1d268b0a391ffcda4b25a5147d7c74dc2695905e4ae78f03214b153f01a6fa6067ceb35ee4e62ba07faa18eebdf63ac1b8445d4dc6875a5dbb246cc0ac7615e0dcc3cd648d4fe4014b0f81eebe4245e231bf022efd8b0397a50274939979a4a8011c76e31358dd49b4e4aaf9863a58ad704b89c3783939151897bdca4a2fa2d03f46c45666dff3ab340add0420f240ba78317414867702d98675a7ecea8ebaea46ae30389e3b4a1cd8a0de8cde37768682fe7ca2a79b0214ae63b2c10c32643c6aa0d5ae29fc6b9f6d58f0b70e286af3e0b0c21da79401cd91e21c5fa92a743230728bc518ef1976a82b34afbd023f9a444120c73551916c96dbcabecff4f2bef10ee45273ed7773ca0bf45cb91803b68c3db66ab885ac56320f43ec62f2ca237e22cd54e9f945144031a80cfc7b24f27bb8587196d41a5b8eaf7f1286bbfe43753f9f6fd8a9ec0bc314b444fa7d45bcc7b7dc047428d6b1f7d4da32cca2eb45b85f8d501b8611be8baa4df047af23ae530d8f79cf86b45354e19a0d115f0dc2090b20cbbbb41a7f00bbf01b765e0592b2d0e1a93090a04c7420e56015d5bf9249e644c5528859e47babf995028c4638b6a7c688ef30eac54be1ee30f4e6d0bb03511a7f216caa637cafff10d8ea59ff4390adb6a0bcc0a07c7050196efb7050874e46c042257e54b7bcab234b3b06dae1888d0f298a3705fb396e0189a1805c9020f74d0a5b64e245c82cc67e3f5661628a1e0d2201fc1256cc6f24b1b20b65c0e2665830b6ad246c3781000cba8fd5023e8f87a372af2e4278af937e1d0651351e482b6634aeeb9a1c84acb75d633aa1a1d9db42ed41f6a0cc995b235deb48bc7e17bdb8ef6d93601b9f0cf4586e029e498bdfaebe55aef32318e7f4dae95cced8dd1dec472b03a5124dfa2333ebb7b06bbeffe2067ef7baba0f7fd544e6faab89487cbd15c38c0c490959b33a342780815ba2086c5304db7eba8e334dcd4b18f6709d95c1bbec16a904735b8ae362090fc6622a61eab9776b8e69e0d2525ecdeaeb37736c984b5dde502e46b5d9b06826748034368a06c8fa5eb399f53686d95b593c1e9c790a06dda6c19bd2befe7eb90befde4eb626ab97e7e20e1fd89f71e64b4e292c873b5816e8201b693ce6a57195aec8713a51c2fc639817a040fdbbb8e58202af3d0f04aadb91033d78c6280b98720b92b59564cdf71a3e04e799b02c4586afecacf721f86239b02f69c18f19261049938c4870e8e3d5544d13093b5c554d490c3ef874ae70aa82cd2f65d8d3fe872aba54f53cf1bc3741acb6ca340b6362a0a4bd07fe6248d4838a3363327670ab5de7a56402d12c624f7d0d9cd920c98d11a23726399c134dd599618b28da584a567c7ef56670b71521b79bb329f21ccde714ceea646ed2e95d6a07ee66c683b5aca7a7c436d6d30fa17859bd90f0df4c60aab02e56f16803b3695ef8ed0de1967409ca659c88659ac58302c2ec613300278281863d726ba8d79802cb16094c688f292e99411409320a8c36f3f4fe8405f7ecca77f9f502e60b7218134a3a3d2ca067d46004878643d75a17d0ca0d4559d7f0c908b59d008b17d5f74f07833f5c30d75874d3f5657f10d50cac3d6b192782a338c7871804fcbb51d68bb3c84c737df5bfed830322f18bd0776a6263484c12e19673ba04f7599232e688749bd6676c63bbbc982b2b6ca659a0708952aff583ddb5773b5156410d6f837f3e0d68ecca1a6a2ef6b3a22fff66cf836644a6c82df5d3263155506fd7c672ec4422172d339cafe1d06000ffaac03295397249d4c5d50f910b5b19d0983e4ff8a9257d3b5e00949b206f80776abda266f35e8e10f8b2cbfc20f0032babb2e2203146cc4991cddb50a4d7820dd2882fdd38ce5451155c793344b49574a8df3c220deb0cab3a00b2048642765f2e7e5fb6381d4e5bac3c84984bd2d552cd90c028ce105265c6e436f9c86675cb3e901933e4eaf5e788a4576eb2ec98308e66b817e979ec5cec4a829830bef8db54e5f6980853b568d47edc59e08c0fe668caa143352a511432e09a2352e8d19d67546a3d932ee4fb1ef0ba28f59b2131d11d9506c31e5562b33dd64d0a2615e27d8ef1adecf685c9c22219aedc2430eaa0d1ed5df57028263ad4bbd2152054263b3077326c597cde5eee0aa2a211b56bea0b354288e41a23356f7f579d8e4b5d3e44673195802c4f45db8eb25ea17c8a1a11f1da7f872c5bc190d661c1e9942ed60f5d0ca9eeef6ddf40779f8ffab1b27d7d60bd4a37c05dbb8ade0cc2a09b9409056b5cac18245f1234057aeec25dfb80054a930a9c5b240f72a0dc359beb5afc3ef9cc6cb6bc203659e65aa5d8c12995cb7a2f4c82b6dc3d2741168dbefc862ef51111aa0f3bed671b3f63c0f336d286957e59b8bd30e96c5ec6b3022f82bbf51a1d57f2f974bd5cfa574829bd24f8da5346db6de1da264c038ad78c161e5464ad90b7860945ab206e93d273a5a364fbf547f473b0426caa27a561dda4369cea902cf7cc184478bdcf9b14cb9afda58ed7ae0a35315a4c4cff764b205aa392c59f757863911b74f5db96301252dd9256ebce1b6379d4ef4dfb40903aa077d29cf0e989378e6ea1f02eb62a3970306870465c2f33b0b5af9541f96567fda40bc6966c5bb9bcd4d2554ff7d4659de882d44f0dadf25da4f32c7d5f9a9771f2db40445495425e725e92a315e4ce5a5c7f24cc2c0fcdc591fcc7c68ad990034d44e13952f6d20135563f2225f2fe208258e6e861ec2561ce8b73a66b6488248a02e84d931457c42ab4eb0bcbc45fcb0f05ebe088a9cbb6d8677dbb02d7e862c3fa988e2248e1ecc2da36142bfa854cc758995094c3041e007e79f6d55a027d72d13279c18c3f27d129f42a336688d7a11f46ef0148f7d8e2689cf80399c9b0055f499658d0accb3d07103d0d84ae85733262cc3db65344bab5501b5d2f9b329c730c80bc9e3fdf93b70ad5890bf29a31b9f311a7b1d04ee7ca5862fc53ab2981ac8b2646c3333c63570c61b4333698dd99c94adcca9a91d2039fec768e77e7ac1e09033aa8546f57a3b282fac78e45e7a0dfee923c7f951851d76d33953a0fbfd3db49b86165bf09349d83cfba7d7a06b3d8aa729304f4704af9e1bc9374ba4d62dd3b6dc2363552a265230721e83447711b5d8f0f7d480752a00d2208d8f471f7e9ae4fd6f3d87521bf72d28a980fa8b57808c9ac7a6e6677e0599c7183aeb4073b1fd4425880fd5e1d61cda3b6edaa43b9c2b6013cff43b0e103e6e72af393c623e5f7ceb6a701ff0ecf84b4f007f581fd6df1fd322adc7161b7899b43c0bdc9c21b070a4e18b09d8c5c751f201656a1676c6aae71887ea78e62732e1373cfe41dfc57528ce4c215eb0d193a6eea821f91b4a41ad69d35dd902bc5ad940ab9668b2e4345de6740e1b659e9257edd6e7cd5d862d2fb702e1c83796dc8c8b6d70702a9b1173c200a2c02e925c8b8fecd31b3e2952cc4384b9578aeb95b9d68a16e98a2ede1a467c21f2beaafa743fd53fbac65b086085685913d34d06bae064d1f96d2973a29ed7dc9cc988d8afa2de7519602838481958f6e7dc3d72372eda53e80dac366d351b62ea59950c90c243259fceefce5c463fe208306e50f9db7adba72a96564e0a2706453ac610a7248cce4bbc515e81190f7735e60da034399e6d3bb45f934783d31e4ce75c271542dd02104db298ee25d781f61c1a4de718c055fa1c19e94cf36280511d9d040385ae2ae357577cdc9750acd036855be008fb67b4c09b55725c5f25759ee014627dddce0f421aeeb5ba11f9c74434f48e0095542e27f34fe726bdc50d126eda690b0ba29e19bbbe6db899c8950a7d11ab0b976748b1160cd4d26d3df3fad69be96de6740268869e57a06e198a5545a4a0ef6fd61fa1f623fc205243661588dd49c67234526f2d2db926f961971f89f9924c0beb000aa1e960e73f28b4e020e42c463d8096cca6b8fecb537992ec42a5fd44430e1d52a1af849dd307ad25ebbb79789399fd11c7e850dd1e87139fbb37ef738e17a4ee5d30a20e6ecd26d2a34486d16c4db22d8b2c8faaa69a2e6d66cefe8ea9f00dca243de5f3d60e6a2c79c5da82796eac34d6ad628f6660c02682e45864fca765da45c3d7c85b6012f6df63adac28d548c68ed119392743e036e035387a0665582fa8562a6f6dc7b433276c391aa39f4d7f842bd4cebbadb7ff47bef990dcf70a6a5dfaba753b7e2e740678bbbcd1b9998904fd828cd1f159220258d9194c42aec92894938ed1bde5b1eef523f58a4ad9ab4d5357811a1b7281b5f8cd0050132eb4657f3d78e80aceed00a08eaf015f0f3ceae6ff6f0cb79309bb0e30c24ca474b0386b9a27b547e045165fcfe94195cc7083eaa57b4e4092dffeed7ca48611badab012c45d12f6b757219d07d01112c0a04768ac05f980d9bd756d12517003ac125476c851e85435000216d9682762a47539524c006673ee15bfc28d3ad8cbc442410e3e9863f4d5adb2b7699116cf8b05b48198c13a672c5078ef3e146c2877f3018b0df69d10d4b93960f9f0e2bf39dd5ac3cd968b5041e80bb29058694a2603ae3c261a57eb1b9b8f3b8c229ecb1d589beeae36633dc65c7a9482cbe14aeab731ec3d790a56ed06175dd53aefd4ca29372658e161a744af9f9d9139262e67929db10bc483969e96ff1f7189eecc03452a9cfb409483fb5d3342e5bc6fd0727b7745544bd93022e91d32531a9208f896fd1dd2e2de5506ed1338d0e7af99caffc8be54742ba689ed427e1b44176aa71b4de8f04f2a643803683eb0f5ffdc77ac56d9145abf6f3929dcc3ced75f93288e892fd00035a803408aa89d9b21d005925fee6adcee3f547f77b94556117a24da2f69cdd83ee2c35216f06d1e13931a6ccdbad274e1a6d550f24d01ad1c9bbae78aeb49da115d2ca3042fbce46f54b477351e737b655b3ce8eb64762a6ac4e1e64e033706f8ad12569c01e7817242e8c73e3f96cafcc3588447c34a61872c555405b9540f1bfd1b241cb1a29a9b1f957216821d694f02672fbf1bea68175b35a9424df5d783eeb9d584d6d25b1bb2789024a901ca0f7260e77c7b695052e53302f4cf808e8239e914d14230c4ca9fe2048b4827f79c1a940b80d3c094a6107cd14069c29b5d6c269a52c40ad1e8ea70fb8ec699144cdbe3bdd9c61c44e31cf854a720702ba30f736575b9f45b50bb1a3dc526743c737f8e14e0344a7896563a7739ca4504a64e6cd9d6079ff9cd529e599335d08b6f63db2578c65596f99b00caa16ea492e55cc98f5cd712c2d41b32c40f8706d433dd296ca6d07007b97186b14e01602c81ee555413aa1b96d48b15e4a6d25627a283c088bc447f30b3c610458043590246a1876325928b881fa9a753dfecd0fda1aec7a857c8a53cd167ab0cb0be43175055260781cc2ab2d97ed54b9d00916fac85dcf42403d1cf1bcc84737aea5384f3df9e6c88d8f51e598f86b05f126fabcb841d3e9389d0b85bce8ff695e4850508c02bb505900a369777e22da13a713e74b037f1b8051f93e8752dc0399874aa58eae2c016b49245a273c5d7b044d75a48f37e294da2e4a66a1ce4ee132b39a22540fc26938bbba3ffae1884695d54909da7e48307260918976ca90e85ec226002cea03e875f2a20db2f0af53dfdfba8163b09b00e17e12ef6861a36491e879b1e998e3a798eab5b4b0f5c8db7227414058fc47c5888bc6446dda4cbc8feefd1dd54bf44bc9887e8d24ddd393a2d9cb11c2290a080f01cf91331a556793871161039f50fea0ab4927ae302fc2ffaf241164905d6914d3b8f8978927833475e8a33c35b73e713694e1bd971abae618e64c14cb2563b9b3033f3a6890dfe320f0b2019ba1c51ae092d94d859bf5cc398b6d8a369bb5809f2146b1523cabac000df9585d99340f11fff13f66c79a80ca4a2d649712927829e29604211c30d4ff4c1b39c85480f25303d7815b352b0d2cc38c610394d9f2aee7fc02c2237b54df400ed18d7a140d76bd7229d684a5fd4d35cf77ba6736292b681a1c30bcedc660d6ac63a6d5c1c1f402b4f1bd7828e548083940c54316d20386a3208c1860d1245740b9d2b89e144d8b67c2e08b986a53d74923495f2e874213c2c5e30ef150cecfe9f6d18073880b6704a1f7629b23afbe02f17541796a2aef87b867d2c1b07510598a4ad22fbaa8c5d25ade0d2465c6d6ebb0438c65d9f2e22006e2b44d15737f32c4e50e821a6fe9bf07d462ceb799a099093aa2c506b5f0cc7091d77c27beebcc0bd2b949c14e5fa826843ce2b5aa76013e2878e97b1d495c54e01f2e91e3a340ff3c597f4e715188ce376abc3c96f7376ec3c08c749b9c015d6327873fd0d736b1b15f1e361f3177fb9cc11a20f58bb8f3a11ad43493a48e100fab0101e4c7cd6fa9832962d233a491bdbf1f9362731b6e3ebde5b0a9ead9f7ff2e02ed619fdfdd64f2ff21ec64764edafc7444b2ea2220c4de2ae5312a2d8fac398fcfbf10bcc26ea961fb15905289aa7d406eda3c5e87487c034ebd84ae1f4e4561089e5a3818b330f7806c8c41db5a7a8881afd0a5adf06d2c2bf2fd5d88db0f8b1a895a2465bb197c9a61d4efee991a2e14ba1a48e7b08c376c409687cb461975e103f6077b03a8f7f336795af920cff4633712f38efb4fa5e60a34dabca11e7aa17acbc20f010527f14fdf430b885a7774ceee6edaa026516bdf744bd806eac0110937f4b0b3f0b63097a13210bdb1800deb839cff623a7b628914e2309cc493644d7ece361a0c1b6debbcae430c763056c09a71d4a5e5088ac86f9af20be462d8b9cff8d222deef4578a9b9029bae0da22251925896bed2bc4df7479d167aef1823810832c5a8a333faa93ce547225749af8cd913b95e0fc121c5c4099881133e27c7a95fee1ca2458008bb9a30e719404aa5384f562dafd56eea2c3c8b6450813635ee29d91eff776808db9cd3c981f4c069a62bee7a6812cf826418347b0983b297dc341d6ba29986dc9f296bc33398bbffd2856d3479e738cb88d5e01508b2da6fa70a2f23a2980295a9d950c7d2781acb17bd2d4f8c0219684790b794859cd9b87d131419a8f04338780a40118f9a23e1cca17f12eac357da7e32ec1aabc01e5ca0b187417b5a0d5b5ed1c5be3c39c3d8ecfda4325ffdcfcf068a2fb311ffa414bbf421ccb808efbbff824248c4cf18948edcde86fa1cd2b16dfeb73c5dcac9804d4d4498938ab598ef083cfe8ac5378083f61dea74a7aed1d83420e0d027b3ef42b0e99c08fb30a053de2f731353cedac5d6bd4baaeb30492adfa9687a2bdb8976ddebf20601c1f336c1c2c5dc49e01c913aeee875daa543088aa788e319a089443b223a1cf58a9067fa7a090930ca41f03313238db7046ca08981569244bd0929f4ace6d4e1354ae6f4986c8b5e1dd038c9306bf51c19062d212084dd5a5f8bbfd8d5810e472e969f58da736056fae1833ef2f04fcf3452f4cd626cc74543f5e646498394b8e20054d5bc02f973b04e122e620c45de4b402c88ef352e80e0033802e50f8bace2476cb4eef87591153dd8b1e2eb56639d91280011d977b0428141b8be93350e8ccbb03d718f6257e9e98f08c83d8eda44a68543dccf2236858d5ef3cdf69e2d1ce03de59b6dea0087551235edb44c696999925aa4e460562415b5954a9a0f6a390b81aef44cb6055175870809c241bf2dfa85cb972cfbe185871a9474e24ffd74b8fd88de6baedc0f2c0ed5246ae1f5c6a8602cc9ac4bcb215dc227d2921b2115c412f2139b1acfbd2ffcbecf486c8beb00286021f8f8a328606913cb756736a01b4205fb203a48632fa69f2bce512a5fe92af97561a0fab880265ba744b226f630d8b28a17088c71f575deaec39bb050c56807f2db9552baa17d4139078840661046cbbf53561c57d880364e7fc57aa32f44df1b3d47dfe8d98a7604d21d6eed32b4020df4ba9f86d006ff143b240c0f89abf353a6cba5874166dcb622db2b49eb82e3f4e24f07df5e580843bb0b6b920b6f9936c6ad0929f7fed0c267c9a095aeb0723d365b80b84b92c14ca840d3dcc970cb0eadeabe511821892e555d1f512fec4f7e944e8cdc30c248f337a7a53b7d5c9efe33d61ec2736d2792dd072383a04c1b23f72cffb1c3f3bbe13bdb919193dd7207805ed7216541b2e77de1483ca8c1e46867ea8eb3ed2f4811a7852d9e5970580bc661ac4efda99450ac7edaec165d4fb07221de8819e8a5131126feb32d6b933531a5035839f22819a058dc7f0712a36e92ab91c7ab986694fc353a499caef040ecefa204009ae1b5c92ed41f48fdc7d1635b33a10d65cd18e769dd8802155aa288a0ee10ca25ee6560bd3d2f8a43df7205aa8eee0e25aea098412cfb5452a5d1f1c0f21afe6e06fb299bf08cb8df63e6c6714d5e6ff2792a2c2b964c3251ace1233a6ebb99af40c11200bc84bc99a769c83411002f73eec6cc709fd51f697bc8a8020311b8d96621601c03d24a1ef476a985f03dc5f2db85e09ccf77cde081d35e6459b692500e977df243c1bb4924afe4dacaac5d3ec02096b5a5431cf14ceac340259348cc4d08aa426e8512b1baea292cb6cafa488ed82c15bc9ea3941b6526c03876272f52f0f4c1c05105d5ed50f4b557d922498a0624e3dfc13f3159a8e578a3ac2b3025426d8bf70ce1f134a0b94c9eec205fd892adcd4345a9cc558eb0fa9603a954be512aa54a29897f6d2304280c0bc9cc4a1f398a94534a09c12d760106eb27961c6abda1f8d7739226ee55668a8ed55f4897a995893ae3e33e0e45bad3ed2ea5f993e934e86456ae7f66fe522e1dca55b789714f81cc3fc61a8e8312250b50720dadd8c2a1b08b4184e1b11ad2ec643317949d12fabd6551407fb036bab785eba712d5e6e4b2be12bd59dda88b14e0a02ac53080bd8073e30737d8510f0321044dedad7604562417871a00d277ca37bd5445951843c774e55caf58323ac8191da488ada225c670d7b973be9f9ef79e8d008efaf4d3fab82e31b5ad11ab170dd148e213bede87d89c0df604de75a70e0d7a05b1c7ebe832b00ad314a4e47ccf1c074d2b17f7c6b1d4b6cf345634e929f6d64495f6980ebc725628c03bd8e53db0b2ed4aeda81c3e5a7941d068a01628689d1b183ca4c669995e25ef47ec91ff032414828916cc32e1dc5391640f381930c43709aef67fbd9b85d160c6c906cb7107975808c105716b0274ee9d2572d5faf00d5b5711fc5beb80ba80a084fddab247788d7c7cb2b622fff7623059c62d9e3c34cbab3408c2abaabdba82835b4157f08ae839b71814e29573a0a377783a624e90733159c18f27f8a266a28ccc2f309c4b66a3a0c067600f94ac51bcc3da2034b307978872867d7927c7169f5ecb68d98778c93cadc60fffe1d9075ce0611dd9452e3e5c60d29ee9c9cb9af23524b29092f2a7c7f47c1275c8ab57dba9fac60b2f8f6f021e402fd8af1d280a400ef1a1ef8f31392efbf7af3d5e5704d7b5e8117491da810a67e6459eee629560272e116c7a4e52a60abc9855fb86f34918f59e4fa994cc2681da0435b2ef2e7eab0692ef9c19b2bb14125206afda2e5dd05d9033c5afd1d5e1ae599a0c7324c5b5b6d75107fb3b31fb5c2f9cfd0071737c3fc25eaa85bcce2f6db46cd5abf0832b06b057f23c3db2b055d367f1ecca612855c087e31062104219d28cf48929085984f1c25c56020ea7008c21bd050f1c2180591067c9c182a9a8068e9dc180868972369a9317831065908765b35801795a863765b279603425370659cc12064b36d54a38ca2e3846453570760c010c49904d120397920c69b26c95abe08b2b04b057f23c39b3b27d4da9831c8e181a7ce27413a67c64c8efdd0ad574b2da32185a59f280c77155d9771f1f863138685206cbf46a38c61bb145421b6bc346053ee0529e492bb5f35f5976b73bdaba7bf824e228b5a69154dc86bf7280032a68f0b06ce48ddc646d5f34d76065b63e72081f416d557f531d21394c9704d1f1678b4528df9e3298ee1f657ef4cdfcbb4ef5914588c5ae12980bdba9e4d632a0e061119571a30fc9a63c3d907f6aea22308a1d2ddbb6791011ea418c320aae3e09e85a14c457f73880d1fd42eba5631d6637a33cd3987266034a584d94cdb5c64779e56ff98d79a16c73170f01040ef230b1cb7a3f27a65ef9b1eea9432c831c17c24683729f712230923d5a0e8dcd23bb94ce79d95054d334421d73f1030fc916e0e408233c6324842c627861bba20ea38c85cb8025361516044440e0a880d202c111083b82c23644d4854a3e24ceebb01af6f82707bfe4c06f39f92d477fe5c09f1cf991e3fee4dcaf1cfd6372767a321085902781fce7c864e9451af407c719cf662495641051b35caf07d5753da4494229cddb40ac94e3d2a78495e9358ae75699ed1365d4cee6467eb0cba1dc0c6c45bdb202450403c557db045838d2aceca1d6edf0a132b05d8d01ccab8322ada1b1d0e8b49772916064041d0b502c12101981e3428a0b04222170b880f2a26004081c15505e203812a183029416044720d8b190c2824011083b14a6b8282002210785116d60f2c4d8388be2d6c2481a939d46a75d6dda7144da55265d8fa4bf6adac958ba2ba6bb8d4fbf6ea2dbb8b4ebcd3a1f4dbdc6acbbb1d4574c771c4d71c55487d129579b761c91729549c723a9af9a763092ea8ae90ea353af9ae8302ae56a938e4753af30e96824f515d31dc1b89f9778fefa90fa2d660bc93986b227f2f0ea06b636d979867a6f7298da368c66d97976b50742a88a2dbb4cf3068f7a2185abdac668979f67517822845cd9c604cd55f214a394277be3400b0442090b3e68834898c0820311a459a01d384642d920f20365ea07ce8a369319b60e36348b77a072f107e364fdbd61d5e806f340f984047bee660bd839c9f495a51bccc12afe14bdd9bed5bf05094023a4cd62faedf8df55f63a8154544c172f434fe240b7baedddabe107fdb409a92c29d9006a42b4bdd3bf7afceacba44b6279b90d0458074af40b394329184fef007fbf6a61153d37ae70e7348bdc70c3831f4eb8f0c0810b1eb8e1c10d17c0993d6112b27eae46280c79b1baa2a1d005a0cb0c747f4b1b479d7bd8dac5643531f52f4cbddaa6a1f5cfef0e36bb406bfdf37b378c968686fac657b719b4d721ab4b056ecc12c552dff0d1d100cd75c8ea5242375902b1d0377de83c40735d32b554c08d6189fd23d63548fd8969804e8b21ec621e652b8daf0cc2392b970ad9a40ca9c3a2e55d934d9060c6c7c7f7c06f86275ec340b9bf745aa2a2acfbf8415416ca2ab5e02b5cb49e417b9d185299ee1a53ae3095f0cd2e1fb511adaf6c8c7a7754fe6018e813c2d81d1431893a73fd608efec1fd16d8c4c8e95b73549a2b134b51805cea9fe586ad31647b80308d6a8a27622194c6a8e4f87e19bbd61a8e4343b5b87fe45e6f180f0dddeafe50735dd766db693366b1f7549321edeca5d91c82631880c8501c0826a701ca5ca48a0c1ff883d4a6fcd909d04fba881bf163c29039df4d94b4809fbfd4299abb7358a51af8e11ea258842c433d2ddb5755c85c96350e3e392fd8a953f208dfecf4c190b5035fce518c418972e868146c856c200cab45990797a1e1e22e185ccd51465d470958abc64262e22016467a247f61a93a89834d42ee61d3f174aa357cc7385ddd8de461c5233b0bf8eb62fb31f96a7aa4017848bbee6af618b9a07a2f80be7d817be8a5b024a1bcef9f14f32dccbd33a7b2afd2a3534cf64dd8877c355273022007f3b6e6081c62d0c6e27516565194daad52b5161cb80b724e23b1ae53fe850adedf915c4d03b129a817370f5d350c62a2a05edc1e74d5308845817a717be852c3201605e5c5eda1ab06835814d40bb77d385d98143c134257373158e343729241d98338a4f216b341721203952f4e78b42f1c7723e140ec1b3227586a1e44a1ea77989bf27f1e38313058692eea05bfc9cf1829bc1342d76c6337254eb1a93c13c2afefb134e49db1abbc138756ecb0b561b939ad4c862a8f24fae0bb4c96a05da4374860d0f9f4e3dba90ffdff765c01043ee423efdf7a0c2e60feafd9cfc6bb5e7efaccbec9793d7d289b02893d24bc027ce87d38f0a1f3814b9e80927f695b70b287fe953c149be776b1b8500236e9f8d0f6d6751fcbb0cb5fa8b0a8bdf713c94749d9647b61b73e00b13b55f42157fb944fffbf4ef6989008e99f39e6bb1313325f6c75d4d1d82a99ab6db5f33f2c30fe8c12428e2b40017ba9155811fa26102b30fc4f941094789cff44a6174c3a756a197cd81c31cc33a0bf9f832a02d2ec109d428ed0de52f87e1a97c5dc9db3c918629b66146c3d428c5a31a3e2f8b6677dee9674e46679a6805a4cd3267ea08e157b0da455116f33ae5beaa52dfe712610f4df9e4f1c0d35b7420984898219322a26eee485293f19a0e5004d4bf7a3f2b7c12bac13856db50613a54740050261c4f689fa40bc8b57b525e40a5b0d86b5a70c15d35661039fca6e8e9163e3fbe54dd00c6a0cac2ee657270e139792a5480b72c316eda27b8cd5ac5995cafba6a6a577e4fc423b15994695185c3dafd669eabf3c217a49323be04f65ce4b9685f99e713ed61863e33f2858706b6fd1487901c5ae31b9546c895c7e962d8f5d0b82961c7a19c27058519e309e7f39c1278681543a79c7da8473824bd5657d38cb0ca736aec88941c61f369147768af65c060f254dcef1a9a4e079fd8ea6249ab018840ca408bcd859614426f1c0e2581895d36dc81708104fb1c9fe8595b22e96531a7e2b0d7670cbb1bcc6aec0dabf438e7ac06c381a7e2022cbfb42536a9de89245163c3cfdd83a62834facc8028d4e7605fabdbe01a235f3bb036e099fc4a8c4670aa0466fb1018a0b9475f230ae8efb57652446d3982cf26ce7d68a7d6cee7f5f6777dc7e01545c75c4689b56e2c6451320e08a07a4feddff297849a8575aa5a8d4975cfbd3ee3220b8dca4df0ceeff65e7ee7733b73f58837bfb6f271fb20b147907a07056bb1cc5903b273d2a1119ed39c4fc9c159dcb0712a900fe4cd377cd459ecfe010c2b69b31132a8774dade178a8161bf237ed5f39d6c3d98f8848e1280c5b559eeb8a1e01b7d8a7e2d905e939041e7de917cd55ce087e5910970ebf1c630eac9f821edbae58ab10c8c5ff9dfdfbf98b6a0ab60941d793f1fd39fab301989c03edffb44e148466a3d27f9cd61d05d78618922abfdeea311e370943f28d2350ea0230e2c058bd1b720bc24f5bc37a00fca5deb5e773a3389bb71488c84d5774a45cf6a0e31ec88f3a0cd4833ebb286049759efa8836c58603fa9276921ebec08788a64b1c13c7e476c6599725295223fef4f5d4474bad6c1142d2f2434ad586535af89fda85dcf33dd0f79b4b2bb1e40d457bad68baefa7159b0ef2d63bebf8888d9567e8826bdd50968cc43ee55636507da1b473a82a6b5e3c5baf50758858a11a2332f0d09ef0a2f007fb471ff940832c83eeb09ef870d5a31c7154655763a37151fcd35400d3f3917b537cc6e79aad6a7e5977760578f9e3bdeb9b641320dc23fe75a25a31df2cbf3cb1c731a6ed479f77e8a37f1fa8982ff090f57fadb15d2bbc8313a7b6dba46b99e043773fe16562aab6fa49d9c99a17075ec165571482be7f695bf5de56eb7f6db579c76351fb68f81bc3e168f83118f395bb9d44e0b125644f89ee1a89506154ccfd71463aa8342515d7fd00438a36c9cda536f082a7a8b8e0f321bde03b1466f011dff1ecf2ca80f841a9d89ce0d7be13998e1b85a03dd9139e00f3276de07b146db443f37017385e6ca2c0e653528d519043126d4ae4d0619918ce282fa46cdb1ceed74008dd0bcb1a6e37e3ca5763873dc55a51d140819a617cb6db407251615a169d54f8b2045c1eed51e2ef6173020dfa98c24247f71b23f148c011f053974497575027fb3d63b3bc89429b888601b590bafe8419187f65416eceb871b16162e5df3712497077e63c64e9bbc0f436401aa40846bebfb54e569888cffe646d119a40c36c32b21e00638744ed81d621339e28c3b21edcdaf20809c9af6d098796f83b232bd8380a7ea9a2133867d1bb5ddf8020295a9d6864f99176d341bf3073838ab46193631bdb5a6ed265e40a0bc1afde0cc64d38eb037bd0603336a5a4360d8851c0c4ea8e80dcd99d6ed691bd31b1070a25e1f3e6158b5105b8c9f4000892a65f080f10a5a9f3bcd2e509fb090150788272ccec231c4490bb27004014f55ff42a59db2447a4f28c8ef305a80fc2f6206115ec40c62b88839b2b488f9482bed44e15d5a71e1caa522b38a2d45e6150f45662ae289cc2b4e130ff364584b64a6c2255151457944c515b7888a55ec212aaef083a8b8020051f10ae1c3a318655b1f606068aebe2fc2911f980dc68789d374969295a644b07640c4bcb69c2935db9a93ab3975341ec1c35efe4bbb71d9cb796d1f0e669b2e03e95ea8252663617d6f5b60191f3332329a1d0730a63a0c874542b4696bd7a25d535b8b064d5a9a35b4d6045ae9354795629c1d0c913250a6050c95b9a18a4513628228510c0a9b9a2aaa42f95353478a0eca4da2a5a195d5caada6d3e939ac6669123a402b2219715915c159792df3e80024d8b077cc78cb4845f029e49e1e605daef1c39f1f34a3e837de7de3912dbf2f86718ad9c607f9f00d582b3a72ebe57a437c7341a35de0ab785a1b99e48b2636e1096d60821598d8c1eca539038425013023ebc6a83020ab86a861a0d7c62860a016dc88a256185064011b24721bd758f33397975a9accf5336a558becebfb00677a76e7c963fcfb0b706c7cff29c4afdb78984c73e57635d26200d2914d047824174227e609bac0b66a483cf0d8424d0c4d0e6896135fd35494d22d212c67ca2abf256fe274421ab997e59309594c6c779ed5a53c812a8723da544c68be0e64a75f537e7f7bf4c549703f2b16a3542dc563385c65958053f1bcaca5f5f3201839aac777dcc7d2987a80d9c13b943159a7ab11698a3739b759d465443a66e77666ea976f62c198751a13536f1ba1751da105bafb3e46b8350072e63e47697a74b4675f881ff31c961b12b8307c969798a26c3b27e1a381150faec87e73ced22424b5a66fa488e1f38fc6be46ca5aee34e6cf72cf30021ab3764c4f214faef9f8e2886c37e70cbd7f31d88ca39bde56d66c063b9f66a6e365da66a3b20710a8f07bc03126345c078e8cd9f405b89eb570a3c1dd1f5e2f3453dfe2aec1f878f3a47c041542c50f087400519279f8cf1bfb35323acf8ed1d1828e3d7a14d64d1d92bb8e6c8aded0cdf5264e9d28dc1f64a6e9880eb201d0fcb8d5ee16974f84bcb633748ee785f1666cee80f398d2b1fe4314b074ed2e32aa69dc879b05ea1861ec58e2a3c9c8f79351ee9121dd4d40bf4f8e728708716702c654c3b3b5c018eaa82e15ee7402e5ad9ce3ba446ba356b074d8a15200c85060d81093f49b226195f120f0044b8764334e58851af26d0b8c1d58a6b29ce115deb0b467be081079c795c11630058b8bf4ff24bbc6e623a199f41821b85b58df34663fd9132a50dac4d83d883925790435827911541b61153f067ef25f4e1d32536a89f109ec6d3609770edac5f90dc4c4cdb8ecf8a35653f81ce814a65b4e644c654c67984f99272c1b705ee83c58366c25b96b637cff0b455259a157bb77a5cb0c1b3824031a509a4b63b673803d15b1b2606e143e368ebf5bc07fa370aa85386f6f1cb41f5fadc2c1c6f17603f8df14be6a11ef8d8d83d6e3aaad702fa477e23e61e78fda190d8e53d9f46b9a93ba72029dd3eecfbedf27ecd80712ca9612170c876e60dff720a2825568be432065718218a4c7cd5e258b45589cd865061dacb1076ae289b08f90da5faf1032a4450a39cc2efe665b0849e71c9fe90da2049aa2c483915e2a29b18daf92c7e67373a4b49856ddb1c028de1635da584dfff961ffc551f9df1db81f5b9c89b573afb58952aed9fd60539978145b35d78a7ca8bbade0f375c7ca7cacbb56c0873acbca589d4fea6eb742d2c3962d7f4a497b54b9a7ba761f2cd042d07092caa577073505e53f0428d6054b6b7552e107cbb77fd5e0763feb63af8aa36dc9268a75a5808af4f9b95e7b7e22232676fbfcf932b5f7f5628a1edee884c16a9bc862e3382903d08b7ef66b15b9b30958bb5b86ef5c744f541f8aadf8c0ebbf187d0e54fd8d107d5a07632713305917c9ec27d916d803426ddb648eaed5ac03028d4ac8cf867a53d134da979041a0b85d097bff67a53b4e29ac848585ee4f4aee78a5580b0b0bc0fe44c98e538a85b0953f536168e01becab3fbeb996f3819d30d57f52f790c01bef2b3ea8512df7c18b30af7f56cfd0801bfabe5bc0e5e4db0de2e258d365e940edbe65dd0f13b99fd744400bd841c466d0f6f235165cbacf76a4cac38e1cad5030a3432e84d80c91fbb72f4335b190dcf12ab4d0d84ea09fa22184fc8fede1c17be7622011397095dc6f06ac770256809f6004f85d5241267e7e420011c6eda140514664313602c08096bec10e3c007e20240b16ee1918a67773758713d2ee20270424d8dc862e4f6b2c4b543dade72017a109148f1fa6a9a1081f1b82c64acfb27586253234afc0ecd5f270f5202eacb3e77b1c703fd86d427eede55f8cedeee26c4ba6ba8a4935c201f0cd6824d47995f932410e93a224bfe7180d1e6b8ee33eeaed47072df0f4580ab88ec2e12b22db63845058a1dde96e9926a842f16cda08c3b3ce7d1124ebf17d0ea7a8c9008f9c1bc5976f5c7bb129fccd4b10e39b4fb5622925dea7f23be7b81c3d770043aa7790d84d42177620705558e3b957e696c817a06362e7d30f5a10461050544f0b222f6746274cfc4bcc7749387df545749c0196c7fa971ee52a6fe8ff358efd22db090aff3f644207e7a3c3bf85c48a7183719426c69eadd4e680f41ef865108ac000d2619864c25a969acca831edbe86216a409efa5afdf4169a83cfecd200574d7e46f7ecd9a95a89fbe3e014e197303e47dff7ed728cfdab6477597fa2153022cd926226b3a02847d66c194bf9d54a69a187767d58a49dc4c7867f87048e7d8f8be10f1f47878504f932bfc4e325f4be1fd8e7994be5936228b1d295f7030dabfc710237099dcf813663093ffb26f5fe8e277eecc5173b09e3d69fb15fca8186023530a8fa1726626fe6e7e12530993bb86092565f6496c44541d05de92c95a89d2ba60ed77e323275720194430b79832880b82aadba298711b9b5720290be44b8b4fab38711b7e5dc9026acfcc76faa17ebf2b5c6fc07c822763b87811d1cb3d498dfca3a7037bb40eb9eb9d172c3e45285ce129d118d7ffd149c7f0e60e252ff2f26ba085b17d8bca4884f00567afab049fab32bfb68e86269ffdea13a061b0e914204dc6937a1e8145974d70e5abbe0a66744290170aa81bc9317d086feed422e686e831b8cf49779816db60b107b8452e009c3d7f17a056a4b23ec5676adb3c0d6aab8151ac0dc3bd39cbc85ef85554410c4bb96be3fd8b985c8891860a2cfc1d7a4ceb4a56c14248ca0bf0c3e331f8564c9709dc63c0b3c0f060e5aad45f71c1a9b57418e99cbe9304bc5913f80d064f53739dd1c66c44a30bde93196311d4ee7f4c405901bcf11b03b180dcba96007d9d091978ad8d872e0386a1227ec7a8bf725757c9672ebab9b02aa591eae96c73dfe11171824e9b65766beecf99795f335f3ff6aa854abdaa32033155e2bf75c18d79224c305fe16c690154d10108b1575402bcc2badf45bfb433b79be84e21572bdd13549d413fd4044c40a9fa59f48f7d8b2399a1821b284d288e10b7dce9b277a6729788e89ee73e5f463f4666daee2c9c28c90bdf74e01be163816f414b9d8f6cc551cfcffa702664de0ba5427069dfedfc6ff1b5000b9848fa96b75dbb6083ce05671ecc307958f1e3e78f8d8e143878f1c3e70f898f221e5c3071515550f2a1e543ba87450e5a0c24135452545e5a307558f1e3d78f4d8d143478f1c3d70f498ea21d5c3070f2a1e3d78f0e0b183870e1e3978e0e031c5438a878f1d543b7aece0b163c70e1d3b72ecc0b1636a87d40e1f3aa874f4d0c143c70e1d3a74e4d08143c7940e291d3e7250e5e89183478e1d3974e4c89103478ea91c52397ce0a0c2d103070f1c3b70e8c09103070e1c5338a470f898a29aea31c5636ac7948ea91c5338a6a6a6a4a67c485149f590e221b5434a87540e291c52535252523f294d04b1b8467562704c6a06e6ffd9d71df988c535b71ba83b92f1375d8b3b786f5c9f131e392e140e26be9b852b6e6f1ef6bbea9bb57a3b2f126f555f756f4ca7b8edb59df788bb0df61d44b86a55e3f68b035bde5058dcab56df5cc32e5c331115173b10a7b903333ba6d5b55007a1c2319539c6126aacbdbf802d0fd86260cbfb7f02d2fc3faaaba5b62eb6e3ff93539b7550f735a75b1d989ffc8c98f9ff26afb32d119b3ecdc47607554cbc41b68c0089faff1effefe475b5f4812dde81fa40a56ea47adfe87cdd40a62b6c73119ec37026926a1587ad5bed16b2e605d2dcdbcdb245afbeb9784e375770efb62bcd9d2db6edcefaff0104f8ffdceeeed5d7dcb9e6eb06ae5bc6ce12b556237def233d2fc0ff5fc9eb68f97f5aededfee1ffa7f1ff33fe5fc6ff6ffd9fbbd39c8dc508e0ff61fcff8bff16ff2cfe773ad0a91b3c77a3aa62a2d7de5f6d0e068b58244b56f9ff25af3b9bc8e906e6540add814adda0dac17f51c12929a91d53f8f7c38123ed3115e471636b94e78e5b206a6c3bd7c2dc466d618b81a58bb3ebff77af3b63f817db6ab0cd61fb1abb06621603798b0273584f0cb738fec9f5ffd7d7997a7e35729dd2e7a28ac3aeaf6db57c77c577ddd7f7e4c4e2566c2d565575b5c8f311df4db3aa62e0ff27fd3f52bbdb568b2ad89110772be485394f7c4086f9fffdbab2cef316d5952570f94fb3aa71f0f2dc8dbf7b83fb1adb4dcc44dcedff8ffeffb4d9862d5e573a7dd72acbafaf63df8ad7918bfe55cce7c5eb4839ffbff43ad2cc27d066beeaff47fa9fa5f97f28af236ba49b1805cc613ad216c5ffbb78dd03faff35ab17c8cdbf9baac53de4f7e972ed74c772baea9bc33631b73d168bf1f2f7ffc4d77d93ffe72dda8941e056551c656c71fbd36a14b0e5513fad765e6ca37e5a8d2aaec21b63c555ab3756b1bd82adc51b3a78f478508ddd904275f440a7a2f8aaf110a8eedda3d862e7c5168d5af1afcd3c2a13f730eaff6bff4fb6bb6df35df14df3da167b6eefba75c77dcdc4acb2447dbbc66dbfc255f78e89ed0e5efcff33f3ffcfffcffd7f29c3cd20dcd3391e796fca60a10d0eb7e407ddd10af788cc31958f35a5bc64691ecd33973b3aba275395f3e68e3e476b9221a4766960b5a632c6f2d29aca18cdab00d6d1bce42dcb1cd3794ba4ae7302dc25cf5c94e311c77445012cf3de98aa5c5100ebbc668ee9b148262c170b776d4c55a698f776af5c2c5cd3d1bcb7a62a582e16f9e691690a9203e62dcb1b131612eb768f98b090584717c754e58a0258b78b85c4c2dd33976b9a0057c5768f6eae6982096eb7bc8f8563d2315d510345011eed92584b00e99ac0ca18cb5bc678deb3abbc24920c07ce5bdeafaef3de99229c8c264ef8007140b3a68f9f2539e88ed4a8a02b2f0ece921e64c80092f797bcc129c1d0ce6edb5ff0ccfba41656a3dd1953ada9935be5f178c491b99a161803b46b363d89d2c947aadd59ad098c08ed9a1d8c76c95e6bea4777c6248483ac0e665e7236e479b3a67ec42391cc4b632ad2499e170ee490f7919a98612f7865939cbf34d2448202357fd590f78f1e8b2c83e56295f9fb33dc9b3dc8fb3a1c79ffc4fdfd1367337b0440cd9779c91b80f29e03e028b882450d140578b8b2645ac282ae0a47339f9e66b5bba4ce5d72836e891cdd923abaf39a57746e7a6e4d5d4fe7769fbc1edeec1e31f9cca7d992177455b05caca37be5621d35b1e6d36c890dbaa3fbe40b9147f369766d4b68d0c9609bdd5b0c32e868f748061bd3923bba2531e86a77490c3adaad312d9941772e99812ccd3335e896c499b3244e95252ecc89b3c48e6e890bba2757bc25747455e6c4a1c35be282cebc4b60d0958f04e5e9f04810704d4d6f3680fbb32c99545b952952c8f296e757a9807b9224a3303da93541317947e7799eb45b3b3a6bf74ff3da6c97349f982749ded334cb003c21efd125b798dab0b29bd776674d4f02c0b399b600d46cb55bd26a4d4f6a97098cd60436bbb62860b40094b7bce50523efdfab72d606b70485374b1c6e08c9b36d9d6d3fc3ca7b324181c103a3dde7dd9aa0048077744b26283078b4a66e0e219f9cb6262801e06d91b4f3423179607f9f575e19704b7cd0a5d1c968f2f7af0c274b30744c4bfe9417084e694e951953952b3ab0cc1b80311a16da7d24248f655e2a518ec7f2ce98684d36a6aff3a8a48b76674c345ad30427922838a5d90351b06a4d139c77f600ed9ab776cff3ca04b44b629db5daa5d59aaee4b0ceda65aa62a3522b2f4e498603b311feaf4c605e12ab441265764da60044c132b11ec92b87556291485a5de6ad31cd2eade90a89555e12c84b368d306bba42629d4d2f90f7917e0e2895619965d30b7f29a0952719dc921474e5c5e196f0a03bfae30607372ab819c14d06658586f883020f724c40818b0bdeff699368893f6d70682307040178ffa7cd11893f6cf0b069a104365d16ad4942cf9f352d94f9b3c6cb9a297fd43c8144107c72a0e10515d4a82123460d076ab0344a6388092280d8c186185a40e14c1ab22f69b8a4a992084d213449f000039a3368bc6080c60a2343273071421179e29c50c2095d4eb072a60a28ce28b187ce1934673c3863c1992315848e08824f0e75ccb8602605332098b9a0cca13243f02963430c655a202b53411442986083092a988066840fb898504199144904eaa1043b735628414d092594c065d11f3249fc21d3830cc71d0a524a9892fb808ace822a64a458b1557145500501d8c1727bc1823717a0c9328296a30f30c0200312a46ca9828b135d724368600362033d1c1cd9f1629bd3c11a0f7663be74f960042b607089c24421c6b6c4185c2010907808a18603198d06116e2e8cf0860435644c28210413be94e962e6823322503961119a436908a949628d20363520daec80820d6e6248c1d6c21b372ad4d0ac40020b61e06cd042963864545c5024478a176c4cc060c49c5a1074f8c490830c34ccf0421d156850534309766c63ee7460436dcb0d21548043191e2a7278224f123a04d2f3c30e361d78b8d3432d863d2cf051e303093f7cd0670b09040856c83155fc5102101041d820440b81ce08fa60883116105145113a258ce873c4ce0e123a16923061d0ce8b1274c47011b3441843474a30e1a7091c9c50924368cd1364853480224c950bc21c79ff074c2124224a298e803084c3a1a417a6584345082422305caa003325d121458316fd618494a7910cb9158eb63552be4cf9600a95164e5471f1839516325c615381182c5f2cb080c51417ac30220b8b1db4ac9883019b0c74216cf100032e2b1475d92da1c18a3e1becec7000c78bd2990ebe78d041055fa8f80009303e84b923c64b9c315ecc80e0a58310bc5821e3400a11382062040e7a2081833a643870530207642670b0a50c23334d9c09e204a53c6856c84973829a0d3e58b341056c7653b4514a02853e6e74775280f3e68c0a1a7cb0820617b0b0084e12a1168488a3cbe382d21c393a362f2891c1b0c19c2e57e8705114831232fc50cec085863a4870686053c39109764038efcc8ee0d2810d16607003972a478aa2c0c1b6049e236e7f78473ce47027cf96186a71dae8b0c54ca9670b085b382877d8628587297a48624f1f3e36f810e707347d94c400c1c54f0655fee0aa00947322081c1142ec10888e203643ec402002a94b11185031e2d011492091044412b91c06cd51028525486022c94b135a2c70821121289ec81d51a80f1448384431478a140c9539940b33c5ad0b15b82b88b21cab4894c89022428b0631a211d1a8f6a72cbbed70b4418a2d8629b53854de54a1adb18223e1ca980a3cc0d2c5822c175c60250bad4c4b0d110637421920b1c5260497da0f5d76d08086c306753878c1cb0a1dd4d87870e60b8d840f662080a17d09d345cc05632ca002426d51085390151281b6c408474390f0870c8d4f09794cb053868e995a0b67523881a606cdcc4c1ada086ac2ace1800d066d6a5750c072749328059aa137474ca870c40ab4402cf881c3a7053d717070a1063931bc20070616e6b8a1a326063332cc4898614c1d0f68e85243163b1558b95366431537d0a4c081109e991239149127081d7ed0b3c30e38f040430f73f6b4c08796820f6b7e989de943230108317e7224d39f2b1bfcb9a2a504b4c8501046003a85c0532790953769783632a7202b604a73880bfe58d1c0ca162b564a2214157183c288a34147dc8440e2884f12390ca241891796b0a9c0049a264470c20342370c9ea852a5d0912228a088e296841442183ae27328cf1476a8a083e80f9536b433bcda08b62a3e48f4870a06bc23deffa15245d1a245864c464af086301bd5f153668687e3fd9f293e9865343dc7138f941cf9674a9d293639542e58c1fb3f534eb05521b39245f77fa670996285f77e18ed919288772bc4cb19515ef18177f250010d0f162972784f72169c2b5c50bec962a2a02589045e4d0c061e64f0474a06bc99055b4cdeff9172854b8e649232a54bc9fb3f528e1a9c8b480b74ffe7d804ef49eecfb108de8cf77f8e42f0c89b3379ffe7f8e7cf51cfe9e5e4e0dce0d4e0ec727239b79c199c189c5ace2ce705a7052796b382f3ca69e5ac725239a79c52cea35966363219998b4c456622b30a13914985398579c834644a614661426116329f3009994e984d984c984b984a9883cc244c24cc234c23cc224c22cc214c416620530833081390f9c7f4630261f6317f307d30f9987bcc1e4c1ecc1d4c3da60e661e3307138f89837983698379c7b463d660d260d631673065306330e998734c18cc174c39a60b661cb305138ec982b982a982f9c64cc17463a260b631d9986b4c35661a138d798279c6346396314d304b30c9982498239822986466082608e618538c19c604637e607e313d303b30bd981c981b981a985d4c2ee61633031303538b99c5bcc0b4c0c46256605e31ad98554c2ae614538a792ccbca4625a37251a9a84c545651222aa928a7280f95864a29ca284a28ca42e51325a1d289b2899289728952897250994489447944694459444944394429a80c540a510651022aff947e4a20ca3ee50fa50f259f724fd943c943b943a9a7d4a1cc53e650e22971286f286d28ef9476ca1a4a1aca3ae50ca50c650c259d724e0943f94229a774a18c53b650c229592857285528df9429946e4a14ca36259b724da9a64c53a2294f28cf9466ca32a5096509259992847284528492ac0ca104a11c538a29c39460ca0fca2fa5076507a597928372835283b24bc9a5b4525629a994534a29e5912c231b918cc845a422321159058988a4a283a427a3fe926508d94cd334df34ffcd37ffdfd402419e3c3a08e2e8bee9c9d2921274afcb03010e10e4609a6513211e94c89fd2b3431205ebbc13ccae955953050a609df76c2a95f881ce4ef7371a69e13db135aa52c630c47b52835732715eb28441f7a4460ddb2567342626466f04a33d8c74d0ed18dde12d9d68704bbc40b0839fb23d75cac894c9f9c2fb3f472cbc9782c4fb3244bcf75336c84f19113c1aeffd94016aea744e397eca40f8734cf3e748e624cf7b1edd93e9e82ec1a27b72697fbbb5db2da75b8231a3e491bb6579a486a5d4f4e6d3ed26312d71a33b713624ada4f39217e9e672349297c444f2909894e0d15ddbfb29d362f2cc5bc3bc67d3d39acea617449664bb9d0de9f2ee6c0add6c76afee85a37ba27b421ecd1e2797e36cd6f464e99c9de79d915848f3766930764c3aa77beaee8ea98685bb668fdd3d6f8dd249970483373b6b77456d56bb3ba659974ea98b8531c3726f36da0d0e0e774f242d9cd205539a313dc9f1661789e949e721255da524a47b5546e12131a9395eee76bbcd6ead46962b6f644a3a48352c5bc9a3bc52524d4f5443baf22e504a75c1d0d59a9e48f170378e6e76a54cb2cd6d4aa2e29d30be862565f640ba3626295e796b944ee45582a1247544963789e94d282a9eed7ed9641b623171e7d1493b9d78b341408ed2d86c36dbd3ecda6c5a36dc9de996ce7be27a204931e9a002c27415a4743a9d4e3217744fa47827598e697671474d399eee89d4d12ca7836a36b39d4765ce4cee9e3c9c143a1c0ed7646b41575ef23c71f7c49d278ec4692107f17217771ff7a5d3db9a7e46a39db6d9adcdfe3cf485f7d786abc1b3dd9f2119618485f75b7f6d351ceea8e989caa46491eeef55d904238e8e242f9569b3954ee48c12494b89250ef983e4c9e195336094248dfca627d7bc33d3c4dd12772379b6262726dd52c92511204569fc2812e327511f455e784b85708ab4d428674049e958c2d5cc1e97ca249b8e9a489b12f352993d9a944fe57d236e4d5d8f64332f96596bea2a9dcaaf59d3499a66a1b247ed3ec99de63dcf6b32e54aa7b3c9863b69e552e904e389ad3c67e6496b3a79509c381965692bcbb2b4d9aeaee481ab9536da0c5a79d4a42b79d06c4d2569369538d2bcf1feeefe878d8c2aefd7ca9c8efc919b5ddaad31914cbad289c60b2907e095e4693e692ad328c101d11d9e0edefb41c4018f9c91244992a4499a349acdbca5d3bf8dfcf3fcfb2579951cd2914fe79319e63dcfa625a7d2a9bc3a26ce59538dd269c69d6142f082eebe139412effd2002c4ab0de2d970c83d491a0102773301d94c9376be8de9a4d16c6603e691ed344d130ea2d2346bb45a0e9743328f7248b51357bb276e4633713512e988c684bba669de7034dacddd72387376cdda2579729e673373648d055c0061240fb7e2ee74f7b17025cecc5d5c79e6cc232e3cacbfb6dcd1ccac3130c391640e69c75465c7e2e2662c5830a9c921e576bb24a4154c24d62e776d66ce08ede62e1292d62da763aaa29bed6abbd9bd2a77b9a39991a76352324d9d8dcccd6a48b7ab635293bb38dccf942eceacd59466b3d9cccccd68b8262827efa84c2a6f64705ff5a43cf1e89ee40ed14ab34cfabf713ecf8fa21678f769b54722f284b6a8c0d166b32b8346b3e56ef769349a69b3e1ee510d87bb4848b85bbb385a99fbaa190c9e92ee4a297dd5ed965787c42b8f6833e828c2a36850db9eb7db1e29e9d2b0cc8b3b69e4994b6272a0c4ca41804847de5a6e8645b399cf3b4d2c24a6b224af0c929ce5984a2c1b53988d47bb27cdc674bbe779e2ce1357bbd1988ecedc69c3494ac79f52369c906e33db69ce9268342568b3374b9a9c7b9a48341aad44a2e2489ae4bd99b756bbb78b339170e6ad0676bbe4ad927495eedf1948972987b4753b79d07d0fbcf76348051ea906ec766b5789e976734f6ee6d6edd6cca6f34b24a4dc8d863bc2dd8e900e61e1e190c8f234cda4a3abc4f45849bc9bcd2c73656d843bbb47e6cc344fd336fb990bdefb311442ed4f7236bb67799ab34bba60c2e0bd1f43159c47e7cdb499b32ea459d66ef78441be49630184f77ea4f04243ba3824f3969433cd9a6922ed72a62e57d351f2f89b8d4592d2eeab56dcbfb8153a320909698b45ae26a35643226b25ee2a210931afadc654e3994c2489a4c582e909d296a9f437ca1d92101f744f9478e55dc1649ae6ce5cca99b7db8357def20e81519a378541bcf202c1216d9946685098663ca5af0a2b79661394338989e4ed989e20ddb32987a4c40486746ff786d400ade92c9d90b690eeadc9f602c96c5ad29151e555f203120e8774942392a3dd5bd20da0bc5d2976e0e102c899b9f2e8263141298dd8784737774b6aa4fb2a3f524c7173a469e24e1e034f88673619697a727e80fb92078d469264499234da8d46abd1be6a8684bb0578736306bbebd69c679ef9c537f79be6cc27606201a97fa62f2e2446b27a41b8901839d213d26b809795a5d5c05df1b0df36f7d2b5b8dbcbd3814ea15237c0301098c18e36f2789472bc1dff8fc72f8f6f1edf82e367c9f27ffba3ffc7f27fc1f18f8e4729c76396e3fff178c11fa7fcffbfd620edf48f5fa775c5708b03cd31854add58c576fb1b723cd4055974ef90e321ba20857a2ccf44bc762066893babaa0a98d30d0cc391a368d56b333b868960c0adfe5a15f7dd7b6398388689b99739fe59e1c851043286899bf8b56665f93677f1aa2a30e056b1de2acd2cabdbceab881c8b0121dfe8b086ff1d98db76036fdf2bbf37a8efe5fae6e1d7fde1ebb5bbe74b33166f51de3551abc3ff2785ff3bb86ee514b74216c991ce3111ddf5ba158156f1aa8500355f75dbc7b48c2acbf288b97323c7c3ae3677fd7fa55b3dab2aee4a73589b793e92732b04c835b1aa8aaf196cf762c7dd2b0357ac622cdea22ad65d457914456df4ac42759c5be1ed9beba2fcaa18ab45a08a81c255a76bf1e616dffc40959ac3b2dac37cc56daffa7f24af5340ced5d50f391e5eedbeb77bc8efde7dc8f1f05665dee6b0dc5edea2438e8757d7c9ba356f7312afff3fe09fa482839c4ae09f4c22673aab3c38b79dab99df0480dc5413a3a2a27e451e0596f21b7da7184cdd6c148fca40acb260ed168bc21da758a7991895e621c7c3b558559585b8dd9d575565a2ee6bb11d93b23a1328f4b7cae7bb1ddfdc71e7d709d5fd4155646205841b7157cec11e37629673ac021f70f3ffbed725a083b768aaeaa2d4148ae3c60eaefa46563130cdab50733eecb82b55b386a00f853a8bb539cc489a572442528cc58955551c739e8b709e81bbed7c77ede0ba656c77c7e98a8ba8b8cdac111513dbcdc53956b3820c811db35ca75555bc9789b80d7223eeda5c3c438033f243500110bcee4793fff30121ee57f316edabde6c0eb4072a75630a98f9ffa8ba933bcf6bafcd5df78099e551c01c5695e63f8c01065ca99b00d3ed9907837bd6c300030cb80958dd744df27fba70aa392b38b34eac93f7a70e1fba76f3281d95a1dfca377c5f8b1b7813b0ba6b567b3d98d55eaaeeda8cced39b4002c0969764ff7f7c5d8f3b107c6d65f1ba785917c81d4bf58f60a77c21f55f42c06388ef58a8c3f01a9573db7f51ea06f236afab7ec0b8e2227b7ffdff9136a73a6cb75dd801be6edd8159d5e29be5ea59d8e28ea639cd1938962f6f73df6137b745be6af1a0f1f85b3526e524c45f80fe9fc9d5fae225d93ad2b5a3cd3f939bb525642b4babcbebc69712ad2f2e23593bbcecd092e60e2cb6394c774dd42dabe38b6ec7ba03ffbfd375c2e47219d9fae2656d11e9eae27515c1d25c27c944fd95e608b48adbbce60532517f657d21d9c1dbda39d549c672cf6afeea02ea36138b5c5f5a5e5a595c5a481cd0f212aebaed5e5442be9004d1fae21dd12a82844b8b084febc811ad2d215b5f5c5a41b6ee579616035846881041c2a5f595656401aead235f5ef76b0beb88d6025a5f5c5b5c3c2d22468c603dfd7fd6ff0769808124ffbf4515ec4884ab5e3526e636c51d0fc9ddf85bc0fc1589107fe51fb1c825c45f39dd4584f8abcd29ce47da1c66c48870d56d4e5b233d7be58e815a658b417af6fa7fad536f24a9365224d546540cd4eb5e3170dd5cff1fe485b8e7ae571dcce9baf5ff59ff8f95d55eceeb96904cd45fb9e320ffcf5360ddba6bbed9ffbffafff315f8ff74d560ed6e5b2d1c644190a9c18c028e0eb28594244a0ad22fe4a11d1895308451bdef8f0ca5076c7820199959414a80ca20f30839986c8232fc90a730a5f6e0cc87e162c264c0e844e663213387013bc824277479278adcbff16e28b32060f531a4c051222114e8d94046bc1b5a15b286275094222c3242966cfe5e0c61e410a4144a22562823f340f96292017181340efaf2249da77f724b325bac2f7c0f6d1513823112c821dcd4f82689ca480eb0fa9009dc297bb2cf55d9e528f9383ce0ca077af0f10a3c217b27574b9491656565665959135c6408491a8865a49822a6cc2ba3d84bb183d49bc723bf6789467940101190261c7154ba8102025d111a52bca04523891d1dfc0630789871a80727d6e434f873110d7288accb23111048453f94f91772bedfa1a3fc161863c82b36f0502691b59192d249cda20afdffaa3bcfe9cd3bbd4f4e19d81637aff3e6ff56e9a2348892200aec6fd5ed56f56056efbdf9fa50a8db7b7b30abbe3c04764c4c80298104fe1fc88f28285d54eeff723dec5ce761bf557c2ca7553eb888e8d08cb71aec19751a452cae523701ab8bbb9ad3fc93a0d8e475dc4881c5409ebfd0d1f73562edcf3f1320bf4646a6b31d597b2572e6824c226d38ce1e6f72700a502b6db6d96992e4bf28d12f9f74e05480fcda8fd92bd1c827497236d351e2ca2749d22c8790648d2c49d2a445509225592b5d1c21491a59fb924442cd924673ba5df22ccb930b79926479230f95e4d1cfc8b33433493e2949b2b42129659464493b4b928992246925e900f98224cdd236c3ccac25912e4892244b1f650b9b498e214b9256926469f6c8f2bc1de92873a4958d9cd53013206b65794e99b7b2249f947890129c5338216657f9e7972590a7e974ce4ad2fc99179208f2cbd7e9744f3e7992254988b495079064392b4b9324739051a48dcc956559d2b2481b657996a49489e202b0194022ad88517a40ceca00c89334c92fbbca7b23cf2f35edaf8fc4c07ca619c8bfaaa134491a79d64824d2fc5296b62a93a432c9b23c6f993b7222672459933aa7069022cb1bcd56d648b28a2ccb3f268d3c2a4f338c6c2a8b2469de208f702569ab91e5552940294049c37cf3492592569624d2a933cf3280b22c491a7906c9a31a246e56923332a9878c72ab863b2ac99f2d572b4907481b499a25799243481aa58f7246892b6be58c34c9922cc92a9246892b6b2769ce4c92ec419aa4137944e64892fc410a50decc1a693bc99224ab4892e6a25c22cf929c9da48f12479aa500a46996e5599ea48fb224639437f288b49d25499255248df25633c9d3769224d9e392300eb001311198912679449e30c8a3a32a1c13190290049c6459d2ca5a26752da4704348b2244b92246f7cedd95f12852c0401a1bf108830480f044c4634f10026620d922104fd17939ff7126187ec8575f82322c8197384691b7140842785bab08e2b22220820c5103c43ca870830a27ce024343d8640aad183e946f2188264c4c35706028fdbe8519f22016ef8cc9450824cd85057ea0004c8a09e18c0777303dc172b9e8c8593f7cdbafc3da9fc9bdfa44bf76406779cf632717be57573f1207bbafa57b1c677d8b5d890eb5533a07342f46fcc6097777d73bb83f977f1356f3a27b6cda9aa8bbfa84e0c0a799d13d3e7755f5edc3a2cb7eccdc3acb2c40dbcbdb8875d8b5d63dbd77c594cbc6279bdf8ee7ed3ece4ff7b9c4c24b83d41dd9c9c26b813dca06e12dc0b7525b8f7de6b43d0adb2d14767e38dfac3bd48b4f1e5ff56a5f91a539c5b1517c16a77db6ae558855ac53902cd7b711b3191ffc7d1dbbdc7167bff1f35f5a7593e5940140500fa74cdb7177ff7767c790172d235eb0ab8a080b1abdee0beb9ddc11677dee4ffab0ac8d21500a400204f7818f82f9fe0fa2f8b28d5924799438820484069d45c9148bbcd115ce3efe65487e9f4ee7e3b4bccbde3ff7ff2c6e6698ac70502e44e395d20f722b006cd096726f87f2aaf63a2f3bc458b5cb74222a712131dcc59e3041203228879088400fe68f0a608196780987ef6e47831468c16383c1d269d0c8462a20010a46c0b9459c21c2623aecc3441dca8616639066900001194d1c1ca0c934de37481f8fd30f4b4642249421746910862726372e68f303a324728d165eae9ea19e0099d090f54815a64d2b2a0c9e08915aec4c4305432e14218112265c804d13551ea5114260040902913048811e50a6680d8c1ab4911297400a80c4304990a803c1840aa6a4f29e58b8b255248c0e415084f19c473f384e9a1c95809754a22581649f1228a261e1172ca291600cdf1fa5202863c6f4a1753d400a625e14b084dd2908b4a0823838e3f3eb41440861c42082121bcf00159af0831a41d2f07bc6992c803b2143820d3dcd9e145c39d0e9c24a085d4e00a932b1a300943830c5548b1375f4688600c02865800c826511c8d49f06602302b9dc41a8148c207609e106340256df82109a531580c964849240d8a6828136424a1e43f8a3a4e68548105850698afef43c58e2d831868f21f22ff421b213295963b6acc8ce0047084a93d7514d9f8c71282111b06bc00d3a4a5e3897c78a022834689e3f0df6b0b0538f248b04413f6a9e8789047021b6a2d52f817408a023ec610717054e5df5433c6040d697e658306ed2941579647ccd5a2b2147660e185122202c85086ca3ed02207cfd1eec282a789320ae41c614b35d8c560c2883220a30a548882cadf9004a86ceb841a353ed05c831ef694a14634d1d53900811f343c654b1f2840440d7a248892a64ea32a72685300923c35b5829c46812eb015423447a905d89b46755a08c26eb0c54c181dd2343a83e84c4f072c7d020ec834da6242a017428073049c2d621af5405588d5609f28788183464b3ae0b2a2a54b1c03906869a4800d72ca7c3a6290f2aad2a8800a7ebd991a0006b204a0d14d0515d49839a1ec08a7337a420a22106d20c40c5018a032e243029aa012a49e9f29524671fea4516b4cf02ba14a1346641b808590c785026ce8e08b91151a82086223460f39c421c208acca9d3d8178a841811f411875b9a1122a3a60879b0c8030daf1848edb971707a43942072319645774c8c183391e188262f43f742b381430a5ca4e8d454870e960894d35e48b91198b709041c7018f228a92f4585a84c214202b8c4e56c8f3406e51076bf06c75b91af322969d8b2458424c93180184b2e0b068111e0325cd163526d8a082a145427a70a089d3141230549a580485819e01d47089b20888118b763024e9f2040fcc871c2045539489a1b0080639808cec5104080ddbe8851d3035dcf0ffdf088fa2189088a18399400cad40ff5f4659b33a86892513a9e0aab93017f984d408dc40a5501874f0de62f6051b4da46c34f95dabeb448a49b0f893a38b51e8ff9f9c8c9d25e61ed768b0f8634252326598301c4f0c8e2711da0197ac1d92a233e1389be56a06f891728a3075bec8914143bbe078123972719b0183caf1088273892900aed3723621362adacdfc01e336c3e16883735c6a22e5a88739268a5ca0e3acec38cbc5f0e198eb4d301c8f602495b51fb3a81907585ae002f060caa9e5a8c4a4c464ded845d960eccaa6cc10b051d580984a26101b99a359642a8a76a3a5399a385a8c130a37659267ee84ba099921508380168376a33dc92de5968e601cb9a84160329a428b61b69932bb732ce0c949bcbd02689c553925daee24cd1b66d6d9957b412b6b0fd464d4b8662d92481ace9c9d39d3344bb366dacca3db8cd3ac21a9ad50eabaed6ab41a69d64e1d67d449da02306548391a6086e6989446ca8e76cab0059972069ad2d4bb5fd6280920faeca0c7863b45a157172e5a580a24d063af4f108ab2a153b2d5982c31c25596670f0f036c91fae2c11598403fe860670e0b6cca44a1067450ec5b787b088a4280f8eca14185281400a0c9122546b816103280002f5cc871210a9b35144cd0a33163af03240512020af158d6888a299a3079e162f7839d1a6298c3c20a286cc9c0821e002078c008d7960e796ac8e1852f43fef8d1c10e0d736030814c162b54a028f4039f3930c87153e598d32dad1d52a1238c0864030d2ec47973a60b0639ed01a0099307b6b47e543ded9074c863c398305daae414000c6c09d1faf14718a1439e1b6a7021ce1b14ce68904115270c6c25f0a3aa878ea9a715bbf3cb8e3042881b6ca8810617e2a07046832e19605085889e93260a44a18b14116940292988195cb46451f280d4081864318ea9392a331b958c668aca443634e709e599b20c89a39c32a5481477c344c0bc2e06286790326a31cc004818e70bd2c5118b152b4cdda9944bd221c5c805809b71db1dd56cb45a49a3cd6626f9b42ab7027038d68e6a4767928d47edc8a491fb92c2d56473a2dd6c54674e893c73b4de29662299bbb30f1530475a52593b3aa1906850ad39de92e4d2132a494aa943c60cc949d280c8704c8048901d95f2bc9d449ea8382231e5003d52c859d56e802b29e519c3bcc1924c563304f81c69b401baaab450c2b2622e20a5826300470fe496724b110869c1daf86d8a23907eb4804f035dedc8449a819d166891623b93683448a51c529218e1e8001faad810799054e26657bb9a8fb381cca4cd141633a79b909b01b426e701351f535a10618129276c71a193aa82042472419d23ae180c4305098712996486f9a316000f29b79a0fdacd9664f6d85ac0a4711332c5f156db42f2b20d91a125e4763424e7950269e1f8e284e271a355b140a2dd705a4d0030e178b30d11e097e53833753392e600ed36fb413bc00a0b573cb2611b42bbd502400a7254e3e43a7ab134c380182e0eb021d0c01103a4dc6c682d07528e1e5b5db5dc598b31ab32791ce54e1bf7aa7654bb9d51b3064eaa2b7226c3649ab9903ab2014d1f5a3f60d86e2e8e7a48c9e2c2e9b0399d35ce1ab4138e07249d416608cc0438aa71ce509a32694c39a251a419346f9ce64c8226006c00c35ed9acd143a70d9b13c85c106582310e16cc401f009a2c5192048957171106865451e57032a00002ee59030d654f34918402560534c508a04696039e322638a0a540158d16391cad8e9c386acc942143820864639038d98842c380f9f22a5b64e8b7e40942737a7ba7c1161db4fa71ab99e9c2a5c711107dce98a9f2c1e3c512ee66abcd90c1c20a4d726a848b812d215a553aa69e56ec92904e1032b0a082158276bcc066cd09511e48d283078ca573073d5224b14a80c7518d86c295386e46e860832c12840002085b8c7059fdb091231599894a4467a14ba81c7426510e311344fa297f287d38e293db53ee50ea50ca295130d99460e713b20639808dc66c065200e58bb205b9b463315b51ee48dd9954e266b7f2c8662b6bb55979922649d2feff11f8ffdbc7d02dfdf0ea0ff755b76c544e3750af45a424b201325379e09f0cabf14f42c9e1c8db98539a62e39353266edee31a7d72fa15792fcd60c03c04a23cfe49f213c51081d7d7d6025b417a0b6c79f594f08adc04acee93d39a553458fc89a96cd83f2fae9a88a65ffcff2aaf5bf152d7eaf61513d194b7e8ba85b84da38cc2dc71db791430a738ba1a9c7951d103f4441e43ab13808e80ec5081448e5314b98a275ee041c2e900cbbe928060f5b084460b1e35d4d4106c63801b282b1f2f7d9474606065c184e8aa61458ba80afa0011420b430f1530f98206802cb99418c000d3841c51029093431b3f754e40b61e7438d40401dd8828a516548ccc401f1ca15eac4818464c2514a8c2909f321e38b1523991ce79320049e80691c7c44a9a27a41070258a1dc3bfd80e0e1ec7840c4f4eddf817a0caf14da4ab7faefb5fd3f3ff77ca1f606ef8d9a121febf74707c25acab27af90fddbd0fd9b83fe3ffdffdba337beaf5bc4dd0a31b65fff0ff54f9a3a2a9d8d07f7edc57db9be3aa53e3a253d3aa513744a21fcfb6e70dfa7eb746f4e355ff5e5fa767d7f185b9caec5fdbb2d1e022fbe7daf97ebdb8dbfbc6e2edf5db7eeac11252f9d52964e49019dd294cf7785ab066a95df350fc5eed34d00c875bae99a6f0240eeaa85f9e7044551267f9a2990b6c36986f5fffd754843dea26b9b7bc76c54dbf9adea767cd30c06d42b66a5aed56df3b06f291d17c8e55d0b752ab6db76fff6fa641a5dae8a50ffa288c5b57c5d4eecff51f4c9e9c8e98fa2fe3fff97eb2110e7f6ae39ffaedabb181ef620afc3a04d5f31500757a1e6c3de6eb156ece6e1970e032c8f66ae2fd5eb3008f2db987f9763a0d369a1f38fa6fa7785ab5e3156d9dc8a6df5eedd55b578b98d54fff2f04bcb97ff4737974ecb914f33b148d4ab26de3cec9ce7dfcdc32f2b1c398aa9d51790a0914239027de7ffdf18d4ba2c642a5e8b44e2068ee58ec374cbf6c4f0b067e9fa7f1aafcbe2d435500773da4bd762308b135faa7fbddc5a3d5d282763abd9b19c66313ceca9ba87bd75f778abaabaafba08a5cd5d6916dbbd75ef964db76e33dbeb1cab63395db73aab33301fd94331726ac68380a7a9d99496d5fff3764c953cccd4e20b3862226f52a6789d94265e27e58719482cd425cf42b57a162afa2c54a667a1baf8ff1c52d20a023c8b15623c8b15909ec50aff2c5488e259a8308845ad4555956ff143826fe123cfb7f061e75bfce8dfe287fe7f1b2f5af840f22d7c00f9163e0af8163e5efcff8e665bc1b6f815eced57b0e7afd8897ec58ee2576c422b744a2b9e70f9154f28f8154fd45ff1a4c9af78c2f52b9e28f02b9e44cd02103e8b1d966711c08f465b4ae4f44b8966fc522217bf9428e99712d97e29d1f94b89feff8f724b3eca5fa2aae297a89af8252a41bf44b5e797a86cf8252a3aff8f3b62b1e69f851a299e859a259e851a41ff7f64e296aad0bf5485ef97aa70f24b5524f9a52a1af8a52a1258c1824d9e67c146ceb36093e659b019f32cd870d14949f33a2922bc4e0a97ff5fcad15af830bf05d5a16f41a5c4b7a0faf32da8f87c0baa1c5e4969a903047ea98319bfd441ed97bc20fa252f847ec9cb12af9372c1eba454799d140afe3f87809da515b9251060fc529838bf0402ed97c64cf14b6396f8250fdaff575a210cfe0a2103bf42d8e375ffb9a4a5302c7e298cf94b600cfd129841bff4c18a5ffaa0805f02b3e73fa9858e1edf42c7d3b7d051c0b7d041e35be8803163890bcf2f2180e69710f8824362b1c6cfb358a3c3b35853e759ac71e159ac59f32cd69c998184c604c1a0ff7f17313ee0c2c2125dffdfd71c96ea9da4cdaa8ab38ca82ace0a6b92aaf2a4ab12a3ca8a2a67143a2a8388f8b32707175298f2024db18cca972d138451210675614e3d2a45a86851b12a1641858a772c0ce3bae70e4c730439b742d6cd713e92aa7bc814417f7ded6edbdceb45d6a79b62e5f3bab9ee57172f94902941745364a42aee3878d7bd42dd4cdc5e3b2df2b5987911b3ecde6b5f7358ee754dccea4e8bbdce71b097c3345f7330a7bd360b85baedaaaa833cf7224bdcc05ecf3ce78e53b6e865ec5ad51d49fe612c96883bcf44fdc5dbe23d733ef6d5128b047126d2128b1881b8056e620ea26ae05adc5999b8b3583de44586c0fc656c8b1ce7233d73bed3a29711e216cfc03507834686b05a15c2795e893b5df1116337f6ac81db2b49ebb5eede8bea025988893ab75d42cd75578b4538abbfd4bdbb8c6dee7d13e19a8be72214bd22e13dc8d50ae9412e638b55ecc5ea2117dbaa9a85e4766775ae89b4b9ef24ebd645b26ebf78c64a553dccc2e99adb1ccc47c05a4ccc47845f7def23c255f79d4473ade6ae870fac5bf75d240357ac5595abeaeeca615969065bf1911549e75848d8eecabc88bbc6be72ba8be420f66a33d86eb1b43818c75f5908abc1bcb8fc935b32f82731f827b55cf04f5a80e59fac80bc62e59fac4252292b2b2b2b2b2b2b2b2484520c3a0cb04f8408330a31e123f57c7e90f5c06007aabf430668021c5e50f272eaf880c3921bf428881112854da0ff32333478b165a6fb313f5ef8a24494ff0d0aa57b52b061c8679942a185b425fb29547835810d51bd043ec688e052b5e779a13a6c0407bc79a28b2d1c6602e0f9200955a2a8fdeefb34f8a2200a112dbf049014792a00227a24131cb26002f27e176b25d6a4a7ce37c0e6c9fcb0e2f90576acb0076b83349ff5378aa906d42b70030224c60158ffa36b015d9d2e517c8f3c2abca0000a855ec7141c4e5001f4f353c230747a85a01e9560911d13ae547904e46cb13a6a90fe93012b0077d3d21bc0c2a245524071c2d75859984c4a10e29b84e040346282abbf5731980e6812e70550b25b24e805383f434b11b5b7a3f53100f571a3e64f131f801025bc1b5642fc0b3b817e0413d0bd0b5f598a7d20e85b203d093b0bf17916797c582305b08a5f41c28b1c7c4c5cf89d05ba3e6cd239af8ba2429b314ffcbcd2955bd20373749f14e67240868b008f04430084a8f4103f4788802ad2467b8eb9038ccf35058d23ae05c0a2447c06fd8d060306b10e8c70bc35412d7d611dff084b0f1928d932f3364459b4307186cfdbd81b8c108148ed58834267c5ce0139e8d4c68a2053a881049d5a4dcf8b2e3185ae686354215294583a341f47f4a04de56af6878024755804e06753ac4c616fa8d19945d550c3c08a41c753100a1a74d1f2e6787630c4981550dad0391d58c97c5030f5a7ce8517273fd0b8327908d34411952482cc2f325021e1062c47f387e40676a4ec9a5103e010e109d02d1b152232e68564e50e602c28021185ac34210a1d8a0504a25352a0a7cb8c248ef8120224133e508291afdc71e569025fd1572ec13812c65876451a2203012135ea48fe9053d2eb5357a40b3a10806077a80d2902b9a416c6c391c4b264d18d16a64891509e461023a28123c9e481ab1c446ce848213ab8500215e442e69820043d4706f948a62e0a06fdc6f4903a1e6040009a818cfc016a3819ee387e21454d76a0d03b3e1172d690d97103fb7c90708953c302aabfd34290b1232eeecbf983c70d7904d5a380c2106548078e5f460a090612e0a1ebc770097100197ce739288186dc0871fa2c586454da8069f3546a5811ccb880ec2518120681d51ba7e78d02e9882bde3c91800c1619e145cc07db905e1a6840f53e105810ba0091ee970c22c7841482f348b03079e2bea0e7bb22a849c027cb9e6f00ce8e0e6a08a1e317b0f2b54f4cd0e6b36c42589800052cafc02e09a20f0d24fd8f0728e051040924be079f286ed82432e27560e9c006989b989f2282d0b587083d8f4a2193cdf030e111886108068e7430e59f106081894424b87803e4b8a9d3019d295fa3955265cd72c237313085108c5848fd0d4233ce10bbf3023091610a2a0910f033b834a9d10293f36308a2c1b3d364c007b005d62451aafe8b1b66d0d38306d2bbf8c5d1e34340c6b7504ac4228212b23c8b1d14c8828528c7af28a1098e467ac5efb2e078221362e275525888f2456ce9952a708282154a207d9298245817a0f879a439342421638a239f7b6285120ed5c87c0e012902f5f2d8e3f80c61301cf1f85b0d6146728022fd1b0142330814bbfc91058b225803c886b755314213b806e0bc0dca0e740868a2ec6b51d47ed88002385f33e2f066892a2abe6643737423c8e36920542d70c09b129e56b59400d58e153ffb03c49bb22c537e46650a4615670a3f8baa61802b8ee7cf21b68ced1030fce9016bc19040547f3a702880126e00e24f9d17197dc0e8deec61c5300f9b336f7e80c30a239c92377f3010ed90297b336a0a131c3044f8b2acc8973249a4f97287281c5053a58a2fcb6809b96ae8f9328a000bcc3002cc971024a93342979a2f77dc706827467fb90401120138219e3434c4951430703cf98356097666103ee9c29316210020c79322e85822aa00c293582e5881508f204f424972811433724f32912245068bb127854cf1431f2be3933948a8bdb140f824136f436784b027750f5820e308229e7c2b2255c8e4f88702469a219a14f827a24f969b1056fcf3d955d20b20f8bfb3039b274930f02f278a1a081073e81f053b5136eae3bf8c1690294af37fcc8fd4d9c6fe3958ca5a3558fc67f1eae2c488f94fe5050e2a1899f02fc103c511e69cf9ef3945423009fc13a5f8e0a99df90fca89e2430a10fe7d67f6e0619ffc2f914217018fa975eb5e54b717df2c57b947c76750ee8f34df8b678786785dd815498197e10f30373c49c118aa1fc7354392823f70aad0f870c9284f7d7cecf064868c52c117aa2a5418925116dda19ac10316f28841570fab2638a4940460f0f0c9d0879cf2a2cf8e287de0905498c67490312a4456d15f72d04942455a5154084720182e59c1a03b5546828dbc80d766eade2124063604492980e38ae4b2822d0a000fd021bd2875a11420dd21c1048f37c610059164510c8192e3041569669120040025e921ddf4e93a40911717120628101d1083a884cce1063a4f3ec48e64a046839c94900d22a74062c686981b41e5ee8521067450a74f9963099d0254f003a76ce285adb107d1b0dc728019020c250d2973f0e12380c5bd320380c04c130e1c5466d81c3d4c0e00f1994a78f5b9ac102c67d108aa01b674b599357dd11160cd923eb3434390138c5df5f2aad575f7883a98f36f1dd3449d16f1ba893afff06fc5ad30fff04fb86ab0b5cd617b813607d7cd655c7960abe66b1e02bb06cbacf1cb38b6dbaeb22be90be87a960f4f2cf0430b623428fa7f320b13033cb5332068fe9fc48001f4da98e187fdffa5121d78680323109f2eff6fb6c95df02583cd125bff4f76455105865c01602cf87f1302f6081a3e4b6552fc3fd984d894aa1216385ef0ffa79911ce74b170e14e8fff2fcb2860439308602b88f9786ac2a9e055e5ff4905346062848b0563e4fc3f298319a50706f64430fcffb20202964228a2801b70f87f922d23c10a24287902c6ff9329acf93d921c135efcbf79c80900b84943c3074efc7f49444b8123b2d8c842c5ff933a0839c6b0a14d0830fcbfd9628b1e421e7c91c3c3ffd3c0784144eea96a74f5ffa51187ba0460910745f4f8ff338caff6c110872781fe3fa77bbd91d3bd6a96c739c7c38b7de996afbc2951fa7f1a39e4ff01e686a89cee356ad53fcdf28aa03df3625ec7341135aab913f5f55da8bed7fbc3f7e4e4f3f5ae896d66d33c44776fd9ddb22cbe2b0e6edd1bb70a4ab8ea6137aef8eef4f6bdf25de4a2694e2fd750ebd661fb871fb8680a5c7717cbc18b7dbdfc336262aa7718cec5b6fb2e549ab9bef806b7eec5b7cd9d6ba1b1fdea85e5964533bf39ddeb9826728e876c9122a8cfb76260c7bd7bd35507efeed7898f575505d5ece5637233477251281b2bd7d7e7c33d1373bbb350af7c3b1efa72bbb334bef9a25aa8aae22cf466e2f6e52c647ff9d85ecc39a8aa1888fa541567f97210ea5e7c835bb3bcbe66a21177e51ceceddeebe51cdcc155f7d6acf6b1a266795cddbb8b0be53c0381bddd7bc19e585e7bbbf750756fd6e7bbc1ad629eea9eba37db43db1dfc1133316db1586ef31e8a69969781ebe6427ba82fdde2f9d6bd6a96e7958598edf13683e1ce7b1cb719c56d6e8bc17db310b3b8cd3db4ddf872e25e7f41ae1e71775e04e65efce9b6774ccc5d6b96b7eeac9e39e7a19cc562fc42b97b67f67231cdf25663f61abb4e75118a5673047ad5c45e2feede139a859865b5caafbadbddaf6f0c137babeef96ee6489c2e9ae65e04e631a2ee19a85bf66627be0ec463b9d7ee60cfc724f75d847271d7cd39d8cb695f8b9b88714cf5cc39d62c2f8891d7fa6e44f5356b15e8d32cd66cd806729d5e23cf1aed99a72b6eb30e1ac3b26e17408d6a30b8d3150f579db67b03d50ddc7db76ce63b88b5cab218a83b26ee5ec47785e260c01bdcb88af7cc6f705f35a79b7885ab56f12ad49c17519ef90da3ee5b9857dd62a26e599d6a9ee65f16a658788d1db742bed5c5bba9be3df36bcc0b187b984d57dc0ad1a91b5cdfa09a79d7170b45d10b850301ac0b35850096535f71ba6620cfe96dbbbe50586b1e3e70d134733ebc46ace6f40a575d4cf310c8d90c1c1b6a5e57102ede91057a5ee0a2b9988b50826deec15ccc4507bed22c14e2af36a7edbe7cb3abce3fe2e599a8fbcd2aabbb5a24b298c8c531d7dce7e33caffb66304c2cee1fbe5cd5b8e7f4ae2dceeaddfdaa7bb3176c87f5c6ba17ba6e7d7b616892db716f339a66bed70bc553356b7c7f5bfddd14af37739cd5ae8ba6b9cd7d2df276b76ddeea9a89c40dccedd6bdfab63bed45f6a62b56d56230a79d1b577cd7cd9ff47a19e5b96573ebf35ddcb7569edbdc81c5b6f3df567f97cb881703175f8e6fd7beac057cb7ab451ccc69d6d52ccf18cc190b4df5ed39d5bd9e79cfbcd733bfedee384c7720e69ae7350b7bc660cebf3447adbcc8d7ccd70dbc1008d1d2c2bab9cd43b1db128ba0bb739ed5dee5fa460e73c264ddc05eb0dd1d98c3aecfd7f7efaefade4cc43c0375baea1bc459bde98ad7cdf221b0c82fbff907957931e7303c0476fceb7cd558888d41dde62457cd5cd5baa86ff5dd3e14ea23458a40f99ed69b808f07db76078f1429d2eb759e7fbc17c459edb544220feebbf65a2211ed7bb7f748912257b3bcfcc358c3aec5b6ba78bd5e0fed63b9af1ba81683793572d1a7b52df6b4c5c3cbb593fac35ca79707f5458568be505cd538985b600bd66eb19ed79b879d63608a77fbbbf9b757271503b79ae6ce662010dffcbb4675dde98af3efc9e74bf3aa71ff6da78b6fbae276f7b578577cb9d7edf58c192cab3fac6a1cb6af70d5502b6e873dcdbcc8735bec4521175df7cd615abd5ce761eff85ee38a2f9a517da18657b8eafcbbe91ef64cdc9767ade6f6a638778e75bb57a1be3c13718bd9cbf1f5f5ad721f18ee77ab8b272cee61bf6b0ecbb74aebcb08d745796f379bdb305d849235f157e4b7dd9c67605e6f6e31bf685b4cafb1eb2b5c3518ee5cf7cbf3ee2a06ea7677ae872a5bdcc0cbf5cd6a31ddc4cbf5b00b312fdeacb2443c96efcabbac1ef236af623bb86f70ef96bdf872dd3376ddee612fe2be553e9657f429cdc0b5b8d7155fa37a391673ba63794d5b2c5c75af870e819bcd69de2aaa85c5c32a0a75103576ade2b518bc696e75114a6ed9ab597c7dbe9b875f3d3cec170c9887591cddfd1a5b1c7655558b5ddc71caf370d53988f635b76d1178f3b00bb946956531daf77adbcd759ad3a20ae443a01e8add4cdcc05edc4515b8eabbe2ab591ecf42799bfbaa6fb1bd616c535ebc5b5dbc9b875fbd9e8528d779d873181eb6fb42197f5b17ed36d6aef3bab9d215e761e79debb17c83fafa9e9eaca88a4080398953266e2f273023be551bdb5c74e01a3318e7b94d538c3af1e574037b458daf70d5394df156592497c8f5aa896dee39457d4e34139f585e755f71e7ebd6ed2ae6b86355c540d4894f5531b0975bfcabaaaaaaf231b9397b5db40371dbd70dc4777720be69d6410dcc2cbff812771bbcaa8a81175f62bb836deebabdc8ae3aa7bd1ec7c2ce73ba6aa16eb766790f1841358b6f9bc1da2dd60b06377ac138eef74630b86f1e76af3be4c6dc00aa59ec75d1cc1afb3566b08bc015c32dd76a905e2f77210ad4eaafc8de345f2d22bc2caf9be68ed7dc3170dd407ee4a2fcfaa882bde8bbf8f234e7f5519e75d72a5edbdcc732d66137cd7cb363f91a3358bb3b47d39cf95d739816f2e235aa6a691e0279af275c759b59aa1aacc636568f63aae3f794fc0fbb16a392c254ba1e837ad0c9698fe31e5ffe7b0cf977ea6113b4e3c1e398813b1e4a78ecd0f3ffdfee1d6d761c7738fdff4e47591b1dc7dfe970e05fb8ea9cdb602fee5eaa319b66e1aa81ed1692d34dc46deee1360773049ae720e650f2e4747338096f6eb10ddeee70f4d9e1207b15b779735d74876387e3ea1fe59a8703c627992234f5e5519f6f6a087a39eefc723cdc490592d222a5e45163fe4119d51fee9beb621de6a40914932617e549b588a2f398c8f5fd71e347cfbccd511cb4516b148c8bdb0c95c17466a176bf43a740dba42d06729de236af3c14cb7f04fa0bedfa7f9487deff477737343e4236e458f5bac10ad7b1cd7563c80d122acdff0eaa08028d760898f947a338bedc465ef7f569fec4b5ea22be74dd583973a72bccda2170d498dd21e0f48f66b13dccc4cdd7addd018350dfaa8bf88a5c34ebff8dfcee002e8f722dd68bbb0358f4802168f1a62b7e1ac4dbcc5ee34f0f79b1b87bd28306796a83c5709b9f9eb2764e41cc2fbf6cce6077f714ef9ce8a01c6c2d0e81f7f6e25e71961396616773ba73ba42af9adecc8b4eb6bb6543d03fca6dd041bb970d322e1b47a20dad4755550f796f0c13dbdd8138c883b9ed4ac283b965adfa9a816dee4ad7fd5b35315df76fd5442b1c39ac820c811d63ad5b0759b7b258232b66794fb86a6271cd42cc16302c40aad76655ddc0dcb2392dc0d663716e6bec6ac0a981a597e6b6cdc19cf686ff35aefebfc6d560041412ae1a6c47809efdcb2d0166f0ba7f3b02c608e8fa6f736f13e0f44d85fe3f73dc74e75127bea62f8f3af1197f4d63ff7a086cea6ada3121eaf5cc774c77b0988a7bb8cd3db1bc7e59d562d8cae4236e608f49ea3f5df76f2df6c4709b0ebb1663b2a95750efc2f0a8135fb6eaabde5d47585c24e7f60b4be3365b7124606b71988544b8ea21c79d5b0d3b9b83187b46201666d5ca6a0c17b950b8d55a752f65d922b702e62446ab9483adf808d88adbdc7758aa7b7d87093048003a021cdf4913cea4c94e809e00b6ffbf3406fd3f8d3bff34b8a6e1fb479d34015b71cba48993264c9ad0a0fa7f1abaffdd8c3effcf9b81e5533d83b79b81dbc978f38fa6ad1ef6b6d579d8d315df205b97dbf8dd54ff6458d9c9905a3730f355771b43600f6ee1e5c528b48b618698f750ec06f735fe9c621c63f8d03406d5ff7f008854dcf9dd51bb00c8fec1720fe0f8ff9b2b00253b2c808bf2fecbe90d06572de4ff1bf81d8c3bffbf833106a30b86d3ffff0b44ff2fcc84ed76f7c277897df782ea51a37a5fc078b4efd50522addfb930b3813b17c3473370e5dac515ba6b81685df1efb645762dfafcffb768f38fee5a1cff512066efaa7d2dae3e4df5efe21636ae715856f3d2a07f942359a293877db734bcb8b85b1a52dced023cabc596d53d876961bb836398d8e6602fb310f42d8b368f3af1b1bcc87b5998169fb0c082d9dcf67298c6622c7c3d1652ffbf6655c54316badd8a414576051cb1dd79feadf8b21657b0af6ece75ba5b71f5c3dd8abb1611810135989e1d9911585c715681bbdd316cb7f3fd6e47f5a813df0ef7ff3bacd7e6144cb79df7c6303183614cd4e98a81c09c847771b01e50773683f174d50da41a2b5d35985155f1975155714fd7e23e92ea9f4e893183ddf41ed1dd946ba77b74ef94dafca3dc98c16e27eacd8db901a50004d9da5c4a43fe95aeaae2aca43b99935d5ed2d8ff9af91e02c52e2fa98b29cd4952ff7c873488d540dd5b5cdc10ec90dafc231d39cfad70b7ec5db546eafa5ff30ee96655b8eaaf459707cc49726dd4de2e87050ca87bcf58fced723e15ef723f70663bef38b3b9c5217af4692d3a5db678d39c717a7041b63a0fa76487bbbb1ba2dfdd540c4cd7ddadf85169ce6d508fe574bd5ddd667cce6d707734c4ee88ec1f7d4a73985677474dfed1dd518d9d4d10fa948945ee94665ec4eced36d65be4b9e5d94ae0585df7e677f3ab5a59d9a254b5ef950b48e79a48d65c1df776b5345f5b45b688f4821ce10de969651d4162c44beb08c762b55e0d08d79835fe32717bf9eeeed7e7bb3d7ba1a9585e75f04092e6312d64471bd48b2c71037734385b55555646dc7539261a715755d51710ab2f2041233b1afbbc1ded6ab746cc35edfea37c372bc49bd1c9612ad0b89b1d1fb8debc9bf9b27633a7b0bd3b0bb558c5fceece3b689a772719b7b13bd97677523dba3b1f5d8b426e236b67d2f94733be3b93cba33bb32bb8f110988945cea51e75e2db993a60315d75a155efca3bbb92acb72bc77e573e402cfed2ad9e8569f1c735d0084c35667b695e8b3d1568ccc256e9d6850242d458cde2b103c790aa2a9693fda3ab0eee1d3976793b922aa797b72361ecce8ffcff8bdffd9d477d5555d96b2ca76b9174abcdb92bd5bd366776ac81de18184f8be75ed9117ff3b097ad2963f55599ae519f471b7d69e4e33fcd4695d19fff7f4647d4b7e6a198efb63bc8e88a118c471735f18bf02c3aa2b72b02cd7b8b863c9a2ebaa8a2428aee28e2a2afa221ffdf6ea06fd5424548688bd5a230119dff44c547c170d789a83ed17f1532a8b8ef2ab454618508d13ffa94b5da628e11d1c9ea8fc8002afa3ca1eac6eacdab1134774c05d9ff3f15bea7428a0a1b9ae62904fda3536049a7d0d1e2cc0f5571c8cc5e579dbd2e6a542f94aa668ec56e3ee4fb6ff37a88eadfd0a017cbebe5da100de857aa6e434754357485f656a751aaaac50cc1f8475be296c2cc3f2ab65729d897824a0ffa7f340a3a51b0eae6370fbfa258fa47b92eaebaf731abb1bc4271070a3228d847a180215cb5d3edba440a1d9165f52425c5a3c78ea011de5bdc75a178b9dd597dcdc4425c0ae9ff478fa4ea2ef4449f27b03cea5bf7cdedfe4ad5fd849227ee2554a8dd40422c10625f8c9054546e3117215b76c287ffae9f2e9413ef89e5d589a313514d04f1ff6826f2756b61bb75cb5eb1bc129be07263dd6b134a50308e9bd0fdeb98b8235c3513ecff3341f5cf84ed1f5d8b42e01270d0258ebc25ee7fd72d568bc2dcde36738ef3e5c255b32c56db1cb6ef16eb7777a01283c0d422d60d6e25e8f094187b75ef2e25ba949042d335dfdd95b0fd7f5e7983f4fc0f1293db410d24812887e5f58ae5614f824e8bd52230092c8f931882d9a7551b9d9028c422d1e67731bd3c246e448171dcdbbd7b03af3b02d1a7f8c8116dfed1bee6551389fa729dae78b7474439c2290377cb723decbc38ec4f3d1b9d6edf6b56b197ce883eb9dd4670415723ba8c7875efaecb8b3baff8a645c0f9018b2842ea57e4b7038940f46f6c35ff222210115830ef6379d54e445cfd13a1dbeb1083865f43e88b87f065551d826a085d5631173468af82e03c2a08cb7f2b68c83faa0b54682db64e81e0bc301097ffbf7b0d24f568e636d69d895708447773e98410b335502704054220f08f02b570abf8f2745571da6e603e928762dcd88129de2a58bbc5d22d308ebfc038eee9d69154f7fa0ed36c105daf62de0b422a887f6350f7bd02ea53ec0182c3a5d7330734bcea2d6601c1f8b5f867502e42c9ed1f3aa8135fefcf97ff3fecff9fab3f776fd60f22eca7cfa34e7c7edaf4d8dda67e30788e87c0b6c8e6b4a8b6b9af9a25167f3d158be535b746ace62319a8fb5e7b19b8e2b0145bf55455ffdadc05a6167fbdb83351f7de2e6e55cdbca7e29ceadc6e60aff356077bab629edb9d95aa9bf7786e3770d529ce6abae6debab530b7e99a538dd9aeb1c0382e92db9dc57fba978d98cd40ad66ad5b8be5b59766de67f87dae7e7d743f0cfae1cd0f5a7eb842d36cfc5d9fefeede73abfb9a2fefbaf5adbc1f60f830c8072e4f2a4e539e930f3e1fa8f814faffe77387cff1515fbb7d97b85bdf1e8af9f828e10303c8db33e8d13d64e89e239aeee9fafff7e9f6d8fe7bd0d30397ff07d36adf6b0f3e784082072e7c0c13c57230affb4650cdfcc6bad7add78bae4878f0e1bb3b0f543b08fa7ff41a71e73dac2df236ffcff558de61dd6040fc53559cb583921d7e7afafca37adabc9e313d4af45caef514d1410337e7f8ae37746873508700f2cc800a57dd7d97e321b0c82fd7c45ce4482e2a5c35be9c1b5bbce6dfda167fbd0c6c8bfbab2bddaaaafa4a751e258f3af1e571fa5e9e1cfae4d02687e37f0e4a5027be1ca4fe7bbdc53d877f3c7d7a78e0acc5606ef17cc1c38e87c57385e70e81c5dd712884c31d1cbee0300cd32aeeb13983f570a0c281c58502021cd3c26d1fd3e2ab26f6b8ce44bcae3982dd067b5c5315b98a891a985375ff88469e57adae5b43d6aca65b555542725b647bb9dd36b44183190c13815865892b4f67437f28a39adaa0800db6477151a87f44cc753aec5a2caf6d91bdbc3b83fe0eef0e19e6ddf101730ba5aaf8761cd4178a77878ae39ba6386b10ca6d64d6d8b3fad31db3443b5f50ded74c4cf3e5c4bb77b7a3e47fdbb109b3aac374cbe68e550ce439ab06417daf6398e53ca68a56bdaaaaafb13ce47888aae2ac1a86ff350ca9014607e627b9a5a110eac497d270a72db2bd4cc317220dec7f0edb340ca1e17e1d468f3af1f5d2141bc776cb0e391e0e559c5b2b282ba8aa2aab2e96e5e11b10a8748bafba57a7c7a34e7c6279ddc1756b07573de8cecf6086c5b99d618c378392ff2adf0c5233d89ec5c3bb1a91010f9ae6fc53719bbbaa835786b1e0be32483d9abbe6fbc69a6aa02e7ae962e821861e743124c9edced25a6359d558480ce90363b8a2530815cb6b9bb358cfbf16988bbc8ece17615b645b16d8dedde608f0171dfe11dccd6565cc0da41ba8834791672166b93183fd8adc981bb032e6068c198c8e6d8ea09fd3a63787cba34e7c602d26ce19b2380f7b3df33952e91c1b0c826028f6720430b0a8131feff5720a83d68fe9606ed99eaa6ab021c743ab2f76f7ccf190d5e22def6bd6401d0c1639ee38485f8b3b2b988ff036138b7cdd40dc6a55557db1acee2f7079a1eb1f15ae9a6b750f796e87fd85bb6676cb2924870ecf426191cbf9f2282fee36af5978f7663503af9373c5dbccb2bacbd1b9006715db69e797dbe83a8d5a31d0852facee2e0c85fa77f9ba39d6b9c082d59dd51d88db3be4784855d5d790e3618fd5fd4e1cb23863c4cdb318eec5e9faef0d3956791ca9ef716e6279edb1baf3ccb70a04e62439077b5c07871c0f69c3a04f3df3544dd5ddc253503b89e516a678f1eeb488896a91c3297407ed6b5e31b1cd2c1cb2ff9d16391c1fd82e3eb94f4e4e985c1e1c1cbfd3a2d7cf4b2caf56aa8ab3ac2ec7f70b0890b18da5aa18c8421f38a8131fc7bd9d1659f8823af1193358af671686695e8bbd9d16390b5b3b2db69bf735f336ab6ae656a95e41c9ff0ab7880a86805a853d2a60f97fd4f8bb3a15a8d0540518588cbf29f446cf7f1f0a8bfbc77bf3a64bf7c6f628570a7ad095e3a19114c852184b61c8a37d0b2f57d51460103130ffdca478e806cebfcecdd8ffa36ebe8838f72bc42b26ba41e0ffbd5e87421fd427965714c8fe1f45c197a6981b833addc4bb3b0f05aaff47e1bfdd6ddac06943411b2ad4e7bbbc6b75779fefaebc3630d034b329c46231ce86acdd6c94a0696e81abf6a55b69be6cae1e6575bf3c36babf9181586c4d218ec5d6c0f97f148b652edd1ad69781ed16e2ebda77796bae561f3177edbb2b6f8d4e8d2054b8aa215393deddf3f04ba706c60755bcb9d2144aa3e7d13458d250f534b6bda2e9d3b39a53346dd06041a304e55d13734703e3ff4f28f4e89ac170a7f3a8aa62609bd99e79d609ecff134f1872028c47cf08fa4757ac3bf3050fc5569d16f73d33e467a8cedc6bfc99b9f38ffe6eb7b162e04d579c875f66ccb058ccccf1df0631f72d333ecc6f2b65e6776f1e7ee9cad0f98eb7ca7ce9d978fbaa8b9419fee536cae87c41c670111f2e42c9b73501ce3f9adb4d34ae78f30b95e6140faf094754b86a62ee5b2648fda3ac1ef2dbf79a66225e6f1e7e99605b3551557925080ab255429b7ff429ab3f7c63ddabd34d33187013732f61ec0ad7dd8af112ba70567956774b460a3c348e61e24d73aac388b9eb54ff3250af995bf1ce734acc7dab0d1273d7418217aaafba885755d5576e8bdd2addb2eaab2e0264cc8ab3fa6b0c17a9aafaba50acfe22e6bed58346bc72dbd56663f1d74bb358c7c2ace674d5c4145b591539d70f6469312babad0b65cc606c116c6f22bdaaeaabadaafa0a6e3a6b91ec0bd9f09fec8a4cf7305e174221d489cfb8dbce731ac29d10c842187bd4892f84aedc86e0d4330f01843e2090f572cbf64018aa2a06e1ea1f04db8f1934a6cd98636f4c17eac437a6672e0691983ba8139f18b2e7acee3d2366c75027be166715286608cfbab799dd2d2bc6e9bf2dfec43ceac4a70ba3e73febc290a14e7c618eab268651f299ebc2383deac49781ed0e8241a4e7df58fcc9781d18332c16e33da2c62a10cc918873eff5ccc1f0bec7d50c5c31505b0dbb7ea097e656f39cf68ceabaad2e1410604ec2cb401c24af5a4d714ead70e4281ad5317ca12e545f75913062eeda2a0375db6595aed90a48668d5f7dd545326bec5ec4dcb778e69c98bbe63d62ee9af3b88ac3ac8258754dd4442e549ad3b5b8b170c769bab56eabbe6aa255ba45cc7d8b98bbeea57915dbbc2019a85b9d7aa084e7819397ae0395d74194ff57316e796d5ec58c18730355555fedeeac6e813c07e96399cbca0a881690b18df5ff355ee745d07b31e3c5d85bb1ca5ab547da9cb6395d7330b8b31077ad62dbca0a88968a8beb565f738bd9209d67a14e8d54550d391e923beebccd29ce43ac800073121e5cb77aba3ac191c389148e0d72f87fe26e831b1cff3fcd2d700325ba0d02f8b7fa02d26e213a0decfc3f9adb2ca681190d741a3890f6e096baf7afaaea6b775d1741afeb82a5eb5f36fe8a9ceb9b83c1aceb42a5eabe166f9adb9b7f464cd4757934cd4f46b5739cd5dbb1d3cae3d2a7cd418e795cbe3cfae474531d175f8a895d03358f0bd53f9a5ea3aa168345bea5cfffa3502ad67dc537b79b78a1567c8318987f37cd2cbbdbf4722cc6db4296d7bd650cd56d91fa7f94e7e1976e8bad78b93ea2cb40cfffbab5fee932f882738bbf32603b4e6f36a6ebc6d2657055dcd78859350f6f6ef1cdb76f2e5d0601a87da844ae2ff6991ce51442cec8c0880000000043130030282c188e874442a9ac0a1a9a071400086ba658944c9e0893244d71140462581102430000000000008020004f35b2d55c2067be45ffa273a9cce182395d85390d3756c25542fad3f1a922a59b0d82dc16c490994c63cd58f3abea61833b69f6b816e0361d60645c88ed907784a668378b98c2b086296856215b8bb5e6c8bb8a2558251683b96b13f3128f105474e422174963d3b611269d34d03d00477c871b148c48d08b06b580fce2672cb4f428a63b2a10f6e52fc4897e776b0e07f89c979c8c737b2fdbc2ac0f48d7e154d02b0bb31b31da63d8b6191e538788ecf6a574911d109169f0ffb82308663be4c84f4be2009fa036bf607be8b1d35f3c0061878933736788754f7bbaf04348005fdc573c8682fa29db99be6b10f650ac7dc75e8cf11a373078efa71a1400ac0b8ea44e20a27082ae91ec98e392f72e402a9c10c26b6aa096441db57a94b14ac1f80527e3cb7ffa3d235a9df20ac1872970bb06d0466651c3ee83a159440e1bffd0ffeb9fd8cda10193852021bae4d8b882ff7ca73f1d182d7ac07e5a19da4ae11cd7d9f611d479dd2df56c8870510cf618a256eb0c4492b9bee3cbdbf870703d03ce5d50b985f0063329ed15a4ffa90a031e008d932babfc950641838ee5e68890f84b0a6334568cd759e7142f03ee441dc29dc0a1154838da13e17dae7f2feec3308a2fe093c66c57b3970ccf740d7b95ac3f049810851809fbcee6a156840269401f8694d5d00851e3641c1d48ccefcf2c27961bb770c23c38a195ab8d43d74c10598d6a7807c1f2a9cba4cb7d9b0e0a96c46565c033a0647ec759f00b8992ca314f46fefee8eea3d3d12b1a88d1561349a8289013bc05e57e533897a1095b1398eca28d1f27b537e4a597d6a1234d37ffc5c42f4193e50425f7b9299a8bc235ad05dccebceae87d47daebbbfae837b7856f04423b38c169c713e25f0a61615571fbe4b38b20fd31fa9d173a0d33ad18bdc41f6fd1443814f8812fd630ac5f96e45b2fca89fd00ca94e74db0dd389c9b66359b59506519a8292ccddcf0e61664f1debe6e694582f8457d95714d12b3c9e7af9474116b21d1034b9d1b122ce93d3e1162ddb645e577902cf57b5e1d211ebff2f99549be7b52a30a8cb7ff24904b22a7e105b08cb1331123997da3d092fa2f40a201e9641e2ff24d214bb35b64da132853c8ed8cec746f5a581d91ab059a5eb1b34fcd4e3e87d57a917b2093df7680e55d27c5d53c0c5afa9bfe77f9d4bf047097be19126d708775c4723c9293f7cc40e206b84b7854c92b88fc4ce9a91ede50157ad50421241aeea3e40414f8623bb81661c9f874b5fb00c1a09090a8dd338c334c0ce79d481e989d7f3ebffe779b5365d19afb89ddc2d1cc314b36fb45fa328217833270ac31b14d09a392005ef90b38da91905fb7fa0ce904b732fd0ec7b771545b421d4712d931727715abc1934989a107301f35aea24ea6e9beea5f530d05af7cf46e1c9755e159a0e6c454e9d84be3c5dbe08b82559fa66e494104502f2c6cf1766690ca9461ced4d884de16fed65804b6739f01d3ffd90f5cfdc2a56e335a19ac42985c681af3643af36af9b584032103f268081ffabf3b8bf9cafc070a7c4f4db458fd8b30fb1dbc7473d386c69557e222362ee0902b52118adc0a39bba5a1d064ece39fa0f72a743bc4927ff6b5873fe42925af4143576ee3fc06c51d9d96ff490d344dee430893423ed8a50dd68dcf393063bcdb4255e3da43e76c1d42963c6f9231dba3d91f99357e1a1b2b61d108c6728484a5be35b4a6e47cf3eefa8be80b61a3876ba8e0ccc4292689da2277fe63036cd8f30acb0d229dbfd8d5a14b0a6e7f3e6c3386990600555232c872a6b569da6b4b43d5b3ccd2b9e06a425184ac84849ea36b839d07c6767534b010e2e396188024f9b59ac71703a1ccf990320a2a2bd75a75195a2764c266536a2c45d694cf6e10b9b0d7848c4a187fd7f6427710409f4a85ba2ec499d51ce96dc863a707ef1b888e882b6084c0696c96e8bcdc467c3f94c8f653ec61113d55307691e813807cb2fe6f66caa68076919481c0347e5ac1fad6118973228a79c8b8987dc02e2bc3d3d0d8bfea76b16e5caec2c8352a2c59a7f3e03ac1c212423a6136ad1c803a74257d00718ddec662a030cbd879c8a114c0a46ebe331c1ee0392e72ddb53c2319c939023c661de3df5f0056969efd23bc66f19afb80b9f680787fbcaf6d9c37e31b3a280c25deb3c959a24cd15a6189ad8fb86465442bf645a2826e957b6071971de862960810f9817d11f0bfa7041512b2a91f71f1548fa575a65522d437bce79fc5e5c3d4f6f99ab8e4e03d330e67a0dc4f0ad202e13be5822d47073bfae19a6befba9cadaee76e843f596b5539b83f16fbb389dc94c014360a8c6cca2ac94161bd4efe060dda43237047cd44b224ce7d3979f61c7b36d177eb05d07a14cfae90a2834a9324f07e7f0a0e092ee64ad9f9268387dcf9fb860118f50c47bc9f644df0a539f1cc0787587fdb929be0f4fe605fb1cca23927831023e6378a27cb7369a1c0d2e0770fed5be53b56942c111386c52544bfd2e814a5551c226ee266a8c58a188765cc6def18273c620f31d5f36b37a20e9953423340c6f7b315047d5045684e5b770ca33525a6c3808c5db1d392c6aa854c0e8d374fea2cd7126d3e96cb3b9944e4d81f77fac7a2adb65ef36d126cf6e33b70890fd0da15a6c79ba5380f44c93c25e6e20885a1eb8c1b7dcab5a329dc276986734047bf5ca1eb2bb307bb2c3eb3af2cd8003886f4c3e20de173cb54e1d1687cacd5e87705e02b2486b6ea949104b923707f2bb1ef86c852047b11a45b335b3b2cb8b108c5e24121d18d8846f9ae5d060e4720dd5a505708975c1f6a56146c8513d87187fbde62ca30a580c2e5c326d8883a64b622def1edf8529e39893e2fa4bb169023b737bbd968aa7d1dd74763dfea31e43378daf0630ad99d6e32e28fd7860478313d5f573f9b35fd6a79d2b2d3f6c5200205f715d0ea46980536a8d250280566c87962458822ba4fce3c525eb40b0357ccbe8331df86ade0039417a1f3fc49d0ef1303327c0b68c963dd59c6a4e47d2abcd2d0e6263cad2b5badfa983b8e98a25fb21ad79e245a9e9d3b1b708eecb60a69a6ef22976e865d1eee56077b7f1f68b8fe7b16605222f9e7a3da4261a180c88e0762dd204cfcb37117c88fab08190ad709018dbc24c3777f7bdefe6c22a15f9a5cd4b493a2d647e11ce419b96f1b7ddb2c7cbba57e0a31be2641bc9c5af9d6a286d960e29b2183c6c48f2714271a21eb552448b25017828ccb02dac4fc5e409e5355092c7b614772c05a3a365c30b1178f15409981f4cfc375dfdc7777386cece4ad722fe494c0a30f623e6286cc1d395b7334d9850ca63974006bec2d87af8e78cef03af173778b67fca19ce956c8240fb19bb2e06673dcc5db9881b172fa9cd6957ce77e424521dfcb20faad18bb493349b2f3cd4e32f05bba1e8c790c280382241a5b4f2d1fe402df8349d04ba46b9197281e2fb442d46e686bc428b44216b61f0b8cd48c2dd3cea046607de62a8a4e1d8d95d3a3537c5f07aa0f9a593201ef3c18861a9a44d6e6d1fdffe713912c42f04471603606e8e4d9e446b77bf891fd6bd7b4acb43e67f75af03ae435184098774d93a8745856c3a1ad6e18225d2401253aaf0b8c635de182085ec70ab8c2992b969661af87e158179d9ba6a06873b636149d3b3dec8404975f9b19c1ea8a84c807de20b85e979aa54f960361b7a2e7c226e8ee01ecb68d744532f791c79f90e3b46d4d73bb3818d481fcc782e7f592964006b93d45dd773d6b09c3e3e77a76b8aa65f76f17b812bcded9f155db7e6a480bbf503cc74226a7f941b50b9fa96326369101e86f47e32e83b8405989972666afedacde74e064944f39f1402738aa430d967925fd448674faa170f91218f3062570f95a7d9861164a5a0fccceb05e2e2ce0e3010a98c4c62444dff94a6919f3262b2ab3623f903f4e200a829d576c7b93e975da6bd4b6e84e48a0a4eac3b6026d55056a23cb89a09a4e10673c25a1f5cee8b7c77acbb1c5c9ab932d1b2a429449b59beaa33b85aef04019cd74f1b0708c0a91218874bf4e50b6628593c32f0de87d7d8654a786b9a94d29f1132ab8bbc4337a220e90f1785dce9cc77c21c6b5614038d80c14ee0458036cb4f55b1830ec4b25964cf5e6ccc5d699dd68e9b642e55d78ccd0364116dd7d657b85fa328c8a6bfcafcccfdb180cbc2733f9f5080bcb8ca9b5c200761a391683cefeb7a3b725c171c1bfe1228fb4da4a6d9ef6535f69d0bb2f726f02e7690d784b913c0e00b45ad6366e24633716ba6ea678272fac01316323f18c350303e7711945d008b10629b235bbe50bb0d6a5d85b054def2a812d30c2e572cbc049a910d6c7c638e2e8f077c6cac818241cca145523f2bf9c1e5b7c74b52b02fe8c37352c17dca2dacb3703ab660f28c5c6bdda772073253c42d57365ddcf114caae21a6969c1a22296530e7401079cc057060468c21d9bec534bca5b658d4cecc32cd762a5407386e9aece9519e85b7d85ced3675926e1466525f6b561c08b6425891feb9fe5885d4c4fbd223051ce20ac7d70f15720e25f480b69fe55a0e74d730c450e409a830bce64a932a4d491d8d1137039bcaec675678202bf430b873c133b720a0a6810ce2d19ec03524a314c581eed6d171ba01797e6c02fe8d892148593c3f982933991e8e11e2b16c3df0310d8104d190fbaecb49050ed62cf2d35c3d553dacaee1b47ba26f948780dfb5325412310112ad2b8c641ade0c13b423edc996d9d582a57fcc3c767fd9336260d00ac30280e8c9795bf9e53178e1d11171692fbf00e926f6b372e9810c771847f9bdd363d2f9bf48c1942d6d670442e4cc83d515416c48174bc4980fab13aeeb2807f7bd6e5f9adea1f2a337230ef87243f307f6bc55b7c1da39ceee3831d8c7bce1097db79b494b52a42d864453b3d0858d0b1d81627f5ff5b90fa9e82b5220d862a4d08ad27ca8c07f98783c2631b58e9b2c54ea46b82991ae3d7b773a5ac0bb6a06d98eb39460d5f6ed484be71f0c06d05177cee4b8430985a3d61ab177cfc18bc737c3b7b2c5be85733e07f2afd30b24e12f1104e771e04f01718e2b9827135edd67535d9c14d608d9310686725ceac3d6da1f7c1836baf00d272e9d849d195cfdbb43af0bce63256dc8b550745627e795d6a65867f968e20dc4a6c55e48fe6ade2775a8073342c37f17bf475b4f3cc9fe05ea08194647e813b471909f79f31534492221c85c3407c0006948591b142982f2c6363c3f4792d55744b7727556e37275c416fb0b79f3dfa6e4c5f548a85c2f2d6c7296d6e222e0499086c2d36c3a0a9e5c15269ea98c1a71255595c9ddda565f227127d2006a2633ffb3cc3ff3cfa8c1eb6639930d6032224bb7267db447d8c20395bb0a24672c4147e34bf6358ef2e63d2ddbf05206ce989b8ffe98f7c36a1cd19a9f2fe680ae3f19eb943e53b0e57be2d0a520eb7a26184a5c35916cd863f29ffd15fc5a47fb719e3912eab48ceca7053d02d6d75e2e77bacbb8ab563c2e8acb05b6abef959adc0f6a560beb54c94b8b0183d41a201534084b9e8592546d126e6009806e01cdc7a6c24d78ce8c879d9e23efe0f9b9e4117c2c73a955c11f869ae69bfb8116e26153f7124c4ead0a9f145f816ec6fda4866233c212d24d293edecc95cf1889b25d76abc04a8e07de34e09e980c72dc376f2142d29d7278291eae35a61590c08df6dc45045facdc4ed70dc9c0e60e3dfc72dc1542030e162a57b008f0da4b0d2a938d3803d59e14e43a9f599d66091e7eafa3d213a8f203808ed6d72d825335e359be2c8f380c16e6925867efba3104baf1cf01e8326b700043fe226b65ced3d1439be8052014bcc808480148ac0d8dace5caebbb14768c648fb6f94e5499d106e10c110b343b93cbbe002673ad911b66f925fd16b81771f1d8eaaaec855ee0485f28123de96d670db22586b2af53fed3891abf94eb2ce20e953056fbc6ad36186e82cc01042a49c57dd0fe22bcceb789ea9641abf66ce538b0fc8c7ad8d5a423afb20bc00eeb21e4769e8012a6c4a9b86d9755b03d632358b557003dfff4ef43645dd39039d3aa1227c85896a5b69d8cd0baefcf6c82028601bd514c3d42a80bdcea40bc229065ffe128f926469894197ff4fa129ef6c293040ffce3c5c3423535ffc3a190f1fe2d16fd355f09745f08fa3cb34ef90a03b5bd74828761dfbb6582e460b0101872a33b8b7d73e0f5a14903b706952aa9311ca1dacc80a9a1dabd39fe0d8f250d477aaee9baac01e69f7fa22229a0c6dcc5d050c63d2a8ad3a6b187cccae8dc1f94746e03606f6cb9c92773939f25246c00bd05fb41da0be764757d34d16eecc821ff098aea453553008abeb98c9804507c05e26337a15c2f6c438ff7ac7b9da646b887be80bc77c1895f7b64167dc631d09eb8ef139a4a0ad5929f279dcb5426d2203c1ca36c5a863cfdca02653de4d03f8fcf9c46520599843d18028cde3aa26dc2006026c389a42f5120b8977645ee6cf72b39ed98fe39d4643f507c60669ccea84288d25b18957a96d7a96ed9bf7c08e1ae066d7e2172f182341f5cdeb9990b40766d5ba0c5c542bcb3aa2123e19280f3911cc7f52f9d20409933cbfd64d6d6b8f02d6854d81fdf05b260eb04d3476b8e08db6cb6ee55353c4171e7dfcf5d0498c1f68312d9097a0343f738a319861d71ec2ae17385ad066758e5e1c3ac22eb08836040c668beeb82d59b6562d20d872d257f05371457ae8665106e02756c55d6012dfb362d8b2e3edf6c92502a23c384dffd54349edf9663dbc4679b8da608bda59cf637efb97f6095bedaf6d736284245ee392f36e29ea5565b37c30e7219d2fbce3911fa81e768c0eea02d71e71478b64111a04871160df900ecbf32b176f0cab1b9a5758402e8aa357a0d4ce40c6898196572cd8bf5be00a210ae710bd8110f0956654d343581e84b9077c0bfa27015913f3658d2b00c83df5195b4625dbbd6535f0931ff1415fb008537a653cd35d3434ec1c01ba84253060cef8377b78eaceb135c6d6163b97158da1be1a0c020be2dce4961cc77a564862d803651784ea11bbcec3e8acfc8a09cc123ca22d4a1e926ccbf8b6ad4602cd0311f530aecdddb1df16c6226c40050a2883fa7daedd0b5c04aa3bdf8800736e7b87c19151980338b4c33098b55a84b54ba392dc91abe2c2f57dc40a4234024e80022557a6f8274e50d373652e61563a4c0e0023b173af8c539db13397c5b8c9538de452d9673a7ad64ff7252f1bbcab2e13d4f83254bdee082b0e988ff9ad450ed08546516dc55fa3d7060ccffb0bc1e4db64a03bf14a94fa345d9e6814cf91d28621cdc7c2ce68e095586456705469735575fe2d99a7443fa8d430f6c2575a681d53145acc94b18b47b2e0c5b228303ebb33564b2ae0854996aebd375d9ce14d2f418bd5ee1d53ec71818bd64b13b07d21cbd941543db01f692f420e5cc4167af9df81cadc9a9261200e7ba8f3a6f010469b83b0d3b6a053c5a368d677e4d55e71d17ad87a272d8c88bbeec60c233a841eb3b5ceac8b24e6ee901969f8be478f48a479bc711850d963d11c59f7777936740529314012ab75183945cb50a796001a01470532772579d7a1472f4f736f1fba36ad068c01dbb46768d7429c1eb5739f38ce6f42dbe4c8ae085d3023e7a375fa1a5998c66c52aff346de1bf40f0e849cb77d08e90d998475ef839ddcab51b2b22a76c401899fc5ffd5a8cdff5681b742511967d1ff96cce4824795184374d41845ede40bbc0dbb12d5c4913f48e1068e6df069199d1dbe693183bacdb13043238ec04cbfb835f65fd12285d99646342f83122d172552ad1d60c6304138d4aab6f5eba6b5a4fbfae05eec3e1b73fe394af8d34b5ba36cb3a073547450593880d77f3329e93beeef4e973d526c588da9d605abe9aea7b18df1d5fffd786217dd4abb87cf8b558c37c210e606c010a493a130c059ed9b630810bed7a5dc3f374941d2a49d7ec5c120ebf8132141d6378fd1cbcfe103f8c1cc4d1713bb7f3562325373ff95cab9e6a46c95d453af840ca5d7375022f874adf1340000e1bf1205a0bf44d5c713647e80f6f0005bf5107631dd5b1d387d534dcfb7a62e5a0bb5b983279d5283939371813c05203d102fc1a2d62e27c235307cf1d8e85d0469b1c9a43711cc245632d9cc1dfa5e124cd50c04ed7f4f0da07e3f2865e94636bf62211ecc74d5dd7d7933f7ff7671e417061c4aa65d7b8a908ead644bcc21847f4c3abf4079d86718f5b80efb37e0ef53e28285d0e9dfb3e6690b72079bfcfc135a214744a60226226625fdbb29f0957d65aa527bbeb622b9ab801a703cefd4579da4ab07c56d5a00e5c95e050f2fe1b5ad851ca3ebf2dfb93402e109b657d5d2c3b6b9751613578d57de15f166b7ca0e8f2ac709562288e3b8c2434893fe74b18fbdcc9ce2a9f59c3726ac62ccb8f7f7766251921b26135fcc44aa522a766348d73d4d7008c6b553a79c4cb8cb6eab9810ecadb261b2b8cce037f18c52b34040a55d6846c60d1954eab0061d1a716ef5a71f56107a7e040ebd09fec79143344f53f140cbdef9676b384f1742ea0a727007ed0a8e52029b0ed6ecdfc5ea333666491269de9a2f7090139b11cf8a35869ab1ac30b1e186ec5c01f03f1196f08d2e9b4e4b769a703aa31f8ac740291a30a2705707838d69c49cde8e8a62bbf4425a3f8be05b2b43d5a159fa0ea37fb05c31ceeb06e85d578020a3dd047789feaf3a75fb6e1a8d0d97bc06c2b19b6bc1058a39c8489b975f06423ab5df3a910a49ec7aee581e78267809f22d6a63d87cea3a25ba48cded0904ad5cc31736c15538f85eaa091ba6f49311016e17e062fb88c62d16a53724cdaaaf21619dfe9c0b21a2be6176334e541fd281041bac1f92cd6652691816123ad1a2bd6f373cae9fb4b029bcf35d7294076b8e1050dec0b920af5f0cf1b10c53566255f897e1186f03aeda4c4c376eae6d066b1ce247c32a9519e73c9bbb2e2fba0fbf5a9502d5f4db3a9d65b99e41c1476847787a908cc3894751066a81017a046efe2a7b49a9c7209f591886499b45ef2aa7c382a6c5c2cb81817c67b7506c23e39f2c147336084b6e4c4d2569486e03424bdb06073aa79d930c98bd924498053ad4dc502fbb6c591d30b30d20f076ad1fcad76b9a999c22a2ef3c1a5eac2fbe044c326322fb8621b34a876491475dd05dd9a0490d74e0d7b1932c65ad3934ed651adf09964ae516a7ab52cc8d741b3c7a4b616766294f79958540f6cc567265f9735b9eede5159ee2858514f515ec571c6cdb999fd979c009538b4c1c10aa9334a3a0198731a314c94fc0618311b80be6ce6d2cae5dde382a2db518083b91a6fcb20d843dd4ee4694095b68d00e31317f5c069fcb7b8ff82158f149607f04419eaabe3b5c8921080469a2b50e8f1827df5c792cafb76fc7ccc9b7f98bd2bc198b150c06afc29e7c3ea0e34d67292e67ea8872920e67c97a67e78529c461755cdf29dd60cdd145fd6a8d20309fb66d6cc3defb9d37e23c586ca1f8790825a844af6a866fc913a2763640ee064c4f042cd19f8126993f296b03f75d1c95fd6ac4683cef13600ac16af3e591095c52e1f2badd3b1ef81360e4afcec6eca782c88e89faf9a10d7eb665011b2588c9a0d271e058bf81a02dcefad20a71e0aed63b45dd1174e29be2b059ead9896743abb051e6c0f6bac11c5f7703e88c03c5502d3c9d63da1d2f74042040ac74f057fcfbb4922f102887185cec1246073dc12049f998f5ffc5b617d0e783c515f962e568eca97d75533ee145ec4787b5b0b478745a58e54b3a58d867e7d8090e14d0e62e909ecb26cc576b3cc1a34f1be76972d4b65ec89fe452e75789358a09acb08b56289206bf39894fb1de47165cefd08fb8c33d7066271668844b1a54a9585b2cb364c60dc627dbeb4a6ae2ca660d6b82b338540b13e3a0c004e0da2ead5aa92021b8c09a2ae87614aa39305c5a195cc8cb7d4d1dd5461e79bf9d856a369cb8b8c44ca5bb5960e63d45a1175b79c6e53f765780e7be3ea214651956393ea1e9fae7d5ec40546b5d7bd2475ddf547cfb2712751a37f35933b4c3b802726693b5d43d04ab0e901fdb83c8fd434246cc2d2ca1b825e22daf44096d834a17969f2128a0c5525e6198b23d92af1934b565085195f9505fd64f62bd1919e247e6a7805084b96593b679df9a727dcf6b5c7af5f6801e639af357c10bceb5adcab0e7483c8ae29522ca6e019295b0377a644ee1abce872c718917dc94a1b246809fc7a77632d810ebc3e9dfb49f378d8cb2925840386a373563c55ceb7d3ebc7fbeca4be0c365786bbb56bd9ffd5cabcd9e8cd26edf065da0fd57677041d9c6e871a37c01e90a26f0ec71b1a71302a85006be1c553dee9eb16c6bd8b04631fd4ea8863141042eef2759a398e357ddfe2eca598a9ead6306725aed973eaff314ae48526069df7749590f3de5744e2be48edfd6bed4fcfa3919d4924da8e94216b53d8b73f1b93777c99bec97c8a9a004691081b91722fcb52e499efbebb5661035615f8559e7320b358dbd01379b47c1449524e9074d51e640db2aa66b1e5ed45eef98baf3efd295670ff1d4de9500ae8984bda4a527178cc6bbee47cfa2701e23124382ab057a56cb56afcab15ac093901b23a567271c61f5a64c3a52d5453c8107853bd66434d5d09355070777b83f6f103528d757d93a0546a63640702facd0975a64b4b0d28a4e4850178c01d94931df7eef1178fdd9f992f225a758667602c72febc7f601eeeab5f80dd404a3b0857836e43fdacdf17a8ed5df32a0013e670de7b14e5a2220cb7701ce8bc7fe364846ec2766cf29d38bd9d755e7555625e86fba836b951fd3bff8670e073420279f96f8fd151f15d69a2e3422d926f47302cac79cafc57af544fc1e79b09ae99b5e36189b0166db0605ceea898b4670533ca0adeeb79ef1307a6d48bb080176dab1de6040694fc7f36cbb3f7c9608d035e9b5772c3e0bd8506d495fcc7184b2008442b14b358c378782407cc4e928f09c9b49ca076e861ac5df988fa93db7f2e6b4f477ca014de53d91db06a04dba1797800d4c2aa8092682e13d77263503b449183fa23818d57deb23faf9eef5f146ad52bd8f4d005321af1ac89bd6d1aee9bd921101f844ddb80890714cc06af0abf308ea410a4e5a5d493191df466e9a6119b8f3f8311a7fd773562c7a8c20caa8abda409a69e5d9bc18e5175e147228c0f107ed75b26a24b0d598c16f5e8741677fb53b122235f8c1d43f5af83adb374d01d0f41627ba2e056f4901afeb8d5fa77cfff577761b15746759371d0560100b89f7f4063bf630248b8b0ade8dcf5f381403d24f633063dcded3741756251761b1b7c3549efb9ea4cb6e1e854d3ba182cf5bc160e7e546848fd7586150b7e9569cb8a98f8d938ce51dd97c1cb5d0ab552961e9d78bd92d1322b1d4376e4e9cdda9db00d2591784a099fe295f1fffbccb639f9a1a32545864ddb6cae6bec931237035542ffd28a5f6401d189d1d046d87d5c7a8359db287ff291605a763999997294c1215c93eb42cf2221c704fa5ce65b689765fd50fded6d7d592e8c3aa8105e7dc4a5537b2f98105ba25cd4d7e1ae2ab49281bdb03c4db55c0d93aa25d88c7597205561ea2b539f34a9cac10fe16328f33ae3b00f582c7206a2a7e96ec8c95c9b70d8386e7e815ce95dba7f428c882375548d6e0c612906b653d191f5569eec347ec9a0c9f69d077f66452980c4bea05ed2bf4a35201cb61dd1ca80f8494d691dd390d282186d6c00d9ada7cc9c40fa9a26ded81e1a9498935f92bd423bd9937559c501ef9c51a2383ac5d53c1419972f5c2feb17c3d23269141a12e50988c2ca87c46ed58afa7a7c6d5bcc9204e27cb5fba851259dfa1d4178781ea9de0b5f4020388341e900308fd76d2b1cbbaaea09caf0fe3721f4302575308bb06261e3d46c086ae9541dda0b95d33b231118fb5fc2e5ff5b7f5886a8b974ddd6ed2e77c4def0174f2d0d4e1b10106378436204dbf3e0c257c060fc520dbe72cc758a069bfe1c9adb4d97dcb12a15056dd2ae9e3fb2ef55902adc354f3ee1a0322cb3c765fb9317bd60a1bd64054e585296ee03c1e180d246611446961a46f704b772e8c7910d814a8ee189d0ac03d248fe0e28a31f05481983632d046fa61c2bea69a419301bb9b29769d6086a4741364f1d5a4ce8ad96f2665966d5ee5164f91fe6ddeedba34b5c7b7b5c66d30b4070494f23b8ee884b05a8636ad9580da60d48e4e2397f94156e0065263e9be40138606d8be3e54106c680a803255e3b15b616a85d75fdeb53601bbd16b37cd9af3f2a14090c997776ea7a980c4d8489af16f400b642f885a525cc83ede9fcda6208adde2c1ae45a30772c386c6fc8ebb586e3b8c72d9b9f95f6e3cedacf256aa1556930e5e5e33020184bd24954c731370acfdd6a6733f31f0b498f1f91b79c28c42131ee1166c1e39129b2b90262b817317bda3c32bf2413d6475cd419b0a88fa413b17106a5bb238718b16ed9aebae7045f362e0093996148b5ed07c9c8ca64b8ac89fd4d3d94b6a140d27ebb7bb9ea4002f8b4746f09ed49be9cb54a737fbff29485e29d9f735f6b6928472dec01b9a2162c324629327b6e0efb8f4ff24b9dc268d3be867308912afd92601501a1ac770ed9c2423816384b48bfc0702ba70536e69f819d38c57e26dd72489bbb8bd240872df714c026cb86944ec26aa1988da4ad0a102ee74e96689b04094fb1749fe072390a6ce1b3a50e30040ddc338f27f76cbb48619ddd3938408e0ca8bb360ddbde8636d5bc64e2eb67ad48f3d145960a7e65836c1a016e37b6a4ac3dab402c33bce7d21c69a36dd4c39e73e521266fe9c9b70d4ca624ea5861108226a90b03820bf51aa2174fdaec2bc83cd76e7bd4e3a8868a860e14f0be6a6cf99c2a5dbd4f3c41b420d6013fad5df55235eb74b17400ec0346b8d3740ca0f1dabbe022c03d5dd15f1c26a64f4329b730354262892f75fbe9afa1ddce9f688a46bf394cdd9eb691d46d1e318d79479ab04a046a166bef5374c404d6cdc06800a6223e45751b5f55706f45adfb52450372011e5a3a7f41891af5650d35259a0a2f28a2d727fb619b580b7ef18b4d67a79bc87cca4f78e4e7033f1f705c127da5ad794173710a9a5d15560ebefe21fe6df85d1903afdf389ad9042c220e7960ac57ddc9910923fdaaaafa6f9d01dd2d6507a2fadd6a3a373fdc696c9c8f07bf6765c9d352c4d35ec2adf7d78f0a55700865a0320c2c194af160af1fbbc95d9d4321fe01cf40d3687819fe4f6727f395eceed2100cad83d38afa010d4a5d052ee26440adec1221b3cc99ed28f82e1666a9a00f876b2d0f5ac39d0e7c27bb1e499e9d67721f0402bfda0bb1d42e9b74a6bd865c5ad3285c46cc2271908687951b1f1afd528f3619d4651704a39891c2f9617c09ee00850e9a3fba5b86fd7eef9b681997ae2a2cfd1d2d3c4730a55ba6e09befdd0e1f1224a37442243f1b9797fa7eb3058b51f2af0a3ce2462ba3e81c5197fce09698e19a4f498d60b612c5349bac487b698227decf65a6731f8ab5eca0e0039a84d04f318feb34947fa1b649f9a05d69c2afae260ec5d8ec430631f50fd3a69f24cf94fd2f283bb84f2754d825debc65277f5887f530881f7aaf79a424c89ca47760bc6359ad30ff949f543c83cb38c597fe80fb4ac1e7dcffac33cc32430169a4f27f1db03092516c9329b9b192946346a83ec70a9b7d821785a73151a30f551ad70f6bfe26d1aae7284822571f94d61826b3256b811a42603472eaa8153c33c3ac1d1d5a00a7254b9e24fe0208b0b295c0ba1a910f2cd4a5ccd8ab09036dbae2761b1b0dfc8f27ed027b66aa7998f63e750dcf05c9a6b4e8a03520a025b6bb0ba6dac7fa551ae762406f0e73b18520025e999b713d57d98f39ba9197fa418a331d7986489d65a1e2d5dd698a2272df4b56a4df010339e85863ac1a93f079d247fc5acb2016a785d60e0269b76351fb69e0d4cbcdffb858e0ad7590a9e91175ad8f64018cb12244cbcb13da0a58111c03f9f69d3eda9911e4c721803cf359880109d7cc657613383c988e7dfe226283882b649c42032f92cc3eb1ab2a49d639bc3717f42121244d99fb0c9ef244ddac88ba181b1f02deca951fb8a806feb0d2d994bd1fdcba1655383b1bc02c1089fd39aa2aec45834656f738c087a293dbe77cc4d83ac27762fd897f4779b6a94ad0400866515cb22ff21790b1d3fcbf61fc957f6b98792e9bd7e2c4f42bda80c105a4d294752b82980939347a0b1cc6089cc6aff522c5b730149265a07ab5c752de21b265229c8912752a9f9874f79e11eb81693b301641f2e021042b89440358fcc207a488e1df84732bc0da3993a18ceada1cc431c3060515e39b3dde98db3212ece4780daad2f8d8cc6e4946a018cb32e6746ba19a693a3706e08266e61e5d637351884ff7dcc5334a70f6a1f0d55494e8862fe4f8cb92d70bf950bde9aae91cc8f72322c0f973b9796cbde306278db393ede9d81ce743e04c700a62d38282c5d92204318ae1d52d09d5286d36e249c7bd84c120ee4d2774f75f8025da4a518a1c4366733a2d6886f778da3eda2e65cc8e31f4c352bfd03b3c53a9b2f20a6317da5c479c7f8912aebb9d61676c722beea256e77ca90f5289e70467ffb95186066f3635236a7be35e421fffd15cf863dba24810a8fb2b08158bb8cafde721972f3c3f16a846ef0ded8cf3410025e52cfbb5bb5142b0ff35a00d3a4532bd97a238df2a521f5f242da442d9aae3d5acdd2ee042807596cf3c46ece994558dee2d9bf33cdb0fa2b9a72d3d84c0c9e603c5bc5da398f12b13069d8d81f5d3879097b2440a33ba6fc71b2e7ebb59396d140e9c6b39512a2775a2935e2e081b9e98080b158928cd6b27ca947d0b9fe8ed39202a7f069ec33bd36b35414ebc4ccfdc29182220ee5e4e4750b0217698a85209425e0ac7c9503899ed8a13ecb30a7a5ef4102d9c8fdec34b23a3cd521aee974dbf0dc9653f6968997db3f0f360df44798ea2a39b69199170cdd226a3983525d8bf8d4a811b6556619428a04602721db07d6c5caa291dfaf4e1241ee1fbe42f84e6ac626c26c9744bc5b38c2b7cb8d2d5ee67afa6d9f3ca97348ea4b445802fc3bf281e16c00943235f0699b9fcd19e9d376730df96a60c00d451aa2c29c97d4f7318e9ec528cfeca3ebe7df0dc71f4c3954a90678af97c0fc1a137c9b50849e2a664b29a3eb3f3f6e67f4e8317e19f352cd560018fa18e418b8ac05e20031de4ace958ea9b3c2fe39e9fceb4b837c379e795d7d02614a614dced2d06ec4ed81d0b8fce59768e79cda34fd87cdfc6101fae3d8e193970d4d0b2d7cf600eb06aa9220d24b5af5b6504e5400072721c3c62d0eade17b702e816d3e668bfbe36c68c84e5da38f59fbdac52621641141051b3e9bde059f406b2c9499b169fb49cf3d4a27b25bad40016ddfc0e7e1df27e45614ffde750bd4aacafe0203a4dda21b2b317ff6380165873318e87289a5f49a7704aac53005f9da2923fd6bcd9506ba3cdd1f95eaa4a2c580be587a78a78ff06ac5f0dd6ee09daa03768646a8ed7531fce6fe54f6c57b2431aaace1a2c89e9a707e48de498b81f3a1d27c78d65210b7975931947ae4161816bf887688e89d19c7ca4496c9a3650277c4a7ad055126434e543b3a6e0f65019aaccea0be9654b92e18d5b1a4c386e4d14d85af12381bcdbd17ae6ccc8e062ea5be48f7fa2f45b1de9aad9520f666cdc0fe6606a21ec1a9908752cd3f3c5ddd0e37f1089097ed83cbf9ccebbfce835368bec34e732f7fe673fb78ba7f88ca1ba997e0db0af6cece23df82a8f3ea4c3e1cae1a3c3a2399a7717dcffad1fadd7c9bd9415883bde490bf512420fe1af415607ef022e57968a5500cfd80421efb77340c1c6bbc6cd6f37eace1c581d30191da1f271a174a36955179c0145e400feedaf4f7d4cb416be82fe4e37ee17872c73546c20bfe9b1e04f18f7da8b17d930489f5991937e2c3a59e680dabb677e5a0bfe77e0b133d44790d70f579bd09f41dfeffb14b1e969f8aaf31ce1c227fb1dfab817e0d63ff5f4243d7aa5ad449269034cf9e4482b9bbb45d6d49afc722657003547f57b32edb8afd72c753a0ba4dda7b27b7fe73f6a457706c594ebfee77ac6e661396dc48fc10abb49567d40c26b69d2c8d6cc7c95a6ef14ba7b0311aaa7f2ff6b30d9e716cc2cb352dccae74774b3cf147e2787306fe282862ab0e9d85721be8f1b98746cf58723d5f4bdf679a1823da5bb0179098aabf8c6df369ead412f8a780cf295b2ff8c32980163f325b4527db4fb6a288d44a89db4e4b38f8f93e2c062d34f0069e77ee30684340377687c93465573c5fc7746163874f97b25b0a4b832c689d5df597e9dd030882ffe376694a7fa3fb1b9f137fa04bd8851b08c7069a70f451994615adb4520b5932e12da00155c695397690fadd8a740ca5e188fca1290b0439daf3a5c16e10a700dfbf3b859a6b3c12bfdd170f644029fcf8049e4ee142d0d51023812e2b94ae1de8474c252597c6e1ddd4b4f4106ef6901ae53b9fa553c5297b15a9dacf5c008a8e8ebd71ab0a72d477deb57f3a97ce6be203bb6f3c01642d767e8f26fe1706c0bd9f192df7ca0e896c5bd9f9fc3d0f5552f8b3ed9d29eed8945194e0f370d01e80a3dccfec97a2c9fbf109082b7d03303532770e1d81d928fd6fb962fd2f7ef7e12fb6002911f6bfee2ff6bf744db0b07fc305f2c3fea3c7d69c8ae518ccad318cbbef9c2b6a576c7fb9b0886a4408d73b738db8f698dc99ddb6393b2c9711b8561e3bdba9dd9f7ee4c3e9008847b69f46edf316123473b8d8cdbb705fe8045d4dcc085f4c515fedeee8bc4a04fca049997177ae051e870b48f415b3f61af029d67914b18a42a9e464781dac6e15334f7387e25f68f2542bf687e227b2358de5b46e77304b4be28686f56289b078ab14500801817028d916fba1b79a3d1030e3dd456370d6df667ac0640617fe9944555c6513ee98587865d2a3b68bfa1b8ced831dc49e278284d6b16c7be1f678fa6ea8049d1bb7dea74e16a10fe2299ad616de09302b6763bb5b7e7998dfd26bac3753dea40bd03ff8ca297737afdc54f4a8148b20d4f4b9e8c69943d5abbd4d150096763d73a18f4066465cd038d9c007b77494777fe7398f2357301970e4f4879910c93c8478411efc901156747d67ec98d3e069f1bbcddbc50ec2caa3e9520101159be62e01b15bfd6e9c5b620ee0090494342f327ad7b029b8f70fe92b2ff7a7919a0bca6dc995391e39ee4e982400512f4d6119c562849c471cfcd6dc8148e34969fd3f3eb43efb4af3b30b5888b5fda709d3c348c64a606f2369f3fe08d0b1128cd5422da8790e927dd5725cbf77444ac2378153695e57c4b3b24560074cca6a01b2331b5e0b1cc4e700ebf43205d9c5dc1874be86ebbbab17f171c9d088765687170dce5c8125c2a14ea4330c2b9934e35d538b86944fec6a2a1b746ba15285335a26bffc3eddaac835e17f8080f1fd8946f8a67bf18458833f7a04199e491f6c83a0d4ceced02b967f377fa3c420065ddd0b99ffc0d82909c8f7e459b73e7c525c692355c57def13c0448c6d72c42a75f804842bbf3ea90228fdf9b2f8e2ba129f23dac427d4b46f0d5a6eb6abc0e14ca86ca1c889ce8057ab43c4b9964e942c02aa7f491ee4dc1fd88cbdda4e6d69f91391cb2bca3fb7d28e8cb875b8459ec7e88d9ab62418a9fb408ac210fa7206687205af627c5140b85410652008b0b6ab0bb7c98aa568de540e9562b3cd6cff4535f0376ccc79c2b0d3930d56d3da0c64a41e7f7d370f90fb080867602602e02b765b4d41db3756411c07051316e584e6eaf4ed070368a7e5b4c1dbb6201d1d0cc79a665b316253a4f1f4d6610a9aad04905a288cf058b0185346f4564ed881ab3e70f43470bfbc16209bd4c2745485c27751cec3da9f6b9a6d89e3932472218477a286d0c9eba52a7003451e0ff186774286c2d4fce6e5fb4502cf8cda6b8aad826e05a5ce4fb534d8d2058c840930132d4a6301753ea9468758d949c989f694e04d4d22a7f898e8631c5e703e2ccd4d36617c4ca5fd5064de1f4f0e3915c1fdaeeccbe10c1a3b88266a8d01ff28ef8730c3d498e95151741a1fa7ad4560aa07868f2692b7b3514c06c9084e69109ea4c3913a5b294757cb672bd4fd05645502a37164a096b7290b5e490111b80851a8c3133dd41af1efc473885ed6133f79cd60d50520d9cfe49aa320347feb8c845746c36ef807ebd7b5fc90bffb3a4417413a43ad6765ac4443dac5387d3d6b048ef04c0370540d43d6c07197f0038dcd8da8f0ba01c83ef7d786458840ceae519ba44bfdf140a207a4340053b0a9b43963439b8f926047bef71347375a7f2ae77e96362230309af7659331a50579c6e1734e661baae097a0bdef486b80d7e3d5cd5350b24c0eb02448368fbd10e4b8413b5c1d4b3804ebc9fb5512e24d10a739686ac2020fa0504edfc71c8b15ed6cc98743feb5b4255d8f2234f3967ed128a149e14542993478191b22bb2eee7b4f033fce69290695d1eb044b6b9982e98922a58dbe7a18cbc56cbadea456ac81d58f62c16768b517760b6e24addd4c7d39df2e152a6874e85415c25af8246bd062f4033c9b07170163d35a8c50b21246799a858a87699a566d4c9551b03ac64cb7e01193fcd4452006ed304b4f7e67c148abdd3a69dec0908da291909de56bb72d5153abca8ba55497625a6d05851935c624793799a49f86ee811062ed1ac1a6c2033867cd8bad6614e5944b5a9210eaf3c47a627fb4e4c466ae5585ee02c230e37943981201440aff36780458c45085eb1eaa26ce4c51587fa26a92d0791abb3cdedf11d21d90daac2d88424fec547db368f3fd8d2e2e370e54458b9c87673cfe569ad85c476989567e9711a28491de7759db16ed334556ee0342696881fcaf21b6ef393f1fc81fc99ad1622d9746b34a2e95d18ac76ed93008400ea21b02cab812956cea70128a7fb6952a5f61fb94f094da3ad53cb17185039f7c00c5a702820064edfb2f488b9ef19c809f596737989027b023661c47b06484c2073ad00356860007ddec5cc3543f56efcc0915282fde188a005943ea2bd6f39382d66774f656f54a8fc396661f5e6f800ca46782dbafe9a8f05d679b4d764edc314b6bd58cea3cb709449b81b0b680e0814412cb64e51ec1ef44e4ab6a42ca19adb0b7ad1e8debd47626a0814497b920d4086635e6f9427151fb85973c2734a68b36328bec71cbec32fe13ddfd106bbc87912d89280c017d8e99f5031f05fb1e15d24f53a05b8b5285d51a8e2a46f830b874df6230079399a238e319270c76355852f5c817921c3e0b561f88aee8559b9ffe662c4d8d4d098ca2187a2e9070d9d1a18a7a34584014f2c3dad9e856e418cdf9a351c80d443082ad9e595dde9871124457aa62d87db714ac2c151252fa25f40c1bddff09b9aac40cb6f0b6994a39c9c9880f09e5f0e566ea4c80364ee212a95bdac5592c28d341152fbab9b67665fcf676e6a44599321a5f49736d42dbf5f4c4257b4159be2584427dd28fb625638ccb673b47535de3b487947fd1b2256f6bb969bec8eb46079e4a10d94e4959b74fdd3fa7decbda290ea692e394eabc8c6a57ee44cc0230a4d3de12231c134d20746bc60a4f2146995e86c875217bac467c1da12d563e47bf63eb7cad8c9db10a4170156981f46ab98e8f36bbdf17e6f6954e885c10cdbea3fa57dfa57032e67b822be526c54e5942d013dab1407b8c4207b621733240e820a98a6e27ee7f8b6302eddd6b56dd5caaff03de811b8ff93c98e3a0039da522d0f98fea9d1d6533407532a115be411548fc872b1ef397567a3c6c924c019f025cb48ee2df3deb5aed2e49ba0f078b720696906bc547c7b4a8558c6d99b55938e14f66ad7b3721e8cf81b112f384ea1fc497187a12a51d27ffb29e433cac0506c3b2911d1d467379666fdf52e2e414d84fef211703d24cd56cf88932b70008ad9add28072896089b606b42331a10f25a822355394fef59985d5fd1f1fdc8c3da7d888a65551ab616051acf07e1ca0239522c0c6a996c900eeca0470192a741f9e38909263332d338e1345552689f5a81bb99b082cf78df4735c00c6e86db59e4c64c2c73b24e74798335dbcda04772878bb78b8ea6d797e28bbc3ec7bb00128b5bfc7a9508946c6f21966656fa70591887717954a3aadc5698c98814a91878032a418f4127292bf447ab969f316097009161f3addb8e14556f0de9aa07515ba295cf39dcde8a0da43b6d0fc515eb5a05515a2dc9d3abe3b9e9c2e9f08b9dee842ee2748a2c4859af3861b6964f0fe727e2b8d21da2ad52e0ee709e31c61ab8689fd38615ab0f0ee0853a70437c3ceff40b103d8281a5a3a76f25f15fd635427c880fb3eadafd39b8a5b2232a150fbf6b23de796afa95e4174c53e5e93c4aec7f3be2aa6441045ec1edd313b71ec7170b1f284e9fb010cb2d64727bf3506b43f09cdc913010dc96f9e75a9fa1594309868b821f8b9fe132b8de95218bcd0b10001da49d47d1db31a1f21bec43906f0d01dbf33e7c108a79287f3fd3c545a05e42f1dd77d353454b9e5cd4ba19b6b650cc882459fac25f5400d5b3680fcdee6c7793923d48008fb9089ee996c937b75fc31ba6c7f9f1968cec306e07db5b060d4dcba84f2876e9353e60d5793253c8422703981ef5dda485c44042af4906a313d00c27570d933b1866ca133f08f8b22d3b4f1b10a69bba7ae61580c09809710be34b34eaac8cd6cb6f35ccc421ccb118765eaa5470c5a077711f4a71a53ca68744f8dc7417a618b550074b98ee75c4d3823d05f866591a434159ad98e59a740713049ccc736d70e02d6fa404a997ea9f4e3b0360670aa6e8853a8e255db36ae32a7089fd5e2ca77ade085c72552c1659ddfcc2faba7c56405ffaf3ed46346fcba5103571f1ed88738067698aba526159c244c4f2830be7af24048a23bd7a4efc93ef7fcad24d4d1d740425e90d67bd9ddb9fdb27e69ed2527bb07e6972b6df5c19f5806338b5f59be29bc95cd83e64ee6b7abb71ceaf9228e7afdc54c79c1ee0ce58ac229b996f9c5aac08d2d1ff31569e2afdfad85f2dce1b40e39eb6b787889785fafe365bbdc5ef0f41227356c85cdccc35a9c78c9acccdb10122190e6cd2eb6e1c5e6411bad7a401c3808133c29622cf742aca8a2bf0e0fd83e0bf29105b3a4825511122797ba08bf7b4c120fa67ec3f8148c4108f6d9bc5d524862c4dc30f963b0adf23cbdcaae057d910f3c4575dc2cdcc1c2eebc9ba54eecfe3c23c96457e1fb9e15d3684f32b6ab83bbc5052222ff7d42b1914cc41b0dafc9fa959fa36967bbec6bde80a833d3a7de96dd3fe5bd8d98d320bae0a8816d666283488dcd5fbcfb36dfffc589ec8c656e57e9914809c2f81b1e445af970943274c563bda592f073d6d14fb33f1e522f9ec46ea428dcd654e5ad450ff7681cd2cd9540e762d7845310f05492ff06f94fe45297f9e037b64bc57a26991e6584fa110887cd3b8be33b6b1227383e5f5ff56a4206d77be2703bdb87b2d05c625644f76f4613d57ee5a6980bbc5f23fc1cb2ed93504d787fdb93db95a1e85dd94c83d8d8528c1f482a5411d6654444064972b2ffd81c87959b0994bb45ff968e8eaffc26c3f37e64fec26597f1eaf3fe4c07ceeb1e70b83f75a9b9f569feedb0abb0133d8445ece0f03cab60429bdb4ea7774816ab9f576c783179f69b9fae506e4e938e16f4ba91331b1a2cebd7a5fa7cf35e0d1cc6b9544f784545d2d3ff64354ccfa5913ef67b50462ea27773d0becf12bdc50538e9af57caac260e1c20fc56f84615ca50c35aae2c381ab371f2de21ae147bd5e6195e0af35963f81d26bdd00dc8721c8df11f8778ceefe3029c95f44b2e93cf6a58c7faa216d5c22355d93f1587f3d5e5c35b9bf48d145f305eb6a67d6b608256ca1bf55c67ff5bb23d1d05afcc4564726f79f041bffa19935dacb1a9478809c4468716986ded2ac487a6ed9f9737449c93d918d7616bcf83900e63b54c872a133edcc345cce730e00997356d5caef5832e69dca3c147eb22d4dfd7d42e6bfd6880fe7dba751e176f58183e27627bc39ec1a656b964a96e34273eb2917f4392e5f650caa4c0b8d13acb2a21a091e9ed5727ba2f54b7652a6f6c9ca47b91d003eaa9ee6cbf7543196c0946cf0b8ddb6df8391e27c53dfd039e97b95921cbc06bb4610fb9af00ca4fcdaef7e0b3acdc0c8f50fb9b6286cf0ba27c184aa0d265f76d2734e0ce0d5c5a87b5b36a13143c2d25f3adfb232c96674a74f343837ceb334fd3078d7318837ae347cc2d19bf65ee6e60c5b36996fe6e03353b27429379e50a58cc7e16ae6ac998ccf729eb9564ede77dcceb8e527e74bee32d79a9e38df4adac1e19f1b54c6fc41d6207b4a6cea4ab2e34dc9167141fa2fc9b6c7535b56297ca78e33a9f8be91938c596792bfe72e332c3df1ef7191d9d64fd6279cce7cab26f36d6e67cc92c9fd357799b1664d085aad3b89df71f7991d011e4ac96f9290e279988d376c6222f61f8be0033980b53c2623aea315fdfae2df113ff8b8fb9e8e3f2c2acf83083ce71f1c4edbff2b6f415364fd7417e24d0ea0e50e51be5776020dc841f3e1cc0782c98434fa9cfed436afad9dba068987f8260d503094fe8d45cc2e4477b45d36b318766f33e54e95930de837851e19df9fc1f5c7ef4e6bfbc3b9dccd1d9c0b09ba982efa4e57bbdccb15d87f417fd10b741d8e06b91f74fceff4b820a103d7efef22bebd4eeb7709e99a02a64b001f03589e69a866ad8f7fd181ff75382e17cffea7bf493ae4e59894b21416d4f4af0d2b1078393ede4cabe5e74a2ce04eb5e5f5b2b80680bfaef708bce8efbd8481cecaf4fd37cc4488c238384198403475642610b5fa1f896dcf0f6881b50ba1fb5e536872a34a802a04bc9b89af81edf90dbda6f98e14919ed28748b592ccaee4348b3c46d08dcc8574ce61a13ff0e17dc5233a19ccc498fe0e1f0e1f88597ba189e6c438bcd1d7f03ddaea836a1e4ca8791038596f50c06f11bbf693099cdde5af1c21260d6e1d32bcc1ffd3bf2db3cfb08bcb5efc21d0f3e00ee36a5221e1124f21e46ff6f3a6e9b207e0db23081c792f14ef0632f797d098e7761f49fc5ba4ed5ef044f570044dbdf7477f8197ae76ced06e9a871740e6b8f743e87c342158ba4e1e0d3fb2cf7495d3988636b98be7b057a84e13b15991e44b70f2e72da9fdf37885833f79b82388bb06f7a1d29c04767f6104e54719147229e262cc9351137ff72fdfab3597707853fb3e7bc49eb3bfa049aaff56dc95ce527900ce1f7f8f48e58b71e5723e273cd0b43cdcb3f7cf05275962ecd97c8271967a96ec7f8661b49efe1afb7a5efc7778896bf363b00bfef07331f6384f55e663a0acdd297eeb27eb449814713c47099fa47ba8461509523319c417f0e7a045da0fe3b97605878442611f8f6392da47b093f4d17c81f776473d76e5fcc5a34f52301173bc5a71ac2f8b80d530499b65904c3fc1da558422712fe5d1896764cd96f38e7d7348b5e4e63192d08db4fd457a61cf2ada8f24bd430540aa017482998425fcf300ea39764ba917ce86f59177387ae8a9ee797cf2fb690a9780d95da9bfa4d4907723da6347f03ecb8d3747b9ac826814763c7059428fa193680a669d120356dfbd6b3c3543e16068e20fb4ff6f65384ad665fbbdebe551c71c5406fec4fc39a6c2afadfda298a8817732bf24d1844750456916c16c45588745fe63c2e36dc75406e90b341c8fcc69484e02e5284fcc407342f48ec7a1d70ea2e75524c2cc04f528aa10c79b921f578d94f07af66a7b19e1caa8d2f220560d4877422d5997a14dff13e4dff38d3bfa97e4bd01e1a6020293c59519680ecb4f4323d86f9da889b04c08bbac6ef5b54f283f711ee8d7a27831201e90d013f7f8e399c8eb03112f3cf671719dbd6f503bf6bdb4f18c0770fd9cf848d03730ba763783780076119592dc3163508dac108b4d333f8a3e7d4455c24116a8e118d922776c64c0e37b12969a3eea60a28911e7d18b189c44562412f67d42350a280e4b40fc3d12f1f8d1883ab7c2b99570bf91a3645501c9bb5d8224f51e9b634b72d0e1b47f6cd1dac1c35efc49257b065fa260453c3f6220afec92c2a229eb46cb66685ccde21922b144d9524656093cddf7689f6891548a66c4ab6d2116f31b2148c8104525a083116b204931eead915aa97328461fcea9d3477a56347897b1d84ae4cde35104c3312761dc66eaee7d81019322f5fda80d4aea14ef6585e7fee7318fc1651c41179ee2bf73810f994bbd0986ebaeddc3351b28e143057fda44878fee6002fff15cf823ba9a6514e94ec84b45c1600a12fff1d0e3cf6491fa146e269e1ef1adfb1962cde6b5b84c2fc0a887bbf0a22af2018ee38755d939e797cfc3aa674a49373055d7b64415eef4e41219306ccc993e12f9e48c431cfaf91440cd8aae143e393a1032c567c21545b41a036dbc68d9de7c92be539a1ca8eee051e158b7a9805d0c9746ed8a47982415aca24f32553c1bb02a0884ec6b1c76e8e8c730a9bb0c3fddbc27d1aedfc881b736bc6e0b1fbd2d0c6fa40f05a9a8fe0d67e2004dcb19d0a8f3598c550b4e5ba2f38aa3e927714bc8cf7ad2af0244c420c83ce17a6e4497713596623861f150518e9ea5a51daee644ec828480b4941d20936bb3520779d7959f8cc4d2a2223a400277709240b677b762401dc1b1ccd49ea3d1982beded9e7dd7afb2cf1d902e8a58e15c3a42e8e8f149899076cad161383f1e0391644509c48bd55b9a8a215c35bc58c39c549cce95c4636b617c543b3e60a68457241f9c3ca1d95a738b06ae6d151d02bb93486af3cabd330aa0b01817a49e80d080b799f7ebbca0960ca8af3d9079a45af49dd616150c70a3a9f9187d618e0da99838fa67dae06cadb56c35a1e6ca19850605137a0dd425a7454559ef445dbc9f5b7a879582434bdf60ea73c94f6dec5c7674a8428598f9a12a12fdb2296f131a905b92093579df34652f5064a89e4da22db392d85e527240ee8773dc512d82399b65c17b8d9d954350d4cd9e0dfac9eb9101a23d817077b6b6a35a4e3e78f482b98278bb0a3a91484cb9ce32478330d93635198ab6c435284a5a0cd69282623839c29b5fa11ba6702fca1b10186388c82f27c48d384f28f0ff1fdc81411917c81bd6a90b417822615f01d1f92d15ef400d6dd318627d911f8b8c1292243ef88397a9d1848a623c87363fa52bf454348e17ec2af385b2415f5b81441b29d263734552122553142ac516f32e89132a0a8c3182c94aa50eaaaed88b4d6a4924456d7382784145d4aa25090caa05109fb99ac1102fac08026f89f4b18564cac26c0a01bc58f49491243ef82347b454c7108f9ed0868d7c6b4e4a638584c061aa00e467e488837a8e98eb890db1fdd54f06fff02b6cc084dae479ded34708b0ab0c44f6e4bd8cd4f702d48500216566e2a32394614f9dd6e4801fff418e8c2c999247cb0b49d022a2f2b157215160512180f8f06b185bb8b426cebd09668c21e22ff94dc03aed43964220301d053053c811864e73244e150b6805c55a49e25d151c598d285ca4c27216920287a902103f2b416e6aa1145107b8f2a10ac5680bdffc08dd186814350fe4c68fd8212b70bf063e605bd8805d2d8527821dff88fc19ee275a5e5e144022382c27c0f65febf1e4e927272489ae428a9fe56178b6e6d47c05b5be176f6275fea374defeafe4b2f2f9c66bc3a64d518e19bf709a429bfe53182f58c9c132e98bbdadef5599757f2de8f2f489d8e4b9a9eee97d73838adeea4e7978402523a842c2040b93d314daf4bfa0d9edd9a925ee3ddb7e65e8b4296cfd567c5f59728b72ace8e5f31434b14e2b375e6f26a6fc058515b6614a2dbf22f66eb8678daccfaacf3cb7eef8efcdeee5c76a266edcc29c5f7e487de558d1cb578dba15ff49ad9f0b5b56cddf4ec69aad6856e116d6fc9229a4ee0f7a76f3bbe20de67dfbddccd8b266fe4632e67c25aaa4df867f726b8f05d7abe5b79761c97c7118b3cc80e90d2903dbdb68266f281bf77552d597c96919e7cbd2a62bd3741fa8ae4bbfb4aa8f7bbbd48ad77f30916a1c70bd30c078240043b0ccc651524cb0f02097c489f78e3759652f58579a37e5e8d8f46d0650974aff4d18dd9b74da6d5af76c3c09303cfeb0ee02aac5d1919b166f79c78bc8e2eb3df675a92b5bf1b1df8414985efec23b3d3e2283ad625d01f97d52d493d9a9195fb0da06aa7b39f5f13a095471c00bd5e631e82b48af8b1b60f2ce58e53fc64c8725ab7fb4fb52d61b537509f4fc18aef4cf30eab2f87a8f17acb641eacafc9f70eb76a701932bf32bf419b3ae95acfaf882d41eb4fe98f8117b74c37580294ce92a50a20b381d11d18bc9d106505d10bac8a4c2e002c8c471f0710de4c53b183a0fc4e21fccce01b1f10ee68e80f2981bac0f5d02fde5a491a50b93a23c289d97afec8102d53e28dd615a17ee960d544d8fe9208b56ff20c16a0f3a3401ea7ab1ea8f7f99d23af48c09b9072864e23b483d99fe2fecbad719133fe2aeabe2f51f4ca49a835fa8328f42df91dc7515919e81bd63d935a20a1d1a03b91b69cafaf6588de4205d8ad4f7082e4b59c9aa7f14fa75163712ea80d514e3c665d2e63d85f6a60bba8e65d9bc01f10dc7c6590b4891e063d377634c6a93592681bd831cd57bc2bd0e4e1048e18e8a4414a08ca386e4485bfc4735b45a48fd4b18930b4b2aa9c78e5c3a4db10dcf298e37acc0609dfc93da732bc7dd31f7d5faf3cfac6cc7abca3e5f1f44652a4fa22dd7def8cfe67f054fef9b9854bc863db96c2a12777d89f45c3de0339bff959e572fe372eddbffc68c0dabcc7eb63e64b55436fd2f583ce7b11f8daccfaae737ace5b3f0f38a6b3e59e1c4704535bf176f6273f698e21bbf153ab77c5a5e611ba6d4f2438a9a4f3595d4fd675aaf0e9f30553f9678db6b37b7387b92825bdf95dd569eda5ac73e8eceda772a679e5b17a27aca9aff0b5bd618be6964aa95e36e447fcccff474dd1955676dc73fb186c7d267d5f31b33b1c9bdaff25a757987ab87274e7573d7b2e3b59237b66195af7fcde239dffedaf6bca8d9f5f90215d8f8abf8bcbee09676ccf885d31475314e2b1f569a8a297fa1b42237f62cba5f2fbcb50d536ec9e3f4b6318f59aafaa4cde0676b792d7f543bbd3d1143fa7261a57598720b4f2972e3b7a2dbea67628dd608050d45aa01c12197e78f64a41db0053204b530b9a95ba4dc130051976279fd6d7d637582861736a188dba3f4e05ea0e05f2829d844286ff52225f62d469f6d4c97ca0681b83aeda81a5170b50db874758f15abf24195aefef82e4a53efcca36c64e1d41da0de9946ddf82f936689953fb698075d5cdd47bc5d6ae56b3fbabb522cbdd6a3df97623a329176d3eee17feec889e8baf10943d221e084f475263338dd8d2fcfb64be782dee2c588ac361861d92a0d054def8b9b4c7bb873c6b0d7fa06cd9129e4ea6e6374b1b466bb9dafdb7f9002250fc6c78ccc65695ccae326d6f610d7adab33a7154b86b53f8e3346c5796c76fa7245bcd94915a03fc311749dd0652b3f1a17fc951a25ae59efc1127e07b9c241bbb6a88641ca553688a0ac3eee430887548a9c727fb070aae1106ca20c6163ba96b986f4a40c78e63e1d4a546588436bb683eacce0a69605ac6f8ccc6c822d99d0ff11c3b4f48d6c9ffd5f0e800b7cb9425bf5c2800e39eb436fd00b8dd0130720a87577187dcbf35da3a47368b7ef4f271ffbf85e1601eff71b3feb4f97e13355751395d9802ee58e2a9968417c5a3ec24af4080727acf3e74d97e7ceb98bccfe67b887fb8c46efd32eedc803a6acd7cda6f3b94c22135045e1062129607636db09e70cde9479a6e11e4019fece655c3be635dc14e8b81ea629e03e16b8aff55ba05b23ee3351d215e862d6106dd0fd4fb265706da724a5466e5f5e489b8cd2586d298a0016523e7d536c4c260657798d0f1005e44f27cd2e528332ae023a7e200a6e4c714269033ae18a350104dd70c8ec129069a2c1b5ab14792043620dcf47bb80768f960bf446c07a19da565108bd8b838ef359589b32b8da3f9add3d6d1d1e239687162747690f5510ac7b5d7be8668ee275374bc3a8e96cfc7da4aa815c33da83f75c4e357862e7ce8b587ca5a49ada8026ffe61e64fa4fa043b8141f2208394a7f8c7b52082f0d45a4d7708703e0cc05c225cbdf705a092e3d28218acb6e9bd32f4cec742c22984353ad1c382c3769bd785dbfbf71f7d913e722f1552d6ed8b9da418ab31760e6aaf9a79028c3b37eabbae1e16a4571a8b00772027c7692cc8a5e746a677091323f607d54bd06f767cbf0dbc6027594f81b5d6e14f3ce2eaa016afd56ac88df0e9612a1f2dc5520d32a0cdd95b4bafbb81ab6f52ee3e8507deeb97402d09fbb377cc9ff9f703f4e396bf3e12563ff20cf27d8cc45280ae076fb4e8f1945949c1a38bc843d9349d1123b902cc66e57a691fc150495a32072b19857b224a2497422a6ca8d2da6342d0913ec9f1405c22f682a94bff95a153824daede1e60ca68586522834ce318d4855c48de7cd14044271350114bd8f34c8c1998de06d4101d5ec90073562da3fcf8aef6338754544ac25aadc7e81534c28e56a1411e5204e587fa72a78f0f134429c658f24028f426a67a972f270a49028602b81e82f44d8606cb7cb4fd635c9f402556241d06ca08b32c06f97a1a3d73e60342711eb804942eb5a7c1b16bdb00d67ea290aa5628626083c8ee7d45fdec351038b08feea4b6520f4b397aa3c303baf28850da6acc4ff9688b545fad25060da624e700c3fb16dfd2afadfd179808d32d80f1d70f2aa33afc0b1e481c81310e632a69ab2a37c7cd0ac43e602b451684deb873aeeb9cf46ac5e96140683145ffb9840ac0c8ecb3d932f7ee0f52abe225c2f163d878db78918eb98c7ca495400fe7523cc68de1787dba1c361cbf49671930db1675b85599e04e0a8ec622a79e1300a2b031cfc3ba7548eeb22c23e7bf4b6b935baabb6a6eb5a9fb2cbf6e273baf4910e26d830103ebf67179858c584c7e342c7971c7a76fc9243a30dfb93424a750a216a05b2c66f942a48c1fb964736dd7ba94f2bbb220949778150dbe6ec950e50bac6e09f3627c9bf9f368a4f9929c0255ac7cb553a31da442d5bf2792eb2d0cbddf113cde8440b3d8a8778660f40932911c09e73d7d724b72494874aa9ea3d4d649a38b7418cf3a56569ce152dc22c37f44931bf526b50102a89d8e051103f910893d2153c25e7821e6b87e528df9421621ddf58ec0915b24fd3891ba5657cd85ed0a77366906f72322b75bd99250b986ff498ae80c4bb242b9e2f564b74bcd5608afd45d92593ec2408851035f8946e112b03ad2aa5ea885c866b0e2176eacb2b0a39c5695ca3e90b5190527228484253f31fcca18749f0b945295139e9f3d44b21c200366c45d4e3a41b8c9279b819848c03c23a9ad125bade30d6d50180b81a1fd4d80e00604141687c4b16ed4b9d9eb157564d45d32c3b00742200da0e3da2bc986131cb4e7108409efa6922e711588bc6b6330eea13ea3618caba3ff51a6eeb074b9365244ba83f4450d631308c297653ca7959a9276372c3957eb0bcff83de6530a86287a5a6c3c82497f80dbf886f5455e3bfa0f01995787fbac327985e6aa08d05e9ffa70876c8bc07d1b13a881e7b0cd67d13691ec5964c5b52b32e713e17c48016e647200906dd72f29d3da974feed5c8a8261d81b53735e29330a69f2b1483087a34fa10249f21a7e74083bc929dfa54164e2b44a91e28315b84525550ad8921bb45475749568c3b7152118265dace7b9dfe307538ba26d3a6e9ac41595e7e7a650a288347645a8fcc4d0ca3cadc02ab2948f239d21e79c79315cbd6b27b29b76395bcc4c8c8caa9685a186205a73f0e0514a82b20a5d4e2eb0509ca64da27fbe79035900d38203ec22bbb60f217ddfc5d0fe9799bf0062e5051185ae68b4416d39c8cf9e3fa003da846d87e682ecfd2df7c8c24bf7a665a12d5a49d2102956910a0407eb408b7883b1a4e9fa7694544ff7ebe47b06c59f00cf9b3136ae3bad99b0455a59b1aa7a119e7a3e956683a922c8c3b1a6b3d4b2b003f46ca735b3f7141fda716ae4c1cfa5d2944add084397b6bcaa084465080ce04cc55fd3d9bdeb54b3b08e7cb7eba19bf6e01148c67a512ed6b317e559bf6f5704900b9fab9926f8a60cadb25290635b542704906210cc0970527c2278ead7ab14e01b33392f362cc28c640b391222b9cd34ff89e0e4d41df2c55d3509cb46af24f70217c3530819f5e6cc8ae10e0d4449423653751a12e8b373bd00f3e85852777fbe5733fedb9941effb65861c33b9b714aa0be48c4ee8ba3a88b7a02e9d8ce85a9aeff1ec6c84ec9c73668da74f4412c116c4306703644141bd84e8dfdfeb3984c22ea588aeafb1febfcd347015513cb23a317bfaf8a9c028ac909f3184738d91bbeb9ce95bf36357f04ee5bcf2bf756b067900ae75a232b0811af3b324882e2c412cac03adbecd6e6013c415264c7fd7cee4e10180786d78317cd3ec5255f4bc437c652db490845942ae5644213ee25c732476c920d00f2f93174b19f94aa76f7c74bfd0622b93cb2193931f0c4c4e6f8a2928274a833857de3a4ad0c9953ab5c48601381289afe9d0fd25519d7b70f3c879e6b55504fd5ee775ea4300316102462c5b441badd614a4d87a599b9884b069c9f7c95143f9e0ee2337916c8a5dec3514d1589f332276917f23d17f5e0cf7245ed8782338cf8368d4e9b91e8af90512bebd1a458ab2c7faf41945d244631bee9524e66f45effd6d2d1f30ab41d21f76b88b9d46d137b3b37019232fd5c490f4e805d15567becdb53618cd8def3f01dc7535de8eac5de16ae74089e299add47e87246b1b82b642885519b9aee84f91e90324e27f34a2a3df99923679421dcdb43911b4602845dbcf5176a24bc3ccc556c62c7917444e4d14562d807dd8381a13428cddf707a2ecd5b2e99e5bbc7e84d1fd84cae9050db8232c39a417e0da3319885e571654cac6a9f9efe9f0f4837ab80afbf7c33fd39b366d9b1a37db3d2c4fa06d0c077a3f93738731b6a43229699c7cac27c3137ce466bd79c717c530529d2909b4ea5f567ee79d57d41203ba05af5e940d8ca18ca231effe2c7a327a8aded326f91779a95ee4294557ee3dcd2934de33c9447cbd1e339a4431086f4ff519d88b80bf42950e907591da825334c48664c07f2e406be55e4b238b104b5c2caa98a1146610b8c39983c49e4d9a505a6409407bc524a2bb6aa6d7f3944251ef89d1e7811948073e6e7b7f636f92b685657d3a24db278d64636000fcde0b41e1dcdf166156aa26d00604d4a8f8333fbb5b0451ef7f48398c9850dd67ea23c2d1dc3319a45bb44015a197d0267dd7e2187929eca1a461e78ec2067bd9b29582053f21f014d9f00eab170297a05403717c4817bb8da183387003ad602e4945b0cede16410a4fdbfe6cd739072d8d90dd796a8f45d1571a2bee24858bc28e0ea65f5690fa8e2f2dfd9df5b6b2b504350a3cd2712c659c6fdd9b20b04a52aed70e12e41a7c8ec379f85b328c2392e00c72848b6debf22ed010de93f483c901683d52a00d7567cc424fbccaa4302d849201b631443bc0f27bdcd3953d2896abb914d4d7eb2f12f63f30324b64eba4be6c9cb5f83c456bdbb545b973a71b3788b3ce27bc80ec394b8819d59f2c20f1dc326493455e9e94f19d7b4a7734a3d460f39ba70df6981a4e79e17cdffde197eb305209c19cfbce938e0e77628b1ba58290812a4bde288b9073c126fff05c849cfb5430bc1e15ab2cb40408582ad40c25dc1acb9ff6ee2ad7b1a72d42eb2dabd4071abd4ba535d655deae22f47b736a5e1121eaacd1b3638b2e22832474b7edb9a0b046b8df0c7cde987a3932a9811a82837acf22492c0a8eb62778d6d87d4745fbeb285c03daef3ea5fd1dd80546a4e8c8971a0b341549894cfe32b7b172635314f303140a424022adb6cb9e94fef57a0c588abf8fcf1620f3ff693aa599b0639ff4f3636c0f8f2bf403950685cb7355c737d291705e8acfc88f0d087fc039549f871d3044f538873b5eda12af90806d90c6f124728468ad67e94a2f99dc150d7eeb365abc4f1df3d01cb99edf15a7bb85759eb3d080054164f2b3234e0d404b4e8298102587d8808361c40eb3c0a3f3d0a0cae1a22a2732d1380a5d64eb12012cc5661c4966afd3a1ba2fa7e408191cc5a924e79c59447ac7e97b527c2955685c8190557d7e0a09c820d4dfc74eea17c656f3e7a5830fdb2410e3e7933f2ce51cb0c5c7c462a64e213cee6e0f52dea1f4c00a6cc057886892f1f918533ac8d39528d51e519c5cc8a3f57e0aa095958aaa931b43aeb29fe9f32e823898a0aaf4d385250227aa1a2d49b88a07f92661e31609b5467b305138892cd61beb102eea3ddae9c0595fbdfb3d7fbfc02ba08218c2a1ea522181c3221a06ac88850b80980536d1f873d891997858871708b9d7fa0dad8d228f35008de284034fa2cd9adc6867950fb3d8a2ea423515042e26ba556289dae340e09c6909391d7370e49949c68ae00b4d8996a05288628945f69486f737945a97e0d3a7fcf1282888e18f0015b8284404e7dd2ec90ca09a5bcba87d6381091151d4da370dc2c10e80c9fb454f87c83716becac27ef95f17ac25920dd2a6915fbc20a25dcdd3cd7e472c81388a42e8d40b9e7c12e13a9ee3f4b443783f13eb10a6e0eb6d11ad8acb39c19412ea947ea52d65c51f33d8de40830cb2bb3ea85d615f6a052f1d43ad80e0010226fa20e67dd18d917e233426254d27c03e0a204ae4781978d8440fba80de8f8c6c8dce1cdb2c86a488c0abb789aa75219723bcc585282d1cec4d5cb31bbb2cd2a317047c24cd284e5b86851781226d2915d0a36f8bfc5177159c8d96f13ca59dd09d9a17027a659263165b1969e8a521a43faacf9966df7d4661c2691c263461ab2b214bcce1bc90cff726dc273689759540f8ada11aa23c18205173c3612faf2716c83642a08f52ac741a73a0fdf67a7b6853b5f0d3f6faa8f34ebfdf040e74229b3a298fbb28c50e1c061b94f9e3c06b1a0349b6c9bb4db3860e7602f22f4e1775f7231349e784734cfb23797f95c91a43c37a6e1411af4430032b0f0f0783a9583b845fa1f111d3d1388a9f8fb8902902c23881ee618adfcde61c0cd7b740ace041238d6d2aa1630b1e1c86e404f1e3acaa4b906f3f8ff7715d6a88bf5abfa71999d3324efc6e5db87b3a11b7bde2ed36024eafd2b5b9909b160a5f97234adc5d8806f7ef0878e875ac5aeb32e386a82b0292adfde3b34bd5209a6ff9d48e11c52526d7b2078f79a61580ee5c018f1cf0793b9f545550f2e1bc25f60f3aa70b7f8eac1ebdcd87a382fe338a600d97f724cfa4e78f850a0d4c2ab9705870d48b60b139eeb3e611869622f63ce6884cf11665b0e407d000827eaa9dcd9edf7e98cdf924b9e0077364cef5598ff1203ee45983ec0a9aa0a6dd017c68845215acf567490ff68004bc11d4ccb260b3265a64756a69f673c38a40d8783078e52606a886d6b548e2291a966c874d25531829098e9c4e67c384d034ae44ff7c4f5da64b8d4825f134669310dcc96c4eeb8010a728c3770da8564912eb7a4b9e0297dc7e23f3a1303a7718bc885eaa055ca51958717b505a9133854c0261fcfe7ef4673c1c5a0b5d3b793eff25499cfdce66838fc672ddb9070b90c088cb44dd4cbb0dc575ff53b001f7a11c4e4d85fdc2801a21dbaf2244a4bd7c99660152706d759eee98599bede9c9b253829a0a7cb390ab11a769863d713e735ac5f087521f82dc817537a17ccab65a1635bd43f9aa2fa7000a2f742e774a255e0f3a528647f178df1eaa52acfdaafab69dc1f63beef2b55a2f0cd6952c1e6942b046b584bfda755f3f64108fc0df6da26294df679d59fb71fedbbba8a2e19f929ffff3ef77218f85b90a5abf2de2442df99ff33a45fc4f9e93bf68de67f0cfadd98e11308bfea7758f9f47a6d958f1b32df422d60799878e1e98c555295c0e11a39da2310e02fddb68e7515c16a60b24837ada1fd4bd0d5d36c5ab3fb8c995729ec5d13a58d06e3033f714454884b890b2f08a1034daa1341fcff2e2989b59c643756e98a44547a2987b61f7c4e4d3996ae52b83fe4ba26adad13f6a64907ec86c4efa880230e75885bb5ece56a2a6db8ea86044c1d7b2995c503da644fd438c0696007bec4c0520067fc6a49fe4692fdec0d697c9d9427f2a1335d9d99e5a158208f57302927b2350c961b22f931b80f6511b6230168d3b9180cd2c831820dfaf6937729d76c59e3910ba5bd53b2ee27f8619d51593b07fd63aca8e30f80131ba6ea415f698fe9710e7ee3eb620c6636d85fa1215e32d8c44cb700b25080fc17b1f08465e6171fb50239b2342e03488b287c09484195b4d45902b0671db6bb7f8d2870fd7905442a5dcf9866d3a3259b4c8d0c37086ed33e16478867f8746e888a6e90cd917b5fa55606dcd63ed17ee720d8102ee54ddc0868737a86170909db99c00f19a1493f13050db1f0947194afb7f3ae577b04f3c42b9d11759ca071861d68b01c9c90637bfac942e1487ebb451e6c23bb0669e45e43f49856cb9a1e4329faed06d17b19200c3025432b620f85ff1fde311bf4cc5732aef0dce74ccbc9061c5673085b936d007d33f4c9b5ef01918588cc3f9aa780613043c2911b5e2fe8b0ec4b31539a6f259fc17e6d2003c88b1be92b2da505ebd0de30fe09746becc35986582fb5413e345144b2b271cdab75fa0c21a18d5ae634254ea6bd3f0efa57437bf29b9f197ce4333c2d7067cc698d6cde6730cdd36dc8062fee7b07f3cd9b4328eb0dff2d20c453f16a09ca4dd7e5f329f621bb8da4ddca46800c15c1f0c6d476b170c943436704baae8c58dba603ab23c7beba8f9ac8bd0480f408308396b58ee8836837b6f8bc2cb73dc024795cb10d447bd4dff7448ecca28fac00684e861dd5636a9ccce3f32b6e5576f91e819aab95aa784d416c6b38ebc831ca661535c3e79b3114a31c0a116758f2fde3f076e3470930af40f056a405fa9551060aa381d2866e168e01e509c7e4608b0c5c82f29615b91142405d185eb572d3cab654679d9ec964ab8a5dc5b4937926437f906e88c486e6af2d5c3fe81a797a7bc2d053e0b69ad1110b7b369b5e1418ae46a590a500acb0a250a3f440299beafe58c8224e02141898252b0600f6f29452e058a6f0c24a5e6ee528a48cd92825923c832022b2e23a0e2ee232072f7f72c6dcb11048d0046dbba457024822a2e22a8f9ac19c360d425821a11fc08411db16b75084a108224f38a9da9ea97edcf6ebc37954852324d652e1b580af639c4b915e21c5ad1c4dd8a20779a37b7358559211d044720a8e21ec5a75007829ae8020210c880c0c7078cdcdd7e338f7eaf0f4cf94013f7d1bbff81200eef1ffa40c90348208282dc48affe916e11df2ceedf18489a3eba6d48bd94fe8d813010289652330f1fc9d8e69697cad117db91fec64023bd5aafb0b52997cdddd91af3e80be3b6c6b2d7f4f5175b223bd0703454a6633664223bd05c6c75ad94862fec472e7f28dbcfe1cd515dbdf76a6866649aca88ec40c3f130b3c30e3459ef2b72978689ec40c3d50fc7b2e62cb73faa6b6866389a9fd1efc5c93495d5cfdccfe8a685dcea6d7655cbbdcd7b7c7129fd3627052e03533c034d7c2803ad0c00a9028d6ed7febe4cd64bf7cbaa90825585cbdd95abb8818a2b73dbcfca9c1478979f8ad0a9a8c90fc509b305e50994201c283fa80b068ae87f19c418d0806320080ca430c5d1f8aa978e943645159f2fa99a82c8dd5553f0f888bff0eb143da48881141700ee22854c0a20b37ea655fcbc6b3ff1b3d482f25a19fecf6cf8c228c888e20151e470012c3ef1961f9675fad4cd3cfada97e67dfff3e9e21b8bd10f36c3431780e23e3dabe98b3663f3a5e90245dc7d6581237c7b96b080100ba05001155460880a481ff477eac69794302bffc3fa624f35f5d3443cc6ae9d34ccae95309c9fe28befaaa5c23ac8133430ecda271178328402695000cacb68f225de1fea6bf3bf5ec919129c964fc6e337f5ce3fe47da5990214f0e14cec4f27af9d00950974175b390102406165e6d1ad3f2ba3b9a07852a1e840da831304850f9aace157bd54ab9ea032e5ae494d699eddfa89da133cee1e86346f9c27dc7dba48000b70d552d197042e20819ce922811522c045048622c0e33e3b3a33de5f552e10b8f8b578bf0ee18a712000c5dd21b021400391956935fea4a8f74771e4bcd8ea6b2d95113599ba12f1f8c42c221fee737720ae976651cb7762c57d6a1a937a5b91ca6aefa496b1c412865f20f69cccb0577a7bf4fba8ee9c60c30928ee334890fbc2b9e5048fd5415c9a3882bbefd1bb5f532e9bfd519dfa7074a150294d79a4a65249fd903411d444a9091f9e0b13519c0990892077266498a81fe6723cd8e7fb5fecda9c4a3d887b70b643572704e94ea5523f3556394d633e5c4c7c7d9569caf315e354eb7d4d87a3fd7dc08f187dc9bfb847093164126d8f28e151982abf1da22f93c5eca7446b0a754ac8c4e8ebb31230cced8b338cbb96db62883d3df439fc8cbd9f3014b9187d7d96ee4a5f16f3234d40251e99a632ae49d8a486866f134fc228891ab8fbf789b0144859493499425d121d97eb6ffab55e6b64087f1fce9c03aaf8ac0e2072a7fd754050165f59c412861d5042c2caf7e1dc83a63224a4583c541f898e56ef2b41425e7b041695cb11ac23a21c51f379841123b2544bc3bd521951455399114f7c06b990fa460071f719b3df1bc183c994b9ef879a5a59ef874c5a9b5a3b63529ae391cb8c4d6391cf6ab90fc722230c57cb52b35293c2558b876a4d826a427c0a755caaae36e53edbd048bd76a6f1c701e12e349a9c47868c7ca8c95011f148ac223e115b224c8d82dbc865b42d65dcbfc30dfba8ec5ff2628d454b7118d69d3fa86b707e496d6dc6e2be47fa6d4b69392f71d758e6173dfd796bfce552d6b4882b454829a2890715215384fbefd08c29d4ede87adf6658f5c227a1ec8645dca70bcee2d3e22af8e2cf54857fb863b9a99123496e389d1c95cf0fad241ccf8f8a870b52f574f25259cf359ab14c2f11ddf8caf7aed5f70660c6e0fc4c5cfaf7f84ac934e591692a038bdcc128f78a20c8c33d688029d48557bcffa57ee6c5b862d7c6aefd645f8dcf5916f707f1acc8dd697f67507cea98cf182cc9f1d259a7edace4b487117105b38888f211114e17224af8cafda334592c16ca688bb84b6d65475206c5292d7fbda04a16e43366b52c878c258dab4641fd36e34d77ec49ac9be1b8584d4c05bb3f11e4347dd0ba5235da732d05614ddc61453ecb7f13f7d975dbcaaf991d96d1ba19c6dfa5154b7de2f5521bd66a588bb88faf0ae35971dfd9c58ba2f286f0602c05f3a6e16753fdd34bd42f2c3ef34cd3d71520bdaf245e252b65789b4a524a15c5428bdc5d2814a761dab93b2d32ce3cbb7fe88f0ecb4bd45d27c5a7d62f517772f6b8743c5dc9835c0e8b0b37057c900b72e764dc7d88a349879092318c86f2d22c7a1e1ee27e16f71043c0081dc95c2e42577e47a8cabc425066ec0a19e133557a895aa78042a5a4a632f6f91fc6d528f81275ca6593448896bbbf44214abe240b8cdbafaf4ca1aed2255296d496b496c82cf1c1edd70d3072df562ca2015468debad2063c79899acb0d903540c663d77eb14b6b1059dc83b0c2edd7414471f720422e081e7af36b910b425ace25e8680a75f583be98421d274d3174d31c69a29be6bc9ef6e58f5d0be3c258b8b1cd23fd7e6f4bdb74d39ccf52f0533a26058434e592c6b0bbc2b06bebf776a7aeb4aa666130f1a7a6448ad4560911ed594a6456898cfbd456890f1720a30d44c5677d202239be8078dcbd878f024920779f49d070f724124812e24d453c4a13762591f5b3324fba8edc6775154d1794dad78c5d5c35eefed6f5c35d07c9ff73e4fe30f91386fb94e3f6b9d856cb11f90edff3e84f97298dd6fcfcf0c1e24385dbb57fe223db3e35dcc3f28f9b72196f9a45efc5cafd43990c089a31f53703649c013f668b8afbeb6b0bcaacad20af4f5b40909c8184281cc558a672ba2009f289c447fe4d3f16159f31fa1f26594d28ab63c1e05d92b5c7c87d7e86b9f450c138bfee71d253833fb945938ea4e1ef5f3d3047accc988ced1095fd4b5b70c6e697c0233553e73ac2e3b29895498cf711185d3fccf36199912b469ebc9196bed87e3622fdf437401ced0041c57d761a08a2efb3332140bc66bdafff3310a55516d9a65fb9959529d4ada2acb08f9e79f8888ed16f47c7e807fbcfb0f1fb28cf149e20771e1abe2e29553f14cd18215ad31f88b6885d7e28e23ec7ef53c94ba5a62e3f8879c768678ac45bb5537357ed94dc3d5b171d2b7a2567fdaa53f38c5d745aeea2b3438e91cffa2f9931dedfd3684e0e514e1177bb63d5d61c189fd205a78a95d76222f68f2e38440e568c6338329fe3f7e1f8e0dc4cb9a9c594eecdcd0f9591fb04ffab0acaecb48b2a68765a05a3778a60f12935b55f11295f4ea2a4fe119f24456aee52fe108d15c1c1e76fab5f4f1be9176a5b751059eaa31a87a9d4ca66fc3edad21fe5c0dfab249f98f5dbefa339d5e22ca066013053a87b8d458bf81343317bfa8a5cad940a8c7bd154aa465fa9a0944ccaeed8956daff561ca47391f88dc33b75ffbd0b9bb0f439cbb1613f1e52436597c2e11425e958d066c7864e98ab11eb2b8f450811e78dc7d5e9b1f943872fec59eee748df6f4e04385bae28292809454e22d69667e50a8946737dd3f52538942b96c30ecae62403c60a932853acd7d2c3fc8c313771e64bef50ff150640a75dc900b0f287c623e7b6c20b2a1b3414a6d455d4396ef25e29c1abc70ffa9e18929d46d35549fff30ee61dcff974afdceea611c285eee8af933285e1a88361a82dc371a4af92b77e9cb2c5c4ce9377d2d65640210a03f1a8a275d3f1c8aa79cb1a4fb0543401408e0719f3f728238c3744c4962d68680176870807b00180c50e453b62dcdf4f9ebc52f1ceb6284845822444925e76b1c6631ac7f2d486b2fff8a9982f9f76680f035bee86ba93280c9dda7017e6c3354995dc6b203f3bb68cfea6678f23343b7cd2065dbca70342483949965a86d3214995b5b8d6f0c597c763e9dfd1c439177fa7cafe81303d1164310b8c50033b707c391fb1c69b831100c45b3c2d0c4a7b6b67e6ec170c4dd7f63a00d8601c05491dd6fdcc9df60f406539a5d9a3b18de600a50e4722b0014df0a1016a0c6bd00490860e41b01a218bf0f87b34b37027438dc0850b3116005efd13fd2014c1940e7424298b08cb644083900779fafed0529ee73fcaca6db0b44b8f54250ce4a6e2f1c20c4612a254d1407b74a966efda27f2d2662dbbed836bde5b06d3d7cce58694ad2496c41fb335d2ce0b2801f6e6c3f54b0fd5062fb21b3fd8871818ccd05275ce87c822f6afda2f2278de94a27bbb950da5ac8d24291bb13790b2d5a7f6b41477aa1c882916a63214a07e31b0b4d36164aee1dcddf4916b615b408b2ad40c50a39f4c39b0a3dd85498626737e6fb68498e99ee2b7e7808c73715ba4e62db6d2a1071779aa382bbbf449dc214cf226c4ba189c794a42a850508206398cc58e22d85ba1c14aa5b22af5509000afd3eaada049045bd09e04777ff488df6a050dd122317856c2f886f3ea67c18c3e09b0f22d7e257ede6a3e53eb558c457baf980f1397e5aff579f265b5b00acf81600a21a05b7001491bbf6370030c22c0010f98c997976963f86ea6c0068798e0e6865f00d001b0a592e96566e28b8604381db504861eb516576160341935f2f7e659c31de5b8f277bebb1b71ea5a9f35b0a7a782319c5ee467a4207f9300e37d26c23c1b8ffc5f8bb5b8b15b9b7966b31111fe2ad25c8e6ada5b4f168826f3cb6d878649f3126bc65cd94e6d17163fc611cd68b5f9c47fbab6b144cd1fed628c87df485bf58aa5e7cb379a946c13bb2b8df5174c7134ee67e078fc544dc21b9276079c213889e507242162758718214271ca1757e14ca954ab5404b3f2eb5a90fcea6994bc594522e9b241fddd8254df9532e9b0fe356129a9fc397bb16dc18e7fcde15f1ebc3b895fab0cf87714bff87b34eb96c52a9d4c73295e12c41044b68cdf165fa8775a1dd9da9fb87719d542dc1053bacb8db11c5c58e203b3ccb9499e595e5874ff9af6a5170172564518214779f56b69520a48403dc6c116f9c5392a9938cb9965395e48c4d9db9459c653b0957dc9340019a24d49c5512a44f2418f944420b6e28c9efb360fe8f224186378dd9ad952001013346136fe9524794adebe0e8effc75c04c106798adab0fe3d6117a107e2894eb0844eeee720419f73142163782157ea4569511848cf023a4b49f2ee39dfb33ecda1eade98494f6d349d9c63772d251c57d7add87718beecf387434713a787c7af2a3a0dd21123a241deeee577554e47e4434943f8c8f64aaa32239473473ac31f51c4ddc5b73d8cc396490a3c87dea2042e490e21363396430ac659b867248f72de2fa38711cf9c401c5e328e2ee41aea5a184c309f3c3385c7d6c454393b2f11e48b669c8d1cc5c0b7278c3e1c3b9378c6aa552dea8b9bbbc81d30a3f37e4f0595fbb21c40d4d7b568ac80cedaf1b45a61b3f669716010cbf62ac082c2842e7ee347c8b208305cbe9730b0b14cf18067b992d1697bbc794b0b840042a3e61b893a6d7d493e3a5e26ba4a04b4e490499cf13de22c5e1d638942622d4b8c7e847849e36a2b8fb64a97cba99934b1bb5366a9cc5061c7f7165e3046c04b9fbe718fd3e3a7edf890d19ef59638d359eac1123236797e6927451430dab44a62d2d6553c3379bea7078ab519b429d1a411987a05543c6ddd5f03185baf7ee573bf4dc108c68a643a83285ba1f02077c0a754bc64c3faab91fb25ad3f06bcd14bf60302cf46384a5f2913d2cb916d4368d22f7349eb8a711ce34785c95869fea67654653dc2889292d572d276324042beeb5522184600a7523c7fdc6432998b66d49535da950a8588a254d3c364120b2030d4f10703c119434cc535f8b5c10602610b200610920ccdc5de7d8e9af85c9f9621134c472dcfb7398652e20a8800615346668c0708612dc7d6a3a5e959c177b6f19d083c3f8fd87350ee3f7a0b6732bd1fa8c2277f733a4703f83c80e34dd19f60c18ff019592ec32ee7a7ef0844f79ed0f727031e3e874b735a30a35e39b977a57e562868f19f5c32fbaf16d5dc1c2e50ad1159a2b3ec6bc3feb1ffa5e83431ffe7d69a6624c6e9927feccff5ef48a3eb0627dd0c47d0ee5d7f2661c82bf7db0f29e89fd41a15c3dc0d2832d722a65c3ca227ec962f62f17a3ad94343d13fb13d2e7b1a1199204efbb92a61a31a42f7b26f6676bfa9581c5bd8c0d586c37cd6584b32b6395d2343f19574c9ae6b76450719f950c21c808c018465e0b453965dea6f5fe2c53509a74f7533b0c937aa4b4319ee8d3d6142663d78ec1e37ea59c2e63fce836be3cb8e23c20a2cf23af3d5d9107353e370f7a8891851850f8a40fd2fc620489511283e4fe4cec4f4cca6513bbb6467b3ee5b2d9ff93029226231b7f3f1b7f32ee7fc69fa5a4a9aea4e937064ad9e0ecfb60aa5529fe461ad6d5fe9f6a5da998219d148cfe918a5936de03ede0ca0ea0ec20c87dd234a6b976e0c3ca68af7560e42610ef4b652d1d4c09a22f121d40a9b9bb4a0741ba56aa03f9390b1856dcbd560a8614f7261c184160d078486957ff988322f71ce4a0357160070ea8484d35beb2de1f4b3476ed10fd4f9a7010e4ee33dc96a671d0c3bd872f86f0c593aea331e3ab24d35456fa424683fea2887f21dd8d8aaa7851135954334d12e3edc5914f3dd4e91aede9240c672f8adcdde6961753406d7bbca8c0bee28336875e044da1ce0b19f782a46dedb98114b986668666994fa1ee06375be3966c5b255d649921921366c91ebaa0d2c513f759bb90756183fb94c5acec652eeefec7552eac7021850b1917331c0ac5450a36d8816b1b34b1410dce3ff4575eead900c6716a50c56b10a5d680c727adf7633570afefb345954ae5c5f2b5b8c5169dbbffb045cd839435d3d455e58afb942a4db82a415564c66d530f529b4aa150dbd67468507377171ad4cc20cb0ca2b8fb0c66e0c3e70f592d032bd2d39101910c7840ec650cc3d1228b1645b31bbd976d172da26811ba68515373c9e24afe7db3d880bb8cc9b824b53d3d8c6651cba2958574cf2206576230250644f76310148398f105832b30900283d01d06451ccb682e30902b2a58dca70b857251a1e24ee5c9a412e4924ac9e70bb0ec1754b1b31784f305352f709f2e98e2db054d602e68b90be494338fd502a3164871c735b7a09b766c410d8e5d8c8511c5220a1635ed8245112c7eb0e00a0b30306b606a254da91560f11550f115aca0e6b315f070dc5fbc82920ab2a8008c9b02ad2b954ac59432fda8e6ae4d9952304993499a4c7535f36876a532be16fca12ce25c0b566c330d3f87796ba98324607bf43e772d18bbd67a5f63d78239e5b2f92f145d36de03a5209c5d5d752980b11f0c86ff62145cd92a14c89a8382282e66ad785050007fed4c5f76ffe3b46c8baa1318e53f4115f729abc24f503b010fde3f7482d2ac7f021f57145d41f45dd1ba02664b2bee2678e2f34dc0834d00e379af5d4a60844b504bd0c4dda72c41113ca42a010c098c26098adc9d0450029f916f5f916f5f0b7cfb46e0dbc701df3e2a7cfb2ae0db0701dfbe9a6f5ff6ed93f9f6d51536155278c185051801f870e95103e72da01c46071ee6d0818c660807472934a0555301921f1088c1a509158cdcdd855c80072cb8bb6f5b38e1ee32f8b6c54c5b5088de96e6ed690b7e9f8842fdc59a08ee6b7e0dc479f8c0ea396204883beeb863002fbc6c2e77fc70a1853b9c07ccdd83f0adca0beeaef3c43b1cb3a75bac00c1073c10c57acbac65031e534ab261acfaf3c32ff07b90b21ea4f787f6ac29759099b38a592df536cd1dd6153f7aa9dcd294b38a5d3bf3c27f23328a0c3a7092f5af887736666d18abae641024d362066520c4a7a707c3ee8afb9d6944ba4c8b6a8d7ce11ae31b992a39afa6b22c76c86206f7d8b53dcc9080807b4b0738e031a59fd12d6b3a3c9bfe4f4e5257add8b5330f1ff98d81e667e9be2f75b66211f935966d697a997ead369e283d7ef9874c587f2a392ff6c451899c5ad38fdeb07c9eb5312b76edc640fb83c02c16928d593455fd5a55faedc6acb125e70914bd1147ce97874513f4f8339f8fd1960e92d6bc14949d46a1b48847b92968b78dfd57efcbfa269b9148d18b81e129d4c190dc3fd22d91e36bfc6a1f055fabe4dcf73f463d1bd262b6a6393e35896b5531eb63b485593e1bb3b6293a64d17bdac76898823adc9d56fa3cffd3a5a0ca27d39f7752f0c4436d313105f501405260927535eeffc1b0bbca99207d90aae4d422cd3af5759e89fdd1fb7fdec85552dfd336a77e48ea5bdaa25947045748d1c415e215b7bba2e70a9d2b6aaeb0e18a013858a32008ea16cd3afb7f428c591c57a3e0fdd978a98e9c3f44bb6ebf27d67ac5d074ba19efc8397e33fab4186d752894abcb0ffb9c79b1dd57c426989532126f691a5f3267660c7b9a75f2b7f48793b64331bf28c7c5aef5c4fab9935b3fb59ea5e16f76b3eb3a693bd90ebf722799925d87a493a6aef6f5a31bbb34ec73cbd4a13a933cc9259dbcd6e21d394739633a1c6ab4a72bc95a4c8743c63b5d498242a4eee4ce74bf16ebfd6b5f1646939b863f933f14bbb6761266657dcf44f39774fe507cc929d4a150b95be2dd51cb6b357d692abfef69525369ba34d472c264317b7127247be062d73eb7a493a88fd1fca7997fd32fd32bce180d8a5eb69e1c33cddd57ef674af3e31eba65567206b934eb3c2ca4e0ecd2f155ebd74bf5be36465b1a7b120bd957943a7797863b59bf2fc9a9b37dc568abf3c42ad42dd1f563b4f5a3afa5a0acb4ebe6a952d387437b3b947f08ff481116a3a18e5dead54a2f0dcb6cf79829088a3f72eadd6158a7c3cc906ca55772f689afdad7f135a372764234eb98785c2d9d1c2e081f24ae9f158f3c499a759674327f8c16ea843a14aa5b32f76b2993d744bfdad7f15239be968c9a1e91333f98310c85eaf20fe1b08b29ed2be2f16728542737b55f089a3e97cc3666fcf1675c37f436672b5fd32cd4d18d4506744ba40ef2bd68c55e48414c93a3e9626bebb5988890a663fe45efa5b4d21b91a327671e3ed22d91e34b6f1c5c3f497a70002bfdfc7d2a89aa41c6d42f75329dc41bb6fa70cea2f75aeaeca87e6aa8e1fb68487be4d4fbefd61f236218ad24d3f4e5e720a3f740924a1d648fdfcb7a2305eb4bbdaf9c30fcd1afb6fef76ccca2e12318bbb4fe3e2bc3a137bad21b7d69f813bbf6eb55c1906017cd3b98f519f76056bdf846b76e36666dccda9c58396173ad964ef468820b29b5d54d64a009279a60a2099b18a96d49be33c1c41198e081a4f9b3a8bf7e8b16ee2ee45b1250b8b734a065033be39082b48d8915dc5b34d09281258a9660c1122158220a69d2198757caba44c99d86afd4a1446201282324aaebe4b5281da0d50f4b674727e701604c19a92dde5267fa6148551215bbf666aaa43e80c8a4f97f94e0c26795236d2991a365deef71db4c432120f6e64b946d1b132204a5c3bd6572d350f6f04356bb7b8b6f4a08d966a859bf08d983b620cefb61327facfee7ee28f8d6c44a0db6265834a9c2e5b52529af95374818a6f9514d8a6c2a9bc024e146ec5a9da7fe42d026c1a3e53c8d79ebf72e6da9c2bd858a19dc5ba0b8b760c0bd658ab779bb7b8b14ee2d51b8b75cc0bdc502ee2d15706f79e2de420177efe12d1370f70f47d798e9472912487077c7a9f446ff477f3e8c5b3828d447559b11479b1168e4f8eca8ae08e3316209236a6e440f28de975dc724cba536d3219cefa3383a35daf3d54b65e3a512664b9f75d7fdc889f7be9ff1a43da6982ea6d495c61b39bbee148444894bce4d735643f5d29f3ddebada18def2ed967853493be96be9d6b1fbbdacbe38d4dbe28003285552cb6af76b898324b432ed3caa1085a862492c80bb8b794bfd56e7b91570ba5688f416bac081c62237fe41ce18ae344322cb40a152afe98dd454a2502e1b29a5bc42f86023634afb632854ca658342b56ca167f089776e237791b97097291fa444c5aea562810e1c49a1252d68b8fb12df6466e42093fc3e47c27d7c235965c45b5b1124709de7f83321fac371d3f0dcc9796c618d44c9bcbdfa0dbbc0dd45dfb00acff894784bdab364089e74e0480b181bee2d50b83b8f27dc3d665fde0f49fdf6b461f7c4cd3c3bcb5cbdf88542c5ae9de91c243234344368d46755fb7a91983739b25e1aa367f4439f3e3d3d155f1e39634ad2a7a747fa6cfd9b1e9133632a737decd27cba969efe9be50733a8df9e6261c88c614d68600827215a87763684399977ffb5b98d31def787f6fda1cf5c6d733443b859a6207d9b37b7b5fd381da32fd8865d9ad0eeb18635aea2be0fc66896859ca6e138fdffa22fb15a0c844271290ca149cdbc274d36ae21dc1a9a650a52fbb361967524b4ae1ace403eb88a3f3fffa237a91f9b8c77be8fe27c1407854a81fbcaddafd5ca381b522ed42894beb862907b18d5dc865d7b51284d646666666666466686871a0510d941872134333636a00d476dfe456f6cfe455fd805446a2a6dfe619aca5a3b1ce12e77a0d141083a4ca1836a481c43aaccbf18c438e34dd3f6d54914cad58d2f99b109c9b4a0a98b29e96ec837e465887bb5546fccda68a464bbd184ee73a3917e678e94cc289981e299fe365373f1a57bffebfbc4191f9b4c51b7c94871779930c8adb6cad4b8635094f1e1ae040789902bae8548b1b49369469ff623243b0dc59f542af5d7f6a0502e1b18121b1af5b1a9e11b8e46b3c6321dd2fb9391a476edef8402e366e79ef715b96d96386ebfde4e4bf01aedd13f3ae6de48d387f1abb4c39f71dc498e9e085399b26c2633f0855d1314f739f3e86b33c998b876589b49c6b5c39278cb9c95caa45d3bac2d07367cba765875b56177c358b09b03510ed4a7509731b775aa460cf1c609f1ae9fc5818a3b8ee140b4458a4311773f691c62aecceebb18538877a98ba132eb676f623a77df1f13e3c3e9cd562a412988924b1031b6205004e98c6c4d8fa05095ce32a6c9ed33c7379241b15e2a85ba6e89fca84c06a999f56bb427e5b29969ea9a69ba3febf167cfc4ea54aa46f41ea815e2cd3d13ab831cef0494b61bb2d4df7f4311c7e12d52ee06ee8622ee7376c30f9f408c804cf10d08910f102045dce706e487bbdb60e49b0d553c17db5dbfb73b75856177955b291bfd4968cfaabfaaf67593ac5e1440866f1cea6a6f6ab4a7467bae2835ced4330fcffaa2dec6405383a2aed8762e392f96f545fbab67685df7bd6be9cca3f9876a6510fd764a5395ffc13a49fb71eb989c95ac97668b3f5a32556ce5c431e92c7aa74cffc39133e65f23ed29c9d449cad449cab96b36e96a6d4c49ce29d389210ee5f8bdbe5fe58c29c9397e9dbe56d3509ab4cc6976695ec9d9e94e7e8ebc38728656f6dec59e985572ca94aa7d491d64fc3e11abe404c22c11b33666d5df18e8aeea6fccaaf4793666e5df9855ed4da5cf737391e0d6cec6ac9ffc2f1085375028827600b88c3b0403c006104dabbdf11e48cfe8be2b1c992762a097930f3dfeecc56434fe2c07d9d5d51be9e4cb7e46b98b3b1d44bfecb167417cb1f762764d961edf08668d6fa4d695ea25060e778fdd181b6811d30277df7fa9beabd975f26a2aebdb1ad6f6699847cef7ecf6280ccb1bdbb30311e983bcb14666240e72b603912017d324284a1d862032233795212812f111619aed4044db1a6a900fd2d327c262d75efab49082736bb9e90d3232339dc4bb9399339d9cdd7fd57217770fdacdc13e77b2fe58e9fbe89c8b6d0ca75ada027fafae18fb9bfa3a385f694ffdbaaadfaaffdfabe5ee08f017203d2f400cf0628317537faed19ef9616de59773a4dfe797d86a4d6598ca60d8f41f7d89fafbded31694302c758cbe96ca70e4fd5d925907b3becfee1ffd9afe111f9c835d37c983d6b54524f5c33f37497d6f0809665dfa85b38c95548b81b01dbf4c757ed32318bb361eb2ad8d5934bc18204bf8bd8ccbcf19810e9f16ef170364c05da240578b732f330cc0bd63c98034c691f7408615667884b1d55e62a8e2345c2b654cf044ca4b0c9dffa5fada0dbc0cc0077727607989e1873bdd3447a66976bdc0f00018b2eb179811bcc0500133811798245e60924c979c78cbdade19f720e14e9a430e521cdee389f7a8c2dd87f097027c3333335366ce9c5e7ff4c5fc7da2cebfbfdad715ab7dbdbc10846debcb5ea2e6f4f81fc621090ed21b27d00ad9ec38e29b1d437cb323c6373b64f0cd0e17dfec6871f715522882816f4556f856f4c4b72207f856747d2b0a72f7ed99587dc7caddb1bab7502175e1ceddb192b870f71e241b7888f78b0b334d8f60570b36f0d8b53b2f2de4c0bcb4e0e385852ca41ad0e0a5859a2ddc4955dc49347027cd4006242ddcbd07290b1e2b80fec2824c0b69e385051fd4bb22ac93a8afd843a1f1b282147f6decfecc902973b2a0a6b418b8936040c59df40217b8935a80853b89052b7027a9608a3b29052870279de00a7792094ae04e22811477d20844e04e0a8115ee24107cc09de48128eea40e70c09db4010db8933250853b890a28ee240c4ce14e92220a77d2052ce04eaac01377120526e04e82e20977920422e04e8200913bc98913eea4269870272df1007792124ddc494938c09d84c411ee242398b893c69a3b8936e44e12b73b4967775211a13b095f7712f8b9936644b893accc9d1483b993beba93bc973b8976ee246e0877929010eea4250d70270511e44e5202e44e4ae27227fdf8b89318d072272161b9937a8eb8938c00415af1b8937ed87127e9e4b893706edc49aa22eea405a4dc493ed8b8937a40b99378a871272980883b69071ddc494368dc493332ee2421d39d7432b99372c0c19d145372270549803be90620ee241b6a7027d120dd490838803bc90033b8936488c19d04038c3ba9000470270de00577d2cbe64e72f9e14e72a10577120b2bb89354488124001feea40000c09d84420f7712a9c59dc483d472c713dc5b9cd004f716262cc1bdc58e2cee2d4a48827b0b12ea706f398211dc5be838726f99430ed75f3fec3d50d7cdd4c81b642773a6fbb5d4db9ba9f9d1ef22a2dff6cc4818beb13d3ac809c3721ed1e991542579e4f0c2c3051e3d5ebc8e49a549cbfae260bc78141cf7e23576edc4f999e817cf797189f51d4d70f779070d240a85ba83c8e7dfd1237d90e3cfb8106fce34fe4c8678e360d74c53577dbc45d51374e0eebeda9ee000899ac28a0e1c49a194102fcc276a874ea753ecda31bf58440c7f2fcbc4e617dd9746657ad268340cbb7687080f3a1091a8211225d49d24ea3d3d69667690da5269872a95dac6ee29ff10fee8fd507ef4b385753cddfea82c45a30391991921361265b7deb1c701a7e52371902fdbb16b4db2a799e66d5f59a80b690feba75b12a35a9417cbfdd91b7fa6d3a3f2d99999b4088a1a5f792f66e9f1a5c79fc9af746316bd89ddf18dd468cfcfff4e9632dc86567d9c31a46015420377bf98deb07896e0d1c4793420092fb82bc1dd2fb6217d994425a14912ae772184440999617cf34ceccfc7680b0954b8bb8b79eb77d51104f73c79d017d76153078cbbfc107b5a5efbe3fd1037a34f43a1f4c533fa4adc5be2706f81c3bde50df716375a8ae019048fa0c31186082dd120c8859af62c23e0c0dd7f8f3735aaebd36c4fa87f8f37f3620bc3726b8c33b5ed9174d8d031c39474f4707a730487577a63e56805ee0ecafbe05111ee1f8eae8db1cfecf66bae9378cb3ceaedfb3932832037470f730c998306771a785c3ae31b91fbcb49e4a0e2ee723471396ae268421c5ab8c7518b43c6e140c3dde1800247eb8d3ab637b4f0378e9879a344e3061a6e58e1c6e70610eea345b0520426648a5004cb91bb63898225c86dc02289b00611a0b8fb0c118a781b68380a35d3069499365ceea5367ab041061b4c381b416cc0b8cbac6134c31a4fccac71c4d56882bbabf1841a47dc678630650836ee691cb9a7518334ac704f0395c6298d1f8e42c91891e1ee4616300aa5293fcc0888bb0b610d17820884d04497845024087504a18abb4b1f644ce98820d4b807a1070d5f20603103841a104aee8ec61534a040230934646800a1a103a7bf7225bcb9cf3367c071869433eacc19407e70c5b912b7efffe0897b098592f9418f19338acc2032a3889be17e25ca1522771f30c10764b80f38e0030bf8a0e6831e1cb97b0faef08bb77e8178a3503232991ecc94b14619454e53065119364e461d4ec60c34c095c8c0641cc93b6f5d22c3ddc7a83246126354f75290316618c3ddc79f49d30c0fb870771e14c18356490c2c6688a185bb3449d497be8f7a62202186cbdd4b62d860a509eeb864e50656acf0520dcd8c95ceddad00f1f16725998fbe766fc1e2de4204f79636d808234a181a78120613398c1a0603c2b89109e30061b88491c20ed470f714a40f32e6fe77ff334994a6316992a8bc43ae8442cd7cf4f57b346f8d426d8d6532145f8f1983df4382c3dd39df7690005053da83f27b71e7743a7d304eebbf17db1c99a63cb5621c1d0c03e38a592bfd3e15184c801174ca0f460d60c0b8bbac51505b29c168c9011bee2e5352a25c433814723a697d0aed4c0b39e1e0862fa67c11c5bf60c2252a4f21ba2807ee12555f2711a24f1be39c41f0d48591bb47600877b7be7171d4854ce3fc4ca8def6256156a6b747640e399d4e1b91007c73f204df9cc8e19b1320f8e6040cdf9c68e19b1316f8e62404be39d9806f4e9cf8e624fbe624e69b93207c73f2836f4e4ebe3991c137272ef8e6a4c5372792e09b136df8e64419be39e1856f4e64e19b1328f0cd090ff8e60415be39f184ab20001f31acb0828b0f1abcc51dc889f040c1a58507cd0824219c2085b4a475248dd3117a30c316c2c8dd673a40c413a270771a993a5050b9bb1739bdc08a6fe01abe81577c036be01b38c537700adf4009f806d67c03b76f2011be81d53710c83750e51b78f20d94be812ef806b6f8f621c1b7ae0da824343603a97868640000002028009310602028281a8d872332995c3e28c7001400015eb05aa2684a186a518c420849441001000010000000044c18d7e0540eae50dc1147c2e9fbdd0258e2c1077292619f00953008671b0601e09431d6a31719a695d9682159ef62fecc0123e24f9c0652fc9a6eabdd3fedc1e838ca712059904057da1457bd9df11d334562441616726c944be80184a8620d59c161c30a68c82a5043102c4e18250dd58f913137ff6d8429561cdaa1623fb22901c5d495182e043e34fffc757422ce998ecbd3613ae9b836668dbf55fc0b1188910078ef3e6cc86f691b661428b88c631b5fdf4f0a1cc253facc3ddd74152a2086c4b099baf941ad81f9a130327d036bb3b17d7a5b4656481c91119658a02daaf8fdad63c7647e950b9b0291ef4505a48e2c5622138ca9477de216b2eb055021bcd8259f5be068c78e297b766cb3ccdf21b1401d831beb19f7d8d2b280232b5aab630ef83a8467f9e69e94423dc8d49e1bfb98c8d82d45c14758073d98db3de10bb9628a98e9b2f4b1ca4c76f8024dff46d0f567e16d1e01fa5305c1d0876b5edba58b1bcd85507c4dea3abae75344f39a8b570024452619b6e6725da7e698417c96b918a94406186e5674a17cd80aaf420e7b0a27c59aec4dc22b3112962593fc8cc0114f73a139159d7f22be55213505fbfcd2923dc5e3c7615b3889bfce54db6f0a4873502d3a35bb982977318a39bbd516e1d093faa0aff4b38b4702139f5e3ecbb3d2cbf8f476cdd59f39c74c8dc2d2acb2af82c6f231cd982bd623ade793a7df7134590799c884d5a8de3bb2981f0cf42099d5bbef8ca061058c048e79b20768f10f820c5ff2c92ec719cf8c4cabe407467014705290a6fa9bc793c01c68bcf5c46042b7c867553a1e575acc007ad1de4afc966992b93add2c09a022aaec4d99a1b649db5068319234bab0ea9a13156bdd2320a63374290b147a7fd9927ce0d68f16e6c189fbd1dad07540634e4e9cf2dd192ca1943f01462ee0ba0e09e73f10759c693997c78694c1a8bf5e76ec7ae94db78ff5099ee822d53b8ca333650a413e28cc1978ddfa6ffa3964677b5e279c6ffd66200f50b2e511f596c4cd760f78e24ec9bb2b7fdb8465a07bbbc4bb4b2bedea16b74815b543264a6bb5f855bda7fe23740fe7474b0b649ad0b7bb2b9361c88bd4aa9eb001cf837f6818434f29259a0acb189071dcc931855d07d9ae1b16ad198576b1e0b06f60f2e71706fb799f21f1f5c69626142ebc2e1c2ceeeda0d43c2d28aa667b8127d56d3da36cfd57794e3a06abee3838af4e1efc772dbc70ff0c01eb1b5679bab05ac1d413ca7970dc42bcc00d296e5b4e9bb6549d10fb3f73491b161d9e15a9fd856822096f7fa6cd39dd8a558f9fd07cefc6a396409124fde12aa4f616b20189a1503b409eb34620cc24db510c45c25f51879fcf95806a7a9ecadf34e49e46885a504a9ac88347a6e27d88cce64bc2ceb7ad419b27fbf11d39b378cae22eb9587ec96a5709bb6d484e9da92e043d018d8e8c2ed9a0ebc19c881f144d004d22f10b478abefd8e0d19c2b91a9ab0285d93934791a1553b71694ba448326c644384de93807acdf44164c21034d6131db225b41f112aacb7006c7b88bde4a762d9c4e8525b526dd17bbe491e03307fc6508de7074d14e84081cdc25899f6b6bec388116d0b6a6244fcb254a78d06ea2a9a5f51d15a2d1525a89bd361978b441639b53d01a9711be49cc7cdee75822ce9113e001f26f0760239743f5098307c4f19218df38c617464c10d1440bfe51471d9a02bcf6195647050409c8a36383ee0d302194e1611c1495631d3bed2e158d6d863a6022a29db1e78f8b6926d322ce567c4eb691915983e87913a944a918107bd591b0a9b0e554f01a864bb13e3ed42096d34e7948c89ebaa5f3e5a483eec4ef6e68eb11818cca3c240223a1420cd22eac1ccf1eb447efd95e70670f74363c7a41381707d1be9b0fc33f46ba7cde4acbd03a598bd8f05a5042505355a8a7a3517911d7d503f06c93283c8b7d012cfdb65a5ab72f4e91ce89039b8d3afe35ae8c48f76be18aa84f3a77f509c1da103ae1b50cff2ce8a8f42a34f0996286797d6b60db7c70004be8ba4f033d4dfcb14b95b149237f317cfd2697e4aab08a7c3351a46c89f2d731a959594dd599e6574637b3a02b8930f42b4c35e04a525327b632b17311b56b1d1faadaf52e08ee5210c58948757c035a389ac22d9797868bd2b4668451575a451cf9c01a61dc3b7607c7f2c6e8c76053dbc84033cfc291f7eef3cc4069b2740872850907a614916f4d8dc25e39b64692169c26bd51e514cba822f3c6616b3041a0752f51a9dc8dda39f94b20d94cb4155a2952977c80c6511a61aa9314862dd37860caa780d66ac6d3f52a377c8689656e274316a1586805d06c44ce3b2322892476ce27a4b52fc897dd156a3d12ee38b38dab6a1f3820a9a56daa09f71b890c180075074a7f37ffe089111d4ae60b822353bb0f3da7ab16cb086b9908dc3a891ca2724e3b17dfeb34ec323e5cda45d5e257d2bdc40aa18f89073c8d6d2a577e3460179a6d22b2ba78e01e2aa9f39d1c1ffa13efec5c082646be82ec2298bf1acb13086039f0664e889618440916e8ad072115a889f47e2bd4975a117203b714c119ce292d9f0947d7e5dc4ea8b445192d0f22f680ff89fa518517b0b11b069e70e9535ba65bcbb30ccd145fc470770947bb10db211daaf4270097cc3cfe401c650a6adea2aed6fadfbc08d6209f38dc671c068bf6da558adabb2cfa63ef2f15dce174b70179662fd71805d3a2cb0c77b66d80704dbc559449aabc9f3ca5481de5a517b87198570e2d92694463ff31a698c1203fa710b3ebe8752d068a45ebeb26bb44cb3699a2ff84af8af59f9acef73aea4079dbd5db0ac107632dbc974579e361b266a81872ce1cc7725bd3cdcc67c3a31d921988164f59445060fb70d804188df47dd6da361e06e753c261da55fa58f06052f0645aa8979ec860cff0684de43a0acf8f5fb15d7605d3b5366a17a7f8fbd86975776721c77077ae1c0aec3858d84c32e1404fa1642cc301c3173f7d06f43aa337f31610baa1f3e68fb99b8c904017b9d865de8f61549786e06bb764645a2ab3d496033e91433bcd3ee6edcacd1fd5b8bc1d2b1a1691667c98ec801337501179b9da1db2dca316ae7dda4de6c7da14602bca6c2a748f143cf49b6b8f2853c68ef0213fcdf138718e0a1920ed44d0f253a27945b322b6efd40e446ea8f9a66c5f01d643d6680fe3f8e4460eea82d45c3962c434473ed7849581e0da085ceb6bad400a0ac400a743e9a80ee0a11e870e206f46ef680eeeec880828e1970c28d00cde600d5c809b8ec47c08fcc1a924ac0872e69260ec00ec97bb29d84660dca13b4611ea220a07293f1f1ecb0f128a286790236d1827d014f339b69c9facfb21f5f162b67c0bd3f9b2c8c6441da9e5507236899c5ac860fddde6cdd0e3675ffeae9b97b4cae7d696817d6ac6b3f0db8ec35872daed80b970977dc0acb6e57c9d56edf3ac8efb62a001a4e81415c85ba74af46b8946f02ef6d5c671d2543d32d72548db7e554963b0e877b71d54dc984e15314923aa08dae09f400b9a217e00a1a45d48be9bb9f2c37841a5d6168f40c49c112aca1ad910d0da1d1866e1237f4cfd7d00c34f06938d50c5a633a4926d470379ec5978930584f589a5458a8068da5d134d69e6187bf517d12d786794d523e7f67f66d247a1e8cd5615a8a139f752c85df3ca88974897194d71722dbda21ca0f874816fc7764a8617678887c20dd0fae9d0d19a3cf4445c909ba0009ce482e72265b68f9b078729527fcb5ecee9b6f8f266c3ace35f30fc5d18c2d6f00cd693932cd54ef65fcc0e1b2a6a1ef473fbe81ef257f24c2ce4846ca371d7f73cacc8fd846fdcd93bfc44a9b01bbcebf9898f39337393ebf53f0d13f51f0ac1b68beda798436ab1064cfb36ad14710e874735f7f775ba724e0890b0b4c4173083d679c39d7dd31e7565fcfacf1a8873dce4f7a22023d47403e3976d8d805888e17008431028a8c6fc0e89803441807c0c8f805908e1b80c258018e8c31a0e8f8022c8c3920c838028c8e1f00c3b80144c62ae0e818012a8c2f6064cc03828e03c0c2f80148c62d4074ac002e8c1150647c0346c71c20c2380046c62f8074dc0014c60a70648c0145c7176061cc0141c6116074fc0018c60d2032560147c70850617c0123631e10741c0016c60f40326e01a2630570618c8022e31b303ae60011c60130327e01a4e306a030568023630c283abe000b630e08328e00a3e3831b5973dfad4363c27106fc192700ceb103888c5700d031025418afcd594817dfdd28c33b474fdee988f4ed8c14de6b04e48d4745dfd768e1cd4741de7164f4fd8c18de6d24f2564747df6854e17d47236f7e14f41d4616de6f44f26e47a26f6574e18da322ef7b34fae64611de3132f27e47a4ef1677bd39d9760170707c0378c60e4073bc0040c6b0dcd0a33ebb26407cac0047c61850747c0116c61c10641c0146c70f8061ac6d4064546e4f14757ca1d8b4ba0b917f1ba345ffc548d900c23ad5ecb58bcbe8def35707349570918dbfdcd4681a5fe88c72f6b7563ab8a28808e61ff2584984dfc694d40aacfacb2af239ff8f232251c1870bb1e3b9ffa804cdab909205a2fafc0cecb312c450aa52c8eb51be15da1eff9ea09a093c2abee62c774967a23f722ff782c7510b20c01a679563ee4d6e6ab4e517469a4bf96dcfcee265fab9da4ccd180fc0502d58bc77450b370140790e7416fd584a0f1d936e295757ee578689d0ee62c787799616a5248dac10798cad3c74cffcf4592585dfee1d2bc81b7d25036a60623da83ed4e231091642fbb6dc5e231b267dba32086cafffd09b486410487dca1e84a4cf8a4e342217cf1a20bd7f66536b2c7ad456228f2445e3d6cddefe0d665ab1c9c214d853427f7334f9c3c7295f4b21a2da83d8adcca26997ce7b03c5b4cf93774123e5eb8c478249ac677a815eab3785b0dd85a65a96c46c7db927264b4f29f96f41d70653ef1ee9477fac74a7425d87a978d8fd7c680c10d413714eec3fc7fc384cd46196506fe1c1f682ff808713c152f0a6e9014054399ea63210d644c41a878306d0d7faae4d88ad63755740b40d39c51945b378dcded6e9f2147f3af041999eed1c035a4984480ee62aea6f9d38945976d23f048d2fc37b034fd25055bbaa8a8c4be48381e91455705ad5a421ba09488c11ea8a59faf31ee45c0c75035e4a0b5109a8f9c0f457a696ac268a5b520594c7272f36999d9043a6638b423dcfd419cc2031e65af97e716389e9f13ff4781f9f9b448509a23088eec4ace0bf27128d604f8b5a9f5d7ef0c42f3b97f1d36f5a26a3778ad0d905b134d3e0f809e3a03d392bdf8df4a2394763d68a1701bbf6ddc0890cd2c6a7dcc85c097fdeab070929af25fea2f1bab5ab327833e7bbd345d2378b4f0063b2e71fa4a3b1964340f1e2a0470f1e679de8919afb0f0e14b8012fc48ff8cb91faf0168d50a72030289a30c2fe33ac790d3609fe0f8ab12c436bf900f2c15c7fc1e3c771ae06d3ce3ac8d94aef9c64b0cc47e4df2b1a0b9f708e7b6b5d9c818b5d59d6c122594eaecb6a18ee49e2af66645ee213fda245d1cb8ac1a8c2e010548c04920a8b380e0d29c9210098b361574db0f503cfb7877b50775f57cd8f72d1cdcba96d913c7ab97f6a44b4286e3444f9c9464d974ea8dcaa9bfb90dafa00b700ddba18c0f59c6144c22fc53080c5277df0b9f8422b62fcf049401c0bf03e5767a061a587131113b5ea34fc68777f30b69e77e1343d1ff443c200f5a8d5a5d8e089a08cf51e7046a0edf7618d5b0bf94c11cffeee6389931db8f899697aa4aba5c12efd79b5c535dfa8c517eb62534471b03d3a4d4f81f01dc7fc022cb5746a3704ab57f02113b417f6314db861bdabe8a18bb1f8c0f99db953799383179b8604b393543a1300480aedf4172227c2774680c948e6c661eafe66a94242856660738c8cbeec73038b8714d3a2c795a9010c011b7eb993409c4bf3231cac1db6000530498d2986a37cd0192c427a689f9ff95ff3987b72e1f74114d56fd51cc442be83d2fe25f4acfc5aaf9ebafe6808537529ec61c4dba106444ab991b315cbcf9b4b64845aa827d5eb30dd5c12c2dd69c167b645391bace88dd98706f5d7bd59ed57ace0fb73dd204130faedf951fd4c94468cd48330b1adbab90fb10226779646810914c1d7f92599423fc8a4ce7557165c6f0b8c360511d87f6bf7e8028eaaf78f83b5d9364468c55ec88f07aef394ab0a8735e3243f1636ad4439488445f10d3cf8c1c9751b70e5da12304a0bc2400267f823fb4d3f1ffe003c8be570c88aae25682c01672eb7ed960b7d79e0b3b3b6294f00505da8a48c954f2e2cc04fad1af2f3d4523b6ac4d16afb6717204e22a60000fd7b596fffb6095cf12e2492c7d4f02d958926403f0dd003895ed68772236abce7498cfe12809bdbb6e8f3473eb7accb69cd3f0afa97434daf18765f035f1e8e5cff6523b57e03cef2f73cf8b8766273b988e62e9432533c347922c70e336878961ac29ffaefe67cd3a9e31b406776c5f54364be9f6605578afa98962dfa9741f98c75c2954cb7e6ff68f1cc4beef22202ed7f0056c5ed66669c2b171286e378e2d1bb7b9c3ceca395e3b0defeeb3bb095158b59a02a95878ca48f1b8794b7e5b8f241cd1f02569fe8df1d8b6383053b91ad8c28e11df80a06f90f83fecd97ad586ac9a8da27b9c22f84f9901147275e39773329c0f7d99aa5025d9b5c55354da8ebc894e1eca246a3260ec26aa220a4cb26032b7858e3f45f00f863eb7df1b2527c379ac5dfb23c4e584c10e15df41a0fdeebc59d43409f34713e67ab7d23c816114efce2e92f0ada3113b740e784a7bebce2f7e387247b160b34ccfccf57e41304e1299cfe79799f4745460eb8c8cdc18732f703a88bd25d9927f499dd31ca57f1fe52c08a89d7f3cb04af12541def1cbb14dad87f3261b8b14dc267237f89def7692f316242276234eb7c1e50bb38e7f2d38cf09c85184b1bfaa7b68d4d4bf78b0d2e992620a983ae5f03356003a10247679c7ff4a47fc00fee254b05aea96dfdb3ffd630dea7401c1b5f8c8cad7ba133bd7811087a41ca1699733876657e724fab327afcf5eb54fb9f45b06163d18e000892f157f6bf82fdaf563b74bfa34bbebec521a2ffb31648df2f269dd90c8abd656dcaaa5f672fba0d6cf76e0fffb6aded23e32043c59506390b185e53babd48b04c8ec32fb2533ff8ce621bfa8af64501c1532b00091e4c237f87d1f231aacf984e3bc1540660f09ea3841d1e927f11e248f71e527e4f94883e1205ba1c1b1c736decbb853ad88873ccb38c13dc46b140e99943d156978346536153d9e688f513c06e96da6fcbcdfab024247b446d1a7c07059ba6adc975f04f2cc80ba6da983dd8b07e5391f363c58df85e344a7b1802b680242354d45073ff50b1dd7098c34675efd5b2a1788efea3c76d77dba3f9f4f247cfd6996d63de8b381c24c91f3ea8c47ef33a789a2aad437dc7184f4212f8532879c13a1cfc0aaf11568da213769e1bdf811e6b2c591c9c18b2437f91c1c6c580ed6bde993c729e29ddbf613bf70f6a59bfe404d15f91b865504f932c333362f3e5896d0bee85c2d7f73688349952506faa1ccadbcce991fb728a12fedff9a2cb358ee9498b673c3714eacd3473093268525a7b2a9672e36cecbfb226c659cf7200e97b913e274e3f753fa03c0ddd17254e9d5dda52a6b4b9d69d1aa8f3b3f4f478e10c25e03ca192d83a4f0d0b9defb17d1d9ecbdbea1da8cf8405bc377c2ca92f48a13360c083008c1e34305c804d28df3ff20a9087049e51742fdf2f7e3ea2db7c65e2e2cd5e7cdd535eb02f1ebee4f07488de8768a18589f3e03b39ae77dd1d685290052673076d4a99a3e6a4746cf0a735e9031ac32d0ab6250b5c5638bd7b3874589349119e6a8498e0fad073413949c10dbc0479d4e07fc8d5a3fb2daccb3137262447a24b9da8cbb7e4ba7fd551cdf98a6ad903fd64d8fe63ec6762f999c3ed5efd2e4c1d0b197c2ee176d4bd7ba25649c67e4c66a1133bc492164422099b06fd7e5803ea707e425def08c6b844ae89d948ae042df01c196f5191d79a4cf775e1bafb41a51ce490ed928c7b55e7978038cd16977dc9e092d719a2ae12dddae9ec72a40f4ea3e8c808c080010ea79ecc484b173a3c5a15e9470720e51bd895069098a209d5d000b6f903f966ec725d5a6ebaf888a63ccdb8b60c2b727851e27ec2836eba83b6b45e620645fb8ab41bde9a3852a1ef8c8847a77c7d74217a83a59092b3835f812d44a5644862fcd50b7b77e944e7d7ab2ba74e97c90d589d8f01bc7843eb027a521f9e972a16d06843028dc4adc082746d0940d503f4a84a85514eebf0d8cc0e33c201a636a11b7f05e16a7ed098c5d323ee97ae1b8ddb1851694697380a080ccd6971ecf4df12e4347db5e32849bb7872eb7481ce3666e70ec501429288213d1339fe0f81aad5975dbe6323d75a6033ec7db97f0b330d454f0b15c51432bb96961ba2a6ef8b1075ad28b37e6d3afc96a651160eda982aecd45a0127e38d2e5d01428b8ce2bfb715a4be6a076e36ead20c27037230873ee34d17e8b84246e78b0ab314681d7d73ceba8859769d1bbd17defed32d2a80c2d31eabf155e1117d25ea7f09d342ff4d7296ace3c4b3c90adab728d8b7e8d91579800b0b9b7700181194307bcd1bfc71cf85c52807e75bd50ad37f8e74007224171f3e5abf867de76bc5358f456bdebcfbc493fabd0e9d891e6a34e8346fa4e79f33ceba72c37922473b841d00efe9b8be71f2c02ee2f88d0e146339504681516225ad792ac8a0958c9848513ea2f1bf427610856614df33f3deb58a80ef1cb1467944ba550fcded0fbaf87647af39c5a3ef4b38bacd7c8e1e18cfd1411b3ecd7f655430c0f000c007001f25660e1ca86218a713ebdf08a4fc263f27a7bd28c4cf201a17a983bb7b8be4eab03ac8abc6fc8f55b24f5fd96124fed0c348fc65568cc4ff1723f1fb3509f528c58645e67ee887917889529b2c43e3ff9ffffaae8b2a8bd41d4a4ca16fafa05dbc218ac78a3810458082d7e09ee4d2b208f983148cb4c028665f4190be08035fecb3ca3a615678fc095994471bd3ad6f62d42fd986e51a8d76e3445f943e7a471026e98f161286e2e0f830907115e9f38284d1ed98a6ae8426e786c5d9249c8a3dfda18753bd862cdde46bb41d2711a678769973b67add06ab9246c3bca3a016204179146781855847e457941ffd14926ea47b1fe73d440ec40291e5d4d7d8c7289218191166f7580267817e9c9df96b49e6b8e8d938987b7640d946f60a729e1bff9561043732ebd7fcb93af9f49302234038a83562b0cf3d5f9338016e3156392b91da0d1e56a125298185ca3298426b9a27a020daa0455e8ddbc97bf3fcd60019ae474c182de0ab7522d6ec7e48d2e9f03884592399c459c9780c916cea55a51c7ef5bebc5112bcc36d682b86108b75e7f0fcdd9146033c447a238db7ce7ee1e726ec7c99e06037824e838bba9b1fee861a4add850b0cdd8e16c26203b7096746a48051f459eb606fdcfb4a681667ac47bfee901355bac57848ad469ad096b3d7168eb96861e5cb335058bb3a68e4606f0c491e7702a5637189dbfa7895652731fa2f426634705d34003b12517b5912c8ac35edb57d300e762a33dce7b1707c7053e13c0c0e96e6f10ee00853fd25c804318ac874ed181998989393bc5e10354ed5316691be7c27410a3a902f80a2e21f8d7962ba5715b8f7b1795696e0b86cfac85a1251ec023e4a8178a28a795b4408e48d0c4af3c0a991548b25d25fb637c168ce983dec05cb2cc7fa6883f6e8def3640850d6951ddc07e132e63e01ac1c9917b442e454a7c73c6ab4b8530e6a461ca2b8a03af5cf7aec053bc1052f648b83c82b099f8ac3a84b7e8014332a62a3ab499ee6aa2c8ae8bc7724b68922c4bbb2a9cbb6b244347eacf2f30753c52e6c03feb918bcd20e1ddc09fa27b0f4aa2b0c8f77f598e6581e7b954c95e44542e9032de180e3fab1585d3f2552b4f802f4371a3f250e6604131572770344dc1073425e13cc8e48754e98d677cd1556a972b0d46d62e572732dd5e90908ac87e6288343c4433d52fbb1dd4f6a0c323511718c69e5de518e8cea50915a912e1cfc07650adf23e95292b12df08aaa18f308587036781ad57588cf92d5abd9dae1b54f7632727111b3220d3977370724b6f7aed19854ecc637484ca08cbda09c92de9621baaa629d703bdcb58c5857d0147430c15606851d327015ddccfb1d27702d52e2b669834cead8a1ab8a3f6f56fd885d50d517d326f4114732fb8582e4cdd6ffa460bbace1648e590f5dbdb949435dd644e8da52681cd63802c6dc4672cc5ca886bf02e52affce3c53c4a7410182dbd06d6f4a4accc663f387ae050a9234384b713ec2c8d1c654b25604f4826c9770932401b904d77fa10d2087ee76303dba903899c70ce325f529a6d691db7c6d031fd8f65a29b1920f0b758d206e7966b571499bc043dd0861dd183a165330e7cd4295243d43aedaedfa8d70d18f7ea79905d1a07e9160a902f4cd132c751f652bca0981452d7364a0cd922063a3c5ca0608100429bd04b6e16aa8dd1654e92befc1a2e5f52703735677fd187d10fab5aee5acd5c8efe31100c4057857b448a93378e79e3beb79cdc8aa50a2c388b8628b38c66c9528c2a2fb0ae88f0877b1cefd801893affe6fb51ded3539a9d51c5d6b37f546b98fa90da8d1d9e3a472a017a6027c15c9e4db34f9a646c2715cd52df2caa279653e2fe10bec29fa1f207a9549d52df0ba7bd676ef402f4edbd850b355d61eb43adb2f8a757bd71f09ba7673fcff146d806da1d2aea2675c7c4000531a2650b96d7dad3bfc33f1b601e9e8d2448711bd4fb787be34de855d104aa72d381b35ff618ec8426cd49948c99ac9730ff2d5f773c574e516b23fb3294fb1f3f5dbb0218bbf4b5965c04beb5ca0a26eabce6f7bc3d62ab91a3d00976b38b535846a7ef18689de96c0767946ce6a033d2ce346c6debb05f1394bbf91fd668e87b8c78f8d67d6ad8779d5ea64ca9381d024aed15e8a6a4f97e3d83b497b1ee00497029c6d47ac42584bc72a0201f9b1c3e5de2b8dfbc564bcc841689178b4e145250f878c3b54568c4aa9c6b173e31f54eb8e9bb81c60bc14d734bae1e7769ba89303487b3d8ab33024e7bfd957cd70a6d00668269d71b9ef9c0043924a0b441793a2d0683cd0658d7d8891c163ab3d8462b5d6b1269df3fc98da2e9cfa3840d3eda7f6950897ab5e359b6cfe244704c6d7583c010a98fb28addb9dcd86f855ae2df28af9b4e8ef34604cc5697cc745bf4431a919dd95b32cf8ab86c7bd0d2abca9c0e7b0e1980c9186311a704330de15babae2c6d3b8ee056ec512fe859aeca0eb81ef8bec09b4fe4a1adeb02b0202b53b5598e2383b361c2c4be1c68dd80ef23c83304161f05b21965181b5f73e78832a8c09b737a04bba24b69df84ff0b4997d6c7452acafd6be65bb3475593cf4112a3e9885420ec769dde73ea34ba3e995c32022586cabd7463c2f540a08e2738041937fbd705d1ffc1d30670fd3e42707c77ef6bc498ac666197238fd704bf64f1e3b211043cd3c69026651ced7fae52d2c967c80082db77874842fe5c029f218bb135529bcd27acc65d2ebef51d5391d07515ba048b3ef4b9022516f405391b8585cc405039d6654195f1e67628161c9bcb6eb79951a720b1c988c4a01841256544a865f5c4a2c358d088c211b4ab50d6becdcea0d02739c795e6071953e6a47f5072c16b8d47f964410a14184a5477be815a71e3738544fdf59f4a00cc5522773dcaac98b3e46caf165685bc0f3818490b08971dd5ab8f61615e382cf56322212f806656fec1c150205046b084dc8b81e61e3510433b9ee9690ef0d38e27715c54fbef458869a65efe815c77553f796a415861196e5151ec8a3591047f3900b0ac28fb25c7bf6d5e8d05746898a13f35d585cbc9f5705e774def374a216ae2c493a3368ed365a2f8c4d2a6e1ae56e9f15b6245810def19314544c3f05c392dc17ec777bfe430edf542999d78b6797f93a55beae7343a7051ecf611912cb9ff5b05191669f5983dfc00444a2bea8aff5a04555d052b0ee8da4f1c048d4bc0f0ec2a2075e6dbe3aa6775ec0da8b53b5ba5814e3e01f87b2fd4bf4ec17adbad8e988e5c8d88d6acc10532cabb8ba5180cc1cd9be4a4050b7bac396b79d55e583511178d7086eb18a427067c2e5d93b1642c752f949beb2b72cf3edfaa12a437c4f87a5c044509dc0256e000613b4017830c189a9fb74437a5789d2e57d39215f4b8251c217a2fd3d5c3647ae6dd731bba9b5a1b4adfad9fdb021bac325119e3e237566c4b3ff48d5aa96d6872a8e8980c47da064cf147322849bd330362fe106777907d3d830792b14f0b5c115b017367543ad1f043c2412d1727459213db38219eda2db399430a6c2bdeced61494e03757fde6fd752aac6795c98fb8b3e6c465db9c09cb8864b82e19971b88ab138a07de9e2090a2a8eb69906b79ee90d72a56f2344e1b400c86a009f12447d5c2e0089039ce9fdf091c715d1f846e72dee131552567af66df435aa11475be50f70d4ca0156afa9e40018543a94878c95540142ba70631f8885390150516339e7e5936f5a39a38ffe544baecdd1f338b0c8c71ac982c142af25f5e2b96e6c49a42883f401b14ffdfed534e53178ad32bf8b1bb8366eece2e1e5e4d27198c7141b2af8001757a212d72b22556336aa9a0a39d8edbe69114788f7ea7883e5a61815bda520405b9e48ec6a5d32ce66bab7fd7c9ee2f5acad6bed1570900de45115f0d1f7075a30303c98d9f68e063fd13f3c0119496d96f1295a47e6490e9c4a6054374ddef400ae8ea4197a56361c9989b2f4450afc31904b1f4208b69f7fe2240ccf6e0302d041c1efb030b1be9f82ce966fbcf67a121166a7fe8b35edd881601f30d36bd51900b84de0314bed26e446e8dc996d24a443a9c1c35abcc7cc29d732f11bc5c6fec2f8c463c9bb72ff095c191def14519ef83c7cbab16a1c2e019f978b6a3e903beded196443c32c77d627982e2fc451d2fdd9fa18878aa7ef4e3642cf612c1bcc842af4c2b0255350ab1295ed1e00c7cf421bc9701fe3f42680085593a5154057c32d156bc1ee865f2d06d49486fb879a10834c666ae2ab336d437596a428a430079bb000046e9a9984ea3745543a98a7109b8ca72dc3c262ecfe145184e1e8f1a5e813d3cbc1c3c865079885e8d162a087d004a3f913fa431332262d6eace2dd724d0beff5ceaa642fbc35e745e8d0245b2fb252011464a3ebfdf6d49ac937146c623960e3face02357ed53f81076416746d9a8c5d8381b2671c81531489692f7094bfda8d1e34c021e86d17dae670b97593509ea7e8bbcd06b83a526d2b775da4b11da5e41dd3b1fbacede9bc2cff97b0a1243e9ad2daf5b641457d30216423814aa8bb44d25a210a3b4656293650d83752642281fa1af019d5abaf132d9dfc2ee9278030b2321c25298b88c016d9f4c05bbf962866e7afaf5844f4bb4f958e1f55030cbc4e86718540e781ac282079e785bcdd651b3b29508fce045ca19fcafcf512ffbd8137c019cde6aff851f05d0b4273a94213b6cedf6bc37f4909c51b00ed153c5c7d66ad7e0f1822cd21cd59902a52ec8acb0761e3e7103ab830bf4a9b6fdc964ea3a7a99af74f67285ff976b21ceac45d93ac2a9e40cf8bc4dee98004f71723b11c2e424ae6532e495737ea103960518942b9f01580174e7a21321c615988a865e74f8acad9ad22cf926fd0aa47b0c151b0967ca5717de000461ed2945a9a5ef59713de98e12f663e0e67bd5231234995ca002a65767633b7debc6c1be0e651e3ca30e84e96e409bd87cd50a3bbec17fbed889905dfb49bea7c103b675950ca06f68c3ec888d192b69fd8f4cc7ced4fb23315849addd0163b5295911cac7eed1b36a0a796db3fa4e91d6b418900809a568ae3b6e301988ae4cef63f149014fd14c1244e1b594bb0dbd64248ba65c24a951a2d511b6fa0142ad3d313e04e101a2f551075c9c64591be872ef7f6097cc3b09b857f1f2787a38a90694ba93c19a891303bdbe3ca12d261481092cc127bda58caea2766a72aabe53a5bb09ef9e36039c546b9ff17dfaceb7d494f288495834be64d8f9f874c73079291f534ce67d57c0d21802a7e7e2f6738aa89eed8c3950e63de39c895235e3f5770b78fa021d6d01b9b5f7a3c715d5fc924622cd44a21e329b0854a55e062a9a0513b94614ac870ebeb1d66ee4a9705978e9e4f16ef74fb49608387f26df8a780bf8019bdd9225776a9bee016264d2d59b0765f4b7826ee9990a7bbaef5277e209ec29451ae1ad2e0543efa1e3d1838b6ade4e4558ea790b0ec7d4990e5784a67d8c4dbb601c1c04988cbb3042c7ddad9d5e40ac2cd613c4093012979614cff867b517b397dcaa1e42dc0a577f7dbf142f27308d488be9153f1b0acb80f6cfe98b97735d8e2759a60b6c82b4a1e2de7b48b3e7005cbaf09e57223e1360ff29256c82ffe3e0b393d88bdb17ded2e2d7dda1a30b237dd746ddd9aa6304533d15f2b439018342a00512acd0a6ef1a6207e559d4d3266942086b6ae3b441797a26cef28118b4d00ed81f77e8726124af50d454f2ece3152e2a12faed95d6b68c662aae886d4a8acadf433583b37084cc9a96ea027b2251bbe46b47d961cd206472cf834abfe15a89cc23670dbcc063fe8833be0c066492c0db7e4beb122ecb7f1d75efe6ef133b9e68601e52c14969c3375864cc7f765903dfaf51eb9c2f22895b25b6b320b275ba1b75e10bc11cb5d5453110f0fffc856a1c07a44e699eb27526aeeb2c945bd29d23e3be149e7b06b7940872fb70a72e99039e23c4cce500a5198cbc030e143ec3af52f84c760bf82dffcaf4d8daa73580d12f64c2aab4d238b13f99a746774cfd266f1e900b6047454825069be3af6ff075ddaccc19c03fe37d7a7d12dd6c43b409c9e510595daaea838302b1d97eebac1f8653a851b4e65537ea1f40cf01c2b84d1095e8a33498f9c4fecb9d3bff9b120ddff77e9241303a37bf8f46e827b0fc69d3cab2dae4bb8026bde7ba5817f96054f86af1e233b11cbcc1ea3d8b705027f084783ab21fc7c12d4579335e00d2f5260e3be6c351183865f7017a712dc36d747544e904f847b4d4d1f44262aa2fe43cc0cd919129b9b2eb0d45e1d42216ecf2dbd0cfdb75eb75091951c92597b73f41cd03416cd080d12e3e5912a8a7eceff9c18a6dd0b95efc5a1706a8c182ff0af967598ca6e180fb854b0503f8790f72e5f48c4618c1d2a0c2c3cae8a187da672d08c9589717576acf7a9cf669b145f2e2042ac7594be6ada70be629abab2f4d2ede4ad95baf103758f5eea87f6f274ef8e092ef6e8378221896a81d1b223c40a45fd668dcd205c00d2b444973b0133b5639419533db3ccdbf0fdc8ef30d27c6105a96c4afd85acedf40923dc6e8a93f1e38faf146414ed9dfa994f486673d92fcd35972dcdaaf7adbf1e42ffe81245a20cd3a0c98a286e725721a40c34c00883ec13df6c5d9a3bd0570d17fae8364647d0705df9742a2c78d7e39340ca613ec2fe55c785f7f603824b3eee7219ad4062881e885f7c6240dc57564389f7fab8b311045f36894cbd9057def7bd12ef3d5c6902f0ca383a1a9de0bfd7ac4010757ce7c5698af3ab450993e44fd262aaa1f8b400722598bfd6a401b76cbe33be62c53913481fbf3c5a1b4a248b8ce17e95ec29e65c3a6a47a8d856929182f381a082d0ea6e6cb3b6e55d71cc09ab8b912b348274a7ae4941b101bdde96d1bc874757b1a15e14b3ddf0c82c1ba6c521a7522ee949fd50220efa78bf4825c29209db74adcbae0c3b91ea36c33209e17684c6c642f5d72c0d69b0cbe39bab235071cf65240d2914ba160fd484482a468823339d2c149c5e3e4de2c04b7aa34a1f64c951c7e1809402f8543aa78600f7c32dd08af903c41dba7434ee86d87c0a288c591f90313b77a8eefeff7a694e436c22e0745897c15e63f8b5f408bf829eabc1034f62b808aaf2ce16edec6c91f272f256855efb28f5d8474709d24db7ce8d8fb4219942245b2de19f63348c4940cfb1b8b9a81638c61271e300879921532067e0be7989cf232c5384beabac808dc0f395993a0b8622d46559899cb91c9cbde6f0301583075faa2067aa8b058a0f3047b8b2d79483c36b1226efebf4976175700063ce7c30cae5cc0005ba0cce619699632a2034abd4ce458dbc332b138dfa09763e5ba1270b3823e7c8ce83a1fc6f921316afbe3a2b451e966fca27a6d26bd83ae8e3ee385dae3d580d45249f30dc58edb312ff11cdbeb26c83f13c1f0b9a70020dfa5d36f8da45f75b54575c7e94834b162e5a76bcef8b103eb567391990d9ae9c1b20fcb2562c8d456273daa24a5123250682f7999897d3de9fd0803ff2e7ebfb17b026a6495948602c507a1133d0d1dbdffd51e4f449b33144469c1a34ebe20f99b7d0eef611f6ba41a94871d3c465ac27c3d7125441ab2393ff9cdfa9833b421098277bd439ac5423d15fd31dddea003c36b2f36eee4ff3d61c1ea80892fd8adace58b372f136485988813c32a8c6264dc775a0f91750dcbaca8007f49e2e5e00d22e75445f9a1e1255623342cc8725fcc8eddec5f9915cd95b536742501dd2804cce4cdc83fa9676d8db1231dfada6fb922feae47137e8427e0e974b11f752a5c9be1a53377e425f00562ff51c9bdfa93635f5afb364bd129e6d628de9e58312941d625aab79bf73f859ccc91d336963be8d4758988739b6bcb0cbdbc3d4fe0f50df5d4c98fb3953ae6b85fd674e915798dd77f55afe02f3223408aaed0eb99ab5b730833da2c39ab63aaa1602d50bfd180a0fc24e6c3d6a7e8fbeeb097a675dc86e4bdf2ae0e09276e0c036466e494229b3a3f161474b2c3f6a39ee71941a0036918d02192e16712193281659f858129257e476248db3c2040f4bc952d197447985445fb301edac92e57045a2bf823ccae9e41356345228b6a5814e954ed24c225357524dd437c2889045984756692ce512680ac968088859b930809710e02da4a6851c369f2d6d5b82ebe9b93518fec41596a3d12f0174ea90a441ef0d9af2b8459134415fab66d3f3a37e589ca06450575799f33a112a222e07bf1e46e1044017099d5cc5775a4881f4810ae0209c4674cbedecfb692cefdc283ffab10979588acc97ce08d06791461df5e3212610e30f60325e7645881574270f1214ca1130180739ae09db1df248ba4168121b04031612760daea8c99cc2e3184572d9623839716ed7822767a26883b443a5a083cac4833489f41a556a5bf140f181581deb27253702068eed0d911602673ba24b55bf623609eedcf87c1d9fd28c9a8d86d096cf3396ba230d1dff2442913f905a4a6b33a4a9d74f82b7e27b7d5f7ca91e6ed849dd98357c02976414bf54e6af2d2cc2e8c9def3b34b027a0203333eff6e4c88f6c0fbcf1a10e609205b67453a360ab4513df21c910812809411a730e908ce1b927a3873388d3d5444c1c0bf43ee51d778c0e3654a100b1d908e6a64920fb00dde0edab2e31def6872344079080a0c6386cd2b84e03eff2df728351a10797a138d4036f1c06102f6ebf160c30bddc3c111f81ebf268d416ecba9acd0b07ede024280b1070518e001179c8cd42718b2a1cc703a86c2800eebd515607c9e101b1003ff60600babf1da73ea5fe0d81c76ab157e6a5823070011be37e04ae017727b707c0349f89161145d1ef423a4f96122c947d8606ec82052b12d09a2c10e8205c5415aa9764c0d1f3ad43eb09f2e650f41255e774c0ffa6ea7b08bc46ce9b3add460074a5103647f479880e14c9f1d6dee2dbf0ae043bdc38db2c464bf08c7dd04353fa6d72b07030b95e94b5dc8ddc39f030b2c50e0cb2a80196b9d45c7c20a79d584861b6c4935f4c731a6e109ed71c5f13cbc54fce157ad7cd3529032e1f6e95e6c01c84dc3a308519146d8f7ea9057445e1c95569d87ef8b065e9df48ebe63fab0c5868937c258a5b2d6da2e997ca506a3eefb7aa298e083b78f5df5175ab415b16ed56c48bb9208db0dab749b91a9b67fa40d2bb61f2e616a48538099cbb5041467e9b53bc0634542c51663f04a4cd4b982bd3ae8c0d4c3e1c836c3d656436e90413b88460d165643cfa8631c885e3d9ead7c60a19bb06fb132508e37d4494ed6d651a318ff243de3eeb481a6309de027ef6945a40ac484dd8fd8e172739f02d212133bbe30f30da5ca44d228556448aaa5074888e99cc4c42b7cbd850b3e3cc975706d7a85fcc4bd295cb06803708cb8a4a4412c82e92f3452e2c11d587f9ea6fd0b7f47995a84292d4c9e63b7e78ad8f36363b82b035017b4187903eb8bf87479096fbc8858bcaabcd0d81832171ee14693a98321e095266a1616efc539e7cb28b1aa1e41e3da4b075731ebea492bbe60979ef9d9cb1880368a252a8c66d2efa14d286e0476d2e27cc93d02d65b65a3029fa335828129625cc173f2097ca92a919fb23e2966ea07ce86eec3855e494c15ba9cf02432d4c98a0d848e1b0fe6342ee2a9e7f29c08ddba2341cb743848d8d1339593ba70a720cac310bc75a1c9466903ab6e868b1679d433aeed46c8b20fc5518321b7e5a63f36dcf8968650e32fbb15b0bb60ec5c84d6bee96e570608ef2530846f5121f15ef910dfbb446cfb04844bbc281abf6b18306bc2cb6310ef3a9664d49351b484832018309e66f10784f66f03061a3f855c45bcb6ffce1801fb77bfe64fbc7888899622fd47eeba8596f731585b11b8083dbd83bd9126debd825e6e29e21f92f7fa80578dc22184448b4a549fc5eb7e9936ea844017af18361d935ebe322be780a736b2dcc59beecb0d7522defbe3b24f0af6f48a77cf81cb2d07dd431ce2c1ae7ae77b1cab3f9236d208b265e28dae139831eb8e6dd3f2ffc31e6b07a0bc3d2c9dcaa23f8153d9c4c82f991619a874e2f1e105f7a910e889940cbd8f9538eda27d111fd531521c985865c057306fa0879e995c249617e925490279a53371b839739ed68c2b379604cf82e2d803711361105f9755da8d596590af5ac5a3556f5f88cd82ec16b6613fe0bb9153d85baf79f57d0fcfc270aa7f81f4abdde6ad067659ee392c5199ccf3da6f0821e7ad968830ef4cac2bd5a0581fbe88d33368b1afc00368b33fa1d81bb2bd91ebc4ce6c247ef43b2ededbc1a1d189318b05363f5a13c2af4d5d4517d61888986ff9e39526ae60c2e7f6d744baaeaddf9b0346eed859921ea91368e78019d578ac2b9adb0289fbbf94ab2134282cdc38cc9510df793ecec9bc2ce1d5304dc80dc04ff4bdff8ab9560bd3d55d0e4e7b4a67a331d7f58d83f3ed3419eb71da065f519e13cfd785c991437b05b387c2e625b5bb1acf03ff28615020f251134e78a3d8715af4fe32c500d485316ac13e1ea2b1a1039b0a6c800c96ebfca207fabf92821943379bd520594eb13759e45cf5878a3ed76bfd5bbda83c8819001817a2755ba1f036d86d16e843664ad1e4ea8e2a0434d6168af698eecdedd9101da8c87b2221138d6dbba766e365bbd2fa2741e7bd6350058ea699976075d2c8c28defb68eda68e4fb87a2dc92206fee2bbffd4066aeb2c55c068e63b21e8ac2b56371a7a11ef1f11037abc4a90831cae31294d5721453d4c48517b0a3722d830b85bf1f5f5d1aec17de6ad99bc888a03e5b70e083b913feca85e48363419fef28d26c0e84a449ce963a4921152320058adb60f85ff70da9130ef2c637a8a8e7e879cc62d233414f97e393f356ef70ae1feacf6e976509e0bf0bf58698623723ac0a10a46ce83aabb2fdd5e70053faa14d6f213a793f474b595c964da2aa7e9a668e5d87b96d62dad86499c9769052b2bbd24d69d345345d77ab0214e9e4eb04f2cbe50e4b844b93aaceab9939ed482375d4d713bdab3eb6ccebe25c62b58651d8eb63e7b7e1c3825e90dda77fa654cd3d9ee92d4c79df6a6c58a0b05d494f926a5e6bbfb2686f5056f8f2d0d15c86374009f22a9d09d3f023de272885843994482a43cd71dbbfef36d7ae14d3e6735909c3eae56f0e8179765e1a69f48423bb93517b7ee2b29f980d5ec53929e06e90ea641812ce545eb56b9196d932c4aec7eb0254696bcf9503f84537456d2a8d6c81387fc142a14e3f978d145a87f0fbf2dfa3cebef586fe904ee8a525bf9f77af474cf921f65a7bce9471c21ddc633965a725b9ba75eafebca97a3601ec004562bff4aae01ccf24489467430e4c03857fe26cd009474d3462bd16e3c5aeb2d68a3b3397bacf93530ac179173bbb2bc610281eb4eeb4393e6ea6ca9c03493954811ce76f9891740ec16cee5e1886aabb6efa3290365cd766f5b357efa1e8edb095879d197febc86b976b3b7c0da3d5f497437f5130e41625977a229b4123fb6459e0362c9b6bc44256e9c126ef42cae497816b95f5da3c486b6dcf56860c2a8ccb69e1c1a06f97725c7e34be90752f1949df0d5baf48a3db23a3b58037f8b8f1230a23c9e01e0647ffcee639492d8aa0578e31b15945d8f41e2320edcc8f333ec4b6395ada67af9d25fdba551fd765445241e2896db1499de54b0bd50bc6634375250eeb1f0b0d688f0586b75cbee7780b90b531442bc3adfb4f8ec9fa1ef05d1620235981fb0489986a0e1b7d7c02e730497de6585f904f9d7653aa975e16283fa8227d24209816b89061af173cf908fed34c82e4724db610d899eed7c3a8d3b271e2843a28105153c9b20264e5230e5f3d330a4f3585b410fae311d50c6fe8c59c98bf88e952824939f213bcf3165c7a50f6dcd804667e5e443ceafabacc2b469f093d1184998fba7d31f480e598769bfe6cf2d723354bd1f9da661110e9802646a46e1a0a0262002900ac4d9831d5191f72dfa5ff462b2f91c609d107947355af7e8bbc6144efa6086e677ee706ccbc860967af4206aa978a675264893a1c17c2b3d19e621097c49398758499764a3c0b6d7b181d2b8b32a4b999713e66bd1d9fc2b65aa871e7216066867722130ca6203509557b26019ec6b83a37486fca4118c5653989771a64bc1535032eb84b8c687606c94d2553c67fae08b4d7a60f79f1af5a3dfa824fc50a80b94cf4c377a21cb813aea936d0aaaec3f31f24e9884e7ca890a8a650bba0af1d3e9f3ca1c190ec0d72afd98988b0336e8caf8e25f3ce95c96b207c5bfe0963312896f0a1fffa0cc7feef4d0872dade8978a30ac642caabd3a06b66dcda7835f80f042104cfeafc4a49007470ecec876ea442870f1fdd9395bc5792ddaddc9572b7a1ed68c4d7812e7de5bef9bb060128619131585b53a63ad5f094c7b4bdde2b292d69ca59549e07087931507169f55d6a567d665feec93032802bf6ffdd367242b91e1e034ce803cde349e28fe6fac17286353b372dd8907b6a1019b326001cd7afbee554ec984116299cacc9e8215494f4b3ce875a314bb19025509756e89540580f364d96238ba776693f60182c5376e8afac694ed06512115bdd02eb4a7d516c94012cc90d38fb1304a9ca0a3776c2b004a8d9ec630927338336627c0fe849fa326314d0130e417bc3e470ceaeda32de951c26b6d3634df2247d2067fe89773a43080f8e32332faae975460dc31bb18970c7cdceade985cec3d53037ee28feac0288c547ff28d7c6c12a66b666383d2c16381b00bcdb78dbffdba13ebbe3ab150951a459e30347eb95f37fe2e6324e44d00a229e2c000bdbc27bfeb3c9a1019515ee6f7ce481c7b1a5e57f075ba882a477e53db35603e1e6340807bae1d75a30f6443b4e0e12e40eebcec05209bd14ab5b1d6292f4689720168d4b392a10bcff262e80d675124deed185943ee2c2796cdb042b7ee3303a4a7bb55aa9183e92217de6cd779be6a3083baa987f58d66b7f13ef731e931ec35046cad6b7724dc3b618108670aff4c05568564372cf840ee7ba94ccac88078d1e4d808c2b4719edfe47066a8e0f014624a6636a745af7cb36480c03674108658702d77e424a79b3e22a96809b765577b5316aef07605a75604cb8c7f9ed208db4b9a2e5c029d7b96026f62ed4e1201d51b56665eaa707fea647af0284dbb3b81fb7f749de055daa7342b6ca6592f4c9138f4e9255cd2f0d7ab0bc7088027ed763ca8824366b1e324295daa251730fe080f725385b95a8dcdbc53540f506b5562c65a3412ed97ca1c12d95f9e35a5acb940945e64b7023ca5819071c25475f7da9b3a6597656e0f3b77c0fa535314301ba27b6144a55f806b86c38bea449d27d0b3916c9cc0cb4638b95659896f3f240c373c884929edc467c9aa1a38a3428bcbe5b3e391dcdc837352b77b1169e8e449d87e2a34da7b364482cce48d03a7dd77e3525f66ce644944348abb51bec2e1c8614b9c97d56abb7d1a10805bc7342041fd269ad7ba026ebac92c9a6af994f0293c948c4a6106ec45ed40b8eff06c34204d5bc414f7adbc8f80c006fb32ffba3608467c840ba5d85bd14d53ff3bc09e739f41f53c7b62110044d69006b3cedb19a4445006453cd3cea0a7e8d655ce268249d633d6921c88b51ac5ef7e1071e360612b7cdc263e687aa0e7231fcd057e6e3b67bcf101aaf555bcec1a462eda3ac8ce034dee3e37ec923725d97726941faa1169a8f4b841a5e7e9ab9dc502d092c2a407c758a2f5709f5ab7416abebf27bcf7ceda877fa1aae6c232c8ecc9e8dc1a6c5afab36f5818a136a4da1219f4461750122befc30181bb83e5c3ef869ff7f0e511e4d721c0dcbf711c49580bcbfded6875a60df19fe03af8100f5dec2456821b0e2bf8a400606fe80a80172b3627375d39d413aef08f75889f0dc58443bd372fc7ee13b754edf6a202c17c7590001f4353ebcdf8b87c9243e9145be5abe2ba3db0528e4873a4d2dd56f9e49f29d01a2fc6be2eaf69bed63670707613833fc89c51bcf66c3c381a5ee6d3222e0deaa65ca23d3340a001352e56a1f8c6397ad341f57bf789149cf2767cf80dbeea818204720500b7a1c362eeddd8995126a428a6390a9fe3dfe8f87965aac07c31fdae5b2b9bb661abeab5a8830fc49942031a5708ff2f8e144b46072bfda804d2147226b5cd8e0c4c5b9106674149813d05e0eadc56633cbf1113ca369460756602b2f2e5802dd5af2bcc8497f00ac6618ebafd7463df96c78f6d413d0f725ec33984a336be1e724dea90a10f40694486fc13c441c5b341c9711ef974b1c179c203d0dae785ffc4817e999a1c49bfcb19c47860ff03c0b2c8772c25f21ba0982b0101e04183a2b53c89d4e4f2c50cd21350a79fb037442ac0f460a77bc52726ea1b3d579cdf417335ebbf95e17537d8d502330b7b4b12e39d205337eacee6a0777b42d04e5b213eb28210dcec2f1a11d706ce360fb6216e1cd41f5c3911410cd4568fa5815107cba154ac2b18fad5ec9098c3e1742d3af9ecb28da390fdd356b25d1bf86d70b1d7566c8c3f2897b8c7cab30e793ec6de50b16dd7015e3eb7822b6f80dcb734832bab331a52ccfd70c73d1db99cc38825813b4f055b623e0cd0963c385d5847a31b979d4bb79078cfd194d3d807c8185f579521ba6fa6996c3ddbd4bbf5314ea668fb0032352fe52c7f74b303ec0ead7704e1533196cf67e3b63f7fc6da0c4edbf59e9007b099e15d8b67edfb0259c1fb7c531a0e715e25f59065b9fe438d04221c764759dc753e4775522a9ef0661fe569b210407974d2097e27c551d1972b556a74a56c2f010671610025b9a9cf07778006fa21728eeb19ead90410fdf61804c9e3e6cc383799e705b8a9f408c48788a8c771910300eb282bd7f787e0ed9e2291f4e8391e5cde025102154b1bae5a8b68092c7bdc6a3e94a3f6afefe21b5e1a8e24eb141b3f83038ec75cf088086f341b2df72c430a53d465787ece677a6ac6c01be84c325863a90b43ccae00afb918b3cf0b7a231b16b1fa0844494b2213f4906fe4e6f1d9f39e464789c0d9ff963bd616e878cf99e8390a3d163bb535500c123f03fb67ef69851c706cc000422d251f24e1a798449d8ca6e94566ebada06ff6e499a326facefcb5bd706645e715e6ffa2230db38e7a274cc71facf12d3b559dca03dc82b614328e4da9065c9336aabc017883675b1a9fdd6fb83b0b4b8cfd344c7a4b6bc7893b5d8558c254a1b802090cf6a6bec5b67ef62f711379ab23a4764ee07f8edbc7113da5f8dac0a23edf69c7a21f90bab6a0378b06dc2d36bb779a2cedab0e9f314bf3265c252c658028f438d488c9dfca9341cd11e5867f000e6c750428231d6f28b21d969c141da71191aaf24af26e23184c233f8ef3bf4f4b11f3905535c554044d6a6356a5148bfad052bc1e4f380ff4b1e8e3868d0031498cea558355dfeaca351da1c0e45aa7be97329b4f6e61076fb7ff67f79b7e47b3bc542d301da4141e770ff45be0a9563682cf46f873fdbf5f207ae0206e3e8abe02651432d6285132fd8f21ed0d1650fe213bdb9b6d38c3f87f66a892022d648bf198ef33e35685aace8dfe68d2a3834dbc6d56ddbf74c6c63707a710fd62dbe31fa3481792ce87d6d8281e72b22a11af90bc3c18838085557b4d7392d4f505d27749c38be51dee901e4b47b91c06c768514a0b7f1ce041758d64085473e2ffb4065d7124bfee8775b7c0f88a5cc0ea44b572583a173a4060b2b093d2dcbce7b6e8b985cc5a4c56d801946e9d689e80b3930d894b2cf662b63348ad4c6132a33d7948caa1d65633528d0487690734bc773b58f31046425118cc1708303aa3a96a152651ecc396241567d367ac0df3b84aaf3997b1902dd8a6356949e6332a96ea32b505ae7abca6baa1de1ac82b5d7ae9cc0129a538ad65a220dcb175e1dfc731b9512d0653a592d310c84cde36d1edf867ff13f30fefa2767443cce447a429751f4314db19ff90ae11a1ecbd6f723d641e4a0652f56aa11e7e8175a8005b45553a55ec26aabf203609dad02c7875626ae5931c87d5dec05074624367746d4ad3b8cc34fe119a7a532e3cc3673165db8e177b451e9f3b22ec7b9151dde7b44234c674365af25419ee75532d893bb8d9e1a72a4ff330eccd9e1fab06390c9c37a10edc4fad52b6263505ed7f1a6dd7948f7cb75125e5b2eac9b1c1d14ad56fb7b63b297297e82ae6a6d6cf43d83421459c5cc1ac39f2ac26748f57f0c65dee3aca08c4423c978c7fa971b93d79eab2792324207fe15960cf13b28fe08d7412107ca75150d7fbf27b407939f4c050e7bd9678843b77ee1b0742c96422e752ef35c3333fd26c720ec3bd5ce3bb97c8a7eaf84821bf808ba76d07053e0f6be334c4dbce09011ceb795c1137a4591bf45a68186fcf96dc61e16ae085f5e9492de641d0ba0c03036eafe03cf0c5a01eb82042f36c91e44640ea68a63f710c7b5034b5d2f7424390cfa69f29c81b75a928adc18a956248badad500eff00eef882471ac105b08086fb7444cb8035f5a0c44baa247b0431a1e992e9cce6815df8d89c82b9de20f56cd7ebb2aaf1ad48ad04bc12a9d24aac2a75b4044827e8d3a065ad5074394d978d05d3a45cf66ef20948563d1e6d79a4fde0890e5953b94581b8d56420edf5794ef1c1497e552141ba82d8f58df87f7808a5fb316621bbb9059cc31a605ffe40f3654d9cc3773ca4377f12563e4a875f581580ca078736b03a144c6bd566437b49e8c44f740f105339beb0cd9d88c3035038e7079accf9e5abcc9be9fa50388f25629bcbe02e786c1f166a3b180fbb0ced5b064f18d978fb06b1022113c7d44bb3460f9a59e44c78c80c8888d4592cada6ac3f6cd8432d27ddb6a3e8c296a2caeeead227f10513642cf99a4da21e6aa619a9e6e05e099b55313fe5ea531d51b950c5f1f87aa7e00063c6302441182d5f720f8769d1406d5aec38e729f2c9b948be6028703e9846cd35606a5e1f74a4c8cd9a55561efcf711ca4dcd722f345d0cd61e6d07c6a043b13fcdb51061458af4fb869c9201d48a44aa476c1d66dd8a01ca25a92231e48badb8efba72192ef01fdc1638643ab16e2b6c1a6d0e76c5962d43038411f18bbf6afb3149b5df3594eb19820da31f36d2c139c3edc42f6c9f848b0977420d9e13c85d30dd575aed724f5e721478a62eab2281230d039993dcb92be89d1de1007bfb975759d0598e0480ed71c4b120e061a84a360442701136a5d5eaa844ec601d006358a594870061fbabeae25f8bd0f9e59afc83764ca843db04ab2386a28d03028fbc7671b36a561e0b81ee48ce69ea0c0f20a119ad67809970c4eb7e3209ec65ee9ddc609cdd349f512e2e70f5f8b886dc142d8a41b48b82e2efe9a489ccf9d345efc7a13e9a1b534ff94023df612bced250631cb58d651b5c26ea44e234dcfb023f0a64e3083005c653cd835375a52f704eab1c2dada45ea7975b5fb2d3e994ee48986f0711d0d39e3e697b17b60c2d630c152592a14214b95b3a394c2f890b5185c7475987e9f2aa61ead691fb1c30920215935851d4298f1a399cf549d5a9551edf70b23cd0e46f147d60f686337b669bc9ed19d6b4078e4dd82a409a0282ee239ce7374d172c2fb197121a99900999af2758a21e3bdd8a2ba35f759173bf5618a0f06083047a8dab023cc0b4a395b2c6a3ca2c663b8a4afbc20b88b404024c626a53a0c015abc37664c88d292adcc14131a9b1a06f9e765ad4d9f543e9c517313b3f9597e00330e05bbe125179481ebf1a30afc21a49cb54d3f8638b6eae2bdb98bb228cd934f09d3632c259dd514696501ccb5849cc88ae4fb9d15ba952419315c700b528423150839fa6d33a558706585f14d75da85d7816d5c791dd64077e5a623d218602f90110a5a52788174428bfe5d37d54502ed1c61e25c1f55c58b9dc3f8285ce7080dd94f9df52de14e5c041b2714a65d42eb7dd0f82f8aca3fe9e0b1ce4381f6849479551d16df4ee66f42ede2965b049aadc9f02257c8425e8961078162880d41959b2b56f0512774cca681fc7233eafa02cd87634cba6f4ec63919923aa41c8ad95bc2346b26237a20059f60c78cd2f52dc084ef422e2d9ee0b7fa1eb4467f6194135d30db77a4d28d2c4da42b83945ac4d982206f03ea2d8b11fcedd80858a0b2219c5a9466e88f2db01004b0f018e4d3d03ea6b2340c21074f45672ebc41103d5a7b5723d05693e0167c3017ee7399bff7c3ff7485170be5daf3b6947c422fbcd1bf1a13870a3f576a5bb2aad29e4336a21bd61bc736d38c16b89123ecbc1a9a49892d4943a4c8cbc6807dbb8ef8a709cd6d98654ecb3b8ffdaad6a97b5457a9322bb75402b73f14684d4f265fa68204399c4f1235fbb97b49a5ca34238d0690674603456542726c91fc6e455967d24eb48da6a43395653283e95a773f8701018b1d2b207369e18c084ae8d567f275430fddf3255c59dc815076a361315e4658de9b08d17c8e3deba4e808e445abe7c74df64300cacaa471b25a837ffd1302937e711377840372696998fd057659b06df16e3a12ced62fe19fe35a5a40fec77a26a4678a8cf1a7d97c34d718d40b19995b1c12fe0c2847e8122de6c65e82f0c655f00525bb45082163e67b14565fcc130db77e4925feb8d278fc63b51062f48727e60552c6b2b1f7c81e3a5577b4bcc8f3a14e46809bca60f78a5e8b5c860acea02478cd523fabbe7050c6464c97ed41edb8f41fd59cf3d3be1beb2447063773707d0b76578e1d802ac2c8e3ae8ac73fea9833d73e028abc3d1c4bf7b3ec306c33c513a07d96dd59f864ddb106b0d4fc31669e46fd9dab2d586d984be9d033e9b5781dc455727574571fb353b3f4294b644d74e426e845be259f6365894bdb1f81cce57b86ce3e87d5c13186d1c85f4b47f3fc018fdc2282439bfdf4c078428bcd3be4fc679ee177204bc1b69e13eb9994a4e92b8a28f4900f4be9964b4540cdd6e806c1cb8e271f81a25836b3ea4639100454bb66d1e26513ced687e24d29f4d75230c3bbff514f82d4095f9d370d8d46068a2db1b76f678fad27744c681b47a800e40ac0a4ecdeb6563f6af8c67d581718d652e931bdc8c339b874e63cfa1331f179c4468302c0c598309039686ca220958cbb74ac80abf9ca76603ce6877b9cc29fec59424eb7cdc3568dd74a87990c4a0323864cf33332543fed83a4346f3f1cf9a967243ae8158d200c496eb9c3184061445c71bd7e117866e6c2134c649c5fb8a6ca81dca2f67dc1f44db0fb8a8a5b9925f22badac5b30fe6a43e6a3afa86ac6b11c0ba083ff8feacf2de4b93872a08a4ae979e6ceeaf23f13e806267cfa49fc824f0f028dc598ada69b61ea5ecded7cafb95e71d5d83736ade0231f90c98b1d678bdc8b5011272f453768a877bc4ecb90a1589964ab6c007eb4ea556a9afaee9fd9504ac738a6408a929ab259fb3cbc198857449fa48a8282f8689d187b467250e3d74d5b40ee1a36ae463a685912558f2e181b9e26c3f03def8969480a4d4300a9095eb4ab820ab3ea1cab2443dee6d7314e8ba458c3173e1a9aa643bb815dc7fda80496da8cd3e198d6fc57a6a332ba56f296585bef9f67f2b0cf733ceee0acb45a723902b16346ea3f4144150963bae8fc6f0b1d7b4540a97223eeb6885b6e44ede72110944804d6d912cba6cfc32aa86d18692b0486dcd53474415d30df93a620023b54f96ad428fb55dc11712562f0fe871f13d940787aa2edd3d85ab6549fd0485d89ae048a22f3c2f7b54c6332473f40d9bee8af49263ad57dc73193a5ab30f6a05055d42364d8421a9cccd866cb64ff7c3689b703a4c40008e38c0454b3b8bb617ec96d0f714c9a60ddae6117bd2c281112db76b27bd1ef34374f13512525705f2a4803b29d791739bc0d76f9330cfbc82e094b01fdeec9b75111402ebcb23e04481460a0f546c56de112e1fe2bbc8da8543d1193db50ef82124ef95f078d6eb8972c4ddc9c67b805553cb6f6030ff3b994a6f7ac7b23a7314c5c930b780b15e6037424618acf801d5795b74d53dc18633c67a9042646ce934c3e1f250712ff87b49e21094a818409ded6090a186d82cac6054441989b79a9c33b069eaba21bc6c3390c219642c5cecb97df5744bd1038a2618256112fe8ae4e15a7e5200abf05012896eda842aac38a8ef021567d4fe3e20eda1803bb7a6d6a607135f4f81a8e130035bfc3e12d71f07d5893f9fe46659e0c95099f1977a4c7dcdf19569a4420eb9f6e8c170b870a16a39e5f212bd303731267723b9ffa866532233a0cebe5af371fa0335ac1e4edaf91fb07c05b92fde858c66a245aa264d91a591e184e9ab311a6a16aa44f8e78930db4ebd5b214cb14fa0ad03fe6b5fcec2a6f25de2ce76fdb70f3551209eaa1f0453bb9e0fb566316f1286b1aa5895d6e916736c57bcd5d2762a054a22f78497e54e96d9a2bcea4b4d7d93214fa46a53b0e23532b17466f4c9f155c79ec16776881004f7c082f547ee0eed8e37c669cee9e5e6dd3d37c089b3d68350c9fce008027bb8023919099378d655dd86dd1025b91fd9f446cacfd1c426e54f2a5117483ff769f4c17f5e57b9a6eb009a8d49c6d7ebab154a29ae8382c054c19e91df4d2f6aaf8665049165237a971ac9b69c210e5ac564d8da1d733c98dcfe9280907e90b6ee5e20143e3872f883c4dd9f1b55ad113a2e0056b6193306803fcc8b93f3e91583a8873bd0bff4b774af124486862fa84ddda3817438b8e3ae0acaae5582d44af49e888d1d5f954c6ea4c28bc22b740aef1598a06a7cf7429a5d23b63d59e0327762dad5cdeab1464c5ef7faa2a10087f7f3e2c67713b28fd0adb5687445645d07011aa1616815506aa5f04b98255897fdcbdc05e56279bc8c1190a66f6f038d62536594474fca0f2e553aec4c3bf5c4a3efe78151ddf1bdb502bb53e1adaa83925f29e68fac3c1b6369d6ed6c82dced295f111536b7b34ddd24c82fa07da056cbb79029947a1531701698abf9d8258afa23a9d6ef4302801e38e76df0431876e83802ec2f94ddd7561ffc1e308446aa48c4b1de52de3a66164f21db53c60aa3b9532e5d67e02b02a2297f32908ee842a84beb5c80787660dab1b00c5723620e6f5fe73f893449dcb9f95bc367a4a70f0263ae8e5dd57529efe357754b1c078ef59ee6db61158ad83f8783f0a97ca5ac1cde1f036157f1970fabc5ef51294161b42643937de8c8674b7438bf378c15470cbf6453e576d3932915c9a95f081b0ed80d2aed32d50ed03861519981b0ab505daa9b5f38264991c1fb2c7d0497f9a1721f45dff67527dda1195e480517876dc5b63669326881107c3a98b1b699ad14c02ab70fb133c5d482369ff73a94910566deb2c5af895513dde8b656f31447b2de9e686f0cfb96780d3ae06dea1223fcdaea2902570b4e64bbe32aa095ec9d77bff31be101498b19266608a53a6df12019dc7be35e3faa17a2d9723e2f4102dd5586dccb35c234e7f5116e441df5622730f7c9ca669af4d5076280e7c70bb621d5d39f0b39dfb8b4ac7be6b9caae64cea4e936c7da760202b770bb84766290870c61ac78a22054d4f8c05c644fde2bae18c853e80e1232c5fb172c8473fc41c5d91c241e9dd2386b52ca856181571cba3b71578c0c94733750312f315098aa14e78a995a64d3b6635178d7e9384e304885c8a55d815991171b2f9dba5cb9a51341e1c36e896e58cc981b383bcc1e5b3504dfd062a971c7519ff11c8517cb7fc2e9b43a9aacea440ec5790034b73d31c7a778eafb51d624a0985d940ba8e7e32a572e2777e53c6864efc46e29394c61f7cd74a7d634c95380f425ea477b469a89d664bb444c18802cc1e30f1a1e30c321d1a612794751ed9b381752f6443d73997d12c1067089d3a3db781dbcb60422d5f28f3f4e9160f5f6b0ca115b27c10247320bf34cdd78dbe4dbf341885a05c27e44b0cbf426a5394521475eacc20fd503ce90264f24ce74fa9abca48e35714885bb02c0c06e0fc8c0b2d72c5c5a12a96f5e0196453e4948bce830b19b6f810e6ffde1fdf8b65c8f0316fb609784be80523c511e3e297f66bdc5b47d5ce8b1567f80e98c917b7e25a92196ee59bab9f0ca4a933b24f06a95929c1f2fb19ecb06e8534adb4254d28072631a0a5d4af9d8a949358367ad85f3bf2c4743aacb3a64e1756a827e5779817db72f4aa9e8f332deaab61b489071e8ddcdfe8ecc645d432676e7c3f1ee087f1448c961d8101c18af10c37490fbd053ffc9344021ca1a5350ed8dd765ea04590fae794b8a726b3a144bf5ff5e4844c464f348772547c3d94547ec1bb1f119032cb506e3020eb68dadb86864e4a3a78ed680a5d96bf955f261db07022c443608b7c544bbb886b3510d65f5d5742ff38a6c052442ef7d1052cba05ab1febcd8c1538ecd99569c626cc22dde15e320060382cf7fa73533d0ec566b591daa3034d016efbabb8914fb81daac526dfa4415cc7e7f35183666cd41130ad271ac6ec5f44e3c06546d19f2bce22cdb2b409aac568ecb3988450d160de27dd7df13af4b3c1618ed02ca6c2f29950aa0b08d11d7763c95be84ebddb82744702f8fdc002c2a7793e39b649f5d6bf28a3c64fd1e0408fdc35aa57386d0374ca0ccffb1217eba4aa03ec86fe955b9a85aa63de71ce19804f00bfbf0ca394c0ed0b1e6f138d752138080f1642357dd04f5b9907c75deb4a342bf530b19925c898edfd11279792c38be2af16c423f3cb5c08d98902006f0a900fafcd655baf6c2c14e1f9671c39076abc4e083cba26aecd553835edc7eeba165b82d1ce9cfa16b459436b630b2b027b11e86deccc7751dd2aa8f81a0a48e5b860a6cd38753516d6dbc7de81f2eecb6e5e7c0e44e25c4a47ff790308439c5ff6186f4a34291d7eb98460ea7453f01b97b0207373e3d20bdd2261478401182e4f81c564984a632ec2ea4a1e43a4a8a81e75df184693747c6a393b9d8d6b079989914e3ce508b41b17c938c807ef74240e543b7af08777e756f14463b30c430f79728c5c725233b29e7398c4cf6cd6f50193058d7fd9d5b1fcf7ed216938bab959c2ee17a612429f3077177644c0ca9310fbc1efb950f30a33b447711158b47172227541c71e4c43b7bb1beeac486ad0791019ffa9d2eb9d2a85b0394feee14f1993afa101f7d35db06e441a765d55e6d2eaaf3052302e3359347b1b9794d87ff07d7dd8fdc1f32db3a25ef258ecf45f442699400f570f1bb493c9983efb681669b887b3b0c53664811e6bd478e2f2db750d585a2b06dccac8ac9ec115b1dd8a5a545213364151fe813935fe208a338677bd6f5661486d24e0bd00f9726f6f3370bbc367c2f5f37a89b21cd8c75f23fed772dec198190837f524aa688ec56290e6080f407e8c2d9733f07792aac1b5a116f2c1986c7dbb6beb0bcb79e1d2c87857ce06be9cdd338556c8e270b61142e805aedc1e6dad81ddfd694259daa874948e6b4c0e8ded3fbac7dc7ab7f8e3c1e05d17569314533c09622c7819444d010fb4ef970c310bb0d39af0c9c8f71bd9734b49f9465c6d13a0df3a415c7447b1ed51db8227f4593cc271ecc1d331a2b43f3ae793bdb3625575081cf446b1690ea4966c3e746f9e1b519d65b9372f19499c74a467934d680cfa9a070228a457306671d378b8355ec5092d9f09acd66ebb11965ca918919bcbeed86f34d324177368d10f0f21d6717628cd83d02a9267e7f5e0f0b3d3680d81c286fe8dab1b245d628b84d8cc78c5b52ab82c94b31830968e72893820f742e8914a06925f6f578de89dace662e91257274637588764a2ce7452e3affcda4823fa2b5fa59ebe9b15cd411085a44e00b44977dbea1485a5fac6b516c7b76b570b6a0eb723193614e3c601f9ee44e7ff690488c01ed8a1fa551728b713e14ed93a720c49465af2315febe9bd1450990b94e49cbfa6988823783e20b071535dbdf691550cd32370b333b0d6f1565b6d5a16d4f7daf1b0262ee87dbcd04ce34d831e6bc4a402bb563f68ee6eeae0350ddafd3527a9e074d4f497ba1c6de21080098e61332fa7242026ba3521ba24585ea944bd26c6ca8264a9d93cd505e2e42e2e84aa6d563cecaa900f56d7be6ef4055132934e9b6abea7d14359ad9f6776e553c1613de517f3700d281713672678d046f0d7f01a4731baae189fec3ea406234662ca6d48256f8ea9e573c995eb00414931e5a9a581cfbc71700489598f4c9be4105743ff37310463ee453f125328d8783fd70673e05a44f5783ad6d930076f961e6ac46983f6b01220b01b54fccc1099f0143fcfad89215c74352ce0e6179edfcb89dacae554710e1ecfa78c1010bd5306993fd68882cce0d1faed98b6796c31cd37d2b5b81a3c23267e6e92e36d404b0de6c4f14af605cb63c0c35349cd772fecc4312b6c4c9ca8421f40776e4eee50269a5d9c4f330c0f6b3eb41ee88e32ec39e95fe25b389174e03c09664d1c37e855810b4fe70961858513904653309ebba3255de8893e4934519f761aae1a96196762b3c3daf3ec22277f134c9ca1ff27f335327d4817ed38ba098a0150f8aff1485b702d62c1901d71a75ca1f558bb7f1eed45ab0da5face80376a8e50aadd81bb1bf77b2c2da76f3361194948888588a0f0331a6899424ed8a5a73e471c726c7c1f7145545a5d83077371b752ecd5a3b0d041c5539f6228ee73cf3c63e4d2758dcae7e74d637f31508dddad3010c8574a3fe52b357a176dd79d4cf8c7abaa35c287fa77f6b1695e0d1342dad3e44b06d1248a3cfa03ee51c2a4da5a940cf2a61c2937ccf92b75a85d5e29f75036ff2d70a12edc51794d9deb84506de1bf000f04e7a489b31e45e8ba87908f2bd5d2fde71ce724d1dec510d9c7317e175f215cba4304461b8b944661bbcc183b88440d3e710ba2a9f346e42acc90d2f43a798dc8b0de496ef8227a0dfbff161ce9d3b393f2c2ba4580da5e44d24c6a9b634054361cec844a2d86424f664a8e739ee49fb54e4ab2a8999834054dff3119912cd5b551844006b7567a59bc3cd65a83127d7e6557597ae621be811df1793e09df180d88c2547dcf952b837b2f69c4bad19aba6d4a7e8d366e78bc836ba74220df7e1cbfa41551f3125fc59b58b2e73bda19c574b7a43693c01c7d94e1d1e9e48f354cf7d33dda67a4341f482e39df1da4dfba56a7ab84f4a7b121bcdfa7cd5178a0f23ad3f52051afbb2a6fef1a0257b9a06fd268961cbb72c647571d339cacd42de2bc91d963d933ce34d445e22e02911ec32d64d160b3b3e0801bd36c6a2e192746b152a181f6b1083b3135f20267aa9012d3f4bb6ac329f80507d81ca3eb4b9d1e708e4aebbf0aea53dac897ca04c797a302336d0274e08946cdfa30c77e76cf779ac5cb23c07317b47aed294918f237caf36081c32ce3dfcbf2a6550be6561fc9f944e7778d33c821e47afaf58e4949c4fa1c8102a7abedfd6244073b010b300c283e4f38aa211083dfbf01a2a8e375b0dd00a4a63cee98a232d35b6ce1448f61350af1451be583a808d507afe58ff197fb2fc5840d661d078f79836fd0106571e29c712016bc5d01969c37948bbb528a270c9716e0f02aff79b7fdb087047f8ee530df10d256cd3b10b02c572838662e90ae1238da60aec56468d445766eafa43332de760eb9eb77ce4bf8c08b1ccf14da9ab1ee5586c644650ff4e800e9079cee7baf40762a62a220281da1232c36e3de57c785d461a76f41f2cddfe50bc086b7ef5eae16f3a294f45e200125c6271b8fa7b7225bb554b68168b881ee941a582baaa5bb304d380985b63b4a044d46dc85ce8b20cbfe98e2369db54b800b3c275dc2149c20b507f7b6d6d10a39446e36799221e50f939657f90a0d9b1d3c0bf38c23620f54675f4693a1e7a9f71001dcae5019e055b5595a77b4ab80845fb95cfdba604e6239e4f5583ffbbe4896e8ef2ccf2105f708ab418dcc776dfc60fffe2ab8bd0dae712f10ecf448d7dc5a2fd876a3282fe68f374d314f887211fdb588d86a7f0aaad0a01814da66d59f4f003d15a509bd4cd9faf5cfc7eec668ae7e7e189e40a738f5c6e991c6449a120a30fcf751b1f8f9d58950a0d6322c4e175680af562620bdfc9b66bbe3f071b01967141c314d2a8ac88f6e219f91d6b71cc6de68531b2e1745a98d85fbedae7a68dfa740e7f444eaeb327a4fe848a01ba92e12160a69479b850ff3c620c38cf9bd693c85431654caa9c992fe5db1112678a8f69836a18cd5bd6598bdca678c0c62c2432a1a85db8d53cc72b92804b451fe185354eaf7a760d6cd04f138f9ba205e9e6ff58a4903de2ea021b24fc1ce19b8d906fd6804d888b4da04d93cc4e430c4948c8c13e5f5c008b08b177296480ed6fb566ea1dee38b648e4ca6131c74835e833f4ca49bd5530f95d826013f5d63890061bb40c73d21f37ba522cfef76ffb819effae6f42203961a49cd6899d3e3745a7f5e3eb41eaa6373068109a85f85cab0012ce211854c7d9329bb32a31409e4d90d175ba79c8fc42c3dfa71f666de995ec2b02bc6f94ea114868845f847591624d82a8b1a9d22acc5a6ae65126143e16b0b376103e5116885c209147e15c7a9e19ba137958b8a34062fa9ce7647e9dd569003cc12fb464e64af719b2b6a73ed5a0de4d4cbf20f30276527746cac59b1dc731fb47a6ff98f82255cd3dce2cb6fb4b008f245de9ba218e64b0a081dba5db1f01a801c2cca75b99e0277b8c238cb46a0d254bc6ce342abf7309ff39ab9784238e1e8f37a58975a21eff408cee6f46fc187b7b3c0ac220723c7c766215fed0a1e8126374dab17011b09b8c3b0c80efba3110e4df826eee1b4b800dd11bce713b9bc0cd6b77e8b6430d86a31f77a1e5ea222cf0dc57bffc2e8bb7fa330a1f896673d0117002397b44885936b0704a3fefe96816458db592f5f876ff0bf92e0c1b829f209c9fe330af78cf411061abbca9f0e580a0a454d68a95d5be8bae341e3187eec29d39429147821f342c2ca67893f014ef309ba47e77c4da97d3fa66b2b412bf5082152499900f714a94d98edb7d86cd3c64ababf30a41883a08a281c2e6b73ede38f9131afa0d7273157a3bd20e601cd2c44298061a167905980affc28745b8d7c133864cab5d5cfbee7ce3cacb80f1a009830449fb71c5a06f2369f906faa0a2405f37b42ba6ec851c143040eab35f52dd711611bddb2e753a392b1f28d9d9633f0e88df79af2fcaa045a652bed715161ba7213ca15c87a862c4862cbc558aaae6cdb23bfb4f24650951011c2f413e03fa4b0151bf6f28c4756d901a539db0fe24e43646bc315524c3832992a95a1f4a828938712564a920dcace5657f4fb1880393d138dbceff73b05d06c5bcc451e85efbb640416e899d080a9decc5ddd71cc67a9910a2b7b21fb9656d6e763107d1c6a3d5c87180f4a0c981ebf4e8d41c99db2c4d829ebeab9e51a494af3cd9d3281e94d37b3a777013353da8d8bffe0fffe7df70ff10fb8c38f5fdeb25b52ebc5bfcc66fff9f82e471ed157b780b69242915e458db4b50d17a8e6944ef71dcf7f78af0caed0e1500ba1c78acf3a13b2307da5fe6f8215f98c13a9520cf5d076813d5471e5dc694cd143905f6abe09aac45966eb58034f3554fcb2c4adf53aef6b319944cd3a5354ebcce66b54cbb6e774bc2dd0ca54af9de83f105d565c976dba1d112110736a1f8fdbc2b26e4e72494d454642156f0b261eca4de46a6fcc934a7f9870c75e418ebc40b776fae4bc72c1ce4cef7fb6c987e93935de52de7a0a01edf7349638762d2f6b9924d988d17f61673cd92c74eda6176bab7bdde2640286471289bc85766ca3a83ebf2615c47fad375405b1064a3a7240554e3ab4aecf4a998d330b52c5d9d93e7ed6f686250674b98281d57df580df26a5f8026a0b5637882c218a2d4c57077431cf715fb1153d2a8b2cc64fcf5013d8bcb13a3f6f338adcd1fb0633cea491129346213c358aa2c26b854379135d603cd612252fa67a101e1787a597a6fc9c5dae52176cf5228285126b79e8d91c1c6c2a3c21fdb9da2c28b89aaabde1b10bb2a8eb587466b4eeca45848ef898d491f65263ab75a1501f19426e892e82f8366cec298ca1b0d776e6e06e5d5f059bf6142808efc17ed278311040cac6a972cf90aced4cf57d747812d85e1fb68a7b80b2dbc2e95d8626500728d7462e15629667ea0e5128fa4383bc76d76508653c2c45c632422a2bd3be6f3f44cdb87ab27a1ebe8259b7f18e40a6a1c5994dd1d367d5b27d09a21a37aff1046535f706c9b85f56df8d4115c4e9a26f6a0f68dac197430ae5b82b12f0dcb4a65b7e5262d28e221f45933db416b0c841c1b854b67a457457591cb9d60d6a50ed6279795a7d33215973acfcbcf196edb84151fd61c77ac0dd311439e79918558d7634578b63d63b0a7507536d64b38c7bdedec8950c64f1b5bb3a3e318259a268e3f4acb1ef5c83e1c009d49063ba162b60f6fee4d493605362587faddc7066a0065b5819032c18688285960793fda720bc6a2ec8dfa626de2e7ed997c6659d73d89c9d79b7dfae8e3529f56c986ad0915c20fe0bce4b99fef86a2bf0535ecfeaac1d3506d3b8a05e1c8ee1dd7dfae1353469dada898fd184b77ab6df6100a87a752f4b5cc39fbedac57db5b3a0cd0a90e4d661830b4ad6607af763f441f96a04014c398c37c22e451dbd95bcffef6e146d724fea9256974a083812928395508fcf085188368dff13852039440af6b4b05d71808c768a073ad7b3749498ed811c6aa9a37961867a40c13075818d3cda0fa0547972f1fdf7aa2958c38a3eda02aed0f2db7a8358d83a75b2adecd81f2859983a5b2c0eb75b1cf6b81e53a4bd0fe9b2e3b40821ea519e43b43f84455dcc08d7df7bb3554028251c5971dce8e38c2495b95d3c11209fb13dcc1e0f518ab2326b78fd3bb7567f24ae4caba71c42466ed9cfd65b8494079caeff491d9c65ead745bbee7e1e28361f9777a9fe81a94571397edb4229815093c1e83c87d6adbfc6eafc1eb6f1d53e71ab571f25112e752c2c030437ef668eef1158b728c18b815bacc35dc8b49dd4970a4d1794555918c15422c3b2f700635f0a4365084fc7b08ee57e31af85349b5406177bb4d2fb58653a58223d6f7609957a5b5faafa9d979897ad2d6f23c39a2f765b736641501199a83c29b6274b31215d5740b7eb0054cd463067fd873af9d152a8f0346144e87cdf97f0e9ab71f1b53395d53fd6067d5814cbab2c9b70180dca4466d7885ea275c2739377fdc1892ad4c9b1bd9b9ac42aa8a585115a9c7e0c3a52d39f8d6e9fb88621b50582dc381c36b3d07533994dd82e92dfb6ad158a8389f7954658b4e20c398372151ca0259184a4b49f23029c5676587ea0f0c30a0165d7816a35271a5c2434d52d7f4366dd86095a314b0c6358d5009d8223d7c3958c57ba843d543fbfe79a863d22e3d3a22ac1ac33af2a6d3d01fc06d2f3ec7bd0f2c26f6361bc857548c74805fb06286d068e9fb5a2c85231bb367eff9a7b9919f18e4001a4b23686bad74497afd7bd2cc70cec4d1465f3b2a8f13bdcdbfb97696d0217580c48f619d3409d1b43a105856fe77ea9644ac7dcfbd894031ab687485a3a072a0e54ba3486f9f31d90f1230fab70b6359423f8872f1ff2bd404cac42a035a36436157ca8a1d124e5d2ae6a31aca68b37200a5c39a8f528acacd00ec5e88d2c10596d439880dba494eea0a42611cacbf11708580eabf9e80e00dde4c920a8a11d468f85c1ce75e531099afd072dad02227b73fbbe1e19ae348d0798650df9a2f5def57a349cb6bad075b6ccf7f8ef2669b0627fe3404663d26dc74932d8c3b4460ede3a804bb9c13aed7490b4ea18befcbcbe721e5f72f8589cc98a9c354e28cd460efd39c8dd71bee22331b0fc1f694fa2616331860f039830ea23d4df28e0281903f142e4c48c4ff2f98cce22bc0b816cfd25c07da36adb2fbee66647b72a16f8ec4386c04944947d90c46ed4e370f0babd56cf20210e6aed309ace582a1e3226a6c5ba472f6bd0dcbb36e6ab48b0156bda8e1819c7383bdcccc00ab8dd8ed214bc153af6b5c39d6d353d9008ecd70e04043480f26dfeb3c062b087ff1c90454fca170fd2576884a3831ddaca9b3969605c809b7dbd7f008b7f42215225e7ad25d7662d4923dd9a2fc9052c436491ef114228e1ab5ac25e2dc95ce808caf96e4d8e2091d4abbbcc365dcc4498fd5e3b8b3c16a7a2aaebd1045fb2b28f152b9814496d083d10c3af099dc5ce2acdc99d32a02c278472afa529a0672d9c4cd240b67b928060c346361afa934ce445d0ccc9bf38e432aa94a67071d57b7758804e791db587b0558539f058d41c35d21eed402ad644b9217f814ddf01f61887d29ceb902015373b044bb9f9b95c9b8c94ce7275dfbd45e1ea6b2db2cfbdf01b7bb5097c45b405938768dc2081b23ceab0d870bc0a5c701949b0ba7ae883d6b34a10cb03ddb3a7b52cff60a40a3c803401cf03beb8dec881b5148669b7ada8ea1d7f48aac3e4cf0b850ad09771798b988570b664577bd5364ad6a889159ead9dbb8e1009e1fe8581d1fc736eb481770774b9619b359af07c526f2d8c9e7229407cdfa097c7ceb5140329bfdccb62b807a17e5f98bb02fc47ce1111f4a3517ee60afeb1b196c9b9e662d0c3531f62e6119ceed1b975195ef2e82bc3e08ea2e22331e2fe7a95c27037787ddde0026abffa0a994cf8d667e1ef4a569c416a6105b1832d079ef588166927665995732379ee4e2e8b9d5a096bc526094e4eabbe0720506ea3cdbf5c605e1d667a964dd126fc5c6b341006b6a4e084b4d2268b2255c29de82c6118a5b53ac80fdf9d730c62930970508a9c770e836f757d83f5ce94fd93f1cf3fe8d46b7e2048534b6b1c38ee54805297b9d3840091829d04619ae3337982adeaa16a4f5b35f6c4980c456dba3d1be2e722900a236c2941c2b81c52b23ef4071b29461a72867f486872e8df2e92931b6995473d1c129028ddcf4dda0b51ad69a3567b01789186e995b3734307cf2866355740f403ecf76d2c91e719e31f38dda83d70337d8320f51bbccc924add1ca542f72b186844624848b82c9e4d9e1e5ce04a574c70ac97904974f0046138b83e25e8a881a7ad3d5a0a1a0ff1425833d880d77aecec124a151083574aefa7adf526a233727f6d5477a3a7575325055c09685711e522c89101c7c93441881d6df6c54b5afbfe8782d666eb30d589dc6a5a7a2e141140f9ad85f698099024a254fec6a8d69c1e3d579cc609c9a4b18385df96c30ab24c537bdcde84c53b4a81fbea0a8d28566cbd713b0d995dd9e02f9a172a8819f6d8f29e5ca5a89d184473a01d89b3ed227318ec4f0b1db7b339800c808dff378e56f472cc6f3d449cc05818351de3adb2d8a61a0ea4953a6aa85b8360cc362e42baf22f19b3865e12bf34173a6e90ff731dc304a5a5077dee45d478c4a1ac71f0b5fd8c2da1b5ff96c4e2a022a48808d2fa299361cba78ab8e4caf82004346eb75202226316e374d09ee8e8198f8fa9924a53470fe8fec6dfb777de6621f525bbf065b92dc563183d2defcb8de8d31318ba22e7db9ee6964911f39dd8d9050d5a84d73954f5a7d09e6b7a0255b41dd08a5329216a9c161303aac57bf4798d5798e5637a0cb628700d324e520f777a762172404d0934d6408492ec64fcc60f8cacda0b990fe110039c3f91d3b932c2be3db0330fcd5cc57f58a85fc154445bc4c31ccd105fa0f9f1e0cbc01c0ee280f016318b48525b3584cb0d72ec2a1e98b59adffb3ea23da9db3aa3e0678cb41fcccb0ec83440cb15a3b2cf8bdc7b115de0e5592afd5164618c906d34d554a6ca838b9ead02f083e352a4236eeb66e7686fe7e808ed8ae49550f0599c1e2c4ce4449536546a3ce06499cb5a2e4177e56606ee5139c9d0cc129feea2782c7cd1cfd0b184654a7dbb1d3193bc3084447ad2c98aeb1ade7af74d11edb835d34aaa91a647d2293cb5c276005e51fba1e1ada9c8575e86963bb8a85cda470678cca3a14a13ab0e243025333bf94a195209126fc8e396fe185fa73cb1de543b42d1f1412e8a04108cfb2187e0034104fe48aa7680a116f83ada520c30b98c0d9e6947aef25d4c7b590ba29b56a4ae3ccddda5dd069020fe02496f9429d2dab48d4d00ea6974213950bad38b0626daadb74fe0c728e534a9f1a46a13c66f6c53b0a640acd643b35adc36a6ca7f20a11a8a50113879c8340ab16bd0b09b47eea5e41778575abd974f156ba89d15f723afa3b0b67061ff9cad252dd59ed653a79368a84f2c01a05a3c90205ff4dc06b39df5322dccd9f721ab2d59c2ccf112e84711600bfb2f8b0c6076722f4f95c29cb9fca7facb4ddf16623982741ab1c89356ce38db799353721b4b77bdc08240bbc7f007d35ac60ea3a13c548a95b1bbfbd05e7e1f607ffef1e7b4c2daea76530839aea4b26db57e28ee29884f5c114e98dc7eeb82944dcc857d4c0f3f41ee2cbd1d491e91bf821a0420c247df2071f5918c340fc5df33b7bec1c4252ed7e93dd64fc6c5a66a421b6b34a25d76e2327f5fed7f02c73418d97497e5d0d290bd75c112826f0d9b8cffdd8cf5a8b3650d1ae1dce723f3954904e2c5b6563902a33e3573be88d2548f6051338cba4f0644cb33cf03f28b66a67ef38194dfabe1ad265e7fe7e452e1081903f46bc0d53f18c9185cb39da0e3047eea1b136ad521a0ebe007d2b563ddfa5143fc7247d04714de6708a77705b608362181e7c211dfdd00892fb92d7279444c6b981c28f3b4004aa3aceb47fc0bd1e21ac51ae1de6f9d93a2e9d62b3e529ab9fe0cdf46668baa6b4c56bf27aee52f451cb5966940b36604db76c1c05a01d11ea915652315543276cbc1a1deb3fe725e9be39add97f761f769f344f150ba40c2203a08b6c85a5615f6c93c0d2f331db8219e5c5fda5a3aad8d604c18acd999adaf35ce8772a2e007ae9ba714697d7493ce054141cda9c4760bd7c9f62b9a8a900f463465156590f10e08095414db5e993504ab279b251dc1e773dce845f6e29ce94bb5dd439bcc9f4485827cdd424a6982a2245fb836348cf83cf4327289006ead8db953e8bfd9ebf659dc8816263d28697fca0597813ee75996d4664d6d8b315a1852a7fa5593305d0b51df2c0bff083d69a354861eb1a7e977b37caa23b9983ced6344600478af5f78c2ad032cbb39607e6edcc9ba1b166eb761c122638d232c484c35be9065ad8c5646a2dd4e9bd3163768286d40535f8c8ebb5227477533dd7ca747abef58f8608eb91b0c97380855e9face3d158e64c4cbbae50e30af60265261631b71c8d77159af13e7d0f4fabbf05f18c4acd8bbf462dc3ba5c2b927d202f051662100ea6b4eb3a79baaa37c59483125ef25690fb069146017b6045b8e56f8dfe03de060c2b12694c25e42ae0a6bd4a9eab53690e3e371d7d00395f41e2e2a0f955dd66f1f3c5a6de648bb18e6c1d96268cf8273c4a74b6d41fa7ac63bec94ef0d5ddc3407276f9a9b1029da9d95cf3cbcda2e25bcc225635bb2c39a7ec5780aebd5f24602f30485cdb6c673b3d662c3a3ed753dc89c5903cdf665f2136cc63ff41800213fdb15557711cbe673a454dd0da9acdf7ba1684183739bfc7fe9b10177bf61e33bd4046a8b99c47335a2817ecb41756f71af86b3a89074f48359840d3f622fd1ca34cad3817a346f740922a12ee254fb50b1eecd0bd86402e7b1c94ac1f286672246ca21f5d770f613152d9644ca869eaa7011e81a6f6cbcd972d1c46624e44227d64dcf5b6681c1fa68b3108ec01f7c7ad66109b5cb3800a2bec089564e9c8b5f3e3ab71c412b7f566f67a12cefa355d7252751d060c79af395c7f6b7e21a3454df2e9df18d0fd65366c9a4a71d4f07dc0f09c182a22d3feb834d219619082fa58f43e0e95f2fd266c3ea79fe6c1ef8ad861940e390dd9c6552871ee41f0ed32e04e34ad25680772dc134cb485e2fb5984e37c1d2ef443c8f469eb3876d1ce931048fa4626204c2878c5d2b6077cf704ba4a33af5710380c398d01da6dbee7c35e28b45668880c54781993279635566a0c64d5390668e68f9703b9bbfd7f6fb7d8b27ba2428dc8b626ebca46603d21780f9cf688c0e926e4417e2c45c1b5718b3d44dd22a0eb9f7cd1f82805db0ae00a100bd96c0a1ab1f809057d49ec1226e068d26ed23e6f3110b4356d1b7318ee7498dc5f887141358d57c81bb43b8b77a7c3e5be3b8c0bb23b9d2aac8918a65fe1f884c5d9dde96432996c478aa1ce8538c451f8b537a6d14e9813b9ff4e2061408c3739090106fb720d777338fbedcc234e42d8fb082e75d9490830980df107343bfaf6ec9a37ac12f4edd50621ace51b88cb5ab64241166ff126d90f5cc2e404c133cadcf706825b8ba335ef0641a12010df704d6fbcb16dc4b65b62282c0e595adeb44cea28770924211625876f664d0f99a7b6daa675ba65bfa1315fd14db531bbc6d27e2afb912068773321a01b64edb7b17992e2dd63b647aef189651bf32d4914af91d1d1a85f264dc75c3ab6438c5f38775f344cc26cc0a14688ff4f98e1b6efed15260902409949dc2462492c2571948492248692509dd456e88320bb12fac05ad50776456aabfac00659d5b65bb2e050d32660c6044860574241a42ecd11cb6e698e7925d3255e4136ea51674a0089286a5243c920025ed2f8ff741a0120ff21800604648040d47fd96ae8b66f155d62146898845dd1c5ca1209c7841413c58c0b474c1e31e497809a07fcbfe1cedc591cdab63b93d106e810d3eca0e9020d16ffd19880260a9a28bf5dfdc7e5b971dee97449caa89c1a31e494c918f0863240c780290c48ed306e0153dcae68a70b085f041a45dc5044ec76558435d382db95192fbf992187808c0825227c1c8b327408f2b7ab219c5c36c48edfae8498e27625c418bba242dc84b0761504167655c6ae82b8d9551044bf5d05f1dbd5147655c6ae2810a45d0171248a9706c48e3258fc7655862c73e3ff0f657e20fa7dd000f58106bb8afd76e5c390dfae28192e7ebb22a3c6aec888324a06c86f5763d07c4c943137ecaac4b85247c9c44c71bb12a38318d0aec404d9d5ee8189ff3d18c0aec2d31e866c1a860bbb0ae3254c951ca6fe76850308055305cc0fffb71e4fb29593cad1610599afa08208fe6f39fdd2e4bf94d32f0af83f9a7ed9d52e3f1a0ef5984bb386172fa8e18254d3ff264cee92eb050f257c09137bcbf2daf176e04190474611f7c8b8e11e193a0d7efc70fdc70f22ffe1bdf90fcf02ffe115f11f9e0cffe18dffe18df01fde8ffff0729200d9113c9d51e7fed420921a6387713223a9a53fa57483a729d401f85356fe5400d0e8d014855f3fe850f1ec8a12340726be47f97340c0d2e2a239001167b33cea4c8143153f064e71b8316af1bb7fcaf5a7aad45d78db211ea3987088b1fc292a7f2a29e986316478e3e635ce7e9c918e8c76e4ecd83002ac04a75a7f8ad5a4c60c36887615ae6ca0355051c39f8aa283e3600a00489012054a6a95aac126f5e44d026ef8d0d09093ff3752236851854a458303681882061d6ead2e5ccd424b83ee76b57358c4393fe4f850c5be95b63bfb67bfa42673aad0196c7f99cb2d199ae168e48d82895a3721a00c5ad3cdbcbabb74497d1bf39239e6a56f97ba2c7516718e456b52c238e963d92de0167093a7893ff234f1ae0de1515b96c538a949e9bb3793a8c86e27fb91376a7f6059f623456dc3dbbca5cee2ec665d1b5d609416712b74dda651bf6ee6256f14acd449bac428e812a3106273cc4be2c523938e8ae54e13e7a39149d4bae966cb55b48e99279359c34a4e3a2a26def1de627b63253c32ed7c9b420c430260c822ea027071e21243618b4b201c85bbdf962c5bc01067b133abda625e6b75cbb64adca463fb9648babba48d6eb36b37d644e0be5bc0d3d6f4988fd46e475ed0e2850eac54d6ea9c179898be40b473d661ab13139ff853227ccc3743797122025ecc985b93f8b6c90584e3a9a1ec8d452f55bcb0565dbce892822e16e872849562552a2bc5ca540bb8b88aa95f210ec733c9d42f6c66dcffdaa900b0b08d59080efe3fc1a70230dae537b43539dad5cdcc5146f2572bea0204feeff2db4b77576a0c04b4b4b138bbe6d62f5d33c2ff91feb3c00521fc4fa59a809162925af2e75d62dc98952cbe9958a0466c026b69b512a1e8b4515ac4356de2c08103078e1caa7d6e2c4e961445e951e6644951941e45f1d2968817ef7daaf4ffa253138cdf051676f9ad56d43cba1b8c9d823d825dc57642bc2bd55578f3a78a5244df62aedd122956aa80962328ad283bf09f85471d855fb631d3ca270ca3a5d2632a2cc05215cccb363906e9261bc0ae76f98d00251b2273500dc617b7356d95aec4acb561025e0c20cc0912e0e50408b0410705547bf9d0d64affa7998c4dec92e6b0a0390d3cc704b95b2442895a5759ad68b9fcca1c6e09ee039c8f5b6bb726edcac4dbcec232971ba229d0f003fd3904f873fb46ad5629a4726e5f9b23009ac13ca524f53d778af8ac596d5a4b9e5040188b8ddeb8387333274b3ea2a15938847369d22523a74b3ea74b39a74a659c2ab1e0542905a74a5bf8e0c1f3414ece8f019cfe50e1f407edf407ecf407d2e98f26a73f3c38fdf1e3f4c78d532f8c53af8b536f04a71e15a75e14a71e054ebd254e3d089c7a0e38f58c38f58af0f1d18347ddc06955e2b416715ac99c56059cd6194eab97d3ca02dda1a3a2705a934eab92d36a4fab8f531a83536a82539ac529fdc0297de29436714a8f38a5654e290fa7d400a7f48553ba4fe9ec94c64ea9d2299d724a99d49e203772f0e0f1a13ff4f427e7d40706a73e704e7db038f5f1c0a94f13a73e479cfaa439f529e2d4c787539f1d4e7d12e0e3e5d4e73cf5114f7d68a73e5a4e7d603f3a6ce0c0816307045bf8687133c54f9c27ee438c383eb29045d0b8610c20378010a18117ae2ffe5f87e7a6a10f444c683845843fb5c3474f8f1e3b78ece0b9c18303870e1c3772f0dcc07183c7c64e2a5523a593ca493d4e1c10cc31b933a3f04865200f19ca850a705b5164e5308334809c727139f9bfb9d4ffa01d630b16e0160794f9bfc5062f20686de316da96d86f557695c343cb9ba8d2c9f7e4231a1a33b96b77ab7689c38b4b2935d0c8b9404e123951e480e01bfc3953d02c41d771fd2f4f5118e266e6f22ad9a4c631e63f798a8207bbdc8947f6fe3564f0d738e3af61468d32d4fc70f35fc9e9092bfcc733d96e5313aea02658e0bf35afb58d1900fa62396272392135c990a8b09c986230594ce989958474b45a91b866b7ad34f5eb9af72846ee6225cef4ca0f57be5cb90127619c84cdddeccaec22e8ee92a87553899b725bd4baa96534e65c4e05df45f4a9fedfe1c6312f4c6249fea21dc6c1d0c01be732975bad5a31200376e47b89d18da649243cbbdbd451ba060c60d0449d7410b3393e857877457c14aa4a24fb9578d47a6f014fab0a311eefb6777f61796f9acc6d0177338b6735bd491157b11fccda6fccd6c427388558bf425c9eb65c43a24a375c14cb73a6a49322855a29835ad9820af162574c38a761a1d6544491f5b45566aee95d63d98f845814b0a62f8eb2aa0f2cb1596361da0547ed64a36c2ddb6b46e94f0cc36c45f1d6a270da6e202a332a58a88c40a92811b241d6aeae75b25bec2a8b92a19d99cb13aaa04951e88480fa38fa6b8c51e38b1c1f82e8fc1f3a450ac1a83314865d095d621c9918b66b0a312e9b420cc34eb31316e2306495f8c94a888dba28af48c361897138345e5daed574482addcbe67477e9dbfb14497be4caa5598a621e756d766e6cee425adeb7659258244f730b686926b62ad5bd343be6d0ccb9d2eec6dc1dcbdc5eb21f797316ac31dd6c41f034c75bda56d0b72813db403b0a89997683ecb5e599dd9518ca9ad8b6559695d35fee8ebb23b3731f1177f072026b85499564bf9d99cdd1d42ffd1a31eec6b67e99fad57454eaa4d90be324fd9a9d305d96486709515a099bf7a8c6649e4ca1d654c6283d5ad1fb629cb4cd11073baee3c102fe1ea7d7128e6a70d0b4c5ff7fe08a4d665387272cc7e8a6c373eb30614a7d9bb5114e7d6db164712ec73ea11948b343b6080469a0dd51192a97e64c6f3c436ab15af73b431c2d9733bdad0e6fa6914a87312d1311156521d06af3d4bba0acdae93e6dc96da37415fb6df25495336d75b946ea9ac6d1b080afa2a1176855a06cd420164a72ba626fa8c5bd2b2f794b4cda5ade4241169ff6db5d9c0d9b631e2f0c04893016fbe151e70b568951792129c9622fa4252a4830d98bc915337a728ac15e4c463227a4a3d71368c343e6aed5f4100e6f69da8bb1bc68374a8fb8a1ac694377efcabb4b0c155e7ba384446c473d6a71d3f28dbca54d9be4aea48df904d6d229d6f61567b96bb3a5aec5985e36067b5a3a6918663bb01f1224443afc06c4a953a2a8a1b31304b4719ee91c208fe7c54d44e0b2c402a0049fce135b640b5adc35415b62282861141faedd5dd29a8870e251436922c239c37fa05729253868ee73efb24a49e1d96d35a1e4fb7740d8b13b5182862a1238504213ef0ac5555755d495133925d40f0c9ee9dae832b5945a462d352d332d5ab41cd192e586911b9f0d1df549148f85f8dcdb15e69653985b616ed52752ea131f619e5527e31f13c56b14e656d4bdc5a0a2aeee2e89367b2d9ee530bb3e6cdbf6de68f7c6b21f0eadd62639e6a50fcf5a635efa70b93694bbe4b6e5197992197f619eeddbfaf2ec5c61eb9276353647aca46b39e903413d3225b992ec0d473b62a5f17e59b5138582769867201138d37adbdd4cb541d08e5987b549da9db86b1a66c3b1693c73396db4cfa38d7177298c8d4f4d616e9964c6b430b76cb9f5eb20e083af90379e95475415900fe94cbceb500b75e83674fbedca839d0efeff3b448e8c2ca020293b96042439fcdf8944e435772e9b79dcb926692324032130aa500bbe9c50682baf8c369e35255548f5ff1585c71d312e8c5a542a292448b142ba30079935acb4722a99cc1a5662c1eac22cc3b610cb72369ee0b07163c78c0d48896293d8118b325928ea1a23488920356606a47e008132638aec909522c5de3e6c0bb10dd5832a6078f5608892f3f4f0bfcb6b0733dc1c1747b6f8be5999cbcd70342dceaa112ebe9d6884082363fe03010101592ba54e229f562b2b827f4550326dca88a0acd3796ea3da01ecf2cba94594283281223d14a9818421db430f3f7cf117b9150945f11209a21229402d025489a4f16d9cad11254550ab552502c2576489c01858db6690d1029a0e6dd3e1e46cd083030f68d9c4b9215eecf2ab438486d83aa46ef085784d1d646ddd6008734bb17503d3aeaa9034aa9013542153bc0a49238401ff83bc0ab9a10ab9e1aba79eaa10a5ff42414282fcd6bc382382c4f007d152831cfd7665cdbbfb4318a383801d1e1eececd8d1f15f8c302a90dab3d3533528c04511f39ca91aa47672e0c8a1dcb88363e7469454103a65767874b8e85cd111c1839e1c5b034b0dd80a743850ab07b5fe3c9854cac26959dc3965d49f2b72d874953a692f15d598742c74ed8d738d098bda69d42e1dd3e1b0c6b4b1ed36d598760e9bae1a538d89bc51b08df30ef12d91b6d186c56aa83ecc176ef89580c20c97da33e67f8e8ddf0c106a8f93ff9f102dc8ce3ecb69c2023917c8b980053edb39b3b99b994b6d13af05f19891945aac2a462c24a7d7531a39719ee82089a30352d1b9e0757055441d5ce5d1f45d7ebf17f13659dd81e6e3016878616f4d8e325287482784eb10551d54e8318bb59a5e7dabd52561d7e1e3394f350711612dc7969ae384975a0c5de6a9876a25d498876a25d4ff24a72bb77dab24395da9382a90f41a3dd46893a6061129353bea8d336e94f15bfb802f3f7c61b774902508209ee429bcdeb8f295192a97240e771837cb71a2f284d5c612d50601aa0da86a038a50d086b242419fad3b64ea8eded1f24f284828c8f29ce875a7e2590e8e9a425353b19f84283a1ae898ff73520ef8ecdcff8ffc35aa8ca93554b586576ba45e75e0549d286e571babecca5a5c438aaa53fb95eccf864ecd4913eec4cfe670e7ec8b6fabcffe8faf177fa8383088e3268e06e25489d3244e9354037498d085591696f7b4219d54727472747874728828c14fc5177fd6fd4d98f88570f9792879aa062b04cf4788d3353a9caeb1610d0ca76b76a76bf6e99af1748dec744dec74cdd1e99a104ed704fdcfd1e34304121051f1d0f19193731e520099c2230d8f0c063d70fc4821f2e2030d0b4cb90280a80a6c9001305e8218c02aa1409706b0f0ff20f06cf0c1912715385523c4a91a1d4ed5c470aa4677aa26855335279caa09c0a91a29a76a8a7af45034484ed168708a26757a068dd333629c9e79737ac6cde919294ecf3c717aa602f4860e1c67ae9c9e11e1f4cc07a767eae9191ca746a4716a4418a74668716a449b53239e38358202ff81dce7860d1a954193ff4b09110410657ef081cc181dce60edf2924a76f9a5c4a4a2f460460a7635bb333386fc2fbfd99d7db852d7be6f6b7393395b7c711448e6ce99d530fbe16d41329b7a8b25ce22b9cf0b82a0852294c4422997304e122f129b24c84ab16436652616a10891d90ca289972693627766c6a212255665eeb30441d07e2a21329b568f760fedc42bde5cb9c7acc99ca65d706710dc5a1f21b35966a823169b2779c1109bfa4a881baf13ce657bb3aaddccbc401b37deb2a669182a0a375e2723273cead7a845ad9bb4a875d3ec84ed8dc571dcb84c02a3003f89441a3062600c3131183cff4dbc4d0c835db142de9c6cb5da38775fa189617ac6723adadf162f54aebc22eb0bf11d4fb1c4a5ae6d6ce6324a097962dc8db2e678cf126c6c7cfaf0debb59b6dd5077973ea1200b82357d67e5b5d92be61a2ca9c9654b6dc9dc19da17132c0016dca0f8e96e6eb502415b0bf1902a778eb7bc35abf7bdb86b55e6cefb1c9f5ea2782685fb56d9c9796ae9640a712ec7746d74399923cee9255d1bcd2c92b0b0bce1784d1836359419fbd266da1c77dbee0c62daa865a053886db63bc34ee6ce4aa11268cd1b8a7a47aa7607454b5444d67667b6c896da12593b6e6162554bacaa280b68b793264bbe221d11d19225194acfca33c4341b62b08908d67667a4edb6c08d453277b7edce86b6c53810142ab2497437f709c990d82d41568a14bba5c826b1b82ca06ae35c9626ce696c33479d6d07f6db893aca1cb56ad47b97744201711e6fcc6e6b8e5787643bb09fedce4a8c496cd6f44a36947378cb425588b31df3060acd1d663bb2ca5cdaee6c3c5de585ba24de768bf99afbb6407b59f6dbb63bb338dacda27dd9cf76672c1be6db14e230eb2bae11934ee6589e2ddb9831ddc2f58518aa966d79b6bef292bbe9cbd952d73e96c53320fb8d17765a6dee8ba14cfd1a31691ae91a16cd218b8d5c5924f9b7bf8bc522b1319bc4d668d7bab4a9f58d16ded9a9332d8b37f77dbb1bb51befa977a616ed55e9ddb25f894b118a4ebb73cefc6c12bb04ccf69adb7ebb72a7d365886fb4b31467577797748951308ac2495ac74cfdd2afdcd23a16ceee986dac860624208187466c0b2dd8105b2924d8165ab042413b7f18973599ecdba2383b77cb497797be9d58e65bdb19674dde3cb35a8fd796e6be4bb56c77a6386abc419ccf306f5c2ed96f03dd6817c97e5bc86eab14643f13e368617963485b146f38eef29391e06449d11965c4246cb5a21e40c1034e6e64cc765fda18a5c3541830463a78501437fcbb142f4d9bf9991a70e8c0174543e2c509c0a1862f7f8a873f4583021440c30e36dcb0030d3adc80030e38e440c30d36e0f0a76a50c09fb22165c39faa21014fd1f01097671307c0530e3871220278dbb70a68559fd02e227766900df54d7797be219c0bab55e8627ae5e878314413bbb26ec44411828bdfd081d92204997fa92a4493ffdf4e2788900b562868f57d56c582bde63db2d6ea5b5490098be9fcecc00a6200df6ddf2a249963232699805803840f7f0e10750065b87898095006cd8f676272c8c87edba82f983216091dc0fc170ac269d9cedf0f47fc10e50715183eb400c8cc63a6a1b1c365cbff95b1030fd587f0df32ddcd8962bed13096659d820b3113c396944e1d534c1aff73b9dc3dcc70a39dda9445dd9b59939963ceed53864d0d8579d0c243151eaafc7625b3991b4365d94091251e48638b7c104394448a1b656ca04106c0e8203fd0fd00c20e643e205f5368f29a0292d714ec6b0a40fedf10addc13a5dc1397dc133db827feb827fe1e0ece3d9c9b7b3828eee11e700f47e61eae867bb8f31e0e857bb829ff8368d0b3019b19fec3c60b1b926229c02916154eb17039c5c2748ae5e8144b93532c41144b90532c384eaf9cf1e7a03e7ae0a4f00ae7845738ae573823bc56e18157381cbcc2e9798553e3f54d18af6f48f0faa68ad7374fbcbe59e2f54d11af6fc4bcbed1e1f58d0170f4d8b1230c2f4ec348c169185a9c8621c5299c1c4ec370e2348c254ec368408f1f247af80f1236fc07092fff4142f71f2470ff410285ff20b1f41f24a2fc0789a1ff2061e43f4804f90f123d558b00bc6a31c2ab16485eb528f2aa058e573764bcbac1e2d50d055edd00f1eae600af6eca5737565eddb45edd0cbdba01f2ea86e71504aed728c2bcbaf96b162c78cd8204af5950f19a45065eb388c06b1643bc6691c36b1630bc6621be66a1e5358b00bc66e1e4350b15112240de0e1f1f3f3278e05486244e6540732a0310a73208e054862ca73294702ac3d1a90c42a732f0388da18bd318a0388da188d31864388da1cb690cfb3406da690caed3188a4e6308721a03cf290c699cc2e082213780e4f06c36eed5d0b85773c1bd9a09bc5a08eed53470af76817b3525fef304d18dafbaa757dd94ff1c91f31f3564fc47cd16ff5113c57fd464e03f6a24f01f3569fea3a688ffa81963c34617214ebb8039ed62c36997174ebb98a75d6c156acd2b14035ea1c6dc0b71f74213ee8548f7c210ee8543f7c20dee853dee85a97b3418dca371f17b3ebc9bc3bddbe5deb5ddbb26dcbb48ff7f00f1b830e01e972ff7b878e142fef8b0d1c509a75d349d7641a50b29a75d8870da4592d32e889c76514fbbf071dac58d533833388533c67f1fa926ee6b134eaf4d58796d22ca6b1343af4d7cf0da447d6d22c72b9b345ed9b4e0958d166cdabcb2d1c02b1b245ed918f1caa6cc2b9b1d5ed914e0958d0aaf6cc0573625bcb269bdb259f1f8783ef69e4fce3d1f2bb8e76303f77c44e09e8f20eef9c8e19e0f19eef988bae763bce7c3e99e0f11eef900e19e8f9e7b3d33b8d7e3c5bd1e12dceba1e25e4f13f77ad4dceb0173af67867b3d2ddceb19eff5d0eef5c0eef550b9d703e55e4f927b3d40eef5e4b8d7838c7b3d5e70afc716f77a7ca008110d80f4d87183ba1173eac6865337053875639ebac9a76eb69cbaa172eaa6c9a91b22a76e7a9cbad139cd4205ff77e8a03e689b304edba8e0b48d16a76da8386de3c4699b244edba8396d63e6b40d98d336319cb6d19db6d1a76df0699ba7d336554edb90d0a3cd0d4a051aa75488714a050b4ea9d8e2940a2a4ea988c2cb72ef6571ba970500f7b214ddcb02421622f7b2e8b8870219f750e0e21e0a6deea170817b283ce01e0a42fce7a183ae6670ba1ae374b582d31516a72b284e57489caece9caebe9cae1070ba324f57584e574ca72bd7e90acae90ac9e98a83d395cfe92ae7f48918a74fb8387de2e6f4c914a74f3270faa489d32712387d32844fe5c0c7cbf1e55e0e027839a0eee510efe500efe570ba97a3e5e510e15e0e2175cd91d7353f5ed7f0bc1e81c6eb1129783d028bd72332f07ac4035e8ff0e1f5881b34f0bc2b4bf7ae34b97765c8bd2b3c9eccb8f7c4827b4f58dc7b7ae2de1303ee3dd170ef89857b4f29dc7b72baf704e5de93eade53907b4f39eec5d0b81783c1bd580beec548702ff6c4bd189a9e1e3d42d248f19a4602af69d2bca601f39aa6061c394ae8a2042e4a70534215f79ace501b3c72f0a04a0a70aa649f2a094f953c9d2a593a556274aa6475aa84c9a9924f8907a74a869c2aa9a74a709c7e3338fd6270fab9e0f443c1e977c5e907c5e9c7e6f493c0e9b7e6f4fbe1f4bbe1f47be1f4dba71feef4939d7e574e3fd7e937c58727078f0fda8344cb29922ba7485ca748969c2201e13f0e0da4d89d4a913b95e28453295ea752b44ea570722a4592ff3dbca625ee35a9b9d774e65e9310f79ac0e800c2658a572e1878e582c42b17343f0f0f06eef120718fc701f7788ab8c743e61ecf977b3c36dce331c03d9e2ef77874f77872f778b8dce379bac743e5868d1e5a8489d3220d382d52e6b4480da74560382dc2c26911db6991d86991a4d3224f4e8b80705a6483d322f4b4888d5322689c1211e394480b4e8998e094c815a744a638256281532210382572e694880fa74414704a048653222e9c122175f054330f783563c4ab1931af666c783513c3ab19175ecd98af666caf6664af669e5ecd04e0d5cc08af66845ecd14793523e4d54c7d35c3e3d54cce2b1165bc12f1821e1d3d9e383a7de2c9e91343a74f7870fa4490d3277c4e9fc071fa84ce8e9fd3cd7f4e27fe73a2f9cfa9c3ff0a44092b4e9570e25489099c2ac18053257838556277aa84ec5489a6ff3b2e244ed36b1c2aaf7148788d83e4358e7d8d535fe3dcf88fc36b6971afb5817bad25eeb582b8d752c0bd1601eeb574f75ab87bad2df75ab17bada47bad11eeb594dc6b05b9d7e2718f15e71e2b8c7b2c14dc637de01e2b03f7584cdc639db9c712738f75c33d160cf758e63d16bec77abac792728f95e41ecbe7de9434ee4d11e3de1438f7a690e0de142aee4d81e2de9407dc9b12c4bd2960ee4da9e1de942ef7a694f7a6dc7b537e82f4e0c1a30ac9f1fbf4b0b8bcb2aabcb2885e59405e898c782512f34a84c32bd1015e895a7825325f896caf445b5e8960af44565e89a4bc1235792502e19508c82bd18dff3d70e4e861e2daa5045d3ef01b110ab2473a3672ca606184daa5eef2c325590550c5b9f344a74c2a4a4a2828950017b6e0bd29505bc0e2bfd142f87f052d14f94d1d3e99465792d3153cbbad9cccc2112c8cb92fb0a022405d81899c0eaca0f43b6027829f47b61baf8b11f9bfe555f7c5ff19e806f0475571578dbafd32808ae3da3c4035798ecb034b51d7290167c5e62d871e9a69bef16495a73ec17efb24af458204b7489cd6377b33b599bbe6ce5952c67fc36d5041288735844e8a8c0285aee20004a8e30affb5781d41106215c26ca1d434864171e930d661129c24c59e6c943ae68cd8e537c3a17eb96cb7956b4acaad7244b9a0d5fd962c768c02769cec88f0ef84203af1df765b168aedce5e809bc1376e888bf9ae769a30595244a4e41bda51fd3b49fe1d24ff8ed0ce915f14af91285ea39a820ab012cedd2324d813abc9c258f60829c642728a59a49655527261b130a425d6cb527931295926a698fdb6285e8cc5d90d9fb62bdc3d7c299323949dd830c5d9dc7254b7ff0c3030d88846a869e0393eb5f063c6c87901dff0037b502ba06324d4b2441964d074f83e7577c9d6b43d62e27d24ef31077da5fe8454e60db2ab516b98d6b1736327afc7757c2439fa6f64c5454b99355aa0fce515af11932c1a7816243ee6a56f567e3b1c917079ceb2f9e1685784e5ced7b7b7268540308bca3c82a35d711f81c26513142e9bca7c33f7ce9d2f2150c74a0ca58dc0a012376dbc428601e17ca1e870189697666228268971169757b597ecb7fb7079a180d686ed6e06956d8cacb19bddb9c6eca1541817ff59b00a7cb4e50aa3e1bf09b355980915e6c39675923855f1dfc4fbc86577393f90d7f1710a51320ca573b8842a2afa8a866818ca1bc1cb4fdea84d7a4da4784cced22baa62470aafa8e96616f2b11e9113d7e5273e393c7e784443a0586a3c25473c33f0be23bc6f87379486378486ddcdac5d000e57e15a0ef01dccac7913ff81f0542294223b0465892dc4267849c6f09280debd34fa5e9ad9bd344df7d248b99706c9bd3441eea5c9710f4d9c7b68c4b8870605f7d058710fcd12f7d0a8b98726887b6876b887a686ff3c3c3b2110f1bf50cf08e2f50c1e5ecf40c0eb1902783d837c3d037c3da384d7338c5ecf08e17fedc1e30a1b3b3d412ce164830b9c31817a54491f289a26a0230756056e34b1a281212be41031e37f977b42f5bbfc7490bca029ce0428c40cffb5dc0baabb1485824c1d363f95505010ceddbd5a21196006d0031ae281f0e635bbb138bba607420702f8bfe5de0706f83fb4530120aaabda99849177698b5a973a69c9c5a254eaa47d45db9877224966a71a538d49c7ccda6bd798304e1a71a95d18ef6ed3dee1f86474cd7bb471d6316c5ea77db433f7ec84d598768da9c6b445bdcd71db6ecbdc5949a7a362ac25118ac8bbb45444dea5cd2a75924eaa31d5983699633526f22e61d91b973a49d746d7ae31e95a8da9c4e409dbe5c5a21136f5955d2b746d73c45022ae128eac10974821fe40a1a0bc73e2d56316c3f19c913bdb39733d3d7d7bcc4890987a4482c4ea23db81fd762e9798d461281c5e9cc3e2d5a2fd2cb8058bb32c1d80765fdc5db29f1d6fb6dd708f59286867e612c469ad643f211ced9a3051bc461d046dc1d1ae99c5e29bb9efcd2cefc634f2c4d1b4d217eabdcfd9c55bc01d4da6435aadc02c1f064afaae91fd6c4d7fb97daaecdd5b97e4b6ac6c6d4db37299ef0eeae2dbcd504879b6cda30e68996602994059e7bcc215ef9dc92ec6a575d98f89fdecb7c47e46f62bb22b6cbbf80a5955986ffbdeb2c5b9349120a1e5519b7ad4392448ecd5b5315b1cb26a228685216bd7a45fa3cb0987da08291ccf3ce2234c2bb50b2f199980a45f3158927992a3cb098bf98625c4650c1fb96c250eb5d1cd24f191289a27699e4cfb52d9b62b26c5584fad31eb6ef98163d6dda553ef7bc3b52fef5bc53cf50e27cdae798f5ca10b47d34aad2f87c5992ec9f2d4341af881f79618cad4afdb649267891b6fcbc42798faf5ad563bf46ce86004009e8dead9c849a3deae5632d98bc9057342ba225be5ece0edc870992da7804b0b85c8920025c4b77d92de4eeafff6524e5c1ca662f06a5cf1ff0c95426c44e618996351f8e5d570c1abb1e4e99cf1ff23b349e6d8b7c91cfbc86c626dcbb1ef46bb98d4b98fcc2616734dd5da371bcb7ed7bce10d68e7ce118342fa166555651018927769933996c365d38849a62453bfc81cdb173be90c29a3057f8da9cc4b396cba742cc4fb29748d3a874d5789c728a6d746c30c340ad0f3940c60208314fcbf624587041920f97728f0ffc64e13ffbf4f14cf3324f01d993b676436c96cd632c6c480861a8329ff7fc60839630e40880904b0d2011871a418a2a78c1172b4a44a9332e26343c748d15ff41791e9c02b9909bc9259c02b991a5ec9b4f04a667c25a3e5954c9557324e5ec930792503f44a660819fa4a46c7eb9832ea9815bc8e01c1eb980ebc8ea1c0eb9808bc8e39e27f11213b367eec1013c6ab1838af6248f02a868a5731508851537b107aed8183d71e7e5e7ba8f11a268dd73065bc8659c16b182a5ec360e035cc035ec300f11a2601af6158780d930b835fc3c05ec3b85ec348790df3e4350c93d7301fe4780d63e3358cce2b98315ec1a0e0154c9b5730197805a3c42b1808ecd8f9f949f5a8604a7805d37a05f3e4154cd02b180e5ec168f00a26e7f54b0c5ebf78f1fa658bd72f2078fd02c5eb1707bc7ee1e1f54b0caf5fa05ebf94af5fc4d72f38874f90d4ceec8af74f1df97f6307fcc7309c8401e4a7dd32c008011851d81d184154300cf07f60845fec3a4bbef0c0c6385ab6b25436ed1297a0ae8daed52a06e2306fd54ec43b8fda8e67693f7b73258e7d182a8f598f56a54bbc8228de4d621c89314ef6e970d42da1208b4d1d8eba45cbe6786dd9662f9eedf66d7d3bda06c2a3b6e46937d090a6913a6c553bd34a5d0ac9cc8d6732f18e9a7cb29f90b983b25d99faca35ef5112f964e6dc2c2c5be63e97c251b776b7294a2bbd626f4cf8f17e73f446f57f5bb258d90a28509ee592114b7614e2272c6af3640af3ad2ad881f461523c7379ebd836c7fc01d1139dcb3b62dab6d77e45ab9ac6db3c453de67b9311151115d9cff6e131d7b4d556058ae2dd191c31a9419dcd5b0e69730828e7109ba43673986db62c51bc4876766ed5dde4a94b2af6ab9d7ac4b48bcb6ce6b40a042d097a379bd144adb5b9c33b3b6b351d628b73d79671fb0859e693040287401004b7801b04cd9315ea977ee5ce5c0ef1b831d4ad62ead7c6fa089bd7d4aff11a8d98642a994a8ca3652ba67ee17676d2adddc8ba994c3ab66da31671ab6251c65daf580cf15f28a862a145cc342c80fc8a295eaf6861b5d2254621a8d4b20fc356abd8154ec650f38fb631d36a08c49fc84a91628540080a81cf7f1c65ad1563acc0c18a17acd859215a719fcb9d473b6cc5c41b47c1c29055859a7f57f0f9d4646a118ba753947e69ed0483edabb461db0869635ad6e1976b63f1746a69f364ed96ec30b7360ef5cbdc59696929dcfb14afa9c32f53875f5ba767a3abd44bf6c62336af1216c95cc6f60e5bc1fbde6ae595bdc356c2dc99cb3b1fe9f06b87ad20ed12376d9c75383475533eba25d236479cc3d1c46b6a53875f7b57c3b875dbb7ca93521395112b6d51648da77632b5083b3275f8b5639bcabe25d2d3de612ba60ebf965aaead934abc84c9938e955729bcb80af9b48f6e89b4b4b47577a93cdafb3685587797be101fcd6a352d6a6df40de97c93a03e3b5edb98ad4a9b78d4e68dc2238e8695be10df68e379c52bb4b159d3364a576942faf42e8be17867d78ed77ea2b5da14c56b66a1a04deab2a909b443b6d416cac51233f75502ed905d9938a7a34c33e3db4e0c37fec278394189919258378348f69b8da71d63b5bb71edc2a0b6bec5ecf764bf2d1444924f78d42f6de2d76ddf2a4bad28adc4a46ba34ba604e3eeccae9c989c9c90ac918b0a93121321302184891bff97e06289253e70956d743269b74a78b5e8520a713866dac64ea193d353e86462584d2b99fb3c0a71940e472425b07c7fbb713482476dcd6cc311ead6ec3db2396d6a33dbf2dcb953ef60fac8963a05f2b42326f50ab77369c7286dcb53ef422c0371cdaa9020a9b9ac1126272414ec8b5525669da858a4d6376252dbdc7dd96fbc2a10b477e3306fd0ee5a4de3f09638679e2d103cc18220685db0960412ae798faccaaaa2e4f20d46de2529d65acb82b516eb1104414b9a793ced03ea7f2baf6b36f07f4040761566996ad77059d720fd676d1c4d2b59bbf7c547b6319be188491d52368f2801c8aa6e668ed2a96a9cb0ba1bc6b4195a5b8997d4c4a08605355acd4ccd51898180acaa086a49910300f0ff8bd2a2889340d06ebcc92b8a3970af9614550780f03f6cc009ae8c79e903ad59eedc2d6f538dc93c99a2b492c932f54bd7c6bc4fa55718625aa993427cb44b3c463185b98b5b67c89cc9fdaf67388881115e1801e79fb96b95b869dc596dda2fc4396cba44f1d22cb875a94bfd95195cad6220cc7edbc8d42f0c95954cfd521acbb3b5f351289e1a4b88a17419de962e310a635ec2fb69748d78055d264569a55b9a3a245d8ab84a898df0a85f4a4a55764dcb469dc733aa9da8a45498d2a0746846040000000000c3100030381c168cc542d17050362bd23b1480015d9460b866441a89491653ca18430800c000000001000081310a004d6731315fbbd7c35f1e801557a1edf330e755f006e3b8b2e0265cca86cd8b3970d8ed12702f4d596d9f96d6df06adc9d0967fbb4662d0b5d4073d73bfdfccf38617935b3bffbdd612fa1bd43911a232955d72b200a850133d9a38a1957793ae1530938e78934953073e4a09840c8132365a594cb4db2ce4348fc91d9b4e8891879a2285932eb798492bc056ce4feb44e43acbc60d8496f4a8d41fd854a9c07889b216c9ab24a9231f1b0f65d24e0b50933626719e3fc8fe9709bdacd3a412eb3c0c619a5c04b0e4a1e2443dd1953848f9e390ed5d46e7a5335887d8143f2040ad7e6e92d33c049efcbd02f6120f0771ecc186f3af1ed0dd863e888a3350ab136d6bd1e3d6d24aa4e1b6c53cff2fc67e9a0ce7992bcc3dd1e08d17691023694987badc26fdc6a59effdbc9642cd726c7334965456e82d81df2e78c69b128a0ff23534af39c30bbb3b0f122200eaeac0cd59b1f19cbe0fce02c3359159c77c09a5306aa05bbeed5da064b5275d039ef058ceb933de9a55ca4ae91fe4263b0c295ee964a1a3fa83d5c666691a5f857849a034f392dcf25215b3a09da31195283e9a04afc19375823a898797af9186ede46fdec683ed6f2f0665c741071c321d6832f30439a70ee7389126708ae5f9857a462728d7163ef492806679d7313f7daa7a86037978fbb907ce9073739b82fe575a605dde76c90e66d0281a0860ab793130f6f26b5e52e55b08fdfa114818f5071985bce65eb0f768ffa9ceb668583fd16c771f7a007d201b9f481a8111f37120a94936e9a61131ee14db369f4929024a83b913c889cc73be1b7cb2a8f3d4093f274b3e01809459543160fef8342c934cd68bd2090bcff2ce27d0831d90729de0f891e69b4229fdaab45b34a08181a7548c250aa431886decef3c3e0e03d25ceb7c7cc39de2f14224ad8cf5f60b4a39e6383a36a63c1f9c089567e6ff657341677cffe53be6c736c704ebc0fd09bd2642273d261a6bcee688f97295ef8c59136b72626d9df55ba075c821cb0342c925a541cffc03007fcabd79060ef03f5c741e497ab38a782087f5f16bcad5b1881b697f94db507ffc1527184b2dbff3bdf2bf30db7aa2082ce717559a239e450e3feadff5c3ac9be846efa7374e89d0ef53a51a717bdd3046c56557cfce261a565d293dd94587646b6308fc46523b7d9758ac97f59c370c2f6b9e2415496ecae77c76aad6b413e9b1df8c1cf9a14fae958da27e83bf6645d48949a89754aae8801246190e85198a35ad551972a5fed9fe2ba48e1f699b54d455ba2930ee7a911b8999cf0a35259f0c2bc19be16542dda5e01cd2b44689e8d80f055395c5580663e124905e9ba05611b714c43f2165efc69efa48e150a1fb1464879c931b65113a6b4ce99ca741b63ff79ac3e3090caa6c3bf1d3a883f402d52226a9e95b25f3f430570f2d6fd9cf2208edc4e729fe77940589791c186a2edcf29af0dd86fea5c61ff6775812cfa830f54fc75a1df112128e874dcd2ab17874819004ba18bbcf343104c4284fadd894f9adca9eada11b56953f2e7700b9cc0cde2a913f0e1f3911f3afceb83a435f7758e96451ea012b4bec6ec8e5b62642bf51eeb0a867b7c681997a49d1e995184bf58a66d74bb85449115970495b08f82adbb94b9f76061bf3aac5e72ff9b6b7c84d6be902aca9c0f540a0a6ac0b2f29804218b7a23416f20d51837191607f271bff80846d4531f23c915fe6032994cbc93b3b6aac74187886514924c8e4c0c85174e4883f5da352e4f0e1f5cf3c90e6ebb5ce50aa9e054dc73c2c943b5cb7ff351f9e064e9666eb023c3b8a73369306a13b7188d56be0ab72d3c6a4d6b5b94eaac168b16d438eabbf92a66d267332089b44a834b17db052bef3158a224154ce90011a08ec1890864d16bef9aa711c7375e9538be643fa24966af13bd2b6234631cb47272f3bb095e7d20a760ef35ddcb44f43e5a6c2a14885f449c2ab9a0f611912b782ab4da8cf18cc25d0aaa76517f86c319a52cf27440471eec72d185a2a81775c4f35f5ddef56797a33bbd278ebbe47f0bdafa1159cc7639ea27d5efc69ae3037feec05968452eb6de133e2b6088c16b027f712362be4c7b616f99fab18625feb91581918a27ed5b86f5ea88433068a495462bbf40b2e3d09b8816417be586c4ef2604067220363388b9e1c2f09edc9dc81101d2bfa0273a38a500855815c8f93b36419ce619d9a1f200c46e59bb2db747148b738b1bb6ba228048ac38b530acf3bd30c84d105b73965afa84d48ff7087d588fc9d8bd46c333eb9a19f366b6109dd0b441bec2f07372131f6fd52bb585e2d1b24e3c3380bcfdc586be0d3670d0674a2b377ef7ef413dd85f16e446ac6a7bb0fae2790c838429ae730326da1750bfd31e61dafef836b46c5c71ed453f8ee51d85b4b7c470c0a237edfecf659e3089d21bf47e67686a802c51ad8f4117bef3dc61ec6b067bb2c7723bdfed3fdbf61732ee7e879e017d4c4493d78d50b8c57f341cfc59db394ec6f5fce10f68431dd7fa50a79213bd921b8b47d1b00edf205ad5440df31b4c96c35984ecafb631656368864eab9a49340812d695dfe33d3136ca3c3806d8f42a2cd35db88506561a635392642261156048aa709ef3a0be06bdd63c1e23a6b177d2918e73cca9d297c8cb5393adde09d97ab4557ab14c693ceadb751c6c03ae63846fca30b0978816984f478d370ca9b0e00b5a08e1f1946e82bd2df443411d3b291703e13be6d3d6c1d4d9063fa8fd73c3b3ea4f7c0627b391cbb21d9c69ec4038dc55d7fa203fe454f6580d8289cf0421e0139d77ba3b911ac5de50d73a4d256129abdb5da8d424354e9bbab349282a20f8a68d33848ca9785886c624065f079cf6868ec86e81e8f1db9f73396087654815c81d592ee77490fb6ea96e0ab505c15de411536dc897679dd87e830a8f172072179c7c4e322d641b2488a2cf7a5e0a3db57dc81eb1367c752961ce7f041d9d6a677bf75d72e6ca0a375810a79b7a685aa8ac688bbcaf9207e5e72229c3f142a988b68776960309a19fc7898c574c05c36aa73030f3413f9b631b442bdae6c686ea755509b8c4a095139be6e378b1cae1db1d9450c88df94c509a5817d7913669dd5e6d0f5a1dfb6f3e40d28849da583b3cdd84b139ed6a16778368e74df656f7e4ef92fcda99a01e44d7494af322a1b4b277af8598cff8c141699cdd937e14c3ee7bee3719223096262aa5d133d2a505def6124cc68228c9164f52597f785da15b8021482218c143b9d796ed1de062c77956968d6070f33ed04473ef89555fe8023470ebdf5df3ab3a06bbc1d81922dd09c178e85739dae80e87a81b3df6acff6fa23c88179c5452648c9817f06e5e40a85a0c0899105b19d267ab1566e579246d409564040cbf76e3a952d11d39262287bf74a21f7aed626a80be773c370a6eb4207cf9bdadc58404749d4022ee3313f7aacb8103500059ba08351775697c20c4d1f00b653f428730bb800a28e0d29d45ba263b30ed8c71e84ef9d1dd0c0c15e564779950bb5dc2d724102804a127f0f0310c1c62fbde52ae8cf861f793abeb0852e6ce6a14548ed45bb533287ff05690594323fb7357359a5bc51343ab1ec07bf08259931a8b21fc13bb83bbcc09ab3498ef9796736501ee9083630f881d8c6065aede852dde62968c30321221c378c8d49af346ce4ecdb2a9ec5125921703babe0531a2148c45bce72acdac29137144626ea1c9d8154fd86501597518bc6971f8119ddcb07f1cf1f815190079caabad31367c313ecd7dbb84135f0a38f50247634eb3b86ecba10a25c4bf8d18c2e951059668dcc41cd85397b0c9d85313eed22fd6784158141206b3335aca4a0109d94779634fb15f28a58c0b5540f6c35dea4bafaae8e5ac9186e0d7b1cc1dc05ccbf8889bcc76458b816ccc8d1a6ee460b42e50e98aab8beec964dd69847fdb6831516776e8acd134286f60923740904eb202ef4cf65cb2633db2d2a8b3a20d1a983cdb3c4747e45b2400a95cfc2f14d5e829415c07bcd2b82af2b2fb25191b16537625eef5a62669d999cce2b7428af7bc3873d654e221553197836d38e334695563f384f07fffb6902bfa04f4148b3990a3ef037d26b15ac4df239d11e8072ac78874ea752046257df957341dd3de05e46d437c5b84e7334c4080a15fc209fbcc3293865ca65c49b150c3acb8991a19d48569d2b1090d99ed1ead98e91f2d9a1f465d57ebcf50fca13703d2fd1f9a7711280ed9dc7ded792346f6b5ec4cff8766b3b37c968c08f0e222c1c366e2614f4776f7eca33f384cea331de8798d075867003c4f81e12aeb26e4eeeb67c6d68f637076b50a82109f95452403179501b8ff33cea330ca473f48e8bddf7112eed1a7ecc42d98368499ccc67171dd61b21cff4032c2e24c433d851500d58ba731ebd63273b166357686c8fd61e935705b769e34b5ccf0460eb1b30d53878ac9fe056383d080fc984f845dc171b3e018be4dff8672b8a98e5fe30ef02beaa87485826382ea204045b6c818760cd46f714a3c0a1cac63e37dd15c12a15c782b80ccb3469f1a1f79f3df3b6dc2cb0d8acb819cec4aeec5240b86193931e2d551b77564115a0f1b2e60ff5d01b1045313c4a15f55abd877bbb4e9efee2a11ae46a79a0b7e89469f75862aa11d807640790013a62600e48e7aaadd180990fe74df3c9c17008aae0e5fc8bc8f51d3a1680b7b5603ccf537fd8c11a2aaade96ee1390351e39637f742d95b8413bcd6e62f2f7ea8baf06f37c256a379aeb85006213eb4d5acae6a5a989cdfb8416742ef29bc21d97922bd3a9c0bc56b6e62bd934a0b7675608051ea4233440ce2bdabafb32f5228b6ec81169cfcca76572a484431b1a5f7bb2e85b80a920c3bf6f7e8a307fcb6d263d46883a169ed8b836b5c9416d90bb818f74a6d39ea8cddb9f3b57f01b6424479bf25594c693b98d1b554320af5d83fb1b437717230fae94170a17a621e28da3e6f71f0bfc9cf2aa64619473070c761be5fd23155a4b2137a710cbbad483e4acb1478a850218cdd2983f3413d1c06bed69cd10da294f25f6e2bdb581fdde15eeca8296850e39f165d8d66d185b17eacc44a615dc7a4ba0fbc1aa59660f9d62ec72769ed83ad48d5c0620baa479b0d163c76d60220a597e736f166cbb9c608401cb5c017058beb6efeeb554a3fba6564812c4a53f8f15f00347ff4ed8a74f571fd8377e39c494f5e5eaa909494b92b5c945f309f24df5c47b44b478d6d2fe7fc2e07e4c7846de4dc49fb2e6095be4ff7a4dce46c5da09e32715a4b09a4dc079070ed505bbdad503509d2df9af98f7ae9bbbf9a745f0a960b588fb50f224692d050e89e3936db22eed7fb66ea9d22bfe8e6fc5f1d9c701dff8075359ce826e75f39bda90bb9c30f7aafd1079a70d00fad10f8605d1f86ca660c8c14159742cfa013e3bf2fb1f68e9ab574086ed9cdbb61d39707219fc3bb0781b5b6435ab493941b3849f97ffeb4c95cc1619b791a39a411e289de00480f8007c0fb006e7838ff6f0e9b33d77f290598a7f11856b06506ee08addac57490fb835b9324ffaf8adbcea8d013fc4f7a12faa5caf4f722bdbff47ca4254ea609272c6cbcb649fa36cdd385eac255b5fd2d1e6f3cb6d1a5d36dd41ed2ff439c0dccb1b94b9bef32e4fdbcb651ed4ff9de793f6cd3f5c7ba5146c12c0760fb4e5d56c9cc46db761446316fe7f73e1d3f9285e558d6d0c2fcd711eb71a34621aff183eefd51dc1fb5fe6f64edbb679a534549f471b4e3abdcb9c10f7179ef83ab6f6f9b4744ec479e2e90bba23ae29581c1f5073485d8f1647bced15fb5251bcc83540bffce47279f6ce12f3eeae78366f3cc971ec5199316e5012a74f4c163bb42e34253c13553928b946123d21b679993352d93f9e1aaaef2a7a0f6abf0e4f3c763a6ed620578062847ae016d866c466eb911634c46dd2fa0bc61545ab44e17a12918efe2226d28eb5a3ea6a823dc532033e9733466f13fead670a5775d33f1b6e3b5505226c5c845b86c10232fb4796cdd65e423325741a02d3541021a5f6086952ac2ec027a6d0ce87f1823c46ea0ca8f93bac9ec76d453d79e01e8c3a6cc83f4bfecd05978b5a8bdb1d020d4ac77188b8fe60b58c7f8f101098a62bac796050ca510e481b8aa0acda21177350be094d2941173925371fbb7e42c85763f279412f95d6d8b496637d06d6511e537ac12fa92c67728a35da9191dab92c657db4e7cdb2655e51e0c1ce34596598b8d06784bf5b5040d883c4ef351577f982d983238fbcf2f71b3f350762880019b5c31e105081c22b23b862ab4e6a3b826c0e63ee329ff7713cb149294142c15c1d73f2435e3230be84a23fca25c13735f0052000fbd0752487f3fa81ebeafc21bd9fba36eb9a1c4fb210a7912eb3684c421371d411b2bbc2d22b6b89133a47847044d610b388da657d74e027a38b0758cccbd245ed7c084d979a0ebc8dca4a0fe0a8644ee4363c585d06264db93ae4b6011f4905677829c832a2b8360515108c3964feac6d8050a0349b4d397a4ad5b489c2e5b19ad34efa1e9a1c910e5afd02269ef342c25fa82a1f605f71a01209c4a74838219c57356e137e7caa1494db980cd237f301a79b5346399acb307c4238120d4980715df20711c42f6dbeeb53b99c414e4db0cd31c8e9c68951a7f3f3337ddf88ec98c32ae21088a7865c9de70b6ad72e2a0590110bdb4cfaaadae2d79b19d0225a82b00828b1fd2c6681e70ac8b232f0e733faa5d944d8541b40a339d86dce95a31271ee9d251c89277e3293c837302c29bcb00b42fd69d0b6a0b52e77378cd90d9de6ff3cbe2f604bfa80d1e63e0a4c963ae99568436944a1c30442ed832c0a3dad35a13fd8a9ca6c5cfbf028c1a72e7ef5539bf6f6d99d6006a7ecb8e91b1a8385b96077b3f36d216e93986539f4d97bd17d2e123e8e20ab6fd2f3ce5a254d743db8ae9ecf721adf04faea8e61479be602561f52a7ee3d894527a1e1d0311cfb94cc391b1a3d75c385d8b47e7593233e7e1dc606ae18423d60cf8f1108bbea5b118782400b8917b085c6bb5af65bc0acdabea92864c001594817e3b746886580f41f943a135837c0b9f629a810b413f3f66498bfa0b1596648adefc27fa69ab33cc7741c555a894ed2a220faab87ac47bc138e10c27449ac28c6d2b6c5c1c67b3c64ba433f6ae6921af7baf4631a894dba544a6637f29cecdf5ceb6549c14c93eff6250dba740d2574b045a939ae2c378e2cc56950fedfe06dbf2c634e841e8fb86d75d00385df89c6cfaa29371546a1b8a403bb43a580bfd42e57f73ee6612bc73ab012b1186c2452458aac0c36a21b0a81d17fa03987c51aff437c3c8f899389265503e5204695659d34cf0a1fe8759b838a52025360ab89255a28e7e2b4f8f2eecf10ed2c93cd678f77cb197580c12489d033c1415a4e15cacb953eeca78d051015cf6d3d9e36ef8c9ffcdda98b48a98d23756743bedd78fd8273c291b10e2c37607917856b7f228c7521265f8a8437e17efdcfbdd540c35c467a571e6d22fb8dffaa8885898995d70246b3b58b90b86b13724719b2a56e102319e347c5b4f07ed79d45dfb684c9e6820762fbcadf0c3bf46a2ee7256d87edd09810febbc0074eb17986c5daef8733d64d95cdd130f03f05abed5a4d255c728546f40fed329748d6aff7427ff6ae63695dcfd8981bb4a13c7c7c76a1dae0f98b04a300d48ff1a6020010cb869b4fd666e4a76e1bf08dd75333e98cade90662bee43f0dced344b7567523d0862da4fc501d8d0c457f874228a843fcafdc1feb263d0bc0c57d615868b0f5707b8756155408857ffcd64372fc5fcd18091d8f030d31327a4dd86afa21f6b54f9020de4f2204b14b25268cd785833fe471539e8f5447bb2e2e159b900188014fbd46bb3ea9eaa967a3fa7dc652abe175f91ef22e51f938d878d1dea09871ac6e934687051218fb803bec68a5c11013f555fd82c7afa49c794663edf82baa1d252aa93183868bc22b00e333bd109cf0cec88543c1bd8c4f6d46f9f141d11c3bb06141cd05b387e636044c7180ef89668d74d7a03675344d682b4c0b2481dd435759e77cbd950094675cb1a1ec3c956880459bdb9836d6c7e4022f15b8871546d2b01988c53e439548b506c0816fcd81c85742d077529e0d158492655c47f36a30988c90c406d8f0d278dc5e4364208843009539c177a0762ec2568234d1bc1e57f5ddb3f780390e27cec8e506e7f4bda502ff9ddaebd3708453fdb484d8448690a10388a7a97882bdfef87ab0a639cb9dc6a5bb94d022d015bf4ac586656a75d7459cd914d17f182a7c33d5e2996d63c8ee864e9c90aa407ca8075fa1ec8cc5d3ed90f51478908045e906d81a11406c1f2a9ae2bcf5ea523c5894d2f6f8e712b1c3878297fdfb9a0b2476145b3837ef0208b65e2f618a2d950b668140b22223f8e0051c3830b02d7e8656e66fb08a8b9f3fd22ac596234da13313bb24bf24156d32ba95bd9d4aff502171e7a5d0f8344b555558adae1dd068e75da8b42cf0c82af482a9a3bc219b6522c06170363467167112b422e8b1680c53735d9fa17519f2a0157e1776c6e8d16b4e583854e9c500f6946839998c0bd29a28f32e609a1ff765a726c57bc28b7ff4fe05fa8bfa46458810125ada02047a2be79fa01cd29f457d525a66557c10f179f58c5df2138837fe2d1b258e42ff2333ee3285ea935087de2337312469ed2542c84c337f4bff106841f0678497cc6ab17ec9ac084db94489bc7e08f52132820e4445c001c0e9133d361574809ef02ea6824127c09b0641feb318fd681abf4cc0945e9ffd5123ad6a5859c699b281c09c123cf01af3e4bf801c412c9e5c2607a9ec005eaf0357c5879fcc4844684b264ce2f3ebe2b4a65c493b8d460d1d53a221f5e482dbd83de84d44cf0f1922c1a5b932d73d4968cc645a41c62cfca723c2ce1f2d107eb6dabd50d3c2366b19c8f107fe7103578c7100b05a1b29db9e5714ff5f9ec7369cc7ba0550565923cdb4844ed944b7ae7df53dce6ec1d432e86568161deaaadec379072b24bcfee8b49c8688f8d23007cce52cce9940f2564173772aeaefd1f57797a3adf5ac7c348ba8858bdcf61f1b8206391f10e504701ee9c11b371e5483bdfd80c0075fd405d7092678664104d112409ccb6fd6d25e24df8605ab36b0c754810c9be1623ee77062d4cc4dae6d2337e507b1a0058a79a33a2eaed8e08f37543cc8d9df468c105ff0912f4859eee93a9412a2360a02b2d136c526da14887867257b686bc5f41446d07d1b17732b8516a0c8014b53dff39694d10710715201780ae9c6f9a1790af7ecd041d05748ea97b828040dcc2ad69beb6991a301c2021be9c98c51bd1bcb4cb8314c13292943f79be4de0e2858926316ece61b5b9f872b068f4e06e007ac7ba4e82278ba1f9e51adf5692a2707ff86a4c6f82bb1cf28798ca4ca73f24133a11e42b06e82b9330bb91b6a05da1aa0085d1376d013222b4f69add9846e55f001d553b06c2d32cf1e888ed22870c486e88f294305945a8902abe6e3f14ceae56811dbd7deb40face9a50ea2d1fa105ae3e3d858eee6b249b79ac1bd52bbc57b181ac748648c5ca681b7359bacb34c6499fa944656a9f928d6ff99a0facb60196901127eaa6d71139187e5eb2e9bff567d260343a56f7fb033e195cce1e887466a983e802e4fe71e194d84d8abe1206600781620d7f74f79d531584519a02dc91539244e2a92f7fee1c5333b0b60d5444421293aa5dc99f2a5ec499d8abaa9b2c6f5858614981e9439af0dd2769837869ecc4067431f9d01c41f0414ba6650181e31ba6cbce5c1688258f71ef8e184424f289117ee447106f21109454963e0b44d518a0d1da2019db91b50c761c1e95c5558c38f3062c66acd0740bafaf5734a875dcfc8a948a9b9cc6609c51465159d1f6e5ff4dce7f844b6a8786a2d20412b5e8f3e03cd002a67ba434b0c91c61859bbd2c6ca6bb08b2380c8f95b6120fd0351d45c3efc110bf46e22d60b7e394411707981e7fdb753ec542acb11682b5ef274ea494f9deb466b346b43499a26891182846e9642503c3c025099a1fafcc596ec7f5fb975328843aab24e84342160b4aa97562ba36399f5c23bad3be7dfea7a252c4d5fa62eec9dbfc59cc9fbe10b168fff67ef52dbe527c7620eeacc5470743badd72508c69c37276e8a3358b62603f3708bc8d11644c5a2fa606dc382453f8e8581690c6d8d95e98a824680c45e0e33b7b2d24704faf72ef74dd236ce3f1f45a1f8edc0a201a6fba0a9843b6f3d93a23a1fbdc810925ec3e86fc3a9a79e0c8a84a6834bdd7261c97e4b5fecc1c17d3950d12eabc2c32743cb5b7b9993aac1139fee99df1e64b91b91c5d3fd26443b9c64b038a62967c87917003877c1efe3cc702d61b642491af8dfa02791bd56eb94d36986fcd14387e59f44b1f9783b643d64a103886e02447b0b63265c999120490b001f48808340fb202e8ac46edc830b97cb94ac345016ee33d74841ac091ea34899c6a15fa61785a461f16390f8b1fd95247662fdd6c5ad1257fe39a1287fa408c800914be951c1a7cd61adf71af0294cc6b9946438a23881eb21fc1558876a413f9b466d7d5e0f08867c743a605c1aa8122549765c44c79d0b0778cbba4068eeae814f81620b3b2329ac3102710f7660c37defac7e99db9180002a72e6e6f548ef19ad05bb9f688617edd8867d26cf4c0cb2cbf07c24c3b70c24590f3cface6814a23f132a3a3088f5030f8a78ec5184bcf14f53ed62bd47b192d503745c6a81fd2381b83bf06b44bd5343dbdc1d5df02b0066ec1d54ee8488c9c8a107a2a0d14cbc3684cb5e986c37b0de8f9af6ae0a511959b9e66642ffe691eccf442b47342787ae55081d6420a496372b55d462e63aec4ec51979692e272a73e8e6618e248375ec590a6518125c4a546222040e3f3b4332590fee17bd9451f6de27393ce1e0f1b87d188b2c915126c504aef7c1c1d9145f32a709b34fca9900cc8cca614fff76b9fa53d9d10881768af6ffac26bace0cae6b9a462d738270d9c74a079ee1d39490cc4484659908db43f45c7d9f33483de3d702458156f47c9a64cd52a9c9c0acfb847114e0d46f2d7a7e0903d97826fc419acaff48ec2344e542e23d112f547fa7c13564f04819ef41fbb0e0dbf75d1b6ea2ba55a1b17450c715c48c3cc8c46440870db0a7643dabb06122163db052d57c467afacc30b062ec1ffe94a2d6603f34a82492aff6b8b5c252b59e1b068e99c523b04f4b0c50d32fb7662b68a41da6e4faa05f05364580902f46e70cadb2b46be3323cdf69619830703bd220c34116fbeb5207f1e9a396f7747e6411c55fb2b36b3723440e68d3353f2016f674bef71286ff0be16c3bc4137ac235e6a47893e71802e0856e3be473f069ab41c53375c5e194fb7fac92a06d352c9a254ab55599beba118788316ca0776618d95e4431980b350d3cd8f649c6e852dd7bfa662eecb966f0fc661e7abb8ebb102356f80dab09001bc04c3034d0094a420c1f0113edee5cfef233c488620e80335192d1e527c434003a9856297ed44e7fede71da2072509d52687928ec0bb2963cb982618d33e751625c69ba25abc4344e9cd64a14330ed9623d47ac3916b8deda40cf46bdfeb3c0e0b30bd8562cde28ed2abf3d97c6e7001a003dbc60273acb07d028e9047171e904bc18a8e60794012a8164850d066f9ce423e0b4cdfcce49cf4ec24b0d3d201416e70056c85a888a18487347f7a325307eb0a089a1ca88de155c611afbc6842beadab0da93832e6d3d167496751a16a2fdb89c11f9d7f99d3a2e53904f51c6ada07ec1716baac568b652714d21dfd0aca09e6c8226687b8fa27be8b90f016d73825de4b5b0912386c313502838bde7af71c394a9f720230a63c2015307e93d8d00e162d8b8b363aed87ae1d796053da7012828a9b4cc70b01b5d9eb39d54213b5481828908fc0ed9ea911546bbb3eb0d68b391da5fb381b1c806f30a2299dd463351b26e4e9f5deb59d799c0a7992a5340e4d76e4dfa778f02b55fc882b77a0a5ba8c7df4714e97c6582872ddfef90aa58d00c1a6e4fad95959511bc287ab3c4dd4ae3940978e372afffbf8f33e3c8c9753cd3929f7674eb8027534b30d4e19a065395b7517d4cc44f59649df2d6219b6591f224b6455a9f4bbdcf236e6d07f846055992f22c849c47103f78ded583e19665acf6abe96b8914cc1cd738ebe2b6b9f399b2417a3c78aef16f3d79571a27407b46b08302747ae3942d9111dee21c2e6296b52edf1fbb48081fd9063f82b09b7010b9411dfd9e93ad632894fc922af52156ae9068711eba306bcea5368eec6b8c1c464a8f4d04c87507ab93cf32362183f99a864d9f47f119b88d0e7a0039000dc0b03714fbba2d1eb96c23ed2aa3ab702b3af7c3fec6bf7c274641a7f3fa480cbfc0d46887bb6a2f15cc351882bf97574a4fdf6c6621029c52ba69c397a8a818eb285940407cc587caacb017324de5fd6100ae6b9b78822d36370ee319ff1ea5cfcf47cb8fd7a4a5ca149f16ab2dcb694de4d5c687c49c0ce0f9e45769b669c732ff919525b965506a2031978fc97083130ec2ca79c34156ee3238f719a330daff720160218b551bedb6eed9150d5f4e4ab6e139d5e709fc424a52232537f8bdd81834eace403e794dee26d45b695702d6f8f7db583fc64cd16fbbb8e18d52ecc6aef49ccf0bb9c010fdd7fc880edb7ac2cf4ba8e1b8eac3bb31ef1910673a9c5c91a4126a0e2baa688f0b67cdba2baeb94742035f9ccac38ca04fab25b12358339f0cf5c1e5e279feac974085f38257399df0e15ff2983e410f433b9abbfd672b8fac0cd7d1dab1abaa683141609ee3004d167a9e8e9ab17c4c7481695984cdec9da65bf46f68963f6f73018905951ba089c734b191733a2f793da7decfac02f3a7180cd8b5b6d53f17737d0f8d140567573da1a7d087363202145bb0a5667d7ded927df27ab52e90e051b4f2fa48a6ca5ee8e070bbcbba09f1771e66700b7a966ac93981ce4991f33094a5df995a216c8e6c0375185e0d20cf2597c6a233a6455915ff7ad6219c0ce415f259734ab8fd1adc339f7bf76de1186932c3090ddba3b4318de9a224c023284d789af8883d4fd5b2b68b78adacbcd9c323f08147344ced7ae19a8edd2c2c23cf6d34de9bb8df69816bbe9eb8a2af71f303c1e8d33b91dc6a5744dc1febbd854787d07cc27e68939a90d1b9d78d024289319468a5df0324b82ca8015ca21d9e550a17dafd7d2613f5d90c05270cea5da4e09f5d87a4b289027871384518bed3c7efac944ae6e70b164026c8f41e6bf0cd515bf123a17b7dd6d7980172f3075135752e295f15ce67e6b8504470b4201dfd2cf16dbd9db970b6a75876e65e5adff711917f0cce68b1354a9670e8f156743b73507aa24df76ead1fb87fc89d08da9b5ceef7dfc8507add58306ebaa74e714444d6a4dd0ba6d90d4985b1e56a23a1e9233b7003113b45b5817ec0fcdc33e1cf668869e526538c4d1a29567a717e257827db6d4c5bdf491af59fa5cf759e5e98a819384ff8517e1f731c7032cd158c2541eaf4aaf45951366f0fba909ef4228730daa00f1a177e78e227e57c97d0a9b235f23acd0236818fdc93e75d0bb41f1882b1838300136b30179ee0bae52331d66789e9ed03717d8535528177b03680b6f1c31801ae52413c5a443ffee337a3783733ab652d8d78d40f74b4961aaf0771c26a3b9cc5f1b24b271ce40134105afb226b88c099220da3df97908ceb72e63233b2b25d78c32ef111facfac1ee84376928f643b0ee3bd6d6c4f5b001865e1a7fa4b3b295a7fa48c28c0c33b6d23aba724dc414550f4a9d82568d310c8df69acb44fa1b61dcf13e12a3dcde46008f61218efe329d57bf28e9d13685d2528462aa109c6c376bd169ae3a01edcc4651ec3ccd27a9cf4960589fef6468195aba23f981eaec3ed4c5b9fdcac05983edc0b17d8f2c672b9d87c43992d957d10fce23da61a213aae749164415464dc64861595399aa8af5b68e12646432d83ffb5b18f33c71cd8606fd75da561a013a7868a190c31e679b433e76e5a84b762319fe96627edf2b2576dc7cce3c531a0cce9d5c89de5561ae940e3392317609ea8667d8aa11356cf2fb4fdcb80e3cf7b49ec9a573d61e602294e1531acbb1163a7766c8497eed3466f179302ee65abe1e3d07aa3bf254398e6ef5893fbbddd4f641175188bc0e3ca1c9394f5bdd4c36cae43b52d50f8be73bdb561dd6a9054cf5e4d7cce0ddcea55c8e6e9a3ad66930b21bdcb1783ecce5b04ffea3abdd61a3c1004e32728aa20a50d87cf3b731947f927103577a4a562c2ef8919c595396c5ca5b8e29af17b5ce3a3e655d6b17043e1d4f7cc6265c909bca5954701d3f7b9558a0f73e8f26f57db896b681dea3054eb10852156df2c4e37331bb49e7de80b579cc471bf2bc48342b711b1bf288f3f35e3fcc9ff31c758fe3db52f83a4fba7653da49205f3853d10b19e49f7af7d8cf01c6d06ef76fdd73da357d98360dd7fac9ba2324b7fd8f317f3192f90f34481c1ffa76396d2ce235d64db594517ff4b558d1afe1272305c99eefbc622fdf20ff1ec6d6f54bdffb761c1f21f54f7ef8fda3df76a4bbbf813f3f0b6db3e8ba34794e485defd858d5ea0284d2059a7f7ffa916f222f27f837c1fb7e404069d2270ed8d0fc1be1dccebe8b9e8ccfaa674b328203680ffb27807f06604d0e64c995362dc9df23fb1deeed8e6dde3323846516d7fd2dccf5177ef3a6f92f3fe5722340b3e14d7a862bd3edae5f408afc89891952d62f63cb6969e4095beb734e0ef238b3ccd88e45cd2ba9ce50848e6d2c85dc62b5e9cc5f8e0ccdae7d9b5631e31edc100f6fc18db3f304075f9788d40f58502687007399deb5ba2fee3ecc7a811cc670174bfaddc04961e2393f539bbd86fa17a9a7c2721bf059e7aaf8dd9dfea9a0ea0f51588473a04abfb0d7fc70ca12e7d6624a25f9315ec3d78ebfe9ab40879921042719d7781991cee1a57fbc15a01191af335006dfebb83f5833f647fa0f16c52f1e35bea537f68a3ce40764f5743d627997a996cf64c827fccc9ab05ee5b02e8ee21fd712ef92b0f1916307628c84d2f39de5fa837a4ef0dc8855b8274e97cfe4e482c2e01fe396b23bd15ebdf1c5a7e7411e62dc9d6b7f480573e6f99de2f77d3a96acbb76e3ab6ba15a61395437a17fdb8d69e30c3b77c232cfa555225d99b48d6b77ed8357810dee25d0b90fcfbdeb9d01f9b3d1bb9993758baf4c1a42fe4ee7a441fc0166c2fb178ec38b73b8d2028996160c65f41744a5fd349f6ae474dded83bb746e17d8ce329d16ef7fb85ecd0f0f9e36d7f4c47b1d8fbff4bdad6bf1ef297d913bfefe37017288fa90d6ed1e4597fc63fce80e16f10e60d58719fa591e8e0fa2ed2b405ee37ac7f1a8c75fc8c218db569600cb81cf1f172fbcaa03d550592178446a764bb5d1324ffb7d779e1e52f7658db5bea7637040cb52fb2c50d62b6d738b7d0cee079fb32ea4b5cc66f8fa9d9fbf7318d14ca1832bff23babfa87ffe6171acec05ad7afdc8bd9cde06b0c861a2435398f66388e9d9389a083f1e3452e9630e0cffb12d9ecc5163050384291e73ab18ecdf1aa0af04518d70f5aa631efcbd9dcfa22687c9e4aad4745ffd07ac31c9ceba9f3169fd98ae62f15094f04c2a37172803eefc8ea7c1e034c36aefbe51643ccca43838f6a0c885b1f035a2aa68714e466798ed3ab414b011255585223f97c72a75febd90073093868c425677f0e185ff66a57abef3c3c9683efab445f34efe685fa7aa87356c790703b9fe571f7a08e904775b1fc408ff8f45ecbe60520b2ca05c6ac707326d6bd235bd3b6b43e87f772c2476bb605ebb78d82676ac5c00b76f335a36ff4f84c1bdbd6f881e19f8514fd94c657face7eaed1c8fcb7afbeec867c0a5f1038775ccd630744ec5f7dc4c1b2fe26b63a4018fcf2082f8b75c821acb5c527dfd73849481cfb376ce591c1a42b6edadf120b7ed0b018ec16b499456e50238656a915308c6d57e0d962fb81423edc6f7ae7d18766589e8612f1c82d6e9beca0706c66a700832e104bfc20177e64a4b45ce807335c9dadee3b9a7958534d7ee4619644bee586447aacfc0c5f148b56d84c456cd349a4f93e47a490c63a9cd570d6d76b6124b9d6fe0e8f072b05a18d07792852e029f268232c123590cf781663101cc651acd44edb93c734dbbcf0bc802166b338beaebfc2f05c4e8eaa802506f47b03a0daff4bf6aa3f3defc933673029518bf0a4096b4a1ba8c408279cabb560b6164ee21eacac6da009bc710b064731e7e8633997c29294d4bb87d801e8c01b75da1d94f9c44254b42a5e1ecd4c6bf74164edd63271d0ab4421eef1c3c8afbf591f29c8ebe7a87ec216b67f2676b8c0ed65962691de4f22ae2d5d843988e29eef14d11f2074a9b89a6f5e85189951b89518d5baa41b1424bcae0eb23a07883c60b03fe0cab18a5e5c099b9a504683a8f23ea6905bfb0ceabe2f82f8c55e75ceca8a867d417657fbbccf346f391dcd5a35f3662180a4ee20af22cd461d0f5848be99a0fa90a2b19880b279b96e42c201bd9508070ed4cb269964b139288e1d9ce05aee2f99ada557383be0ab14e3f9f55b54de5492e32bdcb3b2de1051091f02fc22f730cdd46932fd5345bc6b47d2811d5918b1801942512cb12b2f6d5b1702947ee56ee8493fdc9ab5a383bdd0348fc7c38c21bf862657e3f60fa4d7c7c81fd6c30c18082b0ce526ceabeeda286a9b97bbdbaa387120ac261ea1714cc999100631c34998984b9c58c2b08cafef1f436ef6bd9df32d11d33b5043ec31af2e85241c17d62a06f92ca2a729709efaccb9981fc403e3148e5ea4b8b3299af7a1bd25ced769fd2a3f1a399d651b32c093033663aeccab187cb5c338336d30169602fd2c3afa59747431118e67fb07ebc7bd13a65d841d7d132fac105964fa180803eb420704fc7287d01b31b11895e97677874c8893c1142493eb1280daa10cefd26e2d3366081afb22cb402e25dfba2c55a0ef1bb769061274d2e41edab7ce6cf7785ac1571fbc2d526235d4b32818e19195173cabed4dcdbe61b505cf518625ababaa3a884a582f48e34ba33f69a4d6c6626b287e94b262bd5b1640fa854a4620f611f1f83770ee179ba7eaf42f8ac6acad2d9c8ad032828ced89f43d31f6a04b26a3b6f5698be7550d443f93063b6a49730e9179c41433a33a8fbed94aed6760b7ff646055bff07b5fb249c82447135dde1baae8b6bb79a6a5a45862afb281f11c79bf44329aee7d0e6bfa86194543587b7c5d355df0bd592503fd6eb7321f0a4716c06b77bd7b22721e9d8262cc3b6d62173c8274e6821a9bb628276b4676be15336a6767991f50ce7251c2684c16611b07715d54c56d3bfb690aa6a2701652b5f8c47adf7362811b3051aac8d06655725af89da0fd668e09e663eb1f5151a9b231665807b48e2469c0ae26fc141373af40471994b6b509db33b6cf1dc9a2fcc077896c48a009f891ac0bc0ab974e1a636e0d023192f9db3eaa10296a109f8d16cbabb48196583d6be846830fc9f6bf71e33b2a9801af618719f33603975b7a3eff55664754fff661d0e92ea9d1b07268740ed3420efb50c272136e17cd93e9ede2a9910bc5fd272544ebe716293cbb4433881d82dbc15cf060ecda5b632773bef24484d04f4b2089996f63779a9e8f59c0f04ae5c35d20db4621542d343dafed10f9445b2ffc215ef4304901be1490a9c3c02e20c8b05532acd29d4ca478b3d5bd4154c34dfaa4abedad21ae0aa54c34f56f99b5a51c9657a75b700a8a2777ea3d50db76c7df46325536f14b5b13c325b8147ed0818e0d567407ca7766ef9d268a14be692f20bcf19af0228bb8d75138e698ff95657145a292abfd4111133bdd86853f21771a47189ce1228fb37ee8a442bcb4e8492f53ade60c1c3de2486ea14c25c8724417fd60c92d15dd11602456503a04ca9c99aa85a913475b4bd8ba4d32393729cce241f9b8a7ed96282ad4a539084c25bd6c1b9b54e95c65d51db5fe29f7ab8ad520aa5398b4017d968524d0501e604c2eb89256404ca1f7e74b83cab1b5773232fabf3e06c9504e1ebf161586189b42448151673888853e5dfd24f386cf3a16650a6e809fedca8999f8e428b2c38992e20cbbb0ec25cfb4d2b0a1a4e4b0f18432af7dabcad53c4daa003f7dffc86af940e1f3a2ee1e274e0434a0f7e7ba68e2d3b65c9462d426806b863303d09d4fed4f91eb85e563f3bee761c005553eca4d05ce1e7d5cb38af0a4d3cba72accd1789e25fcbf709aabca89a77853d20d8dbdfa7bb2660201bf9e24a2b427e45b66a334c85b9d26fe0547bfad7369295d552d2b921a776dfad82750f4aed95c74af0cce01f879e6105689f9912888b5b62597708f471f60322a20c61fbce577b048f3922f2a20cd20c8780bb66dea7f9ea07b57235bc4787193ca016cbcc96026eafc3b1734ae61fefe524f077222c37f56a53915f69864d44d29f50e7bb9026a22b4e10a8c5dc71b1c79ad3ed599007485bf522e61f3068de04a8868af2454d9c351baf30e4e25d58ef4cb304285b4e460d2915e3fef046353662603acf6d203a38c5aecaf5c675f3f253e3c52eeb25faa6734c8bdb6df4397ca5d272c90f08a95e61d12a26f48f1019ee01f99769acb822fb0ff59d4894f897bccb2ce636c286549e66a74a9115575b7a248b528e2c9f2bb42f0578f8dd370bc0b9ced98021c6594e994f32d1718456afde863764d3fa1e4fd887938e082f23cd8a33e241791e2b83e1f328283fc1cabac94f134ba0a96a986d7906714cb21ecb670d7ce92b4d54f1a2565282358ad92ec5b3bd176f973c1f5b78eb70e4d416f199a86d6dd3ad409d89eeddaf60ebd8acbc81ed47603c25e2f839a428a782893411dbc695e65da18f6844ec4d462890d8de266f1c4d6cf0b28047db4e80faefcd2440b6880c2c1fa867b9339a61642c5cc7273e8aa8509d83b70953bb2f21e628253094d6b7d38e63be0673d93863f98decfbe44bd2bac0c2a31ae824f972c76bc4852cf37a40260a8992dc19718d1631a8ad77e78d2aa9fc51ddd5fb5916bb03add486906fb70ee7982217ae07524c764ef2aa6ecc74ae940da6ed714a0c440603a63fed2053ee86c213ea689530bc6e2d01986022c0967eb836ff7b42099ca542d7f9472af3770a222144d1d028f640a43b0d726fd95644b3d6f37a1f26cbce8e4f4076624f90f274db768c727554e46052e9cd64108b50af001e6011aea2f8d68ebde7eece0a85dba176eac601c5541b93cc4a7e262d111a312832a66fb821e520454f879631f6df12c590c30bcc305b12ef28429ed79d5887927394d9a457bb0fbe2ae5b2889d173e553186ba591bfb17aabfd91c970311dd0154e8afc3485d4c7ba660ccd49c1426222790270080cf94211814b39daa61e770dcddb6824b83e7393f01f0a981cf17b34dcae7790bbd91274517940c14aa2c21b00971180e46bdd0734c60f150ae7e09780fe3365bf40e5155852b3bf16bf36e2a3600dc57494fc9ab7a970a3faa1fb6dd84f50a86bfa13e1111c584ee7f2af0a4d1ef83dbd7c6a12098be6d9ed2d39630aa649bbb480427d6ba40e140f0590f55e5b422169854c53cad72ec49b71ec0ef344749ebaf01702e0e5c783f4a52bfb9a7be99444df5080740142d9d5dae6d066bf71337fa72186433540f3604deb03e19480001a200ed1b2412c5934e31610e7fd704a4510bfbef0c7a9e1e1b8f2bd47e74f3a2b61b93d64a703853db794d4df6d2a73c1174df382da1f65e41ae6bb00e55f0d2b75aa2026bdabe3fb9623f2ca2ab8983f9c11df4263e91863a4fae0705011baa41bc71d046b650e055ff04d54c5be9dd86d5d606284e3870de3d31a96ae5474ab078fdf2cd5075c22be5f5b51e832d4acce9d91a16c6edbd7a3994d64c9dd31901cf500bf0dbccd8f96f83d830bad3727dea2aacab93f971f87cb3b444d0174637dbd32a687033defff6e6d28fcda9de2bb927c45fcbd31cd6e2ad4ecf8406e036592ddc3e8b3cb7f1ee9c0d3e4d70dc38336e6be047caf40648c8127b5f47696510d0cf4f5a59ac0e8ce68201800ec0f136f59e63d09291cac4d5823fe3ecd6cecfe1733dbfe149f36984668764264c403c8bca39150bedca7d7409113fbe7a3a8630b1eca22827720866176c7f82b1806589a7699f9c07f81bffaf79ebb5755f2f2836e4c157619c0e6852b6810617de801fed44357c6f49544d966891148d78a4b9fa439f046516e5b8242d6c5fb641e175ff983000fcfc81728a091df49cd5d75e7b40b4731749ea6faeca00e577436a38797616c5af357b7267a05831a6098112a3fd698f21a9b35128ec3218833467ee3d54d1a62cb1f0b7b29e04e86fe6ae81ad9e49b37f1c32abc0aa96a8ad89f0294e1e07d94db7114847b405ba08f9d2e775cd79ad1bb618b121d7070d28555df6efcb82a6b403c8a0577300a3e69ab6fb45cf12baf319106fd1ae44a97e474a18266221c214c76814e24dcc9f7835bb3953c3d9d9dcd0ddcd9ea416bb849ebce835a8fea6a2db2d0d6690fbfb1b2d6957e93f6645eaff1115ad3ee3c112a63dacd73d2d9595c22d5d16bf993e5daf0f2dee59dfcaa7b98f7a209e852bf851ffed6c9a7af047331df9fd53d94e5a60286bbbfde0ae160bb139d7a01eca47d886ef60c30291114d9be79d037bdb298825a186a52303e698e333a33f24146792940822e9b24f2f0afce17553465d94bf5d6f7fa90160b136453a2e850b69258f1a05ad46c45359347f78d81e85bf9c4f6c3562de2233e1a3a1300a05069308103f9659f8b8ae07251d4159bb6543e0fba46979b90f9cc0cb209245d80687fb45abebcc3702ebcd8b9f1d19f1f8f13890f8b73154662bba9ea09ea248c8400cabdc3125f89fbff373243cffe10f66be3bcff450f81b95d71b2ef9a20215f943f276b57cad68c05a864f61f210ca4a67ebb228c1bec91ed40f5bb95c9914fbbe4788e79ba92108d61b5a03977974c485b38a6a2a54549c7c82441e91506dc671a729160cbcc551fb51bba9dea7b076dae72b5e2c01f12b74ab45fbe79c5ee58d0443d0c06498d2c1db2d8bb3b6aa782e70a4810a18fe1ab0aa8520b67c450f92833b5685182467708daad74a68c6db01468a15c9caf36dbe96b85fa72c0b6d61d96dde7c703e3578a09ed66ca3539ad056a2d262d0cd1c1d689bf7550bb209ec642e3713d89bdb758705a8c5a6bed6c64bcb4ce88d63c82cc9caf91f18587503570b2532e54653a9ef53d09685b60e118540a0d9a2358f4ace6a63db21be76cc634029b027d0bb457d93957a0310826e848b7a05d61c7b3db179809fae2b91267b6c3cf4c5d0918f8b2cd1047b8f375062738a36e1096704fb781c07f8fc41c0432c2fde97a8f1904b4350344a59df374bc09a316ab7e9ee8882028c450517df32f4d8dba798e2f55a13e31f0afbcdc35e688c25dc2ee0c83391315d536b8ffa8bf4871b605589ff445f3d89b86298ac87bf8391ec5e0d55e6865aedcc8472581e1a9faacd1e54319d102a956b22b8716e4a9eba642c25a247ca06f9c4d9bde7bbed9afd856a3103ba0b46d957536bdbb30340cc9a5db51b0551b65f5d1d18ca41de70332bfe6fc7f7c980465ae152917d027f7a5295e7a943b85f9214bb55f079063934c7e3d4ca7b86b358efdad9e095dbdd5c6912119318f6ddf8f2276dc006563f137dd734e02d58eb576d3b388552f0a2432838c1d2b044ee55a4fc80e84e520ee19b8c8c9a7a267b271525e5feafd3f0ab816524dfdbeab46f70ca39be077cd63d07c2ae52aa0a3993c4d9ba9b8227786d3955f0c18cf25813061ffe46d52f572fcfb77b6035fa908f68f4eefda1f855002bf3aff91932cfce14bc75dd9c1c45d29cdfba7bb50295edaf72f86412f850d79841f1579ed82e97d2cfba42bc96e79d85689f9562e525e94cc6c0fbad218b997077e837de97ed605807db96f77d0cbe97d6dd30f155fd9c4741cc97ff5c9a3ddcd6ef4868135ef9e5ed12b0863d479779f82f5f691dcc8537b6a9c3afd0649bf9dc171ebd9b57e6b91457081d69d617359ef30c01fcb056e30a1605f5300288dd7306426026cf1d0be827f2782abd6d307b7a5500ad01d0594e767f7affbd3de95d05ad9033e37cef5bc37acb0f702f2f2d6a42a6e5940a3b103ef418e781c5dbbf86da7c0d53440d6c927324c815bca16aac299fc8cbf941124bdcbad68cf3b45294f45541bc317eff1822b8b00fe8fe01eb1fefbb0065a14192043784a9e611bd2dcaf48493fc6a678b83099d5e84f203ac3030234872626a1e46f898c57fe23b22368c31e84ffd6fe933e84cb6afbb82014b5e0030e09fc7a6da31c9b59f540bfd8f51b5bb8cfae8d4e507653859a45856301f53f191998f6f12f0b6e30799966341b5a0ef1726c850dc5f9afc9c212025808820a2867272a417fe6a0e9973d59087daeda89659eab3d7f142ebf3490136989f9f30a6618d705c203be962732ff849bb8b8e162e2326a02a1d841e0839a7bc3ce2415f8e0105711d4de2c94722e7cd6c38e82f9e49ea5d5120025edd70498c2c68a7edf7f1053b00a80a6ca56e4d1ce8251e2ab19a1d5242d490e73323f85b89756c7cc511d25d0a524c170616042a47b9017e160616646df383ca04510eec393200f21113fb2fd57775f0cf23e69647a9a96619c8e92bf088537259ed3d4510bf4eb18a909be9d20d6cc03de1b31d2a81b44eb47bbc9f81d93d98da193f6df88689e65dc07e5dc171c9ca12b2209aed493db4f6218570616364b0f26171fb0049bd71b379652140302659ba600ae81077dd5b31e6a2b990e2955d85a8da77c04275ad6bfda9c288ab077bb06f23d2ee1f1f1f28f0c7c9b503258230dbbf9b97793f6ed443769a17be6fe3bb79d48b1fb9663007e1748a8ac8b71c17de425c143b044e3a92146feb862a0e61f76891f7b9fd6f64dd5c3abbadf8f057266e0d6e36f79d1aea7533c5dd1cc5a9c51f00b4030373c2548df60267833afeef827b83f2fbbfd71621ad3c00009eb43c146ae6cf5e0aea44ef96059a16e2ade4cd0e863eec319b6672f5fe18a5792d6e057defb10ea85391ddc3af937608d30bfa063ec3383d8a2b78210a0f9f7c5dbc8fae0373d411b4d0364e84737db91fe73ecfee9d949cebd941f9827db49ff7b21a777bbff1a7a3a0d9c1f35226f2fb79438a795f4627ba15bd67bed49817adeca1fc6d1d4306578536db6746de376c60ea0c1d2c6894e6260044bbdb8bce0428f6296171074de84568d76a154c89d2a870e3a2d3e09d5b5ad99f93a4517116b3047d8a200c3d63a75a3ad8514ce07f34ad5f08875dcd70c63756d57979f2668d42ece483bd11420dba8aa0195a412740926d3d1d40acba5b51559c00decb6c2a1e36e4b2d60dcc60255092ce6c876568d102f86e5afd8be802c4918ff115414fb5deb380180509616c232ae9eb6c9d4588a20b20e212895838ea6a73deff7e8ed33b2624f57e87ef0ed4e7e0b5e2ddf9db83c9c0ee4a9e90f7b327c450a5c11e7fd9ea0ad0167be5bd7e77310de0356d73e428ffb9265ab09819d4386f2b8c0abe0e76e9f28fa0f99b5f20b2454b20bbd700129970db904cd3ef459951ccfe7e433c9bbcfb731225ec404f9cddfbbdb1663c074c86f40c6cba396cc2d8ef70e47520f8fd051c6db219f0e957bcc9ebf401539d60b3261b3c39b73c21994ffa33cacf2013aab2b4b81f31ace68fa42d79ecf34b800f07c3de7d57f5de846efc4cbeeb42218c55cff879ff9f98fba598c64e3fb0846c49e863568d8c36cc1a74e094581a826032250fcc6d57ec86575a2143728a5689d7e8d26b810fc95ad801ca3e361259a755bf308925c868a952a108048d0cd5d1829687c8a02d858d5448be0557063ac6d2f705758df33c048d5d580041fab62e8bdd30f9658d86ebfb4a5623d3fe7c7b9ccef1165ba970522a173532419b423c0aa0cc02677fcd7426f5f79e0794fd39226d9c36f3dcbc3e0bd7f2eacb777f47070ccc5fd630b7c116b27d748ee3b23ce7fafb5b6dd0c62bff6e776a9554ed6e7eed7bfa0aea59b240907d8d2e3f94bfd86df85a9440574fbb953bdb424ad3ef22463dd45ad78f7ced4af1b2ebeb79b7ced00f1e0a6d59f5f1bedefda4ac39f85562ad6f533bc6dca4c8cbbb181f98b2e2523322afd409d79c2c7bf20c23e9eead73f1e5a17571773a7cf0305577270ccbc5593efe1426e00673cd65db7ea76d14355fa093b51c6dda2ef9c3e3c39f762f72f7bbf14baefab48a61a6220795b62a8055fe0ffaef864c4b120c373056e2b1fbff1e5871f8e740eed4fc14b315608dae49fa8eafbbca737c71fbfd4db5eece9e0fd244cd24de29ef4e821f73746039817ecddf8fb04fd09b243cb7a831821db562491562f842077bc0a7e542c0b9fe39d38e0e17276ddcb4fe52319910ab6ba84339ce691122ce73c85b74bb5e51b02a8df9b06d7af63d3be45a6fb999d67035521264ded35585e7cd2bd2f47eb13e7352868d4ff5893c2e22b58edb2a2186c53907d7f4174bdc10cd5d5a189c80b4c3527675f2939e4c7269c798e6748d625e5812b28ad5871c434e95320cf9151ca398e6a1cfb690c14caac1349951a29746968fe9dbc434518b57a8e4a6e5ea3a96e8be9c81e4a26893d35e3c4964a6d9952a708401e0243d1bb8b69ffd5e87d093d06fe3a2f6da27e10ed4bbbe30bb660efc3a47da0f83c93cfaeed2f38582b1d9e0fd385e5f5526912e8833e7602fb02c7c945625a4f59a17188e6735760c3cdc1ef069afa8c46c0f8dc48b04709f857be4177e1f3a51fcb3f5a6fca9b75d793f7eaa25db9505b58adba3222a04f194374e68e3f37d288e28de19b85cb42923674c921674346eb604ea923e88e64f01ea21743f2aab1ba034af5934275fb1f5dd05e326257d70ef9b5151c4cd7ff109aded8c06405fce557d7b613b8f8a4daaccf3cf666e7b261f3ef51dd9e2fc86c6f08b437dcf2a0905fcb2242ba5b7ec96fffa5e573ca3f0a3de03006f7e3ef28a748dc8d694515d1aa669db669d4f9870f3890974cd94f1a45991209db3a58bd41cda3e7f724c5f7a95c70851a485291b48100a4db000756de18999892392cfec08d20b95a8664ce2ffff6c4d955dce73645eac284c01c36d1947db685c0e6b7af112a5bcc22e903815afb4feb295042bab8b42d134b9171ce9c853bb9bbe6b08b460fa5c3caf30441babbe2f6ab6d10350938649cd9e121a690df71314aba47c40a61d43aa7df9ca7e0c858f7cfd8e22826ee2f067673a6fc6f92e28aa473c4443a9254e41e62fb6ee86b6755525bec377be73d0fa9cb3ae0a881bce3fc73177fbd5b8fc4bc21367598830b0caa3c9278a41e012b01c108b756ec55ec4a0dc5d3a91a30d54d2fcf9191bfae0ce68c6a8b62e8c840956a610025758b8538dd6afbdd0e2c7a408ed568feadfa97b0ff65a9b55755f6c32eb2c4aab115806f683d0022e0a0983ca119f994a50cd05ef120f4c81dd4531ac00a26ada6f0e829dc280da52506ca74e33aef2c53613cbbf72e1f3bef2f0ef3970de412294e5c141e18e76993b7c90961399b0738fa72d556e23cb24468d312224c8babc723d42aba1162e0547144b8887bf31910cae14e8f2822cf105b5c50b6b7783e4edd50f0121b5dbedc5a39a3509babdd391608f1f5bcea95b2a0623040131c1126be864c3594fdd04796dc9ccf313c86809d5fa9bc47805cd665889515be153f2297684407e87a2a3e8dac0ca2400a7d51fc32cd462faf9ce6b44f3f7eb92b376e2d3342383f836394632b7e4dec0ccd657c0aae8bad87b0dc7839edcd49378c3cbded3da24ba1dfcfec543f25de8b5fa1d6819772acac5c27fad90e85d74febd04504f6b315bb4088a541a028df47822ef221e36dcd380c27bedf6c0da8afda7d985f234d6afb194bdef5badc5184c74a2041f9dbd7e78bf844e33c65257c32ed69e79c485977c6bb5a2f181bdd85bbfb86acf6f0f906b970371f788e501d9af562e0c2e9f0ba5fa6332f8898082a4dd019bc286c68e4d1cef93d9a574dfb1bf5fb74f91600c2410df7606328d84cfc47b3144471a20b5594c039e9c4d771ca07a785b73aa6c5804fc7ec168f4f883517a59ad1cb18cc3603196b853a8bf170453c7c68c8d6eb411e1e0664b0da737a1c04f724c3f350970bd8c9205b2e7145677ad30d4b486f1c8a3e89141f165eb16c3fd7eb01ea128ca9b3effba26275361167302050891af72b603d7a2bd7251318518211257a5fea85916eeeeee3a3900b566ac74802e4d60861411af7015d7f04bcb01f23248a84d001488a963ae2310175cab1837dbcd5bdee6bdb141f5d56151c8ff27237ddc19e4beed33bc075bb5ef7e9b07afe8ba101efd443f5b3c900e07964deed0b22d96840ff9a835aa6442e775a8bc8a2a025f1079abf471130064d134b29956e394d80072e297116dc98e334b5881594039e4434d4243809066226e7c8a27a9c831184ca8073fee1804583f27965c1c3adb702afd8b4f04fbe8c3e84427de328a78b35f51d4eb6ec019c3da17a933d169d0b3899938a60a8d5816364554de036747afa916312d6f72666afddd3d23361c697eab4bda58586269858825cdb0e9bdf0bd57a4641f68a1674195c3dd0a799c36f192f636bfba5292f71f0a916d5095395d874299450c628ebeb36b5ad14745b949f5e90057140318e4748855f43bd01c9eb545a83b493f6061a6d8c13ef146e7be98cca585cb58f84b93c119c9e1a86a1d7fabbbcdd7d8ba53ab31175fef4e8a7be4dea01a252bd151565b924b5d58a833c508da12c4b11b8205c25d0e2aed98dda6cf7002562f125edbd3b9ccfb9bf5036c7d4130e7a96c6a593bb33b77945489d27f85084f401cbad155e9ed3d873710b72b55d19a38d3ad76196b516b7c98fa7e14ce839b450ce52af0bc10717af6fe48ee8376399bf4e4a9214961b7c7ea4ce98e411b0ba222e518a32a46570927c4014ff3fa8020ccb79ea62e0dde45ea31bd3c62c5ca330f1c9d139cd201f047c30f01cdd1e1a3d1c90b55154efc61bdc94025e5e6a9215ea7f8d3df9f4b40fba0b009ad5e252802b3a9cd2dcc55dab635a52d3ba2d4c30cd8432b474c0f8af0ecd424d36ea99d0614359ce382731e7df67d2210ec3f12b05540dc2c3df8677f826d0294e9f074715a09250ce4430a82a4a45937d1e66faa3d73a0076b899c826c8777bd6979658c46fbd0d8fcddba13099430e4fa759cc45cd1333c6e6517be28a72c78b4ecf2a788e2c8ae6cb1fbe798de847378bd3e8d31e7d7c13e9c5f4e4c62e0b329007979c1de1cac1721bd1f282b60175d31771d233c782008997b46ecaec2a303b2485b8f1c95eae04b74f51e629159da5e122e680703eb14fe31ea87bb7c9b60162c5e2d0e90adb71694f054f508057e350ab3e57032b0dea06002b888e8a8b0abcd83e36a8bcb5db00cbd46ffbb68738e035c3af9e8aa77aed3f40794b98ed8897e6bcdc5038e191b3c1b5e0708f65db2d77579788949790f9c361ea9712be4bd65f5dd9888809e68ffc1b8cde533c359b33106da8c7b4ccec9d91b1ee61f5503f8cb8d06df2ea15c36a18ecd847dee8b359aa27ed634999d040dabb1d6bb49c560fb71c695fe2cd847ee56456191c90b83a49a060ddba1bcf599ed9ac1a3361afdd2fcb7685287090d55dc6660ab1c8bd3190477e49f0add5f9ed0fe11000ac7a74026ec4716ae556c0c7e80f5a85dc581234509253c1337975d5fb7958f15c7c5e60d33506b64580911bc0a688a0c8794a1167b5f799a0c7c101fdc7983e379da9387bd06d82a6f06d9ad987818831693aa6b6fba36b3bdc769b812e32b49b63c4cbf82cbcb761d2b803934b8925392684ca38a5ddbccb2c77cc36879b7965a5df9a4cc364b84ce241cd3ad0727c10ef597605062aaa266601e391684dc8cb823f4963a658ef685dd31fae20a6f48e9fae15a3546652bc4093f8e25ef2006c4a37a86954d1413342608a69ea97be2017a1640d701c11703cc972ef8a502795d56f0aa48dbeb0c1d2eb0e2da518be2e33cb137013c1c481100fabb10309cc3c239f5d33b333576c27ceca458f37c4e6c05ee45e6261ab5dc727e68214f9ff56ac00e28021c59e334133818f62beb61b6b1321f14a24c18b92663ab8b4d73281a383f55d12495a30417960f924405d88e00092709dc852497f5c0eb205410c76845c7634098808558202d0ec71e0422760f9d3bb7c32ab39ea98411dfbaea35f1cb42ade45003f2e1f75ebb7cce9936e1dfda779c4cc961792022c79d5a223790094bdd873db326571d3c27b97aabe639a48a9064b9f0537cc211b9ab8d292b999de2315b477d28f4377a180c95af588e08d59017c4ac1842e24b791cc8c04dd48ed5b1bcca761d7d07a35a446f86e881e3ac8ccaafd0febd616c816cfab2f328c6b38ca5cce8e6eb1c2d6c536ee7e72d46c65c9bd42951a2eaf75ad18f994789bc7408a9a8514aeaf372ede07be315a1a9053655ccbc0d33008470b4860af06b94be8e43b6452620fcf04955cdefd2c0828b2e73a519c80c23b738fd73c2f40d8531b2392e7473bd7c4f80947927aaa7b11aaeeb30e158b11e184c292b8f377613ab34d22a83752d34eeb1885fccdb7484c5e54fdb9151dda1f2ccf8bde08ffc7e4da8a075a03e736d230604df42a1178ad9f5c6cb7b0b4319b2462ed569b48a192fa11e32482e6e72bcf38799a013200c62ddce22e5cdabad0e1b7dc25f6ac402496cec5f2ca6088a22f118c58b0aa42e31013daa68a237f8ba27a0082c7dc5ab23b8492429b882604039a4bdb76236a2d472ca3ba038de67bedeae3603175218910ed106334316e22d7e3506df4bf25d0eb2cbd1a85681293d169ca82f8946116a47fcb0a139cda56c6d1d1a3858169cc5473d29a0f03e2386ad0da25e69a54d6c41a920394c89db31ffd69ad80833019e8997d012d881b3b03919c05a4d100572ba76e7ec12b707f617ba689ce358cebb62684cf7884e193c0d49be431a3ac7bbef9a6396d31c67e0145ea618f438f581fbc323a6c5a53cc43b46fa61271cebf55dec5f45dd14bb1bbf8b2e78ee06f5f9b299dc085ed43d1958e865c9f8c32d89458d35ca95cd68edc02471d58675d16c6d10ad39d0ff6f764aadc54bce618b61f8fb823fa6c71bb433b17480561434e8a8696428c805946ca7433ce2b36de34cecb8ef2f7e9ab280935cdd0ca79d01db1531045938f24e3104eaf29841f2db80d36d0f816d0a14ca103de68b6284915e16bb0a138a8ca081c92fdabe23aec18eaa7106f1a05570f365861c8a83eb654a7882553136f116f14c7325461ff3a679ac19545cf438f59a71d62c243acde451708a335c5d40a3dcb466cb156288316ab17d080b581c5aee3b8c95162823008ec4d961415538e430cd73f971b30841baee5f441ef5760a2f310c4793067e91cfe88b26700dcaa387596492e046818e44588a093e07a94a38715fc78e2c27b22179fc13614286048aafac5eb5fdc42bd1f5d5462d03f0d9b7e8d2574ce602972284d4791d695f21c0d290e5afb04fba956534e273cde6fbab9f198deeec9a8322171b5b126d8dbcb40e248da4fad52831d9aed7b30621ccbc66d92fb718d5526acf12292f8fc5f5703d30ba9961e1838cc8cb72e4299292fb7f369e0ecf8efe50c2fcc7feadb33e92bfdb5d30f40fe79fc83befd477fbf8455eafe3fdd0dba97ddbc17f247de6769a9be7f58c2451064785f89f9e4ea249b266e6df1f47553eb976519babbd3db88a90bc50644d6fd9aa49f5be1fb48a64353faa09285fcd5aa028a06f7b14abd4cbd21a972989078f6e1af262d539c2e85c863a6391375a74bc4e4e9d5a0547d0540126494fcc8a17fe82452597557e86a2b41cab7581a4a56a07c12efed8ed0a2a403f206b11758ccc405fb102d7c2bd3ca00e56e681c8d49a26456ec578e4453666c2f90bbe2e992030baa4fa7cfb416dcb025da0cf1e8ab20be582b23e291ec043e2ed3889dae1b3ec5d07fdc2999c37e5e7c2e11f5430015f256a6e0be964e70954eca1479b7c41015761d32c1f2ef3b6466c693436b7b22afd6e4e026cc79661e79a74f396609cf1388622574e6862570c51cc925be48af6987876c40d1c5a17bac7d0f9e2351f2969402909fa5db201bd87836e6febc0a2a696d5dcf530e05f55edd05b14c39d1e434a762d8424f02cdb0be7dbdc2fcb45599c93829ec1810f4dd7e879c943843e41be67409a5eb80c3f8fbcbe50cc539f76eac165b97d36371604aa1cebe770a8b820bb013f065484b13a37ff69eb823eb9d699d8b93decb3d5e3e89c545f37d106f06abb55ac59677062924da45cc5740322a896f99906e7af12297fdb95da055c6ca2f66372d48e4e20b5e033b742492b2f6a8f63a21c8239f1751ef0e686e6369611473ac32ec8f2070debc93e16903fa7c700b1416c3e1a1e839ca9f894008b5aa81aa973fff28a6713714e9424a6c6a6c737b22db0587ab93cedc941677b1889853a51ff0e8fad99cb120fce3ce08d5249cb5d5e6b43fbef0f1ac2d1d83835b50462768c267cf2cc9679d9193ea003965f5bd8dffee77c502a15f7ec39702842a35d7d4db9bcb7e8bcb36f757524c6e1fb63c4c17477a6a501bba208ea0d23afae509e846ec8489ec78b5b5ff9ecc17d4da984a30ced8bcddd5cac72cffb67ab182f60992ab1a271571e980ab6b1d2d0cf5ba35a40961a17a240e5b7eb8a127f84e00ba3ce7955ef7be712de81cffaedcbef9b72ec9afee64eea0da47d5e68bd16e82d4a78fb89ed16d31d84397150109dd8d356e0bfc8f105655e7a4ac4e5a0abbaf2ac3852adaeeb2f9d3580dffa173388e73c04165ac3344f050712c734783d0c9381fdf18062a6a907c4ea35bb15f7ffac549c0bb5a8a0e2a16f09ad4e4a80758cf30c5cbf3ccb3165131302954f9dbb392bb15f97fd7e22a086a58a8341f43d54c56d008ac39806a66368fdd0507e59d8c9090630c8c869ac39b0c8987f4e1d7733de915cf0feb131f1d59a800aaeac5d56bbdf0ed265050a7dc5397cd95e8bc4dc6804f374ea3c81e608e70f0dd0396c7257f038a1505de92a8e557d10602b15a6d6d4a89eb1478bf75f8811b28c94bbfe4dc68990db205ed7cb578902dc38e1db8773f7f26cb212a77ada695012ab4030360cc10e3a348b6d08e7bc2e4c1e2c9bde772e198e0938a4e78e1881d34ad251425ecde8c9ddcdd3c28b092f4834e8d0308a816d82da9089c894f4e7748c802ed3d547336b87956a2cd000591ad8966809a75ca1ba3c53eff574c8b3687a2079bbbf1163f982e96e8f98ef2189cb9984271ad6859e7a1ebcf7d31dfa24ca80632f22e16d45daf2fc09b4847fa9d61c91d1667f374da3146f37322b2dd217cd589a9faa4111f1eeeb937fe5f9bb8fb5a8be577f96ecaf1090abb63dbafbd0c64cb29caaf3d52cff362d90bfb2fb675151ff9e0d44775eff9677d1f9c8f874ef07fdad7d1029f7bb8fd55893a83b16733547cc1e5b76b3034a40f36722d9cd35775815deeae0ef69d35c367d3e309dcfb0fe374bc72dca6f13f98a92b14dbb5a1cfde5fec7b5892c6fe56500f2f58f35ce27a2bd8662f4a16052dfa408bf7ad2ec0f05d771720c41e4883b9c26a20fa802d7cc465c75e77315f8a81de127de34339e672eece69f90a5939ed92b60a61aff476a409f6d341355d2dfd73c6eba75d433aa53efc338604d9830bd690af5605d7cdaa50f05d4d45cfca55149e8b6d3a428a9ccc457a296bf864a56ef09137dbf8be828a20145b28a232a18c755274911177053dfb0f442404d08c99faec514f1ec5e361e7f69f9e648a0c8650ffa88fbb7564ff6dcccc0510b0ddf1899cfd13190c0900f9c902106e7804c85ab25aa3010c6aff1f70c847472c6a5a363ea2c29c18862ac698740e75ee39226a60ff158f462f196272cc36b30eea7e0eb9a61c792bbcb37584a0104ac0a5223d05357cb7e3d25d5c639d2fe62b65baba0f997b89054af1541240cc440c25a944b6e7b8bba7d4d5de8294f6b9186dd2abcc744ecdfa417eca87e231297bfee5a18faa8861e35878ee23a5ac8f004d7c1490f555bf7352dc3d2123a71412a6bd264e45f920f8c783a089d9039c20ff4ca34be5694e19bab343da2ba083aae1ba3e8c1d78e3766a2a1ff798b99e9364bfacf810a98e4c29ba45c641c49c97fc32dd50ec704269ff426534858a3d42348a59867e882efdf9cd2ce35717ef7c236980c782827f0ad801cad6b3cdcd91fcb5af7e430ec58b39c2d197d3d635130a9d81248d7105c0727357ff90ffc49eb9b25e73da335f20df3548c583a40c76835dc954dc16b09f261c2179d063bf6adf9db5ce662e3b57f575f333d64c30768d8955e50b386735a97516fda0a32176970a1f5cc9ef9728e457b502197268e0b8c67d213a8a1e985b5660c294a6acaa4db559cd72506c6a53a2f4a3faec981e3d264831cf886cf78e2e43cd080863c35a9a9f378847c73cc0c880ce90f4eb424d28e8eefe692f0199ea5e4cc51998d86760c25b36f08f28b7fa79b819eb9434b7a0acdd234728ee3cdd6b06d5fa5ee5229ba9c1ccc4ec3a97c9ad4573a891497ed2eed55cc5856a62c2eeb78600ac15f34ce497af7966c379d10a5363127fe15917cd16db0cb88d5c719eb34be0cdebf20c0e56f0fb9601849537f6fecb9ed3b07b9c15e3bdfde7af1edea9faacd18984da04e7196e3a65ef7dc605a72dd39ce880f582fa0dcf4d202ecb1cceb3e142499be7c6c723f7e8f6309327441aefd867bd49f6c5a19da9f126d9777e6f26db4d029dd4d2db576974f3f94433d718e3f2e0cce311c312816836c5ed71545fc55ab87b72cca197d5f4f897cb614e044c343a1be078cc876fd6d1b53397fb72ceb6406578e710f439886b28ea1705354aa86dca6c3bad5e368b77cfcd6b6c110235a156e5615663ef8a95530f28c3e0f21518e4e5f7cf3a11c83545e8f2d641afd9cb6d3326f34e26792601fd3ee3aca922ea33b109b2aaec03cdb90cf68f908eb3f493f29d392899d34d99610c5d5eae6673906a6e345f99ef5a928977252f2c9ec23aebd5f088fac0a173fad8b0a2943c21dc6ce34aa0a6535bbf10a9cda949a7985ef6ea525ede16bd65a634ed5abc02c639627231ca266394655e3574dc6b1828ac8e8f541613a3f75eaf6f999ace9cf6abfa2ceaa255051eb969fc96d12cbc32f975867b48ea8dcb527d0088ddb27c90eee9bde858ee42b7dee82d460db976c75248c7c176f810ad5ba4d25adfc8c8bb7770454a031fc2b02f94f66dae6baa6430cce54c9b6bf1d29fbab1d9e08d4a1a4bf403fdee2af0da239c5e83936708b5f345e58a19ae687333f7cb8b639bf8832fe41a43010281d543de64c6e8315e74a7e91292c373ad5dd9908d9a2807a6058bf0dde88a96cb43d489ed2cc65d585656bbced4666df8ce0cb856bf8e333752c9f1a78127cd0f114f89bed34e33f55d47bc2395d5b640d3d2eb6d93e177745ef74c38cf973ba441555ea07abaf1565ea6f54b9c373fee9eb9723884861fb5f1c67a4906ebf3e6021e9006932827a3b5da09ed030bbf275cf93e0cdee9c178b0d7653766be01d90b41589001bc0fe054e8e6a7d5756d6a8767b2d536a3ae1f8113ea7985b28f0d151e99b48ee42be76925c53b64054f29dad2a1b449cf12f7725971dd665f40c6f5d3e3e848ddf49696faeaed0c4de23ae17ba983c5a6274fb2385ca2f3b970fa2889ea647232f0973cc616a1416f1e451af38d6c1d1715a8f8f89ca938e6ad10b34c55184fa945e206b0da36e7fb8b9a78876a7bc600a9c2c2400010d4b5090870adaa27eb679c3276c6d3fc57f950eac11bba67dededc0e4620d0cc7e4eb2753edec9f981e3a286072d397b678cebb38c7b39429f403521ef0442df355af434e07efcdc2b60d9dc72a342ea304a9fcd3bcaffd31486d61e9304e02c07cd118b335217fa5b8decbeec3bc12d2fa4185e964a00ab7e0920095f5d0792054c78fa3440f94f5bb43e1583fda61dcf3385cc1ca552eb71ad00b221a57fa27218d3db1737411d9f73bd6f93dfffda3cc05aad52082ee282f61abbf2edb894e2b27ed8c1f73fc7d22f1e087fe158dc00b7a99981dae323329cf46a03e0236cc21c41eb342238d28edcb08fb1323aa50fd91f48efb5a7afeb0de9c6f5cc8094fe33c419b1a55de9bc61f10ebc94d6c18715ba44748acebc2d117bc24d5fe8bb89fa840e1732ed50314ef1555cd6b31ee515295fa2920a7faf72d4dc38f0f8e7841a3b01f83842457fb3f6f4f096300016096f71aa750cf2a7100a9e570cb6f16a9b621cd7c1630310579f1e5d8c6f99914e5571b864d1a4e19284f0ef4a47e85e29e17ec97427500c32373d8f99a3b16ac3d46f41ddc1c431713f487e987f7d54e6865d9c83596e9ce9d41c5876b918b662b8c20638d60a1ceb435e4f6fe2ef55f56352e1b68a196a777b9732decfff6f8843f79fb5e4d08c9179f7ff3abcedb004dde60e304773037b621d58842ae1c76e743c92695159f31b091bfe39592da07dfb0d2c7dd649ed81de6c35a1ad7e2d77098eb1a7ff148197e13330df66473e8d7233bf4b86d22377200c8c9bd9da8f2d275d4ee1e2317bd749ad61719450ea8b51a62b048802670cc1ecbaf545797e4240b4c1d735211d5edeb36b90c22c127e6bed01339f3c8a7e2cef39ac677ed381bd613d31a7f80fa96f750b5f8434bf584eb000178196af01d8c72f00875fd7998bfe82db6dc2ed1826698a3746efcac5415073606783918ab997ea0c66f2d9bc855c1913186445c6ee69d9928cf17420961fcff4376058f42cb96da9a3b0bc9715fafab2491531c676f182eac9d74313a9b7c34a858bf382c4f1acdf77cd1b2f5f32b7326ed1ba6303a74e3a65c8640904e334c64a540aeda1706eb4f8816677a5a26cbefe59bc24f1fa46b8d70209c3494677069097cdacca1d62007aca11e4e821bb184e0dc29428f2aa971ce8b2230b53724a8eaface63adc2f6d9472b1c258fc0b1c9712e87ca63d3cae9c4f320c41f8d4dd5fc7a4909f9c636ec445523e3004d705c0c28ddbbb582d9bd7daa3de8fb363a62e49be4cf621d6221a210776cc9848ec6f8db2586d8010c06783e7d9e64ad233c6eaa3443fb31427cde7efbefadcc423507ad1dd0800dbeb8a6f22ce517e2b8a3bcffab11a94365ee58545e11f61e389c8fe46cd0c5d82e44d5d8ef41be007518ee7aa9b70b176a19bc0cea1d2aeb52748205874a055e5a72c6b1df96696e919977a449e4d154ca277db758f9df7c7dcb243b4eee6892d06030d8f7030316df4f8a7fd2c326b1bbb591ab3f51bbd7d5cc7d64625cd4ee356d0cf7df4ba8f4f5df29ddfa4efb20962fdadb30841bcc69587b35cc9b7a5082134cb54ed23f20b38a96f5d562e19b3261d2729ee7a2f49434303e3bc9ae40c96e95743b08e1ef7456add266caed527e3ace2f909eb6306829e79762bbde53135f0f50738e946dae1204fe8e559e36ea4efe43a8baa724bf6fe35578c13fc40aea0144cb5d3cf679f4e4ac71fad55afb393bdbdf13d11806cf5f674354888af41599a00939fa6cf0e23c5601901a0e318bbc66a446ddbbd7f08ed1fccddf733f11a6a2867c393934bafc2755e94e9bcdc1cef269159be735079f7859b88ae9d100a1f6562820e22e3b61627aacc8b78d35050b8ff11665e521d60ea04c568fe154d688a325fac56105ce85a26c0a0ffd965ccbd7c3189d4972b3ca3a4a7407152fd11f84533e583ff87a455d0e164aa65a6a302a156f7e805cb2b90b6ef947763479d00ef69d0b499d3aba8c6b2d28e62340471de3ef9ff2ab3b530b04bb2468b985fe915790495154582fd45a12ee534f535e889e530008e58a3ae7479d9e187fb0a2b9456d3cd2112c9eba4ca00de6d95c2389f22d48a02b3706f83883670fc0c1cc3bb8cbf33088e439a4e44d6adef2a38d8a1e585450b3741e1d452dd9917525a146bd703e507f0a94a3ecec18dc234edc5dca047c456fed1d23645c6f1920dc52a85d903121bde858c07e2d5dc96e1b0984be128a8e802fa297798734481a0c5cb8a78d67908abc9277563631b50217aee6a36569a89b5e6223e539d75ebd0663d9575d038821f314cf67ab35ce7496e3bac01548adb9a66a3b8084934c437663e0412c64737accc419f5e9525981038aa113540188c1e3a4895c205fe9c4e3896ba6ce6c20267bb049dd10f60220aab132c47867a30b2f824d6138a11a34dacfb3fcabcca44aa841b7b8a5e3f7efd54e013f3390ef3cfa2f0caccae1bbaa8e684698f842d0d8bd5cfc3b02286cc7d5c8c1574031a309662c1a78260663f8cd586ec7521e9b99181814b9fe690ac1d9658074339c4aed59f7eb0d2fc43541927e4282449f322534f62d73b22893a2c72ef9cddcb44713749ef83f801f3201563171a8d08d96f3a3cc584d35f5f6bcf9001a686ea639e25d86f9296a95c6b50994f5a6d383c93bcc150ca54ca464770d87ceff10b30509540f3a12ffbf44541d96ac5ea48de2658dbe6c5f968924a2b5815ab53fd1f7d9d0519ed265c1409af73627ecd80ea7fccff456dc0d5e12ed3baca2c4fd4fa81e1ec468be957d52a143f88cb54c26396a7ce0e7b2374e7f2ed3829c4f3c2cb95c094d47c8921e83d9d2f907b51b50fbfeb28194ffc37afa1b280f6fe34b1aa825342fca69a1c60c7335b13384fc81913d7625ca0f30befa5c518323b5f530047395350e5f031118a94bce420e87471afe57b2832bd01b8498a5cfd75e3e34e7a717c30504e712bd24ed71839056427a14124a3d140fd27ad1811c60ffbf519d7e7021f7677d5f8fab704077ba084336d1df0fe0b134e1d63e6fe6c21ef21970a5fd8375e78fc2bb690db52fad2776aff4b722b5415b12f748c5e3e4ddb17d121d31656306cc23d2543006bed5bfb71d164fc4ff5f0ec9004fc7f2f6095d6846e0146027b5597896146fbba611f9fc9264ed7e474d559111ba9e9c7f8300fa58bdfb66f56c6139a7aeceef572038c8212d080441779ae5b81cb7d51838019bec914c45b65e6ef95aa5a1d37403296f66f5e6c842150fe8b80e36773feeb2bd2da002a43a600f89f45816ef9c5719723400600adf09a50c921ce4a7d85030ffd47b70d256c506fafac97232744e0d0c7987fbbf58cfc1c59dbcc19e19694b586d7c4c8603d49a5c870a9314af28debcf4c1f118e95036256a44672642c5e0cb1e2f03ded91ccbe57e194799ad7b1b84fab87f441643324b616dd7b8e87ee176100addb90910915cb18657b3b5265ef02aea4342fe8903d5e9e0372952414ce3c8093ece5b7a0de475c66ea1f0315e78affc3fd68fe83cb324532d692fdf6ff1989bd607193f403effc4855ef0cd9906af4dbf42fbdf5d68f89b2efad38fd364af70924f8185c298f622d826b93adb16f331d85d573e72d563fd7df1149ce55a4a6cbf00bd071eb6052142e8a4ccc732a2ae71bf45684995df516f3260a8f7cbbb23a72044029a64742ffa1b46c8313063b128670d7468d3a2d825c49238db4212387ba59775e0c67665a6a5437176a38d187e1a8d31f450994e1901942868bfd4cb31a21fbc9abe01db9853aaebc6f25363a77e24577f22deb7393cc7c0758fe0e0b77803bbaf59d48cb74cb2585194f5e34c192dbfec8a57599cc6702259f5a9ed46a1cf2bf2d92456079a420e3907f6c912c3024b9c88a91241a2949b6eb25fccd94bfa9cbf7f807fe6b068a9239f8a368f8d08373a9ff7ffa3ec7228194ec659ec9a01905fff4616a84633a85a39f47f80f4b181b1c3e81f1a7d3f68ea7ea0c7955ee76337ff22bc43dff7fa01087a1223d6f56b4669216f12c58ff0b0d13cce2a8397e66b6511d041ae7fccdfa5da17ce21f6d9370e3a2c9e82fa3cc9e16e0cf249ff335d8d4ce0c0024f419c9e2c1bc115274c6fce470e91ca2221dfa0f2ef320d761c2df492ecd6f6f7ab8fdbab5c901fe3df04325522291e12c3e423cdd595e742556a87459a2c66f1cf6598c8c3a80b3bc0cc1f8341dd7bc3f193a4c460b3ffe8351168d42b8d33715c81fab15c8504589e13cd01aeb7d1a46a18aa1bab73368a10e957a7cc4ae182d6765f13eb56e29d00fe7a7d5ddecddc1d690259981e0e5ea0667ffdb707546a9d6fcb711f8f44c37b1d862d3bc73f6ba888cda94345b131f4174ebae1c46ca72448bce0ca62ffd884dadef7a7e0f5c947fd4319070c35317cc89b1f5eca5aca05a92fcd19959a6e993b8b2ffed3f7f9a31f8f41415f8465dcf12d0408c29df1e5601a85b63bf05e6e4d8bef77caa689671d53c51b4630544945c2a88455bb5cb920ba37828fc1db7bcfb8035b456109a4741830143741a6b4e13e21dfa4dc517d5d0ec65ad599f9f8c38164cdc9eeba0d9d088fcf6b822df28849927782fc77c46cc00f42f11fc00bc9553239b9304303d821c5fa195570335813397eaf095fbf4ebdb8cdfd4273567d451aad9af3588e1834f7f3bda9c5a31a74efc045e511df38faa42fe270ca6823ae49471bf39fd34fa5b645203669187cf57d21e43fa7e155fbf9e9ad777512af5b72dafdb53e00c7031fd2aae6d8422398bae288ef76915e72ec528f2ce241f829953c40843172e1c36b67a7fee19e3e2a58acfd3ca514d794e2a9a47866342bf7350c6969c33eca4153893122663cef739d92b29f3a9b9a9e1c6ceed13225e76f2f1b8d77361c6e0534d355a51e667b9ec8c1834e69cac2794a8f867045b133cccc6116690acea4fa0f45677d12581904ec177ba2ecd2eca6edac3b74b06797cd30d5caded732be1974c29ebf0aef875e188202a2484b3f49496a01610be5cdbe3e64fda76e409fd007731f921c9486deb4025c0fda9cb92090a078a72bd41a8d049cba5724458b92b03ee2dc6eda2f8a524de8591caa050f0e9c7bbd419fba391cf5182e2f4cb4c93b6d12799422509dbf4ef085e096d569dc63979e8ba1dab6462e50eee1f20a28fec9e16f47451efa01baf0248577b80230eb5a7303d392530ef0edf9af3bb01ac0092aa98552258fd9c6e03ffb6f9136cfa4bb3316b50d38998132dea3b44b730484a5fffe01075905c4ceffcdc2bd4dd93251a67d1c1217adad4b7f51432c41029cd1369a20c0f52729e878cf5f3d2ed4d89a368d6de8901dc4352594b970abd10931f792fd6651246ced4558af85d07655c655351493ec7afcacd782451cb4cd4d697947982d963caf5e3e1f1eea9d706c23128b2ead0d04c42291f5e154b1a2ca089766a61c1f6e38106317cbdc8c1c73cd0919698576a1fc833c0b029ac22b238902bd701e14ac48c11c6a3ebc9ff77a2c8b77d5ae7c871d4a1aa2f33bc6731ccf2cf379631292dff776f25297218e47aab7c64a9c70f251538f40140ce7921cd2109d8b588854083159137ff892d26b960836b17f200728b0ffcac5b03cfe00377999be8cc59abb23642fb7d0e2b7163ce5a4a6e5cae9bf7b956745fd6047e24a7692cb6ca83bf127dbcf78ff41a7a0d401f070ad6489d9dc05980208914677f937183e59375ae452b6b39ca261f79281818f8bf4074313a57170c17c2b606eb0d9b085c6070b35060622fc392fa946fb74cba3368d709290e8e1943b962b07a286c434536f1f922a5a63e13e761d1d502308a08d46d7792a2a39d1b6efea2a68711ca1a1afcac808976ef50b5ebf778fc1954b9c78bce5655a426c00434e44520fb99badadbb0dec060d6394ab2bd7da1ae77dc103ee8dc58c0a65f1881d4cfb19cc96d6528eb81d8537f884460e8f6710f19d0a994c5e9c97d4d63b69d44b6d5710b071c78856d6023b74f6a67b193fe6344225b6ef58c16a0e18fbccfc146bc7aba0d3b5cce0cdf8781242754b563155b79a8c585d880e5cdd46359682bdf15a6cdfb8fa60e731ca2cedd826e0a6b0a03722ae61940fc0a527523f4ab2b256a0a8dddbf8d6bb96b51b92a080336775d5208f9fda0afb758460720b843c34cac52ab163fbf42af34ffb92bc5b071f41a8e831667899ff120384a7d8cba77b8d4047e457e486940f728023bdb5ec9108895312a9716b3b54e9835f5ffb4bc3a6fd65534a120aeca887499d8448e696a2a40640e971385227b98026040d1c8f29356b572bdbcfaf95ef338e2a71610967b81e8c755275978d2fa15e6efe347a2edd910b1b1d30fbed62985ed75397593eca37becb572f66c9141f0a94899a80a68e5c166fe04959e28e54f5a64f78f19184305e582ddc748f7d617e91fcf0c8122be1e0e93566567541e6f7e10dcfb5236acb9e3f54570e1196b88c60ece0ac6906c9acb9023facf5594d5f465a9c91d676a861e5a525e66ff7e1c8ac2fff4e932072c9e683a6a280a3b0027d202c34bb02729538255b6c793f286f4316c1dc68e0c5aea417333b30104b96c7106a1be4901ea0fc8c474d6d4bd15d42d6d01aeeb8b8ea4d5c2c37e2022ed532d7bcbfbc5e0569511ed6622a4808a5a1aa72268a940268fdd95c878416467a116861df93d97e83cbb7df91d9c9c3120d76f502a307b9d9f129863efd5474e9bc9ba6498468fc65608c084aefab941dd012b379fb663c53e6bc33814fd0760da56395858c67ad3d9757e1d3a4de2069c18cb4d328e77915cffa53a7e1707c7760bcd9218d3269cf06672aaebd74189c249e3f410815a8971a7d86cec6165ababb31d1c40100e2e7884a3b2a27441ddd2c6d51513486f0da72ea3afe649cd08e5f47a3a825622fd69f5cc27e30c8b03010847a0c29b30388f8bfc93eb6e6bc0266df9a7bb91d80f136162f7dafd203d38f04fd965e34b99b5418557077c681a6c584b0b9c842f696cd8e802afcbd7a6a0105feeeaaa1f13324b781ebd3bdaeb407ca4367d9a669570087156a190d33a7bf467479bfcec96b6392fcd2479c38919b2d509e77460d2c10bdc403b26a9ec11f17f8b6c1c259438e1a5857a2e8f25b774b6dd260dcaa8ef37f6ed2889ce34afecb52c637e9dcab2c717c3c4e07304c1c58cfeb391c87a6d2272664adfee4a1c6066618f2e1b4ab1888f61d7c7d496e7ef3540e2d6c030855d416803d219de6f914c0be433247aeb0844d80c80a4b77d2cfa54caf4e32c8ee0c13c192c7a36b53460440838c28c7ad1de37075f2617d03e61f151d00976786758d6f0b632e2b1ee0b13884eb0da549d94a8b57ab3f6917045bb9b2c9c8d7db0da14a3c4d2acc8348b70de974e20104bd230f1149bdd3a9c2fe1276a97c11c66bb1af512667997154f18a886dfe09b20563c1e8aadaaf4694b8585f7488a0162aca7e61a168129859bc08a83ecd004be9244a30f4e1020b2b839a7d39f6ccafefa84ff63bfa4ba7ff65c55d797d9ffff26c69286191a8db4970c163b1291bdc2efbaae0271f7b4d3db60f9013cb3341192444ad196f51de114c2f2122f8c8818f9b7140a1170101b0f427ce418a21e8474310523a40d2844d2476c051cc82c31ac810502d87880ec008e3916c1c181299d900d12c04585dbee5a54d04f9611407a0b3e2e2c41e48c41baab0e385c42ea049d0914b53a7870e0e110f842913df4039a4be1c316d28b3d88785238c18babe2c67b3c9eb5026398c19740e914712223626cc01e445a76aa40322251c58d7500a33bd270e0e1488a17c41857645ea11f46b431327099f002012409d10d0bc06285a45c100fd0810691f8f17188dd0a3f8270e19b10ed1717c2b8f130ec46d2c0a14815f9816dc68a070a0e5ee6d83aa4e9be2061cc6d7b516550a9d108221b8431e2f80075848c220a74482e6cf9a1a6e88b0eb2ac9a1c2244110c2e342a1842a0a2e89504110d44bc1029ca408e2ca11a594c20f6071e7a1c35103b245605057e14b2aa2284980a351cc1e48b2069cc0a8d85a43ebce81293c0864e15e4831427e8616508f5471632273461e3c46d8b08d63861656028a7c88e394ea8a2a4070748cc132734706666c3c78ee04b1c65b27c575850fb72864493f3258a32bea030650f2b05e863f625430264934750962faf06ed8d2b6a929734f4b02090085e5dbc14808c952e74ec10e365df330560a3c57911c185dc01049800ea9248122f8060919ad2450c3325c0ca88c00f5d6ac8e1d9620400d4d0856806333d4419e1882e1ddc8ce1d1e2080b5c067180c840979c21b86471bac01383a30217166c5618e132b85c806858c20215a4c1c28502230629638233246ce103902f4a272a58634b143a5106808403145b6ef9832416490fd9c2e3251041729a88b145008d4070b3a2d369a9238d03cc38939f6839020e3ebe324ebad0826e5122f23b0ad0026e0e72f8ee488b12202b54fca5902c6e5071628131a8a8214b108f0ca0102100d9230b4f430581820994c9c21561012d24c021892e60c68b2d5aaca61029a004cec78c1e2021d2e1060422de58a20651972a53d668c11501d1076b4032a5ab43004387d0d4e0224840c250177f3c01c74d83348608f02ae48e2226460c996047055055b00019c280070d66d0028c2a14813b989c8c20e24508012d283ee8818c31426376a23002062254423e321aae007f3e108a808b06be9c41d30086472235b18e2a46d8128b7c01040a2f58606a0e0513c832e6011895286a8882021b0ad80d0d4780d1c485f382c30809f42deac8e045c4d1001a70b2e58c57d9413ae3220af0952fb82101aa43ce783dca0135b488619a8086177a3c214617c6841e7ea880283f496342d1ed011090313433e1499712160c0ca510648193011651d223068591c789072dc4054133385288098634120b1afae1033b428842268883300b3e5e0023082c821801861b7244d2050b1617acb1040441a0b0ac20c51c8308600208b0fcfcd020416b8b2bb0a08e30a216470f3ab8f8c0600545f0e059c285e602650d05001f70d9545ccc81c719535c3b34a479a20f22b82b006856d60a082280e8f8c20903d284a900c88847ba1000d8880fd0299601011c1649813e2c492440022316004a929630905b879f3632a825413373c10f107d9c904105a638fd8c12e8a38f312ad0f313e58e224e255accae303206e810218ab25c298353e1d2079004577208b27c044d69e20a970a248042058ee85cc179000c314c80061b2518628569e2715229810b2e7c2628c018ae8417f61b48783c124609265c200005a8c00d50c20527a87093c60a87961f7ed83345a4515b54b8104215569cf1d2126393c42042d88c16eb280b4378bc0cd182a01033b6b431e6c7ca1d08982311266992ac2861815b197b9cd956d22f17f02ca8e00f2b5346278790e125092b26166040c44c0919f8bcc1061c4f504550e13304055af064292ff09145c0481b492908f8e09d9d9e01c4020b12370e10481d6292b0d22801810e58689861f1a0c51557307052c08ad950480c3753e0b09c50d9029ea921901011bbc70522400707611821fc116583085608656800983e2071a126148202912c6e922e4cd1f0044a931a1d7a02b9f1243540082b7aaec8a939e3012524d253c690366c80e4d8a1e78a057dccc14721413d272932b85d5143159e0768e9a3488729cff384183323579ae741ca595ea8e3ccf3e89091e4ed51e6791e38b20008f97f670e2fcad02087ff1d2338337e54f9df9959d083119e152440fe7fa7e64c2cb58005f41fe870618cc00d1d950b651641818c1870a852650b0e0986645dbbb8f6d5f6a0fda7a0ec51f47b54b9f1e3ffbffc498f317807769e7633ff7ab8f07fd2c3d4a2c7cfac76763daa3c6dcf4e7a707a30f9d7438921ffe559cb63cb298f3a3e958717ebb8d32d1bf33053b451932c93f63ccc3cc6ff2f2a4a25ed34dd46e7b9bb89a2626aafe55943575a52caf36fc3c20af65475f8098f263eab6e4e3757b1a696fe6dca90f9f720bd630f15c4fce77087cc8e339f7239d9d1c7a645495ac7d88851d35e926aed95324d9dd5ca0182784b70c0401527073c5087193afef872311d3ababb56e688e3ffff4138cd21e56373cc71e3e6d8a2e4d7aab89c9cb17394078a931c5674fe811c56e4c07244f0a9295252a955519125e28890e278e1ff4d367000f1afe25d070e2b6f2cb2656fa835f10d162eaebdc162c021ea4e415125f11d558777752db3c8c675ef30008d437563009f52774a4a1b563a8b683d7b399e3a96888ddcc394ea0292b0a9d9ac6a0f53aaea1a2bac41ae21f42735e250638dff375154e49d4ad6352932759b277a6e9aba69b03416f0ff2915a3b33c2ad315a69ee8beb866a2a888862c45c79d345a9cd2a0f0aadeb7cc65ebae34f80c25fe798ac58c3dcc3da229ad1cfb8bc37a4fbafbf99f14bb65dde2fd56b252741d3749ebabcacf6e967d4c51d424d950c094ffedea493a6574595113d667a51096b33c2ae34f6454712223f6aa2f5e56d454a1f0b33ceae245a53ac9e16779d4849fbba8889fe551111632aa8c51459279b6fab869b0508cdad96958fabad7d89ba6ce594369339377d215c694ff6ea2af8b6b60786739e33aa989be52211ea1b5dc51677ded48fcecb02fc2ff2f34f8d46a36f3e2f69f5ac5fe6df8f8ff311a6daf56ab551738e8eef69eca84aee8ee6e194c7717b5095d6cdb2f8b6dfbc561db7e81d7b65fdfb5ed97776dfba5af6dbfba6bdbaf7c6dfb85af6dbfeeb5ed17776dfb055adb7e7dd6b65f9eb5ed97b6b6fdeaac6dbfb2b5ed17b6b6fdbad6b65fd6daf60bb4edd767db2fcfb65fdab65f9d6dbfb26dbfb06dbfae6dbfac6dbf38db7ef513757181c16f11c316a6168c68a1c5ab787ad26286aec6b4e0d9b6eee25944920598cf828417cae2e6ffff84c51fffafc2828957712cd2ff9c9e9a289a6231c2ab7877d2d326dd687718cf1576fc5fe1bab8461bb2c2862aa2fca98a10fe54c5067faaa2823f55c1cf1abaa2442b7a71eddf666503229d58d28e64a230354d5120d4d55374455ddfd188fe785ad53987fe6dbafcab15154b627d4591fe57eb4e5d5c4391a498d25f65161bfea370e0a6bb8cefcd229da8abc3c2d9a8852cd34e04db2a1f43f4c786fea0b3d828d660b17ea55f5c53d7525cad4adaaec59e98c0e989d313aa4d1d5765ead66fdbec2f1eced46d4bea57744e4cccf09f5acd24d4a475be858909d454b5041c4b84f19f5a426889d44989335162b4582aaaeac53595cab7d7cd9328ff740420a723b81e9b8db7d86cbcad289a9e842852fddbe440f9b711e1c9bf8d9326ff362180f06ff301cebf8d071dfcdb7090fab7d940837f9b0c30f8b7b9c0827f9b0a98fcdb5080fab7394df06f234104ff36102cf9b719808d008ed43d8b24922375afbcaf6797d98ed43d4bc72f9ccd218f595f5b5dddfd076d9928da32774b4d5a8fd42d64a268d0b8c93236ae563398d0d89162271c52ffcfc1776d6d8f6a09d43beb86daffe9060afe7483037fbaa1f4271b16f9ff0756b534572b344d5d467ba7cf36ec6c95483610e0bfabb57577a4f2a7862bfe2faec9d42d23a242e5d3522e1e5aa17c352959d74e349c619ae8cb1271443275cb685dcd99a13c8619fc98618ddf2699a2a1a91aba4587196a6fb44d322594eab217133b418632feaf8a5359a47007cb4b085654fa121325355575114d579553e19cb334d33eb35162930482930c3a256dc7b8abca2a2ec70835634847e6ce49ea47ff36a54820f91390963f0199f027a012fe04d4fd09c89e92986a8e4cda090b237fc252813f6199e34f58baf8131634179ca8f0f0272a2efc898a983f51a9fd890afa272ab23f5139e14f5484fe4425680036a7950caba33fad86feb42ae14fab9e3fad547f5a75f0a7d5e94fab9b3f8116f81338813f817efc09cce34fe01b0ca024c00262012ef127d0873f813bfc297b4a1af08cfee469f993e7fa93c7f327effb93c7fdc96bf2276f833f790efc4953e04f3a8f3f6905fc4947f1277de64fba873fe9da9ff4097fd258fea4a5fc4947f993bee04f5d247fea0cf953b7c79f3a34fed455f1a7ee893f7541fca99be14f1dd29f3afea7ae4b97e54f1dd09fbad69fba9d3f75fa4f1df7ff153440c106031800038f04412545db6c7c49e7f559f0cf80238b4412c92b59f17e6a0111d53ecb590b61a8ceb2b4b5d0420e9a72c2d1596a6c9212798a64c10516360b53cad90a8ba42899d353da0a72ac300549e54f2b14ed1552aa1594a471d484657828633b9599fd3f3aeb690a5d535054d3dce3890c17359cc8fcac2a991b950a61c856156250e147b6aa703325955271d43c8d7123a7a7b4313da85dc6b44e63382aa9d46a8ce9ff29f8931843c4a021c60cef505224403989b1a282528a612005a0530a19ac48569816ce52b61aa5dd4993d54aa8a8a8684dca497b90ba5a1575499d4ed43d96e7a6adb61e5bd5da2c96aaa1493534a9888a901428aa5aaaa5187413ca7985d065bdebc89d0ed2beae5dec20a5ee59992251554a555494da2a99e27ddd218410c239420e4a9ea91b6a134aa94ed48616a96a6a46a2b38e8e7d2d6b60602955d1591615f5b4c849932228361b6ad236909ad6d6ada6925675d37696948a838225b547d8e897a2a2a22ea93349c5a1a42894a214add6d33e1bcb55454fa35df2d499d3798dec6a2da5ee3434cdcd631bb1c8c61a108a0aed20d3acb18e764f8360bc910b2839e29f014616f9a4dd59ab3024492ce74e57b72ce844021f25202498399556707416aafedffb5309a6d4320585a7fd28456d47236a46c9897292b921eb81949132a293ac0a9414ef2d7e7624340dea3d3c084b9812a6123a4bb4e7e8dcafa373bf5ee36ac5bb8a9a3cbc87a4e057b3b64927621355a66e994e4aa6ae289192d86944731a8f4ee394f1c9bfcd4993b51ba59ea4a6a48a522a23559852894b7605f61fcf7a119de5368392d27dea04999b67455d2a47bbd19eb57a9a64f253511e453945a910d43525c2ac362b3352aaa7d05577376727d5d39d915254725218e948dd6b593bd1540b75adea0e3a5ba8500437d5ba02b375979a761a7692778aaa36f40745cf56da798a05a6a22e9d1e6e9a3a252499a68eadbbccdacbd65da72d3f6cc9e1ff55a6a9a34a6f1b48f5f31a4a89a951ea444fa1d44665369dd44a4b3a736ae91e532a9e2e13425d2e99baada0a84f161dde5775af3bf5398dce3269ed5b56d455b3d3c149c8caffa752169c84262022843fc1e2f89e254e302054bc1493806941d31f4e2f43fe4f2f2c546b506aeda8eb64c2eaffcf1e06ed294b280875e9aca84ba7760ee9cc4a218b14bb00162faa14ef7db4c0e9433a61b1a0c6ccc9b5c7ff730074c6c5442989265c456fea9410a0c843815327a03bfe0484c5ff27f5a37ea23daa0eca6bfd0a2f790d760212ffff515e8325f52394d7545587ad1db6d7b3c368a5d0acaf2dd86bed309869ea94502b216c15f2ffacb407a94c73d34aa1b3abaa6ad6d752a54aea471d7400e5dc2aa3925469db46b352c45b2a9d946aa7655fd5594fda367484f295b4d266e18aba6e1b0836ae67097496403c2bea425d2d8ecad60ed4cd0d4b69db069bf5b5a59e43eaacafaf8404221284a804419bd5c41395ee34258cd39429a63470924288943bfeff24c5cb498a9593142b48bb9b29b5547b47914e343a59b786b26e0d659d75d65967dd0ab3f264dd0a63f264dd4a57d45c51586aca6017b75254cbc5ad14cbc52d7eea5cdc1a82cdfaebe2d6100ca9ecb9b865d6802e6e8935d8c52dce752e6eade74843832e6e8559792e6e8531792e6e759fac59fd276bd6ea93356bfdc99ad55d59b3c08459b3bacfc5acfe73316bf5b998b5fe5ccceaae8b5960c28b5943ddc7a7fff41f1f9fac5b43b0f527eb567765dd0a0326ccba35d47d7cfa4ffff1f1b9b835045b7f2e6e75d7c5ad3060c28b1d40f6d7da803ac6b3c622fb8b86a63d33131d49349407d67d4cb364d9d0d4a78729613434edd9ebeef937cdb196672b8986f29866c9b2a1a94f0f535efc69fbb558acac5b17b7862ebe58db21d837a4adb643b0afc562f18dfe64ddfa37c9c137fa73716bedb0ee03a3a1694f1c70fc1b2606b891ee84e92eb295ee84011392ad36d29dde85d60e33f7c8c6da7dd0b487d6fb957fd302c21bdfebeeb9f1966c1dd19f1b6fdd78ebe2ac59ffa635fe4d6aa4f1080a3f49e603cccf4395a51c94b2d4aa4b50e2a456a6597391fd954a511204131a699ec8ac781b7a3a914da1dd7a14defb5853cff83799a1807f531964fc9bc610e3df140618ffa6047cf16ff2a28b7f13175bfc9bb4c8028b7fd31556fc9baa3083807f13155348f16f8a028a7f139a079e3039f1ff4a4c4d30f16f5ac2848412ffa6249050a4a7e92e7c6a952a21f1ffe5a3facd73377eb54ad17a3ffa371d61328286a67ce79f031d14ffced1b1af49e25a9e654c2d55e21a668ae8a29e3111318410ebbfa98b99559852fd67a00b1efeb6676739ebb4a41b6feda0c3bf2907b2bfcc5e631d8da88945ddf937e140ebfd0a0d4d7bfe4d37d8404b12aae1df44c36f73061e3450b13eaaa062eb6dcf5253a4a4ce72b6424c89c90575c21b27a0494149add42b27147127dcfc9728f86205245f64814000f5e5461de3082f53bc0d8513b608a1ba3812c5842e5374b1d2c74d5357e002c8ff8f4171e1b808f1425b9e505355ccd6cf2294964514c045155a8ad062c6a545cbff3fc9b24716342822391e45c4804711adf1ff35cf80fa6f82a1d39284ba90fd657671fffc9b86fe4d0478c105b24543d19fa3116d819fe5d110d9fa37b1b04257cdbebb8c86a23fffa632643ea642ecdf34e681d94e59266af61a195b63a887d42aed6affff0a50434ad454a5a284eaf84fadce9a101828a12a8472709242d726a954492b692aa084a4bcd9c57d04db23b54a1515a5d66e54bae9819ce8d9656b8c4463fcecbfc5ffdb1ef59ae2d554157b95f97f7efe9b6262523821cc97a49b179b09a98632e10715a4052ac8cc8db7c6b3c6527b99a29d96b4eac8561b9afaa8ffa6144c52bf42fb37a1a673f6c0bfc95cd26949ab58837553dc4728fcbf6c5cf74c151acf1aebdf54cafebfd392844c46ebbf8934f5ff37f1d93eff4da3b88b4cb1d17442528a9abefc9bbcf8fc9bba70f9ff7455cf9688028ae1d5541505a8caffcfd49d25556474963986a07ee2e0503f4dfed398fad3c09535fe53e58a1aa55611884305d4159c553dcb2b4afebfa4a14a20410901c247b5ac28b202d5f2f29f5ad5c45e442b22cb22485a11a05a01405971e3d76dd6669d05949518fe3fb52a1da1ac6491d6fb51910d3549137ca6f0f1c127867fa42d4bd17a3ffa503e44281f1c2829596ae5fd7753dc76a05862b6299ab464f97f0642148bc97f0af5af448827a1191b2a6cf2df7d38aa478b14b5a5924ce98941627a99f0df6b24083c4da468183c4b9ea355ae3c6a0789bf60a7e7ac91259b9d934e1c47a074f87fba8f503aff4db454a90155c5445581925a3969b24a0345450b6aca110d2441fdd0c8a37e40e4513f18f2a81f26f0a81f0279d40f7f3cea873e505398fcffa3a4d4b1ee945ad380143328293918ed558a2845e87f859232c1ff77a374cbd673a7626a3502223d402dd80865e4a04628f3ff49eb468dd0f3ff644fc78d1a9de50813a0568e3c6a7526872c551a8a9a2928ea8a865a4931f7ea81ffbff8c9939b9a226585021101d900b1f8a371a7b61329a3b3ec016ac152a9aa9ae55e8fcc9a98ea016ac1542557509f17748dc2591597c357153d73d299ba6d5fea73505e1fa6593b636a89f2a658792c786b6a9542795efe1fe561f0456b575545a9550d90154a97f1ffba00657e35eb6647e9a2ff476929afa650fa8656c788ea98f837cddaa922fb88ea923ad9af505d95268fea96f43c2a9741a2b20b45a9bdb2a1a96ced292a5bf99d761a2a2f79d5dca9919a5aa1701dff28ccc47f52ba8e282ce68b48d445c38023261e42265072c017252f6c195f760070878d1314070857068a2b634c61f051e1c9c4c03d2a4a19930e4ae5c61331841918acbc60654dcb9d978d70531fa4ce6e9eddec5039e694441081420a1b440e38100591808252c5861094086ffc4b4999aa90d0d732b5f1ddd37f13159314d308170925c205281102807ae28893d4aac99319549afa8d9d482d693a6a49dbb45949539d7c79211bcae3f354504dd488bd50131b274d42e026fca6fbef22d192b663ab953dd2dda58d3d567ae403363ee70b8ca7158445a88bfacd6a27958b79a4f4f3dcb2914a52bfd2d339152959d7be60dce9f4b69e351ca28ff5325d3de091a9db8a0718fc9b3cf83775f06fe2c094fa376df06fd2e0bf2602a60cfeffdf748105ff3bed3b0dbbaeebbaaecb39e79c73ce19638c31c618e37befbdf7de7badb5d65a6bade52e77b9cb5dee7297bbdce52e7741100441100441f0fbbeeffbbeeffb3ccff33ccff33c4f6badb5d65aebaeebbaaeebbaaecb39e79c73ce19638c31c618e37befbdf7de7badb5d65a6b398ee3388ee338ce82200882200882e0f77ddff77ddff7799ee7799ee7799ed65a6badb5d65dd7755dd7755d9773ce39e79c33c618638c31c6f7de7befbdf75a6badb5d65ace829fa7bb8caf059ab5b6a02ab8fdff4e7b145405a84755d0c0a39830f22826843c8a09208f6272c7a398b8f12826653c8a89168f62c2c412deb9895a398792cc130bfafa3755606e26260a5e4561e17bc734804fda3fa8ebdf749ae04d12fc7fc9048129021304ff1faaaebd8364f294ac8929b5f35ef21aefa76dd3d4b4276d3365ee217377584f83745011c01e1541048f828001ff4fc18ff04f3600511070f12808d64741003e0a020b1eb5c490472d49e3514b9e78d4921e1eb564f6a825f9514b26f893226afc491132fea40817ff2f00738fe84f0b75a57cef9c28df3b3c2f3594ad69b9c3f74ed25ac6ca114ad5b9937617b7d9d7b414533b75964e6c335a8b569a0620803e4361fd445d3d58785c61ec85e5f50a63e1cf500f16a098161d201335da3434a5fd205131da42673f4285bedaacaf2d23d4a4f2d55a3c280180a624a69a7f53c9f4bca7bb06468dcd6a01c836f4bcb2aa7d87dcfd677daddd47a6d6826858c632edb39a6bf71f53dcff0e30f2691aaa483d0d9aa1296b1dfb79a2a35af620f534e82c6717d766b51300d8499397e3256002d5c08f1853d54db399438e3ff759ceca74544b9ede2cf26da06ecafc7f8e18a6957f9b30c0f827baa2c68e50958a94bd6e4e53d72d5ffcffdb78d1c57fb8d7ddd3b221e4629ea23655dd41b27597644f836cb0b8e2ffd73d4b51d6d7a97cef7cddde095f415f0783fdf31225da2a1fc91409c5400eff4fa228969e06912951aca7b42f597ff81a12d271f9b4602197162cd6137269fde8b45e212cb625bc12e369fdec0c05652561feb3aefddb3ce1c48a9ab0246ef05ee3088db657638cb7f846cda42054e9261b515ad8c5bd53aa45c2c4ff9832cd6d8b12eee8ecfc97549c74b14999756d454dd549d6b51494ac6b4d4632258a9129d223555822d68b88f52252d56e94946e474e1a6dd3d4bfb8a66dedab7dd7d6b2ae655d6269248752fcae8d3592411e4bc0f0481738fa9a5129fa98a63022e6df34b51d4a7b901e1fa8a94a8da59d76628411d999ac876e6cf87fbe5aa528a9c8228b58f18be4f08b78f937771a2b5331de6f2519a3a93acf25696728912cbe27ad8d237aea9c10b9e38448183605e8e17fada149db4cd39087877f9b1d6c7488a481244a7c0d951a104a727ca98d921a25334a451c62aaa98aef9e7e04862cf26aaa42cb5a4ad6ce55ac2542010994f8c8e354c803841042c81ea6593b53ab4e4b5a09e9819019582044ccff3b49ada0406942c816428204396735131d53a97e96a9ba6733744cd75b97a5ce124dd39ada4fd474429e654e141152299a726d576a458d9aa4526a3ffb911396e5b89a971c8ee3b89a97262913edbc3c6b451dac67e7e5982f508a564546279a3a57b534d574d35858421af2707236494a772cddb231a6962ad2ec90d800401026a74080b0c9c106877f9b1bfe6d6cb0a981cc03d6a8c00b82a43943064d0a1b4841b362324869fc48c3831c9c90d9599970b2d0002ec804e0c9057d28c1210715e8108200066ea40e50c10827b09450a50b1f2accf0b8e2c4f3904405af0f29317ccd8c0a493078040c429129c6b0d1431a2f4e6af8190384cd660a0ea60060ccb8c3511816fc30c298284168c81c0e59440c230120d24245e40c316500e00933c878f289c9e14686a336842e2066cb123b2c2630242206e70536860863134bc1902307a868e4fb49818b1e3d5a10c106560a2f2489408d0c53de4821a80d41bad50f76a4604104420e14d97242183f5e507201141f3261a8f0b4180fcc1e26051a6628faa040c3b01a18a14c4e961ac24070c611720634b4a43bf21900b085014a5222072246d821cd94a434003f5198386393a4f021019915b39064ba60670d2f89946e6f88e968259c607413828718aa70824be266d4c4ca895005b4b8dd09a4e160c9188cd8206955c97f0ce1c5966615041983a830858d077102335f5c106cb12442398db440b335690389862866b82055a001221851c39813121862e8814298dd05920c467e1092c615054908a6819633546a404aeda800c50f2473d40249f2081f13a47148cd8a362071d96ec2a89551a23bb0c3cca856c21171e811248503b513163cc8a86048591ff00015778c48c6f5099f150261001043acb537d8185ac33059756a60f04824cd04ab038560e043162508a0cea105024f24bd94a845ec81450767ac6ea8a601be50920aada06a3e3837ba202d40ad71d9a08a8939902ea0841404b9807d22fde14443861e10912115c13015c193481c690e24e90188380406461148c6405560c31d60c8b8398f30744000cc0d5870f1880e5b8ec068d9218ad59980088c074c7c20c6e30101ad10153d40ee4102b42d9c807022c309219a0b29417accc4c0430bb260c88d31601bb40ac8f0a24c1a2f64d03eccf8b080196a0d748a3121189c08a6a061c49b2b6c5ae8010d2f583d393283842ee1a30742bc1803e5b4430907632eb0f5389330f3c70f8dac40e60453c24b0f478c8238477042039c93e270da7040c518338cf1c08c0156dcd08dc0066d664608d5c50e1088c08c6ce2093476b00832bb1c10ad0ea07a603e52e3410e8b68e1996764095431831133cc1d72e0c200df190c30bf58f1858c1b1e60c10c810c15b40353baa30ad4a87102ca9f1c2500853c1e2163e3c4510c4364ec3deae208660302912644dcd1061f884100250cf9410110414adf0b360000852a0ac9391e12372890f12365658b8d8a42cb850ae0087384030a139451eca4217aa0dc438806d9999e394a27527a046001ab43caf50f2674d0217229ab68b1071a342e294a00886114068a12a890c961f442235fc8c14556c406438890f458911df534bc475601907582dc4049a3073a64a518e0c8726393c0680d016870c812388218f90006015c06c94006a38dc80d527850421c4650b818e307033d04201369e487405008dd4ada6de8cfed4e1013e24cee31e3ceee7db9cb61ce4b0a57739b04719739f97d9e28f3ec776d2db6cec8cf274cd8bbf881a3078a9df3462e82dfb53594c4e16ecda4cd4adcc592becc61d0f340f0cbbae3acd699b3797324f8edae831c6f2feb5a6c9d91ae5b78b7cd99630f7ba4d73f8fb4853c777877bab322c9d94e8a4821487620d865bb37396e2cee5af88de4cdd90333b8bbedfc937936db59ede4d650cc20495ab16b91bbe37735a75d5c625bd4d08a9cb41fa939af7764e6acccb3e9faa963aa93d531dd19747189e534f4f6287ea097b98e2333a7c5296042cb817b5fd1c397e3fab6a34ac54b34b6aa27aa5d5c62315ae638aee32cd61acc5e87b9eefb486f24b9a849ce71a3eeb288861bb420e7dcdb3693d623f91972fdedceee0fec9fc69ce37c6621986de64811db3e762048725da5f25c5c62a5195edce1fc8d199357e422b732cfaa47bbd3626b3702752c16138fc6eebab8c4788ec69c3b11636cbbbdf9dd1d8590e424e8f5ce5deefbc40d92b7e4a077b7edec37f6ec915ab35e38ba94e10ff434ce1cbe5677dd7731a7f1bd1d395ab2e38f142df68a8cc23c62efb362d7e97e33175354dc1e9076b424ffba4876cec16e4be863b73f91670e9322e9dd7e659ec5bcfb3c6cb3f7799de7699dafcd20e8e50d8eddd733f672e7d75e19c38f5bbc47ee76cc895af436e728683f310449de79de088e1aef912347996739bada21e7bde76e7bce62e7f7bb9ca31c5814e2b1d377e4fae8893d630c72602cdc1877a4edaef8e5bd35ef32cf9ab45919fbbc13c271e4c4bdfbed9f983b2c8af78ef025ccb65fd2db3b7fbd73bb5b99ea692fe1edba13b96ed424a87997c9b323757b575dc23c8adfb877cea4476efc7132cfd2d0945b8e4bd83fce79fae2fbed7bedc53274c5774bf88197935b77bd75f789de28f36c3f51738c5ddbb9b8c4ac9610dbb1bb9f05f3ee5cf78959b284987f96cbe4fd46d103b9e52ad5d7a9a2ee5c5c624344a137ee6eef8e4910775cec56e659743dcb98b5faeb547128e43069efc8f5dbd9bb2da9659efd7a8af2a49b48bcd96a17979827148ea4b63a5fdeb7f574be58e659995aa3c55294d4f6076675673f6b3feb59b0c31aeb0e8b9eb616e41cb8c5eeeb39358ad957c88924c7dc829d68f3d8bd4ee6d918caedf56cfb056e3121b43677ac496b3ddb7532e659ef0b0a416ff37b37e63cbdb9bca65f152c61ee344876177f5ce77d19ec32cf7ed6737d1ca7f167edc59f06b3edba4e7b1dd7f1b7b526499b37697f542a950a77e94aa30185195bebdd0e63db41cd2ff813bbf2a584f0d3dfc7919fc7b5d6b8eb9cccb349aa8a9a9dd55a4a6b86a23193a7b15803567e7cf237627cc56eecf88258e67d351cd60be712b1c2117fdda7412d7696cbbcebd619c98521e63a6879278a64e748fe8d38bcabe108e1885d0d27bbb8c4807a42aefbe63077b5d6bc73bcfbf070d8fb3aebd96cafee3a8dadbe5fc7811f87f1d8b1cddf988570582f9c9b5d5c62453b61cf64dfa38841f1d3e2388232cfae3312ab546347eab48b4bec049d90c4dd23adcd7de43e127b9a24d118f85325f4489b37d7f7d69c673f4e42b8bb3b6a0c5e8fe3ba9bc5ad5b5442d0eeef7ee0ed1893d7e3b8ccb3316cad0e0e0f8e108ed00fced889b41d3b12c632a5cba2f75930f34b6ecef3b8ccb3e9968d9c4d92622f7739bd3f6e474f839c9479365dd518d8d732cda26e1ceed6625fe7e212b38d106add79b6e36b3b89bdae7b32cfc6aed5eb8cc49d8b4b4caf3897bbf7757df926b1b69e4aa552dd4c82567f376bcfbb3a5b4fe7ce03b555cd904c53156aad37c9dd2df27c39386e996771847c7054eb8c54e108fde0c4ced2c3e94ac33d45c7ece212db5fda636a2d8dc52cf054da76a46ec66e7bb64167849a31b3828c391cc26d62a170214471a24ae5d8fad9d30fa07c20c2f5e08951a972e024a91fc59a34f920843b43c758aa7a2078f0c107381e78f0a403de63babbbd4cd7271ccc3448c55274dd1bd8d86caf290d9c64d0bb1aeb0003b5c9054d2ce0e78ee50a9e3051cb980714649d014a83d30db5ad1368204104babb29088cce72bdf5d412dbc1003e72ad65208059ed0c808d75596c3dcb94161bd57286c1032138a05600806b410368fae466f7d40293063636d68d2a60c0aa1828b1e56c863649723ba8b9a064633c76eb183c973cb4f84044a9cff6a9448b0f724ce0c0db9145199d37d90b30b28822895800910a50e010430a216402830812880400f923027ef401013e1eb0871e79e071871d0e68401d74c401c71b0c68838d05aca1461a68a439c30c05d894614386cd18ffff64dbdc3fc510c79f6218e404254038f0762000109d277756b407c6b98ed7427bccdaacb326dc763ff7cf9e9dac3d3bf78c35f4b2a13f37166c084d3b97a11b6b08d6baedb3bcb7ac3967b16e59dfb2be0505e5dbc537a4b287c562b158b75bbe5d7cbbdd866e17df5bd646dda58a3af79635da3334946f17df6eb2db50be5d6cd45daaa8333404336b4030b3063454031a1a1a3265b021995169859fdd86fe0c7d376dbf9bb6a95903eaac0946dda58a3a43e50ee25c67283542d21982dd36d059029d259058838935d8d08671aec3b9ce102c95c14c196c086643d374bb8ed43d5bcb1dd334ea2e55d4a9a54249a7ced877502ddfb54429167eea9c3aa8cbe7deeeeddeeeeddeee2ddff22ddff22ddf60fd96f52deb1b98f0de7c8686866e60c27cf3f1e93ffdc7c76708b6fe741798d0c7a7fff41f1f9ff567fde92e30218b756f59e7dbc5eb3669669830a50dc662b158f796f5bd659d6f17b7f2ede2a1efa66deb3504ebe7fe5947b59fdbec2649d664306d6fdffdb2bef847db739bff3776493ff7cf97359a762e17677db1b6eb3669b0efde2ebeb78bf34ddb7cd37608f6dd3ebed19fef5aa28bbf1b6dc673f1a7ad916cd4f219c9462d9fb6a896efe22fc5a26d8ae53bcff33c4f9d8b3f6dc51aecd3d6367b71aef3711ddbecf50d7d17b7fa787656d66bb9b32491e58aba74c6545d555e9ead3e8b8da9aaf2d6c5acb5a7b497da22fb8bcb3acaff8dea2667555bb33e9bf5d90d14a374cffacc88775a929069ea64d0d7249196b4de8840b6d29d74879f61ec65435399d05e65e3ba799252a1ae9a21d9ba7942435d374ebe6b89fe6f9a64dd7b6f5ddc7b6ffddf84700342ec039c374a75661de8c683bf61a244080c19184660f0bcba2a4a6df5a6831b0dfed37ec341eaff6f36d0e0ff26030c92783591c041450294d0f6ecc6cbd8cd0516745a9290d1160abf6b892ae06779b484175da89d96b4a6104b4d919252cf6ed2d045992ef87f173dff465d30e1029157b990e39f9fab2fd5245162831aa53bb5c5075b38f0ff5ad0b2a8e3ffb508d20395451da82c3e2c68b86142c178851b0c94ac60026585991414284a18a0440cbe8bf8d98b52a6b9ad685246f16a92339b934974120e10e0a590578df66ab4d724950a17a828a262c99ba924539c7555d5117b16288e48614e91c5a7565390f9d4de6a0f500b26c52052d0f12a293c293ef87fae6e5b890067a2e8e13f0a130a34a828b4fc3f1474bc1296921b25368ea8925cc08d4fc2069a42d0ec8106016890406343234333050d947f62912726f0c4204ff4914a4149922565b4d71ea6549364ea979f3cb96b29e6649d4a51d2c94ee9939ba4521a779dae31c00d6da09a28e39f4c135f9a083a9bd0a00993d15e1f5069f8579700c33452ad4e49c4f0b1b3a6e24055d554ed485bc6cf3d8849901a461831da6b51ab0b81e88807fe8831ff8f42028d472141c6a390f8e2514868f12824a6f8ff244664610413ab9411618c308d20c1082e4500236efe5145d851c41aab22644520f1bf2a222c22f5cf8b8acef4f1456790f83fc33fc90392e87186091191fcff068f22628fffa2a25411115efe1fe751441c0045449921bcf822124d1515fdff4e124086f8e3ff8bd454c5c0049fb551baf7ff8d043711ac67298bfddf40f07fb3e46600ffadff1b0104e0b5b34afb581aedd9adf36d0ac1c4cc2066d29841c28c0c492bca8c8f9928ff7fe39a7c392ca1218cd5b2fc23ebd4eae25a2cdd486a2f85251c541016303712ff8f3e2a08f2636649e690680e3f7b103a882641347927376edd4d520f1c000824805881a8f2402829c0f7644fbf6b91b2262f26b32e2f2e7fb0e287177e587fe8f941890f77f880850f43f820f4ff2214a00d3555a90538e17b5c616a95aae65e71e0410b1e92ecd0c0a376f847e980c8a374f8e3513a30e0513a8cf1281da078940e0778940e343c4a87308fd28137b084ec2fb2bfc6b3c6ca9a75312bebd60d001a50bbd10ee25d68efa4dda8e6423b477974c8ff29de6949ebba674a9a20fddfdcdc98fefb6cbb5c4a44b8b159cf4e4b124a37d10e370cd4e8319e6769a2b419ed4689171c7248a5284984839520140e37a5d60d65fcab4a4f4a2094384864903dde68c38638421b8a5e4d55ad47d9f0c083a9c10b75e77c50c3a7a6aa1a96fca7562a1acea06810f34fcce0c84d929a2f6e4aff37af76a3fdc805322c92f50632a0791044304502498e0c37a647fe8556aba47387297b98f2e25a2a7571922b604803430d6769058620184080610235a7fbdfea367ba7dd3a47800f6828ad8cfe0210ff5fa42a5af90b41624d4d8de48d7b21ffdfb8d4aa7374a4a129731b75d32c931eb583cfa376a8f2a81da63c6a87d5a376f01eb543aeb920c6859ee7b3527da185305840b5a0e5ff4958752c10f16aaa8a329e35d2d4c805fed527565884115499db5846cb0864eaa891682cb204181499a26f0121aa0007ea8b161ef58598477d717bd417b5477d913eea0bf4515f9866afb180cc5e63dd78ab9b147953971b6fd16abcf7b4811a13468ad60060cc01c6d0565920811a83f33484f028317dd420c64c0b6282fe532b9498085062fe1f804aa187146e2904fda7a6a45250525356df41983b5e4d5551666737c394af44181315460c13f4ffa924b1cff61943180cfe596200a12559f149653eb52a2ac29274f38fbaf5f129313724c61b945753952d7596a98e92b6149a402101f2dc3e7bba63895800910a50e010430a3111629a80294c5acbf50c256002e48f08fc9bfce803027c3ce0dfb4871effa63cf078b3c7d45e8e678d54bb29ee95df78ab8fa76aea72c7ffdf6a02b0a659cd40ad2efcff1795aa8bba32f95897bc9a831da90486868636ece2d6c5ac9e356b68286bd6c5ac2158d643b08b5b43b0ac875a43b0bede60590fc15a59b7683bcd7271ebb681b2669d2550d62c168b9575d659679d35cb481575b2669d46a59a4443792e66dd36d0c5acb304ba98c562b1586b0a0676316b557bba2f66a5286ab22e669965e7b99865a48a3a17b3d215355714969a3258d6ad14d592752bc592758b9f019bf644c8f7fdb677bbef13c9cd618db9226a9c086dd73bce6d87b9dec9eef1ae8910cc9de41cfe3ccbf967edc7591b6a9808aff77160b73f2d620ffcbab1eb960849726f7224bd2c764e835a94793686ae6789d1f56ca9542a8e851a2542cee6db7192d3e0387a1fd9654bf4d9cc539344c8b94b7219043f8fefcf762012616775263f0e92a047f6fe8949e97aaa5439e72342528f9a8fdae6fb79575fb0a4e974dd143546849803399b3bcdfbbeddc3a34a952d924a656dcc668b84a3a82922c464d72d173fabb1c835d7dc0b870787330127e807c73369b3529786a839137adcee9f3872e2bd3683dd7764d6c4140bb9fb0f0f0f8e4a9592fdd539ea5279562752434428eece7659730d726017bb0b823543845ee63ccb79a288b3253f3eb654315a8d778e99a81122ec2049f2db2fa9c59b3bed09fd583364d7811cf975df88f9d7c76c7496499cb3e87ab6ba4bdb33dc595bab39403872bdbb6377ad287e1d7f1f2d492848a50263b69be267a6c600e1cd388fa3beba13c7d1f24ca452759c8d592f69bd4ad404118a98f7ce91d6c3bb5beced4e4b1252a99256958ab3319bb4ded8016a80d0defd70c65da7bf0ed4deed7067418e3bcbf137f27d6dfebe246a7e086fe75c6fdbe9b17fbb773d54a9542a221c1e9c2b38423f382a156dcf542a95cae370a8f121bc5db7b98ff3f0ed78ec382df3ec0c4d49de8354aad566db444d0142918b20c7fddb9fe8911cc8812e2eb1d20b353d8456f32fe7ec7d64ef44cb893c8423893bc789fc7e9deb2cd73b8463277256dcbbe3f8377e5f4743d31e958a86a69cd7e810debe3f507722df1de7dd1e730841327322f9618efbbacf82220ea1d5f9f3b227f6dc6991fcb0ccb3602bed6b6b86a6acb1d3602ad5c7d931564253734368370747511c2dcee4bef9d6d8d0658ed31ef859fd69ec616fdce027821effb6fd465b5343c875faebc831f76d39f26251e6d9b39b31f48c81b68bc53eebe21263d5d0108e62076abe3d901c39de1e57a9fa6ca7a48b4b0c4ccd0c9877a047de4e9222df98f5c2b9d84b8d0c5d7b9db82d377e9af4448b63e06cc75d6cc1cc7558df6bb187bfcf1baffd3a71f70c7676d7c0107eb77f9fd51dd765cc795bec5c5c6226d41020ec62ef447ced784591e4df0b61e73cf25a2d629ebbe7716f0b71352e841db8efc6e3377ee4dd98cb352d8456bca238f2aecba3ee3847e6560d0b61e771b2bb3c7bdc47e64ef715c291233b107f9d77714d9910e37d411193d976b1d31e27144938929df78b6f277ebb1bc74ee6599cae3448429db1d5ba237916c52e8efa91308f60d7799b73b7b39ebed891507be3e698043dd2b39ce3ae52951a0935783ddd392c8a1bd49cf70b84b723af0535e8755dbfd9ee8e91909322e79c8b1eef46de8d9fccdb42aaabd395b68807eaacc1afebbaec7d96b3dc672dfec88bf9b747b123f9595e2929128a1c16f767f3287698cc3d9150e70fb4da1b3befc66c77a752a954469b972c10729a04f3b61783fb23c74c22128a5c6790e4a41d37e6fd5620c41bece488eff891242872a2ccb33646ebabaa2910f27db767c1bbb991bb1db7659e05d363ebd8e108f9e08009fbac145acfad52a954fa9070c49a771dc841eee3188b628a92e559fb6c96922118df7c3d10fcee05b5b6e20541dd8d9cdb1ceea3ccb3298ab44d321633cdaeefad544828e6cd6d907b20893daec3602624ccd6bb5ab41c0477e7b4b73be75e3ca045d7b5a7ab5aa6e004c2afe362c6bbf3bb47deefc8755c5c6267699010674e767cc551c4bc7392937996f38d43954ae5e9b6f1be9e251aa49abd747524340d52a938d7b16aecda474a8274d7b3dcc759fcd98b3fccdd8fb35a7bdf97bbf771eef2ab7520a178b1cd9c783dd07e9993a304c2317f24e69d67f26e0fdcf60b2a0112627eafd7c98b41fb75b2fb649e3d1a370dbc30952a7be936f7a8ea154a7f849d277ae2077efbf33eef1339ce4620bcbccbfa133f2f739d132f9779d6a89f46dd05723494fc0849922439d9c5ac6dc656aca9620dd64788c16f8b5deb6d39e61a9332cf1e5d1b4aebb89420106e0c761777ddf53cabb7c8659e356b332ce463d68054aafccd51e2237fded765afbb9cf77d17f4f067f7de24c771f7d31c73f2da144a0f082f79b52876fabb1eef3a72cb3c5bc65230ea55a954aa8b6b2a954aa5527da51c4a7b84f88ae367c73173204976ce93795655f7d75d7df5c535ac6a7ef6a3718bde513737ef48696dd4568f90e4bd73b82339bedda8c92f7676d3b3b1241a3a761647c807bcbd94479839397a1fb6dcfdb0677507f108f108e62c7ef6b363bf1f67ef08bdde73fec08d33987bc79131d58e10c49cf87577fcbaed3d7b9cccb31d949203c28e4772db2e5bb2e36e49919fa5edaca167ecb3ab520342db755fb65bf4c651731eef8ccef208ac231cb5a83bdb77a73f8f6f8e435d2a558aaa545f98121d21c71ebff86652e351d4d69379f6bbe94aa3529a2314b9e6483d6e10dc1d68353ffbac77f6da124a7284e0fd38d86131f3aeeb20c9c511821dd9b9d1da4efc46bcc9ae0447b835c9756397f1387276ecb6ccb3dd1b21c7e406ef78c571fc44925f996793fa11a66da08f011f97c1ccd9aef33006afee32c7911de9612f7392ecf98e32cf766e847d7fdc37729be37687b328726d849de65df6bc7b3d8c3bbe4199d7c1acfdd619c94628725f26c5acb93d82b82377595a40783b98efed9e15410ef36c57dae63a7c07a954eaa75d5c6246a535426eb77735ef5acca2d8bb87ad1a612639077ee2d891dcfbf025b145751ae1cd98d42048dedb39388a1f87d108c7ef6eb1db0b76e0287e5994793616bbd734fb98d3845bc4facb20d9b9086e8ef4b48b4bcc4be98c90b4fd8a9cf8717083e0784595ca34fba852f5b4644608721cd8b3edf6033baec5b1a48090dc1ca7c58cb5d51d39725e1961c6b7dbfdda6edbdb3d7293118e578324c73b8d35f73a1167ede212fb521a637772ec22378a63c7e1ae234b62586ebb6d41be3d0f243f7b6da530c24e821ca947ab3b8ecc9f8887542a0d46285e4b7656dc5aefbc3f12671c211f9c964aa54afb5aaa47674dc6f391eb904aa552a5abea7d2e2eb15a29016187b578ed386e6d47317fe4ad52fa22d4ba8b3de32b728e9320c7cf9ebd08f7bddde5e388bbee97677b763376bbaea7d445f670e7715f063bfb71b7cb5ddee2b6deed5ec718771fd9c3946aeda62b6da8c4459849ccbbe663f7ddb1639d659e4dca5b4a5b841c1cc92b76fc1345d2e3b0a7b5083bcc39d6b863aefb2ee8d1d01868bb5216e1c7e5fb59bbc9ce3951f71d43d70f8bf0e336b7e4d837d9e1ed65125dbb2bc20fcc1c063bb7b7f3710445cf8e50b222e438ee75bde33ccb89a2f6409967636a796d152216f1076acd81f7ebbba3815e09011fbe385b0e77396b8b3b4fe3cf92d78ee378fbe78d1dfebaccb3a6b947b08f279693a53f95860a95a80839dce97d3991eb9d27e66eac4d11eacee6efbb9a033deecb5c2ea508b96735c9d9ad7b26c151eca208b505fb0872fcf3bcdc7dd68a2528424bee6f7b5ee781dd9731d86d479b957897d0785cd781df053dcff33eef037177418cada831b8bdfb5d11cb3c9bb5479b95f88990b3dddea2487ea348f6af5f2742ae398feb2cce22cedbe6aeb34d845abc9e0792fd76960431f7c93ccb59507fdeac76ee949808fbed5aecd9f3780776cedbb3dac9792e2eb1b1b444883bb0bb23b941b17fdf05b918d8959408b12792e288c19c37477a7ccb3cabed2d25115a12ec2cdfa467c1cc795dcb3c0baa5fbaaa4884e0c522df2087b7983b70e304bd7070827e7070582f1c9cae349ed211a1e7791724b568459d416ceb274e3b2c5d61d67ae9aa1a115e0c6acb3189ef26ad16314a9eadb13c77904a85926719f35c5c6264a98890bbdfe5f9d39cc6fbfbf49579967ba78e4a95746e7c26bc1eb718e7dec1eef3442e6bb2a84444d8791d9317f311dca2dede95793666d6669c95521a22cc22c9476dedd7e54fdcf9ca3c7b6d282d66d6661f976f171b953b9f9ed54eb02444c8819aeb76f4483ef6aeab28cf763d6be8d8a5abaa4b66420ee6dd61af1b394e66bbaa7d4d51997af101c27eade5f087b9711c3ff044cd3d43d718783b0384e238ee6d6dbe1fef7cc4f9c65b46e77ea954dde8dca94aa5d250ebb9b8c478298890777dc1db394e7a9ee63bb74a4084a4983fbcc93b7620c845ef875073ccefd7454d66b073b6fb10f28ee4a4e51fc969d1c35d2e4028728e043bd1d3fc7ea348e2520f21e7ddeebc4c8aa4d7911a671797d8abc443c8897693e4de9abbdfed37ef108edd26b3f86972939e38e2be6556879067ceed0e7f9ec761d1726e55730839298a18cc17ebed8997dc282a5a29e11082fcdacec70ec4e4475ed2bb37847aef6b49ae493bdece59dc85251b422f937bb4366fef82e00579ae2124bbc8bd9c2d37f28e8b3b631ac2fd75787f9b044590b31ec9dd194270fcb8de378ff9729c8c596ef6928cc5f49521f44050c49eb65ceebece2fb757a71443088edef66c2772511cefdea2ccb331ded718df34d092508221bc5ccf1e78bf8bf388f5f8c93ccb370dab4a0408fb285acd3931779ddfaebbccb397557a21ec7ae3ce6d8fe4f6e22fc637eddaafe442887917b3bedee5f9761d591363b49ddabeb4af202eb5107a1bd41b7f19638ec9de4999676d2094580841dde96b3bf64672043b91d389819d8b4b4c4b698550b49db4db8ee2c557143527f3ec7aeb7acbae3af3d22d1b33ac54a6bb377bd6da0ff4be9cbddb7939e3dd5d6f6fec759ed632cf9e491c87f5c20173bad24c3261ee3667cff27d3b3872dfbdb8c4311542adadf77dddb87bf6ecd8b5b6383626d4dc053bfd75fc915773fb16a3dca814126a96490c22640c110098a30d000da3124040582c1e0dc6a2e178449745dd0714800357906ab64c9bcb846998c33008196414210400000880010233343403ddd015f44d078de2e5a1c89040f2e94f2ccc50701369650dccf881369732c9ff84e22d0e57e3cd8fe2f3ef768d4105990ff42456d4ed39a845b28341033c5edd3878e5b218c5b7e665108574c0d13caeeb4c261f482d1478b280a1ed60aedd4c97fc6c64ff2070aa157d9f0028736c0837488ecbbbd81353908ff2050c35570f78522a9abfc060555b3927aeb72c7b889f6a160c89f24fef99a25b13c5ce9120817e8172068c77f259ab864e1dbb5e1f75a1196eba886e9791e1b92639116218dd8160c5270423349feb8686777b90bcc65300046f0382d3a0eb7856d07721e2c194919dc2dfea3e739c5cbd57d90b3369c7c3bbce35004ab3b85d15fa65aae9e3356c34e04e4d50600401df4fd05da37d559d5cf3e9507c078989f666c47000e8dd0646cb0ba0e0ee5b1bd24944463191af7d518b34cb23e58fcd07c8d388e83cb72af9e37a5d8fea513691fdf2292f89e39831d1dae2d253f8965c305547746daa47bd0beeb494a616265de9169b1775912a36137030988e6c3f56a56ed48f52167263fa72b9fe407216e7491ae8b8342ee92c1b1880c3383b43bcf9b89b84e8f6fb2a2f48e1124d49f647753738ca208d4efcf92b413cb0066a52a4fb1c85b603b4f30830d1389d6392c474003bdf72ad60ddc18aa441136d59c9570e9ab612aea98b0b1e10523735dab0aeab51b82c88481db1442a4fa3f83d09b70c51dd2bf31b0b061657df9fd1c67b4421a00a114fc5146065d3ef7f6e667f8b4a756e60cd351561a785d8770fad0a19b4b48b84e7075a05e1fe941374f20436691a8bc8a6103ca68252715b0457ecdbb68c4be6b36d09b6cad85514329189a609418c06aaae573e5129dbe949b30047a5a4250ee71413b1346e20aeff80c6b77c09774b861fc97198b73491c4f0cee14ee899cccd4b22fa8d4ffc9c7a680e5fe8d69447c3ba399fbd1ff2fceddcf926c898eeb80ff565cf10c290a0fe219f2bdbd0a29d451a529fa7f6bfd65f5a00d956e2c0ec94c0536c2d748710317de810fd30559f36caca69889b482d29c31b3fa03c095d3ca629cc9d0544c3b3245d1ecbf3f7445765943848d7b102f374c57fae664bd1d6ed5e0484955a9c8762c4d5647f44e5f7d70de6490199bad5a5e545f444181cde7b34bf26b3a67d1486b48f5eab01bb5df0c873f410e957b355b7526528441ad2576ec05c16de01f94c73c4760efa0b2d7381f204332dda62239711ef3fa0258c59fefcb0eb504435c01f05364d4cf2699db1d6995d81508a0d3990ac39856e469ba1e447c37e4950c38c055de3a5ecf71d67571c065b959a0ec02573d55defff29918b8ecaf8571292347e8aa32a8492a4578616a472067781a8d207fe01ca32b7686d9709e2b6b41b9206dfb4d08d9143517a645359489bb7d869c1f3910dd1acb0099f0fe02634348f6133699c4302aea8e6c3a3aa4e4a22190446e6322893281503882c99f853057b31e314ea2e91b4f139751928af31a28de2a3990eedd5bb5bb056d190885ab75d1fc314175f4aa064cb7703a8788c2351bbe2b572c234269e112a4252ce1d0f0cb238fb6c4ce306badc81c27f143c4338167628067823f089ecb620d2e9854c8cae2aa0018057c58aef2cca21757f066dd41c704351dddf2098fa151d21464668803400c77075245d8e82d01f08583fdc2592d4fd81dd62fbbe918881997a3c1ca2e8dccb777f3fb8c33616784770e4248bbbb6626d258ef4742d520380c86084534fb58979dd99dbd6209ec923fe899050c120774f39f5bd8628af29693228cf2a4145a3ce6e64ff6cd7a8a2db769e0ee65c724cd926acc7d328963e3e9df6d4c8cb46f411c6ecc1f0fa7b2b4e150a8ab1f1d872822b8a3bcf4e2a2c68eb4128c1b012f01464ed66511db4a2ba57659895b4894e51e9bf1e5ce36b39d6ba98a8f55d5014ef743441740430023145c5914cc2c15b9d720b701ce6a4933b0b518fba818b81533b3809540fad7e6fb62ac431f05cfbf62d15052bb96a76c65ec48daa73c9f852c1c289d86c10368273551e8dd2e273dd4b3a10920794c250802d3831624194a6715bd2750fe5ffe8defbf16a841484e61a6a7ea6d86e660a39a4c28abe0320259066481a9222108d2ca11ce4f18e24c5b8fd96a1b6b813b53564d0d43b08f588d0e5c91ae7697bdcf02b71383e97eaebd65d802ea00781d47245271743eb4a4384b18d02a1102f80a3b45f53c1b5eecaa4d46bdd54f15a9b75eda9212d7bbba0e74a404f65ac588238397b25ba7a7db1541c0981d5cc1f2a3fc8142252c20d6d10cc1560c21e2b9c38f72018047c393a16502a201aab3f6855779be7153c8c8f5eb63f0f24758b6e5f7178893fa4b605bbeb162ba4ae08f81a9c3ab9525b81932894ab1e69b397f6cc6e8d82eb3a83b8e9d4845bcbc70a8f0dde2954a1f64b502fc507d941824a11e0ca8e18f4cafe8a655c28d04e3373b37cf1059573804ad3f95b1957f942d69529309d3dbc0182480ee5318627093b1f7261a00451aa39ab7f38919794f90c652ae4f56f09b177343cd5b807b2bf70f352807277572cf2596489dd6389f15571774be1122c7981ff59f51a0504e7ba43e95cf95a898b2f424a6c38f9c8f2caffe3331871ed87f2a34a121e8d8708f3ece488c53223afbe22fad49430122ea8cf0499267a2b9df202ed6d853fe302c29dd16566a44869cc71c1f416a4f7f674c907d777f4c630e2ca1a3510bbe6e0365d8b3f472b8dcc9958b70427c48c298f8d39b76b4385ddda5da8886bc4d607914a261aa71037a92b1ae3782b44cdbc9c58ffedb3e44e6414aca5363391c98619ab556d0e5cce29b2d7814396fff6f5c2cf10ff039f2b80f7602c80fca28cc7c27d33faa914ab6d548ca9717cd3fa8b851c4d723f1d366fcbe2d8c9af506500281ce7b0498c2fd6e949e26d5bafa06d6bd48b8b017e1f781eb336da6274fdb0d32a370b97ae2969f466a6aa9e7d1b6ed8e03156f5f0c5189fc6945bdcf49543e17cae21038fbecc10d5a0619a680a74f1d3f403af254cfb77bd4006f6220d58cac4e1a25b3e993b2aba20df31c73efd38a4fac5b1b44c8fc8cfb58f271c1287396ac82819f4d1707ba1b2b31655f15839ba993d24999b7a0bb1b79b85e8931b67631138cca61d7ea297ef64f0d744605bc8e9262b7a7d2d22144fa64f05dd9538ee436bfb4a2bdd78ecba42128180c799a76450512dc4b348bdda0938fedf29176a68dc3de344f71c4a229c764e5f77f50032c05e53017f4e321ccd90c5e889f0cc20e313df4028d69ff85eedaa61f4b759b9e576a39ddbed5e071614ce067acf6bc80a4222f4124f78ddac0a08fbdc35807e7a93ceece9b19d40e38ffe5ec11c2e1fa1b6743686055246a757805ab0056293bfac401a11bc75997eb5e09b5228b8617d8742070f67da7431fcabcd5c87da58f1a5329f10dc2d4b31ca136003beedd06d122168ea3f9919ee3b8cfa606a29fb131744522f984b435148ea0060f911b73e021ba6db8c473c1ec18e2de0d89eae4ce8c836dde04e28d6712482b201d364062b1c976b17891a3db2df9bb8dc62471c3ed9c0a43e5636d41859eb11a4b0b672d44997b485f6cfdeab15ed961d33869b129c7b0709b9c12fa6b00b58aba6860cda5e53776973b57e162f2b8066f572a80bd790f6f4590db254d1dce97f05348b2e260451720b7b023dffdda6b9e8daa9b334228d486fae9e7c7298cfcda791dc578af3e129bcdf60ba907cbc9bd470a8d971623b5208b26d978525b70dd0012c69e113cb6c72566662bbd8d98a7b1996d58f740ddc9af02732a34136be59fbdb95612bf63ff88421167954245476a66866707c803f7123c2a2341d05c0174b9068f0a73e317a0387ec393311fd6d4b499a03087e9ecd923bc9e9a05c3d14bfcbf814842183fe80bd680df9c04d2ec7b1616e47c21209f08a62002b1c1927082f670e092cbd08d052a451bcf626d34d849274c0c09c8a6022339557dc96567e674c54657ea51b7c2e8be2e8d6d42f1ceb7447618f07e3cc63622ca0fcde0fa1fca8aba6c7e64c9465195470aa7de239f52a2cfa35747b4c1a1d214e23003031e6b03a708c9db873d6d005c8cd4ed3b1de4c32a083a15788c38c8940fd29b0566e71f649596839ba24830a069f2a049a0c8881e865487d97037ad29ef2c2931283982649436944bcb4fd21af453afb8a3ce8c9ff81eadee3f1e1d7599bf955585bba10142a9700804667c7ca66d5125e31d5034c202709bc1e740f6111545b98c46f780e87603f16cd3dc3a2e05dad75c964a752751ed880543796dd1306cf9122455e5c477b76ccca43e3bf3cedd08cd430d627c069b08c31272917941af170ce038092994b1ec42c29856b7ce9092d5bf338ba49b76830b90465b01015d600d0880e7e5439b4bdc9b6267d40956cdd387dcd9231fb9367811628b49c8a833fff970cb7ad111800e015440628c0722028a9ffc1709c3f18abc5085175ce16077eb50b8d1a097a081ba84abae35d9d34da6ec2f29ed3699ac0beaa3d4bfa1291f8ab2d98eb68d001450e0e0d96d5d600c15d2dfd57a8d88d1d4a8391801bdae1072e3889171627861a5931f85469a290d8cb6267b6a48e07b91a67f61edda028db43856e12091ed6396866776ac8b815c3e775a6c509be2d72649433931dd28d0e5e38e0493e75b541a9bb2c6acad119a13bbf8f4d5eb127afeb658f347fb3380664ed2dfc65c2822c752da84dc5fc62f2fe8597fc14895bb08920ed799838ed880e40acaca1ca7ffe26ecb2ee7d4637e5a168469e6b7a2608d2e3314ab53294f579081b0509448ab5accaca7649ca5d62fc2f891f602686f2e04d40e50d40b994c24337516f7ee503a372ef7c8631951e6de0b323e201468ec0b3e3f009c681ba405c3c629e71d7d361b232fb85a42417f385c59cb7573e5e6a9856b6944b286d019fa812fe3d0b5c36495e332d5096ca9db592adab96e845a5bf5bbc5ded33c37ecc0ca0e38052625667474dd08698180b812245e55244aaacc1c1c0001f3348da3d10edbdcd77bef9ecdbd326decc0db6703d0aab8e636a73ee8470979f289ea4de4985b9df29dcc998e13f2cee8facce9327b2768fb41e8bd705079290704c72143c2aa6d1f85312b38ad6eff2b99bd56e8d2482eae898ad2a6ed59cb77df92c56eb102cc5e6a96b83475316b841a0b8117546073eeac0983686cf23c3979d41e3499bd6ab1bf9502616d164a8a414ebd6063fd22436d96002d35ce80cade701f78daa5c77a8e4438b0f64efe8e1b4cb0c66e2c169530655ec400f4da341f724f1bda90407d11f2a81f4d030873962762fdaf12a7955f2634c6896aab7c3330b7d481d3a5e59be4eb220c0b3a73de13145b1701e5878c72bdc9b2baca215628015ba6515a2a00a574b85e8408554a7f0fb9781c99d65187fcd70c533c47385d42f71f20a9536893a2db04261253754612ca9638508099cc2f3a1683842761a2e6c6f3d37aad2084fc115f94c7914b8163e3d27fb2bb9a269d276051715427bad3d9b41035497457862ab3541ef3adc1c367dc29a6b839fab415f35ca545e0b90e81ec9ab438d8a7d60162495f30e4d20690ff919e08e16a1f3467ca62d1855af3475a18a56a27c75add40adf872d71c8f3db86450b5ad45a706cb5d3497330fe4a76df57ac91ced3d5ad2ee4955122e74f4cf834a7c936951c4cdc9c4086b4e01a053b63b0632b85c369e0833b44142f80e327867853936b54a59e94c572a9ba792aa74b363035ea9e38f5011aa5f09ea737969f4d15dcdad5c8edc9798fd0ae6ee7bf511ffe92c61e2b61d3e8169a55dd52304f494c5a04b5a66cbd3f6347097b65158846c79a0d496a6b2c73261f28a415b8b6194da88ba0978a1d42bf738b3a606f8df76742c8750318c0a85bedb1c9d162deb8896558dc560b5cfe6adddefe686f6779c1b4768b9511ce8c6f4ce67e0da2606a561e0d75d2d0dc1e7a18ba4930cf9edc6c9971f3889b94ad33a49eb3142815e317fe0cf99cd1885504c0776b9db9f20f6d8a9bd4661ca6c8ee6abed14b2a814ea4ada99d476bb589bda6697a2da9689d096e442a72467a08614dc80becf49e22357c5cbe4609ebbc0a869eb90f95d6a7ae9323c398f39df2bb369a209dc247d721775340be573b3960385bf655a9d4a5defe4a4df3dd636f16ce0766f8bfd7f55225a6ba8bd3e50c2b3845e5b21b636e2cdb1d555a651278a6edb07a820163a2782c9277d4501d56b6063312558bf0eeb4613fbd7cac04fc88ff9d521e39c4f21e72ae1ae2ea2be8e4520ebe7a81d6a263a8d9e8c8577d61d36fd5c983939da6d8af0d19fd5778876aef20bd54f32cb3797b74675ca0b9ba16c0b5a3e856e17731db476cf3e0043d3e02d16a810ca37a0a795b15b67ffcd2ca433ec5426a6084fc80c60dd53b92bcfb60bd83513eaf7b450e30f924bf89bb3acf341f7d7d3cb7311265e34ef8890455cdca678a9373f959547616f1eae14a666f36120b67bdfb3ff769b72a6a31dd205307a513a5b494056be7be451fef5bd04e10e2ec6d2ed5926a6efd332cdf312580701213c5ab7de483bd6f243ba3843f8e1ea51cfbbbcab76d0c11b8e4e39d4db6455599243c7d5e26153491eb3fdd5f332c5b8e3c455f001d4313a116fba7837b85b9c397a114f35bd1a0b51530e58a3bb4250c558fbb854991b695bee3c026b6376d4e2411b838f61275c3b41a1ce98d0f3420203e052a15bef78b0bbf08088e061ff33aa3dfa42fb12156d26dd67676be9ead54f3af0ceeeea5f9344d93385b1335a79386fb26bd02bb89c3d536ee5bb7fe4196dc785661329f6c2b5d3c7455b0377c7ed91c024607a2c0d9d4f0378b38f96c6ebb9c2fce1be5cca8c2f59692cf5e82dae9f197915e3f49c189e3a2880e3b16d6be52723f6c7be6809427d634b43828ee1353e336e73cc25d6f3d1ef78751fe8b7abeeb6e1c848318df8dcf274af202debff687b1fc991b7ca0c3b97d98063932f25566554ed97ca7d539257991c3dd35ba337aaa00105bca7480c8e61b62f7e62f66c33da98961c4e0bfd52a62b9aae01f5e3d1891dc4e558c9f5f817bf63527645ea8e73e2b236996021e1e673f7f578b45dd72f458f9dd47c678543cc2d498e8da317fddc061e348ad37ee652c0a1f1927adb7e9de1da5c2b4b8bed6aa1da91d93e600cac5ac0a559cf35dfb29f902d58bc288c83c16907c8289952ba57c2b9ef3ed75bed9c1e52dd764822d184a954ff45a4c35a60123b503aff9954fd60edda9b3d4d34f265bd857d45bc8f1931dd3abcb40c24ae9f7b4e540fcace9b9ad06a068cc8e78aef6bc60e3b3f4a0c6d787f17464e7ab486c588d1754511da9f929fda67684a7a7b9690a8639e0fd79a5e709978b766c4be72a2958e39caa78c33412ee09f6bbb71182f5d3f70d2bc0e248382f953df70dc6cb31a2bee69a860523873900f71c19e21d9a1c5fd5267ac2df82b50b334b71bee24aaf2ddc95311fd916e6322cfed5480da124d4e7a229cd569d547f822b23c5a8f4031f3f32c6b1ff352e935943fb0b6e8c5f975d60ce6b6a7fdc3baf67ab77206f182b71876c745febd36f30102768ca1377c52785ff7a917a81ba4e6fcabe4c3fe90206c4b70cfcbcdd91047b6fe874a47a38bebbc4249996b8cc1234dd70d6bf3a37526dcb9a64443b846cbe66975cbef1842b95f818d1bdadd5ab79cf3de10865b91b7797c070f803f3f6e1239634fcd1cb54081dccdd706be342cf9b032e6780eead5654100b305b89084c45a408e382ca74f54a56c2020ce1ccc5297540512f00cd6eb18efad5d6ecde3028e8f86b150eacd71f12ca58fdd44f7ce243799362f6387d68b60beb7ea37d93c00581d26ed4eaaa24dc8a528789383abadeea8614b9fbf04d6e5530fc93ea5f1c6defc9437c59b94faebee9e64edd5759d4beb3199e2c6650e35496bfe9daa5812f9451e29cb54746c503e732fce3658bbb8658424ae523199a14f0101e39f0820d01e58a285d58875b91ac3245633285d74be75909764c0d14652862d06aa2993a683a0b81a9750e1b865bd9afa2b09e45efac5d53778da7e01c76fe57d1ebd856c834471be8b83d84b0361f7b81cdf5fdeb697f2dc95c837b7262ac050d68d1e7b14ec2e5b73367cb044e5f90a77acb7f56c5d309eaafb6475619e9189c04ded331eca02b679f70036d24149e04ad7a5538aa17600a8cb2731753613be16f0c2d0ddd2597d7eccc6f6e560a2c62cac2e3bf102108de23d102972e63c01d3e2ecf7488eb58bab9da2c5ec886714e6ad98cd91c3dfc2d1af89712d363a64f3740ad81f1e9b5987927f7244f2dec94e5ebe12254fdc4c6917330dde0beba5fa7cf9f24d3da361f4777dd7309028ff31eee75d9dbb7e5438112407caee4ef0d09c2ea652816cce4d659a82f4fd67aef29bd98e75bb39013679d4dc8d94843d1c634c3a0a1863fd3efb2aba5c697eb70c82ff38e4e4043712c10f370c0193b021c713ec26bfdc112c93e8ffbafc73af110366a677c6ddd68c5ad4fdad81d121d36ac14e12c2aced52c630a61906c9b747393b510b79935b9a2def7d79946c24eaaae637d00dbd5f56ec3b5b161e55d6a6356a957dc48b9e528f4633b002c50d024b43b3bc683eca05c752f201d4148a6bff35681d49362c90f9e7af1a94fd7ee9f794a084116b57c8faee001d9aa0c2cfc86918a7038a10c3ae5b1cddafeaed65ded55517473af6341850b2aaf8c11b217789c920620bdbc3e54b1fd4e4cae47ff821fadbfafeee88775e5777cf5f7ce8e227a6410e9b7bcd77bb3a6f7082f17f89a52bf1ed40fc90b0a7bef156bc1f0b936dc24a0d00bb5ed8f424f06a8f79028dff9801f61f08642b0d5ae069ee86bfa9142e18cbba584eba61878d50f5c786287d6a63419bbdf5bd768598238f23bd4378f328d2e5ff91a27c42505eb92eb6be16965030192a6ce005b72cffbbb6d0873e5065a77200ec59025cdf1465a9e8b26d18f8b554ea37b769b0400ff9611f852059312d6a71ace3f1bb97dd567912eec2983ec56e8f998be3e6cfa61f0ec07d9cff958819beb0730e42a79f10c739544eebb6d3cea7e8685e146fb41bc55e0ccc6f192e5e016437bfba2f9df01d639f0dea9287092758e7e2884c9c57af64aa88cc2829fcbcedffad7a36777c255794c5dfdf2504a48cb540ed2dacf74f6ea7a84bbf23805c7430db3c3f68258c93f361e108639d2f3b5d698a06399f1133f6ec9fb3ee2c52cfaad8829cc913cd0aef1f7fa67c10da81f94c5ed2af758458563e4d3431c2eec28b6b43344dd005cb65bda0fd053e5d561de3faea45af6dfe4fec00fb73b4da284fdd7a7c3d67f9671a8bbccb125dea0dae7086d39e30c359f1de100ff965d4482462e3e14f6cce9a014baf788d9a05418cbd1d716c4f87047801850ccbe74fdbfd8627ad061ddf0e72329abf5d0d43f96bcbcd73b4c8b9dfb941c9763d64d98723f568c2e5a2e858e9f308a53a2258c6121c3f7e3a831fde1178f288bde678d227b976c87c6bd5665d0f82fe3a98c0153c1dfd1c011e3fd3ff05ab6943461b188f4e5ee4dc7c632462bd0b578b2adf061e08404fdab060fea5841c8dca7cfa8634f721cb2f56655d10c5a4bfb6d20511a9f13778fbc35a7d5b769ddb0f8a42cce09ec3d9dbc698bb978b036128df323cb838e390eddfb8c3dd5959d4339f676249382c26ba64685f49b2cce9c32a5fce7aff7ef22e634f9ed5b02ff2c07bde4556c2d34574b29b70c942e3bbe23ec488df33b86b055d1b899bb6d8ab0b1c53feca4e4027d463df0dd2c7d97c6908680202f38794f76b4882fc4acf0a9dfd26b875729c8c7b7cb9d39e0aa4f06942b0c80c5f346aee7f13b7e390ecf1a92101d3039554bb6115ecff649c6c88624f9b9803f76143cac314233dc4ad7421891b5f005e655131f65be3c0ea7193c6f7864fa5e70f85c3e81c6e2a49956fd1b0de4532de171a39ab0c70a4bf0bbba8a140415b13a61a417c2fac7643db0b41da6b67e7255c84ff7a82b0cde0909629f2717584a2c7eb78b790d945922ba2d203ce0df1bf679e7a57deaa7056727da681f7044792699de2453529d44df0635d8cf1d21fc7e01aebcec83151f6b29c10f2c5fde850baddfb78102d01eb3bcf04122a3edf18db7fcf587f4fd3127c29bcef82b0b6bbd851bc84e8cd4ebafe7aae7c87f6f4e4e5efd4c0af91d8892843dbe28082d6fdf71209ee8387ab2bb779fa36971e287112cf446001ba199a291377c9537f1cf8bcbc3d10718f2abb0a61d507c035f0be06f7079fa29dc1f4ac3afef8c6126f54a3aa3559db14e96b5d7abccf5f878ab1b7cfcd5c35bdc510b4761a492287069c227bff94150e71c1c25f3e83479da1dafd2f37452070aa746f1fc0e6d576fa18e3044b80e3b3ffc9fd76a59cf8de107003b5ff3291c96d7c9b98dfd2471601a686eb1519dba67632339ab7d2eee70b543caeb04c539db1f3b8d26fbb298fc5211aa890f7f878f8530646cf398e22c0fbfe39f77c3eaeceb5f9fccce0bac3654f717ddc79a09c53f5eabe77426fae9d34af58c9351e7deaa97943bee37fddc17c16e3611a04dcce414156326c106c4bcca2f8dbd190e4431bb0c4535a1dee541470509bfdc355702cafea3e5c99779f2acc95e1749bd67a9ee9035f04440a2113c575767f2eff87f7d7420ce88200c12f21525c587fd45327c679abfead77bd64c66e272fc05f59c968ec8fbaabe2885a56abe599fe11c83db3c1219c5d6f006fd3cfaa8251c40cfd9f99f76bd03b60db5ab53c1ea253b5b0fbbf2f7f99e5d8ebaefb91ce13515f6e2a3c0faa9cfb10a2ff7cb4554e25e18d78943f9b69191897a8b6af9aabdd7bcd5752793f141da9b1be0e063322cc00798f4e6a6068602a891183e74a49f49e5cfcaca7bbdb9ba5dcf567a6dbb1217ee546acca05e68f623fa5a2deaba557fe3a4bedde85351c6dd267dd6b589bffb72aa3d9f62114d3a9df0460269a57c4e86fe321a5dc4ce4d22947db570d0c457ffa27c82baa1af29216562dc681899f2d09dd35debdf3c6981fcc1beeafb8f3de5c235c5366dd73de9015beee40e8966f9d71af5c2f3f7997ea3e80f9021bec1896d554df1445b2a8d88cc64dbf752299ef2418bcdf06ed2b4a1f14879d1cfd06f675c1dbfb953eaaa17e3b0fc6ed13ca9b7134d94b63b3b6634aeb57b47315a91a09c9e8390072d7744ba6652c3963a69b3f9de230a160217ddbca1b58e29bb98b7f48ee9a441ff4266308e803f4ffa012cb35fd9cb5301517a5e61a2537429e9eade0f3e7074e4b9101e68d1d82e9dc76fc69364f7244c865d15a4925125701d4c00350e45db0be80316493ddc7a621358ec6de00612ee0cc99256d393660d4a2449533c09ff10e5ee20d11038646f55a80f574d3829dab40a5eb81094910e40104d8eb3b53a8b35619f9501838f493eb25ce76b06139e5484301f010af9fc9a5c53af47d9bfd311c2f99a94214212944d8dec476e2566dc22538d4971c76678670b0ebd41372cfa352e65f14f43161515d102094e2cf74e418fd2a7618402947b2347964e14e64e8c5e42dcad0cc2191e958073cf730e3426e3363a3c94fafae0c0f116ce3bc62fa13f4b91f99c16535fa8be3dbee16940fadf9acc2067a8cf3bc755c4e1a30292c26aa13d70e19dfa7038003742fcce8a298cfe770ba17534f0cee9389ad1e94e758aa692edadb1d25ffd128c704721d9cd50f8242a87fe3d294395f30211fb3e042392a222cd217e4b01fbe056221a5285f4eb2d6ba71e687100e6460ce8a9d8512b68f6b7b5151bc47b394e6bfd6e0f86e3cce2b0190925ff096bf3218be2c6a3a273bf008dc1087202e83abcfe4392f4bcec0ebb9cacc21b7af58e42eac88e41f1c01833f6d20c0310b948533bdd5204a42c7aaa4228339dd9f54f791bc1d28488b7009c3722d0603344f8b9dd66eee34c688687c00501573c92eaa776be6e796cfb30fec2f0ac844e39f43f3ad0514f08ce31ce793c8bde0bda3456c25dd0361c604f036646725462cf308b14998ce2667492a78e3303ef04e86c9a2b83a0d3cdcf82a1dd4276799f57cf64752b6ec383797fcae84719c6f141c74a7271661b23aa333dadae5436945235a577fb99b3befebc4cf83fd37c4f9a623c617af486634d872f98c03cdf73af19f6ba8bc7c3cb8bf697e68bb9079ee26f7eac39ff8eb1c6df2bcdbd42ce2e9ef8e073756b788df340e6931e64096377044b179553553508cdc80dcddaf4f621c49be6494a465072b1a5468201f1397d4ac4dbeb0ad9c5070b2959e20599ad9e521f3bca4c084e52e12ed1fad95f216f9bfb73f42e02ed86143fce27a5d6c53006011ce74e484f7ea3a0e96de692731db1c9254a9acc051d989bf1a9f1ff82ae73177abce7d38d9b9c72ad8aab27539ca88deacef4e5e42e5cbc51d7bcc9060e54afb0d2976584def3bdbb0e3bb55cfbee7ca4c405087625d3cf1bb34edfe07a8ee0ab01ff8313e47f8cdee7c69af15c3e86c60f3a1568add90381fd0e0e5f81a76ff87a88923e9f2f815412c33856d46972589af203c27292dab1ca85541b0bac57c6a639d5fa1b5896bb0aef125b55b2527a0859d3dfbeb4dd1ec94f1cf920f4c0f68f7377663c44ee16ce488580f7ea4efec0d4eb8e695b2d204b69a7608addedff3abfdf62d9e5d16b83b23f84e2dcdf2480768bf7a36bf2a0f2cf2473c9c409cb6292ed86976119b3f985da30a14bb7bd0cc3c57f1a8e291e21b78f9e91b462a01ce05aebc27d0d71180ba6a1dcb235286ba15993b118df2872cb84301cfd2b17d12689b69a5ab6c2d0c8d5eefdbf29c280f60e57bd55497ee73197fc43ce3575f3a48fd006667b194728192c92a81ebce779be013f05724c7fe0e7bc93369cfa1be0de61a7c1e12c870a374ad4ad8d07e32616ced13942b5b55e0e9757cd8f32b08bdd67e14f92be10e3d5af4dc148e944e1985d8673fcf252451fd0efcc9565a6ea7707efb163746ab6dafe5963a31a5fd153eb9c79a2f0f7b786d1e9b2f73fd3288ea02d8de5ff28fd57972ffa2df91da7b184606b8c1ed6b98a9b76064d7fe51677bbc71ffd1041ef6cb648b111e616f9d8f60f876220f9bf76f92ecb6d8e9291608c7a9a16e2bec9ddffd3d0ec6c3d292f34a41912607924745edfd11f93f00fc97800a08b393cf26f760f55dcc7150d88f344d4122912bd16a4c0509199783b3ba06fd3db333267fdf637c2bf1ca0b2c29bd7fa9398aec98d20cd8897e0e87225ad008c75b62d5c1113de56a23967b3ae2b2489dc3f45453f4891fb288fa5614665a9992cac5df8e56e08cca4664753ef9793490d19593271b2bcd79ab941be902b91ea4152a009f7ad98f94bc1d3642f177db891c0d832250e3ae913790ac9d1c095d5f749c82e5e0f166b662bf23e947c3c13beea67411fbf4a136095dd28692840eb1c96a8fa758b80f3d15f00e9cbc7751a81e3de2d115d54bcd6603dbdedb2f5b85461d1e54b05731521a66185f54829f8c7bdd6defc1855f811b065f9ed3c70c88e0a8f87a55264871b56fd94025fc04ab2f5cd66cfb8981dd2fa0de1b107adec6589085bc7ad87758f1e8d117fca8676943eacd33b1e9f5e32d87db6994b1c7aeaf5ee914d9951c96bcaad1ee18610477c4a64c589ff26cd32f5b634fa00a354315acbe78c2df0dc42e2903d31100556dc6ab3156ac6c5ad23e05c70ce10fd79aa992efe54dd101ff658da69b42d46f096aa8e39b9f8fcafcf5d243e3e2c747b3f8910fbf891c97bc9c515cc1b88cad8024b622613e92bb7463bc2c8d3cafbe24f4dda9615a2aa2ac8b386d490cee5878f63e6b0b981ff2ce3c66d4777a3bde757c9036366692d2bc08c6ed3cb8bf91e09cb10951c186785295b4b32d6e1cde4064bf3b3f479898fb146c3173a70f99bc17f5a9bc1192f842fb15b2d6a72709d5b5254f76224a73157e63b70d060bf43e7893c137ae452b72687e41ce1fed1559eddebfdcffd83bba17b86c21f474b514b3aace276f3022ca21d732602976fd21348c79dfa207916eda4450a572f477cb2b630ad24d7f83e82145ac00f229fa7f4e8708c52baa864182ce64b4fbfeb762c9f6ed83937b89d61b5157973c0530367be7ab80efd82408e279ba9e3337ac4903e065c5a5d67c28291be9f8dcf09995b904eef3a2f61a46cf097157ae0a126353750903ac335ec35b387efb498d7f6b28c71f40c9a3c649263c344b4dccc34ff3131d9b5b90d0344cfebde6dcd09dd1fd3ec17c1f958d21aea98006fdf0afcdfb65074cea5c036eedfb5d638fe676e8724e8a7903a35a04cacf9c95f8687d489ecd2095369346cfa427679a7ff7f709c0c3c45c9c7ab7efd4211e2371fe5f728134338f6151b5c4ff637f32cce1202cfb6aab4312ec99d68adb3adbcca21e12dd30542e0b1d101f258bef5b5cb0ac35a361f4aad066ba858ba0114c75e31f016e72dfe0c133c2a4cd1ab5103c77310d6bbe47f7562096d3b7c8113efe46496a59458b813c14eeaca7a7250c618aa173f407a71473597d507564e570916b885ce11631b64d4a85da82ce1d884e602a8070ede28a5691fd5e89fffdf418a0502a5752a947f664363e29565cae02ed701f01438557060cc0013b3b277e7e43191bee22e6e52b46eccf09472d5a4b62a5ac9544a40d54387828bba2a426f2add7bcfc81bb9f266cc1813b5e0ee1cdcbbbd14339646cee2c199bfcae9b31d6daeabfa7626ff3bf7fc838809b4483aa69cec543f30e649b2cc949fd2da54e22323bc7f453575ebfa0ffc806051fdf183fe4c75ec0c6822bd672c7a1bb725b15dcafc90bbefc2f8fdf54c652f64e0028fd5378696fb8afc85f0dc2e6829ad0b82b41406471eddd0d0c970c1a652ed6ff963a72165438360e775d4135fe21bbf1d704fbbb779fabe4e937b33e97f2c52f8506d42ebcbaaeadcd46d76b22e48859e32deda53242551ba46c60303e30ddce2b8d20ead4c42ac23e7bf1c00c609aaf5c0a4e988a8691f2163e5b40fcfe695009fba204d72382f4572a48e83e7f281574d50a1db4fb8ddc80f8925f4757b9f55e94ac7fddb47d33b10d3abfcea7779cea0841a46718f210a55fecd912fc93d199e1e95b643d0f881d9baacda1e8848151d18bdbf697333cb8f66fcb8316ef38117e205f2f52bbe83ae2c1fc9b58c9a95850eb62d6fe90c33b0ee52d77b305ca6a81cf65c02771737ffc5ee15f0ff30667dd7af6ce08552742d734921609d09782f83bbcc6061f4fa7286e4dac83b07ea0df26e79fe8fe27330e133955bf93ac1487f45f50873ce138afa4f73a11baa3038e3f2a996bd2f870e3668ce2e26cf475231f0e1bfc120f91ddd4ebb38c86a69f138ea8ea7332d7a340c4146895c5bb5a18efb9e747a7f3056357220932e4ae9810c170f98dd6c8a96bb397082ccc81e2c13d31a1141149e4f2888125c943b022fdabadd41cc8750a0c42277383b3cf0929e0ff444f18b514ce9d51f87570ef9ab848fd7f90f7536e5afef262b9feecf332417461d9c9bb52909a2a8e89d26c6c50f776ab1e98cc1b5483671f2370b3620867524a4595f2ff835dba3376af169a358c7fd67a0f8fc57bf77e7e84e8c4762af44ac7cf19c7f7f9f8a0168dc17b4df1fb1da794c48b32de912938dd689f9063974d7f91d003576c07c402a05f396a12c9e00f93cccc99fd8a5f64197672c5cc66101f97b9c671b514266437215f2ed717edbe6309c82db77339ec3a1056c100001e28186a4e8484b18a38e83fe4a72aee8371f1012411ae0bbd4cdd59c1a0aa35ba36f66689ad4f9f083723f7172e436d87fd9e55ede7545b8639852135383a439ea19cad63f351530c3b5f45b581497cf6514bb27d62205129f68e4748d9da32e858d6eeb0dbe360a13982f08db5fadd576e2b29bc715bc169f68f2c160db67e37bd1b5f7eb16329294972d42b43d9463a6aebf4e3db5a1ae8cc80d9eebb49d9f1f20ddf9feb7f323f0da624a3fa401f9bcecd5ed4613bf1169650efdd868b1ecd94ecdfcc06fb16eebb838b0f91201bbb58bd87ce910425efe10a4953df716032201f2d1f311359095c20cfa51f69dd8c7119b057ee1ee6ec26af1fc1167a3ee03faf3c01f9797038c5b271fd284aecf4cd0eac9c33e6ebfe15c384d2d7dad50380cff51e53e2f73026e3104e7b6e970fb8497798d7183614c66f3e1fd5d498877aaafb57a317be9cc8c27b121aff60d942e92373a841ab4d75e5fd5461ac46f8069e6bf2cbd1f5c04e70e6e9bb6dfc787bd6d526d93c21b6a918ddd517dc2d73dd6b52ee42081cdd99d43a6589cb4f2ed21f126631f9dd7e74dd8397bd609522308aa08bfda6037f1360fb7cba21c25e6f88c74274aaebb6aeff43b511dbcb3ff159082082a7cdcda569f602b7cd5d917a60061ee3ecf54aedac22d08d9970876741896eb41517de4ce4bd69db7f28e13447108e558c4551b2cfd48dcb834ac1c1cf4bef4e6135808440e6ac5ffe6ae06aebd0062179210684612d748ed4a6c6cd44312eef10cc4ac9e8f4b24f9579f3616d57201e76e3d842a5138bb6e38072587a4d8f07d163e77955147a2e4c90cd765beec50ed1173dac197ee4e533f3939575838273bead26f0371d089d1e26d39b8e4660778b0d11345aedb5a71e4cc3eb3714836e3986bae30f3a39257e3b19d85c8fd9ea3de103e1533943fa42651f437521635daad3ac07a6084e70530be007bdc32fb07fdb3f733977065d04fcc68bd99ba31bf4f7fe3ce99813e3f319cc7f0c8eea798a95b2b34f72940670a4d5ea83918aad985ebcf150ac04c37c6c697e641b7b0fad542c5ac7703093df522963f0ba383191b3c1aeae326154b97c6d2bea08347329719c84f12a29883de19678da1011b6d8dc065fbae9be9f5acc510c94bed42fdf2d7504df0d3a284272ae8ff202ff9770eff578a1f2e850c135d352dbacf590f07ee544d1cf1b7c5c58877ec49f243fcb7f1b2f09f7ae9fcd0ff8dbc2c5cc73e224fe45f239f0defd59fc48bfed7ce991820d71b23601ba4e16294b478a78a1043cc611d261bd9b48f4f0b7adf0666c779ed23f1447d3672d970defda87ce85f4d7e36fc7b4f2a1fd2678b9311f7d693e687fa6be762e2bff5d379a2fe9a3859388fbd349ee8bf561e3baeb33f8d1fdac9c325c6963273ab7d1b82da24cd5615365cd76468ad5a353c535385e1e8588ceda5705fb2d4ffd52d17e47b2ec9a78dc2835df314f9df2535f227ebb2df9d32f19f71adbc585e0af4294bed67dd3251bef3937ced293bee375395ef5542234f322ffb5c2a13fb1b67dd8bf5f2307ff94c9cee95bc452582067ce43981d998c8f85daa3b6c6e150218019d96873dc517f223ff1f3f2f336c5fb005013ca73b0407a96e82ac3c1ebacfe2f905b63647c93d907834f2bbfb7c946fad8ce0c491f2cd59b372d1edc15651480d74d1527d0d615dd33560561f1295c29684350435dd6fd9d9220dc7e4526b09a6ae81c0a4fed55cc258dfe6ce405a9e4df744d218067cb125fec283d3caa929d171884087f16a5fbd4c18089afc6a96ff31b162803714d67ce0bad0a9e2363806fd079281a5ac4f88786d860017246b18f4152aea7eea76f1e4aa870d6ef3a6029c4b22e45e2270503b0a677e1deecd1f45919517ea9604bf13bc7f9244039e3e0f6519d6d2630567ad767933864720ab23de647d2643ada6779d7254a0f1fd5b2af01487f01fbbccf743b542c85ab984d1d766b796271a97a274d22fe27b390dd97ac3b3e1470b072dcb11ce3acc50246626f8dbc1733293c28dd6024b0f2fc91fa2898d1b1e85f618643bf5223d92048201bcbf196ef7129a5f17454800d590aa9d6c07b7f12241886728cc807c1feca1e9402f1fd4c75a54abf5d6f1fdc9f72c54200aaedd19a7ef7fdb6286970ddb95de761af4d5713255139d2a5d93becd39bc3983da43338d027cf587a7915b2057fb921a97a9b1d20339d4ef821c883d11f84143cbc434103c64047f4c8420d950fa9139fb1ce1d96aefc7d4176844038c0f120c958c7251fc29b26d06682eeb487d40ab718439f187658c141788eae057caf7aafe10b8651f4d94dad3ee571c59081d21f2a4c5eecdac17f6d7e589b29e0511f1241214e2922048b634640740e2a99204195b1a883da5d96a9073a774947a455013513188b766a791e5a8ebf5dcb5daaa845ea03a574e0247bfc2d3f7bfe51e0cd7c1a57f42cc820594889aee00b658d3e087493b7ac1c6d6b1511ca59951e78036a23e76161480754c679b2a0144fbee18c2d384f370c25df5b94d10a95639616b11f28b256afe8e5b5d83d99c793a9c4d4b70260e7087ff64214acc5d38c2d58998d990953dd4e62ccaa4b2c12791d77a2898efe2fd320a67ec415ed29abf09d285a5bb1e38824ad41b1c6b4928f071f64e70a34ccc1928a588fb094bb76b2c9681252a4a170e5340fe0735f37692fc64fc382fa964445ae023c91b766834098f7ddd34b1269a2d07de6676c0de5b9ce2fc187be07ae01aa71b2c63207642ef6bf3fc239f6c58609aaeca0aa0fc661f6409233e9f587606d7f95c30ce8b00a150f0f6d03beba3c7d6f6b6ee3b7e3348a8297bcd0f830d6d6cb7439d33e4025b860ded7cf032f674d1af5339565391d164f984e86288ce2b0037ae6c01c869042c025138c8b5b18bfeb6cb1e39348b8e1a157c7870b0852872137762a3a7f6ebc87f57da586124940f7c2ad40160abaccb68490fcae00dc994a1d033490ce43019d20023e0db14e6ddb2f90fa9f0af679bef52d7154f0667ee1c9c6ea584cd390515e5a914cb9aa727d22ee7ceebe3ed3ec392a9cc5329c67b61b15febb7cb8b497ae42afd11637b833758bcde8e8f3f6d838a7d7bb16973872e3af7b0b537bf15e78cbca5784263880963ca0f96ea9a17ffa4c88561e8350125b640242a8f20a77b4459eca0624730d8ea888d141982a1d6588803091fe2b1f343132f0d6f7d1ef96263999113b3a2fd5978474fa1eda115192f9895a1c2cd54ec434d1525013dfa1de0fa57502d52141215db87ccbfc1045c11d768ac44c8181d0acb2a1a6d4fceed41620f2a88e6ffcae79c74f58e7ef4078aa8eb3a51b810fc36018ce9a4bc392f9d0771d03d82839171855419a3b54f7f5f87b0f54012d14eb4881dc056048bda694bbb8371c4aec54dc01d356c35362ebf1acf76d73f3bea5edcd1a0a30487c0faa65ce74ddc21c4227942ee57b9b2e0003dabd44a4ea104880f56e437b8d515001b730a586722fd5d2e40496ad1110bb50e5acb1e6960865a1d52da675642130ae8365171fce4e91ae298bb3876b01b22d1fb22703a5889d2b7d7f9b2869bb787f3057b30ec6ac6dfb5a8e3152e178eae6f373e27bdec08e6210518add5d6376c366dade173b4aa7123c412c154dc433317a61384863a8cb938b4012fbbe9cc27561aa34bc437dc76313eac5e0e93665efb0e31ac00ca89ff4269ca82cfb100bf4837149990793252f11e66cdef3344724c0b5623894a455d739c0cd6287672d5550c6086257239615a28f6a2f28968d404147c8c732098ece8b4cabb85e07e9934f5133191a76ff25a593c8d1d758b444a7e38f5355c7a1363f293b33486906b338400be36184e2f45917506f51a900d3c1a4ed69e06fd945205e85bf15da9c11dc60909448bf5f39680544dffbfc575f5feefb746c84b2b3e95d6efb2d65e32482e3ca0837227388edfc37d10d2f9d7f3418fc19cf20944e63c98404e733ab78f69dfa22b733f8c3a09be3ff137322649de0c498e8f4de5f07cd0baa8fbf3f4d683b73170c7601b59d5dd6744b8f53c138fd2922a16dbdf017651ca85b46d7c0b8d2f3652b91637a3c0d48273aecdee37e881e8b1279d1fb1a2efc22c7fbc399f6d397843410d7e38ac8f96e9bfc5a34dcffd86275195b7532a44d4718ed416012504da4b5c314f985c9e52a8323f0ccd44151be8735efb285f66efee44d5a965361ffacfbe3175e613ff365518c864013b963479f62817d403085b339bfa97440c6b7cf0f63f891015a781cf3268fd79b798dafeafdde9728a7a36fd2a97c12957dd3423fb5ce86a0dac9cec41191239ee980cf779db6b807d007b7b707d9915526f9c09d9fa96d2fc14f9f1871c4fd7f3be64753b6ea737f8b63087fb1432ac1ae035ef96af8d7fc1359ed95baf8d63357a3e48aa9c73d818bdcdf16a7705e5941ea4bbb567bdb79b36a7f0cfd0dfb814f492a5ebc651ec24b6228870a73fe195b5bdc0463f4758d22bf16a080fc03d6558315411df808d5edb12b8ec75d474e87ee0ecd71fe6dc7c699d1fc0febfc9317a4845222dda81a6862fed577f2f597ab5ae77cd2d125ae4e7dafaffd977f8513fc9ff096b54c70c181a6f3d9d9ede00377ebd639e0b1ff4ec66683abde12e05a8c6159457c437f58f90baa140747f894b925458bb46951587d2bc36619f1383f396f5daeff82e7b1420ba7b603eaf91b0e84e67898eb01e3fcffca717935bee8e0be79a2d717c1622cebe51c31904342addd1d3ed6ed3b97801f4fca580b6588a400d1ecd6884cedc82c1b778556bcd4a8d62dede5724a76037ceb277e90a194e3da6e0ae76714c10101a2f7131bd702e0986e4215216283d9b6e8cbf8314a3f428fb9b94f7f7c073eaf84aa53c6ed2bc922c6bbc7286f5b62424b787b8a9686d71b82131c3b3a12979721b18a03dbfb17bed5f53500d73a23b40e3ef22cf8043150b8a81d5f59643a7e574f3679935d1c80e0f45b0f9da4f995c345b4abf06ae09ade36284a5c71542ae44bb514168453107fda01f5e7b36d77168aebd94db1aa1d81b173aafa5404cbe1e9b9c9024387c641a5f80c44f3e0a95292ff01920d65fa8fedee7613c7e12f24ce64ec925415c9fc5b39e2df43ed8eb20eca5551988730cb398ace5bdcdfe2f419fc2a2a009744bd3435779604c752ee4b816bdfe99fef44e411ef6e16b7617ab7c4b94307ce57dc680f1818de017a6b8893981c54994efc3398c812bb2d73e7c89fd994076d0ac67ef2e23d20ac1b30b556c4687eec161e6cbf558f22d4dfbf72ecd985327cbca966935d2d0c13b4ff1407861d0a13051b12e9153e6bc7e51cd97e7bf51d3abe3858bfd05e054efbb086d1c618ce5ddde52bfbfa44bfdb0158d6146715f64e3af3dd9a5ac33b4f3749d752b19bcc04bd5763c4c9759251d07c2729e96dc5a87662b8766a4d0332993a1c192627bef2c8d3b6091a5b7177a15e6e898dffbc8e6f1509c828e21c67fe6be04401f981248d3cf79dddfb7fed96640bab53e2ae2932351ee567db0940833d9b981a6b32bffe8dc8e8da3bdf7b0bc58ff5cf03fe4df9de57af68b445fdaf2020f4f8d5af55916290798ad05ccbd80e8dafedea6720f3f6376b433659d4868e1f02f380538b1f93d2e4fedc26def1d37a4faf30377d33fe54e4119f0f07017c3b72ed43a2c49113a82c6893b43d5ca810e567c6a802159993ec5b1eee13261f47ade8f2eb24362f6c2fead6f3a73c1b007b075456e48fe13a7d32750cadf7dd98b7508495e412f4d5d0a59f02201ef681a57f5dd4eb9ec5c7aa4da337fa8f84f902e78e0f747b176488ba006c55f02ab07f2cd5f2ca061310a3b7994a6ebbbbf9c12da8524a61192d6cc1671461f68417a180b805e0ec96a118fb9d3f6fe6f77c1ca7955415a3fba860e1560371f7c1e6bdd85cc4be222be115818471c31d2e4d8c7958497c13e8b104e3275692e53e43ec700ea2787ed9a212d44bbe8f6a97256dba36ce096c0fa674f8e2bce4a93a09c8810b22fd8f7dd7b98e755bdc5620deff7575837513ccdc9e2b5e3ff38173ba9d45561c156085ac8b7b6b2acfc05c226d4a88226fb7c009d664db484ff96f87bb31c5f75573b9ffb163aec76e77b0e0ce5aebd680e4d4f0c5178443898ce7bc566364b8e688e50bd524fc3d756555773bea6bc9ae8e5092ed6743385ee9d7604b59ba1d699c12ad79470740b6d3f237354b0e1ee456c0d89dfe6088887291baf7ceb605e0805430bd3949821448b778b9a0849c8760dddb93e5d6b32975a5baad417401d7e8885a560a87243132f2540c0cff4af51750b7293f200106028ee4a249d1c8665d0b439a458b466f418a6d992cd3dcaaa780f42becc162e697e9a0f62650347f900a55adeaedc0e1d9bb070e8a1a37c22cb2aceb4d3344a367fe8e4b960f9c252e555f7e2e8c3824e983b03681cd26aedde32f5b45448b963b5f08e931c7f148f6a51c310af127a844d153612125f8d9a7a0d260c9d3b3b5cb1981935609fe63f76f78313e851fcad523d35cffd9ac37129e508db6f13c4e2f7ab0b6944b4a24e4a97ae483a580981035a763dbe9bde4ee6515471cee5e558b59502086910735a79f2dd42fb2200a7a3031c34f9d707bb08aebf55fbaece5c262e8579ce136bc55913903b51de0b62a2340c47ee9ff34fbea2426647a3eb2c59b280e45fd29daae1cfd98a1933b2e784f1e75624310cb12520094195921ed22161b64613332e8b3b4918a8ab057d7a9cae22e16d730e130a9583b8d87f9d935a69512b50518db30a024e1be348de5276d67d95870538d64be02661aece938c4e5b32308f4953c36bd52ebdcb9c4e6423b9232739a7cc49ce33cf44d5abff8a35e3b406086fae4905a89b33617d0a09732cb404ea9b6a006c05d224c17101936818c7734464580464364bf8868ed04f28d9bc18787e294cdcb0b94a0752678b118547dfe2d58574331378997433d8edfb06025e3da31ec2907cd2343ae3964993817a4b8765b7135e6e3407701c69cbd29478714e1495e4dca83587665f67da5a85d9c93fd44d328e474aecae0dafcab1ae1bd9a18154ccfbd1f10debaaf4f6202e74e383cf7d99d29c1ffb23ac1923093cfdf0b9f6ffa779bbf3cbc79a1f58577e5b1c04b785baf919d1c46549dedccd61c511f7be690e4a242e9a830971235adcdc18a4774a0a2527de386c966265214107cbea9cd78ad95d769e964491f69ad15d5936b5b1c2485848ad6922634169659086dc0924bed73c9c3838d044505de71231d6ce1460efbdf0783495f40bbc76f00d1763691dc28e2cbf420bab9479ffaff262e5b731968e3212d976d3b20f44a60f6959c21bfb50466d3cedf33eeb7e01c7195c19049a530731a620f0aab642bc94db7e8f8e0de9ee07cf022ffd66c7d8dc740d9c1122cba9c83604420612b39353f9392a676ea687a00a6718dfa3cba9c5d8bc73c34c7d87a4438de26f502a828cc9a8a08d90ed34ebad1f9b630c66653af7649a4299b30c3401ec8730e55a98022b85e844a9166975198538b30d9c97014957f62b320f241cc0f132bdef1de0dc35f608687010c81d39329b11215b086ab0950411bf21334a5c118b2bc23f3b38c6d3d7a6e2db40bf70ec0ad685c2ffe1b24aee23068fd43fde7411c401e4c32db232122ec715d04143f5ae014bfd42f5807445467beddd409db997fbacbbde06d5acb3c6dd36e7dcc368befca44a4a34f7f0424017f76e946c8cebb95908c3964ff502e4df1b119b42ad0edffc0985cb547043485a14f1577f22737180d92b4d696046e1a989ee17080b0c0b69f9057ae8e64de30c5957eb01399c42d7858cc3dfd4b98e7bdfa181afb0ba8e822d78214abf647899f50b4edfa079c0f2d248190396887de5d74d980512b3641e51f9a9028644fd802ffa60d642b5aaaca3944e43146cca0659cbfa61ad6b3688e60cd25cf1a3dcbd76e4d4341affe448d08d5ba5618ebc02e89efe01204f42f8bd9b300ba709f2a2d1c93c8d6e5af8f3543dd53d59ed22e85cb02c1e3afa1869497f40d02077601ecb0178602a828fb940a52b34de0acc1abeafa9223bb17526974956321f34bb74517174bd160d108ff7c7c463500320bb256103a044911bd4982fd8a01634601770f5053093ec8a77ea3ff1a7802784d4e5749a12e79640b34e73c07cf6805ba436b708c59eee3f2da24fc5676301906003dc23f9cc564b880cd009a1b931cf8e31232da0f122f8d5e89dd30bcb5386f229637958d9b09f104e52ad5047a49ff563fa576187ac9618551f4543c759a072bacf8bcf9a94871d7dab462ca2047837383d99a9083daf7f7a02c4d1197cdb9d4e8f2e8c54befac8f20efdb70da1706f9f6c889edc94ffe18a8f9f8f705aa0f77045a414eb8948768f87148ad070a4f53261697f3700b6fe30632124491a8062cdfc38b0324db23383a5a2518c01d6532f9ae2f58f786baba8aadbedeac97ea42642475a9296ffd404ecf911ce957417cd31b64e638aea933df89bdad5e582735f1399ee33e7e93ba7aaf0baf89bc239a87ffbcc3ed0043248510dec34114ed5074027ef8d62cd604b819efa1a436ad9e714e45fb500f8742b8a37982e440dd35dda01e89780890e35cedb1a38df9d4dc088022d4714f3e6e787a2ee131e8bd9ceb31f7b9ee152df4782b3b23eb5cb6de3b4102310d919eb2cd685665d12ebd4b14ec71a58d6605dcab1d41ed056f69eee7d9b063dccef5b0c6acfdbe0bdc7c7fb407fdf0a424f8737a0f2a3abd15b9dbed3934adaa618f4ea77b7ea8bba645a4da79ee94035d9be212b63dd52596b01d056fa5bdf77f8c694f3a2ee9b9667b2491b8165adb3ecb05688753c835f9966be8463a5e9c9d618f077702f79d76ed05bf75e7e5fea7d3b037aeafb9ede56dec3fcb6dbdbe2bb5bf6b129352fd604a689996ea7e924d37198aca58956de18c93a031ffec1b036bfddd5fa9e69e6736c1ad8a3297d2fd692a9a6f46269a2f1d27efdfd4dfbb2f399d45d8e3878c6b684375924e1c9294fad609d38e48a3668cc6c4b90a0054d6cc173290b1a6ba8874b5fd9b7a9121a1474b5885ba1b4b0f33e4e4d2ca29d677039f81d7bd2080478e1c6be361e4478964bca389c364226d6c4f4209b6d1213a5ae79fa3466d72e838049ed3aba3008cd0d88ed16b416ef8d7260c455961737bbabe830cec50968535c4eec7a8a592517bf57179e17c1ca6fd317eb29e346a6786ca346b8e2f71c1eb1dea7647f63a254b4b283d37e072879a2ce4e3de17f5240fea7bd00a836796ca7cb05609b3513d41f526856f4eeb14a01739b76a07cc6ebf4629b3d41527238adbf0069e138edbb7af185daf0c5647bfa3ea7ee985705553726237bf3560694f5e53503f9745d1c1b90652934ab07eec69d23f1c59d268643f46b7088a68e89f1bd4721ac732060e2fc3950453d8839a10e8148451ec487fbf744b6d77f4fd0f74ed333917aa964bce2c4ec538a01014cf85caf35c9f35d2d77e332d73665e28e9ef8e7eb268717946083354e680ad166c9d7d79fd04dd8b89c40f9e54a69f16ed5f090933552e5eb95e3b820cc90a3833115ec3a6741f281e628d683969b5dc17a469acc897caa853f1cc42bca40560b7718169e5b974916bee4731f7c9950a4e97894445e709508d81eba29892df494749d2fb548088f9d21c7ab6520d7a229a3ec0ffe97a6b18da942a67c410d1e1898f7418a7ada91e2b84f3f9b84861377e25952e2bdba950e063decdfca2f8c6f6d02c367c1fe60ef688b96fd26d28775147d99c8e3c9ad3f370ffd39627f77fd78a3cc1b06c0b380cf57f95abf74832572edbbfe5ed8fee55feae64156031d7690f8d14b23918949f73987bec1574c1d4b79b89fa89d7f78fedd7e87efef3ff0b93d0a1cb4f0fe1e7eba9ee972bd1dd7e5a8af71f1fedea078203f1bea20c68ee6ae4628873dc8af84c9cd7428dbd5e1fe4bd61381f9ecf48cc18e558421f8cf1934bfc91dbbfc043c4f8da78c018f7cffd60c7be140e7b30beb63404c7a766df31d79c1d7555236dc7e9827fde4204b022f93e2efedbfbb74c7280c909b36b7cd4e31e7b29210257ebf11ab8ec66caccb8fba990ebaad73a500ae6199cd972a46302c63df8e5b3d376f6b515afbf9c3ffa3f88bfd3473d7e1299180bdd75a6cf07902f8e0d964b6c7707f06f2e09d1abce751a17f55007262e4f9c3fd17e7d0cf376a3b9560d22fd3820dfb27fdd4afdf33d3a797e6ffb116cb7437ead9611325a67be99395290a164efa02102de0998e09ed8114b6456974eef01d151c8ad3ead0f3bd61fcd7ef5ded98b21b8dc6b07c4d2fd81ce42dd2635322eb95c97731c3107a75c852f0be548cef94ca6aa7f805d5e26b1cfe9e06e969a98c8a7c103717b1f76c89cdc446ac3a3d555ff5144a90ac07beb3ffc0acf9ac40131db2a0fb22fbb226ea9fe9973f6efa1f1df962dd9ea9573e6854057e59db0c636e03647027ee459e5b4c473a44eb21802f0f99db5940f7b11e29c13719aaffb71d56a21c25bede3b3150300a1cb31b75dc74037dfed25b55860a0cf69164c3f81bb3adeed314fd0825cafca485959eeafd861fbaefb5b38d2349991fe1dfdd0d619e76cc891f8055af15a4e7592146b835ae5d55a18c6e1d70fe2d6c5fbec7fdc9f4916e3245de483d404bb31b93885cbc932fda6a7b147960f2db31186b03050216e28620d62342f055fd8318353b941c646020a539f956253d3f5e6618d63cbb1993e0bdd8843e0af625efec1a5518cd4fe46edc0fab087be59ebd1fc6898faaab336bcebf689c6c94ef517ae53ff9e0bb2250aa8e29e40297f74df489efec7fe53dbd5904df8e49820b20a52734cd7dabef659d84a49fa4edcc3e0c0e99da357230f49d8dc86d16ecf3650e2ceef80a6a328aed92057da19f142f3e802e202e85aa59e001c1df8f1b7e71a0faad41984feca967dcbe13fe75c85d9169d867df7fdc3710e39d46e33e5a2a9b5807bcbfafe9da654c7c07ddcd1b2e99d30e87bad3085c660f1679f139fd54a98f16b93f670cfe05a93165f4c33d04b1fd6b6165651226a8de8617e60195f34157f45e02fdc4916e219f3ed486d41d9c685483fcf94ad70e7d15697180e854263274013741999b002e5d3b1b1f38d2029a23b0d1246dcb3205560cdc35dc471ff4bbc91213a9a528d32b85795a7568ea32fb6541910b035f4c03b88dcfe2dbe8d003a90816da2ee94db1b29820a484f13157e37985431f532aeed8cb8132e964c2ad33fcc5af3b0f1d68343471271d6183176ce7e6a074287a7dc8e0a64fd3e4d2935405a883463e535e190280197ff5f01935b34db10c0c423658d85fc97e2a1041d864ca1dbf3e638ffae70873ad72e1e1a48219d93cf4c172927583fb02756c56154b1710110b85cd95be2a030a27285c4b066cb6fb6496dca6955d147e840508872ae3a9d0f467d074270e3b4f12f505e05d77c0ad1104e06e57343c139c15856142fcf9fe31d438ae0d181e58ecd2413a504f43901faefc561175fc3f6e5aa159e5b8a75da720a08166730f102c23853c63084d25824385088cd087af4195333ae481bb8089091a4f54e3b0a1bba8f2026cd0048a6ac42e8a02c20b1f3a70d072ba3242bd4bcf545e960dd80e84615ab746f6fd0c9a0061326f5159ae70fc3fff59a1611611aeee26cc923b9f3b9f31d6f640178f7754207bd80755c9b12d2cfdb503d7d5e9dd20c41db98ba449010220f8fafba768b356b9e3a30ee948dad3dd867828d807e3b4d6ad8707c399027ac9857870dba5c32f12606c326051c3f8e0d30f9480f184ffc0d25027064c114ba86299b42476bc72d369d49a4f93fdb901382708d28e3375490ef53acc041abfff20ea1083e3d43bd5a0966dee3c2c6eb9256bc4d89fe8c532b6a5ca1bf18d8265b4607b470b28678957aae30f69ac3ae46fd7316933d97cba25731eb47da94990a09196e0d42ba2f2cebed25bab112c6a5100f194b08a72c0e8a87980c879f940d32cd2a2256d6b96346de218c4059a0fbda8820c2fe7366060d4d7283db8828bff68428265ff2ee1e0094a65b70badf9f448bd53ee401232932e1c0d180800eac96b4f6bcc955ee15188e421f16ae34d1c90776ffb183a8657965ab0a9374547f08bc8e2ac17f353878b8f7598fe2e415ec66c1c18751f90e43db2409c0ded7b5c7b2fe9ba988e37d53d50a4b97a2c847f203a94226f2be0086a512d5d0ce246c14adbe60ff03f9905778a671bd0dd81db51450d88078a833fdb9a22e7eccb86c2d4e8dbbfe693a251b9713ca4cdbf8b959b7380c6187c20a4ae9c63fde6de94554632b1a8958c1e45e04bcb19e0c2592e5a5a2356dcc8705ee15a1d8b97013020ad595b5014f8848bffa1b739d28d58c096c33fdcf916b199dcc00df54e1eb5efa735f8e143b7956956d683e4319a893eeb914a260a63ab2edc0aa0e7e37f5440c65a45443407dfb96b1fa388b26537b7050cdf90f3553055ac6931117c9b8cbca192a6035025d371eede5fc67fcfbb71c8376e331e69bee0291643cdb1cb3433650c24de9b3c193de0d433d121dea10fa7f682cb2127ab8fd430a52a1633075c7c71072a65183e15d1d042cd110b923303d00a7ea1ef48ea57f074299767044dfeb46876e6e4dd5cd8be05fca800f5ba50845fb1ad8bb81eb8f56717457d851571cb483cf27c5ea398324163dff6e1385d4a4664b5c57a2f7f0b7abd3a8a1d0d6371f2f9e9c46fcc70f3b3702780be05d6bc88d1a482e5b63ffb19541dd0bf7572d41f3eaaa1a560cb0732f01b95644cebeaef781bb09ee06771ca85cfdcbef46167b6fb9a744c4ecda594de7edc75849b4f4ece28182a8ebfe7d1b8eb1f0cbffd63db914b243bb73c2167bcc02d138f455d33b90b3ff82de10dd00138b596dd250c749277888d5f1d4ca1cd6ff7e6f4663268f2bc8220627a427bac71f4f8b58ffa758fafd40eca4f922c16e2ab5bfc68c9431fe529df1f13cc320721d143997e2a3238fcbce841a96ccd8516221700c6bd6c08899f7c1146d4455cfe9b106a50a1beeb5bd58c65c0ccd4849021c84edc1ca45aac687efbb06c921e2cd80c52528b900a1b3848c26dbaec77884848918833daae18f42030d8437dd69dbd7f4f8cc750bacb3135a849130730b281b4d469adf6539508dea9489b0b624c056243f8e8ebe524fb20331bf4c9429804311757c1c3cb1358012ef0e3fca71826039adc89502c125c045d1efbddcff0e1aeb70d58dcb5d36bff483d2ed251789c9148956fac22fd259db1a37f782a21c8e1d3948f538dcb088c6242156d28872592b4b8ed11dee2dde2d91a03ac0570c4ffa2d327d49c25fa87c739d2dc7dda74576337730ce89d7aa48deee2f4048160edf1d3c5f308b5618a0c459a18d7f67c2c6797e5c4c2ab97d432c02a31ee68eb3fa94acd9e3046cf1b35ad3e65aba0260f976a2a99dceb8a7c529e3769b8d800b01b81b0cfa87f26f7df0ca1ffb08c8b0b04284d6fa9ed198091b38799987e85ac842bb4bc8709cba1a56c8eec8086c0fe74880375e6e0f48c52bd2794ad59cc5caf6304e75831c703211f6796e27a53442d835d0c1094ca23c44115362bde67bfeda11dab1b78f06192a89ea1446fbb899267978377c0794833bca7940fb97f2bb0de04ebdf7b57cf099237de80337029a378ea8f53ea498069f05d49b4ae40f2b70ac61eeba7bc28c705718382c281b4d924cf5a49077222f77d2ff79c2ac0c2eaa2df999b718300c98101ea4924f131c21d33f0f8cb2702008de10a3496908973bb380d7c90eeb63f05ea5594145f64a980c0ef270c2ed768f9385c84a3b2b340788cb6f75025f71f8b0d6a9b07386db9f3535b2238a66a72f63c46a53a045ca21190206ddf287b9c9f32c799f0203f58cc5f19f3fc1ce6ebdc246adcdd7118f32d259bc49541f7acfe98487766cc3d4f514e8fd324c3581ef465be5931a1a84811a629fbe2d7d99b4709e533070f8537245f5ec2c9de5088fa954bfbc0966adee293cdc9b803266d2a9a66d162896ca87b49b08c7a2eaae3d03cd49590a84ca88d83d3fca776176d9804b461b2c8b692f052a005edb28abec63a998b7fe9b86b82a9676789844a511fac8cc5948aba2ae8345bd6ba0aa781b3b4cc306be21eaae36b5c0e0055f115a927480122af82bd2888875a2762e2b61430808afa4e29a1cb9e805cb50e859048f4bd90f3e1242618cc063b3df026ae4b195710d79926f3cc928e475c505676fa760364fc155652b0ef9b8f541594156a3cc696e1accc9c161ed06d414aeb1e0d85797179adf37445375a6892f7ba09410ddb1d8f215eddee0ca2e4e60b2b7b09780ddd0b2c48879f54fecd502f088faec78f2fa03498f89e1cd6097dd8783d90f0ad245a0633f2fbb7112fb7ab600327dcec6a39c039069bb6606d9912bef2eb1782c48243f889281bd1ba13b7cddf8eb5cfae12b4917329677a96b3d640ed13413e2d85649fcbf20a706b3ead7dd36405c4b253b0f39b5ea886e379fa6b224077c3a4c86036faa2fddca44d9f78c6d021fab8e901115cf4460417adfc530d0ae67d31616a518c784b0b539a5560723f279dbfa85421d63285075fbfe28dbafd902335c2b3360f7e3404b644cfe98876fa42faa987a156fb697e893762207afe57addcd31237cab4a0feec6e91a250a859e96c38101e59413945e47fb4f0e861d03ba9bbef99e5f982305f188fc49c73275a40fdebd545105f16021a060e579c09402bbc0b98c99ee231d9b244958230d1c2a696446ad2c1423c023a802355574ecdab29bd01e6b825fac60d9d782cd8acb147067dcc2280d360be0b838e65de45e5ae603c0683f55f8666c74ba86190f571541f1f2de0ff1bbdd7afed6de431b34f70e73595042e0bc4c9dd2cf654e006e53d91c4f84b327ca85bfef8bbe87af6c9f75982ad81dacd8449766469139467d8a0ff21daf0a3bc8aed610e7c5b81f0d9d6379f66059fcf7bd995fcead7b722508ba5a48553f04f78f17b214e81c40c16ebcd96e2085c8028ff48a873f127f52b9e036526338f465978b7b2190d861ed631b5597e7e35e038c1b1dcb35d6545dc5c3b5b36babe2ad3e481852304f95c62320a889a326d052377c5e0668da696b8ee11f75344d554524bd3a772c4afd57b78c59315f7f3b2644498eed9634b845385274d7c1b8a3c974f1fe6ba1e56c79c2237d810a2021d13c58c6ccc0b210835a19cd5306d2394fcb1f800c0790be4e5580454abaa698107c0b43989a9b54ded15473e595dd17fd0fbdcc44214e6972c47c86235805c091a60cafbe010f267056cab90e25c0394151a633424f90715d2789c8604e9b97e2b4cc5b2c34497119000f4b8d500cb4e74e9c2ba49e26125db8af50ece0670d5f77f178aa1e25d249bca6dcbe7f1bb875d93dd696ba1f1ed86f453a4b99ac4d11738db32aeb03ec9065dc7ad285a9ceeb4c347ca78f7b825ffed78e70ceaa885ed618a6b3eaea6e398011b3ea7abf54132f292581f4f953413065f0b719bdf3e4d398db51213333a0d7a5cf0e2cbb19258a08e307e0857a20371126d45c609e1c24032c146d61eb8f1951f07025049766c37975f702633179c962c7b6463ae2bc8f14fe7b86e8c10d7c029d0a7e97b88e8c1b9a3c93dae2ec4b416b032c56735fbe5e6e4b6a6a3c37cd633267b7208924a65679e1d2eba7519386b14b2650a8d7efda4ff92411b7c26b869805be9cdd344e5c4d901a652c8da39d2f160f4b9e7e5a33e16a439d36d9a7018e400c48a6bcdbc0d91098ec9c5fc1ebc87279a07fb298fd8ec1d1cb5f7c1f6be1187896fb4808b2da6d8266d5f011d2537605969fea54f322ad407855d9f00efbf0795891ff305487573083c6bd7cc743f73496e92806d608ada1bcd3a70e943c9f0bece9cce3914e91c8e24a9a7391f08c6de198f5de42cd0e2f37fee455bdfeb784462121eccc192b971ac5fca7a170cf2274d5b37c58308ae54fb9807cb973711291848f41840d595e915a585bb5a125171943eaaaa8e2bb4c51b66e03a92b8ebda6043f301d081ff1c709f2cfb7274af7a7d5784cb98e4632ad771ab696bf980798fbf0c1df8d7b8a37022e24772f550f6ae4f1e1020307c90964ee607132bab80e73c3acaf1654c8f110f30776ce2a87ae18c999d814a5e94b9507892d77be258b18a4529c9eb1c6f563a5d53cecd1354f62841b5c6012445e3c40452da2d05fa6fb94d269b02a4e7ddad6494d3984f68bc13c2c802ba238ac54369aae5737b10264ae862049888c8eb76d4d8c1ab80bc3e54e9b0a37da856e8d36311b1ba067eae87ffb3d4e4789dc3d27399798786390379f2bfe14e38fa0c6963dc4509f9420b8a99aefbc2337ba1f715e99b5816fe912d5e6ff13d9567e10085630619ae62b3b548be62c65ea097fd33a1b7bf14b8949c7116209af9e4cca3ab4abd11054ac83ad805fe507858824ea887d59de10242806f4bf3b9e724989fb75401152e99fb50f91001b89ca87af60b0d9ac088acf5270f7be6ca086a0ba4e98de156a8fb2878662a9a40a08ac851b829b0930f848c563a77d5e7ab0ef58aa2abc3d014977a8a2a7a5991c083619032ac8e41358d1ab3a03dc8f3c2b2a575ba4cafcc632cf7eb54f93483234f261370a2ee67a38493c55e7d241ef1571a558307e0659ff42a59f21254484dc3a547c2c5d8f43225080900a1563bdccbdf99c099cbf928622f0f7893bb245674a2c9978d51df792c9c56034ba5fa6d7ccf9cf5ba64ebeb767e2ae84a0ca144b64415b775534d6bc510b1af46b835c0bcd7adc3a7714f28befd5f53ff5938f4e87ebee91300dda1247d1bfd56abea1d79d273ce7d3ea3e9bcf89db5d4c6b8439eb20c1b30db43521a806295b838fdebe20443dbbc9dd9e25dd49f9342f6d34403f187e17b171bd3637b562369c5426c637e0c33c0a814c574d1c071a1b0429b26070ccf6832d059b2cbf46b62907e76dc70243b8ed63bc8fe753c6b4e7e5bfcafe3e00f331aba3301f362fb43f7cd5ff29bc8cf11feff9c75b28284f6fe7143270865fe5f441f39f390c1056790e23f8b40bf7dba5151fdefe4fdfb5d2900795e2a0005ba9a0bb46d2010e4f81f377971baf82b16d931bad40b8a3ad99905298b950e7c3802ded444020c3870b0a490033ccff33ccff33ccff33ccff3075c587fea72d19656ca4a6261faf593fd0e704b9232379548b236c08d8b098d8b09d3972d3310e30ce50b840b56c4ced9905383563acaa916d2d5d0a271581c66d060fb18c222554796979ec1d61973d2995cd6399a1932d822dd6ad2499bb8a88a0e64c462958f9f3aec6853579e58da05444023c61664c062f399b8d2c97453da101a0564bc624f29fee772e6ca18cba20310c8c2b0172a3086012d7807e3046f829ae10519aed8a252ac47913926ed5ab1e59834ed141e48ca415dc860c5a6beb3e33717cac25bc59afe34ddec6aaa5842ef635c1fddf8c871b50019a9d83b880bb5eb95c3778ea062f5b0aa73d8d1539c0f3cc56ae1736d48b5b9d731c5b6295ae5f20f779dfd165f6cb1829245072000c6165f6cf101e7e2b778000d1a1b1bbeb1f10ed8d878a7b1b1610819a558825c4a8cd30f632c470d2d522c1d8731cfe7d15648750d2d16b017641890318ad5fa3376a0392a4dec6a681d550d90218af572f8612e7f55b4bc3860160119a1d8e77cc3c7fff15d0eec810c506c1a340766ddd93b1de78e20e3139b877239ec0e3c323e875d408627b6ff4c2fabf8943cfc111009d08040b9800868bc404627f60fd73ceb2e539c4ebda011060dcba20310c86263a3647062cb54113f67b8c9692b8746090c7ba145072ab0b1f105cad8c4963b8813b3bb336c87161b5b9c1374918516591c2ac8a20315c862636363238b0c54208b136cc160b4a0039607199ad826061529cdf8b8ef4a02bf822dc0e011fc05c2d8d808c36c6c6c6cfc3fa006185b80800b7e07c8a0848c4cec398cb739b00f726efa606249b1efca3a695ef9ff127bffccac7d771cfff896d893cf48494695b0e257628bf1551b3d547e98734aacfb41e4c98971bd2766124bc69c94743a3696c448624b1e3e4f4ce1482c132deb3cc5e4ea0e48ec31c67cdcb5cd51acfd885592a69dad3849634871c46a39a4f50ed629a6b111ab64c79a8c29adc384116b684e6329be26b53a16b1c5bb4b177efea2ea8ad8729a8b148de1819c9a88f567ede3b9e8351511b179ce0b2b89793f4477886d26a6d0933d7fdb1b62d1adf00e62ed37e2855833cf6808d1443fbe106289257a9b42981f0d0e62d1f538c5949b26324404b106e9493a395ed1e20ac41a26ce6388213dc60f886d7388a293497ef2fc873df4735314c937e6e1873dfc3cb9f24a67e58d687c816554e005181c78176cc1011064d1810a64b1b1d1872dbb82a4cc95d24e493eac31f6e7559884b48fdec36a162da64c5ac7987232f4a0cc7cf01bc3e6a8d4d0fa15600a64e461d3b9f9fceb49f9f18987c55388790821bce3e8bbc31e241f0b511e759c18a37132906187358d47294347fe61975d87bdeeee629a909993a7055d346063c3bf055df4a174d8b253cccd2be1c33c129c818c39ece97e35ba3444c9a1c140861cb6ab0f45244db01c3690118745fe329a8547d9a8b6d640061c961c743effa41c94aaf9863d08b9a2a5679711ae7203196ed87238993e081d52c89503e39ca00dfb7994995c1f7d2da66c58d24847313aedec43cb1a968f1c49deeaa4bb7cf902055b80a1862de4fc89b61ea605ef48c3be3165c6e039871e3c1e0d4bfe699ac44c23e7316758546726a495efebf530039e347354ea2857863d4f9218e3c5b0b12c3d821590618fe387e5e139df6ce4bc18c37e579f1a21255a7aa018565f8b5211a29fd6c961582f72d00df6f3bb7277e12af8020cab6e3ebf9598a751f117d6d03c3a967298463cc70b5be690537f8ee8e5bbbab05ede49eff5ee6e76850632b8b0f455460b1b4efa73740b7b4871c9f46ae352b0c338ff5ad82246ce27e7418e7c35a4c4404616568db531b2835029c3ca16c8c0c2329d33c7d7b1f6fc235758c26cc3bae320d6b735b78121c30aebee87e1e5f9562c5678b0404615d60e21764c1fe6cca6ed50810c2a1c233bb1b73d5df11a5a5c70c134364827644c21e9745379a2e54b6a17beb1b1b111460bba3834dc7963630bf6a203462406276448e10b676736fda1ae840bb3b161822ebc381b1b59740002599062424614d60b1f4374e690c1d36c0228283b5615217ed033a9a125e309fbe82611bd8fd34a432bc829c870c29a325d57f254edac14636fc21e6573a8172f752816a1146430610d3a1e77f81f732ed6d2c2ec093296b058844fbaa92745532802194ad8c30a317dc40fc334fa357463638306958c24d89924a50eb1f279f548d83fbe9fd4a92f889a59740002596c6c6c41c6110e46eac2c5bc5539cc6184b6abafeeeee33cdf15e1bda86adff93745d9889087333977f0aab27055411626d8a2c6171b2bc8a2550559d07d216308a4da0df669d3724605260043051638c10350033284701ca8584831b554adb3ba932753bfce1395ce1a5a5c70c1e64ef0009b808c202ce9d294de6e0731853c10f69c93372366a694d1b1f1beb1f1eec57f21e3077b0c977e2bd557529e6b6821f960d54f134bc503bf18ad8a5c4004343820a3074ba58ac182478d925385077b58f16c4643da4b13c204193b582ebb2f876afd397e580d2d521090a1832d43757c3ae239444dd6d0ca0b888046183272b0e56439ea09a21f73fc0bab07c8c0c1fe3b9d1aec428741c237d823ec5ece1dc38e66e7c573c1056ba14a906183ad3ec8fe3c9a832439c401b9326ab065aa84ebdb7c1b7fd7502e588b77008d2a499041833d265907296f53433d70020c58f9095440e3045d902a249031032b570e42ae8a1891a48360f9692c6ce423e65040e3c80b8880060364c860f31075757d1fd86a9f822fee01c68018b138ac1c248dec2caff048b3eb9c7350c173a75815164b57cc5af43ca3513f5d80915d74a05eb16a88b17b27452a48b086969ba00b2f1ee08a354e730e2d0791f2a64c0d2d0e386063638386d9020c146cc10517cf808d8d3fc116e770a927c468c51e86cd3d493c77473ad5d0a3b8680e838bb3b191682560c59612a1fbbd371f42aca1951e88b18a45ffc3f0691b62be531b88a18a3d9e4b394cbe1177d28517ef82a352b1c79186aed4b1f1fc5db04509410c542c9dd6b76ed5427fbc7601c6718afdc3a3cdfd2879ee34d6d032adb41650d1a8a24ab4129c29964a92623cfcfc99289762d1bda06a218deec71c2996f39dbc52efb0a0eb28d60b531be7e436dc8488628f32e27394a2058b7d8762cb31e53049af65c8bc417156881c49c741c79b3af418f61b29b9f9c46ab5a91afd2964520b7a62d3f548c26f4fec40939d582c25f64f5dd08f751321062796906ead3b3e8f241f2d85189b5824c761b14364948a1ea81710018d1a3134b1544a7a381dc7840f63070d000021462696f45b1defcf47569dd66840314c6c962e878dfd610ea22235b48e2facd22ea107212c47392af1e8ce8e6a325afaf3146e6c6c6c145c410c4baca615fc2a52ffe62c2bb187319de7c7a51f771029b1a7b9bfa4162d247e0e1ec498c4922b985a9ce8c172a60da551561710018d3062486229998e1d43ac143cd348ec39d88455f46831a71b1b55880189fd62288bb241a36e66591eb1aa64c855bfb52356ef0e1e4a0e723ac4d888357cc794fc2359cba9691423d6ab8c5979922745fb8d8d0d2a1a65bed8c2049764115b94475c88f49145cf5e7c185c012e58063114b1fa6d34fd7072aea5aa86168dac00031a80810a4020c168c16725620b99a7b21e6ed548bc86d6550b96011c708016bbb1c15fb8f98d0d17c440c4767b9bc92c2f77cb43ac1a62e78831deca67fc5e5c161d80c0c68621ee3c39132baba135822d9a86f37b410a0c15a0a0aa0aa17875d09837ad3f9415831044951c551d88e4c82c7a14c263adcce3e820c7488c41ac99d3c4a01bcb0b34512418c410c41ebe31678e4e739080f123b8f213a8e0d040942a3e4634a7fcf2be8801082dc494d2ca91152b695785e41347c38cc9fd35b45af035ec8b07238c2e61b0175e70fd61ef288efc85af1c56de7ed84a4746720e2965e74e1fd6b9cc91e4ea1021cce3c31225767668a3ab9da93d1c5d9125292a45cb410aa1fcf39d54fc20d54a8a1ef65cb3131f86c89996cec31e54768ca91dada11da840165f68a10362e0618f2fa28d65a87cd2cb917758b6b352559e4a1f9a6e650931ecb0acfdde6d0e1f848ef038428c3aecf721379643ff4d95e30be6428b82841874d84b3bbcb41e6a6e435843ab8b73822fc2e00c6c6c6c6c1c34ea207358632c7d5ef950dee921073c4a3da295657a45a98c58525a6779db9faea165fe0be20518288811873daa491d57b5738e3bb086160db41870583c4c7a986737e3e7680d2d2a30bce8e28b8bf186bd438e1091524373d80a8d32420c37ac97bda59b133bc6dcd5d0ca54408c362c1e635fb0cb88981ca5810236815618c71181186cd8d4364f4e480d793de58b0c030ca3428c356c71b1f1ae329d7c34d16263030cc32830c1f920861ad6a861a3a5aa94922497863d90de0ab7112a31a4c08881863554a74b791d3d6a2f67d843911a0d91dba81ccdb0a79841756312f5545e19f678744e33c4aa910e42863df376a8e8b9eaa873d1c57940165a6421812f780c7b4a9d434c9d2247b58c2117628861353959f5a8316c0c3e6218f678525ecc0de9347c02c3ba75923997979fc38e1a5aef822dbe40c42f6c71b3d2e5791c63b2e07d218617b64bcd93fbaf2b67d2028695e90c61f3f08f267d18afe385b0044f661a7228b709c2e21fa92b6e5cff68202c29c35fb288f0887fb08c7d5f7520399264f1c13265c973e0717cc47bb06deace93543a9de4c11eeee7ad8869d4c21dac3174759c988b613b74b0a4df92281256a6cfc176e93ec9d8eee7701cac71eb2f0409fd39f8067b1c93fe858f3c73da604b5bf3a9c21aacb6e9514a3115000df628720e7c6f7208970a60066bd88f9dc388172da40290c196f9b17969e1ab93b1d8f2d3afe7982c633a61b166771c04b50c4d39f215fb9ec54eda615c1bd3156b12cd290796d3e7a615db7787f319c1f35756ac9e3b48295ad4b2e82af6bc23779f93a61e5115fb8a781cd45a0ebac354aca6739773a6e41c43542c39e64f657d7a39c353ec13bad3fd7c7469a129d6e8514c0ffebbbac2522cf1a173a5c7f1510849b156dabf1c85b417241cc51edf6c74a6f8a9ce89624dc127573507f1ff0bc5e6f11dc7fe0f149b864c12f77996d6fbc49224e23f87fe94c3f3c47e59e9243e3783759d58826ff82ed5b5fa0927160f3c0eb39064c3866c62fbef980a5172770ea289d5642c8ae50f373b928952d02bb1df60620fb72fe494e33877d82eb154f2f111eb78955296d837fb637c107ea95389d5ba46d5d4a3f8a1c47ab73992ef3887cd24d6f2384e3fb1267348624b1de79062cab0dd4762dd90b41b2964ea0c24f689ac4ba3361b1f8fd8a34712d38f52482951001cb146cf0e3b82f9464a148046acf3f9242ac69d98ef67c4aa632145a74c2197862c62d18849836c5dfe146314b1e59ca49f0cb9fa2025117b7fa89cc7bc937c1e446cf7933bfb47f363ed432c1deae41c079e31784a1962ff3c9e16c298ce8e54883d267f1caf14422c95d6235fbdcca12783d8b6243387c7313d4c58106b8e3e9830ba59f7310bc41222e5f906cd3929c98058c29fa69c7f1c570aed0feb454dd5132e7368a97e5825d46e57cc385df3f76159932aafdd54f93df1614b79222e04154949f43d2c55a5b221412452ece861fb520fceef574e7f938735ada7762eb9f1b0d6a7f987e97f7373f20e7bcc39b20efff0a3492176d8ca2a468e87be77dda9c3561f837c10f23fed25e9b058c81d733bf2f0c363e6b06974d821766a318f2487255d944ed3b0cf31b6382c2299ca3ff23b6c32e1b08777fb31c37cbc61915d0f62ea3b86a4d20d5b4eeb133fb95307a9a30d4b8ad6c5c5fc1b7c736c58252c75a5a762d84cad6189d6d921e538898b9f1a16cb91e7fe4df30cb2a661159f9c831c674a2311a361cd599f8ea3becfb0c75ee7e7e667a7d29861cf316c63ff9e4d879561bd90381f7f98e283f29061a9081e794a4ea5fa286358a4ffbfe42215c352a31d276de608c3f63d9f1baa9bd14702c39e32de878dc9a915d22facc93e3aca8e83a8c1e3bcb0dd7da648b25c17961ccb77eee31cbd3d17d698ce8359ec8e5fdcb6b069cc787134a2d33c5ad8d4d46b2b86f2783e3a0b4b46b98f83d03b3db982852d474989f4b9720899414300ae60dc54eb51b2aa12026085553a05ef1c8b1d449aaab0a5598f367e34bb39c454d82ef573500b95c3cd0784004c6151b59c9b3c7d1cc4cf48c189cba147ca618836210051583ce53b86c71bc2a50785253b25dbdc53f2ff619eb0cf78549fc71b75b9e384bdbf6cd2ed87b595af262c97f9f2e59c93c6eb98b04d54909b14e92062be84bd2ac5e50e7732392a95b0669e6a8ee7f4e1264d12f69d88b9ef74425cf848d8e3099f2571f39dc3e6087bd9a5f114997a734a23ec71949cae8ec395c65884cd2c8c7da55413538e26c2661b2e5c49490e34e686b06c8a521f664c9d839c14c21a1ef93b1ff2e5b07410b60c7142a75348588480b06ca9849ab999d5cdfc60390f3aba98dc49c4441f6c61de517fc78f7c3cd7834da272c5f138e5cf31e4c1be29436e5fa5b3b17f074b8c1d2366e4fdb023d3c19223a9e80d71277874e46049d539b4b59895907e1cecfdd174a6e6e5af8cde60e968a9a2d49c767e6c833d074142d53b844c07d660eb8d213e543d35d446832554e794425f77b28bce60c9792175e21f0190c11e5fdc4ce48df10e73b158ee638e3e2763729c2b58ac96d3df56e649e3e17cc51ea7b9cd88f0e3f7f1aed8230f3db7ab726d6fa4159b2435d5be3809b989154bde64951f7c0e9f0f5fc55a29d5677e17edd656c5a6a1bc43cbfcee0a3952b1d44cb48f7296ec4311154b07a633bef3e7d1c729f6fda0246fba52fe20648a3df20dbd1e56588a2dc949469893ba498f148b68cc0e246974146bd45893e2c5d417e3248a25735e9a0e673da8868462ede90cab1ee60b9364502c72e94a3d4ebebd097e62fd49fea1527addb979620df2f1e94a6f98b03ab1450b29e6e7e4380ae939b157f66d273b6b135b4ff9df77af580ca526b6af1fcd191a3ab4af33b16788fcdd292626ab1a13aba97afef0d15ab4b12eb17d4a1371721c079553da128b9aa718c3eb3cb01c5389f5e2a7345568b218274a6c1d876847b2f3782a3389cd2a85df941efb8841492c731eaefc26ab53e448ec39c98fa8e54025d20989c573ac7ca8afc450cb2356c9197e526a7eb236472c9597ebbb237c8ec33462fb703bf7677964ec8f115bcc1cec2fc7d192982e62f11c7afccb941793472a62a9a861e3f1a40993f2895872437d1463bc781b3d22963a9d504da1394bff43acd9e7a1247edc6986583d4f4424d98764632136d5903f9f47c7de3c1162ef1f4fcbd1a9f1e90c62cd1f4e752ac908628dc9d383c58a54f85c20f62872e49dab26445c0c10cb4857fad9e690dba13fece147fbe3dd13e227e2873dcd46c49866ba36d48725d527ed5e58c424930ffb65d9871f9dc4f00dd9c376d96beba1a7111fd5c39a313d48162a23a725f3b08e752069dd49367e1c1ef64b391e46eadc68b9b9c3ba21122cacc3f19b143b2c15f346aaf83854f3e03aaca9a3341e52c4de34193aacf1fe4b93d4e7ef84cc619108b3f97cd2a38da11c56af48392325a5f612873d4c2622e67df64807873de8c50cd5986b2cec6f58cfc2c7c1f64277f0516e58432369f765a8885cdbb049fec872fa34dfd93936ac9f74d367373ceac6d7b045bd281933a4cd9185d5b0f8a6cefd0f213a888e346c796c47a4e36934a9a061498dff53e93ba958ce1936af1c77309e97b19d31c3ba127f2474bc53a9d4322c36b349c3ecf683ff9061eb1026a4f2645ac7e9312ce2b77142cf87313f8718b62415e14aefc62458615834356a74fc2972ce6160d8c394f9e3243950e9f8ce30e30bab5ceed168b515e3491e31c30b5b4869c45276f9a41052438bcce8c2f2613cac558da9a310ac7284195cd8b3fb226f6c6fafaa5284195b583aefa651ef9589dea185254dbcdcbd55bb9b2b539891853d860c7e151eb3ffe2ee30030b8befe855848aa77943801e665c613995b9f014bb397ab5b111012f4c60012f4c60024d44001f665861cdc1e4b02277cdfca6c907b6400103c238ff0dd0dbc18c2a2c1a3991a477f2d98735b4c83631830a6bafe7382254b2cd8cd5d02a59740002f5817302ac0b888006021e31630afb66cafefc6a58f5540dadaf0ac40c29ac3f1faee72f327fed35bee008245a0436366864a1851624017998118555735a9c1837e68c8d6a68e135620614f6f4407673709a7391d750621fd86836686d98f184cdc2e23cb47c2185e85143ab363650b0450938b0b1f1068c8d8d8d8d2fb4d0c2020cf0c0c68616591889c0c6c6c686d9223fe0c57361de378e1c000f339cb059fe18bd22f423a44d58a22358c71def050aec5f3083096b66ec9ccddeb50e15a08006b12fd2011b1b3396b06e8ee8bfd135ff20d6d8d8f8a2045d745143095bf8997016df396b2649d8d2964549d35b412b380309cb74f07c21694e52cb1c61a90ec346288f29acc5cc30c251a3ab83ecf310da8246958a604611968b396276909261340db313786063030a3388b0e5d0315a4127c6a358438f0b8880060b660c61b398eb420ea53aea8eaca1f51020216c5d5f362173ce133fbc86d6175bd0914009ccd7d0a2cc08c29a9283c97e858578110d307e045a603c04c80e660061cff1f27d248f901fecf185ac8a10692a871ee683d524464e2b1dd68c658830a307cb5d0c1bfd634c5f0f2a4bcce00175729f3a27cda87ff63063075b490e3cdd84ba1cb15d1161860e16092a9636efdc848f975d40043400408a193958d4334af3c6910ee7a9a1e559831938d8a6a3fae64826fcc18c1b1c6f871df653157b833620464b03dda68cfb8fb9382c12caa206ed0e0e7b478f32f947999247ee0d8bcdc6786e8585ddce0dcb95da54d04afdd9ae0dabe6302aab434955ecd8b098e5e0ff47a2450fbb352c33b9dd613ef04fedd4b0a64f4ab8bc1032679786353d08b14cc3e5f2ecd0b07d14d62443f64713bb33ec97e3a0bb3633c392cf235f4e41727c591956afd53ecb2d4d19322ce6f15ec79de183f418d6ea947294d5a53ec5b05a8a39e9e6e4dfb2c2b09ad68794ec73c6abc0b085bf532df9c0e72fac93a3945f211d73bc17d6f0793b67ffbafb2e6c1e76e3e7ef8db173610f25c9c432d7847b0bfb570eb51d77aa50d1c2f697fc43a7c741aa59d8a3eda4fd9ce2da840e0b5b4c0f97bfd7a517dd1596af8e76f1c236fd5658e62e5d87b5354f5761f5a94c915342f50715968eaca3d1907f933a85b55349ca1f953e0e8f14d62f338b517312ab4e14d620dae7398c17260c8555534c213787f661e59fb0c7b92274a4aea8f59db07f908ed01b8b96d384d5b6e3c7714eca719e095b081fa7e8355d3b2f61096b9219fb323b0e256c9ffbe3a5eae01f24097b8f460f6963d2b11c09ab877798c478e12a3fc26232992ae41823ec7f7e9f6639ae7f53843507df398ee34458ac8265f8f8687533843d27ed8e2ec7716e5a087bb41b16d2433d7c0461d5206129437e3f0a84ad27536f3d7c8ae40fd6aad01b31a58eff323e585742926c5a47720f168f72e630ce65978707ab6df7e6f938a51cdfc16a9a34a67c932a611d2c215c4839a8e6fc73b0f6c4a8c9837849638d8335c385d30cf61b927c83354589d1cf2f04b0c1127d223cc7217d90a310a006cba490794aa4b3430b0168b0e78ec23f3cfefc91850033d834e6aea7fa386ecc410019ecf1368c6ec8b4913e62b1873bc93b460e028b3d7f32a7d09dcabe83bc6289f7f1420e2c44d30ee28ab53e14bf1b8ffbac83b462bfc9e9f092a5a5d04158b189e58f9127e694e34a56b1c88c7da818913f2a51c5de71d11f529ad0a19254ac7a17e3f31da77a4a50b198744e9bb3935aa7e4146b0e2ee688e668439ac4144b3ad10f0ff551872429c5362379711f39f02b0929b694b2a899534e7a908c621df99dbc1a14c5a65231cde49cf4c3188a4de2dffde4951cc2088a3d1af18a324f1961fcc4a61b3c3f3f90a8287a629f88fa484b6353899dd8e73aa4ed5bdfd98e137b858c10f3e3a70add269618d7e30e3a23530cd1c43623239f7f24664c32b14cc7143b168289bd3e0ea34793f225935c62fdf0e73fc456a49158628d5329573d4f5d8e5462eb1465bc430eb6124289ede3a75ead1dbba04d623549fb51072a539f4962ed8d39f88f57619d91482c157435d47774d11981c496f3ecafcb23a5ccc823d6dceedbd11cd75e461cb1672acb71f76ac466391976db3976ba18b1ae44f24d1e9be1ab45ac9a3e548f924711b252c46aa696e4d7bea39c482296f38d91dc4e712a11442c974262c474967284c821d6c9519b7cf4a24788186295d8d388186127e714628d9c7e4425553ef01062c994ca936a594ae30f620d15f32207e1f3572f88f53bcc0eb7fa40ec914e88481625daf480d8bf3ef438856f8afc1ff60feb224dd547ddfdb09c68fc66de87e53a73673f24df990fdbfced86aefc1e0fdfc3fa61c69ccb81649dae87257cf8d860e151669e873d86d84e31f17150391e168b0ee288e70e7ba55029aee279e8d8611b139bf4e373fdd761cfcd5157aae6a398a6c3ba49e285547b0e9bdf6d4f48795cafe5b08719ead2030f265e1d87d5c7831cd742a6c8311c960bb99be384dfb0999587a9e3559ddc0d7bf09c3b917383c7b461ab389b83f88d982a6c583b442b9856d527d7b007517294e2238b0d15352c313a8ae6283f075149c3e261c79919ffbc3968583c3f728787a4d51f67586acdc3858e10627898612d9bb87511f204bb0cabacef677ae83f16322cf1a26e6fe8c7393986253b8225c91c394b312c2107b5d06318b68a3e65d126550c5130ac2144877744bfb0c7e5554127a4b0dd0b6b4a37d21d26ad0bae450e2e6c97967182e50ea7dbc27a9edd9147e620b3d4c25ad513737252674c16d69090d2363e8a5e62610b751f630c137c42f00afba578394eebe8f36e8565ff2f7e4ad5cc982a6c952233273a8654a9b0959854550e49393985c5728e10772fc84ca4b0654e11226953881685f5523a8a76348dd34161bd9eb49e39eff8e3097b4e113e0cde294cd0097b10621c09196d52429ab05d4c8a1e448efec399b07e78bed2e3c1fc4bd8c63f9e4b7269f14309cb490eb637fce4912c094bf098524cbd97f483843566444e474931f647d83e3ae4a8cc72701a236c651fb53d214e7a1461b130597739791725c292a2277c1c7a841e6b088b7ecea10721a2bf0b61130b51facca3e46182b04ee51cdd664a9218084ba5faccd99fe3f5f8c1b6a6da21a79892237db0fda6f8b9b58a2be9c1fe9d63f0a019951a0ff68b9e525898f0b176b0d95588a111ab3c22d3c11a6d3b22a546b13e07dbe6d08a51274acee160fd98635814cf006eb0df87f13df1e388fe03b0c1621d2245b2ef8bf80fa0066bb8e8e3713657c5fc0068b06cf28fe92c5a5cf90730837d2e99c4205fda971f800cf61c97e4dfe489def1b1582e2a6a475b4fd17c58ac91529e0729bdc9fe154bbeb8e381c7eacdbb2bd69ecaeffed2b0df5bb16ce4683d52d3f0dc59b178b498fc88fa31e3ab584792d655c6209a7155acc9438f628e43d3a4782a961cc7296a99c3891c8e8a55278514ed585da69f6235cb952187e7319e9b62df4c7ae3212fc55ea137a4986c473f86148bc77731d3714766cc2856f528844f1f8c758a11c5d2e3a19dcf4e7535a1d83b6d87ee8a933b31a05862449cbd981d27c97c621bbb9023e253e5547b62ffe0216d9477748e3bb1dd05ddca6993fcc79cd8d3b66c625f7974bc89d5a64b3f768e3a21ac897df2a760a91392f39289257ae84cfc05cb77c1c4265261ba3976bc52b9c42afdd1e22f872536fb345154e3e73a8e4a6c9722e48de341daf0a0c4561da78e8e5a71323a8925d77a9eeef0928655126b58934d625163543412db7cf46e4a2a24d69f9f8aecc8722cf5114bc6f11cf36e6a42d411eba5fd4741529afc69c412b21aae83f9741d46ac92b2e5e5e107cb17b104cb31c41caff84c2a624b9e2bbce3ffcea19988453aca844fad4d692262dfe0133a35c494631e621913931c163204df107b541553f6566cf485d8d3a5b5091d2a6386104b685f86acb01ed783d82496c52b9fd0390a0a62e9f82759ac2013160cc45e651d39fccc8a270262f370b3f737e4a6877fd87ca2c7a4cad571cef961f3a83b768ee3fab0e49049d377774387f061dd590de7e1513e4ff6b0d505dbe99031f986e861eb8ed9e761928735f7e38b33b11829040fab5fd80a35e12a6de40ecb7838937b72d73462874535a79fac8be01fabc396438e56631e9fec181db69f0ebd7422fffc36872d2686ffa80a397793c326a6a665ff914cc6e2b0e4dba0da61ae32dbe0b087709f772bc64f0e7bc366eb610ed6918d75981b56a9342725717bec6ac3b29e59329b2c7264151bf6cf591fe2740e3bb26a0d5bcfc7f91d4aa58655ce830efef9e33455a5618ff973c64afa29c7a142c37e21e634ee26891caa33ac1f0779fd3e66b74365866526e3d385dcd20d5519b68fee53c27f8867529161f1f0f47a6575d3483586357c689fe43c759c73c4b0fec7864b67f93cf884611fcbb9c2050f18563d8feabed37a389d2f2cb11d3c8c1192aa7f2fec15a672b4d019bd7f17f6407e6e628ed99b7e2eacaab3294985394dff16f68c9a230d9552ea7e2dac21848cc59862e8fa5958734a999c390e31bcc7c212f52443af26abc95f61cdd8313a90bc15b69c3ec5ede823ebeaabb0742e3fddc995fb3815b6782935433d3ccbfb1496d8d851fea0f1d37629ec29bd77c5c6e3543c0a9b8c9a76481edd1187c2927f735c31950716f3276c1632476393e4aab413b614b23a904a6192a39bb0e4da55b86495e66c266caa97a92e37c735f512968e2e8cc75e096ba7e9b20b9217e24938aa10a2727f48d8e38c39573af0afc811d61ce4c44a3d7ea611b6187abdbe21e6891561d55c13499fd4343111b68c8fe13e02a7d892d55c74d8fc991c532c1192c7a9328486ffa5583ee48c5c1d438acdb6ea634998d0bd19c5923515373165696944b194c80761f63f321e8afd2cd4e4dc51f8d13428f6c9796b737441a2dc9fd84224636fd4de05db136be80d25fbd1e15edd8965529ae81bd4c66be6c45672b11f65c8a99037b1449e9ca46248a58c35b1498871426cea8e29cec4aab1cae23b0e95830b26564d1b1a3e7d2812964b6cb31325f2154bec217ab8112b3fe74a2cd6f13d9643ad985362cd71c7c14e8a6aa99358430eace3110f49ec71073b15df11897d6be2aefae389210724aefeb05463723c62cbf943959cf8b1d5e1883d7d3d7538f9d07c6dc426f9432c2a27db5d19b185fcf1d58404bf0f5dc41293ef3356fc3ca92a6251dd994bd9dadf34115b4c661776fd430d272296f414a227a73cdef210cb5986341e51345969883deec58fff738a9d8385583e8a09e6b17bbf828458cbac53a27d7e908283d8438ac5cf5b61ce0305b1ec598e2ce6761ca918884dc46b2c861c5588088875454e3cfe8a0efdfd618fda13cb8b1ff6f82b7e8e9c75545e1ff61c829fc9e9757cc787c5c3c72976f24f59b787edc388bcbe1dc7213a3dac79a2fee5ef10f1903cec4126ae6f8ae0618bf971df4f88a688dc61c9316cee78bd263f76583eec2c9b501922a70eebc4d061ff50f109cd956333872554aa7cd8981c969c29f5afb23c668bc3e2715d6790ced11583c3726592638e345cfab037ec719c2935a4841c78981bb6b3349129656dd8c44369fd078faa95b261dda81ac2ebbe542b5dc336637a1de44c5e55aa867d3bdaaff9cdf478d2346cbf1e2c63f018b349d1b05f4ef9831ce50c6bc41cc679f7df4eccb0a7dcbc163a8e31c448cbb0e5782d8f58ac4a0f19f6183c8c2bf63950cd189634d17fcec6a35a0ccb7720e6e1a7e7a8c3b04df75504b90ebf1d30ecb1321ea8e6d3005fd8cac343a64a1126fe348017f6cad3f24d1751d24f0374414d1dcf852de2efe4fb20c7447e0b9b8d871f7d342565bd16d698a1626379e89de359d83a9e0e39a5f81cbb6361f9189b3f474f631abfc216f56b7e172233e2565865c3c377b0cf617915f6f23887d1c427c2e454582a6fa74c0e6357de4c619bd49d5d7b79d11b292c9dfb1799767c37260adbaa27e9badb4bb781c2bea973dcd17ae0416d9eb0eac7990d13530e9671c212f911aff3266c96d74bf3876816c384b5c3b1e459914bef252c3796bb528e97974ad8438f1d553e729cca246c13dd517c20154644c29e317ccc394e4f121e611b8fe13475c73a33c2329b394354ba8caa8bb0a7a78bbe1337c4a989b0ef778d6ea8f4a933844dec734dcab310d6db0ec3a4bc5c6ae120ac9f9de9cb0308eb498e1e8fa40c5ff10f3649d37015ff7423f6c1aa35397d594739fa1eac29977d4cb67972b8f06089080f2d87142e2665078b66caf9fceb60f9a818528a2187183f72b0e7ad12db141cec51ecfbbab03cf1b8c1f21fec873a5511f1b0c19ab97a3c9447fd393558e3e690bea3d50034d8c3b8923d73713e5403cc60ef68e753e554a49f0690c1bef2b1e779729e2563b18738d5b8b1517b252cf61c8a7d3ca97cc592431eed0fbb3a5ed015db49908e0bffeb91d88a2d48848fbdb24c1359b15af0c0f34ffca82b5cc5d6390ea247ffd8a54f15cbf7268f44d2ca725c2ad6fcbf3f1e2679460e154b9f4dee8728cfe84eb15c9ed2ca99b1a127a65872578aade2733ae672dd8614eb7acea674bc3b0d19c5d2c98376695aab9888628ff37ff64146083109c5ea31bbc9ca74e64240b15c4495efd48837924f2c123549ee503ccc81c4138b4998a0b172841c239dd82666d0102966c34538b14485dc517e799adc36b1a44de1731c6e52db98261691ae8c29cbc41a377988f6e72919c3c456d1244c8c2924a4d825f63abbb8f8a1079ac32cb1efe9f7f807192d6595582fdde8c761392a6494d8e3204aacdbf84d9e496c21fe446a472acf4b62914b1beb3d125bf20f248ec96dd40b127bc77f39ee530f3e538f58fd72cd247214c72c47ac9f5e65536762b96ac4715a85d1cb33624f8f321ee6fd9f7e115b86f20d6b915776452ce99f03cb157f7338119bc74a1d850b2522d6142b647df8206d4a7988fd03e90d2ab7fd214a432ce1fba3e4112ec43aebc17ccdc766f0106209b97c39dea5b9c919c41e59a4b4be566a71412cbbbdb183b5ca4e09c452729103f3c81f3f00b1dfaadc4dfaa654fe1f96eebede90f861bff09fabe3e386581fb6d461768548bb903d1fb6baddf0518cf84dbf873dffa6079792c48aeb618febef53593c0f7bfc9eccb41d722e1d0f5b68fa8ff8fc0e5b4cfa7453f551c8b91d96cc693dcff79d495e874543986fda1ca6e5d061cbd929de718e1ee4e7b0450cbf49fc33a78c1cf6b3dcd0b7937fe938ac1bfc927aa70fb786c3163497c7f3cf0a61f386259d4a56c8f943398d1bd6514d9da39c43c9a569c3d69526a5322b2a68d8b04e4c9636be356c6739670e1d04bdcda861f188313efb3a9965d2b0878a902646db0e378d862da4dc09e69779cf3ec3d21fdda68adc460f336c2b9582857cceea28c32a1e26d242326ca92c23c53ca7f2189af138c60288814c553990f4c2b07a74212e25625c088361cb1cce8609fdeff417f6906b3e3969d33f2fecd5e1c6384bd661ebc2aae93e8ad3716496e2c21afa72ed2b9ffe54b6b0cea6bd2cdd93896b612ffbfeb0102a3a59582474acc24f5362b0b085d578aca490b0afb084cc5b192b7cca0f2b2ca1d183ccfe141d5a85e5f7e370fe24738554583eaadb90d1e09d29ec9b2264868ce12e268535fa3ce42b229c754461cfb516c2c3d7ff0385e5c3844f0c2925b93c61fd0b398eb5a51b1e4e58bfa3c89f1d6f33da843de4b36021999e86095bf0209c74b430a95cc2969a72e57179501155c2bab1267f3c2a2a49d8c224c345eca01d07097ba415911cbed36e8eb0757cd5215b163646582d4f52efd69e5c8ab0072571b2f5194525c25a22392a6447ed216c39a95fe4dc692a4258fdea539068972eca206c1fe7e8ac3a46eb81b068a8344d99fbc9f3833d47b952acd434e57db045d209d93dde1ddc83edd24824ad90f4531e2c9339688430b9d23bd8e354376649ab0353074bc5990e6cfc72de30077b47a6215ff75eda71b07ea8b1cc175b92b9c136212ace7658cac506dbfc07fb38af003558359988741ca79e7905a0c11ee9e7304650ef50720598c1d6e9fee2e79d06c91540065b9eb38e294a8e6c178bedc3d84985bcbed7c162ed9388a9f4dc2974af5857fb3af2cc95b426ae58ac42fed1ae9c72495ab185d74a7abcc8d91b2bf678f572fa9e588f6d15fb6a5c38f9e8927f4a15fb868eb3ac32b574a562fd20fec2d5a858d5d35aeef83f04f9147bee87f787a7e729a6583498854830338fa34ab188d6e85e142bb98a144b0e1d31cf71a3eb28f668628e70a239e84e145b4e2d3fdba8f44928b6d959bbeafc1d6584a0f8235a9e142bc24fac1a9f374754c7721c4f54db419ccee3e9c4f661b72bd98731a50e27f6be8e2bfa4c46cd37b176e84ee1730ec65234b1868c9c6673bef58fcfc4fe718aaa913c88798f89add73abca2a7a093bfc412df417eb8589e266e89f5a34c67cce195d8d3a70f63fab8d136945853640ef128ae6326b15d94cf719c4612fbc77992594717156222b14c668e6bfb67aa1948ac36b3b9433e8db1ec476c693fbe0d1fe2775c3b62f59062871d3df8c0ea46ac413d7d702993aad48cd83b47766267a67678116bfa7873f6cf8ad822c6fc77aa0b0d732236ed308f6ceca60f66442c31746029375653e1432c972184ca7195fa071b620f3d0a1e97e355efa5104bcc2035d5e17aec2884d83b30fb48f25f6f4719c422ab3b9e2483a46411c492be1a2b3c59495802b1548a4f71a43cc77105c4def93c2f795ade8dfe61b3959d12bbd461ad7ed83a68c9a8f7ded5da873d6ce6a5edb8f72fca87d52fe77037a7fdc7a17b58674d25845fcbd1a87ad8a3e7786d2a8f5d27f3b0fda4c4eacbfe88493cac391a35ad5051239377d8ba5643c6f598544e3b2c71b91d2564eec7acc3222b7e1f663e4c4b3aac1d3e778e63e620ab9cc3a2e9a1e78cfe38e5510e7b144f8955a864ab24a361c1c060301c0884810070a8533b1bb316080020281a0ac6c23492a45e1a14000238362c3e241a1022101014100e080a0a0e080a0c08080a0602c0603018080087c1c0203c2063f535b193e3ca1f7fe69864c7e7eca5b97bfa9d93370e5c9f79c5f73ebcb89c3da69d5ec43ea918f9ba00c143aa67d2d06f97bb6a45a3dedd67b78e5c3ae8e4d5a5c74f6f5de6fce93d396bcd70e66466bafce88183c1fb48e6714de5ac79684b466211ab3fd1692d7836d06cdb413dc18557a75ce5b4562925069284f6e9210c0192553bee14b746c0148b040649ae320dc6142827538564d6f8c66206e9616d413c97aecf5c7f76d6e96b0f4e1cbe78fa09e0209e7ebc4ec4c58b0c13746890323d6832cec855e17c066ee0d78aecf5664c998f98cae90a7a91489a149b3bca3e846b306ea294d596492a997280d7a95146e42961c9523d49caebfa3967b75d38bb79e215665763e7a803ea86d450c872f0e494c3a7b75f70783c663bfea7c0c9f96e8e3cfcc02ee63134fbcca2354debe6a1836c1fb9d87465c31b0fdc40accb2bf2ef139f2a08d17bf04021772e1b44885a2af1ccea185e36c5cd78c1323623e314b4e7132476b51f16a10a57b7cd468811154a09a72e5ea61bfdc3a50fcd04dd3dbb6c02968b91f055ef2f242d5dc52ed8051fd1e63327df03e5f12432428013aeb4b692561f52d8a86373aaae54d947c7867673d4c8aad37ad16d96aa98871e5b56907d951851e00bfabae9da4087154505baae0c1a75d49124fefcd963276faf3bee1832413f4cea4e71e24db8a261441431418a884256e7728db31d3c574b377f8d3dbadce75f1e453aeca1e1c523eba46d56d172a3ffcaada323b7de3f7155ed72aea5d4ee7971d8d1cb63a7397472edcad373d75c3a73eef2d24367ae5d7076f21ea225232ccc98204e31d189114525b5a4886d6a1c60119795bcb68e2ac26cc778b22a329cb0a2431e2335e491b061907abc85ac270c60638b3e4adecb618bccc1f3da79c3b7f26c4cab1e630e0f2a1614f2d79446d4f80dddeef9df940f974efaa4913ad9e493bedfaa3b6f88d7d08e267d12a84088449a284c483a051494349b73da475fbe3a7df1e189972e8b0771106364f0d235672e5f3cd55a4274c9ebd7551e766d5e1457ef0e633679e2282c3f79c025681fb8cf41ce7fc33cda6ab64a36b32c78b33a74f060c93eb24e13b2c3833157e43e16d97b17b9f2f211b2f2c707256ac10e1f224869ddb594f4b02d6688203f19f1c4f035cdba7b9169c9b6b0094854c07956bf746424433426b0f96d02c6cdc218424a532022c4810949521b582635031c4da434c38f0932babc2c234580833942f438304a8c6c2d95bc905fe1d4a347927212e89cbf71cecd3317675f3c7ee33c7a2c907aa29be9fc9dd70faf3b7b78ed6227c72f5d3fedafb5927e7505ee5d9d71f6de6f4819624b025c79df283284a9571d76601e3b74f429af7974ea0ce83ec4ba8c9017ae3d8f190b710ab1fd0f79ebecc65997276f9cf0fae485265245a36481fdeb04104c483b09289044a1d415c4250b506180be7270e89967d7ae393bd6bdabcf9246d5579e1dbbe7eee8c533371ebeca9b75b5ed106ea867bb31326347baaef94c612dcabaa83232890f7d8ef938d1c04aa202fd19499c844a8a24bce3a94487fc9593571ac34323dbd9db536e3cbf7bcac5d1f3769ceb74101fbc74fac2f59957c09285c89e2081b4735622d5f48a3a4dd4b1182accac1b751c44a54e258f12a9528ed246c99f52a9a8b48be1231cb9a6b84c1fa511253aa5484a3c25a9d2bd526525be12cbbdd4a839e86a574a764a4d25904a142554258e521825d0519a4e49af193353294fc95512575aa194a0c452aac92a95ee917d2a094ac9a525261d25c865a9077c8b1978d3a5753c69a87b4ae84a0d2583104b5f9402b8d42562a6fc120f93a8126b4a3da70cc2f2aaf959261f1fafd8a0a4a2d2d68d2875b80073d58b655c2547617951cfc6c8717840b0857bd56858573c8d995e40a0a623376ae13485489270c8b5f95b2209b018a511c1e0910ce7d51a4929120ed29724a2a402090989893485d41a4989c4479a408a81a442f244aa428a8cc422c1235520454062214122552145466291e0912a9032a124de58a7d1683aea218144a2444a207191cc20d920a921b590ca93709458e590eaf67b110123f5e390962389666548f7480a481c484248942454a5e48d442197cce7490c290e091a9212a98f248124034985e4895485141989458247aa244551e220c120552045426222c1902a4d519578488c0cc929959c7f3c1aa4454879483e2461922a25141217691aa915920a120f69162936928ae48f54498aa2c4418241aa408a84c4448245aa21454562234121d5204543e22241235591a223a981c4437494ab6c951a8cfd1728a01a89d9909c20fd636928a54032966fa454b84703b731b0cb71bf61142586362a0c119d42f168573fb335b10857ef4722e087220ff4c4eabe0820845c55e102ea78e33a24e1194aa9317e91f05a04df60e38a2b61f8422695d538df8b442a2030e1a2875ffcb5161ed8705d3b412597b4f744176c785700e24bd1caddf3a9924690b8af56bf0f85e1301c8531020710a3a4a7136bb834e328278ae0ea048a0536976aa76906929b6910dc13c9199b025d72823ef9aeb1949ee0ff3099e2c2d5b941dff8a0caaec0bf464d15cdc07c019b9496bfbfc7cce2e95cae2ce40328c999a56b26feaec7cf4c164072bd6814c7fdfadb1edfe1446cab20c881ca75cada1ec9acbe3e936c712230e64af68aa725251315e9f52b17f9fb2077d38e1af7a39a1d44bf45917113c161bd6c60284448e288ed7b408819c0b2d3ee1aaa4c76829d412f9f11a8b99fcd9a12b2669c66806facd4c6cd559c5ea26ad5461a8bee3b348a0df9284ffaf17505a2bcb1e2043abc3523a68c02282912ff7982f04b91ffe19eab24d5991e6fbf631908c925bc0f031d2b3e521e251c20f261a2ec7e8104f44c52b84d6e81465058265c51049b8efa765319798988a31a532e346db495ad6ab74326336577ae8d8125840657afb0deddcd51d27b9bfdf4e44b5ee44c0903b34573bddc053ad8fd1077df9ddd9a6f3207a29a6d664af0b74bd4d0d1436c8a3e58d33dffec9ce19ad04cc264d36643e5e97eaee2271ab31cb6944886160d034a3fa32f0bb6ee173621f38da823f22f7c13b8c39c0046b6774ee88f4525c061ea04e6f0471cdb76d6c51bf710151446201a8f1c80a0440d4e090caaeadadbbf7d88bf87ce5f6445a213ecda98c6c3535e2db25814638ddfdf22f64abdae0d59e48fa7c8c5423f5535e815a25fa36864d8cbe19e45c69c1384d65abfe4b50b504178b4f20b2a1ec60081fc84f309142ad1ef9849e6e947ab12cd17843bec67c223b0eb6c92e41ed7b4866e0cb5e609fe291099d8a7b8c3f05bbf7159c547b106ee786b515b2cd445b01467957f802545cd59772ffde376b451cea17ec872a4eb5cbf81bc2f1f3f3a05d51cc1c532971d048d3357c2e879572705faa6154d4c38c05158c1d65f109694f6d35051965141e1af61198d991da19b6f3e9cb069ee1411e5c2135c66640ac2cdb2c3675c4024647c4215577cb233cc86123919f954e31128e2dc3828683b8114ad879ff30907ce82cb478657a036fa92630b28e3610ac8355e48d9418ff15729e400cce89e314b4bf948ea0d538f0885789434b267930f0bd5007732984c83aa0b209bc0eb2608ec57c4cfd2d8877350a2eb178f74853bd1e5dee88977915fcb6d46ce150b6751a50777423aa73d88b0c5aaa927f5b2270b1c5e98f7e4a2debdc831450ea3b939e1a4f94c0b41fbf4902211159ffa8f6932f03788f1caef01cd422da4d8acf158d05b7827ff3a0a8c4a48027ace533dea15f628982a76860c64ad1c4b8242139ffa1990705a032018ad6930413a3670ec0224eb44b7454cf0908b8887898ddfab675b1e8f1117d5091148390b966da064481fd13e3cb3021e30e339f9e39fbd517eb8ff87403740ced23f0ec034494a51bc9e7fe5c328567bb80c1306e788c27d83798f11252f1fe6a3ff289105263b21a1f7e32c8c7e6bb860603498517246f9f813ce3eee8b596efc7926f61574a04c2d46a2d3aadc494ec852c4ab662ecb033fbf7d20db81f5052f6c5b9d1e27b21510ebc2007a5a34c0d38d2629b728067c4382979469d2c52e134efe4be5ab3a889a2a0a173a50030f348c84e1e98cdd9cea9a1a805da638a29f0153f443c3c6de8b5bf3ef226a0802836f4ccdbff0ecb0ec80277807fc195ec930f3bd8a9c58a2dadac1891555a609e049f16023b974436cd0a97fa8cdc73aefe5a2f18cb4ba57055f41c5b51c66b73722daa677d8714bb0d605f1c757897c2d14af6194e74fdbcef57816fcb6c192acea6782b91c844531df4cc82b309681e88fec894a340a508e137c625d5b9b9ae570951858c8c9371b6e56fbf25e61cd07cfd011164a085e32c3a0b596275f32df7fd046e5c860a29aa26be2cb16f9cd780b0534dc0a3e2553678f18f1c1c3074b6251cfeb20cdd6bdb24591149e045e14a3ac2b3b0e819ec277ab39cda9a3df702cbd5d42e4824bee51a2ba1d719422c2331eab935c046a2f8eea94c1cf19492fb6be637cb0a3394fa08bac4c805293200ae554b725a1eacc19affee1cc5119e80a97f9111988b652bf8146c400e1252ef8670ce9ee90c3d7b9e2013daa83cee6b4f3b3334ad631cac74d04055e470a2c2ca1c05c8eeb1318c884041e3149456c62fe919e4e785ccd0158ef68b2f81046d4a3343ba25ba60b9366c71644352dfe8ee1d1feddc51f91227721a40de9f010274afe138d06364c2ceb9666e4f31e93c410a95dda95aac9584885cb3781a5a928dfd70fc12baedf914290d237c6bfb91c4b47f4c69c5eda246c545fe9f75df4673a56d12a0d92bd02d9ee95ffed8d199865dd55c8eaec5d5f3d30cab64728c2350e08c2dd610764edf479422e7ecdd029a5d67c43fb4f85d0ff54031d46ba32011694a9aa77680730f27d3fb08860f2b4b41316ec1be240be2dd152db459a80235d4be3302e66d222bec12f46f41ba92b52cde230bb9e362f3ccf594fbb17860767f4a664aa9926800ab7816179cc7d5a2178e0f9af5610dc6706b8fd0527341f6a86e182cdf5b43e70e1f9303780870125b4552ea3f7cf9319b643c65e48e435cef697a2881d8d57c5622cfbad4c3f901e470f6894a80852ac79776037418347d0c8525ab35a62c58fd4a47806a8674be330e0c61a70308447b54c717cb5f802435b1bb6ff428da3ffe603b80755bd1c458f49766ac9b9f0dff4f32d2cb119482aa42f2c3bf824f5ca4dbbaba32f273008ed261beba58daac73c292b3c209e7440b632d12982462d4a4230ed7a8d9d96566c1a2ef9e4ce64f7130b0ed69b331e4d610c15b0195adb290cfa7d154441bb1e5a37b258dfae2f82bdaf629bae912eb35af4623019efc9ff0a2dfdfacf892b82107ab45b7b62ba539ad148b3f5dedb89ae69ba88a1bbe7d02948c658705cb957c3eb496312cf2c6bf59bbf71dbf42b321b5dcd187f2bf6dde82b86914d4f72635b67ca79ce54df2d59728775fc9c2c1730b191de7727a6b6155efe1fc21250bf3a7a7efdbf3149c778e4be966c5113ef2e4554e3942af152ed7edf37332a95a55163c5fdcc147a970cbcb6c14348f07be9a508efa2dee2dc79b72bbae8bfd64e96ea22026aec882345a89b5f9e49f6270a8e0d8af31c134c951c21c1dcd41740b6589ab756165a50b0305f86ee7e481b27ae95649cb409b50155525b405bf7e93d59472f4489af93a8ee1bf2a9d9895d0c2f4ab4eeff3c7411abbde14f2725a7d77442b783313a2b1092c4dc7fce249f01b01659dd9c0b3cc04e5daa1134235411c1bfd809da506b3d2fce821a05152b0709eaa557e537de029e94e03d00d3160e77170ed08ba0cf83df9184ec7adb4dbf5da45d268770eac7b99ef47c8bf249497a6f55757a4012e403183747e88271da920f8b80adf6a66f89d457950bc60964f15224ec5e59de2118040ae59dc9b6b1909858f0e553d83fa42da6540ffcd084830e6d1f19503d0020f510d59caa3d601022ba5649ed798d0f9fc39f2e40f7eeaf97424cba662aea0b8be4aaffbf45c018cdb7049a7015daec19024b8341512580a379940353a6c59055672169e38379c4e610df703a582a3a88d0bac135dcec53b37da0d306a827be00a1dfe6262f72936353f508d4b61768ca042103b663200e9e8d8c85e9a114a0d7974addb27aa25cc7d168080ca25f019c0b1ea2a80b3cdbcef7373f335aaec384493cc7634b4d7e0d57152bab87a640563116f5754efcd3ca11230a75de7ea1c4aa891ff1e3159f1746e9fcd46a6b2396dd637a21ebc3e8c185d73158700ee56fcddd8341d04781f348ba964ae4435a300ba66b6b55d225f764e9d5b357ef85a1f984b735fde4d0569e6445ccc50362b78f083042dac5cc83e4f0c955e11dbd0fa330733169e504087043a10aaf6b5093fea8f332b8e831dd7f720bd6b60619d332c97ca46126a350dbaa2eb386174d3c22755f949dd49defec28c5b693314066924a93c6fa95019eb022090e2ba4685280312e2ce61bfcd1ec5156c984fe4faa9b66c7870580c00e85684110b65d98a806d089255bffe08bcdac5912dcb5e62b1c3a449092a0c6ec4f9ffc7d1d32209bd161b06bfa3f7c0b72d0482d8a9ce54755848ea33b76bff8221347f3137789964a091a5fda70f75498f072534cc92915eceadd9483e3594cb507f302348e92aa0e72049fc59c1cd545a103531b0b0cd48af9b1643098874801499513e8baaf6d39ad18528204a5867062a977f5d151a8ea8bac215b88c33113f5b24f27bc2e9f1dab8872b05eedaf23935332159a0351090cfdfaf74cc4532d1a25d3ac9ce4093a71dac2c43ddb570471fc4d81363904492780f32b00e0a5ea2938ffc4e28986254f5c98e1f3ba9efd73a5c85b702e276588ee3f2dd55b1fa1cc52384709f5e7160467224762d445cab9641d42546f5d2f90bdc219a6e2b3d8c5ea0530835b9ce275840b75900764096db4dfb5382bd1f55d9da4c905e2d0261073486460c2747b44fe740d7de55cdc0b9c7cfab5a311ed9fd8e30748fb0734e75b78adae058921b7747c4c2fcb6095f51eb704be51e9c7ae59f9023f34606b9844f2afc88f97fa910804c03604320eed04b96efe6a6744bfe1d05086b66dba9cf68ca5d83754b4797be926cda6e0cb8708373eb2597b7d76f1aeaa05668ad7cac57a2f849e2f46d6a42436711ae92ecb2bc28158c75e0850adaf31059850256eddd3dddb29cec153be1d20ac202d3ab385c330582a4b549b456c918b8d006aecf490a4ac90a543f08b06a09338235cb2d6504369443b5dc24a8c06d08c32be2a6c103e3deeb38d50b92b8d4838374ccd179235c69c235696d63f969b4114a40b56c2348f484c0d9e3c3ae017c07427ff360fa1ecdb29a61a0e638236bc03b3ab9f809a9d1eddd6284b6eb8a0a011ecf3ac4bd727bd71211a2ff9cbe22a4f0a72de29cfc3222ba86fc488b6161e1af14e407fc993469011c878e9226fd148d4b4e691e21aa4332079007590fc9a3d75107d449465d472bced7bf992103a5190d92002867dcbadbf8336da270a3706856b4730b4f2eef673f4b814f3633f9080bc8d38bba0f70826942425b86f288db84ee239b4231120595284e24e68f2435ac064c25b39d11e8e162499684e3e8b34e314be9c59e15b736a87e9894d77c07190269ea4b910031650106da29fc6b4d409cf6fd994c43f1c2d60b26dd2c885a70e1d9e5c3450b3d922a5c339a135ddffb435bfc4c0cd8431eb07a4f13283be1ad8a63485725e86bfc8e6e10c336b1b95f240e3f0fa9fc3b9330d1d12432aaa56650040128f814fa3c5a3f7a1433d9885edea52f63a2f0dbbe10fb1cb199bd7ee4d1442fea8da1f9df2e3ded15724ec6daeab3aafb5b9299e185ef52e07283d06521e6cf86f64f24350d252ad32ceadee6a379f6f8d8cd9588bf1a7379a89fb07300ae674798662f47d58c69700ffc35d59b1a32a721884ae5d633582fd2fa2f3d07498b76ad80a4da1369459e84674e150868fc3549c84712c787545f3c216280c3078d173868f434a82718fda8c496e29f6d6bfb37bd9db580ad8147b17158a4ca8c275fe669f80ba6cc239ca0b81b5004e3b00eaa709500c232642021d4cc0eded0010136f94beb2d1ac538866d96dcc4c91d0b3b01203d4ab02de9405ed0d3660b25472ff000000000000000000704e64ad28086cb729333997e8ce66e5955d11292b9295f8745e894f6726ee689a6a052b78cf2a016c0dba0d1a0e5a2062fff04169a8d47bb9a3b538c4b63957989cd358448ed6c210dd8ac4c7901d85582bc4230d153a0c311362c9d1acd2e4d02c471ec41673a8fd14757c3e16c41eb11dddc7116b120ec41aaf34c759a9633e06107b9ecb8156c723ff9b3f6c2b95e63c4f4cf6c60f6b9574e6f0f35466d387cdb3577423040b1ac3873d8e95b42f6988c9a3ec61b32839b408f341caa287253fe25585d59348c9c31e7d8a8939630c7d513cec9174ffeff74826f50efbc7b4f9e822751ca2765863a5a41df53f9c25ebb078d8ef8ff379e8c8a4c33a19f93c7e7ee7cc392c39d4c3c3e0abbba51cf6b076316596715873c50f4a33264a0e1cd699dbc91c849ce36fd82b3f0a295f8c99871b36d930ab3ee2bb9936ac1b55dd61c8ca1cb261f5ec88a9229666766b584a6276deef49b1a386adef83fb8fc913fb346cb1a122e5d819298e862d7f3c39fe66548b336c96fa231313cf4bd25a9861b5e8cf31694c1b43486b51862d4b43ee387d84e5586b4186cd7245a69bb2947c6b2dc6b05a68b2cc297ee6c35a0b31ac5f7279ffc39fce586b11863d90b01bfb17e672d65a806135ed689383587f61af1c4d69b2dc395cd65e582f48472511cb49b2eec2aad1d2e3f433ebf96a2eec936c365a4c59c1afdec2fa113fd887e942c8576b61891f6e0c9ac9c25221449d8af1772916164dedbc936373ce1596afbb08c1c33a2aadb0c63c3f5312530e625558bc4e82947f1c94545458d38ce4e8c3b0d299c21ee5b81eba3b63c8a5b00721c776a68d4f1d857d2ac6d9d151eb38a0b0a7e7b51f4d77d513b6edcc294493e841ec842d4f94b01dfc52589bb06d8821734ae6c9899a09cb8739a6cff17e8cbd842d7a1c6cd4f4dcfba184a5a2ff3bfc1c9d2761d9142ac6fc1d6d9948d823d6f2c3f0405378842d8714f3982b566d84a5430fc2479d226c66217e289127c21acd4227fa8716fd216c412c48dae50a0f7721ac156ac3de78f8dc7810d68f3f1e7ae71c4dc681b0777ca6f61b9b63d47fb0e41c27f4ff264cea3e58428ed3fc47e6997ef7600f2d94c50879bfd3e6c17ea1ac2a668ad371bd83c57b2ea987743521ad83253453f42ecb23ff9183ad3269864dfb68d3070ef610e76cc256a7301f37d82ffd87936c426de5d0c206cb8e5e465a4beff2d0a2067b4c1363e6590cabb31634d87f3523a3d78518642d66b0a65d09afb2b314590b19ec614a47bb396715e158ac932cd7783871d7038bd52ee47f88e6cfd8bc62f94b0bd133c47214e38a7d73582177695ab1c7cc4c492c6f52d1b0628bb8fd388c09e14366157bdc85878de4a87214552cd3414853a12e746449c5229f9924eaa85823d4860db1c30e3e4eb1f9e6d0b1150f3a6c8aed937cd8871ffd31a5d82b56e820f247ac14522c3e2904558d3193ea2896181d5d0e620eaa4345b159ae64b298b6720bc51e3659e4c7a489a904c552621ec59f528f21fcc4d23954c6afebfe389ed8eaea72e8bd3975eec466731f3d48efc882134c79ce1362b8897d82568c69d4730cd1c492421a8fea1d87c9ba4caca11f726e443efb31b154a67958669eb32697d83a7dcc98f05bfab1c436a182de5a941cf595d8223fa7fc60c3859458cd9284853bcd9c4f62b5943ce7af7e574c124b3e4bf11c5de67424f6d8b7aa3375799541620dc103d58a2a1ff623d6d4d17e5cee307418476cddf921a2952649a9466cd122c33385104387115b5f75ce6148c6e42f62b118b911d3cc830f45ac1b7676e6fb11a3895855c2e97ff8993988885522677c984c9a2a3a0eb18ea439ebe87c336f88ad3fa89498dc7ea510aba579da1909b1a4f9207dbcc3590c62bb986e2246e69c2387b310c4221d25f31c11d5fe398b40ec716cccc748cceacf590062b50e7663fa9815e273167fd8b3a3e62087ef873dbe50d5712f84947c1f968a96992b72d849f27cd82253ba917e0f4b774e6971939fc75c0fdb8491d04e0bab97e761df9b20392e87712ac7c3361f6d33731422c5efb044f8affc71d861153d8d7b37faaba9c3ea21dac973e9f77458277e47a6f839bae81c96af1c1e32323adc5a0e4baa4839fae7e02ce2b04ae7f2384bbec3cfc159c061b5da8f1232e5f8a31c9cc51bd6fcde8a9882460d1e9c851bd6a469452266997f0767d1862de69c9f831872ee30cc59b061ebe8ce3a5a84a90873166b586e3d068f9fa63bc770166ad8c37c1572b2f4f862c359a461fbedd58e6a91e2349c051a16f18fe1d2e7bd6419cee20cab690c93b9e3a49c17cec20ceb5ef4e6891875a7c25994610f3f7e875c0b2939ca599061c914eef3c9e7e978e52cc6404a291d2376312c5d663933633fb2c3b0a7697450163e5402863d696e86cf6e4cd91756ad9cc4bee3d14b79618fb1619f927ad421edc21a3f33a4f9ee20855cd8429890bdf5fa28cb2decd1264a988e9c8516fec9310bab7d7e489b03b1b0ef9dc5a78adfb4e215f6505a41367e3f4bb4c21ed672189f2b4fdeabb0e4ff7e2e893173f451619d58f631e886b9f8a6b0a446698ad47c8e3c29ec411cfff09cf24d785158fc53948ff39d7534145649cb216cfc84fdaeec66a368eae9843d4e95212745e9054913f698f3c4942447318484097bd2149facc812d648f9238fc58cce2b61f9f441eab0534b7912168fff4a638d84254482587a8435751cff3c481cf130c25ef3392aefb022ec217e3c631bbbc38c1161d9c9fd81a843d8735016699a1f6f32212c1bc7e3cf61845427087b1c4aa8c78be9fe07c27a1e670409b9c3fc0f96affc8f1c6c4829c6075b58e8ab8e529c450fb6184b1e74942b251667c18332a365cc51573b58d72cd3a56a8a395a07ab7e8c1cf453ad9e3958e3de8c4a04895be260930a5d31cccf9e477c83556248b164f3d63c621b5892f131a46bb0aaa887868d9e3a08310db609f19cea79e3fa3358a673f413d1d7c94206cb8e8599ca5812d2b158577a4672ec90d31c586c1dd50735d9bb89bf62b19c97a276727dccbb6289ac601bfa36fddf8a6537dac65c9a3eac58a7d33fee048b29bd8af5c2e6a38f35faab62cde1a9230d93b5a662994d3b1137e73c31a8d82f54904a36f7719e624dda2525b3a139678a7df5f39e7ad8132d2fc5922a1bd427efc5a4d87ce25eca1dc748cf2896bcd4d8d4c126d4a258a2cf89e7f8250d8762db8ef4f2e31dcb2728364d9f4e37458e37f627f64e1d94976a2edb135bda3c318d473ab168f2c0af6e4e2c1fe29a77078f22c72656bb984f73ee4063aa893d4c66dd29213f4c712696ee74d1c4438f228f897553c54d0fb959f125f6e8f387e5253145d35862bfcd6929d2c6c4b9127b26f9d0e3dc972943896d3fcc0839be4f213589354f36c58fa31d878a2416c9659f347ebcf589c4aa359e43cff5111e90d8420a7d7137a38e8fd8a2c4dc7158ca0f51472c2b511d438c9a5c6a23d6dc394a3d67318c8711dbe597a54ae99bfa45ac41ae23223d0e3e54118b7e454cca71c8736622f6e029444c09312f11117bb81eeaa7b955ed0fb1dfcf8d5c8a359736c4f241aacff51f2cca85d82687b096371e260d21b6cbbc0b77b941ac76937388e509628b1f8446a94454ed02b156556ebe14163a07c4f221c47d1895a30bffb047aebaf8a77bb5f9618dbf1d3be7db8e16e9c33111b1bf16e1c31ec7c94daaf12cf4b6876d3b3db8b550f5b08ef4554c8a9783dc4c1eb652a91c95040b39c80c1ed693ce9bf48e2475cadc61c978bde943dd5a5fc60e9bdfa4d9d2fa38ca95a9c3dee99157caa186d895a1c3661a83449ff2e41f3273d83adccf49623272584c333ac6c560bf9289c3da618f56897f78840c1cf6388ac839081ee6fb9c37acbaa132cc3358edc70d9b4af228c98fee97df8625dcacc5fe38f7873d1b36af70ebf1a3cd1cfa356c9f6eb77389afddae86b53e3d75928e62ac781ad6e8d2bc95f352321d0d6b59ae10f299864efa0c7b94d13e8e91a390adcdb0e768880e3f493fa8cbb05892886796c7ef3fc8b087782793895eb71f635862dc47394e0db3f821863df785e6a02ee6e64718b6e8384cb1dc61cfe300c3d26148217aecf8c296a69f938707c9a4c30bab7c1c049b3f1dfbe02e2cf1242f8246caca3017363d89f21b2d8b2b6f618fecc30836f17f72ac85a5ec537ee243e4df64614f1d4589761fc5f03058d8830fe7e3b0a26b9fb9c21e5b27936cb72c67acb05cf847e7d0f86164aab086896a2a3369438e4285fd53087d391afe53ca14f6a990edea1c98478b14160fe39e746489c2d6b91dc68c95a99302853d66270755319d5ae5094b4a621f25487c0a15276cd2914f880cb3492a4d58334fc566a7ce5a95097b55d4466ac7cc942e614f3f31ef8e94c739a9843daa98a2783069af9349d843873431448f3ae51309cb4af809d1d133ec3cc21e95a6945b9a3aa369845563dd86aad0342d8bb0c58e92528e64e2a748846d3d4ee5617808dbc6ec4edffa84e584b0a6f9c837d23955ee82b0e638b00852e9a34407844dd2774e848bd9f50f96fb0e6abbfb62ecf0c1229da38ca1e12a5f7ab0c41c04f5b8121eec91587698397afc40b28335a22bcc4423868ce860bdf00d29a572b0e8a444ffd41d3e38d8f66b22e9690a0d911b6cb12a374798fcb90db678de791f79d8e6d460ed8fa2111996cea6c1f641d009d1bbef3c66b0e7e9b52c0de2290f4006dbe5fc18cd8f532463b17628b39f9583b80b166b480e311fd56c45f68a2ddec7b394abb862c9f2d079fe2aadd8c2a95aefeac54a5558b147ccaa93f5a87c4365156bc8ea15f928a6c55051c5a2dd39c40e245a7f9c542c592945895d1fdac741c52261e3cf5844881cc7010128e00ac4d8c2b6f9731082c43ea9d8711a0ca0f1c56780c6062640a3468d1a35bcd02ec4d0c2d6713021ea77ce0d2d1b6094200bfb6d6f8e19dff381a699821a352e0616968fbb24c6a5fb86960d2b0d643120c615f6cb31ab3a56ba1042c3430c2becf147a9cac3acbfd0b90a7a7acf6487d9481d6250618b92184483a484f89f296c1e9127b39375fc398e14f6b5ce219944cc31ac270adbfffaa47a0d854d829e84647f9bc3dc79c2a2621fddfe564c1ec73b61af9434079373d8716ade843d6b524ccffee79c61c232e551ccbd8bf92bd64b58224ca22773286113d3cf0e25e692b0763ca29df71d48d83fce393b44644b357c84ad42d2ddee28af0129c430c29a1966296479df4cb8086bac509351936e0ec24458a543cc2e75d8145386b0e44a513d53d4240d1a21ec9d7c7e928709b1834c10b6b859613a9ecffe0e843d828e97cf967f48ff608fea503bf1ec2247293e5882e5f815b3961eeca941a66b4214cf1ce5c11ded479a4727ddc17a9fe3870757dfe5491dac31c4918a69ce1caca973d0a1b1b7b51f1cec1139af78d26fb0874faae7bc6db0c5ab783671c542eaa8c11e73289dd08f224d0a0d160dfe81c958769824cee05c17d37575d4c590c112ba67276a128bcd3adad9e58ba1b18109d0a8b251980283c556173c85ba186e3d26afd8a6628f071f4fe2c771c59229ae7af8397e4c696bc57ab9629ee6fb90ccc38ae3c82cce3ee9b58afd5243f4209eaad8e320dd7b69e929a72a159bf97a8eeae437f5818ae57f3bfce4fb40c4a4532ca1b46eefc4c286cb31c51635721c74c8eab0f35f8aed2a9a9c4dc89362ff1022799e0b4d4f690658d928ab356c318a7525f6c8aca7ebf4e1a2d8728ed26ae80ec682078762499723398d5dd6a16f40b1549e479f611527abf289c53e6886142bf3ee477a629b1c27c61c58798e735c279610ac43ac74381136e3c492d7916453d88d27161a0ca0e111a0c1001a5ffc8102155480c6062640a3460d1b55c6b0c526d634cbb3f1a368628f173eb6635599583ea4dadcc5c9d3f1a44a832d30b1a7904f5725f85ddea9013418600a832d2eb1a488996e8cfa11dbb1c476e6d103cd79aac41abbbba463c26dc984127bd2dd4f3143100f63c824b6edbe927ca52456fbec38cc1fc7a49b48ac7a713f57265a7d680ca0c180e2822d20b14f8798a159136a523e624bfd398a74e933c27d1cb19ea9fedf7ff48dbf1bb1df567698fe3185c5cd883d46cdb937568aa6f158c436235173f20f647b6645ac398e3ce9e4ac48213f5b24628d9b9efae3f8c8910a22d60ecb9d1d47b2f4a31e62990b99536d6ae52c69886d9347712a9258a61f0bb1864f4f16a2d1218d4788fd3fce95957f5b9d6903683080460668308086033630011a356a90b25105105b0c628d889cccc829bc728820f68b50113772de702709c436a1398484b000b1a5e938c610742efcf8872d5de64dd8b5a0398cfcb0a6b891fb18975369fab04ebc8a8f5779eaa2860fcbc7a12f7f9c73f0d1c73d2c9f69aaa92b1fdf5516408301341440e3021338156ca1873dee83cac7ae8ec3b4128c13a400052500638b3cac97c1f6e2f7630b3cec95156955dfddd0ca329518d8e20edb7dd2fb403dc5861761d820c6822decb0468eb2532ca40e6ba80ca7e6a14ade8eee620b3aac721b738ef15d319878802de6b09d26e9d1b8ed9a92dcd0224563030fd800a2600b39ec116b9259a99e495636922a095bc461f5c0ac73e6480ffe73246c01876dff62b8885afd1ce70d8be410d762367e8c1e37ecc9a3203d7a1e2977dab07664cc899a0dcb46f14034bcd463d6b07c0af3733ab31d55c31ee49510b2b9298a9f86bdb44333a6e69defd1b08771b3bb1f35e2f733ac12657218fc34a4d0cdb0c5ff93097119d6f01137414d938792618f99228f9e3d86b5247aa5f20f5e618b6195942153886218d69c3a9273858f43d66058aa272d543a24ea5fd8bf53b326ae2f3f0e2fec2975f0a18fdaf7e4e8c2d6ab61cca38eb3d2c1853572ce8a9ce9f3cf16d68e83aa473f3a19d7c25a5e1ff2deac867016b68accf57f52d93158d8729c8f1f36e2858eafb0470fc3760e612b6c71d252fecc9c8ee22aac79eb42d533e7641bbb37693e9fda4c61cde829a28c460a7b6996c7cf8e743ca2b0fd84e838c3588e3214d695ba9013cd7158ca1356fdc9814e8a87aa1427acb19a9a43998dbb9526ec1f397fc62a4c584352ecd411a93fbe84f5d3775a5f5d0969252c2196baa36dc69593b097e9c6899d22614f899b661322bbd2236caa297724931a61bdb4e154c3d9cea7087bc7289d7d1dfdde4458f5e30389719e2d86b0472af92785ec943179b610c27a329b62ba62489a3c5b04610f7fa6b1c1527a649e2d80b07718c2678a2f9532cf163f583a1e8fc62392cd96670b1fec718c84e4bb88fff16cd18365eab7937804f51ecf163cd8a472e6287c75268e678b1dec6194ffcb31464e693c5be8a00e3556943ce3d922077ba9c5e0314a4388c1b3050e56ef120b3111f314cf1637583f8795541be94287670b1bec41f81462e7206746f06c518325d4724d0e3caeb4f06c4183ed72ef56a8cc60abbf186398b7850cf620498689621b2e8fc51e2c55790af182c5c062a9fef8cafcc3e5ea159be6eb10c9b8d389b862d39b10e3a520a124d28a35799465e3f5391e59b185a9b8081ae95188ad62edf471f0ebe92cc64c157bca1f55ce86aecd53b15de80c371b542c7934d4e5d38e62778a2dcfd54ac5ea10c0148bc779b02995e7caa14380522c9ac28f55968ee4e91080146bf8855cfd6c859d0e0146b169881a9f9cf818a74300512c93ce92e5f8c1470d1d028462ef389cae0deb81a7d021002816b93cf9aaa968393a04f8c49ad2f8e4deab54113a04f00491e284fccb9c4eac933ff2a07a453dcae1c49af2368488ea55f36c62bf1827aa8797dad1d7c4a69d15e268ec9cd7cfc476f1eb73caedb4e363629b601e95f57d78d35f62e98f9511693e66c72db14d4d6d848b949af14aac9e3f3c546efd2c4e89a53a59c47d687b213e896d2b879b728925d95c12abe4eff0a112f1ec8ec45e166e48acfb9bfb2a68461afb11db05cb992399d183da119b860f2a68d575cc69c4ea3df91fa7941ccdc188c583cc819a4748a71e8b5873ec20fdca3f56ee50c41aa3d365d255363912b1e5603a847c50957746c41e16630e7bbbfa473ec4d621e6a832265afcd8107b18eb7f3ecabed84d21f68f3e3d85bef0606308b17a0e520eb3f4ea1433884d3dce74c88d2096f358f9a390c6cb2e81d8faa3ac8e9ed93c0b2016eb0dcfb1cc2985e50fcb94d77e7ec50fcb06b38eb7f6db59e9c31643f2b4e081a67e940f5bee87ad0b1da6c8eb1eb64b392efcc7b4f6a17ad8abd42c55dae72846f3b098789c5a8e31e3543c2c9fc4c3f1cedba1a877582ae9fced785687d40edb05e9943f79b2ffb30ecbf8a68c9e4c3a6c156a4da4c2b2c79cc3be11635f5a0e527629876dfde632a5d08c31c661155fabdc1864ad8270d8e7343c1c4ba13fc4372c292f4bd5bbcce39c1bf6fc29ef76de903abf362c1ea4528c30b239f8d8b0c4fcb9e389f1d26d6e0d4bc784b4a1a3c4839c1a9689a9a25a88a461b1cf4df1f5351a47c31e96244ed8d4d09b33ec9b6b134334aca49819968ef2a40f42f2f865d8bfcbbc524e9bdb21c3923fba3b7f4a67fd1836fb60367f6477246258bb6bc72af2b70cc33e696922f6535e1518f664113d2aff85cd3b87d8997861aff4a1a6f35cf8e82e2cdb817ddcd86953cd856d732ab5ad8f5755fa2d6c331a53e747af85e56ecf3f3d779c9259587b3d3346eeb1b05875a75e7f85254ef08ed29d5c7edc0a9b584ccd1c07dbe3f12a2cf149f3ec73d451dca9b08ae4983a4ca9525c3e8535c2a55de8ed9c2997c27e9ea57621869c954761951c47bfd7d150587a72eee6feb2cdf4131689325ec9d3a793b41316ed9ad30a277ea96ec292c32e624ee93fec3898b04d4c222529246d792c61f520878a1a1e4ad873f2f0fc2c625fec48c212de31473a5aea0709ab770a49520efd53f8084b85059f8b1a3aa94658d5e3ce9579707b16619f9813cb47222cd2f53b9a6f3f7443d8f4632c84cd4a72b0bb710204610b39087b92524a891b270010369b9db88fb734071b27c00fc831e5abf58a0fd65c891fe41c3c42657ab0781cc710af9d68230fd6bc9642dc3ca92cb683552aff644e1d495545074b5a5ad31c5402e460c979c2e2f8efc49c1200079b97560ea9d7c3e04902dc6049b51badc3fa9b3b0960837da3a72627c618e724400d96a4b5c133acfea948001aec7f97cc32eea6a81f0166b0c8e5dcfd14161d1f0164b0fdf84cca1c5ca8d4c5628f62f0e8e3c02b434f60b1858ad156d33e5e98bc62eb403cde10a32b965c7183a5ce1c1e84b462e909b378351f8f84b062cb1da6f6e747578cac62511f4b21c845d05f157b2857d13cc4c3e4a762f9983ff8388ebf8fa362318bd0e955f153b753acb63dd1513674cccd145b7d8a890cb534b795620f39f5b337721ad948b1998e249f14f3512c397746420e97a32e17c512fc64d246e58b1fe5a158629544bbe4716e2b07c516cde3f9133fc90ff927f68d74f91f8727969ec83cbe3d1e5dc83bb1471af761acd81c97e49cd8238920db5188390a926f620f73981feddd7c9e906b621dc9393c8913a152e499583a4948f11779b93f98582b7a86a46ba9927d2eb1594769f92ec49ac7b1c41ad6f579c3ab7e3d955883c48f54b2f49f3c94583fb45bedca24f6baee183d6dcc34bd2496301de879acd2cd89c43e29f5d179a41d3920b17dca271f2d474ef3887d3a94d0716f2d1cb17d983faad9bb24a6b7168d60a7af3ed3e58c58f2d407957355dc2c625fdd8a41a76e2d14b16f5dc7942685cc711cad4522f69508d99982a9ad470776afef6a2e13cb8744c7d5e1a4bef10c269654890c31cd765d4f97583ff5784849b9e93696d8cb3fbe0fa3442cbb904aec297e39bb622d8312abc6f9503aa6744e62df3ca97298262f893d4b538e26c71c78e78f482cb533f3f5618c643a4362ed1c638fa7b2b4abde6941c623b648bd1aa161c5e2e460198e60628e03958a921320a3115bfc2cbb390ffb446e0fc860c4a6ea293d65a739a2c486174ef603198bd8e6e3f032a975483daa22564f315814c98c689ef91578818244ec71a377cc87ea1f1d6f68b9e0b081768858b2af3be70c295fb0f086960d2f5c7920e3105b4acd8ec39254ab1b62ff1ca628d6a13464ee6cc30bcf1dc828c4e2c1c6ca14b743702083104b888db1a4639d762b0bbe0b1b2ef8220c533788a54376e7380ea973914a810c416cfe7b182af0c2048c8240ac39d8a74a59fe686504c49ab7976bcb839ca00426a0aa818c3fac29e3ebc385e98616d90a6cd4a801469fe0042a70c0771744006d90e187ad4389d554e1ddd03a5ed8303390d10793cd871aa1a7bca1658690c1877d737d9c4cc5ba3c8e3cc1c1fa07197b58e2aae4aefc1b39ee7343cb0609ba40d207197ad893680cfdfd0b1764e4610bc9c88a139d29050f0fdb77bc1ce251af557937b4eeb08712cf7176e4e847b22e4a60c31f0c2f52d082b7014609f402678735cce5f58c1cf266a937b4881864d46113ebecaf93bff82a30c8a0c33a5f214ac708ba51d42a1a1b78409e0d64cc210b8f7c5b956f24e6855f85e1851719f830bca8401118c890c3d6193df88f74e4ce7c432b0e7b1436369f4395efbc022fbe48015a40061cb692de907a36c7c8dddfd00d4ce04b502ae30dab664aeb90aee37668b1fa127cb101127441461d90e106374d3c48ea9163dc5c9a1f64b461cbd9371d77da88f1d16cc83b90ff18a22e1f0687a10123c858c39e73d88a5f744e0cd1d8c0046ad470c1177c02c6820c352cb996a3cd394a1da6e3d3b0f8c68f2871a1b7311741061ab694f9df4a1d84be881422c83803e9a43cf2308b171fc830c3ea713d84cb1452da0b4d414619360bfb29e620cedf84b5c8b0a4c74cc92ca86d8e0e29c818c3d291263644ffcc20430c6bfec891c127270c5bee09ed8c29a33606196058a74cafd63ef505d3c9497864ee6e68651464786149e126857a144f4a3cc0781a1b98000d195dd853996e9c0b311e7d9847c028410617d61ecb31e9685c07195b58721ca5d9194f123776b4b0a66da47f1853d4e06b1239c8c84271bd73ca69432b640e21030bfb7ac6cec7916a4711a6c1002368907185cd37a5143ae779f76719061956582e555a4cc6889974c280ea828c2a2c1ee54a119ab192375a640b32a8b06f075a17293a8e73143285edc398939f3cc8f167dcbff0a23f03240b32a4706cbacd936814d6cd1cc6381eaa574285c21ee472aae6d190bfde1336cf93b521d407f113e2843d2f637d7c549a734a37b4de041cc621404613b6ea524d39fc7a6dce8425ca23d14c3167097b7d8e79f61d636eca51c27af22b179fb63aa89c24ec61dd21294cd6537290b0c5dc7a0813d53e45ce1196f81c46e3a324d1b7638465b7e263dcdf64a19d22ac257d6a2173435aea10618dafefea9c7a244a6708db7c103d5b5d088b6e9a4de92bd19107610f7294e91f29967a1a088ba5baed403c43f4cc0fd61ccc5688a1a348aa3e583e87162b2a9563cf1eecdb7956e427af8793074bcee9997cff734a6c075baa93caaaf82b957a1dec679e3ee473ce314d9f83d5830b323147c2843c0e56550f3d9ba36fb0c5a479a462eef8e1761936583ef3e638fe2c22855d460df628951a1a3ba87049974183f5a3ef94d2e48efa97cb98c19e2ac6eb3c5a1a23e53264b077f8bf102d6ea3a463b1d9a99a74de349ad386c5b6f2f9633409f936ed576c122b8d74e82339ce76c576c1833cad32d394752bd6d8a1c2fc5ccd8af57427548e9c77cdb38a6573a57a6912fdb857c59ee1bbe3686d836a9e8abda33bca2b1b2a96a362b34a29e4c33ec59256d5a1d4d5dfe730c5d6a13c57624205df9462cb51a72f88dc248f428ab5238fe8d8d1ae49ca318aad826c4821daf5c77a8862354d795276188a3dc530a92f836c380f144b08b1947279d0a9b34fac316dd45091173b9527160defb56421071ea2a313eb7f5c491f2611b90e27b6d39bf42054881af14d2c1323f75372686299ff94fc4ec9c4a211c343384977918289f5e3bfde940313b5285f82930e557f43b6c43ebee571f471d2091f5762ad8e91b2693296724c89fd6ea382e48fcac2c5935853ccac937c9f37c725b1d74cde76b8476299dabe183d6f72e780c47e1fa4d514d2ca5ad83c62c9515fc48f7a474b318ed8434d96251b65a757d308674fef3eca9361c4da61a89c423de8d9c82c62f5f87c345d2ccdf02b620fa119a33c44a7d827628dd8f17b1f2e67da88d8924f8a61cb3ec4d261a778963cba14db10fb86cfd166ec901d7c14628f4e337e7eeed0df10628931ef18793965963288ed73ce838aaf9e478b209694c33bd950963407298178ec3b0e20b6cd09d5917dfcb0f43f6c1634722a8d943347fb61bb32318fa3dd87a5acc74737a68e1e3e2cdb9d7462a6f3bbf7b079df0761dd8179dca1873daeb24234994ee561bf8ea73b568c183af0b0a9e55063ee3c07cb1d36c971fd6d3acf14613bac9be42c878bb028297558bf32ce58deca3b1db69c597196e61cf6cf797d3f777258a4a3c91f73a771d8c2d56898e4b375210a87ed6b25c5f247cb94d2372cb92986667cd20d48a6499d1cf26dd8f463860b13f572a66cd8238d16267c14f6e45cc39a1f55944e93c373500dfba6ce9da3a40a12b634ec51cedf3f8f162ac4120d7b94d2c34b67f93b86f20c6bf4fc551d076b49a434c39a493e8c3165ca69a22cc32667eac1ba26c3deb1367265a61cd3630c8b84c91c26c761725cc5b05ef292d4fc916f3cc3b06a4e1ea6ef4830ace9911e5e29c58fc72f2c9ba464335a8e69a217f6389e9a4c3e1b36876117564dad9fd3b40fe2845c582e3ef23855c716f6bcec389f897a5aac85e5c22a7f1ce22cecd7f9242274879882854552474e2159e6289757582f5287bef65961dd891f4279aab0c97a54ab9c984bd315800a4b0a1da75c51ba292c1ebc63f438de5cd94b614f3f36d1651ec3ed240a7b54f82849d350583f64e26c0e31875f3f61d1103e8ea72aefa2c3096bd58886142e453b983461e9503c9432d1938f214cd852e57486ad470951b284ad73524a3e5931318912d6b99c7fd359e1139224ac7b96310761e4726411246cd3abf79b74c2e5cf11f69a4c76723946583a62ecb427497ff24558535ca7646af9a38c1361cb1d436dc4699d66089b47aeab10f7424a0e212c1ec68a54fa78371284ed728cb48f2110d608bf153c3ffbc15629e58ea3f3c1de79937628958e93c47ab06aff790e5230df10311eeca1e77c17f42c65f73bd87e3e86b4d475b0848a99d77a3a93e4c8c141887e41e2c3e0608f3942da90266fdc3758737d94c30d2b1291da60b1bbda52df4ffbb1069ba61a5999d2283a0df6d815acfbbc2ac00cb63c314f9fa254a7ae0a20833d2f774892fc51d8a462b1452cf1c03ab08c1452b0d82a644f6fb27ac5be216c5cb2cb77da71c5961b7b2b72bc21436fc51696c3e930a9f768cd8a2d6eea94e59ca61e5ec57a963aae547af87856c51a1be2e4afb421563815eb6c4ce9a5cbf8dda062eddac98ed8d341d49c6233ff1c2da2cfc6a4986209729be14ac4a3afa558c2e75baf9c781fada4d833e5e5a8f721634847b19ce8a9871e14c59a52e221c42e5f1c8a6d24789c3ed1415640b16f47da933a4ccd21f2897d52a7a4f531f643e6892f627462a90e54a337ece483184eecfdbfe9542f54f87536b14d4e1e21954c3c25ae89ad520e5357dc289bd964628d38177b9b3398d85762d5474992450c974b2cb19192e3f8728a99a325f64c152a126782af7595584334354ece15dfa8c24a0dc4a0c49e2ebe63471da51ce73f893d8e4ea322a7ec38e996c47a33151f7448de51e488c456f5d151992e90d8a3be1482a6203791e3114b25098fc34bdf71601d29c4115b9ec4d5a98dca19c346ec7147b510f5a1cff243da1083115be7c833222f6ec5a3166159b4141982d98a3843e78f3697671241f08c143e48f228fd0411eba6cb8c265bc9d2e58738523f9f5c9189baded07216d8b8fae2539002fea20386d83bcfa75edc9029c41a964b2fed6263629886093108b1872629c4b0b1bb73c774083106b185cb5f6bb1790a218620f6b3a4a5d2e3b116244863030fe8c28b1330a0468defc28b13f0204620f65f4d9a3fd44c918e6e6881114617681e8801886d7444ea833041b3408c3f2c1fdadc75d2e839bf0283a020861f16cdb9e338fc99fab0c46456108fd01ffc2e2c50a346175e940000a688c18755fa37247d62081672ec61b10f23fa471e47f46962e8618f03cfdbe9918e69466210230f4bfe0f2b35e579fc7a6ff5821878d83a4dfc4c31cf5cd610e30e7b5c5788ff9c25911e8b6187b4cce328afc25787430d71923627ef63a482187458ce3c5e0fec6331e6b0c7f192a44cf197e33b2a0431e4b076cad89d7772c24331e2b0c58ff3aa93581d668e1a3552d0841870583a8eaaa62184891962bc61896813d4376d45325686186ed8e6e3bd8b392b43254f1b16891d59e5449a0d6c7c6466a959af61091669753bfcbff461d4b046953829f32b7db42f0d7b94ce99737d373c1e0d4b748cb078ffa3926267d8430709b71f21a8de64508861863f85b2f8aed83801775182f30008bc046ad470c19b000d31cab05814f55c49ac43b01430c420c3fe1571b61e5431c6b0873badcb41bc20bfdd0dad0fc38b2eaa683080c6176174f12bd81a358a013468695c600234d40931c4b076e9a49029b34bc3995f881186a5f2fe3b488709be601478210618b60e9f8d310a6cd8380c180aa82f902a532aa64608d19c275c8e53f270991b5a54e882f36f3588e185652b25dfb30fedb7a30b7b382313ef72b663dcf684185c582d858b51caca1b5a2420154f5843f4e0d1770e76c23eb6c92c35fd07f9334d58a27c7498e38ef2e3334cd8aa2e4769924687ee284b582aa5987af01f24068b12d6da0f890d8f61395792b064fa9495ecee227414096bfa5add541f84aebc1e61b550b12433ab11f6fe709342988a5a5f16614d1f2476cabc3e932011d6fb99ab94d941e4794358424ab91f78187310732784c57363ced519bc4fba202cf91d5eaecbcfe1e804084b8e20b71a43e4075b8af5fbfec8725c7cb07c8f4729bac773a6d683f5424382cda7d457f360c990b81ffa7c9e936b076be78e2b524755534507cbc5dc10bf63e8f3e460cfa49ef35f69340607cbc7c58a72661725121806b841d12aa4301629ef6d001bd8719833167bfc3bce6bb0260f8b1c07fa03e00806a0011f3a0eea72d646ae3e6080192c1783872178e707639214a4806bd4f883bd30800c4c31eb715d100ceb772f1850100c0d98d4586cb651f4831c713ab4302cd6c939dd785dcc0e6a7fc51ee37d949acee72333ae5872b8b231a7e9f9f2b2157b64e21f244ea4943c8c157bbacf98723e6b17fb2af69c43c7518e23358741a38afd3e0779c92a537e1ca958cb22ff04bd38251a44c5965243a60ee98f99bb536c194e53b42a72c81ca6d83c0e6bd2c7a1a414fbc79c5bff2122a637c248c17b0b669062c9e51fe5287e8ca79aa358324dce8a29bd19a258eec38fa169a3297d704628f628a8ece72cdfec298da06046216bd11717ac6a80bd1b7e622b8f11e542f49e5872ca8bd11caea9c9de892dce6fec7c65d341554e6cb55731c5142f1a1b7880073641fc4fbe1cdd0dadbc199a38570711ddf5b073c632b15dd2ad5c63f127e577436f80c11060c0021a50a3c6e19a7c98810932724a2be91ce9c446b1a2b18109d00003ef0f332eb19a441bdbd828b1ebbca1d502a680033240a3cc12e5fca7ea0d2de240182af0c2053c811a35bef82f6ad438dcaa8a30a3126bf8b499a386957c277b61bebbb00025d6de4c3947dc968741a3b18107d070800a5040c30119a051a3468d1a60ec60c624d6dd107e153722736649ac1f887dfe8f35126b329fda8f3a6a4e2184c46a217e869ecce73874331ec17f6df8e49563853dc3117bc7699662dd479ea51bb1ed77fe55d9944b3d8cd8ab039dcfd9d4d1fdba88a5efb43c54c494d324672862190b4d1bd7774f4623c48c442c31e38ce66ce7389a1a116b7df81799e29b7188cdb33c9345ecb0aa39cc30c42a7abf751153420c9951883dd8ac7837153ce2771062d35de9da4db151fe044709c0f8e257f0193053cc18c43a316f7d4e7d96563682d89286580c65c940ac390c1e3bae921409be5080045cf0120083216056455ffc0d3038035089198058c452c26e8835e330e30f7b8716c62c674d37ccf0c31e9d761a95f3f3a5ae0f6b8a9223c44d7a76e8f36189e83869086973cc71341c66ec61f5d09cbe52d87ad8673fd5f97455f2a05efc4adedc693cac1b22a6eeec384821c38c3b2c51f52a07ef303aa753ecb0440f3cf7f67f9e9447a9c31e84dc04fde062e7af143ad04105ad78e1786c8860c61cd6ad914eff38f09a1cbba1557a98218745264df607591e3373c387197158fd2ffd8fa408e3b1d18517a422d08505ec30030e6b489d8c9df28268c77143eb4fe025b0d185174a63030ff8e29d1f027f028f40171638c38cc3bc639e76bf1a00f630c30d8be72869d849d98af3571b16f59024e58ea6912f26d9b057ae0c29af3a4230630d5bf02b13fb1c25a81ccc50c3f611cd24ff33e5e077c19bc046661a16bfa8e971b01816e25b00843003db98732687d00f9a61c619b6983ef4ae104b185e70a0460d34c3be6b617ab61b39f0482ccc28c3bae69be6234363e6822fc22856831964d83ecde5ad8ea3ee63c3055f8461a53a98318665cefae31cec3be45fb30d33c4b068d94ddc584a9ef8a71a6684618f1eaa9ac75c7d3861306c29aa6f731c6a8514ff2f6c29ebb42c743a5586d830c30b9b8de9040f8367e6ed5dd853481c9bcefebe1c576998c1853d463e0d3aa7c937675b58c3f73eff271b15bb90d3c2fad97d5162c54fb8f8b2b084e9d4661af5b230030b6b55f02dd51c532dda37665c614db124792fc244ed48ab00086cd89861853d6a0c76c9b2acc2964378b2e94c6655610615d6f260f919af327956900a33a6b0c434192a2b4dea0933a4b0d9e43858f930757ff870c28c282ce73955c8e951cc18664061d5f228cfb3dbdf4fd513f6ad53994b1f871336b3bc1da5e0c1237a601356099e224eca27dbd989610613e8fc1f7d8544bd84453b3d77ce41471f5f4b7d618612b6185da353757653719e91843dfbab238f571e988184a5a3f45517562e2a1784d1850abc386c90e160c611b618334dc14b721ca77343cb051f06ff176d8ac6061e9036c3087bd82761923b2ebb528ab08c678da50aafab10835398418435b29344ebb0a5296e5298318435247fc721a5d334618610f6c87f72d8891e8ec62e089baaa491cef18d850c4b18660061a93dad1f95fc4144a67861c60fd6958db1eaf8a59d333e587283450e3ef07bb077b28ae8a9926098c1032fa27684cc29b383cd3f476d7e9ab01d36edc20c1d2c7271391ed7a1755a47302307dbe7782c871f3c9eaca6033370b0fe65e60e3a6be952888d0f4305fd2d781b5eb85a0f66dc609dc81fc6b5347531c741024e818d1470a1c10c1bac5db936c4c95309f5ddb0910214a8e0d01935d82279dc8e21a41b5adf24c92a00021b309841832d79a68bd224a94bd253cc98c11ec683e6c04cb26182fe1b7db63364508f6f6eec1c875706082e62b167a974e491d6836f0e1637f7bf3ffc8a352207fe65193a6fc871c59e43f2abda1fcb909d566c1512624ea384fb9a157b8dfa6a5dfdabd83e7498fa97ebd3e778552c313ff55da4a95853b8492147e2ea0551b186cee936379c8718fe29f6a82b67bacb7899d59b62ed6817ef36c578b24bb1870d9972dec6fea021c5967ffefe83884c4a7c145b65e8fea8c390731ce6a258e36e1e8aed3366d607e371e05150ec11d5248647c827d6ed28223ae5c7617fed89c5a3c7e18e688af7b1eec45ea57aa7b1c389bd36a5ced146dc47c726b68f949286ccb952746862adcb19834df020ef9989c5f36cea0ba212721e985824565c4ea62eb146ce761c5fded9d16189c537850d6679963eb8127b976ed45c2625b6bbb4e1c6e4d2e5289ec452f123f32aefe0428825b17ad09d8ab92f05f33091d8d23c84f94da729870d2436c9c9bde0339a432a8fd8ee74d7039d89ec5075c412c7d64c73237e68b2115b4e5165c46251453b527f4cdd8bd8734e2b12f3a1883585ca133488ea6c9c89584b4f4534928988b5c39c1feb234941a73cc41a83e45ebb18616d37c4767d1353e62bc4a2b9924d4a8e59f090109b47a60e26759c52ee7010db590a1f6b193aee090a62898fdc193111534c30104bc7be9c103f454d3f20b60a25b172c8f6e7f0fd618b97692307cbd71116177ed803fd8f4f91d563f1f56151c99eb4a95197e7f1618ffc1172dcd071d4e3ed61a9b5501decda75f8133dac1e51495543f2b0e7099551b6be93ad78587b7b2d4255abc279877deec2e4f00f7e63d00eabce6abc8951c53445eab0a6e75056c4373ca3745822e5d88cd123c7c439ec611cd3fd0c1dca7572d862c8b5f5189b732216877da723d56b2ae61c071cf6fe9cbfb7c6c393e50dab888de5386f785099322be0c20dcb7818647c2a4ea850b521cbef7836ac763988e9612eadbfd7b0e6082be94836a41854c3369f22871f72ec145a1a168f1e8378baad8a161ab69f924c75f92c264467d832a61c472a99002eccb0d9ec798a3f291bf229c35a96e2e7c48f43863d0e939f438e53be099d312cc1a642c7711cf89cf562d8cce3d566863d0cfbc64713d31d574cce01067d2fff65559554d0035c7c61f3940f7bf1f7e3147d8d1a360ae7c08517b6f0b0be7c9a27e588766195f455b123c9b91e3d2e6cc97c379ee5f2d1b86d61ddf3ab4f93498b91d2c27ea9a23fc8e871ae0b6561cf281e5caace18a27860618f42f8770e6da4a6e40b48818b2b6c297d3ba70d6921d9b1c26af9a4b783302d09952aec993e8e3ba81863f29ca8b045c8f827bd9621848e292c1952c8b429ce87969114d6cdda8c3e391b226178e1c51736fe0426f8e2bf08a3701185fdd2e78efe4da11589041750d8d265b00e57e93c0adf0d2defe2cbb878c2165b31c5d4556cf2980a70e1843d7798f1c8f2838c8769c21629d7f258a7fe60160a70c184fdca827d702b1db71d13e06209dbe608173b5f3379d337b46c8001c6b7175fa4a01c2e94b077781f74decaddd0b2f18517c70631e62209eb4ab21ce27a45da8cded0325516022e90b07d899e69c5cc8c474c52818b23ec519fae4f941034624b27706184a5d3e7e0c2fc449209a96c54725184adc33c7f6feeb820c29672048dd5141de44f65808b21ec1dfafe88e77734a123842526a956e8b08fe341d8e330773d6d252cf0a20b13d800a304c9062e80b08a55d567ca3015c1f3834d6255881cfa47fa61870fb69c2fe8e475481139f760fffada1c95e491aa70c183cd729ce38cbf9dba2a390bd060000d030303a0062e76b0cae4207f24172f7eda74b0858e73f01d6fc86ed858818b1c6c1e965ee5c5d11c2a9455e0020746f1cc1d7798732014b8b8c1964f2f7d68927e021736d837495d74474f0df6cae990215cf798c70020031734d8a2f444b09cf261e062065b8eb34e3b8fa3dbb890c1f64192ad8769a34cce118bf53b278d9b9a9824232c96d095c9e2989ec47c5eb1d6d64aaaf5d415cb47a92ae57c722bd62c1d8bd29f4f772dac58fbe32066e4bf8a257e267c3c1f7f393d552cea917948f9a1546ca271b996fe1721d4a858d3729c6e2d89ee76f4144bb2b493bf974f242aa6582d74e8d1d84ffdf8a5d86a73943e8f0719627d90628f3b2eab8c39ce41687014fb4824a9c8f7eb277951ecb9520cd50e443f4e7928d690c3c8a991eb227e1e145bfe90aa37c4931c3afa8935a9dae79c8eaa234d3cb16f88389352504dcd9f4e1cb224574db28d137bb4ab1a43ba2b593437b1e7ca53311f598e2f464d6ca31e79851e8b7da8440b4522c241619148280c86036160d85aef0123160800102c280c46a2248ac3acce07140002492424321e1e121818121010120e0c0a0c080808040c0c080484c1603020100a8491085e4944eb019ddd69d34b19814360210c13ba84968230a178117af6a658bc8052f02cdc0864057761111666b340b22bad10d3a83d581061432582669457230f2de0020bcb408bca9a6e7ef2d1e115bf618f164ea2eb898f4b095d07bb6057c9edc19caa1e62481c5c99f9d34540afd159eb221cf158af9472bcc5e03e40ac075c2bf97d01fa855203fca9a7f2a94bb82885e56cd8c40e4567a5bdc622411cf899f6213a98d0caab082edcdf5528dd3e1b9157d3988e83a3478fc6246f604fb2cc00a7e1ab854797922fc3c9e0fe4c159e4d6743a7cf2837158eaf8ca68992383ece1eb6783d1adf9e7be0b7f3389e7fc5b4410895f13e80e07c7612c42627362c7c6a44a6b9daed125b063d012a4f91f116d4c4b7a3a3fa0bca06b87611e7bce910aec498f6f3b7ca30eb6b12adefaa684728bb3d10e4e6dab5f539052f089cbe9de8a89b655adadb84874c251c5f20af6bc87a3193ab4f8788ba8c6f479fa7dbbcbac48c2c0f0133456f612259e2f6b6145688bd5a2b4dd8c02d78019cc250efda0aef4b3f8c405bf5d659981282eb2d06bb0393f30b7a35416c1baeada227a12646df173bf39122dc4b0c139d131188a0e70e3ec7f1a178ba4b1ee2af287319bd52cb0449bd24f4c19a016dfbce77c7eded9f0e03278bdd0dd592503987506318d10e5314d1e99b84179937079ba496b70020ac47ff9e34f44303fad1965030483ffa3811c30151a5e600c89bb67fa10bdd004c2d7f205b0135bc8f7ea02ec5952579f8caa777881a48098071a47aacee597a0f345f1466fd0d4e239100dc9403f7732b4297412a4edddcb28f6b5b371591a7e2537b6777fadec55db9e39bd3d045eda5e869054e51614e629c0d6adb0558f0ab808dbabd2cda78a33f97790c4f76a7d954bd4acb332cef341d5c259e606a2553256e050367092263176c943632a631fe8d9ebd329369e64aa8360341354a0bbb150b584724932a91145663822d799eb38a3e2d8a893cf0819d24dbefa0f051c27a339f96df160aa17a235027ccde6e23bc0ed83e262ed6a026a11c1fb07d186e24fdcdcedfff47ca5b0cc6f628fe93a05999442139b33c1f212a148294668196528b1c8020584c29b555499a9cdbfbe96fc00b7674a329b5f70359b7e1a57528b6fee113c132f0f1d9c7a0327409571a28413fa654d682a8d689af7bb86d5117ecd0dfef7e5158ea8e007d73f5f9363d895e732aa19025c3c7e7ad8247bcaf024ed7c6d58e69d313719f823d22b3afbd53c789d858be2020847fada22bcc8b511a3ebdfc8626e1ec4060fd3854c2ac1c8bc9e518c13c6228c6199a44bcfcd79b473f6eb9b8c089b25e6f5cbc2e3c83dc5c1ec26a3d1a7ac7bbc6176911e7ccc2849bc0bc24f50f6d1ad6fc6e5d04e831a5eec6f21acd7ac0273d4cacf2b02eff73c13b62952b5d9bc02f0c99e6fd3459ce453c91b8b656a5f15d712e7f5ea0c097f5d9e3014cb2c16108656b782ac5a64d37d89995330acd1e9546b94ef8576a489751f7896cc15c5e0d532fe420addb0b896814af865138459c9cc17c968424fc270fde26d6259aeb9b2db75b739c7d9027f1baba16f29b4dfb2caad78f394f0a2e684609842db1c37cfcb8c766efcf33ea5b76318b68e501bd63fa77188bab5018c6caedd8d71171e4d7fc59af801345168e68e6c06d5aaec7cab5e83343bd6fa8e17191f0d263c21aadf53e470b15fd42313d4b493a7e646e2e7d67f125ef1f3cc09bd72e3ec18937db50102efa90d34301c4ce07b2debe745f441aed463b66c57215d64e08f88f341653c4244cfc51a5e8386396ec40df89dbe96b280cc6fd0a21c072bae607cc3d874542ca223e50f06b960e4c79652bc3eee8fff88dc00dc4f194529232028d9d50950350b89bdad642452e98fd2cf7a93261c2d28b2213b3737215f97dfe9ed82dfe7fee3ec4d54cab73b5311bee08c0c1b2a7021ee5f3d8e6a11c8f39caf15ac5c1e36da41788e08d17177b10cf742635b5b5d8164e836abc1d6d756fdb23ab68f5ef501ab5e8490a91c238f7e8193d5b2ac238da864d1f8242485f51fd48942f320066e90eed5c9443d4c08c55b39f4d30e5f33ceedda673f1a4826be78335547d1e870d8020265ffed6e00b9508a4f18960447c6f9b069323a6a275995c196fd9ac504337313609dc34073ead99878dcb0db2d14f2fbb82299955d39b49a4a3ebe5dbc39d69462472184940ef20e991a93482c827b35cb64a40857a69a1136e1910d14a657253d5d1212e25c56a207e9b9ae1fe5ffd7c25f1b753f21dbf8757a7aa9c10d80beaed6192a6922141a5e1d37e65d9dbd7c3388de8c04456578fd40ba82302c3ddb633401212fd570d3d69d1630a93f29082b06131a68279910248b1f9085ab287144b7faa1d2ab8b9c949d3d25a8e471b7eed14ef42705b94df35814311c4c741d1cabc6d9b84b09e2f6754d9f0c57c8581df8e897e7d6ebcbc32f180eef8bc474d238f0ff9900a0e0d5ef2a4ce748bf6675a807a82aa6a8fce57dff310bb634ff2f93d9327192a68ebf1e018736a11fed424a7ad6ef0dcda56d6280396bf66c28cea147d6ac158c710b1a151c2586d44b386becefad7244af7456b49526a354f2a7cda04cac3174cb29f595bbb94c12dc7a92a5952652b92da609b85c7ed4b886d6d6d7937f41ae84f06fa486c7355997e674de464915236d658f88568ac661aae86b2469b730b1aca32823c522be7e57a8ab2532bd42c7794e0241d2314ff7d45ea5aa7b42833a391095ab8c62547f8700f620366a8532d3e0c02289774c8ec3cd942b29d72519aa475e7dd03a4b52a4ca83464c495e59dfa5c2422429d1b27b809705f04a9d85c73bbc6514236d7f85e7fc4dc839207fe4fc8477ac6be0c338696d7ad6b705a5a3b33da98d463ad20d15a652f3bb738029e8a460a197a715f2d6bd2d272cfcb813424449596d9001a2431a21a1f629d56feffc4e992fa479058bb32c6f6a59d7310a9e720f3025cda2d32213fb7c56628b8ae5240e10dbd31d8d1834e035ff744cb4013324d91c271dd9aadc46adbcb9a59699675700ebeffe8660a3befe1a10080f56f6336c49b8ca5e7d484b7002032756c63160e173b250fa1f6c94cea2145b578d216ebb1f3d0a67e4f08dad5bdecca7de1c5e4307fe2addb0e1ff88d91c43d1cd574a71b0a114b864d4940085935a9814935b04144267e122f2df014def1e7f193dcbc1b9e930bc94dd9d3db6dce683c51ee58200eed444da7e426f55425b0844db245a5d197c467e4ace55704cb907d5e09c54a7ff6593ca5471ce47d8fef65d909e71b1271b6794dd5749f11a751c1414fe9064b0376f26e1ab6cc32b0545fda50bdf0d3dc10aa21ed9250e56127015fb86e6414be72aa4aee50196fb432f4f3cd450b2d2a6033fe5ca1ea727cd110f8d5cd21261ca4fa09946822a1b6ee15803632e8dfe07e49ca2eee46c338f9c8b8168c602c899444b110808193b999b86926be55b506de6a940e8708d168fd14a41d2c6684224921baa891b5b3b084adbfd3be611d7248fcee062e100357fd141354b2723c438001e88bf14c99dd387c44396831e48e2cebb399d70f92518281a08deffd76ccb6b3e6010d03bd4749fe90811f894022d12eec566f6efad4057293d7125bc0b70aca847d6e6a1c38c5ab54ab5122e53505dc230cbb2739b9d1396e900006b5cebd0ed3462c66faccd5e787810fa0eefd1959159932d28b5f82a2a2d13f25128a6061aa5f97a2e0a4ea2de53a0d8e34a5e5ac15238ea9bdd3e48b4f865211cad58bd68c9730747bd17c87c8086d52588cf8427d4fb7c2fc921425bbb5b0c64b1f7c419c7dfde6312a4147550a98cf49b0f7da7bb67b9da496e6f58bbf5a2fa8255eb492b178a68c89e112e51888824a5fe415c41b6e526e2fb912243b602ccdb17a5d8ad504bd3b417a3af9593d3f49347a6b143817987e8241d49cc32808fb100301c2c4c54bd73c9f49f58da6b16650d93559df116121cc42e7612adb207ffa3bd3859de2a7412066f6e1e75ce217404a806316e1ba2a789904a2482d1082776cf1db764d62bec6038d2ee299e7385ea33452dab2b943ab2a210f8017ebabed48025c2cb98663b561c6403b2eac7ff9c1d1e2cf15b2524e9413c12695dc8cb1c67503d5466113c7f683c1c33a7dc9b3da570ada0e6645220cc67fed1341167d2de809d280708b4e1f2d9b82b147f118a62ea9edeb6e2a5b8abdabe86e94e1e9876cb263b7df8d0ef54bcf12f1aa58eceaf4931090b57638edacb6f37177091e66d329cdb6762976a3b5e36e678ddd3f7658623727e7c9585ec7ee0fbb16d84d39f35c1b8546ad033f7937bf5d6f5aa583a6a75beabd83c33dcad18e9bd28718c509839880c524be5bf061fc0e504eb7dcbc39d77b4b8a6850e2898b894a747bb7a3c08b53d8acf3e2909d00b646ffd0a51817b1757929fa703b68e61f1dfbd2dbc0ac4343a00e189fba82cae152a61717cfabc30a0341e9e69cf4e3557b6c3a621bad05ca508a612cf4f22b6632f577a5451340e6085cbd091a059172d9e69e7cd98a5a1dfe97aac815a06204e9f4c612a1dcd030d07f022289f1497158afd531483cb7363df31ec639151d4f692fe458b0b180557fb4c3ed6d4c6839cecc6a31d4b8f4e9f4208aa2268218c1be3f2101c82636c2c3622a2b9c90e67a442bd63bae0c9b51414391b784edbbbd6af1a840ac12208b2f3b97504a7fbaf8369995648306c154f3e20947a03add1c645bcc5ce5eefa5eebd3161b8ae046294709bf222cd2502ce8591a8186f57a709047292165ee28b0b0e1711022988ffc6a0a6a9d825f12086b908086294fc480bdaab438d1167a71a7b68da6b53ae50fd985abc09e2c8885ac2dc1c412c81c7c738bb68a800ba59e65a8b209ab68b4b9a97a242a2ccfdad6e0176b49ea50c74f462550adf65697539e0003d16ef6063f5dc526601574c89663d0755839cd78beed0dbe94b77021ba37a5a6b2770bf9b9c0f2e331def1bfbcb3038f1d7d87b7541b1a110c1498689f7b925260389e3749b82f927adee849df571e57e363e5cd4fae870819557a351835313f14be1ee6f4197323f66d9174824349d4f8df2ac59814c30e2eacc1a6d0c664b3ea320534c868c847e9a9bdcc51aaa3465a314c9c56d3ad0e13d37780a1a484e37732f13ca5c48d153361069c2821587e9b30cb376e8ace6f50562c85416ee0761a9e648dc0f4277d674d725dd600ac3501a8fe268ac57d398f4c8722e180faece5452e61a60f32c80765edaf8ab3d0dbe46a0728521bc499ddfb7d782b4bd9b4efedf0f459805a37de144845e35619e78fc3ce8e0767ab6236a9a5e3d2af2949e547aaa796c08223f211a6d20a2f36d25544f9820ed1800f5549a399608e66bacd7955e4afba7a4d45c11e95bba0291e12dae0539f4c36a2921ef29e629da72e5412053b71b19f7f28bd9f2627ad034a93c844b6fc46e5b108117be4f9a08919c04821b9787322ae120522e4326f2dcc18168725dda1eadfdc7cd9d17847a636c8ae7dc52560124bdab927f4e7461b27cf7e448a1740b83b1f2f9585cf906527b9eb25c526c62ac2104abcaec81a166b0b4cc21367f63c728b636a307433a465f46d15d3c73c203a81386ee27533744ca82d8e00f53b4a08dfbc791a25be606923d05f51687cb617d68e23f52aba08963c93ccc5818abb918970ab35dd9deae1485ab0283494ade04e8623c33deece58a8d7e12e648213314caf23ba70bcd5467b72567399a57219b107b7ac3a1be83d473fb4b5f2d5276d2f50605efd0d2cb9441b2b04a367ffe9d119c14f1fcdf33c091a35344f1fbf3d5c5b8b45026bf75a8d6c57df4a0789ae5e93297d0d1756fba25df114041530aaba87a69a1082e95cef1e053cb905da12e8afa2615087d1f969014259251ef5b21d76b3617933b344f47cc57464d9403909d706d20014b4fb4b53729d62134c32e8925246255906a8733a325c30c922b2ae852227302125dd6e52e1eef9ffc6f00c350f9abad76ce9cb8234b4a65c4253b5cac79d7cd39d6d694d7b6ddb62bb4b2ada99abec8f4ab9484afa06328521ce0158f04232a4a72dbd9cdec67385b076811b5e44c33b646187b2d58bc6579f4b4a4d55bb35e82f6b431b56588e2cb13894019b748283ebede90e6e15d04e4a4339725d9583ab8213588957043487c7b352fc379999b22d2b96632cce2ee8fabd6845ba04b136e321b5fa37d9acdaa19a7a457e3dfb62c2923437d99b25178dee1bf264ce19401bab7e7f6583cfd90e68ac493149606dee5f801f838fa9323657ed695b9247e0ea1732e80d6f9d56929a8eba515c3515b570dd6515ed684de94afb636b9b230bdaa342f4e698a6c40b8e9e3a957872adf463e3550c7b13aaf616335334b0f43a7c83ac7168e913065924dbcd421c749d655a38531742197e6f664270b0b996cea7962c4a4fabca1177e52ceff87975e2a5a46be6f5db89ec0e58ad7fcc4131804b9e9ed0b1bd5e9199d64d3392d99bc41fcfeafdaeee32870be730dfc9bf534313311cb07864b586b00f86bcc752fa6a1e518cf5d7ddf08577bcc83daf7bed9b6ffda27ef7bc91c792c9b0f01fde40e2d91238d887990e38a81d050c64378295e873f055ea89f38acb8fd802e9b0131f44554255e2d4109914947ac95d7dab21b5c22a76e1b1cc3a84ae379f2b4521ab202adfd6d351a623335de74cdaf1d9f84e17f2d464e3f6bf6561f492118548dc5e0d52c1d59cea63411892a6e2629d7142ecb0488ab035b9e1e33779dd36a5314bf04a1816776a75e4696d30002414cdb5159219a443201328fd305cd7763ec5bc1f028c438ca069292484fa6d48547b5fe7391f26d3d9442cc9261a3bd1b78bc04933b8e9df6f5c00aa296c8a19ed425904f50bb49272bd3f5aca3eb6d3de3e85e4f1fd44cc314c7fd86213d41799d1d3350c180ba383bbe738e597cfc81757ba180ce554fa6f138d8a2864de09e747a011f1e3e8375de9f184d4982f75ab4fca6c4df7bebf708cc63256ca9a56e6d5e9f054befb954529d0b75516a08c571969748291e87bb01889ab2423255ecd664fa20308e9c65dd967c14967a530c42119586d434609f30e155cdd73ada3d5bb2e78d97e1303764e5abd583a48a7244f3912fe2558d52b29f4dbff1a4a443b7f259bf5ac5578202abe3945865b67ac416565000838d684ffcb873e0668c3c590f76c9c5f1e0b0437a12df2c98e967b17a34883605b90a16372dc2fa9be87b8390a0a342ac96ec4ac1ad11a55de49f76ba3145d115acee21c1995bafd76ee53c9aa1ce3291ab8d0a6e945e02521996824ecf0001e73382d151a1450b299deafb5b50bfdbede2c94e416f59fe14a7807feed2900d70b91619a6b0310faedb4b7e31446501ede4ba3a43f67212668a3e5f4fd00554c0397c6311b6c389c5aa304e87dbae5fff296ebe21368b2dc6cbb6402b80bb3bbfb5573ee1e3791d28337a70f63f4f23bf31b7c7550e9a1b98091da2284d41f58ca9555fe96dceb264aa127a277f84385165d4a4baaebdd825cb8a475b182407a64ecafba2009457f9035b144c63f103227220dfa2fca328542b128bd0cfab0e967eb715e5c8b877e63b09be77837343eae443f47ea31e3b6e37fe0676670a024d5dbe233dff2a2d964c7250db7241bf2dc8c59b79e46738f792beda1e8111b97ac271a575861075fbbc8ef97e6f802fad360fc528b42b5d8a42bd9c1af8ad47e6a9895964f2655f3d477c8cadd35bc403fe3e069c713ffa28d2e9d087956c4c14816ea4cb8e1d142c29870898c514873fa461e8a3f7ce1bd94f80398858612c9de07d0fa45bb81b86fe6728a93aaa878da7233d5631112adf055ff3e180164b3940f7ee67748ba1fa02a194c6a83718b4dc8fd3793ff0599f5a587ef99e189a53d077528f11295517b768e2a074e8a6a2f58128166870c88c5ae816e683fc66ae7fef88543e643217aa752165b6ae016f40bd16d25605a298f3e4cba6a279704fec0a3ea1acc9f0889eb7e85575b176ba4fe9629ade38d57451b0f76e10d6b9d11ad9dbc3fdc5ac7cca4595fcf92d9ea88b540ab51fbee3467b755e3806a88c243eb522bb560441959957acf795019e520732660b42269a9a01d501102face3cc3c4c29c7ca3f11081853321896937beab2092b24db87c47345f6ab886a3eaa1b714e8754975ca69c55c8a52ae172d33ad30e4c3e96354d5a315f8bb8de58ef4262a83d2b605fd91d713a45930d6b10e5efb55dd52c6cd0089a46da6f47bb6ae12e5a2e4726133b0d4bb63c398acf085d267f99cc3f4adcbeb35482ad4f799bf3e6f8a5537e0a10c388fc8f633bc663072424a5a7d4a9554195733c3e26c433d2b942d76aa9a3f1582ca502514963845a269f47aa4e0be216a1c353cfaa0b42cfe7b5f8bacd09463773cf15003b4028398af4407e4b0cd15e0841289924426712962e284894a7ac54b5104106b176e1ac9194279ad480293ae714a1f3c481a006d000c4dd88928d94fcb443ed41e5e2626d4f86c37ad43d3c172ab712c64e382634d7ced06542f20ae74ee74149654e0b4394af5d96feca7b587e855fa65833c2bc1e4184ea3e4aa1aef1b6b518deac67118f4235cbea5880dcdd818718dee1bf31bc3618ce25a8be4957e15abfa137102f943fb161e997b13838c606175c2431a79103f75f808a8646a24e5c75afa342dfd8309519463cf20e40c38851c5721ae819e88b6c309abe756642e23079ee75f44a91e14a5355c8f42ce2fe5db692be50c54234c723a94965b8ecc527c6a5dfb9478d4f8e53ff5950750611a2525f510469405a4ab36d6039d0c7275fcd550d65e38d5012c30a6c9e88dec3b25290a6fb7071a574189c8071d4762e1aa048c8cf43f8afaa7d75ee783c3ff3ba8a7928ecc806710b396194c3a8b1ca900809182ffb18931d59b9097ff957e19c70294f9832a660e925e701875f4c0d2ac259e286476f1d5b7dc45b60af6ba8183ce086f51d68ebb1c44ae0fa5e03433e670f47d0b23c618f10cccb0da0a91753f70da02490acd90ac350976a239c6713df1d94ffcf781578e519c69c871d519795e1d72fafd392cfda747cdac42a1a322cd4d4fee034d3592a3cd3bc4a9e31e83eceb3a7d78e621cc31c53428c854566f904a12faa31e85a088b574171990e1c92637461c23bccb45b242e509a23fdb0cd34e7e3ca3cc339c0989032808896e3ce3b2cb2fbaf18ae72e3be0d273fc952727a859113313f3dad34c4defd8bb2e7be8d6c3ae3deb84c23e60f2edd381c3ddf05ab244da72c14e7ee6cee7af7df9e28b0f358398795437b17ba7bde3f2976fbffcf8db47394b36d71f000c06719598cfa20e374c0cfd969b29f1f9acad80f8b1d32f645cb0c3eeabc85e545455628e549082b8179f8f3e9dc4996b9db9fdd9a73f7cdb596b376e9d84bcffd0850f5c915d2b731e0c38ee598b0ec4315c18093a1694128345a5a61ba0be0b879691293efef2871a6d5c9312fd8a471e93224e473e0533033226852c64928eac14529ac00547590671c0a2109c7ae3e4c6314772eee71f7ecb32b30e51d402a78a18aa115205314bac131a714a85b0f427a5ba7b2f5df4903c336c8715a6e7302f768ca35341293a0f30931614edb281f1e95a55ec3dd7a74c3a7bb4c397982ea58adc77ee3517dc76fb854ebe76dc3be73f7ef9d5a7bf7cf40bd7929dcf3aaf6f976257164f0433b333064cb25079648b0d038f3e89e1661ae07c8dd73e79674288421b4a2835ebb168b3ad39633e8435c5984119d304e9982d8deaf1c790204c91b8a668550a6a951a43a66b5b63610f64cf1416e73cedb11b0fb8fbec23dfbef6e9ab0f4783a4e4d34009a6f33fda9f99f4fa50bff69203b798775539b2f64194f04112dd8959c54882cb0cc640a722fdaab083e17dbb7b28fab9199c8629313f4bcaf17472fb988e584eab41801be278a19f2c2e072a49dd18df4ea9fc81aa256ecec14d3a4b936887f8fc8a93d53393fb7a9b7fbdbb87d942a059d2ee5818cecaacda34d414c99772609adc58e74f75fa39a631de74039a71ec069d5d92c654f58611a5885098c0ea4c8c535e11a8a53f49578e7d150703033041966542dfae77dcc6a95f7cf5d956bef8c160acfe2276594e6b0f7b285a85651a222e2a4fb48d6c01460aaedf1ed7576404112a77bb5706d6ba224b4795a8718c399a5a5a54e2de0aa73039a9317129631e428c204c85d307db533110eaa20b52b74606ad676ef143c8e1125aed2a4515c3ac78967e04624459d2de2254256b5ec42a4cde4811c7b963426a2e96639dbc7de4e34fbd61dc997545731a121fbad35c6931eab823e5a562a29ac0c471ada895fa38de6a1daad832ed459ed3b102ec6ec6ed089f480368263b1d94a31385945c422ac2b93295494e42adc7ddbcd0b95b0f75eb79a75ebbeca94b8fbba858f9239c6086b9fac88b9ebaf298bbcf3ffaf2954fbf82b1f28da45fd01e79debd0b1db8f0f0cbce7ac88deb1dfe8c1e63e7485196a7df66213eb821c42ecd7b98a34feada8e8925dfce9ee0de324b7d043162ec2846499ba7189c3d69c12c415eba9decd3866a84ea74ecfaaae540b9a45b029e0e445a0a3660b4960e330f0f0f0f0f0f0f8fd4c1de5dbdc911a4a694920456340be9c9b89632a594648af09d36c099094e4444480b7f9136181082320a500a5c0a271526e514fe3c63fd03b478f4a454530e9a32e70364b414c77a93450e9ecaa1d50374aea81a59b372e9f379808e1bf29bf7d63b40dfb6477d2f3d8f9fa40344ba958de1643ab73307a8dc297e8a6e591ca06a27671cbf6e80f69d1c2db66c2a0939364055c5ec9ee4d9493fa606a8f0f559356ed854d168800c9abe64c534a5006306688fb739f65ccf226d52b013b0a1850d15fcf0a20bb4a30236b450410fffe20236b4b061430b1b2af008ec04b430c68b82020c19202677f6b6e431a5dce9087a2420c70f1d1c381e801103e489ade43f3f8972e10fc080014ab597ecd2cb3fd1fc2b501d675bbdf9a2a7d5ae4004f74acf0cf13ce6dc0ab47d3293b1b5f1a65656a0f3e4a86ecaeeecee2a1021afe63edd5ba99753052ae60af9fc46beccad1c5a3c4a2133a94067f09cb37aacfad01515c8ab4b3aa60edb29d0ab753978a60cb90ac9c21468aaa47df9adb2145bda4dda2f2445b59e2d260b6e61438b73892c46a1c588eb172c3fc55a14dbe40fc954ee0a29e543c1c79c0e6b8d2639a441a1253159ebfdc4bad7edfd56425e4fb42996521f4c684ed174e2b52c6a9da49c309d9a8e1cd44dd4a1f15ae3b38645521389cf39ea2d6f6acc44b294cca6f56102e5957d276be91c5a69638b0698b2872c2ec164bf78e1b3749638a63c69219c7edfd52a51ccfdbc6b21b7850d2d8a24b2a004724526c6d8caa9b7746512c8945b7c27ad7a96f8b1210b49a03cecdd97a946862c22813c9bdc71dd9a744c1b12c81f7b89aff1cae1631d60430b1b7de306a680470f2fae90c523106a2a67f8e9d3b57f7bf0c05176802c1c814cd97412e382278f6f11b26804c222f75b66b9b439e40d0e1e64c10894a99ccdec14e6559ff30e1e14e8c27ff850c112b258047a66b4ea3ee95f3f8d16369012b25004327779ce72b25db73a894049b10ac954b6d49005223ec96fe397abc13f44327de94997b029fe6e88bf4bd525e985404b5fae8c914bb74d08d2c98a49d0109907614c9f64e41e6daf4c124415733a1decb4d4e903816e531ed45de3ce7f9605204c8b3163d93a98f8fcc1f8123597b67ef0639c57595ba9b60f67b692c1d3eb7df860e74eb2b9a3dae6f5ec211d62bfa86d64d3ad1efcf33a2d0bafd2561ecc514def17d7628a183c147a919348dec1554dbf1555bc847658b3534a12b76f3e7528f4df6218f1281e1d3aa93abacfe1a48387ab790ee79652b6b0a1c569441672c8f694faca8abdfd71e0f394a5c83d1c9aac952de5df60bab40d6ed193d20d98ab7c6af86678af0d29edba6c6da66e3236e0932c2d63cd4d7c0d29ddafb7b51a92de26adc4697093481cf7301a6a9f589bf73cc63f3ec3e979a511e6737cc766d8b4244c48a6329c1633244b06f3269d323c6328e918e29eeacdd511831b2f83cdcda6e47113864be5ead827473be5060c8e9dfce841e367ace60bfeaf68348d17082942b2a891d4a75cbb50962431891c21f687950b291d3bfda614750bcd5f7f95f0530b85f97756cc577f6d6621a1d92eabe9b0a0a5cfa9eb9ae1e115b6f816d3e12f87fbac7068073f918f24ddab82a5764a77b7d347b650c1f0614b72e656b5a44cc1cbeb3d9a14b694f44abaa4d652b428a031f85a9a50383707cf139ff2d6ab27b036afde9e6ed1572768bb751633cdc68cd81636b4384464d1048448dc8da441b34abd2c9880b099ff5c69cf620928b7893116d3ad0444487e6267222909a824d257aef40f09e8303b73973ec13aa71c019df332f1d3443270e306b124646104b45c5fccfe994ffff460c8a2086638d9c9cfd465b19e08a77422fd2795a4fefb10d47c5993eb11e5df238427e64be6ee49eed62090938727131754922c81e0551229a6edd89eff07672b0b319786fcf1411f421adb24f444ec014963a2a4b05fb2f2e3c1deef9ebea7a2a6643b504de7fa460c1f4cad83b4c9187f428a54d7566d710691450e10fa16f337e5d89d7a8303e4dbd98f8c07bd4dd92c6e507eb8cb29c66d40ba3efb3625ad013243f0cdc9b972574ce48517dbe387674183a27ecc29d962a69483011b5a68610109d8d8f1050378fcd8f1001c3c7474e16351c080406431035458ce48eb9fcb42b28e90850cc89562ba594c3d9fe5d032bb41163148cec3ea75638b9f39b4b28001e2ffabe4735245018b571057a054b8b4e6a944d2d23c8756291e3a7cb4ef18818e0c34018b56102e5b38716bd222480c0658b00231e17e6352958da63eaec2ebf46e31010b5520d56d6f26fb59ff55ac48b5018b542036e9f0eff92d536d8e0a848c76274f659f02b57231a9e6889f627ba640c41adbae4b97cff24b818a1352660a1b2105aad4d54a90348e02f99592f418c1230ae42779bd29043d14a8347de2ff91b67d675020d2eddbc855fd8933b6254bbecf1328f3968f93a44d38d37602e597d7fbbbbd4c7c9013e83e711a1af553b6753681cc90b33d9cfa60ed319a405e9ab09d39e599b8f4761413c8d9b7d294bbbdafd22510ff692b4e4f3a0996b404726d62ccdc8d29e34c2a81f2a41716c2257d930b25d0994a56fedd983e3e390974ea6db1ca2739425291042a7e4db6986e5f2c1709444a912ab48604325db5e2b6e6e7b2fc084454cb4a91328f65e90864089aa5c23f86ec636a04623562c4d30d1bfe628c4068ae90dd959dfc29ff022c16814c9b2b77c3e4ec6915168a40a6ebad1cceddc7fc4d042a3ee432885b10814c3a3c957c8ae193f410c868d2ff4b8ee914c2888521503a925249f92e2c0a818e1537fb77472affb063007b8005215071b2ee44bcf47ca51f04d2cc7ba2e9e645371d168240593411debbb2580402ed9fb7fb8429699a5f40a04a8b69c44db1f2fdf207547a9a8f3f33d912426e80851f6c3fd93f49879c3d4e052cfa40ac4c2962a5b42eed482af6d9597369e43cef0958f001a551d64bbcd27b407c4433bd7d625979d2035a3ccddd57a6f57b330f0839ad6731f98cc614c783da671b732476ee80ce79af324b0e93f245ed8052693697c9bf5294641dd0a6e64bde59ce0658d00191ea3b9fc48db9df3e87d68e2f7a7091b6043c4ef06375fcf8c1dbe3071673406ab01093a6efbd473f87d6b971837de8e842e5804ee296d233d7622c4bf2008b38a0e62ac74a05ab904d0d07d44fd4b513c1adac94de805a37f19942536e406cc7d25f66bac2c56d40684c954eb7aa7fa3840658b001397249cddbf6c5a0a90ab058034226fd04f32a4bb27a3520f426c4f895af76a5a701bdd1e38be97e0e73713420f3a5f4e59943c2567d06e4474b2627bdaba6bb664087cdd24d2a689210b365407a588a3cd962b624b2644085b0178325112b4ccc19034a586d4e932f279deb8801fdd9a9f4e9dff49e316140e7a43f44d39c65e94e30a0fcf3c866886a7e2bbf808c273b2e6a422fa07aacfa4b4ec97ce275019d728c613b553dbece0574779a27ef919cb154b680aa6ef9dc3127ef47b58054ffce69af62b75c960564f49224577356b5486101fda9a376aa92b355c809b0b802d23684cd919cec4a7f2b20767db344bad39f4c5f05b465a753c26adddc772aa03d5db8d4a425aae73cada6549bac4f5b0aa8311d5657ca8e023a6de5440a2bf797c350406c5ccd06bbc83929d31390f69566f28e7d9f989c80d47ca69fdad5fea9a423a7f97888f539051a369ccead62ba2990f9beb061b4624af1c69c89a44dca4a0a2cfb6cc9dd594671c6f6ab8f7d0893228abc648aa039cea63214e64a37ed41814d4c2aab9a8c347e02c939d6e9fd553b8c9ec8f3a469f670a6ee849d2869492c1372e2381bdb8307fdd1173771aca64b762551d4c46daaa6efcb847eb39572ccbcf21962a2bc9053ecfaca7eea4b74fa94e764d94955d81225916d4b6a729f2a91f8e74d99d4747b94285f0c61253b896c336be94a14bdb34822952b9120be97f8892577be154824db62d2fd11a506ddfc745ee2e30892aece19e33168b8117f85104346301a734eb75ff2527811c75fb48ac1abaf5d45103b544b699888bf92e58a39f9da8588bfe66248ee1d24a5eb109fce99e931049f33b74a32cdaa10cb6f56ba3c2178d778bf95977efd20941c2dbffa8b6405d15f45ae104decbf1388735776d0cdb00d20aebca7c5db6f937f60ef539a4a4fbd1f4c9bec2f5e5925f6c13f39399fe343ab2e6b7e324e234662ec016dea4cf366977a40dc588d9aa48c39de260fa80ad92325491272c42e061ed0b17ab63b9a121c62dc01d59383c724413e3ba0b3563bceae53e5eec4a8037add4662f5ade5f2cea103ea3d92d04dd17bb63e271031e6808e11e492dc24d31d93726895a0070f0e983cc490033a988ead336a7142a231e280d2ccf339da1b79f79243ebac8b1870406d18b99cee9d99399d43aba4186f40e6d5243ce92595e9cc1c5a5ef0f881c3abccdc808e5efde197d47c98d4c1428c36a0d7dc3ad75930f75ed98076530f9ba359e79ce11a1056d5396ac5edf94dd58092a22947d359d299d24903cad763758a5b79b9936c88810664899b0c92a4a9e79767406698706a73e457f7b41950699792bdd67869885106e4a71cf3e36bcc71c44286186440e8c64a7232a631e7bbc70878f4b0808e01957c3d6ea5ddd50b331a628801d5926f56b6debfae1406749feed4f52dbbf0190cc89b147efd4979b2ffeb0b31be80d212933c5fba735e4f0b31bca05e7a88bd1db39d89d105548924533e19d2070d3d87d60f2e36c75d20061710fb3176ce770f7239358218ffac5f0c975c5f086268013dc1de93ddc6db56b40d31b280febd1c37a73a5dd04e0d31b080d294b9277f9c4590cd1550d529a2c93e469dcf6b1a6258017d2a668e7d6b1ab1b50e31aa80ca9cfdb74a9a6b884105443a09132d6845d3e499eb38438c292092cf263baf7137534b0171e984dec758cc653b0ae8f858897327d54bca5040abcaa96ac75359cb3c016132e4bbe899b193844e40e6e9b9b0ebd76aae35017df14aa59c7326a0e56565d72ba7796909e89439680ef36955ca520242d2fa58e59ce429f71470e346552b622401a9fe6ad66fa6936b7e0d888104bbf2d9f7e684a88f6222887104645c95fc31e594b0e61b0125a29a59faf8f9451d0c318a60e428223e621162ee10830888943fffe6581468428c21207427d557fad926392960430b1b0e10023a8990d253beeb58787268f9e0e1058e1f8bc336461050a2b3feab3766167420a0369cf0bb4fbd21ffc3470f1d8fa304ee5e9052db408c1fa02687d94aeacc89d77621860f502a568e59b13af27c775488d1036486cb68c86b29d7646d6c21011b650a317880cc5737de253d6ee678b1ee001b5ad8f015e8c8c05ae0c60d28c4d801f27366d4cd922be798c4d001dad2c57a3d93c7c801aafe334df9c5a592f59d27c4c00122a758215a90cf9dea3b4e887103945cdb689769378fc585183640996e37bfd3f2d5a9ac016a23a94bf1e3d6d258b2108306c818d7eca9d3999ae46780b20a5f319a9698e6bb0c5035e6276252493bf8270608dd8c5792fa642e49c68001fa7b262999d1fa5d72382a4b0e305e81f664f26bd25abc48760ead1efe43c70f1f3a24d0fea3078f0cf8f0a1811b372601c315c8edd6d4b5e6b602359fac74c4ff58518647d2b03a006315a8936622a6cd1b342f890018aa40b5756c13569d6f729c0af4ddece64fa5733835a1027fd7ed0f2b932925f0b15b188c53a0b5d6eb735abea42f4d81cc3db393a269c9ff622950ee3923c8cf77e3068ec2030c5220235d886d12625c7b056314a8349bc4e6cb2218a240ae07c992923a5d49f5a140c597d27c9de7e2260705da4e45de30e727d6e49f40e6ef24762cf5c7cfb92710fb16bf5a2db64bed4e204c3baf9c068da6ade604fa27468b94bbfbd9e24d20fbd76d3fd6a68b7d3581f85877161bded596cd043ac8efa653613afa8c984084f1d83b0b5f026dfacdd66f3575b3b30432ea9cb2a87297315b09e4a7ac144c3d058d984209c488c949f94652bab9a6006312e8785696e2b33292d24b0215515ebfec23788623814c1dfec45b92496aa421814a21bbe5153ea960e2472052295d29655c373bc911a834baa93605bfda9c46a0ab424a9affd3985619817ed164b2c6a46af87611a84939d5d87c6e53fb2802156424e5e99844207f2dab88407586c64f5cf510e8980d8fd1ffb83e514320352b8dbee96791942c04ea4d4f42343109810adae12bb46f34a53808646afc98923da7fa0d0581cc4c7a4c6dd2e136be40a064d4983ea77de3490f1008fb7072bec5abbb727f40e9d8a8baa5d8cbc90f885871e26ba589a4724a1f5055e25ead66a5392c7c40d8eca94acb39e4b9ca1e5062f246be0d1ef622a607647a9cf2cbd14b59a9f28010ab64259a2d3ca073d6decdad215dc9dc01bd75196bc26bfc2c7640a6e92d4b1a4260d401a1113c5d8ef177ac663a20fddb74c95bed4ded5ec00930e640c81a27a31c52f136a4dccb1db5aab6b0a145008600230e48ddf54ae6f597bdd312e85181fdb10b307040a87d9c6be84b3c33cd0f60bc019564548f298d29997cd204186e4057bcfea8f5c61226c34361b401799b74e4bdf01630d8805232789c64f121fed9a93c60ac61118f78e9abf66f3578faa4256d1d9387ad555bd8d0a2340037809106d429b7306f317eb8202701061a9071d72e87142fc52bfd10609c01154966c93189141c57806106c485651c6bd9acbb2610c028032ae51cb229b5694de066811b37bce80247824106e4c4b639f94d39ce547268d50a608c01915fb38799afb7307145020c31a05fa2f5258996e4df1706d458ba182ced2789e08301914cbc761049f9022ab9b8ddbc87458fb61750b3e15a72d8bb80eeeb199fcd692996c90b156c915c40b5dbe692926eecd406028c2d20b52e78c5b670fae482630730b480cafb1af4624c0ccdcbd902ab0230b2804cedb7c1b434659d093300030b55eafee9d8d416e6151027dbc4bd6557abdf88d9d8a2019e810da0c029b0a302376e68f5e8a20b1c190a1856407efa0afad65b5f371f014615909ac2a7f8a752e9cd9b0a5b76524debd0820830a680d4f68f315726cf4bbf00430a889915ad9214df552c5140589598e55954d37b1917604001912e649389af31dd595cf4d0c08d1b4f48525faec5b41308674ae37e54df73b6b0a1c5c155c068823bee1e572d2cef4ce0925eca8dc97589f3125276ff3eab7ab32aa1b78e73a9114cc4f1cc1636b4b0a15bd8d0e2d014309280d6a4a3cac5e494534a79808184c593568f9d7df3e91ea178c293644d6e61438be3040c23a0420cf922202fb5edcf6e4af9729a08c89c244362ca878032cbfb1634ca685e84804adaea3f9235e6b64c10d0d71773ae7d933aaa40400195ad65302517cc2ecca8c427ffd73473eecbe00c4aa0f2959a9cbf43b6243493982109a45c8e9564263b1228793a2bc45d3319ef101275a3663ca24ff992e92c96bb637268a58d2d1a9002940234821d3abc8be2c20c47a052deee4b9f322783de3a4ef06387f7f01c3b74d412663402d5714ba89b0a6f5a22871128cd49cec36708df6ee72250f1f795462f7098a188dc53f8fb148fe902ed302311e8ec592f392f57e96a7c2002952c043319534ca2dbe90247ef7045330e81b26069755556e2860b6a31c310b57758cc6896b0e18207e3f8c14e82c4a304330a61f493efe348818e37e4c00c421cc55210ab0caaaa313cac3243dc4c49306310c8ef9cf2df77ce141e51c18ecd0acc1004c2f6d37bb5be73c9cb0666046237ef9ca4069d2005660002d9a25d6937ef48aaec0fc856dbf84cb18ff519c10e1e5c980bccf003427d36e694269bced28fc07fecd0d1075494a453720f0e330dcce003f2c3bdc8a5e6ce33ed1e905163bb7d26e9ebeae5df0466e80199a6d9934a7b7268e501912fe74de6f16c19cb71f4e08107f4d5b84b7e9bd17377f80e1e5ea4c08b0466dc013d1652aceacb9b724e7368edc0b163d9871dd06992b22eb51153aecba1e53e7aac170581197540a78f9f2ec24fd6941e650f98410754164fa539202747d40dd38c1e2f92436b878e5238430e282552c8450d0b5f57870f1d27401f3dd60256de6680197140a588c923c7368f9e3221cc80033207cbdf97413fc9f86f40bf67f1d2cfab78d9e40684c95e4f39e9a60dc89cb09faddd49474f4bc961061b103b9a9b530c63fafd1a90db3972d29c613d5bce79c20c35a024fce9fb8ca5ccd2990674fd78ad9a120d2821a275e9fe7126de1990e29534cb24a535333303aa2e8926fd389ba45d0674bef8dc9b53ca8d1b9f6440dc89e95c3946be983106540ca76447bf38c5808e49dfa6cd3b6b274e39b45a6d6cd1001b19c01dcc08032ace6cead5e4bb6aefc0804e573a63aaaad1fb9c195f409a090b97dcc3640833bc8016f7f2da481bf261e283195d40a97964fbabecd74710667001253c692571b14e64ff1c0a7800070b666cc1a4641837d9dd5630430b88fd70e712f763a36b33b2808ab4dbda3af11c5a27e082870fefa1b580195840d6985ca6e6b20b1f8b02ad1e3cae0133ae80fc4d1b93fef9ad80cef9627c8b25e9cdf4552854f37596dcfe0c2aa05478af8ef6c5b2eccf9802f22cefa658a5ce457f86147acd767d1410d77552c55349d51e0aa8b449d62d2d8619f9092839dec924fd85ab2427a0a44ab64ccbe9c27a9a805cbd4b4143126316c304646fce7962c86699185f0232df27cd1957a969ba12d0fb2a29e5e4af902e4f02c22549fe7876329f8d04d48965eb4bdbb9927d0454eedcedfc59eb7136022a2c6ecc0ce7e1c3dc45407afcc865d52e5d9e2602e2f24e66f3d80d31d54340698cfd6e52e95b2d0b0115739f528e1e0e026a342346f897f0963110d0d1634a591935999e7f80aed58b70abfb0065a9976497d0494aa90728770f933d89ec392e0f10af15d593523a89f7ec40cf27f4537e27e9005defdb29c4edf808a61c20dc5be3de55c6885dc201426336e54f4b3740c50e92e368e992364936409bea0d72f3f7e17e0dd067292de6e424a76b1a206388c693a7266aac67808c94d46fb3bd6d9e6480989cb3c718ab2b78cc8c1820634c6713e3b2784967c0009974bc2435e78375ee15a85cab3d6632d575e60a54a5a0319ab666dfac1528a13b31638af0b5a96505baf289f3531b73a7d4ae02b1a5dddeb2b4e9be5581feb092ab36c64b9f5381d049f1d1d73da840cdcf6693f1163c36e714e8983d2b571653a05452963bdae7764b39a54007efd94bf2953bd7210532da7c79c89b61451f052226d56d397f554a2d0ad42619efb62f4f323714e8245ef1763949271514a898434eefd312357f9f40599f581c53319e407dc75432e5bb4c39653a81d2154cca09444a696722e6ab0f8d6e021937e9c938f9e7af544da0b57a2ccca7cffe7d660295bda6c2cfe91c3b4f4ca076d7d532de9740c7fc244bc9536dba6909645dccb94bfa7a48d1ac044a5557979c90c22431298134bd5609416753fc9340bdf7c5eebbc9ea2449a02584cb6b22b7867c22812a9f138b1c8390409ddac9316d649589e1235029974c7fe9baef26e808b45dc4be8a7b23509672ae54f3e1636146a0fb82ac8560ff3e9e4520e289485ecd3999061581f4d4762fef1ddb542e11e84cf314ad2ba6e90c2210927d236577d64cf010e81cb6fb457286404e2e2d3d91520a81ec36eb70d30a215017296da7e52efd933208c48ce448951e36f7a40802a5765ddfe2c99aea81405d76f6caa49b4cdf804067fb910fcfb13fa036c51883790ebaab9a1f90295beccb27f26d8dd60754e94cf93b5cf88052e936c53077195ed903fa4f8428417e2fc494e901152156b0955c12bcb23c203ef869ca1b8398c8e301b55dfed72964f32ddd01d59562eea57d2f492a3b202b756790904f634c551d501566274577239f4f07442e379dd7d54dc6760e680f276cb265e480be9835577dd525c738a04ae37de614d91e28b802c8808355c11c5abce38bb72adfa163043b3c3b20e30d4cd04962438c61299a430b078edeb1a565b80121b6ff573262e1f4a90de82061d3cc84460abbe6d052c10fe31d5ffc1140061b1033d936bffcaa57e26b40bcc93edd1d0baa25ab01253f8388f56d08614f32d27098d267d2b484e4f8b1a3c840433df7a77297fc4d2b87960a120e52460432ce80ca4997d6adf9b2e2c5f6d8227bfcf022c93043f77dca8306f94a0fffa1438b1e3c18d038da0b0df4e0624fc0a30bc7c08e0ad8a500de20a30cc889a96225eda1ffd0d18303376e74e9f1c30b1964405e77ca3649d6e3871745c618109be4c4f91296dfa45e8a0832c460ce3d16b424393070e3c60f2ebef0e13d6edcf01e3cf8f20b1b5adcb8917870a1802e7c2c076e9c6007ba71a30b1f8b0242aac70f2f0670051961385bdc6dadeffa9b1e0c7a976b79e6bfe09b698dd9fc97f1829b42dcce53ace4cbe882e991543a996c922f830b79cbe64f0a9e547e0b8999560bd6db17e35a30d5b3374ede9e0542fc320bbb0c2c9cdd51c7f37d4b57b03ea44f997b5ddeb54299f28caa89346f9e2a202763cef3f88dba0c2a74a5f9c4e693231f74195358829feec9957f9182617cc74c788e291e05b3de49937aa23971281c6bd5529a1862be9f506fa7b069b26d2738794773ba0907dd30c1ba8daf9c2544b39750fe4e1db97238392be149da4efc8548cc7212ca2f294e9cf8926f1909e7dcf0c1d373d6f0110a1e23df899dacb011eed39ab3529e589c8a90b2a4f4fc670827119293e8d6553926fd0da1cf09f94afa5684f069b16c1e3927966404e1cc18d35a090895cedd71f22be3075ab7e844edf2cae7caf0412a897b99b8297365f4e0d4933b24db0b57060ff078d934cbdbc4d656c60ed2ec18c63746bb56074552d2d33c96f61c193960abe49e861c193868ee4c87b89f308f8c1b1c9a21d89e47860daab9322d61afb6df915183d2fb68f0d891410392582e99215f7847c60c90dcb3953b4c4a8e0c19acedf162ea185c7d4abf5fc5326060eef0da2bbf21e61597c792b139abed925c91eacac5ec8a755b71ac14e13f33dde4282b8e565d9a5578ea6d55551c9bc77b4fb26f9a0ad63d939e4b5191f078a6861a806033b85c5cf9f42f8eba438d3f20a27ed60d313dc964a98eff2fb250c30fbe04c9973ba47c151b5b48e0c68d1b370eef089c8bfc438d3ea07f5fd72ca42bcdb7201f90a9d435b9d8c5d3d3e7d04adc0352629aa474d29b1a7a40e53e1f359323ee97efe13ebec081980794eacdcab9846a085e9ea1061ed0513cedd4641cc950e30ec84931e31eaf3c7bdad10ec8f8321e67796154eec23aa0239cf44c5fd9534c313afc4964fb8dbba439a053bad09613f6bb1a126ac8016195f2b6e5f0fa9d741c906795472ecd9352d23c7040c7ecedbf41262495e937203b2df78798e7156ab80195c3982c9d69e71bb3d90674b298da3676c5fb5f6c4058ae92d11841cde25f0322ca56cf468b7c262456a8a10694e56ce66a08ae91ee34205357d013091663ec1844032a66de4865a5369dc737851a67407dd7fba9df8df0dd87a0861930e5976aa04619906bb21bf452840c2869ef2b7239296d7b8f4c418d3120c44be6601ae73d4ceee30b1f77821a624048929615de796483240ca80e8deff4319554f98041cdb99a45bd72387cfca0c6179097cb2e6d55a95f95e4d0621d3fbcf012f8f8a28617f64a121c3b7474019912b573cc59e5a30617901ad2a6d99c7cc241cac6160dc81e35b68048f9cd2ed2ab4e3eb580ca52591f5faa2ceead9105b465e996267595166a60019dc23ec7cc3059439a548d2ba047ef725c9bcd77cd6d68a117851a5640c594f112432659ed9750a85105a4ba6fccb24aa9804b0d2a20dd934efa73824caaf0126a4c013939e60afe9d9502eaf463e6a4bd8d02c2432f7ee55d53b587022a666fecc58dd85dce13d05e4acd92c70f99f19c809009772ab7b63ea8d10464d09cd3a996340d21ce0444d23176775d4b40fc9eae7b872849445709a87fb732c939a996ec3ca1461250498457097bdb7e9a4502327cecbc2605374fe6088a096a1c01dd26366dbba4285eaae251c308e8481abc2b5798d27011d06e3976c4e2c7c64821022a93b24cc9c512458d212072dee8e9279d0c9a342120ac8469eca039ef948154d408024ae32d9cf2d9f6d42427d40002eaf2bac79f3ea596a249a8f103b4a7deec377aa6b63f3e28c52595f378be08357a80b2bb7db70941dec449841a3c40565825a91edc6ce3bd036449cdb121ff49de9ca40364c94b2a17ac465bf40bd4c8015ad2d8fe777c6fdc282ad4c00142537837bdb2bce0f11c5aa546b043478e2d7ab8050c046adc001d4f4becde4e9a1d4e6c03e4c8b6c99bcd947e52a306a8da5326fe4ff9c635736859f9026f508306e8bddc2af7631d34ef376edcb841aa94116acc00652935d5c676430ea30cd0eab21b67efbec66486502306e8b0df193c245a948d0aa1060cd09dc22687132efe1ece1ed078057ac79294311db9422c3ca0e10a94ce9c4e5b4e296612a756a034fd33841871b5921e051aac7052b64ffad27e875751e90c5f9e73d66e5471a7b575324db9f154141744bd52a35e8e8afb4e4908217d8abf743ded3485ab19afb13ba9af4ab1e69abf34aded9831529c4dccbf361b4539d879482ae8bea94f14c594372fc7882735a128529df893a5b3c620284af91824669f28b76692a4e3867862dfa42979ab6e183bb18cfaa5b358da3f4efc31a7dc14e6b3ef4dd47963aa1cb31483a434710a6173a592a4f3c79940dc35e58fefbf7339269871c91e3bc698e24b1cbb64c8d96458737d2da17834e929c52ba1040fad24d37a990a254e7d7ed2620e2229982651c79da0ab1f1a43d09004725bbd52f69c69baac72028d489cec733ef9bd1348a0c44bce53ad828dc71f81bc4e7bebb50c0a341c81ccaaaecfbe614ca5df08a4468f31b53a4fad244da0c1085496a69032fbb40ed05804d23643da3325621229ab17a0a108d487669a8b1569cd2716a09108c404b1104ce53422d0e9abdeaddd3d9af6d8214e4b3be2672ea908d0300422b87bbd7d5e40a31028a99fc24ba490da43635c408310e87055f2f119934913e6d0e282070f2f70f0686d018d41a03c472ef7de2a87160b02112f3fabef64879fc07bf0e8b4018d4020c7737a10af8ffa73b128f01dde0310889c440c17f7a6f125d680c61f905d6df154aa6439a5cec5fa0199eb39cb3e3d70f0e8a3018d3ea04f86a4662a17d2e40b3e20fd83494f6939b786387eb88f3d203e5ffa70225cd8e0ab1eacd51329727c9c434b471e9049a9128d39b6a4b9c36440030f8834e3b9d3677368dd01f9ee67e9a5b7d2e97c6c0eeef18517387874c580861d50f94f24bd67db0f73e5d0aa42a30ec8ac58226933ad405140830ee8d19194deec13d09803ca44f8bffff80b1f3e74e01734e4800a971127cf8fedf8ada3871744c78f2f0a0b68c4614f965452fb21969ceb83478f421f25601d3f48d180033ac3c5f7cc574d199e37a0be42cef249849036e9065430ad88da9e2c3c886d407fbc35b926d36003328ee5c971d6bfbfae0155df415229dfd5607b98244f03f2f34ed848ff99636334a06287dd7ca5d9daf1730694a61cdefd2427b5b231c3a7a9d34a62a934ca80f4ec0b29c30999b369900179e284ae78bc917d2d8716e3f8c1c517fbde651aa0310674e6f3eeb81d2fc9ecd01003b253a64fba2bcba16500a0031a614046cc3bdd612dde2b9543cbca2440030ca84ffd92934afbafff02dad7f2e758f92ffbf35e40ea7fc44a8fb13ef95d40249163ea8d318b478d0be8f83269725bbe0574de28396e9cb816509383b6edbc6a4e7d16504a55f2c997361650faffd73166eda9b1af804c5339a4945b0125263d5cf9bbc495ab804a252ddd3d544049cd216726214fa19223a3f116c2524096125133c44e97d3514045c97193c98edb24430129516b54a2c9247a4a4f407872536721bf4e4089acb729b9699b80c81bd4dc73296d19b34c40a94ded3e53c94d5cbb0454ec9cd8a3221fac3f4a40e7ed24364f56fa4b9f24a03a8e59fb674c52d7830484f97d58a70d359d3c47406ff678296fd61379344640279993ac8974115067193684984c3d452220acd4d56f4d6fe5a74340460d4d36132f8cc95408a8d22ad5ee7a393ed32020df94ce1722b7f97220a0425ed194ab5e73ba7f802ecbdfcbcff101aa6f732644996c3ada0344ca114cbb26fb250b0f703fa5fb71addc01d2ea93ebe5181da0dae4687253c1922573802a8d17f77e441ca0538e97e271833740c78dea37361b7249364066db2cf7b4a72fba3540c9cfa598f327999a06c8c9dda9922be88f773340a94a4e3a5deaf5c6324079cb4790689ec495628038b38d9a4a87060c50692a1ee4645e8194d8596ef2f7d8a5ae40a4be34a2b1335bb3d20a94484c2331fbb888ce0aa4a470b1ef4f3e645781d2f0ef9c7c9715b22a10d964ec47fd244e9952815aef18737e893529c750818e5bef9aac534fca4f8108a399bbb1e925854d81b66469df4c9358b214e81331cbe58a2952a0b3ad89989d51204e3ce39bdaf81c92a2407cd2cb71959eed54c80e1d38767cd1e3ca01334281f02e5566df2e28d0b137be5b4431374b9af1096485d58efd58b1bd09333c81b6e8e596f46ff72f09875e61462790b95e3af8584db4928661062750b9a6a97424fd697c7363c626901fde54860f219dce8b26d0f14475d692aee41a365f98910943def196f42e61434c205fd2585049c932dba25e987109544d1e991c63b6d07b2d81fc4b068c39a864aec80269241207c4c15038180ba2b97b00c31408001034240d8502c128ce54c97d1400034f3026362c28121c1c121416100e1a1686028130304c1296c600402010068402a290249b41fd1c6790c2105e3eff7eefc8eeb800340589602e8a3233c914f3a6ff5f7d0b1d1cbafb76209fa07d3df64ba1cea809067909ee8af795287da61574ced69a1a8b227ab309a272ca69c74a9955fbf312941199cfad97a6f4bc515bc300c6a665fae77ffe307422e233988f2bae23bc2a98e0181f58f223d52bf7074a2932b95ab21ac304199b0f29a11102ac0f292d877cf5811057edf1791084a3e36edd20d29a880b319f5b41bb300464cf73943465fde2d5237343877c2927322c9ab3fe39e722b76202241b630f97283ed2564b036e81b1e76b75933b19083ecb778ff6b9045a46fa9f3e404773783f756672b43cc0522899d03e8433203c0bbc8c6f3280fcbc3f5398cafaa39d647b4f8b9afeb60bea1e7bc40e35ea612625590df5fb56c58c5c9dff6355d4f1cd4230a39e50d1aa27a66b84c40d02abbd48a0d2bf025c0485abf16ff637eaaac27185e5a45a1d0d9c3b0935a6884aeff3b435cfb2ff070a80e7255c4c4b305aa575b5eb46995612c442c65b12d5e16f819cd6fd6aafd622ff1310fdb392cab2ec7f6af598da03f1d4a1d2770328a19b3723b20dd14f79aed7d035b1dda078999084dbd1a2e2e5ecc51fa5131e5fed1216b1fbf162ec05c637e3e7b4fe8a88e52e4ddee12909f8e1b59676c96701bcd81041ce9c6a87b7a2a405fac37e1ce63300c432887795502b127f05605ddc5be39df9af3569876afdd89b94cca682a22864e042e3943be61291a7154560038e614c5ee84a4055cc0c35b484120157c0d55043bdc16f88c55b61b8e8b785a034104547cfe0ba238ff8215c2b668484ec26343aa152ca947d11fc671872803dd1f042a18d1d59e781244eca361bde8e8159446db0956c6944ccf7deca70a6d75fa62217bf7147a14aa753a6430d459bf1dcd09f74e81a00561e0836173dcb33ccf9908733422aef23875f5717150ed1f102ab993894b4acd571a42205e7535b427c59847037e361626dc91173c600a91f9f269b9b8ca435fc5763889fb585409606253ffed4257d8abe5a001a86ce11b97e142823282b72d191568ac39c9a490e38d6b5cf130f8c70135080a1cbc5bf99877b6e77c4d3a739329ad30f941c31967e0b4602d0445248b9a3070ede13378d059e875194c394ef23810adf64b001703aaff965fd5b6c43a455e2284922bd09b38e160e15ae5106d77f0e6315e831619431c636a8e4681283e2c279146c20823ef1a470d69d830618dd7b2b73e6f9d1520b74a472e4ce879d34ea435f4ce9364a3ef0c53c8acc83a851ee3e365e2e75919c6d5dc4db45b4c3d31a2bfce6f8ec825a0006c5e91345835d2116919ad014c8ddb5ea0cfb366b9746d8761245d2afe68ed89f2fc818183ae0edb2814b3c91a24abb8846a41f0a757ce420998e4691874424ce687572762370c61c9e30506a21a891ade9b40e571549e1bd7de6d36ae8ab1e636b56726a239cbdd840330c2917796510bd13946fcfab3aef7f408f5b05c879949ec263107134a278d0d813028db6d3f3b5edd6078a49da6a7fec0d527ca8e4044f2959c6c13c7533ac7899e6662e77b702ece9eb7ee6854f1437b7bfe044e902fd8c2e98453d31fdc6611121d65557200b6023744abac82cebc7823861c190b0b88889667f0b2dfa3fb136a3813421639b1115f3a30c22591e305c120d9ab2b68b0ed6cc9209affcae334e2234073ded009c0194656f9658023c27f00f1150ecb24540f4bc16b55fbabddb26e9c8cac870aefc89481016d757fe93d1325a31966c7dfa0b05eeab1718c937c659e661f13e7b556c2f42bc2a55885652442afe71d75d625e02cb8a6825ac101b652d74a6574f88e68148e54a926fd3029da4f02163905bf9993cac9301ae58982775baee2b2e56dcd4ea590599a9996c855774856865a9545831e47b952c49058a10ac9c63fe6abb3f9c72e665418ebaacfc40dcaa8bd3b59098c37ddf4282a5a0642841a9f1bdf55857bb0aa0af29eb589c18b37642c9890078a9294d4afb28f7a8be4194f138c1d154e2cba520d128bddb4cd494cb314878f51e03e473544ccae9a7b581c97474171caae7e0a4790004c601f83dfa88b17f534018af8e554a2de26a179d2ad7d1f4a8d19c21151852610344a5e56111068997c1e3344e541a5ee2e72a0ce61971093dc88f0ba9b8e247708ebb7912b936e0bb62b068a71eb0b928dbd6cd9fb9c62dc887bf352e50ca538a1b47686cf58031fefa09b96635e2529d8032e2fcb84146ba42edab80abeea362b42966eae80c7a3da1c3fb93ccce545575edb159ac12cb22ac63a7bd55795e73277cb94bd45762fd833f723b8c721508daa2c07cf51fbe48253108cb4792fdd5ea5912e9fbefb5657b7e437694c47f0e4fd57373250e57c44389fc884a1fb4a564f1ac13d10be2c921c49726f10f9a9ed73716cb4f188d2940169e5c2d2f16f79d662f3f7d0f51cb8abad662207f91ddc714789e32a618eed7abccd16c75a8107618a87c53e20adcc680ad2c071f78ab7b9e917c706bb0bfba94127c83d6a1c46cfff8dc6a37e7ade405710b060c8a572b9e56dc126dd9943b0a236a2932e59e5461dec269623d4c82b272793ced195b4778ccaf6cbe8b6c170f8a89c20691017c904dfa80c0033695c222856845402d08bd934bb851dfe795a17664debcb48294c9ab876de04868afdc78bf971939c8050e6c37ef36a3c9763adf4f51c0b74eb549d5b30bf508b613ce465229dc54716d08906a7fffdc4b2e1bc66eae24188304617a34769d1f5b7aa7ec3336d28f70261119586e6c98f299e6ec17f585f5cb9c79849500a4c3c9ef9d56eb51571fdea9bb80b3ebaf5f4cf365cf3432dd09956e4bc28ed56c5fc449bd0511a5653bcbd6182a6c37d794b9b256b8ddd610d08fad89b2afdf17e40470829b406f829ccc6c37b5ad3c851e9bee80f5ed44f5aa33130283060b2ff375676870782b4f6a08f208eaaeb8d7f90be70b83f2367adf89eccead27db6aabed7c5769d2f70f9c177197d96919caff697a229b28af506fc20bce29b917867766f0dc48c915fce88ede02976dc2e8a1c485bc4a4a1beb78f01ecc9f5f803247040013f4ed98e2a9c1dd26cbfab388d220868e8a956659bab4c527223d07f163e401a1bed135a0f50a1e1d44349729d379687a8b3ea38427f2f3cbe00e3aff59d59c55de456a9a2262c559e6356f914fe987918d0d8dab2fe2e3c2ae40601527598aa4b6163f40fe6fa27b183102dfc9379ee5da369f85c7446a6bcb6bf429f13c331aff76e6db7d4b341a136708a79e21c09daf75a4cdba4b5349659eea390886b9bc74c19ac7153331ad70ce4a3289ff6600c1ee94875c00170db08349103d2f20b54f90bec4292f1c4b61bf91c1a1272aa8de2c6d244643407fcd8e054f9583bb79966220242e2d2fc56a9b3f739a03226b4499652d7705f1dad57450ea6be4af8d701b2e632a498259233552c5bd1cade21ac03d942cdcc80c107957056244b3ba90876a6da9ee03e359323d1c7c2bc4f51494076b28d2131827502d8a84991354ea1390431bb081155e8eed407e402fd6690770d0911151f9c9ba51e947102405f37ec9e186ef270e54dd879536480a501441534d137a52727c4ca7bfef92b423f9dbbf4f29bcbc2f9745c889ee13348fa5a631e0c8a9cc91507b67eb8335f0ef45a89604c1f44de0a5716cfa14868d88a9ec5212f88a9f0835d0a2ce049db38fc9a837c3317629e212d3f9ca0c85c0c553aa4119c164c6043baa0395989b19ef1794c9d8070b43cc322d1184942ec8dbfe0a4ceb0e4bb3a5a1289429f5958a76529a507dc3261b87a01e2676f00b267fa23c1dd93e7d8e8895e444209df8c6b14e9679af090755a59b939ee8d88512987acb48146b3d54e2884f94173536f94340b470d9e9e9a4058d1494736c10122d5282e9b485a585883ead72a23efc443331a3cbf58fdee25b6438adcc905a4f16962fc4d941900ae03338e129831a1f2aba0b686c88adb0a7de16bed13321e0480f73c230d5fc011ffca803acf3a75c31139cf76e291b673247616e8a403fe8de49490ac0a7a39d23ea749454937671fe70ecdc783919fbc7f20caa132328fe7d01c8133e0ba2708c3a8620a72e5d9ec952fc06022e7fc435ec4e200738e2d1a71dbce6b776b5ad1fe2aaf07b1fff7a527a71aea60d362a876828966fac4164264c30a49ad17c3ff6cb4a1e6e5f81cd3a8df272ad8c64a195015750c8b35aad8138d5172469c6e621ca08dd194736c19f0cf67c4f6b776ea480b4fc512961370ab68efa72c71f7862915276109a987fb3b7f07466af806a5aa43a31351ba560c1d53f30dee9b552656bb89ccc3940e4a50376c3b314d6bc2913e0327770edc2062a8ba318af72f55e298eacb9bbee5ce93c920e9ad8506bb5a3a7af222ae247a14a487dfaaba99c43e24a2ee611617f3586a95a65dc405369a771b360901383741ab4ac55b04222177528bda7bab9678f1e8aab5f4b904e444764a584aca7dd373648d2013713f2f072cbbcdea48f470491230dc4ea243975b3ec367a08d658175063b52c8dbe1cec4d801ed248c1104b5358e1e97fefaf494742c224239ee5cc48d1a596f58d0c7d6cac169ebe4210ed2eb6690b924770a4a06f0331e58529c1e0398ea81f51c272e3e5fd586e21107640d1911263b0f931854c599b0dbb26651d1df18aa955bc719c61bf3a54b2f340ccda84aaf4f3521df8b03d972821145a75ee3b705639257bfe4670e1b1bc5d078a52b91b7798a340cd7db80474117e2269264e924b570b9bed1579fd27737b290833af5af80248983f4cb94dc015d57a2eec2e009e86b2a4773236b56183c300194a7b20576277fdcbd16d1edd01ede237de41ac1265db5332e112cd0e8140173d1c07d578d9e88ac77a3c77441b26c2f7ebdc3eab1ecbc9681c04bdae16d1f801b26f7e16bd72a399708cf8f6046045262dfb8f16b821b2a1477a493f0099f839314874f38c74c1f5bed559e8b2f64f8172038c7e89fee47ad55a68ab1354976f806fd69a21d249228dc52c64b202c96c8af5ab902c375cc516dd0be381d9701a15799d35af89895e8a20d4b24416b6c1659766eb47258d8c713588e8d577c1a3c9452be45170722f11683ad5de1db044172593e7c8807de52ae75c66ee9326af74a9c6521b0b84f9a4524de317fad942f6857630ba62efb0850bad93ae181d2d8083a0c95d3f083169a001bbe1fc73a8c22a99e5a453ee8a403eab4055734d9133bc376a0e7d4667b180e30491db76fb9650e658bb26e021e14935616e96187a931303be02d4cee11ecbe46705217b575d3c722cb5390c85ba43da26e40c9876467b4713d61b5b86e7cfc1ab528d9d15517f89fb3dfa471f0df9fbcd446fb4b7150dbaabbbd6bfdd7f370495bd657a816de1b346316367050362bca562f1711a23473e8cad4e311875d3ea2059a27ac74e5e5d3559199fca26a119653fce1f542a6eccb20f6462c27a3e1cda2d40c1c743db5492193db38a2c98974ef2195c3f07a82542c1ec803250a18b000265d25262776a4c6ccc647c9a48280e0527e3de3372211021a09271763cf561fccbdaecd54b04e4b3c9d0fde8e8506fa4b1ad66bce2cfe1f82018199b40fa258f49aaa174eeef59cb14ed26e03e4ddc1992a9275d279c089dcd8de130bb8d40a719ef7ea7e2e4608bba01f89d8bff7a8f512e8e28550d30a24f33f12f671268f493532d6eb4fa5adbbde24c9e4641a4deaa5e99511a9bed56a0987c644f3c23015960d16c1e72b2d34809b032056f1446641c8c13043b4a3aa349a92bad6f9c5e4e3d2d1aeaace51cc489631e5f753c1ef553ba73ee6d3d6fb1fe2883a50bc1aa2fd82ba6774c5fe9a187022e9f5b7d532a07755e4a0971945b8ede949c4b8588bfa0fe0b0c7e9a9b207973713f13bae8fbca85f548ab156ba508735674d6c53ff33ff62d71b2720ca04587f28253e54c5fcc05d50a200ff50b179de12eca37a0e973fe56238b5ef479c76628c2491306939611cfde89073165ed32604c7420739798c6c87a200c1808c43d20a59fac530d5a02a2f221f5e3052f50bf120d34e33d189b865b1543f8075a9923217522bc800363d4952b86a02f49fbd2aeb42248c3d3316198a420273547efd6faf41693f89baf70721801ea0eadc8ea1af0b828cb1bbf806812c82929422a4a8deeb255a02bf512752b14b0a9ebdcbc659782446329f25fe299215fdc859288e9a5021c8614dd344d2d3e4806c45086b61cd955438aaf2195c36f8efed1564d34e7e72bc8d667db5e8dba57a9af4794fa9475d7b0f148771e8866853617c6c76caa46d4dbfdb308a3c949fa13284abdb8b6cc092e8cdfc1bebc48548f145efa8933cb38b88295a79afe9b4d53bf3b5b115721d1f22f8cdb5d298469d9520a51b57ffc92fa458ab4a255e8cedaa67e4ad0422df067a29d6af5e1281465705075e24e7053e757a56fb18348e7a4367c5b54cbd1cb555d4bcd486efbef206e3a361c182d5dca09bfc3b310914d421930a2334845b19208d12ce867116c790678d1179d3fa68fae991463c6ce467e47c31caa173a44e59daced4545fc5b8474ce155c004291f772ae4c556e3935a9c8a6f390b999f846b4338bfbade35cfa1b83b8d62681f06d259990845c452eb1603eed6225c5756af409645c3c638e8c80a512c16c714ae13a294bb4b8eb3cff501b35df780f1cb457cf74b548406e8c1be8ce5d0f47a20c7df6b1cda01eca170a6ac01a4d4987e8e519d1cdd83474f8c0397e60492e25bdcc47f2ac866c8b4dbccb2e9be2c914c9307c7b87044f3a8194e9e881399d0f141044cd3c97fa82c0f14276560ba7db2edccb9b351ea88e717a2ef727f584171b61d829738e8f48f26b04be495ec7f3b01cf2d3ab884fa013cd6e742c196d712e61e73d6b82befda387842fe8d61044811b46d316bca633341020f8fc92eaeeb335b17dfc381dba4a3e4b006a3863eb2761191c9bd275186059e719f4983601946f13c0ac0043eb6030e64dc0d8ab138207d2443ea2a1a421906a5f5b61cb6d2c58492661185f90104349a907bf304587580c09ead3e7dd592b4189d701caf3432812a1440c4d0a6e5c6cdcba4791eb545a21deace67d8e8479a07c8a0837c2ed88bb5947e89e911aebcea17e01591382815b71c22241c824dd8791a51dd8ff799b330acd874c1d505c0b9b25ca54810abf4dfdb7715c09a0cf955c3266cac7d04ab66ff1d45127eadecc611548761c0a77ff5a46f0d1b5ac114bcd5517c51d75c61d5b1a6c2eb628d869b153876c832265a14663db913623934d20033d41836b796c8e89582fbb4385dbfb50c1c94158b45e5f92e9001ab01919252db957512635801510efdb2c4889939234a6078472f12cf22f177383405efaa7b6659f1bbb20a3a23ab51b339520225bee8d209501eb249de21b37c5b261695d91cc195002370da6b9779a8d853ee26d960294dccfeaaf31d6381c0539a56ea4cc08634846823f9610a3f77e41c68d34e7d17d4b47f1b5f75fa2a556bb322a24c9b8989e50b8a1390a561b62371c3c44e95c4316eba9a67a754f664ea1583c7b007e007871e3a698ef29b6e1255708c5469305293f151c4700404302f6ef99a8342998a174f9c9547740a6f00086ff1e3b4aab6e39113cb0334a68d56e24d9a292fcb50eef8d729dff5e75930e514c2b8653694867a746fec094dcc0cde7a5936d4256ea0fc39f09368ee8df6b15c4946f207418d655f8234c6b661add6f3f0f03abfd9cdadf39515605d99c0266d65f3c936c4d79b116319062a11196748a73baab6d915ae172f8ced11cc35801964049331720e939b65af7071a46c341d55d5b684a3bd5dbd10131e0800e5eea68b1296cc22abc5ebcb1f0e05c0b2ba079060478bb1cd953acbe66718e3328f73611fc2a6ce5e6641728a4c97681593db471a0fcaff2d65ff29c68a3500b135069320105f3f09afd2801fa7fb85f9c66d262709c30f71b71206d71669356ee2966ba90d9796d9eb2cdf012b83e0a8652bee96af46b72cafbd11aeee3bc9719e62e535f10ba4613a4fb95de3280ce9eaceb299306054d7121de5a0ecc2494495a49cc92c442524be283442d490d24c99de493c0197ffb6b7253c94f930f93a8909244f868b2283e1b5cf6e336c83f8fea1eb47e641f020792a687107b9cdaf85b4181fc71fa12f7e505a76196d11fef346b6480b4876f8f50f563762bd06c4b1ee179acf448ef81e751820f3b90ea3c343dccf7c0f3b0053ddef3d9883e0a3e7084e02d9013251bdba40a1df940d2aa51c2477432e2bfc10de3bfca4dc48f3a2fd5315cd892e0c010ad11d34cc570431eb41f87b5c5e5ab770ee094d9297d0ecaa49c38c4040b6f60b3d359ee16f35077c36d3ee1efaa06965bdfa48cca1909613149b8688bde3340328d50909dc0d2f339c90d79917b5a5fed5e009adcd1d85b2c5c5509435accf689c43da65a009bc9305c15f13c24a28f44e2b567008df7b7c2fceb5c53dbb0c9856f12263961742bee02da30805c519eebb04a3e38c3833b7888fe6709b4286a94f3c1a7c017f3d67480e3e89cebb86b2fac22dfcfd97e77993ce6964cfd9ac0d08ffb462ebf2db5dfdd3f7c285974f437dbd4b7c9cd666b9c59d15f96a58cc78eb182eb6b90a19a1be0723b4152cef8e242c68fa8e11f0b817fb5468866f63db16acded3e7c9fdb655858be62f3112ef1e5fa792994322d4778a514f08dc0f5ca836bc9ebb3c39867fca5265c5a5a0088f1aad6c0f669309399281246831bef604342fe58338fb03191144bc2be16bdcc4586527c05cec744b75f1149e2dab30429cbce06242831c5857079649854d4d65b2650d790a85e5f230be0e5ad566ec128fb83c786c11b263aa0fde0df272804020baa9b737387c303e01b2cd0a9cc37b82c605712a65e38dc5ef921298a19b9ebe6ee921a6b6570e21ec00e543df1ee120126b34e120f171dbbf4d4c00fd2ad0bce9be26714026286d7a8eef33b6660c78e906b048893712731b73a2e2f4447c8b23584730b19771d0ceaa3838d558419a2ffb7ba296890b946c0850c37d06bfe7c25dec2a3aa661a016fc50423a1dcf601e86d66f041b6a0ca86761c5bc1adc6684485ff9c5287c0b6df385021ae3bb791753d8c5a6054027c32318ec40817d4ee0ce2f144fc0ec84aeb084305883ab65ce364c09fba21c5a7f3c8509a6b3922324be847a6859ea696fd93742680ae0f8615af70d2a0e07c80f76789635ecfa5cac8d709978900c4ec6861b39dc5f2e03c12e74e694df1265cb20af109588fc2e8e954a511c0db13e493575fa4b8b11401fd23e78b32dcbc274b8a914c27b278042349a4296f8c782283200a0c84b42652df9b041036113134820e2529be6cc0e19314d9843c12fdc72482892c1379f6465278ec4452bad29158ac70628ff196045a363142a2d7dc2bf289002ea38f2fa96451c5532130d546a26fc58a5934323905564ddb91682a609b57d50d245444fb784a6148968a48995101c1ee50ff906a4150002826389e91809491c15fce7e8650483b2c7b57bb190542dfeb62349ed136b2ecc7e5edc6223b1998b0acb3d62b9eeab9a5c2fc8ea8df38eee7b9a5590d149aeefe1eac60cd03d358f02a725c2554bd392cdc4da6e95e0ebd19c73b71d27bbb34553b619c6f956ae9c609f468e1a78adbf336ebdc0c124a49b84d17136e69e349f26f744b2f0eae27f77d6cbc3a30a6fbe69940a76460d5d0a5d68d6d89d038380b7aef72609adf9bb3c5c50929da0cec0028272e3eb66cfff7f895fd8f891ad965366a0ef95294a238e236b9a76b8453f0c283ae536f2cde0c0ee120e05cac5b52bb62ab2947c9cdc446724b8332a2135760ead1371993aae6a8ddb1b4344a1000f02b1d4da9d2e2404bcbb90d25642d868f668f2ccfbee88c6f14dfeedc20c5e59317f2cceda0e8e4c10bc39b313e0095da2f8e8345e4f097bb701d1d55d73caa61aeb52dda7137b2e4969081be5cfc81da57c3b74c0accfee665cc83cf53a61c51ed37c8d9055ee57eb047ff744923cdf8db688f0dd7a86282df27a9438331a9b3f52189b806b3a0b8328b8c24f66f624d7add0c56280180e6c3b14fef3f0ccf06d3ef1570ddd1486e39c01be658fd49f11df59fb88a919fefe3cb05b54a77852668d8aeac9748be92bd34b0a392309f81a0a82214e70f8b41b79a2dc9f0507fb67aa720e669d02ae3cf88cc4e7b5331589939699929fad514e725231b7d49079f32c147321919e954cb6c08dc32530ca13da1b2571b02f40a9d15e7f5244cde5ea7a8bcec1f143fa1a5bd3234183e772c8d197df9cba45cf1ac02579db9c37032329b9598ef0163e949664a481aa0d9657a024563726bb86371a08c9ceaef40f1c6141e382313c6e828a8df87722ad33dc31dd51ab94e5596a95e41aa655f3e884ca20ae56815f30cf7bd6bc7abbbbad0d1ae2f4eb8ac81a7f5c443546d19de8129285be848a684d735e58469a1e69f12766723626f090d4d4b1652bdf5327cee7e155926e0990f54b9adcd5d499517be0d94b5ea5dd8daee71758f04c4a9b5cd6e829e2db738f8da3216cf5adbc06905c8818ad52b11281221878b16aa18b56c2aa315340e5a25c5d3e2eafc5d7e50b6e8065ead717b2afeebc87cb19ed6365f5ef809d516ffe16c9d5d8eb5ce02ab95558e564aef82803568f8a48a08422dd53167ad4bdbfc20290ecc21d8fa6bb8ba0ab6a46589a7eefa3a42f534e1743241d2bbbc0b03787d749190603fc31439d0cf1aacf2ad120ce6c6c5fb20938771b149f43e026432cf474080e8217e3dc47e0c511f20402f001543c7c0a1379d20b08eb3d318ba2838e82c47049dc022a2b9be3973bee24d27cdda6072dc1605fb578e0200c006b042e51407251089511120224a77e5a10232514ab2ed5db605bc142a9fc8dc0665540770518222190a19ac91d2e248a01e52e89a8642386e7fc0b8cb46ee05db80a92408f2b89529cda8f45cf17401c6591f1361765f5cce8f9b54d027a587c61fe5f71b4cd8351a28a8c3d0c2c204e4115df068a19e8732b8f85d1f862875d60a0386a43b39a8eccf9c30da8c02e9a3ed3aa7960bb53126e72731639b03f77174d957388b3c5ee0733d10b93b7f5ed162011d83c20549d4507eaa72525e509b98cd7555e190222851be1807da7faf66f0c07a92d1ba2343b41c2576de37ced509d48046c42e47b0399181f8b9a0df6bec0c394a37aa4b6664876b6b8f64b55e82261def4d82ed568a46acf1f8176bdd43d45226309518a373521149b37dd170603b771fc059397f43c93f9e55d84255e5b64655172090541a1b582917b6f62e4c8eee873c72768387ec1657482b8829975a362b13eb815413f674963b7c2a7df35a666a6eeceed566e8fafbe0dc34f4292a57333fd7dae0eac8083a601bb8247062b4be82f28ee06e96183bcc0180b8b84503e10c806a45e5923ffd2a2af88038310048d3a59cc5992a3180506a37cbd5a71f2014e1fd3b1840158e20627c5c80f3dbcd1f77b95e0b20cfeebba0f8ff635f56d4b383320c9f633916929378ccdec7b6a5e9bb83048b3442f566cf41846231d301e062a937b0f1537a73b7b6672450809d83ee153f5a3ba8c0a14a0cdc09a8d116025f91c2460253c6aeafa77b7851e53899e4cf958f8881d3f7bad43df94afe5097805c870f280f8fa19638d232ad72654fd4fcccf6c7f8edecc8f5fa5bc349c097ad2cac83cdd1ee532418c57bc6f963c97ada89d593a8c5f2457882840af43c0f41608cf998c0a9d10f702e9907e0fc6b1086a815728337f41a7e2e77680d4d5043c7beac03276a13d429be36c00d32154ef99d77ec4b30fa5077cd0983996eabbf63a2bc4ab4e661d6dd9a32a85755f32f1d9c84475149b57776ee5f0779f43e589cb19364b03d250a276db25f522459cc7ddf8899ed63376be840ba8288838d9287f81a58b0a9d43f52fa7a097e1f5822a660d494d5e7c4e1a5e35cfa742c7431eb88d11c90d0d55643adb51be4c7e5352db87c8bf045ca80388b5889f045cc8834875480f043cc8fb4c912a9182d4b5a7a44c809938a3549be1499889d87f056e48b83999d2d40292028bc8769c6de10790e51505a684609d609230a8b176ec323f69694d2028e6644a60b3c40ec26e9033333333313333319e98c0a9a6c8d86d6ee61fdeeb4f65392a95c38950f662a3823934c32c9947d341d38d56d6d377b9e40828d335ab9015e0ba50b700bfb0a619e05d732c4282120d628a25a8c8c2dcbd5c229841a7fd86e945229a4d2197b07a13b5eccd71b533f6ca2a1cb3f794e1f96cd29a526ad76cb3e860fab90590b1a64be87459489c8e0ab2793e8f4b0cd781ae1a7e5cb52cec32ab3bc526f7eb3944a78583407d3f3a1b3da2eadc61df69c65a9673b55682a155f35ecb0d69d5676e335eab08d964eee87f1324fa2c3a26cd3c7a8393e874dd6c3cae82c6f542f6a82ac847fa0f3400e6ac861971b4fe7bf6e21f282e2b0bf16858aa9c78b9d2513690d38ec820ca5c1746ea849758d372cb6713576e46ed07ab9400d37ec496f3bc773c7ccfdb7612f4d19ec73ec53a92e6c48fa6bb1a3e8fe6bd8bcd4bc107d39c77dbd1ad697b4955a4d5a7eaad3b0efa6552f466850c79c8594b225cfb098beff17bd4c33ec1d648e871add720ef68f32acb52f46f9d82f32ec4a8d74a9639d63d853c8dbd669f3ead42586357a679f8f6a16a44e0ac32eaceb16843297af5f60d825919349279df48575bdd306d5522a66f5c29e4a4b22a3f56adecb98b1a7e9d597e32b65d27117162d2b0fa5d933637be2c22644cec56d9993d039dec27a2e64cb82e9cda494a885fd63fe605a6a9c8535bf1a19792d0b16f69ca6e5174aaaaeb07ff417fcb396594c29b3c22af2f4c30b9955615d1f6fe5b2702dcbf94585ed547be549d5ade32a4d61d1de0d4a61fdb255324b3325b62f6391cda22e39a2e4d869a2b09a1645375c7c16cca550d8e57c9f2772945cd3f0096b904abf9259d809fb9cce5bb59d3a7d744dd85bcb39faffb510428998b0a7ed162ba6c325aca333b732ae68942e252c6aebf2c36e683daa91b1e78fbaa58e7726616dbd9d9b31a78ed023246c5f739e45e55aee588fb00bd3e163325f4658cec51cd31f63144d1661fbfc655a4ea7bd394b22ecc165cbfed3708d21ec21a59222e3948c2f2e845d06999f850b9be6f705618fbab264ce6220ec4a9792a2d6c598c599632c3aeb8c9bca5ed474fac122a432713aad9dec766af8604d29e6e59dcea9d1833d9677eb6f399a949ea5060fb617f7af4f7c6379e7d41063cfdfd26aba13d762d1987446652f4b4afab45863aa7a16cbfa8fdeedd1beff5d16bb30fb0d61aee5fc1dc6e24e5ac6f1fc590b2cb6efd4a1a5eee615db879d6e9abbd3ba855db16dfed2324817f58af15ab19c54a627bb33566cd2d5eaec9c196eeb556c5a4c9973bc6484e6508900a28a7db5f442ca345b2ad60eabc4c7f06a63f874f4f8e10381a062f3cddd725091b15fc64eb1aa5831ad6508bd00c4146b8c1accd3bf18fbd880946297b6a4ce28b3161ec4a4d837e93a5f1347b149311784aadb2032378106769cf8e0a14c46a0a258cb4f6b194c9f7eb18587ef38a3819b404142b18cd692bc1c659ae5d283623917aabc57e7e872584d90a901f9c42a5f8fce1c5fdc9c09174b49f16e0cf4505c244fac2e8997a5336c4c5027969775dc796e7e10082776314a8bea257b4c904dacfe51cb4ca9e46710be26f6ce8278f9f5e89cf641904c68ab630c5eaa4e4c680d402e618230402cb16f290fb9d31f6308214825d2d8161a2aeb64d00e104aec21b33019b3b3e5e92302904998b34e9f518569670f2209cffc7464906527031289a4ebd6f163360681c426e4cf8479f2528ca1f8e8f188d557aefc7aaf925a430071c47227549d8e5a1a213f9046a8ad7e93bea4fc641f0061c4deb9a3feea9885da1f0f64116bbfe031dd4a3d724ac704a598791182bd0351c4fa21d4e9a03c1f3c72989e145e4012b1e7555f1931eab7758f0865c76f16555b6b2d057288550a7d396f387d5ac728432ce7f2884f2dce208558d4658b6963774008b1e7a42d84f03f5fdde53104c820b615175e86501993ea5c1020825884bedbd459bdf800c37928cac916387894a004cb29932d94c916958a326965d2258b8742b11c2081d8e56ea93075c145a545f50c1040ac2fa6799097f3da9e09e40f6b7841787e9ca70b1694c800e48c5d2757a374ace6f401c40f6b9a8aaa954a7392310ba40febfadfac0c993465b6e801840fab9916fdd36cc6552d8fdc00b28745478bc23b3db3856da13680e861d572d03723f79b8589f3b0a8f9922fe39a5ef3550e20785895965f74593a896f00b9c35a42aacfd2cb253bec79f3485d7aa7e4765d873d08d359e5f332e9d9e2004287350ba95ce915ab75dea439ec41cdc4c69349ccb363e4b0d97decc713ba65ad6c3780c46193ab74476f50a5e34f70d8f37f37cacf4b2d395e1940deb04b26b785cc39bcd0b2920c206e58eba5e9dda0bf9aa34c270069c31a464b7fb222bf64fd0210366c9fb4ac654e295a1225b58645796e39675e16c78103c5b9388e03c5771c1080a8614d975acedf9873a4e0092069d865d1f38b9fcfb6e57cf00082864dc447fb98fa84c7d19c618d2a936f78dd39a6bc94d8d501c40c7b92a2453d1ffe5cd271b535809461d9d25267703107d9784271be0321c32ea717c3687e59c240f1b194906c41e2814a257502640cbbf8cebbd9b994e856a582b263870111c3aec3294fb752678add615863b8ef117d7a53081518d6aeff52d964e23e287d61d7b2d87185fcf7e8971776a5b79dc7e7c50220662cba540bf3901b74b4511776496e69c94539b9b0d6e9cfd154abc520835bd8ce955221c7d3a697755ad857ae5c59f3abd4ca41b2b0781c91e2f5b2a405d50282857d955831257467f5420bc815d6cdb296a58fa204628565d6646667be41aab09fe99684549913050815d69746e76e92d1f4f7371e22e842045b781102bd04c814d6cdac459b951e6c5e29854d868e294dd195b14bdbd2f4dd2b0a6b6c416dd8093b8d3986c2bea9ab75c6249367c67409204f58536fd52add63267ce5845d5222424d58b45e7231fcb82ce99809bbbcba34caf0d412d6f9f0bc39c257c276420b3a77142932164fb6e64a8e7768f72049d86332f1c9cf5b96f31d0812167d251e3bf2a2d869408eb0cc69adfbb7946749aa4c90a51e2046d8f7ec5b96317cd9fac7c34b4e969e8014e12e2594526a131c0384088be60655b3594a6c274d90f92a39590906c81036917f390a396a141021acd184542d8e30a95e870224087ba697b2944715086b8918919d73d8d892c93240c6d8449446a97f2245d809e407fbcbb2d255e25f4c00495dcc8cf372da1dbd00d283754e69a958cf185e14720184076b8cf242d98c963403448c4d34f99ae6121af2caacc52e27997923f3764608b980062d1617bfe309b3cf9da54a6316ab74e179b5b6c5ca974b5928733d7b634e523d2628254722028d582cab336ac60629564bb209b212d78183478e14bb1cd080c5a65ce7131eeb92cc82c604d9050008345eb1bf7039a85ff3982c68b862f59c2144fd4ec92c9563470e1dfc238587dbd168c52645a5ccd64ac98da965824ccd478a778179041aacd883baba5df123fc37ebf2063456b18b2eee4c55c97b613a1364c7fe73680069a8621763b2e55833ca490aab5ce7a206aa04e7ce0a68a462318df1f4561fcd6347c59ae5d22c7dee2c52a0718a55282fd33187777ab1638a3dc366991fb33acbf29462fdd9edd997b55073312820f1220424a4d8347cc911fa283629e4a66f314be7bd2d74a0218a552835d562f83bd37a148a35eb97f4d8eb7af1f01c281b0803c5bf38694739030d502cf256e917f2b9a5e7dc27f64ffd179f65f84081862756b517eef58b325bd83e75625b1d5ebf16d5c3c5c755093438e1dcfa8b2183c6264ca9417e4dec514c8c09a5a5bb402313ab6a29c4bd982d0b611b1a98583b85b90cabab372a5f62ef1d2574149e23af6389cdf3cd99b813d7df5d25d6f8d5b19da731374651621d392fc528173dc8989bc47eebb5d14eac24b1cb3b2e3429a5f5292114895d08e162dca94a579f430312bb50532de75f9d47ecadfb935a9994aa5d4f0b683862713965ae54a143b7fcd068c4a6e951be4e898917230d462cf75b76cc78714e8be034696fead2aca3d4083414b169e5b9c454cd4fec250d3412b1c8ecdcce795a94914f0d22f6d3c2b610cfe3ddb99f2fd038c42ee9d90d1542ebd3b2a4e501922d507a04aa1079c32ede07cf8287e9cf683e7ee8383101c9165602005088b8c1dfd14d797932226dd84e0a8d653af5650bba06e00e226c58f4cceb857f1442b7e01c44d660151888a8617f3997fcfdc70dd93913446a1049c3b6faf46e6651e40bddd1b0cd9caeb61c32c9a0e482640b122fb8c014889c614d1efa466efe54c40cbb542764e90bf36452ee3852197639a4d641bf95e731930cbb24725f8e7a3c81c818d6a83c28bbd39fb1b59018d6183da4125a6c41c95e534c504a702836c64509b8e06239941d3b4c0b44c2b09dce314a21a4cc2d99120c6b9249ebb51d5bbd20f285553dcad91929bbe5589119225ed8b40c724a33bf522ff594051133369dcc36cb93cea164162c8874610d72b3df49a5b8b09fa7666173d7733dc606912dac4a4fbbbcd4fe646b591a44b4b00b423c7d7cc193855d542637e727d9592b1b0bab782d3fcf25d11a44aeb04ba31e6bd59656d8741694d9aefa385b17348854615d293cc5ae8d06bd9240840a7baa96b9c5ddce04d9173956898e1f3bd00844a6b099ca98f3bdcef1e56a52d8658ceacfc33fb8acb343a48c5509256594d2b42d2a250aeb49ad17ceb3ae410a722102856d6597a7dedca7c921f284ed5627519ebfaaa4a7e304c56d508272f23d7494b40ed58b311171c21a4e2ba575d4b75f336a91262cdaf2941663b8133bab1ab84084097b6a7c99634ca37441c9029125a439f5e4ceb6ac5b9006224a783766fde7d5d0e728f1c1e3c7c90e657a8890b16ae9cb398ccecc25615762e569a95b0e12feb47a42571039c22ed8ff8d0b324a561031c2a2e5415c6ae7d75acc97215284fd2551da1d7647c61b89b0e65123c46ee8a4317912194486b0e9cc72bc3efecc6651611011c22e78521a55a8e664ff89046197f4b42cf8e9b013951201c2beff398b613c850b3bc12032c69ac363cb79646c952e3d20f2835b5aad5eccd25f22e2834db8f8311ad38eac8e4a2810e9c1ae7366ed0697536af1f360f15fd93adfcb73414f2262ec51fe6e142eac14d3826ac12719a7b3f68421b4d88352aae94ae43f660b99c57aea537616b54c75cb3141e623a52cd6d35f19e733aa5953482c36bf31cf966e87c59a362b427e54c9191984bc62d739e710f63abe7c5ae88a350b263ae3aed78a55ee43ba12ca3f938850509c153d4256b1ace8132e6775aa95392bd4821055ec193de8edc86965c24f1684a4628f2f8eb6a43196821054ec5a526152e94ddfcc33e514cb7e3ea5375566f96b090f941f3e1ca5a41d0cb733c52642caf2a895bc7caa29c572722fac545b9262554a45e3b9fc596fa909b24b18848c6211bea736f3a6ce7296390e3b418828f69873d6291aa50ef3d8045949c9528e92322414fbf8b9145abf92a2307c06a0d84763d4fb9cba3777964f6c5a273ffd19291c258ba517219e58ce3cf95967f1834e8a8f9413d489f5c58d9abb64797819c289b5837c9431689cb19519219b58d4282d8be2aba54593812044138b6e0c3add7c97894dc59c52babaab5e56a964ae104cecddd2f3f45b160b41a582e233e09143075e62d1515c962d66344196729696d83f99ccf87216d4280f9ae54b9d84e00c7520a4128bc9f431598fd137d526c850f3f000c91624cbc1c8b181149501141fbee3c43950a9e4192194583c26339756be188f77a59221934868cca4e479feda4224b17dce7ffed2b3502ab3cc2012cb7a9c5891275acbca931048acbf2a3248f5b432d70677843c62b979d1b518655ddeae4d90a9e120c411ab893013abd9d2960e9a20eb8116d2884d983e712d5b48fdad137694dc400823f8d4ab93c9299d2d310859c42e435fd47342e70d9dbb0d51c4be212357e933552a21895874f4fda43a6d44ac2e085ff9d1f64559e5217641c7adcf9f2423c4108bd43f3727422951235a424821d6cc4d97627a663a7c24841062fb20e534f506a159b08d1032885dcfa68c6c194bca151242882076599d6fc90ff9a2673878e46894930d9458482076fd65a2af95cc100288656396c7cc2c9ed4a11f43c81ff653ca6432b9e61742ced8ebbb54dce9d2820e2e3f2ce3fd2ba6520bd2934c1ff6fe5caf73e891639b7521840fab4bfabe4349792eaea65a08d9c3224209e972b8d362ba171542f4b0bab48fe205b9ffa0326584e461172a6f437f1462bc4b0d94a05209c1c3fa518dbf8ee9a7742185903b6cbf31e7d92ca6cea0941cc970881dd6fb0e2e2a132f9de53ad85c0942eab0e7a9cda7901bf3d053d49120840e7b944a5b79f60a996b2fc7a17a7011328755fbc5c7811039ac9be5cb9fb51c736dd01b86c421040e17f2865d6c167633f5cfb9d6a1388ee53adcb0c997eb44a6129d8f6913643f4a789ca842c1d1e3040805275e240ab8a8a02f2a954ae5a01d42dab0a891d94acb696379cf216c58438695a75435aaed969035ac36cafc94687eddfa74216ad8940bb2a3529f0c49c32ef8664126b142245bcca04f74f0c181ca10828645469d510bda2fcacf9728849c61fb2e53bae9ee5f069961531b7d4f9dda9dc7bf0c8b3cdb4e4a979a0c6b3ecfd4773ff25efcc7b06edad5ea252db4656116c3e6e96549d776470bdaf3a88108108584c12a86661002863d64969ca6cb52948a16f375c2037995780e141fa80b16946020e40bfbafa8ed9ddeb81ca44708f1c21eb4fca09b4fb79c7f9bb1eaa444c9b916a58e8dbbb0e8283f68bcee96b4b4e2c2deb176b621a334c7a42d2c3263929e54455a585cfc79dd197416460ab3b066d972b2d719c5c2befae1514f6c13643b1c8796800b2e5076ecd8e2845c61d3c1638e6273ce4156e7811f2626e81c690563d76e8e2ebd744815d638ab1aa4676008a1c2e27bb27676831ebb7f0aebc6fdddac2a69a384269a2152d8bb6318a934a78b423538d191828281b4e611460a9e2e585052819032d6d2f415ae5f990899f1a85442a2b0c90e1b56e6e516b528cfe105b21d29aa06d8450814d69649ba6c59e8ac2f42c813f6fa151f1374214e58652ee57947e6266cbb7ac5856c31eac287097bfa9879b796c48d0e97b086cca3595225fc5cb67c4918283e7408214ad833357a2bf1c9d846ae8d3a99b4246193abe4c9983747c25e623fbe3fa78fb07cf7e696ce83697135c2fa2f8afaae9adeea14618f5297da2a1922ace72b467e64eb4b0b0f615d2d474f2d6616c2362fb3f8bdb50a422a3275a8067be19472f010028475c3c91caae5f270b234c63ebeaee5782ffdc19a3e9f69592e211fa0738bea626c39cc83d2d8c1a4fca8c94cd3772b45878e1faf50d6437ab0cdaa8a2bd761080ff638361a73169396e2342162ece2887ceaecaf462d76a9636c30a9ec44b35c0d5a6cd2d7f48a1793de16b48c5163168b89d67f5a123a59ec19b5285e7ee1f208ad8ec5aa5cca6d1dbf7414b410d480c5262a66ea53ba24af6c0c906ce1058ae15183131436495126a90b16946c51e3159bdaba7c1ea5f9e713a624d470c5ea23f3baeed759484fd568c51af3a9bf706aabd4ed47a8c18a4d9fefaadcf85ac5be596ef5fa95ba51bf32418603c5b9a8541c078aefd8410d552c2fafa66a4136a9585657b96c212b950b3f2a167331664653b67c42eb14fba9d18da242a6d87347179f1fe54768b214fb49b9c2e5a4e59a900f2936f15b2b1e52bd72f91ac59ee5e9aeb5fbcc51698962cdf27c14eab44347a90ec52ad436bd50a945196318147b90f329d46a8c0e3ae9136b9916d5c90ca927160da7c1ffe5512756d1c9852d1bd9f128e2c4225768da208472137bfc890ca9a7475b1835b1a9ed289356f7d2e916cbc4aa2933bcb8a9733530b18ad0fac5d9142665baecb8c4fa2d970c4fd73acde98051c312bb38df652a5fb61c842a8c1a95d8e514d11dfbf31c752e6b50628d32e7e5f4593bd99b8f1c3c7e9c9178c10163831a93d85ed7c7f474dfd2792789bd648697e5b15a8c9a482c7f9a834b9b7ca3a71812ab48352ff8ff8bfb283f82d78216ff537304327facd6864c526d449f85109e5383119b102bbbb179a77943f1b54e7898a51a8bd8fcbe834bfd61736b7145ac4235eb28b5d3cb0ce244ac75f659ae537d9a1b46c4aaf22dadfabf99935287585b1c9d470b9d8d9a4519621ddb17e364181d54970ab169d1e53cf7b298738e2742ec32bc77444bb4189b0e622f65bbc9739020f618548b23aab334099d40048bd0529be54eb209b2c08d45ecb2f4c134d8aad9542745ace762beb31f9f13e349c4be1f7435e6b42b850811b1acc7d4dc2c4af9bf328758735cc66ee614efd83870c3109bea246495fa723dca2fc49eb4f0d92d434f76ba08b1ce8d689c123a83d83737b6cc963182587e4b8f0ed977c2ff406c5ad42d847841469703626f317390422617bdc37fd8748c1ecdcfb4986175c61a94ee2df32873de931f36e1a9598e51e8fb7007d5ab1f23f26191d3cccac6e5b393d9c31a5c3cade7b30e9eb6d7c3a263aaa8279149ec79d843cb4a881459e19dc7c39a7372ddab5c9ffc77d873ebd1d559fbd1713bacdef28e986ff9c2dd7558939432ebd52b377f8a0ebb20d49d2a759ac31e354b74ae520e6b8eaba4ce3a1787e5f4c7b49cb3381cd64c1357db1b56cdff866d6c4c88cf926ed84b9acbff3afcf9abdbb0078f95da2faa4929366cca3e9c9031c9e9a6d6b0a78e8d1a7396376e8e1a1619564ee8f051be05d3b04b6aca65a575a8cd68d8a5aa9d968bad33ec2f8d4e26f366d8d437be14a1c4835d8645c6acd36a1c4f3ae464585dd4289ab253e4a9c7b0da68123a98ae8a32896157cac519b96a18d67919f3851a3518f65ed1119b321b6396fec2662384549aa588165bda0b9bf8ba559bbb199beab093b2e5ac5f52e22eec590eb16ac5c9f511622eac2363f89847670bcbbc54c23465c7fe9c1676319ef9ffb2e48b31cec21afe41cbea847edd0b63617359095d27beb664fa0a6b99d279b71eb23552565885905da13c55854d9696c5d5123ab816a6c29eb5fa36de39854dceeb4ea5b74cd629855df257e24bd576852695b1ea92e98469b11485e57e5d96a37e945eb64261d334627dc2a66cff46d77c0b375227ec42a4bfccf3392afd3761d5b8ea5153cb3ffa3361f95517bb44c86b69474b58e59ffc502e8e94b0a7ec9ce53467bad5c7642c6a5d12915a49d85b48595a341909ab10afa39636e3c63d1d6117637c4eea65980bd508ab8866dde5afa58d081561d1f993d4c20b22c26aaba51d194353ae3784cd3647cb654149979910d6f51cdfa78517a65e501016974367f7ad1829b480b06be9645e16bd31d664a6724acbc91b3f58638cb7a77554c28452def0c19a95094f5a9a0b72cebcd183e565d430bd9eec05316ff06017b674a9105a92e13479438c4dac9ad4387af3f45f8b4dc7ac4c94a7905aeb69b14bbb1ddf59d2b79f9fc52ea71f99c5bbd5a82f59ece17250c23e885abd4f2cd64fb67bdf72dab4332cf6301ff9e9abf38ab5b5fe8fb3bf2dc5e48a45d4cb20b573ac88b315eb7ea71b1deb5a68b859b1664989d97a394bc6e7ac6213dd1874ac54b16ef806e539ff5b8e9d54ec8292ded20babebb29642c59ebda9254de814ebfca89e2e259a621da554c610e719ca83a558b4e74cb8f4b984cb2029d6db0daec6d5a3d8b44ea9d942f6cbd1a128f67fb571c74fa4d83e14cb8d8e62aaff4cfe058aed5bd4a875d42985b8cd27162f95d39fc527d1da7862bf919bc13cb61853c774625327e4cb3a859c5876cb364f894bfde126b6fba8a7b59823ba1ba38955087d23b305338f9ac9c4f69db4b0ea4c6e6a794cac75f6ad43a81ebffd127b099da3054f61a6b32516ad1783980b556297e9bcc5cdcd0b765262d352880fe1626e12dbca16fc6e7f5e94d94962cd30c275d4ffa7c1e522b1b92865a7694162959ae35a7e6ca53beb119b967c41b570f7333a8ed8575b8d7c31aa8d6a6cc4ea32a3722d646631878c58858ebee1e51ca4679d2d62fd79a9c589ee0df199221625b5e6b4d827d3c48958c6b430eb5144c4a62743c7128d35d31d62332173ebfbd4e2e8d86288556ecb173e752ed3a2100d360ab1e6184a733fa6cca4562827267dd2637d80e15dd8196c106253612ae2758a959f57336c0c62d52545b50e32a75279942f2a954ac5511ee50b83cab02188e5c57b31b3a54b9e751aa854167256680b3602b188baacfec4250d2620565f9d565bb20f62b3f587d5ce47d473f43f46f119cb9f8792ab75941fd617e5aecc4e1f76b5e9a2b49397e3e6281ff6cdd9ea3e57695059ee21affd7c33423e7ad88396c534f2b4924236d68e029481b09187fdb5b8994fabd3c2770eb204021b7858f5c86629345770b071875dbd24b5459d1f6b830d3bec77e276b4b47164ea8b91818d3aec7a56e3cdca9630291f6a9d51c0061df6dc1ce40bb32da45cbbfd8b39ace52da7d216c3a726a543396ca61a5253eb3b0e8b2979e2b749e6ed38c361173b69c1c35efc8645b538575acfc6d3a972c35e33b24a7eee64224726c8fea4c4244599209314d5016cc3aa332bfd4b57bc2c6ab1c1865d079bf94dd1b96b1acf81e2850f1b6b58f733c6284d5a162fc62e5850c2c3861af65a1de92fea204484aee3a4c451d0086ca4c19764dc2c8e47fd4fa518d840c39a5af9cfac0e32b9f0b4f748e191a3440436cec09790f131c9151b36416686bdff63ecacfbf5eb7231131b6550a934a965a941e61c6b1b6458e7ce5c98fcfd1c9e8d61cd8dea739ca22fb021865dfcbcacb47cb2590baf250c9b8907b16dd959581783618ff32d6aa1cfe5a03e881cb0f185d7b4c5ace5bab0e18535260f932e78549b8f076c98b1cba2b8cf49c9aa127deac21e7cb51cf1e286106373614f1f2f877252821db0b1855db69e955189cfa0d3643660430b8b8c9422a4c62cc396de04d91636b2a0504d996261552157084d1d64fc3dcdc0c615d6121f3cab4fbd9e1d5aea44471a1736acb07c8bb1bf461364294af14a60a30aebe9dfd3df2342998e36a8b0c7f77a08f923839c730a6b50726e53e87abf7c4961d7c174c94619fb963cada31aa528ecf2ba2c536ea5f2959a4aa552491c36a0b077c788d98d424f58ed5f6cf8f852e2b93441e6a324d1ceda70c2a63285964e6951ea50376117eaa38d6dcb58e672262cfe63a7feb52d66942d61ef97192f2997c93f26c3502828eaecb0a18445bf4606b17932167da3e1f28792b07db6586ac676347f1c098b69d4a752ac8a11cf11f6d00d2f3e64b7961116a52a3dafe6576a3a2ec25a724d9efc347ad399445843a38c2d57e7e5e23384c5754a9d49ead4dfd498202b0903c58799221b4248bcec749fa222a548b011845b72e9a5539131a78e72d22620194108480cb2018475450b2e737a16b5dacec6185659367e60151f58c5460fac82367860151b625845118a482dac72446861951343641656512088c8c22a680c9158580516564941107985555c6195565885155659855554619554580515563985554c61952f4a611552586514561185554261155058e51356f1845552a41356419cb0ca26ac927820a209aba40d443261154c58e52e6195236209ab546251d9e8591c3112a1c42683e9900effb101c42e4426b1bda03669de11a773965723895d8c59d41db4922db6e526c8d2f8fc20594c17442261154858650b228f60756e4711a1b4734c50a9641c441c61954658e56841841156b945ac71f64edeba2cbd11274558850c9144acfaf3e671a92f4f4d9f800822d674ea73e8f9cdca551f624f11bff61fa30cb1bcda90b1cb5c1abd992d3c078a178558a3ebdf7eb572c5b39c0932e6eba40b24c4a6e546696232993aa90e6239f95cc257658bd72d1d8a078a49abeef1a3640627273ad09178c1011212906c91be105109d9c984c85999482014912ff3775ef3396f200288e525ad75a6d928952e91c81f5657424b3aa39d8e226526c83aa01a1039a3cff9176e5b09f5cf7e7091010d780e142fd47cfcd8c1cb73a0f848227ed85606f918a7f526d2877df64e7db49c840ae189f061d5a9c5bea0715fa9ba8755b8f02fbc72f14bb3d804598240440f6b54973e0893ab09b24629098387cac376aa534ba93a35cb5956183c54498a5a3450a9a4a0947861f0b08787ffd3db624c9081916347890f332e7cb88e1e3950bca854c0c8e101bcc3ea82ce51a80821113bec9f5676d2baa5532b74913aec4a67a7cf479f1767e210a1c3261b95c9a8f7d24751f5304b640eebab5ddffc5a8cd1fdb2504e4a4a78e45028cbae06227238eb339a18adbf364156e2e3c749b23c2488c441fddb5246b39820386c7256fc6567b1c497ca04785e41228b4de80791f1f56782789c1c3467684149511e3467b964529407cdd9594e529407cd192e9814e5417366169314e5417376cb254579d0cc2c29ca73864600a02089c5a6e5d62fc60c1258ec41dd0b323f328befac572c5a46b12bf6fbe44a6f166e4f36a8159b8e328b32f56fdc17b358b1ac86c7a874e6fb24e3552c3a6821ee752e2d4d67a962fb9c6a55ef88118fe254eca2a7cc9743b3d0152a549cce5fa612ae2406c92976dd32a79251a58c8f4aa6d8f4e5d3cdfc493b48af14ab66f9517e872d9da51729b64f519e79956e148b4b5d26579d52ff398744149b906aa71bf6d1efb5c03841e941128a7d73d8d2f9fc40b19a0cea767f6326c81ce5478f4fec3a7cb6f098837192e33db147f50c1e32da98c64e2736a1f25e8c2fce9aae9d136bc717cf578a1315fa6513cb092fd7d9424a139be8672499585d6f2c6df96298d88354e7ad93472163be2fb1c797dd272de366307992416289e5f57e14974f76522e4d04924a6ca274cec9c68468ec4c89655c7ad677ab84f44d27b1bdce9b328cbfd6d25e24b167a613d172cbe14fca904462d721a43a9779a3cc701e1190406239d37ad3ad963eb6e22079c4eabd3a87ea95395969031247ecd2c6e5f22cc52425078f1c8f6090348211cbdac94d1955fd95943141765f902c625ff1982ea71eb1ca65fc074ab72ae1a17a391f248a2049c42af5495959dedda2273c4a14850411bb5026c369393c69bf3c0fffc2510eb1cbe194fc1735c6de9a87ead3416288d54fbd9cc52ea154bada04d962322029c45e1e73a428f92ccd7f42ec3a363b4b4f320b2ae483d843aa6e0e6ad2342d8845f37aff68995487b902b1ace61c334ab901b1bad0d2a7173fff613b6fa1c4ac2b699fa4ced8757231ea878bffca547e585ffaa459fa0c6a34d73eec41cd77e83c2bb32485f8b06da8d4b296c3883813dac3aaa91e469768d1c50cf570d4d2a1a5452d260f7bbd5e7351ccbee3080f8bfffdcb207a3c8e78877d945411999bcfb6c54c90f950283e96e305e00c2476d8d757a3d44e251b85ac8620a9c3a2f2c5981932d46a87e9b06e07352f151ad33c9dc32e2a17a396d05aee13b3102472d84ebf43aa0c7552732889c40b0ea02d90c46179b1343c3ee79c89e908410287bd7463342d7e28176f2d7147f1c179059237acf59f5489062de72c88ddb06f6921c3837439832069c32ec96e5e59f2ea5cca822061c376ca25ff3ab3d7b0f76fe8c7b8dcd3790404891a56eb1d5d144de23f90a4610dfea1515b9631b6a48c02091af69239e874f1659db5283ac39ee1ec4cd7aec9a0f566d86599368b932e2dc32e43e894ebad564b3364583db9a8b6b4d09d41328665f587d1e8ad93507512c32e8dd4a20ab939615834e7db5dd372597dcc0c78281444e20507ac0c124ec699f464da098a01c917f66f1965fee3c8b880c40b9b7c8cdc2da91f439a4c90959c2c1233169de5a05ebaf8f2e5acc50f245dd837969e15539f0bbbceac467e8ebda05a7c0bab543e1ff2f4a8853d6d54d5c95b8b51659a85357e3cbbb9efd1f9ef3e906061514a0b1d3aaf57585d94e5327ff84e25273e90586115db1dbcc3c7ed074915169d7b6966ca9354404bdd24659c93ea5128253e7ef4d871d249328545cc6949293e725081440a6bf2d918639af3995acbd8b473d697302d2961341348a2b0d9cb28572a2deb4c42058565f3c3874f2b755a159fb0e639353a272d87fc487d2894dc0389135665a3dd695f124aca9626acfae3cb2742939ac62813d68f752f6195fa63fa8e678cdc9712d68c9b6e5dd499a48c7af44042c6ea62f3aa068fddf73a49d8bf6549c6399d9ac4a991b09ecc37ca74ce8f1e8447d83fc684f03b9711f69b97fe7368b251255384bdbc4628e9a24b9b5a8c792021c222d49fbc71a5b69be71076e9b3373b2ba1429f8c10684012844daf2ad5ff592697560d84c5a59dd6829659a8996e8c350b2dc93c23275eb0971fec82c6b8a02a6a3c90f860dda42a6c95679499cf9812487ab06ae71c7d4dcb72d251eaaa40c2834d8954b33a6c147fb2e5ee4022c6ba7ef7323669516bbf5a2ca65727151d1dcd7fa6c5a2991a1a6b93c6ca38328b3d85cca323a45a168b6a6155accb555aa36524168bf23c252c762d6999890d9bf7f99157acaeb524fae5e0b5398bf9f8b1234330e28a453eef6569b55aaa17f45e02f5c0482b7619527ba4109b85124256aceb1b64d0a26e3c160e23ab58ee85902f4a59a6e4f7aa5874c64fdf489332ba701b4652b18d4c62c5a8fab0d1258da0e2ee3ead7f767423a76094ebcf78ded2cbaa549693c48829d64eeb1b1b95540931528a739af24e179ae59d31428a4557799efa8fd12fc5f6f6b6388c8c626d59d082cf6f889ad262c7881151ac5adeac83761a8ffd9d0e906c41c2010d6ca1a1d8b7b360aa577eb8f23c28569d0d2a4ce63eb129d11faf952865fa674f6c72ea65544a83f99edc893d46a5794ce378a73f7162d7e2be209fbbb489edb48c3b1f4d9bc7a49ad8b7efe5281f8432b1a9c6122df54498d8fe834cb13129e496ce2556dd6957c4bcb3f0ce128b58e9e7510b5662975ffa4789fd05955aaebc6d12fb6a141f476f163d92d8a5b42fb933562a551889c4aea489c8cc716f6ec42728701f275f542aeee3e40bd4c2082436399e858d234746257fc4ea6290bd2245cd99923ae182648b11472cfac5f4ff1dce8515ad11ab52c265b91b7bfae239c2883d446a8c427783f4a89145acd265a1c5603a8cd01995631851c4b2f9d2ef7d8b2fa6ed8c246291dd3a7ad6fbaf65adcbc123d1610411dbbe2c08bd2eb4d034a743ec7daf465bf4d5ff2d470db1be28d3e3e898c5175f8c0ab1794b215d5efb14f22d422c3a7b7f36458d68ea06b1292d8da64da6a596ad844e1811c49a2e83ad0ce23b6814324d1809c4bea65a94e9c5671dca63c8180104a619a49a90ea2b8cfc6155d39765103a9cfa547971c61e954819c49a5ed9f9f7c3aa84d8b03a8a97839f7808237d3868794cc205d9b183968ed91ae1c33a5b7a52758e7f1e9a09b212745b90784185913daca5a56cb1b9e961f1fb9efb19fd481e1e3082871292913b848cd821250c9f414a180e021b237540711f293970380a1d763860640e0b189143ca0f068cc40164040e081879c39f9ca0f470430246da80b263c70e2e0a30c206088cac2147d4908612058ca081c6c81952c2483143190c3042061e270c1819030a0146c4b08c8441870eb505184246bee085921c3d72c48c2eb87fc9898f92112eac12f78fc0c8164a68502232a2852c6081012357d0a143b50146ace080912a78f338e151023242851c3d30a0011b2353382352201929e300235180c203469e90a307069c55061230e2841b234d503e4e7ed0a02485c60813964032a284921c3d3090a2e3e464043746c888c048127404092b47890f4f69c0c811523c478d1123d420470f0ca0f80c504e526063a40829242344f01ffe8304cb71e0505e48606408294248111909c2034680504263640c078cfc80c6880fb830c0480f1230c283038c8831801bb5d8e40a17ffbc67fff7d4c10d5aace9a26759de71af65a109b214b4831bb3d8e5ed203f4a2df7fda926c86450b24e4e70a8a5e1862c7699e5de8fe97b433766622ec7e7407114e48d58acfea17b5d909a59d053ba018b6d645db27f996aa6a3afd85e781417d488b09767cac10d57ecbdb1c52442cb92cf4b6ac522e57594f26410ff9764c5f22d4b8ee957762eab2409e1c62ab657f2f274da52158bd255cfbc59963b55441fdc48c51e5f6a399fb739b9e841c5fe2f49fda3c73c6bbd3123f1820362dc38c52e37c8062d63d6b7589962cd7b22b3982f3c272d4bb9518a45b4fe78624fba50bdf93ae9222d46811ba4d895588d51e37794d24c3746b1ea584abad40edf775216dc10c5e2c1b412f5595c7fa8e04628f2cf42b4b6c423f87170b8010a8366b7a0b3438890e1a2c67a29f6c600188a8b5ccc0b373eb1cdead81de3233eb4dc139b97c96ffd2a29a57e756297439a06f9c1e6c49e3ed34b526abc8955ae492dade9d5616cd5c4fa234fc89271e31fa34cac4a4f96fc9caa2a9b8389f53bc6cb05f928a78497d8ec650aad539f25f6a093d6e94b0be2d46f9558b64eef6b59d0728312cb0bd5bceae393587cf374bcf8b3ae7c9532704312fb474fc26396b0d7511e89fdc4faaa16b49c2a840812abec98fef2aa0abdf147acbf1a4e4c834a2dd7e988c5574457eb8c69c422c544cd851523028f3ba874300683692812070362184541008fab4b009313000018101c140603b158340e2551fa01140004543826463c2c1a3020148b48e3e0381c0e83c2c050200c0a034161502892c438444399db077ce09eb8a418b6d01997e82720378156416fd6484827b720669c7dd1bebdeec2d6343198671ed7bfb4b9d72a1bc40ac98ebae73eee64812249d94041c42da618c3042ebbd8a2d6da24834819d95df7b85f0b8d561a210a2a96d8c414e3706791165a636b1925d8201bbbcd7d596e9cc90b0564157721bcd3f19b162f113ed20e47eaa28a11b14a0ddebee825403ae800f1354aa31aba467fab93d084ac5110bd77d01c9515d5902ca634225f0007afd99aa02ac7cd9e255f81cf5b89c8f6a83fb1c958c2afc02d9b291fc00297e08c08b193404b2eede91ca00e1d599668a1739cccf560e9a6cda4d57aeb2b117da5f496103a9718be329a2eec4e24c64f46337d3900f33ff6951400da9ad880293cf1dff34636854523b99e963c7eaaa8bef68e9270ee82263045f4fb4decf5afcae5d09382448aa875ff415a4701690a9a4b151be133790aaa7d6dde7594c16c75a54865e6dd27f503625f6311c7a5f129af3970ff54c5bad7771420863dab0d1bdfe3293cb70da916bb242dde4afaf5d30cb00486e9f553fa09ed5c799e44401dea1603014c2c0669d9cf701b62d0c83f3f4c9b0669e5dfdcbd485e8a2b11725aaf3978617171690624e89c90825b8d6ff6570dd97a7d6f27012149c852c9a1248c85819a556fe085db6314675ea8f704236dbca106efa7f71e5e6bd9c71be185dce4f5abf1f9d059ce8328ec5f44f2d114733843e3a725025353868ec0d2d2748ee5282efedc5abe53d17a781335efb4d3b0262d714c32b29afaf01a203d3eeae9dc53b937ef13d9e2d337f36a6a61ae70eb8accdc2a75800ba6b344c3f8977bba4ea4832dbba8419f4bb2fb16206d067866577282b0ee70d0929edd335bb5f22a5fe2dcd14f88165e10ef0a755d9e248b99d66cabfddaae9a78833fade5707085e52e09532880ab95b2cd1694276add023f3595d3a495d37509ee210e6ebf7b115e3e96376df730760fa169f93ee8091feab910bdf11f37da4d04b437dcc71bd219f54f36f7c1defb486f3ebebd0f7bf3a1defba8b77d7c56b3c660bd313fea95418a1e07b9b947af58d0fe2115df33cac6eda06ca0dad2915943ea3502561b6b044177018c44d95ddf215093865c7bdf84e2e7142f8eb725e51c50026c5d8fd475335c647441fd11cfc446f608fc0091d18e3c651525589909a9579c92b49650596755a8000a72a8da709e55080dc3c10dcc0cd2abc245a0a7ca06c4184dda942dd042ff57dfee002ce229799c055f2a704fcd4c5342c149b6af6a11688452c532c4169b7c59919ceddb0230abb133aeafb6f5b3ac9e31c28835f004251610df37e150cb8472923a30be3e6e428d2852a85c566c82581b4602591798636cdda9a452105a99197496e52b8cc4fdb11ff9221154495901b8ba7b44106d2e40d575c38af7a9fb16b71fdbb22b0a38613190dc4350d981042cb0f36142754ee13d4cc63abe83a64126caf2cc0838f2f6bc00c090f8727b52316d075d2c9f53d7eb5e993f7f3fbc51ab82aac0d82528bb2b321096946dce650f8b12c432a604b6b4f2a87da31c69dc871ada2790b99bc619c5df9352225d1e6929c298b89fed02454782df1087bdf677d07f242ca0292ac838a4ba785d43cdfd82ce66b20e07d2f29735b7e5cf0a67ceccee9bdf0600174eda1fa6fe2497c3d5f5c0e222630c5f04e8cc74865ad3210a328e4374c45146988f0dcfcf0db10263124ef5161d81a8f74c6868c225e9d93d4271f1ff5fa6613074659848ebc5e482d0a852aed60c28f96b32dced63797ffbcf75cefb6909a3ef2663635087cffccc89df33802c978109e43d9856c394e57f4a8f64517c5030c1c0b19001b8a5de96e90e75623b0f3831cefba4c5d03bd6d8ea70876e712316b1c50675ef90b62815af3583814ac10e0ad02b8ba5defc1c6a6a51594551214b79223bccb98955af228a14c53d200094c3e202d560b7a96a339aef4a7b417ed29d90ddb3d9127104e4252686c95f968de84adad07255a61f35721439a85ad31480089a5bd5218d351268f782a2a99fe35388c33c06490925c5c91c352525440590c695deb185559a0d2dbe7c019c5d018bb569386e0b81ac3018b5675501c9b2ed9810a272dd959f0481b24e120ae46aad687f880a92cbe584290206be82b63a61016773041273ca51f58d41415bafe5a451cc5c77ae09de4a2c045c76052c8636435d2614c81d5fd13747320f04280111dd118dd0f0b79303628fe01d18637ab04eb8cbf49c326b50c5efa282b4f9e788e290f0d79853a068eeb7e04e99561774239612c1cc8e54385590a8192c937d94c41a236c53c6c4cbf41525bb996a7eced0a5add8ed41005c58874551d17fc1011e8d5b52a21c52b1328d8ad3cbc46d6289fc9e767e52034fb1eb77c68784dea34ac31831a00f855255a690504f5e3d8fc0a79e142383eed054d29fe083b07a31da282bf882402860c83d52a279aa6b4f3a7c69e554eafd7d4bb24436f6a34e494ce2b5e3fbc102adc228a7682abd7c07c40b605232cdb210cab4a498c4e5444c65f12293511fade99cbbd0ef1df16916242f9c5092fb1e843ebb2297e1e93153527d605e4450e2043fb33fec93855ed8ea41a5aedaee98c4dfa77c8f174b744ec227450e481c11121beefc073064a4311d988887d2b1b342d8504a4eb2e8270d31280e42cc0a6ed48d53b9f02da649da8fe97dc6856a4801e952b4b0a149c670618398d9a652c17b20dccac70c2b08375fd44b80b8db44c1742680d9a74967d15ecf3104c83027fd2d612735506a199eb6ea8a6f902ec9ae0cfe06b71fae36c01d9172fc2d0a1c4030644974acf7985815c454f738c1041c3b3533a4a02ecd20710c71d4a614416b2a3e0b30c4a73602d51a43ac0f961822a5888f2e3092228c8c36078942236544ae1eec3d371b5abc9d5081c35d85467848495e80b4d064bd8a54701e1f29e049217b534f21623701278a8d3ac21d46bba72414dfa296d0fc824f5544e5882942400af943f08865b9564bff8f94d7a471cfd6d52c12288e85806c7b2429a7fb1ca9d240b11abb8a84570c83e0108cca6455ce6e31c933d1f324d877706948a813150ba86523810fdf525ffbabf858c554a8cdf5b3de24726d1b6fd00bc0079c7b5e4978ce17be4aecf884a4c6bf200c220627b8422824dd963638418da3c38c67a07b516758cc500de149e2a2b71e10b09838cbc1d74b6c4392820505f6865690c7bf15b6e07de06122e6cacc838c980ba880003d76397009a8a871135588812fb1fe430b1068bd5f96bddbac898c1c5a1dc50ce90660751148594904f4e3503910f3dee30b8c5c1e403f6252946318b20df35a28d7492190ded6d5dc9c77f2ce4b1aab75cb62b5d7d06880acd10b39d5329c86169296cc071c8ba3b318d8ceaebee71d8a172c8516d939c89f9689bc8524d5dc8271d58abe29b9d606b2575e305c36e3747d95af59a2c26aee123fb46bc2723fc7f4d982affd42a41292de56375071a0b958f46cd4be2d2cfa1e4721d09a020da4a7b9a69cbd305d85c4a040574b0cecd249e25cd484d1eea3b3b4509354348fbcfd0be00a2f8f22820d5de69dee8d510cf38a87cf306e232d6b0c5637bab7e26b02f05ee880be70a786d1d7488f6ccbf22bb6e11b82664dbd41ad21b9d18a49f6cf8915c51e8df1456ed340a2dea136154c4b1c77238c138e2939f5ccf0046af32a45e0b4c8ae27fb6209fe190ba575154011f3883b19f6cbd87203d8494191ddfed51e8199da297d39946c434ff275fe589a841ef2f5cd3fd03fd97fa5a65e4174db3161bbebe32846ee9c184ba13f43a8ff26bb236f09519da6f76115d98940acb844ed15943ddeafdc2e78706764da7df7b06ed75d8b524d313d2dc7a3e10f730d5b0495fab3c1cb8a4cf7ec21efe7a882e9285a9040ac93197258b3e308a1428b22509291b308622ae46e60c5e163442f88e9a8ff3141d160398fc4d70a96646e805a938ce42e6a1b25c7f2e260ae6c15e9d23b8baab502b557fe6ecdbab85a500233752a2349587423b0c728e737de639f4d7ac18da6113b66ef15e125e2230275501c51aa90975ffe40d01b08f7f621b14b0ab7a9ba00d559d563d7ec226eeac0376ed27f377108ca7282eec5d31b85275947057e66c7032b78d16b156794062db5282f47a0dbe3da7dce6e86cd5e3a5d03e877f96d7560b037a7cae70b0080e033bda0f5c1f7898b489b942acbe8f2e8d7020676b08090a50940827cf72010b37348a83886d24ee5aa27181d801c6e684a1551e5e842757162e306b61b530e107cbcf22b5c131a850033818b2e2e4ed8fcb44a5d6ba0c847c3d039322b6f6caa452eceb88f9c0680a3050c8969d90c4889b8e27b08cf699a54b870a83df47599c5b7d83b54c816a40adc1e447d2d1d6e9f0fd4e3aa9375dee65ade73b01a28bc291580656d1817f24e035f6d6d2999852d746edb436ba30b56c17796898576452b5f0aa3ecacbd5d77b0f4b50e4027e0a36b33907fa78ee783b0f8468fd1ee65b3f6b6bbb6fdde02e8c76bffa3dae2cb4c979603eb37b070ed82792531d1d9a255c8b2e988cdf4295dcd9763f86d70a74c8a0b1fc0ad522566a27791ed805439e4883d769c4cfe7688d109a7a144d79e1707f1692123da5a77cee384339018bf8642b81825c2c42260656a8048eb843b351967920c918aba9b340af36a86f780e8b4b49e7ad0b1aaa871ad6958e677058f1b0d604c1532d305dd8c0b0b5c54f0cafa3d38d2aeac42a848954c6d167f73e6e3305e7087c96cd625786f87e9eb2cb75807ce611270734d0947dba667bed25c65b18c50013d524da464411db196da891a0b8cbea9526bbcf5b9be5839a8cc9e37138a7365e4bdbcc2e25c26199db6c96125f8841a5385cc0b56c082366ee17673b46d7ae62be75a42cba099f3b9ccc19493703af23c5e3c5fb0a3dfaa5c625c193b86687715d75b71e82616239558647aadbab2332e25133518e6aa363a11ec5998da32662af7577962e5570deaeb8adc967aa939fdba6ab5895403c40aa498a77c0b338d70e9789b5ec334452da36432561b53bb1c56c82440bd5961489159e8920d1ce0f5c480ac39055b966f3ced1411eec05b9f3cb90059715ac624d12c6385224bd750266980b9ba37cc3377069c4a53904dc9b273cb52e94f65a27085eba8a636198a35410b2269482fd59bf67019d7466d45668ca0976365bdcef8f9044548252e99146065dadd31b18d29ff8dadd4b07628ae5380ff1ea936ef22a02ab11b32b676222b3cb572c897cabd7631eba5dc237f690e63a232c4255b44fce1acb6f51b971bf9b6a659e04e523ed8ca0f9607d16dea2973b7b85560704d34c70ed891d5ec753a59a950cbccfde8a5418639456d5b16b516a686712309128fb11fb1463b04a4797c2758394a60072128515f83ab74a94364658d278f6af7e3487c4af4eba87edbd41c6de32ee7bda12b94174217fd7e0620750ec16c3a50cf8ae1f58f6e5ca79366d07a0be1aa0e4ea21f198b078fb87473aa93e62cd8314d1c9d141b20bbd1c5b285556e067ccda85e82359cd5f0ca56e7c9a4c2b94080879cb9c6b243d28750126f775c18857fe6216f43c7f323b1782dfc4707dc5d378bfee0b7137544717b84e7d81c49bbf4e3dafdaaec8b5256419339e95bc7679067841dd37e3220802d28d8691329377cac3012061959c5a199fab2e04cea61cc594348209d48fe1c804a6f89f82e5d95c3629ed4ebe7ae08d50927edc0c0eb6762d08b41c595c70bd719f8d00ea18cbb7de1f856caab7353c228872727a92580588a5a7cd39da524a5525b07daa9c55b4d19276727c08a6eb82719eae694663fd67d4fa5c1e9c988baf8964fe64c856d406a056b6fc309ba16926bbb27c64943cc7ceddfaf6bf0713fe48549062e946b5ffc98c8f01a33d2dd092680ebfa916a6bb8bc80b45276d56b0dc161a1c24db3fbab4edd7141fb898599033aea1ba62db9ce5ec712a05788b98223c28686a6227912d81ecb28ff0922bfe157f6f4397c56d387fe81afe256d00c3e6d4a06f52a8f03221df35e91a9feea5dc3192e833baa098556796af3531e859ede4a491e61f24cd92a516d99a87b2e669bc6c44bd0d6622983901938674f21103e9b15410bd31eea594cfc974e833d822233d0a6c7e384b36b81ce9a5df6d7bbcda96f31fc5913fe14d31954228d141c52896d4cb21d4f0f7d959c99bfa35702897231064281405c677cf5842673f18e17441a385cdb68b036ab31e6df18386f16cd89c3e480beac387fdb4d6cf9388dc1f9c6d7abdde851d806c3c14aa52d449c07cfd6aa55e7ba9ed83faae7ac16e4796deb4061cd43235f9a635a8bdf578ca41db7e4e797e44d9d6e8e46bf500d6d93136de6d447ea3f26790908303a6047ee83682c2c0db3d43e4fdf784cae8013de01e7f8f29f88a83a269938570d671e420cd66180c53e950396473b51d26aa4ba07399c3e6706b5a00e03b2f429e25498b3b9fe1d290a449700cb2317b3f2cce26a3e73abc7f1b68321db07cbe37467dda8ab72b2ccc1a3af3bf8a138c26284a521a7b6bac1e0c5481c9b721fe08371762b2345d454d02078812ece9a101460b66371b6a2e6f16c6de55471b68c39394e2aedc6bcd9519cfd54534c826e13679fdb3f40d54e5725c80b6c9f7d0789b3e53cc45848c35197dd1b9485385bdf1655a33ba05693cd19ce3f9c55df4440ee4d121f840d10997538fb67d4f3ba5e1a6791a8e16c11013c1c7926f4d8a2771bd2f8c57076da9c2e730b6767cc0154ea06fce1e414cef64c9e6dd84a386bf9db8d720867cf1cd0eda2111760c8c1596129d76fc7035a2f73066763cc911b12ed3598525fc1d969b77a9907046777c1ece68406ced6321051ccf2ad1238eb22490fff0d2fdfaa80b3ae2036047173339cc000ce0e31487b72f7e75d61ebdfecc9e7f12ce36ff6ec04a86e155ac0c9afdfec837540b4f09bc591cb04867fdc01930ffb66275a29c2ba9c8b870d21a06f56c7c4a7433615062edf2c42058c776ae8e3ca01d0fa274ff068806fb61c10f1665e60951935415c43d7915aba1e607bb3c5540c6ba95e9e63addee7f188df3a5f6f56db8cb7aae9cd8acda7836c38bf249395a29f370bb5c4e207cb2a33e5cd669b1e7f4300210c2da43a1388eaa28a4687c9feb16fee1bd105e2fb959fe28c8b7dc4f020a8cabd7c33f1a9047a42bfd15a02b85a56f5f654d59b3ef1f615d5fd9a1d8dc6b031d086d1f5cae2b438364a916b142e935484aeefb3df6d158517684fb41e198f07cdb5f21ca5f836f098838066c1fbbf0f9da8c518e5103f1ab9b991d8be8aefe88cea814118af4127d0372e1eb02286a933cd39eba96efbf6ace0728a856d7bf694874d4d4b65ed59876f78ee9671af525cda48aad964439ec841d25fe56b258acbe54ebd6337f8bca1e300653a19477a24d6f89581e7cbe862e7659e556638e3e31800185989a06f80bfe8574825935d6b52d32a727f5aa801764a7dba901f95b5cebcf362d81031e7fcca8327d0e64414a508fe20865f2b300b3327d7f62d836d272ec5a5194702af04c30f25f7225e3584e71678fa1fee9d82cb42250bc523b8fe5707dc3502bdbe2c59a88c0c8eb175f66a1b63a4e9e246c22f4d3a4c3fe20383889cd9854564a2224deefc98dc0a4f97a55877178b3a38acd184c2342928545cb4d932829f5fbc18c367547f249dcad2f23645194f39abea5a52142a7ca84cd57e0bb3c00888c25e16cd550b03d69d35135144759cd589c23fb9dd413691ee7b00c33c5b0f1e6b52ac9f85eb03d037f59513bc08d5e63de30d53aa659bc38a48d9972c705f8a06122fda3f4971ab64e1c8d21d8a5f0883dae18ad278173bfdc0abd4d4a47313220841e050dd534eb604ff3566495b5229c05a8b41d754163b759a00688937acba415114be5fed0c56645f2dde57f53d9112efaf3447dc582579be2532f783505c0313fb92b66a6c002a4e0117abc163756e1d3cb387944d1d06a5797e61b397b18911dc2fac1258e6698023d6a3330fce499031bc4564779c249d231064bdc2f03c00cc6af53753082c7e5abd901e3f902f72852b88493d0074280b52b30ad228e28dabee1d14ece39b09ae9193a97d264fdf9e4bead2958e211338aa76c8d045d5d2d8e98b50c7417bc83f11339bce7699ee789ddb15462b9a7a2189863affa1be3e1c6e725a7e9a5becb168644217ce659ad935912c685d13ec3ac37ebc74443d2ff6163020acd8579ba5f184930467ee27af360d51b49720773d41088af5a4928184f9b6b8c3982152ab7029100fb708661e005730eeb9e21089e13d4a9cfde5bc25dc2618429750baccb36bc7a47201242478ce2e0c86525bae9b2effd5a35d33246af47cad065c2ab5d43f1f77b82761a826209c971b3204fa5ef077c2c650ef7bd4dfe080b51f28c852c1d22b1f2d31b647e1b358d4784cbe17f363f7a14e70e6d2a16fb8d8b6d748ef3c35d023e53c35a3224d9a50bff7e750664358da9201df796593df1bd1efab1c5f04522c777c37a4f714169d640bc150257dcd50b94522fee71939f5fcf3761c728110d595082fe51058eebdb3e093780797510eaeb2f723917a9671cd3cd50da32a8054dc36207e15974a396caad629f2a8dee0de63ea7250582e755df73f2f49bdf35e024d96ba047d1684c6c03031e278c9758f2f1fbbfa148cf9fb2e6f42250554b11992c8442109edd857a52da0d9ca9273492ede6a58656725358e199218c57d3a52702e108406d7c5e529db410d47b15e960ed468a0717116e463d4cc8537e8fd190fccc205754ee38f31fc30a65ade4aee5ee1dbe751ec5de6862b04fb1c8dde6eea5c595bf176dc14cc1a1a375199e878265c207ab6682e3cba44490987eae68ec4534e97835833c651e200d5eab319db942161f0ae4e080a8a94a06a5978b84666ed9f3f8fcc7c5ae9179e0a9a73c5718d0cb88da2f0ce1ac255a9d2b15a9ce51bb71d4132f257d0e9d4877cff31998f8d5fba33e06150522b8088a66bca5b38fa09f04e6f082a83aacb036cef880c54b234ef24ef0f9e5e11fd9d780842dd793c31c9b36af4d3279efab048e4bfcd523249f6bdd60cebf16e0a242bf05801b5853c1cbb45917927c45a07cb7460599e302e3ddabcd69524f90d763ce4f12ae59aaf73250bdf82c577450cf5c643e2234d1142cacdad3e41988fe2d43a51d865ea1b338bbe332ec51debd5f42d0d41ec28f1c08b1249d0edcd946824a114a8beb4c37855f7ea179bc7f211b8475af9fcc86fbf229dd15e9315f205c9c7d132c6be569f5d28e3f54c788c382cdeec516d8e1636526525c24feaeb976bdf36676854ced56b9da630a1ef7fcd0c49911de411537ddb974bbc39d6a5ece48d485098803a7fc4d4f704ecf37269196bee79a196553d9fb590a12ba09caa7d9ced61863c334422bc3335cff85237dd89ddc63b94b06ad83879a6d907e9ef7495865cca8ab621bcbdc2b60864de3f7feff0e7f23d12356aa4f640c00a395666e4287dac5ab334ac3e474c54f6b378ec2a51afb5a331996c21bac8501984544e7b6ea1231c7192b9d290e69d843a185084610f2af1a1614e6b54563e1b3d8298c14722d7da8ad13e04f634ad0bcc7ca7777305f7fb11ae43c890c8e7ad07291cd84017bb5aea50c1395c8d0a751afe197ff9acaffeca924b2b50060758501badb5c4c56ed0ecdfa2b69d38cea31715119600d6c018ce8bf595bb9c9bef8a1cd44798fd4b9281b49a7df0c254ca49ea62903f11b16644aed96a866be08a62a2eedf3066b4a515250e907810fc50e410213ad1018154833cd7012ee266065122de5535884d7c9053f6efe9e5d62d5d765c35ac5777d354b2a77c90b227eebc8ee479bb37c488d9f4565caa7af7314063e568269d48edab18997951d821969ed855cdcc7326c0ccbd00763162691faa920d26a23cd5278bc26b5158fde5754b4978ee76edc48d26c1344f9e9bbd3ddc4625588d67265ed652df321db16e540d8241bd561296803dfd3d0871583a8c13e93b9b7e274aeadc7d3669e0322c406f0a1ae60b5387853253fad4c5af979109f51de520c7325ab22b2784e2f71f22446d8b9431003dccc905a7d247a4d845a11ce84635764c5c6d69128d2be3006cbdb1fc73dba10bd5e1b003d80492d3c9d7d88b74814321de5ffa39eac4a320c6d3e864abf3d90ce3c7da0b29796267e161881b0a8d6fb8a8e25e5ec91b0b836462286ec8e7ad9ec74041452ea7039b6b73d7dc441a57130907d139bef9b4c8427347660c61d2998266d0552ae9e32111c93d4eefc7e40b3c840873448f0e74cbe4938bfd8b7e65448164884fbfa38485885a596be76d0cf1c87b2c7a0125637f4696c37c457d721ebb421b5bd0584e9d3324f6087bc3c3974cfc90ee38c6cf3dc407f422833bcc67ab654ddd1a1e9f9e667d0037591709eb806783ae7a3e0b5369af6dd3622c49b3f6d93c465831719e3af3f2864e4d3686647093957cc9c62191843633548948f445a1b045f137a2460585393b58fd826a83423e822fef047c1e4121eb45421f650e58ece6f129e4abe394f2516db46938364d8d46f1da6aa43a6e1ef2eb8139d84aa8a28cae02efc577a5872c6eb0c4c5bede3ce518095c6dcffb4e7b1fc532ef6d8ffe736b0f76349545d73fb89db0ea616bb0008c3bc9a496c8e01f6a0c69e359ae5db03217feeb3781806cb6e55d2b5431f856e68b01e665b2652e1dfd7bcb5e74fa2b0efaaee87bd765a97f2bb8147730f85df873efb2fb39833e8f04da9d28c3189e928639449e1736a9fd4df029b3773f5d996234d6b673da106e1087733b91789d23864caf1a3c569eb7c1dfe296d5a0cebbf01b5f805ec1bec48c5686788e5c25ca1203a28e84a5741584a291561893c0e05430d5d3a651488924f759666f10190b2b0cd42524d7dabcad9712fdbfdf61468e03cd83f093e93855f4472b082575ecb5dbaf486a8b886f566287e4f2fca34259d5eb5862404a8caecf754c6f5b820eede4bb8611ba8b02937d049c0c293ff5885aa97f638de714a03a3888b0ae287677accbb8cf57021c8a04dc5de97cce703ff0fba4a28e0b1858b809c2103af2eebf0114435355466d9354869f52ed65500648f468e79c53cf2be147bf042923af6a47ad50cd7416c6aa018c9471ca8048c644b553c78ef58cbec098b8cb8599be90290748e4ccf65acb224d8679dcffdea47b602260c152b3a8666129aee83d6524c3d828469232a035711b8b8ad20d323dc2927f04ce0df90e5f6810d1f233f84b7ca6aa9270e9a0bae8164a789aeba4514ccf5ae48cf886938a73202a9d54e06619b93966fd6cb86b8aa4cbb9815792cc245d67672b37fb13c053c96f824d747fa72e4bf9411f73da2005b41528b7950f5032a28f58c1b2126a911945f9b8108702c20954de4b725704eb3e4612ea05862d89abc30783ce17100c1a5b81823deda2e4edabf1cf164f9595f19634eee8fb57866fe8cfc7901454c9cf0e7890832f2b19e4d6bac051614372a1b212ca118494d729493637b60dec8cb78e1420c2d060653314eed4945cd875699b61eb03e9651623590756b0751d6e3fff7002bd525ae4770ae9fc06c57eb3244d7f84e8ff9524a705b115af90566dec00afe52a1b1d17e735a3acd31329e54da5fb2e098659eba8995d647a555457ba767aeef33ebd9202e3d9d38e3bee1077e4d9e2b32b3e236a412b58319924590e98f000a0ed5bdcb4ef21eb8a6104e04685be80c708d5190cf53717d5a040501f4c07d2052aaa21cd76c38182235bfa2c1385a5718e78aa94c657ce433ce58bca5d80caf094c2715f861c64cadda3dcb95e0d4e3f518246e919d62541c9a09b33ca66098247ecd2081e9ade46d320b48deeff565696b4522973bc71a0de81e9aec5cd1b6d8ccaa0b7e3bc017dc5a1b4586ebe98dd404246aad39013a8a87b03d81aba3d4e9da1e8bdf1d69dec85d8d05e1b611317c7fa0bcd3d3ec80608e49a5c806bc0a1d617cc8412fc9d7caacc5d988441e331ff3b9bfb856bc3e1e32830010c02578bf7b702c207ff434f833318ddf98a890e90f1585c6d57da1996812a0b24cb810d6ce0854306c55a0a3914641aff2c03333d1f7017a8433073e99d0945f9e331195e3e5ea43795ac1ef6f9083708841190d0b4a17c72330c77ae103124886da783bfb1cb252796d520846c325130ae2c44ebc40893032f8f9329641c79e0ba3f4ffe0b8d3b436e9a2ec0c63349ad2b152f27cbb16bfd683b296fb70d363f457ec999b10d4dee7168f5ccdca1de29b9dc10939917498eb80d9fbb4f391f213ea1448b207392aa77fe10eeb61188253221777c9dd9ccbcf7287d447e8e045d0dc1cc22d9524effaf8c654a04016cce5d6da59ec92f51a55c9975e080f80c8cbb91379d80f773405ad4db02c59f0ff8362bd03c4d55a96a8865e64512587fb95339d9c98186a4678d0f64f4ca1c7f0ca69d100183dc99293a97f205f86eef55382c511f6ae7325f2661e19b3ddbde36f1143d480151389ee5dbb2fecd00aee3798f08a83bf561cebed986e3bc07571dd5e3706272c1255e185f083d9ab357f9dc00661f4fe325bdf55cb4b7742ab4892bc61ba51acfce0d7b950803dcc137980f665dd403e6d4ed58d18218d3be8b72f59d4aae6561dabb4790f6b902dd1a5c8580410975d0b5215f52e225b68aa46c427804f52dc0db860ffe4e87dee5a4c4cee7da234caeefb468ac768ab34d5048891202adebd4def43ba24ec438a66ee93f79794672248370bdce53150f1a741a9c0ab4e588a7f16af61c07243fa960ed87f920c298bcfe970782f982c054b4e68754997c765656aa2c8880f74a706df3661e8dcf5537859d31d42472ff22c86c9601d543168036404d94a69f20ae5caabd5c7a68c291618d2d9c14244133c3e13c4f0f0fe41fc97c3e4420fe61d06903dafdc1754ec87c07235c8474f06430c462820bdc6afc1b9cfb526f63c0b1ab735dccbadb805743ae7ca480e627a3322b98ecf74ea96bca515d06b9a2b6a83d63f4909e6cc578c655f902b42b65a815aa1048c8c62c592865ddc407eb08d8354a4a5ced60ec16191499fd2a8bf0bedc1e1b5bb462ab1a3f6ea8d8c00e6dd688f5bdc6aca54184ec4b4a5c469c584b27ca1df8a2a91a9d5183f286ceacd5d197dbc5d3f1981022f071c7dd311caae7e73c8d14d6bd355e4b77b35f708fbee48047c553cd5242208c6842f201010008438395504025d86eb168bf22516314b9cae0607fc6da39f548247df76025f6debd65f25404606896e02cdaf4ac2984d476cd4dc7464dd1a5ea4aa1f0b887cce1f79fcd47b55cc495786c73f6abf705007cd895e17ae9a8376491c4ae3e3797af782cd4ab0d3e7b146da8a787e66880ccaf9893917bed51ba741b9f3508e31beaa30e9ec04aa66f98d898cf26caf2738c2d4f39f178ae209eb8fb2b45cafc9963d36907826a4c9dcb2a15246ebdeb36d407d397640e997c8b138707e060bdd23f35e3209b813ea410076a424ba7b7c3b0812d9b295fdf6e02800388f26b3030ea2245f3134c06082000195c046d87fdbeea22f59ddcb085c48a56a7305664022f79c0964fe4aa22e62104e889d449af2127e23216a0c01d3211d8719474b80d2de4296ab20d039a88d73a199852ff33400d8d0bb288f89fe685d0054512cb656f5e6d6709fe31211f13cc7f863d5130fa1b5eeb00ddfe6b15971f079911e9b2369c60926e8fcb2b65874ec5ea8086c56f75e8527099700c58ab61e83328f85f43dd1ad1cbe648e547d1e0ac2b276369a6a03de8b4335c416ac254bd832aaf4047e30eb347f27f1a319df7ce9ea4dba6ae2184b9d360824973e1e55e2c806f6ffe9477a3856ca84716698a2ee7ea9932b4016559d11715983ad07b8c6c72ad49b49f237de93d1d3688924c1a9d225799438e669aaa8558a02f2a5d31d36a1319d7b01d3fc5c254745a6b6f73e64a52cadb089d53308f138a9961f4aba51157903971da2aa630de31cc91b19cd7fada99245f8314877ee53fc10262533e6f6a772339184968b1a74e636b657a5cb766cb43365efde680b77b45e8ab8c3a0db8b6d66aed32378d951d7869a21f15083e219d1654a0a793617c55f136d71f1b1f5c4865163998d7a812c2ae78cdbb2e5bb2b13b485cb664a191598f74ae362c01e815192c7b93eab2253493c8da0672e993fdcd617ea8e662dd2101512d5561aeb2aec3e6404b0b0a668956566aebc3def3fe6b32d9ab61e1076889aac1d5e710f81a0a7fb595d89875c03e5e50c1288b6757343922fb61b4347be031ed3d08c67a16210e8cda3991a0af01d67e3cd4e017e507f53cb6db8e4d054145137c1801a2932d543cd26aa5751e6b006d083816df23b6491be8b5b9fa8f3fdc66d7cfc443b92b30c9d186c9b464b5b0e6204dd2593059c0de9e51dc6805986ac2050f306b72f860307cf1ce011dea79892b6d1e82a2401e983c0e851dce15737779b7bf491d66baae1e54800ae27148892c9e13ba8f224c8b402fcb664a3d4fbf5bf0087e8d406a4ebc4a7d7c13b4ea2aab2ac2b752c3d5348f77561d57136bf7483ab31ce984d76d91368c61eaf176548a967380c23e09060326883f8a31e626818e07e0799e40edf8b86c410df8b4dbf9daa83c2a81a3fcdb72a996bba0d14aa6f68256186522daa0d96f3f12c5560adb5dd1c3b6994a09a681244e3de322c5ec73036297be199b3e83ca991fd4d716e1bccf1bf9bb5fc2b007982691936ae442011918aa66a2b0b779928827810357ba5d5e14da9618b45dbeac9c1e8a77221581943a13b612ae4c79633444c25e6d0ba5be3491a916817a62521ecc24680ad4d5058bedd6064f278947091a704724590189e2994bd196dbc3e7f864c454847ced5fff892d0e25b674b05aac65ecb59f406475c9b4f4d3f4ef7b296cc179410c8c11b0d05b2d1263e228abc939cd9935d6c49713ce4ac8244221768314ff36ac0a058f1b4eff0058ff4b37db350297e3c3c6831f5bb4500b0a2ba00b0fec74e767fe4da2a5ca7141a50d0204c01b1a98a0c685aa113e0a6be4067ec92fec114334fce834367886ec26c76bdae36067c104396f9bf22af6c49ce4ce1b6c3f04f6546a751318d4e49fc0cd98e2e6245f7e070c36d78b4364248d14d511b1673123f60b461e22800b6bc583ef7c89c578a719edc7866f8ffe3a736770c3aae15d0c6e629af239db2d6c5462c254f67dc65ac2c5425bb933b987d25dc80acde3a30b695b294bb0638e2361d1d30789eb0b95b9bd8f2046b0404b4cd1faa2903c50a1e6029752752ba97f5b67a7e8976c79903ce62a161aab394fd71e31448d1ec40a6535a78986e1d6af954ff9b3dc1054e001bb32be5829879941ca32734ffbd9f552865a2151bdfc16ae468ae1040f6d5a4df82b27ba150667e5dd6dd2bea9c2a5bb5971559bd11e1f1247e89a80481d5a545e62d801d10dc14c59ea19a4e446df0e61587fe37349bd4880076b166dabd3c5e90232b0005597ea43be3437fb1211f46974693c7aea21ce294a894c3d0613c901c171f7f55cfed9e542379c6f1ac3c6e0d7a80a5bc7083f656ec47236a0e562a72325ae8498c32ce696086401cc9c3302de2d84900a3660b0a490033033333333333333333353939aff8f9f773eca4db6dca86a2e44814b5292ac8864e9239ab5bf0d7f9136fc45da3cf0c979a00a020b030a7814eb383f8a462a3566f1ac6dd1802d1ab0c511c68ba2b5902b587ee087a2f9ec380a56620145a3fad37f79b275fc273a9d8cf9df2bf2c3973dd15ea466e68fcde8449f3acad9d2c89fdc262732134fbd495581183e066fa293a821f9e154bc88132f62200619288b199ae8c3ddc8da5190c8fe67a20f41421e358d6af98b71bc3817781106195e8821c6f18205ae02ad04ccc0441be2c4f43d0f63be608011060bbcf0ba441b3a9e499d0d3927f596684625334b5cecb8e6bed00a23066080e11ce8a20b30c0080303d58a1995e83c7b857ab8a173073189206650a2d9ce714e4d8f5533a54346182758010ac808c303878719936846c77473bdca22f332cc90445b31a2658f8fe3a8cc128926c64baed9f5cca3cc41a2bd982cee7e4e1231cc784417bcb387e6bea6c084410132cc70449ffc23f7c484f0afd146f49f2753415bc59cc20c46b49a92c7f2c82948bc3ea53063119d8f7e88a3277962d252117db0ecf3d78c6d186624a2d5e928e7ec93e34a8f4444af2b1d398a8588d6da219acd3b613226437ce01ba2892945f552b7afe40b8619856873a899b133c71c8f6408d185576c16dd0b92299b5d983188b6c3e496312dddaf634d304310fd24eb78f11fbf5a553302d1a47f6c0ad2912fb44ee0658c1980682c343ce5a039f2ec51ca1533fed04efe55f59483f8a1315fc968b9cc197d682b6acca9e8fc4161061f3af7603592c59853393e630f9d558fe8f8e7cbe58d1e1af720fa7cbc2a391c8b7e61461eba94c28598e330a387add11978683235735893ce1d7a8f42f0cccd19ae5bb143eff1c34b9dd1721c25e885197568347cac29635091dc910e4d7698d0e06dc9449373e8238f937f4a3f553fdf8b1972e8239aa7ae7cce1dcaec81197168d563bd248c058c197068443224268f2b6fe873a41dd3bc376ee83cab98fa7ac7e3b1df86a624660bf3eadff13bd8d0f7749c16524657a46e0dfd5a9c0b2907be9355a3864e7f2205f135d3d0e489a529a47324517734749a2ca7e60e2254a27986f6245904cb0e1fd97133b4ae1df6e4ecd0196568725a85cd964f3a2ecd2043e341a6c71aab27a470c7d0768ecd5fffbd1803058c2b9821864ea7a3942763644618ba9c6c9e344be89610ce0043175b3ffd2c5ffc852666865315b31c494a6778a1cdb9173ceb476674a1ebcfb1958795a7636ec8853e66b5c715964ae3e7d842ff67de1d5ede9cd4b216da6b0f4457c344ff20a5851959e8936a8cb2fd713c297860a1c9e7dd33123cbc0aeb15665ca14d2e32f9bd2b216e8e1956e8afccbc34e4f03f63e404be025701b11acca842ffa17291327e7f10d7175a0b831954e83de81c0513cd90e31c138319536833a2a25b9e879312961f6648a1cd39efdbe5db0c55620c9b43f25056e0ca8bc238cc80421fb77f8ea3b052b2977fc28c27f4be2ae9f1cc7cc45f9930c309bdccc428394a3992a450139acd9f293dfa32c189b996113f5f7a83194b68dbd77248d271926d5f097d86f238f2a852474c31094d8b85189349eaec954342a3b943f219bd929c838ed07854890eff9c0b9334429bf3172e072972ce71a4084d26ed545616b1271e223453ae51cbc3e8cdb0cc18429b7532485a879b25fa0c21b43e9f3f8c5a1d22cc08421f49ff4e5a0c1673ea0c20b4f1ab1fe282695698f183aec73c5c0bffe18a757cd04bf88fe3d8fc1eeac73d68e383ce659974a97267f0a0b35c290dc1fc1df4719c0b1a725c922accd04153a61f856415c3a49622989183a6e74f2ce7d02f5ce93370d0668dcf9752c5998d0e161c997183fea547db528ec71f1d5f6885418617638001869b2464ccb041abe971dc583d3d9ff531c208e30b43b8a8455f2185183e11bbe282167d9c3c928bfaf959f03fa5b19145d7d9e6baa16131479d58dcfe9383eeb86c0b16bd87ad6d7da9e21231af20278e4c6cfe482357743948d5db7924ad7892e5a091c7424b0e70c18a3687a7b13d90c8e8210305b581034671310e1911582d70b18ac62478942dea872a3aad187323de83cad9a6c2a41a7b66837ca0a2dd6acd414ebd50d1434fd189e678e142bbe23b53b4eedd261a9937a666a5e8afc7c3e8f92245bb39fc0f524fee0e37620217a3e8aa3d7f90f00dd6f1228ace73de0fdbe2a64e1f8ab6cce391e41b2aa75150f43972dc1e79183f84874ae0e2136dee60992d633cd174a82ae193c79731873bd184848875cb7e292d39d14410bf145d3d0831859b682c55ae30bd9765444d746122a477e8f9580849021799e8ad3b3374b828113c0a261a59f5b877d5532e2ed10771437f877e47052e2cd155dc3c1aa39f4a34717fcb3a3e6727724af49e03ebd6931c5d64fb62127dcecfe8fde84c72e51f9b021792683266a5677262f0f944a2891d45178d60d93f82800558e02a5801390147810b48f491629235766ac9b9c4022e1ed16c72f98f4437ce79e70b2da400178e68bc2c868e34bbc558f1e2bc808b4674fdc167cf5c2168cafc0bad149cc30272350673c1883ede73849072eac931c629a3056538032e16d1c6655c4d6db929c3a38826afe67b88bfa9e39a88ce53c89cbbda8188464b4ac3e718a743ac5c1ca2bf8839985e34cffd7061883e53de4cf9aa5cb2322e0ad14ed2fc51a4238f37674c12e082107d1cf35966995f8eea0fa2e91419abf283d26cbe207a1fcb41e5e4d1c32649203a51f7b7306e9d1b4074c15dc348a6ea92f0ffd09579fc14e5f74393bf538c1da2bad4fb3ef4f1a7f0992564578e1f3e741583c528b9827b683485776c191f3df4c1f9c65ec6541d76f2d0844ad14c553ff0d046d5f3bc31f785601e7768cff3643ecff93979871dda354fea2f1d5387762d32a64b4e43873e089e83cbc125855ce7d086b09457dd43dca01639b493a22a8c5f6cfda9c4a18f83a48b47592efbc3a18bf2282656fc0d5d59bccac9858862b91b3a73f9641b9a2dd151890db3a1ff20e9f7862b0db9e535f4612693891ec88574d4d0e710afb3974943e36615eb992b1fe768e877cc3ba367f70cedbac9957c98a18d9e0ab21daf2cdf2d431bfbf358540ed1c527433f216fbe88cb7182670c4df29cc30fc3b649ee1043932f5d37485cc3d04887ab153b83a18bce6e7ea1cbb144ff384c61274fd20b5db986a4e533ae1a6517faff303277cc15eb71c88536e4189bf28ac49cfc2df4fe31245d8fc318179f169aacc134c6e4b3d0c7a81342f61839bb070b7d877f9cb60a1ab3c7157a8faef11f1ec40a8de4f9ed1c8f6a6b0e03834346192a282fb8a8423f3e17227bcc6196850afd44c68f77e42934112d6eced1954293ccc366c4b1dc37a3d0aa88579cb9a0d087040febe7914f6837c34bd6d47142ff1e798820f935a1f3ca31c77a3eb3161f13dac81c5aca216e8e1e6f094d74f8642613e279d8c4f0324ee0c50aca10a38a4bc08512da943ab6c8c1a4d071ee92d08e840d95d94cb2688784b6d3f5e2c7f17860f923b4e3fd695119e3f98711baa8eaf160f265c61c45e8bc5a72e8872142b371245597c7cdd1d9107a0f3bc143b84c08fdac86cccbc90edf0f827e3aedb1860d103ac94a597cf2fa419b62b9c320af0f7af98ad7173a70dd580ffad1ff2875d4722107150ffaee1834447a9c0aed0e9af8397e468482171030dc8441011306180c869fe342079d657fcc1dbc28e02207ad9e87ffd5f37ca135062e70d025937051cb748c01182c60c1021c0c5cdca09739ab98275547b29e73c0850dda0b65ae214e272ffdacc516b5e872c5305142b5790420c216b4682fe6a83a6ff61c8550b9466c318b3644acfecc517e6f965710a7e4fa81a96b66d1e989486c559eefcd64d1a7a079f4c258349aa31c73a8f647210616fd46c7e4cc4af6c9bca28bb1e5e30f5305ff704517f3c58ff34954e568459b2309931e5958d1f6f76ffc30a53c5b56d1b59acf7747aaa2f74b1ade2ab5c92715ad644939749670114645db99a2cee44498a09fa2f74083a84fa7f48f4dd186d0f1873a16f9518a7e25a59c5a56d949d145759afb59a3e8424855ee7245d19e741eb1ea3852138ad62356b2c4a6ea41d187fc93376b97ce9f6827ce8878dcef333dd127d7f8ce51d2896633e48bac29275a8b9b225ecc21ef6713ad7a143c3a42072ea7269a98538e793457854866a2df2ff349329df2949868a2a410a29932f1c34b34219aa26e7ad20ba125fa0dc91c2da776384925faeb748f5f97d79150022bf32c494da26fb59033e530a13a4c129d6547a92ca1392d9168d5a2fca61ce31943a2ff89d4e2e523fa3036c5f4cbb37295233ad3bd2e13b3c0f0ab46f49f52081762b7257a1846741ee7879cfb353af62c176163118df44586a02a9fd91b45201a3449848d4474319a250b7b2d9b3b4344ffe1b576bca9b25267e3104d76e99c32e74add3c0161c3106d589c2097fae9b97e21bab4903b0afb51a5d41921da58f29719f234882e7a96ac9290a742ca11441f7e3c0811296f470d6d209a9749be2eaae1c17c00a2896b96344ff6e060e30f6d8a71a324ff2831ca20c359e0450bc0061b7ee8e320e3fb1b264ece1c7d68a3f3e64d9d2a7ce882c5cb8b7f99d68fff453d7492fb63d20f34e4b12e0f7d55e8350f493bd41e0fedbc76f0ecf6a875af8d3bf4152c7bcb9e07b9fc6cd8a1a960791223e754e46388e12c400c5889a1808d3a349a971ff3e740b35e8c0e7d582db1decb3ad23960b131874e7247152f4707ea71dfec8a0d39f492a73c588ac76b7a1dd8020314d888431f6bf5847494ad39887e31060ac02865c0a1f5c9cceecf1dc548320b1b6f68b7927f0c39ff082eafe01c2870c1f18260608b0670002d20022f0270850d37b4d15304998e35a69ec8171b6d285b453475e4720b36d8601b6bb00d35d8461a6c030db67106db30836d94c136c8601b63b00d31d846186c030cb6f105dbf0826d74c136b8601b5bb00d2dd846166c030bb67105dbb0826d54c136a8601b53b00d29d846146c030ab6f104db70826d34c13698601b4bb00d25d846126c0309b671842e54ae868e1bb0c50334a068870d23d846112c0b1b44b08d21d88610ac0bb38d2018e92b99033f590d1963a08002628451c6185d7431c631629411c618e7045d7471026740175d9031060ac0e8a20b92651c57c6162a386444608b62653c408c4306182820c3c17840175dace090418683f1570320c306106ce3076da75fced31d4f92b31b3e6893e6f21caa07d9e841eba9d477c2fce494d90d1e1cc59f930f9142f90028c4c60e1a8fe24d524aed303545e2b0a1833edc568f7192b4c51eb30d1b39e877c4935996d8235e6ee0a0d1b4b00eb2877fe3067d903295e438a5924e7dc3067da41a274684ca1f45c9031ab56842fc0f7624c45fee4fe2408316fd07a3fbf1478a4eb8a41b68cca2b58c196274744e8e972cfaf7f6e49e5344ca211f8b36a50e9e394349881d08071ab06873ead6d6aaf2154dfecd18cfa41e620869030d5734f33992330baf216bd88a46e3781c5d55a7c18a364f04fffeeef0477f1aab68ce34c7c73b5be6b14443157d384bcf9314fb2ce769a4a2ff1c5422c7f89126021aa86872d84e3a80a881c6293a134d495f42d893ec9aa21ff1de9f8fa93575e896a28d31a7cc5725cfd973608411060696145d46acc8f46cf973cba36877528cf4d82ca2e8b27bf45e3d3d1487a559f3a068537c0ec3741c07115e7ea2f50b1fe6d03af444fff163d10b413c4a6b51a0d18976c3aa55c895cc2b174e3421b69457068fa39c580e3436d17610da633fddc36cb8061a9a686255ea50c2c66864a28fbae7725c298c071a9868a6b73458a678893eaaabe5768958a293ede0b43bfef03dfc2ad14bc7c187b11d1b030d4ab4e13d1dd6726e12ed66d60f2a7645124d048ddcf3143df2cc23d1e8a5c87166faa43a16127ddc1efafd634be5b52fd07844971a19256e7e2fcfab23daedd49b937ceef02336a20fbe6a112f25493e19d1cc7778ac7ed822ba7c39fb879f554467b1395e895de6414822ba4cfd0fa739e7602a44b4da66397e1073b24f955ca071883e4662fee718ba49b52dd03044e7714cb249c746a648a310cde49f10232e4bb6830e21ba8a59ab6287295d7491051a83683fb36a76ce612ba62b88a64cf2850ff1713a2113a011885e5fc5da3bd028393ecd48400310cd79f546d83839bf1431c230e70fed7f7438e9c8e30bad1594a17e685653a44a696ed1e37da1d5873e0e7ad63f8c7ce82d3479ec16b163ec3340630f7d8a57c9ee29e730445169e8a19fcd94bfd0da10d0c843d3a1c98733973c64c87ea10503c743dfe1a3780f3da548ce05608431c6182838d60234eed0a469caa1522a857c190d3b742592437df53898dcf9175a3f021a75e803bf109175ad0e62f9428b0e9d78889b1a4ae5f7255f6895a120a031873e8eb831a9395f689915a0400e5da5479be51c4d1d3a5650c67b110331c8201da01187467b52b40c6b1ee796056178718a176190e1450ac238e6000d38f431524b232bafb9f85f688da1a545e30dcd490edac2e2a34685bd501a6ee8334756b4ecd006c838639071c6d8038d3618af39ab3a74df4e0534d8d056e6a8afa10fa4f2587e0f57431fef9e7f942f5c3e4ad3d05e7aa6c56850ff40030d6db4480fe52a73862e7860f2d5b147dd9ecdd0ae26d3ece9493dd42d435b3134a2b26406c92719bade1095537bc79772d4189acafac132e86268e392c4cc9951181a6d991872881630346331762421e65fe83b25c6c924150d2ff42985fce4952ae26576a1979833198db13cd08d196870a18f434bb3ac7c45c84134b6d09afa44cab187167af1fde99ce396852e4ffd731c58684bb7015bd005b668c01664812d1ab00555608b066c4114d8a2015bd004b6c00005b6a09a030d2cb4398e24c29ac48d96fc155a290932f937c60a5d08ea1d6594a467d2abd0473936b388fcb847672a74f1cb2327cb52be7b2be8048d29b47a9939a46c96e3f57f2d41430a4deab9f674d01c2e780b0a1a5168673fba75381dd27dc2f2a20641030a6d7ebe84c9928d7154e016d8820314d8e2e8a28b3cd078429ffec9a473782157489dd0660859c72548349ad05a58e530156552bd8306137ab99892851cb3843e827436edb0e93f1a1a4a682d4e072158eba624111a49e83bc8510e95ce91d0cf4bf4abb8d0e22d1fa1c971eb4de567b96262845ec272bee5e085814611dac918277b6779f2d02742333958d11c25977f421a43683ff87385d06be511cb81b9416832b3c4ffe5900610fa20ee5e858d0d533969fca0cb5ba123e4e055f3485da0e1832e4f8ed1b81d07fb29a4d18326acb2cd62884c4083074d0e3fbfa4ec96224fca0eba9c94ac3d48cc96943e4043075deaf694bc60c9411f3646a91c15f93ff1175a6739a081833605ed4bc9db12dacf1bf4219305bf9cb8cc9832b606346cd05ece4bb983f2f840fb5ab4d19fbdf37516538ff285160d66d0a2f99ced9f5f314bc43f8be662e88e13bb953a4e70063364d10739ae102531a2d572b168aca4c5e390b72462fa426b052838c12944063360d18f5a46ead8b93d78fb8ace432c97b0931ec654010ac8408139c755ba020b4f95347bd463ad61462bdaae68d11dbf428eb567455bb973609922070b9fb38a26d7b35aeeee55d174f49410b31d62d21c1dcc4845eb1162ad2df274cc1e156d47b13a16e101801bcc3845a7bf1b72b432e9648729fa903ff867b6f85835f78a19a5e883e6f1204b2c8632958c3038b04503b6e00005d4308314fda77994e303bc84c37fb8ee1c744ae8fbcaf364dd90a94f421772c78807b2a51b24b4d2df2fb9c324ef7684de3d8719a4e365e518a1d94d2129a7a3cc5884cec3f4a790a972102a22b49db33f4a502f0f271e42eb6126a75cc5a48e10da9610a2e21384e3f48dd451e881d0450839ea8fcf0fdaf071a5eb757cd0e6d81ea5d4e12c4ba7079dcc568c399726f10e1e341d62d553ead8419323f758c1c57d3d45076d8a9773d08b587f587071d06f569847fd8ed471833ea457941c3f4e8d1ec0067de698d5f2e50791682dfa603f87113ff89853488bf6838f75e5cca2cd1863c712cba2d18e8ec72224164d6ecdf99022b0e85525263afc062fed155d78e5cf39ca1d123157b441b5c37410343ccc5ad17844abdc95fa6753ace8caa2672459fe7f6b57d1ca574f0e7dcb996955d184c8b18ba6b4a9e87537e6b0393c441e155d65cf62316cac8c5f4f71468eb7a6683d27c4e3b314ad868b971cd5b5824f8a762248869cb373981f45ab39f0e8f17644d1c4ff8fd6518e50b4d1fa23849498c60f509ce42a48bf7e7ca2d914b583d99c997ba2fd8e1f33a2c2ed44fb51eeba7ce8b17b4ef4e9517af40c9f11de44933bc8af597c4db41a432af178cf441b99cce2acccbce598e83c34e55248fad5f125bab81ee658f6e43f8eb5445fc13f5a9987e6772bd1879a3a2593c6e8144ab4a9824c7cf024da8fe3632f8ffba34425d15498bdb89ec3143e8d4417193c767e5221d1e5ac1a8367576732f5115d24f1ddd9d2116d6a84fd60167352b011cd4a47e13d295f8e2323bafc286bf5340b1da28be8ba33c78bf06b1e86a8223aab6c25d983afc58926a2974c792466662f9328229af89852d6b314c5227a88266a6be6a037b55b4c0dd17b48613493c7549e69217a39ffb8561572bb4f88d6731c85b0a8b6de1c8368baa492ec764e157308a2b38e1c93c394327847205a5deffeab98911f06104d5e65ec194d261de60fcd55a4a0d31d3376e387aef52cc7ef9b2543a50feda4183add73479c381f7acd09fa52ee3997efa1ef281dcb477942fbac87de3acc71ccd688f3721eda0f43e8670d7943bb78e8b354909cec1dfa6c4ff1540f3153edd046f9eb140f25aa44ebd0e64a64f61c567a48e9d054ccf1ba66eaa82f39874e6236875eea1c93944393c37cc54a0f32a6601cba0e2bc49f180e4d7e5f8ee315b79837f4d9592c2bc6b87142dcd0c5c95179f3dc606943e712726ce893ac75acdbada1cf98613a54efade8d4d0e786c9c4748a316a69e83db61873ec8ecc3243436f12423aa46645b4ced0a6c892e7e46342ab344317d1373aae8ef32429cbd0674a85dc302519bab0168f3af5471ef663e832359b48871e5ec711436f6d99542313067388493c0e470386763b66cc1e593b8ecc17baa0ab16ffa378a1c961f2b034c72af9ef42eb26bee129e642ab1d8a6669b6d0c5c656eaff4f9a6ba14fabd80f57e35cde2cb4d3321ecc7369c763a1bd50112284f50a7dacf6102179acd0bcc7f249a1c9238855e8c328e6951fcc791852a1f9b0214ff3640a4d8ab58a8cfe49c3440a9de438496e0bf1d24814fa38339b43d1904b3d84429ff572b4481a3ea1f5fe4d1d660d39d40a9dd07494f56263f68f96b0097d2e75b5a4dd25314226b4a1e358c227e9e7c72fe1f63c5962db57427b29742ce64a79529f84d63c3b8a6ce5f81f098dc9e4c7389fbf9523f471d01527f473e0ba119a4e0f62f77b8ad05cf60996d43b9b7988d06a5f6b497a9021b4e115b113e2bb873142e82f66e9caad1a2ec404a1df0d2152228721c50b103a977f9dff50ebfffc0ffaf718337cf0cdfe8a0ffaf0bd9efd9eb1ce7bd0a5a03ba1d6295b631ef4fadaa27df10e9a978a10d5f933be0e7acb8d593c74a42d39e823c9495ad53266c7419bb217f38a6b801bf4131322a455e5c7a9016cd0c6320d17d942b29cac4513538af6f33079ea498bfe3cccfdccee3984e42c3aa99c731c64298b36a537a747d59d2a63d159965fcb91c858415834a31972ca19e3c284e415cdc9f46ece39d4bc11e28ace73fc84ee5bd1e68b9e92e45aa27eac68c5fabbc38765f2b18a56e3758a219fdb3522aa68b4af33bae4662b3f15ed5b1257f96b0fb3a8e8d75b7f2c798a5eb3070b39ea98a249213a1e4bd14bb999747450e693a28f3df2f446e9f33846d147b983e897c7418e1ca268425cb8189394cc2614fd7f6499bd9e2dc7a0683ff68e7f259b03c97ca2b9fc261aa35448ef896632ad73e893ba3adc89663de3e4dc8a134d75bb5a8c7613fdc50fe48284cd3146137d30a5d1a26b26faa0e272a38989ce42d218638af1b4bc44a72943fc20decb256a893e88339ba103cf2169257a9ffd9fb0f21c7e9212ed7c658c91e5634b9944972db2246af2ce119444ff617c7c1d851ce4c348f4f9a2f3719c430d1b4834561ddd636c739f1fd1777cea98aac5387144e39b21e2c1871a24a411cd55b98707b1331261449f3aba4534f9fccdd2a2638a9e22da90ed293fe412d1affe9b85658fdf354434b1b37a889dec17ed109d7c8eb5b4bf83ff0dd1448ea374b7fd638f42f4bfbdf9422e42b415777a3a460a9fad413429c8e58f413e41b4415fab5d42f80fab0b449fff2741a35a23870e10cde78af7cfe8af21747fe8345cb967ac983944e78776d583f0aef93e341e1f1d586c510d3e1fdae4bb1e6fd219ab7e0fcd9ec86a97aeb97ff4d0c5e6bf541d678bcdc943973a7b8eaf070f6daaee38a1cf824fe70e5d083147b430d94c3fecd049889fb831216876d4a10b1de5eb98b7ab520c1dda2db7fe0b3d73a5994317b287b93b5655ce51e4d05e077f221f1d3c5ce2d0668649314406b98ec3a1491afb51fcbb84d2dfd07bd60f2749f855d1ddd06739bddcb9728c0eb7a10f725eedbc2c1bda9feba8fcf7a28abb86fe23b66b997ecac8aaa1b5102407572a971f9a863e488c0db12f23258a86d63f4676984e6f4a9ea18b23712aa7b36c25cdd0446e69e994a1ebffb0300d397ec9d06c8e52ced92359e76368428c78b29ba53d12c5d0f9c44e21927c14f2616825f692a788d46fc150fc44cfb746bed0c65c691626e2853692861c3673a4de5f17dad43a5be5a6f95d2eb41a3dcbe4af8a6cb685fe2de4aea585c63fd08ffae37045b22cf4fee3915e0aa75f9261a1092d232af915fa28c4f030cb6f852e7699698c7d159a186e9d4226cd1172a8d0e6205a8788debcd299425be2ee1fbfe243e49042d3f272aef241785ca2d05b968f41234485b240a1ed4e8fe3779dec9727f4a1d539694e71cb7427349519f24ed29bd0879594467847f167422fa7f152c82ca12b0f5dc445266aaa843c0ec43bc5c64968b73fee584b24b41ae342cfa3c31cd923f4293d8abf1e56cfb746e82a4719e32d21c54f11788f53ccd68a12a18b4e29d673d8c9940e6108051042f3817bbe4ac771551984d63c7898a245a27f20109ad4d071e0c14c8c1cfee00405f0411fdb99fb43e246773d686265b5481973c6f0a04d129a731cbd613a3b6873acd93a8eba1f611d349f257bc2c39c1d6555801c74eede3ad9c2c4887f017050801b541705b0416be171706de6c1859f6ad1e428ec8798428bd63d3e49a8c18766dd72d26cb14cd310126aeca1d9ada4f196ff23ac250544a8a1875e2b850ba1520c1d5f0cb750230f650f2c2e3c741e848e2c739872851a7768b7e3522ac7133b34fa5b16b32d1381a5428d3a74922d65f8c7163c3fc70935e8d0e7f0e452ae43cb961032ca60819341866b9151c6058e18187880063cc00ea83187cec3e0494f37a322a38c0bac20020fd08007f6c570c181715220861861ace00b3306d590433b6136c7a849198726a66ab7f82976e4eb8143bf97238665ecbca1f598414d3cf00e0d1d6ee872ca196315a2a286db865e731eefc81f464d196743eb6e79f452d4fdcde16be8637b2c95fd391231a986d603939c3b728eedf03434dd8187e1fde3283f88d0d0ff79f0fa31258bf1cc33b472aed2c1470e97b2c30c9da5543165cd61c814c632b4391d712da4aa6235d42043232d29a48898b274d0d51843172145f09f1810841a62b81a61b81a60b81a5fb81a5eb81a5db81a5cb81a5bb81a5ab81a59b81a58b81a57b81a56b81a55b81a54b81a53b81a52b81a51b81a50b81a4fb81a4eb81a4db81a4cb81a4bb81a4ab81a49b81a48b81a47b81a46b81a45b81a44b81a43b81a42b81a41b81a40b81a3fb81a3eb81a3de86523e62c2e194c53bc060fdad9ed68d9910ad4d8c1d5d0c1d5c8c1d5c0c1d5b8c1d5b0c121a0165dce49e438be6767de38e00521161081171140002dda9074b4fc3c888059a4fb5521c71f6f78bece92c3f4c4a2359dce965b3f74ff80457fa96eae111142fc7845ab9233ceb7846af170859bfc3485ce615ad1f77b488b1d83e4d559d17b1467e5d93a8ee35d453f6dd599b3ab8a2ee59797574e9c5ca6a2c9152c3ec4491e34888a2e4efdc3c2788ad6cb63674d15a71231451b9ec3e9d6edf8d795a24b39564e962cba59478a56e54ff43d5cc99651345d2145decc44d17699c78b791d7965a1388fc6d47144068a56bb831cbe58b6eef8447329279ff8d541e29e58f7730ae9d04eb417b2327c1862522d4e34134b3dfc646da2979c3169d833b3b234d1cf77165f170f21863e13ad66cc1f598c1e134de646d3130db93d2e81a5183bbc90794b3431493baa548a4abf127d24390c4bed58323e253acbf833213f894e328bfeba7b852f89c623660b9d9d733e4724fae083c9c6b4ece13d20d1c8480af9f2116d105399d01aa245c6114df2b192fc28a7117dec66c52d0b239a0b4f53bd2c412c5f44e3f9b1a44a37bd5b45f4eab162ffa7871cb58968fdbc2fe638cca71f4544977c73c62d8ce5981ea2cf9d544b1583c64d1aa2b19472603ee1e3388e85684e724748e92832841c423411fcc3b9e4587ed819449bb2b2bb940799613b82e835a6a09be3e3244f9d40f4f931bce6747e0faf03883e48791566437faa74fed0e4c48aff714c122def873e4cc5982fe94357e14162c3e49c8d0f5d5fbc1c3f8b55867e0f5dd08ed9e95ac963f4d0783e0fddddc3b93c0f9d0749f1a390d5917868ce33c5d7f0dca117e995a01e76e8b542797c165387269b9e24f30c1ddab89ac34bce4d463387367e68b8cce78fe38b1c9a914b59773ae5b79438f47f1a4286c0a12b8bdef99f1ef37c439fa4bb33e79c27e386662ae38c6aee0f571bfa1ce7af1639d12c391b1af594c3798f3d4afe1adaf450c28784feb3a8a1c91f2f4b6b7c20200dbdfe58d490a0a1cd350d1d7b7786fe4274e5c863cdd058f238a1f925536ccbd0fc75a8eab831e247c9d0750ae22fb97292181d431ff3a490e32862e873e68e73e4406328350ccda5bca263963ac26068af53f07832a414d72ff4b1879ab39f494741f4421f8e86c9a9ad569a2e741de590992d3910c0854e93666f7e0c1792e440c016fa4dbe5679117375ee4080167a4fe217a3755968fb739ccf9cc2a56c58e8b263b57816cf2555c715badc20d21b4387157a49adce30af8e0a1d55682e7518a742e7757d2ab413dd3342f44ca13d4b5983c75dd9e391429fdca2cc45ca71e944a1efd451a3db030a7daa187b26e1b724c7139aebe051a7641dc97538a1dd142f674e4c13fa38b179c92ba4c64ce83d567e942d4761c725b4d1cf274e42d7aba28466c3696a4ac1334e2509fd8795e8947524f4217a26b7d0fd297f844e326e0589b211fadeadd2aa18dd342e429f636b6ea54b84267a549a2f1d5a121d421339bca051662174b929b9a51c37cecb2034ad398b677e0ff30681d047fd921e62f0078df885b09c62c84107f1413fb239beccb1ab64490f9af0f350335c748e391e141fb805cf76077deceef3b89454cfd3417f62be3d29272fc9e5a00f1dc7c80e247ff53868e4e3c2c4d092ab1b026ed067c5ac919a5245c81060835e3e3db21c32b5e8aaa32793870c2dfafcf9df83e5386a86cc2cda1cc6747b49168b939145ef719da1d1625e7e2c9a94656d1ee99f4b1e168d780e3e84678589ce2bfa307e0e5f7e2c7373b8a251e9f037e46845bba963b7f495d6a861459773d7632b5626cfaca209279bc7e37a06495145fb2beb174324789454b4e15d2ff84c59b68e8a7eadd5234bc67be7a7e8dc3bf6899e7252e6a6e843902e09616195f252b41511f1c973185a6752b4fa39de498f5553ca8ea2ffd03c3926a516595134db7f1e29e52b6c34147dfc68edcd91983505459f5353a55819d32dfd4433297e4b2df54417a34721c74f9e56b0134dce41881c47a127570827ba8c92f2aa62b2cc64135d9e8a39ec47139d87bfecd6bddec1978926e6603ee7e58e2a3d4cb49e39ded8af71c9bb4bb4fedf31116396e8d5ffb23ab49e5e5689563d6eaafed02d97125dd01c912399441f44725416357ebd924497a3dc3dfe4125127d101fc7e6900a249af79ce5224386f31fd17e2c4bd3b0235ab59c3161c123a98de84c5237a2e348d164442be69ac3a41c44a55f44efee1d65b628a2f3b823cbda9644b4f12f2e3144d4b70a22dacc717b53fe105d78b4fe1cf672c8ba213ab1dc9a1d1d5e422f4433937318e3e5433a27441f9deb31ef5608310fa20bdb66299a58c47905d14bfc2439670e44ab29da25753f4e5340f439f67f2ce2d21aca3ff42199079143f6439374c29a7847392fd887fef374d0502f0f13e4c31f51f44b22b887c63ce746cd2964ac874e32aba3a8512e3af2d069b492ddd0112bf1d00793a259c451ab8edca1737f89217967872ec76391705a1d7addcb7165198f38191dfa40caf33c358726640f3e75ea88bd971cda4e315a4ede631d2b0e4d480fdfa8d1133f70e83c6f0ed25afb8397fc0dfd6b949cd93f948d92bba1cdb1f41045f236749132fe9d398e72e4d9d0e652d70d6135057f0dedbb5c847d0f1f400d6d484cfe93deacebe103a4a1f54063b974a7a7f0f001d0d0748a1fe3a1e40c4d18a94e124d53fecdd06e741c237a3ccb1d65e83b929842c36e47860c8d49f47dbdeafe700c9d594b99c6c685cc88a1d59c750dd987a1cd89182465d914690143d329660ee4ff42335d165ed13df630f742d7fafae143871d324f3e88793c263317fa1c7caefcd9aac163b7d08c4f140f31079977b5d09f649e10e2516a8f66a1c91efa3f122f8654b1d0c7711c1ea5701d227b853e8e0f493ae4e0b26a856634acf944df2c5d56a12f09ea9fa572f62aa9d0a71c7f1cfcc3b686e0143acb29c2e32497538752683f2f44658f28f46be25e295f2a7c40a153ff0e29877942df1e86d054d9d78a38a18f3577547b34e1dd8f2c7d22c784de573bb84e3949885d8a70a8a42de401e3d16024108a44e2402010922a07831508001044280cc5a12087a258937d148002501a18362c1c101c1c141212160e100e080608060686c1605020100604026150381828758da1380232aa8dee6bb5fca4c198d6dcac99d1685d33c807bc535f9afbe63a9aef4c8e05c3529421495ddca23b4a14758954d66f7ea7379a919d8a57bd764f5035d83aea35c5590142e48a2be2ed5342a1512b1f6a0be928d515ecc36e7a83653ecaa782bd1823256a2f829bd2728f4049f60b06fa50bef05428589d68843798e78b98d22d4ca6706945ad195d41c990f028e0530b84608fb158e3cf42d1998c01868527b642bc79d79106463e42cdfa4ee991e172690093065cb24e8aef1d0ceb87ab71052fcd548a0496578f24dae9c8399c1ec36afc63ecbca03801b878066915fb3c63e1142e501853f58577fd360c2819db8df230ee1ad9fcb14d6a88c646b88d5b8c6cf23103dc6f32116cb54d6ac07a9e50273a2fff72445f952a01047b2cecc5f01e9975c4a243c7880f9ca603fa1030b830537427581c71e21acf2ee23847a260bd979c46a8fdecd0c801eeb9eb680614518013a0056f8cdf8a8137799c09aa1a3cfdfe56e864eace4e6a1d7ee673f573a7a50e7873c67ab4135d47b6795d5de7d4b0436eeeacae82c5636be87bbe726f06adc5f38d564ba67beacc3856a5cdf27813ffc7bf3dd484d8674d7985d136ad17fa62b6fa986a0d373d312c86fa1337214e4296030d0abae63b99ea3fd7b1f48e33987b501d6d48e125fa8a01135c3a3a02c2b88aff6e6cc441e5d628867ae9ceb5a95372de9adc2cbf75d839ea3c9a0fec26f5accdca9d0658da67a9cdaeb7c087fee937057acbd2963bfff6d736b0ccf2497f9246e1a8e31f4bce031f1ca4ae73cc7b7b9a9581bc8f42ed79a1535424367b37e1a5db17ff256e6e3fdecff7c9f9c817c32701ae74469ce1f28da69b69d81c9adbe3feb4d596eeedcd5f95d6a1ca6aaf9e3d10bfc3dc7288321f3ec6d595eb8f46a8502bab1891ae02135f1c7ed0d508ae2c4f587b492fe227dce6067a783a48d05b2e65e6ff3103c1ebb9718dbd6a8f1c43e04f3027d55f5fdd9028c39dbd74956a41a5e7e67427fabdb1cd0af053ccf1ffb3ccd957ce2b275e948d299ce97a156c8d6401debc02e7a4150d96eb9dc7d443ec79237a9e9c17bbc8757a6b8272a7b64e3a9ad970fbe71b789f7407784169bcc63f2d42abcbbe81d627b9794e5aee18e73ccc67f2b7a0bfc94b9a349f3f996e77d30371a716042676bfaa01cb9ea5b7ddd34b3969bcce35c85eae66c5d635a596d24dbf9b353b1a789825bcafcb666f815f2f75d1c1defba2a156756861dfd74b5033889c6e6bf3edf77b495367e07a7f68ae81ca79cfb8cb88d8305fd74f98e25004fe6b74c52f84ea53414fd97afe2c368d852fcd0396d3296ff8f26370b5bef7ca74fd293bcb7ba876e27e1f88d31de3ed4ef4d76d8754e7650ba140cde926747e1f2948e87373d29dfa45b5bd7c7e1e309cfe4774e5ca94ee2e924f33e032887acafa3dcac18c43d0d2a6b9d3bb1a53f3be2dfe427c2f4fdc57355de84c98373915f6c7993237b9e48e8fafdd7d02d593501a969d971d9909ce971d3d9ca26285dc5abb3a6931ff6effa24d7d5a69f904f66e011dd4fd2495eb2c948fa1ae4adb38dc3c3f618f25b358bcaf960b2a4e7680654ebf3a43be7a90031a43afac11fadaf8d5b73e702f12ae1c86e605d2ce8fd3fd4b6f2d3ab77cfaa5a1dce9dbf45de9371a30f9e17075def20881ffe3db23706abd76d551cf840af5ea0f2578eef52b70881acf71109fb1a99fdf48937ad333a668c29b3724e05b38daf6915b5553b382d33b0ffc6df37a11c26afb8779f58a0dc0cd3eeb136159cae87e237766a52baceff93406ee8ac0afc0abe6e99d39ec77ba89ee2ace469ad87b4f99b5cf0ffdc827e1b33ac93e790ffc4d01ddf20d7b8efe1850ad6a87fb3549cfbaa85af5ebb2823e5aaa4fbb7b6f7d1fedeaa4cd9db7f67110b96d81bdefb8a63ae872ef7d79bcc444f0dcc05e5fb072405fc10414b3ea25145c711059537406a6198dea53839ca0f1dcbcf0456fec6ca25bc1559a678e893e59502495c935bc3ef9491cae0a2fe6ab4c87224c34f15248bdb38d3dfc0c27f92a70fa10f079e7dd86b0d4ceb5e07bc9dac324f434d1f16c98ed6c1b46e19caadaa9c3d5873bb9c8d2fad0741cfbde8dfe93632e7cff4d059e847de866a1b6489f1a62fd56dbd167e425805908d6cf8fa7fc4eaff0f12211c2b4d6563f9da8b83355bb47d27db3e459fb72dfb5fbaecff07296bab5289fe795aa5a56025b5e31bb6bf074e2724a3c224389a95b7cc24fd7afe5fbf5cc5553947f8afa1488e8555139ceafea92ff86f469b700a9c24bdba98f34ee2d9b3fd3257efc76f4dd7d663ef90ef5d3c232de92ae267702bc1a0da6febbc7d3b5d44ff8f5569ab36325772e638ea053ab66ea58d3ae9dd9a112f7ba917e77def7e7edc2c07e28a0c5cd775287baf4b0f176f4d4567dd00ee2da8948d15a6aa6c7be37d029ddefd93f2ba9959d6ef0f11b8f6efa2bbcf44a6fd8bd940fc4da8e8de6f927edbcc7db0772d9877914ad2ac81a6934f6d53b61a5a2d19e44be0f7fa9d91df7b681ae30f2e7f0e9b51ee809641cfde4b453fac2497da58bc6dac6602fe92b0413fab07ef9983f6107abecb49562454dde939a8c320a15fbefcd5cdb3525646552fb1800b8f5bc82511d1434739f3ff23ad9a668f065dca9bd9bc7e3647fe26414115dd07c10de39eebe0e77aa9df7871496f18f7ef1f0d1fae9be34febe0d8538c831985718f2e3c1de3b136390db852aa0431ca776671489fd58b3e756412f70975fa1b72538eb7e4f7263d9890fff74b173e7edbc743b4d566ed30cee66ef0dff1dec61788537df84bdad169029279c4e7fbaedd33df8afe68a60d1ede880448af97c620bbff17a15d008dbfddfbaf791e25857a36c4dfc80c2e9d03273671a51b3e3203436bf287c5f99836fc7d707b461bcc4b55bbd8aef38d227ae06444c47191281a9193a52f3a3e080503bb79da8cc9d1db1c199299ac6641bddb31c055cb414787d63618087e84af82d61f42a60147520bbaab90ee028f67920406624edb0eabc4d588672ba9e284a3fae034dbe0fd283b0f30ef4746f090945b429c744fe6b521cbcbe25d43e00b5f75c8205ddb2ed205ba618b3798a8b090ee45f2013458ce40b5793ff20f712820411500da5188b29cc29ea34e1dd689a8d80106dcd64024554857d6522395f7700d6aae9a8da9f068e5cd34d78953992e3af9e2582b44e21c07ed52be4558dbdd5b040f96372d1f3b1482dc7104c7a56a49fcbc55108a2a693717230334755db5e8073f48c24652d7b4260aa6aaa9ef6381d76832988ad00d5c30272cb4a157ee5b5de78989943275d9f4eadafe3a8a1e6a112772550d0b7bbdd76f2c7127edec770da02d9116f53bc7e9350ee20e76d7c8accba3ddba98b3cd66cb7be4ebaa87dd9b28d20e85ca7300ba930ca105bdff540bf3b0b0d02f8799591daa9f8ad51101a00eb558cf1b577b227e34771b7a6c682fa1bbd3c06c532779b9960324558c764c79988dde849d0ff6c48bc45ea8d6785be2ba1fce9443108ebe6a32bb8470a2d3a5f9a1a0d6a3e26086d0e2a7d734852e02029d1012e3e589d98f975d09e7d9614ad169e179ad45f983de9d2ef6097498e654f10c572586729a71c2ed6293dc1ce7cbde698b349060bfdc3ef42e34a70a8a22a66f4c33571e02759a61599f16a3c0c9128000837704100c5d715dfa68033fb5404b50e7afb7e29746eea6a276f1d33f373f5bd13a40ebe79c43ad9295f47d95cafdee624d8e16eae56f78265b075e8bb5f096fc6d68af325ab32a745eca15fdb741e1e70dfcc0d2ea2b2bd0d62a5813c7b4094939cbac403e4966625a4a63a43270a5bbb9b7bd05c851cd8d6ae036a9fd87b32a38c6f0f4b0390688356dc4fec642f3aba7478465f09da446fa7383477fa8924e68f5cf632e9bef51430ebf15f29a925eeb4e902af812609fb01b79937ed73fd20a6b61a34e8c50c54f1613e29d73ed17a9213b025a95262f3620fc38f493a5708bec18964bf1941b349940dfefc6174a307e8ec8b273c1bcf1cb1dcf378a9e7d00a354b590dadd7fb82ac589835c09b1c263aac72b42b91a6d2c375082df96696284f8d2c73fca1d61b31e4df0a9bb2d2fd802c65a8a56d63922fb4710fed6850effdc8974d508f15e8d44d144a3555d63712da3416c28ca53fc75f7b2046335fc32e4f68879db901663e06ed32eae9084c58b2f4c507ca19a17813ee98d5525c5989ad41d2246a1b89539d4838824b84773cf716f655cc070379c42bc7439bf610d6c0ab16d22c983d359248461797254b162473060fc62a7ea31ba650deda2ddc189c4c4a9649d587f585f1bf3c958f580cdb32dc743cf6c54dc77199be80635a19766dae54d85508b5d340f05da30ee9940a2a0fbc1a27dd5b1fe7177c6841b715c8e483f48983734ef7362aac2571bd8bb21d000a2323b1bb66f99685a6a5694bbea93059a9251c2bdf9fdd1d27eb05286f779f13cab6bc7c1209ddcc778956086b8b7bc4e2fa0675d296072446571aee54cc55b152fb06023a0455d3944f76c899e1b4cd9d23a9fe84c608fa92cc694e5164e68ca2c8e9722601faee79b43c4741066d2d3a4492b531bb2901c41d51f9a1cb19d1bfe86ce53db79d1605194dcf114bab5ccf974283a7109d351fe21541218afadcc2cc13afa2ce7f1da0dc5b0d5784b5bff80b6d32ece89fac0a4dd0820eb446eaca6fe2588e985cab2450b7339eb662fefb97c749cabc3dd25e9810ae2d6ff7b3f3e9beccedc7f970629aba7e28d1c9a2647135c438345812cdaaa9b3cee27fd359f01bcaab4f6dbf80c1de3781fe2135fc1def6ba8a79a05a0ecb4bf0b2c882c9d26e3d0460018ed6f2f16f5add179b628c269c14db4ec6599cc622357c8a8dd47955e7a80c3f0586051b2d59496f2bf3d2a61bec00c11060663e3cec008a0eec32ab8b00adccaf9d6d2c25d21c805a1128048ae0ac3524b382df563696debfb1a08d32e9bc3f0620f405cd3c1ecec32d96a328880d3ebf54cdff18d8203d173f9a46b365a85ff3dc2a4e32b05ca9f219eabc5ba52f4114070fc36e9054d85bb3753db01253a2e5aa2e5652cb232bf653f050a07794f579757ff286a44d7ea0127e2cc91980b3a3e9176b045e9f1442c42d87daf422509389b8ca26a79c375a4af1dc6dd3e471dbca759c0828a970011c6731abeeaac93b1faeeb960e9771feef40407d757008471ad3b8564f2e2fcedb5ba9d288d5993e4af44275ebfcca487bf4a8e98c5405b751c8898207323dc08115297b750fe025e774d212afe6c24d81f44d71b580586f518f93e13eb17c5b375a29af09478cb2e42777a40f0539b30cafa10b64d0cdc58e2214b41a5378359c5b0543ef55d044d9974ae7a71032a35cbe5d58646e24f54a3472e644ecc99dbd9cbb28317f011a8e1c596412f2fd001bf390d04d31a6d7badcb23eb3d7f0f803a11777ac75a1e7b1b1a63a7f8365086003f8bb264168deeae8ba3706fb741f2f202e3ab1afa68fba25a3e3eac8595091943bf173fa2b0185d1c888bd2843280b794f8f7293aa3b7c398c70581bd76863aba791e5ffd5380121a61a86b6429312aaa0442f051f2a0006c968a19acc7b42a22205ca7923bba48016e897150841714249ffe84c721de3bf5db8f0fa4acc12584f4f4783b6eb20a3df99144b2832c2ba8536b51b86d8545d1deebbc16cfca801b26c86567b4fb8027de663e8cff14b7f5714421b38399ee0e1f5f030639c159c6d979d053babc09675d24c5dbf0770bb293d2ed6cba0cacb473849e4225707dc7434769a2afd838ab1b9864b84c90d992b139fa72f8a0e1b92f81e0910ce92826229f10c3e16a9c021e715662757f1a6a8ef59115c959dd8ffe7f6d5ddf3f0779761f152c3074c282dad2ac79a7c797c2e59c1107069aa2b67a5ebca6420509997a1df12e96cff25d2eae2859a8de78f092b3fef3e475550a5562d7eac98c467b0ea89e0db2f5b51f0d6f92c2f67c42a372731bd3823f4d54f459b7c8e3917c90f0e0791dc3b6706e0491d3b4515e3ea94d67902c8d01b1fbadbff15e508b81b08ad814bbcc6f36046a2e0cc1f40e638cfe3453a32d4205c9c9bef002dccf6f692d5026ca1bc9fd21831c1c61b4427b3507425f235b40c8cacccb833ba8404bdd10e6dde5b595dd367956ac36e5cd79c26e29a31e7dac10f46d0a268d5892e135904f666233976dcb732a6e4b5edc8a91b048b79563e7d6bc6feff3843bc7a239d18982ced33edd1b90bd9501f32655ed43445194103ecb81eaba7ae712770f10149206e098585da522a7878df8eca8425e4d0f2708ace52423c05f2e0da6887a71d1e79e2380e21a8871fae6a7ebe8f4d2105f05aa6929a0c2e35b87c110f758335f5340946d0450f643cc9737d0c23ebf4fa4d68927851fb10e866113521266948cff3f0729cac40bb47b4bba2ee94c90bb2742f68dc5d60ee1be7454ce7fcd1786ffd0cccbf302a3d4bf0c92f942c2cd8e30e0ef7f4df29dd40f4708081afd111b028684e0d21a1478abb81fdbd1263bcc47870678479a153fa72cf18d256d15ced596cec80952a1b3bc29bfb627e5edc507e6514257ceaef041dc7fc260e4553e8de5db0018a2b6f6d55b70dc1ab33fe8630c03c885d747d1ea49d02858d01a2eaf0245cbc817e268232b42e049326481e607819027ea3e7529a478db9cf55a57ecb58568116a4ed1d0d859d0eb5532dd5b85f9c4b6b4a3327f3872957c651e026270b95bd81d7eb517a7e02af03a6e29884e4c91758b0b0d45d81d8b593ebd5e19746c3f18f436a7625a56de67edacd314b12841519bcd43114a48adb074646e9f806856968c49c279628edbf68298ccb85eebddd64b682780f523b9ecc23235c051484b453f39e5236bc0bed2ed63f7b7fed516ed034baba549a460fd48d1e3bf732faf90abc04ec2c3a8010b6df68b6245feba2f1dfa6f38ef336214ddc7265d833d7cf87e1de398b94713b4bd452c467a99ab651eefd91bc4e0b9cedbbb87f0180ea9171bc29847b126cccac7618c2a1d263700dc065c0136d21f6768fa42cff90eabf299463e3cebf670b92a61240bea1addc67001f38f7fe84b035b768f9799a436bb669bd946c1c46483845fd6a1c79e25274526cf8d9a55b63edd6a0684f5d27c5d52916043a92158529bd3346c2c96f9ed07f6e68e723ee7dd4c4c4ba44e91100be9ea5467598ecd63e43e3b7703fc501679f8a4db7c56f0cdd1f013ad9c051e26c642795c01c7c2d30a39a3efd5217ef8ce39cead8c94b02ed1fd0a06e6c2392bcc08224bf0178b1b6aac93e49cc26f087da965936423b68b1b80bc1a592a13ab20414c7875a220abb2b82c4440cb19170b7acb7433db01a224b279c0fc7bbb723a8e08381b4054a07b5b62426e9abf2f06cfaa2213a19b43ad14d318353b4c51f227f3a80566d32ccb4a4bc5e1512eea60448287ca2841ae469f34c39866f579a9ba3a4b8b5e7c03c5b89366befb535c4415aee2de2311dde066128ba253fdc87a3e04fb222c7c1ae27b5eb17e61c10c91689008fe81495022c480c4b3f9e49c9bbfd66068f3aca94c2facbd5d24960635364b26145d78292d70041fd03a0c9880c8e29d161f160b1109d9106aad01f04f180469b9ac2a8025c1b055c7ca0018f2cc06c22c42eef2da711704344aa00204bad6535819cae80f47b25b4975d258c7a1bd09b39ae436657d18d09aa2178be091499c9631253e00a07ab2bd213f81ad851be7866d8a3a4eaf18585168a27471adf8528893c0ccf493b77a02b584f3560531ea0d55d76d0ed039a4306658c72837a5f8423e236434cb860cf3cff72ac24d55c1624f34ad1b3b91eae79f87695a5e818f81c80173989de93507d64a8729f606b96b1fb501d64235919134cd4ad2fdd06d1387a09a74c8b3f5b46a47b467316ab514a458517fd7859efb5789d87c9f043243237f4bfcd84911a49a8b329428e2e7ee86a9a0c06f8fc8215c33bd07a9a45328ec996424547ccb548a95350195e184139a996c99cbb51810d4b84b52e802b7057c6fae60fa51c5c0ee4cb165bf266d4a6b6ebca494eee0cba21584c8a720be592952a8b3dd50b94cb682e3d04c262b0b7f5e608c9c774973ac04820a5d546d06f2aa0227d9a21ea7008c78ad7579abd8ce31ecf2d9bd7dfca75bbff584560755463949497ec646a53cb221532a896821128b2092937222d4e73497d2e8d96e45101321ad279c32758484261f5171b5b92a6c8abc46a47a10e5fb358a098d6a2725c8a4ae46c9119ac7bd3b7cd745b1c1a1cc3d4231afdf3479d10ed97a0155b2071cb7f172dcb5c130b0c419945480359c4587c5c079bd74d24d09a894388996f34e395e040fe6f0329202d808df1e2cad068d0da88a1c8c4c53e31a85c3b33825ae27528a1fb451f5e702ed3e706af381f94d4bfbdb9824cf9537b7a49e520797d9c5e2822a0811a48e039e89a6ecc0b8f1985f0e938c0524ad22c2b5e6534510fd38ed6ec98b6338741b85e1191be3477e899749398d87e0e0058f719cbecdcc2a49ccdad1890fec13fa4aa87ecc3084405ed3199f248e8d4464d2a6afa24b36f521259004b833da03e0080b8a56ea540a955ba14288a4b07ddee9e394cbbbd64962107e1cfb260d0774331ca680998d386b422ca42d0b85a49c766778e72358afe6dc34242c63ac0b5c26054210c61082487071a81bac81867e5c82a82cd7f504758921b04cc16f459211f04e583684d199b0e0c21db56eb9f873a782af78d2733197e48992d5c49648981d129ab344abd29a407a00d26be78eb90405e76d603b8968d603287717d0fc048e1453f111d05e8980ce2a60bc681381b7d7efc8aaca608eab6a501e8b44cd7f08e65bfb707c4bff04ea7e1d1836cd023f9bb54fc7c7ae64a468854eeeb8a1572d5f43279ea4e65ca1ff423a868973a173ee235cdc2f854ef8680106648e83ea101ec660e35670741274b6a7dcf3e2f49be03f024908c60aced74083d7009d63c8ee2b92cabee82931a1e8d4c519f56774b644936c031462284324d3750dcfebad8bde8589dc190cbd649036f29badb82481a9785291eee3e0816068a187662f85082b206184848b79b1646d4d42a0c318f738f228e25f12bd1095a6bfd006c251d6a8f00570a95e091650f2920927b568f264eacc964741c93560d7bfec325c813d4b397ef7cf28a08d36cdcc1defacced3f9d09f39f83f684c9534be54c44c91c0cb924eeaaf07a08340786edaad5ba30705f19e447daa3e2333300694d1f5ee4982074956b2fd32774ce1890c4f81b707505ec5c62bfed7f43da3f47c7bc01cdccba1ceca59877bff64e0e5b261c57b30273834421b8d5a1bafd9e7b0b9f5c086d075ed93f7d819a758de099106764e766a08d4806f76661da48b399eafdb3f300f22b85772e4d8aefe8f675c0035621ef6f56a274fce3e3c8b160008998ccf334b5ab3242d1d3ca3bf785f523cb0f68ed92854b0b3b51e690a09b504205df7ff7caa7c2798804972f176e610241670e19d65b540a810e46cb7924f18662ab2b71ee677031dc9969aacfcff4cefc08beff93bf177474cb4da546f067ea02e46e720d394e5ec7fc7cfb83a12073e3382e270063d0076c7a440234abf71e74f5a5f5bdc0e1047ea51b493ebeabd38ba32fadc8d785b639b63edc1609940e13a4b9a98c30c43f3fe17cf323e3302cee20c76c0d51949fc44c7a7f5fc8ec747c8a0617d0755adf9d8347e89f20e6970f4f8b95b9facef284391741970b8e6b22a134cdcbf10fc19dca48b192c0b3ddd4be9313b9d419e17a0412b4ff4750d50ac46c686e08136777d9005534e54b616355a8523d6e3c061825f7146436269fedcb267bd13b8c295099829e69d32d27f6dcccaf7e4a160fc938dc93f7d5f517f7a88e4c84af24cd414c4e68665cce1cff47c00639b8a26623f30e050b86c869508634b68d3560c3f6adf0a51efcc7779d098b2d0b4257e4e93e92cdf7284d8c60ed7d1cdb0d090697a998efc09dee945a9fc79e5f051d936ad306af72238189c3d028aef7f9d2d70b61a0730c30c33cc30c30cb38820e74b60a5ace45384f61d04bb22222224584c08591b28591b28591b28083ccb09b0091a0a78860d85ced048c719cf32326b28b7e9794e59cff01f6a28350cd9b4b4e43494dd71c6d8634349aa8c86f24bb8f6748ecf50aacaac59cfddc0d1c40ca5de18f7a063b4238394a13099634b58479d6f25642883abc9313a39c650f2c860d2e179950487180a1736bae9e671abd7309433fcff517fd6187505431983bc112374f84923bf50081b336b6ebb39af4601bc8064ddee8e4bb30bc5ac689825e6eae8870b65580e6ed3c483bf8c5b28fa7ccebc9971c8e469a1ac19e8d7b8db9e579785729a34d9c1bd868532908e1055fd0a85cf98e711d29a94a6ac50f808a3dd7f15d1430a5085f3b5c35c002a146a754432dc16035828c0144aef9af79df3df6c79a450ce78d1ce612f33dc2d0a6560f3a7be65baea282814ff6a7c773332138d86150af084f255e64486e51b31a92d80138afb25319e48caaf6e17508026942b1c7f4e5af953f978b1b50e2800130aa6f612cea263844d155080251443bb3a7ad10c9387d4288012d6c9d9a249328e9e017f380529785395860224a16415aee1b051bfe40b16b0e005a80006140009c5e4dfc883685d36800d3cc00c040538423984cd66765039713d502880118aa13be3c8bc0d6d42018a50d09c3663c227fb387d018850c8c093fee36bbff8eec253c0022f60f02ff0e28b2ebe302778c1173038bb0c146008a5d2ba9a8d905d7e18b0e08b2d80108a29dda7dc32c4ee495050802014430a4d75a5694bf7e18f02fe420377820200a19c1a37465dfbc4fdefa2062ff8e230a0803a185499a0003f2843fbac97e6dde8ed5ec0001830000578f1c5090a175ca8a1003e28c495875a9f3ce3e0e941d1634cd619e6fa73fce14149cdba6e364696476407e5d318ee72c62b72d474501ec9531a25428c28400e0a993ac3b1c3920889c350001c94254ffa93b336892872c1055518b8b8059fa166def87ab15db8e0616035960b5b945645aefac3a15e8778010326e3a216e56c1fb33d5c92e4d072418bf2a791ee8953b251d315700b34c0c52c8a71c27477b34e087d7ab1f5821fd5002e64518aa8327172c503ff8b18da09b88845c93578be5209cde8742f36025c70c1052c8a925af36dbbe6e21585d1bfec3e8b8cdb63ae12c0852b8e0e524b956c94080b7c68808b561423e71e7af8681755e3005cb0a27021c124ca6b46e766159869f28cdf30c4ed545150eb79898953618a58e7a81121c750516818f657bb23070de5290c99b53a488fc6a09aa29cafe1b33abab3139662ef900ddf54275c90a258ffb8631aff48761d710317a338e4c6729171feec89a250f131974c8687a210572e0f72cce61d3d288a0e5ce24ce537c3ce3f519c50af12129ec3f8c6138550cb767027e94469ce41abadc4e6ff2827ca12a9f16c4fdd4439ca58875e8d99eba226ca4992a4f628c94421857c520d2f3f79344c141b856c7b86cbc9fb12e50d2fe1d5e293c76989925cc42c1f22548982ae2749db7074fc379428cc67d7b073c724ca39d5840d31e28ef29344e9aef4377395e34c53244a9df6ac57c25b48f490287d638b74b0121f297f44d1d324eacc487c498d23ca69f2683ebe4bd4d18d2883ec2173d136238a41ee24aed17a92c9224a227f320d6a24c78b15519e20129395ab8e7b12512eaff58ff6f9a7338288b245fc8998710f514e69aa5976374421d34dc6d2ec5837430b51360fb3ef8dd37cc65042943be48c41a3ed44ad7310850825f1b17904514631314e4891f5431e88db1dbe0788d258ca7d56fb87d24bf5579ca3096d991fcaf91f3d63881eb4e5ea432177489dfa9b422c420a062ef8509efcebe09fd15ee0620fc5b4f53c21234586ac87a2e49f305925eb7de8f35088f14a4cf341d6f31b0fa54e09d9359c7c8742aeccd61972c40ea57a8c3a7f8659faa70e651893dcc4471b57d37428a5d44c6c60f91827c71c8a2739247c3ee4f3b5722864b5e3fc5112ef35712866f09d6bae4d381464f74177c8bd81b611c9304de98642abdaf577586d28946390d5d3ce063a7cfe9c3fe7a80b5cac81f8b35d931bafd9a78632ca7cdee118890609d3408aead838fab698e95ca0a1b0311f86acd3461bb83843b961bbf8f679cc50ce23eb387bc81c3ffc652867abc3d6139f0cc5f48ced5bae73dc65c6507093a994dcebed768ba1f8203346b3e312c77218ca0f1da30a09316c3fc05076e8fe1e3475f6d3fd42b1af362c3c63870fb3810b2f14ca76773e49dd85f2f44b07cf137abab15c2867d47be4ea6f25ad6ea19c6d1b439230da1f4403175a28637f8f3ab37a160aeb49f23a497dd8d758286574107e8fd72b94af66348b8cd97efa58a1b039d3e5c40caf42316b1c71d09653a11caa79a625d2876fcc144afb8f317e5c1929943f068de1b5a9128f2814e43fe365bf9887a150cc99cca15bf284b2fc6c0ef97338a11cacd6b1a64876d5e219b86842393367eb14e5e0d1cf8462650e19b59b48a6ea975068a98c12cad8d59384b2670e13bb89087e35124a95539d53e94b4a378e503087e9f31a5f2394a4ce36e6b46f11ca21bd4f9a280d1dfb4a8472aa547dc64387500c0d7c6270179354a9104a9b31e6df9ad090c50c42397fb25a895993e65402a1b8a2ad2162f983b254491a95ca2fb7cc07e57ef3bd0c21eb41d1f16b48e7eb6e378a07853ce149e3e93b2885c4b44d1f92913270a103b732f3244fe2f1628b1c818b1c6c97a63e5171fa7381037a2769777f0b434c46761e39f06d716e544c8e196be86b4104f9dba969a187a79467336b7d16e3bdecfcd9782b44230b428468f43b16cfc368354db766c34269f5f0eff02b5af13ec9cd3dbbe294ecb1e6273b88c6adb0d6d1c59746a7fa10565c63f360a395830f59451eb3e888d7b6868da8a2adbcc7e91fa9f07fecd545455163e3acc6577bfd7a0a37d4698ad564b39a22b9a889132d459d819a7fda7016592505711e1bc4589697728e021fc9c6e83b1a24455150effe0d2d97c8487e41805018639a69e7e6699a1214d96e04b34913c14f30c93a8dfde44fd113be64f6fa29cd8c75e218c2616bc609f23789a6883e9f4d0c526876752031cad6c40ed3f49cfb5d9d9809353f48d238e71c2a4c8c6383ca3c77cf25463fd1f9516f09a2a187fe63b0291ad602ae4003b452d03160815355e2b79f18d1a4ff2d2fb68b177cd1022a2500253c7f075f35f1b6f32920c0244a7d65dbfbd0610ed6d5a0bb80817df18287011908208962c8d658c35544ce181f09f3a6693f0cb543a2f41a36bf77c32419c63ca26ceda122fa4ad8d5ed8872286dbfde10c2044d238a297c764fae56a3ca8c28e78c9d83cec78b28cd4eb20ef99b99935544a1fb1e8d486c135136df13f99899c4348828ab36f40da6ad61133d4421e5b4a83ad81cd24e4394b1f8f8e33971742e16a2ac1abb536faec7d91e210a313726bd916d1065513f07d195200a171946e798c951e32081008128a9879c2ac9e563b1e08b159c802a6f030400c428acc2d2545cb2684ba8c7f81a21c40c04f843319a484ad9600755280479e40d36e4fbd8a042f1bdd36486f6103949a6503609313599632be29042e1331bce7d4beef544a1209b5c1cae26efbb110ac5e421e2765aeee6f99e503cf78c2cd537edf84e2887cae30993b6416aac0945398f6112d52166a20130a09a504c2877e64933b9eb5634bc820b5c2007514b288e248936291df6317e0356282594bb416f6d76e3bd0b181052e061708219bcf9136020eb65f08218987c815712caf9ce71483faaf20e224221a1281f5245ab55ef9944ab8e50d290d3cc9fcc871c71744219a17c72113955e698e11932f80c70c1850cfe0538a8229471ded2f2bce520644f84e2fd9f635019a5e4a33584b27c38f2c9d590102384b2836c96f6219ffae55c70f1050cde0427f0234128e3b2cd186eadc96618628302422183e040727ab3b462f28332ce55561e6a620eca07a5ab31f56e106324cdbcd86aef02064c050305dca07a5006df551dbe4183e2413173b4caf3fc3b28754e9333482b925d3a2fb654f03b83d2416982fef5eceb9583d26576a4eef1c953068176074c60000c18000460503828e74d3551d5419ca8132fb65670778bc2c3ec3471ebc83446648b32d2ab6e9398dd38fcb5289a7c3b0edaf0d6364e8b7255ce884c8768a97c16c53d1dad99e079ba37b228b9d747f42c212f1f26168590a09a12348645f1e226233f4290caf815e59ce9cf93d17448d77045294b33f6c3be53c7b715a588b953cb236545a1366bc6c7fe9490b38a724acf929e2ad4b3ae8aa27dbee6902726ba662a0aa237394c4d1b8306a2c2c99dd42958bbc816edb8294aa63a31e95685e3181a8450298a495e622b32e5012245496263dc4fcf21ed3ba3284e0679262363461a7a5114e397fd641c1efbc43c14e520d1e17174b34ee6a028d9e3741dc7359f28f5e718349507132d89270c5b979025a613e55b5de987559f1f3438519820a7d9435fd553ba8952cb9a4d9a9987da6fc6271e61268ad6e2f71e63ae887561a2f45a61d9a827ba44f9264762b4a1a40c210c1840072c10822e34409628c7ab0c5e2bee96dba944b9e3e3e8db6a53a2181d44de9a98f424c724cab8d364eb7e3bb2aa92188390d67a3c4d2fb62e29122509dd3629c383db8c6c01bf17832061d6c4e8c043c6fe18987fc146801e5154d9d3e9d8eb8b73022f60d0851a03c811850fa93933ef3796d534e2cc0c937b92ac5e6c59028811a5de77a8f959c10bfe8b2fb8055da080ff058d458b28e4f8709f903445946f3b3d1631df8898938872dc74fd30ba5a6615228c935a2d91d9738862ea8fa9e741cea58a8628fc7a6a2bef10c7ab17a29cc9a197ba669dd01d4294a5fbb432dbde5ee58328640f9af15a1a4114a55174c65dfd38750251ca570925fe9fa4710810c5d8d5cf1cb176b1ffa19053f11a22eb87d26f5c07df49d38762efbcbff6c487628474991c62d2d4baf7507a2c0d67b36b568df5500cb9bc73f3f135c8761e8a1d131ca6557828e66033559e2e2bbabe43b97ec2edce679918653b9435ddbea6ea4ad495eb50f8da1cd73be783f4251dca13454316d9ec1c4a673611245f4ddd7b7228bda30fb59f5de2891b8732ecbfdbfe281ccaa0a763daf066a736bea11c1bfb1b7e7e2bfbb9a1bc914622ab6eec18b9361433f6681d433a57c4990dc54fc7dbd7f1b38662daf7c63e58cb30aba19c36244a2e6fab6b9286926f39d6d88c27a868288724f9cbec7118cdff0cc58f872d269ee7b73343217349594adecc3d55198aa1a61d42b28c0c450729ab7172348633eed28cf04a0ce58a9c373a70771c2614865284cc6bd66028a76a9c0ebdce135b425f28cd84feae9a89bce0864c7fb10b8801e20241231e390c61425b282e2aa0f5822f5a4008d242693c577c0612735e89290b5602c242c9cafee6531bfb7e49572844cf13e235fc58a1b427a13cfbe7a56ca60aa56b69cf30da4b85723fa87050511b54be2994730ce9443cb749f2c81e405228f5eb497eed249d3e1685b2037b0dc9b35e924a0485e278dcf8e83b26936e54ba809e500c12d9e1f76cd6fa7a0511704221feec793ac612d3a9ca0116bca00110e0820b0ec400063088c0c380ff05e61bc005172fe014c4c004ff023e50130a7faa9361e3329feb2a608119000306a0824f41f1c27cc10bc840052a308c3031a1f8f122ed49088d1c6609859a8efdf0f86a1bf24a285aec4f7808c938837c124a2a197b3e744e16e99150c6f86d43b8eafcdefb114a159e3b96a63ff5103742b1c3cea452cd8b507afc20d439d04f2e31442837cc4063e2d9d6877b0805719788fc330ba178d6500e42195fc43bb1bdc99d0742a1356478eb17f1ec0f4a0ed3e368e612d334c407858eab9963837f47a707e5d09f512ee3387883076570fedea7f325d11d3b28479a4fe3dca8d34775502edf4e9fea41e55e9b83e2d93f564d3de1a01c3b3e8639696e518c9f39e75197b833515b946ed6b474bd7d64a2b528a8d9f6a666d80b092d8a595624667669926ccea2fc613764f918322197b228c66310c92ff31dc8188b92ce7cda12c739ddc3a21cf3759863d02759ae571443c848b373b05c51ea4c511e133468c3b4a28ccd1fb97d9415850c9fcf7a3a111a9259d5e08d508055143fbb86998cd7beae1f2228802aca1134329cc7331505cf68716daf6f080a808ad2cfa4a7286c94d07a8dae175b1e2880294adae936c538ae00a5284f86a9ccc1b7f4cef662cf48510c636fdf48b4a38d6714650793533436501425cb92f45a3d5569e9ac04050845e1d5ecef518c75e60f280aeee5593ab2b5aa9f4f1422fdc6d0b0979a36c713853c59ad4bf24e944bb3279b8893efcbe744d173ae5dcf7a9bf96ea2985535dca7f5b813754d14d63cfa3f9e9889e28a468df87163a2f0fe21a6a3c1a2cfbe44d9a343ae4ffb59a28c721f9e55946b70b9128571f131f1ec5bd5114a94bcc34aa4f0307fc99844291a5d49d28c7ccb1c9228db7488df798fe7ae1189c2d54787b5f1e4f6b39028cc6dfad0a132a5e3ec230afb226954763ed7b98e28f54a1ccd5c6a23ca503ae787f0196ac56444d93594b964a0b536e2228ac936870cd23f45943c32e44cd9892823cf1e22f6e443430e11054ff5b9dbc14d35f6108574dad9ec77bb33d010859e50719dc72f44396e6e7d47981025cd121bf7bc1b723988628c3816d32184e8aa045170e8c193e666a8310f44711bc618731d627c4b05004459a38709f9199dbdfd87624896cfb44dde1fbb1fcaf751ae1a4dd74dd2f4a12c9bfcceca3acfd7cd87a2d66e90e01bb28762c68da3e3860d3d94be61382cc9330f65514fcfc95e1acb26f1500ef32187ce26dea1e821e3d45e5cba667628e728a9f1ddee3727ab43396482ce438d8ceba5432146ed085b71cdcdcde1b2f8fc4f337d5101e45086d79d392726cbaba8007140f75b7b3814c2e361bc9fee88512dc01b4a9a9a11fd2f6daa7a3714b37525664f4f6dabb7a1e0d9762648f458078ee9447f47665829ca1693db93879176e98c1465cf531ebaed3bce3a8a62f02c959933cc3edf1145493f67a47c3cfdf278280af1fd718b86089efb064531b74a4778de93b87ea2dc20496a0ffbe4391b9e287a6a1c6656929d28a6890ca2ec473951889df5f24974b37cdb44314dee791d5b03a6898266ce9ad7d79a7a3f9707cb44214ba28cf666b596041325d774e831af3762065fa29c73cb7a3fe23e46fb18cc12e58d1692b19db1da1d5689b285a8987a4d2d38c1179428dca8d85c279d051e03184ca2100d4a5334fcf292d417471265902b923408f7281d1a89a2bc56f4567c749a0c12c57abc91ab1a394c3601600af6083d3d48fe613f840f20cc11658b4d15f1631a5188a9467737e49cf375c688f238b8cdc1c365b6c942c116514e91de73abb23d31ad750453442932ab6c24e6798f922c2358228aa1fa33e386b30d412c201822ca11af6f0d263c42271eb043946fb422ab49a8436f58c00c510c131322e244f834912a44f96386f9ef26a3c1fb0a4e70160323446134bc87c679ebab3914d8208a731dbffa19995e1816b4e0cb0b134419abec3fd48a9438ef0480030b44c97725937c32bdd85a010b4e40835f41174ff7057fc1820c7c4183b7c07fc12a38c117302817805a1820c89f1fd5ca9a4adc8badca81fda1301236e448c3f2fc5717301830780df80a8aa720062cf04203c3beb92b008b303f944155678edeb14452ea4379a5273d4246a51fb37b03e343f1b2d463358c612d329006b687b269e3b67694afe004a77c052770801e8a8d74f3a698fcb81b7706cb43b9f6256506c34321b271caa47cac1a9232c1ee50f0982891f7f7b2a9363b94f3fdd6736fc4c90db23a38552d211dca209e6cda876a90da25d81c0a36715232c3cf39ba24876270f0381b47481c0ae16d63dfed59372b1ccaf5ebe7d11a9cacf9866268bb93101d63f420baa118f5a4d34fba56906d28ca2345e6fd838c86b101750ffa516f6d9b175de80840246c0d8575b11b8d0ecf418a28c1d450bc6e201383a4b5d8390d8587d37d663d8e1a9f8686b295a85e6dd6dcf7d830d819164d47966e218e3ba3b71b9b37800d3ca09b6066286bcebf99525ab4ebaa321422c7a7cd10d62f7e05343801198a995f1dd6aed648c431141b79768744fb7fcd10198289a1943b133e448242b03094367fd6ec612763ea81a1bc217ba36ca0668e732cd8174a939a5123534a4e83bd50f8f030ad2945bb25ff16b081c18f7ac1c3e00c605d284bddaee8c6dc908271a1e4ea6bb761bb31eee309b68542f43789e6f8738fc6b450cef81d99feb34fab66a1649de3d2d148360767140c0b65ed869d518be60aa55489c61d426e8913cc0a650df1716e4ebb0ac549390f228bdd3b8651a1343e3aef2b2164a47e16c1a650728d995cb2c3ba202298144a1367635c69fdf4efe30716857247e392f039420cbb870f0c0a056ff3eb6c37951ba527943362649c63b09d834a5630271472fe4334663b604d28dda3eb10248c5fb4e0046f3e036e302694a163d39037b1f59ad7e005ac0215c4400362b02594c6aca3f849c6fa5629604a28a7d9f1fd3c5ad731ac15b024943506cf95a5939e273f0918128a31cd8669fcb8dc6bf562cb4f400fb02394f1bb89e56b0e04668472decf210491e81e25f4624b052c78c1c13ac10abaf88215a18c3ae38c4f1f2b38017bc1002eb858c109d80b634428e84cadc7fcb00be2810da11cf1ff23a4d20cb1a32498104a3a0f1fc4eb8c755b10ca1977f3dec96c3a94068482bde6b5af69b497fe07659ce346eddd7c50b6c810d3536733064d0f4a9ac56b3d8c4aeae7dc050cba70d440036a603c287786379f72b27bfa73062c6000175ccc80052f7881eda0bcea38bb3a489bb144bdd81674f1ce02b3821838800a0626780147c074a0c3dc38c7edcdfcc73918a38f713d4c3d72180e7eb85926f256e7e82dc6922448caa8b4f06acd4fe6a279b1350316bcc004a88018b8e01b60be03651f0317bc77615e06e404658b72eca70e53aa6999f3b528a5a7bc9f43ff055f7451350316bce0052c58009617e605fc300040238a1685e4c0a543739fa4db6751b43429c758cb72e79645217bd6d850e79afae0589444628ef820734ad90a8b3248fde67983879c7eaf2864da7f281ea4f16f5c5152ff559198be92db5694cb81fa5b45775c3240c1d049142b0a1a1934dcb1b93fff57518e1cdfbb1f6b5451ce90f8fee4ed8da39d0acaf16acefe2a2aca131c674e6c8cd8884f51c80e82487a0f9ff626a628fce759ab6b4a5128cd7af5e2412ab3e1c5960c50d0c5e1c70e4cc00a51a4284c94eec8669d511071bd4e3f582e8a326c5819f963b40c934351509f46d9204a4051c88d3ee34c4c3efbe7278a1f693378a4121dddf44469db3437b74386e9839df873f6be4f5f9c28841dbb9fe81964f0d84431e3f831ba87e08d5b2a4d9475fbc3c6cf7d268a1692f7b036bc53c298284944d79abfc6d65872894246774c11bdb91a534b945644d76d3a665fc54a142f7368dd0af50d0f51a234713fa7a5fa9328fe8b8649a75c12c52ff72909395f628444a2e861e3e4c977252198902806eb0d598e61ce86f11105db6e10eea79356e388420c3bc99fde737ed004fe2658c10950604cf08257411a0baa11c5782d59d7696744b13663ab6e4504c9f6228a1931b13bbc431145f59cc7f6cab1747413514cc998b5fb8f22b722a210fc7f25434e1ea2b89d5fbd41d20d518a0c223abafeb43fb91045eb7cd1e93a44b47610a27c7d9d51666c0ea2709e225a3f75ccee9d20ca11f3ce7cf0d764190b44198750b9e3e8038842eed8f618a4b40dc7f943412452dabfe67e28a45a2d87495c42b3a60f8508360f4df3d44964f850ea4edf4a97ab0637d94371b29843970c8d2b891e8a2d19debebd87d441928792468e931d5b8287427894aa4975f6223dee50b03547da8f3a6ce66187a2c5eb67c826891e1d75284cc9979e9a040fdbd2a17821121b4c7496673b87428e2dff6ccf7d135a3994b15e9871286a0eb196b511d641e0508c17d6d1a563729c6f38658cebb7c13b1378a1a242b9a18cdc25c60dcda0665aad536d18d7e41bb7b50b16f82041b1a1f8a0edad2cd229e0ff02065da0200531e8ac09fc172b6001034cb082132c80d8d71acac03aabdede43b59eb0e00b18bc590177710e77e12be02e68708253f7450c2a70010042a9a1d08f637ad5dfc871f9030360c0002ac00005fc3bc09f525169288eff45e3ce6b0d9a7c118316ac2002596828e4b8693c9546f1f802062f38c12195a5ce509adcc9a3e66596757630a0cc509eb4d112ec514649a60c65fc18e7fc8c5bc736484586a24fb5f5c96a14c0051747a83114c6373d2609b17ffbb9ab2e317c1e2eb2e46e84a19c2b91bb179927780986c2ff6664981d24d35d5f2856b7c5a58fa602fe177ca18117fc0a4ec06c88174a9ecb4b1aa4c9717f329e0b2eb0505d286ae5bbf8dd450b54604e050ca8410a56708137c1a7e0043238c10b3090028e810b8a1517ca350dd35bb4b3858274874993ca5c3bf25a2859e6cef3f81d099d2c141df84858bd0ff2502c146566dd4c5f1f86adaf50ea9d9aa0e25a0fd36c8572ec74b8bd5a4d170721e802040889b2fdc6dceeda3fa2f4fb3369f5a3f9a6ee88b24f06fda0cca741c68d2878d8943a1b238c289f9a7c70cfc8228a91b437c7f478867428a2648f32f41ab7eefe9a883288b9cd76d7d935aa882859bbe8fbdd6fc58d8728860e8eef1a849fcf31442169f66bcc9e4294cb434629293a7e2784286cdfa48f931b44211ce6fc2166fc39c61344e143e79891842e1045cbbb5bffd8f0690544b173868e75524c7eff40d8dc767d99f9a1f4315db28dee4371ba7e37b9877808f3a1b461366d6886945cd51eca26d941b24374473d1447d2a59b44f2508e6f9a619a170fa5d68ac91fa277285cb59c9b450402b44331498dc54fa4ca8d397528fa784ef720449e48870ec5d8f672399fb7338ecfa118b6d53308ebbe9fb81c0a31d36a8e3937cc1aef387c51991dfab88643f11b368ced747af2923794364ee4c89373ad6a861b4aeb123fc32bb70dc54792e18318ce7d72cb86a239cef42185a7ef1c5d43f141dca899bbf1c7ad6a28685dc46a5d7b54a56928a4e9a453de7fa1198986a207f5d10fc1ebb39b6728af44c7f819e69f18d30cc5cf7f96a29261f03896a11cb321b7cb4e86424486c93739421ec918cafe786ce524a3e4856228ded7c6721cd59a290c4319edffeee84744b6c1500ed30b4de3e2b2c12f943276c9cf865e28694eed345cf5e9edba50463da2d9e13a2e943a984778a8ad93fa16caead31511d4c2e03784cca948168af13fa4777a60a1dc792a3464c8ae5088fb596b7859a19ce3d6a3b9aa0aa5467319fff3113115158a9ba67378fda75008c991399da40d31260aa014ca0ffafeb368c64fd98842513f6cb2d79045264a5e6c552514d2cf1ea6dfc14f7c02f88462d438d9f532a2130a2d31c489b9ff1d0ec22614e2e690b6f35b696c30138ada4024f4df7fe4bb84f2ced8be23f58e0d542514322c390dc9ea1e6526a18cf384f99f4c39bb1101888452cd4ea88fde08c99003f0082d4023e809b0083bc671de8399758c44683b8bfb7eb870180b00157008afa499d98e4b4d79f1e60429800103b8e0c2ff042d6081b94221943bc96f8a17370885461fe6cc3caaa64902a11c3284ac41c7c21f48007d50ce6adcabba698c00f6a0689d9ed3685c7754f3a0607f761d9afc1d14bb2faa315a07e5909ad87a901c94663686abbe8c38284e863fb193ae39587c8b32a87e791ca73d641fb6288d6e77ce28bbb95fabc5f69eb2b4719e168593c9a9f5e01132aa5914426af0390fe4321bb228966c888a34e175165d2ccadded18e39b1c2c0a9bd52f71e221e4e4604de25e519a0c2747ff1caca3875c51dc549326a95c405c2b0a79e7714cdf3e5694c424672449e341dc2aca51af4e24d6436bd80e5594d3fae968a7e9dc34012010978ad2c7a9cc101b8787434569c3c4defd89ee14c5b9967e9c27fdbd1ea30e678ac2ef3f869ba37b8ed737006bb852947e27c47c3851e21be4941465d9dc1931ca34cc9a76917db85194532264ccf57a11b18aa29c37cfdce5945de01f2e14c5fda0112b2fe57b195094df37b935862ffd58f385fb44c9d1762777f839c58fe78942cf6ddaca47a9e138d789b2842c31ac4d4d79384e94643d04cfe81edbc36da2902fd5f341a3ea70471d4e13e590fa0f32e72d5d26ca2077f8d314197f5889124c9427c751fb34bae6681d97284c43c77b52f15982c9a041cfc7b732d757894274ea1dd5d7b431399428acb883b3bbd792ca27516e8906aaa697244a3bc965754e74241e71b84814457ba2dda48c86834449e53a429884ca708f28a45d890e31ed6ae672c5708e28a47f8df971f57b46dd36a2546f338d743c8c289a07e98d6b3aa3915e44a1ac6fc2e386f241471954e114510e214aa49190c54d44513fe3a849bb77a34910510c9f35886d6507b90e517e4717314cf0571f0d510e8fab3e41b3e410192f5c214a6a91fb2b92b66b328428cf64d864d75e5b84750b378882bd69ccf23946a99a477082287f146b10f3790251bef7084bd51b10c5d4f1e05cde264b94ff503669bd9e087a1de4f643a964d2ed6f67633c197d287e8c8e63ebc76747071f0af3e8c61e468917a9eea1183ac40c92db4c37561083178c099c1e0aa5e1b739826e955a1bb83c908d37c9ca87491b3c3021596292aca9df1d4a91753ed1aef37fd678b1956787d2594b92e8209fd6a1d0db7d1be297c7dcca8bad2ebc80410c5a4035ca3c0d1e2d7074285b77c631e95cbc53f4869b4331d56c72a5d1ed6df0e450ca9c1e74fe9c76a17130381817746f28238dbef57174c763c40dc596d0c045ce5bf24f189cc0d0e0db5094f91c4fc9c91fb6b802169ca003c78642edcec30ed138e5d25b43c931f40c738edbac3d3514fd43fa3cce33a56979b1158332ad2f60708214e0a5a1981ed228df4386cd48c4a1a19c232f53c3eadc19ca9942f3c87b4eddfdf062ab8b15b0a04a0178823833141ce7ca6ab37b4d62190a230d7b7e52f823dde4138e0c6510423d49303bfbba88136e0c256fb39ccfecfa90ba4cc289a1982e45eac6ba2d520309178642fd07d978103c30946f43d2cca6eb7dc187592fc1d6ecf342317f523e97baa488f375a120e1ebf2d8af32cd3f2e94bb354f4b87541a22260bb7053fcf7f33ff794e0b653d1f55db94b199bb2c14266d88eb9429b61ada050b7ca8e0b0504a57d91063a5175b7785627e6ac9e78bdd0cb67a18c420146785e2b9a5cd694b6e865e158a31c7acff0c8e5fb5a642a1e1c72d0dfd1373704ca12c5919dfc36352288350db7378d6f7496369b8281452c3e029f7e073e40e0ae5fed9cebd29e663083fa1acb531973c940addccda704e2887e8fac9d7bc2614e267f2748dc3e8b732a19c32b96344b2ccfee925941ae64919231f433b9c12cac9317e9c713446c890355c12ca2775699f6e3dc74b9050587547a9ba35eec973849265a472249e334239661cdd5663a66928a3704528a34c1b2baab32342d1f69183a83b6962cc9970432886e019328cdcacfcb0114e08a5cef1ab416d7ac7565d10ca9b9f51e226d11a680e08c5adce1bec415ac98ed2c2fda09844c36c746307314dce07e539911072eadc13fa5e0f8aeeaf7a8f4d45a53ec783b2c4440cdf99357eb3b783f2de27d528e93349ca4e070511cf293ba3edc596e9222f07a538cf38469e6b918cf7705092d02d9637aad92dca377d56123245e69e700a1806b628a8e770a59f7d5337ad45e9b35d46c93d397e6b468b52c6fb33c79fb65914db1dc6e821a6655146fd75db1d6d2c8a5e1719a35c9149ed182c4aa7a19bd3ccf6f1f9f68a926767d0b6238fd731bcd8c26a81b9a2e0d7e3316aa751b186175b63001b78402b8a66ffc061e7ece3e96145b1c656a3352afd72b38a72ccaae132e484693055581a6ced56ac4f45399c76cc742947fd70541427e3de4f6aac8f91a728e376d3ebc9193345a1be0f8b40a8348f85e258281a8bc4218138140621a5f70063140800203c280cc6e1701c4bd280dc0314000353282642382a1a161e1a221c1609478140280c040642615018000804838150502032ce7530f90150644eae6ce784dc0761423286ce5b71c85ca144ba3ddc0bf79db3f2dd4d714737f0a11422be6ab873319c2abc7361cc5de845d560fb7b380d4596df37384c5485879bdb8b6f681b227bf8ddce16e5f7c7afb0e567f87503270e25fc0e150ad90e7ebb1e0fea39b19206891326062910ad4fa45d7022f62b32590287608d4b99f071619584168943d6a37409265597d652c65edd6abafeeebf1cdd8d1685435da74b1d1702ea9b19c91871554875ec22f24171b7264139dc40534f89f638f0989a2605f978b96a34693ac0015bcd92882efbcbea72a16bf61faad24857490796019c4a99c4f19b30ac05a9d4368bb0d274724e2dcb8f31e95537a49cc549679f4ab08e1be39f6157498e3249fd8bcf3002f1998adb1c2b02948691c383500242296f648cdf4f4d1d4ac7783d69c8aa210ee16d7013fa4bd8a595006ed25b1ad07363b92951c21cf56ada513c0dab26cb662ea14ca17efac7ead88b666523005f04c07b520a80fae4636679935e54675751739debfc011663525da4c60642aee69a983a79b73f5e7cf6848b059153bd052ff76b3ef6d72975f81737c4c01e007a2bc27cfd07e51e21581f24542cab2edaf4ea4b22a206a54640a79b38836fa9fb5eafc9a58e6b6204c28d113c94900ddb08ed75216d6c1b58170898c3c58d6b25072293b0545ccb7ac3649c04317979492b086e26d159cc774770863a38a71e148e9f719db63d477579881744128d3e0d343a2829c39697466d12daad3fcf453f32cb0153cac560adfbb9c824fd992f5b53d051f1ca0332fc62e1303dfafa735b05e8eba89e4fc00fc847428be08d038aadc6aef5014f20fe21c60f9e222c902525085ae44d797aea8a80684d381de373026b2c5a301e2870d2a68d0d03c9292104a62369735625b74eb03f624195bc77108db8da156513804cc4ca5ed29481e6cbd41ea303e790c2081430e1429e440c0e2c2b86114848a9eca87b3c94a04edd94140aa2ac0bfa0da2e3e2d8c7cecf2330971aba59819f709d3a6766d695260d74b88e1eee0a42bcbdf4fd41354c28dd17ccffc02dc0fa3a70cbfacb105b0f84c69f58a90dc80c0b9872ce1da98228524f8e6929a35e715942499665896a9702d8519c32ef9592f8707cf6b35fc469a37940962ceca9f6f89ee9c1a73d7907779c3102670f09ec8be9d2786176530e57da270df9a53f5e5e3c1eb0238ca7f8910083bd064c2320470f5d76101ca90df9613312acc4f9a12498514b6c95e825839e2b9c947a5ede49dd1b45c468e31be98e9009a841a7668a0627c3eaf26a639898dab16ba90e197c6f80a77b49531a1bc78e29e6752b74ca38f81807b38c2180b5ce9d424e6a4f946a2b61e98b359205c2df1409a453a22cd362105e4dd6a1453cac7c24bca6d4de6bb16cf7d759e8e660706768ff7be1185a2221829c594afe03609a9e804a0fc7f033553807f88e72a080fadc85e35751c0c1223b88f712842794d06facb2cad7bc7dc9fe10a85a2d93316734c3d004f74e10357a67d7ce9fbc964919131cc71fde8e2cabe3850ad71084d057686912b2ea2b9688682b3174181dacb5e0dac24d1127df66e547cfd00ad2bbc21f537a681a0362ed659019fdce302285413a8242e12baa94c4ade96cc7b6dd1352430294a5b9e9a8042f0f87d3ce5bcf64c4fc96b7cd500fe1db95d394206cdc57d5ff3b4a881836550978835b191aab09df4bb26091c0ed5d8141deac3c6cb1b41e6760f69dd6f317aec2814954ba3d074b270c474304bc710b08b14ebd9b56943b321230ac6912d4330bfb89e5b190a68cb9670f5c67740af37bb5c66afd16ca18122d6bea4ca7b84785cd68ae1d505960a8c4e46bfb67027ef728391920f34ced44e1e92a2569268b6022371da13ff4bfdd9ca09d3cc2b4076287ccc3ce2032cc92cf89cb9e714a1f7f3911b990598182e98c93651b06ec5faf2d502f9b9e0d4d58a5a760cc613e12446729a818a317f4e8b76aa6c974b9010766e7520f8b08ee98f807972a81b5a7fff1c041075ed64f628945cda4b90ae0037a8662f669d39ad332bc932010c3027eaf2b4e71111e00f92a629d0f3303d1e0c1bd5c30d5399a2ba5d4b23f54e7e8737811a9bfda8441fa9ffab1dfcbd4fc4a56102ed9b85ae3d556bded73751f8d5ac94aeb3f2b09648629e4d8fbb463bd07cbda5774d0da707204c111d462afb2d315396087eef1491f813658b34ee88c1b908f9b43d31deb05449d239c037f73359173dd1eb4dc0e8bb17350126b8eaafff8c1396e4aa6508aca2b36ca887a625b10c230f4648ae752e7014b18e8fecd5e64286ae7480fc8cb23665da2a83818b982f1bd4c0e4b74c4fc06c761584ac2cbc93bf661e438c6e5dac1c263c3fe1afb8bd9ec6c484d94acd6355644813c26f5a20971d9c656e3f4f61d2ac9383d64084fdd7ac039be54a72ede38560d0b0b56cf0f649521c6e86309b4bc975bc45ea101da1f5ae5a8b36252cb009f463997b2b93accc663a88e9415e0c395cf4dcd9855492a9f4451b3bb1a092e76d430fc89025a579aa6ec5243546da579714a4a92b91da77665b1d11113a95b9bf35dd1e67f3aacd50851b1ce2185d5e405fff0e79aab5bd46a7d05f58545be22fbfcfcf9d4d8cfce8919a1f348250ae2d9a56976e720449a4c0d70b0ba5ed2b60df6f9d96b86030f1caf4b182015fa0ebc86e4243a0bad638ebc87c8571dc82666d6c90097047f970aaca662bb4732dff51150774fb987d7846bf4c23aa8174f6036c930a5e600e7b601d2e390201e03abeceb7773f8e55d17fd1715f2a1a700faa5075f536e442f1abca16b735ce24076731a64156eb1b8b21cd346a31105a25b2ebf2b39290396974754474e1c7f503ee119edce8e47ed23654632e7579487e7e923aa743ee7cbd75a106f44d38e133809c2769e29d6c5f308a28807b25a3213ee5d9bd9ea48186abf36df51216b111fe4e6ecd2fa1c232eb64ed5941b0df3e60076e84346c77823174c57636c4bf89b711014f0e735c9eca5da97aafe4d41c25515440722e2b5dad6bb31d86ca49273da30a0546ea26c6ca66acb4377baff22e80aa2e48b690ca3acf3a55d823f83d324cac389d88dc3a66e1dd42760670b53949a3f00f81d59d2df44d84e84cad193bc0da9dc4c727c41f906f56b4a9fb7143ff81691a2ca494189bab385bc33980d1cbe228a7f0edde36f52efb035f9694b9333c2887dac780da0030ff3be295f400a259885008fc419439be97a267e6f745cc8d09a71b1c8bc3d7baf688a85b2a177dc16b7d7c7bd9a85633bd06ff1a11d5d6159068b71712b69ac70823c52020e510cfd28def1cebda5c116dbc0754cd97270fd388118f73148bc8fb3f3805a5a1b84f6434876fda05624687b067e318beed1da796cb9e26e1825dbe5f53f090e6f9aafb53f9140f3f30d2383d95fa023e680d28a7e8226de76002070dda1c19bb61caaeb558ec73b0c9a6d46fc22316f141386c2246c100ea8a8d46c9204e6c9d94e31e56a148bae00bb1fa70ac6d37be2bc0541a823492553cc6209d40451832b308a7cf3e6a07e4713848a82050406b904291a99651318eb13af8701431c25da47238bd5605402f144342e799335a1be6b30c0a06c101e7f59004b8b6aae5c7edbd96e6ccb3fda16ea42e5d2d792db21b562c07f3459b5cd94b0f93099ab53c6c3d71e7bc2b5051d17bbff3f7be4ffc2cc2d5a2e026e0d52b35036a699b33f5f565dbadf566733f9d161ce3daf608c1ffec5b7fec023f3bbd039afb7ce5089b400bf514cd8c5ce1fe37495ce0f673b488872b5854b79105188bae9dc071cc39b6e224f3e06a012a47fd7cc5c034722a719b1741058d99341ea019dca8e88a01fb5e401da393ff592a4f021f5518d77389f29c7ba145703f7c31a1f4cc067bdb227c96db7e806a15e22c40a5745e99594c0af08a2fac17a16028e83ebf6a507e22baa8d2926deff61942c0f628a447a1d4918ae9520526c525176b2a9a182c7a017089e6517cf018bba3025849a0b9c1fecc606c8de7fd4c4738d80a2611b731e8299057bbd508903f33cb143cfec001e6f3a7bdd8eb7f48cdbf70bbfc48340ecac6e8f7964a292488cb3326318566ce561edbc2ccdce744318f44be0cf304daccd87f61dd25bda5a15267575ffc964bdc6c6fd35cb8bcc7faff9c3ae731a781d90cf5e2a40b4a225850fbccd0f0dff52dc69ecb4746572caa34ff7057a633ef69238a1c6f63eb76722892c4578c9ce02fbe36822bfac3c6f14eed1a477ce85a05ae7e5ca901183d8731b89128705b3204fe6e70a1b3f3c89f0f93745d1b2c6cb50f345dbeaadec88ac1fd8288266dca6c5be6500bf739327756cbbb6f908d574c40147acffd49b050af9644fbcf950611b1d669db27be62b0fc61e99786d5d4b43087c9b9f3e224277b86ee516ad1dd26bac94324e6772848b39c605ec1e25cf9c02d0bdcd77ddefd238a496499267009fa9cb24e35ddd78795b4b6abc08281c104070ac0399ba319a896378da516e1b34317b6c4fc103e8eeb593078059b60814942e47fcc1ee2ae563e94d0189b569591e6f9659c10b8578c230ba72c417b282e57edbbebdfc2ddbe1a79406bb044d690c506e681960492f330a666810a72bd669a2ee15e4094c21783b5ffb295aa542eb6712e5ba01b57bb99f80253abc7b67069a4582441eb122ebbc4631dbf00e27fa9d0003599a8a712be58010b9c7e6b3920feab3fcb4856ce86c09f8e63a43566209bef7811bd4d7a7711d066bdff02cbf193846216935641697d425fb4b96f8e7ad8ad27da808c33081977bc2595a043ec2a0dec7a1dcb7e7d8138a9c2ff74c5fd479026f8c20cc13ab00dc87df8e26f39c0e7ff544a27c6eed1c23ae71bd7e31899bfda1e484f638b8714a26ebdd80d28d0bc29e20a6038d52ada1336211b8500d9d0725484f4a3e06f415261a7a8d8bc2059c067cbdccff90b30705e3f5d4f495e3ae65c7c6d55d01df25e2b45eb0ec5c83e75fa9c3c1825e871f2e586ab123675f1b2709cde08a81e5060ddc7510a0eafb6e0ff003d66d911b1df0fdcac3f942a75ebd1ea31b3f8a9e11e89ed260dd02cff7a890dd4f02c75a3f46506132011066f0310c12227f29852d6a3f9a90af7e780ff54549b736eb9534fc550856f07bf5b331abf61b333e37ec24dc5c8a0624ac442983cbaf58b2b176566d5f1381a45a97cbfbe1aae12461a65a92b361553c790eb0b53ec4a10c67884e1247788ba203a17143cb507a3e5d1991f6fa0223af4529a137be8f5afb9fb4e9e6580ff52d768caa55a46bee65c9c8dfdc29b56f15421b9e2614573ac6ad4c304e752ab0c559466d7cca9a0608ad3421daddaf46d6fb1a0fbe5e9237847a6d2761a9e5b45480d946fa8bdbf05d376168c9044b3a78f345779f53903d3143bf28ae4ecbc800fb609c97b70a207590f0b85c524cdc2c874b2ceb2d5dfb2754b5c6637ec4b54a0cd28b4971371a44d0f6ccf5ff73a8db52202b135183246f147894d126366f5b5bc770a5c9d7ae90cb1d34f32caad0367d83b555c372be7bd01816e47e722e44f052864cbc4048a37589046acc580431779b4b9fdedee934d2339e428a5a91777ca8eb34fc329d0e98eaa26d4567c8cfa3853d3e2cc06d8d4c741b1a614ff3fc5b97a88ab37afb1b649fcf4a59d7335147a8e7cc255b1632a514e07447038333b45143ce520a335f681691b746619ffd25d0f4d81af4bbe227a6157978554410add13a857803c0b6173546a4778b175a5cc6f6e69ec6d66faad5d07e39a89076659146a5b3d80246a7d50833206858e95512b9041d22d10f190a7fe260670941a8739f948495007ba209f71a4fac0094704d297d4ac4406917568a069738862c89ade77e580c966a87bfa994f78b0b1d14a268c8c7a19ff74b9e52aebc6a8f0d3cab278ffdfb8708369f9e6fe0891ee3a1b27e0a2f6317bb872af4ed02ce7356fa1c1c399320431bf1c21b44483821fa2459b20c94e0e275caf740b7f65380ca9b65793d5191e1405446a08ca53c30caf73a19ffdd069633c4dccf61e44d98b9408bc755d6bd1dc1beb08660c7bfeac2b8e2095d63e154f7100cfe529044639c6e906e649b0eb1d7b7ac1fa326a293c5482cecc7d156114b4e1e1372099f7c8e50365225e801e88d00b171bfb4a9ae73c483ea8cc65bdf1860cc88674a4f35fc714df303cc1a18514369740672036b59a06eb8302ce060ddfcc4c2f42c1093855c5a48cf0215eb2e8c3f31233e5316766b015a0b63b6800b0bd3b090636061ec3a18143149ad7ac1f082b19ae1dd62186999f91a7e2e38a1db49c730e1c9ac5e7d5e2a969fd3fc568cacdca48ca1873591b3f04297f7bc3533bd03823e75d82e97d1b68eaeeb6eb680ab56472446578d6dca5bd2d4f26502d82c824b348c51fa91a053328c6d3874f71a493b28c6101cd13ceff2afd6614772ebb03aa51c3603e12b95e5fc391a75e3504b57d761cc3f0a7d71483c3c07359eb8d77b496049f78747b84c34d3fac8a6c003de8a072db6128ea5c183e711e2c8f443c3aa7b0324d3ec4c3d464940dc23cc6829037778787325864052e841429f48c8ee07cba930b82e750ea32675c759b48ef02c1ea0e094317fe6dfe1a713d6f1db9cbe7453aaf07080b2d2a5874b7db0e23c59968f80b38041710517dabf0ea0a9857c5218c074853bc61ea6edab17ebd56e9a4787dadec0776f91c2353b93c1a0080f68a265354364b0a12b57d74eb3f81e6c2b2cde0e553e03cfbdab8ca37a8f0237424ee8e40c0f8f1b47ef6dfdfaf0907c14997d7da13e4caee2294e97095d0e2170b80f1428669115f7e89caf4747ee1762612e70127e4ed9ccd03bb52980b9e6bca4f3b5591bbe52644f9534e1e988972285fbf54142e374dc1992aa46b87c82ef0baa15aa10a44888c0c287422904c8130029b043584e00a8706c044e394e6781044ad0194c7bd96822caac1bd318324e324ce737667f398d6676f90edf7992ee1765ee891395c855774ad738908909544ac62a061d359212748e5cdb17a63440b7b607a7c539eede49321ddb0e5e2afb96383cfdf9c17fdadc8eb959000f813cf4520daff20b728b602415cb1b22dbd7756c1f24dc54fa549bb76f0e233ec313cf5dcbe81403f95bb7a5cb25d0494b3d3ef2bb879aeb87a776cd5ed482378269608ef0a67dac0364cb62146b945c223e3563376d7582cdbcf1f136dd2260060e157031034a0afc2836993bafb19bc3fe001bd48b18a5a1daf2572045015add44b7b8005b6d7163d6a00313ffa6c1e32c40166d88762b5bb5ef855b89df423c0a44e1f5a17433081c3e45408ff337abe3d01083ecd5f555a61923df703efcd93a24a472b0fc867c7d06bfa03aab63e4efdacd51238e150ee5b0175ab69798cfd49e073511336a13dd40a8aff7b34daa93dbbdbb0d4e5f705c02dac439201213aff941f862c8557e496d505a6230960fbf9295f1dc2bb12f3291e13e0cce7360c57a83c633d132e1792aa42a6dbc582168ac99e80baa2662d9c8df7af93b464b2313bf22ae6931e9a55b57b47e0923a0f41cf025de0e3b6efa3957ebf81c053532006b80bcf6deedc14bfe3009cb5cdbaad7eb2c581f313dd0066534c1e8145206c4a9729e4a67215d2a54f372531b4ea5ab5df45dbf4bf5977193e2dc5393ee594c2da3ac2c3911faab92135662a21ecc85d8fb71162398ad609f6730af3264bacb82b34a3bcf4776708423ad9c432d2b741c551334c7f91d314ff602f23362f163b7c57339febab8d1ac83cfb3fb560ef5f972b5750bd354b14afd12ae46ee2bb6406e6d42a889c846ca2955192087938030ec3cbddbaa623b8a046305c0343e062eb3695f0235ce599de884361fec0b205602c0a0cf96235dbfa754bc82c001892607f34a93c13b40ab6a50b94842ce6b959bb8a248780954b81c9ccb9c58e40aa0c27b2d212c180380c98385b0d141c03744f6b4f4469b07c52812bfe033efe9844250c46af035e9c78ff8f5f88e77236008f45649d6986a9bac26e6cf7e339d6b96f94c24e32313ad8af39d85e4dbde880bcbec6ef94afa2c11780d118aa8cfc71ff10eccc7bfcf2f7a4b39bb98d303dc99955d16c8f3ef6bf310f0bd8bad1f24d6d61b90fa45ff5ffda88433f8f2298c256b5db93aeb02a145ae17cd87e8b1d0e5d6c692af30e31765d3683a89eca5bda01e0122f3b0db2d27834fc04b0e6cff8b32ed5758a6dce8bcc83b4f01a24d1b4625bb38aee992ae694018e996e7ae32c2bc4c168297be1dc2e3fc98f640bb7deaa6fec3dafe4dd465fd002f7e231b9b974248de320c2698cacec1df41be10745c04d5c955cf5dc60a127f7725e79896df05d8321027b943b7ee828ec10148a07947b90ff95feb2ff479e8cfd0cf86f473ae72a22b84f47df4afe07e0514cd78dfacfdd2c87a5328185ca1b8f715e3e7f55ffd7e75fde4f9a1bdcfc11f29fa159e466ac608ed572839e379c84f525faa7d4efed3faf2fa01d8b7e7afddfb27020fe95a3cdddf037fc5142df125327fc5e13cc81f29a936ec448c2a01747a5794f0c55280e47307025b490b7a9ff16f9629e85ad9521dd2732a43e4a991ff50e17aa7bf60dc680127f097d5dc3a5434febbad843f35cb1a234a77a16d07303355b188a19ae833dd8d856f8cf213d9556b1453c7433e4f296e3b39a1c791c7564c9e9abee509ff72ccd9d93d897547211b2f33a03aa684494ae973c6fe31198e9575ff74e734c30ce85ea1d13a23aa1a8d2bd1cd1ee8217d7b348b44f48f76c4a743fe1ea3b9944b727c65342734da13f8f04cdd28ce4890114ba33b23a146b18d1ca3aacd6845127bb3bd6bf4da68cf47bb846bd469748fc6f1b7c4ff0989faa36193cc54d28eddebe3cba3712d3d499a96a4f648551d310069975844f796070930695030ac2a50dc5d43247485f3ae52478277908022bf92aa25550b7720abdc56373037ee64d85b4c6286deedc25bf59fbc9536c000303d6db20c5fa32266abab6e721cfaa407cda00674ab3605f105d8981241944fef8a073231ebd5e774ac7e63ad6b656d1f44ae06359b2257402b374937f839b6352e5e6b2f58aea545ccf0ba0ded6b5cc05ab1175f0c3362175681db2c82ea396712594dad4d23d8e0911b2928ba4df1e1cb0a4f7b6b08c9143b788fa7e9c10402855ac354a36a8d12cda0561e2ef78b10a13b5666ae8eb20609fd80ac26f8257bf6ed56db820a5daaeead1ed4c0dc398a6960739fd3952474aaf9fcb761d9d3c714253ab2bfee0919cb9960cca6ae57d954ad50b2fb29d0f11134ad18702dcde46ee8be5b52bcee7a4b403071542a35e8b9bafd43efe4d9a0f616d8826d1fb39a0d311baf3eae7cc165faa94ef9cf496489160b455b438f751aedae7bdc78a097f279bbbf9b5a05060718ecbd8e3929fc4204a10a60a71ddcf4c60565d0a983e75d7ea93cbb5e7875a91c9bd026f4fb4ed5357b1d2ac39c9e067dd28c96c1b1f5eb03afd93efde97cbf0be96a4f8699eea8b796a468043bded789b3495b2eca731f14224a29d05472ed9bc1381138385df0164329e92653adb6d0405e47c7004227fb8fdeb685cb9cbb020a7a734cdb16011af43e38c44c4330439837dca20144af5c6186fe237250294e865ef499bdee1614cb50e4ee18be3c057d0d800c6e790540414daa7285c8a6a70500633e851183460e70c3ecf2969b564d78d5739b0efab535b86ee99bb76d8c60a51ac6e2fd422822719be50bb52e8e5ec4c770ae7e55d9385e1564bc838f2a212f1ceaf4dc4955b428a65ae38ca13b2ee99eea39ff65566f494c321b229e84e1887c69973e0a83172d93328998e8ed950a56cf02405d298fe3ab58c636edeefc567415b0a6e39d292b30aa7bfce5b0aa092426cb7c3822e3bd67d1f662bbf5c5d0cb00422b0479299f297a73d6b446ab43b1fd2a7e5c997aac763e6198633100b4a128d35cbe90199ea6f0bb36df7ddafe52dc0363cb8f1db39ed31d455e590a302ab4561ec38d522ee82e6d7da4f16f754dc0a60a1a086d696917847952a109785562e99c17b84bc74651a935084cd116d7ae3291618c0d744a26bc55f1b540c4f60845e7cec362964495b15caeba705d42bdcb96c7aec7d6b8c8bd5eb6705eb370dfe516b9cc5a5cb7a1274c962f628ab1f995b11d5baefa13c9c051503687b4be6c91a09433e872c17b3193e3aba0fe609d1c005cb05c3a5d8e8ecb57b540cea8fb0b1b181f2fa5608e7c79151c6f0fec92cbac9501c9ee6018bb685ce0362f5b119490d015b38b9897f3205b968ab439a0b91cc0504d897b30362e8273799d5471924bb940a53127560cf04bb0b928a17201c547292c8a4cac85cba7e407387b69b79aa2e58a29156b289d53a46c85c5c491f1b84b0a6bf335cec015966986d0c5865161f9a58b7feea6b02c15211eab5d61b99117ac65fb057b17ae509d05e8264d040f25c49d31de1efc89693d46b90a8d6f40f1cf44ccad2cf8fb6b9251d3643405dff740b3d908d348cea8ea477f48a974b4431755023106e30317c08536fbb0f6c9839f1bf27c02226f46daae169254cdb3cda63987a4c18e906b494602c480acbbc7e6ac341704743d69f941d1c1912754f570d83fee2a68b48781cf2502b2b11857357dd8637b29b049e7796cc24ddf77cef8ad13660e8d89582e5bc5a58462e65838d54a44cfcf595f271b8e8cc8a13d0ec619d915a74cf3b0f005709c70ce3174fc62408ea380338b63f073cafc6e952dea0c949cb25c8c5c89461c4a20878680723dc13a341189e22b8b009eb82619b0bc6f51132cc84c3b96ee39548bf3dfdb6ba42e8f83b3c1b6dc78d34e08296d3d058f8a0ac436f41b6e16d3a3ebab723c9005c2b8051fdb10956654f792cc062ec3d8c92761c3afc5b49324cf0af574bd1e9e2e370d7b2b5c99dc8fa2f433d13bc75548fa248fa907ab97b7e749412bd90116b4332651abc1060386b174317823776904bc869503d50790a7b08ae1246d9a87f9901926672fc3e30d9b5a88d5e87082ea6d396ceb31928da7e40696dc95ba8feb3aed3044ba69ec5d6835f6be7eabe09c520ca9876cda0204ddd86c08b71b3d54ee26eb5c6824ad228705480c03962c9c2e67a647914bae5eea64cc3be6ac1a63df8c05e0871c725913c1fbec26a2b7abe29e8c6403c9b938a7ac57a51313af7becfb883c2bd8e17541db71147d679ae44986f87a8130cccf78ede5b4f021a952ad95f4a4e3a483c15254e485613acef9fe3ff8cc68d4ad7a4cb3984f9a1f71ca116bb88a7311630656f2c0286f442438441e3cd576c69ce1400866e990a82d4693c5241f4bda58c389c2a435389c66f4f93fc721cffdbed44feafb9cff1520dbd15f9188805de77c17c67f2f66cc7c57da7f066070bebbbee7fc6eee5ff4012a135cd57f1905dba4bac3fe0bdaf6ed7da60040114b1732ec62c28915a2440ca447390e91e668d1ebd1a943bb9ac54954c67630506bacbb34acc6aa8e5718004dc66c4acfe0e272c47336b0f27a5e413a21e8a780845902aab0b7943670b254720333333333333333333333c64edb466be5b58d5d2993ada2b204429cb396949494a44d92b5012c342e26342e26342e861e043e0920095209583896b514ad66638a492d57380c6e59e357e41c39622b1cc414bc5a3bdf2a1411aaed43c4960ac7dd21dc7f5c884b599dc2f1f897e66949a570d46557c1322e040d66148ea633a242d40e0a873f129db2e8a95afe0947b12c8c058bcb09876f39598790a41f64130e43ce29d3dfbd31fc634a4826d893663b7bb74b389c76cb644193759d4a384889f7c943b266974e128e2b977ac875bd31720c128ea2e4ccc94ff276b73fc2f1e47e8a90736c84c34acd94df245c84839b0f9976d4a24ea844380cdbeaae52b9a6fd211cf6edbb67a6288483ec741e523cf7f0d205e13875b5c64e4533dd6c41029e800b1715002424100ee43242dbf469f40bfde028afc43c396747b70dd307c7c1aa74c26f0c12e5d383c39f999324291aa53686045af4052a7970944677474ddec1a1778b5a57da90a3a91a5207072b52c12f3d35a6ed1c1c87c8dc27f5b57122e3e030936e2e8f3e6f70701e1ed4fbcab4c1914572db98440750c07401598363b994b1e3d5fba89934389cb8d75a3df50c8e3c07cf0e17db39ec1c4369c60d192290c141a8a8d173fe18e5bf21a3988741c3d4a04152903138f08a6d4973e90b120647a1435cdfffd48f793206f205a7eee40b9bb37926215d706439a4dc313ba7d78f1803d80a72162dcd4a938db271645d40561ce6f43d7796b9e227db06afe22833d564d110a44733370954c541b2b52031bb05efc9c750fabd00a6e2b83abdd32eec184a5bb417f101a2e2e042bce67db1aeae4e0ca5b5009ee23873df4236dd36492c861269004d8177640aa990d3c5c450332e60290e47f762e4ac781fe3458693e04d0d25c5d15d9a8a0ef63131606c518304852980a338aa34912fe7737c0ca74a004571dcf937b6c76c59c2e61f80a12844ff943921c76e17430914477e9bf3636e93cdc9dfa2b503f88956fab6537d8e780ca524f5c4d9926753773a61105d013b7198ab33d374b60d3e553a209113e5c4e5ce9832c69237f1ecb4b898cf36f85f8b19315cb8a8007c013541cab32ed326e1b9180a638b1930ae2c403271fca9f219f1313dbf2706888983ce5cf79e4e6c82afc58d1bc6463a002f7190a3b4cc24e698b5622e404b1c6adc70bbd129d5630056e2f02ffd9d74ab493a404a1c44f91c33e62b96af2686120c53022d66ec660670125bfed0db1263621e8695da40491c6466dc089ebd23e5aa193012c759d2e5866c6feef740e2a03fc76839d485cf92828f38a81c3da6d07339471cbaa4f98d5671238eb266db45f5841147d17e4e332bb588e31dfbd016bf6c393b2ae2f8ebf3f28aaf89383449a98897ce43bba50444c491c655b8206ad11d923668c8b84165c0431cd6d9e79d55302fcd8a010d71749fbfba257743880b0d1915d8c2d080800b17366860010b713c7e6def528da545421c4b56d6ca2f25172c8338d8f066331a512fa0208ed5632a76921e8f110cc449d37bc444ca53d100e2f026c675b36e08ffcd1f883125e13aaddc23eaf77747e7752586920c1bec87835051f133041dfb706492735d8ca8aec8c2c61d900f47f52ba531834b7b38cce89f8a9e3061752a40a3807a38ca8875173931d97c8679380a751271342e319442e033f68a0a20a0012e5cf80c2dca280043403c1c4ada3cba33170501ef7098da3245f2ee4ac91cb2c3d1dd95a6903f897538a8b34bef0f8931965360403a1c45fd2bcb1ccee1206ba6675fcfb159c3045c91850d185d40391c57a4bfaa947c235a1c0ea5e2affe468d6764e170988366dbb0d5f8ecda0d63c3860b17bb86c0371cc5d8e09165b27456846e38fcccb093361c4b768a6b196122201b8e7270d9b099f9cf10c348c0351c44c7ff4fabbe1d3a07d570fc9fe37977c5f9967c1a8e927dcc1454e63f2f886838dc7021f1d99dd384d8190efb674bcd43255f75d10c4729cbf84ff850190e42bfbaea949ddc4e08084886c3641d5dc369947469ff00c77010ab2a5a5a55500c9fc4f664cb040c83769b72cef1080806b4b3c6beacaadf08f885d39c6dee90312eabeb04f4c2a1599faec777e4ac3007d885a336c912d29ba5673372e1289fa6d5fda79a14be2d1c5a90bb889062cdc53453805a3890f4d9add223aea7270bc75329d96f46e61c1214181f204131346834db00b1709093c409222929906103c6150ea7937456cb7ace00ad70d8c9632499b6b7085f158e3295685a49ef10ba8aa1448543976cb520e269c26a0ca77054f9e16726fed55aa470143c35cd84b871913351388c126d53e44f4e7020140e73f8ebfaceb18d91dfc0271ca36ea4d7a01358f3ac62a11560138e4abac72a48d5850e2113de2829f24b044d8d0810991a3412804b38ceaca359b5a284e3baf3fe0de151c13e49389e96ff14f18b14729070b8493c37cc2fd7648e70e07bd1bf521ccbfe1be128a85674facc14e1f025c608f19521c251870eb3326249fef34338d41adb69edfdeef40be178736c7bba85ff0e7f109ecc59395fcb4038b2d11d4b3ef9b3ed0f0ecbe736a51052d476ef8383ffd8d7cf21ae363d38dc9463f8a81674e3771e1c9f259dca921f9ff33b388a96d43ea6cd102ad7c161d9bde6b668c9c161c8e8f0e169c1c1f1674c9a516fb1742b37385eaf387326f6c93f6d83e34f963793bc665bba6b7018f13b47de8e14466d1a1cfe58bccff7f873fd0c8e3ce5f8658b0c0e2ff36ccc173c244f637024d98366bc088deb60709835757ca6c5f882c32439c7b5d860d9fe45171cc431ab1c362275ea6dc57154655d8c38cf702e2b8e3b47882996e48d93ec2af448d9b284e851c581758e1f316a4eba938ae3b874dbdd1a9fdba2a83898181a724ecaa554f414c7daf5972e2c6d8a83ad9c93571775fed4521cd94c12ffd524217b92e2e8242f7a3c6b440de6280e35cc7e382fc95e1f7ec189e23067b8af0875e145c5501cd72613db3821e7a6101487b39672f2ce0bcfc94f1c6b986c26df3bffe779e228bd6b4cee0e3b711cda7cf6ad3bc5cc73e2f0c257f5d6dfc481da459de4549536d7c451f61065676dcb8421d5fd2a25cd164604460b03631fb001180040c261e2d8465e2db32d94cd76898358313443db4b2c6b96388e78f791c3e74affab12879daa91f3a73a15bd287190275d563f7f1287e1634deeeefe578a244ad39e294e8c1789438ffe993342c96e2071bc9f1b5adb43d424f488c3f7680f3a41471c88b987d24d413b5a84463ba008708d389290b7737faab7ac19230e6c428e7d2515927cb588a3909d56c4418e9c297a45a654790d0a90179788830a592da8ff8c7c7d1071145f93a68e7bcc6f318738cc6691c2c3de755326fd6cc76890074b8383f092a37e92ecdc5b5514760607fe772213e24ff975e58495c1518c6c1c4f29e39bfe181ccaba56d8467f66766170dc7391ce7dcdec5328ec0b0e4322dcf2ce8eb5e5d70507e715db72c4b109da8a8396abe9ca7c03ca8a83db96c9b12fdf795228015dc5d1ce99efcd843c5341a0aa38988f8f5016a28c843486d29b19bfa9a0425f4c1a029fa145292a8e4675724352cde9ce245be8298e63c84c9e9344fd94e3183a0235c5714e79e253fca8f9c734dd0c2dc5a1c7649e5bad2f8415801e28298e7c2b935bf4f0a0a3388c3d5126bd465db82812c5f1777ebda734dd15dc184a336ec0302dda65d49871c3868c18e435144586cc196aa18282027589e712e2ec87e58a2caec82202ff89232b1d4f31f713837ae240c4335fd6a713c729c6d01d6539270e3d7b44e9488d512abc89c3ce4e69c3827e6f76cb0c2d3e00e386f90002b4e8121c7fe304468b2e8171e1a2068d131c376c6c21630b19a789c3d4efbe8af11921a50d0d085c91c51610b8220b1b978943b18d1917794c1cd74defb7864fa0973848c13b63ba73458bc512c76b1b623fc56a72a8632819412b71f4158247c8d61063f46228c198f16b02a5c4515dd924fdd04fe2e043447c0c71d9ed940c1148e248de6d4dbbecb4ec12898308561f5673880f911a24283066bc96402171e09d15d35b4c1f71e4a16b82f44a4a1d71a821716a5e378d380a123dd75778e7cc8c382a4b0b96baec6edb5dc441b6cc8c32adc198f10c8018a8220e24eec57e69aabc9b24e238e94e643a4995b03c228ea24ce7edd363281de228b7c6cde0b29f74fe365f2a50431c46a98ced97524e2221f25a21c2ccea6502b30529218e62a54de1f289f95b3c888394c2af86b7a550b58c87f15bb40ae248faf24ef0bc09c46187d835d1f244f99404c4e1dc4e4a1541ff70943f92c5d6dedc968e1f8eee34fda366c969ea2322681f0e624e9254b56e92e5ca7ea07c38b094bb226f8fc564d307ba87a3ecaf491eae1e8ec7b4a754bffa72733805cdc371b6c7cc49966ea92f8482e2e13879a6f416357587e3da9e90f39e46a8c5ec701c172de40d3126cca40e07e9d30689b3e1be7bd2e168b23ab66d4773388e4bc96e2d6dbe79c9e158c2f2f2551a87c3ec567dfbf75ffd140e873213c22649f786c3ac28e1a375aaa835b9e14823d65fa5ec8a99c1361c78855c5fa319754463c3514a8de8771b6f2ce43518ee67ae452c440dc7e35617f39fa76b69d270909ae5acff7b341cc7f1a0dd1235b4f47886a37417e3bf86954a489be1583ec2a678912bc35116d3ca73c1aa2c696438fe308d9cc4e2357463389a183ce5df2d8683ba71f78e616624ac6138f6ecca59727121620e0c072d294a78ffa897eebe701063c686a88bbc7018e3da460f532fb1bb0b4756ff992923e697362e1c5d7fcc93f7be46636a0b0799e2525a38525fd759c99d43ca2e0b47f95312f7f935699e60e178b635f658865ce128ca4fca356e9e5f4a2b1c447b56ed92982a1cff4bc69d89eb951352e1282fa6adc3f75338c8e1376227317f4192c2916f92770f226f326f148e7f23537594cd09e34181909fb94b72129f7050691d2ea16b2fad39e1207f550efb4a138e3e74749970549a5ad2675554beb58403cf1ef5e7426d2b489470a0d163629648a7e893241c4bd758588890707cb55eb6ed3a92f93bc2c1ac6baf8adb6d50231caae79dc8da90cc2dbb221c84daf914275cf60425c2b1c7102d316e4274951ed0211cab5e3c8f13f729472684e3fe1c732dbe969f86b8021a84a398c634c6cbf3d99345fa8302e16093745c9c8e2f1df26c04fdc14194d4f57237d1417d70dc5e939993ce5d98440eda8303a99852828ca676c7d5dea03c384c9e4378d49be4848ba94177705ca134e27f995fc55f81065c61c3461954078779dbac3f540cb9a03938feb46249ca5462454f8b2ec18c1a3468684171703c957fc22cdd7a83c3b4b354e3657fe93f31948e4c6d709037e77dc841a3daf21a1c55a59e104286f694431a1c451f798ff72915776c81cee0702cdee324db428ad317540607e7b59655e7fcc32a8dc1a1e5bcf85c626f416170b4c1249b27fb9414f405ce5baedbc59c8378d6a02e3892cd2914856cc58179c5f1303147b1e061c54112b5081ebcba6f5fc5414aa7f539545e47561507a94f3a89a7a93856cbd12e3e8f8ac390ef0ecffa1487af29f559e50fde6153186396367ababc14a7872439290e35854f927156ecdc1ec55145ee49e61679515b14c7195fabbafe0dc5b178cea1133edb670f8aa3cc61c27ecf84cb8b3f71a895c3b625eb89a3fa091eaceec471588909dd29e4c46c3971b8aa511ef29c9bf83e59c40c164d1c675cfba47b04a9393371dc1dd396a984710d31711462d89b1c927bd810bcc4d1f4ed49bad9a8d8598346a2202d7190ba11b3b3ebacbbabc45192928db7d652e228996765f20911cf4de23885cf1de34e2689a3b89a1f257b2412c7eef1cc73676d7fbd20716876a641b355fbfb8f3814f14e1e728e388c1a63d6bec8092151238e23e25c7e47db2d67c4417a2aafccf6e5220ea67268740723868dd6c2c651009c908a3814c91ad2e27cc42093441c8f58120d9b2a8838f68a5039b9cd93b01fc24cbbb4693d2d0d711847bf3556f614e260a72d667c48d3543f210e32c55bd366ca208e62caa9e277f3a49c9f208e73e898d6c2722ea5c9d808c441c8f12f8ec8a8fb7800715c39f3e906eb74159d3f1c952629f990704b713f1ce5e5988366e6f89b9b3e1c757ae47e8cc587434ffbfed153ce5692d9c371a69852b4222ad47e3d1c658e9ce1117f1e8ece432732b63c6ab8e0e13847e9cd31859131b5dce1306d885b9892d9d8dbe1a037f9e48b1626fb5e873bab054bb3ec7bc942d2e178ff7c33addc687e73387ef1b1344d7bd137391ca75e566d974df7c7e138bcbbd7e654c3e120dbcdbf4acd6f38eecb6f1aa9b91b0e23cb3d4dcaa83897361c87a50b53be5997261b8e720c7a7695339c05d7703813f436539a2889ac1a0e5b72c6c5fca0f2694dc3d1278d6d9a753c6a8386e3b394e356ceaeafff190e2d44cc9598607d739ac1ca29677e0ecdd4b30cc7a5f79fe71af3f94c86a3d99054e4dd1bc361f0098b12632786c38fdf17e97254b9c4c270281b1a445e04c351aaa55235afbe706cea2e79e1282aa7dc5d4e170e54e27a085b1dd3ce5c381ccfd3c1566d5345c9168e523b9cc6709ef2b5160e6a67425fd768d6a4c9c2410861ed73aee837f60779ca963674e0411ca46fe4741295124346cbc08238c889c12da359782a096381037160c13aa74f3a413554700a0c88e3cfaa4f217cb2a6e6fe70b89b2d9a22499867ec87a35c3124eb3067317e8c7d38bc9c3657f6f28c0ccc87c3499eef3d1ca6a4964ef64ba411f570d09a72a4b86d8d132133701e8ea3c7d01fc55d3c1c49cb9daee9e9a68d7738ccccc162ce4f7d720bedd07fc86925fad5e1a8fa642d9cab5a603a1cdb490c7f395caf5d6c780e47966da761a7bd23d51d60391c494f4a5ec796bacc81f15b345610380e8751d36bfa1cba21697fc3b720c1310fc3868cc401c3e1404312bbfcf5d10af10dc7a2317fd22786244fda9051846e389ecfd2ab4891184a339ea80d8715324d77cde8664306b3e16853c357a5ec184a6f080350035ec3c17dfc143385cb71154181d570781a62abf53d43328b17380d0711a3d9cc52f6f8b6a3c1d8c966543ae61c704516b7053ec3719beeaaa97d9c5a280536c391e710f2e5eac8973bbd321c57b2bc105f8b25980c87635653a22229e5a8665cc090113c8683b468b38dce22102c86a38c0a79c4e2c68ea192070ec3b1e6a4f15c25e5d8d163301cf6695d8b9ac706fec2e1da85fc1fb6f7c271b68af99d81bb7098f2928f567df898825c38082ba1da629ba5144f15780b8721572ea95e885181b570f81b77ea46a3c24afe099c85a324bd12c1a5af620e3b81b170942dc464d9d1a3a6de5ce1a064f734ac5d484590ad70d46ee9c2594fb80a8731d46454dd9b0a073934c56b497f0a4731a4b81df5aa62c36260291cfe448d991c9764e78fc2715790b19c1742e1b0d43ab53f2ee027900b18b0130e3ed2f55e85d54aa8fa056ec2514a356bde673d611966c2614d4e9725d4bf015ec281e4de182fe75725752c60251c7dd6fa8fb7dfb0410210940e3809d6b8d6d95c38632821e150d2fd32a46039c261ba64902f138f291934da08c753d2329abcba82594c5c84a39ccbbd5afd3f466c2360221ca6c915beeafc24b564084723d5a9e9a9fed966ba010be160e28e65ececb312d68cc71970108e3bf3dc4e7cab4e3b918006108ed2e69c4f1af00f0ee5b43767bdcacaec7e802a07ec83c364132ec6d80df161cce8c1b19975ff4afe6eafc72863c03c38d80d57f1ffcd199b0505b680c009600fbc83a35d8d91d4e32d77575acc9811012d66cc8840b10e8e35d98d56d80ecf66cca0515463c68df6190dd062c68c084880737034defee51529ab75a7148c8383b839df5ecb876e70d4e7297c4a316e05dbe078ae2d863e0dc650225c83e395eb8eda3dfe1e2ea2601a1c2591183725eb6238096e181b3666c8c8e28a2caeb811e303322670451657dc38a60110d862868c2d2c300a9ec1816e8c67e4a49acd647090828e448d3df3559d181cdf4f27fbf00c0c0e6e9297c7bc7c61f2f10b0e54432449a60cbbe0386a5eba4e69d73de50c605b71941b93ea4c8e716d4c561ce6cc901136aae766dab0ab38845ed134219aaa38eabc2fa6e2b82d6ba5d14b3bcf13541cca97797948977456ed29d4ff8bf7764d714ebafa9ea516f952f8f613bb51f3475d521cc709976779f2d26e7c1447f216c765c355445e524571942a47f0a895c3a5a5594371a4111d963a280ee43a69fecc3eadfc7ee2c863160f96bc5c4f1ce54b12fb1bf14e1c6c8a4daee635278eef62b01695fc75b169613771102b334f0c16c4bf4f4d1cc564b1d3c6aa3613c7fd7ba2399d8ee5901413c73904cd295afc86b58d5ee2f8a3fe5b36afbcb38f250e3db54a168f2fd953a7128732399ed4066993eb50e25033aee4b5949bbb339338f09ddc7b377d21b74ba2f0c123bcfe868dc4c1fa4ba5245a1bbc72481cc7f43bd1f63e42dae51147c1feaec2cecfa590e28863fd0b1f9e36dd8863b98c1727438b67be1971fc2b99a61366dd3f5dc4c19e04cd5071e93b061571e8f12a31ad8689383295f2bb31cbfa0a228e4c73feb6548f396f87388e1a327494748638ead175919554218eab32a3d34a2dc412e220a568161b833b884317ab0ab13f0970e142108757717c7372963c3967037114236459ed5fcb16fe02e2a03c4f278db07f38be162d4f3f9a3ca63e08eb87e3b90cd79e52b37d388c5d55fbb4103e1c4cac8babe79d9c452fabb07b38cc13d175f766b59fd7c3c15a6adb946e6adb2b0f8715931df23efa8487f1701c426c6f844caa99eb0e8715baa629550709b7dbe128a6476d9990db3a1c863cb9313f8bd981a5c391e44ff6089b9aa11d05760e47fa312da3725e8f1726d58095c3f155d9a7c8fded61e370d46d312979d724bd1d0f0b8763ff6029c9ffeda5c9ec1b0ed7c55e2378a4e0b06e3898f85e64528bb961db707cf16316550f29589c8b0d072d1672536b58b73cd77030112e59d9b5644b8b8d193466d4a0b133560d47e7979fe3a7d234ab184a30b260b06938fcce9b11275bb013058b86c3a06f61e62b5ab24e63289dc0a009f60c477f9e33568a7873925b331cbf976665b2b9fbd0c4507218317c0b12b41646822dc3c159e9e68e2945ccf66e2c190e36fda79e7408cd11ed188e5270d9dca4ded082047dccaf180e2db6c905cb4b188ed3844969238aa530a60272c17098d29aa31b61743e77e1c2858bdd2f1cb88a98d4c654ebe652582f1c863ecdac8e09dd1fb60b879e2c4d4e62442f9fefb05c38869c4b11d2cd5b388abe29ee8dff07cbd015594c400b4751825cde0d95524c994d396c160e2e4d2d6a8c1353ca546a582c1cdec76d79182bc1b05738cc99c359d7fac488360b172e5cb8b04128bbb05638c8b27bb75ac91e2aa9c2e144e85b78f68749582a1cecdb7aacd338fd741a2261a77094ac62e6cdc3c4202a4ae1288bdfc7fded6c148ea6c3e71862e44a21a740e150472fc4729dec130e223da69373cf99a4ae138e4572eaf031429a70dcf513e442ee5ff014261ca73cb9356630150b212bec128e3b75a6c8a75696752be138c43dc9592b9a4938886e51364c5b241c25ab9338f94c2e134382870163abec110ec278bca6ae748d709411f662c66c0ca5cdc016e1202f7ec5e8b72f118e3684e49d9fb5085f0a8ca971ae023b84a30a15ad9b2bc7dc6819356e340d5383e9a6b04238d28dd31a45625ab549100e37524c69da413fd5273ac202e140525b909fffabc8f607471e13347f35b7e2b6eb83233d4b97c25fd2427e0b1918801f6c0f8eccd333ea7c24ba5f60d4f2e0a83d486fc414c4c2c73dd81d1ccc7984a822d9d3b41a43e9d902ab83a348d112f621276287981aa76cb03938b6d4899343fcfccc84c5c1d15b99ace6847a0ad90d0e34e98f7aa84dd51f5c1b1c695d88aa29668a4bd9adc1e11673e05c26e4e7cc7539747fdea77b1c4abef197e386a9c081641f62acc8a6d937ec31c55f4f6a7fb91b12bd9cf972545348de8663f869c9ab5ae46ce8223dbfa349c665ca1a72f54d2b12316ae025ccfbe6b6fed340b5968494be437a8e067c43a463fe77cb194ec173acba98e1f1931cbb824519f66429841b8995b682051996b7b6900817a93286ce745c47eedeb36f319c337be29e627d6311863ca750f31e63c51b0b3014197e32631a8b2f142a76a41ce6156b2cbcd0866899ec215777a10a2952b7d5c2d45c28def587cd16ba94438f6a7c305d0b7ed46dcf59f163ce426e954565735ec60216a9f46d7ccbe52b90a3c77b90a42b5bc190735c85456d5d55a3ab4c8527fc66c953404fb3e874892c055da562c425538fa350ad6c75750753cd620105f3870931e3aeee8bc513ae1067247ffc282f164eb0bcdffdcc57d6c5a209ea65d6d47befb02d138ed58b389d10c92ee148d3442b75cf2af4aa848375665e97bc6b12ecfee0ad1b9a55c5020974b2dfac8dd3a6627184d563bd771093b6a06261843af945922091f5cf22a0f3b61d31794984d4f3c5c69e9fca108a1b73cc3bb1100271ebf3538a9587138b209c2c3b3d7e4fce40388a087e917a2d24dc8481c50f940c6faa315258d307fe75e9896b68e5983df0ea4352728fe0f1a0ac2c261d2aa54f6d07f87f52b128b1d0c1b12942aaf9644428b1c841121e2d4eac7d2606b1c00112d75177bfc1133ad48ee96e83dbb3a60b625183c43ca694f9d36fc48206974d48d71d36de88c50cc890ae3446cef722163260ec73bb5cdcc82216312063968dd34b7e221630d8d3a7d614d14dc4e205ab87452689412388850bca39f43648d0ec5c2bdcea4cc1534b6758418aaa12df60d1975f456a19e5c77d552065962fc63c1ebf54d493e36f6b45df0f15d85e05eb881ee33bc515fd2c7af9ba670a2de5ccb8977edc2b4513731e537f4bf1c12345111a9286bc457f1484d99b7adc44a144091fd2b650587192048fd9601b2888d19995939c507ea2f5c8f9b2ef8ae8093fbaaa04adac135c69d0491927ce61617365d4e7c93641ac0f9641629ad843578d88ab6f4e26b0ba528b2185643071ccc962f0eb12e69686a94c312b96b0aff422ae04f961796e7b3c45941284b6b89273129e87f50b4a821eb7cd90f5aac248582b255d99cf3d76903894566ef508333b68e5a41cd189947d657a7c1ad16ed6885f1fa286117f0879fbd222d8187d7afadbb72545bcf13cb244f41c514a84af95c7735b270911ce555ed85b0ce910873af3118c1786287ec7896051213aeb6831be37a40d2108d162f6c4904194622efac67faff4441025b5943a2ba5b60361ae9ce13adc46fe1a10ca678a3067de71d93f14f21352c26c84c40fd7e67e96befb481fd0241137c2076f3b23a72e9db853f760fb5b88f1d048f93b3d10358b5e0a3b9b837920798eecea0af1623c1c46565282e5fa0e4fce9239a74245a34560287861878378b3a517bc52084fd1684207785187c31072d7f78c4ccb7db69821c3460d730b784187e3eaaf9ecea942bdf27338ba90a9e79ac3ebc31772386e643d71388cc1dccbb6f2e2260f8783ef4d3141a6630eb7bf01dd896ff1a5d26e38b4e897e262dd6d38d44e795519343ccf2d361c8b6fc80b8dcd1a0ebfc3b65b2595bbae1778a186e397f8e126b336beb2031c05dc7023bc48c3a1f78660edef9af242d070909a52d8850d899c9620bc38c3a16a766aacff0c841766380af55ea16e3dc67a7a072fca70b821eca9f78af4cc47072fc870d49f2d3f82794f78318663fdb574d3b23126bc10c3b1e5c695581586e1e8edcb5eae05c381e879ccb7bd1a4b275f38f08f8bdd2172bc70986772e48af497f0a20b073964ada8dee92eb7c681175c38dad3919ebcd924449fc08b2d1c74d4ccc94d3e5f7d7c86160ee3b768183464dcd862c10b2d68e6bf13771a326ec0b04143c60d2d5e64e168ece46fb44f43bcc0c241cac98b0e19f2468f04f1e20a879fd3de7346fc89926285638951634a4c92db60e31f5e54e1e03d6b75480cfa92a91e5e50e1f873a856846dbddcae0c075c1e5e4ce120c7b4bedaaf2dee922d6468f16d0c606a44a0eaf0420a4731860f9e2c3b74781185a35f4f29477f18871750384af267a1ded30549fb094717179113d3a9c8b7eb86174e683cc56848959c36bc68c29ab366058f2c79c18403d9afd99c6a6ae1c5128e763fca9446fa789c6a78a184430ba9b6b229621ec642c38b241c6ba46ce9fb5b35556791c5195e20e12849baffe61ed5fef3c616321c9084174738ee6fdf9ce36b85e5f48a0a34e00a231c69b0ba972835bd494432bc2802de195187e105119a68af10537b783184c3ad9c52089646438810211ca6f07483e145108e52d8c89ce1962fbc00c251a449cf8ac60feff307db4ed6fabb7778e183e318feb39d2dfd446fdac28b1e1c567d6ce5f79431bce0c18155caa396773c5a972f767028bffdf16f597272648b192a85173a38b2c9beb77c9262a5a808cc8d1c1c5c6e7896c41cfbae330a2f70701cafd12a39a4d29567e3c671c28b1b1ca7fa681f2aeb7db585bdf0c20687a33936e7f0bdb58e5ed4e028925a84b70f2f9fdc173430dd256dfa0edecda0e0a5397219d01f27897496cac7a0cf2db376e97056c3a0ce5015ed1790a2da1251adf11a51169233ab4f26c10b171cac7987bfc6f1c96c2b0e73c5bc98cdf4f34c0e2b0e25a7c97b49559d9d5ec56186fca52a8e42907c9e39554b98744ce0541c8af4c46f57dba97a5171906257ccd127a993a536506018708a43cd6fb6d1faf35f19531ce60893ae5daff6ca538aa36421a7ddcf1be634a4388ef2e8914376f091cc280e5b3d475f44b4b29417c5d1fdc618695a0ec5a14c6848c1ba05c5a1e618c752594e921c7ee2302fa6abd1b4278e2dff66c9711659ee0177e268fe4c745c629c38ca95fc472b769b308ef4c944dbe80b581307b9b38d498ad0671ecf042e55a3bd9bd161e2e867b6728833bbb356087c89e3f4d8b3a9e2d2225b6c89c3f87ff9e95e72258efd35b34f8a4844e698124731745ca8f4bb2da1e1491c55870f7f992eedbd52a3c6e1c2450d96c4c1ce5486fd54acb8319138ec984e119533248ed344dd02a0a0460552c08f38e8b997fd0e9b1a338e5050e3c61647151676c461ee4a111792c28d60461c8877a60bf927319408d6b8418317413901560461033811071772649a10d2b44ac388388e636dd9d7423ec481dda96ae6fa96a9cb1087d2f93dc56c7366cca84183868d2dc46146afbcf6e5965284afc86211c18438b2380db1dd8d2da8b4f0a60269241008c471200682148dc907b313080000242e8f0623e1581c6782ac071400034f20224038381a262418121e100989a2301808080905c240200c068402c16038301ae34b9c1ffec7767fb8287e30f7b2870d858f1f7fc19c01db27f3d194395d1e881f2b07f0bb5b210fe7c2a667deeb7813827e2e2cafcf4a84a5da1b536150e4a7c166518b78f7c5e37f7ffab2762a039bbfe08f856a7fb0fc7b9ae1ec0bbee00d1e7b013caa71c83f1b3c1ee66f914ec7d50dca5de81f3fce4a48bcd33c6110cbac4f5ef7189b4ceee2ba4667bb8f04c48633af0cddfb0c5670ae8db4beebcee2ad0c3a0c995dceee3edb59135d0e5005be084dfd0527aa6d542ab4f7e8a9a8b604297be3a06aa70043da895a56cf9cbcceb87520630b42f836fcbdd923751b02388e316de2a7c62ba2731bfc0227b080d4ef56dc899419f61e0ea2f2865bbf29d7dbe9c4cad84a68a0c8b2bfc901e5a4869f5fb033e39976d551864832074b6bb3a83db12087a07e0d7d53c51acf1bf97d6f653ab103470805bcff0789356ea5c6ffeeb2ef9cc4ba389588a4365cd93e307f46caeb95e2d1ec72e5e085d4e65cb72b37a20f7d3c3a9efba9603946d35fc5eef83444161d5cc4c789f8e0a13fb3e14653308afce15bc4e76920d7bcdfb2a7be3216c1da38319becf041d1b213549299861df6c17674226427a8afeb1499e20b3e113a0e6f9e4aa9f784b63cfa541e556c69ac8f61aae02dbfb7a18479cb88e77f2a580e1aba801ce290fb4aaf9ba0ebf12ca031076c97eb0a05bd5dade4bbb56115f51efa2412e31661ef33f3f5c8ab00e10a52f9d9695c0d6ad0c92cdce8e652fe065ac71dba1a373469d71558174e3819777f00052f80b2e7454d219e6ec6dbd679eb8d1368a323f34150bf284d9c48656a26a557c95646e4dedb387cee5b9741364918e79ed39b203ccedb51f3a09b1950be793f65953facb343caef789b97481fe4ef17989461184008a2fee93ffff9658126fe3846a75ffe49341af579ab70943fbd371b3912ee562999d2f6c355482dd53759dc1d4629bc27ebb9c82bf46589146e8d3b846e0728cc106a5badc572a97178cf70b7529561bf9db05ab5cfb1ad47ae40af7799c01d2be2e560b8850635d0c43eb947172a2334060816da5b3dc10ff73a1ba79cb9e61b2224d568a4be60c54391549cf88cc7d1910bfa83d44d604494740e86fad93baf6eec356523124ff756d1fdeca761b40e3586eac056b7fe11924f743d101aa978896d6a0422991981791f715311be20a1fcb46dfb447c8479ae79ec65cb40458a84364a362adc14746c260193d39a22a671457e06d9159d407ef7c8e67a7cc081b74a7ca0ec7687948d5f1be06f662b0ad64df3eccdec8a5e388bda80d8d4eb24e20e0b1b1d6c93b60bfbf55a568be53ae08bf3727251b5c5e0d0384be27938cc3d3468983008a3bc24720215c64bb1050b365849a0fde06764b0c016cdc4e6e9161d219c79e50a615c1b74df4e060dcb78a6722d568085a125a860ed19508a0543017392d621610039423e690f4dbf784c4a714b7d467dd39c635479b5fddd1e92c62d98463a305332b1b2fdd765b649ed5d80f5683f660090643b85f3fc29260acfd60727a128989b0af6381989463856b9139cb98896aefa161904013acc201183c359384515ada06bccc2d3c0724134370828d9034eaf69d85f2509d71a660b752068971ac21adbf0ab0cd6c70d5f26df08a2da6eaa224d8a32137d9780a036e589a342e94eabeb095a65d84117251d99756bf22883c587b7fa8956a1c1e568a618506f5d6ce23b3f6a4525731b5013a1e611b24980586b9795beeb41f9fa730ce380669ed25c2744d39a51fd7e42254fe635d0382a769de068aa457b9078713b223eb73d9d7062a8f9b957faea8097526f4d254eb181ddced5b6b764d1d3049de537370783f225ada83f93346969a9eff87a3abebf70569c52e27e4772127c22bdd731f85fd89cb3d26917bda5a41813706958707bacef4280615bc5071e8460676366eadaedab6e7c82ef08d7dc0695721e5b54018ae2dfb85b1790be0f24961cf92851ce5c5aeeb3c3028abfb1d64ec93d1b171161ed14d87b29cc6cac4c1c046226279fa571ae9efa99d657b9d2a52e16522383fe643b41c42b2eb8d61c62672f2750352da0e41b559172967a1ffa070a33a67ee441f742a1f7208d39df38866a2b032c57665653c3e2e20f5b24d41d9094eda4269bd1d50d2aa2be48434bb55214bf77c17675c61f8b4bcb4ebc218511261ed878168720ad48bcc332c3ebf5be4ea8f869d17397a08d5091fa91947dd024f517be5de99172d8a23986e1021c8f8182df5ba745923aea7f7fbb70487156c863484428fbd05447c623d50429fb1903db508dffd37c595168afb9d359ce0b845c52fb8ebb2a0fa30ba2d03e03481ef99dc2243caed8a902427874d3f022b4abfbbc5362132a14af3c7cc08164d8e4b0bc101e69d0c667dc9b12b37878baa329eab44aa5b94ab41b1dae6b39d8e9e2cb3f49893f0d3e16e5ebde8c86a9d244d0393c3ea015c1fea8c855e737be341c42020a493edd82c56381654ebd5498194eaac8c5d7b8021a7fbe18747da7c6b5e9227c8b9b85635dca6ffa1f45c7a9a19825114ddab42858ac2d90f96aa38ea592e017ad76cb7d48c514ff12376c8e3dd1d7128f4cf1688da84957d5e5176eef7a540c34f4a19a09c912ade99c0d4c362f9084ff51eed8b0a859dde5966a92dee3aebb46ce3bd9562fbde5e43e84f65848af3077297cd367ef798ac8500eff1a8849a374b23c027f0b4a06d5281114412c1e63a36f28421b75ddf00bb06e5a62368c7bd96e0b8082af7c589f5e08dbfd9afa9bcd5b36727cc9d23cfdf70a8d0b81d5ffce73de628ef725cf03a0dbd23549e4e4544c508dafbae2b02eb5ef2029e6a6206d515096faa659dad0884143435f68825ce057e26eb25af5aab2cf0ca0f986ca7ee57e8873d6a34b39e706c7598fd8ab24c51bd996c543054db29ce3625f1a6b12745a222b95f6812cc4598c43cf9b5221cd01cbf183269dfca19f7d7a30d559c87ed6db21f8a8310d9673e1a906e8e8529dbd9ababa0754abb235304b1227c2f19891ce71c214d0d589233cf25cb62e5a2528e93b0264fc76869052047845974bb5cfd9511b12b88cb81b1455066884bb1e870888ec54d43bd41ebfb0cb69b340f7007c988afb2db84d8c081ec8a87cdfdff2610c7ba4d706e2d6a5b1ad3e0533d946e3c8aa63d6466a29b4009a10bb7d7903690297ff6b02431ee9b0615b55854bb1c2bbaea3b464544dc3ef74f133ff6a7eb2816cf47fb3cafca10e7f26596bdc8389ba9f1ec62e038539bbd081640e6e6656ae80bde4496ef3fab575e8d4a95f23919635393dd2000758f9dadbbec0f601303902cafd67c320e62af37c8d642c8fe781c8f6e64020bf3f1df98d4deeb91ff9e5d913a34f96619e8e94d77051cde23a12ed292da50031ac1efb74066a07b68bc7a6a52b9d5c702b57b232cfc6fdd04b274004f251e2ba67f54a18457a6f042496f12adcc8572631a688125bab1d905be8b375b4cd514752043a13fb19ad8e637e4e97dc01366ea81e07c883bc81f44a5b3cd9557da75db1f773e4921c5daaadaa5aa6d012cfabc67804664ec054d5196bb8ee5d0f070d3eb6bb9a7e4351581b6e3bfdfced89b00d52fb0b9e2c41643915120f42fbeb8087e212999af4e71205ef437e7774b27ec494ad770f233d96b22fdeff008b6eedd3ec6f5875d0e4c3edee3e63638584e9851ede0522f72fd2fe5c0130c2049050c4a752e7a68a3226fe9ed2efea81898d4cacb481fcf95253a60eb2deb07424a9363e8b8d609b89d8cc800469d22d8f58d4b33511f5630d49c84df0cbede9047eca920829edb0a5cbc67c55d03aaeb4af8b94e8f9f604b557e4e4a30987f5dd93eefc9b0d8047751bcafae9cbe79015a29af2ee624fe6f44a18a7af28b5c77421149d381e95617fb79c2f8e09ecf2ed7e93ca0db1c1c7f53fceb75ce23cb549c4f484298cacf4e67541dd5ea074f2cd3cbfd666f0a5241bb84f0ec5a155dadf5b11c6d56a6664b12d074e74619cdb453bd249c69009c550af645b567de4517febe9c2817eb5135520b4fa15e25092a22e8ea5d4918e993647c1f2882d1418816895d11f750dcbc905044cd843a207dc926aa54c77d967b6efe1ec67f248ab2b8f16ce41b1ae06f6c4e41c01fdb89f968203437dc276b2fa838a53a15aa8df39956b99b35a3211322cbccd2419f7707ff30444dc8e9ba5321aab9d7e1d3593d051dbb615e86107eb942706daee8cb8ae1905e491b584a70e93315e9a7841cd9c8d66140595816387739d56fee0c903d571c65a9e211724a8c32eb3150209dfc7c06cf9c92a41435cad15c0afaa0b59019212275d6dcf16d3973a952612b80fa137cadcf449b0b527c69a0d7d4100301792e308b31a2ba5b52d96c169aaf15d5ce1194ac28a8cc2f0d22753f18a81a4157ed38dda063d81c9e591d8e410cc9f73a71b7157437829146bbbcbce985c1a50dca39d3ac42e0036e4765bf72216086745802e1a26cfbfc2367d9cdd52bee3cba4f00f09b38c01dfdb97e016744033ab61852e68dc688185a02b7ba7265ceffdb55da55c57a73161aef7a54c69a37b2fecac5631b3ba299238603b11aa88e6483057f2b48467fc86f72203445c41339dc24bdc9480cedd19e8f6177c92886e06778b821c55a745b7f99b7949482422322ecd001eb171318c4e844d98a863a6c9ed50a72a0052e1240bb46dc0c95c077edea3314b5dc1eb2253a5963062142726345319c450d28cfe130272bd1a235af678c77bdc9e0d7c41dd7e4fe1f76ec79ee030402e085409dec9c7223629b911204fe11fafcfc04199e43e40dd27a250fc6244fccacce8ad4b5c56dc11fbf38aa1b06cfedcf5043db284004580e5a4dc90866e88ba48be1d8db734e46f2571eefc7fa3027aa9e8f69483a79ea35dadaa2675f5bbca45c2dd7f099d63eb6a0789d8719e76527e207b01b7fd09b4c0dff7fed54f0a76708f4d879b0658add766a9fb98d2973050aea9f4abf53a55fe007c41204e2d662e2b453846cfdeb27c93d23267bd684a604370a6a8057e54dda256cb4478245e5d4c3ddaf5b13d2b95b80d21ed171e11b327119f26ffcd528b24c2a9ff9107acecf3cf30ff00934cb3cfe7cc3b7e755fba04afc1deb372257865241815256d1882859d32b42d512082eae1da8b2899118c083edc575f314c2e9d685a0fc11339fd2cbee6a984cfde0341cdecfd423966d4d239eae0b7c5b0ad7cd2f947a574ce4f8bb3088d00a12f48c62f028c69a2cd48097bb6274e4cd684fdc23ba88a07fdf91cc1fddee8b84970fc3e79bc91452524146d5da1e1d5d8ab48c5fc0e0f63385f5e2e25616841789a17a71402c2ac6b00ed728502181625f0d503334406f9edc3b4d928bd0bc64f9dd6c7470b3fecce4c48f895140ff182364ed9642e9b30ba29f9b01aaf630a03c2189f9ddacc4ec00c33d72c9af6fb4793da641e064ed2d82a9d297dd410abe0d03a746195f28d0596323f3776cb867154b89a0b1dfd727c370c7d0130885a66202865081b8f363be39a2298cc418d7b6cce143892f0f8cd36476da9420df794e1f1d1923d63464828ce05eea7a27faabd957ff2562e21532c32aa9244e3f936951d2f3beb7aa57f10f56938b1a29e0aef37ad53c25e998f838d0763859b6f7598a4829d59740b80327c676d43e649445e588c8fd0f6ebfe9bdeeab04324ffdf7424c8c72cfb25d92bd066e61a0dee4392de838924991858b7cca09fc152bf43cd6d15231079a6935bb78e001556ab84588be0645388148f0ad38b3938e56702c4e818321e775c68961775faaa67c724726b1e460a66a4b49ab13e46e831665593d042cd79c908572f39af36f1b5a5af7ca7cda6f5d332893ec80c24c81f1b2df29c650e0b9a7197f1c3cff8369204f5d68fd16ac66fc6878891923409e54b948d767c7cf747af2f4e33d14b327a995642994a317a71d0e189ecb8e24386d6cd737b0e250a1ca83b0299423eb3a575c0443e607a807d2ef725057a4e5e67145ffde164ad70359c91143e49348071de2287a36019d415461390205b243bff731d95e3f4b8b02c94a6eebba46b56b66ab57400960e4ca6f9dba05ad9d84d0e08a2f3b9c882109c5ad82611bb9e556e90199ab44440d6309006636e74a74b38a5a37904ff68abfc3b20c3c1d9466094244ac24c484569ea327218cddaf1ffe14be6c370c305c01f85ebb9aaa05c9df50c29d5ae014089bec7c531061f40d523b9525c804b2ac538ac29db2f411295d696ff9641a19d3cb65ccb5dd3401295a94c1a4cf4e8c6a1b41b87b23b2f70ba6653671ad73d99277e60c8d0d843a16f5897d14872268d1a821ffd665aa4ce72f59e85bf9c474c9a3a5136f53bc2c006a7fb0e5032e1b5cb5f4ca2ad3cf86bec382599b6c55e84a07b032f0ff7d00895a165132f9bb136bfeef277c571b56b8d3c4a5eaa1443aa68e4f335c88f8be944c3c58cd9887f36a82ad4dd3612877684c86b1399765b5cc6c7f85624f2aec313519b822f51a31137da50175bbf510a2b133ea935ef18da95f411c995f5f64241ed42eac36b4a309509d560a2a5dacaea933f03a18fdd45adcf6f7941d13b367b93b4f5fdf8fb04979232a7e96d5514123ccd091c02b2cd6f4a05eb3c2701f0e52d85ffbcc04fee7488196a6ca7f78c54e5d41c019462f3ab0cb8b03dad2491ec48fd5d87c6af89c7a7c1b5476172ab805fce40b3c5b4bf6ff17411d1c6000bf956f61e459ed7682aef4d7cdc521004f977b1b17a735bd61e6caa700d9163905343fe309155f61d83efe50e449dd8365562885c946b6b762a494fecf39f5326246cf35393b1df561e2871644c214319e92dfddc551122bc0f509c4593d745089962335b96f7585176968804937bd0017c474d86795197552ebedc2a4cbdae95d725c49aab69c028d6866f1082e27ace3b2a0255c81e2c392ef331685d94f322ed80c526e9935d71a148016dfd6b4babf60fb6fa60244ee135ddce4c00b00935bb2b7098a60323ccea2f6c4ca5ef1c81bd131ce80474a50a11ac8051f23b5751a6fde39155c043229e3a103f2a7a324fda8ba56a090b998bc5d0305c8985f70015e8498001dc90405d843875576074026fb0a0ccbcc42a2ccac60ba59fdfae2862b719f56852e544c8e64e4498061adf742573a424423c4b4238307a3260857cf7a9076fd0240c85d5c0599756bb6278b0000c3c4b2e6707c6f258a1262da6edf29a89187d4300c2b08d1329292cab517e46b19dfcfbd5ed81508ffbb71c685d71bbb02c2757075d18a9029d591a913ddd8e440e19f4621b28599687efa9244ac901370c64ef2b4fda02e55193018b47404e0f2ef0ed8853ab24d564ae3416a0f2e4a9cd0447393b31814fb634c82deff65049609296f32230e72915e4f0b932ee2123e10ce0fc3e8e6949677e8124c2d9947cb4ea41fad0f8d41edab376a5894f8eb6472aa1e9ccd30ca0fb59b00803cc503a267c2a64c4602b2fe0b3563c9486e0458bd298ea5b5494bdd50c3d8358fc83ccd2fd9003f5ec38640373a7acab27577d2e411f91f2d9ac0d90abb88a21b31d5a6ee185c26a72004a15581d820eb7f92963ac19f71093aade36a5472feebc69f30b731805988c1c31bd8f0ffe3e6638e4fc6894b9d840652ef85cce1de99c2949c780d674bd92ca8354302fdb801629e0b8a69d9eba43263cb5a435449ee73c79786267a4f0090d64a98f4481321f49f5cae011e39fc2d78b4db88669ead840b318a17199dc12cc5cb0d4bc9a8f5a27cadf2abab6904eb9bf7f09d6b256a17d5c011a0460c62070be5d3520bd2125b76d2cc63e96edf22a3d10ce0e154648464a3d060f581aa79106af04910243b875292cec204eb09011657cf7b1a314da940c04283e3e88b9e8e0bb1558df0d424a39f595d821f6074963be370c4170a04ad65c49c8b6104141acef52033ecb2a14204f86f18b38af955a05e989aeb509206a03d45e29dcbbeae631048664d70fa595f9b803de45c10a5c69d0821f544654d06a4442d21c02d3214abd24e4548a4cd399cd3fff4a938b009cc7d39847dd201d89becd8998de6f93ee427ef8a37348f180456df410acb9f61ab865238e2d39b18bf9a4f3a9f444355b99c5452b8ded366ddf7d1b41da64f20b8b5ccd687af7fcbea07b754e8604aa04e88965c9d17a210dde428089f1002e29e62374b94388d35267e77b04ba4b0c11758dbb1b6fea3a4816f991266fde8e1c282367c9a7bd09d0b761bc159fbb578aa29395290fee165fea30992c93af248368764a591c36a01d93d47be969ed82d9a3be1f7ca22e904726d0d2c6ce9d37738a5a2d0c8e0c78643ae201c417c56dea6af9b235726a1b214f66e949056d82d5594853b526fc2bd8043b117cb0bd027cc894076853ceb0c63cc3f8130c795ab3f349aaa062a4ed7a3af392f93d20bda5ab47d5f0fdb9efa8de8f77a12e894f98efd4ba3e2b166c44d1a58e842ffb71fc85929c8416174f042c31172dbea75a9f4c798042c464c88cd40d49bce477f98087e1a548418dfb1104534966e94806cfda37edad0ea93895dcf3a5f2ef08b755d78ecadcb7284952677a2c9cc3af156ce7eedc4a5eee8e58ddcb731e14e0a240c5a400996e343b4f3a9dc388153c3cfdcb17f677a0b83e2a33e64580f140c90e33d032e5f73e4dc520e888a9dc0d20f1fc64d4c1040b2cee0d27eb4a3ca643b73e3cb67d2a74d6784ca9890bb2327189d38de061967df6bebb5462092139602225d586d44718cf78547028ad786ee647af550139fc190b83f014a3dadf73085631a23a53aa1e433563bdb9305b340fb65ad3977c826f02fb0f31959f0c8959463b65f913d369356e3c75a8a627abf246a26fe90ddcf4712a06510acfae44d678d94f97ab24e44a54aab3b4937bd5bd2ee907d297fb70c1c07507d71fae847525a6a669a2fc71599f2e26f43b85b4665cce7261932e266eb4cbc4792e03e93a1daf44ad3973466a2f7fe54a44996b8ee98a87e5441e2d97bd415a6445ae35c9c504ba8ead529142d5212e85b98e4d57e236db4a86082ec7ca9518e582c8bf5cdc8eeba12f9cb16db91c73ddc8751e57e28a720a0802ae2bef32c2feb07623ff7ae8bfa115b725273a726dc1c5870bb15d89a67218a33db948cd65ecaa0a855247960e69cd02055b14c313142078d0deb07ce0321acfac70a8e5f3776319a552375f19c239d9476e034347a97deb9d43820e99896616c6f9a6f7853911d1a04ccda5819fb64228a5b75bcf6fb4601f6d80102363ce0cc45e51966d03e65a3ecb562039d92acbf480d5619476ca5729ff3838a4248a6c6d48c6f4c206db8e503b3519e5a15344731dfc82c4bb1ea668b04ab1043ad9e2cf76e42584033b60928c21ec6090a458b32fe24b9caba04e65f35fc094762cdb42cd3d59e8750bdb8d28cb447e9757d628da10c42b65f113f79809d6c6e77278d39558a8e68de5f6ecb46c388998bc92be12db86fd3c03eec4c589ddef350d2b41280152cce0a545e90d21f56ca7e3f6f0af35f4ee9862910498827ac3dcd5c8126c974533afa2145421d3a601767ee1d90ae7831831b827117a3d7559482b6fee76b30d71a08aeeb0c4dd3a4cffeeaa0e3ba22d90f0889d07340bb940b7cec3085395d73840a407e47d8f0811c5fe057ca6b0e52179ca472a36b111f23ec7a72aab3dc4581962c615a992c242f434741378611e339753e8dcfa36a0a733b44ca80cac725a4c278bc46fe218978568a4b6a3151232b46fdf837b88c9e846e04e2a02b144e5e05909df77c2c65d218df5196c9e85f0fb0c4998b9f0eaa8e83ce1d5840d5e1245d8cc83e58c3e71a86fce1f626b308ac1693d58d6854303921c704300e683cd8809b5ff9f106628a85ed2b842e969b0e9a4c90ecf67b09c13c75ee552709383131136b0cee0226f6ca3af63f1af5b726c1609596a558f8d7f9598b7a55f1b3ee28ee48783f160263aa97b53793089099b4cd78724ed60d9875f85ad81530fbe6fc24c0b598fd90a1de1c1c6942698e89ed06988ae0c3fccaaf288e90f9f9a7738bfb2a9bb2f64e1da1213b9423dd3f708eb3e012da4a4ad3fd8f4a9f0bf94f04066f482acf2f453a08809b6bead07e0b5255e4f5b80d62f06cb07e068ccc0e8ec12669a7f00140b605600a802088f784ce32c80d300b008400b34014ac901f4358030e902b67100aa03714e57f6a08cfe471b805001285a80719acac19103605859584ea2035885cafd6fec006239b0ea01c604a004c056002f07105500732d80be23dadfd816b3ee04281d4fb200462f564d36e680165c9aa19897003603c0e0ff6bfaed0c607234df71fd00c0f828e92a476bbf0b08025aac0acd72fe005d98f6970e4cad065c8f502b2e3007c03d00bf01121d004302c1ccf400b460d9a90046029832408bad0158432f80ff07b438a4d1a79503c67700331d562363110330061a55abdfa80e13c4a5ed3fba4432419d81e78ad7ec38c171092820b081c03b0428f0d55adda710dacdce6bc7200891475cef0408c68120057f2140f408c29730ddec6d0d253f06339da2ffc7222cbbcdcee2d3dd0be3f5d90d869e365365aa7e788451890314018a0c9e1a05b03fd9d7bf3e821a070cffebfb333ba2a9b79c06fda704841ae3764289ce193b4431527234840d3bd11a09cc5a436d55b3e8c567c71afe1ef3c397fef324f77c8282120ab8c5d26c6374d93e766c9425880cdc2d7ef30bb056c1294a8e1e76247692601e0e786c42c6aa8b21eaebe4636195a0ada6ea46c223c908d9b34d9ed6ab6bef76d635d20592d3ca2cbc5d5ddc193719f9912f3b2a9a73af0e1e64a107119eeb0c7f0c551c4192a598b7479f85aa314cf9d92f84e803f6d9eec78d64cd6f62a61c61fafa1e25730820ef2d2e3d26122e360f29d0a140bb29cf4fbbe9a3bb0e47d29625656242914e2f4d2c1d968f7192e9710efc9cf648e5c96fe89568aa5e1b97f50c7778a00e89d9b76962a216f588c88fac0c8c4667550e7cba718d7449bec60844d5a7debcd5c61f50394c688a8295aa5dde317421ecf24e5d26fabf22a45a894ab5420e88473d62afed76d1bc8c7f3437c7474f945db526625ce67ab343b29a4af7a0aa0e6f4c5b194ad47ea6110beaa5f3889520434e5c032cd5d65bcc3f842072b80e9697340797aaab61934a169447bf51147750df3929be94a8922a016b7f35a62960ae599b3658e2ee3c103fd85d71c0b0db06530258fb7ce5d048806e81595ce219f3f0216e1797c432f19069fdb9d2c2b4841106e89b7c38a7ac7b0b07e8d6a9f72b1134259d7971d93abb67211022ba4c38e324c9c2d0f65512d6687498ffb7b44e255e71a226ed7bb24e9d0bd4e275f8b4df0696c1da981ee23174ed2a1d0095e2357d9ec65544245fed8b4a2a645357591ae27b83c861dc9e6698dfbbccc2dc2da85823a689d87f4944331b1cfe9b9536925c62beacc4e8193c1db77d597ef56b48df95098914c50b60145d4c0e4a7a3fe4d4dd776065bbf2626cee54a07a8fda8710f9c44f4a7cb651dab0b4873f812e1f52e66bf15d9ebf675f8a27a6bfd8e974009dbc70ae3f6c7287c7f7c0c1420292595a29f315202a066369ef5b274b3dc4aac7f6d1591ef1245c65a5b256668a70e0ba165270286d0028ec2b2b14a75a33d86c82aa34c497e8d2d4fad4950c8cda55ad8dba16cf233a62a1f05099c528c130228a1a95fbebdc0fad93ada855ce780525b6f382c7845a212661c3327397af1872e344f21d74d0dbfb10add0484781c30b3ef611dba74c70ee6235f10e368a5d17ed4a1668ef4d1f21fb7abd09d5150f9747bc123dcab3cd4a6aebbf14aaaade5d071f15c6c5be22177102dd88897e29b67d48c1d46006ff181167056d6185aa05eae8859ffc070fe6c256a65d59372c513012f433fa2ca4cdc235f10b1b6de48468e305920c53b3318240eec30362427449208189bee0accf51c595925aee42115bb0ed98ec508d08b68cb6c3e0cde367633db14a541758c19db041a108f3516777f0e1c9bbccbd73a51e7d7114cb78ec46dc1c19eca011124dc94ca16a70ccea9617cd06303a4d9a233e39cb202b16d436645fcea40764a0e04c6d3492c1bed877cc466a9000ba51ac3554db152835e64d12921024130923ce7a7309aa548e88761e828341927608fe027ade791724f459151a40a9470f095adad20a711fbf408fd73965a001dd5b4b6b1034c3f676cbbf48d4de32186f705960c08f774add935a2c617c2aa0631a4118123c108a59aac9b616aaf1333565019acc48a9cb40db0a391a07d74190c522cf9bba42795cf90a088b080f7d59144855605ef8a9cdf9c0601fef03e9cf4b3564072e8d2be45e1452f7748b4563197411bca607d57032d601eb8eed5a1aa29a8ec88a980c3ebcaded9ace48b2ce34c78760e90a1ef28aa616839fa6449cfbfe4cd62f6394f7b179b6ab376d44d8140a5414107c27dde4008d3635f517e1371e9bd78cc509e913bba0cd04a5eb280c672d2d8a4b447271a4363f8e6baf802fc8205c14abca8953abb56ad4d352980c3484138c2ae858548780d132aa50b4a5b027a0140375db765b5c969cd74a48ba4d563071b21921c0b22b0665d23caa3334d7355515a1abaf4c7f59a0202617b25909b4a39bbf71611c6649281fad1a933034a3f08938f05c94769d063a9e0d416108e46042e075e4a8da36e74b1c0dc5fca73e1aee003b786abecb628a58dfd00b3cfda79b4aba49384701d2da759d4efb3bc15a329e6a4a46bd5260d1487631542f96eab5663d15ef91c6d657f7e2317be2db89c29f3687e6e0fe1bc6c0d82f2e222ac0f5250de70811fd568aed8077466056d15ee87abc4a67c802662dae884ebe3dd5c08ec0f86d00bd82f3c75b2edd6ca31f3f7e56b081280c09494f341bcc9590a892e125bb1c0bdaee3156c3c0062bebf163c260bb6f44d913c2815c3c2fc1150eec993ef3bb53945e97507e629b3bde98addaa3bf3fb2ac82fe034e423aaf97ab68d489bb83fd4c6dda7117ac64b05fe20d24c43333c96c52779709229dc6f9b1da50177521c47f16ed0ed3378ae82e5bb28f9eea922dc9d6b9561a621c0e7bcd9acd849773f1a37d31a9a00897ba236066ea8777acdcf38be51eae24bd43e1008099e0592507547be58174009ed4abcc6a90e4e1d3e7f14ff74f0d36c22b4dd5fac507464fb4f8292e86b44dcc16db3aeba7f3c5abdcdb211784c1ab2bfd641b1bcec345dbb4ad95077a168439d45e2ecadbe7196b166b26819d73a4c9c4c8f851ae8db1d4f187cfe461c3e0f3f0cefaa04e478ab7380fae9b4b381f3edc78787c298547e6209c43ca57cdf1630a37ab7eb6a15213e3dab7fba8cd0f271ceff5d87cefed61636c7d49a085ad06b6ac1b267cb2253fbadc662b2903f0e6fe397265e4f5dbae036a02ddfc54ca18fde93f8952c26613235c1688db7c877744cf96eade90a104f411525113c039b4f244205c226b691202c01f5b4649e8e3aa014e2c0fa23dd800ce4ea15ada727635fc0fd004de6a00c5ba67a9f0de331a7180a86fd00c60607e1f08a038a11bad3236ee3701ba2371737a1e81ebc0ac3aab3629dc8b019a274f7c3390b442e5303f3f3f3f3f3f3f3f3f3f3fef359670fecc944f00b223ad8007248d7496e4ae94bb805601cc8844000000000000409707a607bd07671c0fd49864a4bfb2f60a30051810800044a0a620c50ef414e437a6d8ca13a1d3819eb542cfdcc2e710b41c98f4420707ea4c4aae99c21b68e7fbc1726ecde82dc406dac9c8234919a406dab87b6cc89c3108f941032966a06758a3313f3e64a0c9844893343c62a0445530f76c7b7ff18081964148a155f7399d365ea0358c9b1f7887760a192ed022c4bbab94b64ae3d5822548c1022555b586097b315e5e815aa62942d987adb3a84047b9fb257eb9586e29d0718523a992ef6c1214a8ed318799d7d059a43a816ef1b84dcae683c7044af28931e60d974079f10d671d2948a0bda6d80c175e6e2ca3d0332fa4cc9dac610e51a89bd1e8d15d483146a150b2a6c930c7a87f4702850ec3e7990eef135af690b367f73757487b420f8bdd1d9bbd297cb8135a861f0796a23a482639a1665dca583e6513eab4f865d0386583026842c98d21f7a6fc4ca88dda34248f6342d17609cf1ce74b28272183949299ccddc7125a446c1072d89c4ae813924bde069ac5baa5843a79732c6fac097eed24b49f7cff603c29093de77091fdb3636b2b23a188feb84e1e1112ea46e7a4889fcdc35d1ea1e43c3bfbbc5c692fe708f53fbb48e34c37429feb6053e271e37718a1c8a70d71f3673439b90835d3e39e91cb8e3c1b8ad03f7e1ea5fc27420f8daf8d112285d079446895d34b080f91a7317f08cd433294eec690e9de10ea444bc6549a27a5b81742bf1015f6c2b6f1059d103aaac8a93d067d105ae8fc6f7ac181c9c505a1f979aa7ce01e32e81d08b5f365f0cbe11fe75803428d6312a7b1df38e8ffa06c926eac57b31fd4699829c624a9da0cf741ed28a91c6d613ee89121759e669154f5d983d21343fb4f037790a307e56dfe42a87698bacb83261edac7b3ff7ab2c583b6e1f3766633fe70e41db4ff9872dc888590f37650f3db613619eba0b523cd99436974d0be3ac48f3b71e44f3307dda4713c7b943b7466e4a03bb6461229f2fb464a1cf4f3b1cd547b139f3f3868b973dc51c6dc1bb474ba17536b8ec9ac7383b679d3d2936b3403ad0d9a83986370d4b3418b0cda412ed1fd90d7a0957d8b67d2939206518312efca338a1cbb279d063d3bcbb59668d0738ee18388e30cbae386b519d48fd921bd7319944795bbb1f3e5a7910c9aa3df10110a3006f56248667bb1e58e6e31e895432cc9265731841c06f5af313a9d684da14330e8b0927c88de8997df2fe8b2f956b12f85fb2015c00bda448a4622f92ee8b85c62445f5bee1c17d44f21854afab88354bf05cd7c437485d0b5a0dc4fd2d9f467418b8c63beac3b16f4dcfbeda1fde173c9575042a7f28b0f772b289fc1e3544171bbcf9435388adb492a68226e972cab365c7e0a4a3ac90f6383b1d8194a410b21ea714f8a738d3351503f46e424733b8ff402055d5c67abfa7b827e3906afb6ed9ca034bcde74df9126681bc473ca3e49338a0613b4881f5248f6684c426a099ab8e6acc89a7e500025e8d5e2b12179579c49d03fc598ca28530e9783044d26c79fbcc12368ee1b1a23098da054c548993931a62f823621e4f464efdbf01141cb3d9642720bf990fd10d4b1f7609d3121e818c9c693fb04418b8ed69c281d085af808127331c727c47fa0a62db11c3fe6876f120e0ae00325897cfcde690619c37ba08e779e5fccf577cf031de60cb2ed610c71f23b50c2d14ed57674a0278f1023dbea2da5e440f18dccf93029c6b91a07b985b0151e0d2bc00d94cc2948545bc839be0db4cb39f36bcfc7ece91a28c17f926e39760a05a081f239f35636f320b132032573c3188d6332d053cc64923f8463a0278b2993b98361a0548aebf7d31cbee32fd0427d56aaf4382e502e4383d0c66981da313d9f3b4496cf2c50ccb3c6c6feed0a14db0c7d2c293f425e05bae6793109dee0f4a302a440cf1c1d9e7ebf1a14000583bf749323c62728eda7cf045a480816a725a6df912550242b6df2f80b4082663a9bed6c1a47a1c6e6a718315b9b2a280a2d27a43014dadd559c5ea578e01b50687153ee6892178d49f309fd2e67070e3ce309e5ec422ef9a8f863994e6815fcfe4f6246b89a133acaf86df537294878134a08a70d83ec07ab184de8ae1b26840e3926cf4a26f498bbeb2264061d2405137a589867d3067ea1512ea169cf4692cb3e95eeb3843e4172a8b8a55542f7dc11f29d668f77314aa81fafc43b9645858b4c42eff89ded5b12ca84b0975158ee14ec1109bd6d3cf6c70f24d4ecfa78c2e78cefcbf10825a4c94f967662bcdd119afd63077d3795cfd30867843a9f62767c5ebec50704022c426f0b93dc692479318a503ae420c163d8ee49a94498b2c33c32a7dd230022f4d4d17e6737fee721b4edc89c1ec790c7fb12c0107a063a591c10a010dafe5b54caf191661c0dec05080108a14f8d443dfcba31fd07c1fb25af5839c9e70551eb9795e67c2098b4c9427e629e0f0863380f1be9e29dff875308791c7c3fe4721e2666be0f8e66997bdc9df4b9e78359a5a1628826917d0f04f79fe0d2154ad78317c37d224cc6d1f350ac94c26f84640d1ea85c595efa472a4e803b18b6f1cc7cc60dcc7302d8010973b1b63a1439ef72391dd8f67e70f91c36891c6e6fb6f996832ede691e8668e9913b0e9d9668bc180e57249387e937f89e99d1fda3066937589bd155c5cfd954751be8afb0bb1439869a0dc4346c98bc1bfdbc86e27535683b9537c2a3d903015bc67e50637f0c331de121c43e281e39dee376ec2157f8a0a7b790beef73c8ec1ef4d9f02fb70cd383f6220e274f237950cfdb2f540eba751f8207fd81c7ecf9b8837a8f7f4386cfca57b183328e41f212079ad275d0f2dcac236443ce830eba8e868f31a7ae07d51cb43011ca72dbc56e88c84189c1eb2cc761fe360e7ae9559eaa1fd36ee1a0841d4be2dbdd41bb37e8d6202ce79c4be19a1b747749a23926a30d8a597bf0145fc306ade3e38d91354b677a0d6a65e414914935e8b0f665e7b2c774c93468a92f260b3105ad91141a9498af7b733e399b8c3ad86865b5e5aacca066a4fc31e6a457922d83d669de252e3f978c64d0cc4693576fc6a0e3beda86bf99345dc4a0e9888ccd79ce382c0c4ac7ccf09d22c309564aa2020c5ab48def0389db072116155f506327890fba69da34e305b5431e5e8c697736562aba60fcc65f1abb632ea869229e79e8855e30b5620b4ad6bbf86f86878c508516dcf39a1c17775464413309db0e66361558d01efdc467778c8fbdbb025aa1cbbea3332aaca0c79d7c765916f4d35e5105cd2632e25eeee7cf3837a8a0829e52b218c27f3639df6c5031051d6df8cb8b4929dd440a5a8e573d7b5e21686796501105457772c25170e0ef12ab808256ada1f7633a9fa0b9e4ced8643b5ec68913f4ce1324c404bf18b251d1041d6748bf2952b68209fa65947263334c296759b1045d5a725fa1042d6e2c77ca9429d84515495032380b9582d7a9810a24a8271b39f4f86947d051669f3cfff822737202a6f61411541841f148f25ae1282fc37902a62a8aa03c1c4d16924664e50802af208296453763097f4ec054c510741462f6afcdbf8a1d5fa14208dae7db642177d7871403858a2018ff95f384740fb20004800c154060e63d421a447e09868a1fa8118e53f65c23f7b152e103fdc37568fe3b9bc9c08a1e68beed1e4f43abe08116f4e2889f260fa13e97838a1de8f0a3ef35f8f979f87150a10345627c06af1bfd39e11c289b528f48c8b13ee4a06942050e748ca42ca69670918c1b2554dc40fb188d71f94a973dc5068a23b710bc320e5fa152031d6938cbb931e7865d31a18206ca6ee8c611f6e1be7f6e06cae7cb1cf7b3a70d6555c84079d058ea2f4ee718ef2250110365334e3b218bf955761a500103c5513cff881b32fe3e26606a041ec0c0074855bc40732b09511dfd96cd06000312e0430b152e50a37175a7f4219c7d680a152dd02b37fe0cf1e341c69f058a7fc8115d1d9398e554ac40b7eb94f5da3de40c272ad073a7963c19aa8a14a80dbf633f8c1a05da3e4c6616af32c80e2a4ea0f7c394c6ebe25c1b487450610265e376de0999373fced4a0a2043af20ab71d232ee47e2e091524d0b33a6d8510e31ec6f78811a418850e2b3232fe9eb174172944a1a5a4a59d7b9550e8f9c6325eac4e79a1210528f4b24bbe319c7708979c80a94c80149f50bf2fe6c903099de3e301527842aff2f9581363c76f448a4e6021362221e7c4ff6f53eeb1b2b89b1864943bc60887b5260a696b8b171db3c98419858bb7f51ea263c2d01933ed2506697e1a69962049594a3b5662f4531d7fcf1d84f4525042699c4a763f464bf49f84760fb4b632ea6ce91d39904212daa6202145eb5767db23a18dc58f5b7779bfba868452923f37b7431bedfc084dde34e6d047315dc58e507b26c4343946c6d09e46a82deff7538dc308bd4dc3c71bd583b02f420f1b1fc435f086795e45e8f932a40c499289d0426436679710114a96cb7329e4addc3e849a3daa4baf3286a8e26b4816424d319c5e381909a1489aba3caff9d2b96410da9ca7f1d78aed1d0f412865e52127c70742d7d98a417423c44c1c10dac464a41d36e30971ff418d90dc30f3cd7ed01be9846caf650d33dc0735c3b025bab9221b79f8a077c8d1da967f0feaefd4574a39de4e5f3d680f24cf85f0e64149536197418ef4598907fd6dfbf16d0ede418b1f2607ffda0e6a68daf2cf39dbcfa60e6a3b8e8831273b97a3d041b309ad5cc1f234bb73d0427f88cdcd991cb40c52eb86e7e2a07964998c7c1c70d0324e9325cf32dea0267d3fcd6119bf1ac30d7afaffec8efdf522ae3628ddff632d9a22565b6cd023a577f38abce19a5a83925b61eb5a4c35a8a11f927bc7b29f4c1a949c22c43470cb91a3412d6f0967fef93652cea0c69d1fcde1353f2f336813a44367249541471e1c65be1c07b33d1974ad9042f28bb8e1263f06653ec7835d2f063576348a0c1e54fbc6c3a0a64a9e26a394f472e56070a6f224c490bfa0c4b17718933288c4da0bfa65c36c7e7517b4ee0fc1275c2e68a621cf06c9d89847de42a63159901ab5a09f66d029937e0aef380b8aa4f4e73a134a23c758d042968cedb8ecd244ce15349194f532ba5841b1a9541d529d68785550fcaf45334819b2514b0525b9c549e9249c82b61353d738f7c3e69482163f04cf3086c80a6646410a5240818a1f9259bcff0463896684a31b9da0795f66344107126f222127a90d2213f4f19a0b935f79bae112d4ad69f819edee1b824ad0de5379a598257eb830094ae64d3b1662f8b46c90a0cc99b688b7e608ca585ccbde6bc6163346d0d1f744ce6d2d6dc92228efe04a927b4ed69108bac9a4abfbc9c82a1c82dae81e576875038b0941b90c22dbf3c4a9ba4a10f4f80ab93d2f6e45ba4b200510940bef9f4ff2b448547ea0a591f87a8db18c3f3e50ec1bc6903af3ed8e3dd0345303c95226638bf87968504bcbe3c3e734d971062d264f93dccfdc5123cda064c66942a5cdf56129838e3bf7e758ba198704c9a0e8a31c37a12bb2f663d0b3fde17696763e590c7a79889547c48ac3a04586cae03a6926fb8041f1ebec4df1772c9c5f50225da7cb19639798315ed06abacf72ba0b85ecf1913cd95c5026341a0999b3133a5b50ea6736f666b5a066f2b8b86c9c2f9e59d0410a9bffebe2ee35050bea545b2ccfbe47a5952b685e6ed172be15d4ce75538ffcbd3d58052dfab73a4b860a3a7c2c59d3dd8cc9e5a6401899784a4117c7d73126cdefd44741c94d8fb1566650503f9df58938ec09ca5ff032f32f8dfc71827ab69dc53312d994429aa058c3dcbed9ae4d13c204459368106be91c3206598212a723bf53cefa120e257c5fb921c63e09ea8d278de8fc7b291a48d074324ef12a8c8bcf47d02407bdbc378da098d557dc182c821ed2e78d577331fc86084a6d4839511e0de266084adc46c91b4e84a0bc87dba48df4fcad0a82f2b03fca51aa80a06cfee4b0b34897ff3fd053278f192bee03bdf536e6ba18be5ff7408731fd38f26b647ff240e9649fb135db81d2286f0cd520d28196b63553ead0deb84e0e34e9fb8fdf30a5745ae1400bd6216c2aff6f96f6069a5b87ac9b1cc506eab554d03bcf923c344830450db4343e13a763fb96723450c7eab24ca8688a3ac77f985dfef89cc11432505269867bd592af93850553c440bb60191a324a9d67711868713c676eb0615358fc054af698c95e5f39e3e72ed0abccadca5d53bdde2dd0f38567bc6ebe6db159a0677978d538eb152836331d62633d5b611528fa922eba6d3cd57452a0c4cf6fa1f2e353bc8b02edb542d6ec1b2f85234fa0578c3165981c07eb0b4da08bc592a07709d4ee6c691c0dff2f62a6208152395690b0d9710fcb28946fbf0cc15c51e8b631137e92178ac24c380e144ade4c0fe378f208b67d421f8fbd3143433ca15d889063d29dd02485dbcb92f1a3c6199cd0ff65bb3a6508368db2d8c45e16650ea7c5b39a38c57c693b4df9723ed081083806326001266991093d47f67d47c88dd9b29850be349367f3e40e26a75c40001697d0b24d64318b2da1e72d8bf8c89eac0d5389d19f9f5f25ef94192574cb0d3bd31ffbba52008b49e8a8b7bced639650fa4942c92efff9c8eea6411cc880062e4001538b4828e2f1526d087a9f1d0d093d6bcc28cb32533b88b9e28057000314b080012c1ea1647b4fd8cdd5de3f618002a66e81b30ca8720b9cf5c09d852314f9ca703144a3edf71aa15f32873142af9d181aa57b11fa6910cdb035b423a41431ea0e216fe3b113a194a6bbcd9a4684eea12fa307b73948fa1c4297de73f1f9ca177b1a4277f4c0a57d2c85d02b1ec55738dec87842e8f0721b847621cfa3011682d0dc43f072e02053304920d4e9b7dca713a6c26600429db1aabcbc9532be1660f10735de6d99b53c2cfc60167d300b3e98c51ecc420f669107b3c08359dcc12cec601675300b3a98c51ccc420e661107b3808359bcc12cdc60166d300b3698c51acc420d669106b34083599cc12ccc601665300b3298c518cc420c661106b30083597cc12cbc60165d300b2e98c516cc420b1680105864410b719de3ce56c4a81d477d200916cce20a666105b3a8825950c12ca6601652502b42b84d686f7dd34441cba4e7189fa393880d0b2868f679156da135e779d3058b27e8383898f4a6e1669ae2828513b4093222c9f24d18a3cb3a13d4cfd3ec0979097adaa9cd70e3e26e2a41ad7c34e6b97936661274d1ddbcd89c1fe7f191a09f6717f3606d9a347f041d55b6a9ad946104dd32fc64904f9f8ffb22683b1ea717d112eef144506a2ee7b021e7db4ffb10d42c6bf852973a5ce742d03223e824993c088ae30f9d2766b7750341df9264fb91cc27b53f50aebf6f32dc4ff192ed031db7e968e96d30edba076a8ef93e8dc94b34a479a045908b294956c810f50e94fc69624adbea40fd14fa7d2644b6fce5408f4f9ade34650917631c682de11d659052089dc137d062eacb196303cd52a698b9b5d33035d06a279439be0c0d34b36ce79fe619a8bd6191b23bc3dc9d2303b53b85d7ebe6479d3c31d0638d4d7c9ef55bc88181d2697b73957b2809392fd0a24b26873c772173d605ca5fe86907a7132e6e0b94eb181c967fcb022da53d910d976061b22b503a5f3a5dc4b457af02fd1ad8587eb3b6d053a0594eae99380ab4d0d8cf9e988e394fa077aec8dc93155b37817a19c568f14aa085e81e4d9d411624d03f550e8d0ef38d61390a2d633c992cc2a2505a1ce7aaea06976330148a8674f919238f1d33080a6d63283149955dc3053fa1b65499757e1c9951d0137aefa6f9d86fdf39c34e685df9e217f29cd042748cf3bea18dd29bd03603bb70257779c39ad02bfce65cf748442713ba6cc36d1c9161ce2726946f098e435ca4eacd25340b17ba71b63ca22996d02bc4bbc98cca4a28121166b64176346228a15c66ef792c131e5766126a7bba4f0d2223097d634f8475aee8d023a176cebbcebf0efd7048a83ba7558dbbf379fd08ed72f8fc9abbdfbe74843236c946e822656219bbfb4c6484dae16363a39978e62234734f2596a9a208257c9e18bd7922b4c888f8bb1491f18d08c51d4ee3985d21457d087532b21c72069f21942c21eb847c71c63c5708ddb2c7bb9b4a2987f608a13e729c2b52089553e506a13ffa18745b82c4909c20d43c99be6a0f84fe9273881ddbe78d7180d062264f1978260d7aff411befd3bd5cc94cd0e7a31cc48457d87496a005bbac2722125c4356096a0c8bf9e774a3f69349d036c4980b0d2e96862412b41429ece938f6581f3c82ee5863a6ad201a41c91da4c3bce8e8ffa608bae5b27c912abfcd2f4450a481076dad6f083a7e39f7ee4e083a4a1af4934870e4a00b821e265f9bc6d4b83f372028e15e274e2be3077a5b7e90391a42eadb077ac69cc19b5bc520293dd083c614fa613e4cc615f240bff4f1586e53887f211fc0800176a0a4fefb8898d23a50b6c41e85a48bba07e740b134fe5e1782037d6c6c73eabf0f3aed0df4d7c80f8d8c724fda06bac7f77c5f9217fdc11aa8e1ea7d26f53bded2d040af14ecacf21f740767a003d906ed18c64b155364a0349a10c2a3dc3c2964315083e9340c0b7a977304064a3ccaf7faf036c00bb419d31cefaf71a8cfbb409ff70af616c3ec5d4e0b34d3dbede43a0bd4fc1e1d1a75c60ad4dda820f9ed1a4e892ab842f9bc46ac4d0af40b411a464ee13a7e05058a83f8ce70f3b5c3c84ea0ef6e8615b24990bd8909b48c4f2bdb4552026dcef483ef47de4e8e0148a06e7b6b5eca9edc2164147a46411fef556890c6210a45c7710a630d5b1f4feec94062f6db40a165079b6f34f6cd83ea13ca654796328c4c9635329ed045f45387cac68f32df096553fde48d780a6b0f27749370294fda9f9d3737a19d668b17376208d1404d2892f94b2fc74a11c1452694fcf899301d3c030d26d4d70fe1c9dfac3be4124ad4f93b3ccd1977e82da17f7a20e317d61fb3ad84fa2d99fde3c4f5a629a18d240f073a9fd1203309e5dafcf7add1d6768a24f40caf294eae1e9b3012eab4e49e0813486831cbd9e7c89ff532e80202178f5062969090817fe9d7e50197000796010108005e07ceb970843ea69b6f84fea06d2605cf1821334213f10c8f722417a17cd6782b42c9ea4ed6a1732274c95a41a762ec929711a16ce966f9385335ee3984f2b5d123133fa1ab6308fded453c4b0e1773b485d04349634f722f3d9d24843a1fb31c841e8d63cec54cfb7550109ad5c805a9080642cd9224bbc4adca5e21201471f063b1d530a3d9fc41cbb59f3f55b6c9668d1f740cda33d2c9f040bed2071de487d7f37023c656f8a06f54e5c73947570c953d2821ed83124bd63e51d1838ead3a36b8609be5b93c28ba911f84781e338a0e0f5a6309da38e3c9586abb83ee192cfcb66b077553cad9fcccc423590725a47f8b13bc7637343ae817fa221a247de495cd419b18153f63fcff1e968316768d734fd246b12171d0bf3ee69c2ab662c4081cd470b96a0c1b7da7fe0dba5e5f4876b3cff8b941d77a47a9c2d70625e6d1b0cc76ad0a196cd02cde3bd234ba0dbcba5883a69bdbe53a4665f474a106355706c9a252fc8b4e50b848839adb236cca0c0d3f58800b342831e7c6c0ee31de74963328a5596d627731370805d60366d0520c8d4d11c2ebff3b808b32683163d258bb54c6194c010b74c020e0820c64cb65ee91225ecbb2818b31a823bebbb33144c8dd88417fb1d1b81fe2fc4d4a18f48fefacbf8f5cb12260503b4e5cbcf8a4d7c9f1052da69ebc9c8ab8152e0c50603de01ca0b2b8f08296b372638638b10ab70b5a57d270f133544c6ab9a04e48f6874e6e413f7dd848c3dd5bb35ad061a411c92c310b5ac330ef871d62418b6c9c335c7cf8f35d41ad6b609d32cf5e7e182ba815962aa85339d3e7eaa9a0b9c6660afa59762c130f517d1529282f1363d9a34714948ed2fadfdc0f0791032ea070174fb80b27dc4513ee820977b184bb50c25d24e12e90701747b80b23dc4511ee8208773184bb10c25d04e12e8070173fb80b1fdc450fee820777b183bbd0c15de4e02e70701737b80b1bdc450dee8206773183bb90c15dc4e02e6070172fb80b17dc450bee820577b1021d74cc385decb1f8200439e0010d5ca8407dd4e131a8c8301a93b848c10500051727b80b13dc4509ee820437842946c1e5ddb3bcca010050554f98421415002453982214370528c8149f20537842dd1cb71ecf86af3d39a7e88462b9279b3eb7537042afb1f918caf39bd0d2a438d5217bc12344135ada9d89393cc810e2536442bbc6565e125ad9330e26d464313f66bca597112fa154b2931043a8f07f394b289d424831070f1a211c95d0d26b4a25215feeab690a4ae8a3110de66342a33223010c50200b30c524f470d8b399119f1df5010c44200222d80ba401484d8031b01c3885015348428d9b1d1d096d524476ce2863590c710e64e0000108009617a6808416af27c588a573fcb947e8bba93da414aafa3ee2083564bc7d3aa1653390a66884627ef32842b67b3d82d5c00546b00a08400046b01a98821186482e89102966143b53cc73954b369ee7b8e409532c4229dd707c219f617b4528e1b7c47349ba193d11fa854cc141cd87751a11eac7cfac8a48b1463e4416b2e75e5ed2108ab9c7dac9bae12b5908fdf14ca414c2a4d02021d4bcf6106c6283d062baf651c651de202f083536f0e81c07420b7dd3e1e18c80d0fff26359168de986ff41ddf2d0168337f8c7703f28f326276531c2c3f23ee871f51d53889c0f7a3ac76836483db258ef410d9633f9ba93b179d6839afcae2fcfc7fc27390fda56d81426574d8c1fe341fb68c718a5cde339bf8356af6759f2bdcec3eda095d76e10bd0ebacdfecd6bee4f1b3a68f143a4f34a3183c7735034db89c589eb94a71c94e8b649fac041d871d0bdbd42b0d210e7423828222d493e439e78df1bd46d10f2161d372829343aa4489d36689f81651c21c56ae4b241ff9ad0ddcfb1f0d9769eacf1a4ec1835b0933cba42d6320d7ad9018685a8b32451581288a2388ea3200842c0ec764316502058501cc86108c4b15053f50313c0c00aa2a040240685c2604020080a02c14020100c068381602010080402c18020148605e2f9038a1b2be328b1355e01b11526a58dcd216e854d1c4ccbb429c28763ab5a34cd0c1d3044b81cc556d7930821ae19824ddc341d25d5f04ca7ce00997ac5ce6bcf1457a6c60cff19edd0a4e984b38bcca4b404565e1e125017192b727f8f82afc1e74bfb2a31a7904e20d44d11fdada184f318880b576399a0532e8c6222922c6413558e18c470066d449607063194d20954c1015ab44fd31472d09c6c23f119c022b834052523b203978354c0eb425355c706b307cabf4fc05da81420705ae641220b00258ab493e2b3f69c7c4c6311c691e9c16c30185307c60fbd03d75d18dffdb3138be0fec8a15062fb77f8c63f181c13221b6df436d7db58c86c56d762f0329ab1499599b097bb268f97180c8bd16d60fa74b35e211ce2d39f903d893999af80c1c249e2ab0885c66881835a10095ad851319c9f073a2bb284932eaadc79df0c33ce6c34f1725d6c66d7892b5213fa5b046d334258dcbeab365e9b6263d89836f4df8c0507c63f5d1324c826ab6c2647e4aa2ab411db441bdea6b1016cd2c66f236d761bb3b999d1ce9407f2e5280eb631bed138bb8deac69b537dce98ad79219b38c43633a146a8614fa876df3d01e718bf2055a514389b0842d24ec62f0ff0a99c778b81c0de7a5ffdfd19fcfe71b8009b82dff376161cfc87e92ada61eda118a05745c88dc304e28da6bc425f157ebd8a7bed40369cef331b173d8c774f235813636fad5f186b2e8ebd12940403c65a28d4a0ef84a9ed235ab2bf2388b2681d08638aacac0ad26cd0aa84cd9e622e7b74f72551294d8e080af4e0b46a21785486e33f381a402da0008eafc5e70422791c811974fabe42664ab27676666aba7e37431d5d3b3c63355d3f9bb98ea61d9eb99aac4f70c19628debf5c852cdcdc58934cd3d1b7290ead702f32ae0cf048be506094c124a2623aa465cf7c1fe7d53aecabbab7fd540b33d2001ee17ef9be1eb4024a08fd328ca738904f58f97d848a6ee1c0ac5244f6bc3779458e72704f3bde08437b9a91d090aec83c37da1e4f0c35202010fc41c5eb3dd2204be48d4db4997f850dc5aff54d6376f7c3223a36d0c7f8c5c8a7d2c620a35f6052b4485110d02e6073443b3c9db4031a3d4c8c29c7c6fb3589b60814abe4a02f113c27d023d626ecffa249671f8258479934dcfcd52fe1fd99cffa23bf2350695e06420d1edb895b23fa46297f830e5aa61014040a2b85c8fd09fc66673bec4ad4399aa1c476933cd4f93f84abf82eceb191406803e79f2f49df52e9fca4c95db3c462c755950a72adfac07fbbe5a5d14d954a92baf277ada66856c3e14bd1e16d419b1e79ac27e198c0a1a5d68d5afd24db3d4dfb69de4261b28ddd5cbf7839ac09fece84a7a9b1021f3fe1fa1d609b93b727a017db2fa6ef8e685cdb54ccb70f1d588b347a9e4ae8440e2c0db16250cf933c7d5d0c0a2eb068794903f919d209cd614de0a32590d551cf101fd2082e58a072101ef0c8dec11691357d69c20979e81445795d1edf739feff3333ff917f6701ede7378069f4458dce167fb3a67a024be8ef1b00a881e4f42110b1e009af15169e83d9ec7f75302df0ffc1f13841d7a203c4c61f107feaaefb51e8ddca2290e45d21f17f47db1428b80d7d2d49007f7ef1dc4a8fcb3cd0d1716b0e1a66468f4e1849cc46a678496e0e1b180b770f4ee12f60b35175cc81850181dd033de02e77c8fadf99953fef1163cb8a31bfc4a781bf9831b9cfd1340f21ee33d3c437d8f1c12d2c099d8fb88050f388c3e03be001fbf6ac1e0f830235c767021d7d92790c0757c0bc717f1ab8d9f9ae06312069485087142b1c3839b817bef1cf0107bf8d87beefd7b06fede9d24c7ae2be649138cffb72ecd795841fc783a15c7ae9cc1521026e51be48e5d6724a3b14cb423455669267728694904dcf1df5adb2bc55213f0b10e12b93e870378776fc736eb4cedb16a28ff1ceba4d9402d96631fa38376f00d92c1021e8684669f2fadc03f088016200eee2e6c40b1db564488deefbf104174a35937181180dc15f645b041b6c4a328cb05e238205781089d6ec3f1163698d76e6b91123583883e7bc566e2393699b3b65d7fbd06d1f4fadf7836709afa83da6fabad5d90f4218bb1fa0d0ae1a9964134a58653bfdf806f958082b9fee8912235ae06d1a18fccaff908c94c20a70f0aa52916c28c9b491fb45dd139d3dc632e39ca37583bef096349e8ac100419887ecb56199151987e95ae95410390af37106cbff35ecc50a52ae13329395dd119c4560cd85f84af1ff5840311f7502e643d793ded288a384f9f0af94871d2ee31c70d340ef1fe9df32b93c31efcaf27491416e56454bbb483279ca4ceb1b8b717d13c11899a318fb8432c5bd65793f9df5eea6b1a8409c21cd9dbb630222aa1d4939d94d191e0d82b2e1e00054800e3aee78102f5bc42380dec7da57034ed598c3d9aca5dc85da2f2ae051f59f32ec73e5d79d3828fae79961124617b14f38fae3b2b33d7c42e03c17fb53afccc98ca426c4769018eb4f3669c27077edb4af8d3822843cf654b560b18264a65ec06c1ccf3e6db21284402e981984ecd8e35b5384b9b959eeec22647200fbeaa9ad893755021d346910685cce4af7516935277f91c338b41865caa023ae448340c598b2406a9a679eb33c54fb1d37947c1d27b7b599a8a32d00befa578bb6e29b4db8befc02526ddd105ea6add15d40d357a787ccd778bde8f57eada75856e13ec2eff73d322a35e9217e87ad03df73e25e39fc010e75b6f6d5b75946ea8883d417dbc92eed1adeb6a5dad5be4bbcbede58b74a1aeb59bf46275de6cade4849db857e025d6b79e7694ec7ac76fbd37837cca7d81bbaf1584e721872ed68deb52dd5f57607643ade3a10b716fb217de4be9b57b437a0dcb9b8d1f8bbc2edda79b7e747b29aa5ccac6aed38bd5ebf4a28a375bfef9c1c5f56031f5fe79bbfed69de177f631e966fb5eb443d4ebf786c9dbcb062a12c1d01574075dd615bebba196e130347d81bbdb5edeebd4abf076ddb70e650975a3bb7b8e0b352b4cd7a2eade45d16c3cb7df9f17faabf79a7805ddceafbb57d25b9bb79ea807e6b483eeb95e6eddd4dddd7997c3ad04c99c7a3fafaf2b76ade18e0ed85da8b751bcd95e97f8b9b117d4aba6b72eaf7fc06030416ff24965c771672aa422b96491c28ec507f7ac690cc22476e893aa2cd2a887b63da2bfa0cdc332eb6c0018fe61c7b2c57710db674870b9c887159904271a9419bc94b26b38947982af12443fb6d8e054a08b87cb5415063681b97aab06ee54dc6d1af60848817e0567322d3bd658ab7b778e89d1b4b978d72cf04edae79d6594f62f044852b8a2b3661746a4930704d16a24d34ae2bf086460c4c3190dea889a6b052268a5053080c16be360e258d978939b192522aab4224160f1637663c04d94680cb1604bc943247bb8763b62444ac78c534edf1a93908c6536acb167c417ad84ef0c757cf119917f5809634b0dd6d82ab982270d6f660dc153b3def78952888c589bd5a3ede86b61ddbba102ada5790a7d9677551b3953908105cb800924d8caa0baeda1f6632c26f38c16d45b0f98227156064e737b28ffae688c1e2b3c3d64900a883863d6f0ea6d814054b261c2f79c9edea531944b91050f0b32c6750d7e3d7554bb3bd2020174b3c63ec6b3dcc509451306e60b343e7df99c87ae331479ea86ed28e473092050107be55c12de8aa0b6dbfdc3ecd4401ac0d8500bf02f2fa635b5e828e25829e332787127646683c5f7e8535430247d0f50433b47f5118547351efc00597c530d53c2a05cfa0f801c2828b9a9dafe5e4da040bb6e1befc36ee181290cd8b89135e55b235cace9e5c8745c5ab9cad4edf74d6ce25074b41e00dfa6905aa4b8bcba2ad288d0e83e1a1a76b22b6b890f72ad74989b938f0f7a60e4b88f63a057914a52284c4b2490e0270a56fb8ef16da64535158e7f1badfc970144331db5eb08d4ee3657fa48da54ee11c11d5952b9440f0044846ff42c87a1e567a2a7a0332d3a922485f02eea02cb98834d91a45215aa094e3430d1a33c21987d9aac16829961b84a53016d80ad435f9e9ec1fc55f941a4564fa28c01afc86da5ad70bfe8d9b58f6a50c100429322afe691442595d2643f2462bb8c46aeee3fdde16c0fc425726628e6e1c490be73ecb4f6890ae20165900c7997daeff208bfb3df0a9ca143bf21bc1cb66bfebeb094bf7b9e42b29426b49f9928b43ace4b5eebe0f1eb0b922b158829083dea1132e270c11e0713e3f36f2d27fead440057828a23997af39555f7878226068ceaf92e1987210508ea9b3204efa13b9f5b1336e8a250cab73bcb15865406bab4f66c7f4feb3843127f52ac865ece02809245d23ab10c6c59170a3b4a81bb501904ccf038d244e214d5b86293f7adb134bfa2855195b90dffa179236230fdcbf7ac6950ec92a63432ac9b39cddebc640d8e48d1528fb411b684d51dd000ed492141d5f0a5afc46ddcb1ee6bfbe1420a81f3d267277880a9b25d61f00c0206daa0ba836573edffc977a010143cd848407de8f31bcc2439f707dac1f2091ba520824cbfc1862abb0f14961669b80733ae14fcd30c34069b3698ce7b24bd5c78179d4e6e200d4a38583e774d052a83dbe0b706339a6374f6060b3998b9e661d52b6d2089c1a62559527ff660cc2399f8fa492004cf8105840d36767d059f1c6c569d709b9cb0b92fd5c31b18eccb3662f36c001b8c06bd01991dec03d60ec31ff020d00b2e09c86e5cb95e66eff96a0e59cb27ed0c3e68b04cbfe71d8206ca80bcc18c795aad4e81a0fb60d3f71066adf784191e25255a08181b8ca1a66e002485da0018d8e06046c2e5285e0903113631765031dd86786c1034080ec8b4548aa122207222c551f564233e6f35276c827070271475003833696996d488c208a2de1900836e5037e0b1c13e16b64a6d3558073c0972c226093324c278035c795530ddc6b80ffe9d306311bc3930c7eff067755a51923cb9d01b83eab227b7a4a0848e4c7a155238adcf05fa1b624564998a62358ad2668641de838d2cf6c511fae7d05d844d0c7be705206c68ece04735c44d05189007c472003e67055332300fd1ef4b433f4a0ff6b5037652b48131200c3c031e0c7c5803752736019be1987e1b25e398f04da8279008a441dd0b1b34c615db1136230f40c8d8604a60276103dee40e3ae80d973d9f09af685b6e103e8087800bf005980399aeac2906342790f98ab5e1fd571a78998b694d1c2c9b0ec0cc5eb67f04012d5b9a1bb0013c1e40f8638568ea002d0053015ae270f9620ac06b8030134c37fd001660e603840dd99f950db007480960f2370030e74cceae400fb407f5f83d020f037cdce4199e12bec7e5c17ae03f96842ce1c78a70e3d15f3ffef0bc484be911ff80878820c4a3e1c3a190938fbb3bb7813f6ea654ada33c8c47e8a13d54f0785f91eb36768ff520438f4916cf2f4b7b4800d17d8c1472827fcf134f12725a09d677c73c4ed7436a7d191a59b53e9690f76a1c4d48f721a72f7f1d8d8d0dcd909a59e025f05a302ca00bac182331ab5893ec251fafe1e22c9251882ee26a12ac29444a17124c9b8b20a5c6198458104f8528724ddb6a297af37a74afb786decd524c159a854261506c4321927f19e65eb71031cbe2f6572bc06b12919d025220ac10617f776889effebf87a98abc4b800ebecf09b3893b905934fe49d42b2a091e4380046ff1b86802d4e75a4f2e3dd1e3ef8c1227081821e43410fc80c9458c88277831d173a6506b61c2a104e83084387a3c1ca9c408d964cc0910b727a608e6ec8e6e46c6aef6975d16290ddbac2259d08e7f215cbafcdad0c4f0b559355ecf42078c26087391a005852a018a950c043601a2b83930ff113d257013068e082f016abcdc0e3f8ee8a9a881846c47749e00f98f2f8ded1e018291f87bc34dc86ecb0d158307cd3e99648d3ef18edb123d0aca30106bb67285441e11207d5968f63402d43427e128203a8bd0666af36af1b63500428508200462fb64c59d09f146744d2013a98487d01045086b23b4c59fac79076221003ca287a249045b4a4811a16d42ff62b0c45ac47902449704f6a64652fa42ec7030a038416c30bf5765b0dbd84602d434826fd92218d44428eccd7014bd5bf3a1909bdda8802bc26b2338939307015152a1c3636d6cc33d4a6c36fbc5fcb355f691f7142266a695f929693a3937bca2f555ed50b40d39bcc087a9add5b47853ebff058d1ea927bf895ce35fe46d3f754422d3d9e795dbb7f79972363b7f7140a15307f65b9e87ec6657520be8414c1dabc92b2bdac357b546d877ff439217b90961be7666e699210dc0b3834e6afea37dcbf85800857e992390b6489cb6e2c18d61dd60cf76b8872f1bc7c88192a6533af9466d65bb47cbabeabffa30cde041730a34fa81ca7853fc989a9ad86c79fd746c4d2fed6c57c5fa5f4f2479d5fe6c6f2d02b48e6f7b95ef6fe6ee503f82d5dc7202ae13c4620a3a70b46439000c30c0000395400209a4b5ab91861b2111736399925442b82fa721217ba71dae5b52a624534aa59061a9911cc9911cc9911cc97ef20f0a5d0ac50a968bc5e4262ad957c451042ec5140d4d9994d21fe1200213cde378bdaa1c43e0bbf6b464132a0e213021a948efe66b10b891c1c5b54d3302071098a031dec7d020734ef2079caa308d3125a5e792f1011f22bdabd7853de045c3575dc57d247b3c60f7cc4ac6d6d12322da0113844e113f29d352e7eb80d32e1543c6b8c901db214ec8f9316f83c571c0e81c3906d9f9b901671db297a5686cc0dfc9fe3aa9df39755803762578fe6578a5107f1a70253345ccb1523b9d9a013bbaabe2d692f74b22033692d63f6b71d35f3a316044949874ce4cda9d2c18f0fab122791ae14186e6057cdf6e55ce693bd6a85dc0670dca24a489b5804fcabf7ad47e55be8d057c25c9da1d417f9fbc57c02991fe634c272d832c55c0f575b609992cb7324c016f9d1eb2a49d6461691470e2d5a232a8eecffe4fc0994aa92bfd88a0de2d0e13b0252226959943d67ec851023e7a59be24cb4409e919051bec830a396239e968a260acb427d3f6b15070972225f5d69c2045040af6736d85e0c962e9d181c1c52778bd4ad5fa277fec543804179ee07582d61ccadc73bfda09fedaf5352551a9b1c309eed724e787644a096116c1c52638ffe45649a94b495646139cd28cef769d94097e3f7f8920166282afcf181eb4cd4bb095e4c5d3617fff124bf0a23df768c852f1b4a912dc295331edb8f8a4b150820fb263ea15111395832681cc103ffa6ea592e0d3b56d4ffb1809ee7ce399acca6dab494870d92c86a9f4ec119cea9493d8a5aaff933982f58a591b336b90343a8d78b3526e0efa9318c19e275d7aca3cf9dfb9084e5d8afc9031f53ba828828f9feae3851037091d13c18bbcf75c9be27eac0c114cc8d992a952fd105cfe480fb24a6308c6cb2c4efa8e3c6abb42e859114d4230e926794e52c9bc64360836a7649236752d08264bd01b647e1e084e8f78baec4954ac900304a727ca4b749220bc227f60d355caae1e945015f2039f2ae41ccc922c25bcd4074e640cfdb994979a8ce1035b5916929886ac4fa53df039f74aa86f4b72e4470f8ce9dc9512a37b0835e5814b95b2c96f0debdc3a1ed8899b777f935668cbdf814d59aeda811da1fa7316f34bf163eac047dbbc9f76d474e0f3d62b689226aa3d9d0377b22bb79e87f49439393049c41c9121ea65c889039b54586529cf539e6f3870dac77c2cb56fe0925227ac63a9d3ab1c37b06fc15232a14a6d6042ce74122fc33344131b180bed3f3aa71ee9a25f03d75ad67d1f53ee4c911ad8b41b742ed3c1347029623211ba35dd860e1af8fc1291547bd016b27d06d67da4676ecc943e6706fe5b3f3b95502903df265dd29e3ec9c0e69cb46feacac5dd1b031744d09818981864be91616a18b8526f6a39094b9a3b0e06465a57149354f902e71b2ae4854a96fcbc0b5cd40e7549af3cb4925ce0831ead6d999408c294b6c0e815111e83660b9d4f5ae0edd3e7dc926d6591cd022f66a7f26fad6409aa2cf895a46fcffaed2bd75860e225edfaa3c64369f10a5c2a0ded3f692bb097b2afa8ee3c4253b00a5c85905ff22f9b6dd6a8a058bc9499026b16db334583078d1529b03f29c9a4b3e5bee0220a6cd86becf829f26dce09c105147c53214a4e53052e9ec08d7864afcb0fd36aba7002273f7f7dfffa95bcc98d44c3451338f93a2908cb7eba427e052e98c004cfb86751552ce962099cc89642d6d310cd7ca33470a104ce74ca62214bc8f6635cd1df652509aca81791dcd7a28fd0cc384de349ba0ec4b041a3068d9d810b247095538e1247c86ddcd90b5c1c8111f93dcaf259683a7d8941a3461555d4406a366e241a2b706104f2764cea3f49d554c14511b8fe5275c975257b8844e0456b295d0c215d0881ffe4aa195375faecac20c14510f87ad1929d23c7bc8e71250b2e80c065b18c7c96b2079d911fb01245648967b247a5d24ec1850f981462f9c8c9c9bd6ea32605173d60477716b9c183ddbec6034ec64c395f53348997bad801236af4f4c51c173a602d866c6e57231739e0fc45b9247b0f0e783bdfd75c318860ddb9019f96476555f67ce39ad2810b1b3016636747c87e994316031735e074776f68c0995b9da8acba7d91152e66c0e88f54df7477195a19f0b7397bfa0ff93ce9520cd80dda4e5ee4b5185a18f0a5728fdd7fa87a12bd808d1bf5d722a51055b60bb89841a5fdf293ed9e690123d7bc4d5facdcce15dc11b860011bab839eba1c3719b402ceccacfd53b2b19b2415f071e3e4ea1a530af809b27bcc354552b98402ce93d2ff0a39792ff52760348e8809f89415f23ce5a8aabc7151023689681b3b87d0394971147cdf08115334794984982838171b61ef41a138424a3934b4a5050af645e50ec134a96c1df309f6565d47f5795e13be2798944672b4be4cd109c63478d68c2a722bb736a6e004af392889b941be09d6c3238624b99aa6d72aa6d00463b936e84af93aaa6d5204536482492ab7a486506a2d8a05a6fe06cc988145478b16f9000cc4b8c01498e0d7753c74dccb499dc3628a4b70de399d99af26c9fa4a009503535882fd4d2105252fff5680808a2baa70406225b83d19255350828f902d7f89b4cdb0988fb5f11de89f61ec8a2aca1493e09236132146cc8bffee14926073ca551b647736126c274f327d10220a093e3cf29788766407533c82f54f26a6f93d298bc711dceda5cc24b49d10d19ba211acd9a9a7957a491654399882115c27b7c813e4d6757ca75804a352c4b86974368522d8dca5c42efd896034d468043d294d7c44f065559e3ea66c6a44e9108c4ef5d8a1521226d56408b663c8e117b554084ee44caf379e3da78410fc8a50ad92eb938ee10f822d1143b44d2d08d633c73dc62f0582370fff13a505049fd395eeca916d53457fe084bad893fdf603f792f2784588313ba40fec0691229e92e7df21e20327936c512babe8c1427b602b657b0dea9d4d4b8e1ef2e42b31074d3b0fbc68afcf1b49c5902f8387da7a4fe50edca8f76f5dac144a54ecc09d0c69336869ebc026bd129abaff72d0593a306e26f4d76e760eac9890a57328fb9c5639b036220549233567861a07fea4ede514c2545f0e07ce72bdc4a046c5caa23770923346570d9de3df6e60ed94dc7fd720a3b66d608285d6183f63d68db281cbf5cef7539235f0a26fd7e3496ae05a53ff9a887978280dbc9e1a0fb2434c95b6440397ee7d679a6dbfff3330d69afbc4abec2b66e032580cba5492de6e97812bd171ed84fcd1d0908193987ab4ee69bed218181db27e08a93c3130a6a259af421f063ee2c8ce8e5f2652c8c0c005cd29994a21be46ccbec079b00f3166fe749ee30546c436959d3b5de0942969ad49bb460de1027719dbf46faea8608a2db09b2f87b49cee8296901618f91562ae661cb7096681d7f1ded6a0ed3f6c476fc5045ab460c11459b02a3243335e4c5f793f58d8d8f2000cc410c01458e0b6737a6d37cd15f8cb171e82b48b89c0032270630a2b9837a79dce96a42a7059d2dd66ab9e0adc58c594a404cd9deb29f07d15524713ba1478cd232587caa328f021668f1eacdd3f931014d891a35364c920cd26e8095c3459523779cce0a6e3044e96e9d8f599f337e4a0a98fe619d250f0f99a1afaa249ee2e8182cb39431a5b1ddf4af1139cea1a799d567a737c3dc1e436dd0e41f829e9419d60349dc9cc971da6957182377d9adb04d712436fe52cd20493e3fa25797f97dfdf4cf0995de36eee1226d8b2a444e609e94b709d2582b27cefb7d3604bb06221476f1d0957828b1033980e99d4664d624a30c127495b93499e04d7f9b55b826649fe254b824d91d287ee86c8193c1c0946c54af11cb2e72a392438cda517e4459e1fc1469ff855296b485b2a3b82df760baa735257c5093782cfb64ea157ebeba1c38ce083cacfdb957decb48417c1b86d8e9d9ce4f1748515c15d52ad925c4585da702298a492e7cc91768412494604bfee1fbd7e620ec148b388165ad5edd6fb586ba7f11ae85443b0953d496ba95bd0066cf48d185c08d647ee25dde9f4b1e6ab84603528db8f9b2799ebfdb156c37910ec9ee67985dc4e6a211f6b2c08de3a5a67e7689020d21f6b2a05151e3666cc68173414d0a2057620afd00024820381ab26bdd91f1810dcda4ed2aaba91fbdea0f155fc8157cf1f54be1c295c48e134e4c07e6043c81b7242aaf7cba3162d86c07de026a8fa6bf98fa744990f5cee14b4a570d1ea9bc47be0a2a8db8fb41cd6032763e420b101e7818b9bd6bc226decf5b2068c07467544ec6350675ac23b707ad7e35aac34da81bdf47891f207b999475807d66c5583b48c0e4c2e39e9621ef11c181bed1e39bec7d550590e5cfdc8489df24f876b380e5ca7f71077ac64aaaa0c07be838d75b028bf814b0fd7201e29f46afe63ed86a1c16e602feb8890dbd2539d478ddbc058b6b65c4a783e13e92bde8a1acb6c607da2894fb4146da34ad6c068d02949475d49ceaa8173db93f7a62ba781cfa6df4da8783ae43a311af8d053b292f9d6c5ecf219f8506263415e6a5585d80cdc6686b68a9393fae029039736650715b6659adf92813d11cf420eb13b83909131304157ea0a5e635aec16031f4766b2bae0da97f630b0976217a486a7ec29d50406036396d6a7f7523c72ff05465e8db5455a11e943ea0536a5d36d397fac4f6ac35de0fb826ed10996ba3f672ef09f5390fd96f3bb549e5480b7c0299db89e454d8514c11a33a4a0c2030bd6021f9a6d62e8ba7cac11ce427522a6282a784a165c881f29633ad990915860420eb57ab74e59bc251ee02b30322b29993e6ff2cb467f1c5b81895ff94a65c96e7015b8492f1693f2ef94ad7dacd53981a9c0458d19a9d5f428ddbe30103c053689f81b3c69586e11a5700ae149e9e63e5dfa58231348044781755b9f6027f48fb58442419fb291a3ae51e323c6cf70197769e027f011444ad2693a9488d0c79a1358d1ee39678aa51a4cfdb1a6046e029b3e67d2f97f64a7ff1f6be8e2e3860c0bd89831430152b890420a1752dcf8c0dfa051c385142ea4b86103049c65df011937b040ff81274ce075cced83fef64b4ab80426e6903d39c5f598f244c2c04ae0d5369bd0519627e3e4039c04eec23b25a53c9d6a9ce40a18096c1c91a234e8e49bda8f808fc0c5a495fff4a8a4de6c3602ff3551d336e57cac15818b39c50dd5a6a9aa6d632230be5f21db72baddca78085ca81c4f8ee7a0ef2dcd426092a48ebd764178749383c0c9fcf694d3fd83293d0381b120314a0eb1bde43aff803b99a9b33e7a787ec93e609306a52942ef861082b807871c56af96924593c03c6073e69cdf45a777c0dbd7a61d21441e99433ae07bf2a914474767310fe7802fadd8256450c2011763cab93b49afcaf26ec0a8dc4899eb3eb601dbe2266f83148bae9da100d7809b1c494f5ccda31d746a601ab0a53f5f5a90396b8e6299016f7944a7531d652a34780696016341df0853419a6e961430700c78afa07573734fb20b0c0326c91492deb445b52c5ae01730d9624c1b62945dc0a6ee87fc5d51b53fd8801610b48786586f86c02ce0d49accf145d34a477c055c24eddacaec181db00ad8f23c96ba398853c0e8f9666fbbcacf7c068c025e4c6dc84d1a31988848e013b01692a476caefe8fd5d16814dc0c632515e6a452e01a7d4e2e44e9536e689190517d4db9376cc3b91ca237088821d2121a87f9bd41b47a1e0aa3fa4ef289a4266cd010a4ef5a5471a939a26097dac1454785881c5066ad468009271a36f4c2079c0f109fe2e9e4a22e905b9d9b161e3af70a7408b1689050e4fb027d3671475b95963be13fcf96927137a370307271861559a46891c4978d05721830a625ce0d804a7318a992765d204173c72f6fb6d32c1079bb82983041d555430c10593d49284d03e65e2258e6e4a4d9fe813e0b004fb4163bbdf8b8c216595603d444db34d2129c9f0187bcd410956548e3749a5cf24f8d156cb96d4a265a948829be023457675028e483056d2fba315c3868d621c90e07b9208323584b6c0f108ceb4f6665d05e119381cd1ff7dd2909448d2a861b7008e46707f52840e22246b07e0600417f37bce3ca9145478480182bee20a0528400a2a1a20c58c195dc50466cce82a6ce0123816c1a420f35dddea2b67b60b1c8ae0eef35edc0b762682b1715125539ca4429b10c16e0af69a2ba787e037de873e95446d82c661087ea4e893262253084e3be94a3fc12604df1eafb34e64b99936082e684ca329e6cf968356107c8df84713177fc01108d6f45f3ed139d6696baec001083e47b3d89147c5fceb5981e30ffcc72f799343a7040e3f701e5e6ad3a9cda76ec928f61d588e3eb0a652547945cc942bc6c1076e53e8e658d96298bef75088784c776abd2070e8c1bd5abf4d1ef89c3a53ab25e1014bba934ca76dbc03231a47a53cdf9478e1b003ff6d7a3267c8e94fe875e0a0039b52e37a66f5e4949032074e635caba4b33ac82b39e4c0c7cef26baf501c78139e5270b70a31c68b030e7c48af9de09ae97793377017d5ee72aae041c9987443559e99d132b6a56ecf641b58ff5121c490bbf43b64035f324cf6a6a70f154c8e35706b9d629bd27faa64fc63ad8663416070a881cdf92aabcb3acdba196d98038e34b0e53124fb242dcdfc7eac193430f1427cebcca24e82e763ad98333042bee994273562dcb0e2116a840187194ee93b76c5cbc0bfe5db533926bd1afe079a0c6c6d85985d96fe58b33106ced37e882793be8881c95979f3885e6bb62f0c7c2e91f9f445f285fa8e030c6c9041b726e8e94ac0f1054ec412aa56eb44d29bfa5803415be1056e3f7a2c7fab6a1d04589c1933de460c106071bac0a590aeeb69276ff6c4b8e3029b553d4ffccd42c0b1057ed3373444260de11fd402a7594c82f01159459e765960eb3ad42799bf8fb50da01a33f2041c59b0b67942cf5a936a507eacd1a89187054e2b6e3a15aa3bbbfc2b70faeae6a9f37b432eadc059a9f068daa22a302982c910424832d885830a7cccd184e8a8a496bdad71450c109c1875336a5c41a6c0de4bca666a55c58c51c3cbdff819ef450adc091954c4d22bdfae7fa3ff8a28f09b365aa7f3c9bdb13ed692030abc6d4ca72fff589a1809389ec0a72525be297b8c4955c868b4a23d6023069251458d1b6d1c4ee0d62797b00b7a2fa67facd5f0441f703481cfa07eabb4e2a59e201b8509bca98fb1d3361f6b36d4061c4b607f928cfb3927a6d418b91a702881efbf942c3f2b9698bf8118351072248149ea49fd62ce3ed668c4b021830309dc56c42ae513f3bce46a2ce03802973e6fde4510d9fc72388cc0011c030d1ea360e4c4b2cf3ad9ac2c46146c0cba2747cf6928f8eae4bbe2ba1dfc6440c15f9ae4962388ce144d0df48c0e62038f4f70e92ca524334b41c4148d1a36fa25e0094e348305f92e2954b5da09b62f84597c8b6642d5a2c50d1b3266787082d1a8f9dd4e090d29a76c821fcf96c4d2c70b93219a38f55765a7144af5c804ef25d287987073522ac49b3c5e82f1bcad1f6983b6584ae761094e85ee7debb3cae6299560574c09afd18d1289ab652b11b1324b2fd5ccaa34b2b31e93e07348217c2cfb9f51430292609390314a366d7561a20d1b4fe3860c0b388d3e366470188f4830419f7afaabde65b828fb020f48b07fea2732d5aa23486e061e8f6092a95e4b93a58f1a7838820f2af5d9e6b47f953b1e8de07a4f59bfbb65b2f06004a7dc4463eb6dd2417d1e8be0bf538ce43105611f93af011a3f63467f20a208ee2ac91d352a62ee9cf2b1e634de0a2b3a2d118cd610ea4745a47c35156537ac9071053203782082b59c4e4f9ad41661f7c79a153562d090a1813fa59c4dc0fca971c50d1b4a43c68c2bbe0a7d000662148f43b05b2aa40ffe5d1194c4c3107c2e259475a712011e8548a97429c44b5a2504a7bb27af829b485acfc7cab0a263c4c0076020460b8f41f07572748a4ec1198908824da34d4fba9849764c3fd6345063067a048235e96e9aee44084aae811a0d688007204859c14a93b5c56029533458ecee951c573d0d68a04603aca8f180162d34506386c71fb8346aa4fda5ad2715f958cb0178f881ab741e2dc7cb9c23e77caca51b5770c006f9b8d155641547c68c7c00066214c0a30ffce77ceb493c7eca2ae203f76e222491a2be562bb307b63c47b0945fd9ab4c3d70964943f39d16393a42038f3cb0f9a2c42564d7030f8ccc917972babcc71d588f29be93c2c4f46a3ed6c83b0d182d5a3c0003316a78d881d35f31045171e4510736e7b49b0e6ce74a9f7347eb3107b62c2daec64ef190c3964b46957cd8e88f8cc3d1d3e53442f557b770508f37a8871bd4a30deac106f558837aa8413dd2a01e68508f33a88719d4a30cea4106f518837a88413dc2a01e60508f2fa88717d4a30beac105f5d8827a68413db2a01e59a80716d4e30aea6105f5a8827a50413da6a01e52508f28a80714d4e309eae104f568827a306151ba1fb23f6852ba82518d193314603c96a04a508f24a80712d4e308ea61043ea94512d7491781db1fb1a0eeaf64348b071118a12588ec9f935512cd6308adf767a97e8d7b08e1a424f89a4ffe83c0567d57f9791e08bc84a4763f3a3597b47fc089247c6b63d54511150f1fb01ad953fc709390f4f2e80197e9e31d219d78c06735ad4e19538817e33be0838bc6bcf6a37578e880adce144b1bd2c83fed9161a33f19c123076c56d07d5d9d95397d76040f1cf0ba99f242575abc147203d6549b7a32d34964c8e51c3c6cc0a9ac549547845e07c9c1c1a3068caa527143fb8348173978d080bd4d23ebf3f4aa3d64064c90a817f20851a63f7b83870cb84f26f49b4cf126e9490cb8a0e6291a226f060f18f016e36ecee5bf25d953068f17b05e32c5b1318f0183870b98e42997eca0be29a8fa000cc490e1d10226c5344f536a7addda173c58c0adc95e91f1fef2536b85c70a7813b2926794a04ea8d743056cde9692174133088f14f0b9365734a9f6b9520e203c50c0c98916eea63d8e57fce07102be246550b12d29a195b2838709b8ca6e975ddb2e95e6201d3c4ac06bec8811f5d273274b0d1da3604b77d6e8a7b3b41a355de81005f72df244052d3a3fa743c18aa424a325d9414a8814547844e00e1da060e2b8eb8bd2bcbe0d910c1b7d4e091d9fd00e4f30d963caa01f7f548c7d123a3ac18edbb8585ed0f118f21d681b48810e4ef0a924e8e6ceee562f89f1346454b19be094ddc798ccc26a1b313c806ac4983143c606d634c1a6124f1acd5c2b746442d512a9334488353e6c58d1346c6082914945bb94279658bc3ed6d48ad0710936e4989bdba3b749cbf58715314c2dc1fb27af105409697c44c0031d95e0ecc4ac4727a1eb2b88f8a183128c57596ad0d6b5f755c724d8936631a79ea8c9afcea243127cef5747f6a4d164b644c2e0ab419d8b0591d001094ea7926e19cf74848e4730ae492675dfd7cdba3882cb3569faec64306d7a368215cf1d61257cb3999e5974308213519fec4d338be037dd074ff9a40856d5420e2951457aa8b4d0910856f4b96d5a5649ac1d116c08730f163a0ec186161d43293d0dc149fcb7cffb4e75136385e0f654862729b9bf7d734708ee7cd3ac443ca4909041f0a5a4a5244b25a9a3fbdba861850d19ae19e81004176b637f894e21063a02c1a624dbabaa3de9698b860e40706a4505e163d695a1e30ffca5892491a3e5d18f91828a0648e1a2458bb22d74f881af90b72d3ded5650a53eb026279fd0e03f1ff8082a47d1d228425ecc1eb84ed1927df32f7dd4e8814bcf96643257f2c09af294ad1372e7ce160f5cec20e3c5ccaa783fb903777253985055a6ef4b3b3031a689e78feccb29ac0393ca44248ba774ac52d1016dd12d690e9c959ee53c619be191039b9248a3fecd3ca9c8c781115613e208d5ee240307ce3644678923d3fdf906469748bfcd904e640fb9811399e935f9ef367041e420498ac5b0818995eedf92828ada7d0dfc0731d9a63da420b9a2066e9355e7ce49023ad2c0059d47d68aa7c94b3134702d5a11745b06f7bd3acec09ae7d17a4ac8904742e4d06106ae6fd42461726332cd94810cfcff67d2a9a2ed34c53ac6c0de9a9aac79922725598718d84afa43f452c85797eb08039ff57d33b625952de68081539b3a6a6b87a857d18f358fe15fe3468c1a326ef415317ad1c6156fc58cffd88e2ff049749d4e8717b83ea565292f8e8e2e70398bbedf1c547bf5f25870a0ad8000de023ab8c0aefee9c61f8f0e3ab6c05ec826edd28532090d3ab4c07a9f54cba09448be7f1678935d25949e9d05bff5412708bb6081affcbe579e9e23c45289d071053eed6fd6c7bc2c1e54acc0a50e19ab02b71754a78ce9eaa0026761963284dfe9838e29703fd2d3424e3a45cdb5071d5260d374b9bf755dd21c14056e3cd79d8998f44579a0c056fcb1ce4192e43cea1398a04bf372d4ca48a1c3095c9792c1ba4f3329a1344fe86802a76ad45c82d0595290097bc691e59b1e5c82db21554751fda2d0a1043c9f1495243041b4d784c40ffe232b486083d269528694cdf67447e062e66021cb4e922a5d7718818db811d33649ef107d11d83cff113a377aca982102779b3145c49caf1fb48e2170ab93d4fffd17424908dd5b3f39d411042e28fbce373a0b04f636057def29d33f457ec0e728d1dd524d280dd58d0e1ff0a7aa1732a29ef214d3034627bd7ac99052c654e1019bb52cff5488d368722ce8d801272a4b67a6c6684a4c3ae05a643adf4e579df79203de72aad5ad78e2804f427fd450398d698ddf80173df1e09795f1f2c706ec78c82faa4bb677694dd0510376a47f1a9d9839f9a4d0808d90ad7befb333607c43d2b59e5647d857820e197029cfd46df48ce79f8e01a73198886315b45985dc02a103067c4ecf41b7560c9d3cdc1f74bc809d68db764aa798126272d0e102cedb73b088fb5933e889133a5ac0c4cc31c572fc8eb13e64091d2ce84a2c4d9ad0b102ceeb4cbbbb5d54c0860ade39bc2c4db051091d29e0b64cf956d0983a74a080d3572652810f1bfda29c155d058c8e1370c25248b9a5fba3ab71e83001d16f6dfd7d733e6cf40b05b468d1a2c5878dfe281d25e0b2da5aad8bea8a1a2986bf5f61e3bd068dc302021f36fa858c2ba868c02178149c526af52c8d8dee8f8982d7949ac1303c71248b95965bb20437b3881e2be6a6bc7c39de097e258852ba62082abaff343c0001c309566f3cbeaf68cfadb56d820dfaae35e4f61f3034c1e978c95310fb4da36e191688018c4c70ad15949d8d88092edd8f249d9426a5b479094e94565015fe1ed7d729c0b004a75289d41021960eaa429560ad42f49cbdef1b4f4b09469e451add3be2f15393c843335a0ab1f2cc79624a9142eacb001892e0fd734ca6fe70ff3c4aa0458b162d6c68a0672422c38ac622c6106044c23561a3ae468504374982b2d31272301ec1d8b59b76fb3882cbcff44f9ae24f521bc19544b151ca433453cf083e5a88141944b4084e3d37a8084688ec7722d8bc69574786e0ef258308d662a8cb7475b70bcd21586ddbd8a3272a648a21d84f216ab6921682bd9c21e6f49ea9d2a41082f5c97917a9b383608392a76d520a1104eb7974aad03003c16d98ccc16450c23d6780602d6d7c1fd3140c187fe062e92cea64ee29d1350c3f706241c9a4d64e73d5dd07ded486cc20db3bb5431dc0e003a33c5fc60ecbd7ddd2071ec61ef888a622a7f5a4bc2e450f7cc54b15461ed89455caac4345fffd55705461a33d90378081073e53148f74a92ca5a95ab440028c3b309642cbb47d3ab949ac26c0b0036ba75f62b994deaa7c877f8061d421154d9aaab5ee827e12aa72b00e061d18cb67152db74d8c03c61c3857b3e0633a88a4410f430e4c4cf51b4c4e3e0e7ca70a5113298ffc09820337497ef4382a7a03ab5e1382aad4be2c1e37b09b4a59909af32cc44e1bd8d39b44a4acfebf31860d5cc4df2ebba45903a73f890e7a49433a550d7cc57f1d79314d0357f7afad6b213f5b8a0626795d10b22c67e06470ddd038763147333042a8aef0175dfa352c03abdaf5263785184b27039342aa1a69254b75ca187833d9a5fa458aed7662e077f25608150f0323c4efd533c8608001116db5f4cc9822ff29dd7c42e644118c2f30224b353445d40bdc64ef91f941a40bbc7f9ed0a85183c105ceb3ebd727a9749e178c2d307a3c56125264b4c05dcce9e258d2bbb6616481ebdc41c8508d142728b32804b74ab1d0ceccca4189a68a2198b20130b0c0668a625592734d6e0dc61578c9256c7374658f5a5b8153324ca7a4136ca3a5556047bf5e884a3229c0a00297647f164bdb6a21531853e0638f7eae6beda0eded008614b81ce952c8a1d539074b1530a2c0e5fccb5a1b9ea947580306147837dde0b14f4fe0f47be5a47becd54e4e60ec3f27fd7a4610494de02dc6f74dabaeb10b13d87a494a4cb24b60bb836add3359566e52029b4abb897e483e699292c08ef4e049a9eda05a2624f0b13fe9a7b70c7daa740446c4e839415da9b72b1981fb370d2a63ff45e053acfca13499787d9e086c081331878ffc7dcd0f81ed5b312d3512edb42f0436bfca2d67caa3af7d10d80a91717c3f0e04ce7bccd74f886ceae33f6027a99447072fdda6761f3031beb9e4155d2a35de034e234a50172d5f6eea3ce0638964074c8aa3da4c669f4a4c076cfcd49da379a4fc96e78033d7a0c9d287ec69c7016fc1b45ff0ce4169d10df8a817f38564a3e2e6d880ef4a723f4f7f672c6bc0fe47d0cecf6551431a709f25a245555dec67c089acf14ba5499e6464c04ffeebe8a5a118f059ad37ef650f0cd816d5b71f94ceb14a2fe0cf723f244f8db9f22ee05784246de66901174c67133a84a4cd640e0bd8ccf40de99f4b257956c0f59f9d27fbe0935447055cd2297e795262a7d449c131c8faaf5f51c098a98974fdd14f594ec047dfab57155d57ad093899734a41bb64d6248151822a63acfc9cb251b06dc98304dda4a5ac1605a7deb2994cbf9a4a1e0a2ee7e98edb2e28f8f45d32c49a904f98e191ee37e3092ec97c52725026938e994ef031c4cee97c7207ab0c27d8abcf8ff5216fe46713acef8fbedbfc609ed504efa5237937d5d7b699602b5f53a9916082d577ff941f29997997e05265ce98a7ea46374b7032a45adcbf12bcc6206f627bce5257a1049f93a7bc49fb493069349374894b8215cb5cbda746c60f4582d76b911d420612bc065361be9f92a5f7116c3675ca44691dc1d989b58f321bc149b175adf696116cb7e65eeb05ef8fed22f891d5bfc97b45f0715272d3d556fae944b09e39ee6d4610c18569dfd44eea21d89844cbb44dc711510dc178329173da4e0bc1ff9836cfb6a3fd9408c1e5dc31b44584a8fa0f820d9d74fa14f25b275f10ece914954c674d42080582092a5e9d9e00c1b749901e638708d1f903a3b4a58929b7e5b4fb819fa469c927574750f681cfb553163c46f8c075c9fbaedcf7c088677faadea90726491c9da3f668da4be681f58f15f2a94fda339678e0a4e8c5645acb3b7065292b85c52a2582ecc0879c826c8fa754077e2479a4495b3e6a3a30597204b3bc21e5cbcc81dd682185d00e4a2372603446b74e428c03eb7ffa467f1ee1c05ebc8cbd11f406eefb82caed3937f0395d7226a13da713b9363076397e323d955524c78674881e3b8beed6c0a5204c839a9cf46fead4c0598a5a4451575b4a69e04b465291cf3d848ed0c0b9a97c7a1f5a3d4467e06a5268a81fd9a763ccc0e79cb3931a1b19644c19d8904924cb718d0cdc570cae2a6a93e5c4c6c0e99c9c752a1a31f0ea7aa3348dc912a530f041d458daf879ee20303031fb4357b28fc9f285f2a398e590e2053f5947bac0a729b7e09a319832aff04012e005174ef14ba86708e149bce286150170c38b2d5c994c34a54a0b8be960be1a938532845c42a464fe66718978a644b0b08814d2fe09c9317285ee765b4b259367412ba4b4348660b997bf2aa082b0ecf142d2392ae0498ace2622522ce7a650e6184bc890a49ab04e0a9f4aa2efb328ecdf95552c9e1c0a44f1b0352137d44fb0947b7c8f139a9473e948922bd904f258b89ef877105e55da78c18492a92acd3c9aad5902a6be9d4348baec6ef04209be7625a526b87bec4512b0d41953c87b2162655448e18228004af002095a8d5dfad078e2c511ccdc39fb428ce0897f2e8f64e2451148ae2946d25e9549f9881744587f424eedf92ee60a122aa4706114f16208bb96be48ab8cc115c26a3a998fa97b770f0bf1220824f9a192fa9c2c450e10ce9a26684c5121850b0388173f38a5aa5655bed41e5ef8c03a6db913547678d183d32da6240f4dd93d963b0671dd98342a3ae8f08207bc45eeb5a483ec8c7fef800d2909cbd62d16bada0bbcd001634ae91853123af4567b9103c6347b70092e32aa5f38d0442d795a8c559a2ab46d92e60a317472edfc8b1bb0a63b56ce51211bb0d10e30366047595675b2bc06ecc53179a34457a90d0df8f224f374da0dc78b19f0bd9bce839e8c8dfe06941bbc90017bfd9592a86f6bc09851a3460462c0e954973d67d0df8d180c58f37a5bf5cbc07801ef924b044b1a43049d333878e1023eb4a48e7153dabc0d5bc058dcb0aa90445e8e1e10dce83018bc6001a3a4a6170b15422da657c0bde4d8d16dddeca3278b172ae03d6db29463997a7f3605ecc58ab7257973aafe5ea080f3bb36adfbda9f1ba4c18b137091bbfa42e4d3dde17961025e821e19399f3682172560eddaf232b4a70a2cfe8affb8c135a8681b8e028ce3a8441005726134140805025124462140365d023314000000102095c6029158124551aa4b1f1480035a241e3e4228161e1e2214140a45e350281806020381a06014048342a15050208ca79110ed030539247289b43e761e1986a374d89bbe22c2655072986eed2b5c88bf25bf9771a9ae9d1924f64b365d39597800048471063664a1864943a43246d1b880a3366b2ae6e6a736d2a50956680b41d543113034d8dc82884681c7d2923d169d62fd157dda511cd1b2ae491a8e706c5ff6180f37c4cf7e1899ac5b761890e4114240193c1b66dc2af0bd32ba2ccee8b810610218568913dbf823d134622a92b47521a131beedf7228d9efea21e345e3a508192e52e0d8399848d602f6b648ee5a349cb8c8bda4a5994e15df05c3158fc7060d47f4d9136b4569e3a41e67659e834535d580f504a7f06e83e821afc0f9164a9b5686a153e0390e471db7002f0bfebdaa3d6eb50b041383ea8a01014c6fdc1d633a689fa4fc2abcc2807f64d9af9ec7c5da8fa07665f9db98fa0a2aaf2a950fbd9bf233a99d819e99ef748499702d4e15b82baafbe91584007e4b56a30828d0f8edbc62e9e5182b1a22bab2c99a7b14b8f5894a020ba807d68a24e26e29c27f3d1f01c3c88478184cc0031f6d96ee7793480b4874b6be0c8001274248affde3d0b271c45c80dd89d0c2aa1e7a6c0215f9afd34e319bc5121afcc9f37f6ab009f64bfb500814369761c56f1e5e498d451830180be21358753f6f084926a5304fa02babe3e5f4756a83fe06cafc56b78b57339b349f899aea942a67ea2458c35db420ee2609e7ccec52bba417114d6784ebd9c1bce746d1adf838f4e97a2532da36065ea525855e1e7e5626c7b8a6fa8956563bbf768f68e079b18073b2a264de28ec2635f5b88a321daf9a0068777249b61a10d17bf7b9cd10d350fdf4bbc21bd5aacf93bfcdaefec9e815e832d553cfda0731db5b2ac01eb7d09432c7d22efbecd4ff104236df7c50ea98dc071484228095ff577cd09d6d39c2b6248625bcef5d2554e280d8752acf36777d38c154291ed030e3ecda1e130ac486e6720e29e4c7b69c502ef09021fdb696a779dada205a216c82987b397acc2591ff1a9579179843dc2a4b565083a0b6978113592a5029cf33db2fa345798cf8e9cb0672341f569f9b0887b9b8b1d21e72b8bc370635f1d9946faa416f113590bd5853bb8bbee9bf7d10677c391ae528874f3b24c3a630d5e020269e429ca4e9871b0a1f53347cc05ccac4c810770ec1b3e653d71d623504be7809df2cf007177c630154d858cb1bb79d6690745e3d0a54ef535bf8679d78bedf0a392c3b689a5ada03b776bbe750fedd2cdec76e2ad96d9be00716307694ca2924b1c49cb7b57039a6509a4580bb95cbbe350581c36944dd31acb0893ac7afbe547266c756e51df28d44ad828d9cf7f40184f92d111f38fba649b0faf3ede615752959170736921f0d34d79abbf012113d38267a486b24b7251c521c4ba4365a52468273774c47f30f7f727930265f7f30888f75b8443b28398cfe55da4f5a8301e3a41206a7b1cd0f30a885cc7d42e76d7c45fc271a7b5fe34701991a9b54f16961d9992cfc79ca890f69f2422d41172e30314df0ea3e95a3085ee3ce021359d329774dc7df3bbcc4f85dd88014bc1f27afc9aa371b265772ff9689b5cfa68f934080d97de223f7138869fb2952899c1702bdffdee8819f8690e7424138b03c08a44eda3fe838641949850b59c46541e9ffa63e105a6f761e4fd64070029b31c172a473710ea55717fa36b1102d969ca8111ba78f7cb317df2b71e0f1e8207c31d5120fbb20f65b2d12db9921eb5b3becb701ea019df70cc7a6008ae78df5bc65387698bfa13507498b496ca06e1df443b6ca074123d874641b9b096c2e298e31182e75f58d5e30e0fbacb916acd2bdd5758f2fe5cbeea6a4a7381d12a7fcdcf08d1daa332be336a94efc24e0ceb756284a83c8a438fc7ea1aa05b9fa193a67da73c1c0b50de341bda1fec1b5dac3a5050fb4bdf573d591c7ffef404733cdd407f403040c3e1f7d38df683a329aa50d47044daacf2fb9fe7e0c04de2acc392297eb9d3c61e6c1a8332dff9b51f021a897fc3d84de9e1438fcb93c65454805bc85aa2496093104865633ae749463f688f0ddc3c889e4869a65b370dc56679e2c9271d2c3bee1bcb608c6335c58941e94184ac231af6044771c7cdde2254ac601bf6e2ad60d02fd73ec894b3df6c727ac48d27674f877ddd5d5fcf385bc10e51d7da8be224c7660120b0904332ad44183416d12294b4167e3589ee3b13848068a4156a541a1ceaa9b1ffba3438c62f16d44049d24bcdac1521beacc04093d0617f61c344037d3172fcfe4220a4f7ac891073e5670e0284846a9632c526c90f722f00d2e82b9ffd84399fd52e5b9b3a57732842a04b2da109cc9227fafb0b1636986ecb1a3d0ba2b5e6d84c33a3aa515a2f74a1050dfe5320a41bd69c2d7506c2d2e4fa3c0141027257b2d63f2022560034ecd935a57dbccec727228a620571c7085ebf94ef5a0b0ad20ab0ac66b9608396a35f4566824383f6262d01d5b7eb7b48795d0626db8df3b386c0f0911aae69371c4cd767e8b84948888c2b20c9cc1641a0d6f4b2743b52e169340b24195169234450273ea5686d12814a196e165bfc7b5e77445ddde7fbbc9203f9dc5f25a6aa9b8ce6d5a6e85ba0a3b0ab505818d316e6484551506139627e255796285da553f35365a59189526fd96902867440902c531814986f3d2bfad79519778dae38d2207dd261f0d94ca039305809a72302b1031bba4451d392ae7aecd106949ef38d2017259e5abba674822cd84663375d00230392a95035f52c02d05b3f8df602248d47560e5134b0b4d650a35311fd04267d043be20131b8fd6a6b79420d68418797c3211d984592d56057f3680394bb7b1acd4b557a69c81d534afca985156e49ec53d69400de5340bcd0ee92769b41e21d44f92ad31fe765745623e9391f6e83095085a17197174cb1468aa1a01f8577ad3b1db12d1abfd479429fbc5036ddd0f3ee9d19cd0f6ac81c0032571bb9d00bc17a8de4ec1923364c205501347f0363a05b9aa03c6c490d8ed4854323dae40753f654fb8751811b4e1be1a50e0b237c587799d2715c287abbc37f7421bb5e04780c2c6e18e0d4a1eb2ac0f3f6332d293cd9e7a035e10e103bd0a2b69f37a0ffcbc13e2b5d213a4c09ee24a6f088cda4e4bd2da9cf9fabe737805a3f573d34a4ce9d6ea10a0a122476c5b2736d2bd5d84b812befb60e8a49d040e5abf5f8eaeea0a77b07c3c19f2025e64fc9f6f698a5a44b7d52620671ab5e9c0d9152b3da69d07a3dfebcdee89e9ae95a426971f45503cc4bb9f15d17dc5066460c45f8fe19568bb035a03b292e3925852952fb04b8d01219eb0dad294ebc5ad720760e4e54358c3e86e3ef051362f672aaec465108bbbbb7af446f51b8d4ee87dceef479e62b3114470ea2241dcd7caaa2aa0c29e17064c4d178cd55ec0c3585a533fe85d410f69994efd41a16861599cc5fac53fe75c3df528d25b46b0b9bf115eeee63e3f27478cae8c718b6f09a2c98589900245f387f024c58472e9a4be920ae1d3500cff6357154cf73a93c8b02a07a408d0062dd845fca02a9f7f620e836d8d447aaa0c45367f67d4b1c73db6dd50d1495f05519debe85c6359ab5d57d6b02304eeca66fb343e01b76141dd5a7f15598d5ff9c87e560e8027476e53a995f6ae1318e37dbb272618423f6ceed1708ff3b98c8989af9209a9a884182d48ba8ca5721c840ad0295541dbd6809864c9f6a759f5a6b28573ca334311b94f04cc2fc767331a7c4636eff5e663f59069b158cb491c5cce1f0e506f44d6da0b638eb4ac6665ed1e7de6ba6e8dde152897ea8e60438083f2396abb7cb2758a796bc7c80d1f3d8c3b380243359dd92c0b479368accbabe977c70faac4b7ba587293b748461321d3d87fa9e97b341ffcbdd30381b40216cd25f1c83914e2a38ce926008d9dcb10475155442126ae950c324592a582a07261914df6f442dec4ba72a3b9bc56f81245344891d52927dc7c320b39161bce048a2f88b162e4501380c2ec136add45837139e9bf60d3663afcd1391a0fa3dad9c0428143744a5208fd5685e395c3fffd69491dd8ff1a8efa687e779bdc0bb2ef96b2de3295b71f75ff524c84e9b70004e59357a3fe07b0d98a1628e6b6bc4ca1e5ec855315fe53b616e7df8488a0d5bab6b7586664eaa29629839f03b1e5da37877d7f4cbea8cdec92272f7780d17ea13e9a45ae57781ce04e3549491d5e74c5689881f8051318570452e601a4d131a44285d75c93bd2e6d81f0a07f4793659c115051cf97692a4f1aeea35c04c8cb76fae29b7b66a0c3be5a245a9b46508530f9b5105a1f0499899ffab25cbea84bd8fb9f8a8ca2ce86ee71e0c655ea0766fdb3c66ec26a4acdc67a52fc8f2ad2f82f35e73c7f9ee64064200839a0212f4cc2684a6d0e05a0c26b027a46ef4815d14708af3dbc70c935b0d1c799311cc94f47ba395569fd3066215cac296968d9df1c40b2e4ed724bc0e7a08fc62c6d7214e08d914dd01665ed08fd7690185b27fd2e5af30b579a0f8cf9f47ca8e58ce22fcfd84e3eccce1e857db4a7b062ebf42cbe84454443a59d13d21d4524b31e1f7f6787e825e219a5caa846561890cd7288cfc1f268d2113b32797209c9b1fd578a8d322b75a7ae9b043c8f338bb1fd6507f4344b93e0bbfe148a9a1c7046552b714d026366d10e39d54f787b5dd93ee42fdfc30a7723064332ec49e29a941dd08c1c118257fadeaa60f28c914c9216d5fa14346d1742d9347a839adde94b44f5b7dd3c03f643b31b049e3fba0ba9ad81913e94c1d49088ae21001cda54b5600f0b9816c3bd283f235088425f498cff422561d838456ea95342a76aa835728c22b9d4887c93eb6601872c87e5149cf337860542da301dc2c60ca989e540070924d87bcdc986cb539a1314f811d52216a895153c2a9d88c18fea5b5e22ecd83ef32ca9b617091663b18257c7a4728e316a4720945ad76459e04f3885f8dcef3f40568c214c5b7e1839a479c0892cf830d4ef1d80f453e43fde5a9d0662165a1da0d0449f67955312c1813838a18faa31e99be156e59cd6d269b42b0510ef530141a707dd027d9d59dfeef10ce4dbdb7c2321b977cef74243b22fed4138035295bfcd00bb540c5a3fe4328988ac95bb1f316cf179348d0ffd45a845b77d5b64fc57c4b9b76811feb4943d3021346df28946bf4ea53c13e06bd19b096928317d009c8da34b4ec00fd2e4c285ed6ffbd0fd18afaaa43cc95e4e4d15cc4630812adc70e8012a5929e902d0d48acac60457438b4f92b12658725f5265c46535e1d528256c57d245a46c8781fc3af9418379b28a428ab741fcba02d4a0ce648fcf1649ef2cb9b7a411e82f0665c2ff5c776505b08aacfaa9b2c47604b4a144004d8304e0c4060a3aec688e7072bcd276a544ab0708345471b8b294804f4df881e1979df2879741e3d103468e1c319f197678bc6c1ca61627d6d8403394cdaa853ca99814dc0f8c64c320fb54c30d4d8fdcb6c17c716f01ba5b7ccc3cdd3df7d06da2839aa1fa0e41bedb0a52d40bcae2901889ca9a210a85c4c95f1cf298e0f2ca508ea0c9a077525896e75c58a09b66f6ee34884438bc9841b2584e6fb36b62a545835c40cd0c15488ed202eb74e07150a3e30614102de9ad34de3c7cc936f1d4ae266c6f0a69fd8daa1ab3052a08b5ad94500c9881828c7a2e35061d1b059d6f53e8e4cba6ef755bfa416804745208d5b5894795c82b02b8eb62f9a48bb43ad07db833d765eab20a7af6a3af28117c99c967972845620f04c89feef28085ad18cbd43beec6b720469bf9d12aa02104d25748d5ce83ae0338207538d26677f6aebd0046f563671326671b9b18801785d6353e07a11cdc55b724626ec0b6aef64d163eab5ef4035414408402f8090aadf551cf0e11d2208a33c90790738b7433db4776d681417fc459216d17655acf5559288b21518ec79a1aee94813b2d62e1f30d10a4101d11122e0780f84d2b0c4b8d526c99354128fb3234fcf42b54fcea884bf8d24c69736bbc20523bde04a72b65a85481469b5d26c8dd459906f0f5b5b40c15c006a7b2d5274c86ce7f5181a5af98e184336c1def774f3fa0d248bdf5578e31a149686f0156ab7bad01330c4bd3aea5476365144bb8a11e9b7c9b6480045a31dc759599d36d84b0848e60026ed77fca3bba203e26f7d20332d12bf3949708e64cb72108eee635dda391a0c2e518f82de1d8fd70b69a5a65cf796e7ca3af949918f00a6e7d24293600891a9985b893ad446aabf100b9c60c3e4d765c020927ef5904395ea05e4fafe054b67f8e397b7a7683d2240a33c36aa799b771f0577c91e43243731058d4d96f2246afdd3184df8e6ae9d6981317fc89f954f95507b0631303810e0c6de752c2732a4e166b73bd56919b67ac3ce4625a0e8c9e9929cbfa31e5cd5e4429cafad6c8508dc00b97db9da045e3cef6e8be1af53434d9bb17b25c1d1cb80fea8cfdac944cbb664c6a7322a2dedd9de74e0db0457cef392f306f51cf4d5a444a5e86b262b0a9e8d8a7784c4524c103edf575ff219a8a6dfed551b236624d7f9bc4fdc2568440c82121378ac4a7ce3d8452c216635de54d889ea3ecbb0ef3ec1c966aba329eb565296a6a7e2e2c3429104036e7b99a29301f10647640b1e90202a5c1e846b4182591b209b9f486e69a75b323fac9afe739b1b39bfa912f592a637707e5795f692a636707e2795f0524636647e2835eba7e637187add18ed0f3636c34932ec9b07bad3760f980b3d1c8620f12db47b8470ee07c7bf4a25114974c6611ed5d927b12303855bc407e238b0490e2a957ff5ae252bd0d75c710e42109677c86858101dd686924ada0819a65db5de63c28af8b310c63dd0e805620a5d0452c8e357b4eda6a5a560d50e092a1c02dda0b2ebbc4a8eb46b0452b399d07564a23324701ea14e8c1cebe12c11d65e63627830d23d56fec1dfdd45b1bc6a2d9d3c4e5e4585a631aaafb233bce48c9e4c277605878e69a6f22a5dd87b151368ba6cb914173d429c4b622c8703ea4231b44cf8cc12a35519054e8621daee1bd0f68c4dff179d4b8b26c51544b6fc9ab802fe46a8f06421a1e2a680d834dfe247c033b23562a5219f74e333de4a8886ba2c3268d2c10d3ed3e46b2a4cce30c600f30b2ac9a7dc2a7b04ffcdb0a3317aae187942caad1ea373a251491f494d9397fbe75d81325b0fccec13f934ab63d57487d05d1a132dfeaac3a9df53916597e5868403f73b4b08d64bcb3f47f59c8ab65af564d72ac9993ee8ed1aa94ae3dbade26c1e151c6639655dd8a6484cc14205be82fff2bb89da7067c0c91f565e056b9ddb7c8d994d51ec35a937ad901f44e5df9d398d853f45e91e9d5d8d8d5e2426cf87b4ca25d214b59968da25c690567ff74d15a50692f8a8a60c71950fb789c7145888bec96e1849ebe7f20f8d745c643d738c8d9810189528a97805d9a428892ac88172c5466d0a993c8bfe21d2150b8b16762e2825fe727c3e4338cc4d5c92d84522d1f26a4c99891383e78d183347358d296a92552489ebacd4b23f55f29ed7a868aea67b0dc671980311c7806525cba15a6f58acc9c463b5a1a5d25a2f36804d83b28ee2830999313c1e962e348d75aa9cd0285820e4f28a2f3f4c1903e8c30f76c64561e12555a813217ac33d6ee64f333dcd030c6259cef7390381f4458d17f39d0d767641c633f9936257e6f6d2ca3707a5317074a29c6fde3d523ed8eede86d224dbc39cbda4057857033c527f3b54fd5d61c32289d6f73a8c399b8b6b183af167ee3991ab05274e7f998ff876ddf2b1afac4136a747c271b454ce07183811da87f0f13aa1f100db3adb71888e9a02a954337d113c792f3388d600ec9760a31586d0c9ad4d6e3da657faa687ee69a9068e45d2b52dc53b43e726804c34f0d61954f48e6e4f8ac78d559fbde6b170113e21eda5d4129ab00a105c66b4b729af618b2c7c99d554d86daf2fb39593fea64b4b31395647f6f972e81600a1f0deea61670cde4b98b479abad5a34c1d566b1e9b1ec90e24ca796a64da050b934e844d49403fe2a2d90b60831a7a7ce92877d55a8ef6628880dd4b254de7aaf961bf582939d264d963e95a6897a918caee1c744015ba93ff47e489790989211c8da878a5e47882bdfa750f10cea0977b6073468befbf2350c9193520b3e88c3568dd58937745e87a7e9728d6991ab86185d16c99095fb4186d901c17d5ebf417239e86f5e68f931e5d2c644daa12744ce781b80c1d7c9bd03f0af4b64427e0ec11cfdc003833f2cb0796ab746cb81c0eac96b103af513d0dd66e1b4d0401a56ae6ff8555c325edef8cc49d2939e6b564fdb95d601bd068d42a7f20d73deb5713e0c251c6ab96bd6db797a2b63305f6ddecbfbce7c0c4482c9545a47d1c27abb55fb52a286ccddfa9b4ea373814854b86c8089281cc8a8d8134b822239f9e22bca16907a54e5a992a9eead4a5ba23b84443082bf4b70e7b9784349151f273a26a6fcb82385373d12099412ee70eee97c1921944a04972491a4d6372c2480d23514a9abe50807cc336b712f7985495408106a60150399ad0714ebafd8571b79c1e6d8f908a398f12b59066c88eaed1890967bf564fb324d6767fe2aba7993913a9b78d846c8f9aa0e9a3b6fcee8f170b05e9fd574b939f37c3c5459a6d54dc29e468f0f42fd84717db163e646c76ff8479c5ccba4baffe06ea6b2b61af8a4a8a3e699375e286b121a3bf34dd648acfc71b62040448d765d17b644967a489f339c215a1867eade90e234a56df34a9a2cc9a57c29ab6ac02f40e6c961a21d16f91c4c7b4df9d08e4c78c6699bb2dc37cced5d4600cccea58e5ce11546e6a0d45509701449190b3dc1854ff3f42c766c0e13b73343ad53c57537c56e6bc7c3f86f6baacd23062143d077172d55da3ece9d1e0e61e8205e238e87e1ba3e6417f5699801658a4c30ecc52efcefcf23cb31d6c11d7a542e56ef0c9b5f634986dc99429c831e43a6998f1a5421c2b133a154e1f963318689da601f698a851a5c7e8e6c3ba24a3f9873f3c65781699ec6bc66ac8a8293e604b301710f21ce91f59fc3fdd7f628c208fe50b0fa95b83354c3119ebc47f647c68643775c62c26e645932188ff8c56564786000a7ff868f5e4ad8edb3aeff1b6f2660b4680dc47b7a2e5d5d87e4f1a2c8ff85f3d16a367bef964ed9265e7bc90e20e3c98ab082e2a7a8e5218228c3fd2fae03defafba0f35cf3663ca68c2a087a8e2c3c5e01248d04f14200c1e1aff2c422fa5e1e58ac808d41162df5494962e6f9eb0a291a427f6d7c71141e95f52b17de0b96f29aa9042845077e839ad616dc08321cd57826885507c5ce946ce4aba2c409d97a01d5810d231e996374ed0b3843c4f962ccf27c952a25e52503c452672b82e78d5db8a74ac7d349ea01987e08a686d1c145a070c7e58d2fcf09a66db41335e3fab501a3dd5537fcfa72776988cc2cb508bce4a837567eb99d12a85e46ae056494081d17ed4d0d01ef0b069476f75188239a3676828893fccb8ae23400c0b39b97024e1d89ed3ad18359399b8a4f62f00f650e92c249a76b60f302e0295bb56471805271f23bc430339b225426798adb97c8ff044fa6550b7b7f6a2050747ad6865bd9d43d5827b9beda01e701b1909c41ad7505490bb87afe68c38381b0093f13016f1f1f4e408f3d0b1feeb17d711ab0b908d1aeb3c0c1346af078903ef9b110e24137fb44bc2853596088700a51afd338a410c871abf635cb2f2c6191aa108dfc61425bfa0e7906f481cb1ee00693e1b4ed004f607a3e5f5206548f2ae99903ba9e5aaa5d489127cf72c283447a6429e2f1d915b0002fe94ba52be8408d132acc065d2aba95cbefe0eaa508c68f9034c88883d4f2c6d6f46dffa099c0decd93e1e3ea8b659bd2fa20d2376784c3378d51d508c49eabfb4c44a70e9ca6b9ac00a3b8da9d0435d28409a56b6e43d436f9931ded9ee69ff92f2dfb01f8cd03d506fcc921073f6d5550079eada9985bce1c40917d6fa3ca41880cd00e4c8743507daca2cd6e8a85cae841bbd95206cc0710c6cee229606672fd016a5d08c6ffb398e5383d05ac04d3502a55e694bda97d41c067b002c6a192df60663dc5eb089a22df85818e244f6558b2d6fabfa8634e8d4a49d8614fe472acb59b5faf9e014f9f37f38e5192fdc183eb4b996712c741b09df6cdb407615bd425311b1407741305bd6f46337b848e34ae053e408e8acdd84767dafb289580e9f483c48b0d202e7885129c4e3c32759f8ece313c1df3d27122e4903fa155211e2520fece6004d3d8e3199b2c4a2d81b01362277dc5cc6c7611855525b6f5073d0bd4ea414354efe64e10ef704df28018eea91887c03151c65c8d8e3f0f8d71611ddb324141ee5cb76e200803f7bdbd797571dd4571b4b0076f2b0f78f34585cda9526bb2c618a7434f9e3f9b29e1dfc8c44a286e8d6eae40c41b522a5d512951ecf9718359647df136bba881f60d5231ac62048790bcebe28f98cff5d68bbfadc3b71e0ecc96843be5aa220b6287ffe747b71faf9bad0f41de861c18334d73215d2e8a9f9a5e73bce9d257b99155a5b5adcf02cba1edb80dee9a0e25a8b131e4b3738b175ee052092fb6856985b9de1a5c89f0919b68e68dcc355019e33d99934dd2483e92001d86ff1cba03aeb35eb63bbbd0e1ead2bad9e8565fbdcb1fb4aff6e4ac5f684814a0574af53553f0f5975b626975120c24ff6dd7e0cd653df756ef366f32e1c61c8ded1aa70c3c75afbf308883814bbf73faccd894cd77f96fe41b91cef19ed424a0646c07b59723a9131ba0919a46d365b5507f35f096eefe465a2d6765d28a935d0d1ef0324a865b89e4d5b0c6a47fbae8ac864d5154e49a56865b79b5ea67d5a195662b6b5697ac3095ab0181cceca81b2befad58ad2a59556825d94aa2d59b2a04abcc5a29d457833daa5916a3d5c6ad86a21cd6f60e0354dd5945d38516bbe918e3c38b611eae56d8270857db7442047c5eb066f8206520a79ee53c9a04740f12c36cc80f95f0f123d48d4825e4354350b34c2adf6c6f63b1195491b3324535042a1e5542f1ac1261cc5105b66c0f1880536da72a20055ff97b5daaefa89c55e53bac60afca4c254b458a2a88547e4e252cae4c58dbab0ab48a9d6750aa6b500536f9132908a5a3e346a5e452097bf3bf3c8056d547b2ab2db5417588ca6754f1b47aa56a262adf975359a4924825816aae5de59114a8f06e5ab513506dac183fac3e6930e3546f53b9ab0a91556550050299873cc25a4dea54ff7e31f53458aa1ca8685215b3ea9f0337150c2eaa5f542e57b51d2b61b7711ec132aac006b421ccdf5448b04a8834392f6e21254095aa02477f4fc33654ed8b4af838850f9cba4ad8b8c54567ea914755aaf6ebfae28d3e981b7d4c95858a7aaa45aa4854d153b9a632b25540308f6e737aa1324945505581708840d81241a92053d5c155c26711ef6d19f369121e61d6b269134de524757401695fa08c093d043a07c726c0cb9715d22ba2f31e58b944da67d34dc16a7b63b60f1d1fa185bb4f78d568817a015df2068262da9b48cec76c963ec42e3c32da09771021f86455d59824496ed0a2fae6238816a5ecdd0eeb833114244834891c8cb43a4a2869ac9728e8acc968aa5b91d2e8b9c59dbcba39d79367e9756e2a70ee6f5204145610587d2c43cba834af67a67c64be1d3d8f1c5d919839b4491e5fadda99d78454818086e1fc1b592561adee206985bc19e534c02dcbb22c1ae1b73aa03a8e905a14c0626be2d9db4f2cf7a8d4374b5883b46f2520b683838ba7f34db10edde12205576e2eeb48ff4c65ecfa5520adba0f92c65ed6666cded2cbeb0c7aaa7aa3b036cf1f542a818551bd64d4117600270e87ba29beae2ac2237fe4dda560bbe0280f012d05ba4051c6603cf77e8b6ee9063a0d0550f5b06f6c1978e8ed5cb3b5b87e96f0caaa446da796d2e54934b7e718002eed0a082402a5b1d854ee1f7a2f9f8609c6e80705dc15e11530222eb56f585aa8ab645de1c74bebc21f909aadfa0d8d183a7ba237f15cb7232c0ecdb245d8b9048e30dfd5862f17cb5fde6e1e99dba4a8d9c914db63b9268c103295657018369309529d2e818f2cc6dd9c36865c9e9d2e44652d024bf7675c3352fa4857c6495386ef50178f40524a6e2878d5e49111a0f5c7da6215851178437366994e43c490e81f42452a12c71aee40dc506e5833a8f298d7bf732af7e048a78d720b2ea3ad6bec8f1446f05bb2a7591c9091d6ce4044212eed6851fbb50ae599df98be21ee8005e2ef56f9349e07e648f3ce4124b5f3546a4d1431821819833dcb18bf188083b25760e1508a395768b2e73c1be080974e904644c7a921a2728d5e0920e058aa3b6b7e4da6074c134ba080c9c2db25a636e4537781cae153aaa66cddff0378eef1eea596820b62d7960695457e1b42bbff4dfb9532d5ce2226924e8a1d5c36e5a45e606e5534f6cb3926fc46beeb2dfbb23e254d164ad26acd94196430fd3745e634597892ed2c36b2dff24a6f67843b431968bc65900b3d97212b0f8bb90bb3c34e24e8f52425f371804b2711027f5e31cec4e52e3a51da8569c4fcc73abc50925b02b8d2afb9d958f850bedcc2574e4e34ce8eb13b423c5e3c9524cbf7201d3156f681f05257cb0a33600bc00c6340eda2380af0ff0bc40cdc9fab012a3fb42d4d3d93afa2e81c4ed1a96e25ca285403a31458198ade1e664ab442d96e7d6844755d505871d6e69fbeb253894237a06d492b823340fedc288f4d2b5280759be7cda8e1281aaa68853d9d92e12754438e2eb13ee0d93138b5a7b23215e05582ebfa56ec594b7e6554447a249423748914e4e203a95a9fa9be4c23aca6b0d5be553aea476f190fb53b4f93393d7116b33c10fd222a979483ac15272b42d33057dd5a65142304f94a2d4b8374ed02e26f2bc70baa9cc7e5ec3568649b49eb2864045aea6dd74cfad673518902fc0f334a1072902ca759c3f75d87b2a2052e824a844236a3260a31cd76724917fa5377d44dd8b8d8c9f08baf1c1f2d7f14ebe387abc1b7caf5ad9453f565df988b96eae7b28628de713f65c0e4a6c5c160ba6b7fdc462633061c2ec61423098739d6d0b4e9e56cfd025e5245770d3870b266390333333333333333333333331bb9d384ac362d939412c5a9b03a7aa91c09c2a494524a299592aca3c6c584c645e16342e3620e043b0dd80d0a0de7d8c9d079dfa4d741a13471845de8776a117ba1075e3ca1a44a49f52edb8ffaea75e085130a6a445c0fd3e8e722820387b1f1a209856cf6115ba4d6e7fcafb0f11f39965f30a164d92645ca21f81b5a0a78b184529e06d1e63e8d1d2e01a4b1c373e0087618be5082da2141dc2b23d7b746ceec3d9273a8799b34b668ec7009b060416387e7b017492844c91d96a7849a987b24149292e971a75182e47a052f8e50361daf9bf272c424a1aa0abc30421e2924978da97b879a56e49ebca534e47e6fc5078e0658f18123edc78e1c2f8a50506bf722b3517cf2890845cddf16a71e6492ecbd1842f1e467dda914ad49622f8450f4bbd0219f8f658c9a2014423c3791bbd469261d104aea3f55d37eec335f3f286e4c3ac7ca64f6f9c33eb0238aaadcabb92431bbfd319d4d6c9ad1bde84141ade7cae6081af97b1e784a88b0fedf7750148d1e636310153a671d9434dfee45de20948bf72207c98b16db2c4938285eef491031465fdca06899e1ee72b741715546f99b4d109aaf173528b9e7134ae79cd2a0ec13846c6cf0b899e78b1994464a7a6550924d264467535627b4173128095553ca27d9e96bf00a2f60901e9321fae205e5244cbee4d4a70bfaf4b46db5ad0976356e32255cc8319dfd450b4ae245d68cf6608b172c287704eb983797e65ef96205a5da4b91ee6a22ef6950f0420585cdf9ef94525acf3dc32e5251481a630ca3c52b529e50518a5111d5e4498b0cc95314e27536ed1cbfc20a34800b53142db63abddf7b6fae2a45414cee24f94f6b72aa677c3c077ec78d1a56a42846cf236344120e2b6680a0065a4da300a68b5114fe3bc4d14fb6e69ea73d6006065c88a2979b9872ea9a9a59b141c5c85a2914c5091b226eb64aabd08c0b5094da2ae46c09399b3b74f189e26cce0adf4d7973cf0e1d9e2897e42836fbc94e94454b8cf91b6b4cdbbc7603023a3eae58808edf310205b40b4e14c48bba483d53b6498c406f02a1aae51bf40f179ac04cad456dc2a95add5a87123a8692af1f32f94c140b73818992865e95798ece78105ca2347799e476962c51ce6fb95b21b4336bbc1205116fe24abef7b5652851fa54fe9f747a8949844ca2b4634aaeefed24152749286ba1db237e3012a52e113db87d08bfba5d40a214e9cde53aacdce4fd11e5dbd378d3fdcd37bb234a9b11f3f629cde592c546147fc6539ef655293933a2f4aea77c5306f9204416518e21498dd6f41551cc22f34ff889c9c9b629b8484439b5e68f11c458a62711518c9fd4c8ec4611e7f221ca9a6b3a7eb75976d21982095fb5f166b5b11e2485289c12a73d83a890d98e0c42144c9cdcb352ef204a9d548359c4b2102e0aa2b0a193674f1d4294f8b8084431e4cd9cf3ee78929cbc2db80044a9cd365fbf8bc43d2173f187a288f768a6b42669bafba13c32f5efc869fb604a96afcc76156b93dc5521a95cd53ece840f254f62d9a6e38edec808e0620f495ce8a110b2476badd38cacb18b3c14b7fa468a7eea020fc593fa9f574c9a29b1b8b84321990eaa3fda9f58373c075f3dc0851d38bdab192374528792249d3f9bd8131d0a22c1fdedb4ec620e25dd49dcc23227ffa09443b172fe2347d0329b938b3894b63b6898bc1d38144d77ac9eb0b29143fc06bd4d6b72b6248fb0ad923ce4cd99ad8c2737145389e7d231a9e6994c1b4aa9a25454769c02176c289cbc5df569f27ce068c0055caca19c359da9eb3c2ac3e8d37f48400dc51439972711095fa1711a4a1ec777846aca051aca49b5c695a7523da9da198a317cac75576f864238b1bee6faeb1a73194a161f49d98e76cb9891e1c86573669ab2695f113cb789d3bb524b5d8ca12c6257cc3e6b176228e56d8ee1217c7b02176128d5d668cc299a7bc4b42ec0508ad9705e3ace89a433175f280659d623233d175e28c7fafe7412a45d28c778685c28264911ef73d021e94cb65052f327e621272eb45096245133e448b3502a4936494e14adfec005164a769549eeca9f32935ca1a03985c9abe99062b742b93a89f4d841a90ac510a36b9fe820748e1115b0311997cdaa0d2be125cb547bffc64ca128f7f1a2730867ab970b29944334af73046ee35116c045148a2aeaa73d848a937fd3d8ea07c1c7150bc803b88042f1a3d58fb8c63ca11ca475bc499a20c2c94e2889a9eb988989aee49a50389126bfba944c28d8a4b5eb24632cedd1c5124a42a2b99c907dd6260304174a2887a83d19449ecd6a8f105c24a1382256a7099ef34b0e22a1941ae653e74a1b91ba23709265c44dd24b18d3f371276c84c284fd3c596a7cd46e8a509a98256aa9e81849224249925edf1ed10da1d4498c4270444e4ade5c5b104a77bf9b49e5436efe00a118c9bef3e80ce757221cb8f881a15dfb3b373e251ce9c207a592db639275de234e5cf4a01845668e96113933532e785052936d374dfc2e765052a5bbcded330ce028b8d041b9b727fc77a5fa59e8092e72500ab7c8de1fde6452f7c0050e0a3fbaa3e6f15c73ce21b8b841398528fd2af36db0da5b679cbd8a6abc77cce6fc7cd2434c590d0a6a4c26752236f3868406a5fa12ed1841ed62068598633f78d870a7d3ee4206059949a7c97c8d0d1c3270b888c17966797b9244f2062e6050d81b253c6bd0a77cb41b2e5e50da5939a546b3df00b4810b172c1a71a265cc7fb9684141e91c63f6899db3e18205a5cd10eee2b143c77e2b7e0704ccc50a4ab721a7b78ce9359a9c04172a28ca7f699cd92a15a54e1a25c78ce46799ae8275d00215a58f7977c34e93cc69748ad27990f1430e5b1b656740b63045418eea4eba9749c4524b51886eb99f6a152956b1af8c2c5b9ad56591e2acb3dedce7eeac4751f44fd2db4a6d5194dd6e3659ed1a8a42ca917256aaff4a2f5094429e86c9ec269e91fd44c9edc76cc74f7a4c7de0d8a1e3c6151f3966e0d831438707fc73a041a085274a37fa652d62e8341b6ad1ec6db805278a6713835d6dbb89f2e811f264248c461146a085264a267e3f45c869748efb165a6402ab5391162fe91955d595691f3ab605264af73aa2843ea1aa4d7c89b223c6a56b7ca66b1e21e391e364df12a58871adcdc5674cc32d2a5170cd1e61f2ebe7ea88eff08f169448c4d343b2d98b56a987d7bf3279a61693289e8e704a7bbe119b9d0bb4904421e9b86a5967aace4f9128890efd2065c207ab1c1295d7bda8d5b5aae74e3ac9e06134c7d4e21185604a6ca9da92234a4a4b6ab809494db7a911c5905262d231ff8c285d97c8f9c8ca9fa05f444185f8b2789313527f459443e9a48ff913510c41be9ac7c874951f11654fff9e76ef84e8141da278326ea6dbd823c643862857ceeba43899d1445388a24fc8aa2263a82821274441b9e8f748e2c63af4411434f867498a24a4592d08db7b843810c5fe3aefb3515d9932204aebaa9a5ba951fbe33f14b499845119abdaa9f5433949b6ce6ddf4d32ae7d284548e266b4d253e6ca87c2965ff7474deea124ef44d2204a37e674eaa13472367979a492399f8742cc27665d24e86c2be2c173fb19394df10ec5b8bd52f3a75ef7433b1493679bc8df9ab3f35787b269c9393a94ab3dc8901d7b3a876e0e25b7ba4ed93143909e9243a9aeb62de58b433966564e566ea611293814c26b47d589b29edb1b0a4949b4b9eeaf851b8a41a9fd39516a43f152f5c3e83ef99fc386d268d131cd89ce1bcd1aca1ebb57e4848d77590dec98f60f2deda7a124738cb4961e922ad9a3a1eca7468f38393a43d97b3d84fd69fd7c2333942c83f02a1d45652828cb91752e2721f764285f851619347a049dc750f8741f64e8f188a120c27799e4241386f2a639d7142230946409b97fa174474ecd178a766b212a3ea48668bc50d21a6da57398b792992e9444a6ebaa470eed7673a16cd226fe857435a5f616caa25fe25a288858dc6e0c2939649c85b27779cca276e33469b1508e5b9baf49ca57286e3425ebce635583d00a85d1a7a74fa70a056daaa4c68999a5712a144ee88d7026358b74a7500e9eaab7f96ee327510a85977cf621c4cca3c728145744f29ca33b286826ab3fe36d9e505291cfc4bd56dd6f7342317ad0496da7f678d09a503ea9beed114397b68a09e5d851dd9223b584c2abe890b943504a8e9450ea18fda36b987042435a24a160e2cefb5a622c137a249437eba61242e585418b23946d4487d5b7c7b7ee5a18a11044d794cc274d9ecc16452878a587d778f956318950f6539173b41019429eda75f375352129491bb34d241d8550cc9a3e76ff294df19e201462c80e23ae4e20947cc3c7ce93643f28c99b374de7d17d2c6483163e286df02e15afad9d9e1e14630e7eae91ee163c28e93432871f31ebaf6a8b1d94a486c8df852884163a286b10f3d8cda73788be450e4a32871b3dcaac163828670df9a3cff324a851c5470450d0e206a5952b9d1636286bafc69e9e9c497a5e91c30a1c0b68518372e45e1fd36b6726fec7dfa8e1c18285185ad0c0bef00dea6c3183163228e708db9f7b3e3d6dcc8285085ac4a06c6f09d72e175663b19d74463f6e9cb2050c4a9e838c25f9268995bbc50b4a9dc7458a86097561bb604db154ab32eff4b8d94e1be5b5fe162d284ed0a6dc64d09e316558509ee0f9626ffaa7b45d4149479430e21ebb4cc5162a28978cb183e9b4412015a5533d49e9d60a02a828cc856786081a42e0142559ab279b5335af6d02015394f5d37abbffff3e994a519674427ce60fa7fe6c28a4519ec4afda3594b294fe9049fc9be6130c351484c6f3dca67ca4ec06230d05ed13f47a1a0f061a4a22789887f0a117c03843a9632ab1113e94a75d30cc50ea24234795c7ccdd2e6094a120624cf87c4a73cfe7000770d82043b13c450eb7214d63cb868d1a1eb0d2008c3114c307a139448bc6df4c8718cae964834c99bc1a941986f29e9ea7094a26c76c5f0006188af77be73d9e574ed35f2847dab31055dbaef929f3021bf45f26d79d246330ba906dd64d3249eb99b6191e185c286f48c2dc77af7a2e94c30a088c40013a74b804ce08cc0c1d3a3c070b164880b18582eefde9dd8768b40c0c2d149326fd9dbe27fb24115616ca6a322328ef122162f71f58282851724acb475b5728e938e1426c2825c27d5628e589249526c7ef4c89c6d60d0ed4d061306054a160a373474770bba990c4e83b32adb65328848d6fafc9291a5b33ca039a96e3bc0e3c04430aa53bdde1f3bbb94d512845d2d934e4b0a595aa0c185028ccb8e4125aac2794c637e4b8914ca2e5849285cefd19273e3dabf1b1039b500c56ca7564f80d1fc61d36aed0f132aab061a3860b162c603001dda811821b570000c612b8af2eb113bbaed141c80cfa741a9b00184a287e4ea53d7a96977b118d2d2b3409c5c9aa79743d95bece7f24fcc0b1c31b0905efbb0d1a23b2738eefd0f102c6114a17ca6794085b572372056018a11c9356b93d9327a25584d269f6204b5cd44184527ac9a0533e696b080515ee32bbe929574f731842286c6b6e4e9fcd5d9e9b61c30f0e1b1d84b2a7870d273ba2b1c612800184428c113fe8ce997a8fd1d8425d08c0f84159e6fe47e9863e28e820dce48cfe694c93c6165bcd10018e10ece8811a444431cdbf3a0d1dcc83a2bfad86e977502ccd994338699a0e4a2ddeb5c9938cf160a2b1458ac67ac0c841f97b4372902f260e8a417548d8342f8dad1d376e5048fe9e33e4e4e565c515376c50bcad8f1c77d2e75c4234b644f03466ecb851e32347d7a098e531eb373f8dadad09c0a04131a6acf4d19e3183653a665090d9e4ccc437c9a038a6319d10a63f7be6d0d8226601183128697f6431dd69000c181443529511ed7f0b182f284e8c9dc93c7eaec0704151752cdbf264d22253182d28c6b8e7dbb172369ba2b1c51480c1824292a196baa68e008c1594738f144fed22e3979ac6563a00860a0a41479492935dfa9dcdd8a103078d19373e70d498914347c2c0c08c0778a4a21c53679b0e32a828e72dd5a2b4798a62c64493f120f33045e1aa66ece7e24c290f21e0518ac2e6d630a725e69821a4208777c99da5451419efabe9843c4651d2e22172226bac095881e3a3014ef01045c93e92774c668d9466e0d871a306d61536bc021068400370ecb801010b4559f48312dbfd8322bb8f5c5b31abaaae11764b8ed07ca238b2d4c6521142687d3c51f0d2fd92ef2e8f4e142de29aca08e3bf1ac2099248c85a62a755e1a6a6b34d8736e926380d171d7a62d8be9a28c4bcab6b91795966ca4425df12bbc43dcd4b354588fd8f793f29d1b70726ca1b3c881064e227b5d2e312057927a2f2df26e9b8918187258a65222232b7dc64a4ac1245cdf3d2e71ae274e8418982eba4d218a94994735975f6f41849144e46e44f1df3150d901100f68844e1c225c6750f0dfd184814b2e8e41eaf498637cd234a7db3b71936cb7dd03bc2f02a97a821e9b4b46c354bacc8b91a511e11939708fd223c35bb020f4614d259c4e431134682b88842129aa931a8fe6baa15514ef61d437db878683011c5917ba2eb26a92afb70ead0c13876e418c1c7d1017820a2a04255c79211162c6670ead0717b8862d84e27f6436f8882eccde9d3df9906b916a2ec934bb4cb374214addb4c495317a6b3ec3108cc2b5bb44462c452ed083aa9fdf38794a51744f1f3ef940a8de3a8805ae1118852a92791e94326041e8028c754a2fdbdd39a028f3f9464c8514ac8fbcca83481871fca62d23442ce1d64c7a43e94e2f364bf92397c28eb64df12af9f9396bd87a27f49509631ab8792e714322378189531cc4349062bcb24573ed64a333abd0c241e78285f79bfe789e50458b0f0b8433942904b5dff98bdb476286bd0eb959d651dca195f82b56f8e0ee5bb5691a67f83d238cfa190e4877653bfe5509059d2e5f984e350f012eb4f2ee75e1902877229d51e31883bd3b171e0f080c71bca9e7c730eea9146ec93237d5480058bf401020f371453790cdf198f08fe012c5820113c0d162c3cda5090ffa51ea6b456949ed95012c9395e95c6d1ef1a4aea347d09a193c48f52b6f050432199d7befcda9f6dea9186920afdf590ac071a8a6adaa3bd2fdba882050b1d3b70d8d0e1028f33944bb7f499a7c9c30c652bf54ea1836ef7507994818d8961b39e7c7616f0208322625b9515926abbb6f675835f98122267663dc650bc8d33d17b3662406ecbcb22b96d5a960c5253d3969e1c86b25a759ffa46f2d03145f0004359f5947eec289d387a7ca1a05ffabf2c7dec460989f5c063cd7154460e226fba5010a79a5e947c7f131d170ada254bc8a0347b62087a6ca1f4db7d2952ccf34d6e3582f4cf4cf0d042d993ac4f902574d69fb2508e3b924b43e26f148d050be4386c8cc073ec08d23f63a1ac71ef448ae8b942e9736d5306a9a9cc3c56289fd03ceae73b3abe5685e26ce733253b4985a2e6f87c4ad8c818f23885a247de4c893aeac3490a250fb66ffd9bf4b86ea250f0cffd3166ea68a22f14aa3519ed9a286f5bae9252b4adccbe2829eb138ab93236395f3e387294167838a198679b7a4f7f75bde3d18442d6bd8e7a4228a164ed030f2694464e04f5d11ea381c7120a42e9310de2ed1c7828a1981eb1543ce39184624dacedf4c831da7c2414d3a64c9bf9c722d7c4e308c5c95afa57fd7438dd8d505019c47e0eb9e7c42214ce646df2ee1c4162ec4184f2c4a04b6765f28fa61e4328a90d8db6551a336b5808c54c4a48081e41285ff68bc870d737317a00a1a474d6aa7f9e1b20a3024ff0f84141c81f1532ff7db87d6fd4701b1218c187a31b38ce57e1e18362189572ca37c582858e4e82470f4aba5da4863291e8a7af37be37f0e04139ad4c3f8f66d159b9c70e4adaf3a7ee0e9736dad641c1eb3c35d4a595663807e5c9a793ce739e83bce78183f2846f97117974835268a619f5693584ef2af0b041e9b4ba8c70d7f61c6e8f1a94773d6210da7c44ccf2a04149df3a64d2087f2f298f19943b99e7647a634273ed218392fe1c6d6fc3a4732d06a41989a535279eaa99359d166150de8aa4b44f753c5e70c5bd5cb94cb6956056dfc95389c85fe2451e2e28fa884febbab91c39fc46f0f120c07174d440334690438799470b0afadcb4233033466023071e063c5850f2fbf50e3d5fb6611f039aadde86b902076a2c181e2b28464c32947646cd740e2bce4540060b1636fc86870a4a2286f4539323c08b5494c5e4268a986b7cecd0614377dca841010ed450c0eeb851e30a0ed4308b8ac28458d5a31af729ca5da5633e426fc49cdc71a3c6151f48d49d9576e7489a5294934c5b27d3be6fa5c8460df3821465d9cd316c925396ed5a318a52e855917f2a05d0072f44511cd3fa1ee48cd031c7f3072f42510e9b4a490ead5d32444151923969958d705aaaba4f946a4d434f6a50fba279a2bc6a7b22af369d289fb5974cdd30278aaf76d649e6603261db444925c9366de36aa26cb24904c9a61b36a83251cb6d684db2ca921cdbe5115d420c260aa934e6d8b1233c84179728e56d34113c9d6ec434075b51c0052f2c51d4dd93b6928414a844296b77849090479dfcd0d85a43a500250af23d9cf2cebde11e61c142082f2651d02912424c217f104385007a11d46800cb78218982e586bb9127fd47bf4824c2bc74f84d11248a21b1267ee9d41bb4f98862decf914f82eb887252f5b20e12b35c725e34a228d1274c6a919990531da4ee0523ca7e5d152a2abe5e748b28ce4af09c4f6ef94211e5d291bd6f916c4ba3893044d8218a85bd3044f125fdb888b8bd28c4bf252972d010244441d5ddac04cf7ca2fb41902295bd7c48c872aba5623a57e7b53d5782287ba4cd41f8681f386e70a00629b28128fdc9ced2f2902a409483c79b9d7c1539f49f2c5efca1341f1659ecdf73f2188d2d113c8d8f177e28a73595b6baae8e0fcfd12ffa50be2e0b093b490ffce7b8baf1820fe5744dff082942638b03300107f8cbf853c346152c5820ff0f1a2ff650b0ffcbb78ea49a2792c38a1a2c58e0a8c182c50d1c3a3a30430fa5d3dcd01f65f47f2af3508813838cab61bee2c6ebb87d8187529c4c2a31ed5c6610a2177728ccc4fa1332e7a061a1b2833222b31d217769c48c7d4283788b3343f0a20e25f149261b8bbca043e9e4b23f68921e94d2793187823eed1ff39d74011b78218772869a4e7be2d974ba696ce1a861f6220e35e3051c2adf50d4904ad5ce985844c90b37944310725cb363da500ed5c8be6043d1f63b89d78a8d31aad51a8c1093c8d5392d027f23026a28e91cd63ce9a464e4bd370de5553151a164d23ce2ff1b14788186c256788c629de6ef326728f5afc912b3c9176628c609c9bb53ce6528e769a5a9abba3a154fe005190a9f74ac9dd0c7a300344046000cc7c0889c2147de550ce598ef74645b86cb596df8a97103c70d3f1f8e801761286ecabc4962b6d7cef40b301452fd9795cba988d1bcf8424953a6c9f211437390178a41cd85d8e9fa068ebed100162cba50bc49262954e903c78cdbfa7886f1820b458f61fd4a34de424178069dc304177559bfd042b94d46cba0a31a49c7151f3374d46003bcc842498e1c253473959e019f63041300c10b2c14e3458cce0ccf505a3a06bcb842a97ccb4bc8b508df207f6105b4490eb5fa74aa4239e2c659ee6e35a850526237ea4c9cdc9f778d2994937cf6b55e2785e2ab89ff8909f7ff79144a17845b432dddcbdcc3ec247d4d8ac40042c1640adbd051d605428c1f942e4be958939c6b267ec5077e865ff181e281f33416407c50eccaf51c443c9c7b4a478c1e943263c4126295d13c28756e514ddac34374bc76505299933cc99327e5270d0b310cbefafebf21ecfe428c1c14366d4e359f301966732304386e78e006057050d07943e8eb0ea34b9920b801812cc4b84141625cd1eb9e7524b8376a182b701c2b8d618392e60c9a42721c1d84c80c316a5074ddfe0bf79c525467878e06c80880c5a041a96f426cf99c183328683f499f7d946450704bef98e4e661fec7a07caef6a66e26d7ba0606a83c0992182f28e8bdfafc6f62b8a0a483f90631d29418a5c7684131260bbdf52fb133dd5788c182624ab8f73c95276f3c2b287ce8fc316d8e9f22d5315450d8520ffad5329a874402a9289e2af7246776b75d2201541492c79f7d97d3bc11738a726e7f129ffc5fedc4a62868b5fe4e88debf252c45693c698b9cd6ff9fac0b488014e559b736992c3dd2a94751b8932951e376e3f62b8a924c5bf223370984229b902da24d90ad2a3bcbf4b622c37383945102a02888a453f4326e7fc87fa274253e3f42c813c5c99d76f4678f38994e1454ca87dbd4d4f1754e74bbe2b9f36813e5a4fa2b72cf7c7659134591ae79cac43c8399288491b94586f4cb8962e275cd399728866a9f6c689628e80eed993fab44b14c754eab19edcfa24431d3462d53d5244a4a29991b619bfd248972367dff9ca3a478498a44b1636ca78b900489529567cebd3031fa8490ed58e2c48e280955123b9cdefcd637a2244e68cf97412f014614d2768618c783688e79092ca2515d53993e8a287f8e793c82d60de244947e63089ae9c64375441492303d2ba21fa2f8eea9647cd4a81d1ba2906373fcb7b010c520a2bd6fbf369708518e7173a467db576e8328d5ab2411a4c78f1d41145494ec6c0cf94014dd3fb8fc0e88828898b14f929a52a53f94ca4fe624dfbe178d1f4aeabd3df7cee938f5a1986254db8afc1c633e1435c7f8e0a3fe3be57b287ab5af6e26f550ccc14ab4bd89f2507637219f2789a493427828a99176df12df3b94e4d664f3ce7cac08b24371f36de8cf4edc985487b29865de24f3a6574f87a2759854feb15e1a348782b8911b4a75e45010398888e1e6bd54260e854f1b31a50e876a739a27f17943514463bf061d7c3eec86e2dba4ee16f5ba95db50d0ce963d1e93af563614548695d44fd7508e2c9e6358cd0f16aaa1a025fcbfe89786f297c618d1d1f4c70d0d25fb4fed3491738643bc9b983cc80ce5585bf54164a9dc94a190fb77a48ecc0f33396428a4d0d718844e598fa1306af5c4ab2486b2558dca97c2501023ea435cfb1c620f8662ece821f18390a1fa2f14d773d64e4f768b8e17ca7fbbd983dc12e264ba50d0a5a6f46d8821680d178aab41a48613e15df7160a49fe9c07c95eb7af16ca693aa94ce29a2c944adbe3e7ded4f9d360a138de9a27df35998fe6a0d76d2368118d154a1f55933e117bae93aa504ce2ed4d5e92642b51a1349eff394ed214caa1474633448d94bc14cae11d35c9a0ae3f88a2501e1d434bb4cf2ff340c1a46712cd44fd8492eb7d848d9a797a7642d97ad2c78f51d3e56c4239e68da6459fd68825138a571a449d894b28781899ac6336d6049550d2f6ff9f5eab5e739e8482560dd9c7faa4bee74828af9ee853f5a61f3d3f4241ab9dbc3019a1a4e6712a69438acf8a50d019c944d6ba4e2222142578ced6c738ca1e4221a86e17599e5974e54228a524214a65f6a4fd2014465ac713bb13150242f174dea036893839fd415183993e28bdd6a737fdf6a0b0a935fbea890dfef3a0103ea7898c51277d7e0785f3fb481923a3bed74131c733e8dce03187a01c14b286e429d98383525b87a0a3a6de93f60d0a5e32af468f51365e1b143e7b0c656245d6646b50aed49b9c79b34b8706e5505a7e3dc4e877720665ddd816bf9b46655206e5743241f98b3128894eded933a5c41f06054d6a3de53f2f288e98ce572e6917145285ddce26b5a01ce14e42d03e0bcafe134b5b8324b082a2e7922172af66c548022a28abfe69524a99e5e9a4a23823c2a9b3d0cc98414559d4e7cfebcefcb29fa274123cb2966e8ad297ee8697d399362f45293fe7fce3a5176793a218f2e56f50117a3f3b8a52a4f914915a16456123c790acd2459f90435192e9a4c778d26b5d6450dc5eca229f0a3f51540939641e79a23432d3257a8e3b51fa90b2fb19c4896209dd982a63d2f9b24d14f632c4d92832a84813c5184389a094e7ca4b3813656fcf2283a6642f0963a218ca4e9dc9d68ad0254a429f8b7fca92ae254b14449f6708b2d5ae4a9538feee9428fb67ef92a24b27f993289ace6dc9299244d955d39fad281205b1c164b6dd352811248a62a363a70665a5d94794478910aed17544e9f4dee5c4fc22f3da88924e9d5b4614cb42fb0775ed220aca26c5cbe7de04254594df6e6288484a443977381909fe41b60811e5fc88295c632504d121cae51b6c53a42691740c51ecf210f2999ec8ec2944312719dd7b13a2948610a56cad9e91e1200aaa3de498ba94113a411483a8a61108443967f9772a19eff7d20800a26c9abb649459ef551a813f94cf54c8bd3dcfb45346c00fc51cda6a2afc3e944de7cc99371f8ab9b14f356a92f1dd4331a8c8f727c2e4d0bd1e0af14a7cb23a13b7e7a1a0babdd52971e7427828c74cf33126d45ee8dca11c35acb48e4ca5f5b794554a3c89d7a1f4359e62eefa37870ec5283ffa42680ec59c9e35a7b5e5501cb5734acc3814a27f7a9f24cb7f6c3814829a6cb59384d489bea15cbd39864ed10d05a9f25b4a6de893cc997545c586a2e724743cc7d750f88ea4a349dfb490a41aca9a758366d360795e1dcb2c1acaa54c6aca0f9a424c6728c986181ba799a19c948cd93b0995a1d81d39769c93937c3214cbde4f7b64c9eb396328281db157d429ffea88a1ac9a19343d4d365318cab721a35463c050deb23c7da35722c67ca1545a93eefcc60b25cf79bdacde744e3976a1a8a7ccdbc73dc810462e944a6e8e6da110f7544feca99b78a2168aa5d37ee964112e1766a17c322126659d33a385582865929f523b8b4cc2c22b9436cbcb9934f90c12b442793c9afc7c59dda35485c27dee3b33a116caa742e1e3f56d187f0ae59278117b74e99a202914733889417f96acb747a1bc41e6f8b6dc0f698742a9ecec634e6e8a9c7e4241879c258d6aacc6ac130ae221cc28732d4f6b138a6f72a4279509050fbf71d46bfea0cc25944792f097a033628f4a28e9c6ccb1db2db49f84b28bc790502e1dfabe74ec8e508ef7a3c488f931599d118a1a497d8e93ba2214e368f4f44169a83011a1942344cd3c8c96f743285caee6dfe485500ef23b21d6468e3f0885bc2169f5fc6924778090d668e87692ffa038badfe774d87c50de17e94996dc83526fcdc8a0bcec3be641415688cdf05d2e66eea02831e7849439a8ac510725ddd6253f6a7ca2673928cb5dcef76aee9112c341c963921faf7426d9dca01c63e733dc64834250111ebb917452a51a145cc43674a741493f684a1aed39d633b83d883199dacba0b0b7316ecea21814c3bd4ca3f84732110c8a716d267d5cfb94e11714b36fbcc6a5aaafec82f22973d3db1d4ff4da82a2c82af131a52c287768cf1d32e9d17e05a5c931e8ee4b4bf5444005c51126e622cb5414e39856d5fcf18b242a4a2e9a3f6b4a34ed788a425c9322a925f96fce1485d70f730f22459cab4a519cb02beadb736c11295214236a96659c46519837fda7232979fb45515691db93bb130aab365566c90d288a49a5bd9c6a3e51ba1232318729a59ef1442184b7f613111ea4de89b257acc8983ccb3fcd8942146dbf22f4777a7913c58fa9f153522499644d947b6452225e46393513250d21e4d390936653315112dfa194e479f9945ec224feb14421bd5cd6a64f22319528a83119ce654a946fb2a6f79993d8f77ded438b92288bdc249164f306d3238c48942f646439139e5346a906302051101b3926ec7c679af988c2e720e2c7382646e28e28464913c5d425301a71c7e7909a733279036430823355531233be4e1a5bf6b123078c45140c4510ccb2423bacc445853e91bf32849cc34844e94e6dfe48251888289ad8493a6fec611ca22493b64be6e0a96dfe0e6018a2786aa497104ac323280b51ccb19336089bfdc92121b0b1afb6b8360d9122b377c2e454a541686577f531afed9142534dd2ec2691333322c01044d944122a2b4c042310c5f5500bcda4f1be3b0c40d4251b62dfa9aada5f42d47c187f28849864be18516a532475103f94cdc33ae907959aab221c374450c3630530fa50cadf247be2da888db8c500061f0a577ff2d5c7af620f85e0c984d4fa4c1f46777a2888184f7c7ae8d8737a3203187928095f91784267cdef3d0c3c94f5f3e4a03529db58298c3b14ce45a7cb0c6297d187618762f20961e6f3840130ea5098b43913e45cd66e1a061d4a162ac478889d1b35dc8aff98e133763c073e7024bbb29e43792e6bdb652c2630e450d2654a7e7d7d8447108e841187d278874e30f5c98443b9f49dfa3851c43574b00d30de50fe1c46bd778c05021910c002c17dd498914307c27043317e89291dc330da502a9d5ce7de6a28a86669c8209731e8340d67acff92b11a0dc508b1546ed4bee3e34170e3a650c5194a169bbae39f213e6ca86628690c3ae9abed65282851d7bb96b71b412643f1e48498097b1f25cf6328f9e6910dda3fe86e62f832cee724c46652a8220c2591f6edd222a4532218ca26d2d4558589fa85929811c264accd3949bd50baee36dd105a1a5b3acaa25045178a49ad8aed8924f144a6b1855a63460eff08c10cbb1a5c2809f9121f5fb4dcdfb50594e5a4590bc549b761164ad91bb39e6c52b2b68385a26cc60831b5126a9b2b94c5fe94b83b0fa36a6285e2e786d1ebb9ab4221e86032e6c90c2a15ca9e2187d91c32d942479d42415ad787754891f311550a6551f30bdb35994482a8512828bd92e479a5a850286ae89d8fc8ed092571719b4b56a84e28bd4f8eb4ab5966be1d410e1c5534a124e2bd097117e16444e04c28bc5c6c1ebdd6a7eab662092525ebffe3a7d658262aa170f72ad1f48518f558128ad993d8cfb55d3a728884728951bf0c321fa16c625e84c8a3e378998ce064fd3e95a553ffe17f63865daaa208a511da7af66db2a344d83ca5c771d84833ecd2108a3d77326f8ed9d3ce355e08a5dfef2444536e9c8350124999179f373ec32e01a1242b31c61ff90f8a727d5d5262b62e0dd2d8b281ea83a2483fa14c7f72b4b307a5fc303236660d0f0a5ff731a4fa2c6a153b284f8e571d6d458d7a8c5a850e8a75b3e75a6ee5af25d41a55e4a02054db9eacb0705048b26475075d7183e227976ca564a855d8a0ec92eb4468f3743ad72a6a500aaf191b95e7e9a9a3564183b2f9c6ad8c99784f3e6a153328a886263149ac778c440625d35432dc830e6a153128c73135b211ad93c718b50a1814ef33fce5947cabfaa855bca0d4eda67ff72232830eb50a1794754686264fb5a01c266fe227a1a1b16563078e0f5442152c68ed2e6c26a9f283868e2a5650ee2447dfe3aaea73f6914ba84205a5ea2422088fa0a26368e8484561626e52932745c7aa44808a920ed5a36c43f6151fc70cbb1aa728c5e6757548328df42437453129ab9aac399e08b1538a72d2483e6e924ccba6adf80f5294359efed2949fac74c5288ae9efaa3d9f59d977405003cdb0ab218ad2c7f2a0b49bd6b59f435132ff18bc353d88b80f14658b1cab3d6c3e518c35a351d3a4f598d1c98123c70c3b4f14b268cd21ffa91d9d285ca90c39b22895a7da3833ec3851d8dd6c1262a4ac5b6f13651199257f2d5478fa68a224d29b28f1f3dee1ba4c104470cded57d1d8c244e14c27af1126aa3edb2512e255ea5937b344c15e3de340254ae2a183769b26d7cb06258a21670f91510e4ca268b2218942d617d5b14fd848d18944497a4694b0294c906054692ce5158f2869f8243aa2e423bda21127edb94a461456528774f9411a5b572ca224737c8b3c2a45fd23ce279998119488d27d1c519daf5f2759a88828477f4f916a321b93ec10059526b2c88e9efe6488924c0e3182141db510c589774a5d7d05214ad772a747e3c0208a1d4d48b5affcd55410e5bc2941bdc46f2310a50cb93921d6e50020ca9ea69485e8a47747c2813f943babe666e80a3f943d0799ba6f47e737f98e3e20ad446ef0a12c269e4a7ef6504837eadecb7c1a5b24f8c0cfb0aba187a27b08b7251b937886f350784ffa3348cbe8a83123fd071e0a3a64f5689cacf3e45e716346fa8f3b14f4894d67ab994b8d24d9a1a43249b699f4a63a14f54e28119212a23a87a87428a9b1f79f192da14f86c6d60ebb1a7328c69c21a9e3288782af6a12bf125633c57128083172a3396f686cd9c1a1dca2a5847e509941866f405d8b3a65f9b9a1287a62e888a79ada511a5bda86823c6926947810097936944b668973a3e7ec2b4d6b288cb01d913927253514b3e41bd9313f34c8136a1a4a75a5e3c758e2a2c6b3ab818692eaa8d72feb19cabe3b79cebb3b98ca766628a676920d523465282691cdf89041321474584c36932ed771348642d2dde313f3bb8da76228089d6a3dbdca34b6ae0843693e8a498fb5c05090e0776156e2b7bbe20b852ddb14ef5f7d538fc6968e19ec85b269fe8923f327712a4e5d289bc6ac9263beb91f99c485827947bed1f5a16ea1e8c1e4eb53b63fb7466367d8d5d042419a48960d2af4ad5d1d59287b9478f229aeeed4a54c9081854250225e5b89aa6ccd765ca1b4db397eb45ccd94691d5628e7dc9874bda4d4527e15ca134f7ecd674d3221459f63043bd80932a8504c6292378698467dcd144a3224919ab657a51afe40522879bc0e23396608c95a828c28946c4fd4e7499ef40385421a4d667bed36aa49352bc87842419a1249a8980c1331ea84825649b669b573e9e9d0d8aa31a39f20a3098510742e797a66425144e5bc2487f5a0571a5b1f8604194bf0b55f54820c2514ce5636e6b01bf43ef46192505af98ea55b5e5eff304828291d8237fe08851c43b0d81f191ec6fe8f4b820c2314a3787f2e6df3078d1d4528a6071dd1369d9417211a5b34ce0e3f442806a5fc83cc7eec6822c81842f184648f8d1742c9363e43632bd5e021c80842e9238a57cce83c99211a5b3970e0b0418c20030865f3cf93255d5e4790f183829df0204a535fa8af98b1a3868e1a2088c08e1a3a6a5480050b1d2c58e8f878e4ff81e3c68c0f2b74780858b060c142860fca59b37a09f3b89f5501e7c6150da8b26a808c1e14cd52abad4e63fb1e0009c820b88006c80840f241060f30f9c8266aea808c1d14ce4db435e9e8fe1665e8e00cabb9ebb4d9d5cbbdaf0a193928ac7e10e6496e28c8c04149477cccf2a7be1b6e43028f70c0e0937183b2e7cf10c5e7337fa464d8601909aa9e292f5a55aa567e40460dcab1548e76d778627d248306a58f0dfaf3e58954256f1d3970cc20326670ac79468c37d10813c4ecff9343860c4aaabf3da33d298b20911183a247356bd1891464c0a064f52246ddfdbfd2a6b135c386dba940c60b4a9abc46336e161174108dad1c3764b8a0e4f124669eefbeccf765b4a0dc41e814e96387bbd275b80d52e741d01d90c18282befa1b1d27fb068db1f315a0828c1594f3b709edbc9bc6d67910e890a18292c7f82772f4d4f8203862a4a224ca459d36d3ff999bfb88818af24f4c9135c696c766649da26c26f3eb94e81082c734b6100e182c58e09f1a3674981a37d414c59f3fb178b555b192c696087098191e386ec3f4dbd861aed0a13030304300314a517853758f53d90c1d355a8f14dd79926f1a6328c628f49af396e8951992226b7fdfe89c54277f7789a26819797c3d94ce5d3714e532a13b9d87ea57a53140519a8d1fa647c682458c4ff87d424753da7498c8b027eeb5bc0e429a9c748c4e902585869c6c84c4e04449439b10cfb21bb3e918066ca2a8398d70793dc95e3a9ab845b3ab22c78b6766c97dda5c6363fa74673351fa93257367beeb9a08268ab5e9ad4cfac610f2ff8318972868989e6836d739295ba29449a73ed99f54a290e446cf9d5a42f7343128519e9dec29ffab4edd3b89b2cccebdff9e8e26d292a8cb4ce535edcb55c362a365abe96a8e473f12c5a8293e13e016c4804469ecb7dbb306d79cdc188f28a71cb351bb9de94289c6d6026238a29067df256cfccaf934a218a3b31d947f4eba26234ae7daeef1e35d92f62c820932b722b3916b4642f4509fae12f37c54155110974d2252e4bc25ed4c44fe219c690ffe224460d9ea166156b279b9a5a59e968c99553a3e271dc2b1137fe76f0c439023bcdc965d452e46214a134628b7cecaf19412a220bbb5b33979e88d4f634b2b4310631045b1d39f5cdd537f835388218892ce1923a44cf0f66fab1023102425ce2d368bb0460e2f29c400441d428695c778fa4321660c71d3c47e2884b095be5a2275bab10fc5dc50e12371db3cc962f0a1f8396bcc41a8bf87d2a777b45273133779f4506ad997dbdb983c94831251a389c978288fafe528f9d166cabd43396dfcbb796b31ec508e31c939fa6ad0b108cf20461d0a1e22a80cc14e3d8a1d830e25c96da725074dcde1d8143b19492bdb1244acdf5dd3c9bf8ca5b4fd16882187425eaffa1a4d2764e9c4a1dcd9c4e4887ac3a16ce5979d3c6332d59237987c677fd773d60de58c51faadedd48652eeea44f70f6243297488ec1d373ec8285a436184d04ef6127bd53d6a28873a99b3863c0de5e4ff67fa6a444c23a3a12c7ae344ea5f4d3b37c6190aa637a812664a47be490c3314bccbaf66c65e64d8cb508c0941ae42c36428ad7cde2cbfa93194c48758233bc78bdd550c85384afde453ca30686f13c3c6cd6cc6ece64487b889df4b996380a12443498f632734377d5210e30b05d7cd4da71f8ae1858227d935ba339fe4126374a110c3e7c689725a72890b2521340775f2247597b885e27ab6c6e811d3698a3f86168a62ae9d6be368f58ec4c8427a94f6fece8d0331b090c9a675969b66cdd7bd68bbf41c84c99c7d1b31ae500ef13eeb3c87b2ccb2c4b042d9c72478ea980c324c6254a19cc4a457fd1dd9f93506154a7d22dc8f4619c6148a575f5d997370717f6348a1b0dfd9d74ea86810230abcbdb98803376ad8a8e11f1310410c2894734d123af565745c11e3092593172afd362686136cf530f9d6729909d679276a6ba44f8c26145fe224f5dca593a4d04761c1c23f3e06130a739d579a23732488b184c2ac691ddb8e3713944e104309e5cafcbb65a6d22414377d25e7e6fae05962c359100309a5159de1267e8eb4a9b17105c28125887184e2acc81191b49c58c9a22086118a5088714ae8f8d74e5afbd891a36310a1e049d4addd3bcc408c211494905d7d9e7c21a02ee744959efba0148dfba8a4cc858302d2702c160b862251280ace0e130013130000000c2295c6a2d1502c8bf438167e1480036b40243638221e1a1614140bc501a120140c0202a1401800048341a16010140c06dfa20cc903083352ab502330736691f1ba95198402db27ec910505025af8c1f1a0b29d210b3de941a01abec86619ac821307728151d8d8019233064a2f18401755cb35798922c2353ada9826362907cd2c74754d68a60ea4c4b585d06acacac2e8870bf7a4caad1257c33f2de3d04ad18aebc286c1744923ac8e6cba839228f0034867efe009fecce1c7322092ea3e9604b37af0689639a450073fa80f22c9b58aa3a780991f74718449346b1eb6c58fb81ff13d250bfee0cfa6d0e2352878e22b0512e3074a59b842bb3d8a62c2f841255a3813c695831cf263cb10a694848a2f0b8f1f66a5e07431231a7838ccf10ea882cd973fb451c264b401040f43988886646a2184c9f0cf3d109270d865439818885a8a2f0ec77a88ef59a8007e1d81495e627fa038b8d1a97c60ed5b7573248d0d6e0281aa0235df76b0142e854dc15909da6b77e12d9a08c323b403e75640cd26c2f474a1737139e86f991070e68317c8f1cf82aa91c549fdc9d08572a19b11c6ca40c107dc3cd48973bf11333f5c033a556f9eb08cd04c70d7895b370737e3d9848ec0268e4687d0e961b0ae6211e55cf499816269d21931244fa8665914c484ea3029c1957025284d9ccb8e3071be8c7bb7014ac8e9f309502433e1a84edc6c42c0b9f34fbff07688b13881553d93cf6670fb99bb38e972a5fe0ff4616f84ee5b140f8ab9a08768d0d4322290644cdb6ef943a80795093d7743e8c4620c802034d824b710280aba92922c0c546ee65257224830a30633374298a06c0742874698eaae11c8a678b3151d82e9aec729cd4f81d6c50a5153bb9487095300bb4f41d41d6a6044c1c7191b5238fffc638823b1a604f8e863f2ad50f5dcac88923b83fdc7cc8ccc48a144882966597d8b9f2246224aeff1ab00da1025e3c74d50f0429b234ab567bd66948769cdf0ba6a204ae7332f1b8892bdd36bc92d6e1d154271f6d6a42bf433d7576571c20f8c32fc2676049ac2ba83386154a5d3d16e96f5664e46f4e2a4045de5dd59696f94c28f12c4e9bacc702cd2e2d4ca2f958b8929e4a478783525de499e829c93a560539880214ae4b57363823b15d004d0c114b7cfa682c2172026ddac77794efcc5e9e26b31946d092611a7045c09a92c4e9df18cfd4926462cad0091dcf7d40341dda5a20e71b2ef826cb97bc250328b9382dc1ece5998487054d96618513bbd8b4db60f5907516adfbbb1778127c59a0c4884f6f4939685e107013350e690b68c209c5c6ce45feeaae48820fe69d097f4223806363f0542d32c28de74b2a68910ee294a2aa01efa4dffa009371d326d9b24f3b2c39785ea0543e6b8b99d18f408aa1c50596ca21aaac7aad4bf0a50dd6e2dc2c8f027b3a6021490f374d8c2ca7a8a14bf97bc839045423c29084da2323a17349a2240a889991550262cfdde2742a8dd5503e6c9898e942ba8337ea262ac722bd56005ded50ca1100a61e81b6d085c2b186b8f8abfc256a13edc0811bea0ff8969743dcc63452b219052be54c751112b02f1508135bb2b0e150e4fb20f02965a241082935e82b5845382533cd8d1cd0aa75606795f1f429c8eba5ba4666e1e3af3d7a3072cbba9220cbf22148db2a54005fafa895dfe6d07044970ff0ad959d54d104a9b376e4370c926ddb67c26b0af0258411ce0a0345704ed95a2169c02a635177e3808e931a8b59a0a4c7b777519fe02f6dd90301de1e1dde3bc040bc5651e13c4ccbefd1ef1ed27a5fe32330d4e029259b33eb54a316f24b7d9226b9f790a81e36609e1e090b685d12e3d81660c82200708bc18e00661001cd33a1328c951ccbb1f3e0343bc63226f9ddaa47e0e0ac7ebf60092542490b8fa091fe3ec421d0e982c31141016d62304e5b968d8f3b9b4d72bc61311803432c9d96dd6de66b53af9c7f5c8f76f1ea92e49a0aad5b5acb9bf4cd478d33c15df1c5697938d2101dd93223a22ac399efce91299c0a3bca36b4b655b7e0b059e49c18bd14045da1aa7cfd6dbdd725dd56dfd2cb5fe38703168179091bbd883792392ee384bbd22140c2a5c0c131e7540b258db8e18fe39ff0d56eb7e5bf548e6d182e9fff57802a9a518587b36fe7e9763ab3f0c9bd58385cce227de47c6c606cc64d65a22cb001a772d325c11db212bad3fa0ae596b9141aeb1fb223dfb5dccc91d6884a22c854ae6d80943083403681e1033db268d470236ce980bb19e34c039082c644871e163c3513d4b95729727cb175d3e1c61b55a2e9a38c7b60a18805fb1ed9e41c22df485daa44b1da6fe3ef8b795f27d38e87959c99362f7fba5a983abecb4ec4e9017407850b4f3314935f3321bd5b285df5e35791f18ec8ce9d342e31f669a6713ae5659a5d8f400827796232dda0e6d64c9ecda67b7fab4164b903818581fafaaf3691128a49d4e6b7d2ed595a53c609e3b885b66a367c28daa062d2617b3d5bb65d24d3d1b5893ea39f1c02178b3bb4ea3a681229a8be97c8bac42a80f9bfc1e58240cef859a5861c8d478688da2159737521758eb91fb737b89053c4783e67fce8c5f15dfd4f156f490feed957517221ca0fe62d64632c975ce4e2be1ea5818099c3db2743e938cc694f9cad0b613528abe55ce0642c2d12ec9518dac77ba386e7bcad52540bbea972d70259a42249d4bc5fd8c4727c6c7a5eac524cf23c46eaaf21d48809b9b1d4db1856cfa4580104a7aa6d326d1d33c72d4b67771610732ae1c94c7d4a24bac98695e1bf640535b94d2b9a23885e611f0eaba663a80f6b3f33671127308569b4cc703c7c61ac1c25978026e6b97ee4f42bca5a6978e4a44d2dc1457e6882d66ae3fb4a5b0584ae973302ac0e8491bbca3216e1e6bcfc506deb4b36f6e1b576c4030450be62853c463085c26c5198b822173af056416ffda1c53f0f2004290e40b934aa60e48a35d4bb65ab1da0f30eafbe3a65a3b676666315859d0bc15270d33b47627885227302a089fd685c12485ea098c8f02f2107448a5a66c383a6a14e2e97ed90b76284bf0d0519ebb5dc322804a495226be8d6d5f4f081d5ccc87efcd1bfe32edb74ef11c28150d597ffe2247eaaa81ed3ed864adc7e7f17ff9064686a93d8fe7059a818c5e93bfd4d9f29449336c9a1f1f742df213eccd8fd1cadd5952ef0eec3f8b392930a08b9d8bc42b64151f159525bc169671d91c36c97600ae658efbc1218791ec6b0cbbf732f46612109844e32355e7d6b9ff7afb8a20b9ea163471325a52bc91bf99cc23317d2b6985d20acdca0ba8d24319dccd94f6a0b6ef386a62d05d46703fc1a5e9ce08d7bc50022346686632f13a0ac36400a2444c638977e3e1e19935349d144982e96b0c6bdced7e404b6284822d20e18675954c6c670b9e726cbb4ec1d4285717ed985c312dea8fdca99320c7d508c4a1746fdd81e610295a7bdc9fc9cae3916d7ff213ef8ce6c4a17577c3ae477068648d13b0cb69117ec4f02b0e8cfd0be5196115531a1109c2a5f95464cbfd401367ad234579983aaefed1be0fb12d2035ed7d33798791f9efc26de7d42a894c08b26425930870893af6fe1084c96f8731f4d3dc15c1034d332860e480027125d33a448d0e609e49d127e08007eef13a6c2f1dca0e009c7a8331c7cb2d00caf81bea3bb58673e7c9791a081aae424c59a03b6e5b4a79a3e5e4206c78933bd78a4e7172cf47dfdc8dfc12f19976c26c2c77843b0669580d924437e06562935294d66c2a25419a432c1bca59d8e718a449ed1e29b66cbaa3265cecd73018c7f2b1d677265f16af3129efb4c33500afc040e6f9e65f3bcf9665665a809de632f087c7758226ac7716680400360d4caa69889069b1d037c6a484f31dae9b1682f46897eb105bfddea2711305ab5e4518fbce1343294a62d864dd98749ba01b509d0ab3ee99377aea1092c36942bd462e9787afc31d2580f4d288841ab88db1076786568a895972cc18e9e3b698bc26454b412a54551dc087f960cfc2b9c5b2d50390c332c1783a0278e1b07f4bda069541f8e9dc955c4dfad7be527ee70c9c5e52ce5b149951111e75ae1cf49fdc0a5b298724308490e90ecc6fba774127ff70e9a3f05d6d0da483397f5513adee5808bc574dc179d0762f8f4905b7744f1e38d4adaecb2b6b6e3079457a36fbe6a7e1ccdde3f1a11b32ace83c24c167e3ef12fcb0624da7168be9a99e6469bcbe5dae052caaacd5004b1996cba61995dcbe92553bb274a5c1b124ff47509755aa70096bf2e1b3a87e3b83421ec30d898847744bcb60e18eef92e51c2d49b34683001a2e7940e97476dfeeb0c384e893b7c18ca5c225d8baa9e70ee7444c7cba6bdbc64ca0cc07b3255299bf5b3bed81307e50d4f8702ea7defa182a7ba429c2364ee9670ff1a50da04d9f5ecf7f538d38dfa98a656217c8bf9da2e83b8635dd0056721f212f1e7ad2fc46d12cce731b87219ae158707a8d9e20251afd574c1d661bab5037cfb81aa86cb99cb4e0bd103f90dd1074a3570507b663a3e01da6ddc968c796c572a1970c989b84cb76f7ad5d97f47b23f0c4cf947422f2bc6cdd8ef8639a7123d97ad814aa50dbd5d1bb59dac78b3713f58b34624666e8a654b2d58b6d8428694c11bdf274362f427c21ae62adcbfd6167af7e8a605491f21419795ca22115bfe3edb58d845ad89ec2476343fd1d2171c3946c01c948f55824d4431acb1c48ee4317851f6af6252bd8d9504142a6f3d9945a87c6f3cc5ac9f8eb6459f18fa41e53ea639e530c5884e5de781f7a1865366f9f8e24b953f65faab79a45d8eb7df55227f1a7109ac9ea26dc07de5e8dad20ab3874a7a21631e9bb911a57a116e14d6fa1776e984ca9bd2cf740ea430067334981b6d0f355cdab646361adc2b663a3a756d3ac53fc093a5f8fc7e9bb9f1ebb871d3759dd22844a898eecc121bcfa7ee0b58ff539abcbefe96d7836df870cc72b6de28c38fd57f76716fb344033bf3246420674e26ac753c33e226416db01a9d1c5540f26c513a6825e89e6a70bc1aafa33ebd70321e3a5bda437c5998ed14b9768a585f3cbd9bdac3646ca7736ba081fc685f26c0896ca3ef053754c51a6a887a9ac945eb359308d53fe9ec797a72cd5487b09b11247e7f08c8e7d206f92dac197e3e2dfaadf8797f19d344bc854aa830fb8fc4e6973b60deb48456eb416d925ed30aa4502f7abc522b0825e9718a5d3bb65115eb9e376f70dd2d5a45198825d04f99519f62700e288efb89e1e5fc4c4ddce44af664d4137cc62a79c342b91228d65bd3d544873ad8109ac0b73c3afa7d7f77adcf95f8447226b17bdd14e29e7f498b04079f8988dd33b2f136a42161e35faad955ef28ca0661efb35299ef67622097d9906a0457e2a85a432e852f9befd4382b96157a3e1689714f55c638a56ad5168db945f17fc13c1a9620df785127d91ec2a12bf995694721dd8d0dc31d20bf22746e7a0985229401295cc0ce7559f4e6a4b32e55d6754c7c8ac62cbcbc74786eda2a23285969ea69a7698123a1916ef4bb8099f4ca398d4461f15fbd3f9a3973d565686cf88d37fdddf4aa7f5cc867d0001ae06b75d9867ce2c1d15acd85dc36322cc7e91d41f719436236c973871b6a1365ede1fd635bdd7644c79ba688a8a7398a74553ba285a1d53d15fd188a5aa63771c3d35734a6048ff3262bfa728b1aeaa17611950ec3c40cca82cad6a2acf7b661049fc7cde5be612dda547c5b0e303ae2c9c7944b73f45ef3be192e63abf46afcdbe12352b32035f7ae823a72948291737ab4f91dfabc34cc004d9b1d4d0829b7455ef15c7ee1cb56f93c5e97e11abfdd40dff63ca78aba96408dbf0d8202a9a67954dcb29fd5edf2c5a192b391a48247379c6260117c0946f80973cbfc21082cb64ce7f01a70ed95c10501a733b15a288998f716a8e1f74feb0a5604f02f11e28ce1d1330b0b22477a14896e36b56960a6de3a4032c2fe633a7b5f12540c0a3d8a930e7bd5758cc2e610d4d899929298d64a0128e996880b179589103d9a7f65007a5c5811946399ec9bfc18455b54ddba39c76f914ed3ad705eba92914cb59ac25c12087273621b05e3d0eb5224906201fad0fef369755b95ca30fc2bb1f0edb360be0d0b1673c2ecc4bbdb1293d1a3ae94ca8c1085a646fab1cd41e0d608359be27e0c902012537a64e2783a26fbe08c4efd16b81c3d81107932b667d5268ef367e1813a46bd05b2e2aad183e3906aeb8dcfb89cf012d0d7940841d8287705767dcb0c057cd575c172b1ac4b3d1e04f540c716a4f69dd04efaea685dcb5f738dd8a9c4502175ae1132471f058a8495e3c323d076f613f436d158d45eb1e9a519d994f02fd4c454954659d24f1fc8f0bfeb47574a767e8b7274a42e3ea2cf0ef099de8e5671971576f9aaef03ce59bfe21b14473942ee781ffb69a7e9eeadbb0bd60399e79df929381a2bf1291120b491518d050eaefa5727aaf72dd0625d573df6cedc50e06328611f0b6082ae41b943dc3dc4a5c17b77c8e575c5642dbcc9ccfdd81d0dacce8d56c4535d53dbd91051e45ada02c5b3e5460e07690bcf1d97bedfc140929fd62ff650c269c7342137177b1defe53286eaf4ea60ec276c40c65a2c0774345422a4187cbdd803bbe3a21ceb17cc16a682478362810062739f0dc5d0e297e6ff2c822682e998954ecbb0be3ebb5f5657bbf431f70c1609759e308431e999df51393cf15539ebc6e9b22131c1aa42dfb1e4f277be7ddaff28ebce06fd7212570c5c10b21ae53859d88a0d38c73c956b67d2e3066d29be514e5a7c82d8cbbdedba3532b628d6af20356350bd6eee09103dcf8aa396f515e9bf17774a081a1ecbaa03c4d66d8a0a948e9938be6a924b4b5d36a3251de33cd36c2ac240b64603c10825ea72192b82b8017df1f0ccdbca2d1e7234dcbccb4ec32432964147dab67ae1d0a769562b0cd1c8d0cafc8a6365ec65d0b304696fbe7197a25e5ccf3318be37ccf9d7fc10aeef5e6b317ea3cee1ffbd37afa6c7faca2ab65c0017ad1f394c66b83ba827dd2fe86c422a0cd9bd1dcd3c943d79dbbc359bf67b5fea6e3487ea5164764e3723c44785804ffee1a2e417a0619aca28abd2f0415497a9f531668675e7fa6a09b83e89ce1244e18a59b2dccda4371fa13dac379adbc9c7e9886c1c461a29e5277706a75fc2b0731125aebb72f3cd230cbfaac998cc47684608e2772300c3b46e9f10f0bd4ceaf4bffd274caa5f40c0fd2412366d703a1d9f9065f32fa4a013c6877cd8e973357ec9d58a47d302b5e1d05dee927c49133317ae7daa30fa686aaebd2ef6c876e6f7918ac3f54b8eeafa69c7345cfcf32e491d70c23e36fc561dcee99ba6838e24ed5714f0a2f62372156557757c3c11982877bcc28118a2a6ccdc5347da1cf5753d613eccd1cf329c3a0037a6d15a5a9cc08495ea30b22a90389bd8dcbf71003ed8ca9009fa4899db25115df0fa16e5ce16bd313f17af84a18e98b9b3e5045e1d96d769583e1464827ee4b2b05aab1eddc74a69047091e490cd4fc1c4688360df9715804098c0b7972b929aebcc85658cee8a1a89c77cecee106b402cb656e4b100426c2d24f1a565275bbf5ab69e6fc5b1972156c5d5a17728af848f8c1e5041104864e55bb52d11c817e1d6a1c1f23ce55538a16ed0ee4bd9e26543fd7ed6e576be90247a64e230186711bdb66f42477ccbdba193cc48f7aec94084dea21afbc60d327da0c7e9554f3f71f23c78927b33e233cc8740599314533e1df9ee96071711799d9e9c6d218268b546a46343ce3bf9df7aca0616247135af294aa0373c8f83fd8602a85b797e6185a63f7d289439021c553ecdd82262a0ad00641b2975283c3709a6380524dbe269c2770e53160d05d71417f2ee4dcefe8cee17538c6454a0618300744eca62e4dfea761b95307501fed5c156f2ab17086d9905e0013131625d89d5049cdd0e4dac34c6dbb475af00dbb5c111b15ec29967ec5b49e860d752403f3b54ce1f33aca7e939ab201ae4d2e116621ccf389959153bc70684323607404d220d3e90b8f29bab3aa9eb5e58915d0e00ced31b240d47e4e427073cee9aa8973b885da8599261a8a2829e90f3559ffd88d8b2632b77f6251b40d774b9a5b32462c752d29490eeae1ce36904e15d86593ee631fc12c1ed779218d04231a5faff8948ebe1040a489dcbfc904f713fa7f94a122f351349abcf6e7d4af0e3e3625a0f00f8db4c874d245a603a6e0be607e3f3af53e0299d94f33353a8ade16d24c7c96e6b3027aa5c95430acca650436ad9d2c0d8c509dd8ddcf54985355596376b4999cf3afd821a97c6a4a4590d870197a261b7e8163c89aeeba3d138da862d208ac138334874dd1f5a709e2e0d044756a6273caa189cf883d9a3871de301e61506e714587f90fe29a130fbe6142dc004756d942e41386ba8efe1eef12f9ee07ba589ede203dd0652a922c9262fce2d1d052e6ed9afac26acc5c79b1542acecb4756164d699b280f0fa37410c80f3515003aa19207076b8583c401cbeb5aaed07c79f2416216fabcd24e0b311887407378b5bb4202e70c77e46f809b8712f7ef66a881e02166eff3e97259996052af57df04f84953dca4f521aac577beb63403256e2de507ec59ca16d213ddfe65e2a2e18c91cf9f7614182281aced4080c87ed1d1acd836748e961a8bc0ffda6e2acd8ec032872629162082b375c4a6d76619b0cc51d6f82b8552e26387efd134f31a19a67019cb9501cd1f26d188ee2262774b8d84c06e1cde7ca3a6c32218e8962cfda3ca1e3c96559317673c298414a8833baecc3b40b8239c943785561731fd536a34867774af0dc6738a11f3d496d8b1d9c662a097471b2862da121519f1c8cc588d3b5eadb322612eb087011aa7377160bda9bf031ea430805eafdb34eeb11268809fa8708deeb3515ebf2ad1a04ec9ba3fca2b7fd9fbbe5eed8ee548a6ac47f5a1e8f1e013aea328b53ee3e85a2d893aa254adbbb8a1430c6a3b06227311320e6ae15c694212428df4df6369193a24a9c03714d63ee64347f566dc86be6ac5f53b13f5cbc83522349b616a131e60e7f62c7987caddd1a4ac38c5ddb88dd24bac5b4d6d1b6f92bf8dbf3fb9cb457c018d919ef56e07b629d9541a0db4d4291faa1ba5dc81bf2f2b96d5ed60251215b758b21a68680dcb886b025e6090c1f21b38278f9264e2ff36194e9f0df11c684d56fda1fb728592964d7a264bd7489e3ef31e83e00d24dbd0353c0f9f7896d40ec727492026ed5a6f538d518b25aea0e5cd879f00f5625ce85fffd1a8b293f2c6293c18bb18bd24c4c9181c1a7bbec912cde4f401b577300d9bee65c8e346a5166cb2d338d10c9bc4c659e1f74a23a8cb9a8020ee8967e74ff56d569387d439b1ec36b0d3219cc64c2db70f2b2c15cd43330a0c1bb56835cf436d15943a144ecdb3fad155b2dc0486cae6ddcea378060a6206bb591440b89e4ee1f54b2ce09eab705648f51a099cedee2c22cb018901e4ad7e43582820106d799bd7da2d65cb40fddfdd06e561320fdf84f9b597ba2f2fdbb591b00525b140de3683f5f6e1b9f42f241e68914216e453e522e30b46eeaa9d38a0f5f106b01861e810fd99310385f44778bacc8ff2c9e4003d9a816f452bc11178eee89f3877024d9da155ccad6e4c7ccc45301b8f1af0cdd9fcd7a51b84303237c7a08e9b03a7b838b4d78c737f6e6d170085fa7d428150009b755fcfd83d82a30cdfaa66902498b829463989cf585e4fac59e924cf4dcdff4f05dd0edc448ce430ba3aa83327b56f9d3b22fd9a4dfed14364d70f173afc0df17e9f901150c67df6b882a939f98bf6dc3bfacf15600a354280e941baa2c302526d602736e974ba16aadf3d352cf08099d038ec5107ce6079a5763de2725ef083fa60b82f07a0fcdeaea0c220abf1abdc9a806794c677b6a1087178b6b0f6e2081ec78159c551ee0c1f89ba109da0f517ec0eb1f3998d9738d3ccb61940af8712bd6f78ffcb1ed0b25f30cd1df87df1eaa4b1ec5ee01dfff1e3cf6c09c21478294bf2aa3e112ecd2e043d22bd7cf85d907c4374f8f217769437e3705ba678b9bf9187d82ecf7aec49678569759d5789e390353c0657e6f7aadfd3999a36373c9a26dc7f7fcdf67cd9e3899aeea97f3a87b92bc93f3d770d0bba4f093a97976fc71245294e304326ed3ee88402ceef816a8a6e649aae23d734ee8da643ab64d01d3ea7f74c3a19b60715088882d6dba562c9aee6a51cb4fb01fe06a55188ef91239e2d3affed934f1fc215b157c982086558c42532e4144e1eaf99135d68f6f6224b297a489edbc463ee48766b8861e9a86468ace5530e3d0207fb00a3709823aca8c9aba179126bc0740065e07bb048fc231359062f2b91add53b9ab2954eded55d027245e833001f85ad71e1b8aa424b9c02241ee3b7c54dcbb315c2c430d175dfd28f1b42ac4e7418de082df717207e9b008161205739fefe9daabe5f7817ea2243e9580d59d60badb8012d3835e850851327945635e7e6480dc2c3d7650c2d16e587559d63789bc28b326dfc768ecdb69f3bbf160ce7603fd50240a1f78420d13ce9ccc57fc2bc3340f1ef0658cf67e2dfe9dceebad320c5f224d256ad2b610ae260345cec8a5286331e31762890f1a4bfb3ffae0817779be6c12b3ee1d9346f6e88780749920d4dc3b42c93779f6acb05478a7e3b5b36d8ca769a55d63da5a3085e8689afa92cca421c17fe999071409fb9de9da557ba38c7b8c2ec3781838bfed682416f7f34b124851e3b5fad46da59072ba8e36c77a62e014450e18fcd03f08d92c3c1d80f1e8d332a269876f38ee46bc6a21c427139212807400edd4cf7372445ae64be1c3e1a83298a365a827196413b2141a035baf3061479b96c1ce2e774db2cb9a7d56a7f042219ec2c4dcde8f17518a3665d3d509ee809749b98a8a3c2feeafe72120668358d604b68b2ac2a850dfd9e99c3b086604714a395c5aeb5607cea2120c04cf2e5ce5c1a1457b05ec83a840afd639ce46d5306193d2b359e9fd3603d864910ad0a396d1c26486d848cf43f101054cfd6e0fe4ada3311d77b720f7ca9452e00e662c74118e3f7d14e13ca891ad483af26cae3ad2002ff4a397f88861fdc75d954243d2d6715275678044ebd238bf8c91611a169f0a1068a8bb05d7cf14e714189f5263afbdc5f5fb77c7aab489ba5241668f819469d67ebbe48d255e736e7f62a2f9620b90b908e5f385c9156ec66cff2084571116518dbd93c25281cf158ad0240992dc7f0817d873f517d595e13dbcc184b1aa245c33cdd09587102a76a002d4bc24d8fed859ea41b0f110e035a1869ffae2066609f427cc843b34a7e4863d703b333a3c542cdb4ea5082fc4581d497b925655046fe14f44540549e443cd871fe5e0f0c2ef8349a06adc2b638355e5101c63cd88704b699c6ff96af4705beac9b70e80b74802a11e0f9d7724ae712798bfb6facfb0820c8776372ad18308b406c56b13a566e9adaf7c8321116bc121fb4235dd55fe82e42ae06651f1e050f8ed979ed2d288b3eb5d93b668dfc98a2e13104a4c6e07a09291e4915eadf66b9ea787a90a1acd257bda98eacbc52d56f10468decf55f857af3382781b459ee4f59d9f479f432c01942fa12c4e769330f8b7128b724e7b841774552ce1fb91ec568ebed21fbc9ec24c68d9ea1b6591478400399cd23f8f8f6356f4f7d5e0b3535900b025ee0a3dfb19504dd814eea5fdb9bc00a343287940e85eaf6b0706f35a8d70ed51500151fd6c69e8bdba4de83e482fc41c60d72b8a2b723a99190e16167c865bd728b72f3240bf3a56b6ecafa09408450cffa016ffa99d30a780d1394d481d9ba7ee6503c86d515529b27a13648627d45077b91bc32c9f553a0da2beef803a346498e0422f8c68c8b6facf3d527a8b235221d62b0c36bede91408a76f4a82499b106d1b6176a05100dfd856e51a41faf16ff54f2ec19cdb69d39f4a7197805a259be0336ef41f8bfcd17fe9a5c022307910132d13945cb09677adde812d090d67826936212ef5779be286f919b1b7eb8bbb325426d83fb560bc8270e3f5e954a29f282975b40fa2b0e9bf411ec3aab3415f1ffd1d91556318533f502804a71ad98a25f7e14e6ef5e920fb165cf7bb3c6ef83894181e0203c001fb70fce56c16c85158ffff2447068914276d822263e2647afe2a97d737a732249db4b1e2492240c499007e482de73fc6856af700d24f5003781074cda69e26c9b99c0a9a58538ade529f7e7e09505360167f4aa2ece8e42a16caac32791c5e08dfca163cc0c9dd092b90d3d4abe54d0c5abefe8e3805b9bb3629ee0c1d982ae4b2de11e9e1ad24ce4eb42aa1b3f649f52b6d98b2b8402de3c113398e7cc88cff0115a1d99d896267d4326befee27580c9546d803cd7195a02ba2e77c81ef4cb8315914c78c3e67cbbaa356b2c3eecff7bef81a42608c66281ad2a446c61a44a159d2cafd2855d8a5b0200ee4f0f94d589ba2e48e5883cee64991eac26c440b48a8afe86a7f85a1f5307e8a20466b88e3ac756ac3fdd9312b3163ea658f6a887b886dbf331e783a0608ac8ae37a61c6036c8fa62f750f090777860b297fbf188922c21c2dc9c99d2e1e6cfcaa46d594627ececd226417c08b24cd9a74e641ad8fb894ad6ca8a5657661920d4611f681aaf214e35866ec06d750a6985a0e45db9967524e2c8cea28e0408782a4c47e0a7b2f46c2399870e5b16c7ad307ef8835548e24b1c3286c2bd5d5de1c1ef13a9fec8ed6403bf278c5319d99c2d9696c02b16480a22421f05a40f559797115508e1c2b16ea8aac9f2b318fb04f98ed0ea13d71be1e9bc4a654ce8d5f8388d4c6318cdebd045056ba098e4a7fc0a3822c4939c088f43925172c4c91e006e2c72479ebffbabf5db70436a219f4c44cc3137d19c20bf35f617a604389351bc87e2ebc0b7e2f44b4754d9e125bf40e89e685d5da2b2dd2213f2645fb70cfd68c941606679d5087c02d43199c86474148a2801282bc01f5cc51323e4e68edc7d648998ed7b98d1939cab060732c49d221114ecc2d352a25f8b7ed0a3ae75850eefa89f5c4caf4ef0d84041e337d77592cfa9119b9534d3be0a335c88a3aab87cac897c346027ad547c9e8102b887c85446b789822bf05eeef3c3e99028bfa109c87ba3e244ede57e24a710689106a2550bd1bc0a81fe0a89b6fe82ea3bdeeeaa44757966af86a0e51e8b1a9b3fec2ac0deacab166b7f067784f744f61cdb72172997f32a32e08bc8d5c2109dab934ff46e6e08d835a500b6a580400f4eeee08aa886f237ff904a04a8d9ee559deb3d1bc3e0417324bd9c81c9d1eaa912e240aa47999fd1948d485fcffd707d823efc625f28eefc65c48871f18c364e5c28b019565c53137ca5a3118f853ce2fccc08045458975da1ffe6c32686955f32181c9dc2a3ed201a6e51074c8853150b25851b3d2779de4da0347d6a03d151f6842987e96be9b804b1fa9a1c5646b1289d24b682640d10288662b69e82a028f0a380254e79c7a4252630b9c162d1fd75b7ce8c652f86733c63fb71ec68f6bd34969c1505ee9a490c02e543827793d76aeee9d8e662fc1e56909f878b98903e097a2a83e74e264169850f2b0a812395f67e7aa29c507d9882d7ac4fc89a32452e6272ad5676b321b722585ff27f766f71594af24d83d98d6fa2b9b8f10a9773617119c108e54e283b57420fbf7f5857044c9b255a4fa51c22e4c45c9b25feece8002f8dd1983553ae7540bfa5e9bd146f187c30440f35219712253c52a822cd814102bf1751eee01391c23e1c438aa74cd687f22ada5860121de274e31ed83e3fbc88b28d75abb50fbf296865ec64330a5db0a79ef8ed1e7ce6b5faf69b71cd2fb2d77b1128500925c0c5647edf4413926f0da9efb888cca937eac34b6399410800e22802fb3402df322a39b0ccf323678cc9d017246d017bbbf2c560668e58e1a6391c8044e1c7e6de317a4c5dcbbb6125b5d32c7516c1bfba5c091449f5b9a4d1fc6b067c441f19a1fb03d9a92c0900a6628057b74888d9909531ad902bff1b1081935561196117607c62d4c50ec881825b18415a2852035c9ecb23a76019629ec5e8c4b4c01c10e04a8d21a248ae191794b3ba0cc1060ab59581c8b03b3fb3143814f83483edfc668582831eb83198a311821d4d5d42333e36f044b2ba268cbf500372d7208409f80f3cdd15c64be5089ab130429323acb6ff308850beb1a7c24ac56ddcb4653b668ef03752f85276b43c3fdd54a8e7e6814ade3844caa7491282dec383fa7584c31623bd9921753913ed74da3f4886446fad886d9f60c7398e6bdaed1147448ace6a6fa189afacab9352300725b453a8969cba5eb25535a9c690e4297c4ddb3ea5f1b5970b21b5d975b0aa2634f36ad2953c5fb40696c6e483150a7c6f2cd39d755e75fa4a73857687cbbf22e2cb1314a227e13dc29aa1013315522995f775c936aa253262149e81bfaef65bf2ee62d316f928c229a59b01627a7c7875433baa4653e0280b42ed48686b8e48849e12409467f8e60d32acd1a84ea158b269d57f54995acd199e5ed7ea2ae56c672bf08b80520e8916267b038e865689ccea14ec57eab6d9809647f4a95817f3963661582320f38784660c3b7695f6ca90475266466064414d4c6f584f74a388ebabfc0c413cd987c81247e83ba2ce995a75c2b3cc901ca21b710a6f5dcae6595fb5aa24cf4d12beb45022e17e1879052eee0858867efa1bc03796afe6aabd45238ca9f22a1820a62ea03d96b17f12094e345a09a0ba1778d17670fc66c347112b32fb5257731d36678cf1c3701cbe26ed94964561cbfdb740f992ff43b6f371374bed20d36ad5d2107e5142da4de83bd4e196c88eeab6e601e654a65fd7b2ceb933d7ca0c7212e8792585cf6376d279ce363077f00cbcf0fd94d5b8c9a0e88a9a0bb1b427cf692853c7749171518a0c45add6a856f021e07447e0a3540b0a6d0013c0c3c0c3c0c3c0c2c7566e6ee1ddd7d446b5f4a995287468c6cd424d04829a524535a3674d909acfe19fdf3d5dd9f26430a700a380aa7bc031964d8d5520a22efc9733eb9cfe981900d7420630ce6a816fb324509c74137aa6020430c26d3cfc9901106a3cfc9f221b439dac61918cc2fc266c5aad6f39a4a252e90f10553ea5c26bd96e4a6d3396478c1a052b85ed1b92e18ceb349cfb7f9dd7f6592c105f365376d078efd42c6164cbac48b194be90d2d1d3f3a07563e782c066468c15457624209fa517447454616ccc9aab25ded332c18bcb6b29a8b979cace4645cc1e0fee122f4870f321a5a880c2b986d542edb7693d62be986168300fd15baf1fda802195530c8ea659d0b61e5966e810c2ae40c644cc13472fa4c50369282f92b9c3c75a5f493340a264f513dbfcc68cf491a0a461d374b5ea327ab093fc19c72f61fb4746cc8c50966d5ea921d94aa385e134c95f6ab1fac3db3e498605056eafd923c29a758233296600acfd6a2f564cbfca404a3896bb29dfd7eca974e82b93adb57534b7a3f2d12cc97e43fa74b8f60d0191b31a1110ce6a6625abe4cca9d229864694f397946229893526b29c7bf219863056529fd13826147450819ef0b355610cc29c9652a6a6d2a8780604e1767e13a8802193f302949c7b5dccb34a99d0c1f60266805d9342998707df76b52d256482f0ca6b694d41d9f4984f0c294d652ae0b79b99e555a84ecc2e49919d285c99214b52b323d4bbe7361d2537bfacc9399b813172813b5ee94240bb9459aa6bb949d70e28e105b982f29cb4a31ab6872d24387d920a4162625a697dcdbe649d2a91ca01dab3512420bf36625b790259e851d4a6faee3de474d0a21b2309fa5d0fc9ca389088985c982c8cf901f9ebc465898e3541cdf2f5141ec492222e41546d1f8dbfce4415b8a2b0ce22648eb5239ad3008bdca25636dfe7c6685f93e8be734d94fac5f3c44c82acc2656e558b65115e66476f79d04b1776e82231506f95cca6e63bff4895061721125db43c8ad4939a7302569948a9e6fe33085d1567b46d3bd529893d44936634f4e533e298c66a66389265a9c6d7f14a6fc582f66398a5eb6446152a1525225e6c44f97540c11120a93e928fdf86725454982c224543229bde4f609c3ba7dfe505fba75d6428478823bb91e3a05a1f7b626847462f330aafb9d4fae3e101b15423861d2266b99dcc8134a12db84c1f45acc944ec29ce86ac294bb6afd2e7eb05c76264ca5ecd2e9a8d89f151a21423061659de51e2bada34d42c8258c2d3e964f9ec7b0131a4488254cad582ac8ac8584904a18d4a5ffe960c24e95921226255dfe12a38ffe1f388e204226613c3fa9649c24e5ac9292304949773f3c94765bc981088944a1a26c5aa96caad62f268440c2d859d747fb73da9fa40544c8234c2549d99fb3925e72c511e6107d3f5dc1d20853c8d0f61b2abd45888c305ed6be2497b86421ba45189496d44912eb0c9d4c4518ccb2bd791061224c65c9ddcbe40f11a6513b725ffab177cf43984411a2e77b5432f92419c22c7e5292a32d8452824921cc39baffe475d9111d214cfa2499ee258cd4eb8b41184bb0941ea4688b77521c4910e6b4d3257f295f34ef04c264aa922991d3a7845072430b1026498e79136d2def78f6e30fe60f1a4a5b12ea5e4fe987bdc40e7229d407a3279513eae795b3491b481f3e18fcc46cca876a0f69efc9568297a0d4c482e8c1a064536f25f44d754aca83298913f2e7c285a932e1c114458f78079424081d6ba3951ab211868fdeb184103b98e22dcbcbcaa730a25207930abfdf6bbef7e3173a98a45c1fd7f1a345e660ca254386771c3f495d6c87103918e4c9ef29d9c9c7c16ce14349b26568f930e1906429c7c7ba59dfb009efd14ebe298a1037947f5c74c74b4d49b24f84b421715315537ebfecc34a086183496a2d956ac47adfd7018e1f6b3025119da3c3675afe10a2069332b922a24e7cf67cfa917e084983e176dea42a657da6321a4ca9a2c793f3fb936efe7106d3fd495209962ee86c96194c32535438bbd392455906530e5fb1cd926430c7559631a5ea44633067bb14fdfd12fb102206a3a9679f1c7987c1bc55eb5752e5dc173b37140c461731e2d5447f43bfb0e74f964bdc4b7afec247eb403abc60ece46731b392e81cb62e183c7fa753b1a75971e3c23e4288ce9fd25cf810b205839b5ef9874913256d5a30b6093a7fae33a5c7abdb4348168c2552448c656b7a08c142977a4bfef15cf12b98bdcacf32fe910379e7a81a8458c1284a666fc9caf9eaaf0a26d325bdb24db242a86052427ef6d35d77b96b168f90299883e5c94e995f12122346c1438814cecfd6f81c47bdbbf123480ffe41481434ad976af601e46df4e0d1637d1002854a9051c1efc3cc846c0c21e409c9b699b899756b95bed0d127d543070a498e71c019e2043e437cba090651efbcbe237f6c1d29840926d16a428a4921a43ffac7d5216409064f49755fe74405b10e02a373a8ad21440946fdd8f3dfed1e948d21493089a273f6944665bb1c8520c1a4dfe3d3577cd3ea241d407078c8114c6277705bab14101c1e6204d368b6e7ba105204c3858e4a517ce4f4d53b8860125365dafd1df44b5dbc103204b3c92565b14bf6e3c993108c277f365126b829082653f26cca9fe9bf0f01c1dc21840c25db08b16df981494d2e1586101f9847d7dabfefddf2b75e9804f17d9252cfeb40073872c00b5309e1a665b4ff9c30d985714776ffde9ecc173de9c228d25372edde743139b9306a77d27aa2e8b5b72ae1c220d5c4ec50a3dec278e28a2c199a8151d216c6107d3ada9beed123ae85c9eda4d45a11ff73e60d2d30ec6861f2a02e7a479113aad7599c52b6ba2c1859b230ea49495e848eddd02a868617c4c234e2c193f0fd3985d8817cfb000206828529e56609be154f29c88d1f36b2c0d85798ecb22941ceb8499692b8c2147c2e3fd8e9ad30a7b09197fb4e55a9b0c2549f4709ca6e94b8b4adc26cd22cabc7932ea8d85561ea344ade775392074b954c8541a84ea6af6e3ef2743b5498662f87b19362259f52d6298c67925639d1a473d85853184fa7e45726d23f5fb414a6eca2fae68266470ae3094a9f6b88f30e13658dc270d2774cb9f0d23837478f1f364461d8d9117ea5dae54d05c686c234ee398e8e7f7cd473ad70000aa39ade92e6b42771fa270cdf25666937f11b5a5fdc78307ae8f865c30b3c6152b279a79126223ead9d30ace5363d91730e74f8e084c1bbe45ad8df1a1dfa264cf2722abdfee95c666ac264612936e54e2533c1dc9e742aa76887031306cfda399f83b6d8cc2e614ef2871cd1d259c2141e5659442dbaea090447e7e0059530db8ddccaca262fa08441adda55c5bdd33a964998ba469a50614d57fb9684d9cd2feb9fe09d645674a01c281206153f95564f526772fd02489853959b8632e9c1e31f6190a1638fee30eea397234c4125d325ebe69f6ab9118631254f3cf35841052546186eb6645befd6af08955c8429988fe56fb8d9b5ac08b39bde5a8a6bebf5393b101030c6f08244184f927c4dde5fbeed141c09112639966cee5baa8e25c3910e61daec4c2b593fdf828630c971264ba6c79991aa0f1b7638d0d2f0824218cb4274ba70929592a453c94408f36f55c9ff191fb5c341984b256131ab09c224b52425d45cf8f52b4820cc6742d6e4f8018451df2fa88a27986c20203c74a09318195ef00773aa934dd0a6af792541025c3a070f1e2cc8c183470f1b49754084096633b92ffadc4e0ca1aeda16882cc1684a050de12674d9e78828c17c2768c7d42b293a9c9260522bf52577899060124fb977db9c7096fa11cc595e43b55d6c04933c29dbfa737f3e2b45309a962e31ec4587fa9808114aa57ef4a9b393b4213204730eb262ee56142b698b08a10cbf70d9e3100982c13c7bdf3f681f53824480600c9354c573b8cb153d14f981e1e4e0bb880f0c972c2895b1d9eb367b617c4be2ae3d999caee385b104aff42054b88f7af0b0e1230768478c18ccbb30fe7836e1e57e94781ab9e0033162e80c5d681546ddb52de532a9c439c1670f03480f1d26468ccc85c174965fb68e3866e0c2b079a1b62f7f8119b730ad49729a502a6e4d8b6c61fafab7f5d7daf9fca98571b47e480b936adfca1dba4d32b19f85c166444f908f2c8ca7fe2f85df159d662c4ca3f745574ae9c12c0b0b93b4f125c9b97c85e99294d9c924a12b4c77fec9abc3d80a730eae1a2679c7b8112b0c5aa48beacea6e26715064faa63393ac9235f518549e794a863f97a4fc9a5c25492a4848e6ff6d949850a93a4f7e3459ba73079fca41ee4a5db7b923903334c51314a61cabfb7587525485121854198b06fe16369b59546618ee5eb7e52eb9f1889c238e24e2e9b94fe4f4e280ca355a408557240610c5d4aca41e8ff0973cecb7f89dd7bc2d865e7f3259e1053274c2528f57222fd12efde84d9c4361dd7a4cff79e3561f81456c6460979523c33612c9933f76db959a9c484a78433d5254c2926887558132f4d96309992740aebda59ab2f95306698a06fede7c5a48e1226755aa35f62e27fd6266150294cda92cafbe4a8246116bbfeec2b95fbc248183c6698685c12489873e50b37173b8c9ffe11c650653e97767684f1554ea550ba4f2ae136c2ecf1fc24932f9c78f28c3049b72e9fa690835e306311262f25ff2cfb198a3098ae67bb248d0cebc488312311e6d10e4a59fc1925fc69c78e12cc4084b1ebb59468b2929c939f7108939493d8f953d2e6eded0c4398ca84332bc98252ea8e203672c0c3c717561b985108b3879ecf1bb272874b99410863e5c7a9c99f9eb5a2ad15cc1884e9c413c49c4076201d2807b21982307b10a3939206e2a33910c6b128a2a349728f6e11204cea6efebb649552ebfc81f9ac37b1615238ce0fa6e49dbd1eaa197d3085dd522f49afca77bf23484a66f0c158928e7b12fd6135630fc6b124e512c2e73b6f2c14ccd08361d4092dfa4ebcf281340f26414cc5754f7f29b6aae347e7402ba91f69836f203f900533f060da4e5d520ee2ff94a8bf2388080eca81a3c71733ee6050ca4debbefc87e7927b740ad0e10102edd13a6ca0c3e3970333ec80c8796525a9e2dd4bdd5cfe2461b23162c48801240c17810b2490a80f203d8030a30ec634110af2821974d839984b6e7d5362a9167d25399845252bb96bd27130fcffbba510177a1dc3c1d4adde61bdc1f4bbb5ed665262c4403970f4d0c1e34f77937b9bd10653bcb61cd35b94b41e1423c60c36b0e6ae222a54e9104be003fd90715c30630d0659cfe322bc44ef356f68d908c30790ab9ca106a3bec8d632e11cc81b053162fc9891067355584bb27d5037df413a82fcd8c1e3b7ac0e0d26d1bcc554698df5669ca1d8dfd1937e5abc366386197446194cda45a512764233c860cec9a458b7923406a399646741869bfcfb11c3c924afd692539fdc0983498a1e378497249a0a3a184ca54efece134c7e6efe858352979643bddeeb055389f8b62487b30b6856b234ed2cb94cb4123be6c73df5a63773c3195c307d301d4556b26cc1a4e4b4dd4e9e32eb3c2d98a49497d34d36230b664b769d438b772c7532030b26e5e76ea1e2c4f22f5de12c4ab2d7731359c1549fa5e4124e923a3b5a0593e5e8126b2e4605835b09a2453b5330b9295df2a76ef70ad60c29984a5a3de97ac9c4ca9f281884d2991f2fa76740c1a454d3d3edef1d98f18462bcc9155a5925b5e59c4b5b38f943c80c339c60fcf39cfe25c91f7644304e096634c1a473bcf4f1aff2baab194c3075122c9bd4ca2667ddc3402798b10483afc973b6f2f1701d61bc40648612cc2988e850236f2dce3e230946d5fb0c59522871eeb0e183870d20e88bab028219483079650d2dc22fe7e8114c71f9263b32e36388cf72986086118c223c294b21bed7bdf403878ead9a5104c3497b6254aa764a0e1424598e194430c7b7ffb93d916fe21d831943305a2a4909216e6b7b541da01d85c70c2198fec268964932901f416a70da860f371bcc088239b6726e75f4e8f6a01d387e30901f3b70988d194030dc58965eead38c1f182b59d893aa2ce7c5cf0c1f98641fcf25c4f35e985db5f546c59417e66427cd466a96f21b77614e2757b1f29cd67f45862e4c62d6d4abbd935ade64e4c2b42d62458b86caf7bf0c5c983a9c10321ebe19326e6156f912f46335f401a4870c5b984ed056e5d9833a5a0525881143462dcc26633fe80b21d4230c2032686192d1e9e7a12b39da79e418418c18326661f6f9a022d504b9d60664c8c2242a7d3b9b248a85c1240d21ee3b0579a197010b93fcdb6525ccaf30a5ebf5fc63fa53bfee0a935c727612cd9326468c183164b4c2682acc8e674b7125cdac30577d50ff91253d6495b10ab3eeb5cc28317bad36556118d926cd73492ac91f45304e0976201f1ee811e4a010a0f50872d0c12a15d4b0710219a930ad9ef822cb73389d1654187bd33b4d7a1c0faa4a9220e31426299f34514bb2c8c6984c61ee1a3525de9adef97029cca33e45b953f18430415218763c283b3b95519873f49777edfe87284cef5f2aa577d40bcadea49a5b9d1dff80c29484998cd1cd93547c3f615611da84bab7b7cec81326fbb7f8549fa12f589da84e558bb6b03f270c1fe3cf4acdc509e76fc21c3a8973d298a07151d78459dfe22d8a7ca7f52f13c6eb0e36e22cbc895f31617e993dd7503b2f1b5dc2246cb5f949b9b7b39358c21c7666d94246d8b6580973a524b7eaab5ffc1351c2e85fbe2323ea4998e48f67423d95e4ed4ac270fb9ea4cf277596db23f1ef9d0c41c21c32ebb2c8051f61ee4ac2d475a87075bf238ce1db6984f972cf2aee3bfbf6831126fb35c1eb73671166bd92b3469460258a1245184ccc77521654eee71361b89c82d2616d2dc80b1161fcbcbf1db49cb07c904398a45272455195b5ee7fe320c310264bcad229a9769ed54298bf2a9b9025c93ea21d4298cc3e499224ba67bffa066150418995ff949dda8c8230abddbccb65d1ce391808f3c8cbad2edfd49b1910e6dcf97a314cf0c71f7add1bf9925b926f90e1074c925390bf2ce983a9f4a74ef7b00be6c91f7c309b60f5559ffb4a7f923d94217f82f460d8cf9196b2836e909107839ba7b7c6e67830e5f01de2646c7730a57ac9a5e4d7e520c30ea6bde05b95744ee1277530fdade9534944991c467990410793246589a83c2174cea61b5a7330453fb730b26a2bd6eba381d8b051c89083498b8aa5ba6bfdb103c76942461c4cf95672d413747905eb865669830c3898733ce5923c479327e96f30ff5e86f43df5e93bed0653900b9d33af397db235c86883592c47858b1c5529259d41464a5c989855857c0d2625a9b6e4d9f43d9bcc20430d0695e3dc07ad8d3d1b9334c8488369435d10deaabbfae152830c3498a49244e66eff3c649cc1f06b963fdcef4232cc805a924babe5247790f140461912d54aea24014a631766534128139f4417c63ae9719e32fd52b87361d2b024db334afeb68a0ba3a7114fa2df8bf7a9b7307aa80a9eb73d8efed016e6befe9395133676ba5a987409a24f3ebd14947bb430ee899b6a27c76661dc3d6dcaee726ebb260b93ce0e27d908c5c270dd494f47ed681e8685c9e4899744136debade41567875632b9dbacdbdcbc836c7ad8c5fa4ea2e10a83781871299ac92153a3d10ac37dc790cb9fc3fd5b345861ea4aab66a3da638ebe0a538b7f9c94f520d050854145b7fa92ae1b5a345261d65149499ed57d543cf9a0810a731cf593c3c77f9dae9cc238bbf5797b4970600a53579253b2ab7647e7288529c59bf51ccf5cc65f1aa43005790df5172549fd791aa33085858fd2954a4913c43444610aeab5675fb93dec2914e6504a05916d1d2b070b1406adce27051dd3274c961e7ce6f5c413e66c5ad59ff3c50e1ca7518ec43a61924b654b9545c7563eddd0e284717d65bc623c3c5c7213065326fe9ef82968b5fc9a260cca83f23bed8c4626cc3a7afa5474363f796e68ddfda08109731e2b0ba72584e31215038725cc17f6df4bbc547656c22cff22d4079d82ce16b3c18f72021a943048cb17bbdb6c66fe0287dbc849548c20342461bafbb84ff24cd49c4154402312063f511e4a0709937452c9bcd1954c88fa86d63dc2dc49ebc62575f52575e5087309c2f4759e36494a2a407ef8c091d4ac11c6b40cb1a1e4e7f7126263010d469817734f52939ebe459834cc838a56214598434f95ec1fbe24e9f3341271aa0ea1a4ec22c274615dac2f6c4939cb340e41c3103d6814c20e2b59352dd9eb691022d54e55a33a7e65bda195d418680c029113c6cbb2c9c6885a6739a02108f349925fe9e929fdfd04c29c04116fe1f5495d2b3ed00084394b9658ae7467881f68fcc19cf3aae545cf152bfe34fc60b213ad6f41ca56c90f8d3e98c35c4bb476d2df0e271a7c307eda131655564b940a8d3d9872f4acdc7225bfc4e7ca060d3d98730c93255586edb6098d3c1894307944aee70f593f1e0c3a573affd4fc0ee63d0d25b2e449920eaa1d4c277dd6cfebd43184b20e26555252264d9ad0a083f9a4e9944be834ff96c61c4c52e858f9a2592007f39daecd9b987130970a9d8309cb6ee1fd1831e060b20af14fd9f406831294ecf69583ba949e2a11d07083397ed049ecd6d906e3defeec9cd48f332736988250d9e4fa5a2ccf97926b3099603376529ff2f35a0de6d3f1f257799706f3a7aecfa935313f995486a90768a0c1a49d64fca8fd923b97f480c6192c2552eb4c12ab04d13043266ad9aa24e1554c9fb036376ac13e1a6530969dce565d7a3d093b0d3298528e5cf997188d31989468fe25e78b68a42ee97c180cef772b1e7282c1bc32161eeea94b984de30b667f0d212de768a32449336878c19c343545966cd7951f61d0e882490c51279d9c4b96edd90082be401a5c30c921cbb7dfcf1b6a954c630ba6ae6d1195a5c46b857834b460507d4b41890e32f7c47f688146164cd2a820eb4aecdc0cfd28030d2c1cb573dbd96c4ee30a66f54bb552bd4ee599156854a162c8a041057327b3f424e70534a6c06b9a962c7292d4dee916940aa6afba7443eb7c00e941430ac6aaaa16791345c1a0f2e5aaa15e2818633cb80891eb130ca66e2628692e27188487d787fe8aa16d82d94af8acf769312da530c194cebb7dd4d6abe92c8131fb3c1d2f5682395e8a8ddcf492604aaac5e4b01f438241e8faf1f7fbfafdd411cc275d56b9ce9682e76930a06104d38cb8ad7c25cbd49a6814c124cc870a6a4bf6060d2218a4a7a4c67e44a53104a3a6c8911bd99dd9ad326908c1bc3b9aba7f2a989ceaa01184832515cedf4ad30284da65352ededce3d4c2f7a99394384a0964470974f0f02182307404d95168fcc0e4a196eff9631a3e307969936334bf2c5ab61746d1f89713265e18b7c4f3492bb7b915dc85f1842f3974d09d2e0c36fab3091d4d72612cb94d55f0d9f4f9282ecc5f4a46bdecb7043da35b98f25a9f64d2f5dddbc9b18559cb3add2e999294fc2730925a984becadfffdd8fb3344686112d5fff39376b09737c82cccc942479dce901636f5d138b0b2ba9285c17296967816ff59db0d2d1b3a78f84858120819018ac4c264c209bae9e94bf3148185b13c9db0f635ba337dac57985aaf2b89ef5b4147c415c690664a3c39ebe7d29513694589b0c22443abe58e7215759718efdd9672a80a535f96b4f9734a8541e6aecbb9752ee1ef08924450717e57cd5113e929cc1fdcadb74a690af3ddcb49aba2a464298c269b692faf93c294a294b4d8f68ec294c52bd8be88ba7f26220ac3d6e5d4217696e4554542610e164a27a9dfe249934c4a0414a61b152a054b4bf2cde7869607443e61d0499d6e680109a2c3069e88278cf96d39b74c551a21ec84c9d4cf9a2c65b23b989213e184d92d65dc536caf0df58656896cc23cae29a6b49a4c57cd443461fe38774ad249d28964c278d9747630f72fad93228209e3ef96ea8d75534970452e61922413a743c97fd2c906970fb4634752680983e95bb56c675fa25d442a61d290dd9225a96e68b9408412a6ca1a6db7e25174746c4b20320993f4a2a43ab14aa8ce318a48c292724a27e7d52f1209c39e8d580f42077533118184a93ca5e811a652f29d92ee3c8975398e30b7a8c686e6a9fef01b618e9715c7e4854bda654698b736edc327719ba24598ae44136ecb5b45982dcceca97c351126b94549134faaee1123c270da520993d5f6469a873097d025279b73922064884d3bedf47ab80a918a25410921cc498cd9af246e3b97203a6cf8c0d13d6c00415f582546029141983accaa573eb988200c6abe04f31f592410a62a93b2c5359f59f14400614a62cbadf876227f30099563fce809172c113f98f574d651417e0da48f481f4c725a6b4bc2f25a5b940f461321e2664ab807c3c9134667f9b0a66ad183796dcb5735bd3c184d962fafb31c4fc4baa18507c386d0a594c938359f490b88dcc158ea5ee6277e7630e57cff88c65f07e3fbc7d8f22c1751613a98522c59fba4f65893bb39983a5f579f9b941c0cfa6453f17c4de260922c449de5a493753c45e0609491f1d81e46226f30a9ea65fc85abb1788c18bf230cfe81881b4ce975b1a453613a89a736605a616a49ca617255980ba6a3cfc927226c30a793f49d92797a4418105983f944dfca37f50d155183b9830e3b932deaa6fe0d05e39460043162c488d13b908fb661a5059134985537948ef16dc2436830c9278e4aefb98b9cc1d4a5e4d557af353b2f620693dcfbafd2927398ed94c1a4c26ac851e9725a223218ffc7b346099ef37b1e8369bbb5e2ce7fc460ba5839a55d66d7e23098c3524982c1a0efaa4a64d44c12f30ba876e7533337bd604aa28c9c6026a7f7bcba608a9e27ca8fc9369f36178cf9d57925f757d2c1da82d93a488d935f2d9872b2d8b61fa72c9874fe9b78568f988b58304949079525744ebcd2154c269f7862e65a2e6205c37efe93470869d7fbbf40a40ac6371d4be892af0d44a8605aff33a5e40ccb3fda0b76884cc154da04596ee2a9dfa844a4a0ba699ba36050d26b9f34aa08148c22abf23840050746e409267f7d3d4157b608224e30a5b4bcf429e23d84be489020d2045379e997349aa72414b8aa405505ce128b007fea042290c4281aa320f0407e04f151800084e11538680101f8e1037d90c3c3478f0468e0078e1ebd00017c010001000000002080002c000000008002d0e1b1a3028b0e8f1d0d604002e0c70f8f41000134903e310a108006d287878f180700c0001e90001b366c3000000170c001d2e1a12315a0c62612504313269d638efea06aed4ef486ae55102b1dc8870d1ce03836cea31e3fb880ecc0719930b8689913e9a5964eb50307261218ad2315a0c625ccb947b3dec4826c2549058cb684e9dfb3ebb6c2c550af12c6d950d6e9259430ba095baf139ffea104464f028cd691085043120695a4576e686124ccda692c9920971a9078440f1def0804d46844da8143472a400d4698e64d29a97f2ccd24ff86d60e1c3a52590410f44311e6d0ab7a6b9228fa049dc3e3f04884e9932c723d9bad96fb381061d0eb3d49558a05ef0f8e439874697c85e7bfef474b91c01026d1aa0435fed9e25dee8c1a85309acea926c52c6d65073a38726083870fa48384044608637a92aba244c6310873d8d29304d11f0e419874f85fb0f496a7e28f231066fb92c296f87f141901c22827668d36c9da5297c6821a7f309764397243baf8e76e83478ea4ce0f46ffd43975e81cebc171a30fe6fb7449579a759c79e4b01004e183a9fdb3c876cf6d7d14070c6aecc1eca583c7b876b474f238f4604ac2f6682d9dcf25fb62078e1e3dda470eac468d3c98922add9335d993e4b9f1c3468e2e203b70c4885132c8480d3c24a0c61d4ce25aabe2b87f43eb6cd8d81c41741c066ad8c11c6a62e7bed341b54a7cdcf891a30e66936b9f4d36cb71e347dbb0c10864078ea383d1c397c84bc209e5969f83b9d3c5896ead11ca4c3998e4747e7f47b3461c0c50030e069554f0912f278792c5d78174a40ea4e3b0c61b0e0f1d890035dc90801a6d3045b1a4dacef7f293c0681d093b50830d86fbff2d532ae5f0d0b106534a8ba644f8c96a7d7243eb7000c1018e13c4860dc6018e13a400d981e33450430d2661e1fc3a899d72f8941b5a87878e5474388e1ce50690d6517eecc001c407ca81230d08073c74e8403a0e50030d3b70e84804a87106b3ffeca72dc9b3a5b26b98c1a0576b5bd2a703a5a046190c174e052566d5748e610d329877acd3f5eb646f7d0cc6b26071dcbe1383b9eec3822529498d3018d4e88a8e5e279b94710d30e4192685b11c7372fb0593f4fc9a5e15ca3ddd35bc60bced93ceb4c735ba7025b9c035b650316450430b06cb725eb1e4501e2eaf9105a3cee79483708f275512168cfbfabea177740563cba5cbfbd7a31f7a2b94c3249525963057c1fc9d75f26e4a05934962bae5eadf0b35a66090d7794fc43e8aae560ae6581d352d651805f328213b57f9ac5e0405c3bd05bddfd16275ce130ce24627515f2f4e309d24edca422d4d3009bb95446d8698303a26983cb5be892d26e8b42ec1b827cf59ba93aaa104935678eeb8ddf62d6b8d246c297549658289dda69d79f27e09a7a5ab8104e387f21879992374ce1fc19483b29bb7b214f9ba114c3ac8998fecb0ac04358a600ab95a1f7c2c29b3cb860f1e49492064045b3d5ac7f5681d60a0b3034739410d2298b7945259621e82f1c392944d524d08868f3d7339e8f21cf36a04c194c469e6b799806090934ce5ae20fe54c97f602cfb51eaf7e92ed4f08149763eedbe7d524e41433f525ac10d203844ac0b23bd30b68e0e778297525ec2115e18af47d8e535fd3c9106f9915d183db452742dc12a584a17e6f027aaec7cd2a25e322319c985b9ce3c9a52aed6173fbe6820850f23b8308957b32569a79017d18f04c4c82d4c49b2f0259d3eed20466c61b4786a77d5e563877e4b0531520b53143dd53f37ad243fb430c83149b762ce943ef12f328dccc29cf424255d67ec65963630220b93cc2b134a5a5f8a796261f48bb9a03be8b40c25d4238c10288cc0c2549efb49095f3f61e415a6b25013d4ed8e7c2861c415c65ccfd17292f05c2902e2430c23ad300525bce47cb54661841526f5bf6e2a2f5bd0e2fec8d1cf0305ab30251f9f139784855c38b111559893a538276ac96b8c18c6e1f1012b74787cf9e1038da4c238db965642b44e7f8a0f0fe0000286115498a46b854a93e4fd74a6d2c1c38708464e6150829624c737c1e33e640ac38c5afe4579cb22ab521854284b49ae84a43027c164ab87ff4661bc3893948c5c14a6f59c249dfbe3973ca25098c436b5e8257762de091426b9644b25e79cf209e3e9b04a23ebf38429a774dfadeff4fee94e18ceaf24f595933861b6b8a2b326afa53f073a7c81914d982d9a30f72de144535313a6a05a9d24c9c4d29b74264cc184ccc5b25b51dfa31c5fecc0f1a30a130613b9e2d94e05f913bc84a943c830293ab58439d8bfa65a4ade36da4a98a4a5d98ba33c4a98947021eabd52123ba24998462f695fd0e99faf4ac22c965ed9e265118f5f772412a61ecfb95fc3ced4c008248c66417e8e6cc58a3a1f610cf9bb120d356fff3bc27041e850426dd344b51bc127259ebeb82423cc1f743e39c5ba08b3fa68bb9e753ba952461461ce637ad20439b942e94612c1769c5cb9e39620ee8305910c2388309d972469cbdd398461cd3ed79af0a8161c318449ee2ad38d917bfec1914218446579fc6f3b3092eae9cbc530395582914198e493632e77fc92246d4118afd48bc9414f747be761740ab8de475f20cc77d57e324d898e00c218262394d0aa281a8efcc13c1f53d7f3e89cba94113f98443fbe78927e1f0c26da29979d4fe3f1f2c1703a166b6c652fe97b30e758d228fd20e7fec5113d1894c7cbd1ebff46a96b240fa69ca2d77dfa77040f2659d153a79253fd6f8fdcc1a4adf345b78ec751da881d8c26c5f5363b478552390f8cd4a1204a924a743027ef5c25c99332079330f7db8abf1ccca3729a0ea14f8fcac93818fed35fa6ef8dc9965d38184cd885cc7c5fba5e70e40d26f1837eaa7c6a3798df66c487bfa8b9e5b7c1643a64e7542a695c8ab3c1a47b92f894f6170da44c30b2069366a81c7fd4e25ef0a8c17462a8b9a02b49addea160240d66958f69a3e7448341c8fc5ade3c953398db3f25d10f2b33184beeaa6893c4351d4d6ea8b2192983692e689dabb9e5682f8e90c1b49da4102f19f711c21b3a320693e8eef1526bb665b7c4c0a73fdd901de53098c396d02f11236030a958624e7d8917458c7cc1542a89ade996e405839c146692d05099dd76c19c6f4d0caf0a2688e570c1bc32f621f2eb3edb8d8b18d982d924ff4f9e6ae6f38c3162d48816cc9957aaa1251ec986912c986a3d898f23ae047f93044246e003f9486e040b06f3eaa4d354bf761243367800b151367205f3a9fd85ce1f4c8fb6818c60c40a9ca7b43cfea3a6b29a63a40a275f33f994a56d840a26299bd24bf9e229184f50164789b25d423e46a4601a51312dc3b2ea9965240a66fd36f949fe4eba3d747a493002054c95bc5b252d9bec8b912798e4d9f9996cf65ed972438b6b8c38c1943b7bea9f42d9042cc42d8796302b27699aa46f94d8e3de790f30d00d469860b492faa6270927552d1859827984272557ea0e1e3b1af50823845330a20453d256524e0962aee4732409a654f92f7ba258368204b39f1493d324f19d4f3c3cc80f1b3f7098a11e61842425839123186b945c73d2b64018318251c5544e65ed69f6d22b868391229864c4598bd9a8341821824176ad5d9f75caa38d731a0b0169202f004129203bd00e1e3d74f0f8198c0cc1b46e75a7cea2a8b74708c6bcd6ad18d2ed939807c16c719228ea740682b9838fb0f9fcc0a43b96e864d11df181f10433f56a49701142bd3069f924a53495273de785e184dc8c53e279de0a8c28a8342e66c3126928188a0402811804d1f0f200e312080018482c0d0563d17054cf44b17714800374523446362a261e0a43c28048240c84c2600018180684c18040180c0cc5611858d218d50f0ad5ace9556cbea5968897637a7b5c21b0b960ba3629b07083c5d4fd11604387731aa4121b5066c3ce297fa3173e531fd6f49563058109a84798101f36f290fdb5774302241e96a40b9575537c53b4ea433d7db1f5b4cf54b091e9a019a7a8ec307db091ed6de193526d0f9ad80460db33c65f8d410c904fcfb15ae2e36749f82b02598d64b71e1a0e0c49ffe25e7ff9272805435713a031cef9caade00a8a290643148ff9934d3f7f3dda3cf93a4281b0bab24e6036e2259c1ba1b6ab7fec0651478416709550dd3dad7d8a79166bca0fa8a86162a74d5660bb9340bf5a410e57cc68980975e9a06b576bb994cf6b7984d240acdc93b5adb56d013ebba1e1ab613d489de0cfadee03ec7a3582058509ecb980f437706c6009c9ca616f5723e62b6941e42ae95243dc4f2a3a8121767509049bd8825228bd0c4608d1695a598a06f1aa9c363d2a23f084d2214582ad9a684c2ab9cf310ca048ca23804fc04019e27a1a38e973b2048dccb04c8419ac4168f22491e977101505c04dbc269bc0500c7fa27dc5fb1bddad7e1b1c0dfb5560fccf2ee48ed55d79f3bf3484220339203879f7ef42864f07f42fcf461912faa1889ab4389fc076a5a49702ee80cc67569e22a8b1d5c319364475f5762a07ffd7a1fcd22371f2b9dc9153fd544f8874802ec4fd46635a423d37c1e0267077d71b0424eb4b34bc386173617f90501b9a3ef55087cb5532e264e583db624e90cb0a0f6423c99a3bf460bdc0acf7eb1bdd579b9ee5bfec77b5d117b745c4e71c67c3025ea9a3301219e1328d2452b88bd4c8a55f4a880165edfdd4c443d8b0b14a489f7afb251d1cdc34186944248c864d75b5485665e6caf36e7ed5455c606eb91fd7fb8a8f34cbc2eabdb1c06539eddeabae89b1235b7f26bb699c77b35db31198e28082ea3f4c463ad31a8770101dafc0126062450a68f76395e877376023ced83cef1feb776c668f314b0422377f5dfb441a97f74f8bbff1fb991bae922d13b6167078aa0e53ef2d00a6fc60eacbe0b0e6bd959bc8e324f6b3a3a76008c4fc0d1d34b4c821c3025a536b4e9783336344429185a031c395776ddca4bd4511d9590f15f4f21efcb53beb1ac2aa3ea86179ebca4599dc90c26581e0c830896393fe2a7b7f4a9a747fd47a79d021c64944097350f51c9d164b7f2efac173a37c6b8682a5fae862f61fe65489510c591ac111ffb433832d36b6b8625050f00134a3ea364651fd80fc6aa571f3f5c46fd88425e176081c8ce5b6f24c991683cebf548088a7e7545a5abbca0185cd63d4df6c6745d86b91d4c0e74dcce1ecca0ac3e181760720630d32d4216207c5cca1557a1693164b18170c632886b9efb7a4260080a0292b2f38d1281366f943b96bc26c62ddba2afaaa5b65dcb447ec8d7a7da51403d9b72866d9136970b0be6a6ca5fb398677d3101a2b629b7572b81c637063e74ddc4b97d6de2e2440f17b68596c85a0d3520caae076e7ceb097a3f94f899856c9e259903dd55537b4c4d017614db71821b303e339f2ecdc363649ebb3617f655892ffeecddc415b2a0a608e8c3bddce700d77e9311b5c2c196596a464729657a1db27487afc21244ab8808eb6093f0cb911e1c2e075fc712046bcc02fb726963e1c843017bc22b0ff46031c7bf6f9925c31d1b0a7da677cc29b078d7a5a36f508e0e58af21dda8a1026fb319a5c5f563f30e02f34f3e0158c2d6e6518dcf1947049bb5e8d62298c534dbe6cd6d0af8ace115a093cf210f1c2e00f0a1e0e44c464dc9c0b2e2212f49990cf15263e30eebfdc9ed15717e63f56ae189aca7490495f30abcbbb2211a4f9fa96da115bd4f8e0a14f1c6e2761993c7eea7ef58516140a735e46d2d7fc3825046f1b4152ae71fa291a218679dcde894d30ecb29b19239de1020af538702f3909185bdfdd5b2e241d46bbd4c024af848eaa4274443ddee2e1a0f8452ad82a43f99f28b859027ad7a99fcc9603563404bf896060398f6ca1f74fc310458f8cd9047af03b66ff84853a1a18c8c0dd1dfe702c568d38978f58c3665ff3ff2d596ea0b4384ba516f20473fbc562c4f17e11414f6417f0c202c5cd9fcec061704691e23206e7198301bb0323a17e9e242b33f60341de7a7caba3a67cd48e978b8426a77b2bf92ac9358c6c0c8dd9a50b749b59a83632778b2f0b7a0320c6f2c4569cf30246b456d15258089f6e215e12692bc254de54c1475e25d285907179bff38b897597f65135045f9631627137cfe91ed212fe706821e0faf9daa6fd6740be27a2d7d333546e50e96f853310b461fb2c3343b60cf73c7d5387eab053e3e729a30fd030b043afccd4cc08c05a91312983917aa12d89dbba1ad8533e4deb2ad0d9c7ed23e95fcc27aac19bb83b2fbd9e18157b0d488cc0a8e93d50d215a36eec62bb6d0d51152ce643386a9628ea5d2a0ad613b705e066545e985353ae51e4ba4db68337674c4710380b8bc82f643124b50d6901c747504f79920e31b81ae161e01f584fb20cba7d503ab796e758c78e9d8946d546884369144e81fceaf52ce6731568d5d3cdd374d45d1965a691a9e1dd5288ad2d941526b0e43e2f70dcb1dff86210aa5e38f6bd6d864eba7967bd65838ccfb1a029e040b1331686448e188df4596fb7ebcf207f606622eb9b70ba4f57c0f7186c709cb7f584ab491f657c93f3d6bf452aba4f9252923370d7649b7e35d647e3039fe965f09f12fd564372def5cff32abd128ac51780a5444475683e8c6f93524276f586dc2c5582407c4dd8e1ccbe7e81fa49fc9841fc8e0313235d9d32bdc85a8a9df20aca93e6a20d3042515122a5a29a06490ed555095f6182f59cca516f8d6697cb9a6fa4c6443e6fe1c85a587240490e600388fb9c527b2568d758f479818727ca37bedb84feae6f02f77c625b045bdf1a89069814776a88a8a0682bcce489b595f9a2703c1bfab40d1e8d07d8ec551e49c03f1404aa0d273f2b47764a927efaef2031cc1fb165c923c0344b5755be4fcce18e9694ddc7d2a54949c4cfb29b6bfd2ccb23c71c84df3cb4cd387bf846184bd326d226e911691174286855e838a6261b5cc4b553481e57ba453e473a4c023db66ee709d276b1e6da870151ec73a0e98faa62887fc76fb082c9b29ecf5d3c05676924db4aa13092a5e259dd6dd5ad9fbf99cb86d3b3a672738e02f92e0f4e4d7883ec3de446a401f19a646d86410444a38c58b4ab1d73f6958dd19550cfa8e1b1a37ce2e6e1f972071f85c9703f5a4f9f11630e60799303015ee767f385e82183ca7fc7ec756706d050c42688558c20b963904bb25e2802f488279b8e0da900c4cbcf0519250f4add5331aaee4b4b5e458251f4fbad98b1cf8bd7e608802360652396c9ef8a753e28e0bf317b911daad1324c62263006d42ec5ec2cf718c09324b963d152ff67a0c67124c9623d41ec12e55209f18512bb6055b3818be57b07025f91c2a266ecb58b77c607414554b6556d69e687a187fc22fcf377a27468f273c6622b6aff6c0db6923c35cfcac873d522460bc9452405cbcacadf74050d61a413569efc9db7be68931b9440f152bfae85d5845e01630db077db492f693b3bc5ad4ab15d5c04631f0b5f9afe25c473a7567b09a3b3579d3eea8ad1b121d18e918b65f024e6b1f396f17f9fe0fbfa8877cc460f624071101c2efa4b9c8a9b5063a8f622d35132a7b7fe1d08dbfbb62d9170741bf0caf49abdb7cebab6e2cee98362ca4192adc8c2b22265ec2d774a2286251cbb218449646828cb0d4d8cd8e9b148905a7cf8911613424f7445f32bcc8a41daed602b6471199ad892a3417ec9549ce102a42feaf7b830a5464c148677c14a0fde4b223f7b56bafbad3512f9a9e3277464b91cf9c178e528b5b0a9e9bc7ed75f97a1a9331a00cf2c1e264d83f4cd62e16381afce4f65c3fd0a8d7256035c0b6735fcc3981db0d20b6365819a821e60817a6641f5da859132a9e336ba4d61f5263da82dc096682c0e2b15983913b26caafa504b339dab773d78aaf2ed6f15cf20af0ef1bd29dac265fddfa2f175ad52913706dd84ce4245cac98c9a71474d0c15426f3b2d5c814a52eb32f75f00292f53875e6f8c2c51c787ad45cb42b420b1f9d427474dc013ef7507e2de3b4c9cd795447090bb689bdf456ab7a95d0488acbb87c030ec4042aee8f154a447ea67c4d5cb6681d0c598b383ea74eff270cd778541d4fbb6150d5a11efd94524d0b4c60be318cb984b8432d1acd54f2596b3245c9a881610d3ce0b79887e5398c1b68e9483bc03dc07cd283aa4ae8f50312961f29d78724778359132faed3cf7c4f4128ce8b14445c9d598ecc134b45d124be8af24286c2e6966c4bb7ab44a3b0f3b8e6d94f80b2fc72014ce163536826065a5510d1892938aa84f7affed0b24cd5dacff7a879e01d3c37d357f7d981e624135e0b17e961a7f443648a3c9b77a969768b48aad857e1a1de8a2c31c2613e668acf6a045c5709494b934adafcb6e958411d5fedc4a1f9a3d0819cfb94bc799dbcc80dd2cdbb67c9615b614eb6c05a127b3f8f52a8e29bcb480ae3e1f952d0eafa67fe5738b1de84331069e8e7ecf2c3b01a6ca7a756f8a1b41b6b9f8deb8816924072278516e42fcbbb315b2c0aa5d78c28cdfaeb2d9be1dfbaaab8d150da46c03e4b38862db86ee87c33680e94adc7b3b8e52ed9a7f7de4267e4afbe89add5069d44ca0fcdb88aa44828a6b5309f5b96cf81906094ca1da41d285956c391adfca4a6219009a5639136a33b6c23c93e38f2966bc69a9b5dfcc7b0508dde011cdf023dccd1ca0a6ce3c619063062ea1ccbbbf4fa9d8f2abc9bfbb64e4c5eef2dc258d600046746cedde612b647314a7f84466878bfe0768e7ef0d759c80469ce8940481bd405739bf96fc8cb4e10ef6e03bbc4d87ffc30dc83276b74cf1fa54e41d7f240123d4a33e427fe3c8d46138fd9ad16529686546b16a033f89e2fd6f38516980052ea1b6ca791f29b0fa1016a9aadd7788bd35a87b2bc46e9d074aec24da13e0fbe15c8450982710827216c150b83210e0e6044a249e38c6b05e727ef96b044ee37c47445864336c8e20c9242e23a6edf75910b5367d390a6cc7923a15ec0969aa7dbc0dce5448c83805c740967b1d592d1946958c11c7b188e55ac2a798887a5436838569676c664b11a17833e07825c0c64e69c3d7df7403d6c08476d4e83a803413e3ac661928c12112e0f619600f43881fda5c481892f6bf857b3e08c50d0fe2c2b6259277ee5a00db63b5f33aaa67ce4f7f63ad7b987170448cd720141b68a4bf548be8ba9fc2997454c8db19f917d4741c71ac35b112f0b98cebd29099af540ddb4ecc16c5b2a8094a768c4e17b494b044f20678de112e1ac8f441ab0330e3220667cb6d5603ecacbc8bf3d497b278d00cfa17ba744df4ac193177c24c8db81ab874f300b57e6faa67dcfa8921c61829ec7683c07525bc7a5b061f4b901f546ad08cfb2b7cf0367d901511f7418ca9c518103e5c0e8e1b0ad8559a934b27dc5be387bab27cca4d1101d0e5645697af7b2d9e5f8998da7fe751d3357e85507f6cebcc63c01aa692a684b0d108372be804a58674a550ae6ba02d0cc77b21dbcda2146304ca6813a4b9e8ecf8025bed06a758a35fcc9d4a04e0b126d2af57b26ca1b69ef001475b3f7d5b56f464bf04c73f095f73227d1e305c7761eb4411373458d1c5e26c6632d049b1cbbd89daf1a809358417a02dfe429016b241d4b97f37f5d8410be335946d1a02d1951dd8eba0faed43a6b79508c748cb760ccb11de40cdbb49cdbb13447df34ef1173414491adb71dc404d524ae4aa43116c28e5333e461b6d8daf3bccee8b4605f8d6969129931920c0c8800767c597810afd1433264209034f39f32b5d22b4056945522910331069ff7d2050c28ebafb1296a7405ae435a8d5e9c7e7a16e6eddc0f0e7724acb5530c68659b28aecfeaabfc7ae32b1aaa57c244b0022a6a4aadad6da0c37a9cd377e5221d714a18c078ddf9888b9b40791896208c8105244d365a58887559a2b293d106ef402e324629fff0ecaadad15f475e8faef0d01f88e48506d33c9bda23a7d26150eb26cc735085ca529dd286e30a0dbef7d79201621cf633733cd62b32fe96a89d7f8c7e40ccf86424a332315dffe266c7bdd34b50d508c499c665a6298541fed32ec84dc3c909340d40934610e14a7a951a0934693fd55719ae81ec401486a87cb2b2bdb5505e024801a605b04a88d9a2ac7658420230a9f1fd5e0272b442d07da1d07025597366d289e8db54f80f96cbf11cff6bcd040dcfd5037df19dd5053ddb6de9a08d5c5305d274bb7779d774c5a3112db2065466e3ad29ad9dc6b0068f4c8ab517bf19ecd8900a097934b90343b2bb48b1994982731f29a3d6932908f64ff1d2254a76472790e5b7b01d26952cc8745c9d769040f623b122a118442355097e7b822e50188359915d5de4060b50092299c03ed8522ff29773d055ba32a062cee66b51ee133b6877219a20b230b23ef6f3abe843578e305f7b6344a5c3d452dcb8ad95a22f22aff7de214184fa6d34e11c53c89f5a444ff70589e0310379b0972d5ff0402ec9f25cd688036c072fd413f4a54cc59b1e9174a5f000179dd23065469ce6f4f177af5ac512bad930df0b71655e9c680558aa079643b10366bda5ef6980a7c27021eea2759a4610e35545e464448179c93dc684ec84e8598b2d0a88c12c584b9e51984a961fc27bb99d74d5cb80b2e7f11a6d38513ffce135f4dc6298fea1ccac9c708dde669536b1f0725b2f263730a4e00cd98d6457c7e1a59437701285a05b6bd09b0400a5e903a4c884d67e81726e246b8c82fe6126a7b738afb63287bdb02488c638f296a4ee892eec53854c9a246f12df68a143b4d22bdee08867c0d85ea2a04892bc89df9358cf15b7dc5da8588f74a6d521f420f427816c13efd2e67bc5d4eb6188711b571aca9cb8cb30a9fa41e7aa643202eea10388407bfe5959377aefd61576c3b34364f751da1a1d5dcb45363115a6a036815fc34b85e8c520d6f30a43ee14ddcd940c36f8205cbedcab78a35ac33455704a5ac35ecba884d300ad1af597f3cf3c876c03c68072a782599656037ada4addd72ad25930406cbed57f7ddc4a0660e7c9cb0f982a51fb11c92d9d899fe22c38cac09a63f559e5a66f74898d5e851a1330550ff8a70b6b0767157e3dc662146ae9812199aeb595a5db7e59c7574606a1f885237cf14260b0e6817bc5bddbdb3b3842e05efacabc06a863872f5b55e92acd0d832aba51bd9855d9f61938d22e13d0c94377d0a53de52b421ad02c34459f8aa0158e57a055816d71bf1205f194199dcc2917a542dadef3de0a5c81a3d0552dc69ef154ce1833ec39ee854cab4f6eccb2b40f438d2e6661bd28b019f05dd90a1aace648213a7adc1a1a427c8caeb69f7b96b25404a69ea48a48ac1a62cc99f7cb89846ea624174880bbaa7e2eedaa41ea62882fba980ca2c037478d569a1d151303ae36fa78f685bed224dedc281d7ee14905efb09603a02d238df697ca795193cc613963be0b61730ae0cb34d24c3d90880e3ef6a3f2ed1c48fd7da0130959b9a53df5701aa17859114ca80c27296db72ef560cc3c9552c57451918f25be1f2416b45e3600ef4bd4024dacbbfac68f2bf6b236a43c8c931752a94c59cd47ec2913169dcac17424836105373c036056e4c04f5f326384bd641b623ec234ae3afaa44af67b79111798ef7da37c8cbfec6935052f30b1e5cfd2309026044f6f3db339a6cd3e8ef20599683d680ee901486d1518510d2c569d080f85163d604ca407d2e0fea6c4a2607cb727c334dfdcdbb97fad255429b6254171d2814a0ae9aa622160b20cb4531b3b341cb6be0c3935653808d5a96ee30a121e0c34fb097a4c35e1db47febcad1355c4da4504e3b676484b862a06581551e867d9b05fcc796baf47911df28adab3bc5fc8f20f160946e434841f6cfbbd7b899d6e2ff96959ffa667268a0725476e2b56878aa474665a9a81ef4042cec7e5ac3e7d8aa4f57b6094ef7fd90012cb0f6a9367109128c935b9a69325f694577505e4c5551c1066568638d4ba820ca3000b77aad54198cf8740323f049d409aecf41af14d3e2d799f36ceb20bf4a7aae1f6f200a195fefe88d83e0d04a2afb0b1425479372567f780699f7a608d53e4a3cd2b52efea21229904e2bc9f3752bdfd5ff8d2d0ca416bd98ca26a4e17d2b05d15cd7580247efbd086a987a2da6c16df162e02304250590863f0a3c33cb8a44225208065c6bf939fba4f6b7de68a325cab76fd6b8d213d528101430300ca190644ae0b5481cf6338b8b76d9c28d6cab464ea90026f678edb270b8d5512521ad231cfdd4f7b2c64272aff9a424351597f7bdcee14a9de2eea18f7345f923a2ed4331d3be48aecc650819cc0b815c4080e9d1bcbd781715283de7433de50cf38c94d6fe21a2be86e013b1ad16860d4f27cf9ce4838e084404e79b3cdf6d142410726b6eabe37d3cbc5b84eb58d55712c0764e1498ff680195179c465c673e2d6bbeb200e12824c6dac7414df9b2656e240e9fc5718adcac0ac1759d5ba1d6d6ae4c6945e7bf173de13bb9aea8a33da99badbc5aaabfc45220ec1055362e649c87368e96e4c10e10a8269063e8f213663e22eb3c312cb980f6978a998d72a54b65672db5590423e44d6b51f53a1486f0035d74f793ff5e26a3989b4a5799346a01c8fc3155610bc06168b683988f69647c865b5573c5378adf519b95a5755cb234de4cc4987384c8f5fe218a6d4e17c706e17a51fe63ae8996bf4a2fba12b5e0c3c358bf75eaf95f5313d70ed5b03c3f2d092557dcbc98a3a35fee6e58def36c95f79209d90fc4e406e48f43814c6e3da6a711cc276c88900c129c620e2d0382014c7a1f6c91ccad8f31d4d964f1ca80ddf43888546570a05a63be0c8ecb21782383a3c9a8108b01e23d31334067a40e125dccc69b444f0446e3304dee522d16204daef33a970f9adca0331ef96972fe2c1930c224376e4371ca220a09dd1b4e0b4a8d358a1815296ed02abd18f88381a680a2f1e9a921614ec3bf895d69bd7616e586d96c49dff0539acb4b1c5b4f6e2b0d3a547419d704ca6d2e412e2d4c8639b87c14cd8d836979812b8c7974a560b6ecf9136802299487a37e230be5d7ad86a2023f4f29e9ddc0d4c9e5a956e081413961cbefcb6c1e9d8df5a2a68828402f95a67ea193034c7202fe990c4df0f7715a00506c4c85564b9bd8f2723a078d626bd9755e62263c9c0d8f64a528d2e06ccdd3b023d404f53e173ceb7f2bddf0b7533ebc32039592b96df6e8eb62a246a04f4c868e68e198a48750c1e46dc890e336cbf1b9952b961434142d6ac3d973faaf2717a056cb32a03c60d43d5143270284a612bcdeb4cd908445154c065b6bd2f545e91c08214fe49e3a17a0bb26a9089b2748455bd0a9ca2172df6d9c887c64c6d495232c99f4ec307ca3cf19dbc4cc84bb5314b3ce7644ff518e71846f3aa1125ec10740411f2de86aabb83896ee8306a5d7850810d6b929d038265e170facf3ecc560ee9110bb64010697a490c6091a1b2f6675aec861df146019817d02050a09d758db403fc071079f40179b426e575d7ce081b81ebbcce6336a0dfcdf133594ba1b8eb08e1d844c03696072404ad590e6f2111190470e30208a78b193b3878b033c65a6e30c00e84fa6da741eefb9041d92f6ac8be63a57db47928396100a96b7b78218f10c0bea85cbf337c2b55c1876855c505581c482b744af92094091b9e4170af776fa0c1210fb58fd2660592f06c460bcf19f9a8695c2a29597e720dc0110a7a155fd1e2f5da3e1279e36155117bcbac9cf7ee286f9386eea3d026caa54e989c8fe11fd86b7c25b2b0cf05a7514900c905fd2648f8c9d0a0ee0e48c0336be2be670fbea022b1ead0602b26ca3cf431918b9e9ca18bf98d2a5032047189be478ff8dd775b853f4a748042151b137cc1a3bf6ca6eb01f415af3814f6e066a38485014ac86857149be53d6118ea52cde8d3dc06515adf9e7b1fe697603f6c77a169c177fe11698b3e9bb1191d2170e3df9fea2457935eb450ae6d169cff9e4cf83101ebaaf8314239648df4c2a45596692a6dee4148d40a144675bc7c7cb76dfa4e81273696e3049cc4dda07f056701e4a23641af4b4a4ef496df783ea11f6710226829d8fc79c50204f6912a03a6584f88c0daa3f129dc2dbfa027aa4e69e74bc1f50c6d0b09621f1ca489d9c49d04afa4796330e08e1f4f60f826a303778542a5309317c4b6f40c642bdb1207b73610452908ef3700bfe139cbfe245ac8354d00d082e6e538cab0559e42b33dc7c0937bbe2424e378355d512a7dcf3aeb66f83d87cc550d44c027b1fce584f99944b1dc1328e155784e4c5dbb749ed6b599a48016c7bd4ea182d6afa29ed1d9a6614ecfcd21814bf6b64c3ec318c49bdf1ef6d04e5e275972f06cd4a1703475d58ce5f64665636d590036b59a2468f212da2e0febfc2684eceb06ea827c3f2f7271333275c58b47993fdce040344b189387bf324a8a75a7b35a5317a7aca928406ead9c46a8a099e2113ec163e63390d990e12a15a9c3796f3a36928aec148f4303665701b1b9896cacb572365a8e980f68ef71d7dd054004ace069a4b06ba465d74d7aa66884f714ecdd46f9951b16af66b32e7b46af2d0c7b415ef95ad2bd210c8e5df6015169ed0c7f3793b5a13f51fbdb85484c7f171459297cd34f545fdb7d2d629b13e595644102bb379daf5d0b72e45cb7998f70ee7e8b1216338cd793397931271e09c9f9452d26d33e1f884337c56e86416b04f0103c43c4d7ea0e64de43e852284fdfcb2b4ac08396cbca1222277a12c85b41abbb348c712351601767db5981a11581a6d6084841cb8db75204b8b22428ed10bb8cf44455018219b7226aa0ea16ce242c64dc5b919164074b431358f3eeac8f21f325550c749b296fe50c7ecd313a65047bb0d261a263de82e625806d71cfcd3efec444cb1431931614986abc80ac5f4771cd0987b50e3644b866578ea2489e145c6016f605f59d35bc7eb02728dde8e926b97cd2442e0710252d16f3b55642a96adbae97a51f1cad87727c772520b5d0dfbbea52a56f70a0255ed244881954273376b5d0a25607dc396dc3d86d5a1ee8b434be07f1b078132ce295e9170bc0e2b55f2e220c8259dc0932679c53d9f6472a2424fbc2f3e54dd465d9da9de983a66303e0b832590679160857c26cb1abee3577c02d5dfccb5eb13a179ffdc6c578f8fd6748dd09ae33ed9f5758ab2d4a80c77d0f55c7d6841d07144c24f29c958ec616c04e7b220904f9b14b6ca99ca94514ef0acb1c0530a198469824e3b2b0b2fc998cf258481886eaac3de5b22b44c210c81cf121ba8193da3f210257e3c56da40c4e3c48730326a9f49038091ca5320e02263d8a463cc2361084746b33ec737b62de524f39129b625034cc621ca191547d1cdec765171d2a7853b46b622d623a765f6cd1d0aa4f8c58221cd9212c940c793653f697fbc9fffb0094b7a7fa35017ac746f911111b81804fe97de0c9ef767455bbd9c79d89472a713e4b2604fcee333f4e14180c3c83a2c2c47c1dff33b125adfeda08d9befa4159afc47c2164b02277b6d9a9f8fcacc73101814b364e9657f0570bed38aeafdcc4018839252713a2713fbff29405c00619f443d238c98bfc4c58840655f0022026c3c00c437de621ff69233dc6c2691b3a53e2997df6c19ec4ef3e84c701846b7c26db684a8c8e4792e9eb2b449329061c081c6e6dae8b5d608c1b58bbec8d182f4a89ad7239d1722efd9758f164bea0da57a02fd57284e07feef4a02a363584908a98f8744788be2f53321409c984d38150d187b92b41b6da66292a59a902051a401883536696a77b05bfe49c99ad2c14c60ebb88fa5497d29084fe998b1e4e06c30e432e5b807a9860ea05a4832a9c946b64e9a8c7427af78a318806588174406c26944519a137bb3cb1f511f81805f4fa253b6e3a80e11f400072a56a80997c5950a2aff5d4d608d6a802a02712b32cc403e7ae417191705850621dbf7e776fba41bb6c0863e3b6984e83808a1b8800b044fb15d8521c42c4062ac2f12c5a452e10b06a10e8a6c09154aedeb3d2a62eaffaabdd9d24021b63a3a53ca42d8af85154b57b36068db9fb910260273938a589c95612d99657fe7d12c5bc74900b6b0c819412efc1d6f314d1407432a85ff9b03b0589ec482a7f15826186d15cc0e98a56a85e280cd0b2de3eb26125d793aeb31561a89c585abd1655f1a6cfbaaba1a003239c99d08c904f913b029107c81e4ae6a2e872461973bfec101c1cead1fedd7e03a59989a170f111ee0c53577ba692518022f2114f0e245f134c2537513480669091c782091c4ccba50833786511c656a5137576d4a22721987020c4281ddc2d69eddc6da3482291cf648eb08859796dbb2429668a6b0803b8adaf55800165c22402d42a0f16b67e0552d84a5d2dc1919fce46ad68406adeb6c20c0a9a96ab3ccc63253eace6e0b9e91f3641033db89577410300abb0747095cdf92084e71d39f96c289f6a2ba644238e99e50205812125d1e90a83ddf50f7f33b172fce4255de39956f9918ab11c405dcc128a4920a00e86759322acc262b14acf04ef3c4b39a8010378bedf0cdab1d6b541680a16f942c02824c357a4a0961ef80f1850439fb1468cb481010ef28f8169b76dc28adfa9d23862e02b0c92b240247ba800678125ac2beccc808391d05f6e4be6593de6cd98ab0c98d82563b3cdb4d1521429d25b27522a9ad14b788291d", "0x3a65787472696e7369635f696e646578": "0x00000000", "0x3db7a24cfdc9de785974746c14a99df94e7b9012096b41c4eb3aaf947f6ea429": "0x0400", "0x3f1467a096bcd71a5b6a0c8155e20810308ce9615de0775a82f8a94dc3d285a1": "0x01", @@ -197,9 +197,9 @@ "0xd5e1a2fa16732ce6906189438c0a82c64e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0xd77451b0cdabc3fb7fe20813c2e9ad4a4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0xd8f314b7f4e6b095f0f8ee4656a448254e7b9012096b41c4eb3aaf947f6ea429": "0x0100", - "0xda7d4185f8093e80caceb64da45219e30c98535b82c72faf3c64974094af4643": "0x0100000000000000020000009394784c9135e2e98a0c095ce594f572650285069b0464ce74c83befcbc17b71", + "0xda7d4185f8093e80caceb64da45219e30c98535b82c72faf3c64974094af4643": "0x010000000000000002000000697ea2a8fe5b03468548a7a413424a6292ab44a82a6f5cc594c3fa7dda7ce402", "0xda7d4185f8093e80caceb64da45219e34e7b9012096b41c4eb3aaf947f6ea429": "0x0000", - "0xda7d4185f8093e80caceb64da45219e3c52aa943bf0908860a3eea0fad707cdc": "0x0000000000000000020000009394784c9135e2e98a0c095ce594f572650285069b0464ce74c83befcbc17b71", + "0xda7d4185f8093e80caceb64da45219e3c52aa943bf0908860a3eea0fad707cdc": "0x000000000000000002000000697ea2a8fe5b03468548a7a413424a6292ab44a82a6f5cc594c3fa7dda7ce402", "0xe601a78caffde57e00752be8864bc48e4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0xe6ff095c8bf38992ef748b1037a308af4e7b9012096b41c4eb3aaf947f6ea429": "0x0000", "0xe8d49389c2e23e152fdd6364daadd2cc4e7b9012096b41c4eb3aaf947f6ea429": "0x0100", diff --git a/substrate/zombienet/0002-validators-warp-sync/test-validators-warp-sync.zndsl b/substrate/zombienet/0002-validators-warp-sync/test-validators-warp-sync.zndsl index 6e733580d6d..ea0f15e5d8a 100644 --- a/substrate/zombienet/0002-validators-warp-sync/test-validators-warp-sync.zndsl +++ b/substrate/zombienet/0002-validators-warp-sync/test-validators-warp-sync.zndsl @@ -31,6 +31,12 @@ bob: log line matches "Block history download is complete" within 120 seconds alice: reports block height is at least {{DB_BLOCK_HEIGHT}} within 10 seconds bob: reports block height is at least {{DB_BLOCK_HEIGHT}} within 10 seconds +alice: reports substrate_beefy_best_block is at least {{DB_BLOCK_HEIGHT}} within 180 seconds +bob: reports substrate_beefy_best_block is at least {{DB_BLOCK_HEIGHT}} within 180 seconds + +alice: reports substrate_beefy_best_block is greater than {{DB_BLOCK_HEIGHT}} within 60 seconds +bob: reports substrate_beefy_best_block is greater than {{DB_BLOCK_HEIGHT}} within 60 seconds + alice: count of log lines containing "error" is 0 within 10 seconds bob: count of log lines containing "verification failed" is 0 within 10 seconds -- GitLab From 46090ff114a131be4139f0abf619330990194770 Mon Sep 17 00:00:00 2001 From: Liam Aharon Date: Mon, 15 Jan 2024 23:30:51 +1100 Subject: [PATCH 165/191] Unbalanced and Balanced fungible conformance tests, and fungible fixes (#1296) Original PR https://github.com/paritytech/substrate/pull/14655 --- Partial https://github.com/paritytech/polkadot-sdk/issues/225 - [x] Adds conformance tests for Unbalanced - [x] Adds conformance tests for Balanced - Several minor fixes to fungible default implementations and the Balances pallet - [x] `Unbalanced::decrease_balance` can reap account when `Preservation` is `Preserve` - [x] `Balanced::pair` can return pairs of imbalances which do not cancel each other out - [x] Balances pallet `active_issuance` 'underflow' - [x] Refactors the conformance test file structure to match the fungible file structure: tests for traits in regular.rs go into a test file named regular.rs, tests for traits in freezes.rs go into a test file named freezes.rs, etc. - [x] Improve doc comments - [x] Simplify macros ## Fixes ### `Unbalanced::decrease_balance` can reap account when called with `Preservation::Preserve` There is a potential issue in the default implementation of `Unbalanced::decrease_balance`. The implementation can delete an account even when it is called with `preservation: Preservation::Preserve`. This seems to contradict the documentation of `Preservation::Preserve`: ```rust /// The account may not be killed and our provider reference must remain (in the context of /// tokens, this means that the account may not be dusted). Preserve, ``` I updated `Unbalanced::decrease_balance` to return `Err(TokenError::BelowMinimum)` when a withdrawal would cause the account to be reaped and `preservation: Preservation::Preserve`. - [ ] TODO Confirm with @gavofyork that this is correct behavior Test for this behavior: https://github.com/paritytech/polkadot-sdk/blob/e5c876dd6b59e2b7dbacaa4538cb42c802db3730/substrate/frame/support/src/traits/tokens/fungible/conformance_tests/regular.rs#L912-L937 ### `Balanced::pair` returning non-canceling pairs `Balanced::pair` is supposed to create a pair of imbalances that cancel each other out. However this is not the case when the method is called with an amount greater than the total supply. In the existing default implementation, `Balanced::pair` creates a pair by first rescinding the balance, creating `Debt`, and then issuing the balance, creating `Credit`. When creating `Debt`, if the amount to create exceeds the `total_supply`, `total_supply` units of `Debt` are created *instead* of `amount` units of `Debt`. This can lead to non-canceling amount of `Credit` and `Debt` being created. To address this, I create the credit and debt directly in the method instead of calling `issue` and `rescind`. Test for this behavior: https://github.com/paritytech/polkadot-sdk/blob/e5c876dd6b59e2b7dbacaa4538cb42c802db3730/substrate/frame/support/src/traits/tokens/fungible/conformance_tests/regular.rs#L1323-L1346 ### `Balances` pallet `active_issuance` 'underflow' This PR resolves an issue in the `Balances` pallet that can lead to odd behavior of `active_issuance`. Currently, the Balances pallet doesn't check if `InactiveIssuance` remains less than or equal to `TotalIssuance` when supply is deactivated. This allows `InactiveIssuance` to be greater than `TotalIssuance`, which can result in unexpected behavior from the perspective of the fungible API. `active_issuance` is derived from `TotalIssuance.saturating_sub(InactiveIssuance)`. If an `amount` is deactivated that causes `InactiveIssuance` to become greater TotalIssuance, `active_issuance` will return 0. However once in that state, reactivating an amount will not increase `active_issuance` by the reactivated `amount` as expected. Consider this test where the last assertion would fail due to this issue: https://github.com/paritytech/polkadot-sdk/blob/e5c876dd6b59e2b7dbacaa4538cb42c802db3730/substrate/frame/support/src/traits/tokens/fungible/conformance_tests/regular.rs#L1036-L1071 To address this, I've modified the `deactivate` function to ensure `InactiveIssuance` never surpasses `TotalIssuance`. --------- Co-authored-by: Muharem --- prdoc/pr_1296.prdoc | 16 + substrate/frame/assets/src/tests/sets.rs | 2 +- substrate/frame/balances/src/impl_fungible.rs | 5 +- .../src/tests/fungible_conformance_tests.rs | 81 +- .../tokens/fungible/conformance_tests/mod.rs | 1 + .../conformance_tests/regular/balanced.rs | 292 +++++++ .../fungible/conformance_tests/regular/mod.rs | 20 + .../conformance_tests/regular/mutate.rs | 783 ++++++++++++++++++ .../conformance_tests/regular/unbalanced.rs | 281 +++++++ .../src/traits/tokens/fungible/item_of.rs | 8 +- .../src/traits/tokens/fungible/regular.rs | 97 ++- .../src/traits/tokens/fungible/union_of.rs | 15 +- .../src/traits/tokens/fungibles/regular.rs | 24 +- .../src/traits/tokens/fungibles/union_of.rs | 17 +- 14 files changed, 1563 insertions(+), 79 deletions(-) create mode 100644 prdoc/pr_1296.prdoc create mode 100644 substrate/frame/support/src/traits/tokens/fungible/conformance_tests/regular/balanced.rs create mode 100644 substrate/frame/support/src/traits/tokens/fungible/conformance_tests/regular/mod.rs create mode 100644 substrate/frame/support/src/traits/tokens/fungible/conformance_tests/regular/mutate.rs create mode 100644 substrate/frame/support/src/traits/tokens/fungible/conformance_tests/regular/unbalanced.rs diff --git a/prdoc/pr_1296.prdoc b/prdoc/pr_1296.prdoc new file mode 100644 index 00000000000..b7ef4288a57 --- /dev/null +++ b/prdoc/pr_1296.prdoc @@ -0,0 +1,16 @@ +title: fungible fixes and more conformance tests + +doc: + - audience: Runtime Dev + description: | + Adds conformance tests for the Balanced and Unbalanced fungible traits + Fixes Unbalanced::decrease_balance not respecting preservation + Fixes Balanced::pair possibly returning pairs of imbalances which do not cancel each other out. Method now returns a Result instead (breaking change). + Fixes Balances pallet active_issuance possible 'underflow' + Refactors the conformance test file structure to match the fungible file structure: tests for traits in regular.rs go into a test file named regular.rs, tests for traits in freezes.rs go into a test file named freezes.rs, etc. + Improve doc comments + Simplify macros + +crates: + - name: pallet-balances + - name: frame-support diff --git a/substrate/frame/assets/src/tests/sets.rs b/substrate/frame/assets/src/tests/sets.rs index bdff5175185..f85a736c083 100644 --- a/substrate/frame/assets/src/tests/sets.rs +++ b/substrate/frame/assets/src/tests/sets.rs @@ -153,7 +153,7 @@ fn pair_from_set_types_works() { assert_eq!(First::::total_issuance(()), 100); assert_eq!(First::::total_issuance(()), Assets::total_issuance(asset1)); - let (debt, credit) = First::::pair((), 100); + let (debt, credit) = First::::pair((), 100).unwrap(); assert_eq!(First::::total_issuance(()), 100); assert_eq!(debt.peek(), 100); assert_eq!(credit.peek(), 100); diff --git a/substrate/frame/balances/src/impl_fungible.rs b/substrate/frame/balances/src/impl_fungible.rs index 6737727e0a2..0f4e51f3501 100644 --- a/substrate/frame/balances/src/impl_fungible.rs +++ b/substrate/frame/balances/src/impl_fungible.rs @@ -177,7 +177,10 @@ impl, I: 'static> fungible::Unbalanced for Pallet::mutate(|b| b.saturating_accrue(amount)); + InactiveIssuance::::mutate(|b| { + // InactiveIssuance cannot be greater than TotalIssuance. + *b = b.saturating_add(amount).min(TotalIssuance::::get()); + }); } fn reactivate(amount: Self::Balance) { diff --git a/substrate/frame/balances/src/tests/fungible_conformance_tests.rs b/substrate/frame/balances/src/tests/fungible_conformance_tests.rs index 6262aa04dc0..5c0c19a554a 100644 --- a/substrate/frame/balances/src/tests/fungible_conformance_tests.rs +++ b/substrate/frame/balances/src/tests/fungible_conformance_tests.rs @@ -19,17 +19,19 @@ use super::*; use frame_support::traits::fungible::{conformance_tests, Inspect, Mutate}; use paste::paste; -macro_rules! run_tests { - ($path:path, $ext_deposit:expr, $($name:ident),*) => { +macro_rules! generate_tests { + // Handle a conformance test that requires special testing with and without a dust trap. + (dust_trap_variation, $base_path:path, $scope:expr, $trait:ident, $ext_deposit:expr, $($test_name:ident),*) => { $( paste! { #[test] - fn [< $name _existential_deposit_ $ext_deposit _dust_trap_on >]() { + fn [<$trait _ $scope _ $test_name _existential_deposit_ $ext_deposit _dust_trap_on >]() { + // Some random trap account. let trap_account = ::AccountId::from(65174286u64); let builder = ExtBuilder::default().existential_deposit($ext_deposit).dust_trap(trap_account); builder.build_and_execute_with(|| { Balances::set_balance(&trap_account, Balances::minimum_balance()); - $path::$name::< + $base_path::$scope::$trait::$test_name::< Balances, ::AccountId, >(Some(trap_account)); @@ -37,10 +39,10 @@ macro_rules! run_tests { } #[test] - fn [< $name _existential_deposit_ $ext_deposit _dust_trap_off >]() { + fn [< $trait _ $scope _ $test_name _existential_deposit_ $ext_deposit _dust_trap_off >]() { let builder = ExtBuilder::default().existential_deposit($ext_deposit); builder.build_and_execute_with(|| { - $path::$name::< + $base_path::$scope::$trait::$test_name::< Balances, ::AccountId, >(None); @@ -49,9 +51,37 @@ macro_rules! run_tests { } )* }; - ($path:path, $ext_deposit:expr) => { - run_tests!( - $path, + // Regular conformance test + ($base_path:path, $scope:expr, $trait:ident, $ext_deposit:expr, $($test_name:ident),*) => { + $( + paste! { + #[test] + fn [< $trait _ $scope _ $test_name _existential_deposit_ $ext_deposit>]() { + let builder = ExtBuilder::default().existential_deposit($ext_deposit); + builder.build_and_execute_with(|| { + $base_path::$scope::$trait::$test_name::< + Balances, + ::AccountId, + >(); + }); + } + } + )* + }; + ($base_path:path, $ext_deposit:expr) => { + // regular::mutate + generate_tests!( + dust_trap_variation, + $base_path, + regular, + mutate, + $ext_deposit, + transfer_expendable_dust + ); + generate_tests!( + $base_path, + regular, + mutate, $ext_deposit, mint_into_success, mint_into_overflow, @@ -66,7 +96,6 @@ macro_rules! run_tests { shelve_insufficient_funds, transfer_success, transfer_expendable_all, - transfer_expendable_dust, transfer_protect_preserve, set_balance_mint_success, set_balance_burn_success, @@ -79,10 +108,34 @@ macro_rules! run_tests { reducible_balance_expendable, reducible_balance_protect_preserve ); + // regular::unbalanced + generate_tests!( + $base_path, + regular, + unbalanced, + $ext_deposit, + write_balance, + decrease_balance_expendable, + decrease_balance_preserve, + increase_balance, + set_total_issuance, + deactivate_and_reactivate + ); + // regular::balanced + generate_tests!( + $base_path, + regular, + balanced, + $ext_deposit, + issue_and_resolve_credit, + rescind_and_settle_debt, + deposit, + withdraw, + pair + ); }; } -run_tests!(conformance_tests::inspect_mutate, 1); -run_tests!(conformance_tests::inspect_mutate, 2); -run_tests!(conformance_tests::inspect_mutate, 5); -run_tests!(conformance_tests::inspect_mutate, 1000); +generate_tests!(conformance_tests, 1); +generate_tests!(conformance_tests, 5); +generate_tests!(conformance_tests, 1000); diff --git a/substrate/frame/support/src/traits/tokens/fungible/conformance_tests/mod.rs b/substrate/frame/support/src/traits/tokens/fungible/conformance_tests/mod.rs index 56166436003..005674088dd 100644 --- a/substrate/frame/support/src/traits/tokens/fungible/conformance_tests/mod.rs +++ b/substrate/frame/support/src/traits/tokens/fungible/conformance_tests/mod.rs @@ -16,3 +16,4 @@ // limitations under the License. pub mod inspect_mutate; +pub mod regular; diff --git a/substrate/frame/support/src/traits/tokens/fungible/conformance_tests/regular/balanced.rs b/substrate/frame/support/src/traits/tokens/fungible/conformance_tests/regular/balanced.rs new file mode 100644 index 00000000000..d8d20543e3d --- /dev/null +++ b/substrate/frame/support/src/traits/tokens/fungible/conformance_tests/regular/balanced.rs @@ -0,0 +1,292 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use crate::traits::{ + fungible::{Balanced, Inspect}, + tokens::{imbalance::Imbalance as ImbalanceT, Fortitude, Precision, Preservation}, +}; +use core::fmt::Debug; +use frame_support::traits::tokens::fungible::imbalance::{Credit, Debt}; +use sp_arithmetic::{traits::AtLeast8BitUnsigned, ArithmeticError}; +use sp_runtime::{traits::Bounded, TokenError}; + +/// Tests issuing and resolving [`Credit`] imbalances with [`Balanced::issue`] and +/// [`Balanced::resolve`]. +pub fn issue_and_resolve_credit() +where + T: Balanced, + >::Balance: AtLeast8BitUnsigned + Debug, + AccountId: AtLeast8BitUnsigned, +{ + let account = AccountId::from(0); + assert_eq!(T::total_issuance(), 0.into()); + assert_eq!(T::balance(&account), 0.into()); + + // Account that doesn't exist yet can't be credited below the minimum balance + let credit: Credit = T::issue(T::minimum_balance() - 1.into()); + // issue temporarily increases total issuance + assert_eq!(T::total_issuance(), credit.peek()); + match T::resolve(&account, credit) { + Ok(_) => panic!("Balanced::resolve should have failed"), + Err(c) => assert_eq!(c.peek(), T::minimum_balance() - 1.into()), + }; + // Credit was unused and dropped from total issuance + assert_eq!(T::total_issuance(), 0.into()); + assert_eq!(T::balance(&account), 0.into()); + + // Credit account with minimum balance + let credit: Credit = T::issue(T::minimum_balance()); + match T::resolve(&account, credit) { + Ok(()) => {}, + Err(_) => panic!("resolve failed"), + }; + assert_eq!(T::total_issuance(), T::minimum_balance()); + assert_eq!(T::balance(&account), T::minimum_balance()); + + // Now that account has been created, it can be credited with an amount below the minimum + // balance. + let total_issuance_before = T::total_issuance(); + let balance_before = T::balance(&account); + let amount = T::minimum_balance() - 1.into(); + let credit: Credit = T::issue(amount); + match T::resolve(&account, credit) { + Ok(()) => {}, + Err(_) => panic!("resolve failed"), + }; + assert_eq!(T::total_issuance(), total_issuance_before + amount); + assert_eq!(T::balance(&account), balance_before + amount); + + // Unhandled issuance is dropped from total issuance + // `let _ = ...` immediately drops the issuance, so everything should be unchanged when + // logic gets to the assertions. + let total_issuance_before = T::total_issuance(); + let balance_before = T::balance(&account); + let _ = T::issue(5.into()); + assert_eq!(T::total_issuance(), total_issuance_before); + assert_eq!(T::balance(&account), balance_before); +} + +/// Tests issuing and resolving [`Debt`] imbalances with [`Balanced::rescind`] and +/// [`Balanced::settle`]. +pub fn rescind_and_settle_debt() +where + T: Balanced, + >::Balance: AtLeast8BitUnsigned + Debug, + AccountId: AtLeast8BitUnsigned, +{ + // Credit account with some balance + let account = AccountId::from(0); + let initial_bal = T::minimum_balance() + 10.into(); + let credit = T::issue(initial_bal); + match T::resolve(&account, credit) { + Ok(()) => {}, + Err(_) => panic!("resolve failed"), + }; + assert_eq!(T::total_issuance(), initial_bal); + assert_eq!(T::balance(&account), initial_bal); + + // Rescind some balance + let rescind_amount = 2.into(); + let debt: Debt = T::rescind(rescind_amount); + assert_eq!(debt.peek(), rescind_amount); + match T::settle(&account, debt, Preservation::Expendable) { + Ok(c) => { + // We settled the full debt and account was not dusted, so there is no left over + // credit. + assert_eq!(c.peek(), 0.into()); + }, + Err(_) => panic!("settle failed"), + }; + assert_eq!(T::total_issuance(), initial_bal - rescind_amount); + assert_eq!(T::balance(&account), initial_bal - rescind_amount); + + // Unhandled debt is added from total issuance + // `let _ = ...` immediately drops the debt, so everything should be unchanged when + // logic gets to the assertions. + let _ = T::rescind(T::minimum_balance()); + assert_eq!(T::total_issuance(), initial_bal - rescind_amount); + assert_eq!(T::balance(&account), initial_bal - rescind_amount); + + // Preservation::Preserve will not allow the account to be dusted on settle + let balance_before = T::balance(&account); + let total_issuance_before = T::total_issuance(); + let rescind_amount = balance_before - T::minimum_balance() + 1.into(); + let debt: Debt = T::rescind(rescind_amount); + assert_eq!(debt.peek(), rescind_amount); + // The new debt is temporarily removed from total_issuance + assert_eq!(T::total_issuance(), total_issuance_before - debt.peek().into()); + match T::settle(&account, debt, Preservation::Preserve) { + Ok(_) => panic!("Balanced::settle should have failed"), + Err(d) => assert_eq!(d.peek(), rescind_amount), + }; + // The debt is added back to total_issuance because it was dropped, leaving the operation a + // noop. + assert_eq!(T::total_issuance(), total_issuance_before); + assert_eq!(T::balance(&account), balance_before); + + // Preservation::Expendable allows the account to be dusted on settle + let debt: Debt = T::rescind(rescind_amount); + match T::settle(&account, debt, Preservation::Expendable) { + Ok(c) => { + // Dusting happens internally, there is no left over credit. + assert_eq!(c.peek(), 0.into()); + }, + Err(_) => panic!("settle failed"), + }; + // The account is dusted and debt dropped from total_issuance + assert_eq!(T::total_issuance(), 0.into()); + assert_eq!(T::balance(&account), 0.into()); +} + +/// Tests [`Balanced::deposit`]. +pub fn deposit() +where + T: Balanced, + >::Balance: AtLeast8BitUnsigned + Debug, + AccountId: AtLeast8BitUnsigned, +{ + // Cannot deposit < minimum balance into non-existent account + let account = AccountId::from(0); + let amount = T::minimum_balance() - 1.into(); + match T::deposit(&account, amount, Precision::Exact) { + Ok(_) => panic!("Balanced::deposit should have failed"), + Err(e) => assert_eq!(e, TokenError::BelowMinimum.into()), + }; + assert_eq!(T::total_issuance(), 0.into()); + assert_eq!(T::balance(&account), 0.into()); + + // Can deposit minimum balance into non-existent account + let amount = T::minimum_balance(); + match T::deposit(&account, amount, Precision::Exact) { + Ok(d) => assert_eq!(d.peek(), amount), + Err(_) => panic!("Balanced::deposit failed"), + }; + assert_eq!(T::total_issuance(), amount); + assert_eq!(T::balance(&account), amount); + + // Depositing amount that would overflow when Precision::Exact fails and is a noop + let amount = T::Balance::max_value(); + let balance_before = T::balance(&account); + let total_issuance_before = T::total_issuance(); + match T::deposit(&account, amount, Precision::Exact) { + Ok(_) => panic!("Balanced::deposit should have failed"), + Err(e) => assert_eq!(e, ArithmeticError::Overflow.into()), + }; + assert_eq!(T::total_issuance(), total_issuance_before); + assert_eq!(T::balance(&account), balance_before); + + // Depositing amount that would overflow when Precision::BestEffort saturates + match T::deposit(&account, amount, Precision::BestEffort) { + Ok(d) => assert_eq!(d.peek(), T::Balance::max_value() - balance_before), + Err(_) => panic!("Balanced::deposit failed"), + }; + assert_eq!(T::total_issuance(), T::Balance::max_value()); + assert_eq!(T::balance(&account), T::Balance::max_value()); +} + +/// Tests [`Balanced::withdraw`]. +pub fn withdraw() +where + T: Balanced, + >::Balance: AtLeast8BitUnsigned + Debug, + AccountId: AtLeast8BitUnsigned, +{ + let account = AccountId::from(0); + + // Init an account with some balance + let initial_balance = T::minimum_balance() + 10.into(); + match T::deposit(&account, initial_balance, Precision::Exact) { + Ok(_) => {}, + Err(_) => panic!("Balanced::deposit failed"), + }; + assert_eq!(T::total_issuance(), initial_balance); + assert_eq!(T::balance(&account), initial_balance); + + // Withdrawing an amount smaller than the balance works when Precision::Exact + let amount = 1.into(); + match T::withdraw( + &account, + amount, + Precision::Exact, + Preservation::Expendable, + Fortitude::Polite, + ) { + Ok(c) => assert_eq!(c.peek(), amount), + Err(_) => panic!("withdraw failed"), + }; + assert_eq!(T::total_issuance(), initial_balance - amount); + assert_eq!(T::balance(&account), initial_balance - amount); + + // Withdrawing an amount greater than the balance fails when Precision::Exact + let balance_before = T::balance(&account); + let amount = balance_before + 1.into(); + match T::withdraw( + &account, + amount, + Precision::Exact, + Preservation::Expendable, + Fortitude::Polite, + ) { + Ok(_) => panic!("should have failed"), + Err(e) => assert_eq!(e, TokenError::FundsUnavailable.into()), + }; + assert_eq!(T::total_issuance(), balance_before); + assert_eq!(T::balance(&account), balance_before); + + // Withdrawing an amount greater than the balance works when Precision::BestEffort + let balance_before = T::balance(&account); + let amount = balance_before + 1.into(); + match T::withdraw( + &account, + amount, + Precision::BestEffort, + Preservation::Expendable, + Fortitude::Polite, + ) { + Ok(c) => assert_eq!(c.peek(), balance_before), + Err(_) => panic!("withdraw failed"), + }; + assert_eq!(T::total_issuance(), 0.into()); + assert_eq!(T::balance(&account), 0.into()); +} + +/// Tests [`Balanced::pair`]. +pub fn pair() +where + T: Balanced, + >::Balance: AtLeast8BitUnsigned + Debug, + AccountId: AtLeast8BitUnsigned, +{ + T::set_total_issuance(50.into()); + + // Pair zero balance works + let (credit, debt) = T::pair(0.into()).unwrap(); + assert_eq!(debt.peek(), 0.into()); + assert_eq!(credit.peek(), 0.into()); + + // Pair with non-zero balance: the credit and debt cancel each other out + let balance = 10.into(); + let (credit, debt) = T::pair(balance).unwrap(); + assert_eq!(credit.peek(), balance); + assert_eq!(debt.peek(), balance); + + // Creating a pair that could increase total_issuance beyond the max value returns an error + let max_value = T::Balance::max_value(); + let distance_from_max_value = 5.into(); + T::set_total_issuance(max_value - distance_from_max_value); + T::pair(distance_from_max_value + 5.into()).unwrap_err(); +} diff --git a/substrate/frame/support/src/traits/tokens/fungible/conformance_tests/regular/mod.rs b/substrate/frame/support/src/traits/tokens/fungible/conformance_tests/regular/mod.rs new file mode 100644 index 00000000000..85acbcf2fcd --- /dev/null +++ b/substrate/frame/support/src/traits/tokens/fungible/conformance_tests/regular/mod.rs @@ -0,0 +1,20 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +pub mod balanced; +pub mod mutate; +pub mod unbalanced; diff --git a/substrate/frame/support/src/traits/tokens/fungible/conformance_tests/regular/mutate.rs b/substrate/frame/support/src/traits/tokens/fungible/conformance_tests/regular/mutate.rs new file mode 100644 index 00000000000..95b5256bb49 --- /dev/null +++ b/substrate/frame/support/src/traits/tokens/fungible/conformance_tests/regular/mutate.rs @@ -0,0 +1,783 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use crate::traits::{ + fungible::{Inspect, Mutate}, + tokens::{ + DepositConsequence, Fortitude, Precision, Preservation, Provenance, WithdrawConsequence, + }, +}; +use core::fmt::Debug; +use sp_arithmetic::traits::AtLeast8BitUnsigned; +use sp_runtime::traits::{Bounded, Zero}; + +/// Test [`Mutate::mint_into`] for successful token minting. +/// +/// It ensures that account balances and total issuance values are updated correctly after +/// minting tokens into two distinct accounts. +pub fn mint_into_success() +where + T: Mutate, + >::Balance: AtLeast8BitUnsigned + Debug, + AccountId: AtLeast8BitUnsigned, +{ + let initial_total_issuance = T::total_issuance(); + let initial_active_issuance = T::active_issuance(); + let account_0 = AccountId::from(0); + let account_1 = AccountId::from(1); + + // Test: Mint an amount into each account + let amount_0 = T::minimum_balance(); + let amount_1 = T::minimum_balance() + 5.into(); + T::mint_into(&account_0, amount_0).unwrap(); + T::mint_into(&account_1, amount_1).unwrap(); + + // Verify: Account balances are updated correctly + assert_eq!(T::total_balance(&account_0), amount_0); + assert_eq!(T::total_balance(&account_1), amount_1); + assert_eq!(T::balance(&account_0), amount_0); + assert_eq!(T::balance(&account_1), amount_1); + + // Verify: Total issuance is updated correctly + assert_eq!(T::total_issuance(), initial_total_issuance + amount_0 + amount_1); + assert_eq!(T::active_issuance(), initial_active_issuance + amount_0 + amount_1); +} + +/// Test [`Mutate::mint_into`] for overflow prevention. +/// +/// This test ensures that minting tokens beyond the maximum balance value for an account +/// returns an error and does not change the account balance or total issuance values. +pub fn mint_into_overflow() +where + T: Mutate, + >::Balance: AtLeast8BitUnsigned + Debug, + AccountId: AtLeast8BitUnsigned, +{ + let initial_total_issuance = T::total_issuance(); + let initial_active_issuance = T::active_issuance(); + let account = AccountId::from(10); + let amount = T::Balance::max_value() - 5.into() - initial_total_issuance; + + // Mint just below the maximum balance + T::mint_into(&account, amount).unwrap(); + + // Verify: Minting beyond the maximum balance value returns an Err + T::mint_into(&account, 10.into()).unwrap_err(); + + // Verify: The balance did not change + assert_eq!(T::total_balance(&account), amount); + assert_eq!(T::balance(&account), amount); + + // Verify: The total issuance did not change + assert_eq!(T::total_issuance(), initial_total_issuance + amount); + assert_eq!(T::active_issuance(), initial_active_issuance + amount); +} + +/// Test [`Mutate::mint_into`] for handling balances below the minimum value. +/// +/// This test verifies that minting tokens below the minimum balance for an account +/// returns an error and has no impact on the account balance or total issuance values. +pub fn mint_into_below_minimum() +where + T: Mutate, + >::Balance: AtLeast8BitUnsigned + Debug, + AccountId: AtLeast8BitUnsigned, +{ + // Skip if there is no minimum balance + if T::minimum_balance() == T::Balance::zero() { + return + } + + let initial_total_issuance = T::total_issuance(); + let initial_active_issuance = T::active_issuance(); + let account = AccountId::from(10); + let amount = T::minimum_balance() - 1.into(); + + // Verify: Minting below the minimum balance returns Err + T::mint_into(&account, amount).unwrap_err(); + + // Verify: noop + assert_eq!(T::total_balance(&account), T::Balance::zero()); + assert_eq!(T::balance(&account), T::Balance::zero()); + assert_eq!(T::total_issuance(), initial_total_issuance); + assert_eq!(T::active_issuance(), initial_active_issuance); +} + +/// Test [`Mutate::burn_from`] for successfully burning an exact amount of tokens. +/// +/// This test checks that burning tokens with [`Precision::Exact`] correctly reduces the account +/// balance and total issuance values by the burned amount. +pub fn burn_from_exact_success() +where + T: Mutate, + >::Balance: AtLeast8BitUnsigned + Debug, + AccountId: AtLeast8BitUnsigned, +{ + let initial_total_issuance = T::total_issuance(); + let initial_active_issuance = T::active_issuance(); + + // Setup account + let account = AccountId::from(5); + let initial_balance = T::minimum_balance() + 10.into(); + T::mint_into(&account, initial_balance).unwrap(); + + // Test: Burn an exact amount from the account + let amount_to_burn = T::Balance::from(5); + let precision = Precision::Exact; + let force = Fortitude::Polite; + T::burn_from(&account, amount_to_burn, precision, force).unwrap(); + + // Verify: The balance and total issuance should be reduced by the burned amount + assert_eq!(T::balance(&account), initial_balance - amount_to_burn); + assert_eq!(T::total_balance(&account), initial_balance - amount_to_burn); + assert_eq!(T::total_issuance(), initial_total_issuance + initial_balance - amount_to_burn); + assert_eq!(T::active_issuance(), initial_active_issuance + initial_balance - amount_to_burn); +} + +/// Test [`Mutate::burn_from`] for successfully burning tokens with [`Precision::BestEffort`]. +/// +/// This test verifies that the burning tokens with best-effort precision correctly reduces the +/// account balance and total issuance values by the reducible balance when attempting to burn +/// an amount greater than the reducible balance. +pub fn burn_from_best_effort_success() +where + T: Mutate, + >::Balance: AtLeast8BitUnsigned + Debug, + AccountId: AtLeast8BitUnsigned, +{ + let initial_total_issuance = T::total_issuance(); + let initial_active_issuance = T::active_issuance(); + + // Setup account + let account = AccountId::from(5); + let initial_balance = T::minimum_balance() + 10.into(); + T::mint_into(&account, initial_balance).unwrap(); + + // Get reducible balance + let force = Fortitude::Polite; + let reducible_balance = T::reducible_balance(&account, Preservation::Expendable, force); + + // Test: Burn a best effort amount from the account that is greater than the reducible + // balance + let amount_to_burn = reducible_balance + 5.into(); + let precision = Precision::BestEffort; + assert!(amount_to_burn > reducible_balance); + assert!(amount_to_burn > T::balance(&account)); + T::burn_from(&account, amount_to_burn, precision, force).unwrap(); + + // Verify: The balance and total issuance should be reduced by the reducible_balance + assert_eq!(T::balance(&account), initial_balance - reducible_balance); + assert_eq!(T::total_balance(&account), initial_balance - reducible_balance); + assert_eq!(T::total_issuance(), initial_total_issuance + initial_balance - reducible_balance); + assert_eq!(T::active_issuance(), initial_active_issuance + initial_balance - reducible_balance); +} + +/// Test [`Mutate::burn_from`] handling of insufficient funds when called with +/// [`Precision::Exact`]. +/// +/// This test verifies that burning an amount greater than the account's balance with exact +/// precision returns an error and does not change the account balance or total issuance values. +pub fn burn_from_exact_insufficient_funds() +where + T: Mutate, + >::Balance: AtLeast8BitUnsigned + Debug, + AccountId: AtLeast8BitUnsigned, +{ + // Set up the initial conditions and parameters for the test + let account = AccountId::from(5); + let initial_balance = T::minimum_balance() + 10.into(); + T::mint_into(&account, initial_balance).unwrap(); + let initial_total_issuance = T::total_issuance(); + let initial_active_issuance = T::active_issuance(); + + // Verify: Burn an amount greater than the account's balance with Exact precision returns + // Err + let amount_to_burn = initial_balance + 10.into(); + let precision = Precision::Exact; + let force = Fortitude::Polite; + T::burn_from(&account, amount_to_burn, precision, force).unwrap_err(); + + // Verify: The balance and total issuance should remain unchanged + assert_eq!(T::balance(&account), initial_balance); + assert_eq!(T::total_balance(&account), initial_balance); + assert_eq!(T::total_issuance(), initial_total_issuance); + assert_eq!(T::active_issuance(), initial_active_issuance); +} + +/// Test [`Mutate::restore`] for successful restoration. +/// +/// This test verifies that restoring an amount into each account updates their balances and the +/// total issuance values correctly. +pub fn restore_success() +where + T: Mutate, + >::Balance: AtLeast8BitUnsigned + Debug, + AccountId: AtLeast8BitUnsigned, +{ + let account_0 = AccountId::from(0); + let account_1 = AccountId::from(1); + + // Test: Restore an amount into each account + let amount_0 = T::minimum_balance(); + let amount_1 = T::minimum_balance() + 5.into(); + let initial_total_issuance = T::total_issuance(); + let initial_active_issuance = T::active_issuance(); + T::restore(&account_0, amount_0).unwrap(); + T::restore(&account_1, amount_1).unwrap(); + + // Verify: Account balances are updated correctly + assert_eq!(T::total_balance(&account_0), amount_0); + assert_eq!(T::total_balance(&account_1), amount_1); + assert_eq!(T::balance(&account_0), amount_0); + assert_eq!(T::balance(&account_1), amount_1); + + // Verify: Total issuance is updated correctly + assert_eq!(T::total_issuance(), initial_total_issuance + amount_0 + amount_1); + assert_eq!(T::active_issuance(), initial_active_issuance + amount_0 + amount_1); +} + +/// Test [`Mutate::restore`] handles balance overflow. +/// +/// This test verifies that restoring an amount beyond the maximum balance returns an error and +/// does not change the account balance or total issuance values. +pub fn restore_overflow() +where + T: Mutate, + >::Balance: AtLeast8BitUnsigned + Debug, + AccountId: AtLeast8BitUnsigned, +{ + let initial_total_issuance = T::total_issuance(); + let initial_active_issuance = T::active_issuance(); + let account = AccountId::from(10); + let amount = T::Balance::max_value() - 5.into() - initial_total_issuance; + + // Restore just below the maximum balance + T::restore(&account, amount).unwrap(); + + // Verify: Restoring beyond the maximum balance returns an Err + T::restore(&account, 10.into()).unwrap_err(); + + // Verify: The balance and total issuance did not change + assert_eq!(T::total_balance(&account), amount); + assert_eq!(T::balance(&account), amount); + assert_eq!(T::total_issuance(), initial_total_issuance + amount); + assert_eq!(T::active_issuance(), initial_active_issuance + amount); +} + +/// Test [`Mutate::restore`] handles restoration below the minimum balance. +/// +/// This test verifies that restoring an amount below the minimum balance returns an error and +/// does not change the account balance or total issuance values. +pub fn restore_below_minimum() +where + T: Mutate, + >::Balance: AtLeast8BitUnsigned + Debug, + AccountId: AtLeast8BitUnsigned, +{ + // Skip if there is no minimum balance + if T::minimum_balance() == T::Balance::zero() { + return + } + + let account = AccountId::from(10); + let amount = T::minimum_balance() - 1.into(); + let initial_total_issuance = T::total_issuance(); + let initial_active_issuance = T::active_issuance(); + + // Verify: Restoring below the minimum balance returns Err + T::restore(&account, amount).unwrap_err(); + + // Verify: noop + assert_eq!(T::total_balance(&account), T::Balance::zero()); + assert_eq!(T::balance(&account), T::Balance::zero()); + assert_eq!(T::total_issuance(), initial_total_issuance); + assert_eq!(T::active_issuance(), initial_active_issuance); +} + +/// Test [`Mutate::shelve`] for successful shelving. +/// +/// This test verifies that shelving an amount from an account reduces the account balance and +/// total issuance values by the shelved amount. +pub fn shelve_success() +where + T: Mutate, + >::Balance: AtLeast8BitUnsigned + Debug, + AccountId: AtLeast8BitUnsigned, +{ + let initial_total_issuance = T::total_issuance(); + let initial_active_issuance = T::active_issuance(); + + // Setup account + let account = AccountId::from(5); + let initial_balance = T::minimum_balance() + 10.into(); + + T::restore(&account, initial_balance).unwrap(); + + // Test: Shelve an amount from the account + let amount_to_shelve = T::Balance::from(5); + T::shelve(&account, amount_to_shelve).unwrap(); + + // Verify: The balance and total issuance should be reduced by the shelved amount + assert_eq!(T::balance(&account), initial_balance - amount_to_shelve); + assert_eq!(T::total_balance(&account), initial_balance - amount_to_shelve); + assert_eq!(T::total_issuance(), initial_total_issuance + initial_balance - amount_to_shelve); + assert_eq!(T::active_issuance(), initial_active_issuance + initial_balance - amount_to_shelve); +} + +/// Test [`Mutate::shelve`] handles insufficient funds correctly. +/// +/// This test verifies that attempting to shelve an amount greater than the account's balance +/// returns an error and does not change the account balance or total issuance values. +pub fn shelve_insufficient_funds() +where + T: Mutate, + >::Balance: AtLeast8BitUnsigned + Debug, + AccountId: AtLeast8BitUnsigned, +{ + let initial_total_issuance = T::total_issuance(); + let initial_active_issuance = T::active_issuance(); + + // Set up the initial conditions and parameters for the test + let account = AccountId::from(5); + let initial_balance = T::minimum_balance() + 10.into(); + T::restore(&account, initial_balance).unwrap(); + + // Verify: Shelving greater than the balance with Exact precision returns Err + let amount_to_shelve = initial_balance + 10.into(); + T::shelve(&account, amount_to_shelve).unwrap_err(); + + // Verify: The balance and total issuance should remain unchanged + assert_eq!(T::balance(&account), initial_balance); + assert_eq!(T::total_balance(&account), initial_balance); + assert_eq!(T::total_issuance(), initial_total_issuance + initial_balance); + assert_eq!(T::active_issuance(), initial_active_issuance + initial_balance); +} + +/// Test [`Mutate::transfer`] for a successful transfer. +/// +/// This test verifies that transferring an amount between two accounts with updates the account +/// balances and maintains correct total issuance and active issuance values. +pub fn transfer_success() +where + T: Mutate, + >::Balance: AtLeast8BitUnsigned + Debug, + AccountId: AtLeast8BitUnsigned, +{ + let initial_total_issuance = T::total_issuance(); + let initial_active_issuance = T::active_issuance(); + let account_0 = AccountId::from(0); + let account_1 = AccountId::from(1); + let initial_balance = T::minimum_balance() + 10.into(); + T::set_balance(&account_0, initial_balance); + T::set_balance(&account_1, initial_balance); + + // Test: Transfer an amount from account_0 to account_1 + let transfer_amount = T::Balance::from(3); + T::transfer(&account_0, &account_1, transfer_amount, Preservation::Expendable).unwrap(); + + // Verify: Account balances are updated correctly + assert_eq!(T::total_balance(&account_0), initial_balance - transfer_amount); + assert_eq!(T::total_balance(&account_1), initial_balance + transfer_amount); + assert_eq!(T::balance(&account_0), initial_balance - transfer_amount); + assert_eq!(T::balance(&account_1), initial_balance + transfer_amount); + + // Verify: Total issuance doesn't change + assert_eq!(T::total_issuance(), initial_total_issuance + initial_balance * 2.into()); + assert_eq!(T::active_issuance(), initial_active_issuance + initial_balance * 2.into()); +} + +/// Test calling [`Mutate::transfer`] with [`Preservation::Expendable`] correctly transfers the +/// entire balance. +/// +/// This test verifies that transferring the entire balance from one account to another with +/// when preservation is expendable updates the account balances and maintains the total +/// issuance and active issuance values. +pub fn transfer_expendable_all() +where + T: Mutate, + >::Balance: AtLeast8BitUnsigned + Debug, + AccountId: AtLeast8BitUnsigned, +{ + let initial_total_issuance = T::total_issuance(); + let initial_active_issuance = T::active_issuance(); + let account_0 = AccountId::from(0); + let account_1 = AccountId::from(1); + let initial_balance = T::minimum_balance() + 10.into(); + T::set_balance(&account_0, initial_balance); + T::set_balance(&account_1, initial_balance); + + // Test: Transfer entire balance from account_0 to account_1 + let preservation = Preservation::Expendable; + let transfer_amount = initial_balance; + T::transfer(&account_0, &account_1, transfer_amount, preservation).unwrap(); + + // Verify: Account balances are updated correctly + assert_eq!(T::total_balance(&account_0), T::Balance::zero()); + assert_eq!(T::total_balance(&account_1), initial_balance * 2.into()); + assert_eq!(T::balance(&account_0), T::Balance::zero()); + assert_eq!(T::balance(&account_1), initial_balance * 2.into()); + + // Verify: Total issuance doesn't change + assert_eq!(T::total_issuance(), initial_total_issuance + initial_balance * 2.into()); + assert_eq!(T::active_issuance(), initial_active_issuance + initial_balance * 2.into()); +} + +/// Test calling [`Mutate::transfer`] function with [`Preservation::Expendable`] and an amount +/// that results in some dust. +/// +/// This test verifies that dust is handled correctly when an account is reaped, with and +/// without a dust trap. +/// +/// # Parameters +/// +/// - dust_trap: An optional account identifier to which dust will be collected. If `None`, dust is +/// expected to be removed from the total and active issuance. +pub fn transfer_expendable_dust(dust_trap: Option) +where + T: Mutate, + >::Balance: AtLeast8BitUnsigned + Debug, + AccountId: AtLeast8BitUnsigned, +{ + if T::minimum_balance() == T::Balance::zero() { + return + } + + let account_0 = AccountId::from(10); + let account_1 = AccountId::from(20); + let initial_balance = T::minimum_balance() + 10.into(); + T::set_balance(&account_0, initial_balance); + T::set_balance(&account_1, initial_balance); + + let initial_total_issuance = T::total_issuance(); + let initial_active_issuance = T::active_issuance(); + let initial_dust_trap_balance = match dust_trap.clone() { + Some(dust_trap) => T::total_balance(&dust_trap), + None => T::Balance::zero(), + }; + + // Test: Transfer balance + let preservation = Preservation::Expendable; + let transfer_amount = T::Balance::from(11); + T::transfer(&account_0, &account_1, transfer_amount, preservation).unwrap(); + + // Verify: Account balances are updated correctly + assert_eq!(T::total_balance(&account_0), T::Balance::zero()); + assert_eq!(T::total_balance(&account_1), initial_balance + transfer_amount); + assert_eq!(T::balance(&account_0), T::Balance::zero()); + assert_eq!(T::balance(&account_1), initial_balance + transfer_amount); + + match dust_trap { + Some(dust_trap) => { + // Verify: Total issuance and active issuance don't change + assert_eq!(T::total_issuance(), initial_total_issuance); + assert_eq!(T::active_issuance(), initial_active_issuance); + // Verify: Dust is collected into dust trap + assert_eq!( + T::total_balance(&dust_trap), + initial_dust_trap_balance + T::minimum_balance() - 1.into() + ); + assert_eq!( + T::balance(&dust_trap), + initial_dust_trap_balance + T::minimum_balance() - 1.into() + ); + }, + None => { + // Verify: Total issuance and active issuance are reduced by the dust amount + assert_eq!( + T::total_issuance(), + initial_total_issuance - T::minimum_balance() + 1.into() + ); + assert_eq!( + T::active_issuance(), + initial_active_issuance - T::minimum_balance() + 1.into() + ); + }, + } +} + +/// Test [`Mutate::transfer`] with [`Preservation::Protect`] and [`Preservation::Preserve`] +/// transferring the entire balance. +/// +/// This test verifies that attempting to transfer the entire balance with returns an error when +/// preservation should not allow it, and the account balances, total issuance, and active +/// issuance values remain unchanged. +pub fn transfer_protect_preserve() +where + T: Mutate, + >::Balance: AtLeast8BitUnsigned + Debug, + AccountId: AtLeast8BitUnsigned, +{ + // This test means nothing if there is no minimum balance + if T::minimum_balance() == T::Balance::zero() { + return + } + + let initial_total_issuance = T::total_issuance(); + let initial_active_issuance = T::active_issuance(); + let account_0 = AccountId::from(0); + let account_1 = AccountId::from(1); + let initial_balance = T::minimum_balance() + 10.into(); + T::set_balance(&account_0, initial_balance); + T::set_balance(&account_1, initial_balance); + + // Verify: Transfer Protect entire balance from account_0 to account_1 should Err + let preservation = Preservation::Protect; + let transfer_amount = initial_balance; + T::transfer(&account_0, &account_1, transfer_amount, preservation).unwrap_err(); + + // Verify: Noop + assert_eq!(T::total_balance(&account_0), initial_balance); + assert_eq!(T::total_balance(&account_1), initial_balance); + assert_eq!(T::balance(&account_0), initial_balance); + assert_eq!(T::balance(&account_1), initial_balance); + assert_eq!(T::total_issuance(), initial_total_issuance + initial_balance * 2.into()); + assert_eq!(T::active_issuance(), initial_active_issuance + initial_balance * 2.into()); + + // Verify: Transfer Preserve entire balance from account_0 to account_1 should Err + let preservation = Preservation::Preserve; + T::transfer(&account_0, &account_1, transfer_amount, preservation).unwrap_err(); + + // Verify: Noop + assert_eq!(T::total_balance(&account_0), initial_balance); + assert_eq!(T::total_balance(&account_1), initial_balance); + assert_eq!(T::balance(&account_0), initial_balance); + assert_eq!(T::balance(&account_1), initial_balance); + assert_eq!(T::total_issuance(), initial_total_issuance + initial_balance * 2.into()); + assert_eq!(T::active_issuance(), initial_active_issuance + initial_balance * 2.into()); +} + +/// Test [`Mutate::set_balance`] mints balances correctly. +/// +/// This test verifies that minting a balance using `set_balance` updates the account balance, +/// total issuance, and active issuance correctly. +pub fn set_balance_mint_success() +where + T: Mutate, + >::Balance: AtLeast8BitUnsigned + Debug, + AccountId: AtLeast8BitUnsigned, +{ + let initial_total_issuance = T::total_issuance(); + let initial_active_issuance = T::active_issuance(); + let account = AccountId::from(10); + let initial_balance = T::minimum_balance() + 10.into(); + T::mint_into(&account, initial_balance).unwrap(); + + // Test: Increase the account balance with set_balance + let increase_amount: T::Balance = 5.into(); + let new = T::set_balance(&account, initial_balance + increase_amount); + + // Verify: set_balance returned the new balance + let expected_new = initial_balance + increase_amount; + assert_eq!(new, expected_new); + + // Verify: Balance and issuance is updated correctly + assert_eq!(T::total_balance(&account), expected_new); + assert_eq!(T::balance(&account), expected_new); + assert_eq!(T::total_issuance(), initial_total_issuance + expected_new); + assert_eq!(T::active_issuance(), initial_active_issuance + expected_new); +} + +/// Test [`Mutate::set_balance`] burns balances correctly. +/// +/// This test verifies that burning a balance using `set_balance` updates the account balance, +/// total issuance, and active issuance correctly. +pub fn set_balance_burn_success() +where + T: Mutate, + >::Balance: AtLeast8BitUnsigned + Debug, + AccountId: AtLeast8BitUnsigned, +{ + let initial_total_issuance = T::total_issuance(); + let initial_active_issuance = T::active_issuance(); + let account = AccountId::from(10); + let initial_balance = T::minimum_balance() + 10.into(); + T::mint_into(&account, initial_balance).unwrap(); + + // Test: Increase the account balance with set_balance + let burn_amount: T::Balance = 5.into(); + let new = T::set_balance(&account, initial_balance - burn_amount); + + // Verify: set_balance returned the new balance + let expected_new = initial_balance - burn_amount; + assert_eq!(new, expected_new); + + // Verify: Balance and issuance is updated correctly + assert_eq!(T::total_balance(&account), expected_new); + assert_eq!(T::balance(&account), expected_new); + assert_eq!(T::total_issuance(), initial_total_issuance + expected_new); + assert_eq!(T::active_issuance(), initial_active_issuance + expected_new); +} + +/// Test [`Inspect::can_deposit`] works correctly returns [`DepositConsequence::Success`] +/// when depositing an amount that should succeed. +pub fn can_deposit_success() +where + T: Mutate, + >::Balance: AtLeast8BitUnsigned + Debug, + AccountId: AtLeast8BitUnsigned, +{ + let account = AccountId::from(10); + let initial_balance = T::minimum_balance() + 10.into(); + T::mint_into(&account, initial_balance).unwrap(); + + // Test: can_deposit a reasonable amount + let ret = T::can_deposit(&account, 5.into(), Provenance::Minted); + + // Verify: Returns success + assert_eq!(ret, DepositConsequence::Success); +} + +/// Test [`Inspect::can_deposit`] returns [`DepositConsequence::BelowMinimum`] when depositing +/// below the minimum balance. +pub fn can_deposit_below_minimum() +where + T: Mutate, + >::Balance: AtLeast8BitUnsigned + Debug, + AccountId: AtLeast8BitUnsigned, +{ + // can_deposit always returns Success for amount 0 + if T::minimum_balance() < 2.into() { + return + } + + let account = AccountId::from(10); + + // Test: can_deposit below the minimum + let ret = T::can_deposit(&account, T::minimum_balance() - 1.into(), Provenance::Minted); + + // Verify: Returns success + assert_eq!(ret, DepositConsequence::BelowMinimum); +} + +/// Test [`Inspect::can_deposit`] returns [`DepositConsequence::Overflow`] when +/// depositing an amount that would overflow. +pub fn can_deposit_overflow() +where + T: Mutate, + >::Balance: AtLeast8BitUnsigned + Debug, + AccountId: AtLeast8BitUnsigned, +{ + let account = AccountId::from(10); + + // Test: Try deposit over the max balance + let initial_balance = T::Balance::max_value() - 5.into() - T::total_issuance(); + T::mint_into(&account, initial_balance).unwrap(); + let ret = T::can_deposit(&account, 10.into(), Provenance::Minted); + + // Verify: Returns success + assert_eq!(ret, DepositConsequence::Overflow); +} + +/// Test [`Inspect::can_withdraw`] returns [`WithdrawConsequence::Success`] when withdrawing an +/// amount that should succeed. +pub fn can_withdraw_success() +where + T: Mutate, + >::Balance: AtLeast8BitUnsigned + Debug, + AccountId: AtLeast8BitUnsigned, +{ + let account = AccountId::from(10); + let initial_balance = T::minimum_balance() + 10.into(); + T::mint_into(&account, initial_balance).unwrap(); + + // Test: can_withdraw a reasonable amount + let ret = T::can_withdraw(&account, 5.into()); + + // Verify: Returns success + assert_eq!(ret, WithdrawConsequence::Success); +} + +/// Test [`Inspect::can_withdraw`] returns [`WithdrawConsequence::ReducedToZero`] when +/// withdrawing an amount that would reduce the account balance below the minimum balance. +pub fn can_withdraw_reduced_to_zero() +where + T: Mutate, + >::Balance: AtLeast8BitUnsigned + Debug, + AccountId: AtLeast8BitUnsigned, +{ + if T::minimum_balance() == T::Balance::zero() { + return + } + + let account = AccountId::from(10); + let initial_balance = T::minimum_balance(); + T::mint_into(&account, initial_balance).unwrap(); + + // Verify: can_withdraw below the minimum balance returns ReducedToZero + let ret = T::can_withdraw(&account, 1.into()); + assert_eq!(ret, WithdrawConsequence::ReducedToZero(T::minimum_balance() - 1.into())); +} + +/// Test [`Inspect::can_withdraw`] returns [`WithdrawConsequence::BalanceLow`] when withdrawing +/// an amount that would result in an account balance below the current balance. +pub fn can_withdraw_balance_low() +where + T: Mutate, + >::Balance: AtLeast8BitUnsigned + Debug, + AccountId: AtLeast8BitUnsigned, +{ + if T::minimum_balance() == T::Balance::zero() { + return + } + + let account = AccountId::from(10); + let other_account = AccountId::from(100); + let initial_balance = T::minimum_balance() + 5.into(); + T::mint_into(&account, initial_balance).unwrap(); + T::mint_into(&other_account, initial_balance * 2.into()).unwrap(); + + // Verify: can_withdraw below the account balance returns BalanceLow + let ret = T::can_withdraw(&account, initial_balance + 1.into()); + assert_eq!(ret, WithdrawConsequence::BalanceLow); +} + +/// Test [`Inspect::reducible_balance`] returns the full account balance when called with +/// [`Preservation::Expendable`]. +pub fn reducible_balance_expendable() +where + T: Mutate, + >::Balance: AtLeast8BitUnsigned + Debug, + AccountId: AtLeast8BitUnsigned, +{ + let account = AccountId::from(10); + let initial_balance = T::minimum_balance() + 10.into(); + T::mint_into(&account, initial_balance).unwrap(); + + // Verify: reducible_balance returns the full balance + let ret = T::reducible_balance(&account, Preservation::Expendable, Fortitude::Polite); + assert_eq!(ret, initial_balance); +} + +/// Tests [`Inspect::reducible_balance`] returns [`Inspect::balance`] - +/// [`Inspect::minimum_balance`] when called with either [`Preservation::Protect`] or +/// [`Preservation::Preserve`]. +pub fn reducible_balance_protect_preserve() +where + T: Mutate, + >::Balance: AtLeast8BitUnsigned + Debug, + AccountId: AtLeast8BitUnsigned, +{ + let account = AccountId::from(10); + let initial_balance = T::minimum_balance() + 10.into(); + T::mint_into(&account, initial_balance).unwrap(); + + // Verify: reducible_balance returns the full balance - min balance + let ret = T::reducible_balance(&account, Preservation::Protect, Fortitude::Polite); + assert_eq!(ret, initial_balance - T::minimum_balance()); + let ret = T::reducible_balance(&account, Preservation::Preserve, Fortitude::Polite); + assert_eq!(ret, initial_balance - T::minimum_balance()); +} diff --git a/substrate/frame/support/src/traits/tokens/fungible/conformance_tests/regular/unbalanced.rs b/substrate/frame/support/src/traits/tokens/fungible/conformance_tests/regular/unbalanced.rs new file mode 100644 index 00000000000..e7fcc15472e --- /dev/null +++ b/substrate/frame/support/src/traits/tokens/fungible/conformance_tests/regular/unbalanced.rs @@ -0,0 +1,281 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use crate::traits::{ + fungible::{Inspect, Unbalanced}, + tokens::{Fortitude, Precision, Preservation}, +}; +use core::fmt::Debug; +use sp_arithmetic::{traits::AtLeast8BitUnsigned, ArithmeticError}; +use sp_runtime::{traits::Bounded, TokenError}; + +/// Tests [`Unbalanced::write_balance`]. +/// +/// We don't need to test the Error case for this function, because the trait makes no +/// assumptions about the ways it can fail. That is completely an implementation detail. +pub fn write_balance() +where + T: Unbalanced, + >::Balance: AtLeast8BitUnsigned + Debug, + AccountId: AtLeast8BitUnsigned, +{ + // Setup some accounts to test varying initial balances + let account_0_ed = AccountId::from(0); + let account_1_gt_ed = AccountId::from(1); + let account_2_empty = AccountId::from(2); + T::increase_balance(&account_0_ed, T::minimum_balance(), Precision::Exact).unwrap(); + T::increase_balance(&account_1_gt_ed, T::minimum_balance() + 5.into(), Precision::Exact) + .unwrap(); + + // Test setting the balances of each account by gt the minimum balance succeeds with no + // dust. + let amount = T::minimum_balance() + 10.into(); + assert_eq!(T::write_balance(&account_0_ed, amount), Ok(None)); + assert_eq!(T::write_balance(&account_1_gt_ed, amount), Ok(None)); + assert_eq!(T::write_balance(&account_2_empty, amount), Ok(None)); + assert_eq!(T::balance(&account_0_ed), amount); + assert_eq!(T::balance(&account_1_gt_ed), amount); + assert_eq!(T::balance(&account_2_empty), amount); + + // Test setting the balances of each account to below the minimum balance succeeds with + // the expected dust. + // If the minimum balance is 1, then the dust is 0, represented as None. + // If the minimum balance is >1, then the dust is the remaining balance that will be wiped + // as the account is reaped. + let amount = T::minimum_balance() - 1.into(); + if T::minimum_balance() == 1.into() { + assert_eq!(T::write_balance(&account_0_ed, amount), Ok(None)); + assert_eq!(T::write_balance(&account_1_gt_ed, amount), Ok(None)); + assert_eq!(T::write_balance(&account_2_empty, amount), Ok(None)); + } else if T::minimum_balance() > 1.into() { + assert_eq!(T::write_balance(&account_0_ed, amount), Ok(Some(amount))); + assert_eq!(T::write_balance(&account_1_gt_ed, amount), Ok(Some(amount))); + assert_eq!(T::write_balance(&account_2_empty, amount), Ok(Some(amount))); + } +} + +/// Tests [`Unbalanced::decrease_balance`] called with [`Preservation::Expendable`]. +pub fn decrease_balance_expendable() +where + T: Unbalanced, + >::Balance: AtLeast8BitUnsigned + Debug, + AccountId: AtLeast8BitUnsigned, +{ + // Setup account with some balance + let account_0 = AccountId::from(0); + let account_0_initial_balance = T::minimum_balance() + 10.into(); + T::increase_balance(&account_0, account_0_initial_balance, Precision::Exact).unwrap(); + + // Decreasing the balance still above the minimum balance should not reap the account. + let amount = 1.into(); + assert_eq!( + T::decrease_balance( + &account_0, + amount, + Precision::Exact, + Preservation::Expendable, + Fortitude::Polite, + ), + Ok(amount), + ); + assert_eq!(T::balance(&account_0), account_0_initial_balance - amount); + + // Decreasing the balance below funds avalibale should fail when Precision::Exact + let balance_before = T::balance(&account_0); + assert_eq!( + T::decrease_balance( + &account_0, + account_0_initial_balance, + Precision::Exact, + Preservation::Expendable, + Fortitude::Polite, + ), + Err(TokenError::FundsUnavailable.into()) + ); + // Balance unchanged + assert_eq!(T::balance(&account_0), balance_before); + + // And reap the account when Precision::BestEffort + assert_eq!( + T::decrease_balance( + &account_0, + account_0_initial_balance, + Precision::BestEffort, + Preservation::Expendable, + Fortitude::Polite, + ), + Ok(balance_before), + ); + // Account reaped + assert_eq!(T::balance(&account_0), 0.into()); +} + +/// Tests [`Unbalanced::decrease_balance`] called with [`Preservation::Preserve`]. +pub fn decrease_balance_preserve() +where + T: Unbalanced, + >::Balance: AtLeast8BitUnsigned + Debug, + AccountId: AtLeast8BitUnsigned, +{ + // Setup account with some balance + let account_0 = AccountId::from(0); + let account_0_initial_balance = T::minimum_balance() + 10.into(); + T::increase_balance(&account_0, account_0_initial_balance, Precision::Exact).unwrap(); + + // Decreasing the balance below the minimum when Precision::Exact should fail. + let amount = 11.into(); + assert_eq!( + T::decrease_balance( + &account_0, + amount, + Precision::Exact, + Preservation::Preserve, + Fortitude::Polite, + ), + Err(TokenError::FundsUnavailable.into()), + ); + // Balance should not have changed. + assert_eq!(T::balance(&account_0), account_0_initial_balance); + + // Decreasing the balance below the minimum when Precision::BestEffort should reduce to + // minimum balance. + let amount = 11.into(); + assert_eq!( + T::decrease_balance( + &account_0, + amount, + Precision::BestEffort, + Preservation::Preserve, + Fortitude::Polite, + ), + Ok(account_0_initial_balance - T::minimum_balance()), + ); + assert_eq!(T::balance(&account_0), T::minimum_balance()); +} + +/// Tests [`Unbalanced::increase_balance`]. +pub fn increase_balance() +where + T: Unbalanced, + >::Balance: AtLeast8BitUnsigned + Debug, + AccountId: AtLeast8BitUnsigned, +{ + let account_0 = AccountId::from(0); + assert_eq!(T::balance(&account_0), 0.into()); + + // Increasing the bal below the ED errors when precision is Exact + if T::minimum_balance() > 0.into() { + assert_eq!( + T::increase_balance(&account_0, T::minimum_balance() - 1.into(), Precision::Exact), + Err(TokenError::BelowMinimum.into()), + ); + } + assert_eq!(T::balance(&account_0), 0.into()); + + // Increasing the bal below the ED leaves the balance at zero when precision is BestEffort + if T::minimum_balance() > 0.into() { + assert_eq!( + T::increase_balance(&account_0, T::minimum_balance() - 1.into(), Precision::BestEffort), + Ok(0.into()), + ); + } + assert_eq!(T::balance(&account_0), 0.into()); + + // Can increase if new bal is >= ED + assert_eq!( + T::increase_balance(&account_0, T::minimum_balance(), Precision::Exact), + Ok(T::minimum_balance()), + ); + assert_eq!(T::balance(&account_0), T::minimum_balance()); + assert_eq!(T::increase_balance(&account_0, 5.into(), Precision::Exact), Ok(5.into()),); + assert_eq!(T::balance(&account_0), T::minimum_balance() + 5.into()); + + // Increasing by amount that would overflow fails when precision is Exact + assert_eq!( + T::increase_balance(&account_0, T::Balance::max_value(), Precision::Exact), + Err(ArithmeticError::Overflow.into()), + ); + + // Increasing by amount that would overflow saturates when precision is BestEffort + let balance_before = T::balance(&account_0); + assert_eq!( + T::increase_balance(&account_0, T::Balance::max_value(), Precision::BestEffort), + Ok(T::Balance::max_value() - balance_before), + ); + assert_eq!(T::balance(&account_0), T::Balance::max_value()); +} + +/// Tests [`Unbalanced::set_total_issuance`]. +pub fn set_total_issuance() +where + T: Unbalanced, + >::Balance: AtLeast8BitUnsigned + Debug, + AccountId: AtLeast8BitUnsigned, +{ + T::set_total_issuance(1.into()); + assert_eq!(T::total_issuance(), 1.into()); + + T::set_total_issuance(0.into()); + assert_eq!(T::total_issuance(), 0.into()); + + T::set_total_issuance(T::minimum_balance()); + assert_eq!(T::total_issuance(), T::minimum_balance()); + + T::set_total_issuance(T::minimum_balance() + 5.into()); + assert_eq!(T::total_issuance(), T::minimum_balance() + 5.into()); + + if T::minimum_balance() > 0.into() { + T::set_total_issuance(T::minimum_balance() - 1.into()); + assert_eq!(T::total_issuance(), T::minimum_balance() - 1.into()); + } +} + +/// Tests [`Unbalanced::deactivate`] and [`Unbalanced::reactivate`]. +pub fn deactivate_and_reactivate() +where + T: Unbalanced, + >::Balance: AtLeast8BitUnsigned + Debug, + AccountId: AtLeast8BitUnsigned, +{ + T::set_total_issuance(10.into()); + assert_eq!(T::total_issuance(), 10.into()); + assert_eq!(T::active_issuance(), 10.into()); + + T::deactivate(2.into()); + assert_eq!(T::total_issuance(), 10.into()); + assert_eq!(T::active_issuance(), 8.into()); + + // Saturates at total_issuance + T::reactivate(4.into()); + assert_eq!(T::total_issuance(), 10.into()); + assert_eq!(T::active_issuance(), 10.into()); + + // Decrements correctly after saturating at total_issuance + T::deactivate(1.into()); + assert_eq!(T::total_issuance(), 10.into()); + assert_eq!(T::active_issuance(), 9.into()); + + // Saturates at zero + T::deactivate(15.into()); + assert_eq!(T::total_issuance(), 10.into()); + assert_eq!(T::active_issuance(), 0.into()); + + // Increments correctly after saturating at zero + T::reactivate(1.into()); + assert_eq!(T::total_issuance(), 10.into()); + assert_eq!(T::active_issuance(), 1.into()); +} diff --git a/substrate/frame/support/src/traits/tokens/fungible/item_of.rs b/substrate/frame/support/src/traits/tokens/fungible/item_of.rs index fe252c6b089..37749d39600 100644 --- a/substrate/frame/support/src/traits/tokens/fungible/item_of.rs +++ b/substrate/frame/support/src/traits/tokens/fungible/item_of.rs @@ -389,9 +389,11 @@ impl< let credit = >::issue(A::get(), amount); imbalance::from_fungibles(credit) } - fn pair(amount: Self::Balance) -> (Debt, Credit) { - let (a, b) = >::pair(A::get(), amount); - (imbalance::from_fungibles(a), imbalance::from_fungibles(b)) + fn pair( + amount: Self::Balance, + ) -> Result<(Debt, Credit), DispatchError> { + let (a, b) = >::pair(A::get(), amount)?; + Ok((imbalance::from_fungibles(a), imbalance::from_fungibles(b))) } fn rescind(amount: Self::Balance) -> Debt { let debt = >::rescind(A::get(), amount); diff --git a/substrate/frame/support/src/traits/tokens/fungible/regular.rs b/substrate/frame/support/src/traits/tokens/fungible/regular.rs index 87c6ef68d77..f15c3418d0a 100644 --- a/substrate/frame/support/src/traits/tokens/fungible/regular.rs +++ b/substrate/frame/support/src/traits/tokens/fungible/regular.rs @@ -64,7 +64,7 @@ pub trait Inspect: Sized { /// indefinitely. /// /// For the amount of the balance which is currently free to be removed from the account without - /// error, use `reducible_balance`. + /// error, use [`Inspect::reducible_balance`]. /// /// For the amount of the balance which may eventually be free to be removed from the account, /// use `balance()`. @@ -74,7 +74,7 @@ pub trait Inspect: Sized { /// subsystems of the chain ("on hold" or "reserved"). /// /// In general this isn't especially useful outside of tests, and for practical purposes, you'll - /// want to use `reducible_balance()`. + /// want to use [`Inspect::reducible_balance`]. fn balance(who: &AccountId) -> Self::Balance; /// Get the maximum amount that `who` can withdraw/transfer successfully based on whether the @@ -82,7 +82,7 @@ pub trait Inspect: Sized { /// reduction and potentially go below user-level restrictions on the minimum amount of the /// account. /// - /// Always less than or equal to `balance()`. + /// Always less than or equal to [`Inspect::balance`]. fn reducible_balance( who: &AccountId, preservation: Preservation, @@ -106,7 +106,7 @@ pub trait Inspect: Sized { fn can_withdraw(who: &AccountId, amount: Self::Balance) -> WithdrawConsequence; } -/// Special dust type which can be type-safely converted into a `Credit`. +/// Special dust type which can be type-safely converted into a [`Credit`]. #[must_use] pub struct Dust>(pub T::Balance); @@ -123,20 +123,20 @@ impl> Dust { /// Do not use this directly unless you want trouble, since it allows you to alter account balances /// without keeping the issuance up to date. It has no safeguards against accidentally creating /// token imbalances in your system leading to accidental inflation or deflation. It's really just -/// for the underlying datatype to implement so the user gets the much safer `Balanced` trait to +/// for the underlying datatype to implement so the user gets the much safer [`Balanced`] trait to /// use. pub trait Unbalanced: Inspect { - /// Create some dust and handle it with `Self::handle_dust`. This is an unbalanced operation - /// and it must only be used when an account is modified in a raw fashion, outside of the entire - /// fungibles API. The `amount` is capped at `Self::minimum_balance() - 1`. + /// Create some dust and handle it with [`Unbalanced::handle_dust`]. This is an unbalanced + /// operation and it must only be used when an account is modified in a raw fashion, outside of + /// the entire fungibles API. The `amount` is capped at [`Inspect::minimum_balance()`] - 1`. /// /// This should not be reimplemented. fn handle_raw_dust(amount: Self::Balance) { Self::handle_dust(Dust(amount.min(Self::minimum_balance().saturating_sub(One::one())))) } - /// Do something with the dust which has been destroyed from the system. `Dust` can be converted - /// into a `Credit` with the `Balanced` trait impl. + /// Do something with the dust which has been destroyed from the system. [`Dust`] can be + /// converted into a [`Credit`] with the [`Balanced`] trait impl. fn handle_dust(dust: Dust); /// Forcefully set the balance of `who` to `amount`. @@ -151,9 +151,10 @@ pub trait Unbalanced: Inspect { /// If this cannot be done for some reason (e.g. because the account cannot be created, deleted /// or would overflow) then an `Err` is returned. /// - /// If `Ok` is returned then its inner, if `Some` is the amount which was discarded as dust due - /// to existential deposit requirements. The default implementation of `decrease_balance` and - /// `increase_balance` converts this into an `Imbalance` and then passes it into `handle_dust`. + /// If `Ok` is returned then its inner, then `Some` is the amount which was discarded as dust + /// due to existential deposit requirements. The default implementation of + /// [`Unbalanced::decrease_balance`] and [`Unbalanced::increase_balance`] converts this into an + /// [`Imbalance`] and then passes it into [`Unbalanced::handle_dust`]. fn write_balance( who: &AccountId, amount: Self::Balance, @@ -164,14 +165,14 @@ pub trait Unbalanced: Inspect { /// Reduce the balance of `who` by `amount`. /// - /// If `precision` is `Exact` and it cannot be reduced by that amount for - /// some reason, return `Err` and don't reduce it at all. If `precision` is `BestEffort`, then + /// If `precision` is [`Exact`] and it cannot be reduced by that amount for + /// some reason, return `Err` and don't reduce it at all. If `precision` is [`BestEffort`], then /// reduce the balance of `who` by the most that is possible, up to `amount`. /// /// In either case, if `Ok` is returned then the inner is the amount by which is was reduced. /// Minimum balance will be respected and thus the returned amount may be up to - /// `Self::minimum_balance() - 1` greater than `amount` in the case that the reduction caused - /// the account to be deleted. + /// [`Inspect::minimum_balance()`] - 1` greater than `amount` in the case that the reduction + /// caused the account to be deleted. fn decrease_balance( who: &AccountId, mut amount: Self::Balance, @@ -180,15 +181,10 @@ pub trait Unbalanced: Inspect { force: Fortitude, ) -> Result { let old_balance = Self::balance(who); - let free = Self::reducible_balance(who, preservation, force); + let reducible = Self::reducible_balance(who, preservation, force); match precision { - BestEffort => { - amount = amount.min(free); - }, - Exact => - if free < amount { - return Err(TokenError::FundsUnavailable.into()) - }, + BestEffort => amount = amount.min(reducible), + Exact => ensure!(reducible >= amount, TokenError::FundsUnavailable), } let new_balance = old_balance.checked_sub(&amount).ok_or(TokenError::FundsUnavailable)?; @@ -203,7 +199,7 @@ pub trait Unbalanced: Inspect { /// If it cannot be increased by that amount for some reason, return `Err` and don't increase /// it at all. If Ok, return the imbalance. /// Minimum balance will be respected and an error will be returned if - /// `amount < Self::minimum_balance()` when the account of `who` is zero. + /// amount < [`Inspect::minimum_balance()`] when the account of `who` is zero. fn increase_balance( who: &AccountId, amount: Self::Balance, @@ -276,8 +272,8 @@ where /// Attempt to decrease the `asset` balance of `who` by `amount`. /// - /// Equivalent to `burn_from`, except with an expectation that within the bounds of some - /// universal issuance, the total assets `suspend`ed and `resume`d will be equivalent. The + /// Equivalent to [`Mutate::burn_from`], except with an expectation that within the bounds of + /// some universal issuance, the total assets `suspend`ed and `resume`d will be equivalent. The /// implementation may be configured such that the total assets suspended may never be less than /// the total assets resumed (which is the invariant for an issuing system), or the reverse /// (which the invariant in a non-issuing system). @@ -296,8 +292,8 @@ where /// Attempt to increase the `asset` balance of `who` by `amount`. /// - /// Equivalent to `mint_into`, except with an expectation that within the bounds of some - /// universal issuance, the total assets `suspend`ed and `resume`d will be equivalent. The + /// Equivalent to [`Mutate::mint_into`], except with an expectation that within the bounds of + /// some universal issuance, the total assets `suspend`ed and `resume`d will be equivalent. The /// implementation may be configured such that the total assets suspended may never be less than /// the total assets resumed (which is the invariant for an issuing system), or the reverse /// (which the invariant in a non-issuing system). @@ -325,7 +321,7 @@ where let _extra = Self::can_withdraw(source, amount).into_result(preservation != Expendable)?; Self::can_deposit(dest, amount, Extant).into_result()?; if source == dest { - return Ok(amount) + return Ok(amount); } Self::decrease_balance(source, amount, BestEffort, preservation, Polite)?; @@ -383,7 +379,7 @@ impl> HandleImbalanceDrop /// A fungible token class where any creation and deletion of tokens is semi-explicit and where the /// total supply is maintained automatically. /// -/// This is auto-implemented when a token class has `Unbalanced` implemented. +/// This is auto-implemented when a token class has [`Unbalanced`] implemented. pub trait Balanced: Inspect + Unbalanced { /// The type for managing what happens when an instance of `Debt` is dropped without being used. type OnDropDebt: HandleImbalanceDrop; @@ -392,7 +388,7 @@ pub trait Balanced: Inspect + Unbalanced { type OnDropCredit: HandleImbalanceDrop; /// Reduce the total issuance by `amount` and return the according imbalance. The imbalance will - /// typically be used to reduce an account by the same amount with e.g. `settle`. + /// typically be used to reduce an account by the same amount with e.g. [`Balanced::settle`]. /// /// This is infallible, but doesn't guarantee that the entire `amount` is burnt, for example /// in the case of underflow. @@ -407,7 +403,7 @@ pub trait Balanced: Inspect + Unbalanced { /// Increase the total issuance by `amount` and return the according imbalance. The imbalance /// will typically be used to increase an account by the same amount with e.g. - /// `resolve_into_existing` or `resolve_creating`. + /// [`Balanced::resolve`]. /// /// This is infallible, but doesn't guarantee that the entire `amount` is issued, for example /// in the case of overflow. @@ -424,18 +420,33 @@ pub trait Balanced: Inspect + Unbalanced { /// /// This is just the same as burning and issuing the same amount and has no effect on the /// total issuance. - fn pair(amount: Self::Balance) -> (Debt, Credit) { - (Self::rescind(amount), Self::issue(amount)) + /// + /// This could fail when we cannot issue and redeem the entire `amount`, for example in the + /// case where the amount would cause overflow or underflow in [`Balanced::issue`] or + /// [`Balanced::rescind`]. + fn pair( + amount: Self::Balance, + ) -> Result<(Debt, Credit), DispatchError> { + let issued = Self::issue(amount); + let rescinded = Self::rescind(amount); + // Need to check amount in case by some edge case both issued and rescinded are below + // `amount` by the exact same value + if issued.peek() != rescinded.peek() || issued.peek() != amount { + // Issued and rescinded will be dropped automatically + Err("Failed to issue and rescind equal amounts".into()) + } else { + Ok((rescinded, issued)) + } } /// Mints `value` into the account of `who`, creating it as needed. /// /// If `precision` is `BestEffort` and `value` in full could not be minted (e.g. due to - /// overflow), then the maximum is minted, up to `value`. If `precision` is `Exact`, then + /// overflow), then the maximum is minted, up to `value`. If `precision` is [`Exact`], then /// exactly `value` must be minted into the account of `who` or the operation will fail with an /// `Err` and nothing will change. /// - /// If the operation is successful, this will return `Ok` with a `Debt` of the total value + /// If the operation is successful, this will return `Ok` with a [`Debt`] of the total value /// added to the account. fn deposit( who: &AccountId, @@ -449,8 +460,8 @@ pub trait Balanced: Inspect + Unbalanced { /// Removes `value` balance from `who` account if possible. /// - /// If `precision` is `BestEffort` and `value` in full could not be removed (e.g. due to - /// underflow), then the maximum is removed, up to `value`. If `precision` is `Exact`, then + /// If `precision` is [`BestEffort`] and `value` in full could not be removed (e.g. due to + /// underflow), then the maximum is removed, up to `value`. If `precision` is [`Exact`], then /// exactly `value` must be removed from the account of `who` or the operation will fail with an /// `Err` and nothing will change. /// @@ -458,7 +469,7 @@ pub trait Balanced: Inspect + Unbalanced { /// If the account needed to be deleted, then slightly more than `value` may be removed from the /// account owning since up to (but not including) minimum balance may also need to be removed. /// - /// If the operation is successful, this will return `Ok` with a `Credit` of the total value + /// If the operation is successful, this will return `Ok` with a [`Credit`] of the total value /// removed from the account. fn withdraw( who: &AccountId, @@ -476,7 +487,7 @@ pub trait Balanced: Inspect + Unbalanced { /// cannot be countered, then nothing is changed and the original `credit` is returned in an /// `Err`. /// - /// Please note: If `credit.peek()` is less than `Self::minimum_balance()`, then `who` must + /// Please note: If `credit.peek()` is less than [`Inspect::minimum_balance()`], then `who` must /// already exist for this to succeed. fn resolve( who: &AccountId, @@ -503,7 +514,7 @@ pub trait Balanced: Inspect + Unbalanced { let amount = debt.peek(); let credit = match Self::withdraw(who, amount, Exact, preservation, Polite) { Err(_) => return Err(debt), - Ok(d) => d, + Ok(c) => c, }; match credit.offset(debt) { diff --git a/substrate/frame/support/src/traits/tokens/fungible/union_of.rs b/substrate/frame/support/src/traits/tokens/fungible/union_of.rs index 86505befc05..33711d7a16c 100644 --- a/substrate/frame/support/src/traits/tokens/fungible/union_of.rs +++ b/substrate/frame/support/src/traits/tokens/fungible/union_of.rs @@ -727,21 +727,22 @@ impl< fn pair( asset: Self::AssetId, amount: Self::Balance, - ) -> (fungibles::Debt, fungibles::Credit) { + ) -> Result<(fungibles::Debt, fungibles::Credit), DispatchError> + { match Criterion::convert(asset.clone()) { Left(()) => { - let (a, b) = >::pair(amount); - ( + let (a, b) = >::pair(amount)?; + Ok(( fungibles::imbalance::from_fungible(a, asset.clone()), fungibles::imbalance::from_fungible(b, asset), - ) + )) }, Right(a) => { - let (a, b) = >::pair(a, amount); - ( + let (a, b) = >::pair(a, amount)?; + Ok(( fungibles::imbalance::from_fungibles(a, asset.clone()), fungibles::imbalance::from_fungibles(b, asset), - ) + )) }, } } diff --git a/substrate/frame/support/src/traits/tokens/fungibles/regular.rs b/substrate/frame/support/src/traits/tokens/fungibles/regular.rs index 41ef4b40c75..8cc97802da6 100644 --- a/substrate/frame/support/src/traits/tokens/fungibles/regular.rs +++ b/substrate/frame/support/src/traits/tokens/fungibles/regular.rs @@ -194,9 +194,10 @@ pub trait Unbalanced: Inspect { force: Fortitude, ) -> Result { let old_balance = Self::balance(asset.clone(), who); - let free = Self::reducible_balance(asset.clone(), who, preservation, force); - if let BestEffort = precision { - amount = amount.min(free); + let reducible = Self::reducible_balance(asset.clone(), who, preservation, force); + match precision { + BestEffort => amount = amount.min(reducible), + Exact => ensure!(reducible >= amount, TokenError::FundsUnavailable), } let new_balance = old_balance.checked_sub(&amount).ok_or(TokenError::FundsUnavailable)?; if let Some(dust) = Self::write_balance(asset.clone(), who, new_balance)? { @@ -478,11 +479,24 @@ pub trait Balanced: Inspect + Unbalanced { /// /// This is just the same as burning and issuing the same amount and has no effect on the /// total issuance. + /// + /// This is infallible, but doesn't guarantee that the entire `amount` is used to create the + /// pair, for example in the case where the amounts would cause overflow or underflow in + /// [`Balanced::issue`] or [`Balanced::rescind`]. fn pair( asset: Self::AssetId, amount: Self::Balance, - ) -> (Debt, Credit) { - (Self::rescind(asset.clone(), amount), Self::issue(asset, amount)) + ) -> Result<(Debt, Credit), DispatchError> { + let issued = Self::issue(asset.clone(), amount); + let rescinded = Self::rescind(asset, amount); + // Need to check amount in case by some edge case both issued and rescinded are below + // `amount` by the exact same value + if issued.peek() != rescinded.peek() || issued.peek() != amount { + // Issued and rescinded will be dropped automatically + Err("Failed to issue and rescind equal amounts".into()) + } else { + Ok((rescinded, issued)) + } } /// Mints `value` into the account of `who`, creating it as needed. diff --git a/substrate/frame/support/src/traits/tokens/fungibles/union_of.rs b/substrate/frame/support/src/traits/tokens/fungibles/union_of.rs index 3619db3a37b..9d2a783df2a 100644 --- a/substrate/frame/support/src/traits/tokens/fungibles/union_of.rs +++ b/substrate/frame/support/src/traits/tokens/fungibles/union_of.rs @@ -706,15 +706,22 @@ impl< fn pair( asset: Self::AssetId, amount: Self::Balance, - ) -> (fungibles::Debt, fungibles::Credit) { + ) -> Result<(fungibles::Debt, fungibles::Credit), DispatchError> + { match Criterion::convert(asset.clone()) { Left(a) => { - let (a, b) = >::pair(a, amount); - (imbalance::from_fungibles(a, asset.clone()), imbalance::from_fungibles(b, asset)) + let (a, b) = >::pair(a, amount)?; + Ok(( + imbalance::from_fungibles(a, asset.clone()), + imbalance::from_fungibles(b, asset), + )) }, Right(a) => { - let (a, b) = >::pair(a, amount); - (imbalance::from_fungibles(a, asset.clone()), imbalance::from_fungibles(b, asset)) + let (a, b) = >::pair(a, amount)?; + Ok(( + imbalance::from_fungibles(a, asset.clone()), + imbalance::from_fungibles(b, asset), + )) }, } } -- GitLab From 53bcbb15f1de62661671ad8099b9dc3f8b623efd Mon Sep 17 00:00:00 2001 From: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> Date: Mon, 15 Jan 2024 16:03:32 +0200 Subject: [PATCH 166/191] archive: Implement archive_unstable_storage (#1846) This PR implements the `archive_unstable_storage` method that offers support for: - fetching values - fetching hashes - iterating over keys and values - iterating over keys and hashes - fetching merkle values from the trie-db A common component dedicated to RPC-V2 storage queries is created to bridge the gap between `chainHead/storage` and `archive/storage`. Query pagination is supported by `paginationStartKey`, similar to the old APIs. Similarly to the `chainHead/storage`, the `archive/storage` method accepts a maximum number of queried items. The design builds upon: https://github.com/paritytech/json-rpc-interface-spec/pull/94. Closes https://github.com/paritytech/polkadot-sdk/issues/1512. cc @paritytech/subxt-team --------- Signed-off-by: Alexandru Vasile Co-authored-by: Niklas Adolfsson --- .../client/rpc-spec-v2/src/archive/api.rs | 18 +- .../client/rpc-spec-v2/src/archive/archive.rs | 70 ++- .../src/archive/archive_storage.rs | 125 ++++ .../client/rpc-spec-v2/src/archive/mod.rs | 2 + .../client/rpc-spec-v2/src/archive/tests.rs | 547 +++++++++++++++++- .../client/rpc-spec-v2/src/chain_head/api.rs | 5 +- .../rpc-spec-v2/src/chain_head/chain_head.rs | 6 +- .../src/chain_head/chain_head_storage.rs | 210 +------ .../rpc-spec-v2/src/chain_head/event.rs | 146 +---- .../client/rpc-spec-v2/src/chain_head/mod.rs | 7 - .../rpc-spec-v2/src/chain_head/tests.rs | 7 +- .../client/rpc-spec-v2/src/common/events.rs | 273 +++++++++ .../client/rpc-spec-v2/src/common/mod.rs | 17 + .../client/rpc-spec-v2/src/common/storage.rs | 198 +++++++ substrate/client/rpc-spec-v2/src/lib.rs | 10 +- 15 files changed, 1278 insertions(+), 363 deletions(-) create mode 100644 substrate/client/rpc-spec-v2/src/archive/archive_storage.rs create mode 100644 substrate/client/rpc-spec-v2/src/common/events.rs create mode 100644 substrate/client/rpc-spec-v2/src/common/mod.rs create mode 100644 substrate/client/rpc-spec-v2/src/common/storage.rs diff --git a/substrate/client/rpc-spec-v2/src/archive/api.rs b/substrate/client/rpc-spec-v2/src/archive/api.rs index 0583111cb48..b1973830400 100644 --- a/substrate/client/rpc-spec-v2/src/archive/api.rs +++ b/substrate/client/rpc-spec-v2/src/archive/api.rs @@ -18,7 +18,10 @@ //! API trait of the archive methods. -use crate::MethodResult; +use crate::{ + common::events::{ArchiveStorageResult, PaginatedStorageQuery}, + MethodResult, +}; use jsonrpsee::{core::RpcResult, proc_macros::rpc}; #[rpc(client, server)] @@ -88,4 +91,17 @@ pub trait ArchiveApi { function: String, call_parameters: String, ) -> RpcResult; + + /// Returns storage entries at a specific block's state. + /// + /// # Unstable + /// + /// This method is unstable and subject to change in the future. + #[method(name = "archive_unstable_storage", blocking)] + fn archive_unstable_storage( + &self, + hash: Hash, + items: Vec>, + child_trie: Option, + ) -> RpcResult; } diff --git a/substrate/client/rpc-spec-v2/src/archive/archive.rs b/substrate/client/rpc-spec-v2/src/archive/archive.rs index 269962cfd74..c01afb5d779 100644 --- a/substrate/client/rpc-spec-v2/src/archive/archive.rs +++ b/substrate/client/rpc-spec-v2/src/archive/archive.rs @@ -20,14 +20,15 @@ use crate::{ archive::{error::Error as ArchiveError, ArchiveApiServer}, - chain_head::hex_string, - MethodResult, + common::events::{ArchiveStorageResult, PaginatedStorageQuery}, + hex_string, MethodResult, }; use codec::Encode; use jsonrpsee::core::{async_trait, RpcResult}; use sc_client_api::{ - Backend, BlockBackend, BlockchainEvents, CallExecutor, ExecutorProvider, StorageProvider, + Backend, BlockBackend, BlockchainEvents, CallExecutor, ChildInfo, ExecutorProvider, StorageKey, + StorageProvider, }; use sp_api::{CallApiAt, CallContext}; use sp_blockchain::{ @@ -40,6 +41,8 @@ use sp_runtime::{ }; use std::{collections::HashSet, marker::PhantomData, sync::Arc}; +use super::archive_storage::ArchiveStorage; + /// An API for archive RPC calls. pub struct Archive, Block: BlockT, Client> { /// Substrate client. @@ -48,8 +51,12 @@ pub struct Archive, Block: BlockT, Client> { backend: Arc, /// The hexadecimal encoded hash of the genesis block. genesis_hash: String, + /// The maximum number of reported items by the `archive_storage` at a time. + storage_max_reported_items: usize, + /// The maximum number of queried items allowed for the `archive_storage` at a time. + storage_max_queried_items: usize, /// Phantom member to pin the block type. - _phantom: PhantomData<(Block, BE)>, + _phantom: PhantomData, } impl, Block: BlockT, Client> Archive { @@ -58,9 +65,18 @@ impl, Block: BlockT, Client> Archive { client: Arc, backend: Arc, genesis_hash: GenesisHash, + storage_max_reported_items: usize, + storage_max_queried_items: usize, ) -> Self { let genesis_hash = hex_string(&genesis_hash.as_ref()); - Self { client, backend, genesis_hash, _phantom: PhantomData } + Self { + client, + backend, + genesis_hash, + storage_max_reported_items, + storage_max_queried_items, + _phantom: PhantomData, + } } } @@ -185,4 +201,48 @@ where Err(error) => MethodResult::err(error.to_string()), }) } + + fn archive_unstable_storage( + &self, + hash: Block::Hash, + items: Vec>, + child_trie: Option, + ) -> RpcResult { + let items = items + .into_iter() + .map(|query| { + let key = StorageKey(parse_hex_param(query.key)?); + let pagination_start_key = query + .pagination_start_key + .map(|key| parse_hex_param(key).map(|key| StorageKey(key))) + .transpose()?; + + // Paginated start key is only supported + if pagination_start_key.is_some() && !query.query_type.is_descendant_query() { + return Err(ArchiveError::InvalidParam( + "Pagination start key is only supported for descendants queries" + .to_string(), + )) + } + + Ok(PaginatedStorageQuery { + key, + query_type: query.query_type, + pagination_start_key, + }) + }) + .collect::, ArchiveError>>()?; + + let child_trie = child_trie + .map(|child_trie| parse_hex_param(child_trie)) + .transpose()? + .map(ChildInfo::new_default_from_vec); + + let storage_client = ArchiveStorage::new( + self.client.clone(), + self.storage_max_reported_items, + self.storage_max_queried_items, + ); + Ok(storage_client.handle_query(hash, items, child_trie)) + } } diff --git a/substrate/client/rpc-spec-v2/src/archive/archive_storage.rs b/substrate/client/rpc-spec-v2/src/archive/archive_storage.rs new file mode 100644 index 00000000000..09415af1ca1 --- /dev/null +++ b/substrate/client/rpc-spec-v2/src/archive/archive_storage.rs @@ -0,0 +1,125 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//! Implementation of the `archive_storage` method. + +use std::sync::Arc; + +use sc_client_api::{Backend, ChildInfo, StorageKey, StorageProvider}; +use sp_runtime::traits::Block as BlockT; + +use crate::common::{ + events::{ArchiveStorageResult, PaginatedStorageQuery, StorageQueryType}, + storage::{IterQueryType, QueryIter, Storage}, +}; + +/// Generates the events of the `chainHead_storage` method. +pub struct ArchiveStorage { + /// Storage client. + client: Storage, + /// The maximum number of reported items by the `archive_storage` at a time. + storage_max_reported_items: usize, + /// The maximum number of queried items allowed for the `archive_storage` at a time. + storage_max_queried_items: usize, +} + +impl ArchiveStorage { + /// Constructs a new [`ArchiveStorage`]. + pub fn new( + client: Arc, + storage_max_reported_items: usize, + storage_max_queried_items: usize, + ) -> Self { + Self { client: Storage::new(client), storage_max_reported_items, storage_max_queried_items } + } +} + +impl ArchiveStorage +where + Block: BlockT + 'static, + BE: Backend + 'static, + Client: StorageProvider + 'static, +{ + /// Generate the response of the `archive_storage` method. + pub fn handle_query( + &self, + hash: Block::Hash, + mut items: Vec>, + child_key: Option, + ) -> ArchiveStorageResult { + let discarded_items = items.len().saturating_sub(self.storage_max_queried_items); + items.truncate(self.storage_max_queried_items); + + let mut storage_results = Vec::with_capacity(items.len()); + for item in items { + match item.query_type { + StorageQueryType::Value => { + match self.client.query_value(hash, &item.key, child_key.as_ref()) { + Ok(Some(value)) => storage_results.push(value), + Ok(None) => continue, + Err(error) => return ArchiveStorageResult::err(error), + } + }, + StorageQueryType::Hash => + match self.client.query_hash(hash, &item.key, child_key.as_ref()) { + Ok(Some(value)) => storage_results.push(value), + Ok(None) => continue, + Err(error) => return ArchiveStorageResult::err(error), + }, + StorageQueryType::ClosestDescendantMerkleValue => + match self.client.query_merkle_value(hash, &item.key, child_key.as_ref()) { + Ok(Some(value)) => storage_results.push(value), + Ok(None) => continue, + Err(error) => return ArchiveStorageResult::err(error), + }, + StorageQueryType::DescendantsValues => { + match self.client.query_iter_pagination( + QueryIter { + query_key: item.key, + ty: IterQueryType::Value, + pagination_start_key: item.pagination_start_key, + }, + hash, + child_key.as_ref(), + self.storage_max_reported_items, + ) { + Ok((results, _)) => storage_results.extend(results), + Err(error) => return ArchiveStorageResult::err(error), + } + }, + StorageQueryType::DescendantsHashes => { + match self.client.query_iter_pagination( + QueryIter { + query_key: item.key, + ty: IterQueryType::Hash, + pagination_start_key: item.pagination_start_key, + }, + hash, + child_key.as_ref(), + self.storage_max_reported_items, + ) { + Ok((results, _)) => storage_results.extend(results), + Err(error) => return ArchiveStorageResult::err(error), + } + }, + }; + } + + ArchiveStorageResult::ok(storage_results, discarded_items) + } +} diff --git a/substrate/client/rpc-spec-v2/src/archive/mod.rs b/substrate/client/rpc-spec-v2/src/archive/mod.rs index eb7d71d702f..e1f45e19a62 100644 --- a/substrate/client/rpc-spec-v2/src/archive/mod.rs +++ b/substrate/client/rpc-spec-v2/src/archive/mod.rs @@ -25,6 +25,8 @@ #[cfg(test)] mod tests; +mod archive_storage; + pub mod api; pub mod archive; pub mod error; diff --git a/substrate/client/rpc-spec-v2/src/archive/tests.rs b/substrate/client/rpc-spec-v2/src/archive/tests.rs index 6b288c2c954..45da8e588e6 100644 --- a/substrate/client/rpc-spec-v2/src/archive/tests.rs +++ b/substrate/client/rpc-spec-v2/src/archive/tests.rs @@ -16,7 +16,13 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use crate::{chain_head::hex_string, MethodResult}; +use crate::{ + common::events::{ + ArchiveStorageMethodOk, ArchiveStorageResult, PaginatedStorageQuery, StorageQueryType, + StorageResultType, + }, + hex_string, MethodResult, +}; use super::{archive::Archive, *}; @@ -24,17 +30,20 @@ use assert_matches::assert_matches; use codec::{Decode, Encode}; use jsonrpsee::{ core::error::Error, + rpc_params, types::{error::CallError, EmptyServerParams as EmptyParams}, RpcModule, }; use sc_block_builder::BlockBuilderBuilder; +use sc_client_api::ChildInfo; use sp_blockchain::HeaderBackend; use sp_consensus::BlockOrigin; +use sp_core::{Blake2Hasher, Hasher}; use sp_runtime::{ traits::{Block as BlockT, Header as HeaderT}, SaturatedConversion, }; -use std::sync::Arc; +use std::{collections::HashMap, sync::Arc}; use substrate_test_runtime::Transfer; use substrate_test_runtime_client::{ prelude::*, runtime, Backend, BlockBuilderExt, Client, ClientBlockImportExt, @@ -42,23 +51,39 @@ use substrate_test_runtime_client::{ const CHAIN_GENESIS: [u8; 32] = [0; 32]; const INVALID_HASH: [u8; 32] = [1; 32]; +const MAX_PAGINATION_LIMIT: usize = 5; +const MAX_QUERIED_LIMIT: usize = 5; +const KEY: &[u8] = b":mock"; +const VALUE: &[u8] = b"hello world"; +const CHILD_STORAGE_KEY: &[u8] = b"child"; +const CHILD_VALUE: &[u8] = b"child value"; type Header = substrate_test_runtime_client::runtime::Header; type Block = substrate_test_runtime_client::runtime::Block; -fn setup_api() -> (Arc>, RpcModule>>) { - let builder = TestClientBuilder::new(); +fn setup_api( + max_returned_items: usize, + max_queried_items: usize, +) -> (Arc>, RpcModule>>) { + let child_info = ChildInfo::new_default(CHILD_STORAGE_KEY); + let builder = TestClientBuilder::new().add_extra_child_storage( + &child_info, + KEY.to_vec(), + CHILD_VALUE.to_vec(), + ); let backend = builder.backend(); let client = Arc::new(builder.build()); - let api = Archive::new(client.clone(), backend, CHAIN_GENESIS).into_rpc(); + let api = + Archive::new(client.clone(), backend, CHAIN_GENESIS, max_returned_items, max_queried_items) + .into_rpc(); (client, api) } #[tokio::test] async fn archive_genesis() { - let (_client, api) = setup_api(); + let (_client, api) = setup_api(MAX_PAGINATION_LIMIT, MAX_QUERIED_LIMIT); let genesis: String = api.call("archive_unstable_genesisHash", EmptyParams::new()).await.unwrap(); @@ -67,7 +92,7 @@ async fn archive_genesis() { #[tokio::test] async fn archive_body() { - let (mut client, api) = setup_api(); + let (mut client, api) = setup_api(MAX_PAGINATION_LIMIT, MAX_QUERIED_LIMIT); // Invalid block hash. let invalid_hash = hex_string(&INVALID_HASH); @@ -101,7 +126,7 @@ async fn archive_body() { #[tokio::test] async fn archive_header() { - let (mut client, api) = setup_api(); + let (mut client, api) = setup_api(MAX_PAGINATION_LIMIT, MAX_QUERIED_LIMIT); // Invalid block hash. let invalid_hash = hex_string(&INVALID_HASH); @@ -135,7 +160,7 @@ async fn archive_header() { #[tokio::test] async fn archive_finalized_height() { - let (client, api) = setup_api(); + let (client, api) = setup_api(MAX_PAGINATION_LIMIT, MAX_QUERIED_LIMIT); let client_height: u32 = client.info().finalized_number.saturated_into(); @@ -147,7 +172,7 @@ async fn archive_finalized_height() { #[tokio::test] async fn archive_hash_by_height() { - let (mut client, api) = setup_api(); + let (mut client, api) = setup_api(MAX_PAGINATION_LIMIT, MAX_QUERIED_LIMIT); // Genesis height. let hashes: Vec = api.call("archive_unstable_hashByHeight", [0]).await.unwrap(); @@ -253,7 +278,7 @@ async fn archive_hash_by_height() { #[tokio::test] async fn archive_call() { - let (mut client, api) = setup_api(); + let (mut client, api) = setup_api(MAX_PAGINATION_LIMIT, MAX_QUERIED_LIMIT); let invalid_hash = hex_string(&INVALID_HASH); // Invalid parameter (non-hex). @@ -309,3 +334,503 @@ async fn archive_call() { let expected = MethodResult::ok("0x0000000000000000"); assert_eq!(result, expected); } + +#[tokio::test] +async fn archive_storage_hashes_values() { + let (mut client, api) = setup_api(MAX_PAGINATION_LIMIT, MAX_QUERIED_LIMIT); + + let block = BlockBuilderBuilder::new(&*client) + .on_parent_block(client.chain_info().genesis_hash) + .with_parent_block_number(0) + .build() + .unwrap() + .build() + .unwrap() + .block; + client.import(BlockOrigin::Own, block.clone()).await.unwrap(); + let block_hash = format!("{:?}", block.header.hash()); + let key = hex_string(&KEY); + + let items: Vec> = vec![ + PaginatedStorageQuery { + key: key.clone(), + query_type: StorageQueryType::DescendantsHashes, + pagination_start_key: None, + }, + PaginatedStorageQuery { + key: key.clone(), + query_type: StorageQueryType::DescendantsValues, + pagination_start_key: None, + }, + PaginatedStorageQuery { + key: key.clone(), + query_type: StorageQueryType::Hash, + pagination_start_key: None, + }, + PaginatedStorageQuery { + key: key.clone(), + query_type: StorageQueryType::Value, + pagination_start_key: None, + }, + ]; + + let result: ArchiveStorageResult = api + .call("archive_unstable_storage", rpc_params![&block_hash, items.clone()]) + .await + .unwrap(); + + match result { + ArchiveStorageResult::Ok(ArchiveStorageMethodOk { result, discarded_items }) => { + // Key has not been imported yet. + assert_eq!(result.len(), 0); + assert_eq!(discarded_items, 0); + }, + _ => panic!("Unexpected result"), + }; + + // Import a block with the given key value pair. + let mut builder = BlockBuilderBuilder::new(&*client) + .on_parent_block(block.hash()) + .with_parent_block_number(1) + .build() + .unwrap(); + builder.push_storage_change(KEY.to_vec(), Some(VALUE.to_vec())).unwrap(); + let block = builder.build().unwrap().block; + client.import(BlockOrigin::Own, block.clone()).await.unwrap(); + + let block_hash = format!("{:?}", block.header.hash()); + let expected_hash = format!("{:?}", Blake2Hasher::hash(&VALUE)); + let expected_value = hex_string(&VALUE); + + let result: ArchiveStorageResult = api + .call("archive_unstable_storage", rpc_params![&block_hash, items]) + .await + .unwrap(); + + match result { + ArchiveStorageResult::Ok(ArchiveStorageMethodOk { result, discarded_items }) => { + assert_eq!(result.len(), 4); + assert_eq!(discarded_items, 0); + + assert_eq!(result[0].key, key); + assert_eq!(result[0].result, StorageResultType::Hash(expected_hash.clone())); + assert_eq!(result[1].key, key); + assert_eq!(result[1].result, StorageResultType::Value(expected_value.clone())); + assert_eq!(result[2].key, key); + assert_eq!(result[2].result, StorageResultType::Hash(expected_hash)); + assert_eq!(result[3].key, key); + assert_eq!(result[3].result, StorageResultType::Value(expected_value)); + }, + _ => panic!("Unexpected result"), + }; +} + +#[tokio::test] +async fn archive_storage_closest_merkle_value() { + let (mut client, api) = setup_api(MAX_PAGINATION_LIMIT, MAX_QUERIED_LIMIT); + + /// The core of this test. + /// + /// Checks keys that are exact match, keys with descedant and keys that should not return + /// values. + /// + /// Returns (key, merkle value) pairs. + async fn expect_merkle_request( + api: &RpcModule>>, + block_hash: String, + ) -> HashMap { + let result: ArchiveStorageResult = api + .call( + "archive_unstable_storage", + rpc_params![ + &block_hash, + vec![ + PaginatedStorageQuery { + key: hex_string(b":AAAA"), + query_type: StorageQueryType::ClosestDescendantMerkleValue, + pagination_start_key: None, + }, + PaginatedStorageQuery { + key: hex_string(b":AAAB"), + query_type: StorageQueryType::ClosestDescendantMerkleValue, + pagination_start_key: None, + }, + // Key with descedent. + PaginatedStorageQuery { + key: hex_string(b":A"), + query_type: StorageQueryType::ClosestDescendantMerkleValue, + pagination_start_key: None, + }, + PaginatedStorageQuery { + key: hex_string(b":AA"), + query_type: StorageQueryType::ClosestDescendantMerkleValue, + pagination_start_key: None, + }, + // Keys below this comment do not produce a result. + // Key that exceed the keyspace of the trie. + PaginatedStorageQuery { + key: hex_string(b":AAAAX"), + query_type: StorageQueryType::ClosestDescendantMerkleValue, + pagination_start_key: None, + }, + PaginatedStorageQuery { + key: hex_string(b":AAABX"), + query_type: StorageQueryType::ClosestDescendantMerkleValue, + pagination_start_key: None, + }, + // Key that are not part of the trie. + PaginatedStorageQuery { + key: hex_string(b":AAX"), + query_type: StorageQueryType::ClosestDescendantMerkleValue, + pagination_start_key: None, + }, + PaginatedStorageQuery { + key: hex_string(b":AAAX"), + query_type: StorageQueryType::ClosestDescendantMerkleValue, + pagination_start_key: None, + }, + ] + ], + ) + .await + .unwrap(); + + let merkle_values: HashMap<_, _> = match result { + ArchiveStorageResult::Ok(ArchiveStorageMethodOk { result, .. }) => result + .into_iter() + .map(|res| { + let value = match res.result { + StorageResultType::ClosestDescendantMerkleValue(value) => value, + _ => panic!("Unexpected StorageResultType"), + }; + (res.key, value) + }) + .collect(), + _ => panic!("Unexpected result"), + }; + + // Response for AAAA, AAAB, A and AA. + assert_eq!(merkle_values.len(), 4); + + // While checking for expected merkle values to align, + // the following will check that the returned keys are + // expected. + + // Values for AAAA and AAAB are different. + assert_ne!( + merkle_values.get(&hex_string(b":AAAA")).unwrap(), + merkle_values.get(&hex_string(b":AAAB")).unwrap() + ); + + // Values for A and AA should be on the same branch node. + assert_eq!( + merkle_values.get(&hex_string(b":A")).unwrap(), + merkle_values.get(&hex_string(b":AA")).unwrap() + ); + // The branch node value must be different than the leaf of either + // AAAA and AAAB. + assert_ne!( + merkle_values.get(&hex_string(b":A")).unwrap(), + merkle_values.get(&hex_string(b":AAAA")).unwrap() + ); + assert_ne!( + merkle_values.get(&hex_string(b":A")).unwrap(), + merkle_values.get(&hex_string(b":AAAB")).unwrap() + ); + + merkle_values + } + + // Import a new block with storage changes. + let mut builder = BlockBuilderBuilder::new(&*client) + .on_parent_block(client.chain_info().genesis_hash) + .with_parent_block_number(0) + .build() + .unwrap(); + builder.push_storage_change(b":AAAA".to_vec(), Some(vec![1; 64])).unwrap(); + builder.push_storage_change(b":AAAB".to_vec(), Some(vec![2; 64])).unwrap(); + let block = builder.build().unwrap().block; + let block_hash = format!("{:?}", block.header.hash()); + client.import(BlockOrigin::Own, block.clone()).await.unwrap(); + + let merkle_values_lhs = expect_merkle_request(&api, block_hash).await; + + // Import a new block with and change AAAB value. + let mut builder = BlockBuilderBuilder::new(&*client) + .on_parent_block(block.hash()) + .with_parent_block_number(1) + .build() + .unwrap(); + builder.push_storage_change(b":AAAA".to_vec(), Some(vec![1; 64])).unwrap(); + builder.push_storage_change(b":AAAB".to_vec(), Some(vec![3; 64])).unwrap(); + let block = builder.build().unwrap().block; + let block_hash = format!("{:?}", block.header.hash()); + client.import(BlockOrigin::Own, block.clone()).await.unwrap(); + + let merkle_values_rhs = expect_merkle_request(&api, block_hash).await; + + // Change propagated to the root. + assert_ne!( + merkle_values_lhs.get(&hex_string(b":A")).unwrap(), + merkle_values_rhs.get(&hex_string(b":A")).unwrap() + ); + assert_ne!( + merkle_values_lhs.get(&hex_string(b":AAAB")).unwrap(), + merkle_values_rhs.get(&hex_string(b":AAAB")).unwrap() + ); + // However the AAAA branch leaf remains unchanged. + assert_eq!( + merkle_values_lhs.get(&hex_string(b":AAAA")).unwrap(), + merkle_values_rhs.get(&hex_string(b":AAAA")).unwrap() + ); +} + +#[tokio::test] +async fn archive_storage_paginate_iterations() { + // 1 iteration allowed before pagination kicks in. + let (mut client, api) = setup_api(1, MAX_QUERIED_LIMIT); + + // Import a new block with storage changes. + let mut builder = BlockBuilderBuilder::new(&*client) + .on_parent_block(client.chain_info().genesis_hash) + .with_parent_block_number(0) + .build() + .unwrap(); + builder.push_storage_change(b":m".to_vec(), Some(b"a".to_vec())).unwrap(); + builder.push_storage_change(b":mo".to_vec(), Some(b"ab".to_vec())).unwrap(); + builder.push_storage_change(b":moc".to_vec(), Some(b"abc".to_vec())).unwrap(); + builder.push_storage_change(b":moD".to_vec(), Some(b"abcmoD".to_vec())).unwrap(); + builder.push_storage_change(b":mock".to_vec(), Some(b"abcd".to_vec())).unwrap(); + let block = builder.build().unwrap().block; + let block_hash = format!("{:?}", block.header.hash()); + client.import(BlockOrigin::Own, block.clone()).await.unwrap(); + + // Calling with an invalid hash. + let invalid_hash = hex_string(&INVALID_HASH); + let result: ArchiveStorageResult = api + .call( + "archive_unstable_storage", + rpc_params![ + &invalid_hash, + vec![PaginatedStorageQuery { + key: hex_string(b":m"), + query_type: StorageQueryType::DescendantsValues, + pagination_start_key: None, + }] + ], + ) + .await + .unwrap(); + match result { + ArchiveStorageResult::Err(_) => (), + _ => panic!("Unexpected result"), + }; + + // Valid call with storage at the key. + let result: ArchiveStorageResult = api + .call( + "archive_unstable_storage", + rpc_params![ + &block_hash, + vec![PaginatedStorageQuery { + key: hex_string(b":m"), + query_type: StorageQueryType::DescendantsValues, + pagination_start_key: None, + }] + ], + ) + .await + .unwrap(); + match result { + ArchiveStorageResult::Ok(ArchiveStorageMethodOk { result, discarded_items }) => { + assert_eq!(result.len(), 1); + assert_eq!(discarded_items, 0); + + assert_eq!(result[0].key, hex_string(b":m")); + assert_eq!(result[0].result, StorageResultType::Value(hex_string(b"a"))); + }, + _ => panic!("Unexpected result"), + }; + + // Continue with pagination. + let result: ArchiveStorageResult = api + .call( + "archive_unstable_storage", + rpc_params![ + &block_hash, + vec![PaginatedStorageQuery { + key: hex_string(b":m"), + query_type: StorageQueryType::DescendantsValues, + pagination_start_key: Some(hex_string(b":m")), + }] + ], + ) + .await + .unwrap(); + match result { + ArchiveStorageResult::Ok(ArchiveStorageMethodOk { result, discarded_items }) => { + assert_eq!(result.len(), 1); + assert_eq!(discarded_items, 0); + + assert_eq!(result[0].key, hex_string(b":mo")); + assert_eq!(result[0].result, StorageResultType::Value(hex_string(b"ab"))); + }, + _ => panic!("Unexpected result"), + }; + + // Continue with pagination. + let result: ArchiveStorageResult = api + .call( + "archive_unstable_storage", + rpc_params![ + &block_hash, + vec![PaginatedStorageQuery { + key: hex_string(b":m"), + query_type: StorageQueryType::DescendantsValues, + pagination_start_key: Some(hex_string(b":mo")), + }] + ], + ) + .await + .unwrap(); + match result { + ArchiveStorageResult::Ok(ArchiveStorageMethodOk { result, discarded_items }) => { + assert_eq!(result.len(), 1); + assert_eq!(discarded_items, 0); + + assert_eq!(result[0].key, hex_string(b":moD")); + assert_eq!(result[0].result, StorageResultType::Value(hex_string(b"abcmoD"))); + }, + _ => panic!("Unexpected result"), + }; + + // Continue with pagination. + let result: ArchiveStorageResult = api + .call( + "archive_unstable_storage", + rpc_params![ + &block_hash, + vec![PaginatedStorageQuery { + key: hex_string(b":m"), + query_type: StorageQueryType::DescendantsValues, + pagination_start_key: Some(hex_string(b":moD")), + }] + ], + ) + .await + .unwrap(); + match result { + ArchiveStorageResult::Ok(ArchiveStorageMethodOk { result, discarded_items }) => { + assert_eq!(result.len(), 1); + assert_eq!(discarded_items, 0); + + assert_eq!(result[0].key, hex_string(b":moc")); + assert_eq!(result[0].result, StorageResultType::Value(hex_string(b"abc"))); + }, + _ => panic!("Unexpected result"), + }; + + // Continue with pagination. + let result: ArchiveStorageResult = api + .call( + "archive_unstable_storage", + rpc_params![ + &block_hash, + vec![PaginatedStorageQuery { + key: hex_string(b":m"), + query_type: StorageQueryType::DescendantsValues, + pagination_start_key: Some(hex_string(b":moc")), + }] + ], + ) + .await + .unwrap(); + match result { + ArchiveStorageResult::Ok(ArchiveStorageMethodOk { result, discarded_items }) => { + assert_eq!(result.len(), 1); + assert_eq!(discarded_items, 0); + + assert_eq!(result[0].key, hex_string(b":mock")); + assert_eq!(result[0].result, StorageResultType::Value(hex_string(b"abcd"))); + }, + _ => panic!("Unexpected result"), + }; + + // Continue with pagination until no keys are returned. + let result: ArchiveStorageResult = api + .call( + "archive_unstable_storage", + rpc_params![ + &block_hash, + vec![PaginatedStorageQuery { + key: hex_string(b":m"), + query_type: StorageQueryType::DescendantsValues, + pagination_start_key: Some(hex_string(b":mock")), + }] + ], + ) + .await + .unwrap(); + match result { + ArchiveStorageResult::Ok(ArchiveStorageMethodOk { result, discarded_items }) => { + assert_eq!(result.len(), 0); + assert_eq!(discarded_items, 0); + }, + _ => panic!("Unexpected result"), + }; +} + +#[tokio::test] +async fn archive_storage_discarded_items() { + // One query at a time + let (mut client, api) = setup_api(MAX_PAGINATION_LIMIT, 1); + + // Import a new block with storage changes. + let mut builder = BlockBuilderBuilder::new(&*client) + .on_parent_block(client.chain_info().genesis_hash) + .with_parent_block_number(0) + .build() + .unwrap(); + builder.push_storage_change(b":m".to_vec(), Some(b"a".to_vec())).unwrap(); + let block = builder.build().unwrap().block; + let block_hash = format!("{:?}", block.header.hash()); + client.import(BlockOrigin::Own, block.clone()).await.unwrap(); + + // Valid call with storage at the key. + let result: ArchiveStorageResult = api + .call( + "archive_unstable_storage", + rpc_params![ + &block_hash, + vec![ + PaginatedStorageQuery { + key: hex_string(b":m"), + query_type: StorageQueryType::Value, + pagination_start_key: None, + }, + PaginatedStorageQuery { + key: hex_string(b":m"), + query_type: StorageQueryType::Hash, + pagination_start_key: None, + }, + PaginatedStorageQuery { + key: hex_string(b":m"), + query_type: StorageQueryType::Hash, + pagination_start_key: None, + } + ] + ], + ) + .await + .unwrap(); + match result { + ArchiveStorageResult::Ok(ArchiveStorageMethodOk { result, discarded_items }) => { + assert_eq!(result.len(), 1); + assert_eq!(discarded_items, 2); + + assert_eq!(result[0].key, hex_string(b":m")); + assert_eq!(result[0].result, StorageResultType::Value(hex_string(b"a"))); + }, + _ => panic!("Unexpected result"), + }; +} diff --git a/substrate/client/rpc-spec-v2/src/chain_head/api.rs b/substrate/client/rpc-spec-v2/src/chain_head/api.rs index 9ae80137955..3d6091b91bd 100644 --- a/substrate/client/rpc-spec-v2/src/chain_head/api.rs +++ b/substrate/client/rpc-spec-v2/src/chain_head/api.rs @@ -19,7 +19,10 @@ #![allow(non_snake_case)] //! API trait of the chain head. -use crate::chain_head::event::{FollowEvent, MethodResponse, StorageQuery}; +use crate::{ + chain_head::event::{FollowEvent, MethodResponse}, + common::events::StorageQuery, +}; use jsonrpsee::{core::RpcResult, proc_macros::rpc}; use sp_rpc::list::ListOrValue; diff --git a/substrate/client/rpc-spec-v2/src/chain_head/chain_head.rs b/substrate/client/rpc-spec-v2/src/chain_head/chain_head.rs index 8e04ac7b177..6e4d6ade965 100644 --- a/substrate/client/rpc-spec-v2/src/chain_head/chain_head.rs +++ b/substrate/client/rpc-spec-v2/src/chain_head/chain_head.rs @@ -27,11 +27,11 @@ use crate::{ api::ChainHeadApiServer, chain_head_follow::ChainHeadFollower, error::Error as ChainHeadRpcError, - event::{FollowEvent, MethodResponse, OperationError, StorageQuery}, - hex_string, + event::{FollowEvent, MethodResponse, OperationError}, subscription::{SubscriptionManagement, SubscriptionManagementError}, }, - SubscriptionTaskExecutor, + common::events::StorageQuery, + hex_string, SubscriptionTaskExecutor, }; use codec::Encode; use futures::future::FutureExt; diff --git a/substrate/client/rpc-spec-v2/src/chain_head/chain_head_storage.rs b/substrate/client/rpc-spec-v2/src/chain_head/chain_head_storage.rs index c23489a050e..ee39ec253a3 100644 --- a/substrate/client/rpc-spec-v2/src/chain_head/chain_head_storage.rs +++ b/substrate/client/rpc-spec-v2/src/chain_head/chain_head_storage.rs @@ -22,33 +22,24 @@ use std::{collections::VecDeque, marker::PhantomData, sync::Arc}; use sc_client_api::{Backend, ChildInfo, StorageKey, StorageProvider}; use sc_utils::mpsc::TracingUnboundedSender; -use sp_core::storage::well_known_keys; use sp_runtime::traits::Block as BlockT; -use crate::chain_head::event::OperationStorageItems; - -use super::{ - event::{ - OperationError, OperationId, StorageQuery, StorageQueryType, StorageResult, - StorageResultType, +use crate::{ + chain_head::{ + event::{OperationError, OperationId, OperationStorageItems}, + subscription::BlockGuard, + FollowEvent, + }, + common::{ + events::{StorageQuery, StorageQueryType}, + storage::{IterQueryType, QueryIter, QueryIterResult, Storage}, }, - hex_string, - subscription::BlockGuard, - FollowEvent, }; -/// The query type of an interation. -enum IterQueryType { - /// Iterating over (key, value) pairs. - Value, - /// Iterating over (key, hash) pairs. - Hash, -} - /// Generates the events of the `chainHead_storage` method. pub struct ChainHeadStorage { - /// Substrate client. - client: Arc, + /// Storage client. + client: Storage, /// Queue of operations that may require pagination. iter_operations: VecDeque, /// The maximum number of items reported by the `chainHead_storage` before @@ -61,7 +52,7 @@ impl ChainHeadStorage { /// Constructs a new [`ChainHeadStorage`]. pub fn new(client: Arc, operation_max_storage_items: usize) -> Self { Self { - client, + client: Storage::new(client), iter_operations: VecDeque::new(), operation_max_storage_items, _phandom: PhantomData, @@ -69,163 +60,12 @@ impl ChainHeadStorage { } } -/// Query to iterate over storage. -struct QueryIter { - /// The key from which the iteration was started. - query_key: StorageKey, - /// The key after which pagination should resume. - pagination_start_key: Option, - /// The type of the query (either value or hash). - ty: IterQueryType, -} - -/// Checks if the provided key (main or child key) is valid -/// for queries. -/// -/// Keys that are identical to `:child_storage:` or `:child_storage:default:` -/// are not queryable. -fn is_key_queryable(key: &[u8]) -> bool { - !well_known_keys::is_default_child_storage_key(key) && - !well_known_keys::is_child_storage_key(key) -} - -/// The result of making a query call. -type QueryResult = Result, String>; - -/// The result of iterating over keys. -type QueryIterResult = Result<(Vec, Option), String>; - impl ChainHeadStorage where Block: BlockT + 'static, BE: Backend + 'static, Client: StorageProvider + 'static, { - /// Fetch the value from storage. - fn query_storage_value( - &self, - hash: Block::Hash, - key: &StorageKey, - child_key: Option<&ChildInfo>, - ) -> QueryResult { - let result = if let Some(child_key) = child_key { - self.client.child_storage(hash, child_key, key) - } else { - self.client.storage(hash, key) - }; - - result - .map(|opt| { - QueryResult::Ok(opt.map(|storage_data| StorageResult { - key: hex_string(&key.0), - result: StorageResultType::Value(hex_string(&storage_data.0)), - })) - }) - .unwrap_or_else(|error| QueryResult::Err(error.to_string())) - } - - /// Fetch the hash of a value from storage. - fn query_storage_hash( - &self, - hash: Block::Hash, - key: &StorageKey, - child_key: Option<&ChildInfo>, - ) -> QueryResult { - let result = if let Some(child_key) = child_key { - self.client.child_storage_hash(hash, child_key, key) - } else { - self.client.storage_hash(hash, key) - }; - - result - .map(|opt| { - QueryResult::Ok(opt.map(|storage_data| StorageResult { - key: hex_string(&key.0), - result: StorageResultType::Hash(hex_string(&storage_data.as_ref())), - })) - }) - .unwrap_or_else(|error| QueryResult::Err(error.to_string())) - } - - /// Fetch the closest merkle value. - fn query_storage_merkle_value( - &self, - hash: Block::Hash, - key: &StorageKey, - child_key: Option<&ChildInfo>, - ) -> QueryResult { - let result = if let Some(child_key) = child_key { - self.client.child_closest_merkle_value(hash, child_key, key) - } else { - self.client.closest_merkle_value(hash, key) - }; - - result - .map(|opt| { - QueryResult::Ok(opt.map(|storage_data| { - let result = match &storage_data { - sc_client_api::MerkleValue::Node(data) => hex_string(&data.as_slice()), - sc_client_api::MerkleValue::Hash(hash) => hex_string(&hash.as_ref()), - }; - - StorageResult { - key: hex_string(&key.0), - result: StorageResultType::ClosestDescendantMerkleValue(result), - } - })) - }) - .unwrap_or_else(|error| QueryResult::Err(error.to_string())) - } - - /// Iterate over at most `operation_max_storage_items` keys. - /// - /// Returns the storage result with a potential next key to resume iteration. - fn query_storage_iter_pagination( - &self, - query: QueryIter, - hash: Block::Hash, - child_key: Option<&ChildInfo>, - ) -> QueryIterResult { - let QueryIter { ty, query_key, pagination_start_key } = query; - - let mut keys_iter = if let Some(child_key) = child_key { - self.client.child_storage_keys( - hash, - child_key.to_owned(), - Some(&query_key), - pagination_start_key.as_ref(), - ) - } else { - self.client.storage_keys(hash, Some(&query_key), pagination_start_key.as_ref()) - } - .map_err(|err| err.to_string())?; - - let mut ret = Vec::with_capacity(self.operation_max_storage_items); - let mut next_pagination_key = None; - for _ in 0..self.operation_max_storage_items { - let Some(key) = keys_iter.next() else { break }; - - next_pagination_key = Some(key.clone()); - - let result = match ty { - IterQueryType::Value => self.query_storage_value(hash, &key, child_key), - IterQueryType::Hash => self.query_storage_hash(hash, &key, child_key), - }?; - - if let Some(value) = result { - ret.push(value); - } - } - - // Save the next key if any to continue the iteration. - let maybe_next_query = keys_iter.next().map(|_| QueryIter { - ty, - query_key, - pagination_start_key: next_pagination_key, - }); - Ok((ret, maybe_next_query)) - } - /// Iterate over (key, hash) and (key, value) generating the `WaitingForContinue` event if /// necessary. async fn generate_storage_iter_events( @@ -242,7 +82,12 @@ where return } - let result = self.query_storage_iter_pagination(query, hash, child_key.as_ref()); + let result = self.client.query_iter_pagination( + query, + hash, + child_key.as_ref(), + self.operation_max_storage_items, + ); let (events, maybe_next_query) = match result { QueryIterResult::Ok(result) => result, QueryIterResult::Err(error) => { @@ -294,24 +139,11 @@ where let sender = block_guard.response_sender(); let operation = block_guard.operation(); - if let Some(child_key) = child_key.as_ref() { - if !is_key_queryable(child_key.storage_key()) { - let _ = sender.unbounded_send(FollowEvent::::OperationStorageDone( - OperationId { operation_id: operation.operation_id() }, - )); - return - } - } - let mut storage_results = Vec::with_capacity(items.len()); for item in items { - if !is_key_queryable(&item.key.0) { - continue - } - match item.query_type { StorageQueryType::Value => { - match self.query_storage_value(hash, &item.key, child_key.as_ref()) { + match self.client.query_value(hash, &item.key, child_key.as_ref()) { Ok(Some(value)) => storage_results.push(value), Ok(None) => continue, Err(error) => { @@ -321,7 +153,7 @@ where } }, StorageQueryType::Hash => - match self.query_storage_hash(hash, &item.key, child_key.as_ref()) { + match self.client.query_hash(hash, &item.key, child_key.as_ref()) { Ok(Some(value)) => storage_results.push(value), Ok(None) => continue, Err(error) => { @@ -330,7 +162,7 @@ where }, }, StorageQueryType::ClosestDescendantMerkleValue => - match self.query_storage_merkle_value(hash, &item.key, child_key.as_ref()) { + match self.client.query_merkle_value(hash, &item.key, child_key.as_ref()) { Ok(Some(value)) => storage_results.push(value), Ok(None) => continue, Err(error) => { diff --git a/substrate/client/rpc-spec-v2/src/chain_head/event.rs b/substrate/client/rpc-spec-v2/src/chain_head/event.rs index b5f9d6cc2ff..560ab87eab4 100644 --- a/substrate/client/rpc-spec-v2/src/chain_head/event.rs +++ b/substrate/client/rpc-spec-v2/src/chain_head/event.rs @@ -23,6 +23,8 @@ use sp_api::ApiError; use sp_version::RuntimeVersion; use std::collections::BTreeMap; +use crate::common::events::StorageResult; + /// The operation could not be processed due to an error. #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] @@ -313,56 +315,6 @@ pub enum FollowEvent { Stop, } -/// The storage item received as paramter. -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct StorageQuery { - /// The provided key. - pub key: Key, - /// The type of the storage query. - #[serde(rename = "type")] - pub query_type: StorageQueryType, -} - -/// The type of the storage query. -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub enum StorageQueryType { - /// Fetch the value of the provided key. - Value, - /// Fetch the hash of the value of the provided key. - Hash, - /// Fetch the closest descendant merkle value. - ClosestDescendantMerkleValue, - /// Fetch the values of all descendants of they provided key. - DescendantsValues, - /// Fetch the hashes of the values of all descendants of they provided key. - DescendantsHashes, -} - -/// The storage result. -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct StorageResult { - /// The hex-encoded key of the result. - pub key: String, - /// The result of the query. - #[serde(flatten)] - pub result: StorageResultType, -} - -/// The type of the storage query. -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub enum StorageResultType { - /// Fetch the value of the provided key. - Value(String), - /// Fetch the hash of the value of the provided key. - Hash(String), - /// Fetch the closest descendant merkle value. - ClosestDescendantMerkleValue(String), -} - /// The method respose of `chainHead_body`, `chainHead_call` and `chainHead_storage`. #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] @@ -388,6 +340,8 @@ pub struct MethodResponseStarted { #[cfg(test)] mod tests { + use crate::common::events::StorageResultType; + use super::*; #[test] @@ -697,96 +651,4 @@ mod tests { let event_dec: MethodResponse = serde_json::from_str(exp).unwrap(); assert_eq!(event_dec, event); } - - #[test] - fn chain_head_storage_query() { - // Item with Value. - let item = StorageQuery { key: "0x1", query_type: StorageQueryType::Value }; - // Encode - let ser = serde_json::to_string(&item).unwrap(); - let exp = r#"{"key":"0x1","type":"value"}"#; - assert_eq!(ser, exp); - // Decode - let dec: StorageQuery<&str> = serde_json::from_str(exp).unwrap(); - assert_eq!(dec, item); - - // Item with Hash. - let item = StorageQuery { key: "0x1", query_type: StorageQueryType::Hash }; - // Encode - let ser = serde_json::to_string(&item).unwrap(); - let exp = r#"{"key":"0x1","type":"hash"}"#; - assert_eq!(ser, exp); - // Decode - let dec: StorageQuery<&str> = serde_json::from_str(exp).unwrap(); - assert_eq!(dec, item); - - // Item with DescendantsValues. - let item = StorageQuery { key: "0x1", query_type: StorageQueryType::DescendantsValues }; - // Encode - let ser = serde_json::to_string(&item).unwrap(); - let exp = r#"{"key":"0x1","type":"descendantsValues"}"#; - assert_eq!(ser, exp); - // Decode - let dec: StorageQuery<&str> = serde_json::from_str(exp).unwrap(); - assert_eq!(dec, item); - - // Item with DescendantsHashes. - let item = StorageQuery { key: "0x1", query_type: StorageQueryType::DescendantsHashes }; - // Encode - let ser = serde_json::to_string(&item).unwrap(); - let exp = r#"{"key":"0x1","type":"descendantsHashes"}"#; - assert_eq!(ser, exp); - // Decode - let dec: StorageQuery<&str> = serde_json::from_str(exp).unwrap(); - assert_eq!(dec, item); - - // Item with Merkle. - let item = - StorageQuery { key: "0x1", query_type: StorageQueryType::ClosestDescendantMerkleValue }; - // Encode - let ser = serde_json::to_string(&item).unwrap(); - let exp = r#"{"key":"0x1","type":"closestDescendantMerkleValue"}"#; - assert_eq!(ser, exp); - // Decode - let dec: StorageQuery<&str> = serde_json::from_str(exp).unwrap(); - assert_eq!(dec, item); - } - - #[test] - fn chain_head_storage_result() { - // Item with Value. - let item = - StorageResult { key: "0x1".into(), result: StorageResultType::Value("res".into()) }; - // Encode - let ser = serde_json::to_string(&item).unwrap(); - let exp = r#"{"key":"0x1","value":"res"}"#; - assert_eq!(ser, exp); - // Decode - let dec: StorageResult = serde_json::from_str(exp).unwrap(); - assert_eq!(dec, item); - - // Item with Hash. - let item = - StorageResult { key: "0x1".into(), result: StorageResultType::Hash("res".into()) }; - // Encode - let ser = serde_json::to_string(&item).unwrap(); - let exp = r#"{"key":"0x1","hash":"res"}"#; - assert_eq!(ser, exp); - // Decode - let dec: StorageResult = serde_json::from_str(exp).unwrap(); - assert_eq!(dec, item); - - // Item with DescendantsValues. - let item = StorageResult { - key: "0x1".into(), - result: StorageResultType::ClosestDescendantMerkleValue("res".into()), - }; - // Encode - let ser = serde_json::to_string(&item).unwrap(); - let exp = r#"{"key":"0x1","closestDescendantMerkleValue":"res"}"#; - assert_eq!(ser, exp); - // Decode - let dec: StorageResult = serde_json::from_str(exp).unwrap(); - assert_eq!(dec, item); - } } diff --git a/substrate/client/rpc-spec-v2/src/chain_head/mod.rs b/substrate/client/rpc-spec-v2/src/chain_head/mod.rs index 1bd22885780..4cbbd00f64f 100644 --- a/substrate/client/rpc-spec-v2/src/chain_head/mod.rs +++ b/substrate/client/rpc-spec-v2/src/chain_head/mod.rs @@ -42,10 +42,3 @@ pub use event::{ BestBlockChanged, ErrorEvent, Finalized, FollowEvent, Initialized, NewBlock, RuntimeEvent, RuntimeVersionEvent, }; - -use sp_core::hexdisplay::{AsBytesRef, HexDisplay}; - -/// Util function to print the results of `chianHead` as hex string -pub(crate) fn hex_string(data: &Data) -> String { - format!("0x{:?}", HexDisplay::from(data)) -} diff --git a/substrate/client/rpc-spec-v2/src/chain_head/tests.rs b/substrate/client/rpc-spec-v2/src/chain_head/tests.rs index c8f2362b9eb..4859793a8e2 100644 --- a/substrate/client/rpc-spec-v2/src/chain_head/tests.rs +++ b/substrate/client/rpc-spec-v2/src/chain_head/tests.rs @@ -16,9 +16,10 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -use crate::chain_head::{ - event::{MethodResponse, StorageQuery, StorageQueryType, StorageResultType}, - test_utils::ChainHeadMockClient, +use crate::{ + chain_head::{event::MethodResponse, test_utils::ChainHeadMockClient}, + common::events::{StorageQuery, StorageQueryType, StorageResultType}, + hex_string, }; use super::*; diff --git a/substrate/client/rpc-spec-v2/src/common/events.rs b/substrate/client/rpc-spec-v2/src/common/events.rs new file mode 100644 index 00000000000..b1627d74c84 --- /dev/null +++ b/substrate/client/rpc-spec-v2/src/common/events.rs @@ -0,0 +1,273 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//! Common events for RPC-V2 spec. + +use serde::{Deserialize, Serialize}; + +/// The storage item to query. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct StorageQuery { + /// The provided key. + pub key: Key, + /// The type of the storage query. + #[serde(rename = "type")] + pub query_type: StorageQueryType, +} + +/// The storage item to query with pagination. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct PaginatedStorageQuery { + /// The provided key. + pub key: Key, + /// The type of the storage query. + #[serde(rename = "type")] + pub query_type: StorageQueryType, + /// The pagination key from which the iteration should resume. + #[serde(skip_serializing_if = "Option::is_none")] + #[serde(default)] + pub pagination_start_key: Option, +} + +/// The type of the storage query. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub enum StorageQueryType { + /// Fetch the value of the provided key. + Value, + /// Fetch the hash of the value of the provided key. + Hash, + /// Fetch the closest descendant merkle value. + ClosestDescendantMerkleValue, + /// Fetch the values of all descendants of they provided key. + DescendantsValues, + /// Fetch the hashes of the values of all descendants of they provided key. + DescendantsHashes, +} + +impl StorageQueryType { + /// Returns `true` if the query is a descendant query. + pub fn is_descendant_query(&self) -> bool { + matches!(self, Self::DescendantsValues | Self::DescendantsHashes) + } +} + +/// The storage result. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct StorageResult { + /// The hex-encoded key of the result. + pub key: String, + /// The result of the query. + #[serde(flatten)] + pub result: StorageResultType, +} + +/// The type of the storage query. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub enum StorageResultType { + /// Fetch the value of the provided key. + Value(String), + /// Fetch the hash of the value of the provided key. + Hash(String), + /// Fetch the closest descendant merkle value. + ClosestDescendantMerkleValue(String), +} + +/// The error of a storage call. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct StorageResultErr { + /// The hex-encoded key of the result. + pub key: String, + /// The result of the query. + #[serde(flatten)] + pub error: StorageResultType, +} + +/// The result of a storage call. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(untagged)] +pub enum ArchiveStorageResult { + /// Query generated a result. + Ok(ArchiveStorageMethodOk), + /// Query encountered an error. + Err(ArchiveStorageMethodErr), +} + +impl ArchiveStorageResult { + /// Create a new `ArchiveStorageResult::Ok` result. + pub fn ok(result: Vec, discarded_items: usize) -> Self { + Self::Ok(ArchiveStorageMethodOk { result, discarded_items }) + } + + /// Create a new `ArchiveStorageResult::Err` result. + pub fn err(error: String) -> Self { + Self::Err(ArchiveStorageMethodErr { error }) + } +} + +/// The result of a storage call. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ArchiveStorageMethodOk { + /// Reported results. + pub result: Vec, + /// Number of discarded items. + pub discarded_items: usize, +} + +/// The error of a storage call. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ArchiveStorageMethodErr { + /// Reported error. + pub error: String, +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn storage_result() { + // Item with Value. + let item = + StorageResult { key: "0x1".into(), result: StorageResultType::Value("res".into()) }; + // Encode + let ser = serde_json::to_string(&item).unwrap(); + let exp = r#"{"key":"0x1","value":"res"}"#; + assert_eq!(ser, exp); + // Decode + let dec: StorageResult = serde_json::from_str(exp).unwrap(); + assert_eq!(dec, item); + + // Item with Hash. + let item = + StorageResult { key: "0x1".into(), result: StorageResultType::Hash("res".into()) }; + // Encode + let ser = serde_json::to_string(&item).unwrap(); + let exp = r#"{"key":"0x1","hash":"res"}"#; + assert_eq!(ser, exp); + // Decode + let dec: StorageResult = serde_json::from_str(exp).unwrap(); + assert_eq!(dec, item); + + // Item with DescendantsValues. + let item = StorageResult { + key: "0x1".into(), + result: StorageResultType::ClosestDescendantMerkleValue("res".into()), + }; + // Encode + let ser = serde_json::to_string(&item).unwrap(); + let exp = r#"{"key":"0x1","closestDescendantMerkleValue":"res"}"#; + assert_eq!(ser, exp); + // Decode + let dec: StorageResult = serde_json::from_str(exp).unwrap(); + assert_eq!(dec, item); + } + + #[test] + fn storage_query() { + // Item with Value. + let item = StorageQuery { key: "0x1", query_type: StorageQueryType::Value }; + // Encode + let ser = serde_json::to_string(&item).unwrap(); + let exp = r#"{"key":"0x1","type":"value"}"#; + assert_eq!(ser, exp); + // Decode + let dec: StorageQuery<&str> = serde_json::from_str(exp).unwrap(); + assert_eq!(dec, item); + + // Item with Hash. + let item = StorageQuery { key: "0x1", query_type: StorageQueryType::Hash }; + // Encode + let ser = serde_json::to_string(&item).unwrap(); + let exp = r#"{"key":"0x1","type":"hash"}"#; + assert_eq!(ser, exp); + // Decode + let dec: StorageQuery<&str> = serde_json::from_str(exp).unwrap(); + assert_eq!(dec, item); + + // Item with DescendantsValues. + let item = StorageQuery { key: "0x1", query_type: StorageQueryType::DescendantsValues }; + // Encode + let ser = serde_json::to_string(&item).unwrap(); + let exp = r#"{"key":"0x1","type":"descendantsValues"}"#; + assert_eq!(ser, exp); + // Decode + let dec: StorageQuery<&str> = serde_json::from_str(exp).unwrap(); + assert_eq!(dec, item); + + // Item with DescendantsHashes. + let item = StorageQuery { key: "0x1", query_type: StorageQueryType::DescendantsHashes }; + // Encode + let ser = serde_json::to_string(&item).unwrap(); + let exp = r#"{"key":"0x1","type":"descendantsHashes"}"#; + assert_eq!(ser, exp); + // Decode + let dec: StorageQuery<&str> = serde_json::from_str(exp).unwrap(); + assert_eq!(dec, item); + + // Item with Merkle. + let item = + StorageQuery { key: "0x1", query_type: StorageQueryType::ClosestDescendantMerkleValue }; + // Encode + let ser = serde_json::to_string(&item).unwrap(); + let exp = r#"{"key":"0x1","type":"closestDescendantMerkleValue"}"#; + assert_eq!(ser, exp); + // Decode + let dec: StorageQuery<&str> = serde_json::from_str(exp).unwrap(); + assert_eq!(dec, item); + } + + #[test] + fn storage_query_paginated() { + let item = PaginatedStorageQuery { + key: "0x1", + query_type: StorageQueryType::Value, + pagination_start_key: None, + }; + // Encode + let ser = serde_json::to_string(&item).unwrap(); + let exp = r#"{"key":"0x1","type":"value"}"#; + assert_eq!(ser, exp); + // Decode + let dec: StorageQuery<&str> = serde_json::from_str(exp).unwrap(); + assert_eq!(dec.key, item.key); + assert_eq!(dec.query_type, item.query_type); + let dec: PaginatedStorageQuery<&str> = serde_json::from_str(exp).unwrap(); + assert_eq!(dec, item); + + let item = PaginatedStorageQuery { + key: "0x1", + query_type: StorageQueryType::Value, + pagination_start_key: Some("0x2"), + }; + // Encode + let ser = serde_json::to_string(&item).unwrap(); + let exp = r#"{"key":"0x1","type":"value","paginationStartKey":"0x2"}"#; + assert_eq!(ser, exp); + // Decode + let dec: PaginatedStorageQuery<&str> = serde_json::from_str(exp).unwrap(); + assert_eq!(dec, item); + } +} diff --git a/substrate/client/rpc-spec-v2/src/common/mod.rs b/substrate/client/rpc-spec-v2/src/common/mod.rs new file mode 100644 index 00000000000..ac1af8fce3c --- /dev/null +++ b/substrate/client/rpc-spec-v2/src/common/mod.rs @@ -0,0 +1,17 @@ +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//! Common types and functionality for the RPC-V2 spec. + +pub mod events; +pub mod storage; diff --git a/substrate/client/rpc-spec-v2/src/common/storage.rs b/substrate/client/rpc-spec-v2/src/common/storage.rs new file mode 100644 index 00000000000..bd249e033f8 --- /dev/null +++ b/substrate/client/rpc-spec-v2/src/common/storage.rs @@ -0,0 +1,198 @@ +// This file is part of Substrate. + +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +//! Storage queries for the RPC-V2 spec. + +use std::{marker::PhantomData, sync::Arc}; + +use sc_client_api::{Backend, ChildInfo, StorageKey, StorageProvider}; +use sp_runtime::traits::Block as BlockT; + +use super::events::{StorageResult, StorageResultType}; +use crate::hex_string; + +/// Call into the storage of blocks. +pub struct Storage { + /// Substrate client. + client: Arc, + _phandom: PhantomData<(BE, Block)>, +} + +impl Storage { + /// Constructs a new [`Storage`]. + pub fn new(client: Arc) -> Self { + Self { client, _phandom: PhantomData } + } +} + +/// Query to iterate over storage. +pub struct QueryIter { + /// The key from which the iteration was started. + pub query_key: StorageKey, + /// The key after which pagination should resume. + pub pagination_start_key: Option, + /// The type of the query (either value or hash). + pub ty: IterQueryType, +} + +/// The query type of an iteration. +pub enum IterQueryType { + /// Iterating over (key, value) pairs. + Value, + /// Iterating over (key, hash) pairs. + Hash, +} + +/// The result of making a query call. +pub type QueryResult = Result, String>; + +/// The result of iterating over keys. +pub type QueryIterResult = Result<(Vec, Option), String>; + +impl Storage +where + Block: BlockT + 'static, + BE: Backend + 'static, + Client: StorageProvider + 'static, +{ + /// Fetch the value from storage. + pub fn query_value( + &self, + hash: Block::Hash, + key: &StorageKey, + child_key: Option<&ChildInfo>, + ) -> QueryResult { + let result = if let Some(child_key) = child_key { + self.client.child_storage(hash, child_key, key) + } else { + self.client.storage(hash, key) + }; + + result + .map(|opt| { + QueryResult::Ok(opt.map(|storage_data| StorageResult { + key: hex_string(&key.0), + result: StorageResultType::Value(hex_string(&storage_data.0)), + })) + }) + .unwrap_or_else(|error| QueryResult::Err(error.to_string())) + } + + /// Fetch the hash of a value from storage. + pub fn query_hash( + &self, + hash: Block::Hash, + key: &StorageKey, + child_key: Option<&ChildInfo>, + ) -> QueryResult { + let result = if let Some(child_key) = child_key { + self.client.child_storage_hash(hash, child_key, key) + } else { + self.client.storage_hash(hash, key) + }; + + result + .map(|opt| { + QueryResult::Ok(opt.map(|storage_data| StorageResult { + key: hex_string(&key.0), + result: StorageResultType::Hash(hex_string(&storage_data.as_ref())), + })) + }) + .unwrap_or_else(|error| QueryResult::Err(error.to_string())) + } + + /// Fetch the closest merkle value. + pub fn query_merkle_value( + &self, + hash: Block::Hash, + key: &StorageKey, + child_key: Option<&ChildInfo>, + ) -> QueryResult { + let result = if let Some(child_key) = child_key { + self.client.child_closest_merkle_value(hash, child_key, key) + } else { + self.client.closest_merkle_value(hash, key) + }; + + result + .map(|opt| { + QueryResult::Ok(opt.map(|storage_data| { + let result = match &storage_data { + sc_client_api::MerkleValue::Node(data) => hex_string(&data.as_slice()), + sc_client_api::MerkleValue::Hash(hash) => hex_string(&hash.as_ref()), + }; + + StorageResult { + key: hex_string(&key.0), + result: StorageResultType::ClosestDescendantMerkleValue(result), + } + })) + }) + .unwrap_or_else(|error| QueryResult::Err(error.to_string())) + } + + /// Iterate over at most the provided number of keys. + /// + /// Returns the storage result with a potential next key to resume iteration. + pub fn query_iter_pagination( + &self, + query: QueryIter, + hash: Block::Hash, + child_key: Option<&ChildInfo>, + count: usize, + ) -> QueryIterResult { + let QueryIter { ty, query_key, pagination_start_key } = query; + + let mut keys_iter = if let Some(child_key) = child_key { + self.client.child_storage_keys( + hash, + child_key.to_owned(), + Some(&query_key), + pagination_start_key.as_ref(), + ) + } else { + self.client.storage_keys(hash, Some(&query_key), pagination_start_key.as_ref()) + } + .map_err(|err| err.to_string())?; + + let mut ret = Vec::with_capacity(count); + let mut next_pagination_key = None; + for _ in 0..count { + let Some(key) = keys_iter.next() else { break }; + + next_pagination_key = Some(key.clone()); + + let result = match ty { + IterQueryType::Value => self.query_value(hash, &key, child_key), + IterQueryType::Hash => self.query_hash(hash, &key, child_key), + }?; + + if let Some(value) = result { + ret.push(value); + } + } + + // Save the next key if any to continue the iteration. + let maybe_next_query = keys_iter.next().map(|_| QueryIter { + ty, + query_key, + pagination_start_key: next_pagination_key, + }); + Ok((ret, maybe_next_query)) + } +} diff --git a/substrate/client/rpc-spec-v2/src/lib.rs b/substrate/client/rpc-spec-v2/src/lib.rs index d202bfef4a7..23ed422cff1 100644 --- a/substrate/client/rpc-spec-v2/src/lib.rs +++ b/substrate/client/rpc-spec-v2/src/lib.rs @@ -24,6 +24,9 @@ #![deny(unused_crate_dependencies)] use serde::{Deserialize, Serialize}; +use sp_core::hexdisplay::{AsBytesRef, HexDisplay}; + +mod common; pub mod archive; pub mod chain_head; @@ -39,7 +42,7 @@ pub type SubscriptionTaskExecutor = std::sync::Arc(data: &Data) -> String { + format!("0x{:?}", HexDisplay::from(data)) +} + #[cfg(test)] mod tests { use super::*; -- GitLab From ac303406ffc0b1478b53d236a7983c31755717bc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jan 2024 15:56:22 +0100 Subject: [PATCH 167/191] Bump the known_good_semver group with 1 update (#2926) Bumps the known_good_semver group with 1 update: [clap](https://github.com/clap-rs/clap). Updates `clap` from 4.4.14 to 4.4.16
Release notes

Sourced from clap's releases.

v4.4.16

[4.4.16] - 2024-01-12

Fixes

  • Ensure invalid escape sequences in user-defined strings are correctly stripped when terminal doesn't support color

v4.4.15

[4.4.15] - 2024-01-11

Fixes

  • Improve error for args_conflicts_with_subcommands
  • Ensure we error for args_conflicts_with_subcommands when using subcommand short and long flags
Changelog

Sourced from clap's changelog.

[4.4.16] - 2024-01-12

Fixes

  • Ensure invalid escape sequences in user-defined strings are correctly stripped when terminal doesn't support color

[4.4.15] - 2024-01-11

Fixes

  • Improve error for args_conflicts_with_subcommands
  • Ensure we error for args_conflicts_with_subcommands when using subcommand short and long flags
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=clap&package-manager=cargo&previous-version=4.4.14&new-version=4.4.16)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 70 +++++++++---------- cumulus/client/cli/Cargo.toml | 2 +- cumulus/parachain-template/node/Cargo.toml | 2 +- cumulus/polkadot-parachain/Cargo.toml | 2 +- cumulus/test/service/Cargo.toml | 2 +- polkadot/cli/Cargo.toml | 2 +- polkadot/node/malus/Cargo.toml | 2 +- polkadot/node/subsystem-bench/Cargo.toml | 2 +- .../test-parachains/adder/collator/Cargo.toml | 2 +- .../undying/collator/Cargo.toml | 2 +- polkadot/utils/generate-bags/Cargo.toml | 2 +- .../remote-ext-tests/bags-list/Cargo.toml | 2 +- substrate/bin/minimal/node/Cargo.toml | 2 +- substrate/bin/node-template/node/Cargo.toml | 2 +- substrate/bin/node/bench/Cargo.toml | 2 +- substrate/bin/node/cli/Cargo.toml | 4 +- substrate/bin/node/inspect/Cargo.toml | 2 +- .../bin/utils/chain-spec-builder/Cargo.toml | 2 +- substrate/bin/utils/subkey/Cargo.toml | 2 +- substrate/client/cli/Cargo.toml | 2 +- substrate/client/storage-monitor/Cargo.toml | 2 +- .../solution-type/fuzzer/Cargo.toml | 2 +- .../npos-elections/fuzzer/Cargo.toml | 2 +- .../ci/node-template-release/Cargo.toml | 2 +- .../utils/frame/benchmarking-cli/Cargo.toml | 2 +- .../frame/frame-utilities-cli/Cargo.toml | 2 +- .../generate-bags/node-runtime/Cargo.toml | 2 +- .../utils/frame/try-runtime/cli/Cargo.toml | 2 +- 28 files changed, 63 insertions(+), 63 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b20adebf963..aa773aa104a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -270,9 +270,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.4" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" +checksum = "4cd2405b3ac1faab2990b74d728624cd9fd115651fcecc7c2d8daf01376275ba" dependencies = [ "anstyle", "anstyle-parse", @@ -2637,9 +2637,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.14" +version = "4.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33e92c5c1a78c62968ec57dbc2440366a2d6e5a23faf829970ff1585dc6b18e2" +checksum = "58e54881c004cec7895b0068a0a954cd5d62da01aef83fa35b1e594497bf5445" dependencies = [ "clap_builder", "clap_derive 4.4.7", @@ -2656,9 +2656,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.14" +version = "4.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4323769dc8a61e2c39ad7dc26f6f2800524691a44d74fe3d1071a5c24db6370" +checksum = "59cb82d7f531603d2fd1f507441cdd35184fa81beff7bd489570de7f773460bb" dependencies = [ "anstream", "anstyle", @@ -2673,7 +2673,7 @@ version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "586a385f7ef2f8b4d86bddaa0c094794e7ccbfe5ffef1f434fe928143fc783a5" dependencies = [ - "clap 4.4.14", + "clap 4.4.16", ] [[package]] @@ -3411,7 +3411,7 @@ dependencies = [ "anes", "cast", "ciborium", - "clap 4.4.14", + "clap 4.4.16", "criterion-plot", "futures", "is-terminal", @@ -3574,7 +3574,7 @@ dependencies = [ name = "cumulus-client-cli" version = "0.1.0" dependencies = [ - "clap 4.4.14", + "clap 4.4.16", "parity-scale-codec", "sc-chain-spec", "sc-cli", @@ -4313,7 +4313,7 @@ name = "cumulus-test-service" version = "0.1.0" dependencies = [ "async-trait", - "clap 4.4.14", + "clap 4.4.16", "criterion 0.5.1", "cumulus-client-cli", "cumulus-client-consensus-common", @@ -5497,7 +5497,7 @@ dependencies = [ "Inflector", "array-bytes 6.1.0", "chrono", - "clap 4.4.14", + "clap 4.4.16", "comfy-table", "frame-benchmarking", "frame-support", @@ -5589,7 +5589,7 @@ dependencies = [ name = "frame-election-solution-type-fuzzer" version = "2.0.0-alpha.5" dependencies = [ - "clap 4.4.14", + "clap 4.4.16", "frame-election-provider-solution-type", "frame-election-provider-support", "frame-support", @@ -8105,7 +8105,7 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" name = "minimal-node" version = "4.0.0-dev" dependencies = [ - "clap 4.4.14", + "clap 4.4.16", "frame", "futures", "futures-timer", @@ -8569,7 +8569,7 @@ name = "node-bench" version = "0.9.0-dev" dependencies = [ "array-bytes 6.1.0", - "clap 4.4.14", + "clap 4.4.16", "derive_more", "fs_extra", "futures", @@ -8646,7 +8646,7 @@ dependencies = [ name = "node-runtime-generate-bags" version = "3.0.0" dependencies = [ - "clap 4.4.14", + "clap 4.4.16", "generate-bags", "kitchensink-runtime", ] @@ -8655,7 +8655,7 @@ dependencies = [ name = "node-template" version = "4.0.0-dev" dependencies = [ - "clap 4.4.14", + "clap 4.4.16", "frame-benchmarking", "frame-benchmarking-cli", "frame-system", @@ -8699,7 +8699,7 @@ dependencies = [ name = "node-template-release" version = "3.0.0" dependencies = [ - "clap 4.4.14", + "clap 4.4.16", "flate2", "fs_extra", "glob", @@ -11243,7 +11243,7 @@ dependencies = [ name = "parachain-template-node" version = "0.1.0" dependencies = [ - "clap 4.4.14", + "clap 4.4.16", "color-print", "cumulus-client-cli", "cumulus-client-collator", @@ -12201,7 +12201,7 @@ name = "polkadot-cli" version = "1.1.0" dependencies = [ "cfg-if", - "clap 4.4.14", + "clap 4.4.16", "frame-benchmarking-cli", "futures", "log", @@ -13042,7 +13042,7 @@ dependencies = [ "async-trait", "bridge-hub-rococo-runtime", "bridge-hub-westend-runtime", - "clap 4.4.14", + "clap 4.4.16", "collectives-westend-runtime", "color-print", "contracts-rococo-runtime", @@ -13553,7 +13553,7 @@ version = "1.0.0" dependencies = [ "assert_matches", "async-trait", - "clap 4.4.14", + "clap 4.4.16", "clap-num", "color-eyre", "colored", @@ -13630,7 +13630,7 @@ version = "1.0.0" dependencies = [ "assert_matches", "async-trait", - "clap 4.4.14", + "clap 4.4.16", "color-eyre", "futures", "futures-timer", @@ -13777,7 +13777,7 @@ dependencies = [ name = "polkadot-voter-bags" version = "1.0.0" dependencies = [ - "clap 4.4.14", + "clap 4.4.16", "generate-bags", "sp-io", "westend-runtime", @@ -14647,7 +14647,7 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" name = "remote-ext-tests-bags-list" version = "1.0.0" dependencies = [ - "clap 4.4.14", + "clap 4.4.16", "frame-system", "log", "pallet-bags-list-remote-tests", @@ -15437,7 +15437,7 @@ dependencies = [ "array-bytes 6.1.0", "bip39", "chrono", - "clap 4.4.14", + "clap 4.4.16", "fdlimit", "futures", "futures-timer", @@ -16581,7 +16581,7 @@ dependencies = [ name = "sc-storage-monitor" version = "0.1.0" dependencies = [ - "clap 4.4.14", + "clap 4.4.16", "fs4", "log", "sp-core", @@ -18531,7 +18531,7 @@ dependencies = [ name = "sp-npos-elections-fuzzer" version = "2.0.0-alpha.5" dependencies = [ - "clap 4.4.14", + "clap 4.4.16", "honggfuzz", "rand 0.8.5", "sp-npos-elections", @@ -19052,7 +19052,7 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" name = "staging-chain-spec-builder" version = "2.0.0" dependencies = [ - "clap 4.4.14", + "clap 4.4.16", "log", "sc-chain-spec", "serde_json", @@ -19065,7 +19065,7 @@ version = "3.0.0-dev" dependencies = [ "array-bytes 6.1.0", "assert_cmd", - "clap 4.4.14", + "clap 4.4.16", "clap_complete", "criterion 0.4.0", "frame-benchmarking", @@ -19174,7 +19174,7 @@ dependencies = [ name = "staging-node-inspect" version = "0.9.0-dev" dependencies = [ - "clap 4.4.14", + "clap 4.4.16", "parity-scale-codec", "sc-cli", "sc-client-api", @@ -19379,7 +19379,7 @@ dependencies = [ name = "subkey" version = "3.0.0" dependencies = [ - "clap 4.4.14", + "clap 4.4.16", "sc-cli", ] @@ -19421,7 +19421,7 @@ dependencies = [ name = "substrate-frame-cli" version = "4.0.0-dev" dependencies = [ - "clap 4.4.14", + "clap 4.4.16", "frame-support", "frame-system", "sc-cli", @@ -19899,7 +19899,7 @@ dependencies = [ name = "test-parachain-adder-collator" version = "1.0.0" dependencies = [ - "clap 4.4.14", + "clap 4.4.16", "futures", "futures-timer", "log", @@ -19947,7 +19947,7 @@ dependencies = [ name = "test-parachain-undying-collator" version = "1.0.0" dependencies = [ - "clap 4.4.14", + "clap 4.4.16", "futures", "futures-timer", "log", @@ -20598,7 +20598,7 @@ version = "0.10.0-dev" dependencies = [ "assert_cmd", "async-trait", - "clap 4.4.14", + "clap 4.4.16", "frame-remote-externalities", "frame-try-runtime", "hex", diff --git a/cumulus/client/cli/Cargo.toml b/cumulus/client/cli/Cargo.toml index 736cb02b94b..4048c3eaecb 100644 --- a/cumulus/client/cli/Cargo.toml +++ b/cumulus/client/cli/Cargo.toml @@ -10,7 +10,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" workspace = true [dependencies] -clap = { version = "4.4.14", features = ["derive"] } +clap = { version = "4.4.16", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } url = "2.4.0" diff --git a/cumulus/parachain-template/node/Cargo.toml b/cumulus/parachain-template/node/Cargo.toml index 7edb4b454c0..b34478ab3dd 100644 --- a/cumulus/parachain-template/node/Cargo.toml +++ b/cumulus/parachain-template/node/Cargo.toml @@ -14,7 +14,7 @@ publish = false workspace = true [dependencies] -clap = { version = "4.4.14", features = ["derive"] } +clap = { version = "4.4.16", features = ["derive"] } log = "0.4.20" codec = { package = "parity-scale-codec", version = "3.0.0" } serde = { version = "1.0.195", features = ["derive"] } diff --git a/cumulus/polkadot-parachain/Cargo.toml b/cumulus/polkadot-parachain/Cargo.toml index 50fc48b3f2f..9f42a265f39 100644 --- a/cumulus/polkadot-parachain/Cargo.toml +++ b/cumulus/polkadot-parachain/Cargo.toml @@ -16,7 +16,7 @@ path = "src/main.rs" [dependencies] async-trait = "0.1.74" -clap = { version = "4.4.14", features = ["derive"] } +clap = { version = "4.4.16", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } futures = "0.3.28" hex-literal = "0.4.1" diff --git a/cumulus/test/service/Cargo.toml b/cumulus/test/service/Cargo.toml index f4dde7d2945..387d65c4931 100644 --- a/cumulus/test/service/Cargo.toml +++ b/cumulus/test/service/Cargo.toml @@ -14,7 +14,7 @@ path = "src/main.rs" [dependencies] async-trait = "0.1.74" -clap = { version = "4.4.14", features = ["derive"] } +clap = { version = "4.4.16", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } criterion = { version = "0.5.1", features = ["async_tokio"] } jsonrpsee = { version = "0.16.2", features = ["server"] } diff --git a/polkadot/cli/Cargo.toml b/polkadot/cli/Cargo.toml index 1b331c5ed42..cc96422abbc 100644 --- a/polkadot/cli/Cargo.toml +++ b/polkadot/cli/Cargo.toml @@ -19,7 +19,7 @@ crate-type = ["cdylib", "rlib"] [dependencies] cfg-if = "1.0" -clap = { version = "4.4.14", features = ["derive"], optional = true } +clap = { version = "4.4.16", features = ["derive"], optional = true } log = "0.4.17" thiserror = "1.0.48" futures = "0.3.21" diff --git a/polkadot/node/malus/Cargo.toml b/polkadot/node/malus/Cargo.toml index 56d377648bb..7793abfd69b 100644 --- a/polkadot/node/malus/Cargo.toml +++ b/polkadot/node/malus/Cargo.toml @@ -43,7 +43,7 @@ assert_matches = "1.5" async-trait = "0.1.74" sp-keystore = { path = "../../../substrate/primitives/keystore" } sp-core = { path = "../../../substrate/primitives/core" } -clap = { version = "4.4.14", features = ["derive"] } +clap = { version = "4.4.16", features = ["derive"] } futures = "0.3.21" futures-timer = "3.0.2" gum = { package = "tracing-gum", path = "../gum" } diff --git a/polkadot/node/subsystem-bench/Cargo.toml b/polkadot/node/subsystem-bench/Cargo.toml index dc1179b7762..ab3de33fe2c 100644 --- a/polkadot/node/subsystem-bench/Cargo.toml +++ b/polkadot/node/subsystem-bench/Cargo.toml @@ -31,7 +31,7 @@ async-trait = "0.1.74" sp-keystore = { path = "../../../substrate/primitives/keystore" } sc-keystore = { path = "../../../substrate/client/keystore" } sp-core = { path = "../../../substrate/primitives/core" } -clap = { version = "4.4.14", features = ["derive"] } +clap = { version = "4.4.16", features = ["derive"] } futures = "0.3.21" futures-timer = "3.0.2" gum = { package = "tracing-gum", path = "../gum" } diff --git a/polkadot/parachain/test-parachains/adder/collator/Cargo.toml b/polkadot/parachain/test-parachains/adder/collator/Cargo.toml index c2cea979b97..4ebeb767905 100644 --- a/polkadot/parachain/test-parachains/adder/collator/Cargo.toml +++ b/polkadot/parachain/test-parachains/adder/collator/Cargo.toml @@ -16,7 +16,7 @@ path = "src/main.rs" [dependencies] parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive"] } -clap = { version = "4.4.14", features = ["derive"] } +clap = { version = "4.4.16", features = ["derive"] } futures = "0.3.21" futures-timer = "3.0.2" log = "0.4.17" diff --git a/polkadot/parachain/test-parachains/undying/collator/Cargo.toml b/polkadot/parachain/test-parachains/undying/collator/Cargo.toml index 4d7c7391d82..1d851218bed 100644 --- a/polkadot/parachain/test-parachains/undying/collator/Cargo.toml +++ b/polkadot/parachain/test-parachains/undying/collator/Cargo.toml @@ -16,7 +16,7 @@ path = "src/main.rs" [dependencies] parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive"] } -clap = { version = "4.4.14", features = ["derive"] } +clap = { version = "4.4.16", features = ["derive"] } futures = "0.3.21" futures-timer = "3.0.2" log = "0.4.17" diff --git a/polkadot/utils/generate-bags/Cargo.toml b/polkadot/utils/generate-bags/Cargo.toml index 5435baa6151..a16ee8de496 100644 --- a/polkadot/utils/generate-bags/Cargo.toml +++ b/polkadot/utils/generate-bags/Cargo.toml @@ -10,7 +10,7 @@ description = "CLI to generate voter bags for Polkadot runtimes" workspace = true [dependencies] -clap = { version = "4.4.14", features = ["derive"] } +clap = { version = "4.4.16", features = ["derive"] } generate-bags = { path = "../../../substrate/utils/frame/generate-bags" } sp-io = { path = "../../../substrate/primitives/io" } diff --git a/polkadot/utils/remote-ext-tests/bags-list/Cargo.toml b/polkadot/utils/remote-ext-tests/bags-list/Cargo.toml index aeb62e87941..75bfdd9d1a0 100644 --- a/polkadot/utils/remote-ext-tests/bags-list/Cargo.toml +++ b/polkadot/utils/remote-ext-tests/bags-list/Cargo.toml @@ -18,6 +18,6 @@ sp-tracing = { path = "../../../../substrate/primitives/tracing" } frame-system = { path = "../../../../substrate/frame/system" } sp-core = { path = "../../../../substrate/primitives/core" } -clap = { version = "4.4.14", features = ["derive"] } +clap = { version = "4.4.16", features = ["derive"] } log = "0.4.17" tokio = { version = "1.24.2", features = ["macros"] } diff --git a/substrate/bin/minimal/node/Cargo.toml b/substrate/bin/minimal/node/Cargo.toml index 07138eb0c55..5a2427fd4d8 100644 --- a/substrate/bin/minimal/node/Cargo.toml +++ b/substrate/bin/minimal/node/Cargo.toml @@ -20,7 +20,7 @@ targets = ["x86_64-unknown-linux-gnu"] name = "minimal-node" [dependencies] -clap = { version = "4.4.14", features = ["derive"] } +clap = { version = "4.4.16", features = ["derive"] } futures = { version = "0.3.21", features = ["thread-pool"] } futures-timer = "3.0.1" jsonrpsee = { version = "0.16.2", features = ["server"] } diff --git a/substrate/bin/node-template/node/Cargo.toml b/substrate/bin/node-template/node/Cargo.toml index aac24a83096..f91db97985b 100644 --- a/substrate/bin/node-template/node/Cargo.toml +++ b/substrate/bin/node-template/node/Cargo.toml @@ -20,7 +20,7 @@ targets = ["x86_64-unknown-linux-gnu"] name = "node-template" [dependencies] -clap = { version = "4.4.14", features = ["derive"] } +clap = { version = "4.4.16", features = ["derive"] } futures = { version = "0.3.21", features = ["thread-pool"] } serde_json = "1.0.111" diff --git a/substrate/bin/node/bench/Cargo.toml b/substrate/bin/node/bench/Cargo.toml index e2b68b2a0e8..926cdc3bfb0 100644 --- a/substrate/bin/node/bench/Cargo.toml +++ b/substrate/bin/node/bench/Cargo.toml @@ -16,7 +16,7 @@ workspace = true [dependencies] array-bytes = "6.1" -clap = { version = "4.4.14", features = ["derive"] } +clap = { version = "4.4.16", features = ["derive"] } log = "0.4.17" node-primitives = { path = "../primitives" } node-testing = { path = "../testing" } diff --git a/substrate/bin/node/cli/Cargo.toml b/substrate/bin/node/cli/Cargo.toml index 4bf5efd7cd1..64b61288391 100644 --- a/substrate/bin/node/cli/Cargo.toml +++ b/substrate/bin/node/cli/Cargo.toml @@ -41,7 +41,7 @@ crate-type = ["cdylib", "rlib"] [dependencies] # third-party dependencies array-bytes = "6.1" -clap = { version = "4.4.14", features = ["derive"], optional = true } +clap = { version = "4.4.16", features = ["derive"], optional = true } codec = { package = "parity-scale-codec", version = "3.6.1" } serde = { version = "1.0.195", features = ["derive"] } jsonrpsee = { version = "0.16.2", features = ["server"] } @@ -164,7 +164,7 @@ sp-trie = { path = "../../../primitives/trie" } sp-state-machine = { path = "../../../primitives/state-machine" } [build-dependencies] -clap = { version = "4.4.14", optional = true } +clap = { version = "4.4.16", optional = true } clap_complete = { version = "4.0.2", optional = true } node-inspect = { package = "staging-node-inspect", path = "../inspect", optional = true } frame-benchmarking-cli = { path = "../../../utils/frame/benchmarking-cli", optional = true } diff --git a/substrate/bin/node/inspect/Cargo.toml b/substrate/bin/node/inspect/Cargo.toml index 29c0917440e..ef82f16be2a 100644 --- a/substrate/bin/node/inspect/Cargo.toml +++ b/substrate/bin/node/inspect/Cargo.toml @@ -15,7 +15,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -clap = { version = "4.4.14", features = ["derive"] } +clap = { version = "4.4.16", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.6.1" } thiserror = "1.0" sc-cli = { path = "../../../client/cli" } diff --git a/substrate/bin/utils/chain-spec-builder/Cargo.toml b/substrate/bin/utils/chain-spec-builder/Cargo.toml index e9dc4d83b6b..a9ea0ad40b3 100644 --- a/substrate/bin/utils/chain-spec-builder/Cargo.toml +++ b/substrate/bin/utils/chain-spec-builder/Cargo.toml @@ -23,7 +23,7 @@ name = "chain-spec-builder" crate-type = ["rlib"] [dependencies] -clap = { version = "4.4.14", features = ["derive"] } +clap = { version = "4.4.16", features = ["derive"] } log = "0.4.17" sc-chain-spec = { path = "../../../client/chain-spec" } serde_json = "1.0.111" diff --git a/substrate/bin/utils/subkey/Cargo.toml b/substrate/bin/utils/subkey/Cargo.toml index 822068f6614..19eba2f1969 100644 --- a/substrate/bin/utils/subkey/Cargo.toml +++ b/substrate/bin/utils/subkey/Cargo.toml @@ -20,5 +20,5 @@ path = "src/main.rs" name = "subkey" [dependencies] -clap = { version = "4.4.14", features = ["derive"] } +clap = { version = "4.4.16", features = ["derive"] } sc-cli = { path = "../../../client/cli" } diff --git a/substrate/client/cli/Cargo.toml b/substrate/client/cli/Cargo.toml index caaa96b904c..ce9b1781686 100644 --- a/substrate/client/cli/Cargo.toml +++ b/substrate/client/cli/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] array-bytes = "6.1" chrono = "0.4.31" -clap = { version = "4.4.14", features = ["derive", "string", "wrap_help"] } +clap = { version = "4.4.16", features = ["derive", "string", "wrap_help"] } fdlimit = "0.3.0" futures = "0.3.21" itertools = "0.10.3" diff --git a/substrate/client/storage-monitor/Cargo.toml b/substrate/client/storage-monitor/Cargo.toml index 7185c62e276..17f1c42bccb 100644 --- a/substrate/client/storage-monitor/Cargo.toml +++ b/substrate/client/storage-monitor/Cargo.toml @@ -12,7 +12,7 @@ homepage = "https://substrate.io" workspace = true [dependencies] -clap = { version = "4.4.14", features = ["derive", "string"] } +clap = { version = "4.4.16", features = ["derive", "string"] } log = "0.4.17" fs4 = "0.7.0" sp-core = { path = "../../primitives/core" } diff --git a/substrate/frame/election-provider-support/solution-type/fuzzer/Cargo.toml b/substrate/frame/election-provider-support/solution-type/fuzzer/Cargo.toml index d64498de087..62316b27290 100644 --- a/substrate/frame/election-provider-support/solution-type/fuzzer/Cargo.toml +++ b/substrate/frame/election-provider-support/solution-type/fuzzer/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -clap = { version = "4.4.14", features = ["derive"] } +clap = { version = "4.4.16", features = ["derive"] } honggfuzz = "0.5" rand = { version = "0.8", features = ["small_rng", "std"] } diff --git a/substrate/primitives/npos-elections/fuzzer/Cargo.toml b/substrate/primitives/npos-elections/fuzzer/Cargo.toml index e7cfb75e54b..f98e41ae77a 100644 --- a/substrate/primitives/npos-elections/fuzzer/Cargo.toml +++ b/substrate/primitives/npos-elections/fuzzer/Cargo.toml @@ -17,7 +17,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -clap = { version = "4.4.14", features = ["derive"] } +clap = { version = "4.4.16", features = ["derive"] } honggfuzz = "0.5" rand = { version = "0.8", features = ["small_rng", "std"] } sp-npos-elections = { path = ".." } diff --git a/substrate/scripts/ci/node-template-release/Cargo.toml b/substrate/scripts/ci/node-template-release/Cargo.toml index b02f941811c..40ba629fb05 100644 --- a/substrate/scripts/ci/node-template-release/Cargo.toml +++ b/substrate/scripts/ci/node-template-release/Cargo.toml @@ -14,7 +14,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -clap = { version = "4.4.14", features = ["derive"] } +clap = { version = "4.4.16", features = ["derive"] } flate2 = "1.0" fs_extra = "1.3" glob = "0.3" diff --git a/substrate/utils/frame/benchmarking-cli/Cargo.toml b/substrate/utils/frame/benchmarking-cli/Cargo.toml index 21c5701b518..f7210cf768f 100644 --- a/substrate/utils/frame/benchmarking-cli/Cargo.toml +++ b/substrate/utils/frame/benchmarking-cli/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] array-bytes = "6.1" chrono = "0.4" -clap = { version = "4.4.14", features = ["derive"] } +clap = { version = "4.4.16", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.6.1" } comfy-table = { version = "7.0.1", default-features = false } handlebars = "4.2.2" diff --git a/substrate/utils/frame/frame-utilities-cli/Cargo.toml b/substrate/utils/frame/frame-utilities-cli/Cargo.toml index 886e17280b1..899f86f3cb4 100644 --- a/substrate/utils/frame/frame-utilities-cli/Cargo.toml +++ b/substrate/utils/frame/frame-utilities-cli/Cargo.toml @@ -14,7 +14,7 @@ readme = "README.md" workspace = true [dependencies] -clap = { version = "4.4.14", features = ["derive"] } +clap = { version = "4.4.16", features = ["derive"] } frame-support = { path = "../../../frame/support" } frame-system = { path = "../../../frame/system" } sc-cli = { path = "../../../client/cli" } diff --git a/substrate/utils/frame/generate-bags/node-runtime/Cargo.toml b/substrate/utils/frame/generate-bags/node-runtime/Cargo.toml index d2aaaff9a69..ba11fce18f8 100644 --- a/substrate/utils/frame/generate-bags/node-runtime/Cargo.toml +++ b/substrate/utils/frame/generate-bags/node-runtime/Cargo.toml @@ -17,4 +17,4 @@ kitchensink-runtime = { path = "../../../../bin/node/runtime" } generate-bags = { path = ".." } # third-party -clap = { version = "4.4.14", features = ["derive"] } +clap = { version = "4.4.16", features = ["derive"] } diff --git a/substrate/utils/frame/try-runtime/cli/Cargo.toml b/substrate/utils/frame/try-runtime/cli/Cargo.toml index b5bce36e3b7..ac515315bbe 100644 --- a/substrate/utils/frame/try-runtime/cli/Cargo.toml +++ b/substrate/utils/frame/try-runtime/cli/Cargo.toml @@ -38,7 +38,7 @@ frame-try-runtime = { path = "../../../../frame/try-runtime", optional = true } substrate-rpc-client = { path = "../../rpc/client" } async-trait = "0.1.74" -clap = { version = "4.4.14", features = ["derive"] } +clap = { version = "4.4.16", features = ["derive"] } hex = { version = "0.4.3", default-features = false } log = "0.4.17" parity-scale-codec = "3.6.1" -- GitLab From 36a83186376707e551e43966265fbcc3f1c4afcc Mon Sep 17 00:00:00 2001 From: Oliver Tale-Yazdi Date: Mon, 15 Jan 2024 15:53:35 +0100 Subject: [PATCH 168/191] Add missing crates to the workspace (#2932) Changes: - add missing member to the workspace - add CI script after the last attempt to merge it upstream failed https://github.com/paritytech/pipeline-scripts/pull/105 Two crates are excluded from the check since they are templates `substrate/frame/contracts/fixtures/build` and `substrate/frame/contracts/fixtures/contracts/common`. Hopefully this is the last time that some crates need to be added manually. ![meme](https://github.com/paritytech/polkadot-sdk/assets/10380170/984843ee-1c76-4126-a4fc-ff2ba1d47377) --------- Signed-off-by: Oliver Tale-Yazdi --- .github/scripts/check-workspace.py | 162 ++++++++++++++++++++++++++ .github/workflows/check-workspace.yml | 23 ++++ Cargo.toml | 1 + 3 files changed, 186 insertions(+) create mode 100644 .github/scripts/check-workspace.py create mode 100644 .github/workflows/check-workspace.yml diff --git a/.github/scripts/check-workspace.py b/.github/scripts/check-workspace.py new file mode 100644 index 00000000000..fb3b53acb0c --- /dev/null +++ b/.github/scripts/check-workspace.py @@ -0,0 +1,162 @@ +#!/usr/bin/env python3 + +# Ensures that: +# - all crates are added to the root workspace +# - local dependencies are resolved via `path` +# +# It does not check that the local paths resolve to the correct crate. This is already done by cargo. +# +# Must be called with a folder containing a `Cargo.toml` workspace file. + +import os +import sys +import toml +import argparse + +def parse_args(): + parser = argparse.ArgumentParser(description='Check Rust workspace integrity.') + + parser.add_argument('workspace_dir', help='The directory to check', metavar='workspace_dir', type=str, nargs=1) + parser.add_argument('--exclude', help='Exclude crate paths from the check', metavar='exclude', type=str, nargs='*', default=[]) + + args = parser.parse_args() + return (args.workspace_dir[0], args.exclude) + +def main(root, exclude): + workspace_crates = get_members(root, exclude) + all_crates = get_crates(root, exclude) + print(f'📦 Found {len(all_crates)} crates in total') + + check_missing(workspace_crates, all_crates) + check_links(all_crates) + +# Extract all members from a workspace. +# Return: list of all workspace paths +def get_members(workspace_dir, exclude): + print(f'🔎 Indexing workspace {os.path.abspath(workspace_dir)}') + + root_manifest_path = os.path.join(workspace_dir, "Cargo.toml") + if not os.path.exists(root_manifest_path): + print(f'❌ No root manifest found at {root_manifest}') + sys.exit(1) + + root_manifest = toml.load(root_manifest_path) + if not 'workspace' in root_manifest: + print(f'❌ No workspace found in root {root_manifest_path}') + sys.exit(1) + + if not 'members' in root_manifest['workspace']: + return [] + + members = [] + for member in root_manifest['workspace']['members']: + if member in exclude: + print(f'❌ Excluded member should not appear in the workspace {member}') + sys.exit(1) + members.append(member) + + return members + +# List all members of the workspace. +# Return: Map name -> (path, manifest) +def get_crates(workspace_dir, exclude_crates) -> dict: + crates = {} + + for root, dirs, files in os.walk(workspace_dir): + if "target" in root: + continue + for file in files: + if file != "Cargo.toml": + continue + + path = os.path.join(root, file) + with open(path, "r") as f: + content = f.read() + manifest = toml.loads(content) + + if 'workspace' in manifest: + if root != workspace_dir: + print("⏩ Excluded recursive workspace at %s" % path) + continue + + # Cut off the root path and the trailing /Cargo.toml. + path = path[len(workspace_dir)+1:-11] + name = manifest['package']['name'] + if path in exclude_crates: + print("⏩ Excluded crate %s at %s" % (name, path)) + continue + crates[name] = (path, manifest) + + return crates + +# Check that all crates are in the workspace. +def check_missing(workspace_crates, all_crates): + print(f'🔎 Checking for missing crates') + if len(workspace_crates) == len(all_crates): + print(f'✅ All {len(all_crates)} crates are in the workspace') + return + + missing = [] + # Find out which ones are missing. + for name, (path, manifest) in all_crates.items(): + if not path in workspace_crates: + missing.append([name, path, manifest]) + missing.sort() + + for name, path, _manifest in missing: + print("❌ %s in %s" % (name, path)) + print(f'😱 {len(all_crates) - len(workspace_crates)} crates are missing from the workspace') + sys.exit(1) + +# Check that all local dependencies are good. +def check_links(all_crates): + print(f'🔎 Checking for broken dependency links') + links = [] + broken = [] + + for name, (path, manifest) in all_crates.items(): + def check_deps(deps): + for dep in deps: + # Could be renamed: + dep_name = dep + if 'package' in deps[dep]: + dep_name = deps[dep]['package'] + if dep_name in all_crates: + links.append((name, dep_name)) + + if not 'path' in deps[dep]: + broken.append((name, dep_name, "crate must be linked via `path`")) + return + + def check_crate(deps): + to_checks = ['dependencies', 'dev-dependencies', 'build-dependencies'] + + for to_check in to_checks: + if to_check in deps: + check_deps(deps[to_check]) + + # There could possibly target dependant deps: + if 'target' in manifest: + # Target dependant deps can only have one level of nesting: + for _, target in manifest['target'].items(): + check_crate(target) + + check_crate(manifest) + + + + links.sort() + broken.sort() + + if len(broken) > 0: + for (l, r, reason) in broken: + print(f'❌ {l} -> {r} ({reason})') + + print("💥 %d out of %d links are broken" % (len(broken), len(links))) + sys.exit(1) + else: + print("✅ All %d internal dependency links are correct" % len(links)) + +if __name__ == "__main__": + args = parse_args() + main(args[0], args[1]) diff --git a/.github/workflows/check-workspace.yml b/.github/workflows/check-workspace.yml new file mode 100644 index 00000000000..3dd812d7d9b --- /dev/null +++ b/.github/workflows/check-workspace.yml @@ -0,0 +1,23 @@ +name: Check workspace + +on: + pull_request: + paths: + - "*.toml" + merge_group: + +jobs: + check-workspace: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.0 (22. Sep 2023) + + - name: install python deps + run: pip3 install toml + + - name: check integrity + run: > + python3 .github/scripts/check-workspace.py . + --exclude + "substrate/frame/contracts/fixtures/build" + "substrate/frame/contracts/fixtures/contracts/common" diff --git a/Cargo.toml b/Cargo.toml index 38cae6f640c..3afccc24992 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -105,6 +105,7 @@ members = [ "cumulus/parachains/runtimes/assets/test-utils", "cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo", "cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend", + "cumulus/parachains/runtimes/bridge-hubs/common", "cumulus/parachains/runtimes/bridge-hubs/test-utils", "cumulus/parachains/runtimes/collectives/collectives-westend", "cumulus/parachains/runtimes/contracts/contracts-rococo", -- GitLab From f2fbba3be1d7deaf7cfc731cea00552c212ddfcf Mon Sep 17 00:00:00 2001 From: PG Herveou Date: Mon, 15 Jan 2024 17:21:31 +0100 Subject: [PATCH 169/191] Contracts: stabilize sr25519 (#2920) Integration tests in ink!: https://github.com/paritytech/ink/tree/master/integration-tests/sr25519-verification --- prdoc/pr_2920.prdoc | 11 +++++++++++ substrate/frame/contracts/src/wasm/runtime.rs | 1 - 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 prdoc/pr_2920.prdoc diff --git a/prdoc/pr_2920.prdoc b/prdoc/pr_2920.prdoc new file mode 100644 index 00000000000..7745838ab5c --- /dev/null +++ b/prdoc/pr_2920.prdoc @@ -0,0 +1,11 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Contracts: Stabilize sr25519_verify host function + +doc: + - audience: Runtime Dev + description: | + Removed the `#[unstable]` attrribute on `sr25519_verify` host function. + +crates: ["pallet-contracts"] diff --git a/substrate/frame/contracts/src/wasm/runtime.rs b/substrate/frame/contracts/src/wasm/runtime.rs index 7b1e35ee1ad..a7f329005f9 100644 --- a/substrate/frame/contracts/src/wasm/runtime.rs +++ b/substrate/frame/contracts/src/wasm/runtime.rs @@ -2229,7 +2229,6 @@ pub mod env { /// Verify a sr25519 signature /// See [`pallet_contracts_uapi::HostFn::sr25519_verify`]. - #[unstable] fn sr25519_verify( ctx: _, memory: _, -- GitLab From 0c166ae0194b7337f1c151434483b78b31235549 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jan 2024 22:07:09 +0100 Subject: [PATCH 170/191] Bump lycheeverse/lychee-action (#2900) Bumps [lycheeverse/lychee-action](https://github.com/lycheeverse/lychee-action) from fdea7032675810093199f485fe075f057cc37b3e to c3089c702fbb949e3f7a8122be0c33c017904f9b.
Commits

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--------- Signed-off-by: dependabot[bot] Signed-off-by: Oliver Tale-Yazdi Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Sergejs Kostjucenko <85877331+sergejparity@users.noreply.github.com> Co-authored-by: Oliver Tale-Yazdi --- .config/lychee.toml | 4 ++++ .github/workflows/check-links.yml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.config/lychee.toml b/.config/lychee.toml index 70869465d67..200521ac41e 100644 --- a/.config/lychee.toml +++ b/.config/lychee.toml @@ -47,4 +47,8 @@ exclude = [ "https://w3f.github.io/parachain-implementers-guide/node/index.html", "https://w3f.github.io/parachain-implementers-guide/protocol-chain-selection.html", "https://w3f.github.io/parachain-implementers-guide/runtime/session_info.html", + + # Behind a captcha (code 403): + "https://iohk.io/en/blog/posts/2023/11/03/partner-chains-are-coming-to-cardano/", + "https://www.reddit.com/r/rust/comments/3spfh1/does_collect_allocate_more_than_once_while/", ] diff --git a/.github/workflows/check-links.yml b/.github/workflows/check-links.yml index d3865335c09..903d7a3fcb3 100644 --- a/.github/workflows/check-links.yml +++ b/.github/workflows/check-links.yml @@ -28,7 +28,7 @@ jobs: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.0 (22. Sep 2023) - name: Lychee link checker - uses: lycheeverse/lychee-action@fdea7032675810093199f485fe075f057cc37b3e # for v1.9.0 (5. Jan 2024) + uses: lycheeverse/lychee-action@c3089c702fbb949e3f7a8122be0c33c017904f9b # for v1.9.1 (10. Jan 2024) with: args: >- --config .config/lychee.toml -- GitLab From 1c2db1747e72a0d953a69e88569fa822eb94622a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Tue, 16 Jan 2024 01:19:17 +0100 Subject: [PATCH 171/191] Some random fixes (#2936) - Do not disable `std` feature in the integration tests - `contracts-fixtures` test should only check for `riscv` build when the feature is enabled --- .../emulated/common/Cargo.toml | 28 +++++++++---------- substrate/frame/contracts/fixtures/src/lib.rs | 1 + 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/cumulus/parachains/integration-tests/emulated/common/Cargo.toml b/cumulus/parachains/integration-tests/emulated/common/Cargo.toml index 8277b3d734f..2ee91e83585 100644 --- a/cumulus/parachains/integration-tests/emulated/common/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/common/Cargo.toml @@ -16,29 +16,29 @@ serde_json = "1.0.111" # Substrate grandpa = { package = "sc-consensus-grandpa", path = "../../../../../substrate/client/consensus/grandpa" } -sp-authority-discovery = { path = "../../../../../substrate/primitives/authority-discovery", default-features = false } -sp-runtime = { path = "../../../../../substrate/primitives/runtime", default-features = false } -frame-support = { path = "../../../../../substrate/frame/support", default-features = false } -sp-core = { path = "../../../../../substrate/primitives/core", default-features = false } -sp-consensus-babe = { path = "../../../../../substrate/primitives/consensus/babe", default-features = false } -pallet-assets = { path = "../../../../../substrate/frame/assets", default-features = false } -pallet-balances = { path = "../../../../../substrate/frame/balances", default-features = false } -pallet-message-queue = { path = "../../../../../substrate/frame/message-queue", default-features = false } -pallet-im-online = { path = "../../../../../substrate/frame/im-online", default-features = false } +sp-authority-discovery = { path = "../../../../../substrate/primitives/authority-discovery" } +sp-runtime = { path = "../../../../../substrate/primitives/runtime" } +frame-support = { path = "../../../../../substrate/frame/support" } +sp-core = { path = "../../../../../substrate/primitives/core" } +sp-consensus-babe = { path = "../../../../../substrate/primitives/consensus/babe" } +pallet-assets = { path = "../../../../../substrate/frame/assets" } +pallet-balances = { path = "../../../../../substrate/frame/balances" } +pallet-message-queue = { path = "../../../../../substrate/frame/message-queue" } +pallet-im-online = { path = "../../../../../substrate/frame/im-online" } beefy-primitives = { package = "sp-consensus-beefy", path = "../../../../../substrate/primitives/consensus/beefy" } # Polkadot polkadot-service = { path = "../../../../../polkadot/node/service", default-features = false, features = ["full-node"] } -polkadot-primitives = { path = "../../../../../polkadot/primitives", default-features = false } +polkadot-primitives = { path = "../../../../../polkadot/primitives" } polkadot-runtime-parachains = { path = "../../../../../polkadot/runtime/parachains" } -xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false } -pallet-xcm = { path = "../../../../../polkadot/xcm/pallet-xcm", default-features = false } +xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm" } +pallet-xcm = { path = "../../../../../polkadot/xcm/pallet-xcm" } # Cumulus parachains-common = { path = "../../../common" } cumulus-primitives-core = { path = "../../../../primitives/core" } -xcm-emulator = { path = "../../../../xcm/xcm-emulator", default-features = false } -cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-features = false } +xcm-emulator = { path = "../../../../xcm/xcm-emulator" } +cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue" } cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system" } asset-test-utils = { path = "../../../runtimes/assets/test-utils" } diff --git a/substrate/frame/contracts/fixtures/src/lib.rs b/substrate/frame/contracts/fixtures/src/lib.rs index 4d850d75624..e0d9d4f8bd5 100644 --- a/substrate/frame/contracts/fixtures/src/lib.rs +++ b/substrate/frame/contracts/fixtures/src/lib.rs @@ -70,6 +70,7 @@ mod test { fn out_dir_should_have_compiled_mocks() { let out_dir: std::path::PathBuf = env!("OUT_DIR").into(); assert!(out_dir.join("dummy.wasm").exists()); + #[cfg(feature = "riscv")] assert!(out_dir.join("dummy.polkavm").exists()); } } -- GitLab From 4c4963a1929b59cce2c81d755b440403019e836d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Jan 2024 01:19:37 +0100 Subject: [PATCH 172/191] Bump Swatinem/rust-cache from 2.7.2 to 2.7.3 (#2925) Bumps [Swatinem/rust-cache](https://github.com/swatinem/rust-cache) from 2.7.2 to 2.7.3.
Release notes

Sourced from Swatinem/rust-cache's releases.

v2.7.3

  • Work around upstream problem that causes cache saving to hang for minutes.

Full Changelog: https://github.com/Swatinem/rust-cache/compare/v2.7.2...v2.7.3

Changelog

Sourced from Swatinem/rust-cache's changelog.

Changelog

2.7.3

  • Work around upstream problem that causes cache saving to hang for minutes.

2.7.2

  • Only key by Cargo.toml and Cargo.lock files of workspace members.

2.7.1

  • Update toml parser to fix parsing errors.

2.7.0

  • Properly cache trybuild tests.

2.6.2

  • Fix toml parsing.

2.6.1

  • Fix hash contributions of Cargo.lock/Cargo.toml files.

2.6.0

  • Add "buildjet" as a second cache-provider backend.
  • Clean up sparse registry index.
  • Do not clean up src of -sys crates.
  • Remove .cargo/credentials.toml before saving.

2.5.1

  • Fix hash contribution of Cargo.lock.

2.5.0

  • feat: Rm workspace crates version before caching.
  • feat: Add hash of .cargo/config.toml to key.

2.4.0

  • Fix cache key stability.
  • Use 8 character hash components to reduce the key length, making it more readable.

2.3.0

  • Add cache-all-crates option, which enables caching of crates installed by workflows.

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=Swatinem/rust-cache&package-manager=github_actions&previous-version=2.7.2&new-version=2.7.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/check-publish.yml | 2 +- .github/workflows/claim-crates.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/check-publish.yml b/.github/workflows/check-publish.yml index 398cb732585..b16b3d4e5c5 100644 --- a/.github/workflows/check-publish.yml +++ b/.github/workflows/check-publish.yml @@ -15,7 +15,7 @@ jobs: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Rust Cache - uses: Swatinem/rust-cache@a22603398250b864f7190077025cf752307154dc # v2.7.2 + uses: Swatinem/rust-cache@23bce251a8cd2ffc3c1075eaa2367cf899916d84 # v2.7.3 with: cache-on-failure: true diff --git a/.github/workflows/claim-crates.yml b/.github/workflows/claim-crates.yml index 038ea213123..f3df0bce72d 100644 --- a/.github/workflows/claim-crates.yml +++ b/.github/workflows/claim-crates.yml @@ -13,7 +13,7 @@ jobs: - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Rust Cache - uses: Swatinem/rust-cache@a22603398250b864f7190077025cf752307154dc # v2.7.2 + uses: Swatinem/rust-cache@23bce251a8cd2ffc3c1075eaa2367cf899916d84 # v2.7.3 with: cache-on-failure: true -- GitLab From 2cb39f8dc90f3431bd011084862ffa14e618b987 Mon Sep 17 00:00:00 2001 From: Muharem Date: Tue, 16 Jan 2024 15:34:48 +0800 Subject: [PATCH 173/191] XCM WeightTrader: Swap Fee Asset for Native Asset (#1845) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implements an XCM executor `WeightTrader`, facilitating fee payments in any asset that can be exchanged for a native asset. A few constraints need to be observed: - `buy_weight` and `refund` operations must be atomic, as another weight trader implementation might be attempted in case of failure. - swap credit must be utilized since there isn’t an account to which an asset of some class can be deposited with a guarantee to meet the existential deposit requirement. Also, operating with credits enhances the efficiency of the weight trader - https://github.com/paritytech/polkadot-sdk/pull/1677 related PRs: - (depends) https://github.com/paritytech/polkadot-sdk/pull/2031 - (depends) https://github.com/paritytech/polkadot-sdk/pull/1677 - (caused) https://github.com/paritytech/polkadot-sdk/pull/1847 - (caused) https://github.com/paritytech/polkadot-sdk/pull/1876 // DONE: impl `OnUnbalanced` for a `fungible/s` credit // DONE: make the trader free from a concept of a native currency and drop few fallible conversions. related issue - https://github.com/paritytech/polkadot-sdk/issues/1842 // DONE: tests --------- Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> Co-authored-by: Liam Aharon --- Cargo.lock | 4 + .../assets/asset-hub-rococo/src/tests/send.rs | 75 --- .../assets/asset-hub-rococo/src/tests/swap.rs | 127 ++++ .../asset-hub-westend/src/tests/send.rs | 75 --- .../asset-hub-westend/src/tests/swap.rs | 127 ++++ .../bridges/bridge-hub-rococo/Cargo.toml | 1 + .../bridges/bridge-hub-rococo/src/lib.rs | 3 +- .../src/tests/asset_transfers.rs | 45 +- .../bridges/bridge-hub-westend/Cargo.toml | 1 + .../bridges/bridge-hub-westend/src/lib.rs | 3 +- .../src/tests/asset_transfers.rs | 43 ++ .../assets/asset-hub-rococo/src/lib.rs | 19 +- .../assets/asset-hub-rococo/src/xcm_config.rs | 47 +- .../assets/asset-hub-rococo/tests/tests.rs | 497 +++++++--------- .../assets/asset-hub-westend/src/lib.rs | 19 +- .../asset-hub-westend/src/xcm_config.rs | 47 +- .../assets/asset-hub-westend/tests/tests.rs | 491 +++++++--------- .../runtimes/assets/common/src/lib.rs | 10 + .../runtimes/assets/test-utils/Cargo.toml | 2 + .../test-utils/src/test_cases_over_bridge.rs | 77 ++- cumulus/primitives/utility/Cargo.toml | 3 + cumulus/primitives/utility/src/lib.rs | 270 ++++++++- cumulus/primitives/utility/src/tests/mod.rs | 17 + .../utility/src/tests/swap_first.rs | 551 ++++++++++++++++++ prdoc/pr_1845.prdoc | 16 + 25 files changed, 1739 insertions(+), 831 deletions(-) create mode 100644 cumulus/primitives/utility/src/tests/mod.rs create mode 100644 cumulus/primitives/utility/src/tests/swap_first.rs create mode 100644 prdoc/pr_1845.prdoc diff --git a/Cargo.lock b/Cargo.lock index aa773aa104a..6299bbfe51c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1066,6 +1066,7 @@ dependencies = [ "frame-support", "frame-system", "hex-literal", + "pallet-asset-conversion", "pallet-assets", "pallet-balances", "pallet-collator-selection", @@ -1973,6 +1974,7 @@ dependencies = [ "frame-support", "hex", "hex-literal", + "pallet-asset-conversion", "pallet-assets", "pallet-balances", "pallet-bridge-messages", @@ -2165,6 +2167,7 @@ dependencies = [ "cumulus-pallet-xcmp-queue", "emulated-integration-tests-common", "frame-support", + "pallet-asset-conversion", "pallet-assets", "pallet-balances", "pallet-bridge-messages", @@ -4095,6 +4098,7 @@ dependencies = [ "cumulus-primitives-core", "frame-support", "log", + "pallet-asset-conversion", "pallet-xcm-benchmarks", "parity-scale-codec", "polkadot-runtime-common", diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/send.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/send.rs index 7be0463d2ec..fcf4513859e 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/send.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/send.rs @@ -27,78 +27,3 @@ fn send_transact_as_superuser_from_relay_to_system_para_works() { Some(Weight::from_parts(1_019_445_000, 200_000)), ) } - -/// Parachain should be able to send XCM paying its fee with sufficient asset -/// in the System Parachain -#[test] -fn send_xcm_from_para_to_system_para_paying_fee_with_assets_works() { - let para_sovereign_account = AssetHubRococo::sovereign_account_id_of( - AssetHubRococo::sibling_location_of(PenpalA::para_id()), - ); - - // Force create and mint assets for Parachain's sovereign account - AssetHubRococo::force_create_and_mint_asset( - ASSET_ID, - ASSET_MIN_BALANCE, - true, - para_sovereign_account.clone(), - Some(Weight::from_parts(1_019_445_000, 200_000)), - ASSET_MIN_BALANCE * 1000000000, - ); - - // We just need a call that can pass the `SafeCallFilter` - // Call values are not relevant - let call = AssetHubRococo::force_create_asset_call( - ASSET_ID, - para_sovereign_account.clone(), - true, - ASSET_MIN_BALANCE, - ); - - let origin_kind = OriginKind::SovereignAccount; - let fee_amount = ASSET_MIN_BALANCE * 1000000; - let native_asset = - (X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), fee_amount).into(); - - let root_origin = ::RuntimeOrigin::root(); - let system_para_destination = PenpalA::sibling_location_of(AssetHubRococo::para_id()).into(); - let xcm = xcm_transact_paid_execution( - call, - origin_kind, - native_asset, - para_sovereign_account.clone(), - ); - - PenpalA::execute_with(|| { - assert_ok!(::PolkadotXcm::send( - root_origin, - bx!(system_para_destination), - bx!(xcm), - )); - - PenpalA::assert_xcm_pallet_sent(); - }); - - AssetHubRococo::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; - - AssetHubRococo::assert_xcmp_queue_success(Some(Weight::from_parts( - 15_594_564_000, - 562_893, - ))); - - assert_expected_events!( - AssetHubRococo, - vec![ - RuntimeEvent::Assets(pallet_assets::Event::Burned { asset_id, owner, balance }) => { - asset_id: *asset_id == ASSET_ID, - owner: *owner == para_sovereign_account, - balance: *balance == fee_amount, - }, - RuntimeEvent::Assets(pallet_assets::Event::Issued { asset_id, .. }) => { - asset_id: *asset_id == ASSET_ID, - }, - ] - ); - }); -} diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/swap.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/swap.rs index 3dcc51b75cc..b1af69a1cd1 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/swap.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/swap.rs @@ -270,3 +270,130 @@ fn cannot_create_pool_from_pool_assets() { ); }); } + +#[test] +fn pay_xcm_fee_with_some_asset_swapped_for_native() { + let asset_native = asset_hub_rococo_runtime::xcm_config::TokenLocation::get(); + let asset_one = MultiLocation { + parents: 0, + interior: X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), + }; + let penpal = AssetHubRococo::sovereign_account_id_of(AssetHubRococo::sibling_location_of( + PenpalA::para_id(), + )); + + AssetHubRococo::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + + // set up pool with ASSET_ID <> NATIVE pair + assert_ok!(::Assets::create( + ::RuntimeOrigin::signed(AssetHubRococoSender::get()), + ASSET_ID.into(), + AssetHubRococoSender::get().into(), + ASSET_MIN_BALANCE, + )); + assert!(::Assets::asset_exists(ASSET_ID)); + + assert_ok!(::Assets::mint( + ::RuntimeOrigin::signed(AssetHubRococoSender::get()), + ASSET_ID.into(), + AssetHubRococoSender::get().into(), + 3_000_000_000_000, + )); + + assert_ok!(::AssetConversion::create_pool( + ::RuntimeOrigin::signed(AssetHubRococoSender::get()), + Box::new(asset_native), + Box::new(asset_one), + )); + + assert_expected_events!( + AssetHubRococo, + vec![ + RuntimeEvent::AssetConversion(pallet_asset_conversion::Event::PoolCreated { .. }) => {}, + ] + ); + + assert_ok!(::AssetConversion::add_liquidity( + ::RuntimeOrigin::signed(AssetHubRococoSender::get()), + Box::new(asset_native), + Box::new(asset_one), + 1_000_000_000_000, + 2_000_000_000_000, + 0, + 0, + AssetHubRococoSender::get().into() + )); + + assert_expected_events!( + AssetHubRococo, + vec![ + RuntimeEvent::AssetConversion(pallet_asset_conversion::Event::LiquidityAdded {lp_token_minted, .. }) => { lp_token_minted: *lp_token_minted == 1414213562273, }, + ] + ); + + // ensure `penpal` sovereign account has no native tokens and mint some `ASSET_ID` + assert_eq!( + ::Balances::free_balance(penpal.clone()), + 0 + ); + + assert_ok!(::Assets::touch_other( + ::RuntimeOrigin::signed(AssetHubRococoSender::get()), + ASSET_ID.into(), + penpal.clone().into(), + )); + + assert_ok!(::Assets::mint( + ::RuntimeOrigin::signed(AssetHubRococoSender::get()), + ASSET_ID.into(), + penpal.clone().into(), + 10_000_000_000_000, + )); + }); + + PenpalA::execute_with(|| { + // send xcm transact from `penpal` account which as only `ASSET_ID` tokens on + // `AssetHubRococo` + let call = AssetHubRococo::force_create_asset_call( + ASSET_ID + 1000, + penpal.clone(), + true, + ASSET_MIN_BALANCE, + ); + + let penpal_root = ::RuntimeOrigin::root(); + let fee_amount = 4_000_000_000_000u128; + let asset_one = + (X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), fee_amount) + .into(); + let asset_hub_location = PenpalA::sibling_location_of(AssetHubRococo::para_id()).into(); + let xcm = xcm_transact_paid_execution( + call, + OriginKind::SovereignAccount, + asset_one, + penpal.clone(), + ); + + assert_ok!(::PolkadotXcm::send( + penpal_root, + bx!(asset_hub_location), + bx!(xcm), + )); + + PenpalA::assert_xcm_pallet_sent(); + }); + + AssetHubRococo::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + + AssetHubRococo::assert_xcmp_queue_success(None); + assert_expected_events!( + AssetHubRococo, + vec![ + RuntimeEvent::AssetConversion(pallet_asset_conversion::Event::SwapCreditExecuted { .. },) => {}, + RuntimeEvent::MessageQueue(pallet_message_queue::Event::Processed { success: true,.. }) => {}, + ] + ); + }); +} diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/send.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/send.rs index 4b98eeb0ed3..d943bafc379 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/send.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/send.rs @@ -27,78 +27,3 @@ fn send_transact_as_superuser_from_relay_to_system_para_works() { Some(Weight::from_parts(1_019_445_000, 200_000)), ) } - -/// Parachain should be able to send XCM paying its fee with sufficient asset -/// in the System Parachain -#[test] -fn send_xcm_from_para_to_system_para_paying_fee_with_assets_works() { - let para_sovereign_account = AssetHubWestend::sovereign_account_id_of( - AssetHubWestend::sibling_location_of(PenpalB::para_id()), - ); - - // Force create and mint assets for Parachain's sovereign account - AssetHubWestend::force_create_and_mint_asset( - ASSET_ID, - ASSET_MIN_BALANCE, - true, - para_sovereign_account.clone(), - Some(Weight::from_parts(1_019_445_000, 200_000)), - ASSET_MIN_BALANCE * 1000000000, - ); - - // We just need a call that can pass the `SafeCallFilter` - // Call values are not relevant - let call = AssetHubWestend::force_create_asset_call( - ASSET_ID, - para_sovereign_account.clone(), - true, - ASSET_MIN_BALANCE, - ); - - let origin_kind = OriginKind::SovereignAccount; - let fee_amount = ASSET_MIN_BALANCE * 1000000; - let native_asset = - (X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), fee_amount).into(); - - let root_origin = ::RuntimeOrigin::root(); - let system_para_destination = PenpalB::sibling_location_of(AssetHubWestend::para_id()).into(); - let xcm = xcm_transact_paid_execution( - call, - origin_kind, - native_asset, - para_sovereign_account.clone(), - ); - - PenpalB::execute_with(|| { - assert_ok!(::PolkadotXcm::send( - root_origin, - bx!(system_para_destination), - bx!(xcm), - )); - - PenpalB::assert_xcm_pallet_sent(); - }); - - AssetHubWestend::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; - - AssetHubWestend::assert_xcmp_queue_success(Some(Weight::from_parts( - 16_290_336_000, - 562_893, - ))); - - assert_expected_events!( - AssetHubWestend, - vec![ - RuntimeEvent::Assets(pallet_assets::Event::Burned { asset_id, owner, balance }) => { - asset_id: *asset_id == ASSET_ID, - owner: *owner == para_sovereign_account, - balance: *balance == fee_amount, - }, - RuntimeEvent::Assets(pallet_assets::Event::Issued { asset_id, .. }) => { - asset_id: *asset_id == ASSET_ID, - }, - ] - ); - }); -} diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/swap.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/swap.rs index 47b6ab01e8f..c768a1366fa 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/swap.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/swap.rs @@ -264,3 +264,130 @@ fn cannot_create_pool_from_pool_assets() { ); }); } + +#[test] +fn pay_xcm_fee_with_some_asset_swapped_for_native() { + let asset_native = asset_hub_westend_runtime::xcm_config::WestendLocation::get(); + let asset_one = MultiLocation { + parents: 0, + interior: X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), + }; + let penpal = AssetHubWestend::sovereign_account_id_of(AssetHubWestend::sibling_location_of( + PenpalB::para_id(), + )); + + AssetHubWestend::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + + // set up pool with ASSET_ID <> NATIVE pair + assert_ok!(::Assets::create( + ::RuntimeOrigin::signed(AssetHubWestendSender::get()), + ASSET_ID.into(), + AssetHubWestendSender::get().into(), + ASSET_MIN_BALANCE, + )); + assert!(::Assets::asset_exists(ASSET_ID)); + + assert_ok!(::Assets::mint( + ::RuntimeOrigin::signed(AssetHubWestendSender::get()), + ASSET_ID.into(), + AssetHubWestendSender::get().into(), + 3_000_000_000_000, + )); + + assert_ok!(::AssetConversion::create_pool( + ::RuntimeOrigin::signed(AssetHubWestendSender::get()), + Box::new(asset_native), + Box::new(asset_one), + )); + + assert_expected_events!( + AssetHubWestend, + vec![ + RuntimeEvent::AssetConversion(pallet_asset_conversion::Event::PoolCreated { .. }) => {}, + ] + ); + + assert_ok!(::AssetConversion::add_liquidity( + ::RuntimeOrigin::signed(AssetHubWestendSender::get()), + Box::new(asset_native), + Box::new(asset_one), + 1_000_000_000_000, + 2_000_000_000_000, + 0, + 0, + AssetHubWestendSender::get().into() + )); + + assert_expected_events!( + AssetHubWestend, + vec![ + RuntimeEvent::AssetConversion(pallet_asset_conversion::Event::LiquidityAdded {lp_token_minted, .. }) => { lp_token_minted: *lp_token_minted == 1414213562273, }, + ] + ); + + // ensure `penpal` sovereign account has no native tokens and mint some `ASSET_ID` + assert_eq!( + ::Balances::free_balance(penpal.clone()), + 0 + ); + + assert_ok!(::Assets::touch_other( + ::RuntimeOrigin::signed(AssetHubWestendSender::get()), + ASSET_ID.into(), + penpal.clone().into(), + )); + + assert_ok!(::Assets::mint( + ::RuntimeOrigin::signed(AssetHubWestendSender::get()), + ASSET_ID.into(), + penpal.clone().into(), + 10_000_000_000_000, + )); + }); + + PenpalB::execute_with(|| { + // send xcm transact from `penpal` account which as only `ASSET_ID` tokens on + // `AssetHubWestend` + let call = AssetHubWestend::force_create_asset_call( + ASSET_ID + 1000, + penpal.clone(), + true, + ASSET_MIN_BALANCE, + ); + + let penpal_root = ::RuntimeOrigin::root(); + let fee_amount = 4_000_000_000_000u128; + let asset_one = + (X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), fee_amount) + .into(); + let asset_hub_location = PenpalB::sibling_location_of(AssetHubWestend::para_id()).into(); + let xcm = xcm_transact_paid_execution( + call, + OriginKind::SovereignAccount, + asset_one, + penpal.clone(), + ); + + assert_ok!(::PolkadotXcm::send( + penpal_root, + bx!(asset_hub_location), + bx!(xcm), + )); + + PenpalB::assert_xcm_pallet_sent(); + }); + + AssetHubWestend::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + + AssetHubWestend::assert_xcmp_queue_success(None); + assert_expected_events!( + AssetHubWestend, + vec![ + RuntimeEvent::AssetConversion(pallet_asset_conversion::Event::SwapCreditExecuted { .. },) => {}, + RuntimeEvent::MessageQueue(pallet_message_queue::Event::Processed { success: true,.. }) => {}, + ] + ); + }); +} diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/Cargo.toml index 0904578b156..da09c674a03 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/Cargo.toml @@ -20,6 +20,7 @@ hex-literal = "0.4.1" sp-core = { path = "../../../../../../../substrate/primitives/core", default-features = false } frame-support = { path = "../../../../../../../substrate/frame/support", default-features = false } pallet-assets = { path = "../../../../../../../substrate/frame/assets", default-features = false } +pallet-asset-conversion = { path = "../../../../../../../substrate/frame/asset-conversion", default-features = false } pallet-balances = { path = "../../../../../../../substrate/frame/balances", default-features = false } pallet-message-queue = { path = "../../../../../../../substrate/frame/message-queue" } sp-runtime = { path = "../../../../../../../substrate/primitives/runtime", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/lib.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/lib.rs index 5127bd759dc..608aa388ce8 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/lib.rs @@ -61,7 +61,8 @@ pub use rococo_westend_system_emulated_network::{ rococo_emulated_chain::{genesis::ED as ROCOCO_ED, RococoRelayPallet as RococoPallet}, AssetHubRococoPara as AssetHubRococo, AssetHubRococoParaReceiver as AssetHubRococoReceiver, AssetHubRococoParaSender as AssetHubRococoSender, AssetHubWestendPara as AssetHubWestend, - AssetHubWestendParaReceiver as AssetHubWestendReceiver, BridgeHubRococoPara as BridgeHubRococo, + AssetHubWestendParaReceiver as AssetHubWestendReceiver, + AssetHubWestendParaSender as AssetHubWestendSender, BridgeHubRococoPara as BridgeHubRococo, BridgeHubRococoParaSender as BridgeHubRococoSender, BridgeHubWestendPara as BridgeHubWestend, RococoRelay as Rococo, RococoRelayReceiver as RococoReceiver, RococoRelaySender as RococoSender, diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/asset_transfers.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/asset_transfers.rs index 5a2111a9be9..8b5a72a8e62 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/asset_transfers.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/asset_transfers.rs @@ -49,6 +49,49 @@ fn send_rocs_from_asset_hub_rococo_to_asset_hub_westend() { AssetHubWestend::para_id(), ); + AssetHubWestend::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + + // setup a pool to pay xcm fees with `roc_at_asset_hub_westend` tokens + assert_ok!(::ForeignAssets::mint( + ::RuntimeOrigin::signed(AssetHubWestendSender::get()), + roc_at_asset_hub_westend.into(), + AssetHubWestendSender::get().into(), + 3_000_000_000_000, + )); + + assert_ok!(::AssetConversion::create_pool( + ::RuntimeOrigin::signed(AssetHubWestendSender::get()), + Box::new(Parent.into()), + Box::new(roc_at_asset_hub_westend), + )); + + assert_expected_events!( + AssetHubWestend, + vec![ + RuntimeEvent::AssetConversion(pallet_asset_conversion::Event::PoolCreated { .. }) => {}, + ] + ); + + assert_ok!(::AssetConversion::add_liquidity( + ::RuntimeOrigin::signed(AssetHubWestendSender::get()), + Box::new(Parent.into()), + Box::new(roc_at_asset_hub_westend), + 1_000_000_000_000, + 2_000_000_000_000, + 1, + 1, + AssetHubWestendSender::get().into() + )); + + assert_expected_events!( + AssetHubWestend, + vec![ + RuntimeEvent::AssetConversion(pallet_asset_conversion::Event::LiquidityAdded {..}) => {}, + ] + ); + }); + let rocs_in_reserve_on_ahr_before = ::account_data_of(sov_ahw_on_ahr.clone()).free; let sender_rocs_before = @@ -58,7 +101,7 @@ fn send_rocs_from_asset_hub_rococo_to_asset_hub_westend() { >::balance(roc_at_asset_hub_westend, &AssetHubWestendReceiver::get()) }); - let amount = ASSET_HUB_ROCOCO_ED * 1_000; + let amount = ASSET_HUB_ROCOCO_ED * 1_000_000; send_asset_from_asset_hub_rococo_to_asset_hub_westend(roc_at_asset_hub_rococo, amount); AssetHubWestend::execute_with(|| { type RuntimeEvent = ::RuntimeEvent; diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/Cargo.toml index 6dcb57f4161..e9b4f8fb180 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/Cargo.toml @@ -16,6 +16,7 @@ codec = { package = "parity-scale-codec", version = "3.4.0", default-features = # Substrate frame-support = { path = "../../../../../../../substrate/frame/support", default-features = false } pallet-assets = { path = "../../../../../../../substrate/frame/assets", default-features = false } +pallet-asset-conversion = { path = "../../../../../../../substrate/frame/asset-conversion", default-features = false } pallet-balances = { path = "../../../../../../../substrate/frame/balances", default-features = false } pallet-message-queue = { path = "../../../../../../../substrate/frame/message-queue" } sp-runtime = { path = "../../../../../../../substrate/primitives/runtime", default-features = false } diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/lib.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/lib.rs index 90a11d38f77..17255320f1d 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/lib.rs @@ -55,7 +55,8 @@ pub use rococo_westend_system_emulated_network::{ }, westend_emulated_chain::WestendRelayPallet as WestendPallet, AssetHubRococoPara as AssetHubRococo, AssetHubRococoParaReceiver as AssetHubRococoReceiver, - AssetHubWestendPara as AssetHubWestend, AssetHubWestendParaReceiver as AssetHubWestendReceiver, + AssetHubRococoParaSender as AssetHubRococoSender, AssetHubWestendPara as AssetHubWestend, + AssetHubWestendParaReceiver as AssetHubWestendReceiver, AssetHubWestendParaSender as AssetHubWestendSender, BridgeHubRococoPara as BridgeHubRococo, BridgeHubWestendPara as BridgeHubWestend, BridgeHubWestendParaSender as BridgeHubWestendSender, WestendRelay as Westend, diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/asset_transfers.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/asset_transfers.rs index 21f4b4ee235..a4b2719e9fd 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/asset_transfers.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/asset_transfers.rs @@ -48,6 +48,49 @@ fn send_wnds_from_asset_hub_westend_to_asset_hub_rococo() { AssetHubRococo::para_id(), ); + AssetHubRococo::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + + // setup a pool to pay xcm fees with `wnd_at_asset_hub_rococo` tokens + assert_ok!(::ForeignAssets::mint( + ::RuntimeOrigin::signed(AssetHubRococoSender::get()), + wnd_at_asset_hub_rococo.into(), + AssetHubRococoSender::get().into(), + 3_000_000_000_000, + )); + + assert_ok!(::AssetConversion::create_pool( + ::RuntimeOrigin::signed(AssetHubRococoSender::get()), + Box::new(Parent.into()), + Box::new(wnd_at_asset_hub_rococo), + )); + + assert_expected_events!( + AssetHubRococo, + vec![ + RuntimeEvent::AssetConversion(pallet_asset_conversion::Event::PoolCreated { .. }) => {}, + ] + ); + + assert_ok!(::AssetConversion::add_liquidity( + ::RuntimeOrigin::signed(AssetHubRococoSender::get()), + Box::new(Parent.into()), + Box::new(wnd_at_asset_hub_rococo), + 1_000_000_000_000, + 2_000_000_000_000, + 1, + 1, + AssetHubRococoSender::get().into() + )); + + assert_expected_events!( + AssetHubRococo, + vec![ + RuntimeEvent::AssetConversion(pallet_asset_conversion::Event::LiquidityAdded {..}) => {}, + ] + ); + }); + let wnds_in_reserve_on_ahw_before = ::account_data_of(sov_ahr_on_ahw.clone()).free; let sender_wnds_before = diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs index 3010cbc69fa..8cfa4565187 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs @@ -312,7 +312,7 @@ impl pallet_assets::Config for Runtime { type BenchmarkHelper = (); } -/// Union fungibles implementation for `Assets`` and `ForeignAssets`. +/// Union fungibles implementation for `Assets` and `ForeignAssets`. pub type LocalAndForeignAssets = fungibles::UnionOf< Assets, ForeignAssets, @@ -324,18 +324,21 @@ pub type LocalAndForeignAssets = fungibles::UnionOf< AccountId, >; +/// Union fungibles implementation for [`LocalAndForeignAssets`] and `Balances`. +pub type NativeAndAssets = fungible::UnionOf< + Balances, + LocalAndForeignAssets, + TargetFromLeft, + MultiLocation, + AccountId, +>; + impl pallet_asset_conversion::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Balance = Balance; type HigherPrecisionBalance = sp_core::U256; type AssetKind = MultiLocation; - type Assets = fungible::UnionOf< - Balances, - LocalAndForeignAssets, - TargetFromLeft, - Self::AssetKind, - Self::AccountId, - >; + type Assets = NativeAndAssets; type PoolId = (Self::AssetKind, Self::AssetKind); type PoolLocator = pallet_asset_conversion::WithFirstAsset; diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs index 121e213b57f..f88d1066488 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs @@ -15,17 +15,21 @@ use super::{ AccountId, AllPalletsWithSystem, Assets, Authorship, Balance, Balances, BaseDeliveryFee, - FeeAssetId, ForeignAssets, ForeignAssetsInstance, ParachainInfo, ParachainSystem, PolkadotXcm, - PoolAssets, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, ToWestendXcmRouter, - TransactionByteFee, TrustBackedAssetsInstance, WeightToFee, XcmpQueue, + CollatorSelection, FeeAssetId, ForeignAssets, ForeignAssetsInstance, ParachainInfo, + ParachainSystem, PolkadotXcm, PoolAssets, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, + ToWestendXcmRouter, TransactionByteFee, TrustBackedAssetsInstance, WeightToFee, XcmpQueue, }; use assets_common::{ local_and_foreign_assets::MatchesLocalAndForeignAssetsMultiLocation, matching::{FromNetwork, FromSiblingParachain, IsForeignConcreteAsset}, + TrustBackedAssetsAsMultiLocation, }; use frame_support::{ match_types, parameter_types, - traits::{ConstU32, Contains, Equals, Everything, Nothing, PalletInfoAccess}, + traits::{ + tokens::imbalance::ResolveAssetTo, ConstU32, Contains, Equals, Everything, Nothing, + PalletInfoAccess, + }, }; use frame_system::EnsureRoot; use pallet_xcm::XcmPassthrough; @@ -73,6 +77,7 @@ parameter_types! { pub PoolAssetsPalletLocation: MultiLocation = PalletInstance(::index() as u8).into(); pub CheckingAccount: AccountId = PolkadotXcm::check_account(); + pub StakingPot: AccountId = CollatorSelection::account_id(); pub const GovernanceLocation: MultiLocation = MultiLocation::parent(); pub TreasuryAccount: AccountId = TREASURY_PALLET_ID.into_account_truncating(); pub RelayTreasuryLocation: MultiLocation = (Parent, PalletInstance(rococo_runtime_constants::TREASURY_PALLET_ID)).into(); @@ -550,31 +555,17 @@ impl xcm_executor::Config for XcmConfig { >; type Trader = ( UsingComponents>, - // This trader allows to pay with `is_sufficient=true` "Trust Backed" assets from dedicated - // `pallet_assets` instance - `Assets`. - cumulus_primitives_utility::TakeFirstAssetTrader< + cumulus_primitives_utility::SwapFirstAssetTrader< + TokenLocation, + crate::AssetConversion, + WeightToFee, + crate::NativeAndAssets, + ( + TrustBackedAssetsAsMultiLocation, + ForeignAssetsConvertedConcreteId, + ), + ResolveAssetTo, AccountId, - AssetFeeAsExistentialDepositMultiplierFeeCharger, - TrustBackedAssetsConvertedConcreteId, - Assets, - cumulus_primitives_utility::XcmFeesTo32ByteAccount< - FungiblesTransactor, - AccountId, - XcmAssetFeesReceiver, - >, - >, - // This trader allows to pay with `is_sufficient=true` "Foreign" assets from dedicated - // `pallet_assets` instance - `ForeignAssets`. - cumulus_primitives_utility::TakeFirstAssetTrader< - AccountId, - ForeignAssetFeeAsExistentialDepositMultiplierFeeCharger, - ForeignAssetsConvertedConcreteId, - ForeignAssets, - cumulus_primitives_utility::XcmFeesTo32ByteAccount< - ForeignFungiblesTransactor, - AccountId, - XcmAssetFeesReceiver, - >, >, ); type ResponseHandler = PolkadotXcm; diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/tests/tests.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/tests/tests.rs index 42c91cc8ea6..c67374126d3 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/tests/tests.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/tests/tests.rs @@ -17,34 +17,38 @@ //! Tests for the Rococo Assets Hub chain. -use asset_hub_rococo_runtime::xcm_config::{ - AssetFeeAsExistentialDepositMultiplierFeeCharger, TokenLocation, - TrustBackedAssetsPalletLocation, +use asset_hub_rococo_runtime::{ + xcm_config, + xcm_config::{bridging, ForeignCreatorsSovereignAccountOf, LocationToAccountId, TokenLocation}, + AllPalletsWithoutSystem, MetadataDepositBase, MetadataDepositPerByte, RuntimeCall, + RuntimeEvent, ToWestendXcmRouterInstance, XcmpQueue, }; pub use asset_hub_rococo_runtime::{ - xcm_config::{ - self, bridging, CheckingAccount, ForeignCreatorsSovereignAccountOf, LocationToAccountId, - XcmConfig, - }, - AllPalletsWithoutSystem, AssetDeposit, Assets, Balances, ExistentialDeposit, ForeignAssets, - ForeignAssetsInstance, MetadataDepositBase, MetadataDepositPerByte, ParachainSystem, Runtime, - RuntimeCall, RuntimeEvent, SessionKeys, System, ToWestendXcmRouterInstance, - TrustBackedAssetsInstance, XcmpQueue, + xcm_config::{CheckingAccount, TrustBackedAssetsPalletLocation, XcmConfig}, + AssetConversion, AssetDeposit, Assets, Balances, CollatorSelection, ExistentialDeposit, + ForeignAssets, ForeignAssetsInstance, ParachainSystem, Runtime, SessionKeys, System, + TrustBackedAssetsInstance, }; use asset_test_utils::{ test_cases_over_bridge::TestBridgingConfig, CollatorSessionKey, CollatorSessionKeys, ExtBuilder, }; use codec::{Decode, Encode}; -use cumulus_primitives_utility::ChargeWeightInFungibles; use frame_support::{ - assert_noop, assert_ok, - traits::fungibles::InspectEnumerable, + assert_ok, + traits::{ + fungible::{Inspect, Mutate}, + fungibles::{ + Create, Inspect as FungiblesInspect, InspectEnumerable, Mutate as FungiblesMutate, + }, + }, weights::{Weight, WeightToFee as WeightToFeeT}, }; use parachains_common::{ - rococo::fee::WeightToFee, AccountId, AssetIdForTrustBackedAssets, AuraId, Balance, + rococo::{currency::UNITS, fee::WeightToFee}, + AccountId, AssetIdForTrustBackedAssets, AuraId, Balance, }; use sp_runtime::traits::MaybeEquivalence; +use std::convert::Into; use xcm::latest::prelude::*; use xcm_executor::traits::{Identity, JustTry, WeightTrader}; @@ -69,7 +73,7 @@ fn collator_session_keys() -> CollatorSessionKeys { } #[test] -fn test_asset_xcm_trader() { +fn test_buy_and_refund_weight_in_native() { ExtBuilder::::default() .with_collators(vec![AccountId::from(ALICE)]) .with_session_keys(vec![( @@ -79,77 +83,55 @@ fn test_asset_xcm_trader() { )]) .build() .execute_with(|| { - // We need root origin to create a sufficient asset - let minimum_asset_balance = 3333333_u128; - let local_asset_id = 1; - assert_ok!(Assets::force_create( - RuntimeHelper::root_origin(), - local_asset_id.into(), - AccountId::from(ALICE).into(), - true, - minimum_asset_balance - )); + let bob: AccountId = SOME_ASSET_ADMIN.into(); + let staking_pot = CollatorSelection::account_id(); + let native_location = TokenLocation::get(); + let initial_balance = 200 * UNITS; - // We first mint enough asset for the account to exist for assets - assert_ok!(Assets::mint( - RuntimeHelper::origin_of(AccountId::from(ALICE)), - local_asset_id.into(), - AccountId::from(ALICE).into(), - minimum_asset_balance - )); - - // get asset id as multilocation - let asset_multilocation = - AssetIdForTrustBackedAssetsConvert::convert_back(&local_asset_id).unwrap(); - - // Set Alice as block author, who will receive fees - RuntimeHelper::run_to_block(2, AccountId::from(ALICE)); - - // We are going to buy 4e9 weight - let bought = Weight::from_parts(4_000_000_000u64, 0); + assert_ok!(Balances::mint_into(&bob, initial_balance)); + assert_ok!(Balances::mint_into(&staking_pot, initial_balance)); - // Lets calculate amount needed - let asset_amount_needed = - AssetFeeAsExistentialDepositMultiplierFeeCharger::charge_weight_in_fungibles( - local_asset_id, - bought, - ) - .expect("failed to compute"); - - // Lets pay with: asset_amount_needed + asset_amount_extra - let asset_amount_extra = 100_u128; - let asset: MultiAsset = - (asset_multilocation, asset_amount_needed + asset_amount_extra).into(); + // keep initial total issuance to assert later. + let total_issuance = Balances::total_issuance(); - let mut trader = ::Trader::new(); + // prepare input to buy weight. + let weight = Weight::from_parts(4_000_000_000, 0); + let fee = WeightToFee::weight_to_fee(&weight); + let extra_amount = 100; let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; + let payment: MultiAsset = (native_location, fee + extra_amount).into(); - // Lets buy_weight and make sure buy_weight does not return an error - let unused_assets = trader.buy_weight(bought, asset.into(), &ctx).expect("Expected Ok"); - // Check whether a correct amount of unused assets is returned - assert_ok!( - unused_assets.ensure_contains(&(asset_multilocation, asset_amount_extra).into()) - ); - - // Drop trader + // init trader and buy weight. + let mut trader = ::Trader::new(); + let unused_asset = + trader.buy_weight(weight, payment.into(), &ctx).expect("Expected Ok"); + + // assert. + let unused_amount = + unused_asset.fungible.get(&native_location.into()).map_or(0, |a| *a); + assert_eq!(unused_amount, extra_amount); + assert_eq!(Balances::total_issuance(), total_issuance); + + // prepare input to refund weight. + let refund_weight = Weight::from_parts(1_000_000_000, 0); + let refund = WeightToFee::weight_to_fee(&refund_weight); + + // refund. + let actual_refund = trader.refund_weight(refund_weight, &ctx).unwrap(); + assert_eq!(actual_refund, (native_location, refund).into()); + + // assert. + assert_eq!(Balances::balance(&staking_pot), initial_balance); + // only after `trader` is dropped we expect the fee to be resolved into the treasury + // account. drop(trader); - - // Make sure author(Alice) has received the amount - assert_eq!( - Assets::balance(local_asset_id, AccountId::from(ALICE)), - minimum_asset_balance + asset_amount_needed - ); - - // We also need to ensure the total supply increased - assert_eq!( - Assets::total_supply(local_asset_id), - minimum_asset_balance + asset_amount_needed - ); - }); + assert_eq!(Balances::balance(&staking_pot), initial_balance + fee - refund); + assert_eq!(Balances::total_issuance(), total_issuance + fee - refund); + }) } #[test] -fn test_asset_xcm_trader_with_refund() { +fn test_buy_and_refund_weight_with_swap_local_asset_xcm_trader() { ExtBuilder::::default() .with_collators(vec![AccountId::from(ALICE)]) .with_session_keys(vec![( @@ -159,77 +141,93 @@ fn test_asset_xcm_trader_with_refund() { )]) .build() .execute_with(|| { - // We need root origin to create a sufficient asset - // We set existential deposit to be identical to the one for Balances first - assert_ok!(Assets::force_create( - RuntimeHelper::root_origin(), - 1.into(), - AccountId::from(ALICE).into(), - true, - ExistentialDeposit::get() + let bob: AccountId = SOME_ASSET_ADMIN.into(); + let staking_pot = CollatorSelection::account_id(); + let asset_1: u32 = 1; + let native_location = TokenLocation::get(); + let asset_1_location = + AssetIdForTrustBackedAssetsConvert::convert_back(&asset_1).unwrap(); + // bob's initial balance for native and `asset1` assets. + let initial_balance = 200 * UNITS; + // liquidity for both arms of (native, asset1) pool. + let pool_liquidity = 100 * UNITS; + + // init asset, balances and pool. + assert_ok!(>::create(asset_1, bob.clone(), true, 10)); + + assert_ok!(Assets::mint_into(asset_1, &bob, initial_balance)); + assert_ok!(Balances::mint_into(&bob, initial_balance)); + assert_ok!(Balances::mint_into(&staking_pot, initial_balance)); + + assert_ok!(AssetConversion::create_pool( + RuntimeHelper::origin_of(bob.clone()), + Box::new(native_location), + Box::new(asset_1_location) )); - // We first mint enough asset for the account to exist for assets - assert_ok!(Assets::mint( - RuntimeHelper::origin_of(AccountId::from(ALICE)), - 1.into(), - AccountId::from(ALICE).into(), - ExistentialDeposit::get() + assert_ok!(AssetConversion::add_liquidity( + RuntimeHelper::origin_of(bob.clone()), + Box::new(native_location), + Box::new(asset_1_location), + pool_liquidity, + pool_liquidity, + 1, + 1, + bob, )); - let mut trader = ::Trader::new(); - let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; - - // Set Alice as block author, who will receive fees - RuntimeHelper::run_to_block(2, AccountId::from(ALICE)); - - // We are going to buy 4e9 weight - let bought = Weight::from_parts(4_000_000_000u64, 0); - - let asset_multilocation = AssetIdForTrustBackedAssetsConvert::convert_back(&1).unwrap(); - - // lets calculate amount needed - let amount_bought = WeightToFee::weight_to_fee(&bought); - - let asset: MultiAsset = (asset_multilocation, amount_bought).into(); - - // Make sure buy_weight does not return an error - assert_ok!(trader.buy_weight(bought, asset.clone().into(), &ctx)); - - // Make sure again buy_weight does return an error - // This assert relies on the fact, that we use `TakeFirstAssetTrader` in `WeightTrader` - // tuple chain, which cannot be called twice - assert_noop!(trader.buy_weight(bought, asset.into(), &ctx), XcmError::TooExpensive); - - // We actually use half of the weight - let weight_used = bought / 2; + // keep initial total issuance to assert later. + let asset_total_issuance = Assets::total_issuance(asset_1); + let native_total_issuance = Balances::total_issuance(); - // Make sure refurnd works. - let amount_refunded = WeightToFee::weight_to_fee(&(bought - weight_used)); - - assert_eq!( - trader.refund_weight(bought - weight_used, &ctx), - Some((asset_multilocation, amount_refunded).into()) - ); + // prepare input to buy weight. + let weight = Weight::from_parts(4_000_000_000, 0); + let fee = WeightToFee::weight_to_fee(&weight); + let asset_fee = + AssetConversion::get_amount_in(&fee, &pool_liquidity, &pool_liquidity).unwrap(); + let extra_amount = 100; + let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; + let payment: MultiAsset = (asset_1_location, asset_fee + extra_amount).into(); - // Drop trader + // init trader and buy weight. + let mut trader = ::Trader::new(); + let unused_asset = + trader.buy_weight(weight, payment.into(), &ctx).expect("Expected Ok"); + + // assert. + let unused_amount = + unused_asset.fungible.get(&asset_1_location.into()).map_or(0, |a| *a); + assert_eq!(unused_amount, extra_amount); + assert_eq!(Assets::total_issuance(asset_1), asset_total_issuance + asset_fee); + + // prepare input to refund weight. + let refund_weight = Weight::from_parts(1_000_000_000, 0); + let refund = WeightToFee::weight_to_fee(&refund_weight); + let (reserve1, reserve2) = + AssetConversion::get_reserves(native_location, asset_1_location).unwrap(); + let asset_refund = + AssetConversion::get_amount_out(&refund, &reserve1, &reserve2).unwrap(); + + // refund. + let actual_refund = trader.refund_weight(refund_weight, &ctx).unwrap(); + assert_eq!(actual_refund, (asset_1_location, asset_refund).into()); + + // assert. + assert_eq!(Balances::balance(&staking_pot), initial_balance); + // only after `trader` is dropped we expect the fee to be resolved into the treasury + // account. drop(trader); - - // We only should have paid for half of the bought weight - let fees_paid = WeightToFee::weight_to_fee(&weight_used); - + assert_eq!(Balances::balance(&staking_pot), initial_balance + fee - refund); assert_eq!( - Assets::balance(1, AccountId::from(ALICE)), - ExistentialDeposit::get() + fees_paid + Assets::total_issuance(asset_1), + asset_total_issuance + asset_fee - asset_refund ); - - // We also need to ensure the total supply increased - assert_eq!(Assets::total_supply(1), ExistentialDeposit::get() + fees_paid); - }); + assert_eq!(Balances::total_issuance(), native_total_issuance); + }) } #[test] -fn test_asset_xcm_trader_refund_not_possible_since_amount_less_than_ed() { +fn test_buy_and_refund_weight_with_swap_foreign_asset_xcm_trader() { ExtBuilder::::default() .with_collators(vec![AccountId::from(ALICE)]) .with_session_keys(vec![( @@ -239,169 +237,96 @@ fn test_asset_xcm_trader_refund_not_possible_since_amount_less_than_ed() { )]) .build() .execute_with(|| { - // We need root origin to create a sufficient asset - // We set existential deposit to be identical to the one for Balances first - assert_ok!(Assets::force_create( - RuntimeHelper::root_origin(), - 1.into(), - AccountId::from(ALICE).into(), + let bob: AccountId = SOME_ASSET_ADMIN.into(); + let staking_pot = CollatorSelection::account_id(); + let native_location = TokenLocation::get(); + let foreign_location = + MultiLocation { parents: 1, interior: X2(Parachain(1234), GeneralIndex(12345)) }; + // bob's initial balance for native and `asset1` assets. + let initial_balance = 200 * UNITS; + // liquidity for both arms of (native, asset1) pool. + let pool_liquidity = 100 * UNITS; + + // init asset, balances and pool. + assert_ok!(>::create( + foreign_location, + bob.clone(), true, - ExistentialDeposit::get() + 10 )); - let mut trader = ::Trader::new(); - let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; - - // Set Alice as block author, who will receive fees - RuntimeHelper::run_to_block(2, AccountId::from(ALICE)); - - // We are going to buy small amount - let bought = Weight::from_parts(500_000_000u64, 0); - - let asset_multilocation = AssetIdForTrustBackedAssetsConvert::convert_back(&1).unwrap(); + assert_ok!(ForeignAssets::mint_into(foreign_location, &bob, initial_balance)); + assert_ok!(Balances::mint_into(&bob, initial_balance)); + assert_ok!(Balances::mint_into(&staking_pot, initial_balance)); - let amount_bought = WeightToFee::weight_to_fee(&bought); - - assert!( - amount_bought < ExistentialDeposit::get(), - "we are testing what happens when the amount does not exceed ED" - ); - - let asset: MultiAsset = (asset_multilocation, amount_bought).into(); - - // Buy weight should return an error - assert_noop!(trader.buy_weight(bought, asset.into(), &ctx), XcmError::TooExpensive); - - // not credited since the ED is higher than this value - assert_eq!(Assets::balance(1, AccountId::from(ALICE)), 0); - - // We also need to ensure the total supply did not increase - assert_eq!(Assets::total_supply(1), 0); - }); -} - -#[test] -fn test_that_buying_ed_refund_does_not_refund() { - ExtBuilder::::default() - .with_collators(vec![AccountId::from(ALICE)]) - .with_session_keys(vec![( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, - )]) - .build() - .execute_with(|| { - // We need root origin to create a sufficient asset - // We set existential deposit to be identical to the one for Balances first - assert_ok!(Assets::force_create( - RuntimeHelper::root_origin(), - 1.into(), - AccountId::from(ALICE).into(), - true, - ExistentialDeposit::get() + assert_ok!(AssetConversion::create_pool( + RuntimeHelper::origin_of(bob.clone()), + Box::new(native_location), + Box::new(foreign_location) )); - let mut trader = ::Trader::new(); - let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; - - // Set Alice as block author, who will receive fees - RuntimeHelper::run_to_block(2, AccountId::from(ALICE)); - - // We are gonna buy ED - let bought = Weight::from_parts(ExistentialDeposit::get().try_into().unwrap(), 0); - - let asset_multilocation = AssetIdForTrustBackedAssetsConvert::convert_back(&1).unwrap(); - - let amount_bought = WeightToFee::weight_to_fee(&bought); - - assert!( - amount_bought < ExistentialDeposit::get(), - "we are testing what happens when the amount does not exceed ED" - ); - - // We know we will have to buy at least ED, so lets make sure first it will - // fail with a payment of less than ED - let asset: MultiAsset = (asset_multilocation, amount_bought).into(); - assert_noop!(trader.buy_weight(bought, asset.into(), &ctx), XcmError::TooExpensive); - - // Now lets buy ED at least - let asset: MultiAsset = (asset_multilocation, ExistentialDeposit::get()).into(); - - // Buy weight should work - assert_ok!(trader.buy_weight(bought, asset.into(), &ctx)); - - // Should return None. We have a specific check making sure we dont go below ED for - // drop payment - assert_eq!(trader.refund_weight(bought, &ctx), None); - - // Drop trader - drop(trader); - - // Make sure author(Alice) has received the amount - assert_eq!(Assets::balance(1, AccountId::from(ALICE)), ExistentialDeposit::get()); - - // We also need to ensure the total supply increased - assert_eq!(Assets::total_supply(1), ExistentialDeposit::get()); - }); -} - -#[test] -fn test_asset_xcm_trader_not_possible_for_non_sufficient_assets() { - ExtBuilder::::default() - .with_collators(vec![AccountId::from(ALICE)]) - .with_session_keys(vec![( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, - )]) - .build() - .execute_with(|| { - // Create a non-sufficient asset with specific existential deposit - let minimum_asset_balance = 1_000_000_u128; - assert_ok!(Assets::force_create( - RuntimeHelper::root_origin(), - 1.into(), - AccountId::from(ALICE).into(), - false, - minimum_asset_balance + assert_ok!(AssetConversion::add_liquidity( + RuntimeHelper::origin_of(bob.clone()), + Box::new(native_location), + Box::new(foreign_location), + pool_liquidity, + pool_liquidity, + 1, + 1, + bob, )); - // We first mint enough asset for the account to exist for assets - assert_ok!(Assets::mint( - RuntimeHelper::origin_of(AccountId::from(ALICE)), - 1.into(), - AccountId::from(ALICE).into(), - minimum_asset_balance - )); + // keep initial total issuance to assert later. + let asset_total_issuance = ForeignAssets::total_issuance(foreign_location); + let native_total_issuance = Balances::total_issuance(); - let mut trader = ::Trader::new(); + // prepare input to buy weight. + let weight = Weight::from_parts(4_000_000_000, 0); + let fee = WeightToFee::weight_to_fee(&weight); + let asset_fee = + AssetConversion::get_amount_in(&fee, &pool_liquidity, &pool_liquidity).unwrap(); + let extra_amount = 100; let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; + let payment: MultiAsset = (foreign_location, asset_fee + extra_amount).into(); - // Set Alice as block author, who will receive fees - RuntimeHelper::run_to_block(2, AccountId::from(ALICE)); - - // We are going to buy 4e9 weight - let bought = Weight::from_parts(4_000_000_000u64, 0); - - // lets calculate amount needed - let asset_amount_needed = WeightToFee::weight_to_fee(&bought); - - let asset_multilocation = AssetIdForTrustBackedAssetsConvert::convert_back(&1).unwrap(); - - let asset: MultiAsset = (asset_multilocation, asset_amount_needed).into(); + // init trader and buy weight. + let mut trader = ::Trader::new(); + let unused_asset = + trader.buy_weight(weight, payment.into(), &ctx).expect("Expected Ok"); - // Make sure again buy_weight does return an error - assert_noop!(trader.buy_weight(bought, asset.into(), &ctx), XcmError::TooExpensive); + // assert. + let unused_amount = + unused_asset.fungible.get(&foreign_location.into()).map_or(0, |a| *a); + assert_eq!(unused_amount, extra_amount); + assert_eq!( + ForeignAssets::total_issuance(foreign_location), + asset_total_issuance + asset_fee + ); - // Drop trader + // prepare input to refund weight. + let refund_weight = Weight::from_parts(1_000_000_000, 0); + let refund = WeightToFee::weight_to_fee(&refund_weight); + let (reserve1, reserve2) = + AssetConversion::get_reserves(native_location, foreign_location).unwrap(); + let asset_refund = + AssetConversion::get_amount_out(&refund, &reserve1, &reserve2).unwrap(); + + // refund. + let actual_refund = trader.refund_weight(refund_weight, &ctx).unwrap(); + assert_eq!(actual_refund, (foreign_location, asset_refund).into()); + + // assert. + assert_eq!(Balances::balance(&staking_pot), initial_balance); + // only after `trader` is dropped we expect the fee to be resolved into the treasury + // account. drop(trader); - - // Make sure author(Alice) has NOT received the amount - assert_eq!(Assets::balance(1, AccountId::from(ALICE)), minimum_asset_balance); - - // We also need to ensure the total supply NOT increased - assert_eq!(Assets::total_supply(1), minimum_asset_balance); - }); + assert_eq!(Balances::balance(&staking_pot), initial_balance + fee - refund); + assert_eq!( + ForeignAssets::total_issuance(foreign_location), + asset_total_issuance + asset_fee - asset_refund + ); + assert_eq!(Balances::total_issuance(), native_total_issuance); + }) } #[test] diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs index e0dff0c4516..8543500fa23 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs @@ -295,7 +295,7 @@ impl pallet_assets::Config for Runtime { type BenchmarkHelper = (); } -/// Union fungibles implementation for `Assets`` and `ForeignAssets`. +/// Union fungibles implementation for `Assets` and `ForeignAssets`. pub type LocalAndForeignAssets = fungibles::UnionOf< Assets, ForeignAssets, @@ -307,18 +307,21 @@ pub type LocalAndForeignAssets = fungibles::UnionOf< AccountId, >; +/// Union fungibles implementation for [`LocalAndForeignAssets`] and `Balances`. +pub type NativeAndAssets = fungible::UnionOf< + Balances, + LocalAndForeignAssets, + TargetFromLeft, + MultiLocation, + AccountId, +>; + impl pallet_asset_conversion::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Balance = Balance; type HigherPrecisionBalance = sp_core::U256; type AssetKind = MultiLocation; - type Assets = fungible::UnionOf< - Balances, - LocalAndForeignAssets, - TargetFromLeft, - Self::AssetKind, - Self::AccountId, - >; + type Assets = NativeAndAssets; type PoolId = (Self::AssetKind, Self::AssetKind); type PoolLocator = pallet_asset_conversion::WithFirstAsset; diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs index cb2fedeb146..28876d1d454 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs @@ -15,17 +15,21 @@ use super::{ AccountId, AllPalletsWithSystem, Assets, Authorship, Balance, Balances, BaseDeliveryFee, - FeeAssetId, ForeignAssets, ForeignAssetsInstance, ParachainInfo, ParachainSystem, PolkadotXcm, - PoolAssets, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, ToRococoXcmRouter, - TransactionByteFee, TrustBackedAssetsInstance, WeightToFee, XcmpQueue, + CollatorSelection, FeeAssetId, ForeignAssets, ForeignAssetsInstance, ParachainInfo, + ParachainSystem, PolkadotXcm, PoolAssets, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, + ToRococoXcmRouter, TransactionByteFee, TrustBackedAssetsInstance, WeightToFee, XcmpQueue, }; use assets_common::{ local_and_foreign_assets::MatchesLocalAndForeignAssetsMultiLocation, matching::{FromSiblingParachain, IsForeignConcreteAsset}, + TrustBackedAssetsAsMultiLocation, }; use frame_support::{ match_types, parameter_types, - traits::{ConstU32, Contains, Equals, Everything, Nothing, PalletInfoAccess}, + traits::{ + tokens::imbalance::ResolveAssetTo, ConstU32, Contains, Equals, Everything, Nothing, + PalletInfoAccess, + }, }; use frame_system::EnsureRoot; use pallet_xcm::XcmPassthrough; @@ -70,6 +74,7 @@ parameter_types! { pub PoolAssetsPalletLocation: MultiLocation = PalletInstance(::index() as u8).into(); pub CheckingAccount: AccountId = PolkadotXcm::check_account(); + pub StakingPot: AccountId = CollatorSelection::account_id(); pub TreasuryAccount: AccountId = TREASURY_PALLET_ID.into_account_truncating(); pub RelayTreasuryLocation: MultiLocation = (Parent, PalletInstance(westend_runtime_constants::TREASURY_PALLET_ID)).into(); } @@ -567,31 +572,17 @@ impl xcm_executor::Config for XcmConfig { >; type Trader = ( UsingComponents>, - // This trader allows to pay with `is_sufficient=true` "Trust Backed" assets from dedicated - // `pallet_assets` instance - `Assets`. - cumulus_primitives_utility::TakeFirstAssetTrader< + cumulus_primitives_utility::SwapFirstAssetTrader< + WestendLocation, + crate::AssetConversion, + WeightToFee, + crate::NativeAndAssets, + ( + TrustBackedAssetsAsMultiLocation, + ForeignAssetsConvertedConcreteId, + ), + ResolveAssetTo, AccountId, - AssetFeeAsExistentialDepositMultiplierFeeCharger, - TrustBackedAssetsConvertedConcreteId, - Assets, - cumulus_primitives_utility::XcmFeesTo32ByteAccount< - FungiblesTransactor, - AccountId, - XcmAssetFeesReceiver, - >, - >, - // This trader allows to pay with `is_sufficient=true` "Foreign" assets from dedicated - // `pallet_assets` instance - `ForeignAssets`. - cumulus_primitives_utility::TakeFirstAssetTrader< - AccountId, - ForeignAssetFeeAsExistentialDepositMultiplierFeeCharger, - ForeignAssetsConvertedConcreteId, - ForeignAssets, - cumulus_primitives_utility::XcmFeesTo32ByteAccount< - ForeignFungiblesTransactor, - AccountId, - XcmAssetFeesReceiver, - >, >, ); type ResponseHandler = PolkadotXcm; diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs index 0aaf1d91879..c50a8f3661d 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs @@ -18,28 +18,36 @@ //! Tests for the Westmint (Westend Assets Hub) chain. use asset_hub_westend_runtime::{ + xcm_config, xcm_config::{ - self, bridging, AssetFeeAsExistentialDepositMultiplierFeeCharger, CheckingAccount, - ForeignCreatorsSovereignAccountOf, LocationToAccountId, TrustBackedAssetsPalletLocation, - WestendLocation, XcmConfig, + bridging, ForeignCreatorsSovereignAccountOf, LocationToAccountId, WestendLocation, }, - AllPalletsWithoutSystem, AssetDeposit, Assets, Balances, ExistentialDeposit, ForeignAssets, - ForeignAssetsInstance, MetadataDepositBase, MetadataDepositPerByte, ParachainSystem, - PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, SessionKeys, - ToRococoXcmRouterInstance, TrustBackedAssetsInstance, XcmpQueue, + AllPalletsWithoutSystem, MetadataDepositBase, MetadataDepositPerByte, PolkadotXcm, RuntimeCall, + RuntimeEvent, RuntimeOrigin, ToRococoXcmRouterInstance, XcmpQueue, +}; +pub use asset_hub_westend_runtime::{ + xcm_config::{CheckingAccount, TrustBackedAssetsPalletLocation, XcmConfig}, + AssetConversion, AssetDeposit, Assets, Balances, CollatorSelection, ExistentialDeposit, + ForeignAssets, ForeignAssetsInstance, ParachainSystem, Runtime, SessionKeys, System, + TrustBackedAssetsInstance, }; use asset_test_utils::{ test_cases_over_bridge::TestBridgingConfig, CollatorSessionKey, CollatorSessionKeys, ExtBuilder, }; use codec::{Decode, Encode}; -use cumulus_primitives_utility::ChargeWeightInFungibles; use frame_support::{ - assert_noop, assert_ok, - traits::fungibles::InspectEnumerable, + assert_ok, + traits::{ + fungible::{Inspect, Mutate}, + fungibles::{ + Create, Inspect as FungiblesInspect, InspectEnumerable, Mutate as FungiblesMutate, + }, + }, weights::{Weight, WeightToFee as WeightToFeeT}, }; use parachains_common::{ - westend::fee::WeightToFee, AccountId, AssetIdForTrustBackedAssets, AuraId, Balance, + westend::{currency::UNITS, fee::WeightToFee}, + AccountId, AssetIdForTrustBackedAssets, AuraId, Balance, }; use sp_runtime::traits::MaybeEquivalence; use std::convert::Into; @@ -67,7 +75,7 @@ fn collator_session_keys() -> CollatorSessionKeys { } #[test] -fn test_asset_xcm_trader() { +fn test_buy_and_refund_weight_in_native() { ExtBuilder::::default() .with_collators(vec![AccountId::from(ALICE)]) .with_session_keys(vec![( @@ -77,77 +85,55 @@ fn test_asset_xcm_trader() { )]) .build() .execute_with(|| { - // We need root origin to create a sufficient asset - let minimum_asset_balance = 3333333_u128; - let local_asset_id = 1; - assert_ok!(Assets::force_create( - RuntimeHelper::root_origin(), - local_asset_id.into(), - AccountId::from(ALICE).into(), - true, - minimum_asset_balance - )); + let bob: AccountId = SOME_ASSET_ADMIN.into(); + let staking_pot = CollatorSelection::account_id(); + let native_location = WestendLocation::get(); + let initial_balance = 200 * UNITS; - // We first mint enough asset for the account to exist for assets - assert_ok!(Assets::mint( - RuntimeHelper::origin_of(AccountId::from(ALICE)), - local_asset_id.into(), - AccountId::from(ALICE).into(), - minimum_asset_balance - )); - - // get asset id as multilocation - let asset_multilocation = - AssetIdForTrustBackedAssetsConvert::convert_back(&local_asset_id).unwrap(); - - // Set Alice as block author, who will receive fees - RuntimeHelper::run_to_block(2, AccountId::from(ALICE)); - - // We are going to buy 4e9 weight - let bought = Weight::from_parts(4_000_000_000u64, 0); - - // Lets calculate amount needed - let asset_amount_needed = - AssetFeeAsExistentialDepositMultiplierFeeCharger::charge_weight_in_fungibles( - local_asset_id, - bought, - ) - .expect("failed to compute"); + assert_ok!(Balances::mint_into(&bob, initial_balance)); + assert_ok!(Balances::mint_into(&staking_pot, initial_balance)); - // Lets pay with: asset_amount_needed + asset_amount_extra - let asset_amount_extra = 100_u128; - let asset: MultiAsset = - (asset_multilocation, asset_amount_needed + asset_amount_extra).into(); + // keep initial total issuance to assert later. + let total_issuance = Balances::total_issuance(); - let mut trader = ::Trader::new(); + // prepare input to buy weight. + let weight = Weight::from_parts(4_000_000_000, 0); + let fee = WeightToFee::weight_to_fee(&weight); + let extra_amount = 100; let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; + let payment: MultiAsset = (native_location, fee + extra_amount).into(); - // Lets buy_weight and make sure buy_weight does not return an error - let unused_assets = trader.buy_weight(bought, asset.into(), &ctx).expect("Expected Ok"); - // Check whether a correct amount of unused assets is returned - assert_ok!( - unused_assets.ensure_contains(&(asset_multilocation, asset_amount_extra).into()) - ); - - // Drop trader + // init trader and buy weight. + let mut trader = ::Trader::new(); + let unused_asset = + trader.buy_weight(weight, payment.into(), &ctx).expect("Expected Ok"); + + // assert. + let unused_amount = + unused_asset.fungible.get(&native_location.into()).map_or(0, |a| *a); + assert_eq!(unused_amount, extra_amount); + assert_eq!(Balances::total_issuance(), total_issuance); + + // prepare input to refund weight. + let refund_weight = Weight::from_parts(1_000_000_000, 0); + let refund = WeightToFee::weight_to_fee(&refund_weight); + + // refund. + let actual_refund = trader.refund_weight(refund_weight, &ctx).unwrap(); + assert_eq!(actual_refund, (native_location, refund).into()); + + // assert. + assert_eq!(Balances::balance(&staking_pot), initial_balance); + // only after `trader` is dropped we expect the fee to be resolved into the treasury + // account. drop(trader); - - // Make sure author(Alice) has received the amount - assert_eq!( - Assets::balance(local_asset_id, AccountId::from(ALICE)), - minimum_asset_balance + asset_amount_needed - ); - - // We also need to ensure the total supply increased - assert_eq!( - Assets::total_supply(local_asset_id), - minimum_asset_balance + asset_amount_needed - ); - }); + assert_eq!(Balances::balance(&staking_pot), initial_balance + fee - refund); + assert_eq!(Balances::total_issuance(), total_issuance + fee - refund); + }) } #[test] -fn test_asset_xcm_trader_with_refund() { +fn test_buy_and_refund_weight_with_swap_local_asset_xcm_trader() { ExtBuilder::::default() .with_collators(vec![AccountId::from(ALICE)]) .with_session_keys(vec![( @@ -157,76 +143,93 @@ fn test_asset_xcm_trader_with_refund() { )]) .build() .execute_with(|| { - // We need root origin to create a sufficient asset - // We set existential deposit to be identical to the one for Balances first - assert_ok!(Assets::force_create( - RuntimeHelper::root_origin(), - 1.into(), - AccountId::from(ALICE).into(), - true, - ExistentialDeposit::get() + let bob: AccountId = SOME_ASSET_ADMIN.into(); + let staking_pot = CollatorSelection::account_id(); + let asset_1: u32 = 1; + let native_location = WestendLocation::get(); + let asset_1_location = + AssetIdForTrustBackedAssetsConvert::convert_back(&asset_1).unwrap(); + // bob's initial balance for native and `asset1` assets. + let initial_balance = 200 * UNITS; + // liquidity for both arms of (native, asset1) pool. + let pool_liquidity = 100 * UNITS; + + // init asset, balances and pool. + assert_ok!(>::create(asset_1, bob.clone(), true, 10)); + + assert_ok!(Assets::mint_into(asset_1, &bob, initial_balance)); + assert_ok!(Balances::mint_into(&bob, initial_balance)); + assert_ok!(Balances::mint_into(&staking_pot, initial_balance)); + + assert_ok!(AssetConversion::create_pool( + RuntimeHelper::origin_of(bob.clone()), + Box::new(native_location), + Box::new(asset_1_location) )); - // We first mint enough asset for the account to exist for assets - assert_ok!(Assets::mint( - RuntimeHelper::origin_of(AccountId::from(ALICE)), - 1.into(), - AccountId::from(ALICE).into(), - ExistentialDeposit::get() + assert_ok!(AssetConversion::add_liquidity( + RuntimeHelper::origin_of(bob.clone()), + Box::new(native_location), + Box::new(asset_1_location), + pool_liquidity, + pool_liquidity, + 1, + 1, + bob, )); - let mut trader = ::Trader::new(); - let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; - - // Set Alice as block author, who will receive fees - RuntimeHelper::run_to_block(2, AccountId::from(ALICE)); - - // We are going to buy 4e9 weight - let bought = Weight::from_parts(4_000_000_000u64, 0); - let asset_multilocation = AssetIdForTrustBackedAssetsConvert::convert_back(&1).unwrap(); - - // lets calculate amount needed - let amount_bought = WeightToFee::weight_to_fee(&bought); - - let asset: MultiAsset = (asset_multilocation, amount_bought).into(); + // keep initial total issuance to assert later. + let asset_total_issuance = Assets::total_issuance(asset_1); + let native_total_issuance = Balances::total_issuance(); - // Make sure buy_weight does not return an error - assert_ok!(trader.buy_weight(bought, asset.clone().into(), &ctx)); - - // Make sure again buy_weight does return an error - // This assert relies on the fact, that we use `TakeFirstAssetTrader` in `WeightTrader` - // tuple chain, which cannot be called twice - assert_noop!(trader.buy_weight(bought, asset.into(), &ctx), XcmError::TooExpensive); - - // We actually use half of the weight - let weight_used = bought / 2; - - // Make sure refurnd works. - let amount_refunded = WeightToFee::weight_to_fee(&(bought - weight_used)); - - assert_eq!( - trader.refund_weight(bought - weight_used, &ctx), - Some((asset_multilocation, amount_refunded).into()) - ); + // prepare input to buy weight. + let weight = Weight::from_parts(4_000_000_000, 0); + let fee = WeightToFee::weight_to_fee(&weight); + let asset_fee = + AssetConversion::get_amount_in(&fee, &pool_liquidity, &pool_liquidity).unwrap(); + let extra_amount = 100; + let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; + let payment: MultiAsset = (asset_1_location, asset_fee + extra_amount).into(); - // Drop trader + // init trader and buy weight. + let mut trader = ::Trader::new(); + let unused_asset = + trader.buy_weight(weight, payment.into(), &ctx).expect("Expected Ok"); + + // assert. + let unused_amount = + unused_asset.fungible.get(&asset_1_location.into()).map_or(0, |a| *a); + assert_eq!(unused_amount, extra_amount); + assert_eq!(Assets::total_issuance(asset_1), asset_total_issuance + asset_fee); + + // prepare input to refund weight. + let refund_weight = Weight::from_parts(1_000_000_000, 0); + let refund = WeightToFee::weight_to_fee(&refund_weight); + let (reserve1, reserve2) = + AssetConversion::get_reserves(native_location, asset_1_location).unwrap(); + let asset_refund = + AssetConversion::get_amount_out(&refund, &reserve1, &reserve2).unwrap(); + + // refund. + let actual_refund = trader.refund_weight(refund_weight, &ctx).unwrap(); + assert_eq!(actual_refund, (asset_1_location, asset_refund).into()); + + // assert. + assert_eq!(Balances::balance(&staking_pot), initial_balance); + // only after `trader` is dropped we expect the fee to be resolved into the treasury + // account. drop(trader); - - // We only should have paid for half of the bought weight - let fees_paid = WeightToFee::weight_to_fee(&weight_used); - + assert_eq!(Balances::balance(&staking_pot), initial_balance + fee - refund); assert_eq!( - Assets::balance(1, AccountId::from(ALICE)), - ExistentialDeposit::get() + fees_paid + Assets::total_issuance(asset_1), + asset_total_issuance + asset_fee - asset_refund ); - - // We also need to ensure the total supply increased - assert_eq!(Assets::total_supply(1), ExistentialDeposit::get() + fees_paid); - }); + assert_eq!(Balances::total_issuance(), native_total_issuance); + }) } #[test] -fn test_asset_xcm_trader_refund_not_possible_since_amount_less_than_ed() { +fn test_buy_and_refund_weight_with_swap_foreign_asset_xcm_trader() { ExtBuilder::::default() .with_collators(vec![AccountId::from(ALICE)]) .with_session_keys(vec![( @@ -236,168 +239,96 @@ fn test_asset_xcm_trader_refund_not_possible_since_amount_less_than_ed() { )]) .build() .execute_with(|| { - // We need root origin to create a sufficient asset - // We set existential deposit to be identical to the one for Balances first - assert_ok!(Assets::force_create( - RuntimeHelper::root_origin(), - 1.into(), - AccountId::from(ALICE).into(), + let bob: AccountId = SOME_ASSET_ADMIN.into(); + let staking_pot = CollatorSelection::account_id(); + let native_location = WestendLocation::get(); + let foreign_location = + MultiLocation { parents: 1, interior: X2(Parachain(1234), GeneralIndex(12345)) }; + // bob's initial balance for native and `asset1` assets. + let initial_balance = 200 * UNITS; + // liquidity for both arms of (native, asset1) pool. + let pool_liquidity = 100 * UNITS; + + // init asset, balances and pool. + assert_ok!(>::create( + foreign_location, + bob.clone(), true, - ExistentialDeposit::get() + 10 )); - let mut trader = ::Trader::new(); - let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; - - // Set Alice as block author, who will receive fees - RuntimeHelper::run_to_block(2, AccountId::from(ALICE)); - - // We are going to buy small amount - let bought = Weight::from_parts(500_000_000u64, 0); - - let asset_multilocation = AssetIdForTrustBackedAssetsConvert::convert_back(&1).unwrap(); - - let amount_bought = WeightToFee::weight_to_fee(&bought); + assert_ok!(ForeignAssets::mint_into(foreign_location, &bob, initial_balance)); + assert_ok!(Balances::mint_into(&bob, initial_balance)); + assert_ok!(Balances::mint_into(&staking_pot, initial_balance)); - assert!( - amount_bought < ExistentialDeposit::get(), - "we are testing what happens when the amount does not exceed ED" - ); - - let asset: MultiAsset = (asset_multilocation, amount_bought).into(); - - // Buy weight should return an error - assert_noop!(trader.buy_weight(bought, asset.into(), &ctx), XcmError::TooExpensive); - - // not credited since the ED is higher than this value - assert_eq!(Assets::balance(1, AccountId::from(ALICE)), 0); - - // We also need to ensure the total supply did not increase - assert_eq!(Assets::total_supply(1), 0); - }); -} - -#[test] -fn test_that_buying_ed_refund_does_not_refund() { - ExtBuilder::::default() - .with_collators(vec![AccountId::from(ALICE)]) - .with_session_keys(vec![( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, - )]) - .build() - .execute_with(|| { - // We need root origin to create a sufficient asset - // We set existential deposit to be identical to the one for Balances first - assert_ok!(Assets::force_create( - RuntimeHelper::root_origin(), - 1.into(), - AccountId::from(ALICE).into(), - true, - ExistentialDeposit::get() + assert_ok!(AssetConversion::create_pool( + RuntimeHelper::origin_of(bob.clone()), + Box::new(native_location), + Box::new(foreign_location) )); - let mut trader = ::Trader::new(); - let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; - - // Set Alice as block author, who will receive fees - RuntimeHelper::run_to_block(2, AccountId::from(ALICE)); - - let bought = Weight::from_parts(500_000_000u64, 0); - - let asset_multilocation = AssetIdForTrustBackedAssetsConvert::convert_back(&1).unwrap(); - - let amount_bought = WeightToFee::weight_to_fee(&bought); - - assert!( - amount_bought < ExistentialDeposit::get(), - "we are testing what happens when the amount does not exceed ED" - ); - - // We know we will have to buy at least ED, so lets make sure first it will - // fail with a payment of less than ED - let asset: MultiAsset = (asset_multilocation, amount_bought).into(); - assert_noop!(trader.buy_weight(bought, asset.into(), &ctx), XcmError::TooExpensive); - - // Now lets buy ED at least - let asset: MultiAsset = (asset_multilocation, ExistentialDeposit::get()).into(); - - // Buy weight should work - assert_ok!(trader.buy_weight(bought, asset.into(), &ctx)); - - // Should return None. We have a specific check making sure we dont go below ED for - // drop payment - assert_eq!(trader.refund_weight(bought, &ctx), None); - - // Drop trader - drop(trader); - - // Make sure author(Alice) has received the amount - assert_eq!(Assets::balance(1, AccountId::from(ALICE)), ExistentialDeposit::get()); - - // We also need to ensure the total supply increased - assert_eq!(Assets::total_supply(1), ExistentialDeposit::get()); - }); -} - -#[test] -fn test_asset_xcm_trader_not_possible_for_non_sufficient_assets() { - ExtBuilder::::default() - .with_collators(vec![AccountId::from(ALICE)]) - .with_session_keys(vec![( - AccountId::from(ALICE), - AccountId::from(ALICE), - SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, - )]) - .build() - .execute_with(|| { - // Create a non-sufficient asset with specific existential deposit - let minimum_asset_balance = 1_000_000_u128; - assert_ok!(Assets::force_create( - RuntimeHelper::root_origin(), - 1.into(), - AccountId::from(ALICE).into(), - false, - minimum_asset_balance + assert_ok!(AssetConversion::add_liquidity( + RuntimeHelper::origin_of(bob.clone()), + Box::new(native_location), + Box::new(foreign_location), + pool_liquidity, + pool_liquidity, + 1, + 1, + bob, )); - // We first mint enough asset for the account to exist for assets - assert_ok!(Assets::mint( - RuntimeHelper::origin_of(AccountId::from(ALICE)), - 1.into(), - AccountId::from(ALICE).into(), - minimum_asset_balance - )); + // keep initial total issuance to assert later. + let asset_total_issuance = ForeignAssets::total_issuance(foreign_location); + let native_total_issuance = Balances::total_issuance(); - let mut trader = ::Trader::new(); + // prepare input to buy weight. + let weight = Weight::from_parts(4_000_000_000, 0); + let fee = WeightToFee::weight_to_fee(&weight); + let asset_fee = + AssetConversion::get_amount_in(&fee, &pool_liquidity, &pool_liquidity).unwrap(); + let extra_amount = 100; let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; + let payment: MultiAsset = (foreign_location, asset_fee + extra_amount).into(); - // Set Alice as block author, who will receive fees - RuntimeHelper::run_to_block(2, AccountId::from(ALICE)); - - // We are going to buy 4e9 weight - let bought = Weight::from_parts(4_000_000_000u64, 0); - - // lets calculate amount needed - let asset_amount_needed = WeightToFee::weight_to_fee(&bought); - - let asset_multilocation = AssetIdForTrustBackedAssetsConvert::convert_back(&1).unwrap(); - - let asset: MultiAsset = (asset_multilocation, asset_amount_needed).into(); + // init trader and buy weight. + let mut trader = ::Trader::new(); + let unused_asset = + trader.buy_weight(weight, payment.into(), &ctx).expect("Expected Ok"); - // Make sure again buy_weight does return an error - assert_noop!(trader.buy_weight(bought, asset.into(), &ctx), XcmError::TooExpensive); + // assert. + let unused_amount = + unused_asset.fungible.get(&foreign_location.into()).map_or(0, |a| *a); + assert_eq!(unused_amount, extra_amount); + assert_eq!( + ForeignAssets::total_issuance(foreign_location), + asset_total_issuance + asset_fee + ); - // Drop trader + // prepare input to refund weight. + let refund_weight = Weight::from_parts(1_000_000_000, 0); + let refund = WeightToFee::weight_to_fee(&refund_weight); + let (reserve1, reserve2) = + AssetConversion::get_reserves(native_location, foreign_location).unwrap(); + let asset_refund = + AssetConversion::get_amount_out(&refund, &reserve1, &reserve2).unwrap(); + + // refund. + let actual_refund = trader.refund_weight(refund_weight, &ctx).unwrap(); + assert_eq!(actual_refund, (foreign_location, asset_refund).into()); + + // assert. + assert_eq!(Balances::balance(&staking_pot), initial_balance); + // only after `trader` is dropped we expect the fee to be resolved into the treasury + // account. drop(trader); - - // Make sure author(Alice) has NOT received the amount - assert_eq!(Assets::balance(1, AccountId::from(ALICE)), minimum_asset_balance); - - // We also need to ensure the total supply NOT increased - assert_eq!(Assets::total_supply(1), minimum_asset_balance); - }); + assert_eq!(Balances::balance(&staking_pot), initial_balance + fee - refund); + assert_eq!( + ForeignAssets::total_issuance(foreign_location), + asset_total_issuance + asset_fee - asset_refund + ); + assert_eq!(Balances::total_issuance(), native_total_issuance); + }) } #[test] diff --git a/cumulus/parachains/runtimes/assets/common/src/lib.rs b/cumulus/parachains/runtimes/assets/common/src/lib.rs index 15327f51b2a..b0e47143929 100644 --- a/cumulus/parachains/runtimes/assets/common/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/common/src/lib.rs @@ -47,6 +47,16 @@ pub type TrustBackedAssetsConvertedConcreteId = + MatchedConvertedConcreteId< + MultiLocationForAssetId, + Balance, + StartsWith, + Identity, + JustTry, + >; + /// [`MatchedConvertedConcreteId`] converter dedicated for storing `AssetId` as `MultiLocation`. pub type MultiLocationConvertedConcreteId = MatchedConvertedConcreteId< diff --git a/cumulus/parachains/runtimes/assets/test-utils/Cargo.toml b/cumulus/parachains/runtimes/assets/test-utils/Cargo.toml index a3ed3759600..1b863499f04 100644 --- a/cumulus/parachains/runtimes/assets/test-utils/Cargo.toml +++ b/cumulus/parachains/runtimes/assets/test-utils/Cargo.toml @@ -16,6 +16,7 @@ codec = { package = "parity-scale-codec", version = "3.0.0", default-features = frame-support = { path = "../../../../../substrate/frame/support", default-features = false } frame-system = { path = "../../../../../substrate/frame/system", default-features = false } pallet-assets = { path = "../../../../../substrate/frame/assets", default-features = false } +pallet-asset-conversion = { path = "../../../../../substrate/frame/asset-conversion", default-features = false } pallet-balances = { path = "../../../../../substrate/frame/balances", default-features = false } pallet-session = { path = "../../../../../substrate/frame/session", default-features = false } sp-consensus-aura = { path = "../../../../../substrate/primitives/consensus/aura", default-features = false } @@ -64,6 +65,7 @@ std = [ "cumulus-test-relay-sproof-builder/std", "frame-support/std", "frame-system/std", + "pallet-asset-conversion/std", "pallet-assets/std", "pallet-balances/std", "pallet-collator-selection/std", diff --git a/cumulus/parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs b/cumulus/parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs index 8007b275cb5..d7441880426 100644 --- a/cumulus/parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs +++ b/cumulus/parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs @@ -30,6 +30,7 @@ use parachains_runtimes_test_utils::{ ValidatorIdOf, XcmReceivedFrom, }; use sp_runtime::{traits::StaticLookup, Saturating}; +use sp_std::ops::Mul; use xcm::{latest::prelude::*, VersionedMultiAssets}; use xcm_builder::{CreateMatcher, MatchXcm}; use xcm_executor::{traits::ConvertLocation, XcmExecutor}; @@ -336,12 +337,13 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< + pallet_collator_selection::Config + cumulus_pallet_parachain_system::Config + cumulus_pallet_xcmp_queue::Config - + pallet_assets::Config, + + pallet_assets::Config + + pallet_asset_conversion::Config, AllPalletsWithoutSystem: OnInitialize> + OnFinalize>, - AccountIdOf: Into<[u8; 32]>, + AccountIdOf: Into<[u8; 32]> + From<[u8; 32]>, ValidatorIdOf: From>, - BalanceOf: From, + BalanceOf: From + Into, XcmConfig: xcm_executor::Config, LocationToAccountId: ConvertLocation>, >::AssetId: @@ -354,6 +356,9 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< + Into, <::Lookup as StaticLookup>::Source: From<::AccountId>, + ::AssetKind: + From + Into, + ::Balance: From, ForeignAssetsPalletInstance: 'static, { ExtBuilder::::default() @@ -400,6 +405,43 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< ) ); + // setup a pool to pay fees with `foreign_asset_id_multilocation` tokens + let pool_owner: AccountIdOf = [1u8; 32].into(); + let native_asset = MultiLocation::parent(); + let pool_liquidity: u128 = + existential_deposit.into().max(foreign_asset_id_minimum_balance).mul(100_000); + + let _ = >::deposit_creating( + &pool_owner, + (existential_deposit.into() + pool_liquidity).mul(2).into(), + ); + + assert_ok!(>::mint( + RuntimeHelper::::origin_of( + sovereign_account_as_owner_of_foreign_asset + ), + foreign_asset_id_multilocation.into(), + pool_owner.clone().into(), + (foreign_asset_id_minimum_balance + pool_liquidity).mul(2).into(), + )); + + assert_ok!(>::create_pool( + RuntimeHelper::::origin_of(pool_owner.clone()), + Box::new(native_asset.into()), + Box::new(foreign_asset_id_multilocation.into()) + )); + + assert_ok!(>::add_liquidity( + RuntimeHelper::::origin_of(pool_owner.clone()), + Box::new(native_asset.into()), + Box::new(foreign_asset_id_multilocation.into()), + pool_liquidity.into(), + pool_liquidity.into(), + 1.into(), + 1.into(), + pool_owner, + )); + // Balances before assert_eq!( >::free_balance(&target_account), @@ -485,14 +527,12 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< ); assert_ok!(outcome.ensure_complete()); - // author actual balance after (received fees from Trader for ForeignAssets) - let author_received_fees = - >::balance( - foreign_asset_id_multilocation.into(), - &block_author_account, - ); - - // Balances after (untouched) + // Balances after + // staking pot receives xcm fees in dot + assert!( + >::free_balance(&staking_pot) != + existential_deposit + ); assert_eq!( >::free_balance(&target_account), existential_deposit.clone() @@ -501,30 +541,25 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< >::free_balance(&block_author_account), 0.into() ); - assert_eq!( - >::free_balance(&staking_pot), - existential_deposit.clone() - ); // ForeignAssets balances after - assert_eq!( + assert!( >::balance( foreign_asset_id_multilocation.into(), &target_account - ), - (transfered_foreign_asset_id_amount - author_received_fees.into()).into() + ) > 0.into() ); assert_eq!( >::balance( foreign_asset_id_multilocation.into(), - &block_author_account + &staking_pot ), - author_received_fees + 0.into() ); assert_eq!( >::balance( foreign_asset_id_multilocation.into(), - &staking_pot + &block_author_account ), 0.into() ); diff --git a/cumulus/primitives/utility/Cargo.toml b/cumulus/primitives/utility/Cargo.toml index 56b6b928417..1558295b936 100644 --- a/cumulus/primitives/utility/Cargo.toml +++ b/cumulus/primitives/utility/Cargo.toml @@ -18,6 +18,7 @@ frame-support = { path = "../../../substrate/frame/support", default-features = sp-io = { path = "../../../substrate/primitives/io", default-features = false } sp-runtime = { path = "../../../substrate/primitives/runtime", default-features = false } sp-std = { path = "../../../substrate/primitives/std", default-features = false } +pallet-asset-conversion = { path = "../../../substrate/frame/asset-conversion", default-features = false } # Polkadot polkadot-runtime-common = { path = "../../../polkadot/runtime/common", default-features = false } @@ -37,6 +38,7 @@ std = [ "cumulus-primitives-core/std", "frame-support/std", "log/std", + "pallet-asset-conversion/std", "pallet-xcm-benchmarks/std", "polkadot-runtime-common/std", "polkadot-runtime-parachains/std", @@ -51,6 +53,7 @@ std = [ runtime-benchmarks = [ "cumulus-primitives-core/runtime-benchmarks", "frame-support/runtime-benchmarks", + "pallet-asset-conversion/runtime-benchmarks", "pallet-xcm-benchmarks/runtime-benchmarks", "polkadot-runtime-common/runtime-benchmarks", "polkadot-runtime-parachains/runtime-benchmarks", diff --git a/cumulus/primitives/utility/src/lib.rs b/cumulus/primitives/utility/src/lib.rs index 03f827d7ee2..7216000cb45 100644 --- a/cumulus/primitives/utility/src/lib.rs +++ b/cumulus/primitives/utility/src/lib.rs @@ -22,19 +22,24 @@ use codec::Encode; use cumulus_primitives_core::{MessageSendError, UpwardMessageSender}; use frame_support::{ - traits::{ - tokens::{fungibles, fungibles::Inspect}, - Get, - }, - weights::Weight, + defensive, + traits::{tokens::fungibles, Get, OnUnbalanced as OnUnbalancedT}, + weights::{Weight, WeightToFee as WeightToFeeT}, }; +use pallet_asset_conversion::SwapCredit as SwapCreditT; use polkadot_runtime_common::xcm_sender::PriceForMessageDelivery; -use sp_runtime::{traits::Saturating, SaturatedConversion}; +use sp_runtime::{ + traits::{Saturating, Zero}, + SaturatedConversion, +}; use sp_std::{marker::PhantomData, prelude::*}; use xcm::{latest::prelude::*, WrapVersion}; use xcm_builder::TakeRevenue; use xcm_executor::traits::{MatchesFungibles, TransactAsset, WeightTrader}; +#[cfg(test)] +mod tests; + /// Xcm router which recognises the `Parent` destination and handles it by sending the message into /// the given UMP `UpwardMessageSender` implementation. Thus this essentially adapts an /// `UpwardMessageSender` trait impl into a `SendXcm` trait impl. @@ -286,23 +291,238 @@ impl< /// in such assetId for that amount of weight pub trait ChargeWeightInFungibles> { fn charge_weight_in_fungibles( - asset_id: >::AssetId, + asset_id: >::AssetId, weight: Weight, - ) -> Result<>::Balance, XcmError>; + ) -> Result<>::Balance, XcmError>; +} + +/// Provides an implementation of [`WeightTrader`] to charge for weight using the first asset +/// specified in the `payment` argument. +/// +/// The asset used to pay for the weight must differ from the `Target` asset and be exchangeable for +/// the same `Target` asset through `SwapCredit`. +/// +/// ### Parameters: +/// - `Target`: the asset into which the user's payment will be exchanged using `SwapCredit`. +/// - `SwapCredit`: mechanism used for the exchange of the user's payment asset into the `Target`. +/// - `WeightToFee`: weight to the `Target` asset fee calculator. +/// - `Fungibles`: registry of fungible assets. +/// - `FungiblesAssetMatcher`: utility for mapping [`MultiAsset`] to `Fungibles::AssetId` and +/// `Fungibles::Balance`. +/// - `OnUnbalanced`: handler for the fee payment. +/// - `AccountId`: the account identifier type. +pub struct SwapFirstAssetTrader< + Target: Get, + SwapCredit: SwapCreditT< + AccountId, + Balance = Fungibles::Balance, + AssetKind = Fungibles::AssetId, + Credit = fungibles::Credit, + >, + WeightToFee: WeightToFeeT, + Fungibles: fungibles::Balanced, + FungiblesAssetMatcher: MatchesFungibles, + OnUnbalanced: OnUnbalancedT>, + AccountId, +> where + Fungibles::Balance: Into, +{ + /// Accumulated fee paid for XCM execution. + total_fee: fungibles::Credit, + /// Last asset utilized by a client to settle a fee. + last_fee_asset: Option, + _phantom_data: PhantomData<( + Target, + SwapCredit, + WeightToFee, + Fungibles, + FungiblesAssetMatcher, + OnUnbalanced, + AccountId, + )>, +} + +impl< + Target: Get, + SwapCredit: SwapCreditT< + AccountId, + Balance = Fungibles::Balance, + AssetKind = Fungibles::AssetId, + Credit = fungibles::Credit, + >, + WeightToFee: WeightToFeeT, + Fungibles: fungibles::Balanced, + FungiblesAssetMatcher: MatchesFungibles, + OnUnbalanced: OnUnbalancedT>, + AccountId, + > WeightTrader + for SwapFirstAssetTrader< + Target, + SwapCredit, + WeightToFee, + Fungibles, + FungiblesAssetMatcher, + OnUnbalanced, + AccountId, + > where + Fungibles::Balance: Into, +{ + fn new() -> Self { + Self { + total_fee: fungibles::Credit::::zero(Target::get()), + last_fee_asset: None, + _phantom_data: PhantomData, + } + } + + fn buy_weight( + &mut self, + weight: Weight, + mut payment: xcm_executor::Assets, + _context: &XcmContext, + ) -> Result { + log::trace!( + target: "xcm::weight", + "SwapFirstAssetTrader::buy_weight weight: {:?}, payment: {:?}", + weight, + payment, + ); + let first_asset: MultiAsset = + payment.fungible.pop_first().ok_or(XcmError::AssetNotFound)?.into(); + let (fungibles_asset, balance) = FungiblesAssetMatcher::matches_fungibles(&first_asset) + .map_err(|_| XcmError::AssetNotFound)?; + + let swap_asset = fungibles_asset.clone().into(); + if Target::get().eq(&swap_asset) { + // current trader is not applicable. + return Err(XcmError::FeesNotMet) + } + + let credit_in = Fungibles::issue(fungibles_asset, balance); + let fee = WeightToFee::weight_to_fee(&weight); + + // swap the user's asset for the `Target` asset. + let (credit_out, credit_change) = SwapCredit::swap_tokens_for_exact_tokens( + vec![swap_asset, Target::get()], + credit_in, + fee, + ) + .map_err(|(credit_in, _)| { + drop(credit_in); + XcmError::FeesNotMet + })?; + + match self.total_fee.subsume(credit_out) { + Err(credit_out) => { + // error may occur if `total_fee.asset` differs from `credit_out.asset`, which does + // not apply in this context. + defensive!( + "`total_fee.asset` must be equal to `credit_out.asset`", + (self.total_fee.asset(), credit_out.asset()) + ); + return Err(XcmError::FeesNotMet) + }, + _ => (), + }; + self.last_fee_asset = Some(first_asset.id); + + payment.fungible.insert(first_asset.id, credit_change.peek().into()); + drop(credit_change); + Ok(payment) + } + + fn refund_weight(&mut self, weight: Weight, _context: &XcmContext) -> Option { + log::trace!( + target: "xcm::weight", + "SwapFirstAssetTrader::refund_weight weight: {:?}, self.total_fee: {:?}", + weight, + self.total_fee, + ); + if self.total_fee.peek().is_zero() { + // noting yet paid to refund. + return None + } + let mut refund_asset = if let Some(asset) = &self.last_fee_asset { + // create an initial zero refund in the asset used in the last `buy_weight`. + (*asset, Fungible(0)).into() + } else { + return None + }; + let refund_amount = WeightToFee::weight_to_fee(&weight); + if refund_amount >= self.total_fee.peek() { + // not enough was paid to refund the `weight`. + return None + } + + let refund_swap_asset = FungiblesAssetMatcher::matches_fungibles(&refund_asset) + .map(|(a, _)| a.into()) + .ok()?; + + let refund = self.total_fee.extract(refund_amount); + let refund = match SwapCredit::swap_exact_tokens_for_tokens( + vec![Target::get(), refund_swap_asset], + refund, + None, + ) { + Ok(refund_in_target) => refund_in_target, + Err((refund, _)) => { + // return an attempted refund back to the `total_fee`. + let _ = self.total_fee.subsume(refund).map_err(|refund| { + // error may occur if `total_fee.asset` differs from `refund.asset`, which does + // not apply in this context. + defensive!( + "`total_fee.asset` must be equal to `refund.asset`", + (self.total_fee.asset(), refund.asset()) + ); + }); + return None + }, + }; + + refund_asset.fun = refund.peek().into().into(); + drop(refund); + Some(refund_asset) + } +} + +impl< + Target: Get, + SwapCredit: SwapCreditT< + AccountId, + Balance = Fungibles::Balance, + AssetKind = Fungibles::AssetId, + Credit = fungibles::Credit, + >, + WeightToFee: WeightToFeeT, + Fungibles: fungibles::Balanced, + FungiblesAssetMatcher: MatchesFungibles, + OnUnbalanced: OnUnbalancedT>, + AccountId, + > Drop + for SwapFirstAssetTrader< + Target, + SwapCredit, + WeightToFee, + Fungibles, + FungiblesAssetMatcher, + OnUnbalanced, + AccountId, + > where + Fungibles::Balance: Into, +{ + fn drop(&mut self) { + if self.total_fee.peek().is_zero() { + return + } + let total_fee = self.total_fee.extract(self.total_fee.peek()); + OnUnbalanced::on_unbalanced(total_fee); + } } #[cfg(test)] -mod tests { +mod test_xcm_router { use super::*; use cumulus_primitives_core::UpwardMessage; - use frame_support::{ - assert_ok, - traits::tokens::{ - DepositConsequence, Fortitude, Preservation, Provenance, WithdrawConsequence, - }, - }; - use sp_runtime::DispatchError; - use xcm_executor::{traits::Error, Assets}; /// Validates [`validate`] for required Some(destination) and Some(message) struct OkFixedXcmHashWithAssertingRequiredInputsSender; @@ -398,6 +618,18 @@ mod tests { )>(dest.into(), message) ); } +} +#[cfg(test)] +mod test_trader { + use super::*; + use frame_support::{ + assert_ok, + traits::tokens::{ + DepositConsequence, Fortitude, Preservation, Provenance, WithdrawConsequence, + }, + }; + use sp_runtime::DispatchError; + use xcm_executor::{traits::Error, Assets}; #[test] fn take_first_asset_trader_buy_weight_called_twice_throws_error() { @@ -491,9 +723,9 @@ mod tests { struct FeeChargerAssetsHandleRefund; impl ChargeWeightInFungibles for FeeChargerAssetsHandleRefund { fn charge_weight_in_fungibles( - _: >::AssetId, + _: >::AssetId, _: Weight, - ) -> Result<>::Balance, XcmError> { + ) -> Result<>::Balance, XcmError> { Ok(AMOUNT) } } diff --git a/cumulus/primitives/utility/src/tests/mod.rs b/cumulus/primitives/utility/src/tests/mod.rs new file mode 100644 index 00000000000..e0ad8718b89 --- /dev/null +++ b/cumulus/primitives/utility/src/tests/mod.rs @@ -0,0 +1,17 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +mod swap_first; diff --git a/cumulus/primitives/utility/src/tests/swap_first.rs b/cumulus/primitives/utility/src/tests/swap_first.rs new file mode 100644 index 00000000000..222cd005b12 --- /dev/null +++ b/cumulus/primitives/utility/src/tests/swap_first.rs @@ -0,0 +1,551 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Cumulus. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Cumulus. If not, see . + +use crate::*; +use frame_support::{parameter_types, traits::fungibles::Inspect}; +use mock::{setup_pool, AccountId, AssetId, Balance, Fungibles}; +use xcm::latest::AssetId as XcmAssetId; +use xcm_executor::Assets as HoldingAsset; + +fn create_holding_asset(asset_id: AssetId, amount: Balance) -> HoldingAsset { + create_asset(asset_id, amount).into() +} + +fn create_asset(asset_id: AssetId, amount: Balance) -> MultiAsset { + MultiAsset { id: create_asset_id(asset_id), fun: Fungible(amount) } +} + +fn create_asset_id(asset_id: AssetId) -> XcmAssetId { + Concrete(MultiLocation::new(0, X1(GeneralIndex(asset_id.into())))) +} + +fn xcm_context() -> XcmContext { + XcmContext { origin: None, message_id: [0u8; 32], topic: None } +} + +fn weight_worth_of(fee: Balance) -> Weight { + Weight::from_parts(fee.try_into().unwrap(), 0) +} + +const TARGET_ASSET: AssetId = 1; +const CLIENT_ASSET: AssetId = 2; +const CLIENT_ASSET_2: AssetId = 3; + +parameter_types! { + pub const TargetAsset: AssetId = TARGET_ASSET; +} + +pub type Trader = SwapFirstAssetTrader< + TargetAsset, + mock::Swap, + mock::WeightToFee, + mock::Fungibles, + mock::FungiblesMatcher, + (), + AccountId, +>; + +#[test] +fn holding_asset_swap_for_target() { + let client_asset_total = 15; + let fee = 5; + + setup_pool(CLIENT_ASSET, 1000, TARGET_ASSET, 1000); + + let holding_asset = create_holding_asset(CLIENT_ASSET, client_asset_total); + let holding_change = create_holding_asset(CLIENT_ASSET, client_asset_total - fee); + + let target_total = Fungibles::total_issuance(TARGET_ASSET); + let client_total = Fungibles::total_issuance(CLIENT_ASSET); + + let mut trader = Trader::new(); + assert_eq!( + trader.buy_weight(weight_worth_of(fee), holding_asset, &xcm_context()).unwrap(), + holding_change + ); + + assert_eq!(trader.total_fee.peek(), fee); + assert_eq!(trader.last_fee_asset, Some(create_asset_id(CLIENT_ASSET))); + + assert_eq!(Fungibles::total_issuance(TARGET_ASSET), target_total); + assert_eq!(Fungibles::total_issuance(CLIENT_ASSET), client_total + fee); +} + +#[test] +fn holding_asset_swap_for_target_twice() { + let client_asset_total = 20; + let fee1 = 5; + let fee2 = 6; + + setup_pool(CLIENT_ASSET, 1000, TARGET_ASSET, 1000); + + let holding_asset = create_holding_asset(CLIENT_ASSET, client_asset_total); + let holding_change1 = create_holding_asset(CLIENT_ASSET, client_asset_total - fee1); + let holding_change2 = create_holding_asset(CLIENT_ASSET, client_asset_total - fee1 - fee2); + + let target_total = Fungibles::total_issuance(TARGET_ASSET); + let client_total = Fungibles::total_issuance(CLIENT_ASSET); + + let mut trader = Trader::new(); + assert_eq!( + trader.buy_weight(weight_worth_of(fee1), holding_asset, &xcm_context()).unwrap(), + holding_change1 + ); + assert_eq!( + trader + .buy_weight(weight_worth_of(fee2), holding_change1, &xcm_context()) + .unwrap(), + holding_change2 + ); + + assert_eq!(trader.total_fee.peek(), fee1 + fee2); + assert_eq!(trader.last_fee_asset, Some(create_asset_id(CLIENT_ASSET))); + + assert_eq!(Fungibles::total_issuance(TARGET_ASSET), target_total); + assert_eq!(Fungibles::total_issuance(CLIENT_ASSET), client_total + fee1 + fee2); +} + +#[test] +fn buy_and_refund_twice_for_target() { + let client_asset_total = 15; + let fee = 5; + let refund1 = 4; + let refund2 = 2; + + setup_pool(CLIENT_ASSET, 1000, TARGET_ASSET, 1000); + // create pool for refund swap. + setup_pool(TARGET_ASSET, 1000, CLIENT_ASSET, 1000); + + let holding_asset = create_holding_asset(CLIENT_ASSET, client_asset_total); + let holding_change = create_holding_asset(CLIENT_ASSET, client_asset_total - fee); + let refund_asset = create_asset(CLIENT_ASSET, refund1); + + let target_total = Fungibles::total_issuance(TARGET_ASSET); + let client_total = Fungibles::total_issuance(CLIENT_ASSET); + + let mut trader = Trader::new(); + assert_eq!( + trader.buy_weight(weight_worth_of(fee), holding_asset, &xcm_context()).unwrap(), + holding_change + ); + + assert_eq!(trader.total_fee.peek(), fee); + assert_eq!(trader.last_fee_asset, Some(create_asset_id(CLIENT_ASSET))); + + assert_eq!(trader.refund_weight(weight_worth_of(refund1), &xcm_context()), Some(refund_asset)); + + assert_eq!(trader.total_fee.peek(), fee - refund1); + assert_eq!(trader.last_fee_asset, Some(create_asset_id(CLIENT_ASSET))); + + assert_eq!(trader.refund_weight(weight_worth_of(refund2), &xcm_context()), None); + + assert_eq!(trader.total_fee.peek(), fee - refund1); + assert_eq!(trader.last_fee_asset, Some(create_asset_id(CLIENT_ASSET))); + + assert_eq!(Fungibles::total_issuance(TARGET_ASSET), target_total); + assert_eq!(Fungibles::total_issuance(CLIENT_ASSET), client_total + fee - refund1); +} + +#[test] +fn buy_with_various_assets_and_refund_for_target() { + let client_asset_total = 10; + let client_asset_2_total = 15; + let fee1 = 5; + let fee2 = 6; + let refund1 = 6; + let refund2 = 4; + + setup_pool(CLIENT_ASSET, 1000, TARGET_ASSET, 1000); + setup_pool(CLIENT_ASSET_2, 1000, TARGET_ASSET, 1000); + // create pool for refund swap. + setup_pool(TARGET_ASSET, 1000, CLIENT_ASSET_2, 1000); + + let holding_asset = create_holding_asset(CLIENT_ASSET, client_asset_total); + let holding_asset_2 = create_holding_asset(CLIENT_ASSET_2, client_asset_2_total); + let holding_change = create_holding_asset(CLIENT_ASSET, client_asset_total - fee1); + let holding_change_2 = create_holding_asset(CLIENT_ASSET_2, client_asset_2_total - fee2); + // both refunds in the latest buy asset (`CLIENT_ASSET_2`). + let refund_asset = create_asset(CLIENT_ASSET_2, refund1); + let refund_asset_2 = create_asset(CLIENT_ASSET_2, refund2); + + let target_total = Fungibles::total_issuance(TARGET_ASSET); + let client_total = Fungibles::total_issuance(CLIENT_ASSET); + let client_total_2 = Fungibles::total_issuance(CLIENT_ASSET_2); + + let mut trader = Trader::new(); + // first purchase with `CLIENT_ASSET`. + assert_eq!( + trader.buy_weight(weight_worth_of(fee1), holding_asset, &xcm_context()).unwrap(), + holding_change + ); + + assert_eq!(trader.total_fee.peek(), fee1); + assert_eq!(trader.last_fee_asset, Some(create_asset_id(CLIENT_ASSET))); + + // second purchase with `CLIENT_ASSET_2`. + assert_eq!( + trader + .buy_weight(weight_worth_of(fee2), holding_asset_2, &xcm_context()) + .unwrap(), + holding_change_2 + ); + + assert_eq!(trader.total_fee.peek(), fee1 + fee2); + assert_eq!(trader.last_fee_asset, Some(create_asset_id(CLIENT_ASSET_2))); + + // first refund in the last asset used with `buy_weight`. + assert_eq!(trader.refund_weight(weight_worth_of(refund1), &xcm_context()), Some(refund_asset)); + + assert_eq!(trader.total_fee.peek(), fee1 + fee2 - refund1); + assert_eq!(trader.last_fee_asset, Some(create_asset_id(CLIENT_ASSET_2))); + + // second refund in the last asset used with `buy_weight`. + assert_eq!( + trader.refund_weight(weight_worth_of(refund2), &xcm_context()), + Some(refund_asset_2) + ); + + assert_eq!(trader.total_fee.peek(), fee1 + fee2 - refund1 - refund2); + assert_eq!(trader.last_fee_asset, Some(create_asset_id(CLIENT_ASSET_2))); + + assert_eq!(Fungibles::total_issuance(TARGET_ASSET), target_total); + assert_eq!(Fungibles::total_issuance(CLIENT_ASSET), client_total + fee1); + assert_eq!( + Fungibles::total_issuance(CLIENT_ASSET_2), + client_total_2 + fee2 - refund1 - refund2 + ); +} + +#[test] +fn not_enough_to_refund() { + let client_asset_total = 15; + let fee = 5; + let refund = 6; + + setup_pool(CLIENT_ASSET, 1000, TARGET_ASSET, 1000); + + let holding_asset = create_holding_asset(CLIENT_ASSET, client_asset_total); + let holding_change = create_holding_asset(CLIENT_ASSET, client_asset_total - fee); + + let target_total = Fungibles::total_issuance(TARGET_ASSET); + let client_total = Fungibles::total_issuance(CLIENT_ASSET); + + let mut trader = Trader::new(); + assert_eq!( + trader.buy_weight(weight_worth_of(fee), holding_asset, &xcm_context()).unwrap(), + holding_change + ); + + assert_eq!(trader.total_fee.peek(), fee); + assert_eq!(trader.last_fee_asset, Some(create_asset_id(CLIENT_ASSET))); + + assert_eq!(trader.refund_weight(weight_worth_of(refund), &xcm_context()), None); + + assert_eq!(Fungibles::total_issuance(TARGET_ASSET), target_total); + assert_eq!(Fungibles::total_issuance(CLIENT_ASSET), client_total + fee); +} + +#[test] +fn not_exchangeable_to_refund() { + let client_asset_total = 15; + let fee = 5; + let refund = 1; + + setup_pool(CLIENT_ASSET, 1000, TARGET_ASSET, 1000); + + let holding_asset = create_holding_asset(CLIENT_ASSET, client_asset_total); + let holding_change = create_holding_asset(CLIENT_ASSET, client_asset_total - fee); + + let target_total = Fungibles::total_issuance(TARGET_ASSET); + let client_total = Fungibles::total_issuance(CLIENT_ASSET); + + let mut trader = Trader::new(); + assert_eq!( + trader.buy_weight(weight_worth_of(fee), holding_asset, &xcm_context()).unwrap(), + holding_change + ); + + assert_eq!(trader.total_fee.peek(), fee); + assert_eq!(trader.last_fee_asset, Some(create_asset_id(CLIENT_ASSET))); + + assert_eq!(trader.refund_weight(weight_worth_of(refund), &xcm_context()), None); + + assert_eq!(Fungibles::total_issuance(TARGET_ASSET), target_total); + assert_eq!(Fungibles::total_issuance(CLIENT_ASSET), client_total + fee); +} + +#[test] +fn nothing_to_refund() { + let fee = 5; + + let mut trader = Trader::new(); + assert_eq!(trader.refund_weight(weight_worth_of(fee), &xcm_context()), None); +} + +#[test] +fn holding_asset_not_exchangeable_for_target() { + let holding_asset = create_holding_asset(CLIENT_ASSET, 10); + + let target_total = Fungibles::total_issuance(TARGET_ASSET); + let client_total = Fungibles::total_issuance(CLIENT_ASSET); + + let mut trader = Trader::new(); + assert_eq!( + trader + .buy_weight(Weight::from_all(10), holding_asset, &xcm_context()) + .unwrap_err(), + XcmError::FeesNotMet + ); + + assert_eq!(Fungibles::total_issuance(TARGET_ASSET), target_total); + assert_eq!(Fungibles::total_issuance(CLIENT_ASSET), client_total); +} + +#[test] +fn empty_holding_asset() { + let mut trader = Trader::new(); + assert_eq!( + trader + .buy_weight(Weight::from_all(10), HoldingAsset::new(), &xcm_context()) + .unwrap_err(), + XcmError::AssetNotFound + ); +} + +#[test] +fn fails_to_match_holding_asset() { + let mut trader = Trader::new(); + let holding_asset = + MultiAsset { id: Concrete(MultiLocation::new(1, X1(Parachain(1)))), fun: Fungible(10) }; + assert_eq!( + trader + .buy_weight(Weight::from_all(10), holding_asset.into(), &xcm_context()) + .unwrap_err(), + XcmError::AssetNotFound + ); +} + +#[test] +fn holding_asset_equal_to_target_asset() { + let mut trader = Trader::new(); + let holding_asset = create_holding_asset(TargetAsset::get(), 10); + assert_eq!( + trader + .buy_weight(Weight::from_all(10), holding_asset, &xcm_context()) + .unwrap_err(), + XcmError::FeesNotMet + ); +} + +pub mod mock { + use crate::*; + use core::cell::RefCell; + use frame_support::{ + ensure, + traits::{ + fungibles::{Balanced, DecreaseIssuance, Dust, IncreaseIssuance, Inspect, Unbalanced}, + tokens::{ + DepositConsequence, Fortitude, Fortitude::Polite, Precision::Exact, Preservation, + Preservation::Preserve, Provenance, WithdrawConsequence, + }, + }, + }; + use sp_runtime::{traits::One, DispatchError}; + use std::collections::HashMap; + use xcm::latest::Junction; + + pub type AccountId = u64; + pub type AssetId = u32; + pub type Balance = u128; + pub type Credit = fungibles::Credit; + + thread_local! { + pub static TOTAL_ISSUANCE: RefCell> = RefCell::new(HashMap::new()); + pub static ACCOUNT: RefCell> = RefCell::new(HashMap::new()); + pub static SWAP: RefCell> = RefCell::new(HashMap::new()); + } + + pub struct Swap {} + impl SwapCreditT for Swap { + type Balance = Balance; + type AssetKind = AssetId; + type Credit = Credit; + fn max_path_len() -> u32 { + 2 + } + fn swap_exact_tokens_for_tokens( + path: Vec, + credit_in: Self::Credit, + amount_out_min: Option, + ) -> Result { + ensure!(2 == path.len(), (credit_in, DispatchError::Unavailable)); + ensure!( + credit_in.peek() >= amount_out_min.unwrap_or(Self::Balance::zero()), + (credit_in, DispatchError::Unavailable) + ); + let swap_res = SWAP.with(|b| b.borrow().get(&(path[0], path[1])).map(|v| *v)); + let pool_account = match swap_res { + Some(a) => a, + None => return Err((credit_in, DispatchError::Unavailable)), + }; + let credit_out = match Fungibles::withdraw( + path[1], + &pool_account, + credit_in.peek(), + Exact, + Preserve, + Polite, + ) { + Ok(c) => c, + Err(_) => return Err((credit_in, DispatchError::Unavailable)), + }; + let _ = Fungibles::resolve(&pool_account, credit_in) + .map_err(|c| (c, DispatchError::Unavailable))?; + Ok(credit_out) + } + fn swap_tokens_for_exact_tokens( + path: Vec, + credit_in: Self::Credit, + amount_out: Self::Balance, + ) -> Result<(Self::Credit, Self::Credit), (Self::Credit, DispatchError)> { + ensure!(2 == path.len(), (credit_in, DispatchError::Unavailable)); + ensure!(credit_in.peek() >= amount_out, (credit_in, DispatchError::Unavailable)); + let swap_res = SWAP.with(|b| b.borrow().get(&(path[0], path[1])).map(|v| *v)); + let pool_account = match swap_res { + Some(a) => a, + None => return Err((credit_in, DispatchError::Unavailable)), + }; + let credit_out = match Fungibles::withdraw( + path[1], + &pool_account, + amount_out, + Exact, + Preserve, + Polite, + ) { + Ok(c) => c, + Err(_) => return Err((credit_in, DispatchError::Unavailable)), + }; + let (credit_in, change) = credit_in.split(amount_out); + let _ = Fungibles::resolve(&pool_account, credit_in) + .map_err(|c| (c, DispatchError::Unavailable))?; + Ok((credit_out, change)) + } + } + + pub fn pool_account(asset1: AssetId, asset2: AssetId) -> AccountId { + (1000 + asset1 * 10 + asset2 * 100).into() + } + + pub fn setup_pool(asset1: AssetId, liquidity1: Balance, asset2: AssetId, liquidity2: Balance) { + let account = pool_account(asset1, asset2); + SWAP.with(|b| b.borrow_mut().insert((asset1, asset2), account)); + let debt1 = Fungibles::deposit(asset1, &account, liquidity1, Exact); + let debt2 = Fungibles::deposit(asset2, &account, liquidity2, Exact); + drop(debt1); + drop(debt2); + } + + pub struct WeightToFee; + impl WeightToFeeT for WeightToFee { + type Balance = Balance; + fn weight_to_fee(weight: &Weight) -> Self::Balance { + (weight.ref_time() + weight.proof_size()).into() + } + } + + pub struct Fungibles {} + impl Inspect for Fungibles { + type AssetId = AssetId; + type Balance = Balance; + fn total_issuance(asset: Self::AssetId) -> Self::Balance { + TOTAL_ISSUANCE.with(|b| b.borrow().get(&asset).map_or(Self::Balance::zero(), |b| *b)) + } + fn minimum_balance(_: Self::AssetId) -> Self::Balance { + Self::Balance::one() + } + fn total_balance(asset: Self::AssetId, who: &AccountId) -> Self::Balance { + ACCOUNT.with(|b| b.borrow().get(&(asset, *who)).map_or(Self::Balance::zero(), |b| *b)) + } + fn balance(asset: Self::AssetId, who: &AccountId) -> Self::Balance { + ACCOUNT.with(|b| b.borrow().get(&(asset, *who)).map_or(Self::Balance::zero(), |b| *b)) + } + fn reducible_balance( + asset: Self::AssetId, + who: &AccountId, + _: Preservation, + _: Fortitude, + ) -> Self::Balance { + ACCOUNT.with(|b| b.borrow().get(&(asset, *who)).map_or(Self::Balance::zero(), |b| *b)) + } + fn can_deposit( + _: Self::AssetId, + _: &AccountId, + _: Self::Balance, + _: Provenance, + ) -> DepositConsequence { + unimplemented!() + } + fn can_withdraw( + _: Self::AssetId, + _: &AccountId, + _: Self::Balance, + ) -> WithdrawConsequence { + unimplemented!() + } + fn asset_exists(_: Self::AssetId) -> bool { + unimplemented!() + } + } + + impl Unbalanced for Fungibles { + fn set_total_issuance(asset: Self::AssetId, amount: Self::Balance) { + TOTAL_ISSUANCE.with(|b| b.borrow_mut().insert(asset, amount)); + } + fn handle_dust(_: Dust) { + unimplemented!() + } + fn write_balance( + asset: Self::AssetId, + who: &AccountId, + amount: Self::Balance, + ) -> Result, DispatchError> { + let _ = ACCOUNT.with(|b| b.borrow_mut().insert((asset, *who), amount)); + Ok(None) + } + } + + impl Balanced for Fungibles { + type OnDropCredit = DecreaseIssuance; + type OnDropDebt = IncreaseIssuance; + } + + pub struct FungiblesMatcher; + impl MatchesFungibles for FungiblesMatcher { + fn matches_fungibles( + a: &MultiAsset, + ) -> core::result::Result<(AssetId, Balance), xcm_executor::traits::Error> { + match a { + MultiAsset { + fun: Fungible(amount), + id: + Concrete(MultiLocation { parents: 0, interior: X1(Junction::GeneralIndex(id)) }), + } => Ok(((*id).try_into().unwrap(), *amount)), + _ => Err(xcm_executor::traits::Error::AssetNotHandled), + } + } + } +} diff --git a/prdoc/pr_1845.prdoc b/prdoc/pr_1845.prdoc new file mode 100644 index 00000000000..cf6cd1feadf --- /dev/null +++ b/prdoc/pr_1845.prdoc @@ -0,0 +1,16 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: "XCM WeightTrader: Swap Fee Asset for Native Asset" + +doc: + - audience: Runtime Dev + description: | + Implements an XCM executor `WeightTrader`, facilitating fee payments in any asset that can be exchanged for a native asset. + + A few constraints need to be observed: + - `buy_weight` and `refund` operations must be atomic, as another weight trader implementation might be attempted in case of failure. + - swap credit must be utilized since there isn’t an account to which an asset of some class can be deposited with a guarantee to meet the existential deposit requirement. + +crates: + - name: cumulus-primitives-utility -- GitLab From a42a47f81d91ccf2f885ff01749185cd4c793278 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=B3nal=20Murray?= Date: Tue, 16 Jan 2024 08:24:13 +0000 Subject: [PATCH 174/191] Bump rococo relay and coretime-rococo to 1.6 (#2913) Co-authored-by: command-bot <> --- .../coretime/coretime-rococo/src/lib.rs | 2 +- .../cumulus_pallet_parachain_system.rs | 26 ++- .../src/weights/cumulus_pallet_xcmp_queue.rs | 41 ++-- .../src/weights/frame_system.rs | 110 ++++++---- .../src/weights/pallet_balances.rs | 62 +++--- .../src/weights/pallet_broker.rs | 161 +++++++------- .../src/weights/pallet_collator_selection.rs | 154 +++++++------ .../src/weights/pallet_message_queue.rs | 58 ++--- .../src/weights/pallet_multisig.rs | 89 ++++---- .../src/weights/pallet_session.rs | 33 +-- .../src/weights/pallet_timestamp.rs | 23 +- .../src/weights/pallet_utility.rs | 45 ++-- .../coretime-rococo/src/weights/pallet_xcm.rs | 77 +++---- .../xcm/pallet_xcm_benchmarks_fungible.rs | 117 +++++----- .../xcm/pallet_xcm_benchmarks_generic.rs | 202 ++++++++---------- polkadot/runtime/rococo/src/lib.rs | 2 +- 16 files changed, 640 insertions(+), 562 deletions(-) diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs index 0f01c2d7416..c381d78b57f 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs @@ -129,7 +129,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("coretime-rococo"), impl_name: create_runtime_str!("coretime-rococo"), authoring_version: 1, - spec_version: 1_005_004, + spec_version: 1_006_001, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 0, diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/cumulus_pallet_parachain_system.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/cumulus_pallet_parachain_system.rs index f7a1486ed58..139e37c5448 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/cumulus_pallet_parachain_system.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/cumulus_pallet_parachain_system.rs @@ -17,21 +17,24 @@ //! Autogenerated weights for `cumulus_pallet_parachain_system` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-12-07, STEPS: `2`, REPEAT: `1`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-01-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `dagda.local`, CPU: `` +//! HOSTNAME: `runner-j8vvqcjr-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-rococo-dev")`, DB CACHE: 1024 // Executed Command: -// target/release/polkadot-parachain +// ./target/production/polkadot-parachain // benchmark // pallet // --chain=coretime-rococo-dev // --wasm-execution=compiled // --pallet=cumulus_pallet_parachain_system +// --no-storage-info +// --no-median-slopes +// --no-min-squares // --extrinsic=* -// --steps=2 -// --repeat=1 +// --steps=50 +// --repeat=20 // --json // --header=./cumulus/file_header.txt // --output=./cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/ @@ -58,14 +61,17 @@ impl cumulus_pallet_parachain_system::WeightInfo for We /// Storage: `MessageQueue::Pages` (r:0 w:1000) /// Proof: `MessageQueue::Pages` (`max_values`: None, `max_size`: Some(65585), added: 68060, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 1000]`. - fn enqueue_inbound_downward_messages(_n: u32, ) -> Weight { + fn enqueue_inbound_downward_messages(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `42` + // Measured: `48` // Estimated: `3517` - // Minimum execution time: 3_000_000 picoseconds. - Weight::from_parts(144_747_000_000, 0) + // Minimum execution time: 2_067_000 picoseconds. + Weight::from_parts(2_151_000, 0) .saturating_add(Weight::from_parts(0, 3517)) + // Standard Error: 32_757 + .saturating_add(Weight::from_parts(204_001_420, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(3)) - .saturating_add(T::DbWeight::get().writes(1004)) + .saturating_add(T::DbWeight::get().writes(4)) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(n.into()))) } } diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/cumulus_pallet_xcmp_queue.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/cumulus_pallet_xcmp_queue.rs index f5683f747a3..efbe7980de2 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/cumulus_pallet_xcmp_queue.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/cumulus_pallet_xcmp_queue.rs @@ -17,21 +17,24 @@ //! Autogenerated weights for `cumulus_pallet_xcmp_queue` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-12-07, STEPS: `2`, REPEAT: `1`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-01-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `dagda.local`, CPU: `` +//! HOSTNAME: `runner-j8vvqcjr-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-rococo-dev")`, DB CACHE: 1024 // Executed Command: -// target/release/polkadot-parachain +// ./target/production/polkadot-parachain // benchmark // pallet // --chain=coretime-rococo-dev // --wasm-execution=compiled // --pallet=cumulus_pallet_xcmp_queue +// --no-storage-info +// --no-median-slopes +// --no-min-squares // --extrinsic=* -// --steps=2 -// --repeat=1 +// --steps=50 +// --repeat=20 // --json // --header=./cumulus/file_header.txt // --output=./cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/ @@ -53,8 +56,8 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `76` // Estimated: `1561` - // Minimum execution time: 6_000_000 picoseconds. - Weight::from_parts(6_000_000, 0) + // Minimum execution time: 3_935_000 picoseconds. + Weight::from_parts(4_188_000, 0) .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -73,8 +76,8 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `82` // Estimated: `3517` - // Minimum execution time: 13_000_000 picoseconds. - Weight::from_parts(13_000_000, 0) + // Minimum execution time: 10_252_000 picoseconds. + Weight::from_parts(10_551_000, 0) .saturating_add(Weight::from_parts(0, 3517)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(3)) @@ -85,8 +88,8 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `76` // Estimated: `1561` - // Minimum execution time: 3_000_000 picoseconds. - Weight::from_parts(3_000_000, 0) + // Minimum execution time: 2_294_000 picoseconds. + Weight::from_parts(2_477_000, 0) .saturating_add(Weight::from_parts(0, 1561)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -97,8 +100,8 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `111` // Estimated: `1596` - // Minimum execution time: 4_000_000 picoseconds. - Weight::from_parts(4_000_000, 0) + // Minimum execution time: 3_068_000 picoseconds. + Weight::from_parts(3_204_000, 0) .saturating_add(Weight::from_parts(0, 1596)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -107,8 +110,8 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 42_000_000 picoseconds. - Weight::from_parts(42_000_000, 0) + // Minimum execution time: 68_610_000 picoseconds. + Weight::from_parts(68_800_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// Storage: UNKNOWN KEY `0x7b3237373ffdfeb1cab4222e3b520d6b345d8e88afa015075c945637c07e8f20` (r:1 w:1) @@ -129,8 +132,8 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `65711` // Estimated: `69176` - // Minimum execution time: 86_000_000 picoseconds. - Weight::from_parts(86_000_000, 0) + // Minimum execution time: 125_878_000 picoseconds. + Weight::from_parts(127_632_000, 0) .saturating_add(Weight::from_parts(0, 69176)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(5)) @@ -143,8 +146,8 @@ impl cumulus_pallet_xcmp_queue::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `65710` // Estimated: `69175` - // Minimum execution time: 79_000_000 picoseconds. - Weight::from_parts(79_000_000, 0) + // Minimum execution time: 54_918_000 picoseconds. + Weight::from_parts(56_246_000, 0) .saturating_add(Weight::from_parts(0, 69175)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/frame_system.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/frame_system.rs index 7c41112152f..428976e3e03 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/frame_system.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/frame_system.rs @@ -17,21 +17,24 @@ //! Autogenerated weights for `frame_system` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-12-07, STEPS: `2`, REPEAT: `1`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-01-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `dagda.local`, CPU: `` +//! HOSTNAME: `runner-j8vvqcjr-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-rococo-dev")`, DB CACHE: 1024 // Executed Command: -// target/release/polkadot-parachain +// ./target/production/polkadot-parachain // benchmark // pallet // --chain=coretime-rococo-dev // --wasm-execution=compiled // --pallet=frame_system +// --no-storage-info +// --no-median-slopes +// --no-min-squares // --extrinsic=* -// --steps=2 -// --repeat=1 +// --steps=50 +// --repeat=20 // --json // --header=./cumulus/file_header.txt // --output=./cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/ @@ -48,22 +51,26 @@ use core::marker::PhantomData; pub struct WeightInfo(PhantomData); impl frame_system::WeightInfo for WeightInfo { /// The range of component `b` is `[0, 3932160]`. - fn remark(_b: u32, ) -> Weight { + fn remark(b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_000_000 picoseconds. - Weight::from_parts(775_000_000, 0) + // Minimum execution time: 1_760_000 picoseconds. + Weight::from_parts(6_086_623, 0) .saturating_add(Weight::from_parts(0, 0)) + // Standard Error: 0 + .saturating_add(Weight::from_parts(430, 0).saturating_mul(b.into())) } /// The range of component `b` is `[0, 3932160]`. - fn remark_with_event(_b: u32, ) -> Weight { + fn remark_with_event(b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_000_000 picoseconds. - Weight::from_parts(4_700_000_000, 0) + // Minimum execution time: 5_315_000 picoseconds. + Weight::from_parts(20_446_491, 0) .saturating_add(Weight::from_parts(0, 0)) + // Standard Error: 2 + .saturating_add(Weight::from_parts(1_725, 0).saturating_mul(b.into())) } /// Storage: `System::Digest` (r:1 w:1) /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) @@ -73,8 +80,8 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `1485` - // Minimum execution time: 5_000_000 picoseconds. - Weight::from_parts(5_000_000, 0) + // Minimum execution time: 3_046_000 picoseconds. + Weight::from_parts(3_249_000, 0) .saturating_add(Weight::from_parts(0, 1485)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -95,8 +102,8 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `164` // Estimated: `1649` - // Minimum execution time: 79_510_000_000 picoseconds. - Weight::from_parts(79_510_000_000, 0) + // Minimum execution time: 108_366_941_000 picoseconds. + Weight::from_parts(111_101_742_000, 0) .saturating_add(Weight::from_parts(0, 1649)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(3)) @@ -104,39 +111,46 @@ impl frame_system::WeightInfo for WeightInfo { /// Storage: `Skipped::Metadata` (r:0 w:0) /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `i` is `[0, 1000]`. - fn set_storage(_i: u32, ) -> Weight { + fn set_storage(i: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_000_000 picoseconds. - Weight::from_parts(816_000_000, 0) + // Minimum execution time: 1_877_000 picoseconds. + Weight::from_parts(1_947_000, 0) .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1000)) + // Standard Error: 2_035 + .saturating_add(Weight::from_parts(763_800, 0).saturating_mul(i.into())) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) } /// Storage: `Skipped::Metadata` (r:0 w:0) /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `i` is `[0, 1000]`. - fn kill_storage(_i: u32, ) -> Weight { + fn kill_storage(i: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_000_000 picoseconds. - Weight::from_parts(598_000_000, 0) + // Minimum execution time: 1_847_000 picoseconds. + Weight::from_parts(1_931_000, 0) .saturating_add(Weight::from_parts(0, 0)) - .saturating_add(T::DbWeight::get().writes(1000)) + // Standard Error: 932 + .saturating_add(Weight::from_parts(565_066, 0).saturating_mul(i.into())) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into()))) } /// Storage: `Skipped::Metadata` (r:0 w:0) /// Proof: `Skipped::Metadata` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `p` is `[0, 1000]`. - fn kill_prefix(_p: u32, ) -> Weight { + fn kill_prefix(p: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `55 + p * (69 ±0)` - // Estimated: `69609` - // Minimum execution time: 6_000_000 picoseconds. - Weight::from_parts(1_091_000_000, 0) - .saturating_add(Weight::from_parts(0, 69609)) - .saturating_add(T::DbWeight::get().reads(1000)) - .saturating_add(T::DbWeight::get().writes(1000)) + // Measured: `71 + p * (69 ±0)` + // Estimated: `72 + p * (70 ±0)` + // Minimum execution time: 3_587_000 picoseconds. + Weight::from_parts(3_654_000, 0) + .saturating_add(Weight::from_parts(0, 72)) + // Standard Error: 1_468 + .saturating_add(Weight::from_parts(1_170_655, 0).saturating_mul(p.into())) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(p.into()))) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(p.into()))) + .saturating_add(Weight::from_parts(0, 70).saturating_mul(p.into())) } /// Storage: `System::AuthorizedUpgrade` (r:0 w:1) /// Proof: `System::AuthorizedUpgrade` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) @@ -144,25 +158,33 @@ impl frame_system::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 33_027_000 picoseconds. - Weight::from_parts(33_027_000, 0) + // Minimum execution time: 9_701_000 picoseconds. + Weight::from_parts(10_142_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: `System::AuthorizedUpgrade` (r:1 w:1) /// Proof: `System::AuthorizedUpgrade` (`max_values`: Some(1), `max_size`: Some(33), added: 528, mode: `MaxEncodedLen`) - /// Storage: `System::Digest` (r:1 w:1) - /// Proof: `System::Digest` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - /// Storage: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) - /// Proof: UNKNOWN KEY `0x3a636f6465` (r:0 w:1) + /// Storage: `ParachainSystem::ValidationData` (r:1 w:0) + /// Proof: `ParachainSystem::ValidationData` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::UpgradeRestrictionSignal` (r:1 w:0) + /// Proof: `ParachainSystem::UpgradeRestrictionSignal` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::PendingValidationCode` (r:1 w:1) + /// Proof: `ParachainSystem::PendingValidationCode` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) + /// Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::NewValidationCode` (r:0 w:1) + /// Proof: `ParachainSystem::NewValidationCode` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::DidSetValidationCode` (r:0 w:1) + /// Proof: `ParachainSystem::DidSetValidationCode` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn apply_authorized_upgrade() -> Weight { // Proof Size summary in bytes: - // Measured: `22` - // Estimated: `1518` - // Minimum execution time: 118_101_992_000 picoseconds. - Weight::from_parts(118_101_992_000, 0) - .saturating_add(Weight::from_parts(0, 1518)) - .saturating_add(T::DbWeight::get().reads(2)) - .saturating_add(T::DbWeight::get().writes(3)) + // Measured: `186` + // Estimated: `1671` + // Minimum execution time: 113_812_980_000 picoseconds. + Weight::from_parts(115_758_263_000, 0) + .saturating_add(Weight::from_parts(0, 1671)) + .saturating_add(T::DbWeight::get().reads(5)) + .saturating_add(T::DbWeight::get().writes(4)) } } diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_balances.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_balances.rs index ee12da7c436..bb9d7b3fe8a 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_balances.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_balances.rs @@ -17,21 +17,24 @@ //! Autogenerated weights for `pallet_balances` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-12-07, STEPS: `2`, REPEAT: `1`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-01-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `dagda.local`, CPU: `` +//! HOSTNAME: `runner-j8vvqcjr-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-rococo-dev")`, DB CACHE: 1024 // Executed Command: -// target/release/polkadot-parachain +// ./target/production/polkadot-parachain // benchmark // pallet // --chain=coretime-rococo-dev // --wasm-execution=compiled // --pallet=pallet_balances +// --no-storage-info +// --no-median-slopes +// --no-min-squares // --extrinsic=* -// --steps=2 -// --repeat=1 +// --steps=50 +// --repeat=20 // --json // --header=./cumulus/file_header.txt // --output=./cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/ @@ -53,8 +56,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 55_000_000 picoseconds. - Weight::from_parts(55_000_000, 0) + // Minimum execution time: 45_258_000 picoseconds. + Weight::from_parts(46_265_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -65,8 +68,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 42_000_000 picoseconds. - Weight::from_parts(42_000_000, 0) + // Minimum execution time: 35_639_000 picoseconds. + Weight::from_parts(36_170_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -77,8 +80,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 15_000_000 picoseconds. - Weight::from_parts(15_000_000, 0) + // Minimum execution time: 12_342_000 picoseconds. + Weight::from_parts(12_736_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -89,8 +92,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 21_000_000 picoseconds. - Weight::from_parts(21_000_000, 0) + // Minimum execution time: 17_150_000 picoseconds. + Weight::from_parts(17_764_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -101,8 +104,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `6196` - // Minimum execution time: 66_000_000 picoseconds. - Weight::from_parts(66_000_000, 0) + // Minimum execution time: 46_745_000 picoseconds. + Weight::from_parts(47_693_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -113,8 +116,8 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 53_000_000 picoseconds. - Weight::from_parts(53_000_000, 0) + // Minimum execution time: 44_553_000 picoseconds. + Weight::from_parts(45_113_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -125,23 +128,26 @@ impl pallet_balances::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `103` // Estimated: `3593` - // Minimum execution time: 22_000_000 picoseconds. - Weight::from_parts(22_000_000, 0) + // Minimum execution time: 15_439_000 picoseconds. + Weight::from_parts(15_832_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } - /// Storage: `System::Account` (r:1000 w:1000) + /// Storage: `System::Account` (r:999 w:999) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// The range of component `u` is `[1, 1000]`. - fn upgrade_accounts(_u: u32, ) -> Weight { + fn upgrade_accounts(u: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `0 + u * (135 ±0)` - // Estimated: `2603990` - // Minimum execution time: 20_000_000 picoseconds. - Weight::from_parts(14_684_000_000, 0) - .saturating_add(Weight::from_parts(0, 2603990)) - .saturating_add(T::DbWeight::get().reads(1000)) - .saturating_add(T::DbWeight::get().writes(1000)) + // Measured: `0 + u * (136 ±0)` + // Estimated: `990 + u * (2603 ±0)` + // Minimum execution time: 15_017_000 picoseconds. + Weight::from_parts(15_286_000, 0) + .saturating_add(Weight::from_parts(0, 990)) + // Standard Error: 11_887 + .saturating_add(Weight::from_parts(13_536_178, 0).saturating_mul(u.into())) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(u.into()))) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(u.into()))) + .saturating_add(Weight::from_parts(0, 2603).saturating_mul(u.into())) } } diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_broker.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_broker.rs index 665b84e32cc..2d30ddc612c 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_broker.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_broker.rs @@ -17,23 +17,25 @@ //! Autogenerated weights for `pallet_broker` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-12-22, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-01-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-q7z7ruxr-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! HOSTNAME: `runner-j8vvqcjr-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-rococo-dev")`, DB CACHE: 1024 // Executed Command: -// target/production/polkadot-parachain +// ./target/production/polkadot-parachain // benchmark // pallet -// --steps=50 -// --repeat=20 -// --extrinsic=* +// --chain=coretime-rococo-dev // --wasm-execution=compiled -// --heap-pages=4096 -// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json // --pallet=pallet_broker -// --chain=coretime-rococo-dev +// --no-storage-info +// --no-median-slopes +// --no-min-squares +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json // --header=./cumulus/file_header.txt // --output=./cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/ @@ -54,8 +56,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_403_000 picoseconds. - Weight::from_parts(2_504_000, 0) + // Minimum execution time: 2_462_000 picoseconds. + Weight::from_parts(2_552_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -65,8 +67,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `10888` // Estimated: `13506` - // Minimum execution time: 22_025_000 picoseconds. - Weight::from_parts(22_799_000, 0) + // Minimum execution time: 25_494_000 picoseconds. + Weight::from_parts(26_063_000, 0) .saturating_add(Weight::from_parts(0, 13506)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -77,8 +79,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `12090` // Estimated: `13506` - // Minimum execution time: 21_012_000 picoseconds. - Weight::from_parts(21_567_000, 0) + // Minimum execution time: 22_299_000 picoseconds. + Weight::from_parts(22_911_000, 0) .saturating_add(Weight::from_parts(0, 13506)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -87,20 +89,24 @@ impl pallet_broker::WeightInfo for WeightInfo { /// Proof: `Broker::Leases` (`max_values`: Some(1), `max_size`: Some(401), added: 896, mode: `MaxEncodedLen`) /// Storage: `ParachainSystem::ValidationData` (r:1 w:0) /// Proof: `ParachainSystem::ValidationData` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::LastRelayChainBlockNumber` (r:1 w:0) + /// Proof: `ParachainSystem::LastRelayChainBlockNumber` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) fn set_lease() -> Weight { // Proof Size summary in bytes: // Measured: `466` // Estimated: `1951` - // Minimum execution time: 10_767_000 picoseconds. - Weight::from_parts(11_364_000, 0) + // Minimum execution time: 11_590_000 picoseconds. + Weight::from_parts(12_007_000, 0) .saturating_add(Weight::from_parts(0, 1951)) - .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: `Broker::Configuration` (r:1 w:0) /// Proof: `Broker::Configuration` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`) /// Storage: `ParachainSystem::ValidationData` (r:1 w:0) /// Proof: `ParachainSystem::ValidationData` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `ParachainSystem::LastRelayChainBlockNumber` (r:1 w:0) + /// Proof: `ParachainSystem::LastRelayChainBlockNumber` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// Storage: `Broker::InstaPoolIo` (r:3 w:3) /// Proof: `Broker::InstaPoolIo` (`max_values`: None, `max_size`: Some(28), added: 2503, mode: `MaxEncodedLen`) /// Storage: `Broker::Reservations` (r:1 w:0) @@ -118,12 +124,12 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `12567` // Estimated: `14052` - // Minimum execution time: 112_187_000 picoseconds. - Weight::from_parts(115_233_014, 0) + // Minimum execution time: 120_928_000 picoseconds. + Weight::from_parts(124_947_252, 0) .saturating_add(Weight::from_parts(0, 14052)) - // Standard Error: 162 - .saturating_add(Weight::from_parts(539, 0).saturating_mul(n.into())) - .saturating_add(T::DbWeight::get().reads(7)) + // Standard Error: 435 + .saturating_add(Weight::from_parts(1_246, 0).saturating_mul(n.into())) + .saturating_add(T::DbWeight::get().reads(8)) .saturating_add(T::DbWeight::get().writes(66)) } /// Storage: `Broker::Status` (r:1 w:0) @@ -138,8 +144,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `316` // Estimated: `3593` - // Minimum execution time: 32_469_000 picoseconds. - Weight::from_parts(33_443_000, 0) + // Minimum execution time: 32_826_000 picoseconds. + Weight::from_parts(33_889_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) @@ -160,8 +166,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `434` // Estimated: `4698` - // Minimum execution time: 59_488_000 picoseconds. - Weight::from_parts(64_711_000, 0) + // Minimum execution time: 57_362_000 picoseconds. + Weight::from_parts(58_994_000, 0) .saturating_add(Weight::from_parts(0, 4698)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(4)) @@ -172,8 +178,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `357` // Estimated: `3550` - // Minimum execution time: 13_370_000 picoseconds. - Weight::from_parts(13_938_000, 0) + // Minimum execution time: 13_982_000 picoseconds. + Weight::from_parts(14_447_000, 0) .saturating_add(Weight::from_parts(0, 3550)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -184,23 +190,23 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `357` // Estimated: `3550` - // Minimum execution time: 14_592_000 picoseconds. - Weight::from_parts(15_235_000, 0) + // Minimum execution time: 15_070_000 picoseconds. + Weight::from_parts(15_735_000, 0) .saturating_add(Weight::from_parts(0, 3550)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } - /// Storage: `Broker::Regions` (r:1 w:2) + /// Storage: `Broker::Regions` (r:1 w:3) /// Proof: `Broker::Regions` (`max_values`: None, `max_size`: Some(85), added: 2560, mode: `MaxEncodedLen`) fn interlace() -> Weight { // Proof Size summary in bytes: // Measured: `357` // Estimated: `3550` - // Minimum execution time: 14_880_000 picoseconds. - Weight::from_parts(15_274_000, 0) + // Minimum execution time: 16_527_000 picoseconds. + Weight::from_parts(16_894_000, 0) .saturating_add(Weight::from_parts(0, 3550)) .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(2)) + .saturating_add(T::DbWeight::get().writes(3)) } /// Storage: `Broker::Configuration` (r:1 w:0) /// Proof: `Broker::Configuration` (`max_values`: Some(1), `max_size`: Some(31), added: 526, mode: `MaxEncodedLen`) @@ -214,8 +220,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `936` // Estimated: `4681` - // Minimum execution time: 24_786_000 picoseconds. - Weight::from_parts(26_047_000, 0) + // Minimum execution time: 25_493_000 picoseconds. + Weight::from_parts(26_091_000, 0) .saturating_add(Weight::from_parts(0, 4681)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -234,8 +240,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `1002` // Estimated: `5996` - // Minimum execution time: 31_159_000 picoseconds. - Weight::from_parts(31_770_000, 0) + // Minimum execution time: 31_498_000 picoseconds. + Weight::from_parts(32_560_000, 0) .saturating_add(Weight::from_parts(0, 5996)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(5)) @@ -251,11 +257,11 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `652` // Estimated: `6196 + m * (2520 ±0)` - // Minimum execution time: 56_524_000 picoseconds. - Weight::from_parts(58_065_019, 0) + // Minimum execution time: 57_183_000 picoseconds. + Weight::from_parts(58_024_898, 0) .saturating_add(Weight::from_parts(0, 6196)) - // Standard Error: 41_840 - .saturating_add(Weight::from_parts(1_322_201, 0).saturating_mul(m.into())) + // Standard Error: 35_831 + .saturating_add(Weight::from_parts(1_384_446, 0).saturating_mul(m.into())) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(m.into()))) .saturating_add(T::DbWeight::get().writes(5)) @@ -277,8 +283,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `215` // Estimated: `3680` - // Minimum execution time: 60_923_000 picoseconds. - Weight::from_parts(62_721_000, 0) + // Minimum execution time: 59_762_000 picoseconds. + Weight::from_parts(61_114_000, 0) .saturating_add(Weight::from_parts(0, 3680)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(3)) @@ -291,8 +297,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `465` // Estimated: `3550` - // Minimum execution time: 39_683_000 picoseconds. - Weight::from_parts(55_799_000, 0) + // Minimum execution time: 41_473_000 picoseconds. + Weight::from_parts(44_155_000, 0) .saturating_add(Weight::from_parts(0, 3550)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -307,8 +313,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `463` // Estimated: `3533` - // Minimum execution time: 90_833_000 picoseconds. - Weight::from_parts(97_249_000, 0) + // Minimum execution time: 56_672_000 picoseconds. + Weight::from_parts(58_086_000, 0) .saturating_add(Weight::from_parts(0, 3533)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) @@ -325,8 +331,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `857` // Estimated: `3593` - // Minimum execution time: 93_311_000 picoseconds. - Weight::from_parts(105_496_000, 0) + // Minimum execution time: 64_460_000 picoseconds. + Weight::from_parts(65_894_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(1)) @@ -339,8 +345,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `957` // Estimated: `4698` - // Minimum execution time: 44_597_000 picoseconds. - Weight::from_parts(48_739_000, 0) + // Minimum execution time: 37_447_000 picoseconds. + Weight::from_parts(42_318_000, 0) .saturating_add(Weight::from_parts(0, 4698)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -356,28 +362,28 @@ impl pallet_broker::WeightInfo for WeightInfo { /// Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) /// Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) /// The range of component `n` is `[0, 1000]`. - fn request_core_count(n: u32, ) -> Weight { + fn request_core_count(_n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `74` // Estimated: `3539` - // Minimum execution time: 22_114_000 picoseconds. - Weight::from_parts(23_031_633, 0) + // Minimum execution time: 21_219_000 picoseconds. + Weight::from_parts(22_084_648, 0) .saturating_add(Weight::from_parts(0, 3539)) - // Standard Error: 60 - .saturating_add(Weight::from_parts(60, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } /// Storage: `Broker::CoreCountInbox` (r:1 w:1) /// Proof: `Broker::CoreCountInbox` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 1000]`. - fn process_core_count(_n: u32, ) -> Weight { + fn process_core_count(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `266` // Estimated: `1487` - // Minimum execution time: 6_020_000 picoseconds. - Weight::from_parts(6_540_421, 0) + // Minimum execution time: 5_792_000 picoseconds. + Weight::from_parts(6_358_588, 0) .saturating_add(Weight::from_parts(0, 1487)) + // Standard Error: 20 + .saturating_add(Weight::from_parts(26, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -391,8 +397,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `447` // Estimated: `6196` - // Minimum execution time: 38_744_000 picoseconds. - Weight::from_parts(40_572_000, 0) + // Minimum execution time: 38_690_000 picoseconds. + Weight::from_parts(39_706_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(3)) @@ -408,13 +414,15 @@ impl pallet_broker::WeightInfo for WeightInfo { /// Storage: `Broker::Workplan` (r:0 w:60) /// Proof: `Broker::Workplan` (`max_values`: None, `max_size`: Some(1216), added: 3691, mode: `MaxEncodedLen`) /// The range of component `n` is `[0, 1000]`. - fn rotate_sale(_n: u32, ) -> Weight { + fn rotate_sale(n: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `12514` // Estimated: `13506` - // Minimum execution time: 94_727_000 picoseconds. - Weight::from_parts(97_766_746, 0) + // Minimum execution time: 93_531_000 picoseconds. + Weight::from_parts(95_836_318, 0) .saturating_add(Weight::from_parts(0, 13506)) + // Standard Error: 113 + .saturating_add(Weight::from_parts(329, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(65)) } @@ -426,8 +434,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `42` // Estimated: `3493` - // Minimum execution time: 6_496_000 picoseconds. - Weight::from_parts(6_757_000, 0) + // Minimum execution time: 6_506_000 picoseconds. + Weight::from_parts(6_783_000, 0) .saturating_add(Weight::from_parts(0, 3493)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -450,8 +458,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `1321` // Estimated: `4786` - // Minimum execution time: 33_164_000 picoseconds. - Weight::from_parts(33_800_000, 0) + // Minimum execution time: 31_927_000 picoseconds. + Weight::from_parts(32_748_000, 0) .saturating_add(Weight::from_parts(0, 4786)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(4)) @@ -470,21 +478,20 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `74` // Estimated: `3539` - // Minimum execution time: 16_884_000 picoseconds. - Weight::from_parts(17_315_000, 0) + // Minimum execution time: 15_682_000 picoseconds. + Weight::from_parts(16_012_000, 0) .saturating_add(Weight::from_parts(0, 3539)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) } /// Storage: `Broker::CoreCountInbox` (r:0 w:1) /// Proof: `Broker::CoreCountInbox` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`) - /// The range of component `n` is `[0, 1000]`. fn notify_core_count() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_017_000 picoseconds. - Weight::from_parts(2_210_693, 0) + // Minimum execution time: 2_147_000 picoseconds. + Weight::from_parts(2_281_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -502,8 +509,8 @@ impl pallet_broker::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `398` // Estimated: `3863` - // Minimum execution time: 12_118_000 picoseconds. - Weight::from_parts(12_541_000, 0) + // Minimum execution time: 12_015_000 picoseconds. + Weight::from_parts(12_619_000, 0) .saturating_add(Weight::from_parts(0, 3863)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_collator_selection.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_collator_selection.rs index ca740bc3550..b62a6c2fce5 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_collator_selection.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_collator_selection.rs @@ -17,21 +17,24 @@ //! Autogenerated weights for `pallet_collator_selection` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-12-07, STEPS: `2`, REPEAT: `1`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-01-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `dagda.local`, CPU: `` +//! HOSTNAME: `runner-j8vvqcjr-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-rococo-dev")`, DB CACHE: 1024 // Executed Command: -// target/release/polkadot-parachain +// ./target/production/polkadot-parachain // benchmark // pallet // --chain=coretime-rococo-dev // --wasm-execution=compiled // --pallet=pallet_collator_selection +// --no-storage-info +// --no-median-slopes +// --no-min-squares // --extrinsic=* -// --steps=2 -// --repeat=1 +// --steps=50 +// --repeat=20 // --json // --header=./cumulus/file_header.txt // --output=./cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/ @@ -52,15 +55,18 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// Storage: `CollatorSelection::Invulnerables` (r:0 w:1) /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) /// The range of component `b` is `[1, 20]`. - fn set_invulnerables(_b: u32, ) -> Weight { + fn set_invulnerables(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `162 + b * (79 ±0)` - // Estimated: `52242` - // Minimum execution time: 14_000_000 picoseconds. - Weight::from_parts(74_000_000, 0) - .saturating_add(Weight::from_parts(0, 52242)) - .saturating_add(T::DbWeight::get().reads(20)) + // Measured: `164 + b * (79 ±0)` + // Estimated: `1155 + b * (2555 ±0)` + // Minimum execution time: 11_551_000 picoseconds. + Weight::from_parts(8_982_740, 0) + .saturating_add(Weight::from_parts(0, 1155)) + // Standard Error: 6_117 + .saturating_add(Weight::from_parts(3_093_494, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(b.into()))) .saturating_add(T::DbWeight::get().writes(1)) + .saturating_add(Weight::from_parts(0, 2555).saturating_mul(b.into())) } /// Storage: `Session::NextKeys` (r:1 w:0) /// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`) @@ -74,18 +80,18 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// The range of component `c` is `[1, 99]`. fn add_invulnerable(b: u32, c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `796 + b * (32 ±0) + c * (52 ±0)` - // Estimated: `6287 + b * (32 ±0) + c * (53 ±0)` - // Minimum execution time: 39_000_000 picoseconds. - Weight::from_parts(37_903_628, 0) + // Measured: `720 + b * (32 ±0) + c * (53 ±0)` + // Estimated: `6287 + b * (37 ±0) + c * (53 ±0)` + // Minimum execution time: 38_580_000 picoseconds. + Weight::from_parts(39_137_598, 0) .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 96_225 - .saturating_add(Weight::from_parts(55_555, 0).saturating_mul(b.into())) - // Standard Error: 17_673 - .saturating_add(Weight::from_parts(40_816, 0).saturating_mul(c.into())) + // Standard Error: 6_413 + .saturating_add(Weight::from_parts(119_463, 0).saturating_mul(b.into())) + // Standard Error: 1_215 + .saturating_add(Weight::from_parts(120_116, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(3)) - .saturating_add(Weight::from_parts(0, 32).saturating_mul(b.into())) + .saturating_add(Weight::from_parts(0, 37).saturating_mul(b.into())) .saturating_add(Weight::from_parts(0, 53).saturating_mul(c.into())) } /// Storage: `CollatorSelection::CandidateList` (r:1 w:0) @@ -93,13 +99,15 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// Storage: `CollatorSelection::Invulnerables` (r:1 w:1) /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) /// The range of component `b` is `[5, 20]`. - fn remove_invulnerable(_b: u32, ) -> Weight { + fn remove_invulnerable(b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `82 + b * (32 ±0)` // Estimated: `6287` - // Minimum execution time: 12_000_000 picoseconds. - Weight::from_parts(12_000_000, 0) + // Minimum execution time: 11_347_000 picoseconds. + Weight::from_parts(11_332_550, 0) .saturating_add(Weight::from_parts(0, 6287)) + // Standard Error: 2_287 + .saturating_add(Weight::from_parts(134_624, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -109,8 +117,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_000_000 picoseconds. - Weight::from_parts(6_000_000, 0) + // Minimum execution time: 4_883_000 picoseconds. + Weight::from_parts(5_141_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -126,32 +134,36 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// The range of component `k` is `[0, 100]`. fn set_candidacy_bond(c: u32, k: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `0 + c * (179 ±0) + k * (130 ±0)` - // Estimated: `261290` - // Minimum execution time: 11_000_000 picoseconds. - Weight::from_parts(11_000_000, 0) - .saturating_add(Weight::from_parts(0, 261290)) - // Standard Error: 5_514_936 - .saturating_add(Weight::from_parts(6_438_000, 0).saturating_mul(c.into())) - // Standard Error: 5_514_936 - .saturating_add(Weight::from_parts(6_368_000, 0).saturating_mul(k.into())) + // Measured: `0 + c * (180 ±0) + k * (112 ±0)` + // Estimated: `6287 + c * (901 ±29) + k * (901 ±29)` + // Minimum execution time: 8_661_000 picoseconds. + Weight::from_parts(8_852_000, 0) + .saturating_add(Weight::from_parts(0, 6287)) + // Standard Error: 159_154 + .saturating_add(Weight::from_parts(5_352_946, 0).saturating_mul(c.into())) + // Standard Error: 159_154 + .saturating_add(Weight::from_parts(5_075_906, 0).saturating_mul(k.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(c.into()))) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(k.into()))) + .saturating_add(Weight::from_parts(0, 901).saturating_mul(c.into())) + .saturating_add(Weight::from_parts(0, 901).saturating_mul(k.into())) } /// Storage: `CollatorSelection::CandidacyBond` (r:1 w:0) /// Proof: `CollatorSelection::CandidacyBond` (`max_values`: Some(1), `max_size`: Some(16), added: 511, mode: `MaxEncodedLen`) /// Storage: `CollatorSelection::CandidateList` (r:1 w:1) /// Proof: `CollatorSelection::CandidateList` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) /// The range of component `c` is `[4, 100]`. - fn update_bond(_c: u32, ) -> Weight { + fn update_bond(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `243 + c * (50 ±0)` + // Measured: `250 + c * (50 ±0)` // Estimated: `6287` - // Minimum execution time: 26_000_000 picoseconds. - Weight::from_parts(36_000_000, 0) + // Minimum execution time: 23_840_000 picoseconds. + Weight::from_parts(26_343_302, 0) .saturating_add(Weight::from_parts(0, 6287)) + // Standard Error: 1_743 + .saturating_add(Weight::from_parts(118_295, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -166,15 +178,18 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// Storage: `CollatorSelection::LastAuthoredBlock` (r:0 w:1) /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) /// The range of component `c` is `[1, 99]`. - fn register_as_candidate(_c: u32, ) -> Weight { + fn register_as_candidate(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `441 + c * (54 ±0)` - // Estimated: `9299` - // Minimum execution time: 39_000_000 picoseconds. - Weight::from_parts(40_000_000, 0) - .saturating_add(Weight::from_parts(0, 9299)) + // Measured: `687 + c * (52 ±0)` + // Estimated: `6287 + c * (54 ±0)` + // Minimum execution time: 31_637_000 picoseconds. + Weight::from_parts(35_792_418, 0) + .saturating_add(Weight::from_parts(0, 6287)) + // Standard Error: 2_274 + .saturating_add(Weight::from_parts(146_163, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) + .saturating_add(Weight::from_parts(0, 54).saturating_mul(c.into())) } /// Storage: `CollatorSelection::Invulnerables` (r:1 w:0) /// Proof: `CollatorSelection::Invulnerables` (`max_values`: Some(1), `max_size`: Some(641), added: 1136, mode: `MaxEncodedLen`) @@ -189,15 +204,18 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// Storage: `CollatorSelection::LastAuthoredBlock` (r:0 w:2) /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) /// The range of component `c` is `[4, 100]`. - fn take_candidate_slot(_c: u32, ) -> Weight { + fn take_candidate_slot(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `589 + c * (54 ±0)` - // Estimated: `9521` - // Minimum execution time: 54_000_000 picoseconds. - Weight::from_parts(59_000_000, 0) - .saturating_add(Weight::from_parts(0, 9521)) + // Measured: `855 + c * (52 ±0)` + // Estimated: `6287 + c * (55 ±0)` + // Minimum execution time: 47_931_000 picoseconds. + Weight::from_parts(52_506_905, 0) + .saturating_add(Weight::from_parts(0, 6287)) + // Standard Error: 2_696 + .saturating_add(Weight::from_parts(149_395, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(4)) + .saturating_add(Weight::from_parts(0, 55).saturating_mul(c.into())) } /// Storage: `CollatorSelection::CandidateList` (r:1 w:1) /// Proof: `CollatorSelection::CandidateList` (`max_values`: Some(1), `max_size`: Some(4802), added: 5297, mode: `MaxEncodedLen`) @@ -206,13 +224,15 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// Storage: `CollatorSelection::LastAuthoredBlock` (r:0 w:1) /// Proof: `CollatorSelection::LastAuthoredBlock` (`max_values`: None, `max_size`: Some(44), added: 2519, mode: `MaxEncodedLen`) /// The range of component `c` is `[4, 100]`. - fn leave_intent(_c: u32, ) -> Weight { + fn leave_intent(c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `268 + c * (48 ±0)` + // Measured: `277 + c * (48 ±0)` // Estimated: `6287` - // Minimum execution time: 31_000_000 picoseconds. - Weight::from_parts(38_000_000, 0) + // Minimum execution time: 27_658_000 picoseconds. + Weight::from_parts(30_896_953, 0) .saturating_add(Weight::from_parts(0, 6287)) + // Standard Error: 2_038 + .saturating_add(Weight::from_parts(120_980, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -226,8 +246,8 @@ impl pallet_collator_selection::WeightInfo for WeightIn // Proof Size summary in bytes: // Measured: `103` // Estimated: `6196` - // Minimum execution time: 49_000_000 picoseconds. - Weight::from_parts(49_000_000, 0) + // Minimum execution time: 37_700_000 picoseconds. + Weight::from_parts(38_497_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(4)) @@ -242,24 +262,24 @@ impl pallet_collator_selection::WeightInfo for WeightIn /// Proof: `CollatorSelection::DesiredCandidates` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) /// Storage: `System::BlockWeight` (r:1 w:1) /// Proof: `System::BlockWeight` (`max_values`: Some(1), `max_size`: Some(48), added: 543, mode: `MaxEncodedLen`) - /// Storage: `System::Account` (r:1 w:1) + /// Storage: `System::Account` (r:97 w:97) /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// The range of component `r` is `[1, 100]`. /// The range of component `c` is `[1, 100]`. fn new_session(r: u32, c: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `340 + c * (97 ±0)` - // Estimated: `6287 + c * (2519 ±0)` - // Minimum execution time: 19_000_000 picoseconds. - Weight::from_parts(11_136_363, 0) + // Measured: `2143 + c * (97 ±0) + r * (112 ±0)` + // Estimated: `6287 + c * (2519 ±0) + r * (2603 ±0)` + // Minimum execution time: 16_077_000 picoseconds. + Weight::from_parts(16_274_000, 0) .saturating_add(Weight::from_parts(0, 6287)) - // Standard Error: 323_666 - .saturating_add(Weight::from_parts(35_353, 0).saturating_mul(r.into())) - // Standard Error: 323_666 - .saturating_add(Weight::from_parts(4_328_282, 0).saturating_mul(c.into())) + // Standard Error: 283_859 + .saturating_add(Weight::from_parts(12_293_155, 0).saturating_mul(c.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(c.into()))) - .saturating_add(T::DbWeight::get().writes(4)) + .saturating_add(T::DbWeight::get().writes(1)) + .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(c.into()))) .saturating_add(Weight::from_parts(0, 2519).saturating_mul(c.into())) + .saturating_add(Weight::from_parts(0, 2603).saturating_mul(r.into())) } } diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_message_queue.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_message_queue.rs index e0e8c79ca17..934ab627bc8 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_message_queue.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_message_queue.rs @@ -17,21 +17,24 @@ //! Autogenerated weights for `pallet_message_queue` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-12-07, STEPS: `2`, REPEAT: `1`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-01-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `dagda.local`, CPU: `` +//! HOSTNAME: `runner-j8vvqcjr-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-rococo-dev")`, DB CACHE: 1024 // Executed Command: -// target/release/polkadot-parachain +// ./target/production/polkadot-parachain // benchmark // pallet // --chain=coretime-rococo-dev // --wasm-execution=compiled // --pallet=pallet_message_queue +// --no-storage-info +// --no-median-slopes +// --no-min-squares // --extrinsic=* -// --steps=2 -// --repeat=1 +// --steps=50 +// --repeat=20 // --json // --header=./cumulus/file_header.txt // --output=./cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/ @@ -55,8 +58,8 @@ impl pallet_message_queue::WeightInfo for WeightInfo // Proof Size summary in bytes: // Measured: `223` // Estimated: `6044` - // Minimum execution time: 13_000_000 picoseconds. - Weight::from_parts(13_000_000, 0) + // Minimum execution time: 11_120_000 picoseconds. + Weight::from_parts(11_605_000, 0) .saturating_add(Weight::from_parts(0, 6044)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(2)) @@ -69,8 +72,8 @@ impl pallet_message_queue::WeightInfo for WeightInfo // Proof Size summary in bytes: // Measured: `218` // Estimated: `6044` - // Minimum execution time: 12_000_000 picoseconds. - Weight::from_parts(12_000_000, 0) + // Minimum execution time: 9_795_000 picoseconds. + Weight::from_parts(10_300_000, 0) .saturating_add(Weight::from_parts(0, 6044)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(3)) @@ -81,8 +84,8 @@ impl pallet_message_queue::WeightInfo for WeightInfo // Proof Size summary in bytes: // Measured: `6` // Estimated: `3517` - // Minimum execution time: 4_000_000 picoseconds. - Weight::from_parts(4_000_000, 0) + // Minimum execution time: 3_277_000 picoseconds. + Weight::from_parts(3_426_000, 0) .saturating_add(Weight::from_parts(0, 3517)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -93,8 +96,8 @@ impl pallet_message_queue::WeightInfo for WeightInfo // Proof Size summary in bytes: // Measured: `72` // Estimated: `69050` - // Minimum execution time: 7_000_000 picoseconds. - Weight::from_parts(7_000_000, 0) + // Minimum execution time: 5_016_000 picoseconds. + Weight::from_parts(5_237_000, 0) .saturating_add(Weight::from_parts(0, 69050)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -105,19 +108,24 @@ impl pallet_message_queue::WeightInfo for WeightInfo // Proof Size summary in bytes: // Measured: `72` // Estimated: `69050` - // Minimum execution time: 7_000_000 picoseconds. - Weight::from_parts(7_000_000, 0) + // Minimum execution time: 5_118_000 picoseconds. + Weight::from_parts(5_347_000, 0) .saturating_add(Weight::from_parts(0, 69050)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } + /// Storage: `MessageQueue::BookStateFor` (r:0 w:1) + /// Proof: `MessageQueue::BookStateFor` (`max_values`: None, `max_size`: Some(52), added: 2527, mode: `MaxEncodedLen`) + /// Storage: `MessageQueue::Pages` (r:0 w:1) + /// Proof: `MessageQueue::Pages` (`max_values`: None, `max_size`: Some(65585), added: 68060, mode: `MaxEncodedLen`) fn service_page_item() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 65_000_000 picoseconds. - Weight::from_parts(65_000_000, 0) + // Minimum execution time: 175_756_000 picoseconds. + Weight::from_parts(177_423_000, 0) .saturating_add(Weight::from_parts(0, 0)) + .saturating_add(T::DbWeight::get().writes(2)) } /// Storage: `MessageQueue::ServiceHead` (r:1 w:1) /// Proof: `MessageQueue::ServiceHead` (`max_values`: Some(1), `max_size`: Some(5), added: 500, mode: `MaxEncodedLen`) @@ -127,8 +135,8 @@ impl pallet_message_queue::WeightInfo for WeightInfo // Proof Size summary in bytes: // Measured: `171` // Estimated: `3517` - // Minimum execution time: 8_000_000 picoseconds. - Weight::from_parts(8_000_000, 0) + // Minimum execution time: 6_515_000 picoseconds. + Weight::from_parts(6_953_000, 0) .saturating_add(Weight::from_parts(0, 3517)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -141,8 +149,8 @@ impl pallet_message_queue::WeightInfo for WeightInfo // Proof Size summary in bytes: // Measured: `65667` // Estimated: `69050` - // Minimum execution time: 73_000_000 picoseconds. - Weight::from_parts(73_000_000, 0) + // Minimum execution time: 57_649_000 picoseconds. + Weight::from_parts(59_093_000, 0) .saturating_add(Weight::from_parts(0, 69050)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -155,8 +163,8 @@ impl pallet_message_queue::WeightInfo for WeightInfo // Proof Size summary in bytes: // Measured: `65667` // Estimated: `69050` - // Minimum execution time: 74_000_000 picoseconds. - Weight::from_parts(74_000_000, 0) + // Minimum execution time: 73_366_000 picoseconds. + Weight::from_parts(74_402_000, 0) .saturating_add(Weight::from_parts(0, 69050)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) @@ -169,8 +177,8 @@ impl pallet_message_queue::WeightInfo for WeightInfo // Proof Size summary in bytes: // Measured: `65667` // Estimated: `69050` - // Minimum execution time: 109_000_000 picoseconds. - Weight::from_parts(109_000_000, 0) + // Minimum execution time: 116_063_000 picoseconds. + Weight::from_parts(117_532_000, 0) .saturating_add(Weight::from_parts(0, 69050)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_multisig.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_multisig.rs index 421fc033e7c..8e010d768f6 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_multisig.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_multisig.rs @@ -17,21 +17,24 @@ //! Autogenerated weights for `pallet_multisig` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-12-07, STEPS: `2`, REPEAT: `1`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-01-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `dagda.local`, CPU: `` +//! HOSTNAME: `runner-j8vvqcjr-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-rococo-dev")`, DB CACHE: 1024 // Executed Command: -// target/release/polkadot-parachain +// ./target/production/polkadot-parachain // benchmark // pallet // --chain=coretime-rococo-dev // --wasm-execution=compiled // --pallet=pallet_multisig +// --no-storage-info +// --no-median-slopes +// --no-min-squares // --extrinsic=* -// --steps=2 -// --repeat=1 +// --steps=50 +// --repeat=20 // --json // --header=./cumulus/file_header.txt // --output=./cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/ @@ -48,27 +51,31 @@ use core::marker::PhantomData; pub struct WeightInfo(PhantomData); impl pallet_multisig::WeightInfo for WeightInfo { /// The range of component `z` is `[0, 10000]`. - fn as_multi_threshold_1(_z: u32, ) -> Weight { + fn as_multi_threshold_1(z: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 13_000_000 picoseconds. - Weight::from_parts(16_000_000, 0) + // Minimum execution time: 12_905_000 picoseconds. + Weight::from_parts(13_544_225, 0) .saturating_add(Weight::from_parts(0, 0)) + // Standard Error: 2 + .saturating_add(Weight::from_parts(596, 0).saturating_mul(z.into())) } /// Storage: `Multisig::Multisigs` (r:1 w:1) /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) /// The range of component `s` is `[2, 100]`. /// The range of component `z` is `[0, 10000]`. - fn as_multi_create(_s: u32, z: u32, ) -> Weight { + fn as_multi_create(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `172 + s * (3 ±0)` + // Measured: `262 + s * (2 ±0)` // Estimated: `6811` - // Minimum execution time: 35_000_000 picoseconds. - Weight::from_parts(36_530_612, 0) + // Minimum execution time: 38_729_000 picoseconds. + Weight::from_parts(27_942_442, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 259 - .saturating_add(Weight::from_parts(1_650, 0).saturating_mul(z.into())) + // Standard Error: 648 + .saturating_add(Weight::from_parts(120_340, 0).saturating_mul(s.into())) + // Standard Error: 6 + .saturating_add(Weight::from_parts(1_578, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -80,13 +87,13 @@ impl pallet_multisig::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `282` // Estimated: `6811` - // Minimum execution time: 21_000_000 picoseconds. - Weight::from_parts(18_422_680, 0) + // Minimum execution time: 25_936_000 picoseconds. + Weight::from_parts(16_537_903, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 8_928 - .saturating_add(Weight::from_parts(25_773, 0).saturating_mul(s.into())) - // Standard Error: 86 - .saturating_add(Weight::from_parts(1_250, 0).saturating_mul(z.into())) + // Standard Error: 412 + .saturating_add(Weight::from_parts(105_835, 0).saturating_mul(s.into())) + // Standard Error: 4 + .saturating_add(Weight::from_parts(1_534, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -96,54 +103,62 @@ impl pallet_multisig::WeightInfo for WeightInfo { /// Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) /// The range of component `s` is `[2, 100]`. /// The range of component `z` is `[0, 10000]`. - fn as_multi_complete(_s: u32, z: u32, ) -> Weight { + fn as_multi_complete(s: u32, z: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `315 + s * (34 ±0)` + // Measured: `385 + s * (33 ±0)` // Estimated: `6811` - // Minimum execution time: 53_000_000 picoseconds. - Weight::from_parts(56_571_428, 0) + // Minimum execution time: 45_291_000 picoseconds. + Weight::from_parts(31_294_385, 0) .saturating_add(Weight::from_parts(0, 6811)) - // Standard Error: 86 - .saturating_add(Weight::from_parts(150, 0).saturating_mul(z.into())) + // Standard Error: 816 + .saturating_add(Weight::from_parts(152_838, 0).saturating_mul(s.into())) + // Standard Error: 8 + .saturating_add(Weight::from_parts(1_638, 0).saturating_mul(z.into())) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } /// Storage: `Multisig::Multisigs` (r:1 w:1) /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) /// The range of component `s` is `[2, 100]`. - fn approve_as_multi_create(_s: u32, ) -> Weight { + fn approve_as_multi_create(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `172 + s * (3 ±0)` + // Measured: `263 + s * (2 ±0)` // Estimated: `6811` - // Minimum execution time: 32_000_000 picoseconds. - Weight::from_parts(35_000_000, 0) + // Minimum execution time: 26_585_000 picoseconds. + Weight::from_parts(27_424_168, 0) .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 732 + .saturating_add(Weight::from_parts(123_460, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: `Multisig::Multisigs` (r:1 w:1) /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) /// The range of component `s` is `[2, 100]`. - fn approve_as_multi_approve(_s: u32, ) -> Weight { + fn approve_as_multi_approve(s: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `282` // Estimated: `6811` - // Minimum execution time: 17_000_000 picoseconds. - Weight::from_parts(21_000_000, 0) + // Minimum execution time: 15_228_000 picoseconds. + Weight::from_parts(15_568_631, 0) .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 441 + .saturating_add(Weight::from_parts(107_463, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } /// Storage: `Multisig::Multisigs` (r:1 w:1) /// Proof: `Multisig::Multisigs` (`max_values`: None, `max_size`: Some(3346), added: 5821, mode: `MaxEncodedLen`) /// The range of component `s` is `[2, 100]`. - fn cancel_as_multi(_s: u32, ) -> Weight { + fn cancel_as_multi(s: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `379 + s * (2 ±0)` + // Measured: `454 + s * (1 ±0)` // Estimated: `6811` - // Minimum execution time: 31_000_000 picoseconds. - Weight::from_parts(40_000_000, 0) + // Minimum execution time: 28_033_000 picoseconds. + Weight::from_parts(29_228_827, 0) .saturating_add(Weight::from_parts(0, 6811)) + // Standard Error: 748 + .saturating_add(Weight::from_parts(117_495, 0).saturating_mul(s.into())) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_session.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_session.rs index 5151bcaa9e4..409d92be4fc 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_session.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_session.rs @@ -17,21 +17,24 @@ //! Autogenerated weights for `pallet_session` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-12-07, STEPS: `2`, REPEAT: `1`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-01-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `dagda.local`, CPU: `` +//! HOSTNAME: `runner-j8vvqcjr-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-rococo-dev")`, DB CACHE: 1024 // Executed Command: -// target/release/polkadot-parachain +// ./target/production/polkadot-parachain // benchmark // pallet // --chain=coretime-rococo-dev // --wasm-execution=compiled // --pallet=pallet_session +// --no-storage-info +// --no-median-slopes +// --no-min-squares // --extrinsic=* -// --steps=2 -// --repeat=1 +// --steps=50 +// --repeat=20 // --json // --header=./cumulus/file_header.txt // --output=./cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/ @@ -53,11 +56,11 @@ impl pallet_session::WeightInfo for WeightInfo { /// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`) fn set_keys() -> Weight { // Proof Size summary in bytes: - // Measured: `270` - // Estimated: `3735` - // Minimum execution time: 19_000_000 picoseconds. - Weight::from_parts(19_000_000, 0) - .saturating_add(Weight::from_parts(0, 3735)) + // Measured: `271` + // Estimated: `3736` + // Minimum execution time: 15_924_000 picoseconds. + Weight::from_parts(16_586_000, 0) + .saturating_add(Weight::from_parts(0, 3736)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } @@ -67,11 +70,11 @@ impl pallet_session::WeightInfo for WeightInfo { /// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`) fn purge_keys() -> Weight { // Proof Size summary in bytes: - // Measured: `242` - // Estimated: `3707` - // Minimum execution time: 13_000_000 picoseconds. - Weight::from_parts(13_000_000, 0) - .saturating_add(Weight::from_parts(0, 3707)) + // Measured: `243` + // Estimated: `3708` + // Minimum execution time: 11_218_000 picoseconds. + Weight::from_parts(11_587_000, 0) + .saturating_add(Weight::from_parts(0, 3708)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_timestamp.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_timestamp.rs index c2a23bf2a73..c171353404e 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_timestamp.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_timestamp.rs @@ -17,21 +17,24 @@ //! Autogenerated weights for `pallet_timestamp` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-12-07, STEPS: `2`, REPEAT: `1`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-01-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `dagda.local`, CPU: `` +//! HOSTNAME: `runner-j8vvqcjr-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-rococo-dev")`, DB CACHE: 1024 // Executed Command: -// target/release/polkadot-parachain +// ./target/production/polkadot-parachain // benchmark // pallet // --chain=coretime-rococo-dev // --wasm-execution=compiled // --pallet=pallet_timestamp +// --no-storage-info +// --no-median-slopes +// --no-min-squares // --extrinsic=* -// --steps=2 -// --repeat=1 +// --steps=50 +// --repeat=20 // --json // --header=./cumulus/file_header.txt // --output=./cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/ @@ -53,10 +56,10 @@ impl pallet_timestamp::WeightInfo for WeightInfo { /// Proof: `Aura::CurrentSlot` (`max_values`: Some(1), `max_size`: Some(8), added: 503, mode: `MaxEncodedLen`) fn set() -> Weight { // Proof Size summary in bytes: - // Measured: `49` + // Measured: `86` // Estimated: `1493` - // Minimum execution time: 8_000_000 picoseconds. - Weight::from_parts(8_000_000, 0) + // Minimum execution time: 5_979_000 picoseconds. + Weight::from_parts(6_115_000, 0) .saturating_add(Weight::from_parts(0, 1493)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -65,8 +68,8 @@ impl pallet_timestamp::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `57` // Estimated: `0` - // Minimum execution time: 3_000_000 picoseconds. - Weight::from_parts(3_000_000, 0) + // Minimum execution time: 2_830_000 picoseconds. + Weight::from_parts(2_988_000, 0) .saturating_add(Weight::from_parts(0, 0)) } } diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_utility.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_utility.rs index cf3cc98b593..84eb9783868 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_utility.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_utility.rs @@ -17,21 +17,24 @@ //! Autogenerated weights for `pallet_utility` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-12-07, STEPS: `2`, REPEAT: `1`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-01-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `dagda.local`, CPU: `` +//! HOSTNAME: `runner-j8vvqcjr-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-rococo-dev")`, DB CACHE: 1024 // Executed Command: -// target/release/polkadot-parachain +// ./target/production/polkadot-parachain // benchmark // pallet // --chain=coretime-rococo-dev // --wasm-execution=compiled // --pallet=pallet_utility +// --no-storage-info +// --no-median-slopes +// --no-min-squares // --extrinsic=* -// --steps=2 -// --repeat=1 +// --steps=50 +// --repeat=20 // --json // --header=./cumulus/file_header.txt // --output=./cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/ @@ -48,46 +51,52 @@ use core::marker::PhantomData; pub struct WeightInfo(PhantomData); impl pallet_utility::WeightInfo for WeightInfo { /// The range of component `c` is `[0, 1000]`. - fn batch(_c: u32, ) -> Weight { + fn batch(c: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_000_000 picoseconds. - Weight::from_parts(4_117_000_000, 0) + // Minimum execution time: 4_434_000 picoseconds. + Weight::from_parts(2_232_360, 0) .saturating_add(Weight::from_parts(0, 0)) + // Standard Error: 3_409 + .saturating_add(Weight::from_parts(3_308_287, 0).saturating_mul(c.into())) } fn as_derivative() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_000_000 picoseconds. - Weight::from_parts(7_000_000, 0) + // Minimum execution time: 4_455_000 picoseconds. + Weight::from_parts(4_561_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. - fn batch_all(_c: u32, ) -> Weight { + fn batch_all(c: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_000_000 picoseconds. - Weight::from_parts(4_519_000_000, 0) + // Minimum execution time: 4_304_000 picoseconds. + Weight::from_parts(4_146_029, 0) .saturating_add(Weight::from_parts(0, 0)) + // Standard Error: 3_128 + .saturating_add(Weight::from_parts(3_581_489, 0).saturating_mul(c.into())) } fn dispatch_as() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 9_000_000 picoseconds. - Weight::from_parts(9_000_000, 0) + // Minimum execution time: 6_531_000 picoseconds. + Weight::from_parts(6_805_000, 0) .saturating_add(Weight::from_parts(0, 0)) } /// The range of component `c` is `[0, 1000]`. - fn force_batch(_c: u32, ) -> Weight { + fn force_batch(c: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_000_000 picoseconds. - Weight::from_parts(4_114_000_000, 0) + // Minimum execution time: 4_412_000 picoseconds. + Weight::from_parts(4_498_000, 0) .saturating_add(Weight::from_parts(0, 0)) + // Standard Error: 1_621 + .saturating_add(Weight::from_parts(3_312_302, 0).saturating_mul(c.into())) } } diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_xcm.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_xcm.rs index 538401ef2c5..0e34cba4aaf 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_xcm.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/pallet_xcm.rs @@ -17,21 +17,24 @@ //! Autogenerated weights for `pallet_xcm` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-12-07, STEPS: `2`, REPEAT: `1`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-01-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `dagda.local`, CPU: `` +//! HOSTNAME: `runner-j8vvqcjr-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("coretime-rococo-dev")`, DB CACHE: 1024 // Executed Command: -// target/release/polkadot-parachain +// ./target/production/polkadot-parachain // benchmark // pallet // --chain=coretime-rococo-dev // --wasm-execution=compiled // --pallet=pallet_xcm +// --no-storage-info +// --no-median-slopes +// --no-min-squares // --extrinsic=* -// --steps=2 -// --repeat=1 +// --steps=50 +// --repeat=20 // --json // --header=./cumulus/file_header.txt // --output=./cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/ @@ -61,8 +64,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `74` // Estimated: `3539` - // Minimum execution time: 37_000_000 picoseconds. - Weight::from_parts(37_000_000, 0) + // Minimum execution time: 22_669_000 picoseconds. + Weight::from_parts(23_227_000, 0) .saturating_add(Weight::from_parts(0, 3539)) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(2)) @@ -83,8 +86,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `3571` - // Minimum execution time: 86_000_000 picoseconds. - Weight::from_parts(86_000_000, 0) + // Minimum execution time: 64_486_000 picoseconds. + Weight::from_parts(65_247_000, 0) .saturating_add(Weight::from_parts(0, 3571)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(2)) @@ -125,8 +128,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 13_000_000 picoseconds. - Weight::from_parts(13_000_000, 0) + // Minimum execution time: 7_020_000 picoseconds. + Weight::from_parts(7_300_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -136,8 +139,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_000_000 picoseconds. - Weight::from_parts(4_000_000, 0) + // Minimum execution time: 2_022_000 picoseconds. + Weight::from_parts(2_141_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -161,8 +164,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `74` // Estimated: `3539` - // Minimum execution time: 37_000_000 picoseconds. - Weight::from_parts(37_000_000, 0) + // Minimum execution time: 26_893_000 picoseconds. + Weight::from_parts(27_497_000, 0) .saturating_add(Weight::from_parts(0, 3539)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(5)) @@ -185,8 +188,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `292` // Estimated: `3757` - // Minimum execution time: 72_000_000 picoseconds. - Weight::from_parts(72_000_000, 0) + // Minimum execution time: 29_673_000 picoseconds. + Weight::from_parts(30_693_000, 0) .saturating_add(Weight::from_parts(0, 3757)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(4)) @@ -197,8 +200,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 4_000_000 picoseconds. - Weight::from_parts(4_000_000, 0) + // Minimum execution time: 1_990_000 picoseconds. + Weight::from_parts(2_105_000, 0) .saturating_add(Weight::from_parts(0, 0)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -208,8 +211,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `95` // Estimated: `10985` - // Minimum execution time: 19_000_000 picoseconds. - Weight::from_parts(19_000_000, 0) + // Minimum execution time: 14_819_000 picoseconds. + Weight::from_parts(15_180_000, 0) .saturating_add(Weight::from_parts(0, 10985)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -220,8 +223,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `99` // Estimated: `10989` - // Minimum execution time: 19_000_000 picoseconds. - Weight::from_parts(19_000_000, 0) + // Minimum execution time: 14_935_000 picoseconds. + Weight::from_parts(15_335_000, 0) .saturating_add(Weight::from_parts(0, 10989)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -232,8 +235,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `13471` - // Minimum execution time: 22_000_000 picoseconds. - Weight::from_parts(22_000_000, 0) + // Minimum execution time: 16_278_000 picoseconds. + Weight::from_parts(16_553_000, 0) .saturating_add(Weight::from_parts(0, 13471)) .saturating_add(T::DbWeight::get().reads(5)) } @@ -253,8 +256,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `142` // Estimated: `6082` - // Minimum execution time: 32_000_000 picoseconds. - Weight::from_parts(32_000_000, 0) + // Minimum execution time: 26_360_000 picoseconds. + Weight::from_parts(26_868_000, 0) .saturating_add(Weight::from_parts(0, 6082)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) @@ -265,8 +268,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `136` // Estimated: `8551` - // Minimum execution time: 12_000_000 picoseconds. - Weight::from_parts(12_000_000, 0) + // Minimum execution time: 8_615_000 picoseconds. + Weight::from_parts(8_903_000, 0) .saturating_add(Weight::from_parts(0, 8551)) .saturating_add(T::DbWeight::get().reads(3)) } @@ -276,8 +279,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `106` // Estimated: `10996` - // Minimum execution time: 19_000_000 picoseconds. - Weight::from_parts(19_000_000, 0) + // Minimum execution time: 15_284_000 picoseconds. + Weight::from_parts(15_504_000, 0) .saturating_add(Weight::from_parts(0, 10996)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -298,8 +301,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `148` // Estimated: `11038` - // Minimum execution time: 39_000_000 picoseconds. - Weight::from_parts(39_000_000, 0) + // Minimum execution time: 32_675_000 picoseconds. + Weight::from_parts(33_816_000, 0) .saturating_add(Weight::from_parts(0, 11038)) .saturating_add(T::DbWeight::get().reads(9)) .saturating_add(T::DbWeight::get().writes(4)) @@ -312,8 +315,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `32` // Estimated: `1517` - // Minimum execution time: 5_000_000 picoseconds. - Weight::from_parts(5_000_000, 0) + // Minimum execution time: 4_058_000 picoseconds. + Weight::from_parts(4_170_000, 0) .saturating_add(Weight::from_parts(0, 1517)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) @@ -324,8 +327,8 @@ impl pallet_xcm::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `7669` // Estimated: `11134` - // Minimum execution time: 31_000_000 picoseconds. - Weight::from_parts(31_000_000, 0) + // Minimum execution time: 25_375_000 picoseconds. + Weight::from_parts(26_026_000, 0) .saturating_add(Weight::from_parts(0, 11134)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs index 7fab3584250..ec71a87b5a7 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs @@ -17,26 +17,28 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::fungible` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-11-15, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-01-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-yprdrvc7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-rococo-dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-j8vvqcjr-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: Compiled, CHAIN: Some("coretime-rococo-dev"), DB CACHE: 1024 // Executed Command: -// target/production/polkadot-parachain +// ./target/production/polkadot-parachain // benchmark // pallet -// --steps=50 -// --repeat=20 -// --extrinsic=* +// --template=./cumulus/templates/xcm-bench-template.hbs +// --chain=coretime-rococo-dev // --wasm-execution=compiled -// --heap-pages=4096 -// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json // --pallet=pallet_xcm_benchmarks::fungible -// --chain=asset-hub-rococo-dev +// --no-storage-info +// --no-median-slopes +// --no-min-squares +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json // --header=./cumulus/file_header.txt -// --template=./cumulus/templates/xcm-bench-template.hbs -// --output=./cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/xcm/ +// --output=./cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_fungible.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -54,8 +56,8 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `101` // Estimated: `3593` - // Minimum execution time: 21_643_000 picoseconds. - Weight::from_parts(22_410_000, 3593) + // Minimum execution time: 19_199_000 picoseconds. + Weight::from_parts(19_784_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -65,17 +67,15 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `101` // Estimated: `6196` - // Minimum execution time: 43_758_000 picoseconds. - Weight::from_parts(44_654_000, 6196) + // Minimum execution time: 42_601_000 picoseconds. + Weight::from_parts(43_296_000, 6196) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(2)) } - // Storage: `System::Account` (r:3 w:3) + // Storage: `System::Account` (r:2 w:2) // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) - // Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) @@ -88,54 +88,49 @@ impl WeightInfo { // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) pub fn transfer_reserve_asset() -> Weight { // Proof Size summary in bytes: - // Measured: `246` - // Estimated: `8799` - // Minimum execution time: 87_978_000 picoseconds. - Weight::from_parts(88_517_000, 8799) - .saturating_add(T::DbWeight::get().reads(10)) - .saturating_add(T::DbWeight::get().writes(5)) + // Measured: `207` + // Estimated: `6196` + // Minimum execution time: 62_463_000 picoseconds. + Weight::from_parts(64_142_000, 6196) + .saturating_add(T::DbWeight::get().reads(8)) + .saturating_add(T::DbWeight::get().writes(4)) } - // Storage: `ParachainInfo::ParachainId` (r:1 w:0) - // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) + // Storage: `Benchmark::Override` (r:0 w:0) + // Proof: `Benchmark::Override` (`max_values`: None, `max_size`: None, mode: `Measured`) pub fn reserve_asset_deposited() -> Weight { // Proof Size summary in bytes: // Measured: `0` - // Estimated: `1489` - // Minimum execution time: 6_883_000 picoseconds. - Weight::from_parts(6_979_000, 1489) - .saturating_add(T::DbWeight::get().reads(1)) + // Estimated: `0` + // Minimum execution time: 18_446_744_073_709_551_000 picoseconds. + Weight::from_parts(18_446_744_073_709_551_000, 0) } // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) - // Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `System::Account` (r:2 w:2) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) pub fn initiate_reserve_withdraw() -> Weight { // Proof Size summary in bytes: - // Measured: `246` - // Estimated: `6196` - // Minimum execution time: 198_882_000 picoseconds. - Weight::from_parts(199_930_000, 6196) - .saturating_add(T::DbWeight::get().reads(9)) - .saturating_add(T::DbWeight::get().writes(4)) + // Measured: `106` + // Estimated: `3571` + // Minimum execution time: 31_417_000 picoseconds. + Weight::from_parts(32_153_000, 3571) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(2)) } pub fn receive_teleported_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_343_000 picoseconds. - Weight::from_parts(3_487_000, 0) + // Minimum execution time: 3_235_000 picoseconds. + Weight::from_parts(3_331_000, 0) } // Storage: `System::Account` (r:1 w:1) // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) @@ -143,17 +138,15 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `3593` - // Minimum execution time: 19_399_000 picoseconds. - Weight::from_parts(19_659_000, 3593) + // Minimum execution time: 17_701_000 picoseconds. + Weight::from_parts(18_219_000, 3593) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } - // Storage: `System::Account` (r:2 w:2) + // Storage: `System::Account` (r:1 w:1) // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) - // Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) @@ -166,36 +159,32 @@ impl WeightInfo { // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) pub fn deposit_reserve_asset() -> Weight { // Proof Size summary in bytes: - // Measured: `145` - // Estimated: `6196` - // Minimum execution time: 59_017_000 picoseconds. - Weight::from_parts(60_543_000, 6196) - .saturating_add(T::DbWeight::get().reads(9)) - .saturating_add(T::DbWeight::get().writes(4)) + // Measured: `106` + // Estimated: `3593` + // Minimum execution time: 41_748_000 picoseconds. + Weight::from_parts(42_401_000, 3593) + .saturating_add(T::DbWeight::get().reads(7)) + .saturating_add(T::DbWeight::get().writes(3)) } // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) - // Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `System::Account` (r:1 w:1) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) pub fn initiate_teleport() -> Weight { // Proof Size summary in bytes: - // Measured: `145` - // Estimated: `3610` - // Minimum execution time: 45_409_000 picoseconds. - Weight::from_parts(47_041_000, 3610) - .saturating_add(T::DbWeight::get().reads(8)) - .saturating_add(T::DbWeight::get().writes(3)) + // Measured: `106` + // Estimated: `3571` + // Minimum execution time: 27_455_000 picoseconds. + Weight::from_parts(27_976_000, 3571) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(2)) } } diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs index 4454494badc..a11d049a3fc 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs @@ -17,26 +17,28 @@ //! Autogenerated weights for `pallet_xcm_benchmarks::generic` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-11-15, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-01-12, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `runner-yprdrvc7-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` -//! WASM-EXECUTION: Compiled, CHAIN: Some("asset-hub-rococo-dev"), DB CACHE: 1024 +//! HOSTNAME: `runner-j8vvqcjr-project-674-concurrent-0`, CPU: `Intel(R) Xeon(R) CPU @ 2.60GHz` +//! WASM-EXECUTION: Compiled, CHAIN: Some("coretime-rococo-dev"), DB CACHE: 1024 // Executed Command: -// target/production/polkadot-parachain +// ./target/production/polkadot-parachain // benchmark // pallet -// --steps=50 -// --repeat=20 -// --extrinsic=* +// --template=./cumulus/templates/xcm-bench-template.hbs +// --chain=coretime-rococo-dev // --wasm-execution=compiled -// --heap-pages=4096 -// --json-file=/builds/parity/mirrors/polkadot-sdk/.git/.artifacts/bench.json // --pallet=pallet_xcm_benchmarks::generic -// --chain=asset-hub-rococo-dev +// --no-storage-info +// --no-median-slopes +// --no-min-squares +// --extrinsic=* +// --steps=50 +// --repeat=20 +// --json // --header=./cumulus/file_header.txt -// --template=./cumulus/templates/xcm-bench-template.hbs -// --output=./cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/xcm/ +// --output=./cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/pallet_xcm_benchmarks_generic.rs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] @@ -50,128 +52,120 @@ pub struct WeightInfo(PhantomData); impl WeightInfo { // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) - // Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `System::Account` (r:2 w:2) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) pub fn report_holding() -> Weight { // Proof Size summary in bytes: - // Measured: `246` - // Estimated: `6196` - // Minimum execution time: 440_298_000 picoseconds. - Weight::from_parts(446_508_000, 6196) - .saturating_add(T::DbWeight::get().reads(9)) - .saturating_add(T::DbWeight::get().writes(4)) + // Measured: `106` + // Estimated: `3571` + // Minimum execution time: 35_477_000 picoseconds. + Weight::from_parts(36_129_000, 3571) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(2)) } pub fn buy_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_313_000 picoseconds. - Weight::from_parts(3_422_000, 0) + // Minimum execution time: 2_243_000 picoseconds. + Weight::from_parts(2_329_000, 0) } // Storage: `PolkadotXcm::Queries` (r:1 w:0) // Proof: `PolkadotXcm::Queries` (`max_values`: None, `max_size`: None, mode: `Measured`) pub fn query_response() -> Weight { // Proof Size summary in bytes: - // Measured: `103` - // Estimated: `3568` - // Minimum execution time: 9_691_000 picoseconds. - Weight::from_parts(9_948_000, 3568) + // Measured: `32` + // Estimated: `3497` + // Minimum execution time: 8_112_000 picoseconds. + Weight::from_parts(8_275_000, 3497) .saturating_add(T::DbWeight::get().reads(1)) } pub fn transact() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 10_384_000 picoseconds. - Weight::from_parts(11_085_000, 0) + // Minimum execution time: 8_960_000 picoseconds. + Weight::from_parts(9_253_000, 0) } pub fn refund_surplus() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_438_000 picoseconds. - Weight::from_parts(3_577_000, 0) + // Minimum execution time: 2_332_000 picoseconds. + Weight::from_parts(2_438_000, 0) } pub fn set_error_handler() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_126_000 picoseconds. - Weight::from_parts(2_243_000, 0) + // Minimum execution time: 2_054_000 picoseconds. + Weight::from_parts(2_119_000, 0) } pub fn set_appendix() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_126_000 picoseconds. - Weight::from_parts(2_207_000, 0) + // Minimum execution time: 2_061_000 picoseconds. + Weight::from_parts(2_133_000, 0) } pub fn clear_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_105_000 picoseconds. - Weight::from_parts(2_193_000, 0) + // Minimum execution time: 2_054_000 picoseconds. + Weight::from_parts(2_128_000, 0) } pub fn descend_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_999_000 picoseconds. - Weight::from_parts(3_056_000, 0) + // Minimum execution time: 2_791_000 picoseconds. + Weight::from_parts(2_903_000, 0) } pub fn clear_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_091_000 picoseconds. - Weight::from_parts(2_176_000, 0) + // Minimum execution time: 2_088_000 picoseconds. + Weight::from_parts(2_153_000, 0) } // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) - // Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `System::Account` (r:2 w:2) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) pub fn report_error() -> Weight { // Proof Size summary in bytes: - // Measured: `246` - // Estimated: `6196` - // Minimum execution time: 55_728_000 picoseconds. - Weight::from_parts(56_704_000, 6196) - .saturating_add(T::DbWeight::get().reads(9)) - .saturating_add(T::DbWeight::get().writes(4)) + // Measured: `106` + // Estimated: `3571` + // Minimum execution time: 27_721_000 picoseconds. + Weight::from_parts(28_602_000, 3571) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(2)) } // Storage: `PolkadotXcm::AssetTraps` (r:1 w:1) // Proof: `PolkadotXcm::AssetTraps` (`max_values`: None, `max_size`: None, mode: `Measured`) pub fn claim_asset() -> Weight { // Proof Size summary in bytes: - // Measured: `160` - // Estimated: `3625` - // Minimum execution time: 12_839_000 picoseconds. - Weight::from_parts(13_457_000, 3625) + // Measured: `90` + // Estimated: `3555` + // Minimum execution time: 11_468_000 picoseconds. + Weight::from_parts(11_866_000, 3555) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) } @@ -179,13 +173,11 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_116_000 picoseconds. - Weight::from_parts(2_219_000, 0) + // Minimum execution time: 2_125_000 picoseconds. + Weight::from_parts(2_167_000, 0) } // Storage: `PolkadotXcm::VersionNotifyTargets` (r:1 w:1) // Proof: `PolkadotXcm::VersionNotifyTargets` (`max_values`: None, `max_size`: None, mode: `Measured`) - // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) - // Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) @@ -198,11 +190,11 @@ impl WeightInfo { // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) pub fn subscribe_version() -> Weight { // Proof Size summary in bytes: - // Measured: `145` - // Estimated: `3610` - // Minimum execution time: 24_891_000 picoseconds. - Weight::from_parts(25_583_000, 3610) - .saturating_add(T::DbWeight::get().reads(7)) + // Measured: `74` + // Estimated: `3539` + // Minimum execution time: 22_422_000 picoseconds. + Weight::from_parts(22_924_000, 3539) + .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(3)) } // Storage: `PolkadotXcm::VersionNotifyTargets` (r:0 w:1) @@ -211,122 +203,114 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 3_968_000 picoseconds. - Weight::from_parts(4_122_000, 0) + // Minimum execution time: 3_880_000 picoseconds. + Weight::from_parts(4_050_000, 0) .saturating_add(T::DbWeight::get().writes(1)) } pub fn burn_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 136_220_000 picoseconds. - Weight::from_parts(137_194_000, 0) + // Minimum execution time: 3_432_000 picoseconds. + Weight::from_parts(3_536_000, 0) } pub fn expect_asset() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 12_343_000 picoseconds. - Weight::from_parts(12_635_000, 0) + // Minimum execution time: 2_213_000 picoseconds. + Weight::from_parts(2_286_000, 0) } pub fn expect_origin() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_237_000 picoseconds. - Weight::from_parts(2_315_000, 0) + // Minimum execution time: 2_155_000 picoseconds. + Weight::from_parts(2_239_000, 0) } pub fn expect_error() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_094_000 picoseconds. - Weight::from_parts(2_231_000, 0) + // Minimum execution time: 2_093_000 picoseconds. + Weight::from_parts(2_139_000, 0) } pub fn expect_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_379_000 picoseconds. - Weight::from_parts(2_455_000, 0) + // Minimum execution time: 2_345_000 picoseconds. + Weight::from_parts(2_378_000, 0) } // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) - // Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `System::Account` (r:2 w:2) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) pub fn query_pallet() -> Weight { // Proof Size summary in bytes: - // Measured: `246` - // Estimated: `6196` - // Minimum execution time: 60_734_000 picoseconds. - Weight::from_parts(61_964_000, 6196) - .saturating_add(T::DbWeight::get().reads(9)) - .saturating_add(T::DbWeight::get().writes(4)) + // Measured: `106` + // Estimated: `3571` + // Minimum execution time: 31_543_000 picoseconds. + Weight::from_parts(32_075_000, 3571) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(2)) } pub fn expect_pallet() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 5_500_000 picoseconds. - Weight::from_parts(5_720_000, 0) + // Minimum execution time: 4_416_000 picoseconds. + Weight::from_parts(4_613_000, 0) } // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) - // Storage: `ParachainSystem::UpwardDeliveryFeeFactor` (r:1 w:0) - // Proof: `ParachainSystem::UpwardDeliveryFeeFactor` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::SupportedVersion` (r:1 w:0) // Proof: `PolkadotXcm::SupportedVersion` (`max_values`: None, `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::VersionDiscoveryQueue` (r:1 w:1) // Proof: `PolkadotXcm::VersionDiscoveryQueue` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `PolkadotXcm::SafeXcmVersion` (r:1 w:0) // Proof: `PolkadotXcm::SafeXcmVersion` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) - // Storage: `System::Account` (r:2 w:2) - // Proof: `System::Account` (`max_values`: None, `max_size`: Some(128), added: 2603, mode: `MaxEncodedLen`) // Storage: `ParachainSystem::HostConfiguration` (r:1 w:0) // Proof: `ParachainSystem::HostConfiguration` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) // Storage: `ParachainSystem::PendingUpwardMessages` (r:1 w:1) // Proof: `ParachainSystem::PendingUpwardMessages` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) pub fn report_transact_status() -> Weight { // Proof Size summary in bytes: - // Measured: `246` - // Estimated: `6196` - // Minimum execution time: 55_767_000 picoseconds. - Weight::from_parts(56_790_000, 6196) - .saturating_add(T::DbWeight::get().reads(9)) - .saturating_add(T::DbWeight::get().writes(4)) + // Measured: `106` + // Estimated: `3571` + // Minimum execution time: 28_050_000 picoseconds. + Weight::from_parts(28_755_000, 3571) + .saturating_add(T::DbWeight::get().reads(6)) + .saturating_add(T::DbWeight::get().writes(2)) } pub fn clear_transact_status() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_201_000 picoseconds. - Weight::from_parts(2_291_000, 0) + // Minimum execution time: 2_073_000 picoseconds. + Weight::from_parts(2_181_000, 0) } pub fn set_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_164_000 picoseconds. - Weight::from_parts(2_241_000, 0) + // Minimum execution time: 2_049_000 picoseconds. + Weight::from_parts(2_137_000, 0) } pub fn clear_topic() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_127_000 picoseconds. - Weight::from_parts(2_236_000, 0) + // Minimum execution time: 2_082_000 picoseconds. + Weight::from_parts(2_144_000, 0) } // Storage: `ParachainInfo::ParachainId` (r:1 w:0) // Proof: `ParachainInfo::ParachainId` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`) @@ -342,14 +326,14 @@ impl WeightInfo { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_132_000 picoseconds. - Weight::from_parts(2_216_000, 0) + // Minimum execution time: 2_043_000 picoseconds. + Weight::from_parts(2_151_000, 0) } pub fn unpaid_execution() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 2_265_000 picoseconds. - Weight::from_parts(2_332_000, 0) + // Minimum execution time: 2_197_000 picoseconds. + Weight::from_parts(2_293_000, 0) } } diff --git a/polkadot/runtime/rococo/src/lib.rs b/polkadot/runtime/rococo/src/lib.rs index 3fd3f2bc635..e492caddc8f 100644 --- a/polkadot/runtime/rococo/src/lib.rs +++ b/polkadot/runtime/rococo/src/lib.rs @@ -153,7 +153,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("rococo"), impl_name: create_runtime_str!("parity-rococo-v2.0"), authoring_version: 0, - spec_version: 1_005_001, + spec_version: 1_006_001, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 24, -- GitLab From 05cfb02bec116349fe6e0428f06837a9290662ac Mon Sep 17 00:00:00 2001 From: Xavier Lau Date: Tue, 16 Jan 2024 20:47:35 +0800 Subject: [PATCH 175/191] CI check features (#1708) To resolve issue #1136. This is a cross verification against zepter. - [cargo-featalign](https://github.com/hack-ink/cargo-featalign): Verifies the proper propagation of all features. - [zepter](https://github.com/ggwpez/zepter): Checks for accidentally enabled features. cc @ggwpez --- Switch to a new branch. Original PR #1537. --------- Signed-off-by: Xavier Lau Signed-off-by: Oliver Tale-Yazdi Co-authored-by: Oliver Tale-Yazdi Co-authored-by: Chevdor --- .github/workflows/check-features.yml | 19 +++++++++++++++++++ substrate/frame/support/procedural/Cargo.toml | 4 ++-- substrate/primitives/api/Cargo.toml | 2 +- 3 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/check-features.yml diff --git a/.github/workflows/check-features.yml b/.github/workflows/check-features.yml new file mode 100644 index 00000000000..53d6ac6b4db --- /dev/null +++ b/.github/workflows/check-features.yml @@ -0,0 +1,19 @@ +name: Check Features + +on: + pull_request: + types: [opened, synchronize, reopened, ready_for_review] + +jobs: + check-features: + runs-on: ubuntu-latest + steps: + - name: Fetch latest code + uses: actions/checkout@v4 + - name: Check + uses: hack-ink/cargo-featalign-action@bea88a864d6ca7d0c53c26f1391ce1d431dc7f34 # v0.1.1 + with: + crate: substrate/bin/node/runtime + features: std,runtime-benchmarks,try-runtime + ignore: sc-executor + default-std: true diff --git a/substrate/frame/support/procedural/Cargo.toml b/substrate/frame/support/procedural/Cargo.toml index 5e47f0dfeb0..25debb7fc2b 100644 --- a/substrate/frame/support/procedural/Cargo.toml +++ b/substrate/frame/support/procedural/Cargo.toml @@ -29,14 +29,14 @@ frame-support-procedural-tools = { path = "tools" } macro_magic = { version = "0.5.0", features = ["proc_support"] } proc-macro-warning = { version = "1.0.0", default-features = false } expander = "2.0.0" -sp-core-hashing = { path = "../../../primitives/core/hashing" } +sp-core-hashing = { path = "../../../primitives/core/hashing", default-features = false } [dev-dependencies] regex = "1" [features] default = ["std"] -std = [] +std = ["sp-core-hashing/std"] no-metadata-docs = [] # Generate impl-trait for tuples with the given number of tuples. Will be needed as the number of # pallets in a runtime grows. Does increase the compile time! diff --git a/substrate/primitives/api/Cargo.toml b/substrate/primitives/api/Cargo.toml index 345647cec25..346b9c35fa8 100644 --- a/substrate/primitives/api/Cargo.toml +++ b/substrate/primitives/api/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.6.1", default-features = false } -sp-api-proc-macro = { path = "proc-macro" } +sp-api-proc-macro = { path = "proc-macro", default-features = false } sp-core = { path = "../core", default-features = false } sp-std = { path = "../std", default-features = false } sp-runtime = { path = "../runtime", default-features = false } -- GitLab From 82c057ee78ca941d86a4455793fc9076f7ab00af Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Jan 2024 17:03:54 +0000 Subject: [PATCH 176/191] Bump walkdir from 2.3.3 to 2.4.0 (#2910) Bumps [walkdir](https://github.com/BurntSushi/walkdir) from 2.3.3 to 2.4.0.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=walkdir&package-manager=cargo&previous-version=2.3.3&new-version=2.4.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- substrate/utils/wasm-builder/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6299bbfe51c..31347261151 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -20933,9 +20933,9 @@ checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" [[package]] name = "walkdir" -version = "2.3.3" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" +checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" dependencies = [ "same-file", "winapi-util", diff --git a/substrate/utils/wasm-builder/Cargo.toml b/substrate/utils/wasm-builder/Cargo.toml index ffe95994c65..f882b85e473 100644 --- a/substrate/utils/wasm-builder/Cargo.toml +++ b/substrate/utils/wasm-builder/Cargo.toml @@ -21,7 +21,7 @@ console = "0.15.8" strum = { version = "0.24.1", features = ["derive"] } tempfile = "3.1.0" toml = "0.8.8" -walkdir = "2.3.2" +walkdir = "2.4.0" sp-maybe-compressed-blob = { path = "../../primitives/maybe-compressed-blob" } filetime = "0.2.16" wasm-opt = "0.116" -- GitLab From ec7bfae00a0ec0ce0841274acc707ad9b8d5b1c0 Mon Sep 17 00:00:00 2001 From: Andrei Eres Date: Tue, 16 Jan 2024 18:14:29 +0100 Subject: [PATCH 177/191] subsystem-bench: cache misses profiling (#2893) ## Why we need it To provide another level of understanding to why polkadot's subsystems may perform slower than expected. Cache misses occur when processing large amounts of data, such as during availability recovery. ## Why Cachegrind Cachegrind has many drawbacks: it is slow, it uses its own cache simulation, which is very basic. But unlike `perf`, which is a great tool, Cachegrind can run in a virtual machine. This means we can easily run it in remote installations and even use it in CI/CD to catch possible regressions. Why Cachegrind and not Callgrind, another part of Valgrind? It is simply empirically proven that profiling runs faster with Cachegrind. ## First results First results have been obtained while testing of the approach. Here is an example. ``` $ target/testnet/subsystem-bench --n-cores 10 --cache-misses data-availability-read $ cat cachegrind_report.txt I refs: 64,622,081,485 I1 misses: 3,018,168 LLi misses: 437,654 I1 miss rate: 0.00% LLi miss rate: 0.00% D refs: 12,161,833,115 (9,868,356,364 rd + 2,293,476,751 wr) D1 misses: 167,940,701 ( 71,060,073 rd + 96,880,628 wr) LLd misses: 33,550,018 ( 16,685,853 rd + 16,864,165 wr) D1 miss rate: 1.4% ( 0.7% + 4.2% ) LLd miss rate: 0.3% ( 0.2% + 0.7% ) LL refs: 170,958,869 ( 74,078,241 rd + 96,880,628 wr) LL misses: 33,987,672 ( 17,123,507 rd + 16,864,165 wr) LL miss rate: 0.0% ( 0.0% + 0.7% ) ``` The CLI output shows that 1.4% of the L1 data cache missed, which is not so bad, given that the last-level cache had that data most of the time missing only 0.3%. Instruction data of the L1 has 0.00% misses of the time. Looking at an output file with `cg_annotate` shows that most of the misses occur during reed-solomon, which is expected. --- polkadot/node/subsystem-bench/README.md | 77 +++++++++++++++---- .../subsystem-bench/src/subsystem-bench.rs | 13 +++- polkadot/node/subsystem-bench/src/valgrind.rs | 49 ++++++++++++ 3 files changed, 121 insertions(+), 18 deletions(-) create mode 100644 polkadot/node/subsystem-bench/src/valgrind.rs diff --git a/polkadot/node/subsystem-bench/README.md b/polkadot/node/subsystem-bench/README.md index b1476db2754..1ff5b129e1e 100644 --- a/polkadot/node/subsystem-bench/README.md +++ b/polkadot/node/subsystem-bench/README.md @@ -117,23 +117,24 @@ used to run a suite of tests defined in a `yaml` file like in this [example](exa ``` Options: - --network The type of network to be emulated [default: ideal] [possible values: - ideal, healthy, degraded] - --n-cores Number of cores to fetch availability for [default: 100] - --n-validators Number of validators to fetch chunks from [default: 500] - --min-pov-size The minimum pov size in KiB [default: 5120] - --max-pov-size The maximum pov size bytes [default: 5120] - -n, --num-blocks The number of blocks the test is going to run [default: 1] - -p, --peer-bandwidth The bandwidth of simulated remote peers in KiB - -b, --bandwidth The bandwidth of our simulated node in KiB - --peer-error Simulated conection error ratio [0-100] - --peer-min-latency Minimum remote peer latency in milliseconds [0-5000] - --peer-max-latency Maximum remote peer latency in milliseconds [0-5000] - --profile Enable CPU Profiling with Pyroscope - --pyroscope-url Pyroscope Server URL [default: http://localhost:4040] - --pyroscope-sample-rate Pyroscope Sample Rate [default: 113] - -h, --help Print help - -V, --version Print version + --network The type of network to be emulated [default: ideal] [possible + values: ideal, healthy, degraded] + --n-cores Number of cores to fetch availability for [default: 100] + --n-validators Number of validators to fetch chunks from [default: 500] + --min-pov-size The minimum pov size in KiB [default: 5120] + --max-pov-size The maximum pov size bytes [default: 5120] +-n, --num-blocks The number of blocks the test is going to run [default: 1] +-p, --peer-bandwidth The bandwidth of simulated remote peers in KiB +-b, --bandwidth The bandwidth of our simulated node in KiB + --peer-error Simulated conection error ratio [0-100] + --peer-min-latency Minimum remote peer latency in milliseconds [0-5000] + --peer-max-latency Maximum remote peer latency in milliseconds [0-5000] + --profile Enable CPU Profiling with Pyroscope + --pyroscope-url Pyroscope Server URL [default: http://localhost:4040] + --pyroscope-sample-rate Pyroscope Sample Rate [default: 113] + --cache-misses Enable Cache Misses Profiling with Valgrind. Linux only, Valgrind + must be in the PATH +-h, --help Print help ``` These apply to all test objectives, except `test-sequence` which relies on the values being specified in a file. @@ -221,6 +222,48 @@ view the test progress in real time by accessing [this link](http://localhost:30 Now run `target/testnet/subsystem-bench test-sequence --path polkadot/node/subsystem-bench/examples/availability_read.yaml` and view the metrics in real time and spot differences between different `n_validators` values. + +### Profiling cache misses + +Cache misses are profiled using Cachegrind, part of Valgrind. Cachegrind runs slowly, and its cache simulation is basic +and unlikely to reflect the behavior of a modern machine. However, it still represents the general situation with cache +usage, and more importantly it doesn't require a bare-metal machine to run on, which means it could be run in CI or in +a remote virtual installation. + +To profile cache misses use the `--cache-misses` flag. Cache simulation of current runs tuned for Intel Ice Lake CPU. +Since the execution will be very slow, it's recommended not to run it together with other profiling and not to take +benchmark results into account. A report is saved in a file `cachegrind_report.txt`. + +Example run results: +``` +$ target/testnet/subsystem-bench --n-cores 10 --cache-misses data-availability-read +$ cat cachegrind_report.txt +I refs: 64,622,081,485 +I1 misses: 3,018,168 +LLi misses: 437,654 +I1 miss rate: 0.00% +LLi miss rate: 0.00% + +D refs: 12,161,833,115 (9,868,356,364 rd + 2,293,476,751 wr) +D1 misses: 167,940,701 ( 71,060,073 rd + 96,880,628 wr) +LLd misses: 33,550,018 ( 16,685,853 rd + 16,864,165 wr) +D1 miss rate: 1.4% ( 0.7% + 4.2% ) +LLd miss rate: 0.3% ( 0.2% + 0.7% ) + +LL refs: 170,958,869 ( 74,078,241 rd + 96,880,628 wr) +LL misses: 33,987,672 ( 17,123,507 rd + 16,864,165 wr) +LL miss rate: 0.0% ( 0.0% + 0.7% ) +``` + +The results show that 1.4% of the L1 data cache missed, but the last level cache only missed 0.3% of the time. +Instruction data of the L1 has 0.00%. + +Cachegrind writes line-by-line cache profiling information to a file named `cachegrind.out.`. +This file is best interpreted with `cg_annotate --auto=yes cachegrind.out.`. For more information see the +[cachegrind manual](https://www.cs.cmu.edu/afs/cs.cmu.edu/project/cmt-40/Nice/RuleRefinement/bin/valgrind-3.2.0/docs/html/cg-manual.html). + +For finer profiling of cache misses, better use `perf` on a bare-metal machine. + ## Create new test objectives This tool is intended to make it easy to write new test objectives that focus individual subsystems, diff --git a/polkadot/node/subsystem-bench/src/subsystem-bench.rs b/polkadot/node/subsystem-bench/src/subsystem-bench.rs index 29b62b27855..8669ee4e8b1 100644 --- a/polkadot/node/subsystem-bench/src/subsystem-bench.rs +++ b/polkadot/node/subsystem-bench/src/subsystem-bench.rs @@ -16,6 +16,7 @@ //! A tool for running subsystem benchmark tests designed for development and //! CI regression testing. + use clap::Parser; use color_eyre::eyre; use pyroscope::PyroscopeAgent; @@ -27,6 +28,7 @@ use std::{path::Path, time::Duration}; pub(crate) mod availability; pub(crate) mod cli; pub(crate) mod core; +mod valgrind; use availability::{prepare_test, NetworkEmulation, TestState}; use cli::TestObjective; @@ -90,12 +92,21 @@ struct BenchCli { /// Pyroscope Sample Rate pub pyroscope_sample_rate: u32, + #[clap(long, default_value_t = false)] + /// Enable Cache Misses Profiling with Valgrind. Linux only, Valgrind must be in the PATH + pub cache_misses: bool, + #[command(subcommand)] pub objective: cli::TestObjective, } impl BenchCli { fn launch(self) -> eyre::Result<()> { + let is_valgrind_running = valgrind::is_valgrind_running(); + if !is_valgrind_running && self.cache_misses { + return valgrind::relaunch_in_valgrind_mode() + } + let agent_running = if self.profile { let agent = PyroscopeAgent::builder(self.pyroscope_url.as_str(), "subsystem-bench") .backend(pprof_backend(PprofConfig::new().sample_rate(self.pyroscope_sample_rate))) @@ -185,7 +196,7 @@ impl BenchCli { let mut state = TestState::new(&test_config); let (mut env, _protocol_config) = prepare_test(test_config, &mut state); - // test_config.write_to_disk(); + env.runtime() .block_on(availability::benchmark_availability_read(&mut env, state)); diff --git a/polkadot/node/subsystem-bench/src/valgrind.rs b/polkadot/node/subsystem-bench/src/valgrind.rs new file mode 100644 index 00000000000..3d0c488355b --- /dev/null +++ b/polkadot/node/subsystem-bench/src/valgrind.rs @@ -0,0 +1,49 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +use color_eyre::eyre; + +/// Show if the app is running under Valgrind +pub(crate) fn is_valgrind_running() -> bool { + match std::env::var("LD_PRELOAD") { + Ok(v) => v.contains("valgrind"), + Err(_) => false, + } +} + +/// Stop execution and relaunch the app under valgrind +/// Cache configuration used to emulate Intel Ice Lake (size, associativity, line size): +/// L1 instruction: 32,768 B, 8-way, 64 B lines +/// L1 data: 49,152 B, 12-way, 64 B lines +/// Last-level: 2,097,152 B, 16-way, 64 B lines +pub(crate) fn relaunch_in_valgrind_mode() -> eyre::Result<()> { + use std::os::unix::process::CommandExt; + let err = std::process::Command::new("valgrind") + .arg("--tool=cachegrind") + .arg("--cache-sim=yes") + .arg("--log-file=cachegrind_report.txt") + .arg("--I1=32768,8,64") + .arg("--D1=49152,12,64") + .arg("--LL=2097152,16,64") + .arg("--verbose") + .args(std::env::args()) + .exec(); + + Err(eyre::eyre!( + "Сannot run Valgrind, check that it is installed and available in the PATH\n{}", + err + )) +} -- GitLab From 8428f678fe5179399f6854e194f1c8b30a9102f9 Mon Sep 17 00:00:00 2001 From: Francisco Aguirre Date: Tue, 16 Jan 2024 19:18:04 +0100 Subject: [PATCH 178/191] XCMv4 (#1230) # Note for reviewer Most changes are just syntax changes necessary for the new version. Most important files should be the ones under the `xcm` folder. # Description Added XCMv4. ## Removed `Multi` prefix The following types have been renamed: - MultiLocation -> Location - MultiAsset -> Asset - MultiAssets -> Assets - InteriorMultiLocation -> InteriorLocation - MultiAssetFilter -> AssetFilter - VersionedMultiAsset -> VersionedAsset - WildMultiAsset -> WildAsset - VersionedMultiLocation -> VersionedLocation In order to fix a name conflict, the `Assets` in `xcm-executor` were renamed to `HoldingAssets`, as they represent assets in holding. ## Removed `Abstract` asset id It was not being used anywhere and this simplifies the code. Now assets are just constructed as follows: ```rust let asset: Asset = (AssetId(Location::new(1, Here)), 100u128).into(); ``` No need for specifying `Concrete` anymore. ## Outcome is now a named fields struct Instead of ```rust pub enum Outcome { Complete(Weight), Incomplete(Weight, Error), Error(Error), } ``` we now have ```rust pub enum Outcome { Complete { used: Weight }, Incomplete { used: Weight, error: Error }, Error { error: Error }, } ``` ## Added Reanchorable trait Now both locations and assets implement this trait, making it easier to reanchor both. ## New syntax for building locations and junctions Now junctions are built using the following methods: ```rust let location = Location { parents: 1, interior: [Parachain(1000), PalletInstance(50), GeneralIndex(1984)].into() }; ``` or ```rust let location = Location::new(1, [Parachain(1000), PalletInstance(50), GeneralIndex(1984)]); ``` And they are matched like so: ```rust match location.unpack() { (1, [Parachain(id)]) => ... (0, Here) => ..., (1, [_]) => ..., } ``` This syntax is mandatory in v4, and has been also implemented for v2 and v3 for easier migration. This was needed to make all sizes smaller. # TODO - [x] Scaffold v4 - [x] Port github.com/paritytech/polkadot/pull/7236 - [x] Remove `Multi` prefix - [x] Remove `Abstract` asset id --------- Co-authored-by: command-bot <> Co-authored-by: Keith Yeung --- .../src/messages_benchmarking.rs | 12 +- .../src/messages_xcm_extension.rs | 22 +- .../xcm-bridge-hub-router/src/benchmarking.rs | 6 +- .../modules/xcm-bridge-hub-router/src/lib.rs | 33 +- .../modules/xcm-bridge-hub-router/src/mock.rs | 18 +- .../modules/xcm-bridge-hub/src/exporter.rs | 12 +- bridges/modules/xcm-bridge-hub/src/lib.rs | 14 +- bridges/modules/xcm-bridge-hub/src/mock.rs | 17 +- .../pallets/inbound-queue/src/lib.rs | 10 +- .../pallets/inbound-queue/src/mock.rs | 59 +- .../pallets/inbound-queue/src/test.rs | 4 +- .../pallets/system/runtime-api/src/lib.rs | 4 +- .../parachain/pallets/system/src/api.rs | 6 +- .../pallets/system/src/benchmarking.rs | 16 +- .../parachain/pallets/system/src/lib.rs | 44 +- .../parachain/pallets/system/src/mock.rs | 26 +- .../parachain/pallets/system/src/tests.rs | 107 +- .../parachain/primitives/core/src/lib.rs | 22 +- .../parachain/primitives/core/tests/mod.rs | 6 +- .../primitives/router/src/inbound/mod.rs | 60 +- .../primitives/router/src/inbound/tests.rs | 7 +- .../primitives/router/src/outbound/mod.rs | 39 +- .../primitives/router/src/outbound/tests.rs | 283 ++-- .../runtime/runtime-common/src/lib.rs | 47 +- .../parachain/runtime/test-common/src/lib.rs | 69 +- cumulus/pallets/xcmp-queue/src/lib.rs | 8 +- cumulus/pallets/xcmp-queue/src/mock.rs | 19 +- cumulus/pallets/xcmp-queue/src/tests.rs | 54 +- .../runtime/src/xcm_config.rs | 22 +- cumulus/parachains/common/src/impls.rs | 18 +- cumulus/parachains/common/src/xcm_config.rs | 88 +- .../parachains/testing/penpal/src/lib.rs | 4 +- .../emulated/common/src/impls.rs | 57 +- .../emulated/common/src/lib.rs | 1 + .../emulated/common/src/macros.rs | 18 +- .../emulated/common/src/xcm_helpers.rs | 16 +- .../tests/assets/asset-hub-rococo/src/lib.rs | 2 +- .../src/tests/reserve_transfer.rs | 18 +- .../src/tests/set_xcm_versions.rs | 7 +- .../assets/asset-hub-rococo/src/tests/swap.rs | 68 +- .../asset-hub-rococo/src/tests/teleport.rs | 31 +- .../tests/assets/asset-hub-westend/src/lib.rs | 2 +- .../src/tests/fellowship_treasury.rs | 14 +- .../src/tests/reserve_transfer.rs | 18 +- .../src/tests/set_xcm_versions.rs | 7 +- .../asset-hub-westend/src/tests/swap.rs | 67 +- .../asset-hub-westend/src/tests/teleport.rs | 31 +- .../asset-hub-westend/src/tests/treasury.rs | 10 +- .../bridges/bridge-hub-rococo/src/lib.rs | 2 +- .../src/tests/asset_transfers.rs | 23 +- .../bridge-hub-rococo/src/tests/mod.rs | 34 +- .../bridge-hub-rococo/src/tests/send_xcm.rs | 24 +- .../bridge-hub-rococo/src/tests/snowbridge.rs | 63 +- .../bridge-hub-rococo/src/tests/teleport.rs | 2 +- .../bridges/bridge-hub-westend/src/lib.rs | 3 +- .../src/tests/asset_transfers.rs | 20 +- .../bridge-hub-westend/src/tests/mod.rs | 34 +- .../bridge-hub-westend/src/tests/send_xcm.rs | 22 +- .../bridge-hub-westend/src/tests/teleport.rs | 2 +- cumulus/parachains/pallets/ping/src/lib.rs | 4 +- .../assets/asset-hub-rococo/src/lib.rs | 148 +- .../asset-hub-rococo/src/weights/xcm/mod.rs | 96 +- .../assets/asset-hub-rococo/src/xcm_config.rs | 140 +- .../assets/asset-hub-rococo/tests/tests.rs | 103 +- .../assets/asset-hub-westend/src/lib.rs | 146 +- .../asset-hub-westend/src/weights/xcm/mod.rs | 96 +- .../asset-hub-westend/src/xcm_config.rs | 153 +- .../assets/asset-hub-westend/tests/tests.rs | 104 +- .../runtimes/assets/common/src/benchmarks.rs | 21 +- .../assets/common/src/foreign_creators.rs | 25 +- .../assets/common/src/fungible_conversion.rs | 103 +- .../runtimes/assets/common/src/lib.rs | 224 +-- .../common/src/local_and_foreign_assets.rs | 32 +- .../runtimes/assets/common/src/matching.rs | 118 +- .../runtimes/assets/common/src/runtime_api.rs | 12 +- .../runtimes/assets/test-utils/src/lib.rs | 6 +- .../assets/test-utils/src/test_cases.rs | 290 ++-- .../test-utils/src/test_cases_over_bridge.rs | 114 +- .../assets/test-utils/src/xcm_helpers.rs | 28 +- .../src/bridge_to_bulletin_config.rs | 30 +- .../src/bridge_to_westend_config.rs | 40 +- .../bridge-hubs/bridge-hub-rococo/src/lib.rs | 78 +- .../bridge-hub-rococo/src/weights/xcm/mod.rs | 96 +- .../bridge-hub-rococo/src/xcm_config.rs | 48 +- .../bridge-hub-rococo/tests/tests.rs | 2 +- .../src/bridge_to_rococo_config.rs | 32 +- .../bridge-hubs/bridge-hub-westend/src/lib.rs | 66 +- .../bridge-hub-westend/src/weights/xcm/mod.rs | 96 +- .../bridge-hub-westend/src/xcm_config.rs | 26 +- .../bridge-hub-westend/tests/tests.rs | 2 +- .../bridge-hubs/common/src/message_queue.rs | 12 +- .../src/test_cases/from_grandpa_chain.rs | 4 +- .../src/test_cases/from_parachain.rs | 4 +- .../test-utils/src/test_cases/helpers.rs | 12 +- .../test-utils/src/test_cases/mod.rs | 63 +- .../test-utils/src/test_data/mod.rs | 12 +- .../collectives-westend/src/ambassador/mod.rs | 2 +- .../collectives-westend/src/fellowship/mod.rs | 12 +- .../collectives-westend/src/lib.rs | 14 +- .../collectives-westend/src/xcm_config.rs | 34 +- .../contracts/contracts-rococo/src/lib.rs | 12 +- .../contracts-rococo/src/xcm_config.rs | 28 +- .../coretime/coretime-rococo/src/coretime.rs | 8 +- .../coretime/coretime-rococo/src/lib.rs | 58 +- .../coretime-rococo/src/weights/xcm/mod.rs | 96 +- .../coretime-rococo/src/xcm_config.rs | 30 +- .../coretime/coretime-westend/src/lib.rs | 58 +- .../coretime-westend/src/weights/xcm/mod.rs | 96 +- .../coretime-westend/src/xcm_config.rs | 40 +- .../glutton/glutton-westend/src/xcm_config.rs | 15 +- .../runtimes/people/people-rococo/src/lib.rs | 56 +- .../people-rococo/src/weights/xcm/mod.rs | 94 +- .../people/people-rococo/src/xcm_config.rs | 55 +- .../runtimes/people/people-westend/src/lib.rs | 56 +- .../people-westend/src/weights/xcm/mod.rs | 94 +- .../people/people-westend/src/xcm_config.rs | 65 +- .../runtimes/starters/shell/src/xcm_config.rs | 15 +- .../parachains/runtimes/test-utils/src/lib.rs | 41 +- .../runtimes/testing/penpal/src/lib.rs | 5 +- .../runtimes/testing/penpal/src/xcm_config.rs | 85 +- .../testing/rococo-parachain/src/lib.rs | 46 +- cumulus/primitives/core/src/lib.rs | 9 +- cumulus/primitives/utility/src/lib.rs | 101 +- .../utility/src/tests/swap_first.rs | 28 +- cumulus/xcm/xcm-emulator/src/lib.rs | 33 +- polkadot/runtime/common/src/impls.rs | 69 +- polkadot/runtime/common/src/xcm_sender.rs | 30 +- .../parachains/src/coretime/migration.rs | 17 +- .../runtime/parachains/src/coretime/mod.rs | 10 +- polkadot/runtime/parachains/src/mock.rs | 9 +- polkadot/runtime/rococo/src/impls.rs | 18 +- polkadot/runtime/rococo/src/lib.rs | 77 +- .../runtime/rococo/src/weights/xcm/mod.rs | 108 +- polkadot/runtime/rococo/src/xcm_config.rs | 85 +- polkadot/runtime/test-runtime/src/lib.rs | 2 +- .../runtime/test-runtime/src/xcm_config.rs | 30 +- polkadot/runtime/westend/src/impls.rs | 18 +- polkadot/runtime/westend/src/lib.rs | 79 +- .../runtime/westend/src/weights/xcm/mod.rs | 108 +- polkadot/runtime/westend/src/xcm_config.rs | 87 +- polkadot/xcm/Cargo.toml | 2 +- .../src/fungible/benchmarking.rs | 24 +- .../src/fungible/mock.rs | 33 +- .../pallet-xcm-benchmarks/src/fungible/mod.rs | 6 +- .../src/generic/benchmarking.rs | 40 +- .../pallet-xcm-benchmarks/src/generic/mock.rs | 68 +- .../pallet-xcm-benchmarks/src/generic/mod.rs | 31 +- polkadot/xcm/pallet-xcm-benchmarks/src/lib.rs | 42 +- .../xcm/pallet-xcm-benchmarks/src/mock.rs | 24 +- polkadot/xcm/pallet-xcm/src/benchmarking.rs | 77 +- polkadot/xcm/pallet-xcm/src/lib.rs | 670 ++++---- polkadot/xcm/pallet-xcm/src/mock.rs | 220 +-- .../pallet-xcm/src/tests/assets_transfer.rs | 835 ++++++---- polkadot/xcm/pallet-xcm/src/tests/mod.rs | 321 ++-- polkadot/xcm/procedural/src/lib.rs | 22 + polkadot/xcm/procedural/src/v2.rs | 49 +- polkadot/xcm/procedural/src/v3.rs | 49 +- polkadot/xcm/procedural/src/v4.rs | 196 +++ .../xcm/procedural/tests/builder_pattern.rs | 16 +- .../procedural/tests/conversion_functions.rs | 24 + polkadot/xcm/src/lib.rs | 256 ++- polkadot/xcm/src/tests.rs | 36 +- polkadot/xcm/src/v2/multilocation.rs | 29 +- polkadot/xcm/src/v2/traits.rs | 5 +- polkadot/xcm/src/v3/junction.rs | 55 +- polkadot/xcm/src/v3/junctions.rs | 21 + polkadot/xcm/src/v3/mod.rs | 234 ++- polkadot/xcm/src/v3/multiasset.rs | 105 +- polkadot/xcm/src/v3/multilocation.rs | 30 +- polkadot/xcm/src/v3/traits.rs | 50 - polkadot/xcm/src/v4/asset.rs | 915 +++++++++++ polkadot/xcm/src/v4/junction.rs | 317 ++++ polkadot/xcm/src/v4/junctions.rs | 723 ++++++++ polkadot/xcm/src/v4/location.rs | 746 +++++++++ polkadot/xcm/src/v4/mod.rs | 1457 +++++++++++++++++ polkadot/xcm/src/v4/traits.rs | 312 ++++ .../xcm/xcm-builder/src/asset_conversion.rs | 168 +- polkadot/xcm/xcm-builder/src/barriers.rs | 64 +- polkadot/xcm/xcm-builder/src/controller.rs | 12 +- .../xcm/xcm-builder/src/currency_adapter.rs | 36 +- polkadot/xcm/xcm-builder/src/fee_handling.rs | 31 +- .../xcm-builder/src/filter_asset_location.rs | 66 +- .../xcm/xcm-builder/src/fungible_adapter.rs | 65 +- .../xcm/xcm-builder/src/fungibles_adapter.rs | 64 +- polkadot/xcm/xcm-builder/src/lib.rs | 8 +- .../xcm-builder/src/location_conversion.rs | 372 ++--- polkadot/xcm/xcm-builder/src/matcher.rs | 6 +- .../xcm/xcm-builder/src/matches_location.rs | 46 +- polkadot/xcm/xcm-builder/src/matches_token.rs | 67 +- .../xcm-builder/src/nonfungibles_adapter.rs | 56 +- .../xcm/xcm-builder/src/origin_aliases.rs | 12 +- .../xcm/xcm-builder/src/origin_conversion.rs | 123 +- polkadot/xcm/xcm-builder/src/pay.rs | 21 +- .../xcm-builder/src/process_xcm_message.rs | 20 +- polkadot/xcm/xcm-builder/src/routing.rs | 4 +- polkadot/xcm/xcm-builder/src/test_utils.rs | 74 +- polkadot/xcm/xcm-builder/src/tests/aliases.rs | 19 +- polkadot/xcm/xcm-builder/src/tests/assets.rs | 358 ++-- polkadot/xcm/xcm-builder/src/tests/basic.rs | 40 +- .../src/tests/bridging/local_para_para.rs | 6 +- .../src/tests/bridging/local_relay_relay.rs | 6 +- .../xcm/xcm-builder/src/tests/bridging/mod.rs | 54 +- .../tests/bridging/paid_remote_relay_relay.rs | 26 +- .../src/tests/bridging/remote_para_para.rs | 20 +- .../bridging/remote_para_para_via_relay.rs | 20 +- .../src/tests/bridging/remote_relay_relay.rs | 18 +- .../xcm/xcm-builder/src/tests/expecting.rs | 130 +- polkadot/xcm/xcm-builder/src/tests/locking.rs | 130 +- polkadot/xcm/xcm-builder/src/tests/mock.rs | 315 ++-- polkadot/xcm/xcm-builder/src/tests/origins.rs | 76 +- .../xcm/xcm-builder/src/tests/pay/mock.rs | 54 +- polkadot/xcm/xcm-builder/src/tests/pay/pay.rs | 28 +- .../xcm/xcm-builder/src/tests/pay/salary.rs | 14 +- .../xcm/xcm-builder/src/tests/querying.rs | 44 +- .../xcm/xcm-builder/src/tests/transacting.rs | 147 +- .../src/tests/version_subscriptions.rs | 110 +- polkadot/xcm/xcm-builder/src/tests/weight.rs | 67 +- .../xcm/xcm-builder/src/universal_exports.rs | 133 +- polkadot/xcm/xcm-builder/src/weight.rs | 38 +- polkadot/xcm/xcm-builder/tests/mock/mod.rs | 22 +- polkadot/xcm/xcm-builder/tests/scenarios.rs | 88 +- .../xcm-executor/integration-tests/src/lib.rs | 12 +- polkadot/xcm/xcm-executor/src/assets.rs | 353 ++-- polkadot/xcm/xcm-executor/src/config.rs | 10 +- polkadot/xcm/xcm-executor/src/lib.rs | 168 +- .../xcm-executor/src/traits/asset_exchange.rs | 18 +- .../xcm/xcm-executor/src/traits/asset_lock.rs | 44 +- .../xcm-executor/src/traits/asset_transfer.rs | 19 +- .../xcm/xcm-executor/src/traits/conversion.rs | 35 +- .../xcm-executor/src/traits/drop_assets.rs | 32 +- .../xcm/xcm-executor/src/traits/export.rs | 20 +- .../xcm-executor/src/traits/fee_manager.rs | 12 +- .../src/traits/filter_asset_location.rs | 10 +- .../xcm-executor/src/traits/on_response.rs | 52 +- .../xcm-executor/src/traits/should_execute.rs | 10 +- .../xcm-executor/src/traits/token_matching.rs | 20 +- .../xcm-executor/src/traits/transact_asset.rs | 172 +- .../xcm/xcm-executor/src/traits/weight.rs | 16 +- polkadot/xcm/xcm-simulator/example/src/lib.rs | 4 +- .../xcm-simulator/example/src/parachain.rs | 65 +- .../xcm-simulator/example/src/relay_chain.rs | 6 +- polkadot/xcm/xcm-simulator/fuzzer/src/fuzz.rs | 4 +- .../xcm/xcm-simulator/fuzzer/src/parachain.rs | 35 +- .../xcm-simulator/fuzzer/src/relay_chain.rs | 6 +- polkadot/xcm/xcm-simulator/src/lib.rs | 44 +- prdoc/pr_1230.prdoc | 20 + substrate/frame/assets/src/benchmarking.rs | 121 +- substrate/frame/assets/src/lib.rs | 6 +- .../frame/contracts/mock-network/src/lib.rs | 8 +- .../mock-network/src/mocks/msg_queue.rs | 27 +- .../contracts/mock-network/src/parachain.rs | 62 +- .../contracts/mock-network/src/relay_chain.rs | 12 +- .../frame/contracts/mock-network/src/tests.rs | 25 +- substrate/frame/contracts/src/wasm/runtime.rs | 4 +- .../frame/support/src/traits/tokens/pay.rs | 2 +- 255 files changed, 12421 insertions(+), 6722 deletions(-) create mode 100644 polkadot/xcm/procedural/src/v4.rs create mode 100644 polkadot/xcm/procedural/tests/conversion_functions.rs create mode 100644 polkadot/xcm/src/v4/asset.rs create mode 100644 polkadot/xcm/src/v4/junction.rs create mode 100644 polkadot/xcm/src/v4/junctions.rs create mode 100644 polkadot/xcm/src/v4/location.rs create mode 100644 polkadot/xcm/src/v4/mod.rs create mode 100644 polkadot/xcm/src/v4/traits.rs create mode 100644 prdoc/pr_1230.prdoc diff --git a/bridges/bin/runtime-common/src/messages_benchmarking.rs b/bridges/bin/runtime-common/src/messages_benchmarking.rs index e7e7891461b..0c7a9ad1a83 100644 --- a/bridges/bin/runtime-common/src/messages_benchmarking.rs +++ b/bridges/bin/runtime-common/src/messages_benchmarking.rs @@ -38,7 +38,7 @@ use frame_support::weights::Weight; use pallet_bridge_messages::benchmarking::{MessageDeliveryProofParams, MessageProofParams}; use sp_runtime::traits::{Header, Zero}; use sp_std::prelude::*; -use xcm::v3::prelude::*; +use xcm::latest::prelude::*; /// Prepare inbound bridge message according to given message proof parameters. fn prepare_inbound_message( @@ -266,19 +266,19 @@ where /// Returns callback which generates `BridgeMessage` from Polkadot XCM builder based on /// `expected_message_size` for benchmark. pub fn generate_xcm_builder_bridge_message_sample( - destination: InteriorMultiLocation, + destination: InteriorLocation, ) -> impl Fn(usize) -> MessagePayload { move |expected_message_size| -> MessagePayload { // For XCM bridge hubs, it is the message that // will be pushed further to some XCM queue (XCMP/UMP) - let location = xcm::VersionedInteriorMultiLocation::V3(destination); + let location = xcm::VersionedInteriorLocation::V4(destination.clone()); let location_encoded_size = location.encoded_size(); // we don't need to be super-precise with `expected_size` here let xcm_size = expected_message_size.saturating_sub(location_encoded_size); let xcm_data_size = xcm_size.saturating_sub( // minus empty instruction size - xcm::v3::Instruction::<()>::ExpectPallet { + Instruction::<()>::ExpectPallet { index: 0, name: vec![], module_name: vec![], @@ -294,8 +294,8 @@ pub fn generate_xcm_builder_bridge_message_sample( expected_message_size, location_encoded_size, xcm_size, xcm_data_size, ); - let xcm = xcm::VersionedXcm::<()>::V3( - vec![xcm::v3::Instruction::<()>::ExpectPallet { + let xcm = xcm::VersionedXcm::<()>::V4( + vec![Instruction::<()>::ExpectPallet { index: 0, name: vec![42; xcm_data_size], module_name: vec![], diff --git a/bridges/bin/runtime-common/src/messages_xcm_extension.rs b/bridges/bin/runtime-common/src/messages_xcm_extension.rs index 53c0579c4cd..fd2c20af72a 100644 --- a/bridges/bin/runtime-common/src/messages_xcm_extension.rs +++ b/bridges/bin/runtime-common/src/messages_xcm_extension.rs @@ -123,14 +123,14 @@ impl< #[cfg_attr(feature = "std", derive(Debug, Eq, PartialEq))] pub struct SenderAndLane { /// Sending chain relative location. - pub location: MultiLocation, + pub location: Location, /// Message lane, used by the sending chain. pub lane: LaneId, } impl SenderAndLane { /// Create new object using provided location and lane. - pub fn new(location: MultiLocation, lane: LaneId) -> Self { + pub fn new(location: Location, lane: LaneId) -> Self { SenderAndLane { location, lane } } } @@ -168,7 +168,7 @@ pub struct XcmBlobHaulerAdapter( impl< H: XcmBlobHauler, - Lanes: Get>, + Lanes: Get>, > OnMessagesDelivered for XcmBlobHaulerAdapter { fn on_messages_delivered(lane: LaneId, enqueued_messages: MessageNonce) { @@ -288,7 +288,7 @@ impl LocalXcmQueueManager { /// Send congested signal to the `sending_chain_location`. fn send_congested_signal(sender_and_lane: &SenderAndLane) -> Result<(), SendError> { if let Some(msg) = H::CongestedMessage::get() { - send_xcm::(sender_and_lane.location, msg)?; + send_xcm::(sender_and_lane.location.clone(), msg)?; OutboundLanesCongestedSignals::::insert( sender_and_lane.lane, true, @@ -300,7 +300,7 @@ impl LocalXcmQueueManager { /// Send `uncongested` signal to the `sending_chain_location`. fn send_uncongested_signal(sender_and_lane: &SenderAndLane) -> Result<(), SendError> { if let Some(msg) = H::UncongestedMessage::get() { - send_xcm::(sender_and_lane.location, msg)?; + send_xcm::(sender_and_lane.location.clone(), msg)?; OutboundLanesCongestedSignals::::remove( sender_and_lane.lane, ); @@ -315,10 +315,10 @@ impl LocalXcmQueueManager { pub struct XcmVersionOfDestAndRemoteBridge( sp_std::marker::PhantomData<(Version, RemoteBridge)>, ); -impl> GetVersion +impl> GetVersion for XcmVersionOfDestAndRemoteBridge { - fn get_version_for(dest: &MultiLocation) -> Option { + fn get_version_for(dest: &Location) -> Option { let dest_version = Version::get_version_for(dest); let bridge_hub_version = Version::get_version_for(&RemoteBridge::get()); @@ -342,11 +342,11 @@ mod tests { parameter_types! { pub TestSenderAndLane: SenderAndLane = SenderAndLane { - location: MultiLocation::new(1, X1(Parachain(1000))), + location: Location::new(1, [Parachain(1000)]), lane: TEST_LANE_ID, }; - pub TestLanes: sp_std::vec::Vec<(SenderAndLane, (NetworkId, InteriorMultiLocation))> = sp_std::vec![ - (TestSenderAndLane::get(), (NetworkId::ByGenesis([0; 32]), InteriorMultiLocation::Here)) + pub TestLanes: sp_std::vec::Vec<(SenderAndLane, (NetworkId, InteriorLocation))> = sp_std::vec![ + (TestSenderAndLane::get(), (NetworkId::ByGenesis([0; 32]), InteriorLocation::Here)) ]; pub DummyXcmMessage: Xcm<()> = Xcm::new(); } @@ -363,7 +363,7 @@ mod tests { type Ticket = (); fn validate( - _destination: &mut Option, + _destination: &mut Option, _message: &mut Option>, ) -> SendResult { Ok(((), Default::default())) diff --git a/bridges/modules/xcm-bridge-hub-router/src/benchmarking.rs b/bridges/modules/xcm-bridge-hub-router/src/benchmarking.rs index 922e4bf94ba..c4f9f534c1a 100644 --- a/bridges/modules/xcm-bridge-hub-router/src/benchmarking.rs +++ b/bridges/modules/xcm-bridge-hub-router/src/benchmarking.rs @@ -37,10 +37,10 @@ pub trait Config: crate::Config { /// Returns destination which is valid for this router instance. /// (Needs to pass `T::Bridges`) /// Make sure that `SendXcm` will pass. - fn ensure_bridged_target_destination() -> Result { - Ok(MultiLocation::new( + fn ensure_bridged_target_destination() -> Result { + Ok(Location::new( Self::UniversalLocation::get().len() as u8, - X1(GlobalConsensus(Self::BridgedNetworkId::get().unwrap())), + [GlobalConsensus(Self::BridgedNetworkId::get().unwrap())], )) } } diff --git a/bridges/modules/xcm-bridge-hub-router/src/lib.rs b/bridges/modules/xcm-bridge-hub-router/src/lib.rs index 229628aedcb..f219be78f9e 100644 --- a/bridges/modules/xcm-bridge-hub-router/src/lib.rs +++ b/bridges/modules/xcm-bridge-hub-router/src/lib.rs @@ -80,7 +80,7 @@ pub mod pallet { type WeightInfo: WeightInfo; /// Universal location of this runtime. - type UniversalLocation: Get; + type UniversalLocation: Get; /// The bridged network that this config is for if specified. /// Also used for filtering `Bridges` by `BridgedNetworkId`. /// If not specified, allows all networks pass through. @@ -235,9 +235,9 @@ type ViaBridgeHubExporter = SovereignPaidRemoteExporter< impl, I: 'static> ExporterFor for Pallet { fn exporter_for( network: &NetworkId, - remote_location: &InteriorMultiLocation, + remote_location: &InteriorLocation, message: &Xcm<()>, - ) -> Option<(MultiLocation, Option)> { + ) -> Option<(Location, Option)> { // ensure that the message is sent to the expected bridged network (if specified). if let Some(bridged_network) = T::BridgedNetworkId::get() { if *network != bridged_network { @@ -268,7 +268,7 @@ impl, I: 'static> ExporterFor for Pallet { // take `base_fee` from `T::Brides`, but it has to be the same `T::FeeAsset` let base_fee = match maybe_payment { Some(payment) => match payment { - MultiAsset { fun: Fungible(amount), id } if id.eq(&T::FeeAsset::get()) => amount, + Asset { fun: Fungible(amount), id } if id.eq(&T::FeeAsset::get()) => amount, invalid_asset => { log::error!( target: LOG_TARGET, @@ -318,7 +318,7 @@ impl, I: 'static> SendXcm for Pallet { type Ticket = (u32, ::Ticket); fn validate( - dest: &mut Option, + dest: &mut Option, xcm: &mut Option>, ) -> SendResult { // `dest` and `xcm` are required here @@ -446,7 +446,7 @@ mod tests { run_test(|| { assert_eq!( send_xcm::( - MultiLocation::new(2, X2(GlobalConsensus(Rococo), Parachain(1000))), + Location::new(2, [GlobalConsensus(Rococo), Parachain(1000)]), vec![].into(), ), Err(SendError::NotApplicable), @@ -459,7 +459,7 @@ mod tests { run_test(|| { assert_eq!( send_xcm::( - MultiLocation::new(2, X2(GlobalConsensus(Rococo), Parachain(1000))), + Location::new(2, [GlobalConsensus(Rococo), Parachain(1000)]), vec![ClearOrigin; HARD_MESSAGE_SIZE_LIMIT as usize].into(), ), Err(SendError::ExceedsMaxMessageSize), @@ -483,14 +483,14 @@ mod tests { #[test] fn returns_proper_delivery_price() { run_test(|| { - let dest = MultiLocation::new(2, X1(GlobalConsensus(BridgedNetworkId::get()))); + let dest = Location::new(2, [GlobalConsensus(BridgedNetworkId::get())]); let xcm: Xcm<()> = vec![ClearOrigin].into(); let msg_size = xcm.encoded_size(); // initially the base fee is used: `BASE_FEE + BYTE_FEE * msg_size + HRMP_FEE` let expected_fee = BASE_FEE + BYTE_FEE * (msg_size as u128) + HRMP_FEE; assert_eq!( - XcmBridgeHubRouter::validate(&mut Some(dest), &mut Some(xcm.clone())) + XcmBridgeHubRouter::validate(&mut Some(dest.clone()), &mut Some(xcm.clone())) .unwrap() .1 .get(0), @@ -518,10 +518,7 @@ mod tests { run_test(|| { let old_bridge = XcmBridgeHubRouter::bridge(); assert_ok!(send_xcm::( - MultiLocation::new( - 2, - X2(GlobalConsensus(BridgedNetworkId::get()), Parachain(1000)) - ), + Location::new(2, [GlobalConsensus(BridgedNetworkId::get()), Parachain(1000)]), vec![ClearOrigin].into(), ) .map(drop)); @@ -538,10 +535,7 @@ mod tests { let old_bridge = XcmBridgeHubRouter::bridge(); assert_ok!(send_xcm::( - MultiLocation::new( - 2, - X2(GlobalConsensus(BridgedNetworkId::get()), Parachain(1000)) - ), + Location::new(2, [GlobalConsensus(BridgedNetworkId::get()), Parachain(1000)]), vec![ClearOrigin].into(), ) .map(drop)); @@ -560,10 +554,7 @@ mod tests { let old_bridge = XcmBridgeHubRouter::bridge(); assert_ok!(send_xcm::( - MultiLocation::new( - 2, - X2(GlobalConsensus(BridgedNetworkId::get()), Parachain(1000)) - ), + Location::new(2, [GlobalConsensus(BridgedNetworkId::get()), Parachain(1000)]), vec![ClearOrigin].into(), ) .map(drop)); diff --git a/bridges/modules/xcm-bridge-hub-router/src/mock.rs b/bridges/modules/xcm-bridge-hub-router/src/mock.rs index 9079f4b9c4c..6dbfba5f6fd 100644 --- a/bridges/modules/xcm-bridge-hub-router/src/mock.rs +++ b/bridges/modules/xcm-bridge-hub-router/src/mock.rs @@ -49,9 +49,9 @@ construct_runtime! { parameter_types! { pub ThisNetworkId: NetworkId = Polkadot; pub BridgedNetworkId: NetworkId = Kusama; - pub UniversalLocation: InteriorMultiLocation = X2(GlobalConsensus(ThisNetworkId::get()), Parachain(1000)); - pub SiblingBridgeHubLocation: MultiLocation = ParentThen(X1(Parachain(1002))).into(); - pub BridgeFeeAsset: AssetId = MultiLocation::parent().into(); + pub UniversalLocation: InteriorLocation = [GlobalConsensus(ThisNetworkId::get()), Parachain(1000)].into(); + pub SiblingBridgeHubLocation: Location = ParentThen([Parachain(1002)].into()).into(); + pub BridgeFeeAsset: AssetId = Location::parent().into(); pub BridgeTable: Vec = vec![ NetworkExportTableItem::new( @@ -61,7 +61,7 @@ parameter_types! { Some((BridgeFeeAsset::get(), BASE_FEE).into()) ) ]; - pub UnknownXcmVersionLocation: MultiLocation = MultiLocation::new(2, X2(GlobalConsensus(BridgedNetworkId::get()), Parachain(9999))); + pub UnknownXcmVersionLocation: Location = Location::new(2, [GlobalConsensus(BridgedNetworkId::get()), Parachain(9999)]); } #[derive_impl(frame_system::config_preludes::TestDefaultConfig as frame_system::DefaultConfig)] @@ -87,11 +87,11 @@ impl pallet_xcm_bridge_hub_router::Config<()> for TestRuntime { } pub struct LatestOrNoneForLocationVersionChecker(sp_std::marker::PhantomData); -impl> GetVersion - for LatestOrNoneForLocationVersionChecker +impl> GetVersion + for LatestOrNoneForLocationVersionChecker { - fn get_version_for(dest: &MultiLocation) -> Option { - if Location::contains(dest) { + fn get_version_for(dest: &Location) -> Option { + if LocationValue::contains(dest) { return None } Some(XCM_VERSION) @@ -110,7 +110,7 @@ impl SendXcm for TestToBridgeHubSender { type Ticket = (); fn validate( - _destination: &mut Option, + _destination: &mut Option, _message: &mut Option>, ) -> SendResult { Ok(((), (BridgeFeeAsset::get(), HRMP_FEE).into())) diff --git a/bridges/modules/xcm-bridge-hub/src/exporter.rs b/bridges/modules/xcm-bridge-hub/src/exporter.rs index 5318b222c54..3dd7459d30f 100644 --- a/bridges/modules/xcm-bridge-hub/src/exporter.rs +++ b/bridges/modules/xcm-bridge-hub/src/exporter.rs @@ -52,10 +52,10 @@ where fn validate( network: NetworkId, channel: u32, - universal_source: &mut Option, - destination: &mut Option, + universal_source: &mut Option, + destination: &mut Option, message: &mut Option>, - ) -> Result<(Self::Ticket, MultiAssets), SendError> { + ) -> Result<(Self::Ticket, Assets), SendError> { // Find supported lane_id. let sender_and_lane = Self::lane_for( universal_source.as_ref().ok_or(SendError::MissingArgument)?, @@ -137,11 +137,11 @@ mod tests { use frame_support::assert_ok; use xcm_executor::traits::export_xcm; - fn universal_source() -> InteriorMultiLocation { - X2(GlobalConsensus(RelayNetwork::get()), Parachain(SIBLING_ASSET_HUB_ID)) + fn universal_source() -> InteriorLocation { + [GlobalConsensus(RelayNetwork::get()), Parachain(SIBLING_ASSET_HUB_ID)].into() } - fn universal_destination() -> InteriorMultiLocation { + fn universal_destination() -> InteriorLocation { BridgedDestination::get() } diff --git a/bridges/modules/xcm-bridge-hub/src/lib.rs b/bridges/modules/xcm-bridge-hub/src/lib.rs index 44f6903b018..60b988497fc 100644 --- a/bridges/modules/xcm-bridge-hub/src/lib.rs +++ b/bridges/modules/xcm-bridge-hub/src/lib.rs @@ -45,25 +45,25 @@ pub mod pallet { BridgeMessagesConfig { /// Runtime's universal location. - type UniversalLocation: Get; + type UniversalLocation: Get; // TODO: https://github.com/paritytech/parity-bridges-common/issues/1666 remove `ChainId` and // replace it with the `NetworkId` - then we'll be able to use // `T as pallet_bridge_messages::Config::BridgedChain::NetworkId` /// Bridged network as relative location of bridged `GlobalConsensus`. #[pallet::constant] - type BridgedNetwork: Get; + type BridgedNetwork: Get; /// Associated messages pallet instance that bridges us with the /// `BridgedNetworkId` consensus. type BridgeMessagesPalletInstance: 'static; /// Price of single message export to the bridged consensus (`Self::BridgedNetworkId`). - type MessageExportPrice: Get; + type MessageExportPrice: Get; /// Checks the XCM version for the destination. type DestinationVersion: GetVersion; /// Get point-to-point links with bridged consensus (`Self::BridgedNetworkId`). /// (this will be replaced with dynamic on-chain bridges - `Bridges V2`) - type Lanes: Get>; + type Lanes: Get>; /// Support for point-to-point links /// (this will be replaced with dynamic on-chain bridges - `Bridges V2`) type LanesSupport: XcmBlobHauler; @@ -86,10 +86,10 @@ pub mod pallet { impl, I: 'static> Pallet { /// Returns dedicated/configured lane identifier. pub(crate) fn lane_for( - source: &InteriorMultiLocation, - dest: (&NetworkId, &InteriorMultiLocation), + source: &InteriorLocation, + dest: (&NetworkId, &InteriorLocation), ) -> Option { - let source = source.relative_to(&T::UniversalLocation::get()); + let source = source.clone().relative_to(&T::UniversalLocation::get()); // Check that we have configured a point-to-point lane for 'source' and `dest`. T::Lanes::get() diff --git a/bridges/modules/xcm-bridge-hub/src/mock.rs b/bridges/modules/xcm-bridge-hub/src/mock.rs index 8edd4b1f7aa..6708d4b789a 100644 --- a/bridges/modules/xcm-bridge-hub/src/mock.rs +++ b/bridges/modules/xcm-bridge-hub/src/mock.rs @@ -170,16 +170,13 @@ impl pallet_bridge_messages::WeightInfoExt for TestMessagesWeights { parameter_types! { pub const RelayNetwork: NetworkId = NetworkId::Kusama; pub const BridgedRelayNetwork: NetworkId = NetworkId::Polkadot; - pub const BridgedRelayNetworkLocation: MultiLocation = MultiLocation { - parents: 1, - interior: X1(GlobalConsensus(BridgedRelayNetwork::get())) - }; + pub BridgedRelayNetworkLocation: Location = (Parent, GlobalConsensus(BridgedRelayNetwork::get())).into(); pub const NonBridgedRelayNetwork: NetworkId = NetworkId::Rococo; pub const BridgeReserve: Balance = 100_000; - pub UniversalLocation: InteriorMultiLocation = X2( + pub UniversalLocation: InteriorLocation = [ GlobalConsensus(RelayNetwork::get()), Parachain(THIS_BRIDGE_HUB_ID), - ); + ].into(); pub const Penalty: Balance = 1_000; } @@ -197,13 +194,13 @@ impl pallet_xcm_bridge_hub::Config for TestRuntime { parameter_types! { pub TestSenderAndLane: SenderAndLane = SenderAndLane { - location: MultiLocation::new(1, X1(Parachain(SIBLING_ASSET_HUB_ID))), + location: Location::new(1, [Parachain(SIBLING_ASSET_HUB_ID)]), lane: TEST_LANE_ID, }; - pub const BridgedDestination: InteriorMultiLocation = X1( + pub BridgedDestination: InteriorLocation = [ Parachain(BRIDGED_ASSET_HUB_ID) - ); - pub TestLanes: sp_std::vec::Vec<(SenderAndLane, (NetworkId, InteriorMultiLocation))> = sp_std::vec![ + ].into(); + pub TestLanes: sp_std::vec::Vec<(SenderAndLane, (NetworkId, InteriorLocation))> = sp_std::vec![ (TestSenderAndLane::get(), (BridgedRelayNetwork::get(), BridgedDestination::get())) ]; } diff --git a/bridges/snowbridge/parachain/pallets/inbound-queue/src/lib.rs b/bridges/snowbridge/parachain/pallets/inbound-queue/src/lib.rs index f7eea0aadfa..bdc21fcf037 100644 --- a/bridges/snowbridge/parachain/pallets/inbound-queue/src/lib.rs +++ b/bridges/snowbridge/parachain/pallets/inbound-queue/src/lib.rs @@ -54,8 +54,8 @@ use scale_info::TypeInfo; use sp_core::{H160, H256}; use sp_std::{convert::TryFrom, vec}; use xcm::prelude::{ - send_xcm, Instruction::SetTopic, Junction::*, Junctions::*, MultiLocation, - SendError as XcmpSendError, SendXcm, Xcm, XcmContext, XcmHash, + send_xcm, Instruction::SetTopic, Junction::*, Location, SendError as XcmpSendError, SendXcm, + Xcm, XcmContext, XcmHash, }; use xcm_executor::traits::TransactAsset; @@ -324,7 +324,7 @@ pub mod pallet { } pub fn send_xcm(xcm: Xcm<()>, dest: ParaId) -> Result> { - let dest = MultiLocation { parents: 1, interior: X1(Parachain(dest.into())) }; + let dest = Location::new(1, [Parachain(dest.into())]); let (xcm_hash, _) = send_xcm::(dest, xcm).map_err(Error::::from)?; Ok(xcm_hash) } @@ -341,8 +341,8 @@ pub mod pallet { pub fn burn_fees(para_id: ParaId, fee: BalanceOf) -> DispatchResult { let dummy_context = XcmContext { origin: None, message_id: Default::default(), topic: None }; - let dest = MultiLocation { parents: 1, interior: X1(Parachain(para_id.into())) }; - let fees = (MultiLocation::parent(), fee.saturated_into::()).into(); + let dest = Location::new(1, [Parachain(para_id.into())]); + let fees = (Location::parent(), fee.saturated_into::()).into(); T::AssetTransactor::can_check_out(&dest, &fees, &dummy_context).map_err(|error| { log::error!( target: LOG_TARGET, diff --git a/bridges/snowbridge/parachain/pallets/inbound-queue/src/mock.rs b/bridges/snowbridge/parachain/pallets/inbound-queue/src/mock.rs index b031a46e219..39374aa3d71 100644 --- a/bridges/snowbridge/parachain/pallets/inbound-queue/src/mock.rs +++ b/bridges/snowbridge/parachain/pallets/inbound-queue/src/mock.rs @@ -21,8 +21,8 @@ use sp_runtime::{ BuildStorage, FixedU128, MultiSignature, }; use sp_std::convert::From; -use xcm::v3::{prelude::*, MultiAssets, SendXcm}; -use xcm_executor::Assets; +use xcm::v4::{prelude::*, SendXcm}; +use xcm_executor::AssetsInHolding; use crate::{self as inbound_queue}; @@ -155,17 +155,16 @@ impl SendXcm for MockXcmSender { type Ticket = Xcm<()>; fn validate( - dest: &mut Option, - xcm: &mut Option>, + dest: &mut Option, + xcm: &mut Option>, ) -> SendResult { - match dest { - Some(MultiLocation { interior, .. }) => { - if let X1(Parachain(1001)) = interior { - return Err(XcmpSendError::NotApplicable) - } - Ok((xcm.clone().unwrap(), MultiAssets::default())) - }, - _ => Ok((xcm.clone().unwrap(), MultiAssets::default())), + if let Some(location) = dest { + match location.unpack() { + (_, [Parachain(1001)]) => return Err(XcmpSendError::NotApplicable), + _ => Ok((xcm.clone().unwrap(), Assets::default())), + } + } else { + Ok((xcm.clone().unwrap(), Assets::default())) } } @@ -203,45 +202,33 @@ impl StaticLookup for MockChannelLookup { pub struct SuccessfulTransactor; impl TransactAsset for SuccessfulTransactor { - fn can_check_in( - _origin: &MultiLocation, - _what: &MultiAsset, - _context: &XcmContext, - ) -> XcmResult { + fn can_check_in(_origin: &Location, _what: &Asset, _context: &XcmContext) -> XcmResult { Ok(()) } - fn can_check_out( - _dest: &MultiLocation, - _what: &MultiAsset, - _context: &XcmContext, - ) -> XcmResult { + fn can_check_out(_dest: &Location, _what: &Asset, _context: &XcmContext) -> XcmResult { Ok(()) } - fn deposit_asset( - _what: &MultiAsset, - _who: &MultiLocation, - _context: Option<&XcmContext>, - ) -> XcmResult { + fn deposit_asset(_what: &Asset, _who: &Location, _context: Option<&XcmContext>) -> XcmResult { Ok(()) } fn withdraw_asset( - _what: &MultiAsset, - _who: &MultiLocation, + _what: &Asset, + _who: &Location, _context: Option<&XcmContext>, - ) -> Result { - Ok(Assets::default()) + ) -> Result { + Ok(AssetsInHolding::default()) } fn internal_transfer_asset( - _what: &MultiAsset, - _from: &MultiLocation, - _to: &MultiLocation, + _what: &Asset, + _from: &Location, + _to: &Location, _context: &XcmContext, - ) -> Result { - Ok(Assets::default()) + ) -> Result { + Ok(AssetsInHolding::default()) } } diff --git a/bridges/snowbridge/parachain/pallets/inbound-queue/src/test.rs b/bridges/snowbridge/parachain/pallets/inbound-queue/src/test.rs index 17ebeb39446..9a47e475b8c 100644 --- a/bridges/snowbridge/parachain/pallets/inbound-queue/src/test.rs +++ b/bridges/snowbridge/parachain/pallets/inbound-queue/src/test.rs @@ -41,8 +41,8 @@ fn test_submit_happy_path() { .into(), nonce: 1, message_id: [ - 27, 217, 88, 127, 46, 143, 199, 70, 236, 66, 212, 244, 85, 221, 153, 104, 175, 37, - 224, 20, 140, 95, 140, 7, 27, 74, 182, 199, 77, 12, 194, 236, + 57, 61, 232, 3, 66, 61, 25, 190, 234, 188, 193, 174, 13, 186, 1, 64, 237, 94, 73, + 83, 14, 18, 209, 213, 78, 121, 43, 108, 251, 245, 107, 67, ], fee_burned: 110000000000, } diff --git a/bridges/snowbridge/parachain/pallets/system/runtime-api/src/lib.rs b/bridges/snowbridge/parachain/pallets/system/runtime-api/src/lib.rs index d99b456c848..7f119809546 100644 --- a/bridges/snowbridge/parachain/pallets/system/runtime-api/src/lib.rs +++ b/bridges/snowbridge/parachain/pallets/system/runtime-api/src/lib.rs @@ -3,11 +3,11 @@ #![cfg_attr(not(feature = "std"), no_std)] use snowbridge_core::AgentId; -use xcm::VersionedMultiLocation; +use xcm::VersionedLocation; sp_api::decl_runtime_apis! { pub trait ControlApi { - fn agent_id(location: VersionedMultiLocation) -> Option; + fn agent_id(location: VersionedLocation) -> Option; } } diff --git a/bridges/snowbridge/parachain/pallets/system/src/api.rs b/bridges/snowbridge/parachain/pallets/system/src/api.rs index 245e6eea1c1..ef12b03e1d7 100644 --- a/bridges/snowbridge/parachain/pallets/system/src/api.rs +++ b/bridges/snowbridge/parachain/pallets/system/src/api.rs @@ -3,14 +3,14 @@ //! Helpers for implementing runtime api use snowbridge_core::AgentId; -use xcm::{prelude::*, VersionedMultiLocation}; +use xcm::{prelude::*, VersionedLocation}; use crate::{agent_id_of, Config}; -pub fn agent_id(location: VersionedMultiLocation) -> Option +pub fn agent_id(location: VersionedLocation) -> Option where Runtime: Config, { - let location: MultiLocation = location.try_into().ok()?; + let location: Location = location.try_into().ok()?; agent_id_of::(&location).ok() } diff --git a/bridges/snowbridge/parachain/pallets/system/src/benchmarking.rs b/bridges/snowbridge/parachain/pallets/system/src/benchmarking.rs index 8d26408b38e..ef908ad6a3f 100644 --- a/bridges/snowbridge/parachain/pallets/system/src/benchmarking.rs +++ b/bridges/snowbridge/parachain/pallets/system/src/benchmarking.rs @@ -63,7 +63,7 @@ mod benchmarks { #[benchmark] fn create_agent() -> Result<(), BenchmarkError> { let origin_para_id = 2000; - let origin_location = MultiLocation { parents: 1, interior: X1(Parachain(origin_para_id)) }; + let origin_location = Location::new(1, [Parachain(origin_para_id)]); let origin = T::Helper::make_xcm_origin(origin_location); fund_sovereign_account::(origin_para_id.into())?; @@ -76,7 +76,7 @@ mod benchmarks { #[benchmark] fn create_channel() -> Result<(), BenchmarkError> { let origin_para_id = 2000; - let origin_location = MultiLocation { parents: 1, interior: X1(Parachain(origin_para_id)) }; + let origin_location = Location::new(1, [Parachain(origin_para_id)]); let origin = T::Helper::make_xcm_origin(origin_location); fund_sovereign_account::(origin_para_id.into())?; @@ -91,7 +91,7 @@ mod benchmarks { #[benchmark] fn update_channel() -> Result<(), BenchmarkError> { let origin_para_id = 2000; - let origin_location = MultiLocation { parents: 1, interior: X1(Parachain(origin_para_id)) }; + let origin_location = Location::new(1, [Parachain(origin_para_id)]); let origin = T::Helper::make_xcm_origin(origin_location); fund_sovereign_account::(origin_para_id.into())?; SnowbridgeControl::::create_agent(origin.clone())?; @@ -106,7 +106,7 @@ mod benchmarks { #[benchmark] fn force_update_channel() -> Result<(), BenchmarkError> { let origin_para_id = 2000; - let origin_location = MultiLocation { parents: 1, interior: X1(Parachain(origin_para_id)) }; + let origin_location = Location::new(1, [Parachain(origin_para_id)]); let origin = T::Helper::make_xcm_origin(origin_location); let channel_id: ChannelId = ParaId::from(origin_para_id).into(); @@ -123,7 +123,7 @@ mod benchmarks { #[benchmark] fn transfer_native_from_agent() -> Result<(), BenchmarkError> { let origin_para_id = 2000; - let origin_location = MultiLocation { parents: 1, interior: X1(Parachain(origin_para_id)) }; + let origin_location = Location::new(1, [Parachain(origin_para_id)]); let origin = T::Helper::make_xcm_origin(origin_location); fund_sovereign_account::(origin_para_id.into())?; SnowbridgeControl::::create_agent(origin.clone())?; @@ -138,12 +138,12 @@ mod benchmarks { #[benchmark] fn force_transfer_native_from_agent() -> Result<(), BenchmarkError> { let origin_para_id = 2000; - let origin_location = MultiLocation { parents: 1, interior: X1(Parachain(origin_para_id)) }; - let origin = T::Helper::make_xcm_origin(origin_location); + let origin_location = Location::new(1, [Parachain(origin_para_id)]); + let origin = T::Helper::make_xcm_origin(origin_location.clone()); fund_sovereign_account::(origin_para_id.into())?; SnowbridgeControl::::create_agent(origin.clone())?; - let versioned_location: VersionedMultiLocation = origin_location.into(); + let versioned_location: VersionedLocation = origin_location.into(); #[extrinsic_call] _(RawOrigin::Root, Box::new(versioned_location), H160::default(), 1); diff --git a/bridges/snowbridge/parachain/pallets/system/src/lib.rs b/bridges/snowbridge/parachain/pallets/system/src/lib.rs index 0042093ee66..e742bd8e110 100644 --- a/bridges/snowbridge/parachain/pallets/system/src/lib.rs +++ b/bridges/snowbridge/parachain/pallets/system/src/lib.rs @@ -87,12 +87,12 @@ pub type AccountIdOf = ::AccountId; pub type PricingParametersOf = PricingParametersRecord>; /// Ensure origin location is a sibling -fn ensure_sibling(location: &MultiLocation) -> Result<(ParaId, H256), DispatchError> +fn ensure_sibling(location: &Location) -> Result<(ParaId, H256), DispatchError> where T: Config, { - match location { - MultiLocation { parents: 1, interior: X1(Parachain(para_id)) } => { + match location.unpack() { + (1, [Parachain(para_id)]) => { let agent_id = agent_id_of::(location)?; Ok(((*para_id).into(), agent_id)) }, @@ -101,7 +101,7 @@ where } /// Hash the location to produce an agent id -fn agent_id_of(location: &MultiLocation) -> Result { +fn agent_id_of(location: &Location) -> Result { T::AgentIdOf::convert_location(location).ok_or(Error::::LocationConversionFailed.into()) } @@ -110,7 +110,7 @@ pub trait BenchmarkHelper where O: OriginTrait, { - fn make_xcm_origin(location: MultiLocation) -> O; + fn make_xcm_origin(location: Location) -> O; } /// Whether a fee should be withdrawn to an account for sending an outbound message @@ -145,9 +145,9 @@ pub mod pallet { type OutboundQueue: SendMessage>; /// Origin check for XCM locations that can create agents - type SiblingOrigin: EnsureOrigin; + type SiblingOrigin: EnsureOrigin; - /// Converts MultiLocation to AgentId + /// Converts Location to AgentId type AgentIdOf: ConvertLocation; /// Token reserved for control operations @@ -180,7 +180,7 @@ pub mod pallet { }, /// An CreateAgent message was sent to the Gateway CreateAgent { - location: Box, + location: Box, agent_id: AgentId, }, /// An CreateChannel message was sent to the Gateway @@ -299,7 +299,7 @@ pub mod pallet { /// /// Fee required: No /// - /// - `origin`: Must be `MultiLocation` + /// - `origin`: Must be `Location` #[pallet::call_index(1)] #[pallet::weight((T::WeightInfo::set_operating_mode(), DispatchClass::Operational))] pub fn set_operating_mode(origin: OriginFor, mode: OperatingMode) -> DispatchResult { @@ -342,11 +342,11 @@ pub mod pallet { /// /// Fee required: Yes /// - /// - `origin`: Must be `MultiLocation` of a sibling parachain + /// - `origin`: Must be `Location` of a sibling parachain #[pallet::call_index(3)] #[pallet::weight(T::WeightInfo::create_agent())] pub fn create_agent(origin: OriginFor) -> DispatchResult { - let origin_location: MultiLocation = T::SiblingOrigin::ensure_origin(origin)?; + let origin_location: Location = T::SiblingOrigin::ensure_origin(origin)?; // Ensure that origin location is some consensus system on a sibling parachain let (para_id, agent_id) = ensure_sibling::(&origin_location)?; @@ -375,12 +375,12 @@ pub mod pallet { /// /// The message is sent over the bridge on BridgeHub's own channel to the Gateway. /// - /// - `origin`: Must be `MultiLocation` + /// - `origin`: Must be `Location` /// - `mode`: Initial operating mode of the channel #[pallet::call_index(4)] #[pallet::weight(T::WeightInfo::create_channel())] pub fn create_channel(origin: OriginFor, mode: OperatingMode) -> DispatchResult { - let origin_location: MultiLocation = T::SiblingOrigin::ensure_origin(origin)?; + let origin_location: Location = T::SiblingOrigin::ensure_origin(origin)?; // Ensure that origin location is a sibling parachain let (para_id, agent_id) = ensure_sibling::(&origin_location)?; @@ -407,12 +407,12 @@ pub mod pallet { /// /// A partial fee will be charged for local processing only. /// - /// - `origin`: Must be `MultiLocation` + /// - `origin`: Must be `Location` /// - `mode`: Initial operating mode of the channel #[pallet::call_index(5)] #[pallet::weight(T::WeightInfo::update_channel())] pub fn update_channel(origin: OriginFor, mode: OperatingMode) -> DispatchResult { - let origin_location: MultiLocation = T::SiblingOrigin::ensure_origin(origin)?; + let origin_location: Location = T::SiblingOrigin::ensure_origin(origin)?; // Ensure that origin location is a sibling parachain let (para_id, _) = ensure_sibling::(&origin_location)?; @@ -461,7 +461,7 @@ pub mod pallet { /// /// A partial fee will be charged for local processing only. /// - /// - `origin`: Must be `MultiLocation` + /// - `origin`: Must be `Location` #[pallet::call_index(7)] #[pallet::weight(T::WeightInfo::transfer_native_from_agent())] pub fn transfer_native_from_agent( @@ -469,7 +469,7 @@ pub mod pallet { recipient: H160, amount: u128, ) -> DispatchResult { - let origin_location: MultiLocation = T::SiblingOrigin::ensure_origin(origin)?; + let origin_location: Location = T::SiblingOrigin::ensure_origin(origin)?; // Ensure that origin location is some consensus system on a sibling parachain let (para_id, agent_id) = ensure_sibling::(&origin_location)?; @@ -501,14 +501,14 @@ pub mod pallet { #[pallet::weight(T::WeightInfo::force_transfer_native_from_agent())] pub fn force_transfer_native_from_agent( origin: OriginFor, - location: Box, + location: Box, recipient: H160, amount: u128, ) -> DispatchResult { ensure_root(origin)?; // Ensure that location is some consensus system on a sibling parachain - let location: MultiLocation = + let location: Location = (*location).try_into().map_err(|_| Error::::UnsupportedLocationVersion)?; let (_, agent_id) = ensure_sibling::(&location).map_err(|_| Error::::InvalidLocation)?; @@ -621,8 +621,8 @@ pub mod pallet { /// Initializes agents and channels. pub fn initialize(para_id: ParaId, asset_hub_para_id: ParaId) -> Result<(), DispatchError> { // Asset Hub - let asset_hub_location: MultiLocation = - ParentThen(X1(Parachain(asset_hub_para_id.into()))).into(); + let asset_hub_location: Location = + ParentThen(Parachain(asset_hub_para_id.into()).into()).into(); let asset_hub_agent_id = agent_id_of::(&asset_hub_location)?; let asset_hub_channel_id: ChannelId = asset_hub_para_id.into(); Agents::::insert(asset_hub_agent_id, ()); @@ -632,7 +632,7 @@ pub mod pallet { ); // Governance channels - let bridge_hub_agent_id = agent_id_of::(&MultiLocation::here())?; + let bridge_hub_agent_id = agent_id_of::(&Location::here())?; // Agent for BridgeHub Agents::::insert(bridge_hub_agent_id, ()); diff --git a/bridges/snowbridge/parachain/pallets/system/src/mock.rs b/bridges/snowbridge/parachain/pallets/system/src/mock.rs index bb9bae6b56d..bc229578132 100644 --- a/bridges/snowbridge/parachain/pallets/system/src/mock.rs +++ b/bridges/snowbridge/parachain/pallets/system/src/mock.rs @@ -49,22 +49,22 @@ mod pallet_xcm_origin { // Insert this custom Origin into the aggregate RuntimeOrigin #[pallet::origin] #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo, MaxEncodedLen)] - pub struct Origin(pub MultiLocation); + pub struct Origin(pub Location); - impl From for Origin { - fn from(location: MultiLocation) -> Origin { + impl From for Origin { + fn from(location: Location) -> Origin { Origin(location) } } - /// `EnsureOrigin` implementation succeeding with a `MultiLocation` value to recognize and + /// `EnsureOrigin` implementation succeeding with a `Location` value to recognize and /// filter the contained location pub struct EnsureXcm(PhantomData); - impl, F: Contains> EnsureOrigin for EnsureXcm + impl, F: Contains> EnsureOrigin for EnsureXcm where O::PalletsOrigin: From + TryInto, { - type Success = MultiLocation; + type Success = Location; fn try_origin(outer: O) -> Result { outer.try_with_caller(|caller| { @@ -77,7 +77,7 @@ mod pallet_xcm_origin { #[cfg(feature = "runtime-benchmarks")] fn try_successful_origin() -> Result { - Ok(O::from(Origin(MultiLocation { parents: 1, interior: X1(Parachain(2000)) }))) + Ok(O::from(Origin(Location::new(1, [Parachain(2000)])))) } } } @@ -186,9 +186,9 @@ parameter_types! { pub const SS58Prefix: u8 = 42; pub const AnyNetwork: Option = None; pub const RelayNetwork: Option = Some(NetworkId::Kusama); - pub const RelayLocation: MultiLocation = MultiLocation::parent(); - pub UniversalLocation: InteriorMultiLocation = - X2(GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(1013)); + pub const RelayLocation: Location = Location::parent(); + pub UniversalLocation: InteriorLocation = + [GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(1013)].into(); } pub const DOT: u128 = 10_000_000_000; @@ -211,7 +211,7 @@ parameter_types! { #[cfg(feature = "runtime-benchmarks")] impl BenchmarkHelper for () { - fn make_xcm_origin(location: MultiLocation) -> RuntimeOrigin { + fn make_xcm_origin(location: Location) -> RuntimeOrigin { RuntimeOrigin::from(pallet_xcm_origin::Origin(location)) } } @@ -260,11 +260,11 @@ pub fn new_test_ext(genesis_build: bool) -> sp_io::TestExternalities { // Test helpers -pub fn make_xcm_origin(location: MultiLocation) -> RuntimeOrigin { +pub fn make_xcm_origin(location: Location) -> RuntimeOrigin { pallet_xcm_origin::Origin(location).into() } -pub fn make_agent_id(location: MultiLocation) -> AgentId { +pub fn make_agent_id(location: Location) -> AgentId { ::AgentIdOf::convert_location(&location) .expect("convert location") } diff --git a/bridges/snowbridge/parachain/pallets/system/src/tests.rs b/bridges/snowbridge/parachain/pallets/system/src/tests.rs index e07481c1e33..8b417c258ea 100644 --- a/bridges/snowbridge/parachain/pallets/system/src/tests.rs +++ b/bridges/snowbridge/parachain/pallets/system/src/tests.rs @@ -11,8 +11,8 @@ use sp_runtime::{AccountId32, DispatchError::BadOrigin, TokenError}; fn create_agent() { new_test_ext(true).execute_with(|| { let origin_para_id = 2000; - let origin_location = MultiLocation { parents: 1, interior: X1(Parachain(origin_para_id)) }; - let agent_id = make_agent_id(origin_location); + let origin_location = Location::new(1, [Parachain(origin_para_id)]); + let agent_id = make_agent_id(origin_location.clone()); let sovereign_account = sibling_sovereign_account::(origin_para_id.into()); // fund sovereign account of origin @@ -30,7 +30,7 @@ fn create_agent() { #[test] fn test_agent_for_here() { new_test_ext(true).execute_with(|| { - let origin_location = MultiLocation::here(); + let origin_location = Location::here(); let agent_id = make_agent_id(origin_location); assert_eq!( agent_id, @@ -42,7 +42,7 @@ fn test_agent_for_here() { #[test] fn create_agent_fails_on_funds_unavailable() { new_test_ext(true).execute_with(|| { - let origin_location = MultiLocation { parents: 1, interior: X1(Parachain(2000)) }; + let origin_location = Location::new(1, [Parachain(2000)]); let origin = make_xcm_origin(origin_location); // Reset balance of sovereign_account to zero so to trigger the FundsUnavailable error let sovereign_account = sibling_sovereign_account::(2000.into()); @@ -56,19 +56,16 @@ fn create_agent_bad_origin() { new_test_ext(true).execute_with(|| { // relay chain location not allowed assert_noop!( - EthereumSystem::create_agent(make_xcm_origin(MultiLocation { - parents: 1, - interior: Here, - })), + EthereumSystem::create_agent(make_xcm_origin(Location::new(1, [],))), BadOrigin, ); // local account location not allowed assert_noop!( - EthereumSystem::create_agent(make_xcm_origin(MultiLocation { - parents: 0, - interior: X1(Junction::AccountId32 { network: None, id: [67u8; 32] }), - })), + EthereumSystem::create_agent(make_xcm_origin(Location::new( + 0, + [Junction::AccountId32 { network: None, id: [67u8; 32] }], + ))), BadOrigin, ); @@ -243,7 +240,7 @@ fn set_token_transfer_fees_invalid() { fn create_channel() { new_test_ext(true).execute_with(|| { let origin_para_id = 2000; - let origin_location = MultiLocation { parents: 1, interior: X1(Parachain(origin_para_id)) }; + let origin_location = Location::new(1, [Parachain(origin_para_id)]); let sovereign_account = sibling_sovereign_account::(origin_para_id.into()); let origin = make_xcm_origin(origin_location); @@ -259,7 +256,7 @@ fn create_channel() { fn create_channel_fail_already_exists() { new_test_ext(true).execute_with(|| { let origin_para_id = 2000; - let origin_location = MultiLocation { parents: 1, interior: X1(Parachain(origin_para_id)) }; + let origin_location = Location::new(1, [Parachain(origin_para_id)]); let sovereign_account = sibling_sovereign_account::(origin_para_id.into()); let origin = make_xcm_origin(origin_location); @@ -282,7 +279,7 @@ fn create_channel_bad_origin() { // relay chain location not allowed assert_noop!( EthereumSystem::create_channel( - make_xcm_origin(MultiLocation { parents: 1, interior: Here }), + make_xcm_origin(Location::new(1, [])), OperatingMode::Normal, ), BadOrigin, @@ -291,13 +288,10 @@ fn create_channel_bad_origin() { // child of sibling location not allowed assert_noop!( EthereumSystem::create_channel( - make_xcm_origin(MultiLocation { - parents: 1, - interior: X2( - Parachain(2000), - Junction::AccountId32 { network: None, id: [67u8; 32] } - ), - }), + make_xcm_origin(Location::new( + 1, + [Parachain(2000), Junction::AccountId32 { network: None, id: [67u8; 32] }], + )), OperatingMode::Normal, ), BadOrigin, @@ -306,10 +300,10 @@ fn create_channel_bad_origin() { // local account location not allowed assert_noop!( EthereumSystem::create_channel( - make_xcm_origin(MultiLocation { - parents: 0, - interior: X1(Junction::AccountId32 { network: None, id: [67u8; 32] }), - }), + make_xcm_origin(Location::new( + 0, + [Junction::AccountId32 { network: None, id: [67u8; 32] }], + )), OperatingMode::Normal, ), BadOrigin, @@ -333,7 +327,7 @@ fn create_channel_bad_origin() { fn update_channel() { new_test_ext(true).execute_with(|| { let origin_para_id = 2000; - let origin_location = MultiLocation { parents: 1, interior: X1(Parachain(origin_para_id)) }; + let origin_location = Location::new(1, [Parachain(origin_para_id)]); let sovereign_account = sibling_sovereign_account::(origin_para_id.into()); let origin = make_xcm_origin(origin_location); @@ -359,23 +353,17 @@ fn update_channel_bad_origin() { // relay chain location not allowed assert_noop!( - EthereumSystem::update_channel( - make_xcm_origin(MultiLocation { parents: 1, interior: Here }), - mode, - ), + EthereumSystem::update_channel(make_xcm_origin(Location::new(1, [])), mode,), BadOrigin, ); // child of sibling location not allowed assert_noop!( EthereumSystem::update_channel( - make_xcm_origin(MultiLocation { - parents: 1, - interior: X2( - Parachain(2000), - Junction::AccountId32 { network: None, id: [67u8; 32] } - ), - }), + make_xcm_origin(Location::new( + 1, + [Parachain(2000), Junction::AccountId32 { network: None, id: [67u8; 32] }], + )), mode, ), BadOrigin, @@ -384,10 +372,10 @@ fn update_channel_bad_origin() { // local account location not allowed assert_noop!( EthereumSystem::update_channel( - make_xcm_origin(MultiLocation { - parents: 0, - interior: X1(Junction::AccountId32 { network: None, id: [67u8; 32] }), - }), + make_xcm_origin(Location::new( + 0, + [Junction::AccountId32 { network: None, id: [67u8; 32] }], + )), mode, ), BadOrigin, @@ -407,7 +395,7 @@ fn update_channel_bad_origin() { #[test] fn update_channel_fails_not_exist() { new_test_ext(true).execute_with(|| { - let origin_location = MultiLocation { parents: 1, interior: X1(Parachain(2000)) }; + let origin_location = Location::new(1, [Parachain(2000)]); let origin = make_xcm_origin(origin_location); // Now try to update it @@ -422,7 +410,7 @@ fn update_channel_fails_not_exist() { fn force_update_channel() { new_test_ext(true).execute_with(|| { let origin_para_id = 2000; - let origin_location = MultiLocation { parents: 1, interior: X1(Parachain(origin_para_id)) }; + let origin_location = Location::new(1, [Parachain(origin_para_id)]); let sovereign_account = sibling_sovereign_account::(origin_para_id.into()); let origin = make_xcm_origin(origin_location); @@ -468,8 +456,8 @@ fn force_update_channel_bad_origin() { #[test] fn transfer_native_from_agent() { new_test_ext(true).execute_with(|| { - let origin_location = MultiLocation { parents: 1, interior: X1(Parachain(2000)) }; - let origin = make_xcm_origin(origin_location); + let origin_location = Location::new(1, [Parachain(2000)]); + let origin = make_xcm_origin(origin_location.clone()); let recipient: H160 = [27u8; 20].into(); let amount = 103435; @@ -477,7 +465,7 @@ fn transfer_native_from_agent() { assert_ok!(EthereumSystem::create_agent(origin.clone())); assert_ok!(EthereumSystem::create_channel(origin, OperatingMode::Normal)); - let origin = make_xcm_origin(origin_location); + let origin = make_xcm_origin(origin_location.clone()); assert_ok!(EthereumSystem::transfer_native_from_agent(origin, recipient, amount),); System::assert_last_event(RuntimeEvent::EthereumSystem( @@ -494,13 +482,13 @@ fn transfer_native_from_agent() { fn force_transfer_native_from_agent() { new_test_ext(true).execute_with(|| { let origin = RuntimeOrigin::root(); - let location = MultiLocation { parents: 1, interior: X1(Parachain(2000)) }; - let versioned_location: Box = Box::new(location.into()); + let location = Location::new(1, [Parachain(2000)]); + let versioned_location: Box = Box::new(location.clone().into()); let recipient: H160 = [27u8; 20].into(); let amount = 103435; // First create the agent - Agents::::insert(make_agent_id(location), ()); + Agents::::insert(make_agent_id(location.clone()), ()); assert_ok!(EthereumSystem::force_transfer_native_from_agent( origin, @@ -530,13 +518,10 @@ fn force_transfer_native_from_agent_bad_origin() { EthereumSystem::force_transfer_native_from_agent( RuntimeOrigin::signed([14; 32].into()), Box::new( - MultiLocation { - parents: 1, - interior: X2( - Parachain(2000), - Junction::AccountId32 { network: None, id: [67u8; 32] } - ), - } + Location::new( + 1, + [Parachain(2000), Junction::AccountId32 { network: None, id: [67u8; 32] }], + ) .into() ), recipient, @@ -571,8 +556,8 @@ fn check_sibling_sovereign_account() { fn charge_fee_for_create_agent() { new_test_ext(true).execute_with(|| { let para_id: u32 = TestParaId::get(); - let origin_location = MultiLocation { parents: 1, interior: X1(Parachain(para_id)) }; - let origin = make_xcm_origin(origin_location); + let origin_location = Location::new(1, [Parachain(para_id)]); + let origin = make_xcm_origin(origin_location.clone()); let sovereign_account = sibling_sovereign_account::(para_id.into()); let (_, agent_id) = ensure_sibling::(&origin_location).unwrap(); @@ -605,10 +590,10 @@ fn charge_fee_for_create_agent() { fn charge_fee_for_transfer_native_from_agent() { new_test_ext(true).execute_with(|| { let para_id: u32 = TestParaId::get(); - let origin_location = MultiLocation { parents: 1, interior: X1(Parachain(para_id)) }; + let origin_location = Location::new(1, [Parachain(para_id)]); let recipient: H160 = [27u8; 20].into(); let amount = 103435; - let origin = make_xcm_origin(origin_location); + let origin = make_xcm_origin(origin_location.clone()); let (_, agent_id) = ensure_sibling::(&origin_location).unwrap(); let sovereign_account = sibling_sovereign_account::(para_id.into()); diff --git a/bridges/snowbridge/parachain/primitives/core/src/lib.rs b/bridges/snowbridge/parachain/primitives/core/src/lib.rs index ecbc3bb365f..a464557a72b 100644 --- a/bridges/snowbridge/parachain/primitives/core/src/lib.rs +++ b/bridges/snowbridge/parachain/primitives/core/src/lib.rs @@ -28,11 +28,7 @@ use sp_core::H256; use sp_io::hashing::keccak_256; use sp_runtime::{traits::AccountIdConversion, RuntimeDebug}; use sp_std::prelude::*; -use xcm::prelude::{ - Junction::Parachain, - Junctions::{Here, X1}, - MultiLocation, -}; +use xcm::prelude::{Junction::Parachain, Location}; use xcm_builder::{DescribeAllTerminal, DescribeFamily, DescribeLocation, HashedDescription}; /// The ID of an agent contract @@ -53,9 +49,9 @@ pub fn sibling_sovereign_account_raw(para_id: ParaId) -> [u8; 32] { } pub struct AllowSiblingsOnly; -impl Contains for AllowSiblingsOnly { - fn contains(location: &MultiLocation) -> bool { - matches!(location, MultiLocation { parents: 1, interior: X1(Parachain(_)) }) +impl Contains for AllowSiblingsOnly { + fn contains(location: &Location) -> bool { + matches!(location.unpack(), (1, [Parachain(_)])) } } @@ -161,14 +157,14 @@ pub const SECONDARY_GOVERNANCE_CHANNEL: ChannelId = pub struct DescribeHere; impl DescribeLocation for DescribeHere { - fn describe_location(l: &MultiLocation) -> Option> { - match (l.parents, l.interior) { - (0, Here) => Some(Vec::::new().encode()), + fn describe_location(l: &Location) -> Option> { + match l.unpack() { + (0, []) => Some(Vec::::new().encode()), _ => None, } } } -/// Creates an AgentId from a MultiLocation. An AgentId is a unique mapping to a Agent contract on -/// Ethereum which acts as the sovereign account for the MultiLocation. +/// Creates an AgentId from a Location. An AgentId is a unique mapping to a Agent contract on +/// Ethereum which acts as the sovereign account for the Location. pub type AgentIdOf = HashedDescription)>; diff --git a/bridges/snowbridge/parachain/primitives/core/tests/mod.rs b/bridges/snowbridge/parachain/primitives/core/tests/mod.rs index 2da5d2df182..c91063a8148 100644 --- a/bridges/snowbridge/parachain/primitives/core/tests/mod.rs +++ b/bridges/snowbridge/parachain/primitives/core/tests/mod.rs @@ -2,12 +2,12 @@ mod tests { use frame_support::traits::Contains; use snowbridge_core::AllowSiblingsOnly; - use xcm::prelude::{Junction::Parachain, Junctions::X1, MultiLocation}; + use xcm::prelude::{Junction::Parachain, Location}; #[test] fn allow_siblings_predicate_only_allows_siblings() { - let sibling = MultiLocation::new(1, X1(Parachain(1000))); - let child = MultiLocation::new(0, X1(Parachain(1000))); + let sibling = Location::new(1, [Parachain(1000)]); + let child = Location::new(0, [Parachain(1000)]); assert!(AllowSiblingsOnly::contains(&sibling), "Sibling returns true."); assert!(!AllowSiblingsOnly::contains(&child), "Child returns false."); } diff --git a/bridges/snowbridge/parachain/primitives/router/src/inbound/mod.rs b/bridges/snowbridge/parachain/primitives/router/src/inbound/mod.rs index a07e0eae5d7..c20554c6d18 100644 --- a/bridges/snowbridge/parachain/primitives/router/src/inbound/mod.rs +++ b/bridges/snowbridge/parachain/primitives/router/src/inbound/mod.rs @@ -161,13 +161,13 @@ where { fn convert_register_token(chain_id: u64, token: H160, fee: u128) -> (Xcm<()>, Balance) { let network = Ethereum { chain_id }; - let xcm_fee: MultiAsset = (MultiLocation::parent(), fee).into(); - let deposit: MultiAsset = (MultiLocation::parent(), CreateAssetDeposit::get()).into(); + let xcm_fee: Asset = (Location::parent(), fee).into(); + let deposit: Asset = (Location::parent(), CreateAssetDeposit::get()).into(); let total_amount = fee + CreateAssetDeposit::get(); - let total: MultiAsset = (MultiLocation::parent(), total_amount).into(); + let total: Asset = (Location::parent(), total_amount).into(); - let bridge_location: MultiLocation = (Parent, Parent, GlobalConsensus(network)).into(); + let bridge_location: Location = (Parent, Parent, GlobalConsensus(network)).into(); let owner = GlobalConsensusEthereumConvertsFor::<[u8; 32]>::from_chain_id(&chain_id); let asset_id = Self::convert_token_address(network, token); @@ -182,7 +182,7 @@ where // Fund the snowbridge sovereign with the required deposit for creation. DepositAsset { assets: Definite(deposit.into()), beneficiary: bridge_location }, // Only our inbound-queue pallet is allowed to invoke `UniversalOrigin` - DescendOrigin(X1(PalletInstance(inbound_queue_pallet_index))), + DescendOrigin(PalletInstance(inbound_queue_pallet_index).into()), // Change origin to the bridge. UniversalOrigin(GlobalConsensus(network)), // Call create_asset on foreign assets pallet. @@ -216,40 +216,37 @@ where asset_hub_fee: u128, ) -> (Xcm<()>, Balance) { let network = Ethereum { chain_id }; - let asset_hub_fee_asset: MultiAsset = (MultiLocation::parent(), asset_hub_fee).into(); - let asset: MultiAsset = (Self::convert_token_address(network, token), amount).into(); + let asset_hub_fee_asset: Asset = (Location::parent(), asset_hub_fee).into(); + let asset: Asset = (Self::convert_token_address(network, token), amount).into(); let (dest_para_id, beneficiary, dest_para_fee) = match destination { // Final destination is a 32-byte account on AssetHub - Destination::AccountId32 { id } => ( - None, - MultiLocation { parents: 0, interior: X1(AccountId32 { network: None, id }) }, - 0, - ), + Destination::AccountId32 { id } => + (None, Location::new(0, [AccountId32 { network: None, id }]), 0), // Final destination is a 32-byte account on a sibling of AssetHub Destination::ForeignAccountId32 { para_id, id, fee } => ( Some(para_id), - MultiLocation { parents: 0, interior: X1(AccountId32 { network: None, id }) }, + Location::new(0, [AccountId32 { network: None, id }]), // Total fee needs to cover execution on AssetHub and Sibling fee, ), // Final destination is a 20-byte account on a sibling of AssetHub Destination::ForeignAccountId20 { para_id, id, fee } => ( Some(para_id), - MultiLocation { parents: 0, interior: X1(AccountKey20 { network: None, key: id }) }, + Location::new(0, [AccountKey20 { network: None, key: id }]), // Total fee needs to cover execution on AssetHub and Sibling fee, ), }; let total_fees = asset_hub_fee.saturating_add(dest_para_fee); - let total_fee_asset: MultiAsset = (MultiLocation::parent(), total_fees).into(); + let total_fee_asset: Asset = (Location::parent(), total_fees).into(); let inbound_queue_pallet_index = InboundQueuePalletInstance::get(); let mut instructions = vec![ ReceiveTeleportedAsset(total_fee_asset.into()), BuyExecution { fees: asset_hub_fee_asset, weight_limit: Unlimited }, - DescendOrigin(X1(PalletInstance(inbound_queue_pallet_index))), + DescendOrigin(PalletInstance(inbound_queue_pallet_index).into()), UniversalOrigin(GlobalConsensus(network)), ReserveAssetDeposited(asset.clone().into()), ClearOrigin, @@ -257,14 +254,13 @@ where match dest_para_id { Some(dest_para_id) => { - let dest_para_fee_asset: MultiAsset = - (MultiLocation::parent(), dest_para_fee).into(); + let dest_para_fee_asset: Asset = (Location::parent(), dest_para_fee).into(); instructions.extend(vec![ // Perform a deposit reserve to send to destination chain. DepositReserveAsset { assets: Definite(vec![dest_para_fee_asset.clone(), asset.clone()].into()), - dest: MultiLocation { parents: 1, interior: X1(Parachain(dest_para_id)) }, + dest: Location::new(1, [Parachain(dest_para_id)]), xcm: vec![ // Buy execution on target. BuyExecution { fees: dest_para_fee_asset, weight_limit: Unlimited }, @@ -286,15 +282,12 @@ where (instructions.into(), total_fees.into()) } - // Convert ERC20 token address to a Multilocation that can be understood by Assets Hub. - fn convert_token_address(network: NetworkId, token: H160) -> MultiLocation { - MultiLocation { - parents: 2, - interior: X2( - GlobalConsensus(network), - AccountKey20 { network: None, key: token.into() }, - ), - } + // Convert ERC20 token address to a location that can be understood by Assets Hub. + fn convert_token_address(network: NetworkId, token: H160) -> Location { + Location::new( + 2, + [GlobalConsensus(network), AccountKey20 { network: None, key: token.into() }], + ) } } @@ -303,12 +296,11 @@ impl ConvertLocation for GlobalConsensusEthereumConvertsFo where AccountId: From<[u8; 32]> + Clone, { - fn convert_location(location: &MultiLocation) -> Option { - if let MultiLocation { interior: X1(GlobalConsensus(Ethereum { chain_id })), .. } = location - { - Some(Self::from_chain_id(chain_id).into()) - } else { - None + fn convert_location(location: &Location) -> Option { + match location.unpack() { + (_, [GlobalConsensus(Ethereum { chain_id })]) => + Some(Self::from_chain_id(chain_id).into()), + _ => None, } } } diff --git a/bridges/snowbridge/parachain/primitives/router/src/inbound/tests.rs b/bridges/snowbridge/parachain/primitives/router/src/inbound/tests.rs index 8c96c13cf22..c46b88a84a4 100644 --- a/bridges/snowbridge/parachain/primitives/router/src/inbound/tests.rs +++ b/bridges/snowbridge/parachain/primitives/router/src/inbound/tests.rs @@ -2,7 +2,7 @@ use super::GlobalConsensusEthereumConvertsFor; use crate::inbound::CallIndex; use frame_support::parameter_types; use hex_literal::hex; -use xcm::v3::prelude::*; +use xcm::v4::prelude::*; use xcm_executor::traits::ConvertLocation; const NETWORK: NetworkId = Ethereum { chain_id: 11155111 }; @@ -20,7 +20,7 @@ parameter_types! { fn test_contract_location_with_network_converts_successfully() { let expected_account: [u8; 32] = hex!("ce796ae65569a670d0c1cc1ac12515a3ce21b5fbf729d63d7b289baad070139d"); - let contract_location = MultiLocation { parents: 2, interior: X1(GlobalConsensus(NETWORK)) }; + let contract_location = Location::new(2, [GlobalConsensus(NETWORK)]); let account = GlobalConsensusEthereumConvertsFor::<[u8; 32]>::convert_location(&contract_location) @@ -31,8 +31,7 @@ fn test_contract_location_with_network_converts_successfully() { #[test] fn test_contract_location_with_incorrect_location_fails_convert() { - let contract_location = - MultiLocation { parents: 2, interior: X2(GlobalConsensus(Polkadot), Parachain(1000)) }; + let contract_location = Location::new(2, [GlobalConsensus(Polkadot), Parachain(1000)]); assert_eq!( GlobalConsensusEthereumConvertsFor::<[u8; 32]>::convert_location(&contract_location), diff --git a/bridges/snowbridge/parachain/primitives/router/src/outbound/mod.rs b/bridges/snowbridge/parachain/primitives/router/src/outbound/mod.rs index c7f2f440834..21823992db7 100644 --- a/bridges/snowbridge/parachain/primitives/router/src/outbound/mod.rs +++ b/bridges/snowbridge/parachain/primitives/router/src/outbound/mod.rs @@ -16,7 +16,7 @@ use snowbridge_core::{ }; use sp_core::{H160, H256}; use sp_std::{iter::Peekable, marker::PhantomData, prelude::*}; -use xcm::v3::prelude::*; +use xcm::v4::prelude::*; use xcm_executor::traits::{ConvertLocation, ExportXcm}; pub struct EthereumBlobExporter< @@ -29,7 +29,7 @@ pub struct EthereumBlobExporter< impl ExportXcm for EthereumBlobExporter where - UniversalLocation: Get, + UniversalLocation: Get, EthereumNetwork: Get, OutboundQueue: SendMessage, AgentHashedDescription: ConvertLocation, @@ -39,8 +39,8 @@ where fn validate( network: NetworkId, _channel: u32, - universal_source: &mut Option, - destination: &mut Option, + universal_source: &mut Option, + destination: &mut Option, message: &mut Option>, ) -> SendResult { let expected_network = EthereumNetwork::get(); @@ -74,8 +74,8 @@ where return Err(SendError::NotApplicable) } - let para_id = match local_sub { - X1(Parachain(para_id)) => para_id, + let para_id = match local_sub.as_slice() { + [Parachain(para_id)] => *para_id, _ => { log::error!(target: "xcm::ethereum_blob_exporter", "could not get parachain id from universal source '{local_sub:?}'."); return Err(SendError::MissingArgument) @@ -93,7 +93,7 @@ where SendError::Unroutable })?; - let source_location: MultiLocation = MultiLocation { parents: 1, interior: local_sub }; + let source_location = Location::new(1, local_sub.clone()); let agent_id = match AgentHashedDescription::convert_location(&source_location) { Some(id) => id, None => { @@ -116,8 +116,8 @@ where SendError::Unroutable })?; - // convert fee to MultiAsset - let fee = MultiAsset::from((MultiLocation::parent(), fee.total())).into(); + // convert fee to Asset + let fee = Asset::from((Location::parent(), fee.total())).into(); Ok(((ticket.encode(), message_id), fee)) } @@ -216,8 +216,8 @@ impl<'a, Call> XcmConverter<'a, Call> { // assert that the beneficiary is AccountKey20. let recipient = match_expression!( - beneficiary, - MultiLocation { parents: 0, interior: X1(AccountKey20 { network, key }) } + beneficiary.unpack(), + (0, [AccountKey20 { network, key }]) if self.network_matches(network), H160(*key) ) @@ -245,14 +245,15 @@ impl<'a, Call> XcmConverter<'a, Call> { } } - let (token, amount) = match_expression!( - reserve_asset, - MultiAsset { - id: Concrete(MultiLocation { parents: 0, interior: X1(AccountKey20 { network , key })}), - fun: Fungible(amount) - } if self.network_matches(network), - (H160(*key), *amount) - ) + let (token, amount) = match reserve_asset { + Asset { id: AssetId(inner_location), fun: Fungible(amount) } => + match inner_location.unpack() { + (0, [AccountKey20 { network, key }]) if self.network_matches(network) => + Some((H160(*key), *amount)), + _ => None, + }, + _ => None, + } .ok_or(AssetResolutionFailed)?; // transfer amount must be greater than 0. diff --git a/bridges/snowbridge/parachain/primitives/router/src/outbound/tests.rs b/bridges/snowbridge/parachain/primitives/router/src/outbound/tests.rs index 153d934c390..111243bb45a 100644 --- a/bridges/snowbridge/parachain/primitives/router/src/outbound/tests.rs +++ b/bridges/snowbridge/parachain/primitives/router/src/outbound/tests.rs @@ -11,7 +11,7 @@ use super::*; parameter_types! { const MaxMessageSize: u32 = u32::MAX; const RelayNetwork: NetworkId = Polkadot; - const UniversalLocation: InteriorMultiLocation = X2(GlobalConsensus(RelayNetwork::get()), Parachain(1013)); + UniversalLocation: InteriorLocation = [GlobalConsensus(RelayNetwork::get()), Parachain(1013)].into(); const BridgedNetwork: NetworkId = Ethereum{ chain_id: 1 }; const NonBridgedNetwork: NetworkId = Ethereum{ chain_id: 2 }; } @@ -61,8 +61,8 @@ impl SendMessageFeeProvider for MockErrOutboundQueue { fn exporter_validate_with_unknown_network_yields_not_applicable() { let network = Ethereum { chain_id: 1337 }; let channel: u32 = 0; - let mut universal_source: Option = None; - let mut destination: Option = None; + let mut universal_source: Option = None; + let mut destination: Option = None; let mut message: Option> = None; let result = EthereumBlobExporter::< @@ -80,8 +80,8 @@ fn exporter_validate_with_unknown_network_yields_not_applicable() { fn exporter_validate_with_invalid_destination_yields_missing_argument() { let network = BridgedNetwork::get(); let channel: u32 = 0; - let mut universal_source: Option = None; - let mut destination: Option = None; + let mut universal_source: Option = None; + let mut destination: Option = None; let mut message: Option> = None; let result = EthereumBlobExporter::< @@ -99,10 +99,11 @@ fn exporter_validate_with_invalid_destination_yields_missing_argument() { fn exporter_validate_with_x8_destination_yields_not_applicable() { let network = BridgedNetwork::get(); let channel: u32 = 0; - let mut universal_source: Option = None; - let mut destination: Option = Some(X8( - OnlyChild, OnlyChild, OnlyChild, OnlyChild, OnlyChild, OnlyChild, OnlyChild, OnlyChild, - )); + let mut universal_source: Option = None; + let mut destination: Option = Some( + [OnlyChild, OnlyChild, OnlyChild, OnlyChild, OnlyChild, OnlyChild, OnlyChild, OnlyChild] + .into(), + ); let mut message: Option> = None; let result = EthereumBlobExporter::< @@ -120,8 +121,8 @@ fn exporter_validate_with_x8_destination_yields_not_applicable() { fn exporter_validate_without_universal_source_yields_missing_argument() { let network = BridgedNetwork::get(); let channel: u32 = 0; - let mut universal_source: Option = None; - let mut destination: Option = Here.into(); + let mut universal_source: Option = None; + let mut destination: Option = Here.into(); let mut message: Option> = None; let result = EthereumBlobExporter::< @@ -139,8 +140,8 @@ fn exporter_validate_without_universal_source_yields_missing_argument() { fn exporter_validate_without_global_universal_location_yields_unroutable() { let network = BridgedNetwork::get(); let channel: u32 = 0; - let mut universal_source: Option = Here.into(); - let mut destination: Option = Here.into(); + let mut universal_source: Option = Here.into(); + let mut destination: Option = Here.into(); let mut message: Option> = None; let result = EthereumBlobExporter::< @@ -158,8 +159,8 @@ fn exporter_validate_without_global_universal_location_yields_unroutable() { fn exporter_validate_without_global_bridge_location_yields_not_applicable() { let network = NonBridgedNetwork::get(); let channel: u32 = 0; - let mut universal_source: Option = Here.into(); - let mut destination: Option = Here.into(); + let mut universal_source: Option = Here.into(); + let mut destination: Option = Here.into(); let mut message: Option> = None; let result = EthereumBlobExporter::< @@ -177,9 +178,9 @@ fn exporter_validate_without_global_bridge_location_yields_not_applicable() { fn exporter_validate_with_remote_universal_source_yields_not_applicable() { let network = BridgedNetwork::get(); let channel: u32 = 0; - let mut universal_source: Option = - Some(X2(GlobalConsensus(Kusama), Parachain(1000))); - let mut destination: Option = Here.into(); + let mut universal_source: Option = + Some([GlobalConsensus(Kusama), Parachain(1000)].into()); + let mut destination: Option = Here.into(); let mut message: Option> = None; let result = EthereumBlobExporter::< @@ -197,8 +198,8 @@ fn exporter_validate_with_remote_universal_source_yields_not_applicable() { fn exporter_validate_without_para_id_in_source_yields_missing_argument() { let network = BridgedNetwork::get(); let channel: u32 = 0; - let mut universal_source: Option = Some(X1(GlobalConsensus(Polkadot))); - let mut destination: Option = Here.into(); + let mut universal_source: Option = Some(GlobalConsensus(Polkadot).into()); + let mut destination: Option = Here.into(); let mut message: Option> = None; let result = EthereumBlobExporter::< @@ -216,9 +217,9 @@ fn exporter_validate_without_para_id_in_source_yields_missing_argument() { fn exporter_validate_complex_para_id_in_source_yields_missing_argument() { let network = BridgedNetwork::get(); let channel: u32 = 0; - let mut universal_source: Option = - Some(X3(GlobalConsensus(Polkadot), Parachain(1000), PalletInstance(12))); - let mut destination: Option = Here.into(); + let mut universal_source: Option = + Some([GlobalConsensus(Polkadot), Parachain(1000), PalletInstance(12)].into()); + let mut destination: Option = Here.into(); let mut message: Option> = None; let result = EthereumBlobExporter::< @@ -236,9 +237,9 @@ fn exporter_validate_complex_para_id_in_source_yields_missing_argument() { fn exporter_validate_without_xcm_message_yields_missing_argument() { let network = BridgedNetwork::get(); let channel: u32 = 0; - let mut universal_source: Option = - Some(X2(GlobalConsensus(Polkadot), Parachain(1000))); - let mut destination: Option = Here.into(); + let mut universal_source: Option = + Some([GlobalConsensus(Polkadot), Parachain(1000)].into()); + let mut destination: Option = Here.into(); let mut message: Option> = None; let result = EthereumBlobExporter::< @@ -255,23 +256,23 @@ fn exporter_validate_without_xcm_message_yields_missing_argument() { #[test] fn exporter_validate_with_max_target_fee_yields_unroutable() { let network = BridgedNetwork::get(); - let mut destination: Option = Here.into(); + let mut destination: Option = Here.into(); - let mut universal_source: Option = - Some(X2(GlobalConsensus(Polkadot), Parachain(1000))); + let mut universal_source: Option = + Some([GlobalConsensus(Polkadot), Parachain(1000)].into()); let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); let channel: u32 = 0; - let fee = MultiAsset { id: Concrete(Here.into()), fun: Fungible(1000) }; - let fees: MultiAssets = vec![fee.clone()].into(); - let assets: MultiAssets = vec![MultiAsset { - id: Concrete(X1(AccountKey20 { network: None, key: token_address }).into()), + let fee = Asset { id: AssetId(Here.into()), fun: Fungible(1000) }; + let fees: Assets = vec![fee.clone()].into(); + let assets: Assets = vec![Asset { + id: AssetId(AccountKey20 { network: None, key: token_address }.into()), fun: Fungible(1000), }] .into(); - let filter: MultiAssetFilter = assets.clone().into(); + let filter: AssetFilter = assets.clone().into(); let mut message: Option> = Some( vec![ @@ -280,7 +281,7 @@ fn exporter_validate_with_max_target_fee_yields_unroutable() { WithdrawAsset(assets), DepositAsset { assets: filter, - beneficiary: X1(AccountKey20 { network: Some(network), key: beneficiary_address }) + beneficiary: AccountKey20 { network: Some(network), key: beneficiary_address } .into(), }, SetTopic([0; 32]), @@ -303,14 +304,14 @@ fn exporter_validate_with_max_target_fee_yields_unroutable() { #[test] fn exporter_validate_with_unparsable_xcm_yields_unroutable() { let network = BridgedNetwork::get(); - let mut destination: Option = Here.into(); + let mut destination: Option = Here.into(); - let mut universal_source: Option = - Some(X2(GlobalConsensus(Polkadot), Parachain(1000))); + let mut universal_source: Option = + Some([GlobalConsensus(Polkadot), Parachain(1000)].into()); let channel: u32 = 0; - let fee = MultiAsset { id: Concrete(Here.into()), fun: Fungible(1000) }; - let fees: MultiAssets = vec![fee.clone()].into(); + let fee = Asset { id: AssetId(Here.into()), fun: Fungible(1000) }; + let fees: Assets = vec![fee.clone()].into(); let mut message: Option> = Some(vec![WithdrawAsset(fees), BuyExecution { fees: fee, weight_limit: Unlimited }].into()); @@ -330,22 +331,22 @@ fn exporter_validate_with_unparsable_xcm_yields_unroutable() { #[test] fn exporter_validate_xcm_success_case_1() { let network = BridgedNetwork::get(); - let mut destination: Option = Here.into(); + let mut destination: Option = Here.into(); - let mut universal_source: Option = - Some(X2(GlobalConsensus(Polkadot), Parachain(1000))); + let mut universal_source: Option = + Some([GlobalConsensus(Polkadot), Parachain(1000)].into()); let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); let channel: u32 = 0; - let assets: MultiAssets = vec![MultiAsset { - id: Concrete(X1(AccountKey20 { network: None, key: token_address }).into()), + let assets: Assets = vec![Asset { + id: AssetId([AccountKey20 { network: None, key: token_address }].into()), fun: Fungible(1000), }] .into(); let fee = assets.clone().get(0).unwrap().clone(); - let filter: MultiAssetFilter = assets.clone().into(); + let filter: AssetFilter = assets.clone().into(); let mut message: Option> = Some( vec![ @@ -354,7 +355,7 @@ fn exporter_validate_xcm_success_case_1() { BuyExecution { fees: fee, weight_limit: Unlimited }, DepositAsset { assets: filter, - beneficiary: X1(AccountKey20 { network: None, key: beneficiary_address }).into(), + beneficiary: AccountKey20 { network: None, key: beneficiary_address }.into(), }, SetTopic([0; 32]), ] @@ -391,12 +392,12 @@ fn xcm_converter_convert_success() { let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); - let assets: MultiAssets = vec![MultiAsset { - id: Concrete(X1(AccountKey20 { network: None, key: token_address }).into()), + let assets: Assets = vec![Asset { + id: AssetId([AccountKey20 { network: None, key: token_address }].into()), fun: Fungible(1000), }] .into(); - let filter: MultiAssetFilter = assets.clone().into(); + let filter: AssetFilter = assets.clone().into(); let message: Xcm<()> = vec![ WithdrawAsset(assets.clone()), @@ -404,7 +405,7 @@ fn xcm_converter_convert_success() { BuyExecution { fees: assets.get(0).unwrap().clone(), weight_limit: Unlimited }, DepositAsset { assets: filter, - beneficiary: X1(AccountKey20 { network: None, key: beneficiary_address }).into(), + beneficiary: AccountKey20 { network: None, key: beneficiary_address }.into(), }, SetTopic([0; 32]), ] @@ -426,18 +427,18 @@ fn xcm_converter_convert_without_buy_execution_yields_success() { let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); - let assets: MultiAssets = vec![MultiAsset { - id: Concrete(X1(AccountKey20 { network: None, key: token_address }).into()), + let assets: Assets = vec![Asset { + id: AssetId([AccountKey20 { network: None, key: token_address }].into()), fun: Fungible(1000), }] .into(); - let filter: MultiAssetFilter = assets.clone().into(); + let filter: AssetFilter = assets.clone().into(); let message: Xcm<()> = vec![ WithdrawAsset(assets.clone()), DepositAsset { assets: filter, - beneficiary: X1(AccountKey20 { network: None, key: beneficiary_address }).into(), + beneficiary: AccountKey20 { network: None, key: beneficiary_address }.into(), }, SetTopic([0; 32]), ] @@ -459,12 +460,12 @@ fn xcm_converter_convert_with_wildcard_all_asset_filter_succeeds() { let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); - let assets: MultiAssets = vec![MultiAsset { - id: Concrete(X1(AccountKey20 { network: None, key: token_address }).into()), + let assets: Assets = vec![Asset { + id: AssetId([AccountKey20 { network: None, key: token_address }].into()), fun: Fungible(1000), }] .into(); - let filter: MultiAssetFilter = Wild(All); + let filter: AssetFilter = Wild(All); let message: Xcm<()> = vec![ WithdrawAsset(assets.clone()), @@ -472,7 +473,7 @@ fn xcm_converter_convert_with_wildcard_all_asset_filter_succeeds() { BuyExecution { fees: assets.get(0).unwrap().clone(), weight_limit: Unlimited }, DepositAsset { assets: filter, - beneficiary: X1(AccountKey20 { network: None, key: beneficiary_address }).into(), + beneficiary: AccountKey20 { network: None, key: beneficiary_address }.into(), }, SetTopic([0; 32]), ] @@ -494,13 +495,12 @@ fn xcm_converter_convert_with_fees_less_than_reserve_yields_success() { let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); - let asset_location = X1(AccountKey20 { network: None, key: token_address }).into(); - let fee_asset = MultiAsset { id: Concrete(asset_location), fun: Fungible(500) }; + let asset_location: Location = [AccountKey20 { network: None, key: token_address }].into(); + let fee_asset = Asset { id: AssetId(asset_location.clone()), fun: Fungible(500) }; - let assets: MultiAssets = - vec![MultiAsset { id: Concrete(asset_location), fun: Fungible(1000) }].into(); + let assets: Assets = vec![Asset { id: AssetId(asset_location), fun: Fungible(1000) }].into(); - let filter: MultiAssetFilter = assets.clone().into(); + let filter: AssetFilter = assets.clone().into(); let message: Xcm<()> = vec![ WithdrawAsset(assets.clone()), @@ -508,7 +508,7 @@ fn xcm_converter_convert_with_fees_less_than_reserve_yields_success() { BuyExecution { fees: fee_asset, weight_limit: Unlimited }, DepositAsset { assets: filter, - beneficiary: X1(AccountKey20 { network: None, key: beneficiary_address }).into(), + beneficiary: AccountKey20 { network: None, key: beneficiary_address }.into(), }, SetTopic([0; 32]), ] @@ -530,19 +530,19 @@ fn xcm_converter_convert_without_set_topic_yields_set_topic_expected() { let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); - let assets: MultiAssets = vec![MultiAsset { - id: Concrete(X1(AccountKey20 { network: None, key: token_address }).into()), + let assets: Assets = vec![Asset { + id: AssetId([AccountKey20 { network: None, key: token_address }].into()), fun: Fungible(1000), }] .into(); - let filter: MultiAssetFilter = assets.clone().into(); + let filter: AssetFilter = assets.clone().into(); let message: Xcm<()> = vec![ WithdrawAsset(assets.clone()), BuyExecution { fees: assets.get(0).unwrap().clone(), weight_limit: Unlimited }, DepositAsset { assets: filter, - beneficiary: X1(AccountKey20 { network: None, key: beneficiary_address }).into(), + beneficiary: AccountKey20 { network: None, key: beneficiary_address }.into(), }, ClearTopic, ] @@ -557,8 +557,8 @@ fn xcm_converter_convert_with_partial_message_yields_unexpected_end_of_xcm() { let network = BridgedNetwork::get(); let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); - let assets: MultiAssets = vec![MultiAsset { - id: Concrete(X1(AccountKey20 { network: None, key: token_address }).into()), + let assets: Assets = vec![Asset { + id: AssetId([AccountKey20 { network: None, key: token_address }].into()), fun: Fungible(1000), }] .into(); @@ -576,16 +576,13 @@ fn xcm_converter_with_different_fee_asset_fails() { let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); - let asset_location = X1(AccountKey20 { network: None, key: token_address }).into(); - let fee_asset = MultiAsset { - id: Concrete(MultiLocation { parents: 0, interior: Here }), - fun: Fungible(1000), - }; + let asset_location = [AccountKey20 { network: None, key: token_address }].into(); + let fee_asset = + Asset { id: AssetId(Location { parents: 0, interior: Here }), fun: Fungible(1000) }; - let assets: MultiAssets = - vec![MultiAsset { id: Concrete(asset_location), fun: Fungible(1000) }].into(); + let assets: Assets = vec![Asset { id: AssetId(asset_location), fun: Fungible(1000) }].into(); - let filter: MultiAssetFilter = assets.clone().into(); + let filter: AssetFilter = assets.clone().into(); let message: Xcm<()> = vec![ WithdrawAsset(assets.clone()), @@ -593,7 +590,7 @@ fn xcm_converter_with_different_fee_asset_fails() { BuyExecution { fees: fee_asset, weight_limit: Unlimited }, DepositAsset { assets: filter, - beneficiary: X1(AccountKey20 { network: None, key: beneficiary_address }).into(), + beneficiary: AccountKey20 { network: None, key: beneficiary_address }.into(), }, SetTopic([0; 32]), ] @@ -610,13 +607,12 @@ fn xcm_converter_with_fees_greater_than_reserve_fails() { let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); - let asset_location = X1(AccountKey20 { network: None, key: token_address }).into(); - let fee_asset = MultiAsset { id: Concrete(asset_location), fun: Fungible(1001) }; + let asset_location: Location = [AccountKey20 { network: None, key: token_address }].into(); + let fee_asset = Asset { id: AssetId(asset_location.clone()), fun: Fungible(1001) }; - let assets: MultiAssets = - vec![MultiAsset { id: Concrete(asset_location), fun: Fungible(1000) }].into(); + let assets: Assets = vec![Asset { id: AssetId(asset_location), fun: Fungible(1000) }].into(); - let filter: MultiAssetFilter = assets.clone().into(); + let filter: AssetFilter = assets.clone().into(); let message: Xcm<()> = vec![ WithdrawAsset(assets.clone()), @@ -624,7 +620,7 @@ fn xcm_converter_with_fees_greater_than_reserve_fails() { BuyExecution { fees: fee_asset, weight_limit: Unlimited }, DepositAsset { assets: filter, - beneficiary: X1(AccountKey20 { network: None, key: beneficiary_address }).into(), + beneficiary: AccountKey20 { network: None, key: beneficiary_address }.into(), }, SetTopic([0; 32]), ] @@ -653,12 +649,12 @@ fn xcm_converter_convert_with_extra_instructions_yields_end_of_xcm_message_expec let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); - let assets: MultiAssets = vec![MultiAsset { - id: Concrete(X1(AccountKey20 { network: None, key: token_address }).into()), + let assets: Assets = vec![Asset { + id: AssetId([AccountKey20 { network: None, key: token_address }].into()), fun: Fungible(1000), }] .into(); - let filter: MultiAssetFilter = assets.clone().into(); + let filter: AssetFilter = assets.clone().into(); let message: Xcm<()> = vec![ WithdrawAsset(assets.clone()), @@ -666,7 +662,7 @@ fn xcm_converter_convert_with_extra_instructions_yields_end_of_xcm_message_expec BuyExecution { fees: assets.get(0).unwrap().clone(), weight_limit: Unlimited }, DepositAsset { assets: filter, - beneficiary: X1(AccountKey20 { network: None, key: beneficiary_address }).into(), + beneficiary: AccountKey20 { network: None, key: beneficiary_address }.into(), }, SetTopic([0; 32]), ClearError, @@ -685,19 +681,19 @@ fn xcm_converter_convert_without_withdraw_asset_yields_withdraw_expected() { let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); - let assets: MultiAssets = vec![MultiAsset { - id: Concrete(X1(AccountKey20 { network: None, key: token_address }).into()), + let assets: Assets = vec![Asset { + id: AssetId([AccountKey20 { network: None, key: token_address }].into()), fun: Fungible(1000), }] .into(); - let filter: MultiAssetFilter = assets.clone().into(); + let filter: AssetFilter = assets.clone().into(); let message: Xcm<()> = vec![ ClearOrigin, BuyExecution { fees: assets.get(0).unwrap().clone(), weight_limit: Unlimited }, DepositAsset { assets: filter, - beneficiary: X1(AccountKey20 { network: None, key: beneficiary_address }).into(), + beneficiary: AccountKey20 { network: None, key: beneficiary_address }.into(), }, SetTopic([0; 32]), ] @@ -714,8 +710,8 @@ fn xcm_converter_convert_without_withdraw_asset_yields_deposit_expected() { let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); - let assets: MultiAssets = vec![MultiAsset { - id: Concrete(X1(AccountKey20 { network: None, key: token_address }).into()), + let assets: Assets = vec![Asset { + id: AssetId(AccountKey20 { network: None, key: token_address }.into()), fun: Fungible(1000), }] .into(); @@ -741,11 +737,11 @@ fn xcm_converter_convert_without_assets_yields_no_reserve_assets() { let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); - let assets: MultiAssets = vec![].into(); - let filter: MultiAssetFilter = assets.clone().into(); + let assets: Assets = vec![].into(); + let filter: AssetFilter = assets.clone().into(); - let fee = MultiAsset { - id: Concrete(X1(AccountKey20 { network: None, key: token_address }).into()), + let fee = Asset { + id: AssetId(AccountKey20 { network: None, key: token_address }.into()), fun: Fungible(1000), }; @@ -755,7 +751,7 @@ fn xcm_converter_convert_without_assets_yields_no_reserve_assets() { BuyExecution { fees: fee, weight_limit: Unlimited }, DepositAsset { assets: filter, - beneficiary: X1(AccountKey20 { network: None, key: beneficiary_address }).into(), + beneficiary: AccountKey20 { network: None, key: beneficiary_address }.into(), }, SetTopic([0; 32]), ] @@ -774,18 +770,18 @@ fn xcm_converter_convert_with_two_assets_yields_too_many_assets() { let token_address_2: [u8; 20] = hex!("1100000000000000000000000000000000000000"); let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); - let assets: MultiAssets = vec![ - MultiAsset { - id: Concrete(X1(AccountKey20 { network: None, key: token_address_1 }).into()), + let assets: Assets = vec![ + Asset { + id: AssetId(AccountKey20 { network: None, key: token_address_1 }.into()), fun: Fungible(1000), }, - MultiAsset { - id: Concrete(X1(AccountKey20 { network: None, key: token_address_2 }).into()), + Asset { + id: AssetId(AccountKey20 { network: None, key: token_address_2 }.into()), fun: Fungible(500), }, ] .into(); - let filter: MultiAssetFilter = assets.clone().into(); + let filter: AssetFilter = assets.clone().into(); let message: Xcm<()> = vec![ WithdrawAsset(assets.clone()), @@ -793,7 +789,7 @@ fn xcm_converter_convert_with_two_assets_yields_too_many_assets() { BuyExecution { fees: assets.get(0).unwrap().clone(), weight_limit: Unlimited }, DepositAsset { assets: filter, - beneficiary: X1(AccountKey20 { network: None, key: beneficiary_address }).into(), + beneficiary: AccountKey20 { network: None, key: beneficiary_address }.into(), }, SetTopic([0; 32]), ] @@ -811,12 +807,12 @@ fn xcm_converter_convert_without_consuming_filter_yields_filter_does_not_consume let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); - let assets: MultiAssets = vec![MultiAsset { - id: Concrete(X1(AccountKey20 { network: None, key: token_address }).into()), + let assets: Assets = vec![Asset { + id: AssetId(AccountKey20 { network: None, key: token_address }.into()), fun: Fungible(1000), }] .into(); - let filter: MultiAssetFilter = Wild(WildMultiAsset::AllCounted(0)); + let filter: AssetFilter = Wild(WildAsset::AllCounted(0)); let message: Xcm<()> = vec![ WithdrawAsset(assets.clone()), @@ -824,7 +820,7 @@ fn xcm_converter_convert_without_consuming_filter_yields_filter_does_not_consume BuyExecution { fees: assets.get(0).unwrap().clone(), weight_limit: Unlimited }, DepositAsset { assets: filter, - beneficiary: X1(AccountKey20 { network: None, key: beneficiary_address }).into(), + beneficiary: AccountKey20 { network: None, key: beneficiary_address }.into(), }, SetTopic([0; 32]), ] @@ -842,12 +838,12 @@ fn xcm_converter_convert_with_zero_amount_asset_yields_zero_asset_transfer() { let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); - let assets: MultiAssets = vec![MultiAsset { - id: Concrete(X1(AccountKey20 { network: None, key: token_address }).into()), + let assets: Assets = vec![Asset { + id: AssetId(AccountKey20 { network: None, key: token_address }.into()), fun: Fungible(0), }] .into(); - let filter: MultiAssetFilter = Wild(WildMultiAsset::AllCounted(1)); + let filter: AssetFilter = Wild(WildAsset::AllCounted(1)); let message: Xcm<()> = vec![ WithdrawAsset(assets.clone()), @@ -855,7 +851,7 @@ fn xcm_converter_convert_with_zero_amount_asset_yields_zero_asset_transfer() { BuyExecution { fees: assets.get(0).unwrap().clone(), weight_limit: Unlimited }, DepositAsset { assets: filter, - beneficiary: X1(AccountKey20 { network: None, key: beneficiary_address }).into(), + beneficiary: AccountKey20 { network: None, key: beneficiary_address }.into(), }, SetTopic([0; 32]), ] @@ -872,12 +868,12 @@ fn xcm_converter_convert_non_ethereum_asset_yields_asset_resolution_failed() { let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); - let assets: MultiAssets = vec![MultiAsset { - id: Concrete(X3(GlobalConsensus(Polkadot), Parachain(1000), GeneralIndex(0)).into()), + let assets: Assets = vec![Asset { + id: AssetId([GlobalConsensus(Polkadot), Parachain(1000), GeneralIndex(0)].into()), fun: Fungible(1000), }] .into(); - let filter: MultiAssetFilter = Wild(WildMultiAsset::AllCounted(1)); + let filter: AssetFilter = Wild(WildAsset::AllCounted(1)); let message: Xcm<()> = vec![ WithdrawAsset(assets.clone()), @@ -885,7 +881,7 @@ fn xcm_converter_convert_non_ethereum_asset_yields_asset_resolution_failed() { BuyExecution { fees: assets.get(0).unwrap().clone(), weight_limit: Unlimited }, DepositAsset { assets: filter, - beneficiary: X1(AccountKey20 { network: None, key: beneficiary_address }).into(), + beneficiary: AccountKey20 { network: None, key: beneficiary_address }.into(), }, SetTopic([0; 32]), ] @@ -903,14 +899,14 @@ fn xcm_converter_convert_non_ethereum_chain_asset_yields_asset_resolution_failed let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); - let assets: MultiAssets = vec![MultiAsset { - id: Concrete( - X1(AccountKey20 { network: Some(Ethereum { chain_id: 2 }), key: token_address }).into(), + let assets: Assets = vec![Asset { + id: AssetId( + AccountKey20 { network: Some(Ethereum { chain_id: 2 }), key: token_address }.into(), ), fun: Fungible(1000), }] .into(); - let filter: MultiAssetFilter = Wild(WildMultiAsset::AllCounted(1)); + let filter: AssetFilter = Wild(WildAsset::AllCounted(1)); let message: Xcm<()> = vec![ WithdrawAsset(assets.clone()), @@ -918,7 +914,7 @@ fn xcm_converter_convert_non_ethereum_chain_asset_yields_asset_resolution_failed BuyExecution { fees: assets.get(0).unwrap().clone(), weight_limit: Unlimited }, DepositAsset { assets: filter, - beneficiary: X1(AccountKey20 { network: None, key: beneficiary_address }).into(), + beneficiary: AccountKey20 { network: None, key: beneficiary_address }.into(), }, SetTopic([0; 32]), ] @@ -936,14 +932,14 @@ fn xcm_converter_convert_non_ethereum_chain_yields_asset_resolution_failed() { let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); - let assets: MultiAssets = vec![MultiAsset { - id: Concrete( - X1(AccountKey20 { network: Some(NonBridgedNetwork::get()), key: token_address }).into(), + let assets: Assets = vec![Asset { + id: AssetId( + [AccountKey20 { network: Some(NonBridgedNetwork::get()), key: token_address }].into(), ), fun: Fungible(1000), }] .into(); - let filter: MultiAssetFilter = Wild(WildMultiAsset::AllCounted(1)); + let filter: AssetFilter = Wild(WildAsset::AllCounted(1)); let message: Xcm<()> = vec![ WithdrawAsset(assets.clone()), @@ -951,7 +947,7 @@ fn xcm_converter_convert_non_ethereum_chain_yields_asset_resolution_failed() { BuyExecution { fees: assets.get(0).unwrap().clone(), weight_limit: Unlimited }, DepositAsset { assets: filter, - beneficiary: X1(AccountKey20 { network: None, key: beneficiary_address }).into(), + beneficiary: AccountKey20 { network: None, key: beneficiary_address }.into(), }, SetTopic([0; 32]), ] @@ -971,23 +967,23 @@ fn xcm_converter_convert_with_non_ethereum_beneficiary_yields_beneficiary_resolu let beneficiary_address: [u8; 32] = hex!("2000000000000000000000000000000000000000000000000000000000000000"); - let assets: MultiAssets = vec![MultiAsset { - id: Concrete(X1(AccountKey20 { network: None, key: token_address }).into()), + let assets: Assets = vec![Asset { + id: AssetId(AccountKey20 { network: None, key: token_address }.into()), fun: Fungible(1000), }] .into(); - let filter: MultiAssetFilter = Wild(WildMultiAsset::AllCounted(1)); + let filter: AssetFilter = Wild(WildAsset::AllCounted(1)); let message: Xcm<()> = vec![ WithdrawAsset(assets.clone()), ClearOrigin, BuyExecution { fees: assets.get(0).unwrap().clone(), weight_limit: Unlimited }, DepositAsset { assets: filter, - beneficiary: X3( + beneficiary: [ GlobalConsensus(Polkadot), Parachain(1000), AccountId32 { network: Some(Polkadot), id: beneficiary_address }, - ) + ] .into(), }, SetTopic([0; 32]), @@ -1007,12 +1003,12 @@ fn xcm_converter_convert_with_non_ethereum_chain_beneficiary_yields_beneficiary_ let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); - let assets: MultiAssets = vec![MultiAsset { - id: Concrete(X1(AccountKey20 { network: None, key: token_address }).into()), + let assets: Assets = vec![Asset { + id: AssetId(AccountKey20 { network: None, key: token_address }.into()), fun: Fungible(1000), }] .into(); - let filter: MultiAssetFilter = Wild(WildMultiAsset::AllCounted(1)); + let filter: AssetFilter = Wild(WildAsset::AllCounted(1)); let message: Xcm<()> = vec![ WithdrawAsset(assets.clone()), @@ -1020,10 +1016,10 @@ fn xcm_converter_convert_with_non_ethereum_chain_beneficiary_yields_beneficiary_ BuyExecution { fees: assets.get(0).unwrap().clone(), weight_limit: Unlimited }, DepositAsset { assets: filter, - beneficiary: X1(AccountKey20 { + beneficiary: AccountKey20 { network: Some(Ethereum { chain_id: 2 }), key: beneficiary_address, - }) + } .into(), }, SetTopic([0; 32]), @@ -1037,14 +1033,13 @@ fn xcm_converter_convert_with_non_ethereum_chain_beneficiary_yields_beneficiary_ #[test] fn test_describe_asset_hub() { - let legacy_location: MultiLocation = - MultiLocation { parents: 0, interior: X1(Parachain(1000)) }; + let legacy_location: Location = Location::new(0, [Parachain(1000)]); let legacy_agent_id = AgentIdOf::convert_location(&legacy_location).unwrap(); assert_eq!( legacy_agent_id, hex!("72456f48efed08af20e5b317abf8648ac66e86bb90a411d9b0b713f7364b75b4").into() ); - let location: MultiLocation = MultiLocation { parents: 1, interior: X1(Parachain(1000)) }; + let location: Location = Location::new(1, [Parachain(1000)]); let agent_id = AgentIdOf::convert_location(&location).unwrap(); assert_eq!( agent_id, @@ -1054,7 +1049,7 @@ fn test_describe_asset_hub() { #[test] fn test_describe_here() { - let location: MultiLocation = MultiLocation { parents: 0, interior: Here }; + let location: Location = Location::new(0, []); let agent_id = AgentIdOf::convert_location(&location).unwrap(); assert_eq!( agent_id, diff --git a/bridges/snowbridge/parachain/runtime/runtime-common/src/lib.rs b/bridges/snowbridge/parachain/runtime/runtime-common/src/lib.rs index b7f54d262bb..1a9b704f356 100644 --- a/bridges/snowbridge/parachain/runtime/runtime-common/src/lib.rs +++ b/bridges/snowbridge/parachain/runtime/runtime-common/src/lib.rs @@ -46,43 +46,38 @@ impl where Balance: BaseArithmetic + Unsigned + Copy + From + Into, AccountId: Clone + Into<[u8; 32]> + From<[u8; 32]>, - FeeAssetLocation: Get, + FeeAssetLocation: Get, EthereumNetwork: Get, AssetTransactor: TransactAsset, FeeProvider: SendMessageFeeProvider, { - fn handle_fee( - fees: MultiAssets, - context: Option<&XcmContext>, - reason: FeeReason, - ) -> MultiAssets { + fn handle_fee(fees: Assets, context: Option<&XcmContext>, reason: FeeReason) -> Assets { let token_location = FeeAssetLocation::get(); // Check the reason to see if this export is for snowbridge. if !matches!( reason, - FeeReason::Export { network: bridged_network, destination } - if bridged_network == EthereumNetwork::get() && destination == Here + FeeReason::Export { network: bridged_network, ref destination } + if bridged_network == EthereumNetwork::get() && destination == &Here ) { return fees } // Get the parachain sovereign from the `context`. - let para_sovereign = if let Some(XcmContext { - origin: Some(MultiLocation { parents: 1, interior }), - .. - }) = context - { - if let Some(Parachain(sibling_para_id)) = interior.first() { - let account: AccountId = - sibling_sovereign_account_raw((*sibling_para_id).into()).into(); - account + let para_sovereign = + if let Some(XcmContext { origin: Some(Location { parents: 1, interior }), .. }) = + context + { + if let Some(Parachain(sibling_para_id)) = interior.first() { + let account: AccountId = + sibling_sovereign_account_raw((*sibling_para_id).into()).into(); + account + } else { + return fees + } } else { return fees - } - } else { - return fees - }; + }; // Get the total fee offered by export message. let maybe_total_supplied_fee: Option<(usize, Balance)> = fees @@ -90,8 +85,8 @@ impl (0u128).into() { // Refund remote component of fee to physical origin deposit_or_burn_fee::( - MultiAsset { id: Concrete(token_location), fun: Fungible(remote_fee.into()) } + Asset { id: AssetId(token_location.clone()), fun: Fungible(remote_fee.into()) } .into(), context, para_sovereign, @@ -112,8 +107,8 @@ impl::execute_xcm( + let mut hash = xcm.using_encoded(sp_io::hashing::blake2_256); + XcmExecutor::::prepare_and_execute( assethub_parachain_location, xcm, - hash, + &mut hash, RuntimeHelper::::xcm_max_weight(XcmReceivedFrom::Sibling), + Weight::zero(), ) } @@ -176,7 +175,7 @@ pub fn send_unpaid_transfer_token_message( XcmConfig: xcm_executor::Config, ValidatorIdOf: From>, { - let assethub_parachain_location = MultiLocation::new(1, Parachain(assethub_parachain_id)); + let assethub_parachain_location = Location::new(1, Parachain(assethub_parachain_id)); ExtBuilder::::default() .with_collators(collator_session_key.collators()) @@ -194,28 +193,25 @@ pub fn send_unpaid_transfer_token_message( ) .unwrap(); - let asset = MultiAsset { - id: Concrete(MultiLocation { - parents: 0, - interior: X1(AccountKey20 { network: None, key: weth_contract_address.into() }), - }), + let asset = Asset { + id: AssetId(Location::new( + 0, + [AccountKey20 { network: None, key: weth_contract_address.into() }], + )), fun: Fungible(1000000000), }; let assets = vec![asset.clone()]; let inner_xcm = Xcm(vec![ - WithdrawAsset(MultiAssets::from(assets.clone())), + WithdrawAsset(Assets::from(assets.clone())), ClearOrigin, BuyExecution { fees: asset, weight_limit: Unlimited }, DepositAsset { assets: Wild(AllCounted(1)), - beneficiary: MultiLocation { - parents: 0, - interior: X1(AccountKey20 { - network: None, - key: destination_contract.into(), - }), - }, + beneficiary: Location::new( + 0, + [AccountKey20 { network: None, key: destination_contract.into() }], + ), }, SetTopic([0; 32]), ]); @@ -231,12 +227,13 @@ pub fn send_unpaid_transfer_token_message( ]); // execute XCM - let hash = xcm.using_encoded(sp_io::hashing::blake2_256); - let outcome = XcmExecutor::::execute_xcm( + let mut hash = xcm.using_encoded(sp_io::hashing::blake2_256); + let outcome = XcmExecutor::::prepare_and_execute( assethub_parachain_location, xcm, - hash, + &mut hash, RuntimeHelper::::xcm_max_weight(XcmReceivedFrom::Sibling), + Weight::zero(), ); // check error is barrier assert_err!(outcome.ensure_complete(), Barrier); diff --git a/cumulus/pallets/xcmp-queue/src/lib.rs b/cumulus/pallets/xcmp-queue/src/lib.rs index 71cd21d45f7..5b900769622 100644 --- a/cumulus/pallets/xcmp-queue/src/lib.rs +++ b/cumulus/pallets/xcmp-queue/src/lib.rs @@ -135,7 +135,7 @@ pub mod pallet { /// The origin that is allowed to resume or suspend the XCMP queue. type ControllerOrigin: EnsureOrigin; - /// The conversion function used to attempt to convert an XCM `MultiLocation` origin to a + /// The conversion function used to attempt to convert an XCM `Location` origin to a /// superuser origin. type ControllerOriginConverter: ConvertOrigin; @@ -903,14 +903,14 @@ impl SendXcm for Pallet { type Ticket = (ParaId, VersionedXcm<()>); fn validate( - dest: &mut Option, + dest: &mut Option, msg: &mut Option>, ) -> SendResult<(ParaId, VersionedXcm<()>)> { let d = dest.take().ok_or(SendError::MissingArgument)?; - match &d { + match d.unpack() { // An HRMP message for a sibling parachain. - MultiLocation { parents: 1, interior: X1(Parachain(id)) } => { + (1, [Parachain(id)]) => { let xcm = msg.take().ok_or(SendError::MissingArgument)?; let id = ParaId::from(*id); let price = T::PriceForSiblingDelivery::price_for_delivery(id, &xcm); diff --git a/cumulus/pallets/xcmp-queue/src/mock.rs b/cumulus/pallets/xcmp-queue/src/mock.rs index a41be6fa9ca..031c0721753 100644 --- a/cumulus/pallets/xcmp-queue/src/mock.rs +++ b/cumulus/pallets/xcmp-queue/src/mock.rs @@ -124,8 +124,8 @@ impl cumulus_pallet_parachain_system::Config for Test { } parameter_types! { - pub const RelayChain: MultiLocation = MultiLocation::parent(); - pub UniversalLocation: InteriorMultiLocation = X1(Parachain(1u32)); + pub const RelayChain: Location = Location::parent(); + pub UniversalLocation: InteriorLocation = [Parachain(1u32)].into(); pub UnitWeightCost: Weight = Weight::from_parts(1_000_000, 1024); pub const MaxInstructions: u32 = 100; pub const MaxAssetsIntoHolding: u32 = 64; @@ -138,7 +138,7 @@ pub type LocalAssetTransactor = CurrencyAdapter< Balances, // Use this currency when it is a fungible asset matching the given location or name: IsConcrete, - // Do a simple punn to convert an AccountId32 MultiLocation into a native chain account ID: + // Do a simple punn to convert an AccountId32 Location into a native chain account ID: LocationToAccountId, // Our chain's account ID type (we can't get away without mentioning it explicitly): AccountId, @@ -187,17 +187,14 @@ impl ConvertOrigin for SystemParachainAsSuperuser { fn convert_origin( - origin: impl Into, + origin: impl Into, kind: OriginKind, - ) -> Result { + ) -> Result { let origin = origin.into(); if kind == OriginKind::Superuser && matches!( - origin, - MultiLocation { - parents: 1, - interior: X1(Parachain(id)), - } if ParaId::from(id).is_system(), + origin.unpack(), + (1, [Parachain(id)]) if ParaId::from(*id).is_system(), ) { Ok(RuntimeOrigin::root()) } else { @@ -256,7 +253,7 @@ impl> EnqueueMessage for EnqueueToLocalStorage parameter_types! { /// The asset ID for the asset that we use to pay for message delivery fees. - pub FeeAssetId: AssetId = Concrete(RelayChain::get()); + pub FeeAssetId: AssetId = AssetId(RelayChain::get()); /// The base fee for the message delivery fees. pub const BaseDeliveryFee: Balance = 300_000_000; /// The fee per byte diff --git a/cumulus/pallets/xcmp-queue/src/tests.rs b/cumulus/pallets/xcmp-queue/src/tests.rs index 8e8f6e852e1..0b41095828f 100644 --- a/cumulus/pallets/xcmp-queue/src/tests.rs +++ b/cumulus/pallets/xcmp-queue/src/tests.rs @@ -333,11 +333,11 @@ struct OkFixedXcmHashWithAssertingRequiredInputsSender; impl OkFixedXcmHashWithAssertingRequiredInputsSender { const FIXED_XCM_HASH: [u8; 32] = [9; 32]; - fn fixed_delivery_asset() -> MultiAssets { - MultiAssets::new() + fn fixed_delivery_asset() -> Assets { + Assets::new() } - fn expected_delivery_result() -> Result<(XcmHash, MultiAssets), SendError> { + fn expected_delivery_result() -> Result<(XcmHash, Assets), SendError> { Ok((Self::FIXED_XCM_HASH, Self::fixed_delivery_asset())) } } @@ -345,7 +345,7 @@ impl SendXcm for OkFixedXcmHashWithAssertingRequiredInputsSender { type Ticket = (); fn validate( - destination: &mut Option, + destination: &mut Option, message: &mut Option>, ) -> SendResult { assert!(destination.is_some()); @@ -392,8 +392,8 @@ fn xcmp_queue_consumes_dest_and_msg_on_ok_validate() { let message = Xcm(vec![Trap(5)]); // XcmpQueue - check dest/msg is valid - let dest = (Parent, X1(Parachain(5555))); - let mut dest_wrapper = Some(dest.into()); + let dest: Location = (Parent, Parachain(5555)).into(); + let mut dest_wrapper = Some(dest.clone()); let mut msg_wrapper = Some(message.clone()); new_test_ext().execute_with(|| { @@ -416,7 +416,7 @@ fn xcmp_queue_consumes_dest_and_msg_on_ok_validate() { #[test] fn xcmp_queue_validate_nested_xcm_works() { - let dest = (Parent, X1(Parachain(5555))); + let dest = (Parent, Parachain(5555)); // Message that is not too deeply nested: let mut good = Xcm(vec![ClearOrigin]); for _ in 0..MAX_XCM_DECODE_DEPTH - 1 { @@ -441,7 +441,7 @@ fn xcmp_queue_validate_nested_xcm_works() { #[test] fn send_xcm_nested_works() { - let dest = (Parent, X1(Parachain(HRMP_PARA_ID))); + let dest = (Parent, Parachain(HRMP_PARA_ID)); // Message that is not too deeply nested: let mut good = Xcm(vec![ClearOrigin]); for _ in 0..MAX_XCM_DECODE_DEPTH - 1 { @@ -455,7 +455,7 @@ fn send_xcm_nested_works() { XcmpQueue::take_outbound_messages(usize::MAX), vec![( HRMP_PARA_ID.into(), - (XcmpMessageFormat::ConcatenatedVersionedXcm, VersionedXcm::V3(good.clone())) + (XcmpMessageFormat::ConcatenatedVersionedXcm, VersionedXcm::V4(good.clone())) .encode(), )] ); @@ -474,7 +474,7 @@ fn hrmp_signals_are_prioritized() { let message = Xcm(vec![Trap(5)]); let sibling_para_id = ParaId::from(12345); - let dest = (Parent, X1(Parachain(sibling_para_id.into()))); + let dest = (Parent, Parachain(sibling_para_id.into())); let mut dest_wrapper = Some(dest.into()); let mut msg_wrapper = Some(message.clone()); @@ -511,7 +511,7 @@ fn hrmp_signals_are_prioritized() { // Without a signal we get the messages in order: let mut expected_msg = XcmpMessageFormat::ConcatenatedVersionedXcm.encode(); for _ in 0..31 { - expected_msg.extend(VersionedXcm::V3(message.clone()).encode()); + expected_msg.extend(VersionedXcm::V4(message.clone()).encode()); } hypothetically!({ @@ -590,7 +590,7 @@ fn take_first_concatenated_xcm_good_recursion_depth_works() { for _ in 0..MAX_XCM_DECODE_DEPTH - 1 { good = Xcm(vec![SetAppendix(good)]); } - let good = VersionedXcm::V3(good); + let good = VersionedXcm::V4(good); let page = good.encode(); assert_ok!(XcmpQueue::take_first_concatenated_xcm(&mut &page[..], &mut WeightMeter::new())); @@ -603,7 +603,7 @@ fn take_first_concatenated_xcm_good_bad_depth_errors() { for _ in 0..MAX_XCM_DECODE_DEPTH { bad = Xcm(vec![SetAppendix(bad)]); } - let bad = VersionedXcm::V3(bad); + let bad = VersionedXcm::V4(bad); let page = bad.encode(); assert_err!( @@ -699,12 +699,12 @@ fn lazy_migration_noop_when_out_of_weight() { fn xcmp_queue_send_xcm_works() { new_test_ext().execute_with(|| { let sibling_para_id = ParaId::from(12345); - let dest = (Parent, X1(Parachain(sibling_para_id.into()))).into(); + let dest: Location = (Parent, Parachain(sibling_para_id.into())).into(); let msg = Xcm(vec![ClearOrigin]); // try to send without opened HRMP channel to the sibling_para_id assert_eq!( - send_xcm::(dest, msg.clone()), + send_xcm::(dest.clone(), msg.clone()), Err(SendError::Transport("NoChannel")), ); @@ -728,7 +728,7 @@ fn xcmp_queue_send_xcm_works() { fn xcmp_queue_send_too_big_xcm_fails() { new_test_ext().execute_with(|| { let sibling_para_id = ParaId::from(12345); - let dest = (Parent, X1(Parachain(sibling_para_id.into()))).into(); + let dest = (Parent, Parachain(sibling_para_id.into())).into(); let max_message_size = 100_u32; @@ -774,7 +774,7 @@ fn verify_fee_factor_increase_and_decrease() { use sp_runtime::FixedU128; let sibling_para_id = ParaId::from(12345); - let destination = (Parent, Parachain(sibling_para_id.into())).into(); + let destination: Location = (Parent, Parachain(sibling_para_id.into())).into(); let xcm = Xcm(vec![ClearOrigin; 100]); let versioned_xcm = VersionedXcm::from(xcm.clone()); let mut xcmp_message = XcmpMessageFormat::ConcatenatedVersionedXcm.encode(); @@ -799,15 +799,15 @@ fn verify_fee_factor_increase_and_decrease() { // Fee factor is only increased in `send_fragment`, which is called by `send_xcm`. // When queue is not congested, fee factor doesn't change. - assert_ok!(send_xcm::(destination, xcm.clone())); // Size 104 - assert_ok!(send_xcm::(destination, xcm.clone())); // Size 208 - assert_ok!(send_xcm::(destination, xcm.clone())); // Size 312 - assert_ok!(send_xcm::(destination, xcm.clone())); // Size 416 + assert_ok!(send_xcm::(destination.clone(), xcm.clone())); // Size 104 + assert_ok!(send_xcm::(destination.clone(), xcm.clone())); // Size 208 + assert_ok!(send_xcm::(destination.clone(), xcm.clone())); // Size 312 + assert_ok!(send_xcm::(destination.clone(), xcm.clone())); // Size 416 assert_eq!(DeliveryFeeFactor::::get(sibling_para_id), initial); // Sending the message right now is cheap - let (_, delivery_fees) = - validate_send::(destination, xcm.clone()).expect("message can be sent; qed"); + let (_, delivery_fees) = validate_send::(destination.clone(), xcm.clone()) + .expect("message can be sent; qed"); let Fungible(delivery_fee_amount) = delivery_fees.inner()[0].fun else { unreachable!("asset is fungible; qed"); }; @@ -817,18 +817,18 @@ fn verify_fee_factor_increase_and_decrease() { // When we get to half of `max_total_size`, because `THRESHOLD_FACTOR` is 2, // then the fee factor starts to increase. - assert_ok!(send_xcm::(destination, xcm.clone())); // Size 520 + assert_ok!(send_xcm::(destination.clone(), xcm.clone())); // Size 520 assert_eq!(DeliveryFeeFactor::::get(sibling_para_id), FixedU128::from_float(1.05)); for _ in 0..12 { // We finish at size 929 - assert_ok!(send_xcm::(destination, smaller_xcm.clone())); + assert_ok!(send_xcm::(destination.clone(), smaller_xcm.clone())); } assert!(DeliveryFeeFactor::::get(sibling_para_id) > FixedU128::from_float(1.88)); // Sending the message right now is expensive - let (_, delivery_fees) = - validate_send::(destination, xcm.clone()).expect("message can be sent; qed"); + let (_, delivery_fees) = validate_send::(destination.clone(), xcm.clone()) + .expect("message can be sent; qed"); let Fungible(delivery_fee_amount) = delivery_fees.inner()[0].fun else { unreachable!("asset is fungible; qed"); }; diff --git a/cumulus/parachain-template/runtime/src/xcm_config.rs b/cumulus/parachain-template/runtime/src/xcm_config.rs index 7d1a748819c..d407292d0bd 100644 --- a/cumulus/parachain-template/runtime/src/xcm_config.rs +++ b/cumulus/parachain-template/runtime/src/xcm_config.rs @@ -3,8 +3,8 @@ use super::{ Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, WeightToFee, XcmpQueue, }; use frame_support::{ - match_types, parameter_types, - traits::{ConstU32, Everything, Nothing}, + parameter_types, + traits::{ConstU32, Contains, Everything, Nothing}, weights::Weight, }; use frame_system::EnsureRoot; @@ -25,13 +25,13 @@ use xcm_builder::{ use xcm_executor::XcmExecutor; parameter_types! { - pub const RelayLocation: MultiLocation = MultiLocation::parent(); + pub const RelayLocation: Location = Location::parent(); pub const RelayNetwork: Option = None; pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); - pub UniversalLocation: InteriorMultiLocation = Parachain(ParachainInfo::parachain_id().into()).into(); + pub UniversalLocation: InteriorLocation = Parachain(ParachainInfo::parachain_id().into()).into(); } -/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used +/// Type for specifying how a `Location` can be converted into an `AccountId`. This is used /// when determining ownership of accounts for asset transacting and when attempting to use XCM /// `Transact` in order to determine the dispatch Origin. pub type LocationToAccountId = ( @@ -50,7 +50,7 @@ pub type LocalAssetTransactor = CurrencyAdapter< Balances, // Use this currency when it is a fungible asset matching the given location or name: IsConcrete, - // Do a simple punn to convert an AccountId32 MultiLocation into a native chain account ID: + // Do a simple punn to convert an AccountId32 Location into a native chain account ID: LocationToAccountId, // Our chain's account ID type (we can't get away without mentioning it explicitly): AccountId, @@ -86,11 +86,11 @@ parameter_types! { pub const MaxAssetsIntoHolding: u32 = 64; } -match_types! { - pub type ParentOrParentsExecutivePlurality: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(Plurality { id: BodyId::Executive, .. }) } - }; +pub struct ParentOrParentsExecutivePlurality; +impl Contains for ParentOrParentsExecutivePlurality { + fn contains(location: &Location) -> bool { + matches!(location.unpack(), (1, []) | (1, [Plurality { id: BodyId::Executive, .. }])) + } } pub type Barrier = TrailingSetTopicAsId< diff --git a/cumulus/parachains/common/src/impls.rs b/cumulus/parachains/common/src/impls.rs index beb655134ad..69da325dd4f 100644 --- a/cumulus/parachains/common/src/impls.rs +++ b/cumulus/parachains/common/src/impls.rs @@ -24,8 +24,8 @@ use pallet_asset_tx_payment::HandleCredit; use sp_runtime::traits::Zero; use sp_std::{marker::PhantomData, prelude::*}; use xcm::latest::{ - AssetId, Fungibility, Fungibility::Fungible, Junction, Junctions::Here, MultiAsset, - MultiLocation, Parent, WeightLimit, + Asset, AssetId, Fungibility, Fungibility::Fungible, Junction, Junctions::Here, Location, + Parent, WeightLimit, }; use xcm_executor::traits::ConvertLocation; @@ -113,11 +113,11 @@ where /// Asset filter that allows all assets from a certain location. pub struct AssetsFrom(PhantomData); -impl> ContainsPair for AssetsFrom { - fn contains(asset: &MultiAsset, origin: &MultiLocation) -> bool { +impl> ContainsPair for AssetsFrom { + fn contains(asset: &Asset, origin: &Location) -> bool { let loc = T::get(); &loc == origin && - matches!(asset, MultiAsset { id: AssetId::Concrete(asset_loc), fun: Fungible(_a) } + matches!(asset, Asset { id: AssetId(asset_loc), fun: Fungible(_a) } if asset_loc.match_and_split(&loc).is_some()) } } @@ -148,7 +148,7 @@ where Err(amount) => amount, }; let imbalance = amount.peek(); - let root_location: MultiLocation = Here.into(); + let root_location: Location = Here.into(); let root_account: AccountIdOf = match AccountIdConverter::convert_location(&root_location) { Some(a) => a, @@ -329,13 +329,13 @@ mod tests { #[test] fn assets_from_filters_correctly() { parameter_types! { - pub SomeSiblingParachain: MultiLocation = MultiLocation::new(1, X1(Parachain(1234))); + pub SomeSiblingParachain: Location = (Parent, Parachain(1234)).into(); } let asset_location = SomeSiblingParachain::get() .pushed_with_interior(GeneralIndex(42)) - .expect("multilocation will only have 2 junctions; qed"); - let asset = MultiAsset { id: Concrete(asset_location), fun: 1_000_000u128.into() }; + .expect("location will only have 2 junctions; qed"); + let asset = Asset { id: AssetId(asset_location), fun: 1_000_000u128.into() }; assert!( AssetsFrom::::contains(&asset, &SomeSiblingParachain::get()), "AssetsFrom should allow assets from any of its interior locations" diff --git a/cumulus/parachains/common/src/xcm_config.rs b/cumulus/parachains/common/src/xcm_config.rs index 7a63e720b07..15b090923d5 100644 --- a/cumulus/parachains/common/src/xcm_config.rs +++ b/cumulus/parachains/common/src/xcm_config.rs @@ -66,37 +66,36 @@ where } } -/// Accepts an asset if it is a native asset from a particular `MultiLocation`. -pub struct ConcreteNativeAssetFrom(PhantomData); -impl> ContainsPair - for ConcreteNativeAssetFrom +/// Accepts an asset if it is a native asset from a particular `Location`. +pub struct ConcreteNativeAssetFrom(PhantomData); +impl> ContainsPair + for ConcreteNativeAssetFrom { - fn contains(asset: &MultiAsset, origin: &MultiLocation) -> bool { + fn contains(asset: &Asset, origin: &Location) -> bool { log::trace!(target: "xcm::filter_asset_location", "ConcreteNativeAsset asset: {:?}, origin: {:?}, location: {:?}", - asset, origin, Location::get()); - matches!(asset.id, Concrete(ref id) if id == origin && origin == &Location::get()) + asset, origin, LocationValue::get()); + asset.id.0 == *origin && origin == &LocationValue::get() } } pub struct RelayOrOtherSystemParachains< - SystemParachainMatcher: Contains, + SystemParachainMatcher: Contains, Runtime: parachain_info::Config, > { _runtime: PhantomData<(SystemParachainMatcher, Runtime)>, } -impl, Runtime: parachain_info::Config> - Contains for RelayOrOtherSystemParachains +impl, Runtime: parachain_info::Config> Contains + for RelayOrOtherSystemParachains { - fn contains(l: &MultiLocation) -> bool { + fn contains(l: &Location) -> bool { let self_para_id: u32 = parachain_info::Pallet::::get().into(); - if let MultiLocation { parents: 0, interior: X1(Parachain(para_id)) } = l { + if let (0, [Parachain(para_id)]) = l.unpack() { if *para_id == self_para_id { return false } } - matches!(l, MultiLocation { parents: 1, interior: Here }) || - SystemParachainMatcher::contains(l) + matches!(l.unpack(), (1, [])) || SystemParachainMatcher::contains(l) } } @@ -105,14 +104,12 @@ impl, Runtime: parachain_info::C /// This structure can only be used at a parachain level. In the Relay Chain, please use /// the `xcm_builder::IsChildSystemParachain` matcher. pub struct AllSiblingSystemParachains; - -impl Contains for AllSiblingSystemParachains { - fn contains(l: &MultiLocation) -> bool { +impl Contains for AllSiblingSystemParachains { + fn contains(l: &Location) -> bool { log::trace!(target: "xcm::contains", "AllSiblingSystemParachains location: {:?}", l); - match *l { + match l.unpack() { // System parachain - MultiLocation { parents: 1, interior: X1(Parachain(id)) } => - ParaId::from(id).is_system(), + (1, [Parachain(id)]) => ParaId::from(*id).is_system(), // Everything else _ => false, } @@ -121,21 +118,20 @@ impl Contains for AllSiblingSystemParachains { /// Accepts an asset if it is a concrete asset from the system (Relay Chain or system parachain). pub struct ConcreteAssetFromSystem(PhantomData); -impl> ContainsPair +impl> ContainsPair for ConcreteAssetFromSystem { - fn contains(asset: &MultiAsset, origin: &MultiLocation) -> bool { + fn contains(asset: &Asset, origin: &Location) -> bool { log::trace!(target: "xcm::contains", "ConcreteAssetFromSystem asset: {:?}, origin: {:?}", asset, origin); - let is_system = match origin { + let is_system = match origin.unpack() { // The Relay Chain - MultiLocation { parents: 1, interior: Here } => true, + (1, []) => true, // System parachain - MultiLocation { parents: 1, interior: X1(Parachain(id)) } => - ParaId::from(*id).is_system(), + (1, [Parachain(id)]) => ParaId::from(*id).is_system(), // Others _ => false, }; - matches!(asset.id, Concrete(id) if id == AssetLocation::get()) && is_system + asset.id.0 == AssetLocation::get() && is_system } } @@ -144,13 +140,9 @@ impl> ContainsPair /// This type should only be used within the context of a parachain, since it does not verify that /// the parent is indeed a Relay Chain. pub struct ParentRelayOrSiblingParachains; -impl Contains for ParentRelayOrSiblingParachains { - fn contains(location: &MultiLocation) -> bool { - matches!( - location, - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(Parachain(_)) } - ) +impl Contains for ParentRelayOrSiblingParachains { + fn contains(location: &Location) -> bool { + matches!(location.unpack(), (1, []) | (1, [Parachain(_)])) } } @@ -159,20 +151,20 @@ mod tests { use frame_support::{parameter_types, traits::Contains}; use super::{ - AllSiblingSystemParachains, ConcreteAssetFromSystem, ContainsPair, GeneralIndex, Here, - MultiAsset, MultiLocation, PalletInstance, Parachain, Parent, + AllSiblingSystemParachains, Asset, ConcreteAssetFromSystem, ContainsPair, GeneralIndex, + Here, Location, PalletInstance, Parachain, Parent, }; use polkadot_primitives::LOWEST_PUBLIC_ID; use xcm::latest::prelude::*; parameter_types! { - pub const RelayLocation: MultiLocation = MultiLocation::parent(); + pub const RelayLocation: Location = Location::parent(); } #[test] fn concrete_asset_from_relay_works() { - let expected_asset: MultiAsset = (Parent, 1000000).into(); - let expected_origin: MultiLocation = (Parent, Here).into(); + let expected_asset: Asset = (Parent, 1000000).into(); + let expected_origin: Location = (Parent, Here).into(); assert!(>::contains( &expected_asset, @@ -182,12 +174,12 @@ mod tests { #[test] fn concrete_asset_from_sibling_system_para_fails_for_wrong_asset() { - let unexpected_assets: Vec = vec![ + let unexpected_assets: Vec = vec![ (Here, 1000000).into(), ((PalletInstance(50), GeneralIndex(1)), 1000000).into(), ((Parent, Parachain(1000), PalletInstance(50), GeneralIndex(1)), 1000000).into(), ]; - let expected_origin: MultiLocation = (Parent, Parachain(1000)).into(); + let expected_origin: Location = (Parent, Parachain(1000)).into(); unexpected_assets.iter().for_each(|asset| { assert!(!>::contains(asset, &expected_origin)); @@ -206,10 +198,10 @@ mod tests { (2001, false), // Not a System Parachain ]; - let expected_asset: MultiAsset = (Parent, 1000000).into(); + let expected_asset: Asset = (Parent, 1000000).into(); for (para_id, expected_result) in test_data { - let origin: MultiLocation = (Parent, Parachain(para_id)).into(); + let origin: Location = (Parent, Parachain(para_id)).into(); assert_eq!( expected_result, >::contains(&expected_asset, &origin) @@ -220,15 +212,15 @@ mod tests { #[test] fn all_sibling_system_parachains_works() { // system parachain - assert!(AllSiblingSystemParachains::contains(&MultiLocation::new(1, X1(Parachain(1))))); + assert!(AllSiblingSystemParachains::contains(&Location::new(1, [Parachain(1)]))); // non-system parachain - assert!(!AllSiblingSystemParachains::contains(&MultiLocation::new( + assert!(!AllSiblingSystemParachains::contains(&Location::new( 1, - X1(Parachain(LOWEST_PUBLIC_ID.into())) + [Parachain(LOWEST_PUBLIC_ID.into())] ))); // when used at relay chain - assert!(!AllSiblingSystemParachains::contains(&MultiLocation::new(0, X1(Parachain(1))))); + assert!(!AllSiblingSystemParachains::contains(&Location::new(0, [Parachain(1)]))); // when used with non-parachain - assert!(!AllSiblingSystemParachains::contains(&MultiLocation::new(1, X1(OnlyChild)))); + assert!(!AllSiblingSystemParachains::contains(&Location::new(1, [OnlyChild]))); } } diff --git a/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/src/lib.rs b/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/src/lib.rs index 244a846bbc2..8f586a46a75 100644 --- a/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/chains/parachains/testing/penpal/src/lib.rs @@ -15,7 +15,9 @@ mod genesis; pub use genesis::{genesis, ED, PARA_ID_A, PARA_ID_B}; -pub use penpal_runtime::xcm_config::{LocalTeleportableToAssetHub, XcmConfig}; +pub use penpal_runtime::xcm_config::{ + LocalTeleportableToAssetHub, LocalTeleportableToAssetHubV3, XcmConfig, +}; // Substrate use frame_support::traits::OnInitialize; diff --git a/cumulus/parachains/integration-tests/emulated/common/src/impls.rs b/cumulus/parachains/integration-tests/emulated/common/src/impls.rs index aa3ec214f8c..4bbb4701e43 100644 --- a/cumulus/parachains/integration-tests/emulated/common/src/impls.rs +++ b/cumulus/parachains/integration-tests/emulated/common/src/impls.rs @@ -38,8 +38,9 @@ pub use polkadot_runtime_parachains::{ inclusion::{AggregateMessageOrigin, UmpQueueId}, }; pub use xcm::{ - prelude::{MultiLocation, OriginKind, Outcome, VersionedXcm, XcmVersion}, - v3::Error, + prelude::{Location, OriginKind, Outcome, VersionedXcm, XcmVersion}, + v3, + v4::Error as XcmError, DoubleEncoded, }; @@ -209,7 +210,7 @@ macro_rules! impl_assert_events_helpers_for_relay_chain { Self, vec![ [<$chain RuntimeEvent>]::::XcmPallet( - $crate::impls::pallet_xcm::Event::Attempted { outcome: $crate::impls::Outcome::Complete(weight) } + $crate::impls::pallet_xcm::Event::Attempted { outcome: $crate::impls::Outcome::Complete { used: weight } } ) => { weight: $crate::impls::weight_within_threshold( ($crate::impls::REF_TIME_THRESHOLD, $crate::impls::PROOF_SIZE_THRESHOLD), @@ -224,21 +225,21 @@ macro_rules! impl_assert_events_helpers_for_relay_chain { /// Asserts a dispatchable is incompletely executed and XCM sent pub fn assert_xcm_pallet_attempted_incomplete( expected_weight: Option<$crate::impls::Weight>, - expected_error: Option<$crate::impls::Error>, + expected_error: Option<$crate::impls::XcmError>, ) { $crate::impls::assert_expected_events!( Self, vec![ // Dispatchable is properly executed and XCM message sent [<$chain RuntimeEvent>]::::XcmPallet( - $crate::impls::pallet_xcm::Event::Attempted { outcome: $crate::impls::Outcome::Incomplete(weight, error) } + $crate::impls::pallet_xcm::Event::Attempted { outcome: $crate::impls::Outcome::Incomplete { used: weight, error } } ) => { weight: $crate::impls::weight_within_threshold( ($crate::impls::REF_TIME_THRESHOLD, $crate::impls::PROOF_SIZE_THRESHOLD), expected_weight.unwrap_or(*weight), *weight ), - error: *error == expected_error.unwrap_or(*error), + error: *error == expected_error.unwrap_or((*error).into()).into(), }, ] ); @@ -365,7 +366,7 @@ macro_rules! impl_send_transact_helpers_for_relay_chain { ::execute_with(|| { let root_origin = ::RuntimeOrigin::root(); - let destination: $crate::impls::MultiLocation = ::child_location_of(recipient); + let destination: $crate::impls::Location = ::child_location_of(recipient); let xcm = $crate::impls::xcm_transact_unpaid_execution(call, $crate::impls::OriginKind::Superuser); // Send XCM `Transact` @@ -416,13 +417,13 @@ macro_rules! impl_accounts_helpers_for_parachain { network_id: $crate::impls::NetworkId, para_id: $crate::impls::ParaId, ) -> $crate::impls::AccountId { - let remote_location = $crate::impls::MultiLocation { - parents: 2, - interior: $crate::impls::Junctions::X2( + let remote_location = $crate::impls::Location::new( + 2, + [ $crate::impls::Junction::GlobalConsensus(network_id), $crate::impls::Junction::Parachain(para_id.into()), - ), - }; + ], + ); ::execute_with(|| { Self::sovereign_account_id_of(remote_location) }) @@ -445,7 +446,7 @@ macro_rules! impl_assert_events_helpers_for_parachain { Self, vec![ [<$chain RuntimeEvent>]::::PolkadotXcm( - $crate::impls::pallet_xcm::Event::Attempted { outcome: $crate::impls::Outcome::Complete(weight) } + $crate::impls::pallet_xcm::Event::Attempted { outcome: $crate::impls::Outcome::Complete { used: weight } } ) => { weight: $crate::impls::weight_within_threshold( ($crate::impls::REF_TIME_THRESHOLD, $crate::impls::PROOF_SIZE_THRESHOLD), @@ -460,36 +461,36 @@ macro_rules! impl_assert_events_helpers_for_parachain { /// Asserts a dispatchable is incompletely executed and XCM sent pub fn assert_xcm_pallet_attempted_incomplete( expected_weight: Option<$crate::impls::Weight>, - expected_error: Option<$crate::impls::Error>, + expected_error: Option<$crate::impls::XcmError>, ) { $crate::impls::assert_expected_events!( Self, vec![ // Dispatchable is properly executed and XCM message sent [<$chain RuntimeEvent>]::::PolkadotXcm( - $crate::impls::pallet_xcm::Event::Attempted { outcome: $crate::impls::Outcome::Incomplete(weight, error) } + $crate::impls::pallet_xcm::Event::Attempted { outcome: $crate::impls::Outcome::Incomplete { used: weight, error } } ) => { weight: $crate::impls::weight_within_threshold( ($crate::impls::REF_TIME_THRESHOLD, $crate::impls::PROOF_SIZE_THRESHOLD), expected_weight.unwrap_or(*weight), *weight ), - error: *error == expected_error.unwrap_or(*error), + error: *error == expected_error.unwrap_or((*error).into()).into(), }, ] ); } /// Asserts a dispatchable throws and error when trying to be sent - pub fn assert_xcm_pallet_attempted_error(expected_error: Option<$crate::impls::Error>) { + pub fn assert_xcm_pallet_attempted_error(expected_error: Option<$crate::impls::XcmError>) { $crate::impls::assert_expected_events!( Self, vec![ // Execution fails in the origin with `Barrier` [<$chain RuntimeEvent>]::::PolkadotXcm( - $crate::impls::pallet_xcm::Event::Attempted { outcome: $crate::impls::Outcome::Error(error) } + $crate::impls::pallet_xcm::Event::Attempted { outcome: $crate::impls::Outcome::Error { error } } ) => { - error: *error == expected_error.unwrap_or(*error), + error: *error == expected_error.unwrap_or((*error).into()).into(), }, ] ); @@ -639,7 +640,7 @@ macro_rules! impl_assets_helpers_for_parachain { ::execute_with(|| { $crate::impls::assert_ok!(]>::Assets::mint( signed_origin, - id.into(), + id.clone().into(), beneficiary.clone().into(), amount_to_mint )); @@ -717,7 +718,7 @@ macro_rules! impl_assets_helpers_for_parachain { ] ); - assert!(]>::Assets::asset_exists(id.into())); + assert!(]>::Assets::asset_exists(id.clone().into())); }); } } @@ -732,7 +733,7 @@ macro_rules! impl_foreign_assets_helpers_for_parachain { impl $chain { /// Create foreign assets using sudo `ForeignAssets::force_create()` pub fn force_create_foreign_asset( - id: $crate::impls::MultiLocation, + id: $crate::impls::v3::Location, owner: $crate::impls::AccountId, is_sufficient: bool, min_balance: u128, @@ -744,13 +745,13 @@ macro_rules! impl_foreign_assets_helpers_for_parachain { $crate::impls::assert_ok!( ]>::ForeignAssets::force_create( sudo_origin, - id, + id.clone(), owner.clone().into(), is_sufficient, min_balance, ) ); - assert!(]>::ForeignAssets::asset_exists(id)); + assert!(]>::ForeignAssets::asset_exists(id.clone())); type RuntimeEvent = <$chain as $crate::impls::Chain>::RuntimeEvent; $crate::impls::assert_expected_events!( Self, @@ -767,21 +768,21 @@ macro_rules! impl_foreign_assets_helpers_for_parachain { for (beneficiary, amount) in prefund_accounts.into_iter() { let signed_origin = <$chain as $crate::impls::Chain>::RuntimeOrigin::signed(owner.clone()); - Self::mint_foreign_asset(signed_origin, id, beneficiary, amount); + Self::mint_foreign_asset(signed_origin, id.clone(), beneficiary, amount); } } /// Mint assets making use of the ForeignAssets pallet-assets instance pub fn mint_foreign_asset( signed_origin: ::RuntimeOrigin, - id: $crate::impls::MultiLocation, + id: $crate::impls::v3::Location, beneficiary: $crate::impls::AccountId, amount_to_mint: u128, ) { ::execute_with(|| { $crate::impls::assert_ok!(]>::ForeignAssets::mint( signed_origin, - id.into(), + id.clone().into(), beneficiary.clone().into(), amount_to_mint )); @@ -813,7 +814,7 @@ macro_rules! impl_xcm_helpers_for_parachain { $crate::impls::paste::paste! { impl $chain { /// Set XCM version for destination. - pub fn force_xcm_version(dest: $crate::impls::MultiLocation, version: $crate::impls::XcmVersion) { + pub fn force_xcm_version(dest: $crate::impls::Location, version: $crate::impls::XcmVersion) { ::execute_with(|| { $crate::impls::assert_ok!(]>::PolkadotXcm::force_xcm_version( ::RuntimeOrigin::root(), diff --git a/cumulus/parachains/integration-tests/emulated/common/src/lib.rs b/cumulus/parachains/integration-tests/emulated/common/src/lib.rs index 48ee1a3b780..ad69d5576aa 100644 --- a/cumulus/parachains/integration-tests/emulated/common/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/common/src/lib.rs @@ -40,6 +40,7 @@ use polkadot_service::chain_spec::get_authority_keys_from_seed_no_beefy; pub const XCM_V2: u32 = 2; pub const XCM_V3: u32 = 3; +pub const XCM_V4: u32 = 4; pub const REF_TIME_THRESHOLD: u64 = 33; pub const PROOF_SIZE_THRESHOLD: u64 = 33; diff --git a/cumulus/parachains/integration-tests/emulated/common/src/macros.rs b/cumulus/parachains/integration-tests/emulated/common/src/macros.rs index 8718f1e83a0..01a376e4dbf 100644 --- a/cumulus/parachains/integration-tests/emulated/common/src/macros.rs +++ b/cumulus/parachains/integration-tests/emulated/common/src/macros.rs @@ -48,7 +48,7 @@ macro_rules! test_parachain_is_trusted_teleporter { <$receiver_para as $crate::macros::Chain>::account_data_of(receiver.clone()).free; let para_destination = <$sender_para>::sibling_location_of(<$receiver_para>::para_id()); - let beneficiary: MultiLocation = + let beneficiary: Location = $crate::macros::AccountId32 { network: None, id: receiver.clone().into() }.into(); // Send XCM message from Origin Parachain @@ -57,8 +57,8 @@ macro_rules! test_parachain_is_trusted_teleporter { <$sender_para>::execute_with(|| { assert_ok!(<$sender_para as [<$sender_para Pallet>]>::PolkadotXcm::limited_teleport_assets( origin.clone(), - bx!(para_destination.into()), - bx!(beneficiary.into()), + bx!(para_destination.clone().into()), + bx!(beneficiary.clone().into()), bx!($assets.clone().into()), fee_asset_item, weight_limit.clone(), @@ -127,8 +127,8 @@ macro_rules! include_penpal_create_foreign_asset_on_asset_hub { $crate::impls::paste::paste! { pub fn penpal_create_foreign_asset_on_asset_hub( asset_id_on_penpal: u32, - foreign_asset_at_asset_hub: MultiLocation, - ah_as_seen_by_penpal: MultiLocation, + foreign_asset_at_asset_hub: v3::Location, + ah_as_seen_by_penpal: Location, is_sufficient: bool, asset_owner: AccountId, prefund_amount: u128, @@ -144,14 +144,14 @@ macro_rules! include_penpal_create_foreign_asset_on_asset_hub { // prefund SA of Penpal on AssetHub with enough native tokens to pay for creating // new foreign asset, also prefund CheckingAccount with ED, because teleported asset // itself might not be sufficient and CheckingAccount cannot be created otherwise - let sov_penpal_on_ah = $asset_hub::sovereign_account_id_of(penpal_as_seen_by_ah); + let sov_penpal_on_ah = $asset_hub::sovereign_account_id_of(penpal_as_seen_by_ah.clone()); $asset_hub::fund_accounts(vec![ (sov_penpal_on_ah.clone().into(), $relay_ed * 100_000_000_000), (ah_check_account.clone().into(), $relay_ed * 1000), ]); // prefund SA of AssetHub on Penpal with native asset - let sov_ah_on_penpal = $penpal::sovereign_account_id_of(ah_as_seen_by_penpal); + let sov_ah_on_penpal = $penpal::sovereign_account_id_of(ah_as_seen_by_penpal.clone()); $penpal::fund_accounts(vec![ (sov_ah_on_penpal.into(), $relay_ed * 1_000_000_000), (penpal_check_account.clone().into(), $relay_ed * 1000), @@ -183,8 +183,8 @@ macro_rules! include_penpal_create_foreign_asset_on_asset_hub { let buy_execution_fee_amount = $weight_to_fee::weight_to_fee( &Weight::from_parts(10_100_000_000_000, 300_000), ); - let buy_execution_fee = MultiAsset { - id: Concrete(MultiLocation { parents: 1, interior: Here }), + let buy_execution_fee = Asset { + id: AssetId(Location { parents: 1, interior: Here }), fun: Fungible(buy_execution_fee_amount), }; let xcm = VersionedXcm::from(Xcm(vec![ diff --git a/cumulus/parachains/integration-tests/emulated/common/src/xcm_helpers.rs b/cumulus/parachains/integration-tests/emulated/common/src/xcm_helpers.rs index 70a9408c309..25e1cffad54 100644 --- a/cumulus/parachains/integration-tests/emulated/common/src/xcm_helpers.rs +++ b/cumulus/parachains/integration-tests/emulated/common/src/xcm_helpers.rs @@ -23,12 +23,12 @@ use xcm::{prelude::*, DoubleEncoded}; pub fn xcm_transact_paid_execution( call: DoubleEncoded<()>, origin_kind: OriginKind, - native_asset: MultiAsset, + native_asset: Asset, beneficiary: AccountId, ) -> VersionedXcm<()> { let weight_limit = WeightLimit::Unlimited; let require_weight_at_most = Weight::from_parts(1000000000, 200000); - let native_assets: MultiAssets = native_asset.clone().into(); + let native_assets: Assets = native_asset.clone().into(); VersionedXcm::from(Xcm(vec![ WithdrawAsset(native_assets), @@ -37,9 +37,9 @@ pub fn xcm_transact_paid_execution( RefundSurplus, DepositAsset { assets: All.into(), - beneficiary: MultiLocation { + beneficiary: Location { parents: 0, - interior: X1(AccountId32 { network: None, id: beneficiary.into() }), + interior: [AccountId32 { network: None, id: beneficiary.into() }].into(), }, }, ])) @@ -61,15 +61,11 @@ pub fn xcm_transact_unpaid_execution( } /// Helper method to get the non-fee asset used in multiple assets transfer -pub fn non_fee_asset(assets: &MultiAssets, fee_idx: usize) -> Option<(MultiLocation, u128)> { +pub fn non_fee_asset(assets: &Assets, fee_idx: usize) -> Option<(Location, u128)> { let asset = assets.inner().into_iter().enumerate().find(|a| a.0 != fee_idx)?.1.clone(); - let asset_id = match asset.id { - Concrete(id) => id, - _ => return None, - }; let asset_amount = match asset.fun { Fungible(amount) => amount, _ => return None, }; - Some((asset_id, asset_amount)) + Some((asset.id.0, asset_amount)) } diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/lib.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/lib.rs index 721f8b511ea..155c952327a 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/lib.rs @@ -26,7 +26,7 @@ pub use frame_support::{ // Polkadot pub use xcm::{ prelude::{AccountId32 as AccountId32Junction, *}, - v3::{Error, NetworkId::Rococo as RococoId}, + v3::{self, Error, NetworkId::Rococo as RococoId}, }; // Cumulus diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/reserve_transfer.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/reserve_transfer.rs index 24a71d3fb45..dfc0bc6ff39 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/reserve_transfer.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/reserve_transfer.rs @@ -30,7 +30,7 @@ fn relay_to_para_sender_assertions(t: RelayToParaTest) { ) => { from: *from == t.sender.account_id, to: *to == Rococo::sovereign_account_id_of( - t.args.dest + t.args.dest.clone() ), amount: *amount == t.args.amount, }, @@ -53,7 +53,7 @@ fn system_para_to_para_sender_assertions(t: SystemParaToParaTest) { ) => { from: *from == t.sender.account_id, to: *to == AssetHubRococo::sovereign_account_id_of( - t.args.dest + t.args.dest.clone() ), amount: *amount == t.args.amount, }, @@ -130,7 +130,7 @@ fn system_para_to_para_assets_sender_assertions(t: SystemParaToParaTest) { asset_id: *asset_id == ASSET_ID, from: *from == t.sender.account_id, to: *to == AssetHubRococo::sovereign_account_id_of( - t.args.dest + t.args.dest.clone() ), amount: *amount == t.args.amount, }, @@ -190,10 +190,10 @@ fn para_to_system_para_reserve_transfer_assets(t: ParaToSystemParaTest) -> Dispa fn reserve_transfer_native_asset_from_relay_to_system_para_fails() { let signed_origin = ::RuntimeOrigin::signed(RococoSender::get().into()); let destination = Rococo::child_location_of(AssetHubRococo::para_id()); - let beneficiary: MultiLocation = + let beneficiary: Location = AccountId32Junction { network: None, id: AssetHubRococoReceiver::get().into() }.into(); let amount_to_send: Balance = ROCOCO_ED * 1000; - let assets: MultiAssets = (Here, amount_to_send).into(); + let assets: Assets = (Here, amount_to_send).into(); let fee_asset_item = 0; // this should fail @@ -225,11 +225,11 @@ fn reserve_transfer_native_asset_from_system_para_to_relay_fails() { ::RuntimeOrigin::signed(AssetHubRococoSender::get().into()); let destination = AssetHubRococo::parent_location(); let beneficiary_id = RococoReceiver::get(); - let beneficiary: MultiLocation = + let beneficiary: Location = AccountId32Junction { network: None, id: beneficiary_id.into() }.into(); let amount_to_send: Balance = ASSET_HUB_ROCOCO_ED * 1000; - let assets: MultiAssets = (Parent, amount_to_send).into(); + let assets: Assets = (Parent, amount_to_send).into(); let fee_asset_item = 0; // this should fail @@ -418,9 +418,9 @@ fn reserve_transfer_assets_from_system_para_to_para() { let beneficiary_id = PenpalAReceiver::get(); let fee_amount_to_send = ASSET_HUB_ROCOCO_ED * 1000; let asset_amount_to_send = ASSET_MIN_BALANCE * 1000; - let assets: MultiAssets = vec![ + let assets: Assets = vec![ (Parent, fee_amount_to_send).into(), - (X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), asset_amount_to_send) + ([PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())], asset_amount_to_send) .into(), ] .into(); diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/set_xcm_versions.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/set_xcm_versions.rs index 8faba50fc88..7d630d36805 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/set_xcm_versions.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/set_xcm_versions.rs @@ -19,14 +19,13 @@ use crate::*; fn relay_sets_system_para_xcm_supported_version() { // Init tests variables let sudo_origin = ::RuntimeOrigin::root(); - let system_para_destination: MultiLocation = - Rococo::child_location_of(AssetHubRococo::para_id()); + let system_para_destination: Location = Rococo::child_location_of(AssetHubRococo::para_id()); // Relay Chain sets supported version for Asset Parachain Rococo::execute_with(|| { assert_ok!(::XcmPallet::force_xcm_version( sudo_origin, - bx!(system_para_destination), + bx!(system_para_destination.clone()), XCM_V3 )); @@ -52,7 +51,7 @@ fn system_para_sets_relay_xcm_supported_version() { ::RuntimeCall::PolkadotXcm(pallet_xcm::Call::< ::Runtime, >::force_xcm_version { - location: bx!(parent_location), + location: bx!(parent_location.clone()), version: XCM_V3, }) .encode() diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/swap.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/swap.rs index b1af69a1cd1..d6aade68086 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/swap.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/swap.rs @@ -15,16 +15,19 @@ use crate::*; use parachains_common::rococo::currency::EXISTENTIAL_DEPOSIT; -use rococo_system_emulated_network::penpal_emulated_chain::LocalTeleportableToAssetHub as PenpalLocalTeleportableToAssetHub; +use rococo_system_emulated_network::penpal_emulated_chain::LocalTeleportableToAssetHubV3 as PenpalLocalTeleportableToAssetHubV3; use sp_runtime::ModuleError; #[test] fn swap_locally_on_chain_using_local_assets() { - let asset_native = asset_hub_rococo_runtime::xcm_config::TokenLocation::get(); - let asset_one = MultiLocation { - parents: 0, - interior: X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), - }; + let asset_native = Box::new(asset_hub_rococo_runtime::xcm_config::TokenLocationV3::get()); + let asset_one = Box::new(v3::Location::new( + 0, + [ + v3::Junction::PalletInstance(ASSETS_PALLET_ID), + v3::Junction::GeneralIndex(ASSET_ID.into()), + ], + )); AssetHubRococo::execute_with(|| { type RuntimeEvent = ::RuntimeEvent; @@ -46,8 +49,8 @@ fn swap_locally_on_chain_using_local_assets() { assert_ok!(::AssetConversion::create_pool( ::RuntimeOrigin::signed(AssetHubRococoSender::get()), - Box::new(asset_native), - Box::new(asset_one), + asset_native.clone(), + asset_one.clone(), )); assert_expected_events!( @@ -59,8 +62,8 @@ fn swap_locally_on_chain_using_local_assets() { assert_ok!(::AssetConversion::add_liquidity( ::RuntimeOrigin::signed(AssetHubRococoSender::get()), - Box::new(asset_native), - Box::new(asset_one), + asset_native.clone(), + asset_one.clone(), 1_000_000_000_000, 2_000_000_000_000, 0, @@ -75,7 +78,7 @@ fn swap_locally_on_chain_using_local_assets() { ] ); - let path = vec![Box::new(asset_native), Box::new(asset_one)]; + let path = vec![asset_native.clone(), asset_one.clone()]; assert_ok!( ::AssetConversion::swap_exact_tokens_for_tokens( @@ -100,8 +103,8 @@ fn swap_locally_on_chain_using_local_assets() { assert_ok!(::AssetConversion::remove_liquidity( ::RuntimeOrigin::signed(AssetHubRococoSender::get()), - Box::new(asset_native), - Box::new(asset_one), + asset_native, + asset_one, 1414213562273 - EXISTENTIAL_DEPOSIT * 2, // all but the 2 EDs can't be retrieved. 0, 0, @@ -112,16 +115,16 @@ fn swap_locally_on_chain_using_local_assets() { #[test] fn swap_locally_on_chain_using_foreign_assets() { - let asset_native = asset_hub_rococo_runtime::xcm_config::TokenLocation::get(); + let asset_native = Box::new(asset_hub_rococo_runtime::xcm_config::TokenLocationV3::get()); let ah_as_seen_by_penpal = PenpalA::sibling_location_of(AssetHubRococo::para_id()); - let asset_location_on_penpal = PenpalLocalTeleportableToAssetHub::get(); + let asset_location_on_penpal = PenpalLocalTeleportableToAssetHubV3::get(); let asset_id_on_penpal = match asset_location_on_penpal.last() { - Some(GeneralIndex(id)) => *id as u32, + Some(v3::Junction::GeneralIndex(id)) => *id as u32, _ => unreachable!(), }; let asset_owner_on_penpal = PenpalASender::get(); let foreign_asset_at_asset_hub_rococo = - MultiLocation { parents: 1, interior: X1(Parachain(PenpalA::para_id().into())) } + v3::Location::new(1, [v3::Junction::Parachain(PenpalA::para_id().into())]) .appended_with(asset_location_on_penpal) .unwrap(); @@ -167,7 +170,7 @@ fn swap_locally_on_chain_using_foreign_assets() { // 4. Create pool: assert_ok!(::AssetConversion::create_pool( ::RuntimeOrigin::signed(AssetHubRococoSender::get()), - Box::new(asset_native), + asset_native.clone(), Box::new(foreign_asset_at_asset_hub_rococo), )); @@ -181,7 +184,7 @@ fn swap_locally_on_chain_using_foreign_assets() { // 5. Add liquidity: assert_ok!(::AssetConversion::add_liquidity( ::RuntimeOrigin::signed(sov_penpal_on_ahr.clone()), - Box::new(asset_native), + asset_native.clone(), Box::new(foreign_asset_at_asset_hub_rococo), 1_000_000_000_000, 2_000_000_000_000, @@ -200,7 +203,7 @@ fn swap_locally_on_chain_using_foreign_assets() { ); // 6. Swap! - let path = vec![Box::new(asset_native), Box::new(foreign_asset_at_asset_hub_rococo)]; + let path = vec![asset_native.clone(), Box::new(foreign_asset_at_asset_hub_rococo)]; assert_ok!( ::AssetConversion::swap_exact_tokens_for_tokens( @@ -226,7 +229,7 @@ fn swap_locally_on_chain_using_foreign_assets() { // 7. Remove liquidity assert_ok!(::AssetConversion::remove_liquidity( ::RuntimeOrigin::signed(sov_penpal_on_ahr.clone()), - Box::new(asset_native), + asset_native.clone(), Box::new(foreign_asset_at_asset_hub_rococo), 1414213562273 - 2_000_000_000, // all but the 2 EDs can't be retrieved. 0, @@ -238,9 +241,11 @@ fn swap_locally_on_chain_using_foreign_assets() { #[test] fn cannot_create_pool_from_pool_assets() { - let asset_native = asset_hub_rococo_runtime::xcm_config::TokenLocation::get(); - let mut asset_one = asset_hub_rococo_runtime::xcm_config::PoolAssetsPalletLocation::get(); - asset_one.append_with(GeneralIndex(ASSET_ID.into())).expect("pool assets"); + let asset_native = Box::new(asset_hub_rococo_runtime::xcm_config::TokenLocationV3::get()); + let mut asset_one = asset_hub_rococo_runtime::xcm_config::PoolAssetsPalletLocationV3::get(); + asset_one + .append_with(v3::Junction::GeneralIndex(ASSET_ID.into())) + .expect("pool assets"); AssetHubRococo::execute_with(|| { let pool_owner_account_id = asset_hub_rococo_runtime::AssetConversionOrigin::get(); @@ -263,7 +268,7 @@ fn cannot_create_pool_from_pool_assets() { assert_matches::assert_matches!( ::AssetConversion::create_pool( ::RuntimeOrigin::signed(AssetHubRococoSender::get()), - Box::new(asset_native), + asset_native, Box::new(asset_one), ), Err(DispatchError::Module(ModuleError{index: _, error: _, message})) => assert_eq!(message, Some("Unknown")) @@ -273,10 +278,14 @@ fn cannot_create_pool_from_pool_assets() { #[test] fn pay_xcm_fee_with_some_asset_swapped_for_native() { - let asset_native = asset_hub_rococo_runtime::xcm_config::TokenLocation::get(); - let asset_one = MultiLocation { + let asset_native = asset_hub_rococo_runtime::xcm_config::TokenLocationV3::get(); + let asset_one = xcm::v3::Location { parents: 0, - interior: X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), + interior: [ + xcm::v3::Junction::PalletInstance(ASSETS_PALLET_ID), + xcm::v3::Junction::GeneralIndex(ASSET_ID.into()), + ] + .into(), }; let penpal = AssetHubRococo::sovereign_account_id_of(AssetHubRococo::sibling_location_of( PenpalA::para_id(), @@ -365,8 +374,7 @@ fn pay_xcm_fee_with_some_asset_swapped_for_native() { let penpal_root = ::RuntimeOrigin::root(); let fee_amount = 4_000_000_000_000u128; let asset_one = - (X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), fee_amount) - .into(); + ([PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())], fee_amount).into(); let asset_hub_location = PenpalA::sibling_location_of(AssetHubRococo::para_id()).into(); let xcm = xcm_transact_paid_execution( call, diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/teleport.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/teleport.rs index a07463cec50..218234cc78e 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/teleport.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/teleport.rs @@ -17,7 +17,7 @@ use crate::*; use asset_hub_rococo_runtime::xcm_config::XcmConfig as AssetHubRococoXcmConfig; use emulated_integration_tests_common::xcm_helpers::non_fee_asset; use rococo_runtime::xcm_config::XcmConfig as RococoXcmConfig; -use rococo_system_emulated_network::penpal_emulated_chain::LocalTeleportableToAssetHub as PenpalLocalTeleportableToAssetHub; +use rococo_system_emulated_network::penpal_emulated_chain::LocalTeleportableToAssetHubV3 as PenpalLocalTeleportableToAssetHubV3; fn relay_origin_assertions(t: RelayToSystemParaTest) { type RuntimeEvent = ::RuntimeEvent; @@ -143,6 +143,7 @@ fn penpal_to_ah_foreign_assets_receiver_assertions(t: ParaToSystemParaTest) { ); let (expected_foreign_asset_id, expected_foreign_asset_amount) = non_fee_asset(&t.args.assets, t.args.fee_asset_item as usize).unwrap(); + let expected_foreign_asset_id_v3: v3::Location = expected_foreign_asset_id.try_into().unwrap(); assert_expected_events!( AssetHubRococo, vec![ @@ -157,7 +158,7 @@ fn penpal_to_ah_foreign_assets_receiver_assertions(t: ParaToSystemParaTest) { who: *who == t.receiver.account_id, }, RuntimeEvent::ForeignAssets(pallet_assets::Event::Issued { asset_id, owner, amount }) => { - asset_id: *asset_id == expected_foreign_asset_id, + asset_id: *asset_id == expected_foreign_asset_id_v3, owner: *owner == t.receiver.account_id, amount: *amount == expected_foreign_asset_amount, }, @@ -174,6 +175,7 @@ fn ah_to_penpal_foreign_assets_sender_assertions(t: SystemParaToParaTest) { AssetHubRococo::assert_xcm_pallet_attempted_complete(None); let (expected_foreign_asset_id, expected_foreign_asset_amount) = non_fee_asset(&t.args.assets, t.args.fee_asset_item as usize).unwrap(); + let expected_foreign_asset_id_v3: v3::Location = expected_foreign_asset_id.try_into().unwrap(); assert_expected_events!( AssetHubRococo, vec![ @@ -183,13 +185,13 @@ fn ah_to_penpal_foreign_assets_sender_assertions(t: SystemParaToParaTest) { ) => { from: *from == t.sender.account_id, to: *to == AssetHubRococo::sovereign_account_id_of( - t.args.dest + t.args.dest.clone() ), amount: *amount == t.args.amount, }, // foreign asset is burned locally as part of teleportation RuntimeEvent::ForeignAssets(pallet_assets::Event::Burned { asset_id, owner, balance }) => { - asset_id: *asset_id == expected_foreign_asset_id, + asset_id: *asset_id == expected_foreign_asset_id_v3, owner: *owner == t.sender.account_id, balance: *balance == expected_foreign_asset_amount, }, @@ -542,7 +544,7 @@ fn teleport_native_assets_from_system_para_to_relay_fails() { #[test] fn teleport_to_other_system_parachains_works() { let amount = ASSET_HUB_ROCOCO_ED * 100; - let native_asset: MultiAssets = (Parent, amount).into(); + let native_asset: Assets = (Parent, amount).into(); test_parachain_is_trusted_teleporter!( AssetHubRococo, // Origin @@ -557,20 +559,20 @@ fn teleport_to_other_system_parachains_works() { #[test] fn bidirectional_teleport_foreign_assets_between_para_and_asset_hub() { let ah_as_seen_by_penpal = PenpalA::sibling_location_of(AssetHubRococo::para_id()); - let asset_location_on_penpal = PenpalLocalTeleportableToAssetHub::get(); + let asset_location_on_penpal = PenpalLocalTeleportableToAssetHubV3::get(); let asset_id_on_penpal = match asset_location_on_penpal.last() { - Some(GeneralIndex(id)) => *id as u32, + Some(v3::Junction::GeneralIndex(id)) => *id as u32, _ => unreachable!(), }; let asset_owner_on_penpal = PenpalASender::get(); let foreign_asset_at_asset_hub_rococo = - MultiLocation { parents: 1, interior: X1(Parachain(PenpalA::para_id().into())) } + v3::Location::new(1, [v3::Junction::Parachain(PenpalA::para_id().into())]) .appended_with(asset_location_on_penpal) .unwrap(); super::penpal_create_foreign_asset_on_asset_hub( asset_id_on_penpal, foreign_asset_at_asset_hub_rococo, - ah_as_seen_by_penpal, + ah_as_seen_by_penpal.clone(), false, asset_owner_on_penpal, ASSET_MIN_BALANCE * 1_000_000, @@ -580,9 +582,10 @@ fn bidirectional_teleport_foreign_assets_between_para_and_asset_hub() { let fee_amount_to_send = ASSET_HUB_ROCOCO_ED * 10_000; let asset_amount_to_send = ASSET_MIN_BALANCE * 1000; - let penpal_assets: MultiAssets = vec![ + let asset_location_on_penpal_latest: Location = asset_location_on_penpal.try_into().unwrap(); + let penpal_assets: Assets = vec![ (Parent, fee_amount_to_send).into(), - (asset_location_on_penpal, asset_amount_to_send).into(), + (asset_location_on_penpal_latest, asset_amount_to_send).into(), ] .into(); let fee_asset_index = penpal_assets @@ -670,11 +673,13 @@ fn bidirectional_teleport_foreign_assets_between_para_and_asset_hub() { )); }); + let foreign_asset_at_asset_hub_rococo_latest: Location = + foreign_asset_at_asset_hub_rococo.try_into().unwrap(); let ah_to_penpal_beneficiary_id = PenpalAReceiver::get(); let penpal_as_seen_by_ah = AssetHubRococo::sibling_location_of(PenpalA::para_id()); - let ah_assets: MultiAssets = vec![ + let ah_assets: Assets = vec![ (Parent, fee_amount_to_send).into(), - (foreign_asset_at_asset_hub_rococo, asset_amount_to_send).into(), + (foreign_asset_at_asset_hub_rococo_latest, asset_amount_to_send).into(), ] .into(); let fee_asset_index = ah_assets diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/lib.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/lib.rs index fbeb08649e7..018e948e5d7 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/lib.rs @@ -28,7 +28,7 @@ pub use frame_support::{ // Polkadot pub use xcm::{ prelude::{AccountId32 as AccountId32Junction, *}, - v3::{Error, NetworkId::Westend as WestendId}, + v3::{self, Error, NetworkId::Westend as WestendId}, }; // Cumulus diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/fellowship_treasury.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/fellowship_treasury.rs index d7de0a451f2..11e1e1762db 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/fellowship_treasury.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/fellowship_treasury.rs @@ -24,22 +24,20 @@ fn create_and_claim_treasury_spend() { const ASSET_ID: u32 = 1984; const SPEND_AMOUNT: u128 = 1_000_000; // treasury location from a sibling parachain. - let treasury_location: MultiLocation = MultiLocation::new( - 1, - X2(Parachain(CollectivesWestend::para_id().into()), PalletInstance(65)), - ); + let treasury_location: Location = + Location::new(1, [Parachain(CollectivesWestend::para_id().into()), PalletInstance(65)]); // treasury account on a sibling parachain. let treasury_account = asset_hub_westend_runtime::xcm_config::LocationToAccountId::convert_location( &treasury_location, ) .unwrap(); - let asset_hub_location = MultiLocation::new(1, Parachain(AssetHubWestend::para_id().into())); + let asset_hub_location = Location::new(1, [Parachain(AssetHubWestend::para_id().into())]); let root = ::RuntimeOrigin::root(); // asset kind to be spent from the treasury. - let asset_kind = VersionedLocatableAsset::V3 { + let asset_kind = VersionedLocatableAsset::V4 { location: asset_hub_location, - asset_id: AssetId::Concrete((PalletInstance(50), GeneralIndex(ASSET_ID.into())).into()), + asset_id: AssetId((PalletInstance(50), GeneralIndex(ASSET_ID.into())).into()), }; // treasury spend beneficiary. let alice: AccountId = Westend::account_id_of(ALICE); @@ -75,7 +73,7 @@ fn create_and_claim_treasury_spend() { root, Box::new(asset_kind), SPEND_AMOUNT, - Box::new(MultiLocation::new(0, Into::<[u8; 32]>::into(alice.clone())).into()), + Box::new(Location::new(0, Into::<[u8; 32]>::into(alice.clone())).into()), None, )); // claim the spend. diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/reserve_transfer.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/reserve_transfer.rs index 3cce6c4417e..a2934be9758 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/reserve_transfer.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/reserve_transfer.rs @@ -32,7 +32,7 @@ fn relay_to_para_sender_assertions(t: RelayToParaTest) { ) => { from: *from == t.sender.account_id, to: *to == Westend::sovereign_account_id_of( - t.args.dest + t.args.dest.clone() ), amount: *amount == t.args.amount, }, @@ -57,7 +57,7 @@ fn system_para_to_para_sender_assertions(t: SystemParaToParaTest) { ) => { from: *from == t.sender.account_id, to: *to == AssetHubWestend::sovereign_account_id_of( - t.args.dest + t.args.dest.clone() ), amount: *amount == t.args.amount, }, @@ -140,7 +140,7 @@ fn system_para_to_para_assets_sender_assertions(t: SystemParaToParaTest) { asset_id: *asset_id == ASSET_ID, from: *from == t.sender.account_id, to: *to == AssetHubWestend::sovereign_account_id_of( - t.args.dest + t.args.dest.clone() ), amount: *amount == t.args.amount, }, @@ -200,10 +200,10 @@ fn para_to_system_para_reserve_transfer_assets(t: ParaToSystemParaTest) -> Dispa fn reserve_transfer_native_asset_from_relay_to_system_para_fails() { let signed_origin = ::RuntimeOrigin::signed(WestendSender::get().into()); let destination = Westend::child_location_of(AssetHubWestend::para_id()); - let beneficiary: MultiLocation = + let beneficiary: Location = AccountId32Junction { network: None, id: AssetHubWestendReceiver::get().into() }.into(); let amount_to_send: Balance = WESTEND_ED * 1000; - let assets: MultiAssets = (Here, amount_to_send).into(); + let assets: Assets = (Here, amount_to_send).into(); let fee_asset_item = 0; // this should fail @@ -235,10 +235,10 @@ fn reserve_transfer_native_asset_from_system_para_to_relay_fails() { ::RuntimeOrigin::signed(AssetHubWestendSender::get().into()); let destination = AssetHubWestend::parent_location(); let beneficiary_id = WestendReceiver::get(); - let beneficiary: MultiLocation = + let beneficiary: Location = AccountId32Junction { network: None, id: beneficiary_id.into() }.into(); let amount_to_send: Balance = ASSET_HUB_WESTEND_ED * 1000; - let assets: MultiAssets = (Parent, amount_to_send).into(); + let assets: Assets = (Parent, amount_to_send).into(); let fee_asset_item = 0; // this should fail @@ -428,9 +428,9 @@ fn reserve_transfer_assets_from_system_para_to_para() { let beneficiary_id = PenpalBReceiver::get(); let fee_amount_to_send = ASSET_HUB_WESTEND_ED * 1000; let asset_amount_to_send = ASSET_MIN_BALANCE * 1000; - let assets: MultiAssets = vec![ + let assets: Assets = vec![ (Parent, fee_amount_to_send).into(), - (X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), asset_amount_to_send) + ([PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())], asset_amount_to_send) .into(), ] .into(); diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/set_xcm_versions.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/set_xcm_versions.rs index 2133d5e5fb7..130454551d2 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/set_xcm_versions.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/set_xcm_versions.rs @@ -19,14 +19,13 @@ use crate::*; fn relay_sets_system_para_xcm_supported_version() { // Init tests variables let sudo_origin = ::RuntimeOrigin::root(); - let system_para_destination: MultiLocation = - Westend::child_location_of(AssetHubWestend::para_id()); + let system_para_destination: Location = Westend::child_location_of(AssetHubWestend::para_id()); // Relay Chain sets supported version for Asset Parachain Westend::execute_with(|| { assert_ok!(::XcmPallet::force_xcm_version( sudo_origin, - bx!(system_para_destination), + bx!(system_para_destination.clone()), XCM_V3 )); @@ -52,7 +51,7 @@ fn system_para_sets_relay_xcm_supported_version() { ::RuntimeCall::PolkadotXcm(pallet_xcm::Call::< ::Runtime, >::force_xcm_version { - location: bx!(parent_location), + location: bx!(parent_location.clone()), version: XCM_V3, }) .encode() diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/swap.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/swap.rs index c768a1366fa..b39cc2159de 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/swap.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/swap.rs @@ -14,15 +14,19 @@ // limitations under the License. use crate::*; -use westend_system_emulated_network::penpal_emulated_chain::LocalTeleportableToAssetHub as PenpalLocalTeleportableToAssetHub; +use westend_system_emulated_network::penpal_emulated_chain::LocalTeleportableToAssetHubV3 as PenpalLocalTeleportableToAssetHubV3; #[test] fn swap_locally_on_chain_using_local_assets() { - let asset_native = asset_hub_westend_runtime::xcm_config::WestendLocation::get(); - let asset_one = MultiLocation { + let asset_native = Box::new(asset_hub_westend_runtime::xcm_config::WestendLocationV3::get()); + let asset_one = Box::new(v3::Location { parents: 0, - interior: X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), - }; + interior: [ + v3::Junction::PalletInstance(ASSETS_PALLET_ID), + v3::Junction::GeneralIndex(ASSET_ID.into()), + ] + .into(), + }); AssetHubWestend::execute_with(|| { type RuntimeEvent = ::RuntimeEvent; @@ -44,8 +48,8 @@ fn swap_locally_on_chain_using_local_assets() { assert_ok!(::AssetConversion::create_pool( ::RuntimeOrigin::signed(AssetHubWestendSender::get()), - Box::new(asset_native), - Box::new(asset_one), + asset_native.clone(), + asset_one.clone(), )); assert_expected_events!( @@ -57,8 +61,8 @@ fn swap_locally_on_chain_using_local_assets() { assert_ok!(::AssetConversion::add_liquidity( ::RuntimeOrigin::signed(AssetHubWestendSender::get()), - Box::new(asset_native), - Box::new(asset_one), + asset_native.clone(), + asset_one.clone(), 1_000_000_000_000, 2_000_000_000_000, 0, @@ -73,7 +77,7 @@ fn swap_locally_on_chain_using_local_assets() { ] ); - let path = vec![Box::new(asset_native), Box::new(asset_one)]; + let path = vec![asset_native.clone(), asset_one.clone()]; assert_ok!(::AssetConversion::swap_exact_tokens_for_tokens( ::RuntimeOrigin::signed(AssetHubWestendSender::get()), @@ -96,8 +100,8 @@ fn swap_locally_on_chain_using_local_assets() { assert_ok!(::AssetConversion::remove_liquidity( ::RuntimeOrigin::signed(AssetHubWestendSender::get()), - Box::new(asset_native), - Box::new(asset_one), + asset_native.clone(), + asset_one.clone(), 1414213562273 - 2_000_000_000, // all but the 2 EDs can't be retrieved. 0, 0, @@ -108,16 +112,16 @@ fn swap_locally_on_chain_using_local_assets() { #[test] fn swap_locally_on_chain_using_foreign_assets() { - let asset_native = asset_hub_westend_runtime::xcm_config::WestendLocation::get(); + let asset_native = Box::new(asset_hub_westend_runtime::xcm_config::WestendLocationV3::get()); let ah_as_seen_by_penpal = PenpalB::sibling_location_of(AssetHubWestend::para_id()); - let asset_location_on_penpal = PenpalLocalTeleportableToAssetHub::get(); + let asset_location_on_penpal = PenpalLocalTeleportableToAssetHubV3::get(); let asset_id_on_penpal = match asset_location_on_penpal.last() { - Some(GeneralIndex(id)) => *id as u32, + Some(v3::Junction::GeneralIndex(id)) => *id as u32, _ => unreachable!(), }; let asset_owner_on_penpal = PenpalBSender::get(); let foreign_asset_at_asset_hub_westend = - MultiLocation { parents: 1, interior: X1(Parachain(PenpalB::para_id().into())) } + v3::Location::new(1, [v3::Junction::Parachain(PenpalB::para_id().into())]) .appended_with(asset_location_on_penpal) .unwrap(); @@ -163,7 +167,7 @@ fn swap_locally_on_chain_using_foreign_assets() { // 4. Create pool: assert_ok!(::AssetConversion::create_pool( ::RuntimeOrigin::signed(AssetHubWestendSender::get()), - Box::new(asset_native), + asset_native.clone(), Box::new(foreign_asset_at_asset_hub_westend), )); @@ -177,7 +181,7 @@ fn swap_locally_on_chain_using_foreign_assets() { // 5. Add liquidity: assert_ok!(::AssetConversion::add_liquidity( ::RuntimeOrigin::signed(sov_penpal_on_ahw.clone()), - Box::new(asset_native), + asset_native.clone(), Box::new(foreign_asset_at_asset_hub_westend), 1_000_000_000_000, 2_000_000_000_000, @@ -196,7 +200,7 @@ fn swap_locally_on_chain_using_foreign_assets() { ); // 6. Swap! - let path = vec![Box::new(asset_native), Box::new(foreign_asset_at_asset_hub_westend)]; + let path = vec![asset_native.clone(), Box::new(foreign_asset_at_asset_hub_westend)]; assert_ok!(::AssetConversion::swap_exact_tokens_for_tokens( ::RuntimeOrigin::signed(AssetHubWestendSender::get()), @@ -220,7 +224,7 @@ fn swap_locally_on_chain_using_foreign_assets() { // 7. Remove liquidity assert_ok!(::AssetConversion::remove_liquidity( ::RuntimeOrigin::signed(sov_penpal_on_ahw.clone()), - Box::new(asset_native), + asset_native.clone(), Box::new(foreign_asset_at_asset_hub_westend), 1414213562273 - 2_000_000_000, // all but the 2 EDs can't be retrieved. 0, @@ -232,9 +236,11 @@ fn swap_locally_on_chain_using_foreign_assets() { #[test] fn cannot_create_pool_from_pool_assets() { - let asset_native = asset_hub_westend_runtime::xcm_config::WestendLocation::get(); - let mut asset_one = asset_hub_westend_runtime::xcm_config::PoolAssetsPalletLocation::get(); - asset_one.append_with(GeneralIndex(ASSET_ID.into())).expect("pool assets"); + let asset_native = Box::new(asset_hub_westend_runtime::xcm_config::WestendLocationV3::get()); + let mut asset_one = asset_hub_westend_runtime::xcm_config::PoolAssetsPalletLocationV3::get(); + asset_one + .append_with(v3::Junction::GeneralIndex(ASSET_ID.into())) + .expect("pool assets"); AssetHubWestend::execute_with(|| { let pool_owner_account_id = asset_hub_westend_runtime::AssetConversionOrigin::get(); @@ -257,7 +263,7 @@ fn cannot_create_pool_from_pool_assets() { assert_matches::assert_matches!( ::AssetConversion::create_pool( ::RuntimeOrigin::signed(AssetHubWestendSender::get()), - Box::new(asset_native), + asset_native, Box::new(asset_one), ), Err(DispatchError::Module(ModuleError{index: _, error: _, message})) => assert_eq!(message, Some("Unknown")) @@ -267,10 +273,14 @@ fn cannot_create_pool_from_pool_assets() { #[test] fn pay_xcm_fee_with_some_asset_swapped_for_native() { - let asset_native = asset_hub_westend_runtime::xcm_config::WestendLocation::get(); - let asset_one = MultiLocation { + let asset_native = asset_hub_westend_runtime::xcm_config::WestendLocationV3::get(); + let asset_one = xcm::v3::Location { parents: 0, - interior: X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), + interior: [ + xcm::v3::Junction::PalletInstance(ASSETS_PALLET_ID), + xcm::v3::Junction::GeneralIndex(ASSET_ID.into()), + ] + .into(), }; let penpal = AssetHubWestend::sovereign_account_id_of(AssetHubWestend::sibling_location_of( PenpalB::para_id(), @@ -359,8 +369,7 @@ fn pay_xcm_fee_with_some_asset_swapped_for_native() { let penpal_root = ::RuntimeOrigin::root(); let fee_amount = 4_000_000_000_000u128; let asset_one = - (X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), fee_amount) - .into(); + ([PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())], fee_amount).into(); let asset_hub_location = PenpalB::sibling_location_of(AssetHubWestend::para_id()).into(); let xcm = xcm_transact_paid_execution( call, diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/teleport.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/teleport.rs index 27a6e7aaaf4..01498f7bb4e 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/teleport.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/teleport.rs @@ -17,7 +17,7 @@ use crate::*; use asset_hub_westend_runtime::xcm_config::XcmConfig as AssetHubWestendXcmConfig; use emulated_integration_tests_common::xcm_helpers::non_fee_asset; use westend_runtime::xcm_config::XcmConfig as WestendXcmConfig; -use westend_system_emulated_network::penpal_emulated_chain::LocalTeleportableToAssetHub as PenpalLocalTeleportableToAssetHub; +use westend_system_emulated_network::penpal_emulated_chain::LocalTeleportableToAssetHubV3 as PenpalLocalTeleportableToAssetHubV3; fn relay_origin_assertions(t: RelayToSystemParaTest) { type RuntimeEvent = ::RuntimeEvent; @@ -143,6 +143,7 @@ fn penpal_to_ah_foreign_assets_receiver_assertions(t: ParaToSystemParaTest) { ); let (expected_foreign_asset_id, expected_foreign_asset_amount) = non_fee_asset(&t.args.assets, t.args.fee_asset_item as usize).unwrap(); + let expected_foreign_asset_id_v3: v3::Location = expected_foreign_asset_id.try_into().unwrap(); assert_expected_events!( AssetHubWestend, vec![ @@ -157,7 +158,7 @@ fn penpal_to_ah_foreign_assets_receiver_assertions(t: ParaToSystemParaTest) { who: *who == t.receiver.account_id, }, RuntimeEvent::ForeignAssets(pallet_assets::Event::Issued { asset_id, owner, amount }) => { - asset_id: *asset_id == expected_foreign_asset_id, + asset_id: *asset_id == expected_foreign_asset_id_v3, owner: *owner == t.receiver.account_id, amount: *amount == expected_foreign_asset_amount, }, @@ -174,6 +175,7 @@ fn ah_to_penpal_foreign_assets_sender_assertions(t: SystemParaToParaTest) { AssetHubWestend::assert_xcm_pallet_attempted_complete(None); let (expected_foreign_asset_id, expected_foreign_asset_amount) = non_fee_asset(&t.args.assets, t.args.fee_asset_item as usize).unwrap(); + let expected_foreign_asset_id_v3: v3::Location = expected_foreign_asset_id.try_into().unwrap(); assert_expected_events!( AssetHubWestend, vec![ @@ -183,13 +185,13 @@ fn ah_to_penpal_foreign_assets_sender_assertions(t: SystemParaToParaTest) { ) => { from: *from == t.sender.account_id, to: *to == AssetHubWestend::sovereign_account_id_of( - t.args.dest + t.args.dest.clone() ), amount: *amount == t.args.amount, }, // foreign asset is burned locally as part of teleportation RuntimeEvent::ForeignAssets(pallet_assets::Event::Burned { asset_id, owner, balance }) => { - asset_id: *asset_id == expected_foreign_asset_id, + asset_id: *asset_id == expected_foreign_asset_id_v3, owner: *owner == t.sender.account_id, balance: *balance == expected_foreign_asset_amount, }, @@ -542,7 +544,7 @@ fn teleport_native_assets_from_system_para_to_relay_fails() { #[test] fn teleport_to_other_system_parachains_works() { let amount = ASSET_HUB_WESTEND_ED * 100; - let native_asset: MultiAssets = (Parent, amount).into(); + let native_asset: Assets = (Parent, amount).into(); test_parachain_is_trusted_teleporter!( AssetHubWestend, // Origin @@ -557,20 +559,20 @@ fn teleport_to_other_system_parachains_works() { #[test] fn bidirectional_teleport_foreign_assets_between_para_and_asset_hub() { let ah_as_seen_by_penpal = PenpalB::sibling_location_of(AssetHubWestend::para_id()); - let asset_location_on_penpal = PenpalLocalTeleportableToAssetHub::get(); + let asset_location_on_penpal = PenpalLocalTeleportableToAssetHubV3::get(); let asset_id_on_penpal = match asset_location_on_penpal.last() { - Some(GeneralIndex(id)) => *id as u32, + Some(v3::Junction::GeneralIndex(id)) => *id as u32, _ => unreachable!(), }; let asset_owner_on_penpal = PenpalBSender::get(); let foreign_asset_at_asset_hub_westend = - MultiLocation { parents: 1, interior: X1(Parachain(PenpalB::para_id().into())) } + v3::Location::new(1, [v3::Junction::Parachain(PenpalB::para_id().into())]) .appended_with(asset_location_on_penpal) .unwrap(); super::penpal_create_foreign_asset_on_asset_hub( asset_id_on_penpal, foreign_asset_at_asset_hub_westend, - ah_as_seen_by_penpal, + ah_as_seen_by_penpal.clone(), false, asset_owner_on_penpal, ASSET_MIN_BALANCE * 1_000_000, @@ -580,9 +582,10 @@ fn bidirectional_teleport_foreign_assets_between_para_and_asset_hub() { let fee_amount_to_send = ASSET_HUB_WESTEND_ED * 1000; let asset_amount_to_send = ASSET_MIN_BALANCE * 1000; - let penpal_assets: MultiAssets = vec![ + let asset_location_on_penpal_latest: Location = asset_location_on_penpal.try_into().unwrap(); + let penpal_assets: Assets = vec![ (Parent, fee_amount_to_send).into(), - (asset_location_on_penpal, asset_amount_to_send).into(), + (asset_location_on_penpal_latest, asset_amount_to_send).into(), ] .into(); let fee_asset_index = penpal_assets @@ -670,11 +673,13 @@ fn bidirectional_teleport_foreign_assets_between_para_and_asset_hub() { )); }); + let foreign_asset_at_asset_hub_westend_latest: Location = + foreign_asset_at_asset_hub_westend.try_into().unwrap(); let ah_to_penpal_beneficiary_id = PenpalBReceiver::get(); let penpal_as_seen_by_ah = AssetHubWestend::sibling_location_of(PenpalB::para_id()); - let ah_assets: MultiAssets = vec![ + let ah_assets: Assets = vec![ (Parent, fee_amount_to_send).into(), - (foreign_asset_at_asset_hub_westend, asset_amount_to_send).into(), + (foreign_asset_at_asset_hub_westend_latest, asset_amount_to_send).into(), ] .into(); let fee_asset_index = ah_assets diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/treasury.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/treasury.rs index 32089f7ecec..8e82059a32d 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/treasury.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/treasury.rs @@ -24,19 +24,19 @@ fn create_and_claim_treasury_spend() { const ASSET_ID: u32 = 1984; const SPEND_AMOUNT: u128 = 1_000_000; // treasury location from a sibling parachain. - let treasury_location: MultiLocation = MultiLocation::new(1, PalletInstance(37)); + let treasury_location: Location = Location::new(1, PalletInstance(37)); // treasury account on a sibling parachain. let treasury_account = asset_hub_westend_runtime::xcm_config::LocationToAccountId::convert_location( &treasury_location, ) .unwrap(); - let asset_hub_location = MultiLocation::new(0, Parachain(AssetHubWestend::para_id().into())); + let asset_hub_location = Location::new(0, Parachain(AssetHubWestend::para_id().into())); let root = ::RuntimeOrigin::root(); // asset kind to be spend from the treasury. - let asset_kind = VersionedLocatableAsset::V3 { + let asset_kind = VersionedLocatableAsset::V4 { location: asset_hub_location, - asset_id: AssetId::Concrete((PalletInstance(50), GeneralIndex(ASSET_ID.into())).into()), + asset_id: AssetId([PalletInstance(50), GeneralIndex(ASSET_ID.into())].into()), }; // treasury spend beneficiary. let alice: AccountId = Westend::account_id_of(ALICE); @@ -71,7 +71,7 @@ fn create_and_claim_treasury_spend() { root, Box::new(asset_kind), SPEND_AMOUNT, - Box::new(MultiLocation::new(0, Into::<[u8; 32]>::into(alice.clone())).into()), + Box::new(Location::new(0, Into::<[u8; 32]>::into(alice.clone())).into()), None, )); // claim the spend. diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/lib.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/lib.rs index 608aa388ce8..0039eb087fe 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/lib.rs @@ -22,7 +22,7 @@ pub use xcm::{ latest::ParentThen, prelude::{AccountId32 as AccountId32Junction, *}, v3::{ - Error, + self, Error, NetworkId::{Rococo as RococoId, Westend as WestendId}, }, }; diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/asset_transfers.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/asset_transfers.rs index 8b5a72a8e62..a203de0f8c9 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/asset_transfers.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/asset_transfers.rs @@ -15,14 +15,14 @@ use crate::tests::*; -fn send_asset_from_asset_hub_rococo_to_asset_hub_westend(id: MultiLocation, amount: u128) { +fn send_asset_from_asset_hub_rococo_to_asset_hub_westend(id: Location, amount: u128) { let destination = asset_hub_westend_location(); // fund the AHR's SA on BHR for paying bridge transport fees BridgeHubRococo::fund_para_sovereign(AssetHubRococo::para_id(), 10_000_000_000_000u128); // set XCM versions - AssetHubRococo::force_xcm_version(destination, XCM_VERSION); + AssetHubRococo::force_xcm_version(destination.clone(), XCM_VERSION); BridgeHubRococo::force_xcm_version(bridge_hub_westend_location(), XCM_VERSION); // send message over bridge @@ -33,9 +33,9 @@ fn send_asset_from_asset_hub_rococo_to_asset_hub_westend(id: MultiLocation, amou #[test] fn send_rocs_from_asset_hub_rococo_to_asset_hub_westend() { - let roc_at_asset_hub_rococo: MultiLocation = Parent.into(); + let roc_at_asset_hub_rococo: v3::Location = v3::Parent.into(); let roc_at_asset_hub_westend = - MultiLocation { parents: 2, interior: X1(GlobalConsensus(NetworkId::Rococo)) }; + v3::Location::new(2, [v3::Junction::GlobalConsensus(v3::NetworkId::Rococo)]); let owner: AccountId = AssetHubWestend::account_id_of(ALICE); AssetHubWestend::force_create_foreign_asset( roc_at_asset_hub_westend, @@ -62,7 +62,7 @@ fn send_rocs_from_asset_hub_rococo_to_asset_hub_westend() { assert_ok!(::AssetConversion::create_pool( ::RuntimeOrigin::signed(AssetHubWestendSender::get()), - Box::new(Parent.into()), + Box::new(xcm::v3::Parent.into()), Box::new(roc_at_asset_hub_westend), )); @@ -75,7 +75,7 @@ fn send_rocs_from_asset_hub_rococo_to_asset_hub_westend() { assert_ok!(::AssetConversion::add_liquidity( ::RuntimeOrigin::signed(AssetHubWestendSender::get()), - Box::new(Parent.into()), + Box::new(xcm::v3::Parent.into()), Box::new(roc_at_asset_hub_westend), 1_000_000_000_000, 2_000_000_000_000, @@ -101,8 +101,9 @@ fn send_rocs_from_asset_hub_rococo_to_asset_hub_westend() { >::balance(roc_at_asset_hub_westend, &AssetHubWestendReceiver::get()) }); + let roc_at_asset_hub_rococo_latest: Location = roc_at_asset_hub_rococo.try_into().unwrap(); let amount = ASSET_HUB_ROCOCO_ED * 1_000_000; - send_asset_from_asset_hub_rococo_to_asset_hub_westend(roc_at_asset_hub_rococo, amount); + send_asset_from_asset_hub_rococo_to_asset_hub_westend(roc_at_asset_hub_rococo_latest, amount); AssetHubWestend::execute_with(|| { type RuntimeEvent = ::RuntimeEvent; assert_expected_events!( @@ -142,7 +143,7 @@ fn send_rocs_from_asset_hub_rococo_to_asset_hub_westend() { fn send_wnds_from_asset_hub_rococo_to_asset_hub_westend() { let prefund_amount = 10_000_000_000_000u128; let wnd_at_asset_hub_rococo = - MultiLocation { parents: 2, interior: X1(GlobalConsensus(NetworkId::Westend)) }; + v3::Location::new(2, [v3::Junction::GlobalConsensus(v3::NetworkId::Westend)]); let owner: AccountId = AssetHubWestend::account_id_of(ALICE); AssetHubRococo::force_create_foreign_asset( wnd_at_asset_hub_rococo, @@ -170,8 +171,12 @@ fn send_wnds_from_asset_hub_rococo_to_asset_hub_westend() { let receiver_wnds_before = ::account_data_of(AssetHubWestendReceiver::get()).free; + let wnd_at_asset_hub_rococo_latest: Location = wnd_at_asset_hub_rococo.try_into().unwrap(); let amount_to_send = ASSET_HUB_WESTEND_ED * 1_000; - send_asset_from_asset_hub_rococo_to_asset_hub_westend(wnd_at_asset_hub_rococo, amount_to_send); + send_asset_from_asset_hub_rococo_to_asset_hub_westend( + wnd_at_asset_hub_rococo_latest.clone(), + amount_to_send, + ); AssetHubWestend::execute_with(|| { type RuntimeEvent = ::RuntimeEvent; assert_expected_events!( diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/mod.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/mod.rs index e71a022af4c..a33d2fab753 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/mod.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/mod.rs @@ -20,37 +20,31 @@ mod send_xcm; mod snowbridge; mod teleport; -pub(crate) fn asset_hub_westend_location() -> MultiLocation { - MultiLocation { - parents: 2, - interior: X2( - GlobalConsensus(NetworkId::Westend), - Parachain(AssetHubWestend::para_id().into()), - ), - } +pub(crate) fn asset_hub_westend_location() -> Location { + Location::new( + 2, + [GlobalConsensus(NetworkId::Westend), Parachain(AssetHubWestend::para_id().into())], + ) } -pub(crate) fn bridge_hub_westend_location() -> MultiLocation { - MultiLocation { - parents: 2, - interior: X2( - GlobalConsensus(NetworkId::Westend), - Parachain(BridgeHubWestend::para_id().into()), - ), - } +pub(crate) fn bridge_hub_westend_location() -> Location { + Location::new( + 2, + [GlobalConsensus(NetworkId::Westend), Parachain(BridgeHubWestend::para_id().into())], + ) } pub(crate) fn send_asset_from_asset_hub_rococo( - destination: MultiLocation, - (id, amount): (MultiLocation, u128), + destination: Location, + (id, amount): (Location, u128), ) -> DispatchResult { let signed_origin = ::RuntimeOrigin::signed(AssetHubRococoSender::get().into()); - let beneficiary: MultiLocation = + let beneficiary: Location = AccountId32Junction { network: None, id: AssetHubWestendReceiver::get().into() }.into(); - let assets: MultiAssets = (id, amount).into(); + let assets: Assets = (id, amount).into(); let fee_asset_item = 0; AssetHubRococo::execute_with(|| { diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/send_xcm.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/send_xcm.rs index a3a7d96a14a..a1d871cdb61 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/send_xcm.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/send_xcm.rs @@ -29,8 +29,8 @@ fn send_xcm_from_rococo_relay_to_westend_asset_hub_should_fail_on_not_applicable let xcm = VersionedXcm::from(Xcm(vec![ UnpaidExecution { weight_limit, check_origin }, ExportMessage { - network: WestendId, - destination: X1(Parachain(AssetHubWestend::para_id().into())), + network: WestendId.into(), + destination: [Parachain(AssetHubWestend::para_id().into())].into(), xcm: remote_xcm, }, ])); @@ -68,7 +68,7 @@ fn send_xcm_through_opened_lane_with_different_xcm_version_on_hops_works() { // prepare data let destination = asset_hub_westend_location(); - let native_token = MultiLocation::parent(); + let native_token = Location::parent(); let amount = ASSET_HUB_ROCOCO_ED * 1_000; // fund the AHR's SA on BHR for paying bridge transport fees @@ -78,7 +78,7 @@ fn send_xcm_through_opened_lane_with_different_xcm_version_on_hops_works() { // send XCM from AssetHubRococo - fails - destination version not known assert_err!( - send_asset_from_asset_hub_rococo(destination, (native_token, amount)), + send_asset_from_asset_hub_rococo(destination.clone(), (native_token.clone(), amount)), DispatchError::Module(sp_runtime::ModuleError { index: 31, error: [1, 0, 0, 0], @@ -87,7 +87,7 @@ fn send_xcm_through_opened_lane_with_different_xcm_version_on_hops_works() { ); // set destination version - AssetHubRococo::force_xcm_version(destination, xcm::v3::prelude::XCM_VERSION); + AssetHubRococo::force_xcm_version(destination.clone(), xcm::v3::prelude::XCM_VERSION); // TODO: remove this block, when removing `xcm:v2` { @@ -95,7 +95,7 @@ fn send_xcm_through_opened_lane_with_different_xcm_version_on_hops_works() { // version, which does not have the `ExportMessage` instruction. If the default `2` is // changed to `3`, then this assert can go away" assert_err!( - send_asset_from_asset_hub_rococo(destination, (native_token, amount)), + send_asset_from_asset_hub_rococo(destination.clone(), (native_token.clone(), amount)), DispatchError::Module(sp_runtime::ModuleError { index: 31, error: [1, 0, 0, 0], @@ -110,7 +110,7 @@ fn send_xcm_through_opened_lane_with_different_xcm_version_on_hops_works() { ); // send XCM from AssetHubRococo - fails - `ExportMessage` is not in `2` assert_err!( - send_asset_from_asset_hub_rococo(destination, (native_token, amount)), + send_asset_from_asset_hub_rococo(destination.clone(), (native_token.clone(), amount)), DispatchError::Module(sp_runtime::ModuleError { index: 31, error: [1, 0, 0, 0], @@ -125,7 +125,10 @@ fn send_xcm_through_opened_lane_with_different_xcm_version_on_hops_works() { xcm::v3::prelude::XCM_VERSION, ); // send XCM from AssetHubRococo - ok - assert_ok!(send_asset_from_asset_hub_rococo(destination, (native_token, amount))); + assert_ok!(send_asset_from_asset_hub_rococo( + destination.clone(), + (native_token.clone(), amount) + )); // `ExportMessage` on local BridgeHub - fails - remote BridgeHub version not known assert_bridge_hub_rococo_message_accepted(false); @@ -142,7 +145,10 @@ fn send_xcm_through_opened_lane_with_different_xcm_version_on_hops_works() { ); // send XCM from AssetHubRococo - ok - assert_ok!(send_asset_from_asset_hub_rococo(destination, (native_token, amount))); + assert_ok!(send_asset_from_asset_hub_rococo( + destination.clone(), + (native_token.clone(), amount) + )); assert_bridge_hub_rococo_message_accepted(true); assert_bridge_hub_westend_message_received(); // message delivered and processed at destination diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs index 85547f210a7..fe0e479d8e5 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs @@ -61,7 +61,7 @@ fn create_agent() { let remote_xcm = VersionedXcm::from(Xcm(vec![ UnpaidExecution { weight_limit: Unlimited, check_origin: None }, - DescendOrigin(X1(Parachain(origin_para))), + DescendOrigin(Parachain(origin_para).into()), Transact { require_weight_at_most: 3000000000.into(), origin_kind: OriginKind::Xcm, @@ -109,14 +109,14 @@ fn create_channel() { BridgeHubRococo::fund_para_sovereign(origin_para.into(), INITIAL_FUND); let sudo_origin = ::RuntimeOrigin::root(); - let destination: VersionedMultiLocation = + let destination: VersionedLocation = Rococo::child_location_of(BridgeHubRococo::para_id()).into(); let create_agent_call = SnowbridgeControl::Control(ControlCall::CreateAgent {}); let create_agent_xcm = VersionedXcm::from(Xcm(vec![ UnpaidExecution { weight_limit: Unlimited, check_origin: None }, - DescendOrigin(X1(Parachain(origin_para))), + DescendOrigin(Parachain(origin_para).into()), Transact { require_weight_at_most: 3000000000.into(), origin_kind: OriginKind::Xcm, @@ -129,7 +129,7 @@ fn create_channel() { let create_channel_xcm = VersionedXcm::from(Xcm(vec![ UnpaidExecution { weight_limit: Unlimited, check_origin: None }, - DescendOrigin(X1(Parachain(origin_para))), + DescendOrigin(Parachain(origin_para).into()), Transact { require_weight_at_most: 3000000000.into(), origin_kind: OriginKind::Xcm, @@ -218,10 +218,10 @@ fn register_weth_token_from_ethereum_to_asset_hub() { #[test] fn send_token_from_ethereum_to_penpal() { - let asset_hub_sovereign = BridgeHubRococo::sovereign_account_id_of(MultiLocation { - parents: 1, - interior: X1(Parachain(AssetHubRococo::para_id().into())), - }); + let asset_hub_sovereign = BridgeHubRococo::sovereign_account_id_of(Location::new( + 1, + [Parachain(AssetHubRococo::para_id().into())], + )); BridgeHubRococo::fund_accounts(vec![(asset_hub_sovereign.clone(), INITIAL_FUND)]); PenpalA::fund_accounts(vec![ @@ -229,9 +229,9 @@ fn send_token_from_ethereum_to_penpal() { (PenpalASender::get(), INITIAL_FUND), ]); - let weth_asset_location: MultiLocation = + let weth_asset_location: Location = (Parent, Parent, EthereumNetwork::get(), AccountKey20 { network: None, key: WETH }).into(); - let weth_asset_id = weth_asset_location.into(); + let weth_asset_id: v3::Location = weth_asset_location.try_into().unwrap(); let origin_location = (Parent, Parent, EthereumNetwork::get()).into(); @@ -375,18 +375,15 @@ fn send_token_from_ethereum_to_asset_hub() { #[test] fn send_weth_asset_from_asset_hub_to_ethereum() { use asset_hub_rococo_runtime::xcm_config::bridging::to_ethereum::DefaultBridgeHubEthereumBaseFee; - let assethub_sovereign = BridgeHubRococo::sovereign_account_id_of(MultiLocation { - parents: 1, - interior: X1(Parachain(AssetHubRococo::para_id().into())), - }); + let assethub_sovereign = BridgeHubRococo::sovereign_account_id_of(Location::new( + 1, + [Parachain(AssetHubRococo::para_id().into())], + )); AssetHubRococo::force_default_xcm_version(Some(XCM_VERSION)); BridgeHubRococo::force_default_xcm_version(Some(XCM_VERSION)); AssetHubRococo::force_xcm_version( - MultiLocation { - parents: 2, - interior: X1(GlobalConsensus(Ethereum { chain_id: CHAIN_ID })), - }, + Location::new(2, [GlobalConsensus(Ethereum { chain_id: CHAIN_ID })]), XCM_VERSION, ); @@ -437,27 +434,27 @@ fn send_weth_asset_from_asset_hub_to_ethereum() { RuntimeEvent::ForeignAssets(pallet_assets::Event::Issued { .. }) => {}, ] ); - let assets = vec![MultiAsset { - id: Concrete(MultiLocation { - parents: 2, - interior: X2( + let assets = vec![Asset { + id: AssetId(Location::new( + 2, + [ GlobalConsensus(Ethereum { chain_id: CHAIN_ID }), AccountKey20 { network: None, key: WETH }, - ), - }), + ], + )), fun: Fungible(WETH_AMOUNT), }]; - let multi_assets = VersionedMultiAssets::V3(MultiAssets::from(assets)); + let multi_assets = VersionedAssets::V4(Assets::from(assets)); - let destination = VersionedMultiLocation::V3(MultiLocation { - parents: 2, - interior: X1(GlobalConsensus(Ethereum { chain_id: CHAIN_ID })), - }); + let destination = VersionedLocation::V4(Location::new( + 2, + [GlobalConsensus(Ethereum { chain_id: CHAIN_ID })], + )); - let beneficiary = VersionedMultiLocation::V3(MultiLocation { - parents: 0, - interior: X1(AccountKey20 { network: None, key: ETHEREUM_DESTINATION_ADDRESS.into() }), - }); + let beneficiary = VersionedLocation::V4(Location::new( + 0, + [AccountKey20 { network: None, key: ETHEREUM_DESTINATION_ADDRESS.into() }], + )); let free_balance_before = ::Balances::free_balance( AssetHubRococoReceiver::get(), diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/teleport.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/teleport.rs index f00288a4d8c..43f8af9244f 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/teleport.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/teleport.rs @@ -19,7 +19,7 @@ use bridge_hub_rococo_runtime::xcm_config::XcmConfig; #[test] fn teleport_to_other_system_parachains_works() { let amount = BRIDGE_HUB_ROCOCO_ED * 100; - let native_asset: MultiAssets = (Parent, amount).into(); + let native_asset: Assets = (Parent, amount).into(); test_parachain_is_trusted_teleporter!( BridgeHubRococo, // Origin diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/lib.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/lib.rs index 17255320f1d..223979cc9c9 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/lib.rs @@ -21,7 +21,8 @@ pub use sp_runtime::DispatchError; pub use xcm::{ latest::ParentThen, prelude::{AccountId32 as AccountId32Junction, *}, - v3::{ + v3, + v4::{ Error, NetworkId::{Rococo as RococoId, Westend as WestendId}, }, diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/asset_transfers.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/asset_transfers.rs index a4b2719e9fd..c2a9c008902 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/asset_transfers.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/asset_transfers.rs @@ -14,14 +14,14 @@ // limitations under the License. use crate::tests::*; -fn send_asset_from_asset_hub_westend_to_asset_hub_rococo(id: MultiLocation, amount: u128) { +fn send_asset_from_asset_hub_westend_to_asset_hub_rococo(id: Location, amount: u128) { let destination = asset_hub_rococo_location(); // fund the AHW's SA on BHW for paying bridge transport fees BridgeHubWestend::fund_para_sovereign(AssetHubWestend::para_id(), 10_000_000_000_000u128); // set XCM versions - AssetHubWestend::force_xcm_version(destination, XCM_VERSION); + AssetHubWestend::force_xcm_version(destination.clone(), XCM_VERSION); BridgeHubWestend::force_xcm_version(bridge_hub_rococo_location(), XCM_VERSION); // send message over bridge @@ -32,9 +32,9 @@ fn send_asset_from_asset_hub_westend_to_asset_hub_rococo(id: MultiLocation, amou #[test] fn send_wnds_from_asset_hub_westend_to_asset_hub_rococo() { - let wnd_at_asset_hub_westend: MultiLocation = Parent.into(); + let wnd_at_asset_hub_westend: Location = Parent.into(); let wnd_at_asset_hub_rococo = - MultiLocation { parents: 2, interior: X1(GlobalConsensus(NetworkId::Westend)) }; + v3::Location::new(2, [v3::Junction::GlobalConsensus(v3::NetworkId::Westend)]); let owner: AccountId = AssetHubRococo::account_id_of(ALICE); AssetHubRococo::force_create_foreign_asset( wnd_at_asset_hub_rococo, @@ -61,7 +61,7 @@ fn send_wnds_from_asset_hub_westend_to_asset_hub_rococo() { assert_ok!(::AssetConversion::create_pool( ::RuntimeOrigin::signed(AssetHubRococoSender::get()), - Box::new(Parent.into()), + Box::new(xcm::v3::Parent.into()), Box::new(wnd_at_asset_hub_rococo), )); @@ -74,7 +74,7 @@ fn send_wnds_from_asset_hub_westend_to_asset_hub_rococo() { assert_ok!(::AssetConversion::add_liquidity( ::RuntimeOrigin::signed(AssetHubRococoSender::get()), - Box::new(Parent.into()), + Box::new(xcm::v3::Parent.into()), Box::new(wnd_at_asset_hub_rococo), 1_000_000_000_000, 2_000_000_000_000, @@ -141,7 +141,7 @@ fn send_wnds_from_asset_hub_westend_to_asset_hub_rococo() { fn send_rocs_from_asset_hub_westend_to_asset_hub_rococo() { let prefund_amount = 10_000_000_000_000u128; let roc_at_asset_hub_westend = - MultiLocation { parents: 2, interior: X1(GlobalConsensus(NetworkId::Rococo)) }; + v3::Location::new(2, [v3::Junction::GlobalConsensus(v3::NetworkId::Rococo)]); let owner: AccountId = AssetHubWestend::account_id_of(ALICE); AssetHubWestend::force_create_foreign_asset( roc_at_asset_hub_westend, @@ -169,8 +169,12 @@ fn send_rocs_from_asset_hub_westend_to_asset_hub_rococo() { let receiver_rocs_before = ::account_data_of(AssetHubRococoReceiver::get()).free; + let roc_at_asset_hub_westend_latest: Location = roc_at_asset_hub_westend.try_into().unwrap(); let amount_to_send = ASSET_HUB_ROCOCO_ED * 1_000; - send_asset_from_asset_hub_westend_to_asset_hub_rococo(roc_at_asset_hub_westend, amount_to_send); + send_asset_from_asset_hub_westend_to_asset_hub_rococo( + roc_at_asset_hub_westend_latest.clone(), + amount_to_send, + ); AssetHubRococo::execute_with(|| { type RuntimeEvent = ::RuntimeEvent; assert_expected_events!( diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/mod.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/mod.rs index ec2e68fc889..186b96b3976 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/mod.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/mod.rs @@ -19,37 +19,31 @@ mod asset_transfers; mod send_xcm; mod teleport; -pub(crate) fn asset_hub_rococo_location() -> MultiLocation { - MultiLocation { - parents: 2, - interior: X2( - GlobalConsensus(NetworkId::Rococo), - Parachain(AssetHubRococo::para_id().into()), - ), - } +pub(crate) fn asset_hub_rococo_location() -> Location { + Location::new( + 2, + [GlobalConsensus(NetworkId::Rococo), Parachain(AssetHubRococo::para_id().into())], + ) } -pub(crate) fn bridge_hub_rococo_location() -> MultiLocation { - MultiLocation { - parents: 2, - interior: X2( - GlobalConsensus(NetworkId::Rococo), - Parachain(BridgeHubRococo::para_id().into()), - ), - } +pub(crate) fn bridge_hub_rococo_location() -> Location { + Location::new( + 2, + [GlobalConsensus(NetworkId::Rococo), Parachain(BridgeHubRococo::para_id().into())], + ) } pub(crate) fn send_asset_from_asset_hub_westend( - destination: MultiLocation, - (id, amount): (MultiLocation, u128), + destination: Location, + (id, amount): (Location, u128), ) -> DispatchResult { let signed_origin = ::RuntimeOrigin::signed(AssetHubWestendSender::get().into()); - let beneficiary: MultiLocation = + let beneficiary: Location = AccountId32Junction { network: None, id: AssetHubRococoReceiver::get().into() }.into(); - let assets: MultiAssets = (id, amount).into(); + let assets: Assets = (id, amount).into(); let fee_asset_item = 0; AssetHubWestend::execute_with(|| { diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/send_xcm.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/send_xcm.rs index 0773cbb0599..b01be5e8dc8 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/send_xcm.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/send_xcm.rs @@ -30,7 +30,7 @@ fn send_xcm_from_westend_relay_to_rococo_asset_hub_should_fail_on_not_applicable UnpaidExecution { weight_limit, check_origin }, ExportMessage { network: RococoId, - destination: X1(Parachain(AssetHubRococo::para_id().into())), + destination: [Parachain(AssetHubRococo::para_id().into())].into(), xcm: remote_xcm, }, ])); @@ -68,7 +68,7 @@ fn send_xcm_through_opened_lane_with_different_xcm_version_on_hops_works() { // prepare data let destination = asset_hub_rococo_location(); - let native_token = MultiLocation::parent(); + let native_token = Location::parent(); let amount = ASSET_HUB_WESTEND_ED * 1_000; // fund the AHR's SA on BHR for paying bridge transport fees @@ -78,7 +78,7 @@ fn send_xcm_through_opened_lane_with_different_xcm_version_on_hops_works() { // send XCM from AssetHubWestend - fails - destination version not known assert_err!( - send_asset_from_asset_hub_westend(destination, (native_token, amount)), + send_asset_from_asset_hub_westend(destination.clone(), (native_token.clone(), amount)), DispatchError::Module(sp_runtime::ModuleError { index: 31, error: [1, 0, 0, 0], @@ -87,7 +87,7 @@ fn send_xcm_through_opened_lane_with_different_xcm_version_on_hops_works() { ); // set destination version - AssetHubWestend::force_xcm_version(destination, xcm::v3::prelude::XCM_VERSION); + AssetHubWestend::force_xcm_version(destination.clone(), xcm::v3::prelude::XCM_VERSION); // TODO: remove this block, when removing `xcm:v2` { @@ -95,7 +95,7 @@ fn send_xcm_through_opened_lane_with_different_xcm_version_on_hops_works() { // version, which does not have the `ExportMessage` instruction. If the default `2` is // changed to `3`, then this assert can go away" assert_err!( - send_asset_from_asset_hub_westend(destination, (native_token, amount)), + send_asset_from_asset_hub_westend(destination.clone(), (native_token.clone(), amount)), DispatchError::Module(sp_runtime::ModuleError { index: 31, error: [1, 0, 0, 0], @@ -110,7 +110,7 @@ fn send_xcm_through_opened_lane_with_different_xcm_version_on_hops_works() { ); // send XCM from AssetHubWestend - fails - `ExportMessage` is not in `2` assert_err!( - send_asset_from_asset_hub_westend(destination, (native_token, amount)), + send_asset_from_asset_hub_westend(destination.clone(), (native_token.clone(), amount)), DispatchError::Module(sp_runtime::ModuleError { index: 31, error: [1, 0, 0, 0], @@ -125,7 +125,10 @@ fn send_xcm_through_opened_lane_with_different_xcm_version_on_hops_works() { xcm::v3::prelude::XCM_VERSION, ); // send XCM from AssetHubWestend - ok - assert_ok!(send_asset_from_asset_hub_westend(destination, (native_token, amount))); + assert_ok!(send_asset_from_asset_hub_westend( + destination.clone(), + (native_token.clone(), amount) + )); // `ExportMessage` on local BridgeHub - fails - remote BridgeHub version not known assert_bridge_hub_westend_message_accepted(false); @@ -142,7 +145,10 @@ fn send_xcm_through_opened_lane_with_different_xcm_version_on_hops_works() { ); // send XCM from AssetHubWestend - ok - assert_ok!(send_asset_from_asset_hub_westend(destination, (native_token, amount))); + assert_ok!(send_asset_from_asset_hub_westend( + destination.clone(), + (native_token.clone(), amount) + )); assert_bridge_hub_westend_message_accepted(true); assert_bridge_hub_rococo_message_received(); // message delivered and processed at destination diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/teleport.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/teleport.rs index 8dff6c29295..edffaf16596 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/teleport.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/src/tests/teleport.rs @@ -19,7 +19,7 @@ use bridge_hub_westend_runtime::xcm_config::XcmConfig; #[test] fn teleport_to_other_system_parachains_works() { let amount = BRIDGE_HUB_WESTEND_ED * 100; - let native_asset: MultiAssets = (Parent, amount).into(); + let native_asset: Assets = (Parent, amount).into(); test_parachain_is_trusted_teleporter!( BridgeHubWestend, // Origin diff --git a/cumulus/parachains/pallets/ping/src/lib.rs b/cumulus/parachains/pallets/ping/src/lib.rs index feda3d0b6f9..a738c05e036 100644 --- a/cumulus/parachains/pallets/ping/src/lib.rs +++ b/cumulus/parachains/pallets/ping/src/lib.rs @@ -77,9 +77,9 @@ pub mod pallet { #[pallet::event] #[pallet::generate_deposit(pub(super) fn deposit_event)] pub enum Event { - PingSent(ParaId, u32, Vec, XcmHash, MultiAssets), + PingSent(ParaId, u32, Vec, XcmHash, Assets), Pinged(ParaId, u32, Vec), - PongSent(ParaId, u32, Vec, XcmHash, MultiAssets), + PongSent(ParaId, u32, Vec, XcmHash, Assets), Ponged(ParaId, u32, Vec, BlockNumberFor), ErrorSendingPing(SendError, ParaId, u32, Vec), ErrorSendingPong(SendError, ParaId, u32, Vec), diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs index 8cfa4565187..53b41892685 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs @@ -31,7 +31,7 @@ use assets_common::{ foreign_creators::ForeignCreators, local_and_foreign_assets::{LocalFromLeft, TargetFromLeft}, matching::{FromNetwork, FromSiblingParachain}, - AssetIdForTrustBackedAssetsConvert, MultiLocationForAssetId, + AssetIdForTrustBackedAssetsConvert, }; use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; use cumulus_primitives_core::AggregateMessageOrigin; @@ -80,13 +80,11 @@ use parachains_common::{ Signature, AVERAGE_ON_INITIALIZE_RATIO, DAYS, HOURS, MAXIMUM_BLOCK_WEIGHT, NORMAL_DISPATCH_RATIO, SLOT_DURATION, }; - use sp_runtime::{Perbill, RuntimeDebug}; -use xcm::opaque::v3::MultiLocation; use xcm_config::{ ForeignAssetsConvertedConcreteId, ForeignCreatorsSovereignAccountOf, GovernanceLocation, - PoolAssetsConvertedConcreteId, TokenLocation, TrustBackedAssetsConvertedConcreteId, - TrustBackedAssetsPalletLocation, + PoolAssetsConvertedConcreteId, TokenLocation, TokenLocationV3, + TrustBackedAssetsConvertedConcreteId, TrustBackedAssetsPalletLocationV3, }; #[cfg(any(feature = "std", test))] @@ -95,7 +93,13 @@ pub use sp_runtime::BuildStorage; // Polkadot imports use pallet_xcm::{EnsureXcm, IsVoiceOfBody}; use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; -use xcm::latest::prelude::*; +// We exclude `Assets` since it's the name of a pallet +#[cfg(feature = "runtime-benchmarks")] +use xcm::latest::prelude::{ + Asset, Fungible, Here, InteriorLocation, Junction, Junction::*, Location, NetworkId, + NonFungible, Parent, ParentThen, Response, XCM_VERSION, +}; +use xcm::latest::prelude::{AssetId, BodyId}; use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; @@ -317,10 +321,11 @@ pub type LocalAndForeignAssets = fungibles::UnionOf< Assets, ForeignAssets, LocalFromLeft< - AssetIdForTrustBackedAssetsConvert, + AssetIdForTrustBackedAssetsConvert, AssetIdForTrustBackedAssets, + xcm::v3::Location, >, - MultiLocation, + xcm::v3::Location, AccountId, >; @@ -328,8 +333,8 @@ pub type LocalAndForeignAssets = fungibles::UnionOf< pub type NativeAndAssets = fungible::UnionOf< Balances, LocalAndForeignAssets, - TargetFromLeft, - MultiLocation, + TargetFromLeft, + xcm::v3::Location, AccountId, >; @@ -337,15 +342,15 @@ impl pallet_asset_conversion::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Balance = Balance; type HigherPrecisionBalance = sp_core::U256; - type AssetKind = MultiLocation; + type AssetKind = xcm::v3::Location; type Assets = NativeAndAssets; type PoolId = (Self::AssetKind, Self::AssetKind); type PoolLocator = - pallet_asset_conversion::WithFirstAsset; + pallet_asset_conversion::WithFirstAsset; type PoolAssetId = u32; type PoolAssets = PoolAssets; type PoolSetupFee = ConstU128<0>; // Asset class deposit fees are sufficient to prevent spam - type PoolSetupFeeAsset = TokenLocation; + type PoolSetupFeeAsset = TokenLocationV3; type PoolSetupFeeTarget = ResolveAssetTo; type LiquidityWithdrawalFee = LiquidityWithdrawalFee; type LPFee = ConstU32<3>; @@ -355,9 +360,10 @@ impl pallet_asset_conversion::Config for Runtime { type WeightInfo = weights::pallet_asset_conversion::WeightInfo; #[cfg(feature = "runtime-benchmarks")] type BenchmarkHelper = assets_common::benchmarks::AssetPairFactory< - TokenLocation, + TokenLocationV3, parachain_info::Pallet, - xcm_config::AssetsPalletIndex, + xcm_config::TrustBackedAssetsPalletIndex, + xcm::v3::Location, >; } @@ -379,16 +385,17 @@ pub type ForeignAssetsInstance = pallet_assets::Instance2; impl pallet_assets::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Balance = Balance; - type AssetId = MultiLocationForAssetId; - type AssetIdParameter = MultiLocationForAssetId; + type AssetId = xcm::v3::MultiLocation; + type AssetIdParameter = xcm::v3::MultiLocation; type Currency = Balances; type CreateOrigin = ForeignCreators< ( - FromSiblingParachain>, - FromNetwork, + FromSiblingParachain, xcm::v3::Location>, + FromNetwork, ), ForeignCreatorsSovereignAccountOf, AccountId, + xcm::v3::Location, >; type ForceOrigin = AssetsForceOrigin; type AssetDeposit = ForeignAssetsAssetDeposit; @@ -664,7 +671,7 @@ impl cumulus_pallet_aura_ext::Config for Runtime {} parameter_types! { /// The asset ID for the asset that we use to pay for message delivery fees. - pub FeeAssetId: AssetId = Concrete(xcm_config::TokenLocation::get()); + pub FeeAssetId: AssetId = AssetId(xcm_config::TokenLocation::get()); /// The base fee for the message delivery fees. pub const BaseDeliveryFee: u128 = CENTS.saturating_mul(3); } @@ -753,7 +760,7 @@ impl pallet_asset_conversion_tx_payment::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Fungibles = LocalAndForeignAssets; type OnChargeAssetTransaction = - AssetConversionAdapter; + AssetConversionAdapter; } parameter_types! { @@ -1157,18 +1164,16 @@ impl_runtime_apis! { impl pallet_asset_conversion::AssetConversionApi< Block, Balance, - MultiLocation, + xcm::v3::Location, > for Runtime { - fn quote_price_exact_tokens_for_tokens(asset1: MultiLocation, asset2: MultiLocation, amount: Balance, include_fee: bool) -> Option { + fn quote_price_exact_tokens_for_tokens(asset1: xcm::v3::Location, asset2: xcm::v3::Location, amount: Balance, include_fee: bool) -> Option { AssetConversion::quote_price_exact_tokens_for_tokens(asset1, asset2, amount, include_fee) } - - fn quote_price_tokens_for_exact_tokens(asset1: MultiLocation, asset2: MultiLocation, amount: Balance, include_fee: bool) -> Option { + fn quote_price_tokens_for_exact_tokens(asset1: xcm::v3::Location, asset2: xcm::v3::Location, amount: Balance, include_fee: bool) -> Option { AssetConversion::quote_price_tokens_for_exact_tokens(asset1, asset2, amount, include_fee) } - - fn get_reserves(asset1: MultiLocation, asset2: MultiLocation) -> Option<(Balance, Balance)> { + fn get_reserves(asset1: xcm::v3::Location, asset2: xcm::v3::Location) -> Option<(Balance, Balance)> { AssetConversion::get_reserves(asset1, asset2).ok() } } @@ -1222,7 +1227,7 @@ impl_runtime_apis! { AccountId, > for Runtime { - fn query_account_balances(account: AccountId) -> Result { + fn query_account_balances(account: AccountId) -> Result { use assets_common::fungible_conversion::{convert, convert_balance}; Ok([ // collect pallet_balance @@ -1346,45 +1351,45 @@ impl_runtime_apis! { use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsicsBenchmark; impl pallet_xcm::benchmarking::Config for Runtime { - fn reachable_dest() -> Option { + fn reachable_dest() -> Option { Some(Parent.into()) } - fn teleportable_asset_and_dest() -> Option<(MultiAsset, MultiLocation)> { + fn teleportable_asset_and_dest() -> Option<(Asset, Location)> { // Relay/native token can be teleported between AH and Relay. Some(( - MultiAsset { + Asset { fun: Fungible(EXISTENTIAL_DEPOSIT), - id: Concrete(Parent.into()) + id: AssetId(Parent.into()) }, Parent.into(), )) } - fn reserve_transferable_asset_and_dest() -> Option<(MultiAsset, MultiLocation)> { + fn reserve_transferable_asset_and_dest() -> Option<(Asset, Location)> { // AH can reserve transfer native token to some random parachain. let random_para_id = 43211234; ParachainSystem::open_outbound_hrmp_channel_for_benchmarks_or_tests( random_para_id.into() ); Some(( - MultiAsset { + Asset { fun: Fungible(EXISTENTIAL_DEPOSIT), - id: Concrete(Parent.into()) + id: AssetId(Parent.into()) }, ParentThen(Parachain(random_para_id).into()).into(), )) } fn set_up_complex_asset_transfer( - ) -> Option<(MultiAssets, u32, MultiLocation, Box)> { + ) -> Option<(xcm::v4::Assets, u32, Location, Box)> { // Transfer to Relay some local AH asset (local-reserve-transfer) while paying // fees using teleported native token. // (We don't care that Relay doesn't accept incoming unknown AH local asset) let dest = Parent.into(); let fee_amount = EXISTENTIAL_DEPOSIT; - let fee_asset: MultiAsset = (MultiLocation::parent(), fee_amount).into(); + let fee_asset: Asset = (Location::parent(), fee_amount).into(); let who = frame_benchmarking::whitelisted_caller(); // Give some multiple of the existential deposit @@ -1402,13 +1407,13 @@ impl_runtime_apis! { Runtime, pallet_assets::Instance1 >(true, initial_asset_amount); - let asset_location = MultiLocation::new( + let asset_location = Location::new( 0, - X2(PalletInstance(50), GeneralIndex(u32::from(asset_id).into())) + [PalletInstance(50), GeneralIndex(u32::from(asset_id).into())] ); - let transfer_asset: MultiAsset = (asset_location, asset_amount).into(); + let transfer_asset: Asset = (asset_location, asset_amount).into(); - let assets: MultiAssets = vec![fee_asset.clone(), transfer_asset].into(); + let assets: xcm::v4::Assets = vec![fee_asset.clone(), transfer_asset].into(); let fee_index = if assets.get(0).unwrap().eq(&fee_asset) { 0 } else { 1 }; // verify transferred successfully @@ -1432,14 +1437,14 @@ impl_runtime_apis! { xcm_config::bridging::SiblingBridgeHubParaId::get().into() ); } - fn ensure_bridged_target_destination() -> Result { + fn ensure_bridged_target_destination() -> Result { ParachainSystem::open_outbound_hrmp_channel_for_benchmarks_or_tests( xcm_config::bridging::SiblingBridgeHubParaId::get().into() ); let bridged_asset_hub = xcm_config::bridging::to_westend::AssetHubWestend::get(); let _ = PolkadotXcm::force_xcm_version( RuntimeOrigin::root(), - Box::new(bridged_asset_hub), + Box::new(bridged_asset_hub.clone()), XCM_VERSION, ).map_err(|e| { log::error!( @@ -1455,12 +1460,11 @@ impl_runtime_apis! { } } - use xcm::latest::prelude::*; use xcm_config::{TokenLocation, MaxAssetsIntoHolding}; use pallet_xcm_benchmarks::asset_instance_from; parameter_types! { - pub ExistentialDepositMultiAsset: Option = Some(( + pub ExistentialDepositAsset: Option = Some(( TokenLocation::get(), ExistentialDeposit::get() ).into()); @@ -1471,33 +1475,33 @@ impl_runtime_apis! { type AccountIdConverter = xcm_config::LocationToAccountId; type DeliveryHelper = cumulus_primitives_utility::ToParentDeliveryHelper< xcm_config::XcmConfig, - ExistentialDepositMultiAsset, + ExistentialDepositAsset, xcm_config::PriceForParentDelivery, >; - fn valid_destination() -> Result { + fn valid_destination() -> Result { Ok(TokenLocation::get()) } - fn worst_case_holding(depositable_count: u32) -> MultiAssets { + fn worst_case_holding(depositable_count: u32) -> xcm::v4::Assets { // A mix of fungible, non-fungible, and concrete assets. let holding_non_fungibles = MaxAssetsIntoHolding::get() / 2 - depositable_count; let holding_fungibles = holding_non_fungibles.saturating_sub(1); let fungibles_amount: u128 = 100; let mut assets = (0..holding_fungibles) .map(|i| { - MultiAsset { - id: Concrete(GeneralIndex(i as u128).into()), + Asset { + id: GeneralIndex(i as u128).into(), fun: Fungible(fungibles_amount * i as u128), } }) - .chain(core::iter::once(MultiAsset { id: Concrete(Here.into()), fun: Fungible(u128::MAX) })) - .chain((0..holding_non_fungibles).map(|i| MultiAsset { - id: Concrete(GeneralIndex(i as u128).into()), + .chain(core::iter::once(Asset { id: Here.into(), fun: Fungible(u128::MAX) })) + .chain((0..holding_non_fungibles).map(|i| Asset { + id: GeneralIndex(i as u128).into(), fun: NonFungible(asset_instance_from(i)), })) .collect::>(); - assets.push(MultiAsset { - id: Concrete(TokenLocation::get()), + assets.push(Asset { + id: AssetId(TokenLocation::get()), fun: Fungible(1_000_000 * UNITS), }); assets.into() @@ -1505,16 +1509,16 @@ impl_runtime_apis! { } parameter_types! { - pub const TrustedTeleporter: Option<(MultiLocation, MultiAsset)> = Some(( + pub const TrustedTeleporter: Option<(Location, Asset)> = Some(( TokenLocation::get(), - MultiAsset { fun: Fungible(UNITS), id: Concrete(TokenLocation::get()) }, + Asset { fun: Fungible(UNITS), id: AssetId(TokenLocation::get()) }, )); pub const CheckedAccount: Option<(AccountId, xcm_builder::MintLocation)> = None; // AssetHubRococo trusts AssetHubWestend as reserve for WNDs - pub TrustedReserve: Option<(MultiLocation, MultiAsset)> = Some( + pub TrustedReserve: Option<(Location, Asset)> = Some( ( xcm_config::bridging::to_westend::AssetHubWestend::get(), - MultiAsset::from((xcm_config::bridging::to_westend::WndLocation::get(), 1000000000000 as u128)) + Asset::from((xcm_config::bridging::to_westend::WndLocation::get(), 1000000000000 as u128)) ) ); } @@ -1526,9 +1530,9 @@ impl_runtime_apis! { type TrustedTeleporter = TrustedTeleporter; type TrustedReserve = TrustedReserve; - fn get_multi_asset() -> MultiAsset { - MultiAsset { - id: Concrete(TokenLocation::get()), + fn get_asset() -> Asset { + Asset { + id: AssetId(TokenLocation::get()), fun: Fungible(UNITS), } } @@ -1542,42 +1546,42 @@ impl_runtime_apis! { (0u64, Response::Version(Default::default())) } - fn worst_case_asset_exchange() -> Result<(MultiAssets, MultiAssets), BenchmarkError> { + fn worst_case_asset_exchange() -> Result<(xcm::v4::Assets, xcm::v4::Assets), BenchmarkError> { Err(BenchmarkError::Skip) } - fn universal_alias() -> Result<(MultiLocation, Junction), BenchmarkError> { + fn universal_alias() -> Result<(Location, Junction), BenchmarkError> { match xcm_config::bridging::BridgingBenchmarksHelper::prepare_universal_alias() { Some(alias) => Ok(alias), None => Err(BenchmarkError::Skip) } } - fn transact_origin_and_runtime_call() -> Result<(MultiLocation, RuntimeCall), BenchmarkError> { + fn transact_origin_and_runtime_call() -> Result<(Location, RuntimeCall), BenchmarkError> { Ok((TokenLocation::get(), frame_system::Call::remark_with_event { remark: vec![] }.into())) } - fn subscribe_origin() -> Result { + fn subscribe_origin() -> Result { Ok(TokenLocation::get()) } - fn claimable_asset() -> Result<(MultiLocation, MultiLocation, MultiAssets), BenchmarkError> { + fn claimable_asset() -> Result<(Location, Location, xcm::v4::Assets), BenchmarkError> { let origin = TokenLocation::get(); - let assets: MultiAssets = (Concrete(TokenLocation::get()), 1_000 * UNITS).into(); - let ticket = MultiLocation { parents: 0, interior: Here }; + let assets: xcm::v4::Assets = (TokenLocation::get(), 1_000 * UNITS).into(); + let ticket = Location { parents: 0, interior: Here }; Ok((origin, ticket, assets)) } - fn unlockable_asset() -> Result<(MultiLocation, MultiLocation, MultiAsset), BenchmarkError> { + fn unlockable_asset() -> Result<(Location, Location, Asset), BenchmarkError> { Err(BenchmarkError::Skip) } fn export_message_origin_and_destination( - ) -> Result<(MultiLocation, NetworkId, InteriorMultiLocation), BenchmarkError> { + ) -> Result<(Location, NetworkId, InteriorLocation), BenchmarkError> { Err(BenchmarkError::Skip) } - fn alias_origin() -> Result<(MultiLocation, MultiLocation), BenchmarkError> { + fn alias_origin() -> Result<(Location, Location), BenchmarkError> { Err(BenchmarkError::Skip) } } diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/xcm/mod.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/xcm/mod.rs index 2fbbd61654b..8e675ad0cf8 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/xcm/mod.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/weights/xcm/mod.rs @@ -24,14 +24,14 @@ use pallet_xcm_benchmarks_generic::WeightInfo as XcmGeneric; use sp_std::prelude::*; use xcm::{latest::prelude::*, DoubleEncoded}; -trait WeighMultiAssets { - fn weigh_multi_assets(&self, weight: Weight) -> Weight; +trait WeighAssets { + fn weigh_assets(&self, weight: Weight) -> Weight; } const MAX_ASSETS: u64 = 100; -impl WeighMultiAssets for MultiAssetFilter { - fn weigh_multi_assets(&self, weight: Weight) -> Weight { +impl WeighAssets for AssetFilter { + fn weigh_assets(&self, weight: Weight) -> Weight { match self { Self::Definite(assets) => weight.saturating_mul(assets.inner().iter().count() as u64), Self::Wild(asset) => match asset { @@ -50,40 +50,36 @@ impl WeighMultiAssets for MultiAssetFilter { } } -impl WeighMultiAssets for MultiAssets { - fn weigh_multi_assets(&self, weight: Weight) -> Weight { +impl WeighAssets for Assets { + fn weigh_assets(&self, weight: Weight) -> Weight { weight.saturating_mul(self.inner().iter().count() as u64) } } pub struct AssetHubRococoXcmWeight(core::marker::PhantomData); impl XcmWeightInfo for AssetHubRococoXcmWeight { - fn withdraw_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::withdraw_asset()) + fn withdraw_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::withdraw_asset()) } - fn reserve_asset_deposited(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::reserve_asset_deposited()) + fn reserve_asset_deposited(assets: &Assets) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::reserve_asset_deposited()) } - fn receive_teleported_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::receive_teleported_asset()) + fn receive_teleported_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::receive_teleported_asset()) } fn query_response( _query_id: &u64, _response: &Response, _max_weight: &Weight, - _querier: &Option, + _querier: &Option, ) -> Weight { XcmGeneric::::query_response() } - fn transfer_asset(assets: &MultiAssets, _dest: &MultiLocation) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::transfer_asset()) + fn transfer_asset(assets: &Assets, _dest: &Location) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::transfer_asset()) } - fn transfer_reserve_asset( - assets: &MultiAssets, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::transfer_reserve_asset()) + fn transfer_reserve_asset(assets: &Assets, _dest: &Location, _xcm: &Xcm<()>) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::transfer_reserve_asset()) } fn transact( _origin_type: &OriginKind, @@ -111,43 +107,35 @@ impl XcmWeightInfo for AssetHubRococoXcmWeight { fn clear_origin() -> Weight { XcmGeneric::::clear_origin() } - fn descend_origin(_who: &InteriorMultiLocation) -> Weight { + fn descend_origin(_who: &InteriorLocation) -> Weight { XcmGeneric::::descend_origin() } fn report_error(_query_response_info: &QueryResponseInfo) -> Weight { XcmGeneric::::report_error() } - fn deposit_asset(assets: &MultiAssetFilter, _dest: &MultiLocation) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::deposit_asset()) + fn deposit_asset(assets: &AssetFilter, _dest: &Location) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::deposit_asset()) } - fn deposit_reserve_asset( - assets: &MultiAssetFilter, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::deposit_reserve_asset()) + fn deposit_reserve_asset(assets: &AssetFilter, _dest: &Location, _xcm: &Xcm<()>) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::deposit_reserve_asset()) } - fn exchange_asset(_give: &MultiAssetFilter, _receive: &MultiAssets, _maximal: &bool) -> Weight { + fn exchange_asset(_give: &AssetFilter, _receive: &Assets, _maximal: &bool) -> Weight { Weight::MAX } fn initiate_reserve_withdraw( - assets: &MultiAssetFilter, - _reserve: &MultiLocation, + assets: &AssetFilter, + _reserve: &Location, _xcm: &Xcm<()>, ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::initiate_reserve_withdraw()) + assets.weigh_assets(XcmFungibleWeight::::initiate_reserve_withdraw()) } - fn initiate_teleport( - assets: &MultiAssetFilter, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::initiate_teleport()) + fn initiate_teleport(assets: &AssetFilter, _dest: &Location, _xcm: &Xcm<()>) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::initiate_teleport()) } - fn report_holding(_response_info: &QueryResponseInfo, _assets: &MultiAssetFilter) -> Weight { + fn report_holding(_response_info: &QueryResponseInfo, _assets: &AssetFilter) -> Weight { XcmGeneric::::report_holding() } - fn buy_execution(_fees: &MultiAsset, _weight_limit: &WeightLimit) -> Weight { + fn buy_execution(_fees: &Asset, _weight_limit: &WeightLimit) -> Weight { XcmGeneric::::buy_execution() } fn refund_surplus() -> Weight { @@ -162,7 +150,7 @@ impl XcmWeightInfo for AssetHubRococoXcmWeight { fn clear_error() -> Weight { XcmGeneric::::clear_error() } - fn claim_asset(_assets: &MultiAssets, _ticket: &MultiLocation) -> Weight { + fn claim_asset(_assets: &Assets, _ticket: &Location) -> Weight { XcmGeneric::::claim_asset() } fn trap(_code: &u64) -> Weight { @@ -174,13 +162,13 @@ impl XcmWeightInfo for AssetHubRococoXcmWeight { fn unsubscribe_version() -> Weight { XcmGeneric::::unsubscribe_version() } - fn burn_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmGeneric::::burn_asset()) + fn burn_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmGeneric::::burn_asset()) } - fn expect_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmGeneric::::expect_asset()) + fn expect_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmGeneric::::expect_asset()) } - fn expect_origin(_origin: &Option) -> Weight { + fn expect_origin(_origin: &Option) -> Weight { XcmGeneric::::expect_origin() } fn expect_error(_error: &Option<(u32, XcmError)>) -> Weight { @@ -213,16 +201,16 @@ impl XcmWeightInfo for AssetHubRococoXcmWeight { fn export_message(_: &NetworkId, _: &Junctions, _: &Xcm<()>) -> Weight { Weight::MAX } - fn lock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn lock_asset(_: &Asset, _: &Location) -> Weight { Weight::MAX } - fn unlock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn unlock_asset(_: &Asset, _: &Location) -> Weight { Weight::MAX } - fn note_unlockable(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn note_unlockable(_: &Asset, _: &Location) -> Weight { Weight::MAX } - fn request_unlock(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn request_unlock(_: &Asset, _: &Location) -> Weight { Weight::MAX } fn set_fees_mode(_: &bool) -> Weight { @@ -234,11 +222,11 @@ impl XcmWeightInfo for AssetHubRococoXcmWeight { fn clear_topic() -> Weight { XcmGeneric::::clear_topic() } - fn alias_origin(_: &MultiLocation) -> Weight { + fn alias_origin(_: &Location) -> Weight { // XCM Executor does not currently support alias origin operations Weight::MAX } - fn unpaid_execution(_: &WeightLimit, _: &Option) -> Weight { + fn unpaid_execution(_: &WeightLimit, _: &Option) -> Weight { XcmGeneric::::unpaid_execution() } } diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs index f88d1066488..98b23efc06e 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs @@ -20,12 +20,12 @@ use super::{ ToWestendXcmRouter, TransactionByteFee, TrustBackedAssetsInstance, WeightToFee, XcmpQueue, }; use assets_common::{ - local_and_foreign_assets::MatchesLocalAndForeignAssetsMultiLocation, + local_and_foreign_assets::MatchesLocalAndForeignAssetsLocation, matching::{FromNetwork, FromSiblingParachain, IsForeignConcreteAsset}, - TrustBackedAssetsAsMultiLocation, + TrustBackedAssetsAsLocation, }; use frame_support::{ - match_types, parameter_types, + parameter_types, traits::{ tokens::imbalance::ResolveAssetTo, ConstU32, Contains, Equals, Everything, Nothing, PalletInfoAccess, @@ -64,26 +64,32 @@ use xcm_builder::{ use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; parameter_types! { - pub const TokenLocation: MultiLocation = MultiLocation::parent(); + pub const TokenLocation: Location = Location::parent(); + pub const TokenLocationV3: xcm::v3::Location = xcm::v3::Location::parent(); pub const RelayNetwork: NetworkId = NetworkId::Rococo; pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); - pub UniversalLocation: InteriorMultiLocation = - X2(GlobalConsensus(RelayNetwork::get()), Parachain(ParachainInfo::parachain_id().into())); + pub UniversalLocation: InteriorLocation = + [GlobalConsensus(RelayNetwork::get()), Parachain(ParachainInfo::parachain_id().into())].into(); pub UniversalLocationNetworkId: NetworkId = UniversalLocation::get().global_consensus().unwrap(); - pub AssetsPalletIndex: u32 = ::index() as u32; - pub TrustBackedAssetsPalletLocation: MultiLocation = PalletInstance(AssetsPalletIndex::get() as u8).into(); - pub ForeignAssetsPalletLocation: MultiLocation = + pub TrustBackedAssetsPalletLocation: Location = + PalletInstance(TrustBackedAssetsPalletIndex::get()).into(); + pub TrustBackedAssetsPalletIndex: u8 = ::index() as u8; + pub TrustBackedAssetsPalletLocationV3: xcm::v3::Location = + xcm::v3::Junction::PalletInstance(::index() as u8).into(); + pub ForeignAssetsPalletLocation: Location = PalletInstance(::index() as u8).into(); - pub PoolAssetsPalletLocation: MultiLocation = + pub PoolAssetsPalletLocation: Location = PalletInstance(::index() as u8).into(); + pub PoolAssetsPalletLocationV3: xcm::v3::Location = + xcm::v3::Junction::PalletInstance(::index() as u8).into(); pub CheckingAccount: AccountId = PolkadotXcm::check_account(); + pub const GovernanceLocation: Location = Location::parent(); pub StakingPot: AccountId = CollatorSelection::account_id(); - pub const GovernanceLocation: MultiLocation = MultiLocation::parent(); pub TreasuryAccount: AccountId = TREASURY_PALLET_ID.into_account_truncating(); - pub RelayTreasuryLocation: MultiLocation = (Parent, PalletInstance(rococo_runtime_constants::TREASURY_PALLET_ID)).into(); + pub RelayTreasuryLocation: Location = (Parent, PalletInstance(rococo_runtime_constants::TREASURY_PALLET_ID)).into(); } -/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used +/// Type for specifying how a `Location` can be converted into an `AccountId`. This is used /// when determining ownership of accounts for asset transacting and when attempting to use XCM /// `Transact` in order to determine the dispatch Origin. pub type LocationToAccountId = ( @@ -110,7 +116,7 @@ pub type CurrencyTransactor = CurrencyAdapter< Balances, // Use this currency when it is a fungible asset matching the given location or name: IsConcrete, - // Convert an XCM MultiLocation into a local account id: + // Convert an XCM Location into a local account id: LocationToAccountId, // Our chain's account ID type (we can't get away without mentioning it explicitly): AccountId, @@ -128,7 +134,7 @@ pub type FungiblesTransactor = FungiblesAdapter< Assets, // Use this currency when it is a fungible asset matching the given location or name: TrustBackedAssetsConvertedConcreteId, - // Convert an XCM MultiLocation into a local account id: + // Convert an XCM Location into a local account id: LocationToAccountId, // Our chain's account ID type (we can't get away without mentioning it explicitly): AccountId, @@ -145,8 +151,8 @@ pub type ForeignAssetsConvertedConcreteId = assets_common::ForeignAssetsConverte // Ignore `TrustBackedAssets` explicitly StartsWith, // Ignore assets that start explicitly with our `GlobalConsensus(NetworkId)`, means: - // - foreign assets from our consensus should be: `MultiLocation {parents: 1, - // X*(Parachain(xyz), ..)}` + // - foreign assets from our consensus should be: `Location {parents: 1, X*(Parachain(xyz), + // ..)}` // - foreign assets outside our consensus with the same `GlobalConsensus(NetworkId)` won't // be accepted here StartsWithExplicitGlobalConsensus, @@ -160,7 +166,7 @@ pub type ForeignFungiblesTransactor = FungiblesAdapter< ForeignAssets, // Use this currency when it is a fungible asset matching the given location or name: ForeignAssetsConvertedConcreteId, - // Convert an XCM MultiLocation into a local account id: + // Convert an XCM Location into a local account id: LocationToAccountId, // Our chain's account ID type (we can't get away without mentioning it explicitly): AccountId, @@ -180,7 +186,7 @@ pub type PoolFungiblesTransactor = FungiblesAdapter< PoolAssets, // Use this currency when it is a fungible asset matching the given location or name: PoolAssetsConvertedConcreteId, - // Convert an XCM MultiLocation into a local account id: + // Convert an XCM Location into a local account id: LocationToAccountId, // Our chain's account ID type (we can't get away without mentioning it explicitly): AccountId, @@ -195,20 +201,32 @@ pub type PoolFungiblesTransactor = FungiblesAdapter< pub type AssetTransactors = (CurrencyTransactor, FungiblesTransactor, ForeignFungiblesTransactor, PoolFungiblesTransactor); -/// Simple `MultiLocation` matcher for Local and Foreign asset `MultiLocation`. -pub struct LocalAndForeignAssetsMultiLocationMatcher; -impl MatchesLocalAndForeignAssetsMultiLocation for LocalAndForeignAssetsMultiLocationMatcher { - fn is_local(location: &MultiLocation) -> bool { - use assets_common::fungible_conversion::MatchesMultiLocation; - TrustBackedAssetsConvertedConcreteId::contains(location) +/// Simple `Location` matcher for Local and Foreign asset `Location`. +pub struct LocalAndForeignAssetsLocationMatcher; +impl MatchesLocalAndForeignAssetsLocation + for LocalAndForeignAssetsLocationMatcher +{ + fn is_local(location: &xcm::v3::Location) -> bool { + use assets_common::fungible_conversion::MatchesLocation; + let latest_location: Location = if let Ok(location) = (*location).try_into() { + location + } else { + return false; + }; + TrustBackedAssetsConvertedConcreteId::contains(&latest_location) } - fn is_foreign(location: &MultiLocation) -> bool { - use assets_common::fungible_conversion::MatchesMultiLocation; - ForeignAssetsConvertedConcreteId::contains(location) + fn is_foreign(location: &xcm::v3::Location) -> bool { + use assets_common::fungible_conversion::MatchesLocation; + let latest_location: Location = if let Ok(location) = (*location).try_into() { + location + } else { + return false; + }; + ForeignAssetsConvertedConcreteId::contains(&latest_location) } } -impl Contains for LocalAndForeignAssetsMultiLocationMatcher { - fn contains(location: &MultiLocation) -> bool { +impl Contains for LocalAndForeignAssetsLocationMatcher { + fn contains(location: &xcm::v3::Location) -> bool { Self::is_local(location) || Self::is_foreign(location) } } @@ -243,11 +261,11 @@ parameter_types! { pub XcmAssetFeesReceiver: Option = Authorship::author(); } -match_types! { - pub type ParentOrParentsPlurality: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(Plurality { .. }) } - }; +pub struct ParentOrParentsPlurality; +impl Contains for ParentOrParentsPlurality { + fn contains(location: &Location) -> bool { + matches!(location.unpack(), (1, []) | (1, [Plurality { .. }])) + } } /// A call filter for the XCM Transact instruction. This is a temporary measure until we properly @@ -556,12 +574,12 @@ impl xcm_executor::Config for XcmConfig { type Trader = ( UsingComponents>, cumulus_primitives_utility::SwapFirstAssetTrader< - TokenLocation, + TokenLocationV3, crate::AssetConversion, WeightToFee, crate::NativeAndAssets, ( - TrustBackedAssetsAsMultiLocation, + TrustBackedAssetsAsLocation, ForeignAssetsConvertedConcreteId, ), ResolveAssetTo, @@ -588,7 +606,7 @@ impl xcm_executor::Config for XcmConfig { type Aliasers = Nothing; } -/// Converts a local signed origin into an XCM multilocation. +/// Converts a local signed origin into an XCM location. /// Forms the basis for local origins sending/executing XCMs. pub type LocalOriginToLocation = SignedToAccountId32; @@ -664,9 +682,9 @@ pub type ForeignCreatorsSovereignAccountOf = ( /// Simple conversion of `u32` into an `AssetId` for use in benchmarking. pub struct XcmBenchmarkHelper; #[cfg(feature = "runtime-benchmarks")] -impl pallet_assets::BenchmarkHelper for XcmBenchmarkHelper { - fn create_asset_id_parameter(id: u32) -> MultiLocation { - MultiLocation { parents: 1, interior: X1(Parachain(id)) } +impl pallet_assets::BenchmarkHelper for XcmBenchmarkHelper { + fn create_asset_id_parameter(id: u32) -> xcm::v3::Location { + xcm::v3::Location::new(1, [xcm::v3::Junction::Parachain(id)]) } } @@ -698,7 +716,7 @@ pub mod bridging { pub storage XcmBridgeHubRouterByteFee: Balance = TransactionByteFee::get(); pub SiblingBridgeHubParaId: u32 = bp_bridge_hub_rococo::BRIDGE_HUB_ROCOCO_PARACHAIN_ID; - pub SiblingBridgeHub: MultiLocation = MultiLocation::new(1, X1(Parachain(SiblingBridgeHubParaId::get()))); + pub SiblingBridgeHub: Location = Location::new(1, [Parachain(SiblingBridgeHubParaId::get())]); /// Router expects payment with this `AssetId`. /// (`AssetId` has to be aligned with `BridgeTable`) pub XcmBridgeHubRouterFeeAssetId: AssetId = TokenLocation::get().into(); @@ -722,25 +740,25 @@ pub mod bridging { use super::*; parameter_types! { - pub SiblingBridgeHubWithBridgeHubWestendInstance: MultiLocation = MultiLocation::new( + pub SiblingBridgeHubWithBridgeHubWestendInstance: Location = Location::new( 1, - X2( + [ Parachain(SiblingBridgeHubParaId::get()), PalletInstance(bp_bridge_hub_rococo::WITH_BRIDGE_ROCOCO_TO_WESTEND_MESSAGES_PALLET_INDEX) - ) + ] ); pub const WestendNetwork: NetworkId = NetworkId::Westend; - pub AssetHubWestend: MultiLocation = MultiLocation::new(2, X2(GlobalConsensus(WestendNetwork::get()), Parachain(bp_asset_hub_westend::ASSET_HUB_WESTEND_PARACHAIN_ID))); - pub WndLocation: MultiLocation = MultiLocation::new(2, X1(GlobalConsensus(WestendNetwork::get()))); + pub AssetHubWestend: Location = Location::new(2, [GlobalConsensus(WestendNetwork::get()), Parachain(bp_asset_hub_westend::ASSET_HUB_WESTEND_PARACHAIN_ID)]); + pub WndLocation: Location = Location::new(2, [GlobalConsensus(WestendNetwork::get())]); - pub WndFromAssetHubWestend: (MultiAssetFilter, MultiLocation) = ( - Wild(AllOf { fun: WildFungible, id: Concrete(WndLocation::get()) }), + pub WndFromAssetHubWestend: (AssetFilter, Location) = ( + Wild(AllOf { fun: WildFungible, id: AssetId(WndLocation::get()) }), AssetHubWestend::get() ); /// Set up exporters configuration. - /// `Option` represents static "base fee" which is used for total delivery fee calculation. + /// `Option` represents static "base fee" which is used for total delivery fee calculation. pub BridgeTable: sp_std::vec::Vec = sp_std::vec![ NetworkExportTableItem::new( WestendNetwork::get(), @@ -757,15 +775,15 @@ pub mod bridging { ]; /// Universal aliases - pub UniversalAliases: BTreeSet<(MultiLocation, Junction)> = BTreeSet::from_iter( + pub UniversalAliases: BTreeSet<(Location, Junction)> = BTreeSet::from_iter( sp_std::vec![ (SiblingBridgeHubWithBridgeHubWestendInstance::get(), GlobalConsensus(WestendNetwork::get())) ] ); } - impl Contains<(MultiLocation, Junction)> for UniversalAliases { - fn contains(alias: &(MultiLocation, Junction)) -> bool { + impl Contains<(Location, Junction)> for UniversalAliases { + fn contains(alias: &(Location, Junction)) -> bool { UniversalAliases::get().contains(alias) } } @@ -804,16 +822,16 @@ pub mod bridging { /// Polkadot uses 10 decimals, Kusama and Rococo 12 decimals. pub const DefaultBridgeHubEthereumBaseFee: Balance = 2_750_872_500_000; pub storage BridgeHubEthereumBaseFee: Balance = DefaultBridgeHubEthereumBaseFee::get(); - pub SiblingBridgeHubWithEthereumInboundQueueInstance: MultiLocation = MultiLocation::new( + pub SiblingBridgeHubWithEthereumInboundQueueInstance: Location = Location::new( 1, - X2( + [ Parachain(SiblingBridgeHubParaId::get()), PalletInstance(parachains_common::rococo::snowbridge::INBOUND_QUEUE_PALLET_INDEX) - ) + ] ); /// Set up exporters configuration. - /// `Option` represents static "base fee" which is used for total delivery fee calculation. + /// `Option` represents static "base fee" which is used for total delivery fee calculation. pub BridgeTable: sp_std::vec::Vec = sp_std::vec![ NetworkExportTableItem::new( EthereumNetwork::get(), @@ -827,7 +845,7 @@ pub mod bridging { ]; /// Universal aliases - pub UniversalAliases: BTreeSet<(MultiLocation, Junction)> = BTreeSet::from_iter( + pub UniversalAliases: BTreeSet<(Location, Junction)> = BTreeSet::from_iter( sp_std::vec![ (SiblingBridgeHubWithEthereumInboundQueueInstance::get(), GlobalConsensus(EthereumNetwork::get())), ] @@ -837,8 +855,8 @@ pub mod bridging { pub type IsTrustedBridgedReserveLocationForForeignAsset = matching::IsForeignConcreteAsset>; - impl Contains<(MultiLocation, Junction)> for UniversalAliases { - fn contains(alias: &(MultiLocation, Junction)) -> bool { + impl Contains<(Location, Junction)> for UniversalAliases { + fn contains(alias: &(Location, Junction)) -> bool { UniversalAliases::get().contains(alias) } } @@ -850,7 +868,7 @@ pub mod bridging { #[cfg(feature = "runtime-benchmarks")] impl BridgingBenchmarksHelper { - pub fn prepare_universal_alias() -> Option<(MultiLocation, Junction)> { + pub fn prepare_universal_alias() -> Option<(Location, Junction)> { let alias = to_westend::UniversalAliases::get() .into_iter() diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/tests/tests.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/tests/tests.rs index c67374126d3..3da1a1e66bd 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/tests/tests.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/tests/tests.rs @@ -19,12 +19,18 @@ use asset_hub_rococo_runtime::{ xcm_config, - xcm_config::{bridging, ForeignCreatorsSovereignAccountOf, LocationToAccountId, TokenLocation}, + xcm_config::{ + bridging, ForeignCreatorsSovereignAccountOf, LocationToAccountId, TokenLocation, + TokenLocationV3, + }, AllPalletsWithoutSystem, MetadataDepositBase, MetadataDepositPerByte, RuntimeCall, RuntimeEvent, ToWestendXcmRouterInstance, XcmpQueue, }; pub use asset_hub_rococo_runtime::{ - xcm_config::{CheckingAccount, TrustBackedAssetsPalletLocation, XcmConfig}, + xcm_config::{ + CheckingAccount, TrustBackedAssetsPalletLocation, TrustBackedAssetsPalletLocationV3, + XcmConfig, + }, AssetConversion, AssetDeposit, Assets, Balances, CollatorSelection, ExistentialDeposit, ForeignAssets, ForeignAssetsInstance, ParachainSystem, Runtime, SessionKeys, System, TrustBackedAssetsInstance, @@ -49,14 +55,18 @@ use parachains_common::{ }; use sp_runtime::traits::MaybeEquivalence; use std::convert::Into; -use xcm::latest::prelude::*; -use xcm_executor::traits::{Identity, JustTry, WeightTrader}; +use xcm::latest::prelude::{Assets as XcmAssets, *}; +use xcm_builder::V4V3LocationConverter; +use xcm_executor::traits::{JustTry, WeightTrader}; const ALICE: [u8; 32] = [1u8; 32]; const SOME_ASSET_ADMIN: [u8; 32] = [5u8; 32]; type AssetIdForTrustBackedAssetsConvert = - assets_common::AssetIdForTrustBackedAssetsConvert; + assets_common::AssetIdForTrustBackedAssetsConvert; + +type AssetIdForTrustBackedAssetsConvertLatest = + assets_common::AssetIdForTrustBackedAssetsConvertLatest; type RuntimeHelper = asset_test_utils::RuntimeHelper; @@ -99,7 +109,7 @@ fn test_buy_and_refund_weight_in_native() { let fee = WeightToFee::weight_to_fee(&weight); let extra_amount = 100; let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; - let payment: MultiAsset = (native_location, fee + extra_amount).into(); + let payment: Asset = (native_location.clone(), fee + extra_amount).into(); // init trader and buy weight. let mut trader = ::Trader::new(); @@ -108,7 +118,7 @@ fn test_buy_and_refund_weight_in_native() { // assert. let unused_amount = - unused_asset.fungible.get(&native_location.into()).map_or(0, |a| *a); + unused_asset.fungible.get(&native_location.clone().into()).map_or(0, |a| *a); assert_eq!(unused_amount, extra_amount); assert_eq!(Balances::total_issuance(), total_issuance); @@ -144,7 +154,7 @@ fn test_buy_and_refund_weight_with_swap_local_asset_xcm_trader() { let bob: AccountId = SOME_ASSET_ADMIN.into(); let staking_pot = CollatorSelection::account_id(); let asset_1: u32 = 1; - let native_location = TokenLocation::get(); + let native_location = TokenLocationV3::get(); let asset_1_location = AssetIdForTrustBackedAssetsConvert::convert_back(&asset_1).unwrap(); // bob's initial balance for native and `asset1` assets. @@ -180,6 +190,8 @@ fn test_buy_and_refund_weight_with_swap_local_asset_xcm_trader() { let asset_total_issuance = Assets::total_issuance(asset_1); let native_total_issuance = Balances::total_issuance(); + let asset_1_location_latest: Location = asset_1_location.try_into().unwrap(); + // prepare input to buy weight. let weight = Weight::from_parts(4_000_000_000, 0); let fee = WeightToFee::weight_to_fee(&weight); @@ -187,7 +199,7 @@ fn test_buy_and_refund_weight_with_swap_local_asset_xcm_trader() { AssetConversion::get_amount_in(&fee, &pool_liquidity, &pool_liquidity).unwrap(); let extra_amount = 100; let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; - let payment: MultiAsset = (asset_1_location, asset_fee + extra_amount).into(); + let payment: Asset = (asset_1_location_latest.clone(), asset_fee + extra_amount).into(); // init trader and buy weight. let mut trader = ::Trader::new(); @@ -195,8 +207,10 @@ fn test_buy_and_refund_weight_with_swap_local_asset_xcm_trader() { trader.buy_weight(weight, payment.into(), &ctx).expect("Expected Ok"); // assert. - let unused_amount = - unused_asset.fungible.get(&asset_1_location.into()).map_or(0, |a| *a); + let unused_amount = unused_asset + .fungible + .get(&asset_1_location_latest.clone().into()) + .map_or(0, |a| *a); assert_eq!(unused_amount, extra_amount); assert_eq!(Assets::total_issuance(asset_1), asset_total_issuance + asset_fee); @@ -210,7 +224,7 @@ fn test_buy_and_refund_weight_with_swap_local_asset_xcm_trader() { // refund. let actual_refund = trader.refund_weight(refund_weight, &ctx).unwrap(); - assert_eq!(actual_refund, (asset_1_location, asset_refund).into()); + assert_eq!(actual_refund, (asset_1_location_latest, asset_refund).into()); // assert. assert_eq!(Balances::balance(&staking_pot), initial_balance); @@ -239,9 +253,15 @@ fn test_buy_and_refund_weight_with_swap_foreign_asset_xcm_trader() { .execute_with(|| { let bob: AccountId = SOME_ASSET_ADMIN.into(); let staking_pot = CollatorSelection::account_id(); - let native_location = TokenLocation::get(); - let foreign_location = - MultiLocation { parents: 1, interior: X2(Parachain(1234), GeneralIndex(12345)) }; + let native_location = TokenLocationV3::get(); + let foreign_location = xcm::v3::Location { + parents: 1, + interior: ( + xcm::v3::Junction::Parachain(1234), + xcm::v3::Junction::GeneralIndex(12345), + ) + .into(), + }; // bob's initial balance for native and `asset1` assets. let initial_balance = 200 * UNITS; // liquidity for both arms of (native, asset1) pool. @@ -280,6 +300,8 @@ fn test_buy_and_refund_weight_with_swap_foreign_asset_xcm_trader() { let asset_total_issuance = ForeignAssets::total_issuance(foreign_location); let native_total_issuance = Balances::total_issuance(); + let foreign_location_latest: Location = foreign_location.try_into().unwrap(); + // prepare input to buy weight. let weight = Weight::from_parts(4_000_000_000, 0); let fee = WeightToFee::weight_to_fee(&weight); @@ -287,7 +309,7 @@ fn test_buy_and_refund_weight_with_swap_foreign_asset_xcm_trader() { AssetConversion::get_amount_in(&fee, &pool_liquidity, &pool_liquidity).unwrap(); let extra_amount = 100; let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; - let payment: MultiAsset = (foreign_location, asset_fee + extra_amount).into(); + let payment: Asset = (foreign_location_latest.clone(), asset_fee + extra_amount).into(); // init trader and buy weight. let mut trader = ::Trader::new(); @@ -295,8 +317,10 @@ fn test_buy_and_refund_weight_with_swap_foreign_asset_xcm_trader() { trader.buy_weight(weight, payment.into(), &ctx).expect("Expected Ok"); // assert. - let unused_amount = - unused_asset.fungible.get(&foreign_location.into()).map_or(0, |a| *a); + let unused_amount = unused_asset + .fungible + .get(&foreign_location_latest.clone().into()) + .map_or(0, |a| *a); assert_eq!(unused_amount, extra_amount); assert_eq!( ForeignAssets::total_issuance(foreign_location), @@ -313,7 +337,7 @@ fn test_buy_and_refund_weight_with_swap_foreign_asset_xcm_trader() { // refund. let actual_refund = trader.refund_weight(refund_weight, &ctx).unwrap(); - assert_eq!(actual_refund, (foreign_location, asset_refund).into()); + assert_eq!(actual_refund, (foreign_location_latest, asset_refund).into()); // assert. assert_eq!(Balances::balance(&staking_pot), initial_balance); @@ -343,19 +367,21 @@ fn test_assets_balances_api_works() { .build() .execute_with(|| { let local_asset_id = 1; - let foreign_asset_id_multilocation = - MultiLocation { parents: 1, interior: X2(Parachain(1234), GeneralIndex(12345)) }; + let foreign_asset_id_location = xcm::v3::Location::new( + 1, + [xcm::v3::Junction::Parachain(1234), xcm::v3::Junction::GeneralIndex(12345)], + ); // check before assert_eq!(Assets::balance(local_asset_id, AccountId::from(ALICE)), 0); assert_eq!( - ForeignAssets::balance(foreign_asset_id_multilocation, AccountId::from(ALICE)), + ForeignAssets::balance(foreign_asset_id_location, AccountId::from(ALICE)), 0 ); assert_eq!(Balances::free_balance(AccountId::from(ALICE)), 0); assert!(Runtime::query_account_balances(AccountId::from(ALICE)) .unwrap() - .try_as::() + .try_as::() .unwrap() .is_none()); @@ -386,7 +412,7 @@ fn test_assets_balances_api_works() { let foreign_asset_minimum_asset_balance = 3333333_u128; assert_ok!(ForeignAssets::force_create( RuntimeHelper::root_origin(), - foreign_asset_id_multilocation, + foreign_asset_id_location, AccountId::from(SOME_ASSET_ADMIN).into(), false, foreign_asset_minimum_asset_balance @@ -395,7 +421,7 @@ fn test_assets_balances_api_works() { // We first mint enough asset for the account to exist for assets assert_ok!(ForeignAssets::mint( RuntimeHelper::origin_of(AccountId::from(SOME_ASSET_ADMIN)), - foreign_asset_id_multilocation, + foreign_asset_id_location, AccountId::from(ALICE).into(), 6 * foreign_asset_minimum_asset_balance )); @@ -406,12 +432,12 @@ fn test_assets_balances_api_works() { minimum_asset_balance ); assert_eq!( - ForeignAssets::balance(foreign_asset_id_multilocation, AccountId::from(ALICE)), + ForeignAssets::balance(foreign_asset_id_location, AccountId::from(ALICE)), 6 * minimum_asset_balance ); assert_eq!(Balances::free_balance(AccountId::from(ALICE)), some_currency); - let result: MultiAssets = Runtime::query_account_balances(AccountId::from(ALICE)) + let result: XcmAssets = Runtime::query_account_balances(AccountId::from(ALICE)) .unwrap() .try_into() .unwrap(); @@ -426,13 +452,13 @@ fn test_assets_balances_api_works() { ))); // check trusted asset assert!(result.inner().iter().any(|asset| asset.eq(&( - AssetIdForTrustBackedAssetsConvert::convert_back(&local_asset_id).unwrap(), + AssetIdForTrustBackedAssetsConvertLatest::convert_back(&local_asset_id).unwrap(), minimum_asset_balance ) .into()))); // check foreign asset assert!(result.inner().iter().any(|asset| asset.eq(&( - Identity::convert_back(&foreign_asset_id_multilocation).unwrap(), + V4V3LocationConverter::convert_back(&foreign_asset_id_location).unwrap(), 6 * foreign_asset_minimum_asset_balance ) .into()))); @@ -503,7 +529,7 @@ asset_test_utils::include_asset_transactor_transfer_with_pallet_assets_instance_ XcmConfig, TrustBackedAssetsInstance, AssetIdForTrustBackedAssets, - AssetIdForTrustBackedAssetsConvert, + AssetIdForTrustBackedAssetsConvertLatest, collator_session_keys(), ExistentialDeposit::get(), 12345, @@ -520,11 +546,14 @@ asset_test_utils::include_asset_transactor_transfer_with_pallet_assets_instance_ Runtime, XcmConfig, ForeignAssetsInstance, - MultiLocation, + xcm::v3::Location, JustTry, collator_session_keys(), ExistentialDeposit::get(), - MultiLocation { parents: 1, interior: X2(Parachain(1313), GeneralIndex(12345)) }, + xcm::v3::Location::new( + 1, + [xcm::v3::Junction::Parachain(1313), xcm::v3::Junction::GeneralIndex(12345)] + ), Box::new(|| { assert!(Assets::asset_ids().collect::>().is_empty()); }), @@ -539,8 +568,8 @@ asset_test_utils::include_create_and_manage_foreign_assets_for_local_consensus_p WeightToFee, ForeignCreatorsSovereignAccountOf, ForeignAssetsInstance, - MultiLocation, - JustTry, + xcm::v3::Location, + V4V3LocationConverter, collator_session_keys(), ExistentialDeposit::get(), AssetDeposit::get(), @@ -637,12 +666,12 @@ mod asset_hub_rococo_tests { AccountId::from([73; 32]), AccountId::from(BLOCK_AUTHOR_ACCOUNT), // receiving WNDs - (MultiLocation { parents: 2, interior: X1(GlobalConsensus(Westend)) }, 1000000000000, 1_000_000_000), + (xcm::v3::Location::new(2, [xcm::v3::Junction::GlobalConsensus(xcm::v3::NetworkId::Westend)]), 1000000000000, 1_000_000_000), bridging_to_asset_hub_westend, ( - X1(PalletInstance(bp_bridge_hub_rococo::WITH_BRIDGE_ROCOCO_TO_WESTEND_MESSAGES_PALLET_INDEX)), + [PalletInstance(bp_bridge_hub_rococo::WITH_BRIDGE_ROCOCO_TO_WESTEND_MESSAGES_PALLET_INDEX)].into(), GlobalConsensus(Westend), - X1(Parachain(1000)) + [Parachain(1000)].into() ) ) } diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs index 8543500fa23..cf10c0ac052 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs @@ -76,21 +76,25 @@ use sp_std::prelude::*; #[cfg(feature = "std")] use sp_version::NativeVersion; use sp_version::RuntimeVersion; -use xcm::opaque::v3::MultiLocation; use xcm_config::{ ForeignAssetsConvertedConcreteId, PoolAssetsConvertedConcreteId, - TrustBackedAssetsConvertedConcreteId, TrustBackedAssetsPalletLocation, WestendLocation, - XcmOriginToTransactDispatchOrigin, + TrustBackedAssetsConvertedConcreteId, TrustBackedAssetsPalletLocationV3, WestendLocation, + WestendLocationV3, XcmOriginToTransactDispatchOrigin, }; #[cfg(any(feature = "std", test))] pub use sp_runtime::BuildStorage; -use assets_common::{ - foreign_creators::ForeignCreators, matching::FromSiblingParachain, MultiLocationForAssetId, -}; +use assets_common::{foreign_creators::ForeignCreators, matching::FromSiblingParachain}; use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; -use xcm::latest::prelude::*; +// We exclude `Assets` since it's the name of a pallet +use xcm::latest::prelude::AssetId; + +#[cfg(feature = "runtime-benchmarks")] +use xcm::latest::prelude::{ + Asset, Fungible, Here, InteriorLocation, Junction, Junction::*, Location, NetworkId, + NonFungible, Parent, ParentThen, Response, XCM_VERSION, +}; use crate::xcm_config::ForeignCreatorsSovereignAccountOf; use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; @@ -300,10 +304,11 @@ pub type LocalAndForeignAssets = fungibles::UnionOf< Assets, ForeignAssets, LocalFromLeft< - AssetIdForTrustBackedAssetsConvert, + AssetIdForTrustBackedAssetsConvert, AssetIdForTrustBackedAssets, + xcm::v3::Location, >, - MultiLocation, + xcm::v3::Location, AccountId, >; @@ -311,8 +316,8 @@ pub type LocalAndForeignAssets = fungibles::UnionOf< pub type NativeAndAssets = fungible::UnionOf< Balances, LocalAndForeignAssets, - TargetFromLeft, - MultiLocation, + TargetFromLeft, + xcm::v3::Location, AccountId, >; @@ -320,15 +325,15 @@ impl pallet_asset_conversion::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Balance = Balance; type HigherPrecisionBalance = sp_core::U256; - type AssetKind = MultiLocation; + type AssetKind = xcm::v3::Location; type Assets = NativeAndAssets; type PoolId = (Self::AssetKind, Self::AssetKind); type PoolLocator = - pallet_asset_conversion::WithFirstAsset; + pallet_asset_conversion::WithFirstAsset; type PoolAssetId = u32; type PoolAssets = PoolAssets; type PoolSetupFee = ConstU128<0>; // Asset class deposit fees are sufficient to prevent spam - type PoolSetupFeeAsset = WestendLocation; + type PoolSetupFeeAsset = WestendLocationV3; type PoolSetupFeeTarget = ResolveAssetTo; type LiquidityWithdrawalFee = LiquidityWithdrawalFee; type LPFee = ConstU32<3>; @@ -338,9 +343,10 @@ impl pallet_asset_conversion::Config for Runtime { type WeightInfo = weights::pallet_asset_conversion::WeightInfo; #[cfg(feature = "runtime-benchmarks")] type BenchmarkHelper = assets_common::benchmarks::AssetPairFactory< - WestendLocation, + WestendLocationV3, parachain_info::Pallet, - xcm_config::AssetsPalletIndex, + xcm_config::TrustBackedAssetsPalletIndex, + xcm::v3::Location, >; } @@ -362,13 +368,14 @@ pub type ForeignAssetsInstance = pallet_assets::Instance2; impl pallet_assets::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Balance = Balance; - type AssetId = MultiLocationForAssetId; - type AssetIdParameter = MultiLocationForAssetId; + type AssetId = xcm::v3::Location; + type AssetIdParameter = xcm::v3::Location; type Currency = Balances; type CreateOrigin = ForeignCreators< - (FromSiblingParachain>,), + FromSiblingParachain, xcm::v3::Location>, ForeignCreatorsSovereignAccountOf, AccountId, + xcm::v3::Location, >; type ForceOrigin = AssetsForceOrigin; type AssetDeposit = ForeignAssetsAssetDeposit; @@ -644,7 +651,7 @@ impl cumulus_pallet_aura_ext::Config for Runtime {} parameter_types! { /// The asset ID for the asset that we use to pay for message delivery fees. - pub FeeAssetId: AssetId = Concrete(xcm_config::WestendLocation::get()); + pub FeeAssetId: AssetId = AssetId(xcm_config::WestendLocation::get()); /// The base fee for the message delivery fees. pub const BaseDeliveryFee: u128 = CENTS.saturating_mul(3); } @@ -728,7 +735,7 @@ impl pallet_asset_conversion_tx_payment::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Fungibles = LocalAndForeignAssets; type OnChargeAssetTransaction = - AssetConversionAdapter; + AssetConversionAdapter; } parameter_types! { @@ -1229,18 +1236,18 @@ impl_runtime_apis! { impl pallet_asset_conversion::AssetConversionApi< Block, Balance, - MultiLocation, + xcm::v3::Location, > for Runtime { - fn quote_price_exact_tokens_for_tokens(asset1: MultiLocation, asset2: MultiLocation, amount: Balance, include_fee: bool) -> Option { + fn quote_price_exact_tokens_for_tokens(asset1: xcm::v3::Location, asset2: xcm::v3::Location, amount: Balance, include_fee: bool) -> Option { AssetConversion::quote_price_exact_tokens_for_tokens(asset1, asset2, amount, include_fee) } - fn quote_price_tokens_for_exact_tokens(asset1: MultiLocation, asset2: MultiLocation, amount: Balance, include_fee: bool) -> Option { + fn quote_price_tokens_for_exact_tokens(asset1: xcm::v3::Location, asset2: xcm::v3::Location, amount: Balance, include_fee: bool) -> Option { AssetConversion::quote_price_tokens_for_exact_tokens(asset1, asset2, amount, include_fee) } - fn get_reserves(asset1: MultiLocation, asset2: MultiLocation) -> Option<(Balance, Balance)> { + fn get_reserves(asset1: xcm::v3::Location, asset2: xcm::v3::Location) -> Option<(Balance, Balance)> { AssetConversion::get_reserves(asset1, asset2).ok() } } @@ -1294,7 +1301,7 @@ impl_runtime_apis! { AccountId, > for Runtime { - fn query_account_balances(account: AccountId) -> Result { + fn query_account_balances(account: AccountId) -> Result { use assets_common::fungible_conversion::{convert, convert_balance}; Ok([ // collect pallet_balance @@ -1413,45 +1420,45 @@ impl_runtime_apis! { use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsicsBenchmark; impl pallet_xcm::benchmarking::Config for Runtime { - fn reachable_dest() -> Option { + fn reachable_dest() -> Option { Some(Parent.into()) } - fn teleportable_asset_and_dest() -> Option<(MultiAsset, MultiLocation)> { + fn teleportable_asset_and_dest() -> Option<(Asset, Location)> { // Relay/native token can be teleported between AH and Relay. Some(( - MultiAsset { + Asset { fun: Fungible(EXISTENTIAL_DEPOSIT), - id: Concrete(Parent.into()) + id: AssetId(Parent.into()) }, Parent.into(), )) } - fn reserve_transferable_asset_and_dest() -> Option<(MultiAsset, MultiLocation)> { + fn reserve_transferable_asset_and_dest() -> Option<(Asset, Location)> { // AH can reserve transfer native token to some random parachain. let random_para_id = 43211234; ParachainSystem::open_outbound_hrmp_channel_for_benchmarks_or_tests( random_para_id.into() ); Some(( - MultiAsset { + Asset { fun: Fungible(EXISTENTIAL_DEPOSIT), - id: Concrete(Parent.into()) + id: AssetId(Parent.into()) }, ParentThen(Parachain(random_para_id).into()).into(), )) } fn set_up_complex_asset_transfer( - ) -> Option<(MultiAssets, u32, MultiLocation, Box)> { + ) -> Option<(xcm::v4::Assets, u32, Location, Box)> { // Transfer to Relay some local AH asset (local-reserve-transfer) while paying // fees using teleported native token. // (We don't care that Relay doesn't accept incoming unknown AH local asset) let dest = Parent.into(); let fee_amount = EXISTENTIAL_DEPOSIT; - let fee_asset: MultiAsset = (MultiLocation::parent(), fee_amount).into(); + let fee_asset: Asset = (Location::parent(), fee_amount).into(); let who = frame_benchmarking::whitelisted_caller(); // Give some multiple of the existential deposit @@ -1469,13 +1476,13 @@ impl_runtime_apis! { Runtime, pallet_assets::Instance1 >(true, initial_asset_amount); - let asset_location = MultiLocation::new( + let asset_location = Location::new( 0, - X2(PalletInstance(50), GeneralIndex(u32::from(asset_id).into())) + [PalletInstance(50), GeneralIndex(u32::from(asset_id).into())] ); - let transfer_asset: MultiAsset = (asset_location, asset_amount).into(); + let transfer_asset: Asset = (asset_location, asset_amount).into(); - let assets: MultiAssets = vec![fee_asset.clone(), transfer_asset].into(); + let assets: xcm::v4::Assets = vec![fee_asset.clone(), transfer_asset].into(); let fee_index = if assets.get(0).unwrap().eq(&fee_asset) { 0 } else { 1 }; // verify transferred successfully @@ -1504,14 +1511,14 @@ impl_runtime_apis! { xcm_config::bridging::SiblingBridgeHubParaId::get().into() ); } - fn ensure_bridged_target_destination() -> Result { + fn ensure_bridged_target_destination() -> Result { ParachainSystem::open_outbound_hrmp_channel_for_benchmarks_or_tests( xcm_config::bridging::SiblingBridgeHubParaId::get().into() ); let bridged_asset_hub = xcm_config::bridging::to_rococo::AssetHubRococo::get(); let _ = PolkadotXcm::force_xcm_version( RuntimeOrigin::root(), - Box::new(bridged_asset_hub), + Box::new(bridged_asset_hub.clone()), XCM_VERSION, ).map_err(|e| { log::error!( @@ -1527,12 +1534,11 @@ impl_runtime_apis! { } } - use xcm::latest::prelude::*; use xcm_config::{MaxAssetsIntoHolding, WestendLocation}; use pallet_xcm_benchmarks::asset_instance_from; parameter_types! { - pub ExistentialDepositMultiAsset: Option = Some(( + pub ExistentialDepositAsset: Option = Some(( WestendLocation::get(), ExistentialDeposit::get() ).into()); @@ -1543,33 +1549,33 @@ impl_runtime_apis! { type AccountIdConverter = xcm_config::LocationToAccountId; type DeliveryHelper = cumulus_primitives_utility::ToParentDeliveryHelper< xcm_config::XcmConfig, - ExistentialDepositMultiAsset, + ExistentialDepositAsset, xcm_config::PriceForParentDelivery, >; - fn valid_destination() -> Result { + fn valid_destination() -> Result { Ok(WestendLocation::get()) } - fn worst_case_holding(depositable_count: u32) -> MultiAssets { + fn worst_case_holding(depositable_count: u32) -> xcm::v4::Assets { // A mix of fungible, non-fungible, and concrete assets. let holding_non_fungibles = MaxAssetsIntoHolding::get() / 2 - depositable_count; let holding_fungibles = holding_non_fungibles - 1; let fungibles_amount: u128 = 100; let mut assets = (0..holding_fungibles) .map(|i| { - MultiAsset { - id: Concrete(GeneralIndex(i as u128).into()), + Asset { + id: AssetId(GeneralIndex(i as u128).into()), fun: Fungible(fungibles_amount * i as u128), } }) - .chain(core::iter::once(MultiAsset { id: Concrete(Here.into()), fun: Fungible(u128::MAX) })) - .chain((0..holding_non_fungibles).map(|i| MultiAsset { - id: Concrete(GeneralIndex(i as u128).into()), + .chain(core::iter::once(Asset { id: AssetId(Here.into()), fun: Fungible(u128::MAX) })) + .chain((0..holding_non_fungibles).map(|i| Asset { + id: AssetId(GeneralIndex(i as u128).into()), fun: NonFungible(asset_instance_from(i)), })) .collect::>(); - assets.push(MultiAsset { - id: Concrete(WestendLocation::get()), + assets.push(Asset { + id: AssetId(WestendLocation::get()), fun: Fungible(1_000_000 * UNITS), }); assets.into() @@ -1577,16 +1583,16 @@ impl_runtime_apis! { } parameter_types! { - pub const TrustedTeleporter: Option<(MultiLocation, MultiAsset)> = Some(( + pub const TrustedTeleporter: Option<(Location, Asset)> = Some(( WestendLocation::get(), - MultiAsset { fun: Fungible(UNITS), id: Concrete(WestendLocation::get()) }, + Asset { fun: Fungible(UNITS), id: AssetId(WestendLocation::get()) }, )); pub const CheckedAccount: Option<(AccountId, xcm_builder::MintLocation)> = None; // AssetHubWestend trusts AssetHubRococo as reserve for ROCs - pub TrustedReserve: Option<(MultiLocation, MultiAsset)> = Some( + pub TrustedReserve: Option<(Location, Asset)> = Some( ( xcm_config::bridging::to_rococo::AssetHubRococo::get(), - MultiAsset::from((xcm_config::bridging::to_rococo::RocLocation::get(), 1000000000000 as u128)) + Asset::from((xcm_config::bridging::to_rococo::RocLocation::get(), 1000000000000 as u128)) ) ); } @@ -1598,9 +1604,9 @@ impl_runtime_apis! { type TrustedTeleporter = TrustedTeleporter; type TrustedReserve = TrustedReserve; - fn get_multi_asset() -> MultiAsset { - MultiAsset { - id: Concrete(WestendLocation::get()), + fn get_asset() -> Asset { + Asset { + id: AssetId(WestendLocation::get()), fun: Fungible(UNITS), } } @@ -1614,42 +1620,42 @@ impl_runtime_apis! { (0u64, Response::Version(Default::default())) } - fn worst_case_asset_exchange() -> Result<(MultiAssets, MultiAssets), BenchmarkError> { + fn worst_case_asset_exchange() -> Result<(xcm::v4::Assets, xcm::v4::Assets), BenchmarkError> { Err(BenchmarkError::Skip) } - fn universal_alias() -> Result<(MultiLocation, Junction), BenchmarkError> { + fn universal_alias() -> Result<(Location, Junction), BenchmarkError> { match xcm_config::bridging::BridgingBenchmarksHelper::prepare_universal_alias() { Some(alias) => Ok(alias), None => Err(BenchmarkError::Skip) } } - fn transact_origin_and_runtime_call() -> Result<(MultiLocation, RuntimeCall), BenchmarkError> { + fn transact_origin_and_runtime_call() -> Result<(Location, RuntimeCall), BenchmarkError> { Ok((WestendLocation::get(), frame_system::Call::remark_with_event { remark: vec![] }.into())) } - fn subscribe_origin() -> Result { + fn subscribe_origin() -> Result { Ok(WestendLocation::get()) } - fn claimable_asset() -> Result<(MultiLocation, MultiLocation, MultiAssets), BenchmarkError> { + fn claimable_asset() -> Result<(Location, Location, xcm::v4::Assets), BenchmarkError> { let origin = WestendLocation::get(); - let assets: MultiAssets = (Concrete(WestendLocation::get()), 1_000 * UNITS).into(); - let ticket = MultiLocation { parents: 0, interior: Here }; + let assets: xcm::v4::Assets = (AssetId(WestendLocation::get()), 1_000 * UNITS).into(); + let ticket = Location { parents: 0, interior: Here }; Ok((origin, ticket, assets)) } - fn unlockable_asset() -> Result<(MultiLocation, MultiLocation, MultiAsset), BenchmarkError> { + fn unlockable_asset() -> Result<(Location, Location, Asset), BenchmarkError> { Err(BenchmarkError::Skip) } fn export_message_origin_and_destination( - ) -> Result<(MultiLocation, NetworkId, InteriorMultiLocation), BenchmarkError> { + ) -> Result<(Location, NetworkId, InteriorLocation), BenchmarkError> { Err(BenchmarkError::Skip) } - fn alias_origin() -> Result<(MultiLocation, MultiLocation), BenchmarkError> { + fn alias_origin() -> Result<(Location, Location), BenchmarkError> { Err(BenchmarkError::Skip) } } diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/mod.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/mod.rs index bcd51167f97..8c77774da2d 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/mod.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/weights/xcm/mod.rs @@ -23,14 +23,14 @@ use pallet_xcm_benchmarks_generic::WeightInfo as XcmGeneric; use sp_std::prelude::*; use xcm::{latest::prelude::*, DoubleEncoded}; -trait WeighMultiAssets { - fn weigh_multi_assets(&self, weight: Weight) -> Weight; +trait WeighAssets { + fn weigh_assets(&self, weight: Weight) -> Weight; } const MAX_ASSETS: u64 = 100; -impl WeighMultiAssets for MultiAssetFilter { - fn weigh_multi_assets(&self, weight: Weight) -> Weight { +impl WeighAssets for AssetFilter { + fn weigh_assets(&self, weight: Weight) -> Weight { match self { Self::Definite(assets) => weight.saturating_mul(assets.inner().iter().count() as u64), Self::Wild(asset) => match asset { @@ -49,40 +49,36 @@ impl WeighMultiAssets for MultiAssetFilter { } } -impl WeighMultiAssets for MultiAssets { - fn weigh_multi_assets(&self, weight: Weight) -> Weight { +impl WeighAssets for Assets { + fn weigh_assets(&self, weight: Weight) -> Weight { weight.saturating_mul(self.inner().iter().count() as u64) } } pub struct AssetHubWestendXcmWeight(core::marker::PhantomData); impl XcmWeightInfo for AssetHubWestendXcmWeight { - fn withdraw_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::withdraw_asset()) + fn withdraw_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::withdraw_asset()) } - fn reserve_asset_deposited(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::reserve_asset_deposited()) + fn reserve_asset_deposited(assets: &Assets) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::reserve_asset_deposited()) } - fn receive_teleported_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::receive_teleported_asset()) + fn receive_teleported_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::receive_teleported_asset()) } fn query_response( _query_id: &u64, _response: &Response, _max_weight: &Weight, - _querier: &Option, + _querier: &Option, ) -> Weight { XcmGeneric::::query_response() } - fn transfer_asset(assets: &MultiAssets, _dest: &MultiLocation) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::transfer_asset()) + fn transfer_asset(assets: &Assets, _dest: &Location) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::transfer_asset()) } - fn transfer_reserve_asset( - assets: &MultiAssets, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::transfer_reserve_asset()) + fn transfer_reserve_asset(assets: &Assets, _dest: &Location, _xcm: &Xcm<()>) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::transfer_reserve_asset()) } fn transact( _origin_type: &OriginKind, @@ -110,44 +106,36 @@ impl XcmWeightInfo for AssetHubWestendXcmWeight { fn clear_origin() -> Weight { XcmGeneric::::clear_origin() } - fn descend_origin(_who: &InteriorMultiLocation) -> Weight { + fn descend_origin(_who: &InteriorLocation) -> Weight { XcmGeneric::::descend_origin() } fn report_error(_query_response_info: &QueryResponseInfo) -> Weight { XcmGeneric::::report_error() } - fn deposit_asset(assets: &MultiAssetFilter, _dest: &MultiLocation) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::deposit_asset()) + fn deposit_asset(assets: &AssetFilter, _dest: &Location) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::deposit_asset()) } - fn deposit_reserve_asset( - assets: &MultiAssetFilter, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::deposit_reserve_asset()) + fn deposit_reserve_asset(assets: &AssetFilter, _dest: &Location, _xcm: &Xcm<()>) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::deposit_reserve_asset()) } - fn exchange_asset(_give: &MultiAssetFilter, _receive: &MultiAssets, _maximal: &bool) -> Weight { + fn exchange_asset(_give: &AssetFilter, _receive: &Assets, _maximal: &bool) -> Weight { Weight::MAX } fn initiate_reserve_withdraw( - assets: &MultiAssetFilter, - _reserve: &MultiLocation, + assets: &AssetFilter, + _reserve: &Location, _xcm: &Xcm<()>, ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::initiate_reserve_withdraw()) + assets.weigh_assets(XcmFungibleWeight::::initiate_reserve_withdraw()) } - fn initiate_teleport( - assets: &MultiAssetFilter, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::initiate_teleport()) + fn initiate_teleport(assets: &AssetFilter, _dest: &Location, _xcm: &Xcm<()>) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::initiate_teleport()) } - fn report_holding(_response_info: &QueryResponseInfo, _assets: &MultiAssetFilter) -> Weight { + fn report_holding(_response_info: &QueryResponseInfo, _assets: &AssetFilter) -> Weight { XcmGeneric::::report_holding() } - fn buy_execution(_fees: &MultiAsset, _weight_limit: &WeightLimit) -> Weight { + fn buy_execution(_fees: &Asset, _weight_limit: &WeightLimit) -> Weight { XcmGeneric::::buy_execution() } fn refund_surplus() -> Weight { @@ -162,7 +150,7 @@ impl XcmWeightInfo for AssetHubWestendXcmWeight { fn clear_error() -> Weight { XcmGeneric::::clear_error() } - fn claim_asset(_assets: &MultiAssets, _ticket: &MultiLocation) -> Weight { + fn claim_asset(_assets: &Assets, _ticket: &Location) -> Weight { XcmGeneric::::claim_asset() } fn trap(_code: &u64) -> Weight { @@ -174,13 +162,13 @@ impl XcmWeightInfo for AssetHubWestendXcmWeight { fn unsubscribe_version() -> Weight { XcmGeneric::::unsubscribe_version() } - fn burn_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmGeneric::::burn_asset()) + fn burn_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmGeneric::::burn_asset()) } - fn expect_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmGeneric::::expect_asset()) + fn expect_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmGeneric::::expect_asset()) } - fn expect_origin(_origin: &Option) -> Weight { + fn expect_origin(_origin: &Option) -> Weight { XcmGeneric::::expect_origin() } fn expect_error(_error: &Option<(u32, XcmError)>) -> Weight { @@ -213,16 +201,16 @@ impl XcmWeightInfo for AssetHubWestendXcmWeight { fn export_message(_: &NetworkId, _: &Junctions, _: &Xcm<()>) -> Weight { Weight::MAX } - fn lock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn lock_asset(_: &Asset, _: &Location) -> Weight { Weight::MAX } - fn unlock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn unlock_asset(_: &Asset, _: &Location) -> Weight { Weight::MAX } - fn note_unlockable(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn note_unlockable(_: &Asset, _: &Location) -> Weight { Weight::MAX } - fn request_unlock(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn request_unlock(_: &Asset, _: &Location) -> Weight { Weight::MAX } fn set_fees_mode(_: &bool) -> Weight { @@ -234,11 +222,11 @@ impl XcmWeightInfo for AssetHubWestendXcmWeight { fn clear_topic() -> Weight { XcmGeneric::::clear_topic() } - fn alias_origin(_: &MultiLocation) -> Weight { + fn alias_origin(_: &Location) -> Weight { // XCM Executor does not currently support alias origin operations Weight::MAX } - fn unpaid_execution(_: &WeightLimit, _: &Option) -> Weight { + fn unpaid_execution(_: &WeightLimit, _: &Option) -> Weight { XcmGeneric::::unpaid_execution() } } diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs index 28876d1d454..b2498418cc7 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs @@ -20,12 +20,12 @@ use super::{ ToRococoXcmRouter, TransactionByteFee, TrustBackedAssetsInstance, WeightToFee, XcmpQueue, }; use assets_common::{ - local_and_foreign_assets::MatchesLocalAndForeignAssetsMultiLocation, + local_and_foreign_assets::MatchesLocalAndForeignAssetsLocation, matching::{FromSiblingParachain, IsForeignConcreteAsset}, - TrustBackedAssetsAsMultiLocation, + TrustBackedAssetsAsLocation, }; use frame_support::{ - match_types, parameter_types, + parameter_types, traits::{ tokens::imbalance::ResolveAssetTo, ConstU32, Contains, Equals, Everything, Nothing, PalletInfoAccess, @@ -61,25 +61,31 @@ use xcm_builder::{ use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; parameter_types! { - pub const WestendLocation: MultiLocation = MultiLocation::parent(); + pub const WestendLocation: Location = Location::parent(); + pub const WestendLocationV3: xcm::v3::Location = xcm::v3::Location::parent(); pub const RelayNetwork: Option = Some(NetworkId::Westend); pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); - pub UniversalLocation: InteriorMultiLocation = - X2(GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(ParachainInfo::parachain_id().into())); + pub UniversalLocation: InteriorLocation = + [GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(ParachainInfo::parachain_id().into())].into(); pub UniversalLocationNetworkId: NetworkId = UniversalLocation::get().global_consensus().unwrap(); - pub AssetsPalletIndex: u32 = ::index() as u32; - pub TrustBackedAssetsPalletLocation: MultiLocation = PalletInstance(AssetsPalletIndex::get() as u8).into(); - pub ForeignAssetsPalletLocation: MultiLocation = + pub TrustBackedAssetsPalletLocation: Location = + PalletInstance(TrustBackedAssetsPalletIndex::get()).into(); + pub TrustBackedAssetsPalletIndex: u8 = ::index() as u8; + pub TrustBackedAssetsPalletLocationV3: xcm::v3::Location = + xcm::v3::Junction::PalletInstance(::index() as u8).into(); + pub ForeignAssetsPalletLocation: Location = PalletInstance(::index() as u8).into(); - pub PoolAssetsPalletLocation: MultiLocation = + pub PoolAssetsPalletLocation: Location = PalletInstance(::index() as u8).into(); + pub PoolAssetsPalletLocationV3: xcm::v3::Location = + xcm::v3::Junction::PalletInstance(::index() as u8).into(); pub CheckingAccount: AccountId = PolkadotXcm::check_account(); pub StakingPot: AccountId = CollatorSelection::account_id(); pub TreasuryAccount: AccountId = TREASURY_PALLET_ID.into_account_truncating(); - pub RelayTreasuryLocation: MultiLocation = (Parent, PalletInstance(westend_runtime_constants::TREASURY_PALLET_ID)).into(); + pub RelayTreasuryLocation: Location = (Parent, PalletInstance(westend_runtime_constants::TREASURY_PALLET_ID)).into(); } -/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used +/// Type for specifying how a `Location` can be converted into an `AccountId`. This is used /// when determining ownership of accounts for asset transacting and when attempting to use XCM /// `Transact` in order to determine the dispatch Origin. pub type LocationToAccountId = ( @@ -104,7 +110,7 @@ pub type CurrencyTransactor = CurrencyAdapter< Balances, // Use this currency when it is a fungible asset matching the given location or name: IsConcrete, - // Convert an XCM MultiLocation into a local account id: + // Convert an XCM Location into a local account id: LocationToAccountId, // Our chain's account ID type (we can't get away without mentioning it explicitly): AccountId, @@ -122,7 +128,7 @@ pub type FungiblesTransactor = FungiblesAdapter< Assets, // Use this currency when it is a fungible asset matching the given location or name: TrustBackedAssetsConvertedConcreteId, - // Convert an XCM MultiLocation into a local account id: + // Convert an XCM Location into a local account id: LocationToAccountId, // Our chain's account ID type (we can't get away without mentioning it explicitly): AccountId, @@ -139,8 +145,8 @@ pub type ForeignAssetsConvertedConcreteId = assets_common::ForeignAssetsConverte // Ignore `TrustBackedAssets` explicitly StartsWith, // Ignore asset which starts explicitly with our `GlobalConsensus(NetworkId)`, means: - // - foreign assets from our consensus should be: `MultiLocation {parents: 1, - // X*(Parachain(xyz), ..)} + // - foreign assets from our consensus should be: `Location {parents: 1, X*(Parachain(xyz), + // ..)} // - foreign assets outside our consensus with the same `GlobalConsensus(NetworkId)` wont // be accepted here StartsWithExplicitGlobalConsensus, @@ -154,7 +160,7 @@ pub type ForeignFungiblesTransactor = FungiblesAdapter< ForeignAssets, // Use this currency when it is a fungible asset matching the given location or name: ForeignAssetsConvertedConcreteId, - // Convert an XCM MultiLocation into a local account id: + // Convert an XCM Location into a local account id: LocationToAccountId, // Our chain's account ID type (we can't get away without mentioning it explicitly): AccountId, @@ -174,7 +180,7 @@ pub type PoolFungiblesTransactor = FungiblesAdapter< PoolAssets, // Use this currency when it is a fungible asset matching the given location or name: PoolAssetsConvertedConcreteId, - // Convert an XCM MultiLocation into a local account id: + // Convert an XCM Location into a local account id: LocationToAccountId, // Our chain's account ID type (we can't get away without mentioning it explicitly): AccountId, @@ -189,21 +195,33 @@ pub type PoolFungiblesTransactor = FungiblesAdapter< pub type AssetTransactors = (CurrencyTransactor, FungiblesTransactor, ForeignFungiblesTransactor, PoolFungiblesTransactor); -/// Simple `MultiLocation` matcher for Local and Foreign asset `MultiLocation`. -pub struct LocalAndForeignAssetsMultiLocationMatcher; -impl MatchesLocalAndForeignAssetsMultiLocation for LocalAndForeignAssetsMultiLocationMatcher { - fn is_local(location: &MultiLocation) -> bool { - use assets_common::fungible_conversion::MatchesMultiLocation; - TrustBackedAssetsConvertedConcreteId::contains(location) +/// Simple `Location` matcher for Local and Foreign asset `Location`. +pub struct LocalAndForeignAssetsLocationMatcher; +impl MatchesLocalAndForeignAssetsLocation + for LocalAndForeignAssetsLocationMatcher +{ + fn is_local(location: &xcm::v3::Location) -> bool { + use assets_common::fungible_conversion::MatchesLocation; + let latest_location: Location = if let Ok(location) = (*location).try_into() { + location + } else { + return false; + }; + TrustBackedAssetsConvertedConcreteId::contains(&latest_location) } - fn is_foreign(location: &MultiLocation) -> bool { - use assets_common::fungible_conversion::MatchesMultiLocation; - ForeignAssetsConvertedConcreteId::contains(location) + fn is_foreign(location: &xcm::v3::Location) -> bool { + use assets_common::fungible_conversion::MatchesLocation; + let latest_location: Location = if let Ok(location) = (*location).try_into() { + location + } else { + return false; + }; + ForeignAssetsConvertedConcreteId::contains(&latest_location) } } -impl Contains for LocalAndForeignAssetsMultiLocationMatcher { - fn contains(location: &MultiLocation) -> bool { +impl Contains for LocalAndForeignAssetsLocationMatcher { + fn contains(location: &xcm::v3::Location) -> bool { Self::is_local(location) || Self::is_foreign(location) } } @@ -238,23 +256,30 @@ parameter_types! { pub XcmAssetFeesReceiver: Option = Authorship::author(); } -match_types! { - pub type ParentOrParentsPlurality: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(Plurality { .. }) } - }; - pub type FellowshipEntities: impl Contains = { - // Fellowship Plurality - MultiLocation { parents: 1, interior: X2(Parachain(1001), Plurality { id: BodyId::Technical, ..}) } | - // Fellowship Salary Pallet - MultiLocation { parents: 1, interior: X2(Parachain(1001), PalletInstance(64)) } | - // Fellowship Treasury Pallet - MultiLocation { parents: 1, interior: X2(Parachain(1001), PalletInstance(65)) } - }; - pub type AmbassadorEntities: impl Contains = { - // Ambassador Salary Pallet - MultiLocation { parents: 1, interior: X2(Parachain(1001), PalletInstance(74)) } - }; +pub struct ParentOrParentsPlurality; +impl Contains for ParentOrParentsPlurality { + fn contains(location: &Location) -> bool { + matches!(location.unpack(), (1, []) | (1, [Plurality { .. }])) + } +} + +pub struct FellowshipEntities; +impl Contains for FellowshipEntities { + fn contains(location: &Location) -> bool { + matches!( + location.unpack(), + (1, [Parachain(1001), Plurality { id: BodyId::Technical, .. }]) | + (1, [Parachain(1001), PalletInstance(64)]) | + (1, [Parachain(1001), PalletInstance(65)]) + ) + } +} + +pub struct AmbassadorEntities; +impl Contains for AmbassadorEntities { + fn contains(location: &Location) -> bool { + matches!(location.unpack(), (1, [Parachain(1001), PalletInstance(74)])) + } } /// A call filter for the XCM Transact instruction. This is a temporary measure until we properly @@ -573,12 +598,12 @@ impl xcm_executor::Config for XcmConfig { type Trader = ( UsingComponents>, cumulus_primitives_utility::SwapFirstAssetTrader< - WestendLocation, + WestendLocationV3, crate::AssetConversion, WeightToFee, crate::NativeAndAssets, ( - TrustBackedAssetsAsMultiLocation, + TrustBackedAssetsAsLocation, ForeignAssetsConvertedConcreteId, ), ResolveAssetTo, @@ -671,9 +696,9 @@ pub type ForeignCreatorsSovereignAccountOf = ( /// Simple conversion of `u32` into an `AssetId` for use in benchmarking. pub struct XcmBenchmarkHelper; #[cfg(feature = "runtime-benchmarks")] -impl pallet_assets::BenchmarkHelper for XcmBenchmarkHelper { - fn create_asset_id_parameter(id: u32) -> MultiLocation { - MultiLocation { parents: 1, interior: X1(Parachain(id)) } +impl pallet_assets::BenchmarkHelper for XcmBenchmarkHelper { + fn create_asset_id_parameter(id: u32) -> xcm::v3::Location { + xcm::v3::Location::new(1, [xcm::v3::Junction::Parachain(id)]) } } @@ -704,7 +729,7 @@ pub mod bridging { pub storage XcmBridgeHubRouterByteFee: Balance = TransactionByteFee::get(); pub SiblingBridgeHubParaId: u32 = bp_bridge_hub_westend::BRIDGE_HUB_WESTEND_PARACHAIN_ID; - pub SiblingBridgeHub: MultiLocation = MultiLocation::new(1, X1(Parachain(SiblingBridgeHubParaId::get()))); + pub SiblingBridgeHub: Location = Location::new(1, [Parachain(SiblingBridgeHubParaId::get())]); /// Router expects payment with this `AssetId`. /// (`AssetId` has to be aligned with `BridgeTable`) pub XcmBridgeHubRouterFeeAssetId: AssetId = WestendLocation::get().into(); @@ -721,25 +746,25 @@ pub mod bridging { use super::*; parameter_types! { - pub SiblingBridgeHubWithBridgeHubRococoInstance: MultiLocation = MultiLocation::new( + pub SiblingBridgeHubWithBridgeHubRococoInstance: Location = Location::new( 1, - X2( + [ Parachain(SiblingBridgeHubParaId::get()), PalletInstance(bp_bridge_hub_westend::WITH_BRIDGE_WESTEND_TO_ROCOCO_MESSAGES_PALLET_INDEX) - ) + ] ); pub const RococoNetwork: NetworkId = NetworkId::Rococo; - pub AssetHubRococo: MultiLocation = MultiLocation::new(2, X2(GlobalConsensus(RococoNetwork::get()), Parachain(bp_asset_hub_rococo::ASSET_HUB_ROCOCO_PARACHAIN_ID))); - pub RocLocation: MultiLocation = MultiLocation::new(2, X1(GlobalConsensus(RococoNetwork::get()))); + pub AssetHubRococo: Location = Location::new(2, [GlobalConsensus(RococoNetwork::get()), Parachain(bp_asset_hub_rococo::ASSET_HUB_ROCOCO_PARACHAIN_ID)]); + pub RocLocation: Location = Location::new(2, [GlobalConsensus(RococoNetwork::get())]); - pub RocFromAssetHubRococo: (MultiAssetFilter, MultiLocation) = ( - Wild(AllOf { fun: WildFungible, id: Concrete(RocLocation::get()) }), + pub RocFromAssetHubRococo: (AssetFilter, Location) = ( + Wild(AllOf { fun: WildFungible, id: AssetId(RocLocation::get()) }), AssetHubRococo::get() ); /// Set up exporters configuration. - /// `Option` represents static "base fee" which is used for total delivery fee calculation. + /// `Option` represents static "base fee" which is used for total delivery fee calculation. pub BridgeTable: sp_std::vec::Vec = sp_std::vec![ NetworkExportTableItem::new( RococoNetwork::get(), @@ -756,15 +781,15 @@ pub mod bridging { ]; /// Universal aliases - pub UniversalAliases: BTreeSet<(MultiLocation, Junction)> = BTreeSet::from_iter( + pub UniversalAliases: BTreeSet<(Location, Junction)> = BTreeSet::from_iter( sp_std::vec![ (SiblingBridgeHubWithBridgeHubRococoInstance::get(), GlobalConsensus(RococoNetwork::get())) ] ); } - impl Contains<(MultiLocation, Junction)> for UniversalAliases { - fn contains(alias: &(MultiLocation, Junction)) -> bool { + impl Contains<(Location, Junction)> for UniversalAliases { + fn contains(alias: &(Location, Junction)) -> bool { UniversalAliases::get().contains(alias) } } @@ -799,7 +824,7 @@ pub mod bridging { #[cfg(feature = "runtime-benchmarks")] impl BridgingBenchmarksHelper { - pub fn prepare_universal_alias() -> Option<(MultiLocation, Junction)> { + pub fn prepare_universal_alias() -> Option<(Location, Junction)> { let alias = to_rococo::UniversalAliases::get().into_iter().find_map(|(location, junction)| { match to_rococo::SiblingBridgeHubWithBridgeHubRococoInstance::get() diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs index c50a8f3661d..28fc7ba705a 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs @@ -21,12 +21,16 @@ use asset_hub_westend_runtime::{ xcm_config, xcm_config::{ bridging, ForeignCreatorsSovereignAccountOf, LocationToAccountId, WestendLocation, + WestendLocationV3, }, AllPalletsWithoutSystem, MetadataDepositBase, MetadataDepositPerByte, PolkadotXcm, RuntimeCall, RuntimeEvent, RuntimeOrigin, ToRococoXcmRouterInstance, XcmpQueue, }; pub use asset_hub_westend_runtime::{ - xcm_config::{CheckingAccount, TrustBackedAssetsPalletLocation, XcmConfig}, + xcm_config::{ + CheckingAccount, TrustBackedAssetsPalletLocation, TrustBackedAssetsPalletLocationV3, + XcmConfig, + }, AssetConversion, AssetDeposit, Assets, Balances, CollatorSelection, ExistentialDeposit, ForeignAssets, ForeignAssetsInstance, ParachainSystem, Runtime, SessionKeys, System, TrustBackedAssetsInstance, @@ -51,14 +55,18 @@ use parachains_common::{ }; use sp_runtime::traits::MaybeEquivalence; use std::convert::Into; -use xcm::latest::prelude::*; -use xcm_executor::traits::{Identity, JustTry, WeightTrader}; +use xcm::latest::prelude::{Assets as XcmAssets, *}; +use xcm_builder::V4V3LocationConverter; +use xcm_executor::traits::{JustTry, WeightTrader}; const ALICE: [u8; 32] = [1u8; 32]; const SOME_ASSET_ADMIN: [u8; 32] = [5u8; 32]; type AssetIdForTrustBackedAssetsConvert = - assets_common::AssetIdForTrustBackedAssetsConvert; + assets_common::AssetIdForTrustBackedAssetsConvert; + +type AssetIdForTrustBackedAssetsConvertLatest = + assets_common::AssetIdForTrustBackedAssetsConvertLatest; type RuntimeHelper = asset_test_utils::RuntimeHelper; @@ -101,7 +109,7 @@ fn test_buy_and_refund_weight_in_native() { let fee = WeightToFee::weight_to_fee(&weight); let extra_amount = 100; let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; - let payment: MultiAsset = (native_location, fee + extra_amount).into(); + let payment: Asset = (native_location.clone(), fee + extra_amount).into(); // init trader and buy weight. let mut trader = ::Trader::new(); @@ -110,7 +118,7 @@ fn test_buy_and_refund_weight_in_native() { // assert. let unused_amount = - unused_asset.fungible.get(&native_location.into()).map_or(0, |a| *a); + unused_asset.fungible.get(&native_location.clone().into()).map_or(0, |a| *a); assert_eq!(unused_amount, extra_amount); assert_eq!(Balances::total_issuance(), total_issuance); @@ -146,7 +154,7 @@ fn test_buy_and_refund_weight_with_swap_local_asset_xcm_trader() { let bob: AccountId = SOME_ASSET_ADMIN.into(); let staking_pot = CollatorSelection::account_id(); let asset_1: u32 = 1; - let native_location = WestendLocation::get(); + let native_location = WestendLocationV3::get(); let asset_1_location = AssetIdForTrustBackedAssetsConvert::convert_back(&asset_1).unwrap(); // bob's initial balance for native and `asset1` assets. @@ -182,6 +190,8 @@ fn test_buy_and_refund_weight_with_swap_local_asset_xcm_trader() { let asset_total_issuance = Assets::total_issuance(asset_1); let native_total_issuance = Balances::total_issuance(); + let asset_1_location_latest: Location = asset_1_location.try_into().unwrap(); + // prepare input to buy weight. let weight = Weight::from_parts(4_000_000_000, 0); let fee = WeightToFee::weight_to_fee(&weight); @@ -189,7 +199,7 @@ fn test_buy_and_refund_weight_with_swap_local_asset_xcm_trader() { AssetConversion::get_amount_in(&fee, &pool_liquidity, &pool_liquidity).unwrap(); let extra_amount = 100; let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; - let payment: MultiAsset = (asset_1_location, asset_fee + extra_amount).into(); + let payment: Asset = (asset_1_location_latest.clone(), asset_fee + extra_amount).into(); // init trader and buy weight. let mut trader = ::Trader::new(); @@ -197,8 +207,10 @@ fn test_buy_and_refund_weight_with_swap_local_asset_xcm_trader() { trader.buy_weight(weight, payment.into(), &ctx).expect("Expected Ok"); // assert. - let unused_amount = - unused_asset.fungible.get(&asset_1_location.into()).map_or(0, |a| *a); + let unused_amount = unused_asset + .fungible + .get(&asset_1_location_latest.clone().into()) + .map_or(0, |a| *a); assert_eq!(unused_amount, extra_amount); assert_eq!(Assets::total_issuance(asset_1), asset_total_issuance + asset_fee); @@ -212,7 +224,7 @@ fn test_buy_and_refund_weight_with_swap_local_asset_xcm_trader() { // refund. let actual_refund = trader.refund_weight(refund_weight, &ctx).unwrap(); - assert_eq!(actual_refund, (asset_1_location, asset_refund).into()); + assert_eq!(actual_refund, (asset_1_location_latest, asset_refund).into()); // assert. assert_eq!(Balances::balance(&staking_pot), initial_balance); @@ -241,9 +253,15 @@ fn test_buy_and_refund_weight_with_swap_foreign_asset_xcm_trader() { .execute_with(|| { let bob: AccountId = SOME_ASSET_ADMIN.into(); let staking_pot = CollatorSelection::account_id(); - let native_location = WestendLocation::get(); - let foreign_location = - MultiLocation { parents: 1, interior: X2(Parachain(1234), GeneralIndex(12345)) }; + let native_location = WestendLocationV3::get(); + let foreign_location = xcm::v3::Location { + parents: 1, + interior: ( + xcm::v3::Junction::Parachain(1234), + xcm::v3::Junction::GeneralIndex(12345), + ) + .into(), + }; // bob's initial balance for native and `asset1` assets. let initial_balance = 200 * UNITS; // liquidity for both arms of (native, asset1) pool. @@ -282,6 +300,8 @@ fn test_buy_and_refund_weight_with_swap_foreign_asset_xcm_trader() { let asset_total_issuance = ForeignAssets::total_issuance(foreign_location); let native_total_issuance = Balances::total_issuance(); + let foreign_location_latest: Location = foreign_location.try_into().unwrap(); + // prepare input to buy weight. let weight = Weight::from_parts(4_000_000_000, 0); let fee = WeightToFee::weight_to_fee(&weight); @@ -289,7 +309,7 @@ fn test_buy_and_refund_weight_with_swap_foreign_asset_xcm_trader() { AssetConversion::get_amount_in(&fee, &pool_liquidity, &pool_liquidity).unwrap(); let extra_amount = 100; let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; - let payment: MultiAsset = (foreign_location, asset_fee + extra_amount).into(); + let payment: Asset = (foreign_location_latest.clone(), asset_fee + extra_amount).into(); // init trader and buy weight. let mut trader = ::Trader::new(); @@ -297,8 +317,10 @@ fn test_buy_and_refund_weight_with_swap_foreign_asset_xcm_trader() { trader.buy_weight(weight, payment.into(), &ctx).expect("Expected Ok"); // assert. - let unused_amount = - unused_asset.fungible.get(&foreign_location.into()).map_or(0, |a| *a); + let unused_amount = unused_asset + .fungible + .get(&foreign_location_latest.clone().into()) + .map_or(0, |a| *a); assert_eq!(unused_amount, extra_amount); assert_eq!( ForeignAssets::total_issuance(foreign_location), @@ -315,7 +337,7 @@ fn test_buy_and_refund_weight_with_swap_foreign_asset_xcm_trader() { // refund. let actual_refund = trader.refund_weight(refund_weight, &ctx).unwrap(); - assert_eq!(actual_refund, (foreign_location, asset_refund).into()); + assert_eq!(actual_refund, (foreign_location_latest, asset_refund).into()); // assert. assert_eq!(Balances::balance(&staking_pot), initial_balance); @@ -345,19 +367,25 @@ fn test_assets_balances_api_works() { .build() .execute_with(|| { let local_asset_id = 1; - let foreign_asset_id_multilocation = - MultiLocation { parents: 1, interior: X2(Parachain(1234), GeneralIndex(12345)) }; + let foreign_asset_id_location = xcm::v3::Location { + parents: 1, + interior: [ + xcm::v3::Junction::Parachain(1234), + xcm::v3::Junction::GeneralIndex(12345), + ] + .into(), + }; // check before assert_eq!(Assets::balance(local_asset_id, AccountId::from(ALICE)), 0); assert_eq!( - ForeignAssets::balance(foreign_asset_id_multilocation, AccountId::from(ALICE)), + ForeignAssets::balance(foreign_asset_id_location, AccountId::from(ALICE)), 0 ); assert_eq!(Balances::free_balance(AccountId::from(ALICE)), 0); assert!(Runtime::query_account_balances(AccountId::from(ALICE)) .unwrap() - .try_as::() + .try_as::() .unwrap() .is_none()); @@ -388,7 +416,7 @@ fn test_assets_balances_api_works() { let foreign_asset_minimum_asset_balance = 3333333_u128; assert_ok!(ForeignAssets::force_create( RuntimeHelper::root_origin(), - foreign_asset_id_multilocation, + foreign_asset_id_location, AccountId::from(SOME_ASSET_ADMIN).into(), false, foreign_asset_minimum_asset_balance @@ -397,7 +425,7 @@ fn test_assets_balances_api_works() { // We first mint enough asset for the account to exist for assets assert_ok!(ForeignAssets::mint( RuntimeHelper::origin_of(AccountId::from(SOME_ASSET_ADMIN)), - foreign_asset_id_multilocation, + foreign_asset_id_location, AccountId::from(ALICE).into(), 6 * foreign_asset_minimum_asset_balance )); @@ -408,12 +436,12 @@ fn test_assets_balances_api_works() { minimum_asset_balance ); assert_eq!( - ForeignAssets::balance(foreign_asset_id_multilocation, AccountId::from(ALICE)), + ForeignAssets::balance(foreign_asset_id_location, AccountId::from(ALICE)), 6 * minimum_asset_balance ); assert_eq!(Balances::free_balance(AccountId::from(ALICE)), some_currency); - let result: MultiAssets = Runtime::query_account_balances(AccountId::from(ALICE)) + let result: XcmAssets = Runtime::query_account_balances(AccountId::from(ALICE)) .unwrap() .try_into() .unwrap(); @@ -428,13 +456,13 @@ fn test_assets_balances_api_works() { ))); // check trusted asset assert!(result.inner().iter().any(|asset| asset.eq(&( - AssetIdForTrustBackedAssetsConvert::convert_back(&local_asset_id).unwrap(), + AssetIdForTrustBackedAssetsConvertLatest::convert_back(&local_asset_id).unwrap(), minimum_asset_balance ) .into()))); // check foreign asset assert!(result.inner().iter().any(|asset| asset.eq(&( - Identity::convert_back(&foreign_asset_id_multilocation).unwrap(), + V4V3LocationConverter::convert_back(&foreign_asset_id_location).unwrap(), 6 * foreign_asset_minimum_asset_balance ) .into()))); @@ -505,7 +533,7 @@ asset_test_utils::include_asset_transactor_transfer_with_pallet_assets_instance_ XcmConfig, TrustBackedAssetsInstance, AssetIdForTrustBackedAssets, - AssetIdForTrustBackedAssetsConvert, + AssetIdForTrustBackedAssetsConvertLatest, collator_session_keys(), ExistentialDeposit::get(), 12345, @@ -522,11 +550,15 @@ asset_test_utils::include_asset_transactor_transfer_with_pallet_assets_instance_ Runtime, XcmConfig, ForeignAssetsInstance, - MultiLocation, + xcm::v3::Location, JustTry, collator_session_keys(), ExistentialDeposit::get(), - MultiLocation { parents: 1, interior: X2(Parachain(1313), GeneralIndex(12345)) }, + xcm::v3::Location { + parents: 1, + interior: [xcm::v3::Junction::Parachain(1313), xcm::v3::Junction::GeneralIndex(12345)] + .into() + }, Box::new(|| { assert!(Assets::asset_ids().collect::>().is_empty()); }), @@ -541,8 +573,8 @@ asset_test_utils::include_create_and_manage_foreign_assets_for_local_consensus_p WeightToFee, ForeignCreatorsSovereignAccountOf, ForeignAssetsInstance, - MultiLocation, - JustTry, + xcm::v3::Location, + V4V3LocationConverter, collator_session_keys(), ExistentialDeposit::get(), AssetDeposit::get(), @@ -626,12 +658,12 @@ fn receive_reserve_asset_deposited_roc_from_asset_hub_rococo_works() { AccountId::from([73; 32]), AccountId::from(BLOCK_AUTHOR_ACCOUNT), // receiving ROCs - (MultiLocation { parents: 2, interior: X1(GlobalConsensus(Rococo)) }, 1000000000000, 1_000_000_000), + (xcm::v3::Location::new(2, [xcm::v3::Junction::GlobalConsensus(xcm::v3::NetworkId::Rococo)]), 1000000000000, 1_000_000_000), bridging_to_asset_hub_rococo, ( - X1(PalletInstance(bp_bridge_hub_westend::WITH_BRIDGE_WESTEND_TO_ROCOCO_MESSAGES_PALLET_INDEX)), + [PalletInstance(bp_bridge_hub_westend::WITH_BRIDGE_WESTEND_TO_ROCOCO_MESSAGES_PALLET_INDEX)].into(), GlobalConsensus(Rococo), - X1(Parachain(1000)) + [Parachain(1000)].into() ) ) } diff --git a/cumulus/parachains/runtimes/assets/common/src/benchmarks.rs b/cumulus/parachains/runtimes/assets/common/src/benchmarks.rs index 344cb5ca336..44bda1eb370 100644 --- a/cumulus/parachains/runtimes/assets/common/src/benchmarks.rs +++ b/cumulus/parachains/runtimes/assets/common/src/benchmarks.rs @@ -19,26 +19,25 @@ use sp_std::marker::PhantomData; use xcm::latest::prelude::*; /// Creates asset pairs for liquidity pools with `Target` always being the first asset. -pub struct AssetPairFactory( - PhantomData<(Target, SelfParaId, PalletId)>, +pub struct AssetPairFactory( + PhantomData<(Target, SelfParaId, PalletId, L)>, ); -impl, SelfParaId: Get, PalletId: Get> - pallet_asset_conversion::BenchmarkHelper - for AssetPairFactory +impl, SelfParaId: Get, PalletId: Get, L: TryFrom> + pallet_asset_conversion::BenchmarkHelper for AssetPairFactory { - fn create_pair(seed1: u32, seed2: u32) -> (MultiLocation, MultiLocation) { - let with_id = MultiLocation::new( + fn create_pair(seed1: u32, seed2: u32) -> (L, L) { + let with_id = Location::new( 1, - X3( + [ Parachain(SelfParaId::get().into()), PalletInstance(PalletId::get() as u8), GeneralIndex(seed2.into()), - ), + ], ); if seed1 % 2 == 0 { - (with_id, Target::get()) + (with_id.try_into().map_err(|_| "Something went wrong").unwrap(), Target::get()) } else { - (Target::get(), with_id) + (Target::get(), with_id.try_into().map_err(|_| "Something went wrong").unwrap()) } } } diff --git a/cumulus/parachains/runtimes/assets/common/src/foreign_creators.rs b/cumulus/parachains/runtimes/assets/common/src/foreign_creators.rs index 1ed7bd0538c..a9fd79bf939 100644 --- a/cumulus/parachains/runtimes/assets/common/src/foreign_creators.rs +++ b/cumulus/parachains/runtimes/assets/common/src/foreign_creators.rs @@ -17,21 +17,21 @@ use frame_support::traits::{ ContainsPair, EnsureOrigin, EnsureOriginWithArg, Everything, OriginTrait, }; use pallet_xcm::{EnsureXcm, Origin as XcmOrigin}; -use xcm::latest::MultiLocation; +use xcm::latest::Location; use xcm_executor::traits::ConvertLocation; /// `EnsureOriginWithArg` impl for `CreateOrigin` that allows only XCM origins that are locations /// containing the class location. -pub struct ForeignCreators( - sp_std::marker::PhantomData<(IsForeign, AccountOf, AccountId)>, +pub struct ForeignCreators( + sp_std::marker::PhantomData<(IsForeign, AccountOf, AccountId, L)>, ); impl< - IsForeign: ContainsPair, + IsForeign: ContainsPair, AccountOf: ConvertLocation, AccountId: Clone, RuntimeOrigin: From + OriginTrait + Clone, - > EnsureOriginWithArg - for ForeignCreators + L: TryFrom + TryInto + Clone, + > EnsureOriginWithArg for ForeignCreators where RuntimeOrigin::PalletsOrigin: From + TryInto, @@ -40,17 +40,20 @@ where fn try_origin( origin: RuntimeOrigin, - asset_location: &MultiLocation, + asset_location: &L, ) -> sp_std::result::Result { - let origin_location = EnsureXcm::::try_origin(origin.clone())?; + let origin_location = EnsureXcm::::try_origin(origin.clone())?; if !IsForeign::contains(asset_location, &origin_location) { return Err(origin) } - AccountOf::convert_location(&origin_location).ok_or(origin) + let latest_location: Location = + origin_location.clone().try_into().map_err(|_| origin.clone())?; + AccountOf::convert_location(&latest_location).ok_or(origin) } #[cfg(feature = "runtime-benchmarks")] - fn try_successful_origin(a: &MultiLocation) -> Result { - Ok(pallet_xcm::Origin::Xcm(*a).into()) + fn try_successful_origin(a: &L) -> Result { + let latest_location: Location = (*a).clone().try_into().map_err(|_| ())?; + Ok(pallet_xcm::Origin::Xcm(latest_location).into()) } } diff --git a/cumulus/parachains/runtimes/assets/common/src/fungible_conversion.rs b/cumulus/parachains/runtimes/assets/common/src/fungible_conversion.rs index 80f8a971d21..e21203485a7 100644 --- a/cumulus/parachains/runtimes/assets/common/src/fungible_conversion.rs +++ b/cumulus/parachains/runtimes/assets/common/src/fungible_conversion.rs @@ -19,52 +19,48 @@ use crate::runtime_api::FungiblesAccessError; use frame_support::traits::Contains; use sp_runtime::traits::MaybeEquivalence; use sp_std::{borrow::Borrow, vec::Vec}; -use xcm::latest::{MultiAsset, MultiLocation}; +use xcm::latest::{Asset, Location}; use xcm_builder::{ConvertedConcreteId, MatchedConvertedConcreteId}; use xcm_executor::traits::MatchesFungibles; -/// Converting any [`(AssetId, Balance)`] to [`MultiAsset`] -pub trait MultiAssetConverter: +/// Converting any [`(AssetId, Balance)`] to [`Asset`] +pub trait AssetConverter: MatchesFungibles where AssetId: Clone, Balance: Clone, - ConvertAssetId: MaybeEquivalence, + ConvertAssetId: MaybeEquivalence, ConvertBalance: MaybeEquivalence, { - fn convert_ref( - value: impl Borrow<(AssetId, Balance)>, - ) -> Result; + fn convert_ref(value: impl Borrow<(AssetId, Balance)>) -> Result; } -/// Checks for `MultiLocation`. -pub trait MatchesMultiLocation: +/// Checks for `Location`. +pub trait MatchesLocation: MatchesFungibles where AssetId: Clone, Balance: Clone, - MatchAssetId: Contains, - ConvertAssetId: MaybeEquivalence, + MatchAssetId: Contains, + ConvertAssetId: MaybeEquivalence, ConvertBalance: MaybeEquivalence, { - fn contains(location: &MultiLocation) -> bool; + fn contains(location: &Location) -> bool; } impl< AssetId: Clone, Balance: Clone, - ConvertAssetId: MaybeEquivalence, + ConvertAssetId: MaybeEquivalence, ConvertBalance: MaybeEquivalence, - > MultiAssetConverter + > AssetConverter for ConvertedConcreteId { - fn convert_ref( - value: impl Borrow<(AssetId, Balance)>, - ) -> Result { + fn convert_ref(value: impl Borrow<(AssetId, Balance)>) -> Result { let (asset_id, balance) = value.borrow(); match ConvertAssetId::convert_back(asset_id) { - Some(asset_id_as_multilocation) => match ConvertBalance::convert_back(balance) { - Some(amount) => Ok((asset_id_as_multilocation, amount).into()), + Some(asset_id_as_location) => match ConvertBalance::convert_back(balance) { + Some(amount) => Ok((asset_id_as_location, amount).into()), None => Err(FungiblesAccessError::AmountToBalanceConversionFailed), }, None => Err(FungiblesAccessError::AssetIdConversionFailed), @@ -75,19 +71,17 @@ impl< impl< AssetId: Clone, Balance: Clone, - MatchAssetId: Contains, - ConvertAssetId: MaybeEquivalence, + MatchAssetId: Contains, + ConvertAssetId: MaybeEquivalence, ConvertBalance: MaybeEquivalence, - > MultiAssetConverter + > AssetConverter for MatchedConvertedConcreteId { - fn convert_ref( - value: impl Borrow<(AssetId, Balance)>, - ) -> Result { + fn convert_ref(value: impl Borrow<(AssetId, Balance)>) -> Result { let (asset_id, balance) = value.borrow(); match ConvertAssetId::convert_back(asset_id) { - Some(asset_id_as_multilocation) => match ConvertBalance::convert_back(balance) { - Some(amount) => Ok((asset_id_as_multilocation, amount).into()), + Some(asset_id_as_location) => match ConvertBalance::convert_back(balance) { + Some(amount) => Ok((asset_id_as_location, amount).into()), None => Err(FungiblesAccessError::AmountToBalanceConversionFailed), }, None => Err(FungiblesAccessError::AssetIdConversionFailed), @@ -98,13 +92,13 @@ impl< impl< AssetId: Clone, Balance: Clone, - MatchAssetId: Contains, - ConvertAssetId: MaybeEquivalence, + MatchAssetId: Contains, + ConvertAssetId: MaybeEquivalence, ConvertBalance: MaybeEquivalence, - > MatchesMultiLocation + > MatchesLocation for MatchedConvertedConcreteId { - fn contains(location: &MultiLocation) -> bool { + fn contains(location: &Location) -> bool { MatchAssetId::contains(location) } } @@ -113,12 +107,12 @@ impl< impl< AssetId: Clone, Balance: Clone, - MatchAssetId: Contains, - ConvertAssetId: MaybeEquivalence, + MatchAssetId: Contains, + ConvertAssetId: MaybeEquivalence, ConvertBalance: MaybeEquivalence, - > MatchesMultiLocation for Tuple + > MatchesLocation for Tuple { - fn contains(location: &MultiLocation) -> bool { + fn contains(location: &Location) -> bool { for_tuples!( #( match Tuple::contains(location) { o @ true => return o, _ => () } )* ); @@ -127,27 +121,24 @@ impl< } } -/// Helper function to convert collections with [`(AssetId, Balance)`] to [`MultiAsset`] +/// Helper function to convert collections with [`(AssetId, Balance)`] to [`Asset`] pub fn convert<'a, AssetId, Balance, ConvertAssetId, ConvertBalance, Converter>( items: impl Iterator, -) -> Result, FungiblesAccessError> +) -> Result, FungiblesAccessError> where AssetId: Clone + 'a, Balance: Clone + 'a, - ConvertAssetId: MaybeEquivalence, + ConvertAssetId: MaybeEquivalence, ConvertBalance: MaybeEquivalence, - Converter: MultiAssetConverter, + Converter: AssetConverter, { items.map(Converter::convert_ref).collect() } -/// Helper function to convert `Balance` with MultiLocation` to `MultiAsset` -pub fn convert_balance< - T: frame_support::pallet_prelude::Get, - Balance: TryInto, ->( +/// Helper function to convert `Balance` with Location` to `Asset` +pub fn convert_balance, Balance: TryInto>( balance: Balance, -) -> Result { +) -> Result { match balance.try_into() { Ok(balance) => Ok((T::get(), balance).into()), Err(_) => Err(FungiblesAccessError::AmountToBalanceConversionFailed), @@ -162,20 +153,20 @@ mod tests { use xcm::latest::prelude::*; use xcm_executor::traits::{Identity, JustTry}; - type Converter = MatchedConvertedConcreteId; + type Converter = MatchedConvertedConcreteId; #[test] fn converted_concrete_id_fungible_multi_asset_conversion_roundtrip_works() { - let location = MultiLocation::new(0, X1(GlobalConsensus(ByGenesis([0; 32])))); + let location = Location::new(0, [GlobalConsensus(ByGenesis([0; 32]))]); let amount = 123456_u64; - let expected_multi_asset = MultiAsset { - id: Concrete(MultiLocation::new(0, X1(GlobalConsensus(ByGenesis([0; 32]))))), + let expected_multi_asset = Asset { + id: AssetId(Location::new(0, [GlobalConsensus(ByGenesis([0; 32]))])), fun: Fungible(123456_u128), }; assert_eq!( Converter::matches_fungibles(&expected_multi_asset).map_err(|_| ()), - Ok((location, amount)) + Ok((location.clone(), amount)) ); assert_eq!(Converter::convert_ref((location, amount)), Ok(expected_multi_asset)); @@ -184,17 +175,17 @@ mod tests { #[test] fn converted_concrete_id_fungible_multi_asset_conversion_collection_works() { let data = vec![ - (MultiLocation::new(0, X1(GlobalConsensus(ByGenesis([0; 32])))), 123456_u64), - (MultiLocation::new(1, X1(GlobalConsensus(ByGenesis([1; 32])))), 654321_u64), + (Location::new(0, [GlobalConsensus(ByGenesis([0; 32]))]), 123456_u64), + (Location::new(1, [GlobalConsensus(ByGenesis([1; 32]))]), 654321_u64), ]; let expected_data = vec![ - MultiAsset { - id: Concrete(MultiLocation::new(0, X1(GlobalConsensus(ByGenesis([0; 32]))))), + Asset { + id: AssetId(Location::new(0, [GlobalConsensus(ByGenesis([0; 32]))])), fun: Fungible(123456_u128), }, - MultiAsset { - id: Concrete(MultiLocation::new(1, X1(GlobalConsensus(ByGenesis([1; 32]))))), + Asset { + id: AssetId(Location::new(1, [GlobalConsensus(ByGenesis([1; 32]))])), fun: Fungible(654321_u128), }, ]; diff --git a/cumulus/parachains/runtimes/assets/common/src/lib.rs b/cumulus/parachains/runtimes/assets/common/src/lib.rs index b0e47143929..f21e1766436 100644 --- a/cumulus/parachains/runtimes/assets/common/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/common/src/lib.rs @@ -23,15 +23,24 @@ pub mod local_and_foreign_assets; pub mod matching; pub mod runtime_api; -use crate::matching::{LocalMultiLocationPattern, ParentLocation}; +use crate::matching::{LocalLocationPattern, ParentLocation}; use frame_support::traits::{Equals, EverythingBut}; use parachains_common::AssetIdForTrustBackedAssets; -use xcm::prelude::MultiLocation; -use xcm_builder::{AsPrefixedGeneralIndex, MatchedConvertedConcreteId, StartsWith}; -use xcm_executor::traits::{Identity, JustTry}; +use xcm_builder::{ + AsPrefixedGeneralIndex, MatchedConvertedConcreteId, StartsWith, V4V3LocationConverter, +}; +use xcm_executor::traits::JustTry; -/// `MultiLocation` vs `AssetIdForTrustBackedAssets` converter for `TrustBackedAssets` +/// `Location` vs `AssetIdForTrustBackedAssets` converter for `TrustBackedAssets` pub type AssetIdForTrustBackedAssetsConvert = + AsPrefixedGeneralIndex< + TrustBackedAssetsPalletLocation, + AssetIdForTrustBackedAssets, + JustTry, + xcm::v3::Location, + >; + +pub type AssetIdForTrustBackedAssetsConvertLatest = AsPrefixedGeneralIndex; /// [`MatchedConvertedConcreteId`] converter dedicated for `TrustBackedAssets` @@ -40,59 +49,55 @@ pub type TrustBackedAssetsConvertedConcreteId, - AssetIdForTrustBackedAssetsConvert, + AssetIdForTrustBackedAssetsConvertLatest, JustTry, >; -/// AssetId used for identifying assets by MultiLocation. -pub type MultiLocationForAssetId = MultiLocation; +/// [`MatchedConvertedConcreteId`] converter dedicated for storing `AssetId` as `Location`. +pub type LocationConvertedConcreteId = MatchedConvertedConcreteId< + xcm::v3::Location, + Balance, + LocationFilter, + V4V3LocationConverter, + JustTry, +>; /// [`MatchedConvertedConcreteId`] converter dedicated for `TrustBackedAssets` -pub type TrustBackedAssetsAsMultiLocation = +pub type TrustBackedAssetsAsLocation = MatchedConvertedConcreteId< - MultiLocationForAssetId, + xcm::v3::Location, Balance, StartsWith, - Identity, - JustTry, - >; - -/// [`MatchedConvertedConcreteId`] converter dedicated for storing `AssetId` as `MultiLocation`. -pub type MultiLocationConvertedConcreteId = - MatchedConvertedConcreteId< - MultiLocationForAssetId, - Balance, - MultiLocationFilter, - Identity, + V4V3LocationConverter, JustTry, >; /// [`MatchedConvertedConcreteId`] converter dedicated for storing `ForeignAssets` with `AssetId` as -/// `MultiLocation`. +/// `Location`. /// /// Excludes by default: /// - parent as relay chain -/// - all local MultiLocations +/// - all local Locations /// -/// `AdditionalMultiLocationExclusionFilter` can customize additional excluded MultiLocations -pub type ForeignAssetsConvertedConcreteId = - MultiLocationConvertedConcreteId< +/// `AdditionalLocationExclusionFilter` can customize additional excluded Locations +pub type ForeignAssetsConvertedConcreteId = + LocationConvertedConcreteId< EverythingBut<( // Excludes relay/parent chain currency Equals, // Here we rely on fact that something like this works: - // assert!(MultiLocation::new(1, - // X1(Parachain(100))).starts_with(&MultiLocation::parent())); - // assert!(X1(Parachain(100)).starts_with(&Here)); - StartsWith, + // assert!(Location::new(1, + // [Parachain(100)]).starts_with(&Location::parent())); + // assert!([Parachain(100)].into().starts_with(&Here)); + StartsWith, // Here we can exclude more stuff or leave it as `()` - AdditionalMultiLocationExclusionFilter, + AdditionalLocationExclusionFilter, )>, Balance, >; type AssetIdForPoolAssets = u32; -/// `MultiLocation` vs `AssetIdForPoolAssets` converter for `PoolAssets`. +/// `Location` vs `AssetIdForPoolAssets` converter for `PoolAssets`. pub type AssetIdForPoolAssetsConvert = AsPrefixedGeneralIndex; /// [`MatchedConvertedConcreteId`] converter dedicated for `PoolAssets` @@ -109,28 +114,28 @@ pub type PoolAssetsConvertedConcreteId = mod tests { use super::*; use sp_runtime::traits::MaybeEquivalence; - use xcm::latest::prelude::*; + use xcm::prelude::*; use xcm_builder::StartsWithExplicitGlobalConsensus; use xcm_executor::traits::{Error as MatchError, MatchesFungibles}; #[test] fn asset_id_for_trust_backed_assets_convert_works() { frame_support::parameter_types! { - pub TrustBackedAssetsPalletLocation: MultiLocation = MultiLocation::new(5, X1(PalletInstance(13))); + pub TrustBackedAssetsPalletLocation: Location = Location::new(5, [PalletInstance(13)]); } let local_asset_id = 123456789 as AssetIdForTrustBackedAssets; let expected_reverse_ref = - MultiLocation::new(5, X2(PalletInstance(13), GeneralIndex(local_asset_id.into()))); + Location::new(5, [PalletInstance(13), GeneralIndex(local_asset_id.into())]); assert_eq!( - AssetIdForTrustBackedAssetsConvert::::convert_back( + AssetIdForTrustBackedAssetsConvertLatest::::convert_back( &local_asset_id ) .unwrap(), expected_reverse_ref ); assert_eq!( - AssetIdForTrustBackedAssetsConvert::::convert( + AssetIdForTrustBackedAssetsConvertLatest::::convert( &expected_reverse_ref ) .unwrap(), @@ -141,7 +146,7 @@ mod tests { #[test] fn trust_backed_assets_match_fungibles_works() { frame_support::parameter_types! { - pub TrustBackedAssetsPalletLocation: MultiLocation = MultiLocation::new(0, X1(PalletInstance(13))); + pub TrustBackedAssetsPalletLocation: Location = Location::new(0, [PalletInstance(13)]); } // setup convert type TrustBackedAssetsConvert = @@ -149,85 +154,86 @@ mod tests { let test_data = vec![ // missing GeneralIndex - (ma_1000(0, X1(PalletInstance(13))), Err(MatchError::AssetIdConversionFailed)), + (ma_1000(0, [PalletInstance(13)].into()), Err(MatchError::AssetIdConversionFailed)), ( - ma_1000(0, X2(PalletInstance(13), GeneralKey { data: [0; 32], length: 32 })), + ma_1000(0, [PalletInstance(13), GeneralKey { data: [0; 32], length: 32 }].into()), Err(MatchError::AssetIdConversionFailed), ), ( - ma_1000(0, X2(PalletInstance(13), Parachain(1000))), + ma_1000(0, [PalletInstance(13), Parachain(1000)].into()), Err(MatchError::AssetIdConversionFailed), ), // OK - (ma_1000(0, X2(PalletInstance(13), GeneralIndex(1234))), Ok((1234, 1000))), + (ma_1000(0, [PalletInstance(13), GeneralIndex(1234)].into()), Ok((1234, 1000))), ( - ma_1000(0, X3(PalletInstance(13), GeneralIndex(1234), GeneralIndex(2222))), + ma_1000(0, [PalletInstance(13), GeneralIndex(1234), GeneralIndex(2222)].into()), Ok((1234, 1000)), ), ( ma_1000( 0, - X4( + [ PalletInstance(13), GeneralIndex(1234), GeneralIndex(2222), GeneralKey { data: [0; 32], length: 32 }, - ), + ] + .into(), ), Ok((1234, 1000)), ), // wrong pallet instance ( - ma_1000(0, X2(PalletInstance(77), GeneralIndex(1234))), + ma_1000(0, [PalletInstance(77), GeneralIndex(1234)].into()), Err(MatchError::AssetNotHandled), ), ( - ma_1000(0, X3(PalletInstance(77), GeneralIndex(1234), GeneralIndex(2222))), + ma_1000(0, [PalletInstance(77), GeneralIndex(1234), GeneralIndex(2222)].into()), Err(MatchError::AssetNotHandled), ), // wrong parent ( - ma_1000(1, X2(PalletInstance(13), GeneralIndex(1234))), + ma_1000(1, [PalletInstance(13), GeneralIndex(1234)].into()), Err(MatchError::AssetNotHandled), ), ( - ma_1000(1, X3(PalletInstance(13), GeneralIndex(1234), GeneralIndex(2222))), + ma_1000(1, [PalletInstance(13), GeneralIndex(1234), GeneralIndex(2222)].into()), Err(MatchError::AssetNotHandled), ), ( - ma_1000(1, X2(PalletInstance(77), GeneralIndex(1234))), + ma_1000(1, [PalletInstance(77), GeneralIndex(1234)].into()), Err(MatchError::AssetNotHandled), ), ( - ma_1000(1, X3(PalletInstance(77), GeneralIndex(1234), GeneralIndex(2222))), + ma_1000(1, [PalletInstance(77), GeneralIndex(1234), GeneralIndex(2222)].into()), Err(MatchError::AssetNotHandled), ), // wrong parent ( - ma_1000(2, X2(PalletInstance(13), GeneralIndex(1234))), + ma_1000(2, [PalletInstance(13), GeneralIndex(1234)].into()), Err(MatchError::AssetNotHandled), ), ( - ma_1000(2, X3(PalletInstance(13), GeneralIndex(1234), GeneralIndex(2222))), + ma_1000(2, [PalletInstance(13), GeneralIndex(1234), GeneralIndex(2222)].into()), Err(MatchError::AssetNotHandled), ), // missing GeneralIndex - (ma_1000(0, X1(PalletInstance(77))), Err(MatchError::AssetNotHandled)), - (ma_1000(1, X1(PalletInstance(13))), Err(MatchError::AssetNotHandled)), - (ma_1000(2, X1(PalletInstance(13))), Err(MatchError::AssetNotHandled)), + (ma_1000(0, [PalletInstance(77)].into()), Err(MatchError::AssetNotHandled)), + (ma_1000(1, [PalletInstance(13)].into()), Err(MatchError::AssetNotHandled)), + (ma_1000(2, [PalletInstance(13)].into()), Err(MatchError::AssetNotHandled)), ]; - for (multi_asset, expected_result) in test_data { + for (asset, expected_result) in test_data { assert_eq!( - >::matches_fungibles(&multi_asset), - expected_result, "multi_asset: {:?}", multi_asset); + >::matches_fungibles(&asset.clone().try_into().unwrap()), + expected_result, "asset: {:?}", asset); } } #[test] - fn multi_location_converted_concrete_id_converter_works() { + fn location_converted_concrete_id_converter_works() { frame_support::parameter_types! { - pub Parachain100Pattern: MultiLocation = MultiLocation::new(1, X1(Parachain(100))); + pub Parachain100Pattern: Location = Location::new(1, [Parachain(100)]); pub UniversalLocationNetworkId: NetworkId = NetworkId::ByGenesis([9; 32]); } @@ -243,95 +249,125 @@ mod tests { let test_data = vec![ // excluded as local (ma_1000(0, Here), Err(MatchError::AssetNotHandled)), - (ma_1000(0, X1(Parachain(100))), Err(MatchError::AssetNotHandled)), + (ma_1000(0, [Parachain(100)].into()), Err(MatchError::AssetNotHandled)), ( - ma_1000(0, X2(PalletInstance(13), GeneralIndex(1234))), + ma_1000(0, [PalletInstance(13), GeneralIndex(1234)].into()), Err(MatchError::AssetNotHandled), ), // excluded as parent (ma_1000(1, Here), Err(MatchError::AssetNotHandled)), // excluded as additional filter - Parachain100Pattern - (ma_1000(1, X1(Parachain(100))), Err(MatchError::AssetNotHandled)), - (ma_1000(1, X2(Parachain(100), GeneralIndex(1234))), Err(MatchError::AssetNotHandled)), + (ma_1000(1, [Parachain(100)].into()), Err(MatchError::AssetNotHandled)), ( - ma_1000(1, X3(Parachain(100), PalletInstance(13), GeneralIndex(1234))), + ma_1000(1, [Parachain(100), GeneralIndex(1234)].into()), + Err(MatchError::AssetNotHandled), + ), + ( + ma_1000(1, [Parachain(100), PalletInstance(13), GeneralIndex(1234)].into()), Err(MatchError::AssetNotHandled), ), // excluded as additional filter - StartsWithExplicitGlobalConsensus ( - ma_1000(1, X1(GlobalConsensus(NetworkId::ByGenesis([9; 32])))), + ma_1000(1, [GlobalConsensus(NetworkId::ByGenesis([9; 32]))].into()), Err(MatchError::AssetNotHandled), ), ( - ma_1000(2, X1(GlobalConsensus(NetworkId::ByGenesis([9; 32])))), + ma_1000(2, [GlobalConsensus(NetworkId::ByGenesis([9; 32]))].into()), Err(MatchError::AssetNotHandled), ), ( ma_1000( 2, - X3( + [ GlobalConsensus(NetworkId::ByGenesis([9; 32])), Parachain(200), GeneralIndex(1234), - ), + ] + .into(), ), Err(MatchError::AssetNotHandled), ), // ok - (ma_1000(1, X1(Parachain(200))), Ok((MultiLocation::new(1, X1(Parachain(200))), 1000))), - (ma_1000(2, X1(Parachain(200))), Ok((MultiLocation::new(2, X1(Parachain(200))), 1000))), ( - ma_1000(1, X2(Parachain(200), GeneralIndex(1234))), - Ok((MultiLocation::new(1, X2(Parachain(200), GeneralIndex(1234))), 1000)), + ma_1000(1, [Parachain(200)].into()), + Ok((xcm::v3::Location::new(1, [xcm::v3::Junction::Parachain(200)]), 1000)), + ), + ( + ma_1000(2, [Parachain(200)].into()), + Ok((xcm::v3::Location::new(2, [xcm::v3::Junction::Parachain(200)]), 1000)), ), ( - ma_1000(2, X2(Parachain(200), GeneralIndex(1234))), - Ok((MultiLocation::new(2, X2(Parachain(200), GeneralIndex(1234))), 1000)), + ma_1000(1, [Parachain(200), GeneralIndex(1234)].into()), + Ok(( + xcm::v3::Location::new( + 1, + [xcm::v3::Junction::Parachain(200), xcm::v3::Junction::GeneralIndex(1234)], + ), + 1000, + )), ), ( - ma_1000(2, X1(GlobalConsensus(NetworkId::ByGenesis([7; 32])))), + ma_1000(2, [Parachain(200), GeneralIndex(1234)].into()), Ok(( - MultiLocation::new(2, X1(GlobalConsensus(NetworkId::ByGenesis([7; 32])))), + xcm::v3::Location::new( + 2, + [xcm::v3::Junction::Parachain(200), xcm::v3::Junction::GeneralIndex(1234)], + ), + 1000, + )), + ), + ( + ma_1000(2, [GlobalConsensus(NetworkId::ByGenesis([7; 32]))].into()), + Ok(( + xcm::v3::Location::new( + 2, + [xcm::v3::Junction::GlobalConsensus(xcm::v3::NetworkId::ByGenesis( + [7; 32], + ))], + ), 1000, )), ), ( ma_1000( 2, - X3( + [ GlobalConsensus(NetworkId::ByGenesis([7; 32])), Parachain(200), GeneralIndex(1234), - ), + ] + .into(), ), Ok(( - MultiLocation::new( + xcm::v3::Location::new( 2, - X3( - GlobalConsensus(NetworkId::ByGenesis([7; 32])), - Parachain(200), - GeneralIndex(1234), - ), + [ + xcm::v3::Junction::GlobalConsensus(xcm::v3::NetworkId::ByGenesis( + [7; 32], + )), + xcm::v3::Junction::Parachain(200), + xcm::v3::Junction::GeneralIndex(1234), + ], ), 1000, )), ), ]; - for (multi_asset, expected_result) in test_data { + for (asset, expected_result) in test_data { assert_eq!( - >::matches_fungibles( - &multi_asset + >::matches_fungibles( + &asset.clone().try_into().unwrap() ), expected_result, - "multi_asset: {:?}", - multi_asset + "asset: {:?}", + asset ); } } - // Create MultiAsset - fn ma_1000(parents: u8, interior: Junctions) -> MultiAsset { - (MultiLocation::new(parents, interior), 1000).into() + // Create Asset + fn ma_1000(parents: u8, interior: Junctions) -> Asset { + (Location::new(parents, interior), 1000).into() } } diff --git a/cumulus/parachains/runtimes/assets/common/src/local_and_foreign_assets.rs b/cumulus/parachains/runtimes/assets/common/src/local_and_foreign_assets.rs index 7dd497797ea..7c237660610 100644 --- a/cumulus/parachains/runtimes/assets/common/src/local_and_foreign_assets.rs +++ b/cumulus/parachains/runtimes/assets/common/src/local_and_foreign_assets.rs @@ -20,32 +20,32 @@ use sp_runtime::{ Either::{Left, Right}, }; use sp_std::marker::PhantomData; -use xcm::latest::MultiLocation; +use xcm::latest::Location; -/// Converts a given [`MultiLocation`] to [`Either::Left`] when equal to `Target`, or +/// Converts a given [`Location`] to [`Either::Left`] when equal to `Target`, or /// [`Either::Right`] otherwise. /// /// Suitable for use as a `Criterion` with [`frame_support::traits::tokens::fungible::UnionOf`]. -pub struct TargetFromLeft(PhantomData); -impl> Convert> - for TargetFromLeft -{ - fn convert(l: MultiLocation) -> Either<(), MultiLocation> { +pub struct TargetFromLeft(PhantomData<(Target, L)>); +impl, L: PartialEq + Eq> Convert> for TargetFromLeft { + fn convert(l: L) -> Either<(), L> { Target::get().eq(&l).then(|| Left(())).map_or(Right(l), |n| n) } } -/// Converts a given [`MultiLocation`] to [`Either::Left`] based on the `Equivalence` criteria. +/// Converts a given [`Location`] to [`Either::Left`] based on the `Equivalence` criteria. /// Returns [`Either::Right`] if not equivalent. /// /// Suitable for use as a `Criterion` with [`frame_support::traits::tokens::fungibles::UnionOf`]. -pub struct LocalFromLeft(PhantomData<(Equivalence, AssetId)>); -impl Convert> - for LocalFromLeft +pub struct LocalFromLeft( + PhantomData<(Equivalence, AssetId, L)>, +); +impl Convert> + for LocalFromLeft where - Equivalence: MaybeEquivalence, + Equivalence: MaybeEquivalence, { - fn convert(l: MultiLocation) -> Either { + fn convert(l: L) -> Either { match Equivalence::convert(&l) { Some(id) => Left(id), None => Right(l), @@ -53,7 +53,7 @@ where } } -pub trait MatchesLocalAndForeignAssetsMultiLocation { - fn is_local(location: &MultiLocation) -> bool; - fn is_foreign(location: &MultiLocation) -> bool; +pub trait MatchesLocalAndForeignAssetsLocation { + fn is_local(location: &L) -> bool; + fn is_foreign(location: &L) -> bool; } diff --git a/cumulus/parachains/runtimes/assets/common/src/matching.rs b/cumulus/parachains/runtimes/assets/common/src/matching.rs index d6ecc3ec99f..478bba4565d 100644 --- a/cumulus/parachains/runtimes/assets/common/src/matching.rs +++ b/cumulus/parachains/runtimes/assets/common/src/matching.rs @@ -15,67 +15,72 @@ use cumulus_primitives_core::ParaId; use frame_support::{pallet_prelude::Get, traits::ContainsPair}; -use xcm::{ - latest::prelude::{MultiAsset, MultiLocation}, - prelude::*, -}; +use xcm::prelude::*; + use xcm_builder::ensure_is_remote; frame_support::parameter_types! { - pub LocalMultiLocationPattern: MultiLocation = MultiLocation::new(0, Here); - pub ParentLocation: MultiLocation = MultiLocation::parent(); + pub LocalLocationPattern: Location = Location::new(0, Here); + pub ParentLocation: Location = Location::parent(); } /// Accepts an asset if it is from the origin. pub struct IsForeignConcreteAsset(sp_std::marker::PhantomData); -impl> ContainsPair +impl> ContainsPair for IsForeignConcreteAsset { - fn contains(asset: &MultiAsset, origin: &MultiLocation) -> bool { + fn contains(asset: &Asset, origin: &Location) -> bool { log::trace!(target: "xcm::contains", "IsForeignConcreteAsset asset: {:?}, origin: {:?}", asset, origin); - matches!(asset.id, Concrete(ref id) if IsForeign::contains(id, origin)) + matches!(asset.id, AssetId(ref id) if IsForeign::contains(id, origin)) } } -/// Checks if `a` is from sibling location `b`. Checks that `MultiLocation-a` starts with -/// `MultiLocation-b`, and that the `ParaId` of `b` is not equal to `a`. -pub struct FromSiblingParachain(sp_std::marker::PhantomData); -impl> ContainsPair - for FromSiblingParachain +/// Checks if `a` is from sibling location `b`. Checks that `Location-a` starts with +/// `Location-b`, and that the `ParaId` of `b` is not equal to `a`. +pub struct FromSiblingParachain( + sp_std::marker::PhantomData<(SelfParaId, L)>, +); +impl, L: TryFrom + TryInto + Clone> ContainsPair + for FromSiblingParachain { - fn contains(&a: &MultiLocation, b: &MultiLocation) -> bool { - // `a` needs to be from `b` at least - if !a.starts_with(b) { - return false - } + fn contains(a: &L, b: &L) -> bool { + // We convert locations to latest + let a = match ((*a).clone().try_into(), (*b).clone().try_into()) { + (Ok(a), Ok(b)) if a.starts_with(&b) => a, // `a` needs to be from `b` at least + _ => return false, + }; // here we check if sibling - match a { - MultiLocation { parents: 1, interior } => + match a.unpack() { + (1, interior) => matches!(interior.first(), Some(Parachain(sibling_para_id)) if sibling_para_id.ne(&u32::from(SelfParaId::get()))), _ => false, } } } -/// Checks if `a` is from the expected global consensus network. Checks that `MultiLocation-a` -/// starts with `MultiLocation-b`, and that network is a foreign consensus system. -pub struct FromNetwork( - sp_std::marker::PhantomData<(UniversalLocation, ExpectedNetworkId)>, +/// Checks if `a` is from the expected global consensus network. Checks that `Location-a` +/// starts with `Location-b`, and that network is a foreign consensus system. +pub struct FromNetwork( + sp_std::marker::PhantomData<(UniversalLocation, ExpectedNetworkId, L)>, ); -impl, ExpectedNetworkId: Get> - ContainsPair for FromNetwork +impl< + UniversalLocation: Get, + ExpectedNetworkId: Get, + L: TryFrom + TryInto + Clone, + > ContainsPair for FromNetwork { - fn contains(&a: &MultiLocation, b: &MultiLocation) -> bool { - // `a` needs to be from `b` at least - if !a.starts_with(b) { - return false - } + fn contains(a: &L, b: &L) -> bool { + // We convert locations to latest + let a = match ((*a).clone().try_into(), (*b).clone().try_into()) { + (Ok(a), Ok(b)) if a.starts_with(&b) => a, // `a` needs to be from `b` at least + _ => return false, + }; let universal_source = UniversalLocation::get(); - // ensure that `a`` is remote and from the expected network - match ensure_is_remote(universal_source, a) { + // ensure that `a` is remote and from the expected network + match ensure_is_remote(universal_source.clone(), a.clone()) { Ok((network_id, _)) => network_id == ExpectedNetworkId::get(), Err(e) => { log::trace!( @@ -89,19 +94,17 @@ impl, ExpectedNetworkId: Get( sp_std::marker::PhantomData<(UniversalLocation, Reserves)>, ); -impl< - UniversalLocation: Get, - Reserves: ContainsPair, - > ContainsPair +impl, Reserves: ContainsPair> + ContainsPair for IsTrustedBridgedReserveLocationForConcreteAsset { - fn contains(asset: &MultiAsset, origin: &MultiLocation) -> bool { + fn contains(asset: &Asset, origin: &Location) -> bool { let universal_source = UniversalLocation::get(); log::trace!( target: "xcm::contains", @@ -110,7 +113,7 @@ impl< ); // check remote origin - let _ = match ensure_is_remote(universal_source, *origin) { + let _ = match ensure_is_remote(universal_source.clone(), origin.clone()) { Ok(devolved) => devolved, Err(_) => { log::trace!( @@ -133,14 +136,14 @@ mod tests { use frame_support::parameter_types; parameter_types! { - pub UniversalLocation: InteriorMultiLocation = X2(GlobalConsensus(Rococo), Parachain(1000)); + pub UniversalLocation: InteriorLocation = [GlobalConsensus(Rococo), Parachain(1000)].into(); pub ExpectedNetworkId: NetworkId = Wococo; } #[test] fn from_network_contains_works() { // asset and origin from foreign consensus works - let asset: MultiLocation = ( + let asset: Location = ( Parent, Parent, GlobalConsensus(Wococo), @@ -149,12 +152,11 @@ mod tests { GeneralIndex(1), ) .into(); - let origin: MultiLocation = - (Parent, Parent, GlobalConsensus(Wococo), Parachain(1000)).into(); + let origin: Location = (Parent, Parent, GlobalConsensus(Wococo), Parachain(1000)).into(); assert!(FromNetwork::::contains(&asset, &origin)); // asset and origin from local consensus fails - let asset: MultiLocation = ( + let asset: Location = ( Parent, Parent, GlobalConsensus(Rococo), @@ -163,17 +165,16 @@ mod tests { GeneralIndex(1), ) .into(); - let origin: MultiLocation = - (Parent, Parent, GlobalConsensus(Rococo), Parachain(1000)).into(); + let origin: Location = (Parent, Parent, GlobalConsensus(Rococo), Parachain(1000)).into(); assert!(!FromNetwork::::contains(&asset, &origin)); // asset and origin from here fails - let asset: MultiLocation = (PalletInstance(1), GeneralIndex(1)).into(); - let origin: MultiLocation = Here.into(); + let asset: Location = (PalletInstance(1), GeneralIndex(1)).into(); + let origin: Location = Here.into(); assert!(!FromNetwork::::contains(&asset, &origin)); // asset from different consensus fails - let asset: MultiLocation = ( + let asset: Location = ( Parent, Parent, GlobalConsensus(Polkadot), @@ -182,12 +183,11 @@ mod tests { GeneralIndex(1), ) .into(); - let origin: MultiLocation = - (Parent, Parent, GlobalConsensus(Wococo), Parachain(1000)).into(); + let origin: Location = (Parent, Parent, GlobalConsensus(Wococo), Parachain(1000)).into(); assert!(!FromNetwork::::contains(&asset, &origin)); // origin from different consensus fails - let asset: MultiLocation = ( + let asset: Location = ( Parent, Parent, GlobalConsensus(Wococo), @@ -196,12 +196,11 @@ mod tests { GeneralIndex(1), ) .into(); - let origin: MultiLocation = - (Parent, Parent, GlobalConsensus(Polkadot), Parachain(1000)).into(); + let origin: Location = (Parent, Parent, GlobalConsensus(Polkadot), Parachain(1000)).into(); assert!(!FromNetwork::::contains(&asset, &origin)); // asset and origin from unexpected consensus fails - let asset: MultiLocation = ( + let asset: Location = ( Parent, Parent, GlobalConsensus(Polkadot), @@ -210,8 +209,7 @@ mod tests { GeneralIndex(1), ) .into(); - let origin: MultiLocation = - (Parent, Parent, GlobalConsensus(Polkadot), Parachain(1000)).into(); + let origin: Location = (Parent, Parent, GlobalConsensus(Polkadot), Parachain(1000)).into(); assert!(!FromNetwork::::contains(&asset, &origin)); } } diff --git a/cumulus/parachains/runtimes/assets/common/src/runtime_api.rs b/cumulus/parachains/runtimes/assets/common/src/runtime_api.rs index 0a166a04819..19977cbedab 100644 --- a/cumulus/parachains/runtimes/assets/common/src/runtime_api.rs +++ b/cumulus/parachains/runtimes/assets/common/src/runtime_api.rs @@ -18,12 +18,12 @@ use codec::{Codec, Decode, Encode}; use sp_runtime::RuntimeDebug; #[cfg(feature = "std")] -use {sp_std::vec::Vec, xcm::latest::MultiAsset}; +use {sp_std::vec::Vec, xcm::latest::Asset}; /// The possible errors that can happen querying the storage of assets. #[derive(Eq, PartialEq, Encode, Decode, RuntimeDebug, scale_info::TypeInfo)] pub enum FungiblesAccessError { - /// `MultiLocation` to `AssetId`/`ClassId` conversion failed. + /// `Location` to `AssetId`/`ClassId` conversion failed. AssetIdConversionFailed, /// `u128` amount to currency `Balance` conversion failed. AmountToBalanceConversionFailed, @@ -36,11 +36,11 @@ sp_api::decl_runtime_apis! { where AccountId: Codec, { - /// Returns the list of all [`MultiAsset`] that an `AccountId` has. + /// Returns the list of all [`Asset`] that an `AccountId` has. #[changed_in(2)] - fn query_account_balances(account: AccountId) -> Result, FungiblesAccessError>; + fn query_account_balances(account: AccountId) -> Result, FungiblesAccessError>; - /// Returns the list of all [`MultiAsset`] that an `AccountId` has. - fn query_account_balances(account: AccountId) -> Result; + /// Returns the list of all [`Asset`] that an `AccountId` has. + fn query_account_balances(account: AccountId) -> Result; } } diff --git a/cumulus/parachains/runtimes/assets/test-utils/src/lib.rs b/cumulus/parachains/runtimes/assets/test-utils/src/lib.rs index 872ad06ddd5..877d61780ce 100644 --- a/cumulus/parachains/runtimes/assets/test-utils/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/test-utils/src/lib.rs @@ -28,7 +28,7 @@ use xcm::latest::prelude::*; use xcm_builder::{CreateMatcher, MatchXcm}; /// Given a message, a sender, and a destination, it returns the delivery fees -fn get_fungible_delivery_fees(destination: MultiLocation, message: Xcm<()>) -> u128 { +fn get_fungible_delivery_fees(destination: Location, message: Xcm<()>) -> u128 { let Ok((_, delivery_fees)) = validate_send::(destination, message) else { unreachable!("message can be sent; qed") }; @@ -46,8 +46,8 @@ fn get_fungible_delivery_fees(destination: MultiLocation, message: X /// chain as part of a reserve-asset-transfer. pub(crate) fn assert_matches_reserve_asset_deposited_instructions( xcm: &mut Xcm, - expected_reserve_assets_deposited: &MultiAssets, - expected_beneficiary: &MultiLocation, + expected_reserve_assets_deposited: &Assets, + expected_beneficiary: &Location, ) { let _ = xcm .0 diff --git a/cumulus/parachains/runtimes/assets/test-utils/src/test_cases.rs b/cumulus/parachains/runtimes/assets/test-utils/src/test_cases.rs index 915d99470c3..e981fae8015 100644 --- a/cumulus/parachains/runtimes/assets/test-utils/src/test_cases.rs +++ b/cumulus/parachains/runtimes/assets/test-utils/src/test_cases.rs @@ -37,7 +37,7 @@ use sp_runtime::{ traits::{MaybeEquivalence, StaticLookup, Zero}, DispatchError, Saturating, }; -use xcm::{latest::prelude::*, VersionedMultiAssets}; +use xcm::{latest::prelude::*, VersionedAssets}; use xcm_executor::{traits::ConvertLocation, XcmExecutor}; type RuntimeHelper = @@ -110,7 +110,7 @@ pub fn teleports_for_native_asset_works< 0.into() ); - let native_asset_id = MultiLocation::parent(); + let native_asset_id = Location::parent(); let buy_execution_fee_amount_eta = WeightToFee::weight_to_fee(&Weight::from_parts(90_000_000_000, 1024)); let native_asset_amount_unit = existential_deposit; @@ -119,38 +119,40 @@ pub fn teleports_for_native_asset_works< // 1. process received teleported assets from relaychain let xcm = Xcm(vec![ - ReceiveTeleportedAsset(MultiAssets::from(vec![MultiAsset { - id: Concrete(native_asset_id), + ReceiveTeleportedAsset(Assets::from(vec![Asset { + id: AssetId(native_asset_id.clone()), fun: Fungible(native_asset_amount_received.into()), }])), ClearOrigin, BuyExecution { - fees: MultiAsset { - id: Concrete(native_asset_id), + fees: Asset { + id: AssetId(native_asset_id.clone()), fun: Fungible(buy_execution_fee_amount_eta), }, weight_limit: Limited(Weight::from_parts(3035310000, 65536)), }, DepositAsset { assets: Wild(AllCounted(1)), - beneficiary: MultiLocation { + beneficiary: Location { parents: 0, - interior: X1(AccountId32 { + interior: [AccountId32 { network: None, id: target_account.clone().into(), - }), + }] + .into(), }, }, ExpectTransactStatus(MaybeErrorCode::Success), ]); - let hash = xcm.using_encoded(sp_io::hashing::blake2_256); + let mut hash = xcm.using_encoded(sp_io::hashing::blake2_256); - let outcome = XcmExecutor::::execute_xcm( + let outcome = XcmExecutor::::prepare_and_execute( Parent, xcm, - hash, + &mut hash, RuntimeHelper::::xcm_max_weight(XcmReceivedFrom::Parent), + Weight::zero(), ); assert_ok!(outcome.ensure_complete()); @@ -163,14 +165,14 @@ pub fn teleports_for_native_asset_works< // 2. try to teleport asset back to the relaychain { - let dest = MultiLocation::parent(); - let mut dest_beneficiary = MultiLocation::parent() + let dest = Location::parent(); + let mut dest_beneficiary = Location::parent() .appended_with(AccountId32 { network: None, id: sp_runtime::AccountId32::new([3; 32]).into(), }) .unwrap(); - dest_beneficiary.reanchor(&dest, XcmConfig::UniversalLocation::get()).unwrap(); + dest_beneficiary.reanchor(&dest, &XcmConfig::UniversalLocation::get()).unwrap(); let target_account_balance_before_teleport = >::free_balance(&target_account); @@ -183,11 +185,11 @@ pub fn teleports_for_native_asset_works< // Mint funds into account to ensure it has enough balance to pay delivery fees let delivery_fees = xcm_helpers::transfer_assets_delivery_fees::( - (native_asset_id, native_asset_to_teleport_away.into()).into(), + (native_asset_id.clone(), native_asset_to_teleport_away.into()).into(), 0, Unlimited, - dest_beneficiary, - dest, + dest_beneficiary.clone(), + dest.clone(), ); >::mint_into( &target_account, @@ -199,7 +201,7 @@ pub fn teleports_for_native_asset_works< RuntimeHelper::::origin_of(target_account.clone()), dest, dest_beneficiary, - (native_asset_id, native_asset_to_teleport_away.into()), + (native_asset_id.clone(), native_asset_to_teleport_away.into()), None, included_head.clone(), &alice, @@ -228,14 +230,14 @@ pub fn teleports_for_native_asset_works< // trust `IsTeleporter` for `(relay-native-asset, para(2345))` pair { let other_para_id = 2345; - let dest = MultiLocation::new(1, X1(Parachain(other_para_id))); - let mut dest_beneficiary = MultiLocation::new(1, X1(Parachain(other_para_id))) + let dest = Location::new(1, [Parachain(other_para_id)]); + let mut dest_beneficiary = Location::new(1, [Parachain(other_para_id)]) .appended_with(AccountId32 { network: None, id: sp_runtime::AccountId32::new([3; 32]).into(), }) .unwrap(); - dest_beneficiary.reanchor(&dest, XcmConfig::UniversalLocation::get()).unwrap(); + dest_beneficiary.reanchor(&dest, &XcmConfig::UniversalLocation::get()).unwrap(); let target_account_balance_before_teleport = >::free_balance(&target_account); @@ -245,6 +247,7 @@ pub fn teleports_for_native_asset_works< native_asset_to_teleport_away < target_account_balance_before_teleport - existential_deposit ); + assert_eq!( RuntimeHelper::::do_teleport_assets::( RuntimeHelper::::origin_of(target_account.clone()), @@ -356,9 +359,9 @@ pub fn teleports_for_foreign_assets_works< ::Balance: From + Into, SovereignAccountOf: ConvertLocation>, >::AssetId: - From + Into, + From + Into, >::AssetIdParameter: - From + Into, + From + Into, >::Balance: From + Into, ::AccountId: @@ -370,23 +373,25 @@ pub fn teleports_for_foreign_assets_works< { // foreign parachain with the same consensus currency as asset let foreign_para_id = 2222; - let foreign_asset_id_multilocation = MultiLocation { + let foreign_asset_id_location = xcm::v3::Location { parents: 1, - interior: X2(Parachain(foreign_para_id), GeneralIndex(1234567)), + interior: [ + xcm::v3::Junction::Parachain(foreign_para_id), + xcm::v3::Junction::GeneralIndex(1234567), + ] + .into(), }; // foreign creator, which can be sibling parachain to match ForeignCreators - let foreign_creator = MultiLocation { parents: 1, interior: X1(Parachain(foreign_para_id)) }; + let foreign_creator = Location { parents: 1, interior: [Parachain(foreign_para_id)].into() }; let foreign_creator_as_account_id = SovereignAccountOf::convert_location(&foreign_creator).expect(""); // we want to buy execution with local relay chain currency let buy_execution_fee_amount = WeightToFee::weight_to_fee(&Weight::from_parts(90_000_000_000, 0)); - let buy_execution_fee = MultiAsset { - id: Concrete(MultiLocation::parent()), - fun: Fungible(buy_execution_fee_amount), - }; + let buy_execution_fee = + Asset { id: AssetId(Location::parent()), fun: Fungible(buy_execution_fee_amount) }; let teleported_foreign_asset_amount = 10_000_000_000_000; let runtime_para_id = 1000; @@ -425,14 +430,14 @@ pub fn teleports_for_foreign_assets_works< ); assert_eq!( >::balance( - foreign_asset_id_multilocation.into(), + foreign_asset_id_location.into(), &target_account ), 0.into() ); assert_eq!( >::balance( - foreign_asset_id_multilocation.into(), + foreign_asset_id_location.into(), &CheckingAccount::get() ), 0.into() @@ -441,14 +446,14 @@ pub fn teleports_for_foreign_assets_works< assert_total::< pallet_assets::Pallet, AccountIdOf, - >(foreign_asset_id_multilocation, 0, 0); + >(foreign_asset_id_location, 0, 0); // create foreign asset (0 total issuance) let asset_minimum_asset_balance = 3333333_u128; assert_ok!( >::force_create( RuntimeHelper::::root_origin(), - foreign_asset_id_multilocation.into(), + foreign_asset_id_location.into(), asset_owner.into(), false, asset_minimum_asset_balance.into() @@ -457,47 +462,52 @@ pub fn teleports_for_foreign_assets_works< assert_total::< pallet_assets::Pallet, AccountIdOf, - >(foreign_asset_id_multilocation, 0, 0); + >(foreign_asset_id_location, 0, 0); assert!(teleported_foreign_asset_amount > asset_minimum_asset_balance); + let foreign_asset_id_location_latest: Location = + foreign_asset_id_location.try_into().unwrap(); + // 1. process received teleported assets from sibling parachain (foreign_para_id) let xcm = Xcm(vec![ // BuyExecution with relaychain native token WithdrawAsset(buy_execution_fee.clone().into()), BuyExecution { - fees: MultiAsset { - id: Concrete(MultiLocation::parent()), + fees: Asset { + id: AssetId(Location::parent()), fun: Fungible(buy_execution_fee_amount), }, weight_limit: Limited(Weight::from_parts(403531000, 65536)), }, // Process teleported asset - ReceiveTeleportedAsset(MultiAssets::from(vec![MultiAsset { - id: Concrete(foreign_asset_id_multilocation), + ReceiveTeleportedAsset(Assets::from(vec![Asset { + id: AssetId(foreign_asset_id_location_latest.clone()), fun: Fungible(teleported_foreign_asset_amount), }])), DepositAsset { assets: Wild(AllOf { - id: Concrete(foreign_asset_id_multilocation), + id: AssetId(foreign_asset_id_location_latest.clone()), fun: WildFungibility::Fungible, }), - beneficiary: MultiLocation { + beneficiary: Location { parents: 0, - interior: X1(AccountId32 { + interior: [AccountId32 { network: None, id: target_account.clone().into(), - }), + }] + .into(), }, }, ExpectTransactStatus(MaybeErrorCode::Success), ]); - let hash = xcm.using_encoded(sp_io::hashing::blake2_256); + let mut hash = xcm.using_encoded(sp_io::hashing::blake2_256); - let outcome = XcmExecutor::::execute_xcm( + let outcome = XcmExecutor::::prepare_and_execute( foreign_creator, xcm, - hash, + &mut hash, RuntimeHelper::::xcm_max_weight(XcmReceivedFrom::Sibling), + Weight::zero(), ); assert_ok!(outcome.ensure_complete()); @@ -508,7 +518,7 @@ pub fn teleports_for_foreign_assets_works< ); assert_eq!( >::balance( - foreign_asset_id_multilocation.into(), + foreign_asset_id_location.into(), &target_account ), teleported_foreign_asset_amount.into() @@ -520,7 +530,7 @@ pub fn teleports_for_foreign_assets_works< ); assert_eq!( >::balance( - foreign_asset_id_multilocation.into(), + foreign_asset_id_location.into(), &CheckingAccount::get() ), 0.into() @@ -530,25 +540,25 @@ pub fn teleports_for_foreign_assets_works< pallet_assets::Pallet, AccountIdOf, >( - foreign_asset_id_multilocation, + foreign_asset_id_location, teleported_foreign_asset_amount, teleported_foreign_asset_amount, ); // 2. try to teleport asset back to source parachain (foreign_para_id) { - let dest = MultiLocation::new(1, X1(Parachain(foreign_para_id))); - let mut dest_beneficiary = MultiLocation::new(1, X1(Parachain(foreign_para_id))) + let dest = Location::new(1, [Parachain(foreign_para_id)]); + let mut dest_beneficiary = Location::new(1, [Parachain(foreign_para_id)]) .appended_with(AccountId32 { network: None, id: sp_runtime::AccountId32::new([3; 32]).into(), }) .unwrap(); - dest_beneficiary.reanchor(&dest, XcmConfig::UniversalLocation::get()).unwrap(); + dest_beneficiary.reanchor(&dest, &XcmConfig::UniversalLocation::get()).unwrap(); let target_account_balance_before_teleport = >::balance( - foreign_asset_id_multilocation.into(), + foreign_asset_id_location.into(), &target_account, ); let asset_to_teleport_away = asset_minimum_asset_balance * 3; @@ -562,11 +572,11 @@ pub fn teleports_for_foreign_assets_works< // Make sure the target account has enough native asset to pay for delivery fees let delivery_fees = xcm_helpers::transfer_assets_delivery_fees::( - (foreign_asset_id_multilocation, asset_to_teleport_away).into(), + (foreign_asset_id_location_latest.clone(), asset_to_teleport_away).into(), 0, Unlimited, - dest_beneficiary, - dest, + dest_beneficiary.clone(), + dest.clone(), ); >::mint_into( &target_account, @@ -578,7 +588,7 @@ pub fn teleports_for_foreign_assets_works< RuntimeHelper::::origin_of(target_account.clone()), dest, dest_beneficiary, - (foreign_asset_id_multilocation, asset_to_teleport_away), + (foreign_asset_id_location_latest.clone(), asset_to_teleport_away), Some((runtime_para_id, foreign_para_id)), included_head, &alice, @@ -587,14 +597,14 @@ pub fn teleports_for_foreign_assets_works< // check balances assert_eq!( >::balance( - foreign_asset_id_multilocation.into(), + foreign_asset_id_location.into(), &target_account ), (target_account_balance_before_teleport - asset_to_teleport_away.into()) ); assert_eq!( >::balance( - foreign_asset_id_multilocation.into(), + foreign_asset_id_location.into(), &CheckingAccount::get() ), 0.into() @@ -604,7 +614,7 @@ pub fn teleports_for_foreign_assets_works< pallet_assets::Pallet, AccountIdOf, >( - foreign_asset_id_multilocation, + foreign_asset_id_location, teleported_foreign_asset_amount - asset_to_teleport_away, teleported_foreign_asset_amount - asset_to_teleport_away, ); @@ -717,17 +727,19 @@ pub fn asset_transactor_transfer_with_local_consensus_currency_works BOB let _ = RuntimeHelper::::do_transfer( - MultiLocation { + Location { parents: 0, - interior: X1(AccountId32 { network: None, id: source_account.clone().into() }), + interior: [AccountId32 { network: None, id: source_account.clone().into() }] + .into(), }, - MultiLocation { + Location { parents: 0, - interior: X1(AccountId32 { network: None, id: target_account.clone().into() }), + interior: [AccountId32 { network: None, id: target_account.clone().into() }] + .into(), }, // local_consensus_currency_asset, e.g.: relaychain token (KSM, DOT, ...) ( - MultiLocation { parents: 1, interior: Here }, + Location { parents: 1, interior: Here }, (BalanceOf::::from(1_u128) * unit).into(), ), ) @@ -779,7 +791,7 @@ macro_rules! include_asset_transactor_transfer_with_local_consensus_currency_wor } ); -///Test-case makes sure that `Runtime`'s `xcm::AssetTransactor` can handle native relay chain +/// Test-case makes sure that `Runtime`'s `xcm::AssetTransactor` can handle native relay chain /// currency pub fn asset_transactor_transfer_with_pallet_assets_instance_works< Runtime, @@ -820,8 +832,8 @@ pub fn asset_transactor_transfer_with_pallet_assets_instance_works< <::Lookup as StaticLookup>::Source: From<::AccountId>, AssetsPalletInstance: 'static, - AssetId: Clone + Copy, - AssetIdConverter: MaybeEquivalence, + AssetId: Clone, + AssetIdConverter: MaybeEquivalence, { ExtBuilder::::default() .with_collators(collator_session_keys.collators()) @@ -836,10 +848,10 @@ pub fn asset_transactor_transfer_with_pallet_assets_instance_works< .execute_with(|| { // create some asset class let asset_minimum_asset_balance = 3333333_u128; - let asset_id_as_multilocation = AssetIdConverter::convert_back(&asset_id).unwrap(); + let asset_id_as_location = AssetIdConverter::convert_back(&asset_id).unwrap(); assert_ok!(>::force_create( RuntimeHelper::::root_origin(), - asset_id.into(), + asset_id.clone().into(), asset_owner.clone().into(), false, asset_minimum_asset_balance.into() @@ -848,7 +860,7 @@ pub fn asset_transactor_transfer_with_pallet_assets_instance_works< // We first mint enough asset for the account to exist for assets assert_ok!(>::mint( RuntimeHelper::::origin_of(asset_owner.clone()), - asset_id.into(), + asset_id.clone().into(), alice_account.clone().into(), (6 * asset_minimum_asset_balance).into() )); @@ -856,28 +868,28 @@ pub fn asset_transactor_transfer_with_pallet_assets_instance_works< // check Assets before assert_eq!( >::balance( - asset_id.into(), + asset_id.clone().into(), &alice_account ), (6 * asset_minimum_asset_balance).into() ); assert_eq!( >::balance( - asset_id.into(), + asset_id.clone().into(), &bob_account ), 0.into() ); assert_eq!( >::balance( - asset_id.into(), + asset_id.clone().into(), &charlie_account ), 0.into() ); assert_eq!( >::balance( - asset_id.into(), + asset_id.clone().into(), &asset_owner ), 0.into() @@ -904,21 +916,20 @@ pub fn asset_transactor_transfer_with_pallet_assets_instance_works< // ExistentialDeposit) assert_noop!( RuntimeHelper::::do_transfer( - MultiLocation { + Location { parents: 0, - interior: X1(AccountId32 { - network: None, - id: alice_account.clone().into() - }), + interior: [AccountId32 { network: None, id: alice_account.clone().into() }] + .into(), }, - MultiLocation { + Location { parents: 0, - interior: X1(AccountId32 { + interior: [AccountId32 { network: None, id: charlie_account.clone().into() - }), + }] + .into(), }, - (asset_id_as_multilocation, asset_minimum_asset_balance), + (asset_id_as_location.clone(), asset_minimum_asset_balance), ), XcmError::FailedToTransactAsset(Into::<&str>::into( sp_runtime::TokenError::CannotCreate @@ -928,18 +939,17 @@ pub fn asset_transactor_transfer_with_pallet_assets_instance_works< // transfer_asset (deposit/withdraw) ALICE -> BOB (ok - has ExistentialDeposit) assert!(matches!( RuntimeHelper::::do_transfer( - MultiLocation { + Location { parents: 0, - interior: X1(AccountId32 { - network: None, - id: alice_account.clone().into() - }), + interior: [AccountId32 { network: None, id: alice_account.clone().into() }] + .into(), }, - MultiLocation { + Location { parents: 0, - interior: X1(AccountId32 { network: None, id: bob_account.clone().into() }), + interior: [AccountId32 { network: None, id: bob_account.clone().into() }] + .into(), }, - (asset_id_as_multilocation, asset_minimum_asset_balance), + (asset_id_as_location, asset_minimum_asset_balance), ), Ok(_) )); @@ -947,21 +957,21 @@ pub fn asset_transactor_transfer_with_pallet_assets_instance_works< // check Assets after assert_eq!( >::balance( - asset_id.into(), + asset_id.clone().into(), &alice_account ), (5 * asset_minimum_asset_balance).into() ); assert_eq!( >::balance( - asset_id.into(), + asset_id.clone().into(), &bob_account ), asset_minimum_asset_balance.into() ); assert_eq!( >::balance( - asset_id.into(), + asset_id.clone().into(), &charlie_account ), 0.into() @@ -1093,26 +1103,23 @@ pub fn create_and_manage_foreign_assets_for_local_consensus_parachain_assets_wor <::Lookup as StaticLookup>::Source: From<::AccountId>, ForeignAssetsPalletInstance: 'static, - AssetId: Clone + Copy, - AssetIdConverter: MaybeEquivalence, + AssetId: Clone, + AssetIdConverter: MaybeEquivalence, { - // foreign parachain with the same consensus currency as asset - let foreign_asset_id_multilocation = - MultiLocation { parents: 1, interior: X2(Parachain(2222), GeneralIndex(1234567)) }; - let asset_id = AssetIdConverter::convert(&foreign_asset_id_multilocation).unwrap(); + // foreign parachain with the same consenus currency as asset + let foreign_asset_id_location = Location::new(1, [Parachain(2222), GeneralIndex(1234567)]); + let asset_id = AssetIdConverter::convert(&foreign_asset_id_location).unwrap(); // foreign creator, which can be sibling parachain to match ForeignCreators - let foreign_creator = MultiLocation { parents: 1, interior: X1(Parachain(2222)) }; + let foreign_creator = Location { parents: 1, interior: [Parachain(2222)].into() }; let foreign_creator_as_account_id = SovereignAccountOf::convert_location(&foreign_creator).expect(""); // we want to buy execution with local relay chain currency let buy_execution_fee_amount = WeightToFee::weight_to_fee(&Weight::from_parts(90_000_000_000, 0)); - let buy_execution_fee = MultiAsset { - id: Concrete(MultiLocation::parent()), - fun: Fungible(buy_execution_fee_amount), - }; + let buy_execution_fee = + Asset { id: AssetId(Location::parent()), fun: Fungible(buy_execution_fee_amount) }; const ASSET_NAME: &str = "My super coin"; const ASSET_SYMBOL: &str = "MY_S_COIN"; @@ -1152,7 +1159,7 @@ pub fn create_and_manage_foreign_assets_for_local_consensus_parachain_assets_wor Runtime, ForeignAssetsPalletInstance, >::create { - id: asset_id.into(), + id: asset_id.clone().into(), // admin as sovereign_account admin: foreign_creator_as_account_id.clone().into(), min_balance: 1.into(), @@ -1162,7 +1169,7 @@ pub fn create_and_manage_foreign_assets_for_local_consensus_parachain_assets_wor Runtime, ForeignAssetsPalletInstance, >::set_metadata { - id: asset_id.into(), + id: asset_id.clone().into(), name: Vec::from(ASSET_NAME), symbol: Vec::from(ASSET_SYMBOL), decimals: 12, @@ -1172,7 +1179,7 @@ pub fn create_and_manage_foreign_assets_for_local_consensus_parachain_assets_wor Runtime, ForeignAssetsPalletInstance, >::set_team { - id: asset_id.into(), + id: asset_id.clone().into(), issuer: foreign_creator_as_account_id.clone().into(), admin: foreign_creator_as_account_id.clone().into(), freezer: bob_account.clone().into(), @@ -1202,14 +1209,15 @@ pub fn create_and_manage_foreign_assets_for_local_consensus_parachain_assets_wor ]); // messages with different consensus should go through the local bridge-hub - let hash = xcm.using_encoded(sp_io::hashing::blake2_256); + let mut hash = xcm.using_encoded(sp_io::hashing::blake2_256); // execute xcm as XcmpQueue would do - let outcome = XcmExecutor::::execute_xcm( - foreign_creator, + let outcome = XcmExecutor::::prepare_and_execute( + foreign_creator.clone(), xcm, - hash, + &mut hash, RuntimeHelper::::xcm_max_weight(XcmReceivedFrom::Sibling), + Weight::zero(), ); assert_ok!(outcome.ensure_complete()); @@ -1230,25 +1238,25 @@ pub fn create_and_manage_foreign_assets_for_local_consensus_parachain_assets_wor use frame_support::traits::fungibles::roles::Inspect as InspectRoles; assert_eq!( >::owner( - asset_id.into() + asset_id.clone().into() ), Some(foreign_creator_as_account_id.clone()) ); assert_eq!( >::admin( - asset_id.into() + asset_id.clone().into() ), Some(foreign_creator_as_account_id.clone()) ); assert_eq!( >::issuer( - asset_id.into() + asset_id.clone().into() ), Some(foreign_creator_as_account_id.clone()) ); assert_eq!( >::freezer( - asset_id.into() + asset_id.clone().into() ), Some(bob_account.clone()) ); @@ -1262,13 +1270,13 @@ pub fn create_and_manage_foreign_assets_for_local_consensus_parachain_assets_wor assert_metadata::< pallet_assets::Pallet, AccountIdOf, - >(asset_id, ASSET_NAME, ASSET_SYMBOL, 12); + >(asset_id.clone(), ASSET_NAME, ASSET_SYMBOL, 12); // check if changed freezer, can freeze assert_noop!( >::freeze( RuntimeHelper::::origin_of(bob_account), - asset_id.into(), + asset_id.clone().into(), alice_account.clone().into() ), pallet_assets::Error::::NoAccount @@ -1284,9 +1292,9 @@ pub fn create_and_manage_foreign_assets_for_local_consensus_parachain_assets_wor // lets try create asset for different parachain(3333) (foreign_creator(2222) can create // just his assets) - let foreign_asset_id_multilocation = - MultiLocation { parents: 1, interior: X2(Parachain(3333), GeneralIndex(1234567)) }; - let asset_id = AssetIdConverter::convert(&foreign_asset_id_multilocation).unwrap(); + let foreign_asset_id_location = + Location { parents: 1, interior: [Parachain(3333), GeneralIndex(1234567)].into() }; + let asset_id = AssetIdConverter::convert(&foreign_asset_id_location).unwrap(); // prepare data for xcm::Transact(create) let foreign_asset_create = runtime_call_encode(pallet_assets::Call::< @@ -1310,14 +1318,15 @@ pub fn create_and_manage_foreign_assets_for_local_consensus_parachain_assets_wor ]); // messages with different consensus should go through the local bridge-hub - let hash = xcm.using_encoded(sp_io::hashing::blake2_256); + let mut hash = xcm.using_encoded(sp_io::hashing::blake2_256); // execute xcm as XcmpQueue would do - let outcome = XcmExecutor::::execute_xcm( + let outcome = XcmExecutor::::prepare_and_execute( foreign_creator, xcm, - hash, + &mut hash, RuntimeHelper::::xcm_max_weight(XcmReceivedFrom::Sibling), + Weight::zero(), ); assert_ok!(outcome.ensure_complete()); @@ -1441,15 +1450,15 @@ pub fn reserve_transfer_native_asset_to_non_teleport_para_works< // reserve-transfer native asset with local reserve to remote parachain (2345) let other_para_id = 2345; - let native_asset = MultiLocation::parent(); - let dest = MultiLocation::new(1, X1(Parachain(other_para_id))); - let mut dest_beneficiary = MultiLocation::new(1, X1(Parachain(other_para_id))) + let native_asset = Location::parent(); + let dest = Location::new(1, [Parachain(other_para_id)]); + let mut dest_beneficiary = Location::new(1, [Parachain(other_para_id)]) .appended_with(AccountId32 { network: None, id: sp_runtime::AccountId32::new([3; 32]).into(), }) .unwrap(); - dest_beneficiary.reanchor(&dest, XcmConfig::UniversalLocation::get()).unwrap(); + dest_beneficiary.reanchor(&dest, &XcmConfig::UniversalLocation::get()).unwrap(); let reserve_account = LocationToAccountId::convert_location(&dest) .expect("Sovereign account for reserves"); @@ -1495,17 +1504,15 @@ pub fn reserve_transfer_native_asset_to_non_teleport_para_works< ); // local native asset (pallet_balances) - let asset_to_transfer = MultiAsset { - fun: Fungible(balance_to_transfer.into()), - id: Concrete(native_asset), - }; + let asset_to_transfer = + Asset { fun: Fungible(balance_to_transfer.into()), id: AssetId(native_asset) }; // pallet_xcm call reserve transfer assert_ok!(>::limited_reserve_transfer_assets( RuntimeHelper::::origin_of(alice_account.clone()), - Box::new(dest.into_versioned()), - Box::new(dest_beneficiary.into_versioned()), - Box::new(VersionedMultiAssets::from(MultiAssets::from(asset_to_transfer))), + Box::new(dest.clone().into_versioned()), + Box::new(dest_beneficiary.clone().into_versioned()), + Box::new(VersionedAssets::from(Assets::from(asset_to_transfer))), 0, weight_limit, )); @@ -1535,9 +1542,12 @@ pub fn reserve_transfer_native_asset_to_non_teleport_para_works< ) .unwrap(); + let v4_xcm: Xcm<()> = xcm_sent.clone().try_into().unwrap(); + dbg!(&v4_xcm); + let delivery_fees = get_fungible_delivery_fees::< ::XcmSender, - >(dest, Xcm::try_from(xcm_sent.clone()).unwrap()); + >(dest.clone(), Xcm::try_from(xcm_sent.clone()).unwrap()); assert_eq!( xcm_sent_message_hash, @@ -1547,8 +1557,8 @@ pub fn reserve_transfer_native_asset_to_non_teleport_para_works< // check sent XCM Program to other parachain println!("reserve_transfer_native_asset_works sent xcm: {:?}", xcm_sent); - let reserve_assets_deposited = MultiAssets::from(vec![MultiAsset { - id: Concrete(MultiLocation { parents: 1, interior: Here }), + let reserve_assets_deposited = Assets::from(vec![Asset { + id: AssetId(Location { parents: 1, interior: Here }), fun: Fungible(1000000000000), }]); diff --git a/cumulus/parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs b/cumulus/parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs index d7441880426..878dddc9137 100644 --- a/cumulus/parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs +++ b/cumulus/parachains/runtimes/assets/test-utils/src/test_cases_over_bridge.rs @@ -31,15 +31,15 @@ use parachains_runtimes_test_utils::{ }; use sp_runtime::{traits::StaticLookup, Saturating}; use sp_std::ops::Mul; -use xcm::{latest::prelude::*, VersionedMultiAssets}; +use xcm::{latest::prelude::*, VersionedAssets}; use xcm_builder::{CreateMatcher, MatchXcm}; use xcm_executor::{traits::ConvertLocation, XcmExecutor}; pub struct TestBridgingConfig { pub bridged_network: NetworkId, pub local_bridge_hub_para_id: u32, - pub local_bridge_hub_location: MultiLocation, - pub bridged_target_location: MultiLocation, + pub local_bridge_hub_location: Location, + pub bridged_target_location: Location, } /// Test-case makes sure that `Runtime` can initiate **reserve transfer assets** over bridge. @@ -117,7 +117,7 @@ pub fn limited_reserve_transfer_assets_for_native_asset_works< LocationToAccountId::convert_location(&target_location_from_different_consensus) .expect("Sovereign account for reserves"); let balance_to_transfer = 1_000_000_000_000_u128; - let native_asset = MultiLocation::parent(); + let native_asset = Location::parent(); // open HRMP to bridge hub mock_open_hrmp_channel::( @@ -163,35 +163,33 @@ pub fn limited_reserve_transfer_assets_for_native_asset_works< .unwrap_or(0.into()); // local native asset (pallet_balances) - let asset_to_transfer = MultiAsset { - fun: Fungible(balance_to_transfer.into()), - id: Concrete(native_asset), - }; + let asset_to_transfer = + Asset { fun: Fungible(balance_to_transfer.into()), id: native_asset.into() }; // destination is (some) account relative to the destination different consensus - let target_destination_account = MultiLocation { - parents: 0, - interior: X1(AccountId32 { + let target_destination_account = Location::new( + 0, + [AccountId32 { network: Some(bridged_network), id: sp_runtime::AccountId32::new([3; 32]).into(), - }), - }; + }], + ); - let assets_to_transfer = MultiAssets::from(asset_to_transfer); + let assets_to_transfer = Assets::from(asset_to_transfer); let mut expected_assets = assets_to_transfer.clone(); let context = XcmConfig::UniversalLocation::get(); expected_assets - .reanchor(&target_location_from_different_consensus, context) + .reanchor(&target_location_from_different_consensus, &context) .unwrap(); - let expected_beneficiary = target_destination_account; + let expected_beneficiary = target_destination_account.clone(); // do pallet_xcm call reserve transfer assert_ok!(>::limited_reserve_transfer_assets( RuntimeHelper::::origin_of(alice_account.clone()), - Box::new(target_location_from_different_consensus.into_versioned()), + Box::new(target_location_from_different_consensus.clone().into_versioned()), Box::new(target_destination_account.into_versioned()), - Box::new(VersionedMultiAssets::from(assets_to_transfer)), + Box::new(VersionedAssets::from(assets_to_transfer)), 0, weight_limit, )); @@ -266,13 +264,17 @@ pub fn limited_reserve_transfer_assets_for_native_asset_works< let (_, target_location_junctions_without_global_consensus) = target_location_from_different_consensus .interior + .clone() .split_global() .expect("split works"); assert_eq!(destination, &target_location_junctions_without_global_consensus); // Call `SendXcm::validate` to get delivery fees. delivery_fees = get_fungible_delivery_fees::< ::XcmSender, - >(target_location_from_different_consensus, inner_xcm.clone()); + >( + target_location_from_different_consensus.clone(), + inner_xcm.clone(), + ); assert_matches_reserve_asset_deposited_instructions( inner_xcm, &expected_assets, @@ -322,10 +324,10 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< target_account: AccountIdOf, block_author_account: AccountIdOf, ( - foreign_asset_id_multilocation, + foreign_asset_id_location, transfered_foreign_asset_id_amount, foreign_asset_id_minimum_balance, - ): (MultiLocation, u128, u128), + ): (xcm::v3::Location, u128, u128), prepare_configuration: fn() -> TestBridgingConfig, (bridge_instance, universal_origin, descend_origin): (Junctions, Junction, Junctions), /* bridge adds origin manipulation on the way */ ) where @@ -347,9 +349,9 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< XcmConfig: xcm_executor::Config, LocationToAccountId: ConvertLocation>, >::AssetId: - From + Into, + From + Into, >::AssetIdParameter: - From + Into, + From + Into, >::Balance: From + Into + From, ::AccountId: Into<<::RuntimeOrigin as OriginTrait>::AccountId> @@ -357,7 +359,7 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< <::Lookup as StaticLookup>::Source: From<::AccountId>, ::AssetKind: - From + Into, + From + Into, ::Balance: From, ForeignAssetsPalletInstance: 'static, { @@ -385,7 +387,7 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< // sovereign account as foreign asset owner (can be whoever for this scenario, doesnt // matter) let sovereign_account_as_owner_of_foreign_asset = - LocationToAccountId::convert_location(&MultiLocation::parent()).unwrap(); + LocationToAccountId::convert_location(&Location::parent()).unwrap(); // staking pot account for collecting local native fees from `BuyExecution` let staking_pot = >::account_id(); @@ -398,16 +400,16 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< assert_ok!( >::force_create( RuntimeHelper::::root_origin(), - foreign_asset_id_multilocation.into(), + foreign_asset_id_location.into(), sovereign_account_as_owner_of_foreign_asset.clone().into(), true, // is_sufficient=true foreign_asset_id_minimum_balance.into() ) ); - // setup a pool to pay fees with `foreign_asset_id_multilocation` tokens + // setup a pool to pay fees with `foreign_asset_id_location` tokens let pool_owner: AccountIdOf = [1u8; 32].into(); - let native_asset = MultiLocation::parent(); + let native_asset = xcm::v3::Location::parent(); let pool_liquidity: u128 = existential_deposit.into().max(foreign_asset_id_minimum_balance).mul(100_000); @@ -420,7 +422,7 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< RuntimeHelper::::origin_of( sovereign_account_as_owner_of_foreign_asset ), - foreign_asset_id_multilocation.into(), + foreign_asset_id_location.into(), pool_owner.clone().into(), (foreign_asset_id_minimum_balance + pool_liquidity).mul(2).into(), )); @@ -428,13 +430,13 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< assert_ok!(>::create_pool( RuntimeHelper::::origin_of(pool_owner.clone()), Box::new(native_asset.into()), - Box::new(foreign_asset_id_multilocation.into()) + Box::new(foreign_asset_id_location.into()) )); assert_ok!(>::add_liquidity( RuntimeHelper::::origin_of(pool_owner.clone()), Box::new(native_asset.into()), - Box::new(foreign_asset_id_multilocation.into()), + Box::new(foreign_asset_id_location.into()), pool_liquidity.into(), pool_liquidity.into(), 1.into(), @@ -459,34 +461,37 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< // ForeignAssets balances before assert_eq!( >::balance( - foreign_asset_id_multilocation.into(), + foreign_asset_id_location.into(), &target_account ), 0.into() ); assert_eq!( >::balance( - foreign_asset_id_multilocation.into(), + foreign_asset_id_location.into(), &block_author_account ), 0.into() ); assert_eq!( >::balance( - foreign_asset_id_multilocation.into(), + foreign_asset_id_location.into(), &staking_pot ), 0.into() ); - let expected_assets = MultiAssets::from(vec![MultiAsset { - id: Concrete(foreign_asset_id_multilocation), + let foreign_asset_id_location_latest: Location = + foreign_asset_id_location.try_into().unwrap(); + + let expected_assets = Assets::from(vec![Asset { + id: AssetId(foreign_asset_id_location_latest.clone()), fun: Fungible(transfered_foreign_asset_id_amount), }]); - let expected_beneficiary = MultiLocation { - parents: 0, - interior: X1(AccountId32 { network: None, id: target_account.clone().into() }), - }; + let expected_beneficiary = Location::new( + 0, + [AccountId32 { network: None, id: target_account.clone().into() }], + ); // Call received XCM execution let xcm = Xcm(vec![ @@ -496,13 +501,16 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< ReserveAssetDeposited(expected_assets.clone()), ClearOrigin, BuyExecution { - fees: MultiAsset { - id: Concrete(foreign_asset_id_multilocation), + fees: Asset { + id: AssetId(foreign_asset_id_location_latest.clone()), fun: Fungible(transfered_foreign_asset_id_amount), }, weight_limit: Unlimited, }, - DepositAsset { assets: Wild(AllCounted(1)), beneficiary: expected_beneficiary }, + DepositAsset { + assets: Wild(AllCounted(1)), + beneficiary: expected_beneficiary.clone(), + }, SetTopic([ 220, 188, 144, 32, 213, 83, 111, 175, 44, 210, 111, 19, 90, 165, 191, 112, 140, 247, 192, 124, 42, 17, 153, 141, 114, 34, 189, 20, 83, 69, 237, 173, @@ -514,16 +522,17 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< &expected_beneficiary, ); - let hash = xcm.using_encoded(sp_io::hashing::blake2_256); + let mut hash = xcm.using_encoded(sp_io::hashing::blake2_256); // execute xcm as XcmpQueue would do - let outcome = XcmExecutor::::execute_xcm( + let outcome = XcmExecutor::::prepare_and_execute( local_bridge_hub_location, xcm, - hash, + &mut hash, RuntimeHelper::::xcm_max_weight( XcmReceivedFrom::Sibling, ), + Weight::zero(), ); assert_ok!(outcome.ensure_complete()); @@ -545,20 +554,20 @@ pub fn receive_reserve_asset_deposited_from_different_consensus_works< // ForeignAssets balances after assert!( >::balance( - foreign_asset_id_multilocation.into(), + foreign_asset_id_location.into(), &target_account ) > 0.into() ); assert_eq!( >::balance( - foreign_asset_id_multilocation.into(), + foreign_asset_id_location.into(), &staking_pot ), 0.into() ); assert_eq!( >::balance( - foreign_asset_id_multilocation.into(), + foreign_asset_id_location.into(), &block_author_account ), 0.into() @@ -614,14 +623,15 @@ pub fn report_bridge_status_from_xcm_bridge_router_works< // Call received XCM execution let xcm = if is_congested { congested_message() } else { uncongested_message() }; - let hash = xcm.using_encoded(sp_io::hashing::blake2_256); + let mut hash = xcm.using_encoded(sp_io::hashing::blake2_256); // execute xcm as XcmpQueue would do - let outcome = XcmExecutor::::execute_xcm( + let outcome = XcmExecutor::::prepare_and_execute( local_bridge_hub_location, xcm, - hash, + &mut hash, RuntimeHelper::::xcm_max_weight(XcmReceivedFrom::Sibling), + Weight::zero(), ); assert_ok!(outcome.ensure_complete()); assert_eq!(is_congested, pallet_xcm_bridge_hub_router::Pallet::::bridge().is_congested); diff --git a/cumulus/parachains/runtimes/assets/test-utils/src/xcm_helpers.rs b/cumulus/parachains/runtimes/assets/test-utils/src/xcm_helpers.rs index 0aebe38fef5..f509a3a8aca 100644 --- a/cumulus/parachains/runtimes/assets/test-utils/src/xcm_helpers.rs +++ b/cumulus/parachains/runtimes/assets/test-utils/src/xcm_helpers.rs @@ -23,11 +23,11 @@ use xcm::latest::prelude::*; /// Because it returns only a `u128`, it assumes delivery fees are only paid /// in one asset and that asset is known. pub fn transfer_assets_delivery_fees( - assets: MultiAssets, + assets: Assets, fee_asset_item: u32, weight_limit: WeightLimit, - beneficiary: MultiLocation, - destination: MultiLocation, + beneficiary: Location, + destination: Location, ) -> u128 { let message = teleport_assets_dummy_message(assets, fee_asset_item, weight_limit, beneficiary); get_fungible_delivery_fees::(destination, message) @@ -35,7 +35,7 @@ pub fn transfer_assets_delivery_fees( /// Returns the delivery fees amount for a query response as a result of the execution /// of a `ExpectError` instruction with no error. -pub fn query_response_delivery_fees(querier: MultiLocation) -> u128 { +pub fn query_response_delivery_fees(querier: Location) -> u128 { // Message to calculate delivery fees, it's encoded size is what's important. // This message reports that there was no error, if an error is reported, the encoded size would // be different. @@ -45,7 +45,7 @@ pub fn query_response_delivery_fees(querier: MultiLocation) -> u128 query_id: 0, // Dummy query id response: Response::ExecutionResult(None), max_weight: Weight::zero(), - querier: Some(querier), + querier: Some(querier.clone()), }, SetTopic([0u8; 32]), // Dummy topic ]); @@ -55,9 +55,9 @@ pub fn query_response_delivery_fees(querier: MultiLocation) -> u128 /// Returns the delivery fees amount for the execution of `PayOverXcm` pub fn pay_over_xcm_delivery_fees( interior: Junctions, - destination: MultiLocation, - beneficiary: MultiLocation, - asset: MultiAsset, + destination: Location, + beneficiary: Location, + asset: Asset, ) -> u128 { // This is a dummy message. // The encoded size is all that matters for delivery fees. @@ -66,7 +66,11 @@ pub fn pay_over_xcm_delivery_fees( UnpaidExecution { weight_limit: Unlimited, check_origin: None }, SetAppendix(Xcm(vec![ SetFeesMode { jit_withdraw: true }, - ReportError(QueryResponseInfo { destination, query_id: 0, max_weight: Weight::zero() }), + ReportError(QueryResponseInfo { + destination: destination.clone(), + query_id: 0, + max_weight: Weight::zero(), + }), ])), TransferAsset { beneficiary, assets: vec![asset].into() }, ]); @@ -78,10 +82,10 @@ pub fn pay_over_xcm_delivery_fees( /// However, it should have the same encoded size, which is what matters for delivery fees. /// Also has same encoded size as the one created by the reserve transfer assets extrinsic. fn teleport_assets_dummy_message( - assets: MultiAssets, + assets: Assets, fee_asset_item: u32, weight_limit: WeightLimit, - beneficiary: MultiLocation, + beneficiary: Location, ) -> Xcm<()> { Xcm(vec![ ReceiveTeleportedAsset(assets.clone()), // Same encoded size as `ReserveAssetDeposited` @@ -93,7 +97,7 @@ fn teleport_assets_dummy_message( } /// Given a message, a sender, and a destination, it returns the delivery fees -fn get_fungible_delivery_fees(destination: MultiLocation, message: Xcm<()>) -> u128 { +fn get_fungible_delivery_fees(destination: Location, message: Xcm<()>) -> u128 { let Ok((_, delivery_fees)) = validate_send::(destination, message) else { unreachable!("message can be sent; qed") }; diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_bulletin_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_bulletin_config.rs index c9d7f60e71a..1c7bdd4cbff 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_bulletin_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_bulletin_config.rs @@ -48,7 +48,7 @@ use frame_support::{parameter_types, traits::PalletInfoAccess}; use sp_runtime::RuntimeDebug; use xcm::{ latest::prelude::*, - prelude::{InteriorMultiLocation, NetworkId}, + prelude::{InteriorLocation, NetworkId}, }; use xcm_builder::BridgeBlobDispatcher; @@ -65,16 +65,16 @@ parameter_types! { /// Bridge specific chain (network) identifier of the Rococo Bulletin Chain. pub const RococoBulletinChainId: bp_runtime::ChainId = bp_runtime::POLKADOT_BULLETIN_CHAIN_ID; /// Interior location (relative to this runtime) of the with-RococoBulletin messages pallet. - pub BridgeRococoToRococoBulletinMessagesPalletInstance: InteriorMultiLocation = X1( + pub BridgeRococoToRococoBulletinMessagesPalletInstance: InteriorLocation = [ PalletInstance(::index() as u8) - ); + ].into(); /// Rococo Bulletin Network identifier. pub RococoBulletinGlobalConsensusNetwork: NetworkId = NetworkId::PolkadotBulletin; /// Relative location of the Rococo Bulletin chain. - pub RococoBulletinGlobalConsensusNetworkLocation: MultiLocation = MultiLocation { - parents: 2, - interior: X1(GlobalConsensus(RococoBulletinGlobalConsensusNetwork::get())) - }; + pub RococoBulletinGlobalConsensusNetworkLocation: Location = Location::new( + 2, + [GlobalConsensus(RococoBulletinGlobalConsensusNetwork::get())] + ); /// All active lanes that the current bridge supports. pub ActiveOutboundLanesToRococoBulletin: &'static [bp_messages::LaneId] = &[XCM_LANE_FOR_ROCOCO_PEOPLE_TO_ROCOCO_BULLETIN]; @@ -94,11 +94,11 @@ parameter_types! { /// A route (XCM location and bridge lane) that the Rococo People Chain -> Rococo Bulletin Chain /// message is following. pub FromRococoPeopleToRococoBulletinRoute: SenderAndLane = SenderAndLane::new( - ParentThen(X1(Parachain(RococoPeopleParaId::get().into()))).into(), + ParentThen(Parachain(RococoPeopleParaId::get().into()).into()).into(), XCM_LANE_FOR_ROCOCO_PEOPLE_TO_ROCOCO_BULLETIN, ); /// All active routes and their destinations. - pub ActiveLanes: sp_std::vec::Vec<(SenderAndLane, (NetworkId, InteriorMultiLocation))> = sp_std::vec![ + pub ActiveLanes: sp_std::vec::Vec<(SenderAndLane, (NetworkId, InteriorLocation))> = sp_std::vec![ ( FromRococoPeopleToRococoBulletinRoute::get(), (RococoBulletinGlobalConsensusNetwork::get(), Here) @@ -282,11 +282,11 @@ mod tests { PriorityBoostPerMessage, >(FEE_BOOST_PER_MESSAGE); - assert_eq!( - BridgeRococoToRococoBulletinMessagesPalletInstance::get(), - X1(PalletInstance( - bp_bridge_hub_rococo::WITH_BRIDGE_ROCOCO_TO_BULLETIN_MESSAGES_PALLET_INDEX - )) - ); + let expected: InteriorLocation = PalletInstance( + bp_bridge_hub_rococo::WITH_BRIDGE_ROCOCO_TO_BULLETIN_MESSAGES_PALLET_INDEX, + ) + .into(); + + assert_eq!(BridgeRococoToRococoBulletinMessagesPalletInstance::get(), expected,); } } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_westend_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_westend_config.rs index 961b47e1e13..4e8fe6454cc 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_westend_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_to_westend_config.rs @@ -48,7 +48,7 @@ use frame_support::{parameter_types, traits::PalletInfoAccess}; use sp_runtime::RuntimeDebug; use xcm::{ latest::prelude::*, - prelude::{InteriorMultiLocation, NetworkId}, + prelude::{InteriorLocation, NetworkId}, }; use xcm_builder::BridgeBlobDispatcher; @@ -58,12 +58,12 @@ parameter_types! { pub const MaxUnconfirmedMessagesAtInboundLane: bp_messages::MessageNonce = bp_bridge_hub_rococo::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX; pub const BridgeHubWestendChainId: bp_runtime::ChainId = bp_runtime::BRIDGE_HUB_WESTEND_CHAIN_ID; - pub BridgeRococoToWestendMessagesPalletInstance: InteriorMultiLocation = X1(PalletInstance(::index() as u8)); + pub BridgeRococoToWestendMessagesPalletInstance: InteriorLocation = [PalletInstance(::index() as u8)].into(); pub WestendGlobalConsensusNetwork: NetworkId = NetworkId::Westend; - pub WestendGlobalConsensusNetworkLocation: MultiLocation = MultiLocation { - parents: 2, - interior: X1(GlobalConsensus(WestendGlobalConsensusNetwork::get())) - }; + pub WestendGlobalConsensusNetworkLocation: Location = Location::new( + 2, + [GlobalConsensus(WestendGlobalConsensusNetwork::get())] + ); // see the `FEE_BOOST_PER_MESSAGE` constant to get the meaning of this value pub PriorityBoostPerMessage: u64 = 182_044_444_444_444; @@ -74,26 +74,26 @@ parameter_types! { pub ActiveOutboundLanesToBridgeHubWestend: &'static [bp_messages::LaneId] = &[XCM_LANE_FOR_ASSET_HUB_ROCOCO_TO_ASSET_HUB_WESTEND]; pub const AssetHubRococoToAssetHubWestendMessagesLane: bp_messages::LaneId = XCM_LANE_FOR_ASSET_HUB_ROCOCO_TO_ASSET_HUB_WESTEND; pub FromAssetHubRococoToAssetHubWestendRoute: SenderAndLane = SenderAndLane::new( - ParentThen(X1(Parachain(AssetHubRococoParaId::get().into()))).into(), + ParentThen([Parachain(AssetHubRococoParaId::get().into())].into()).into(), XCM_LANE_FOR_ASSET_HUB_ROCOCO_TO_ASSET_HUB_WESTEND, ); - pub ActiveLanes: sp_std::vec::Vec<(SenderAndLane, (NetworkId, InteriorMultiLocation))> = sp_std::vec![ + pub ActiveLanes: sp_std::vec::Vec<(SenderAndLane, (NetworkId, InteriorLocation))> = sp_std::vec![ ( FromAssetHubRococoToAssetHubWestendRoute::get(), - (WestendGlobalConsensusNetwork::get(), X1(Parachain(AssetHubWestendParaId::get().into()))) + (WestendGlobalConsensusNetwork::get(), [Parachain(AssetHubWestendParaId::get().into())].into()) ) ]; pub CongestedMessage: Xcm<()> = build_congestion_message(true).into(); pub UncongestedMessage: Xcm<()> = build_congestion_message(false).into(); - pub BridgeHubWestendLocation: MultiLocation = MultiLocation { - parents: 2, - interior: X2( + pub BridgeHubWestendLocation: Location = Location::new( + 2, + [ GlobalConsensus(WestendGlobalConsensusNetwork::get()), Parachain(::PARACHAIN_ID) - ) - }; + ] + ); } pub const XCM_LANE_FOR_ASSET_HUB_ROCOCO_TO_ASSET_HUB_WESTEND: LaneId = LaneId([0, 0, 0, 2]); @@ -327,11 +327,11 @@ mod tests { PriorityBoostPerMessage, >(FEE_BOOST_PER_MESSAGE); - assert_eq!( - BridgeRococoToWestendMessagesPalletInstance::get(), - X1(PalletInstance( - bp_bridge_hub_rococo::WITH_BRIDGE_ROCOCO_TO_WESTEND_MESSAGES_PALLET_INDEX - )) - ); + let expected: InteriorLocation = [PalletInstance( + bp_bridge_hub_rococo::WITH_BRIDGE_ROCOCO_TO_WESTEND_MESSAGES_PALLET_INDEX, + )] + .into(); + + assert_eq!(BridgeRococoToWestendMessagesPalletInstance::get(), expected,); } } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs index 0052e9dcb38..7e99b039309 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs @@ -78,7 +78,7 @@ use bridge_hub_common::{ use pallet_xcm::EnsureXcm; pub use sp_consensus_aura::sr25519::AuthorityId as AuraId; pub use sp_runtime::{MultiAddress, Perbill, Permill}; -use xcm::VersionedMultiLocation; +use xcm::VersionedLocation; use xcm_config::{TreasuryAccount, XcmOriginToTransactDispatchOrigin, XcmRouter}; #[cfg(any(feature = "std", test))] @@ -385,7 +385,7 @@ impl cumulus_pallet_aura_ext::Config for Runtime {} parameter_types! { /// The asset ID for the asset that we use to pay for message delivery fees. - pub FeeAssetId: AssetId = Concrete(xcm_config::TokenLocation::get()); + pub FeeAssetId: AssetId = AssetId(xcm_config::TokenLocation::get()); /// The base fee for the message delivery fees. pub const BaseDeliveryFee: u128 = CENTS.saturating_mul(3); } @@ -517,7 +517,7 @@ pub mod benchmark_helpers { use snowbridge_beacon_primitives::CompactExecutionHeader; use snowbridge_pallet_inbound_queue::BenchmarkHelper; use sp_core::H256; - use xcm::latest::{MultiAssets, MultiLocation, SendError, SendResult, SendXcm, Xcm, XcmHash}; + use xcm::latest::{Assets, Location, SendError, SendResult, SendXcm, Xcm, XcmHash}; impl BenchmarkHelper for Runtime { fn initialize_storage(block_hash: H256, header: CompactExecutionHeader) { @@ -530,10 +530,10 @@ pub mod benchmark_helpers { type Ticket = Xcm<()>; fn validate( - _dest: &mut Option, + _dest: &mut Option, xcm: &mut Option>, ) -> SendResult { - Ok((xcm.clone().unwrap(), MultiAssets::new())) + Ok((xcm.clone().unwrap(), Assets::new())) } fn deliver(xcm: Xcm<()>) -> Result { let hash = xcm.using_encoded(sp_io::hashing::blake2_256); @@ -542,7 +542,7 @@ pub mod benchmark_helpers { } impl snowbridge_pallet_system::BenchmarkHelper for () { - fn make_xcm_origin(location: MultiLocation) -> RuntimeOrigin { + fn make_xcm_origin(location: Location) -> RuntimeOrigin { RuntimeOrigin::from(pallet_xcm::Origin::Xcm(location)) } } @@ -1016,7 +1016,7 @@ impl_runtime_apis! { } impl snowbridge_system_runtime_api::ControlApi for Runtime { - fn agent_id(location: VersionedMultiLocation) -> Option { + fn agent_id(location: VersionedLocation) -> Option { snowbridge_pallet_system::api::agent_id::(location) } } @@ -1095,28 +1095,28 @@ impl_runtime_apis! { use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsicsBenchmark; impl pallet_xcm::benchmarking::Config for Runtime { - fn reachable_dest() -> Option { + fn reachable_dest() -> Option { Some(Parent.into()) } - fn teleportable_asset_and_dest() -> Option<(MultiAsset, MultiLocation)> { + fn teleportable_asset_and_dest() -> Option<(Asset, Location)> { // Relay/native token can be teleported between BH and Relay. Some(( - MultiAsset { + Asset { fun: Fungible(EXISTENTIAL_DEPOSIT), - id: Concrete(Parent.into()) + id: AssetId(Parent.into()) }, Parent.into(), )) } - fn reserve_transferable_asset_and_dest() -> Option<(MultiAsset, MultiLocation)> { + fn reserve_transferable_asset_and_dest() -> Option<(Asset, Location)> { // Reserve transfers are disabled on BH. None } fn set_up_complex_asset_transfer( - ) -> Option<(MultiAssets, u32, MultiLocation, Box)> { + ) -> Option<(Assets, u32, Location, Box)> { // BH only supports teleports to system parachain. // Relay/native token can be teleported between BH and Relay. let native_location = Parent.into(); @@ -1132,7 +1132,7 @@ impl_runtime_apis! { use xcm_config::TokenLocation; parameter_types! { - pub ExistentialDepositMultiAsset: Option = Some(( + pub ExistentialDepositAsset: Option = Some(( TokenLocation::get(), ExistentialDeposit::get() ).into()); @@ -1143,17 +1143,17 @@ impl_runtime_apis! { type AccountIdConverter = xcm_config::LocationToAccountId; type DeliveryHelper = cumulus_primitives_utility::ToParentDeliveryHelper< xcm_config::XcmConfig, - ExistentialDepositMultiAsset, + ExistentialDepositAsset, xcm_config::PriceForParentDelivery, >; - fn valid_destination() -> Result { + fn valid_destination() -> Result { Ok(TokenLocation::get()) } - fn worst_case_holding(_depositable_count: u32) -> MultiAssets { + fn worst_case_holding(_depositable_count: u32) -> Assets { // just concrete assets according to relay chain. - let assets: Vec = vec![ - MultiAsset { - id: Concrete(TokenLocation::get()), + let assets: Vec = vec![ + Asset { + id: AssetId(TokenLocation::get()), fun: Fungible(1_000_000 * UNITS), } ]; @@ -1162,12 +1162,12 @@ impl_runtime_apis! { } parameter_types! { - pub const TrustedTeleporter: Option<(MultiLocation, MultiAsset)> = Some(( + pub const TrustedTeleporter: Option<(Location, Asset)> = Some(( TokenLocation::get(), - MultiAsset { fun: Fungible(UNITS), id: Concrete(TokenLocation::get()) }, + Asset { fun: Fungible(UNITS), id: AssetId(TokenLocation::get()) }, )); pub const CheckedAccount: Option<(AccountId, xcm_builder::MintLocation)> = None; - pub const TrustedReserve: Option<(MultiLocation, MultiAsset)> = None; + pub const TrustedReserve: Option<(Location, Asset)> = None; } impl pallet_xcm_benchmarks::fungible::Config for Runtime { @@ -1177,9 +1177,9 @@ impl_runtime_apis! { type TrustedTeleporter = TrustedTeleporter; type TrustedReserve = TrustedReserve; - fn get_multi_asset() -> MultiAsset { - MultiAsset { - id: Concrete(TokenLocation::get()), + fn get_asset() -> Asset { + Asset { + id: AssetId(TokenLocation::get()), fun: Fungible(UNITS), } } @@ -1193,35 +1193,35 @@ impl_runtime_apis! { (0u64, Response::Version(Default::default())) } - fn worst_case_asset_exchange() -> Result<(MultiAssets, MultiAssets), BenchmarkError> { + fn worst_case_asset_exchange() -> Result<(Assets, Assets), BenchmarkError> { Err(BenchmarkError::Skip) } - fn universal_alias() -> Result<(MultiLocation, Junction), BenchmarkError> { + fn universal_alias() -> Result<(Location, Junction), BenchmarkError> { Err(BenchmarkError::Skip) } - fn transact_origin_and_runtime_call() -> Result<(MultiLocation, RuntimeCall), BenchmarkError> { + fn transact_origin_and_runtime_call() -> Result<(Location, RuntimeCall), BenchmarkError> { Ok((TokenLocation::get(), frame_system::Call::remark_with_event { remark: vec![] }.into())) } - fn subscribe_origin() -> Result { + fn subscribe_origin() -> Result { Ok(TokenLocation::get()) } - fn claimable_asset() -> Result<(MultiLocation, MultiLocation, MultiAssets), BenchmarkError> { + fn claimable_asset() -> Result<(Location, Location, Assets), BenchmarkError> { let origin = TokenLocation::get(); - let assets: MultiAssets = (Concrete(TokenLocation::get()), 1_000 * UNITS).into(); - let ticket = MultiLocation { parents: 0, interior: Here }; + let assets: Assets = (AssetId(TokenLocation::get()), 1_000 * UNITS).into(); + let ticket = Location { parents: 0, interior: Here }; Ok((origin, ticket, assets)) } - fn unlockable_asset() -> Result<(MultiLocation, MultiLocation, MultiAsset), BenchmarkError> { + fn unlockable_asset() -> Result<(Location, Location, Asset), BenchmarkError> { Err(BenchmarkError::Skip) } fn export_message_origin_and_destination( - ) -> Result<(MultiLocation, NetworkId, InteriorMultiLocation), BenchmarkError> { + ) -> Result<(Location, NetworkId, InteriorLocation), BenchmarkError> { // save XCM version for remote bridge hub let _ = PolkadotXcm::force_xcm_version( RuntimeOrigin::root(), @@ -1241,12 +1241,12 @@ impl_runtime_apis! { ( bridge_to_westend_config::FromAssetHubRococoToAssetHubWestendRoute::get().location, NetworkId::Westend, - X1(Parachain(bridge_to_westend_config::AssetHubWestendParaId::get().into())) + [Parachain(bridge_to_westend_config::AssetHubWestendParaId::get().into())].into() ) ) } - fn alias_origin() -> Result<(MultiLocation, MultiLocation), BenchmarkError> { + fn alias_origin() -> Result<(Location, Location), BenchmarkError> { Err(BenchmarkError::Skip) } } @@ -1296,7 +1296,7 @@ impl_runtime_apis! { Runtime, bridge_common_config::BridgeGrandpaWestendInstance, bridge_to_westend_config::WithBridgeHubWestendMessageBridge, - >(params, generate_xcm_builder_bridge_message_sample(X2(GlobalConsensus(Rococo), Parachain(42)))) + >(params, generate_xcm_builder_bridge_message_sample([GlobalConsensus(Rococo), Parachain(42)].into())) } fn prepare_message_delivery_proof( @@ -1331,7 +1331,7 @@ impl_runtime_apis! { Runtime, bridge_common_config::BridgeGrandpaRococoBulletinInstance, bridge_to_bulletin_config::WithRococoBulletinMessageBridge, - >(params, generate_xcm_builder_bridge_message_sample(X2(GlobalConsensus(Rococo), Parachain(42)))) + >(params, generate_xcm_builder_bridge_message_sample([GlobalConsensus(Rococo), Parachain(42)].into())) } fn prepare_message_delivery_proof( diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/mod.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/mod.rs index 1c2334a89e2..4f5bae0fe59 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/mod.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/weights/xcm/mod.rs @@ -24,14 +24,14 @@ use pallet_xcm_benchmarks_generic::WeightInfo as XcmGeneric; use sp_std::prelude::*; use xcm::{latest::prelude::*, DoubleEncoded}; -trait WeighMultiAssets { - fn weigh_multi_assets(&self, weight: Weight) -> Weight; +trait WeighAssets { + fn weigh_assets(&self, weight: Weight) -> Weight; } const MAX_ASSETS: u64 = 100; -impl WeighMultiAssets for MultiAssetFilter { - fn weigh_multi_assets(&self, weight: Weight) -> Weight { +impl WeighAssets for AssetFilter { + fn weigh_assets(&self, weight: Weight) -> Weight { match self { Self::Definite(assets) => weight.saturating_mul(assets.inner().iter().count() as u64), Self::Wild(asset) => match asset { @@ -50,40 +50,36 @@ impl WeighMultiAssets for MultiAssetFilter { } } -impl WeighMultiAssets for MultiAssets { - fn weigh_multi_assets(&self, weight: Weight) -> Weight { +impl WeighAssets for Assets { + fn weigh_assets(&self, weight: Weight) -> Weight { weight.saturating_mul(self.inner().iter().count() as u64) } } pub struct BridgeHubRococoXcmWeight(core::marker::PhantomData); impl XcmWeightInfo for BridgeHubRococoXcmWeight { - fn withdraw_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::withdraw_asset()) + fn withdraw_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::withdraw_asset()) } - fn reserve_asset_deposited(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::reserve_asset_deposited()) + fn reserve_asset_deposited(assets: &Assets) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::reserve_asset_deposited()) } - fn receive_teleported_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::receive_teleported_asset()) + fn receive_teleported_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::receive_teleported_asset()) } fn query_response( _query_id: &u64, _response: &Response, _max_weight: &Weight, - _querier: &Option, + _querier: &Option, ) -> Weight { XcmGeneric::::query_response() } - fn transfer_asset(assets: &MultiAssets, _dest: &MultiLocation) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::transfer_asset()) + fn transfer_asset(assets: &Assets, _dest: &Location) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::transfer_asset()) } - fn transfer_reserve_asset( - assets: &MultiAssets, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::transfer_reserve_asset()) + fn transfer_reserve_asset(assets: &Assets, _dest: &Location, _xcm: &Xcm<()>) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::transfer_reserve_asset()) } fn transact( _origin_type: &OriginKind, @@ -111,44 +107,36 @@ impl XcmWeightInfo for BridgeHubRococoXcmWeight { fn clear_origin() -> Weight { XcmGeneric::::clear_origin() } - fn descend_origin(_who: &InteriorMultiLocation) -> Weight { + fn descend_origin(_who: &InteriorLocation) -> Weight { XcmGeneric::::descend_origin() } fn report_error(_query_response_info: &QueryResponseInfo) -> Weight { XcmGeneric::::report_error() } - fn deposit_asset(assets: &MultiAssetFilter, _dest: &MultiLocation) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::deposit_asset()) + fn deposit_asset(assets: &AssetFilter, _dest: &Location) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::deposit_asset()) } - fn deposit_reserve_asset( - assets: &MultiAssetFilter, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::deposit_reserve_asset()) + fn deposit_reserve_asset(assets: &AssetFilter, _dest: &Location, _xcm: &Xcm<()>) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::deposit_reserve_asset()) } - fn exchange_asset(_give: &MultiAssetFilter, _receive: &MultiAssets, _maximal: &bool) -> Weight { + fn exchange_asset(_give: &AssetFilter, _receive: &Assets, _maximal: &bool) -> Weight { Weight::MAX } fn initiate_reserve_withdraw( - assets: &MultiAssetFilter, - _reserve: &MultiLocation, + assets: &AssetFilter, + _reserve: &Location, _xcm: &Xcm<()>, ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::initiate_reserve_withdraw()) + assets.weigh_assets(XcmFungibleWeight::::initiate_reserve_withdraw()) } - fn initiate_teleport( - assets: &MultiAssetFilter, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::initiate_teleport()) + fn initiate_teleport(assets: &AssetFilter, _dest: &Location, _xcm: &Xcm<()>) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::initiate_teleport()) } - fn report_holding(_response_info: &QueryResponseInfo, _assets: &MultiAssetFilter) -> Weight { + fn report_holding(_response_info: &QueryResponseInfo, _assets: &AssetFilter) -> Weight { XcmGeneric::::report_holding() } - fn buy_execution(_fees: &MultiAsset, _weight_limit: &WeightLimit) -> Weight { + fn buy_execution(_fees: &Asset, _weight_limit: &WeightLimit) -> Weight { XcmGeneric::::buy_execution() } fn refund_surplus() -> Weight { @@ -163,7 +151,7 @@ impl XcmWeightInfo for BridgeHubRococoXcmWeight { fn clear_error() -> Weight { XcmGeneric::::clear_error() } - fn claim_asset(_assets: &MultiAssets, _ticket: &MultiLocation) -> Weight { + fn claim_asset(_assets: &Assets, _ticket: &Location) -> Weight { XcmGeneric::::claim_asset() } fn trap(_code: &u64) -> Weight { @@ -175,13 +163,13 @@ impl XcmWeightInfo for BridgeHubRococoXcmWeight { fn unsubscribe_version() -> Weight { XcmGeneric::::unsubscribe_version() } - fn burn_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmGeneric::::burn_asset()) + fn burn_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmGeneric::::burn_asset()) } - fn expect_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmGeneric::::expect_asset()) + fn expect_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmGeneric::::expect_asset()) } - fn expect_origin(_origin: &Option) -> Weight { + fn expect_origin(_origin: &Option) -> Weight { XcmGeneric::::expect_origin() } fn expect_error(_error: &Option<(u32, XcmError)>) -> Weight { @@ -215,16 +203,16 @@ impl XcmWeightInfo for BridgeHubRococoXcmWeight { let inner_encoded_len = inner.encode().len() as u32; XcmGeneric::::export_message(inner_encoded_len) } - fn lock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn lock_asset(_: &Asset, _: &Location) -> Weight { Weight::MAX } - fn unlock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn unlock_asset(_: &Asset, _: &Location) -> Weight { Weight::MAX } - fn note_unlockable(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn note_unlockable(_: &Asset, _: &Location) -> Weight { Weight::MAX } - fn request_unlock(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn request_unlock(_: &Asset, _: &Location) -> Weight { Weight::MAX } fn set_fees_mode(_: &bool) -> Weight { @@ -236,11 +224,11 @@ impl XcmWeightInfo for BridgeHubRococoXcmWeight { fn clear_topic() -> Weight { XcmGeneric::::clear_topic() } - fn alias_origin(_: &MultiLocation) -> Weight { + fn alias_origin(_: &Location) -> Weight { // XCM Executor does not currently support alias origin operations Weight::MAX } - fn unpaid_execution(_: &WeightLimit, _: &Option) -> Weight { + fn unpaid_execution(_: &WeightLimit, _: &Option) -> Weight { XcmGeneric::::unpaid_execution() } } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs index dc98622cafc..f641b428d4c 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs @@ -32,7 +32,7 @@ use bp_messages::LaneId; use bp_relayers::{PayRewardFromAccount, RewardsAccountOwner, RewardsAccountParams}; use bp_runtime::ChainId; use frame_support::{ - match_types, parameter_types, + parameter_types, traits::{ConstU32, Contains, Equals, Everything, Nothing}, }; use frame_system::EnsureRoot; @@ -69,19 +69,19 @@ use xcm_executor::{ }; parameter_types! { - pub const TokenLocation: MultiLocation = MultiLocation::parent(); + pub const TokenLocation: Location = Location::parent(); pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); pub RelayNetwork: NetworkId = NetworkId::Rococo; - pub UniversalLocation: InteriorMultiLocation = - X2(GlobalConsensus(RelayNetwork::get()), Parachain(ParachainInfo::parachain_id().into())); + pub UniversalLocation: InteriorLocation = + [GlobalConsensus(RelayNetwork::get()), Parachain(ParachainInfo::parachain_id().into())].into(); pub const MaxInstructions: u32 = 100; pub const MaxAssetsIntoHolding: u32 = 64; pub TreasuryAccount: AccountId = TREASURY_PALLET_ID.into_account_truncating(); - pub RelayTreasuryLocation: MultiLocation = (Parent, PalletInstance(rococo_runtime_constants::TREASURY_PALLET_ID)).into(); - pub SiblingPeople: MultiLocation = (Parent, Parachain(rococo_runtime_constants::system_parachain::PEOPLE_ID)).into(); + pub RelayTreasuryLocation: Location = (Parent, PalletInstance(rococo_runtime_constants::TREASURY_PALLET_ID)).into(); + pub SiblingPeople: Location = (Parent, Parachain(rococo_runtime_constants::system_parachain::PEOPLE_ID)).into(); } -/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used +/// Type for specifying how a `Location` can be converted into an `AccountId`. This is used /// when determining ownership of accounts for asset transacting and when attempting to use XCM /// `Transact` in order to determine the dispatch Origin. pub type LocationToAccountId = ( @@ -100,7 +100,7 @@ pub type CurrencyTransactor = CurrencyAdapter< Balances, // Use this currency when it is a fungible asset matching the given location or name: IsConcrete, - // Do a simple punn to convert an AccountId32 MultiLocation into a native chain account ID: + // Do a simple punn to convert an AccountId32 Location into a native chain account ID: LocationToAccountId, // Our chain's account ID type (we can't get away without mentioning it explicitly): AccountId, @@ -132,11 +132,11 @@ pub type XcmOriginToTransactDispatchOrigin = ( XcmPassthrough, ); -match_types! { - pub type ParentOrParentsPlurality: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(Plurality { .. }) } - }; +pub struct ParentOrParentsPlurality; +impl Contains for ParentOrParentsPlurality { + fn contains(location: &Location) -> bool { + matches!(location.unpack(), (1, []) | (1, [Plurality { .. }])) + } } /// A call filter for the XCM Transact instruction. This is a temporary measure until we properly @@ -331,7 +331,7 @@ impl xcm_executor::Config for XcmConfig { pub type PriceForParentDelivery = ExponentialPrice; -/// Converts a local signed origin into an XCM multilocation. +/// Converts a local signed origin into an XCM location. /// Forms the basis for local origins sending/executing XCMs. pub type LocalOriginToLocation = SignedToAccountId32; @@ -407,14 +407,10 @@ impl< BridgeLaneId, > { - fn handle_fee( - fee: MultiAssets, - maybe_context: Option<&XcmContext>, - reason: FeeReason, - ) -> MultiAssets { + fn handle_fee(fee: Assets, maybe_context: Option<&XcmContext>, reason: FeeReason) -> Assets { if matches!(reason, FeeReason::Export { network: bridged_network, destination } if bridged_network == DestNetwork::get() && - destination == X1(Parachain(DestParaId::get().into()))) + destination == [Parachain(DestParaId::get().into())]) { // We have 2 relayer rewards accounts: // - the SA of the source parachain on this BH: this pays the relayers for delivering @@ -445,14 +441,14 @@ impl< Fungible(total_fee) => { let source_fee = total_fee / 2; deposit_or_burn_fee::( - MultiAsset { id: asset.id, fun: Fungible(source_fee) }.into(), + Asset { id: asset.id.clone(), fun: Fungible(source_fee) }.into(), maybe_context, source_para_account.clone(), ); let dest_fee = total_fee - source_fee; deposit_or_burn_fee::( - MultiAsset { id: asset.id, fun: Fungible(dest_fee) }.into(), + Asset { id: asset.id, fun: Fungible(dest_fee) }.into(), maybe_context, dest_para_account.clone(), ); @@ -467,7 +463,7 @@ impl< } } - return MultiAssets::new() + return Assets::new() } fee @@ -477,10 +473,10 @@ impl< pub struct XcmFeeManagerFromComponentsBridgeHub( PhantomData<(WaivedLocations, HandleFee)>, ); -impl, FeeHandler: HandleFee> FeeManager +impl, FeeHandler: HandleFee> FeeManager for XcmFeeManagerFromComponentsBridgeHub { - fn is_waived(origin: Option<&MultiLocation>, fee_reason: FeeReason) -> bool { + fn is_waived(origin: Option<&Location>, fee_reason: FeeReason) -> bool { let Some(loc) = origin else { return false }; if let Export { network, destination: Here } = fee_reason { return !(network == EthereumNetwork::get()) @@ -488,7 +484,7 @@ impl, FeeHandler: HandleFee> FeeManager WaivedLocations::contains(loc) } - fn handle_fee(fee: MultiAssets, context: Option<&XcmContext>, reason: FeeReason) { + fn handle_fee(fee: Assets, context: Option<&XcmContext>, reason: FeeReason) { FeeHandler::handle_fee(fee, context, reason); } } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs index 0fba28c47b4..63e64506ec7 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/tests/tests.rs @@ -241,7 +241,7 @@ mod bridge_hub_westend_tests { _ => None, } }), - || ExportMessage { network: Westend, destination: X1(Parachain(bridge_to_westend_config::AssetHubWestendParaId::get().into())), xcm: Xcm(vec![]) }, + || ExportMessage { network: Westend, destination: [Parachain(bridge_to_westend_config::AssetHubWestendParaId::get().into())].into(), xcm: Xcm(vec![]) }, XCM_LANE_FOR_ASSET_HUB_ROCOCO_TO_ASSET_HUB_WESTEND, Some((TokenLocation::get(), ExistentialDeposit::get()).into()), // value should be >= than value generated by `can_calculate_weight_for_paid_export_message_with_reserve_transfer` diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/bridge_to_rococo_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/bridge_to_rococo_config.rs index eb5493872b4..716e01b85b4 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/bridge_to_rococo_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/bridge_to_rococo_config.rs @@ -47,7 +47,7 @@ use frame_support::{ use sp_runtime::RuntimeDebug; use xcm::{ latest::prelude::*, - prelude::{InteriorMultiLocation, NetworkId}, + prelude::{InteriorLocation, NetworkId}, }; use xcm_builder::BridgeBlobDispatcher; @@ -63,12 +63,12 @@ parameter_types! { pub const MaxUnconfirmedMessagesAtInboundLane: bp_messages::MessageNonce = bp_bridge_hub_westend::MAX_UNCONFIRMED_MESSAGES_IN_CONFIRMATION_TX; pub const BridgeHubRococoChainId: bp_runtime::ChainId = bp_runtime::BRIDGE_HUB_ROCOCO_CHAIN_ID; - pub BridgeWestendToRococoMessagesPalletInstance: InteriorMultiLocation = X1(PalletInstance(::index() as u8)); + pub BridgeWestendToRococoMessagesPalletInstance: InteriorLocation = [PalletInstance(::index() as u8)].into(); pub RococoGlobalConsensusNetwork: NetworkId = NetworkId::Rococo; - pub RococoGlobalConsensusNetworkLocation: MultiLocation = MultiLocation { - parents: 2, - interior: X1(GlobalConsensus(RococoGlobalConsensusNetwork::get())) - }; + pub RococoGlobalConsensusNetworkLocation: Location = Location::new( + 2, + [GlobalConsensus(RococoGlobalConsensusNetwork::get())] + ); // see the `FEE_BOOST_PER_MESSAGE` constant to get the meaning of this value pub PriorityBoostPerMessage: u64 = 182_044_444_444_444; @@ -79,26 +79,26 @@ parameter_types! { pub ActiveOutboundLanesToBridgeHubRococo: &'static [bp_messages::LaneId] = &[XCM_LANE_FOR_ASSET_HUB_WESTEND_TO_ASSET_HUB_ROCOCO]; pub const AssetHubWestendToAssetHubRococoMessagesLane: bp_messages::LaneId = XCM_LANE_FOR_ASSET_HUB_WESTEND_TO_ASSET_HUB_ROCOCO; pub FromAssetHubWestendToAssetHubRococoRoute: SenderAndLane = SenderAndLane::new( - ParentThen(X1(Parachain(AssetHubWestendParaId::get().into()))).into(), + ParentThen([Parachain(AssetHubWestendParaId::get().into())].into()).into(), XCM_LANE_FOR_ASSET_HUB_WESTEND_TO_ASSET_HUB_ROCOCO, ); - pub ActiveLanes: sp_std::vec::Vec<(SenderAndLane, (NetworkId, InteriorMultiLocation))> = sp_std::vec![ + pub ActiveLanes: sp_std::vec::Vec<(SenderAndLane, (NetworkId, InteriorLocation))> = sp_std::vec![ ( FromAssetHubWestendToAssetHubRococoRoute::get(), - (RococoGlobalConsensusNetwork::get(), X1(Parachain(AssetHubRococoParaId::get().into()))) + (RococoGlobalConsensusNetwork::get(), [Parachain(AssetHubRococoParaId::get().into())].into()) ) ]; pub CongestedMessage: Xcm<()> = build_congestion_message(true).into(); pub UncongestedMessage: Xcm<()> = build_congestion_message(false).into(); - pub BridgeHubRococoLocation: MultiLocation = MultiLocation { - parents: 2, - interior: X2( + pub BridgeHubRococoLocation: Location = Location::new( + 2, + [ GlobalConsensus(RococoGlobalConsensusNetwork::get()), Parachain(::PARACHAIN_ID) - ) - }; + ] + ); } pub const XCM_LANE_FOR_ASSET_HUB_WESTEND_TO_ASSET_HUB_ROCOCO: LaneId = LaneId([0, 0, 0, 2]); @@ -363,9 +363,9 @@ mod tests { assert_eq!( BridgeWestendToRococoMessagesPalletInstance::get(), - X1(PalletInstance( + [PalletInstance( bp_bridge_hub_westend::WITH_BRIDGE_WESTEND_TO_ROCOCO_MESSAGES_PALLET_INDEX - )) + )] ); } } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs index 717cde6280d..d920f5a98cf 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs @@ -352,7 +352,7 @@ impl cumulus_pallet_aura_ext::Config for Runtime {} parameter_types! { /// The asset ID for the asset that we use to pay for message delivery fees. - pub FeeAssetId: AssetId = Concrete(xcm_config::WestendLocation::get()); + pub FeeAssetId: AssetId = AssetId(xcm_config::WestendLocation::get()); /// The base fee for the message delivery fees. pub const BaseDeliveryFee: u128 = CENTS.saturating_mul(3); } @@ -797,28 +797,28 @@ impl_runtime_apis! { use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsicsBenchmark; impl pallet_xcm::benchmarking::Config for Runtime { - fn reachable_dest() -> Option { + fn reachable_dest() -> Option { Some(Parent.into()) } - fn teleportable_asset_and_dest() -> Option<(MultiAsset, MultiLocation)> { + fn teleportable_asset_and_dest() -> Option<(Asset, Location)> { // Relay/native token can be teleported between BH and Relay. Some(( - MultiAsset { + Asset { fun: Fungible(EXISTENTIAL_DEPOSIT), - id: Concrete(Parent.into()) + id: AssetId(Parent.into()) }, Parent.into(), )) } - fn reserve_transferable_asset_and_dest() -> Option<(MultiAsset, MultiLocation)> { + fn reserve_transferable_asset_and_dest() -> Option<(Asset, Location)> { // Reserve transfers are disabled on BH. None } fn set_up_complex_asset_transfer( - ) -> Option<(MultiAssets, u32, MultiLocation, Box)> { + ) -> Option<(Assets, u32, Location, Box)> { // BH only supports teleports to system parachain. // Relay/native token can be teleported between BH and Relay. let native_location = Parent.into(); @@ -834,7 +834,7 @@ impl_runtime_apis! { use xcm_config::WestendLocation; parameter_types! { - pub ExistentialDepositMultiAsset: Option = Some(( + pub ExistentialDepositAsset: Option = Some(( WestendLocation::get(), ExistentialDeposit::get() ).into()); @@ -845,17 +845,17 @@ impl_runtime_apis! { type AccountIdConverter = xcm_config::LocationToAccountId; type DeliveryHelper = cumulus_primitives_utility::ToParentDeliveryHelper< xcm_config::XcmConfig, - ExistentialDepositMultiAsset, + ExistentialDepositAsset, xcm_config::PriceForParentDelivery, >; - fn valid_destination() -> Result { + fn valid_destination() -> Result { Ok(WestendLocation::get()) } - fn worst_case_holding(_depositable_count: u32) -> MultiAssets { - // just concrete assets according to relay chain. - let assets: Vec = vec![ - MultiAsset { - id: Concrete(WestendLocation::get()), + fn worst_case_holding(_depositable_count: u32) -> Assets { + // just assets according to relay chain. + let assets: Vec = vec![ + Asset { + id: AssetId(WestendLocation::get()), fun: Fungible(1_000_000 * UNITS), } ]; @@ -864,12 +864,12 @@ impl_runtime_apis! { } parameter_types! { - pub const TrustedTeleporter: Option<(MultiLocation, MultiAsset)> = Some(( + pub const TrustedTeleporter: Option<(Location, Asset)> = Some(( WestendLocation::get(), - MultiAsset { fun: Fungible(UNITS), id: Concrete(WestendLocation::get()) }, + Asset { fun: Fungible(UNITS), id: AssetId(WestendLocation::get()) }, )); pub const CheckedAccount: Option<(AccountId, xcm_builder::MintLocation)> = None; - pub const TrustedReserve: Option<(MultiLocation, MultiAsset)> = None; + pub const TrustedReserve: Option<(Location, Asset)> = None; } impl pallet_xcm_benchmarks::fungible::Config for Runtime { @@ -879,9 +879,9 @@ impl_runtime_apis! { type TrustedTeleporter = TrustedTeleporter; type TrustedReserve = TrustedReserve; - fn get_multi_asset() -> MultiAsset { - MultiAsset { - id: Concrete(WestendLocation::get()), + fn get_asset() -> Asset { + Asset { + id: AssetId(WestendLocation::get()), fun: Fungible(UNITS), } } @@ -895,35 +895,35 @@ impl_runtime_apis! { (0u64, Response::Version(Default::default())) } - fn worst_case_asset_exchange() -> Result<(MultiAssets, MultiAssets), BenchmarkError> { + fn worst_case_asset_exchange() -> Result<(Assets, Assets), BenchmarkError> { Err(BenchmarkError::Skip) } - fn universal_alias() -> Result<(MultiLocation, Junction), BenchmarkError> { + fn universal_alias() -> Result<(Location, Junction), BenchmarkError> { Err(BenchmarkError::Skip) } - fn transact_origin_and_runtime_call() -> Result<(MultiLocation, RuntimeCall), BenchmarkError> { + fn transact_origin_and_runtime_call() -> Result<(Location, RuntimeCall), BenchmarkError> { Ok((WestendLocation::get(), frame_system::Call::remark_with_event { remark: vec![] }.into())) } - fn subscribe_origin() -> Result { + fn subscribe_origin() -> Result { Ok(WestendLocation::get()) } - fn claimable_asset() -> Result<(MultiLocation, MultiLocation, MultiAssets), BenchmarkError> { + fn claimable_asset() -> Result<(Location, Location, Assets), BenchmarkError> { let origin = WestendLocation::get(); - let assets: MultiAssets = (Concrete(WestendLocation::get()), 1_000 * UNITS).into(); - let ticket = MultiLocation { parents: 0, interior: Here }; + let assets: Assets = (AssetId(WestendLocation::get()), 1_000 * UNITS).into(); + let ticket = Location { parents: 0, interior: Here }; Ok((origin, ticket, assets)) } - fn unlockable_asset() -> Result<(MultiLocation, MultiLocation, MultiAsset), BenchmarkError> { + fn unlockable_asset() -> Result<(Location, Location, Asset), BenchmarkError> { Err(BenchmarkError::Skip) } fn export_message_origin_and_destination( - ) -> Result<(MultiLocation, NetworkId, InteriorMultiLocation), BenchmarkError> { + ) -> Result<(Location, NetworkId, InteriorLocation), BenchmarkError> { // save XCM version for remote bridge hub let _ = PolkadotXcm::force_xcm_version( RuntimeOrigin::root(), @@ -943,12 +943,12 @@ impl_runtime_apis! { ( bridge_to_rococo_config::FromAssetHubWestendToAssetHubRococoRoute::get().location, NetworkId::Rococo, - X1(Parachain(bridge_to_rococo_config::AssetHubRococoParaId::get().into())) + [Parachain(bridge_to_rococo_config::AssetHubRococoParaId::get().into())].into() ) ) } - fn alias_origin() -> Result<(MultiLocation, MultiLocation), BenchmarkError> { + fn alias_origin() -> Result<(Location, Location), BenchmarkError> { Err(BenchmarkError::Skip) } } @@ -995,7 +995,7 @@ impl_runtime_apis! { Runtime, bridge_to_rococo_config::BridgeGrandpaRococoInstance, bridge_to_rococo_config::WithBridgeHubRococoMessageBridge, - >(params, generate_xcm_builder_bridge_message_sample(X2(GlobalConsensus(Westend), Parachain(42)))) + >(params, generate_xcm_builder_bridge_message_sample([GlobalConsensus(Westend), Parachain(42)].into())) } fn prepare_message_delivery_proof( diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/xcm/mod.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/xcm/mod.rs index 7269fa84f84..e8950678b40 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/xcm/mod.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/weights/xcm/mod.rs @@ -25,14 +25,14 @@ use pallet_xcm_benchmarks_generic::WeightInfo as XcmGeneric; use sp_std::prelude::*; use xcm::{latest::prelude::*, DoubleEncoded}; -trait WeighMultiAssets { - fn weigh_multi_assets(&self, weight: Weight) -> Weight; +trait WeighAssets { + fn weigh_assets(&self, weight: Weight) -> Weight; } const MAX_ASSETS: u64 = 100; -impl WeighMultiAssets for MultiAssetFilter { - fn weigh_multi_assets(&self, weight: Weight) -> Weight { +impl WeighAssets for AssetFilter { + fn weigh_assets(&self, weight: Weight) -> Weight { match self { Self::Definite(assets) => weight.saturating_mul(assets.inner().iter().count() as u64), Self::Wild(asset) => match asset { @@ -51,40 +51,36 @@ impl WeighMultiAssets for MultiAssetFilter { } } -impl WeighMultiAssets for MultiAssets { - fn weigh_multi_assets(&self, weight: Weight) -> Weight { +impl WeighAssets for Assets { + fn weigh_assets(&self, weight: Weight) -> Weight { weight.saturating_mul(self.inner().iter().count() as u64) } } pub struct BridgeHubWestendXcmWeight(core::marker::PhantomData); impl XcmWeightInfo for BridgeHubWestendXcmWeight { - fn withdraw_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::withdraw_asset()) + fn withdraw_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::withdraw_asset()) } - fn reserve_asset_deposited(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::reserve_asset_deposited()) + fn reserve_asset_deposited(assets: &Assets) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::reserve_asset_deposited()) } - fn receive_teleported_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::receive_teleported_asset()) + fn receive_teleported_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::receive_teleported_asset()) } fn query_response( _query_id: &u64, _response: &Response, _max_weight: &Weight, - _querier: &Option, + _querier: &Option, ) -> Weight { XcmGeneric::::query_response() } - fn transfer_asset(assets: &MultiAssets, _dest: &MultiLocation) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::transfer_asset()) + fn transfer_asset(assets: &Assets, _dest: &Location) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::transfer_asset()) } - fn transfer_reserve_asset( - assets: &MultiAssets, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::transfer_reserve_asset()) + fn transfer_reserve_asset(assets: &Assets, _dest: &Location, _xcm: &Xcm<()>) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::transfer_reserve_asset()) } fn transact( _origin_type: &OriginKind, @@ -112,44 +108,36 @@ impl XcmWeightInfo for BridgeHubWestendXcmWeight { fn clear_origin() -> Weight { XcmGeneric::::clear_origin() } - fn descend_origin(_who: &InteriorMultiLocation) -> Weight { + fn descend_origin(_who: &InteriorLocation) -> Weight { XcmGeneric::::descend_origin() } fn report_error(_query_response_info: &QueryResponseInfo) -> Weight { XcmGeneric::::report_error() } - fn deposit_asset(assets: &MultiAssetFilter, _dest: &MultiLocation) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::deposit_asset()) + fn deposit_asset(assets: &AssetFilter, _dest: &Location) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::deposit_asset()) } - fn deposit_reserve_asset( - assets: &MultiAssetFilter, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::deposit_reserve_asset()) + fn deposit_reserve_asset(assets: &AssetFilter, _dest: &Location, _xcm: &Xcm<()>) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::deposit_reserve_asset()) } - fn exchange_asset(_give: &MultiAssetFilter, _receive: &MultiAssets, _maximal: &bool) -> Weight { + fn exchange_asset(_give: &AssetFilter, _receive: &Assets, _maximal: &bool) -> Weight { Weight::MAX } fn initiate_reserve_withdraw( - assets: &MultiAssetFilter, - _reserve: &MultiLocation, + assets: &AssetFilter, + _reserve: &Location, _xcm: &Xcm<()>, ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::initiate_reserve_withdraw()) + assets.weigh_assets(XcmFungibleWeight::::initiate_reserve_withdraw()) } - fn initiate_teleport( - assets: &MultiAssetFilter, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::initiate_teleport()) + fn initiate_teleport(assets: &AssetFilter, _dest: &Location, _xcm: &Xcm<()>) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::initiate_teleport()) } - fn report_holding(_response_info: &QueryResponseInfo, _assets: &MultiAssetFilter) -> Weight { + fn report_holding(_response_info: &QueryResponseInfo, _assets: &AssetFilter) -> Weight { XcmGeneric::::report_holding() } - fn buy_execution(_fees: &MultiAsset, _weight_limit: &WeightLimit) -> Weight { + fn buy_execution(_fees: &Asset, _weight_limit: &WeightLimit) -> Weight { XcmGeneric::::buy_execution() } fn refund_surplus() -> Weight { @@ -164,7 +152,7 @@ impl XcmWeightInfo for BridgeHubWestendXcmWeight { fn clear_error() -> Weight { XcmGeneric::::clear_error() } - fn claim_asset(_assets: &MultiAssets, _ticket: &MultiLocation) -> Weight { + fn claim_asset(_assets: &Assets, _ticket: &Location) -> Weight { XcmGeneric::::claim_asset() } fn trap(_code: &u64) -> Weight { @@ -176,13 +164,13 @@ impl XcmWeightInfo for BridgeHubWestendXcmWeight { fn unsubscribe_version() -> Weight { XcmGeneric::::unsubscribe_version() } - fn burn_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmGeneric::::burn_asset()) + fn burn_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmGeneric::::burn_asset()) } - fn expect_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmGeneric::::expect_asset()) + fn expect_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmGeneric::::expect_asset()) } - fn expect_origin(_origin: &Option) -> Weight { + fn expect_origin(_origin: &Option) -> Weight { XcmGeneric::::expect_origin() } fn expect_error(_error: &Option<(u32, XcmError)>) -> Weight { @@ -216,16 +204,16 @@ impl XcmWeightInfo for BridgeHubWestendXcmWeight { let inner_encoded_len = inner.encode().len() as u32; XcmGeneric::::export_message(inner_encoded_len) } - fn lock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn lock_asset(_: &Asset, _: &Location) -> Weight { Weight::MAX } - fn unlock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn unlock_asset(_: &Asset, _: &Location) -> Weight { Weight::MAX } - fn note_unlockable(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn note_unlockable(_: &Asset, _: &Location) -> Weight { Weight::MAX } - fn request_unlock(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn request_unlock(_: &Asset, _: &Location) -> Weight { Weight::MAX } fn set_fees_mode(_: &bool) -> Weight { @@ -237,11 +225,11 @@ impl XcmWeightInfo for BridgeHubWestendXcmWeight { fn clear_topic() -> Weight { XcmGeneric::::clear_topic() } - fn alias_origin(_: &MultiLocation) -> Weight { + fn alias_origin(_: &Location) -> Weight { // XCM Executor does not currently support alias origin operations Weight::MAX } - fn unpaid_execution(_: &WeightLimit, _: &Option) -> Weight { + fn unpaid_execution(_: &WeightLimit, _: &Option) -> Weight { XcmGeneric::::unpaid_execution() } } diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/xcm_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/xcm_config.rs index 397019190f3..085608acf5d 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/xcm_config.rs @@ -21,7 +21,7 @@ use super::{ }; use crate::bridge_common_config::{DeliveryRewardInBalance, RequiredStakeForStakeAndSlash}; use frame_support::{ - match_types, parameter_types, + parameter_types, traits::{ConstU32, Contains, Equals, Everything, Nothing}, }; use frame_system::EnsureRoot; @@ -52,18 +52,18 @@ use xcm_builder::{ use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; parameter_types! { - pub const WestendLocation: MultiLocation = MultiLocation::parent(); + pub const WestendLocation: Location = Location::parent(); pub const RelayNetwork: NetworkId = NetworkId::Westend; pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); - pub UniversalLocation: InteriorMultiLocation = - X2(GlobalConsensus(RelayNetwork::get()), Parachain(ParachainInfo::parachain_id().into())); + pub UniversalLocation: InteriorLocation = + [GlobalConsensus(RelayNetwork::get()), Parachain(ParachainInfo::parachain_id().into())].into(); pub const MaxInstructions: u32 = 100; pub const MaxAssetsIntoHolding: u32 = 64; pub TreasuryAccount: AccountId = TREASURY_PALLET_ID.into_account_truncating(); - pub RelayTreasuryLocation: MultiLocation = (Parent, PalletInstance(westend_runtime_constants::TREASURY_PALLET_ID)).into(); + pub RelayTreasuryLocation: Location = (Parent, PalletInstance(westend_runtime_constants::TREASURY_PALLET_ID)).into(); } -/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used +/// Type for specifying how a `Location` can be converted into an `AccountId`. This is used /// when determining ownership of accounts for asset transacting and when attempting to use XCM /// `Transact` in order to determine the dispatch Origin. pub type LocationToAccountId = ( @@ -82,7 +82,7 @@ pub type CurrencyTransactor = CurrencyAdapter< Balances, // Use this currency when it is a fungible asset matching the given location or name: IsConcrete, - // Do a simple punn to convert an AccountId32 MultiLocation into a native chain account ID: + // Do a simple punn to convert an AccountId32 Location into a native chain account ID: LocationToAccountId, // Our chain's account ID type (we can't get away without mentioning it explicitly): AccountId, @@ -114,11 +114,11 @@ pub type XcmOriginToTransactDispatchOrigin = ( XcmPassthrough, ); -match_types! { - pub type ParentOrParentsPlurality: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(Plurality { .. }) } - }; +pub struct ParentOrParentsPlurality; +impl Contains for ParentOrParentsPlurality { + fn contains(location: &Location) -> bool { + matches!(location.unpack(), (1, []) | (1, [Plurality { .. }])) + } } /// A call filter for the XCM Transact instruction. This is a temporary measure until we properly @@ -270,7 +270,7 @@ impl xcm_executor::Config for XcmConfig { pub type PriceForParentDelivery = ExponentialPrice; -/// Converts a local signed origin into an XCM multilocation. +/// Converts a local signed origin into an XCM location. /// Forms the basis for local origins sending/executing XCMs. pub type LocalOriginToLocation = SignedToAccountId32; diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/tests/tests.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/tests/tests.rs index 0e58b7b408e..1237a231390 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/tests/tests.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/tests/tests.rs @@ -207,7 +207,7 @@ fn handle_export_message_from_system_parachain_add_to_outbound_queue_works() { _ => None, } }), - || ExportMessage { network: Rococo, destination: X1(Parachain(bridge_to_rococo_config::AssetHubRococoParaId::get().into())), xcm: Xcm(vec![]) }, + || ExportMessage { network: Rococo, destination: [Parachain(bridge_to_rococo_config::AssetHubRococoParaId::get().into())].into(), xcm: Xcm(vec![]) }, XCM_LANE_FOR_ASSET_HUB_WESTEND_TO_ASSET_HUB_ROCOCO, Some((WestendLocation::get(), ExistentialDeposit::get()).into()), // value should be >= than value generated by `can_calculate_weight_for_paid_export_message_with_reserve_transfer` diff --git a/cumulus/parachains/runtimes/bridge-hubs/common/src/message_queue.rs b/cumulus/parachains/runtimes/bridge-hubs/common/src/message_queue.rs index 3e821d45569..c1bba65b0ab 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/common/src/message_queue.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/common/src/message_queue.rs @@ -23,7 +23,7 @@ use pallet_message_queue::OnQueueChanged; use scale_info::TypeInfo; use snowbridge_core::ChannelId; use sp_std::{marker::PhantomData, prelude::*}; -use xcm::v3::{Junction, MultiLocation}; +use xcm::v4::{Junction, Location}; /// The aggregate origin of an inbound message. /// This is specialized for BridgeHub, as the snowbridge-outbound-queue-pallet is also using @@ -46,16 +46,16 @@ pub enum AggregateMessageOrigin { Snowbridge(ChannelId), } -impl From for MultiLocation { +impl From for Location { fn from(origin: AggregateMessageOrigin) -> Self { use AggregateMessageOrigin::*; match origin { - Here => MultiLocation::here(), - Parent => MultiLocation::parent(), - Sibling(id) => MultiLocation::new(1, Junction::Parachain(id.into())), + Here => Location::here(), + Parent => Location::parent(), + Sibling(id) => Location::new(1, Junction::Parachain(id.into())), // NOTE: We don't need this conversion for Snowbridge. However we have to // implement it anyway as xcm_builder::ProcessXcmMessage requires it. - Snowbridge(_) => MultiLocation::default(), + Snowbridge(_) => Location::default(), } } } diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs index e0e75f093cf..5eca85d3112 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs @@ -336,9 +336,9 @@ where (), >( LaneId::default(), - vec![xcm::v3::Instruction::<()>::ClearOrigin; 1_024].into(), + vec![Instruction::<()>::ClearOrigin; 1_024].into(), 1, - X2(GlobalConsensus(Polkadot), Parachain(1_000)), + [GlobalConsensus(Polkadot), Parachain(1_000)].into(), 1u32.into(), ); diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs index 91bebb36b18..6e638b7b350 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs @@ -418,9 +418,9 @@ where (), >( LaneId::default(), - vec![xcm::v3::Instruction::<()>::ClearOrigin; 1_024].into(), + vec![Instruction::<()>::ClearOrigin; 1_024].into(), 1, - X2(GlobalConsensus(Polkadot), Parachain(1_000)), + [GlobalConsensus(Polkadot), Parachain(1_000)].into(), 1, 5, 1_000, diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs index 69aa61db3cc..ba58aeb046e 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs @@ -230,7 +230,7 @@ pub fn relayed_incoming_message_works( prepare_message_proof_import: impl FnOnce( Runtime::AccountId, Runtime::InboundRelayer, - InteriorMultiLocation, + InteriorLocation, MessageNonce, Xcm<()>, ) -> CallsAndVerifiers, @@ -276,21 +276,21 @@ pub fn relayed_incoming_message_works( // set up relayer details and proofs - let message_destination = - X2(GlobalConsensus(local_relay_chain_id), Parachain(sibling_parachain_id)); + let message_destination: InteriorLocation = + [GlobalConsensus(local_relay_chain_id), Parachain(sibling_parachain_id)].into(); // some random numbers (checked by test) let message_nonce = 1; - let xcm = vec![xcm::v3::Instruction::<()>::ClearOrigin; 42]; + let xcm = vec![Instruction::<()>::ClearOrigin; 42]; let expected_dispatch = xcm::latest::Xcm::<()>({ let mut expected_instructions = xcm.clone(); // dispatch prepends bridge pallet instance expected_instructions.insert( 0, - DescendOrigin(X1(PalletInstance( + DescendOrigin([PalletInstance( as PalletInfoAccess>::index() as u8, - ))), + )].into()), ); expected_instructions }); diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/mod.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/mod.rs index 64ec8726599..eb7ba132168 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/mod.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/mod.rs @@ -319,8 +319,8 @@ pub fn handle_export_message_from_system_parachain_to_outbound_queue_works< >, export_message_instruction: fn() -> Instruction, expected_lane_id: LaneId, - existential_deposit: Option, - maybe_paid_export_message: Option, + existential_deposit: Option, + maybe_paid_export_message: Option, prepare_configuration: impl Fn(), ) where Runtime: BasicParachainRuntime + BridgeMessagesConfig, @@ -328,7 +328,7 @@ pub fn handle_export_message_from_system_parachain_to_outbound_queue_works< MessagesPalletInstance: 'static, { assert_ne!(runtime_para_id, sibling_parachain_id); - let sibling_parachain_location = MultiLocation::new(1, Parachain(sibling_parachain_id)); + let sibling_parachain_location = Location::new(1, [Parachain(sibling_parachain_id)]); run_test::(collator_session_key, runtime_para_id, vec![], || { prepare_configuration(); @@ -361,7 +361,7 @@ pub fn handle_export_message_from_system_parachain_to_outbound_queue_works< .expect("deposited fee"); Xcm(vec![ - WithdrawAsset(MultiAssets::from(vec![fee.clone()])), + WithdrawAsset(Assets::from(vec![fee.clone()])), BuyExecution { fees: fee, weight_limit: Unlimited }, export_message_instruction(), ]) @@ -373,12 +373,13 @@ pub fn handle_export_message_from_system_parachain_to_outbound_queue_works< }; // execute XCM - let hash = xcm.using_encoded(sp_io::hashing::blake2_256); - assert_ok!(XcmExecutor::::execute_xcm( + let mut hash = xcm.using_encoded(sp_io::hashing::blake2_256); + assert_ok!(XcmExecutor::::prepare_and_execute( sibling_parachain_location, xcm, - hash, + &mut hash, RuntimeHelper::::xcm_max_weight(XcmReceivedFrom::Sibling), + Weight::zero(), ) .ensure_complete()); @@ -446,9 +447,9 @@ pub fn message_dispatch_routing_works< NetworkDistanceAsParentCount: Get, { struct NetworkWithParentCount(core::marker::PhantomData<(N, C)>); - impl, C: Get> Get for NetworkWithParentCount { - fn get() -> MultiLocation { - MultiLocation { parents: C::get(), interior: X1(GlobalConsensus(N::get())) } + impl, C: Get> Get for NetworkWithParentCount { + fn get() -> Location { + Location::new(C::get(), [GlobalConsensus(N::get())]) } } @@ -495,7 +496,7 @@ pub fn message_dispatch_routing_works< BridgedNetwork, NetworkWithParentCount, AlwaysLatest, - >((RuntimeNetwork::get(), X1(Parachain(sibling_parachain_id)))); + >((RuntimeNetwork::get(), [Parachain(sibling_parachain_id)].into())); // 2.1. WITHOUT opened hrmp channel -> RoutingError let result = @@ -565,52 +566,43 @@ where { // data here are not relevant for weighing let mut xcm = Xcm(vec![ - WithdrawAsset(MultiAssets::from(vec![MultiAsset { - id: Concrete(MultiLocation { parents: 1, interior: Here }), + WithdrawAsset(Assets::from(vec![Asset { + id: AssetId(Location::new(1, [])), fun: Fungible(34333299), }])), BuyExecution { - fees: MultiAsset { - id: Concrete(MultiLocation { parents: 1, interior: Here }), - fun: Fungible(34333299), - }, + fees: Asset { id: AssetId(Location::new(1, [])), fun: Fungible(34333299) }, weight_limit: Unlimited, }, ExportMessage { network: Polkadot, - destination: X1(Parachain(1000)), + destination: [Parachain(1000)].into(), xcm: Xcm(vec![ - ReserveAssetDeposited(MultiAssets::from(vec![MultiAsset { - id: Concrete(MultiLocation { - parents: 2, - interior: X1(GlobalConsensus(Kusama)), - }), + ReserveAssetDeposited(Assets::from(vec![Asset { + id: AssetId(Location::new(2, [GlobalConsensus(Kusama)])), fun: Fungible(1000000000000), }])), ClearOrigin, BuyExecution { - fees: MultiAsset { - id: Concrete(MultiLocation { - parents: 2, - interior: X1(GlobalConsensus(Kusama)), - }), + fees: Asset { + id: AssetId(Location::new(2, [GlobalConsensus(Kusama)])), fun: Fungible(1000000000000), }, weight_limit: Unlimited, }, DepositAsset { assets: Wild(AllCounted(1)), - beneficiary: MultiLocation { - parents: 0, - interior: X1(xcm::latest::prelude::AccountId32 { + beneficiary: Location::new( + 0, + [xcm::latest::prelude::AccountId32 { network: None, id: [ 212, 53, 147, 199, 21, 253, 211, 28, 97, 20, 26, 189, 4, 169, 159, 214, 130, 44, 133, 88, 133, 76, 205, 227, 154, 86, 132, 231, 165, 109, 162, 125, ], - }), - }, + }], + ), }, SetTopic([ 116, 82, 194, 132, 171, 114, 217, 165, 23, 37, 161, 177, 165, 179, 247, 114, @@ -618,10 +610,7 @@ where ]), ]), }, - DepositAsset { - assets: Wild(All), - beneficiary: MultiLocation { parents: 1, interior: X1(Parachain(1000)) }, - }, + DepositAsset { assets: Wild(All), beneficiary: Location::new(1, [Parachain(1000)]) }, SetTopic([ 36, 224, 250, 165, 82, 195, 67, 110, 160, 170, 140, 87, 217, 62, 201, 164, 42, 98, 219, 157, 124, 105, 248, 25, 131, 218, 199, 36, 109, 173, 100, 122, diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/mod.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/mod.rs index f905d21b187..9285a1e7ad4 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/mod.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/mod.rs @@ -37,10 +37,10 @@ use xcm_executor::traits::{validate_export, ExportXcm}; pub fn prepare_inbound_xcm( xcm_message: Xcm, - destination: InteriorMultiLocation, + destination: InteriorLocation, ) -> Vec { - let location = xcm::VersionedInteriorMultiLocation::V3(destination); - let xcm = xcm::VersionedXcm::::V3(xcm_message); + let location = xcm::VersionedInteriorLocation::V4(destination); + let xcm = xcm::VersionedXcm::::V4(xcm_message); // this is the `BridgeMessage` from polkadot xcm builder, but it has no constructor // or public fields, so just tuple // (double encoding, because `.encode()` is called on original Xcm BLOB when it is pushed @@ -101,7 +101,7 @@ macro_rules! grab_haul_blob ( /// which are transferred over bridge. pub(crate) fn simulate_message_exporter_on_bridged_chain< SourceNetwork: Get, - DestinationNetwork: Get, + DestinationNetwork: Get, DestinationVersion: GetVersion, >( (destination_network, destination_junctions): (NetworkId, Junctions), @@ -109,8 +109,8 @@ pub(crate) fn simulate_message_exporter_on_bridged_chain< grab_haul_blob!(GrabbingHaulBlob, GRABBED_HAUL_BLOB_PAYLOAD); // lets pretend that some parachain on bridged chain exported the message - let universal_source_on_bridged_chain = - X2(GlobalConsensus(SourceNetwork::get()), Parachain(5678)); + let universal_source_on_bridged_chain: Junctions = + [GlobalConsensus(SourceNetwork::get()), Parachain(5678)].into(); let channel = 1_u32; // simulate XCM message export diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/ambassador/mod.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/ambassador/mod.rs index 9f6378de53a..05b3427ef43 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/ambassador/mod.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/ambassador/mod.rs @@ -215,7 +215,7 @@ pub type AmbassadorSalaryInstance = pallet_salary::Instance2; parameter_types! { // The interior location on AssetHub for the paying account. This is the Ambassador Salary // pallet instance (which sits at index 74). This sovereign account will need funding. - pub AmbassadorSalaryLocation: InteriorMultiLocation = PalletInstance(74).into(); + pub AmbassadorSalaryLocation: InteriorLocation = PalletInstance(74).into(); } /// [`PayOverXcm`] setup to pay the Ambassador salary on the AssetHub in WND. diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/fellowship/mod.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/fellowship/mod.rs index f49306bf8e3..273fa6a3415 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/fellowship/mod.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/fellowship/mod.rs @@ -43,7 +43,7 @@ use parachains_common::{ westend::{account, currency::GRAND}, }; use polkadot_runtime_common::impls::{ - LocatableAssetConverter, VersionedLocatableAsset, VersionedMultiLocationConverter, + LocatableAssetConverter, VersionedLocatableAsset, VersionedLocationConverter, }; use sp_arithmetic::Permill; use sp_core::{ConstU128, ConstU32}; @@ -202,7 +202,7 @@ pub type FellowshipSalaryInstance = pallet_salary::Instance1; parameter_types! { // The interior location on AssetHub for the paying account. This is the Fellowship Salary // pallet instance (which sits at index 64). This sovereign account will need funding. - pub Interior: InteriorMultiLocation = PalletInstance(64).into(); + pub Interior: InteriorLocation = PalletInstance(64).into(); } const USDT_UNITS: u128 = 1_000_000; @@ -250,7 +250,7 @@ parameter_types! { pub const MaxBalance: Balance = Balance::max_value(); // The asset's interior location for the paying account. This is the Fellowship Treasury // pallet instance (which sits at index 65). - pub FellowshipTreasuryInteriorLocation: InteriorMultiLocation = PalletInstance(65).into(); + pub FellowshipTreasuryInteriorLocation: InteriorLocation = PalletInstance(65).into(); } #[cfg(feature = "runtime-benchmarks")] @@ -269,10 +269,10 @@ pub type FellowshipTreasuryPaymaster = PayOverXcm< crate::xcm_config::XcmRouter, crate::PolkadotXcm, ConstU32<{ 6 * HOURS }>, - VersionedMultiLocation, + VersionedLocation, VersionedLocatableAsset, LocatableAssetConverter, - VersionedMultiLocationConverter, + VersionedLocationConverter, >; pub type FellowshipTreasuryInstance = pallet_treasury::Instance1; @@ -327,7 +327,7 @@ impl pallet_treasury::Config for Runtime { >, >; type AssetKind = VersionedLocatableAsset; - type Beneficiary = VersionedMultiLocation; + type Beneficiary = VersionedLocation; type BeneficiaryLookup = IdentityLookup; #[cfg(not(feature = "runtime-benchmarks"))] type Paymaster = FellowshipTreasuryPaymaster; diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs index 6cb8e096e4b..a527f620137 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs @@ -427,7 +427,7 @@ impl cumulus_pallet_aura_ext::Config for Runtime {} parameter_types! { /// The asset ID for the asset that we use to pay for message delivery fees. - pub FeeAssetId: AssetId = Concrete(xcm_config::WndLocation::get()); + pub FeeAssetId: AssetId = AssetId(xcm_config::WndLocation::get()); /// The base fee for the message delivery fees. pub const BaseDeliveryFee: u128 = CENTS.saturating_mul(3); } @@ -974,28 +974,28 @@ impl_runtime_apis! { use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsicsBenchmark; impl pallet_xcm::benchmarking::Config for Runtime { - fn reachable_dest() -> Option { + fn reachable_dest() -> Option { Some(Parent.into()) } - fn teleportable_asset_and_dest() -> Option<(MultiAsset, MultiLocation)> { + fn teleportable_asset_and_dest() -> Option<(Asset, Location)> { // Relay/native token can be teleported between Collectives and Relay. Some(( - MultiAsset { + Asset { fun: Fungible(EXISTENTIAL_DEPOSIT), - id: Concrete(Parent.into()) + id: AssetId(Parent.into()) }.into(), Parent.into(), )) } - fn reserve_transferable_asset_and_dest() -> Option<(MultiAsset, MultiLocation)> { + fn reserve_transferable_asset_and_dest() -> Option<(Asset, Location)> { // Reserve transfers are disabled on Collectives. None } fn set_up_complex_asset_transfer( - ) -> Option<(MultiAssets, u32, MultiLocation, Box)> { + ) -> Option<(Assets, u32, Location, Box)> { // Collectives only supports teleports to system parachain. // Relay/native token can be teleported between Collectives and Relay. let native_location = Parent.into(); diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/xcm_config.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/xcm_config.rs index 2e64127d6a1..aa7dbe991e4 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/xcm_config.rs @@ -19,7 +19,7 @@ use super::{ TransactionByteFee, WeightToFee, WestendTreasuryAccount, XcmpQueue, }; use frame_support::{ - match_types, parameter_types, + parameter_types, traits::{ConstU32, Contains, Equals, Everything, Nothing}, weights::Weight, }; @@ -51,17 +51,17 @@ use xcm_builder::{ use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; parameter_types! { - pub const WndLocation: MultiLocation = MultiLocation::parent(); + pub const WndLocation: Location = Location::parent(); pub const RelayNetwork: Option = Some(NetworkId::Westend); pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); - pub UniversalLocation: InteriorMultiLocation = - X2(GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(ParachainInfo::parachain_id().into())); - pub RelayTreasuryLocation: MultiLocation = (Parent, PalletInstance(westend_runtime_constants::TREASURY_PALLET_ID)).into(); + pub UniversalLocation: InteriorLocation = + [GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(ParachainInfo::parachain_id().into())].into(); + pub RelayTreasuryLocation: Location = (Parent, PalletInstance(westend_runtime_constants::TREASURY_PALLET_ID)).into(); pub CheckingAccount: AccountId = PolkadotXcm::check_account(); - pub const GovernanceLocation: MultiLocation = MultiLocation::parent(); + pub const GovernanceLocation: Location = Location::parent(); pub const FellowshipAdminBodyId: BodyId = BodyId::Index(xcm_constants::body::FELLOWSHIP_ADMIN_INDEX); + pub AssetHub: Location = (Parent, Parachain(1000)).into(); pub const TreasurerBodyId: BodyId = BodyId::Index(xcm_constants::body::TREASURER_INDEX); - pub AssetHub: MultiLocation = (Parent, Parachain(1000)).into(); pub AssetHubUsdtId: AssetId = (PalletInstance(50), GeneralIndex(1984)).into(); pub UsdtAssetHub: LocatableAssetId = LocatableAssetId { location: AssetHub::get(), @@ -73,7 +73,7 @@ parameter_types! { }; } -/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used +/// Type for specifying how a `Location` can be converted into an `AccountId`. This is used /// when determining ownership of accounts for asset transacting and when attempting to use XCM /// `Transact` in order to determine the dispatch Origin. pub type LocationToAccountId = ( @@ -92,7 +92,7 @@ pub type CurrencyTransactor = CurrencyAdapter< Balances, // Use this currency when it is a fungible asset matching the given location or name: IsConcrete, - // Convert an XCM MultiLocation into a local account id: + // Convert an XCM Location into a local account id: LocationToAccountId, // Our chain's account ID type (we can't get away without mentioning it explicitly): AccountId, @@ -136,11 +136,11 @@ parameter_types! { pub const FellowsBodyId: BodyId = BodyId::Technical; } -match_types! { - pub type ParentOrParentsPlurality: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(Plurality { .. }) } - }; +pub struct ParentOrParentsPlurality; +impl Contains for ParentOrParentsPlurality { + fn contains(location: &Location) -> bool { + matches!(location.unpack(), (1, []) | (1, [Plurality { .. }])) + } } /// A call filter for the XCM Transact instruction. This is a temporary measure until we properly @@ -292,7 +292,7 @@ impl xcm_executor::Config for XcmConfig { type Aliasers = Nothing; } -/// Converts a local signed origin into an XCM multilocation. +/// Converts a local signed origin into an XCM location. /// Forms the basis for local origins sending/executing XCMs. pub type LocalOriginToLocation = SignedToAccountId32; @@ -310,10 +310,10 @@ pub type XcmRouter = WithUniqueTopic<( #[cfg(feature = "runtime-benchmarks")] parameter_types! { - pub ReachableDest: Option = Some(Parent.into()); + pub ReachableDest: Option = Some(Parent.into()); } -/// Type to convert the Fellows origin to a Plurality `MultiLocation` value. +/// Type to convert the Fellows origin to a Plurality `Location` value. pub type FellowsToPlurality = OriginToPluralityVoice; impl pallet_xcm::Config for Runtime { diff --git a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/lib.rs b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/lib.rs index 79b6b6be299..bc7d94889a1 100644 --- a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/lib.rs @@ -704,28 +704,28 @@ impl_runtime_apis! { use xcm::latest::prelude::*; use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsicsBenchmark; impl pallet_xcm::benchmarking::Config for Runtime { - fn reachable_dest() -> Option { + fn reachable_dest() -> Option { Some(Parent.into()) } - fn teleportable_asset_and_dest() -> Option<(MultiAsset, MultiLocation)> { + fn teleportable_asset_and_dest() -> Option<(Asset, Location)> { // Relay/native token can be teleported between Contracts-System-Para and Relay. Some(( - MultiAsset { + Asset { fun: Fungible(EXISTENTIAL_DEPOSIT), - id: Concrete(Parent.into()) + id: AssetId(Parent.into()) }, Parent.into(), )) } - fn reserve_transferable_asset_and_dest() -> Option<(MultiAsset, MultiLocation)> { + fn reserve_transferable_asset_and_dest() -> Option<(Asset, Location)> { // Reserve transfers are disabled on Contracts-System-Para. None } fn set_up_complex_asset_transfer( - ) -> Option<(MultiAssets, u32, MultiLocation, Box)> { + ) -> Option<(Assets, u32, Location, Box)> { // Contracts-System-Para only supports teleports to system parachain. // Relay/native token can be teleported between Contracts-System-Para and Relay. let native_location = Parent.into(); diff --git a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs index 569ca6e587c..e2cf2c8e51a 100644 --- a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/xcm_config.rs @@ -20,8 +20,8 @@ use super::{ use crate::common::rococo::currency::CENTS; use cumulus_primitives_core::AggregateMessageOrigin; use frame_support::{ - match_types, parameter_types, - traits::{ConstU32, EitherOfDiverse, Equals, Everything, Nothing}, + parameter_types, + traits::{ConstU32, Contains, EitherOfDiverse, Equals, Everything, Nothing}, weights::Weight, }; use frame_system::EnsureRoot; @@ -51,13 +51,13 @@ use xcm_builder::{ use xcm_executor::XcmExecutor; parameter_types! { - pub const RelayLocation: MultiLocation = MultiLocation::parent(); + pub const RelayLocation: Location = Location::parent(); pub const RelayNetwork: Option = None; pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); - pub UniversalLocation: InteriorMultiLocation = Parachain(ParachainInfo::parachain_id().into()).into(); + pub UniversalLocation: InteriorLocation = Parachain(ParachainInfo::parachain_id().into()).into(); pub const ExecutiveBody: BodyId = BodyId::Executive; pub TreasuryAccount: AccountId = TREASURY_PALLET_ID.into_account_truncating(); - pub RelayTreasuryLocation: MultiLocation = (Parent, PalletInstance(rococo_runtime_constants::TREASURY_PALLET_ID)).into(); + pub RelayTreasuryLocation: Location = (Parent, PalletInstance(rococo_runtime_constants::TREASURY_PALLET_ID)).into(); } /// We allow root and the Relay Chain council to execute privileged collator selection operations. @@ -66,7 +66,7 @@ pub type CollatorSelectionUpdateOrigin = EitherOfDiverse< EnsureXcm>, >; -/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used +/// Type for specifying how a `Location` can be converted into an `AccountId`. This is used /// when determining ownership of accounts for asset transacting and when attempting to use XCM /// `Transact` in order to determine the dispatch Origin. pub type LocationToAccountId = ( @@ -85,7 +85,7 @@ pub type CurrencyTransactor = CurrencyAdapter< Balances, // Use this currency when it is a fungible asset matching the given location or name: IsConcrete, - // Convert an XCM MultiLocation into a local account id: + // Convert an XCM Location into a local account id: LocationToAccountId, // Our chain's account ID type (we can't get away without mentioning it explicitly): AccountId, @@ -123,11 +123,11 @@ parameter_types! { pub const MaxInstructions: u32 = 100; } -match_types! { - pub type ParentOrParentsPlurality: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(Plurality { .. }) } - }; +pub struct ParentOrParentsPlurality; +impl Contains for ParentOrParentsPlurality { + fn contains(location: &Location) -> bool { + matches!(location.unpack(), (1, []) | (1, [Plurality { .. }])) + } } pub type Barrier = TrailingSetTopicAsId< @@ -200,7 +200,7 @@ impl xcm_executor::Config for XcmConfig { type Aliasers = Nothing; } -/// Converts a local signed origin into an XCM multilocation. +/// Converts a local signed origin into an XCM location. /// Forms the basis for local origins sending/executing XCMs. pub type LocalOriginToLocation = SignedToAccountId32; @@ -254,7 +254,7 @@ impl cumulus_pallet_xcm::Config for Runtime { parameter_types! { /// The asset ID for the asset that we use to pay for message delivery fees. - pub FeeAssetId: AssetId = Concrete(RelayLocation::get()); + pub FeeAssetId: AssetId = AssetId(RelayLocation::get()); /// The base fee for the message delivery fees. pub const BaseDeliveryFee: u128 = CENTS.saturating_mul(3); } diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/coretime.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/coretime.rs index f8a5dc6398a..a46051212de 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/coretime.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/coretime.rs @@ -98,7 +98,7 @@ impl CoretimeInterface for CoretimeAllocator { }, ]); - match PolkadotXcm::send_xcm(Here, MultiLocation::parent(), message.clone()) { + match PolkadotXcm::send_xcm(Here, Location::parent(), message.clone()) { Ok(_) => log::info!( target: "runtime::coretime", "Request to update schedulable cores sent successfully." @@ -128,7 +128,7 @@ impl CoretimeInterface for CoretimeAllocator { }, ]); - match PolkadotXcm::send_xcm(Here, MultiLocation::parent(), message.clone()) { + match PolkadotXcm::send_xcm(Here, Location::parent(), message.clone()) { Ok(_) => log::info!( target: "runtime::coretime", "Request for revenue information sent successfully." @@ -157,7 +157,7 @@ impl CoretimeInterface for CoretimeAllocator { }, ]); - match PolkadotXcm::send_xcm(Here, MultiLocation::parent(), message.clone()) { + match PolkadotXcm::send_xcm(Here, Location::parent(), message.clone()) { Ok(_) => log::info!( target: "runtime::coretime", "Instruction to credit account sent successfully." @@ -192,7 +192,7 @@ impl CoretimeInterface for CoretimeAllocator { }, ]); - match PolkadotXcm::send_xcm(Here, MultiLocation::parent(), message.clone()) { + match PolkadotXcm::send_xcm(Here, Location::parent(), message.clone()) { Ok(_) => log::info!( target: "runtime::coretime", "Core assignment sent successfully." diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs index c381d78b57f..c5843c1ef29 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/lib.rs @@ -315,7 +315,7 @@ pub type RootOrFellows = EitherOfDiverse< parameter_types! { /// The asset ID for the asset that we use to pay for message delivery fees. - pub FeeAssetId: AssetId = Concrete(RocRelayLocation::get()); + pub FeeAssetId: AssetId = AssetId(RocRelayLocation::get()); /// The base fee for the message delivery fees. pub const BaseDeliveryFee: u128 = CENTS.saturating_mul(3); } @@ -698,29 +698,29 @@ impl_runtime_apis! { use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsicsBenchmark; impl pallet_xcm::benchmarking::Config for Runtime { - fn reachable_dest() -> Option { + fn reachable_dest() -> Option { Some(Parent.into()) } - fn teleportable_asset_and_dest() -> Option<(MultiAsset, MultiLocation)> { + fn teleportable_asset_and_dest() -> Option<(Asset, Location)> { // Relay/native token can be teleported between AH and Relay. Some(( - MultiAsset { + Asset { fun: Fungible(EXISTENTIAL_DEPOSIT), - id: Concrete(Parent.into()) + id: AssetId(Parent.into()) }, Parent.into(), )) } - fn reserve_transferable_asset_and_dest() -> Option<(MultiAsset, MultiLocation)> { + fn reserve_transferable_asset_and_dest() -> Option<(Asset, Location)> { // Reserve transfers are disabled None } } parameter_types! { - pub ExistentialDepositMultiAsset: Option = Some(( + pub ExistentialDepositAsset: Option = Some(( RocRelayLocation::get(), ExistentialDeposit::get() ).into()); @@ -730,18 +730,18 @@ impl_runtime_apis! { type XcmConfig = xcm_config::XcmConfig; type DeliveryHelper = cumulus_primitives_utility::ToParentDeliveryHelper< xcm_config::XcmConfig, - ExistentialDepositMultiAsset, + ExistentialDepositAsset, xcm_config::PriceForParentDelivery, >; type AccountIdConverter = xcm_config::LocationToAccountId; - fn valid_destination() -> Result { + fn valid_destination() -> Result { Ok(RocRelayLocation::get()) } - fn worst_case_holding(_depositable_count: u32) -> MultiAssets { + fn worst_case_holding(_depositable_count: u32) -> Assets { // just concrete assets according to relay chain. - let assets: Vec = vec![ - MultiAsset { - id: Concrete(RocRelayLocation::get()), + let assets: Vec = vec![ + Asset { + id: AssetId(RocRelayLocation::get()), fun: Fungible(1_000_000 * UNITS), } ]; @@ -750,12 +750,12 @@ impl_runtime_apis! { } parameter_types! { - pub const TrustedTeleporter: Option<(MultiLocation, MultiAsset)> = Some(( + pub const TrustedTeleporter: Option<(Location, Asset)> = Some(( RocRelayLocation::get(), - MultiAsset { fun: Fungible(UNITS), id: Concrete(RocRelayLocation::get()) }, + Asset { fun: Fungible(UNITS), id: AssetId(RocRelayLocation::get()) }, )); pub const CheckedAccount: Option<(AccountId, xcm_builder::MintLocation)> = None; - pub const TrustedReserve: Option<(MultiLocation, MultiAsset)> = None; + pub const TrustedReserve: Option<(Location, Asset)> = None; } impl pallet_xcm_benchmarks::fungible::Config for Runtime { @@ -765,9 +765,9 @@ impl_runtime_apis! { type TrustedTeleporter = TrustedTeleporter; type TrustedReserve = TrustedReserve; - fn get_multi_asset() -> MultiAsset { - MultiAsset { - id: Concrete(RocRelayLocation::get()), + fn get_asset() -> Asset { + Asset { + id: AssetId(RocRelayLocation::get()), fun: Fungible(UNITS), } } @@ -781,39 +781,39 @@ impl_runtime_apis! { (0u64, Response::Version(Default::default())) } - fn worst_case_asset_exchange() -> Result<(MultiAssets, MultiAssets), BenchmarkError> { + fn worst_case_asset_exchange() -> Result<(Assets, Assets), BenchmarkError> { Err(BenchmarkError::Skip) } - fn universal_alias() -> Result<(MultiLocation, Junction), BenchmarkError> { + fn universal_alias() -> Result<(Location, Junction), BenchmarkError> { Err(BenchmarkError::Skip) } - fn transact_origin_and_runtime_call() -> Result<(MultiLocation, RuntimeCall), BenchmarkError> { + fn transact_origin_and_runtime_call() -> Result<(Location, RuntimeCall), BenchmarkError> { Ok((RocRelayLocation::get(), frame_system::Call::remark_with_event { remark: vec![] }.into())) } - fn subscribe_origin() -> Result { + fn subscribe_origin() -> Result { Ok(RocRelayLocation::get()) } - fn claimable_asset() -> Result<(MultiLocation, MultiLocation, MultiAssets), BenchmarkError> { + fn claimable_asset() -> Result<(Location, Location, Assets), BenchmarkError> { let origin = RocRelayLocation::get(); - let assets: MultiAssets = (Concrete(RocRelayLocation::get()), 1_000 * UNITS).into(); - let ticket = MultiLocation { parents: 0, interior: Here }; + let assets: Assets = (AssetId(RocRelayLocation::get()), 1_000 * UNITS).into(); + let ticket = Location { parents: 0, interior: Here }; Ok((origin, ticket, assets)) } - fn unlockable_asset() -> Result<(MultiLocation, MultiLocation, MultiAsset), BenchmarkError> { + fn unlockable_asset() -> Result<(Location, Location, Asset), BenchmarkError> { Err(BenchmarkError::Skip) } fn export_message_origin_and_destination( - ) -> Result<(MultiLocation, NetworkId, InteriorMultiLocation), BenchmarkError> { + ) -> Result<(Location, NetworkId, InteriorLocation), BenchmarkError> { Err(BenchmarkError::Skip) } - fn alias_origin() -> Result<(MultiLocation, MultiLocation), BenchmarkError> { + fn alias_origin() -> Result<(Location, Location), BenchmarkError> { Err(BenchmarkError::Skip) } } diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/mod.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/mod.rs index 2319c2e3a5b..8815312f304 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/mod.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/weights/xcm/mod.rs @@ -24,14 +24,14 @@ use pallet_xcm_benchmarks_generic::WeightInfo as XcmGeneric; use sp_std::prelude::*; use xcm::{latest::prelude::*, DoubleEncoded}; -trait WeighMultiAssets { - fn weigh_multi_assets(&self, weight: Weight) -> Weight; +trait WeighAssets { + fn weigh_assets(&self, weight: Weight) -> Weight; } const MAX_ASSETS: u64 = 100; -impl WeighMultiAssets for MultiAssetFilter { - fn weigh_multi_assets(&self, weight: Weight) -> Weight { +impl WeighAssets for AssetFilter { + fn weigh_assets(&self, weight: Weight) -> Weight { match self { Self::Definite(assets) => weight.saturating_mul(assets.inner().iter().count() as u64), Self::Wild(asset) => match asset { @@ -50,40 +50,36 @@ impl WeighMultiAssets for MultiAssetFilter { } } -impl WeighMultiAssets for MultiAssets { - fn weigh_multi_assets(&self, weight: Weight) -> Weight { +impl WeighAssets for Assets { + fn weigh_assets(&self, weight: Weight) -> Weight { weight.saturating_mul(self.inner().iter().count() as u64) } } pub struct CoretimeRococoXcmWeight(core::marker::PhantomData); impl XcmWeightInfo for CoretimeRococoXcmWeight { - fn withdraw_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::withdraw_asset()) + fn withdraw_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::withdraw_asset()) } - fn reserve_asset_deposited(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::reserve_asset_deposited()) + fn reserve_asset_deposited(assets: &Assets) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::reserve_asset_deposited()) } - fn receive_teleported_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::receive_teleported_asset()) + fn receive_teleported_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::receive_teleported_asset()) } fn query_response( _query_id: &u64, _response: &Response, _max_weight: &Weight, - _querier: &Option, + _querier: &Option, ) -> Weight { XcmGeneric::::query_response() } - fn transfer_asset(assets: &MultiAssets, _dest: &MultiLocation) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::transfer_asset()) + fn transfer_asset(assets: &Assets, _dest: &Location) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::transfer_asset()) } - fn transfer_reserve_asset( - assets: &MultiAssets, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::transfer_reserve_asset()) + fn transfer_reserve_asset(assets: &Assets, _dest: &Location, _xcm: &Xcm<()>) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::transfer_reserve_asset()) } fn transact( _origin_type: &OriginKind, @@ -111,43 +107,35 @@ impl XcmWeightInfo for CoretimeRococoXcmWeight { fn clear_origin() -> Weight { XcmGeneric::::clear_origin() } - fn descend_origin(_who: &InteriorMultiLocation) -> Weight { + fn descend_origin(_who: &InteriorLocation) -> Weight { XcmGeneric::::descend_origin() } fn report_error(_query_response_info: &QueryResponseInfo) -> Weight { XcmGeneric::::report_error() } - fn deposit_asset(assets: &MultiAssetFilter, _dest: &MultiLocation) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::deposit_asset()) + fn deposit_asset(assets: &AssetFilter, _dest: &Location) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::deposit_asset()) } - fn deposit_reserve_asset( - assets: &MultiAssetFilter, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::deposit_reserve_asset()) + fn deposit_reserve_asset(assets: &AssetFilter, _dest: &Location, _xcm: &Xcm<()>) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::deposit_reserve_asset()) } - fn exchange_asset(_give: &MultiAssetFilter, _receive: &MultiAssets, _maximal: &bool) -> Weight { + fn exchange_asset(_give: &AssetFilter, _receive: &Assets, _maximal: &bool) -> Weight { Weight::MAX } fn initiate_reserve_withdraw( - assets: &MultiAssetFilter, - _reserve: &MultiLocation, + assets: &AssetFilter, + _reserve: &Location, _xcm: &Xcm<()>, ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::initiate_reserve_withdraw()) + assets.weigh_assets(XcmFungibleWeight::::initiate_reserve_withdraw()) } - fn initiate_teleport( - assets: &MultiAssetFilter, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::initiate_teleport()) + fn initiate_teleport(assets: &AssetFilter, _dest: &Location, _xcm: &Xcm<()>) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::initiate_teleport()) } - fn report_holding(_response_info: &QueryResponseInfo, _assets: &MultiAssetFilter) -> Weight { + fn report_holding(_response_info: &QueryResponseInfo, _assets: &AssetFilter) -> Weight { XcmGeneric::::report_holding() } - fn buy_execution(_fees: &MultiAsset, _weight_limit: &WeightLimit) -> Weight { + fn buy_execution(_fees: &Asset, _weight_limit: &WeightLimit) -> Weight { XcmGeneric::::buy_execution() } fn refund_surplus() -> Weight { @@ -162,7 +150,7 @@ impl XcmWeightInfo for CoretimeRococoXcmWeight { fn clear_error() -> Weight { XcmGeneric::::clear_error() } - fn claim_asset(_assets: &MultiAssets, _ticket: &MultiLocation) -> Weight { + fn claim_asset(_assets: &Assets, _ticket: &Location) -> Weight { XcmGeneric::::claim_asset() } fn trap(_code: &u64) -> Weight { @@ -174,13 +162,13 @@ impl XcmWeightInfo for CoretimeRococoXcmWeight { fn unsubscribe_version() -> Weight { XcmGeneric::::unsubscribe_version() } - fn burn_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmGeneric::::burn_asset()) + fn burn_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmGeneric::::burn_asset()) } - fn expect_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmGeneric::::expect_asset()) + fn expect_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmGeneric::::expect_asset()) } - fn expect_origin(_origin: &Option) -> Weight { + fn expect_origin(_origin: &Option) -> Weight { XcmGeneric::::expect_origin() } fn expect_error(_error: &Option<(u32, XcmError)>) -> Weight { @@ -213,16 +201,16 @@ impl XcmWeightInfo for CoretimeRococoXcmWeight { fn export_message(_: &NetworkId, _: &Junctions, _: &Xcm<()>) -> Weight { Weight::MAX } - fn lock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn lock_asset(_: &Asset, _: &Location) -> Weight { Weight::MAX } - fn unlock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn unlock_asset(_: &Asset, _: &Location) -> Weight { Weight::MAX } - fn note_unlockable(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn note_unlockable(_: &Asset, _: &Location) -> Weight { Weight::MAX } - fn request_unlock(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn request_unlock(_: &Asset, _: &Location) -> Weight { Weight::MAX } fn set_fees_mode(_: &bool) -> Weight { @@ -234,11 +222,11 @@ impl XcmWeightInfo for CoretimeRococoXcmWeight { fn clear_topic() -> Weight { XcmGeneric::::clear_topic() } - fn alias_origin(_: &MultiLocation) -> Weight { + fn alias_origin(_: &Location) -> Weight { // XCM Executor does not currently support alias origin operations Weight::MAX } - fn unpaid_execution(_: &WeightLimit, _: &Option) -> Weight { + fn unpaid_execution(_: &WeightLimit, _: &Option) -> Weight { XcmGeneric::::unpaid_execution() } } diff --git a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/xcm_config.rs index 00bbe5b5037..927d8f0a78e 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-rococo/src/xcm_config.rs @@ -20,7 +20,7 @@ use super::{ TransactionByteFee, WeightToFee, XcmpQueue, }; use frame_support::{ - match_types, parameter_types, + parameter_types, traits::{ConstU32, Contains, Equals, Everything, Nothing}, }; use frame_system::EnsureRoot; @@ -51,18 +51,18 @@ use xcm_builder::{ use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; parameter_types! { - pub const RocRelayLocation: MultiLocation = MultiLocation::parent(); + pub const RocRelayLocation: Location = Location::parent(); pub const RelayNetwork: Option = Some(NetworkId::Rococo); pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); - pub UniversalLocation: InteriorMultiLocation = - X2(GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(ParachainInfo::parachain_id().into())); + pub UniversalLocation: InteriorLocation = + [GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(ParachainInfo::parachain_id().into())].into(); pub const MaxInstructions: u32 = 100; pub const MaxAssetsIntoHolding: u32 = 64; - pub const GovernanceLocation: MultiLocation = MultiLocation::parent(); - pub const FellowshipLocation: MultiLocation = MultiLocation::parent(); + pub const GovernanceLocation: Location = Location::parent(); + pub const FellowshipLocation: Location = Location::parent(); } -/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used +/// Type for specifying how a `Location` can be converted into an `AccountId`. This is used /// when determining ownership of accounts for asset transacting and when attempting to use XCM /// `Transact` in order to determine the dispatch Origin. pub type LocationToAccountId = ( @@ -81,7 +81,7 @@ pub type CurrencyTransactor = CurrencyAdapter< Balances, // Use this currency when it is a fungible asset matching the given location or name: IsConcrete, - // Do a simple punn to convert an `AccountId32` `MultiLocation` into a native chain + // Do a simple punn to convert an `AccountId32` `Location` into a native chain // `AccountId`: LocationToAccountId, // Our chain's `AccountId` type (we can't get away without mentioning it explicitly): @@ -114,11 +114,11 @@ pub type XcmOriginToTransactDispatchOrigin = ( XcmPassthrough, ); -match_types! { - pub type ParentOrParentsPlurality: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(Plurality { .. }) } - }; +pub struct ParentOrParentsPlurality; +impl Contains for ParentOrParentsPlurality { + fn contains(location: &Location) -> bool { + matches!(location.unpack(), (1, []) | (1, [Plurality { .. }])) + } } /// A call filter for the XCM Transact instruction. This is a temporary measure until we properly @@ -191,7 +191,7 @@ pub type Barrier = TrailingSetTopicAsId< parameter_types! { pub TreasuryAccount: AccountId = TREASURY_PALLET_ID.into_account_truncating(); - pub RelayTreasuryLocation: MultiLocation = (Parent, PalletInstance(rococo_runtime_constants::TREASURY_PALLET_ID)).into(); + pub RelayTreasuryLocation: Location = (Parent, PalletInstance(rococo_runtime_constants::TREASURY_PALLET_ID)).into(); } /// Locations that will not be charged fees in the executor, neither for execution nor delivery. @@ -240,7 +240,7 @@ impl xcm_executor::Config for XcmConfig { type Aliasers = Nothing; } -/// Converts a local signed origin into an XCM multilocation. Forms the basis for local origins +/// Converts a local signed origin into an XCM location. Forms the basis for local origins /// sending/executing XCMs. pub type LocalOriginToLocation = SignedToAccountId32; diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs index 742b3a29275..59ed8d7c603 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs @@ -306,7 +306,7 @@ pub type RootOrFellows = EitherOfDiverse< parameter_types! { /// The asset ID for the asset that we use to pay for message delivery fees. - pub FeeAssetId: AssetId = Concrete(WndRelayLocation::get()); + pub FeeAssetId: AssetId = AssetId(WndRelayLocation::get()); /// The base fee for the message delivery fees. pub const BaseDeliveryFee: u128 = CENTS.saturating_mul(3); } @@ -689,29 +689,29 @@ impl_runtime_apis! { use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsicsBenchmark; impl pallet_xcm::benchmarking::Config for Runtime { - fn reachable_dest() -> Option { + fn reachable_dest() -> Option { Some(Parent.into()) } - fn teleportable_asset_and_dest() -> Option<(MultiAsset, MultiLocation)> { + fn teleportable_asset_and_dest() -> Option<(Asset, Location)> { // Relay/native token can be teleported between AH and Relay. Some(( - MultiAsset { + Asset { fun: Fungible(EXISTENTIAL_DEPOSIT), - id: Concrete(Parent.into()) + id: AssetId(Parent.into()) }, Parent.into(), )) } - fn reserve_transferable_asset_and_dest() -> Option<(MultiAsset, MultiLocation)> { + fn reserve_transferable_asset_and_dest() -> Option<(Asset, Location)> { // Reserve transfers are disabled None } } parameter_types! { - pub ExistentialDepositMultiAsset: Option = Some(( + pub ExistentialDepositAsset: Option = Some(( WndRelayLocation::get(), ExistentialDeposit::get() ).into()); @@ -721,18 +721,18 @@ impl_runtime_apis! { type XcmConfig = xcm_config::XcmConfig; type DeliveryHelper = cumulus_primitives_utility::ToParentDeliveryHelper< xcm_config::XcmConfig, - ExistentialDepositMultiAsset, + ExistentialDepositAsset, xcm_config::PriceForParentDelivery, >; type AccountIdConverter = xcm_config::LocationToAccountId; - fn valid_destination() -> Result { + fn valid_destination() -> Result { Ok(WndRelayLocation::get()) } - fn worst_case_holding(_depositable_count: u32) -> MultiAssets { + fn worst_case_holding(_depositable_count: u32) -> Assets { // just concrete assets according to relay chain. - let assets: Vec = vec![ - MultiAsset { - id: Concrete(WndRelayLocation::get()), + let assets: Vec = vec![ + Asset { + id: AssetId(WndRelayLocation::get()), fun: Fungible(1_000_000 * UNITS), } ]; @@ -741,12 +741,12 @@ impl_runtime_apis! { } parameter_types! { - pub const TrustedTeleporter: Option<(MultiLocation, MultiAsset)> = Some(( + pub const TrustedTeleporter: Option<(Location, Asset)> = Some(( WndRelayLocation::get(), - MultiAsset { fun: Fungible(UNITS), id: Concrete(WndRelayLocation::get()) }, + Asset { fun: Fungible(UNITS), id: AssetId(WndRelayLocation::get()) }, )); pub const CheckedAccount: Option<(AccountId, xcm_builder::MintLocation)> = None; - pub const TrustedReserve: Option<(MultiLocation, MultiAsset)> = None; + pub const TrustedReserve: Option<(Location, Asset)> = None; } impl pallet_xcm_benchmarks::fungible::Config for Runtime { @@ -756,9 +756,9 @@ impl_runtime_apis! { type TrustedTeleporter = TrustedTeleporter; type TrustedReserve = TrustedReserve; - fn get_multi_asset() -> MultiAsset { - MultiAsset { - id: Concrete(WndRelayLocation::get()), + fn get_asset() -> Asset { + Asset { + id: AssetId(WndRelayLocation::get()), fun: Fungible(UNITS), } } @@ -772,39 +772,39 @@ impl_runtime_apis! { (0u64, Response::Version(Default::default())) } - fn worst_case_asset_exchange() -> Result<(MultiAssets, MultiAssets), BenchmarkError> { + fn worst_case_asset_exchange() -> Result<(Assets, Assets), BenchmarkError> { Err(BenchmarkError::Skip) } - fn universal_alias() -> Result<(MultiLocation, Junction), BenchmarkError> { + fn universal_alias() -> Result<(Location, Junction), BenchmarkError> { Err(BenchmarkError::Skip) } - fn transact_origin_and_runtime_call() -> Result<(MultiLocation, RuntimeCall), BenchmarkError> { + fn transact_origin_and_runtime_call() -> Result<(Location, RuntimeCall), BenchmarkError> { Ok((WndRelayLocation::get(), frame_system::Call::remark_with_event { remark: vec![] }.into())) } - fn subscribe_origin() -> Result { + fn subscribe_origin() -> Result { Ok(WndRelayLocation::get()) } - fn claimable_asset() -> Result<(MultiLocation, MultiLocation, MultiAssets), BenchmarkError> { + fn claimable_asset() -> Result<(Location, Location, Assets), BenchmarkError> { let origin = WndRelayLocation::get(); - let assets: MultiAssets = (Concrete(WndRelayLocation::get()), 1_000 * UNITS).into(); - let ticket = MultiLocation { parents: 0, interior: Here }; + let assets: Assets = (AssetId(WndRelayLocation::get()), 1_000 * UNITS).into(); + let ticket = Location { parents: 0, interior: Here }; Ok((origin, ticket, assets)) } - fn unlockable_asset() -> Result<(MultiLocation, MultiLocation, MultiAsset), BenchmarkError> { + fn unlockable_asset() -> Result<(Location, Location, Asset), BenchmarkError> { Err(BenchmarkError::Skip) } fn export_message_origin_and_destination( - ) -> Result<(MultiLocation, NetworkId, InteriorMultiLocation), BenchmarkError> { + ) -> Result<(Location, NetworkId, InteriorLocation), BenchmarkError> { Err(BenchmarkError::Skip) } - fn alias_origin() -> Result<(MultiLocation, MultiLocation), BenchmarkError> { + fn alias_origin() -> Result<(Location, Location), BenchmarkError> { Err(BenchmarkError::Skip) } } diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/mod.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/mod.rs index 3dc7b82efc2..a14da7c7a38 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/mod.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/weights/xcm/mod.rs @@ -23,14 +23,14 @@ use pallet_xcm_benchmarks_generic::WeightInfo as XcmGeneric; use sp_std::prelude::*; use xcm::{latest::prelude::*, DoubleEncoded}; -trait WeighMultiAssets { - fn weigh_multi_assets(&self, weight: Weight) -> Weight; +trait WeighAssets { + fn weigh_assets(&self, weight: Weight) -> Weight; } const MAX_ASSETS: u64 = 100; -impl WeighMultiAssets for MultiAssetFilter { - fn weigh_multi_assets(&self, weight: Weight) -> Weight { +impl WeighAssets for AssetFilter { + fn weigh_assets(&self, weight: Weight) -> Weight { match self { Self::Definite(assets) => weight.saturating_mul(assets.inner().iter().count() as u64), Self::Wild(asset) => match asset { @@ -49,40 +49,36 @@ impl WeighMultiAssets for MultiAssetFilter { } } -impl WeighMultiAssets for MultiAssets { - fn weigh_multi_assets(&self, weight: Weight) -> Weight { +impl WeighAssets for Assets { + fn weigh_assets(&self, weight: Weight) -> Weight { weight.saturating_mul(self.inner().iter().count() as u64) } } pub struct CoretimeWestendXcmWeight(core::marker::PhantomData); impl XcmWeightInfo for CoretimeWestendXcmWeight { - fn withdraw_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::withdraw_asset()) + fn withdraw_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::withdraw_asset()) } - fn reserve_asset_deposited(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::reserve_asset_deposited()) + fn reserve_asset_deposited(assets: &Assets) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::reserve_asset_deposited()) } - fn receive_teleported_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::receive_teleported_asset()) + fn receive_teleported_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::receive_teleported_asset()) } fn query_response( _query_id: &u64, _response: &Response, _max_weight: &Weight, - _querier: &Option, + _querier: &Option, ) -> Weight { XcmGeneric::::query_response() } - fn transfer_asset(assets: &MultiAssets, _dest: &MultiLocation) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::transfer_asset()) + fn transfer_asset(assets: &Assets, _dest: &Location) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::transfer_asset()) } - fn transfer_reserve_asset( - assets: &MultiAssets, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::transfer_reserve_asset()) + fn transfer_reserve_asset(assets: &Assets, _dest: &Location, _xcm: &Xcm<()>) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::transfer_reserve_asset()) } fn transact( _origin_type: &OriginKind, @@ -110,44 +106,36 @@ impl XcmWeightInfo for CoretimeWestendXcmWeight { fn clear_origin() -> Weight { XcmGeneric::::clear_origin() } - fn descend_origin(_who: &InteriorMultiLocation) -> Weight { + fn descend_origin(_who: &InteriorLocation) -> Weight { XcmGeneric::::descend_origin() } fn report_error(_query_response_info: &QueryResponseInfo) -> Weight { XcmGeneric::::report_error() } - fn deposit_asset(assets: &MultiAssetFilter, _dest: &MultiLocation) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::deposit_asset()) + fn deposit_asset(assets: &AssetFilter, _dest: &Location) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::deposit_asset()) } - fn deposit_reserve_asset( - assets: &MultiAssetFilter, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::deposit_reserve_asset()) + fn deposit_reserve_asset(assets: &AssetFilter, _dest: &Location, _xcm: &Xcm<()>) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::deposit_reserve_asset()) } - fn exchange_asset(_give: &MultiAssetFilter, _receive: &MultiAssets, _maximal: &bool) -> Weight { + fn exchange_asset(_give: &AssetFilter, _receive: &Assets, _maximal: &bool) -> Weight { Weight::MAX } fn initiate_reserve_withdraw( - assets: &MultiAssetFilter, - _reserve: &MultiLocation, + assets: &AssetFilter, + _reserve: &Location, _xcm: &Xcm<()>, ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::initiate_reserve_withdraw()) + assets.weigh_assets(XcmFungibleWeight::::initiate_reserve_withdraw()) } - fn initiate_teleport( - assets: &MultiAssetFilter, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::initiate_teleport()) + fn initiate_teleport(assets: &AssetFilter, _dest: &Location, _xcm: &Xcm<()>) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::initiate_teleport()) } - fn report_holding(_response_info: &QueryResponseInfo, _assets: &MultiAssetFilter) -> Weight { + fn report_holding(_response_info: &QueryResponseInfo, _assets: &AssetFilter) -> Weight { XcmGeneric::::report_holding() } - fn buy_execution(_fees: &MultiAsset, _weight_limit: &WeightLimit) -> Weight { + fn buy_execution(_fees: &Asset, _weight_limit: &WeightLimit) -> Weight { XcmGeneric::::buy_execution() } fn refund_surplus() -> Weight { @@ -162,7 +150,7 @@ impl XcmWeightInfo for CoretimeWestendXcmWeight { fn clear_error() -> Weight { XcmGeneric::::clear_error() } - fn claim_asset(_assets: &MultiAssets, _ticket: &MultiLocation) -> Weight { + fn claim_asset(_assets: &Assets, _ticket: &Location) -> Weight { XcmGeneric::::claim_asset() } fn trap(_code: &u64) -> Weight { @@ -174,13 +162,13 @@ impl XcmWeightInfo for CoretimeWestendXcmWeight { fn unsubscribe_version() -> Weight { XcmGeneric::::unsubscribe_version() } - fn burn_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmGeneric::::burn_asset()) + fn burn_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmGeneric::::burn_asset()) } - fn expect_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmGeneric::::expect_asset()) + fn expect_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmGeneric::::expect_asset()) } - fn expect_origin(_origin: &Option) -> Weight { + fn expect_origin(_origin: &Option) -> Weight { XcmGeneric::::expect_origin() } fn expect_error(_error: &Option<(u32, XcmError)>) -> Weight { @@ -213,16 +201,16 @@ impl XcmWeightInfo for CoretimeWestendXcmWeight { fn export_message(_: &NetworkId, _: &Junctions, _: &Xcm<()>) -> Weight { Weight::MAX } - fn lock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn lock_asset(_: &Asset, _: &Location) -> Weight { Weight::MAX } - fn unlock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn unlock_asset(_: &Asset, _: &Location) -> Weight { Weight::MAX } - fn note_unlockable(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn note_unlockable(_: &Asset, _: &Location) -> Weight { Weight::MAX } - fn request_unlock(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn request_unlock(_: &Asset, _: &Location) -> Weight { Weight::MAX } fn set_fees_mode(_: &bool) -> Weight { @@ -234,11 +222,11 @@ impl XcmWeightInfo for CoretimeWestendXcmWeight { fn clear_topic() -> Weight { XcmGeneric::::clear_topic() } - fn alias_origin(_: &MultiLocation) -> Weight { + fn alias_origin(_: &Location) -> Weight { // XCM Executor does not currently support alias origin operations Weight::MAX } - fn unpaid_execution(_: &WeightLimit, _: &Option) -> Weight { + fn unpaid_execution(_: &WeightLimit, _: &Option) -> Weight { XcmGeneric::::unpaid_execution() } } diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/xcm_config.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/xcm_config.rs index 59d76d10d90..f468f29540a 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/xcm_config.rs @@ -20,7 +20,7 @@ use super::{ TransactionByteFee, WeightToFee, XcmpQueue, }; use frame_support::{ - match_types, parameter_types, + parameter_types, traits::{ConstU32, Contains, Equals, Everything, Nothing}, }; use frame_system::EnsureRoot; @@ -51,18 +51,18 @@ use xcm_builder::{ use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; parameter_types! { - pub const WndRelayLocation: MultiLocation = MultiLocation::parent(); + pub const WndRelayLocation: Location = Location::parent(); pub const RelayNetwork: Option = Some(NetworkId::Westend); pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); - pub UniversalLocation: InteriorMultiLocation = - X2(GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(ParachainInfo::parachain_id().into())); + pub UniversalLocation: InteriorLocation = + [GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(ParachainInfo::parachain_id().into())].into(); pub const MaxInstructions: u32 = 100; pub const MaxAssetsIntoHolding: u32 = 64; - pub FellowshipLocation: MultiLocation = MultiLocation::new(1, Parachain(1001)); - pub const GovernanceLocation: MultiLocation = MultiLocation::parent(); + pub FellowshipLocation: Location = Location::new(1, Parachain(1001)); + pub const GovernanceLocation: Location = Location::parent(); } -/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used +/// Type for specifying how a `Location` can be converted into an `AccountId`. This is used /// when determining ownership of accounts for asset transacting and when attempting to use XCM /// `Transact` in order to determine the dispatch Origin. pub type LocationToAccountId = ( @@ -81,7 +81,7 @@ pub type CurrencyTransactor = CurrencyAdapter< Balances, // Use this currency when it is a fungible asset matching the given location or name: IsConcrete, - // Do a simple punn to convert an `AccountId32` `MultiLocation` into a native chain + // Do a simple punn to convert an `AccountId32` `Location` into a native chain // `AccountId`: LocationToAccountId, // Our chain's `AccountId` type (we can't get away without mentioning it explicitly): @@ -114,14 +114,18 @@ pub type XcmOriginToTransactDispatchOrigin = ( XcmPassthrough, ); -match_types! { - pub type ParentOrParentsPlurality: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(Plurality { .. }) } - }; - pub type FellowsPlurality: impl Contains = { - MultiLocation { parents: 1, interior: X2(Parachain(1001), Plurality { id: BodyId::Technical, ..}) } - }; +pub struct ParentOrParentsPlurality; +impl Contains for ParentOrParentsPlurality { + fn contains(location: &Location) -> bool { + matches!(location.unpack(), (1, []) | (1, [Plurality { .. }])) + } +} + +pub struct FellowsPlurality; +impl Contains for FellowsPlurality { + fn contains(location: &Location) -> bool { + matches!(location.unpack(), (1, [Parachain(1001), Plurality { id: BodyId::Technical, .. }])) + } } /// A call filter for the XCM Transact instruction. This is a temporary measure until we properly @@ -192,7 +196,7 @@ pub type Barrier = TrailingSetTopicAsId< parameter_types! { pub TreasuryAccount: AccountId = TREASURY_PALLET_ID.into_account_truncating(); - pub RelayTreasuryLocation: MultiLocation = (Parent, PalletInstance(westend_runtime_constants::TREASURY_PALLET_ID)).into(); + pub RelayTreasuryLocation: Location = (Parent, PalletInstance(westend_runtime_constants::TREASURY_PALLET_ID)).into(); } /// Locations that will not be charged fees in the executor, neither for execution nor delivery. @@ -241,7 +245,7 @@ impl xcm_executor::Config for XcmConfig { type Aliasers = Nothing; } -/// Converts a local signed origin into an XCM multilocation. Forms the basis for local origins +/// Converts a local signed origin into an XCM location. Forms the basis for local origins /// sending/executing XCMs. pub type LocalOriginToLocation = SignedToAccountId32; diff --git a/cumulus/parachains/runtimes/glutton/glutton-westend/src/xcm_config.rs b/cumulus/parachains/runtimes/glutton/glutton-westend/src/xcm_config.rs index 5ebb0ade123..1c37241563e 100644 --- a/cumulus/parachains/runtimes/glutton/glutton-westend/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/glutton/glutton-westend/src/xcm_config.rs @@ -18,8 +18,8 @@ use super::{ RuntimeOrigin, }; use frame_support::{ - match_types, parameter_types, - traits::{Everything, Nothing}, + parameter_types, + traits::{Contains, Everything, Nothing}, weights::Weight, }; use xcm::latest::prelude::*; @@ -29,9 +29,9 @@ use xcm_builder::{ }; parameter_types! { - pub const WestendLocation: MultiLocation = MultiLocation::parent(); + pub const WestendLocation: Location = Location::parent(); pub const WestendNetwork: Option = Some(NetworkId::Westend); - pub UniversalLocation: InteriorMultiLocation = X1(Parachain(ParachainInfo::parachain_id().into())); + pub UniversalLocation: InteriorLocation = [Parachain(ParachainInfo::parachain_id().into())].into(); } /// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, @@ -47,8 +47,11 @@ pub type XcmOriginToTransactDispatchOrigin = ( ParentAsSuperuser, ); -match_types! { - pub type JustTheParent: impl Contains = { MultiLocation { parents:1, interior: Here } }; +pub struct JustTheParent; +impl Contains for JustTheParent { + fn contains(location: &Location) -> bool { + matches!(location.unpack(), (1, [])) + } } parameter_types! { diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs b/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs index 7805e0ad982..f5398829c73 100644 --- a/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs @@ -682,22 +682,22 @@ impl_runtime_apis! { use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsiscsBenchmark; impl pallet_xcm::benchmarking::Config for Runtime { - fn reachable_dest() -> Option { + fn reachable_dest() -> Option { Some(Parent.into()) } - fn teleportable_asset_and_dest() -> Option<(MultiAsset, MultiLocation)> { + fn teleportable_asset_and_dest() -> Option<(Asset, Location)> { // Relay/native token can be teleported between People and Relay. Some(( - MultiAsset { + Asset { fun: Fungible(EXISTENTIAL_DEPOSIT), - id: Concrete(Parent.into()) + id: AssetId(Parent.into()) }, Parent.into(), )) } - fn reserve_transferable_asset_and_dest() -> Option<(MultiAsset, MultiLocation)> { + fn reserve_transferable_asset_and_dest() -> Option<(Asset, Location)> { None } } @@ -706,7 +706,7 @@ impl_runtime_apis! { use xcm_config::{PriceForParentDelivery, RelayLocation}; parameter_types! { - pub ExistentialDepositMultiAsset: Option = Some(( + pub ExistentialDepositAsset: Option = Some(( RelayLocation::get(), ExistentialDeposit::get() ).into()); @@ -717,17 +717,17 @@ impl_runtime_apis! { type AccountIdConverter = xcm_config::LocationToAccountId; type DeliveryHelper = cumulus_primitives_utility::ToParentDeliveryHelper< XcmConfig, - ExistentialDepositMultiAsset, + ExistentialDepositAsset, PriceForParentDelivery, >; - fn valid_destination() -> Result { + fn valid_destination() -> Result { Ok(RelayLocation::get()) } - fn worst_case_holding(_depositable_count: u32) -> MultiAssets { + fn worst_case_holding(_depositable_count: u32) -> Assets { // just concrete assets according to relay chain. - let assets: Vec = vec![ - MultiAsset { - id: Concrete(RelayLocation::get()), + let assets: Vec = vec![ + Asset { + id: AssetId(RelayLocation::get()), fun: Fungible(1_000_000 * UNITS), } ]; @@ -736,12 +736,12 @@ impl_runtime_apis! { } parameter_types! { - pub const TrustedTeleporter: Option<(MultiLocation, MultiAsset)> = Some(( + pub const TrustedTeleporter: Option<(Location, Asset)> = Some(( RelayLocation::get(), - MultiAsset { fun: Fungible(UNITS), id: Concrete(RelayLocation::get()) }, + Asset { fun: Fungible(UNITS), id: AssetId(RelayLocation::get()) }, )); pub const CheckedAccount: Option<(AccountId, xcm_builder::MintLocation)> = None; - pub const TrustedReserve: Option<(MultiLocation, MultiAsset)> = None; + pub const TrustedReserve: Option<(Location, Asset)> = None; } impl pallet_xcm_benchmarks::fungible::Config for Runtime { @@ -751,9 +751,9 @@ impl_runtime_apis! { type TrustedTeleporter = TrustedTeleporter; type TrustedReserve = TrustedReserve; - fn get_multi_asset() -> MultiAsset { - MultiAsset { - id: Concrete(RelayLocation::get()), + fn get_asset() -> Asset { + Asset { + id: AssetId(RelayLocation::get()), fun: Fungible(UNITS), } } @@ -767,39 +767,39 @@ impl_runtime_apis! { (0u64, Response::Version(Default::default())) } - fn worst_case_asset_exchange() -> Result<(MultiAssets, MultiAssets), BenchmarkError> { + fn worst_case_asset_exchange() -> Result<(Assets, Assets), BenchmarkError> { Err(BenchmarkError::Skip) } - fn universal_alias() -> Result<(MultiLocation, Junction), BenchmarkError> { + fn universal_alias() -> Result<(Location, Junction), BenchmarkError> { Err(BenchmarkError::Skip) } - fn transact_origin_and_runtime_call() -> Result<(MultiLocation, RuntimeCall), BenchmarkError> { + fn transact_origin_and_runtime_call() -> Result<(Location, RuntimeCall), BenchmarkError> { Ok((RelayLocation::get(), frame_system::Call::remark_with_event { remark: vec![] }.into())) } - fn subscribe_origin() -> Result { + fn subscribe_origin() -> Result { Ok(RelayLocation::get()) } - fn claimable_asset() -> Result<(MultiLocation, MultiLocation, MultiAssets), BenchmarkError> { + fn claimable_asset() -> Result<(Location, Location, Assets), BenchmarkError> { let origin = RelayLocation::get(); - let assets: MultiAssets = (Concrete(RelayLocation::get()), 1_000 * UNITS).into(); - let ticket = MultiLocation { parents: 0, interior: Here }; + let assets: Assets = (AssetId(RelayLocation::get()), 1_000 * UNITS).into(); + let ticket = Location::new(0, []); Ok((origin, ticket, assets)) } - fn unlockable_asset() -> Result<(MultiLocation, MultiLocation, MultiAsset), BenchmarkError> { + fn unlockable_asset() -> Result<(Location, Location, Asset), BenchmarkError> { Err(BenchmarkError::Skip) } fn export_message_origin_and_destination( - ) -> Result<(MultiLocation, NetworkId, InteriorMultiLocation), BenchmarkError> { + ) -> Result<(Location, NetworkId, InteriorLocation), BenchmarkError> { Err(BenchmarkError::Skip) } - fn alias_origin() -> Result<(MultiLocation, MultiLocation), BenchmarkError> { + fn alias_origin() -> Result<(Location, Location), BenchmarkError> { Err(BenchmarkError::Skip) } } diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/weights/xcm/mod.rs b/cumulus/parachains/runtimes/people/people-rococo/src/weights/xcm/mod.rs index c90a96c7f82..4afd65bdcfe 100644 --- a/cumulus/parachains/runtimes/people/people-rococo/src/weights/xcm/mod.rs +++ b/cumulus/parachains/runtimes/people/people-rococo/src/weights/xcm/mod.rs @@ -23,14 +23,14 @@ use pallet_xcm_benchmarks_generic::WeightInfo as XcmGeneric; use sp_std::prelude::*; use xcm::{latest::prelude::*, DoubleEncoded}; -trait WeighMultiAssets { - fn weigh_multi_assets(&self, weight: Weight) -> Weight; +trait WeighAssets { + fn weigh_assets(&self, weight: Weight) -> Weight; } const MAX_ASSETS: u64 = 100; -impl WeighMultiAssets for MultiAssetFilter { - fn weigh_multi_assets(&self, weight: Weight) -> Weight { +impl WeighAssets for AssetFilter { + fn weigh_assets(&self, weight: Weight) -> Weight { match self { Self::Definite(assets) => weight.saturating_mul(assets.inner().iter().count() as u64), Self::Wild(asset) => match asset { @@ -49,42 +49,38 @@ impl WeighMultiAssets for MultiAssetFilter { } } -impl WeighMultiAssets for MultiAssets { - fn weigh_multi_assets(&self, weight: Weight) -> Weight { +impl WeighAssets for Assets { + fn weigh_assets(&self, weight: Weight) -> Weight { weight.saturating_mul(self.inner().iter().count() as u64) } } pub struct PeopleRococoXcmWeight(core::marker::PhantomData); impl XcmWeightInfo for PeopleRococoXcmWeight { - fn withdraw_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::withdraw_asset()) + fn withdraw_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::withdraw_asset()) } // Currently there is no trusted reserve - fn reserve_asset_deposited(_assets: &MultiAssets) -> Weight { + fn reserve_asset_deposited(_assets: &Assets) -> Weight { // TODO: hardcoded - fix https://github.com/paritytech/cumulus/issues/1974 Weight::from_parts(1_000_000_000_u64, 0) } - fn receive_teleported_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::receive_teleported_asset()) + fn receive_teleported_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::receive_teleported_asset()) } fn query_response( _query_id: &u64, _response: &Response, _max_weight: &Weight, - _querier: &Option, + _querier: &Option, ) -> Weight { XcmGeneric::::query_response() } - fn transfer_asset(assets: &MultiAssets, _dest: &MultiLocation) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::transfer_asset()) + fn transfer_asset(assets: &Assets, _dest: &Location) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::transfer_asset()) } - fn transfer_reserve_asset( - assets: &MultiAssets, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::transfer_reserve_asset()) + fn transfer_reserve_asset(assets: &Assets, _dest: &Location, _xcm: &Xcm<()>) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::transfer_reserve_asset()) } fn transact( _origin_type: &OriginKind, @@ -112,47 +108,39 @@ impl XcmWeightInfo for PeopleRococoXcmWeight { fn clear_origin() -> Weight { XcmGeneric::::clear_origin() } - fn descend_origin(_who: &InteriorMultiLocation) -> Weight { + fn descend_origin(_who: &InteriorLocation) -> Weight { XcmGeneric::::descend_origin() } fn report_error(_query_response_info: &QueryResponseInfo) -> Weight { XcmGeneric::::report_error() } - fn deposit_asset(assets: &MultiAssetFilter, _dest: &MultiLocation) -> Weight { + fn deposit_asset(assets: &AssetFilter, _dest: &Location) -> Weight { // Hardcoded till the XCM pallet is fixed let hardcoded_weight = Weight::from_parts(1_000_000_000_u64, 0); - let weight = assets.weigh_multi_assets(XcmFungibleWeight::::deposit_asset()); + let weight = assets.weigh_assets(XcmFungibleWeight::::deposit_asset()); hardcoded_weight.min(weight) } - fn deposit_reserve_asset( - assets: &MultiAssetFilter, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::deposit_reserve_asset()) + fn deposit_reserve_asset(assets: &AssetFilter, _dest: &Location, _xcm: &Xcm<()>) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::deposit_reserve_asset()) } - fn exchange_asset(_give: &MultiAssetFilter, _receive: &MultiAssets, _maximal: &bool) -> Weight { + fn exchange_asset(_give: &AssetFilter, _receive: &Assets, _maximal: &bool) -> Weight { Weight::MAX } fn initiate_reserve_withdraw( - assets: &MultiAssetFilter, - _reserve: &MultiLocation, + assets: &AssetFilter, + _reserve: &Location, _xcm: &Xcm<()>, ) -> Weight { - assets.weigh_multi_assets(XcmGeneric::::initiate_reserve_withdraw()) + assets.weigh_assets(XcmGeneric::::initiate_reserve_withdraw()) } - fn initiate_teleport( - assets: &MultiAssetFilter, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::initiate_teleport()) + fn initiate_teleport(assets: &AssetFilter, _dest: &Location, _xcm: &Xcm<()>) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::initiate_teleport()) } - fn report_holding(_response_info: &QueryResponseInfo, _assets: &MultiAssetFilter) -> Weight { + fn report_holding(_response_info: &QueryResponseInfo, _assets: &AssetFilter) -> Weight { XcmGeneric::::report_holding() } - fn buy_execution(_fees: &MultiAsset, _weight_limit: &WeightLimit) -> Weight { + fn buy_execution(_fees: &Asset, _weight_limit: &WeightLimit) -> Weight { XcmGeneric::::buy_execution() } fn refund_surplus() -> Weight { @@ -167,7 +155,7 @@ impl XcmWeightInfo for PeopleRococoXcmWeight { fn clear_error() -> Weight { XcmGeneric::::clear_error() } - fn claim_asset(_assets: &MultiAssets, _ticket: &MultiLocation) -> Weight { + fn claim_asset(_assets: &Assets, _ticket: &Location) -> Weight { XcmGeneric::::claim_asset() } fn trap(_code: &u64) -> Weight { @@ -179,13 +167,13 @@ impl XcmWeightInfo for PeopleRococoXcmWeight { fn unsubscribe_version() -> Weight { XcmGeneric::::unsubscribe_version() } - fn burn_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmGeneric::::burn_asset()) + fn burn_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmGeneric::::burn_asset()) } - fn expect_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmGeneric::::expect_asset()) + fn expect_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmGeneric::::expect_asset()) } - fn expect_origin(_origin: &Option) -> Weight { + fn expect_origin(_origin: &Option) -> Weight { XcmGeneric::::expect_origin() } fn expect_error(_error: &Option<(u32, XcmError)>) -> Weight { @@ -218,16 +206,16 @@ impl XcmWeightInfo for PeopleRococoXcmWeight { fn export_message(_: &NetworkId, _: &Junctions, _: &Xcm<()>) -> Weight { Weight::MAX } - fn lock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn lock_asset(_: &Asset, _: &Location) -> Weight { Weight::MAX } - fn unlock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn unlock_asset(_: &Asset, _: &Location) -> Weight { Weight::MAX } - fn note_unlockable(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn note_unlockable(_: &Asset, _: &Location) -> Weight { Weight::MAX } - fn request_unlock(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn request_unlock(_: &Asset, _: &Location) -> Weight { Weight::MAX } fn set_fees_mode(_: &bool) -> Weight { @@ -239,11 +227,11 @@ impl XcmWeightInfo for PeopleRococoXcmWeight { fn clear_topic() -> Weight { XcmGeneric::::clear_topic() } - fn alias_origin(_: &MultiLocation) -> Weight { + fn alias_origin(_: &Location) -> Weight { // XCM Executor does not currently support alias origin operations Weight::MAX } - fn unpaid_execution(_: &WeightLimit, _: &Option) -> Weight { + fn unpaid_execution(_: &WeightLimit, _: &Option) -> Weight { XcmGeneric::::unpaid_execution() } } diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/people/people-rococo/src/xcm_config.rs index 7a2f28aa813..7ef6cb2fac9 100644 --- a/cumulus/parachains/runtimes/people/people-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/people/people-rococo/src/xcm_config.rs @@ -19,7 +19,7 @@ use super::{ }; use crate::{TransactionByteFee, CENTS}; use frame_support::{ - match_types, parameter_types, + parameter_types, traits::{ConstU32, Contains, Equals, Everything, Nothing}, }; use frame_system::EnsureRoot; @@ -49,22 +49,22 @@ use xcm_builder::{ use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; parameter_types! { - pub const RootLocation: MultiLocation = MultiLocation::here(); - pub const RelayLocation: MultiLocation = MultiLocation::parent(); + pub const RootLocation: Location = Location::here(); + pub const RelayLocation: Location = Location::parent(); pub const RelayNetwork: Option = Some(NetworkId::Rococo); pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); - pub UniversalLocation: InteriorMultiLocation = - X2(GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(ParachainInfo::parachain_id().into())); + pub UniversalLocation: InteriorLocation = + [GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(ParachainInfo::parachain_id().into())].into(); pub const MaxInstructions: u32 = 100; pub const MaxAssetsIntoHolding: u32 = 64; - pub const GovernanceLocation: MultiLocation = MultiLocation::parent(); - pub const FellowshipLocation: MultiLocation = MultiLocation::parent(); + pub const GovernanceLocation: Location = Location::parent(); + pub const FellowshipLocation: Location = Location::parent(); /// The asset ID for the asset that we use to pay for message delivery fees. Just ROC. - pub FeeAssetId: AssetId = Concrete(RelayLocation::get()); + pub FeeAssetId: AssetId = AssetId(RelayLocation::get()); /// The base fee for the message delivery fees. pub const BaseDeliveryFee: u128 = CENTS.saturating_mul(3); pub TreasuryAccount: AccountId = TREASURY_PALLET_ID.into_account_truncating(); - pub RelayTreasuryLocation: MultiLocation = + pub RelayTreasuryLocation: Location = (Parent, PalletInstance(rococo_runtime_constants::TREASURY_PALLET_ID)).into(); } @@ -82,7 +82,7 @@ pub type PriceForSiblingParachainDelivery = polkadot_runtime_common::xcm_sender: XcmpQueue, >; -/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used +/// Type for specifying how a `Location` can be converted into an `AccountId`. This is used /// when determining ownership of accounts for asset transacting and when attempting to use XCM /// `Transact` in order to determine the dispatch Origin. pub type LocationToAccountId = ( @@ -103,7 +103,7 @@ pub type CurrencyTransactor = CurrencyAdapter< Balances, // Use this currency when it is a fungible asset matching the given location or name: IsConcrete, - // Do a simple punn to convert an `AccountId32` `MultiLocation` into a native chain + // Do a simple punn to convert an `AccountId32` `Location` into a native chain // `AccountId`: LocationToAccountId, // Our chain's `AccountId` type (we can't get away without mentioning it explicitly): @@ -136,18 +136,25 @@ pub type XcmOriginToTransactDispatchOrigin = ( XcmPassthrough, ); -match_types! { - pub type LocalPlurality: impl Contains = { - MultiLocation { parents: 0, interior: X1(Plurality { .. }) } - }; - pub type ParentOrParentsPlurality: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(Plurality { .. }) } - }; - pub type ParentOrSiblings: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(Parachain(_)) } - }; +pub struct LocalPlurality; +impl Contains for LocalPlurality { + fn contains(location: &Location) -> bool { + matches!(location.unpack(), (0, [Plurality { .. }])) + } +} + +pub struct ParentOrParentsPlurality; +impl Contains for ParentOrParentsPlurality { + fn contains(location: &Location) -> bool { + matches!(location.unpack(), (1, []) | (1, [Plurality { .. }])) + } +} + +pub struct ParentOrSiblings; +impl Contains for ParentOrSiblings { + fn contains(location: &Location) -> bool { + matches!(location.unpack(), (1, []) | (1, [Parachain(_)])) + } } /// A call filter for the XCM Transact instruction. This is a temporary measure until we properly @@ -268,7 +275,7 @@ impl xcm_executor::Config for XcmConfig { type Aliasers = Nothing; } -/// Converts a local signed origin into an XCM multilocation. Forms the basis for local origins +/// Converts a local signed origin into an XCM location. Forms the basis for local origins /// sending/executing XCMs. pub type LocalOriginToLocation = SignedToAccountId32; diff --git a/cumulus/parachains/runtimes/people/people-westend/src/lib.rs b/cumulus/parachains/runtimes/people/people-westend/src/lib.rs index 8ea29c8aa21..33f0d511705 100644 --- a/cumulus/parachains/runtimes/people/people-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/people/people-westend/src/lib.rs @@ -682,22 +682,22 @@ impl_runtime_apis! { use pallet_xcm::benchmarking::Pallet as PalletXcmExtrinsiscsBenchmark; impl pallet_xcm::benchmarking::Config for Runtime { - fn reachable_dest() -> Option { + fn reachable_dest() -> Option { Some(Parent.into()) } - fn teleportable_asset_and_dest() -> Option<(MultiAsset, MultiLocation)> { + fn teleportable_asset_and_dest() -> Option<(Asset, Location)> { // Relay/native token can be teleported between People and Relay. Some(( - MultiAsset { + Asset { fun: Fungible(EXISTENTIAL_DEPOSIT), - id: Concrete(Parent.into()) + id: AssetId(Parent.into()) }, Parent.into(), )) } - fn reserve_transferable_asset_and_dest() -> Option<(MultiAsset, MultiLocation)> { + fn reserve_transferable_asset_and_dest() -> Option<(Asset, Location)> { None } } @@ -706,7 +706,7 @@ impl_runtime_apis! { use xcm_config::{PriceForParentDelivery, RelayLocation}; parameter_types! { - pub ExistentialDepositMultiAsset: Option = Some(( + pub ExistentialDepositAsset: Option = Some(( RelayLocation::get(), ExistentialDeposit::get() ).into()); @@ -717,17 +717,17 @@ impl_runtime_apis! { type AccountIdConverter = xcm_config::LocationToAccountId; type DeliveryHelper = cumulus_primitives_utility::ToParentDeliveryHelper< XcmConfig, - ExistentialDepositMultiAsset, + ExistentialDepositAsset, PriceForParentDelivery, >; - fn valid_destination() -> Result { + fn valid_destination() -> Result { Ok(RelayLocation::get()) } - fn worst_case_holding(_depositable_count: u32) -> MultiAssets { + fn worst_case_holding(_depositable_count: u32) -> Assets { // just concrete assets according to relay chain. - let assets: Vec = vec![ - MultiAsset { - id: Concrete(RelayLocation::get()), + let assets: Vec = vec![ + Asset { + id: AssetId(RelayLocation::get()), fun: Fungible(1_000_000 * UNITS), } ]; @@ -736,12 +736,12 @@ impl_runtime_apis! { } parameter_types! { - pub const TrustedTeleporter: Option<(MultiLocation, MultiAsset)> = Some(( + pub const TrustedTeleporter: Option<(Location, Asset)> = Some(( RelayLocation::get(), - MultiAsset { fun: Fungible(UNITS), id: Concrete(RelayLocation::get()) }, + Asset { fun: Fungible(UNITS), id: AssetId(RelayLocation::get()) }, )); pub const CheckedAccount: Option<(AccountId, xcm_builder::MintLocation)> = None; - pub const TrustedReserve: Option<(MultiLocation, MultiAsset)> = None; + pub const TrustedReserve: Option<(Location, Asset)> = None; } impl pallet_xcm_benchmarks::fungible::Config for Runtime { @@ -751,9 +751,9 @@ impl_runtime_apis! { type TrustedTeleporter = TrustedTeleporter; type TrustedReserve = TrustedReserve; - fn get_multi_asset() -> MultiAsset { - MultiAsset { - id: Concrete(RelayLocation::get()), + fn get_asset() -> Asset { + Asset { + id: AssetId(RelayLocation::get()), fun: Fungible(UNITS), } } @@ -767,39 +767,39 @@ impl_runtime_apis! { (0u64, Response::Version(Default::default())) } - fn worst_case_asset_exchange() -> Result<(MultiAssets, MultiAssets), BenchmarkError> { + fn worst_case_asset_exchange() -> Result<(Assets, Assets), BenchmarkError> { Err(BenchmarkError::Skip) } - fn universal_alias() -> Result<(MultiLocation, Junction), BenchmarkError> { + fn universal_alias() -> Result<(Location, Junction), BenchmarkError> { Err(BenchmarkError::Skip) } - fn transact_origin_and_runtime_call() -> Result<(MultiLocation, RuntimeCall), BenchmarkError> { + fn transact_origin_and_runtime_call() -> Result<(Location, RuntimeCall), BenchmarkError> { Ok((RelayLocation::get(), frame_system::Call::remark_with_event { remark: vec![] }.into())) } - fn subscribe_origin() -> Result { + fn subscribe_origin() -> Result { Ok(RelayLocation::get()) } - fn claimable_asset() -> Result<(MultiLocation, MultiLocation, MultiAssets), BenchmarkError> { + fn claimable_asset() -> Result<(Location, Location, Assets), BenchmarkError> { let origin = RelayLocation::get(); - let assets: MultiAssets = (Concrete(RelayLocation::get()), 1_000 * UNITS).into(); - let ticket = MultiLocation { parents: 0, interior: Here }; + let assets: Assets = (AssetId(RelayLocation::get()), 1_000 * UNITS).into(); + let ticket = Location { parents: 0, interior: Here }; Ok((origin, ticket, assets)) } - fn unlockable_asset() -> Result<(MultiLocation, MultiLocation, MultiAsset), BenchmarkError> { + fn unlockable_asset() -> Result<(Location, Location, Asset), BenchmarkError> { Err(BenchmarkError::Skip) } fn export_message_origin_and_destination( - ) -> Result<(MultiLocation, NetworkId, InteriorMultiLocation), BenchmarkError> { + ) -> Result<(Location, NetworkId, InteriorLocation), BenchmarkError> { Err(BenchmarkError::Skip) } - fn alias_origin() -> Result<(MultiLocation, MultiLocation), BenchmarkError> { + fn alias_origin() -> Result<(Location, Location), BenchmarkError> { Err(BenchmarkError::Skip) } } diff --git a/cumulus/parachains/runtimes/people/people-westend/src/weights/xcm/mod.rs b/cumulus/parachains/runtimes/people/people-westend/src/weights/xcm/mod.rs index 5d6f90e9f1b..b2579230c9e 100644 --- a/cumulus/parachains/runtimes/people/people-westend/src/weights/xcm/mod.rs +++ b/cumulus/parachains/runtimes/people/people-westend/src/weights/xcm/mod.rs @@ -23,14 +23,14 @@ use pallet_xcm_benchmarks_generic::WeightInfo as XcmGeneric; use sp_std::prelude::*; use xcm::{latest::prelude::*, DoubleEncoded}; -trait WeighMultiAssets { - fn weigh_multi_assets(&self, weight: Weight) -> Weight; +trait WeighAssets { + fn weigh_assets(&self, weight: Weight) -> Weight; } const MAX_ASSETS: u64 = 100; -impl WeighMultiAssets for MultiAssetFilter { - fn weigh_multi_assets(&self, weight: Weight) -> Weight { +impl WeighAssets for AssetFilter { + fn weigh_assets(&self, weight: Weight) -> Weight { match self { Self::Definite(assets) => weight.saturating_mul(assets.inner().iter().count() as u64), Self::Wild(asset) => match asset { @@ -49,42 +49,38 @@ impl WeighMultiAssets for MultiAssetFilter { } } -impl WeighMultiAssets for MultiAssets { - fn weigh_multi_assets(&self, weight: Weight) -> Weight { +impl WeighAssets for Assets { + fn weigh_assets(&self, weight: Weight) -> Weight { weight.saturating_mul(self.inner().iter().count() as u64) } } pub struct PeopleWestendXcmWeight(core::marker::PhantomData); impl XcmWeightInfo for PeopleWestendXcmWeight { - fn withdraw_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::withdraw_asset()) + fn withdraw_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::withdraw_asset()) } // Currently there is no trusted reserve - fn reserve_asset_deposited(_assets: &MultiAssets) -> Weight { + fn reserve_asset_deposited(_assets: &Assets) -> Weight { // TODO: hardcoded - fix https://github.com/paritytech/cumulus/issues/1974 Weight::from_parts(1_000_000_000_u64, 0) } - fn receive_teleported_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::receive_teleported_asset()) + fn receive_teleported_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::receive_teleported_asset()) } fn query_response( _query_id: &u64, _response: &Response, _max_weight: &Weight, - _querier: &Option, + _querier: &Option, ) -> Weight { XcmGeneric::::query_response() } - fn transfer_asset(assets: &MultiAssets, _dest: &MultiLocation) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::transfer_asset()) + fn transfer_asset(assets: &Assets, _dest: &Location) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::transfer_asset()) } - fn transfer_reserve_asset( - assets: &MultiAssets, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::transfer_reserve_asset()) + fn transfer_reserve_asset(assets: &Assets, _dest: &Location, _xcm: &Xcm<()>) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::transfer_reserve_asset()) } fn transact( _origin_type: &OriginKind, @@ -112,50 +108,42 @@ impl XcmWeightInfo for PeopleWestendXcmWeight { fn clear_origin() -> Weight { XcmGeneric::::clear_origin() } - fn descend_origin(_who: &InteriorMultiLocation) -> Weight { + fn descend_origin(_who: &InteriorLocation) -> Weight { XcmGeneric::::descend_origin() } fn report_error(_query_response_info: &QueryResponseInfo) -> Weight { XcmGeneric::::report_error() } - fn deposit_asset(assets: &MultiAssetFilter, _dest: &MultiLocation) -> Weight { + fn deposit_asset(assets: &AssetFilter, _dest: &Location) -> Weight { // Hardcoded till the XCM pallet is fixed let hardcoded_weight = Weight::from_parts(1_000_000_000_u64, 0); - let weight = assets.weigh_multi_assets(XcmFungibleWeight::::deposit_asset()); + let weight = assets.weigh_assets(XcmFungibleWeight::::deposit_asset()); hardcoded_weight.min(weight) } - fn deposit_reserve_asset( - assets: &MultiAssetFilter, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmFungibleWeight::::deposit_reserve_asset()) + fn deposit_reserve_asset(assets: &AssetFilter, _dest: &Location, _xcm: &Xcm<()>) -> Weight { + assets.weigh_assets(XcmFungibleWeight::::deposit_reserve_asset()) } - fn exchange_asset(_give: &MultiAssetFilter, _receive: &MultiAssets, _maximal: &bool) -> Weight { + fn exchange_asset(_give: &AssetFilter, _receive: &Assets, _maximal: &bool) -> Weight { Weight::MAX } fn initiate_reserve_withdraw( - assets: &MultiAssetFilter, - _reserve: &MultiLocation, + assets: &AssetFilter, + _reserve: &Location, _xcm: &Xcm<()>, ) -> Weight { - assets.weigh_multi_assets(XcmGeneric::::initiate_reserve_withdraw()) + assets.weigh_assets(XcmGeneric::::initiate_reserve_withdraw()) } - fn initiate_teleport( - assets: &MultiAssetFilter, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { + fn initiate_teleport(assets: &AssetFilter, _dest: &Location, _xcm: &Xcm<()>) -> Weight { // Hardcoded till the XCM pallet is fixed let hardcoded_weight = Weight::from_parts(200_000_000_u64, 0); - let weight = assets.weigh_multi_assets(XcmFungibleWeight::::initiate_teleport()); + let weight = assets.weigh_assets(XcmFungibleWeight::::initiate_teleport()); hardcoded_weight.min(weight) } - fn report_holding(_response_info: &QueryResponseInfo, _assets: &MultiAssetFilter) -> Weight { + fn report_holding(_response_info: &QueryResponseInfo, _assets: &AssetFilter) -> Weight { XcmGeneric::::report_holding() } - fn buy_execution(_fees: &MultiAsset, _weight_limit: &WeightLimit) -> Weight { + fn buy_execution(_fees: &Asset, _weight_limit: &WeightLimit) -> Weight { XcmGeneric::::buy_execution() } fn refund_surplus() -> Weight { @@ -170,7 +158,7 @@ impl XcmWeightInfo for PeopleWestendXcmWeight { fn clear_error() -> Weight { XcmGeneric::::clear_error() } - fn claim_asset(_assets: &MultiAssets, _ticket: &MultiLocation) -> Weight { + fn claim_asset(_assets: &Assets, _ticket: &Location) -> Weight { XcmGeneric::::claim_asset() } fn trap(_code: &u64) -> Weight { @@ -182,13 +170,13 @@ impl XcmWeightInfo for PeopleWestendXcmWeight { fn unsubscribe_version() -> Weight { XcmGeneric::::unsubscribe_version() } - fn burn_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmGeneric::::burn_asset()) + fn burn_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmGeneric::::burn_asset()) } - fn expect_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmGeneric::::expect_asset()) + fn expect_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmGeneric::::expect_asset()) } - fn expect_origin(_origin: &Option) -> Weight { + fn expect_origin(_origin: &Option) -> Weight { XcmGeneric::::expect_origin() } fn expect_error(_error: &Option<(u32, XcmError)>) -> Weight { @@ -221,16 +209,16 @@ impl XcmWeightInfo for PeopleWestendXcmWeight { fn export_message(_: &NetworkId, _: &Junctions, _: &Xcm<()>) -> Weight { Weight::MAX } - fn lock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn lock_asset(_: &Asset, _: &Location) -> Weight { Weight::MAX } - fn unlock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn unlock_asset(_: &Asset, _: &Location) -> Weight { Weight::MAX } - fn note_unlockable(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn note_unlockable(_: &Asset, _: &Location) -> Weight { Weight::MAX } - fn request_unlock(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn request_unlock(_: &Asset, _: &Location) -> Weight { Weight::MAX } fn set_fees_mode(_: &bool) -> Weight { @@ -242,11 +230,11 @@ impl XcmWeightInfo for PeopleWestendXcmWeight { fn clear_topic() -> Weight { XcmGeneric::::clear_topic() } - fn alias_origin(_: &MultiLocation) -> Weight { + fn alias_origin(_: &Location) -> Weight { // XCM Executor does not currently support alias origin operations Weight::MAX } - fn unpaid_execution(_: &WeightLimit, _: &Option) -> Weight { + fn unpaid_execution(_: &WeightLimit, _: &Option) -> Weight { XcmGeneric::::unpaid_execution() } } diff --git a/cumulus/parachains/runtimes/people/people-westend/src/xcm_config.rs b/cumulus/parachains/runtimes/people/people-westend/src/xcm_config.rs index 0a51cf72d5b..59c00dc5ff6 100644 --- a/cumulus/parachains/runtimes/people/people-westend/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/people/people-westend/src/xcm_config.rs @@ -19,7 +19,7 @@ use super::{ }; use crate::{TransactionByteFee, CENTS}; use frame_support::{ - match_types, parameter_types, + parameter_types, traits::{ConstU32, Contains, Equals, Everything, Nothing}, }; use frame_system::EnsureRoot; @@ -49,22 +49,22 @@ use xcm_builder::{ use xcm_executor::{traits::WithOriginFilter, XcmExecutor}; parameter_types! { - pub const RootLocation: MultiLocation = MultiLocation::here(); - pub const RelayLocation: MultiLocation = MultiLocation::parent(); + pub const RootLocation: Location = Location::here(); + pub const RelayLocation: Location = Location::parent(); pub const RelayNetwork: Option = Some(NetworkId::Westend); pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); - pub UniversalLocation: InteriorMultiLocation = - X2(GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(ParachainInfo::parachain_id().into())); + pub UniversalLocation: InteriorLocation = + [GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(ParachainInfo::parachain_id().into())].into(); pub const MaxInstructions: u32 = 100; pub const MaxAssetsIntoHolding: u32 = 64; - pub FellowshipLocation: MultiLocation = MultiLocation::new(1, Parachain(1001)); - pub const GovernanceLocation: MultiLocation = MultiLocation::parent(); + pub FellowshipLocation: Location = Location::new(1, Parachain(1001)); + pub const GovernanceLocation: Location = Location::parent(); /// The asset ID for the asset that we use to pay for message delivery fees. Just WND. - pub FeeAssetId: AssetId = Concrete(RelayLocation::get()); + pub FeeAssetId: AssetId = AssetId(RelayLocation::get()); /// The base fee for the message delivery fees. pub const BaseDeliveryFee: u128 = CENTS.saturating_mul(3); pub TreasuryAccount: AccountId = TREASURY_PALLET_ID.into_account_truncating(); - pub RelayTreasuryLocation: MultiLocation = + pub RelayTreasuryLocation: Location = (Parent, PalletInstance(westend_runtime_constants::TREASURY_PALLET_ID)).into(); } @@ -82,7 +82,7 @@ pub type PriceForSiblingParachainDelivery = polkadot_runtime_common::xcm_sender: XcmpQueue, >; -/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used +/// Type for specifying how a `Location` can be converted into an `AccountId`. This is used /// when determining ownership of accounts for asset transacting and when attempting to use XCM /// `Transact` in order to determine the dispatch Origin. pub type LocationToAccountId = ( @@ -103,7 +103,7 @@ pub type CurrencyTransactor = CurrencyAdapter< Balances, // Use this currency when it is a fungible asset matching the given location or name: IsConcrete, - // Do a simple punn to convert an `AccountId32` `MultiLocation` into a native chain + // Do a simple punn to convert an `AccountId32` `Location` into a native chain // `AccountId`: LocationToAccountId, // Our chain's account ID type (we can't get away without mentioning it explicitly): @@ -136,21 +136,32 @@ pub type XcmOriginToTransactDispatchOrigin = ( XcmPassthrough, ); -match_types! { - pub type LocalPlurality: impl Contains = { - MultiLocation { parents: 0, interior: X1(Plurality { .. }) } - }; - pub type ParentOrParentsPlurality: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(Plurality { .. }) } - }; - pub type ParentOrSiblings: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(Parachain(_)) } - }; - pub type FellowsPlurality: impl Contains = { - MultiLocation { parents: 1, interior: X2(Parachain(1001), Plurality { id: BodyId::Technical, ..}) } - }; +pub struct LocalPlurality; +impl Contains for LocalPlurality { + fn contains(location: &Location) -> bool { + matches!(location.unpack(), (0, [Plurality { .. }])) + } +} + +pub struct ParentOrParentsPlurality; +impl Contains for ParentOrParentsPlurality { + fn contains(location: &Location) -> bool { + matches!(location.unpack(), (1, []) | (1, [Plurality { .. }])) + } +} + +pub struct ParentOrSiblings; +impl Contains for ParentOrSiblings { + fn contains(location: &Location) -> bool { + matches!(location.unpack(), (1, []) | (1, [Parachain(_)])) + } +} + +pub struct FellowsPlurality; +impl Contains for FellowsPlurality { + fn contains(location: &Location) -> bool { + matches!(location.unpack(), (1, [Parachain(1001), Plurality { id: BodyId::Technical, .. }])) + } } /// A call filter for the XCM Transact instruction. This is a temporary measure until we properly @@ -272,7 +283,7 @@ impl xcm_executor::Config for XcmConfig { type Aliasers = Nothing; } -/// Converts a local signed origin into an XCM multilocation. Forms the basis for local origins +/// Converts a local signed origin into an XCM location. Forms the basis for local origins /// sending/executing XCMs. pub type LocalOriginToLocation = SignedToAccountId32; diff --git a/cumulus/parachains/runtimes/starters/shell/src/xcm_config.rs b/cumulus/parachains/runtimes/starters/shell/src/xcm_config.rs index ff773ca7816..f5ceabb1eb4 100644 --- a/cumulus/parachains/runtimes/starters/shell/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/starters/shell/src/xcm_config.rs @@ -18,8 +18,8 @@ use super::{ RuntimeOrigin, }; use frame_support::{ - match_types, parameter_types, - traits::{Everything, Nothing}, + parameter_types, + traits::{Contains, Everything, Nothing}, weights::Weight, }; use xcm::latest::prelude::*; @@ -29,9 +29,9 @@ use xcm_builder::{ }; parameter_types! { - pub const RococoLocation: MultiLocation = MultiLocation::parent(); + pub const RococoLocation: Location = Location::parent(); pub const RococoNetwork: Option = Some(NetworkId::Rococo); - pub UniversalLocation: InteriorMultiLocation = X1(Parachain(ParachainInfo::parachain_id().into())); + pub UniversalLocation: InteriorLocation = [Parachain(ParachainInfo::parachain_id().into())].into(); } /// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance, @@ -47,8 +47,11 @@ pub type XcmOriginToTransactDispatchOrigin = ( ParentAsSuperuser, ); -match_types! { - pub type JustTheParent: impl Contains = { MultiLocation { parents:1, interior: Here } }; +pub struct JustTheParent; +impl Contains for JustTheParent { + fn contains(location: &Location) -> bool { + matches!(location.unpack(), (1, [])) + } } parameter_types! { diff --git a/cumulus/parachains/runtimes/test-utils/src/lib.rs b/cumulus/parachains/runtimes/test-utils/src/lib.rs index 6d43875a886..88e878c73a3 100644 --- a/cumulus/parachains/runtimes/test-utils/src/lib.rs +++ b/cumulus/parachains/runtimes/test-utils/src/lib.rs @@ -37,11 +37,11 @@ use sp_consensus_aura::{SlotDuration, AURA_ENGINE_ID}; use sp_core::Encode; use sp_runtime::{traits::Header, BuildStorage, Digest, DigestItem}; use xcm::{ - latest::{MultiAsset, MultiLocation, XcmContext, XcmHash}, + latest::{Asset, Location, XcmContext, XcmHash}, prelude::*, VersionedXcm, MAX_XCM_DECODE_DEPTH, }; -use xcm_executor::{traits::TransactAsset, Assets}; +use xcm_executor::{traits::TransactAsset, AssetsInHolding}; pub mod test_cases; @@ -307,12 +307,12 @@ impl RuntimeHelper { pub fn do_transfer( - from: MultiLocation, - to: MultiLocation, - (asset, amount): (MultiLocation, u128), - ) -> Result { + from: Location, + to: Location, + (asset, amount): (Location, u128), + ) -> Result { ::transfer_asset( - &MultiAsset { id: Concrete(asset), fun: Fungible(amount) }, + &Asset { id: AssetId(asset), fun: Fungible(amount) }, &from, &to, // We aren't able to track the XCM that initiated the fee deposit, so we create a @@ -329,9 +329,9 @@ impl< { pub fn do_teleport_assets( origin: ::RuntimeOrigin, - dest: MultiLocation, - beneficiary: MultiLocation, - (asset, amount): (MultiLocation, u128), + dest: Location, + beneficiary: Location, + (asset, amount): (Location, u128), open_hrmp_channel: Option<(u32, u32)>, included_head: HeaderFor, slot_digest: &[u8], @@ -356,7 +356,7 @@ impl< origin, Box::new(dest.into()), Box::new(beneficiary.into()), - Box::new((Concrete(asset), amount).into()), + Box::new((AssetId(asset), amount).into()), 0, ) } @@ -379,12 +379,13 @@ impl< ]); // execute xcm as parent origin - let hash = xcm.using_encoded(sp_io::hashing::blake2_256); - <::XcmExecutor>::execute_xcm( - MultiLocation::parent(), + let mut hash = xcm.using_encoded(sp_io::hashing::blake2_256); + <::XcmExecutor>::prepare_and_execute( + Location::parent(), xcm, - hash, + &mut hash, Self::xcm_max_weight(XcmReceivedFrom::Parent), + Weight::zero(), ) } } @@ -451,7 +452,7 @@ impl< } pub fn assert_metadata( - asset_id: impl Into + Copy, + asset_id: impl Into + Clone, expected_name: &str, expected_symbol: &str, expected_decimals: u8, @@ -459,20 +460,20 @@ pub fn assert_metadata( Fungibles: frame_support::traits::fungibles::metadata::Inspect + frame_support::traits::fungibles::Inspect, { - assert_eq!(Fungibles::name(asset_id.into()), Vec::from(expected_name),); - assert_eq!(Fungibles::symbol(asset_id.into()), Vec::from(expected_symbol),); + assert_eq!(Fungibles::name(asset_id.clone().into()), Vec::from(expected_name),); + assert_eq!(Fungibles::symbol(asset_id.clone().into()), Vec::from(expected_symbol),); assert_eq!(Fungibles::decimals(asset_id.into()), expected_decimals); } pub fn assert_total( - asset_id: impl Into + Copy, + asset_id: impl Into + Clone, expected_total_issuance: impl Into, expected_active_issuance: impl Into, ) where Fungibles: frame_support::traits::fungibles::metadata::Inspect + frame_support::traits::fungibles::Inspect, { - assert_eq!(Fungibles::total_issuance(asset_id.into()), expected_total_issuance.into()); + assert_eq!(Fungibles::total_issuance(asset_id.clone().into()), expected_total_issuance.into()); assert_eq!(Fungibles::active_issuance(asset_id.into()), expected_active_issuance.into()); } diff --git a/cumulus/parachains/runtimes/testing/penpal/src/lib.rs b/cumulus/parachains/runtimes/testing/penpal/src/lib.rs index 541bcd05644..37a8454d62a 100644 --- a/cumulus/parachains/runtimes/testing/penpal/src/lib.rs +++ b/cumulus/parachains/runtimes/testing/penpal/src/lib.rs @@ -32,7 +32,6 @@ include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); mod weights; pub mod xcm_config; -use assets_common::MultiLocationForAssetId; use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; use cumulus_primitives_core::{AggregateMessageOrigin, ParaId}; use frame_support::{ @@ -474,8 +473,8 @@ pub type ForeignAssetsInstance = pallet_assets::Instance2; impl pallet_assets::Config for Runtime { type RuntimeEvent = RuntimeEvent; type Balance = Balance; - type AssetId = MultiLocationForAssetId; - type AssetIdParameter = MultiLocationForAssetId; + type AssetId = xcm::v3::Location; + type AssetIdParameter = xcm::v3::Location; type Currency = Balances; type CreateOrigin = AsEnsureOriginWithArg>; type ForceOrigin = EnsureRoot; diff --git a/cumulus/parachains/runtimes/testing/penpal/src/xcm_config.rs b/cumulus/parachains/runtimes/testing/penpal/src/xcm_config.rs index 9287ac30514..b3f84a4bb9c 100644 --- a/cumulus/parachains/runtimes/testing/penpal/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/testing/penpal/src/xcm_config.rs @@ -29,7 +29,7 @@ use super::{ }; use core::marker::PhantomData; use frame_support::{ - match_types, parameter_types, + parameter_types, traits::{ fungibles::{self, Balanced, Credit}, ConstU32, Contains, ContainsPair, Everything, Get, Nothing, @@ -59,13 +59,13 @@ use xcm_builder::{ use xcm_executor::{traits::JustTry, XcmExecutor}; parameter_types! { - pub const RelayLocation: MultiLocation = MultiLocation::parent(); + pub const RelayLocation: Location = Location::parent(); pub const RelayNetwork: Option = None; pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); - pub UniversalLocation: InteriorMultiLocation = X1(Parachain(ParachainInfo::parachain_id().into())); + pub UniversalLocation: InteriorLocation = [Parachain(ParachainInfo::parachain_id().into())].into(); } -/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used +/// Type for specifying how a `Location` can be converted into an `AccountId`. This is used /// when determining ownership of accounts for asset transacting and when attempting to use XCM /// `Transact` in order to determine the dispatch Origin. pub type LocationToAccountId = ( @@ -84,7 +84,7 @@ pub type CurrencyTransactor = CurrencyAdapter< Balances, // Use this currency when it is a fungible asset matching the given location or name: IsConcrete, - // Do a simple punn to convert an AccountId32 MultiLocation into a native chain account ID: + // Do a simple punn to convert an AccountId32 Location into a native chain account ID: LocationToAccountId, // Our chain's account ID type (we can't get away without mentioning it explicitly): AccountId, @@ -115,7 +115,7 @@ pub type FungiblesTransactor = FungiblesAdapter< JustTry, >, ), - // Convert an XCM MultiLocation into a local account id: + // Convert an XCM Location into a local account id: LocationToAccountId, // Our chain's account ID type (we can't get away without mentioning it explicitly): AccountId, @@ -180,14 +180,18 @@ parameter_types! { pub const MaxAssetsIntoHolding: u32 = 64; } -match_types! { - pub type ParentOrParentsExecutivePlurality: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(Plurality { id: BodyId::Executive, .. }) } - }; - pub type CommonGoodAssetsParachain: impl Contains = { - MultiLocation { parents: 1, interior: X1(Parachain(1000)) } - }; +pub struct ParentOrParentsExecutivePlurality; +impl Contains for ParentOrParentsExecutivePlurality { + fn contains(location: &Location) -> bool { + matches!(location.unpack(), (1, []) | (1, [Plurality { id: BodyId::Executive, .. }])) + } +} + +pub struct CommonGoodAssetsParachain; +impl Contains for CommonGoodAssetsParachain { + fn contains(location: &Location) -> bool { + matches!(location.unpack(), (1, [Parachain(1000)])) + } } pub type Barrier = TrailingSetTopicAsId< @@ -224,15 +228,15 @@ pub type AccountIdOf = ::AccountId; /// Asset filter that allows all assets from a certain location matching asset id. pub struct AssetPrefixFrom(PhantomData<(Prefix, Origin)>); -impl ContainsPair for AssetPrefixFrom +impl ContainsPair for AssetPrefixFrom where - Prefix: Get, - Origin: Get, + Prefix: Get, + Origin: Get, { - fn contains(asset: &MultiAsset, origin: &MultiLocation) -> bool { + fn contains(asset: &Asset, origin: &Location) -> bool { let loc = Origin::get(); &loc == origin && - matches!(asset, MultiAsset { id: AssetId::Concrete(asset_loc), fun: Fungible(_a) } + matches!(asset, Asset { id: AssetId(asset_loc), fun: Fungible(_a) } if asset_loc.starts_with(&Prefix::get())) } } @@ -241,12 +245,12 @@ type AssetsFrom = AssetPrefixFrom; /// Asset filter that allows native/relay asset if coming from a certain location. pub struct NativeAssetFrom(PhantomData); -impl> ContainsPair for NativeAssetFrom { - fn contains(asset: &MultiAsset, origin: &MultiLocation) -> bool { +impl> ContainsPair for NativeAssetFrom { + fn contains(asset: &Asset, origin: &Location) -> bool { let loc = T::get(); &loc == origin && - matches!(asset, MultiAsset { id: AssetId::Concrete(asset_loc), fun: Fungible(_a) } - if *asset_loc == MultiLocation::from(Parent)) + matches!(asset, Asset { id: AssetId(asset_loc), fun: Fungible(_a) } + if *asset_loc == Location::from(Parent)) } } @@ -282,29 +286,34 @@ where pub const TELEPORTABLE_ASSET_ID: u32 = 2; parameter_types! { /// The location that this chain recognizes as the Relay network's Asset Hub. - pub SystemAssetHubLocation: MultiLocation = MultiLocation::new(1, X1(Parachain(1000))); + pub SystemAssetHubLocation: Location = Location::new(1, [Parachain(1000)]); // ALWAYS ensure that the index in PalletInstance stays up-to-date with // the Relay Chain's Asset Hub's Assets pallet index - pub SystemAssetHubAssetsPalletLocation: MultiLocation = - MultiLocation::new(1, X2(Parachain(1000), PalletInstance(50))); - pub AssetsPalletLocation: MultiLocation = - MultiLocation::new(0, X1(PalletInstance(50))); + pub SystemAssetHubAssetsPalletLocation: Location = + Location::new(1, [Parachain(1000), PalletInstance(50)]); + pub AssetsPalletLocation: Location = + Location::new(0, [PalletInstance(50)]); pub CheckingAccount: AccountId = PolkadotXcm::check_account(); - pub LocalTeleportableToAssetHub: MultiLocation = MultiLocation::new( + pub LocalTeleportableToAssetHub: Location = Location::new( + 0, + [PalletInstance(50), GeneralIndex(TELEPORTABLE_ASSET_ID.into())] + ); + pub LocalTeleportableToAssetHubV3: xcm::v3::Location = xcm::v3::Location::new( 0, - X2(PalletInstance(50), GeneralIndex(TELEPORTABLE_ASSET_ID.into())) + [xcm::v3::Junction::PalletInstance(50), xcm::v3::Junction::GeneralIndex(TELEPORTABLE_ASSET_ID.into())] ); - pub EthereumLocation: MultiLocation = MultiLocation::new(2, X1(GlobalConsensus(EthereumNetwork::get()))); + pub EthereumLocation: Location = Location::new(2, [GlobalConsensus(EthereumNetwork::get())]); } /// Accepts asset with ID `AssetLocation` and is coming from `Origin` chain. pub struct AssetFromChain(PhantomData<(AssetLocation, Origin)>); -impl, Origin: Get> - ContainsPair for AssetFromChain +impl, Origin: Get> ContainsPair + for AssetFromChain { - fn contains(asset: &MultiAsset, origin: &MultiLocation) -> bool { + fn contains(asset: &Asset, origin: &Location) -> bool { log::trace!(target: "xcm::contains", "AssetFromChain asset: {:?}, origin: {:?}", asset, origin); - *origin == Origin::get() && matches!(asset.id, Concrete(id) if id == AssetLocation::get()) + *origin == Origin::get() && + matches!(asset.id.clone(), AssetId(id) if id == AssetLocation::get()) } } @@ -398,8 +407,8 @@ impl cumulus_pallet_xcm::Config for Runtime { /// Simple conversion of `u32` into an `AssetId` for use in benchmarking. pub struct XcmBenchmarkHelper; #[cfg(feature = "runtime-benchmarks")] -impl pallet_assets::BenchmarkHelper for XcmBenchmarkHelper { - fn create_asset_id_parameter(id: u32) -> MultiLocation { - MultiLocation { parents: 1, interior: X1(Parachain(id)) } +impl pallet_assets::BenchmarkHelper for XcmBenchmarkHelper { + fn create_asset_id_parameter(id: u32) -> xcm::v3::Location { + xcm::v3::Location::new(1, [xcm::v3::Junction::Parachain(id)]) } } diff --git a/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs b/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs index 7faee4258f6..102127479d2 100644 --- a/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs +++ b/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs @@ -42,10 +42,10 @@ pub use frame_support::{ construct_runtime, derive_impl, dispatch::DispatchClass, genesis_builder_helper::{build_config, create_default_config}, - match_types, parameter_types, + parameter_types, traits::{ - AsEnsureOriginWithArg, ConstBool, ConstU32, ConstU64, ConstU8, EitherOfDiverse, Everything, - IsInVec, Nothing, Randomness, + AsEnsureOriginWithArg, ConstBool, ConstU32, ConstU64, ConstU8, Contains, EitherOfDiverse, + Everything, IsInVec, Nothing, Randomness, }, weights::{ constants::{ @@ -330,14 +330,14 @@ impl pallet_message_queue::Config for Runtime { impl cumulus_pallet_aura_ext::Config for Runtime {} parameter_types! { - pub const RocLocation: MultiLocation = MultiLocation::parent(); + pub const RocLocation: Location = Location::parent(); pub const RococoNetwork: Option = Some(NetworkId::Rococo); pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into(); - pub UniversalLocation: InteriorMultiLocation = X1(Parachain(ParachainInfo::parachain_id().into())); + pub UniversalLocation: InteriorLocation = [Parachain(ParachainInfo::parachain_id().into())].into(); pub CheckingAccount: AccountId = PolkadotXcm::check_account(); } -/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used +/// Type for specifying how a `Location` can be converted into an `AccountId`. This is used /// when determining ownership of accounts for asset transacting and when attempting to use XCM /// `Transact` in order to determine the dispatch Origin. pub type LocationToAccountId = ( @@ -356,7 +356,7 @@ pub type CurrencyTransactor = CurrencyAdapter< Balances, // Use this currency when it is a fungible asset matching the given location or name: IsConcrete, - // Do a simple punn to convert an AccountId32 MultiLocation into a native chain account ID: + // Do a simple punn to convert an AccountId32 Location into a native chain account ID: LocationToAccountId, // Our chain's account ID type (we can't get away without mentioning it explicitly): AccountId, @@ -379,7 +379,7 @@ pub type FungiblesTransactor = FungiblesAdapter< >, JustTry, >, - // Convert an XCM MultiLocation into a local account id: + // Convert an XCM Location into a local account id: LocationToAccountId, // Our chain's account ID type (we can't get away without mentioning it explicitly): AccountId, @@ -420,20 +420,22 @@ parameter_types! { // One XCM operation is 1_000_000_000 weight - almost certainly a conservative estimate. pub UnitWeightCost: Weight = Weight::from_parts(1_000_000_000, 64 * 1024); // One ROC buys 1 second of weight. - pub const WeightPrice: (MultiLocation, u128) = (MultiLocation::parent(), ROC); + pub const WeightPrice: (Location, u128) = (Location::parent(), ROC); pub const MaxInstructions: u32 = 100; } -match_types! { - // The parent or the parent's unit plurality. - pub type ParentOrParentsUnitPlurality: impl Contains = { - MultiLocation { parents: 1, interior: Here } | - MultiLocation { parents: 1, interior: X1(Plurality { id: BodyId::Unit, .. }) } - }; - // The location recognized as the Relay network's Asset Hub. - pub type AssetHub: impl Contains = { - MultiLocation { parents: 1, interior: X1(Parachain(1000)) } - }; +pub struct ParentOrParentsUnitPlurality; +impl Contains for ParentOrParentsUnitPlurality { + fn contains(location: &Location) -> bool { + matches!(location.unpack(), (1, []) | (1, [Plurality { id: BodyId::Unit, .. }])) + } +} + +pub struct AssetHub; +impl Contains for AssetHub { + fn contains(location: &Location) -> bool { + matches!(location.unpack(), (1, [Parachain(1000)])) + } } pub type Barrier = TrailingSetTopicAsId<( @@ -451,11 +453,11 @@ pub type Barrier = TrailingSetTopicAsId<( parameter_types! { pub MaxAssetsIntoHolding: u32 = 64; - pub SystemAssetHubLocation: MultiLocation = MultiLocation::new(1, X1(Parachain(1000))); + pub SystemAssetHubLocation: Location = Location::new(1, [Parachain(1000)]); // ALWAYS ensure that the index in PalletInstance stays up-to-date with // the Relay Chain's Asset Hub's Assets pallet index - pub SystemAssetHubAssetsPalletLocation: MultiLocation = - MultiLocation::new(1, X2(Parachain(1000), PalletInstance(50))); + pub SystemAssetHubAssetsPalletLocation: Location = + Location::new(1, [Parachain(1000), PalletInstance(50)]); } pub type Reserves = (NativeAsset, AssetsFrom); diff --git a/cumulus/primitives/core/src/lib.rs b/cumulus/primitives/core/src/lib.rs index 835c9de649e..7f735368565 100644 --- a/cumulus/primitives/core/src/lib.rs +++ b/cumulus/primitives/core/src/lib.rs @@ -93,13 +93,12 @@ pub enum AggregateMessageOrigin { Sibling(ParaId), } -impl From for xcm::v3::MultiLocation { +impl From for Location { fn from(origin: AggregateMessageOrigin) -> Self { match origin { - AggregateMessageOrigin::Here => MultiLocation::here(), - AggregateMessageOrigin::Parent => MultiLocation::parent(), - AggregateMessageOrigin::Sibling(id) => - MultiLocation::new(1, Junction::Parachain(id.into())), + AggregateMessageOrigin::Here => Location::here(), + AggregateMessageOrigin::Parent => Location::parent(), + AggregateMessageOrigin::Sibling(id) => Location::new(1, Junction::Parachain(id.into())), } } } diff --git a/cumulus/primitives/utility/src/lib.rs b/cumulus/primitives/utility/src/lib.rs index 7216000cb45..bd13ee1119b 100644 --- a/cumulus/primitives/utility/src/lib.rs +++ b/cumulus/primitives/utility/src/lib.rs @@ -35,7 +35,10 @@ use sp_runtime::{ use sp_std::{marker::PhantomData, prelude::*}; use xcm::{latest::prelude::*, WrapVersion}; use xcm_builder::TakeRevenue; -use xcm_executor::traits::{MatchesFungibles, TransactAsset, WeightTrader}; +use xcm_executor::{ + traits::{MatchesFungibles, TransactAsset, WeightTrader}, + AssetsInHolding, +}; #[cfg(test)] mod tests; @@ -56,10 +59,7 @@ where { type Ticket = Vec; - fn validate( - dest: &mut Option, - msg: &mut Option>, - ) -> SendResult> { + fn validate(dest: &mut Option, msg: &mut Option>) -> SendResult> { let d = dest.take().ok_or(SendError::MissingArgument)?; if d.contains_parents_only(1) { @@ -95,14 +95,14 @@ struct AssetTraderRefunder { // The amount of weight bought minus the weigh already refunded weight_outstanding: Weight, // The concrete asset containing the asset location and outstanding balance - outstanding_concrete_asset: MultiAsset, + outstanding_concrete_asset: Asset, } -/// Charges for execution in the first multiasset of those selected for fee payment +/// Charges for execution in the first asset of those selected for fee payment /// Only succeeds for Concrete Fungible Assets -/// First tries to convert the this MultiAsset into a local assetId +/// First tries to convert the this Asset into a local assetId /// Then charges for this assetId as described by FeeCharger -/// Weight, paid balance, local asset Id and the multilocation is stored for +/// Weight, paid balance, local asset Id and the location is stored for /// later refund purposes /// Important: Errors if the Trader is being called twice by 2 BuyExecution instructions /// Alternatively we could just return payment in the aforementioned case @@ -128,15 +128,15 @@ impl< fn new() -> Self { Self(None, PhantomData) } - // We take first multiasset + // We take first asset // Check whether we can convert fee to asset_fee (is_sufficient, min_deposit) // If everything goes well, we charge. fn buy_weight( &mut self, weight: Weight, - payment: xcm_executor::Assets, + payment: xcm_executor::AssetsInHolding, context: &XcmContext, - ) -> Result { + ) -> Result { log::trace!(target: "xcm::weight", "TakeFirstAssetTrader::buy_weight weight: {:?}, payment: {:?}, context: {:?}", weight, payment, context); // Make sure we dont enter twice @@ -144,12 +144,12 @@ impl< return Err(XcmError::NotWithdrawable) } - // We take the very first multiasset from payment + // We take the very first asset from payment // (assets are sorted by fungibility/amount after this conversion) - let multiassets: MultiAssets = payment.clone().into(); + let assets: Assets = payment.clone().into(); - // Take the first multiasset from the selected MultiAssets - let first = multiassets.get(0).ok_or(XcmError::AssetNotFound)?; + // Take the first asset from the selected Assets + let first = assets.get(0).ok_or(XcmError::AssetNotFound)?; // Get the local asset id in which we can pay for fees let (local_asset_id, _) = @@ -171,13 +171,13 @@ impl< .try_into() .map_err(|_| XcmError::Overflow)?; - // Convert to the same kind of multiasset, with the required fungible balance - let required = first.id.into_multiasset(asset_balance.into()); + // Convert to the same kind of asset, with the required fungible balance + let required = first.id.clone().into_asset(asset_balance.into()); // Substract payment let unused = payment.checked_sub(required.clone()).map_err(|_| XcmError::TooExpensive)?; - // record weight and multiasset + // record weight and asset self.0 = Some(AssetTraderRefunder { weight_outstanding: weight, outstanding_concrete_asset: required, @@ -186,16 +186,16 @@ impl< Ok(unused) } - fn refund_weight(&mut self, weight: Weight, context: &XcmContext) -> Option { + fn refund_weight(&mut self, weight: Weight, context: &XcmContext) -> Option { log::trace!(target: "xcm::weight", "TakeFirstAssetTrader::refund_weight weight: {:?}, context: {:?}", weight, context); if let Some(AssetTraderRefunder { mut weight_outstanding, - outstanding_concrete_asset: MultiAsset { id, fun }, + outstanding_concrete_asset: Asset { id, fun }, }) = self.0.clone() { // Get the local asset id in which we can refund fees let (local_asset_id, outstanding_balance) = - Matcher::matches_fungibles(&(id, fun).into()).ok()?; + Matcher::matches_fungibles(&(id.clone(), fun).into()).ok()?; let minimum_balance = ConcreteAssets::minimum_balance(local_asset_id.clone()); @@ -225,7 +225,8 @@ impl< // Construct outstanding_concrete_asset with the same location id and substracted // balance - let outstanding_concrete_asset: MultiAsset = (id, outstanding_minus_substracted).into(); + let outstanding_concrete_asset: Asset = + (id.clone(), outstanding_minus_substracted).into(); // Substract from existing weight and balance weight_outstanding = weight_outstanding.saturating_sub(weight); @@ -272,11 +273,11 @@ impl< ReceiverAccount: Get>, > TakeRevenue for XcmFeesTo32ByteAccount { - fn take_revenue(revenue: MultiAsset) { + fn take_revenue(revenue: Asset) { if let Some(receiver) = ReceiverAccount::get() { let ok = FungiblesMutateAdapter::deposit_asset( &revenue, - &(X1(AccountId32 { network: None, id: receiver.into() }).into()), + &([AccountId32 { network: None, id: receiver.into() }].into()), None, ) .is_ok(); @@ -307,7 +308,7 @@ pub trait ChargeWeightInFungibles Result { + ) -> Result { log::trace!( target: "xcm::weight", "SwapFirstAssetTrader::buy_weight weight: {:?}, payment: {:?}", weight, payment, ); - let first_asset: MultiAsset = + let first_asset: Asset = payment.fungible.pop_first().ok_or(XcmError::AssetNotFound)?.into(); let (fungibles_asset, balance) = FungiblesAssetMatcher::matches_fungibles(&first_asset) .map_err(|_| XcmError::AssetNotFound)?; @@ -424,14 +425,14 @@ impl< }, _ => (), }; - self.last_fee_asset = Some(first_asset.id); + self.last_fee_asset = Some(first_asset.id.clone()); payment.fungible.insert(first_asset.id, credit_change.peek().into()); drop(credit_change); Ok(payment) } - fn refund_weight(&mut self, weight: Weight, _context: &XcmContext) -> Option { + fn refund_weight(&mut self, weight: Weight, _context: &XcmContext) -> Option { log::trace!( target: "xcm::weight", "SwapFirstAssetTrader::refund_weight weight: {:?}, self.total_fee: {:?}", @@ -444,7 +445,7 @@ impl< } let mut refund_asset = if let Some(asset) = &self.last_fee_asset { // create an initial zero refund in the asset used in the last `buy_weight`. - (*asset, Fungible(0)).into() + (asset.clone(), Fungible(0)).into() } else { return None }; @@ -529,11 +530,11 @@ mod test_xcm_router { impl OkFixedXcmHashWithAssertingRequiredInputsSender { const FIXED_XCM_HASH: [u8; 32] = [9; 32]; - fn fixed_delivery_asset() -> MultiAssets { - MultiAssets::new() + fn fixed_delivery_asset() -> Assets { + Assets::new() } - fn expected_delivery_result() -> Result<(XcmHash, MultiAssets), SendError> { + fn expected_delivery_result() -> Result<(XcmHash, Assets), SendError> { Ok((Self::FIXED_XCM_HASH, Self::fixed_delivery_asset())) } } @@ -541,7 +542,7 @@ mod test_xcm_router { type Ticket = (); fn validate( - destination: &mut Option, + destination: &mut Option, message: &mut Option>, ) -> SendResult { assert!(destination.is_some()); @@ -597,7 +598,7 @@ mod test_xcm_router { // ParentAsUmp - check dest/msg is valid let dest = (Parent, Here); - let mut dest_wrapper = Some(dest.into()); + let mut dest_wrapper = Some(dest.clone().into()); let mut msg_wrapper = Some(message.clone()); assert!( as SendXcm>::validate( &mut dest_wrapper, @@ -629,7 +630,7 @@ mod test_trader { }, }; use sp_runtime::DispatchError; - use xcm_executor::{traits::Error, Assets}; + use xcm_executor::{traits::Error, AssetsInHolding}; #[test] fn take_first_asset_trader_buy_weight_called_twice_throws_error() { @@ -641,9 +642,9 @@ mod test_trader { type TestBalance = u128; struct TestAssets; impl MatchesFungibles for TestAssets { - fn matches_fungibles(a: &MultiAsset) -> Result<(TestAssetId, TestBalance), Error> { + fn matches_fungibles(a: &Asset) -> Result<(TestAssetId, TestBalance), Error> { match a { - MultiAsset { fun: Fungible(amount), id: Concrete(_id) } => Ok((1, *amount)), + Asset { fun: Fungible(amount), id: AssetId(_id) } => Ok((1, *amount)), _ => Err(Error::AssetNotHandled), } } @@ -730,7 +731,7 @@ mod test_trader { } } impl TakeRevenue for FeeChargerAssetsHandleRefund { - fn take_revenue(_: MultiAsset) {} + fn take_revenue(_: Asset) {} } // create new instance @@ -745,8 +746,8 @@ mod test_trader { let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; // prepare test data - let asset: MultiAsset = (Here, AMOUNT).into(); - let payment = Assets::from(asset); + let asset: Asset = (Here, AMOUNT).into(); + let payment = AssetsInHolding::from(asset); let weight_to_buy = Weight::from_parts(1_000, 1_000); // lets do first call (success) @@ -769,17 +770,17 @@ pub struct ToParentDeliveryHelper>, + ExistentialDeposit: Get>, PriceForDelivery: PriceForMessageDelivery, > pallet_xcm_benchmarks::EnsureDelivery for ToParentDeliveryHelper { fn ensure_successful_delivery( - origin_ref: &MultiLocation, - _dest: &MultiLocation, + origin_ref: &Location, + _dest: &Location, fee_reason: xcm_executor::traits::FeeReason, - ) -> (Option, Option) { - use xcm::latest::{MAX_INSTRUCTIONS_TO_DECODE, MAX_ITEMS_IN_MULTIASSETS}; + ) -> (Option, Option) { + use xcm::latest::{MAX_INSTRUCTIONS_TO_DECODE, MAX_ITEMS_IN_ASSETS}; use xcm_executor::{traits::FeeManager, FeesMode}; let mut fees_mode = None; @@ -792,8 +793,8 @@ impl< } // overestimate delivery fee - let mut max_assets: Vec = Vec::new(); - for i in 0..MAX_ITEMS_IN_MULTIASSETS { + let mut max_assets: Vec = Vec::new(); + for i in 0..MAX_ITEMS_IN_ASSETS { max_assets.push((GeneralIndex(i as u128), 100u128).into()); } let overestimated_xcm = diff --git a/cumulus/primitives/utility/src/tests/swap_first.rs b/cumulus/primitives/utility/src/tests/swap_first.rs index 222cd005b12..2e19db49881 100644 --- a/cumulus/primitives/utility/src/tests/swap_first.rs +++ b/cumulus/primitives/utility/src/tests/swap_first.rs @@ -18,18 +18,18 @@ use crate::*; use frame_support::{parameter_types, traits::fungibles::Inspect}; use mock::{setup_pool, AccountId, AssetId, Balance, Fungibles}; use xcm::latest::AssetId as XcmAssetId; -use xcm_executor::Assets as HoldingAsset; +use xcm_executor::AssetsInHolding; -fn create_holding_asset(asset_id: AssetId, amount: Balance) -> HoldingAsset { +fn create_holding_asset(asset_id: AssetId, amount: Balance) -> AssetsInHolding { create_asset(asset_id, amount).into() } -fn create_asset(asset_id: AssetId, amount: Balance) -> MultiAsset { - MultiAsset { id: create_asset_id(asset_id), fun: Fungible(amount) } +fn create_asset(asset_id: AssetId, amount: Balance) -> Asset { + Asset { id: create_asset_id(asset_id), fun: Fungible(amount) } } fn create_asset_id(asset_id: AssetId) -> XcmAssetId { - Concrete(MultiLocation::new(0, X1(GeneralIndex(asset_id.into())))) + AssetId(Location::new(0, [GeneralIndex(asset_id.into())])) } fn xcm_context() -> XcmContext { @@ -319,7 +319,7 @@ fn empty_holding_asset() { let mut trader = Trader::new(); assert_eq!( trader - .buy_weight(Weight::from_all(10), HoldingAsset::new(), &xcm_context()) + .buy_weight(Weight::from_all(10), AssetsInHolding::new(), &xcm_context()) .unwrap_err(), XcmError::AssetNotFound ); @@ -328,8 +328,7 @@ fn empty_holding_asset() { #[test] fn fails_to_match_holding_asset() { let mut trader = Trader::new(); - let holding_asset = - MultiAsset { id: Concrete(MultiLocation::new(1, X1(Parachain(1)))), fun: Fungible(10) }; + let holding_asset = Asset { id: AssetId(Location::new(1, [Parachain(1)])), fun: Fungible(10) }; assert_eq!( trader .buy_weight(Weight::from_all(10), holding_asset.into(), &xcm_context()) @@ -536,14 +535,15 @@ pub mod mock { pub struct FungiblesMatcher; impl MatchesFungibles for FungiblesMatcher { fn matches_fungibles( - a: &MultiAsset, + a: &Asset, ) -> core::result::Result<(AssetId, Balance), xcm_executor::traits::Error> { match a { - MultiAsset { - fun: Fungible(amount), - id: - Concrete(MultiLocation { parents: 0, interior: X1(Junction::GeneralIndex(id)) }), - } => Ok(((*id).try_into().unwrap(), *amount)), + Asset { fun: Fungible(amount), id: AssetId(inner_location) } => + match inner_location.unpack() { + (0, [Junction::GeneralIndex(id)]) => + Ok(((*id).try_into().unwrap(), *amount)), + _ => Err(xcm_executor::traits::Error::AssetNotHandled), + }, _ => Err(xcm_executor::traits::Error::AssetNotHandled), } } diff --git a/cumulus/xcm/xcm-emulator/src/lib.rs b/cumulus/xcm/xcm-emulator/src/lib.rs index c9e4de21d43..c5cc632574b 100644 --- a/cumulus/xcm/xcm-emulator/src/lib.rs +++ b/cumulus/xcm/xcm-emulator/src/lib.rs @@ -60,12 +60,9 @@ pub use polkadot_runtime_parachains::inclusion::{AggregateMessageOrigin, UmpQueu // Polkadot pub use polkadot_parachain_primitives::primitives::RelayChainBlockNumber; use sp_core::crypto::AccountId32; -pub use xcm::{ - prelude::{AccountId32 as AccountId32Junction, Here}, - v3::prelude::{ - Ancestor, MultiAssets, MultiLocation, Parachain as ParachainJunction, Parent, WeightLimit, - XcmHash, X1, - }, +pub use xcm::latest::prelude::{ + AccountId32 as AccountId32Junction, Ancestor, Assets, Here, Location, + Parachain as ParachainJunction, Parent, WeightLimit, XcmHash, }; pub use xcm_executor::traits::ConvertLocation; @@ -231,11 +228,11 @@ pub trait RelayChain: Chain { fn init(); - fn child_location_of(id: ParaId) -> MultiLocation { + fn child_location_of(id: ParaId) -> Location { (Ancestor(0), ParachainJunction(id.into())).into() } - fn sovereign_account_id_of(location: MultiLocation) -> AccountIdOf { + fn sovereign_account_id_of(location: Location) -> AccountIdOf { Self::SovereignAccountOf::convert_location(&location).unwrap() } @@ -263,15 +260,15 @@ pub trait Parachain: Chain { Self::ext_wrapper(|| Self::ParachainInfo::get()) } - fn parent_location() -> MultiLocation { + fn parent_location() -> Location { (Parent).into() } - fn sibling_location_of(para_id: ParaId) -> MultiLocation { - (Parent, X1(ParachainJunction(para_id.into()))).into() + fn sibling_location_of(para_id: ParaId) -> Location { + (Parent, ParachainJunction(para_id.into())).into() } - fn sovereign_account_id_of(location: MultiLocation) -> AccountIdOf { + fn sovereign_account_id_of(location: Location) -> AccountIdOf { Self::LocationToAccountId::convert_location(&location).unwrap() } } @@ -1432,10 +1429,10 @@ pub struct TestAccount { /// Default `Args` provided by xcm-emulator to be stored in a `Test` instance #[derive(Clone)] pub struct TestArgs { - pub dest: MultiLocation, - pub beneficiary: MultiLocation, + pub dest: Location, + pub beneficiary: Location, pub amount: Balance, - pub assets: MultiAssets, + pub assets: Assets, pub asset_id: Option, pub fee_asset_item: u32, pub weight_limit: WeightLimit, @@ -1443,7 +1440,7 @@ pub struct TestArgs { impl TestArgs { /// Returns a [`TestArgs`] instance to be used for the Relay Chain across integration tests. - pub fn new_relay(dest: MultiLocation, beneficiary_id: AccountId32, amount: Balance) -> Self { + pub fn new_relay(dest: Location, beneficiary_id: AccountId32, amount: Balance) -> Self { Self { dest, beneficiary: AccountId32Junction { network: None, id: beneficiary_id.into() }.into(), @@ -1457,10 +1454,10 @@ impl TestArgs { /// Returns a [`TestArgs`] instance to be used for parachains across integration tests. pub fn new_para( - dest: MultiLocation, + dest: Location, beneficiary_id: AccountId32, amount: Balance, - assets: MultiAssets, + assets: Assets, asset_id: Option, fee_asset_item: u32, ) -> Self { diff --git a/polkadot/runtime/common/src/impls.rs b/polkadot/runtime/common/src/impls.rs index d71c626cd98..a9edb196627 100644 --- a/polkadot/runtime/common/src/impls.rs +++ b/polkadot/runtime/common/src/impls.rs @@ -21,7 +21,7 @@ use frame_support::traits::{Currency, Imbalance, OnUnbalanced}; use parity_scale_codec::{Decode, Encode, MaxEncodedLen}; use primitives::Balance; use sp_runtime::{traits::TryConvert, Perquintill, RuntimeDebug}; -use xcm::VersionedMultiLocation; +use xcm::VersionedLocation; /// Logic for the author to get a portion of fees. pub struct ToAuthor(sp_std::marker::PhantomData); @@ -107,12 +107,9 @@ pub fn era_payout( )] pub enum VersionedLocatableAsset { #[codec(index = 3)] - V3 { - /// The (relative) location in which the asset ID is meaningful. - location: xcm::v3::MultiLocation, - /// The asset's ID. - asset_id: xcm::v3::AssetId, - }, + V3 { location: xcm::v3::MultiLocation, asset_id: xcm::v3::AssetId }, + #[codec(index = 4)] + V4 { location: xcm::v4::Location, asset_id: xcm::v4::AssetId }, } /// Converts the [`VersionedLocatableAsset`] to the [`xcm_builder::LocatableAssetId`]. @@ -125,22 +122,29 @@ impl TryConvert ) -> Result { match asset { VersionedLocatableAsset::V3 { location, asset_id } => - Ok(xcm_builder::LocatableAssetId { asset_id, location }), + Ok(xcm_builder::LocatableAssetId { + location: location.try_into().map_err(|_| asset.clone())?, + asset_id: asset_id.try_into().map_err(|_| asset.clone())?, + }), + VersionedLocatableAsset::V4 { location, asset_id } => + Ok(xcm_builder::LocatableAssetId { location, asset_id }), } } } -/// Converts the [`VersionedMultiLocation`] to the [`xcm::latest::MultiLocation`]. -pub struct VersionedMultiLocationConverter; -impl TryConvert<&VersionedMultiLocation, xcm::latest::MultiLocation> - for VersionedMultiLocationConverter -{ +/// Converts the [`VersionedLocation`] to the [`xcm::latest::Location`]. +pub struct VersionedLocationConverter; +impl TryConvert<&VersionedLocation, xcm::latest::Location> for VersionedLocationConverter { fn try_convert( - location: &VersionedMultiLocation, - ) -> Result { + location: &VersionedLocation, + ) -> Result { let latest = match location.clone() { - VersionedMultiLocation::V2(l) => l.try_into().map_err(|_| location)?, - VersionedMultiLocation::V3(l) => l, + VersionedLocation::V2(l) => { + let v3: xcm::v3::MultiLocation = l.try_into().map_err(|_| location)?; + v3.try_into().map_err(|_| location)? + }, + VersionedLocation::V3(l) => l.try_into().map_err(|_| location)?, + VersionedLocation::V4(l) => l, }; Ok(latest) } @@ -161,11 +165,14 @@ pub mod benchmarks { pub struct AssetRateArguments; impl AssetKindFactory for AssetRateArguments { fn create_asset_kind(seed: u32) -> VersionedLocatableAsset { - VersionedLocatableAsset::V3 { - location: xcm::v3::MultiLocation::new(0, X1(Parachain(seed))), - asset_id: xcm::v3::MultiLocation::new( + VersionedLocatableAsset::V4 { + location: xcm::v4::Location::new(0, [xcm::v4::Junction::Parachain(seed)]), + asset_id: xcm::v4::Location::new( 0, - X2(PalletInstance(seed.try_into().unwrap()), GeneralIndex(seed.into())), + [ + xcm::v4::Junction::PalletInstance(seed.try_into().unwrap()), + xcm::v4::Junction::GeneralIndex(seed.into()), + ], ) .into(), } @@ -173,29 +180,35 @@ pub mod benchmarks { } /// Provide factory methods for the [`VersionedLocatableAsset`] and the `Beneficiary` of the - /// [`VersionedMultiLocation`]. The location of the asset is determined as a Parachain with an + /// [`VersionedLocation`]. The location of the asset is determined as a Parachain with an /// ID equal to the passed seed. pub struct TreasuryArguments, ParaId = ConstU32<0>>( PhantomData<(Parents, ParaId)>, ); impl, ParaId: Get> - TreasuryArgumentsFactory + TreasuryArgumentsFactory for TreasuryArguments { fn create_asset_kind(seed: u32) -> VersionedLocatableAsset { VersionedLocatableAsset::V3 { - location: xcm::v3::MultiLocation::new(Parents::get(), X1(Parachain(ParaId::get()))), + location: xcm::v3::MultiLocation::new( + Parents::get(), + [xcm::v3::Junction::Parachain(ParaId::get())], + ), asset_id: xcm::v3::MultiLocation::new( 0, - X2(PalletInstance(seed.try_into().unwrap()), GeneralIndex(seed.into())), + [ + xcm::v3::Junction::PalletInstance(seed.try_into().unwrap()), + xcm::v3::Junction::GeneralIndex(seed.into()), + ], ) .into(), } } - fn create_beneficiary(seed: [u8; 32]) -> VersionedMultiLocation { - VersionedMultiLocation::V3(xcm::v3::MultiLocation::new( + fn create_beneficiary(seed: [u8; 32]) -> VersionedLocation { + VersionedLocation::V4(xcm::v4::Location::new( 0, - X1(AccountId32 { network: None, id: seed }), + [xcm::v4::Junction::AccountId32 { network: None, id: seed }], )) } } diff --git a/polkadot/runtime/common/src/xcm_sender.rs b/polkadot/runtime/common/src/xcm_sender.rs index 4d31c92cdd3..7f1100a1361 100644 --- a/polkadot/runtime/common/src/xcm_sender.rs +++ b/polkadot/runtime/common/src/xcm_sender.rs @@ -35,13 +35,13 @@ pub trait PriceForMessageDelivery { /// Type used for charging different prices to different destinations type Id; /// Return the assets required to deliver `message` to the given `para` destination. - fn price_for_delivery(id: Self::Id, message: &Xcm<()>) -> MultiAssets; + fn price_for_delivery(id: Self::Id, message: &Xcm<()>) -> Assets; } impl PriceForMessageDelivery for () { type Id = (); - fn price_for_delivery(_: Self::Id, _: &Xcm<()>) -> MultiAssets { - MultiAssets::new() + fn price_for_delivery(_: Self::Id, _: &Xcm<()>) -> Assets { + Assets::new() } } @@ -49,17 +49,17 @@ pub struct NoPriceForMessageDelivery(PhantomData); impl PriceForMessageDelivery for NoPriceForMessageDelivery { type Id = Id; - fn price_for_delivery(_: Self::Id, _: &Xcm<()>) -> MultiAssets { - MultiAssets::new() + fn price_for_delivery(_: Self::Id, _: &Xcm<()>) -> Assets { + Assets::new() } } /// Implementation of [`PriceForMessageDelivery`] which returns a fixed price. pub struct ConstantPrice(sp_std::marker::PhantomData); -impl> PriceForMessageDelivery for ConstantPrice { +impl> PriceForMessageDelivery for ConstantPrice { type Id = (); - fn price_for_delivery(_: Self::Id, _: &Xcm<()>) -> MultiAssets { + fn price_for_delivery(_: Self::Id, _: &Xcm<()>) -> Assets { T::get() } } @@ -84,7 +84,7 @@ impl, B: Get, M: Get, F: FeeTracker> PriceForMessage { type Id = F::Id; - fn price_for_delivery(id: Self::Id, msg: &Xcm<()>) -> MultiAssets { + fn price_for_delivery(id: Self::Id, msg: &Xcm<()>) -> Assets { let msg_fee = (msg.encoded_size() as u128).saturating_mul(M::get()); let fee_sum = B::get().saturating_add(msg_fee); let amount = F::get_fee_factor(id).saturating_mul_int(fee_sum); @@ -103,11 +103,11 @@ where type Ticket = (HostConfiguration>, ParaId, Vec); fn validate( - dest: &mut Option, + dest: &mut Option, msg: &mut Option>, ) -> SendResult<(HostConfiguration>, ParaId, Vec)> { let d = dest.take().ok_or(MissingArgument)?; - let id = if let MultiLocation { parents: 0, interior: X1(Parachain(id)) } = &d { + let id = if let (0, [Parachain(id)]) = d.unpack() { *id } else { *dest = Some(d); @@ -160,7 +160,7 @@ pub struct ToParachainDeliveryHelper< #[cfg(feature = "runtime-benchmarks")] impl< XcmConfig: xcm_executor::Config, - ExistentialDeposit: Get>, + ExistentialDeposit: Get>, PriceForDelivery: PriceForMessageDelivery, Parachain: Get, ToParachainHelper: EnsureForParachain, @@ -174,10 +174,10 @@ impl< > { fn ensure_successful_delivery( - origin_ref: &MultiLocation, - _dest: &MultiLocation, + origin_ref: &Location, + _dest: &Location, fee_reason: xcm_executor::traits::FeeReason, - ) -> (Option, Option) { + ) -> (Option, Option) { use xcm_executor::{ traits::{FeeManager, TransactAsset}, FeesMode, @@ -234,7 +234,7 @@ mod tests { parameter_types! { pub const BaseDeliveryFee: u128 = 300_000_000; pub const TransactionByteFee: u128 = 1_000_000; - pub FeeAssetId: AssetId = Concrete(Here.into()); + pub FeeAssetId: AssetId = AssetId(Here.into()); } struct TestFeeTracker; diff --git a/polkadot/runtime/parachains/src/coretime/migration.rs b/polkadot/runtime/parachains/src/coretime/migration.rs index c720cf0617a..e64d3fbd6a9 100644 --- a/polkadot/runtime/parachains/src/coretime/migration.rs +++ b/polkadot/runtime/parachains/src/coretime/migration.rs @@ -46,9 +46,7 @@ mod v_coretime { #[cfg(feature = "try-runtime")] use sp_std::vec::Vec; use sp_std::{iter, prelude::*, result}; - use xcm::v3::{ - send_xcm, Instruction, Junction, Junctions, MultiLocation, SendError, WeightLimit, Xcm, - }; + use xcm::v4::{send_xcm, Instruction, Junction, Location, SendError, WeightLimit, Xcm}; /// Return information about a legacy lease of a parachain. pub trait GetLegacyLease { @@ -64,7 +62,7 @@ mod v_coretime { sp_std::marker::PhantomData<(T, SendXcm, LegacyLease)>, ); - impl>> + impl>> MigrateToCoretime { fn already_migrated() -> bool { @@ -95,7 +93,7 @@ mod v_coretime { impl< T: Config + crate::dmp::Config, - SendXcm: xcm::v3::SendXcm, + SendXcm: xcm::v4::SendXcm, LegacyLease: GetLegacyLease>, > OnRuntimeUpgrade for MigrateToCoretime { @@ -155,7 +153,7 @@ mod v_coretime { // NOTE: Also migrates coretime_cores config value in configuration::ActiveConfig. fn migrate_to_coretime< T: Config, - SendXcm: xcm::v3::SendXcm, + SendXcm: xcm::v4::SendXcm, LegacyLease: GetLegacyLease>, >() -> Weight { let legacy_paras = paras::Pallet::::parachains(); @@ -209,7 +207,7 @@ mod v_coretime { fn migrate_send_assignments_to_coretime_chain< T: Config, - SendXcm: xcm::v3::SendXcm, + SendXcm: xcm::v4::SendXcm, LegacyLease: GetLegacyLease>, >() -> result::Result<(), SendError> { let legacy_paras = paras::Pallet::::parachains(); @@ -280,10 +278,7 @@ mod v_coretime { for message in messages { send_xcm::( - MultiLocation { - parents: 0, - interior: Junctions::X1(Junction::Parachain(T::BrokerId::get())), - }, + Location::new(0, Junction::Parachain(T::BrokerId::get())), message, )?; } diff --git a/polkadot/runtime/parachains/src/coretime/mod.rs b/polkadot/runtime/parachains/src/coretime/mod.rs index aa074a293c9..531f5c2e4e4 100644 --- a/polkadot/runtime/parachains/src/coretime/mod.rs +++ b/polkadot/runtime/parachains/src/coretime/mod.rs @@ -26,10 +26,7 @@ pub use pallet::*; use pallet_broker::{CoreAssignment, CoreIndex as BrokerCoreIndex}; use primitives::{CoreIndex, Id as ParaId}; use sp_arithmetic::traits::SaturatedConversion; -use xcm::v3::{ - send_xcm, Instruction, Junction, Junctions, MultiLocation, OriginKind, SendXcm, WeightLimit, - Xcm, -}; +use xcm::v4::{send_xcm, Instruction, Junction, Location, OriginKind, SendXcm, WeightLimit, Xcm}; use crate::{ assigner_coretime::{self, PartsOf57600}, @@ -229,10 +226,7 @@ impl Pallet { mk_coretime_call(crate::coretime::CoretimeCalls::NotifyCoreCount(core_count)), ]); if let Err(err) = send_xcm::( - MultiLocation { - parents: 0, - interior: Junctions::X1(Junction::Parachain(T::BrokerId::get())), - }, + Location::new(0, [Junction::Parachain(T::BrokerId::get())]), message, ) { log::error!("Sending `NotifyCoreCount` to coretime chain failed: {:?}", err); diff --git a/polkadot/runtime/parachains/src/mock.rs b/polkadot/runtime/parachains/src/mock.rs index fbaab1d24aa..c08bab0ef0f 100644 --- a/polkadot/runtime/parachains/src/mock.rs +++ b/polkadot/runtime/parachains/src/mock.rs @@ -52,7 +52,7 @@ use sp_runtime::{ }; use sp_std::collections::vec_deque::VecDeque; use std::{cell::RefCell, collections::HashMap}; -use xcm::v3::{MultiAssets, MultiLocation, SendError, SendResult, SendXcm, Xcm, XcmHash}; +use xcm::v4::{Assets, Location, SendError, SendResult, SendXcm, Xcm, XcmHash}; type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; type Block = frame_system::mocking::MockBlockU32; @@ -384,11 +384,8 @@ impl coretime::Config for Test { pub struct DummyXcmSender; impl SendXcm for DummyXcmSender { type Ticket = (); - fn validate( - _: &mut Option, - _: &mut Option>, - ) -> SendResult { - Ok(((), MultiAssets::new())) + fn validate(_: &mut Option, _: &mut Option>) -> SendResult { + Ok(((), Assets::new())) } /// Actually carry out the delivery operation for a previously validated message sending. diff --git a/polkadot/runtime/rococo/src/impls.rs b/polkadot/runtime/rococo/src/impls.rs index eddbfacc3b1..ac7100d7858 100644 --- a/polkadot/runtime/rococo/src/impls.rs +++ b/polkadot/runtime/rococo/src/impls.rs @@ -22,7 +22,7 @@ use primitives::Balance; use rococo_runtime_constants::currency::*; use runtime_common::identity_migrator::{OnReapIdentity, WeightInfo}; use sp_std::{marker::PhantomData, prelude::*}; -use xcm::{latest::prelude::*, VersionedMultiLocation, VersionedXcm}; +use xcm::{latest::prelude::*, VersionedLocation, VersionedXcm}; use xcm_executor::traits::TransactAsset; /// A type containing the encoding of the People Chain pallets in its runtime. Used to construct any @@ -95,9 +95,9 @@ where let total_to_send = Self::calculate_remote_deposit(fields, subs); // define asset / destination from relay perspective - let roc = MultiAsset { id: Concrete(Here.into_location()), fun: Fungible(total_to_send) }; + let roc = Asset { id: AssetId(Here.into_location()), fun: Fungible(total_to_send) }; // People Chain: ParaId 1004 - let destination: MultiLocation = MultiLocation::new(0, Parachain(1004)); + let destination: Location = Location::new(0, Parachain(1004)); // Do `check_out` accounting since the XCM Executor's `InitiateTeleport` doesn't support // unpaid teleports. @@ -138,11 +138,9 @@ where ); // reanchor - let roc_reanchored: MultiAssets = vec![MultiAsset { - id: Concrete(MultiLocation::new(1, Here)), - fun: Fungible(total_to_send), - }] - .into(); + let roc_reanchored: Assets = + vec![Asset { id: AssetId(Location::new(1, Here)), fun: Fungible(total_to_send) }] + .into(); let poke = PeopleRuntimePallets::::IdentityMigrator(PokeDeposit(who.clone())); let remote_weight_limit = MigratorWeights::::poke_deposit().saturating_mul(2); @@ -172,8 +170,8 @@ where // send let _ = >::send( RawOrigin::Root.into(), - Box::new(VersionedMultiLocation::V3(destination)), - Box::new(VersionedXcm::V3(program)), + Box::new(VersionedLocation::V4(destination)), + Box::new(VersionedXcm::V4(program)), )?; Ok(()) } diff --git a/polkadot/runtime/rococo/src/lib.rs b/polkadot/runtime/rococo/src/lib.rs index e492caddc8f..fec82fc86f9 100644 --- a/polkadot/runtime/rococo/src/lib.rs +++ b/polkadot/runtime/rococo/src/lib.rs @@ -35,7 +35,7 @@ use rococo_runtime_constants::system_parachain::BROKER_ID; use runtime_common::{ assigned_slots, auctions, claims, crowdloan, identity_migrator, impl_runtime_weights, impls::{ - LocatableAssetConverter, ToAuthor, VersionedLocatableAsset, VersionedMultiLocationConverter, + LocatableAssetConverter, ToAuthor, VersionedLocatableAsset, VersionedLocationConverter, }, paras_registrar, paras_sudo_wrapper, prod_or_fast, slots, traits::Leaser, @@ -99,10 +99,7 @@ use sp_staking::SessionIndex; #[cfg(any(feature = "std", test))] use sp_version::NativeVersion; use sp_version::RuntimeVersion; -use xcm::{ - latest::{InteriorMultiLocation, Junction, Junction::PalletInstance}, - VersionedMultiLocation, -}; +use xcm::{latest::prelude::*, VersionedLocation}; use xcm_builder::PayOverXcm; pub use frame_system::Call as SystemCall; @@ -461,7 +458,7 @@ parameter_types! { pub const PayoutSpendPeriod: BlockNumber = 30 * DAYS; // The asset's interior location for the paying account. This is the Treasury // pallet instance (which sits at index 18). - pub TreasuryInteriorLocation: InteriorMultiLocation = PalletInstance(18).into(); + pub TreasuryInteriorLocation: InteriorLocation = PalletInstance(18).into(); pub const TipCountdown: BlockNumber = 1 * DAYS; pub const TipFindersFee: Percent = Percent::from_percent(20); @@ -492,7 +489,7 @@ impl pallet_treasury::Config for Runtime { type SpendFunds = Bounties; type SpendOrigin = TreasurySpender; type AssetKind = VersionedLocatableAsset; - type Beneficiary = VersionedMultiLocation; + type Beneficiary = VersionedLocation; type BeneficiaryLookup = IdentityLookup; type Paymaster = PayOverXcm< TreasuryInteriorLocation, @@ -502,7 +499,7 @@ impl pallet_treasury::Config for Runtime { Self::Beneficiary, Self::AssetKind, LocatableAssetConverter, - VersionedMultiLocationConverter, + VersionedLocationConverter, >; type BalanceConverter = AssetRate; type PayoutPeriod = PayoutSpendPeriod; @@ -538,7 +535,7 @@ impl pallet_bounties::Config for Runtime { parameter_types! { pub const MaxActiveChildBountyCount: u32 = 100; - pub const ChildBountyValueMinimum: Balance = BountyValueMinimum::get() / 10; + pub ChildBountyValueMinimum: Balance = BountyValueMinimum::get() / 10; } impl pallet_child_bounties::Config for Runtime { @@ -1209,7 +1206,7 @@ impl pallet_nis::Config for Runtime { } parameter_types! { - pub const BeefySetIdSessionEntries: u32 = BondingDuration::get() * SessionsPerEra::get(); + pub BeefySetIdSessionEntries: u32 = BondingDuration::get() * SessionsPerEra::get(); } impl pallet_beefy::Config for Runtime { @@ -2270,7 +2267,7 @@ sp_api::impl_runtime_apis! { }; parameter_types! { - pub ExistentialDepositMultiAsset: Option = Some(( + pub ExistentialDepositAsset: Option = Some(( TokenLocation::get(), ExistentialDeposit::get() ).into()); @@ -2280,34 +2277,34 @@ sp_api::impl_runtime_apis! { impl frame_system_benchmarking::Config for Runtime {} impl frame_benchmarking::baseline::Config for Runtime {} impl pallet_xcm::benchmarking::Config for Runtime { - fn reachable_dest() -> Option { + fn reachable_dest() -> Option { Some(crate::xcm_config::AssetHub::get()) } - fn teleportable_asset_and_dest() -> Option<(MultiAsset, MultiLocation)> { + fn teleportable_asset_and_dest() -> Option<(Asset, Location)> { // Relay/native token can be teleported to/from AH. Some(( - MultiAsset { + Asset { fun: Fungible(EXISTENTIAL_DEPOSIT), - id: Concrete(Here.into()) + id: AssetId(Here.into()) }, crate::xcm_config::AssetHub::get(), )) } - fn reserve_transferable_asset_and_dest() -> Option<(MultiAsset, MultiLocation)> { + fn reserve_transferable_asset_and_dest() -> Option<(Asset, Location)> { // Relay can reserve transfer native token to some random parachain. Some(( - MultiAsset { + Asset { fun: Fungible(EXISTENTIAL_DEPOSIT), - id: Concrete(Here.into()) + id: AssetId(Here.into()) }, Parachain(43211234).into(), )) } fn set_up_complex_asset_transfer( - ) -> Option<(MultiAssets, u32, MultiLocation, Box)> { + ) -> Option<(Assets, u32, Location, Box)> { // Relay supports only native token, either reserve transfer it to non-system parachains, // or teleport it to system parachain. Use the teleport case for benchmarking as it's // slightly heavier. @@ -2325,29 +2322,29 @@ sp_api::impl_runtime_apis! { type AccountIdConverter = LocationConverter; type DeliveryHelper = runtime_common::xcm_sender::ToParachainDeliveryHelper< XcmConfig, - ExistentialDepositMultiAsset, + ExistentialDepositAsset, xcm_config::PriceForChildParachainDelivery, ToParachain, (), >; - fn valid_destination() -> Result { + fn valid_destination() -> Result { Ok(AssetHub::get()) } - fn worst_case_holding(_depositable_count: u32) -> MultiAssets { + fn worst_case_holding(_depositable_count: u32) -> Assets { // Rococo only knows about ROC - vec![MultiAsset{ - id: Concrete(TokenLocation::get()), + vec![Asset{ + id: AssetId(TokenLocation::get()), fun: Fungible(1_000_000 * UNITS), }].into() } } parameter_types! { - pub const TrustedTeleporter: Option<(MultiLocation, MultiAsset)> = Some(( + pub TrustedTeleporter: Option<(Location, Asset)> = Some(( AssetHub::get(), - MultiAsset { fun: Fungible(1 * UNITS), id: Concrete(TokenLocation::get()) }, + Asset { fun: Fungible(1 * UNITS), id: AssetId(TokenLocation::get()) }, )); - pub const TrustedReserve: Option<(MultiLocation, MultiAsset)> = None; + pub TrustedReserve: Option<(Location, Asset)> = None; } impl pallet_xcm_benchmarks::fungible::Config for Runtime { @@ -2357,9 +2354,9 @@ sp_api::impl_runtime_apis! { type TrustedTeleporter = TrustedTeleporter; type TrustedReserve = TrustedReserve; - fn get_multi_asset() -> MultiAsset { - MultiAsset { - id: Concrete(TokenLocation::get()), + fn get_asset() -> Asset { + Asset { + id: AssetId(TokenLocation::get()), fun: Fungible(1 * UNITS), } } @@ -2373,43 +2370,43 @@ sp_api::impl_runtime_apis! { (0u64, Response::Version(Default::default())) } - fn worst_case_asset_exchange() -> Result<(MultiAssets, MultiAssets), BenchmarkError> { + fn worst_case_asset_exchange() -> Result<(Assets, Assets), BenchmarkError> { // Rococo doesn't support asset exchanges Err(BenchmarkError::Skip) } - fn universal_alias() -> Result<(MultiLocation, Junction), BenchmarkError> { + fn universal_alias() -> Result<(Location, Junction), BenchmarkError> { // The XCM executor of Rococo doesn't have a configured `UniversalAliases` Err(BenchmarkError::Skip) } - fn transact_origin_and_runtime_call() -> Result<(MultiLocation, RuntimeCall), BenchmarkError> { + fn transact_origin_and_runtime_call() -> Result<(Location, RuntimeCall), BenchmarkError> { Ok((AssetHub::get(), frame_system::Call::remark_with_event { remark: vec![] }.into())) } - fn subscribe_origin() -> Result { + fn subscribe_origin() -> Result { Ok(AssetHub::get()) } - fn claimable_asset() -> Result<(MultiLocation, MultiLocation, MultiAssets), BenchmarkError> { + fn claimable_asset() -> Result<(Location, Location, Assets), BenchmarkError> { let origin = AssetHub::get(); - let assets: MultiAssets = (Concrete(TokenLocation::get()), 1_000 * UNITS).into(); - let ticket = MultiLocation { parents: 0, interior: Here }; + let assets: Assets = (AssetId(TokenLocation::get()), 1_000 * UNITS).into(); + let ticket = Location { parents: 0, interior: Here }; Ok((origin, ticket, assets)) } - fn unlockable_asset() -> Result<(MultiLocation, MultiLocation, MultiAsset), BenchmarkError> { + fn unlockable_asset() -> Result<(Location, Location, Asset), BenchmarkError> { // Rococo doesn't support asset locking Err(BenchmarkError::Skip) } fn export_message_origin_and_destination( - ) -> Result<(MultiLocation, NetworkId, InteriorMultiLocation), BenchmarkError> { + ) -> Result<(Location, NetworkId, InteriorLocation), BenchmarkError> { // Rococo doesn't support exporting messages Err(BenchmarkError::Skip) } - fn alias_origin() -> Result<(MultiLocation, MultiLocation), BenchmarkError> { + fn alias_origin() -> Result<(Location, Location), BenchmarkError> { // The XCM executor of Rococo doesn't have a configured `Aliasers` Err(BenchmarkError::Skip) } diff --git a/polkadot/runtime/rococo/src/weights/xcm/mod.rs b/polkadot/runtime/rococo/src/weights/xcm/mod.rs index cc485dfbaf7..12f3df897b1 100644 --- a/polkadot/runtime/rococo/src/weights/xcm/mod.rs +++ b/polkadot/runtime/rococo/src/weights/xcm/mod.rs @@ -33,25 +33,25 @@ pub enum AssetTypes { Unknown, } -impl From<&MultiAsset> for AssetTypes { - fn from(asset: &MultiAsset) -> Self { +impl From<&Asset> for AssetTypes { + fn from(asset: &Asset) -> Self { match asset { - MultiAsset { id: Concrete(MultiLocation { parents: 0, interior: Here }), .. } => + Asset { id: AssetId(Location { parents: 0, interior: Here }), .. } => AssetTypes::Balances, _ => AssetTypes::Unknown, } } } -trait WeighMultiAssets { - fn weigh_multi_assets(&self, balances_weight: Weight) -> Weight; +trait WeighAssets { + fn weigh_assets(&self, balances_weight: Weight) -> Weight; } // Rococo only knows about one asset, the balances pallet. const MAX_ASSETS: u64 = 1; -impl WeighMultiAssets for MultiAssetFilter { - fn weigh_multi_assets(&self, balances_weight: Weight) -> Weight { +impl WeighAssets for AssetFilter { + fn weigh_assets(&self, balances_weight: Weight) -> Weight { match self { Self::Definite(assets) => assets .inner() @@ -72,11 +72,11 @@ impl WeighMultiAssets for MultiAssetFilter { } } -impl WeighMultiAssets for MultiAssets { - fn weigh_multi_assets(&self, balances_weight: Weight) -> Weight { +impl WeighAssets for Assets { + fn weigh_assets(&self, balances_weight: Weight) -> Weight { self.inner() .into_iter() - .map(|m| >::from(m)) + .map(|m| >::from(m)) .map(|t| match t { AssetTypes::Balances => balances_weight, AssetTypes::Unknown => Weight::MAX, @@ -87,32 +87,28 @@ impl WeighMultiAssets for MultiAssets { pub struct RococoXcmWeight(core::marker::PhantomData); impl XcmWeightInfo for RococoXcmWeight { - fn withdraw_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmBalancesWeight::::withdraw_asset()) + fn withdraw_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmBalancesWeight::::withdraw_asset()) } - fn reserve_asset_deposited(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmBalancesWeight::::reserve_asset_deposited()) + fn reserve_asset_deposited(assets: &Assets) -> Weight { + assets.weigh_assets(XcmBalancesWeight::::reserve_asset_deposited()) } - fn receive_teleported_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmBalancesWeight::::receive_teleported_asset()) + fn receive_teleported_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmBalancesWeight::::receive_teleported_asset()) } fn query_response( _query_id: &u64, _response: &Response, _max_weight: &Weight, - _querier: &Option, + _querier: &Option, ) -> Weight { XcmGeneric::::query_response() } - fn transfer_asset(assets: &MultiAssets, _dest: &MultiLocation) -> Weight { - assets.weigh_multi_assets(XcmBalancesWeight::::transfer_asset()) + fn transfer_asset(assets: &Assets, _dest: &Location) -> Weight { + assets.weigh_assets(XcmBalancesWeight::::transfer_asset()) } - fn transfer_reserve_asset( - assets: &MultiAssets, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmBalancesWeight::::transfer_reserve_asset()) + fn transfer_reserve_asset(assets: &Assets, _dest: &Location, _xcm: &Xcm<()>) -> Weight { + assets.weigh_assets(XcmBalancesWeight::::transfer_reserve_asset()) } fn transact( _origin_kind: &OriginKind, @@ -140,45 +136,37 @@ impl XcmWeightInfo for RococoXcmWeight { fn clear_origin() -> Weight { XcmGeneric::::clear_origin() } - fn descend_origin(_who: &InteriorMultiLocation) -> Weight { + fn descend_origin(_who: &InteriorLocation) -> Weight { XcmGeneric::::descend_origin() } fn report_error(_query_response_info: &QueryResponseInfo) -> Weight { XcmGeneric::::report_error() } - fn deposit_asset(assets: &MultiAssetFilter, _dest: &MultiLocation) -> Weight { - assets.weigh_multi_assets(XcmBalancesWeight::::deposit_asset()) + fn deposit_asset(assets: &AssetFilter, _dest: &Location) -> Weight { + assets.weigh_assets(XcmBalancesWeight::::deposit_asset()) } - fn deposit_reserve_asset( - assets: &MultiAssetFilter, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmBalancesWeight::::deposit_reserve_asset()) + fn deposit_reserve_asset(assets: &AssetFilter, _dest: &Location, _xcm: &Xcm<()>) -> Weight { + assets.weigh_assets(XcmBalancesWeight::::deposit_reserve_asset()) } - fn exchange_asset(_give: &MultiAssetFilter, _receive: &MultiAssets, _maximal: &bool) -> Weight { + fn exchange_asset(_give: &AssetFilter, _receive: &Assets, _maximal: &bool) -> Weight { // Rococo does not currently support exchange asset operations Weight::MAX } fn initiate_reserve_withdraw( - assets: &MultiAssetFilter, - _reserve: &MultiLocation, + assets: &AssetFilter, + _reserve: &Location, _xcm: &Xcm<()>, ) -> Weight { - assets.weigh_multi_assets(XcmBalancesWeight::::initiate_reserve_withdraw()) + assets.weigh_assets(XcmBalancesWeight::::initiate_reserve_withdraw()) } - fn initiate_teleport( - assets: &MultiAssetFilter, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmBalancesWeight::::initiate_teleport()) + fn initiate_teleport(assets: &AssetFilter, _dest: &Location, _xcm: &Xcm<()>) -> Weight { + assets.weigh_assets(XcmBalancesWeight::::initiate_teleport()) } - fn report_holding(_response_info: &QueryResponseInfo, _assets: &MultiAssetFilter) -> Weight { + fn report_holding(_response_info: &QueryResponseInfo, _assets: &AssetFilter) -> Weight { XcmGeneric::::report_holding() } - fn buy_execution(_fees: &MultiAsset, _weight_limit: &WeightLimit) -> Weight { + fn buy_execution(_fees: &Asset, _weight_limit: &WeightLimit) -> Weight { XcmGeneric::::buy_execution() } fn refund_surplus() -> Weight { @@ -193,7 +181,7 @@ impl XcmWeightInfo for RococoXcmWeight { fn clear_error() -> Weight { XcmGeneric::::clear_error() } - fn claim_asset(_assets: &MultiAssets, _ticket: &MultiLocation) -> Weight { + fn claim_asset(_assets: &Assets, _ticket: &Location) -> Weight { XcmGeneric::::claim_asset() } fn trap(_code: &u64) -> Weight { @@ -205,13 +193,13 @@ impl XcmWeightInfo for RococoXcmWeight { fn unsubscribe_version() -> Weight { XcmGeneric::::unsubscribe_version() } - fn burn_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmGeneric::::burn_asset()) + fn burn_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmGeneric::::burn_asset()) } - fn expect_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmGeneric::::expect_asset()) + fn expect_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmGeneric::::expect_asset()) } - fn expect_origin(_origin: &Option) -> Weight { + fn expect_origin(_origin: &Option) -> Weight { XcmGeneric::::expect_origin() } fn expect_error(_error: &Option<(u32, XcmError)>) -> Weight { @@ -246,19 +234,19 @@ impl XcmWeightInfo for RococoXcmWeight { // Rococo relay should not support export message operations Weight::MAX } - fn lock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn lock_asset(_: &Asset, _: &Location) -> Weight { // Rococo does not currently support asset locking operations Weight::MAX } - fn unlock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn unlock_asset(_: &Asset, _: &Location) -> Weight { // Rococo does not currently support asset locking operations Weight::MAX } - fn note_unlockable(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn note_unlockable(_: &Asset, _: &Location) -> Weight { // Rococo does not currently support asset locking operations Weight::MAX } - fn request_unlock(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn request_unlock(_: &Asset, _: &Location) -> Weight { // Rococo does not currently support asset locking operations Weight::MAX } @@ -271,19 +259,19 @@ impl XcmWeightInfo for RococoXcmWeight { fn clear_topic() -> Weight { XcmGeneric::::clear_topic() } - fn alias_origin(_: &MultiLocation) -> Weight { + fn alias_origin(_: &Location) -> Weight { // XCM Executor does not currently support alias origin operations Weight::MAX } - fn unpaid_execution(_: &WeightLimit, _: &Option) -> Weight { + fn unpaid_execution(_: &WeightLimit, _: &Option) -> Weight { XcmGeneric::::unpaid_execution() } } #[test] fn all_counted_has_a_sane_weight_upper_limit() { - let assets = MultiAssetFilter::Wild(AllCounted(4294967295)); + let assets = AssetFilter::Wild(AllCounted(4294967295)); let weight = Weight::from_parts(1000, 1000); - assert_eq!(assets.weigh_multi_assets(weight), weight * MAX_ASSETS); + assert_eq!(assets.weigh_assets(weight), weight * MAX_ASSETS); } diff --git a/polkadot/runtime/rococo/src/xcm_config.rs b/polkadot/runtime/rococo/src/xcm_config.rs index f3a2ca6f3a6..bfa9beb8209 100644 --- a/polkadot/runtime/rococo/src/xcm_config.rs +++ b/polkadot/runtime/rococo/src/xcm_config.rs @@ -24,8 +24,8 @@ use super::{ use crate::governance::StakingAdmin; use frame_support::{ - match_types, parameter_types, - traits::{Equals, Everything, Nothing}, + parameter_types, + traits::{Contains, Equals, Everything, Nothing}, weights::Weight, }; use frame_system::EnsureRoot; @@ -50,10 +50,10 @@ use xcm_builder::{ use xcm_executor::XcmExecutor; parameter_types! { - pub const RootLocation: MultiLocation = MultiLocation::here(); - pub const TokenLocation: MultiLocation = Here.into_location(); + pub TokenLocation: Location = Here.into_location(); + pub RootLocation: Location = Location::here(); pub const ThisNetwork: NetworkId = NetworkId::Rococo; - pub UniversalLocation: InteriorMultiLocation = ThisNetwork::get().into(); + pub UniversalLocation: InteriorLocation = ThisNetwork::get().into(); pub CheckAccount: AccountId = XcmPallet::check_account(); pub LocalCheckAccount: (AccountId, MintLocation) = (CheckAccount::get(), MintLocation::Local); pub TreasuryAccount: AccountId = Treasury::account_id(); @@ -69,7 +69,7 @@ pub type LocationConverter = ( ); /// Our asset transactor. This is what allows us to interest with the runtime facilities from the -/// point of view of XCM-only concepts like `MultiLocation` and `MultiAsset`. +/// point of view of XCM-only concepts like `Location` and `Asset`. /// /// Ours is only aware of the Balances pallet, which is mapped to `RocLocation`. #[allow(deprecated)] @@ -78,7 +78,7 @@ pub type LocalAssetTransactor = XcmCurrencyAdapter< Balances, // Use this currency when it is a fungible asset matching the given location or name: IsConcrete, - // We can convert the MultiLocations with our converter above: + // We can convert the Locations with our converter above: LocationConverter, // Our chain's account ID type (we can't get away without mentioning it explicitly): AccountId, @@ -100,7 +100,7 @@ parameter_types! { /// The amount of weight an XCM operation takes. This is a safe overestimate. pub const BaseXcmWeight: Weight = Weight::from_parts(1_000_000_000, 64 * 1024); /// The asset ID for the asset that we use to pay for message delivery fees. - pub FeeAssetId: AssetId = Concrete(TokenLocation::get()); + pub FeeAssetId: AssetId = AssetId(TokenLocation::get()); /// The base fee for the message delivery fees. pub const BaseDeliveryFee: u128 = CENTS.saturating_mul(3); } @@ -116,25 +116,25 @@ pub type XcmRouter = WithUniqueTopic< >; parameter_types! { - pub const Roc: MultiAssetFilter = Wild(AllOf { fun: WildFungible, id: Concrete(TokenLocation::get()) }); - pub const AssetHub: MultiLocation = Parachain(ASSET_HUB_ID).into_location(); - pub const Contracts: MultiLocation = Parachain(CONTRACTS_ID).into_location(); - pub const Encointer: MultiLocation = Parachain(ENCOINTER_ID).into_location(); - pub const BridgeHub: MultiLocation = Parachain(BRIDGE_HUB_ID).into_location(); - pub const People: MultiLocation = Parachain(PEOPLE_ID).into_location(); - pub const Broker: MultiLocation = Parachain(BROKER_ID).into_location(); - pub const Tick: MultiLocation = Parachain(100).into_location(); - pub const Trick: MultiLocation = Parachain(110).into_location(); - pub const Track: MultiLocation = Parachain(120).into_location(); - pub const RocForTick: (MultiAssetFilter, MultiLocation) = (Roc::get(), Tick::get()); - pub const RocForTrick: (MultiAssetFilter, MultiLocation) = (Roc::get(), Trick::get()); - pub const RocForTrack: (MultiAssetFilter, MultiLocation) = (Roc::get(), Track::get()); - pub const RocForAssetHub: (MultiAssetFilter, MultiLocation) = (Roc::get(), AssetHub::get()); - pub const RocForContracts: (MultiAssetFilter, MultiLocation) = (Roc::get(), Contracts::get()); - pub const RocForEncointer: (MultiAssetFilter, MultiLocation) = (Roc::get(), Encointer::get()); - pub const RocForBridgeHub: (MultiAssetFilter, MultiLocation) = (Roc::get(), BridgeHub::get()); - pub const RocForPeople: (MultiAssetFilter, MultiLocation) = (Roc::get(), People::get()); - pub const RocForBroker: (MultiAssetFilter, MultiLocation) = (Roc::get(), Broker::get()); + pub Roc: AssetFilter = Wild(AllOf { fun: WildFungible, id: AssetId(TokenLocation::get()) }); + pub AssetHub: Location = Parachain(ASSET_HUB_ID).into_location(); + pub Contracts: Location = Parachain(CONTRACTS_ID).into_location(); + pub Encointer: Location = Parachain(ENCOINTER_ID).into_location(); + pub BridgeHub: Location = Parachain(BRIDGE_HUB_ID).into_location(); + pub People: Location = Parachain(PEOPLE_ID).into_location(); + pub Broker: Location = Parachain(BROKER_ID).into_location(); + pub Tick: Location = Parachain(100).into_location(); + pub Trick: Location = Parachain(110).into_location(); + pub Track: Location = Parachain(120).into_location(); + pub RocForTick: (AssetFilter, Location) = (Roc::get(), Tick::get()); + pub RocForTrick: (AssetFilter, Location) = (Roc::get(), Trick::get()); + pub RocForTrack: (AssetFilter, Location) = (Roc::get(), Track::get()); + pub RocForAssetHub: (AssetFilter, Location) = (Roc::get(), AssetHub::get()); + pub RocForContracts: (AssetFilter, Location) = (Roc::get(), Contracts::get()); + pub RocForEncointer: (AssetFilter, Location) = (Roc::get(), Encointer::get()); + pub RocForBridgeHub: (AssetFilter, Location) = (Roc::get(), BridgeHub::get()); + pub RocForPeople: (AssetFilter, Location) = (Roc::get(), People::get()); + pub RocForBroker: (AssetFilter, Location) = (Roc::get(), Broker::get()); pub const MaxInstructions: u32 = 100; pub const MaxAssetsIntoHolding: u32 = 64; } @@ -150,13 +150,18 @@ pub type TrustedTeleporters = ( xcm_builder::Case, ); -match_types! { - pub type OnlyParachains: impl Contains = { - MultiLocation { parents: 0, interior: X1(Parachain(_)) } - }; - pub type LocalPlurality: impl Contains = { - MultiLocation { parents: 0, interior: X1(Plurality { .. }) } - }; +pub struct OnlyParachains; +impl Contains for OnlyParachains { + fn contains(loc: &Location) -> bool { + matches!(loc.unpack(), (0, [Parachain(_)])) + } +} + +pub struct LocalPlurality; +impl Contains for LocalPlurality { + fn contains(loc: &Location) -> bool { + matches!(loc.unpack(), (0, [Plurality { .. }])) + } } /// The barriers one of which must be passed for an XCM message to be executed. @@ -227,26 +232,26 @@ parameter_types! { pub const FellowsBodyId: BodyId = BodyId::Technical; } -/// Type to convert an `Origin` type value into a `MultiLocation` value which represents an interior +/// Type to convert an `Origin` type value into a `Location` value which represents an interior /// location of this chain. pub type LocalOriginToLocation = ( // And a usual Signed origin to be used in XCM as a corresponding AccountId32 SignedToAccountId32, ); -/// Type to convert the `StakingAdmin` origin to a Plurality `MultiLocation` value. +/// Type to convert the `StakingAdmin` origin to a Plurality `Location` value. pub type StakingAdminToPlurality = OriginToPluralityVoice; -/// Type to convert the Fellows origin to a Plurality `MultiLocation` value. +/// Type to convert the Fellows origin to a Plurality `Location` value. pub type FellowsToPlurality = OriginToPluralityVoice; -/// Type to convert a pallet `Origin` type value into a `MultiLocation` value which represents an +/// Type to convert a pallet `Origin` type value into a `Location` value which represents an /// interior location of this chain for a destination chain. pub type LocalPalletOriginToLocation = ( - // StakingAdmin origin to be used in XCM as a corresponding Plurality `MultiLocation` value. + // StakingAdmin origin to be used in XCM as a corresponding Plurality `Location` value. StakingAdminToPlurality, - // Fellows origin to be used in XCM as a corresponding Plurality `MultiLocation` value. + // Fellows origin to be used in XCM as a corresponding Plurality `Location` value. FellowsToPlurality, ); diff --git a/polkadot/runtime/test-runtime/src/lib.rs b/polkadot/runtime/test-runtime/src/lib.rs index f472b619ba7..e80412232d0 100644 --- a/polkadot/runtime/test-runtime/src/lib.rs +++ b/polkadot/runtime/test-runtime/src/lib.rs @@ -604,7 +604,7 @@ pub mod pallet_test_notifier { pub enum Event { QueryPrepared(QueryId), NotifyQueryPrepared(QueryId), - ResponseReceived(MultiLocation, QueryId, Response), + ResponseReceived(Location, QueryId, Response), } #[pallet::error] diff --git a/polkadot/runtime/test-runtime/src/xcm_config.rs b/polkadot/runtime/test-runtime/src/xcm_config.rs index ae4faecf700..d9d3d6e0752 100644 --- a/polkadot/runtime/test-runtime/src/xcm_config.rs +++ b/polkadot/runtime/test-runtime/src/xcm_config.rs @@ -27,7 +27,7 @@ use xcm_builder::{ }; use xcm_executor::{ traits::{TransactAsset, WeightTrader}, - Assets, + AssetsInHolding, }; parameter_types! { @@ -35,10 +35,10 @@ parameter_types! { pub const AnyNetwork: Option = None; pub const MaxInstructions: u32 = 100; pub const MaxAssetsIntoHolding: u32 = 16; - pub const UniversalLocation: xcm::latest::InteriorMultiLocation = xcm::latest::Junctions::Here; + pub const UniversalLocation: xcm::latest::InteriorLocation = xcm::latest::Junctions::Here; } -/// Type to convert an `Origin` type value into a `MultiLocation` value which represents an interior +/// Type to convert an `Origin` type value into a `Location` value which represents an interior /// location of this chain. pub type LocalOriginToLocation = ( // And a usual Signed origin to be used in XCM as a corresponding AccountId32 @@ -48,8 +48,8 @@ pub type LocalOriginToLocation = ( pub struct DoNothingRouter; impl SendXcm for DoNothingRouter { type Ticket = (); - fn validate(_dest: &mut Option, _msg: &mut Option>) -> SendResult<()> { - Ok(((), MultiAssets::new())) + fn validate(_dest: &mut Option, _msg: &mut Option>) -> SendResult<()> { + Ok(((), Assets::new())) } fn deliver(_: ()) -> Result { Ok([0; 32]) @@ -60,20 +60,16 @@ pub type Barrier = AllowUnpaidExecutionFrom; pub struct DummyAssetTransactor; impl TransactAsset for DummyAssetTransactor { - fn deposit_asset( - _what: &MultiAsset, - _who: &MultiLocation, - _context: Option<&XcmContext>, - ) -> XcmResult { + fn deposit_asset(_what: &Asset, _who: &Location, _context: Option<&XcmContext>) -> XcmResult { Ok(()) } fn withdraw_asset( - _what: &MultiAsset, - _who: &MultiLocation, + _what: &Asset, + _who: &Location, _maybe_context: Option<&XcmContext>, - ) -> Result { - let asset: MultiAsset = (Parent, 100_000).into(); + ) -> Result { + let asset: Asset = (Parent, 100_000).into(); Ok(asset.into()) } } @@ -87,10 +83,10 @@ impl WeightTrader for DummyWeightTrader { fn buy_weight( &mut self, _weight: Weight, - _payment: Assets, + _payment: AssetsInHolding, _context: &XcmContext, - ) -> Result { - Ok(Assets::default()) + ) -> Result { + Ok(AssetsInHolding::default()) } } diff --git a/polkadot/runtime/westend/src/impls.rs b/polkadot/runtime/westend/src/impls.rs index 5f23bd373b1..71e6b696a20 100644 --- a/polkadot/runtime/westend/src/impls.rs +++ b/polkadot/runtime/westend/src/impls.rs @@ -22,7 +22,7 @@ use primitives::Balance; use runtime_common::identity_migrator::{OnReapIdentity, WeightInfo}; use sp_std::{marker::PhantomData, prelude::*}; use westend_runtime_constants::currency::*; -use xcm::{latest::prelude::*, VersionedMultiLocation, VersionedXcm}; +use xcm::{latest::prelude::*, VersionedLocation, VersionedXcm}; use xcm_executor::traits::TransactAsset; /// A type containing the encoding of the People Chain pallets in its runtime. Used to construct any @@ -95,9 +95,9 @@ where let total_to_send = Self::calculate_remote_deposit(fields, subs); // define asset / destination from relay perspective - let wnd = MultiAsset { id: Concrete(Here.into_location()), fun: Fungible(total_to_send) }; + let wnd = Asset { id: AssetId(Here.into_location()), fun: Fungible(total_to_send) }; // People Chain: ParaId 1004 - let destination: MultiLocation = MultiLocation::new(0, Parachain(1004)); + let destination: Location = Location::new(0, Parachain(1004)); // Do `check_out` accounting since the XCM Executor's `InitiateTeleport` doesn't support // unpaid teleports. @@ -138,11 +138,9 @@ where ); // reanchor - let wnd_reanchored: MultiAssets = vec![MultiAsset { - id: Concrete(MultiLocation::new(1, Here)), - fun: Fungible(total_to_send), - }] - .into(); + let wnd_reanchored: Assets = + vec![Asset { id: AssetId(Location::new(1, Here)), fun: Fungible(total_to_send) }] + .into(); let poke = PeopleRuntimePallets::::IdentityMigrator(PokeDeposit(who.clone())); let remote_weight_limit = MigratorWeights::::poke_deposit().saturating_mul(2); @@ -172,8 +170,8 @@ where // send let _ = >::send( RawOrigin::Root.into(), - Box::new(VersionedMultiLocation::V3(destination)), - Box::new(VersionedXcm::V3(program)), + Box::new(VersionedLocation::V4(destination)), + Box::new(VersionedXcm::V4(program)), )?; Ok(()) } diff --git a/polkadot/runtime/westend/src/lib.rs b/polkadot/runtime/westend/src/lib.rs index e1416c4b754..92efdf0c0c5 100644 --- a/polkadot/runtime/westend/src/lib.rs +++ b/polkadot/runtime/westend/src/lib.rs @@ -59,7 +59,7 @@ use runtime_common::{ elections::OnChainAccuracy, identity_migrator, impl_runtime_weights, impls::{ - LocatableAssetConverter, ToAuthor, VersionedLocatableAsset, VersionedMultiLocationConverter, + LocatableAssetConverter, ToAuthor, VersionedLocatableAsset, VersionedLocationConverter, }, paras_registrar, paras_sudo_wrapper, prod_or_fast, slots, BalanceToU256, BlockHashCount, BlockLength, CurrencyToVote, SlowAdjustingFeeUpdate, U256ToBalance, @@ -98,8 +98,8 @@ use sp_std::{collections::btree_map::BTreeMap, prelude::*}; use sp_version::NativeVersion; use sp_version::RuntimeVersion; use xcm::{ - latest::{InteriorMultiLocation, Junction, Junction::PalletInstance}, - VersionedMultiLocation, + latest::{InteriorLocation, Junction, Junction::PalletInstance}, + VersionedLocation, }; use xcm_builder::PayOverXcm; @@ -714,7 +714,7 @@ parameter_types! { pub const PayoutSpendPeriod: BlockNumber = 30 * DAYS; // The asset's interior location for the paying account. This is the Treasury // pallet instance (which sits at index 37). - pub TreasuryInteriorLocation: InteriorMultiLocation = PalletInstance(37).into(); + pub TreasuryInteriorLocation: InteriorLocation = PalletInstance(37).into(); pub const TipCountdown: BlockNumber = 1 * DAYS; pub const TipFindersFee: Percent = Percent::from_percent(20); @@ -745,7 +745,7 @@ impl pallet_treasury::Config for Runtime { type SpendFunds = (); type SpendOrigin = TreasurySpender; type AssetKind = VersionedLocatableAsset; - type Beneficiary = VersionedMultiLocation; + type Beneficiary = VersionedLocation; type BeneficiaryLookup = IdentityLookup; type Paymaster = PayOverXcm< TreasuryInteriorLocation, @@ -755,7 +755,7 @@ impl pallet_treasury::Config for Runtime { Self::Beneficiary, Self::AssetKind, LocatableAssetConverter, - VersionedMultiLocationConverter, + VersionedLocationConverter, >; type BalanceConverter = AssetRate; type PayoutPeriod = PayoutSpendPeriod; @@ -2286,31 +2286,31 @@ sp_api::impl_runtime_apis! { impl pallet_offences_benchmarking::Config for Runtime {} impl pallet_election_provider_support_benchmarking::Config for Runtime {} impl pallet_xcm::benchmarking::Config for Runtime { - fn reachable_dest() -> Option { + fn reachable_dest() -> Option { Some(crate::xcm_config::AssetHub::get()) } - fn teleportable_asset_and_dest() -> Option<(MultiAsset, MultiLocation)> { + fn teleportable_asset_and_dest() -> Option<(Asset, Location)> { // Relay/native token can be teleported to/from AH. Some(( - MultiAsset { fun: Fungible(EXISTENTIAL_DEPOSIT), id: Concrete(Here.into()) }, + Asset { fun: Fungible(EXISTENTIAL_DEPOSIT), id: AssetId(Here.into()) }, crate::xcm_config::AssetHub::get(), )) } - fn reserve_transferable_asset_and_dest() -> Option<(MultiAsset, MultiLocation)> { + fn reserve_transferable_asset_and_dest() -> Option<(Asset, Location)> { // Relay can reserve transfer native token to some random parachain. Some(( - MultiAsset { + Asset { fun: Fungible(EXISTENTIAL_DEPOSIT), - id: Concrete(Here.into()) + id: AssetId(Here.into()) }, crate::Junction::Parachain(43211234).into(), )) } fn set_up_complex_asset_transfer( - ) -> Option<(MultiAssets, u32, MultiLocation, Box)> { + ) -> Option<(Assets, u32, Location, Box)> { // Relay supports only native token, either reserve transfer it to non-system parachains, // or teleport it to system parachain. Use the teleport case for benchmarking as it's // slightly heavier. @@ -2329,13 +2329,13 @@ sp_api::impl_runtime_apis! { impl runtime_parachains::disputes::slashing::benchmarking::Config for Runtime {} use xcm::latest::{ - AssetId::*, Fungibility::*, InteriorMultiLocation, Junction, Junctions::*, - MultiAsset, MultiAssets, MultiLocation, NetworkId, Response, + AssetId, Fungibility::*, InteriorLocation, Junction, Junctions::*, + Asset, Assets, Location, NetworkId, Response, }; use xcm_config::{AssetHub, TokenLocation}; parameter_types! { - pub ExistentialDepositMultiAsset: Option = Some(( + pub ExistentialDepositAsset: Option = Some(( TokenLocation::get(), ExistentialDeposit::get() ).into()); @@ -2347,29 +2347,29 @@ sp_api::impl_runtime_apis! { type AccountIdConverter = xcm_config::LocationConverter; type DeliveryHelper = runtime_common::xcm_sender::ToParachainDeliveryHelper< xcm_config::XcmConfig, - ExistentialDepositMultiAsset, + ExistentialDepositAsset, xcm_config::PriceForChildParachainDelivery, ToParachain, (), >; - fn valid_destination() -> Result { + fn valid_destination() -> Result { Ok(AssetHub::get()) } - fn worst_case_holding(_depositable_count: u32) -> MultiAssets { + fn worst_case_holding(_depositable_count: u32) -> Assets { // Westend only knows about WND. - vec![MultiAsset{ - id: Concrete(TokenLocation::get()), + vec![Asset{ + id: AssetId(TokenLocation::get()), fun: Fungible(1_000_000 * UNITS), }].into() } } parameter_types! { - pub const TrustedTeleporter: Option<(MultiLocation, MultiAsset)> = Some(( + pub TrustedTeleporter: Option<(Location, Asset)> = Some(( AssetHub::get(), - MultiAsset { fun: Fungible(1 * UNITS), id: Concrete(TokenLocation::get()) }, + Asset { fun: Fungible(1 * UNITS), id: AssetId(TokenLocation::get()) }, )); - pub const TrustedReserve: Option<(MultiLocation, MultiAsset)> = None; + pub const TrustedReserve: Option<(Location, Asset)> = None; } impl pallet_xcm_benchmarks::fungible::Config for Runtime { @@ -2379,9 +2379,9 @@ sp_api::impl_runtime_apis! { type TrustedTeleporter = TrustedTeleporter; type TrustedReserve = TrustedReserve; - fn get_multi_asset() -> MultiAsset { - MultiAsset { - id: Concrete(TokenLocation::get()), + fn get_asset() -> Asset { + Asset { + id: AssetId(TokenLocation::get()), fun: Fungible(1 * UNITS), } } @@ -2395,43 +2395,43 @@ sp_api::impl_runtime_apis! { (0u64, Response::Version(Default::default())) } - fn worst_case_asset_exchange() -> Result<(MultiAssets, MultiAssets), BenchmarkError> { + fn worst_case_asset_exchange() -> Result<(Assets, Assets), BenchmarkError> { // Westend doesn't support asset exchanges Err(BenchmarkError::Skip) } - fn universal_alias() -> Result<(MultiLocation, Junction), BenchmarkError> { + fn universal_alias() -> Result<(Location, Junction), BenchmarkError> { // The XCM executor of Westend doesn't have a configured `UniversalAliases` Err(BenchmarkError::Skip) } - fn transact_origin_and_runtime_call() -> Result<(MultiLocation, RuntimeCall), BenchmarkError> { + fn transact_origin_and_runtime_call() -> Result<(Location, RuntimeCall), BenchmarkError> { Ok((AssetHub::get(), frame_system::Call::remark_with_event { remark: vec![] }.into())) } - fn subscribe_origin() -> Result { + fn subscribe_origin() -> Result { Ok(AssetHub::get()) } - fn claimable_asset() -> Result<(MultiLocation, MultiLocation, MultiAssets), BenchmarkError> { + fn claimable_asset() -> Result<(Location, Location, Assets), BenchmarkError> { let origin = AssetHub::get(); - let assets: MultiAssets = (Concrete(TokenLocation::get()), 1_000 * UNITS).into(); - let ticket = MultiLocation { parents: 0, interior: Here }; + let assets: Assets = (AssetId(TokenLocation::get()), 1_000 * UNITS).into(); + let ticket = Location { parents: 0, interior: Here }; Ok((origin, ticket, assets)) } - fn unlockable_asset() -> Result<(MultiLocation, MultiLocation, MultiAsset), BenchmarkError> { + fn unlockable_asset() -> Result<(Location, Location, Asset), BenchmarkError> { // Westend doesn't support asset locking Err(BenchmarkError::Skip) } fn export_message_origin_and_destination( - ) -> Result<(MultiLocation, NetworkId, InteriorMultiLocation), BenchmarkError> { + ) -> Result<(Location, NetworkId, InteriorLocation), BenchmarkError> { // Westend doesn't support exporting messages Err(BenchmarkError::Skip) } - fn alias_origin() -> Result<(MultiLocation, MultiLocation), BenchmarkError> { + fn alias_origin() -> Result<(Location, Location), BenchmarkError> { // The XCM executor of Westend doesn't have a configured `Aliasers` Err(BenchmarkError::Skip) } @@ -2503,12 +2503,11 @@ mod remote_tests { mod clean_state_migration { use super::Runtime; + #[cfg(feature = "try-runtime")] + use super::Vec; use frame_support::{pallet_prelude::*, storage_alias, traits::OnRuntimeUpgrade}; use pallet_state_trie_migration::MigrationLimits; - #[cfg(not(feature = "std"))] - use sp_std::prelude::*; - #[storage_alias] type AutoLimits = StorageValue, ValueQuery>; diff --git a/polkadot/runtime/westend/src/weights/xcm/mod.rs b/polkadot/runtime/westend/src/weights/xcm/mod.rs index d5b3d8257ba..0162012825f 100644 --- a/polkadot/runtime/westend/src/weights/xcm/mod.rs +++ b/polkadot/runtime/westend/src/weights/xcm/mod.rs @@ -36,25 +36,25 @@ pub enum AssetTypes { Unknown, } -impl From<&MultiAsset> for AssetTypes { - fn from(asset: &MultiAsset) -> Self { +impl From<&Asset> for AssetTypes { + fn from(asset: &Asset) -> Self { match asset { - MultiAsset { id: Concrete(MultiLocation { parents: 0, interior: Here }), .. } => + Asset { id: AssetId(Location { parents: 0, interior: Here }), .. } => AssetTypes::Balances, _ => AssetTypes::Unknown, } } } -trait WeighMultiAssets { - fn weigh_multi_assets(&self, balances_weight: Weight) -> Weight; +trait WeighAssets { + fn weigh_assets(&self, balances_weight: Weight) -> Weight; } // Westend only knows about one asset, the balances pallet. const MAX_ASSETS: u64 = 1; -impl WeighMultiAssets for MultiAssetFilter { - fn weigh_multi_assets(&self, balances_weight: Weight) -> Weight { +impl WeighAssets for AssetFilter { + fn weigh_assets(&self, balances_weight: Weight) -> Weight { match self { Self::Definite(assets) => assets .inner() @@ -75,11 +75,11 @@ impl WeighMultiAssets for MultiAssetFilter { } } -impl WeighMultiAssets for MultiAssets { - fn weigh_multi_assets(&self, balances_weight: Weight) -> Weight { +impl WeighAssets for Assets { + fn weigh_assets(&self, balances_weight: Weight) -> Weight { self.inner() .into_iter() - .map(|m| >::from(m)) + .map(|m| >::from(m)) .map(|t| match t { AssetTypes::Balances => balances_weight, AssetTypes::Unknown => Weight::MAX, @@ -90,32 +90,28 @@ impl WeighMultiAssets for MultiAssets { pub struct WestendXcmWeight(core::marker::PhantomData); impl XcmWeightInfo for WestendXcmWeight { - fn withdraw_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmBalancesWeight::::withdraw_asset()) + fn withdraw_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmBalancesWeight::::withdraw_asset()) } - fn reserve_asset_deposited(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmBalancesWeight::::reserve_asset_deposited()) + fn reserve_asset_deposited(assets: &Assets) -> Weight { + assets.weigh_assets(XcmBalancesWeight::::reserve_asset_deposited()) } - fn receive_teleported_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmBalancesWeight::::receive_teleported_asset()) + fn receive_teleported_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmBalancesWeight::::receive_teleported_asset()) } fn query_response( _query_id: &u64, _response: &Response, _max_weight: &Weight, - _querier: &Option, + _querier: &Option, ) -> Weight { XcmGeneric::::query_response() } - fn transfer_asset(assets: &MultiAssets, _dest: &MultiLocation) -> Weight { - assets.weigh_multi_assets(XcmBalancesWeight::::transfer_asset()) + fn transfer_asset(assets: &Assets, _dest: &Location) -> Weight { + assets.weigh_assets(XcmBalancesWeight::::transfer_asset()) } - fn transfer_reserve_asset( - assets: &MultiAssets, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmBalancesWeight::::transfer_reserve_asset()) + fn transfer_reserve_asset(assets: &Assets, _dest: &Location, _xcm: &Xcm<()>) -> Weight { + assets.weigh_assets(XcmBalancesWeight::::transfer_reserve_asset()) } fn transact( _origin_kind: &OriginKind, @@ -143,45 +139,37 @@ impl XcmWeightInfo for WestendXcmWeight { fn clear_origin() -> Weight { XcmGeneric::::clear_origin() } - fn descend_origin(_who: &InteriorMultiLocation) -> Weight { + fn descend_origin(_who: &InteriorLocation) -> Weight { XcmGeneric::::descend_origin() } fn report_error(_query_repsonse_info: &QueryResponseInfo) -> Weight { XcmGeneric::::report_error() } - fn deposit_asset(assets: &MultiAssetFilter, _dest: &MultiLocation) -> Weight { - assets.weigh_multi_assets(XcmBalancesWeight::::deposit_asset()) + fn deposit_asset(assets: &AssetFilter, _dest: &Location) -> Weight { + assets.weigh_assets(XcmBalancesWeight::::deposit_asset()) } - fn deposit_reserve_asset( - assets: &MultiAssetFilter, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmBalancesWeight::::deposit_reserve_asset()) + fn deposit_reserve_asset(assets: &AssetFilter, _dest: &Location, _xcm: &Xcm<()>) -> Weight { + assets.weigh_assets(XcmBalancesWeight::::deposit_reserve_asset()) } - fn exchange_asset(_give: &MultiAssetFilter, _receive: &MultiAssets, _maximal: &bool) -> Weight { + fn exchange_asset(_give: &AssetFilter, _receive: &Assets, _maximal: &bool) -> Weight { // Westend does not currently support exchange asset operations Weight::MAX } fn initiate_reserve_withdraw( - assets: &MultiAssetFilter, - _reserve: &MultiLocation, + assets: &AssetFilter, + _reserve: &Location, _xcm: &Xcm<()>, ) -> Weight { - assets.weigh_multi_assets(XcmBalancesWeight::::initiate_reserve_withdraw()) + assets.weigh_assets(XcmBalancesWeight::::initiate_reserve_withdraw()) } - fn initiate_teleport( - assets: &MultiAssetFilter, - _dest: &MultiLocation, - _xcm: &Xcm<()>, - ) -> Weight { - assets.weigh_multi_assets(XcmBalancesWeight::::initiate_teleport()) + fn initiate_teleport(assets: &AssetFilter, _dest: &Location, _xcm: &Xcm<()>) -> Weight { + assets.weigh_assets(XcmBalancesWeight::::initiate_teleport()) } - fn report_holding(_response_info: &QueryResponseInfo, _assets: &MultiAssetFilter) -> Weight { + fn report_holding(_response_info: &QueryResponseInfo, _assets: &AssetFilter) -> Weight { XcmGeneric::::report_holding() } - fn buy_execution(_fees: &MultiAsset, _weight_limit: &WeightLimit) -> Weight { + fn buy_execution(_fees: &Asset, _weight_limit: &WeightLimit) -> Weight { XcmGeneric::::buy_execution() } fn refund_surplus() -> Weight { @@ -196,7 +184,7 @@ impl XcmWeightInfo for WestendXcmWeight { fn clear_error() -> Weight { XcmGeneric::::clear_error() } - fn claim_asset(_assets: &MultiAssets, _ticket: &MultiLocation) -> Weight { + fn claim_asset(_assets: &Assets, _ticket: &Location) -> Weight { XcmGeneric::::claim_asset() } fn trap(_code: &u64) -> Weight { @@ -208,13 +196,13 @@ impl XcmWeightInfo for WestendXcmWeight { fn unsubscribe_version() -> Weight { XcmGeneric::::unsubscribe_version() } - fn burn_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmGeneric::::burn_asset()) + fn burn_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmGeneric::::burn_asset()) } - fn expect_asset(assets: &MultiAssets) -> Weight { - assets.weigh_multi_assets(XcmGeneric::::expect_asset()) + fn expect_asset(assets: &Assets) -> Weight { + assets.weigh_assets(XcmGeneric::::expect_asset()) } - fn expect_origin(_origin: &Option) -> Weight { + fn expect_origin(_origin: &Option) -> Weight { XcmGeneric::::expect_origin() } fn expect_error(_error: &Option<(u32, XcmError)>) -> Weight { @@ -249,19 +237,19 @@ impl XcmWeightInfo for WestendXcmWeight { // Westend relay should not support export message operations Weight::MAX } - fn lock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn lock_asset(_: &Asset, _: &Location) -> Weight { // Westend does not currently support asset locking operations Weight::MAX } - fn unlock_asset(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn unlock_asset(_: &Asset, _: &Location) -> Weight { // Westend does not currently support asset locking operations Weight::MAX } - fn note_unlockable(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn note_unlockable(_: &Asset, _: &Location) -> Weight { // Westend does not currently support asset locking operations Weight::MAX } - fn request_unlock(_: &MultiAsset, _: &MultiLocation) -> Weight { + fn request_unlock(_: &Asset, _: &Location) -> Weight { // Westend does not currently support asset locking operations Weight::MAX } @@ -274,19 +262,19 @@ impl XcmWeightInfo for WestendXcmWeight { fn clear_topic() -> Weight { XcmGeneric::::clear_topic() } - fn alias_origin(_: &MultiLocation) -> Weight { + fn alias_origin(_: &Location) -> Weight { // XCM Executor does not currently support alias origin operations Weight::MAX } - fn unpaid_execution(_: &WeightLimit, _: &Option) -> Weight { + fn unpaid_execution(_: &WeightLimit, _: &Option) -> Weight { XcmGeneric::::unpaid_execution() } } #[test] fn all_counted_has_a_sane_weight_upper_limit() { - let assets = MultiAssetFilter::Wild(AllCounted(4294967295)); + let assets = AssetFilter::Wild(AllCounted(4294967295)); let weight = Weight::from_parts(1000, 1000); - assert_eq!(assets.weigh_multi_assets(weight), weight * MAX_ASSETS); + assert_eq!(assets.weigh_assets(weight), weight * MAX_ASSETS); } diff --git a/polkadot/runtime/westend/src/xcm_config.rs b/polkadot/runtime/westend/src/xcm_config.rs index e4b4f50f663..3c052057d90 100644 --- a/polkadot/runtime/westend/src/xcm_config.rs +++ b/polkadot/runtime/westend/src/xcm_config.rs @@ -23,8 +23,8 @@ use super::{ }; use crate::governance::pallet_custom_origins::Treasurer; use frame_support::{ - match_types, parameter_types, - traits::{Equals, Everything, Nothing}, + parameter_types, + traits::{Contains, Equals, Everything, Nothing}, }; use frame_system::EnsureRoot; use pallet_xcm::XcmPassthrough; @@ -53,15 +53,15 @@ use xcm_builder::{ use xcm_executor::XcmExecutor; parameter_types! { - pub const RootLocation: MultiLocation = MultiLocation::here(); - pub const TokenLocation: MultiLocation = Here.into_location(); + pub const TokenLocation: Location = Here.into_location(); + pub const RootLocation: Location = Location::here(); pub const ThisNetwork: NetworkId = Westend; - pub const UniversalLocation: InteriorMultiLocation = X1(GlobalConsensus(ThisNetwork::get())); + pub UniversalLocation: InteriorLocation = [GlobalConsensus(ThisNetwork::get())].into(); pub CheckAccount: AccountId = XcmPallet::check_account(); pub LocalCheckAccount: (AccountId, MintLocation) = (CheckAccount::get(), MintLocation::Local); pub TreasuryAccount: AccountId = Treasury::account_id(); /// The asset ID for the asset that we use to pay for message delivery fees. - pub FeeAssetId: AssetId = Concrete(TokenLocation::get()); + pub FeeAssetId: AssetId = AssetId(TokenLocation::get()); /// The base fee for the message delivery fees. pub const BaseDeliveryFee: u128 = CENTS.saturating_mul(3); } @@ -81,7 +81,7 @@ pub type LocalAssetTransactor = XcmCurrencyAdapter< Balances, // Use this currency when it is a fungible asset matching the given location or name: IsConcrete, - // We can convert the MultiLocations with our converter above: + // We can convert the Locations with our converter above: LocationConverter, // Our chain's account ID type (we can't get away without mentioning it explicitly): AccountId, @@ -114,17 +114,17 @@ pub type XcmRouter = WithUniqueTopic< >; parameter_types! { - pub const AssetHub: MultiLocation = Parachain(ASSET_HUB_ID).into_location(); - pub const Collectives: MultiLocation = Parachain(COLLECTIVES_ID).into_location(); - pub const BridgeHub: MultiLocation = Parachain(BRIDGE_HUB_ID).into_location(); - pub const People: MultiLocation = Parachain(PEOPLE_ID).into_location(); - pub const Wnd: MultiAssetFilter = Wild(AllOf { fun: WildFungible, id: Concrete(TokenLocation::get()) }); - pub const WndForAssetHub: (MultiAssetFilter, MultiLocation) = (Wnd::get(), AssetHub::get()); - pub const WndForCollectives: (MultiAssetFilter, MultiLocation) = (Wnd::get(), Collectives::get()); - pub const WndForBridgeHub: (MultiAssetFilter, MultiLocation) = (Wnd::get(), BridgeHub::get()); - pub const WndForPeople: (MultiAssetFilter, MultiLocation) = (Wnd::get(), People::get()); - pub const MaxInstructions: u32 = 100; - pub const MaxAssetsIntoHolding: u32 = 64; + pub AssetHub: Location = Parachain(ASSET_HUB_ID).into_location(); + pub Collectives: Location = Parachain(COLLECTIVES_ID).into_location(); + pub BridgeHub: Location = Parachain(BRIDGE_HUB_ID).into_location(); + pub People: Location = Parachain(PEOPLE_ID).into_location(); + pub Wnd: AssetFilter = Wild(AllOf { fun: WildFungible, id: AssetId(TokenLocation::get()) }); + pub WndForAssetHub: (AssetFilter, Location) = (Wnd::get(), AssetHub::get()); + pub WndForCollectives: (AssetFilter, Location) = (Wnd::get(), Collectives::get()); + pub WndForBridgeHub: (AssetFilter, Location) = (Wnd::get(), BridgeHub::get()); + pub WndForPeople: (AssetFilter, Location) = (Wnd::get(), People::get()); + pub MaxInstructions: u32 = 100; + pub MaxAssetsIntoHolding: u32 = 64; } pub type TrustedTeleporters = ( @@ -134,17 +134,29 @@ pub type TrustedTeleporters = ( xcm_builder::Case, ); -match_types! { - pub type OnlyParachains: impl Contains = { - MultiLocation { parents: 0, interior: X1(Parachain(_)) } - }; - pub type CollectivesOrFellows: impl Contains = { - MultiLocation { parents: 0, interior: X1(Parachain(COLLECTIVES_ID)) } | - MultiLocation { parents: 0, interior: X2(Parachain(COLLECTIVES_ID), Plurality { id: BodyId::Technical, .. }) } - }; - pub type LocalPlurality: impl Contains = { - MultiLocation { parents: 0, interior: X1(Plurality { .. }) } - }; +pub struct OnlyParachains; +impl Contains for OnlyParachains { + fn contains(location: &Location) -> bool { + matches!(location.unpack(), (0, [Parachain(_)])) + } +} + +pub struct CollectivesOrFellows; +impl Contains for CollectivesOrFellows { + fn contains(location: &Location) -> bool { + matches!( + location.unpack(), + (0, [Parachain(COLLECTIVES_ID)]) | + (0, [Parachain(COLLECTIVES_ID), Plurality { id: BodyId::Technical, .. }]) + ) + } +} + +pub struct LocalPlurality; +impl Contains for LocalPlurality { + fn contains(loc: &Location) -> bool { + matches!(loc.unpack(), (0, [Plurality { .. }])) + } } /// The barriers one of which must be passed for an XCM message to be executed. @@ -218,11 +230,10 @@ parameter_types! { pub const TreasurerBodyId: BodyId = BodyId::Index(TREASURER_INDEX); } -/// Type to convert the `GeneralAdmin` origin to a Plurality `MultiLocation` value. +/// Type to convert the `GeneralAdmin` origin to a Plurality `Location` value. pub type GeneralAdminToPlurality = OriginToPluralityVoice; -/// Type to convert an `Origin` type value into a `MultiLocation` value which represents an interior /// location of this chain. pub type LocalOriginToLocation = ( GeneralAdminToPlurality, @@ -230,25 +241,25 @@ pub type LocalOriginToLocation = ( SignedToAccountId32, ); -/// Type to convert the `StakingAdmin` origin to a Plurality `MultiLocation` value. +/// Type to convert the `StakingAdmin` origin to a Plurality `Location` value. pub type StakingAdminToPlurality = OriginToPluralityVoice; -/// Type to convert the `FellowshipAdmin` origin to a Plurality `MultiLocation` value. +/// Type to convert the `FellowshipAdmin` origin to a Plurality `Location` value. pub type FellowshipAdminToPlurality = OriginToPluralityVoice; -/// Type to convert the `Treasurer` origin to a Plurality `MultiLocation` value. +/// Type to convert the `Treasurer` origin to a Plurality `Location` value. pub type TreasurerToPlurality = OriginToPluralityVoice; -/// Type to convert a pallet `Origin` type value into a `MultiLocation` value which represents an +/// Type to convert a pallet `Origin` type value into a `Location` value which represents an /// interior location of this chain for a destination chain. pub type LocalPalletOriginToLocation = ( - // GeneralAdmin origin to be used in XCM as a corresponding Plurality `MultiLocation` value. + // GeneralAdmin origin to be used in XCM as a corresponding Plurality `Location` value. GeneralAdminToPlurality, - // StakingAdmin origin to be used in XCM as a corresponding Plurality `MultiLocation` value. + // StakingAdmin origin to be used in XCM as a corresponding Plurality `Location` value. StakingAdminToPlurality, - // FellowshipAdmin origin to be used in XCM as a corresponding Plurality `MultiLocation` value. + // FellowshipAdmin origin to be used in XCM as a corresponding Plurality `Location` value. FellowshipAdminToPlurality, // `Treasurer` origin to be used in XCM as a corresponding Plurality `MultiLocation` value. TreasurerToPlurality, diff --git a/polkadot/xcm/Cargo.toml b/polkadot/xcm/Cargo.toml index 89e3728a361..1103e07adbb 100644 --- a/polkadot/xcm/Cargo.toml +++ b/polkadot/xcm/Cargo.toml @@ -18,7 +18,7 @@ log = { version = "0.4.17", default-features = false } parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive", "max-encoded-len"] } scale-info = { version = "2.10.0", default-features = false, features = ["derive", "serde"] } sp-weights = { path = "../../substrate/primitives/weights", default-features = false, features = ["serde"] } -serde = { version = "1.0.195", default-features = false, features = ["alloc", "derive"] } +serde = { version = "1.0.195", default-features = false, features = ["alloc", "derive", "rc"] } schemars = { version = "0.8.13", default-features = true, optional = true } xcm-procedural = { path = "procedural" } environmental = { version = "1.1.4", default-features = false } diff --git a/polkadot/xcm/pallet-xcm-benchmarks/src/fungible/benchmarking.rs b/polkadot/xcm/pallet-xcm-benchmarks/src/fungible/benchmarking.rs index d32eb8d4a52..e96ec48fcba 100644 --- a/polkadot/xcm/pallet-xcm-benchmarks/src/fungible/benchmarking.rs +++ b/polkadot/xcm/pallet-xcm-benchmarks/src/fungible/benchmarking.rs @@ -24,7 +24,7 @@ use frame_support::{ }; use sp_runtime::traits::{Bounded, Zero}; use sp_std::{prelude::*, vec}; -use xcm::latest::{prelude::*, MAX_ITEMS_IN_MULTIASSETS}; +use xcm::latest::{prelude::*, MAX_ITEMS_IN_ASSETS}; use xcm_executor::traits::{ConvertLocation, FeeReason, TransactAsset}; benchmarks_instance_pallet! { @@ -43,7 +43,7 @@ benchmarks_instance_pallet! { withdraw_asset { let (sender_account, sender_location) = account_and_location::(1); let worst_case_holding = T::worst_case_holding(0); - let asset = T::get_multi_asset(); + let asset = T::get_asset(); >::deposit_asset(&asset, &sender_location, None).unwrap(); // check the assets of origin. @@ -63,8 +63,8 @@ benchmarks_instance_pallet! { transfer_asset { let (sender_account, sender_location) = account_and_location::(1); - let asset = T::get_multi_asset(); - let assets: MultiAssets = vec![ asset.clone() ].into(); + let asset = T::get_asset(); + let assets: Assets = vec![ asset.clone() ].into(); // this xcm doesn't use holding let dest_location = T::valid_destination()?; @@ -95,10 +95,10 @@ benchmarks_instance_pallet! { ); let sender_account_balance_before = T::TransactAsset::balance(&sender_account); - let asset = T::get_multi_asset(); + let asset = T::get_asset(); >::deposit_asset(&asset, &sender_location, None).unwrap(); assert!(T::TransactAsset::balance(&sender_account) > sender_account_balance_before); - let assets: MultiAssets = vec![ asset ].into(); + let assets: Assets = vec![asset].into(); assert!(T::TransactAsset::balance(&dest_account).is_zero()); let mut executor = new_executor::(sender_location); @@ -129,7 +129,7 @@ benchmarks_instance_pallet! { BenchmarkResult::from_weight(Weight::MAX) ))?; - let assets: MultiAssets = vec![ transferable_reserve_asset ].into(); + let assets: Assets = vec![ transferable_reserve_asset ].into(); let mut executor = new_executor::(trusted_reserve); let instruction = Instruction::ReserveAssetDeposited(assets.clone()); @@ -143,7 +143,7 @@ benchmarks_instance_pallet! { initiate_reserve_withdraw { let (sender_account, sender_location) = account_and_location::(1); let holding = T::worst_case_holding(1); - let assets_filter = MultiAssetFilter::Definite(holding.clone().into_inner().into_iter().take(MAX_ITEMS_IN_MULTIASSETS).collect::>().into()); + let assets_filter = AssetFilter::Definite(holding.clone().into_inner().into_iter().take(MAX_ITEMS_IN_ASSETS).collect::>().into()); let reserve = T::valid_destination().map_err(|_| BenchmarkError::Skip)?; let (expected_fees_mode, expected_assets_in_holding) = T::DeliveryHelper::ensure_successful_delivery( @@ -188,7 +188,7 @@ benchmarks_instance_pallet! { )?; } - let assets: MultiAssets = vec![ teleportable_asset ].into(); + let assets: Assets = vec![ teleportable_asset ].into(); let mut executor = new_executor::(trusted_teleporter); let instruction = Instruction::ReceiveTeleportedAsset(assets.clone()); @@ -204,7 +204,7 @@ benchmarks_instance_pallet! { } deposit_asset { - let asset = T::get_multi_asset(); + let asset = T::get_asset(); let mut holding = T::worst_case_holding(1); // Add our asset to the holding. @@ -230,7 +230,7 @@ benchmarks_instance_pallet! { } deposit_reserve_asset { - let asset = T::get_multi_asset(); + let asset = T::get_asset(); let mut holding = T::worst_case_holding(1); // Add our asset to the holding. @@ -257,7 +257,7 @@ benchmarks_instance_pallet! { } initiate_teleport { - let asset = T::get_multi_asset(); + let asset = T::get_asset(); let mut holding = T::worst_case_holding(0); // Add our asset to the holding. diff --git a/polkadot/xcm/pallet-xcm-benchmarks/src/fungible/mock.rs b/polkadot/xcm/pallet-xcm-benchmarks/src/fungible/mock.rs index 43892c31c7c..bb4b7ff6276 100644 --- a/polkadot/xcm/pallet-xcm-benchmarks/src/fungible/mock.rs +++ b/polkadot/xcm/pallet-xcm-benchmarks/src/fungible/mock.rs @@ -93,10 +93,10 @@ parameter_types! { pub struct MatchAnyFungible; impl xcm_executor::traits::MatchesFungible for MatchAnyFungible { - fn matches_fungible(m: &MultiAsset) -> Option { + fn matches_fungible(m: &Asset) -> Option { use sp_runtime::traits::SaturatedConversion; match m { - MultiAsset { fun: Fungible(amount), .. } => Some((*amount).saturated_into::()), + Asset { fun: Fungible(amount), .. } => Some((*amount).saturated_into::()), _ => None, } } @@ -151,13 +151,12 @@ impl crate::Config for Test { type XcmConfig = XcmConfig; type AccountIdConverter = AccountIdConverter; type DeliveryHelper = (); - fn valid_destination() -> Result { - let valid_destination: MultiLocation = - X1(AccountId32 { network: None, id: [0u8; 32] }).into(); + fn valid_destination() -> Result { + let valid_destination: Location = [AccountId32 { network: None, id: [0u8; 32] }].into(); Ok(valid_destination) } - fn worst_case_holding(depositable_count: u32) -> MultiAssets { + fn worst_case_holding(depositable_count: u32) -> Assets { crate::mock_worst_case_holding( depositable_count, ::MaxAssetsIntoHolding::get(), @@ -170,19 +169,19 @@ pub type TrustedReserves = xcm_builder::Case; parameter_types! { pub const CheckingAccount: Option<(u64, MintLocation)> = Some((100, MintLocation::Local)); - pub const ChildTeleporter: MultiLocation = Parachain(1000).into_location(); - pub const TrustedTeleporter: Option<(MultiLocation, MultiAsset)> = Some(( + pub ChildTeleporter: Location = Parachain(1000).into_location(); + pub TrustedTeleporter: Option<(Location, Asset)> = Some(( ChildTeleporter::get(), - MultiAsset { id: Concrete(Here.into_location()), fun: Fungible(100) }, + Asset { id: AssetId(Here.into_location()), fun: Fungible(100) }, )); - pub const TrustedReserve: Option<(MultiLocation, MultiAsset)> = Some(( + pub TrustedReserve: Option<(Location, Asset)> = Some(( ChildTeleporter::get(), - MultiAsset { id: Concrete(Here.into_location()), fun: Fungible(100) }, + Asset { id: AssetId(Here.into_location()), fun: Fungible(100) }, )); - pub const TeleportConcreteFungible: (MultiAssetFilter, MultiLocation) = - (Wild(AllOf { fun: WildFungible, id: Concrete(Here.into_location()) }), ChildTeleporter::get()); - pub const ReserveConcreteFungible: (MultiAssetFilter, MultiLocation) = - (Wild(AllOf { fun: WildFungible, id: Concrete(Here.into_location()) }), ChildTeleporter::get()); + pub TeleportConcreteFungible: (AssetFilter, Location) = + (Wild(AllOf { fun: WildFungible, id: AssetId(Here.into_location()) }), ChildTeleporter::get()); + pub ReserveConcreteFungible: (AssetFilter, Location) = + (Wild(AllOf { fun: WildFungible, id: AssetId(Here.into_location()) }), ChildTeleporter::get()); } impl xcm_balances_benchmark::Config for Test { @@ -191,10 +190,10 @@ impl xcm_balances_benchmark::Config for Test { type TrustedTeleporter = TrustedTeleporter; type TrustedReserve = TrustedReserve; - fn get_multi_asset() -> MultiAsset { + fn get_asset() -> Asset { let amount = >::minimum_balance() as u128; - MultiAsset { id: Concrete(Here.into()), fun: Fungible(amount) } + Asset { id: AssetId(Here.into()), fun: Fungible(amount) } } } diff --git a/polkadot/xcm/pallet-xcm-benchmarks/src/fungible/mod.rs b/polkadot/xcm/pallet-xcm-benchmarks/src/fungible/mod.rs index 292921eb595..e84355f4092 100644 --- a/polkadot/xcm/pallet-xcm-benchmarks/src/fungible/mod.rs +++ b/polkadot/xcm/pallet-xcm-benchmarks/src/fungible/mod.rs @@ -37,14 +37,14 @@ pub mod pallet { type CheckedAccount: Get>; /// A trusted location which we allow teleports from, and the asset we allow to teleport. - type TrustedTeleporter: Get>; + type TrustedTeleporter: Get>; /// A trusted location where reserve assets are stored, and the asset we allow to be /// reserves. - type TrustedReserve: Get>; + type TrustedReserve: Get>; /// Give me a fungible asset that your asset transactor is going to accept. - fn get_multi_asset() -> xcm::latest::MultiAsset; + fn get_asset() -> xcm::latest::Asset; } #[pallet::pallet] diff --git a/polkadot/xcm/pallet-xcm-benchmarks/src/generic/benchmarking.rs b/polkadot/xcm/pallet-xcm-benchmarks/src/generic/benchmarking.rs index 50a7fe45e23..14d53c4ebf5 100644 --- a/polkadot/xcm/pallet-xcm-benchmarks/src/generic/benchmarking.rs +++ b/polkadot/xcm/pallet-xcm-benchmarks/src/generic/benchmarking.rs @@ -77,7 +77,7 @@ benchmarks! { let mut executor = new_executor::(Default::default()); executor.set_holding(holding); - let fee_asset = Concrete(Here.into()); + let fee_asset = AssetId(Here.into()); let instruction = Instruction::>::BuyExecution { fees: (fee_asset, 100_000_000u128).into(), // should be something inside of holding @@ -95,7 +95,7 @@ benchmarks! { let mut executor = new_executor::(Default::default()); let (query_id, response) = T::worst_case_response(); let max_weight = Weight::MAX; - let querier: Option = Some(Here.into()); + let querier: Option = Some(Here.into()); let instruction = Instruction::QueryResponse { query_id, response, max_weight, querier }; let xcm = Xcm(vec![instruction]); }: { @@ -174,15 +174,15 @@ benchmarks! { descend_origin { let mut executor = new_executor::(Default::default()); - let who = X2(OnlyChild, OnlyChild); - let instruction = Instruction::DescendOrigin(who); + let who = Junctions::from([OnlyChild, OnlyChild]); + let instruction = Instruction::DescendOrigin(who.clone()); let xcm = Xcm(vec![instruction]); } : { executor.bench_process(xcm)?; } verify { assert_eq!( executor.origin(), - &Some(MultiLocation { + &Some(Location { parents: 0, interior: who, }), @@ -242,7 +242,7 @@ benchmarks! { &origin, assets.clone().into(), &XcmContext { - origin: Some(origin), + origin: Some(origin.clone()), message_id: [0; 32], topic: None, }, @@ -279,7 +279,7 @@ benchmarks! { let origin = T::subscribe_origin()?; let query_id = Default::default(); let max_response_weight = Default::default(); - let mut executor = new_executor::(origin); + let mut executor = new_executor::(origin.clone()); let instruction = Instruction::SubscribeVersion { query_id, max_response_weight }; let xcm = Xcm(vec![instruction]); } : { @@ -299,14 +299,14 @@ benchmarks! { query_id, max_response_weight, &XcmContext { - origin: Some(origin), + origin: Some(origin.clone()), message_id: [0; 32], topic: None, }, ).map_err(|_| "Could not start subscription")?; assert!(::SubscriptionService::is_subscribed(&origin)); - let mut executor = new_executor::(origin); + let mut executor = new_executor::(origin.clone()); let instruction = Instruction::UnsubscribeVersion; let xcm = Xcm(vec![instruction]); } : { @@ -545,7 +545,7 @@ benchmarks! { } verify { use frame_support::traits::Get; let universal_location = ::UniversalLocation::get(); - assert_eq!(executor.origin(), &Some(X1(alias).relative_to(&universal_location))); + assert_eq!(executor.origin(), &Some(Junctions::from([alias]).relative_to(&universal_location))); } export_message { @@ -561,8 +561,8 @@ benchmarks! { let (expected_fees_mode, expected_assets_in_holding) = T::DeliveryHelper::ensure_successful_delivery( &origin, - &destination.into(), - FeeReason::Export { network, destination }, + &destination.clone().into(), + FeeReason::Export { network, destination: destination.clone() }, ); let sender_account = T::AccountIdConverter::convert_location(&origin).unwrap(); let sender_account_balance_before = T::TransactAsset::balance(&sender_account); @@ -575,7 +575,7 @@ benchmarks! { executor.set_holding(expected_assets_in_holding.into()); } let xcm = Xcm(vec![ExportMessage { - network, destination, xcm: inner_xcm, + network, destination: destination.clone(), xcm: inner_xcm, }]); }: { executor.bench_process(xcm)?; @@ -632,13 +632,13 @@ benchmarks! { let (unlocker, owner, asset) = T::unlockable_asset()?; - let mut executor = new_executor::(unlocker); + let mut executor = new_executor::(unlocker.clone()); // We first place the asset in lock first... ::AssetLocker::prepare_lock( unlocker, asset.clone(), - owner, + owner.clone(), ) .map_err(|_| BenchmarkError::Skip)? .enact() @@ -658,13 +658,13 @@ benchmarks! { let (unlocker, owner, asset) = T::unlockable_asset()?; - let mut executor = new_executor::(unlocker); + let mut executor = new_executor::(unlocker.clone()); // We first place the asset in lock first... ::AssetLocker::prepare_lock( unlocker, asset.clone(), - owner, + owner.clone(), ) .map_err(|_| BenchmarkError::Skip)? .enact() @@ -686,9 +686,9 @@ benchmarks! { // We first place the asset in lock first... ::AssetLocker::prepare_lock( - locker, + locker.clone(), asset.clone(), - owner, + owner.clone(), ) .map_err(|_| BenchmarkError::Skip)? .enact() @@ -739,7 +739,7 @@ benchmarks! { let mut executor = new_executor::(origin); - let instruction = Instruction::AliasOrigin(target); + let instruction = Instruction::AliasOrigin(target.clone()); let xcm = Xcm(vec![instruction]); }: { executor.bench_process(xcm)?; diff --git a/polkadot/xcm/pallet-xcm-benchmarks/src/generic/mock.rs b/polkadot/xcm/pallet-xcm-benchmarks/src/generic/mock.rs index 6efd2304e28..4dd677217fc 100644 --- a/polkadot/xcm/pallet-xcm-benchmarks/src/generic/mock.rs +++ b/polkadot/xcm/pallet-xcm-benchmarks/src/generic/mock.rs @@ -19,16 +19,16 @@ use crate::{generic, mock::*, *}; use codec::Decode; use frame_support::{ - derive_impl, match_types, parameter_types, - traits::{Everything, OriginTrait}, + derive_impl, parameter_types, + traits::{Contains, Everything, OriginTrait}, weights::Weight, }; use sp_core::H256; use sp_runtime::traits::{BlakeTwo256, IdentityLookup, TrailingZeroInput}; use xcm_builder::{ test_utils::{ - Assets, TestAssetExchanger, TestAssetLocker, TestAssetTrap, TestSubscriptionService, - TestUniversalAliases, + AssetsInHolding, TestAssetExchanger, TestAssetLocker, TestAssetTrap, + TestSubscriptionService, TestUniversalAliases, }, AliasForeignAccountId32, AllowUnpaidExecutionFrom, }; @@ -81,19 +81,15 @@ impl frame_system::Config for Test { /// The benchmarks in this pallet should never need an asset transactor to begin with. pub struct NoAssetTransactor; impl xcm_executor::traits::TransactAsset for NoAssetTransactor { - fn deposit_asset( - _: &MultiAsset, - _: &MultiLocation, - _: Option<&XcmContext>, - ) -> Result<(), XcmError> { + fn deposit_asset(_: &Asset, _: &Location, _: Option<&XcmContext>) -> Result<(), XcmError> { unreachable!(); } fn withdraw_asset( - _: &MultiAsset, - _: &MultiLocation, + _: &Asset, + _: &Location, _: Option<&XcmContext>, - ) -> Result { + ) -> Result { unreachable!(); } } @@ -103,10 +99,11 @@ parameter_types! { pub const MaxAssetsIntoHolding: u32 = 64; } -match_types! { - pub type OnlyParachains: impl Contains = { - MultiLocation { parents: 0, interior: X1(Parachain(_)) } - }; +pub struct OnlyParachains; +impl Contains for OnlyParachains { + fn contains(location: &Location) -> bool { + matches!(location.unpack(), (0, [Parachain(_)])) + } } type Aliasers = AliasForeignAccountId32; @@ -153,13 +150,13 @@ impl crate::Config for Test { type XcmConfig = XcmConfig; type AccountIdConverter = AccountIdConverter; type DeliveryHelper = (); - fn valid_destination() -> Result { - let valid_destination: MultiLocation = + fn valid_destination() -> Result { + let valid_destination: Location = Junction::AccountId32 { network: None, id: [0u8; 32] }.into(); Ok(valid_destination) } - fn worst_case_holding(depositable_count: u32) -> MultiAssets { + fn worst_case_holding(depositable_count: u32) -> Assets { crate::mock_worst_case_holding( depositable_count, ::MaxAssetsIntoHolding::get(), @@ -172,48 +169,47 @@ impl generic::Config for Test { type RuntimeCall = RuntimeCall; fn worst_case_response() -> (u64, Response) { - let assets: MultiAssets = (Concrete(Here.into()), 100).into(); + let assets: Assets = (AssetId(Here.into()), 100).into(); (0, Response::Assets(assets)) } - fn worst_case_asset_exchange() -> Result<(MultiAssets, MultiAssets), BenchmarkError> { + fn worst_case_asset_exchange() -> Result<(Assets, Assets), BenchmarkError> { Ok(Default::default()) } - fn universal_alias() -> Result<(MultiLocation, Junction), BenchmarkError> { + fn universal_alias() -> Result<(Location, Junction), BenchmarkError> { Ok((Here.into(), GlobalConsensus(ByGenesis([0; 32])))) } fn transact_origin_and_runtime_call( - ) -> Result<(MultiLocation, ::RuntimeCall), BenchmarkError> { + ) -> Result<(Location, ::RuntimeCall), BenchmarkError> { Ok((Default::default(), frame_system::Call::remark_with_event { remark: vec![] }.into())) } - fn subscribe_origin() -> Result { + fn subscribe_origin() -> Result { Ok(Default::default()) } - fn claimable_asset() -> Result<(MultiLocation, MultiLocation, MultiAssets), BenchmarkError> { - let assets: MultiAssets = (Concrete(Here.into()), 100).into(); - let ticket = MultiLocation { parents: 0, interior: X1(GeneralIndex(0)) }; + fn claimable_asset() -> Result<(Location, Location, Assets), BenchmarkError> { + let assets: Assets = (AssetId(Here.into()), 100).into(); + let ticket = Location { parents: 0, interior: [GeneralIndex(0)].into() }; Ok((Default::default(), ticket, assets)) } - fn unlockable_asset() -> Result<(MultiLocation, MultiLocation, MultiAsset), BenchmarkError> { - let assets: MultiAsset = (Concrete(Here.into()), 100).into(); + fn unlockable_asset() -> Result<(Location, Location, Asset), BenchmarkError> { + let assets: Asset = (AssetId(Here.into()), 100).into(); Ok((Default::default(), account_id_junction::(1).into(), assets)) } fn export_message_origin_and_destination( - ) -> Result<(MultiLocation, NetworkId, InteriorMultiLocation), BenchmarkError> { + ) -> Result<(Location, NetworkId, InteriorLocation), BenchmarkError> { // No MessageExporter in tests Err(BenchmarkError::Skip) } - fn alias_origin() -> Result<(MultiLocation, MultiLocation), BenchmarkError> { - let origin: MultiLocation = - (Parachain(1), AccountId32 { network: None, id: [0; 32] }).into(); - let target: MultiLocation = AccountId32 { network: None, id: [0; 32] }.into(); + fn alias_origin() -> Result<(Location, Location), BenchmarkError> { + let origin: Location = (Parachain(1), AccountId32 { network: None, id: [0; 32] }).into(); + let target: Location = AccountId32 { network: None, id: [0; 32] }.into(); Ok((origin, target)) } } @@ -233,9 +229,9 @@ where ::AccountId: Decode, { fn convert_origin( - _origin: impl Into, + _origin: impl Into, _kind: OriginKind, - ) -> Result { + ) -> Result { Ok(RuntimeOrigin::signed( ::AccountId::decode(&mut TrailingZeroInput::zeroes()) .expect("infinite length input; no invalid inputs for type; qed"), diff --git a/polkadot/xcm/pallet-xcm-benchmarks/src/generic/mod.rs b/polkadot/xcm/pallet-xcm-benchmarks/src/generic/mod.rs index 11f7bba19a9..3728baea983 100644 --- a/polkadot/xcm/pallet-xcm-benchmarks/src/generic/mod.rs +++ b/polkadot/xcm/pallet-xcm-benchmarks/src/generic/mod.rs @@ -26,10 +26,7 @@ pub mod pallet { use frame_benchmarking::BenchmarkError; use frame_support::{dispatch::GetDispatchInfo, pallet_prelude::Encode}; use sp_runtime::traits::Dispatchable; - use xcm::latest::{ - InteriorMultiLocation, Junction, MultiAsset, MultiAssets, MultiLocation, NetworkId, - Response, - }; + use xcm::latest::{Asset, Assets, InteriorLocation, Junction, Location, NetworkId, Response}; #[pallet::config] pub trait Config: frame_system::Config + crate::Config { @@ -53,44 +50,44 @@ pub mod pallet { /// from, whereas the second element represents the assets that are being exchanged to. /// /// If set to `Err`, benchmarks which rely on an `exchange_asset` will be skipped. - fn worst_case_asset_exchange() -> Result<(MultiAssets, MultiAssets), BenchmarkError>; + fn worst_case_asset_exchange() -> Result<(Assets, Assets), BenchmarkError>; - /// A `(MultiLocation, Junction)` that is one of the `UniversalAliases` configured by the + /// A `(Location, Junction)` that is one of the `UniversalAliases` configured by the /// XCM executor. /// /// If set to `Err`, benchmarks which rely on a universal alias will be skipped. - fn universal_alias() -> Result<(MultiLocation, Junction), BenchmarkError>; + fn universal_alias() -> Result<(Location, Junction), BenchmarkError>; - /// The `MultiLocation` and `RuntimeCall` used for successful transaction XCMs. + /// The `Location` and `RuntimeCall` used for successful transaction XCMs. /// /// If set to `Err`, benchmarks which rely on a `transact_origin_and_runtime_call` will be /// skipped. fn transact_origin_and_runtime_call( - ) -> Result<(MultiLocation, >::RuntimeCall), BenchmarkError>; + ) -> Result<(Location, >::RuntimeCall), BenchmarkError>; - /// A valid `MultiLocation` we can successfully subscribe to. + /// A valid `Location` we can successfully subscribe to. /// /// If set to `Err`, benchmarks which rely on a `subscribe_origin` will be skipped. - fn subscribe_origin() -> Result; + fn subscribe_origin() -> Result; /// Return an origin, ticket, and assets that can be trapped and claimed. - fn claimable_asset() -> Result<(MultiLocation, MultiLocation, MultiAssets), BenchmarkError>; + fn claimable_asset() -> Result<(Location, Location, Assets), BenchmarkError>; /// Return an unlocker, owner and assets that can be locked and unlocked. - fn unlockable_asset() -> Result<(MultiLocation, MultiLocation, MultiAsset), BenchmarkError>; + fn unlockable_asset() -> Result<(Location, Location, Asset), BenchmarkError>; - /// A `(MultiLocation, NetworkId, InteriorMultiLocation)` we can successfully export message + /// A `(Location, NetworkId, InteriorLocation)` we can successfully export message /// to. /// /// If set to `Err`, benchmarks which rely on `export_message` will be skipped. fn export_message_origin_and_destination( - ) -> Result<(MultiLocation, NetworkId, InteriorMultiLocation), BenchmarkError>; + ) -> Result<(Location, NetworkId, InteriorLocation), BenchmarkError>; - /// A `(MultiLocation, MultiLocation)` that is one of the `Aliasers` configured by the XCM + /// A `(Location, Location)` that is one of the `Aliasers` configured by the XCM /// executor. /// /// If set to `Err`, benchmarks which rely on a universal alias will be skipped. - fn alias_origin() -> Result<(MultiLocation, MultiLocation), BenchmarkError>; + fn alias_origin() -> Result<(Location, Location), BenchmarkError>; /// Returns a valid pallet info for `ExpectPallet` or `QueryPallet` benchmark. /// diff --git a/polkadot/xcm/pallet-xcm-benchmarks/src/lib.rs b/polkadot/xcm/pallet-xcm-benchmarks/src/lib.rs index 3bf4aea1b25..6ce8d3e99e8 100644 --- a/polkadot/xcm/pallet-xcm-benchmarks/src/lib.rs +++ b/polkadot/xcm/pallet-xcm-benchmarks/src/lib.rs @@ -41,18 +41,18 @@ pub trait Config: frame_system::Config { /// `TransactAsset` is implemented. type XcmConfig: XcmConfig; - /// A converter between a multi-location to a sovereign account. + /// A converter between a location to a sovereign account. type AccountIdConverter: ConvertLocation; /// Helper that ensures successful delivery for XCM instructions which need `SendXcm`. type DeliveryHelper: EnsureDelivery; /// Does any necessary setup to create a valid destination for XCM messages. - /// Returns that destination's multi-location to be used in benchmarks. - fn valid_destination() -> Result; + /// Returns that destination's location to be used in benchmarks. + fn valid_destination() -> Result; /// Worst case scenario for a holding account in this runtime. - fn worst_case_holding(depositable_count: u32) -> MultiAssets; + fn worst_case_holding(depositable_count: u32) -> Assets; } const SEED: u32 = 0; @@ -66,21 +66,21 @@ pub type AssetTransactorOf = <::XcmConfig as XcmConfig>::AssetTr /// The call type of executor's config. Should eventually resolve to the same overarching call type. pub type XcmCallOf = <::XcmConfig as XcmConfig>::RuntimeCall; -pub fn mock_worst_case_holding(depositable_count: u32, max_assets: u32) -> MultiAssets { +pub fn mock_worst_case_holding(depositable_count: u32, max_assets: u32) -> Assets { let fungibles_amount: u128 = 100; let holding_fungibles = max_assets / 2 - depositable_count; let holding_non_fungibles = holding_fungibles; (0..holding_fungibles) .map(|i| { - MultiAsset { - id: Concrete(GeneralIndex(i as u128).into()), + Asset { + id: AssetId(GeneralIndex(i as u128).into()), fun: Fungible(fungibles_amount * i as u128), } .into() }) - .chain(core::iter::once(MultiAsset { id: Concrete(Here.into()), fun: Fungible(u128::MAX) })) - .chain((0..holding_non_fungibles).map(|i| MultiAsset { - id: Concrete(GeneralIndex(i as u128).into()), + .chain(core::iter::once(Asset { id: AssetId(Here.into()), fun: Fungible(u128::MAX) })) + .chain((0..holding_non_fungibles).map(|i| Asset { + id: AssetId(GeneralIndex(i as u128).into()), fun: NonFungible(asset_instance_from(i)), })) .collect::>() @@ -94,11 +94,11 @@ pub fn asset_instance_from(x: u32) -> AssetInstance { AssetInstance::Array4(instance) } -pub fn new_executor(origin: MultiLocation) -> ExecutorOf { +pub fn new_executor(origin: Location) -> ExecutorOf { ExecutorOf::::new(origin, [0; 32]) } -/// Build a multi-location from an account id. +/// Build a location from an account id. fn account_id_junction(index: u32) -> Junction { let account: T::AccountId = account("account", index, SEED); let mut encoded = account.encode(); @@ -108,8 +108,8 @@ fn account_id_junction(index: u32) -> Junction { Junction::AccountId32 { network: None, id } } -pub fn account_and_location(index: u32) -> (T::AccountId, MultiLocation) { - let location: MultiLocation = account_id_junction::(index).into(); +pub fn account_and_location(index: u32) -> (T::AccountId, Location) { + let location: Location = account_id_junction::(index).into(); let account = T::AccountIdConverter::convert_location(&location).unwrap(); (account, location) @@ -121,21 +121,21 @@ pub trait EnsureDelivery { /// Prepare all requirements for successful `XcmSender: SendXcm` passing (accounts, balances, /// channels ...). Returns: /// - possible `FeesMode` which is expected to be set to executor - /// - possible `MultiAssets` which are expected to be subsume to the Holding Register + /// - possible `Assets` which are expected to be subsume to the Holding Register fn ensure_successful_delivery( - origin_ref: &MultiLocation, - dest: &MultiLocation, + origin_ref: &Location, + dest: &Location, fee_reason: FeeReason, - ) -> (Option, Option); + ) -> (Option, Option); } /// `()` implementation does nothing which means no special requirements for environment. impl EnsureDelivery for () { fn ensure_successful_delivery( - _origin_ref: &MultiLocation, - _dest: &MultiLocation, + _origin_ref: &Location, + _dest: &Location, _fee_reason: FeeReason, - ) -> (Option, Option) { + ) -> (Option, Option) { // doing nothing (None, None) } diff --git a/polkadot/xcm/pallet-xcm-benchmarks/src/mock.rs b/polkadot/xcm/pallet-xcm-benchmarks/src/mock.rs index e02c5bf0861..78a9e5f8a01 100644 --- a/polkadot/xcm/pallet-xcm-benchmarks/src/mock.rs +++ b/polkadot/xcm/pallet-xcm-benchmarks/src/mock.rs @@ -22,8 +22,8 @@ use xcm::latest::Weight; pub struct DevNull; impl xcm::opaque::latest::SendXcm for DevNull { type Ticket = (); - fn validate(_: &mut Option, _: &mut Option>) -> SendResult<()> { - Ok(((), MultiAssets::new())) + fn validate(_: &mut Option, _: &mut Option>) -> SendResult<()> { + Ok(((), Assets::new())) } fn deliver(_: ()) -> Result { Ok([0; 32]) @@ -31,13 +31,13 @@ impl xcm::opaque::latest::SendXcm for DevNull { } impl xcm_executor::traits::OnResponse for DevNull { - fn expecting_response(_: &MultiLocation, _: u64, _: Option<&MultiLocation>) -> bool { + fn expecting_response(_: &Location, _: u64, _: Option<&Location>) -> bool { false } fn on_response( - _: &MultiLocation, + _: &Location, _: u64, - _: Option<&MultiLocation>, + _: Option<&Location>, _: Response, _: Weight, _: &XcmContext, @@ -48,9 +48,9 @@ impl xcm_executor::traits::OnResponse for DevNull { pub struct AccountIdConverter; impl xcm_executor::traits::ConvertLocation for AccountIdConverter { - fn convert_location(ml: &MultiLocation) -> Option { - match ml { - MultiLocation { parents: 0, interior: X1(Junction::AccountId32 { id, .. }) } => + fn convert_location(ml: &Location) -> Option { + match ml.unpack() { + (0, [Junction::AccountId32 { id, .. }]) => Some(::decode(&mut &*id.to_vec()).unwrap()), _ => None, } @@ -58,14 +58,14 @@ impl xcm_executor::traits::ConvertLocation for AccountIdConverter { } parameter_types! { - pub UniversalLocation: InteriorMultiLocation = Junction::Parachain(101).into(); + pub UniversalLocation: InteriorLocation = Junction::Parachain(101).into(); pub UnitWeightCost: Weight = Weight::from_parts(10, 10); - pub WeightPrice: (AssetId, u128, u128) = (Concrete(Here.into()), 1_000_000, 1024); + pub WeightPrice: (AssetId, u128, u128) = (AssetId(Here.into()), 1_000_000, 1024); } pub struct AllAssetLocationsPass; -impl ContainsPair for AllAssetLocationsPass { - fn contains(_: &MultiAsset, _: &MultiLocation) -> bool { +impl ContainsPair for AllAssetLocationsPass { + fn contains(_: &Asset, _: &Location) -> bool { true } } diff --git a/polkadot/xcm/pallet-xcm/src/benchmarking.rs b/polkadot/xcm/pallet-xcm/src/benchmarking.rs index 28a198f40a0..c7d8fb24e9d 100644 --- a/polkadot/xcm/pallet-xcm/src/benchmarking.rs +++ b/polkadot/xcm/pallet-xcm/src/benchmarking.rs @@ -32,36 +32,36 @@ pub struct Pallet(crate::Pallet); /// Trait that must be implemented by runtime to be able to benchmark pallet properly. pub trait Config: crate::Config { - /// A `MultiLocation` that can be reached via `XcmRouter`. Used only in benchmarks. + /// A `Location` that can be reached via `XcmRouter`. Used only in benchmarks. /// /// If `None`, the benchmarks that depend on a reachable destination will be skipped. - fn reachable_dest() -> Option { + fn reachable_dest() -> Option { None } - /// A `(MultiAsset, MultiLocation)` pair representing asset and the destination it can be + /// A `(Asset, Location)` pair representing asset and the destination it can be /// teleported to. Used only in benchmarks. /// /// Implementation should also make sure `dest` is reachable/connected. /// /// If `None`, the benchmarks that depend on this will default to `Weight::MAX`. - fn teleportable_asset_and_dest() -> Option<(MultiAsset, MultiLocation)> { + fn teleportable_asset_and_dest() -> Option<(Asset, Location)> { None } - /// A `(MultiAsset, MultiLocation)` pair representing asset and the destination it can be + /// A `(Asset, Location)` pair representing asset and the destination it can be /// reserve-transferred to. Used only in benchmarks. /// /// Implementation should also make sure `dest` is reachable/connected. /// /// If `None`, the benchmarks that depend on this will default to `Weight::MAX`. - fn reserve_transferable_asset_and_dest() -> Option<(MultiAsset, MultiLocation)> { + fn reserve_transferable_asset_and_dest() -> Option<(Asset, Location)> { None } /// Sets up a complex transfer (usually consisting of a teleport and reserve-based transfer), so /// that runtime can properly benchmark `transfer_assets()` extrinsic. Should return a tuple - /// `(MultiAsset, u32, MultiLocation, dyn FnOnce())` representing the assets to transfer, the + /// `(Asset, u32, Location, dyn FnOnce())` representing the assets to transfer, the /// `u32` index of the asset to be used for fees, the destination chain for the transfer, and a /// `verify()` closure to verify the intended transfer side-effects. /// @@ -71,8 +71,7 @@ pub trait Config: crate::Config { /// Used only in benchmarks. /// /// If `None`, the benchmarks that depend on this will default to `Weight::MAX`. - fn set_up_complex_asset_transfer( - ) -> Option<(MultiAssets, u32, MultiLocation, Box)> { + fn set_up_complex_asset_transfer() -> Option<(Assets, u32, Location, Box)> { None } } @@ -90,7 +89,7 @@ benchmarks! { return Err(BenchmarkError::Override(BenchmarkResult::from_weight(Weight::MAX))) } let msg = Xcm(vec![ClearOrigin]); - let versioned_dest: VersionedMultiLocation = T::reachable_dest().ok_or( + let versioned_dest: VersionedLocation = T::reachable_dest().ok_or( BenchmarkError::Override(BenchmarkResult::from_weight(Weight::MAX)), )? .into(); @@ -106,7 +105,7 @@ benchmarks! { Fungible(amount) => *amount, _ => return Err(BenchmarkError::Stop("Benchmark asset not fungible")), }.into(); - let assets: MultiAssets = asset.into(); + let assets: Assets = asset.into(); let existential_deposit = T::ExistentialDeposit::get(); let caller = whitelisted_caller(); @@ -126,10 +125,10 @@ benchmarks! { } let recipient = [0u8; 32]; - let versioned_dest: VersionedMultiLocation = destination.into(); - let versioned_beneficiary: VersionedMultiLocation = + let versioned_dest: VersionedLocation = destination.into(); + let versioned_beneficiary: VersionedLocation = AccountId32 { network: None, id: recipient.into() }.into(); - let versioned_assets: VersionedMultiAssets = assets.into(); + let versioned_assets: VersionedAssets = assets.into(); }: _>(send_origin.into(), Box::new(versioned_dest), Box::new(versioned_beneficiary), Box::new(versioned_assets), 0) verify { // verify balance after transfer, decreased by transferred amount (+ maybe XCM delivery fees) @@ -145,7 +144,7 @@ benchmarks! { Fungible(amount) => *amount, _ => return Err(BenchmarkError::Stop("Benchmark asset not fungible")), }.into(); - let assets: MultiAssets = asset.into(); + let assets: Assets = asset.into(); let existential_deposit = T::ExistentialDeposit::get(); let caller = whitelisted_caller(); @@ -165,10 +164,10 @@ benchmarks! { } let recipient = [0u8; 32]; - let versioned_dest: VersionedMultiLocation = destination.into(); - let versioned_beneficiary: VersionedMultiLocation = + let versioned_dest: VersionedLocation = destination.into(); + let versioned_beneficiary: VersionedLocation = AccountId32 { network: None, id: recipient.into() }.into(); - let versioned_assets: VersionedMultiAssets = assets.into(); + let versioned_assets: VersionedAssets = assets.into(); }: _>(send_origin.into(), Box::new(versioned_dest), Box::new(versioned_beneficiary), Box::new(versioned_assets), 0) verify { // verify balance after transfer, decreased by transferred amount (+ maybe XCM delivery fees) @@ -182,10 +181,10 @@ benchmarks! { let caller: T::AccountId = whitelisted_caller(); let send_origin = RawOrigin::Signed(caller.clone()); let recipient = [0u8; 32]; - let versioned_dest: VersionedMultiLocation = destination.into(); - let versioned_beneficiary: VersionedMultiLocation = + let versioned_dest: VersionedLocation = destination.into(); + let versioned_beneficiary: VersionedLocation = AccountId32 { network: None, id: recipient.into() }.into(); - let versioned_assets: VersionedMultiAssets = assets.into(); + let versioned_assets: VersionedAssets = assets.into(); }: _>(send_origin.into(), Box::new(versioned_dest), Box::new(versioned_beneficiary), Box::new(versioned_assets), 0, WeightLimit::Unlimited) verify { // run provided verification function @@ -214,7 +213,7 @@ benchmarks! { force_default_xcm_version {}: _(RawOrigin::Root, Some(2)) force_subscribe_version_notify { - let versioned_loc: VersionedMultiLocation = T::reachable_dest().ok_or( + let versioned_loc: VersionedLocation = T::reachable_dest().ok_or( BenchmarkError::Override(BenchmarkResult::from_weight(Weight::MAX)), )? .into(); @@ -224,7 +223,7 @@ benchmarks! { let loc = T::reachable_dest().ok_or( BenchmarkError::Override(BenchmarkResult::from_weight(Weight::MAX)), )?; - let versioned_loc: VersionedMultiLocation = loc.into(); + let versioned_loc: VersionedLocation = loc.clone().into(); let _ = crate::Pallet::::request_version_notify(loc); }: _(RawOrigin::Root, Box::new(versioned_loc)) @@ -232,7 +231,7 @@ benchmarks! { migrate_supported_version { let old_version = XCM_VERSION - 1; - let loc = VersionedMultiLocation::from(MultiLocation::from(Parent)); + let loc = VersionedLocation::from(Location::from(Parent)); SupportedVersion::::insert(old_version, loc, old_version); }: { crate::Pallet::::check_xcm_version_change(VersionMigrationStage::MigrateSupportedVersion, Weight::zero()); @@ -240,7 +239,7 @@ benchmarks! { migrate_version_notifiers { let old_version = XCM_VERSION - 1; - let loc = VersionedMultiLocation::from(MultiLocation::from(Parent)); + let loc = VersionedLocation::from(Location::from(Parent)); VersionNotifiers::::insert(old_version, loc, 0); }: { crate::Pallet::::check_xcm_version_change(VersionMigrationStage::MigrateVersionNotifiers, Weight::zero()); @@ -250,7 +249,7 @@ benchmarks! { let loc = T::reachable_dest().ok_or( BenchmarkError::Override(BenchmarkResult::from_weight(T::DbWeight::get().reads(1))), )?; - let loc = VersionedMultiLocation::from(loc); + let loc = VersionedLocation::from(loc); let current_version = T::AdvertisedXcmVersion::get(); VersionNotifyTargets::::insert(current_version, loc, (0, Weight::zero(), current_version)); }: { @@ -261,7 +260,7 @@ benchmarks! { let loc = T::reachable_dest().ok_or( BenchmarkError::Override(BenchmarkResult::from_weight(T::DbWeight::get().reads_writes(1, 3))), )?; - let loc = VersionedMultiLocation::from(loc); + let loc = VersionedLocation::from(loc); let current_version = T::AdvertisedXcmVersion::get(); let old_version = current_version - 1; VersionNotifyTargets::::insert(current_version, loc, (0, Weight::zero(), old_version)); @@ -276,7 +275,7 @@ benchmarks! { part: v2::BodyPart::Voice, } .into(); - let bad_loc = VersionedMultiLocation::from(bad_loc); + let bad_loc = VersionedLocation::from(bad_loc); let current_version = T::AdvertisedXcmVersion::get(); VersionNotifyTargets::::insert(current_version, bad_loc, (0, Weight::zero(), current_version)); }: { @@ -286,7 +285,7 @@ benchmarks! { migrate_version_notify_targets { let current_version = T::AdvertisedXcmVersion::get(); let old_version = current_version - 1; - let loc = VersionedMultiLocation::from(MultiLocation::from(Parent)); + let loc = VersionedLocation::from(Location::from(Parent)); VersionNotifyTargets::::insert(old_version, loc, (0, Weight::zero(), current_version)); }: { crate::Pallet::::check_xcm_version_change(VersionMigrationStage::MigrateAndNotifyOldTargets, Weight::zero()); @@ -296,7 +295,7 @@ benchmarks! { let loc = T::reachable_dest().ok_or( BenchmarkError::Override(BenchmarkResult::from_weight(T::DbWeight::get().reads_writes(1, 3))), )?; - let loc = VersionedMultiLocation::from(loc); + let loc = VersionedLocation::from(loc); let old_version = T::AdvertisedXcmVersion::get() - 1; VersionNotifyTargets::::insert(old_version, loc, (0, Weight::zero(), old_version)); }: { @@ -304,17 +303,17 @@ benchmarks! { } new_query { - let responder = MultiLocation::from(Parent); + let responder = Location::from(Parent); let timeout = 1u32.into(); - let match_querier = MultiLocation::from(Here); + let match_querier = Location::from(Here); }: { crate::Pallet::::new_query(responder, timeout, match_querier); } take_response { - let responder = MultiLocation::from(Parent); + let responder = Location::from(Parent); let timeout = 1u32.into(); - let match_querier = MultiLocation::from(Here); + let match_querier = Location::from(Here); let query_id = crate::Pallet::::new_query(responder, timeout, match_querier); let infos = (0 .. xcm::v3::MaxPalletsInfo::get()).map(|_| PalletInfo::new( u32::MAX, @@ -340,17 +339,17 @@ benchmarks! { pub mod helpers { use super::*; pub fn native_teleport_as_asset_transfer( - native_asset_location: MultiLocation, - destination: MultiLocation, - ) -> Option<(MultiAssets, u32, MultiLocation, Box)> + native_asset_location: Location, + destination: Location, + ) -> Option<(Assets, u32, Location, Box)> where T: Config + pallet_balances::Config, u128: From<::Balance>, { // Relay/native token can be teleported to/from AH. let amount = T::ExistentialDeposit::get() * 100u32.into(); - let assets: MultiAssets = - MultiAsset { fun: Fungible(amount.into()), id: Concrete(native_asset_location) }.into(); + let assets: Assets = + Asset { fun: Fungible(amount.into()), id: AssetId(native_asset_location) }.into(); let fee_index = 0u32; // Give some multiple of transferred amount diff --git a/polkadot/xcm/pallet-xcm/src/lib.rs b/polkadot/xcm/pallet-xcm/src/lib.rs index 2848527f150..55154198a9b 100644 --- a/polkadot/xcm/pallet-xcm/src/lib.rs +++ b/polkadot/xcm/pallet-xcm/src/lib.rs @@ -59,7 +59,7 @@ use xcm_executor::{ DropAssets, MatchesFungible, OnResponse, Properties, QueryHandler, QueryResponseStatus, TransactAsset, TransferType, VersionChangeNotifier, WeightBounds, XcmAssetTransfers, }, - Assets, + AssetsInHolding, }; pub trait WeightInfo { @@ -202,45 +202,39 @@ pub mod pallet { // TODO: We should really use a trait which can handle multiple currencies. type Currency: LockableCurrency>; - /// The `MultiAsset` matcher for `Currency`. + /// The `Asset` matcher for `Currency`. type CurrencyMatcher: MatchesFungible>; - /// Required origin for sending XCM messages. If successful, it resolves to `MultiLocation` + /// Required origin for sending XCM messages. If successful, it resolves to `Location` /// which exists as an interior location within this chain's XCM context. - type SendXcmOrigin: EnsureOrigin< - ::RuntimeOrigin, - Success = MultiLocation, - >; + type SendXcmOrigin: EnsureOrigin<::RuntimeOrigin, Success = Location>; /// The type used to actually dispatch an XCM to its destination. type XcmRouter: SendXcm; /// Required origin for executing XCM messages, including the teleport functionality. If - /// successful, then it resolves to `MultiLocation` which exists as an interior location + /// successful, then it resolves to `Location` which exists as an interior location /// within this chain's XCM context. - type ExecuteXcmOrigin: EnsureOrigin< - ::RuntimeOrigin, - Success = MultiLocation, - >; + type ExecuteXcmOrigin: EnsureOrigin<::RuntimeOrigin, Success = Location>; /// Our XCM filter which messages to be executed using `XcmExecutor` must pass. - type XcmExecuteFilter: Contains<(MultiLocation, Xcm<::RuntimeCall>)>; + type XcmExecuteFilter: Contains<(Location, Xcm<::RuntimeCall>)>; /// Something to execute an XCM message. type XcmExecutor: ExecuteXcm<::RuntimeCall> + XcmAssetTransfers; /// Our XCM filter which messages to be teleported using the dedicated extrinsic must pass. - type XcmTeleportFilter: Contains<(MultiLocation, Vec)>; + type XcmTeleportFilter: Contains<(Location, Vec)>; /// Our XCM filter which messages to be reserve-transferred using the dedicated extrinsic /// must pass. - type XcmReserveTransferFilter: Contains<(MultiLocation, Vec)>; + type XcmReserveTransferFilter: Contains<(Location, Vec)>; /// Means of measuring the weight consumed by an XCM message locally. type Weigher: WeightBounds<::RuntimeCall>; /// This chain's Universal Location. - type UniversalLocation: Get; + type UniversalLocation: Get; /// The runtime `Origin` type. type RuntimeOrigin: From + From<::RuntimeOrigin>; @@ -264,9 +258,9 @@ pub mod pallet { /// The assets which we consider a given origin is trusted if they claim to have placed a /// lock. - type TrustedLockers: ContainsPair; + type TrustedLockers: ContainsPair; - /// How to get an `AccountId` value from a `MultiLocation`, useful for handling asset locks. + /// How to get an `AccountId` value from a `Location`, useful for handling asset locks. type SovereignAccountOf: ConvertLocation; /// The maximum number of local XCM locks that a single account may have. @@ -296,15 +290,15 @@ pub mod pallet { max_weight: Weight, ) -> Result { let origin_location = T::ExecuteXcmOrigin::ensure_origin(origin)?; - let hash = message.using_encoded(sp_io::hashing::blake2_256); + let mut hash = message.using_encoded(sp_io::hashing::blake2_256); let message = (*message).try_into().map_err(|()| Error::::BadVersion)?; let value = (origin_location, message); ensure!(T::XcmExecuteFilter::contains(&value), Error::::Filtered); let (origin_location, message) = value; - let outcome = T::XcmExecutor::execute_xcm_in_credit( + let outcome = T::XcmExecutor::prepare_and_execute( origin_location, message, - hash, + &mut hash, max_weight, max_weight, ); @@ -323,17 +317,17 @@ pub mod pallet { type WeightInfo = Self; fn send( origin: OriginFor, - dest: Box, + dest: Box, message: Box>, ) -> Result { let origin_location = T::SendXcmOrigin::ensure_origin(origin)?; let interior: Junctions = - origin_location.try_into().map_err(|_| Error::::InvalidOrigin)?; - let dest = MultiLocation::try_from(*dest).map_err(|()| Error::::BadVersion)?; + origin_location.clone().try_into().map_err(|_| Error::::InvalidOrigin)?; + let dest = Location::try_from(*dest).map_err(|()| Error::::BadVersion)?; let message: Xcm<()> = (*message).try_into().map_err(|()| Error::::BadVersion)?; - let message_id = - Self::send_xcm(interior, dest, message.clone()).map_err(Error::::from)?; + let message_id = Self::send_xcm(interior, dest.clone(), message.clone()) + .map_err(Error::::from)?; let e = Event::Sent { origin: origin_location, destination: dest, message, message_id }; Self::deposit_event(e); Ok(message_id) @@ -355,13 +349,13 @@ pub mod pallet { fn query( origin: OriginFor, timeout: BlockNumberFor, - match_querier: VersionedMultiLocation, + match_querier: VersionedLocation, ) -> Result { let responder = ::ExecuteXcmOrigin::ensure_origin(origin)?; let query_id = ::new_query( responder, timeout, - MultiLocation::try_from(match_querier) + Location::try_from(match_querier) .map_err(|_| Into::::into(Error::::BadVersion))?, ); @@ -375,16 +369,11 @@ pub mod pallet { /// Execution of an XCM message was attempted. Attempted { outcome: xcm::latest::Outcome }, /// A XCM message was sent. - Sent { - origin: MultiLocation, - destination: MultiLocation, - message: Xcm<()>, - message_id: XcmHash, - }, + Sent { origin: Location, destination: Location, message: Xcm<()>, message_id: XcmHash }, /// Query response received which does not match a registered query. This may be because a /// matching query was never registered, it may be because it is a duplicate response, or /// because the query timed out. - UnexpectedResponse { origin: MultiLocation, query_id: QueryId }, + UnexpectedResponse { origin: Location, query_id: QueryId }, /// Query response has been received and is ready for taking with `take_response`. There is /// no registered notification call. ResponseReady { query_id: QueryId, response: Response }, @@ -412,9 +401,9 @@ pub mod pallet { /// not match that expected. The query remains registered for a later, valid, response to /// be received and acted upon. InvalidResponder { - origin: MultiLocation, + origin: Location, query_id: QueryId, - expected_location: Option, + expected_location: Option, }, /// Expected query response has been received but the expected origin location placed in /// storage by this runtime previously cannot be decoded. The query remains registered. @@ -423,29 +412,29 @@ pub mod pallet { /// runtime should be readable prior to query timeout) and dangerous since the possibly /// valid response will be dropped. Manual governance intervention is probably going to be /// needed. - InvalidResponderVersion { origin: MultiLocation, query_id: QueryId }, + InvalidResponderVersion { origin: Location, query_id: QueryId }, /// Received query response has been read and removed. ResponseTaken { query_id: QueryId }, /// Some assets have been placed in an asset trap. - AssetsTrapped { hash: H256, origin: MultiLocation, assets: VersionedMultiAssets }, + AssetsTrapped { hash: H256, origin: Location, assets: VersionedAssets }, /// An XCM version change notification message has been attempted to be sent. /// /// The cost of sending it (borne by the chain) is included. VersionChangeNotified { - destination: MultiLocation, + destination: Location, result: XcmVersion, - cost: MultiAssets, + cost: Assets, message_id: XcmHash, }, /// The supported version of a location has been changed. This might be through an /// automatic notification or a manual intervention. - SupportedVersionChanged { location: MultiLocation, version: XcmVersion }, + SupportedVersionChanged { location: Location, version: XcmVersion }, /// A given location which had a version change subscription was dropped owing to an error /// sending the notification to it. - NotifyTargetSendFail { location: MultiLocation, query_id: QueryId, error: XcmError }, + NotifyTargetSendFail { location: Location, query_id: QueryId, error: XcmError }, /// A given location which had a version change subscription was dropped owing to an error /// migrating the location to our new XCM format. - NotifyTargetMigrationFail { location: VersionedMultiLocation, query_id: QueryId }, + NotifyTargetMigrationFail { location: VersionedLocation, query_id: QueryId }, /// Expected query response has been received but the expected querier location placed in /// storage by this runtime previously cannot be decoded. The query remains registered. /// @@ -453,48 +442,40 @@ pub mod pallet { /// runtime should be readable prior to query timeout) and dangerous since the possibly /// valid response will be dropped. Manual governance intervention is probably going to be /// needed. - InvalidQuerierVersion { origin: MultiLocation, query_id: QueryId }, + InvalidQuerierVersion { origin: Location, query_id: QueryId }, /// Expected query response has been received but the querier location of the response does /// not match the expected. The query remains registered for a later, valid, response to /// be received and acted upon. InvalidQuerier { - origin: MultiLocation, + origin: Location, query_id: QueryId, - expected_querier: MultiLocation, - maybe_actual_querier: Option, + expected_querier: Location, + maybe_actual_querier: Option, }, /// A remote has requested XCM version change notification from us and we have honored it. /// A version information message is sent to them and its cost is included. - VersionNotifyStarted { destination: MultiLocation, cost: MultiAssets, message_id: XcmHash }, + VersionNotifyStarted { destination: Location, cost: Assets, message_id: XcmHash }, /// We have requested that a remote chain send us XCM version change notifications. - VersionNotifyRequested { - destination: MultiLocation, - cost: MultiAssets, - message_id: XcmHash, - }, + VersionNotifyRequested { destination: Location, cost: Assets, message_id: XcmHash }, /// We have requested that a remote chain stops sending us XCM version change /// notifications. - VersionNotifyUnrequested { - destination: MultiLocation, - cost: MultiAssets, - message_id: XcmHash, - }, + VersionNotifyUnrequested { destination: Location, cost: Assets, message_id: XcmHash }, /// Fees were paid from a location for an operation (often for using `SendXcm`). - FeesPaid { paying: MultiLocation, fees: MultiAssets }, + FeesPaid { paying: Location, fees: Assets }, /// Some assets have been claimed from an asset trap - AssetsClaimed { hash: H256, origin: MultiLocation, assets: VersionedMultiAssets }, + AssetsClaimed { hash: H256, origin: Location, assets: VersionedAssets }, } #[pallet::origin] #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo, MaxEncodedLen)] pub enum Origin { /// It comes from somewhere in the XCM space wanting to transact. - Xcm(MultiLocation), + Xcm(Location), /// It comes as an expected response from an XCM location. - Response(MultiLocation), + Response(Location), } - impl From for Origin { - fn from(location: MultiLocation) -> Origin { + impl From for Origin { + fn from(location: Location) -> Origin { Origin::Xcm(location) } } @@ -511,7 +492,7 @@ pub mod pallet { Filtered, /// The message's weight could not be determined. UnweighableMessage, - /// The destination `MultiLocation` provided cannot be inverted. + /// The destination `Location` provided cannot be inverted. DestinationNotInvertible, /// The assets to be sent are empty. Empty, @@ -582,25 +563,25 @@ pub mod pallet { Pending { /// The `QueryResponse` XCM must have this origin to be considered a reply for this /// query. - responder: VersionedMultiLocation, + responder: VersionedLocation, /// The `QueryResponse` XCM must have this value as the `querier` field to be /// considered a reply for this query. If `None` then the querier is ignored. - maybe_match_querier: Option, + maybe_match_querier: Option, maybe_notify: Option<(u8, u8)>, timeout: BlockNumber, }, /// The query is for an ongoing version notification subscription. - VersionNotifier { origin: VersionedMultiLocation, is_active: bool }, + VersionNotifier { origin: VersionedLocation, is_active: bool }, /// A response has been received. Ready { response: VersionedResponse, at: BlockNumber }, } #[derive(Copy, Clone)] - pub(crate) struct LatestVersionedMultiLocation<'a>(pub(crate) &'a MultiLocation); - impl<'a> EncodeLike for LatestVersionedMultiLocation<'a> {} - impl<'a> Encode for LatestVersionedMultiLocation<'a> { + pub(crate) struct LatestVersionedLocation<'a>(pub(crate) &'a Location); + impl<'a> EncodeLike for LatestVersionedLocation<'a> {} + impl<'a> Encode for LatestVersionedLocation<'a> { fn encode(&self) -> Vec { - let mut r = VersionedMultiLocation::from(MultiLocation::default()).encode(); + let mut r = VersionedLocation::from(Location::default()).encode(); r.truncate(1); self.0.using_encoded(|d| r.extend_from_slice(d)); r @@ -633,7 +614,7 @@ pub mod pallet { /// The existing asset traps. /// - /// Key is the blake2 256 hash of (origin, versioned `MultiAssets`) pair. Value is the number of + /// Key is the blake2 256 hash of (origin, versioned `Assets`) pair. Value is the number of /// times this pair has been trapped (usually just 1 if it exists at all). #[pallet::storage] #[pallet::getter(fn asset_trap)] @@ -652,7 +633,7 @@ pub mod pallet { Twox64Concat, XcmVersion, Blake2_128Concat, - VersionedMultiLocation, + VersionedLocation, XcmVersion, OptionQuery, >; @@ -664,7 +645,7 @@ pub mod pallet { Twox64Concat, XcmVersion, Blake2_128Concat, - VersionedMultiLocation, + VersionedLocation, QueryId, OptionQuery, >; @@ -677,7 +658,7 @@ pub mod pallet { Twox64Concat, XcmVersion, Blake2_128Concat, - VersionedMultiLocation, + VersionedLocation, (QueryId, Weight, XcmVersion), OptionQuery, >; @@ -696,7 +677,7 @@ pub mod pallet { #[pallet::whitelist_storage] pub(super) type VersionDiscoveryQueue = StorageValue< _, - BoundedVec<(VersionedMultiLocation, u32), VersionDiscoveryQueueSize>, + BoundedVec<(VersionedLocation, u32), VersionDiscoveryQueueSize>, ValueQuery, >; @@ -711,9 +692,9 @@ pub mod pallet { /// Total amount of the asset held by the remote lock. pub amount: u128, /// The owner of the locked asset. - pub owner: VersionedMultiLocation, + pub owner: VersionedLocation, /// The location which holds the original lock. - pub locker: VersionedMultiLocation, + pub locker: VersionedLocation, /// Local consumers of the remote lock with a consumer identifier and the amount /// of fungible asset every consumer holds. /// Every consumer can hold up to total amount of the remote lock. @@ -747,7 +728,7 @@ pub mod pallet { _, Blake2_128Concat, T::AccountId, - BoundedVec<(BalanceOf, VersionedMultiLocation), T::MaxLockers>, + BoundedVec<(BalanceOf, VersionedLocation), T::MaxLockers>, OptionQuery, >; @@ -795,7 +776,7 @@ pub mod pallet { weight_used.saturating_accrue(T::DbWeight::get().reads_writes(1, 1)); q.sort_by_key(|i| i.1); while let Some((versioned_dest, _)) = q.pop() { - if let Ok(dest) = MultiLocation::try_from(versioned_dest) { + if let Ok(dest) = Location::try_from(versioned_dest) { if Self::request_version_notify(dest).is_ok() { // TODO: correct weights. weight_used.saturating_accrue(T::DbWeight::get().reads_writes(1, 1)); @@ -819,12 +800,12 @@ pub mod pallet { #[derive(Clone, Eq, PartialEq, Encode, Decode, RuntimeDebug, TypeInfo)] enum QueryStatusV0 { Pending { - responder: VersionedMultiLocation, + responder: VersionedLocation, maybe_notify: Option<(u8, u8)>, timeout: BlockNumber, }, VersionNotifier { - origin: VersionedMultiLocation, + origin: VersionedLocation, is_active: bool, }, Ready { @@ -840,7 +821,7 @@ pub mod pallet { responder, maybe_notify, timeout, - maybe_match_querier: Some(MultiLocation::here().into()), + maybe_match_querier: Some(Location::here().into()), }, VersionNotifier { origin, is_active } => QueryStatus::VersionNotifier { origin, is_active }, @@ -889,7 +870,7 @@ pub mod pallet { #[pallet::weight(T::WeightInfo::send())] pub fn send( origin: OriginFor, - dest: Box, + dest: Box, message: Box>, ) -> DispatchResult { >::send(origin, dest, message)?; @@ -905,9 +886,9 @@ pub mod pallet { /// with all fees taken as needed from the asset. /// /// - `origin`: Must be capable of withdrawing the `assets` and executing XCM. - /// - `dest`: Destination context for the assets. Will typically be `X2(Parent, - /// Parachain(..))` to send from parachain to parachain, or `X1(Parachain(..))` to send - /// from relay to parachain. + /// - `dest`: Destination context for the assets. Will typically be `[Parent, + /// Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from + /// relay to parachain. /// - `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will /// generally be an `AccountId32` value. /// - `assets`: The assets to be withdrawn. This should include the assets used to pay the @@ -916,8 +897,8 @@ pub mod pallet { /// fees. #[pallet::call_index(1)] #[pallet::weight({ - let maybe_assets: Result = (*assets.clone()).try_into(); - let maybe_dest: Result = (*dest.clone()).try_into(); + let maybe_assets: Result = (*assets.clone()).try_into(); + let maybe_dest: Result = (*dest.clone()).try_into(); match (maybe_assets, maybe_dest) { (Ok(assets), Ok(dest)) => { use sp_std::vec; @@ -934,9 +915,9 @@ pub mod pallet { })] pub fn teleport_assets( origin: OriginFor, - dest: Box, - beneficiary: Box, - assets: Box, + dest: Box, + beneficiary: Box, + assets: Box, fee_asset_item: u32, ) -> DispatchResult { Self::do_teleport_assets(origin, dest, beneficiary, assets, fee_asset_item, Unlimited) @@ -963,9 +944,9 @@ pub mod pallet { /// with all fees taken as needed from the asset. /// /// - `origin`: Must be capable of withdrawing the `assets` and executing XCM. - /// - `dest`: Destination context for the assets. Will typically be `X2(Parent, - /// Parachain(..))` to send from parachain to parachain, or `X1(Parachain(..))` to send - /// from relay to parachain. + /// - `dest`: Destination context for the assets. Will typically be `[Parent, + /// Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from + /// relay to parachain. /// - `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will /// generally be an `AccountId32` value. /// - `assets`: The assets to be withdrawn. This should include the assets used to pay the @@ -974,8 +955,8 @@ pub mod pallet { /// fees. #[pallet::call_index(2)] #[pallet::weight({ - let maybe_assets: Result = (*assets.clone()).try_into(); - let maybe_dest: Result = (*dest.clone()).try_into(); + let maybe_assets: Result = (*assets.clone()).try_into(); + let maybe_dest: Result = (*dest.clone()).try_into(); match (maybe_assets, maybe_dest) { (Ok(assets), Ok(dest)) => { use sp_std::vec; @@ -992,9 +973,9 @@ pub mod pallet { })] pub fn reserve_transfer_assets( origin: OriginFor, - dest: Box, - beneficiary: Box, - assets: Box, + dest: Box, + beneficiary: Box, + assets: Box, fee_asset_item: u32, ) -> DispatchResult { Self::do_reserve_transfer_assets( @@ -1045,16 +1026,12 @@ pub mod pallet { #[pallet::weight(T::WeightInfo::force_xcm_version())] pub fn force_xcm_version( origin: OriginFor, - location: Box, + location: Box, version: XcmVersion, ) -> DispatchResult { T::AdminOrigin::ensure_origin(origin)?; let location = *location; - SupportedVersion::::insert( - XCM_VERSION, - LatestVersionedMultiLocation(&location), - version, - ); + SupportedVersion::::insert(XCM_VERSION, LatestVersionedLocation(&location), version); Self::deposit_event(Event::SupportedVersionChanged { location, version }); Ok(()) } @@ -1083,10 +1060,10 @@ pub mod pallet { #[pallet::weight(T::WeightInfo::force_subscribe_version_notify())] pub fn force_subscribe_version_notify( origin: OriginFor, - location: Box, + location: Box, ) -> DispatchResult { T::AdminOrigin::ensure_origin(origin)?; - let location: MultiLocation = + let location: Location = (*location).try_into().map_err(|()| Error::::BadLocation)?; Self::request_version_notify(location).map_err(|e| { match e { @@ -1107,10 +1084,10 @@ pub mod pallet { #[pallet::weight(T::WeightInfo::force_unsubscribe_version_notify())] pub fn force_unsubscribe_version_notify( origin: OriginFor, - location: Box, + location: Box, ) -> DispatchResult { T::AdminOrigin::ensure_origin(origin)?; - let location: MultiLocation = + let location: Location = (*location).try_into().map_err(|()| Error::::BadLocation)?; Self::unrequest_version_notify(location).map_err(|e| { match e { @@ -1141,9 +1118,9 @@ pub mod pallet { /// at risk. /// /// - `origin`: Must be capable of withdrawing the `assets` and executing XCM. - /// - `dest`: Destination context for the assets. Will typically be `X2(Parent, - /// Parachain(..))` to send from parachain to parachain, or `X1(Parachain(..))` to send - /// from relay to parachain. + /// - `dest`: Destination context for the assets. Will typically be `[Parent, + /// Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from + /// relay to parachain. /// - `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will /// generally be an `AccountId32` value. /// - `assets`: The assets to be withdrawn. This should include the assets used to pay the @@ -1153,8 +1130,8 @@ pub mod pallet { /// - `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. #[pallet::call_index(8)] #[pallet::weight({ - let maybe_assets: Result = (*assets.clone()).try_into(); - let maybe_dest: Result = (*dest.clone()).try_into(); + let maybe_assets: Result = (*assets.clone()).try_into(); + let maybe_dest: Result = (*dest.clone()).try_into(); match (maybe_assets, maybe_dest) { (Ok(assets), Ok(dest)) => { use sp_std::vec; @@ -1171,9 +1148,9 @@ pub mod pallet { })] pub fn limited_reserve_transfer_assets( origin: OriginFor, - dest: Box, - beneficiary: Box, - assets: Box, + dest: Box, + beneficiary: Box, + assets: Box, fee_asset_item: u32, weight_limit: WeightLimit, ) -> DispatchResult { @@ -1195,9 +1172,9 @@ pub mod pallet { /// at risk. /// /// - `origin`: Must be capable of withdrawing the `assets` and executing XCM. - /// - `dest`: Destination context for the assets. Will typically be `X2(Parent, - /// Parachain(..))` to send from parachain to parachain, or `X1(Parachain(..))` to send - /// from relay to parachain. + /// - `dest`: Destination context for the assets. Will typically be `[Parent, + /// Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from + /// relay to parachain. /// - `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will /// generally be an `AccountId32` value. /// - `assets`: The assets to be withdrawn. This should include the assets used to pay the @@ -1207,8 +1184,8 @@ pub mod pallet { /// - `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. #[pallet::call_index(9)] #[pallet::weight({ - let maybe_assets: Result = (*assets.clone()).try_into(); - let maybe_dest: Result = (*dest.clone()).try_into(); + let maybe_assets: Result = (*assets.clone()).try_into(); + let maybe_dest: Result = (*dest.clone()).try_into(); match (maybe_assets, maybe_dest) { (Ok(assets), Ok(dest)) => { use sp_std::vec; @@ -1225,9 +1202,9 @@ pub mod pallet { })] pub fn limited_teleport_assets( origin: OriginFor, - dest: Box, - beneficiary: Box, - assets: Box, + dest: Box, + beneficiary: Box, + assets: Box, fee_asset_item: u32, weight_limit: WeightLimit, ) -> DispatchResult { @@ -1288,8 +1265,8 @@ pub mod pallet { /// - `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. #[pallet::call_index(11)] #[pallet::weight({ - let maybe_assets: Result = (*assets.clone()).try_into(); - let maybe_dest: Result = (*dest.clone()).try_into(); + let maybe_assets: Result = (*assets.clone()).try_into(); + let maybe_dest: Result = (*dest.clone()).try_into(); match (maybe_assets, maybe_dest) { (Ok(assets), Ok(dest)) => { use sp_std::vec; @@ -1309,17 +1286,17 @@ pub mod pallet { })] pub fn transfer_assets( origin: OriginFor, - dest: Box, - beneficiary: Box, - assets: Box, + dest: Box, + beneficiary: Box, + assets: Box, fee_asset_item: u32, weight_limit: WeightLimit, ) -> DispatchResult { let origin = T::ExecuteXcmOrigin::ensure_origin(origin)?; let dest = (*dest).try_into().map_err(|()| Error::::BadVersion)?; - let beneficiary: MultiLocation = + let beneficiary: Location = (*beneficiary).try_into().map_err(|()| Error::::BadVersion)?; - let assets: MultiAssets = (*assets).try_into().map_err(|()| Error::::BadVersion)?; + let assets: Assets = (*assets).try_into().map_err(|()| Error::::BadVersion)?; log::debug!( target: "xcm::pallet_xcm::transfer_assets", "origin {:?}, dest {:?}, beneficiary {:?}, assets {:?}, fee-idx {:?}, weight_limit {:?}", @@ -1353,17 +1330,25 @@ pub mod pallet { // added to assets transfers XCM programs let fees = assets.remove(fee_asset_item); let (local_xcm, remote_xcm) = match fees_transfer_type { - TransferType::LocalReserve => - Self::local_reserve_fees_instructions(origin, dest, fees, weight_limit)?, + TransferType::LocalReserve => Self::local_reserve_fees_instructions( + origin.clone(), + dest.clone(), + fees, + weight_limit, + )?, TransferType::DestinationReserve => Self::destination_reserve_fees_instructions( - origin, - dest, + origin.clone(), + dest.clone(), fees, weight_limit, )?, - TransferType::Teleport => - Self::teleport_fees_instructions(origin, dest, fees, weight_limit)?, + TransferType::Teleport => Self::teleport_fees_instructions( + origin.clone(), + dest.clone(), + fees, + weight_limit, + )?, TransferType::RemoteReserve(_) => return Err(Error::::InvalidAssetUnsupportedReserve.into()), }; @@ -1390,7 +1375,7 @@ const MAX_ASSETS_FOR_TRANSFER: usize = 2; #[derive(Clone, PartialEq)] enum FeesHandling { /// `fees` asset can be batch-transferred with rest of assets using same XCM instructions. - Batched { fees: MultiAsset }, + Batched { fees: Asset }, /// fees cannot be batched, they are handled separately using XCM programs here. Separate { local_xcm: Xcm<::RuntimeCall>, remote_xcm: Xcm<()> }, } @@ -1416,9 +1401,9 @@ impl QueryHandler for Pallet { /// Attempt to create a new query ID and register it as a query that is yet to respond. fn new_query( - responder: impl Into, + responder: impl Into, timeout: BlockNumberFor, - match_querier: impl Into, + match_querier: impl Into, ) -> Self::QueryId { Self::do_new_query(responder, None, timeout, match_querier) } @@ -1427,7 +1412,7 @@ impl QueryHandler for Pallet { /// value. fn report_outcome( message: &mut Xcm<()>, - responder: impl Into, + responder: impl Into, timeout: Self::BlockNumber, ) -> Result { let responder = responder.into(); @@ -1474,9 +1459,9 @@ impl Pallet { /// /// Validate `assets` to all have same `TransferType`. fn find_fee_and_assets_transfer_types( - assets: &[MultiAsset], + assets: &[Asset], fee_asset_item: usize, - dest: &MultiLocation, + dest: &Location, ) -> Result<(TransferType, TransferType), Error> { let mut fees_transfer_type = None; let mut assets_transfer_type = None; @@ -1502,7 +1487,7 @@ impl Pallet { } // single asset also marked as fee item if assets.len() == 1 { - assets_transfer_type = fees_transfer_type + assets_transfer_type = fees_transfer_type.clone() } Ok(( fees_transfer_type.ok_or(Error::::Empty)?, @@ -1512,17 +1497,17 @@ impl Pallet { fn do_reserve_transfer_assets( origin: OriginFor, - dest: Box, - beneficiary: Box, - assets: Box, + dest: Box, + beneficiary: Box, + assets: Box, fee_asset_item: u32, weight_limit: WeightLimit, ) -> DispatchResult { let origin_location = T::ExecuteXcmOrigin::ensure_origin(origin)?; let dest = (*dest).try_into().map_err(|()| Error::::BadVersion)?; - let beneficiary: MultiLocation = + let beneficiary: Location = (*beneficiary).try_into().map_err(|()| Error::::BadVersion)?; - let assets: MultiAssets = (*assets).try_into().map_err(|()| Error::::BadVersion)?; + let assets: Assets = (*assets).try_into().map_err(|()| Error::::BadVersion)?; log::debug!( target: "xcm::pallet_xcm::do_reserve_transfer_assets", "origin {:?}, dest {:?}, beneficiary {:?}, assets {:?}, fee-idx {:?}", @@ -1558,17 +1543,17 @@ impl Pallet { fn do_teleport_assets( origin: OriginFor, - dest: Box, - beneficiary: Box, - assets: Box, + dest: Box, + beneficiary: Box, + assets: Box, fee_asset_item: u32, weight_limit: WeightLimit, ) -> DispatchResult { let origin_location = T::ExecuteXcmOrigin::ensure_origin(origin)?; let dest = (*dest).try_into().map_err(|()| Error::::BadVersion)?; - let beneficiary: MultiLocation = + let beneficiary: Location = (*beneficiary).try_into().map_err(|()| Error::::BadVersion)?; - let assets: MultiAssets = (*assets).try_into().map_err(|()| Error::::BadVersion)?; + let assets: Assets = (*assets).try_into().map_err(|()| Error::::BadVersion)?; log::debug!( target: "xcm::pallet_xcm::do_teleport_assets", "origin {:?}, dest {:?}, beneficiary {:?}, assets {:?}, fee-idx {:?}, weight_limit {:?}", @@ -1598,10 +1583,10 @@ impl Pallet { } fn build_and_execute_xcm_transfer_type( - origin: MultiLocation, - dest: MultiLocation, - beneficiary: MultiLocation, - assets: Vec, + origin: Location, + dest: Location, + beneficiary: Location, + assets: Vec, transfer_type: TransferType, fees: FeesHandling, weight_limit: WeightLimit, @@ -1615,8 +1600,8 @@ impl Pallet { let (mut local_xcm, remote_xcm) = match transfer_type { TransferType::LocalReserve => { let (local, remote) = Self::local_reserve_transfer_programs( - origin, - dest, + origin.clone(), + dest.clone(), beneficiary, assets, fees, @@ -1626,8 +1611,8 @@ impl Pallet { }, TransferType::DestinationReserve => { let (local, remote) = Self::destination_reserve_transfer_programs( - origin, - dest, + origin.clone(), + dest.clone(), beneficiary, assets, fees, @@ -1641,9 +1626,9 @@ impl Pallet { _ => return Err(Error::::InvalidAssetUnsupportedReserve.into()), }; let local = Self::remote_reserve_transfer_program( - origin, + origin.clone(), reserve, - dest, + dest.clone(), beneficiary, assets, fees, @@ -1653,8 +1638,8 @@ impl Pallet { }, TransferType::Teleport => { let (local, remote) = Self::teleport_assets_program( - origin, - dest, + origin.clone(), + dest.clone(), beneficiary, assets, fees, @@ -1665,9 +1650,14 @@ impl Pallet { }; let weight = T::Weigher::weight(&mut local_xcm).map_err(|()| Error::::UnweighableMessage)?; - let hash = local_xcm.using_encoded(sp_io::hashing::blake2_256); - let outcome = - T::XcmExecutor::execute_xcm_in_credit(origin, local_xcm, hash, weight, weight); + let mut hash = local_xcm.using_encoded(sp_io::hashing::blake2_256); + let outcome = T::XcmExecutor::prepare_and_execute( + origin.clone(), + local_xcm, + &mut hash, + weight, + weight, + ); Self::deposit_event(Event::Attempted { outcome: outcome.clone() }); outcome.ensure_complete().map_err(|error| { log::error!( @@ -1678,10 +1668,10 @@ impl Pallet { })?; if let Some(remote_xcm) = remote_xcm { - let (ticket, price) = validate_send::(dest, remote_xcm.clone()) + let (ticket, price) = validate_send::(dest.clone(), remote_xcm.clone()) .map_err(Error::::from)?; if origin != Here.into_location() { - Self::charge_fees(origin, price).map_err(|error| { + Self::charge_fees(origin.clone(), price).map_err(|error| { log::error!( target: "xcm::pallet_xcm::build_and_execute_xcm_transfer_type", "Unable to charge fee with error {:?}", error @@ -1698,7 +1688,7 @@ impl Pallet { } fn add_fees_to_xcm( - dest: MultiLocation, + dest: Location, fees: FeesHandling, weight_limit: WeightLimit, local: &mut Xcm<::RuntimeCall>, @@ -1710,7 +1700,7 @@ impl Pallet { // no custom fees instructions, they are batched together with `assets` transfer; // BuyExecution happens after receiving all `assets` let reanchored_fees = - fees.reanchored(&dest, context).map_err(|_| Error::::CannotReanchor)?; + fees.reanchored(&dest, &context).map_err(|_| Error::::CannotReanchor)?; // buy execution using `fees` batched together with above `reanchored_assets` remote.inner_mut().push(BuyExecution { fees: reanchored_fees, weight_limit }); }, @@ -1728,9 +1718,9 @@ impl Pallet { } fn local_reserve_fees_instructions( - origin: MultiLocation, - dest: MultiLocation, - fees: MultiAsset, + origin: Location, + dest: Location, + fees: Asset, weight_limit: WeightLimit, ) -> Result<(Xcm<::RuntimeCall>, Xcm<()>), Error> { let value = (origin, vec![fees.clone()]); @@ -1739,7 +1729,7 @@ impl Pallet { let context = T::UniversalLocation::get(); let reanchored_fees = fees .clone() - .reanchored(&dest, context) + .reanchored(&dest, &context) .map_err(|_| Error::::CannotReanchor)?; let local_execute_xcm = Xcm(vec![ @@ -1756,10 +1746,10 @@ impl Pallet { } fn local_reserve_transfer_programs( - origin: MultiLocation, - dest: MultiLocation, - beneficiary: MultiLocation, - assets: Vec, + origin: Location, + dest: Location, + beneficiary: Location, + assets: Vec, fees: FeesHandling, weight_limit: WeightLimit, ) -> Result<(Xcm<::RuntimeCall>, Xcm<()>), Error> { @@ -1770,17 +1760,17 @@ impl Pallet { // max assets is `assets` (+ potentially separately handled fee) let max_assets = assets.len() as u32 + if matches!(&fees, FeesHandling::Batched { .. }) { 0 } else { 1 }; - let assets: MultiAssets = assets.into(); + let assets: Assets = assets.into(); let context = T::UniversalLocation::get(); let mut reanchored_assets = assets.clone(); reanchored_assets - .reanchor(&dest, context) + .reanchor(&dest, &context) .map_err(|_| Error::::CannotReanchor)?; // XCM instructions to be executed on local chain let mut local_execute_xcm = Xcm(vec![ // locally move `assets` to `dest`s local sovereign account - TransferAsset { assets, beneficiary: dest }, + TransferAsset { assets, beneficiary: dest.clone() }, ]); // XCM instructions to be executed on destination chain let mut xcm_on_dest = Xcm(vec![ @@ -1800,9 +1790,9 @@ impl Pallet { } fn destination_reserve_fees_instructions( - origin: MultiLocation, - dest: MultiLocation, - fees: MultiAsset, + origin: Location, + dest: Location, + fees: Asset, weight_limit: WeightLimit, ) -> Result<(Xcm<::RuntimeCall>, Xcm<()>), Error> { let value = (origin, vec![fees.clone()]); @@ -1811,9 +1801,9 @@ impl Pallet { let context = T::UniversalLocation::get(); let reanchored_fees = fees .clone() - .reanchored(&dest, context) + .reanchored(&dest, &context) .map_err(|_| Error::::CannotReanchor)?; - let fees: MultiAssets = fees.into(); + let fees: Assets = fees.into(); let local_execute_xcm = Xcm(vec![ // withdraw reserve-based fees (derivatives) @@ -1831,10 +1821,10 @@ impl Pallet { } fn destination_reserve_transfer_programs( - origin: MultiLocation, - dest: MultiLocation, - beneficiary: MultiLocation, - assets: Vec, + origin: Location, + dest: Location, + beneficiary: Location, + assets: Vec, fees: FeesHandling, weight_limit: WeightLimit, ) -> Result<(Xcm<::RuntimeCall>, Xcm<()>), Error> { @@ -1845,11 +1835,11 @@ impl Pallet { // max assets is `assets` (+ potentially separately handled fee) let max_assets = assets.len() as u32 + if matches!(&fees, FeesHandling::Batched { .. }) { 0 } else { 1 }; - let assets: MultiAssets = assets.into(); + let assets: Assets = assets.into(); let context = T::UniversalLocation::get(); let mut reanchored_assets = assets.clone(); reanchored_assets - .reanchor(&dest, context) + .reanchor(&dest, &context) .map_err(|_| Error::::CannotReanchor)?; // XCM instructions to be executed on local chain @@ -1878,12 +1868,12 @@ impl Pallet { // function assumes fees and assets have the same remote reserve fn remote_reserve_transfer_program( - origin: MultiLocation, - reserve: MultiLocation, - dest: MultiLocation, - beneficiary: MultiLocation, - assets: Vec, - fees: MultiAsset, + origin: Location, + reserve: Location, + dest: Location, + beneficiary: Location, + assets: Vec, + fees: Asset, weight_limit: WeightLimit, ) -> Result::RuntimeCall>, Error> { let value = (origin, assets); @@ -1897,13 +1887,14 @@ impl Pallet { let (fees_half_1, fees_half_2) = Self::halve_fees(fees)?; // identifies fee item as seen by `reserve` - to be used at reserve chain let reserve_fees = fees_half_1 - .reanchored(&reserve, context) + .reanchored(&reserve, &context) .map_err(|_| Error::::CannotReanchor)?; // identifies fee item as seen by `dest` - to be used at destination chain - let dest_fees = - fees_half_2.reanchored(&dest, context).map_err(|_| Error::::CannotReanchor)?; + let dest_fees = fees_half_2 + .reanchored(&dest, &context) + .map_err(|_| Error::::CannotReanchor)?; // identifies `dest` as seen by `reserve` - let dest = dest.reanchored(&reserve, context).map_err(|_| Error::::CannotReanchor)?; + let dest = dest.reanchored(&reserve, &context).map_err(|_| Error::::CannotReanchor)?; // xcm to be executed at dest let xcm_on_dest = Xcm(vec![ BuyExecution { fees: dest_fees, weight_limit: weight_limit.clone() }, @@ -1925,9 +1916,9 @@ impl Pallet { } fn teleport_fees_instructions( - origin: MultiLocation, - dest: MultiLocation, - fees: MultiAsset, + origin: Location, + dest: Location, + fees: Asset, weight_limit: WeightLimit, ) -> Result<(Xcm<::RuntimeCall>, Xcm<()>), Error> { let value = (origin, vec![fees.clone()]); @@ -1936,7 +1927,7 @@ impl Pallet { let context = T::UniversalLocation::get(); let reanchored_fees = fees .clone() - .reanchored(&dest, context) + .reanchored(&dest, &context) .map_err(|_| Error::::CannotReanchor)?; // XcmContext irrelevant in teleports checks @@ -1960,7 +1951,7 @@ impl Pallet { &dummy_context, ); - let fees: MultiAssets = fees.into(); + let fees: Assets = fees.into(); let local_execute_xcm = Xcm(vec![ // withdraw fees WithdrawAsset(fees.clone()), @@ -1977,10 +1968,10 @@ impl Pallet { } fn teleport_assets_program( - origin: MultiLocation, - dest: MultiLocation, - beneficiary: MultiLocation, - assets: Vec, + origin: Location, + dest: Location, + beneficiary: Location, + assets: Vec, fees: FeesHandling, weight_limit: WeightLimit, ) -> Result<(Xcm<::RuntimeCall>, Xcm<()>), Error> { @@ -1992,10 +1983,10 @@ impl Pallet { let max_assets = assets.len() as u32 + if matches!(&fees, FeesHandling::Batched { .. }) { 0 } else { 1 }; let context = T::UniversalLocation::get(); - let assets: MultiAssets = assets.into(); + let assets: Assets = assets.into(); let mut reanchored_assets = assets.clone(); reanchored_assets - .reanchor(&dest, context) + .reanchor(&dest, &context) .map_err(|_| Error::::CannotReanchor)?; // XcmContext irrelevant in teleports checks @@ -2048,14 +2039,14 @@ impl Pallet { } /// Halve `fees` fungible amount. - pub(crate) fn halve_fees(fees: MultiAsset) -> Result<(MultiAsset, MultiAsset), Error> { + pub(crate) fn halve_fees(fees: Asset) -> Result<(Asset, Asset), Error> { match fees.fun { Fungible(amount) => { let fee1 = amount.saturating_div(2); let fee2 = amount.saturating_sub(fee1); ensure!(fee1 > 0, Error::::FeesNotMet); ensure!(fee2 > 0, Error::::FeesNotMet); - Ok((MultiAsset::from((fees.id, fee1)), MultiAsset::from((fees.id, fee2)))) + Ok((Asset::from((fees.id.clone(), fee1)), Asset::from((fees.id.clone(), fee2)))) }, NonFungible(_) => Err(Error::::FeesNotMet), } @@ -2119,7 +2110,7 @@ impl Pallet { }; while let Some((key, value)) = iter.next() { let (query_id, max_weight, target_xcm_version) = value; - let new_key: MultiLocation = match key.clone().try_into() { + let new_key: Location = match key.clone().try_into() { Ok(k) if target_xcm_version != xcm_version => k, _ => { // We don't early return here since we need to be certain that we @@ -2131,7 +2122,7 @@ impl Pallet { let response = Response::Version(xcm_version); let message = Xcm(vec![QueryResponse { query_id, response, max_weight, querier: None }]); - let event = match send_xcm::(new_key, message) { + let event = match send_xcm::(new_key.clone(), message) { Ok((message_id, cost)) => { let value = (query_id, max_weight, xcm_version); VersionNotifyTargets::::insert(XCM_VERSION, key, value); @@ -2160,7 +2151,7 @@ impl Pallet { for v in 0..XCM_VERSION { for (old_key, value) in VersionNotifyTargets::::drain_prefix(v) { let (query_id, max_weight, target_xcm_version) = value; - let new_key = match MultiLocation::try_from(old_key.clone()) { + let new_key = match Location::try_from(old_key.clone()) { Ok(k) => k, Err(()) => { Self::deposit_event(Event::NotifyTargetMigrationFail { @@ -2175,7 +2166,7 @@ impl Pallet { }, }; - let versioned_key = LatestVersionedMultiLocation(&new_key); + let versioned_key = LatestVersionedLocation(&new_key); if target_xcm_version == xcm_version { VersionNotifyTargets::::insert(XCM_VERSION, versioned_key, value); weight_used.saturating_accrue(vnt_migrate_weight); @@ -2188,7 +2179,7 @@ impl Pallet { max_weight, querier: None, }]); - let event = match send_xcm::(new_key, message) { + let event = match send_xcm::(new_key.clone(), message) { Ok((message_id, cost)) => { VersionNotifyTargets::::insert( XCM_VERSION, @@ -2221,9 +2212,9 @@ impl Pallet { } /// Request that `dest` informs us of its version. - pub fn request_version_notify(dest: impl Into) -> XcmResult { + pub fn request_version_notify(dest: impl Into) -> XcmResult { let dest = dest.into(); - let versioned_dest = VersionedMultiLocation::from(dest); + let versioned_dest = VersionedLocation::from(dest.clone()); let already = VersionNotifiers::::contains_key(XCM_VERSION, &versioned_dest); ensure!(!already, XcmError::InvalidLocation); let query_id = QueryCounter::::mutate(|q| { @@ -2233,7 +2224,7 @@ impl Pallet { }); // TODO #3735: Correct weight. let instruction = SubscribeVersion { query_id, max_response_weight: Weight::zero() }; - let (message_id, cost) = send_xcm::(dest, Xcm(vec![instruction]))?; + let (message_id, cost) = send_xcm::(dest.clone(), Xcm(vec![instruction]))?; Self::deposit_event(Event::VersionNotifyRequested { destination: dest, cost, message_id }); VersionNotifiers::::insert(XCM_VERSION, &versioned_dest, query_id); let query_status = @@ -2243,12 +2234,13 @@ impl Pallet { } /// Request that `dest` ceases informing us of its version. - pub fn unrequest_version_notify(dest: impl Into) -> XcmResult { + pub fn unrequest_version_notify(dest: impl Into) -> XcmResult { let dest = dest.into(); - let versioned_dest = LatestVersionedMultiLocation(&dest); + let versioned_dest = LatestVersionedLocation(&dest); let query_id = VersionNotifiers::::take(XCM_VERSION, versioned_dest) .ok_or(XcmError::InvalidLocation)?; - let (message_id, cost) = send_xcm::(dest, Xcm(vec![UnsubscribeVersion]))?; + let (message_id, cost) = + send_xcm::(dest.clone(), Xcm(vec![UnsubscribeVersion]))?; Self::deposit_event(Event::VersionNotifyUnrequested { destination: dest, cost, @@ -2263,13 +2255,13 @@ impl Pallet { /// are not charged (and instead borne by the chain). pub fn send_xcm( interior: impl Into, - dest: impl Into, + dest: impl Into, mut message: Xcm<()>, ) -> Result { let interior = interior.into(); let dest = dest.into(); let maybe_fee_payer = if interior != Junctions::Here { - message.0.insert(0, DescendOrigin(interior)); + message.0.insert(0, DescendOrigin(interior.clone())); Some(interior.into()) } else { None @@ -2289,10 +2281,10 @@ impl Pallet { /// Create a new expectation of a query response with the querier being here. fn do_new_query( - responder: impl Into, + responder: impl Into, maybe_notify: Option<(u8, u8)>, timeout: BlockNumberFor, - match_querier: impl Into, + match_querier: impl Into, ) -> u64 { QueryCounter::::mutate(|q| { let r = *q; @@ -2334,7 +2326,7 @@ impl Pallet { /// may be put in the overweight queue and need to be manually executed. pub fn report_outcome_notify( message: &mut Xcm<()>, - responder: impl Into, + responder: impl Into, notify: impl Into<::RuntimeCall>, timeout: BlockNumberFor, ) -> Result<(), XcmError> { @@ -2354,10 +2346,10 @@ impl Pallet { /// Attempt to create a new query ID and register it as a query that is yet to respond, and /// which will call a dispatchable when a response happens. pub fn new_notify_query( - responder: impl Into, + responder: impl Into, notify: impl Into<::RuntimeCall>, timeout: BlockNumberFor, - match_querier: impl Into, + match_querier: impl Into, ) -> u64 { let notify = notify.into().using_encoded(|mut bytes| Decode::decode(&mut bytes)).expect( "decode input is output of Call encode; Call guaranteed to have two enums; qed", @@ -2367,13 +2359,13 @@ impl Pallet { /// Note that a particular destination to whom we would like to send a message is unknown /// and queue it for version discovery. - fn note_unknown_version(dest: &MultiLocation) { + fn note_unknown_version(dest: &Location) { log::trace!( target: "xcm::pallet_xcm::note_unknown_version", "XCM version is unknown for destination: {:?}", dest, ); - let versioned_dest = VersionedMultiLocation::from(*dest); + let versioned_dest = VersionedLocation::from(dest.clone()); VersionDiscoveryQueue::::mutate(|q| { if let Some(index) = q.iter().position(|i| &i.0 == &versioned_dest) { // exists - just bump the count. @@ -2389,8 +2381,8 @@ impl Pallet { /// Fails if: /// - the `assets` are not known on this chain; /// - the `assets` cannot be withdrawn with that location as the Origin. - fn charge_fees(location: MultiLocation, assets: MultiAssets) -> DispatchResult { - T::XcmExecutor::charge_fees(location, assets.clone()) + fn charge_fees(location: Location, assets: Assets) -> DispatchResult { + T::XcmExecutor::charge_fees(location.clone(), assets.clone()) .map_err(|_| Error::::FeesNotMet)?; Self::deposit_event(Event::FeesPaid { paying: location, fees: assets }); Ok(()) @@ -2400,7 +2392,7 @@ impl Pallet { pub struct LockTicket { sovereign_account: T::AccountId, amount: BalanceOf, - unlocker: MultiLocation, + unlocker: Location, item_index: Option, } @@ -2434,7 +2426,7 @@ impl xcm_executor::traits::Enact for LockTicket { pub struct UnlockTicket { sovereign_account: T::AccountId, amount: BalanceOf, - unlocker: MultiLocation, + unlocker: Location, } impl xcm_executor::traits::Enact for UnlockTicket { @@ -2471,8 +2463,8 @@ impl xcm_executor::traits::Enact for UnlockTicket { pub struct ReduceTicket { key: (u32, T::AccountId, VersionedAssetId), amount: u128, - locker: VersionedMultiLocation, - owner: VersionedMultiLocation, + locker: VersionedLocation, + owner: VersionedLocation, } impl xcm_executor::traits::Enact for ReduceTicket { @@ -2498,9 +2490,9 @@ impl xcm_executor::traits::AssetLock for Pallet { type ReduceTicket = ReduceTicket; fn prepare_lock( - unlocker: MultiLocation, - asset: MultiAsset, - owner: MultiLocation, + unlocker: Location, + asset: Asset, + owner: Location, ) -> Result, xcm_executor::traits::LockError> { use xcm_executor::traits::LockError::*; let sovereign_account = T::SovereignAccountOf::convert_location(&owner).ok_or(BadOwner)?; @@ -2513,9 +2505,9 @@ impl xcm_executor::traits::AssetLock for Pallet { } fn prepare_unlock( - unlocker: MultiLocation, - asset: MultiAsset, - owner: MultiLocation, + unlocker: Location, + asset: Asset, + owner: Location, ) -> Result, xcm_executor::traits::LockError> { use xcm_executor::traits::LockError::*; let sovereign_account = T::SovereignAccountOf::convert_location(&owner).ok_or(BadOwner)?; @@ -2529,9 +2521,9 @@ impl xcm_executor::traits::AssetLock for Pallet { } fn note_unlockable( - locker: MultiLocation, - asset: MultiAsset, - mut owner: MultiLocation, + locker: Location, + asset: Asset, + mut owner: Location, ) -> Result<(), xcm_executor::traits::LockError> { use xcm_executor::traits::LockError::*; ensure!(T::TrustedLockers::contains(&locker, &asset), NotTrusted); @@ -2558,9 +2550,9 @@ impl xcm_executor::traits::AssetLock for Pallet { } fn prepare_reduce_unlockable( - locker: MultiLocation, - asset: MultiAsset, - mut owner: MultiLocation, + locker: Location, + asset: Asset, + mut owner: Location, ) -> Result { use xcm_executor::traits::LockError::*; let amount = match asset.fun { @@ -2588,7 +2580,7 @@ impl xcm_executor::traits::AssetLock for Pallet { impl WrapVersion for Pallet { fn wrap_version( - dest: &MultiLocation, + dest: &Location, xcm: impl Into>, ) -> Result, ()> { Self::get_version_for(dest) @@ -2609,8 +2601,8 @@ impl WrapVersion for Pallet { } impl GetVersion for Pallet { - fn get_version_for(dest: &MultiLocation) -> Option { - SupportedVersion::::get(XCM_VERSION, LatestVersionedMultiLocation(dest)) + fn get_version_for(dest: &Location) -> Option { + SupportedVersion::::get(XCM_VERSION, LatestVersionedLocation(dest)) } } @@ -2624,21 +2616,21 @@ impl VersionChangeNotifier for Pallet { /// If the `location` has an ongoing notification and when this function is called, then an /// error should be returned. fn start( - dest: &MultiLocation, + dest: &Location, query_id: QueryId, max_weight: Weight, _context: &XcmContext, ) -> XcmResult { - let versioned_dest = LatestVersionedMultiLocation(dest); + let versioned_dest = LatestVersionedLocation(dest); let already = VersionNotifyTargets::::contains_key(XCM_VERSION, versioned_dest); ensure!(!already, XcmError::InvalidLocation); let xcm_version = T::AdvertisedXcmVersion::get(); let response = Response::Version(xcm_version); let instruction = QueryResponse { query_id, response, max_weight, querier: None }; - let (message_id, cost) = send_xcm::(*dest, Xcm(vec![instruction]))?; + let (message_id, cost) = send_xcm::(dest.clone(), Xcm(vec![instruction]))?; Self::deposit_event(Event::::VersionNotifyStarted { - destination: *dest, + destination: dest.clone(), cost, message_id, }); @@ -2650,27 +2642,31 @@ impl VersionChangeNotifier for Pallet { /// Stop notifying `location` should the XCM change. This is a no-op if there was never a /// subscription. - fn stop(dest: &MultiLocation, _context: &XcmContext) -> XcmResult { - VersionNotifyTargets::::remove(XCM_VERSION, LatestVersionedMultiLocation(dest)); + fn stop(dest: &Location, _context: &XcmContext) -> XcmResult { + VersionNotifyTargets::::remove(XCM_VERSION, LatestVersionedLocation(dest)); Ok(()) } /// Return true if a location is subscribed to XCM version changes. - fn is_subscribed(dest: &MultiLocation) -> bool { - let versioned_dest = LatestVersionedMultiLocation(dest); + fn is_subscribed(dest: &Location) -> bool { + let versioned_dest = LatestVersionedLocation(dest); VersionNotifyTargets::::contains_key(XCM_VERSION, versioned_dest) } } impl DropAssets for Pallet { - fn drop_assets(origin: &MultiLocation, assets: Assets, _context: &XcmContext) -> Weight { + fn drop_assets(origin: &Location, assets: AssetsInHolding, _context: &XcmContext) -> Weight { if assets.is_empty() { return Weight::zero() } - let versioned = VersionedMultiAssets::from(MultiAssets::from(assets)); + let versioned = VersionedAssets::from(Assets::from(assets)); let hash = BlakeTwo256::hash_of(&(&origin, &versioned)); AssetTraps::::mutate(hash, |n| *n += 1); - Self::deposit_event(Event::AssetsTrapped { hash, origin: *origin, assets: versioned }); + Self::deposit_event(Event::AssetsTrapped { + hash, + origin: origin.clone(), + assets: versioned, + }); // TODO #3735: Put the real weight in there. Weight::zero() } @@ -2678,71 +2674,75 @@ impl DropAssets for Pallet { impl ClaimAssets for Pallet { fn claim_assets( - origin: &MultiLocation, - ticket: &MultiLocation, - assets: &MultiAssets, + origin: &Location, + ticket: &Location, + assets: &Assets, _context: &XcmContext, ) -> bool { - let mut versioned = VersionedMultiAssets::from(assets.clone()); - match (ticket.parents, &ticket.interior) { - (0, X1(GeneralIndex(i))) => + let mut versioned = VersionedAssets::from(assets.clone()); + match ticket.unpack() { + (0, [GeneralIndex(i)]) => versioned = match versioned.into_version(*i as u32) { Ok(v) => v, Err(()) => return false, }, - (0, Here) => (), + (0, []) => (), _ => return false, }; - let hash = BlakeTwo256::hash_of(&(origin, versioned.clone())); + let hash = BlakeTwo256::hash_of(&(origin.clone(), versioned.clone())); match AssetTraps::::get(hash) { 0 => return false, 1 => AssetTraps::::remove(hash), n => AssetTraps::::insert(hash, n - 1), } - Self::deposit_event(Event::AssetsClaimed { hash, origin: *origin, assets: versioned }); + Self::deposit_event(Event::AssetsClaimed { + hash, + origin: origin.clone(), + assets: versioned, + }); return true } } impl OnResponse for Pallet { fn expecting_response( - origin: &MultiLocation, + origin: &Location, query_id: QueryId, - querier: Option<&MultiLocation>, + querier: Option<&Location>, ) -> bool { match Queries::::get(query_id) { Some(QueryStatus::Pending { responder, maybe_match_querier, .. }) => - MultiLocation::try_from(responder).map_or(false, |r| origin == &r) && + Location::try_from(responder).map_or(false, |r| origin == &r) && maybe_match_querier.map_or(true, |match_querier| { - MultiLocation::try_from(match_querier).map_or(false, |match_querier| { + Location::try_from(match_querier).map_or(false, |match_querier| { querier.map_or(false, |q| q == &match_querier) }) }), Some(QueryStatus::VersionNotifier { origin: r, .. }) => - MultiLocation::try_from(r).map_or(false, |r| origin == &r), + Location::try_from(r).map_or(false, |r| origin == &r), _ => false, } } fn on_response( - origin: &MultiLocation, + origin: &Location, query_id: QueryId, - querier: Option<&MultiLocation>, + querier: Option<&Location>, response: Response, max_weight: Weight, _context: &XcmContext, ) -> Weight { - let origin = *origin; + let origin = origin.clone(); match (response, Queries::::get(query_id)) { ( Response::Version(v), Some(QueryStatus::VersionNotifier { origin: expected_origin, is_active }), ) => { - let origin: MultiLocation = match expected_origin.try_into() { + let origin: Location = match expected_origin.try_into() { Ok(o) if o == origin => o, Ok(o) => { Self::deposit_event(Event::InvalidResponder { - origin, + origin: origin.clone(), query_id, expected_location: Some(o), }); @@ -2750,7 +2750,7 @@ impl OnResponse for Pallet { }, _ => { Self::deposit_event(Event::InvalidResponder { - origin, + origin: origin.clone(), query_id, expected_location: None, }); @@ -2762,15 +2762,14 @@ impl OnResponse for Pallet { if !is_active { Queries::::insert( query_id, - QueryStatus::VersionNotifier { origin: origin.into(), is_active: true }, + QueryStatus::VersionNotifier { + origin: origin.clone().into(), + is_active: true, + }, ); } // We're being notified of a version change. - SupportedVersion::::insert( - XCM_VERSION, - LatestVersionedMultiLocation(&origin), - v, - ); + SupportedVersion::::insert(XCM_VERSION, LatestVersionedLocation(&origin), v); Self::deposit_event(Event::SupportedVersionChanged { location: origin, version: v, @@ -2782,16 +2781,19 @@ impl OnResponse for Pallet { Some(QueryStatus::Pending { responder, maybe_notify, maybe_match_querier, .. }), ) => { if let Some(match_querier) = maybe_match_querier { - let match_querier = match MultiLocation::try_from(match_querier) { + let match_querier = match Location::try_from(match_querier) { Ok(mq) => mq, Err(_) => { - Self::deposit_event(Event::InvalidQuerierVersion { origin, query_id }); + Self::deposit_event(Event::InvalidQuerierVersion { + origin: origin.clone(), + query_id, + }); return Weight::zero() }, }; if querier.map_or(true, |q| q != &match_querier) { Self::deposit_event(Event::InvalidQuerier { - origin, + origin: origin.clone(), query_id, expected_querier: match_querier, maybe_actual_querier: querier.cloned(), @@ -2799,16 +2801,19 @@ impl OnResponse for Pallet { return Weight::zero() } } - let responder = match MultiLocation::try_from(responder) { + let responder = match Location::try_from(responder) { Ok(r) => r, Err(_) => { - Self::deposit_event(Event::InvalidResponderVersion { origin, query_id }); + Self::deposit_event(Event::InvalidResponderVersion { + origin: origin.clone(), + query_id, + }); return Weight::zero() }, }; if origin != responder { Self::deposit_event(Event::InvalidResponder { - origin, + origin: origin.clone(), query_id, expected_location: Some(responder), }); @@ -2836,7 +2841,7 @@ impl OnResponse for Pallet { Self::deposit_event(e); return Weight::zero() } - let dispatch_origin = Origin::Response(origin).into(); + let dispatch_origin = Origin::Response(origin.clone()).into(); match call.dispatch(dispatch_origin) { Ok(post_info) => { let e = Event::Notified { query_id, pallet_index, call_index }; @@ -2874,7 +2879,7 @@ impl OnResponse for Pallet { } }, _ => { - let e = Event::UnexpectedResponse { origin, query_id }; + let e = Event::UnexpectedResponse { origin: origin.clone(), query_id }; Self::deposit_event(e); Weight::zero() }, @@ -2884,7 +2889,7 @@ impl OnResponse for Pallet { impl CheckSuspension for Pallet { fn is_suspended( - _origin: &MultiLocation, + _origin: &Location, _instructions: &mut [Instruction], _max_weight: Weight, _properties: &mut Properties, @@ -2896,7 +2901,7 @@ impl CheckSuspension for Pallet { /// Ensure that the origin `o` represents an XCM (`Transact`) origin. /// /// Returns `Ok` with the location of the XCM sender or an `Err` otherwise. -pub fn ensure_xcm(o: OuterOrigin) -> Result +pub fn ensure_xcm(o: OuterOrigin) -> Result where OuterOrigin: Into>, { @@ -2909,7 +2914,7 @@ where /// Ensure that the origin `o` represents an XCM response origin. /// /// Returns `Ok` with the location of the responder or an `Err` otherwise. -pub fn ensure_response(o: OuterOrigin) -> Result +pub fn ensure_response(o: OuterOrigin) -> Result where OuterOrigin: Into>, { @@ -2919,46 +2924,50 @@ where } } -/// Filter for `MultiLocation` to find those which represent a strict majority approval of an +/// Filter for `Location` to find those which represent a strict majority approval of an /// identified plurality. /// /// May reasonably be used with `EnsureXcm`. pub struct IsMajorityOfBody(PhantomData<(Prefix, Body)>); -impl, Body: Get> Contains +impl, Body: Get> Contains for IsMajorityOfBody { - fn contains(l: &MultiLocation) -> bool { + fn contains(l: &Location) -> bool { let maybe_suffix = l.match_and_split(&Prefix::get()); matches!(maybe_suffix, Some(Plurality { id, part }) if id == &Body::get() && part.is_majority()) } } -/// Filter for `MultiLocation` to find those which represent a voice of an identified plurality. +/// Filter for `Location` to find those which represent a voice of an identified plurality. /// /// May reasonably be used with `EnsureXcm`. pub struct IsVoiceOfBody(PhantomData<(Prefix, Body)>); -impl, Body: Get> Contains - for IsVoiceOfBody -{ - fn contains(l: &MultiLocation) -> bool { +impl, Body: Get> Contains for IsVoiceOfBody { + fn contains(l: &Location) -> bool { let maybe_suffix = l.match_and_split(&Prefix::get()); matches!(maybe_suffix, Some(Plurality { id, part }) if id == &Body::get() && part == &BodyPart::Voice) } } -/// `EnsureOrigin` implementation succeeding with a `MultiLocation` value to recognize and filter +/// `EnsureOrigin` implementation succeeding with a `Location` value to recognize and filter /// the `Origin::Xcm` item. -pub struct EnsureXcm(PhantomData); -impl, F: Contains> EnsureOrigin for EnsureXcm +pub struct EnsureXcm(PhantomData<(F, L)>); +impl< + O: OriginTrait + From, + F: Contains, + L: TryFrom + TryInto + Clone, + > EnsureOrigin for EnsureXcm where O::PalletsOrigin: From + TryInto, { - type Success = MultiLocation; + type Success = L; fn try_origin(outer: O) -> Result { outer.try_with_caller(|caller| { caller.try_into().and_then(|o| match o { - Origin::Xcm(location) if F::contains(&location) => Ok(location), + Origin::Xcm(ref location) + if F::contains(&location.clone().try_into().map_err(|_| o.clone().into())?) => + Ok(location.clone().try_into().map_err(|_| o.clone().into())?), Origin::Xcm(location) => Err(Origin::Xcm(location).into()), o => Err(o.into()), }) @@ -2971,15 +2980,14 @@ where } } -/// `EnsureOrigin` implementation succeeding with a `MultiLocation` value to recognize and filter +/// `EnsureOrigin` implementation succeeding with a `Location` value to recognize and filter /// the `Origin::Response` item. pub struct EnsureResponse(PhantomData); -impl, F: Contains> EnsureOrigin - for EnsureResponse +impl, F: Contains> EnsureOrigin for EnsureResponse where O::PalletsOrigin: From + TryInto, { - type Success = MultiLocation; + type Success = Location; fn try_origin(outer: O) -> Result { outer.try_with_caller(|caller| { @@ -2996,16 +3004,16 @@ where } } -/// A simple passthrough where we reuse the `MultiLocation`-typed XCM origin as the inner value of +/// A simple passthrough where we reuse the `Location`-typed XCM origin as the inner value of /// this crate's `Origin::Xcm` value. pub struct XcmPassthrough(PhantomData); impl> ConvertOrigin for XcmPassthrough { fn convert_origin( - origin: impl Into, + origin: impl Into, kind: OriginKind, - ) -> Result { + ) -> Result { let origin = origin.into(); match kind { OriginKind::Xcm => Ok(crate::Origin::Xcm(origin).into()), diff --git a/polkadot/xcm/pallet-xcm/src/mock.rs b/polkadot/xcm/pallet-xcm/src/mock.rs index 0ac4205ed94..3ce32fa46d3 100644 --- a/polkadot/xcm/pallet-xcm/src/mock.rs +++ b/polkadot/xcm/pallet-xcm/src/mock.rs @@ -16,7 +16,7 @@ use codec::Encode; use frame_support::{ - construct_runtime, derive_impl, match_types, parameter_types, + construct_runtime, derive_impl, parameter_types, traits::{ AsEnsureOriginWithArg, ConstU128, ConstU32, Contains, Equals, Everything, EverythingBut, Nothing, @@ -76,7 +76,7 @@ pub mod pallet_test_notifier { pub enum Event { QueryPrepared(QueryId), NotifyQueryPrepared(QueryId), - ResponseReceived(MultiLocation, QueryId, Response), + ResponseReceived(Location, QueryId, Response), } #[pallet::error] @@ -89,7 +89,7 @@ pub mod pallet_test_notifier { impl Pallet { #[pallet::call_index(0)] #[pallet::weight(Weight::from_parts(1_000_000, 1_000_000))] - pub fn prepare_new_query(origin: OriginFor, querier: MultiLocation) -> DispatchResult { + pub fn prepare_new_query(origin: OriginFor, querier: Location) -> DispatchResult { let who = ensure_signed(origin)?; let id = who .using_encoded(|mut d| <[u8; 32]>::decode(&mut d)) @@ -105,10 +105,7 @@ pub mod pallet_test_notifier { #[pallet::call_index(1)] #[pallet::weight(Weight::from_parts(1_000_000, 1_000_000))] - pub fn prepare_new_notify_query( - origin: OriginFor, - querier: MultiLocation, - ) -> DispatchResult { + pub fn prepare_new_notify_query(origin: OriginFor, querier: Location) -> DispatchResult { let who = ensure_signed(origin)?; let id = who .using_encoded(|mut d| <[u8; 32]>::decode(&mut d)) @@ -144,7 +141,7 @@ construct_runtime!( { System: frame_system::{Pallet, Call, Storage, Config, Event}, Balances: pallet_balances::{Pallet, Call, Storage, Config, Event}, - Assets: pallet_assets::{Pallet, Call, Storage, Config, Event}, + AssetsPallet: pallet_assets::{Pallet, Call, Storage, Config, Event}, ParasOrigin: origin::{Pallet, Origin}, XcmPallet: pallet_xcm::{Pallet, Call, Storage, Event, Origin, Config}, TestNotifier: pallet_test_notifier::{Pallet, Call, Event}, @@ -152,13 +149,13 @@ construct_runtime!( ); thread_local! { - pub static SENT_XCM: RefCell)>> = RefCell::new(Vec::new()); + pub static SENT_XCM: RefCell)>> = RefCell::new(Vec::new()); pub static FAIL_SEND_XCM: RefCell = RefCell::new(false); } -pub(crate) fn sent_xcm() -> Vec<(MultiLocation, Xcm<()>)> { +pub(crate) fn sent_xcm() -> Vec<(Location, Xcm<()>)> { SENT_XCM.with(|q| (*q.borrow()).clone()) } -pub(crate) fn take_sent_xcm() -> Vec<(MultiLocation, Xcm<()>)> { +pub(crate) fn take_sent_xcm() -> Vec<(Location, Xcm<()>)> { SENT_XCM.with(|q| { let mut r = Vec::new(); std::mem::swap(&mut r, &mut *q.borrow_mut()); @@ -171,18 +168,18 @@ pub(crate) fn set_send_xcm_artificial_failure(should_fail: bool) { /// Sender that never returns error. pub struct TestSendXcm; impl SendXcm for TestSendXcm { - type Ticket = (MultiLocation, Xcm<()>); + type Ticket = (Location, Xcm<()>); fn validate( - dest: &mut Option, + dest: &mut Option, msg: &mut Option>, - ) -> SendResult<(MultiLocation, Xcm<()>)> { + ) -> SendResult<(Location, Xcm<()>)> { if FAIL_SEND_XCM.with(|q| *q.borrow()) { return Err(SendError::Transport("Intentional send failure used in tests")) } let pair = (dest.take().unwrap(), msg.take().unwrap()); - Ok((pair, MultiAssets::new())) + Ok((pair, Assets::new())) } - fn deliver(pair: (MultiLocation, Xcm<()>)) -> Result { + fn deliver(pair: (Location, Xcm<()>)) -> Result { let hash = fake_message_hash(&pair.1); SENT_XCM.with(|q| q.borrow_mut().push(pair)); Ok(hash) @@ -191,11 +188,11 @@ impl SendXcm for TestSendXcm { /// Sender that returns error if `X8` junction and stops routing pub struct TestSendXcmErrX8; impl SendXcm for TestSendXcmErrX8 { - type Ticket = (MultiLocation, Xcm<()>); + type Ticket = (Location, Xcm<()>); fn validate( - dest: &mut Option, + dest: &mut Option, _: &mut Option>, - ) -> SendResult<(MultiLocation, Xcm<()>)> { + ) -> SendResult<(Location, Xcm<()>)> { if dest.as_ref().unwrap().len() == 8 { dest.take(); Err(SendError::Transport("Destination location full")) @@ -203,7 +200,7 @@ impl SendXcm for TestSendXcmErrX8 { Err(SendError::NotApplicable) } } - fn deliver(pair: (MultiLocation, Xcm<()>)) -> Result { + fn deliver(pair: (Location, Xcm<()>)) -> Result { let hash = fake_message_hash(&pair.1); SENT_XCM.with(|q| q.borrow_mut().push(pair)); Ok(hash) @@ -212,18 +209,18 @@ impl SendXcm for TestSendXcmErrX8 { parameter_types! { pub Para3000: u32 = 3000; - pub Para3000Location: MultiLocation = Parachain(Para3000::get()).into(); + pub Para3000Location: Location = Parachain(Para3000::get()).into(); pub Para3000PaymentAmount: u128 = 1; - pub Para3000PaymentMultiAssets: MultiAssets = MultiAssets::from(MultiAsset::from((Here, Para3000PaymentAmount::get()))); + pub Para3000PaymentAssets: Assets = Assets::from(Asset::from((Here, Para3000PaymentAmount::get()))); } /// Sender only sends to `Parachain(3000)` destination requiring payment. pub struct TestPaidForPara3000SendXcm; impl SendXcm for TestPaidForPara3000SendXcm { - type Ticket = (MultiLocation, Xcm<()>); + type Ticket = (Location, Xcm<()>); fn validate( - dest: &mut Option, + dest: &mut Option, msg: &mut Option>, - ) -> SendResult<(MultiLocation, Xcm<()>)> { + ) -> SendResult<(Location, Xcm<()>)> { if let Some(dest) = dest.as_ref() { if !dest.eq(&Para3000Location::get()) { return Err(SendError::NotApplicable) @@ -233,9 +230,9 @@ impl SendXcm for TestPaidForPara3000SendXcm { } let pair = (dest.take().unwrap(), msg.take().unwrap()); - Ok((pair, Para3000PaymentMultiAssets::get())) + Ok((pair, Para3000PaymentAssets::get())) } - fn deliver(pair: (MultiLocation, Xcm<()>)) -> Result { + fn deliver(pair: (Location, Xcm<()>)) -> Result { let hash = fake_message_hash(&pair.1); SENT_XCM.with(|q| q.borrow_mut().push(pair)); Ok(hash) @@ -300,17 +297,17 @@ impl pallet_balances::Config for Test { /// Simple conversion of `u32` into an `AssetId` for use in benchmarking. pub struct XcmBenchmarkHelper; #[cfg(feature = "runtime-benchmarks")] -impl pallet_assets::BenchmarkHelper for XcmBenchmarkHelper { - fn create_asset_id_parameter(id: u32) -> MultiLocation { - MultiLocation { parents: 1, interior: X1(Parachain(id)) } +impl pallet_assets::BenchmarkHelper for XcmBenchmarkHelper { + fn create_asset_id_parameter(id: u32) -> Location { + Location::new(1, [Parachain(id)]) } } impl pallet_assets::Config for Test { type RuntimeEvent = RuntimeEvent; type Balance = Balance; - type AssetId = MultiLocation; - type AssetIdParameter = MultiLocation; + type AssetId = Location; + type AssetIdParameter = Location; type Currency = Balances; type CreateOrigin = AsEnsureOriginWithArg>; type ForceOrigin = EnsureRoot; @@ -354,61 +351,61 @@ pub const OTHER_PARA_ID: u32 = 2009; pub const FILTERED_PARA_ID: u32 = 2010; parameter_types! { - pub const RelayLocation: MultiLocation = Here.into_location(); - pub const NativeAsset: MultiAsset = MultiAsset { + pub const RelayLocation: Location = Here.into_location(); + pub const NativeAsset: Asset = Asset { fun: Fungible(10), - id: Concrete(Here.into_location()), - }; - pub const SystemParachainLocation: MultiLocation = MultiLocation { - parents: 0, - interior: X1(Parachain(SOME_SYSTEM_PARA)) - }; - pub const ForeignReserveLocation: MultiLocation = MultiLocation { - parents: 0, - interior: X1(Parachain(FOREIGN_ASSET_RESERVE_PARA_ID)) + id: AssetId(Here.into_location()), }; - pub const ForeignAsset: MultiAsset = MultiAsset { + pub SystemParachainLocation: Location = Location::new( + 0, + [Parachain(SOME_SYSTEM_PARA)] + ); + pub ForeignReserveLocation: Location = Location::new( + 0, + [Parachain(FOREIGN_ASSET_RESERVE_PARA_ID)] + ); + pub ForeignAsset: Asset = Asset { fun: Fungible(10), - id: Concrete(MultiLocation { - parents: 0, - interior: X2(Parachain(FOREIGN_ASSET_RESERVE_PARA_ID), FOREIGN_ASSET_INNER_JUNCTION), - }), + id: AssetId(Location::new( + 0, + [Parachain(FOREIGN_ASSET_RESERVE_PARA_ID), FOREIGN_ASSET_INNER_JUNCTION], + )), }; - pub const UsdcReserveLocation: MultiLocation = MultiLocation { - parents: 0, - interior: X1(Parachain(USDC_RESERVE_PARA_ID)) - }; - pub const Usdc: MultiAsset = MultiAsset { + pub UsdcReserveLocation: Location = Location::new( + 0, + [Parachain(USDC_RESERVE_PARA_ID)] + ); + pub Usdc: Asset = Asset { fun: Fungible(10), - id: Concrete(MultiLocation { - parents: 0, - interior: X2(Parachain(USDC_RESERVE_PARA_ID), USDC_INNER_JUNCTION), - }), + id: AssetId(Location::new( + 0, + [Parachain(USDC_RESERVE_PARA_ID), USDC_INNER_JUNCTION], + )), }; - pub const UsdtTeleportLocation: MultiLocation = MultiLocation { - parents: 0, - interior: X1(Parachain(USDT_PARA_ID)) - }; - pub const Usdt: MultiAsset = MultiAsset { + pub UsdtTeleportLocation: Location = Location::new( + 0, + [Parachain(USDT_PARA_ID)] + ); + pub Usdt: Asset = Asset { fun: Fungible(10), - id: Concrete(MultiLocation { - parents: 0, - interior: X1(Parachain(USDT_PARA_ID)), - }), + id: AssetId(Location::new( + 0, + [Parachain(USDT_PARA_ID)], + )), }; - pub const FilteredTeleportLocation: MultiLocation = MultiLocation { - parents: 0, - interior: X1(Parachain(FILTERED_PARA_ID)) - }; - pub const FilteredTeleportAsset: MultiAsset = MultiAsset { + pub FilteredTeleportLocation: Location = Location::new( + 0, + [Parachain(FILTERED_PARA_ID)] + ); + pub FilteredTeleportAsset: Asset = Asset { fun: Fungible(10), - id: Concrete(MultiLocation { - parents: 0, - interior: X1(Parachain(FILTERED_PARA_ID)), - }), + id: AssetId(Location::new( + 0, + [Parachain(FILTERED_PARA_ID)], + )), }; pub const AnyNetwork: Option = None; - pub UniversalLocation: InteriorMultiLocation = Here; + pub UniversalLocation: InteriorLocation = Here; pub UnitWeightCost: u64 = 1_000; pub CheckingAccount: AccountId = XcmPallet::check_account(); } @@ -420,7 +417,7 @@ pub type SovereignAccountOf = ( ); pub type ForeignAssetsConvertedConcreteId = MatchedConvertedConcreteId< - MultiLocation, + Location, Balance, // Excludes relay/parent chain currency EverythingBut<(Equals,)>, @@ -432,7 +429,7 @@ pub type ForeignAssetsConvertedConcreteId = MatchedConvertedConcreteId< pub type AssetTransactors = ( XcmCurrencyAdapter, SovereignAccountOf, AccountId, ()>, FungiblesAdapter< - Assets, + AssetsPallet, ForeignAssetsConvertedConcreteId, SovereignAccountOf, AccountId, @@ -450,24 +447,29 @@ type LocalOriginConverter = ( parameter_types! { pub const BaseXcmWeight: Weight = Weight::from_parts(1_000, 1_000); - pub CurrencyPerSecondPerByte: (AssetId, u128, u128) = (Concrete(RelayLocation::get()), 1, 1); - pub TrustedLocal: (MultiAssetFilter, MultiLocation) = (All.into(), Here.into()); - pub TrustedSystemPara: (MultiAssetFilter, MultiLocation) = (NativeAsset::get().into(), SystemParachainLocation::get()); - pub TrustedUsdt: (MultiAssetFilter, MultiLocation) = (Usdt::get().into(), UsdtTeleportLocation::get()); - pub TrustedFilteredTeleport: (MultiAssetFilter, MultiLocation) = (FilteredTeleportAsset::get().into(), FilteredTeleportLocation::get()); - pub TeleportUsdtToForeign: (MultiAssetFilter, MultiLocation) = (Usdt::get().into(), ForeignReserveLocation::get()); - pub TrustedForeign: (MultiAssetFilter, MultiLocation) = (ForeignAsset::get().into(), ForeignReserveLocation::get()); - pub TrustedUsdc: (MultiAssetFilter, MultiLocation) = (Usdc::get().into(), UsdcReserveLocation::get()); + pub CurrencyPerSecondPerByte: (AssetId, u128, u128) = (AssetId(RelayLocation::get()), 1, 1); + pub TrustedLocal: (AssetFilter, Location) = (All.into(), Here.into()); + pub TrustedSystemPara: (AssetFilter, Location) = (NativeAsset::get().into(), SystemParachainLocation::get()); + pub TrustedUsdt: (AssetFilter, Location) = (Usdt::get().into(), UsdtTeleportLocation::get()); + pub TrustedFilteredTeleport: (AssetFilter, Location) = (FilteredTeleportAsset::get().into(), FilteredTeleportLocation::get()); + pub TeleportUsdtToForeign: (AssetFilter, Location) = (Usdt::get().into(), ForeignReserveLocation::get()); + pub TrustedForeign: (AssetFilter, Location) = (ForeignAsset::get().into(), ForeignReserveLocation::get()); + pub TrustedUsdc: (AssetFilter, Location) = (Usdc::get().into(), UsdcReserveLocation::get()); pub const MaxInstructions: u32 = 100; pub const MaxAssetsIntoHolding: u32 = 64; pub XcmFeesTargetAccount: AccountId = AccountId::new([167u8; 32]); } pub const XCM_FEES_NOT_WAIVED_USER_ACCOUNT: [u8; 32] = [37u8; 32]; -match_types! { - pub type XcmFeesNotWaivedLocations: impl Contains = { - MultiLocation { parents: 0, interior: X1(Junction::AccountId32 {network: None, id: XCM_FEES_NOT_WAIVED_USER_ACCOUNT})} - }; + +pub struct XcmFeesNotWaivedLocations; +impl Contains for XcmFeesNotWaivedLocations { + fn contains(location: &Location) -> bool { + matches!( + location.unpack(), + (0, [Junction::AccountId32 { network: None, id: XCM_FEES_NOT_WAIVED_USER_ACCOUNT }]) + ) + } } pub type Barrier = ( @@ -519,12 +521,12 @@ impl xcm_executor::Config for XcmConfig { pub type LocalOriginToLocation = SignedToAccountId32; parameter_types! { - pub static AdvertisedXcmVersion: pallet_xcm::XcmVersion = 3; + pub static AdvertisedXcmVersion: pallet_xcm::XcmVersion = 4; } pub struct XcmTeleportFiltered; -impl Contains<(MultiLocation, Vec)> for XcmTeleportFiltered { - fn contains(t: &(MultiLocation, Vec)) -> bool { +impl Contains<(Location, Vec)> for XcmTeleportFiltered { + fn contains(t: &(Location, Vec)) -> bool { let filtered = FilteredTeleportAsset::get(); t.1.iter().any(|asset| asset == &filtered) } @@ -566,24 +568,23 @@ impl pallet_test_notifier::Config for Test { #[cfg(feature = "runtime-benchmarks")] impl super::benchmarking::Config for Test { - fn reachable_dest() -> Option { + fn reachable_dest() -> Option { Some(Parachain(1000).into()) } - fn teleportable_asset_and_dest() -> Option<(MultiAsset, MultiLocation)> { + fn teleportable_asset_and_dest() -> Option<(Asset, Location)> { Some((NativeAsset::get(), SystemParachainLocation::get())) } - fn reserve_transferable_asset_and_dest() -> Option<(MultiAsset, MultiLocation)> { + fn reserve_transferable_asset_and_dest() -> Option<(Asset, Location)> { Some(( - MultiAsset { fun: Fungible(10), id: Concrete(Here.into_location()) }, + Asset { fun: Fungible(10), id: AssetId(Here.into_location()) }, Parachain(OTHER_PARA_ID).into(), )) } - fn set_up_complex_asset_transfer( - ) -> Option<(MultiAssets, u32, MultiLocation, Box)> { - use crate::tests::assets_transfer::{into_multiassets_checked, set_up_foreign_asset}; + fn set_up_complex_asset_transfer() -> Option<(Assets, u32, Location, Box)> { + use crate::tests::assets_transfer::{into_assets_checked, set_up_foreign_asset}; // Transfer native asset (local reserve) to `USDT_PARA_ID`. Using teleport-trusted USDT for // fees. @@ -600,7 +601,7 @@ impl super::benchmarking::Config for Test { ); // create sufficient foreign asset USDT let usdt_initial_local_amount = fee_amount * 10; - let (usdt_chain, _, usdt_id_multilocation) = set_up_foreign_asset( + let (usdt_chain, _, usdt_id_location) = set_up_foreign_asset( USDT_PARA_ID, None, caller.clone(), @@ -610,22 +611,25 @@ impl super::benchmarking::Config for Test { // native assets transfer destination is USDT chain (teleport trust only for USDT) let dest = usdt_chain; - let (assets, fee_index, _, _) = into_multiassets_checked( + let (assets, fee_index, _, _) = into_assets_checked( // USDT for fees (is sufficient on local chain too) - teleported - (usdt_id_multilocation, fee_amount).into(), + (usdt_id_location.clone(), fee_amount).into(), // native asset to transfer (not used for fees) - local reserve - (MultiLocation::here(), asset_amount).into(), + (Location::here(), asset_amount).into(), ); // verify initial balances assert_eq!(Balances::free_balance(&caller), balance); - assert_eq!(Assets::balance(usdt_id_multilocation, &caller), usdt_initial_local_amount); + assert_eq!( + AssetsPallet::balance(usdt_id_location.clone(), &caller), + usdt_initial_local_amount + ); // verify transferred successfully let verify = Box::new(move || { // verify balances after transfer, decreased by transferred amounts assert_eq!(Balances::free_balance(&caller), balance - asset_amount); assert_eq!( - Assets::balance(usdt_id_multilocation, &caller), + AssetsPallet::balance(usdt_id_location, &caller), usdt_initial_local_amount - fee_amount ); }); @@ -641,13 +645,13 @@ pub(crate) fn last_events(n: usize) -> Vec { System::events().into_iter().map(|e| e.event).rev().take(n).rev().collect() } -pub(crate) fn buy_execution(fees: impl Into) -> Instruction { +pub(crate) fn buy_execution(fees: impl Into) -> Instruction { use xcm::latest::prelude::*; BuyExecution { fees: fees.into(), weight_limit: Unlimited } } pub(crate) fn buy_limited_execution( - fees: impl Into, + fees: impl Into, weight_limit: WeightLimit, ) -> Instruction { use xcm::latest::prelude::*; diff --git a/polkadot/xcm/pallet-xcm/src/tests/assets_transfer.rs b/polkadot/xcm/pallet-xcm/src/tests/assets_transfer.rs index 6893bae2b6c..27be5cce145 100644 --- a/polkadot/xcm/pallet-xcm/src/tests/assets_transfer.rs +++ b/polkadot/xcm/pallet-xcm/src/tests/assets_transfer.rs @@ -33,8 +33,8 @@ use xcm_executor::traits::ConvertLocation; // Helper function to deduplicate testing different teleport types. fn do_test_and_verify_teleport_assets( - origin_location: MultiLocation, - expected_beneficiary: MultiLocation, + origin_location: Location, + expected_beneficiary: Location, call: Call, expected_weight_limit: WeightLimit, ) { @@ -70,13 +70,15 @@ fn do_test_and_verify_teleport_assets( let mut last_events = last_events(3).into_iter(); assert_eq!( last_events.next().unwrap(), - RuntimeEvent::XcmPallet(crate::Event::Attempted { outcome: Outcome::Complete(weight) }) + RuntimeEvent::XcmPallet(crate::Event::Attempted { + outcome: Outcome::Complete { used: weight } + }) ); assert_eq!( last_events.next().unwrap(), RuntimeEvent::XcmPallet(crate::Event::FeesPaid { paying: origin_location, - fees: MultiAssets::new(), + fees: Assets::new(), }) ); assert!(matches!( @@ -92,11 +94,11 @@ fn do_test_and_verify_teleport_assets( /// local effects. #[test] fn teleport_assets_works() { - let origin_location: MultiLocation = AccountId32 { network: None, id: ALICE.into() }.into(); - let beneficiary: MultiLocation = AccountId32 { network: None, id: BOB.into() }.into(); + let origin_location: Location = AccountId32 { network: None, id: ALICE.into() }.into(); + let beneficiary: Location = AccountId32 { network: None, id: BOB.into() }.into(); do_test_and_verify_teleport_assets( - origin_location, - beneficiary, + origin_location.clone(), + beneficiary.clone(), || { assert_ok!(XcmPallet::teleport_assets( RuntimeOrigin::signed(ALICE), @@ -116,13 +118,13 @@ fn teleport_assets_works() { /// local effects. #[test] fn limited_teleport_assets_works() { - let origin_location: MultiLocation = AccountId32 { network: None, id: ALICE.into() }.into(); - let beneficiary: MultiLocation = AccountId32 { network: None, id: BOB.into() }.into(); + let origin_location: Location = AccountId32 { network: None, id: ALICE.into() }.into(); + let beneficiary: Location = AccountId32 { network: None, id: BOB.into() }.into(); let weight_limit = WeightLimit::Limited(Weight::from_parts(5000, 5000)); let expected_weight_limit = weight_limit.clone(); do_test_and_verify_teleport_assets( - origin_location, - beneficiary, + origin_location.clone(), + beneficiary.clone(), || { assert_ok!(XcmPallet::limited_teleport_assets( RuntimeOrigin::signed(ALICE), @@ -140,7 +142,7 @@ fn limited_teleport_assets_works() { /// `limited_teleport_assets` should fail for filtered assets #[test] fn limited_teleport_filtered_assets_disallowed() { - let beneficiary: MultiLocation = AccountId32 { network: None, id: BOB.into() }.into(); + let beneficiary: Location = AccountId32 { network: None, id: BOB.into() }.into(); new_test_ext_with_balances(vec![(ALICE, INITIAL_BALANCE)]).execute_with(|| { let result = XcmPallet::limited_teleport_assets( RuntimeOrigin::signed(ALICE), @@ -165,7 +167,7 @@ fn limited_teleport_filtered_assets_disallowed() { /// /// Asserts that the sender's balance is decreased and the beneficiary's balance /// is increased. Verifies the correct message is sent and event is emitted. -/// Verifies that XCM router fees (`SendXcm::validate` -> `MultiAssets`) are withdrawn from correct +/// Verifies that XCM router fees (`SendXcm::validate` -> `Assets`) are withdrawn from correct /// user account and deposited to a correct target account (`XcmFeesTargetAccount`). #[test] fn reserve_transfer_assets_with_paid_router_works() { @@ -179,13 +181,13 @@ fn reserve_transfer_assets_with_paid_router_works() { new_test_ext_with_balances(balances).execute_with(|| { let xcm_router_fee_amount = Para3000PaymentAmount::get(); let weight = BaseXcmWeight::get(); - let dest: MultiLocation = - AccountId32 { network: None, id: user_account.clone().into() }.into(); + let dest: Location = + Junction::AccountId32 { network: None, id: user_account.clone().into() }.into(); assert_eq!(Balances::total_balance(&user_account), INITIAL_BALANCE); assert_ok!(XcmPallet::reserve_transfer_assets( RuntimeOrigin::signed(user_account.clone()), Box::new(Parachain(paid_para_id).into()), - Box::new(dest.into()), + Box::new(dest.clone().into()), Box::new((Here, SEND_AMOUNT).into()), 0, )); @@ -206,7 +208,7 @@ fn reserve_transfer_assets_with_paid_router_works() { INITIAL_BALANCE + xcm_router_fee_amount ); - let dest_para: MultiLocation = Parachain(paid_para_id).into(); + let dest_para: Location = Parachain(paid_para_id).into(); assert_eq!( sent_xcm(), vec![( @@ -215,14 +217,16 @@ fn reserve_transfer_assets_with_paid_router_works() { ReserveAssetDeposited((Parent, SEND_AMOUNT).into()), ClearOrigin, buy_execution((Parent, SEND_AMOUNT)), - DepositAsset { assets: AllCounted(1).into(), beneficiary: dest }, + DepositAsset { assets: AllCounted(1).into(), beneficiary: dest.clone() }, ]), )] ); let mut last_events = last_events(5).into_iter(); assert_eq!( last_events.next().unwrap(), - RuntimeEvent::XcmPallet(crate::Event::Attempted { outcome: Outcome::Complete(weight) }) + RuntimeEvent::XcmPallet(crate::Event::Attempted { + outcome: Outcome::Complete { used: weight } + }) ); // balances events last_events.next().unwrap(); @@ -231,7 +235,7 @@ fn reserve_transfer_assets_with_paid_router_works() { last_events.next().unwrap(), RuntimeEvent::XcmPallet(crate::Event::FeesPaid { paying: dest, - fees: Para3000PaymentMultiAssets::get(), + fees: Para3000PaymentAssets::get(), }) ); assert!(matches!( @@ -247,45 +251,45 @@ pub(crate) fn set_up_foreign_asset( benficiary: AccountId, initial_amount: u128, is_sufficient: bool, -) -> (MultiLocation, AccountId, MultiLocation) { +) -> (Location, AccountId, Location) { let reserve_location = RelayLocation::get().pushed_with_interior(Parachain(reserve_para_id)).unwrap(); let reserve_sovereign_account = SovereignAccountOf::convert_location(&reserve_location).unwrap(); - let foreign_asset_id_multilocation = if let Some(junction) = inner_junction { - reserve_location.pushed_with_interior(junction).unwrap() + let foreign_asset_id_location = if let Some(junction) = inner_junction { + reserve_location.clone().pushed_with_interior(junction).unwrap() } else { - reserve_location + reserve_location.clone() }; - // create sufficient (to be used as fees as well) foreign asset - assert_ok!(Assets::force_create( + // create sufficient (to be used as fees as well) foreign asset (0 total issuance) + assert_ok!(AssetsPallet::force_create( RuntimeOrigin::root(), - foreign_asset_id_multilocation, + foreign_asset_id_location.clone(), BOB, is_sufficient, 1 )); // this asset should have been teleported/reserve-transferred in, but for this test we just // mint it locally. - assert_ok!(Assets::mint( + assert_ok!(AssetsPallet::mint( RuntimeOrigin::signed(BOB), - foreign_asset_id_multilocation, + foreign_asset_id_location.clone(), benficiary, initial_amount )); - (reserve_location, reserve_sovereign_account, foreign_asset_id_multilocation) + (reserve_location, reserve_sovereign_account, foreign_asset_id_location) } // Helper function that provides correct `fee_index` after `sort()` done by -// `vec![MultiAsset, MultiAsset].into()`. -pub(crate) fn into_multiassets_checked( - fee_asset: MultiAsset, - transfer_asset: MultiAsset, -) -> (MultiAssets, usize, MultiAsset, MultiAsset) { - let assets: MultiAssets = vec![fee_asset.clone(), transfer_asset.clone()].into(); +// `vec![Asset, Asset].into()`. +pub(crate) fn into_assets_checked( + fee_asset: Asset, + transfer_asset: Asset, +) -> (Assets, usize, Asset, Asset) { + let assets: Assets = vec![fee_asset.clone(), transfer_asset.clone()].into(); let fee_index = if assets.get(0).unwrap().eq(&fee_asset) { 0 } else { 1 }; (assets, fee_index, fee_asset, transfer_asset) } @@ -302,9 +306,9 @@ fn local_asset_reserve_and_local_fee_reserve_call( ) where Call: FnOnce( OriginFor, - Box, - Box, - Box, + Box, + Box, + Box, u32, WeightLimit, ) -> DispatchResult, @@ -313,12 +317,14 @@ fn local_asset_reserve_and_local_fee_reserve_call( (ALICE, INITIAL_BALANCE), (ParaId::from(OTHER_PARA_ID).into_account_truncating(), INITIAL_BALANCE), ]; - let origin_location: MultiLocation = AccountId32 { network: None, id: ALICE.into() }.into(); - let beneficiary: MultiLocation = AccountId32 { network: None, id: ALICE.into() }.into(); + + let origin_location: Location = + Junction::AccountId32 { network: None, id: ALICE.into() }.into(); + let beneficiary: Location = Junction::AccountId32 { network: None, id: ALICE.into() }.into(); let weight_limit = WeightLimit::Limited(Weight::from_parts(5000, 5000)); let expected_weight_limit = weight_limit.clone(); - let expected_beneficiary = beneficiary; - let dest: MultiLocation = Parachain(OTHER_PARA_ID).into(); + let expected_beneficiary = beneficiary.clone(); + let dest: Location = Parachain(OTHER_PARA_ID).into(); new_test_ext_with_balances(balances).execute_with(|| { let weight = BaseXcmWeight::get(); @@ -326,8 +332,8 @@ fn local_asset_reserve_and_local_fee_reserve_call( // call extrinsic let result = tested_call( RuntimeOrigin::signed(ALICE), - Box::new(dest.into()), - Box::new(beneficiary.into()), + Box::new(dest.clone().into()), + Box::new(beneficiary.clone().into()), Box::new((Here, SEND_AMOUNT).into()), 0, weight_limit, @@ -352,7 +358,7 @@ fn local_asset_reserve_and_local_fee_reserve_call( buy_limited_execution((Parent, SEND_AMOUNT), expected_weight_limit), DepositAsset { assets: AllCounted(1).into(), - beneficiary: expected_beneficiary + beneficiary: expected_beneficiary.clone() }, ]), )] @@ -360,13 +366,15 @@ fn local_asset_reserve_and_local_fee_reserve_call( let mut last_events = last_events(3).into_iter(); assert_eq!( last_events.next().unwrap(), - RuntimeEvent::XcmPallet(crate::Event::Attempted { outcome: Outcome::Complete(weight) }) + RuntimeEvent::XcmPallet(crate::Event::Attempted { + outcome: Outcome::Complete { used: weight } + }) ); assert_eq!( last_events.next().unwrap(), RuntimeEvent::XcmPallet(crate::Event::FeesPaid { paying: origin_location, - fees: MultiAssets::new(), + fees: Assets::new(), }) ); assert!(matches!( @@ -423,21 +431,22 @@ fn destination_asset_reserve_and_local_fee_reserve_call( ) where Call: FnOnce( OriginFor, - Box, - Box, - Box, + Box, + Box, + Box, u32, WeightLimit, ) -> DispatchResult, { let weight = BaseXcmWeight::get() * 3; let balances = vec![(ALICE, INITIAL_BALANCE)]; - let origin_location: MultiLocation = AccountId32 { network: None, id: ALICE.into() }.into(); - let beneficiary: MultiLocation = AccountId32 { network: None, id: ALICE.into() }.into(); + let origin_location: Location = + Junction::AccountId32 { network: None, id: ALICE.into() }.into(); + let beneficiary: Location = Junction::AccountId32 { network: None, id: ALICE.into() }.into(); new_test_ext_with_balances(balances).execute_with(|| { // create non-sufficient foreign asset BLA let foreign_initial_amount = 142; - let (reserve_location, reserve_sovereign_account, foreign_asset_id_multilocation) = + let (reserve_location, reserve_sovereign_account, foreign_asset_id_location) = set_up_foreign_asset( FOREIGN_ASSET_RESERVE_PARA_ID, Some(FOREIGN_ASSET_INNER_JUNCTION), @@ -449,27 +458,30 @@ fn destination_asset_reserve_and_local_fee_reserve_call( // transfer destination is reserve location (no teleport trust) let dest = reserve_location; - let (assets, fee_index, fee_asset, xfer_asset) = into_multiassets_checked( + let (assets, fee_index, fee_asset, xfer_asset) = into_assets_checked( // native asset for fee - local reserve - (MultiLocation::here(), FEE_AMOUNT).into(), + (Location::here(), FEE_AMOUNT).into(), // foreign asset to transfer - destination reserve - (foreign_asset_id_multilocation, SEND_AMOUNT).into(), + (foreign_asset_id_location.clone(), SEND_AMOUNT).into(), ); // reanchor according to test-case let context = UniversalLocation::get(); - let expected_fee = fee_asset.reanchored(&dest, context).unwrap(); - let expected_asset = xfer_asset.reanchored(&dest, context).unwrap(); + let expected_fee = fee_asset.reanchored(&dest, &context).unwrap(); + let expected_asset = xfer_asset.reanchored(&dest, &context).unwrap(); // balances checks before - assert_eq!(Assets::balance(foreign_asset_id_multilocation, ALICE), foreign_initial_amount); + assert_eq!( + AssetsPallet::balance(foreign_asset_id_location.clone(), ALICE), + foreign_initial_amount + ); assert_eq!(Balances::free_balance(ALICE), INITIAL_BALANCE); // do the transfer let result = tested_call( RuntimeOrigin::signed(ALICE), - Box::new(dest.into()), - Box::new(beneficiary.into()), + Box::new(dest.clone().into()), + Box::new(beneficiary.clone().into()), Box::new(assets.into()), fee_index as u32, Unlimited, @@ -483,24 +495,32 @@ fn destination_asset_reserve_and_local_fee_reserve_call( let mut last_events = last_events(3).into_iter(); assert_eq!( last_events.next().unwrap(), - RuntimeEvent::XcmPallet(crate::Event::Attempted { outcome: Outcome::Complete(weight) }) + RuntimeEvent::XcmPallet(crate::Event::Attempted { + outcome: Outcome::Complete { used: weight } + }) ); // Alice spent (transferred) amount assert_eq!( - Assets::balance(foreign_asset_id_multilocation, ALICE), + AssetsPallet::balance(foreign_asset_id_location.clone(), ALICE), foreign_initial_amount - SEND_AMOUNT ); // Alice used native asset for fees assert_eq!(Balances::free_balance(ALICE), INITIAL_BALANCE - FEE_AMOUNT); // Destination account (parachain account) added native reserve used as fee to balances assert_eq!(Balances::free_balance(reserve_sovereign_account.clone()), FEE_AMOUNT); - assert_eq!(Assets::balance(foreign_asset_id_multilocation, reserve_sovereign_account), 0); + assert_eq!( + AssetsPallet::balance(foreign_asset_id_location.clone(), reserve_sovereign_account), + 0 + ); // Verify total and active issuance of foreign BLA have decreased (burned on // reserve-withdraw) let expected_issuance = foreign_initial_amount - SEND_AMOUNT; - assert_eq!(Assets::total_issuance(foreign_asset_id_multilocation), expected_issuance); - assert_eq!(Assets::active_issuance(foreign_asset_id_multilocation), expected_issuance); + assert_eq!( + AssetsPallet::total_issuance(foreign_asset_id_location.clone()), + expected_issuance + ); + assert_eq!(AssetsPallet::active_issuance(foreign_asset_id_location), expected_issuance); // Verify sent XCM program assert_eq!( @@ -514,7 +534,7 @@ fn destination_asset_reserve_and_local_fee_reserve_call( buy_limited_execution(expected_fee, Unlimited), WithdrawAsset(expected_asset.into()), ClearOrigin, - DepositAsset { assets: AllCounted(2).into(), beneficiary }, + DepositAsset { assets: AllCounted(2).into(), beneficiary: beneficiary.clone() }, ]) )] ); @@ -522,7 +542,7 @@ fn destination_asset_reserve_and_local_fee_reserve_call( last_events.next().unwrap(), RuntimeEvent::XcmPallet(crate::Event::FeesPaid { paying: origin_location, - fees: MultiAssets::new(), + fees: Assets::new(), }) ); assert!(matches!( @@ -582,19 +602,19 @@ fn remote_asset_reserve_and_local_fee_reserve_call_disallowed( ) where Call: FnOnce( OriginFor, - Box, - Box, - Box, + Box, + Box, + Box, u32, WeightLimit, ) -> DispatchResult, { let balances = vec![(ALICE, INITIAL_BALANCE)]; - let beneficiary: MultiLocation = AccountId32 { network: None, id: ALICE.into() }.into(); + let beneficiary: Location = Junction::AccountId32 { network: None, id: ALICE.into() }.into(); new_test_ext_with_balances(balances).execute_with(|| { // create non-sufficient foreign asset BLA let foreign_initial_amount = 142; - let (_, _, foreign_asset_id_multilocation) = set_up_foreign_asset( + let (_, _, foreign_asset_id_location) = set_up_foreign_asset( FOREIGN_ASSET_RESERVE_PARA_ID, Some(FOREIGN_ASSET_INNER_JUNCTION), ALICE, @@ -606,15 +626,18 @@ fn remote_asset_reserve_and_local_fee_reserve_call_disallowed( // chain) let dest = RelayLocation::get().pushed_with_interior(Parachain(OTHER_PARA_ID)).unwrap(); - let (assets, fee_index, _, _) = into_multiassets_checked( + let (assets, fee_index, _, _) = into_assets_checked( // native asset for fee - local reserve - (MultiLocation::here(), FEE_AMOUNT).into(), + (Location::here(), FEE_AMOUNT).into(), // foreign asset to transfer - remote reserve - (foreign_asset_id_multilocation, SEND_AMOUNT).into(), + (foreign_asset_id_location.clone(), SEND_AMOUNT).into(), ); // balances checks before - assert_eq!(Assets::balance(foreign_asset_id_multilocation, ALICE), foreign_initial_amount); + assert_eq!( + AssetsPallet::balance(foreign_asset_id_location.clone(), ALICE), + foreign_initial_amount + ); assert_eq!(Balances::free_balance(ALICE), INITIAL_BALANCE); // try the transfer @@ -629,14 +652,20 @@ fn remote_asset_reserve_and_local_fee_reserve_call_disallowed( assert_eq!(result, expected_result); // Alice transferred nothing - assert_eq!(Assets::balance(foreign_asset_id_multilocation, ALICE), foreign_initial_amount); + assert_eq!( + AssetsPallet::balance(foreign_asset_id_location.clone(), ALICE), + foreign_initial_amount + ); // Alice spent native asset for fees assert_eq!(Balances::free_balance(ALICE), INITIAL_BALANCE); // Verify total and active issuance of foreign BLA asset have decreased (burned on // reserve-withdraw) let expected_issuance = foreign_initial_amount; - assert_eq!(Assets::total_issuance(foreign_asset_id_multilocation), expected_issuance); - assert_eq!(Assets::active_issuance(foreign_asset_id_multilocation), expected_issuance); + assert_eq!( + AssetsPallet::total_issuance(foreign_asset_id_location.clone()), + expected_issuance + ); + assert_eq!(AssetsPallet::active_issuance(foreign_asset_id_location), expected_issuance); }); } @@ -698,20 +727,21 @@ fn local_asset_reserve_and_destination_fee_reserve_call( ) where Call: FnOnce( OriginFor, - Box, - Box, - Box, + Box, + Box, + Box, u32, WeightLimit, ) -> DispatchResult, { let balances = vec![(ALICE, INITIAL_BALANCE)]; - let origin_location: MultiLocation = AccountId32 { network: None, id: ALICE.into() }.into(); - let beneficiary: MultiLocation = AccountId32 { network: None, id: ALICE.into() }.into(); + let origin_location: Location = + Junction::AccountId32 { network: None, id: ALICE.into() }.into(); + let beneficiary: Location = Junction::AccountId32 { network: None, id: ALICE.into() }.into(); new_test_ext_with_balances(balances).execute_with(|| { // create sufficient foreign asset USDC let usdc_initial_local_amount = 142; - let (usdc_reserve_location, usdc_chain_sovereign_account, usdc_id_multilocation) = + let (usdc_reserve_location, usdc_chain_sovereign_account, usdc_id_location) = set_up_foreign_asset( USDC_RESERVE_PARA_ID, Some(USDC_INNER_JUNCTION), @@ -723,27 +753,30 @@ fn local_asset_reserve_and_destination_fee_reserve_call( // native assets transfer to fee reserve location (no teleport trust) let dest = usdc_reserve_location; - let (assets, fee_index, fee_asset, xfer_asset) = into_multiassets_checked( + let (assets, fee_index, fee_asset, xfer_asset) = into_assets_checked( // usdc for fees (is sufficient on local chain too) - destination reserve - (usdc_id_multilocation, FEE_AMOUNT).into(), + (usdc_id_location.clone(), FEE_AMOUNT).into(), // native asset to transfer (not used for fees) - local reserve - (MultiLocation::here(), SEND_AMOUNT).into(), + (Location::here(), SEND_AMOUNT).into(), ); // reanchor according to test-case let context = UniversalLocation::get(); - let expected_fee = fee_asset.reanchored(&dest, context).unwrap(); - let expected_asset = xfer_asset.reanchored(&dest, context).unwrap(); + let expected_fee = fee_asset.reanchored(&dest, &context).unwrap(); + let expected_asset = xfer_asset.reanchored(&dest, &context).unwrap(); // balances checks before - assert_eq!(Assets::balance(usdc_id_multilocation, ALICE), usdc_initial_local_amount); + assert_eq!( + AssetsPallet::balance(usdc_id_location.clone(), ALICE), + usdc_initial_local_amount + ); assert_eq!(Balances::free_balance(ALICE), INITIAL_BALANCE); // do the transfer let result = tested_call( RuntimeOrigin::signed(ALICE), - Box::new(dest.into()), - Box::new(beneficiary.into()), + Box::new(dest.clone().into()), + Box::new(beneficiary.clone().into()), Box::new(assets.into()), fee_index as u32, Unlimited, @@ -758,13 +791,15 @@ fn local_asset_reserve_and_destination_fee_reserve_call( let mut last_events = last_events(3).into_iter(); assert_eq!( last_events.next().unwrap(), - RuntimeEvent::XcmPallet(crate::Event::Attempted { outcome: Outcome::Complete(weight) }) + RuntimeEvent::XcmPallet(crate::Event::Attempted { + outcome: Outcome::Complete { used: weight } + }) ); assert_eq!( last_events.next().unwrap(), RuntimeEvent::XcmPallet(crate::Event::FeesPaid { - paying: origin_location, - fees: MultiAssets::new(), + paying: origin_location.clone(), + fees: Assets::new(), }) ); assert!(matches!( @@ -774,18 +809,21 @@ fn local_asset_reserve_and_destination_fee_reserve_call( // Alice spent (fees) amount assert_eq!( - Assets::balance(usdc_id_multilocation, ALICE), + AssetsPallet::balance(usdc_id_location.clone(), ALICE), usdc_initial_local_amount - FEE_AMOUNT ); // Alice used native asset for transfer assert_eq!(Balances::free_balance(ALICE), INITIAL_BALANCE - SEND_AMOUNT); // Sovereign account of dest parachain holds `SEND_AMOUNT` native asset in local reserve assert_eq!(Balances::free_balance(usdc_chain_sovereign_account.clone()), SEND_AMOUNT); - assert_eq!(Assets::balance(usdc_id_multilocation, usdc_chain_sovereign_account), 0); + assert_eq!( + AssetsPallet::balance(usdc_id_location.clone(), usdc_chain_sovereign_account), + 0 + ); // Verify total and active issuance of USDC have decreased (burned on reserve-withdraw) let expected_issuance = usdc_initial_local_amount - FEE_AMOUNT; - assert_eq!(Assets::total_issuance(usdc_id_multilocation), expected_issuance); - assert_eq!(Assets::active_issuance(usdc_id_multilocation), expected_issuance); + assert_eq!(AssetsPallet::total_issuance(usdc_id_location.clone()), expected_issuance); + assert_eq!(AssetsPallet::active_issuance(usdc_id_location), expected_issuance); // Verify sent XCM program assert_eq!( @@ -856,21 +894,22 @@ fn destination_asset_reserve_and_destination_fee_reserve_call( ) where Call: FnOnce( OriginFor, - Box, - Box, - Box, + Box, + Box, + Box, u32, WeightLimit, ) -> DispatchResult, { let balances = vec![(ALICE, INITIAL_BALANCE)]; - let origin_location: MultiLocation = AccountId32 { network: None, id: ALICE.into() }.into(); - let beneficiary: MultiLocation = AccountId32 { network: None, id: ALICE.into() }.into(); + let origin_location: Location = + Junction::AccountId32 { network: None, id: ALICE.into() }.into(); + let beneficiary: Location = Junction::AccountId32 { network: None, id: ALICE.into() }.into(); new_test_ext_with_balances(balances).execute_with(|| { // we'll send just this foreign asset back to its reserve location and use it for fees as // well let foreign_initial_amount = 142; - let (reserve_location, reserve_sovereign_account, foreign_asset_id_multilocation) = + let (reserve_location, reserve_sovereign_account, foreign_asset_id_location) = set_up_foreign_asset( FOREIGN_ASSET_RESERVE_PARA_ID, Some(FOREIGN_ASSET_INNER_JUNCTION), @@ -881,22 +920,25 @@ fn destination_asset_reserve_and_destination_fee_reserve_call( // transfer destination is reserve location let dest = reserve_location; - let assets: MultiAssets = vec![(foreign_asset_id_multilocation, SEND_AMOUNT).into()].into(); + let assets: Assets = vec![(foreign_asset_id_location.clone(), SEND_AMOUNT).into()].into(); let fee_index = 0; // reanchor according to test-case let mut expected_assets = assets.clone(); - expected_assets.reanchor(&dest, UniversalLocation::get()).unwrap(); + expected_assets.reanchor(&dest, &UniversalLocation::get()).unwrap(); // balances checks before - assert_eq!(Assets::balance(foreign_asset_id_multilocation, ALICE), foreign_initial_amount); + assert_eq!( + AssetsPallet::balance(foreign_asset_id_location.clone(), ALICE), + foreign_initial_amount + ); assert_eq!(Balances::free_balance(ALICE), INITIAL_BALANCE); // do the transfer let result = tested_call( RuntimeOrigin::signed(ALICE), - Box::new(dest.into()), - Box::new(beneficiary.into()), + Box::new(dest.clone().into()), + Box::new(beneficiary.clone().into()), Box::new(assets.into()), fee_index, Unlimited, @@ -911,13 +953,15 @@ fn destination_asset_reserve_and_destination_fee_reserve_call( let mut last_events = last_events(3).into_iter(); assert_eq!( last_events.next().unwrap(), - RuntimeEvent::XcmPallet(crate::Event::Attempted { outcome: Outcome::Complete(weight) }) + RuntimeEvent::XcmPallet(crate::Event::Attempted { + outcome: Outcome::Complete { used: weight } + }) ); assert_eq!( last_events.next().unwrap(), RuntimeEvent::XcmPallet(crate::Event::FeesPaid { - paying: origin_location, - fees: MultiAssets::new(), + paying: origin_location.clone(), + fees: Assets::new(), }) ); assert!(matches!( @@ -927,19 +971,25 @@ fn destination_asset_reserve_and_destination_fee_reserve_call( // Alice spent (transferred) amount assert_eq!( - Assets::balance(foreign_asset_id_multilocation, ALICE), + AssetsPallet::balance(foreign_asset_id_location.clone(), ALICE), foreign_initial_amount - SEND_AMOUNT ); // Alice's native asset balance is untouched assert_eq!(Balances::free_balance(ALICE), INITIAL_BALANCE); // Reserve sovereign account has same balances assert_eq!(Balances::free_balance(reserve_sovereign_account.clone()), 0); - assert_eq!(Assets::balance(foreign_asset_id_multilocation, reserve_sovereign_account), 0); + assert_eq!( + AssetsPallet::balance(foreign_asset_id_location.clone(), reserve_sovereign_account), + 0 + ); // Verify total and active issuance of foreign BLA have decreased (burned on // reserve-withdraw) let expected_issuance = foreign_initial_amount - SEND_AMOUNT; - assert_eq!(Assets::total_issuance(foreign_asset_id_multilocation), expected_issuance); - assert_eq!(Assets::active_issuance(foreign_asset_id_multilocation), expected_issuance); + assert_eq!( + AssetsPallet::total_issuance(foreign_asset_id_location.clone()), + expected_issuance + ); + assert_eq!(AssetsPallet::active_issuance(foreign_asset_id_location), expected_issuance); // Verify sent XCM program assert_eq!( @@ -950,7 +1000,7 @@ fn destination_asset_reserve_and_destination_fee_reserve_call( WithdrawAsset(expected_assets.clone()), ClearOrigin, buy_limited_execution(expected_assets.get(0).unwrap().clone(), Unlimited), - DepositAsset { assets: AllCounted(1).into(), beneficiary }, + DepositAsset { assets: AllCounted(1).into(), beneficiary: beneficiary.clone() }, ]), )] ); @@ -1003,19 +1053,19 @@ fn remote_asset_reserve_and_destination_fee_reserve_call_disallowed( ) where Call: FnOnce( OriginFor, - Box, - Box, - Box, + Box, + Box, + Box, u32, WeightLimit, ) -> DispatchResult, { let balances = vec![(ALICE, INITIAL_BALANCE)]; - let beneficiary: MultiLocation = AccountId32 { network: None, id: ALICE.into() }.into(); + let beneficiary: Location = Junction::AccountId32 { network: None, id: ALICE.into() }.into(); new_test_ext_with_balances(balances).execute_with(|| { // create sufficient foreign asset USDC let usdc_initial_local_amount = 42; - let (usdc_chain, _, usdc_id_multilocation) = set_up_foreign_asset( + let (usdc_chain, _, usdc_id_location) = set_up_foreign_asset( USDC_RESERVE_PARA_ID, Some(USDC_INNER_JUNCTION), ALICE, @@ -1025,7 +1075,7 @@ fn remote_asset_reserve_and_destination_fee_reserve_call_disallowed( // create non-sufficient foreign asset BLA let foreign_initial_amount = 142; - let (_, _, foreign_asset_id_multilocation) = set_up_foreign_asset( + let (_, _, foreign_asset_id_location) = set_up_foreign_asset( FOREIGN_ASSET_RESERVE_PARA_ID, Some(FOREIGN_ASSET_INNER_JUNCTION), ALICE, @@ -1037,16 +1087,22 @@ fn remote_asset_reserve_and_destination_fee_reserve_call_disallowed( // reserve chain) let dest = usdc_chain; - let (assets, fee_index, _, _) = into_multiassets_checked( + let (assets, fee_index, _, _) = into_assets_checked( // USDC for fees (is sufficient on local chain too) - destination reserve - (usdc_id_multilocation, FEE_AMOUNT).into(), + (usdc_id_location.clone(), FEE_AMOUNT).into(), // foreign asset to transfer (not used for fees) - remote reserve - (foreign_asset_id_multilocation, SEND_AMOUNT).into(), + (foreign_asset_id_location.clone(), SEND_AMOUNT).into(), ); // balances checks before - assert_eq!(Assets::balance(usdc_id_multilocation, ALICE), usdc_initial_local_amount); - assert_eq!(Assets::balance(foreign_asset_id_multilocation, ALICE), foreign_initial_amount); + assert_eq!( + AssetsPallet::balance(usdc_id_location.clone(), ALICE), + usdc_initial_local_amount + ); + assert_eq!( + AssetsPallet::balance(foreign_asset_id_location.clone(), ALICE), + foreign_initial_amount + ); assert_eq!(Balances::free_balance(ALICE), INITIAL_BALANCE); // do the transfer @@ -1062,14 +1118,23 @@ fn remote_asset_reserve_and_destination_fee_reserve_call_disallowed( // Alice native asset untouched assert_eq!(Balances::free_balance(ALICE), INITIAL_BALANCE); - assert_eq!(Assets::balance(usdc_id_multilocation, ALICE), usdc_initial_local_amount); - assert_eq!(Assets::balance(foreign_asset_id_multilocation, ALICE), foreign_initial_amount); + assert_eq!( + AssetsPallet::balance(usdc_id_location.clone(), ALICE), + usdc_initial_local_amount + ); + assert_eq!( + AssetsPallet::balance(foreign_asset_id_location.clone(), ALICE), + foreign_initial_amount + ); let expected_usdc_issuance = usdc_initial_local_amount; - assert_eq!(Assets::total_issuance(usdc_id_multilocation), expected_usdc_issuance); - assert_eq!(Assets::active_issuance(usdc_id_multilocation), expected_usdc_issuance); + assert_eq!(AssetsPallet::total_issuance(usdc_id_location.clone()), expected_usdc_issuance); + assert_eq!(AssetsPallet::active_issuance(usdc_id_location.clone()), expected_usdc_issuance); let expected_bla_issuance = foreign_initial_amount; - assert_eq!(Assets::total_issuance(foreign_asset_id_multilocation), expected_bla_issuance); - assert_eq!(Assets::active_issuance(foreign_asset_id_multilocation), expected_bla_issuance); + assert_eq!( + AssetsPallet::total_issuance(foreign_asset_id_location.clone()), + expected_bla_issuance + ); + assert_eq!(AssetsPallet::active_issuance(foreign_asset_id_location), expected_bla_issuance); }); } @@ -1127,19 +1192,19 @@ fn local_asset_reserve_and_remote_fee_reserve_call_disallowed( ) where Call: FnOnce( OriginFor, - Box, - Box, - Box, + Box, + Box, + Box, u32, WeightLimit, ) -> DispatchResult, { let balances = vec![(ALICE, INITIAL_BALANCE)]; - let beneficiary: MultiLocation = AccountId32 { network: None, id: ALICE.into() }.into(); + let beneficiary: Location = Junction::AccountId32 { network: None, id: ALICE.into() }.into(); new_test_ext_with_balances(balances).execute_with(|| { // create sufficient foreign asset USDC let usdc_initial_local_amount = 142; - let (_, usdc_chain_sovereign_account, usdc_id_multilocation) = set_up_foreign_asset( + let (_, usdc_chain_sovereign_account, usdc_id_location) = set_up_foreign_asset( USDC_RESERVE_PARA_ID, Some(USDC_INNER_JUNCTION), ALICE, @@ -1151,15 +1216,18 @@ fn local_asset_reserve_and_remote_fee_reserve_call_disallowed( let dest = RelayLocation::get().pushed_with_interior(Parachain(OTHER_PARA_ID)).unwrap(); let dest_sovereign_account = SovereignAccountOf::convert_location(&dest).unwrap(); - let (assets, fee_index, _, _) = into_multiassets_checked( + let (assets, fee_index, _, _) = into_assets_checked( // USDC for fees (is sufficient on local chain too) - remote reserve - (usdc_id_multilocation, FEE_AMOUNT).into(), + (usdc_id_location.clone(), FEE_AMOUNT).into(), // native asset to transfer (not used for fees) - local reserve - (MultiLocation::here(), SEND_AMOUNT).into(), + (Location::here(), SEND_AMOUNT).into(), ); // balances checks before - assert_eq!(Assets::balance(usdc_id_multilocation, ALICE), usdc_initial_local_amount); + assert_eq!( + AssetsPallet::balance(usdc_id_location.clone(), ALICE), + usdc_initial_local_amount + ); assert_eq!(Balances::free_balance(ALICE), INITIAL_BALANCE); // do the transfer @@ -1172,15 +1240,21 @@ fn local_asset_reserve_and_remote_fee_reserve_call_disallowed( Unlimited, ); assert_eq!(result, expected_result); - assert_eq!(Assets::balance(usdc_id_multilocation, ALICE), usdc_initial_local_amount); + assert_eq!( + AssetsPallet::balance(usdc_id_location.clone(), ALICE), + usdc_initial_local_amount + ); assert_eq!(Balances::free_balance(ALICE), INITIAL_BALANCE); // Sovereign account of reserve parachain is unchanged assert_eq!(Balances::free_balance(usdc_chain_sovereign_account.clone()), 0); - assert_eq!(Assets::balance(usdc_id_multilocation, usdc_chain_sovereign_account), 0); + assert_eq!( + AssetsPallet::balance(usdc_id_location.clone(), usdc_chain_sovereign_account), + 0 + ); assert_eq!(Balances::free_balance(dest_sovereign_account), 0); let expected_usdc_issuance = usdc_initial_local_amount; - assert_eq!(Assets::total_issuance(usdc_id_multilocation), expected_usdc_issuance); - assert_eq!(Assets::active_issuance(usdc_id_multilocation), expected_usdc_issuance); + assert_eq!(AssetsPallet::total_issuance(usdc_id_location.clone()), expected_usdc_issuance); + assert_eq!(AssetsPallet::active_issuance(usdc_id_location), expected_usdc_issuance); }); } @@ -1237,19 +1311,19 @@ fn destination_asset_reserve_and_remote_fee_reserve_call_disallowed( ) where Call: FnOnce( OriginFor, - Box, - Box, - Box, + Box, + Box, + Box, u32, WeightLimit, ) -> DispatchResult, { let balances = vec![(ALICE, INITIAL_BALANCE)]; - let beneficiary: MultiLocation = AccountId32 { network: None, id: ALICE.into() }.into(); + let beneficiary: Location = Junction::AccountId32 { network: None, id: ALICE.into() }.into(); new_test_ext_with_balances(balances).execute_with(|| { // create sufficient foreign asset USDC let usdc_initial_local_amount = 42; - let (_, usdc_chain_sovereign_account, usdc_id_multilocation) = set_up_foreign_asset( + let (_, usdc_chain_sovereign_account, usdc_id_location) = set_up_foreign_asset( USDC_RESERVE_PARA_ID, Some(USDC_INNER_JUNCTION), ALICE, @@ -1259,7 +1333,7 @@ fn destination_asset_reserve_and_remote_fee_reserve_call_disallowed( // create non-sufficient foreign asset BLA let foreign_initial_amount = 142; - let (reserve_location, foreign_sovereign_account, foreign_asset_id_multilocation) = + let (reserve_location, foreign_sovereign_account, foreign_asset_id_location) = set_up_foreign_asset( FOREIGN_ASSET_RESERVE_PARA_ID, Some(FOREIGN_ASSET_INNER_JUNCTION), @@ -1272,15 +1346,18 @@ fn destination_asset_reserve_and_remote_fee_reserve_call_disallowed( let dest = reserve_location; let dest_sovereign_account = foreign_sovereign_account; - let (assets, fee_index, _, _) = into_multiassets_checked( + let (assets, fee_index, _, _) = into_assets_checked( // USDC for fees (is sufficient on local chain too) - remote reserve - (usdc_id_multilocation, FEE_AMOUNT).into(), + (usdc_id_location.clone(), FEE_AMOUNT).into(), // foreign asset to transfer (not used for fees) - destination reserve - (foreign_asset_id_multilocation, SEND_AMOUNT).into(), + (foreign_asset_id_location.clone(), SEND_AMOUNT).into(), ); // balances checks before - assert_eq!(Assets::balance(usdc_id_multilocation, ALICE), usdc_initial_local_amount); + assert_eq!( + AssetsPallet::balance(usdc_id_location.clone(), ALICE), + usdc_initial_local_amount + ); assert_eq!(Balances::free_balance(ALICE), INITIAL_BALANCE); // do the transfer @@ -1295,18 +1372,33 @@ fn destination_asset_reserve_and_remote_fee_reserve_call_disallowed( assert_eq!(result, expected_result); // Alice native asset untouched assert_eq!(Balances::free_balance(ALICE), INITIAL_BALANCE); - assert_eq!(Assets::balance(usdc_id_multilocation, ALICE), usdc_initial_local_amount); - assert_eq!(Assets::balance(foreign_asset_id_multilocation, ALICE), foreign_initial_amount); + assert_eq!( + AssetsPallet::balance(usdc_id_location.clone(), ALICE), + usdc_initial_local_amount + ); + assert_eq!( + AssetsPallet::balance(foreign_asset_id_location.clone(), ALICE), + foreign_initial_amount + ); assert_eq!(Balances::free_balance(usdc_chain_sovereign_account.clone()), 0); - assert_eq!(Assets::balance(usdc_id_multilocation, usdc_chain_sovereign_account), 0); + assert_eq!( + AssetsPallet::balance(usdc_id_location.clone(), usdc_chain_sovereign_account), + 0 + ); assert_eq!(Balances::free_balance(dest_sovereign_account.clone()), 0); - assert_eq!(Assets::balance(foreign_asset_id_multilocation, dest_sovereign_account), 0); + assert_eq!( + AssetsPallet::balance(foreign_asset_id_location.clone(), dest_sovereign_account), + 0 + ); let expected_usdc_issuance = usdc_initial_local_amount; - assert_eq!(Assets::total_issuance(usdc_id_multilocation), expected_usdc_issuance); - assert_eq!(Assets::active_issuance(usdc_id_multilocation), expected_usdc_issuance); + assert_eq!(AssetsPallet::total_issuance(usdc_id_location.clone()), expected_usdc_issuance); + assert_eq!(AssetsPallet::active_issuance(usdc_id_location.clone()), expected_usdc_issuance); let expected_bla_issuance = foreign_initial_amount; - assert_eq!(Assets::total_issuance(foreign_asset_id_multilocation), expected_bla_issuance); - assert_eq!(Assets::active_issuance(foreign_asset_id_multilocation), expected_bla_issuance); + assert_eq!( + AssetsPallet::total_issuance(foreign_asset_id_location.clone()), + expected_bla_issuance + ); + assert_eq!(AssetsPallet::active_issuance(foreign_asset_id_location), expected_bla_issuance); }); } @@ -1377,52 +1469,54 @@ fn remote_asset_reserve_and_remote_fee_reserve_call( ) where Call: FnOnce( OriginFor, - Box, - Box, - Box, + Box, + Box, + Box, u32, WeightLimit, ) -> DispatchResult, { let balances = vec![(ALICE, INITIAL_BALANCE)]; - let beneficiary: MultiLocation = AccountId32 { network: None, id: ALICE.into() }.into(); + let beneficiary: Location = Junction::AccountId32 { network: None, id: ALICE.into() }.into(); new_test_ext_with_balances(balances).execute_with(|| { // create sufficient foreign asset USDC let usdc_initial_local_amount = 142; - let (usdc_chain, usdc_chain_sovereign_account, usdc_id_multilocation) = - set_up_foreign_asset( - USDC_RESERVE_PARA_ID, - Some(USDC_INNER_JUNCTION), - ALICE, - usdc_initial_local_amount, - true, - ); + let (usdc_chain, usdc_chain_sovereign_account, usdc_id_location) = set_up_foreign_asset( + USDC_RESERVE_PARA_ID, + Some(USDC_INNER_JUNCTION), + ALICE, + usdc_initial_local_amount, + true, + ); // transfer destination is some other parachain let dest = RelayLocation::get().pushed_with_interior(Parachain(OTHER_PARA_ID)).unwrap(); - let assets: MultiAssets = vec![(usdc_id_multilocation, SEND_AMOUNT).into()].into(); - let fee_index = 0u32; + let assets: Assets = vec![(usdc_id_location.clone(), SEND_AMOUNT).into()].into(); + let fee_index = 0; // reanchor according to test-case let context = UniversalLocation::get(); - let expected_dest_on_reserve = dest.reanchored(&usdc_chain, context).unwrap(); + let expected_dest_on_reserve = dest.clone().reanchored(&usdc_chain, &context).unwrap(); let fees = assets.get(fee_index as usize).unwrap().clone(); let (fees_half_1, fees_half_2) = XcmPallet::halve_fees(fees).unwrap(); let mut expected_assets_on_reserve = assets.clone(); - expected_assets_on_reserve.reanchor(&usdc_chain, context).unwrap(); - let expected_fee_on_reserve = fees_half_1.reanchored(&usdc_chain, context).unwrap(); - let expected_fee_on_dest = fees_half_2.reanchored(&dest, context).unwrap(); + expected_assets_on_reserve.reanchor(&usdc_chain, &context).unwrap(); + let expected_fee_on_reserve = fees_half_1.reanchored(&usdc_chain, &context).unwrap(); + let expected_fee_on_dest = fees_half_2.reanchored(&dest, &context).unwrap(); // balances checks before - assert_eq!(Assets::balance(usdc_id_multilocation, ALICE), usdc_initial_local_amount); + assert_eq!( + AssetsPallet::balance(usdc_id_location.clone(), ALICE), + usdc_initial_local_amount + ); assert_eq!(Balances::free_balance(ALICE), INITIAL_BALANCE); // do the transfer let result = tested_call( RuntimeOrigin::signed(ALICE), - Box::new(dest.into()), - Box::new(beneficiary.into()), + Box::new(dest.clone().into()), + Box::new(beneficiary.clone().into()), Box::new(assets.into()), fee_index, Unlimited, @@ -1435,23 +1529,26 @@ fn remote_asset_reserve_and_remote_fee_reserve_call( assert!(matches!( last_event(), - RuntimeEvent::XcmPallet(crate::Event::Attempted { outcome: Outcome::Complete(_) }) + RuntimeEvent::XcmPallet(crate::Event::Attempted { outcome: Outcome::Complete { .. } }) )); // Alice spent (transferred) amount assert_eq!( - Assets::balance(usdc_id_multilocation, ALICE), + AssetsPallet::balance(usdc_id_location.clone(), ALICE), usdc_initial_local_amount - SEND_AMOUNT ); // Alice's native asset balance is untouched assert_eq!(Balances::free_balance(ALICE), INITIAL_BALANCE); // Destination account (parachain account) has expected (same) balances assert_eq!(Balances::free_balance(usdc_chain_sovereign_account.clone()), 0); - assert_eq!(Assets::balance(usdc_id_multilocation, usdc_chain_sovereign_account), 0); + assert_eq!( + AssetsPallet::balance(usdc_id_location.clone(), usdc_chain_sovereign_account), + 0 + ); // Verify total and active issuance of USDC have decreased (burned on reserve-withdraw) let expected_usdc_issuance = usdc_initial_local_amount - SEND_AMOUNT; - assert_eq!(Assets::total_issuance(usdc_id_multilocation), expected_usdc_issuance); - assert_eq!(Assets::active_issuance(usdc_id_multilocation), expected_usdc_issuance); + assert_eq!(AssetsPallet::total_issuance(usdc_id_location.clone()), expected_usdc_issuance); + assert_eq!(AssetsPallet::active_issuance(usdc_id_location.clone()), expected_usdc_issuance); // Verify sent XCM program assert_eq!( @@ -1523,46 +1620,50 @@ fn local_asset_reserve_and_teleported_fee_call( ) where Call: FnOnce( OriginFor, - Box, - Box, - Box, + Box, + Box, + Box, u32, WeightLimit, ) -> DispatchResult, { let balances = vec![(ALICE, INITIAL_BALANCE)]; - let origin_location: MultiLocation = AccountId32 { network: None, id: ALICE.into() }.into(); - let beneficiary: MultiLocation = AccountId32 { network: None, id: ALICE.into() }.into(); + let origin_location: Location = + Junction::AccountId32 { network: None, id: ALICE.into() }.into(); + let beneficiary: Location = Junction::AccountId32 { network: None, id: ALICE.into() }.into(); new_test_ext_with_balances(balances).execute_with(|| { // create sufficient foreign asset USDT let usdt_initial_local_amount = 42; - let (usdt_chain, usdt_chain_sovereign_account, usdt_id_multilocation) = + let (usdt_chain, usdt_chain_sovereign_account, usdt_id_location) = set_up_foreign_asset(USDT_PARA_ID, None, ALICE, usdt_initial_local_amount, true); // native assets transfer destination is USDT chain (teleport trust only for USDT) let dest = usdt_chain; - let (assets, fee_index, fee_asset, xfer_asset) = into_multiassets_checked( + let (assets, fee_index, fee_asset, xfer_asset) = into_assets_checked( // USDT for fees (is sufficient on local chain too) - teleported - (usdt_id_multilocation, FEE_AMOUNT).into(), + (usdt_id_location.clone(), FEE_AMOUNT).into(), // native asset to transfer (not used for fees) - local reserve - (MultiLocation::here(), SEND_AMOUNT).into(), + (Location::here(), SEND_AMOUNT).into(), ); // reanchor according to test-case let context = UniversalLocation::get(); - let expected_fee = fee_asset.reanchored(&dest, context).unwrap(); - let expected_asset = xfer_asset.reanchored(&dest, context).unwrap(); + let expected_fee = fee_asset.reanchored(&dest, &context).unwrap(); + let expected_asset = xfer_asset.reanchored(&dest, &context).unwrap(); // balances checks before - assert_eq!(Assets::balance(usdt_id_multilocation, ALICE), usdt_initial_local_amount); + assert_eq!( + AssetsPallet::balance(usdt_id_location.clone(), ALICE), + usdt_initial_local_amount + ); assert_eq!(Balances::free_balance(ALICE), INITIAL_BALANCE); // do the transfer let result = tested_call( RuntimeOrigin::signed(ALICE), - Box::new(dest.into()), - Box::new(beneficiary.into()), + Box::new(dest.clone().into()), + Box::new(beneficiary.clone().into()), Box::new(assets.into()), fee_index as u32, Unlimited, @@ -1577,13 +1678,15 @@ fn local_asset_reserve_and_teleported_fee_call( let mut last_events = last_events(3).into_iter(); assert_eq!( last_events.next().unwrap(), - RuntimeEvent::XcmPallet(crate::Event::Attempted { outcome: Outcome::Complete(weight) }) + RuntimeEvent::XcmPallet(crate::Event::Attempted { + outcome: Outcome::Complete { used: weight } + }) ); assert_eq!( last_events.next().unwrap(), RuntimeEvent::XcmPallet(crate::Event::FeesPaid { - paying: origin_location, - fees: MultiAssets::new(), + paying: origin_location.clone(), + fees: Assets::new(), }) ); assert!(matches!( @@ -1592,18 +1695,21 @@ fn local_asset_reserve_and_teleported_fee_call( )); // Alice spent (fees) amount assert_eq!( - Assets::balance(usdt_id_multilocation, ALICE), + AssetsPallet::balance(usdt_id_location.clone(), ALICE), usdt_initial_local_amount - FEE_AMOUNT ); // Alice used native asset for transfer assert_eq!(Balances::free_balance(ALICE), INITIAL_BALANCE - SEND_AMOUNT); // Sovereign account of dest parachain holds `SEND_AMOUNT` native asset in local reserve assert_eq!(Balances::free_balance(usdt_chain_sovereign_account.clone()), SEND_AMOUNT); - assert_eq!(Assets::balance(usdt_id_multilocation, usdt_chain_sovereign_account), 0); + assert_eq!( + AssetsPallet::balance(usdt_id_location.clone(), usdt_chain_sovereign_account), + 0 + ); // Verify total and active issuance have decreased (teleported) let expected_usdt_issuance = usdt_initial_local_amount - FEE_AMOUNT; - assert_eq!(Assets::total_issuance(usdt_id_multilocation), expected_usdt_issuance); - assert_eq!(Assets::active_issuance(usdt_id_multilocation), expected_usdt_issuance); + assert_eq!(AssetsPallet::total_issuance(usdt_id_location.clone()), expected_usdt_issuance); + assert_eq!(AssetsPallet::active_issuance(usdt_id_location), expected_usdt_issuance); // Verify sent XCM program assert_eq!( @@ -1672,25 +1778,26 @@ fn destination_asset_reserve_and_teleported_fee_call( ) where Call: FnOnce( OriginFor, - Box, - Box, - Box, + Box, + Box, + Box, u32, WeightLimit, ) -> DispatchResult, { let balances = vec![(ALICE, INITIAL_BALANCE)]; - let origin_location: MultiLocation = AccountId32 { network: None, id: ALICE.into() }.into(); - let beneficiary: MultiLocation = AccountId32 { network: None, id: ALICE.into() }.into(); + let origin_location: Location = + Junction::AccountId32 { network: None, id: ALICE.into() }.into(); + let beneficiary: Location = Junction::AccountId32 { network: None, id: ALICE.into() }.into(); new_test_ext_with_balances(balances).execute_with(|| { // create sufficient foreign asset USDT let usdt_initial_local_amount = 42; - let (_, usdt_chain_sovereign_account, usdt_id_multilocation) = + let (_, usdt_chain_sovereign_account, usdt_id_location) = set_up_foreign_asset(USDT_PARA_ID, None, ALICE, usdt_initial_local_amount, true); // create non-sufficient foreign asset BLA let foreign_initial_amount = 142; - let (reserve_location, foreign_sovereign_account, foreign_asset_id_multilocation) = + let (reserve_location, foreign_sovereign_account, foreign_asset_id_location) = set_up_foreign_asset( FOREIGN_ASSET_RESERVE_PARA_ID, Some(FOREIGN_ASSET_INNER_JUNCTION), @@ -1703,27 +1810,30 @@ fn destination_asset_reserve_and_teleported_fee_call( let dest = reserve_location; let dest_sovereign_account = foreign_sovereign_account; - let (assets, fee_index, fee_asset, xfer_asset) = into_multiassets_checked( + let (assets, fee_index, fee_asset, xfer_asset) = into_assets_checked( // USDT for fees (is sufficient on local chain too) - teleported - (usdt_id_multilocation, FEE_AMOUNT).into(), + (usdt_id_location.clone(), FEE_AMOUNT).into(), // foreign asset to transfer (not used for fees) - destination reserve - (foreign_asset_id_multilocation, SEND_AMOUNT).into(), + (foreign_asset_id_location.clone(), SEND_AMOUNT).into(), ); // reanchor according to test-case let context = UniversalLocation::get(); - let expected_fee = fee_asset.reanchored(&dest, context).unwrap(); - let expected_asset = xfer_asset.reanchored(&dest, context).unwrap(); + let expected_fee = fee_asset.reanchored(&dest, &context).unwrap(); + let expected_asset = xfer_asset.reanchored(&dest, &context).unwrap(); // balances checks before - assert_eq!(Assets::balance(usdt_id_multilocation, ALICE), usdt_initial_local_amount); + assert_eq!( + AssetsPallet::balance(usdt_id_location.clone(), ALICE), + usdt_initial_local_amount + ); assert_eq!(Balances::free_balance(ALICE), INITIAL_BALANCE); // do the transfer let result = tested_call( RuntimeOrigin::signed(ALICE), - Box::new(dest.into()), - Box::new(beneficiary.into()), + Box::new(dest.clone().into()), + Box::new(beneficiary.clone().into()), Box::new(assets.into()), fee_index as u32, Unlimited, @@ -1738,13 +1848,15 @@ fn destination_asset_reserve_and_teleported_fee_call( let mut last_events = last_events(3).into_iter(); assert_eq!( last_events.next().unwrap(), - RuntimeEvent::XcmPallet(crate::Event::Attempted { outcome: Outcome::Complete(weight) }) + RuntimeEvent::XcmPallet(crate::Event::Attempted { + outcome: Outcome::Complete { used: weight } + }) ); assert_eq!( last_events.next().unwrap(), RuntimeEvent::XcmPallet(crate::Event::FeesPaid { - paying: origin_location, - fees: MultiAssets::new(), + paying: origin_location.clone(), + fees: Assets::new(), }) ); assert!(matches!( @@ -1755,29 +1867,38 @@ fn destination_asset_reserve_and_teleported_fee_call( assert_eq!(Balances::free_balance(ALICE), INITIAL_BALANCE); // Alice spent USDT for fees assert_eq!( - Assets::balance(usdt_id_multilocation, ALICE), + AssetsPallet::balance(usdt_id_location.clone(), ALICE), usdt_initial_local_amount - FEE_AMOUNT ); // Alice transferred BLA assert_eq!( - Assets::balance(foreign_asset_id_multilocation, ALICE), + AssetsPallet::balance(foreign_asset_id_location.clone(), ALICE), foreign_initial_amount - SEND_AMOUNT ); // Verify balances of USDT reserve parachain assert_eq!(Balances::free_balance(usdt_chain_sovereign_account.clone()), 0); - assert_eq!(Assets::balance(usdt_id_multilocation, usdt_chain_sovereign_account), 0); + assert_eq!( + AssetsPallet::balance(usdt_id_location.clone(), usdt_chain_sovereign_account), + 0 + ); // Verify balances of transferred-asset reserve parachain assert_eq!(Balances::free_balance(dest_sovereign_account.clone()), 0); - assert_eq!(Assets::balance(foreign_asset_id_multilocation, dest_sovereign_account), 0); + assert_eq!( + AssetsPallet::balance(foreign_asset_id_location.clone(), dest_sovereign_account), + 0 + ); // Verify total and active issuance of USDT have decreased (teleported) let expected_usdt_issuance = usdt_initial_local_amount - FEE_AMOUNT; - assert_eq!(Assets::total_issuance(usdt_id_multilocation), expected_usdt_issuance); - assert_eq!(Assets::active_issuance(usdt_id_multilocation), expected_usdt_issuance); + assert_eq!(AssetsPallet::total_issuance(usdt_id_location.clone()), expected_usdt_issuance); + assert_eq!(AssetsPallet::active_issuance(usdt_id_location.clone()), expected_usdt_issuance); // Verify total and active issuance of foreign BLA asset have decreased (burned on // reserve-withdraw) let expected_bla_issuance = foreign_initial_amount - SEND_AMOUNT; - assert_eq!(Assets::total_issuance(foreign_asset_id_multilocation), expected_bla_issuance); - assert_eq!(Assets::active_issuance(foreign_asset_id_multilocation), expected_bla_issuance); + assert_eq!( + AssetsPallet::total_issuance(foreign_asset_id_location.clone()), + expected_bla_issuance + ); + assert_eq!(AssetsPallet::active_issuance(foreign_asset_id_location), expected_bla_issuance); // Verify sent XCM program assert_eq!( @@ -1844,24 +1965,24 @@ fn remote_asset_reserve_and_teleported_fee_reserve_call_disallowed( ) where Call: FnOnce( OriginFor, - Box, - Box, - Box, + Box, + Box, + Box, u32, WeightLimit, ) -> DispatchResult, { let balances = vec![(ALICE, INITIAL_BALANCE)]; - let beneficiary: MultiLocation = AccountId32 { network: None, id: ALICE.into() }.into(); + let beneficiary: Location = Junction::AccountId32 { network: None, id: ALICE.into() }.into(); new_test_ext_with_balances(balances).execute_with(|| { // create sufficient foreign asset USDT let usdt_initial_local_amount = 42; - let (usdt_chain, usdt_chain_sovereign_account, usdt_id_multilocation) = + let (usdt_chain, usdt_chain_sovereign_account, usdt_id_location) = set_up_foreign_asset(USDT_PARA_ID, None, ALICE, usdt_initial_local_amount, true); // create non-sufficient foreign asset BLA let foreign_initial_amount = 142; - let (_, reserve_sovereign_account, foreign_asset_id_multilocation) = set_up_foreign_asset( + let (_, reserve_sovereign_account, foreign_asset_id_location) = set_up_foreign_asset( FOREIGN_ASSET_RESERVE_PARA_ID, Some(FOREIGN_ASSET_INNER_JUNCTION), ALICE, @@ -1872,15 +1993,18 @@ fn remote_asset_reserve_and_teleported_fee_reserve_call_disallowed( // transfer destination is USDT chain (foreign asset needs to go through its reserve chain) let dest = usdt_chain; - let (assets, fee_index, _, _) = into_multiassets_checked( + let (assets, fee_index, _, _) = into_assets_checked( // USDT for fees (is sufficient on local chain too) - teleported - (usdt_id_multilocation, FEE_AMOUNT).into(), + (usdt_id_location.clone(), FEE_AMOUNT).into(), // foreign asset to transfer (not used for fees) - remote reserve - (foreign_asset_id_multilocation, SEND_AMOUNT).into(), + (foreign_asset_id_location.clone(), SEND_AMOUNT).into(), ); // balances checks before - assert_eq!(Assets::balance(usdt_id_multilocation, ALICE), usdt_initial_local_amount); + assert_eq!( + AssetsPallet::balance(usdt_id_location.clone(), ALICE), + usdt_initial_local_amount + ); assert_eq!(Balances::free_balance(ALICE), INITIAL_BALANCE); // try the transfer @@ -1895,18 +2019,33 @@ fn remote_asset_reserve_and_teleported_fee_reserve_call_disallowed( assert_eq!(result, expected_result); // Alice native asset untouched assert_eq!(Balances::free_balance(ALICE), INITIAL_BALANCE); - assert_eq!(Assets::balance(usdt_id_multilocation, ALICE), usdt_initial_local_amount); - assert_eq!(Assets::balance(foreign_asset_id_multilocation, ALICE), foreign_initial_amount); + assert_eq!( + AssetsPallet::balance(usdt_id_location.clone(), ALICE), + usdt_initial_local_amount + ); + assert_eq!( + AssetsPallet::balance(foreign_asset_id_location.clone(), ALICE), + foreign_initial_amount + ); assert_eq!(Balances::free_balance(usdt_chain_sovereign_account.clone()), 0); - assert_eq!(Assets::balance(usdt_id_multilocation, usdt_chain_sovereign_account), 0); + assert_eq!( + AssetsPallet::balance(usdt_id_location.clone(), usdt_chain_sovereign_account), + 0 + ); assert_eq!(Balances::free_balance(reserve_sovereign_account.clone()), 0); - assert_eq!(Assets::balance(foreign_asset_id_multilocation, reserve_sovereign_account), 0); + assert_eq!( + AssetsPallet::balance(foreign_asset_id_location.clone(), reserve_sovereign_account), + 0 + ); let expected_usdt_issuance = usdt_initial_local_amount; - assert_eq!(Assets::total_issuance(usdt_id_multilocation), expected_usdt_issuance); - assert_eq!(Assets::active_issuance(usdt_id_multilocation), expected_usdt_issuance); + assert_eq!(AssetsPallet::total_issuance(usdt_id_location.clone()), expected_usdt_issuance); + assert_eq!(AssetsPallet::active_issuance(usdt_id_location.clone()), expected_usdt_issuance); let expected_bla_issuance = foreign_initial_amount; - assert_eq!(Assets::total_issuance(foreign_asset_id_multilocation), expected_bla_issuance); - assert_eq!(Assets::active_issuance(foreign_asset_id_multilocation), expected_bla_issuance); + assert_eq!( + AssetsPallet::total_issuance(foreign_asset_id_location.clone()), + expected_bla_issuance + ); + assert_eq!(AssetsPallet::active_issuance(foreign_asset_id_location), expected_bla_issuance); }); } @@ -1959,21 +2098,24 @@ fn teleport_assets_with_remote_asset_reserve_and_teleported_fee_disallowed() { #[test] fn reserve_transfer_assets_with_teleportable_asset_disallowed() { let balances = vec![(ALICE, INITIAL_BALANCE)]; - let beneficiary: MultiLocation = AccountId32 { network: None, id: ALICE.into() }.into(); + let beneficiary: Location = Junction::AccountId32 { network: None, id: ALICE.into() }.into(); new_test_ext_with_balances(balances).execute_with(|| { // create sufficient foreign asset USDT let usdt_initial_local_amount = 42; - let (usdt_chain, usdt_chain_sovereign_account, usdt_id_multilocation) = + let (usdt_chain, usdt_chain_sovereign_account, usdt_id_location) = set_up_foreign_asset(USDT_PARA_ID, None, ALICE, usdt_initial_local_amount, true); // transfer destination is USDT chain (foreign asset needs to go through its reserve chain) let dest = usdt_chain; - let assets: MultiAssets = vec![(usdt_id_multilocation, FEE_AMOUNT).into()].into(); + let assets: Assets = vec![(usdt_id_location.clone(), FEE_AMOUNT).into()].into(); let fee_index = 0; // balances checks before - assert_eq!(Assets::balance(usdt_id_multilocation, ALICE), usdt_initial_local_amount); + assert_eq!( + AssetsPallet::balance(usdt_id_location.clone(), ALICE), + usdt_initial_local_amount + ); assert_eq!(Balances::free_balance(ALICE), INITIAL_BALANCE); // do the transfer @@ -1996,25 +2138,34 @@ fn reserve_transfer_assets_with_teleportable_asset_disallowed() { // Alice native asset is still same assert_eq!(Balances::free_balance(ALICE), INITIAL_BALANCE); // Alice USDT balance is still same - assert_eq!(Assets::balance(usdt_id_multilocation, ALICE), usdt_initial_local_amount); + assert_eq!( + AssetsPallet::balance(usdt_id_location.clone(), ALICE), + usdt_initial_local_amount + ); // No USDT moved to sovereign account of reserve parachain - assert_eq!(Assets::balance(usdt_id_multilocation, usdt_chain_sovereign_account), 0); + assert_eq!( + AssetsPallet::balance(usdt_id_location.clone(), usdt_chain_sovereign_account), + 0 + ); // Verify total and active issuance of USDT are still the same - assert_eq!(Assets::total_issuance(usdt_id_multilocation), usdt_initial_local_amount); - assert_eq!(Assets::active_issuance(usdt_id_multilocation), usdt_initial_local_amount); + assert_eq!( + AssetsPallet::total_issuance(usdt_id_location.clone()), + usdt_initial_local_amount + ); + assert_eq!(AssetsPallet::active_issuance(usdt_id_location), usdt_initial_local_amount); }); } /// Test `transfer_assets` with teleportable fee that is filtered - should fail. #[test] fn transfer_assets_with_filtered_teleported_fee_disallowed() { - let beneficiary: MultiLocation = AccountId32 { network: None, id: BOB.into() }.into(); + let beneficiary: Location = AccountId32 { network: None, id: BOB.into() }.into(); new_test_ext_with_balances(vec![(ALICE, INITIAL_BALANCE)]).execute_with(|| { - let (assets, fee_index, _, _) = into_multiassets_checked( + let (assets, fee_index, _, _) = into_assets_checked( // FilteredTeleportAsset for fees - teleportable but filtered FilteredTeleportAsset::get().into(), // native asset to transfer (not used for fees) - local reserve - (MultiLocation::here(), SEND_AMOUNT).into(), + (Location::here(), SEND_AMOUNT).into(), ); let result = XcmPallet::transfer_assets( RuntimeOrigin::signed(ALICE), @@ -2043,11 +2194,11 @@ fn transfer_assets_with_filtered_teleported_fee_disallowed() { #[test] fn intermediary_error_reverts_side_effects() { let balances = vec![(ALICE, INITIAL_BALANCE)]; - let beneficiary: MultiLocation = AccountId32 { network: None, id: ALICE.into() }.into(); + let beneficiary: Location = Junction::AccountId32 { network: None, id: ALICE.into() }.into(); new_test_ext_with_balances(balances).execute_with(|| { // create sufficient foreign asset USDC let usdc_initial_local_amount = 142; - let (_, usdc_chain_sovereign_account, usdc_id_multilocation) = set_up_foreign_asset( + let (_, usdc_chain_sovereign_account, usdc_id_location) = set_up_foreign_asset( USDC_RESERVE_PARA_ID, Some(USDC_INNER_JUNCTION), ALICE, @@ -2058,11 +2209,14 @@ fn intermediary_error_reverts_side_effects() { // transfer destination is some other parachain let dest = RelayLocation::get().pushed_with_interior(Parachain(OTHER_PARA_ID)).unwrap(); - let assets: MultiAssets = vec![(usdc_id_multilocation, SEND_AMOUNT).into()].into(); + let assets: Assets = vec![(usdc_id_location.clone(), SEND_AMOUNT).into()].into(); let fee_index = 0; // balances checks before - assert_eq!(Assets::balance(usdc_id_multilocation, ALICE), usdc_initial_local_amount); + assert_eq!( + AssetsPallet::balance(usdc_id_location.clone(), ALICE), + usdc_initial_local_amount + ); assert_eq!(Balances::free_balance(ALICE), INITIAL_BALANCE); // introduce artificial error in sending outbound XCM @@ -2080,14 +2234,23 @@ fn intermediary_error_reverts_side_effects() { .is_err()); // Alice no changes - assert_eq!(Assets::balance(usdc_id_multilocation, ALICE), usdc_initial_local_amount); + assert_eq!( + AssetsPallet::balance(usdc_id_location.clone(), ALICE), + usdc_initial_local_amount + ); assert_eq!(Balances::free_balance(ALICE), INITIAL_BALANCE); // Destination account (parachain account) no changes assert_eq!(Balances::free_balance(usdc_chain_sovereign_account.clone()), 0); - assert_eq!(Assets::balance(usdc_id_multilocation, usdc_chain_sovereign_account), 0); + assert_eq!( + AssetsPallet::balance(usdc_id_location.clone(), usdc_chain_sovereign_account), + 0 + ); // Verify total and active issuance of USDC has not changed - assert_eq!(Assets::total_issuance(usdc_id_multilocation), usdc_initial_local_amount); - assert_eq!(Assets::active_issuance(usdc_id_multilocation), usdc_initial_local_amount); + assert_eq!( + AssetsPallet::total_issuance(usdc_id_location.clone()), + usdc_initial_local_amount + ); + assert_eq!(AssetsPallet::active_issuance(usdc_id_location), usdc_initial_local_amount); // Verify no XCM program sent assert_eq!(sent_xcm(), vec![]); }); @@ -2105,47 +2268,50 @@ fn teleport_asset_using_local_fee_reserve_call( ) where Call: FnOnce( OriginFor, - Box, - Box, - Box, + Box, + Box, + Box, u32, WeightLimit, ) -> DispatchResult, { let weight = BaseXcmWeight::get() * 3; let balances = vec![(ALICE, INITIAL_BALANCE)]; - let origin_location: MultiLocation = AccountId32 { network: None, id: ALICE.into() }.into(); - let beneficiary: MultiLocation = AccountId32 { network: None, id: ALICE.into() }.into(); + let origin_location: Location = AccountId32 { network: None, id: ALICE.into() }.into(); + let beneficiary: Location = AccountId32 { network: None, id: ALICE.into() }.into(); new_test_ext_with_balances(balances).execute_with(|| { // create non-sufficient foreign asset USDT let usdt_initial_local_amount = 42; - let (usdt_chain, usdt_chain_sovereign_account, usdt_id_multilocation) = + let (usdt_chain, usdt_chain_sovereign_account, usdt_id_location) = set_up_foreign_asset(USDT_PARA_ID, None, ALICE, usdt_initial_local_amount, false); // transfer destination is reserve location (no teleport trust) let dest = usdt_chain; - let (assets, fee_index, fee_asset, xfer_asset) = into_multiassets_checked( + let (assets, fee_index, fee_asset, xfer_asset) = into_assets_checked( // native asset for fee - local reserve - (MultiLocation::here(), FEE_AMOUNT).into(), + (Location::here(), FEE_AMOUNT).into(), // USDT to transfer - destination reserve - (usdt_id_multilocation, SEND_AMOUNT).into(), + (usdt_id_location.clone(), SEND_AMOUNT).into(), ); // reanchor according to test-case let context = UniversalLocation::get(); - let expected_fee = fee_asset.reanchored(&dest, context).unwrap(); - let expected_asset = xfer_asset.reanchored(&dest, context).unwrap(); + let expected_fee = fee_asset.reanchored(&dest, &context).unwrap(); + let expected_asset = xfer_asset.reanchored(&dest, &context).unwrap(); // balances checks before - assert_eq!(Assets::balance(usdt_id_multilocation, ALICE), usdt_initial_local_amount); + assert_eq!( + AssetsPallet::balance(usdt_id_location.clone(), ALICE), + usdt_initial_local_amount + ); assert_eq!(Balances::free_balance(ALICE), INITIAL_BALANCE); // do the transfer let result = tested_call( RuntimeOrigin::signed(ALICE), - Box::new(dest.into()), - Box::new(beneficiary.into()), + Box::new(dest.clone().into()), + Box::new(beneficiary.clone().into()), Box::new(assets.into()), fee_index as u32, Unlimited, @@ -2159,24 +2325,29 @@ fn teleport_asset_using_local_fee_reserve_call( let mut last_events = last_events(3).into_iter(); assert_eq!( last_events.next().unwrap(), - RuntimeEvent::XcmPallet(crate::Event::Attempted { outcome: Outcome::Complete(weight) }) + RuntimeEvent::XcmPallet(crate::Event::Attempted { + outcome: Outcome::Complete { used: weight } + }) ); // Alice spent (transferred) amount assert_eq!( - Assets::balance(usdt_id_multilocation, ALICE), + AssetsPallet::balance(usdt_id_location.clone(), ALICE), usdt_initial_local_amount - SEND_AMOUNT ); // Alice used native asset for fees assert_eq!(Balances::free_balance(ALICE), INITIAL_BALANCE - FEE_AMOUNT); // Destination account (parachain account) added native reserve to balances assert_eq!(Balances::free_balance(usdt_chain_sovereign_account.clone()), FEE_AMOUNT); - assert_eq!(Assets::balance(usdt_id_multilocation, usdt_chain_sovereign_account), 0); + assert_eq!( + AssetsPallet::balance(usdt_id_location.clone(), usdt_chain_sovereign_account), + 0 + ); // Verify total and active issuance of foreign BLA have decreased (burned on // reserve-withdraw) let expected_issuance = usdt_initial_local_amount - SEND_AMOUNT; - assert_eq!(Assets::total_issuance(usdt_id_multilocation), expected_issuance); - assert_eq!(Assets::active_issuance(usdt_id_multilocation), expected_issuance); + assert_eq!(AssetsPallet::total_issuance(usdt_id_location.clone()), expected_issuance); + assert_eq!(AssetsPallet::active_issuance(usdt_id_location), expected_issuance); // Verify sent XCM program assert_eq!( @@ -2198,7 +2369,7 @@ fn teleport_asset_using_local_fee_reserve_call( last_events.next().unwrap(), RuntimeEvent::XcmPallet(crate::Event::FeesPaid { paying: origin_location, - fees: MultiAssets::new(), + fees: Assets::new(), }) ); assert!(matches!( @@ -2255,20 +2426,20 @@ fn teleported_asset_using_destination_reserve_fee_call( ) where Call: FnOnce( OriginFor, - Box, - Box, - Box, + Box, + Box, + Box, u32, WeightLimit, ) -> DispatchResult, { let balances = vec![(ALICE, INITIAL_BALANCE)]; - let origin_location: MultiLocation = AccountId32 { network: None, id: ALICE.into() }.into(); - let beneficiary: MultiLocation = AccountId32 { network: None, id: ALICE.into() }.into(); + let origin_location: Location = AccountId32 { network: None, id: ALICE.into() }.into(); + let beneficiary: Location = AccountId32 { network: None, id: ALICE.into() }.into(); new_test_ext_with_balances(balances).execute_with(|| { // create sufficient foreign asset BLA to be used for fees let foreign_initial_amount = 142; - let (reserve_location, foreign_sovereign_account, foreign_asset_id_multilocation) = + let (reserve_location, foreign_sovereign_account, foreign_asset_id_location) = set_up_foreign_asset( FOREIGN_ASSET_RESERVE_PARA_ID, Some(FOREIGN_ASSET_INNER_JUNCTION), @@ -2279,34 +2450,37 @@ fn teleported_asset_using_destination_reserve_fee_call( // create non-sufficient foreign asset USDT let usdt_initial_local_amount = 42; - let (_, usdt_chain_sovereign_account, usdt_id_multilocation) = + let (_, usdt_chain_sovereign_account, usdt_id_location) = set_up_foreign_asset(USDT_PARA_ID, None, ALICE, usdt_initial_local_amount, false); // transfer destination is BLA reserve location let dest = reserve_location; let dest_sovereign_account = foreign_sovereign_account; - let (assets, fee_index, fee_asset, xfer_asset) = into_multiassets_checked( + let (assets, fee_index, fee_asset, xfer_asset) = into_assets_checked( // foreign asset BLA used for fees - destination reserve - (foreign_asset_id_multilocation, FEE_AMOUNT).into(), + (foreign_asset_id_location.clone(), FEE_AMOUNT).into(), // USDT to transfer - teleported - (usdt_id_multilocation, SEND_AMOUNT).into(), + (usdt_id_location.clone(), SEND_AMOUNT).into(), ); // reanchor according to test-case let context = UniversalLocation::get(); - let expected_fee = fee_asset.reanchored(&dest, context).unwrap(); - let expected_asset = xfer_asset.reanchored(&dest, context).unwrap(); + let expected_fee = fee_asset.reanchored(&dest, &context).unwrap(); + let expected_asset = xfer_asset.reanchored(&dest, &context).unwrap(); // balances checks before - assert_eq!(Assets::balance(usdt_id_multilocation, ALICE), usdt_initial_local_amount); + assert_eq!( + AssetsPallet::balance(usdt_id_location.clone(), ALICE), + usdt_initial_local_amount + ); assert_eq!(Balances::free_balance(ALICE), INITIAL_BALANCE); // do the transfer let result = tested_call( RuntimeOrigin::signed(ALICE), - Box::new(dest.into()), - Box::new(beneficiary.into()), + Box::new(dest.clone().into()), + Box::new(beneficiary.clone().into()), Box::new(assets.into()), fee_index as u32, Unlimited, @@ -2321,13 +2495,15 @@ fn teleported_asset_using_destination_reserve_fee_call( let mut last_events = last_events(3).into_iter(); assert_eq!( last_events.next().unwrap(), - RuntimeEvent::XcmPallet(crate::Event::Attempted { outcome: Outcome::Complete(weight) }) + RuntimeEvent::XcmPallet(crate::Event::Attempted { + outcome: Outcome::Complete { used: weight } + }) ); assert_eq!( last_events.next().unwrap(), RuntimeEvent::XcmPallet(crate::Event::FeesPaid { paying: origin_location, - fees: MultiAssets::new(), + fees: Assets::new(), }) ); assert!(matches!( @@ -2338,29 +2514,38 @@ fn teleported_asset_using_destination_reserve_fee_call( assert_eq!(Balances::free_balance(ALICE), INITIAL_BALANCE); // Alice spent USDT for fees assert_eq!( - Assets::balance(usdt_id_multilocation, ALICE), + AssetsPallet::balance(usdt_id_location.clone(), ALICE), usdt_initial_local_amount - SEND_AMOUNT ); // Alice transferred BLA assert_eq!( - Assets::balance(foreign_asset_id_multilocation, ALICE), + AssetsPallet::balance(foreign_asset_id_location.clone(), ALICE), foreign_initial_amount - FEE_AMOUNT ); // Verify balances of USDT reserve parachain assert_eq!(Balances::free_balance(usdt_chain_sovereign_account.clone()), 0); - assert_eq!(Assets::balance(usdt_id_multilocation, usdt_chain_sovereign_account), 0); + assert_eq!( + AssetsPallet::balance(usdt_id_location.clone(), usdt_chain_sovereign_account), + 0 + ); // Verify balances of transferred-asset reserve parachain assert_eq!(Balances::free_balance(dest_sovereign_account.clone()), 0); - assert_eq!(Assets::balance(foreign_asset_id_multilocation, dest_sovereign_account), 0); + assert_eq!( + AssetsPallet::balance(foreign_asset_id_location.clone(), dest_sovereign_account), + 0 + ); // Verify total and active issuance of USDT have decreased (teleported) let expected_usdt_issuance = usdt_initial_local_amount - SEND_AMOUNT; - assert_eq!(Assets::total_issuance(usdt_id_multilocation), expected_usdt_issuance); - assert_eq!(Assets::active_issuance(usdt_id_multilocation), expected_usdt_issuance); + assert_eq!(AssetsPallet::total_issuance(usdt_id_location.clone()), expected_usdt_issuance); + assert_eq!(AssetsPallet::active_issuance(usdt_id_location), expected_usdt_issuance); // Verify total and active issuance of foreign BLA asset have decreased (burned on // reserve-withdraw) let expected_bla_issuance = foreign_initial_amount - FEE_AMOUNT; - assert_eq!(Assets::total_issuance(foreign_asset_id_multilocation), expected_bla_issuance); - assert_eq!(Assets::active_issuance(foreign_asset_id_multilocation), expected_bla_issuance); + assert_eq!( + AssetsPallet::total_issuance(foreign_asset_id_location.clone()), + expected_bla_issuance + ); + assert_eq!(AssetsPallet::active_issuance(foreign_asset_id_location), expected_bla_issuance); // Verify sent XCM program assert_eq!( diff --git a/polkadot/xcm/pallet-xcm/src/tests/mod.rs b/polkadot/xcm/pallet-xcm/src/tests/mod.rs index e7a6fdc9dce..5f9c86ed7b3 100644 --- a/polkadot/xcm/pallet-xcm/src/tests/mod.rs +++ b/polkadot/xcm/pallet-xcm/src/tests/mod.rs @@ -19,9 +19,8 @@ pub(crate) mod assets_transfer; use crate::{ - mock::*, AssetTraps, CurrentMigration, Error, LatestVersionedMultiLocation, Queries, - QueryStatus, VersionDiscoveryQueue, VersionMigrationStage, VersionNotifiers, - VersionNotifyTargets, + mock::*, AssetTraps, CurrentMigration, Error, LatestVersionedLocation, Queries, QueryStatus, + VersionDiscoveryQueue, VersionMigrationStage, VersionNotifiers, VersionNotifyTargets, }; use frame_support::{ assert_noop, assert_ok, @@ -49,9 +48,11 @@ fn report_outcome_notify_works() { (ALICE, INITIAL_BALANCE), (ParaId::from(OTHER_PARA_ID).into_account_truncating(), INITIAL_BALANCE), ]; - let sender: MultiLocation = AccountId32 { network: None, id: ALICE.into() }.into(); - let mut message = - Xcm(vec![TransferAsset { assets: (Here, SEND_AMOUNT).into(), beneficiary: sender }]); + let sender: Location = AccountId32 { network: None, id: ALICE.into() }.into(); + let mut message = Xcm(vec![TransferAsset { + assets: (Here, SEND_AMOUNT).into(), + beneficiary: sender.clone(), + }]); let call = pallet_test_notifier::Call::notification_received { query_id: 0, response: Default::default(), @@ -76,12 +77,12 @@ fn report_outcome_notify_works() { TransferAsset { assets: (Here, SEND_AMOUNT).into(), beneficiary: sender }, ]) ); - let querier: MultiLocation = Here.into(); + let querier: Location = Here.into(); let status = QueryStatus::Pending { - responder: MultiLocation::from(Parachain(OTHER_PARA_ID)).into(), + responder: Location::from(Parachain(OTHER_PARA_ID)).into(), maybe_notify: Some((5, 2)), timeout: 100, - maybe_match_querier: Some(querier.into()), + maybe_match_querier: Some(querier.clone().into()), }; assert_eq!(crate::Queries::::iter().collect::>(), vec![(0, status)]); @@ -91,14 +92,15 @@ fn report_outcome_notify_works() { max_weight: Weight::from_parts(1_000_000, 1_000_000), querier: Some(querier), }]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( Parachain(OTHER_PARA_ID), message, - hash, + &mut hash, Weight::from_parts(1_000_000_000, 1_000_000_000), + Weight::zero(), ); - assert_eq!(r, Outcome::Complete(Weight::from_parts(1_000, 1_000))); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(1_000, 1_000) }); assert_eq!( last_events(2), vec![ @@ -124,9 +126,11 @@ fn report_outcome_works() { (ALICE, INITIAL_BALANCE), (ParaId::from(OTHER_PARA_ID).into_account_truncating(), INITIAL_BALANCE), ]; - let sender: MultiLocation = AccountId32 { network: None, id: ALICE.into() }.into(); - let mut message = - Xcm(vec![TransferAsset { assets: (Here, SEND_AMOUNT).into(), beneficiary: sender }]); + let sender: Location = AccountId32 { network: None, id: ALICE.into() }.into(); + let mut message = Xcm(vec![TransferAsset { + assets: (Here, SEND_AMOUNT).into(), + beneficiary: sender.clone(), + }]); new_test_ext_with_balances(balances).execute_with(|| { XcmPallet::report_outcome(&mut message, Parachain(OTHER_PARA_ID).into_location(), 100) .unwrap(); @@ -141,12 +145,12 @@ fn report_outcome_works() { TransferAsset { assets: (Here, SEND_AMOUNT).into(), beneficiary: sender }, ]) ); - let querier: MultiLocation = Here.into(); + let querier: Location = Here.into(); let status = QueryStatus::Pending { - responder: MultiLocation::from(Parachain(OTHER_PARA_ID)).into(), + responder: Location::from(Parachain(OTHER_PARA_ID)).into(), maybe_notify: None, timeout: 100, - maybe_match_querier: Some(querier.into()), + maybe_match_querier: Some(querier.clone().into()), }; assert_eq!(crate::Queries::::iter().collect::>(), vec![(0, status)]); @@ -156,14 +160,15 @@ fn report_outcome_works() { max_weight: Weight::zero(), querier: Some(querier), }]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( Parachain(OTHER_PARA_ID), message, - hash, + &mut hash, Weight::from_parts(1_000_000_000, 1_000_000_000), + Weight::zero(), ); - assert_eq!(r, Outcome::Complete(Weight::from_parts(1_000, 1_000))); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(1_000, 1_000) }); assert_eq!( last_event(), RuntimeEvent::XcmPallet(crate::Event::ResponseReady { @@ -185,16 +190,15 @@ fn custom_querier_works() { (ParaId::from(OTHER_PARA_ID).into_account_truncating(), INITIAL_BALANCE), ]; new_test_ext_with_balances(balances).execute_with(|| { - let querier: MultiLocation = - (Parent, AccountId32 { network: None, id: ALICE.into() }).into(); + let querier: Location = (Parent, AccountId32 { network: None, id: ALICE.into() }).into(); - let r = TestNotifier::prepare_new_query(RuntimeOrigin::signed(ALICE), querier); + let r = TestNotifier::prepare_new_query(RuntimeOrigin::signed(ALICE), querier.clone()); assert_eq!(r, Ok(())); let status = QueryStatus::Pending { - responder: MultiLocation::from(AccountId32 { network: None, id: ALICE.into() }).into(), + responder: Location::from(AccountId32 { network: None, id: ALICE.into() }).into(), maybe_notify: None, timeout: 100, - maybe_match_querier: Some(querier.into()), + maybe_match_querier: Some(querier.clone().into()), }; assert_eq!(crate::Queries::::iter().collect::>(), vec![(0, status)]); @@ -205,21 +209,21 @@ fn custom_querier_works() { max_weight: Weight::zero(), querier: None, }]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm_in_credit( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( AccountId32 { network: None, id: ALICE.into() }, message, - hash, + &mut hash, Weight::from_parts(1_000_000_000, 1_000_000_000), Weight::from_parts(1_000, 1_000), ); - assert_eq!(r, Outcome::Complete(Weight::from_parts(1_000, 1_000))); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(1_000, 1_000) }); assert_eq!( last_event(), RuntimeEvent::XcmPallet(crate::Event::InvalidQuerier { origin: AccountId32 { network: None, id: ALICE.into() }.into(), query_id: 0, - expected_querier: querier, + expected_querier: querier.clone(), maybe_actual_querier: None, }), ); @@ -229,24 +233,24 @@ fn custom_querier_works() { query_id: 0, response: Response::ExecutionResult(None), max_weight: Weight::zero(), - querier: Some(MultiLocation::here()), + querier: Some(Location::here()), }]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm_in_credit( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( AccountId32 { network: None, id: ALICE.into() }, message, - hash, + &mut hash, Weight::from_parts(1_000_000_000, 1_000_000_000), Weight::from_parts(1_000, 1_000), ); - assert_eq!(r, Outcome::Complete(Weight::from_parts(1_000, 1_000))); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(1_000, 1_000) }); assert_eq!( last_event(), RuntimeEvent::XcmPallet(crate::Event::InvalidQuerier { origin: AccountId32 { network: None, id: ALICE.into() }.into(), query_id: 0, - expected_querier: querier, - maybe_actual_querier: Some(MultiLocation::here()), + expected_querier: querier.clone(), + maybe_actual_querier: Some(Location::here()), }), ); @@ -257,14 +261,15 @@ fn custom_querier_works() { max_weight: Weight::zero(), querier: Some(querier), }]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( AccountId32 { network: None, id: ALICE.into() }, message, - hash, + &mut hash, Weight::from_parts(1_000_000_000, 1_000_000_000), + Weight::zero(), ); - assert_eq!(r, Outcome::Complete(Weight::from_parts(1_000, 1_000))); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(1_000, 1_000) }); assert_eq!( last_event(), RuntimeEvent::XcmPallet(crate::Event::ResponseReady { @@ -289,12 +294,12 @@ fn send_works() { (ParaId::from(OTHER_PARA_ID).into_account_truncating(), INITIAL_BALANCE), ]; new_test_ext_with_balances(balances).execute_with(|| { - let sender: MultiLocation = AccountId32 { network: None, id: ALICE.into() }.into(); + let sender: Location = AccountId32 { network: None, id: ALICE.into() }.into(); let message = Xcm(vec![ ReserveAssetDeposited((Parent, SEND_AMOUNT).into()), ClearOrigin, buy_execution((Parent, SEND_AMOUNT)), - DepositAsset { assets: AllCounted(1).into(), beneficiary: sender }, + DepositAsset { assets: AllCounted(1).into(), beneficiary: sender.clone() }, ]); let versioned_dest = Box::new(RelayLocation::get().into()); @@ -304,7 +309,7 @@ fn send_works() { versioned_dest, versioned_message )); - let sent_message = Xcm(Some(DescendOrigin(sender.try_into().unwrap())) + let sent_message = Xcm(Some(DescendOrigin(sender.clone().try_into().unwrap())) .into_iter() .chain(message.0.clone().into_iter()) .collect()); @@ -333,8 +338,7 @@ fn send_fails_when_xcm_router_blocks() { (ParaId::from(OTHER_PARA_ID).into_account_truncating(), INITIAL_BALANCE), ]; new_test_ext_with_balances(balances).execute_with(|| { - let sender: MultiLocation = - Junction::AccountId32 { network: None, id: ALICE.into() }.into(); + let sender: Location = Junction::AccountId32 { network: None, id: ALICE.into() }.into(); let message = Xcm(vec![ ReserveAssetDeposited((Parent, SEND_AMOUNT).into()), buy_execution((Parent, SEND_AMOUNT)), @@ -343,7 +347,7 @@ fn send_fails_when_xcm_router_blocks() { assert_noop!( XcmPallet::send( RuntimeOrigin::signed(ALICE), - Box::new(MultiLocation::ancestor(8).into()), + Box::new(Location::ancestor(8).into()), Box::new(VersionedXcm::from(message.clone())), ), crate::Error::::SendFailure @@ -363,7 +367,7 @@ fn execute_withdraw_to_deposit_works() { ]; new_test_ext_with_balances(balances).execute_with(|| { let weight = BaseXcmWeight::get() * 3; - let dest: MultiLocation = Junction::AccountId32 { network: None, id: BOB.into() }.into(); + let dest: Location = Junction::AccountId32 { network: None, id: BOB.into() }.into(); assert_eq!(Balances::total_balance(&ALICE), INITIAL_BALANCE); assert_ok!(XcmPallet::execute( RuntimeOrigin::signed(ALICE), @@ -378,7 +382,9 @@ fn execute_withdraw_to_deposit_works() { assert_eq!(Balances::total_balance(&BOB), SEND_AMOUNT); assert_eq!( last_event(), - RuntimeEvent::XcmPallet(crate::Event::Attempted { outcome: Outcome::Complete(weight) }) + RuntimeEvent::XcmPallet(crate::Event::Attempted { + outcome: Outcome::Complete { used: weight } + }) ); }); } @@ -389,7 +395,7 @@ fn trapped_assets_can_be_claimed() { let balances = vec![(ALICE, INITIAL_BALANCE), (BOB, INITIAL_BALANCE)]; new_test_ext_with_balances(balances).execute_with(|| { let weight = BaseXcmWeight::get() * 6; - let dest: MultiLocation = Junction::AccountId32 { network: None, id: BOB.into() }.into(); + let dest: Location = Junction::AccountId32 { network: None, id: BOB.into() }.into(); assert_ok!(XcmPallet::execute( RuntimeOrigin::signed(ALICE), @@ -401,15 +407,14 @@ fn trapped_assets_can_be_claimed() { // This will make an error. Trap(0), // This would succeed, but we never get to it. - DepositAsset { assets: AllCounted(1).into(), beneficiary: dest }, + DepositAsset { assets: AllCounted(1).into(), beneficiary: dest.clone() }, ]))), weight )); - let source: MultiLocation = - Junction::AccountId32 { network: None, id: ALICE.into() }.into(); + let source: Location = Junction::AccountId32 { network: None, id: ALICE.into() }.into(); let trapped = AssetTraps::::iter().collect::>(); - let vma = VersionedMultiAssets::from(MultiAssets::from((Here, SEND_AMOUNT))); - let hash = BlakeTwo256::hash_of(&(source, vma.clone())); + let vma = VersionedAssets::from(Assets::from((Here, SEND_AMOUNT))); + let hash = BlakeTwo256::hash_of(&(source.clone(), vma.clone())); assert_eq!( last_events(2), vec![ @@ -419,7 +424,7 @@ fn trapped_assets_can_be_claimed() { assets: vma }), RuntimeEvent::XcmPallet(crate::Event::Attempted { - outcome: Outcome::Complete(BaseXcmWeight::get() * 5) + outcome: Outcome::Complete { used: BaseXcmWeight::get() * 5 } }), ] ); @@ -435,7 +440,7 @@ fn trapped_assets_can_be_claimed() { Box::new(VersionedXcm::from(Xcm(vec![ ClaimAsset { assets: (Here, SEND_AMOUNT).into(), ticket: Here.into() }, buy_execution((Here, SEND_AMOUNT)), - DepositAsset { assets: AllCounted(1).into(), beneficiary: dest }, + DepositAsset { assets: AllCounted(1).into(), beneficiary: dest.clone() }, ]))), weight )); @@ -454,7 +459,8 @@ fn trapped_assets_can_be_claimed() { ]))), weight )); - let outcome = Outcome::Incomplete(BaseXcmWeight::get(), XcmError::UnknownClaim); + let outcome = + Outcome::Incomplete { used: BaseXcmWeight::get(), error: XcmError::UnknownClaim }; assert_eq!(last_event(), RuntimeEvent::XcmPallet(crate::Event::Attempted { outcome })); }); } @@ -468,10 +474,10 @@ fn incomplete_execute_reverts_side_effects() { let balances = vec![(ALICE, INITIAL_BALANCE), (BOB, INITIAL_BALANCE)]; new_test_ext_with_balances(balances).execute_with(|| { let weight = BaseXcmWeight::get() * 4; - let dest: MultiLocation = Junction::AccountId32 { network: None, id: BOB.into() }.into(); + let dest: Location = Junction::AccountId32 { network: None, id: BOB.into() }.into(); assert_eq!(Balances::total_balance(&ALICE), INITIAL_BALANCE); let amount_to_send = INITIAL_BALANCE - ExistentialDeposit::get(); - let assets: MultiAssets = (Here, amount_to_send).into(); + let assets: Assets = (Here, amount_to_send).into(); let result = XcmPallet::execute( RuntimeOrigin::signed(ALICE), Box::new(VersionedXcm::from(Xcm(vec![ @@ -506,35 +512,38 @@ fn incomplete_execute_reverts_side_effects() { } #[test] -fn fake_latest_versioned_multilocation_works() { +fn fake_latest_versioned_location_works() { use codec::Encode; - let remote: MultiLocation = Parachain(1000).into(); - let versioned_remote = LatestVersionedMultiLocation(&remote); + let remote: Location = Parachain(1000).into(); + let versioned_remote = LatestVersionedLocation(&remote); assert_eq!(versioned_remote.encode(), remote.into_versioned().encode()); } #[test] fn basic_subscription_works() { new_test_ext_with_balances(vec![]).execute_with(|| { - let remote: MultiLocation = Parachain(1000).into(); + let remote: Location = Parachain(1000).into(); assert_ok!(XcmPallet::force_subscribe_version_notify( RuntimeOrigin::root(), - Box::new(remote.into()), + Box::new(remote.clone().into()), )); assert_eq!( Queries::::iter().collect::>(), - vec![(0, QueryStatus::VersionNotifier { origin: remote.into(), is_active: false })] + vec![( + 0, + QueryStatus::VersionNotifier { origin: remote.clone().into(), is_active: false } + )] ); assert_eq!( VersionNotifiers::::iter().collect::>(), - vec![(XCM_VERSION, remote.into(), 0)] + vec![(XCM_VERSION, remote.clone().into(), 0)] ); assert_eq!( take_sent_xcm(), vec![( - remote, + remote.clone(), Xcm(vec![SubscribeVersion { query_id: 0, max_response_weight: Weight::zero() }]), ),] ); @@ -561,16 +570,16 @@ fn basic_subscription_works() { #[test] fn subscriptions_increment_id() { new_test_ext_with_balances(vec![]).execute_with(|| { - let remote: MultiLocation = Parachain(1000).into(); + let remote: Location = Parachain(1000).into(); assert_ok!(XcmPallet::force_subscribe_version_notify( RuntimeOrigin::root(), - Box::new(remote.into()), + Box::new(remote.clone().into()), )); - let remote2: MultiLocation = Parachain(1001).into(); + let remote2: Location = Parachain(1001).into(); assert_ok!(XcmPallet::force_subscribe_version_notify( RuntimeOrigin::root(), - Box::new(remote2.into()), + Box::new(remote2.clone().into()), )); assert_eq!( @@ -598,10 +607,10 @@ fn subscriptions_increment_id() { #[test] fn double_subscription_fails() { new_test_ext_with_balances(vec![]).execute_with(|| { - let remote: MultiLocation = Parachain(1000).into(); + let remote: Location = Parachain(1000).into(); assert_ok!(XcmPallet::force_subscribe_version_notify( RuntimeOrigin::root(), - Box::new(remote.into()), + Box::new(remote.clone().into()), )); assert_noop!( XcmPallet::force_subscribe_version_notify( @@ -616,19 +625,19 @@ fn double_subscription_fails() { #[test] fn unsubscribe_works() { new_test_ext_with_balances(vec![]).execute_with(|| { - let remote: MultiLocation = Parachain(1000).into(); + let remote: Location = Parachain(1000).into(); assert_ok!(XcmPallet::force_subscribe_version_notify( RuntimeOrigin::root(), - Box::new(remote.into()), + Box::new(remote.clone().into()), )); assert_ok!(XcmPallet::force_unsubscribe_version_notify( RuntimeOrigin::root(), - Box::new(remote.into()) + Box::new(remote.clone().into()) )); assert_noop!( XcmPallet::force_unsubscribe_version_notify( RuntimeOrigin::root(), - Box::new(remote.into()) + Box::new(remote.clone().into()) ), Error::::NoSubscription, ); @@ -637,13 +646,13 @@ fn unsubscribe_works() { take_sent_xcm(), vec![ ( - remote, + remote.clone(), Xcm(vec![SubscribeVersion { query_id: 0, max_response_weight: Weight::zero() }]), ), - (remote, Xcm(vec![UnsubscribeVersion]),), + (remote.clone(), Xcm(vec![UnsubscribeVersion]),), ] ); }); @@ -655,13 +664,19 @@ fn subscription_side_works() { new_test_ext_with_balances(vec![]).execute_with(|| { AdvertisedXcmVersion::set(1); - let remote: MultiLocation = Parachain(1000).into(); + let remote: Location = Parachain(1000).into(); let weight = BaseXcmWeight::get(); let message = Xcm(vec![SubscribeVersion { query_id: 0, max_response_weight: Weight::zero() }]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm(remote, message, hash, weight); - assert_eq!(r, Outcome::Complete(weight)); + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( + remote.clone(), + message, + &mut hash, + weight, + Weight::zero(), + ); + assert_eq!(r, Outcome::Complete { used: weight }); let instr = QueryResponse { query_id: 0, @@ -669,7 +684,7 @@ fn subscription_side_works() { response: Response::Version(1), querier: None, }; - assert_eq!(take_sent_xcm(), vec![(remote, Xcm(vec![instr]))]); + assert_eq!(take_sent_xcm(), vec![(remote.clone(), Xcm(vec![instr]))]); // A runtime upgrade which doesn't alter the version sends no notifications. CurrentMigration::::put(VersionMigrationStage::default()); @@ -698,7 +713,7 @@ fn subscription_side_upgrades_work_with_notify() { AdvertisedXcmVersion::set(1); // An entry from a previous runtime with v2 XCM. - let v2_location = VersionedMultiLocation::V2(xcm::v2::Junction::Parachain(1001).into()); + let v2_location = VersionedLocation::V2(xcm::v2::Junction::Parachain(1001).into()); VersionNotifyTargets::::insert(1, v2_location, (70, Weight::zero(), 2)); let v3_location = Parachain(1003).into_versioned(); VersionNotifyTargets::::insert(3, v3_location, (72, Weight::zero(), 2)); @@ -751,7 +766,7 @@ fn subscription_side_upgrades_work_with_notify() { fn subscription_side_upgrades_work_without_notify() { new_test_ext_with_balances(vec![]).execute_with(|| { // An entry from a previous runtime with v2 XCM. - let v2_location = VersionedMultiLocation::V2(xcm::v2::Junction::Parachain(1001).into()); + let v2_location = VersionedLocation::V2(xcm::v2::Junction::Parachain(1001).into()); VersionNotifyTargets::::insert(1, v2_location, (70, Weight::zero(), 2)); let v3_location = Parachain(1003).into_versioned(); VersionNotifyTargets::::insert(3, v3_location, (72, Weight::zero(), 2)); @@ -765,8 +780,8 @@ fn subscription_side_upgrades_work_without_notify() { assert_eq!( contents, vec![ - (XCM_VERSION, Parachain(1001).into_versioned(), (70, Weight::zero(), 3)), - (XCM_VERSION, Parachain(1003).into_versioned(), (72, Weight::zero(), 3)), + (XCM_VERSION, Parachain(1001).into_versioned(), (70, Weight::zero(), 4)), + (XCM_VERSION, Parachain(1003).into_versioned(), (72, Weight::zero(), 4)), ] ); }); @@ -775,10 +790,10 @@ fn subscription_side_upgrades_work_without_notify() { #[test] fn subscriber_side_subscription_works() { new_test_ext_with_balances_and_xcm_version(vec![], Some(XCM_VERSION)).execute_with(|| { - let remote: MultiLocation = Parachain(1000).into(); + let remote: Location = Parachain(1000).into(); assert_ok!(XcmPallet::force_subscribe_version_notify( RuntimeOrigin::root(), - Box::new(remote.into()), + Box::new(remote.clone().into()), )); assert_eq!(XcmPallet::get_version_for(&remote), None); take_sent_xcm(); @@ -795,9 +810,15 @@ fn subscriber_side_subscription_works() { querier: None, }, ]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm(remote, message, hash, weight); - assert_eq!(r, Outcome::Complete(weight)); + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( + remote.clone(), + message, + &mut hash, + weight, + Weight::zero(), + ); + assert_eq!(r, Outcome::Complete { used: weight }); assert_eq!(take_sent_xcm(), vec![]); assert_eq!(XcmPallet::get_version_for(&remote), Some(1)); @@ -814,9 +835,15 @@ fn subscriber_side_subscription_works() { querier: None, }, ]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm(remote, message, hash, weight); - assert_eq!(r, Outcome::Complete(weight)); + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( + remote.clone(), + message, + &mut hash, + weight, + Weight::zero(), + ); + assert_eq!(r, Outcome::Complete { used: weight }); assert_eq!(take_sent_xcm(), vec![]); assert_eq!(XcmPallet::get_version_for(&remote), Some(2)); @@ -832,73 +859,79 @@ fn subscriber_side_subscription_works() { #[test] fn auto_subscription_works() { new_test_ext_with_balances_and_xcm_version(vec![], None).execute_with(|| { - let remote_v2: MultiLocation = Parachain(1000).into(); - let remote_v3: MultiLocation = Parachain(1001).into(); + let remote_v2: Location = Parachain(1000).into(); + let remote_v4: Location = Parachain(1001).into(); assert_ok!(XcmPallet::force_default_xcm_version(RuntimeOrigin::root(), Some(2))); // Wrapping a version for a destination we don't know elicits a subscription. let msg_v2 = xcm::v2::Xcm::<()>(vec![xcm::v2::Instruction::Trap(0)]); - let msg_v3 = xcm::v3::Xcm::<()>(vec![xcm::v3::Instruction::ClearTopic]); + let msg_v4 = xcm::v4::Xcm::<()>(vec![xcm::v4::Instruction::ClearTopic]); assert_eq!( XcmPallet::wrap_version(&remote_v2, msg_v2.clone()), Ok(VersionedXcm::from(msg_v2.clone())), ); - assert_eq!(XcmPallet::wrap_version(&remote_v2, msg_v3.clone()), Err(())); + assert_eq!(XcmPallet::wrap_version(&remote_v2, msg_v4.clone()), Err(())); - let expected = vec![(remote_v2.into(), 2)]; + let expected = vec![(remote_v2.clone().into(), 2)]; assert_eq!(VersionDiscoveryQueue::::get().into_inner(), expected); assert_eq!( - XcmPallet::wrap_version(&remote_v3, msg_v2.clone()), + XcmPallet::wrap_version(&remote_v4, msg_v2.clone()), Ok(VersionedXcm::from(msg_v2.clone())), ); - assert_eq!(XcmPallet::wrap_version(&remote_v3, msg_v3.clone()), Err(())); + assert_eq!(XcmPallet::wrap_version(&remote_v4, msg_v4.clone()), Err(())); - let expected = vec![(remote_v2.into(), 2), (remote_v3.into(), 2)]; + let expected = vec![(remote_v2.clone().into(), 2), (remote_v4.clone().into(), 2)]; assert_eq!(VersionDiscoveryQueue::::get().into_inner(), expected); XcmPallet::on_initialize(1); assert_eq!( take_sent_xcm(), vec![( - remote_v3, + remote_v4.clone(), Xcm(vec![SubscribeVersion { query_id: 0, max_response_weight: Weight::zero() }]), )] ); - // Assume remote_v3 is working ok and XCM version 3. + // Assume remote_v4 is working ok and XCM version 4. let weight = BaseXcmWeight::get(); let message = Xcm(vec![ - // Remote supports XCM v3 + // Remote supports XCM v4 QueryResponse { query_id: 0, max_weight: Weight::zero(), - response: Response::Version(3), + response: Response::Version(4), querier: None, }, ]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm(remote_v3, message, hash, weight); - assert_eq!(r, Outcome::Complete(weight)); + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( + remote_v4.clone(), + message, + &mut hash, + weight, + Weight::zero(), + ); + assert_eq!(r, Outcome::Complete { used: weight }); - // V2 messages can be sent to remote_v3 under XCM v3. + // V2 messages can be sent to remote_v4 under XCM v4. assert_eq!( - XcmPallet::wrap_version(&remote_v3, msg_v2.clone()), - Ok(VersionedXcm::from(msg_v2.clone()).into_version(3).unwrap()), + XcmPallet::wrap_version(&remote_v4, msg_v2.clone()), + Ok(VersionedXcm::from(msg_v2.clone()).into_version(4).unwrap()), ); - // This message can now be sent to remote_v3 as it's v3. + // This message can now be sent to remote_v4 as it's v4. assert_eq!( - XcmPallet::wrap_version(&remote_v3, msg_v3.clone()), - Ok(VersionedXcm::from(msg_v3.clone())) + XcmPallet::wrap_version(&remote_v4, msg_v4.clone()), + Ok(VersionedXcm::from(msg_v4.clone())) ); XcmPallet::on_initialize(2); assert_eq!( take_sent_xcm(), vec![( - remote_v2, + remote_v2.clone(), Xcm(vec![SubscribeVersion { query_id: 1, max_response_weight: Weight::zero() }]), )] ); @@ -915,16 +948,22 @@ fn auto_subscription_works() { querier: None, }, ]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm(remote_v2, message, hash, weight); - assert_eq!(r, Outcome::Complete(weight)); + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( + remote_v2.clone(), + message, + &mut hash, + weight, + Weight::zero(), + ); + assert_eq!(r, Outcome::Complete { used: weight }); - // v3 messages cannot be sent to remote_v2... + // v4 messages cannot be sent to remote_v2... assert_eq!( XcmPallet::wrap_version(&remote_v2, msg_v2.clone()), Ok(VersionedXcm::V2(msg_v2)) ); - assert_eq!(XcmPallet::wrap_version(&remote_v2, msg_v3.clone()), Err(())); + assert_eq!(XcmPallet::wrap_version(&remote_v2, msg_v4.clone()), Err(())); }) } @@ -934,9 +973,9 @@ fn subscription_side_upgrades_work_with_multistage_notify() { AdvertisedXcmVersion::set(1); // An entry from a previous runtime with v0 XCM. - let v2_location = VersionedMultiLocation::V2(xcm::v2::Junction::Parachain(1001).into()); + let v2_location = VersionedLocation::V2(xcm::v2::Junction::Parachain(1001).into()); VersionNotifyTargets::::insert(1, v2_location, (70, Weight::zero(), 1)); - let v2_location = VersionedMultiLocation::V2(xcm::v2::Junction::Parachain(1002).into()); + let v2_location = VersionedLocation::V2(xcm::v2::Junction::Parachain(1002).into()); VersionNotifyTargets::::insert(2, v2_location, (71, Weight::zero(), 1)); let v3_location = Parachain(1003).into_versioned(); VersionNotifyTargets::::insert(3, v3_location, (72, Weight::zero(), 1)); @@ -1003,9 +1042,9 @@ fn subscription_side_upgrades_work_with_multistage_notify() { #[test] fn get_and_wrap_version_works() { new_test_ext_with_balances_and_xcm_version(vec![], None).execute_with(|| { - let remote_a: MultiLocation = Parachain(1000).into(); - let remote_b: MultiLocation = Parachain(1001).into(); - let remote_c: MultiLocation = Parachain(1002).into(); + let remote_a: Location = Parachain(1000).into(); + let remote_b: Location = Parachain(1001).into(); + let remote_c: Location = Parachain(1002).into(); // no `safe_xcm_version` version at `GenesisConfig` assert_eq!(XcmPallet::get_version_for(&remote_a), None); @@ -1023,7 +1062,7 @@ fn get_and_wrap_version_works() { // set XCM version only for `remote_a` assert_ok!(XcmPallet::force_xcm_version( RuntimeOrigin::root(), - Box::new(remote_a), + Box::new(remote_a.clone()), XCM_VERSION )); assert_eq!(XcmPallet::get_version_for(&remote_a), Some(XCM_VERSION)); @@ -1041,7 +1080,10 @@ fn get_and_wrap_version_works() { // does not work because remote_b has unknown version and default is set to 1, and // `XCM_VERSION` cannot be wrapped to the `1` assert_eq!(XcmPallet::wrap_version(&remote_b, xcm.clone()), Err(())); - assert_eq!(VersionDiscoveryQueue::::get().into_inner(), vec![(remote_b.into(), 1)]); + assert_eq!( + VersionDiscoveryQueue::::get().into_inner(), + vec![(remote_b.clone().into(), 1)] + ); // set default to the `XCM_VERSION` assert_ok!(XcmPallet::force_default_xcm_version(RuntimeOrigin::root(), Some(XCM_VERSION))); @@ -1053,10 +1095,17 @@ fn get_and_wrap_version_works() { XcmPallet::wrap_version(&remote_b, xcm.clone()), Ok(VersionedXcm::from(xcm.clone())) ); - assert_eq!(VersionDiscoveryQueue::::get().into_inner(), vec![(remote_b.into(), 2)]); + assert_eq!( + VersionDiscoveryQueue::::get().into_inner(), + vec![(remote_b.clone().into(), 2)] + ); // change remote_c to `1` - assert_ok!(XcmPallet::force_xcm_version(RuntimeOrigin::root(), Box::new(remote_c), 1)); + assert_ok!(XcmPallet::force_xcm_version( + RuntimeOrigin::root(), + Box::new(remote_c.clone()), + 1 + )); // does not work because remote_c has `1` and default is `XCM_VERSION` which cannot be // wrapped to the `1` diff --git a/polkadot/xcm/procedural/src/lib.rs b/polkadot/xcm/procedural/src/lib.rs index 7600e817d0e..4980d84d328 100644 --- a/polkadot/xcm/procedural/src/lib.rs +++ b/polkadot/xcm/procedural/src/lib.rs @@ -22,6 +22,7 @@ use syn::{parse_macro_input, DeriveInput}; mod builder_pattern; mod v2; mod v3; +mod v4; mod weight_info; #[proc_macro] @@ -31,6 +32,13 @@ pub fn impl_conversion_functions_for_multilocation_v2(input: TokenStream) -> Tok .into() } +#[proc_macro] +pub fn impl_conversion_functions_for_junctions_v2(input: TokenStream) -> TokenStream { + v2::junctions::generate_conversion_functions(input) + .unwrap_or_else(syn::Error::into_compile_error) + .into() +} + #[proc_macro_derive(XcmWeightInfoTrait)] pub fn derive_xcm_weight_info(item: TokenStream) -> TokenStream { weight_info::derive(item) @@ -50,6 +58,20 @@ pub fn impl_conversion_functions_for_junctions_v3(input: TokenStream) -> TokenSt .into() } +#[proc_macro] +pub fn impl_conversion_functions_for_location_v4(input: TokenStream) -> TokenStream { + v4::location::generate_conversion_functions(input) + .unwrap_or_else(syn::Error::into_compile_error) + .into() +} + +#[proc_macro] +pub fn impl_conversion_functions_for_junctions_v4(input: TokenStream) -> TokenStream { + v4::junctions::generate_conversion_functions(input) + .unwrap_or_else(syn::Error::into_compile_error) + .into() +} + /// This is called on the `Instruction` enum, not on the `Xcm` struct, /// and allows for the following syntax for building XCMs: /// let message = Xcm::builder() diff --git a/polkadot/xcm/procedural/src/v2.rs b/polkadot/xcm/procedural/src/v2.rs index dc2694a666f..1a2f281a498 100644 --- a/polkadot/xcm/procedural/src/v2.rs +++ b/polkadot/xcm/procedural/src/v2.rs @@ -14,10 +14,12 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . +use proc_macro2::{Span, TokenStream}; +use quote::{format_ident, quote}; +use syn::{Result, Token}; + pub mod multilocation { - use proc_macro2::{Span, TokenStream}; - use quote::{format_ident, quote}; - use syn::{Result, Token}; + use super::*; pub fn generate_conversion_functions(input: proc_macro::TokenStream) -> Result { if !input.is_empty() { @@ -181,3 +183,44 @@ pub mod multilocation { } } } + +pub mod junctions { + use super::*; + + pub fn generate_conversion_functions(input: proc_macro::TokenStream) -> Result { + if !input.is_empty() { + return Err(syn::Error::new(Span::call_site(), "No arguments expected")); + } + + let from_slice_syntax = generate_conversion_from_slice_syntax(); + + Ok(quote! { + #from_slice_syntax + }) + } + + fn generate_conversion_from_slice_syntax() -> TokenStream { + quote! { + macro_rules! impl_junction { + ($count:expr, $variant:ident, ($($index:literal),+)) => { + /// Additional helper for building junctions + /// Useful for converting to future XCM versions + impl From<[Junction; $count]> for Junctions { + fn from(junctions: [Junction; $count]) -> Self { + Self::$variant($(junctions[$index].clone()),*) + } + } + }; + } + + impl_junction!(1, X1, (0)); + impl_junction!(2, X2, (0, 1)); + impl_junction!(3, X3, (0, 1, 2)); + impl_junction!(4, X4, (0, 1, 2, 3)); + impl_junction!(5, X5, (0, 1, 2, 3, 4)); + impl_junction!(6, X6, (0, 1, 2, 3, 4, 5)); + impl_junction!(7, X7, (0, 1, 2, 3, 4, 5, 6)); + impl_junction!(8, X8, (0, 1, 2, 3, 4, 5, 6, 7)); + } + } +} diff --git a/polkadot/xcm/procedural/src/v3.rs b/polkadot/xcm/procedural/src/v3.rs index 246f90a46a3..f0556d5a8d4 100644 --- a/polkadot/xcm/procedural/src/v3.rs +++ b/polkadot/xcm/procedural/src/v3.rs @@ -45,9 +45,8 @@ pub mod multilocation { let interior = if num_junctions == 0 { quote!(Junctions::Here) } else { - let variant = format_ident!("X{}", num_junctions); quote! { - Junctions::#variant( #(#idents .into()),* ) + [#(#idents .into()),*].into() } }; @@ -110,7 +109,7 @@ pub mod multilocation { impl From for MultiLocation { fn from(x: Junction) -> Self { - MultiLocation { parents: 0, interior: Junctions::X1(x) } + MultiLocation { parents: 0, interior: [x].into() } } } @@ -129,10 +128,12 @@ pub mod junctions { // Support up to 8 Parents in a tuple, assuming that most use cases don't go past 8 parents. let from_v2 = generate_conversion_from_v2(MAX_JUNCTIONS); + let from_v4 = generate_conversion_from_v4(); let from_tuples = generate_conversion_from_tuples(MAX_JUNCTIONS); Ok(quote! { #from_v2 + #from_v4 #from_tuples }) } @@ -143,12 +144,11 @@ pub mod junctions { let idents = (0..num_junctions).map(|i| format_ident!("j{}", i)).collect::>(); let types = (0..num_junctions).map(|i| format_ident!("J{}", i)).collect::>(); - let variant = &format_ident!("X{}", num_junctions); quote! { impl<#(#types : Into,)*> From<( #(#types,)* )> for Junctions { fn from( ( #(#idents,)* ): ( #(#types,)* ) ) -> Self { - Self::#variant( #(#idents .into()),* ) + [#(#idents .into()),*].into() } } } @@ -156,6 +156,45 @@ pub mod junctions { .collect() } + fn generate_conversion_from_v4() -> TokenStream { + let match_variants = (0..8u8) + .map(|current_number| { + let number_ancestors = current_number + 1; + let variant = format_ident!("X{}", number_ancestors); + let idents = + (0..=current_number).map(|i| format_ident!("j{}", i)).collect::>(); + let convert = idents + .iter() + .map(|ident| { + quote! { let #ident = core::convert::TryInto::try_into(#ident.clone())?; } + }) + .collect::>(); + + quote! { + crate::v4::Junctions::#variant( junctions ) => { + let [#(#idents),*] = &*junctions; + #(#convert);* + [#(#idents),*].into() + }, + } + }) + .collect::(); + + quote! { + impl core::convert::TryFrom for Junctions { + type Error = (); + + fn try_from(mut new: crate::v4::Junctions) -> core::result::Result { + use Junctions::*; + Ok(match new { + crate::v4::Junctions::Here => Here, + #match_variants + }) + } + } + } + } + fn generate_conversion_from_v2(max_junctions: usize) -> TokenStream { let match_variants = (0..max_junctions) .map(|cur_num| { diff --git a/polkadot/xcm/procedural/src/v4.rs b/polkadot/xcm/procedural/src/v4.rs new file mode 100644 index 00000000000..5f5e10d3081 --- /dev/null +++ b/polkadot/xcm/procedural/src/v4.rs @@ -0,0 +1,196 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +use proc_macro2::{Span, TokenStream}; +use quote::{format_ident, quote}; +use syn::{Result, Token}; + +const MAX_JUNCTIONS: usize = 8; + +pub mod location { + use super::*; + + /// Generates conversion functions from other types to the `Location` type: + /// - [PalletInstance(50), GeneralIndex(1984)].into() + /// - (Parent, Parachain(1000), AccountId32 { .. }).into() + pub fn generate_conversion_functions(input: proc_macro::TokenStream) -> Result { + if !input.is_empty() { + return Err(syn::Error::new(Span::call_site(), "No arguments expected")) + } + + let from_tuples = generate_conversion_from_tuples(8, 8); + + Ok(quote! { + #from_tuples + }) + } + + fn generate_conversion_from_tuples(max_junctions: usize, max_parents: usize) -> TokenStream { + let mut from_tuples = (0..=max_junctions) + .map(|num_junctions| { + let types = (0..num_junctions).map(|i| format_ident!("J{}", i)).collect::>(); + let idents = + (0..num_junctions).map(|i| format_ident!("j{}", i)).collect::>(); + let array_size = num_junctions; + let interior = if num_junctions == 0 { + quote!(Junctions::Here) + } else { + let variant = format_ident!("X{}", num_junctions); + quote! { + Junctions::#variant( alloc::sync::Arc::new( [#(#idents .into()),*] ) ) + } + }; + + let mut from_tuple = quote! { + impl< #(#types : Into,)* > From<( Ancestor, #( #types ),* )> for Location { + fn from( ( Ancestor(parents), #(#idents),* ): ( Ancestor, #( #types ),* ) ) -> Self { + Location { parents, interior: #interior } + } + } + + impl From<[Junction; #array_size]> for Location { + fn from(j: [Junction; #array_size]) -> Self { + let [#(#idents),*] = j; + Location { parents: 0, interior: #interior } + } + } + }; + + let from_parent_tuples = (0..=max_parents).map(|cur_parents| { + let parents = + (0..cur_parents).map(|_| format_ident!("Parent")).collect::>(); + let underscores = + (0..cur_parents).map(|_| Token![_](Span::call_site())).collect::>(); + + quote! { + impl< #(#types : Into,)* > From<( #( #parents , )* #( #types , )* )> for Location { + fn from( ( #(#underscores,)* #(#idents,)* ): ( #(#parents,)* #(#types,)* ) ) -> Self { + Self { parents: #cur_parents as u8, interior: #interior } + } + } + } + }); + + from_tuple.extend(from_parent_tuples); + from_tuple + }) + .collect::(); + + let from_parent_junctions_tuples = (0..=max_parents).map(|cur_parents| { + let parents = (0..cur_parents).map(|_| format_ident!("Parent")).collect::>(); + let underscores = + (0..cur_parents).map(|_| Token![_](Span::call_site())).collect::>(); + + quote! { + impl From<( #(#parents,)* Junctions )> for Location { + fn from( (#(#underscores,)* junctions): ( #(#parents,)* Junctions ) ) -> Self { + Location { parents: #cur_parents as u8, interior: junctions } + } + } + } + }); + from_tuples.extend(from_parent_junctions_tuples); + + quote! { + impl From<(Ancestor, Junctions)> for Location { + fn from((Ancestor(parents), interior): (Ancestor, Junctions)) -> Self { + Location { parents, interior } + } + } + + impl From for Location { + fn from(x: Junction) -> Self { + Location { parents: 0, interior: [x].into() } + } + } + + #from_tuples + } + } +} + +pub mod junctions { + use super::*; + + pub fn generate_conversion_functions(input: proc_macro::TokenStream) -> Result { + if !input.is_empty() { + return Err(syn::Error::new(Span::call_site(), "No arguments expected")) + } + + // Support up to 8 Parents in a tuple, assuming that most use cases don't go past 8 parents. + let from_v3 = generate_conversion_from_v3(MAX_JUNCTIONS); + let from_tuples = generate_conversion_from_tuples(MAX_JUNCTIONS); + + Ok(quote! { + #from_v3 + #from_tuples + }) + } + + fn generate_conversion_from_tuples(max_junctions: usize) -> TokenStream { + (1..=max_junctions) + .map(|num_junctions| { + let idents = + (0..num_junctions).map(|i| format_ident!("j{}", i)).collect::>(); + let types = (0..num_junctions).map(|i| format_ident!("J{}", i)).collect::>(); + + quote! { + impl<#(#types : Into,)*> From<( #(#types,)* )> for Junctions { + fn from( ( #(#idents,)* ): ( #(#types,)* ) ) -> Self { + [#(#idents .into()),*].into() + } + } + } + }) + .collect() + } + + fn generate_conversion_from_v3(max_junctions: usize) -> TokenStream { + let match_variants = (0..max_junctions) + .map(|cur_num| { + let num_ancestors = cur_num + 1; + let variant = format_ident!("X{}", num_ancestors); + let idents = (0..=cur_num).map(|i| format_ident!("j{}", i)).collect::>(); + let convert = idents + .iter() + .map(|ident| { + quote! { let #ident = core::convert::TryInto::try_into(#ident.clone())?; } + }) + .collect::>(); + + quote! { + crate::v3::Junctions::#variant( #(#idents),* ) => { + #(#convert);*; + let junctions: Junctions = [#(#idents),*].into(); + junctions + }, + } + }) + .collect::(); + + quote! { + impl core::convert::TryFrom for Junctions { + type Error = (); + fn try_from(mut old: crate::v3::Junctions) -> core::result::Result { + Ok(match old { + crate::v3::Junctions::Here => Junctions::Here, + #match_variants + }) + } + } + } + } +} diff --git a/polkadot/xcm/procedural/tests/builder_pattern.rs b/polkadot/xcm/procedural/tests/builder_pattern.rs index eab9d67121f..a9a30611dc0 100644 --- a/polkadot/xcm/procedural/tests/builder_pattern.rs +++ b/polkadot/xcm/procedural/tests/builder_pattern.rs @@ -21,12 +21,12 @@ use xcm::latest::prelude::*; #[test] fn builder_pattern_works() { - let asset: MultiAsset = (Here, 100u128).into(); - let beneficiary: MultiLocation = AccountId32 { id: [0u8; 32], network: None }.into(); + let asset: Asset = (Here, 100u128).into(); + let beneficiary: Location = AccountId32 { id: [0u8; 32], network: None }.into(); let message: Xcm<()> = Xcm::builder() .receive_teleported_asset(asset.clone().into()) .buy_execution(asset.clone(), Unlimited) - .deposit_asset(asset.clone().into(), beneficiary) + .deposit_asset(asset.clone().into(), beneficiary.clone()) .build(); assert_eq!( message, @@ -40,8 +40,8 @@ fn builder_pattern_works() { #[test] fn default_builder_requires_buy_execution() { - let asset: MultiAsset = (Here, 100u128).into(); - let beneficiary: MultiLocation = AccountId32 { id: [0u8; 32], network: None }.into(); + let asset: Asset = (Here, 100u128).into(); + let beneficiary: Location = AccountId32 { id: [0u8; 32], network: None }.into(); // This is invalid, since it doesn't pay for fees. // This is enforced by the runtime, because the build() method doesn't exist // on the resulting type. @@ -54,14 +54,14 @@ fn default_builder_requires_buy_execution() { let message: Xcm<()> = Xcm::builder_unpaid() .unpaid_execution(Unlimited, None) .withdraw_asset(asset.clone().into()) - .deposit_asset(asset.clone().into(), beneficiary) + .deposit_asset(asset.clone().into(), beneficiary.clone()) .build(); // This works assert_eq!( message, Xcm(vec![ UnpaidExecution { weight_limit: Unlimited, check_origin: None }, WithdrawAsset(asset.clone().into()), - DepositAsset { assets: asset.clone().into(), beneficiary }, + DepositAsset { assets: asset.clone().into(), beneficiary: beneficiary.clone() }, ]) ); @@ -69,7 +69,7 @@ fn default_builder_requires_buy_execution() { // only be used when you really know what you're doing. let message: Xcm<()> = Xcm::builder_unsafe() .withdraw_asset(asset.clone().into()) - .deposit_asset(asset.clone().into(), beneficiary) + .deposit_asset(asset.clone().into(), beneficiary.clone()) .build(); assert_eq!( message, diff --git a/polkadot/xcm/procedural/tests/conversion_functions.rs b/polkadot/xcm/procedural/tests/conversion_functions.rs new file mode 100644 index 00000000000..5b6965167fc --- /dev/null +++ b/polkadot/xcm/procedural/tests/conversion_functions.rs @@ -0,0 +1,24 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +use xcm::v2::prelude::*; + +#[test] +fn slice_syntax_in_v2_works() { + let old_junctions = Junctions::X2(Parachain(1), PalletInstance(1)); + let new_junctions = Junctions::from([Parachain(1), PalletInstance(1)]); + assert_eq!(old_junctions, new_junctions); +} diff --git a/polkadot/xcm/src/lib.rs b/polkadot/xcm/src/lib.rs index ddad0b5303b..f0cbe985331 100644 --- a/polkadot/xcm/src/lib.rs +++ b/polkadot/xcm/src/lib.rs @@ -30,13 +30,14 @@ use scale_info::TypeInfo; pub mod v2; pub mod v3; +pub mod v4; pub mod lts { - pub use super::v3::*; + pub use super::v4::*; } pub mod latest { - pub use super::v3::*; + pub use super::v4::*; } mod double_encoded; @@ -79,6 +80,8 @@ macro_rules! versioned_type { ($(#[$attr:meta])* pub enum $n:ident { $(#[$index3:meta])+ V3($v3:ty), + $(#[$index4:meta])+ + V4($v4:ty), }) => { #[derive(Derivative, Encode, Decode, TypeInfo)] #[derivative( @@ -94,6 +97,8 @@ macro_rules! versioned_type { pub enum $n { $(#[$index3])* V3($v3), + $(#[$index4])* + V4($v4), } impl $n { pub fn try_as(&self) -> Result<&T, ()> where Self: TryAs { @@ -104,6 +109,15 @@ macro_rules! versioned_type { fn try_as(&self) -> Result<&$v3, ()> { match &self { Self::V3(ref x) => Ok(x), + _ => Err(()), + } + } + } + impl TryAs<$v4> for $n { + fn try_as(&self) -> Result<&$v4, ()> { + match &self { + Self::V4(ref x) => Ok(x), + _ => Err(()), } } } @@ -111,21 +125,38 @@ macro_rules! versioned_type { fn into_version(self, n: Version) -> Result { Ok(match n { 3 => Self::V3(self.try_into()?), + 4 => Self::V4(self.try_into()?), _ => return Err(()), }) } } - impl> From for $n { - fn from(x: T) -> Self { + impl From<$v3> for $n { + fn from(x: $v3) -> Self { $n::V3(x.into()) } } + impl From<$v4> for $n { + fn from(x: $v4) -> Self { + $n::V4(x.into()) + } + } impl TryFrom<$n> for $v3 { type Error = (); fn try_from(x: $n) -> Result { use $n::*; match x { V3(x) => Ok(x), + V4(x) => x.try_into(), + } + } + } + impl TryFrom<$n> for $v4 { + type Error = (); + fn try_from(x: $n) -> Result { + use $n::*; + match x { + V3(x) => x.try_into().map_err(|_| ()), + V4(x) => Ok(x), } } } @@ -141,6 +172,8 @@ macro_rules! versioned_type { V2($v2:ty), $(#[$index3:meta])+ V3($v3:ty), + $(#[$index4:meta])+ + V4($v4:ty), }) => { #[derive(Derivative, Encode, Decode, TypeInfo)] #[derivative( @@ -158,6 +191,8 @@ macro_rules! versioned_type { V2($v2), $(#[$index3])* V3($v3), + $(#[$index4])* + V4($v4), } impl $n { pub fn try_as(&self) -> Result<&T, ()> where Self: TryAs { @@ -180,11 +215,20 @@ macro_rules! versioned_type { } } } + impl TryAs<$v4> for $n { + fn try_as(&self) -> Result<&$v4, ()> { + match &self { + Self::V4(ref x) => Ok(x), + _ => Err(()), + } + } + } impl IntoVersion for $n { fn into_version(self, n: Version) -> Result { Ok(match n { 1 | 2 => Self::V2(self.try_into()?), 3 => Self::V3(self.try_into()?), + 4 => Self::V4(self.try_into()?), _ => return Err(()), }) } @@ -194,9 +238,9 @@ macro_rules! versioned_type { $n::V2(x) } } - impl> From for $n { + impl> From for $n { fn from(x: T) -> Self { - $n::V3(x.into()) + $n::V4(x.into()) } } impl TryFrom<$n> for $v2 { @@ -206,6 +250,10 @@ macro_rules! versioned_type { match x { V2(x) => Ok(x), V3(x) => x.try_into(), + V4(x) => { + let v3: $v3 = x.try_into().map_err(|_| ())?; + v3.try_into() + }, } } } @@ -216,6 +264,21 @@ macro_rules! versioned_type { match x { V2(x) => x.try_into(), V3(x) => Ok(x), + V4(x) => x.try_into().map_err(|_| ()), + } + } + } + impl TryFrom<$n> for $v4 { + type Error = (); + fn try_from(x: $n) -> Result { + use $n::*; + match x { + V2(x) => { + let v3: $v3 = x.try_into().map_err(|_| ())?; + v3.try_into().map_err(|_| ()) + }, + V3(x) => x.try_into().map_err(|_| ()), + V4(x) => Ok(x), } } } @@ -228,10 +291,12 @@ macro_rules! versioned_type { } versioned_type! { - /// A single version's `Response` value, together with its version code. + /// A single version's `AssetId` value, together with its version code. pub enum VersionedAssetId { #[codec(index = 3)] V3(v3::AssetId), + #[codec(index = 4)] + V4(v4::AssetId), } } @@ -242,6 +307,8 @@ versioned_type! { V2(v2::Response), #[codec(index = 3)] V3(v3::Response), + #[codec(index = 4)] + V4(v4::Response), } } @@ -252,6 +319,8 @@ versioned_type! { V2(v2::NetworkId), #[codec(index = 3)] V3(v3::NetworkId), + #[codec(index = 4)] + V4(v4::NetworkId), } } @@ -262,50 +331,72 @@ versioned_type! { V2(v2::Junction), #[codec(index = 3)] V3(v3::Junction), + #[codec(index = 4)] + V4(v4::Junction), } } versioned_type! { - /// A single `MultiLocation` value, together with its version code. + /// A single `Location` value, together with its version code. #[derive(Ord, PartialOrd)] - pub enum VersionedMultiLocation { + pub enum VersionedLocation { #[codec(index = 1)] // v2 is same as v1 and therefore re-using the v1 index V2(v2::MultiLocation), #[codec(index = 3)] V3(v3::MultiLocation), + #[codec(index = 4)] + V4(v4::Location), } } +#[deprecated(note = "Use `VersionedLocation` instead")] +pub type VersionedMultiLocation = VersionedLocation; + versioned_type! { - /// A single `InteriorMultiLocation` value, together with its version code. - pub enum VersionedInteriorMultiLocation { - #[codec(index = 2)] // while this is same as v1::Junctions, VersionedInteriorMultiLocation is introduced in v3 + /// A single `InteriorLocation` value, together with its version code. + pub enum VersionedInteriorLocation { + #[codec(index = 2)] // while this is same as v1::Junctions, VersionedInteriorLocation is introduced in v3 V2(v2::InteriorMultiLocation), #[codec(index = 3)] V3(v3::InteriorMultiLocation), + #[codec(index = 4)] + V4(v4::InteriorLocation), } } +#[deprecated(note = "Use `VersionedInteriorLocation` instead")] +pub type VersionedInteriorMultiLocation = VersionedInteriorLocation; + versioned_type! { - /// A single `MultiAsset` value, together with its version code. - pub enum VersionedMultiAsset { + /// A single `Asset` value, together with its version code. + pub enum VersionedAsset { #[codec(index = 1)] // v2 is same as v1 and therefore re-using the v1 index V2(v2::MultiAsset), #[codec(index = 3)] V3(v3::MultiAsset), + #[codec(index = 4)] + V4(v4::Asset), } } +#[deprecated(note = "Use `VersionedAsset` instead")] +pub type VersionedMultiAsset = VersionedAsset; + versioned_type! { /// A single `MultiAssets` value, together with its version code. - pub enum VersionedMultiAssets { + pub enum VersionedAssets { #[codec(index = 1)] // v2 is same as v1 and therefore re-using the v1 index V2(v2::MultiAssets), #[codec(index = 3)] V3(v3::MultiAssets), + #[codec(index = 4)] + V4(v4::Assets), } } +#[deprecated(note = "Use `VersionedAssets` instead")] +pub type VersionedMultiAssets = VersionedAssets; + /// A single XCM message, together with its version code. #[derive(Derivative, Encode, Decode, TypeInfo)] #[derivative(Clone(bound = ""), Eq(bound = ""), PartialEq(bound = ""), Debug(bound = ""))] @@ -318,6 +409,8 @@ pub enum VersionedXcm { V2(v2::Xcm), #[codec(index = 3)] V3(v3::Xcm), + #[codec(index = 4)] + V4(v4::Xcm), } impl IntoVersion for VersionedXcm { @@ -325,6 +418,7 @@ impl IntoVersion for VersionedXcm { Ok(match n { 2 => Self::V2(self.try_into()?), 3 => Self::V3(self.try_into()?), + 4 => Self::V4(self.try_into()?), _ => return Err(()), }) } @@ -342,6 +436,12 @@ impl From> for VersionedXcm { } } +impl From> for VersionedXcm { + fn from(x: v4::Xcm) -> Self { + VersionedXcm::V4(x) + } +} + impl TryFrom> for v2::Xcm { type Error = (); fn try_from(x: VersionedXcm) -> Result { @@ -349,6 +449,10 @@ impl TryFrom> for v2::Xcm { match x { V2(x) => Ok(x), V3(x) => x.try_into(), + V4(x) => { + let v3: v3::Xcm = x.try_into()?; + v3.try_into() + }, } } } @@ -360,15 +464,31 @@ impl TryFrom> for v3::Xcm { match x { V2(x) => x.try_into(), V3(x) => Ok(x), + V4(x) => x.try_into(), + } + } +} + +impl TryFrom> for v4::Xcm { + type Error = (); + fn try_from(x: VersionedXcm) -> Result { + use VersionedXcm::*; + match x { + V2(x) => { + let v3: v3::Xcm = x.try_into()?; + v3.try_into() + }, + V3(x) => x.try_into(), + V4(x) => Ok(x), } } } -/// Convert an `Xcm` datum into a `VersionedXcm`, based on a destination `MultiLocation` which will +/// Convert an `Xcm` datum into a `VersionedXcm`, based on a destination `Location` which will /// interpret it. pub trait WrapVersion { fn wrap_version( - dest: &latest::MultiLocation, + dest: &latest::Location, xcm: impl Into>, ) -> Result, ()>; } @@ -376,14 +496,14 @@ pub trait WrapVersion { /// Check and return the `Version` that should be used for the `Xcm` datum for the destination /// `MultiLocation`, which will interpret it. pub trait GetVersion { - fn get_version_for(dest: &latest::MultiLocation) -> Option; + fn get_version_for(dest: &latest::Location) -> Option; } /// `()` implementation does nothing with the XCM, just sending with whatever version it was /// authored as. impl WrapVersion for () { fn wrap_version( - _: &latest::MultiLocation, + _: &latest::Location, xcm: impl Into>, ) -> Result, ()> { Ok(xcm.into()) @@ -395,14 +515,14 @@ impl WrapVersion for () { pub struct AlwaysV2; impl WrapVersion for AlwaysV2 { fn wrap_version( - _: &latest::MultiLocation, + _: &latest::Location, xcm: impl Into>, ) -> Result, ()> { Ok(VersionedXcm::::V2(xcm.into().try_into()?)) } } impl GetVersion for AlwaysV2 { - fn get_version_for(_dest: &latest::MultiLocation) -> Option { + fn get_version_for(_dest: &latest::Location) -> Option { Some(v2::VERSION) } } @@ -412,31 +532,48 @@ impl GetVersion for AlwaysV2 { pub struct AlwaysV3; impl WrapVersion for AlwaysV3 { fn wrap_version( - _: &latest::MultiLocation, + _: &latest::Location, xcm: impl Into>, ) -> Result, ()> { Ok(VersionedXcm::::V3(xcm.into().try_into()?)) } } impl GetVersion for AlwaysV3 { - fn get_version_for(_dest: &latest::MultiLocation) -> Option { + fn get_version_for(_dest: &latest::Location) -> Option { Some(v3::VERSION) } } +/// `WrapVersion` implementation which attempts to always convert the XCM to version 3 before +/// wrapping it. +pub struct AlwaysV4; +impl WrapVersion for AlwaysV4 { + fn wrap_version( + _: &latest::Location, + xcm: impl Into>, + ) -> Result, ()> { + Ok(VersionedXcm::::V4(xcm.into().try_into()?)) + } +} +impl GetVersion for AlwaysV4 { + fn get_version_for(_dest: &latest::Location) -> Option { + Some(v4::VERSION) + } +} + /// `WrapVersion` implementation which attempts to always convert the XCM to the latest version /// before wrapping it. -pub type AlwaysLatest = AlwaysV3; +pub type AlwaysLatest = AlwaysV4; /// `WrapVersion` implementation which attempts to always convert the XCM to the most recent Long- /// Term-Support version before wrapping it. -pub type AlwaysLts = AlwaysV3; +pub type AlwaysLts = AlwaysV4; pub mod prelude { pub use super::{ - latest::prelude::*, AlwaysLatest, AlwaysLts, AlwaysV2, AlwaysV3, GetVersion, IntoVersion, - Unsupported, Version as XcmVersion, VersionedAssetId, VersionedInteriorMultiLocation, - VersionedMultiAsset, VersionedMultiAssets, VersionedMultiLocation, VersionedResponse, + latest::prelude::*, AlwaysLatest, AlwaysLts, AlwaysV2, AlwaysV3, AlwaysV4, GetVersion, + IntoVersion, Unsupported, Version as XcmVersion, VersionedAsset, VersionedAssetId, + VersionedAssets, VersionedInteriorLocation, VersionedLocation, VersionedResponse, VersionedXcm, WrapVersion, }; } @@ -454,13 +591,19 @@ pub mod opaque { // Then override with the opaque types in v3 pub use crate::v3::opaque::{Instruction, Xcm}; } + pub mod v4 { + // Everything from v4 + pub use crate::v4::*; + // Then override with the opaque types in v4 + pub use crate::v4::opaque::{Instruction, Xcm}; + } pub mod latest { - pub use super::v3::*; + pub use super::v4::*; } pub mod lts { - pub use super::v3::*; + pub use super::v4::*; } /// The basic `VersionedXcm` type which just uses the `Vec` as an encoded call. @@ -470,5 +613,56 @@ pub mod opaque { #[test] fn conversion_works() { use latest::prelude::*; - let _: VersionedMultiAssets = (Here, 1u128).into(); + let assets: Assets = (Here, 1u128).into(); + let _: VersionedAssets = assets.into(); +} + +#[test] +fn size_limits() { + extern crate std; + + let mut test_failed = false; + macro_rules! check_sizes { + ($(($kind:ty, $expected:expr),)+) => { + $({ + let s = core::mem::size_of::<$kind>(); + // Since the types often affect the size of other types in which they're included + // it is more convenient to check multiple types at the same time and only fail + // the test at the end. For debugging it's also useful to print out all of the sizes, + // even if they're within the expected range. + if s > $expected { + test_failed = true; + std::eprintln!( + "assertion failed: size of '{}' is {} (which is more than the expected {})", + stringify!($kind), + s, + $expected + ); + } else { + std::println!( + "type '{}' is of size {} which is within the expected {}", + stringify!($kind), + s, + $expected + ); + } + })+ + } + } + + check_sizes! { + (crate::latest::Instruction<()>, 112), + (crate::latest::Asset, 80), + (crate::latest::Location, 24), + (crate::latest::AssetId, 40), + (crate::latest::Junctions, 16), + (crate::latest::Junction, 88), + (crate::latest::Response, 40), + (crate::latest::AssetInstance, 40), + (crate::latest::NetworkId, 48), + (crate::latest::BodyId, 32), + (crate::latest::Assets, 24), + (crate::latest::BodyPart, 12), + } + assert!(!test_failed); } diff --git a/polkadot/xcm/src/tests.rs b/polkadot/xcm/src/tests.rs index a3a60f6477c..1aabbcef281 100644 --- a/polkadot/xcm/src/tests.rs +++ b/polkadot/xcm/src/tests.rs @@ -59,79 +59,79 @@ fn encode_decode_versioned_response_v3() { #[test] fn encode_decode_versioned_multi_location_v2() { - let location = VersionedMultiLocation::V2(v2::MultiLocation::new(0, v2::Junctions::Here)); + let location = VersionedLocation::V2(v2::MultiLocation::new(0, v2::Junctions::Here)); let encoded = location.encode(); assert_eq!(encoded, hex_literal::hex!("010000"), "encode format changed"); assert_eq!(encoded[0], 1, "bad version number"); // this is introduced in v1 - let decoded = VersionedMultiLocation::decode(&mut &encoded[..]).unwrap(); + let decoded = VersionedLocation::decode(&mut &encoded[..]).unwrap(); assert_eq!(location, decoded); } #[test] fn encode_decode_versioned_multi_location_v3() { - let location = VersionedMultiLocation::V3(v3::MultiLocation::new(0, v3::Junctions::Here)); + let location = VersionedLocation::V3(v3::MultiLocation::new(0, v3::Junctions::Here)); let encoded = location.encode(); assert_eq!(encoded, hex_literal::hex!("030000"), "encode format changed"); assert_eq!(encoded[0], 3, "bad version number"); - let decoded = VersionedMultiLocation::decode(&mut &encoded[..]).unwrap(); + let decoded = VersionedLocation::decode(&mut &encoded[..]).unwrap(); assert_eq!(location, decoded); } #[test] fn encode_decode_versioned_interior_multi_location_v2() { - let location = VersionedInteriorMultiLocation::V2(v2::InteriorMultiLocation::Here); + let location = VersionedInteriorLocation::V2(v2::InteriorMultiLocation::Here); let encoded = location.encode(); assert_eq!(encoded, hex_literal::hex!("0200"), "encode format changed"); assert_eq!(encoded[0], 2, "bad version number"); - let decoded = VersionedInteriorMultiLocation::decode(&mut &encoded[..]).unwrap(); + let decoded = VersionedInteriorLocation::decode(&mut &encoded[..]).unwrap(); assert_eq!(location, decoded); } #[test] fn encode_decode_versioned_interior_multi_location_v3() { - let location = VersionedInteriorMultiLocation::V3(v3::InteriorMultiLocation::Here); + let location = VersionedInteriorLocation::V3(v3::InteriorMultiLocation::Here); let encoded = location.encode(); assert_eq!(encoded, hex_literal::hex!("0300"), "encode format changed"); assert_eq!(encoded[0], 3, "bad version number"); - let decoded = VersionedInteriorMultiLocation::decode(&mut &encoded[..]).unwrap(); + let decoded = VersionedInteriorLocation::decode(&mut &encoded[..]).unwrap(); assert_eq!(location, decoded); } #[test] fn encode_decode_versioned_multi_asset_v2() { - let asset = VersionedMultiAsset::V2(v2::MultiAsset::from(((0, v2::Junctions::Here), 1))); + let asset = VersionedAsset::V2(v2::MultiAsset::from(((0, v2::Junctions::Here), 1))); let encoded = asset.encode(); assert_eq!(encoded, hex_literal::hex!("010000000004"), "encode format changed"); assert_eq!(encoded[0], 1, "bad version number"); - let decoded = VersionedMultiAsset::decode(&mut &encoded[..]).unwrap(); + let decoded = VersionedAsset::decode(&mut &encoded[..]).unwrap(); assert_eq!(asset, decoded); } #[test] fn encode_decode_versioned_multi_asset_v3() { - let asset = VersionedMultiAsset::V3(v3::MultiAsset::from((v3::MultiLocation::default(), 1))); + let asset = VersionedAsset::V3(v3::MultiAsset::from((v3::MultiLocation::default(), 1))); let encoded = asset.encode(); assert_eq!(encoded, hex_literal::hex!("030000000004"), "encode format changed"); assert_eq!(encoded[0], 3, "bad version number"); - let decoded = VersionedMultiAsset::decode(&mut &encoded[..]).unwrap(); + let decoded = VersionedAsset::decode(&mut &encoded[..]).unwrap(); assert_eq!(asset, decoded); } #[test] fn encode_decode_versioned_multi_assets_v2() { - let assets = VersionedMultiAssets::V2(v2::MultiAssets::from(vec![v2::MultiAsset::from(( + let assets = VersionedAssets::V2(v2::MultiAssets::from(vec![v2::MultiAsset::from(( (0, v2::Junctions::Here), 1, ))])); @@ -140,13 +140,13 @@ fn encode_decode_versioned_multi_assets_v2() { assert_eq!(encoded, hex_literal::hex!("01040000000004"), "encode format changed"); assert_eq!(encoded[0], 1, "bad version number"); - let decoded = VersionedMultiAssets::decode(&mut &encoded[..]).unwrap(); + let decoded = VersionedAssets::decode(&mut &encoded[..]).unwrap(); assert_eq!(assets, decoded); } #[test] fn encode_decode_versioned_multi_assets_v3() { - let assets = VersionedMultiAssets::V3(v3::MultiAssets::from(vec![ + let assets = VersionedAssets::V3(v3::MultiAssets::from(vec![ (v3::MultiAsset::from((v3::MultiLocation::default(), 1))), ])); let encoded = assets.encode(); @@ -154,7 +154,7 @@ fn encode_decode_versioned_multi_assets_v3() { assert_eq!(encoded, hex_literal::hex!("03040000000004"), "encode format changed"); assert_eq!(encoded[0], 3, "bad version number"); - let decoded = VersionedMultiAssets::decode(&mut &encoded[..]).unwrap(); + let decoded = VersionedAssets::decode(&mut &encoded[..]).unwrap(); assert_eq!(assets, decoded); } @@ -187,6 +187,8 @@ fn encode_decode_versioned_xcm_v3() { #[test] fn ensure_type_info_is_correct() { let type_info = VersionedXcm::<()>::type_info(); - assert_eq!(type_info.path.segments, vec!["xcm", "VersionedXcm"]); + + let type_info = VersionedAssetId::type_info(); + assert_eq!(type_info.path.segments, vec!["xcm", "VersionedAssetId"]); } diff --git a/polkadot/xcm/src/v2/multilocation.rs b/polkadot/xcm/src/v2/multilocation.rs index 81b67eee974..60aa1f6cead 100644 --- a/polkadot/xcm/src/v2/multilocation.rs +++ b/polkadot/xcm/src/v2/multilocation.rs @@ -75,8 +75,8 @@ impl MultiLocation { MultiLocation { parents, interior: junctions } } - /// Consume `self` and return the equivalent `VersionedMultiLocation` value. - pub fn versioned(self) -> crate::VersionedMultiLocation { + /// Consume `self` and return the equivalent `VersionedLocation` value. + pub fn versioned(self) -> crate::VersionedLocation { self.into() } @@ -240,9 +240,9 @@ impl MultiLocation { /// # Example /// ```rust /// # use staging_xcm::v2::{Junctions::*, Junction::*, MultiLocation}; - /// let mut m = MultiLocation::new(1, X2(PalletInstance(3), OnlyChild)); + /// let mut m = MultiLocation::new(1, [PalletInstance(3), OnlyChild].into()); /// assert_eq!( - /// m.match_and_split(&MultiLocation::new(1, X1(PalletInstance(3)))), + /// m.match_and_split(&MultiLocation::new(1, [PalletInstance(3)].into())), /// Some(&OnlyChild), /// ); /// assert_eq!(m.match_and_split(&MultiLocation::new(1, Here)), None); @@ -260,10 +260,10 @@ impl MultiLocation { /// # Example /// ```rust /// # use staging_xcm::v2::{Junctions::*, Junction::*, MultiLocation}; - /// let m = MultiLocation::new(1, X3(PalletInstance(3), OnlyChild, OnlyChild)); - /// assert!(m.starts_with(&MultiLocation::new(1, X1(PalletInstance(3))))); - /// assert!(!m.starts_with(&MultiLocation::new(1, X1(GeneralIndex(99))))); - /// assert!(!m.starts_with(&MultiLocation::new(0, X1(PalletInstance(3))))); + /// let m = MultiLocation::new(1, [PalletInstance(3), OnlyChild, OnlyChild].into()); + /// assert!(m.starts_with(&MultiLocation::new(1, [PalletInstance(3)].into()))); + /// assert!(!m.starts_with(&MultiLocation::new(1, [GeneralIndex(99)].into()))); + /// assert!(!m.starts_with(&MultiLocation::new(0, [PalletInstance(3)].into()))); /// ``` pub fn starts_with(&self, prefix: &MultiLocation) -> bool { if self.parents != prefix.parents { @@ -279,9 +279,9 @@ impl MultiLocation { /// # Example /// ```rust /// # use staging_xcm::v2::{Junctions::*, Junction::*, MultiLocation}; - /// let mut m = MultiLocation::new(1, X1(Parachain(21))); - /// assert_eq!(m.append_with(X1(PalletInstance(3))), Ok(())); - /// assert_eq!(m, MultiLocation::new(1, X2(Parachain(21), PalletInstance(3)))); + /// let mut m = MultiLocation::new(1, [Parachain(21)].into()); + /// assert_eq!(m.append_with([PalletInstance(3)].into()), Ok(())); + /// assert_eq!(m, MultiLocation::new(1, [Parachain(21), PalletInstance(3)].into())); /// ``` pub fn append_with(&mut self, suffix: Junctions) -> Result<(), Junctions> { if self.interior.len().saturating_add(suffix.len()) > MAX_JUNCTIONS { @@ -300,9 +300,9 @@ impl MultiLocation { /// # Example /// ```rust /// # use staging_xcm::v2::{Junctions::*, Junction::*, MultiLocation}; - /// let mut m = MultiLocation::new(2, X1(PalletInstance(3))); - /// assert_eq!(m.prepend_with(MultiLocation::new(1, X2(Parachain(21), OnlyChild))), Ok(())); - /// assert_eq!(m, MultiLocation::new(1, X1(PalletInstance(3)))); + /// let mut m = MultiLocation::new(2, [PalletInstance(3)].into()); + /// assert_eq!(m.prepend_with(MultiLocation::new(1, [Parachain(21), OnlyChild].into())), Ok(())); + /// assert_eq!(m, MultiLocation::new(1, [PalletInstance(3)].into())); /// ``` pub fn prepend_with(&mut self, mut prefix: MultiLocation) -> Result<(), MultiLocation> { // prefix self (suffix) @@ -455,6 +455,7 @@ impl> From> for MultiLocation { } xcm_procedural::impl_conversion_functions_for_multilocation_v2!(); +xcm_procedural::impl_conversion_functions_for_junctions_v2!(); /// Maximum number of `Junction`s that a `Junctions` can contain. const MAX_JUNCTIONS: usize = 8; diff --git a/polkadot/xcm/src/v2/traits.rs b/polkadot/xcm/src/v2/traits.rs index 6453f91a1f1..9cfb9b051ab 100644 --- a/polkadot/xcm/src/v2/traits.rs +++ b/polkadot/xcm/src/v2/traits.rs @@ -292,11 +292,12 @@ pub type SendResult = result::Result<(), SendError>; /// } /// } /// -/// /// A sender that accepts a message that has an X2 junction, otherwise stops the routing. +/// /// A sender that accepts a message that has two junctions, otherwise stops the routing. /// struct Sender2; /// impl SendXcm for Sender2 { /// fn send_xcm(destination: impl Into, message: Xcm<()>) -> SendResult { -/// if let MultiLocation { parents: 0, interior: X2(j1, j2) } = destination.into() { +/// let destination = destination.into(); +/// if destination.parents == 0 && destination.interior.len() == 2 { /// Ok(()) /// } else { /// Err(SendError::Unroutable) diff --git a/polkadot/xcm/src/v3/junction.rs b/polkadot/xcm/src/v3/junction.rs index 6ae339db2ae..e9e51941b1a 100644 --- a/polkadot/xcm/src/v3/junction.rs +++ b/polkadot/xcm/src/v3/junction.rs @@ -22,7 +22,8 @@ use crate::{ BodyId as OldBodyId, BodyPart as OldBodyPart, Junction as OldJunction, NetworkId as OldNetworkId, }, - VersionedMultiLocation, + v4::{Junction as NewJunction, NetworkId as NewNetworkId}, + VersionedLocation, }; use bounded_collections::{BoundedSlice, BoundedVec, ConstU32}; use core::convert::{TryFrom, TryInto}; @@ -104,6 +105,31 @@ impl TryFrom for NetworkId { } } +impl From for Option { + fn from(new: NewNetworkId) -> Self { + Some(NetworkId::from(new)) + } +} + +impl From for NetworkId { + fn from(new: NewNetworkId) -> Self { + use NewNetworkId::*; + match new { + ByGenesis(hash) => Self::ByGenesis(hash), + ByFork { block_number, block_hash } => Self::ByFork { block_number, block_hash }, + Polkadot => Self::Polkadot, + Kusama => Self::Kusama, + Westend => Self::Westend, + Rococo => Self::Rococo, + Wococo => Self::Wococo, + Ethereum { chain_id } => Self::Ethereum { chain_id }, + BitcoinCore => Self::BitcoinCore, + BitcoinCash => Self::BitcoinCash, + PolkadotBulletin => Self::PolkadotBulletin, + } + } +} + /// An identifier of a pluralistic body. #[derive( Copy, @@ -414,6 +440,29 @@ impl TryFrom for Junction { } } +impl TryFrom for Junction { + type Error = (); + + fn try_from(value: NewJunction) -> Result { + use NewJunction::*; + Ok(match value { + Parachain(id) => Self::Parachain(id), + AccountId32 { network: maybe_network, id } => + Self::AccountId32 { network: maybe_network.map(|network| network.into()), id }, + AccountIndex64 { network: maybe_network, index } => + Self::AccountIndex64 { network: maybe_network.map(|network| network.into()), index }, + AccountKey20 { network: maybe_network, key } => + Self::AccountKey20 { network: maybe_network.map(|network| network.into()), key }, + PalletInstance(index) => Self::PalletInstance(index), + GeneralIndex(id) => Self::GeneralIndex(id), + GeneralKey { length, data } => Self::GeneralKey { length, data }, + OnlyChild => Self::OnlyChild, + Plurality { id, part } => Self::Plurality { id, part }, + GlobalConsensus(network) => Self::GlobalConsensus(network.into()), + }) + } +} + impl Junction { /// Convert `self` into a `MultiLocation` containing 0 parents. /// @@ -430,10 +479,10 @@ impl Junction { MultiLocation { parents: n, interior: Junctions::X1(self) } } - /// Convert `self` into a `VersionedMultiLocation` containing 0 parents. + /// Convert `self` into a `VersionedLocation` containing 0 parents. /// /// Similar to `Into::into`, except that this method can be used in a const evaluation context. - pub const fn into_versioned(self) -> VersionedMultiLocation { + pub const fn into_versioned(self) -> VersionedLocation { self.into_location().into_versioned() } diff --git a/polkadot/xcm/src/v3/junctions.rs b/polkadot/xcm/src/v3/junctions.rs index 88da20cb1a1..9748e81fa55 100644 --- a/polkadot/xcm/src/v3/junctions.rs +++ b/polkadot/xcm/src/v3/junctions.rs @@ -67,6 +67,27 @@ pub enum Junctions { X8(Junction, Junction, Junction, Junction, Junction, Junction, Junction, Junction), } +macro_rules! impl_junction { + ($count:expr, $variant:ident, ($($index:literal),+)) => { + /// Additional helper for building junctions + /// Useful for converting to future XCM versions + impl From<[Junction; $count]> for Junctions { + fn from(junctions: [Junction; $count]) -> Self { + Self::$variant($(junctions[$index]),*) + } + } + }; +} + +impl_junction!(1, X1, (0)); +impl_junction!(2, X2, (0, 1)); +impl_junction!(3, X3, (0, 1, 2)); +impl_junction!(4, X4, (0, 1, 2, 3)); +impl_junction!(5, X5, (0, 1, 2, 3, 4)); +impl_junction!(6, X6, (0, 1, 2, 3, 4, 5)); +impl_junction!(7, X7, (0, 1, 2, 3, 4, 5, 6)); +impl_junction!(8, X8, (0, 1, 2, 3, 4, 5, 6, 7)); + pub struct JunctionsIterator(Junctions); impl Iterator for JunctionsIterator { type Item = Junction; diff --git a/polkadot/xcm/src/v3/mod.rs b/polkadot/xcm/src/v3/mod.rs index 50b7a539122..1172cbf43e6 100644 --- a/polkadot/xcm/src/v3/mod.rs +++ b/polkadot/xcm/src/v3/mod.rs @@ -16,9 +16,15 @@ //! Version 3 of the Cross-Consensus Message format data structures. -use super::v2::{ - Instruction as OldInstruction, Response as OldResponse, WeightLimit as OldWeightLimit, - Xcm as OldXcm, +use super::{ + v2::{ + Instruction as OldInstruction, Response as OldResponse, WeightLimit as OldWeightLimit, + Xcm as OldXcm, + }, + v4::{ + Instruction as NewInstruction, PalletInfo as NewPalletInfo, + QueryResponseInfo as NewQueryResponseInfo, Response as NewResponse, Xcm as NewXcm, + }, }; use crate::DoubleEncoded; use alloc::{vec, vec::Vec}; @@ -48,7 +54,7 @@ pub use multiasset::{ WildFungibility, WildMultiAsset, MAX_ITEMS_IN_MULTIASSETS, }; pub use multilocation::{ - Ancestor, AncestorThen, InteriorMultiLocation, MultiLocation, Parent, ParentThen, + Ancestor, AncestorThen, InteriorMultiLocation, Location, MultiLocation, Parent, ParentThen, }; pub use traits::{ send_xcm, validate_send, Error, ExecuteXcm, Outcome, PreparedMessage, Result, SendError, @@ -209,7 +215,7 @@ pub mod prelude { InteriorMultiLocation, Junction::{self, *}, Junctions::{self, *}, - MaybeErrorCode, MultiAsset, + Location, MaybeErrorCode, MultiAsset, MultiAssetFilter::{self, *}, MultiAssets, MultiLocation, NetworkId::{self, *}, @@ -275,6 +281,22 @@ impl PalletInfo { } } +impl TryInto for PalletInfo { + type Error = (); + + fn try_into(self) -> result::Result { + NewPalletInfo::new( + self.index, + self.name.into_inner(), + self.module_name.into_inner(), + self.major, + self.minor, + self.patch, + ) + .map_err(|_| ()) + } +} + #[derive(Clone, Eq, PartialEq, Encode, Decode, Debug, TypeInfo, MaxEncodedLen)] #[scale_info(replace_segment("staging_xcm", "xcm"))] #[cfg_attr(feature = "json-schema", derive(schemars::JsonSchema))] @@ -324,6 +346,32 @@ impl Default for Response { } } +impl TryFrom for Response { + type Error = (); + + fn try_from(new: NewResponse) -> result::Result { + use NewResponse::*; + Ok(match new { + Null => Self::Null, + Assets(assets) => Self::Assets(assets.try_into()?), + ExecutionResult(result) => + Self::ExecutionResult(result.map(|(num, old_error)| (num, old_error.into()))), + Version(version) => Self::Version(version), + PalletsInfo(pallet_info) => { + let inner = pallet_info + .into_iter() + .map(TryInto::try_into) + .collect::, _>>()?; + Self::PalletsInfo( + BoundedVec::::try_from(inner).map_err(|_| ())?, + ) + }, + DispatchResult(maybe_error) => + Self::DispatchResult(maybe_error.try_into().map_err(|_| ())?), + }) + } +} + /// Information regarding the composition of a query response. #[derive(Clone, Eq, PartialEq, Encode, Decode, Debug, TypeInfo)] #[scale_info(replace_segment("staging_xcm", "xcm"))] @@ -338,6 +386,18 @@ pub struct QueryResponseInfo { pub max_weight: Weight, } +impl TryFrom for QueryResponseInfo { + type Error = (); + + fn try_from(new: NewQueryResponseInfo) -> result::Result { + Ok(Self { + destination: new.destination.try_into()?, + query_id: new.query_id, + max_weight: new.max_weight, + }) + } +} + /// An optional weight limit. #[derive(Clone, Eq, PartialEq, Encode, Decode, Debug, TypeInfo)] #[scale_info(replace_segment("staging_xcm", "xcm"))] @@ -367,13 +427,12 @@ impl From for Option { } } -impl TryFrom for WeightLimit { - type Error = (); - fn try_from(x: OldWeightLimit) -> result::Result { +impl From for WeightLimit { + fn from(x: OldWeightLimit) -> Self { use OldWeightLimit::*; match x { - Limited(w) => Ok(Self::Limited(Weight::from_parts(w, DEFAULT_PROOF_SIZE))), - Unlimited => Ok(Self::Unlimited), + Limited(w) => Self::Limited(Weight::from_parts(w, DEFAULT_PROOF_SIZE)), + Unlimited => Self::Unlimited, } } } @@ -1263,6 +1322,155 @@ impl TryFrom> for Xcm { } } +// Convert from a v4 XCM to a v3 XCM. +impl TryFrom> for Xcm { + type Error = (); + fn try_from(new_xcm: NewXcm) -> result::Result { + Ok(Xcm(new_xcm.0.into_iter().map(TryInto::try_into).collect::>()?)) + } +} + +// Convert from a v4 instruction to a v3 instruction. +impl TryFrom> for Instruction { + type Error = (); + fn try_from(new_instruction: NewInstruction) -> result::Result { + use NewInstruction::*; + Ok(match new_instruction { + WithdrawAsset(assets) => Self::WithdrawAsset(assets.try_into()?), + ReserveAssetDeposited(assets) => Self::ReserveAssetDeposited(assets.try_into()?), + ReceiveTeleportedAsset(assets) => Self::ReceiveTeleportedAsset(assets.try_into()?), + QueryResponse { query_id, response, max_weight, querier: Some(querier) } => + Self::QueryResponse { + query_id, + querier: querier.try_into()?, + response: response.try_into()?, + max_weight, + }, + QueryResponse { query_id, response, max_weight, querier: None } => + Self::QueryResponse { + query_id, + querier: None, + response: response.try_into()?, + max_weight, + }, + TransferAsset { assets, beneficiary } => Self::TransferAsset { + assets: assets.try_into()?, + beneficiary: beneficiary.try_into()?, + }, + TransferReserveAsset { assets, dest, xcm } => Self::TransferReserveAsset { + assets: assets.try_into()?, + dest: dest.try_into()?, + xcm: xcm.try_into()?, + }, + HrmpNewChannelOpenRequest { sender, max_message_size, max_capacity } => + Self::HrmpNewChannelOpenRequest { sender, max_message_size, max_capacity }, + HrmpChannelAccepted { recipient } => Self::HrmpChannelAccepted { recipient }, + HrmpChannelClosing { initiator, sender, recipient } => + Self::HrmpChannelClosing { initiator, sender, recipient }, + Transact { origin_kind, require_weight_at_most, call } => + Self::Transact { origin_kind, require_weight_at_most, call: call.into() }, + ReportError(response_info) => Self::ReportError(QueryResponseInfo { + query_id: response_info.query_id, + destination: response_info.destination.try_into().map_err(|_| ())?, + max_weight: response_info.max_weight, + }), + DepositAsset { assets, beneficiary } => { + let beneficiary = beneficiary.try_into()?; + let assets = assets.try_into()?; + Self::DepositAsset { assets, beneficiary } + }, + DepositReserveAsset { assets, dest, xcm } => { + let dest = dest.try_into()?; + let xcm = xcm.try_into()?; + let assets = assets.try_into()?; + Self::DepositReserveAsset { assets, dest, xcm } + }, + ExchangeAsset { give, want, maximal } => { + let give = give.try_into()?; + let want = want.try_into()?; + Self::ExchangeAsset { give, want, maximal } + }, + InitiateReserveWithdraw { assets, reserve, xcm } => { + // No `max_assets` here, so if there's a connt, then we cannot translate. + let assets = assets.try_into()?; + let reserve = reserve.try_into()?; + let xcm = xcm.try_into()?; + Self::InitiateReserveWithdraw { assets, reserve, xcm } + }, + InitiateTeleport { assets, dest, xcm } => { + // No `max_assets` here, so if there's a connt, then we cannot translate. + let assets = assets.try_into()?; + let dest = dest.try_into()?; + let xcm = xcm.try_into()?; + Self::InitiateTeleport { assets, dest, xcm } + }, + ReportHolding { response_info, assets } => { + let response_info = QueryResponseInfo { + destination: response_info.destination.try_into().map_err(|_| ())?, + query_id: response_info.query_id, + max_weight: response_info.max_weight, + }; + Self::ReportHolding { response_info, assets: assets.try_into()? } + }, + BuyExecution { fees, weight_limit } => { + let fees = fees.try_into()?; + let weight_limit = weight_limit.into(); + Self::BuyExecution { fees, weight_limit } + }, + ClearOrigin => Self::ClearOrigin, + DescendOrigin(who) => Self::DescendOrigin(who.try_into()?), + RefundSurplus => Self::RefundSurplus, + SetErrorHandler(xcm) => Self::SetErrorHandler(xcm.try_into()?), + SetAppendix(xcm) => Self::SetAppendix(xcm.try_into()?), + ClearError => Self::ClearError, + ClaimAsset { assets, ticket } => { + let assets = assets.try_into()?; + let ticket = ticket.try_into()?; + Self::ClaimAsset { assets, ticket } + }, + Trap(code) => Self::Trap(code), + SubscribeVersion { query_id, max_response_weight } => + Self::SubscribeVersion { query_id, max_response_weight }, + UnsubscribeVersion => Self::UnsubscribeVersion, + BurnAsset(assets) => Self::BurnAsset(assets.try_into()?), + ExpectAsset(assets) => Self::ExpectAsset(assets.try_into()?), + ExpectOrigin(maybe_origin) => + Self::ExpectOrigin(maybe_origin.map(|origin| origin.try_into()).transpose()?), + ExpectError(maybe_error) => Self::ExpectError(maybe_error), + ExpectTransactStatus(maybe_error_code) => Self::ExpectTransactStatus(maybe_error_code), + QueryPallet { module_name, response_info } => + Self::QueryPallet { module_name, response_info: response_info.try_into()? }, + ExpectPallet { index, name, module_name, crate_major, min_crate_minor } => + Self::ExpectPallet { index, name, module_name, crate_major, min_crate_minor }, + ReportTransactStatus(response_info) => + Self::ReportTransactStatus(response_info.try_into()?), + ClearTransactStatus => Self::ClearTransactStatus, + UniversalOrigin(junction) => Self::UniversalOrigin(junction.try_into()?), + ExportMessage { network, destination, xcm } => Self::ExportMessage { + network: network.into(), + destination: destination.try_into()?, + xcm: xcm.try_into()?, + }, + LockAsset { asset, unlocker } => + Self::LockAsset { asset: asset.try_into()?, unlocker: unlocker.try_into()? }, + UnlockAsset { asset, target } => + Self::UnlockAsset { asset: asset.try_into()?, target: target.try_into()? }, + NoteUnlockable { asset, owner } => + Self::NoteUnlockable { asset: asset.try_into()?, owner: owner.try_into()? }, + RequestUnlock { asset, locker } => + Self::RequestUnlock { asset: asset.try_into()?, locker: locker.try_into()? }, + SetFeesMode { jit_withdraw } => Self::SetFeesMode { jit_withdraw }, + SetTopic(topic) => Self::SetTopic(topic), + ClearTopic => Self::ClearTopic, + AliasOrigin(location) => Self::AliasOrigin(location.try_into()?), + UnpaidExecution { weight_limit, check_origin } => Self::UnpaidExecution { + weight_limit, + check_origin: check_origin.map(|origin| origin.try_into()).transpose()?, + }, + }) + } +} + /// Default value for the proof size weight component when converting from V2. Set at 64 KB. /// NOTE: Make sure this is removed after we properly account for PoV weights. const DEFAULT_PROOF_SIZE: u64 = 64 * 1024; @@ -1343,10 +1551,8 @@ impl TryFrom> for Instruction { }; Self::ReportHolding { response_info, assets: assets.try_into()? } }, - BuyExecution { fees, weight_limit } => Self::BuyExecution { - fees: fees.try_into()?, - weight_limit: weight_limit.try_into()?, - }, + BuyExecution { fees, weight_limit } => + Self::BuyExecution { fees: fees.try_into()?, weight_limit: weight_limit.into() }, ClearOrigin => Self::ClearOrigin, DescendOrigin(who) => Self::DescendOrigin(who.try_into()?), RefundSurplus => Self::RefundSurplus, diff --git a/polkadot/xcm/src/v3/multiasset.rs b/polkadot/xcm/src/v3/multiasset.rs index c8801f5a461..557ffa568a4 100644 --- a/polkadot/xcm/src/v3/multiasset.rs +++ b/polkadot/xcm/src/v3/multiasset.rs @@ -27,11 +27,18 @@ //! filtering an XCM holding account. use super::{InteriorMultiLocation, MultiLocation}; -use crate::v2::{ - AssetId as OldAssetId, AssetInstance as OldAssetInstance, Fungibility as OldFungibility, - MultiAsset as OldMultiAsset, MultiAssetFilter as OldMultiAssetFilter, - MultiAssets as OldMultiAssets, WildFungibility as OldWildFungibility, - WildMultiAsset as OldWildMultiAsset, +use crate::{ + v2::{ + AssetId as OldAssetId, AssetInstance as OldAssetInstance, Fungibility as OldFungibility, + MultiAsset as OldMultiAsset, MultiAssetFilter as OldMultiAssetFilter, + MultiAssets as OldMultiAssets, WildFungibility as OldWildFungibility, + WildMultiAsset as OldWildMultiAsset, + }, + v4::{ + Asset as NewMultiAsset, AssetFilter as NewMultiAssetFilter, AssetId as NewAssetId, + AssetInstance as NewAssetInstance, Assets as NewMultiAssets, Fungibility as NewFungibility, + WildAsset as NewWildMultiAsset, WildFungibility as NewWildFungibility, + }, }; use alloc::{vec, vec::Vec}; use bounded_collections::{BoundedVec, ConstU32}; @@ -86,6 +93,21 @@ impl TryFrom for AssetInstance { } } +impl TryFrom for AssetInstance { + type Error = (); + fn try_from(value: NewAssetInstance) -> Result { + use NewAssetInstance::*; + Ok(match value { + Undefined => Self::Undefined, + Index(n) => Self::Index(n), + Array4(n) => Self::Array4(n), + Array8(n) => Self::Array8(n), + Array16(n) => Self::Array16(n), + Array32(n) => Self::Array32(n), + }) + } +} + impl From<()> for AssetInstance { fn from(_: ()) -> Self { Self::Undefined @@ -310,6 +332,17 @@ impl TryFrom for Fungibility { } } +impl TryFrom for Fungibility { + type Error = (); + fn try_from(value: NewFungibility) -> Result { + use NewFungibility::*; + Ok(match value { + Fungible(n) => Self::Fungible(n), + NonFungible(i) => Self::NonFungible(i.try_into()?), + }) + } +} + /// Classification of whether an asset is fungible or not. #[derive( Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Debug, Encode, Decode, TypeInfo, MaxEncodedLen, @@ -335,6 +368,17 @@ impl TryFrom for WildFungibility { } } +impl TryFrom for WildFungibility { + type Error = (); + fn try_from(value: NewWildFungibility) -> Result { + use NewWildFungibility::*; + Ok(match value { + Fungible => Self::Fungible, + NonFungible => Self::NonFungible, + }) + } +} + /// Classification of an asset being concrete or abstract. #[derive( Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Debug, Encode, Decode, TypeInfo, MaxEncodedLen, @@ -378,6 +422,13 @@ impl TryFrom for AssetId { } } +impl TryFrom for AssetId { + type Error = (); + fn try_from(new: NewAssetId) -> Result { + Ok(Self::Concrete(new.0.try_into()?)) + } +} + impl AssetId { /// Prepend a `MultiLocation` to a concrete asset, giving it a new root location. pub fn prepend_with(&mut self, prepend: &MultiLocation) -> Result<(), ()> { @@ -506,6 +557,13 @@ impl TryFrom for MultiAsset { } } +impl TryFrom for MultiAsset { + type Error = (); + fn try_from(new: NewMultiAsset) -> Result { + Ok(Self { id: new.id.try_into()?, fun: new.fun.try_into()? }) + } +} + /// A `Vec` of `MultiAsset`s. /// /// There are a number of invariants which the construction and mutation functions must ensure are @@ -549,6 +607,18 @@ impl TryFrom for MultiAssets { } } +impl TryFrom for MultiAssets { + type Error = (); + fn try_from(new: NewMultiAssets) -> Result { + let v = new + .into_inner() + .into_iter() + .map(MultiAsset::try_from) + .collect::, ()>>()?; + Ok(MultiAssets(v)) + } +} + impl From> for MultiAssets { fn from(mut assets: Vec) -> Self { let mut res = Vec::with_capacity(assets.len()); @@ -747,6 +817,20 @@ impl TryFrom for WildMultiAsset { } } +impl TryFrom for WildMultiAsset { + type Error = (); + fn try_from(new: NewWildMultiAsset) -> Result { + use NewWildMultiAsset::*; + Ok(match new { + AllOf { id, fun } => Self::AllOf { id: id.try_into()?, fun: fun.try_into()? }, + AllOfCounted { id, fun, count } => + Self::AllOfCounted { id: id.try_into()?, fun: fun.try_into()?, count }, + All => Self::All, + AllCounted(count) => Self::AllCounted(count), + }) + } +} + impl TryFrom<(OldWildMultiAsset, u32)> for WildMultiAsset { type Error = (); fn try_from(old: (OldWildMultiAsset, u32)) -> Result { @@ -917,6 +1001,17 @@ impl TryFrom for MultiAssetFilter { } } +impl TryFrom for MultiAssetFilter { + type Error = (); + fn try_from(new: NewMultiAssetFilter) -> Result { + use NewMultiAssetFilter::*; + Ok(match new { + Definite(x) => Self::Definite(x.try_into()?), + Wild(x) => Self::Wild(x.try_into()?), + }) + } +} + impl TryFrom<(OldMultiAssetFilter, u32)> for MultiAssetFilter { type Error = (); fn try_from(old: (OldMultiAssetFilter, u32)) -> Result { diff --git a/polkadot/xcm/src/v3/multilocation.rs b/polkadot/xcm/src/v3/multilocation.rs index 9649b1b3207..c588b924ac7 100644 --- a/polkadot/xcm/src/v3/multilocation.rs +++ b/polkadot/xcm/src/v3/multilocation.rs @@ -17,7 +17,9 @@ //! XCM `MultiLocation` datatype. use super::{Junction, Junctions}; -use crate::{v2::MultiLocation as OldMultiLocation, VersionedMultiLocation}; +use crate::{ + v2::MultiLocation as OldMultiLocation, v4::Location as NewMultiLocation, VersionedLocation, +}; use core::{ convert::{TryFrom, TryInto}, result, @@ -74,6 +76,9 @@ pub struct MultiLocation { pub interior: Junctions, } +/// Type alias for a better transition to V4. +pub type Location = MultiLocation; + impl Default for MultiLocation { fn default() -> Self { Self { parents: 0, interior: Junctions::Here } @@ -91,9 +96,9 @@ impl MultiLocation { MultiLocation { parents, interior: interior.into() } } - /// Consume `self` and return the equivalent `VersionedMultiLocation` value. - pub const fn into_versioned(self) -> VersionedMultiLocation { - VersionedMultiLocation::V3(self) + /// Consume `self` and return the equivalent `VersionedLocation` value. + pub const fn into_versioned(self) -> VersionedLocation { + VersionedLocation::V3(self) } /// Creates a new `MultiLocation` with 0 parents and a `Here` interior. @@ -469,6 +474,23 @@ impl TryFrom for MultiLocation { } } +impl TryFrom for Option { + type Error = (); + fn try_from(new: NewMultiLocation) -> result::Result { + Ok(Some(MultiLocation::try_from(new)?)) + } +} + +impl TryFrom for MultiLocation { + type Error = (); + fn try_from(new: NewMultiLocation) -> result::Result { + Ok(MultiLocation { + parents: new.parent_count(), + interior: new.interior().clone().try_into()?, + }) + } +} + /// A unit struct which can be converted into a `MultiLocation` of `parents` value 1. #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug)] pub struct Parent; diff --git a/polkadot/xcm/src/v3/traits.rs b/polkadot/xcm/src/v3/traits.rs index 29bd40a6a2d..9e9b983fdf8 100644 --- a/polkadot/xcm/src/v3/traits.rs +++ b/polkadot/xcm/src/v3/traits.rs @@ -216,52 +216,6 @@ impl From for Error { pub type Result = result::Result<(), Error>; -/* -TODO: XCMv4 -/// Outcome of an XCM execution. -#[derive(Clone, Encode, Decode, Eq, PartialEq, Debug, TypeInfo)] -pub enum Outcome { - /// Execution completed successfully; given weight was used. - Complete { used: Weight }, - /// Execution started, but did not complete successfully due to the given error; given weight - /// was used. - Incomplete { used: Weight, error: Error }, - /// Execution did not start due to the given error. - Error { error: Error }, -} - -impl Outcome { - pub fn ensure_complete(self) -> Result { - match self { - Outcome::Complete { .. } => Ok(()), - Outcome::Incomplete { error, .. } => Err(error), - Outcome::Error { error, .. } => Err(error), - } - } - pub fn ensure_execution(self) -> result::Result { - match self { - Outcome::Complete { used, .. } => Ok(used), - Outcome::Incomplete { used, .. } => Ok(used), - Outcome::Error { error, .. } => Err(error), - } - } - /// How much weight was used by the XCM execution attempt. - pub fn weight_used(&self) -> Weight { - match self { - Outcome::Complete { used, .. } => *used, - Outcome::Incomplete { used, .. } => *used, - Outcome::Error { .. } => Weight::zero(), - } - } -} - -impl From for Outcome { - fn from(error: Error) -> Self { - Self::Error { error, maybe_id: None } - } -} -*/ - /// Outcome of an XCM execution. #[derive(Clone, Encode, Decode, Eq, PartialEq, Debug, TypeInfo)] #[scale_info(replace_segment("staging_xcm", "xcm"))] @@ -337,8 +291,6 @@ pub trait ExecuteXcm { /// /// The weight limit is a basic hard-limit and the implementation may place further /// restrictions or requirements on weight and other aspects. - // TODO: XCMv4 - // #[deprecated = "Use `prepare_and_execute` instead"] fn execute_xcm( origin: impl Into, message: Xcm, @@ -361,8 +313,6 @@ pub trait ExecuteXcm { /// /// Some amount of `weight_credit` may be provided which, depending on the implementation, may /// allow execution without associated payment. - // TODO: XCMv4 - // #[deprecated = "Use `prepare_and_execute` instead"] fn execute_xcm_in_credit( origin: impl Into, message: Xcm, diff --git a/polkadot/xcm/src/v4/asset.rs b/polkadot/xcm/src/v4/asset.rs new file mode 100644 index 00000000000..8aa1cc61437 --- /dev/null +++ b/polkadot/xcm/src/v4/asset.rs @@ -0,0 +1,915 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Cross-Consensus Message format asset data structures. +//! +//! This encompasses four types for representing assets: +//! - `Asset`: A description of a single asset, either an instance of a non-fungible or some amount +//! of a fungible. +//! - `Assets`: A collection of `Asset`s. These are stored in a `Vec` and sorted with fungibles +//! first. +//! - `Wild`: A single asset wildcard, this can either be "all" assets, or all assets of a specific +//! kind. +//! - `AssetFilter`: A combination of `Wild` and `Assets` designed for efficiently filtering an XCM +//! holding account. + +use super::{InteriorLocation, Location, Reanchorable}; +use crate::v3::{ + AssetId as OldAssetId, AssetInstance as OldAssetInstance, Fungibility as OldFungibility, + MultiAsset as OldAsset, MultiAssetFilter as OldAssetFilter, MultiAssets as OldAssets, + WildFungibility as OldWildFungibility, WildMultiAsset as OldWildAsset, +}; +use alloc::{vec, vec::Vec}; +use core::{ + cmp::Ordering, + convert::{TryFrom, TryInto}, +}; +use parity_scale_codec::{self as codec, Decode, Encode, MaxEncodedLen}; +use scale_info::TypeInfo; + +/// A general identifier for an instance of a non-fungible asset class. +#[derive( + Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, Debug, TypeInfo, MaxEncodedLen, +)] +#[cfg_attr(feature = "std", derive(serde::Serialize, serde::Deserialize))] +pub enum AssetInstance { + /// Undefined - used if the non-fungible asset class has only one instance. + Undefined, + + /// A compact index. Technically this could be greater than `u128`, but this implementation + /// supports only values up to `2**128 - 1`. + Index(#[codec(compact)] u128), + + /// A 4-byte fixed-length datum. + Array4([u8; 4]), + + /// An 8-byte fixed-length datum. + Array8([u8; 8]), + + /// A 16-byte fixed-length datum. + Array16([u8; 16]), + + /// A 32-byte fixed-length datum. + Array32([u8; 32]), +} + +impl TryFrom for AssetInstance { + type Error = (); + fn try_from(value: OldAssetInstance) -> Result { + use OldAssetInstance::*; + Ok(match value { + Undefined => Self::Undefined, + Index(n) => Self::Index(n), + Array4(n) => Self::Array4(n), + Array8(n) => Self::Array8(n), + Array16(n) => Self::Array16(n), + Array32(n) => Self::Array32(n), + }) + } +} + +impl From<()> for AssetInstance { + fn from(_: ()) -> Self { + Self::Undefined + } +} + +impl From<[u8; 4]> for AssetInstance { + fn from(x: [u8; 4]) -> Self { + Self::Array4(x) + } +} + +impl From<[u8; 8]> for AssetInstance { + fn from(x: [u8; 8]) -> Self { + Self::Array8(x) + } +} + +impl From<[u8; 16]> for AssetInstance { + fn from(x: [u8; 16]) -> Self { + Self::Array16(x) + } +} + +impl From<[u8; 32]> for AssetInstance { + fn from(x: [u8; 32]) -> Self { + Self::Array32(x) + } +} + +impl From for AssetInstance { + fn from(x: u8) -> Self { + Self::Index(x as u128) + } +} + +impl From for AssetInstance { + fn from(x: u16) -> Self { + Self::Index(x as u128) + } +} + +impl From for AssetInstance { + fn from(x: u32) -> Self { + Self::Index(x as u128) + } +} + +impl From for AssetInstance { + fn from(x: u64) -> Self { + Self::Index(x as u128) + } +} + +impl TryFrom for () { + type Error = (); + fn try_from(x: AssetInstance) -> Result { + match x { + AssetInstance::Undefined => Ok(()), + _ => Err(()), + } + } +} + +impl TryFrom for [u8; 4] { + type Error = (); + fn try_from(x: AssetInstance) -> Result { + match x { + AssetInstance::Array4(x) => Ok(x), + _ => Err(()), + } + } +} + +impl TryFrom for [u8; 8] { + type Error = (); + fn try_from(x: AssetInstance) -> Result { + match x { + AssetInstance::Array8(x) => Ok(x), + _ => Err(()), + } + } +} + +impl TryFrom for [u8; 16] { + type Error = (); + fn try_from(x: AssetInstance) -> Result { + match x { + AssetInstance::Array16(x) => Ok(x), + _ => Err(()), + } + } +} + +impl TryFrom for [u8; 32] { + type Error = (); + fn try_from(x: AssetInstance) -> Result { + match x { + AssetInstance::Array32(x) => Ok(x), + _ => Err(()), + } + } +} + +impl TryFrom for u8 { + type Error = (); + fn try_from(x: AssetInstance) -> Result { + match x { + AssetInstance::Index(x) => x.try_into().map_err(|_| ()), + _ => Err(()), + } + } +} + +impl TryFrom for u16 { + type Error = (); + fn try_from(x: AssetInstance) -> Result { + match x { + AssetInstance::Index(x) => x.try_into().map_err(|_| ()), + _ => Err(()), + } + } +} + +impl TryFrom for u32 { + type Error = (); + fn try_from(x: AssetInstance) -> Result { + match x { + AssetInstance::Index(x) => x.try_into().map_err(|_| ()), + _ => Err(()), + } + } +} + +impl TryFrom for u64 { + type Error = (); + fn try_from(x: AssetInstance) -> Result { + match x { + AssetInstance::Index(x) => x.try_into().map_err(|_| ()), + _ => Err(()), + } + } +} + +impl TryFrom for u128 { + type Error = (); + fn try_from(x: AssetInstance) -> Result { + match x { + AssetInstance::Index(x) => Ok(x), + _ => Err(()), + } + } +} + +/// Classification of whether an asset is fungible or not, along with a mandatory amount or +/// instance. +#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Debug, Encode, TypeInfo, MaxEncodedLen)] +#[cfg_attr(feature = "std", derive(serde::Serialize, serde::Deserialize))] +pub enum Fungibility { + /// A fungible asset; we record a number of units, as a `u128` in the inner item. + Fungible(#[codec(compact)] u128), + /// A non-fungible asset. We record the instance identifier in the inner item. Only one asset + /// of each instance identifier may ever be in existence at once. + NonFungible(AssetInstance), +} + +#[derive(Decode)] +enum UncheckedFungibility { + Fungible(#[codec(compact)] u128), + NonFungible(AssetInstance), +} + +impl Decode for Fungibility { + fn decode(input: &mut I) -> Result { + match UncheckedFungibility::decode(input)? { + UncheckedFungibility::Fungible(a) if a != 0 => Ok(Self::Fungible(a)), + UncheckedFungibility::NonFungible(i) => Ok(Self::NonFungible(i)), + UncheckedFungibility::Fungible(_) => + Err("Fungible asset of zero amount is not allowed".into()), + } + } +} + +impl Fungibility { + pub fn is_kind(&self, w: WildFungibility) -> bool { + use Fungibility::*; + use WildFungibility::{Fungible as WildFungible, NonFungible as WildNonFungible}; + matches!((self, w), (Fungible(_), WildFungible) | (NonFungible(_), WildNonFungible)) + } +} + +impl From for Fungibility { + fn from(amount: i32) -> Fungibility { + debug_assert_ne!(amount, 0); + Fungibility::Fungible(amount as u128) + } +} + +impl From for Fungibility { + fn from(amount: u128) -> Fungibility { + debug_assert_ne!(amount, 0); + Fungibility::Fungible(amount) + } +} + +impl> From for Fungibility { + fn from(instance: T) -> Fungibility { + Fungibility::NonFungible(instance.into()) + } +} + +impl TryFrom for Fungibility { + type Error = (); + fn try_from(value: OldFungibility) -> Result { + use OldFungibility::*; + Ok(match value { + Fungible(n) => Self::Fungible(n), + NonFungible(i) => Self::NonFungible(i.try_into()?), + }) + } +} + +/// Classification of whether an asset is fungible or not. +#[derive( + Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Debug, Encode, Decode, TypeInfo, MaxEncodedLen, +)] +#[cfg_attr(feature = "std", derive(serde::Serialize, serde::Deserialize))] +pub enum WildFungibility { + /// The asset is fungible. + Fungible, + /// The asset is not fungible. + NonFungible, +} + +impl TryFrom for WildFungibility { + type Error = (); + fn try_from(value: OldWildFungibility) -> Result { + use OldWildFungibility::*; + Ok(match value { + Fungible => Self::Fungible, + NonFungible => Self::NonFungible, + }) + } +} + +/// Location to identify an asset. +#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Debug, Encode, Decode, TypeInfo, MaxEncodedLen)] +#[cfg_attr(feature = "std", derive(serde::Serialize, serde::Deserialize))] +pub struct AssetId(pub Location); + +impl> From for AssetId { + fn from(x: T) -> Self { + Self(x.into()) + } +} + +impl TryFrom for AssetId { + type Error = (); + fn try_from(old: OldAssetId) -> Result { + use OldAssetId::*; + Ok(match old { + Concrete(l) => Self(l.try_into()?), + Abstract(_) => return Err(()), + }) + } +} + +impl AssetId { + /// Prepend a `Location` to an asset id, giving it a new root location. + pub fn prepend_with(&mut self, prepend: &Location) -> Result<(), ()> { + self.0.prepend_with(prepend.clone()).map_err(|_| ())?; + Ok(()) + } + + /// Use the value of `self` along with a `fun` fungibility specifier to create the corresponding + /// `Asset` value. + pub fn into_asset(self, fun: Fungibility) -> Asset { + Asset { fun, id: self } + } + + /// Use the value of `self` along with a `fun` fungibility specifier to create the corresponding + /// `WildAsset` wildcard (`AllOf`) value. + pub fn into_wild(self, fun: WildFungibility) -> WildAsset { + WildAsset::AllOf { fun, id: self } + } +} + +impl Reanchorable for AssetId { + type Error = (); + + /// Mutate the asset to represent the same value from the perspective of a new `target` + /// location. The local chain's location is provided in `context`. + fn reanchor(&mut self, target: &Location, context: &InteriorLocation) -> Result<(), ()> { + self.0.reanchor(target, context)?; + Ok(()) + } + + fn reanchored(mut self, target: &Location, context: &InteriorLocation) -> Result { + match self.reanchor(target, context) { + Ok(()) => Ok(self), + Err(()) => Err(()), + } + } +} + +/// Either an amount of a single fungible asset, or a single well-identified non-fungible asset. +#[derive(Clone, Eq, PartialEq, Debug, Encode, Decode, TypeInfo, MaxEncodedLen)] +#[cfg_attr(feature = "std", derive(serde::Serialize, serde::Deserialize))] +pub struct Asset { + /// The overall asset identity (aka *class*, in the case of a non-fungible). + pub id: AssetId, + /// The fungibility of the asset, which contains either the amount (in the case of a fungible + /// asset) or the *instance ID*, the secondary asset identifier. + pub fun: Fungibility, +} + +impl PartialOrd for Asset { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} + +impl Ord for Asset { + fn cmp(&self, other: &Self) -> Ordering { + match (&self.fun, &other.fun) { + (Fungibility::Fungible(..), Fungibility::NonFungible(..)) => Ordering::Less, + (Fungibility::NonFungible(..), Fungibility::Fungible(..)) => Ordering::Greater, + _ => (&self.id, &self.fun).cmp(&(&other.id, &other.fun)), + } + } +} + +impl, B: Into> From<(A, B)> for Asset { + fn from((id, fun): (A, B)) -> Asset { + Asset { fun: fun.into(), id: id.into() } + } +} + +impl Asset { + pub fn is_fungible(&self, maybe_id: Option) -> bool { + use Fungibility::*; + matches!(self.fun, Fungible(..)) && maybe_id.map_or(true, |i| i == self.id) + } + + pub fn is_non_fungible(&self, maybe_id: Option) -> bool { + use Fungibility::*; + matches!(self.fun, NonFungible(..)) && maybe_id.map_or(true, |i| i == self.id) + } + + /// Prepend a `Location` to a concrete asset, giving it a new root location. + pub fn prepend_with(&mut self, prepend: &Location) -> Result<(), ()> { + self.id.prepend_with(prepend) + } + + /// Returns true if `self` is a super-set of the given `inner` asset. + pub fn contains(&self, inner: &Asset) -> bool { + use Fungibility::*; + if self.id == inner.id { + match (&self.fun, &inner.fun) { + (Fungible(a), Fungible(i)) if a >= i => return true, + (NonFungible(a), NonFungible(i)) if a == i => return true, + _ => (), + } + } + false + } +} + +impl Reanchorable for Asset { + type Error = (); + + /// Mutate the location of the asset identifier if concrete, giving it the same location + /// relative to a `target` context. The local context is provided as `context`. + fn reanchor(&mut self, target: &Location, context: &InteriorLocation) -> Result<(), ()> { + self.id.reanchor(target, context) + } + + /// Mutate the location of the asset identifier if concrete, giving it the same location + /// relative to a `target` context. The local context is provided as `context`. + fn reanchored(mut self, target: &Location, context: &InteriorLocation) -> Result { + self.id.reanchor(target, context)?; + Ok(self) + } +} + +impl TryFrom for Asset { + type Error = (); + fn try_from(old: OldAsset) -> Result { + Ok(Self { id: old.id.try_into()?, fun: old.fun.try_into()? }) + } +} + +/// A `Vec` of `Asset`s. +/// +/// There are a number of invariants which the construction and mutation functions must ensure are +/// maintained: +/// - It may contain no items of duplicate asset class; +/// - All items must be ordered; +/// - The number of items should grow no larger than `MAX_ITEMS_IN_ASSETS`. +#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Debug, Encode, TypeInfo, Default)] +#[cfg_attr(feature = "std", derive(serde::Serialize, serde::Deserialize))] +pub struct Assets(Vec); + +/// Maximum number of items we expect in a single `Assets` value. Note this is not (yet) +/// enforced, and just serves to provide a sensible `max_encoded_len` for `Assets`. +pub const MAX_ITEMS_IN_ASSETS: usize = 20; + +impl MaxEncodedLen for Assets { + fn max_encoded_len() -> usize { + Asset::max_encoded_len() * MAX_ITEMS_IN_ASSETS + } +} + +impl Decode for Assets { + fn decode(input: &mut I) -> Result { + Self::from_sorted_and_deduplicated(Vec::::decode(input)?) + .map_err(|()| "Out of order".into()) + } +} + +impl TryFrom for Assets { + type Error = (); + fn try_from(old: OldAssets) -> Result { + let v = old + .into_inner() + .into_iter() + .map(Asset::try_from) + .collect::, ()>>()?; + Ok(Assets(v)) + } +} + +impl From> for Assets { + fn from(mut assets: Vec) -> Self { + let mut res = Vec::with_capacity(assets.len()); + if !assets.is_empty() { + assets.sort(); + let mut iter = assets.into_iter(); + if let Some(first) = iter.next() { + let last = iter.fold(first, |a, b| -> Asset { + match (a, b) { + ( + Asset { fun: Fungibility::Fungible(a_amount), id: a_id }, + Asset { fun: Fungibility::Fungible(b_amount), id: b_id }, + ) if a_id == b_id => Asset { + id: a_id, + fun: Fungibility::Fungible(a_amount.saturating_add(b_amount)), + }, + ( + Asset { fun: Fungibility::NonFungible(a_instance), id: a_id }, + Asset { fun: Fungibility::NonFungible(b_instance), id: b_id }, + ) if a_id == b_id && a_instance == b_instance => + Asset { fun: Fungibility::NonFungible(a_instance), id: a_id }, + (to_push, to_remember) => { + res.push(to_push); + to_remember + }, + } + }); + res.push(last); + } + } + Self(res) + } +} + +impl> From for Assets { + fn from(x: T) -> Self { + Self(vec![x.into()]) + } +} + +impl Assets { + /// A new (empty) value. + pub fn new() -> Self { + Self(Vec::new()) + } + + /// Create a new instance of `Assets` from a `Vec` whose contents are sorted + /// and which contain no duplicates. + /// + /// Returns `Ok` if the operation succeeds and `Err` if `r` is out of order or had duplicates. + /// If you can't guarantee that `r` is sorted and deduplicated, then use + /// `From::>::from` which is infallible. + pub fn from_sorted_and_deduplicated(r: Vec) -> Result { + if r.is_empty() { + return Ok(Self(Vec::new())) + } + r.iter().skip(1).try_fold(&r[0], |a, b| -> Result<&Asset, ()> { + if a.id < b.id || a < b && (a.is_non_fungible(None) || b.is_non_fungible(None)) { + Ok(b) + } else { + Err(()) + } + })?; + Ok(Self(r)) + } + + /// Create a new instance of `Assets` from a `Vec` whose contents are sorted + /// and which contain no duplicates. + /// + /// In release mode, this skips any checks to ensure that `r` is correct, making it a + /// negligible-cost operation. Generally though you should avoid using it unless you have a + /// strict proof that `r` is valid. + #[cfg(test)] + pub fn from_sorted_and_deduplicated_skip_checks(r: Vec) -> Self { + Self::from_sorted_and_deduplicated(r).expect("Invalid input r is not sorted/deduped") + } + /// Create a new instance of `Assets` from a `Vec` whose contents are sorted + /// and which contain no duplicates. + /// + /// In release mode, this skips any checks to ensure that `r` is correct, making it a + /// negligible-cost operation. Generally though you should avoid using it unless you have a + /// strict proof that `r` is valid. + /// + /// In test mode, this checks anyway and panics on fail. + #[cfg(not(test))] + pub fn from_sorted_and_deduplicated_skip_checks(r: Vec) -> Self { + Self(r) + } + + /// Add some asset onto the list, saturating. This is quite a laborious operation since it + /// maintains the ordering. + pub fn push(&mut self, a: Asset) { + for asset in self.0.iter_mut().filter(|x| x.id == a.id) { + match (&a.fun, &mut asset.fun) { + (Fungibility::Fungible(amount), Fungibility::Fungible(balance)) => { + *balance = balance.saturating_add(*amount); + return + }, + (Fungibility::NonFungible(inst1), Fungibility::NonFungible(inst2)) + if inst1 == inst2 => + return, + _ => (), + } + } + self.0.push(a); + self.0.sort(); + } + + /// Returns `true` if this definitely represents no asset. + pub fn is_none(&self) -> bool { + self.0.is_empty() + } + + /// Returns true if `self` is a super-set of the given `inner` asset. + pub fn contains(&self, inner: &Asset) -> bool { + self.0.iter().any(|i| i.contains(inner)) + } + + /// Consume `self` and return the inner vec. + #[deprecated = "Use `into_inner()` instead"] + pub fn drain(self) -> Vec { + self.0 + } + + /// Consume `self` and return the inner vec. + pub fn into_inner(self) -> Vec { + self.0 + } + + /// Return a reference to the inner vec. + pub fn inner(&self) -> &Vec { + &self.0 + } + + /// Return the number of distinct asset instances contained. + pub fn len(&self) -> usize { + self.0.len() + } + + /// Prepend a `Location` to any concrete asset items, giving it a new root location. + pub fn prepend_with(&mut self, prefix: &Location) -> Result<(), ()> { + self.0.iter_mut().try_for_each(|i| i.prepend_with(prefix)) + } + + /// Return a reference to an item at a specific index or `None` if it doesn't exist. + pub fn get(&self, index: usize) -> Option<&Asset> { + self.0.get(index) + } +} + +impl Reanchorable for Assets { + type Error = (); + + fn reanchor(&mut self, target: &Location, context: &InteriorLocation) -> Result<(), ()> { + self.0.iter_mut().try_for_each(|i| i.reanchor(target, context))?; + self.0.sort(); + Ok(()) + } + + fn reanchored(mut self, target: &Location, context: &InteriorLocation) -> Result { + match self.reanchor(target, context) { + Ok(()) => Ok(self), + Err(()) => Err(()), + } + } +} + +/// A wildcard representing a set of assets. +#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Debug, Encode, Decode, TypeInfo, MaxEncodedLen)] +#[cfg_attr(feature = "std", derive(serde::Serialize, serde::Deserialize))] +pub enum WildAsset { + /// All assets in Holding. + All, + /// All assets in Holding of a given fungibility and ID. + AllOf { id: AssetId, fun: WildFungibility }, + /// All assets in Holding, up to `u32` individual assets (different instances of non-fungibles + /// are separate assets). + AllCounted(#[codec(compact)] u32), + /// All assets in Holding of a given fungibility and ID up to `count` individual assets + /// (different instances of non-fungibles are separate assets). + AllOfCounted { + id: AssetId, + fun: WildFungibility, + #[codec(compact)] + count: u32, + }, +} + +impl TryFrom for WildAsset { + type Error = (); + fn try_from(old: OldWildAsset) -> Result { + use OldWildAsset::*; + Ok(match old { + AllOf { id, fun } => Self::AllOf { id: id.try_into()?, fun: fun.try_into()? }, + All => Self::All, + AllOfCounted { id, fun, count } => + Self::AllOfCounted { id: id.try_into()?, fun: fun.try_into()?, count }, + AllCounted(count) => Self::AllCounted(count), + }) + } +} + +impl WildAsset { + /// Returns true if `self` is a super-set of the given `inner` asset. + pub fn contains(&self, inner: &Asset) -> bool { + use WildAsset::*; + match self { + AllOfCounted { count: 0, .. } | AllCounted(0) => false, + AllOf { fun, id } | AllOfCounted { id, fun, .. } => + inner.fun.is_kind(*fun) && &inner.id == id, + All | AllCounted(_) => true, + } + } + + /// Returns true if the wild element of `self` matches `inner`. + /// + /// Note that for `Counted` variants of wildcards, then it will disregard the count except for + /// always returning `false` when equal to 0. + #[deprecated = "Use `contains` instead"] + pub fn matches(&self, inner: &Asset) -> bool { + self.contains(inner) + } + + /// Mutate the asset to represent the same value from the perspective of a new `target` + /// location. The local chain's location is provided in `context`. + pub fn reanchor(&mut self, target: &Location, context: &InteriorLocation) -> Result<(), ()> { + use WildAsset::*; + match self { + AllOf { ref mut id, .. } | AllOfCounted { ref mut id, .. } => + id.reanchor(target, context), + All | AllCounted(_) => Ok(()), + } + } + + /// Maximum count of assets allowed to match, if any. + pub fn count(&self) -> Option { + use WildAsset::*; + match self { + AllOfCounted { count, .. } | AllCounted(count) => Some(*count), + All | AllOf { .. } => None, + } + } + + /// Explicit limit on number of assets allowed to match, if any. + pub fn limit(&self) -> Option { + self.count() + } + + /// Consume self and return the equivalent version but counted and with the `count` set to the + /// given parameter. + pub fn counted(self, count: u32) -> Self { + use WildAsset::*; + match self { + AllOfCounted { fun, id, .. } | AllOf { fun, id } => AllOfCounted { fun, id, count }, + All | AllCounted(_) => AllCounted(count), + } + } +} + +impl, B: Into> From<(A, B)> for WildAsset { + fn from((id, fun): (A, B)) -> WildAsset { + WildAsset::AllOf { fun: fun.into(), id: id.into() } + } +} + +/// `Asset` collection, defined either by a number of `Assets` or a single wildcard. +#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Debug, Encode, Decode, TypeInfo, MaxEncodedLen)] +#[cfg_attr(feature = "std", derive(serde::Serialize, serde::Deserialize))] +pub enum AssetFilter { + /// Specify the filter as being everything contained by the given `Assets` inner. + Definite(Assets), + /// Specify the filter as the given `WildAsset` wildcard. + Wild(WildAsset), +} + +impl> From for AssetFilter { + fn from(x: T) -> Self { + Self::Wild(x.into()) + } +} + +impl From for AssetFilter { + fn from(x: Asset) -> Self { + Self::Definite(vec![x].into()) + } +} + +impl From> for AssetFilter { + fn from(x: Vec) -> Self { + Self::Definite(x.into()) + } +} + +impl From for AssetFilter { + fn from(x: Assets) -> Self { + Self::Definite(x) + } +} + +impl AssetFilter { + /// Returns true if `inner` would be matched by `self`. + /// + /// Note that for `Counted` variants of wildcards, then it will disregard the count except for + /// always returning `false` when equal to 0. + pub fn matches(&self, inner: &Asset) -> bool { + match self { + AssetFilter::Definite(ref assets) => assets.contains(inner), + AssetFilter::Wild(ref wild) => wild.contains(inner), + } + } + + /// Mutate the location of the asset identifier if concrete, giving it the same location + /// relative to a `target` context. The local context is provided as `context`. + pub fn reanchor(&mut self, target: &Location, context: &InteriorLocation) -> Result<(), ()> { + match self { + AssetFilter::Definite(ref mut assets) => assets.reanchor(target, context), + AssetFilter::Wild(ref mut wild) => wild.reanchor(target, context), + } + } + + /// Maximum count of assets it is possible to match, if known. + pub fn count(&self) -> Option { + use AssetFilter::*; + match self { + Definite(x) => Some(x.len() as u32), + Wild(x) => x.count(), + } + } + + /// Explicit limit placed on the number of items, if any. + pub fn limit(&self) -> Option { + use AssetFilter::*; + match self { + Definite(_) => None, + Wild(x) => x.limit(), + } + } +} + +impl TryFrom for AssetFilter { + type Error = (); + fn try_from(old: OldAssetFilter) -> Result { + Ok(match old { + OldAssetFilter::Definite(x) => Self::Definite(x.try_into()?), + OldAssetFilter::Wild(x) => Self::Wild(x.try_into()?), + }) + } +} + +#[cfg(test)] +mod tests { + use super::super::prelude::*; + + #[test] + fn conversion_works() { + let _: Assets = (Here, 1u128).into(); + } + + #[test] + fn from_sorted_and_deduplicated_works() { + use super::*; + use alloc::vec; + + let empty = vec![]; + let r = Assets::from_sorted_and_deduplicated(empty); + assert_eq!(r, Ok(Assets(vec![]))); + + let dup_fun = vec![(Here, 100).into(), (Here, 10).into()]; + let r = Assets::from_sorted_and_deduplicated(dup_fun); + assert!(r.is_err()); + + let dup_nft = vec![(Here, *b"notgood!").into(), (Here, *b"notgood!").into()]; + let r = Assets::from_sorted_and_deduplicated(dup_nft); + assert!(r.is_err()); + + let good_fun = vec![(Here, 10).into(), (Parent, 10).into()]; + let r = Assets::from_sorted_and_deduplicated(good_fun.clone()); + assert_eq!(r, Ok(Assets(good_fun))); + + let bad_fun = vec![(Parent, 10).into(), (Here, 10).into()]; + let r = Assets::from_sorted_and_deduplicated(bad_fun); + assert!(r.is_err()); + + let good_nft = vec![(Here, ()).into(), (Here, *b"good").into()]; + let r = Assets::from_sorted_and_deduplicated(good_nft.clone()); + assert_eq!(r, Ok(Assets(good_nft))); + + let bad_nft = vec![(Here, *b"bad!").into(), (Here, ()).into()]; + let r = Assets::from_sorted_and_deduplicated(bad_nft); + assert!(r.is_err()); + + let mixed_good = vec![(Here, 10).into(), (Here, *b"good").into()]; + let r = Assets::from_sorted_and_deduplicated(mixed_good.clone()); + assert_eq!(r, Ok(Assets(mixed_good))); + + let mixed_bad = vec![(Here, *b"bad!").into(), (Here, 10).into()]; + let r = Assets::from_sorted_and_deduplicated(mixed_bad); + assert!(r.is_err()); + } +} diff --git a/polkadot/xcm/src/v4/junction.rs b/polkadot/xcm/src/v4/junction.rs new file mode 100644 index 00000000000..b5d10484aa0 --- /dev/null +++ b/polkadot/xcm/src/v4/junction.rs @@ -0,0 +1,317 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Support data structures for `Location`, primarily the `Junction` datatype. + +use super::Location; +pub use crate::v3::{BodyId, BodyPart}; +use crate::{ + v3::{Junction as OldJunction, NetworkId as OldNetworkId}, + VersionedLocation, +}; +use bounded_collections::{BoundedSlice, BoundedVec, ConstU32}; +use core::convert::TryFrom; +use parity_scale_codec::{self, Decode, Encode, MaxEncodedLen}; +use scale_info::TypeInfo; +use serde::{Deserialize, Serialize}; + +/// A single item in a path to describe the relative location of a consensus system. +/// +/// Each item assumes a pre-existing location as its context and is defined in terms of it. +#[derive( + Copy, + Clone, + Eq, + PartialEq, + Ord, + PartialOrd, + Encode, + Decode, + Debug, + TypeInfo, + MaxEncodedLen, + Serialize, + Deserialize, +)] +pub enum Junction { + /// An indexed parachain belonging to and operated by the context. + /// + /// Generally used when the context is a Polkadot Relay-chain. + Parachain(#[codec(compact)] u32), + /// A 32-byte identifier for an account of a specific network that is respected as a sovereign + /// endpoint within the context. + /// + /// Generally used when the context is a Substrate-based chain. + AccountId32 { network: Option, id: [u8; 32] }, + /// An 8-byte index for an account of a specific network that is respected as a sovereign + /// endpoint within the context. + /// + /// May be used when the context is a Frame-based chain and includes e.g. an indices pallet. + AccountIndex64 { + network: Option, + #[codec(compact)] + index: u64, + }, + /// A 20-byte identifier for an account of a specific network that is respected as a sovereign + /// endpoint within the context. + /// + /// May be used when the context is an Ethereum or Bitcoin chain or smart-contract. + AccountKey20 { network: Option, key: [u8; 20] }, + /// An instanced, indexed pallet that forms a constituent part of the context. + /// + /// Generally used when the context is a Frame-based chain. + // TODO XCMv4 inner should be `Compact`. + PalletInstance(u8), + /// A non-descript index within the context location. + /// + /// Usage will vary widely owing to its generality. + /// + /// NOTE: Try to avoid using this and instead use a more specific item. + GeneralIndex(#[codec(compact)] u128), + /// A nondescript array datum, 32 bytes, acting as a key within the context + /// location. + /// + /// Usage will vary widely owing to its generality. + /// + /// NOTE: Try to avoid using this and instead use a more specific item. + // Note this is implemented as an array with a length rather than using `BoundedVec` owing to + // the bound for `Copy`. + GeneralKey { length: u8, data: [u8; 32] }, + /// The unambiguous child. + /// + /// Not currently used except as a fallback when deriving context. + OnlyChild, + /// A pluralistic body existing within consensus. + /// + /// Typical to be used to represent a governance origin of a chain, but could in principle be + /// used to represent things such as multisigs also. + Plurality { id: BodyId, part: BodyPart }, + /// A global network capable of externalizing its own consensus. This is not generally + /// meaningful outside of the universal level. + GlobalConsensus(NetworkId), +} + +/// A global identifier of a data structure existing within consensus. +/// +/// Maintenance note: Networks with global consensus and which are practically bridgeable within the +/// Polkadot ecosystem are given preference over explicit naming in this enumeration. +#[derive( + Copy, + Clone, + Eq, + PartialEq, + Ord, + PartialOrd, + Encode, + Decode, + Debug, + TypeInfo, + MaxEncodedLen, + Serialize, + Deserialize, +)] +pub enum NetworkId { + /// Network specified by the first 32 bytes of its genesis block. + ByGenesis([u8; 32]), + /// Network defined by the first 32-bytes of the hash and number of some block it contains. + ByFork { block_number: u64, block_hash: [u8; 32] }, + /// The Polkadot mainnet Relay-chain. + Polkadot, + /// The Kusama canary-net Relay-chain. + Kusama, + /// The Westend testnet Relay-chain. + Westend, + /// The Rococo testnet Relay-chain. + Rococo, + /// The Wococo testnet Relay-chain. + Wococo, + /// An Ethereum network specified by its chain ID. + Ethereum { + /// The EIP-155 chain ID. + #[codec(compact)] + chain_id: u64, + }, + /// The Bitcoin network, including hard-forks supported by Bitcoin Core development team. + BitcoinCore, + /// The Bitcoin network, including hard-forks supported by Bitcoin Cash developers. + BitcoinCash, + /// The Polkadot Bulletin chain. + PolkadotBulletin, +} + +impl From for Option { + fn from(old: OldNetworkId) -> Self { + Some(NetworkId::from(old)) + } +} + +impl From for NetworkId { + fn from(old: OldNetworkId) -> Self { + use OldNetworkId::*; + match old { + ByGenesis(hash) => Self::ByGenesis(hash), + ByFork { block_number, block_hash } => Self::ByFork { block_number, block_hash }, + Polkadot => Self::Polkadot, + Kusama => Self::Kusama, + Westend => Self::Westend, + Rococo => Self::Rococo, + Wococo => Self::Wococo, + Ethereum { chain_id } => Self::Ethereum { chain_id }, + BitcoinCore => Self::BitcoinCore, + BitcoinCash => Self::BitcoinCash, + PolkadotBulletin => Self::PolkadotBulletin, + } + } +} + +impl From for Junction { + fn from(n: NetworkId) -> Self { + Self::GlobalConsensus(n) + } +} + +impl From<[u8; 32]> for Junction { + fn from(id: [u8; 32]) -> Self { + Self::AccountId32 { network: None, id } + } +} + +impl From>> for Junction { + fn from(key: BoundedVec>) -> Self { + key.as_bounded_slice().into() + } +} + +impl<'a> From>> for Junction { + fn from(key: BoundedSlice<'a, u8, ConstU32<32>>) -> Self { + let mut data = [0u8; 32]; + data[..key.len()].copy_from_slice(&key[..]); + Self::GeneralKey { length: key.len() as u8, data } + } +} + +impl<'a> TryFrom<&'a Junction> for BoundedSlice<'a, u8, ConstU32<32>> { + type Error = (); + fn try_from(key: &'a Junction) -> Result { + match key { + Junction::GeneralKey { length, data } => + BoundedSlice::try_from(&data[..data.len().min(*length as usize)]).map_err(|_| ()), + _ => Err(()), + } + } +} + +impl From<[u8; 20]> for Junction { + fn from(key: [u8; 20]) -> Self { + Self::AccountKey20 { network: None, key } + } +} + +impl From for Junction { + fn from(index: u64) -> Self { + Self::AccountIndex64 { network: None, index } + } +} + +impl From for Junction { + fn from(id: u128) -> Self { + Self::GeneralIndex(id) + } +} + +impl TryFrom for Junction { + type Error = (); + fn try_from(value: OldJunction) -> Result { + use OldJunction::*; + Ok(match value { + Parachain(id) => Self::Parachain(id), + AccountId32 { network: maybe_network, id } => + Self::AccountId32 { network: maybe_network.map(|network| network.into()), id }, + AccountIndex64 { network: maybe_network, index } => + Self::AccountIndex64 { network: maybe_network.map(|network| network.into()), index }, + AccountKey20 { network: maybe_network, key } => + Self::AccountKey20 { network: maybe_network.map(|network| network.into()), key }, + PalletInstance(index) => Self::PalletInstance(index), + GeneralIndex(id) => Self::GeneralIndex(id), + GeneralKey { length, data } => Self::GeneralKey { length, data }, + OnlyChild => Self::OnlyChild, + Plurality { id, part } => Self::Plurality { id, part }, + GlobalConsensus(network) => Self::GlobalConsensus(network.into()), + }) + } +} + +impl Junction { + /// Convert `self` into a `Location` containing 0 parents. + /// + /// Similar to `Into::into`, except that this method can be used in a const evaluation context. + pub fn into_location(self) -> Location { + Location::new(0, [self]) + } + + /// Convert `self` into a `Location` containing `n` parents. + /// + /// Similar to `Self::into_location`, with the added ability to specify the number of parent + /// junctions. + pub fn into_exterior(self, n: u8) -> Location { + Location::new(n, [self]) + } + + /// Convert `self` into a `VersionedLocation` containing 0 parents. + /// + /// Similar to `Into::into`, except that this method can be used in a const evaluation context. + pub fn into_versioned(self) -> VersionedLocation { + self.into_location().into_versioned() + } + + /// Remove the `NetworkId` value. + pub fn remove_network_id(&mut self) { + use Junction::*; + match self { + AccountId32 { ref mut network, .. } | + AccountIndex64 { ref mut network, .. } | + AccountKey20 { ref mut network, .. } => *network = None, + _ => {}, + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use alloc::vec; + + #[test] + fn junction_round_trip_works() { + let j = Junction::GeneralKey { length: 32, data: [1u8; 32] }; + let k = Junction::try_from(OldJunction::try_from(j).unwrap()).unwrap(); + assert_eq!(j, k); + + let j = OldJunction::GeneralKey { length: 32, data: [1u8; 32] }; + let k = OldJunction::try_from(Junction::try_from(j).unwrap()).unwrap(); + assert_eq!(j, k); + + let j = Junction::from(BoundedVec::try_from(vec![1u8, 2, 3, 4]).unwrap()); + let k = Junction::try_from(OldJunction::try_from(j).unwrap()).unwrap(); + assert_eq!(j, k); + let s: BoundedSlice<_, _> = (&k).try_into().unwrap(); + assert_eq!(s, &[1u8, 2, 3, 4][..]); + + let j = OldJunction::GeneralKey { length: 32, data: [1u8; 32] }; + let k = OldJunction::try_from(Junction::try_from(j).unwrap()).unwrap(); + assert_eq!(j, k); + } +} diff --git a/polkadot/xcm/src/v4/junctions.rs b/polkadot/xcm/src/v4/junctions.rs new file mode 100644 index 00000000000..48712dd74c6 --- /dev/null +++ b/polkadot/xcm/src/v4/junctions.rs @@ -0,0 +1,723 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! XCM `Junctions`/`InteriorLocation` datatype. + +use super::{Junction, Location, NetworkId}; +use alloc::sync::Arc; +use core::{convert::TryFrom, mem, ops::Range, result}; +use parity_scale_codec::{Decode, Encode, MaxEncodedLen}; +use scale_info::TypeInfo; + +/// Maximum number of `Junction`s that a `Junctions` can contain. +pub(crate) const MAX_JUNCTIONS: usize = 8; + +/// Non-parent junctions that can be constructed, up to the length of 8. This specific `Junctions` +/// implementation uses a Rust `enum` in order to make pattern matching easier. +/// +/// Parent junctions cannot be constructed with this type. Refer to `Location` for +/// instructions on constructing parent junctions. +#[derive( + Clone, + Eq, + PartialEq, + Ord, + PartialOrd, + Encode, + Decode, + Debug, + TypeInfo, + MaxEncodedLen, + serde::Serialize, + serde::Deserialize, +)] +pub enum Junctions { + /// The interpreting consensus system. + Here, + /// A relative path comprising 1 junction. + X1(Arc<[Junction; 1]>), + /// A relative path comprising 2 junctions. + X2(Arc<[Junction; 2]>), + /// A relative path comprising 3 junctions. + X3(Arc<[Junction; 3]>), + /// A relative path comprising 4 junctions. + X4(Arc<[Junction; 4]>), + /// A relative path comprising 5 junctions. + X5(Arc<[Junction; 5]>), + /// A relative path comprising 6 junctions. + X6(Arc<[Junction; 6]>), + /// A relative path comprising 7 junctions. + X7(Arc<[Junction; 7]>), + /// A relative path comprising 8 junctions. + X8(Arc<[Junction; 8]>), +} + +macro_rules! impl_junctions { + ($count:expr, $variant:ident) => { + impl From<[Junction; $count]> for Junctions { + fn from(junctions: [Junction; $count]) -> Self { + Self::$variant(Arc::new(junctions)) + } + } + impl PartialEq<[Junction; $count]> for Junctions { + fn eq(&self, rhs: &[Junction; $count]) -> bool { + self.as_slice() == rhs + } + } + }; +} + +impl_junctions!(1, X1); +impl_junctions!(2, X2); +impl_junctions!(3, X3); +impl_junctions!(4, X4); +impl_junctions!(5, X5); +impl_junctions!(6, X6); +impl_junctions!(7, X7); +impl_junctions!(8, X8); + +pub struct JunctionsIterator { + junctions: Junctions, + range: Range, +} + +impl Iterator for JunctionsIterator { + type Item = Junction; + fn next(&mut self) -> Option { + self.junctions.at(self.range.next()?).cloned() + } +} + +impl DoubleEndedIterator for JunctionsIterator { + fn next_back(&mut self) -> Option { + self.junctions.at(self.range.next_back()?).cloned() + } +} + +pub struct JunctionsRefIterator<'a> { + junctions: &'a Junctions, + range: Range, +} + +impl<'a> Iterator for JunctionsRefIterator<'a> { + type Item = &'a Junction; + fn next(&mut self) -> Option<&'a Junction> { + self.junctions.at(self.range.next()?) + } +} + +impl<'a> DoubleEndedIterator for JunctionsRefIterator<'a> { + fn next_back(&mut self) -> Option<&'a Junction> { + self.junctions.at(self.range.next_back()?) + } +} +impl<'a> IntoIterator for &'a Junctions { + type Item = &'a Junction; + type IntoIter = JunctionsRefIterator<'a>; + fn into_iter(self) -> Self::IntoIter { + JunctionsRefIterator { junctions: self, range: 0..self.len() } + } +} + +impl IntoIterator for Junctions { + type Item = Junction; + type IntoIter = JunctionsIterator; + fn into_iter(self) -> Self::IntoIter { + JunctionsIterator { range: 0..self.len(), junctions: self } + } +} + +impl Junctions { + /// Convert `self` into a `Location` containing 0 parents. + /// + /// Similar to `Into::into`, except that this method can be used in a const evaluation context. + pub const fn into_location(self) -> Location { + Location { parents: 0, interior: self } + } + + /// Convert `self` into a `Location` containing `n` parents. + /// + /// Similar to `Self::into_location`, with the added ability to specify the number of parent + /// junctions. + pub const fn into_exterior(self, n: u8) -> Location { + Location { parents: n, interior: self } + } + + /// Casts `self` into a slice containing `Junction`s. + pub fn as_slice(&self) -> &[Junction] { + match self { + Junctions::Here => &[], + Junctions::X1(ref a) => &a[..], + Junctions::X2(ref a) => &a[..], + Junctions::X3(ref a) => &a[..], + Junctions::X4(ref a) => &a[..], + Junctions::X5(ref a) => &a[..], + Junctions::X6(ref a) => &a[..], + Junctions::X7(ref a) => &a[..], + Junctions::X8(ref a) => &a[..], + } + } + + /// Casts `self` into a mutable slice containing `Junction`s. + pub fn as_slice_mut(&mut self) -> &mut [Junction] { + match self { + Junctions::Here => &mut [], + Junctions::X1(ref mut a) => &mut Arc::make_mut(a)[..], + Junctions::X2(ref mut a) => &mut Arc::make_mut(a)[..], + Junctions::X3(ref mut a) => &mut Arc::make_mut(a)[..], + Junctions::X4(ref mut a) => &mut Arc::make_mut(a)[..], + Junctions::X5(ref mut a) => &mut Arc::make_mut(a)[..], + Junctions::X6(ref mut a) => &mut Arc::make_mut(a)[..], + Junctions::X7(ref mut a) => &mut Arc::make_mut(a)[..], + Junctions::X8(ref mut a) => &mut Arc::make_mut(a)[..], + } + } + + /// Remove the `NetworkId` value in any `Junction`s. + pub fn remove_network_id(&mut self) { + self.for_each_mut(Junction::remove_network_id); + } + + /// Treating `self` as the universal context, return the location of the local consensus system + /// from the point of view of the given `target`. + pub fn invert_target(&self, target: &Location) -> Result { + let mut itself = self.clone(); + let mut junctions = Self::Here; + for _ in 0..target.parent_count() { + junctions = junctions + .pushed_front_with(itself.take_last().unwrap_or(Junction::OnlyChild)) + .map_err(|_| ())?; + } + let parents = target.interior().len() as u8; + Ok(Location::new(parents, junctions)) + } + + /// Execute a function `f` on every junction. We use this since we cannot implement a mutable + /// `Iterator` without unsafe code. + pub fn for_each_mut(&mut self, x: impl FnMut(&mut Junction)) { + self.as_slice_mut().iter_mut().for_each(x) + } + + /// Extract the network ID treating this value as a universal location. + /// + /// This will return an `Err` if the first item is not a `GlobalConsensus`, which would indicate + /// that this value is not a universal location. + pub fn global_consensus(&self) -> Result { + if let Some(Junction::GlobalConsensus(network)) = self.first() { + Ok(*network) + } else { + Err(()) + } + } + + /// Extract the network ID and the interior consensus location, treating this value as a + /// universal location. + /// + /// This will return an `Err` if the first item is not a `GlobalConsensus`, which would indicate + /// that this value is not a universal location. + pub fn split_global(self) -> Result<(NetworkId, Junctions), ()> { + match self.split_first() { + (location, Some(Junction::GlobalConsensus(network))) => Ok((network, location)), + _ => return Err(()), + } + } + + /// Treat `self` as a universal location and the context of `relative`, returning the universal + /// location of relative. + /// + /// This will return an error if `relative` has as many (or more) parents than there are + /// junctions in `self`, implying that relative refers into a different global consensus. + pub fn within_global(mut self, relative: Location) -> Result { + if self.len() <= relative.parent_count() as usize { + return Err(()) + } + for _ in 0..relative.parent_count() { + self.take_last(); + } + for j in relative.interior() { + self.push(*j).map_err(|_| ())?; + } + Ok(self) + } + + /// Consumes `self` and returns how `viewer` would address it locally. + pub fn relative_to(mut self, viewer: &Junctions) -> Location { + let mut i = 0; + while match (self.first(), viewer.at(i)) { + (Some(x), Some(y)) => x == y, + _ => false, + } { + self = self.split_first().0; + // NOTE: Cannot overflow as loop can only iterate at most `MAX_JUNCTIONS` times. + i += 1; + } + // AUDIT NOTES: + // - above loop ensures that `i <= viewer.len()`. + // - `viewer.len()` is at most `MAX_JUNCTIONS`, so won't overflow a `u8`. + Location::new((viewer.len() - i) as u8, self) + } + + /// Returns first junction, or `None` if the location is empty. + pub fn first(&self) -> Option<&Junction> { + self.as_slice().first() + } + + /// Returns last junction, or `None` if the location is empty. + pub fn last(&self) -> Option<&Junction> { + self.as_slice().last() + } + + /// Splits off the first junction, returning the remaining suffix (first item in tuple) and the + /// first element (second item in tuple) or `None` if it was empty. + pub fn split_first(self) -> (Junctions, Option) { + match self { + Junctions::Here => (Junctions::Here, None), + Junctions::X1(xs) => { + let [a] = *xs; + (Junctions::Here, Some(a)) + }, + Junctions::X2(xs) => { + let [a, b] = *xs; + ([b].into(), Some(a)) + }, + Junctions::X3(xs) => { + let [a, b, c] = *xs; + ([b, c].into(), Some(a)) + }, + Junctions::X4(xs) => { + let [a, b, c, d] = *xs; + ([b, c, d].into(), Some(a)) + }, + Junctions::X5(xs) => { + let [a, b, c, d, e] = *xs; + ([b, c, d, e].into(), Some(a)) + }, + Junctions::X6(xs) => { + let [a, b, c, d, e, f] = *xs; + ([b, c, d, e, f].into(), Some(a)) + }, + Junctions::X7(xs) => { + let [a, b, c, d, e, f, g] = *xs; + ([b, c, d, e, f, g].into(), Some(a)) + }, + Junctions::X8(xs) => { + let [a, b, c, d, e, f, g, h] = *xs; + ([b, c, d, e, f, g, h].into(), Some(a)) + }, + } + } + + /// Splits off the last junction, returning the remaining prefix (first item in tuple) and the + /// last element (second item in tuple) or `None` if it was empty. + pub fn split_last(self) -> (Junctions, Option) { + match self { + Junctions::Here => (Junctions::Here, None), + Junctions::X1(xs) => { + let [a] = *xs; + (Junctions::Here, Some(a)) + }, + Junctions::X2(xs) => { + let [a, b] = *xs; + ([a].into(), Some(b)) + }, + Junctions::X3(xs) => { + let [a, b, c] = *xs; + ([a, b].into(), Some(c)) + }, + Junctions::X4(xs) => { + let [a, b, c, d] = *xs; + ([a, b, c].into(), Some(d)) + }, + Junctions::X5(xs) => { + let [a, b, c, d, e] = *xs; + ([a, b, c, d].into(), Some(e)) + }, + Junctions::X6(xs) => { + let [a, b, c, d, e, f] = *xs; + ([a, b, c, d, e].into(), Some(f)) + }, + Junctions::X7(xs) => { + let [a, b, c, d, e, f, g] = *xs; + ([a, b, c, d, e, f].into(), Some(g)) + }, + Junctions::X8(xs) => { + let [a, b, c, d, e, f, g, h] = *xs; + ([a, b, c, d, e, f, g].into(), Some(h)) + }, + } + } + + /// Removes the first element from `self`, returning it (or `None` if it was empty). + pub fn take_first(&mut self) -> Option { + let mut d = Junctions::Here; + mem::swap(&mut *self, &mut d); + let (tail, head) = d.split_first(); + *self = tail; + head + } + + /// Removes the last element from `self`, returning it (or `None` if it was empty). + pub fn take_last(&mut self) -> Option { + let mut d = Junctions::Here; + mem::swap(&mut *self, &mut d); + let (head, tail) = d.split_last(); + *self = head; + tail + } + + /// Mutates `self` to be appended with `new` or returns an `Err` with `new` if would overflow. + pub fn push(&mut self, new: impl Into) -> result::Result<(), Junction> { + let new = new.into(); + let mut dummy = Junctions::Here; + mem::swap(self, &mut dummy); + match dummy.pushed_with(new) { + Ok(s) => { + *self = s; + Ok(()) + }, + Err((s, j)) => { + *self = s; + Err(j) + }, + } + } + + /// Mutates `self` to be prepended with `new` or returns an `Err` with `new` if would overflow. + pub fn push_front(&mut self, new: impl Into) -> result::Result<(), Junction> { + let new = new.into(); + let mut dummy = Junctions::Here; + mem::swap(self, &mut dummy); + match dummy.pushed_front_with(new) { + Ok(s) => { + *self = s; + Ok(()) + }, + Err((s, j)) => { + *self = s; + Err(j) + }, + } + } + + /// Consumes `self` and returns a `Junctions` suffixed with `new`, or an `Err` with the + /// original value of `self` and `new` in case of overflow. + pub fn pushed_with(self, new: impl Into) -> result::Result { + let new = new.into(); + Ok(match self { + Junctions::Here => [new].into(), + Junctions::X1(xs) => { + let [a] = *xs; + [a, new].into() + }, + Junctions::X2(xs) => { + let [a, b] = *xs; + [a, b, new].into() + }, + Junctions::X3(xs) => { + let [a, b, c] = *xs; + [a, b, c, new].into() + }, + Junctions::X4(xs) => { + let [a, b, c, d] = *xs; + [a, b, c, d, new].into() + }, + Junctions::X5(xs) => { + let [a, b, c, d, e] = *xs; + [a, b, c, d, e, new].into() + }, + Junctions::X6(xs) => { + let [a, b, c, d, e, f] = *xs; + [a, b, c, d, e, f, new].into() + }, + Junctions::X7(xs) => { + let [a, b, c, d, e, f, g] = *xs; + [a, b, c, d, e, f, g, new].into() + }, + s => Err((s, new))?, + }) + } + + /// Consumes `self` and returns a `Junctions` prefixed with `new`, or an `Err` with the + /// original value of `self` and `new` in case of overflow. + pub fn pushed_front_with( + self, + new: impl Into, + ) -> result::Result { + let new = new.into(); + Ok(match self { + Junctions::Here => [new].into(), + Junctions::X1(xs) => { + let [a] = *xs; + [new, a].into() + }, + Junctions::X2(xs) => { + let [a, b] = *xs; + [new, a, b].into() + }, + Junctions::X3(xs) => { + let [a, b, c] = *xs; + [new, a, b, c].into() + }, + Junctions::X4(xs) => { + let [a, b, c, d] = *xs; + [new, a, b, c, d].into() + }, + Junctions::X5(xs) => { + let [a, b, c, d, e] = *xs; + [new, a, b, c, d, e].into() + }, + Junctions::X6(xs) => { + let [a, b, c, d, e, f] = *xs; + [new, a, b, c, d, e, f].into() + }, + Junctions::X7(xs) => { + let [a, b, c, d, e, f, g] = *xs; + [new, a, b, c, d, e, f, g].into() + }, + s => Err((s, new))?, + }) + } + + /// Mutate `self` so that it is suffixed with `suffix`. + /// + /// Does not modify `self` and returns `Err` with `suffix` in case of overflow. + /// + /// # Example + /// ```rust + /// # use staging_xcm::v4::{Junctions, Junction::*, Location}; + /// # fn main() { + /// let mut m = Junctions::from([Parachain(21)]); + /// assert_eq!(m.append_with([PalletInstance(3)]), Ok(())); + /// assert_eq!(m, [Parachain(21), PalletInstance(3)]); + /// # } + /// ``` + pub fn append_with(&mut self, suffix: impl Into) -> Result<(), Junctions> { + let suffix = suffix.into(); + if self.len().saturating_add(suffix.len()) > MAX_JUNCTIONS { + return Err(suffix) + } + for j in suffix.into_iter() { + self.push(j).expect("Already checked the sum of the len()s; qed") + } + Ok(()) + } + + /// Returns the number of junctions in `self`. + pub fn len(&self) -> usize { + self.as_slice().len() + } + + /// Returns the junction at index `i`, or `None` if the location doesn't contain that many + /// elements. + pub fn at(&self, i: usize) -> Option<&Junction> { + self.as_slice().get(i) + } + + /// Returns a mutable reference to the junction at index `i`, or `None` if the location doesn't + /// contain that many elements. + pub fn at_mut(&mut self, i: usize) -> Option<&mut Junction> { + self.as_slice_mut().get_mut(i) + } + + /// Returns a reference iterator over the junctions. + pub fn iter(&self) -> JunctionsRefIterator { + JunctionsRefIterator { junctions: self, range: 0..self.len() } + } + + /// Ensures that self begins with `prefix` and that it has a single `Junction` item following. + /// If so, returns a reference to this `Junction` item. + /// + /// # Example + /// ```rust + /// # use staging_xcm::v4::{Junctions, Junction::*}; + /// # fn main() { + /// let mut m = Junctions::from([Parachain(2), PalletInstance(3), OnlyChild]); + /// assert_eq!(m.match_and_split(&[Parachain(2), PalletInstance(3)].into()), Some(&OnlyChild)); + /// assert_eq!(m.match_and_split(&[Parachain(2)].into()), None); + /// # } + /// ``` + pub fn match_and_split(&self, prefix: &Junctions) -> Option<&Junction> { + if prefix.len() + 1 != self.len() { + return None + } + for i in 0..prefix.len() { + if prefix.at(i) != self.at(i) { + return None + } + } + return self.at(prefix.len()) + } + + pub fn starts_with(&self, prefix: &Junctions) -> bool { + prefix.len() <= self.len() && prefix.iter().zip(self.iter()).all(|(x, y)| x == y) + } +} + +impl TryFrom for Junctions { + type Error = Location; + fn try_from(x: Location) -> result::Result { + if x.parent_count() > 0 { + Err(x) + } else { + Ok(x.interior().clone()) + } + } +} + +impl> From for Junctions { + fn from(x: T) -> Self { + [x.into()].into() + } +} + +impl From<[Junction; 0]> for Junctions { + fn from(_: [Junction; 0]) -> Self { + Self::Here + } +} + +impl From<()> for Junctions { + fn from(_: ()) -> Self { + Self::Here + } +} + +xcm_procedural::impl_conversion_functions_for_junctions_v4!(); + +#[cfg(test)] +mod tests { + use super::{super::prelude::*, *}; + + #[test] + fn inverting_works() { + let context: InteriorLocation = (Parachain(1000), PalletInstance(42)).into(); + let target = (Parent, PalletInstance(69)).into(); + let expected = (Parent, PalletInstance(42)).into(); + let inverted = context.invert_target(&target).unwrap(); + assert_eq!(inverted, expected); + + let context: InteriorLocation = + (Parachain(1000), PalletInstance(42), GeneralIndex(1)).into(); + let target = (Parent, Parent, PalletInstance(69), GeneralIndex(2)).into(); + let expected = (Parent, Parent, PalletInstance(42), GeneralIndex(1)).into(); + let inverted = context.invert_target(&target).unwrap(); + assert_eq!(inverted, expected); + } + + #[test] + fn relative_to_works() { + use NetworkId::*; + assert_eq!( + Junctions::from([Polkadot.into()]).relative_to(&Junctions::from([Kusama.into()])), + (Parent, Polkadot).into() + ); + let base = Junctions::from([Kusama.into(), Parachain(1), PalletInstance(1)]); + + // Ancestors. + assert_eq!(Here.relative_to(&base), (Parent, Parent, Parent).into()); + assert_eq!(Junctions::from([Kusama.into()]).relative_to(&base), (Parent, Parent).into()); + assert_eq!( + Junctions::from([Kusama.into(), Parachain(1)]).relative_to(&base), + (Parent,).into() + ); + assert_eq!( + Junctions::from([Kusama.into(), Parachain(1), PalletInstance(1)]).relative_to(&base), + Here.into() + ); + + // Ancestors with one child. + assert_eq!( + Junctions::from([Polkadot.into()]).relative_to(&base), + (Parent, Parent, Parent, Polkadot).into() + ); + assert_eq!( + Junctions::from([Kusama.into(), Parachain(2)]).relative_to(&base), + (Parent, Parent, Parachain(2)).into() + ); + assert_eq!( + Junctions::from([Kusama.into(), Parachain(1), PalletInstance(2)]).relative_to(&base), + (Parent, PalletInstance(2)).into() + ); + assert_eq!( + Junctions::from([Kusama.into(), Parachain(1), PalletInstance(1), [1u8; 32].into()]) + .relative_to(&base), + ([1u8; 32],).into() + ); + + // Ancestors with grandchildren. + assert_eq!( + Junctions::from([Polkadot.into(), Parachain(1)]).relative_to(&base), + (Parent, Parent, Parent, Polkadot, Parachain(1)).into() + ); + assert_eq!( + Junctions::from([Kusama.into(), Parachain(2), PalletInstance(1)]).relative_to(&base), + (Parent, Parent, Parachain(2), PalletInstance(1)).into() + ); + assert_eq!( + Junctions::from([Kusama.into(), Parachain(1), PalletInstance(2), [1u8; 32].into()]) + .relative_to(&base), + (Parent, PalletInstance(2), [1u8; 32]).into() + ); + assert_eq!( + Junctions::from([ + Kusama.into(), + Parachain(1), + PalletInstance(1), + [1u8; 32].into(), + 1u128.into() + ]) + .relative_to(&base), + ([1u8; 32], 1u128).into() + ); + } + + #[test] + fn global_consensus_works() { + use NetworkId::*; + assert_eq!(Junctions::from([Polkadot.into()]).global_consensus(), Ok(Polkadot)); + assert_eq!(Junctions::from([Kusama.into(), 1u64.into()]).global_consensus(), Ok(Kusama)); + assert_eq!(Here.global_consensus(), Err(())); + assert_eq!(Junctions::from([1u64.into()]).global_consensus(), Err(())); + assert_eq!(Junctions::from([1u64.into(), Kusama.into()]).global_consensus(), Err(())); + } + + #[test] + fn test_conversion() { + use super::{Junction::*, NetworkId::*}; + let x: Junctions = GlobalConsensus(Polkadot).into(); + assert_eq!(x, Junctions::from([GlobalConsensus(Polkadot)])); + let x: Junctions = Polkadot.into(); + assert_eq!(x, Junctions::from([GlobalConsensus(Polkadot)])); + let x: Junctions = (Polkadot, Kusama).into(); + assert_eq!(x, Junctions::from([GlobalConsensus(Polkadot), GlobalConsensus(Kusama)])); + } + + #[test] + fn encode_decode_junctions_works() { + let original = Junctions::from([ + Polkadot.into(), + Kusama.into(), + 1u64.into(), + GlobalConsensus(Polkadot), + Parachain(123), + PalletInstance(45), + ]); + let encoded = original.encode(); + assert_eq!(encoded, &[6, 9, 2, 9, 3, 2, 0, 4, 9, 2, 0, 237, 1, 4, 45]); + let decoded = Junctions::decode(&mut &encoded[..]).unwrap(); + assert_eq!(decoded, original); + } +} diff --git a/polkadot/xcm/src/v4/location.rs b/polkadot/xcm/src/v4/location.rs new file mode 100644 index 00000000000..db55c3d3034 --- /dev/null +++ b/polkadot/xcm/src/v4/location.rs @@ -0,0 +1,746 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! XCM `Location` datatype. + +use super::{traits::Reanchorable, Junction, Junctions}; +use crate::{v3::MultiLocation as OldLocation, VersionedLocation}; +use core::{ + convert::{TryFrom, TryInto}, + result, +}; +use parity_scale_codec::{Decode, Encode, MaxEncodedLen}; +use scale_info::TypeInfo; + +/// A relative path between state-bearing consensus systems. +/// +/// A location in a consensus system is defined as an *isolatable state machine* held within global +/// consensus. The location in question need not have a sophisticated consensus algorithm of its +/// own; a single account within Ethereum, for example, could be considered a location. +/// +/// A very-much non-exhaustive list of types of location include: +/// - A (normal, layer-1) block chain, e.g. the Bitcoin mainnet or a parachain. +/// - A layer-0 super-chain, e.g. the Polkadot Relay chain. +/// - A layer-2 smart contract, e.g. an ERC-20 on Ethereum. +/// - A logical functional component of a chain, e.g. a single instance of a pallet on a Frame-based +/// Substrate chain. +/// - An account. +/// +/// A `Location` is a *relative identifier*, meaning that it can only be used to define the +/// relative path between two locations, and cannot generally be used to refer to a location +/// universally. It is comprised of an integer number of parents specifying the number of times to +/// "escape" upwards into the containing consensus system and then a number of *junctions*, each +/// diving down and specifying some interior portion of state (which may be considered a +/// "sub-consensus" system). +/// +/// This specific `Location` implementation uses a `Junctions` datatype which is a Rust `enum` +/// in order to make pattern matching easier. There are occasions where it is important to ensure +/// that a value is strictly an interior location, in those cases, `Junctions` may be used. +/// +/// The `Location` value of `Null` simply refers to the interpreting consensus system. +#[derive( + Clone, + Decode, + Encode, + Eq, + PartialEq, + Ord, + PartialOrd, + Debug, + TypeInfo, + MaxEncodedLen, + serde::Serialize, + serde::Deserialize, +)] +pub struct Location { + /// The number of parent junctions at the beginning of this `Location`. + pub parents: u8, + /// The interior (i.e. non-parent) junctions that this `Location` contains. + pub interior: Junctions, +} + +impl Default for Location { + fn default() -> Self { + Self { parents: 0, interior: Junctions::Here } + } +} + +/// A relative location which is constrained to be an interior location of the context. +/// +/// See also `Location`. +pub type InteriorLocation = Junctions; + +impl Location { + /// Creates a new `Location` with the given number of parents and interior junctions. + pub fn new(parents: u8, interior: impl Into) -> Location { + Location { parents, interior: interior.into() } + } + + /// Consume `self` and return the equivalent `VersionedLocation` value. + pub const fn into_versioned(self) -> VersionedLocation { + VersionedLocation::V4(self) + } + + /// Creates a new `Location` with 0 parents and a `Here` interior. + /// + /// The resulting `Location` can be interpreted as the "current consensus system". + pub const fn here() -> Location { + Location { parents: 0, interior: Junctions::Here } + } + + /// Creates a new `Location` which evaluates to the parent context. + pub const fn parent() -> Location { + Location { parents: 1, interior: Junctions::Here } + } + + /// Creates a new `Location` with `parents` and an empty (`Here`) interior. + pub const fn ancestor(parents: u8) -> Location { + Location { parents, interior: Junctions::Here } + } + + /// Whether the `Location` has no parents and has a `Here` interior. + pub fn is_here(&self) -> bool { + self.parents == 0 && self.interior.len() == 0 + } + + /// Remove the `NetworkId` value in any interior `Junction`s. + pub fn remove_network_id(&mut self) { + self.interior.remove_network_id(); + } + + /// Return a reference to the interior field. + pub fn interior(&self) -> &Junctions { + &self.interior + } + + /// Return a mutable reference to the interior field. + pub fn interior_mut(&mut self) -> &mut Junctions { + &mut self.interior + } + + /// Returns the number of `Parent` junctions at the beginning of `self`. + pub const fn parent_count(&self) -> u8 { + self.parents + } + + /// Returns the parent count and the interior [`Junctions`] as a tuple. + /// + /// To be used when pattern matching, for example: + /// + /// ```rust + /// # use staging_xcm::v4::{Junctions::*, Junction::*, Location}; + /// fn get_parachain_id(loc: &Location) -> Option { + /// match loc.unpack() { + /// (0, [Parachain(id)]) => Some(*id), + /// _ => None + /// } + /// } + /// ``` + pub fn unpack(&self) -> (u8, &[Junction]) { + (self.parents, self.interior.as_slice()) + } + + /// Returns boolean indicating whether `self` contains only the specified amount of + /// parents and no interior junctions. + pub const fn contains_parents_only(&self, count: u8) -> bool { + matches!(self.interior, Junctions::Here) && self.parents == count + } + + /// Returns the number of parents and junctions in `self`. + pub fn len(&self) -> usize { + self.parent_count() as usize + self.interior.len() + } + + /// Returns the first interior junction, or `None` if the location is empty or contains only + /// parents. + pub fn first_interior(&self) -> Option<&Junction> { + self.interior.first() + } + + /// Returns last junction, or `None` if the location is empty or contains only parents. + pub fn last(&self) -> Option<&Junction> { + self.interior.last() + } + + /// Splits off the first interior junction, returning the remaining suffix (first item in tuple) + /// and the first element (second item in tuple) or `None` if it was empty. + pub fn split_first_interior(self) -> (Location, Option) { + let Location { parents, interior: junctions } = self; + let (suffix, first) = junctions.split_first(); + let location = Location { parents, interior: suffix }; + (location, first) + } + + /// Splits off the last interior junction, returning the remaining prefix (first item in tuple) + /// and the last element (second item in tuple) or `None` if it was empty or if `self` only + /// contains parents. + pub fn split_last_interior(self) -> (Location, Option) { + let Location { parents, interior: junctions } = self; + let (prefix, last) = junctions.split_last(); + let location = Location { parents, interior: prefix }; + (location, last) + } + + /// Mutates `self`, suffixing its interior junctions with `new`. Returns `Err` with `new` in + /// case of overflow. + pub fn push_interior(&mut self, new: impl Into) -> result::Result<(), Junction> { + self.interior.push(new) + } + + /// Mutates `self`, prefixing its interior junctions with `new`. Returns `Err` with `new` in + /// case of overflow. + pub fn push_front_interior( + &mut self, + new: impl Into, + ) -> result::Result<(), Junction> { + self.interior.push_front(new) + } + + /// Consumes `self` and returns a `Location` suffixed with `new`, or an `Err` with + /// theoriginal value of `self` in case of overflow. + pub fn pushed_with_interior( + self, + new: impl Into, + ) -> result::Result { + match self.interior.pushed_with(new) { + Ok(i) => Ok(Location { interior: i, parents: self.parents }), + Err((i, j)) => Err((Location { interior: i, parents: self.parents }, j)), + } + } + + /// Consumes `self` and returns a `Location` prefixed with `new`, or an `Err` with the + /// original value of `self` in case of overflow. + pub fn pushed_front_with_interior( + self, + new: impl Into, + ) -> result::Result { + match self.interior.pushed_front_with(new) { + Ok(i) => Ok(Location { interior: i, parents: self.parents }), + Err((i, j)) => Err((Location { interior: i, parents: self.parents }, j)), + } + } + + /// Returns the junction at index `i`, or `None` if the location is a parent or if the location + /// does not contain that many elements. + pub fn at(&self, i: usize) -> Option<&Junction> { + let num_parents = self.parents as usize; + if i < num_parents { + return None + } + self.interior.at(i - num_parents) + } + + /// Returns a mutable reference to the junction at index `i`, or `None` if the location is a + /// parent or if it doesn't contain that many elements. + pub fn at_mut(&mut self, i: usize) -> Option<&mut Junction> { + let num_parents = self.parents as usize; + if i < num_parents { + return None + } + self.interior.at_mut(i - num_parents) + } + + /// Decrements the parent count by 1. + pub fn dec_parent(&mut self) { + self.parents = self.parents.saturating_sub(1); + } + + /// Removes the first interior junction from `self`, returning it + /// (or `None` if it was empty or if `self` contains only parents). + pub fn take_first_interior(&mut self) -> Option { + self.interior.take_first() + } + + /// Removes the last element from `interior`, returning it (or `None` if it was empty or if + /// `self` only contains parents). + pub fn take_last(&mut self) -> Option { + self.interior.take_last() + } + + /// Ensures that `self` has the same number of parents as `prefix`, its junctions begins with + /// the junctions of `prefix` and that it has a single `Junction` item following. + /// If so, returns a reference to this `Junction` item. + /// + /// # Example + /// ```rust + /// # use staging_xcm::v4::{Junctions::*, Junction::*, Location}; + /// # fn main() { + /// let mut m = Location::new(1, [PalletInstance(3), OnlyChild]); + /// assert_eq!( + /// m.match_and_split(&Location::new(1, [PalletInstance(3)])), + /// Some(&OnlyChild), + /// ); + /// assert_eq!(m.match_and_split(&Location::new(1, Here)), None); + /// # } + /// ``` + pub fn match_and_split(&self, prefix: &Location) -> Option<&Junction> { + if self.parents != prefix.parents { + return None + } + self.interior.match_and_split(&prefix.interior) + } + + pub fn starts_with(&self, prefix: &Location) -> bool { + self.parents == prefix.parents && self.interior.starts_with(&prefix.interior) + } + + /// Mutate `self` so that it is suffixed with `suffix`. + /// + /// Does not modify `self` and returns `Err` with `suffix` in case of overflow. + /// + /// # Example + /// ```rust + /// # use staging_xcm::v4::{Junctions::*, Junction::*, Location, Parent}; + /// # fn main() { + /// let mut m: Location = (Parent, Parachain(21), 69u64).into(); + /// assert_eq!(m.append_with((Parent, PalletInstance(3))), Ok(())); + /// assert_eq!(m, Location::new(1, [Parachain(21), PalletInstance(3)])); + /// # } + /// ``` + pub fn append_with(&mut self, suffix: impl Into) -> Result<(), Self> { + let prefix = core::mem::replace(self, suffix.into()); + match self.prepend_with(prefix) { + Ok(()) => Ok(()), + Err(prefix) => Err(core::mem::replace(self, prefix)), + } + } + + /// Consume `self` and return its value suffixed with `suffix`. + /// + /// Returns `Err` with the original value of `self` and `suffix` in case of overflow. + /// + /// # Example + /// ```rust + /// # use staging_xcm::v4::{Junctions::*, Junction::*, Location, Parent}; + /// # fn main() { + /// let mut m: Location = (Parent, Parachain(21), 69u64).into(); + /// let r = m.appended_with((Parent, PalletInstance(3))).unwrap(); + /// assert_eq!(r, Location::new(1, [Parachain(21), PalletInstance(3)])); + /// # } + /// ``` + pub fn appended_with(mut self, suffix: impl Into) -> Result { + match self.append_with(suffix) { + Ok(()) => Ok(self), + Err(suffix) => Err((self, suffix)), + } + } + + /// Mutate `self` so that it is prefixed with `prefix`. + /// + /// Does not modify `self` and returns `Err` with `prefix` in case of overflow. + /// + /// # Example + /// ```rust + /// # use staging_xcm::v4::{Junctions::*, Junction::*, Location, Parent}; + /// # fn main() { + /// let mut m: Location = (Parent, Parent, PalletInstance(3)).into(); + /// assert_eq!(m.prepend_with((Parent, Parachain(21), OnlyChild)), Ok(())); + /// assert_eq!(m, Location::new(1, [PalletInstance(3)])); + /// # } + /// ``` + pub fn prepend_with(&mut self, prefix: impl Into) -> Result<(), Self> { + // prefix self (suffix) + // P .. P I .. I p .. p i .. i + let mut prefix = prefix.into(); + let prepend_interior = prefix.interior.len().saturating_sub(self.parents as usize); + let final_interior = self.interior.len().saturating_add(prepend_interior); + if final_interior > super::junctions::MAX_JUNCTIONS { + return Err(prefix) + } + let suffix_parents = (self.parents as usize).saturating_sub(prefix.interior.len()); + let final_parents = (prefix.parents as usize).saturating_add(suffix_parents); + if final_parents > 255 { + return Err(prefix) + } + + // cancel out the final item on the prefix interior for one of the suffix's parents. + while self.parents > 0 && prefix.take_last().is_some() { + self.dec_parent(); + } + + // now we have either removed all suffix's parents or prefix interior. + // this means we can combine the prefix's and suffix's remaining parents/interior since + // we know that with at least one empty, the overall order will be respected: + // prefix self (suffix) + // P .. P (I) p .. p i .. i => P + p .. (no I) i + // -- or -- + // P .. P I .. I (p) i .. i => P (no p) .. I + i + + self.parents = self.parents.saturating_add(prefix.parents); + for j in prefix.interior.into_iter().rev() { + self.push_front_interior(j) + .expect("final_interior no greater than MAX_JUNCTIONS; qed"); + } + Ok(()) + } + + /// Consume `self` and return its value prefixed with `prefix`. + /// + /// Returns `Err` with the original value of `self` and `prefix` in case of overflow. + /// + /// # Example + /// ```rust + /// # use staging_xcm::v4::{Junctions::*, Junction::*, Location, Parent}; + /// # fn main() { + /// let m: Location = (Parent, Parent, PalletInstance(3)).into(); + /// let r = m.prepended_with((Parent, Parachain(21), OnlyChild)).unwrap(); + /// assert_eq!(r, Location::new(1, [PalletInstance(3)])); + /// # } + /// ``` + pub fn prepended_with(mut self, prefix: impl Into) -> Result { + match self.prepend_with(prefix) { + Ok(()) => Ok(self), + Err(prefix) => Err((self, prefix)), + } + } + + /// Remove any unneeded parents/junctions in `self` based on the given context it will be + /// interpreted in. + pub fn simplify(&mut self, context: &Junctions) { + if context.len() < self.parents as usize { + // Not enough context + return + } + while self.parents > 0 { + let maybe = context.at(context.len() - (self.parents as usize)); + match (self.interior.first(), maybe) { + (Some(i), Some(j)) if i == j => { + self.interior.take_first(); + self.parents -= 1; + }, + _ => break, + } + } + } + + /// Return the Location subsection identifying the chain that `self` points to. + pub fn chain_location(&self) -> Location { + let mut clone = self.clone(); + // start popping junctions until we reach chain identifier + while let Some(j) = clone.last() { + if matches!(j, Junction::Parachain(_) | Junction::GlobalConsensus(_)) { + // return chain subsection + return clone + } else { + (clone, _) = clone.split_last_interior(); + } + } + Location::new(clone.parents, Junctions::Here) + } +} + +impl Reanchorable for Location { + type Error = Self; + + /// Mutate `self` so that it represents the same location from the point of view of `target`. + /// The context of `self` is provided as `context`. + /// + /// Does not modify `self` in case of overflow. + fn reanchor(&mut self, target: &Location, context: &InteriorLocation) -> Result<(), ()> { + // TODO: https://github.com/paritytech/polkadot/issues/4489 Optimize this. + + // 1. Use our `context` to figure out how the `target` would address us. + let inverted_target = context.invert_target(target)?; + + // 2. Prepend `inverted_target` to `self` to get self's location from the perspective of + // `target`. + self.prepend_with(inverted_target).map_err(|_| ())?; + + // 3. Given that we know some of `target` context, ensure that any parents in `self` are + // strictly needed. + self.simplify(target.interior()); + + Ok(()) + } + + /// Consume `self` and return a new value representing the same location from the point of view + /// of `target`. The context of `self` is provided as `context`. + /// + /// Returns the original `self` in case of overflow. + fn reanchored(mut self, target: &Location, context: &InteriorLocation) -> Result { + match self.reanchor(target, context) { + Ok(()) => Ok(self), + Err(()) => Err(self), + } + } +} + +impl TryFrom for Option { + type Error = (); + fn try_from(value: OldLocation) -> result::Result { + Ok(Some(Location::try_from(value)?)) + } +} + +impl TryFrom for Location { + type Error = (); + fn try_from(x: OldLocation) -> result::Result { + Ok(Location { parents: x.parents, interior: x.interior.try_into()? }) + } +} + +/// A unit struct which can be converted into a `Location` of `parents` value 1. +#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug)] +pub struct Parent; +impl From for Location { + fn from(_: Parent) -> Self { + Location { parents: 1, interior: Junctions::Here } + } +} + +/// A tuple struct which can be converted into a `Location` of `parents` value 1 with the inner +/// interior. +#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Debug)] +pub struct ParentThen(pub Junctions); +impl From for Location { + fn from(ParentThen(interior): ParentThen) -> Self { + Location { parents: 1, interior } + } +} + +/// A unit struct which can be converted into a `Location` of the inner `parents` value. +#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug)] +pub struct Ancestor(pub u8); +impl From for Location { + fn from(Ancestor(parents): Ancestor) -> Self { + Location { parents, interior: Junctions::Here } + } +} + +/// A unit struct which can be converted into a `Location` of the inner `parents` value and the +/// inner interior. +#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Debug)] +pub struct AncestorThen(pub u8, pub Interior); +impl> From> for Location { + fn from(AncestorThen(parents, interior): AncestorThen) -> Self { + Location { parents, interior: interior.into() } + } +} + +xcm_procedural::impl_conversion_functions_for_location_v4!(); + +#[cfg(test)] +mod tests { + use crate::v4::prelude::*; + use parity_scale_codec::{Decode, Encode}; + + #[test] + fn conversion_works() { + let x: Location = Parent.into(); + assert_eq!(x, Location { parents: 1, interior: Here }); + // let x: Location = (Parent,).into(); + // assert_eq!(x, Location { parents: 1, interior: Here }); + // let x: Location = (Parent, Parent).into(); + // assert_eq!(x, Location { parents: 2, interior: Here }); + let x: Location = (Parent, Parent, OnlyChild).into(); + assert_eq!(x, Location { parents: 2, interior: OnlyChild.into() }); + let x: Location = OnlyChild.into(); + assert_eq!(x, Location { parents: 0, interior: OnlyChild.into() }); + let x: Location = (OnlyChild,).into(); + assert_eq!(x, Location { parents: 0, interior: OnlyChild.into() }); + } + + #[test] + fn simplify_basic_works() { + let mut location: Location = + (Parent, Parent, Parachain(1000), PalletInstance(42), GeneralIndex(69)).into(); + let context = [Parachain(1000), PalletInstance(42)].into(); + let expected = GeneralIndex(69).into(); + location.simplify(&context); + assert_eq!(location, expected); + + let mut location: Location = (Parent, PalletInstance(42), GeneralIndex(69)).into(); + let context = [PalletInstance(42)].into(); + let expected = GeneralIndex(69).into(); + location.simplify(&context); + assert_eq!(location, expected); + + let mut location: Location = (Parent, PalletInstance(42), GeneralIndex(69)).into(); + let context = [Parachain(1000), PalletInstance(42)].into(); + let expected = GeneralIndex(69).into(); + location.simplify(&context); + assert_eq!(location, expected); + + let mut location: Location = + (Parent, Parent, Parachain(1000), PalletInstance(42), GeneralIndex(69)).into(); + let context = [OnlyChild, Parachain(1000), PalletInstance(42)].into(); + let expected = GeneralIndex(69).into(); + location.simplify(&context); + assert_eq!(location, expected); + } + + #[test] + fn simplify_incompatible_location_fails() { + let mut location: Location = + (Parent, Parent, Parachain(1000), PalletInstance(42), GeneralIndex(69)).into(); + let context = [Parachain(1000), PalletInstance(42), GeneralIndex(42)].into(); + let expected = + (Parent, Parent, Parachain(1000), PalletInstance(42), GeneralIndex(69)).into(); + location.simplify(&context); + assert_eq!(location, expected); + + let mut location: Location = + (Parent, Parent, Parachain(1000), PalletInstance(42), GeneralIndex(69)).into(); + let context = [Parachain(1000)].into(); + let expected = + (Parent, Parent, Parachain(1000), PalletInstance(42), GeneralIndex(69)).into(); + location.simplify(&context); + assert_eq!(location, expected); + } + + #[test] + fn reanchor_works() { + let mut id: Location = (Parent, Parachain(1000), GeneralIndex(42)).into(); + let context = Parachain(2000).into(); + let target = (Parent, Parachain(1000)).into(); + let expected = GeneralIndex(42).into(); + id.reanchor(&target, &context).unwrap(); + assert_eq!(id, expected); + } + + #[test] + fn encode_and_decode_works() { + let m = Location { + parents: 1, + interior: [Parachain(42), AccountIndex64 { network: None, index: 23 }].into(), + }; + let encoded = m.encode(); + assert_eq!(encoded, [1, 2, 0, 168, 2, 0, 92].to_vec()); + let decoded = Location::decode(&mut &encoded[..]); + assert_eq!(decoded, Ok(m)); + } + + #[test] + fn match_and_split_works() { + let m = Location { + parents: 1, + interior: [Parachain(42), AccountIndex64 { network: None, index: 23 }].into(), + }; + assert_eq!(m.match_and_split(&Location { parents: 1, interior: Here }), None); + assert_eq!( + m.match_and_split(&Location { parents: 1, interior: [Parachain(42)].into() }), + Some(&AccountIndex64 { network: None, index: 23 }) + ); + assert_eq!(m.match_and_split(&m), None); + } + + #[test] + fn append_with_works() { + let acc = AccountIndex64 { network: None, index: 23 }; + let mut m = Location { parents: 1, interior: [Parachain(42)].into() }; + assert_eq!(m.append_with([PalletInstance(3), acc]), Ok(())); + assert_eq!( + m, + Location { parents: 1, interior: [Parachain(42), PalletInstance(3), acc].into() } + ); + + // cannot append to create overly long location + let acc = AccountIndex64 { network: None, index: 23 }; + let m = Location { + parents: 254, + interior: [Parachain(42), OnlyChild, OnlyChild, OnlyChild, OnlyChild].into(), + }; + let suffix: Location = (PalletInstance(3), acc, OnlyChild, OnlyChild).into(); + assert_eq!(m.clone().append_with(suffix.clone()), Err(suffix)); + } + + #[test] + fn prepend_with_works() { + let mut m = Location { + parents: 1, + interior: [Parachain(42), AccountIndex64 { network: None, index: 23 }].into(), + }; + assert_eq!(m.prepend_with(Location { parents: 1, interior: [OnlyChild].into() }), Ok(())); + assert_eq!( + m, + Location { + parents: 1, + interior: [Parachain(42), AccountIndex64 { network: None, index: 23 }].into() + } + ); + + // cannot prepend to create overly long location + let mut m = Location { parents: 254, interior: [Parachain(42)].into() }; + let prefix = Location { parents: 2, interior: Here }; + assert_eq!(m.prepend_with(prefix.clone()), Err(prefix)); + + let prefix = Location { parents: 1, interior: Here }; + assert_eq!(m.prepend_with(prefix.clone()), Ok(())); + assert_eq!(m, Location { parents: 255, interior: [Parachain(42)].into() }); + } + + #[test] + fn double_ended_ref_iteration_works() { + let m: Junctions = [Parachain(1000), Parachain(3), PalletInstance(5)].into(); + let mut iter = m.iter(); + + let first = iter.next().unwrap(); + assert_eq!(first, &Parachain(1000)); + let third = iter.next_back().unwrap(); + assert_eq!(third, &PalletInstance(5)); + let second = iter.next_back().unwrap(); + assert_eq!(iter.next(), None); + assert_eq!(iter.next_back(), None); + assert_eq!(second, &Parachain(3)); + + let res = Here + .pushed_with(*first) + .unwrap() + .pushed_with(*second) + .unwrap() + .pushed_with(*third) + .unwrap(); + assert_eq!(m, res); + + // make sure there's no funny business with the 0 indexing + let m = Here; + let mut iter = m.iter(); + + assert_eq!(iter.next(), None); + assert_eq!(iter.next_back(), None); + } + + #[test] + fn conversion_from_other_types_works() { + use crate::v3; + use core::convert::TryInto; + + fn takes_location>(_arg: Arg) {} + + takes_location(Parent); + takes_location(Here); + takes_location([Parachain(42)]); + takes_location((Ancestor(255), PalletInstance(8))); + takes_location((Ancestor(5), Parachain(1), PalletInstance(3))); + takes_location((Ancestor(2), Here)); + takes_location(AncestorThen( + 3, + [Parachain(43), AccountIndex64 { network: None, index: 155 }], + )); + takes_location((Parent, AccountId32 { network: None, id: [0; 32] })); + takes_location((Parent, Here)); + takes_location(ParentThen([Parachain(75)].into())); + takes_location([Parachain(100), PalletInstance(3)]); + + assert_eq!(v3::Location::from(v3::Junctions::Here).try_into(), Ok(Location::here())); + assert_eq!(v3::Location::from(v3::Parent).try_into(), Ok(Location::parent())); + assert_eq!( + v3::Location::from((v3::Parent, v3::Parent, v3::Junction::GeneralIndex(42u128),)) + .try_into(), + Ok(Location { parents: 2, interior: [GeneralIndex(42u128)].into() }), + ); + } +} diff --git a/polkadot/xcm/src/v4/mod.rs b/polkadot/xcm/src/v4/mod.rs new file mode 100644 index 00000000000..3b57ba1b137 --- /dev/null +++ b/polkadot/xcm/src/v4/mod.rs @@ -0,0 +1,1457 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Version 4 of the Cross-Consensus Message format data structures. + +pub use super::v2::GetWeight; +use super::v3::{ + Instruction as OldInstruction, PalletInfo as OldPalletInfo, + QueryResponseInfo as OldQueryResponseInfo, Response as OldResponse, Xcm as OldXcm, +}; +use crate::DoubleEncoded; +use alloc::{vec, vec::Vec}; +use bounded_collections::{parameter_types, BoundedVec}; +use core::{ + convert::{TryFrom, TryInto}, + fmt::Debug, + result, +}; +use derivative::Derivative; +use parity_scale_codec::{self, Decode, Encode, MaxEncodedLen}; +use scale_info::TypeInfo; + +mod asset; +mod junction; +pub(crate) mod junctions; +mod location; +mod traits; + +pub use asset::{ + Asset, AssetFilter, AssetId, AssetInstance, Assets, Fungibility, WildAsset, WildFungibility, + MAX_ITEMS_IN_ASSETS, +}; +pub use junction::{BodyId, BodyPart, Junction, NetworkId}; +pub use junctions::Junctions; +pub use location::{Ancestor, AncestorThen, InteriorLocation, Location, Parent, ParentThen}; +pub use traits::{ + send_xcm, validate_send, Error, ExecuteXcm, Outcome, PreparedMessage, Reanchorable, Result, + SendError, SendResult, SendXcm, Weight, XcmHash, +}; +// These parts of XCM v3 are unchanged in XCM v4, and are re-imported here. +pub use super::v3::{MaybeErrorCode, OriginKind, WeightLimit}; + +/// This module's XCM version. +pub const VERSION: super::Version = 4; + +/// An identifier for a query. +pub type QueryId = u64; + +#[derive(Derivative, Default, Encode, Decode, TypeInfo)] +#[derivative(Clone(bound = ""), Eq(bound = ""), PartialEq(bound = ""), Debug(bound = ""))] +#[codec(encode_bound())] +#[codec(decode_bound())] +#[scale_info(bounds(), skip_type_params(Call))] +pub struct Xcm(pub Vec>); + +pub const MAX_INSTRUCTIONS_TO_DECODE: u8 = 100; + +impl Xcm { + /// Create an empty instance. + pub fn new() -> Self { + Self(vec![]) + } + + /// Return `true` if no instructions are held in `self`. + pub fn is_empty(&self) -> bool { + self.0.is_empty() + } + + /// Return the number of instructions held in `self`. + pub fn len(&self) -> usize { + self.0.len() + } + + /// Return a reference to the inner value. + pub fn inner(&self) -> &[Instruction] { + &self.0 + } + + /// Return a mutable reference to the inner value. + pub fn inner_mut(&mut self) -> &mut Vec> { + &mut self.0 + } + + /// Consume and return the inner value. + pub fn into_inner(self) -> Vec> { + self.0 + } + + /// Return an iterator over references to the items. + pub fn iter(&self) -> impl Iterator> { + self.0.iter() + } + + /// Return an iterator over mutable references to the items. + pub fn iter_mut(&mut self) -> impl Iterator> { + self.0.iter_mut() + } + + /// Consume and return an iterator over the items. + pub fn into_iter(self) -> impl Iterator> { + self.0.into_iter() + } + + /// Consume and either return `self` if it contains some instructions, or if it's empty, then + /// instead return the result of `f`. + pub fn or_else(self, f: impl FnOnce() -> Self) -> Self { + if self.0.is_empty() { + f() + } else { + self + } + } + + /// Return the first instruction, if any. + pub fn first(&self) -> Option<&Instruction> { + self.0.first() + } + + /// Return the last instruction, if any. + pub fn last(&self) -> Option<&Instruction> { + self.0.last() + } + + /// Return the only instruction, contained in `Self`, iff only one exists (`None` otherwise). + pub fn only(&self) -> Option<&Instruction> { + if self.0.len() == 1 { + self.0.first() + } else { + None + } + } + + /// Return the only instruction, contained in `Self`, iff only one exists (returns `self` + /// otherwise). + pub fn into_only(mut self) -> core::result::Result, Self> { + if self.0.len() == 1 { + self.0.pop().ok_or(self) + } else { + Err(self) + } + } +} + +impl From>> for Xcm { + fn from(c: Vec>) -> Self { + Self(c) + } +} + +impl From> for Vec> { + fn from(c: Xcm) -> Self { + c.0 + } +} + +/// A prelude for importing all types typically used when interacting with XCM messages. +pub mod prelude { + mod contents { + pub use super::super::{ + send_xcm, validate_send, Ancestor, AncestorThen, Asset, + AssetFilter::{self, *}, + AssetId, + AssetInstance::{self, *}, + Assets, BodyId, BodyPart, Error as XcmError, ExecuteXcm, + Fungibility::{self, *}, + Instruction::*, + InteriorLocation, + Junction::{self, *}, + Junctions::{self, Here}, + Location, MaybeErrorCode, + NetworkId::{self, *}, + OriginKind, Outcome, PalletInfo, Parent, ParentThen, PreparedMessage, QueryId, + QueryResponseInfo, Reanchorable, Response, Result as XcmResult, SendError, SendResult, + SendXcm, Weight, + WeightLimit::{self, *}, + WildAsset::{self, *}, + WildFungibility::{self, Fungible as WildFungible, NonFungible as WildNonFungible}, + XcmContext, XcmHash, XcmWeightInfo, VERSION as XCM_VERSION, + }; + } + pub use super::{Instruction, Xcm}; + pub use contents::*; + pub mod opaque { + pub use super::{ + super::opaque::{Instruction, Xcm}, + contents::*, + }; + } +} + +parameter_types! { + pub MaxPalletNameLen: u32 = 48; + /// Maximum size of the encoded error code coming from a `Dispatch` result, used for + /// `MaybeErrorCode`. This is not (yet) enforced, so it's just an indication of expectation. + pub MaxDispatchErrorLen: u32 = 128; + pub MaxPalletsInfo: u32 = 64; +} + +#[derive(Clone, Eq, PartialEq, Encode, Decode, Debug, TypeInfo, MaxEncodedLen)] +pub struct PalletInfo { + #[codec(compact)] + index: u32, + name: BoundedVec, + module_name: BoundedVec, + #[codec(compact)] + major: u32, + #[codec(compact)] + minor: u32, + #[codec(compact)] + patch: u32, +} + +impl TryInto for PalletInfo { + type Error = (); + + fn try_into(self) -> result::Result { + OldPalletInfo::new( + self.index, + self.name.into_inner(), + self.module_name.into_inner(), + self.major, + self.minor, + self.patch, + ) + .map_err(|_| ()) + } +} + +impl PalletInfo { + pub fn new( + index: u32, + name: Vec, + module_name: Vec, + major: u32, + minor: u32, + patch: u32, + ) -> result::Result { + let name = BoundedVec::try_from(name).map_err(|_| Error::Overflow)?; + let module_name = BoundedVec::try_from(module_name).map_err(|_| Error::Overflow)?; + + Ok(Self { index, name, module_name, major, minor, patch }) + } +} + +/// Response data to a query. +#[derive(Clone, Eq, PartialEq, Encode, Decode, Debug, TypeInfo, MaxEncodedLen)] +pub enum Response { + /// No response. Serves as a neutral default. + Null, + /// Some assets. + Assets(Assets), + /// The outcome of an XCM instruction. + ExecutionResult(Option<(u32, Error)>), + /// An XCM version. + Version(super::Version), + /// The index, instance name, pallet name and version of some pallets. + PalletsInfo(BoundedVec), + /// The status of a dispatch attempt using `Transact`. + DispatchResult(MaybeErrorCode), +} + +impl Default for Response { + fn default() -> Self { + Self::Null + } +} + +impl TryFrom for Response { + type Error = (); + + fn try_from(old: OldResponse) -> result::Result { + use OldResponse::*; + Ok(match old { + Null => Self::Null, + Assets(assets) => Self::Assets(assets.try_into()?), + ExecutionResult(result) => + Self::ExecutionResult(result.map(|(num, old_error)| (num, old_error.into()))), + Version(version) => Self::Version(version), + PalletsInfo(pallet_info) => { + let inner = pallet_info + .into_iter() + .map(TryInto::try_into) + .collect::, _>>()?; + Self::PalletsInfo( + BoundedVec::::try_from(inner).map_err(|_| ())?, + ) + }, + DispatchResult(maybe_error) => Self::DispatchResult(maybe_error), + }) + } +} + +/// Information regarding the composition of a query response. +#[derive(Clone, Eq, PartialEq, Encode, Decode, Debug, TypeInfo)] +pub struct QueryResponseInfo { + /// The destination to which the query response message should be send. + pub destination: Location, + /// The `query_id` field of the `QueryResponse` message. + #[codec(compact)] + pub query_id: QueryId, + /// The `max_weight` field of the `QueryResponse` message. + pub max_weight: Weight, +} + +impl TryFrom for QueryResponseInfo { + type Error = (); + + fn try_from(old: OldQueryResponseInfo) -> result::Result { + Ok(Self { + destination: old.destination.try_into()?, + query_id: old.query_id, + max_weight: old.max_weight, + }) + } +} + +/// Contextual data pertaining to a specific list of XCM instructions. +#[derive(Clone, Eq, PartialEq, Encode, Decode, Debug)] +pub struct XcmContext { + /// The current value of the Origin register of the `XCVM`. + pub origin: Option, + /// The identity of the XCM; this may be a hash of its versioned encoding but could also be + /// a high-level identity set by an appropriate barrier. + pub message_id: XcmHash, + /// The current value of the Topic register of the `XCVM`. + pub topic: Option<[u8; 32]>, +} + +impl XcmContext { + /// Constructor which sets the message ID to the supplied parameter and leaves the origin and + /// topic unset. + pub fn with_message_id(message_id: XcmHash) -> XcmContext { + XcmContext { origin: None, message_id, topic: None } + } +} + +/// Cross-Consensus Message: A message from one consensus system to another. +/// +/// Consensus systems that may send and receive messages include blockchains and smart contracts. +/// +/// All messages are delivered from a known *origin*, expressed as a `Location`. +/// +/// This is the inner XCM format and is version-sensitive. Messages are typically passed using the +/// outer XCM format, known as `VersionedXcm`. +#[derive( + Derivative, + Encode, + Decode, + TypeInfo, + xcm_procedural::XcmWeightInfoTrait, + xcm_procedural::Builder, +)] +#[derivative(Clone(bound = ""), Eq(bound = ""), PartialEq(bound = ""), Debug(bound = ""))] +#[codec(encode_bound())] +#[codec(decode_bound())] +#[scale_info(bounds(), skip_type_params(Call))] +pub enum Instruction { + /// Withdraw asset(s) (`assets`) from the ownership of `origin` and place them into the Holding + /// Register. + /// + /// - `assets`: The asset(s) to be withdrawn into holding. + /// + /// Kind: *Command*. + /// + /// Errors: + #[builder(loads_holding)] + WithdrawAsset(Assets), + + /// Asset(s) (`assets`) have been received into the ownership of this system on the `origin` + /// system and equivalent derivatives should be placed into the Holding Register. + /// + /// - `assets`: The asset(s) that are minted into holding. + /// + /// Safety: `origin` must be trusted to have received and be storing `assets` such that they + /// may later be withdrawn should this system send a corresponding message. + /// + /// Kind: *Trusted Indication*. + /// + /// Errors: + #[builder(loads_holding)] + ReserveAssetDeposited(Assets), + + /// Asset(s) (`assets`) have been destroyed on the `origin` system and equivalent assets should + /// be created and placed into the Holding Register. + /// + /// - `assets`: The asset(s) that are minted into the Holding Register. + /// + /// Safety: `origin` must be trusted to have irrevocably destroyed the corresponding `assets` + /// prior as a consequence of sending this message. + /// + /// Kind: *Trusted Indication*. + /// + /// Errors: + #[builder(loads_holding)] + ReceiveTeleportedAsset(Assets), + + /// Respond with information that the local system is expecting. + /// + /// - `query_id`: The identifier of the query that resulted in this message being sent. + /// - `response`: The message content. + /// - `max_weight`: The maximum weight that handling this response should take. + /// - `querier`: The location responsible for the initiation of the response, if there is one. + /// In general this will tend to be the same location as the receiver of this message. NOTE: + /// As usual, this is interpreted from the perspective of the receiving consensus system. + /// + /// Safety: Since this is information only, there are no immediate concerns. However, it should + /// be remembered that even if the Origin behaves reasonably, it can always be asked to make + /// a response to a third-party chain who may or may not be expecting the response. Therefore + /// the `querier` should be checked to match the expected value. + /// + /// Kind: *Information*. + /// + /// Errors: + QueryResponse { + #[codec(compact)] + query_id: QueryId, + response: Response, + max_weight: Weight, + querier: Option, + }, + + /// Withdraw asset(s) (`assets`) from the ownership of `origin` and place equivalent assets + /// under the ownership of `beneficiary`. + /// + /// - `assets`: The asset(s) to be withdrawn. + /// - `beneficiary`: The new owner for the assets. + /// + /// Safety: No concerns. + /// + /// Kind: *Command*. + /// + /// Errors: + TransferAsset { assets: Assets, beneficiary: Location }, + + /// Withdraw asset(s) (`assets`) from the ownership of `origin` and place equivalent assets + /// under the ownership of `dest` within this consensus system (i.e. its sovereign account). + /// + /// Send an onward XCM message to `dest` of `ReserveAssetDeposited` with the given + /// `xcm`. + /// + /// - `assets`: The asset(s) to be withdrawn. + /// - `dest`: The location whose sovereign account will own the assets and thus the effective + /// beneficiary for the assets and the notification target for the reserve asset deposit + /// message. + /// - `xcm`: The instructions that should follow the `ReserveAssetDeposited` instruction, which + /// is sent onwards to `dest`. + /// + /// Safety: No concerns. + /// + /// Kind: *Command*. + /// + /// Errors: + TransferReserveAsset { assets: Assets, dest: Location, xcm: Xcm<()> }, + + /// Apply the encoded transaction `call`, whose dispatch-origin should be `origin` as expressed + /// by the kind of origin `origin_kind`. + /// + /// The Transact Status Register is set according to the result of dispatching the call. + /// + /// - `origin_kind`: The means of expressing the message origin as a dispatch origin. + /// - `require_weight_at_most`: The weight of `call`; this should be at least the chain's + /// calculated weight and will be used in the weight determination arithmetic. + /// - `call`: The encoded transaction to be applied. + /// + /// Safety: No concerns. + /// + /// Kind: *Command*. + /// + /// Errors: + Transact { origin_kind: OriginKind, require_weight_at_most: Weight, call: DoubleEncoded }, + + /// A message to notify about a new incoming HRMP channel. This message is meant to be sent by + /// the relay-chain to a para. + /// + /// - `sender`: The sender in the to-be opened channel. Also, the initiator of the channel + /// opening. + /// - `max_message_size`: The maximum size of a message proposed by the sender. + /// - `max_capacity`: The maximum number of messages that can be queued in the channel. + /// + /// Safety: The message should originate directly from the relay-chain. + /// + /// Kind: *System Notification* + HrmpNewChannelOpenRequest { + #[codec(compact)] + sender: u32, + #[codec(compact)] + max_message_size: u32, + #[codec(compact)] + max_capacity: u32, + }, + + /// A message to notify about that a previously sent open channel request has been accepted by + /// the recipient. That means that the channel will be opened during the next relay-chain + /// session change. This message is meant to be sent by the relay-chain to a para. + /// + /// Safety: The message should originate directly from the relay-chain. + /// + /// Kind: *System Notification* + /// + /// Errors: + HrmpChannelAccepted { + // NOTE: We keep this as a structured item to a) keep it consistent with the other Hrmp + // items; and b) because the field's meaning is not obvious/mentioned from the item name. + #[codec(compact)] + recipient: u32, + }, + + /// A message to notify that the other party in an open channel decided to close it. In + /// particular, `initiator` is going to close the channel opened from `sender` to the + /// `recipient`. The close will be enacted at the next relay-chain session change. This message + /// is meant to be sent by the relay-chain to a para. + /// + /// Safety: The message should originate directly from the relay-chain. + /// + /// Kind: *System Notification* + /// + /// Errors: + HrmpChannelClosing { + #[codec(compact)] + initiator: u32, + #[codec(compact)] + sender: u32, + #[codec(compact)] + recipient: u32, + }, + + /// Clear the origin. + /// + /// This may be used by the XCM author to ensure that later instructions cannot command the + /// authority of the origin (e.g. if they are being relayed from an untrusted source, as often + /// the case with `ReserveAssetDeposited`). + /// + /// Safety: No concerns. + /// + /// Kind: *Command*. + /// + /// Errors: + ClearOrigin, + + /// Mutate the origin to some interior location. + /// + /// Kind: *Command* + /// + /// Errors: + DescendOrigin(InteriorLocation), + + /// Immediately report the contents of the Error Register to the given destination via XCM. + /// + /// A `QueryResponse` message of type `ExecutionOutcome` is sent to the described destination. + /// + /// - `response_info`: Information for making the response. + /// + /// Kind: *Command* + /// + /// Errors: + ReportError(QueryResponseInfo), + + /// Remove the asset(s) (`assets`) from the Holding Register and place equivalent assets under + /// the ownership of `beneficiary` within this consensus system. + /// + /// - `assets`: The asset(s) to remove from holding. + /// - `beneficiary`: The new owner for the assets. + /// + /// Kind: *Command* + /// + /// Errors: + DepositAsset { assets: AssetFilter, beneficiary: Location }, + + /// Remove the asset(s) (`assets`) from the Holding Register and place equivalent assets under + /// the ownership of `dest` within this consensus system (i.e. deposit them into its sovereign + /// account). + /// + /// Send an onward XCM message to `dest` of `ReserveAssetDeposited` with the given `effects`. + /// + /// - `assets`: The asset(s) to remove from holding. + /// - `dest`: The location whose sovereign account will own the assets and thus the effective + /// beneficiary for the assets and the notification target for the reserve asset deposit + /// message. + /// - `xcm`: The orders that should follow the `ReserveAssetDeposited` instruction which is + /// sent onwards to `dest`. + /// + /// Kind: *Command* + /// + /// Errors: + DepositReserveAsset { assets: AssetFilter, dest: Location, xcm: Xcm<()> }, + + /// Remove the asset(s) (`want`) from the Holding Register and replace them with alternative + /// assets. + /// + /// The minimum amount of assets to be received into the Holding Register for the order not to + /// fail may be stated. + /// + /// - `give`: The maximum amount of assets to remove from holding. + /// - `want`: The minimum amount of assets which `give` should be exchanged for. + /// - `maximal`: If `true`, then prefer to give as much as possible up to the limit of `give` + /// and receive accordingly more. If `false`, then prefer to give as little as possible in + /// order to receive as little as possible while receiving at least `want`. + /// + /// Kind: *Command* + /// + /// Errors: + ExchangeAsset { give: AssetFilter, want: Assets, maximal: bool }, + + /// Remove the asset(s) (`assets`) from holding and send a `WithdrawAsset` XCM message to a + /// reserve location. + /// + /// - `assets`: The asset(s) to remove from holding. + /// - `reserve`: A valid location that acts as a reserve for all asset(s) in `assets`. The + /// sovereign account of this consensus system *on the reserve location* will have + /// appropriate assets withdrawn and `effects` will be executed on them. There will typically + /// be only one valid location on any given asset/chain combination. + /// - `xcm`: The instructions to execute on the assets once withdrawn *on the reserve + /// location*. + /// + /// Kind: *Command* + /// + /// Errors: + InitiateReserveWithdraw { assets: AssetFilter, reserve: Location, xcm: Xcm<()> }, + + /// Remove the asset(s) (`assets`) from holding and send a `ReceiveTeleportedAsset` XCM message + /// to a `dest` location. + /// + /// - `assets`: The asset(s) to remove from holding. + /// - `dest`: A valid location that respects teleports coming from this location. + /// - `xcm`: The instructions to execute on the assets once arrived *on the destination + /// location*. + /// + /// NOTE: The `dest` location *MUST* respect this origin as a valid teleportation origin for + /// all `assets`. If it does not, then the assets may be lost. + /// + /// Kind: *Command* + /// + /// Errors: + InitiateTeleport { assets: AssetFilter, dest: Location, xcm: Xcm<()> }, + + /// Report to a given destination the contents of the Holding Register. + /// + /// A `QueryResponse` message of type `Assets` is sent to the described destination. + /// + /// - `response_info`: Information for making the response. + /// - `assets`: A filter for the assets that should be reported back. The assets reported back + /// will be, asset-wise, *the lesser of this value and the holding register*. No wildcards + /// will be used when reporting assets back. + /// + /// Kind: *Command* + /// + /// Errors: + ReportHolding { response_info: QueryResponseInfo, assets: AssetFilter }, + + /// Pay for the execution of some XCM `xcm` and `orders` with up to `weight` + /// picoseconds of execution time, paying for this with up to `fees` from the Holding Register. + /// + /// - `fees`: The asset(s) to remove from the Holding Register to pay for fees. + /// - `weight_limit`: The maximum amount of weight to purchase; this must be at least the + /// expected maximum weight of the total XCM to be executed for the + /// `AllowTopLevelPaidExecutionFrom` barrier to allow the XCM be executed. + /// + /// Kind: *Command* + /// + /// Errors: + BuyExecution { fees: Asset, weight_limit: WeightLimit }, + + /// Refund any surplus weight previously bought with `BuyExecution`. + /// + /// Kind: *Command* + /// + /// Errors: None. + RefundSurplus, + + /// Set the Error Handler Register. This is code that should be called in the case of an error + /// happening. + /// + /// An error occurring within execution of this code will _NOT_ result in the error register + /// being set, nor will an error handler be called due to it. The error handler and appendix + /// may each still be set. + /// + /// The apparent weight of this instruction is inclusive of the inner `Xcm`; the executing + /// weight however includes only the difference between the previous handler and the new + /// handler, which can reasonably be negative, which would result in a surplus. + /// + /// Kind: *Command* + /// + /// Errors: None. + SetErrorHandler(Xcm), + + /// Set the Appendix Register. This is code that should be called after code execution + /// (including the error handler if any) is finished. This will be called regardless of whether + /// an error occurred. + /// + /// Any error occurring due to execution of this code will result in the error register being + /// set, and the error handler (if set) firing. + /// + /// The apparent weight of this instruction is inclusive of the inner `Xcm`; the executing + /// weight however includes only the difference between the previous appendix and the new + /// appendix, which can reasonably be negative, which would result in a surplus. + /// + /// Kind: *Command* + /// + /// Errors: None. + SetAppendix(Xcm), + + /// Clear the Error Register. + /// + /// Kind: *Command* + /// + /// Errors: None. + ClearError, + + /// Create some assets which are being held on behalf of the origin. + /// + /// - `assets`: The assets which are to be claimed. This must match exactly with the assets + /// claimable by the origin of the ticket. + /// - `ticket`: The ticket of the asset; this is an abstract identifier to help locate the + /// asset. + /// + /// Kind: *Command* + /// + /// Errors: + #[builder(loads_holding)] + ClaimAsset { assets: Assets, ticket: Location }, + + /// Always throws an error of type `Trap`. + /// + /// Kind: *Command* + /// + /// Errors: + /// - `Trap`: All circumstances, whose inner value is the same as this item's inner value. + Trap(#[codec(compact)] u64), + + /// Ask the destination system to respond with the most recent version of XCM that they + /// support in a `QueryResponse` instruction. Any changes to this should also elicit similar + /// responses when they happen. + /// + /// - `query_id`: An identifier that will be replicated into the returned XCM message. + /// - `max_response_weight`: The maximum amount of weight that the `QueryResponse` item which + /// is sent as a reply may take to execute. NOTE: If this is unexpectedly large then the + /// response may not execute at all. + /// + /// Kind: *Command* + /// + /// Errors: *Fallible* + SubscribeVersion { + #[codec(compact)] + query_id: QueryId, + max_response_weight: Weight, + }, + + /// Cancel the effect of a previous `SubscribeVersion` instruction. + /// + /// Kind: *Command* + /// + /// Errors: *Fallible* + UnsubscribeVersion, + + /// Reduce Holding by up to the given assets. + /// + /// Holding is reduced by as much as possible up to the assets in the parameter. It is not an + /// error if the Holding does not contain the assets (to make this an error, use `ExpectAsset` + /// prior). + /// + /// Kind: *Command* + /// + /// Errors: *Infallible* + BurnAsset(Assets), + + /// Throw an error if Holding does not contain at least the given assets. + /// + /// Kind: *Command* + /// + /// Errors: + /// - `ExpectationFalse`: If Holding Register does not contain the assets in the parameter. + ExpectAsset(Assets), + + /// Ensure that the Origin Register equals some given value and throw an error if not. + /// + /// Kind: *Command* + /// + /// Errors: + /// - `ExpectationFalse`: If Origin Register is not equal to the parameter. + ExpectOrigin(Option), + + /// Ensure that the Error Register equals some given value and throw an error if not. + /// + /// Kind: *Command* + /// + /// Errors: + /// - `ExpectationFalse`: If the value of the Error Register is not equal to the parameter. + ExpectError(Option<(u32, Error)>), + + /// Ensure that the Transact Status Register equals some given value and throw an error if + /// not. + /// + /// Kind: *Command* + /// + /// Errors: + /// - `ExpectationFalse`: If the value of the Transact Status Register is not equal to the + /// parameter. + ExpectTransactStatus(MaybeErrorCode), + + /// Query the existence of a particular pallet type. + /// + /// - `module_name`: The module name of the pallet to query. + /// - `response_info`: Information for making the response. + /// + /// Sends a `QueryResponse` to Origin whose data field `PalletsInfo` containing the information + /// of all pallets on the local chain whose name is equal to `name`. This is empty in the case + /// that the local chain is not based on Substrate Frame. + /// + /// Safety: No concerns. + /// + /// Kind: *Command* + /// + /// Errors: *Fallible*. + QueryPallet { module_name: Vec, response_info: QueryResponseInfo }, + + /// Ensure that a particular pallet with a particular version exists. + /// + /// - `index: Compact`: The index which identifies the pallet. An error if no pallet exists at + /// this index. + /// - `name: Vec`: Name which must be equal to the name of the pallet. + /// - `module_name: Vec`: Module name which must be equal to the name of the module in + /// which the pallet exists. + /// - `crate_major: Compact`: Version number which must be equal to the major version of the + /// crate which implements the pallet. + /// - `min_crate_minor: Compact`: Version number which must be at most the minor version of the + /// crate which implements the pallet. + /// + /// Safety: No concerns. + /// + /// Kind: *Command* + /// + /// Errors: + /// - `ExpectationFalse`: In case any of the expectations are broken. + ExpectPallet { + #[codec(compact)] + index: u32, + name: Vec, + module_name: Vec, + #[codec(compact)] + crate_major: u32, + #[codec(compact)] + min_crate_minor: u32, + }, + + /// Send a `QueryResponse` message containing the value of the Transact Status Register to some + /// destination. + /// + /// - `query_response_info`: The information needed for constructing and sending the + /// `QueryResponse` message. + /// + /// Safety: No concerns. + /// + /// Kind: *Command* + /// + /// Errors: *Fallible*. + ReportTransactStatus(QueryResponseInfo), + + /// Set the Transact Status Register to its default, cleared, value. + /// + /// Safety: No concerns. + /// + /// Kind: *Command* + /// + /// Errors: *Infallible*. + ClearTransactStatus, + + /// Set the Origin Register to be some child of the Universal Ancestor. + /// + /// Safety: Should only be usable if the Origin is trusted to represent the Universal Ancestor + /// child in general. In general, no Origin should be able to represent the Universal Ancestor + /// child which is the root of the local consensus system since it would by extension + /// allow it to act as any location within the local consensus. + /// + /// The `Junction` parameter should generally be a `GlobalConsensus` variant since it is only + /// these which are children of the Universal Ancestor. + /// + /// Kind: *Command* + /// + /// Errors: *Fallible*. + UniversalOrigin(Junction), + + /// Send a message on to Non-Local Consensus system. + /// + /// This will tend to utilize some extra-consensus mechanism, the obvious one being a bridge. + /// A fee may be charged; this may be determined based on the contents of `xcm`. It will be + /// taken from the Holding register. + /// + /// - `network`: The remote consensus system to which the message should be exported. + /// - `destination`: The location relative to the remote consensus system to which the message + /// should be sent on arrival. + /// - `xcm`: The message to be exported. + /// + /// As an example, to export a message for execution on Statemine (parachain #1000 in the + /// Kusama network), you would call with `network: NetworkId::Kusama` and + /// `destination: [Parachain(1000)].into()`. Alternatively, to export a message for execution + /// on Polkadot, you would call with `network: NetworkId:: Polkadot` and `destination: Here`. + /// + /// Kind: *Command* + /// + /// Errors: *Fallible*. + ExportMessage { network: NetworkId, destination: InteriorLocation, xcm: Xcm<()> }, + + /// Lock the locally held asset and prevent further transfer or withdrawal. + /// + /// This restriction may be removed by the `UnlockAsset` instruction being called with an + /// Origin of `unlocker` and a `target` equal to the current `Origin`. + /// + /// If the locking is successful, then a `NoteUnlockable` instruction is sent to `unlocker`. + /// + /// - `asset`: The asset(s) which should be locked. + /// - `unlocker`: The value which the Origin must be for a corresponding `UnlockAsset` + /// instruction to work. + /// + /// Kind: *Command*. + /// + /// Errors: + LockAsset { asset: Asset, unlocker: Location }, + + /// Remove the lock over `asset` on this chain and (if nothing else is preventing it) allow the + /// asset to be transferred. + /// + /// - `asset`: The asset to be unlocked. + /// - `target`: The owner of the asset on the local chain. + /// + /// Safety: No concerns. + /// + /// Kind: *Command*. + /// + /// Errors: + UnlockAsset { asset: Asset, target: Location }, + + /// Asset (`asset`) has been locked on the `origin` system and may not be transferred. It may + /// only be unlocked with the receipt of the `UnlockAsset` instruction from this chain. + /// + /// - `asset`: The asset(s) which are now unlockable from this origin. + /// - `owner`: The owner of the asset on the chain in which it was locked. This may be a + /// location specific to the origin network. + /// + /// Safety: `origin` must be trusted to have locked the corresponding `asset` + /// prior as a consequence of sending this message. + /// + /// Kind: *Trusted Indication*. + /// + /// Errors: + NoteUnlockable { asset: Asset, owner: Location }, + + /// Send an `UnlockAsset` instruction to the `locker` for the given `asset`. + /// + /// This may fail if the local system is making use of the fact that the asset is locked or, + /// of course, if there is no record that the asset actually is locked. + /// + /// - `asset`: The asset(s) to be unlocked. + /// - `locker`: The location from which a previous `NoteUnlockable` was sent and to which an + /// `UnlockAsset` should be sent. + /// + /// Kind: *Command*. + /// + /// Errors: + RequestUnlock { asset: Asset, locker: Location }, + + /// Sets the Fees Mode Register. + /// + /// - `jit_withdraw`: The fees mode item; if set to `true` then fees for any instructions are + /// withdrawn as needed using the same mechanism as `WithdrawAssets`. + /// + /// Kind: *Command*. + /// + /// Errors: + SetFeesMode { jit_withdraw: bool }, + + /// Set the Topic Register. + /// + /// The 32-byte array identifier in the parameter is not guaranteed to be + /// unique; if such a property is desired, it is up to the code author to + /// enforce uniqueness. + /// + /// Safety: No concerns. + /// + /// Kind: *Command* + /// + /// Errors: + SetTopic([u8; 32]), + + /// Clear the Topic Register. + /// + /// Kind: *Command* + /// + /// Errors: None. + ClearTopic, + + /// Alter the current Origin to another given origin. + /// + /// Kind: *Command* + /// + /// Errors: If the existing state would not allow such a change. + AliasOrigin(Location), + + /// A directive to indicate that the origin expects free execution of the message. + /// + /// At execution time, this instruction just does a check on the Origin register. + /// However, at the barrier stage messages starting with this instruction can be disregarded if + /// the origin is not acceptable for free execution or the `weight_limit` is `Limited` and + /// insufficient. + /// + /// Kind: *Indication* + /// + /// Errors: If the given origin is `Some` and not equal to the current Origin register. + UnpaidExecution { weight_limit: WeightLimit, check_origin: Option }, +} + +impl Xcm { + pub fn into(self) -> Xcm { + Xcm::from(self) + } + pub fn from(xcm: Xcm) -> Self { + Self(xcm.0.into_iter().map(Instruction::::from).collect()) + } +} + +impl Instruction { + pub fn into(self) -> Instruction { + Instruction::from(self) + } + pub fn from(xcm: Instruction) -> Self { + use Instruction::*; + match xcm { + WithdrawAsset(assets) => WithdrawAsset(assets), + ReserveAssetDeposited(assets) => ReserveAssetDeposited(assets), + ReceiveTeleportedAsset(assets) => ReceiveTeleportedAsset(assets), + QueryResponse { query_id, response, max_weight, querier } => + QueryResponse { query_id, response, max_weight, querier }, + TransferAsset { assets, beneficiary } => TransferAsset { assets, beneficiary }, + TransferReserveAsset { assets, dest, xcm } => + TransferReserveAsset { assets, dest, xcm }, + HrmpNewChannelOpenRequest { sender, max_message_size, max_capacity } => + HrmpNewChannelOpenRequest { sender, max_message_size, max_capacity }, + HrmpChannelAccepted { recipient } => HrmpChannelAccepted { recipient }, + HrmpChannelClosing { initiator, sender, recipient } => + HrmpChannelClosing { initiator, sender, recipient }, + Transact { origin_kind, require_weight_at_most, call } => + Transact { origin_kind, require_weight_at_most, call: call.into() }, + ReportError(response_info) => ReportError(response_info), + DepositAsset { assets, beneficiary } => DepositAsset { assets, beneficiary }, + DepositReserveAsset { assets, dest, xcm } => DepositReserveAsset { assets, dest, xcm }, + ExchangeAsset { give, want, maximal } => ExchangeAsset { give, want, maximal }, + InitiateReserveWithdraw { assets, reserve, xcm } => + InitiateReserveWithdraw { assets, reserve, xcm }, + InitiateTeleport { assets, dest, xcm } => InitiateTeleport { assets, dest, xcm }, + ReportHolding { response_info, assets } => ReportHolding { response_info, assets }, + BuyExecution { fees, weight_limit } => BuyExecution { fees, weight_limit }, + ClearOrigin => ClearOrigin, + DescendOrigin(who) => DescendOrigin(who), + RefundSurplus => RefundSurplus, + SetErrorHandler(xcm) => SetErrorHandler(xcm.into()), + SetAppendix(xcm) => SetAppendix(xcm.into()), + ClearError => ClearError, + ClaimAsset { assets, ticket } => ClaimAsset { assets, ticket }, + Trap(code) => Trap(code), + SubscribeVersion { query_id, max_response_weight } => + SubscribeVersion { query_id, max_response_weight }, + UnsubscribeVersion => UnsubscribeVersion, + BurnAsset(assets) => BurnAsset(assets), + ExpectAsset(assets) => ExpectAsset(assets), + ExpectOrigin(origin) => ExpectOrigin(origin), + ExpectError(error) => ExpectError(error), + ExpectTransactStatus(transact_status) => ExpectTransactStatus(transact_status), + QueryPallet { module_name, response_info } => + QueryPallet { module_name, response_info }, + ExpectPallet { index, name, module_name, crate_major, min_crate_minor } => + ExpectPallet { index, name, module_name, crate_major, min_crate_minor }, + ReportTransactStatus(response_info) => ReportTransactStatus(response_info), + ClearTransactStatus => ClearTransactStatus, + UniversalOrigin(j) => UniversalOrigin(j), + ExportMessage { network, destination, xcm } => + ExportMessage { network, destination, xcm }, + LockAsset { asset, unlocker } => LockAsset { asset, unlocker }, + UnlockAsset { asset, target } => UnlockAsset { asset, target }, + NoteUnlockable { asset, owner } => NoteUnlockable { asset, owner }, + RequestUnlock { asset, locker } => RequestUnlock { asset, locker }, + SetFeesMode { jit_withdraw } => SetFeesMode { jit_withdraw }, + SetTopic(topic) => SetTopic(topic), + ClearTopic => ClearTopic, + AliasOrigin(location) => AliasOrigin(location), + UnpaidExecution { weight_limit, check_origin } => + UnpaidExecution { weight_limit, check_origin }, + } + } +} + +// TODO: Automate Generation +impl> GetWeight for Instruction { + fn weight(&self) -> Weight { + use Instruction::*; + match self { + WithdrawAsset(assets) => W::withdraw_asset(assets), + ReserveAssetDeposited(assets) => W::reserve_asset_deposited(assets), + ReceiveTeleportedAsset(assets) => W::receive_teleported_asset(assets), + QueryResponse { query_id, response, max_weight, querier } => + W::query_response(query_id, response, max_weight, querier), + TransferAsset { assets, beneficiary } => W::transfer_asset(assets, beneficiary), + TransferReserveAsset { assets, dest, xcm } => + W::transfer_reserve_asset(&assets, dest, xcm), + Transact { origin_kind, require_weight_at_most, call } => + W::transact(origin_kind, require_weight_at_most, call), + HrmpNewChannelOpenRequest { sender, max_message_size, max_capacity } => + W::hrmp_new_channel_open_request(sender, max_message_size, max_capacity), + HrmpChannelAccepted { recipient } => W::hrmp_channel_accepted(recipient), + HrmpChannelClosing { initiator, sender, recipient } => + W::hrmp_channel_closing(initiator, sender, recipient), + ClearOrigin => W::clear_origin(), + DescendOrigin(who) => W::descend_origin(who), + ReportError(response_info) => W::report_error(&response_info), + DepositAsset { assets, beneficiary } => W::deposit_asset(assets, beneficiary), + DepositReserveAsset { assets, dest, xcm } => + W::deposit_reserve_asset(assets, dest, xcm), + ExchangeAsset { give, want, maximal } => W::exchange_asset(give, want, maximal), + InitiateReserveWithdraw { assets, reserve, xcm } => + W::initiate_reserve_withdraw(assets, reserve, xcm), + InitiateTeleport { assets, dest, xcm } => W::initiate_teleport(assets, dest, xcm), + ReportHolding { response_info, assets } => W::report_holding(&response_info, &assets), + BuyExecution { fees, weight_limit } => W::buy_execution(fees, weight_limit), + RefundSurplus => W::refund_surplus(), + SetErrorHandler(xcm) => W::set_error_handler(xcm), + SetAppendix(xcm) => W::set_appendix(xcm), + ClearError => W::clear_error(), + ClaimAsset { assets, ticket } => W::claim_asset(assets, ticket), + Trap(code) => W::trap(code), + SubscribeVersion { query_id, max_response_weight } => + W::subscribe_version(query_id, max_response_weight), + UnsubscribeVersion => W::unsubscribe_version(), + BurnAsset(assets) => W::burn_asset(assets), + ExpectAsset(assets) => W::expect_asset(assets), + ExpectOrigin(origin) => W::expect_origin(origin), + ExpectError(error) => W::expect_error(error), + ExpectTransactStatus(transact_status) => W::expect_transact_status(transact_status), + QueryPallet { module_name, response_info } => + W::query_pallet(module_name, response_info), + ExpectPallet { index, name, module_name, crate_major, min_crate_minor } => + W::expect_pallet(index, name, module_name, crate_major, min_crate_minor), + ReportTransactStatus(response_info) => W::report_transact_status(response_info), + ClearTransactStatus => W::clear_transact_status(), + UniversalOrigin(j) => W::universal_origin(j), + ExportMessage { network, destination, xcm } => + W::export_message(network, destination, xcm), + LockAsset { asset, unlocker } => W::lock_asset(asset, unlocker), + UnlockAsset { asset, target } => W::unlock_asset(asset, target), + NoteUnlockable { asset, owner } => W::note_unlockable(asset, owner), + RequestUnlock { asset, locker } => W::request_unlock(asset, locker), + SetFeesMode { jit_withdraw } => W::set_fees_mode(jit_withdraw), + SetTopic(topic) => W::set_topic(topic), + ClearTopic => W::clear_topic(), + AliasOrigin(location) => W::alias_origin(location), + UnpaidExecution { weight_limit, check_origin } => + W::unpaid_execution(weight_limit, check_origin), + } + } +} + +pub mod opaque { + /// The basic concrete type of `Xcm`, which doesn't make any assumptions about the + /// format of a call other than it is pre-encoded. + pub type Xcm = super::Xcm<()>; + + /// The basic concrete type of `Instruction`, which doesn't make any assumptions about the + /// format of a call other than it is pre-encoded. + pub type Instruction = super::Instruction<()>; +} + +// Convert from a v3 XCM to a v4 XCM +impl TryFrom> for Xcm { + type Error = (); + fn try_from(old_xcm: OldXcm) -> result::Result { + Ok(Xcm(old_xcm.0.into_iter().map(TryInto::try_into).collect::>()?)) + } +} + +// Convert from a v3 instruction to a v4 instruction +impl TryFrom> for Instruction { + type Error = (); + fn try_from(old_instruction: OldInstruction) -> result::Result { + use OldInstruction::*; + Ok(match old_instruction { + WithdrawAsset(assets) => Self::WithdrawAsset(assets.try_into()?), + ReserveAssetDeposited(assets) => Self::ReserveAssetDeposited(assets.try_into()?), + ReceiveTeleportedAsset(assets) => Self::ReceiveTeleportedAsset(assets.try_into()?), + QueryResponse { query_id, response, max_weight, querier: Some(querier) } => + Self::QueryResponse { + query_id, + querier: querier.try_into()?, + response: response.try_into()?, + max_weight, + }, + QueryResponse { query_id, response, max_weight, querier: None } => + Self::QueryResponse { + query_id, + querier: None, + response: response.try_into()?, + max_weight, + }, + TransferAsset { assets, beneficiary } => Self::TransferAsset { + assets: assets.try_into()?, + beneficiary: beneficiary.try_into()?, + }, + TransferReserveAsset { assets, dest, xcm } => Self::TransferReserveAsset { + assets: assets.try_into()?, + dest: dest.try_into()?, + xcm: xcm.try_into()?, + }, + HrmpNewChannelOpenRequest { sender, max_message_size, max_capacity } => + Self::HrmpNewChannelOpenRequest { sender, max_message_size, max_capacity }, + HrmpChannelAccepted { recipient } => Self::HrmpChannelAccepted { recipient }, + HrmpChannelClosing { initiator, sender, recipient } => + Self::HrmpChannelClosing { initiator, sender, recipient }, + Transact { origin_kind, require_weight_at_most, call } => + Self::Transact { origin_kind, require_weight_at_most, call: call.into() }, + ReportError(response_info) => Self::ReportError(QueryResponseInfo { + query_id: response_info.query_id, + destination: response_info.destination.try_into().map_err(|_| ())?, + max_weight: response_info.max_weight, + }), + DepositAsset { assets, beneficiary } => { + let beneficiary = beneficiary.try_into()?; + let assets = assets.try_into()?; + Self::DepositAsset { assets, beneficiary } + }, + DepositReserveAsset { assets, dest, xcm } => { + let dest = dest.try_into()?; + let xcm = xcm.try_into()?; + let assets = assets.try_into()?; + Self::DepositReserveAsset { assets, dest, xcm } + }, + ExchangeAsset { give, want, maximal } => { + let give = give.try_into()?; + let want = want.try_into()?; + Self::ExchangeAsset { give, want, maximal } + }, + InitiateReserveWithdraw { assets, reserve, xcm } => { + let assets = assets.try_into()?; + let reserve = reserve.try_into()?; + let xcm = xcm.try_into()?; + Self::InitiateReserveWithdraw { assets, reserve, xcm } + }, + InitiateTeleport { assets, dest, xcm } => { + let assets = assets.try_into()?; + let dest = dest.try_into()?; + let xcm = xcm.try_into()?; + Self::InitiateTeleport { assets, dest, xcm } + }, + ReportHolding { response_info, assets } => { + let response_info = QueryResponseInfo { + destination: response_info.destination.try_into().map_err(|_| ())?, + query_id: response_info.query_id, + max_weight: response_info.max_weight, + }; + Self::ReportHolding { response_info, assets: assets.try_into()? } + }, + BuyExecution { fees, weight_limit } => { + let fees = fees.try_into()?; + let weight_limit = weight_limit.into(); + Self::BuyExecution { fees, weight_limit } + }, + ClearOrigin => Self::ClearOrigin, + DescendOrigin(who) => Self::DescendOrigin(who.try_into()?), + RefundSurplus => Self::RefundSurplus, + SetErrorHandler(xcm) => Self::SetErrorHandler(xcm.try_into()?), + SetAppendix(xcm) => Self::SetAppendix(xcm.try_into()?), + ClearError => Self::ClearError, + ClaimAsset { assets, ticket } => { + let assets = assets.try_into()?; + let ticket = ticket.try_into()?; + Self::ClaimAsset { assets, ticket } + }, + Trap(code) => Self::Trap(code), + SubscribeVersion { query_id, max_response_weight } => + Self::SubscribeVersion { query_id, max_response_weight }, + UnsubscribeVersion => Self::UnsubscribeVersion, + BurnAsset(assets) => Self::BurnAsset(assets.try_into()?), + ExpectAsset(assets) => Self::ExpectAsset(assets.try_into()?), + ExpectOrigin(maybe_location) => Self::ExpectOrigin( + maybe_location.map(|location| location.try_into()).transpose().map_err(|_| ())?, + ), + ExpectError(maybe_error) => Self::ExpectError( + maybe_error.map(|error| error.try_into()).transpose().map_err(|_| ())?, + ), + ExpectTransactStatus(maybe_error_code) => Self::ExpectTransactStatus(maybe_error_code), + QueryPallet { module_name, response_info } => Self::QueryPallet { + module_name, + response_info: response_info.try_into().map_err(|_| ())?, + }, + ExpectPallet { index, name, module_name, crate_major, min_crate_minor } => + Self::ExpectPallet { index, name, module_name, crate_major, min_crate_minor }, + ReportTransactStatus(response_info) => + Self::ReportTransactStatus(response_info.try_into().map_err(|_| ())?), + ClearTransactStatus => Self::ClearTransactStatus, + UniversalOrigin(junction) => + Self::UniversalOrigin(junction.try_into().map_err(|_| ())?), + ExportMessage { network, destination, xcm } => Self::ExportMessage { + network: network.into(), + destination: destination.try_into().map_err(|_| ())?, + xcm: xcm.try_into().map_err(|_| ())?, + }, + LockAsset { asset, unlocker } => Self::LockAsset { + asset: asset.try_into().map_err(|_| ())?, + unlocker: unlocker.try_into().map_err(|_| ())?, + }, + UnlockAsset { asset, target } => Self::UnlockAsset { + asset: asset.try_into().map_err(|_| ())?, + target: target.try_into().map_err(|_| ())?, + }, + NoteUnlockable { asset, owner } => Self::NoteUnlockable { + asset: asset.try_into().map_err(|_| ())?, + owner: owner.try_into().map_err(|_| ())?, + }, + RequestUnlock { asset, locker } => Self::RequestUnlock { + asset: asset.try_into().map_err(|_| ())?, + locker: locker.try_into().map_err(|_| ())?, + }, + SetFeesMode { jit_withdraw } => Self::SetFeesMode { jit_withdraw }, + SetTopic(topic) => Self::SetTopic(topic), + ClearTopic => Self::ClearTopic, + AliasOrigin(location) => Self::AliasOrigin(location.try_into().map_err(|_| ())?), + UnpaidExecution { weight_limit, check_origin } => Self::UnpaidExecution { + weight_limit, + check_origin: check_origin + .map(|location| location.try_into()) + .transpose() + .map_err(|_| ())?, + }, + }) + } +} + +#[cfg(test)] +mod tests { + use super::{prelude::*, *}; + use crate::v3::{ + Junctions::Here as OldHere, MultiAssetFilter as OldMultiAssetFilter, + WildMultiAsset as OldWildMultiAsset, + }; + + #[test] + fn basic_roundtrip_works() { + let xcm = Xcm::<()>(vec![TransferAsset { + assets: (Here, 1u128).into(), + beneficiary: Here.into(), + }]); + let old_xcm = OldXcm::<()>(vec![OldInstruction::TransferAsset { + assets: (OldHere, 1u128).into(), + beneficiary: OldHere.into(), + }]); + assert_eq!(old_xcm, OldXcm::<()>::try_from(xcm.clone()).unwrap()); + let new_xcm: Xcm<()> = old_xcm.try_into().unwrap(); + assert_eq!(new_xcm, xcm); + } + + #[test] + fn teleport_roundtrip_works() { + let xcm = Xcm::<()>(vec![ + ReceiveTeleportedAsset((Here, 1u128).into()), + ClearOrigin, + DepositAsset { assets: Wild(AllCounted(1)), beneficiary: Here.into() }, + ]); + let old_xcm: OldXcm<()> = OldXcm::<()>(vec![ + OldInstruction::ReceiveTeleportedAsset((OldHere, 1u128).into()), + OldInstruction::ClearOrigin, + OldInstruction::DepositAsset { + assets: crate::v3::MultiAssetFilter::Wild(crate::v3::WildMultiAsset::AllCounted(1)), + beneficiary: OldHere.into(), + }, + ]); + assert_eq!(old_xcm, OldXcm::<()>::try_from(xcm.clone()).unwrap()); + let new_xcm: Xcm<()> = old_xcm.try_into().unwrap(); + assert_eq!(new_xcm, xcm); + } + + #[test] + fn reserve_deposit_roundtrip_works() { + let xcm = Xcm::<()>(vec![ + ReserveAssetDeposited((Here, 1u128).into()), + ClearOrigin, + BuyExecution { + fees: (Here, 1u128).into(), + weight_limit: Some(Weight::from_parts(1, 1)).into(), + }, + DepositAsset { assets: Wild(AllCounted(1)), beneficiary: Here.into() }, + ]); + let old_xcm = OldXcm::<()>(vec![ + OldInstruction::ReserveAssetDeposited((OldHere, 1u128).into()), + OldInstruction::ClearOrigin, + OldInstruction::BuyExecution { + fees: (OldHere, 1u128).into(), + weight_limit: WeightLimit::Limited(Weight::from_parts(1, 1)), + }, + OldInstruction::DepositAsset { + assets: crate::v3::MultiAssetFilter::Wild(crate::v3::WildMultiAsset::AllCounted(1)), + beneficiary: OldHere.into(), + }, + ]); + assert_eq!(old_xcm, OldXcm::<()>::try_from(xcm.clone()).unwrap()); + let new_xcm: Xcm<()> = old_xcm.try_into().unwrap(); + assert_eq!(new_xcm, xcm); + } + + #[test] + fn deposit_asset_roundtrip_works() { + let xcm = Xcm::<()>(vec![ + WithdrawAsset((Here, 1u128).into()), + DepositAsset { assets: Wild(AllCounted(1)), beneficiary: Here.into() }, + ]); + let old_xcm = OldXcm::<()>(vec![ + OldInstruction::WithdrawAsset((OldHere, 1u128).into()), + OldInstruction::DepositAsset { + assets: OldMultiAssetFilter::Wild(OldWildMultiAsset::AllCounted(1)), + beneficiary: OldHere.into(), + }, + ]); + assert_eq!(old_xcm, OldXcm::<()>::try_from(xcm.clone()).unwrap()); + let new_xcm: Xcm<()> = old_xcm.try_into().unwrap(); + assert_eq!(new_xcm, xcm); + } + + #[test] + fn deposit_reserve_asset_roundtrip_works() { + let xcm = Xcm::<()>(vec![ + WithdrawAsset((Here, 1u128).into()), + DepositReserveAsset { + assets: Wild(AllCounted(1)), + dest: Here.into(), + xcm: Xcm::<()>(vec![]), + }, + ]); + let old_xcm = OldXcm::<()>(vec![ + OldInstruction::WithdrawAsset((OldHere, 1u128).into()), + OldInstruction::DepositReserveAsset { + assets: OldMultiAssetFilter::Wild(OldWildMultiAsset::AllCounted(1)), + dest: OldHere.into(), + xcm: OldXcm::<()>(vec![]), + }, + ]); + assert_eq!(old_xcm, OldXcm::<()>::try_from(xcm.clone()).unwrap()); + let new_xcm: Xcm<()> = old_xcm.try_into().unwrap(); + assert_eq!(new_xcm, xcm); + } +} diff --git a/polkadot/xcm/src/v4/traits.rs b/polkadot/xcm/src/v4/traits.rs new file mode 100644 index 00000000000..f6136c76d80 --- /dev/null +++ b/polkadot/xcm/src/v4/traits.rs @@ -0,0 +1,312 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Cross-Consensus Message format data structures. + +pub use crate::v3::{Error, Result, SendError, XcmHash}; +use core::result; +use parity_scale_codec::{Decode, Encode}; +use scale_info::TypeInfo; + +pub use sp_weights::Weight; + +use super::*; + +/// Outcome of an XCM execution. +#[derive(Clone, Encode, Decode, Eq, PartialEq, Debug, TypeInfo)] +pub enum Outcome { + /// Execution completed successfully; given weight was used. + Complete { used: Weight }, + /// Execution started, but did not complete successfully due to the given error; given weight + /// was used. + Incomplete { used: Weight, error: Error }, + /// Execution did not start due to the given error. + Error { error: Error }, +} + +impl Outcome { + pub fn ensure_complete(self) -> Result { + match self { + Outcome::Complete { .. } => Ok(()), + Outcome::Incomplete { error, .. } => Err(error), + Outcome::Error { error, .. } => Err(error), + } + } + pub fn ensure_execution(self) -> result::Result { + match self { + Outcome::Complete { used, .. } => Ok(used), + Outcome::Incomplete { used, .. } => Ok(used), + Outcome::Error { error, .. } => Err(error), + } + } + /// How much weight was used by the XCM execution attempt. + pub fn weight_used(&self) -> Weight { + match self { + Outcome::Complete { used, .. } => *used, + Outcome::Incomplete { used, .. } => *used, + Outcome::Error { .. } => Weight::zero(), + } + } +} + +impl From for Outcome { + fn from(error: Error) -> Self { + Self::Error { error } + } +} + +pub trait PreparedMessage { + fn weight_of(&self) -> Weight; +} + +/// Type of XCM message executor. +pub trait ExecuteXcm { + type Prepared: PreparedMessage; + fn prepare(message: Xcm) -> result::Result>; + fn execute( + origin: impl Into, + pre: Self::Prepared, + id: &mut XcmHash, + weight_credit: Weight, + ) -> Outcome; + fn prepare_and_execute( + origin: impl Into, + message: Xcm, + id: &mut XcmHash, + weight_limit: Weight, + weight_credit: Weight, + ) -> Outcome { + let pre = match Self::prepare(message) { + Ok(x) => x, + Err(_) => return Outcome::Error { error: Error::WeightNotComputable }, + }; + let xcm_weight = pre.weight_of(); + if xcm_weight.any_gt(weight_limit) { + return Outcome::Error { error: Error::WeightLimitReached(xcm_weight) } + } + Self::execute(origin, pre, id, weight_credit) + } + + /// Deduct some `fees` to the sovereign account of the given `location` and place them as per + /// the convention for fees. + fn charge_fees(location: impl Into, fees: Assets) -> Result; +} + +pub enum Weightless {} +impl PreparedMessage for Weightless { + fn weight_of(&self) -> Weight { + unreachable!() + } +} + +impl ExecuteXcm for () { + type Prepared = Weightless; + fn prepare(message: Xcm) -> result::Result> { + Err(message) + } + fn execute(_: impl Into, _: Self::Prepared, _: &mut XcmHash, _: Weight) -> Outcome { + unreachable!() + } + fn charge_fees(_location: impl Into, _fees: Assets) -> Result { + Err(Error::Unimplemented) + } +} + +pub trait Reanchorable: Sized { + /// Type to return in case of an error. + type Error: Debug; + + /// Mutate `self` so that it represents the same location from the point of view of `target`. + /// The context of `self` is provided as `context`. + /// + /// Does not modify `self` in case of overflow. + fn reanchor( + &mut self, + target: &Location, + context: &InteriorLocation, + ) -> core::result::Result<(), ()>; + + /// Consume `self` and return a new value representing the same location from the point of view + /// of `target`. The context of `self` is provided as `context`. + /// + /// Returns the original `self` in case of overflow. + fn reanchored( + self, + target: &Location, + context: &InteriorLocation, + ) -> core::result::Result; +} + +/// Result value when attempting to send an XCM message. +pub type SendResult = result::Result<(T, Assets), SendError>; + +/// Utility for sending an XCM message to a given location. +/// +/// These can be amalgamated in tuples to form sophisticated routing systems. In tuple format, each +/// router might return `NotApplicable` to pass the execution to the next sender item. Note that +/// each `NotApplicable` might alter the destination and the XCM message for to the next router. +/// +/// # Example +/// ```rust +/// # use parity_scale_codec::Encode; +/// # use staging_xcm::v4::{prelude::*, Weight}; +/// # use staging_xcm::VersionedXcm; +/// # use std::convert::Infallible; +/// +/// /// A sender that only passes the message through and does nothing. +/// struct Sender1; +/// impl SendXcm for Sender1 { +/// type Ticket = Infallible; +/// fn validate(_: &mut Option, _: &mut Option>) -> SendResult { +/// Err(SendError::NotApplicable) +/// } +/// fn deliver(_: Infallible) -> Result { +/// unreachable!() +/// } +/// } +/// +/// /// A sender that accepts a message that has two junctions, otherwise stops the routing. +/// struct Sender2; +/// impl SendXcm for Sender2 { +/// type Ticket = (); +/// fn validate(destination: &mut Option, message: &mut Option>) -> SendResult<()> { +/// match destination.as_ref().ok_or(SendError::MissingArgument)?.unpack() { +/// (0, [j1, j2]) => Ok(((), Assets::new())), +/// _ => Err(SendError::Unroutable), +/// } +/// } +/// fn deliver(_: ()) -> Result { +/// Ok([0; 32]) +/// } +/// } +/// +/// /// A sender that accepts a message from a parent, passing through otherwise. +/// struct Sender3; +/// impl SendXcm for Sender3 { +/// type Ticket = (); +/// fn validate(destination: &mut Option, message: &mut Option>) -> SendResult<()> { +/// match destination.as_ref().ok_or(SendError::MissingArgument)?.unpack() { +/// (1, []) => Ok(((), Assets::new())), +/// _ => Err(SendError::NotApplicable), +/// } +/// } +/// fn deliver(_: ()) -> Result { +/// Ok([0; 32]) +/// } +/// } +/// +/// // A call to send via XCM. We don't really care about this. +/// # fn main() { +/// let call: Vec = ().encode(); +/// let message = Xcm(vec![Instruction::Transact { +/// origin_kind: OriginKind::Superuser, +/// require_weight_at_most: Weight::zero(), +/// call: call.into(), +/// }]); +/// let message_hash = message.using_encoded(sp_io::hashing::blake2_256); +/// +/// // Sender2 will block this. +/// assert!(send_xcm::<(Sender1, Sender2, Sender3)>(Parent.into(), message.clone()).is_err()); +/// +/// // Sender3 will catch this. +/// assert!(send_xcm::<(Sender1, Sender3)>(Parent.into(), message.clone()).is_ok()); +/// # } +/// ``` +pub trait SendXcm { + /// Intermediate value which connects the two phases of the send operation. + type Ticket; + + /// Check whether the given `_message` is deliverable to the given `_destination` and if so + /// determine the cost which will be paid by this chain to do so, returning a `Validated` token + /// which can be used to enact delivery. + /// + /// The `destination` and `message` must be `Some` (or else an error will be returned) and they + /// may only be consumed if the `Err` is not `NotApplicable`. + /// + /// If it is not a destination which can be reached with this type but possibly could by others, + /// then this *MUST* return `NotApplicable`. Any other error will cause the tuple + /// implementation to exit early without trying other type fields. + fn validate( + destination: &mut Option, + message: &mut Option>, + ) -> SendResult; + + /// Actually carry out the delivery operation for a previously validated message sending. + fn deliver(ticket: Self::Ticket) -> result::Result; +} + +#[impl_trait_for_tuples::impl_for_tuples(30)] +impl SendXcm for Tuple { + for_tuples! { type Ticket = (#( Option ),* ); } + + fn validate( + destination: &mut Option, + message: &mut Option>, + ) -> SendResult { + let mut maybe_cost: Option = None; + let one_ticket: Self::Ticket = (for_tuples! { #( + if maybe_cost.is_some() { + None + } else { + match Tuple::validate(destination, message) { + Err(SendError::NotApplicable) => None, + Err(e) => { return Err(e) }, + Ok((v, c)) => { + maybe_cost = Some(c); + Some(v) + }, + } + } + ),* }); + if let Some(cost) = maybe_cost { + Ok((one_ticket, cost)) + } else { + Err(SendError::NotApplicable) + } + } + + fn deliver(one_ticket: Self::Ticket) -> result::Result { + for_tuples!( #( + if let Some(validated) = one_ticket.Tuple { + return Tuple::deliver(validated); + } + )* ); + Err(SendError::Unroutable) + } +} + +/// Convenience function for using a `SendXcm` implementation. Just interprets the `dest` and wraps +/// both in `Some` before passing them as as mutable references into `T::send_xcm`. +pub fn validate_send(dest: Location, msg: Xcm<()>) -> SendResult { + T::validate(&mut Some(dest), &mut Some(msg)) +} + +/// Convenience function for using a `SendXcm` implementation. Just interprets the `dest` and wraps +/// both in `Some` before passing them as as mutable references into `T::send_xcm`. +/// +/// Returns either `Ok` with the price of the delivery, or `Err` with the reason why the message +/// could not be sent. +/// +/// Generally you'll want to validate and get the price first to ensure that the sender can pay it +/// before actually doing the delivery. +pub fn send_xcm( + dest: Location, + msg: Xcm<()>, +) -> result::Result<(XcmHash, Assets), SendError> { + let (ticket, price) = T::validate(&mut Some(dest), &mut Some(msg))?; + let hash = T::deliver(ticket)?; + Ok((hash, price)) +} diff --git a/polkadot/xcm/xcm-builder/src/asset_conversion.rs b/polkadot/xcm/xcm-builder/src/asset_conversion.rs index 5b76ed764a8..e38af149be5 100644 --- a/polkadot/xcm/xcm-builder/src/asset_conversion.rs +++ b/polkadot/xcm/xcm-builder/src/asset_conversion.rs @@ -23,39 +23,42 @@ use xcm::latest::prelude::*; use xcm_executor::traits::{Error as MatchError, MatchesFungibles, MatchesNonFungibles}; /// Converter struct implementing `AssetIdConversion` converting a numeric asset ID (must be -/// `TryFrom/TryInto`) into a `GeneralIndex` junction, prefixed by some `MultiLocation` value. -/// The `MultiLocation` value will typically be a `PalletInstance` junction. -pub struct AsPrefixedGeneralIndex( - PhantomData<(Prefix, AssetId, ConvertAssetId)>, +/// `TryFrom/TryInto`) into a `GeneralIndex` junction, prefixed by some `Location` value. +/// The `Location` value will typically be a `PalletInstance` junction. +pub struct AsPrefixedGeneralIndex( + PhantomData<(Prefix, AssetId, ConvertAssetId, L)>, ); impl< - Prefix: Get, + Prefix: Get, AssetId: Clone, ConvertAssetId: MaybeEquivalence, - > MaybeEquivalence - for AsPrefixedGeneralIndex + L: TryInto + TryFrom + Clone, + > MaybeEquivalence for AsPrefixedGeneralIndex { - fn convert(id: &MultiLocation) -> Option { + fn convert(id: &L) -> Option { let prefix = Prefix::get(); - if prefix.parent_count() != id.parent_count() || - prefix + let latest_prefix: Location = prefix.try_into().ok()?; + let latest_id: Location = (*id).clone().try_into().ok()?; + if latest_prefix.parent_count() != latest_id.parent_count() || + latest_prefix .interior() .iter() .enumerate() - .any(|(index, junction)| id.interior().at(index) != Some(junction)) + .any(|(index, junction)| latest_id.interior().at(index) != Some(junction)) { return None } - match id.interior().at(prefix.interior().len()) { - Some(Junction::GeneralIndex(id)) => ConvertAssetId::convert(id), + match latest_id.interior().at(latest_prefix.interior().len()) { + Some(Junction::GeneralIndex(id)) => ConvertAssetId::convert(&id), _ => None, } } - fn convert_back(what: &AssetId) -> Option { - let mut location = Prefix::get(); + fn convert_back(what: &AssetId) -> Option { + let location = Prefix::get(); + let mut latest_location: Location = location.try_into().ok()?; let id = ConvertAssetId::convert_back(what)?; - location.push_interior(Junction::GeneralIndex(id)).ok()?; - Some(location) + latest_location.push_interior(Junction::GeneralIndex(id)).ok()?; + latest_location.try_into().ok() } } @@ -65,14 +68,14 @@ pub struct ConvertedConcreteId( impl< AssetId: Clone, Balance: Clone, - ConvertAssetId: MaybeEquivalence, + ConvertAssetId: MaybeEquivalence, ConvertBalance: MaybeEquivalence, > MatchesFungibles for ConvertedConcreteId { - fn matches_fungibles(a: &MultiAsset) -> result::Result<(AssetId, Balance), MatchError> { + fn matches_fungibles(a: &Asset) -> result::Result<(AssetId, Balance), MatchError> { let (amount, id) = match (&a.fun, &a.id) { - (Fungible(ref amount), Concrete(ref id)) => (amount, id), + (Fungible(ref amount), AssetId(ref id)) => (amount, id), _ => return Err(MatchError::AssetNotHandled), }; let what = ConvertAssetId::convert(id).ok_or(MatchError::AssetIdConversionFailed)?; @@ -84,14 +87,14 @@ impl< impl< ClassId: Clone, InstanceId: Clone, - ConvertClassId: MaybeEquivalence, + ConvertClassId: MaybeEquivalence, ConvertInstanceId: MaybeEquivalence, > MatchesNonFungibles for ConvertedConcreteId { - fn matches_nonfungibles(a: &MultiAsset) -> result::Result<(ClassId, InstanceId), MatchError> { + fn matches_nonfungibles(a: &Asset) -> result::Result<(ClassId, InstanceId), MatchError> { let (instance, class) = match (&a.fun, &a.id) { - (NonFungible(ref instance), Concrete(ref class)) => (instance, class), + (NonFungible(ref instance), AssetId(ref class)) => (instance, class), _ => return Err(MatchError::AssetNotHandled), }; let what = ConvertClassId::convert(class).ok_or(MatchError::AssetIdConversionFailed)?; @@ -101,68 +104,35 @@ impl< } } -pub struct ConvertedAbstractId( - PhantomData<(AssetId, Balance, ConvertAssetId, ConvertOther)>, -); -impl< - AssetId: Clone, - Balance: Clone, - ConvertAssetId: MaybeEquivalence<[u8; 32], AssetId>, - ConvertBalance: MaybeEquivalence, - > MatchesFungibles - for ConvertedAbstractId -{ - fn matches_fungibles(a: &MultiAsset) -> result::Result<(AssetId, Balance), MatchError> { - let (amount, id) = match (&a.fun, &a.id) { - (Fungible(ref amount), Abstract(ref id)) => (amount, id), - _ => return Err(MatchError::AssetNotHandled), - }; - let what = ConvertAssetId::convert(id).ok_or(MatchError::AssetIdConversionFailed)?; - let amount = - ConvertBalance::convert(amount).ok_or(MatchError::AmountToBalanceConversionFailed)?; - Ok((what, amount)) +#[deprecated = "Use `ConvertedConcreteId` instead"] +pub type ConvertedConcreteAssetId = ConvertedConcreteId; + +pub struct V4V3LocationConverter; +impl MaybeEquivalence for V4V3LocationConverter { + fn convert(old: &xcm::v4::Location) -> Option { + (*old).clone().try_into().ok() } -} -impl< - ClassId: Clone, - InstanceId: Clone, - ConvertClassId: MaybeEquivalence<[u8; 32], ClassId>, - ConvertInstanceId: MaybeEquivalence, - > MatchesNonFungibles - for ConvertedAbstractId -{ - fn matches_nonfungibles(a: &MultiAsset) -> result::Result<(ClassId, InstanceId), MatchError> { - let (instance, class) = match (&a.fun, &a.id) { - (NonFungible(ref instance), Abstract(ref class)) => (instance, class), - _ => return Err(MatchError::AssetNotHandled), - }; - let what = ConvertClassId::convert(class).ok_or(MatchError::AssetIdConversionFailed)?; - let instance = - ConvertInstanceId::convert(instance).ok_or(MatchError::InstanceConversionFailed)?; - Ok((what, instance)) + + fn convert_back(new: &xcm::v3::Location) -> Option { + (*new).try_into().ok() } } -#[deprecated = "Use `ConvertedConcreteId` instead"] -pub type ConvertedConcreteAssetId = ConvertedConcreteId; -#[deprecated = "Use `ConvertedAbstractId` instead"] -pub type ConvertedAbstractAssetId = ConvertedAbstractId; - pub struct MatchedConvertedConcreteId( PhantomData<(AssetId, Balance, MatchAssetId, ConvertAssetId, ConvertOther)>, ); impl< AssetId: Clone, Balance: Clone, - MatchAssetId: Contains, - ConvertAssetId: MaybeEquivalence, + MatchAssetId: Contains, + ConvertAssetId: MaybeEquivalence, ConvertBalance: MaybeEquivalence, > MatchesFungibles for MatchedConvertedConcreteId { - fn matches_fungibles(a: &MultiAsset) -> result::Result<(AssetId, Balance), MatchError> { + fn matches_fungibles(a: &Asset) -> result::Result<(AssetId, Balance), MatchError> { let (amount, id) = match (&a.fun, &a.id) { - (Fungible(ref amount), Concrete(ref id)) if MatchAssetId::contains(id) => (amount, id), + (Fungible(ref amount), AssetId(ref id)) if MatchAssetId::contains(id) => (amount, id), _ => return Err(MatchError::AssetNotHandled), }; let what = ConvertAssetId::convert(id).ok_or(MatchError::AssetIdConversionFailed)?; @@ -174,15 +144,15 @@ impl< impl< ClassId: Clone, InstanceId: Clone, - MatchClassId: Contains, - ConvertClassId: MaybeEquivalence, + MatchClassId: Contains, + ConvertClassId: MaybeEquivalence, ConvertInstanceId: MaybeEquivalence, > MatchesNonFungibles for MatchedConvertedConcreteId { - fn matches_nonfungibles(a: &MultiAsset) -> result::Result<(ClassId, InstanceId), MatchError> { + fn matches_nonfungibles(a: &Asset) -> result::Result<(ClassId, InstanceId), MatchError> { let (instance, class) = match (&a.fun, &a.id) { - (NonFungible(ref instance), Concrete(ref class)) if MatchClassId::contains(class) => + (NonFungible(ref instance), AssetId(ref class)) if MatchClassId::contains(class) => (instance, class), _ => return Err(MatchError::AssetNotHandled), }; @@ -200,10 +170,10 @@ mod tests { use xcm_executor::traits::JustTry; struct OnlyParentZero; - impl Contains for OnlyParentZero { - fn contains(a: &MultiLocation) -> bool { + impl Contains for OnlyParentZero { + fn contains(a: &Location) -> bool { match a { - MultiLocation { parents: 0, .. } => true, + Location { parents: 0, .. } => true, _ => false, } } @@ -214,7 +184,7 @@ mod tests { type AssetIdForTrustBackedAssets = u32; type Balance = u128; frame_support::parameter_types! { - pub TrustBackedAssetsPalletLocation: MultiLocation = PalletInstance(50).into(); + pub TrustBackedAssetsPalletLocation: Location = PalletInstance(50).into(); } // ConvertedConcreteId cfg @@ -231,13 +201,13 @@ mod tests { >; assert_eq!( TrustBackedAssetsPalletLocation::get(), - MultiLocation { parents: 0, interior: X1(PalletInstance(50)) } + Location { parents: 0, interior: [PalletInstance(50)].into() } ); // err - does not match assert_eq!( - Converter::matches_fungibles(&MultiAsset { - id: Concrete(MultiLocation::new(1, X2(PalletInstance(50), GeneralIndex(1)))), + Converter::matches_fungibles(&Asset { + id: AssetId(Location::new(1, [PalletInstance(50), GeneralIndex(1)])), fun: Fungible(12345), }), Err(MatchError::AssetNotHandled) @@ -245,10 +215,10 @@ mod tests { // err - matches, but convert fails assert_eq!( - Converter::matches_fungibles(&MultiAsset { - id: Concrete(MultiLocation::new( + Converter::matches_fungibles(&Asset { + id: AssetId(Location::new( 0, - X2(PalletInstance(50), GeneralKey { length: 1, data: [1; 32] }) + [PalletInstance(50), GeneralKey { length: 1, data: [1; 32] }] )), fun: Fungible(12345), }), @@ -257,8 +227,8 @@ mod tests { // err - matches, but NonFungible assert_eq!( - Converter::matches_fungibles(&MultiAsset { - id: Concrete(MultiLocation::new(0, X2(PalletInstance(50), GeneralIndex(1)))), + Converter::matches_fungibles(&Asset { + id: AssetId(Location::new(0, [PalletInstance(50), GeneralIndex(1)])), fun: NonFungible(Index(54321)), }), Err(MatchError::AssetNotHandled) @@ -266,8 +236,8 @@ mod tests { // ok assert_eq!( - Converter::matches_fungibles(&MultiAsset { - id: Concrete(MultiLocation::new(0, X2(PalletInstance(50), GeneralIndex(1)))), + Converter::matches_fungibles(&Asset { + id: AssetId(Location::new(0, [PalletInstance(50), GeneralIndex(1)])), fun: Fungible(12345), }), Ok((1, 12345)) @@ -279,7 +249,7 @@ mod tests { type ClassId = u32; type ClassInstanceId = u64; frame_support::parameter_types! { - pub TrustBackedAssetsPalletLocation: MultiLocation = PalletInstance(50).into(); + pub TrustBackedAssetsPalletLocation: Location = PalletInstance(50).into(); } // ConvertedConcreteId cfg @@ -303,13 +273,13 @@ mod tests { >; assert_eq!( TrustBackedAssetsPalletLocation::get(), - MultiLocation { parents: 0, interior: X1(PalletInstance(50)) } + Location { parents: 0, interior: [PalletInstance(50)].into() } ); // err - does not match assert_eq!( - Converter::matches_nonfungibles(&MultiAsset { - id: Concrete(MultiLocation::new(1, X2(PalletInstance(50), GeneralIndex(1)))), + Converter::matches_nonfungibles(&Asset { + id: AssetId(Location::new(1, [PalletInstance(50), GeneralIndex(1)])), fun: NonFungible(Index(54321)), }), Err(MatchError::AssetNotHandled) @@ -317,10 +287,10 @@ mod tests { // err - matches, but convert fails assert_eq!( - Converter::matches_nonfungibles(&MultiAsset { - id: Concrete(MultiLocation::new( + Converter::matches_nonfungibles(&Asset { + id: AssetId(Location::new( 0, - X2(PalletInstance(50), GeneralKey { length: 1, data: [1; 32] }) + [PalletInstance(50), GeneralKey { length: 1, data: [1; 32] }] )), fun: NonFungible(Index(54321)), }), @@ -329,8 +299,8 @@ mod tests { // err - matches, but Fungible vs NonFungible assert_eq!( - Converter::matches_nonfungibles(&MultiAsset { - id: Concrete(MultiLocation::new(0, X2(PalletInstance(50), GeneralIndex(1)))), + Converter::matches_nonfungibles(&Asset { + id: AssetId(Location::new(0, [PalletInstance(50), GeneralIndex(1)])), fun: Fungible(12345), }), Err(MatchError::AssetNotHandled) @@ -338,8 +308,8 @@ mod tests { // ok assert_eq!( - Converter::matches_nonfungibles(&MultiAsset { - id: Concrete(MultiLocation::new(0, X2(PalletInstance(50), GeneralIndex(1)))), + Converter::matches_nonfungibles(&Asset { + id: AssetId(Location::new(0, [PalletInstance(50), GeneralIndex(1)])), fun: NonFungible(Index(54321)), }), Ok((1, 54321)) diff --git a/polkadot/xcm/xcm-builder/src/barriers.rs b/polkadot/xcm/xcm-builder/src/barriers.rs index c2b62751c68..80411ab5a22 100644 --- a/polkadot/xcm/xcm-builder/src/barriers.rs +++ b/polkadot/xcm/xcm-builder/src/barriers.rs @@ -34,7 +34,7 @@ use xcm_executor::traits::{CheckSuspension, OnResponse, Properties, ShouldExecut pub struct TakeWeightCredit; impl ShouldExecute for TakeWeightCredit { fn should_execute( - _origin: &MultiLocation, + _origin: &Location, _instructions: &mut [Instruction], max_weight: Weight, properties: &mut Properties, @@ -60,9 +60,9 @@ const MAX_ASSETS_FOR_BUY_EXECUTION: usize = 2; /// Only allows for `TeleportAsset`, `WithdrawAsset`, `ClaimAsset` and `ReserveAssetDeposit` XCMs /// because they are the only ones that place assets in the Holding Register to pay for execution. pub struct AllowTopLevelPaidExecutionFrom(PhantomData); -impl> ShouldExecute for AllowTopLevelPaidExecutionFrom { +impl> ShouldExecute for AllowTopLevelPaidExecutionFrom { fn should_execute( - origin: &MultiLocation, + origin: &Location, instructions: &mut [Instruction], max_weight: Weight, _properties: &mut Properties, @@ -158,14 +158,11 @@ impl> ShouldExecute for AllowTopLevelPaidExecutionFro pub struct WithComputedOrigin( PhantomData<(InnerBarrier, LocalUniversal, MaxPrefixes)>, ); -impl< - InnerBarrier: ShouldExecute, - LocalUniversal: Get, - MaxPrefixes: Get, - > ShouldExecute for WithComputedOrigin +impl, MaxPrefixes: Get> + ShouldExecute for WithComputedOrigin { fn should_execute( - origin: &MultiLocation, + origin: &Location, instructions: &mut [Instruction], max_weight: Weight, properties: &mut Properties, @@ -175,7 +172,7 @@ impl< "WithComputedOrigin origin: {:?}, instructions: {:?}, max_weight: {:?}, properties: {:?}", origin, instructions, max_weight, properties, ); - let mut actual_origin = *origin; + let mut actual_origin = origin.clone(); let skipped = Cell::new(0usize); // NOTE: We do not check the validity of `UniversalOrigin` here, meaning that a malicious // origin could place a `UniversalOrigin` in order to spoof some location which gets free @@ -190,10 +187,11 @@ impl< // Note the origin is *relative to local consensus*! So we need to escape // local consensus with the `parents` before diving in into the // `universal_location`. - actual_origin = X1(*new_global).relative_to(&LocalUniversal::get()); + actual_origin = + Junctions::from([*new_global]).relative_to(&LocalUniversal::get()); }, DescendOrigin(j) => { - let Ok(_) = actual_origin.append_with(*j) else { + let Ok(_) = actual_origin.append_with(j.clone()) else { return Err(ProcessMessageError::Unsupported) }; }, @@ -221,7 +219,7 @@ impl< pub struct TrailingSetTopicAsId(PhantomData); impl ShouldExecute for TrailingSetTopicAsId { fn should_execute( - origin: &MultiLocation, + origin: &Location, instructions: &mut [Instruction], max_weight: Weight, properties: &mut Properties, @@ -250,7 +248,7 @@ where SuspensionChecker: CheckSuspension, { fn should_execute( - origin: &MultiLocation, + origin: &Location, instructions: &mut [Instruction], max_weight: Weight, properties: &mut Properties, @@ -268,9 +266,9 @@ where /// Use only for executions from completely trusted origins, from which no permissionless messages /// can be sent. pub struct AllowUnpaidExecutionFrom(PhantomData); -impl> ShouldExecute for AllowUnpaidExecutionFrom { +impl> ShouldExecute for AllowUnpaidExecutionFrom { fn should_execute( - origin: &MultiLocation, + origin: &Location, instructions: &mut [Instruction], _max_weight: Weight, _properties: &mut Properties, @@ -290,9 +288,9 @@ impl> ShouldExecute for AllowUnpaidExecutionFrom { /// /// Use only for executions from trusted origin groups. pub struct AllowExplicitUnpaidExecutionFrom(PhantomData); -impl> ShouldExecute for AllowExplicitUnpaidExecutionFrom { +impl> ShouldExecute for AllowExplicitUnpaidExecutionFrom { fn should_execute( - origin: &MultiLocation, + origin: &Location, instructions: &mut [Instruction], max_weight: Weight, _properties: &mut Properties, @@ -314,11 +312,11 @@ impl> ShouldExecute for AllowExplicitUnpaidExecutionF /// Allows a message only if it is from a system-level child parachain. pub struct IsChildSystemParachain(PhantomData); -impl> Contains for IsChildSystemParachain { - fn contains(l: &MultiLocation) -> bool { +impl> Contains for IsChildSystemParachain { + fn contains(l: &Location) -> bool { matches!( - l.interior(), - Junctions::X1(Junction::Parachain(id)) + l.interior().as_slice(), + [Junction::Parachain(id)] if ParaId::from(*id).is_system() && l.parent_count() == 0, ) } @@ -328,7 +326,7 @@ impl> Contains for IsChildSystemPara pub struct AllowKnownQueryResponses(PhantomData); impl ShouldExecute for AllowKnownQueryResponses { fn should_execute( - origin: &MultiLocation, + origin: &Location, instructions: &mut [Instruction], _max_weight: Weight, _properties: &mut Properties, @@ -354,9 +352,9 @@ impl ShouldExecute for AllowKnownQueryResponses(PhantomData); -impl> ShouldExecute for AllowSubscriptionsFrom { +impl> ShouldExecute for AllowSubscriptionsFrom { fn should_execute( - origin: &MultiLocation, + origin: &Location, instructions: &mut [Instruction], _max_weight: Weight, _properties: &mut Properties, @@ -391,7 +389,7 @@ where Allow: ShouldExecute, { fn should_execute( - origin: &MultiLocation, + origin: &Location, message: &mut [Instruction], max_weight: Weight, properties: &mut Properties, @@ -405,7 +403,7 @@ where pub struct DenyReserveTransferToRelayChain; impl ShouldExecute for DenyReserveTransferToRelayChain { fn should_execute( - origin: &MultiLocation, + origin: &Location, message: &mut [Instruction], _max_weight: Weight, _properties: &mut Properties, @@ -414,22 +412,18 @@ impl ShouldExecute for DenyReserveTransferToRelayChain { |_| true, |inst| match inst { InitiateReserveWithdraw { - reserve: MultiLocation { parents: 1, interior: Here }, + reserve: Location { parents: 1, interior: Here }, .. } | - DepositReserveAsset { - dest: MultiLocation { parents: 1, interior: Here }, .. - } | - TransferReserveAsset { - dest: MultiLocation { parents: 1, interior: Here }, .. - } => { + DepositReserveAsset { dest: Location { parents: 1, interior: Here }, .. } | + TransferReserveAsset { dest: Location { parents: 1, interior: Here }, .. } => { Err(ProcessMessageError::Unsupported) // Deny }, // An unexpected reserve transfer has arrived from the Relay Chain. Generally, // `IsReserve` should not allow this, but we just log it here. ReserveAssetDeposited { .. } - if matches!(origin, MultiLocation { parents: 1, interior: Here }) => + if matches!(origin, Location { parents: 1, interior: Here }) => { log::warn!( target: "xcm::barrier", diff --git a/polkadot/xcm/xcm-builder/src/controller.rs b/polkadot/xcm/xcm-builder/src/controller.rs index 931d812eaaf..8ead18b5bd7 100644 --- a/polkadot/xcm/xcm-builder/src/controller.rs +++ b/polkadot/xcm/xcm-builder/src/controller.rs @@ -45,7 +45,7 @@ pub trait ExecuteControllerWeightInfo { /// Execute an XCM locally, for a given origin. /// /// An implementation of that trait will handle the low-level details of the execution, such as: -/// - Validating and Converting the origin to a MultiLocation. +/// - Validating and Converting the origin to a Location. /// - Handling versioning. /// - Calling the internal executor, which implements [`ExecuteXcm`]. pub trait ExecuteController { @@ -92,7 +92,7 @@ pub trait SendController { /// - `msg`: the XCM to be sent. fn send( origin: Origin, - dest: Box, + dest: Box, message: Box>, ) -> Result; } @@ -127,7 +127,7 @@ pub trait QueryController: QueryHandler { fn query( origin: Origin, timeout: Timeout, - match_querier: VersionedMultiLocation, + match_querier: VersionedLocation, ) -> Result; } @@ -138,7 +138,7 @@ impl ExecuteController for () { _message: Box>, _max_weight: Weight, ) -> Result { - Ok(Outcome::Error(XcmError::Unimplemented)) + Ok(Outcome::Error { error: XcmError::Unimplemented }) } } @@ -152,7 +152,7 @@ impl SendController for () { type WeightInfo = (); fn send( _origin: Origin, - _dest: Box, + _dest: Box, _message: Box>, ) -> Result { Ok(Default::default()) @@ -180,7 +180,7 @@ impl QueryController for () { fn query( _origin: Origin, _timeout: Timeout, - _match_querier: VersionedMultiLocation, + _match_querier: VersionedLocation, ) -> Result { Ok(Default::default()) } diff --git a/polkadot/xcm/xcm-builder/src/currency_adapter.rs b/polkadot/xcm/xcm-builder/src/currency_adapter.rs index 68ca0111174..fe26b7319bb 100644 --- a/polkadot/xcm/xcm-builder/src/currency_adapter.rs +++ b/polkadot/xcm/xcm-builder/src/currency_adapter.rs @@ -22,17 +22,17 @@ use super::MintLocation; use frame_support::traits::{ExistenceRequirement::AllowDeath, Get, WithdrawReasons}; use sp_runtime::traits::CheckedSub; use sp_std::{marker::PhantomData, result}; -use xcm::latest::{Error as XcmError, MultiAsset, MultiLocation, Result, XcmContext}; +use xcm::latest::{Asset, Error as XcmError, Location, Result, XcmContext}; use xcm_executor::{ traits::{ConvertLocation, MatchesFungible, TransactAsset}, - Assets, + AssetsInHolding, }; /// Asset transaction errors. enum Error { /// The given asset is not handled. (According to [`XcmError::AssetNotFound`]) AssetNotHandled, - /// `MultiLocation` to `AccountId` conversion failed. + /// `Location` to `AccountId` conversion failed. AccountIdConversionFailed, } @@ -62,7 +62,7 @@ impl From for XcmError { /// /// /// Our relay chain's location. /// parameter_types! { -/// pub RelayChain: MultiLocation = Parent.into(); +/// pub RelayChain: Location = Parent.into(); /// pub CheckingAccount: AccountId = PalletId(*b"checking").into_account_truncating(); /// } /// @@ -142,7 +142,7 @@ impl< > TransactAsset for CurrencyAdapter { - fn can_check_in(_origin: &MultiLocation, what: &MultiAsset, _context: &XcmContext) -> Result { + fn can_check_in(_origin: &Location, what: &Asset, _context: &XcmContext) -> Result { log::trace!(target: "xcm::currency_adapter", "can_check_in origin: {:?}, what: {:?}", _origin, what); // Check we handle this asset. let amount: Currency::Balance = @@ -156,7 +156,7 @@ impl< } } - fn check_in(_origin: &MultiLocation, what: &MultiAsset, _context: &XcmContext) { + fn check_in(_origin: &Location, what: &Asset, _context: &XcmContext) { log::trace!(target: "xcm::currency_adapter", "check_in origin: {:?}, what: {:?}", _origin, what); if let Some(amount) = Matcher::matches_fungible(what) { match CheckedAccount::get() { @@ -169,7 +169,7 @@ impl< } } - fn can_check_out(_dest: &MultiLocation, what: &MultiAsset, _context: &XcmContext) -> Result { + fn can_check_out(_dest: &Location, what: &Asset, _context: &XcmContext) -> Result { log::trace!(target: "xcm::currency_adapter", "check_out dest: {:?}, what: {:?}", _dest, what); let amount = Matcher::matches_fungible(what).ok_or(Error::AssetNotHandled)?; match CheckedAccount::get() { @@ -181,7 +181,7 @@ impl< } } - fn check_out(_dest: &MultiLocation, what: &MultiAsset, _context: &XcmContext) { + fn check_out(_dest: &Location, what: &Asset, _context: &XcmContext) { log::trace!(target: "xcm::currency_adapter", "check_out dest: {:?}, what: {:?}", _dest, what); if let Some(amount) = Matcher::matches_fungible(what) { match CheckedAccount::get() { @@ -194,11 +194,7 @@ impl< } } - fn deposit_asset( - what: &MultiAsset, - who: &MultiLocation, - _context: Option<&XcmContext>, - ) -> Result { + fn deposit_asset(what: &Asset, who: &Location, _context: Option<&XcmContext>) -> Result { log::trace!(target: "xcm::currency_adapter", "deposit_asset what: {:?}, who: {:?}", what, who); // Check we handle this asset. let amount = Matcher::matches_fungible(&what).ok_or(Error::AssetNotHandled)?; @@ -209,10 +205,10 @@ impl< } fn withdraw_asset( - what: &MultiAsset, - who: &MultiLocation, + what: &Asset, + who: &Location, _maybe_context: Option<&XcmContext>, - ) -> result::Result { + ) -> result::Result { log::trace!(target: "xcm::currency_adapter", "withdraw_asset what: {:?}, who: {:?}", what, who); // Check we handle this asset. let amount = Matcher::matches_fungible(what).ok_or(Error::AssetNotHandled)?; @@ -224,11 +220,11 @@ impl< } fn internal_transfer_asset( - asset: &MultiAsset, - from: &MultiLocation, - to: &MultiLocation, + asset: &Asset, + from: &Location, + to: &Location, _context: &XcmContext, - ) -> result::Result { + ) -> result::Result { log::trace!(target: "xcm::currency_adapter", "internal_transfer_asset asset: {:?}, from: {:?}, to: {:?}", asset, from, to); let amount = Matcher::matches_fungible(asset).ok_or(Error::AssetNotHandled)?; let from = diff --git a/polkadot/xcm/xcm-builder/src/fee_handling.rs b/polkadot/xcm/xcm-builder/src/fee_handling.rs index c158d5d862d..e114b3601c8 100644 --- a/polkadot/xcm/xcm-builder/src/fee_handling.rs +++ b/polkadot/xcm/xcm-builder/src/fee_handling.rs @@ -25,27 +25,22 @@ pub trait HandleFee { /// fees. /// /// Returns any part of the fee that wasn't consumed. - fn handle_fee(fee: MultiAssets, context: Option<&XcmContext>, reason: FeeReason) - -> MultiAssets; + fn handle_fee(fee: Assets, context: Option<&XcmContext>, reason: FeeReason) -> Assets; } // Default `HandleFee` implementation that just burns the fee. impl HandleFee for () { - fn handle_fee(_: MultiAssets, _: Option<&XcmContext>, _: FeeReason) -> MultiAssets { - MultiAssets::new() + fn handle_fee(_: Assets, _: Option<&XcmContext>, _: FeeReason) -> Assets { + Assets::new() } } #[impl_trait_for_tuples::impl_for_tuples(1, 30)] impl HandleFee for Tuple { - fn handle_fee( - fee: MultiAssets, - context: Option<&XcmContext>, - reason: FeeReason, - ) -> MultiAssets { + fn handle_fee(fee: Assets, context: Option<&XcmContext>, reason: FeeReason) -> Assets { let mut unconsumed_fee = fee; for_tuples!( #( - unconsumed_fee = Tuple::handle_fee(unconsumed_fee, context, reason); + unconsumed_fee = Tuple::handle_fee(unconsumed_fee, context, reason.clone()); if unconsumed_fee.is_none() { return unconsumed_fee; } @@ -60,15 +55,15 @@ impl HandleFee for Tuple { pub struct XcmFeeManagerFromComponents( PhantomData<(WaivedLocations, HandleFee)>, ); -impl, FeeHandler: HandleFee> FeeManager +impl, FeeHandler: HandleFee> FeeManager for XcmFeeManagerFromComponents { - fn is_waived(origin: Option<&MultiLocation>, _: FeeReason) -> bool { + fn is_waived(origin: Option<&Location>, _: FeeReason) -> bool { let Some(loc) = origin else { return false }; WaivedLocations::contains(loc) } - fn handle_fee(fee: MultiAssets, context: Option<&XcmContext>, reason: FeeReason) { + fn handle_fee(fee: Assets, context: Option<&XcmContext>, reason: FeeReason) { FeeHandler::handle_fee(fee, context, reason); } } @@ -76,7 +71,7 @@ impl, FeeHandler: HandleFee> FeeManager /// Try to deposit the given fee in the specified account. /// Burns the fee in case of a failure. pub fn deposit_or_burn_fee>( - fee: MultiAssets, + fee: Assets, context: Option<&XcmContext>, receiver: AccountId, ) { @@ -109,13 +104,9 @@ impl< ReceiverAccount: Get, > HandleFee for XcmFeeToAccount { - fn handle_fee( - fee: MultiAssets, - context: Option<&XcmContext>, - _reason: FeeReason, - ) -> MultiAssets { + fn handle_fee(fee: Assets, context: Option<&XcmContext>, _reason: FeeReason) -> Assets { deposit_or_burn_fee::(fee, context, ReceiverAccount::get()); - MultiAssets::new() + Assets::new() } } diff --git a/polkadot/xcm/xcm-builder/src/filter_asset_location.rs b/polkadot/xcm/xcm-builder/src/filter_asset_location.rs index df81f536f7b..d80c5d70dee 100644 --- a/polkadot/xcm/xcm-builder/src/filter_asset_location.rs +++ b/polkadot/xcm/xcm-builder/src/filter_asset_location.rs @@ -14,28 +14,26 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -//! Various implementations of `ContainsPair` or -//! `Contains<(MultiLocation, Vec)>`. +//! Various implementations of `ContainsPair` or +//! `Contains<(Location, Vec)>`. use frame_support::traits::{Contains, ContainsPair, Get}; use sp_std::{marker::PhantomData, vec::Vec}; -use xcm::latest::{AssetId::Concrete, MultiAsset, MultiAssetFilter, MultiLocation, WildMultiAsset}; +use xcm::latest::{Asset, AssetFilter, AssetId, Location, WildAsset}; /// Accepts an asset iff it is a native asset. pub struct NativeAsset; -impl ContainsPair for NativeAsset { - fn contains(asset: &MultiAsset, origin: &MultiLocation) -> bool { +impl ContainsPair for NativeAsset { + fn contains(asset: &Asset, origin: &Location) -> bool { log::trace!(target: "xcm::contains", "NativeAsset asset: {:?}, origin: {:?}", asset, origin); - matches!(asset.id, Concrete(ref id) if id == origin) + matches!(asset.id, AssetId(ref id) if id == origin) } } /// Accepts an asset if it is contained in the given `T`'s `Get` implementation. pub struct Case(PhantomData); -impl> ContainsPair - for Case -{ - fn contains(asset: &MultiAsset, origin: &MultiLocation) -> bool { +impl> ContainsPair for Case { + fn contains(asset: &Asset, origin: &Location) -> bool { log::trace!(target: "xcm::contains", "Case asset: {:?}, origin: {:?}", asset, origin); let (a, o) = T::get(); a.matches(asset) && &o == origin @@ -44,18 +42,18 @@ impl> ContainsPair( - sp_std::marker::PhantomData<(Location, AssetFilters)>, +/// the `AssetFilter` instances provided by the `Get` implementation of `AssetFilters`. +pub struct LocationWithAssetFilters( + sp_std::marker::PhantomData<(LocationFilter, AssetFilters)>, ); -impl, AssetFilters: Get>> - Contains<(MultiLocation, Vec)> for LocationWithAssetFilters +impl, AssetFilters: Get>> + Contains<(Location, Vec)> for LocationWithAssetFilters { - fn contains((location, assets): &(MultiLocation, Vec)) -> bool { + fn contains((location, assets): &(Location, Vec)) -> bool { log::trace!(target: "xcm::contains", "LocationWithAssetFilters location: {:?}, assets: {:?}", location, assets); // `location` must match the `Location` filter. - if !Location::contains(location) { + if !LocationFilter::contains(location) { return false } @@ -72,12 +70,12 @@ impl, AssetFilters: Get> } } -/// Implementation of `Get>` which accepts every asset. +/// Implementation of `Get>` which accepts every asset. /// (For example, it can be used with `LocationWithAssetFilters`). pub struct AllAssets; -impl Get> for AllAssets { - fn get() -> Vec { - sp_std::vec![MultiAssetFilter::Wild(WildMultiAsset::All)] +impl Get> for AllAssets { + fn get() -> Vec { + sp_std::vec![AssetFilter::Wild(WildAsset::All)] } } @@ -90,24 +88,24 @@ mod tests { #[test] fn location_with_asset_filters_works() { frame_support::parameter_types! { - pub ParaA: MultiLocation = MultiLocation::new(1, X1(Parachain(1001))); - pub ParaB: MultiLocation = MultiLocation::new(1, X1(Parachain(1002))); - pub ParaC: MultiLocation = MultiLocation::new(1, X1(Parachain(1003))); + pub ParaA: Location = Location::new(1, [Parachain(1001)]); + pub ParaB: Location = Location::new(1, [Parachain(1002)]); + pub ParaC: Location = Location::new(1, [Parachain(1003)]); - pub AssetXLocation: MultiLocation = MultiLocation::new(1, X1(GeneralIndex(1111))); - pub AssetYLocation: MultiLocation = MultiLocation::new(1, X1(GeneralIndex(2222))); - pub AssetZLocation: MultiLocation = MultiLocation::new(1, X1(GeneralIndex(3333))); + pub AssetXLocation: Location = Location::new(1, [GeneralIndex(1111)]); + pub AssetYLocation: Location = Location::new(1, [GeneralIndex(2222)]); + pub AssetZLocation: Location = Location::new(1, [GeneralIndex(3333)]); - pub OnlyAssetXOrAssetY: sp_std::vec::Vec = sp_std::vec![ - Wild(AllOf { fun: WildFungible, id: Concrete(AssetXLocation::get()) }), - Wild(AllOf { fun: WildFungible, id: Concrete(AssetYLocation::get()) }), + pub OnlyAssetXOrAssetY: sp_std::vec::Vec = sp_std::vec![ + Wild(AllOf { fun: WildFungible, id: AssetId(AssetXLocation::get()) }), + Wild(AllOf { fun: WildFungible, id: AssetId(AssetYLocation::get()) }), ]; - pub OnlyAssetZ: sp_std::vec::Vec = sp_std::vec![ - Wild(AllOf { fun: WildFungible, id: Concrete(AssetZLocation::get()) }) + pub OnlyAssetZ: sp_std::vec::Vec = sp_std::vec![ + Wild(AllOf { fun: WildFungible, id: AssetId(AssetZLocation::get()) }) ]; } - let test_data: Vec<(MultiLocation, Vec, bool)> = vec![ + let test_data: Vec<(Location, Vec, bool)> = vec![ (ParaA::get(), vec![(AssetXLocation::get(), 1).into()], true), (ParaA::get(), vec![(AssetYLocation::get(), 1).into()], true), (ParaA::get(), vec![(AssetZLocation::get(), 1).into()], false), @@ -202,7 +200,7 @@ mod tests { for (location, assets, expected_result) in test_data { assert_eq!( - Filter::contains(&(location, assets.clone())), + Filter::contains(&(location.clone(), assets.clone())), expected_result, "expected_result: {expected_result} not matched for (location, assets): ({:?}, {:?})!", location, assets, ) diff --git a/polkadot/xcm/xcm-builder/src/fungible_adapter.rs b/polkadot/xcm/xcm-builder/src/fungible_adapter.rs index 90608faa447..7bea8cdf957 100644 --- a/polkadot/xcm/xcm-builder/src/fungible_adapter.rs +++ b/polkadot/xcm/xcm-builder/src/fungible_adapter.rs @@ -25,7 +25,10 @@ use frame_support::traits::{ }; use sp_std::{marker::PhantomData, prelude::*, result}; use xcm::latest::prelude::*; -use xcm_executor::traits::{ConvertLocation, Error as MatchError, MatchesFungible, TransactAsset}; +use xcm_executor::{ + traits::{ConvertLocation, Error as MatchError, MatchesFungible, TransactAsset}, + AssetsInHolding, +}; /// [`TransactAsset`] implementation that allows the use of a [`fungible`] implementation for /// handling an asset in the XCM executor. @@ -41,11 +44,11 @@ impl< > TransactAsset for FungibleTransferAdapter { fn internal_transfer_asset( - what: &MultiAsset, - from: &MultiLocation, - to: &MultiLocation, + what: &Asset, + from: &Location, + to: &Location, _context: &XcmContext, - ) -> result::Result { + ) -> result::Result { log::trace!( target: "xcm::fungible_adapter", "internal_transfer_asset what: {:?}, from: {:?}, to: {:?}", @@ -111,11 +114,7 @@ impl< > TransactAsset for FungibleMutateAdapter { - fn can_check_in( - _origin: &MultiLocation, - what: &MultiAsset, - _context: &XcmContext, - ) -> XcmResult { + fn can_check_in(_origin: &Location, what: &Asset, _context: &XcmContext) -> XcmResult { log::trace!( target: "xcm::fungible_adapter", "can_check_in origin: {:?}, what: {:?}", @@ -132,7 +131,7 @@ impl< } } - fn check_in(_origin: &MultiLocation, what: &MultiAsset, _context: &XcmContext) { + fn check_in(_origin: &Location, what: &Asset, _context: &XcmContext) { log::trace!( target: "xcm::fungible_adapter", "check_in origin: {:?}, what: {:?}", @@ -149,7 +148,7 @@ impl< } } - fn can_check_out(_dest: &MultiLocation, what: &MultiAsset, _context: &XcmContext) -> XcmResult { + fn can_check_out(_dest: &Location, what: &Asset, _context: &XcmContext) -> XcmResult { log::trace!( target: "xcm::fungible_adapter", "check_out dest: {:?}, what: {:?}", @@ -166,7 +165,7 @@ impl< } } - fn check_out(_dest: &MultiLocation, what: &MultiAsset, _context: &XcmContext) { + fn check_out(_dest: &Location, what: &Asset, _context: &XcmContext) { log::trace!( target: "xcm::fungible_adapter", "check_out dest: {:?}, what: {:?}", @@ -184,11 +183,7 @@ impl< } } - fn deposit_asset( - what: &MultiAsset, - who: &MultiLocation, - _context: Option<&XcmContext>, - ) -> XcmResult { + fn deposit_asset(what: &Asset, who: &Location, _context: Option<&XcmContext>) -> XcmResult { log::trace!( target: "xcm::fungible_adapter", "deposit_asset what: {:?}, who: {:?}", @@ -203,10 +198,10 @@ impl< } fn withdraw_asset( - what: &MultiAsset, - who: &MultiLocation, + what: &Asset, + who: &Location, _context: Option<&XcmContext>, - ) -> result::Result { + ) -> result::Result { log::trace!( target: "xcm::fungible_adapter", "deposit_asset what: {:?}, who: {:?}", @@ -236,7 +231,7 @@ impl< > TransactAsset for FungibleAdapter { - fn can_check_in(origin: &MultiLocation, what: &MultiAsset, context: &XcmContext) -> XcmResult { + fn can_check_in(origin: &Location, what: &Asset, context: &XcmContext) -> XcmResult { FungibleMutateAdapter::< Fungible, Matcher, @@ -246,7 +241,7 @@ impl< >::can_check_in(origin, what, context) } - fn check_in(origin: &MultiLocation, what: &MultiAsset, context: &XcmContext) { + fn check_in(origin: &Location, what: &Asset, context: &XcmContext) { FungibleMutateAdapter::< Fungible, Matcher, @@ -256,7 +251,7 @@ impl< >::check_in(origin, what, context) } - fn can_check_out(dest: &MultiLocation, what: &MultiAsset, context: &XcmContext) -> XcmResult { + fn can_check_out(dest: &Location, what: &Asset, context: &XcmContext) -> XcmResult { FungibleMutateAdapter::< Fungible, Matcher, @@ -266,7 +261,7 @@ impl< >::can_check_out(dest, what, context) } - fn check_out(dest: &MultiLocation, what: &MultiAsset, context: &XcmContext) { + fn check_out(dest: &Location, what: &Asset, context: &XcmContext) { FungibleMutateAdapter::< Fungible, Matcher, @@ -276,11 +271,7 @@ impl< >::check_out(dest, what, context) } - fn deposit_asset( - what: &MultiAsset, - who: &MultiLocation, - context: Option<&XcmContext>, - ) -> XcmResult { + fn deposit_asset(what: &Asset, who: &Location, context: Option<&XcmContext>) -> XcmResult { FungibleMutateAdapter::< Fungible, Matcher, @@ -291,10 +282,10 @@ impl< } fn withdraw_asset( - what: &MultiAsset, - who: &MultiLocation, + what: &Asset, + who: &Location, maybe_context: Option<&XcmContext>, - ) -> result::Result { + ) -> result::Result { FungibleMutateAdapter::< Fungible, Matcher, @@ -305,11 +296,11 @@ impl< } fn internal_transfer_asset( - what: &MultiAsset, - from: &MultiLocation, - to: &MultiLocation, + what: &Asset, + from: &Location, + to: &Location, context: &XcmContext, - ) -> result::Result { + ) -> result::Result { FungibleTransferAdapter::::internal_transfer_asset( what, from, to, context ) diff --git a/polkadot/xcm/xcm-builder/src/fungibles_adapter.rs b/polkadot/xcm/xcm-builder/src/fungibles_adapter.rs index 63ce608824e..4574d5ed4c6 100644 --- a/polkadot/xcm/xcm-builder/src/fungibles_adapter.rs +++ b/polkadot/xcm/xcm-builder/src/fungibles_adapter.rs @@ -38,11 +38,11 @@ impl< > TransactAsset for FungiblesTransferAdapter { fn internal_transfer_asset( - what: &MultiAsset, - from: &MultiLocation, - to: &MultiLocation, + what: &Asset, + from: &Location, + to: &Location, _context: &XcmContext, - ) -> result::Result { + ) -> result::Result { log::trace!( target: "xcm::fungibles_adapter", "internal_transfer_asset what: {:?}, from: {:?}, to: {:?}", @@ -198,11 +198,7 @@ impl< CheckingAccount, > { - fn can_check_in( - _origin: &MultiLocation, - what: &MultiAsset, - _context: &XcmContext, - ) -> XcmResult { + fn can_check_in(_origin: &Location, what: &Asset, _context: &XcmContext) -> XcmResult { log::trace!( target: "xcm::fungibles_adapter", "can_check_in origin: {:?}, what: {:?}", @@ -219,7 +215,7 @@ impl< } } - fn check_in(_origin: &MultiLocation, what: &MultiAsset, _context: &XcmContext) { + fn check_in(_origin: &Location, what: &Asset, _context: &XcmContext) { log::trace!( target: "xcm::fungibles_adapter", "check_in origin: {:?}, what: {:?}", @@ -236,11 +232,7 @@ impl< } } - fn can_check_out( - _origin: &MultiLocation, - what: &MultiAsset, - _context: &XcmContext, - ) -> XcmResult { + fn can_check_out(_origin: &Location, what: &Asset, _context: &XcmContext) -> XcmResult { log::trace!( target: "xcm::fungibles_adapter", "can_check_in origin: {:?}, what: {:?}", @@ -257,7 +249,7 @@ impl< } } - fn check_out(_dest: &MultiLocation, what: &MultiAsset, _context: &XcmContext) { + fn check_out(_dest: &Location, what: &Asset, _context: &XcmContext) { log::trace!( target: "xcm::fungibles_adapter", "check_out dest: {:?}, what: {:?}", @@ -274,11 +266,7 @@ impl< } } - fn deposit_asset( - what: &MultiAsset, - who: &MultiLocation, - _context: Option<&XcmContext>, - ) -> XcmResult { + fn deposit_asset(what: &Asset, who: &Location, _context: Option<&XcmContext>) -> XcmResult { log::trace!( target: "xcm::fungibles_adapter", "deposit_asset what: {:?}, who: {:?}", @@ -294,10 +282,10 @@ impl< } fn withdraw_asset( - what: &MultiAsset, - who: &MultiLocation, + what: &Asset, + who: &Location, _maybe_context: Option<&XcmContext>, - ) -> result::Result { + ) -> result::Result { log::trace!( target: "xcm::fungibles_adapter", "withdraw_asset what: {:?}, who: {:?}", @@ -331,7 +319,7 @@ impl< > TransactAsset for FungiblesAdapter { - fn can_check_in(origin: &MultiLocation, what: &MultiAsset, context: &XcmContext) -> XcmResult { + fn can_check_in(origin: &Location, what: &Asset, context: &XcmContext) -> XcmResult { FungiblesMutateAdapter::< Assets, Matcher, @@ -342,7 +330,7 @@ impl< >::can_check_in(origin, what, context) } - fn check_in(origin: &MultiLocation, what: &MultiAsset, context: &XcmContext) { + fn check_in(origin: &Location, what: &Asset, context: &XcmContext) { FungiblesMutateAdapter::< Assets, Matcher, @@ -353,7 +341,7 @@ impl< >::check_in(origin, what, context) } - fn can_check_out(dest: &MultiLocation, what: &MultiAsset, context: &XcmContext) -> XcmResult { + fn can_check_out(dest: &Location, what: &Asset, context: &XcmContext) -> XcmResult { FungiblesMutateAdapter::< Assets, Matcher, @@ -364,7 +352,7 @@ impl< >::can_check_out(dest, what, context) } - fn check_out(dest: &MultiLocation, what: &MultiAsset, context: &XcmContext) { + fn check_out(dest: &Location, what: &Asset, context: &XcmContext) { FungiblesMutateAdapter::< Assets, Matcher, @@ -375,11 +363,7 @@ impl< >::check_out(dest, what, context) } - fn deposit_asset( - what: &MultiAsset, - who: &MultiLocation, - context: Option<&XcmContext>, - ) -> XcmResult { + fn deposit_asset(what: &Asset, who: &Location, context: Option<&XcmContext>) -> XcmResult { FungiblesMutateAdapter::< Assets, Matcher, @@ -391,10 +375,10 @@ impl< } fn withdraw_asset( - what: &MultiAsset, - who: &MultiLocation, + what: &Asset, + who: &Location, maybe_context: Option<&XcmContext>, - ) -> result::Result { + ) -> result::Result { FungiblesMutateAdapter::< Assets, Matcher, @@ -406,11 +390,11 @@ impl< } fn internal_transfer_asset( - what: &MultiAsset, - from: &MultiLocation, - to: &MultiLocation, + what: &Asset, + from: &Location, + to: &Location, context: &XcmContext, - ) -> result::Result { + ) -> result::Result { FungiblesTransferAdapter::::internal_transfer_asset( what, from, to, context ) diff --git a/polkadot/xcm/xcm-builder/src/lib.rs b/polkadot/xcm/xcm-builder/src/lib.rs index e7431ae0254..c00cd62e872 100644 --- a/polkadot/xcm/xcm-builder/src/lib.rs +++ b/polkadot/xcm/xcm-builder/src/lib.rs @@ -47,11 +47,11 @@ pub use origin_conversion::{ }; mod asset_conversion; +#[allow(deprecated)] +pub use asset_conversion::ConvertedConcreteAssetId; pub use asset_conversion::{ - AsPrefixedGeneralIndex, ConvertedAbstractId, ConvertedConcreteId, MatchedConvertedConcreteId, + AsPrefixedGeneralIndex, ConvertedConcreteId, MatchedConvertedConcreteId, V4V3LocationConverter, }; -#[allow(deprecated)] -pub use asset_conversion::{ConvertedAbstractAssetId, ConvertedConcreteAssetId}; mod barriers; pub use barriers::{ @@ -96,7 +96,7 @@ mod matches_location; pub use matches_location::{StartsWith, StartsWithExplicitGlobalConsensus}; mod matches_token; -pub use matches_token::{IsAbstract, IsConcrete}; +pub use matches_token::IsConcrete; mod matcher; pub use matcher::{CreateMatcher, MatchXcm, Matcher}; diff --git a/polkadot/xcm/xcm-builder/src/location_conversion.rs b/polkadot/xcm/xcm-builder/src/location_conversion.rs index 25d16f7eb8c..c9553030817 100644 --- a/polkadot/xcm/xcm-builder/src/location_conversion.rs +++ b/polkadot/xcm/xcm-builder/src/location_conversion.rs @@ -27,12 +27,12 @@ use xcm_executor::traits::ConvertLocation; pub trait DescribeLocation { /// Create a description of the given `location` if possible. No two locations should have the /// same descriptor. - fn describe_location(location: &MultiLocation) -> Option>; + fn describe_location(location: &Location) -> Option>; } #[impl_trait_for_tuples::impl_for_tuples(30)] impl DescribeLocation for Tuple { - fn describe_location(l: &MultiLocation) -> Option> { + fn describe_location(l: &Location) -> Option> { for_tuples!( #( match Tuple::describe_location(l) { Some(result) => return Some(result), @@ -45,9 +45,9 @@ impl DescribeLocation for Tuple { pub struct DescribeTerminus; impl DescribeLocation for DescribeTerminus { - fn describe_location(l: &MultiLocation) -> Option> { - match (l.parents, &l.interior) { - (0, Here) => Some(Vec::new()), + fn describe_location(l: &Location) -> Option> { + match l.unpack() { + (0, []) => Some(Vec::new()), _ => return None, } } @@ -55,10 +55,9 @@ impl DescribeLocation for DescribeTerminus { pub struct DescribePalletTerminal; impl DescribeLocation for DescribePalletTerminal { - fn describe_location(l: &MultiLocation) -> Option> { - match (l.parents, &l.interior) { - (0, X1(PalletInstance(i))) => - Some((b"Pallet", Compact::::from(*i as u32)).encode()), + fn describe_location(l: &Location) -> Option> { + match l.unpack() { + (0, [PalletInstance(i)]) => Some((b"Pallet", Compact::::from(*i as u32)).encode()), _ => return None, } } @@ -66,9 +65,9 @@ impl DescribeLocation for DescribePalletTerminal { pub struct DescribeAccountId32Terminal; impl DescribeLocation for DescribeAccountId32Terminal { - fn describe_location(l: &MultiLocation) -> Option> { - match (l.parents, &l.interior) { - (0, X1(AccountId32 { id, .. })) => Some((b"AccountId32", id).encode()), + fn describe_location(l: &Location) -> Option> { + match l.unpack() { + (0, [AccountId32 { id, .. }]) => Some((b"AccountId32", id).encode()), _ => return None, } } @@ -76,9 +75,9 @@ impl DescribeLocation for DescribeAccountId32Terminal { pub struct DescribeAccountKey20Terminal; impl DescribeLocation for DescribeAccountKey20Terminal { - fn describe_location(l: &MultiLocation) -> Option> { - match (l.parents, &l.interior) { - (0, X1(AccountKey20 { key, .. })) => Some((b"AccountKey20", key).encode()), + fn describe_location(l: &Location) -> Option> { + match l.unpack() { + (0, [AccountKey20 { key, .. }]) => Some((b"AccountKey20", key).encode()), _ => return None, } } @@ -89,9 +88,9 @@ impl DescribeLocation for DescribeAccountKey20Terminal { pub struct DescribeTreasuryVoiceTerminal; impl DescribeLocation for DescribeTreasuryVoiceTerminal { - fn describe_location(l: &MultiLocation) -> Option> { - match (l.parents, &l.interior) { - (0, X1(Plurality { id: BodyId::Treasury, part: BodyPart::Voice })) => + fn describe_location(location: &Location) -> Option> { + match location.unpack() { + (0, [Plurality { id: BodyId::Treasury, part: BodyPart::Voice }]) => Some((b"Treasury", b"Voice").encode()), _ => None, } @@ -102,9 +101,9 @@ pub type DescribeAccountIdTerminal = (DescribeAccountId32Terminal, DescribeAccou pub struct DescribeBodyTerminal; impl DescribeLocation for DescribeBodyTerminal { - fn describe_location(l: &MultiLocation) -> Option> { - match (l.parents, &l.interior) { - (0, X1(Plurality { id, part })) => Some((b"Body", id, part).encode()), + fn describe_location(l: &Location) -> Option> { + match l.unpack() { + (0, [Plurality { id, part }]) => Some((b"Body", id, part).encode()), _ => return None, } } @@ -121,20 +120,21 @@ pub type DescribeAllTerminal = ( pub struct DescribeFamily(PhantomData); impl DescribeLocation for DescribeFamily { - fn describe_location(l: &MultiLocation) -> Option> { - match (l.parents, l.interior.first()) { + fn describe_location(l: &Location) -> Option> { + match (l.parent_count(), l.first_interior()) { (0, Some(Parachain(index))) => { - let tail = l.interior.split_first().0; + let tail = l.clone().split_first_interior().0; let interior = Suffix::describe_location(&tail.into())?; Some((b"ChildChain", Compact::::from(*index), interior).encode()) }, (1, Some(Parachain(index))) => { - let tail = l.interior.split_first().0; - let interior = Suffix::describe_location(&tail.into())?; + let tail_junctions = l.interior().clone().split_first().0; + let tail = Location::new(0, tail_junctions); + let interior = Suffix::describe_location(&tail)?; Some((b"SiblingChain", Compact::::from(*index), interior).encode()) }, (1, _) => { - let tail = l.interior.into(); + let tail = l.interior().clone().into(); let interior = Suffix::describe_location(&tail)?; Some((b"ParentChain", interior).encode()) }, @@ -147,7 +147,7 @@ pub struct HashedDescription(PhantomData<(AccountId, Descri impl + Clone, Describe: DescribeLocation> ConvertLocation for HashedDescription { - fn convert_location(value: &MultiLocation) -> Option { + fn convert_location(value: &Location) -> Option { Some(blake2_256(&Describe::describe_location(value)?).into()) } } @@ -156,34 +156,26 @@ impl + Clone, Describe: DescribeLocation> ConvertLocat /// are recommended to use the more extensible `HashedDescription` type. pub struct LegacyDescribeForeignChainAccount; impl DescribeLocation for LegacyDescribeForeignChainAccount { - fn describe_location(location: &MultiLocation) -> Option> { - Some(match location { + fn describe_location(location: &Location) -> Option> { + Some(match location.unpack() { // Used on the relay chain for sending paras that use 32 byte accounts - MultiLocation { - parents: 0, - interior: X2(Parachain(para_id), AccountId32 { id, .. }), - } => LegacyDescribeForeignChainAccount::from_para_32(para_id, id, 0), + (0, [Parachain(para_id), AccountId32 { id, .. }]) => + LegacyDescribeForeignChainAccount::from_para_32(para_id, id, 0), // Used on the relay chain for sending paras that use 20 byte accounts - MultiLocation { - parents: 0, - interior: X2(Parachain(para_id), AccountKey20 { key, .. }), - } => LegacyDescribeForeignChainAccount::from_para_20(para_id, key, 0), + (0, [Parachain(para_id), AccountKey20 { key, .. }]) => + LegacyDescribeForeignChainAccount::from_para_20(para_id, key, 0), // Used on para-chain for sending paras that use 32 byte accounts - MultiLocation { - parents: 1, - interior: X2(Parachain(para_id), AccountId32 { id, .. }), - } => LegacyDescribeForeignChainAccount::from_para_32(para_id, id, 1), + (1, [Parachain(para_id), AccountId32 { id, .. }]) => + LegacyDescribeForeignChainAccount::from_para_32(para_id, id, 1), // Used on para-chain for sending paras that use 20 byte accounts - MultiLocation { - parents: 1, - interior: X2(Parachain(para_id), AccountKey20 { key, .. }), - } => LegacyDescribeForeignChainAccount::from_para_20(para_id, key, 1), + (1, [Parachain(para_id), AccountKey20 { key, .. }]) => + LegacyDescribeForeignChainAccount::from_para_20(para_id, key, 1), // Used on para-chain for sending from the relay chain - MultiLocation { parents: 1, interior: X1(AccountId32 { id, .. }) } => + (1, [AccountId32 { id, .. }]) => LegacyDescribeForeignChainAccount::from_relay_32(id, 1), // No other conversions provided @@ -278,16 +270,16 @@ pub struct Account32Hash(PhantomData<(Network, AccountId)>); impl>, AccountId: From<[u8; 32]> + Into<[u8; 32]> + Clone> ConvertLocation for Account32Hash { - fn convert_location(location: &MultiLocation) -> Option { + fn convert_location(location: &Location) -> Option { Some(("multiloc", location).using_encoded(blake2_256).into()) } } -/// A [`MultiLocation`] consisting of a single `Parent` [`Junction`] will be converted to the +/// A [`Location`] consisting of a single `Parent` [`Junction`] will be converted to the /// parent `AccountId`. pub struct ParentIsPreset(PhantomData); impl ConvertLocation for ParentIsPreset { - fn convert_location(location: &MultiLocation) -> Option { + fn convert_location(location: &Location) -> Option { if location.contains_parents_only(1) { Some( b"Parent" @@ -304,10 +296,9 @@ pub struct ChildParachainConvertsVia(PhantomData<(ParaId, Acc impl + Into + AccountIdConversion, AccountId: Clone> ConvertLocation for ChildParachainConvertsVia { - fn convert_location(location: &MultiLocation) -> Option { - match location { - MultiLocation { parents: 0, interior: X1(Parachain(id)) } => - Some(ParaId::from(*id).into_account_truncating()), + fn convert_location(location: &Location) -> Option { + match location.unpack() { + (0, [Parachain(id)]) => Some(ParaId::from(*id).into_account_truncating()), _ => None, } } @@ -317,10 +308,9 @@ pub struct SiblingParachainConvertsVia(PhantomData<(ParaId, A impl + Into + AccountIdConversion, AccountId: Clone> ConvertLocation for SiblingParachainConvertsVia { - fn convert_location(location: &MultiLocation) -> Option { - match location { - MultiLocation { parents: 1, interior: X1(Parachain(id)) } => - Some(ParaId::from(*id).into_account_truncating()), + fn convert_location(location: &Location) -> Option { + match location.unpack() { + (1, [Parachain(id)]) => Some(ParaId::from(*id).into_account_truncating()), _ => None, } } @@ -331,15 +321,13 @@ pub struct AccountId32Aliases(PhantomData<(Network, AccountI impl>, AccountId: From<[u8; 32]> + Into<[u8; 32]> + Clone> ConvertLocation for AccountId32Aliases { - fn convert_location(location: &MultiLocation) -> Option { - let id = match *location { - MultiLocation { parents: 0, interior: X1(AccountId32 { id, network: None }) } => id, - MultiLocation { parents: 0, interior: X1(AccountId32 { id, network }) } - if network == Network::get() => - id, + fn convert_location(location: &Location) -> Option { + let id = match location.unpack() { + (0, [AccountId32 { id, network: None }]) => id, + (0, [AccountId32 { id, network }]) if *network == Network::get() => id, _ => return None, }; - Some(id.into()) + Some((*id).into()) } } @@ -351,25 +339,23 @@ pub struct LocalTreasuryVoiceConvertsVia( impl, AccountId: From<[u8; 32]> + Into<[u8; 32]> + Clone> ConvertLocation for LocalTreasuryVoiceConvertsVia { - fn convert_location(location: &MultiLocation) -> Option { - match *location { - MultiLocation { - parents: 0, - interior: X1(Plurality { id: BodyId::Treasury, part: BodyPart::Voice }), - } => Some((TreasuryAccount::get().into() as [u8; 32]).into()), + fn convert_location(location: &Location) -> Option { + match location.unpack() { + (0, [Plurality { id: BodyId::Treasury, part: BodyPart::Voice }]) => + Some((TreasuryAccount::get().into() as [u8; 32]).into()), _ => None, } } } /// Conversion implementation which converts from a `[u8; 32]`-based `AccountId` into a -/// `MultiLocation` consisting solely of a `AccountId32` junction with a fixed value for its +/// `Location` consisting solely of a `AccountId32` junction with a fixed value for its /// network (provided by `Network`) and the `AccountId`'s `[u8; 32]` datum for the `id`. pub struct AliasesIntoAccountId32(PhantomData<(Network, AccountId)>); impl<'a, Network: Get>, AccountId: Clone + Into<[u8; 32]> + Clone> - TryConvert<&'a AccountId, MultiLocation> for AliasesIntoAccountId32 + TryConvert<&'a AccountId, Location> for AliasesIntoAccountId32 { - fn try_convert(who: &AccountId) -> Result { + fn try_convert(who: &AccountId) -> Result { Ok(AccountId32 { network: Network::get(), id: who.clone().into() }.into()) } } @@ -378,15 +364,13 @@ pub struct AccountKey20Aliases(PhantomData<(Network, Account impl>, AccountId: From<[u8; 20]> + Into<[u8; 20]> + Clone> ConvertLocation for AccountKey20Aliases { - fn convert_location(location: &MultiLocation) -> Option { - let key = match *location { - MultiLocation { parents: 0, interior: X1(AccountKey20 { key, network: None }) } => key, - MultiLocation { parents: 0, interior: X1(AccountKey20 { key, network }) } - if network == Network::get() => - key, + fn convert_location(location: &Location) -> Option { + let key = match location.unpack() { + (0, [AccountKey20 { key, network: None }]) => key, + (0, [AccountKey20 { key, network }]) if *network == Network::get() => key, _ => return None, }; - Some(key.into()) + Some((*key).into()) } } @@ -402,10 +386,10 @@ impl>, AccountId: From<[u8; 20]> + Into<[u8; 20]> pub struct GlobalConsensusConvertsFor( PhantomData<(UniversalLocation, AccountId)>, ); -impl, AccountId: From<[u8; 32]> + Clone> +impl, AccountId: From<[u8; 32]> + Clone> ConvertLocation for GlobalConsensusConvertsFor { - fn convert_location(location: &MultiLocation) -> Option { + fn convert_location(location: &Location) -> Option { let universal_source = UniversalLocation::get(); log::trace!( target: "xcm::location_conversion", @@ -413,7 +397,7 @@ impl, AccountId: From<[u8; 32]> + universal_source, location, ); let (remote_network, remote_location) = - ensure_is_remote(universal_source, *location).ok()?; + ensure_is_remote(universal_source, location.clone()).ok()?; match remote_location { Here => Some(AccountId::from(Self::from_params(&remote_network))), @@ -445,21 +429,21 @@ impl GlobalConsensusConvertsFor( PhantomData<(UniversalLocation, AccountId)>, ); -impl, AccountId: From<[u8; 32]> + Clone> +impl, AccountId: From<[u8; 32]> + Clone> ConvertLocation for GlobalConsensusParachainConvertsFor { - fn convert_location(location: &MultiLocation) -> Option { + fn convert_location(location: &Location) -> Option { let universal_source = UniversalLocation::get(); log::trace!( target: "xcm::location_conversion", "GlobalConsensusParachainConvertsFor universal_source: {:?}, location: {:?}", universal_source, location, ); - let devolved = ensure_is_remote(universal_source, *location).ok()?; + let devolved = ensure_is_remote(universal_source, location.clone()).ok()?; let (remote_network, remote_location) = devolved; - match remote_location { - X1(Parachain(remote_network_para_id)) => + match remote_location.as_slice() { + [Parachain(remote_network_para_id)] => Some(AccountId::from(Self::from_params(&remote_network, &remote_network_para_id))), _ => None, } @@ -509,12 +493,12 @@ mod tests { #[test] fn inverter_works_in_tree() { parameter_types! { - pub UniversalLocation: InteriorMultiLocation = X3(Parachain(1), account20(), account20()); + pub UniversalLocation: InteriorLocation = [Parachain(1), account20(), account20()].into(); } - let input = MultiLocation::new(3, X2(Parachain(2), account32())); + let input = Location::new(3, [Parachain(2), account32()]); let inverted = UniversalLocation::get().invert_target(&input).unwrap(); - assert_eq!(inverted, MultiLocation::new(2, X3(Parachain(1), account20(), account20()))); + assert_eq!(inverted, Location::new(2, [Parachain(1), account20(), account20()])); } // Network Topology @@ -524,12 +508,12 @@ mod tests { #[test] fn inverter_uses_context_as_inverted_location() { parameter_types! { - pub UniversalLocation: InteriorMultiLocation = X2(account20(), account20()); + pub UniversalLocation: InteriorLocation = [account20(), account20()].into(); } - let input = MultiLocation::grandparent(); + let input = Location::new(2, Here); let inverted = UniversalLocation::get().invert_target(&input).unwrap(); - assert_eq!(inverted, X2(account20(), account20()).into()); + assert_eq!(inverted, [account20(), account20()].into()); } // Network Topology @@ -539,10 +523,10 @@ mod tests { #[test] fn inverter_uses_only_child_on_missing_context() { parameter_types! { - pub UniversalLocation: InteriorMultiLocation = PalletInstance(5).into(); + pub UniversalLocation: InteriorLocation = PalletInstance(5).into(); } - let input = MultiLocation::grandparent(); + let input = Location::new(2, Here); let inverted = UniversalLocation::get().invert_target(&input).unwrap(); assert_eq!(inverted, (OnlyChild, PalletInstance(5)).into()); } @@ -550,10 +534,10 @@ mod tests { #[test] fn inverter_errors_when_location_is_too_large() { parameter_types! { - pub UniversalLocation: InteriorMultiLocation = Here; + pub UniversalLocation: InteriorLocation = Here; } - let input = MultiLocation { parents: 99, interior: X1(Parachain(88)) }; + let input = Location { parents: 99, interior: [Parachain(88)].into() }; let inverted = UniversalLocation::get().invert_target(&input); assert_eq!(inverted, Err(())); } @@ -561,8 +545,8 @@ mod tests { #[test] fn global_consensus_converts_for_works() { parameter_types! { - pub UniversalLocationInNetwork1: InteriorMultiLocation = X2(GlobalConsensus(ByGenesis([1; 32])), Parachain(1234)); - pub UniversalLocationInNetwork2: InteriorMultiLocation = X2(GlobalConsensus(ByGenesis([2; 32])), Parachain(1234)); + pub UniversalLocationInNetwork1: InteriorLocation = [GlobalConsensus(ByGenesis([1; 32])), Parachain(1234)].into(); + pub UniversalLocationInNetwork2: InteriorLocation = [GlobalConsensus(ByGenesis([2; 32])), Parachain(1234)].into(); } let network_1 = UniversalLocationInNetwork1::get().global_consensus().expect("NetworkId"); let network_2 = UniversalLocationInNetwork2::get().global_consensus().expect("NetworkId"); @@ -571,17 +555,17 @@ mod tests { let network_5 = ByGenesis([5; 32]); let test_data = vec![ - (MultiLocation::parent(), false), - (MultiLocation::new(0, Here), false), - (MultiLocation::new(0, X1(GlobalConsensus(network_1))), false), - (MultiLocation::new(1, X1(GlobalConsensus(network_1))), false), - (MultiLocation::new(2, X1(GlobalConsensus(network_1))), false), - (MultiLocation::new(0, X1(GlobalConsensus(network_2))), false), - (MultiLocation::new(1, X1(GlobalConsensus(network_2))), false), - (MultiLocation::new(2, X1(GlobalConsensus(network_2))), true), - (MultiLocation::new(0, X2(GlobalConsensus(network_2), Parachain(1000))), false), - (MultiLocation::new(1, X2(GlobalConsensus(network_2), Parachain(1000))), false), - (MultiLocation::new(2, X2(GlobalConsensus(network_2), Parachain(1000))), false), + (Location::parent(), false), + (Location::new(0, Here), false), + (Location::new(0, [GlobalConsensus(network_1)]), false), + (Location::new(1, [GlobalConsensus(network_1)]), false), + (Location::new(2, [GlobalConsensus(network_1)]), false), + (Location::new(0, [GlobalConsensus(network_2)]), false), + (Location::new(1, [GlobalConsensus(network_2)]), false), + (Location::new(2, [GlobalConsensus(network_2)]), true), + (Location::new(0, [GlobalConsensus(network_2), Parachain(1000)]), false), + (Location::new(1, [GlobalConsensus(network_2), Parachain(1000)]), false), + (Location::new(2, [GlobalConsensus(network_2), Parachain(1000)]), false), ]; for (location, expected_result) in test_data { @@ -596,14 +580,14 @@ mod tests { "expected_result: {}, but conversion passed: {:?}, location: {:?}", expected_result, account, location ); - match &location { - MultiLocation { interior: X1(GlobalConsensus(network)), .. } => + match location.unpack() { + (_, [GlobalConsensus(network)]) => assert_eq!( account, GlobalConsensusConvertsFor::::from_params(network), "expected_result: {}, but conversion passed: {:?}, location: {:?}", expected_result, account, location ), - _ => panic!("expected_result: {}, conversion passed: {:?}, but MultiLocation does not match expected pattern, location: {:?}", expected_result, account, location) + _ => panic!("expected_result: {}, conversion passed: {:?}, but Location does not match expected pattern, location: {:?}", expected_result, account, location) } }, None => { @@ -619,32 +603,32 @@ mod tests { // all success let res_1_gc_network_3 = GlobalConsensusConvertsFor::::convert_location( - &MultiLocation::new(2, X1(GlobalConsensus(network_3))), + &Location::new(2, [GlobalConsensus(network_3)]), ) .expect("conversion is ok"); let res_2_gc_network_3 = GlobalConsensusConvertsFor::::convert_location( - &MultiLocation::new(2, X1(GlobalConsensus(network_3))), + &Location::new(2, [GlobalConsensus(network_3)]), ) .expect("conversion is ok"); let res_1_gc_network_4 = GlobalConsensusConvertsFor::::convert_location( - &MultiLocation::new(2, X1(GlobalConsensus(network_4))), + &Location::new(2, [GlobalConsensus(network_4)]), ) .expect("conversion is ok"); let res_2_gc_network_4 = GlobalConsensusConvertsFor::::convert_location( - &MultiLocation::new(2, X1(GlobalConsensus(network_4))), + &Location::new(2, [GlobalConsensus(network_4)]), ) .expect("conversion is ok"); let res_1_gc_network_5 = GlobalConsensusConvertsFor::::convert_location( - &MultiLocation::new(2, X1(GlobalConsensus(network_5))), + &Location::new(2, [GlobalConsensus(network_5)]), ) .expect("conversion is ok"); let res_2_gc_network_5 = GlobalConsensusConvertsFor::::convert_location( - &MultiLocation::new(2, X1(GlobalConsensus(network_5))), + &Location::new(2, [GlobalConsensus(network_5)]), ) .expect("conversion is ok"); @@ -660,42 +644,30 @@ mod tests { #[test] fn global_consensus_parachain_converts_for_works() { parameter_types! { - pub UniversalLocation: InteriorMultiLocation = X2(GlobalConsensus(ByGenesis([9; 32])), Parachain(1234)); + pub UniversalLocation: InteriorLocation = [GlobalConsensus(ByGenesis([9; 32])), Parachain(1234)].into(); } let test_data = vec![ - (MultiLocation::parent(), false), - (MultiLocation::new(0, X1(Parachain(1000))), false), - (MultiLocation::new(1, X1(Parachain(1000))), false), + (Location::parent(), false), + (Location::new(0, [Parachain(1000)]), false), + (Location::new(1, [Parachain(1000)]), false), ( - MultiLocation::new( + Location::new( 2, - X3( + [ GlobalConsensus(ByGenesis([0; 32])), Parachain(1000), AccountId32 { network: None, id: [1; 32].into() }, - ), + ], ), false, ), - (MultiLocation::new(2, X1(GlobalConsensus(ByGenesis([0; 32])))), false), - ( - MultiLocation::new(0, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), - false, - ), - ( - MultiLocation::new(1, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), - false, - ), - (MultiLocation::new(2, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), true), - ( - MultiLocation::new(3, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), - false, - ), - ( - MultiLocation::new(9, X2(GlobalConsensus(ByGenesis([0; 32])), Parachain(1000))), - false, - ), + (Location::new(2, [GlobalConsensus(ByGenesis([0; 32]))]), false), + (Location::new(0, [GlobalConsensus(ByGenesis([0; 32])), Parachain(1000)]), false), + (Location::new(1, [GlobalConsensus(ByGenesis([0; 32])), Parachain(1000)]), false), + (Location::new(2, [GlobalConsensus(ByGenesis([0; 32])), Parachain(1000)]), true), + (Location::new(3, [GlobalConsensus(ByGenesis([0; 32])), Parachain(1000)]), false), + (Location::new(9, [GlobalConsensus(ByGenesis([0; 32])), Parachain(1000)]), false), ]; for (location, expected_result) in test_data { @@ -710,8 +682,8 @@ mod tests { "expected_result: {}, but conversion passed: {:?}, location: {:?}", expected_result, account, location ); - match &location { - MultiLocation { interior: X2(GlobalConsensus(network), Parachain(para_id)), .. } => + match location.unpack() { + (_, [GlobalConsensus(network), Parachain(para_id)]) => assert_eq!( account, GlobalConsensusParachainConvertsFor::::from_params(network, para_id), @@ -720,7 +692,7 @@ mod tests { _ => assert_eq!( true, expected_result, - "expected_result: {}, conversion passed: {:?}, but MultiLocation does not match expected pattern, location: {:?}", expected_result, account, location + "expected_result: {}, conversion passed: {:?}, but Location does not match expected pattern, location: {:?}", expected_result, account, location ) } }, @@ -737,22 +709,22 @@ mod tests { // all success let res_gc_a_p1000 = GlobalConsensusParachainConvertsFor::::convert_location( - &MultiLocation::new(2, X2(GlobalConsensus(ByGenesis([3; 32])), Parachain(1000))), + &Location::new(2, [GlobalConsensus(ByGenesis([3; 32])), Parachain(1000)]), ) .expect("conversion is ok"); let res_gc_a_p1001 = GlobalConsensusParachainConvertsFor::::convert_location( - &MultiLocation::new(2, X2(GlobalConsensus(ByGenesis([3; 32])), Parachain(1001))), + &Location::new(2, [GlobalConsensus(ByGenesis([3; 32])), Parachain(1001)]), ) .expect("conversion is ok"); let res_gc_b_p1000 = GlobalConsensusParachainConvertsFor::::convert_location( - &MultiLocation::new(2, X2(GlobalConsensus(ByGenesis([4; 32])), Parachain(1000))), + &Location::new(2, [GlobalConsensus(ByGenesis([4; 32])), Parachain(1000)]), ) .expect("conversion is ok"); let res_gc_b_p1001 = GlobalConsensusParachainConvertsFor::::convert_location( - &MultiLocation::new(2, X2(GlobalConsensus(ByGenesis([4; 32])), Parachain(1001))), + &Location::new(2, [GlobalConsensus(ByGenesis([4; 32])), Parachain(1001)]), ) .expect("conversion is ok"); assert_ne!(res_gc_a_p1000, res_gc_a_p1001); @@ -765,9 +737,9 @@ mod tests { #[test] fn remote_account_convert_on_para_sending_para_32() { - let mul = MultiLocation { + let mul = Location { parents: 1, - interior: X2(Parachain(1), AccountId32 { network: None, id: [0u8; 32] }), + interior: [Parachain(1), AccountId32 { network: None, id: [0u8; 32] }].into(), }; let rem_1 = ForeignChainAliasAccount::<[u8; 32]>::convert_location(&mul).unwrap(); @@ -779,19 +751,20 @@ mod tests { rem_1 ); - let mul = MultiLocation { + let mul = Location { parents: 1, - interior: X2( + interior: [ Parachain(1), AccountId32 { network: Some(NetworkId::Polkadot), id: [0u8; 32] }, - ), + ] + .into(), }; assert_eq!(ForeignChainAliasAccount::<[u8; 32]>::convert_location(&mul).unwrap(), rem_1); - let mul = MultiLocation { + let mul = Location { parents: 1, - interior: X2(Parachain(2), AccountId32 { network: None, id: [0u8; 32] }), + interior: [Parachain(2), AccountId32 { network: None, id: [0u8; 32] }].into(), }; let rem_2 = ForeignChainAliasAccount::<[u8; 32]>::convert_location(&mul).unwrap(); @@ -808,9 +781,9 @@ mod tests { #[test] fn remote_account_convert_on_para_sending_para_20() { - let mul = MultiLocation { + let mul = Location { parents: 1, - interior: X2(Parachain(1), AccountKey20 { network: None, key: [0u8; 20] }), + interior: [Parachain(1), AccountKey20 { network: None, key: [0u8; 20] }].into(), }; let rem_1 = ForeignChainAliasAccount::<[u8; 32]>::convert_location(&mul).unwrap(); @@ -822,19 +795,20 @@ mod tests { rem_1 ); - let mul = MultiLocation { + let mul = Location { parents: 1, - interior: X2( + interior: [ Parachain(1), AccountKey20 { network: Some(NetworkId::Polkadot), key: [0u8; 20] }, - ), + ] + .into(), }; assert_eq!(ForeignChainAliasAccount::<[u8; 32]>::convert_location(&mul).unwrap(), rem_1); - let mul = MultiLocation { + let mul = Location { parents: 1, - interior: X2(Parachain(2), AccountKey20 { network: None, key: [0u8; 20] }), + interior: [Parachain(2), AccountKey20 { network: None, key: [0u8; 20] }].into(), }; let rem_2 = ForeignChainAliasAccount::<[u8; 32]>::convert_location(&mul).unwrap(); @@ -851,9 +825,9 @@ mod tests { #[test] fn remote_account_convert_on_para_sending_relay() { - let mul = MultiLocation { + let mul = Location { parents: 1, - interior: X1(AccountId32 { network: None, id: [0u8; 32] }), + interior: [AccountId32 { network: None, id: [0u8; 32] }].into(), }; let rem_1 = ForeignChainAliasAccount::<[u8; 32]>::convert_location(&mul).unwrap(); @@ -865,16 +839,16 @@ mod tests { rem_1 ); - let mul = MultiLocation { + let mul = Location { parents: 1, - interior: X1(AccountId32 { network: Some(NetworkId::Polkadot), id: [0u8; 32] }), + interior: [AccountId32 { network: Some(NetworkId::Polkadot), id: [0u8; 32] }].into(), }; assert_eq!(ForeignChainAliasAccount::<[u8; 32]>::convert_location(&mul).unwrap(), rem_1); - let mul = MultiLocation { + let mul = Location { parents: 1, - interior: X1(AccountId32 { network: None, id: [1u8; 32] }), + interior: [AccountId32 { network: None, id: [1u8; 32] }].into(), }; let rem_2 = ForeignChainAliasAccount::<[u8; 32]>::convert_location(&mul).unwrap(); @@ -891,9 +865,9 @@ mod tests { #[test] fn remote_account_convert_on_relay_sending_para_20() { - let mul = MultiLocation { + let mul = Location { parents: 0, - interior: X2(Parachain(1), AccountKey20 { network: None, key: [0u8; 20] }), + interior: [Parachain(1), AccountKey20 { network: None, key: [0u8; 20] }].into(), }; let rem_1 = ForeignChainAliasAccount::<[u8; 32]>::convert_location(&mul).unwrap(); @@ -905,9 +879,9 @@ mod tests { rem_1 ); - let mul = MultiLocation { + let mul = Location { parents: 0, - interior: X2(Parachain(2), AccountKey20 { network: None, key: [0u8; 20] }), + interior: [Parachain(2), AccountKey20 { network: None, key: [0u8; 20] }].into(), }; let rem_2 = ForeignChainAliasAccount::<[u8; 32]>::convert_location(&mul).unwrap(); @@ -924,9 +898,9 @@ mod tests { #[test] fn remote_account_convert_on_relay_sending_para_32() { - let mul = MultiLocation { + let mul = Location { parents: 0, - interior: X2(Parachain(1), AccountId32 { network: None, id: [0u8; 32] }), + interior: [Parachain(1), AccountId32 { network: None, id: [0u8; 32] }].into(), }; let rem_1 = ForeignChainAliasAccount::<[u8; 32]>::convert_location(&mul).unwrap(); @@ -938,19 +912,20 @@ mod tests { rem_1 ); - let mul = MultiLocation { + let mul = Location { parents: 0, - interior: X2( + interior: [ Parachain(1), AccountId32 { network: Some(NetworkId::Polkadot), id: [0u8; 32] }, - ), + ] + .into(), }; assert_eq!(ForeignChainAliasAccount::<[u8; 32]>::convert_location(&mul).unwrap(), rem_1); - let mul = MultiLocation { + let mul = Location { parents: 0, - interior: X2(Parachain(2), AccountId32 { network: None, id: [0u8; 32] }), + interior: [Parachain(2), AccountId32 { network: None, id: [0u8; 32] }].into(), }; let rem_2 = ForeignChainAliasAccount::<[u8; 32]>::convert_location(&mul).unwrap(); @@ -966,20 +941,18 @@ mod tests { } #[test] - fn remote_account_fails_with_bad_multilocation() { - let mul = MultiLocation { + fn remote_account_fails_with_bad_location() { + let mul = Location { parents: 1, - interior: X1(AccountKey20 { network: None, key: [0u8; 20] }), + interior: [AccountKey20 { network: None, key: [0u8; 20] }].into(), }; assert!(ForeignChainAliasAccount::<[u8; 32]>::convert_location(&mul).is_none()); } #[test] fn remote_account_convert_on_para_sending_from_remote_para_treasury() { - let relay_treasury_to_para_location = MultiLocation { - parents: 1, - interior: X1(Plurality { id: BodyId::Treasury, part: BodyPart::Voice }), - }; + let relay_treasury_to_para_location = + Location::new(1, [Plurality { id: BodyId::Treasury, part: BodyPart::Voice }]); let actual_description = ForeignChainAliasTreasuryAccount::<[u8; 32]>::convert_location( &relay_treasury_to_para_location, ) @@ -993,13 +966,10 @@ mod tests { actual_description ); - let para_to_para_treasury_location = MultiLocation { - parents: 1, - interior: X2( - Parachain(1001), - Plurality { id: BodyId::Treasury, part: BodyPart::Voice }, - ), - }; + let para_to_para_treasury_location = Location::new( + 1, + [Parachain(1001), Plurality { id: BodyId::Treasury, part: BodyPart::Voice }], + ); let actual_description = ForeignChainAliasTreasuryAccount::<[u8; 32]>::convert_location( ¶_to_para_treasury_location, ) @@ -1016,10 +986,8 @@ mod tests { #[test] fn local_account_convert_on_para_from_relay_treasury() { - let location = MultiLocation { - parents: 0, - interior: X1(Plurality { id: BodyId::Treasury, part: BodyPart::Voice }), - }; + let location = + Location::new(0, [Plurality { id: BodyId::Treasury, part: BodyPart::Voice }]); parameter_types! { pub TreasuryAccountId: AccountId = AccountId::new([42u8; 32]); diff --git a/polkadot/xcm/xcm-builder/src/matcher.rs b/polkadot/xcm/xcm-builder/src/matcher.rs index 9da135dae31..eae43b290fb 100644 --- a/polkadot/xcm/xcm-builder/src/matcher.rs +++ b/polkadot/xcm/xcm-builder/src/matcher.rs @@ -18,7 +18,7 @@ use core::ops::ControlFlow; use frame_support::traits::ProcessMessageError; -use xcm::latest::{Instruction, MultiLocation}; +use xcm::latest::{Instruction, Location}; /// Creates an instruction matcher from an XCM. Since XCM versions differ, we need to make a trait /// here to unify the interfaces among them. @@ -67,7 +67,7 @@ impl<'a, Call> CreateMatcher for &'a mut [Instruction] { pub trait MatchXcm { /// The concrete instruction type. Necessary to specify as it changes between XCM versions. type Inst; - /// The `MultiLocation` type. Necessary to specify as it changes between XCM versions. + /// The `Location` type. Necessary to specify as it changes between XCM versions. type Loc; /// The error type to throw when errors happen during matching. type Error; @@ -125,7 +125,7 @@ pub struct Matcher<'a, Call> { impl<'a, Call> MatchXcm for Matcher<'a, Call> { type Error = ProcessMessageError; type Inst = Instruction; - type Loc = MultiLocation; + type Loc = Location; fn assert_remaining_insts(self, n: usize) -> Result where diff --git a/polkadot/xcm/xcm-builder/src/matches_location.rs b/polkadot/xcm/xcm-builder/src/matches_location.rs index cfc71eafd02..a96df9e92de 100644 --- a/polkadot/xcm/xcm-builder/src/matches_location.rs +++ b/polkadot/xcm/xcm-builder/src/matches_location.rs @@ -14,37 +14,47 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -//! Various implementations and utilities for matching and filtering `MultiLocation` and -//! `InteriorMultiLocation` types. +//! Various implementations and utilities for matching and filtering `Location` and +//! `InteriorLocation` types. use frame_support::traits::{Contains, Get}; -use xcm::latest::{InteriorMultiLocation, MultiLocation, NetworkId}; +use xcm::latest::{InteriorLocation, Location, NetworkId}; -/// An implementation of `Contains` that checks for `MultiLocation` or -/// `InteriorMultiLocation` if starts with the provided type `T`. -pub struct StartsWith(sp_std::marker::PhantomData); -impl> Contains for StartsWith { - fn contains(t: &MultiLocation) -> bool { - t.starts_with(&T::get()) +/// An implementation of `Contains` that checks for `Location` or +/// `InteriorLocation` if starts with the provided type `T`. +pub struct StartsWith(sp_std::marker::PhantomData<(T, L)>); +impl, L: TryInto + Clone> Contains for StartsWith { + fn contains(location: &L) -> bool { + let latest_location: Location = if let Ok(location) = (*location).clone().try_into() { + location + } else { + return false; + }; + let latest_t = if let Ok(location) = T::get().try_into() { + location + } else { + return false; + }; + latest_location.starts_with(&latest_t) } } -impl> Contains for StartsWith { - fn contains(t: &InteriorMultiLocation) -> bool { +impl> Contains for StartsWith { + fn contains(t: &InteriorLocation) -> bool { t.starts_with(&T::get()) } } -/// An implementation of `Contains` that checks for `MultiLocation` or -/// `InteriorMultiLocation` if starts with expected `GlobalConsensus(NetworkId)` provided as type +/// An implementation of `Contains` that checks for `Location` or +/// `InteriorLocation` if starts with expected `GlobalConsensus(NetworkId)` provided as type /// `T`. pub struct StartsWithExplicitGlobalConsensus(sp_std::marker::PhantomData); -impl> Contains for StartsWithExplicitGlobalConsensus { - fn contains(location: &MultiLocation) -> bool { - matches!(location.interior.global_consensus(), Ok(requested_network) if requested_network.eq(&T::get())) +impl> Contains for StartsWithExplicitGlobalConsensus { + fn contains(location: &Location) -> bool { + matches!(location.interior().global_consensus(), Ok(requested_network) if requested_network.eq(&T::get())) } } -impl> Contains for StartsWithExplicitGlobalConsensus { - fn contains(location: &InteriorMultiLocation) -> bool { +impl> Contains for StartsWithExplicitGlobalConsensus { + fn contains(location: &InteriorLocation) -> bool { matches!(location.global_consensus(), Ok(requested_network) if requested_network.eq(&T::get())) } } diff --git a/polkadot/xcm/xcm-builder/src/matches_token.rs b/polkadot/xcm/xcm-builder/src/matches_token.rs index b6a320d8931..e49fd18f88d 100644 --- a/polkadot/xcm/xcm-builder/src/matches_token.rs +++ b/polkadot/xcm/xcm-builder/src/matches_token.rs @@ -19,25 +19,24 @@ use frame_support::traits::Get; use sp_std::marker::PhantomData; use xcm::latest::{ - AssetId::{Abstract, Concrete}, - AssetInstance, + Asset, AssetId, AssetInstance, Fungibility::{Fungible, NonFungible}, - MultiAsset, MultiLocation, + Location, }; use xcm_executor::traits::{MatchesFungible, MatchesNonFungible}; -/// Converts a `MultiAsset` into balance `B` if it is a concrete fungible with an id equal to that +/// Converts a `Asset` into balance `B` if its id is equal to that /// given by `T`'s `Get`. /// /// # Example /// /// ``` -/// use xcm::latest::{MultiLocation, Parent}; +/// use xcm::latest::{Location, Parent}; /// use staging_xcm_builder::IsConcrete; /// use xcm_executor::traits::MatchesFungible; /// /// frame_support::parameter_types! { -/// pub TargetLocation: MultiLocation = Parent.into(); +/// pub TargetLocation: Location = Parent.into(); /// } /// /// # fn main() { @@ -47,62 +46,18 @@ use xcm_executor::traits::{MatchesFungible, MatchesNonFungible}; /// # } /// ``` pub struct IsConcrete(PhantomData); -impl, B: TryFrom> MatchesFungible for IsConcrete { - fn matches_fungible(a: &MultiAsset) -> Option { +impl, B: TryFrom> MatchesFungible for IsConcrete { + fn matches_fungible(a: &Asset) -> Option { match (&a.id, &a.fun) { - (Concrete(ref id), Fungible(ref amount)) if id == &T::get() => - (*amount).try_into().ok(), + (AssetId(ref id), Fungible(ref amount)) if id == &T::get() => (*amount).try_into().ok(), _ => None, } } } -impl, I: TryFrom> MatchesNonFungible for IsConcrete { - fn matches_nonfungible(a: &MultiAsset) -> Option { +impl, I: TryFrom> MatchesNonFungible for IsConcrete { + fn matches_nonfungible(a: &Asset) -> Option { match (&a.id, &a.fun) { - (Concrete(id), NonFungible(instance)) if id == &T::get() => (*instance).try_into().ok(), - _ => None, - } - } -} - -/// Same as [`IsConcrete`] but for a fungible with abstract location. -/// -/// # Example -/// -/// ``` -/// use xcm::latest::prelude::*; -/// use staging_xcm_builder::IsAbstract; -/// use xcm_executor::traits::{MatchesFungible, MatchesNonFungible}; -/// -/// frame_support::parameter_types! { -/// pub TargetLocation: [u8; 32] = [7u8; 32]; -/// } -/// -/// # fn main() { -/// let asset = ([7u8; 32], 999u128).into(); -/// // match `asset` if it is an abstract asset in `TargetLocation`. -/// assert_eq!( as MatchesFungible>::matches_fungible(&asset), Some(999)); -/// let nft = ([7u8; 32], [42u8; 4]).into(); -/// assert_eq!( -/// as MatchesNonFungible<[u8; 4]>>::matches_nonfungible(&nft), -/// Some([42u8; 4]) -/// ); -/// # } -/// ``` -pub struct IsAbstract(PhantomData); -impl, B: TryFrom> MatchesFungible for IsAbstract { - fn matches_fungible(a: &MultiAsset) -> Option { - match (&a.id, &a.fun) { - (Abstract(ref id), Fungible(ref amount)) if id == &T::get() => - (*amount).try_into().ok(), - _ => None, - } - } -} -impl, B: TryFrom> MatchesNonFungible for IsAbstract { - fn matches_nonfungible(a: &MultiAsset) -> Option { - match (&a.id, &a.fun) { - (Abstract(id), NonFungible(instance)) if id == &T::get() => (*instance).try_into().ok(), + (AssetId(id), NonFungible(instance)) if id == &T::get() => (*instance).try_into().ok(), _ => None, } } diff --git a/polkadot/xcm/xcm-builder/src/nonfungibles_adapter.rs b/polkadot/xcm/xcm-builder/src/nonfungibles_adapter.rs index 357dc534a5f..b4801d3a23a 100644 --- a/polkadot/xcm/xcm-builder/src/nonfungibles_adapter.rs +++ b/polkadot/xcm/xcm-builder/src/nonfungibles_adapter.rs @@ -40,11 +40,11 @@ impl< > TransactAsset for NonFungiblesTransferAdapter { fn transfer_asset( - what: &MultiAsset, - from: &MultiLocation, - to: &MultiLocation, + what: &Asset, + from: &Location, + to: &Location, context: &XcmContext, - ) -> result::Result { + ) -> result::Result { log::trace!( target: LOG_TARGET, "transfer_asset what: {:?}, from: {:?}, to: {:?}, context: {:?}", @@ -131,7 +131,7 @@ impl< CheckingAccount, > { - fn can_check_in(_origin: &MultiLocation, what: &MultiAsset, context: &XcmContext) -> XcmResult { + fn can_check_in(_origin: &Location, what: &Asset, context: &XcmContext) -> XcmResult { log::trace!( target: LOG_TARGET, "can_check_in origin: {:?}, what: {:?}, context: {:?}", @@ -150,7 +150,7 @@ impl< } } - fn check_in(_origin: &MultiLocation, what: &MultiAsset, context: &XcmContext) { + fn check_in(_origin: &Location, what: &Asset, context: &XcmContext) { log::trace!( target: LOG_TARGET, "check_in origin: {:?}, what: {:?}, context: {:?}", @@ -169,7 +169,7 @@ impl< } } - fn can_check_out(_dest: &MultiLocation, what: &MultiAsset, context: &XcmContext) -> XcmResult { + fn can_check_out(_dest: &Location, what: &Asset, context: &XcmContext) -> XcmResult { log::trace!( target: LOG_TARGET, "can_check_out dest: {:?}, what: {:?}, context: {:?}", @@ -188,7 +188,7 @@ impl< } } - fn check_out(_dest: &MultiLocation, what: &MultiAsset, context: &XcmContext) { + fn check_out(_dest: &Location, what: &Asset, context: &XcmContext) { log::trace!( target: LOG_TARGET, "check_out dest: {:?}, what: {:?}, context: {:?}", @@ -207,11 +207,7 @@ impl< } } - fn deposit_asset( - what: &MultiAsset, - who: &MultiLocation, - context: Option<&XcmContext>, - ) -> XcmResult { + fn deposit_asset(what: &Asset, who: &Location, context: Option<&XcmContext>) -> XcmResult { log::trace!( target: LOG_TARGET, "deposit_asset what: {:?}, who: {:?}, context: {:?}", @@ -228,10 +224,10 @@ impl< } fn withdraw_asset( - what: &MultiAsset, - who: &MultiLocation, + what: &Asset, + who: &Location, maybe_context: Option<&XcmContext>, - ) -> result::Result { + ) -> result::Result { log::trace!( target: LOG_TARGET, "withdraw_asset what: {:?}, who: {:?}, maybe_context: {:?}", @@ -267,7 +263,7 @@ impl< > TransactAsset for NonFungiblesAdapter { - fn can_check_in(origin: &MultiLocation, what: &MultiAsset, context: &XcmContext) -> XcmResult { + fn can_check_in(origin: &Location, what: &Asset, context: &XcmContext) -> XcmResult { NonFungiblesMutateAdapter::< Assets, Matcher, @@ -278,7 +274,7 @@ impl< >::can_check_in(origin, what, context) } - fn check_in(origin: &MultiLocation, what: &MultiAsset, context: &XcmContext) { + fn check_in(origin: &Location, what: &Asset, context: &XcmContext) { NonFungiblesMutateAdapter::< Assets, Matcher, @@ -289,7 +285,7 @@ impl< >::check_in(origin, what, context) } - fn can_check_out(dest: &MultiLocation, what: &MultiAsset, context: &XcmContext) -> XcmResult { + fn can_check_out(dest: &Location, what: &Asset, context: &XcmContext) -> XcmResult { NonFungiblesMutateAdapter::< Assets, Matcher, @@ -300,7 +296,7 @@ impl< >::can_check_out(dest, what, context) } - fn check_out(dest: &MultiLocation, what: &MultiAsset, context: &XcmContext) { + fn check_out(dest: &Location, what: &Asset, context: &XcmContext) { NonFungiblesMutateAdapter::< Assets, Matcher, @@ -311,11 +307,7 @@ impl< >::check_out(dest, what, context) } - fn deposit_asset( - what: &MultiAsset, - who: &MultiLocation, - context: Option<&XcmContext>, - ) -> XcmResult { + fn deposit_asset(what: &Asset, who: &Location, context: Option<&XcmContext>) -> XcmResult { NonFungiblesMutateAdapter::< Assets, Matcher, @@ -327,10 +319,10 @@ impl< } fn withdraw_asset( - what: &MultiAsset, - who: &MultiLocation, + what: &Asset, + who: &Location, maybe_context: Option<&XcmContext>, - ) -> result::Result { + ) -> result::Result { NonFungiblesMutateAdapter::< Assets, Matcher, @@ -342,11 +334,11 @@ impl< } fn transfer_asset( - what: &MultiAsset, - from: &MultiLocation, - to: &MultiLocation, + what: &Asset, + from: &Location, + to: &Location, context: &XcmContext, - ) -> result::Result { + ) -> result::Result { NonFungiblesTransferAdapter::::transfer_asset( what, from, to, context, ) diff --git a/polkadot/xcm/xcm-builder/src/origin_aliases.rs b/polkadot/xcm/xcm-builder/src/origin_aliases.rs index 82c5f71b7a1..bbf810463a7 100644 --- a/polkadot/xcm/xcm-builder/src/origin_aliases.rs +++ b/polkadot/xcm/xcm-builder/src/origin_aliases.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -//! Implementation for `ContainsPair`. +//! Implementation for `ContainsPair`. use frame_support::traits::{Contains, ContainsPair}; use sp_std::marker::PhantomData; @@ -25,13 +25,15 @@ use xcm::latest::prelude::*; /// /// Requires that the prefixed origin `AccountId32` matches the target `AccountId32`. pub struct AliasForeignAccountId32(PhantomData); -impl> ContainsPair +impl> ContainsPair for AliasForeignAccountId32 { - fn contains(origin: &MultiLocation, target: &MultiLocation) -> bool { - if let (prefix, Some(account_id @ AccountId32 { .. })) = origin.split_last_interior() { + fn contains(origin: &Location, target: &Location) -> bool { + if let (prefix, Some(account_id @ AccountId32 { .. })) = + origin.clone().split_last_interior() + { return Prefix::contains(&prefix) && - *target == MultiLocation { parents: 0, interior: X1(account_id) } + *target == Location { parents: 0, interior: [account_id].into() } } false } diff --git a/polkadot/xcm/xcm-builder/src/origin_conversion.rs b/polkadot/xcm/xcm-builder/src/origin_conversion.rs index cced7dedf62..f64b5660f66 100644 --- a/polkadot/xcm/xcm-builder/src/origin_conversion.rs +++ b/polkadot/xcm/xcm-builder/src/origin_conversion.rs @@ -21,7 +21,7 @@ use frame_system::RawOrigin as SystemRawOrigin; use polkadot_parachain_primitives::primitives::IsSystem; use sp_runtime::traits::TryConvert; use sp_std::marker::PhantomData; -use xcm::latest::{BodyId, BodyPart, Junction, Junctions::*, MultiLocation, NetworkId, OriginKind}; +use xcm::latest::{BodyId, BodyPart, Junction, Junctions::*, Location, NetworkId, OriginKind}; use xcm_executor::traits::{ConvertLocation, ConvertOrigin}; /// Sovereign accounts use the system's `Signed` origin with an account ID derived from the @@ -35,9 +35,9 @@ where RuntimeOrigin::AccountId: Clone, { fn convert_origin( - origin: impl Into, + origin: impl Into, kind: OriginKind, - ) -> Result { + ) -> Result { let origin = origin.into(); log::trace!( target: "xcm::origin_conversion", @@ -56,9 +56,9 @@ where pub struct ParentAsSuperuser(PhantomData); impl ConvertOrigin for ParentAsSuperuser { fn convert_origin( - origin: impl Into, + origin: impl Into, kind: OriginKind, - ) -> Result { + ) -> Result { let origin = origin.into(); log::trace!(target: "xcm::origin_conversion", "ParentAsSuperuser origin: {:?}, kind: {:?}", origin, kind); if kind == OriginKind::Superuser && origin.contains_parents_only(1) { @@ -76,17 +76,16 @@ impl, RuntimeOrigin: OriginTrait> ConvertOrigin { fn convert_origin( - origin: impl Into, + origin: impl Into, kind: OriginKind, - ) -> Result { + ) -> Result { let origin = origin.into(); log::trace!(target: "xcm::origin_conversion", "ChildSystemParachainAsSuperuser origin: {:?}, kind: {:?}", origin, kind); - match (kind, origin) { - ( - OriginKind::Superuser, - MultiLocation { parents: 0, interior: X1(Junction::Parachain(id)) }, - ) if ParaId::from(id).is_system() => Ok(RuntimeOrigin::root()), - (_, origin) => Err(origin), + match (kind, origin.unpack()) { + (OriginKind::Superuser, (0, [Junction::Parachain(id)])) + if ParaId::from(*id).is_system() => + Ok(RuntimeOrigin::root()), + _ => Err(origin), } } } @@ -98,21 +97,20 @@ impl, RuntimeOrigin: OriginTrait> ConvertOrigin { fn convert_origin( - origin: impl Into, + origin: impl Into, kind: OriginKind, - ) -> Result { + ) -> Result { let origin = origin.into(); log::trace!( target: "xcm::origin_conversion", "SiblingSystemParachainAsSuperuser origin: {:?}, kind: {:?}", origin, kind, ); - match (kind, origin) { - ( - OriginKind::Superuser, - MultiLocation { parents: 1, interior: X1(Junction::Parachain(id)) }, - ) if ParaId::from(id).is_system() => Ok(RuntimeOrigin::root()), - (_, origin) => Err(origin), + match (kind, origin.unpack()) { + (OriginKind::Superuser, (1, [Junction::Parachain(id)])) + if ParaId::from(*id).is_system() => + Ok(RuntimeOrigin::root()), + _ => Err(origin), } } } @@ -124,17 +122,15 @@ impl, RuntimeOrigin: From> ConvertOr for ChildParachainAsNative { fn convert_origin( - origin: impl Into, + origin: impl Into, kind: OriginKind, - ) -> Result { + ) -> Result { let origin = origin.into(); log::trace!(target: "xcm::origin_conversion", "ChildParachainAsNative origin: {:?}, kind: {:?}", origin, kind); - match (kind, origin) { - ( - OriginKind::Native, - MultiLocation { parents: 0, interior: X1(Junction::Parachain(id)) }, - ) => Ok(RuntimeOrigin::from(ParachainOrigin::from(id))), - (_, origin) => Err(origin), + match (kind, origin.unpack()) { + (OriginKind::Native, (0, [Junction::Parachain(id)])) => + Ok(RuntimeOrigin::from(ParachainOrigin::from(*id))), + _ => Err(origin), } } } @@ -146,21 +142,19 @@ impl, RuntimeOrigin: From> ConvertOr for SiblingParachainAsNative { fn convert_origin( - origin: impl Into, + origin: impl Into, kind: OriginKind, - ) -> Result { + ) -> Result { let origin = origin.into(); log::trace!( target: "xcm::origin_conversion", "SiblingParachainAsNative origin: {:?}, kind: {:?}", origin, kind, ); - match (kind, origin) { - ( - OriginKind::Native, - MultiLocation { parents: 1, interior: X1(Junction::Parachain(id)) }, - ) => Ok(RuntimeOrigin::from(ParachainOrigin::from(id))), - (_, origin) => Err(origin), + match (kind, origin.unpack()) { + (OriginKind::Native, (1, [Junction::Parachain(id)])) => + Ok(RuntimeOrigin::from(ParachainOrigin::from(*id))), + _ => Err(origin), } } } @@ -173,9 +167,9 @@ impl, RuntimeOrigin> ConvertOrigin { fn convert_origin( - origin: impl Into, + origin: impl Into, kind: OriginKind, - ) -> Result { + ) -> Result { let origin = origin.into(); log::trace!(target: "xcm::origin_conversion", "RelayChainAsNative origin: {:?}, kind: {:?}", origin, kind); if kind == OriginKind::Native && origin.contains_parents_only(1) { @@ -193,22 +187,20 @@ where RuntimeOrigin::AccountId: From<[u8; 32]>, { fn convert_origin( - origin: impl Into, + origin: impl Into, kind: OriginKind, - ) -> Result { + ) -> Result { let origin = origin.into(); log::trace!( target: "xcm::origin_conversion", "SignedAccountId32AsNative origin: {:?}, kind: {:?}", origin, kind, ); - match (kind, origin) { - ( - OriginKind::Native, - MultiLocation { parents: 0, interior: X1(Junction::AccountId32 { id, network }) }, - ) if matches!(network, None) || network == Network::get() => - Ok(RuntimeOrigin::signed(id.into())), - (_, origin) => Err(origin), + match (kind, origin.unpack()) { + (OriginKind::Native, (0, [Junction::AccountId32 { id, network }])) + if matches!(network, None) || *network == Network::get() => + Ok(RuntimeOrigin::signed((*id).into())), + _ => Err(origin), } } } @@ -222,34 +214,32 @@ where RuntimeOrigin::AccountId: From<[u8; 20]>, { fn convert_origin( - origin: impl Into, + origin: impl Into, kind: OriginKind, - ) -> Result { + ) -> Result { let origin = origin.into(); log::trace!( target: "xcm::origin_conversion", "SignedAccountKey20AsNative origin: {:?}, kind: {:?}", origin, kind, ); - match (kind, origin) { - ( - OriginKind::Native, - MultiLocation { parents: 0, interior: X1(Junction::AccountKey20 { key, network }) }, - ) if (matches!(network, None) || network == Network::get()) => - Ok(RuntimeOrigin::signed(key.into())), - (_, origin) => Err(origin), + match (kind, origin.unpack()) { + (OriginKind::Native, (0, [Junction::AccountKey20 { key, network }])) + if (matches!(network, None) || *network == Network::get()) => + Ok(RuntimeOrigin::signed((*key).into())), + _ => Err(origin), } } } /// `EnsureOrigin` barrier to convert from dispatch origin to XCM origin, if one exists. pub struct EnsureXcmOrigin(PhantomData<(RuntimeOrigin, Conversion)>); -impl> +impl> EnsureOrigin for EnsureXcmOrigin where RuntimeOrigin::PalletsOrigin: PartialEq, { - type Success = MultiLocation; + type Success = Location; fn try_origin(o: RuntimeOrigin) -> Result { let o = match Conversion::try_convert(o) { Ok(location) => return Ok(location), @@ -282,13 +272,12 @@ impl< RuntimeOrigin: OriginTrait + Clone, AccountId: Into<[u8; 32]>, Network: Get>, - > TryConvert - for SignedToAccountId32 + > TryConvert for SignedToAccountId32 where RuntimeOrigin::PalletsOrigin: From> + TryInto, Error = RuntimeOrigin::PalletsOrigin>, { - fn try_convert(o: RuntimeOrigin) -> Result { + fn try_convert(o: RuntimeOrigin) -> Result { o.try_with_caller(|caller| match caller.try_into() { Ok(SystemRawOrigin::Signed(who)) => Ok(Junction::AccountId32 { network: Network::get(), id: who.into() }.into()), @@ -299,7 +288,7 @@ where } /// `Convert` implementation to convert from some an origin which implements `Backing` into a -/// corresponding `Plurality` `MultiLocation`. +/// corresponding `Plurality` `Location`. /// /// Typically used when configuring `pallet-xcm` for allowing a collective's Origin to dispatch an /// XCM from a `Plurality` origin. @@ -307,12 +296,12 @@ pub struct BackingToPlurality( PhantomData<(RuntimeOrigin, COrigin, Body)>, ); impl> - TryConvert for BackingToPlurality + TryConvert for BackingToPlurality where RuntimeOrigin::PalletsOrigin: From + TryInto, { - fn try_convert(o: RuntimeOrigin) -> Result { + fn try_convert(o: RuntimeOrigin) -> Result { o.try_with_caller(|caller| match caller.try_into() { Ok(co) => match co.get_backing() { Some(backing) => Ok(Junction::Plurality { @@ -333,10 +322,10 @@ pub struct OriginToPluralityVoice( PhantomData<(RuntimeOrigin, EnsureBodyOrigin, Body)>, ); impl, Body: Get> - TryConvert + TryConvert for OriginToPluralityVoice { - fn try_convert(o: RuntimeOrigin) -> Result { + fn try_convert(o: RuntimeOrigin) -> Result { match EnsureBodyOrigin::try_origin(o) { Ok(_) => Ok(Junction::Plurality { id: Body::get(), part: BodyPart::Voice }.into()), Err(o) => Err(o), diff --git a/polkadot/xcm/xcm-builder/src/pay.rs b/polkadot/xcm/xcm-builder/src/pay.rs index 4c9b9a6088d..6b466483cfa 100644 --- a/polkadot/xcm/xcm-builder/src/pay.rs +++ b/polkadot/xcm/xcm-builder/src/pay.rs @@ -30,7 +30,7 @@ use xcm_executor::traits::{QueryHandler, QueryResponseStatus}; /// ownership of some `Interior` location of the local chain to a particular `Beneficiary`. The /// `AssetKind` value is not itself bounded (to avoid the issue of needing to wrap some preexisting /// datatype), however a converter type `AssetKindToLocatableAsset` must be provided in order to -/// translate it into a `LocatableAsset`, which comprises both an XCM `MultiLocation` describing +/// translate it into a `LocatableAsset`, which comprises both an XCM `Location` describing /// the XCM endpoint on which the asset to be paid resides and an XCM `AssetId` to identify the /// specific asset at that endpoint. /// @@ -65,14 +65,14 @@ pub struct PayOverXcm< )>, ); impl< - Interior: Get, + Interior: Get, Router: SendXcm, Querier: QueryHandler, Timeout: Get, Beneficiary: Clone, AssetKind, AssetKindToLocatableAsset: TryConvert, - BeneficiaryRefToLocation: for<'a> TryConvert<&'a Beneficiary, MultiLocation>, + BeneficiaryRefToLocation: for<'a> TryConvert<&'a Beneficiary, Location>, > Pay for PayOverXcm< Interior, @@ -105,7 +105,7 @@ impl< let beneficiary = BeneficiaryRefToLocation::try_convert(&who) .map_err(|_| xcm::latest::Error::InvalidLocation)?; - let query_id = Querier::new_query(asset_location, Timeout::get(), Interior::get()); + let query_id = Querier::new_query(asset_location.clone(), Timeout::get(), Interior::get()); let message = Xcm(vec![ DescendOrigin(Interior::get()), @@ -120,8 +120,7 @@ impl< ])), TransferAsset { beneficiary, - assets: vec![MultiAsset { id: asset_id, fun: Fungibility::Fungible(amount) }] - .into(), + assets: vec![Asset { id: asset_id, fun: Fungibility::Fungible(amount) }].into(), }, ]); @@ -195,16 +194,16 @@ pub struct LocatableAssetId { /// The asset's ID. pub asset_id: AssetId, /// The (relative) location in which the asset ID is meaningful. - pub location: MultiLocation, + pub location: Location, } /// Adapter `struct` which implements a conversion from any `AssetKind` into a [`LocatableAssetId`] /// value using a fixed `Location` for the `location` field. -pub struct FixedLocation(sp_std::marker::PhantomData); -impl, AssetKind: Into> TryConvert - for FixedLocation +pub struct FixedLocation(sp_std::marker::PhantomData); +impl, AssetKind: Into> + TryConvert for FixedLocation { fn try_convert(value: AssetKind) -> Result { - Ok(LocatableAssetId { asset_id: value.into(), location: Location::get() }) + Ok(LocatableAssetId { asset_id: value.into(), location: FixedLocationValue::get() }) } } diff --git a/polkadot/xcm/xcm-builder/src/process_xcm_message.rs b/polkadot/xcm/xcm-builder/src/process_xcm_message.rs index 7334bcd2010..bcf91d8e68c 100644 --- a/polkadot/xcm/xcm-builder/src/process_xcm_message.rs +++ b/polkadot/xcm/xcm-builder/src/process_xcm_message.rs @@ -30,7 +30,7 @@ pub struct ProcessXcmMessage( PhantomData<(MessageOrigin, XcmExecutor, Call)>, ); impl< - MessageOrigin: Into + FullCodec + MaxEncodedLen + Clone + Eq + PartialEq + TypeInfo + Debug, + MessageOrigin: Into + FullCodec + MaxEncodedLen + Clone + Eq + PartialEq + TypeInfo + Debug, XcmExecutor: ExecuteXcm, Call, > ProcessMessage for ProcessXcmMessage @@ -82,28 +82,26 @@ impl< let (consumed, result) = match XcmExecutor::execute(origin.into(), pre, id, Weight::zero()) { - Outcome::Complete(w) => { + Outcome::Complete { used } => { log::trace!( target: LOG_TARGET, - "XCM message execution complete, used weight: {w}", + "XCM message execution complete, used weight: {used}", ); - (w, Ok(true)) + (used, Ok(true)) }, - Outcome::Incomplete(w, e) => { + Outcome::Incomplete { used, error } => { log::trace!( target: LOG_TARGET, - "XCM message execution incomplete, used weight: {w}, error: {e:?}", + "XCM message execution incomplete, used weight: {used}, error: {error:?}", ); - - (w, Ok(false)) + (used, Ok(false)) }, // In the error-case we assume the worst case and consume all possible weight. - Outcome::Error(e) => { + Outcome::Error { error } => { log::trace!( target: LOG_TARGET, - "XCM message execution error: {e:?}", + "XCM message execution error: {error:?}", ); - (required, Err(ProcessMessageError::Unsupported)) }, }; diff --git a/polkadot/xcm/xcm-builder/src/routing.rs b/polkadot/xcm/xcm-builder/src/routing.rs index f4c18adddb3..9c0302baee0 100644 --- a/polkadot/xcm/xcm-builder/src/routing.rs +++ b/polkadot/xcm/xcm-builder/src/routing.rs @@ -38,7 +38,7 @@ impl SendXcm for WithUniqueTopic { type Ticket = (Inner::Ticket, [u8; 32]); fn validate( - destination: &mut Option, + destination: &mut Option, message: &mut Option>, ) -> SendResult { let mut message = message.take().ok_or(SendError::MissingArgument)?; @@ -82,7 +82,7 @@ impl SendXcm for WithTopicSource, + destination: &mut Option, message: &mut Option>, ) -> SendResult { let mut message = message.take().ok_or(SendError::MissingArgument)?; diff --git a/polkadot/xcm/xcm-builder/src/test_utils.rs b/polkadot/xcm/xcm-builder/src/test_utils.rs index d0f867ba62d..3131dece375 100644 --- a/polkadot/xcm/xcm-builder/src/test_utils.rs +++ b/polkadot/xcm/xcm-builder/src/test_utils.rs @@ -27,11 +27,11 @@ pub use xcm_executor::{ traits::{ AssetExchange, AssetLock, ConvertOrigin, Enact, LockError, OnResponse, TransactAsset, }, - Assets, Config, + AssetsInHolding, Config, }; parameter_types! { - pub static SubscriptionRequests: Vec<(MultiLocation, Option<(QueryId, Weight)>)> = vec![]; + pub static SubscriptionRequests: Vec<(Location, Option<(QueryId, Weight)>)> = vec![]; pub static MaxAssetsIntoHolding: u32 = 4; } @@ -39,39 +39,39 @@ pub struct TestSubscriptionService; impl VersionChangeNotifier for TestSubscriptionService { fn start( - location: &MultiLocation, + location: &Location, query_id: QueryId, max_weight: Weight, _context: &XcmContext, ) -> XcmResult { let mut r = SubscriptionRequests::get(); - r.push((*location, Some((query_id, max_weight)))); + r.push((location.clone(), Some((query_id, max_weight)))); SubscriptionRequests::set(r); Ok(()) } - fn stop(location: &MultiLocation, _context: &XcmContext) -> XcmResult { + fn stop(location: &Location, _context: &XcmContext) -> XcmResult { let mut r = SubscriptionRequests::get(); r.retain(|(l, _q)| l != location); - r.push((*location, None)); + r.push((location.clone(), None)); SubscriptionRequests::set(r); Ok(()) } - fn is_subscribed(location: &MultiLocation) -> bool { + fn is_subscribed(location: &Location) -> bool { let r = SubscriptionRequests::get(); r.iter().any(|(l, q)| l == location && q.is_some()) } } parameter_types! { - pub static TrappedAssets: Vec<(MultiLocation, MultiAssets)> = vec![]; + pub static TrappedAssets: Vec<(Location, Assets)> = vec![]; } pub struct TestAssetTrap; impl DropAssets for TestAssetTrap { - fn drop_assets(origin: &MultiLocation, assets: Assets, _context: &XcmContext) -> Weight { - let mut t: Vec<(MultiLocation, MultiAssets)> = TrappedAssets::get(); - t.push((*origin, assets.into())); + fn drop_assets(origin: &Location, assets: AssetsInHolding, _context: &XcmContext) -> Weight { + let mut t: Vec<(Location, Assets)> = TrappedAssets::get(); + t.push((origin.clone(), assets.into())); TrappedAssets::set(t); Weight::from_parts(5, 5) } @@ -79,13 +79,13 @@ impl DropAssets for TestAssetTrap { impl ClaimAssets for TestAssetTrap { fn claim_assets( - origin: &MultiLocation, - ticket: &MultiLocation, - what: &MultiAssets, + origin: &Location, + ticket: &Location, + what: &Assets, _context: &XcmContext, ) -> bool { - let mut t: Vec<(MultiLocation, MultiAssets)> = TrappedAssets::get(); - if let (0, X1(GeneralIndex(i))) = (ticket.parents, &ticket.interior) { + let mut t: Vec<(Location, Assets)> = TrappedAssets::get(); + if let (0, [GeneralIndex(i)]) = ticket.unpack() { if let Some((l, a)) = t.get(*i as usize) { if l == origin && a == what { t.swap_remove(*i as usize); @@ -102,11 +102,11 @@ pub struct TestAssetExchanger; impl AssetExchange for TestAssetExchanger { fn exchange_asset( - _origin: Option<&MultiLocation>, - _give: Assets, - want: &MultiAssets, + _origin: Option<&Location>, + _give: AssetsInHolding, + want: &Assets, _maximal: bool, - ) -> Result { + ) -> Result { Ok(want.clone().into()) } } @@ -135,17 +135,17 @@ impl PalletsInfoAccess for TestPalletsInfo { } pub struct TestUniversalAliases; -impl Contains<(MultiLocation, Junction)> for TestUniversalAliases { - fn contains(aliases: &(MultiLocation, Junction)) -> bool { +impl Contains<(Location, Junction)> for TestUniversalAliases { + fn contains(aliases: &(Location, Junction)) -> bool { &aliases.0 == &Here.into_location() && &aliases.1 == &GlobalConsensus(ByGenesis([0; 32])) } } parameter_types! { - pub static LockedAssets: Vec<(MultiLocation, MultiAsset)> = vec![]; + pub static LockedAssets: Vec<(Location, Asset)> = vec![]; } -pub struct TestLockTicket(MultiLocation, MultiAsset); +pub struct TestLockTicket(Location, Asset); impl Enact for TestLockTicket { fn enact(self) -> Result<(), LockError> { let mut locked_assets = LockedAssets::get(); @@ -154,7 +154,7 @@ impl Enact for TestLockTicket { Ok(()) } } -pub struct TestUnlockTicket(MultiLocation, MultiAsset); +pub struct TestUnlockTicket(Location, Asset); impl Enact for TestUnlockTicket { fn enact(self) -> Result<(), LockError> { let mut locked_assets = LockedAssets::get(); @@ -183,33 +183,33 @@ impl AssetLock for TestAssetLocker { type ReduceTicket = TestReduceTicket; fn prepare_lock( - unlocker: MultiLocation, - asset: MultiAsset, - _owner: MultiLocation, + unlocker: Location, + asset: Asset, + _owner: Location, ) -> Result { Ok(TestLockTicket(unlocker, asset)) } fn prepare_unlock( - unlocker: MultiLocation, - asset: MultiAsset, - _owner: MultiLocation, + unlocker: Location, + asset: Asset, + _owner: Location, ) -> Result { Ok(TestUnlockTicket(unlocker, asset)) } fn note_unlockable( - _locker: MultiLocation, - _asset: MultiAsset, - _owner: MultiLocation, + _locker: Location, + _asset: Asset, + _owner: Location, ) -> Result<(), LockError> { Ok(()) } fn prepare_reduce_unlockable( - _locker: MultiLocation, - _asset: MultiAsset, - _owner: MultiLocation, + _locker: Location, + _asset: Asset, + _owner: Location, ) -> Result { Ok(TestReduceTicket) } diff --git a/polkadot/xcm/xcm-builder/src/tests/aliases.rs b/polkadot/xcm/xcm-builder/src/tests/aliases.rs index f686926a252..89c17b09396 100644 --- a/polkadot/xcm/xcm-builder/src/tests/aliases.rs +++ b/polkadot/xcm/xcm-builder/src/tests/aliases.rs @@ -66,20 +66,25 @@ fn alias_origin_should_work() { ]); let message = Xcm(vec![AliasOrigin((AccountId32 { network: None, id: [0; 32] }).into())]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( (Parachain(1), AccountId32 { network: None, id: [0; 32] }), message.clone(), - hash, + &mut hash, Weight::from_parts(50, 50), + Weight::zero(), + ); + assert_eq!( + r, + Outcome::Incomplete { used: Weight::from_parts(10, 10), error: XcmError::NoPermission } ); - assert_eq!(r, Outcome::Incomplete(Weight::from_parts(10, 10), XcmError::NoPermission)); - let r = XcmExecutor::::execute_xcm( + let r = XcmExecutor::::prepare_and_execute( (Parent, Parachain(1), AccountId32 { network: None, id: [0; 32] }), message.clone(), - hash, + &mut hash, Weight::from_parts(50, 50), + Weight::zero(), ); - assert_eq!(r, Outcome::Complete(Weight::from_parts(10, 10))); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(10, 10) }); } diff --git a/polkadot/xcm/xcm-builder/src/tests/assets.rs b/polkadot/xcm/xcm-builder/src/tests/assets.rs index e1d61a9d1c6..b510eab8df5 100644 --- a/polkadot/xcm/xcm-builder/src/tests/assets.rs +++ b/polkadot/xcm/xcm-builder/src/tests/assets.rs @@ -32,10 +32,15 @@ fn exchange_asset_should_work() { maximal: true, }, ]); - let hash = fake_message_hash(&message); - let r = - XcmExecutor::::execute_xcm(Parent, message, hash, Weight::from_parts(50, 50)); - assert_eq!(r, Outcome::Complete(Weight::from_parts(40, 40))); + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( + Parent, + message, + &mut hash, + Weight::from_parts(50, 50), + Weight::zero(), + ); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(40, 40) }); assert_eq!(asset_list(Parent), vec![(Here, 100u128).into(), (Parent, 950u128).into()]); assert_eq!(exchange_assets(), vec![(Parent, 50u128).into()].into()); } @@ -56,10 +61,15 @@ fn exchange_asset_without_maximal_should_work() { maximal: false, }, ]); - let hash = fake_message_hash(&message); - let r = - XcmExecutor::::execute_xcm(Parent, message, hash, Weight::from_parts(50, 50)); - assert_eq!(r, Outcome::Complete(Weight::from_parts(40, 40))); + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( + Parent, + message, + &mut hash, + Weight::from_parts(50, 50), + Weight::zero(), + ); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(40, 40) }); assert_eq!(asset_list(Parent), vec![(Here, 50u128).into(), (Parent, 950u128).into()]); assert_eq!(exchange_assets(), vec![(Here, 50u128).into(), (Parent, 50u128).into()].into()); } @@ -80,10 +90,18 @@ fn exchange_asset_should_fail_when_no_deal_possible() { maximal: false, }, ]); - let hash = fake_message_hash(&message); - let r = - XcmExecutor::::execute_xcm(Parent, message, hash, Weight::from_parts(50, 50)); - assert_eq!(r, Outcome::Incomplete(Weight::from_parts(40, 40), XcmError::NoDeal)); + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( + Parent, + message, + &mut hash, + Weight::from_parts(50, 50), + Weight::zero(), + ); + assert_eq!( + r, + Outcome::Incomplete { used: Weight::from_parts(40, 40), error: XcmError::NoDeal } + ); assert_eq!(asset_list(Parent), vec![(Parent, 1000u128).into()]); assert_eq!(exchange_assets(), vec![(Here, 100u128).into()].into()); } @@ -100,32 +118,39 @@ fn paying_reserve_deposit_should_work() { BuyExecution { fees, weight_limit: Limited(Weight::from_parts(30, 30)) }, DepositAsset { assets: AllCounted(1).into(), beneficiary: Here.into() }, ]); - let hash = fake_message_hash(&message); + let mut hash = fake_message_hash(&message); let weight_limit = Weight::from_parts(50, 50); - let r = XcmExecutor::::execute_xcm(Parent, message, hash, weight_limit); - assert_eq!(r, Outcome::Complete(Weight::from_parts(30, 30))); + let r = XcmExecutor::::prepare_and_execute( + Parent, + message, + &mut hash, + weight_limit, + Weight::zero(), + ); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(30, 30) }); assert_eq!(asset_list(Here), vec![(Parent, 40u128).into()]); } #[test] fn transfer_should_work() { // we'll let them have message execution for free. - AllowUnpaidFrom::set(vec![X1(Parachain(1)).into()]); + AllowUnpaidFrom::set(vec![[Parachain(1)].into()]); // Child parachain #1 owns 1000 tokens held by us in reserve. add_asset(Parachain(1), (Here, 1000)); // They want to transfer 100 of them to their sibling parachain #2 let message = Xcm(vec![TransferAsset { assets: (Here, 100u128).into(), - beneficiary: X1(AccountIndex64 { index: 3, network: None }).into(), + beneficiary: [AccountIndex64 { index: 3, network: None }].into(), }]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( Parachain(1), message, - hash, + &mut hash, Weight::from_parts(50, 50), + Weight::zero(), ); - assert_eq!(r, Outcome::Complete(Weight::from_parts(10, 10))); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(10, 10) }); assert_eq!( asset_list(AccountIndex64 { index: 3, network: None }), vec![(Here, 100u128).into()] @@ -136,27 +161,31 @@ fn transfer_should_work() { #[test] fn reserve_transfer_should_work() { - AllowUnpaidFrom::set(vec![X1(Parachain(1)).into()]); + AllowUnpaidFrom::set(vec![[Parachain(1)].into()]); // Child parachain #1 owns 1000 tokens held by us in reserve. add_asset(Parachain(1), (Here, 1000)); // The remote account owned by gav. - let three: MultiLocation = X1(AccountIndex64 { index: 3, network: None }).into(); + let three: Location = [AccountIndex64 { index: 3, network: None }].into(); // They want to transfer 100 of our native asset from sovereign account of parachain #1 into #2 // and let them know to hand it to account #3. let message = Xcm(vec![TransferReserveAsset { assets: (Here, 100u128).into(), dest: Parachain(2).into(), - xcm: Xcm::<()>(vec![DepositAsset { assets: AllCounted(1).into(), beneficiary: three }]), + xcm: Xcm::<()>(vec![DepositAsset { + assets: AllCounted(1).into(), + beneficiary: three.clone(), + }]), }]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( Parachain(1), message, - hash, + &mut hash, Weight::from_parts(50, 50), + Weight::zero(), ); - assert_eq!(r, Outcome::Complete(Weight::from_parts(10, 10))); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(10, 10) }); let expected_msg = Xcm::<()>(vec![ ReserveAssetDeposited((Parent, 100u128).into()), @@ -171,7 +200,7 @@ fn reserve_transfer_should_work() { #[test] fn burn_should_work() { // we'll let them have message execution for free. - AllowUnpaidFrom::set(vec![X1(Parachain(1)).into()]); + AllowUnpaidFrom::set(vec![[Parachain(1)].into()]); // Child parachain #1 owns 1000 tokens held by us in reserve. add_asset(Parachain(1), (Here, 1000)); // They want to burn 100 of them @@ -180,14 +209,15 @@ fn burn_should_work() { BurnAsset((Here, 100u128).into()), DepositAsset { assets: Wild(AllCounted(1)), beneficiary: Parachain(1).into() }, ]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( Parachain(1), message, - hash, + &mut hash, Weight::from_parts(50, 50), + Weight::zero(), ); - assert_eq!(r, Outcome::Complete(Weight::from_parts(30, 30))); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(30, 30) }); assert_eq!(asset_list(Parachain(1)), vec![(Here, 900u128).into()]); assert_eq!(sent_xcm(), vec![]); @@ -197,14 +227,15 @@ fn burn_should_work() { BurnAsset((Here, 1000u128).into()), DepositAsset { assets: Wild(AllCounted(1)), beneficiary: Parachain(1).into() }, ]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( Parachain(1), message, - hash, + &mut hash, Weight::from_parts(50, 50), + Weight::zero(), ); - assert_eq!(r, Outcome::Complete(Weight::from_parts(30, 30))); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(30, 30) }); assert_eq!(asset_list(Parachain(1)), vec![]); assert_eq!(sent_xcm(), vec![]); } @@ -212,7 +243,7 @@ fn burn_should_work() { #[test] fn basic_asset_trap_should_work() { // we'll let them have message execution for free. - AllowUnpaidFrom::set(vec![X1(Parachain(1)).into(), X1(Parachain(2)).into()]); + AllowUnpaidFrom::set(vec![[Parachain(1)].into(), [Parachain(2)].into()]); // Child parachain #1 owns 1000 tokens held by us in reserve. add_asset(Parachain(1), (Here, 1000)); @@ -224,14 +255,15 @@ fn basic_asset_trap_should_work() { beneficiary: AccountIndex64 { index: 3, network: None }.into(), }, ]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( Parachain(1), message, - hash, + &mut hash, Weight::from_parts(20, 20), + Weight::zero(), ); - assert_eq!(r, Outcome::Complete(Weight::from_parts(25, 25))); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(25, 25) }); assert_eq!(asset_list(Parachain(1)), vec![(Here, 900u128).into()]); assert_eq!(asset_list(AccountIndex64 { index: 3, network: None }), vec![]); @@ -243,15 +275,19 @@ fn basic_asset_trap_should_work() { beneficiary: AccountIndex64 { index: 3, network: None }.into(), }, ]); - let hash = fake_message_hash(&message); + let mut hash = fake_message_hash(&message); let old_trapped_assets = TrappedAssets::get(); - let r = XcmExecutor::::execute_xcm( + let r = XcmExecutor::::prepare_and_execute( Parachain(1), message, - hash, + &mut hash, Weight::from_parts(20, 20), + Weight::zero(), + ); + assert_eq!( + r, + Outcome::Incomplete { used: Weight::from_parts(10, 10), error: XcmError::UnknownClaim } ); - assert_eq!(r, Outcome::Incomplete(Weight::from_parts(10, 10), XcmError::UnknownClaim)); assert_eq!(asset_list(Parachain(1)), vec![(Here, 900u128).into()]); assert_eq!(asset_list(AccountIndex64 { index: 3, network: None }), vec![]); assert_eq!(old_trapped_assets, TrappedAssets::get()); @@ -264,15 +300,19 @@ fn basic_asset_trap_should_work() { beneficiary: AccountIndex64 { index: 3, network: None }.into(), }, ]); - let hash = fake_message_hash(&message); + let mut hash = fake_message_hash(&message); let old_trapped_assets = TrappedAssets::get(); - let r = XcmExecutor::::execute_xcm( + let r = XcmExecutor::::prepare_and_execute( Parachain(2), message, - hash, + &mut hash, Weight::from_parts(20, 20), + Weight::zero(), + ); + assert_eq!( + r, + Outcome::Incomplete { used: Weight::from_parts(10, 10), error: XcmError::UnknownClaim } ); - assert_eq!(r, Outcome::Incomplete(Weight::from_parts(10, 10), XcmError::UnknownClaim)); assert_eq!(asset_list(Parachain(1)), vec![(Here, 900u128).into()]); assert_eq!(asset_list(AccountIndex64 { index: 3, network: None }), vec![]); assert_eq!(old_trapped_assets, TrappedAssets::get()); @@ -285,15 +325,19 @@ fn basic_asset_trap_should_work() { beneficiary: AccountIndex64 { index: 3, network: None }.into(), }, ]); - let hash = fake_message_hash(&message); + let mut hash = fake_message_hash(&message); let old_trapped_assets = TrappedAssets::get(); - let r = XcmExecutor::::execute_xcm( + let r = XcmExecutor::::prepare_and_execute( Parachain(1), message, - hash, + &mut hash, Weight::from_parts(20, 20), + Weight::zero(), + ); + assert_eq!( + r, + Outcome::Incomplete { used: Weight::from_parts(10, 10), error: XcmError::UnknownClaim } ); - assert_eq!(r, Outcome::Incomplete(Weight::from_parts(10, 10), XcmError::UnknownClaim)); assert_eq!(asset_list(Parachain(1)), vec![(Here, 900u128).into()]); assert_eq!(asset_list(AccountIndex64 { index: 3, network: None }), vec![]); assert_eq!(old_trapped_assets, TrappedAssets::get()); @@ -305,14 +349,15 @@ fn basic_asset_trap_should_work() { beneficiary: AccountIndex64 { index: 3, network: None }.into(), }, ]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( Parachain(1), message, - hash, + &mut hash, Weight::from_parts(20, 20), + Weight::zero(), ); - assert_eq!(r, Outcome::Complete(Weight::from_parts(20, 20))); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(20, 20) }); assert_eq!(asset_list(Parachain(1)), vec![(Here, 900u128).into()]); assert_eq!( asset_list(AccountIndex64 { index: 3, network: None }), @@ -327,141 +372,168 @@ fn basic_asset_trap_should_work() { beneficiary: AccountIndex64 { index: 3, network: None }.into(), }, ]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( Parachain(1), message, - hash, + &mut hash, Weight::from_parts(20, 20), + Weight::zero(), + ); + assert_eq!( + r, + Outcome::Incomplete { used: Weight::from_parts(10, 10), error: XcmError::UnknownClaim } ); - assert_eq!(r, Outcome::Incomplete(Weight::from_parts(10, 10), XcmError::UnknownClaim)); } #[test] fn max_assets_limit_should_work() { // we'll let them have message execution for free. - AllowUnpaidFrom::set(vec![X1(Parachain(1)).into()]); + AllowUnpaidFrom::set(vec![[Parachain(1)].into()]); // Child parachain #1 owns 1000 tokens held by us in reserve. - add_asset(Parachain(1), ([1u8; 32], 1000u128)); - add_asset(Parachain(1), ([2u8; 32], 1000u128)); - add_asset(Parachain(1), ([3u8; 32], 1000u128)); - add_asset(Parachain(1), ([4u8; 32], 1000u128)); - add_asset(Parachain(1), ([5u8; 32], 1000u128)); - add_asset(Parachain(1), ([6u8; 32], 1000u128)); - add_asset(Parachain(1), ([7u8; 32], 1000u128)); - add_asset(Parachain(1), ([8u8; 32], 1000u128)); - add_asset(Parachain(1), ([9u8; 32], 1000u128)); + add_asset(Parachain(1), (Junctions::from([GeneralIndex(0)]), 1000u128)); + add_asset(Parachain(1), (Junctions::from([GeneralIndex(1)]), 1000u128)); + add_asset(Parachain(1), (Junctions::from([GeneralIndex(2)]), 1000u128)); + add_asset(Parachain(1), (Junctions::from([GeneralIndex(3)]), 1000u128)); + add_asset(Parachain(1), (Junctions::from([GeneralIndex(4)]), 1000u128)); + add_asset(Parachain(1), (Junctions::from([GeneralIndex(5)]), 1000u128)); + add_asset(Parachain(1), (Junctions::from([GeneralIndex(6)]), 1000u128)); + add_asset(Parachain(1), (Junctions::from([GeneralIndex(7)]), 1000u128)); + add_asset(Parachain(1), (Junctions::from([GeneralIndex(8)]), 1000u128)); // Attempt to withdraw 8 (=2x4)different assets. This will succeed. let message = Xcm(vec![ - WithdrawAsset(([1u8; 32], 100u128).into()), - WithdrawAsset(([2u8; 32], 100u128).into()), - WithdrawAsset(([3u8; 32], 100u128).into()), - WithdrawAsset(([4u8; 32], 100u128).into()), - WithdrawAsset(([5u8; 32], 100u128).into()), - WithdrawAsset(([6u8; 32], 100u128).into()), - WithdrawAsset(([7u8; 32], 100u128).into()), - WithdrawAsset(([8u8; 32], 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(0)]), 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(1)]), 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(2)]), 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(3)]), 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(4)]), 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(5)]), 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(6)]), 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(7)]), 100u128).into()), ]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( Parachain(1), message, - hash, + &mut hash, Weight::from_parts(100, 100), + Weight::zero(), ); - assert_eq!(r, Outcome::Complete(Weight::from_parts(85, 85))); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(85, 85) }); // Attempt to withdraw 9 different assets will fail. let message = Xcm(vec![ - WithdrawAsset(([1u8; 32], 100u128).into()), - WithdrawAsset(([2u8; 32], 100u128).into()), - WithdrawAsset(([3u8; 32], 100u128).into()), - WithdrawAsset(([4u8; 32], 100u128).into()), - WithdrawAsset(([5u8; 32], 100u128).into()), - WithdrawAsset(([6u8; 32], 100u128).into()), - WithdrawAsset(([7u8; 32], 100u128).into()), - WithdrawAsset(([8u8; 32], 100u128).into()), - WithdrawAsset(([9u8; 32], 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(0)]), 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(1)]), 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(2)]), 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(3)]), 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(4)]), 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(5)]), 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(6)]), 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(7)]), 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(8)]), 100u128).into()), ]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( Parachain(1), message, - hash, + &mut hash, Weight::from_parts(100, 100), + Weight::zero(), + ); + assert_eq!( + r, + Outcome::Incomplete { + used: Weight::from_parts(95, 95), + error: XcmError::HoldingWouldOverflow + } ); - assert_eq!(r, Outcome::Incomplete(Weight::from_parts(95, 95), XcmError::HoldingWouldOverflow)); // Attempt to withdraw 4 different assets and then the same 4 and then a different 4 will // succeed. let message = Xcm(vec![ - WithdrawAsset(([1u8; 32], 100u128).into()), - WithdrawAsset(([2u8; 32], 100u128).into()), - WithdrawAsset(([3u8; 32], 100u128).into()), - WithdrawAsset(([4u8; 32], 100u128).into()), - WithdrawAsset(([1u8; 32], 100u128).into()), - WithdrawAsset(([2u8; 32], 100u128).into()), - WithdrawAsset(([3u8; 32], 100u128).into()), - WithdrawAsset(([4u8; 32], 100u128).into()), - WithdrawAsset(([5u8; 32], 100u128).into()), - WithdrawAsset(([6u8; 32], 100u128).into()), - WithdrawAsset(([7u8; 32], 100u128).into()), - WithdrawAsset(([8u8; 32], 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(0)]), 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(1)]), 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(2)]), 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(3)]), 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(0)]), 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(1)]), 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(2)]), 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(3)]), 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(4)]), 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(5)]), 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(6)]), 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(7)]), 100u128).into()), ]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( Parachain(1), message, - hash, + &mut hash, Weight::from_parts(200, 200), + Weight::zero(), ); - assert_eq!(r, Outcome::Complete(Weight::from_parts(125, 125))); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(125, 125) }); // Attempt to withdraw 4 different assets and then a different 4 and then the same 4 will fail. let message = Xcm(vec![ - WithdrawAsset(([1u8; 32], 100u128).into()), - WithdrawAsset(([2u8; 32], 100u128).into()), - WithdrawAsset(([3u8; 32], 100u128).into()), - WithdrawAsset(([4u8; 32], 100u128).into()), - WithdrawAsset(([5u8; 32], 100u128).into()), - WithdrawAsset(([6u8; 32], 100u128).into()), - WithdrawAsset(([7u8; 32], 100u128).into()), - WithdrawAsset(([8u8; 32], 100u128).into()), - WithdrawAsset(([1u8; 32], 100u128).into()), - WithdrawAsset(([2u8; 32], 100u128).into()), - WithdrawAsset(([3u8; 32], 100u128).into()), - WithdrawAsset(([4u8; 32], 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(0)]), 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(1)]), 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(2)]), 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(3)]), 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(4)]), 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(5)]), 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(6)]), 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(7)]), 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(0)]), 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(1)]), 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(2)]), 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(3)]), 100u128).into()), ]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( Parachain(1), message, - hash, + &mut hash, Weight::from_parts(200, 200), + Weight::zero(), + ); + assert_eq!( + r, + Outcome::Incomplete { + used: Weight::from_parts(95, 95), + error: XcmError::HoldingWouldOverflow + } ); - assert_eq!(r, Outcome::Incomplete(Weight::from_parts(95, 95), XcmError::HoldingWouldOverflow)); // Attempt to withdraw 4 different assets and then a different 4 and then the same 4 will fail. let message = Xcm(vec![ - WithdrawAsset(MultiAssets::from(vec![ - ([1u8; 32], 100u128).into(), - ([2u8; 32], 100u128).into(), - ([3u8; 32], 100u128).into(), - ([4u8; 32], 100u128).into(), - ([5u8; 32], 100u128).into(), - ([6u8; 32], 100u128).into(), - ([7u8; 32], 100u128).into(), - ([8u8; 32], 100u128).into(), + WithdrawAsset(Assets::from(vec![ + (Junctions::from([GeneralIndex(0)]), 100u128).into(), + (Junctions::from([GeneralIndex(1)]), 100u128).into(), + (Junctions::from([GeneralIndex(2)]), 100u128).into(), + (Junctions::from([GeneralIndex(3)]), 100u128).into(), + (Junctions::from([GeneralIndex(4)]), 100u128).into(), + (Junctions::from([GeneralIndex(5)]), 100u128).into(), + (Junctions::from([GeneralIndex(6)]), 100u128).into(), + (Junctions::from([GeneralIndex(7)]), 100u128).into(), ])), - WithdrawAsset(([1u8; 32], 100u128).into()), + WithdrawAsset((Junctions::from([GeneralIndex(0)]), 100u128).into()), ]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( Parachain(1), message, - hash, + &mut hash, Weight::from_parts(200, 200), + Weight::zero(), + ); + assert_eq!( + r, + Outcome::Incomplete { + used: Weight::from_parts(25, 25), + error: XcmError::HoldingWouldOverflow + } ); - assert_eq!(r, Outcome::Incomplete(Weight::from_parts(25, 25), XcmError::HoldingWouldOverflow)); } diff --git a/polkadot/xcm/xcm-builder/src/tests/basic.rs b/polkadot/xcm/xcm-builder/src/tests/basic.rs index 02fcd8962db..1482e3d700f 100644 --- a/polkadot/xcm/xcm-builder/src/tests/basic.rs +++ b/polkadot/xcm/xcm-builder/src/tests/basic.rs @@ -27,14 +27,8 @@ fn basic_setup_works() { assert_eq!(to_account(Parachain(50)), Ok(1050)); assert_eq!(to_account((Parent, Parachain(1))), Ok(2001)); assert_eq!(to_account((Parent, Parachain(50))), Ok(2050)); - assert_eq!( - to_account(MultiLocation::new(0, X1(AccountIndex64 { index: 1, network: None }))), - Ok(1), - ); - assert_eq!( - to_account(MultiLocation::new(0, X1(AccountIndex64 { index: 42, network: None }))), - Ok(42), - ); + assert_eq!(to_account(Location::new(0, [AccountIndex64 { index: 1, network: None }])), Ok(1),); + assert_eq!(to_account(Location::new(0, [AccountIndex64 { index: 42, network: None }])), Ok(42),); assert_eq!(to_account(Here), Ok(3000)); } @@ -65,7 +59,7 @@ fn code_registers_should_work() { SetErrorHandler(Xcm(vec![ TransferAsset { assets: (Here, 2u128).into(), - beneficiary: X1(AccountIndex64 { index: 3, network: None }).into(), + beneficiary: [AccountIndex64 { index: 3, network: None }].into(), }, // It was handled fine. ClearError, @@ -73,33 +67,45 @@ fn code_registers_should_work() { // Set the appendix - this will always fire. SetAppendix(Xcm(vec![TransferAsset { assets: (Here, 4u128).into(), - beneficiary: X1(AccountIndex64 { index: 3, network: None }).into(), + beneficiary: [AccountIndex64 { index: 3, network: None }].into(), }])), // First xfer always works ok TransferAsset { assets: (Here, 1u128).into(), - beneficiary: X1(AccountIndex64 { index: 3, network: None }).into(), + beneficiary: [AccountIndex64 { index: 3, network: None }].into(), }, // Second xfer results in error on the second message - our error handler will fire. TransferAsset { assets: (Here, 8u128).into(), - beneficiary: X1(AccountIndex64 { index: 3, network: None }).into(), + beneficiary: [AccountIndex64 { index: 3, network: None }].into(), }, ]); // Weight limit of 70 is needed. let limit = ::Weigher::weight(&mut message).unwrap(); assert_eq!(limit, Weight::from_parts(70, 70)); - let hash = fake_message_hash(&message); + let mut hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm(Here, message.clone(), hash, limit); - assert_eq!(r, Outcome::Complete(Weight::from_parts(50, 50))); // We don't pay the 20 weight for the error handler. + let r = XcmExecutor::::prepare_and_execute( + Here, + message.clone(), + &mut hash, + limit, + Weight::zero(), + ); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(50, 50) }); // We don't pay the 20 weight for the error handler. assert_eq!(asset_list(AccountIndex64 { index: 3, network: None }), vec![(Here, 13u128).into()]); assert_eq!(asset_list(Here), vec![(Here, 8u128).into()]); assert_eq!(sent_xcm(), vec![]); - let r = XcmExecutor::::execute_xcm(Here, message, hash, limit); - assert_eq!(r, Outcome::Complete(Weight::from_parts(70, 70))); // We pay the full weight here. + let r = XcmExecutor::::prepare_and_execute( + Here, + message, + &mut hash, + limit, + Weight::zero(), + ); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(70, 70) }); // We pay the full weight here. assert_eq!(asset_list(AccountIndex64 { index: 3, network: None }), vec![(Here, 20u128).into()]); assert_eq!(asset_list(Here), vec![(Here, 1u128).into()]); assert_eq!(sent_xcm(), vec![]); diff --git a/polkadot/xcm/xcm-builder/src/tests/bridging/local_para_para.rs b/polkadot/xcm/xcm-builder/src/tests/bridging/local_para_para.rs index b1361cc8577..ea584bf9d48 100644 --- a/polkadot/xcm/xcm-builder/src/tests/bridging/local_para_para.rs +++ b/polkadot/xcm/xcm-builder/src/tests/bridging/local_para_para.rs @@ -21,9 +21,9 @@ use super::*; parameter_types! { - pub UniversalLocation: Junctions = X2(GlobalConsensus(Local::get()), Parachain(1)); - pub RemoteUniversalLocation: Junctions = X2(GlobalConsensus(Remote::get()), Parachain(1)); - pub RemoteNetwork: MultiLocation = AncestorThen(2, GlobalConsensus(Remote::get())).into(); + pub UniversalLocation: Junctions = [GlobalConsensus(Local::get()), Parachain(1)].into(); + pub RemoteUniversalLocation: Junctions = [GlobalConsensus(Remote::get()), Parachain(1)].into(); + pub RemoteNetwork: Location = AncestorThen(2, GlobalConsensus(Remote::get())).into(); } type TheBridge = TestBridge>; diff --git a/polkadot/xcm/xcm-builder/src/tests/bridging/local_relay_relay.rs b/polkadot/xcm/xcm-builder/src/tests/bridging/local_relay_relay.rs index 5371abccf66..38ffe2532d5 100644 --- a/polkadot/xcm/xcm-builder/src/tests/bridging/local_relay_relay.rs +++ b/polkadot/xcm/xcm-builder/src/tests/bridging/local_relay_relay.rs @@ -21,9 +21,9 @@ use super::*; parameter_types! { - pub UniversalLocation: Junctions = X1(GlobalConsensus(Local::get())); - pub RemoteUniversalLocation: Junctions = X1(GlobalConsensus(Remote::get())); - pub RemoteNetwork: MultiLocation = AncestorThen(1, GlobalConsensus(Remote::get())).into(); + pub UniversalLocation: Junctions = [GlobalConsensus(Local::get())].into(); + pub RemoteUniversalLocation: Junctions = [GlobalConsensus(Remote::get())].into(); + pub RemoteNetwork: Location = AncestorThen(1, GlobalConsensus(Remote::get())).into(); } type TheBridge = TestBridge>; diff --git a/polkadot/xcm/xcm-builder/src/tests/bridging/mod.rs b/polkadot/xcm/xcm-builder/src/tests/bridging/mod.rs index 0c749b66da6..11f0044fbca 100644 --- a/polkadot/xcm/xcm-builder/src/tests/bridging/mod.rs +++ b/polkadot/xcm/xcm-builder/src/tests/bridging/mod.rs @@ -37,7 +37,7 @@ mod remote_relay_relay; parameter_types! { pub Local: NetworkId = ByGenesis([0; 32]); pub Remote: NetworkId = ByGenesis([1; 32]); - pub Price: MultiAssets = MultiAssets::from((Here, 100u128)); + pub Price: Assets = Assets::from((Here, 100u128)); pub static UsingTopic: bool = false; } @@ -92,7 +92,7 @@ impl SendXcm for TestTopic { } } fn validate( - destination: &mut Option, + destination: &mut Option, message: &mut Option>, ) -> SendResult { Ok(if UsingTopic::get() { @@ -120,26 +120,26 @@ impl HaulBlob for TestBridge { } std::thread_local! { - static REMOTE_INCOMING_XCM: RefCell)>> = RefCell::new(Vec::new()); + static REMOTE_INCOMING_XCM: RefCell)>> = RefCell::new(Vec::new()); } struct TestRemoteIncomingRouter; impl SendXcm for TestRemoteIncomingRouter { - type Ticket = (MultiLocation, Xcm<()>); + type Ticket = (Location, Xcm<()>); fn validate( - dest: &mut Option, + dest: &mut Option, msg: &mut Option>, - ) -> SendResult<(MultiLocation, Xcm<()>)> { + ) -> SendResult<(Location, Xcm<()>)> { let pair = (dest.take().unwrap(), msg.take().unwrap()); - Ok((pair, MultiAssets::new())) + Ok((pair, Assets::new())) } - fn deliver(pair: (MultiLocation, Xcm<()>)) -> Result { + fn deliver(pair: (Location, Xcm<()>)) -> Result { let hash = fake_id(); REMOTE_INCOMING_XCM.with(|q| q.borrow_mut().push(pair)); Ok(hash) } } -fn take_received_remote_messages() -> Vec<(MultiLocation, Xcm<()>)> { +fn take_received_remote_messages() -> Vec<(Location, Xcm<()>)> { REMOTE_INCOMING_XCM.with(|r| r.replace(vec![])) } @@ -152,18 +152,18 @@ struct UnpaidExecutingRouter( fn price( n: NetworkId, c: u32, - s: &InteriorMultiLocation, - d: &InteriorMultiLocation, + s: &InteriorLocation, + d: &InteriorLocation, m: &Xcm<()>, -) -> Result { - Ok(validate_export::(n, c, *s, *d, m.clone())?.1) +) -> Result { + Ok(validate_export::(n, c, s.clone(), d.clone(), m.clone())?.1) } fn deliver( n: NetworkId, c: u32, - s: InteriorMultiLocation, - d: InteriorMultiLocation, + s: InteriorLocation, + d: InteriorLocation, m: Xcm<()>, ) -> Result { export_xcm::(n, c, s, d, m).map(|(hash, _)| hash) @@ -189,7 +189,7 @@ impl, Remote: Get, RemoteExporter: ExportXcm> S type Ticket = Xcm<()>; fn validate( - destination: &mut Option, + destination: &mut Option, message: &mut Option>, ) -> SendResult> { let expect_dest = Remote::get().relative_to(&Local::get()); @@ -197,7 +197,7 @@ impl, Remote: Get, RemoteExporter: ExportXcm> S return Err(NotApplicable) } let message = message.take().ok_or(MissingArgument)?; - Ok((message, MultiAssets::new())) + Ok((message, Assets::new())) } fn deliver(message: Xcm<()>) -> Result { @@ -206,7 +206,7 @@ impl, Remote: Get, RemoteExporter: ExportXcm> S // though it is `Remote`. ExecutorUniversalLocation::set(Remote::get()); let origin = Local::get().relative_to(&Remote::get()); - AllowUnpaidFrom::set(vec![origin]); + AllowUnpaidFrom::set(vec![origin.clone()]); set_exporter_override(price::, deliver::); // The we execute it: let mut id = fake_id(); @@ -222,9 +222,9 @@ impl, Remote: Get, RemoteExporter: ExportXcm> S let entry = LogEntry { local, remote, id, message, outcome: outcome.clone(), paid: false }; RoutingLog::mutate(|l| l.push(entry)); match outcome { - Outcome::Complete(..) => Ok(id), - Outcome::Incomplete(..) => Err(Transport("Error executing")), - Outcome::Error(..) => Err(Transport("Unable to execute")), + Outcome::Complete { .. } => Ok(id), + Outcome::Incomplete { .. } => Err(Transport("Error executing")), + Outcome::Error { .. } => Err(Transport("Unable to execute")), } } } @@ -239,7 +239,7 @@ impl, Remote: Get, RemoteExporter: ExportXcm> S type Ticket = Xcm<()>; fn validate( - destination: &mut Option, + destination: &mut Option, message: &mut Option>, ) -> SendResult> { let expect_dest = Remote::get().relative_to(&Local::get()); @@ -247,7 +247,7 @@ impl, Remote: Get, RemoteExporter: ExportXcm> S return Err(NotApplicable) } let message = message.take().ok_or(MissingArgument)?; - Ok((message, MultiAssets::new())) + Ok((message, Assets::new())) } fn deliver(message: Xcm<()>) -> Result { @@ -256,7 +256,7 @@ impl, Remote: Get, RemoteExporter: ExportXcm> S // though it is `Remote`. ExecutorUniversalLocation::set(Remote::get()); let origin = Local::get().relative_to(&Remote::get()); - AllowPaidFrom::set(vec![origin]); + AllowPaidFrom::set(vec![origin.clone()]); set_exporter_override(price::, deliver::); // Then we execute it: let mut id = fake_id(); @@ -272,9 +272,9 @@ impl, Remote: Get, RemoteExporter: ExportXcm> S let entry = LogEntry { local, remote, id, message, outcome: outcome.clone(), paid: true }; RoutingLog::mutate(|l| l.push(entry)); match outcome { - Outcome::Complete(..) => Ok(id), - Outcome::Incomplete(..) => Err(Transport("Error executing")), - Outcome::Error(..) => Err(Transport("Unable to execute")), + Outcome::Complete { .. } => Ok(id), + Outcome::Incomplete { .. } => Err(Transport("Error executing")), + Outcome::Error { .. } => Err(Transport("Unable to execute")), } } } diff --git a/polkadot/xcm/xcm-builder/src/tests/bridging/paid_remote_relay_relay.rs b/polkadot/xcm/xcm-builder/src/tests/bridging/paid_remote_relay_relay.rs index 079eb0175d7..85d6524fb68 100644 --- a/polkadot/xcm/xcm-builder/src/tests/bridging/paid_remote_relay_relay.rs +++ b/polkadot/xcm/xcm-builder/src/tests/bridging/paid_remote_relay_relay.rs @@ -27,15 +27,15 @@ parameter_types! { // 100 to use the bridge (export) and 80 for the remote execution weight (4 instructions x (10 + // 10) weight each). pub SendOverBridgePrice: u128 = 180u128 + if UsingTopic::get() { 20 } else { 0 }; - pub UniversalLocation: Junctions = X2(GlobalConsensus(Local::get()), Parachain(100)); - pub RelayUniversalLocation: Junctions = X1(GlobalConsensus(Local::get())); - pub RemoteUniversalLocation: Junctions = X1(GlobalConsensus(Remote::get())); - pub RemoteNetwork: MultiLocation = AncestorThen(1, GlobalConsensus(Remote::get())).into(); + pub UniversalLocation: Junctions = [GlobalConsensus(Local::get()), Parachain(100)].into(); + pub RelayUniversalLocation: Junctions = [GlobalConsensus(Local::get())].into(); + pub RemoteUniversalLocation: Junctions = [GlobalConsensus(Remote::get())].into(); + pub RemoteNetwork: Location = AncestorThen(1, GlobalConsensus(Remote::get())).into(); pub BridgeTable: Vec = vec![ NetworkExportTableItem::new( Remote::get(), None, - MultiLocation::parent(), + Location::parent(), Some((Parent, SendOverBridgePrice::get()).into()) ) ]; @@ -64,7 +64,7 @@ type LocalRouter = TestTopic<(LocalInnerRouter, LocalBridgeRouter)>; #[test] fn sending_to_bridged_chain_works() { maybe_with_topic(|| { - let dest: MultiLocation = (Parent, Parent, Remote::get()).into(); + let dest: Location = (Parent, Parent, Remote::get()).into(); // Initialize the local relay so that our parachain has funds to pay for export. clear_assets(Parachain(100)); @@ -99,7 +99,7 @@ fn sending_to_bridged_chain_works() { message: xcm_with_topic( maybe_forward_id_for(&[0; 32]), vec![ - WithdrawAsset(MultiAsset::from((Here, price)).into()), + WithdrawAsset(Asset::from((Here, price)).into()), BuyExecution { fees: (Here, price).into(), weight_limit: Unlimited }, ExportMessage { network: ByGenesis([1; 32]), @@ -109,7 +109,7 @@ fn sending_to_bridged_chain_works() { DepositAsset { assets: Wild(All), beneficiary: Parachain(100).into() }, ], ), - outcome: Outcome::Complete(test_weight(4)), + outcome: Outcome::Complete { used: test_weight(4) }, paid: true, }; assert_eq!(RoutingLog::take(), vec![entry]); @@ -117,7 +117,7 @@ fn sending_to_bridged_chain_works() { } #[test] fn sending_to_bridged_chain_without_funds_fails() { - let dest: MultiLocation = (Parent, Parent, Remote::get()).into(); + let dest: Location = (Parent, Parent, Remote::get()).into(); // Routing won't work if we don't have enough funds. assert_eq!( send_xcm::(dest, Xcm(vec![Trap(1)])), @@ -138,7 +138,7 @@ fn sending_to_bridged_chain_without_funds_fails() { #[test] fn sending_to_parachain_of_bridged_chain_works() { maybe_with_topic(|| { - let dest: MultiLocation = (Parent, Parent, Remote::get(), Parachain(100)).into(); + let dest: Location = (Parent, Parent, Remote::get(), Parachain(100)).into(); // Initialize the local relay so that our parachain has funds to pay for export. clear_assets(Parachain(100)); @@ -173,7 +173,7 @@ fn sending_to_parachain_of_bridged_chain_works() { message: xcm_with_topic( maybe_forward_id_for(&[0; 32]), vec![ - WithdrawAsset(MultiAsset::from((Here, price)).into()), + WithdrawAsset(Asset::from((Here, price)).into()), BuyExecution { fees: (Here, price).into(), weight_limit: Unlimited }, ExportMessage { network: ByGenesis([1; 32]), @@ -183,7 +183,7 @@ fn sending_to_parachain_of_bridged_chain_works() { DepositAsset { assets: Wild(All), beneficiary: Parachain(100).into() }, ], ), - outcome: Outcome::Complete(test_weight(4)), + outcome: Outcome::Complete { used: test_weight(4) }, paid: true, }; assert_eq!(RoutingLog::take(), vec![entry]); @@ -191,7 +191,7 @@ fn sending_to_parachain_of_bridged_chain_works() { } #[test] fn sending_to_parachain_of_bridged_chain_without_funds_fails() { - let dest: MultiLocation = (Parent, Parent, Remote::get(), Parachain(100)).into(); + let dest: Location = (Parent, Parent, Remote::get(), Parachain(100)).into(); // Routing won't work if we don't have enough funds. assert_eq!( send_xcm::(dest, Xcm(vec![Trap(1)])), diff --git a/polkadot/xcm/xcm-builder/src/tests/bridging/remote_para_para.rs b/polkadot/xcm/xcm-builder/src/tests/bridging/remote_para_para.rs index fb6c5da3eb0..b92c59281c6 100644 --- a/polkadot/xcm/xcm-builder/src/tests/bridging/remote_para_para.rs +++ b/polkadot/xcm/xcm-builder/src/tests/bridging/remote_para_para.rs @@ -21,10 +21,10 @@ use super::*; parameter_types! { - pub UniversalLocation: Junctions = X2(GlobalConsensus(Local::get()), Parachain(1000)); - pub ParaBridgeUniversalLocation: Junctions = X2(GlobalConsensus(Local::get()), Parachain(1)); - pub RemoteParaBridgeUniversalLocation: Junctions = X2(GlobalConsensus(Remote::get()), Parachain(1)); - pub RemoteNetwork: MultiLocation = AncestorThen(2, GlobalConsensus(Remote::get())).into(); + pub UniversalLocation: Junctions = [GlobalConsensus(Local::get()), Parachain(1000)].into(); + pub ParaBridgeUniversalLocation: Junctions = [GlobalConsensus(Local::get()), Parachain(1)].into(); + pub RemoteParaBridgeUniversalLocation: Junctions = [GlobalConsensus(Remote::get()), Parachain(1)].into(); + pub RemoteNetwork: Location = AncestorThen(2, GlobalConsensus(Remote::get())).into(); pub BridgeTable: Vec = vec![ NetworkExportTableItem::new( Remote::get(), @@ -62,7 +62,7 @@ fn sending_to_bridged_chain_works() { send_xcm::((Parent, Parent, Remote::get(), Parachain(1)).into(), msg) .unwrap() .1, - MultiAssets::new() + Assets::new() ); assert_eq!(TheBridge::service(), 1); assert_eq!( @@ -94,7 +94,7 @@ fn sending_to_bridged_chain_works() { }, ], ), - outcome: Outcome::Complete(test_weight(2)), + outcome: Outcome::Complete { used: test_weight(2) }, paid: false, }; assert_eq!(RoutingLog::take(), vec![entry]); @@ -116,7 +116,7 @@ fn sending_to_sibling_of_bridged_chain_works() { maybe_with_topic(|| { let msg = Xcm(vec![Trap(1)]); let dest = (Parent, Parent, Remote::get(), Parachain(1000)).into(); - assert_eq!(send_xcm::(dest, msg).unwrap().1, MultiAssets::new()); + assert_eq!(send_xcm::(dest, msg).unwrap().1, Assets::new()); assert_eq!(TheBridge::service(), 1); let expected = vec![( (Parent, Parachain(1000)).into(), @@ -145,7 +145,7 @@ fn sending_to_sibling_of_bridged_chain_works() { }, ], ), - outcome: Outcome::Complete(test_weight(2)), + outcome: Outcome::Complete { used: test_weight(2) }, paid: false, }; assert_eq!(RoutingLog::take(), vec![entry]); @@ -167,7 +167,7 @@ fn sending_to_relay_of_bridged_chain_works() { maybe_with_topic(|| { let msg = Xcm(vec![Trap(1)]); let dest = (Parent, Parent, Remote::get()).into(); - assert_eq!(send_xcm::(dest, msg).unwrap().1, MultiAssets::new()); + assert_eq!(send_xcm::(dest, msg).unwrap().1, Assets::new()); assert_eq!(TheBridge::service(), 1); let expected = vec![( Parent.into(), @@ -196,7 +196,7 @@ fn sending_to_relay_of_bridged_chain_works() { }, ], ), - outcome: Outcome::Complete(test_weight(2)), + outcome: Outcome::Complete { used: test_weight(2) }, paid: false, }; assert_eq!(RoutingLog::take(), vec![entry]); diff --git a/polkadot/xcm/xcm-builder/src/tests/bridging/remote_para_para_via_relay.rs b/polkadot/xcm/xcm-builder/src/tests/bridging/remote_para_para_via_relay.rs index 0b6dc01e2bf..1d433628825 100644 --- a/polkadot/xcm/xcm-builder/src/tests/bridging/remote_para_para_via_relay.rs +++ b/polkadot/xcm/xcm-builder/src/tests/bridging/remote_para_para_via_relay.rs @@ -21,10 +21,10 @@ use super::*; parameter_types! { - pub UniversalLocation: Junctions = X1(GlobalConsensus(Local::get())); - pub ParaBridgeUniversalLocation: Junctions = X2(GlobalConsensus(Local::get()), Parachain(1)); - pub RemoteParaBridgeUniversalLocation: Junctions = X2(GlobalConsensus(Remote::get()), Parachain(1)); - pub RemoteNetwork: MultiLocation = AncestorThen(2, GlobalConsensus(Remote::get())).into(); + pub UniversalLocation: Junctions = [GlobalConsensus(Local::get())].into(); + pub ParaBridgeUniversalLocation: Junctions = [GlobalConsensus(Local::get()), Parachain(1)].into(); + pub RemoteParaBridgeUniversalLocation: Junctions = [GlobalConsensus(Remote::get()), Parachain(1)].into(); + pub RemoteNetwork: Location = AncestorThen(2, GlobalConsensus(Remote::get())).into(); pub BridgeTable: Vec = vec![ NetworkExportTableItem::new( Remote::get(), @@ -62,7 +62,7 @@ fn sending_to_bridged_chain_works() { send_xcm::((Parent, Remote::get(), Parachain(1)).into(), msg) .unwrap() .1, - MultiAssets::new() + Assets::new() ); assert_eq!(TheBridge::service(), 1); let expected = vec![( @@ -85,7 +85,7 @@ fn sending_to_bridged_chain_works() { }, ], ), - outcome: Outcome::Complete(test_weight(2)), + outcome: Outcome::Complete { used: test_weight(2) }, paid: false, }; assert_eq!(RoutingLog::take(), vec![entry]); @@ -107,7 +107,7 @@ fn sending_to_sibling_of_bridged_chain_works() { maybe_with_topic(|| { let msg = Xcm(vec![Trap(1)]); let dest = (Parent, Remote::get(), Parachain(1000)).into(); - assert_eq!(send_xcm::(dest, msg).unwrap().1, MultiAssets::new()); + assert_eq!(send_xcm::(dest, msg).unwrap().1, Assets::new()); assert_eq!(TheBridge::service(), 1); let expected = vec![( (Parent, Parachain(1000)).into(), @@ -129,7 +129,7 @@ fn sending_to_sibling_of_bridged_chain_works() { }, ], ), - outcome: Outcome::Complete(test_weight(2)), + outcome: Outcome::Complete { used: test_weight(2) }, paid: false, }; assert_eq!(RoutingLog::take(), vec![entry]); @@ -151,7 +151,7 @@ fn sending_to_relay_of_bridged_chain_works() { maybe_with_topic(|| { let msg = Xcm(vec![Trap(1)]); let dest = (Parent, Remote::get()).into(); - assert_eq!(send_xcm::(dest, msg).unwrap().1, MultiAssets::new()); + assert_eq!(send_xcm::(dest, msg).unwrap().1, Assets::new()); assert_eq!(TheBridge::service(), 1); let expected = vec![( Parent.into(), @@ -173,7 +173,7 @@ fn sending_to_relay_of_bridged_chain_works() { }, ], ), - outcome: Outcome::Complete(test_weight(2)), + outcome: Outcome::Complete { used: test_weight(2) }, paid: false, }; assert_eq!(RoutingLog::take(), vec![entry]); diff --git a/polkadot/xcm/xcm-builder/src/tests/bridging/remote_relay_relay.rs b/polkadot/xcm/xcm-builder/src/tests/bridging/remote_relay_relay.rs index e33c7b15b0a..d40a941c791 100644 --- a/polkadot/xcm/xcm-builder/src/tests/bridging/remote_relay_relay.rs +++ b/polkadot/xcm/xcm-builder/src/tests/bridging/remote_relay_relay.rs @@ -21,15 +21,15 @@ use super::*; parameter_types! { - pub UniversalLocation: Junctions = X2(GlobalConsensus(Local::get()), Parachain(1000)); - pub RelayUniversalLocation: Junctions = X1(GlobalConsensus(Local::get())); - pub RemoteUniversalLocation: Junctions = X1(GlobalConsensus(Remote::get())); - pub RemoteNetwork: MultiLocation = AncestorThen(1, GlobalConsensus(Remote::get())).into(); + pub UniversalLocation: Junctions = [GlobalConsensus(Local::get()), Parachain(1000)].into(); + pub RelayUniversalLocation: Junctions = [GlobalConsensus(Local::get())].into(); + pub RemoteUniversalLocation: Junctions = [GlobalConsensus(Remote::get())].into(); + pub RemoteNetwork: Location = AncestorThen(1, GlobalConsensus(Remote::get())).into(); pub BridgeTable: Vec = vec![ NetworkExportTableItem::new( Remote::get(), None, - MultiLocation::parent(), + Location::parent(), None ) ]; @@ -59,7 +59,7 @@ fn sending_to_bridged_chain_works() { let msg = Xcm(vec![Trap(1)]); assert_eq!( send_xcm::((Parent, Parent, Remote::get()).into(), msg).unwrap().1, - MultiAssets::new() + Assets::new() ); assert_eq!(TheBridge::service(), 1); assert_eq!( @@ -91,7 +91,7 @@ fn sending_to_bridged_chain_works() { }, ], ), - outcome: Outcome::Complete(test_weight(2)), + outcome: Outcome::Complete { used: test_weight(2) }, paid: false, }; assert_eq!(RoutingLog::take(), vec![entry]); @@ -113,7 +113,7 @@ fn sending_to_parachain_of_bridged_chain_works() { maybe_with_topic(|| { let msg = Xcm(vec![Trap(1)]); let dest = (Parent, Parent, Remote::get(), Parachain(1000)).into(); - assert_eq!(send_xcm::(dest, msg).unwrap().1, MultiAssets::new()); + assert_eq!(send_xcm::(dest, msg).unwrap().1, Assets::new()); assert_eq!(TheBridge::service(), 1); let expected = vec![( Parachain(1000).into(), @@ -142,7 +142,7 @@ fn sending_to_parachain_of_bridged_chain_works() { }, ], ), - outcome: Outcome::Complete(test_weight(2)), + outcome: Outcome::Complete { used: test_weight(2) }, paid: false, }; assert_eq!(RoutingLog::take(), vec![entry]); diff --git a/polkadot/xcm/xcm-builder/src/tests/expecting.rs b/polkadot/xcm/xcm-builder/src/tests/expecting.rs index 6d5e0ff47b5..1b36ef4517c 100644 --- a/polkadot/xcm/xcm-builder/src/tests/expecting.rs +++ b/polkadot/xcm/xcm-builder/src/tests/expecting.rs @@ -18,7 +18,7 @@ use super::*; #[test] fn expect_pallet_should_work() { - AllowUnpaidFrom::set(vec![X1(Parachain(1)).into()]); + AllowUnpaidFrom::set(vec![[Parachain(1)].into()]); // They want to transfer 100 of our native asset from sovereign account of parachain #1 into #2 // and let them know to hand it to account #3. let message = Xcm(vec![ExpectPallet { @@ -28,14 +28,15 @@ fn expect_pallet_should_work() { crate_major: 1, min_crate_minor: 42, }]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( Parachain(1), message, - hash, + &mut hash, Weight::from_parts(50, 50), + Weight::zero(), ); - assert_eq!(r, Outcome::Complete(Weight::from_parts(10, 10))); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(10, 10) }); let message = Xcm(vec![ExpectPallet { index: 1, @@ -44,19 +45,20 @@ fn expect_pallet_should_work() { crate_major: 1, min_crate_minor: 41, }]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( Parachain(1), message, - hash, + &mut hash, Weight::from_parts(50, 50), + Weight::zero(), ); - assert_eq!(r, Outcome::Complete(Weight::from_parts(10, 10))); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(10, 10) }); } #[test] fn expect_pallet_should_fail_correctly() { - AllowUnpaidFrom::set(vec![X1(Parachain(1)).into()]); + AllowUnpaidFrom::set(vec![[Parachain(1)].into()]); let message = Xcm(vec![ExpectPallet { index: 1, name: b"Balances".as_ref().into(), @@ -64,14 +66,21 @@ fn expect_pallet_should_fail_correctly() { crate_major: 1, min_crate_minor: 60, }]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( Parachain(1), message, - hash, + &mut hash, Weight::from_parts(50, 50), + Weight::zero(), + ); + assert_eq!( + r, + Outcome::Incomplete { + used: Weight::from_parts(10, 10), + error: XcmError::VersionIncompatible + } ); - assert_eq!(r, Outcome::Incomplete(Weight::from_parts(10, 10), XcmError::VersionIncompatible)); let message = Xcm(vec![ExpectPallet { index: 1, @@ -80,14 +89,18 @@ fn expect_pallet_should_fail_correctly() { crate_major: 1, min_crate_minor: 42, }]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( Parachain(1), message, - hash, + &mut hash, Weight::from_parts(50, 50), + Weight::zero(), + ); + assert_eq!( + r, + Outcome::Incomplete { used: Weight::from_parts(10, 10), error: XcmError::NameMismatch } ); - assert_eq!(r, Outcome::Incomplete(Weight::from_parts(10, 10), XcmError::NameMismatch)); let message = Xcm(vec![ExpectPallet { index: 1, @@ -96,14 +109,18 @@ fn expect_pallet_should_fail_correctly() { crate_major: 1, min_crate_minor: 42, }]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( Parachain(1), message, - hash, + &mut hash, Weight::from_parts(50, 50), + Weight::zero(), + ); + assert_eq!( + r, + Outcome::Incomplete { used: Weight::from_parts(10, 10), error: XcmError::NameMismatch } ); - assert_eq!(r, Outcome::Incomplete(Weight::from_parts(10, 10), XcmError::NameMismatch)); let message = Xcm(vec![ExpectPallet { index: 0, @@ -112,14 +129,18 @@ fn expect_pallet_should_fail_correctly() { crate_major: 1, min_crate_minor: 42, }]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( Parachain(1), message, - hash, + &mut hash, Weight::from_parts(50, 50), + Weight::zero(), + ); + assert_eq!( + r, + Outcome::Incomplete { used: Weight::from_parts(10, 10), error: XcmError::NameMismatch } ); - assert_eq!(r, Outcome::Incomplete(Weight::from_parts(10, 10), XcmError::NameMismatch)); let message = Xcm(vec![ExpectPallet { index: 2, @@ -128,14 +149,18 @@ fn expect_pallet_should_fail_correctly() { crate_major: 1, min_crate_minor: 42, }]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( Parachain(1), message, - hash, + &mut hash, Weight::from_parts(50, 50), + Weight::zero(), + ); + assert_eq!( + r, + Outcome::Incomplete { used: Weight::from_parts(10, 10), error: XcmError::PalletNotFound } ); - assert_eq!(r, Outcome::Incomplete(Weight::from_parts(10, 10), XcmError::PalletNotFound)); let message = Xcm(vec![ExpectPallet { index: 1, @@ -144,14 +169,21 @@ fn expect_pallet_should_fail_correctly() { crate_major: 2, min_crate_minor: 42, }]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( Parachain(1), message, - hash, + &mut hash, Weight::from_parts(50, 50), + Weight::zero(), + ); + assert_eq!( + r, + Outcome::Incomplete { + used: Weight::from_parts(10, 10), + error: XcmError::VersionIncompatible + } ); - assert_eq!(r, Outcome::Incomplete(Weight::from_parts(10, 10), XcmError::VersionIncompatible)); let message = Xcm(vec![ExpectPallet { index: 1, @@ -160,14 +192,21 @@ fn expect_pallet_should_fail_correctly() { crate_major: 0, min_crate_minor: 42, }]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( Parachain(1), message, - hash, + &mut hash, Weight::from_parts(50, 50), + Weight::zero(), + ); + assert_eq!( + r, + Outcome::Incomplete { + used: Weight::from_parts(10, 10), + error: XcmError::VersionIncompatible + } ); - assert_eq!(r, Outcome::Incomplete(Weight::from_parts(10, 10), XcmError::VersionIncompatible)); let message = Xcm(vec![ExpectPallet { index: 1, @@ -176,12 +215,19 @@ fn expect_pallet_should_fail_correctly() { crate_major: 1, min_crate_minor: 43, }]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( Parachain(1), message, - hash, + &mut hash, Weight::from_parts(50, 50), + Weight::zero(), + ); + assert_eq!( + r, + Outcome::Incomplete { + used: Weight::from_parts(10, 10), + error: XcmError::VersionIncompatible + } ); - assert_eq!(r, Outcome::Incomplete(Weight::from_parts(10, 10), XcmError::VersionIncompatible)); } diff --git a/polkadot/xcm/xcm-builder/src/tests/locking.rs b/polkadot/xcm/xcm-builder/src/tests/locking.rs index f4ef618ac0e..75160e31155 100644 --- a/polkadot/xcm/xcm-builder/src/tests/locking.rs +++ b/polkadot/xcm/xcm-builder/src/tests/locking.rs @@ -34,10 +34,15 @@ fn lock_roundtrip_should_work() { ), LockAsset { asset: (Parent, 100u128).into(), unlocker: (Parent, Parachain(1)).into() }, ]); - let hash = fake_message_hash(&message); - let r = - XcmExecutor::::execute_xcm((3u64,), message, hash, Weight::from_parts(50, 50)); - assert_eq!(r, Outcome::Complete(Weight::from_parts(40, 40))); + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( + (3u64,), + message, + &mut hash, + Weight::from_parts(50, 50), + Weight::zero(), + ); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(40, 40) }); assert_eq!(asset_list((3u64,)), vec![(Parent, 990u128).into()]); let expected_msg = Xcm::<()>(vec![NoteUnlockable { @@ -58,14 +63,15 @@ fn lock_roundtrip_should_work() { // Now we'll unlock it. let message = Xcm(vec![UnlockAsset { asset: (Parent, 100u128).into(), target: (3u64,).into() }]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( (Parent, Parachain(1)), message, - hash, + &mut hash, Weight::from_parts(50, 50), + Weight::zero(), ); - assert_eq!(r, Outcome::Complete(Weight::from_parts(10, 10))); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(10, 10) }); } #[test] @@ -82,10 +88,15 @@ fn auto_fee_paying_should_work() { SetFeesMode { jit_withdraw: true }, LockAsset { asset: (Parent, 100u128).into(), unlocker: (Parent, Parachain(1)).into() }, ]); - let hash = fake_message_hash(&message); - let r = - XcmExecutor::::execute_xcm((3u64,), message, hash, Weight::from_parts(50, 50)); - assert_eq!(r, Outcome::Complete(Weight::from_parts(20, 20))); + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( + (3u64,), + message, + &mut hash, + Weight::from_parts(50, 50), + Weight::zero(), + ); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(20, 20) }); assert_eq!(asset_list((3u64,)), vec![(Parent, 990u128).into()]); } @@ -100,10 +111,18 @@ fn lock_should_fail_correctly() { asset: (Parent, 100u128).into(), unlocker: (Parent, Parachain(1)).into(), }]); - let hash = fake_message_hash(&message); - let r = - XcmExecutor::::execute_xcm((3u64,), message, hash, Weight::from_parts(50, 50)); - assert_eq!(r, Outcome::Incomplete(Weight::from_parts(10, 10), XcmError::LockError)); + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( + (3u64,), + message, + &mut hash, + Weight::from_parts(50, 50), + Weight::zero(), + ); + assert_eq!( + r, + Outcome::Incomplete { used: Weight::from_parts(10, 10), error: XcmError::LockError } + ); assert_eq!(sent_xcm(), vec![]); assert_eq!(take_lock_trace(), vec![]); @@ -118,10 +137,18 @@ fn lock_should_fail_correctly() { asset: (Parent, 100u128).into(), unlocker: (Parent, Parachain(1)).into(), }]); - let hash = fake_message_hash(&message); - let r = - XcmExecutor::::execute_xcm((3u64,), message, hash, Weight::from_parts(50, 50)); - assert_eq!(r, Outcome::Incomplete(Weight::from_parts(10, 10), XcmError::NotHoldingFees)); + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( + (3u64,), + message, + &mut hash, + Weight::from_parts(50, 50), + Weight::zero(), + ); + assert_eq!( + r, + Outcome::Incomplete { used: Weight::from_parts(10, 10), error: XcmError::NotHoldingFees } + ); assert_eq!(sent_xcm(), vec![]); assert_eq!(take_lock_trace(), vec![]); } @@ -140,14 +167,15 @@ fn remote_unlock_roundtrip_should_work() { // This caused Parachain #1 to send us the NoteUnlockable instruction. let message = Xcm(vec![NoteUnlockable { asset: (Parent, 100u128).into(), owner: (3u64,).into() }]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( (Parent, Parachain(1)), message, - hash, + &mut hash, Weight::from_parts(50, 50), + Weight::zero(), ); - assert_eq!(r, Outcome::Complete(Weight::from_parts(10, 10))); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(10, 10) }); assert_eq!( take_lock_trace(), vec![Note { @@ -165,10 +193,15 @@ fn remote_unlock_roundtrip_should_work() { ), RequestUnlock { asset: (Parent, 100u128).into(), locker: (Parent, Parachain(1)).into() }, ]); - let hash = fake_message_hash(&message); - let r = - XcmExecutor::::execute_xcm((3u64,), message, hash, Weight::from_parts(50, 50)); - assert_eq!(r, Outcome::Complete(Weight::from_parts(40, 40))); + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( + (3u64,), + message, + &mut hash, + Weight::from_parts(50, 50), + Weight::zero(), + ); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(40, 40) }); assert_eq!(asset_list((3u64,)), vec![(Parent, 990u128).into()]); let expected_msg = Xcm::<()>(vec![UnlockAsset { @@ -201,24 +234,33 @@ fn remote_unlock_should_fail_correctly() { asset: (Parent, 100u128).into(), locker: (Parent, Parachain(1)).into(), }]); - let hash = fake_message_hash(&message); - let r = - XcmExecutor::::execute_xcm((3u64,), message, hash, Weight::from_parts(50, 50)); - assert_eq!(r, Outcome::Incomplete(Weight::from_parts(10, 10), XcmError::LockError)); + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( + (3u64,), + message, + &mut hash, + Weight::from_parts(50, 50), + Weight::zero(), + ); + assert_eq!( + r, + Outcome::Incomplete { used: Weight::from_parts(10, 10), error: XcmError::LockError } + ); assert_eq!(sent_xcm(), vec![]); assert_eq!(take_lock_trace(), vec![]); // We have been told by Parachain #1 that Account #3 has locked funds which we can unlock. let message = Xcm(vec![NoteUnlockable { asset: (Parent, 100u128).into(), owner: (3u64,).into() }]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( (Parent, Parachain(1)), message, - hash, + &mut hash, Weight::from_parts(50, 50), + Weight::zero(), ); - assert_eq!(r, Outcome::Complete(Weight::from_parts(10, 10))); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(10, 10) }); let _discard = take_lock_trace(); // We want to unlock 100 of the native parent tokens which were locked for us on parachain. @@ -228,10 +270,18 @@ fn remote_unlock_should_fail_correctly() { asset: (Parent, 100u128).into(), locker: (Parent, Parachain(1)).into(), }]); - let hash = fake_message_hash(&message); - let r = - XcmExecutor::::execute_xcm((3u64,), message, hash, Weight::from_parts(50, 50)); - assert_eq!(r, Outcome::Incomplete(Weight::from_parts(10, 10), XcmError::NotHoldingFees)); + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( + (3u64,), + message, + &mut hash, + Weight::from_parts(50, 50), + Weight::zero(), + ); + assert_eq!( + r, + Outcome::Incomplete { used: Weight::from_parts(10, 10), error: XcmError::NotHoldingFees } + ); assert_eq!(sent_xcm(), vec![]); assert_eq!(take_lock_trace(), vec![]); diff --git a/polkadot/xcm/xcm-builder/src/tests/mock.rs b/polkadot/xcm/xcm-builder/src/tests/mock.rs index c1b3f0cf224..f561c7d3bd4 100644 --- a/polkadot/xcm/xcm-builder/src/tests/mock.rs +++ b/polkadot/xcm/xcm-builder/src/tests/mock.rs @@ -28,7 +28,7 @@ pub use crate::{ use frame_support::traits::{ContainsPair, Everything}; pub use frame_support::{ dispatch::{DispatchInfo, DispatchResultWithPostInfo, GetDispatchInfo, PostDispatchInfo}, - ensure, match_types, parameter_types, + ensure, parameter_types, sp_runtime::{traits::Dispatchable, DispatchError, DispatchErrorWithPostInfo}, traits::{Contains, Get, IsInVec}, }; @@ -45,7 +45,7 @@ pub use xcm_executor::{ AssetExchange, AssetLock, CheckSuspension, ConvertOrigin, Enact, ExportXcm, FeeManager, FeeReason, LockError, OnResponse, TransactAsset, }, - Assets, Config, + AssetsInHolding, Config, }; #[derive(Debug)] @@ -110,52 +110,52 @@ impl GetDispatchInfo for TestCall { } thread_local! { - pub static SENT_XCM: RefCell, XcmHash)>> = RefCell::new(Vec::new()); + pub static SENT_XCM: RefCell, XcmHash)>> = RefCell::new(Vec::new()); pub static EXPORTED_XCM: RefCell< - Vec<(NetworkId, u32, InteriorMultiLocation, InteriorMultiLocation, Xcm<()>, XcmHash)> + Vec<(NetworkId, u32, InteriorLocation, InteriorLocation, Xcm<()>, XcmHash)> > = RefCell::new(Vec::new()); pub static EXPORTER_OVERRIDE: RefCell, - ) -> Result, + ) -> Result, fn( NetworkId, u32, - InteriorMultiLocation, - InteriorMultiLocation, + InteriorLocation, + InteriorLocation, Xcm<()>, ) -> Result, )>> = RefCell::new(None); - pub static SEND_PRICE: RefCell = RefCell::new(MultiAssets::new()); + pub static SEND_PRICE: RefCell = RefCell::new(Assets::new()); pub static SUSPENDED: Cell = Cell::new(false); } -pub fn sent_xcm() -> Vec<(MultiLocation, opaque::Xcm, XcmHash)> { +pub fn sent_xcm() -> Vec<(Location, opaque::Xcm, XcmHash)> { SENT_XCM.with(|q| (*q.borrow()).clone()) } -pub fn set_send_price(p: impl Into) { +pub fn set_send_price(p: impl Into) { SEND_PRICE.with(|l| l.replace(p.into().into())); } pub fn exported_xcm( -) -> Vec<(NetworkId, u32, InteriorMultiLocation, InteriorMultiLocation, opaque::Xcm, XcmHash)> { +) -> Vec<(NetworkId, u32, InteriorLocation, InteriorLocation, opaque::Xcm, XcmHash)> { EXPORTED_XCM.with(|q| (*q.borrow()).clone()) } pub fn set_exporter_override( price: fn( NetworkId, u32, - &InteriorMultiLocation, - &InteriorMultiLocation, + &InteriorLocation, + &InteriorLocation, &Xcm<()>, - ) -> Result, + ) -> Result, deliver: fn( NetworkId, u32, - InteriorMultiLocation, - InteriorMultiLocation, + InteriorLocation, + InteriorLocation, Xcm<()>, ) -> Result, ) { @@ -167,17 +167,17 @@ pub fn clear_exporter_override() { } pub struct TestMessageSender; impl SendXcm for TestMessageSender { - type Ticket = (MultiLocation, Xcm<()>, XcmHash); + type Ticket = (Location, Xcm<()>, XcmHash); fn validate( - dest: &mut Option, + dest: &mut Option, msg: &mut Option>, - ) -> SendResult<(MultiLocation, Xcm<()>, XcmHash)> { + ) -> SendResult<(Location, Xcm<()>, XcmHash)> { let msg = msg.take().unwrap(); let hash = fake_message_hash(&msg); let triplet = (dest.take().unwrap(), msg, hash); Ok((triplet, SEND_PRICE.with(|l| l.borrow().clone()))) } - fn deliver(triplet: (MultiLocation, Xcm<()>, XcmHash)) -> Result { + fn deliver(triplet: (Location, Xcm<()>, XcmHash)) -> Result { let hash = triplet.2; SENT_XCM.with(|q| q.borrow_mut().push(triplet)); Ok(hash) @@ -185,21 +185,20 @@ impl SendXcm for TestMessageSender { } pub struct TestMessageExporter; impl ExportXcm for TestMessageExporter { - type Ticket = (NetworkId, u32, InteriorMultiLocation, InteriorMultiLocation, Xcm<()>, XcmHash); + type Ticket = (NetworkId, u32, InteriorLocation, InteriorLocation, Xcm<()>, XcmHash); fn validate( network: NetworkId, channel: u32, - uni_src: &mut Option, - dest: &mut Option, + uni_src: &mut Option, + dest: &mut Option, msg: &mut Option>, - ) -> SendResult<(NetworkId, u32, InteriorMultiLocation, InteriorMultiLocation, Xcm<()>, XcmHash)> - { + ) -> SendResult<(NetworkId, u32, InteriorLocation, InteriorLocation, Xcm<()>, XcmHash)> { let (s, d, m) = (uni_src.take().unwrap(), dest.take().unwrap(), msg.take().unwrap()); - let r: Result = EXPORTER_OVERRIDE.with(|e| { + let r: Result = EXPORTER_OVERRIDE.with(|e| { if let Some((ref f, _)) = &*e.borrow() { f(network, channel, &s, &d, &m) } else { - Ok(MultiAssets::new()) + Ok(Assets::new()) } }); let h = fake_message_hash(&m); @@ -214,7 +213,7 @@ impl ExportXcm for TestMessageExporter { } } fn deliver( - tuple: (NetworkId, u32, InteriorMultiLocation, InteriorMultiLocation, Xcm<()>, XcmHash), + tuple: (NetworkId, u32, InteriorLocation, InteriorLocation, Xcm<()>, XcmHash), ) -> Result { EXPORTER_OVERRIDE.with(|e| { if let Some((_, ref f)) = &*e.borrow() { @@ -230,37 +229,42 @@ impl ExportXcm for TestMessageExporter { } thread_local! { - pub static ASSETS: RefCell> = RefCell::new(BTreeMap::new()); + pub static ASSETS: RefCell> = RefCell::new(BTreeMap::new()); } -pub fn assets(who: impl Into) -> Assets { +pub fn assets(who: impl Into) -> AssetsInHolding { ASSETS.with(|a| a.borrow().get(&who.into()).cloned()).unwrap_or_default() } -pub fn asset_list(who: impl Into) -> Vec { - MultiAssets::from(assets(who)).into_inner() +pub fn asset_list(who: impl Into) -> Vec { + Assets::from(assets(who)).into_inner() } -pub fn add_asset(who: impl Into, what: impl Into) { - ASSETS.with(|a| a.borrow_mut().entry(who.into()).or_insert(Assets::new()).subsume(what.into())); +pub fn add_asset(who: impl Into, what: impl Into) { + ASSETS.with(|a| { + a.borrow_mut() + .entry(who.into()) + .or_insert(AssetsInHolding::new()) + .subsume(what.into()) + }); } -pub fn clear_assets(who: impl Into) { +pub fn clear_assets(who: impl Into) { ASSETS.with(|a| a.borrow_mut().remove(&who.into())); } pub struct TestAssetTransactor; impl TransactAsset for TestAssetTransactor { fn deposit_asset( - what: &MultiAsset, - who: &MultiLocation, + what: &Asset, + who: &Location, _context: Option<&XcmContext>, ) -> Result<(), XcmError> { - add_asset(*who, what.clone()); + add_asset(who.clone(), what.clone()); Ok(()) } fn withdraw_asset( - what: &MultiAsset, - who: &MultiLocation, + what: &Asset, + who: &Location, _maybe_context: Option<&XcmContext>, - ) -> Result { + ) -> Result { ASSETS.with(|a| { a.borrow_mut() .get_mut(who) @@ -271,19 +275,20 @@ impl TransactAsset for TestAssetTransactor { } } -pub fn to_account(l: impl Into) -> Result { - Ok(match l.into() { +pub fn to_account(l: impl Into) -> Result { + let l = l.into(); + Ok(match l.unpack() { // Siblings at 2000+id - MultiLocation { parents: 1, interior: X1(Parachain(id)) } => 2000 + id as u64, + (1, [Parachain(id)]) => 2000 + *id as u64, // Accounts are their number - MultiLocation { parents: 0, interior: X1(AccountIndex64 { index, .. }) } => index, + (0, [AccountIndex64 { index, .. }]) => *index, // Children at 1000+id - MultiLocation { parents: 0, interior: X1(Parachain(id)) } => 1000 + id as u64, + (0, [Parachain(id)]) => 1000 + *id as u64, // Self at 3000 - MultiLocation { parents: 0, interior: Here } => 3000, + (0, []) => 3000, // Parent at 3001 - MultiLocation { parents: 1, interior: Here } => 3001, - l => { + (1, []) => 3001, + _ => { // Is it a foreign-consensus? let uni = ExecutorUniversalLocation::get(); if l.parents as usize != uni.len() { @@ -301,36 +306,35 @@ pub fn to_account(l: impl Into) -> Result { pub struct TestOriginConverter; impl ConvertOrigin for TestOriginConverter { fn convert_origin( - origin: impl Into, + origin: impl Into, kind: OriginKind, - ) -> Result { + ) -> Result { use OriginKind::*; - match (kind, origin.into()) { + let origin = origin.into(); + match (kind, origin.unpack()) { (Superuser, _) => Ok(TestOrigin::Root), - (SovereignAccount, l) => Ok(TestOrigin::Signed(to_account(l)?)), - (Native, MultiLocation { parents: 0, interior: X1(Parachain(id)) }) => - Ok(TestOrigin::Parachain(id)), - (Native, MultiLocation { parents: 1, interior: Here }) => Ok(TestOrigin::Relay), - (Native, MultiLocation { parents: 0, interior: X1(AccountIndex64 { index, .. }) }) => - Ok(TestOrigin::Signed(index)), - (_, origin) => Err(origin), + (SovereignAccount, _) => Ok(TestOrigin::Signed(to_account(origin)?)), + (Native, (0, [Parachain(id)])) => Ok(TestOrigin::Parachain(*id)), + (Native, (1, [])) => Ok(TestOrigin::Relay), + (Native, (0, [AccountIndex64 { index, .. }])) => Ok(TestOrigin::Signed(*index)), + _ => Err(origin), } } } thread_local! { - pub static IS_RESERVE: RefCell>> = RefCell::new(BTreeMap::new()); - pub static IS_TELEPORTER: RefCell>> = RefCell::new(BTreeMap::new()); - pub static UNIVERSAL_ALIASES: RefCell> = RefCell::new(BTreeSet::new()); + pub static IS_RESERVE: RefCell>> = RefCell::new(BTreeMap::new()); + pub static IS_TELEPORTER: RefCell>> = RefCell::new(BTreeMap::new()); + pub static UNIVERSAL_ALIASES: RefCell> = RefCell::new(BTreeSet::new()); } -pub fn add_reserve(from: MultiLocation, asset: MultiAssetFilter) { +pub fn add_reserve(from: Location, asset: AssetFilter) { IS_RESERVE.with(|r| r.borrow_mut().entry(from).or_default().push(asset)); } #[allow(dead_code)] -pub fn add_teleporter(from: MultiLocation, asset: MultiAssetFilter) { +pub fn add_teleporter(from: Location, asset: AssetFilter) { IS_TELEPORTER.with(|r| r.borrow_mut().entry(from).or_default().push(asset)); } -pub fn add_universal_alias(bridge: impl Into, consensus: impl Into) { +pub fn add_universal_alias(bridge: impl Into, consensus: impl Into) { UNIVERSAL_ALIASES.with(|r| r.borrow_mut().insert((bridge.into(), consensus.into()))); } pub fn clear_universal_aliases() { @@ -338,29 +342,29 @@ pub fn clear_universal_aliases() { } pub struct TestIsReserve; -impl ContainsPair for TestIsReserve { - fn contains(asset: &MultiAsset, origin: &MultiLocation) -> bool { +impl ContainsPair for TestIsReserve { + fn contains(asset: &Asset, origin: &Location) -> bool { IS_RESERVE .with(|r| r.borrow().get(origin).map_or(false, |v| v.iter().any(|a| a.matches(asset)))) } } pub struct TestIsTeleporter; -impl ContainsPair for TestIsTeleporter { - fn contains(asset: &MultiAsset, origin: &MultiLocation) -> bool { +impl ContainsPair for TestIsTeleporter { + fn contains(asset: &Asset, origin: &Location) -> bool { IS_TELEPORTER .with(|r| r.borrow().get(origin).map_or(false, |v| v.iter().any(|a| a.matches(asset)))) } } pub struct TestUniversalAliases; -impl Contains<(MultiLocation, Junction)> for TestUniversalAliases { - fn contains(t: &(MultiLocation, Junction)) -> bool { +impl Contains<(Location, Junction)> for TestUniversalAliases { + fn contains(t: &(Location, Junction)) -> bool { UNIVERSAL_ALIASES.with(|r| r.borrow().contains(t)) } } pub enum ResponseSlot { - Expecting(MultiLocation), + Expecting(Location), Received(Response), } thread_local! { @@ -368,20 +372,16 @@ thread_local! { } pub struct TestResponseHandler; impl OnResponse for TestResponseHandler { - fn expecting_response( - origin: &MultiLocation, - query_id: u64, - _querier: Option<&MultiLocation>, - ) -> bool { + fn expecting_response(origin: &Location, query_id: u64, _querier: Option<&Location>) -> bool { QUERIES.with(|q| match q.borrow().get(&query_id) { Some(ResponseSlot::Expecting(ref l)) => l == origin, _ => false, }) } fn on_response( - _origin: &MultiLocation, + _origin: &Location, query_id: u64, - _querier: Option<&MultiLocation>, + _querier: Option<&Location>, response: xcm::latest::Response, _max_weight: Weight, _context: &XcmContext, @@ -396,7 +396,7 @@ impl OnResponse for TestResponseHandler { Weight::from_parts(10, 10) } } -pub fn expect_response(query_id: u64, from: MultiLocation) { +pub fn expect_response(query_id: u64, from: Location) { QUERIES.with(|q| q.borrow_mut().insert(query_id, ResponseSlot::Expecting(from))); } pub fn response(query_id: u64) -> Option { @@ -420,9 +420,9 @@ impl QueryHandler type UniversalLocation = T::UniversalLocation; fn new_query( - responder: impl Into, + responder: impl Into, _timeout: Self::BlockNumber, - _match_querier: impl Into, + _match_querier: impl Into, ) -> Self::QueryId { let query_id = 1; expect_response(query_id, responder.into()); @@ -431,7 +431,7 @@ impl QueryHandler fn report_outcome( message: &mut Xcm<()>, - responder: impl Into, + responder: impl Into, timeout: Self::BlockNumber, ) -> Result { let responder = responder.into(); @@ -466,16 +466,16 @@ impl QueryHandler } parameter_types! { - pub static ExecutorUniversalLocation: InteriorMultiLocation + pub static ExecutorUniversalLocation: InteriorLocation = (ByGenesis([0; 32]), Parachain(42)).into(); pub UnitWeightCost: Weight = Weight::from_parts(10, 10); } parameter_types! { // Nothing is allowed to be paid/unpaid by default. - pub static AllowExplicitUnpaidFrom: Vec = vec![]; - pub static AllowUnpaidFrom: Vec = vec![]; - pub static AllowPaidFrom: Vec = vec![]; - pub static AllowSubsFrom: Vec = vec![]; + pub static AllowExplicitUnpaidFrom: Vec = vec![]; + pub static AllowUnpaidFrom: Vec = vec![]; + pub static AllowPaidFrom: Vec = vec![]; + pub static AllowSubsFrom: Vec = vec![]; // 1_000_000_000_000 => 1 unit of asset for 1 unit of ref time weight. // 1024 * 1024 => 1 unit of asset for 1 unit of proof size weight. pub static WeightPrice: (AssetId, u128, u128) = @@ -486,7 +486,7 @@ parameter_types! { pub struct TestSuspender; impl CheckSuspension for TestSuspender { fn is_suspended( - _origin: &MultiLocation, + _origin: &Location, _instructions: &mut [Instruction], _max_weight: Weight, _properties: &mut Properties, @@ -520,34 +520,34 @@ pub fn set_fee_waiver(waived: Vec) { pub struct TestFeeManager; impl FeeManager for TestFeeManager { - fn is_waived(_: Option<&MultiLocation>, r: FeeReason) -> bool { + fn is_waived(_: Option<&Location>, r: FeeReason) -> bool { IS_WAIVED.with(|l| l.borrow().contains(&r)) } - fn handle_fee(_: MultiAssets, _: Option<&XcmContext>, _: FeeReason) {} + fn handle_fee(_: Assets, _: Option<&XcmContext>, _: FeeReason) {} } #[derive(Clone, Eq, PartialEq, Debug)] pub enum LockTraceItem { - Lock { unlocker: MultiLocation, asset: MultiAsset, owner: MultiLocation }, - Unlock { unlocker: MultiLocation, asset: MultiAsset, owner: MultiLocation }, - Note { locker: MultiLocation, asset: MultiAsset, owner: MultiLocation }, - Reduce { locker: MultiLocation, asset: MultiAsset, owner: MultiLocation }, + Lock { unlocker: Location, asset: Asset, owner: Location }, + Unlock { unlocker: Location, asset: Asset, owner: Location }, + Note { locker: Location, asset: Asset, owner: Location }, + Reduce { locker: Location, asset: Asset, owner: Location }, } thread_local! { pub static NEXT_INDEX: RefCell = RefCell::new(0); pub static LOCK_TRACE: RefCell> = RefCell::new(Vec::new()); - pub static ALLOWED_UNLOCKS: RefCell> = RefCell::new(BTreeMap::new()); - pub static ALLOWED_REQUEST_UNLOCKS: RefCell> = RefCell::new(BTreeMap::new()); + pub static ALLOWED_UNLOCKS: RefCell> = RefCell::new(BTreeMap::new()); + pub static ALLOWED_REQUEST_UNLOCKS: RefCell> = RefCell::new(BTreeMap::new()); } pub fn take_lock_trace() -> Vec { LOCK_TRACE.with(|l| l.replace(Vec::new())) } pub fn allow_unlock( - unlocker: impl Into, - asset: impl Into, - owner: impl Into, + unlocker: impl Into, + asset: impl Into, + owner: impl Into, ) { ALLOWED_UNLOCKS.with(|l| { l.borrow_mut() @@ -557,9 +557,9 @@ pub fn allow_unlock( }); } pub fn disallow_unlock( - unlocker: impl Into, - asset: impl Into, - owner: impl Into, + unlocker: impl Into, + asset: impl Into, + owner: impl Into, ) { ALLOWED_UNLOCKS.with(|l| { l.borrow_mut() @@ -568,17 +568,17 @@ pub fn disallow_unlock( .saturating_take(asset.into().into()) }); } -pub fn unlock_allowed(unlocker: &MultiLocation, asset: &MultiAsset, owner: &MultiLocation) -> bool { +pub fn unlock_allowed(unlocker: &Location, asset: &Asset, owner: &Location) -> bool { ALLOWED_UNLOCKS.with(|l| { l.borrow_mut() - .get(&(*owner, *unlocker)) + .get(&(owner.clone(), unlocker.clone())) .map_or(false, |x| x.contains_asset(asset)) }) } pub fn allow_request_unlock( - locker: impl Into, - asset: impl Into, - owner: impl Into, + locker: impl Into, + asset: impl Into, + owner: impl Into, ) { ALLOWED_REQUEST_UNLOCKS.with(|l| { l.borrow_mut() @@ -588,9 +588,9 @@ pub fn allow_request_unlock( }); } pub fn disallow_request_unlock( - locker: impl Into, - asset: impl Into, - owner: impl Into, + locker: impl Into, + asset: impl Into, + owner: impl Into, ) { ALLOWED_REQUEST_UNLOCKS.with(|l| { l.borrow_mut() @@ -599,14 +599,10 @@ pub fn disallow_request_unlock( .saturating_take(asset.into().into()) }); } -pub fn request_unlock_allowed( - locker: &MultiLocation, - asset: &MultiAsset, - owner: &MultiLocation, -) -> bool { +pub fn request_unlock_allowed(locker: &Location, asset: &Asset, owner: &Location) -> bool { ALLOWED_REQUEST_UNLOCKS.with(|l| { l.borrow_mut() - .get(&(*owner, *locker)) + .get(&(owner.clone(), locker.clone())) .map_or(false, |x| x.contains_asset(asset)) }) } @@ -616,11 +612,11 @@ impl Enact for TestTicket { fn enact(self) -> Result<(), LockError> { match &self.0 { LockTraceItem::Lock { unlocker, asset, owner } => - allow_unlock(*unlocker, asset.clone(), *owner), + allow_unlock(unlocker.clone(), asset.clone(), owner.clone()), LockTraceItem::Unlock { unlocker, asset, owner } => - disallow_unlock(*unlocker, asset.clone(), *owner), + disallow_unlock(unlocker.clone(), asset.clone(), owner.clone()), LockTraceItem::Reduce { locker, asset, owner } => - disallow_request_unlock(*locker, asset.clone(), *owner), + disallow_request_unlock(locker.clone(), asset.clone(), owner.clone()), _ => {}, } LOCK_TRACE.with(move |l| l.borrow_mut().push(self.0)); @@ -635,38 +631,34 @@ impl AssetLock for TestAssetLock { type ReduceTicket = TestTicket; fn prepare_lock( - unlocker: MultiLocation, - asset: MultiAsset, - owner: MultiLocation, + unlocker: Location, + asset: Asset, + owner: Location, ) -> Result { - ensure!(assets(owner).contains_asset(&asset), LockError::AssetNotOwned); + ensure!(assets(owner.clone()).contains_asset(&asset), LockError::AssetNotOwned); Ok(TestTicket(LockTraceItem::Lock { unlocker, asset, owner })) } fn prepare_unlock( - unlocker: MultiLocation, - asset: MultiAsset, - owner: MultiLocation, + unlocker: Location, + asset: Asset, + owner: Location, ) -> Result { ensure!(unlock_allowed(&unlocker, &asset, &owner), LockError::NotLocked); Ok(TestTicket(LockTraceItem::Unlock { unlocker, asset, owner })) } - fn note_unlockable( - locker: MultiLocation, - asset: MultiAsset, - owner: MultiLocation, - ) -> Result<(), LockError> { - allow_request_unlock(locker, asset.clone(), owner); + fn note_unlockable(locker: Location, asset: Asset, owner: Location) -> Result<(), LockError> { + allow_request_unlock(locker.clone(), asset.clone(), owner.clone()); let item = LockTraceItem::Note { locker, asset, owner }; LOCK_TRACE.with(move |l| l.borrow_mut().push(item)); Ok(()) } fn prepare_reduce_unlockable( - locker: MultiLocation, - asset: MultiAsset, - owner: MultiLocation, + locker: Location, + asset: Asset, + owner: Location, ) -> Result { ensure!(request_unlock_allowed(&locker, &asset, &owner), LockError::NotLocked); Ok(TestTicket(LockTraceItem::Reduce { locker, asset, owner })) @@ -674,26 +666,26 @@ impl AssetLock for TestAssetLock { } thread_local! { - pub static EXCHANGE_ASSETS: RefCell = RefCell::new(Assets::new()); + pub static EXCHANGE_ASSETS: RefCell = RefCell::new(AssetsInHolding::new()); } -pub fn set_exchange_assets(assets: impl Into) { +pub fn set_exchange_assets(assets: impl Into) { EXCHANGE_ASSETS.with(|a| a.replace(assets.into().into())); } -pub fn exchange_assets() -> MultiAssets { +pub fn exchange_assets() -> Assets { EXCHANGE_ASSETS.with(|a| a.borrow().clone().into()) } pub struct TestAssetExchange; impl AssetExchange for TestAssetExchange { fn exchange_asset( - _origin: Option<&MultiLocation>, - give: Assets, - want: &MultiAssets, + _origin: Option<&Location>, + give: AssetsInHolding, + want: &Assets, maximal: bool, - ) -> Result { + ) -> Result { let mut have = EXCHANGE_ASSETS.with(|l| l.borrow().clone()); ensure!(have.contains_assets(want), give); let get = if maximal { - std::mem::replace(&mut have, Assets::new()) + std::mem::replace(&mut have, AssetsInHolding::new()) } else { have.saturating_take(want.clone().into()) }; @@ -703,16 +695,25 @@ impl AssetExchange for TestAssetExchange { } } -match_types! { - pub type SiblingPrefix: impl Contains = { - MultiLocation { parents: 1, interior: X1(Parachain(_)) } - }; - pub type ChildPrefix: impl Contains = { - MultiLocation { parents: 0, interior: X1(Parachain(_)) } - }; - pub type ParentPrefix: impl Contains = { - MultiLocation { parents: 1, interior: Here } - }; +pub struct SiblingPrefix; +impl Contains for SiblingPrefix { + fn contains(loc: &Location) -> bool { + matches!(loc.unpack(), (1, [Parachain(_)])) + } +} + +pub struct ChildPrefix; +impl Contains for ChildPrefix { + fn contains(loc: &Location) -> bool { + matches!(loc.unpack(), (0, [Parachain(_)])) + } +} + +pub struct ParentPrefix; +impl Contains for ParentPrefix { + fn contains(loc: &Location) -> bool { + matches!(loc.unpack(), (1, [])) + } } pub struct TestConfig; @@ -743,7 +744,7 @@ impl Config for TestConfig { type Aliasers = AliasForeignAccountId32; } -pub fn fungible_multi_asset(location: MultiLocation, amount: u128) -> MultiAsset { +pub fn fungible_multi_asset(location: Location, amount: u128) -> Asset { (AssetId::from(location), Fungibility::Fungible(amount)).into() } diff --git a/polkadot/xcm/xcm-builder/src/tests/origins.rs b/polkadot/xcm/xcm-builder/src/tests/origins.rs index d3d6278eff8..c717d1e2af8 100644 --- a/polkadot/xcm/xcm-builder/src/tests/origins.rs +++ b/polkadot/xcm/xcm-builder/src/tests/origins.rs @@ -18,7 +18,7 @@ use super::*; #[test] fn universal_origin_should_work() { - AllowUnpaidFrom::set(vec![X1(Parachain(1)).into(), X1(Parachain(2)).into()]); + AllowUnpaidFrom::set(vec![[Parachain(1)].into(), [Parachain(2)].into()]); clear_universal_aliases(); // Parachain 1 may represent Kusama to us add_universal_alias(Parachain(1), Kusama); @@ -29,48 +29,57 @@ fn universal_origin_should_work() { UniversalOrigin(GlobalConsensus(Kusama)), TransferAsset { assets: (Parent, 100u128).into(), beneficiary: Here.into() }, ]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( Parachain(2), message, - hash, + &mut hash, Weight::from_parts(50, 50), + Weight::zero(), + ); + assert_eq!( + r, + Outcome::Incomplete { used: Weight::from_parts(10, 10), error: XcmError::InvalidLocation } ); - assert_eq!(r, Outcome::Incomplete(Weight::from_parts(10, 10), XcmError::InvalidLocation)); let message = Xcm(vec![ UniversalOrigin(GlobalConsensus(Kusama)), TransferAsset { assets: (Parent, 100u128).into(), beneficiary: Here.into() }, ]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( Parachain(1), message, - hash, + &mut hash, Weight::from_parts(50, 50), + Weight::zero(), + ); + assert_eq!( + r, + Outcome::Incomplete { used: Weight::from_parts(20, 20), error: XcmError::NotWithdrawable } ); - assert_eq!(r, Outcome::Incomplete(Weight::from_parts(20, 20), XcmError::NotWithdrawable)); add_asset((Ancestor(2), GlobalConsensus(Kusama)), (Parent, 100)); let message = Xcm(vec![ UniversalOrigin(GlobalConsensus(Kusama)), TransferAsset { assets: (Parent, 100u128).into(), beneficiary: Here.into() }, ]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( Parachain(1), message, - hash, + &mut hash, Weight::from_parts(50, 50), + Weight::zero(), ); - assert_eq!(r, Outcome::Complete(Weight::from_parts(20, 20))); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(20, 20) }); assert_eq!(asset_list((Ancestor(2), GlobalConsensus(Kusama))), vec![]); } #[test] fn export_message_should_work() { // Bridge chain (assumed to be Relay) lets Parachain #1 have message execution for free. - AllowUnpaidFrom::set(vec![X1(Parachain(1)).into()]); + AllowUnpaidFrom::set(vec![[Parachain(1)].into()]); // Local parachain #1 issues a transfer asset on Polkadot Relay-chain, transfering 100 Planck to // Polkadot parachain #2. let expected_message = Xcm(vec![TransferAsset { @@ -83,14 +92,15 @@ fn export_message_should_work() { destination: Here, xcm: expected_message.clone(), }]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( Parachain(1), message, - hash, + &mut hash, Weight::from_parts(50, 50), + Weight::zero(), ); - assert_eq!(r, Outcome::Complete(Weight::from_parts(10, 10))); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(10, 10) }); let uni_src = (ByGenesis([0; 32]), Parachain(42), Parachain(1)).into(); assert_eq!( exported_xcm(), @@ -101,40 +111,46 @@ fn export_message_should_work() { #[test] fn unpaid_execution_should_work() { // Bridge chain (assumed to be Relay) lets Parachain #1 have message execution for free. - AllowUnpaidFrom::set(vec![X1(Parachain(1)).into()]); + AllowUnpaidFrom::set(vec![[Parachain(1)].into()]); // Bridge chain (assumed to be Relay) lets Parachain #2 have message execution for free if it // asks. - AllowExplicitUnpaidFrom::set(vec![X1(Parachain(2)).into()]); + AllowExplicitUnpaidFrom::set(vec![[Parachain(2)].into()]); // Asking for unpaid execution of up to 9 weight on the assumption it is origin of #2. let message = Xcm(vec![UnpaidExecution { weight_limit: Limited(Weight::from_parts(9, 9)), check_origin: Some(Parachain(2).into()), }]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( Parachain(1), message.clone(), - hash, + &mut hash, Weight::from_parts(50, 50), + Weight::zero(), + ); + assert_eq!( + r, + Outcome::Incomplete { used: Weight::from_parts(10, 10), error: XcmError::BadOrigin } ); - assert_eq!(r, Outcome::Incomplete(Weight::from_parts(10, 10), XcmError::BadOrigin)); - let r = XcmExecutor::::execute_xcm( + let r = XcmExecutor::::prepare_and_execute( Parachain(2), message.clone(), - hash, + &mut hash, Weight::from_parts(50, 50), + Weight::zero(), ); - assert_eq!(r, Outcome::Error(XcmError::Barrier)); + assert_eq!(r, Outcome::Error { error: XcmError::Barrier }); let message = Xcm(vec![UnpaidExecution { weight_limit: Limited(Weight::from_parts(10, 10)), check_origin: Some(Parachain(2).into()), }]); - let r = XcmExecutor::::execute_xcm( + let r = XcmExecutor::::prepare_and_execute( Parachain(2), message.clone(), - hash, + &mut hash, Weight::from_parts(50, 50), + Weight::zero(), ); - assert_eq!(r, Outcome::Complete(Weight::from_parts(10, 10))); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(10, 10) }); } diff --git a/polkadot/xcm/xcm-builder/src/tests/pay/mock.rs b/polkadot/xcm/xcm-builder/src/tests/pay/mock.rs index 78b9284c689..01ff8c29f3d 100644 --- a/polkadot/xcm/xcm-builder/src/tests/pay/mock.rs +++ b/polkadot/xcm/xcm-builder/src/tests/pay/mock.rs @@ -115,14 +115,14 @@ impl pallet_assets::Config for Test { } parameter_types! { - pub const RelayLocation: MultiLocation = Here.into_location(); + pub const RelayLocation: Location = Here.into_location(); pub const AnyNetwork: Option = None; - pub UniversalLocation: InteriorMultiLocation = (ByGenesis([0; 32]), Parachain(42)).into(); + pub UniversalLocation: InteriorLocation = (ByGenesis([0; 32]), Parachain(42)).into(); pub UnitWeightCost: u64 = 1_000; pub static AdvertisedXcmVersion: u32 = 3; pub const BaseXcmWeight: Weight = Weight::from_parts(1_000, 1_000); - pub CurrencyPerSecondPerByte: (AssetId, u128, u128) = (Concrete(RelayLocation::get()), 1, 1); - pub TrustedAssets: (MultiAssetFilter, MultiLocation) = (All.into(), Here.into()); + pub CurrencyPerSecondPerByte: (AssetId, u128, u128) = (AssetId(RelayLocation::get()), 1, 1); + pub TrustedAssets: (AssetFilter, Location) = (All.into(), Here.into()); pub const MaxInstructions: u32 = 100; pub const MaxAssetsIntoHolding: u32 = 64; pub CheckingAccount: AccountId = XcmPallet::check_account(); @@ -130,28 +130,25 @@ parameter_types! { type AssetIdForAssets = u128; -pub struct FromMultiLocationToAsset( - core::marker::PhantomData<(MultiLocation, AssetId)>, -); -impl MaybeEquivalence - for FromMultiLocationToAsset +pub struct FromLocationToAsset(core::marker::PhantomData<(Location, AssetId)>); +impl MaybeEquivalence + for FromLocationToAsset { - fn convert(value: &MultiLocation) -> Option { - match value { - MultiLocation { parents: 0, interior: Here } => Some(0 as AssetIdForAssets), - MultiLocation { parents: 1, interior: Here } => Some(1 as AssetIdForAssets), - MultiLocation { parents: 0, interior: X2(PalletInstance(1), GeneralIndex(index)) } - if ![0, 1].contains(index) => + fn convert(value: &Location) -> Option { + match value.unpack() { + (0, []) => Some(0 as AssetIdForAssets), + (1, []) => Some(1 as AssetIdForAssets), + (0, [PalletInstance(1), GeneralIndex(index)]) if ![0, 1].contains(index) => Some(*index as AssetIdForAssets), _ => None, } } - fn convert_back(value: &AssetIdForAssets) -> Option { + fn convert_back(value: &AssetIdForAssets) -> Option { match value { - 0u128 => Some(MultiLocation { parents: 1, interior: Here }), + 0u128 => Some(Location { parents: 1, interior: Here }), para_id @ 1..=1000 => - Some(MultiLocation { parents: 1, interior: X1(Parachain(*para_id as u32)) }), + Some(Location { parents: 1, interior: [Parachain(*para_id as u32)].into() }), _ => None, } } @@ -163,7 +160,7 @@ pub type LocalAssetsTransactor = FungiblesAdapter< ConvertedConcreteId< AssetIdForAssets, Balance, - FromMultiLocationToAsset, + FromLocationToAsset, JustTry, >, SovereignAccountOf, @@ -187,10 +184,10 @@ impl WeightTrader for DummyWeightTrader { fn buy_weight( &mut self, _weight: Weight, - _payment: xcm_executor::Assets, + _payment: xcm_executor::AssetsInHolding, _context: &XcmContext, - ) -> Result { - Ok(xcm_executor::Assets::default()) + ) -> Result { + Ok(xcm_executor::AssetsInHolding::default()) } } @@ -228,13 +225,10 @@ parameter_types! { pub struct TreasuryToAccount; impl ConvertLocation for TreasuryToAccount { - fn convert_location(location: &MultiLocation) -> Option { - match location { - MultiLocation { - parents: 1, - interior: - X2(Parachain(42), Plurality { id: BodyId::Treasury, part: BodyPart::Voice }), - } => Some(TreasuryAccountId::get()), // Hardcoded test treasury account id + fn convert_location(location: &Location) -> Option { + match location.unpack() { + (1, [Parachain(42), Plurality { id: BodyId::Treasury, part: BodyPart::Voice }]) => + Some(TreasuryAccountId::get()), // Hardcoded test treasury account id _ => None, } } @@ -277,7 +271,7 @@ pub const INITIAL_BALANCE: Balance = 100 * UNITS; pub const MINIMUM_BALANCE: Balance = 1 * UNITS; pub fn sibling_chain_account_id(para_id: u32, account: [u8; 32]) -> AccountId { - let location: MultiLocation = + let location: Location = (Parent, Parachain(para_id), Junction::AccountId32 { id: account, network: None }).into(); SovereignAccountOf::convert_location(&location).unwrap() } diff --git a/polkadot/xcm/xcm-builder/src/tests/pay/pay.rs b/polkadot/xcm/xcm-builder/src/tests/pay/pay.rs index 178b9384273..062faee2abd 100644 --- a/polkadot/xcm/xcm-builder/src/tests/pay/pay.rs +++ b/polkadot/xcm/xcm-builder/src/tests/pay/pay.rs @@ -22,9 +22,9 @@ use frame_support::{assert_ok, traits::tokens::Pay}; /// Type representing both a location and an asset that is held at that location. /// The id of the held asset is relative to the location where it is being held. -#[derive(Encode, Decode, Clone, Copy, PartialEq, Eq)] +#[derive(Encode, Decode, Clone, PartialEq, Eq)] pub struct AssetKind { - destination: MultiLocation, + destination: Location, asset_id: AssetId, } @@ -37,8 +37,8 @@ impl sp_runtime::traits::TryConvert for LocatableAs parameter_types! { pub SenderAccount: AccountId = AccountId::new([3u8; 32]); - pub InteriorAccount: InteriorMultiLocation = AccountId32 { id: SenderAccount::get().into(), network: None }.into(); - pub InteriorBody: InteriorMultiLocation = Plurality { id: BodyId::Treasury, part: BodyPart::Voice }.into(); + pub InteriorAccount: InteriorLocation = AccountId32 { id: SenderAccount::get().into(), network: None }.into(); + pub InteriorBody: InteriorLocation = Plurality { id: BodyId::Treasury, part: BodyPart::Voice }.into(); pub Timeout: BlockNumber = 5; // 5 blocks } @@ -91,13 +91,19 @@ fn pay_over_xcm_works() { vec![((Parent, Parachain(2)).into(), expected_message, expected_hash)] ); - let (_, message, hash) = sent_xcm()[0].clone(); + let (_, message, mut hash) = sent_xcm()[0].clone(); let message = Xcm::<::RuntimeCall>::from(message.clone()); // Execute message in parachain 2 with parachain 42's origin let origin = (Parent, Parachain(42)); - XcmExecutor::::execute_xcm(origin, message, hash, Weight::MAX); + XcmExecutor::::prepare_and_execute( + origin, + message, + &mut hash, + Weight::MAX, + Weight::zero(), + ); assert_eq!(mock::Assets::balance(0, &recipient), amount); }); } @@ -152,13 +158,19 @@ fn pay_over_xcm_governance_body() { vec![((Parent, Parachain(2)).into(), expected_message, expected_hash)] ); - let (_, message, hash) = sent_xcm()[0].clone(); + let (_, message, mut hash) = sent_xcm()[0].clone(); let message = Xcm::<::RuntimeCall>::from(message.clone()); // Execute message in parachain 2 with parachain 42's origin let origin = (Parent, Parachain(42)); - XcmExecutor::::execute_xcm(origin, message, hash, Weight::MAX); + XcmExecutor::::prepare_and_execute( + origin, + message, + &mut hash, + Weight::MAX, + Weight::zero(), + ); assert_eq!(mock::Assets::balance(relay_asset_index, &recipient), amount); }); } diff --git a/polkadot/xcm/xcm-builder/src/tests/pay/salary.rs b/polkadot/xcm/xcm-builder/src/tests/pay/salary.rs index e490fe326b3..6a2945c6a9b 100644 --- a/polkadot/xcm/xcm-builder/src/tests/pay/salary.rs +++ b/polkadot/xcm/xcm-builder/src/tests/pay/salary.rs @@ -25,9 +25,9 @@ use frame_support::{ use sp_runtime::{traits::ConvertToValue, DispatchResult}; parameter_types! { - pub Interior: InteriorMultiLocation = Plurality { id: BodyId::Treasury, part: BodyPart::Voice }.into(); + pub Interior: InteriorLocation = Plurality { id: BodyId::Treasury, part: BodyPart::Voice }.into(); pub Timeout: BlockNumber = 5; - pub AssetHub: MultiLocation = (Parent, Parachain(1)).into(); + pub AssetHub: Location = (Parent, Parachain(1)).into(); pub AssetIdGeneralIndex: u128 = 100; pub AssetHubAssetId: AssetId = (PalletInstance(1), GeneralIndex(AssetIdGeneralIndex::get())).into(); pub LocatableAsset: LocatableAssetId = LocatableAssetId { asset_id: AssetHubAssetId::get(), location: AssetHub::get() }; @@ -140,7 +140,7 @@ fn salary_pay_over_xcm_works() { assert_ok!(Salary::payout(RuntimeOrigin::signed(recipient.clone()))); // Get message from mock transport layer - let (_, message, hash) = sent_xcm()[0].clone(); + let (_, message, mut hash) = sent_xcm()[0].clone(); // Change type from `Xcm<()>` to `Xcm` to be able to execute later let message = Xcm::<::RuntimeCall>::from(message.clone()); @@ -164,7 +164,13 @@ fn salary_pay_over_xcm_works() { assert_eq!(message, expected_message); // Execute message as the asset hub - XcmExecutor::::execute_xcm((Parent, Parachain(42)), message, hash, Weight::MAX); + XcmExecutor::::prepare_and_execute( + (Parent, Parachain(42)), + message, + &mut hash, + Weight::MAX, + Weight::zero(), + ); // Recipient receives the payment assert_eq!( diff --git a/polkadot/xcm/xcm-builder/src/tests/querying.rs b/polkadot/xcm/xcm-builder/src/tests/querying.rs index 8fbb55eb254..3b47073d53d 100644 --- a/polkadot/xcm/xcm-builder/src/tests/querying.rs +++ b/polkadot/xcm/xcm-builder/src/tests/querying.rs @@ -18,7 +18,7 @@ use super::*; #[test] fn pallet_query_should_work() { - AllowUnpaidFrom::set(vec![X1(Parachain(1)).into()]); + AllowUnpaidFrom::set(vec![[Parachain(1)].into()]); // They want to transfer 100 of our native asset from sovereign account of parachain #1 into #2 // and let them know to hand it to account #3. let message = Xcm(vec![QueryPallet { @@ -29,14 +29,15 @@ fn pallet_query_should_work() { max_weight: Weight::from_parts(50, 50), }, }]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( Parachain(1), message, - hash, + &mut hash, Weight::from_parts(50, 50), + Weight::zero(), ); - assert_eq!(r, Outcome::Complete(Weight::from_parts(10, 10))); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(10, 10) }); let expected_msg = Xcm::<()>(vec![QueryResponse { query_id: 1, @@ -50,7 +51,7 @@ fn pallet_query_should_work() { #[test] fn pallet_query_with_results_should_work() { - AllowUnpaidFrom::set(vec![X1(Parachain(1)).into()]); + AllowUnpaidFrom::set(vec![[Parachain(1)].into()]); // They want to transfer 100 of our native asset from sovereign account of parachain #1 into #2 // and let them know to hand it to account #3. let message = Xcm(vec![QueryPallet { @@ -61,14 +62,15 @@ fn pallet_query_with_results_should_work() { max_weight: Weight::from_parts(50, 50), }, }]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( Parachain(1), message, - hash, + &mut hash, Weight::from_parts(50, 50), + Weight::zero(), ); - assert_eq!(r, Outcome::Complete(Weight::from_parts(10, 10))); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(10, 10) }); let expected_msg = Xcm::<()>(vec![QueryResponse { query_id: 1, @@ -106,15 +108,27 @@ fn prepaid_result_of_query_should_get_free_execution() { max_weight: Weight::from_parts(10, 10), querier: Some(Here.into()), }]); - let hash = fake_message_hash(&message); + let mut hash = fake_message_hash(&message); let weight_limit = Weight::from_parts(10, 10); // First time the response gets through since we're expecting it... - let r = XcmExecutor::::execute_xcm(Parent, message.clone(), hash, weight_limit); - assert_eq!(r, Outcome::Complete(Weight::from_parts(10, 10))); + let r = XcmExecutor::::prepare_and_execute( + Parent, + message.clone(), + &mut hash, + weight_limit, + Weight::zero(), + ); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(10, 10) }); assert_eq!(response(query_id).unwrap(), the_response); // Second time it doesn't, since we're not. - let r = XcmExecutor::::execute_xcm(Parent, message.clone(), hash, weight_limit); - assert_eq!(r, Outcome::Error(XcmError::Barrier)); + let r = XcmExecutor::::prepare_and_execute( + Parent, + message.clone(), + &mut hash, + weight_limit, + Weight::zero(), + ); + assert_eq!(r, Outcome::Error { error: XcmError::Barrier }); } diff --git a/polkadot/xcm/xcm-builder/src/tests/transacting.rs b/polkadot/xcm/xcm-builder/src/tests/transacting.rs index 743ad7039f7..a85c8b9986c 100644 --- a/polkadot/xcm/xcm-builder/src/tests/transacting.rs +++ b/polkadot/xcm/xcm-builder/src/tests/transacting.rs @@ -25,10 +25,16 @@ fn transacting_should_work() { require_weight_at_most: Weight::from_parts(50, 50), call: TestCall::Any(Weight::from_parts(50, 50), None).encode().into(), }]); - let hash = fake_message_hash(&message); + let mut hash = fake_message_hash(&message); let weight_limit = Weight::from_parts(60, 60); - let r = XcmExecutor::::execute_xcm(Parent, message, hash, weight_limit); - assert_eq!(r, Outcome::Complete(Weight::from_parts(60, 60))); + let r = XcmExecutor::::prepare_and_execute( + Parent, + message, + &mut hash, + weight_limit, + Weight::zero(), + ); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(60, 60) }); } #[test] @@ -40,10 +46,19 @@ fn transacting_should_respect_max_weight_requirement() { require_weight_at_most: Weight::from_parts(40, 40), call: TestCall::Any(Weight::from_parts(50, 50), None).encode().into(), }]); - let hash = fake_message_hash(&message); + let mut hash = fake_message_hash(&message); let weight_limit = Weight::from_parts(60, 60); - let r = XcmExecutor::::execute_xcm(Parent, message, hash, weight_limit); - assert_eq!(r, Outcome::Incomplete(Weight::from_parts(50, 50), XcmError::MaxWeightInvalid)); + let r = XcmExecutor::::prepare_and_execute( + Parent, + message, + &mut hash, + weight_limit, + Weight::zero(), + ); + assert_eq!( + r, + Outcome::Incomplete { used: Weight::from_parts(50, 50), error: XcmError::MaxWeightInvalid } + ); } #[test] @@ -57,20 +72,26 @@ fn transacting_should_refund_weight() { .encode() .into(), }]); - let hash = fake_message_hash(&message); + let mut hash = fake_message_hash(&message); let weight_limit = Weight::from_parts(60, 60); - let r = XcmExecutor::::execute_xcm(Parent, message, hash, weight_limit); - assert_eq!(r, Outcome::Complete(Weight::from_parts(40, 40))); + let r = XcmExecutor::::prepare_and_execute( + Parent, + message, + &mut hash, + weight_limit, + Weight::zero(), + ); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(40, 40) }); } #[test] fn paid_transacting_should_refund_payment_for_unused_weight() { - let one: MultiLocation = AccountIndex64 { index: 1, network: None }.into(); - AllowPaidFrom::set(vec![one]); + let one: Location = AccountIndex64 { index: 1, network: None }.into(); + AllowPaidFrom::set(vec![one.clone()]); add_asset(AccountIndex64 { index: 1, network: None }, (Parent, 200u128)); WeightPrice::set((Parent.into(), 1_000_000_000_000, 1024 * 1024)); - let origin = one; + let origin = one.clone(); let fees = (Parent, 200u128).into(); let message = Xcm::(vec![ WithdrawAsset((Parent, 200u128).into()), // enough for 200 units of weight. @@ -86,10 +107,16 @@ fn paid_transacting_should_refund_payment_for_unused_weight() { RefundSurplus, DepositAsset { assets: AllCounted(1).into(), beneficiary: one }, ]); - let hash = fake_message_hash(&message); + let mut hash = fake_message_hash(&message); let weight_limit = Weight::from_parts(100, 100); - let r = XcmExecutor::::execute_xcm(origin, message, hash, weight_limit); - assert_eq!(r, Outcome::Complete(Weight::from_parts(60, 60))); + let r = XcmExecutor::::prepare_and_execute( + origin, + message, + &mut hash, + weight_limit, + Weight::zero(), + ); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(60, 60) }); assert_eq!( asset_list(AccountIndex64 { index: 1, network: None }), vec![(Parent, 80u128).into()] @@ -112,10 +139,16 @@ fn report_successful_transact_status_should_work() { max_weight: Weight::from_parts(5000, 5000), }), ]); - let hash = fake_message_hash(&message); + let mut hash = fake_message_hash(&message); let weight_limit = Weight::from_parts(70, 70); - let r = XcmExecutor::::execute_xcm(Parent, message, hash, weight_limit); - assert_eq!(r, Outcome::Complete(Weight::from_parts(70, 70))); + let r = XcmExecutor::::prepare_and_execute( + Parent, + message, + &mut hash, + weight_limit, + Weight::zero(), + ); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(70, 70) }); let expected_msg = Xcm(vec![QueryResponse { response: Response::DispatchResult(MaybeErrorCode::Success), query_id: 42, @@ -142,10 +175,16 @@ fn report_failed_transact_status_should_work() { max_weight: Weight::from_parts(5000, 5000), }), ]); - let hash = fake_message_hash(&message); + let mut hash = fake_message_hash(&message); let weight_limit = Weight::from_parts(70, 70); - let r = XcmExecutor::::execute_xcm(Parent, message, hash, weight_limit); - assert_eq!(r, Outcome::Complete(Weight::from_parts(70, 70))); + let r = XcmExecutor::::prepare_and_execute( + Parent, + message, + &mut hash, + weight_limit, + Weight::zero(), + ); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(70, 70) }); let expected_msg = Xcm(vec![QueryResponse { response: Response::DispatchResult(vec![2].into()), query_id: 42, @@ -168,10 +207,16 @@ fn expect_successful_transact_status_should_work() { }, ExpectTransactStatus(MaybeErrorCode::Success), ]); - let hash = fake_message_hash(&message); + let mut hash = fake_message_hash(&message); let weight_limit = Weight::from_parts(70, 70); - let r = XcmExecutor::::execute_xcm(Parent, message, hash, weight_limit); - assert_eq!(r, Outcome::Complete(Weight::from_parts(70, 70))); + let r = XcmExecutor::::prepare_and_execute( + Parent, + message, + &mut hash, + weight_limit, + Weight::zero(), + ); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(70, 70) }); let message = Xcm::(vec![ Transact { @@ -181,10 +226,19 @@ fn expect_successful_transact_status_should_work() { }, ExpectTransactStatus(MaybeErrorCode::Success), ]); - let hash = fake_message_hash(&message); + let mut hash = fake_message_hash(&message); let weight_limit = Weight::from_parts(70, 70); - let r = XcmExecutor::::execute_xcm(Parent, message, hash, weight_limit); - assert_eq!(r, Outcome::Incomplete(Weight::from_parts(70, 70), XcmError::ExpectationFalse)); + let r = XcmExecutor::::prepare_and_execute( + Parent, + message, + &mut hash, + weight_limit, + Weight::zero(), + ); + assert_eq!( + r, + Outcome::Incomplete { used: Weight::from_parts(70, 70), error: XcmError::ExpectationFalse } + ); } #[test] @@ -199,10 +253,16 @@ fn expect_failed_transact_status_should_work() { }, ExpectTransactStatus(vec![2].into()), ]); - let hash = fake_message_hash(&message); + let mut hash = fake_message_hash(&message); let weight_limit = Weight::from_parts(70, 70); - let r = XcmExecutor::::execute_xcm(Parent, message, hash, weight_limit); - assert_eq!(r, Outcome::Complete(Weight::from_parts(70, 70))); + let r = XcmExecutor::::prepare_and_execute( + Parent, + message, + &mut hash, + weight_limit, + Weight::zero(), + ); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(70, 70) }); let message = Xcm::(vec![ Transact { @@ -212,10 +272,19 @@ fn expect_failed_transact_status_should_work() { }, ExpectTransactStatus(vec![2].into()), ]); - let hash = fake_message_hash(&message); + let mut hash = fake_message_hash(&message); let weight_limit = Weight::from_parts(70, 70); - let r = XcmExecutor::::execute_xcm(Parent, message, hash, weight_limit); - assert_eq!(r, Outcome::Incomplete(Weight::from_parts(70, 70), XcmError::ExpectationFalse)); + let r = XcmExecutor::::prepare_and_execute( + Parent, + message, + &mut hash, + weight_limit, + Weight::zero(), + ); + assert_eq!( + r, + Outcome::Incomplete { used: Weight::from_parts(70, 70), error: XcmError::ExpectationFalse } + ); } #[test] @@ -235,10 +304,16 @@ fn clear_transact_status_should_work() { max_weight: Weight::from_parts(5000, 5000), }), ]); - let hash = fake_message_hash(&message); + let mut hash = fake_message_hash(&message); let weight_limit = Weight::from_parts(80, 80); - let r = XcmExecutor::::execute_xcm(Parent, message, hash, weight_limit); - assert_eq!(r, Outcome::Complete(Weight::from_parts(80, 80))); + let r = XcmExecutor::::prepare_and_execute( + Parent, + message, + &mut hash, + weight_limit, + Weight::zero(), + ); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(80, 80) }); let expected_msg = Xcm(vec![QueryResponse { response: Response::DispatchResult(MaybeErrorCode::Success), query_id: 42, diff --git a/polkadot/xcm/xcm-builder/src/tests/version_subscriptions.rs b/polkadot/xcm/xcm-builder/src/tests/version_subscriptions.rs index 44ab7d34c51..e29e3a54661 100644 --- a/polkadot/xcm/xcm-builder/src/tests/version_subscriptions.rs +++ b/polkadot/xcm/xcm-builder/src/tests/version_subscriptions.rs @@ -25,23 +25,41 @@ fn simple_version_subscriptions_should_work() { SetAppendix(Xcm(vec![])), SubscribeVersion { query_id: 42, max_response_weight: Weight::from_parts(5000, 5000) }, ]); - let hash = fake_message_hash(&message); + let mut hash = fake_message_hash(&message); let weight_limit = Weight::from_parts(20, 20); - let r = XcmExecutor::::execute_xcm(origin, message, hash, weight_limit); - assert_eq!(r, Outcome::Error(XcmError::Barrier)); + let r = XcmExecutor::::prepare_and_execute( + origin, + message, + &mut hash, + weight_limit, + Weight::zero(), + ); + assert_eq!(r, Outcome::Error { error: XcmError::Barrier }); let origin = Parachain(1000); let message = Xcm::(vec![SubscribeVersion { query_id: 42, max_response_weight: Weight::from_parts(5000, 5000), }]); - let hash = fake_message_hash(&message); + let mut hash = fake_message_hash(&message); let weight_limit = Weight::from_parts(10, 10); - let r = XcmExecutor::::execute_xcm(origin, message.clone(), hash, weight_limit); - assert_eq!(r, Outcome::Error(XcmError::Barrier)); + let r = XcmExecutor::::prepare_and_execute( + origin, + message.clone(), + &mut hash, + weight_limit, + Weight::zero(), + ); + assert_eq!(r, Outcome::Error { error: XcmError::Barrier }); - let r = XcmExecutor::::execute_xcm(Parent, message, hash, weight_limit); - assert_eq!(r, Outcome::Complete(Weight::from_parts(10, 10))); + let r = XcmExecutor::::prepare_and_execute( + Parent, + message, + &mut hash, + weight_limit, + Weight::zero(), + ); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(10, 10) }); assert_eq!( SubscriptionRequests::get(), @@ -53,33 +71,36 @@ fn simple_version_subscriptions_should_work() { fn version_subscription_instruction_should_work() { let origin = Parachain(1000); let message = Xcm::(vec![ - DescendOrigin(X1(AccountIndex64 { index: 1, network: None })), + DescendOrigin([AccountIndex64 { index: 1, network: None }].into()), SubscribeVersion { query_id: 42, max_response_weight: Weight::from_parts(5000, 5000) }, ]); - let hash = fake_message_hash(&message); + let mut hash = fake_message_hash(&message); let weight_limit = Weight::from_parts(20, 20); - let r = XcmExecutor::::execute_xcm_in_credit( + let r = XcmExecutor::::prepare_and_execute( origin, message, - hash, + &mut hash, weight_limit, weight_limit, ); - assert_eq!(r, Outcome::Incomplete(Weight::from_parts(20, 20), XcmError::BadOrigin)); + assert_eq!( + r, + Outcome::Incomplete { used: Weight::from_parts(20, 20), error: XcmError::BadOrigin } + ); let message = Xcm::(vec![ SetAppendix(Xcm(vec![])), SubscribeVersion { query_id: 42, max_response_weight: Weight::from_parts(5000, 5000) }, ]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm_in_credit( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( origin, message, - hash, + &mut hash, weight_limit, weight_limit, ); - assert_eq!(r, Outcome::Complete(Weight::from_parts(20, 20))); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(20, 20) }); assert_eq!( SubscriptionRequests::get(), @@ -93,20 +114,38 @@ fn simple_version_unsubscriptions_should_work() { let origin = Parachain(1000); let message = Xcm::(vec![SetAppendix(Xcm(vec![])), UnsubscribeVersion]); - let hash = fake_message_hash(&message); + let mut hash = fake_message_hash(&message); let weight_limit = Weight::from_parts(20, 20); - let r = XcmExecutor::::execute_xcm(origin, message, hash, weight_limit); - assert_eq!(r, Outcome::Error(XcmError::Barrier)); + let r = XcmExecutor::::prepare_and_execute( + origin, + message, + &mut hash, + weight_limit, + Weight::zero(), + ); + assert_eq!(r, Outcome::Error { error: XcmError::Barrier }); let origin = Parachain(1000); let message = Xcm::(vec![UnsubscribeVersion]); - let hash = fake_message_hash(&message); + let mut hash = fake_message_hash(&message); let weight_limit = Weight::from_parts(10, 10); - let r = XcmExecutor::::execute_xcm(origin, message.clone(), hash, weight_limit); - assert_eq!(r, Outcome::Error(XcmError::Barrier)); + let r = XcmExecutor::::prepare_and_execute( + origin, + message.clone(), + &mut hash, + weight_limit, + Weight::zero(), + ); + assert_eq!(r, Outcome::Error { error: XcmError::Barrier }); - let r = XcmExecutor::::execute_xcm(Parent, message, hash, weight_limit); - assert_eq!(r, Outcome::Complete(Weight::from_parts(10, 10))); + let r = XcmExecutor::::prepare_and_execute( + Parent, + message, + &mut hash, + weight_limit, + Weight::zero(), + ); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(10, 10) }); assert_eq!(SubscriptionRequests::get(), vec![(Parent.into(), None)]); assert_eq!(sent_xcm(), vec![]); @@ -118,31 +157,34 @@ fn version_unsubscription_instruction_should_work() { // Not allowed to do it when origin has been changed. let message = Xcm::(vec![ - DescendOrigin(X1(AccountIndex64 { index: 1, network: None })), + DescendOrigin([AccountIndex64 { index: 1, network: None }].into()), UnsubscribeVersion, ]); - let hash = fake_message_hash(&message); + let mut hash = fake_message_hash(&message); let weight_limit = Weight::from_parts(20, 20); - let r = XcmExecutor::::execute_xcm_in_credit( + let r = XcmExecutor::::prepare_and_execute( origin, message, - hash, + &mut hash, weight_limit, weight_limit, ); - assert_eq!(r, Outcome::Incomplete(Weight::from_parts(20, 20), XcmError::BadOrigin)); + assert_eq!( + r, + Outcome::Incomplete { used: Weight::from_parts(20, 20), error: XcmError::BadOrigin } + ); // Fine to do it when origin is untouched. let message = Xcm::(vec![SetAppendix(Xcm(vec![])), UnsubscribeVersion]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm_in_credit( + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( origin, message, - hash, + &mut hash, weight_limit, weight_limit, ); - assert_eq!(r, Outcome::Complete(Weight::from_parts(20, 20))); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(20, 20) }); assert_eq!(SubscriptionRequests::get(), vec![(Parachain(1000).into(), None)]); assert_eq!(sent_xcm(), vec![]); diff --git a/polkadot/xcm/xcm-builder/src/tests/weight.rs b/polkadot/xcm/xcm-builder/src/tests/weight.rs index a2fb265413f..637e30cce99 100644 --- a/polkadot/xcm/xcm-builder/src/tests/weight.rs +++ b/polkadot/xcm/xcm-builder/src/tests/weight.rs @@ -74,45 +74,78 @@ fn errors_should_return_unused_weight() { // First xfer results in an error on the last message only TransferAsset { assets: (Here, 1u128).into(), - beneficiary: X1(AccountIndex64 { index: 3, network: None }).into(), + beneficiary: [AccountIndex64 { index: 3, network: None }].into(), }, // Second xfer results in error third message and after TransferAsset { assets: (Here, 2u128).into(), - beneficiary: X1(AccountIndex64 { index: 3, network: None }).into(), + beneficiary: [AccountIndex64 { index: 3, network: None }].into(), }, // Third xfer results in error second message and after TransferAsset { assets: (Here, 4u128).into(), - beneficiary: X1(AccountIndex64 { index: 3, network: None }).into(), + beneficiary: [AccountIndex64 { index: 3, network: None }].into(), }, ]); // Weight limit of 70 is needed. let limit = ::Weigher::weight(&mut message).unwrap(); assert_eq!(limit, Weight::from_parts(30, 30)); - let hash = fake_message_hash(&message); + let mut hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm(Here, message.clone(), hash, limit); - assert_eq!(r, Outcome::Complete(Weight::from_parts(30, 30))); + let r = XcmExecutor::::prepare_and_execute( + Here, + message.clone(), + &mut hash, + limit, + Weight::zero(), + ); + assert_eq!(r, Outcome::Complete { used: Weight::from_parts(30, 30) }); assert_eq!(asset_list(AccountIndex64 { index: 3, network: None }), vec![(Here, 7u128).into()]); assert_eq!(asset_list(Here), vec![(Here, 4u128).into()]); assert_eq!(sent_xcm(), vec![]); - let r = XcmExecutor::::execute_xcm(Here, message.clone(), hash, limit); - assert_eq!(r, Outcome::Incomplete(Weight::from_parts(30, 30), XcmError::NotWithdrawable)); + let r = XcmExecutor::::prepare_and_execute( + Here, + message.clone(), + &mut hash, + limit, + Weight::zero(), + ); + assert_eq!( + r, + Outcome::Incomplete { used: Weight::from_parts(30, 30), error: XcmError::NotWithdrawable } + ); assert_eq!(asset_list(AccountIndex64 { index: 3, network: None }), vec![(Here, 10u128).into()]); assert_eq!(asset_list(Here), vec![(Here, 1u128).into()]); assert_eq!(sent_xcm(), vec![]); - let r = XcmExecutor::::execute_xcm(Here, message.clone(), hash, limit); - assert_eq!(r, Outcome::Incomplete(Weight::from_parts(20, 20), XcmError::NotWithdrawable)); + let r = XcmExecutor::::prepare_and_execute( + Here, + message.clone(), + &mut hash, + limit, + Weight::zero(), + ); + assert_eq!( + r, + Outcome::Incomplete { used: Weight::from_parts(20, 20), error: XcmError::NotWithdrawable } + ); assert_eq!(asset_list(AccountIndex64 { index: 3, network: None }), vec![(Here, 11u128).into()]); assert_eq!(asset_list(Here), vec![]); assert_eq!(sent_xcm(), vec![]); - let r = XcmExecutor::::execute_xcm(Here, message, hash, limit); - assert_eq!(r, Outcome::Incomplete(Weight::from_parts(10, 10), XcmError::NotWithdrawable)); + let r = XcmExecutor::::prepare_and_execute( + Here, + message, + &mut hash, + limit, + Weight::zero(), + ); + assert_eq!( + r, + Outcome::Incomplete { used: Weight::from_parts(10, 10), error: XcmError::NotWithdrawable } + ); assert_eq!(asset_list(AccountIndex64 { index: 3, network: None }), vec![(Here, 11u128).into()]); assert_eq!(asset_list(Here), vec![]); assert_eq!(sent_xcm(), vec![]); @@ -148,8 +181,8 @@ fn weight_bounds_should_respect_instructions_limit() { #[test] fn weight_trader_tuple_should_work() { - let para_1: MultiLocation = Parachain(1).into(); - let para_2: MultiLocation = Parachain(2).into(); + let para_1: Location = Parachain(1).into(); + let para_2: Location = Parachain(2).into(); parameter_types! { pub static HereWeightPrice: (AssetId, u128, u128) = @@ -186,7 +219,11 @@ fn weight_trader_tuple_should_work() { let mut traders = Traders::new(); // trader one failed; trader two buys weight assert_eq!( - traders.buy_weight(Weight::from_parts(5, 5), fungible_multi_asset(para_1, 10).into(), &ctx), + traders.buy_weight( + Weight::from_parts(5, 5), + fungible_multi_asset(para_1.clone(), 10).into(), + &ctx + ), Ok(vec![].into()), ); // trader two refunds diff --git a/polkadot/xcm/xcm-builder/src/universal_exports.rs b/polkadot/xcm/xcm-builder/src/universal_exports.rs index 4aa6a0ef7a5..1d084e022c9 100644 --- a/polkadot/xcm/xcm-builder/src/universal_exports.rs +++ b/polkadot/xcm/xcm-builder/src/universal_exports.rs @@ -28,18 +28,18 @@ use SendError::*; /// chain, itself situated at `universal_local` within the consensus universe. If /// `dest` is not a location in remote consensus, then an error is returned. pub fn ensure_is_remote( - universal_local: impl Into, - dest: impl Into, -) -> Result<(NetworkId, InteriorMultiLocation), MultiLocation> { + universal_local: impl Into, + dest: impl Into, +) -> Result<(NetworkId, InteriorLocation), Location> { let dest = dest.into(); let universal_local = universal_local.into(); let local_net = match universal_local.global_consensus() { Ok(x) => x, Err(_) => return Err(dest), }; - let universal_destination: InteriorMultiLocation = universal_local + let universal_destination: InteriorLocation = universal_local .into_location() - .appended_with(dest) + .appended_with(dest.clone()) .map_err(|x| x.1)? .try_into()?; let (remote_dest, remote_net) = match universal_destination.split_first() { @@ -59,18 +59,18 @@ pub fn ensure_is_remote( pub struct UnpaidLocalExporter( PhantomData<(Exporter, UniversalLocation)>, ); -impl> SendXcm +impl> SendXcm for UnpaidLocalExporter { type Ticket = Exporter::Ticket; fn validate( - dest: &mut Option, + dest: &mut Option, xcm: &mut Option>, ) -> SendResult { let d = dest.take().ok_or(MissingArgument)?; let universal_source = UniversalLocation::get(); - let devolved = match ensure_is_remote(universal_source, d) { + let devolved = match ensure_is_remote(universal_source.clone(), d) { Ok(x) => x, Err(d) => { *dest = Some(d); @@ -96,18 +96,18 @@ pub trait ExporterFor { /// the bridge chain as well as payment for the use of the `ExportMessage` instruction. fn exporter_for( network: &NetworkId, - remote_location: &InteriorMultiLocation, + remote_location: &InteriorLocation, message: &Xcm<()>, - ) -> Option<(MultiLocation, Option)>; + ) -> Option<(Location, Option)>; } #[impl_trait_for_tuples::impl_for_tuples(30)] impl ExporterFor for Tuple { fn exporter_for( network: &NetworkId, - remote_location: &InteriorMultiLocation, + remote_location: &InteriorLocation, message: &Xcm<()>, - ) -> Option<(MultiLocation, Option)> { + ) -> Option<(Location, Option)> { for_tuples!( #( if let Some(r) = Tuple::exporter_for(network, remote_location, message) { return Some(r); @@ -125,21 +125,21 @@ pub struct NetworkExportTableItem { /// If `Some`, the requested remote location must be equal to one of the items in the vector. /// These are locations in the remote network. /// If `None`, then the check is skipped. - pub remote_location_filter: Option>, + pub remote_location_filter: Option>, /// Locally-routable bridge with bridging capabilities to the `remote_network` and /// `remote_location`. See [`ExporterFor`] for more details. - pub bridge: MultiLocation, + pub bridge: Location, /// The local payment. /// See [`ExporterFor`] for more details. - pub payment: Option, + pub payment: Option, } impl NetworkExportTableItem { pub fn new( remote_network: NetworkId, - remote_location_filter: Option>, - bridge: MultiLocation, - payment: Option, + remote_location_filter: Option>, + bridge: Location, + payment: Option, ) -> Self { Self { remote_network, remote_location_filter, bridge, payment } } @@ -152,9 +152,9 @@ pub struct NetworkExportTable(sp_std::marker::PhantomData); impl>> ExporterFor for NetworkExportTable { fn exporter_for( network: &NetworkId, - remote_location: &InteriorMultiLocation, + remote_location: &InteriorLocation, _: &Xcm<()>, - ) -> Option<(MultiLocation, Option)> { + ) -> Option<(Location, Option)> { T::get() .into_iter() .find(|item| { @@ -194,16 +194,16 @@ pub fn forward_id_for(original_id: &XcmHash) -> XcmHash { pub struct UnpaidRemoteExporter( PhantomData<(Bridges, Router, UniversalLocation)>, ); -impl> SendXcm +impl> SendXcm for UnpaidRemoteExporter { type Ticket = Router::Ticket; fn validate( - dest: &mut Option, + dest: &mut Option, msg: &mut Option>, ) -> SendResult { - let d = dest.ok_or(MissingArgument)?; + let d = dest.clone().ok_or(MissingArgument)?; let devolved = ensure_is_remote(UniversalLocation::get(), d).map_err(|_| NotApplicable)?; let (remote_network, remote_location) = devolved; let xcm = msg.take().ok_or(MissingArgument)?; @@ -261,17 +261,18 @@ impl( PhantomData<(Bridges, Router, UniversalLocation)>, ); -impl> SendXcm +impl> SendXcm for SovereignPaidRemoteExporter { type Ticket = Router::Ticket; fn validate( - dest: &mut Option, + dest: &mut Option, msg: &mut Option>, ) -> SendResult { - let d = *dest.as_ref().ok_or(MissingArgument)?; - let devolved = ensure_is_remote(UniversalLocation::get(), d).map_err(|_| NotApplicable)?; + let d = dest.as_ref().ok_or(MissingArgument)?; + let devolved = + ensure_is_remote(UniversalLocation::get(), d.clone()).map_err(|_| NotApplicable)?; let (remote_network, remote_location) = devolved; let xcm = msg.take().ok_or(MissingArgument)?; @@ -299,7 +300,7 @@ impl, } @@ -386,8 +387,8 @@ pub struct BridgeBlobDispatcher( ); impl< Router: SendXcm, - OurPlace: Get, - OurPlaceBridgeInstance: Get>, + OurPlace: Get, + OurPlaceBridgeInstance: Get>, > DispatchBlob for BridgeBlobDispatcher { fn dispatch_blob(blob: Vec) -> Result<(), DispatchBlobError> { @@ -396,7 +397,7 @@ impl< our_universal.global_consensus().map_err(|()| DispatchBlobError::Unbridgable)?; let BridgeMessage { universal_dest, message } = Decode::decode(&mut &blob[..]).map_err(|_| DispatchBlobError::InvalidEncoding)?; - let universal_dest: InteriorMultiLocation = universal_dest + let universal_dest: InteriorLocation = universal_dest .try_into() .map_err(|_| DispatchBlobError::UnsupportedLocationVersion)?; // `universal_dest` is the desired destination within the universe: first we need to check @@ -437,9 +438,9 @@ pub struct HaulBlobExporter( /// ``` impl< Bridge: HaulBlob, - BridgedNetwork: Get, + BridgedNetwork: Get, DestinationVersion: GetVersion, - Price: Get, + Price: Get, > ExportXcm for HaulBlobExporter { type Ticket = (Vec, XcmHash); @@ -447,12 +448,12 @@ impl< fn validate( network: NetworkId, _channel: u32, - universal_source: &mut Option, - destination: &mut Option, + universal_source: &mut Option, + destination: &mut Option, message: &mut Option>, - ) -> Result<((Vec, XcmHash), MultiAssets), SendError> { + ) -> Result<((Vec, XcmHash), Assets), SendError> { let (bridged_network, bridged_network_location_parents) = { - let MultiLocation { parents, interior: mut junctions } = BridgedNetwork::get(); + let Location { parents, interior: mut junctions } = BridgedNetwork::get(); match junctions.take_first() { Some(GlobalConsensus(network)) => (network, parents), _ => return Err(SendError::NotApplicable), @@ -467,8 +468,8 @@ impl< let (universal_dest, version) = match dest.pushed_front_with(GlobalConsensus(bridged_network)) { Ok(d) => { - let version = DestinationVersion::get_version_for(&MultiLocation::from( - AncestorThen(bridged_network_location_parents, d), + let version = DestinationVersion::get_version_for(&Location::from( + AncestorThen(bridged_network_location_parents, d.clone()), )) .ok_or(SendError::DestinationUnsupported)?; (d, version) @@ -501,7 +502,7 @@ impl< let message = VersionedXcm::from(message) .into_version(version) .map_err(|()| SendError::DestinationUnsupported)?; - let universal_dest = VersionedInteriorMultiLocation::from(universal_dest) + let universal_dest = VersionedInteriorLocation::from(universal_dest) .into_version(version) .map_err(|()| SendError::DestinationUnsupported)?; @@ -548,10 +549,10 @@ mod tests { type Ticket = (); fn validate( - _destination: &mut Option, + _destination: &mut Option, _message: &mut Option>, ) -> SendResult { - Ok(((), MultiAssets::new())) + Ok(((), Assets::new())) } fn deliver(_ticket: Self::Ticket) -> Result { @@ -562,10 +563,10 @@ mod tests { /// Generic test case asserting that dest and msg is not consumed by `validate` implementation /// of `SendXcm` in case of expected result. fn ensure_validate_does_not_consume_dest_or_msg( - dest: MultiLocation, + dest: Location, assert_result: impl Fn(SendResult), ) { - let mut dest_wrapper = Some(dest); + let mut dest_wrapper = Some(dest.clone()); let msg = Xcm::<()>::new(); let mut msg_wrapper = Some(msg.clone()); @@ -580,19 +581,19 @@ mod tests { fn remote_exporters_does_not_consume_dest_or_msg_on_not_applicable() { frame_support::parameter_types! { pub Local: NetworkId = ByGenesis([0; 32]); - pub UniversalLocation: InteriorMultiLocation = X2(GlobalConsensus(Local::get()), Parachain(1234)); + pub UniversalLocation: InteriorLocation = [GlobalConsensus(Local::get()), Parachain(1234)].into(); pub DifferentRemote: NetworkId = ByGenesis([22; 32]); // no routers pub BridgeTable: Vec = vec![]; } // check with local destination (should be remote) - let local_dest = (Parent, Parachain(5678)).into(); - assert!(ensure_is_remote(UniversalLocation::get(), local_dest).is_err()); + let local_dest: Location = (Parent, Parachain(5678)).into(); + assert!(ensure_is_remote(UniversalLocation::get(), local_dest.clone()).is_err()); ensure_validate_does_not_consume_dest_or_msg::< UnpaidRemoteExporter, OkSender, UniversalLocation>, - >(local_dest, |result| assert_eq!(Err(NotApplicable), result)); + >(local_dest.clone(), |result| assert_eq!(Err(NotApplicable), result)); ensure_validate_does_not_consume_dest_or_msg::< SovereignPaidRemoteExporter< @@ -603,12 +604,12 @@ mod tests { >(local_dest, |result| assert_eq!(Err(NotApplicable), result)); // check with not applicable destination - let remote_dest = (Parent, Parent, DifferentRemote::get()).into(); - assert!(ensure_is_remote(UniversalLocation::get(), remote_dest).is_ok()); + let remote_dest: Location = (Parent, Parent, DifferentRemote::get()).into(); + assert!(ensure_is_remote(UniversalLocation::get(), remote_dest.clone()).is_ok()); ensure_validate_does_not_consume_dest_or_msg::< UnpaidRemoteExporter, OkSender, UniversalLocation>, - >(remote_dest, |result| assert_eq!(Err(NotApplicable), result)); + >(remote_dest.clone(), |result| assert_eq!(Err(NotApplicable), result)); ensure_validate_does_not_consume_dest_or_msg::< SovereignPaidRemoteExporter< @@ -623,15 +624,15 @@ mod tests { fn network_export_table_works() { frame_support::parameter_types! { pub NetworkA: NetworkId = ByGenesis([0; 32]); - pub Parachain1000InNetworkA: InteriorMultiLocation = X1(Parachain(1000)); - pub Parachain2000InNetworkA: InteriorMultiLocation = X1(Parachain(2000)); + pub Parachain1000InNetworkA: InteriorLocation = [Parachain(1000)].into(); + pub Parachain2000InNetworkA: InteriorLocation = [Parachain(2000)].into(); pub NetworkB: NetworkId = ByGenesis([1; 32]); - pub BridgeToALocation: MultiLocation = MultiLocation::new(1, X1(Parachain(1234))); - pub BridgeToBLocation: MultiLocation = MultiLocation::new(1, X1(Parachain(4321))); + pub BridgeToALocation: Location = Location::new(1, [Parachain(1234)]); + pub BridgeToBLocation: Location = Location::new(1, [Parachain(4321)]); - pub PaymentForNetworkAAndParachain2000: MultiAsset = (MultiLocation::parent(), 150).into(); + pub PaymentForNetworkAAndParachain2000: Asset = (Location::parent(), 150).into(); pub BridgeTable: sp_std::vec::Vec = sp_std::vec![ // NetworkA allows `Parachain(1000)` as remote location WITHOUT payment. @@ -658,19 +659,19 @@ mod tests { ]; } - let test_data = vec![ - (NetworkA::get(), X1(Parachain(1000)), Some((BridgeToALocation::get(), None))), - (NetworkA::get(), X2(Parachain(1000), GeneralIndex(1)), None), + let test_data: Vec<(NetworkId, InteriorLocation, Option<(Location, Option)>)> = vec![ + (NetworkA::get(), [Parachain(1000)].into(), Some((BridgeToALocation::get(), None))), + (NetworkA::get(), [Parachain(1000), GeneralIndex(1)].into(), None), ( NetworkA::get(), - X1(Parachain(2000)), + [Parachain(2000)].into(), Some((BridgeToALocation::get(), Some(PaymentForNetworkAAndParachain2000::get()))), ), - (NetworkA::get(), X2(Parachain(2000), GeneralIndex(1)), None), - (NetworkA::get(), X1(Parachain(3000)), None), - (NetworkB::get(), X1(Parachain(1000)), Some((BridgeToBLocation::get(), None))), - (NetworkB::get(), X1(Parachain(2000)), Some((BridgeToBLocation::get(), None))), - (NetworkB::get(), X1(Parachain(3000)), Some((BridgeToBLocation::get(), None))), + (NetworkA::get(), [Parachain(2000), GeneralIndex(1)].into(), None), + (NetworkA::get(), [Parachain(3000)].into(), None), + (NetworkB::get(), [Parachain(1000)].into(), Some((BridgeToBLocation::get(), None))), + (NetworkB::get(), [Parachain(2000)].into(), Some((BridgeToBLocation::get(), None))), + (NetworkB::get(), [Parachain(3000)].into(), Some((BridgeToBLocation::get(), None))), ]; for (network, remote_location, expected_result) in test_data { diff --git a/polkadot/xcm/xcm-builder/src/weight.rs b/polkadot/xcm/xcm-builder/src/weight.rs index c16c52939a3..2ae6a043843 100644 --- a/polkadot/xcm/xcm-builder/src/weight.rs +++ b/polkadot/xcm/xcm-builder/src/weight.rs @@ -25,10 +25,10 @@ use frame_support::{ use parity_scale_codec::Decode; use sp_runtime::traits::{SaturatedConversion, Saturating, Zero}; use sp_std::{marker::PhantomData, result::Result}; -use xcm::latest::{prelude::*, Weight}; +use xcm::latest::{prelude::*, GetWeight, Weight}; use xcm_executor::{ traits::{WeightBounds, WeightTrader}, - Assets, + AssetsInHolding, }; pub struct FixedWeightBounds(PhantomData<(T, C, M)>); @@ -114,16 +114,16 @@ where } /// Function trait for handling some revenue. Similar to a negative imbalance (credit) handler, but -/// for a `MultiAsset`. Sensible implementations will deposit the asset in some known treasury or +/// for a `Asset`. Sensible implementations will deposit the asset in some known treasury or /// block-author account. pub trait TakeRevenue { - /// Do something with the given `revenue`, which is a single non-wildcard `MultiAsset`. - fn take_revenue(revenue: MultiAsset); + /// Do something with the given `revenue`, which is a single non-wildcard `Asset`. + fn take_revenue(revenue: Asset); } /// Null implementation just burns the revenue. impl TakeRevenue for () { - fn take_revenue(_revenue: MultiAsset) {} + fn take_revenue(_revenue: Asset) {} } /// Simple fee calculator that requires payment in a single fungible at a fixed rate. @@ -143,9 +143,9 @@ impl, R: TakeRevenue> WeightTrader for FixedRateOf fn buy_weight( &mut self, weight: Weight, - payment: Assets, + payment: AssetsInHolding, context: &XcmContext, - ) -> Result { + ) -> Result { log::trace!( target: "xcm::weight", "FixedRateOfFungible::buy_weight weight: {:?}, payment: {:?}, context: {:?}", @@ -165,7 +165,7 @@ impl, R: TakeRevenue> WeightTrader for FixedRateOf Ok(unused) } - fn refund_weight(&mut self, weight: Weight, context: &XcmContext) -> Option { + fn refund_weight(&mut self, weight: Weight, context: &XcmContext) -> Option { log::trace!(target: "xcm::weight", "FixedRateOfFungible::refund_weight weight: {:?}, context: {:?}", weight, context); let (id, units_per_second, units_per_mb) = T::get(); let weight = weight.min(self.0); @@ -194,22 +194,22 @@ impl, R: TakeRevenue> Drop for FixedRateOfFungible /// places any weight bought into the right account. pub struct UsingComponents< WeightToFee: WeightToFeeT, - AssetId: Get, + AssetIdValue: Get, AccountId, Currency: CurrencyT, OnUnbalanced: OnUnbalancedT, >( Weight, Currency::Balance, - PhantomData<(WeightToFee, AssetId, AccountId, Currency, OnUnbalanced)>, + PhantomData<(WeightToFee, AssetIdValue, AccountId, Currency, OnUnbalanced)>, ); impl< WeightToFee: WeightToFeeT, - AssetId: Get, + AssetIdValue: Get, AccountId, Currency: CurrencyT, OnUnbalanced: OnUnbalancedT, - > WeightTrader for UsingComponents + > WeightTrader for UsingComponents { fn new() -> Self { Self(Weight::zero(), Zero::zero(), PhantomData) @@ -218,20 +218,20 @@ impl< fn buy_weight( &mut self, weight: Weight, - payment: Assets, + payment: AssetsInHolding, context: &XcmContext, - ) -> Result { + ) -> Result { log::trace!(target: "xcm::weight", "UsingComponents::buy_weight weight: {:?}, payment: {:?}, context: {:?}", weight, payment, context); let amount = WeightToFee::weight_to_fee(&weight); let u128_amount: u128 = amount.try_into().map_err(|_| XcmError::Overflow)?; - let required = (Concrete(AssetId::get()), u128_amount).into(); + let required = (AssetId(AssetIdValue::get()), u128_amount).into(); let unused = payment.checked_sub(required).map_err(|_| XcmError::TooExpensive)?; self.0 = self.0.saturating_add(weight); self.1 = self.1.saturating_add(amount); Ok(unused) } - fn refund_weight(&mut self, weight: Weight, context: &XcmContext) -> Option { + fn refund_weight(&mut self, weight: Weight, context: &XcmContext) -> Option { log::trace!(target: "xcm::weight", "UsingComponents::refund_weight weight: {:?}, context: {:?}", weight, context); let weight = weight.min(self.0); let amount = WeightToFee::weight_to_fee(&weight); @@ -239,7 +239,7 @@ impl< self.1 = self.1.saturating_sub(amount); let amount: u128 = amount.saturated_into(); if amount > 0 { - Some((AssetId::get(), amount).into()) + Some((AssetIdValue::get(), amount).into()) } else { None } @@ -247,7 +247,7 @@ impl< } impl< WeightToFee: WeightToFeeT, - AssetId: Get, + AssetId: Get, AccountId, Currency: CurrencyT, OnUnbalanced: OnUnbalancedT, diff --git a/polkadot/xcm/xcm-builder/tests/mock/mod.rs b/polkadot/xcm/xcm-builder/tests/mock/mod.rs index 6b4d893f73c..e08099280ba 100644 --- a/polkadot/xcm/xcm-builder/tests/mock/mod.rs +++ b/polkadot/xcm/xcm-builder/tests/mock/mod.rs @@ -46,24 +46,24 @@ pub type AccountId = AccountId32; pub type Balance = u128; thread_local! { - pub static SENT_XCM: RefCell> = RefCell::new(Vec::new()); + pub static SENT_XCM: RefCell> = RefCell::new(Vec::new()); } -pub fn sent_xcm() -> Vec<(MultiLocation, opaque::Xcm, XcmHash)> { +pub fn sent_xcm() -> Vec<(Location, opaque::Xcm, XcmHash)> { SENT_XCM.with(|q| (*q.borrow()).clone()) } pub struct TestSendXcm; impl SendXcm for TestSendXcm { - type Ticket = (MultiLocation, Xcm<()>, XcmHash); + type Ticket = (Location, Xcm<()>, XcmHash); fn validate( - dest: &mut Option, + dest: &mut Option, msg: &mut Option>, - ) -> SendResult<(MultiLocation, Xcm<()>, XcmHash)> { + ) -> SendResult<(Location, Xcm<()>, XcmHash)> { let msg = msg.take().unwrap(); let hash = fake_message_hash(&msg); let triplet = (dest.take().unwrap(), msg, hash); - Ok((triplet, MultiAssets::new())) + Ok((triplet, Assets::new())) } - fn deliver(triplet: (MultiLocation, Xcm<()>, XcmHash)) -> Result { + fn deliver(triplet: (Location, Xcm<()>, XcmHash)) -> Result { let hash = triplet.2; SENT_XCM.with(|q| q.borrow_mut().push(triplet)); Ok(hash) @@ -136,9 +136,9 @@ impl configuration::Config for Runtime { // aims to closely emulate the Kusama XcmConfig parameter_types! { - pub const KsmLocation: MultiLocation = MultiLocation::here(); + pub const KsmLocation: Location = Location::here(); pub const KusamaNetwork: NetworkId = NetworkId::Kusama; - pub UniversalLocation: InteriorMultiLocation = Here; + pub UniversalLocation: InteriorLocation = Here; pub CheckAccount: (AccountId, MintLocation) = (XcmPallet::check_account(), MintLocation::Local); } @@ -176,8 +176,8 @@ pub type Barrier = ( ); parameter_types! { - pub KusamaForAssetHub: (MultiAssetFilter, MultiLocation) = - (Wild(AllOf { id: Concrete(Here.into()), fun: WildFungible }), Parachain(1000).into()); + pub KusamaForAssetHub: (AssetFilter, Location) = + (Wild(AllOf { id: AssetId(Here.into()), fun: WildFungible }), Parachain(1000).into()); pub const MaxInstructions: u32 = 100; pub const MaxAssetsIntoHolding: u32 = 4; } diff --git a/polkadot/xcm/xcm-builder/tests/scenarios.rs b/polkadot/xcm/xcm-builder/tests/scenarios.rs index 36780b9f007..db37f85acdb 100644 --- a/polkadot/xcm/xcm-builder/tests/scenarios.rs +++ b/polkadot/xcm/xcm-builder/tests/scenarios.rs @@ -55,9 +55,15 @@ fn withdraw_and_deposit_works() { beneficiary: Parachain(other_para_id).into(), }, ]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm(Parachain(PARA_ID), message, hash, weight); - assert_eq!(r, Outcome::Complete(weight)); + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( + Parachain(PARA_ID), + message, + &mut hash, + weight, + Weight::zero(), + ); + assert_eq!(r, Outcome::Complete { used: weight }); let other_para_acc: AccountId = ParaId::from(other_para_id).into_account_truncating(); assert_eq!(Balances::free_balance(para_acc), INITIAL_BALANCE - amount); assert_eq!(Balances::free_balance(other_para_acc), amount); @@ -79,19 +85,19 @@ fn transfer_asset_works() { assets: (Here, amount).into(), beneficiary: AccountId32 { network: None, id: bob.clone().into() }.into(), }]); - let hash = fake_message_hash(&message); - // Use `execute_xcm_in_credit` here to pass through the barrier - let r = XcmExecutor::::execute_xcm_in_credit( + let mut hash = fake_message_hash(&message); + // Use `prepare_and_execute` here to pass through the barrier + let r = XcmExecutor::::prepare_and_execute( AccountId32 { network: None, id: ALICE.into() }, message, - hash, + &mut hash, weight, weight, ); System::assert_last_event( pallet_balances::Event::Transfer { from: ALICE, to: bob.clone(), amount }.into(), ); - assert_eq!(r, Outcome::Complete(weight)); + assert_eq!(r, Outcome::Complete { used: weight }); assert_eq!(Balances::free_balance(ALICE), INITIAL_BALANCE - amount); assert_eq!(Balances::free_balance(bob), INITIAL_BALANCE + amount); }); @@ -129,14 +135,20 @@ fn report_holding_works() { // is not triggered becasue the deposit fails ReportHolding { response_info: response_info.clone(), assets: All.into() }, ]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm(Parachain(PARA_ID), message, hash, weight); + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( + Parachain(PARA_ID), + message, + &mut hash, + weight, + Weight::zero(), + ); assert_eq!( r, - Outcome::Incomplete( - weight - BaseXcmWeight::get(), - XcmError::FailedToTransactAsset("AccountIdConversionFailed") - ) + Outcome::Incomplete { + used: weight - BaseXcmWeight::get(), + error: XcmError::FailedToTransactAsset("AccountIdConversionFailed") + } ); // there should be no query response sent for the failed deposit assert_eq!(mock::sent_xcm(), vec![]); @@ -153,9 +165,15 @@ fn report_holding_works() { // used to get a notification in case of success ReportHolding { response_info: response_info.clone(), assets: AllCounted(1).into() }, ]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm(Parachain(PARA_ID), message, hash, weight); - assert_eq!(r, Outcome::Complete(weight)); + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( + Parachain(PARA_ID), + message, + &mut hash, + weight, + Weight::zero(), + ); + assert_eq!(r, Outcome::Complete { used: weight }); let other_para_acc: AccountId = ParaId::from(other_para_id).into_account_truncating(); assert_eq!(Balances::free_balance(other_para_acc), amount); assert_eq!(Balances::free_balance(para_acc), INITIAL_BALANCE - 2 * amount); @@ -209,9 +227,15 @@ fn teleport_to_asset_hub_works() { xcm: Xcm(teleport_effects.clone()), }, ]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm(Parachain(PARA_ID), message, hash, weight); - assert_eq!(r, Outcome::Complete(weight)); + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( + Parachain(PARA_ID), + message, + &mut hash, + weight, + Weight::zero(), + ); + assert_eq!(r, Outcome::Complete { used: weight }); let expected_msg = Xcm(vec![ReceiveTeleportedAsset((Parent, amount).into()), ClearOrigin] .into_iter() .chain(teleport_effects.clone().into_iter()) @@ -232,9 +256,15 @@ fn teleport_to_asset_hub_works() { xcm: Xcm(teleport_effects.clone()), }, ]); - let hash = fake_message_hash(&message); - let r = XcmExecutor::::execute_xcm(Parachain(PARA_ID), message, hash, weight); - assert_eq!(r, Outcome::Complete(weight)); + let mut hash = fake_message_hash(&message); + let r = XcmExecutor::::prepare_and_execute( + Parachain(PARA_ID), + message, + &mut hash, + weight, + Weight::zero(), + ); + assert_eq!(r, Outcome::Complete { used: weight }); // 2 * amount because of the other teleport above assert_eq!(Balances::free_balance(para_acc), INITIAL_BALANCE - 2 * amount); let expected_msg = Xcm(vec![ReceiveTeleportedAsset((Parent, amount).into()), ClearOrigin] @@ -282,10 +312,16 @@ fn reserve_based_transfer_works() { xcm: Xcm(transfer_effects.clone()), }, ]); - let hash = fake_message_hash(&message); + let mut hash = fake_message_hash(&message); let weight = BaseXcmWeight::get() * 3; - let r = XcmExecutor::::execute_xcm(Parachain(PARA_ID), message, hash, weight); - assert_eq!(r, Outcome::Complete(weight)); + let r = XcmExecutor::::prepare_and_execute( + Parachain(PARA_ID), + message, + &mut hash, + weight, + Weight::zero(), + ); + assert_eq!(r, Outcome::Complete { used: weight }); assert_eq!(Balances::free_balance(para_acc), INITIAL_BALANCE - amount); let expected_msg = Xcm(vec![ReserveAssetDeposited((Parent, amount).into()), ClearOrigin] .into_iter() diff --git a/polkadot/xcm/xcm-executor/integration-tests/src/lib.rs b/polkadot/xcm/xcm-executor/integration-tests/src/lib.rs index c02cb218885..79d6cb1c411 100644 --- a/polkadot/xcm/xcm-executor/integration-tests/src/lib.rs +++ b/polkadot/xcm/xcm-executor/integration-tests/src/lib.rs @@ -65,7 +65,7 @@ fn basic_buy_fees_message_executes() { assert!(polkadot_test_runtime::System::events().iter().any(|r| matches!( r.event, polkadot_test_runtime::RuntimeEvent::Xcm(pallet_xcm::Event::Attempted { - outcome: Outcome::Complete(_) + outcome: Outcome::Complete { .. } }), ))); }); @@ -147,7 +147,7 @@ fn transact_recursion_limit_works() { .filter(|r| matches!( r.event, polkadot_test_runtime::RuntimeEvent::Xcm(pallet_xcm::Event::Attempted { - outcome: Outcome::Complete(_) + outcome: Outcome::Complete { .. } }), )) .count(), @@ -242,7 +242,7 @@ fn query_response_fires() { assert_eq!( polkadot_test_runtime::Xcm::query(query_id), Some(QueryStatus::Ready { - response: VersionedResponse::V3(Response::ExecutionResult(None)), + response: VersionedResponse::V4(Response::ExecutionResult(None)), at: 2u32.into() }), ) @@ -314,12 +314,12 @@ fn query_response_elicits_handler() { client.state_at(block_hash).expect("state should exist").inspect_state(|| { assert!(polkadot_test_runtime::System::events().iter().any(|r| matches!( - r.event, + &r.event, TestNotifier(ResponseReceived( - MultiLocation { parents: 0, interior: X1(Junction::AccountId32 { .. }) }, + location, q, Response::ExecutionResult(None), - )) if q == query_id, + )) if *q == query_id && matches!(location.unpack(), (0, [Junction::AccountId32 { .. }])), ))); }); } diff --git a/polkadot/xcm/xcm-executor/src/assets.rs b/polkadot/xcm/xcm-executor/src/assets.rs index 33f2ff218c7..4407752f702 100644 --- a/polkadot/xcm/xcm-executor/src/assets.rs +++ b/polkadot/xcm/xcm-executor/src/assets.rs @@ -21,16 +21,16 @@ use sp_std::{ prelude::*, }; use xcm::latest::{ - AssetId, AssetInstance, + Asset, AssetFilter, AssetId, AssetInstance, Assets, Fungibility::{Fungible, NonFungible}, - InteriorMultiLocation, MultiAsset, MultiAssetFilter, MultiAssets, MultiLocation, + InteriorLocation, Location, Reanchorable, + WildAsset::{All, AllCounted, AllOf, AllOfCounted}, WildFungibility::{Fungible as WildFungible, NonFungible as WildNonFungible}, - WildMultiAsset::{All, AllCounted, AllOf, AllOfCounted}, }; -/// List of non-wildcard fungible and non-fungible assets. +/// Map of non-wildcard fungible and non-fungible assets held in the holding register. #[derive(Default, Clone, RuntimeDebug, Eq, PartialEq)] -pub struct Assets { +pub struct AssetsInHolding { /// The fungible assets. pub fungible: BTreeMap, @@ -40,16 +40,16 @@ pub struct Assets { pub non_fungible: BTreeSet<(AssetId, AssetInstance)>, } -impl From for Assets { - fn from(asset: MultiAsset) -> Assets { +impl From for AssetsInHolding { + fn from(asset: Asset) -> AssetsInHolding { let mut result = Self::default(); result.subsume(asset); result } } -impl From> for Assets { - fn from(assets: Vec) -> Assets { +impl From> for AssetsInHolding { + fn from(assets: Vec) -> AssetsInHolding { let mut result = Self::default(); for asset in assets.into_iter() { result.subsume(asset) @@ -58,21 +58,21 @@ impl From> for Assets { } } -impl From for Assets { - fn from(assets: MultiAssets) -> Assets { +impl From for AssetsInHolding { + fn from(assets: Assets) -> AssetsInHolding { assets.into_inner().into() } } -impl From for Vec { - fn from(a: Assets) -> Self { +impl From for Vec { + fn from(a: AssetsInHolding) -> Self { a.into_assets_iter().collect() } } -impl From for MultiAssets { - fn from(a: Assets) -> Self { - a.into_assets_iter().collect::>().into() +impl From for Assets { + fn from(a: AssetsInHolding) -> Self { + a.into_assets_iter().collect::>().into() } } @@ -80,10 +80,10 @@ impl From for MultiAssets { #[derive(Debug)] pub enum TakeError { /// There was an attempt to take an asset without saturating (enough of) which did not exist. - AssetUnderflow(MultiAsset), + AssetUnderflow(Asset), } -impl Assets { +impl AssetsInHolding { /// New value, containing no assets. pub fn new() -> Self { Self::default() @@ -100,41 +100,41 @@ impl Assets { } /// A borrowing iterator over the fungible assets. - pub fn fungible_assets_iter(&self) -> impl Iterator + '_ { + pub fn fungible_assets_iter(&self) -> impl Iterator + '_ { self.fungible .iter() - .map(|(id, &amount)| MultiAsset { fun: Fungible(amount), id: *id }) + .map(|(id, &amount)| Asset { fun: Fungible(amount), id: id.clone() }) } /// A borrowing iterator over the non-fungible assets. - pub fn non_fungible_assets_iter(&self) -> impl Iterator + '_ { + pub fn non_fungible_assets_iter(&self) -> impl Iterator + '_ { self.non_fungible .iter() - .map(|(id, instance)| MultiAsset { fun: NonFungible(*instance), id: *id }) + .map(|(id, instance)| Asset { fun: NonFungible(*instance), id: id.clone() }) } /// A consuming iterator over all assets. - pub fn into_assets_iter(self) -> impl Iterator { + pub fn into_assets_iter(self) -> impl Iterator { self.fungible .into_iter() - .map(|(id, amount)| MultiAsset { fun: Fungible(amount), id }) + .map(|(id, amount)| Asset { fun: Fungible(amount), id }) .chain( self.non_fungible .into_iter() - .map(|(id, instance)| MultiAsset { fun: NonFungible(instance), id }), + .map(|(id, instance)| Asset { fun: NonFungible(instance), id }), ) } /// A borrowing iterator over all assets. - pub fn assets_iter(&self) -> impl Iterator + '_ { + pub fn assets_iter(&self) -> impl Iterator + '_ { self.fungible_assets_iter().chain(self.non_fungible_assets_iter()) } /// Mutate `self` to contain all given `assets`, saturating if necessary. /// - /// NOTE: [`Assets`] are always sorted, allowing us to optimize this function from `O(n^2)` to - /// `O(n)`. - pub fn subsume_assets(&mut self, mut assets: Assets) { + /// NOTE: [`AssetsInHolding`] are always sorted, allowing us to optimize this function from + /// `O(n^2)` to `O(n)`. + pub fn subsume_assets(&mut self, mut assets: AssetsInHolding) { let mut f_iter = assets.fungible.iter_mut(); let mut g_iter = self.fungible.iter_mut(); if let (Some(mut f), Some(mut g)) = (f_iter.next(), g_iter.next()) { @@ -166,7 +166,7 @@ impl Assets { /// Mutate `self` to contain the given `asset`, saturating if necessary. /// /// Wildcard values of `asset` do nothing. - pub fn subsume(&mut self, asset: MultiAsset) { + pub fn subsume(&mut self, asset: Asset) { match asset.fun { Fungible(amount) => { self.fungible @@ -180,18 +180,18 @@ impl Assets { } } - /// Swaps two mutable Assets, without deinitializing either one. - pub fn swapped(&mut self, mut with: Assets) -> Self { + /// Swaps two mutable AssetsInHolding, without deinitializing either one. + pub fn swapped(&mut self, mut with: AssetsInHolding) -> Self { mem::swap(&mut *self, &mut with); with } - /// Alter any concretely identified assets by prepending the given `MultiLocation`. + /// Alter any concretely identified assets by prepending the given `Location`. /// /// WARNING: For now we consider this infallible and swallow any errors. It is thus the caller's /// responsibility to ensure that any internal asset IDs are able to be prepended without /// overflow. - pub fn prepend_location(&mut self, prepend: &MultiLocation) { + pub fn prepend_location(&mut self, prepend: &Location) { let mut fungible = Default::default(); mem::swap(&mut self.fungible, &mut fungible); self.fungible = fungible @@ -218,8 +218,8 @@ impl Assets { /// Any assets which were unable to be reanchored are introduced into `failed_bin`. pub fn reanchor( &mut self, - target: &MultiLocation, - context: InteriorMultiLocation, + target: &Location, + context: &InteriorLocation, mut maybe_failed_bin: Option<&mut Self>, ) { let mut fungible = Default::default(); @@ -249,22 +249,22 @@ impl Assets { } /// Returns `true` if `asset` is contained within `self`. - pub fn contains_asset(&self, asset: &MultiAsset) -> bool { + pub fn contains_asset(&self, asset: &Asset) -> bool { match asset { - MultiAsset { fun: Fungible(amount), id } => + Asset { fun: Fungible(amount), id } => self.fungible.get(id).map_or(false, |a| a >= amount), - MultiAsset { fun: NonFungible(instance), id } => - self.non_fungible.contains(&(*id, *instance)), + Asset { fun: NonFungible(instance), id } => + self.non_fungible.contains(&(id.clone(), *instance)), } } /// Returns `true` if all `assets` are contained within `self`. - pub fn contains_assets(&self, assets: &MultiAssets) -> bool { + pub fn contains_assets(&self, assets: &Assets) -> bool { assets.inner().iter().all(|a| self.contains_asset(a)) } /// Returns `true` if all `assets` are contained within `self`. - pub fn contains(&self, assets: &Assets) -> bool { + pub fn contains(&self, assets: &AssetsInHolding) -> bool { assets .fungible .iter() @@ -274,16 +274,16 @@ impl Assets { /// Returns an error unless all `assets` are contained in `self`. In the case of an error, the /// first asset in `assets` which is not wholly in `self` is returned. - pub fn ensure_contains(&self, assets: &MultiAssets) -> Result<(), TakeError> { + pub fn ensure_contains(&self, assets: &Assets) -> Result<(), TakeError> { for asset in assets.inner().iter() { match asset { - MultiAsset { fun: Fungible(amount), id } => { + Asset { fun: Fungible(amount), id } => { if self.fungible.get(id).map_or(true, |a| a < amount) { - return Err(TakeError::AssetUnderflow((*id, *amount).into())) + return Err(TakeError::AssetUnderflow((id.clone(), *amount).into())) } }, - MultiAsset { fun: NonFungible(instance), id } => { - let id_instance = (*id, *instance); + Asset { fun: NonFungible(instance), id } => { + let id_instance = (id.clone(), *instance); if !self.non_fungible.contains(&id_instance) { return Err(TakeError::AssetUnderflow(id_instance.into())) } @@ -308,16 +308,16 @@ impl Assets { /// of) a definite asset to be removed. fn general_take( &mut self, - mask: MultiAssetFilter, + mask: AssetFilter, saturate: bool, - ) -> Result { - let mut taken = Assets::new(); + ) -> Result { + let mut taken = AssetsInHolding::new(); let maybe_limit = mask.limit().map(|x| x as usize); match mask { // TODO: Counted variants where we define `limit`. - MultiAssetFilter::Wild(All) | MultiAssetFilter::Wild(AllCounted(_)) => { + AssetFilter::Wild(All) | AssetFilter::Wild(AllCounted(_)) => { if maybe_limit.map_or(true, |l| self.len() <= l) { - return Ok(self.swapped(Assets::new())) + return Ok(self.swapped(AssetsInHolding::new())) } else { let fungible = mem::replace(&mut self.fungible, Default::default()); fungible.into_iter().for_each(|(c, amount)| { @@ -337,15 +337,15 @@ impl Assets { }); } }, - MultiAssetFilter::Wild(AllOfCounted { fun: WildFungible, id, .. }) | - MultiAssetFilter::Wild(AllOf { fun: WildFungible, id }) => + AssetFilter::Wild(AllOfCounted { fun: WildFungible, id, .. }) | + AssetFilter::Wild(AllOf { fun: WildFungible, id }) => if maybe_limit.map_or(true, |l| l >= 1) { if let Some((id, amount)) = self.fungible.remove_entry(&id) { taken.fungible.insert(id, amount); } }, - MultiAssetFilter::Wild(AllOfCounted { fun: WildNonFungible, id, .. }) | - MultiAssetFilter::Wild(AllOf { fun: WildNonFungible, id }) => { + AssetFilter::Wild(AllOfCounted { fun: WildNonFungible, id, .. }) | + AssetFilter::Wild(AllOf { fun: WildNonFungible, id }) => { let non_fungible = mem::replace(&mut self.non_fungible, Default::default()); non_fungible.into_iter().for_each(|(c, instance)| { if c == id && maybe_limit.map_or(true, |l| taken.len() < l) { @@ -355,13 +355,13 @@ impl Assets { } }); }, - MultiAssetFilter::Definite(assets) => { + AssetFilter::Definite(assets) => { if !saturate { self.ensure_contains(&assets)?; } for asset in assets.into_inner().into_iter() { match asset { - MultiAsset { fun: Fungible(amount), id } => { + Asset { fun: Fungible(amount), id } => { let (remove, amount) = match self.fungible.get_mut(&id) { Some(self_amount) => { let amount = amount.min(*self_amount); @@ -374,10 +374,10 @@ impl Assets { self.fungible.remove(&id); } if amount > 0 { - taken.subsume(MultiAsset::from((id, amount)).into()); + taken.subsume(Asset::from((id, amount)).into()); } }, - MultiAsset { fun: NonFungible(instance), id } => { + Asset { fun: NonFungible(instance), id } => { let id_instance = (id, instance); if self.non_fungible.remove(&id_instance) { taken.subsume(id_instance.into()) @@ -395,7 +395,7 @@ impl Assets { /// /// Returns `Ok` with the non-wildcard equivalence of `mask` taken and mutates `self` to its /// value minus `mask` if `self` contains `asset`, and return `Err` otherwise. - pub fn saturating_take(&mut self, asset: MultiAssetFilter) -> Assets { + pub fn saturating_take(&mut self, asset: AssetFilter) -> AssetsInHolding { self.general_take(asset, true) .expect("general_take never results in error when saturating") } @@ -405,13 +405,13 @@ impl Assets { /// /// Returns `Ok` with the non-wildcard equivalence of `asset` taken and mutates `self` to its /// value minus `asset` if `self` contains `asset`, and return `Err` otherwise. - pub fn try_take(&mut self, mask: MultiAssetFilter) -> Result { + pub fn try_take(&mut self, mask: AssetFilter) -> Result { self.general_take(mask, false) } /// Consumes `self` and returns its original value excluding `asset` iff it contains at least /// `asset`. - pub fn checked_sub(mut self, asset: MultiAsset) -> Result { + pub fn checked_sub(mut self, asset: Asset) -> Result { match asset.fun { Fungible(amount) => { let remove = if let Some(balance) = self.fungible.get_mut(&asset.id) { @@ -446,66 +446,66 @@ impl Assets { /// Example: /// /// ``` - /// use staging_xcm_executor::Assets; + /// use staging_xcm_executor::AssetsInHolding; /// use xcm::latest::prelude::*; - /// let assets_i_have: Assets = vec![ (Here, 100).into(), ([0; 32], 100).into() ].into(); - /// let assets_they_want: MultiAssetFilter = vec![ (Here, 200).into(), ([0; 32], 50).into() ].into(); + /// let assets_i_have: AssetsInHolding = vec![ (Here, 100).into(), (Junctions::from([GeneralIndex(0)]), 100).into() ].into(); + /// let assets_they_want: AssetFilter = vec![ (Here, 200).into(), (Junctions::from([GeneralIndex(0)]), 50).into() ].into(); /// - /// let assets_we_can_trade: Assets = assets_i_have.min(&assets_they_want); + /// let assets_we_can_trade: AssetsInHolding = assets_i_have.min(&assets_they_want); /// assert_eq!(assets_we_can_trade.into_assets_iter().collect::>(), vec![ - /// (Here, 100).into(), ([0; 32], 50).into(), + /// (Here, 100).into(), (Junctions::from([GeneralIndex(0)]), 50).into(), /// ]); /// ``` - pub fn min(&self, mask: &MultiAssetFilter) -> Assets { - let mut masked = Assets::new(); + pub fn min(&self, mask: &AssetFilter) -> AssetsInHolding { + let mut masked = AssetsInHolding::new(); let maybe_limit = mask.limit().map(|x| x as usize); if maybe_limit.map_or(false, |l| l == 0) { return masked } match mask { - MultiAssetFilter::Wild(All) | MultiAssetFilter::Wild(AllCounted(_)) => { + AssetFilter::Wild(All) | AssetFilter::Wild(AllCounted(_)) => { if maybe_limit.map_or(true, |l| self.len() <= l) { return self.clone() } else { - for (&c, &amount) in self.fungible.iter() { - masked.fungible.insert(c, amount); + for (c, &amount) in self.fungible.iter() { + masked.fungible.insert(c.clone(), amount); if maybe_limit.map_or(false, |l| masked.len() >= l) { return masked } } for (c, instance) in self.non_fungible.iter() { - masked.non_fungible.insert((*c, *instance)); + masked.non_fungible.insert((c.clone(), *instance)); if maybe_limit.map_or(false, |l| masked.len() >= l) { return masked } } } }, - MultiAssetFilter::Wild(AllOfCounted { fun: WildFungible, id, .. }) | - MultiAssetFilter::Wild(AllOf { fun: WildFungible, id }) => + AssetFilter::Wild(AllOfCounted { fun: WildFungible, id, .. }) | + AssetFilter::Wild(AllOf { fun: WildFungible, id }) => if let Some(&amount) = self.fungible.get(&id) { - masked.fungible.insert(*id, amount); + masked.fungible.insert(id.clone(), amount); }, - MultiAssetFilter::Wild(AllOfCounted { fun: WildNonFungible, id, .. }) | - MultiAssetFilter::Wild(AllOf { fun: WildNonFungible, id }) => + AssetFilter::Wild(AllOfCounted { fun: WildNonFungible, id, .. }) | + AssetFilter::Wild(AllOf { fun: WildNonFungible, id }) => for (c, instance) in self.non_fungible.iter() { if c == id { - masked.non_fungible.insert((*c, *instance)); + masked.non_fungible.insert((c.clone(), *instance)); if maybe_limit.map_or(false, |l| masked.len() >= l) { return masked } } }, - MultiAssetFilter::Definite(assets) => + AssetFilter::Definite(assets) => for asset in assets.inner().iter() { match asset { - MultiAsset { fun: Fungible(amount), id } => { + Asset { fun: Fungible(amount), id } => { if let Some(m) = self.fungible.get(id) { - masked.subsume((*id, Fungible(*amount.min(m))).into()); + masked.subsume((id.clone(), Fungible(*amount.min(m))).into()); } }, - MultiAsset { fun: NonFungible(instance), id } => { - let id_instance = (*id, *instance); + Asset { fun: NonFungible(instance), id } => { + let id_instance = (id.clone(), *instance); if self.non_fungible.contains(&id_instance) { masked.subsume(id_instance.into()); } @@ -522,30 +522,18 @@ mod tests { use super::*; use xcm::latest::prelude::*; #[allow(non_snake_case)] - /// Abstract fungible constructor - fn AF(id: u8, amount: u128) -> MultiAsset { - ([id; 32], amount).into() - } - #[allow(non_snake_case)] - /// Abstract non-fungible constructor - fn ANF(class: u8, instance_id: u8) -> MultiAsset { - ([class; 32], [instance_id; 4]).into() - } - #[allow(non_snake_case)] /// Concrete fungible constructor - fn CF(amount: u128) -> MultiAsset { + fn CF(amount: u128) -> Asset { (Here, amount).into() } #[allow(non_snake_case)] /// Concrete non-fungible constructor - fn CNF(instance_id: u8) -> MultiAsset { + fn CNF(instance_id: u8) -> Asset { (Here, [instance_id; 4]).into() } - fn test_assets() -> Assets { - let mut assets = Assets::new(); - assets.subsume(AF(1, 100)); - assets.subsume(ANF(2, 20)); + fn test_assets() -> AssetsInHolding { + let mut assets = AssetsInHolding::new(); assets.subsume(CF(300)); assets.subsume(CNF(40)); assets @@ -554,9 +542,7 @@ mod tests { #[test] fn subsume_assets_works() { let t1 = test_assets(); - let mut t2 = Assets::new(); - t2.subsume(AF(1, 50)); - t2.subsume(ANF(2, 10)); + let mut t2 = AssetsInHolding::new(); t2.subsume(CF(300)); t2.subsume(CNF(50)); let mut r1 = t1.clone(); @@ -571,63 +557,48 @@ mod tests { #[test] fn checked_sub_works() { let t = test_assets(); - let t = t.checked_sub(AF(1, 50)).unwrap(); - let t = t.checked_sub(AF(1, 51)).unwrap_err(); - let t = t.checked_sub(AF(1, 50)).unwrap(); - let t = t.checked_sub(AF(1, 1)).unwrap_err(); let t = t.checked_sub(CF(150)).unwrap(); let t = t.checked_sub(CF(151)).unwrap_err(); let t = t.checked_sub(CF(150)).unwrap(); let t = t.checked_sub(CF(1)).unwrap_err(); - let t = t.checked_sub(ANF(2, 21)).unwrap_err(); - let t = t.checked_sub(ANF(2, 20)).unwrap(); - let t = t.checked_sub(ANF(2, 20)).unwrap_err(); let t = t.checked_sub(CNF(41)).unwrap_err(); let t = t.checked_sub(CNF(40)).unwrap(); let t = t.checked_sub(CNF(40)).unwrap_err(); - assert_eq!(t, Assets::new()); + assert_eq!(t, AssetsInHolding::new()); } #[test] fn into_assets_iter_works() { let assets = test_assets(); let mut iter = assets.into_assets_iter(); - // Order defined by implementation: CF, AF, CNF, ANF + // Order defined by implementation: CF, CNF assert_eq!(Some(CF(300)), iter.next()); - assert_eq!(Some(AF(1, 100)), iter.next()); assert_eq!(Some(CNF(40)), iter.next()); - assert_eq!(Some(ANF(2, 20)), iter.next()); assert_eq!(None, iter.next()); } #[test] fn assets_into_works() { - let mut assets_vec: Vec = Vec::new(); - assets_vec.push(AF(1, 100)); - assets_vec.push(ANF(2, 20)); + let mut assets_vec: Vec = Vec::new(); assets_vec.push(CF(300)); assets_vec.push(CNF(40)); // Push same group of tokens again - assets_vec.push(AF(1, 100)); - assets_vec.push(ANF(2, 20)); assets_vec.push(CF(300)); assets_vec.push(CNF(40)); - let assets: Assets = assets_vec.into(); + let assets: AssetsInHolding = assets_vec.into(); let mut iter = assets.into_assets_iter(); // Fungibles add assert_eq!(Some(CF(600)), iter.next()); - assert_eq!(Some(AF(1, 200)), iter.next()); // Non-fungibles collapse assert_eq!(Some(CNF(40)), iter.next()); - assert_eq!(Some(ANF(2, 20)), iter.next()); assert_eq!(None, iter.next()); } #[test] fn min_all_and_none_works() { let assets = test_assets(); - let none = MultiAssets::new().into(); + let none = Assets::new().into(); let all = All.into(); let none_min = assets.min(&none); @@ -638,43 +609,15 @@ mod tests { #[test] fn min_counted_works() { - let mut assets = Assets::new(); - assets.subsume(AF(1, 100)); - assets.subsume(ANF(2, 20)); + let mut assets = AssetsInHolding::new(); assets.subsume(CNF(40)); - assets.subsume(AF(10, 50)); - assets.subsume(ANF(2, 40)); - assets.subsume(ANF(2, 30)); assets.subsume(CF(3000)); assets.subsume(CNF(80)); - assets.subsume(ANF(3, 10)); - let fungible = WildMultiAsset::from(([1u8; 32], WildFungible)).counted(2).into(); - let non_fungible = WildMultiAsset::from(([2u8; 32], WildNonFungible)).counted(2).into(); - let all = WildMultiAsset::AllCounted(6).into(); + let all = WildAsset::AllCounted(6).into(); - let fungible = assets.min(&fungible); - let fungible = fungible.assets_iter().collect::>(); - assert_eq!(fungible, vec![AF(1, 100)]); - let non_fungible = assets.min(&non_fungible); - let non_fungible = non_fungible.assets_iter().collect::>(); - assert_eq!(non_fungible, vec![ANF(2, 20), ANF(2, 30)]); let all = assets.min(&all); let all = all.assets_iter().collect::>(); - assert_eq!(all, vec![CF(3000), AF(1, 100), AF(10, 50), CNF(40), CNF(80), ANF(2, 20),]); - } - - #[test] - fn min_all_abstract_works() { - let assets = test_assets(); - let fungible = Wild(([1u8; 32], WildFungible).into()); - let non_fungible = Wild(([2u8; 32], WildNonFungible).into()); - - let fungible = assets.min(&fungible); - let fungible = fungible.assets_iter().collect::>(); - assert_eq!(fungible, vec![AF(1, 100)]); - let non_fungible = assets.min(&non_fungible); - let non_fungible = non_fungible.assets_iter().collect::>(); - assert_eq!(non_fungible, vec![ANF(2, 20)]); + assert_eq!(all, vec![CF(3000), CNF(40), CNF(80)]); } #[test] @@ -695,20 +638,16 @@ mod tests { fn min_basic_works() { let assets1 = test_assets(); - let mut assets2 = Assets::new(); - // This is less than 100, so it will decrease to 50 - assets2.subsume(AF(1, 50)); - // This asset does not exist, so not included - assets2.subsume(ANF(2, 40)); + let mut assets2 = AssetsInHolding::new(); // This is more then 300, so it should stay at 300 assets2.subsume(CF(600)); // This asset should be included assets2.subsume(CNF(40)); - let assets2: MultiAssets = assets2.into(); + let assets2: Assets = assets2.into(); let assets_min = assets1.min(&assets2.into()); let assets_min = assets_min.into_assets_iter().collect::>(); - assert_eq!(assets_min, vec![CF(300), AF(1, 50), CNF(40)]); + assert_eq!(assets_min, vec![CF(300), CNF(40)]); } #[test] @@ -724,23 +663,6 @@ mod tests { assert!(all_iter.eq(test_assets().assets_iter())); } - #[test] - fn saturating_take_all_abstract_works() { - let mut assets = test_assets(); - let fungible = Wild(([1u8; 32], WildFungible).into()); - let non_fungible = Wild(([2u8; 32], WildNonFungible).into()); - - let fungible = assets.saturating_take(fungible); - let fungible = fungible.assets_iter().collect::>(); - assert_eq!(fungible, vec![AF(1, 100)]); - let non_fungible = assets.saturating_take(non_fungible); - let non_fungible = non_fungible.assets_iter().collect::>(); - assert_eq!(non_fungible, vec![ANF(2, 20)]); - // Assets drained of abstract - let final_assets = assets.assets_iter().collect::>(); - assert_eq!(final_assets, vec![CF(300), CNF(40)]); - } - #[test] fn saturating_take_all_concrete_works() { let mut assets = test_assets(); @@ -753,102 +675,49 @@ mod tests { let non_fungible = assets.saturating_take(non_fungible); let non_fungible = non_fungible.assets_iter().collect::>(); assert_eq!(non_fungible, vec![CNF(40)]); - // Assets drained of concrete - let assets = assets.assets_iter().collect::>(); - assert_eq!(assets, vec![AF(1, 100), ANF(2, 20)]); } #[test] fn saturating_take_basic_works() { let mut assets1 = test_assets(); - let mut assets2 = Assets::new(); - // We should take 50 - assets2.subsume(AF(1, 50)); - // This asset should not be taken - assets2.subsume(ANF(2, 40)); + let mut assets2 = AssetsInHolding::new(); // This is more then 300, so it takes everything assets2.subsume(CF(600)); // This asset should be taken assets2.subsume(CNF(40)); - let assets2: MultiAssets = assets2.into(); + let assets2: Assets = assets2.into(); let taken = assets1.saturating_take(assets2.into()); let taken = taken.into_assets_iter().collect::>(); - assert_eq!(taken, vec![CF(300), AF(1, 50), CNF(40)]); - - let assets = assets1.into_assets_iter().collect::>(); - assert_eq!(assets, vec![AF(1, 50), ANF(2, 20)]); + assert_eq!(taken, vec![CF(300), CNF(40)]); } #[test] fn try_take_all_counted_works() { - let mut assets = Assets::new(); - assets.subsume(AF(1, 100)); - assets.subsume(ANF(2, 20)); + let mut assets = AssetsInHolding::new(); assets.subsume(CNF(40)); - assets.subsume(AF(10, 50)); - assets.subsume(ANF(2, 40)); - assets.subsume(ANF(2, 30)); assets.subsume(CF(3000)); assets.subsume(CNF(80)); - assets.subsume(ANF(3, 10)); - let all = assets.try_take(WildMultiAsset::AllCounted(6).into()).unwrap(); - assert_eq!( - MultiAssets::from(all).inner(), - &vec![CF(3000), AF(1, 100), AF(10, 50), CNF(40), CNF(80), ANF(2, 20),] - ); - assert_eq!(MultiAssets::from(assets).inner(), &vec![ANF(2, 30), ANF(2, 40), ANF(3, 10),]); + let all = assets.try_take(WildAsset::AllCounted(6).into()).unwrap(); + assert_eq!(Assets::from(all).inner(), &vec![CF(3000), CNF(40), CNF(80)]); } #[test] fn try_take_fungibles_counted_works() { - let mut assets = Assets::new(); - assets.subsume(AF(1, 100)); - assets.subsume(ANF(2, 20)); + let mut assets = AssetsInHolding::new(); assets.subsume(CNF(40)); - assets.subsume(AF(10, 50)); - assets.subsume(ANF(2, 40)); - assets.subsume(ANF(2, 30)); assets.subsume(CF(3000)); assets.subsume(CNF(80)); - assets.subsume(ANF(3, 10)); - let mask = WildMultiAsset::from(([1u8; 32], WildFungible)).counted(2).into(); - let taken = assets.try_take(mask).unwrap(); - assert_eq!(MultiAssets::from(taken).inner(), &vec![AF(1, 100)]); - assert_eq!( - MultiAssets::from(assets).inner(), - &vec![ - CF(3000), - AF(10, 50), - CNF(40), - CNF(80), - ANF(2, 20), - ANF(2, 30), - ANF(2, 40), - ANF(3, 10), - ] - ); + assert_eq!(Assets::from(assets).inner(), &vec![CF(3000), CNF(40), CNF(80),]); } #[test] fn try_take_non_fungibles_counted_works() { - let mut assets = Assets::new(); - assets.subsume(AF(1, 100)); - assets.subsume(ANF(2, 20)); + let mut assets = AssetsInHolding::new(); assets.subsume(CNF(40)); - assets.subsume(AF(10, 50)); - assets.subsume(ANF(2, 40)); - assets.subsume(ANF(2, 30)); assets.subsume(CF(3000)); assets.subsume(CNF(80)); - assets.subsume(ANF(3, 10)); - let mask = WildMultiAsset::from(([2u8; 32], WildNonFungible)).counted(2).into(); - let taken = assets.try_take(mask).unwrap(); - assert_eq!(MultiAssets::from(taken).inner(), &vec![ANF(2, 20), ANF(2, 30),]); - assert_eq!( - MultiAssets::from(assets).inner(), - &vec![CF(3000), AF(1, 100), AF(10, 50), CNF(40), CNF(80), ANF(2, 40), ANF(3, 10),] - ); + assert_eq!(Assets::from(assets).inner(), &vec![CF(3000), CNF(40), CNF(80)]); } } diff --git a/polkadot/xcm/xcm-executor/src/config.rs b/polkadot/xcm/xcm-executor/src/config.rs index 2ff12cd7a53..3f1ea6d1fb8 100644 --- a/polkadot/xcm/xcm-executor/src/config.rs +++ b/polkadot/xcm/xcm-executor/src/config.rs @@ -41,17 +41,17 @@ pub trait Config { type OriginConverter: ConvertOrigin<::RuntimeOrigin>; /// Combinations of (Asset, Location) pairs which we trust as reserves. - type IsReserve: ContainsPair; + type IsReserve: ContainsPair; /// Combinations of (Asset, Location) pairs which we trust as teleporters. - type IsTeleporter: ContainsPair; + type IsTeleporter: ContainsPair; /// A list of (Origin, Target) pairs allowing a given Origin to be substituted with its /// corresponding Target pair. - type Aliasers: ContainsPair; + type Aliasers: ContainsPair; /// This chain's Universal Location. - type UniversalLocation: Get; + type UniversalLocation: Get; /// Whether we should execute the given XCM at all. type Barrier: ShouldExecute; @@ -98,7 +98,7 @@ pub trait Config { /// The origin locations and specific universal junctions to which they are allowed to elevate /// themselves. - type UniversalAliases: Contains<(MultiLocation, Junction)>; + type UniversalAliases: Contains<(Location, Junction)>; /// The call dispatcher used by XCM. /// diff --git a/polkadot/xcm/xcm-executor/src/lib.rs b/polkadot/xcm/xcm-executor/src/lib.rs index 665b051c130..1f5f2eba5e2 100644 --- a/polkadot/xcm/xcm-executor/src/lib.rs +++ b/polkadot/xcm/xcm-executor/src/lib.rs @@ -36,7 +36,7 @@ use traits::{ }; mod assets; -pub use assets::Assets; +pub use assets::AssetsInHolding; mod config; pub use config::Config; @@ -56,10 +56,10 @@ environmental::environmental!(recursion_count: u8); /// The XCM executor. pub struct XcmExecutor { - holding: Assets, + holding: AssetsInHolding, holding_limit: usize, context: XcmContext, - original_origin: MultiLocation, + original_origin: Location, trader: Config::Trader, /// The most recent error result and instruction index into the fragment in which it occurred, /// if any. @@ -81,10 +81,10 @@ pub struct XcmExecutor { #[cfg(feature = "runtime-benchmarks")] impl XcmExecutor { - pub fn holding(&self) -> &Assets { + pub fn holding(&self) -> &AssetsInHolding { &self.holding } - pub fn set_holding(&mut self, v: Assets) { + pub fn set_holding(&mut self, v: AssetsInHolding) { self.holding = v } pub fn holding_limit(&self) -> &usize { @@ -93,16 +93,16 @@ impl XcmExecutor { pub fn set_holding_limit(&mut self, v: usize) { self.holding_limit = v } - pub fn origin(&self) -> &Option { + pub fn origin(&self) -> &Option { &self.context.origin } - pub fn set_origin(&mut self, v: Option) { + pub fn set_origin(&mut self, v: Option) { self.context.origin = v } - pub fn original_origin(&self) -> &MultiLocation { + pub fn original_origin(&self) -> &Location { &self.original_origin } - pub fn set_original_origin(&mut self, v: MultiLocation) { + pub fn set_original_origin(&mut self, v: Location) { self.original_origin = v } pub fn trader(&self) -> &Config::Trader { @@ -191,14 +191,14 @@ impl ExecuteXcm for XcmExecutor, + origin: impl Into, WeighedMessage(xcm_weight, mut message): WeighedMessage, id: &mut XcmHash, weight_credit: Weight, ) -> Outcome { let origin = origin.into(); log::trace!( - target: "xcm::execute_xcm_in_credit", + target: "xcm::execute", "origin: {origin:?}, message: {message:?}, weight_credit: {weight_credit:?}", ); let mut properties = Properties { weight_credit, message_id: None }; @@ -209,11 +209,11 @@ impl ExecuteXcm for XcmExecutor ExecuteXcm for XcmExecutor ExecuteXcm for XcmExecutor, fees: MultiAssets) -> XcmResult { + fn charge_fees(origin: impl Into, fees: Assets) -> XcmResult { let origin = origin.into(); if !Config::FeeManager::is_waived(Some(&origin), FeeReason::ChargeFees) { for asset in fees.inner() { @@ -275,12 +275,12 @@ impl From for frame_benchmarking::BenchmarkError { } impl XcmExecutor { - pub fn new(origin: impl Into, message_id: XcmHash) -> Self { + pub fn new(origin: impl Into, message_id: XcmHash) -> Self { let origin = origin.into(); Self { - holding: Assets::new(), + holding: AssetsInHolding::new(), holding_limit: Config::MaxAssetsIntoHolding::get() as usize, - context: XcmContext { origin: Some(origin), message_id, topic: None }, + context: XcmContext { origin: Some(origin.clone()), message_id, topic: None }, original_origin: origin, trader: Config::Trader::new(), error: None, @@ -309,7 +309,7 @@ impl XcmExecutor { if !self.holding.is_empty() { log::trace!( - target: "xcm::execute_xcm_in_credit", + target: "xcm::post_process", "Trapping assets in holding register: {:?}, context: {:?} (original_origin: {:?})", self.holding, self.context, self.original_origin, ); @@ -320,28 +320,28 @@ impl XcmExecutor { }; match self.error { - None => Outcome::Complete(weight_used), + None => Outcome::Complete { used: weight_used }, // TODO: #2841 #REALWEIGHT We should deduct the cost of any instructions following // the error which didn't end up being executed. Some((_i, e)) => { - log::trace!(target: "xcm::execute_xcm_in_credit", "Execution errored at {:?}: {:?} (original_origin: {:?})", _i, e, self.original_origin); - Outcome::Incomplete(weight_used, e) + log::trace!(target: "xcm::post_process", "Execution errored at {:?}: {:?} (original_origin: {:?})", _i, e, self.original_origin); + Outcome::Incomplete { used: weight_used, error: e } }, } } - fn origin_ref(&self) -> Option<&MultiLocation> { + fn origin_ref(&self) -> Option<&Location> { self.context.origin.as_ref() } - fn cloned_origin(&self) -> Option { - self.context.origin + fn cloned_origin(&self) -> Option { + self.context.origin.clone() } /// Send an XCM, charging fees from Holding as needed. fn send( &mut self, - dest: MultiLocation, + dest: Location, msg: Xcm<()>, reason: FeeReason, ) -> Result { @@ -373,14 +373,14 @@ impl XcmExecutor { r } - fn subsume_asset(&mut self, asset: MultiAsset) -> Result<(), XcmError> { + fn subsume_asset(&mut self, asset: Asset) -> Result<(), XcmError> { // worst-case, holding.len becomes 2 * holding_limit. ensure!(self.holding.len() < self.holding_limit * 2, XcmError::HoldingWouldOverflow); self.holding.subsume(asset); Ok(()) } - fn subsume_assets(&mut self, assets: Assets) -> Result<(), XcmError> { + fn subsume_assets(&mut self, assets: AssetsInHolding) -> Result<(), XcmError> { // worst-case, holding.len becomes 2 * holding_limit. // this guarantees that if holding.len() == holding_limit and you have holding_limit more // items (which has a best case outcome of holding.len() == holding_limit), then you'll @@ -403,8 +403,8 @@ impl XcmExecutor { Ok(()) } - fn take_fee(&mut self, fee: MultiAssets, reason: FeeReason) -> XcmResult { - if Config::FeeManager::is_waived(self.origin_ref(), reason) { + fn take_fee(&mut self, fee: Assets, reason: FeeReason) -> XcmResult { + if Config::FeeManager::is_waived(self.origin_ref(), reason.clone()) { return Ok(()) } log::trace!( @@ -430,13 +430,13 @@ impl XcmExecutor { /// Calculates what `local_querier` would be from the perspective of `destination`. fn to_querier( - local_querier: Option, - destination: &MultiLocation, - ) -> Result, XcmError> { + local_querier: Option, + destination: &Location, + ) -> Result, XcmError> { Ok(match local_querier { None => None, Some(q) => Some( - q.reanchored(&destination, Config::UniversalLocation::get()) + q.reanchored(&destination, &Config::UniversalLocation::get()) .map_err(|_| XcmError::ReanchorFailed)?, ), }) @@ -447,7 +447,7 @@ impl XcmExecutor { /// The `local_querier` argument is the querier (if any) specified from the *local* perspective. fn respond( &mut self, - local_querier: Option, + local_querier: Option, response: Response, info: QueryResponseInfo, fee_reason: FeeReason, @@ -459,36 +459,27 @@ impl XcmExecutor { self.send(destination, message, fee_reason) } - fn try_reanchor( - asset: MultiAsset, - destination: &MultiLocation, - ) -> Result<(MultiAsset, InteriorMultiLocation), XcmError> { + fn try_reanchor( + reanchorable: T, + destination: &Location, + ) -> Result<(T, InteriorLocation), XcmError> { let reanchor_context = Config::UniversalLocation::get(); - let asset = asset - .reanchored(&destination, reanchor_context) - .map_err(|()| XcmError::ReanchorFailed)?; - Ok((asset, reanchor_context)) - } - - fn try_reanchor_multilocation( - location: MultiLocation, - destination: &MultiLocation, - ) -> Result<(MultiLocation, InteriorMultiLocation), XcmError> { - let reanchor_context = Config::UniversalLocation::get(); - let location = location - .reanchored(&destination, reanchor_context) - .map_err(|_| XcmError::ReanchorFailed)?; - Ok((location, reanchor_context)) + let reanchored = + reanchorable.reanchored(&destination, &reanchor_context).map_err(|error| { + log::error!(target: "xcm::reanchor", "Failed reanchoring with error {error:?}"); + XcmError::ReanchorFailed + })?; + Ok((reanchored, reanchor_context)) } /// NOTE: Any assets which were unable to be reanchored are introduced into `failed_bin`. fn reanchored( - mut assets: Assets, - dest: &MultiLocation, - maybe_failed_bin: Option<&mut Assets>, - ) -> MultiAssets { + mut assets: AssetsInHolding, + dest: &Location, + maybe_failed_bin: Option<&mut AssetsInHolding>, + ) -> Assets { let reanchor_context = Config::UniversalLocation::get(); - assets.reanchor(dest, reanchor_context, maybe_failed_bin); + assets.reanchor(dest, &reanchor_context, maybe_failed_bin); assets.into_assets_iter().collect::>().into() } @@ -563,8 +554,8 @@ impl XcmExecutor { ); match instr { WithdrawAsset(assets) => { + let origin = self.cloned_origin().ok_or(XcmError::BadOrigin)?; // Take `assets` from the origin account (on-chain) and place in holding. - let origin = *self.origin_ref().ok_or(XcmError::BadOrigin)?; for asset in assets.into_inner().into_iter() { Config::AssetTransactor::withdraw_asset(&asset, &origin, Some(&self.context))?; self.subsume_asset(asset)?; @@ -573,8 +564,8 @@ impl XcmExecutor { }, ReserveAssetDeposited(assets) => { // check whether we trust origin to be our reserve location for this asset. - let origin = *self.origin_ref().ok_or(XcmError::BadOrigin)?; for asset in assets.into_inner().into_iter() { + let origin = self.cloned_origin().ok_or(XcmError::BadOrigin)?; // Must ensure that we recognise the asset as being managed by the origin. ensure!( Config::IsReserve::contains(&asset, &origin), @@ -604,14 +595,14 @@ impl XcmExecutor { Config::AssetTransactor::transfer_asset(asset, origin, &dest, &self.context)?; } let reanchor_context = Config::UniversalLocation::get(); - assets.reanchor(&dest, reanchor_context).map_err(|()| XcmError::LocationFull)?; + assets.reanchor(&dest, &reanchor_context).map_err(|()| XcmError::LocationFull)?; let mut message = vec![ReserveAssetDeposited(assets), ClearOrigin]; message.extend(xcm.0.into_iter()); self.send(dest, Xcm(message), FeeReason::TransferReserveAsset)?; Ok(()) }, ReceiveTeleportedAsset(assets) => { - let origin = *self.origin_ref().ok_or(XcmError::BadOrigin)?; + let origin = self.cloned_origin().ok_or(XcmError::BadOrigin)?; // check whether we trust origin to teleport this asset to us via config trait. for asset in assets.inner() { // We only trust the origin to send us assets that they identify as their @@ -627,6 +618,7 @@ impl XcmExecutor { Config::AssetTransactor::can_check_in(&origin, asset, &self.context)?; } for asset in assets.into_inner().into_iter() { + let origin = self.origin_ref().ok_or(XcmError::BadOrigin)?; Config::AssetTransactor::check_in(&origin, &asset, &self.context); self.subsume_asset(asset)?; } @@ -634,7 +626,7 @@ impl XcmExecutor { }, Transact { origin_kind, require_weight_at_most, mut call } => { // We assume that the Relay-chain is allowed to use transact on this parachain. - let origin = *self.origin_ref().ok_or_else(|| { + let origin = self.cloned_origin().ok_or_else(|| { log::trace!( target: "xcm::process_instruction::transact", "No origin provided", @@ -667,15 +659,17 @@ impl XcmExecutor { return Err(XcmError::NoPermission) } - let dispatch_origin = Config::OriginConverter::convert_origin(origin, origin_kind) - .map_err(|_| { - log::trace!( - target: "xcm::process_instruction::transact", - "Failed to convert origin {origin:?} and origin kind {origin_kind:?} to a local origin." - ); + let dispatch_origin = + Config::OriginConverter::convert_origin(origin.clone(), origin_kind).map_err( + |_| { + log::trace!( + target: "xcm::process_instruction::transact", + "Failed to convert origin {origin:?} and origin kind {origin_kind:?} to a local origin." + ); - XcmError::BadOrigin - })?; + XcmError::BadOrigin + }, + )?; log::trace!( target: "xcm::process_instruction::transact", @@ -964,12 +958,12 @@ impl XcmExecutor { UniversalOrigin(new_global) => { let universal_location = Config::UniversalLocation::get(); ensure!(universal_location.first() != Some(&new_global), XcmError::InvalidLocation); - let origin = *self.origin_ref().ok_or(XcmError::BadOrigin)?; + let origin = self.cloned_origin().ok_or(XcmError::BadOrigin)?; let origin_xform = (origin, new_global); let ok = Config::UniversalAliases::contains(&origin_xform); ensure!(ok, XcmError::InvalidLocation); let (_, new_global) = origin_xform; - let new_origin = X1(new_global).relative_to(&universal_location); + let new_origin = Junctions::from([new_global]).relative_to(&universal_location); self.context.origin = Some(new_origin); Ok(()) }, @@ -983,7 +977,7 @@ impl XcmExecutor { // // This only works because the remote chain empowers the bridge // to speak for the local network. - let origin = self.context.origin.ok_or(XcmError::BadOrigin)?; + let origin = self.context.origin.as_ref().ok_or(XcmError::BadOrigin)?.clone(); let universal_source = Config::UniversalLocation::get() .within_global(origin) .map_err(|()| XcmError::Unanchored)?; @@ -996,7 +990,7 @@ impl XcmExecutor { network, channel, universal_source, - destination, + destination.clone(), xcm, )?; self.take_fee(fee, FeeReason::Export { network, destination })?; @@ -1004,11 +998,12 @@ impl XcmExecutor { Ok(()) }, LockAsset { asset, unlocker } => { - let origin = *self.origin_ref().ok_or(XcmError::BadOrigin)?; + let origin = self.cloned_origin().ok_or(XcmError::BadOrigin)?; let (remote_asset, context) = Self::try_reanchor(asset.clone(), &unlocker)?; - let lock_ticket = Config::AssetLocker::prepare_lock(unlocker, asset, origin)?; + let lock_ticket = + Config::AssetLocker::prepare_lock(unlocker.clone(), asset, origin.clone())?; let owner = - origin.reanchored(&unlocker, context).map_err(|_| XcmError::ReanchorFailed)?; + origin.reanchored(&unlocker, &context).map_err(|_| XcmError::ReanchorFailed)?; let msg = Xcm::<()>(vec![NoteUnlockable { asset: remote_asset, owner }]); let (ticket, price) = validate_send::(unlocker, msg)?; self.take_fee(price, FeeReason::LockAsset)?; @@ -1017,21 +1012,24 @@ impl XcmExecutor { Ok(()) }, UnlockAsset { asset, target } => { - let origin = *self.origin_ref().ok_or(XcmError::BadOrigin)?; + let origin = self.cloned_origin().ok_or(XcmError::BadOrigin)?; Config::AssetLocker::prepare_unlock(origin, asset, target)?.enact()?; Ok(()) }, NoteUnlockable { asset, owner } => { - let origin = *self.origin_ref().ok_or(XcmError::BadOrigin)?; + let origin = self.cloned_origin().ok_or(XcmError::BadOrigin)?; Config::AssetLocker::note_unlockable(origin, asset, owner)?; Ok(()) }, RequestUnlock { asset, locker } => { - let origin = *self.origin_ref().ok_or(XcmError::BadOrigin)?; + let origin = self.cloned_origin().ok_or(XcmError::BadOrigin)?; let remote_asset = Self::try_reanchor(asset.clone(), &locker)?.0; - let remote_target = Self::try_reanchor_multilocation(origin, &locker)?.0; - let reduce_ticket = - Config::AssetLocker::prepare_reduce_unlockable(locker, asset, origin)?; + let remote_target = Self::try_reanchor(origin.clone(), &locker)?.0; + let reduce_ticket = Config::AssetLocker::prepare_reduce_unlockable( + locker.clone(), + asset, + origin.clone(), + )?; let msg = Xcm::<()>(vec![UnlockAsset { asset: remote_asset, target: remote_target }]); let (ticket, price) = validate_send::(locker, msg)?; diff --git a/polkadot/xcm/xcm-executor/src/traits/asset_exchange.rs b/polkadot/xcm/xcm-executor/src/traits/asset_exchange.rs index 0cb188d348d..432a7498ed4 100644 --- a/polkadot/xcm/xcm-executor/src/traits/asset_exchange.rs +++ b/polkadot/xcm/xcm-executor/src/traits/asset_exchange.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -use crate::Assets; +use crate::AssetsInHolding; use xcm::prelude::*; /// A service for exchanging assets. @@ -32,21 +32,21 @@ pub trait AssetExchange { /// least want must be in the set. Some assets originally in `give` may also be in this set. In /// the case of returning an `Err`, then `give` is returned. fn exchange_asset( - origin: Option<&MultiLocation>, - give: Assets, - want: &MultiAssets, + origin: Option<&Location>, + give: AssetsInHolding, + want: &Assets, maximal: bool, - ) -> Result; + ) -> Result; } #[impl_trait_for_tuples::impl_for_tuples(30)] impl AssetExchange for Tuple { fn exchange_asset( - origin: Option<&MultiLocation>, - give: Assets, - want: &MultiAssets, + origin: Option<&Location>, + give: AssetsInHolding, + want: &Assets, maximal: bool, - ) -> Result { + ) -> Result { for_tuples!( #( let give = match Tuple::exchange_asset(origin, give, want, maximal) { Ok(r) => return Ok(r), diff --git a/polkadot/xcm/xcm-executor/src/traits/asset_lock.rs b/polkadot/xcm/xcm-executor/src/traits/asset_lock.rs index b5a2b22f5fc..b6270c52945 100644 --- a/polkadot/xcm/xcm-executor/src/traits/asset_lock.rs +++ b/polkadot/xcm/xcm-executor/src/traits/asset_lock.rs @@ -79,9 +79,9 @@ pub trait AssetLock { /// WARNING: Don't call this with an undropped instance of `Self::LockTicket` or /// `Self::UnlockTicket`. fn prepare_lock( - unlocker: MultiLocation, - asset: MultiAsset, - owner: MultiLocation, + unlocker: Location, + asset: Asset, + owner: Location, ) -> Result; /// Prepare to unlock an asset. On success, a `Self::UnlockTicket` it returned, which can be @@ -90,9 +90,9 @@ pub trait AssetLock { /// WARNING: Don't call this with an undropped instance of `Self::LockTicket` or /// `Self::UnlockTicket`. fn prepare_unlock( - locker: MultiLocation, - asset: MultiAsset, - owner: MultiLocation, + locker: Location, + asset: Asset, + owner: Location, ) -> Result; /// Handler for when a location reports to us that an asset has been locked for us to unlock @@ -102,11 +102,7 @@ pub trait AssetLock { /// sending chain can ensure the lock does not remain. /// /// We should only act upon this message if we believe that the `origin` is honest. - fn note_unlockable( - locker: MultiLocation, - asset: MultiAsset, - owner: MultiLocation, - ) -> Result<(), LockError>; + fn note_unlockable(locker: Location, asset: Asset, owner: Location) -> Result<(), LockError>; /// Handler for when an owner wishes to unlock an asset on a remote chain. /// @@ -115,9 +111,9 @@ pub trait AssetLock { /// /// WARNING: Don't call this with an undropped instance of `Self::ReduceTicket`. fn prepare_reduce_unlockable( - locker: MultiLocation, - asset: MultiAsset, - owner: MultiLocation, + locker: Location, + asset: Asset, + owner: Location, ) -> Result; } @@ -125,27 +121,19 @@ impl AssetLock for () { type LockTicket = Infallible; type UnlockTicket = Infallible; type ReduceTicket = Infallible; - fn prepare_lock( - _: MultiLocation, - _: MultiAsset, - _: MultiLocation, - ) -> Result { + fn prepare_lock(_: Location, _: Asset, _: Location) -> Result { Err(LockError::NotApplicable) } - fn prepare_unlock( - _: MultiLocation, - _: MultiAsset, - _: MultiLocation, - ) -> Result { + fn prepare_unlock(_: Location, _: Asset, _: Location) -> Result { Err(LockError::NotApplicable) } - fn note_unlockable(_: MultiLocation, _: MultiAsset, _: MultiLocation) -> Result<(), LockError> { + fn note_unlockable(_: Location, _: Asset, _: Location) -> Result<(), LockError> { Err(LockError::NotApplicable) } fn prepare_reduce_unlockable( - _: MultiLocation, - _: MultiAsset, - _: MultiLocation, + _: Location, + _: Asset, + _: Location, ) -> Result { Err(LockError::NotApplicable) } diff --git a/polkadot/xcm/xcm-executor/src/traits/asset_transfer.rs b/polkadot/xcm/xcm-executor/src/traits/asset_transfer.rs index 5fdc9b15e01..1fca84f36e2 100644 --- a/polkadot/xcm/xcm-executor/src/traits/asset_transfer.rs +++ b/polkadot/xcm/xcm-executor/src/traits/asset_transfer.rs @@ -30,7 +30,7 @@ pub enum Error { } /// Specify which type of asset transfer is required for a particular `(asset, dest)` combination. -#[derive(Copy, Clone, PartialEq, Debug)] +#[derive(Clone, PartialEq, Debug)] pub enum TransferType { /// should teleport `asset` to `dest` Teleport, @@ -38,8 +38,8 @@ pub enum TransferType { LocalReserve, /// should reserve-transfer `asset` to `dest`, using `dest` as reserve DestinationReserve, - /// should reserve-transfer `asset` to `dest`, using remote chain `MultiLocation` as reserve - RemoteReserve(MultiLocation), + /// should reserve-transfer `asset` to `dest`, using remote chain `Location` as reserve + RemoteReserve(Location), } /// A trait for identifying asset transfer type based on `IsTeleporter` and `IsReserve` @@ -47,17 +47,17 @@ pub enum TransferType { pub trait XcmAssetTransfers { /// Combinations of (Asset, Location) pairs which we trust as reserves. Meaning /// reserve-based-transfers are to be used for assets matching this filter. - type IsReserve: ContainsPair; + type IsReserve: ContainsPair; /// Combinations of (Asset, Location) pairs which we trust as teleporters. Meaning teleports are /// to be used for assets matching this filter. - type IsTeleporter: ContainsPair; + type IsTeleporter: ContainsPair; /// How to withdraw and deposit an asset. type AssetTransactor: TransactAsset; /// Determine transfer type to be used for transferring `asset` from local chain to `dest`. - fn determine_for(asset: &MultiAsset, dest: &MultiLocation) -> Result { + fn determine_for(asset: &Asset, dest: &Location) -> Result { if Self::IsTeleporter::contains(asset, dest) { // we trust destination for teleporting asset return Ok(TransferType::Teleport) @@ -67,11 +67,8 @@ pub trait XcmAssetTransfers { } // try to determine reserve location based on asset id/location - let asset_location = match asset.id { - Concrete(location) => Ok(location.chain_location()), - _ => Err(Error::NotConcrete), - }?; - if asset_location == MultiLocation::here() || + let asset_location = asset.id.0.chain_location(); + if asset_location == Location::here() || Self::IsTeleporter::contains(asset, &asset_location) { // if the asset is local, then it's a local reserve diff --git a/polkadot/xcm/xcm-executor/src/traits/conversion.rs b/polkadot/xcm/xcm-executor/src/traits/conversion.rs index 1fcdf214057..9e2f4c83997 100644 --- a/polkadot/xcm/xcm-executor/src/traits/conversion.rs +++ b/polkadot/xcm/xcm-executor/src/traits/conversion.rs @@ -22,12 +22,12 @@ use xcm::latest::prelude::*; /// Means of converting a location into an account identifier. pub trait ConvertLocation { /// Convert the `location` into `Some` account ID, or `None` if not possible. - fn convert_location(location: &MultiLocation) -> Option; + fn convert_location(location: &Location) -> Option; } #[impl_trait_for_tuples::impl_for_tuples(30)] impl ConvertLocation for Tuple { - fn convert_location(l: &MultiLocation) -> Option { + fn convert_location(l: &Location) -> Option { for_tuples!( #( match Tuple::convert_location(l) { Some(result) => return Some(result), @@ -45,15 +45,15 @@ impl ConvertLocation for Tuple { /// different `origin` of type `Origin` which is passed to the next convert item. /// /// ```rust -/// # use xcm::latest::{MultiLocation, Junctions, Junction, OriginKind}; +/// # use xcm::latest::{Location, Junctions, Junction, OriginKind}; /// # use staging_xcm_executor::traits::ConvertOrigin; /// // A convertor that will bump the para id and pass it to the next one. /// struct BumpParaId; /// impl ConvertOrigin for BumpParaId { -/// fn convert_origin(origin: impl Into, _: OriginKind) -> Result { -/// match origin.into() { -/// MultiLocation { parents: 0, interior: Junctions::X1(Junction::Parachain(id)) } => { -/// Err(Junctions::X1(Junction::Parachain(id + 1)).into()) +/// fn convert_origin(origin: impl Into, _: OriginKind) -> Result { +/// match origin.into().unpack() { +/// (0, [Junction::Parachain(id)]) => { +/// Err([Junction::Parachain(id + 1)].into()) /// } /// _ => unreachable!() /// } @@ -62,17 +62,18 @@ impl ConvertLocation for Tuple { /// /// struct AcceptPara7; /// impl ConvertOrigin for AcceptPara7 { -/// fn convert_origin(origin: impl Into, _: OriginKind) -> Result { -/// match origin.into() { -/// MultiLocation { parents: 0, interior: Junctions::X1(Junction::Parachain(id)) } if id == 7 => { +/// fn convert_origin(origin: impl Into, _: OriginKind) -> Result { +/// let origin = origin.into(); +/// match origin.unpack() { +/// (0, [Junction::Parachain(id)]) if *id == 7 => { /// Ok(7) /// } -/// o => Err(o) +/// _ => Err(origin) /// } /// } /// } /// # fn main() { -/// let origin: MultiLocation = Junctions::X1(Junction::Parachain(6)).into(); +/// let origin: Location = [Junction::Parachain(6)].into(); /// assert!( /// <(BumpParaId, AcceptPara7) as ConvertOrigin>::convert_origin(origin, OriginKind::Native) /// .is_ok() @@ -81,18 +82,12 @@ impl ConvertLocation for Tuple { /// ``` pub trait ConvertOrigin { /// Attempt to convert `origin` to the generic `Origin` whilst consuming it. - fn convert_origin( - origin: impl Into, - kind: OriginKind, - ) -> Result; + fn convert_origin(origin: impl Into, kind: OriginKind) -> Result; } #[impl_trait_for_tuples::impl_for_tuples(30)] impl ConvertOrigin for Tuple { - fn convert_origin( - origin: impl Into, - kind: OriginKind, - ) -> Result { + fn convert_origin(origin: impl Into, kind: OriginKind) -> Result { for_tuples!( #( let origin = match Tuple::convert_origin(origin, kind) { Err(o) => o, diff --git a/polkadot/xcm/xcm-executor/src/traits/drop_assets.rs b/polkadot/xcm/xcm-executor/src/traits/drop_assets.rs index 9753f3a4213..339d485d979 100644 --- a/polkadot/xcm/xcm-executor/src/traits/drop_assets.rs +++ b/polkadot/xcm/xcm-executor/src/traits/drop_assets.rs @@ -14,28 +14,28 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -use crate::Assets; +use crate::AssetsInHolding; use core::marker::PhantomData; use frame_support::traits::Contains; -use xcm::latest::{MultiAssets, MultiLocation, Weight, XcmContext}; +use xcm::latest::{Assets, Location, Weight, XcmContext}; -/// Define a handler for when some non-empty `Assets` value should be dropped. +/// Define a handler for when some non-empty `AssetsInHolding` value should be dropped. pub trait DropAssets { /// Handler for receiving dropped assets. Returns the weight consumed by this operation. - fn drop_assets(origin: &MultiLocation, assets: Assets, context: &XcmContext) -> Weight; + fn drop_assets(origin: &Location, assets: AssetsInHolding, context: &XcmContext) -> Weight; } impl DropAssets for () { - fn drop_assets(_origin: &MultiLocation, _assets: Assets, _context: &XcmContext) -> Weight { + fn drop_assets(_origin: &Location, _assets: AssetsInHolding, _context: &XcmContext) -> Weight { Weight::zero() } } /// Morph a given `DropAssets` implementation into one which can filter based on assets. This can -/// be used to ensure that `Assets` values which hold no value are ignored. +/// be used to ensure that `AssetsInHolding` values which hold no value are ignored. pub struct FilterAssets(PhantomData<(D, A)>); -impl> DropAssets for FilterAssets { - fn drop_assets(origin: &MultiLocation, assets: Assets, context: &XcmContext) -> Weight { +impl> DropAssets for FilterAssets { + fn drop_assets(origin: &Location, assets: AssetsInHolding, context: &XcmContext) -> Weight { if A::contains(&assets) { D::drop_assets(origin, assets, context) } else { @@ -49,8 +49,8 @@ impl> DropAssets for FilterAssets { /// asset trap facility don't get to use it. pub struct FilterOrigin(PhantomData<(D, O)>); -impl> DropAssets for FilterOrigin { - fn drop_assets(origin: &MultiLocation, assets: Assets, context: &XcmContext) -> Weight { +impl> DropAssets for FilterOrigin { + fn drop_assets(origin: &Location, assets: AssetsInHolding, context: &XcmContext) -> Weight { if O::contains(origin) { D::drop_assets(origin, assets, context) } else { @@ -64,9 +64,9 @@ pub trait ClaimAssets { /// Claim any assets available to `origin` and return them in a single `Assets` value, together /// with the weight used by this operation. fn claim_assets( - origin: &MultiLocation, - ticket: &MultiLocation, - what: &MultiAssets, + origin: &Location, + ticket: &Location, + what: &Assets, context: &XcmContext, ) -> bool; } @@ -74,9 +74,9 @@ pub trait ClaimAssets { #[impl_trait_for_tuples::impl_for_tuples(30)] impl ClaimAssets for Tuple { fn claim_assets( - origin: &MultiLocation, - ticket: &MultiLocation, - what: &MultiAssets, + origin: &Location, + ticket: &Location, + what: &Assets, context: &XcmContext, ) -> bool { for_tuples!( #( diff --git a/polkadot/xcm/xcm-executor/src/traits/export.rs b/polkadot/xcm/xcm-executor/src/traits/export.rs index 7aeccd44566..78aa68ce264 100644 --- a/polkadot/xcm/xcm-executor/src/traits/export.rs +++ b/polkadot/xcm/xcm-executor/src/traits/export.rs @@ -51,8 +51,8 @@ pub trait ExportXcm { fn validate( network: NetworkId, channel: u32, - universal_source: &mut Option, - destination: &mut Option, + universal_source: &mut Option, + destination: &mut Option, message: &mut Option>, ) -> SendResult; @@ -71,11 +71,11 @@ impl ExportXcm for Tuple { fn validate( network: NetworkId, channel: u32, - universal_source: &mut Option, - destination: &mut Option, + universal_source: &mut Option, + destination: &mut Option, message: &mut Option>, ) -> SendResult { - let mut maybe_cost: Option = None; + let mut maybe_cost: Option = None; let one_ticket: Self::Ticket = (for_tuples! { #( if maybe_cost.is_some() { None @@ -112,8 +112,8 @@ impl ExportXcm for Tuple { pub fn validate_export( network: NetworkId, channel: u32, - universal_source: InteriorMultiLocation, - dest: InteriorMultiLocation, + universal_source: InteriorLocation, + dest: InteriorLocation, msg: Xcm<()>, ) -> SendResult { T::validate(network, channel, &mut Some(universal_source), &mut Some(dest), &mut Some(msg)) @@ -130,10 +130,10 @@ pub fn validate_export( pub fn export_xcm( network: NetworkId, channel: u32, - universal_source: InteriorMultiLocation, - dest: InteriorMultiLocation, + universal_source: InteriorLocation, + dest: InteriorLocation, msg: Xcm<()>, -) -> Result<(XcmHash, MultiAssets), SendError> { +) -> Result<(XcmHash, Assets), SendError> { let (ticket, price) = T::validate( network, channel, diff --git a/polkadot/xcm/xcm-executor/src/traits/fee_manager.rs b/polkadot/xcm/xcm-executor/src/traits/fee_manager.rs index d7146457f3b..b6e303daaad 100644 --- a/polkadot/xcm/xcm-executor/src/traits/fee_manager.rs +++ b/polkadot/xcm/xcm-executor/src/traits/fee_manager.rs @@ -19,15 +19,15 @@ use xcm::prelude::*; /// Handle stuff to do with taking fees in certain XCM instructions. pub trait FeeManager { /// Determine if a fee should be waived. - fn is_waived(origin: Option<&MultiLocation>, r: FeeReason) -> bool; + fn is_waived(origin: Option<&Location>, r: FeeReason) -> bool; /// Do something with the fee which has been paid. Doing nothing here silently burns the /// fees. - fn handle_fee(fee: MultiAssets, context: Option<&XcmContext>, r: FeeReason); + fn handle_fee(fee: Assets, context: Option<&XcmContext>, r: FeeReason); } /// Context under which a fee is paid. -#[derive(Copy, Clone, Debug, Eq, PartialEq)] +#[derive(Clone, Debug, Eq, PartialEq)] pub enum FeeReason { /// When a reporting instruction is called. Report, @@ -42,7 +42,7 @@ pub enum FeeReason { /// When the `QueryPallet` instruction is called. QueryPallet, /// When the `ExportMessage` instruction is called (and includes the network ID). - Export { network: NetworkId, destination: InteriorMultiLocation }, + Export { network: NetworkId, destination: InteriorLocation }, /// The `charge_fees` API. ChargeFees, /// When the `LockAsset` instruction is called. @@ -52,9 +52,9 @@ pub enum FeeReason { } impl FeeManager for () { - fn is_waived(_: Option<&MultiLocation>, _: FeeReason) -> bool { + fn is_waived(_: Option<&Location>, _: FeeReason) -> bool { false } - fn handle_fee(_: MultiAssets, _: Option<&XcmContext>, _: FeeReason) {} + fn handle_fee(_: Assets, _: Option<&XcmContext>, _: FeeReason) {} } diff --git a/polkadot/xcm/xcm-executor/src/traits/filter_asset_location.rs b/polkadot/xcm/xcm-executor/src/traits/filter_asset_location.rs index b162a8b0729..5d0c32890be 100644 --- a/polkadot/xcm/xcm-executor/src/traits/filter_asset_location.rs +++ b/polkadot/xcm/xcm-executor/src/traits/filter_asset_location.rs @@ -15,21 +15,21 @@ // along with Polkadot. If not, see . use frame_support::traits::ContainsPair; -use xcm::latest::{MultiAsset, MultiLocation}; +use xcm::latest::{Asset, Location}; /// Filters assets/location pairs. /// /// Can be amalgamated into tuples. If any item returns `true`, it short-circuits, else `false` is /// returned. -#[deprecated = "Use `frame_support::traits::ContainsPair` instead"] +#[deprecated = "Use `frame_support::traits::ContainsPair` instead"] pub trait FilterAssetLocation { /// A filter to distinguish between asset/location pairs. - fn contains(asset: &MultiAsset, origin: &MultiLocation) -> bool; + fn contains(asset: &Asset, origin: &Location) -> bool; } #[allow(deprecated)] -impl> FilterAssetLocation for T { - fn contains(asset: &MultiAsset, origin: &MultiLocation) -> bool { +impl> FilterAssetLocation for T { + fn contains(asset: &Asset, origin: &Location) -> bool { T::contains(asset, origin) } } diff --git a/polkadot/xcm/xcm-executor/src/traits/on_response.rs b/polkadot/xcm/xcm-executor/src/traits/on_response.rs index ea41f242a97..952bd2d0040 100644 --- a/polkadot/xcm/xcm-executor/src/traits/on_response.rs +++ b/polkadot/xcm/xcm-executor/src/traits/on_response.rs @@ -24,42 +24,34 @@ use parity_scale_codec::{Decode, Encode, FullCodec, MaxEncodedLen}; use sp_arithmetic::traits::Zero; use sp_std::fmt::Debug; use xcm::latest::{ - Error as XcmError, InteriorMultiLocation, MultiLocation, QueryId, Response, - Result as XcmResult, Weight, XcmContext, + Error as XcmError, InteriorLocation, Location, QueryId, Response, Result as XcmResult, Weight, + XcmContext, }; /// Define what needs to be done upon receiving a query response. pub trait OnResponse { /// Returns `true` if we are expecting a response from `origin` for query `query_id` that was /// queried by `querier`. - fn expecting_response( - origin: &MultiLocation, - query_id: u64, - querier: Option<&MultiLocation>, - ) -> bool; + fn expecting_response(origin: &Location, query_id: u64, querier: Option<&Location>) -> bool; /// Handler for receiving a `response` from `origin` relating to `query_id` initiated by /// `querier`. fn on_response( - origin: &MultiLocation, + origin: &Location, query_id: u64, - querier: Option<&MultiLocation>, + querier: Option<&Location>, response: Response, max_weight: Weight, context: &XcmContext, ) -> Weight; } impl OnResponse for () { - fn expecting_response( - _origin: &MultiLocation, - _query_id: u64, - _querier: Option<&MultiLocation>, - ) -> bool { + fn expecting_response(_origin: &Location, _query_id: u64, _querier: Option<&Location>) -> bool { false } fn on_response( - _origin: &MultiLocation, + _origin: &Location, _query_id: u64, - _querier: Option<&MultiLocation>, + _querier: Option<&Location>, _response: Response, _max_weight: Weight, _context: &XcmContext, @@ -79,7 +71,7 @@ pub trait VersionChangeNotifier { /// If the `location` has an ongoing notification and when this function is called, then an /// error should be returned. fn start( - location: &MultiLocation, + location: &Location, query_id: QueryId, max_weight: Weight, context: &XcmContext, @@ -87,20 +79,20 @@ pub trait VersionChangeNotifier { /// Stop notifying `location` should the XCM change. Returns an error if there is no existing /// notification set up. - fn stop(location: &MultiLocation, context: &XcmContext) -> XcmResult; + fn stop(location: &Location, context: &XcmContext) -> XcmResult; /// Return true if a location is subscribed to XCM version changes. - fn is_subscribed(location: &MultiLocation) -> bool; + fn is_subscribed(location: &Location) -> bool; } impl VersionChangeNotifier for () { - fn start(_: &MultiLocation, _: QueryId, _: Weight, _: &XcmContext) -> XcmResult { + fn start(_: &Location, _: QueryId, _: Weight, _: &XcmContext) -> XcmResult { Err(XcmError::Unimplemented) } - fn stop(_: &MultiLocation, _: &XcmContext) -> XcmResult { + fn stop(_: &Location, _: &XcmContext) -> XcmResult { Err(XcmError::Unimplemented) } - fn is_subscribed(_: &MultiLocation) -> bool { + fn is_subscribed(_: &Location) -> bool { false } } @@ -134,13 +126,13 @@ pub trait QueryHandler { + Copy; type BlockNumber: Zero + Encode; type Error; - type UniversalLocation: Get; + type UniversalLocation: Get; /// Attempt to create a new query ID and register it as a query that is yet to respond. fn new_query( - responder: impl Into, + responder: impl Into, timeout: Self::BlockNumber, - match_querier: impl Into, + match_querier: impl Into, ) -> QueryId; /// Consume `message` and return another which is equivalent to it except that it reports @@ -157,7 +149,7 @@ pub trait QueryHandler { /// The response can be queried with `take_response`. fn report_outcome( message: &mut Xcm<()>, - responder: impl Into, + responder: impl Into, timeout: Self::BlockNumber, ) -> result::Result; @@ -170,7 +162,7 @@ pub trait QueryHandler { } parameter_types! { - pub UniversalLocation: InteriorMultiLocation = Here; + pub UniversalLocation: InteriorLocation = Here; } impl QueryHandler for () { @@ -183,16 +175,16 @@ impl QueryHandler for () { QueryResponseStatus::NotFound } fn new_query( - _responder: impl Into, + _responder: impl Into, _timeout: Self::BlockNumber, - _match_querier: impl Into, + _match_querier: impl Into, ) -> Self::QueryId { 0u64 } fn report_outcome( _message: &mut Xcm<()>, - _responder: impl Into, + _responder: impl Into, _timeout: Self::BlockNumber, ) -> Result { Err(()) diff --git a/polkadot/xcm/xcm-executor/src/traits/should_execute.rs b/polkadot/xcm/xcm-executor/src/traits/should_execute.rs index d85458b5470..449e82b5a6e 100644 --- a/polkadot/xcm/xcm-executor/src/traits/should_execute.rs +++ b/polkadot/xcm/xcm-executor/src/traits/should_execute.rs @@ -16,7 +16,7 @@ use frame_support::traits::ProcessMessageError; use sp_std::result::Result; -use xcm::latest::{Instruction, MultiLocation, Weight, XcmHash}; +use xcm::latest::{Instruction, Location, Weight, XcmHash}; /// Properyies of an XCM message and its imminent execution. #[derive(Clone, Eq, PartialEq, Debug)] @@ -43,7 +43,7 @@ pub trait ShouldExecute { /// - `properties`: Various pre-established properties of the message which may be mutated by /// this API. fn should_execute( - origin: &MultiLocation, + origin: &Location, instructions: &mut [Instruction], max_weight: Weight, properties: &mut Properties, @@ -53,7 +53,7 @@ pub trait ShouldExecute { #[impl_trait_for_tuples::impl_for_tuples(30)] impl ShouldExecute for Tuple { fn should_execute( - origin: &MultiLocation, + origin: &Location, instructions: &mut [Instruction], max_weight: Weight, properties: &mut Properties, @@ -87,7 +87,7 @@ impl ShouldExecute for Tuple { /// if any of the tuple elements returns true. pub trait CheckSuspension { fn is_suspended( - origin: &MultiLocation, + origin: &Location, instructions: &mut [Instruction], max_weight: Weight, properties: &mut Properties, @@ -97,7 +97,7 @@ pub trait CheckSuspension { #[impl_trait_for_tuples::impl_for_tuples(30)] impl CheckSuspension for Tuple { fn is_suspended( - origin: &MultiLocation, + origin: &Location, instruction: &mut [Instruction], max_weight: Weight, properties: &mut Properties, diff --git a/polkadot/xcm/xcm-executor/src/traits/token_matching.rs b/polkadot/xcm/xcm-executor/src/traits/token_matching.rs index ad65a863021..e9a7e3ad845 100644 --- a/polkadot/xcm/xcm-executor/src/traits/token_matching.rs +++ b/polkadot/xcm/xcm-executor/src/traits/token_matching.rs @@ -18,12 +18,12 @@ use sp_std::result; use xcm::latest::prelude::*; pub trait MatchesFungible { - fn matches_fungible(a: &MultiAsset) -> Option; + fn matches_fungible(a: &Asset) -> Option; } #[impl_trait_for_tuples::impl_for_tuples(30)] impl MatchesFungible for Tuple { - fn matches_fungible(a: &MultiAsset) -> Option { + fn matches_fungible(a: &Asset) -> Option { for_tuples!( #( match Tuple::matches_fungible(a) { o @ Some(_) => return o, _ => () } )* ); @@ -33,12 +33,12 @@ impl MatchesFungible for Tuple { } pub trait MatchesNonFungible { - fn matches_nonfungible(a: &MultiAsset) -> Option; + fn matches_nonfungible(a: &Asset) -> Option; } #[impl_trait_for_tuples::impl_for_tuples(30)] impl MatchesNonFungible for Tuple { - fn matches_nonfungible(a: &MultiAsset) -> Option { + fn matches_nonfungible(a: &Asset) -> Option { for_tuples!( #( match Tuple::matches_nonfungible(a) { o @ Some(_) => return o, _ => () } )* ); @@ -52,11 +52,11 @@ impl MatchesNonFungible for Tuple { pub enum Error { /// The given asset is not handled. (According to [`XcmError::AssetNotFound`]) AssetNotHandled, - /// `MultiLocation` to `AccountId` conversion failed. + /// `Location` to `AccountId` conversion failed. AccountIdConversionFailed, /// `u128` amount to currency `Balance` conversion failed. AmountToBalanceConversionFailed, - /// `MultiLocation` to `AssetId`/`ClassId` conversion failed. + /// `Location` to `AssetId`/`ClassId` conversion failed. AssetIdConversionFailed, /// `AssetInstance` to non-fungibles instance ID conversion failed. InstanceConversionFailed, @@ -77,12 +77,12 @@ impl From for XcmError { } pub trait MatchesFungibles { - fn matches_fungibles(a: &MultiAsset) -> result::Result<(AssetId, Balance), Error>; + fn matches_fungibles(a: &Asset) -> result::Result<(AssetId, Balance), Error>; } #[impl_trait_for_tuples::impl_for_tuples(30)] impl MatchesFungibles for Tuple { - fn matches_fungibles(a: &MultiAsset) -> result::Result<(AssetId, Balance), Error> { + fn matches_fungibles(a: &Asset) -> result::Result<(AssetId, Balance), Error> { for_tuples!( #( match Tuple::matches_fungibles(a) { o @ Ok(_) => return o, _ => () } )* ); @@ -92,12 +92,12 @@ impl MatchesFungibles for Tuple { } pub trait MatchesNonFungibles { - fn matches_nonfungibles(a: &MultiAsset) -> result::Result<(AssetId, Instance), Error>; + fn matches_nonfungibles(a: &Asset) -> result::Result<(AssetId, Instance), Error>; } #[impl_trait_for_tuples::impl_for_tuples(30)] impl MatchesNonFungibles for Tuple { - fn matches_nonfungibles(a: &MultiAsset) -> result::Result<(AssetId, Instance), Error> { + fn matches_nonfungibles(a: &Asset) -> result::Result<(AssetId, Instance), Error> { for_tuples!( #( match Tuple::matches_nonfungibles(a) { o @ Ok(_) => return o, _ => () } )* ); diff --git a/polkadot/xcm/xcm-executor/src/traits/transact_asset.rs b/polkadot/xcm/xcm-executor/src/traits/transact_asset.rs index c51befff88a..e8a52d82568 100644 --- a/polkadot/xcm/xcm-executor/src/traits/transact_asset.rs +++ b/polkadot/xcm/xcm-executor/src/traits/transact_asset.rs @@ -14,14 +14,14 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -use crate::Assets; +use crate::AssetsInHolding; use sp_std::result::Result; -use xcm::latest::{Error as XcmError, MultiAsset, MultiLocation, Result as XcmResult, XcmContext}; +use xcm::latest::{Asset, Error as XcmError, Location, Result as XcmResult, XcmContext}; /// Facility for asset transacting. /// /// This should work with as many asset/location combinations as possible. Locations to support may -/// include non-account locations such as a `MultiLocation::X1(Junction::Parachain)`. Different +/// include non-account locations such as a `[Junction::Parachain]`. Different /// chains may handle them in different ways. /// /// Can be amalgamated as a tuple of items that implement this trait. In such executions, if any of @@ -31,11 +31,7 @@ pub trait TransactAsset { /// Ensure that `check_in` will do as expected. /// /// When composed as a tuple, all type-items are called and at least one must result in `Ok`. - fn can_check_in( - _origin: &MultiLocation, - _what: &MultiAsset, - _context: &XcmContext, - ) -> XcmResult { + fn can_check_in(_origin: &Location, _what: &Asset, _context: &XcmContext) -> XcmResult { Err(XcmError::Unimplemented) } @@ -56,16 +52,12 @@ pub trait TransactAsset { /// When composed as a tuple, all type-items are called. It is up to the implementer that there /// exists no value for `_what` which can cause side-effects for more than one of the /// type-items. - fn check_in(_origin: &MultiLocation, _what: &MultiAsset, _context: &XcmContext) {} + fn check_in(_origin: &Location, _what: &Asset, _context: &XcmContext) {} /// Ensure that `check_out` will do as expected. /// /// When composed as a tuple, all type-items are called and at least one must result in `Ok`. - fn can_check_out( - _dest: &MultiLocation, - _what: &MultiAsset, - _context: &XcmContext, - ) -> XcmResult { + fn can_check_out(_dest: &Location, _what: &Asset, _context: &XcmContext) -> XcmResult { Err(XcmError::Unimplemented) } @@ -82,16 +74,12 @@ pub trait TransactAsset { /// When composed as a tuple, all type-items are called. It is up to the implementer that there /// exists no value for `_what` which can cause side-effects for more than one of the /// type-items. - fn check_out(_dest: &MultiLocation, _what: &MultiAsset, _context: &XcmContext) {} + fn check_out(_dest: &Location, _what: &Asset, _context: &XcmContext) {} /// Deposit the `what` asset into the account of `who`. /// /// Implementations should return `XcmError::FailedToTransactAsset` if deposit failed. - fn deposit_asset( - _what: &MultiAsset, - _who: &MultiLocation, - _context: Option<&XcmContext>, - ) -> XcmResult { + fn deposit_asset(_what: &Asset, _who: &Location, _context: Option<&XcmContext>) -> XcmResult { Err(XcmError::Unimplemented) } @@ -104,10 +92,10 @@ pub trait TransactAsset { /// /// Implementations should return `XcmError::FailedToTransactAsset` if withdraw failed. fn withdraw_asset( - _what: &MultiAsset, - _who: &MultiLocation, + _what: &Asset, + _who: &Location, _maybe_context: Option<&XcmContext>, - ) -> Result { + ) -> Result { Err(XcmError::Unimplemented) } @@ -121,11 +109,11 @@ pub trait TransactAsset { /// turn has a default implementation that calls `internal_transfer_asset`. As such, **please /// do not call this method directly unless you know what you're doing**. fn internal_transfer_asset( - _asset: &MultiAsset, - _from: &MultiLocation, - _to: &MultiLocation, + _asset: &Asset, + _from: &Location, + _to: &Location, _context: &XcmContext, - ) -> Result { + ) -> Result { Err(XcmError::Unimplemented) } @@ -134,11 +122,11 @@ pub trait TransactAsset { /// Attempts to use `internal_transfer_asset` and if not available then falls back to using a /// two-part withdraw/deposit. fn transfer_asset( - asset: &MultiAsset, - from: &MultiLocation, - to: &MultiLocation, + asset: &Asset, + from: &Location, + to: &Location, context: &XcmContext, - ) -> Result { + ) -> Result { match Self::internal_transfer_asset(asset, from, to, context) { Err(XcmError::AssetNotFound | XcmError::Unimplemented) => { let assets = Self::withdraw_asset(asset, from, Some(context))?; @@ -153,7 +141,7 @@ pub trait TransactAsset { #[impl_trait_for_tuples::impl_for_tuples(30)] impl TransactAsset for Tuple { - fn can_check_in(origin: &MultiLocation, what: &MultiAsset, context: &XcmContext) -> XcmResult { + fn can_check_in(origin: &Location, what: &Asset, context: &XcmContext) -> XcmResult { for_tuples!( #( match Tuple::can_check_in(origin, what, context) { Err(XcmError::AssetNotFound) | Err(XcmError::Unimplemented) => (), @@ -170,13 +158,13 @@ impl TransactAsset for Tuple { Err(XcmError::AssetNotFound) } - fn check_in(origin: &MultiLocation, what: &MultiAsset, context: &XcmContext) { + fn check_in(origin: &Location, what: &Asset, context: &XcmContext) { for_tuples!( #( Tuple::check_in(origin, what, context); )* ); } - fn can_check_out(dest: &MultiLocation, what: &MultiAsset, context: &XcmContext) -> XcmResult { + fn can_check_out(dest: &Location, what: &Asset, context: &XcmContext) -> XcmResult { for_tuples!( #( match Tuple::can_check_out(dest, what, context) { Err(XcmError::AssetNotFound) | Err(XcmError::Unimplemented) => (), @@ -193,17 +181,13 @@ impl TransactAsset for Tuple { Err(XcmError::AssetNotFound) } - fn check_out(dest: &MultiLocation, what: &MultiAsset, context: &XcmContext) { + fn check_out(dest: &Location, what: &Asset, context: &XcmContext) { for_tuples!( #( Tuple::check_out(dest, what, context); )* ); } - fn deposit_asset( - what: &MultiAsset, - who: &MultiLocation, - context: Option<&XcmContext>, - ) -> XcmResult { + fn deposit_asset(what: &Asset, who: &Location, context: Option<&XcmContext>) -> XcmResult { for_tuples!( #( match Tuple::deposit_asset(what, who, context) { Err(XcmError::AssetNotFound) | Err(XcmError::Unimplemented) => (), @@ -221,10 +205,10 @@ impl TransactAsset for Tuple { } fn withdraw_asset( - what: &MultiAsset, - who: &MultiLocation, + what: &Asset, + who: &Location, maybe_context: Option<&XcmContext>, - ) -> Result { + ) -> Result { for_tuples!( #( match Tuple::withdraw_asset(what, who, maybe_context) { Err(XcmError::AssetNotFound) | Err(XcmError::Unimplemented) => (), @@ -242,11 +226,11 @@ impl TransactAsset for Tuple { } fn internal_transfer_asset( - what: &MultiAsset, - from: &MultiLocation, - to: &MultiLocation, + what: &Asset, + from: &Location, + to: &Location, context: &XcmContext, - ) -> Result { + ) -> Result { for_tuples!( #( match Tuple::internal_transfer_asset(what, from, to, context) { Err(XcmError::AssetNotFound) | Err(XcmError::Unimplemented) => (), @@ -275,133 +259,109 @@ mod tests { pub struct NotFoundTransactor; impl TransactAsset for NotFoundTransactor { - fn can_check_in( - _origin: &MultiLocation, - _what: &MultiAsset, - _context: &XcmContext, - ) -> XcmResult { + fn can_check_in(_origin: &Location, _what: &Asset, _context: &XcmContext) -> XcmResult { Err(XcmError::AssetNotFound) } - fn can_check_out( - _dest: &MultiLocation, - _what: &MultiAsset, - _context: &XcmContext, - ) -> XcmResult { + fn can_check_out(_dest: &Location, _what: &Asset, _context: &XcmContext) -> XcmResult { Err(XcmError::AssetNotFound) } fn deposit_asset( - _what: &MultiAsset, - _who: &MultiLocation, + _what: &Asset, + _who: &Location, _context: Option<&XcmContext>, ) -> XcmResult { Err(XcmError::AssetNotFound) } fn withdraw_asset( - _what: &MultiAsset, - _who: &MultiLocation, + _what: &Asset, + _who: &Location, _context: Option<&XcmContext>, - ) -> Result { + ) -> Result { Err(XcmError::AssetNotFound) } fn internal_transfer_asset( - _what: &MultiAsset, - _from: &MultiLocation, - _to: &MultiLocation, + _what: &Asset, + _from: &Location, + _to: &Location, _context: &XcmContext, - ) -> Result { + ) -> Result { Err(XcmError::AssetNotFound) } } pub struct OverflowTransactor; impl TransactAsset for OverflowTransactor { - fn can_check_in( - _origin: &MultiLocation, - _what: &MultiAsset, - _context: &XcmContext, - ) -> XcmResult { + fn can_check_in(_origin: &Location, _what: &Asset, _context: &XcmContext) -> XcmResult { Err(XcmError::Overflow) } - fn can_check_out( - _dest: &MultiLocation, - _what: &MultiAsset, - _context: &XcmContext, - ) -> XcmResult { + fn can_check_out(_dest: &Location, _what: &Asset, _context: &XcmContext) -> XcmResult { Err(XcmError::Overflow) } fn deposit_asset( - _what: &MultiAsset, - _who: &MultiLocation, + _what: &Asset, + _who: &Location, _context: Option<&XcmContext>, ) -> XcmResult { Err(XcmError::Overflow) } fn withdraw_asset( - _what: &MultiAsset, - _who: &MultiLocation, + _what: &Asset, + _who: &Location, _context: Option<&XcmContext>, - ) -> Result { + ) -> Result { Err(XcmError::Overflow) } fn internal_transfer_asset( - _what: &MultiAsset, - _from: &MultiLocation, - _to: &MultiLocation, + _what: &Asset, + _from: &Location, + _to: &Location, _context: &XcmContext, - ) -> Result { + ) -> Result { Err(XcmError::Overflow) } } pub struct SuccessfulTransactor; impl TransactAsset for SuccessfulTransactor { - fn can_check_in( - _origin: &MultiLocation, - _what: &MultiAsset, - _context: &XcmContext, - ) -> XcmResult { + fn can_check_in(_origin: &Location, _what: &Asset, _context: &XcmContext) -> XcmResult { Ok(()) } - fn can_check_out( - _dest: &MultiLocation, - _what: &MultiAsset, - _context: &XcmContext, - ) -> XcmResult { + fn can_check_out(_dest: &Location, _what: &Asset, _context: &XcmContext) -> XcmResult { Ok(()) } fn deposit_asset( - _what: &MultiAsset, - _who: &MultiLocation, + _what: &Asset, + _who: &Location, _context: Option<&XcmContext>, ) -> XcmResult { Ok(()) } fn withdraw_asset( - _what: &MultiAsset, - _who: &MultiLocation, + _what: &Asset, + _who: &Location, _context: Option<&XcmContext>, - ) -> Result { - Ok(Assets::default()) + ) -> Result { + Ok(AssetsInHolding::default()) } fn internal_transfer_asset( - _what: &MultiAsset, - _from: &MultiLocation, - _to: &MultiLocation, + _what: &Asset, + _from: &Location, + _to: &Location, _context: &XcmContext, - ) -> Result { - Ok(Assets::default()) + ) -> Result { + Ok(AssetsInHolding::default()) } } diff --git a/polkadot/xcm/xcm-executor/src/traits/weight.rs b/polkadot/xcm/xcm-executor/src/traits/weight.rs index bc40c10074f..efb9a2dfb6e 100644 --- a/polkadot/xcm/xcm-executor/src/traits/weight.rs +++ b/polkadot/xcm/xcm-executor/src/traits/weight.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . -use crate::Assets; +use crate::AssetsInHolding; use sp_std::result::Result; use xcm::latest::{prelude::*, Weight}; @@ -33,7 +33,7 @@ pub trait WeightBounds { /// message. pub trait UniversalWeigher { /// Get the upper limit of weight required for `dest` to execute `message`. - fn weigh(dest: impl Into, message: Xcm<()>) -> Result; + fn weigh(dest: impl Into, message: Xcm<()>) -> Result; } /// Charge for weight in order to execute XCM. @@ -52,15 +52,15 @@ pub trait WeightTrader: Sized { fn buy_weight( &mut self, weight: Weight, - payment: Assets, + payment: AssetsInHolding, context: &XcmContext, - ) -> Result; + ) -> Result; /// Attempt a refund of `weight` into some asset. The caller does not guarantee that the weight /// was purchased using `buy_weight`. /// /// Default implementation refunds nothing. - fn refund_weight(&mut self, _weight: Weight, _context: &XcmContext) -> Option { + fn refund_weight(&mut self, _weight: Weight, _context: &XcmContext) -> Option { None } } @@ -74,9 +74,9 @@ impl WeightTrader for Tuple { fn buy_weight( &mut self, weight: Weight, - payment: Assets, + payment: AssetsInHolding, context: &XcmContext, - ) -> Result { + ) -> Result { let mut too_expensive_error_found = false; let mut last_error = None; for_tuples!( #( @@ -102,7 +102,7 @@ impl WeightTrader for Tuple { }) } - fn refund_weight(&mut self, weight: Weight, context: &XcmContext) -> Option { + fn refund_weight(&mut self, weight: Weight, context: &XcmContext) -> Option { for_tuples!( #( if let Some(asset) = Tuple.refund_weight(weight, context) { return Some(asset); diff --git a/polkadot/xcm/xcm-simulator/example/src/lib.rs b/polkadot/xcm/xcm-simulator/example/src/lib.rs index 85b8ad1c5cb..d134957fbc1 100644 --- a/polkadot/xcm/xcm-simulator/example/src/lib.rs +++ b/polkadot/xcm/xcm-simulator/example/src/lib.rs @@ -148,7 +148,7 @@ mod tests { use xcm_simulator::TestExt; // Helper function for forming buy execution message - fn buy_execution(fees: impl Into) -> Instruction { + fn buy_execution(fees: impl Into) -> Instruction { BuyExecution { fees: fees.into(), weight_limit: Unlimited } } @@ -642,7 +642,7 @@ mod tests { parachain::MsgQueue::received_dmp(), vec![Xcm(vec![QueryResponse { query_id: query_id_set, - response: Response::Assets(MultiAssets::new()), + response: Response::Assets(Assets::new()), max_weight: Weight::from_parts(1_000_000_000, 1024 * 1024), querier: Some(Here.into()), }])], diff --git a/polkadot/xcm/xcm-simulator/example/src/parachain.rs b/polkadot/xcm/xcm-simulator/example/src/parachain.rs index 69db81deff4..0b6c573f464 100644 --- a/polkadot/xcm/xcm-simulator/example/src/parachain.rs +++ b/polkadot/xcm/xcm-simulator/example/src/parachain.rs @@ -115,8 +115,8 @@ impl pallet_balances::Config for Runtime { #[cfg(feature = "runtime-benchmarks")] pub struct UniquesHelper; #[cfg(feature = "runtime-benchmarks")] -impl pallet_uniques::BenchmarkHelper for UniquesHelper { - fn collection(i: u16) -> MultiLocation { +impl pallet_uniques::BenchmarkHelper for UniquesHelper { + fn collection(i: u16) -> Location { GeneralIndex(i as u128).into() } fn item(i: u16) -> AssetInstance { @@ -126,7 +126,7 @@ impl pallet_uniques::BenchmarkHelper for UniquesHe impl pallet_uniques::Config for Runtime { type RuntimeEvent = RuntimeEvent; - type CollectionId = MultiLocation; + type CollectionId = Location; type ItemId = AssetInstance; type Currency = Balances; type CreateOrigin = ForeignCreators; @@ -148,12 +148,12 @@ impl pallet_uniques::Config for Runtime { // `EnsureOriginWithArg` impl for `CreateOrigin` which allows only XCM origins // which are locations containing the class location. pub struct ForeignCreators; -impl EnsureOriginWithArg for ForeignCreators { +impl EnsureOriginWithArg for ForeignCreators { type Success = AccountId; fn try_origin( o: RuntimeOrigin, - a: &MultiLocation, + a: &Location, ) -> sp_std::result::Result { let origin_location = pallet_xcm::EnsureXcm::::try_origin(o.clone())?; if !a.starts_with(&origin_location) { @@ -163,8 +163,8 @@ impl EnsureOriginWithArg for ForeignCreators { } #[cfg(feature = "runtime-benchmarks")] - fn try_successful_origin(a: &MultiLocation) -> Result { - Ok(pallet_xcm::Origin::Xcm(*a).into()) + fn try_successful_origin(a: &Location) -> Result { + Ok(pallet_xcm::Origin::Xcm(a.clone()).into()) } } @@ -174,9 +174,9 @@ parameter_types! { } parameter_types! { - pub const KsmLocation: MultiLocation = MultiLocation::parent(); + pub const KsmLocation: Location = Location::parent(); pub const RelayNetwork: NetworkId = NetworkId::Kusama; - pub UniversalLocation: InteriorMultiLocation = Parachain(MsgQueue::parachain_id().into()).into(); + pub UniversalLocation: InteriorLocation = Parachain(MsgQueue::parachain_id().into()).into(); } pub type LocationToAccountId = ( @@ -194,17 +194,17 @@ pub type XcmOriginToCallOrigin = ( parameter_types! { pub const UnitWeightCost: Weight = Weight::from_parts(1, 1); - pub KsmPerSecondPerByte: (AssetId, u128, u128) = (Concrete(Parent.into()), 1, 1); + pub KsmPerSecondPerByte: (AssetId, u128, u128) = (AssetId(Parent.into()), 1, 1); pub const MaxInstructions: u32 = 100; pub const MaxAssetsIntoHolding: u32 = 64; - pub ForeignPrefix: MultiLocation = (Parent,).into(); + pub ForeignPrefix: Location = (Parent,).into(); } pub type LocalAssetTransactor = ( FungibleAdapter, LocationToAccountId, AccountId, ()>, NonFungiblesAdapter< ForeignUniques, - ConvertedConcreteId, + ConvertedConcreteId, SovereignAccountOf, AccountId, NoChecking, @@ -216,9 +216,9 @@ pub type XcmRouter = super::ParachainXcmRouter; pub type Barrier = AllowUnpaidExecutionFrom; parameter_types! { - pub NftCollectionOne: MultiAssetFilter - = Wild(AllOf { fun: WildNonFungible, id: Concrete((Parent, GeneralIndex(1)).into()) }); - pub NftCollectionOneForRelay: (MultiAssetFilter, MultiLocation) + pub NftCollectionOne: AssetFilter + = Wild(AllOf { fun: WildNonFungible, id: AssetId((Parent, GeneralIndex(1)).into()) }); + pub NftCollectionOneForRelay: (AssetFilter, Location) = (NftCollectionOne::get(), (Parent,).into()); } pub type TrustedTeleporters = xcm_builder::Case; @@ -321,16 +321,23 @@ pub mod mock_msg_queue { max_weight: Weight, ) -> Result { let hash = Encode::using_encoded(&xcm, T::Hashing::hash); - let message_hash = Encode::using_encoded(&xcm, sp_io::hashing::blake2_256); + let mut message_hash = Encode::using_encoded(&xcm, sp_io::hashing::blake2_256); let (result, event) = match Xcm::::try_from(xcm) { Ok(xcm) => { let location = (Parent, Parachain(sender.into())); - match T::XcmExecutor::execute_xcm(location, xcm, message_hash, max_weight) { - Outcome::Error(e) => (Err(e), Event::Fail(Some(hash), e)), - Outcome::Complete(w) => (Ok(w), Event::Success(Some(hash))), + match T::XcmExecutor::prepare_and_execute( + location, + xcm, + &mut message_hash, + max_weight, + Weight::zero(), + ) { + Outcome::Error { error } => (Err(error), Event::Fail(Some(hash), error)), + Outcome::Complete { used } => (Ok(used), Event::Success(Some(hash))), // As far as the caller is concerned, this was dispatched without error, so // we just report the weight used. - Outcome::Incomplete(w, e) => (Ok(w), Event::Fail(Some(hash), e)), + Outcome::Incomplete { used, error } => + (Ok(used), Event::Fail(Some(hash), error)), } }, Err(()) => (Err(XcmError::UnhandledXcmVersion), Event::BadVersion(Some(hash))), @@ -371,7 +378,7 @@ pub mod mock_msg_queue { limit: Weight, ) -> Weight { for (_i, (_sent_at, data)) in iter.enumerate() { - let id = sp_io::hashing::blake2_256(&data[..]); + let mut id = sp_io::hashing::blake2_256(&data[..]); let maybe_versioned = VersionedXcm::::decode(&mut &data[..]); match maybe_versioned { Err(_) => { @@ -380,7 +387,13 @@ pub mod mock_msg_queue { Ok(versioned) => match Xcm::try_from(versioned) { Err(()) => Self::deposit_event(Event::UnsupportedVersion(id)), Ok(x) => { - let outcome = T::XcmExecutor::execute_xcm(Parent, x.clone(), id, limit); + let outcome = T::XcmExecutor::prepare_and_execute( + Parent, + x.clone(), + &mut id, + limit, + Weight::zero(), + ); >::append(x); Self::deposit_event(Event::ExecutedDownward(id, outcome)); }, @@ -400,17 +413,15 @@ impl mock_msg_queue::Config for Runtime { pub type LocalOriginToLocation = SignedToAccountId32; pub struct TrustedLockerCase(PhantomData); -impl> ContainsPair - for TrustedLockerCase -{ - fn contains(origin: &MultiLocation, asset: &MultiAsset) -> bool { +impl> ContainsPair for TrustedLockerCase { + fn contains(origin: &Location, asset: &Asset) -> bool { let (o, a) = T::get(); a.matches(asset) && &o == origin } } parameter_types! { - pub RelayTokenForRelay: (MultiLocation, MultiAssetFilter) = (Parent.into(), Wild(AllOf { id: Concrete(Parent.into()), fun: WildFungible })); + pub RelayTokenForRelay: (Location, AssetFilter) = (Parent.into(), Wild(AllOf { id: AssetId(Parent.into()), fun: WildFungible })); } pub type TrustedLockers = TrustedLockerCase; diff --git a/polkadot/xcm/xcm-simulator/example/src/relay_chain.rs b/polkadot/xcm/xcm-simulator/example/src/relay_chain.rs index 24fc56eb717..1bcbe6da2cd 100644 --- a/polkadot/xcm/xcm-simulator/example/src/relay_chain.rs +++ b/polkadot/xcm/xcm-simulator/example/src/relay_chain.rs @@ -127,10 +127,10 @@ impl configuration::Config for Runtime { } parameter_types! { - pub const TokenLocation: MultiLocation = Here.into_location(); + pub const TokenLocation: Location = Here.into_location(); pub RelayNetwork: NetworkId = ByGenesis([0; 32]); pub const AnyNetwork: Option = None; - pub UniversalLocation: InteriorMultiLocation = Here; + pub UniversalLocation: InteriorLocation = Here; pub UnitWeightCost: u64 = 1_000; } @@ -162,7 +162,7 @@ type LocalOriginConverter = ( parameter_types! { pub const BaseXcmWeight: Weight = Weight::from_parts(1_000, 1_000); pub TokensPerSecondPerByte: (AssetId, u128, u128) = - (Concrete(TokenLocation::get()), 1_000_000_000_000, 1024 * 1024); + (AssetId(TokenLocation::get()), 1_000_000_000_000, 1024 * 1024); pub const MaxInstructions: u32 = 100; pub const MaxAssetsIntoHolding: u32 = 64; } diff --git a/polkadot/xcm/xcm-simulator/fuzzer/src/fuzz.rs b/polkadot/xcm/xcm-simulator/fuzzer/src/fuzz.rs index 0893c7c086f..7026d5467c8 100644 --- a/polkadot/xcm/xcm-simulator/fuzzer/src/fuzz.rs +++ b/polkadot/xcm/xcm-simulator/fuzzer/src/fuzz.rs @@ -158,7 +158,7 @@ fn run_input(xcm_messages: [XcmMessage; 5]) { if xcm_message.source % 4 == 0 { // We get the destination for the message let parachain_id = (xcm_message.destination % 3) + 1; - let destination: MultiLocation = Parachain(parachain_id).into(); + let destination: Location = Parachain(parachain_id).into(); #[cfg(not(fuzzing))] { println!(" source: Relay Chain"); @@ -176,7 +176,7 @@ fn run_input(xcm_messages: [XcmMessage; 5]) { _ => ParaC::execute_with, }; // We get the destination for the message - let destination: MultiLocation = match xcm_message.destination % 4 { + let destination: Location = match xcm_message.destination % 4 { n @ 1..=3 => (Parent, Parachain(n)).into(), _ => Parent.into(), }; diff --git a/polkadot/xcm/xcm-simulator/fuzzer/src/parachain.rs b/polkadot/xcm/xcm-simulator/fuzzer/src/parachain.rs index 2262d18e860..41fc5af9708 100644 --- a/polkadot/xcm/xcm-simulator/fuzzer/src/parachain.rs +++ b/polkadot/xcm/xcm-simulator/fuzzer/src/parachain.rs @@ -109,9 +109,9 @@ parameter_types! { } parameter_types! { - pub const KsmLocation: MultiLocation = MultiLocation::parent(); + pub const KsmLocation: Location = Location::parent(); pub const RelayNetwork: NetworkId = NetworkId::Kusama; - pub UniversalLocation: InteriorMultiLocation = Parachain(MsgQueue::parachain_id().into()).into(); + pub UniversalLocation: InteriorLocation = Parachain(MsgQueue::parachain_id().into()).into(); } pub type LocationToAccountId = ( @@ -128,7 +128,7 @@ pub type XcmOriginToCallOrigin = ( parameter_types! { pub const UnitWeightCost: Weight = Weight::from_parts(1, 1); - pub KsmPerSecondPerByte: (AssetId, u128, u128) = (Concrete(Parent.into()), 1, 1); + pub KsmPerSecondPerByte: (AssetId, u128, u128) = (AssetId(Parent.into()), 1, 1); pub const MaxInstructions: u32 = 100; pub const MaxAssetsIntoHolding: u32 = 64; } @@ -237,16 +237,23 @@ pub mod mock_msg_queue { max_weight: Weight, ) -> Result { let hash = Encode::using_encoded(&xcm, T::Hashing::hash); - let message_hash = xcm.using_encoded(sp_io::hashing::blake2_256); + let mut message_hash = xcm.using_encoded(sp_io::hashing::blake2_256); let (result, event) = match Xcm::::try_from(xcm) { Ok(xcm) => { - let location = MultiLocation::new(1, X1(Parachain(sender.into()))); - match T::XcmExecutor::execute_xcm(location, xcm, message_hash, max_weight) { - Outcome::Error(e) => (Err(e), Event::Fail(Some(hash), e)), - Outcome::Complete(w) => (Ok(w), Event::Success(Some(hash))), + let location = Location::new(1, [Parachain(sender.into())]); + match T::XcmExecutor::prepare_and_execute( + location, + xcm, + &mut message_hash, + max_weight, + Weight::zero(), + ) { + Outcome::Error { error } => (Err(error), Event::Fail(Some(hash), error)), + Outcome::Complete { used } => (Ok(used), Event::Success(Some(hash))), // As far as the caller is concerned, this was dispatched without error, so // we just report the weight used. - Outcome::Incomplete(w, e) => (Ok(w), Event::Fail(Some(hash), e)), + Outcome::Incomplete { used, error } => + (Ok(used), Event::Fail(Some(hash), error)), } }, Err(()) => (Err(XcmError::UnhandledXcmVersion), Event::BadVersion(Some(hash))), @@ -287,7 +294,7 @@ pub mod mock_msg_queue { limit: Weight, ) -> Weight { for (_i, (_sent_at, data)) in iter.enumerate() { - let id = sp_io::hashing::blake2_256(&data[..]); + let mut id = sp_io::hashing::blake2_256(&data[..]); let maybe_msg = VersionedXcm::::decode(&mut &data[..]) .map(Xcm::::try_from); match maybe_msg { @@ -298,7 +305,13 @@ pub mod mock_msg_queue { Self::deposit_event(Event::UnsupportedVersion(id)); }, Ok(Ok(x)) => { - let outcome = T::XcmExecutor::execute_xcm(Parent, x.clone(), id, limit); + let outcome = T::XcmExecutor::prepare_and_execute( + Parent, + x.clone(), + &mut id, + limit, + Weight::zero(), + ); >::append(x); Self::deposit_event(Event::ExecutedDownward(id, outcome)); }, diff --git a/polkadot/xcm/xcm-simulator/fuzzer/src/relay_chain.rs b/polkadot/xcm/xcm-simulator/fuzzer/src/relay_chain.rs index bbf4f1e6cc5..c066cc5e813 100644 --- a/polkadot/xcm/xcm-simulator/fuzzer/src/relay_chain.rs +++ b/polkadot/xcm/xcm-simulator/fuzzer/src/relay_chain.rs @@ -107,10 +107,10 @@ impl configuration::Config for Runtime { } parameter_types! { - pub const TokenLocation: MultiLocation = Here.into_location(); + pub const TokenLocation: Location = Here.into_location(); pub const ThisNetwork: NetworkId = NetworkId::ByGenesis([0; 32]); pub const AnyNetwork: Option = None; - pub const UniversalLocation: InteriorMultiLocation = Here; + pub const UniversalLocation: InteriorLocation = Here; } pub type SovereignAccountOf = @@ -129,7 +129,7 @@ type LocalOriginConverter = ( parameter_types! { pub const BaseXcmWeight: Weight = Weight::from_parts(1_000, 1_000); - pub KsmPerSecondPerByte: (AssetId, u128, u128) = (Concrete(TokenLocation::get()), 1, 1); + pub KsmPerSecondPerByte: (AssetId, u128, u128) = (AssetId(TokenLocation::get()), 1, 1); pub const MaxInstructions: u32 = u32::MAX; pub const MaxAssetsIntoHolding: u32 = 64; } diff --git a/polkadot/xcm/xcm-simulator/src/lib.rs b/polkadot/xcm/xcm-simulator/src/lib.rs index b38465b3d4a..7efbc658bbf 100644 --- a/polkadot/xcm/xcm-simulator/src/lib.rs +++ b/polkadot/xcm/xcm-simulator/src/lib.rs @@ -258,9 +258,9 @@ macro_rules! __impl_ext { } thread_local! { - pub static PARA_MESSAGE_BUS: RefCell)>> + pub static PARA_MESSAGE_BUS: RefCell)>> = RefCell::new(VecDeque::new()); - pub static RELAY_MESSAGE_BUS: RefCell)>> + pub static RELAY_MESSAGE_BUS: RefCell)>> = RefCell::new(VecDeque::new()); } @@ -318,8 +318,8 @@ macro_rules! decl_test_network { while let Some((para_id, destination, message)) = $crate::PARA_MESSAGE_BUS.with( |b| b.borrow_mut().pop_front()) { - match destination.interior() { - $crate::Junctions::Here if destination.parent_count() == 1 => { + match destination.unpack() { + (1, []) => { let encoded = $crate::encode_xcm(message, $crate::MessageKind::Ump); let mut _id = [0; 32]; let r = <$relay_chain>::process_message( @@ -336,7 +336,7 @@ macro_rules! decl_test_network { } }, $( - $crate::X1($crate::Parachain(id)) if *id == $para_id && destination.parent_count() == 1 => { + (1, [$crate::Parachain(id)]) if *id == $para_id => { let encoded = $crate::encode_xcm(message, $crate::MessageKind::Xcmp); let messages = vec![(para_id, 1, &encoded[..])]; let _weight = <$parachain>::handle_xcmp_messages( @@ -360,9 +360,9 @@ macro_rules! decl_test_network { while let Some((destination, message)) = $crate::RELAY_MESSAGE_BUS.with( |b| b.borrow_mut().pop_front()) { - match destination.interior() { + match destination.unpack() { $( - $crate::X1($crate::Parachain(id)) if *id == $para_id && destination.parent_count() == 0 => { + (0, [$crate::Parachain(id)]) if *id == $para_id => { let encoded = $crate::encode_xcm(message, $crate::MessageKind::Dmp); // NOTE: RelayChainBlockNumber is hard-coded to 1 let messages = vec![(1, encoded)]; @@ -382,18 +382,18 @@ macro_rules! decl_test_network { pub struct ParachainXcmRouter($crate::PhantomData); impl> $crate::SendXcm for ParachainXcmRouter { - type Ticket = ($crate::ParaId, $crate::MultiLocation, $crate::Xcm<()>); + type Ticket = ($crate::ParaId, $crate::Location, $crate::Xcm<()>); fn validate( - destination: &mut Option<$crate::MultiLocation>, + destination: &mut Option<$crate::Location>, message: &mut Option<$crate::Xcm<()>>, - ) -> $crate::SendResult<($crate::ParaId, $crate::MultiLocation, $crate::Xcm<()>)> { + ) -> $crate::SendResult<($crate::ParaId, $crate::Location, $crate::Xcm<()>)> { use $crate::XcmpMessageHandlerT; let d = destination.take().ok_or($crate::SendError::MissingArgument)?; - match (d.interior(), d.parent_count()) { - ($crate::Junctions::Here, 1) => {}, + match d.unpack() { + (1, []) => {}, $( - ($crate::X1($crate::Parachain(id)), 1) if id == &$para_id => {} + (1, [$crate::Parachain(id)]) if id == &$para_id => {} )* _ => { *destination = Some(d); @@ -401,10 +401,10 @@ macro_rules! decl_test_network { }, } let m = message.take().ok_or($crate::SendError::MissingArgument)?; - Ok(((T::get(), d, m), $crate::MultiAssets::new())) + Ok(((T::get(), d, m), $crate::Assets::new())) } fn deliver( - triple: ($crate::ParaId, $crate::MultiLocation, $crate::Xcm<()>), + triple: ($crate::ParaId, $crate::Location, $crate::Xcm<()>), ) -> Result<$crate::XcmHash, $crate::SendError> { let hash = $crate::fake_message_hash(&triple.2); $crate::PARA_MESSAGE_BUS.with(|b| b.borrow_mut().push_back(triple)); @@ -415,17 +415,17 @@ macro_rules! decl_test_network { /// XCM router for relay chain. pub struct RelayChainXcmRouter; impl $crate::SendXcm for RelayChainXcmRouter { - type Ticket = ($crate::MultiLocation, $crate::Xcm<()>); + type Ticket = ($crate::Location, $crate::Xcm<()>); fn validate( - destination: &mut Option<$crate::MultiLocation>, + destination: &mut Option<$crate::Location>, message: &mut Option<$crate::Xcm<()>>, - ) -> $crate::SendResult<($crate::MultiLocation, $crate::Xcm<()>)> { + ) -> $crate::SendResult<($crate::Location, $crate::Xcm<()>)> { use $crate::DmpMessageHandlerT; let d = destination.take().ok_or($crate::SendError::MissingArgument)?; - match (d.interior(), d.parent_count()) { + match d.unpack() { $( - ($crate::X1($crate::Parachain(id)), 0) if id == &$para_id => {}, + (0, [$crate::Parachain(id)]) if id == &$para_id => {}, )* _ => { *destination = Some(d); @@ -433,10 +433,10 @@ macro_rules! decl_test_network { }, } let m = message.take().ok_or($crate::SendError::MissingArgument)?; - Ok(((d, m), $crate::MultiAssets::new())) + Ok(((d, m), $crate::Assets::new())) } fn deliver( - pair: ($crate::MultiLocation, $crate::Xcm<()>), + pair: ($crate::Location, $crate::Xcm<()>), ) -> Result<$crate::XcmHash, $crate::SendError> { let hash = $crate::fake_message_hash(&pair.1); $crate::RELAY_MESSAGE_BUS.with(|b| b.borrow_mut().push_back(pair)); diff --git a/prdoc/pr_1230.prdoc b/prdoc/pr_1230.prdoc new file mode 100644 index 00000000000..8eea1816cb5 --- /dev/null +++ b/prdoc/pr_1230.prdoc @@ -0,0 +1,20 @@ +title: XCMv4 + +doc: + - audience: Runtime Dev + description: | + A new version of the XCM format. + The main changes are: + - Removed `Multi` prefix from types + - Removed `Abstract` asset id + - `Outcome` is now a named fields struct + - Added `Reanchorable` trait, implemented for both `Location` and `Asset` + - New syntax for building `Location`s and `Junction`s using slices. + You build them like `let location = Location::new(1, [Parachain(1000), PalletInstance(50), GeneralIndex(1984)]);` + and match on them like `match location.unpack() { + (1, [Parachain(id)]) => ... + (0, Here) => ..., + (1, [_]) => ..., + }` + +crates: [] diff --git a/substrate/frame/assets/src/benchmarking.rs b/substrate/frame/assets/src/benchmarking.rs index 8fe5a7e2493..1b65bb953d7 100644 --- a/substrate/frame/assets/src/benchmarking.rs +++ b/substrate/frame/assets/src/benchmarking.rs @@ -45,7 +45,7 @@ fn create_default_asset, I: 'static>( let root = SystemOrigin::Root.into(); assert!(Assets::::force_create( root, - asset_id, + asset_id.clone(), caller_lookup.clone(), is_sufficient, 1u32.into(), @@ -64,7 +64,7 @@ pub fn create_default_minted_asset, I: 'static>( } assert!(Assets::::mint( SystemOrigin::Signed(caller.clone()).into(), - asset_id, + asset_id.clone(), caller_lookup.clone(), amount, ) @@ -91,7 +91,7 @@ fn add_sufficients, I: 'static>(minter: T::AccountId, n: u32) { let target_lookup = T::Lookup::unlookup(target); assert!(Assets::::mint( origin.clone().into(), - asset_id, + asset_id.clone(), target_lookup, 100u32.into() ) @@ -108,8 +108,13 @@ fn add_approvals, I: 'static>(minter: T::AccountId, n: u32) { ); let minter_lookup = T::Lookup::unlookup(minter.clone()); let origin = SystemOrigin::Signed(minter); - Assets::::mint(origin.clone().into(), asset_id, minter_lookup, (100 * (n + 1)).into()) - .unwrap(); + Assets::::mint( + origin.clone().into(), + asset_id.clone(), + minter_lookup, + (100 * (n + 1)).into(), + ) + .unwrap(); let enough = T::Currency::minimum_balance(); for i in 0..n { let target = account("approval", i, SEED); @@ -117,7 +122,7 @@ fn add_approvals, I: 'static>(minter: T::AccountId, n: u32) { let target_lookup = T::Lookup::unlookup(target); Assets::::approve_transfer( origin.clone().into(), - asset_id, + asset_id.clone(), target_lookup, 100u32.into(), ) @@ -136,12 +141,12 @@ fn assert_event, I: 'static>(generic_event: >::Runti benchmarks_instance_pallet! { create { let asset_id = default_asset_id::(); - let origin = T::CreateOrigin::try_successful_origin(&asset_id.into()) + let origin = T::CreateOrigin::try_successful_origin(&asset_id.clone().into()) .map_err(|_| BenchmarkError::Weightless)?; - let caller = T::CreateOrigin::ensure_origin(origin.clone(), &asset_id.into()).unwrap(); + let caller = T::CreateOrigin::ensure_origin(origin.clone(), &asset_id.clone().into()).unwrap(); let caller_lookup = T::Lookup::unlookup(caller.clone()); T::Currency::make_free_balance_be(&caller, DepositBalanceOf::::max_value()); - }: _(origin, asset_id, caller_lookup, 1u32.into()) + }: _(origin, asset_id.clone(), caller_lookup, 1u32.into()) verify { assert_last_event::(Event::Created { asset_id: asset_id.into(), creator: caller.clone(), owner: caller }.into()); } @@ -150,7 +155,7 @@ benchmarks_instance_pallet! { let asset_id = default_asset_id::(); let caller: T::AccountId = whitelisted_caller(); let caller_lookup = T::Lookup::unlookup(caller.clone()); - }: _(SystemOrigin::Root, asset_id, caller_lookup, true, 1u32.into()) + }: _(SystemOrigin::Root, asset_id.clone(), caller_lookup, true, 1u32.into()) verify { assert_last_event::(Event::ForceCreated { asset_id: asset_id.into(), owner: caller }.into()); } @@ -159,9 +164,9 @@ benchmarks_instance_pallet! { let (asset_id, caller, caller_lookup) = create_default_minted_asset::(true, 100u32.into()); Assets::::freeze_asset( SystemOrigin::Signed(caller.clone()).into(), - asset_id, + asset_id.clone(), )?; - }:_(SystemOrigin::Signed(caller), asset_id) + }:_(SystemOrigin::Signed(caller), asset_id.clone()) verify { assert_last_event::(Event::DestructionStarted { asset_id: asset_id.into() }.into()); } @@ -172,10 +177,10 @@ benchmarks_instance_pallet! { add_sufficients::(caller.clone(), c); Assets::::freeze_asset( SystemOrigin::Signed(caller.clone()).into(), - asset_id, + asset_id.clone(), )?; - Assets::::start_destroy(SystemOrigin::Signed(caller.clone()).into(), asset_id)?; - }:_(SystemOrigin::Signed(caller), asset_id) + Assets::::start_destroy(SystemOrigin::Signed(caller.clone()).into(), asset_id.clone())?; + }:_(SystemOrigin::Signed(caller), asset_id.clone()) verify { assert_last_event::(Event::AccountsDestroyed { asset_id: asset_id.into(), @@ -190,10 +195,10 @@ benchmarks_instance_pallet! { add_approvals::(caller.clone(), a); Assets::::freeze_asset( SystemOrigin::Signed(caller.clone()).into(), - asset_id, + asset_id.clone(), )?; - Assets::::start_destroy(SystemOrigin::Signed(caller.clone()).into(), asset_id)?; - }:_(SystemOrigin::Signed(caller), asset_id) + Assets::::start_destroy(SystemOrigin::Signed(caller.clone()).into(), asset_id.clone())?; + }:_(SystemOrigin::Signed(caller), asset_id.clone()) verify { assert_last_event::(Event::ApprovalsDestroyed { asset_id: asset_id.into(), @@ -206,10 +211,10 @@ benchmarks_instance_pallet! { let (asset_id, caller, caller_lookup) = create_default_asset::(true); Assets::::freeze_asset( SystemOrigin::Signed(caller.clone()).into(), - asset_id, + asset_id.clone(), )?; - Assets::::start_destroy(SystemOrigin::Signed(caller.clone()).into(), asset_id)?; - }:_(SystemOrigin::Signed(caller), asset_id) + Assets::::start_destroy(SystemOrigin::Signed(caller.clone()).into(), asset_id.clone())?; + }:_(SystemOrigin::Signed(caller), asset_id.clone()) verify { assert_last_event::(Event::Destroyed { asset_id: asset_id.into(), @@ -220,7 +225,7 @@ benchmarks_instance_pallet! { mint { let (asset_id, caller, caller_lookup) = create_default_asset::(true); let amount = T::Balance::from(100u32); - }: _(SystemOrigin::Signed(caller.clone()), asset_id, caller_lookup, amount) + }: _(SystemOrigin::Signed(caller.clone()), asset_id.clone(), caller_lookup, amount) verify { assert_last_event::(Event::Issued { asset_id: asset_id.into(), owner: caller, amount }.into()); } @@ -228,7 +233,7 @@ benchmarks_instance_pallet! { burn { let amount = T::Balance::from(100u32); let (asset_id, caller, caller_lookup) = create_default_minted_asset::(true, amount); - }: _(SystemOrigin::Signed(caller.clone()), asset_id, caller_lookup, amount) + }: _(SystemOrigin::Signed(caller.clone()), asset_id.clone(), caller_lookup, amount) verify { assert_last_event::(Event::Burned { asset_id: asset_id.into(), owner: caller, balance: amount }.into()); } @@ -238,7 +243,7 @@ benchmarks_instance_pallet! { let (asset_id, caller, caller_lookup) = create_default_minted_asset::(true, amount); let target: T::AccountId = account("target", 0, SEED); let target_lookup = T::Lookup::unlookup(target.clone()); - }: _(SystemOrigin::Signed(caller.clone()), asset_id, target_lookup, amount) + }: _(SystemOrigin::Signed(caller.clone()), asset_id.clone(), target_lookup, amount) verify { assert_last_event::(Event::Transferred { asset_id: asset_id.into(), from: caller, to: target, amount }.into()); } @@ -249,7 +254,7 @@ benchmarks_instance_pallet! { let (asset_id, caller, caller_lookup) = create_default_minted_asset::(true, mint_amount); let target: T::AccountId = account("target", 0, SEED); let target_lookup = T::Lookup::unlookup(target.clone()); - }: _(SystemOrigin::Signed(caller.clone()), asset_id, target_lookup, amount) + }: _(SystemOrigin::Signed(caller.clone()), asset_id.clone(), target_lookup, amount) verify { assert!(frame_system::Pallet::::account_exists(&caller)); assert_last_event::(Event::Transferred { asset_id: asset_id.into(), from: caller, to: target, amount }.into()); @@ -260,7 +265,7 @@ benchmarks_instance_pallet! { let (asset_id, caller, caller_lookup) = create_default_minted_asset::(true, amount); let target: T::AccountId = account("target", 0, SEED); let target_lookup = T::Lookup::unlookup(target.clone()); - }: _(SystemOrigin::Signed(caller.clone()), asset_id, caller_lookup, target_lookup, amount) + }: _(SystemOrigin::Signed(caller.clone()), asset_id.clone(), caller_lookup, target_lookup, amount) verify { assert_last_event::( Event::Transferred { asset_id: asset_id.into(), from: caller, to: target, amount }.into() @@ -269,7 +274,7 @@ benchmarks_instance_pallet! { freeze { let (asset_id, caller, caller_lookup) = create_default_minted_asset::(true, 100u32.into()); - }: _(SystemOrigin::Signed(caller.clone()), asset_id, caller_lookup) + }: _(SystemOrigin::Signed(caller.clone()), asset_id.clone(), caller_lookup) verify { assert_last_event::(Event::Frozen { asset_id: asset_id.into(), who: caller }.into()); } @@ -278,17 +283,17 @@ benchmarks_instance_pallet! { let (asset_id, caller, caller_lookup) = create_default_minted_asset::(true, 100u32.into()); Assets::::freeze( SystemOrigin::Signed(caller.clone()).into(), - asset_id, + asset_id.clone(), caller_lookup.clone(), )?; - }: _(SystemOrigin::Signed(caller.clone()), asset_id, caller_lookup) + }: _(SystemOrigin::Signed(caller.clone()), asset_id.clone(), caller_lookup) verify { assert_last_event::(Event::Thawed { asset_id: asset_id.into(), who: caller }.into()); } freeze_asset { let (asset_id, caller, caller_lookup) = create_default_minted_asset::(true, 100u32.into()); - }: _(SystemOrigin::Signed(caller.clone()), asset_id) + }: _(SystemOrigin::Signed(caller.clone()), asset_id.clone()) verify { assert_last_event::(Event::AssetFrozen { asset_id: asset_id.into() }.into()); } @@ -297,9 +302,9 @@ benchmarks_instance_pallet! { let (asset_id, caller, caller_lookup) = create_default_minted_asset::(true, 100u32.into()); Assets::::freeze_asset( SystemOrigin::Signed(caller.clone()).into(), - asset_id, + asset_id.clone(), )?; - }: _(SystemOrigin::Signed(caller.clone()), asset_id) + }: _(SystemOrigin::Signed(caller.clone()), asset_id.clone()) verify { assert_last_event::(Event::AssetThawed { asset_id: asset_id.into() }.into()); } @@ -308,7 +313,7 @@ benchmarks_instance_pallet! { let (asset_id, caller, _) = create_default_asset::(true); let target: T::AccountId = account("target", 0, SEED); let target_lookup = T::Lookup::unlookup(target.clone()); - }: _(SystemOrigin::Signed(caller), asset_id, target_lookup) + }: _(SystemOrigin::Signed(caller), asset_id.clone(), target_lookup) verify { assert_last_event::(Event::OwnerChanged { asset_id: asset_id.into(), owner: target }.into()); } @@ -318,7 +323,7 @@ benchmarks_instance_pallet! { let target0 = T::Lookup::unlookup(account("target", 0, SEED)); let target1 = T::Lookup::unlookup(account("target", 1, SEED)); let target2 = T::Lookup::unlookup(account("target", 2, SEED)); - }: _(SystemOrigin::Signed(caller), asset_id, target0, target1, target2) + }: _(SystemOrigin::Signed(caller), asset_id.clone(), target0, target1, target2) verify { assert_last_event::(Event::TeamChanged { asset_id: asset_id.into(), @@ -338,7 +343,7 @@ benchmarks_instance_pallet! { let (asset_id, caller, _) = create_default_asset::(true); T::Currency::make_free_balance_be(&caller, DepositBalanceOf::::max_value()); - }: _(SystemOrigin::Signed(caller), asset_id, name.clone(), symbol.clone(), decimals) + }: _(SystemOrigin::Signed(caller), asset_id.clone(), name.clone(), symbol.clone(), decimals) verify { assert_last_event::(Event::MetadataSet { asset_id: asset_id.into(), name, symbol, decimals, is_frozen: false }.into()); } @@ -348,8 +353,8 @@ benchmarks_instance_pallet! { T::Currency::make_free_balance_be(&caller, DepositBalanceOf::::max_value()); let dummy = vec![0u8; T::StringLimit::get() as usize]; let origin = SystemOrigin::Signed(caller.clone()).into(); - Assets::::set_metadata(origin, asset_id, dummy.clone(), dummy, 12)?; - }: _(SystemOrigin::Signed(caller), asset_id) + Assets::::set_metadata(origin, asset_id.clone(), dummy.clone(), dummy, 12)?; + }: _(SystemOrigin::Signed(caller), asset_id.clone()) verify { assert_last_event::(Event::MetadataCleared { asset_id: asset_id.into() }.into()); } @@ -367,7 +372,7 @@ benchmarks_instance_pallet! { let origin = T::ForceOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; let call = Call::::force_set_metadata { - id: asset_id, + id: asset_id.clone(), name: name.clone(), symbol: symbol.clone(), decimals, @@ -383,11 +388,11 @@ benchmarks_instance_pallet! { T::Currency::make_free_balance_be(&caller, DepositBalanceOf::::max_value()); let dummy = vec![0u8; T::StringLimit::get() as usize]; let origin = SystemOrigin::Signed(caller).into(); - Assets::::set_metadata(origin, asset_id, dummy.clone(), dummy, 12)?; + Assets::::set_metadata(origin, asset_id.clone(), dummy.clone(), dummy, 12)?; let origin = T::ForceOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - let call = Call::::force_clear_metadata { id: asset_id }; + let call = Call::::force_clear_metadata { id: asset_id.clone() }; }: { call.dispatch_bypass_filter(origin)? } verify { assert_last_event::(Event::MetadataCleared { asset_id: asset_id.into() }.into()); @@ -399,7 +404,7 @@ benchmarks_instance_pallet! { let origin = T::ForceOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; let call = Call::::force_asset_status { - id: asset_id, + id: asset_id.clone(), owner: caller_lookup.clone(), issuer: caller_lookup.clone(), admin: caller_lookup.clone(), @@ -420,7 +425,7 @@ benchmarks_instance_pallet! { let delegate: T::AccountId = account("delegate", 0, SEED); let delegate_lookup = T::Lookup::unlookup(delegate.clone()); let amount = 100u32.into(); - }: _(SystemOrigin::Signed(caller.clone()), asset_id, delegate_lookup, amount) + }: _(SystemOrigin::Signed(caller.clone()), asset_id.clone(), delegate_lookup, amount) verify { assert_last_event::(Event::ApprovedTransfer { asset_id: asset_id.into(), source: caller, delegate, amount }.into()); } @@ -434,11 +439,11 @@ benchmarks_instance_pallet! { let delegate_lookup = T::Lookup::unlookup(delegate.clone()); let amount = 100u32.into(); let origin = SystemOrigin::Signed(owner.clone()).into(); - Assets::::approve_transfer(origin, asset_id, delegate_lookup, amount)?; + Assets::::approve_transfer(origin, asset_id.clone(), delegate_lookup, amount)?; let dest: T::AccountId = account("dest", 0, SEED); let dest_lookup = T::Lookup::unlookup(dest.clone()); - }: _(SystemOrigin::Signed(delegate.clone()), asset_id, owner_lookup, dest_lookup, amount) + }: _(SystemOrigin::Signed(delegate.clone()), asset_id.clone(), owner_lookup, dest_lookup, amount) verify { assert!(T::Currency::reserved_balance(&owner).is_zero()); assert_event::(Event::Transferred { asset_id: asset_id.into(), from: owner, to: dest, amount }.into()); @@ -452,8 +457,8 @@ benchmarks_instance_pallet! { let delegate_lookup = T::Lookup::unlookup(delegate.clone()); let amount = 100u32.into(); let origin = SystemOrigin::Signed(caller.clone()).into(); - Assets::::approve_transfer(origin, asset_id, delegate_lookup.clone(), amount)?; - }: _(SystemOrigin::Signed(caller.clone()), asset_id, delegate_lookup) + Assets::::approve_transfer(origin, asset_id.clone(), delegate_lookup.clone(), amount)?; + }: _(SystemOrigin::Signed(caller.clone()), asset_id.clone(), delegate_lookup) verify { assert_last_event::(Event::ApprovalCancelled { asset_id: asset_id.into(), owner: caller, delegate }.into()); } @@ -466,15 +471,15 @@ benchmarks_instance_pallet! { let delegate_lookup = T::Lookup::unlookup(delegate.clone()); let amount = 100u32.into(); let origin = SystemOrigin::Signed(caller.clone()).into(); - Assets::::approve_transfer(origin, asset_id, delegate_lookup.clone(), amount)?; - }: _(SystemOrigin::Signed(caller.clone()), asset_id, caller_lookup, delegate_lookup) + Assets::::approve_transfer(origin, asset_id.clone(), delegate_lookup.clone(), amount)?; + }: _(SystemOrigin::Signed(caller.clone()), asset_id.clone(), caller_lookup, delegate_lookup) verify { assert_last_event::(Event::ApprovalCancelled { asset_id: asset_id.into(), owner: caller, delegate }.into()); } set_min_balance { let (asset_id, caller, caller_lookup) = create_default_asset::(false); - }: _(SystemOrigin::Signed(caller.clone()), asset_id, 50u32.into()) + }: _(SystemOrigin::Signed(caller.clone()), asset_id.clone(), 50u32.into()) verify { assert_last_event::(Event::AssetMinBalanceChanged { asset_id: asset_id.into(), new_min_balance: 50u32.into() }.into()); } @@ -484,8 +489,8 @@ benchmarks_instance_pallet! { let new_account: T::AccountId = account("newaccount", 1, SEED); T::Currency::make_free_balance_be(&new_account, DepositBalanceOf::::max_value()); assert_ne!(asset_owner, new_account); - assert!(!Account::::contains_key(asset_id.into(), &new_account)); - }: _(SystemOrigin::Signed(new_account.clone()), asset_id) + assert!(!Account::::contains_key(asset_id.clone().into(), &new_account)); + }: _(SystemOrigin::Signed(new_account.clone()), asset_id.clone()) verify { assert!(Account::::contains_key(asset_id.into(), &new_account)); } @@ -496,8 +501,8 @@ benchmarks_instance_pallet! { let new_account_lookup = T::Lookup::unlookup(new_account.clone()); T::Currency::make_free_balance_be(&asset_owner, DepositBalanceOf::::max_value()); assert_ne!(asset_owner, new_account); - assert!(!Account::::contains_key(asset_id.into(), &new_account)); - }: _(SystemOrigin::Signed(asset_owner.clone()), asset_id, new_account_lookup) + assert!(!Account::::contains_key(asset_id.clone().into(), &new_account)); + }: _(SystemOrigin::Signed(asset_owner.clone()), asset_id.clone(), new_account_lookup) verify { assert!(Account::::contains_key(asset_id.into(), &new_account)); } @@ -509,12 +514,12 @@ benchmarks_instance_pallet! { assert_ne!(asset_owner, new_account); assert!(Assets::::touch( SystemOrigin::Signed(new_account.clone()).into(), - asset_id + asset_id.clone() ).is_ok()); // `touch` should reserve balance of the caller according to the `AssetAccountDeposit` amount... assert_eq!(T::Currency::reserved_balance(&new_account), T::AssetAccountDeposit::get()); // ...and also create an `Account` entry. - assert!(Account::::contains_key(asset_id.into(), &new_account)); + assert!(Account::::contains_key(asset_id.clone().into(), &new_account)); }: _(SystemOrigin::Signed(new_account.clone()), asset_id, true) verify { // `refund`ing should of course repatriate the reserve @@ -529,12 +534,12 @@ benchmarks_instance_pallet! { assert_ne!(asset_owner, new_account); assert!(Assets::::touch_other( SystemOrigin::Signed(asset_owner.clone()).into(), - asset_id, + asset_id.clone(), new_account_lookup.clone() ).is_ok()); // `touch` should reserve balance of the caller according to the `AssetAccountDeposit` amount... assert_eq!(T::Currency::reserved_balance(&asset_owner), T::AssetAccountDeposit::get()); - assert!(Account::::contains_key(asset_id.into(), &new_account)); + assert!(Account::::contains_key(asset_id.clone().into(), &new_account)); }: _(SystemOrigin::Signed(asset_owner.clone()), asset_id, new_account_lookup.clone()) verify { // this should repatriate the reserved balance of the freezer @@ -543,7 +548,7 @@ benchmarks_instance_pallet! { block { let (asset_id, caller, caller_lookup) = create_default_minted_asset::(true, 100u32.into()); - }: _(SystemOrigin::Signed(caller.clone()), asset_id, caller_lookup) + }: _(SystemOrigin::Signed(caller.clone()), asset_id.clone(), caller_lookup) verify { assert_last_event::(Event::Blocked { asset_id: asset_id.into(), who: caller }.into()); } diff --git a/substrate/frame/assets/src/lib.rs b/substrate/frame/assets/src/lib.rs index f3ae03d667b..cafe7bb1a3b 100644 --- a/substrate/frame/assets/src/lib.rs +++ b/substrate/frame/assets/src/lib.rs @@ -259,11 +259,7 @@ pub mod pallet { /// This type includes the `From` bound, since tightly coupled pallets may /// want to convert an `AssetId` into a parameter for calling dispatchable functions /// directly. - type AssetIdParameter: Parameter - + Copy - + From - + Into - + MaxEncodedLen; + type AssetIdParameter: Parameter + From + Into + MaxEncodedLen; /// The currency mechanism. type Currency: ReservableCurrency; diff --git a/substrate/frame/contracts/mock-network/src/lib.rs b/substrate/frame/contracts/mock-network/src/lib.rs index 345c69541b6..eea9dde062c 100644 --- a/substrate/frame/contracts/mock-network/src/lib.rs +++ b/substrate/frame/contracts/mock-network/src/lib.rs @@ -24,7 +24,7 @@ mod tests; use crate::primitives::{AccountId, UNITS}; use sp_runtime::BuildStorage; -use xcm::latest::{prelude::*, MultiLocation}; +use xcm::latest::prelude::*; use xcm_executor::traits::ConvertLocation; use xcm_simulator::{decl_test_network, decl_test_parachain, decl_test_relay_chain, TestExt}; @@ -67,12 +67,12 @@ decl_test_network! { } pub fn relay_sovereign_account_id() -> AccountId { - let location: MultiLocation = (Parent,).into(); + let location: Location = (Parent,).into(); parachain::SovereignAccountOf::convert_location(&location).unwrap() } pub fn parachain_sovereign_account_id(para: u32) -> AccountId { - let location: MultiLocation = (Parachain(para),).into(); + let location: Location = (Parachain(para),).into(); relay_chain::SovereignAccountOf::convert_location(&location).unwrap() } @@ -80,7 +80,7 @@ pub fn parachain_account_sovereign_account_id( para: u32, who: sp_runtime::AccountId32, ) -> AccountId { - let location: MultiLocation = ( + let location: Location = ( Parachain(para), AccountId32 { network: Some(relay_chain::RelayNetwork::get()), id: who.into() }, ) diff --git a/substrate/frame/contracts/mock-network/src/mocks/msg_queue.rs b/substrate/frame/contracts/mock-network/src/mocks/msg_queue.rs index 82fb8590e26..cc81b6bd636 100644 --- a/substrate/frame/contracts/mock-network/src/mocks/msg_queue.rs +++ b/substrate/frame/contracts/mock-network/src/mocks/msg_queue.rs @@ -96,16 +96,23 @@ pub mod pallet { max_weight: Weight, ) -> Result { let hash = Encode::using_encoded(&xcm, T::Hashing::hash); - let message_hash = Encode::using_encoded(&xcm, sp_io::hashing::blake2_256); + let mut message_hash = Encode::using_encoded(&xcm, sp_io::hashing::blake2_256); let (result, event) = match Xcm::::try_from(xcm) { Ok(xcm) => { let location = (Parent, Parachain(sender.into())); - match T::XcmExecutor::execute_xcm(location, xcm, message_hash, max_weight) { - Outcome::Error(e) => (Err(e), Event::Fail(Some(hash), e)), - Outcome::Complete(w) => (Ok(w), Event::Success(Some(hash))), + match T::XcmExecutor::prepare_and_execute( + location, + xcm, + &mut message_hash, + max_weight, + Weight::zero(), + ) { + Outcome::Error { error } => (Err(error), Event::Fail(Some(hash), error)), + Outcome::Complete { used } => (Ok(used), Event::Success(Some(hash))), // As far as the caller is concerned, this was dispatched without error, so // we just report the weight used. - Outcome::Incomplete(w, e) => (Ok(w), Event::Fail(Some(hash), e)), + Outcome::Incomplete { used, error } => + (Ok(used), Event::Fail(Some(hash), error)), } }, Err(()) => (Err(XcmError::UnhandledXcmVersion), Event::BadVersion(Some(hash))), @@ -146,7 +153,7 @@ pub mod pallet { limit: Weight, ) -> Weight { for (_i, (_sent_at, data)) in iter.enumerate() { - let id = sp_io::hashing::blake2_256(&data[..]); + let mut id = sp_io::hashing::blake2_256(&data[..]); let maybe_versioned = VersionedXcm::::decode(&mut &data[..]); match maybe_versioned { Err(_) => { @@ -155,7 +162,13 @@ pub mod pallet { Ok(versioned) => match Xcm::try_from(versioned) { Err(()) => Self::deposit_event(Event::UnsupportedVersion(id)), Ok(x) => { - let outcome = T::XcmExecutor::execute_xcm(Parent, x.clone(), id, limit); + let outcome = T::XcmExecutor::prepare_and_execute( + Parent, + x.clone(), + &mut id, + limit, + Weight::zero(), + ); >::append(x); Self::deposit_event(Event::ExecutedDownward(id, outcome)); }, diff --git a/substrate/frame/contracts/mock-network/src/parachain.rs b/substrate/frame/contracts/mock-network/src/parachain.rs index a79b7e4e2d6..90fc23af48d 100644 --- a/substrate/frame/contracts/mock-network/src/parachain.rs +++ b/substrate/frame/contracts/mock-network/src/parachain.rs @@ -143,10 +143,10 @@ parameter_types! { } parameter_types! { - pub const KsmLocation: MultiLocation = MultiLocation::parent(); - pub const TokenLocation: MultiLocation = Here.into_location(); + pub const KsmLocation: Location = Location::parent(); + pub const TokenLocation: Location = Here.into_location(); pub const RelayNetwork: NetworkId = ByGenesis([0; 32]); - pub UniversalLocation: InteriorMultiLocation = Parachain(MsgQueue::parachain_id().into()).into(); + pub UniversalLocation: InteriorLocation = Parachain(MsgQueue::parachain_id().into()).into(); } pub type XcmOriginToCallOrigin = ( @@ -158,13 +158,13 @@ pub type XcmOriginToCallOrigin = ( parameter_types! { pub const XcmInstructionWeight: Weight = Weight::from_parts(1_000, 1_000); - pub TokensPerSecondPerMegabyte: (AssetId, u128, u128) = (Concrete(Parent.into()), 1_000_000_000_000, 1024 * 1024); + pub TokensPerSecondPerMegabyte: (AssetId, u128, u128) = (AssetId(Parent.into()), 1_000_000_000_000, 1024 * 1024); pub const MaxInstructions: u32 = 100; pub const MaxAssetsIntoHolding: u32 = 64; - pub ForeignPrefix: MultiLocation = (Parent,).into(); + pub ForeignPrefix: Location = (Parent,).into(); pub CheckingAccount: AccountId = PolkadotXcm::check_account(); - pub TrustedLockPairs: (MultiLocation, MultiAssetFilter) = - (Parent.into(), Wild(AllOf { id: Concrete(Parent.into()), fun: WildFungible })); + pub TrustedLockPairs: (Location, AssetFilter) = + (Parent.into(), Wild(AllOf { id: AssetId(Parent.into()), fun: WildFungible })); } pub fn estimate_message_fee(number_of_instructions: u64) -> u128 { @@ -188,20 +188,19 @@ pub fn estimate_fee_for_weight(weight: Weight) -> u128 { pub type LocalBalancesTransactor = XcmCurrencyAdapter, SovereignAccountOf, AccountId, ()>; -pub struct FromMultiLocationToAsset(PhantomData<(MultiLocation, AssetId)>); -impl MaybeEquivalence - for FromMultiLocationToAsset +pub struct FromLocationToAsset(PhantomData<(Location, AssetId)>); +impl MaybeEquivalence + for FromLocationToAsset { - fn convert(value: &MultiLocation) -> Option { - match *value { - MultiLocation { parents: 1, interior: Here } => Some(0 as AssetIdForAssets), - MultiLocation { parents: 1, interior: X1(Parachain(para_id)) } => - Some(para_id as AssetIdForAssets), + fn convert(value: &Location) -> Option { + match value.unpack() { + (1, []) => Some(0 as AssetIdForAssets), + (1, [Parachain(para_id)]) => Some(*para_id as AssetIdForAssets), _ => None, } } - fn convert_back(_id: &AssetIdForAssets) -> Option { + fn convert_back(_id: &AssetIdForAssets) -> Option { None } } @@ -211,7 +210,7 @@ pub type ForeignAssetsTransactor = FungiblesAdapter< ConvertedConcreteId< AssetIdForAssets, Balance, - FromMultiLocationToAsset, + FromLocationToAsset, JustTry, >, SovereignAccountOf, @@ -224,18 +223,15 @@ pub type ForeignAssetsTransactor = FungiblesAdapter< pub type AssetTransactors = (LocalBalancesTransactor, ForeignAssetsTransactor); pub struct ParentRelay; -impl Contains for ParentRelay { - fn contains(location: &MultiLocation) -> bool { +impl Contains for ParentRelay { + fn contains(location: &Location) -> bool { location.contains_parents_only(1) } } pub struct ThisParachain; -impl Contains for ThisParachain { - fn contains(location: &MultiLocation) -> bool { - matches!( - location, - MultiLocation { parents: 0, interior: Junctions::X1(Junction::AccountId32 { .. }) } - ) +impl Contains for ThisParachain { + fn contains(location: &Location) -> bool { + matches!(location.unpack(), (0, [Junction::AccountId32 { .. }])) } } @@ -251,12 +247,12 @@ pub type Barrier = ( ); parameter_types! { - pub NftCollectionOne: MultiAssetFilter - = Wild(AllOf { fun: WildNonFungible, id: Concrete((Parent, GeneralIndex(1)).into()) }); - pub NftCollectionOneForRelay: (MultiAssetFilter, MultiLocation) + pub NftCollectionOne: AssetFilter + = Wild(AllOf { fun: WildNonFungible, id: AssetId((Parent, GeneralIndex(1)).into()) }); + pub NftCollectionOneForRelay: (AssetFilter, Location) = (NftCollectionOne::get(), Parent.into()); - pub RelayNativeAsset: MultiAssetFilter = Wild(AllOf { fun: WildFungible, id: Concrete((Parent, Here).into()) }); - pub RelayNativeAssetForRelay: (MultiAssetFilter, MultiLocation) = (RelayNativeAsset::get(), Parent.into()); + pub RelayNativeAsset: AssetFilter = Wild(AllOf { fun: WildFungible, id: AssetId((Parent, Here).into()) }); + pub RelayNativeAssetForRelay: (AssetFilter, Location) = (RelayNativeAsset::get(), Parent.into()); } pub type TrustedTeleporters = (xcm_builder::Case, xcm_builder::Case); @@ -298,10 +294,8 @@ impl mock_msg_queue::Config for Runtime { pub type LocalOriginToLocation = SignedToAccountId32; pub struct TrustedLockerCase(PhantomData); -impl> ContainsPair - for TrustedLockerCase -{ - fn contains(origin: &MultiLocation, asset: &MultiAsset) -> bool { +impl> ContainsPair for TrustedLockerCase { + fn contains(origin: &Location, asset: &Asset) -> bool { let (o, a) = T::get(); a.matches(asset) && &o == origin } diff --git a/substrate/frame/contracts/mock-network/src/relay_chain.rs b/substrate/frame/contracts/mock-network/src/relay_chain.rs index 136cc2e3ed6..4e5523f7442 100644 --- a/substrate/frame/contracts/mock-network/src/relay_chain.rs +++ b/substrate/frame/contracts/mock-network/src/relay_chain.rs @@ -107,8 +107,8 @@ impl configuration::Config for Runtime { parameter_types! { pub RelayNetwork: NetworkId = ByGenesis([0; 32]); - pub const TokenLocation: MultiLocation = Here.into_location(); - pub UniversalLocation: InteriorMultiLocation = Here; + pub const TokenLocation: Location = Here.into_location(); + pub UniversalLocation: InteriorLocation = Here; pub UnitWeightCost: u64 = 1_000; } @@ -134,15 +134,15 @@ type LocalOriginConverter = ( parameter_types! { pub const XcmInstructionWeight: Weight = Weight::from_parts(1_000, 1_000); pub TokensPerSecondPerMegabyte: (AssetId, u128, u128) = - (Concrete(TokenLocation::get()), 1_000_000_000_000, 1024 * 1024); + (AssetId(TokenLocation::get()), 1_000_000_000_000, 1024 * 1024); pub const MaxInstructions: u32 = 100; pub const MaxAssetsIntoHolding: u32 = 64; } pub struct ChildrenParachains; -impl Contains for ChildrenParachains { - fn contains(location: &MultiLocation) -> bool { - matches!(location, MultiLocation { parents: 0, interior: X1(Parachain(_)) }) +impl Contains for ChildrenParachains { + fn contains(location: &Location) -> bool { + matches!(location.unpack(), (0, [Parachain(_)])) } } diff --git a/substrate/frame/contracts/mock-network/src/tests.rs b/substrate/frame/contracts/mock-network/src/tests.rs index a66b2b08019..c25373bcbe3 100644 --- a/substrate/frame/contracts/mock-network/src/tests.rs +++ b/substrate/frame/contracts/mock-network/src/tests.rs @@ -31,7 +31,7 @@ use frame_support::{ use pallet_balances::{BalanceLock, Reasons}; use pallet_contracts::{Code, CollectEvents, DebugInfo, Determinism}; use pallet_contracts_fixtures::compile_module; -use xcm::{v3::prelude::*, VersionedMultiLocation, VersionedXcm}; +use xcm::{v4::prelude::*, VersionedLocation, VersionedXcm}; use xcm_simulator::TestExt; type ParachainContracts = pallet_contracts::Pallet; @@ -82,7 +82,7 @@ fn test_xcm_execute() { let amount: u128 = 10 * CENTS; // The XCM used to transfer funds to Bob. - let message: xcm_simulator::Xcm<()> = Xcm(vec![ + let message: Xcm<()> = Xcm(vec![ WithdrawAsset(vec![(Here, amount).into()].into()), DepositAsset { assets: All.into(), @@ -96,7 +96,7 @@ fn test_xcm_execute() { 0, Weight::MAX, None, - VersionedXcm::V3(message).encode(), + VersionedXcm::V4(message).encode(), DebugInfo::UnsafeDebug, CollectEvents::UnsafeCollect, Determinism::Enforced, @@ -106,7 +106,7 @@ fn test_xcm_execute() { let mut data = &result.data[..]; let outcome = Outcome::decode(&mut data).expect("Failed to decode xcm_execute Outcome"); - assert_matches!(outcome, Outcome::Complete(_)); + assert_matches!(outcome, Outcome::Complete { .. }); // Check if the funds are subtracted from the account of Alice and added to the account of // Bob. @@ -137,7 +137,7 @@ fn test_xcm_execute_filtered_call() { 0, Weight::MAX, None, - VersionedXcm::V3(message).encode(), + VersionedXcm::V4(message).encode(), DebugInfo::UnsafeDebug, CollectEvents::UnsafeCollect, Determinism::Enforced, @@ -178,7 +178,7 @@ fn test_xcm_execute_reentrant_call() { 0, Weight::MAX, None, - VersionedXcm::V3(message).encode(), + VersionedXcm::V4(message).encode(), DebugInfo::UnsafeDebug, CollectEvents::UnsafeCollect, Determinism::Enforced, @@ -188,7 +188,10 @@ fn test_xcm_execute_reentrant_call() { let mut data = &result.data[..]; let outcome = Outcome::decode(&mut data).expect("Failed to decode xcm_execute Outcome"); - assert_matches!(outcome, Outcome::Incomplete(_, XcmError::ExpectationFalse)); + assert_matches!( + outcome, + Outcome::Incomplete { used: _, error: XcmError::ExpectationFalse } + ); // Funds should not change hands as the XCM transact failed. assert_eq!(ParachainBalances::free_balance(BOB), INITIAL_BALANCE); @@ -203,15 +206,15 @@ fn test_xcm_send() { // Send XCM instructions through the contract, to lock some funds on the relay chain. ParaA::execute_with(|| { - let dest = MultiLocation::from(Parent); - let dest = VersionedMultiLocation::V3(dest); + let dest = Location::from(Parent); + let dest = VersionedLocation::V4(dest); - let message: xcm_simulator::Xcm<()> = Xcm(vec![ + let message: Xcm<()> = Xcm(vec![ WithdrawAsset((Here, fee).into()), BuyExecution { fees: (Here, fee).into(), weight_limit: WeightLimit::Unlimited }, LockAsset { asset: (Here, 5 * CENTS).into(), unlocker: (Parachain(1)).into() }, ]); - let message = VersionedXcm::V3(message); + let message = VersionedXcm::V4(message); let exec = ParachainContracts::bare_call( ALICE, contract_addr.clone(), diff --git a/substrate/frame/contracts/src/wasm/runtime.rs b/substrate/frame/contracts/src/wasm/runtime.rs index a7f329005f9..3e49b68f86b 100644 --- a/substrate/frame/contracts/src/wasm/runtime.rs +++ b/substrate/frame/contracts/src/wasm/runtime.rs @@ -2169,11 +2169,11 @@ pub mod env { msg_len: u32, output_ptr: u32, ) -> Result { - use xcm::{VersionedMultiLocation, VersionedXcm}; + use xcm::{VersionedLocation, VersionedXcm}; use xcm_builder::{SendController, SendControllerWeightInfo}; ctx.charge_gas(RuntimeCosts::CopyFromContract(msg_len))?; - let dest: VersionedMultiLocation = ctx.read_sandbox_memory_as(memory, dest_ptr)?; + let dest: VersionedLocation = ctx.read_sandbox_memory_as(memory, dest_ptr)?; let message: VersionedXcm<()> = ctx.read_sandbox_memory_as_unbounded(memory, msg_ptr, msg_len)?; diff --git a/substrate/frame/support/src/traits/tokens/pay.rs b/substrate/frame/support/src/traits/tokens/pay.rs index 4d1d80b5b50..62d7a056a3f 100644 --- a/substrate/frame/support/src/traits/tokens/pay.rs +++ b/substrate/frame/support/src/traits/tokens/pay.rs @@ -26,7 +26,7 @@ use sp_std::fmt::Debug; use super::{fungible, fungibles, Balance, Preservation::Expendable}; /// Can be implemented by `PayFromAccount` using a `fungible` impl, but can also be implemented with -/// XCM/MultiAsset and made generic over assets. +/// XCM/Asset and made generic over assets. pub trait Pay { /// The type by which we measure units of the currency in which we make payments. type Balance: Balance; -- GitLab From 33d533e1be8210d65bcbfed58fac5b659333fc77 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Jan 2024 09:20:27 +0100 Subject: [PATCH 179/191] Bump futures-util from 0.3.28 to 0.3.30 (#2952) Bumps [futures-util](https://github.com/rust-lang/futures-rs) from 0.3.28 to 0.3.30.
Release notes

Sourced from futures-util's releases.

0.3.30

  • Add {BiLock,SplitStream,SplitSink,ReadHalf,WriteHalf}::is_pair_of (#2797)
  • Fix panic in FuturesUnordered::clear (#2809)
  • Fix panic in AsyncBufReadExt::fill_buf (#2801, #2812)
  • Improve support for targets without atomic CAS (#2811)
  • Remove build scripts (#2811)

0.3.29

  • Add TryStreamExt::try_ready_chunks (#2757)
  • Add TryStreamExt::{try_all,try_any} (#2783)
  • Add UnboundedSender::{len,is_empty} (#2750)
  • Fix Sync impl of FuturesUnordered (#2788)
  • Fix infinite loop caused by invalid UTF-8 bytes (#2785)
  • Fix build error with -Z minimal-versions (#2761)
Changelog

Sourced from futures-util's changelog.

0.3.30 - 2023-12-24

  • Add {BiLock,SplitStream,SplitSink,ReadHalf,WriteHalf}::is_pair_of (#2797)
  • Fix panic in FuturesUnordered::clear (#2809)
  • Fix panic in AsyncBufReadExt::fill_buf (#2801, #2812)
  • Improve support for targets without atomic CAS (#2811)
  • Remove build scripts (#2811)

0.3.29 - 2023-10-26

  • Add TryStreamExt::try_ready_chunks (#2757)
  • Add TryStreamExt::{try_all,try_any} (#2783)
  • Add UnboundedSender::{len,is_empty} (#2750)
  • Fix Sync impl of FuturesUnordered (#2788)
  • Fix infinite loop caused by invalid UTF-8 bytes (#2785)
  • Fix build error with -Z minimal-versions (#2761)
Commits
  • de1a0fd Release 0.3.30
  • 68d2845 Remove a redundant space in example (#2816)
  • fdd2ce7 Fix broken link in CopyBufAbortable docs (#2815)
  • 272a3c7 Use cfg(target_has_atomic) on no-std targets
  • c179201 FillBuf: Do not call poll_fill_buf twice
  • e6735f3 FuturesUnordered: Fix clear implementation
  • 04d01a0 FuturesOrdered: Use 64-bit index
  • e4aa659 remove redundant impl Unpin
  • 17851c1 provide a mechanism to determine if io read/write halves are from the same st...
  • 4910799 provide a non-destructive mechanism to determine if a sink/stream are paired
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=futures-util&package-manager=cargo&previous-version=0.3.28&new-version=0.3.30)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 28 +++++++++---------- .../node/zombienet-backchannel/Cargo.toml | 2 +- substrate/client/rpc-spec-v2/Cargo.toml | 2 +- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 31347261151..f685fcaa702 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5918,9 +5918,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", "futures-sink", @@ -5928,9 +5928,9 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-executor" @@ -5946,9 +5946,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-lite" @@ -5967,9 +5967,9 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", @@ -5989,15 +5989,15 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] name = "futures-task" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-timer" @@ -6007,9 +6007,9 @@ checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" [[package]] name = "futures-util" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-channel", "futures-core", diff --git a/polkadot/node/zombienet-backchannel/Cargo.toml b/polkadot/node/zombienet-backchannel/Cargo.toml index 82c6f2532ca..6af7a8d6e38 100644 --- a/polkadot/node/zombienet-backchannel/Cargo.toml +++ b/polkadot/node/zombienet-backchannel/Cargo.toml @@ -15,7 +15,7 @@ workspace = true tokio = { version = "1.24.2", default-features = false, features = ["macros", "net", "rt-multi-thread", "sync"] } url = "2.3.1" tokio-tungstenite = "0.17" -futures-util = "0.3.23" +futures-util = "0.3.30" lazy_static = "1.4.0" parity-scale-codec = { version = "3.6.1", features = ["derive"] } reqwest = { version = "0.11", features = ["rustls-tls"], default-features = false } diff --git a/substrate/client/rpc-spec-v2/Cargo.toml b/substrate/client/rpc-spec-v2/Cargo.toml index ba32308e678..17412f883ca 100644 --- a/substrate/client/rpc-spec-v2/Cargo.toml +++ b/substrate/client/rpc-spec-v2/Cargo.toml @@ -39,7 +39,7 @@ tokio-stream = { version = "0.1.14", features = ["sync"] } tokio = { version = "1.22.0", features = ["sync"] } array-bytes = "6.1" log = "0.4.17" -futures-util = { version = "0.3.19", default-features = false } +futures-util = { version = "0.3.30", default-features = false } [dev-dependencies] serde_json = "1.0.111" -- GitLab From c01dbebeaa6394691974de46dd2d41a582f6a4c2 Mon Sep 17 00:00:00 2001 From: joe petrowski <25483142+joepetrowski@users.noreply.github.com> Date: Wed, 17 Jan 2024 09:59:00 +0100 Subject: [PATCH 180/191] Revert "pallet-core-fellowship: import an unimported member on approve" (#2956) Reverts paritytech/polkadot-sdk#2883 Code, not docs, was intended. --- prdoc/pr_2883.prdoc | 9 ------ substrate/frame/core-fellowship/src/lib.rs | 29 ++++++-------------- substrate/frame/core-fellowship/src/tests.rs | 8 ------ 3 files changed, 9 insertions(+), 37 deletions(-) delete mode 100644 prdoc/pr_2883.prdoc diff --git a/prdoc/pr_2883.prdoc b/prdoc/pr_2883.prdoc deleted file mode 100644 index e2817d16a03..00000000000 --- a/prdoc/pr_2883.prdoc +++ /dev/null @@ -1,9 +0,0 @@ -title: "pallet-core-fellowship: import an unimported on approve" - -doc: - - audience: Runtime User - description: | - To align with the documentation of the approve call, we import an untracked member on approval. - -crates: - - name: "pallet-core-fellowship" diff --git a/substrate/frame/core-fellowship/src/lib.rs b/substrate/frame/core-fellowship/src/lib.rs index ee16ae07ce6..a0a45c7c594 100644 --- a/substrate/frame/core-fellowship/src/lib.rs +++ b/substrate/frame/core-fellowship/src/lib.rs @@ -362,8 +362,7 @@ pub mod pallet { /// /// This resets `last_proof` to the current block, thereby delaying any automatic demotion. /// - /// If `who` is not already tracked by this pallet, then it will become tracked. - /// `last_promotion` will be set to zero. + /// `who` must already be tracked by this pallet for this to have an effect. /// /// - `origin`: An origin which satisfies `ApproveOrigin` or root. /// - `who`: A member (i.e. of non-zero rank). @@ -382,11 +381,7 @@ pub mod pallet { ensure!(at_rank > 0, Error::::InvalidRank); let rank = T::Members::rank_of(&who).ok_or(Error::::Unranked)?; ensure!(rank == at_rank, Error::::UnexpectedRank); - let mut member = if let Some(m) = Member::::get(&who) { - m - } else { - Self::import_member(who.clone(), rank) - }; + let mut member = Member::::get(&who).ok_or(Error::::NotTracked)?; member.last_proof = frame_system::Pallet::::block_number(); Member::::insert(&who, &member); @@ -522,7 +517,13 @@ pub mod pallet { let who = ensure_signed(origin)?; ensure!(!Member::::contains_key(&who), Error::::AlreadyInducted); let rank = T::Members::rank_of(&who).ok_or(Error::::Unranked)?; - let _ = Self::import_member(who, rank); + + let now = frame_system::Pallet::::block_number(); + Member::::insert( + &who, + MemberStatus { is_active: true, last_promotion: 0u32.into(), last_proof: now }, + ); + Self::deposit_event(Event::::Imported { who, rank }); Ok(Pays::No.into()) } @@ -546,18 +547,6 @@ pub mod pallet { Self::deposit_event(e); } } - - fn import_member(who: T::AccountId, rank: RankOf) -> MemberStatusOf { - let now = frame_system::Pallet::::block_number(); - let status = MemberStatus { - is_active: true, - last_promotion: BlockNumberFor::::zero(), - last_proof: now, - }; - Member::::insert(&who, status.clone()); - Self::deposit_event(Event::::Imported { who, rank }); - status - } } impl, I: 'static> GetSalary, T::AccountId, T::Balance> for Pallet { diff --git a/substrate/frame/core-fellowship/src/tests.rs b/substrate/frame/core-fellowship/src/tests.rs index 6d9cebbf921..c9098f2171f 100644 --- a/substrate/frame/core-fellowship/src/tests.rs +++ b/substrate/frame/core-fellowship/src/tests.rs @@ -378,11 +378,3 @@ fn active_changing_get_salary_works() { } }); } - -#[test] -fn approve_imports_not_tracked_member() { - new_test_ext().execute_with(|| { - set_rank(10, 5); - assert_ok!(CoreFellowship::approve(signed(5), 10, 5)); - }); -} -- GitLab From 8b28031d16e7a9ed059aa90cb4b4488d58a7d9d9 Mon Sep 17 00:00:00 2001 From: Ignacio Palacios Date: Wed, 17 Jan 2024 12:05:44 +0100 Subject: [PATCH 181/191] Add `Storage` to `PolkadotXcm` for People Chains (#2959) After People Rococo deployment, we noticed that `safeXcmVersion` wasn't initialised. I think it is due to `Storage` missing in the pallet's declaration. This PR should fix it. --- cumulus/parachains/runtimes/people/people-rococo/src/lib.rs | 2 +- cumulus/parachains/runtimes/people/people-westend/src/lib.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs b/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs index f5398829c73..00dd58e4a50 100644 --- a/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs @@ -428,7 +428,7 @@ construct_runtime!( // XCM & related XcmpQueue: cumulus_pallet_xcmp_queue::{Pallet, Call, Storage, Event} = 30, - PolkadotXcm: pallet_xcm::{Pallet, Call, Event, Origin, Config} = 31, + PolkadotXcm: pallet_xcm::{Pallet, Call, Storage, Event, Origin, Config} = 31, CumulusXcm: cumulus_pallet_xcm::{Pallet, Event, Origin} = 32, MessageQueue: pallet_message_queue::{Pallet, Call, Storage, Event} = 34, diff --git a/cumulus/parachains/runtimes/people/people-westend/src/lib.rs b/cumulus/parachains/runtimes/people/people-westend/src/lib.rs index 33f0d511705..ee67c7419f1 100644 --- a/cumulus/parachains/runtimes/people/people-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/people/people-westend/src/lib.rs @@ -428,7 +428,7 @@ construct_runtime!( // XCM helpers. XcmpQueue: cumulus_pallet_xcmp_queue::{Pallet, Call, Storage, Event} = 30, - PolkadotXcm: pallet_xcm::{Pallet, Call, Event, Origin, Config} = 31, + PolkadotXcm: pallet_xcm::{Pallet, Call, Storage, Event, Origin, Config} = 31, CumulusXcm: cumulus_pallet_xcm::{Pallet, Event, Origin} = 32, MessageQueue: pallet_message_queue::{Pallet, Call, Storage, Event} = 34, -- GitLab From c1c0e62d33f210663c87f3170b60acb2d0cd32b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20Thei=C3=9Fen?= Date: Wed, 17 Jan 2024 12:39:33 +0100 Subject: [PATCH 182/191] contracts: Update to Polkavm 0.5 (#2945) This will allow us to change to the target supporting atomics and makes the linker file no longer necessary. --- Cargo.lock | 30 +++++++++++++++---- substrate/frame/contracts/fixtures/Cargo.toml | 2 +- substrate/frame/contracts/fixtures/build.rs | 15 +++++----- .../frame/contracts/fixtures/build/Cargo.toml | 2 +- .../fixtures/build/riscv_memory_layout.ld | 4 --- 5 files changed, 35 insertions(+), 18 deletions(-) delete mode 100644 substrate/frame/contracts/fixtures/build/riscv_memory_layout.ld diff --git a/Cargo.lock b/Cargo.lock index f685fcaa702..7f2221240cc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3294,7 +3294,7 @@ dependencies = [ "gimli 0.27.3", "hashbrown 0.13.2", "log", - "regalloc2", + "regalloc2 0.6.1", "smallvec", "target-lexicon", ] @@ -13793,6 +13793,12 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fecd2caacfc4a7ee34243758dd7348859e6dec73f5e5df059890f5742ee46f0e" +[[package]] +name = "polkavm-common" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b4e215c80fe876147f3d58158d5dfeae7dabdd6047e175af77095b78d0035c" + [[package]] name = "polkavm-derive" version = "0.4.0" @@ -13809,7 +13815,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c99f4e7a9ff434ef9c885b874c99d824c3a5693bf5e3e8569bb1d2245a8c1b7f" dependencies = [ - "polkavm-common", + "polkavm-common 0.4.0", "proc-macro2", "quote", "syn 2.0.48", @@ -13817,15 +13823,16 @@ dependencies = [ [[package]] name = "polkavm-linker" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "550738c1b49b9279fa19d8ebed81f551b911b869227a20a190f85f6db45d5d0e" +checksum = "a5a668bb33c7f0b5f4ca91adb1e1e71cf4930fef5e6909f46c2180d65cce37d0" dependencies = [ "gimli 0.28.0", "hashbrown 0.14.3", "log", "object 0.32.2", - "polkavm-common", + "polkavm-common 0.5.0", + "regalloc2 0.9.3", "rustc-demangle", ] @@ -14597,6 +14604,19 @@ dependencies = [ "smallvec", ] +[[package]] +name = "regalloc2" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad156d539c879b7a24a363a2016d77961786e71f48f2e2fc8302a92abd2429a6" +dependencies = [ + "hashbrown 0.13.2", + "log", + "rustc-hash", + "slice-group-by", + "smallvec", +] + [[package]] name = "regex" version = "1.10.2" diff --git a/substrate/frame/contracts/fixtures/Cargo.toml b/substrate/frame/contracts/fixtures/Cargo.toml index 5ffac43d9de..7fdf56a91fc 100644 --- a/substrate/frame/contracts/fixtures/Cargo.toml +++ b/substrate/frame/contracts/fixtures/Cargo.toml @@ -21,7 +21,7 @@ parity-wasm = "0.45.0" tempfile = "3.8.1" toml = "0.8.2" twox-hash = "1.6.3" -polkavm-linker = { version = "0.4.0", optional = true } +polkavm-linker = { version = "0.5.0", optional = true } anyhow = "1.0.0" [features] diff --git a/substrate/frame/contracts/fixtures/build.rs b/substrate/frame/contracts/fixtures/build.rs index 125ee7f3722..7b814ef77a6 100644 --- a/substrate/frame/contracts/fixtures/build.rs +++ b/substrate/frame/contracts/fixtures/build.rs @@ -234,11 +234,12 @@ fn post_process_wasm(input_path: &Path, output_path: &Path) -> Result<()> { /// Build contracts for RISC-V. #[cfg(feature = "riscv")] fn invoke_riscv_build(current_dir: &Path) -> Result<()> { - let encoded_rustflags = - ["-Crelocation-model=pie", "-Clink-arg=--emit-relocs", "-Clink-arg=-Tmemory.ld"] - .join("\x1f"); - - fs::write(current_dir.join("memory.ld"), include_bytes!("./build/riscv_memory_layout.ld"))?; + let encoded_rustflags = [ + "-Crelocation-model=pie", + "-Clink-arg=--emit-relocs", + "-Clink-arg=--export-dynamic-symbol=__polkavm_symbol_export_hack__*", + ] + .join("\x1f"); let build_res = Command::new(env::var("CARGO")?) .current_dir(current_dir) @@ -247,7 +248,7 @@ fn invoke_riscv_build(current_dir: &Path) -> Result<()> { .env("CARGO_ENCODED_RUSTFLAGS", encoded_rustflags) .env("RUSTUP_TOOLCHAIN", "rve-nightly") .env("RUSTUP_HOME", env::var("RUSTUP_HOME").unwrap_or_default()) - .args(["build", "--release", "--target=riscv32em-unknown-none-elf"]) + .args(["build", "--release", "--target=riscv32ema-unknown-none-elf"]) .output() .expect("failed to execute process"); @@ -288,7 +289,7 @@ fn write_output(build_dir: &Path, out_dir: &Path, entries: Vec) -> Result #[cfg(feature = "riscv")] post_process_riscv( - &build_dir.join("target/riscv32em-unknown-none-elf/release").join(entry.name()), + &build_dir.join("target/riscv32ema-unknown-none-elf/release").join(entry.name()), &out_dir.join(entry.out_riscv_filename()), )?; diff --git a/substrate/frame/contracts/fixtures/build/Cargo.toml b/substrate/frame/contracts/fixtures/build/Cargo.toml index 70bf0ba94fe..1ff6b7ae7f8 100644 --- a/substrate/frame/contracts/fixtures/build/Cargo.toml +++ b/substrate/frame/contracts/fixtures/build/Cargo.toml @@ -10,7 +10,7 @@ edition = "2021" [dependencies] uapi = { package = 'pallet-contracts-uapi', path = "", default-features = false } common = { package = 'pallet-contracts-fixtures-common', path = "" } -polkavm-derive = '0.4.0' +polkavm-derive = '0.5.0' [profile.release] opt-level = 3 diff --git a/substrate/frame/contracts/fixtures/build/riscv_memory_layout.ld b/substrate/frame/contracts/fixtures/build/riscv_memory_layout.ld deleted file mode 100644 index 89084263ada..00000000000 --- a/substrate/frame/contracts/fixtures/build/riscv_memory_layout.ld +++ /dev/null @@ -1,4 +0,0 @@ -SECTIONS { - .text : { KEEP(*(.text.polkavm_export)) } -} - -- GitLab From f80cfc22595bbb39b50d2bd39661ff9eef74cb60 Mon Sep 17 00:00:00 2001 From: Egor_P Date: Wed, 17 Jan 2024 15:40:23 +0100 Subject: [PATCH 183/191] [Backport] Version bumps from 1.6.0 release (#2965) This PR backports version bumps from release branch `release-polkadot-v1.6.0` back to `master` and also moved `prdoc` files related to the release to the appropriate folder --- Cargo.lock | 4 ++-- .../parachains/runtimes/assets/asset-hub-rococo/src/lib.rs | 4 ++-- .../parachains/runtimes/assets/asset-hub-westend/src/lib.rs | 2 +- .../runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs | 2 +- .../runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs | 2 +- .../runtimes/collectives/collectives-westend/src/lib.rs | 2 +- .../parachains/runtimes/contracts/contracts-rococo/src/lib.rs | 2 +- .../parachains/runtimes/coretime/coretime-westend/src/lib.rs | 2 +- .../parachains/runtimes/glutton/glutton-westend/src/lib.rs | 2 +- cumulus/parachains/runtimes/people/people-rococo/src/lib.rs | 2 +- cumulus/parachains/runtimes/people/people-westend/src/lib.rs | 2 +- .../parachains/runtimes/testing/rococo-parachain/src/lib.rs | 2 +- cumulus/polkadot-parachain/Cargo.toml | 2 +- polkadot/Cargo.toml | 2 +- polkadot/node/primitives/src/lib.rs | 2 +- polkadot/runtime/westend/src/lib.rs | 2 +- prdoc/{ => 1.6.0}/pr_1191.prdoc | 0 prdoc/{ => 1.6.0}/pr_1226.prdoc | 0 prdoc/{ => 1.6.0}/pr_1289.prdoc | 0 prdoc/{ => 1.6.0}/pr_1343.prdoc | 0 prdoc/{ => 1.6.0}/pr_1454.prdoc | 0 prdoc/{ => 1.6.0}/pr_1479.prdoc | 0 prdoc/{ => 1.6.0}/pr_1677.prdoc | 0 prdoc/{ => 1.6.0}/pr_1694.prdoc | 0 prdoc/{ => 1.6.0}/pr_1841.prdoc | 0 prdoc/{ => 1.6.0}/pr_2031.prdoc | 0 prdoc/{ => 1.6.0}/pr_2033.prdoc | 0 prdoc/{ => 1.6.0}/pr_2281.prdoc | 0 prdoc/{ => 1.6.0}/pr_2331.prdoc | 0 prdoc/{ => 1.6.0}/pr_2403.prdoc | 0 prdoc/{ => 1.6.0}/pr_2481.prdoc | 0 prdoc/{ => 1.6.0}/pr_2522.prdoc | 0 prdoc/{ => 1.6.0}/pr_2532.prdoc | 0 prdoc/{ => 1.6.0}/pr_2597.prdoc | 0 prdoc/{ => 1.6.0}/pr_2637.prdoc | 0 prdoc/{ => 1.6.0}/pr_2651.prdoc | 0 prdoc/{ => 1.6.0}/pr_2656.prdoc | 0 .../pr_2663-fix-could-not-create-temporary-drectory.prdoc | 0 prdoc/{ => 1.6.0}/pr_2666.prdoc | 0 prdoc/{ => 1.6.0}/pr_2682.prdoc | 0 prdoc/{ => 1.6.0}/pr_2684.prdoc | 0 prdoc/{ => 1.6.0}/pr_2687.prdoc | 0 prdoc/{ => 1.6.0}/pr_2689.prdoc | 0 prdoc/{ => 1.6.0}/pr_2694.prdoc | 0 prdoc/{ => 1.6.0}/pr_2758.prdoc | 0 prdoc/{ => 1.6.0}/pr_2764.prdoc | 0 prdoc/{ => 1.6.0}/pr_2767.prdoc | 0 prdoc/{ => 1.6.0}/pr_2771.prdoc | 0 prdoc/{ => 1.6.0}/pr_2783.prdoc | 0 prdoc/{ => 1.6.0}/pr_2799.prdoc | 0 prdoc/{ => 1.6.0}/pr_2803.prdoc | 0 prdoc/{ => 1.6.0}/pr_2804.prdoc | 0 prdoc/{ => 1.6.0}/pr_2811.prdoc | 0 prdoc/{ => 1.6.0}/pr_2813.prdoc | 0 prdoc/{ => 1.6.0}/pr_2823.prdoc | 0 prdoc/{ => 1.6.0}/pr_2834.prdoc | 0 prdoc/{ => 1.6.0}/pr_2835.prdoc | 0 prdoc/{ => 1.6.0}/pr_2862.prdoc | 0 prdoc/{ => 1.6.0}/pr_2886.prdoc | 0 prdoc/{ => 1.6.0}/pr_2899.prdoc | 0 60 files changed, 18 insertions(+), 18 deletions(-) rename prdoc/{ => 1.6.0}/pr_1191.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_1226.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_1289.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_1343.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_1454.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_1479.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_1677.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_1694.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_1841.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_2031.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_2033.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_2281.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_2331.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_2403.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_2481.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_2522.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_2532.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_2597.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_2637.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_2651.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_2656.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_2663-fix-could-not-create-temporary-drectory.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_2666.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_2682.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_2684.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_2687.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_2689.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_2694.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_2758.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_2764.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_2767.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_2771.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_2783.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_2799.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_2803.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_2804.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_2811.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_2813.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_2823.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_2834.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_2835.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_2862.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_2886.prdoc (100%) rename prdoc/{ => 1.6.0}/pr_2899.prdoc (100%) diff --git a/Cargo.lock b/Cargo.lock index 7f2221240cc..849bc069d20 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12065,7 +12065,7 @@ dependencies = [ [[package]] name = "polkadot" -version = "1.5.0" +version = "1.6.0" dependencies = [ "assert_cmd", "color-eyre", @@ -13038,7 +13038,7 @@ dependencies = [ [[package]] name = "polkadot-parachain-bin" -version = "1.5.0" +version = "1.6.0" dependencies = [ "assert_cmd", "asset-hub-rococo-runtime", diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs index 53b41892685..494ca3d1240 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/lib.rs @@ -115,7 +115,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("statemine"), impl_name: create_runtime_str!("statemine"), authoring_version: 1, - spec_version: 1_005_001, + spec_version: 1_006_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 14, @@ -128,7 +128,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("statemine"), impl_name: create_runtime_str!("statemine"), authoring_version: 1, - spec_version: 1_005_000, + spec_version: 1_006_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 14, diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs index cf10c0ac052..5950173d90e 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/lib.rs @@ -113,7 +113,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("westmint"), impl_name: create_runtime_str!("westmint"), authoring_version: 1, - spec_version: 1_005_000, + spec_version: 1_006_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 14, diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs index 7e99b039309..09aeedfc223 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs @@ -201,7 +201,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("bridge-hub-rococo"), impl_name: create_runtime_str!("bridge-hub-rococo"), authoring_version: 1, - spec_version: 1_005_002, + spec_version: 1_006_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 4, diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs index d920f5a98cf..55a38fc8543 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs @@ -175,7 +175,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("bridge-hub-westend"), impl_name: create_runtime_str!("bridge-hub-westend"), authoring_version: 1, - spec_version: 1_005_000, + spec_version: 1_006_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 4, diff --git a/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs b/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs index a527f620137..3aff4671636 100644 --- a/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/collectives/collectives-westend/src/lib.rs @@ -116,7 +116,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("collectives-westend"), impl_name: create_runtime_str!("collectives-westend"), authoring_version: 1, - spec_version: 1_005_000, + spec_version: 1_006_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 5, diff --git a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/lib.rs b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/lib.rs index bc7d94889a1..707766ca226 100644 --- a/cumulus/parachains/runtimes/contracts/contracts-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/contracts/contracts-rococo/src/lib.rs @@ -133,7 +133,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("contracts-rococo"), impl_name: create_runtime_str!("contracts-rococo"), authoring_version: 1, - spec_version: 1_005_000, + spec_version: 1_006_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 6, diff --git a/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs b/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs index 59ed8d7c603..bc6b6b3caf1 100644 --- a/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/coretime/coretime-westend/src/lib.rs @@ -120,7 +120,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("coretime-westend"), impl_name: create_runtime_str!("coretime-westend"), authoring_version: 1, - spec_version: 1_005_000, + spec_version: 1_006_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 0, diff --git a/cumulus/parachains/runtimes/glutton/glutton-westend/src/lib.rs b/cumulus/parachains/runtimes/glutton/glutton-westend/src/lib.rs index 2c51791c074..15899e49195 100644 --- a/cumulus/parachains/runtimes/glutton/glutton-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/glutton/glutton-westend/src/lib.rs @@ -99,7 +99,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("glutton-westend"), impl_name: create_runtime_str!("glutton-westend"), authoring_version: 1, - spec_version: 1_005_000, + spec_version: 1_006_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 1, diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs b/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs index 00dd58e4a50..ba5b727484c 100644 --- a/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs @@ -124,7 +124,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("people-rococo"), impl_name: create_runtime_str!("people-rococo"), authoring_version: 1, - spec_version: 1_000, + spec_version: 1_006_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 0, diff --git a/cumulus/parachains/runtimes/people/people-westend/src/lib.rs b/cumulus/parachains/runtimes/people/people-westend/src/lib.rs index ee67c7419f1..4015d841b81 100644 --- a/cumulus/parachains/runtimes/people/people-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/people/people-westend/src/lib.rs @@ -124,7 +124,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("people-westend"), impl_name: create_runtime_str!("people-westend"), authoring_version: 1, - spec_version: 1_000, + spec_version: 1_006_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 0, diff --git a/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs b/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs index 102127479d2..795efa39247 100644 --- a/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs +++ b/cumulus/parachains/runtimes/testing/rococo-parachain/src/lib.rs @@ -108,7 +108,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("test-parachain"), impl_name: create_runtime_str!("test-parachain"), authoring_version: 1, - spec_version: 1_005_000, + spec_version: 1_006_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 6, diff --git a/cumulus/polkadot-parachain/Cargo.toml b/cumulus/polkadot-parachain/Cargo.toml index 9f42a265f39..84ba8a36d51 100644 --- a/cumulus/polkadot-parachain/Cargo.toml +++ b/cumulus/polkadot-parachain/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "polkadot-parachain-bin" -version = "1.5.0" +version = "1.6.0" authors.workspace = true build = "build.rs" edition.workspace = true diff --git a/polkadot/Cargo.toml b/polkadot/Cargo.toml index d769957490e..8c8e9cebd41 100644 --- a/polkadot/Cargo.toml +++ b/polkadot/Cargo.toml @@ -18,7 +18,7 @@ rust-version = "1.64.0" readme = "README.md" authors.workspace = true edition.workspace = true -version = "1.5.0" +version = "1.6.0" default-run = "polkadot" [lints] diff --git a/polkadot/node/primitives/src/lib.rs b/polkadot/node/primitives/src/lib.rs index 6ac6b82c223..e7fd2c46381 100644 --- a/polkadot/node/primitives/src/lib.rs +++ b/polkadot/node/primitives/src/lib.rs @@ -58,7 +58,7 @@ pub use disputes::{ /// relatively rare. /// /// The associated worker binaries should use the same version as the node that spawns them. -pub const NODE_VERSION: &'static str = "1.5.0"; +pub const NODE_VERSION: &'static str = "1.6.0"; // For a 16-ary Merkle Prefix Trie, we can expect at most 16 32-byte hashes per node // plus some overhead: diff --git a/polkadot/runtime/westend/src/lib.rs b/polkadot/runtime/westend/src/lib.rs index 92efdf0c0c5..28b82956a47 100644 --- a/polkadot/runtime/westend/src/lib.rs +++ b/polkadot/runtime/westend/src/lib.rs @@ -147,7 +147,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("westend"), impl_name: create_runtime_str!("parity-westend"), authoring_version: 2, - spec_version: 1_005_000, + spec_version: 1_006_000, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 24, diff --git a/prdoc/pr_1191.prdoc b/prdoc/1.6.0/pr_1191.prdoc similarity index 100% rename from prdoc/pr_1191.prdoc rename to prdoc/1.6.0/pr_1191.prdoc diff --git a/prdoc/pr_1226.prdoc b/prdoc/1.6.0/pr_1226.prdoc similarity index 100% rename from prdoc/pr_1226.prdoc rename to prdoc/1.6.0/pr_1226.prdoc diff --git a/prdoc/pr_1289.prdoc b/prdoc/1.6.0/pr_1289.prdoc similarity index 100% rename from prdoc/pr_1289.prdoc rename to prdoc/1.6.0/pr_1289.prdoc diff --git a/prdoc/pr_1343.prdoc b/prdoc/1.6.0/pr_1343.prdoc similarity index 100% rename from prdoc/pr_1343.prdoc rename to prdoc/1.6.0/pr_1343.prdoc diff --git a/prdoc/pr_1454.prdoc b/prdoc/1.6.0/pr_1454.prdoc similarity index 100% rename from prdoc/pr_1454.prdoc rename to prdoc/1.6.0/pr_1454.prdoc diff --git a/prdoc/pr_1479.prdoc b/prdoc/1.6.0/pr_1479.prdoc similarity index 100% rename from prdoc/pr_1479.prdoc rename to prdoc/1.6.0/pr_1479.prdoc diff --git a/prdoc/pr_1677.prdoc b/prdoc/1.6.0/pr_1677.prdoc similarity index 100% rename from prdoc/pr_1677.prdoc rename to prdoc/1.6.0/pr_1677.prdoc diff --git a/prdoc/pr_1694.prdoc b/prdoc/1.6.0/pr_1694.prdoc similarity index 100% rename from prdoc/pr_1694.prdoc rename to prdoc/1.6.0/pr_1694.prdoc diff --git a/prdoc/pr_1841.prdoc b/prdoc/1.6.0/pr_1841.prdoc similarity index 100% rename from prdoc/pr_1841.prdoc rename to prdoc/1.6.0/pr_1841.prdoc diff --git a/prdoc/pr_2031.prdoc b/prdoc/1.6.0/pr_2031.prdoc similarity index 100% rename from prdoc/pr_2031.prdoc rename to prdoc/1.6.0/pr_2031.prdoc diff --git a/prdoc/pr_2033.prdoc b/prdoc/1.6.0/pr_2033.prdoc similarity index 100% rename from prdoc/pr_2033.prdoc rename to prdoc/1.6.0/pr_2033.prdoc diff --git a/prdoc/pr_2281.prdoc b/prdoc/1.6.0/pr_2281.prdoc similarity index 100% rename from prdoc/pr_2281.prdoc rename to prdoc/1.6.0/pr_2281.prdoc diff --git a/prdoc/pr_2331.prdoc b/prdoc/1.6.0/pr_2331.prdoc similarity index 100% rename from prdoc/pr_2331.prdoc rename to prdoc/1.6.0/pr_2331.prdoc diff --git a/prdoc/pr_2403.prdoc b/prdoc/1.6.0/pr_2403.prdoc similarity index 100% rename from prdoc/pr_2403.prdoc rename to prdoc/1.6.0/pr_2403.prdoc diff --git a/prdoc/pr_2481.prdoc b/prdoc/1.6.0/pr_2481.prdoc similarity index 100% rename from prdoc/pr_2481.prdoc rename to prdoc/1.6.0/pr_2481.prdoc diff --git a/prdoc/pr_2522.prdoc b/prdoc/1.6.0/pr_2522.prdoc similarity index 100% rename from prdoc/pr_2522.prdoc rename to prdoc/1.6.0/pr_2522.prdoc diff --git a/prdoc/pr_2532.prdoc b/prdoc/1.6.0/pr_2532.prdoc similarity index 100% rename from prdoc/pr_2532.prdoc rename to prdoc/1.6.0/pr_2532.prdoc diff --git a/prdoc/pr_2597.prdoc b/prdoc/1.6.0/pr_2597.prdoc similarity index 100% rename from prdoc/pr_2597.prdoc rename to prdoc/1.6.0/pr_2597.prdoc diff --git a/prdoc/pr_2637.prdoc b/prdoc/1.6.0/pr_2637.prdoc similarity index 100% rename from prdoc/pr_2637.prdoc rename to prdoc/1.6.0/pr_2637.prdoc diff --git a/prdoc/pr_2651.prdoc b/prdoc/1.6.0/pr_2651.prdoc similarity index 100% rename from prdoc/pr_2651.prdoc rename to prdoc/1.6.0/pr_2651.prdoc diff --git a/prdoc/pr_2656.prdoc b/prdoc/1.6.0/pr_2656.prdoc similarity index 100% rename from prdoc/pr_2656.prdoc rename to prdoc/1.6.0/pr_2656.prdoc diff --git a/prdoc/pr_2663-fix-could-not-create-temporary-drectory.prdoc b/prdoc/1.6.0/pr_2663-fix-could-not-create-temporary-drectory.prdoc similarity index 100% rename from prdoc/pr_2663-fix-could-not-create-temporary-drectory.prdoc rename to prdoc/1.6.0/pr_2663-fix-could-not-create-temporary-drectory.prdoc diff --git a/prdoc/pr_2666.prdoc b/prdoc/1.6.0/pr_2666.prdoc similarity index 100% rename from prdoc/pr_2666.prdoc rename to prdoc/1.6.0/pr_2666.prdoc diff --git a/prdoc/pr_2682.prdoc b/prdoc/1.6.0/pr_2682.prdoc similarity index 100% rename from prdoc/pr_2682.prdoc rename to prdoc/1.6.0/pr_2682.prdoc diff --git a/prdoc/pr_2684.prdoc b/prdoc/1.6.0/pr_2684.prdoc similarity index 100% rename from prdoc/pr_2684.prdoc rename to prdoc/1.6.0/pr_2684.prdoc diff --git a/prdoc/pr_2687.prdoc b/prdoc/1.6.0/pr_2687.prdoc similarity index 100% rename from prdoc/pr_2687.prdoc rename to prdoc/1.6.0/pr_2687.prdoc diff --git a/prdoc/pr_2689.prdoc b/prdoc/1.6.0/pr_2689.prdoc similarity index 100% rename from prdoc/pr_2689.prdoc rename to prdoc/1.6.0/pr_2689.prdoc diff --git a/prdoc/pr_2694.prdoc b/prdoc/1.6.0/pr_2694.prdoc similarity index 100% rename from prdoc/pr_2694.prdoc rename to prdoc/1.6.0/pr_2694.prdoc diff --git a/prdoc/pr_2758.prdoc b/prdoc/1.6.0/pr_2758.prdoc similarity index 100% rename from prdoc/pr_2758.prdoc rename to prdoc/1.6.0/pr_2758.prdoc diff --git a/prdoc/pr_2764.prdoc b/prdoc/1.6.0/pr_2764.prdoc similarity index 100% rename from prdoc/pr_2764.prdoc rename to prdoc/1.6.0/pr_2764.prdoc diff --git a/prdoc/pr_2767.prdoc b/prdoc/1.6.0/pr_2767.prdoc similarity index 100% rename from prdoc/pr_2767.prdoc rename to prdoc/1.6.0/pr_2767.prdoc diff --git a/prdoc/pr_2771.prdoc b/prdoc/1.6.0/pr_2771.prdoc similarity index 100% rename from prdoc/pr_2771.prdoc rename to prdoc/1.6.0/pr_2771.prdoc diff --git a/prdoc/pr_2783.prdoc b/prdoc/1.6.0/pr_2783.prdoc similarity index 100% rename from prdoc/pr_2783.prdoc rename to prdoc/1.6.0/pr_2783.prdoc diff --git a/prdoc/pr_2799.prdoc b/prdoc/1.6.0/pr_2799.prdoc similarity index 100% rename from prdoc/pr_2799.prdoc rename to prdoc/1.6.0/pr_2799.prdoc diff --git a/prdoc/pr_2803.prdoc b/prdoc/1.6.0/pr_2803.prdoc similarity index 100% rename from prdoc/pr_2803.prdoc rename to prdoc/1.6.0/pr_2803.prdoc diff --git a/prdoc/pr_2804.prdoc b/prdoc/1.6.0/pr_2804.prdoc similarity index 100% rename from prdoc/pr_2804.prdoc rename to prdoc/1.6.0/pr_2804.prdoc diff --git a/prdoc/pr_2811.prdoc b/prdoc/1.6.0/pr_2811.prdoc similarity index 100% rename from prdoc/pr_2811.prdoc rename to prdoc/1.6.0/pr_2811.prdoc diff --git a/prdoc/pr_2813.prdoc b/prdoc/1.6.0/pr_2813.prdoc similarity index 100% rename from prdoc/pr_2813.prdoc rename to prdoc/1.6.0/pr_2813.prdoc diff --git a/prdoc/pr_2823.prdoc b/prdoc/1.6.0/pr_2823.prdoc similarity index 100% rename from prdoc/pr_2823.prdoc rename to prdoc/1.6.0/pr_2823.prdoc diff --git a/prdoc/pr_2834.prdoc b/prdoc/1.6.0/pr_2834.prdoc similarity index 100% rename from prdoc/pr_2834.prdoc rename to prdoc/1.6.0/pr_2834.prdoc diff --git a/prdoc/pr_2835.prdoc b/prdoc/1.6.0/pr_2835.prdoc similarity index 100% rename from prdoc/pr_2835.prdoc rename to prdoc/1.6.0/pr_2835.prdoc diff --git a/prdoc/pr_2862.prdoc b/prdoc/1.6.0/pr_2862.prdoc similarity index 100% rename from prdoc/pr_2862.prdoc rename to prdoc/1.6.0/pr_2862.prdoc diff --git a/prdoc/pr_2886.prdoc b/prdoc/1.6.0/pr_2886.prdoc similarity index 100% rename from prdoc/pr_2886.prdoc rename to prdoc/1.6.0/pr_2886.prdoc diff --git a/prdoc/pr_2899.prdoc b/prdoc/1.6.0/pr_2899.prdoc similarity index 100% rename from prdoc/pr_2899.prdoc rename to prdoc/1.6.0/pr_2899.prdoc -- GitLab From f574868822d5976219d391de5acd66bb773e4964 Mon Sep 17 00:00:00 2001 From: joe petrowski <25483142+joepetrowski@users.noreply.github.com> Date: Thu, 18 Jan 2024 07:46:08 +0100 Subject: [PATCH 184/191] Rococo Identity Migration Part 2 + Bug Fix (#2946) Order: - [x] Start People Chain - [RPC node](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Frococo-people-rpc.polkadot.io#/explorer) - [x] Upgrade Rococo Relay (`EnsureRoot` -> `EnsureSigned`) (v1,006,002) - Done [here](https://rococo.subscan.io/extrinsic/0xef07e0f9dbb2b9e829305f132e6ce45d291239286e409177e20895e6687daa6c) - [x] Migrate all identities - Done, see extrinsics from [this account](https://rococo.subscan.io/account/5FyNYrBwndvBttTkGUqGGCRAXtBH4Mh8xELDaxaFywTsjDKb) - [x] Upgrade Rococo People (remove call filter) (v1,006,002) - Authorized [here](https://rococo.subscan.io/extrinsic/0xedf6a80229bd411b7ed8d3a489a767b0f773bed5c49239987a294c293a35b98b) With added: - [x] Upgrade Rococo People to fix `poke_deposit` bug (v1,006,001) - Authorized [here](https://rococo.subscan.io/extrinsic/0xd1dc3cd6e8274bd0196f8d9f13ed09f6e9c76e6a40f9786a1629f4cb22cf948d) Note: It's also possible to remove the Identity Migrator pallet from both the Relay Chain and the parachain at this time. I will leave them in for now to preserve the test cases until we run them on Kusama/Polkadot. We will also want a follow up to remove all Identity-related state from the Relay Chain. --- .../people-rococo/src/tests/reap_identity.rs | 2 +- .../runtimes/people/people-rococo/src/lib.rs | 14 ++--- .../people/people-rococo/src/xcm_config.rs | 18 ++++--- .../people/people-westend/src/xcm_config.rs | 18 ++++--- polkadot/runtime/rococo/src/lib.rs | 7 ++- substrate/frame/identity/src/lib.rs | 25 +++++---- substrate/frame/identity/src/tests.rs | 51 +++++++++++++++++++ 7 files changed, 95 insertions(+), 40 deletions(-) diff --git a/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/reap_identity.rs b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/reap_identity.rs index 2902f359dfb..58bb9504dbd 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/reap_identity.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/people/people-rococo/src/tests/reap_identity.rs @@ -291,7 +291,7 @@ fn assert_reap_id_relay(total_deposit: Balance, id: &Identity) { assert_eq!(reserved_balance, total_deposit); assert_ok!(RococoIdentityMigrator::reap_identity( - RococoOrigin::root(), + RococoOrigin::signed(RococoRelaySender::get()), RococoRelaySender::get() )); diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs b/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs index ba5b727484c..21c24086cbe 100644 --- a/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/people/people-rococo/src/lib.rs @@ -30,8 +30,7 @@ use frame_support::{ genesis_builder_helper::{build_config, create_default_config}, parameter_types, traits::{ - ConstBool, ConstU32, ConstU64, ConstU8, Contains, EitherOfDiverse, EverythingBut, - TransformOrigin, + ConstBool, ConstU32, ConstU64, ConstU8, EitherOfDiverse, Everything, TransformOrigin, }, weights::{ConstantMultiplier, Weight}, PalletId, @@ -124,7 +123,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("people-rococo"), impl_name: create_runtime_str!("people-rococo"), authoring_version: 1, - spec_version: 1_006_000, + spec_version: 1_006_002, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 0, @@ -162,16 +161,9 @@ parameter_types! { pub const SS58Prefix: u8 = 42; } -pub struct IdentityCalls; -impl Contains for IdentityCalls { - fn contains(c: &RuntimeCall) -> bool { - matches!(c, RuntimeCall::Identity(_)) - } -} - #[derive_impl(frame_system::config_preludes::ParaChainDefaultConfig as frame_system::DefaultConfig)] impl frame_system::Config for Runtime { - type BaseCallFilter = EverythingBut; + type BaseCallFilter = Everything; type BlockWeights = RuntimeBlockWeights; type BlockLength = RuntimeBlockLength; type AccountId = AccountId; diff --git a/cumulus/parachains/runtimes/people/people-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/people/people-rococo/src/xcm_config.rs index 7ef6cb2fac9..168d7eaa605 100644 --- a/cumulus/parachains/runtimes/people/people-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/people/people-rococo/src/xcm_config.rs @@ -176,13 +176,17 @@ impl Contains for SafeCallFilter { matches!( call, - RuntimeCall::PolkadotXcm(pallet_xcm::Call::force_xcm_version { .. }) | - RuntimeCall::System( - frame_system::Call::set_heap_pages { .. } | - frame_system::Call::set_code { .. } | - frame_system::Call::set_code_without_checks { .. } | - frame_system::Call::kill_prefix { .. }, - ) | RuntimeCall::ParachainSystem(..) | + RuntimeCall::PolkadotXcm( + pallet_xcm::Call::force_xcm_version { .. } | + pallet_xcm::Call::force_default_xcm_version { .. } + ) | RuntimeCall::System( + frame_system::Call::set_heap_pages { .. } | + frame_system::Call::set_code { .. } | + frame_system::Call::set_code_without_checks { .. } | + frame_system::Call::authorize_upgrade { .. } | + frame_system::Call::authorize_upgrade_without_checks { .. } | + frame_system::Call::kill_prefix { .. }, + ) | RuntimeCall::ParachainSystem(..) | RuntimeCall::Timestamp(..) | RuntimeCall::Balances(..) | RuntimeCall::CollatorSelection( diff --git a/cumulus/parachains/runtimes/people/people-westend/src/xcm_config.rs b/cumulus/parachains/runtimes/people/people-westend/src/xcm_config.rs index 59c00dc5ff6..18c03a968ef 100644 --- a/cumulus/parachains/runtimes/people/people-westend/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/people/people-westend/src/xcm_config.rs @@ -183,13 +183,17 @@ impl Contains for SafeCallFilter { matches!( call, - RuntimeCall::PolkadotXcm(pallet_xcm::Call::force_xcm_version { .. }) | - RuntimeCall::System( - frame_system::Call::set_heap_pages { .. } | - frame_system::Call::set_code { .. } | - frame_system::Call::set_code_without_checks { .. } | - frame_system::Call::kill_prefix { .. }, - ) | RuntimeCall::ParachainSystem(..) | + RuntimeCall::PolkadotXcm( + pallet_xcm::Call::force_xcm_version { .. } | + pallet_xcm::Call::force_default_xcm_version { .. } + ) | RuntimeCall::System( + frame_system::Call::set_heap_pages { .. } | + frame_system::Call::set_code { .. } | + frame_system::Call::set_code_without_checks { .. } | + frame_system::Call::authorize_upgrade { .. } | + frame_system::Call::authorize_upgrade_without_checks { .. } | + frame_system::Call::kill_prefix { .. }, + ) | RuntimeCall::ParachainSystem(..) | RuntimeCall::Timestamp(..) | RuntimeCall::Balances(..) | RuntimeCall::CollatorSelection( diff --git a/polkadot/runtime/rococo/src/lib.rs b/polkadot/runtime/rococo/src/lib.rs index fec82fc86f9..0e2eaa03567 100644 --- a/polkadot/runtime/rococo/src/lib.rs +++ b/polkadot/runtime/rococo/src/lib.rs @@ -79,7 +79,7 @@ use frame_support::{ weights::{ConstantMultiplier, WeightMeter}, PalletId, }; -use frame_system::EnsureRoot; +use frame_system::{EnsureRoot, EnsureSigned}; use pallet_grandpa::{fg_primitives, AuthorityId as GrandpaId}; use pallet_identity::legacy::IdentityInfo; use pallet_session::historical as session_historical; @@ -150,7 +150,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("rococo"), impl_name: create_runtime_str!("parity-rococo-v2.0"), authoring_version: 0, - spec_version: 1_006_001, + spec_version: 1_006_002, impl_version: 0, apis: RUNTIME_API_VERSIONS, transaction_version: 24, @@ -1142,8 +1142,7 @@ impl auctions::Config for Runtime { impl identity_migrator::Config for Runtime { type RuntimeEvent = RuntimeEvent; - // To be changed to `EnsureSigned` once there is a People Chain to migrate to. - type Reaper = EnsureRoot; + type Reaper = EnsureSigned; type ReapIdentityHandler = ToParachainIdentityReaper; type WeightInfo = weights::runtime_common_identity_migrator::WeightInfo; } diff --git a/substrate/frame/identity/src/lib.rs b/substrate/frame/identity/src/lib.rs index 1df0a619ea4..78d59180b3f 100644 --- a/substrate/frame/identity/src/lib.rs +++ b/substrate/frame/identity/src/lib.rs @@ -1395,16 +1395,21 @@ impl Pallet { }, )?; - // Subs Deposit - let new_subs_deposit = SubsOf::::try_mutate( - &target, - |(current_subs_deposit, subs_of)| -> Result, DispatchError> { - let new_subs_deposit = Self::subs_deposit(subs_of.len() as u32); - Self::rejig_deposit(&target, *current_subs_deposit, new_subs_deposit)?; - *current_subs_deposit = new_subs_deposit; - Ok(new_subs_deposit) - }, - )?; + let new_subs_deposit = if SubsOf::::contains_key(&target) { + SubsOf::::try_mutate( + &target, + |(current_subs_deposit, subs_of)| -> Result, DispatchError> { + let new_subs_deposit = Self::subs_deposit(subs_of.len() as u32); + Self::rejig_deposit(&target, *current_subs_deposit, new_subs_deposit)?; + *current_subs_deposit = new_subs_deposit; + Ok(new_subs_deposit) + }, + )? + } else { + // If the item doesn't exist, there is no "old" deposit, and the new one is zero, so no + // need to call rejig, it'd just be zero -> zero. + Zero::zero() + }; Ok((new_id_deposit, new_subs_deposit)) } diff --git a/substrate/frame/identity/src/tests.rs b/substrate/frame/identity/src/tests.rs index 4da31782261..e6107cda0f0 100644 --- a/substrate/frame/identity/src/tests.rs +++ b/substrate/frame/identity/src/tests.rs @@ -952,6 +952,57 @@ fn poke_deposit_works() { }); } +#[test] +fn poke_deposit_does_not_insert_new_subs_storage() { + new_test_ext().execute_with(|| { + let [_, _, _, _, ten, _, _, _] = accounts(); + let ten_info = infoof_ten(); + // Set a custom registration with 0 deposit + IdentityOf::::insert::< + _, + ( + Registration>, + Option>, + ), + >( + &ten, + ( + Registration { + judgements: Default::default(), + deposit: Zero::zero(), + info: ten_info.clone(), + }, + None::>, + ), + ); + assert!(Identity::identity(ten.clone()).is_some()); + + // Balance is free + assert_eq!(Balances::free_balance(ten.clone()), 1000); + + // poke + assert_ok!(Identity::poke_deposit(&ten)); + + // free balance reduced correctly + let id_deposit = id_deposit(&ten_info); + assert_eq!(Balances::free_balance(ten.clone()), 1000 - id_deposit); + // new registration deposit is 10 + assert_eq!( + Identity::identity(&ten), + Some(( + Registration { + judgements: Default::default(), + deposit: id_deposit, + info: infoof_ten() + }, + None + )) + ); + // No new subs storage item. + assert!(!SubsOf::::contains_key(&ten)); + }); +} + #[test] fn adding_and_removing_authorities_should_work() { new_test_ext().execute_with(|| { -- GitLab From f8954093b4226512ea63cb59aae1f6890aeffe76 Mon Sep 17 00:00:00 2001 From: Tsvetomir Dimitrov Date: Thu, 18 Jan 2024 09:33:58 +0200 Subject: [PATCH 185/191] Filter votes from disabled validators in `BackedCandidates` in process_inherent_data (#2889) Backport of https://github.com/paritytech/polkadot-sdk/pull/1863 to master Extend candidate sanitation in paras_inherent by removing backing votes from disabled validators. Check https://github.com/paritytech/polkadot-sdk/issues/1592 for more details. This change is related to the disabling strategy implementation (https://github.com/paritytech/polkadot-sdk/pull/2226). --------- Co-authored-by: ordian Co-authored-by: ordian Co-authored-by: Maciej --- .../src/runtime/parainherent.md | 32 +++ .../runtime/common/src/assigned_slots/mod.rs | 4 +- .../runtime/common/src/integration_tests.rs | 4 +- .../runtime/common/src/paras_registrar/mod.rs | 4 +- polkadot/runtime/parachains/src/mock.rs | 27 ++- .../parachains/src/paras_inherent/mod.rs | 181 ++++++++++++++-- .../parachains/src/paras_inherent/tests.rs | 199 ++++++++++++++++-- .../src/runtime_api_impl/vstaging.rs | 19 +- polkadot/runtime/parachains/src/scheduler.rs | 5 + polkadot/runtime/parachains/src/shared.rs | 42 +++- polkadot/runtime/rococo/src/lib.rs | 4 +- polkadot/runtime/test-runtime/src/lib.rs | 4 +- polkadot/runtime/westend/src/lib.rs | 4 +- polkadot/xcm/xcm-builder/tests/mock/mod.rs | 4 +- .../xcm-simulator/example/src/relay_chain.rs | 4 +- .../xcm-simulator/fuzzer/src/relay_chain.rs | 4 +- prdoc/pr_2889.prdoc | 10 + substrate/frame/aura/src/mock.rs | 4 + .../contracts/mock-network/src/relay_chain.rs | 4 +- substrate/frame/session/src/lib.rs | 4 + .../frame/support/src/traits/validation.rs | 7 + 21 files changed, 506 insertions(+), 64 deletions(-) create mode 100644 prdoc/pr_2889.prdoc diff --git a/polkadot/roadmap/implementers-guide/src/runtime/parainherent.md b/polkadot/roadmap/implementers-guide/src/runtime/parainherent.md index 4a771f1df64..5419ddae83d 100644 --- a/polkadot/roadmap/implementers-guide/src/runtime/parainherent.md +++ b/polkadot/roadmap/implementers-guide/src/runtime/parainherent.md @@ -60,3 +60,35 @@ processing it, so the processed inherent data is simply dropped. This also means that the `enter` function keeps data around for no good reason. This seems acceptable though as the size of a block is rather limited. Nevertheless if we ever wanted to optimize this we can easily implement an inherent collector that has two implementations, where one clones and stores the data and the other just passes it on. + +## Sanitization + +`ParasInherent` with the entry point of `create_inherent` sanitizes the input data, while the `enter` entry point +enforces already sanitized input data. If unsanitized data is provided the module generates an error. + +Disputes are included in the block with a priority for a security reasons. It's important to include as many dispute +votes onchain as possible so that disputes conclude faster and the offenders are punished. However if there are too many +disputes to include in a block the dispute set is trimmed so that it respects max block weight. + +Dispute data is first deduplicated and sorted by block number (older first) and dispute location (local then remote). +Concluded and ancient (disputes initiated before the post conclusion acceptance period) disputes are filtered out. +Votes with invalid signatures or from unknown validators (not found in the active set for the current session) are also +filtered out. + +All dispute statements are included in the order described in the previous paragraph until the available block weight is +exhausted. After the dispute data is included all remaining weight is filled in with candidates and availability +bitfields. Bitfields are included with priority, then candidates containing code updates and finally any backed +candidates. If there is not enough weight for all backed candidates they are trimmed by random selection. Disputes are +processed in three separate functions - `deduplicate_and_sort_dispute_data`, `filter_dispute_data` and +`limit_and_sanitize_disputes`. + +Availability bitfields are also sanitized by dropping malformed ones, containing disputed cores or bad signatures. Refer +to `sanitize_bitfields` function for implementation details. + +Backed candidates sanitization removes malformed ones, candidates which have got concluded invalid disputes against them +or candidates produced by unassigned cores. Furthermore any backing votes from disabled validators for a candidate are +dropped. This is part of the validator disabling strategy. After filtering the statements from disabled validators a +backed candidate may end up with votes count less than `minimum_backing_votes` (a parameter from `HostConfiguiration`). +In this case the whole candidate is dropped otherwise it will be rejected by `process_candidates` from pallet inclusion. +All checks related to backed candidates are implemented in `sanitize_backed_candidates` and +`filter_backed_statements_from_disabled_validators`. diff --git a/polkadot/runtime/common/src/assigned_slots/mod.rs b/polkadot/runtime/common/src/assigned_slots/mod.rs index cb56cb8a118..de8c00df9dd 100644 --- a/polkadot/runtime/common/src/assigned_slots/mod.rs +++ b/polkadot/runtime/common/src/assigned_slots/mod.rs @@ -746,7 +746,9 @@ mod tests { type AssignCoretime = (); } - impl parachains_shared::Config for Test {} + impl parachains_shared::Config for Test { + type DisabledValidators = (); + } parameter_types! { pub const LeasePeriod: BlockNumber = 3; diff --git a/polkadot/runtime/common/src/integration_tests.rs b/polkadot/runtime/common/src/integration_tests.rs index cfa8f4c3ad9..b536b80e245 100644 --- a/polkadot/runtime/common/src/integration_tests.rs +++ b/polkadot/runtime/common/src/integration_tests.rs @@ -197,7 +197,9 @@ impl configuration::Config for Test { type WeightInfo = configuration::TestWeightInfo; } -impl shared::Config for Test {} +impl shared::Config for Test { + type DisabledValidators = (); +} impl origin::Config for Test {} diff --git a/polkadot/runtime/common/src/paras_registrar/mod.rs b/polkadot/runtime/common/src/paras_registrar/mod.rs index 9719f02677d..448490b34a7 100644 --- a/polkadot/runtime/common/src/paras_registrar/mod.rs +++ b/polkadot/runtime/common/src/paras_registrar/mod.rs @@ -799,7 +799,9 @@ mod tests { type MaxFreezes = ConstU32<1>; } - impl shared::Config for Test {} + impl shared::Config for Test { + type DisabledValidators = (); + } impl origin::Config for Test {} diff --git a/polkadot/runtime/parachains/src/mock.rs b/polkadot/runtime/parachains/src/mock.rs index c08bab0ef0f..e3fcf7dd603 100644 --- a/polkadot/runtime/parachains/src/mock.rs +++ b/polkadot/runtime/parachains/src/mock.rs @@ -194,7 +194,22 @@ impl crate::configuration::Config for Test { type WeightInfo = crate::configuration::TestWeightInfo; } -impl crate::shared::Config for Test {} +pub struct MockDisabledValidators {} +impl frame_support::traits::DisabledValidators for MockDisabledValidators { + /// Returns true if the given validator is disabled. + fn is_disabled(index: u32) -> bool { + disabled_validators().iter().any(|v| *v == index) + } + + /// Returns a hardcoded list (`DISABLED_VALIDATORS`) of disabled validators + fn disabled_validators() -> Vec { + disabled_validators() + } +} + +impl crate::shared::Config for Test { + type DisabledValidators = MockDisabledValidators; +} impl origin::Config for Test {} @@ -564,6 +579,8 @@ thread_local! { pub static AVAILABILITY_REWARDS: RefCell> = RefCell::new(HashMap::new()); + + pub static DISABLED_VALIDATORS: RefCell> = RefCell::new(vec![]); } pub fn backing_rewards() -> HashMap { @@ -574,6 +591,10 @@ pub fn availability_rewards() -> HashMap { AVAILABILITY_REWARDS.with(|r| r.borrow().clone()) } +pub fn disabled_validators() -> Vec { + DISABLED_VALIDATORS.with(|r| r.borrow().clone()) +} + parameter_types! { pub static Processed: Vec<(ParaId, UpwardMessage)> = vec![]; } @@ -713,3 +734,7 @@ pub(crate) fn deregister_parachain(id: ParaId) { pub(crate) fn try_deregister_parachain(id: ParaId) -> crate::DispatchResult { frame_support::storage::transactional::with_storage_layer(|| Paras::schedule_para_cleanup(id)) } + +pub(crate) fn set_disabled_validators(disabled: Vec) { + DISABLED_VALIDATORS.with(|d| *d.borrow_mut() = disabled) +} diff --git a/polkadot/runtime/parachains/src/paras_inherent/mod.rs b/polkadot/runtime/parachains/src/paras_inherent/mod.rs index 8c33199c092..81e092f0a99 100644 --- a/polkadot/runtime/parachains/src/paras_inherent/mod.rs +++ b/polkadot/runtime/parachains/src/paras_inherent/mod.rs @@ -30,7 +30,8 @@ use crate::{ metrics::METRICS, paras, scheduler::{self, FreedReason}, - shared, ParaId, + shared::{self, AllowedRelayParentsTracker}, + ParaId, }; use bitvec::prelude::BitVec; use frame_support::{ @@ -42,8 +43,8 @@ use frame_support::{ use frame_system::pallet_prelude::*; use pallet_babe::{self, ParentBlockRandomness}; use primitives::{ - BackedCandidate, CandidateHash, CandidateReceipt, CheckedDisputeStatementSet, - CheckedMultiDisputeStatementSet, CoreIndex, DisputeStatementSet, + effective_minimum_backing_votes, BackedCandidate, CandidateHash, CandidateReceipt, + CheckedDisputeStatementSet, CheckedMultiDisputeStatementSet, CoreIndex, DisputeStatementSet, InherentData as ParachainsInherentData, MultiDisputeStatementSet, ScrapedOnChainVotes, SessionIndex, SignedAvailabilityBitfields, SigningContext, UncheckedSignedAvailabilityBitfield, UncheckedSignedAvailabilityBitfields, ValidatorId, ValidatorIndex, ValidityAttestation, @@ -142,6 +143,8 @@ pub mod pallet { DisputeStatementsUnsortedOrDuplicates, /// A dispute statement was invalid. DisputeInvalid, + /// A candidate was backed by a disabled validator + BackedByDisabled, } /// Whether the paras inherent was included within this block. @@ -378,6 +381,7 @@ impl Pallet { let bitfields_weight = signed_bitfields_weight::(&bitfields); let disputes_weight = multi_dispute_statement_sets_weight::(&disputes); + // Weight before filtering/sanitization let all_weight_before = candidates_weight + bitfields_weight + disputes_weight; METRICS.on_before_filter(all_weight_before.ref_time()); @@ -587,17 +591,19 @@ impl Pallet { METRICS.on_candidates_processed_total(backed_candidates.len() as u64); - let backed_candidates = sanitize_backed_candidates::( - backed_candidates, - |candidate_idx: usize, - backed_candidate: &BackedCandidate<::Hash>| - -> bool { - let para_id = backed_candidate.descriptor().para_id; - let prev_context = >::para_most_recent_context(para_id); - let check_ctx = CandidateCheckContext::::new(prev_context); - - // never include a concluded-invalid candidate - current_concluded_invalid_disputes.contains(&backed_candidate.hash()) || + let SanitizedBackedCandidates { backed_candidates, votes_from_disabled_were_dropped } = + sanitize_backed_candidates::( + backed_candidates, + &allowed_relay_parents, + |candidate_idx: usize, + backed_candidate: &BackedCandidate<::Hash>| + -> bool { + let para_id = backed_candidate.descriptor().para_id; + let prev_context = >::para_most_recent_context(para_id); + let check_ctx = CandidateCheckContext::::new(prev_context); + + // never include a concluded-invalid candidate + current_concluded_invalid_disputes.contains(&backed_candidate.hash()) || // Instead of checking the candidates with code upgrades twice // move the checking up here and skip it in the training wheels fallback. // That way we avoid possible duplicate checks while assuring all @@ -607,12 +613,19 @@ impl Pallet { check_ctx .verify_backed_candidate(&allowed_relay_parents, candidate_idx, backed_candidate) .is_err() - }, - &scheduled, - ); + }, + &scheduled, + ); METRICS.on_candidates_sanitized(backed_candidates.len() as u64); + // In `Enter` context (invoked during execution) there should be no backing votes from + // disabled validators because they should have been filtered out during inherent data + // preparation (`ProvideInherent` context). Abort in such cases. + if context == ProcessInherentDataContext::Enter { + ensure!(!votes_from_disabled_were_dropped, Error::::BackedByDisabled); + } + // Process backed candidates according to scheduled cores. let inclusion::ProcessedCandidates::< as HeaderT>::Hash> { core_indices: occupied, @@ -900,7 +913,19 @@ pub(crate) fn sanitize_bitfields( bitfields } -/// Filter out any candidates that have a concluded invalid dispute. +// Result from `sanitize_backed_candidates` +#[derive(Debug, PartialEq)] +struct SanitizedBackedCandidates { + // Sanitized backed candidates. The `Vec` is sorted according to the occupied core index. + backed_candidates: Vec>, + // Set to true if any votes from disabled validators were dropped from the input. + votes_from_disabled_were_dropped: bool, +} + +/// Filter out: +/// 1. any candidates that have a concluded invalid dispute +/// 2. all backing votes from disabled validators +/// 3. any candidates that end up with less than `effective_minimum_backing_votes` backing votes /// /// `scheduled` follows the same naming scheme as provided in the /// guide: Currently `free` but might become `occupied`. @@ -910,15 +935,17 @@ pub(crate) fn sanitize_bitfields( /// `candidate_has_concluded_invalid_dispute` must return `true` if the candidate /// is disputed, false otherwise. The passed `usize` is the candidate index. /// -/// The returned `Vec` is sorted according to the occupied core index. +/// Returns struct `SanitizedBackedCandidates` where `backed_candidates` are sorted according to the +/// occupied core index. fn sanitize_backed_candidates< T: crate::inclusion::Config, F: FnMut(usize, &BackedCandidate) -> bool, >( mut backed_candidates: Vec>, + allowed_relay_parents: &AllowedRelayParentsTracker>, mut candidate_has_concluded_invalid_dispute_or_is_invalid: F, scheduled: &BTreeMap, -) -> Vec> { +) -> SanitizedBackedCandidates { // Remove any candidates that were concluded invalid. // This does not assume sorting. backed_candidates.indexed_retain(move |candidate_idx, backed_candidate| { @@ -936,6 +963,13 @@ fn sanitize_backed_candidates< scheduled.get(&desc.para_id).is_some() }); + // Filter out backing statements from disabled validators + let dropped_disabled = filter_backed_statements_from_disabled_validators::( + &mut backed_candidates, + &allowed_relay_parents, + scheduled, + ); + // Sort the `Vec` last, once there is a guarantee that these // `BackedCandidates` references the expected relay chain parent, // but more importantly are scheduled for a free core. @@ -946,7 +980,10 @@ fn sanitize_backed_candidates< scheduled[&x.descriptor().para_id].cmp(&scheduled[&y.descriptor().para_id]) }); - backed_candidates + SanitizedBackedCandidates { + backed_candidates, + votes_from_disabled_were_dropped: dropped_disabled, + } } /// Derive entropy from babe provided per block randomness. @@ -1029,3 +1066,105 @@ fn limit_and_sanitize_disputes< (checked, checked_disputes_weight) } } + +// Filters statements from disabled validators in `BackedCandidate`, non-scheduled candidates and +// few more sanity checks. Returns `true` if at least one statement is removed and `false` +// otherwise. +fn filter_backed_statements_from_disabled_validators( + backed_candidates: &mut Vec::Hash>>, + allowed_relay_parents: &AllowedRelayParentsTracker>, + scheduled: &BTreeMap, +) -> bool { + let disabled_validators = + BTreeSet::<_>::from_iter(shared::Pallet::::disabled_validators().into_iter()); + + if disabled_validators.is_empty() { + // No disabled validators - nothing to do + return false + } + + let backed_len_before = backed_candidates.len(); + + // Flag which will be returned. Set to `true` if at least one vote is filtered. + let mut filtered = false; + + let minimum_backing_votes = configuration::Pallet::::config().minimum_backing_votes; + + // Process all backed candidates. `validator_indices` in `BackedCandidates` are indices within + // the validator group assigned to the parachain. To obtain this group we need: + // 1. Core index assigned to the parachain which has produced the candidate + // 2. The relay chain block number of the candidate + backed_candidates.retain_mut(|bc| { + // Get `core_idx` assigned to the `para_id` of the candidate + let core_idx = match scheduled.get(&bc.descriptor().para_id) { + Some(core_idx) => *core_idx, + None => { + log::debug!(target: LOG_TARGET, "Can't get core idx of a backed candidate for para id {:?}. Dropping the candidate.", bc.descriptor().para_id); + return false + } + }; + + // Get relay parent block number of the candidate. We need this to get the group index assigned to this core at this block number + let relay_parent_block_number = match allowed_relay_parents + .acquire_info(bc.descriptor().relay_parent, None) { + Some((_, block_num)) => block_num, + None => { + log::debug!(target: LOG_TARGET, "Relay parent {:?} for candidate is not in the allowed relay parents. Dropping the candidate.", bc.descriptor().relay_parent); + return false + } + }; + + // Get the group index for the core + let group_idx = match >::group_assigned_to_core( + core_idx, + relay_parent_block_number + One::one(), + ) { + Some(group_idx) => group_idx, + None => { + log::debug!(target: LOG_TARGET, "Can't get the group index for core idx {:?}. Dropping the candidate.", core_idx); + return false + }, + }; + + // And finally get the validator group for this group index + let validator_group = match >::group_validators(group_idx) { + Some(validator_group) => validator_group, + None => { + log::debug!(target: LOG_TARGET, "Can't get the validators from group {:?}. Dropping the candidate.", group_idx); + return false + } + }; + + // Bitmask with the disabled indices within the validator group + let disabled_indices = BitVec::::from_iter(validator_group.iter().map(|idx| disabled_validators.contains(idx))); + // The indices of statements from disabled validators in `BackedCandidate`. We have to drop these. + let indices_to_drop = disabled_indices.clone() & &bc.validator_indices; + // Apply the bitmask to drop the disabled validator from `validator_indices` + bc.validator_indices &= !disabled_indices; + // Remove the corresponding votes from `validity_votes` + for idx in indices_to_drop.iter_ones().rev() { + bc.validity_votes.remove(idx); + } + + // If at least one statement was dropped we need to return `true` + if indices_to_drop.count_ones() > 0 { + filtered = true; + } + + // By filtering votes we might render the candidate invalid and cause a failure in + // [`process_candidates`]. To avoid this we have to perform a sanity check here. If there + // are not enough backing votes after filtering we will remove the whole candidate. + if bc.validity_votes.len() < effective_minimum_backing_votes( + validator_group.len(), + minimum_backing_votes + + ) { + return false + } + + true + }); + + // Also return `true` if a whole candidate was dropped from the set + filtered || backed_len_before != backed_candidates.len() +} diff --git a/polkadot/runtime/parachains/src/paras_inherent/tests.rs b/polkadot/runtime/parachains/src/paras_inherent/tests.rs index e62d1cb68ff..6f3eac35685 100644 --- a/polkadot/runtime/parachains/src/paras_inherent/tests.rs +++ b/polkadot/runtime/parachains/src/paras_inherent/tests.rs @@ -1227,6 +1227,12 @@ mod sanitizers { } mod candidates { + use crate::{ + mock::set_disabled_validators, + scheduler::{common::Assignment, ParasEntry}, + }; + use sp_std::collections::vec_deque::VecDeque; + use super::*; // Backed candidates and scheduled parachains used for `sanitize_backed_candidates` testing @@ -1235,10 +1241,20 @@ mod sanitizers { scheduled_paras: BTreeMap, } - // Generate test data for the candidates test + // Generate test data for the candidates and assert that the evnironment is set as expected + // (check the comments for details) fn get_test_data() -> TestData { const RELAY_PARENT_NUM: u32 = 3; + // Add the relay parent to `shared` pallet. Otherwise some code (e.g. filtering backing + // votes) won't behave correctly + shared::Pallet::::add_allowed_relay_parent( + default_header().hash(), + Default::default(), + RELAY_PARENT_NUM, + 1, + ); + let header = default_header(); let relay_parent = header.hash(); let session_index = SessionIndex::from(0_u32); @@ -1252,6 +1268,7 @@ mod sanitizers { keyring::Sr25519Keyring::Bob, keyring::Sr25519Keyring::Charlie, keyring::Sr25519Keyring::Dave, + keyring::Sr25519Keyring::Eve, ]; for validator in validators.iter() { Keystore::sr25519_generate_new( @@ -1262,11 +1279,42 @@ mod sanitizers { .unwrap(); } + // Set active validators in `shared` pallet + let validator_ids = + validators.iter().map(|v| v.public().into()).collect::>(); + shared::Pallet::::set_active_validators_ascending(validator_ids); + + // Two scheduled parachains - ParaId(1) on CoreIndex(0) and ParaId(2) on CoreIndex(1) let scheduled = (0_usize..2) .into_iter() .map(|idx| (ParaId::from(1_u32 + idx as u32), CoreIndex::from(idx as u32))) .collect::>(); + // Set the validator groups in `scheduler` + scheduler::Pallet::::set_validator_groups(vec![ + vec![ValidatorIndex(0), ValidatorIndex(1)], + vec![ValidatorIndex(2), ValidatorIndex(3)], + ]); + + // Update scheduler's claimqueue with the parachains + scheduler::Pallet::::set_claimqueue(BTreeMap::from([ + ( + CoreIndex::from(0), + VecDeque::from([ParasEntry::new( + Assignment::Pool { para_id: 1.into(), core_index: CoreIndex(1) }, + RELAY_PARENT_NUM, + )]), + ), + ( + CoreIndex::from(1), + VecDeque::from([ParasEntry::new( + Assignment::Pool { para_id: 2.into(), core_index: CoreIndex(1) }, + RELAY_PARENT_NUM, + )]), + ), + ])); + + // Callback used for backing candidates let group_validators = |group_index: GroupIndex| { match group_index { group_index if group_index == GroupIndex::from(0) => Some(vec![0, 1]), @@ -1276,6 +1324,7 @@ mod sanitizers { .map(|m| m.into_iter().map(ValidatorIndex).collect::>()) }; + // Two backed candidates from each parachain let backed_candidates = (0_usize..2) .into_iter() .map(|idx0| { @@ -1304,6 +1353,22 @@ mod sanitizers { }) .collect::>(); + // State sanity checks + assert_eq!( + >::scheduled_paras().collect::>(), + vec![(CoreIndex(0), ParaId::from(1)), (CoreIndex(1), ParaId::from(2))] + ); + assert_eq!( + shared::Pallet::::active_validator_indices(), + vec![ + ValidatorIndex(0), + ValidatorIndex(1), + ValidatorIndex(2), + ValidatorIndex(3), + ValidatorIndex(4) + ] + ); + TestData { backed_candidates, scheduled_paras: scheduled } } @@ -1318,10 +1383,14 @@ mod sanitizers { assert_eq!( sanitize_backed_candidates::( backed_candidates.clone(), + &>::allowed_relay_parents(), has_concluded_invalid, &scheduled ), - backed_candidates + SanitizedBackedCandidates { + backed_candidates, + votes_from_disabled_were_dropped: false + } ); {} @@ -1337,12 +1406,18 @@ mod sanitizers { let has_concluded_invalid = |_idx: usize, _backed_candidate: &BackedCandidate| -> bool { false }; - assert!(sanitize_backed_candidates::( + let SanitizedBackedCandidates { + backed_candidates: sanitized_backed_candidates, + votes_from_disabled_were_dropped, + } = sanitize_backed_candidates::( backed_candidates.clone(), + &>::allowed_relay_parents(), has_concluded_invalid, - &scheduled - ) - .is_empty()); + &scheduled, + ); + + assert!(sanitized_backed_candidates.is_empty()); + assert!(!votes_from_disabled_were_dropped); }); } @@ -1364,15 +1439,113 @@ mod sanitizers { }; let has_concluded_invalid = |_idx: usize, candidate: &BackedCandidate| set.contains(&candidate.hash()); + let SanitizedBackedCandidates { + backed_candidates: sanitized_backed_candidates, + votes_from_disabled_were_dropped, + } = sanitize_backed_candidates::( + backed_candidates.clone(), + &>::allowed_relay_parents(), + has_concluded_invalid, + &scheduled, + ); + + assert_eq!(sanitized_backed_candidates.len(), backed_candidates.len() / 2); + assert!(!votes_from_disabled_were_dropped); + }); + } + + #[test] + fn disabled_non_signing_validator_doesnt_get_filtered() { + new_test_ext(MockGenesisConfig::default()).execute_with(|| { + let TestData { mut backed_candidates, scheduled_paras } = get_test_data(); + + // Disable Eve + set_disabled_validators(vec![4]); + + let before = backed_candidates.clone(); + + // Eve is disabled but no backing statement is signed by it so nothing should be + // filtered + assert!(!filter_backed_statements_from_disabled_validators::( + &mut backed_candidates, + &>::allowed_relay_parents(), + &scheduled_paras + )); + assert_eq!(backed_candidates, before); + }); + } + + #[test] + fn drop_statements_from_disabled_without_dropping_candidate() { + new_test_ext(MockGenesisConfig::default()).execute_with(|| { + let TestData { mut backed_candidates, scheduled_paras } = get_test_data(); + + // Disable Alice + set_disabled_validators(vec![0]); + + // Update `minimum_backing_votes` in HostConfig. We want `minimum_backing_votes` set + // to one so that the candidate will have enough backing votes even after dropping + // Alice's one. + let mut hc = configuration::Pallet::::config(); + hc.minimum_backing_votes = 1; + configuration::Pallet::::force_set_active_config(hc); + + // Verify the initial state is as expected + assert_eq!(backed_candidates.get(0).unwrap().validity_votes.len(), 2); assert_eq!( - sanitize_backed_candidates::( - backed_candidates.clone(), - has_concluded_invalid, - &scheduled - ) - .len(), - backed_candidates.len() / 2 + backed_candidates.get(0).unwrap().validator_indices.get(0).unwrap(), + true + ); + assert_eq!( + backed_candidates.get(0).unwrap().validator_indices.get(1).unwrap(), + true + ); + let untouched = backed_candidates.get(1).unwrap().clone(); + + assert!(filter_backed_statements_from_disabled_validators::( + &mut backed_candidates, + &>::allowed_relay_parents(), + &scheduled_paras + )); + + // there should still be two backed candidates + assert_eq!(backed_candidates.len(), 2); + // but the first one should have only one validity vote + assert_eq!(backed_candidates.get(0).unwrap().validity_votes.len(), 1); + // Validator 0 vote should be dropped, validator 1 - retained + assert_eq!( + backed_candidates.get(0).unwrap().validator_indices.get(0).unwrap(), + false ); + assert_eq!( + backed_candidates.get(0).unwrap().validator_indices.get(1).unwrap(), + true + ); + // the second candidate shouldn't be modified + assert_eq!(*backed_candidates.get(1).unwrap(), untouched); + }); + } + + #[test] + fn drop_candidate_if_all_statements_are_from_disabled() { + new_test_ext(MockGenesisConfig::default()).execute_with(|| { + let TestData { mut backed_candidates, scheduled_paras } = get_test_data(); + + // Disable Alice and Bob + set_disabled_validators(vec![0, 1]); + + // Verify the initial state is as expected + assert_eq!(backed_candidates.get(0).unwrap().validity_votes.len(), 2); + let untouched = backed_candidates.get(1).unwrap().clone(); + + assert!(filter_backed_statements_from_disabled_validators::( + &mut backed_candidates, + &>::allowed_relay_parents(), + &scheduled_paras + )); + + assert_eq!(backed_candidates.len(), 1); + assert_eq!(*backed_candidates.get(0).unwrap(), untouched); }); } } diff --git a/polkadot/runtime/parachains/src/runtime_api_impl/vstaging.rs b/polkadot/runtime/parachains/src/runtime_api_impl/vstaging.rs index 0da50f6a537..1fee1a4097d 100644 --- a/polkadot/runtime/parachains/src/runtime_api_impl/vstaging.rs +++ b/polkadot/runtime/parachains/src/runtime_api_impl/vstaging.rs @@ -21,29 +21,16 @@ use primitives::{ vstaging::{ApprovalVotingParams, NodeFeatures}, ValidatorIndex, }; -use sp_std::{collections::btree_map::BTreeMap, prelude::Vec}; +use sp_std::prelude::Vec; /// Implementation for `DisabledValidators` // CAVEAT: this should only be called on the node side // as it might produce incorrect results on session boundaries pub fn disabled_validators() -> Vec where - T: pallet_session::Config + shared::Config, + T: shared::Config, { - let shuffled_indices = >::active_validator_indices(); - // mapping from raw validator index to `ValidatorIndex` - // this computation is the same within a session, but should be cheap - let reverse_index = shuffled_indices - .iter() - .enumerate() - .map(|(i, v)| (v.0, ValidatorIndex(i as u32))) - .collect::>(); - - // we might have disabled validators who are not parachain validators - >::disabled_validators() - .iter() - .filter_map(|v| reverse_index.get(v).cloned()) - .collect() + >::disabled_validators() } /// Returns the current state of the node features. diff --git a/polkadot/runtime/parachains/src/scheduler.rs b/polkadot/runtime/parachains/src/scheduler.rs index 08ce656b2b2..a666f568908 100644 --- a/polkadot/runtime/parachains/src/scheduler.rs +++ b/polkadot/runtime/parachains/src/scheduler.rs @@ -691,4 +691,9 @@ impl Pallet { pub(crate) fn set_validator_groups(validator_groups: Vec>) { ValidatorGroups::::set(validator_groups); } + + #[cfg(test)] + pub(crate) fn set_claimqueue(claimqueue: BTreeMap>>) { + ClaimQueue::::set(claimqueue); + } } diff --git a/polkadot/runtime/parachains/src/shared.rs b/polkadot/runtime/parachains/src/shared.rs index ad13c9e4844..bdaffcd505f 100644 --- a/polkadot/runtime/parachains/src/shared.rs +++ b/polkadot/runtime/parachains/src/shared.rs @@ -19,11 +19,14 @@ //! To avoid cyclic dependencies, it is important that this pallet is not //! dependent on any of the other pallets. -use frame_support::pallet_prelude::*; +use frame_support::{pallet_prelude::*, traits::DisabledValidators}; use frame_system::pallet_prelude::BlockNumberFor; use primitives::{SessionIndex, ValidatorId, ValidatorIndex}; use sp_runtime::traits::AtLeast32BitUnsigned; -use sp_std::{collections::vec_deque::VecDeque, vec::Vec}; +use sp_std::{ + collections::{btree_map::BTreeMap, vec_deque::VecDeque}, + vec::Vec, +}; use rand::{seq::SliceRandom, SeedableRng}; use rand_chacha::ChaCha20Rng; @@ -129,7 +132,9 @@ pub mod pallet { pub struct Pallet(_); #[pallet::config] - pub trait Config: frame_system::Config {} + pub trait Config: frame_system::Config { + type DisabledValidators: frame_support::traits::DisabledValidators; + } /// The current session index. #[pallet::storage] @@ -216,6 +221,25 @@ impl Pallet { Self::session_index().saturating_add(SESSION_DELAY) } + /// Fetches disabled validators list from session pallet. + /// CAVEAT: this might produce incorrect results on session boundaries + pub fn disabled_validators() -> Vec { + let shuffled_indices = Pallet::::active_validator_indices(); + // mapping from raw validator index to `ValidatorIndex` + // this computation is the same within a session, but should be cheap + let reverse_index = shuffled_indices + .iter() + .enumerate() + .map(|(i, v)| (v.0, ValidatorIndex(i as u32))) + .collect::>(); + + // we might have disabled validators who are not parachain validators + T::DisabledValidators::disabled_validators() + .iter() + .filter_map(|v| reverse_index.get(v).cloned()) + .collect() + } + /// Test function for setting the current session index. #[cfg(any(feature = "std", feature = "runtime-benchmarks", test))] pub fn set_session_index(index: SessionIndex) { @@ -239,4 +263,16 @@ impl Pallet { ActiveValidatorIndices::::set(indices); ActiveValidatorKeys::::set(keys); } + + #[cfg(test)] + pub(crate) fn add_allowed_relay_parent( + relay_parent: T::Hash, + state_root: T::Hash, + number: BlockNumberFor, + max_ancestry_len: u32, + ) { + AllowedRelayParents::::mutate(|tracker| { + tracker.update(relay_parent, state_root, number, max_ancestry_len) + }) + } } diff --git a/polkadot/runtime/rococo/src/lib.rs b/polkadot/runtime/rococo/src/lib.rs index 0e2eaa03567..51c00336bef 100644 --- a/polkadot/runtime/rococo/src/lib.rs +++ b/polkadot/runtime/rococo/src/lib.rs @@ -909,7 +909,9 @@ impl parachains_configuration::Config for Runtime { type WeightInfo = weights::runtime_parachains_configuration::WeightInfo; } -impl parachains_shared::Config for Runtime {} +impl parachains_shared::Config for Runtime { + type DisabledValidators = Session; +} impl parachains_session_info::Config for Runtime { type ValidatorSet = Historical; diff --git a/polkadot/runtime/test-runtime/src/lib.rs b/polkadot/runtime/test-runtime/src/lib.rs index e80412232d0..18bcb16834e 100644 --- a/polkadot/runtime/test-runtime/src/lib.rs +++ b/polkadot/runtime/test-runtime/src/lib.rs @@ -478,7 +478,9 @@ impl parachains_configuration::Config for Runtime { type WeightInfo = parachains_configuration::TestWeightInfo; } -impl parachains_shared::Config for Runtime {} +impl parachains_shared::Config for Runtime { + type DisabledValidators = Session; +} impl parachains_inclusion::Config for Runtime { type RuntimeEvent = RuntimeEvent; diff --git a/polkadot/runtime/westend/src/lib.rs b/polkadot/runtime/westend/src/lib.rs index 28b82956a47..941193ba941 100644 --- a/polkadot/runtime/westend/src/lib.rs +++ b/polkadot/runtime/westend/src/lib.rs @@ -1117,7 +1117,9 @@ impl parachains_configuration::Config for Runtime { type WeightInfo = weights::runtime_parachains_configuration::WeightInfo; } -impl parachains_shared::Config for Runtime {} +impl parachains_shared::Config for Runtime { + type DisabledValidators = Session; +} impl parachains_session_info::Config for Runtime { type ValidatorSet = Historical; diff --git a/polkadot/xcm/xcm-builder/tests/mock/mod.rs b/polkadot/xcm/xcm-builder/tests/mock/mod.rs index e08099280ba..2e89313a68e 100644 --- a/polkadot/xcm/xcm-builder/tests/mock/mod.rs +++ b/polkadot/xcm/xcm-builder/tests/mock/mod.rs @@ -128,7 +128,9 @@ impl pallet_balances::Config for Runtime { type MaxFreezes = ConstU32<0>; } -impl shared::Config for Runtime {} +impl shared::Config for Runtime { + type DisabledValidators = (); +} impl configuration::Config for Runtime { type WeightInfo = configuration::TestWeightInfo; diff --git a/polkadot/xcm/xcm-simulator/example/src/relay_chain.rs b/polkadot/xcm/xcm-simulator/example/src/relay_chain.rs index 1bcbe6da2cd..946b932b05e 100644 --- a/polkadot/xcm/xcm-simulator/example/src/relay_chain.rs +++ b/polkadot/xcm/xcm-simulator/example/src/relay_chain.rs @@ -120,7 +120,9 @@ impl pallet_uniques::Config for Runtime { type Helper = (); } -impl shared::Config for Runtime {} +impl shared::Config for Runtime { + type DisabledValidators = (); +} impl configuration::Config for Runtime { type WeightInfo = configuration::TestWeightInfo; diff --git a/polkadot/xcm/xcm-simulator/fuzzer/src/relay_chain.rs b/polkadot/xcm/xcm-simulator/fuzzer/src/relay_chain.rs index c066cc5e813..d3f91b01317 100644 --- a/polkadot/xcm/xcm-simulator/fuzzer/src/relay_chain.rs +++ b/polkadot/xcm/xcm-simulator/fuzzer/src/relay_chain.rs @@ -100,7 +100,9 @@ impl pallet_balances::Config for Runtime { type MaxFreezes = ConstU32<0>; } -impl shared::Config for Runtime {} +impl shared::Config for Runtime { + type DisabledValidators = (); +} impl configuration::Config for Runtime { type WeightInfo = configuration::TestWeightInfo; diff --git a/prdoc/pr_2889.prdoc b/prdoc/pr_2889.prdoc new file mode 100644 index 00000000000..cbb8aafa997 --- /dev/null +++ b/prdoc/pr_2889.prdoc @@ -0,0 +1,10 @@ +title: Filter backing votes from disabled validators in paras_inherent + +doc: + - audience: Runtime User + description: | + paras_inherent drops any backing votes from disabled validators on block import and asserts + that no votes from disabled validators are included in a block during execution + +crates: + - name: polkadot-runtime-parachains diff --git a/substrate/frame/aura/src/mock.rs b/substrate/frame/aura/src/mock.rs index 14b87089ce3..d38a8583819 100644 --- a/substrate/frame/aura/src/mock.rs +++ b/substrate/frame/aura/src/mock.rs @@ -96,6 +96,10 @@ impl DisabledValidators for MockDisabledValidators { fn is_disabled(index: AuthorityIndex) -> bool { DisabledValidatorTestValue::get().binary_search(&index).is_ok() } + + fn disabled_validators() -> Vec { + DisabledValidatorTestValue::get() + } } impl pallet_aura::Config for Test { diff --git a/substrate/frame/contracts/mock-network/src/relay_chain.rs b/substrate/frame/contracts/mock-network/src/relay_chain.rs index 4e5523f7442..abe907839d9 100644 --- a/substrate/frame/contracts/mock-network/src/relay_chain.rs +++ b/substrate/frame/contracts/mock-network/src/relay_chain.rs @@ -99,7 +99,9 @@ impl pallet_balances::Config for Runtime { type RuntimeFreezeReason = RuntimeFreezeReason; } -impl shared::Config for Runtime {} +impl shared::Config for Runtime { + type DisabledValidators = (); +} impl configuration::Config for Runtime { type WeightInfo = configuration::TestWeightInfo; diff --git a/substrate/frame/session/src/lib.rs b/substrate/frame/session/src/lib.rs index bf4671a247f..178d43f596b 100644 --- a/substrate/frame/session/src/lib.rs +++ b/substrate/frame/session/src/lib.rs @@ -918,6 +918,10 @@ impl frame_support::traits::DisabledValidators for Pallet { fn is_disabled(index: u32) -> bool { >::disabled_validators().binary_search(&index).is_ok() } + + fn disabled_validators() -> Vec { + >::disabled_validators() + } } /// Wraps the author-scraping logic for consensus engines that can recover diff --git a/substrate/frame/support/src/traits/validation.rs b/substrate/frame/support/src/traits/validation.rs index 617cdb2d3f4..4b099b2c766 100644 --- a/substrate/frame/support/src/traits/validation.rs +++ b/substrate/frame/support/src/traits/validation.rs @@ -251,10 +251,17 @@ pub trait ValidatorRegistration { pub trait DisabledValidators { /// Returns true if the given validator is disabled. fn is_disabled(index: u32) -> bool; + + /// Returns all disabled validators + fn disabled_validators() -> Vec; } impl DisabledValidators for () { fn is_disabled(_index: u32) -> bool { false } + + fn disabled_validators() -> Vec { + vec![] + } } -- GitLab From d6c0f1531de5be0bcfabf8531490ff6e4804a37f Mon Sep 17 00:00:00 2001 From: Samuel Moelius <35515885+smoelius@users.noreply.github.com> Date: Thu, 18 Jan 2024 04:15:00 -0500 Subject: [PATCH 186/191] Fix typo in traits.rs (#2971) Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com> --- substrate/primitives/runtime/src/traits.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/substrate/primitives/runtime/src/traits.rs b/substrate/primitives/runtime/src/traits.rs index ad82419cb8b..4213117334e 100644 --- a/substrate/primitives/runtime/src/traits.rs +++ b/substrate/primitives/runtime/src/traits.rs @@ -1790,7 +1790,7 @@ pub trait ValidateUnsigned { /// this code before the unsigned extrinsic enters the transaction pool and also periodically /// afterwards to ensure the validity. To prevent dos-ing a network with unsigned /// extrinsics, these validity checks should include some checks around uniqueness, for example, - /// like checking that the unsigned extrinsic was send by an authority in the active set. + /// checking that the unsigned extrinsic was sent by an authority in the active set. /// /// Changes made to storage should be discarded by caller. fn validate_unsigned(source: TransactionSource, call: &Self::Call) -> TransactionValidity; -- GitLab From 38205bf13990e3f10916ea9a973dffcf55fef4a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Thu, 18 Jan 2024 11:49:13 +0100 Subject: [PATCH 187/191] Downgrade logging to `debug` (#2980) There is no need to spawn operators with this debug log. Closes: https://github.com/paritytech/polkadot-sdk/issues/2974 --- polkadot/node/core/approval-voting/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/polkadot/node/core/approval-voting/src/lib.rs b/polkadot/node/core/approval-voting/src/lib.rs index af76b576d7c..9116725c291 100644 --- a/polkadot/node/core/approval-voting/src/lib.rs +++ b/polkadot/node/core/approval-voting/src/lib.rs @@ -3343,7 +3343,7 @@ async fn issue_approval( ); } - gum::info!( + gum::debug!( target: LOG_TARGET, ?candidate_hash, ?block_hash, -- GitLab From 1113fce5fb7be393f688e8d89ca23a0ee1e4bda5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 Jan 2024 13:25:24 +0100 Subject: [PATCH 188/191] Bump the known_good_semver group with 1 update (#2953) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the known_good_semver group with 1 update: [clap](https://github.com/clap-rs/clap). Updates `clap` from 4.4.16 to 4.4.18
Release notes

Sourced from clap's releases.

v4.4.18

[4.4.18] - 2024-01-16

Fixes

  • (error) When lacking usage feature, ensure the list of required arguments is unique

v4.4.17

[4.4.17] - 2024-01-15

Fixes

  • Fix panic! when mixing args_conflicts_with_subcommands with ArgGroup (which is implicit with derive) introduced in 4.4.15
Changelog

Sourced from clap's changelog.

[4.4.18] - 2024-01-16

Fixes

  • (error) When lacking usage feature, ensure the list of required arguments is unique

[4.4.17] - 2024-01-15

Fixes

  • Fix panic! when mixing args_conflicts_with_subcommands with ArgGroup (which is implicit with derive) introduced in 4.4.15
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=clap&package-manager=cargo&previous-version=4.4.16&new-version=4.4.18)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Bastian Köcher Co-authored-by: Dónal Murray --- Cargo.lock | 66 +++++++++---------- cumulus/client/cli/Cargo.toml | 2 +- cumulus/parachain-template/node/Cargo.toml | 2 +- cumulus/polkadot-parachain/Cargo.toml | 2 +- cumulus/test/service/Cargo.toml | 2 +- polkadot/cli/Cargo.toml | 2 +- polkadot/node/malus/Cargo.toml | 2 +- polkadot/node/subsystem-bench/Cargo.toml | 2 +- .../test-parachains/adder/collator/Cargo.toml | 2 +- .../undying/collator/Cargo.toml | 2 +- polkadot/utils/generate-bags/Cargo.toml | 2 +- .../remote-ext-tests/bags-list/Cargo.toml | 2 +- substrate/bin/minimal/node/Cargo.toml | 2 +- substrate/bin/node-template/node/Cargo.toml | 2 +- substrate/bin/node/bench/Cargo.toml | 2 +- substrate/bin/node/cli/Cargo.toml | 4 +- substrate/bin/node/inspect/Cargo.toml | 2 +- .../bin/utils/chain-spec-builder/Cargo.toml | 2 +- substrate/bin/utils/subkey/Cargo.toml | 2 +- substrate/client/cli/Cargo.toml | 2 +- substrate/client/storage-monitor/Cargo.toml | 2 +- .../solution-type/fuzzer/Cargo.toml | 2 +- .../npos-elections/fuzzer/Cargo.toml | 2 +- .../ci/node-template-release/Cargo.toml | 2 +- .../utils/frame/benchmarking-cli/Cargo.toml | 2 +- .../frame/frame-utilities-cli/Cargo.toml | 2 +- .../generate-bags/node-runtime/Cargo.toml | 2 +- .../utils/frame/try-runtime/cli/Cargo.toml | 2 +- 28 files changed, 61 insertions(+), 61 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 849bc069d20..b6f69c2daa1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2640,9 +2640,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.16" +version = "4.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58e54881c004cec7895b0068a0a954cd5d62da01aef83fa35b1e594497bf5445" +checksum = "1e578d6ec4194633722ccf9544794b71b1385c3c027efe0c55db226fc880865c" dependencies = [ "clap_builder", "clap_derive 4.4.7", @@ -2659,9 +2659,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.16" +version = "4.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59cb82d7f531603d2fd1f507441cdd35184fa81beff7bd489570de7f773460bb" +checksum = "4df4df40ec50c46000231c914968278b1eb05098cf8f1b3a518a95030e71d1c7" dependencies = [ "anstream", "anstyle", @@ -2676,7 +2676,7 @@ version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "586a385f7ef2f8b4d86bddaa0c094794e7ccbfe5ffef1f434fe928143fc783a5" dependencies = [ - "clap 4.4.16", + "clap 4.4.18", ] [[package]] @@ -3414,7 +3414,7 @@ dependencies = [ "anes", "cast", "ciborium", - "clap 4.4.16", + "clap 4.4.18", "criterion-plot", "futures", "is-terminal", @@ -3577,7 +3577,7 @@ dependencies = [ name = "cumulus-client-cli" version = "0.1.0" dependencies = [ - "clap 4.4.16", + "clap 4.4.18", "parity-scale-codec", "sc-chain-spec", "sc-cli", @@ -4317,7 +4317,7 @@ name = "cumulus-test-service" version = "0.1.0" dependencies = [ "async-trait", - "clap 4.4.16", + "clap 4.4.18", "criterion 0.5.1", "cumulus-client-cli", "cumulus-client-consensus-common", @@ -5501,7 +5501,7 @@ dependencies = [ "Inflector", "array-bytes 6.1.0", "chrono", - "clap 4.4.16", + "clap 4.4.18", "comfy-table", "frame-benchmarking", "frame-support", @@ -5593,7 +5593,7 @@ dependencies = [ name = "frame-election-solution-type-fuzzer" version = "2.0.0-alpha.5" dependencies = [ - "clap 4.4.16", + "clap 4.4.18", "frame-election-provider-solution-type", "frame-election-provider-support", "frame-support", @@ -8109,7 +8109,7 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" name = "minimal-node" version = "4.0.0-dev" dependencies = [ - "clap 4.4.16", + "clap 4.4.18", "frame", "futures", "futures-timer", @@ -8573,7 +8573,7 @@ name = "node-bench" version = "0.9.0-dev" dependencies = [ "array-bytes 6.1.0", - "clap 4.4.16", + "clap 4.4.18", "derive_more", "fs_extra", "futures", @@ -8650,7 +8650,7 @@ dependencies = [ name = "node-runtime-generate-bags" version = "3.0.0" dependencies = [ - "clap 4.4.16", + "clap 4.4.18", "generate-bags", "kitchensink-runtime", ] @@ -8659,7 +8659,7 @@ dependencies = [ name = "node-template" version = "4.0.0-dev" dependencies = [ - "clap 4.4.16", + "clap 4.4.18", "frame-benchmarking", "frame-benchmarking-cli", "frame-system", @@ -8703,7 +8703,7 @@ dependencies = [ name = "node-template-release" version = "3.0.0" dependencies = [ - "clap 4.4.16", + "clap 4.4.18", "flate2", "fs_extra", "glob", @@ -11247,7 +11247,7 @@ dependencies = [ name = "parachain-template-node" version = "0.1.0" dependencies = [ - "clap 4.4.16", + "clap 4.4.18", "color-print", "cumulus-client-cli", "cumulus-client-collator", @@ -12205,7 +12205,7 @@ name = "polkadot-cli" version = "1.1.0" dependencies = [ "cfg-if", - "clap 4.4.16", + "clap 4.4.18", "frame-benchmarking-cli", "futures", "log", @@ -13046,7 +13046,7 @@ dependencies = [ "async-trait", "bridge-hub-rococo-runtime", "bridge-hub-westend-runtime", - "clap 4.4.16", + "clap 4.4.18", "collectives-westend-runtime", "color-print", "contracts-rococo-runtime", @@ -13557,7 +13557,7 @@ version = "1.0.0" dependencies = [ "assert_matches", "async-trait", - "clap 4.4.16", + "clap 4.4.18", "clap-num", "color-eyre", "colored", @@ -13634,7 +13634,7 @@ version = "1.0.0" dependencies = [ "assert_matches", "async-trait", - "clap 4.4.16", + "clap 4.4.18", "color-eyre", "futures", "futures-timer", @@ -13781,7 +13781,7 @@ dependencies = [ name = "polkadot-voter-bags" version = "1.0.0" dependencies = [ - "clap 4.4.16", + "clap 4.4.18", "generate-bags", "sp-io", "westend-runtime", @@ -14671,7 +14671,7 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" name = "remote-ext-tests-bags-list" version = "1.0.0" dependencies = [ - "clap 4.4.16", + "clap 4.4.18", "frame-system", "log", "pallet-bags-list-remote-tests", @@ -15461,7 +15461,7 @@ dependencies = [ "array-bytes 6.1.0", "bip39", "chrono", - "clap 4.4.16", + "clap 4.4.18", "fdlimit", "futures", "futures-timer", @@ -16605,7 +16605,7 @@ dependencies = [ name = "sc-storage-monitor" version = "0.1.0" dependencies = [ - "clap 4.4.16", + "clap 4.4.18", "fs4", "log", "sp-core", @@ -18555,7 +18555,7 @@ dependencies = [ name = "sp-npos-elections-fuzzer" version = "2.0.0-alpha.5" dependencies = [ - "clap 4.4.16", + "clap 4.4.18", "honggfuzz", "rand 0.8.5", "sp-npos-elections", @@ -19076,7 +19076,7 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" name = "staging-chain-spec-builder" version = "2.0.0" dependencies = [ - "clap 4.4.16", + "clap 4.4.18", "log", "sc-chain-spec", "serde_json", @@ -19089,7 +19089,7 @@ version = "3.0.0-dev" dependencies = [ "array-bytes 6.1.0", "assert_cmd", - "clap 4.4.16", + "clap 4.4.18", "clap_complete", "criterion 0.4.0", "frame-benchmarking", @@ -19198,7 +19198,7 @@ dependencies = [ name = "staging-node-inspect" version = "0.9.0-dev" dependencies = [ - "clap 4.4.16", + "clap 4.4.18", "parity-scale-codec", "sc-cli", "sc-client-api", @@ -19403,7 +19403,7 @@ dependencies = [ name = "subkey" version = "3.0.0" dependencies = [ - "clap 4.4.16", + "clap 4.4.18", "sc-cli", ] @@ -19445,7 +19445,7 @@ dependencies = [ name = "substrate-frame-cli" version = "4.0.0-dev" dependencies = [ - "clap 4.4.16", + "clap 4.4.18", "frame-support", "frame-system", "sc-cli", @@ -19923,7 +19923,7 @@ dependencies = [ name = "test-parachain-adder-collator" version = "1.0.0" dependencies = [ - "clap 4.4.16", + "clap 4.4.18", "futures", "futures-timer", "log", @@ -19971,7 +19971,7 @@ dependencies = [ name = "test-parachain-undying-collator" version = "1.0.0" dependencies = [ - "clap 4.4.16", + "clap 4.4.18", "futures", "futures-timer", "log", @@ -20622,7 +20622,7 @@ version = "0.10.0-dev" dependencies = [ "assert_cmd", "async-trait", - "clap 4.4.16", + "clap 4.4.18", "frame-remote-externalities", "frame-try-runtime", "hex", diff --git a/cumulus/client/cli/Cargo.toml b/cumulus/client/cli/Cargo.toml index 4048c3eaecb..96016da5c9a 100644 --- a/cumulus/client/cli/Cargo.toml +++ b/cumulus/client/cli/Cargo.toml @@ -10,7 +10,7 @@ license = "GPL-3.0-or-later WITH Classpath-exception-2.0" workspace = true [dependencies] -clap = { version = "4.4.16", features = ["derive"] } +clap = { version = "4.4.18", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } url = "2.4.0" diff --git a/cumulus/parachain-template/node/Cargo.toml b/cumulus/parachain-template/node/Cargo.toml index b34478ab3dd..c12ee72f5cb 100644 --- a/cumulus/parachain-template/node/Cargo.toml +++ b/cumulus/parachain-template/node/Cargo.toml @@ -14,7 +14,7 @@ publish = false workspace = true [dependencies] -clap = { version = "4.4.16", features = ["derive"] } +clap = { version = "4.4.18", features = ["derive"] } log = "0.4.20" codec = { package = "parity-scale-codec", version = "3.0.0" } serde = { version = "1.0.195", features = ["derive"] } diff --git a/cumulus/polkadot-parachain/Cargo.toml b/cumulus/polkadot-parachain/Cargo.toml index 84ba8a36d51..0a40816fc0b 100644 --- a/cumulus/polkadot-parachain/Cargo.toml +++ b/cumulus/polkadot-parachain/Cargo.toml @@ -16,7 +16,7 @@ path = "src/main.rs" [dependencies] async-trait = "0.1.74" -clap = { version = "4.4.16", features = ["derive"] } +clap = { version = "4.4.18", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } futures = "0.3.28" hex-literal = "0.4.1" diff --git a/cumulus/test/service/Cargo.toml b/cumulus/test/service/Cargo.toml index 387d65c4931..dcd70ca97e8 100644 --- a/cumulus/test/service/Cargo.toml +++ b/cumulus/test/service/Cargo.toml @@ -14,7 +14,7 @@ path = "src/main.rs" [dependencies] async-trait = "0.1.74" -clap = { version = "4.4.16", features = ["derive"] } +clap = { version = "4.4.18", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.0.0" } criterion = { version = "0.5.1", features = ["async_tokio"] } jsonrpsee = { version = "0.16.2", features = ["server"] } diff --git a/polkadot/cli/Cargo.toml b/polkadot/cli/Cargo.toml index cc96422abbc..2efb057ca28 100644 --- a/polkadot/cli/Cargo.toml +++ b/polkadot/cli/Cargo.toml @@ -19,7 +19,7 @@ crate-type = ["cdylib", "rlib"] [dependencies] cfg-if = "1.0" -clap = { version = "4.4.16", features = ["derive"], optional = true } +clap = { version = "4.4.18", features = ["derive"], optional = true } log = "0.4.17" thiserror = "1.0.48" futures = "0.3.21" diff --git a/polkadot/node/malus/Cargo.toml b/polkadot/node/malus/Cargo.toml index 7793abfd69b..6a3dff726ed 100644 --- a/polkadot/node/malus/Cargo.toml +++ b/polkadot/node/malus/Cargo.toml @@ -43,7 +43,7 @@ assert_matches = "1.5" async-trait = "0.1.74" sp-keystore = { path = "../../../substrate/primitives/keystore" } sp-core = { path = "../../../substrate/primitives/core" } -clap = { version = "4.4.16", features = ["derive"] } +clap = { version = "4.4.18", features = ["derive"] } futures = "0.3.21" futures-timer = "3.0.2" gum = { package = "tracing-gum", path = "../gum" } diff --git a/polkadot/node/subsystem-bench/Cargo.toml b/polkadot/node/subsystem-bench/Cargo.toml index ab3de33fe2c..f09f7fc4897 100644 --- a/polkadot/node/subsystem-bench/Cargo.toml +++ b/polkadot/node/subsystem-bench/Cargo.toml @@ -31,7 +31,7 @@ async-trait = "0.1.74" sp-keystore = { path = "../../../substrate/primitives/keystore" } sc-keystore = { path = "../../../substrate/client/keystore" } sp-core = { path = "../../../substrate/primitives/core" } -clap = { version = "4.4.16", features = ["derive"] } +clap = { version = "4.4.18", features = ["derive"] } futures = "0.3.21" futures-timer = "3.0.2" gum = { package = "tracing-gum", path = "../gum" } diff --git a/polkadot/parachain/test-parachains/adder/collator/Cargo.toml b/polkadot/parachain/test-parachains/adder/collator/Cargo.toml index 4ebeb767905..7dd0d9a563c 100644 --- a/polkadot/parachain/test-parachains/adder/collator/Cargo.toml +++ b/polkadot/parachain/test-parachains/adder/collator/Cargo.toml @@ -16,7 +16,7 @@ path = "src/main.rs" [dependencies] parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive"] } -clap = { version = "4.4.16", features = ["derive"] } +clap = { version = "4.4.18", features = ["derive"] } futures = "0.3.21" futures-timer = "3.0.2" log = "0.4.17" diff --git a/polkadot/parachain/test-parachains/undying/collator/Cargo.toml b/polkadot/parachain/test-parachains/undying/collator/Cargo.toml index 1d851218bed..001c48476b5 100644 --- a/polkadot/parachain/test-parachains/undying/collator/Cargo.toml +++ b/polkadot/parachain/test-parachains/undying/collator/Cargo.toml @@ -16,7 +16,7 @@ path = "src/main.rs" [dependencies] parity-scale-codec = { version = "3.6.1", default-features = false, features = ["derive"] } -clap = { version = "4.4.16", features = ["derive"] } +clap = { version = "4.4.18", features = ["derive"] } futures = "0.3.21" futures-timer = "3.0.2" log = "0.4.17" diff --git a/polkadot/utils/generate-bags/Cargo.toml b/polkadot/utils/generate-bags/Cargo.toml index a16ee8de496..0f5ee43d86d 100644 --- a/polkadot/utils/generate-bags/Cargo.toml +++ b/polkadot/utils/generate-bags/Cargo.toml @@ -10,7 +10,7 @@ description = "CLI to generate voter bags for Polkadot runtimes" workspace = true [dependencies] -clap = { version = "4.4.16", features = ["derive"] } +clap = { version = "4.4.18", features = ["derive"] } generate-bags = { path = "../../../substrate/utils/frame/generate-bags" } sp-io = { path = "../../../substrate/primitives/io" } diff --git a/polkadot/utils/remote-ext-tests/bags-list/Cargo.toml b/polkadot/utils/remote-ext-tests/bags-list/Cargo.toml index 75bfdd9d1a0..f8190e6aefa 100644 --- a/polkadot/utils/remote-ext-tests/bags-list/Cargo.toml +++ b/polkadot/utils/remote-ext-tests/bags-list/Cargo.toml @@ -18,6 +18,6 @@ sp-tracing = { path = "../../../../substrate/primitives/tracing" } frame-system = { path = "../../../../substrate/frame/system" } sp-core = { path = "../../../../substrate/primitives/core" } -clap = { version = "4.4.16", features = ["derive"] } +clap = { version = "4.4.18", features = ["derive"] } log = "0.4.17" tokio = { version = "1.24.2", features = ["macros"] } diff --git a/substrate/bin/minimal/node/Cargo.toml b/substrate/bin/minimal/node/Cargo.toml index 5a2427fd4d8..cc00988dcfe 100644 --- a/substrate/bin/minimal/node/Cargo.toml +++ b/substrate/bin/minimal/node/Cargo.toml @@ -20,7 +20,7 @@ targets = ["x86_64-unknown-linux-gnu"] name = "minimal-node" [dependencies] -clap = { version = "4.4.16", features = ["derive"] } +clap = { version = "4.4.18", features = ["derive"] } futures = { version = "0.3.21", features = ["thread-pool"] } futures-timer = "3.0.1" jsonrpsee = { version = "0.16.2", features = ["server"] } diff --git a/substrate/bin/node-template/node/Cargo.toml b/substrate/bin/node-template/node/Cargo.toml index f91db97985b..36c2f9f8b70 100644 --- a/substrate/bin/node-template/node/Cargo.toml +++ b/substrate/bin/node-template/node/Cargo.toml @@ -20,7 +20,7 @@ targets = ["x86_64-unknown-linux-gnu"] name = "node-template" [dependencies] -clap = { version = "4.4.16", features = ["derive"] } +clap = { version = "4.4.18", features = ["derive"] } futures = { version = "0.3.21", features = ["thread-pool"] } serde_json = "1.0.111" diff --git a/substrate/bin/node/bench/Cargo.toml b/substrate/bin/node/bench/Cargo.toml index 926cdc3bfb0..42af802d716 100644 --- a/substrate/bin/node/bench/Cargo.toml +++ b/substrate/bin/node/bench/Cargo.toml @@ -16,7 +16,7 @@ workspace = true [dependencies] array-bytes = "6.1" -clap = { version = "4.4.16", features = ["derive"] } +clap = { version = "4.4.18", features = ["derive"] } log = "0.4.17" node-primitives = { path = "../primitives" } node-testing = { path = "../testing" } diff --git a/substrate/bin/node/cli/Cargo.toml b/substrate/bin/node/cli/Cargo.toml index 64b61288391..061c9684c22 100644 --- a/substrate/bin/node/cli/Cargo.toml +++ b/substrate/bin/node/cli/Cargo.toml @@ -41,7 +41,7 @@ crate-type = ["cdylib", "rlib"] [dependencies] # third-party dependencies array-bytes = "6.1" -clap = { version = "4.4.16", features = ["derive"], optional = true } +clap = { version = "4.4.18", features = ["derive"], optional = true } codec = { package = "parity-scale-codec", version = "3.6.1" } serde = { version = "1.0.195", features = ["derive"] } jsonrpsee = { version = "0.16.2", features = ["server"] } @@ -164,7 +164,7 @@ sp-trie = { path = "../../../primitives/trie" } sp-state-machine = { path = "../../../primitives/state-machine" } [build-dependencies] -clap = { version = "4.4.16", optional = true } +clap = { version = "4.4.18", optional = true } clap_complete = { version = "4.0.2", optional = true } node-inspect = { package = "staging-node-inspect", path = "../inspect", optional = true } frame-benchmarking-cli = { path = "../../../utils/frame/benchmarking-cli", optional = true } diff --git a/substrate/bin/node/inspect/Cargo.toml b/substrate/bin/node/inspect/Cargo.toml index ef82f16be2a..860295b0553 100644 --- a/substrate/bin/node/inspect/Cargo.toml +++ b/substrate/bin/node/inspect/Cargo.toml @@ -15,7 +15,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -clap = { version = "4.4.16", features = ["derive"] } +clap = { version = "4.4.18", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.6.1" } thiserror = "1.0" sc-cli = { path = "../../../client/cli" } diff --git a/substrate/bin/utils/chain-spec-builder/Cargo.toml b/substrate/bin/utils/chain-spec-builder/Cargo.toml index a9ea0ad40b3..06a0a3a1a4a 100644 --- a/substrate/bin/utils/chain-spec-builder/Cargo.toml +++ b/substrate/bin/utils/chain-spec-builder/Cargo.toml @@ -23,7 +23,7 @@ name = "chain-spec-builder" crate-type = ["rlib"] [dependencies] -clap = { version = "4.4.16", features = ["derive"] } +clap = { version = "4.4.18", features = ["derive"] } log = "0.4.17" sc-chain-spec = { path = "../../../client/chain-spec" } serde_json = "1.0.111" diff --git a/substrate/bin/utils/subkey/Cargo.toml b/substrate/bin/utils/subkey/Cargo.toml index 19eba2f1969..b53bae0b6a1 100644 --- a/substrate/bin/utils/subkey/Cargo.toml +++ b/substrate/bin/utils/subkey/Cargo.toml @@ -20,5 +20,5 @@ path = "src/main.rs" name = "subkey" [dependencies] -clap = { version = "4.4.16", features = ["derive"] } +clap = { version = "4.4.18", features = ["derive"] } sc-cli = { path = "../../../client/cli" } diff --git a/substrate/client/cli/Cargo.toml b/substrate/client/cli/Cargo.toml index ce9b1781686..d64973baf83 100644 --- a/substrate/client/cli/Cargo.toml +++ b/substrate/client/cli/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] array-bytes = "6.1" chrono = "0.4.31" -clap = { version = "4.4.16", features = ["derive", "string", "wrap_help"] } +clap = { version = "4.4.18", features = ["derive", "string", "wrap_help"] } fdlimit = "0.3.0" futures = "0.3.21" itertools = "0.10.3" diff --git a/substrate/client/storage-monitor/Cargo.toml b/substrate/client/storage-monitor/Cargo.toml index 17f1c42bccb..6a01ef0fe2b 100644 --- a/substrate/client/storage-monitor/Cargo.toml +++ b/substrate/client/storage-monitor/Cargo.toml @@ -12,7 +12,7 @@ homepage = "https://substrate.io" workspace = true [dependencies] -clap = { version = "4.4.16", features = ["derive", "string"] } +clap = { version = "4.4.18", features = ["derive", "string"] } log = "0.4.17" fs4 = "0.7.0" sp-core = { path = "../../primitives/core" } diff --git a/substrate/frame/election-provider-support/solution-type/fuzzer/Cargo.toml b/substrate/frame/election-provider-support/solution-type/fuzzer/Cargo.toml index 62316b27290..7200d207aec 100644 --- a/substrate/frame/election-provider-support/solution-type/fuzzer/Cargo.toml +++ b/substrate/frame/election-provider-support/solution-type/fuzzer/Cargo.toml @@ -16,7 +16,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -clap = { version = "4.4.16", features = ["derive"] } +clap = { version = "4.4.18", features = ["derive"] } honggfuzz = "0.5" rand = { version = "0.8", features = ["small_rng", "std"] } diff --git a/substrate/primitives/npos-elections/fuzzer/Cargo.toml b/substrate/primitives/npos-elections/fuzzer/Cargo.toml index f98e41ae77a..93177325436 100644 --- a/substrate/primitives/npos-elections/fuzzer/Cargo.toml +++ b/substrate/primitives/npos-elections/fuzzer/Cargo.toml @@ -17,7 +17,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -clap = { version = "4.4.16", features = ["derive"] } +clap = { version = "4.4.18", features = ["derive"] } honggfuzz = "0.5" rand = { version = "0.8", features = ["small_rng", "std"] } sp-npos-elections = { path = ".." } diff --git a/substrate/scripts/ci/node-template-release/Cargo.toml b/substrate/scripts/ci/node-template-release/Cargo.toml index 40ba629fb05..a0b93184546 100644 --- a/substrate/scripts/ci/node-template-release/Cargo.toml +++ b/substrate/scripts/ci/node-template-release/Cargo.toml @@ -14,7 +14,7 @@ workspace = true targets = ["x86_64-unknown-linux-gnu"] [dependencies] -clap = { version = "4.4.16", features = ["derive"] } +clap = { version = "4.4.18", features = ["derive"] } flate2 = "1.0" fs_extra = "1.3" glob = "0.3" diff --git a/substrate/utils/frame/benchmarking-cli/Cargo.toml b/substrate/utils/frame/benchmarking-cli/Cargo.toml index f7210cf768f..ba95afeeee9 100644 --- a/substrate/utils/frame/benchmarking-cli/Cargo.toml +++ b/substrate/utils/frame/benchmarking-cli/Cargo.toml @@ -18,7 +18,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] array-bytes = "6.1" chrono = "0.4" -clap = { version = "4.4.16", features = ["derive"] } +clap = { version = "4.4.18", features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.6.1" } comfy-table = { version = "7.0.1", default-features = false } handlebars = "4.2.2" diff --git a/substrate/utils/frame/frame-utilities-cli/Cargo.toml b/substrate/utils/frame/frame-utilities-cli/Cargo.toml index 899f86f3cb4..3cfb81e8c10 100644 --- a/substrate/utils/frame/frame-utilities-cli/Cargo.toml +++ b/substrate/utils/frame/frame-utilities-cli/Cargo.toml @@ -14,7 +14,7 @@ readme = "README.md" workspace = true [dependencies] -clap = { version = "4.4.16", features = ["derive"] } +clap = { version = "4.4.18", features = ["derive"] } frame-support = { path = "../../../frame/support" } frame-system = { path = "../../../frame/system" } sc-cli = { path = "../../../client/cli" } diff --git a/substrate/utils/frame/generate-bags/node-runtime/Cargo.toml b/substrate/utils/frame/generate-bags/node-runtime/Cargo.toml index ba11fce18f8..b35e06879df 100644 --- a/substrate/utils/frame/generate-bags/node-runtime/Cargo.toml +++ b/substrate/utils/frame/generate-bags/node-runtime/Cargo.toml @@ -17,4 +17,4 @@ kitchensink-runtime = { path = "../../../../bin/node/runtime" } generate-bags = { path = ".." } # third-party -clap = { version = "4.4.16", features = ["derive"] } +clap = { version = "4.4.18", features = ["derive"] } diff --git a/substrate/utils/frame/try-runtime/cli/Cargo.toml b/substrate/utils/frame/try-runtime/cli/Cargo.toml index ac515315bbe..20da5c1675e 100644 --- a/substrate/utils/frame/try-runtime/cli/Cargo.toml +++ b/substrate/utils/frame/try-runtime/cli/Cargo.toml @@ -38,7 +38,7 @@ frame-try-runtime = { path = "../../../../frame/try-runtime", optional = true } substrate-rpc-client = { path = "../../rpc/client" } async-trait = "0.1.74" -clap = { version = "4.4.16", features = ["derive"] } +clap = { version = "4.4.18", features = ["derive"] } hex = { version = "0.4.3", default-features = false } log = "0.4.17" parity-scale-codec = "3.6.1" -- GitLab From 9a8ef495bef273d23df6ca6c825e8ef145c1489f Mon Sep 17 00:00:00 2001 From: cristiantroy <154241727+cristiantroy@users.noreply.github.com> Date: Thu, 18 Jan 2024 20:30:29 +0800 Subject: [PATCH 189/191] Fix typos (#2983) --- bridges/modules/parachains/src/lib.rs | 2 +- docs/contributor/STYLE_GUIDE.md | 2 +- docs/sdk/src/meta_contributing.rs | 2 +- docs/sdk/src/reference_docs/extrinsic_encoding.rs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bridges/modules/parachains/src/lib.rs b/bridges/modules/parachains/src/lib.rs index b2ef0bf52bd..cf76e64ff9c 100644 --- a/bridges/modules/parachains/src/lib.rs +++ b/bridges/modules/parachains/src/lib.rs @@ -1470,7 +1470,7 @@ pub(crate) mod tests { ); // then if someone is pretending to provide updated head#10 of parachain#1 at relay - // block#30, and actualy provides it + // block#30, and actually provides it // // => we'll update value proceed(30, state_root_10_at_30); diff --git a/docs/contributor/STYLE_GUIDE.md b/docs/contributor/STYLE_GUIDE.md index 3df65d9699a..400d9f477bc 100644 --- a/docs/contributor/STYLE_GUIDE.md +++ b/docs/contributor/STYLE_GUIDE.md @@ -161,4 +161,4 @@ See the config file for the exact rules. You may find useful - [Taplo VSCode extension](https://marketplace.visualstudio.com/items?itemName=tamasfe.even-better-toml) -- For NeoVim, [taplo is avaliable with Mason](https://github.com/williamboman/mason-lspconfig.nvim#available-lsp-servers) +- For NeoVim, [taplo is available with Mason](https://github.com/williamboman/mason-lspconfig.nvim#available-lsp-servers) diff --git a/docs/sdk/src/meta_contributing.rs b/docs/sdk/src/meta_contributing.rs index bff475f8e6b..7ecf8b0adfd 100644 --- a/docs/sdk/src/meta_contributing.rs +++ b/docs/sdk/src/meta_contributing.rs @@ -43,7 +43,7 @@ //! The following guidelines are meant to be the guiding torch of those who contribute to this //! crate. //! -//! 1. 🔺 Ground Up: Information should be layed out in the most ground-up fashion. The lowest level +//! 1. 🔺 Ground Up: Information should be laid out in the most ground-up fashion. The lowest level //! (i.e. "ground") is Rust-docs. The highest level (i.e. "up") is "outside of this crate". In //! between lies [`reference_docs`] and [`guides`], from low to high. The point of this principle //! is to document as much of the information as possible in the lower level media, as it is diff --git a/docs/sdk/src/reference_docs/extrinsic_encoding.rs b/docs/sdk/src/reference_docs/extrinsic_encoding.rs index 89c7cfe983c..9008f8f835f 100644 --- a/docs/sdk/src/reference_docs/extrinsic_encoding.rs +++ b/docs/sdk/src/reference_docs/extrinsic_encoding.rs @@ -172,7 +172,7 @@ //! } //! ``` //! -//! The bytes representing `call_data` and `signed_extensions_extra` can be obtained as descibed +//! The bytes representing `call_data` and `signed_extensions_extra` can be obtained as described //! above. `signed_extensions_additional` is constructed by SCALE encoding the //! ["additional signed" data][sp_runtime::traits::SignedExtension::AdditionalSigned] for each //! signed extension that the chain is using, in order. -- GitLab From 13f2342edd70d83377d620385610bc8dc859b64b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 Jan 2024 11:43:37 +0000 Subject: [PATCH 190/191] Bump prost from 0.11.9 to 0.12.3 (#2976) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [prost](https://github.com/tokio-rs/prost) from 0.11.9 to 0.12.3.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=prost&package-manager=cargo&previous-version=0.11.9&new-version=0.12.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
--------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Dónal Murray --- Cargo.lock | 39 +++++++++++++++---- .../client/authority-discovery/Cargo.toml | 2 +- substrate/client/network/bitswap/Cargo.toml | 2 +- substrate/client/network/light/Cargo.toml | 2 +- substrate/client/network/sync/Cargo.toml | 2 +- .../network/sync/src/block_request_handler.rs | 2 +- 6 files changed, 36 insertions(+), 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b6f69c2daa1..87a2dad7549 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14213,7 +14213,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" dependencies = [ "bytes", - "prost-derive", + "prost-derive 0.11.9", +] + +[[package]] +name = "prost" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146c289cda302b98a28d40c8b3b90498d6e526dd24ac2ecea73e4e491685b94a" +dependencies = [ + "bytes", + "prost-derive 0.12.3", ] [[package]] @@ -14230,7 +14240,7 @@ dependencies = [ "multimap", "petgraph", "prettyplease 0.1.25", - "prost", + "prost 0.11.9", "prost-types", "regex", "syn 1.0.109", @@ -14251,13 +14261,26 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "prost-derive" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" +dependencies = [ + "anyhow", + "itertools 0.11.0", + "proc-macro2", + "quote", + "syn 2.0.48", +] + [[package]] name = "prost-types" version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" dependencies = [ - "prost", + "prost 0.11.9", ] [[package]] @@ -14280,7 +14303,7 @@ dependencies = [ "libflate", "log", "names", - "prost", + "prost 0.11.9", "reqwest", "thiserror", "url", @@ -15357,7 +15380,7 @@ dependencies = [ "multihash 0.18.1", "multihash-codetable", "parity-scale-codec", - "prost", + "prost 0.12.3", "prost-build", "quickcheck", "rand 0.8.5", @@ -16116,7 +16139,7 @@ dependencies = [ "futures", "libp2p-identity", "log", - "prost", + "prost 0.12.3", "prost-build", "sc-block-builder", "sc-client-api", @@ -16183,7 +16206,7 @@ dependencies = [ "libp2p-identity", "log", "parity-scale-codec", - "prost", + "prost 0.12.3", "prost-build", "sc-client-api", "sc-network", @@ -16225,7 +16248,7 @@ dependencies = [ "log", "mockall", "parity-scale-codec", - "prost", + "prost 0.12.3", "prost-build", "quickcheck", "sc-block-builder", diff --git a/substrate/client/authority-discovery/Cargo.toml b/substrate/client/authority-discovery/Cargo.toml index a8a28a501ea..e7aead99c02 100644 --- a/substrate/client/authority-discovery/Cargo.toml +++ b/substrate/client/authority-discovery/Cargo.toml @@ -30,7 +30,7 @@ multihash = { version = "0.18.1", default-features = false, features = [ "std", ] } log = "0.4.17" -prost = "0.11" +prost = "0.12" rand = "0.8.5" thiserror = "1.0" prometheus-endpoint = { package = "substrate-prometheus-endpoint", path = "../../utils/prometheus" } diff --git a/substrate/client/network/bitswap/Cargo.toml b/substrate/client/network/bitswap/Cargo.toml index cc919d2977e..b004c03e025 100644 --- a/substrate/client/network/bitswap/Cargo.toml +++ b/substrate/client/network/bitswap/Cargo.toml @@ -24,7 +24,7 @@ cid = "0.9.0" futures = "0.3.21" libp2p-identity = { version = "0.1.3", features = ["peerid"] } log = "0.4.17" -prost = "0.11" +prost = "0.12" thiserror = "1.0" unsigned-varint = { version = "0.7.1", features = ["asynchronous_codec", "futures"] } sc-client-api = { path = "../../api" } diff --git a/substrate/client/network/light/Cargo.toml b/substrate/client/network/light/Cargo.toml index c75d14f0deb..d59fde56430 100644 --- a/substrate/client/network/light/Cargo.toml +++ b/substrate/client/network/light/Cargo.toml @@ -27,7 +27,7 @@ codec = { package = "parity-scale-codec", version = "3.6.1", features = [ futures = "0.3.21" libp2p-identity = { version = "0.1.3", features = ["peerid"] } log = "0.4.16" -prost = "0.11" +prost = "0.12" sp-blockchain = { path = "../../../primitives/blockchain" } sc-client-api = { path = "../../api" } sc-network = { path = ".." } diff --git a/substrate/client/network/sync/Cargo.toml b/substrate/client/network/sync/Cargo.toml index dd993e7a3df..abcb4cc8e42 100644 --- a/substrate/client/network/sync/Cargo.toml +++ b/substrate/client/network/sync/Cargo.toml @@ -28,7 +28,7 @@ futures-timer = "3.0.2" libp2p = "0.51.4" log = "0.4.17" mockall = "0.11.3" -prost = "0.11" +prost = "0.12" schnellru = "0.2.1" smallvec = "1.11.0" thiserror = "1.0" diff --git a/substrate/client/network/sync/src/block_request_handler.rs b/substrate/client/network/sync/src/block_request_handler.rs index f2af7d21786..7dfa76278b8 100644 --- a/substrate/client/network/sync/src/block_request_handler.rs +++ b/substrate/client/network/sync/src/block_request_handler.rs @@ -228,7 +228,7 @@ where }; let direction = - Direction::from_i32(request.direction).ok_or(HandleRequestError::ParseDirection)?; + i32::try_into(request.direction).map_err(|_| HandleRequestError::ParseDirection)?; let attributes = BlockAttributes::from_be_u32(request.fields)?; -- GitLab From dcc76525d98a097be152293eee3389f6af5c4404 Mon Sep 17 00:00:00 2001 From: Muharem Date: Thu, 18 Jan 2024 22:04:13 +0800 Subject: [PATCH 191/191] Westend/Rococo Asset Hub: pay xcm fees with sufficient assets (#2978) Set up the `TakeFirstAssetTrader` trader for Westend and Rococo Asset Hubs to cover XCM fees with sufficient assets. This PR reintroduces previously [removed](https://github.com/paritytech/polkadot-sdk/pull/1845) trader setups, as it was decided to keep both traders, `TakeFirstAssetTrader` and `SwapFirstAssetTrader`, during the transition period. --------- Co-authored-by: Svyatoslav Nikolsky --- ...set-transfer-works-rococo-to-westend.zndsl | 4 +- ...set-transfer-works-westend-to-rococo.zndsl | 4 +- .../assets/asset-hub-rococo/src/tests/send.rs | 75 +++ .../asset-hub-westend/src/tests/send.rs | 75 +++ .../assets/asset-hub-rococo/src/xcm_config.rs | 26 + .../assets/asset-hub-rococo/tests/tests.rs | 447 +++++++++++++++++- .../asset-hub-westend/src/xcm_config.rs | 26 + .../assets/asset-hub-westend/tests/tests.rs | 446 ++++++++++++++++- 8 files changed, 1071 insertions(+), 32 deletions(-) diff --git a/bridges/zombienet/tests/0001-asset-transfer-works-rococo-to-westend.zndsl b/bridges/zombienet/tests/0001-asset-transfer-works-rococo-to-westend.zndsl index a61f1e039f4..fe7dc26b001 100644 --- a/bridges/zombienet/tests/0001-asset-transfer-works-rococo-to-westend.zndsl +++ b/bridges/zombienet/tests/0001-asset-transfer-works-rococo-to-westend.zndsl @@ -14,7 +14,7 @@ bridge-hub-westend-collator1: js-script ../helpers/best-finalized-header-at-brid # step 4: send WND to //Alice on Rococo AH # (that's a required part of a sibling 0001-asset-transfer-works-westend-to-rococo.zndsl test) -asset-hub-westend-collator1: run ../scripts/invoke-script.sh with "reserve-transfer-assets-from-asset-hub-westend-local" within 60 seconds +asset-hub-westend-collator1: run ../scripts/invoke-script.sh with "reserve-transfer-assets-from-asset-hub-westend-local" within 120 seconds # step 5: elsewhere Rococo has sent ROC to //Alice - let's wait for it asset-hub-westend-collator1: js-script ../helpers/wrapped-assets-balance.js with "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY,0,Rococo" within 600 seconds @@ -24,7 +24,7 @@ bridge-hub-westend-collator1: js-script ../helpers/relayer-rewards.js with "5FLS bridge-hub-westend-collator1: js-script ../helpers/relayer-rewards.js with "5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y,0x00000002,0x6268726F,ThisChain,0" within 300 seconds # step 7: send wROC back to Alice at Rococo AH -asset-hub-westend-collator1: run ../scripts/invoke-script.sh with "withdraw-reserve-assets-from-asset-hub-westend-local" within 60 seconds +asset-hub-westend-collator1: run ../scripts/invoke-script.sh with "withdraw-reserve-assets-from-asset-hub-westend-local" within 120 seconds # step 8: elsewhere Rococo has sent wWND to //Alice - let's wait for it # (we wait until //Alice account increases here - there are no other transactionc that may increase it) diff --git a/bridges/zombienet/tests/0001-asset-transfer-works-westend-to-rococo.zndsl b/bridges/zombienet/tests/0001-asset-transfer-works-westend-to-rococo.zndsl index 2da5b7a772a..610b4ca7acd 100644 --- a/bridges/zombienet/tests/0001-asset-transfer-works-westend-to-rococo.zndsl +++ b/bridges/zombienet/tests/0001-asset-transfer-works-westend-to-rococo.zndsl @@ -14,7 +14,7 @@ bridge-hub-rococo-collator1: js-script ../helpers/best-finalized-header-at-bridg # step 4: send ROC to //Alice on Westend AH # (that's a required part of a sibling 0001-asset-transfer-works-rococo-to-westend.zndsl test) -asset-hub-rococo-collator1: run ../scripts/invoke-script.sh with "reserve-transfer-assets-from-asset-hub-rococo-local" within 60 seconds +asset-hub-rococo-collator1: run ../scripts/invoke-script.sh with "reserve-transfer-assets-from-asset-hub-rococo-local" within 120 seconds # step 5: elsewhere Westend has sent WND to //Alice - let's wait for it asset-hub-rococo-collator1: js-script ../helpers/wrapped-assets-balance.js with "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY,0,Westend" within 600 seconds @@ -24,7 +24,7 @@ bridge-hub-rococo-collator1: js-script ../helpers/relayer-rewards.js with "5FLSi bridge-hub-rococo-collator1: js-script ../helpers/relayer-rewards.js with "5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y,0x00000002,0x62687764,ThisChain,0" within 300 seconds # step 7: send wWND back to Alice at Westend AH -asset-hub-rococo-collator1: run ../scripts/invoke-script.sh with "withdraw-reserve-assets-from-asset-hub-rococo-local" within 60 seconds +asset-hub-rococo-collator1: run ../scripts/invoke-script.sh with "withdraw-reserve-assets-from-asset-hub-rococo-local" within 120 seconds # step 8: elsewhere Westend has sent wROC to //Alice - let's wait for it # (we wait until //Alice account increases here - there are no other transactionc that may increase it) diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/send.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/send.rs index fcf4513859e..3c9e76a34e3 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/send.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo/src/tests/send.rs @@ -27,3 +27,78 @@ fn send_transact_as_superuser_from_relay_to_system_para_works() { Some(Weight::from_parts(1_019_445_000, 200_000)), ) } + +/// Parachain should be able to send XCM paying its fee with sufficient asset +/// in the System Parachain +#[test] +fn send_xcm_from_para_to_system_para_paying_fee_with_assets_works() { + let para_sovereign_account = AssetHubRococo::sovereign_account_id_of( + AssetHubRococo::sibling_location_of(PenpalA::para_id()), + ); + + // Force create and mint assets for Parachain's sovereign account + AssetHubRococo::force_create_and_mint_asset( + ASSET_ID, + ASSET_MIN_BALANCE, + true, + para_sovereign_account.clone(), + Some(Weight::from_parts(1_019_445_000, 200_000)), + ASSET_MIN_BALANCE * 1000000000, + ); + + // We just need a call that can pass the `SafeCallFilter` + // Call values are not relevant + let call = AssetHubRococo::force_create_asset_call( + ASSET_ID, + para_sovereign_account.clone(), + true, + ASSET_MIN_BALANCE, + ); + + let origin_kind = OriginKind::SovereignAccount; + let fee_amount = ASSET_MIN_BALANCE * 1000000; + let native_asset = + ([PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())], fee_amount).into(); + + let root_origin = ::RuntimeOrigin::root(); + let system_para_destination = PenpalA::sibling_location_of(AssetHubRococo::para_id()).into(); + let xcm = xcm_transact_paid_execution( + call, + origin_kind, + native_asset, + para_sovereign_account.clone(), + ); + + PenpalA::execute_with(|| { + assert_ok!(::PolkadotXcm::send( + root_origin, + bx!(system_para_destination), + bx!(xcm), + )); + + PenpalA::assert_xcm_pallet_sent(); + }); + + AssetHubRococo::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + + AssetHubRococo::assert_xcmp_queue_success(Some(Weight::from_parts( + 15_594_564_000, + 562_893, + ))); + + assert_expected_events!( + AssetHubRococo, + vec![ + RuntimeEvent::Assets(pallet_assets::Event::Burned { asset_id, owner, balance }) => { + asset_id: *asset_id == ASSET_ID, + owner: *owner == para_sovereign_account, + balance: *balance == fee_amount, + }, + RuntimeEvent::Assets(pallet_assets::Event::Issued { asset_id, .. }) => { + asset_id: *asset_id == ASSET_ID, + }, + ] + ); + }); +} diff --git a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/send.rs b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/send.rs index d943bafc379..a3cd5c5803e 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/send.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/send.rs @@ -27,3 +27,78 @@ fn send_transact_as_superuser_from_relay_to_system_para_works() { Some(Weight::from_parts(1_019_445_000, 200_000)), ) } + +/// Parachain should be able to send XCM paying its fee with sufficient asset +/// in the System Parachain +#[test] +fn send_xcm_from_para_to_system_para_paying_fee_with_assets_works() { + let para_sovereign_account = AssetHubWestend::sovereign_account_id_of( + AssetHubWestend::sibling_location_of(PenpalB::para_id()), + ); + + // Force create and mint assets for Parachain's sovereign account + AssetHubWestend::force_create_and_mint_asset( + ASSET_ID, + ASSET_MIN_BALANCE, + true, + para_sovereign_account.clone(), + Some(Weight::from_parts(1_019_445_000, 200_000)), + ASSET_MIN_BALANCE * 1000000000, + ); + + // We just need a call that can pass the `SafeCallFilter` + // Call values are not relevant + let call = AssetHubWestend::force_create_asset_call( + ASSET_ID, + para_sovereign_account.clone(), + true, + ASSET_MIN_BALANCE, + ); + + let origin_kind = OriginKind::SovereignAccount; + let fee_amount = ASSET_MIN_BALANCE * 1000000; + let native_asset = + ([PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())], fee_amount).into(); + + let root_origin = ::RuntimeOrigin::root(); + let system_para_destination = PenpalB::sibling_location_of(AssetHubWestend::para_id()).into(); + let xcm = xcm_transact_paid_execution( + call, + origin_kind, + native_asset, + para_sovereign_account.clone(), + ); + + PenpalB::execute_with(|| { + assert_ok!(::PolkadotXcm::send( + root_origin, + bx!(system_para_destination), + bx!(xcm), + )); + + PenpalB::assert_xcm_pallet_sent(); + }); + + AssetHubWestend::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + + AssetHubWestend::assert_xcmp_queue_success(Some(Weight::from_parts( + 16_290_336_000, + 562_893, + ))); + + assert_expected_events!( + AssetHubWestend, + vec![ + RuntimeEvent::Assets(pallet_assets::Event::Burned { asset_id, owner, balance }) => { + asset_id: *asset_id == ASSET_ID, + owner: *owner == para_sovereign_account, + balance: *balance == fee_amount, + }, + RuntimeEvent::Assets(pallet_assets::Event::Issued { asset_id, .. }) => { + asset_id: *asset_id == ASSET_ID, + }, + ] + ); + }); +} diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs index 98b23efc06e..b9b9025b697 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/src/xcm_config.rs @@ -585,6 +585,32 @@ impl xcm_executor::Config for XcmConfig { ResolveAssetTo, AccountId, >, + // This trader allows to pay with `is_sufficient=true` "Trust Backed" assets from dedicated + // `pallet_assets` instance - `Assets`. + cumulus_primitives_utility::TakeFirstAssetTrader< + AccountId, + AssetFeeAsExistentialDepositMultiplierFeeCharger, + TrustBackedAssetsConvertedConcreteId, + Assets, + cumulus_primitives_utility::XcmFeesTo32ByteAccount< + FungiblesTransactor, + AccountId, + XcmAssetFeesReceiver, + >, + >, + // This trader allows to pay with `is_sufficient=true` "Foreign" assets from dedicated + // `pallet_assets` instance - `ForeignAssets`. + cumulus_primitives_utility::TakeFirstAssetTrader< + AccountId, + ForeignAssetFeeAsExistentialDepositMultiplierFeeCharger, + ForeignAssetsConvertedConcreteId, + ForeignAssets, + cumulus_primitives_utility::XcmFeesTo32ByteAccount< + ForeignFungiblesTransactor, + AccountId, + XcmAssetFeesReceiver, + >, + >, ); type ResponseHandler = PolkadotXcm; type AssetTrap = PolkadotXcm; diff --git a/cumulus/parachains/runtimes/assets/asset-hub-rococo/tests/tests.rs b/cumulus/parachains/runtimes/assets/asset-hub-rococo/tests/tests.rs index 3da1a1e66bd..cb7ea34a057 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-rococo/tests/tests.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-rococo/tests/tests.rs @@ -20,27 +20,23 @@ use asset_hub_rococo_runtime::{ xcm_config, xcm_config::{ - bridging, ForeignCreatorsSovereignAccountOf, LocationToAccountId, TokenLocation, - TokenLocationV3, + bridging, AssetFeeAsExistentialDepositMultiplierFeeCharger, CheckingAccount, + ForeignAssetFeeAsExistentialDepositMultiplierFeeCharger, ForeignCreatorsSovereignAccountOf, + LocationToAccountId, TokenLocation, TokenLocationV3, TrustBackedAssetsPalletLocation, + TrustBackedAssetsPalletLocationV3, XcmConfig, }, - AllPalletsWithoutSystem, MetadataDepositBase, MetadataDepositPerByte, RuntimeCall, - RuntimeEvent, ToWestendXcmRouterInstance, XcmpQueue, -}; -pub use asset_hub_rococo_runtime::{ - xcm_config::{ - CheckingAccount, TrustBackedAssetsPalletLocation, TrustBackedAssetsPalletLocationV3, - XcmConfig, - }, - AssetConversion, AssetDeposit, Assets, Balances, CollatorSelection, ExistentialDeposit, - ForeignAssets, ForeignAssetsInstance, ParachainSystem, Runtime, SessionKeys, System, - TrustBackedAssetsInstance, + AllPalletsWithoutSystem, AssetConversion, AssetDeposit, Assets, Balances, CollatorSelection, + ExistentialDeposit, ForeignAssets, ForeignAssetsInstance, MetadataDepositBase, + MetadataDepositPerByte, ParachainSystem, Runtime, RuntimeCall, RuntimeEvent, SessionKeys, + ToWestendXcmRouterInstance, TrustBackedAssetsInstance, XcmpQueue, }; use asset_test_utils::{ test_cases_over_bridge::TestBridgingConfig, CollatorSessionKey, CollatorSessionKeys, ExtBuilder, }; use codec::{Decode, Encode}; +use cumulus_primitives_utility::ChargeWeightInFungibles; use frame_support::{ - assert_ok, + assert_noop, assert_ok, traits::{ fungible::{Inspect, Mutate}, fungibles::{ @@ -353,6 +349,429 @@ fn test_buy_and_refund_weight_with_swap_foreign_asset_xcm_trader() { }) } +#[test] +fn test_asset_xcm_take_first_trader() { + ExtBuilder::::default() + .with_collators(vec![AccountId::from(ALICE)]) + .with_session_keys(vec![( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, + )]) + .build() + .execute_with(|| { + // We need root origin to create a sufficient asset + let minimum_asset_balance = 3333333_u128; + let local_asset_id = 1; + assert_ok!(Assets::force_create( + RuntimeHelper::root_origin(), + local_asset_id.into(), + AccountId::from(ALICE).into(), + true, + minimum_asset_balance + )); + + // We first mint enough asset for the account to exist for assets + assert_ok!(Assets::mint( + RuntimeHelper::origin_of(AccountId::from(ALICE)), + local_asset_id.into(), + AccountId::from(ALICE).into(), + minimum_asset_balance + )); + + // get asset id as location + let asset_location = + AssetIdForTrustBackedAssetsConvertLatest::convert_back(&local_asset_id).unwrap(); + + // Set Alice as block author, who will receive fees + RuntimeHelper::run_to_block(2, AccountId::from(ALICE)); + + // We are going to buy 4e9 weight + let bought = Weight::from_parts(4_000_000_000u64, 0); + + // Lets calculate amount needed + let asset_amount_needed = + AssetFeeAsExistentialDepositMultiplierFeeCharger::charge_weight_in_fungibles( + local_asset_id, + bought, + ) + .expect("failed to compute"); + + // Lets pay with: asset_amount_needed + asset_amount_extra + let asset_amount_extra = 100_u128; + let asset: Asset = + (asset_location.clone(), asset_amount_needed + asset_amount_extra).into(); + + let mut trader = ::Trader::new(); + let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; + + // Lets buy_weight and make sure buy_weight does not return an error + let unused_assets = trader.buy_weight(bought, asset.into(), &ctx).expect("Expected Ok"); + // Check whether a correct amount of unused assets is returned + assert_ok!(unused_assets.ensure_contains(&(asset_location, asset_amount_extra).into())); + + // Drop trader + drop(trader); + + // Make sure author(Alice) has received the amount + assert_eq!( + Assets::balance(local_asset_id, AccountId::from(ALICE)), + minimum_asset_balance + asset_amount_needed + ); + + // We also need to ensure the total supply increased + assert_eq!( + Assets::total_supply(local_asset_id), + minimum_asset_balance + asset_amount_needed + ); + }); +} + +#[test] +fn test_foreign_asset_xcm_take_first_trader() { + ExtBuilder::::default() + .with_collators(vec![AccountId::from(ALICE)]) + .with_session_keys(vec![( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, + )]) + .build() + .execute_with(|| { + // We need root origin to create a sufficient asset + let minimum_asset_balance = 3333333_u128; + let foreign_location = xcm::v3::Location { + parents: 1, + interior: ( + xcm::v3::Junction::Parachain(1234), + xcm::v3::Junction::GeneralIndex(12345), + ) + .into(), + }; + assert_ok!(ForeignAssets::force_create( + RuntimeHelper::root_origin(), + foreign_location.into(), + AccountId::from(ALICE).into(), + true, + minimum_asset_balance + )); + + // We first mint enough asset for the account to exist for assets + assert_ok!(ForeignAssets::mint( + RuntimeHelper::origin_of(AccountId::from(ALICE)), + foreign_location.into(), + AccountId::from(ALICE).into(), + minimum_asset_balance + )); + + let asset_location_v4: Location = foreign_location.try_into().unwrap(); + + // Set Alice as block author, who will receive fees + RuntimeHelper::run_to_block(2, AccountId::from(ALICE)); + + // We are going to buy 4e9 weight + let bought = Weight::from_parts(4_000_000_000u64, 0); + + // Lets calculate amount needed + let asset_amount_needed = + ForeignAssetFeeAsExistentialDepositMultiplierFeeCharger::charge_weight_in_fungibles( + foreign_location, + bought, + ) + .expect("failed to compute"); + + // Lets pay with: asset_amount_needed + asset_amount_extra + let asset_amount_extra = 100_u128; + let asset: Asset = + (asset_location_v4.clone(), asset_amount_needed + asset_amount_extra).into(); + + let mut trader = ::Trader::new(); + let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; + + // Lets buy_weight and make sure buy_weight does not return an error + let unused_assets = trader.buy_weight(bought, asset.into(), &ctx).expect("Expected Ok"); + // Check whether a correct amount of unused assets is returned + assert_ok!( + unused_assets.ensure_contains(&(asset_location_v4, asset_amount_extra).into()) + ); + + // Drop trader + drop(trader); + + // Make sure author(Alice) has received the amount + assert_eq!( + ForeignAssets::balance(foreign_location, AccountId::from(ALICE)), + minimum_asset_balance + asset_amount_needed + ); + + // We also need to ensure the total supply increased + assert_eq!( + ForeignAssets::total_supply(foreign_location), + minimum_asset_balance + asset_amount_needed + ); + }); +} + +#[test] +fn test_asset_xcm_take_first_trader_with_refund() { + ExtBuilder::::default() + .with_collators(vec![AccountId::from(ALICE)]) + .with_session_keys(vec![( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, + )]) + .build() + .execute_with(|| { + // We need root origin to create a sufficient asset + // We set existential deposit to be identical to the one for Balances first + assert_ok!(Assets::force_create( + RuntimeHelper::root_origin(), + 1.into(), + AccountId::from(ALICE).into(), + true, + ExistentialDeposit::get() + )); + + // We first mint enough asset for the account to exist for assets + assert_ok!(Assets::mint( + RuntimeHelper::origin_of(AccountId::from(ALICE)), + 1.into(), + AccountId::from(ALICE).into(), + ExistentialDeposit::get() + )); + + let mut trader = ::Trader::new(); + let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; + + // Set Alice as block author, who will receive fees + RuntimeHelper::run_to_block(2, AccountId::from(ALICE)); + + // We are going to buy 4e9 weight + let bought = Weight::from_parts(4_000_000_000u64, 0); + + let asset_location = + AssetIdForTrustBackedAssetsConvertLatest::convert_back(&1).unwrap(); + + // lets calculate amount needed + let amount_bought = WeightToFee::weight_to_fee(&bought); + + let asset: Asset = (asset_location.clone(), amount_bought).into(); + + // Make sure buy_weight does not return an error + assert_ok!(trader.buy_weight(bought, asset.clone().into(), &ctx)); + + // Make sure again buy_weight does return an error + // This assert relies on the fact, that we use `TakeFirstAssetTrader` in `WeightTrader` + // tuple chain, which cannot be called twice + assert_noop!(trader.buy_weight(bought, asset.into(), &ctx), XcmError::TooExpensive); + + // We actually use half of the weight + let weight_used = bought / 2; + + // Make sure refurnd works. + let amount_refunded = WeightToFee::weight_to_fee(&(bought - weight_used)); + + assert_eq!( + trader.refund_weight(bought - weight_used, &ctx), + Some((asset_location, amount_refunded).into()) + ); + + // Drop trader + drop(trader); + + // We only should have paid for half of the bought weight + let fees_paid = WeightToFee::weight_to_fee(&weight_used); + + assert_eq!( + Assets::balance(1, AccountId::from(ALICE)), + ExistentialDeposit::get() + fees_paid + ); + + // We also need to ensure the total supply increased + assert_eq!(Assets::total_supply(1), ExistentialDeposit::get() + fees_paid); + }); +} + +#[test] +fn test_asset_xcm_take_first_trader_refund_not_possible_since_amount_less_than_ed() { + ExtBuilder::::default() + .with_collators(vec![AccountId::from(ALICE)]) + .with_session_keys(vec![( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, + )]) + .build() + .execute_with(|| { + // We need root origin to create a sufficient asset + // We set existential deposit to be identical to the one for Balances first + assert_ok!(Assets::force_create( + RuntimeHelper::root_origin(), + 1.into(), + AccountId::from(ALICE).into(), + true, + ExistentialDeposit::get() + )); + + let mut trader = ::Trader::new(); + let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; + + // Set Alice as block author, who will receive fees + RuntimeHelper::run_to_block(2, AccountId::from(ALICE)); + + // We are going to buy small amount + let bought = Weight::from_parts(500_000_000u64, 0); + + let asset_location = + AssetIdForTrustBackedAssetsConvertLatest::convert_back(&1).unwrap(); + + let amount_bought = WeightToFee::weight_to_fee(&bought); + + assert!( + amount_bought < ExistentialDeposit::get(), + "we are testing what happens when the amount does not exceed ED" + ); + + let asset: Asset = (asset_location, amount_bought).into(); + + // Buy weight should return an error + assert_noop!(trader.buy_weight(bought, asset.into(), &ctx), XcmError::TooExpensive); + + // not credited since the ED is higher than this value + assert_eq!(Assets::balance(1, AccountId::from(ALICE)), 0); + + // We also need to ensure the total supply did not increase + assert_eq!(Assets::total_supply(1), 0); + }); +} + +#[test] +fn test_that_buying_ed_refund_does_not_refund_for_take_first_trader() { + ExtBuilder::::default() + .with_collators(vec![AccountId::from(ALICE)]) + .with_session_keys(vec![( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, + )]) + .build() + .execute_with(|| { + // We need root origin to create a sufficient asset + // We set existential deposit to be identical to the one for Balances first + assert_ok!(Assets::force_create( + RuntimeHelper::root_origin(), + 1.into(), + AccountId::from(ALICE).into(), + true, + ExistentialDeposit::get() + )); + + let mut trader = ::Trader::new(); + let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; + + // Set Alice as block author, who will receive fees + RuntimeHelper::run_to_block(2, AccountId::from(ALICE)); + + // We are gonna buy ED + let bought = Weight::from_parts(ExistentialDeposit::get().try_into().unwrap(), 0); + + let asset_location = + AssetIdForTrustBackedAssetsConvertLatest::convert_back(&1).unwrap(); + + let amount_bought = WeightToFee::weight_to_fee(&bought); + + assert!( + amount_bought < ExistentialDeposit::get(), + "we are testing what happens when the amount does not exceed ED" + ); + + // We know we will have to buy at least ED, so lets make sure first it will + // fail with a payment of less than ED + let asset: Asset = (asset_location.clone(), amount_bought).into(); + assert_noop!(trader.buy_weight(bought, asset.into(), &ctx), XcmError::TooExpensive); + + // Now lets buy ED at least + let asset: Asset = (asset_location, ExistentialDeposit::get()).into(); + + // Buy weight should work + assert_ok!(trader.buy_weight(bought, asset.into(), &ctx)); + + // Should return None. We have a specific check making sure we dont go below ED for + // drop payment + assert_eq!(trader.refund_weight(bought, &ctx), None); + + // Drop trader + drop(trader); + + // Make sure author(Alice) has received the amount + assert_eq!(Assets::balance(1, AccountId::from(ALICE)), ExistentialDeposit::get()); + + // We also need to ensure the total supply increased + assert_eq!(Assets::total_supply(1), ExistentialDeposit::get()); + }); +} + +#[test] +fn test_asset_xcm_trader_not_possible_for_non_sufficient_assets() { + ExtBuilder::::default() + .with_collators(vec![AccountId::from(ALICE)]) + .with_session_keys(vec![( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, + )]) + .build() + .execute_with(|| { + // Create a non-sufficient asset with specific existential deposit + let minimum_asset_balance = 1_000_000_u128; + assert_ok!(Assets::force_create( + RuntimeHelper::root_origin(), + 1.into(), + AccountId::from(ALICE).into(), + false, + minimum_asset_balance + )); + + // We first mint enough asset for the account to exist for assets + assert_ok!(Assets::mint( + RuntimeHelper::origin_of(AccountId::from(ALICE)), + 1.into(), + AccountId::from(ALICE).into(), + minimum_asset_balance + )); + + let mut trader = ::Trader::new(); + let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; + + // Set Alice as block author, who will receive fees + RuntimeHelper::run_to_block(2, AccountId::from(ALICE)); + + // We are going to buy 4e9 weight + let bought = Weight::from_parts(4_000_000_000u64, 0); + + // lets calculate amount needed + let asset_amount_needed = WeightToFee::weight_to_fee(&bought); + + let asset_location = + AssetIdForTrustBackedAssetsConvertLatest::convert_back(&1).unwrap(); + + let asset: Asset = (asset_location, asset_amount_needed).into(); + + // Make sure again buy_weight does return an error + assert_noop!(trader.buy_weight(bought, asset.into(), &ctx), XcmError::TooExpensive); + + // Drop trader + drop(trader); + + // Make sure author(Alice) has NOT received the amount + assert_eq!(Assets::balance(1, AccountId::from(ALICE)), minimum_asset_balance); + + // We also need to ensure the total supply NOT increased + assert_eq!(Assets::total_supply(1), minimum_asset_balance); + }); +} + #[test] fn test_assets_balances_api_works() { use assets_common::runtime_api::runtime_decl_for_fungibles_api::FungiblesApi; diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs index b2498418cc7..70522eda4b7 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/src/xcm_config.rs @@ -609,6 +609,32 @@ impl xcm_executor::Config for XcmConfig { ResolveAssetTo, AccountId, >, + // This trader allows to pay with `is_sufficient=true` "Trust Backed" assets from dedicated + // `pallet_assets` instance - `Assets`. + cumulus_primitives_utility::TakeFirstAssetTrader< + AccountId, + AssetFeeAsExistentialDepositMultiplierFeeCharger, + TrustBackedAssetsConvertedConcreteId, + Assets, + cumulus_primitives_utility::XcmFeesTo32ByteAccount< + FungiblesTransactor, + AccountId, + XcmAssetFeesReceiver, + >, + >, + // This trader allows to pay with `is_sufficient=true` "Foreign" assets from dedicated + // `pallet_assets` instance - `ForeignAssets`. + cumulus_primitives_utility::TakeFirstAssetTrader< + AccountId, + ForeignAssetFeeAsExistentialDepositMultiplierFeeCharger, + ForeignAssetsConvertedConcreteId, + ForeignAssets, + cumulus_primitives_utility::XcmFeesTo32ByteAccount< + ForeignFungiblesTransactor, + AccountId, + XcmAssetFeesReceiver, + >, + >, ); type ResponseHandler = PolkadotXcm; type AssetTrap = PolkadotXcm; diff --git a/cumulus/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs b/cumulus/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs index 28fc7ba705a..3fc9f4a9658 100644 --- a/cumulus/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs +++ b/cumulus/parachains/runtimes/assets/asset-hub-westend/tests/tests.rs @@ -20,27 +20,24 @@ use asset_hub_westend_runtime::{ xcm_config, xcm_config::{ - bridging, ForeignCreatorsSovereignAccountOf, LocationToAccountId, WestendLocation, - WestendLocationV3, + bridging, AssetFeeAsExistentialDepositMultiplierFeeCharger, CheckingAccount, + ForeignAssetFeeAsExistentialDepositMultiplierFeeCharger, ForeignCreatorsSovereignAccountOf, + LocationToAccountId, TrustBackedAssetsPalletLocation, TrustBackedAssetsPalletLocationV3, + WestendLocation, WestendLocationV3, XcmConfig, }, - AllPalletsWithoutSystem, MetadataDepositBase, MetadataDepositPerByte, PolkadotXcm, RuntimeCall, - RuntimeEvent, RuntimeOrigin, ToRococoXcmRouterInstance, XcmpQueue, -}; -pub use asset_hub_westend_runtime::{ - xcm_config::{ - CheckingAccount, TrustBackedAssetsPalletLocation, TrustBackedAssetsPalletLocationV3, - XcmConfig, - }, - AssetConversion, AssetDeposit, Assets, Balances, CollatorSelection, ExistentialDeposit, - ForeignAssets, ForeignAssetsInstance, ParachainSystem, Runtime, SessionKeys, System, - TrustBackedAssetsInstance, + AllPalletsWithoutSystem, Assets, Balances, ExistentialDeposit, ForeignAssets, + ForeignAssetsInstance, MetadataDepositBase, MetadataDepositPerByte, ParachainSystem, + PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin, SessionKeys, + ToRococoXcmRouterInstance, TrustBackedAssetsInstance, XcmpQueue, }; +pub use asset_hub_westend_runtime::{AssetConversion, AssetDeposit, CollatorSelection, System}; use asset_test_utils::{ test_cases_over_bridge::TestBridgingConfig, CollatorSessionKey, CollatorSessionKeys, ExtBuilder, }; use codec::{Decode, Encode}; +use cumulus_primitives_utility::ChargeWeightInFungibles; use frame_support::{ - assert_ok, + assert_noop, assert_ok, traits::{ fungible::{Inspect, Mutate}, fungibles::{ @@ -353,6 +350,427 @@ fn test_buy_and_refund_weight_with_swap_foreign_asset_xcm_trader() { }) } +#[test] +fn test_asset_xcm_take_first_trader() { + ExtBuilder::::default() + .with_collators(vec![AccountId::from(ALICE)]) + .with_session_keys(vec![( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, + )]) + .build() + .execute_with(|| { + // We need root origin to create a sufficient asset + let minimum_asset_balance = 3333333_u128; + let local_asset_id = 1; + assert_ok!(Assets::force_create( + RuntimeHelper::root_origin(), + local_asset_id.into(), + AccountId::from(ALICE).into(), + true, + minimum_asset_balance + )); + + // We first mint enough asset for the account to exist for assets + assert_ok!(Assets::mint( + RuntimeHelper::origin_of(AccountId::from(ALICE)), + local_asset_id.into(), + AccountId::from(ALICE).into(), + minimum_asset_balance + )); + + // get asset id as location + let asset_location = + AssetIdForTrustBackedAssetsConvertLatest::convert_back(&local_asset_id).unwrap(); + + // Set Alice as block author, who will receive fees + RuntimeHelper::run_to_block(2, AccountId::from(ALICE)); + + // We are going to buy 4e9 weight + let bought = Weight::from_parts(4_000_000_000u64, 0); + + // Lets calculate amount needed + let asset_amount_needed = + AssetFeeAsExistentialDepositMultiplierFeeCharger::charge_weight_in_fungibles( + local_asset_id, + bought, + ) + .expect("failed to compute"); + + // Lets pay with: asset_amount_needed + asset_amount_extra + let asset_amount_extra = 100_u128; + let asset: Asset = + (asset_location.clone(), asset_amount_needed + asset_amount_extra).into(); + + let mut trader = ::Trader::new(); + let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; + + // Lets buy_weight and make sure buy_weight does not return an error + let unused_assets = trader.buy_weight(bought, asset.into(), &ctx).expect("Expected Ok"); + // Check whether a correct amount of unused assets is returned + assert_ok!(unused_assets.ensure_contains(&(asset_location, asset_amount_extra).into())); + + // Drop trader + drop(trader); + + // Make sure author(Alice) has received the amount + assert_eq!( + Assets::balance(local_asset_id, AccountId::from(ALICE)), + minimum_asset_balance + asset_amount_needed + ); + + // We also need to ensure the total supply increased + assert_eq!( + Assets::total_supply(local_asset_id), + minimum_asset_balance + asset_amount_needed + ); + }); +} + +#[test] +fn test_foreign_asset_xcm_take_first_trader() { + ExtBuilder::::default() + .with_collators(vec![AccountId::from(ALICE)]) + .with_session_keys(vec![( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, + )]) + .build() + .execute_with(|| { + // We need root origin to create a sufficient asset + let minimum_asset_balance = 3333333_u128; + let foreign_location = xcm::v3::Location { + parents: 1, + interior: ( + xcm::v3::Junction::Parachain(1234), + xcm::v3::Junction::GeneralIndex(12345), + ) + .into(), + }; + assert_ok!(ForeignAssets::force_create( + RuntimeHelper::root_origin(), + foreign_location.into(), + AccountId::from(ALICE).into(), + true, + minimum_asset_balance + )); + + // We first mint enough asset for the account to exist for assets + assert_ok!(ForeignAssets::mint( + RuntimeHelper::origin_of(AccountId::from(ALICE)), + foreign_location.into(), + AccountId::from(ALICE).into(), + minimum_asset_balance + )); + + let asset_location_v4: Location = foreign_location.try_into().unwrap(); + + // Set Alice as block author, who will receive fees + RuntimeHelper::run_to_block(2, AccountId::from(ALICE)); + + // We are going to buy 4e9 weight + let bought = Weight::from_parts(4_000_000_000u64, 0); + + // Lets calculate amount needed + let asset_amount_needed = + ForeignAssetFeeAsExistentialDepositMultiplierFeeCharger::charge_weight_in_fungibles( + foreign_location, + bought, + ) + .expect("failed to compute"); + + // Lets pay with: asset_amount_needed + asset_amount_extra + let asset_amount_extra = 100_u128; + let asset: Asset = + (asset_location_v4.clone(), asset_amount_needed + asset_amount_extra).into(); + + let mut trader = ::Trader::new(); + let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; + + // Lets buy_weight and make sure buy_weight does not return an error + let unused_assets = trader.buy_weight(bought, asset.into(), &ctx).expect("Expected Ok"); + // Check whether a correct amount of unused assets is returned + assert_ok!( + unused_assets.ensure_contains(&(asset_location_v4, asset_amount_extra).into()) + ); + + // Drop trader + drop(trader); + + // Make sure author(Alice) has received the amount + assert_eq!( + ForeignAssets::balance(foreign_location, AccountId::from(ALICE)), + minimum_asset_balance + asset_amount_needed + ); + + // We also need to ensure the total supply increased + assert_eq!( + ForeignAssets::total_supply(foreign_location), + minimum_asset_balance + asset_amount_needed + ); + }); +} + +#[test] +fn test_asset_xcm_take_first_trader_with_refund() { + ExtBuilder::::default() + .with_collators(vec![AccountId::from(ALICE)]) + .with_session_keys(vec![( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, + )]) + .build() + .execute_with(|| { + // We need root origin to create a sufficient asset + // We set existential deposit to be identical to the one for Balances first + assert_ok!(Assets::force_create( + RuntimeHelper::root_origin(), + 1.into(), + AccountId::from(ALICE).into(), + true, + ExistentialDeposit::get() + )); + + // We first mint enough asset for the account to exist for assets + assert_ok!(Assets::mint( + RuntimeHelper::origin_of(AccountId::from(ALICE)), + 1.into(), + AccountId::from(ALICE).into(), + ExistentialDeposit::get() + )); + + let mut trader = ::Trader::new(); + let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; + + // Set Alice as block author, who will receive fees + RuntimeHelper::run_to_block(2, AccountId::from(ALICE)); + + // We are going to buy 4e9 weight + let bought = Weight::from_parts(4_000_000_000u64, 0); + let asset_location = + AssetIdForTrustBackedAssetsConvertLatest::convert_back(&1).unwrap(); + + // lets calculate amount needed + let amount_bought = WeightToFee::weight_to_fee(&bought); + + let asset: Asset = (asset_location.clone(), amount_bought).into(); + + // Make sure buy_weight does not return an error + assert_ok!(trader.buy_weight(bought, asset.clone().into(), &ctx)); + + // Make sure again buy_weight does return an error + // This assert relies on the fact, that we use `TakeFirstAssetTrader` in `WeightTrader` + // tuple chain, which cannot be called twice + assert_noop!(trader.buy_weight(bought, asset.into(), &ctx), XcmError::TooExpensive); + + // We actually use half of the weight + let weight_used = bought / 2; + + // Make sure refurnd works. + let amount_refunded = WeightToFee::weight_to_fee(&(bought - weight_used)); + + assert_eq!( + trader.refund_weight(bought - weight_used, &ctx), + Some((asset_location, amount_refunded).into()) + ); + + // Drop trader + drop(trader); + + // We only should have paid for half of the bought weight + let fees_paid = WeightToFee::weight_to_fee(&weight_used); + + assert_eq!( + Assets::balance(1, AccountId::from(ALICE)), + ExistentialDeposit::get() + fees_paid + ); + + // We also need to ensure the total supply increased + assert_eq!(Assets::total_supply(1), ExistentialDeposit::get() + fees_paid); + }); +} + +#[test] +fn test_asset_xcm_take_first_trader_refund_not_possible_since_amount_less_than_ed() { + ExtBuilder::::default() + .with_collators(vec![AccountId::from(ALICE)]) + .with_session_keys(vec![( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, + )]) + .build() + .execute_with(|| { + // We need root origin to create a sufficient asset + // We set existential deposit to be identical to the one for Balances first + assert_ok!(Assets::force_create( + RuntimeHelper::root_origin(), + 1.into(), + AccountId::from(ALICE).into(), + true, + ExistentialDeposit::get() + )); + + let mut trader = ::Trader::new(); + let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; + + // Set Alice as block author, who will receive fees + RuntimeHelper::run_to_block(2, AccountId::from(ALICE)); + + // We are going to buy small amount + let bought = Weight::from_parts(500_000_000u64, 0); + + let asset_location = + AssetIdForTrustBackedAssetsConvertLatest::convert_back(&1).unwrap(); + + let amount_bought = WeightToFee::weight_to_fee(&bought); + + assert!( + amount_bought < ExistentialDeposit::get(), + "we are testing what happens when the amount does not exceed ED" + ); + + let asset: Asset = (asset_location, amount_bought).into(); + + // Buy weight should return an error + assert_noop!(trader.buy_weight(bought, asset.into(), &ctx), XcmError::TooExpensive); + + // not credited since the ED is higher than this value + assert_eq!(Assets::balance(1, AccountId::from(ALICE)), 0); + + // We also need to ensure the total supply did not increase + assert_eq!(Assets::total_supply(1), 0); + }); +} + +#[test] +fn test_that_buying_ed_refund_does_not_refund_for_take_first_trader() { + ExtBuilder::::default() + .with_collators(vec![AccountId::from(ALICE)]) + .with_session_keys(vec![( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, + )]) + .build() + .execute_with(|| { + // We need root origin to create a sufficient asset + // We set existential deposit to be identical to the one for Balances first + assert_ok!(Assets::force_create( + RuntimeHelper::root_origin(), + 1.into(), + AccountId::from(ALICE).into(), + true, + ExistentialDeposit::get() + )); + + let mut trader = ::Trader::new(); + let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; + + // Set Alice as block author, who will receive fees + RuntimeHelper::run_to_block(2, AccountId::from(ALICE)); + + let bought = Weight::from_parts(500_000_000u64, 0); + + let asset_location = + AssetIdForTrustBackedAssetsConvertLatest::convert_back(&1).unwrap(); + + let amount_bought = WeightToFee::weight_to_fee(&bought); + + assert!( + amount_bought < ExistentialDeposit::get(), + "we are testing what happens when the amount does not exceed ED" + ); + + // We know we will have to buy at least ED, so lets make sure first it will + // fail with a payment of less than ED + let asset: Asset = (asset_location.clone(), amount_bought).into(); + assert_noop!(trader.buy_weight(bought, asset.into(), &ctx), XcmError::TooExpensive); + + // Now lets buy ED at least + let asset: Asset = (asset_location.clone(), ExistentialDeposit::get()).into(); + + // Buy weight should work + assert_ok!(trader.buy_weight(bought, asset.into(), &ctx)); + + // Should return None. We have a specific check making sure we dont go below ED for + // drop payment + assert_eq!(trader.refund_weight(bought, &ctx), None); + + // Drop trader + drop(trader); + + // Make sure author(Alice) has received the amount + assert_eq!(Assets::balance(1, AccountId::from(ALICE)), ExistentialDeposit::get()); + + // We also need to ensure the total supply increased + assert_eq!(Assets::total_supply(1), ExistentialDeposit::get()); + }); +} + +#[test] +fn test_asset_xcm_take_first_trader_not_possible_for_non_sufficient_assets() { + ExtBuilder::::default() + .with_collators(vec![AccountId::from(ALICE)]) + .with_session_keys(vec![( + AccountId::from(ALICE), + AccountId::from(ALICE), + SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) }, + )]) + .build() + .execute_with(|| { + // Create a non-sufficient asset with specific existential deposit + let minimum_asset_balance = 1_000_000_u128; + assert_ok!(Assets::force_create( + RuntimeHelper::root_origin(), + 1.into(), + AccountId::from(ALICE).into(), + false, + minimum_asset_balance + )); + + // We first mint enough asset for the account to exist for assets + assert_ok!(Assets::mint( + RuntimeHelper::origin_of(AccountId::from(ALICE)), + 1.into(), + AccountId::from(ALICE).into(), + minimum_asset_balance + )); + + let mut trader = ::Trader::new(); + let ctx = XcmContext { origin: None, message_id: XcmHash::default(), topic: None }; + + // Set Alice as block author, who will receive fees + RuntimeHelper::run_to_block(2, AccountId::from(ALICE)); + + // We are going to buy 4e9 weight + let bought = Weight::from_parts(4_000_000_000u64, 0); + + // lets calculate amount needed + let asset_amount_needed = WeightToFee::weight_to_fee(&bought); + + let asset_location = + AssetIdForTrustBackedAssetsConvertLatest::convert_back(&1).unwrap(); + + let asset: Asset = (asset_location, asset_amount_needed).into(); + + // Make sure again buy_weight does return an error + assert_noop!(trader.buy_weight(bought, asset.into(), &ctx), XcmError::TooExpensive); + + // Drop trader + drop(trader); + + // Make sure author(Alice) has NOT received the amount + assert_eq!(Assets::balance(1, AccountId::from(ALICE)), minimum_asset_balance); + + // We also need to ensure the total supply NOT increased + assert_eq!(Assets::total_supply(1), minimum_asset_balance); + }); +} + #[test] fn test_assets_balances_api_works() { use assets_common::runtime_api::runtime_decl_for_fungibles_api::FungiblesApi; -- GitLab
Release notes

Sourced from unsafe-libyaml's releases.

0.2.10

  • Fix write to improperly aligned pointer in 32-bit targets (#21)